ZGlmZiAtLWdpdCBhL1BBQ0tBR0VfU09VUkNFUyBiL1BBQ0tBR0VfU09VUkNFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRmODA0Ci0tLSAvZGV2L251bGwKKysrIGIvUEFDS0FHRV9TT1VSQ0VTCkBAIC0wLDAgKzEsMzIgQEAKK2xpYmFzb3VuZDJfMS4wLjE1LTN1YnVudHU0X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgM2E5ZmQ5N2M2YWExMDVmN2EyYzZmOWI0ZDUzNmQ3MzgzMzYzYzk2YworbGliYXNvdW5kMi1kZXZfMS4wLjE1LTN1YnVudHU0X2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAzMzlmYmVmYzFiNjljODFhYzc2NjFmMGJhNjJhZmMxMWJkODlkYTdmCitsaWJhdWRpb2ZpbGUtZGV2XzAuMi42LTd1YnVudHUxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgIGNhNGI3OTVkOTNhYWE1OGQyYmMwY2NmZTFjN2U4ODkzYWE5YjE3YzAKK2xpYmM2XzIuNy0xMHVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyYWIyYzMzYWE1OWFmNmE0ODAyZGU2MzQwZGQzMmJlMjIyOWRjZQorbGliYzYtZGV2XzIuNy0xMHVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NjY1YjliMWZhOGJlOGZjMTkyZjg2NzcxN2I0MzFmYTJhOTMwNDc1CitsaWJkcm0yXzIuMy4wLTR1YnVudHUxX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUyNGRhZWY5ZmI0YzY2M2M4OTkzOTBiNTliMmQ3Yjk1ZjkyOTIxOTYKK2xpYmVzZDAtZGV2XzAuMi4zOC0wdWJ1bnR1OV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgODBjYjE3NWRhMDBkYWViNzIzYTMyMTNjMzYwOWUyNzE3OTc1ZDYyOAorbGliZXNkLWFsc2EwXzAuMi4zOC0wdWJ1bnR1OV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAzYTE3MzUzYmE1MDE5MTcyMDc0OTg1ZDZlNjA5NWEzYjQyYjQ3NDIxCitsaWJnbDEtbWVzYS1kZXZfNy4wLjN+cmMyLTF1YnVudHUzX2FsbC5kZWIgICAgICAgICAgICAgICAgICAgICAgIGM0NjVhN2NkMjU0MDIxMTgxYzgwZGFkYmM1OTRiMjUyYWI2Yzk3MTMKK2xpYmdsMS1tZXNhLWdseF83LjAuM35yYzItMXVidW50dTNfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgNmQ4N2VmZmE3NzQ0ZTRiNTVmODM0OGUyYTFhNzA3YmM4MzY4NTZmNQorbGlibmN1cnNlczVfNS42KzIwMDcxMTI0LTF1YnVudHUyX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICBkOGQ0YjE0YjU2NzYwYTIwYjUwODgwMTZkNWM3ZDdjZWY1MDg3MGVlCitsaWJuY3Vyc2VzNS1kZXZfNS42KzIwMDcxMTI0LTF1YnVudHUyX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgIDQ4ZjdjMjljZDc0NjI5ZmU2YWQyMTViMDEyNWEyYjY4ODMyMDNmMDIKK2xpYnB1bHNlMF8wLjkuMTAtMXVidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgN2MzMGE4NzM4ZDBkMDFiYzcxMjQ2Y2VmNjQ0YzNlNmI1NjQxNjUyNQorbGlicHVsc2UtZGV2XzAuOS4xMC0xdWJ1bnR1MV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICBkYjJmM2YzMjBlNGJhOWQ3ODRhNDNkYmQ5NjU5MzI5YTJjNjYwNTRhCitsaWJ4MTEtNl8xLjEuMy0xdWJ1bnR1Ml9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI1NTM0MDk2ZGEyMGJlMGMzYzIyNTAzOGI5MGEzMDIwMmEzY2Q5YTcKK2xpYngxMS1kZXZfMS4xLjMtMXVidW50dTJfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUzZWE1OWM1ZjU0ZmFmMmViMGUzODdkMjI0OTA3MjI2YzcwM2EyZQorbGlieGF1Nl8xLjAuMy0yX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmNDg3NGZiYzg5ODVmNWQxODhmNzE0ZDVlMzM5NWFhNzUwZTUzOWNjCitsaWJ4Y2IxXzEuMS0xdWJ1bnR1MV9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2ZWUwMTdhNTYyZTc1ODk1OTNjN2QyYWU5ZDFiYTEzZGVlYjg4MDIKK2xpYnhjYi14bGliMF8xLjEtMXVidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTdhMGFjNGRjYmYxNThmM2E5NWU4ZDYzMzZkZjIzYzgzMjUzZTZhMQorbGlieGRhbWFnZTFfMS4xLjEtM19hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MTU0NjEwYTI2N2E3ZWYyODI5OGE0OWE4MzM4OGMyNWNjZWFhNWEyCitsaWJ4ZG1jcDZfMS4wLjItMl9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJlYTk0YmMyYzQ4ZmU5MGM2NjFhMzZmOTUxYTEyODM0Yjc0NWNlZTEKK2xpYnhleHQ2XzEuMC4zLTJidWlsZDFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNmI3ZDVhY2IwYzYyYTM2M2JmNjRhOWIxNjQzOTU2N2M2ZGEwNzA1OAorbGlieGZpeGVzM180LjAuMy0yX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZTA0OTIzYjkxODMzZGRiZjk5YTE4NWE5YjYyNjI3YjI2ZjMzMzczCitsaWJ4eGY4NnZtMV8xLjAuMS0yX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxNjRlODc0ZmYyNTc2MWQ5OTM1YTU0OTdkYjc5MmIyZjY2YWNjMDQKK2xpbnV4LWxpYmMtZGV2XzIuNi4yNC0xNi4zMF9hbWQ2NC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgNmY0MjViZDg4N2I4OTk4NWM4ZWU3MjdjMjkxMGI3YmI3YTRhNjIzYworbWVzYS1jb21tb24tZGV2XzcuMC4zfnJjMi0xdWJ1bnR1M19hbGwuZGViICAgICAgICAgICAgICAgICAgICAgICBjNTRjNmM5ZThkNGJkYWM0MWZmMjQ0MDIxYzRjOTRjYTQxZjIyZGE1Cit4MTFwcm90by1jb3JlLWRldl83LjAuMTEtMV9hbGwuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOTVhZWRlMmJmMmFlNTc3ZTZjYTgzN2JkMjViY2VjYzY3ZWMwZGMKK3gxMXByb3RvLWlucHV0LWRldl8xLjQuMi0xX2FsbC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODcwNTcwYmRkNzk4YjYxYTk1YWU1MTQyZGU4OTM5YjExZGYyNDMyMQoreDExcHJvdG8ta2ItZGV2XzEuMC4zLTJ1YnVudHUxX2FsbC5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICBkNTQwNDBlZTczY2M0Zjc2YWQwYTRkOTg4YmZhYTBiMTA3MGU4Mjg1Cit4MTFwcm90by14ZXh0LWRldl83LjAuMi01dWJ1bnR1MV9hbGwuZGViICAgICAgICAgICAgICAgICAgICAgICAgIDhlMjQ0NDNmMzJjMWFhMWFjOTNmZDZlZjFiYTJiMzQ2ZGUxYWE1MjAKK3psaWIxZ18xLjIuMy4zLmRmc2ctN3VidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgNzFlMGEyNjhmY2Q1MGU5MTA0MWYzNGY4OTRhMGE5NDEzMzMyYjYzNgoremxpYjFnLWRldl8xLjIuMy4zLmRmc2ctN3VidW50dTFfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICA0M2VlMWI0NjQ2NjU0OTQyMDA1OTVlZDljNTEwYTNiY2U1NGFhZWYzCmRpZmYgLS1naXQgYS9UT09MQ0hBSU5fU09VUkNFUyBiL1RPT0xDSEFJTl9TT1VSQ0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjk4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9UT09MQ0hBSU5fU09VUkNFUwpAQCAtMCwwICsxLDggQEAKK3Rvb2xjaGFpbi9iaW51dGlscy5naXQ6ICAgICAgICAgIGQ1ZDQ5NWFjOGQ2MGU3OTFlYWIzYzZlZmU3OTViNWM5Y2ZmOTFlMzMgVXBkYXRlIGJpbnV0aWxzLTIuMjEuIENoYW5nZXMgYXJlIHRoZSBmb2xsb3dpbmdzCit0b29sY2hhaW4vYnVpbGQuZ2l0OiAgICAgICAgICAgICA1ZWY3ZmE2ZjIxNGU5NjY2MGE5YjE2MzQzZmVhOTA0ODMxZTVlNmUyIFVwZGF0ZSBidWlsZCBzY3JpcHRzCit0b29sY2hhaW4vZ2NjLmdpdDogICAgICAgICAgICAgICBjZjkwNzA1Yzg1MDNiM2E3NjM4MDFhNGYzMWY2ZjIyNzIwMTVmMGRjIEJhY2twb3J0IHIxODQwNjEgZnJvbSBnY2MtNF82LWJyYW5jaCB0byBmaXggUFI1MjA2MC4KK3Rvb2xjaGFpbi9nZGIuZ2l0OiAgICAgICAgICAgICAgIGQzZmJjNzRjNDIwMjFiZjlkMzg1YTNkM2I4ODEzZDBkOTEzMTgxMzcgUmVsZWFzZSBnZGItNy4zLnggc291cmNlIGZvciBBbmRyb2lkIHRvb2xjaGFpbi4KK3Rvb2xjaGFpbi9nb2xkLmdpdDogICAgICAgICAgICAgIDhkNDAxY2Y3MTE1MzlhZjVhMmY3OGQxMjQ0NzM0MWQ3NzQ4OTI2MTggRW1wdHkgaW5pdGlhbCBjb21taXQuCit0b29sY2hhaW4vZ21wLmdpdDogICAgICAgICAgICAgICA5ZmIyNDJhNzlkZDEyMmQ3ZmJmODY3ZGFmNTYyMGRiYTY5MjdiZDJlIGNoZWNrIGluIGdtcCBzb3VyY2VzIGZvciBwcmVidWlsdCB0b29sY2hhaW5zIGluIEVjbGFpci4KK3Rvb2xjaGFpbi9tcGZyLmdpdDogICAgICAgICAgICAgIGRhNmRmZGU5ODZhZjFiNTZmMGY0MWU5ZjVkZTYxZDA5M2ZhOGFmOTAgY2hlY2sgaW4gbXBmciBzb3VyY2VzIGZvciBwcmVidWlsdCB0b29sY2hhaW5zIGluIEVjbGFpci4KK3Rvb2xjaGFpbi9tcGMuZ2l0OiAgICAgICAgICAgICAgIGE0MTA5Y2NjNmUwN2Y3MmY0MWMzOTdhMTdmZGZiZWQzZTVlMTljNjYgQWRkIG1wYy0wLjguMSBwYWNrYWdlIHRvIHRvb2xjaGFpbiBzb3VyY2UuCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWFkZHIybGluZSBiL2Jpbi94ODZfNjQtbGludXgtYWRkcjJsaW5lCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwYjE0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWFkZHIybGluZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWFyIGIvYmluL3g4Nl82NC1saW51eC1hcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZmM0YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1hcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWFzIGIvYmluL3g4Nl82NC1saW51eC1hcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzAxMDQwCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1hcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWMrKyBiL2Jpbi94ODZfNjQtbGludXgtYysrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyMDAzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWMrKwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWMrK2ZpbHQgYi9iaW4veDg2XzY0LWxpbnV4LWMrK2ZpbHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWY3MzZmOAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtYysrZmlsdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWNwcCBiL2Jpbi94ODZfNjQtbGludXgtY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiMWE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWNwcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWVsZmVkaXQgYi9iaW4veDg2XzY0LWxpbnV4LWVsZmVkaXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI3MDIxNQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZWxmZWRpdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWcrKyBiL2Jpbi94ODZfNjQtbGludXgtZysrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyMDAzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWcrKwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWdjYyBiL2Jpbi94ODZfNjQtbGludXgtZ2NjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5YjllOTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWdjYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWdjYy00LjYueC1nb29nbGUgYi9iaW4veDg2XzY0LWxpbnV4LWdjYy00LjYueC1nb29nbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjliOWU5OAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZ2NjLTQuNi54LWdvb2dsZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWdjb3YgYi9iaW4veDg2XzY0LWxpbnV4LWdjb3YKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzc3OTlmOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtZ2NvdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWdwcm9mIGIvYmluL3g4Nl82NC1saW51eC1ncHJvZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzdkZDZiCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1ncHJvZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWxkIGIvYmluL3g4Nl82NC1saW51eC1sZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NDQ4NjhhCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1sZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LWxkLmJmZCBiL2Jpbi94ODZfNjQtbGludXgtbGQuYmZkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg0NDg2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LWxkLmJmZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LW5tIGIvYmluL3g4Nl82NC1saW51eC1ubQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NGVkMGRhCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1ubQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LW9iamNvcHkgYi9iaW4veDg2XzY0LWxpbnV4LW9iamNvcHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRiOTljZAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtb2JqY29weQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LW9iamR1bXAgYi9iaW4veDg2XzY0LWxpbnV4LW9iamR1bXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdkYzk2OQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtb2JqZHVtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LXJhbmxpYiBiL2Jpbi94ODZfNjQtbGludXgtcmFubGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjNzVmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4veDg2XzY0LWxpbnV4LXJhbmxpYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LXJlYWRlbGYgYi9iaW4veDg2XzY0LWxpbnV4LXJlYWRlbGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjAwZGU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtcmVhZGVsZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LXNpemUgYi9iaW4veDg2XzY0LWxpbnV4LXNpemUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzVjMDYyMwotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtc2l6ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LXN0cmluZ3MgYi9iaW4veDg2XzY0LWxpbnV4LXN0cmluZ3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmY2MjRlYQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi94ODZfNjQtbGludXgtc3RyaW5ncwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaW4veDg2XzY0LWxpbnV4LXN0cmlwIGIvYmluL3g4Nl82NC1saW51eC1zdHJpcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjhhZjYwCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3g4Nl82NC1saW51eC1zdHJpcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idWlsZC1oYXJkeS10b29sY2hhaW4uc2ggYi9idWlsZC1oYXJkeS10b29sY2hhaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWQzNmRmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLWhhcmR5LXRvb2xjaGFpbi5zaApAQCAtMCwwICsxLDE3MTEgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gcmVidWlsZCB0aGUgTGludXggMzItYml0IGNyb3NzLXRvb2xjaGFpbgorIyB0aGF0IGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgMzItYml0IGJpbmFyaWVzIHRoYXQgdGFyZ2V0IFVidW50dSA4LjA0CisjIChhLmsuYS4gSGFyZHkgSGVyb24pIGluc3RlYWQgb2YgdGhlIGhvc3Qgc3lzdGVtICh3aGljaCB1c3VhbGx5IGlzIDEwLjA0LAorIyBhLmsuYS4gTHVjaWQgTHlueCkKKyMKKyMgVXNlIC0taGVscCBmb3IgY29tcGxldGUgdXNhZ2UgaW5mb3JtYXRpb24uCisjCisjIFdBUk5JTkc6IEF0IHRoaXMgdGltZSwgdGhlIGdlbmVyYXRlZCB0b29sY2hhaW4gYmluYXJpZXMgd2lsbCAqbm90KiBydW4KKyMgICAgICAgICAgd2l0aCBHTGliYyAyLjcsIG9ubHkgdGhlIG1hY2hpbmUgY29kZSBpdCBnZW5lcmF0ZXMuCisjCisKK1BST0dOQU1FPSJgYmFzZW5hbWUgXCIkMFwiYCIKK1BBVENIRVNfRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApL3Rvb2xjaGFpbi1wYXRjaGVzIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMKKyMjIyMjICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOCisjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcGFuaWMgKCkKK3sKKyAgICBlY2hvICJFUlJPUjogJEAiCisgICAgZXhpdCAxCit9CisKK2ZhaWxfcGFuaWMgKCkKK3sKKyAgICBpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKyAgICAgICAgZWNobyAiRVJST1I6ICRAIgorICAgICAgICBleGl0IDEKKyAgICBmaQorfQorCisKKyMgV2Ugb25seSBzdXBwb3J0IHJ1bm5pbmcgdGhpcyBzY3JpcHQgb24gTGludXgKK09TPSQodW5hbWUgLXMpCitpZiBbICIkT1MiICE9IExpbnV4IF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgY2FuIG9ubHkgcnVuIG9uIExpbnV4IG1hY2hpbmVzISIKK2ZpCisKKyMgVXNlZCB0byBzZXQgdGhlIGhvc3QgYml0bmVzcyBvZiB0aGUgZ2VuZXJ0ZWQgdG9vbGNoYWluIGJpbmFyaWVzCisjIEZpcnN0IGNhbGwgd2l0aCB0aGUgYnVpbGQgbWFjaGluZSdzIGJpdG5lc3MsIGFuZCBsYXRlciB3aXRoIDMyCisjIGlmIC0tMzItYml0cyBvcHRpb24gaXMgdXNlZC4KKyMgJDE6IDMyIG9yIDY0CitzZXRfaG9zdF9iaXRzICgpCit7CisgICAgSE9TVF9CSVRTPSQxCisgICAgR01QX0FCST0kMQorICAgIGNhc2UgJDEgaW4KKyAgICAgICAgMzIpCisgICAgICAgICAgICBIT1NUX0FSQ0g9aTY4NgorICAgICAgICAgICAgVUJVTlRVX0FSQ0g9aTM4NgorICAgICAgICAgICAgR0NDX1RBUkdFVD1pNjg2LWxpbnV4CisgICAgICAgICAgICBHTVBfVEFSR0VUPWkzODYtbGludXgKKyAgICAgICAgICAgIDs7CisgICAgICAgIDY0KQorICAgICAgICAgICAgSE9TVF9BUkNIPXg4Nl82NAorICAgICAgICAgICAgVUJVTlRVX0FSQ0g9YW1kNjQKKyAgICAgICAgICAgIEdDQ19UQVJHRVQ9eDg2XzY0LWxpbnV4CisgICAgICAgICAgICBHTVBfVEFSR0VUPXg4Nl82NC1saW51eAorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJJbnZhbGlkIGhvc3QgYml0bmVzcyAoMzIgb3IgNjQgZXhwZWN0ZWQpOiAkMSIKKyAgICBlc2FjCit9CisKKyMgRGV0ZXJtaW5lIGJ1aWxkIG1hY2hpbmUgYml0bmVzcworQlVJTERfQVJDSD0kKHVuYW1lIC1tKQorY2FzZSAiJEJVSUxEX0FSQ0giIGluCisgICAgeDg2XzY0fGFtZDY0KQorICAgICAgICBCVUlMRF9CSVRTPTY0CisgICAgICAgIEJVSUxEX0FSQ0g9eDg2XzY0CisgICAgICAgIEJVSUxEX0dDQ19UQVJHRVQ9eDg2XzY0LWxpbnV4CisgICAgICAgIHNldF9ob3N0X2JpdHMgNjQKKyAgICAgICAgOzsKKyAgICBpPzg2KQorICAgICAgICBCVUlMRF9CSVRTPTMyCisgICAgICAgIEJVSUxEX0FSQ0g9aTY4NgorICAgICAgICBCVUlMRF9HQ0NfVEFSR0VUPWk2ODYtbGludXgKKyAgICAgICAgc2V0X2hvc3RfYml0cyAzMgorICAgICAgICA7OworICAgICopCisgICAgICAgIHBhbmljICJVbmtub3duIGJ1aWxkIENQVSBhcmNoaXRlY3R1cmU6ICRCVUlMRF9BUkNIIgorZXNhYworCisjIFZlcnNpb25zIG9mIHZhcmlvdXMgdG9vbGNoYWluIGNvbXBvbmVudHMsIGRvIG5vdCB0b3VjaCB1bmxlc3MgeW91IGtub3cKKyMgd2hhdCB5b3UncmUgZG9pbmchCisKK0JJTlVUSUxTX1ZFUlNJT049Mi4yMQorR01QX1ZFUlNJT049NC4yLjQKK01QRlJfVkVSU0lPTj0yLjQuMQorTVBDX1ZFUlNJT049MC44LjEKK0dDQ19WRVJTSU9OPTQuNgorCitHSVRfQ01EPWdpdAorR0lUX0RBVEU9CitHSVRfQlJBTkNIPW1hc3RlcgorR0lUX1JFRkVSRU5DRT0KK0dJVF9CQVNFPQorR0lUX0JBU0VfREVGQVVMVD1odHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS90b29sY2hhaW4KKworIyBMb2NhdGlvbiB3aGVyZSB3ZSdyZSBnb2luZyB0byBpbnN0YWxsIHRoZSB0b29sY2hhaW4gZHVyaW5nIHRoZSBidWlsZAorIyBUaGlzIHdpbGwgZGVwZW5kIG9uIHRoZSBwaGFzZSBvZiB0aGUgYnVpbGQuCitpbnN0YWxsX2RpciAoKSB7IGVjaG8gIiRXT1JLX0RJUi8kUEhBU0UvJFRPT0xDSEFJTl9OQU1FIjsgfQorCisjIExvY2F0aW9uIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIGluc3RhbGwgdGhlIGZpbmFsIGJpbmFyaWVzCisjIElmIGVtcHR5LCBUT09MQ0hBSU5fQVJDSElWRSB3aWxsIGJlIGdlbmVyYXRlZAorUFJFRklYX0RJUj0KKworIyBMb2NhdGlvbiBvZiB0aGUgZmluYWwgc3lzcm9vdC4gVGhpcyBtdXN0IGJlIGEgc3ViLWRpcmVjdG9yeSBvZiBJTlNUQUxMX0RJUgorIyB0byBlbnN1cmUgdGhhdCB0aGUgdG9vbGNoYWluIGJpbmFyaWVzIGFyZSBwcm9wZXJseSByZWxvY2F0YWJsZSAoaS5lLiBjYW4KKyMgYmUgdXNlZCB3aGVuIG1vdmVkIHRvIGFub3RoZXIgZGlyZWN0b3J5KS4KK3N5c3Jvb3RfZGlyICgpIHsgZWNobyAiJChpbnN0YWxsX2Rpcikvc3lzcm9vdCI7IH0KKworIyBUcnkgdG8gcGFyYWxsZWxpemUgdGhlIGJ1aWxkIGZvciBmYXN0ZXIgcGVyZm9ybWFuY2UuCitKT0JTPSQoY2F0IC9wcm9jL2NwdWluZm8gfCBncmVwIC1jIHByb2Nlc3NvcikKKworIyBUaGUgYmFzZSBVUkwgb2YgdGhlIFVidW50dSBtaXJyb3Igd2UncmUgZ29pbmcgdG8gdXNlLgorVUJVTlRVX01JUlJPUj1odHRwOi8vbWlycm9ycy51cy5rZXJuZWwub3JnCisKKyMgVWJ1bnR1IHJlbGVhc2UgbmFtZSB3ZSB3YW50IHBhY2thZ2VzIGZyb20uIENhbiBiZSBhIG5hbWUgb3IgYSBudW1iZXIKKyMgKGkuZS4gImhhcmR5IiBvciAiOC4wNCIpCitVQlVOVFVfUkVMRUFTRT1oYXJkeQorCisKKyMgVGhlIGxpc3Qgb2YgcGFja2FnZXMgd2UgbmVlZCB0byBkb3dubG9hZCBmcm9tIHRoZSBVYnVudHUgc2VydmVycyBhbmQKKyMgZXh0cmFjdCBpbnRvIHRoZSBvcmlnaW5hbCBzeXNyb290CisjCisjIENhbGwgYWRkX3VidW50dV9wYWNrYWdlIDxwYWNrYWdlLW5hbWU+IHRvIGFkZCBhIHBhY2thZ2UgdG8gdGhlIGxpc3QsCisjIHdoaWNoIHdpbGwgYmUgcHJvY2Vzc2VkIGxhdGVyLgorIworVUJVTlRVX1BBQ0tBR0VTPQorCithZGRfdWJ1bnR1X3BhY2thZ2UgKCkKK3sKKyAgICBVQlVOVFVfUEFDS0FHRVM9IiRVQlVOVFVfUEFDS0FHRVMgJEAiCit9CisKKyMgVGhlIHBhY2thZ2UgZmlsZXMgY29udGFpbmluZyBrZXJuZWwgaGVhZGVycyBmb3IgSGFyZHkgYW5kIHRoZSBDCisjIGxpYnJhcnkgaGVhZGVycyBhbmQgYmluYXJpZXMKK2FkZF91YnVudHVfcGFja2FnZSBcCisgICAgbGludXgtbGliYy1kZXYgXAorICAgIGxpYmM2IFwKKyAgICBsaWJjNi1kZXYKKworIyBUaGUgWDExIGhlYWRlcnMgYW5kIGJpbmFyaWVzIChmb3IgdGhlIGVtdWxhdG9yKQorYWRkX3VidW50dV9wYWNrYWdlIFwKKyAgICBsaWJ4MTEtNiBcCisgICAgbGlieDExLWRldiBcCisgICAgbGlieGNiLXhsaWIwIFwKKyAgICBsaWJ4Y2IxIFwKKyAgICBsaWJ4YXU2IFwKKyAgICBsaWJ4ZG1jcDYgXAorICAgIHgxMXByb3RvLWNvcmUtZGV2IFwKKyAgICB4MTFwcm90by14ZXh0LWRldiBcCisgICAgeDExcHJvdG8taW5wdXQtZGV2IFwKKyAgICB4MTFwcm90by1rYi1kZXYKKworIyBUaGUgT3BlbkdMLXJlbGF0ZWQgaGVhZGVycyBhbmQgbGlicmFyaWVzIChmb3IgR0xFUyBlbXVsYXRpb24pCithZGRfdWJ1bnR1X3BhY2thZ2UgXAorICAgIG1lc2EtY29tbW9uLWRldiBcCisgICAgbGliZ2wxLW1lc2EtZGV2IFwKKyAgICBsaWJnbDEtbWVzYS1nbHggXAorICAgIGxpYnh4Zjg2dm0xIFwKKyAgICBsaWJ4ZXh0NiBcCisgICAgbGlieGRhbWFnZTEgXAorICAgIGxpYnhmaXhlczMgXAorICAgIGxpYmRybTIKKworIyBBdWRpbyBsaWJyYXJpZXMgKHJlcXVpcmVkIGJ5IHRoZSBlbXVsYXRvcikKK2FkZF91YnVudHVfcGFja2FnZSBcCisgICAgbGliYXNvdW5kMiBcCisgICAgbGliYXNvdW5kMi1kZXYgXAorICAgIGxpYmVzZC1hbHNhMCBcCisgICAgbGliZXNkMC1kZXYgXAorICAgIGxpYmF1ZGlvZmlsZS1kZXYgXAorICAgIGxpYnB1bHNlMCBcCisgICAgbGlicHVsc2UtZGV2CisKKyMgWkxpYgorYWRkX3VidW50dV9wYWNrYWdlIFwKKyAgICB6bGliMWcgXAorICAgIHpsaWIxZy1kZXYgXAorICAgIGxpYm5jdXJzZXM1IFwKKyAgICBsaWJuY3Vyc2VzNS1kZXYKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIworIyMjIyMgIEUgTiBEICAgTyBGICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTgorIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgUGFyc2UgYWxsIG9wdGlvbnMKK09QVElPTl9IRUxQPW5vCitWRVJCT1NFPTAKK0ZPUkNFPW5vCitPTkxZX1NZU1JPT1Q9bm8KK09OTFlfVE9PTENIQUlOX0RJUj0KK0JPT1RTVFJBUD0KK1BBUkFNRVRFUlM9CitGT1JDRV8zMj0KK0xJU1RfVEFTS1M9CisKK2ZvciBvcHQgZG8KKyAgb3B0YXJnPWBleHByICJ4JG9wdCIgOiAneFtePV0qPVwoLipcKSdgCisgIGNhc2UgIiRvcHQiIGluCisgIC0taGVscHwtaHwtXD8pIE9QVElPTl9IRUxQPXllcworICA7OworICAtLXZlcmJvc2UpIFZFUkJPU0U9JCgoICRWRVJCT1NFICsgMSApKQorICA7OworICAtLWZvcmNlKSBGT1JDRT0ieWVzIgorICA7OworICAtLTMyLWJpdHMpIEZPUkNFXzMyPXRydWUKKyAgOzsKKyAgLS11YnVudHUtbWlycm9yPSopIFVCVU5UVV9NSVJST1I9IiRvcHRhcmciCisgIDs7CisgIC0tdWJ1bnR1LXJlbGVhc2U9KikgVUJVTlRVX1JFTEVBU0U9IiRvcHRhcmciCisgIDs7CisgIC0tcHJlZml4PSopIFBSRUZJWF9ESVI9IiRvcHRhcmciCisgIDs7CisgIC0td29yay1kaXI9KikgV09SS19ESVI9IiRvcHRhcmciCisgIDs7CisgIC0tZ2NjLXZlcnNpb249KikgR0NDX1ZFUlNJT049IiRvcHRhcmciCisgIDs7CisgIC0tYmludXRpbHMtdmVyc2lvbj0qKSBCSU5VVElMU19WRVJTSU9OPSIkb3B0YXJnIgorICA7OworICAtLWdtcC12ZXJzaW9uPSopIEdNUF9WRVJTSU9OPSIkb3B0YXJnIgorICA7OworICAtLW1wZnItdmVyc2lvbj0qKSBNUEZSX1ZFUlNJT049IiRvcHRhcmciCisgIDs7CisgIC0tbXBjLXZlcnNpb249KikgTVBDX1ZFUlNJT049IiRvcHRhcmciCisgIDs7CisgIC0tZ2l0PSopIEdJVF9DTUQ9JG9wdGFyZworICA7OworICAtLWdpdC1kYXRlPSopIEdJVF9EQVRFPSRvcHRhcmcKKyAgOzsKKyAgLS1naXQtYnJhbmNoPSopIEdJVF9CUkFOQ0g9JG9wdGFyZworICA7OworICAtLWdpdC1iYXNlPSopIEdJVF9CQVNFPSRvcHRhcmcKKyAgOzsKKyAgLS1naXQtcmVmZXJlbmNlPSopIEdJVF9SRUZFUkVOQ0U9JG9wdGFyZworICA7OworICAtLW91dC1kaXI9KikgT1BUSU9OX09VVF9ESVI9IiRvcHRhcmciCisgIDs7CisgIC0tY2M9KikgT1BUSU9OX0NDPSIkb3B0YXJnIgorICA7OworICAtLWpvYnM9KikgSk9CUz0iJG9wdGFyZyIKKyAgOzsKKyAgLWoqKSBKT0JTPWBleHByICJ4JG9wdCIgOiAneC1qXCguKlwpJ2AKKyAgOzsKKyAgLS1vbmx5LXN5c3Jvb3QpIE9OTFlfU1lTUk9PVD15ZXMKKyAgOzsKKyAgLS1ib290c3RyYXApIEJPT1RTVFJBUD15ZXMKKyAgOzsKKyAgLS1saXN0LXRhc2tzKSBMSVNUX1RBU0tTPXllcworICA7OworICAtKikKKyAgICBlY2hvICJ1bmtub3duIG9wdGlvbiAnJG9wdCcsIHVzZSAtLWhlbHAiCisgICAgZXhpdCAxCisgICAgOzsKKyAgKikKKyAgICBpZiBbIC16ICIkUEFSQU1FVEVSUyIgXTsgdGhlbgorICAgICAgICBQQVJBTUVURVJTPSIkb3B0IgorICAgIGVsc2UKKyAgICAgICAgUEFSQU1FVEVSUz0iJFBBUkFNRVRFUlMgJG9wdCIKKyAgICBmaQorICBlc2FjCitkb25lCisKK2lmIFsgIiRPUFRJT05fSEVMUCIgPSAieWVzIiBdOyB0aGVuCisgICAgY2F0IDw8IEVPRgorCitVc2FnZTogJFBST0dOQU1FIFtvcHRpb25zXSBbPHBhdGgtdG8tdG9vbGNoYWluLXNvdXJjZXM+XQorCitUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIHJlYnVpbGQgYSBjdXN0b20gTGludXggaG9zdCB0b29sY2hhaW4gdGhhdCB0YXJnZXRzCitHTGliYyAyLjcgb3IgaGlnaGVyLiBUaGUgbWFjaGluZSBjb2RlIGdlbmVyYXRlZCBieSB0aGlzIHRvb2xjaGFpbiB3aWxsIHJ1bgorcHJvcGVybHkgb24gVWJ1bnR1IDguMDQgb3IgaGlnaGVyLgorCitJZiB5b3UncmUgcnVubmluZyBvbiBhIDMyLWJpdCBzeXN0ZW0sIGl0IHdpbGwgZ2VuZXJhdGUgYSAzMi1iaXQgdG9vbGNoYWluLgorSWYgeW91J3JlIHJ1bm5pbmcgb24gYSA2NC1iaXQgc3lzdGVtLCBpdCB3aWxsIGdlbmVyYXRlIGEgNjQtYml0IHRvb2xjaGFpbgordW5sZXNzIHlvdSB1c2UgdGhlIC0tMzItYml0cyBvcHRpb24uCisKK1lvdSBjYW4gcHJvdmlkZSB0aGUgcGF0aCB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIHRvb2xjaGFpbiBzb3VyY2VzIHJlcG9zaXRvcnkKK2FzIGEgZmlyc3QgcGFyYW1ldGVyLiBJZiB5b3UgZG9uJ3QsIHRoZSBzb3VyY2VzIHdpbGwgYmUgZG93bmxvYWRlZCBhbmQKK2V4dHJhY3RlZCBhdXRvbWF0aWNhbGx5IGludG8geW91ciB3b3JrIGRpcmVjdG9yeS4KKworTm90ZSB0aGF0IHRoaXMgc2NyaXB0IHdpbGwgZG93bmxvYWQgdmFyaW91cyBiaW5hcnkgcGFja2FnZXMgZnJvbSBVYnVudHUKK3NlcnZlcnMgaW4gb3JkZXIgdG8gcHJlcGFyZSBhIGNvbXBhdGlibGUgInN5c3Jvb3QiLgorCitCeSBkZWZhdWx0LCBpdCBnZW5lcmF0ZXMgYSBwYWNrYWdlIGFyY2hpdmUgKCRUT09MQ0hBSU5fQVJDSElWRSkgYnV0IHlvdSBjYW4sCithcyBhbiBhbHRlcm5hdGl2ZSwgYXNrIGZvciBkaXJlY3QgaW5zdGFsbGF0aW9uIHdpdGggLS1wcmVmaXg9PHBhdGg+CisKK1VzZSB0aGUgYm9vdHN0cmFwIG9wdGlvbiB0byByZS1nZW5lcmF0ZSB0aGUgdG9vbGNoYWluIHdpdGggaXRzZWxmLiBUaGlzIGlzCit1c2VmdWwgaWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCBjb21waWxlciBiaW5hcmllcyB3aWxsIHdvcmsKK3Byb3Blcmx5IG9uIFVidW50dSA4LjA0IG9yIGhpZ2hlci4gQnkgZGVmYXVsdCwgdGhleSB3aWxsIG9ubHkgcnVuIG9uIHN5c3RlbXMKK3RoYXQgbWF0Y2ggeW91ciBidWlsZCBzeXN0ZW0ncyBDIGxpYnJhcnkgQUJJLCBvciBoaWdoZXIuCisKK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitFT0YKKyAgICBlY2hvICJTdGFuZGFyZCBvcHRpb25zOiIKKyAgICBlY2hvICIgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZSIKKyAgICBlY2hvICIgIC0tZm9yY2UgICAgICAgICAgICAgICAgICAgICAgIEZvcmNlLXJlYnVpbGQgZXZlcnl0aGluZyIKKyAgICBlY2hvICIgIC0tcHJlZml4PVBBVEggICAgICAgICAgICAgICAgIEluc3RhbGxhdGlvbiBwYXRoIFskUFJFRklYX0RJUl0iCisgICAgZWNobyAiICAtLXVidW50dS1taXJyb3I9VVJMICAgICAgICAgICBVYnVudHUgbWlycm9yIFVSTCBbJFVCVU5UVV9NSVJST1JdIgorICAgIGVjaG8gIiAgLS11YnVudHUtcmVsZWFzZT1OQU1FICAgICAgICAgVWJ1bnR1IHJlbGVhc2UgbmFtZSBbJFVCVU5UVV9SRUxFQVNFXSIKKyAgICBlY2hvICIgIC0td29yay1kaXI9UEFUSCAgICAgICAgICAgICAgIFRlbXBvcmFyeSB3b3JrIGRpcmVjdG9yeSBbL3RtcC9nY2MuPHJhbmRvbT5dIgorICAgIGVjaG8gIiAgLS1vbmx5LXN5c3Jvb3QgICAgICAgICAgICAgICAgT25seSBkb3dsb2FkIGFuZCBidWlsZCBzeXNyb290IHBhY2thZ2VzIgorICAgIGVjaG8gIiAgLS12ZXJib3NlICAgICAgICAgICAgICAgICAgICAgVmVyYm9zZSBvdXRwdXQuIENhbiBiZSB1c2VkIHR3aWNlLiIKKyAgICBlY2hvICIgIC0tYmludXRpbHMtdmVyc2lvbj1WRVJTSU9OICAgIEJpbnV0aWxzIHZlcnNpb24gbnVtYmVyIFskQklOVVRJTFNfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLWdjYy12ZXJzaW9uPVZFUlNJT04gICAgICAgICBHQ0MgdmVyc2lvbiBudW1iZXIgWyRHQ0NfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLWdtcC12ZXJzaW9uPVZFUlNJT04gICAgICAgICBHTVAgdmVyc2lvbiBudW1iZXIgWyRHTVBfVkVSU0lPTl0iCisgICAgZWNobyAiICAtLW1wZnItdmVyc2lvbj1WRVJTSU9OICAgICAgICBNUEZSIHZlcnNpb24gbnVtbmVyIFskTVBGUl9WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tbXBjLXZlcnNpb249VkVSU0lPTiAgICAgICAgIE1QQyB2ZXJzaW9uIG51bWJlciBbJE1QQ19WRVJTSU9OXSIKKyAgICBlY2hvICIgIC0tam9icz1DT1VOVCAgICAgICAgICAgICAgICAgIFJ1biBDT1VOVCBidWlsZCBqb2JzIGluIHBhcmFsbGVsIFskSk9CU10iCisgICAgZWNobyAiICAtajxDT1VOVD4gICAgICAgICAgICAgICAgICAgICBTYW1lIGFzIC0tam9icz1DT1VOVC4iCisgICAgZWNobyAiICAtLWdpdD08Y21kPiAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyB2ZXJzaW9uIG9mIHRoZSBnaXQgdG9vbCBbJEdJVF9DTURdIgorICAgIGVjaG8gIiAgLS1naXQtZGF0ZT08ZGF0ZT4gICAgICAgICAgICAgU3BlY2lmeSBzcGVjaWZpYyBnaXQgZGF0ZSB3aGVuIGRvd25sb2FkIHNvdXJjZXMgW25vbmVdIgorICAgIGVjaG8gIiAgLS1naXQtYnJhbmNoPTxuYW1lPiAgICAgICAgICAgU3BlY2lmeSB3aGljaCBicmFuY2ggdG8gdXNlIHdoZW4gZG93bmxvYWRpbmcgdGhlIHNvdXJjZXMgWyRHSVRfQlJBTkNIXSIKKyAgICBlY2hvICIgIC0tZ2l0LXJlZmVyZW5jZT08cGF0aD4gICAgICAgIFVzZSBhIGdpdCByZWZlcmVuY2UgcmVwb3NpdG9yeSIKKyAgICBlY2hvICIgIC0tZ2l0LWJhc2U9PHVybD4gICAgICAgICAgICAgIFVzZSB0aGlzIGdpdCByZXBvc2l0b3J5IGJhc2UgWyRHSVRfQkFTRV0iCisgICAgZWNobyAiICAtLWJvb3RzdHJhcCAgICAgICAgICAgICAgICAgICBCb290c3RyYXAgdG9vbGNoYWluIChpLmUuIGNvbXBpbGUgaXQgd2l0aCBpdHNlbGYpIgorICAgIGVjaG8gIiAgLS0zMi1iaXRzICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgMzItYml0IHRvb2xjaGFpbiBvbiA2NC1iaXQgYnVpbGQgc3lzdGVtLiIKKyAgICBlY2hvICIiCisgICAgZXhpdCAxCitmaQorCitpZiBbICIkRk9SQ0VfMzIiIF07IHRoZW4KKyAgICBpZiBbICIkQlVJTERfQklUUyIgPSA2NCBdOyB0aGVuCisgICAgICAgIHNldF9ob3N0X2JpdHMgMzIKKyAgICBlbHNlCisgICAgICAgZWNobyAiV2FybmluZzogLS0zMi1iaXRzIG9wdGlvbiBpZ25vcmVkIG9uIDMyLWJpdCBidWlsZCBtYWNoaW5lLiIKKyAgICBmaQorZmkKKworIyBEZXRlcm1pbmUgcm9vdCB3b3JraW5nIGRpcmVjdG9yeSBmb3Igb3VyIHNjcmlwdAoraWYgWyAteiAiJFdPUktfRElSIiBdOyB0aGVuCisgICAgV09SS19ESVI9JChta3RlbXAgLWQgL3RtcC8kVVNFUi1nY2MtJEhPU1RfQklUUy1YWFhYWFgpCisgICAgV09SS19ESVJfQ0xFQU5VUD10cnVlCitlbHNlCisgICAgbWtkaXIgLXAgIiRXT1JLX0RJUiIKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeTogJFdPUktfRElSIgorICAgIFdPUktfRElSX0NMRUFOVVA9ZmFsc2UKK2ZpCisKK2lmIFsgLXogIiRQQVJBTUVURVJTIiBdIDsgdGhlbgorICAgIGlmIFsgLW4gIiRHSVRfUkVGRVJFTkNFIiBdIDsgdGhlbgorICAgICAgICBpZiBbICEgLWQgIiRHSVRfUkVGRVJFTkNFIiAtbyAhIC1kICIkR0lUX1JFRkVSRU5DRS9idWlsZCIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiRVJST1I6IEludmFsaWQgcmVmZXJlbmNlIHJlcG9zaXRvcnkgZGlyZWN0b3J5IHBhdGg6ICRHSVRfUkVGRVJFTkNFIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgLW4gIiRHSVRfQkFTRSIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiVXNpbmcgZ2l0IGNsb25lIHJlZmVyZW5jZTogJEdJVF9SRUZFUkVOQ0UiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgSWYgd2UgaGF2ZSBhIHJlZmVyZW5jZSB3aXRob3V0IGEgYmFzZSwgdXNlIGl0IGFzIGEgZG93bmxvYWQgYmFzZSBpbnN0ZWFkLgorICAgICAgICAgICAgR0lUX0JBU0U9JEdJVF9SRUZFUkVOQ0UKKyAgICAgICAgICAgIEdJVF9SRUZFUkVOQ0U9CisgICAgICAgICAgICBlY2hvICJVc2luZyBnaXQgY2xvbmUgYmFzZTogJEdJVF9CQVNFIgorICAgICAgICBmaQorICAgIGVsaWYgWyAteiAiJEdJVF9CQVNFIiBdOyB0aGVuCisgICAgICAgIEdJVF9CQVNFPSRHSVRfQkFTRV9ERUZBVUxUCisgICAgICAgIGVjaG8gIkF1dG8tY29uZmlnOiAtLWdpdC1iYXNlPSRHSVRfQkFTRSIKKyAgICBmaQorCisgICAgIyBMb2NhdGlvbiB3aGVyZSB3ZSB3aWxsIGRvd25sb2FkIHRoZSB0b29sY2hhaW4gc291cmNlcworICAgIFRPT0xDSEFJTl9TUkNfRElSPSRXT1JLX0RJUi90b29sY2hhaW4tc3JjCitlbHNlCisgICAgc2V0X3BhcmFtZXRlcnMgKCkgeworICAgICAgICBUT09MQ0hBSU5fU1JDX0RJUj0iJDEiCisgICAgICAgIGlmIFsgISAtZCAiJFRPT0xDSEFJTl9TUkNfRElSIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJFUlJPUjogTm90IGEgZGlyZWN0b3J5OiAkMSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICBpZiBbICEgLWQgIiRUT09MQ0hBSU5fU1JDX0RJUi9idWlsZCIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiRVJST1I6IE1pc3NpbmcgZGlyZWN0b3J5OiAkMS9idWlsZCIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgIH0KKworICAgIHNldF9wYXJhbWV0ZXJzICRQQVJBTUVURVJTCitmaQorCisjIExvY2F0aW9uIG9mIG9yaWdpbmFsIHN5c3Jvb3QuIFRoaXMgaXMgd2hlcmUgd2UncmUgZ29pbmcgdG8gZXh0cmFjdCBhbGwKKyMgYmluYXJ5IFVidW50dSBwYWNrYWdlcy4KK09SR19TWVNST09UX0RJUj0kV09SS19ESVIvc3lzcm9vdAorCisjIE5hbWUgb2YgdGhlIGZpbmFsIGdlbmVyYXRlZCB0b29sY2hhaW4KK1RPT0xDSEFJTl9OQU1FPSRHQ0NfVEFSR0VULWdsaWJjMi43LSRHQ0NfVkVSU0lPTgorCisjIE5hbWUgb2YgdGhlIGZpbmFsIHRvb2xjaGFpbiBiaW5hcnkgdGFyYmFsbCB0aGF0IHRoaXMgc2NyaXB0IHdpbGwgY3JlYXRlCitUT09MQ0hBSU5fQVJDSElWRT0vdG1wLyRUT09MQ0hBSU5fTkFNRS50YXIuYnoyCisKKyMgQSBmaWxlIHRoYXQgd2lsbCBjb250YWluIGRldGFpbHMgYWJvdXQgYWxsIHRoZSBzb3VyY2VzIHVzZWQgdG8gZ2VuZXJhdGUKKyMgdGhlIGZpbmFsIHRvb2xjaGFpbi4gVGhpcyBpbmNsdWRlcyBib3RoIFNIQS0xIGZvciB0b29sY2hhaW4gZ2l0IHJlcG9zaXRvcmllcworIyBhbmQgU0hBLTEgaGFzaGVzIGZvciBkb3dubG9hZGVkIFVidW50dSBwYWNrYWdlcy4KK1NPVVJDRVNfTElTVD0kV09SS19ESVIvU09VUkNFUworCisjIERldGVybWluZSBNYWtlIGZsYWdzCitNQUtFX0ZMQUdTPSItaiRKT0JTIgorCisjIENyZWF0ZSB0aGUgd29yayBkaXJlY3RvcnkKK21rZGlyIC1wICIkV09SS19ESVIiCisKKyMgTG9jYXRpb24gd2hlcmUgd2UgZG93bmxvYWQgcGFja2FnZXMgZnJvbSB0aGUgVWJ1bnR1IHNlcnZlcnMKK0RPV05MT0FEX0RJUj0kV09SS19ESVIvZG93bmxvYWQKKworIyBFbXB0eSB0aGUgU09VUkNFUyBmaWxlCitybSAtZiAiJFNPVVJDRVNfTElTVCIgJiYgdG91Y2ggIiRTT1VSQ0VTX0xJU1QiCisKKworaWYgWyAiJFZFUkJPU0UiIC1nZSAxIF0gOyB0aGVuCisgICAgcnVuICgpIHsKKyAgICAgICAgZWNobyAiIyMgQ09NTUFORDogJEAiCisgICAgICAgICRACisgICAgfQorICAgIGxvZyAoKSB7CisgICAgICAgIGVjaG8gIiRAIgorICAgIH0KKyAgICBpZiBbICIkVkVSQk9TRSIgLWdlIDIgXSA7IHRoZW4KKyAgICAgICAgbG9nMiAoKSB7CisgICAgICAgICAgICBlY2hvICIkQCIKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICAgICAgbG9nMiAoKSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorICAgIGZpCitlbHNlCisgICAgcnVuICgpIHsKKyAgICAgICAgIiRAIiA+PiRUTVBMT0cgMj4mMQorICAgIH0KKyAgICBsb2cgKCkgeworICAgICAgICByZXR1cm4KKyAgICB9CisgICAgbG9nMiAoKSB7CisgICAgICAgIHJldHVybgorICAgIH0KK2ZpCisKKyMgU2FuaXRpemUgYSBwYXRoIGxpc3QsIHdlIHdhbnQgdG8gcmVtb3ZlIGVtcHR5IHN1Yi1kaXJzIGFuZAorIyBsZWFkaW5nL3RyYWlsaW5nIGNvbHVtbnMuCitzYW5pdGl6ZV9wYXRoX2xpc3QgKCkKK3sKKyAgIGxvY2FsIE9MRF9JRlM9JElGUworICAgbG9jYWwgU1VCUEFUSCBSRVQKKyAgIElGUz0iOiIKKyAgIFJFVD0iIgorICAgZm9yIFNVQlBBVEggaW4gJDE7IGRvCisgICAgICAgIGlmIFsgLXogIiRTVUJQQVRIIiBdOyB0aGVuCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmaQorICAgICAgICBSRVQ9JFJFVCI6IiRTVUJQQVRICisgICBkb25lCisgICBJRlM9JE9MRF9JRlMKKyAgIGVjaG8gJHtSRVQjIzp9Cit9CisKK09MRF9QQVRIPSQoc2FuaXRpemVfcGF0aF9saXN0ICIkUEFUSCIpCitPTERfTERfTElCUkFSWV9QQVRIPSQoc2FuaXRpemVfcGF0aF9saXN0ICIkTERfTElCUkFSWV9QQVRIIikKKworQlVJTERfRElSPSRXT1JLX0RJUi9idWlsZAorbWtkaXIgLXAgJEJVSUxEX0RJUgorCitUTVBMT0c9JEJVSUxEX0RJUi9idWlsZC5sb2cKK3JtIC1yZiAkVE1QTE9HICYmIHRvdWNoICRUTVBMT0cKKworYnVpbGRfYmludXRpbHNfZGlyICgpIHsgZWNobyAiJEJVSUxEX0RJUi8kUEhBU0UvYmludXRpbHMiOyB9CitidWlsZF9nbXBfZGlyICgpIHsgZWNobyAiJEJVSUxEX0RJUi8kUEhBU0UvZ21wIjsgfQorYnVpbGRfbXBmcl9kaXIgKCkgeyBlY2hvICIkQlVJTERfRElSLyRQSEFTRS9tcGZyIjsgfQorYnVpbGRfbXBjX2RpciAoKSB7IGVjaG8gIiRCVUlMRF9ESVIvJFBIQVNFL21wYyI7IH0KK2J1aWxkX2djY19kaXIgKCkgeyBlY2hvICIkQlVJTERfRElSLyRQSEFTRS9nY2MiOyB9CisKK1RJTUVTVEFNUFNfRElSPSRCVUlMRF9ESVIvdGltZXN0YW1wcworbWtkaXIgLXAgJFRJTUVTVEFNUFNfRElSCisKK3N0YW1wX2NoZWNrICgpIHsKKyAgICBbIC1mICIkVElNRVNUQU1QU19ESVIvJDEiIF0KK30KKworc3RhbXBfY2xlYXIgKCkgeworICAgIHJtIC1mICIkVElNRVNUQU1QU19ESVIvJDEiCit9CisKK3N0YW1wX3NldCAoKSB7CisgICAgdG91Y2ggIiRUSU1FU1RBTVBTX0RJUi8kMSIKK30KKworaWYgWyAiJEZPUkNFIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgZWNobyAiQ2xlYW5pbmcgdXAgdGltZXN0YW1wcyAoZm9yY2luZyB0aGUgYnVpbGQpLiIKKyAgICBybSAtZiAkVElNRVNUQU1QU19ESVIvKgorZmkKKworaWYgWyAiJFZFUkJPU0UiID0gMCBdIDsgdGhlbgorICAgIGVjaG8gIlRvIGZvbGxvdyBidWlsZCwgcnVuOiB0YWlsIC1GICRUTVBMT0ciCitmaQorCisjIHJldHVybnMgMCBpZmYgdGhlIHN0cmluZyBpbiAkMiBtYXRjaGVzIHRoZSBwYXR0ZXJuIGluICQxCisjICQxOiBwYXR0ZXJuCisjICQyOiBzdHJpbmcKK3BhdHRlcm5fbWF0Y2ggKCkKK3sKKyAgICBlY2hvICIkMiIgfCBncmVwIC1xIC1FIC1lICIkMSIKK30KKworIyBGaW5kIGlmIGEgZ2l2ZW4gc2hlbGwgcHJvZ3JhbSBpcyBhdmFpbGFibGUuCisjIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoZSBmYWN0IHRoYXQgdGhlICd3aGljaCA8Zm9vPicgY29tbWFuZAorIyBtYXkgcmV0dXJuIGVpdGhlciBhbiBlbXB0eSBzdHJpbmcgKExpbnV4KSBvciBzb21ldGhpbmcgbGlrZQorIyAibm8gPGZvbz4gaW4gLi4uIiAoRGFyd2luKS4gQWxzbywgd2UgbmVlZCB0byByZWRpcmVjdCBzdGRlcnIKKyMgdG8gL2Rldi9udWxsIGZvciBDeWd3aW4KKyMKKyMgJDE6IHZhcmlhYmxlIG5hbWUKKyMgJDI6IHByb2dyYW0gbmFtZQorIworIyBSZXN1bHQ6IHNldCAkMSB0byB0aGUgZnVsbCBwYXRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQKKyMgICAgICAgICBvciB0byB0aGUgZW1wdHkvdW5kZWZpbmVkIHN0cmluZyBpZiBub3QgYXZhaWxhYmxlCisjCitmaW5kX3Byb2dyYW0gKCkKK3sKKyAgICBsb2NhbCBQUk9HCisgICAgUFJPRz1gd2hpY2ggJDIgMj4vZGV2L251bGxgCisgICAgaWYgWyAtbiAiJFBST0ciIF0gOyB0aGVuCisgICAgICAgIGlmIHBhdHRlcm5fbWF0Y2ggJ15ubyAnICIkUFJPRyI7IHRoZW4KKyAgICAgICAgICAgIFBST0c9CisgICAgICAgIGZpCisgICAgZmkKKyAgICBldmFsICQxPSIkUFJPRyIKK30KKworIyBDb3B5IGEgZGlyZWN0b3J5LCBjcmVhdGUgdGFyZ2V0IGxvY2F0aW9uIGlmIG5lZWRlZAorIworIyAkMTogc291cmNlIGRpcmVjdG9yeQorIyAkMjogdGFyZ2V0IGRpcmVjdG9yeSBsb2NhdGlvbgorIworY29weV9kaXJlY3RvcnkgKCkKK3sKKyAgICBsb2NhbCBTUkNESVI9IiQxIgorICAgIGxvY2FsIERTVERJUj0iJDIiCisgICAgaWYgWyAhIC1kICIkU1JDRElSIiBdIDsgdGhlbgorICAgICAgICBwYW5pYyAiQ2FuJ3QgY29weSBmcm9tIG5vbi1kaXJlY3Rvcnk6ICRTUkNESVIiCisgICAgZmkKKyAgICBsb2cyICJEaXJlY3RvcnkgY29weTogJFNSQ0RJUiAtPiAkRFNURElSIgorICAgIG1rZGlyIC1wICIkRFNURElSIiAmJiAoY2QgIiRTUkNESVIiICYmIHRhciBjZiAtICopIHwgKHRhciB4ZiAtIC1DICIkRFNURElSIikKKyAgICBmYWlsX3BhbmljICJDYW5ub3QgY29weSB0byBkaXJlY3Rvcnk6ICREU1RESVIiCit9CisKK2ZpbmRfcHJvZ3JhbSBDTURfV0dFVCB3Z2V0CitmaW5kX3Byb2dyYW0gQ01EX0NVUkwgY3VybAorZmluZF9wcm9ncmFtIENNRF9TQ1AgIHNjcAorCisjIERvd25sb2FkIGEgZmlsZSB3aXRoIGVpdGhlciAnY3VybCcsICd3Z2V0JyBvciAnc2NwJworIworIyAkMTogc291cmNlIFVSTCAoZS5nLiBodHRwOi8vZm9vLmNvbSwgc3NoOi8vYmxhaCwgL3NvbWUvcGF0aCkKKyMgJDI6IHRhcmdldCBmaWxlCitkb3dubG9hZF9maWxlICgpCit7CisgICAgIyBJcyB0aGlzIEhUVFAsIEhUVFBTIG9yIEZUUCA/CisgICAgaWYgcGF0dGVybl9tYXRjaCAiXihodHRwfGh0dHBzfGZ0cCk6LioiICIkMSI7IHRoZW4KKyAgICAgICAgaWYgWyAtbiAiJENNRF9XR0VUIiBdIDsgdGhlbgorICAgICAgICAgICAgcnVuICRDTURfV0dFVCAtTyAkMiAkMQorICAgICAgICBlbGlmIFsgLW4gIiRDTURfQ1VSTCIgXSA7IHRoZW4KKyAgICAgICAgICAgIHJ1biAkQ01EX0NVUkwgLW8gJDIgJDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiUGxlYXNlIGluc3RhbGwgd2dldCBvciBjdXJsIG9uIHRoaXMgbWFjaGluZSIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorICAgICAgICByZXR1cm4KKyAgICBmaQorCisgICAgIyBJcyB0aGlzIFNTSCA/CisgICAgIyBBY2NlcHQgYm90aCBzc2g6Ly88cGF0aD4gb3IgPG1hY2hpbmU+OjxwYXRoPgorICAgICMKKyAgICBpZiBwYXR0ZXJuX21hdGNoICJeKHNzaHxbXjpdKyk6LioiICIkMSI7IHRoZW4KKyAgICAgICAgaWYgWyAtbiAiJENNRF9TQ1AiIF0gOyB0aGVuCisgICAgICAgICAgICBzY3Bfc3JjPWBlY2hvICQxIHwgc2VkIC1lIHMlc3NoOi8vJSVnYAorICAgICAgICAgICAgcnVuICRDTURfU0NQICRzY3Bfc3JjICQyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlBsZWFzZSBpbnN0YWxsIHNjcCBvbiB0aGlzIG1hY2hpbmUiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgICMgSXMgdGhpcyBhIGZpbGUgY29weSA/CisgICAgIyBBY2NlcHQgYm90aCBmaWxlOi8vPHBhdGg+IG9yIC88cGF0aD4KKyAgICAjCisgICAgaWYgcGF0dGVybl9tYXRjaCAiXihmaWxlOi8vfC8pLioiICIkMSI7IHRoZW4KKyAgICAgICAgY3Bfc3JjPWBlY2hvICQxIHwgc2VkIC1lIHMlXmZpbGU6Ly8lJWdgCisgICAgICAgIHJ1biBjcCAtZiAkY3Bfc3JjICQyCisgICAgICAgIHJldHVybgorICAgIGZpCisKKyAgICAjIFVua25vd24gc2NoZW1hCisgICAgZWNobyAiRVJST1I6IFVuc3VwcG9ydGVkIHNvdXJjZSBVUkk6ICQxIgorICAgIGV4aXQgMQorfQorCisjIEEgdmFyaWFudCBvZiAnZG93bmxvYWRfZmlsZScgdXNlZCB0byBzcGVjaWZ5IHRoZSB0YXJnZXQgZGlyZWN0b3J5CisjICQxOiBzb3VyY2UgVVJMCisjICQyOiB0YXJnZXQgZGlyZWN0b3J5Citkb3dubG9hZF9maWxlX3RvICgpCit7CisgICAgbG9jYWwgVVJMPSIkMSIKKyAgICBsb2NhbCBESVI9IiQyIgorICAgIGxvY2FsIERTVD0iJERJUi9gYmFzZW5hbWUgJFVSTGAiCisgICAgbWtkaXIgLXAgJERJUgorICAgIGRvd25sb2FkX2ZpbGUgIiRVUkwiICIkRFNUIgorfQorCisjIFBhY2sgYSBnaXZlbiBhcmNoaXZlCisjCisjICQxOiBhcmNoaXZlIGZpbGUgcGF0aCAoaW5jbHVkaW5nIGV4dGVuc2lvbikKKyMgJDI6IHNvdXJjZSBkaXJlY3RvcnkgZm9yIGFyY2hpdmUgY29udGVudAorIyAkMys6IGxpc3Qgb2YgZmlsZXMgKGluY2x1ZGluZyBwYXR0ZXJucyksIGFsbCBpZiBlbXB0eQorcGFja19hcmNoaXZlICgpCit7CisgICAgbG9jYWwgQVJDSElWRT0iJDEiCisgICAgbG9jYWwgU1JDRElSPSIkMiIKKyAgICBsb2NhbCBTUkNGSUxFUworICAgIGxvY2FsIFRBUkZMQUdTIFpJUEZMQUdTCisgICAgc2hpZnQ7IHNoaWZ0OworICAgIGlmIFsgLXogIiQxIiBdIDsgdGhlbgorICAgICAgICBTUkNGSUxFUz0iKiIKKyAgICBlbHNlCisgICAgICAgIFNSQ0ZJTEVTPSIkQCIKKyAgICBmaQorICAgIGlmIFsgImBiYXNlbmFtZSAkQVJDSElWRWAiID0gIiRBUkNISVZFIiBdIDsgdGhlbgorICAgICAgICBBUkNISVZFPSJgcHdkYC8kQVJDSElWRSIKKyAgICBmaQorICAgIG1rZGlyIC1wIGBkaXJuYW1lICRBUkNISVZFYAorICAgIGlmIFsgIiRWRVJCT1NFIiAtZ2UgMiBdIDsgdGhlbgorICAgICAgICBUQVJGTEFHUz0idmNmIgorICAgICAgICBaSVBGTEFHUz0iLTlyIgorICAgIGVsc2UKKyAgICAgICAgVEFSRkxBR1M9ImNmIgorICAgICAgICBaSVBGTEFHUz0iLTlxciIKKyAgICBmaQorICAgIGNhc2UgIiRBUkNISVZFIiBpbgorICAgICAgICAqLnppcCkKKyAgICAgICAgICAgIChjZCAkU1JDRElSICYmIHJ1biB6aXAgJFpJUEZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIpCisgICAgICAgICAgICAoY2QgJFNSQ0RJUiAmJiBydW4gdGFyICRUQVJGTEFHUyAiJEFSQ0hJVkUiICRTUkNGSUxFUykKKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLmd6KQorICAgICAgICAgICAgKGNkICRTUkNESVIgJiYgcnVuIHRhciB6JFRBUkZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIuYnoyKQorICAgICAgICAgICAgKGNkICRTUkNESVIgJiYgcnVuIHRhciBqJFRBUkZMQUdTICIkQVJDSElWRSIgJFNSQ0ZJTEVTKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJVbnN1cHBvcnRlZCBhcmNoaXZlIGZvcm1hdDogJEFSQ0hJVkUiCisgICAgICAgICAgICA7OworICAgIGVzYWMKK30KKworbm9fdHJhaWxpbmdfc2xhc2ggKCkKK3sKKyAgICBlY2hvICR7MSMjL30KK30KKworIyBMb2FkIHRoZSBVYnVudHUgcGFja2FnZXMgZmlsZS4gVGhpcyBpcyBhIGxvbmcgdGV4dCBmaWxlIHRoYXQgd2lsbCBsaXN0CisjIGVhY2ggcGFja2FnZSBmb3IgYSBnaXZlbiByZWxlYXNlLgorIworIyAkMTogVWJ1bnR1IG1pcnJvciBiYXNlIFVSTCAoZS5nLiBodHRwOi8vbWlycm9ycy51cy5rZXJuZWwub3JnLykKKyMgJDI6IFJlbGVhc2UgbmFtZQorIworZ2V0X3VidW50dV9wYWNrYWdlc19saXN0ICgpCit7CisgICAgbG9jYWwgUkVMRUFTRT0kMgorICAgIGxvY2FsIEJBU0U9ImBub190cmFpbGluZ19zbGFzaCBcIiQxXCJgIgorICAgIGxvY2FsIFNSQ0ZJTEU9IiRCQVNFL3VidW50dS9kaXN0cy8kUkVMRUFTRS9tYWluL2JpbmFyeS0kVUJVTlRVX0FSQ0gvUGFja2FnZXMuYnoyIgorICAgIGxvY2FsIERTVEZJTEU9IiRET1dOTE9BRF9ESVIvUGFja2FnZXMuYnoyIgorICAgIGxvZyAiVHJ5aW5nIHRvIGxvYWQgJFNSQ0ZJTEUiCisgICAgZG93bmxvYWRfZmlsZSAiJFNSQ0ZJTEUiICIkRFNURklMRSIKKyAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgZG93bmxvYWQgJFNSQ0ZJTEUiCisgICAgKGNkICRET1dOTE9BRF9ESVIgJiYgYnVuemlwMiAtZiBQYWNrYWdlcy5iejIpCisgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IHVuY29tcHJlc3MgJERTVEZJTEUiCisKKyAgICAjIFdyaXRlIGEgc21hbGwgYXdrIHNjcmlwdCB1c2VkIHRvIGV4dHJhY3QgZmlsZW5hbWVzIGZvciBhIGdpdmVuIHBhY2thZ2UKKyAgICBjYXQgPiAkRE9XTkxPQURfRElSL2V4dHJhY3QtZmlsZW5hbWUuYXdrIDw8RU9GCitCRUdJTiB7CisgICAgIyBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHBhY2thZ2UgbmFtZQorICAgIGdzdWIoIlxcXFwuIiwiXFxcXC4iLFBLRykKKyAgICBnc3ViKCJcXFxcKyIsIlxcXFwrIixQS0cpCisgICAgRklMRSA9ICIiCisgICAgUEFDS0FHRSA9ICIiCit9CisKK1wkMSA9PSAiUGFja2FnZToiIHsKKyAgICBpZiAoXCQyID09IFBLRykgeworICAgICAgICBQQUNLQUdFID0gXCQyCisgICAgfSBlbHNlIHsKKyAgICAgICAgUEFDS0FHRSA9ICIiCisgICAgfQorfQorCitcJDEgPT0gIkZpbGVuYW1lOiIgJiYgUEFDS0FHRSA9PSBQS0cgeworICAgIEZJTEUgPSBcJDIKK30KKworRU5EIHsKKyAgICBwcmludCBGSUxFCit9CitFT0YKK30KKworIyBDb252ZXJ0IGFuIHVudmVyc2lvbmVkIHBhY2thZ2UgbmFtZSBpbnRvIGEgLmRlYiBwYWNrYWdlIFVSTAorIworIyAkMTogUGFja2FnZSBuYW1lIHdpdGhvdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoZS5nLiBsaWJjNi1kZXYpCisjICQyOiBVYnVudHUgbWlycm9yIGJhc2UgVVJMCisjCitnZXRfdWJ1bnR1X3BhY2thZ2VfZGViX3VybCAoKQoreworICAgICMgVGhlIGZvbGxvd2luZyBpcyBhbiBhd2sgY29tbWFuZCB0byBwYXJzZSB0aGUgUGFja2FnZXMgZmlsZSBhbmQgZXh0cmFjdAorICAgICMgdGhlIGZpbGVuYW1lIG9mIGEgZ2l2ZW4gcGFja2FnZS4KKyAgICBsb2NhbCBCQVNFPSJgbm9fdHJhaWxpbmdfc2xhc2ggXCIkMVwiYCIKKyAgICBsb2NhbCBGSUxFPWBhd2sgLWYgIiRET1dOTE9BRF9ESVIvZXh0cmFjdC1maWxlbmFtZS5hd2siIC12IFBLRz0kMSAkRE9XTkxPQURfRElSL1BhY2thZ2VzYAorICAgIGlmIFsgLXogIiRGSUxFIiBdOyB0aGVuCisgICAgICAgIGxvZyAiQ291bGQgbm90IGZpbmQgZmlsZW5hbWUgZm9yIHBhY2thZ2UgJDEiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZWNobyAiJDIvdWJ1bnR1LyRGSUxFIgorfQorCisjIERvZXMgdGhlIGhvc3QgY29tcGlsZXIgZ2VuZXJhdGUgMzItYml0IG1hY2hpbmUgY29kZT8KKyMgSWYgbm90LCBhZGQgdGhlIC1tMzIgZmxhZyB0byB0aGUgY29tcGlsZXIgbmFtZSB0byBlbnN1cmUgdGhpcy4KKyMKK2NvbXB1dGVfaG9zdF9mbGFncyAoKQoreworICAgIEhPU1RfQ0M9JHtDQzotZ2NjfQorICAgIEhPU1RfQ1hYPSR7Q1hYLWcrK30KKyAgICBpZiBbIC1uICIkVVNFX0NDQUNIRSIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJDaGVja2luZyBmb3IgY2NhY2hlLi4uIgorICAgICAgICBmaW5kX3Byb2dyYW0gQ01EX0NDQUNIRSBjY2FjaGUKKyAgICAgICAgaWYgWyAtbiAiJENNRF9DQ0FDSEUiIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICIkSE9TVF9DQyIgfCB0ciAnICcgJ1xuJyB8IGdyZXAgLXEgLWUgImNjYWNoZSIKKyAgICAgICAgICAgIGlmIFsgJD8gPSAwIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAieWVzIChpZ25vcmVkKSIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvICJ5ZXMiCisgICAgICAgICAgICAgICAgSE9TVF9DQz0iY2NhY2hlICRIT1NUX0NDIgorICAgICAgICAgICAgICAgIEhPU1RfQ1hYPSJjY2FjaGUgJEhPU1RfQ1hYIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAibm8iCisgICAgICAgIGZpCisgICAgZmkKKyAgICBlY2hvIC1uICJDaGVja2luZyBjb21waWxlciBiaXRuZXNzLi4uICIKKyAgICBjYXQgPiAiJEJVSUxEX0RJUiIvY29uZnRlc3QuYyA8PCBFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4odm9pZCkgeworICAgIHByaW50ZigiJWRcbiIsc2l6ZW9mKHZvaWQqKSo4KTsKKyAgICByZXR1cm4gMDsKK30KK0VPRgorICAgICRIT1NUX0NDIC1vICIkQlVJTERfRElSIi9jb25mdGVzdCAiJEJVSUxEX0RJUiIvY29uZnRlc3QuYyA+ICIkQlVJTERfRElSIi9jb25mdGVzdC5sb2cgMj4mMQorICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgICAgICBlY2hvICJDb3VsZCBub3QgY29tcGlsZSB0ZXN0IHByb2dyYW0hISIKKyAgICAgICAgZWNobyAiRXJyb3IgbG9nIGlzOiIKKyAgICAgICAgY2F0ICIkQlVJTERfRElSIi9jb25mdGVzdC5sb2cKKyAgICAgICAgcm0gIiRCVUlEX0RJUiIvY29uZnRlc3QubG9nCisgICAgICAgIHBhbmljICJOZWVkIGEgd29ya2luZyBidWlsZCB0b29sY2hhaW4hIgorICAgIGZpCisgICAgSE9TVF9DQ19CSVRTPSQoIiRCVUlMRF9ESVIiL2NvbmZ0ZXN0KQorICAgIGVjaG8gLW4gIiRIT1NUX0NDX0JJVFMiCisgICAgY2FzZSAkSE9TVF9DQ19CSVRTIGluCisgICAgICAgIDMyKSAjIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIDs7CisgICAgICAgIDY0KSAjIERvIHdlIG5lZWQgdG8gZm9yY2UgMzItYml0cworICAgICAgICAgICAgaWYgWyAiJEZPUkNFXzMyIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiIChmb3JjaW5nIGdlbmVyYXRpb24gb2YgMzItYml0IGJpbmFyaWVzKSIKKyAgICAgICAgICAgICAgICBIT1NUX0NDPSRIT1NUX0NDIiAtbTMyIgorICAgICAgICAgICAgICAgIEhPU1RfQ1hYPSRIT1NUX0NYWCIgLW0zMiIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgcGFuaWMgIlVua25vd24gYml0bmVzcyAoMzIgb3IgNjQgZXhwZWN0ZWQpICEhIgorICAgIGVzYWMKKyAgICBlY2hvICIiCisgICAgZWNobyAiVXNpbmcgYnVpbGQgQyBjb21waWxlcjogJEhPU1RfQ0MiCisgICAgZWNobyAiVXNpbmcgYnVpbGQgQysrIGNvbXBpbGVyOiAkSE9TVF9DWFgiCisgICAgZWNobyAiR0NDIHRhcmdldCBuYW1lOiAkR0NDX1RBUkdFVCIKKyAgICBlY2hvICJHTVAgdGFyZ2V0IG5hbWU6ICRHTVBfVEFSR0VUIgorICAgIGVjaG8gIkdNUCBBQkk6ICRHTVBfQUJJIgorICAgIGV4cG9ydCBDQz0iJEhPU1RfQ0MiCisgICAgZXhwb3J0IENYWD0iJEhPU1RfQ1hYIgorfQorCitjb21wdXRlX2hvc3RfZmxhZ3MKKworIyBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gbmFtZWQgdmFyaWFibGUKKyMgJDE6IHZhcmlhYmxlIG5hbWUKKyMKKyMgZXhhbXBsZToKKyMgICAgRk9PPUJBUgorIyAgICBCQVI9Wk9PCisjICAgIGVjaG8gYHZhcl92YWx1ZSAkRk9PYAorIyAgICB3aWxsIHByaW50ICdaT08nCisjCit2YXJfdmFsdWUgKCkKK3sKKyAgICBldmFsIGVjaG8gXCQkMQorfQorCit2YXJfbGlzdF9hcHBlbmQgKCkKK3sKKyAgICBsb2NhbCBWQVJOQU1FPSQxCisgICAgbG9jYWwgVkFSVkFMPWB2YXJfdmFsdWUgJFZBUk5BTUVgCisgICAgc2hpZnQKKyAgICBpZiBbIC16ICIkVkFSVkFMIiBdIDsgdGhlbgorICAgICAgICBldmFsICRWQVJOQU1FPVwiJEBcIgorICAgIGVsc2UKKyAgICAgICAgZXZhbCAkVkFSTkFNRT1cIiRWQVJWQUwgJEBcIgorICAgIGZpCit9CisKK3Zhcl9saXN0X3ByZXBlbmQgKCkKK3sKKyAgICBsb2NhbCBWQVJOQU1FPSQxCisgICAgbG9jYWwgVkFSVkFMPWB2YXJfdmFsdWUgJFZBUk5BTUVgCisgICAgc2hpZnQKKyAgICBpZiBbIC16ICIkVkFSVkFMIiBdIDsgdGhlbgorICAgICAgICBldmFsICRWQVJOQU1FPVwiJEBcIgorICAgIGVsc2UKKyAgICAgICAgZXZhbCAkVkFSTkFNRT1cIiRAICRWQVJWQUxcIgorICAgIGZpCit9CisKK19saXN0X2ZpcnN0ICgpCit7CisgICAgZWNobyAkMQorfQorCitfbGlzdF9yZXN0ICgpCit7CisgICAgc2hpZnQKKyAgICBlY2hvICIkQCIKK30KKworX2xpc3RfcmV2ZXJzZSAoKQoreworICAgIGxvY2FsIEkxIEkyIEkzIEk0IEk1IEk2IEk3IEk4IEk5IFJFU1QgUkVUCisgICAgSTE9JDE7IEkyPSQyOyBJMz0kMzsgSTQ9JEk0OyBJNT0kSTU7IEk2PSRJNjsgSTc9JEk3OyBJOD0kSTg7IEk5PSRJOQorICAgIHNoaWZ0IDkKKyAgICBSRVQ9JEk5JHtJODorIiAifSRJOCR7STc6KyIgIn0kSTcke0k2OisiICJ9JEk2JHtJNTorIiAifSRJNSR7STQ6KyIgIn0kSTQke0kzOisiICJ9JEkzJHtJMjorIiAifSRJMiR7STE6KyIgIn0kSTEKKyAgICBSRVNUPSIkKiIKKyAgICBpZiBbICIkUkVTVCIgXTsgdGhlbgorICAgICAgICBSRVQ9JChfbGlzdF9yZXZlcnNlICRSRVNUKSRSRVQKKyAgICBmaQorICAgIGVjaG8gIiRSRVQiCit9CisKK3Zhcl9saXN0X3BvcF9maXJzdCAoKQoreworICAgIGxvY2FsIFZBUk5BTUU9JDEKKyAgICBsb2NhbCBWQVJWQUw9YHZhcl92YWx1ZSAkVkFSTkFNRWAKKyAgICBsb2NhbCBGSVJTVD1gX2xpc3RfZmlyc3QgJFZBUlZBTGAKKyAgICBldmFsICRWQVJOQU1FPVwiYF9saXN0X3Jlc3QgJFZBUlZBTGBcIgorICAgIGVjaG8gIiRGSVJTVCIKK30KKworX2xpc3RfZmlyc3QgKCkKK3sKKyAgICBlY2hvICQxCit9CisKK19saXN0X3Jlc3QgKCkKK3sKKyAgICBzaGlmdAorICAgIGVjaG8gIiRAIgorfQorCit2YXJfbGlzdF9maXJzdCAoKQoreworICAgIGxvY2FsIFZBTD1gdmFyX3ZhbHVlICQxYAorICAgIF9saXN0X2ZpcnN0ICRWQUwKK30KKwordmFyX2xpc3RfcmVzdCAoKQoreworICAgIGxvY2FsIFZBTD1gdmFyX3ZhbHVlICQxYAorICAgIF9saXN0X3Jlc3QgJFZBTAorfQorCitBTExfVEFTS1M9CisKKyMgRGVmaW5lIGEgbmV3IHRhc2sgZm9yIHRoaXMgYnVpbGQgc2NyaXB0CisjICQxOiBUYXNrIG5hbWUgKGUuZy4gYnVpbGRfc3R1ZmYpCisjICQyOiBUYXNrIGRlc2NyaXB0aW9uCisjICQzOiBPcHRpb25hbDogY29tbWFuZCBuYW1lICh3aWxsIGJlIGNtZF8kMSBieSBkZWZhdWx0KQorIwordGFza19kZWZpbmUgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBsb2NhbCBERVNDUj0iJDIiCisgICAgbG9jYWwgQ09NTUFORD0iJHszOi1jbWRfJDF9IgorCisgICAgdmFyX2xpc3RfYXBwZW5kIEFMTF9UQVNLUyAkVEFTSworICAgIHRhc2tfc2V0ICRUQVNLIG5hbWUgIiRUQVNLIgorICAgIHRhc2tfc2V0ICRUQVNLIGRlc2NyICIkREVTQ1IiCisgICAgdGFza19zZXQgJFRBU0sgY21kICIkQ09NTUFORCIKKyAgICB0YXNrX3NldCAkVEFTSyBkZXBzICIiCit9CisKKyMgVmFyaWFudCBvZiB0YXNrIGRlZmluZSBmb3IgZHVhbCB0YXNrcworIyBUaGlzIHJlYWxseSBkZWZpbmVzIHR3byB0YXNrcyBuYW1lZCAnPHRhc2s+XzEnIGFuZCAnPHRhc2s+XzIiCisjICQxOiBUYXNrIGJhc2UgbmFtZQorIyAkMjogVGFzayBkZXNjcmlwdGlvbgorIyAkMzogT3B0aW9uYWw6IGNvbW1hbmQgbmFtZSAod2lsbCBiZSBjbWRfJDEgYnkgZGVmYXVsdCkKK3Rhc2syX2RlZmluZSAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIGxvY2FsIERFU0NSPSIkMiIKKyAgICBsb2NhbCBDT01NQU5EPSIkezM6LWNtZF8kMX0iCisKKyAgICB0YXNrX2RlZmluZSAiJHtUQVNLfV8xIiAiJERFU0NSIDEvMiIgInBoYXNlXzEgJENPTU1BTkQiCisgICAgdGFza19kZWZpbmUgIiR7VEFTS31fMiIgIiRERVNDUiAyLzIiICJwaGFzZV8yICRDT01NQU5EIgorfQorCit0YXNrX3NldCAoKQoreworICAgIGxvY2FsIFRBU0s9IiQxIgorICAgIGxvY2FsIEZJRUxEPSIkMiIKKyAgICBzaGlmdDsgc2hpZnQ7CisgICAgZXZhbCBUQVNLXyR7VEFTS31fXyR7RklFTER9PVwiJEBcIgorfQorCit0YXNrX2dldCAoKQoreworICAgIHZhcl92YWx1ZSBUQVNLXyQxX18kMgorfQorCisjIHJldHVybiB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIGEgZ2l2ZW4gdGFzawordGFza19nZXRfZGVwcyAoKQoreworICAgIHRhc2tfZ2V0ICQxIGRlcHMKK30KKwordGFza19nZXRfY21kICgpCit7CisgICAgdGFza19nZXQgJDEgY21kCit9CisKK3Rhc2tfZ2V0X2Rlc2NyICgpCit7CisgICAgdGFza19nZXQgJDEgZGVzY3IKK30KKworIyAkMTogdGFzayBuYW1lCisjICQyKzogb3RoZXIgdGFza3MgdGhpcyB0YXNrIGRlcGVuZHMgb24uCit0YXNrX2RlcGVuZHMgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBzaGlmdDsKKyAgICB2YXJfbGlzdF9hcHBlbmQgVEFTS18ke1RBU0t9X19kZXBzICRACit9CisKKyMgJDE6IGR1YWwgdGFzayBuYW1lCisjICQyKzogb3RoZXIgbm9uLWR1YWwgdGFza3MgdGhpcyBkdWFsIHRhc2sgZGVwZW5kcyBvbgordGFzazJfZGVwZW5kczEgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBzaGlmdAorICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMV9fZGVwcyAkQAorICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMl9fZGVwcyAkQAorfQorCisjICQxOiBkdWFsIHRhc2sgbmFtZQorIyAkMis6IG90aGVyIGR1YWwgdGFza3MgdGhpcyBkdWFsIHRhc2sgZGVwZW5kcyBvbgordGFzazJfZGVwZW5kczIgKCkKK3sKKyAgICBsb2NhbCBUQVNLPSIkMSIKKyAgICBsb2NhbCBERVAKKyAgICBzaGlmdAorICAgIGZvciBERVA7IGRvCisgICAgICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLXyR7VEFTS31fMV9fZGVwcyAke0RFUH1fMQorICAgICAgICB2YXJfbGlzdF9hcHBlbmQgVEFTS18ke1RBU0t9XzJfX2RlcHMgJHtERVB9XzIKKyAgICBkb25lCit9CisKK3Rhc2tfZHVtcCAoKQoreworICAgIGxvY2FsIFRBU0sKKyAgICBmb3IgVEFTSyBpbiAkQUxMX1RBU0tTOyBkbworICAgICAgICBsb2NhbCBERVBTPSJgdGFza19nZXRfZGVwcyAkVEFTS2AiCisgICAgICAgIGxvY2FsIENNRD0iYHRhc2tfZ2V0X2NtZCAkVEFTS2AiCisgICAgICAgIGxvY2FsIERFU0NSPSJgdGFza19nZXRfZGVzY3IgJFRBU0tgIgorICAgICAgICBlY2hvICJUQVNLICRUQVNLOiAkREVTQ1I6ICRDTUQiCisgICAgICAgIGVjaG8gIj4gICRERVBTIgorICAgIGRvbmUKK30KKwordGFza192aXNpdCAoKQoreworICAgIHRhc2tfc2V0ICRUQVNLIHZpc2l0IDEKK30KKwordGFza191bnZpc2l0ICgpCit7CisgICAgdGFza19zZXQgJFRBU0sgdmlzaXQgMAorfQorCit0YXNrX2lzX3Zpc2l0ZWQgKCkKK3sKKyAgICBbIGB0YXNrX2dldCAkVEFTSyB2aXNpdGAgPSAxIF0KK30KKwordGFza19xdWV1ZV9yZXNldCAoKQoreworICAgIFRBU0tfUVVFVUU9Cit9CisKK3Rhc2tfcXVldWVfcHVzaCAoKQoreworICAgIHZhcl9saXN0X2FwcGVuZCBUQVNLX1FVRVVFICQxCit9CisKK3Rhc2tfcXVldWVfcG9wICgpCit7CisgICAgbG9jYWwgRklSU1Q9YHZhcl9saXN0X2ZpcnN0IFRBU0tfUVVFVUVgCisgICAgVEFTS19RVUVVRT1gdmFyX2xpc3RfcmVzdCBUQVNLX1FVRVVFYAorfQorCitkb19hbGxfdGFza3MgKCkKK3sKKyAgICBsb2NhbCBUQVNLCisgICAgbG9jYWwgVEFTS19MSVNUPQorICAgIHRhc2tfcXVldWVfcmVzZXQKKyAgICAjIENsZWFyIHZpc2l0IGZsYWdzCisgICAgZm9yIFRBU0sgaW4gJEFMTF9UQVNLUzsgZG8KKyAgICAgICAgdGFza191bnZpc2l0ICRUQVNLCisgICAgZG9uZQorICAgIHRhc2tfcXVldWVfcHVzaCAkMQorICAgIHdoaWxlIFsgLW4gIiRUQVNLX1FVRVVFIiBdIDsgZG8KKyAgICAgICAgVEFTSz1gdGFza19xdWV1ZV9wb3BgCisgICAgICAgIGlmIHRhc2tfaXNfdmlzaXRlZCAkVEFTSzsgdGhlbgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgIyBQcmVwZW5kIHRoZSB0YXNrIHRvIHRoZSBsaXN0IGlmIGl0cyB0aW1lc3RhbXAgaXMgbm90IHNldAorICAgICAgICBpZiBzdGFtcF9jaGVjayAkVEFTSzsgdGhlbgorICAgICAgICAgICAgdmFyX2xpc3RfcHJlcGVuZCBUQVNLX0xJU1QgJFRBU0sKKyAgICAgICAgZmkKKyAgICAgICAgIyBBZGQgYWxsIGRlcGVuZGVuY2llcyB0byB0aGUgd29yay1xdWV1ZQorICAgICAgICBsb2NhbCBTVUJUQVNLCisgICAgICAgIGZvciBTVUJUQVNLIGluIGB0YXNrX2dldF9kZXBzICRUQVNLYDsgZG8KKyAgICAgICAgICAgIHRhc2tfcXVldWVfcHVzaCAkU1VCVEFTSworICAgICAgICBkb25lCisgICAgICAgIHRhc2tfdmlzaXQgJFRBU0sKKyAgICBkb25lCisKKyAgICAjIE5vdywgVEFTS19MSVNUIGNvbnRhaW5zIHRoZQorfQorCisKKyMgUmV0dXJuIHRoZSBmaXJzdCBpdGVtIG9mIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3QKK2xpc3RfZmlyc3QgKCkgeworICAgIHNldCAtLSAiJEAiCisgICAgZWNobyAiJDEiCit9CisKKyMgQXBwZW5kIGFuIGl0ZW0gdG8gYSBnaXZlbiBsaXN0CitsaXN0X2FwcGVuZCAoKSB7CisgICAgbG9jYWwgSVRFTT0kMQorICAgIHNoaWZ0OworICAgIGVjaG8gJEAke0A6KyIgIn0kMQorfQorCisjIFJldHVybiB0aGUgc2Vjb25kLXRvLWxhc3QgaXRlbXMgb2YgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdAorbGlzdF9yZXN0ICgpIHsKKyAgICBzZXQgLS0gIiRAIgorICAgIHNoaWZ0CisgICAgZWNobyAiJEAiCit9CisKKyMgUmV2ZXJzZSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0CitsaXN0X3JldmVyc2UgKCkKK3sKKyAgICBzZXQgLS0gIiRAIgorICAgIGxvY2FsIEkxIEkyIEkzIEk0IEk1IEk2IEk3IEk4IEk5IFJFU1QgUkVUCisgICAgSTE9JDE7IEkyPSQyOyBJMz0kMzsgSTQ9JDQ7IEk1PSQ1OyBJNj0kNjsgSTc9JDc7IEk4PSQ4OyBJOT0kOQorICAgIHNoaWZ0OyBzaGlmdDsgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsgc2hpZnQ7IHNoaWZ0OyBzaGlmdDsgc2hpZnQ7CisgICAgUkVUPSRJOSR7STk6KyIgIn0kSTgke0k4OisiICJ9JEk3JHtJNzorIiAifSRJNiR7STY6KyIgIn0kSTUke0k1OisiICJ9JEk0JHtJNDorIiAifSRJMyR7STM6KyIgIn0kSTIke0kyOisiICJ9JEkxCisgICAgUkVTVD0iJCoiCisgICAgaWYgWyAtbiAiJFJFU1QiIF07IHRoZW4KKyAgICAgICAgUkVUPSQobGlzdF9yZXZlcnNlICRSRVNUKSIgIiRSRVQKKyAgICBmaQorICAgIGVjaG8gIiRSRVQiCit9CisKKyMgVXNlZCB0byBidWlsZCB0aGUgbGlzdCBvZiB0YXNrcyB3aXRoIGEgdHJlZSBwb3N0LW9yZGVyIHRyYXZlcnNhbCwgaS5lLgorIyB0aGUgbGlzdCBzdGFydHMgYXQgdGhlIGxlYXZlcyBhbmQgZmluaXNoZXMgd2l0aCB0aGUgdG9wIGxldmVsIHRhc2ssCisjIHNvIHRoYXQgaWYgdGFzayhBKSBkZXBlbmRzIG9uIHRhc2soQiksIHRoZW4gQSB3aWxsIGFsd2F5cyBhcHBlYXIgX2FmdGVyXworIyBCIGluIHRoZSByZXN1bHQuCisjCisjICQxOiBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXNrcyB0byB2aXNpdAorIyBPdXQ6IGxpc3Qgb2YgYWxsIHRhc2tzIGluIHBvc3Qtb3JkZXIKKyMKK3Rhc2tfYnVpbGRfcG9zdG9yZGVyX2xpc3QgKCkKK3sKKyAgICBsb2NhbCBUQVNLCisgICAgbG9jYWwgU1RBQ0s9IiQxIgorICAgIGxvY2FsIFJFVD0iIgorICAgIGZvciBUQVNLIGluICRBTExfVEFTS1M7IGRvCisgICAgICAgIHN0YW1wX2NsZWFyICRUQVNLLnZpc2l0CisgICAgZG9uZQorICAgIHdoaWxlIHRydWU7IGRvCisgICAgICAgICMgUGVlayBhdCBzdGFjaworICAgICAgICBUQVNLPSQobGlzdF9maXJzdCAkU1RBQ0spCisgICAgICAgICNlY2hvID4mMiAiU1RBQ0s6ICgkVEFTSykgJyRTVEFDSyciCisgICAgICAgIGlmIFsgLXogIiRUQVNLIiBdOyB0aGVuCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgICBIQVNfREVQUz0KKyAgICAgICAgZm9yIERFUCBpbiAkKHRhc2tfZ2V0X2RlcHMgJFRBU0spOyBkbworICAgICAgICAgICAgI2VjaG8gPiYyICJDSEVDSzogJyRERVAnIgorICAgICAgICAgICAgaWYgISBzdGFtcF9jaGVjayAkREVQLnZpc2l0OyB0aGVuCisgICAgICAgICAgICAgICAgU1RBQ0s9JERFUCIgIiRTVEFDSworICAgICAgICAgICAgICAgICNlY2hvID4mMiAiUFVTSDogJyRERVAnID0+ICckU1RBQ0snIgorICAgICAgICAgICAgICAgIEhBU19ERVBTPTEKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICBpZiBbIC16ICIkSEFTX0RFUFMiIF07IHRoZW4KKyAgICAgICAgICAgICNlY2hvID4mMiAiQUREOiAkVEFTSyAtPiAnJFJFVCciCisgICAgICAgICAgICBTVEFDSz0kKGxpc3RfcmVzdCAkU1RBQ0spCisgICAgICAgICAgICBpZiAhIHN0YW1wX2NoZWNrICRUQVNLLnZpc2l0OyB0aGVuCisgICAgICAgICAgICAgICAgUkVUPSRSRVQke1JFVDorIiAifSRUQVNLCisgICAgICAgICAgICAgICAgc3RhbXBfc2V0ICRUQVNLLnZpc2l0CisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGRvbmUKKyAgICBmb3IgVEFTSyBpbiAkQUxMX1RBU0tTOyBkbworICAgICAgICBzdGFtcF9jbGVhciAkVEFTSy52aXNpdAorICAgIGRvbmUKKyAgICBlY2hvICIkUkVUIgorfQorCitydW5fdGFzayAoKQoreworICAgICMgQnVpbGQgdGhlIGxpc3Qgb2YgdGFza3MsIGluIHJldmVyc2Ugb3JkZXIgKGZyb20gbGVhZnMgdG8gbGFzdCkKKyAgICBsb2NhbCBUQVNLUz0kKHRhc2tfYnVpbGRfcG9zdG9yZGVyX2xpc3QgJDEpCisgICAgIyBEbyBhbGwgdGFza3MKKyAgICBsb2NhbCBUQVNLIERFUCBERVNDUgorCisgICAgIyBEdW1wIGxpc3Qgb2YgdGFza3M6CisjICAgICBlY2hvICJBTEwgVEFTS1M6IgorIyAgICAgZm9yIFRBU0sgaW4gJFRBU0tTOyBkbworIyAgICAgICAgIGVjaG8gIiAgJFRBU0siCisjICAgICBkb25lCisKKyAgICAjIENsZWFuIHRpbWVzdGFtcHMgb2YgYW55IHRhc2tzIHdob3NlIGFueSBvZiBpdHMgZGVwZW5kZW50cyBuZWVkcworICAgICMgdG8gYmUgcmUtZG9uZS4KKyAgICAjCisgICAgZm9yIFRBU0sgaW4gJFRBU0tTOyBkbworICAgICAgIGZvciBERVAgaW4gJCh0YXNrX2dldF9kZXBzICRUQVNLKTsgZG8KKyAgICAgICAgICAgIGlmICEgc3RhbXBfY2hlY2sgJERFUDsgdGhlbgorICAgICAgICAgICAgICAgICNlY2hvICJSZWRvOiAkVEFTSyBkdWUgdG8gJERFUCIKKyAgICAgICAgICAgICAgICBzdGFtcF9jbGVhciAkVEFTSworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgIGRvbmUKKyAgICBkb25lCisKKyAgICBmb3IgVEFTSyBpbiAkVEFTS1M7IGRvCisgICAgICAgIERFU0NSPSQodGFza19nZXRfZGVzY3IgJFRBU0spCisgICAgICAgIGlmIHN0YW1wX2NoZWNrICRUQVNLOyB0aGVuCisgICAgICAgICAgICBlY2hvICJTa2lwcGluZzogJERFU0NSIgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgZWNobyAiUnVubmluZzogJERFU0NSIgorICAgICAgICBpZiBbICIkVkVSQk9TRSIgLWdlIDEgXSA7IHRoZW4KKyAgICAgICAgICAgIChldmFsICQodGFza19nZXRfY21kICRUQVNLKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKGV2YWwgJCh0YXNrX2dldF9jbWQgJFRBU0spKSA+PiAkVE1QTE9HIDI+JjEKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvICJFUlJPUjogQ2Fubm90ICRERVNDUiIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisgICAgICAgIHN0YW1wX3NldCAkVEFTSworICAgIGRvbmUKK30KKworIyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvbmUgYSBzb3VyY2UgcmVwb3NpdG9yeSBlaXRoZXIgZnJvbSBhIGdpdmVuCisjIGdpdCBiYXNlIG9yIGEgZ2l0IHJlZmVyZW5jZS4KKyMgJDE6IHByb2plY3Qvc3ViZGlyIG5hbWUKKyMgJDI6IHBhdGggdG8gU09VUkNFUyBmaWxlCit0b29sY2hhaW5fY2xvbmUgKCkKK3sKKyAgICBsb2NhbCBHSVRGTEFHUworICAgIEdJVEZMQUdTPQorICAgIGlmIFsgIiRHSVRfUkVGRVJFTkNFIiBdOyB0aGVuCisgICAgICAgIEdJVEZMQUdTPSIkR0lURkxBR1MgLS1zaGFyZWQgLS1yZWZlcmVuY2UgJEdJVF9SRUZFUkVOQ0UvJDEiCisgICAgZmkKKyAgICBlY2hvICJjbGVhbmluZyB1cCB0b29sY2hhaW4vJDEiCisgICAgcm0gLXJmICQxCisgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNsZWFuICQocHdkKS8kMSIKKyAgICBlY2hvICJkb3dubG9hZGluZyBzb3VyY2VzIGZvciB0b29sY2hhaW4vJDEiCisgICAgaWYgWyAtZCAiJEdJVF9CQVNFLyQxIiBdOyB0aGVuCisgICAgICAgIGxvZyAiY2xvbmluZyAkR0lUX0JBU0UvJDEiCisgICAgICAgIHJ1biAkR0lUX0NNRCBjbG9uZSAkR0lURkxBR1MgJEdJVF9CQVNFLyQxICQxCisgICAgZWxzZQorICAgICAgICBsb2cgImNsb25pbmcgJEdJVFBSRUZJWC8kMS5naXQiCisgICAgICAgIHJ1biAkR0lUX0NNRCBjbG9uZSAkR0lURkxBR1MgJEdJVF9CQVNFLyQxLmdpdCAkMQorICAgIGZpCisgICAgZmFpbF9wYW5pYyAiQ291bGQgbm90IGNsb25lICRHSVRfQkFTRS8kMS5naXQgPyIKKyAgICBjZCAkMQorICAgIGlmIFsgIiRHSVRfQlJBTkNIIiAhPSAibWFzdGVyIiBdIDsgdGhlbgorICAgICAgICBsb2cgImNoZWNraW5nIG91dCAkR0lUX0JSQU5DSCBicmFuY2ggb2YgJDEuZ2l0IgorICAgICAgICBydW4gJEdJVF9DTUQgY2hlY2tvdXQgLWIgJEdJVF9CUkFOQ0ggb3JpZ2luLyRHSVRfQlJBTkNICisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjaGVja291dCAkMSA/IgorICAgIGZpCisgICAgIyBJZiAtLWdpdC1kYXRlIGlzIHVzZWQsIG9yIHdlIGhhdmUgYSBkZWZhdWx0CisgICAgaWYgWyAtbiAiJEdJVF9EQVRFIiBdIDsgdGhlbgorICAgICAgICBSRVZJU0lPTj1gZ2l0IHJldi1saXN0IC1uIDEgLS11bnRpbD0iJEdJVF9EQVRFIiBIRUFEYAorICAgICAgICBlY2hvICJVc2luZyBzb3VyY2VzIGZvciBkYXRlICckR0lUX0RBVEUnOiB0b29sY2hhaW4vJDEgcmV2aXNpb24gJFJFVklTSU9OIgorICAgICAgICBydW4gJEdJVF9DTUQgY2hlY2tvdXQgJFJFVklTSU9OCisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjaGVja291dCAkMSA/IgorICAgIGZpCisgICAgKHByaW50ZiAiJS0zMnMgIiAidG9vbGNoYWluLyQxLmdpdDogIiAmJiBnaXQgbG9nIC0xIC0tZm9ybWF0PW9uZWxpbmUpID4+ICQyCisgICAgY2QgLi4KK30KKwordGFza19kZWZpbmUgZG93bmxvYWRfdG9vbGNoYWluX3NvdXJjZXMgIkRvd25sb2FkIHRvb2xjaGFpbiBzb3VyY2VzIGZyb20gJEdJVF9CQVNFICIKK2NtZF9kb3dubG9hZF90b29sY2hhaW5fc291cmNlcyAoKQoreworICAgIGxvY2FsIFNVQkRJUlM9ImJpbnV0aWxzIGJ1aWxkIGdjYyBnZGIgZ29sZCBnbXAgbXBmciBtcGMiCisgICAgKG1rZGlyIC1wICRUT09MQ0hBSU5fU1JDX0RJUiAmJiBjZCAkVE9PTENIQUlOX1NSQ19ESVIgJiYKKyAgICAjIENyZWF0ZSBhIHRlbXBvcmFyeSBTT1VSQ0VTIGZpbGUgZm9yIHRoZSB0b29sY2hhaW4gc291cmNlcyBvbmx5CisgICAgIyBJdCdzIGNvbnRlbnQgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGZpbmFsIFNPVVJDRVMgZmlsZSBsYXRlci4KKyAgICBTT1VSQ0VTX0xJU1Q9JFRPT0xDSEFJTl9TUkNfRElSL1NPVVJDRVMKKyAgICBybSAtZiAkU09VUkNFU19MSVNUICYmIHRvdWNoICRTT1VSQ0VTX0xJU1QKKyAgICBmb3IgU1VCIGluICRTVUJESVJTOyBkbworICAgICAgICB0b29sY2hhaW5fY2xvbmUgJFNVQiAkU09VUkNFU19MSVNUCisgICAgZG9uZQorICAgICkKK30KKwordGFza19kZWZpbmUgZG93bmxvYWRfdWJ1bnR1X3BhY2thZ2VzX2xpc3QgIkRvd25sb2FkIFVidW50dSBwYWNrYWdlcyBsaXN0IgorY21kX2Rvd25sb2FkX3VidW50dV9wYWNrYWdlc19saXN0ICgpCit7CisgICAgbWtkaXIgLXAgJERPV05MT0FEX0RJUgorICAgIGdldF91YnVudHVfcGFja2FnZXNfbGlzdCAiJFVCVU5UVV9NSVJST1IiICIkVUJVTlRVX1JFTEVBU0UiCisgICAgZmFpbF9wYW5pYyAiVW5hYmxlIHRvIGRvd25sb2FkIHBhY2thZ2VzIGxpc3QsIHRyeSAtLXVidW50dS1taXJyb3I9PHVybD4gdG8gdXNlIGFub3RoZXIgYXJjaGl2ZSBtaXJyb3IiCit9CisKK3Rhc2tfZGVmaW5lIGRvd25sb2FkX3BhY2thZ2VzICJEb3dubG9hZCBVYnVudHUgcGFja2FnZXMiCit0YXNrX2RlcGVuZHMgZG93bmxvYWRfcGFja2FnZXMgZG93bmxvYWRfdWJ1bnR1X3BhY2thZ2VzX2xpc3QKK2NtZF9kb3dubG9hZF9wYWNrYWdlcyAoKQoreworICAgIGxvY2FsIFBBQ0tBR0UKKworICAgIHJtIC1mICRET1dOTE9BRF9ESVIvU09VUkNFUyAmJiB0b3VjaCAkRE9XTkxPQURfRElSL1NPVVJDRVMKKyAgICBmb3IgUEFDS0FHRSBpbiAkVUJVTlRVX1BBQ0tBR0VTOyBkbworICAgICAgICBlY2hvICJEb3dubG9hZGluZyAkUEFDS0FHRSIKKyAgICAgICAgbG9jYWwgUEtHVVJMPWBnZXRfdWJ1bnR1X3BhY2thZ2VfZGViX3VybCAkUEFDS0FHRSAkVUJVTlRVX01JUlJPUmAKKyAgICAgICAgZWNobyAiVVJMOiAkUEtHVVJMIgorICAgICAgICBkb3dubG9hZF9maWxlX3RvICRQS0dVUkwgJERPV05MT0FEX0RJUgorICAgICAgICBmYWlsX3BhbmljICJDb3VsZCBub3QgZG93bmxvYWQgJFBBQ0tBR0UiCisgICAgZG9uZQorICAgIHNoYTFzdW0gJERPV05MT0FEX0RJUi8qLmRlYiB8IHdoaWxlIHJlYWQgTElORTsgZG8KKyAgICAgICAgUEFDS0FHRT0kKGJhc2VuYW1lICQoZWNobyAkTElORSB8IGF3ayAneyBwcmludCAkMjt9JykpCisgICAgICAgIFNIQTE9JChlY2hvICRMSU5FIHwgYXdrICd7IHByaW50ICQxOyB9JykKKyAgICAgICAgcHJpbnRmICIlLTY0cyAlc1xuIiAkUEFDS0FHRSAkU0hBMSA+PiAkRE9XTkxPQURfRElSL1NPVVJDRVMKKyAgICBkb25lCit9CisKK3Rhc2tfZGVmaW5lIGJ1aWxkX3N5c3Jvb3QgIkJ1aWxkIHN5c3Jvb3QiCit0YXNrX2RlcGVuZHMgYnVpbGRfc3lzcm9vdCBkb3dubG9hZF9wYWNrYWdlcworCitjbWRfYnVpbGRfc3lzcm9vdCAoKQoreworICAgIGxvY2FsIFBBQ0tBR0UKKyAgICBmb3IgUEFDS0FHRSBpbiAkVUJVTlRVX1BBQ0tBR0VTOyBkbworICAgICAgICBsb2NhbCBQS0dVUkw9YGdldF91YnVudHVfcGFja2FnZV9kZWJfdXJsICRQQUNLQUdFICRVQlVOVFVfTUlSUk9SYAorICAgICAgICBsb2NhbCBTUkNfUEtHPSRET1dOTE9BRF9ESVIvYGJhc2VuYW1lICRQS0dVUkxgCisgICAgICAgIGVjaG8gIkV4dHJhY3RpbmcgJFNSQ19QS0ciCisgICAgICAgIGRwa2cgLXggJFNSQ19QS0cgJE9SR19TWVNST09UX0RJUi8KKyAgICBkb25lCit9CisKKyMgTm93LCB3ZSBuZWVkIHRvIHBhdGNoIGxpYmMuc28gd2hpY2ggaXMgYWN0dWFsbHkgYSBsaW5rZXIgc2NyaXB0CisjIHJlZmVyZW5jaW5nIC9saWIgYW5kIC91c3IvbGliLiBEbyB0aGUgc2FtZSBmb3IgbGlicHRocmVhZC5zbworcGF0Y2hfbGlicmFyeSAoKQoreworICAgIGVjaG8gIlBhdGNoaW5nICQxIgorICAgIHNlZCAtaSAtZSAicyEgL2xpYi8hICFnIiAtZSAicyEgL3Vzci9saWIvISAhZyIgJDEKK30KKworIyBVc2VkIHRvIHNldHVwIHBoYXNlIDEgdGhlIHJ1biBhIGNvbW1hbmQKK3BoYXNlXzEgKCkKK3sKKyAgICBQSEFTRT0xCisgICAgJEAKK30KKworIyBVc2VkIHRvIHNldHVwIHBoYXNlIDIgdGhlbiBydW4gYSBjb21tYW5kCitwaGFzZV8yICgpCit7CisgICAgUEhBU0U9MQorICAgIEJJTlBSRUZJWD0kKGluc3RhbGxfZGlyKS9iaW4vJHtHQ0NfVEFSR0VUfS0KKyAgICBDQz0ke0JJTlBSRUZJWH1nY2MKKyAgICBDWFg9JHtCSU5QUkVGSVh9ZysrCisgICAgTEQ9JHtCSU5QUkVGSVh9bGQKKyAgICBBUj0ke0JJTlBSRUZJWH1hcgorICAgIEFTPSR7QklOUFJFRklYfWFzCisgICAgUkFOTElCPSR7QklOUFJFRklYfXJhbmxpYgorICAgIFNUUklQPSR7QklOUFJFRklYfXN0cmlwCisgICAgQ0NfRk9SX1RBUkdFVD0ke0JJTlBSRUZJWH1nY2MKKyAgICBleHBvcnQgQ0MgQ1hYIExEIEFSIEFTIFJBTkxJQiBTVFJJUCBDQ19GT1JfVEFSR0VUCisgICAgUEhBU0U9MgorICAgICRACit9CisKK3Rhc2syX2RlZmluZSBjb3B5X3N5c3Jvb3QgIkZpeCBhbmQgY29weSBzeXNyb290IgordGFzazJfZGVwZW5kczEgY29weV9zeXNyb290IGJ1aWxkX3N5c3Jvb3QKK2NtZF9jb3B5X3N5c3Jvb3QgKCkKK3sKKyAgICBsb2NhbCBTTAorCisgICAgIyBDb3B5IHRoZSBjb250ZW50IG9mICRCVUlMRF9ESVIvbGliIHRvICQoc3lzcm9vdF9kaXIpL3Vzci9saWIKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL2xpYiAkKHN5c3Jvb3RfZGlyKS91c3IvbGliCisgICAgY29weV9kaXJlY3RvcnkgJE9SR19TWVNST09UX0RJUi91c3IvbGliICQoc3lzcm9vdF9kaXIpL3Vzci9saWIKKyAgICBjb3B5X2RpcmVjdG9yeSAkT1JHX1NZU1JPT1RfRElSL3Vzci9pbmNsdWRlICQoc3lzcm9vdF9kaXIpL3Vzci9pbmNsdWRlCisKKyAgICAjIFdlIG5lZWQgdG8gZml4IHRoZSBzeW1saW5rIGxpa2UgbGlicnQuc28gLT4gL2xpYi9saWJydC5zby4xCisgICAgIyBpbiAkKHN5c3Jvb3RfZGlyKS91c3IvbGliLCB0aGV5IHNob3VsZCBwb2ludCB0byBsaWJydC5zby4xIGluc3RlYWQgbm93LgorICAgIFNZTUxJTktTPWBscyAtbCAkKHN5c3Jvb3RfZGlyKS91c3IvbGliIHwgZ3JlcCAvbGliLyB8IGF3ayAneyBwcmludCAkMTA7IH0nYAorICAgIGNkICQoc3lzcm9vdF9kaXIpL3Vzci9saWIKKyAgICBmb3IgU0wgaW4gJFNZTUxJTktTOyBkbworICAgICAgICAjIGNvbnZlcnQgL2xpYi9saWJmb28uc28uPG4+IGludG8gJ2xpYmZvby5zby48bj4nIGZvciB0aGUgdGFyZ2V0CisgICAgICAgIGxvY2FsIERTVD1gZWNobyAkU0wgfCBzZWQgLWUgJ3MhXi9saWIvISFnJ2AKKyAgICAgICAgIyBjb252ZXJ0IGxpYmZvby5zby48bj4gaW50byBsaWJmb28uc28gZm9yIHRoZSBzb3VyY2UKKyAgICAgICAgbG9jYWwgU1JDPWBlY2hvICREU1QgfCBzZWQgLWUgJ3MhXC5bMC05XSokISFnJ2AKKyAgICAgICAgZWNobyAiRml4aW5nIHN5bWxpbmsgJFNSQyAtLT4gJERTVCIKKyAgICAgICAgbG4gLXNmICREU1QgJFNSQworICAgIGRvbmUKKworICAgICMgQWxzbyBkZWFsIHdpdGggYSBmZXcgZGlyZWN0IHN5bWxpbmtzIHRoYXQgZG9uJ3QgdXNlIHRoZSAvbGliLyBwcmVmaXgKKyAgICAjIHdlIHNpbXBseSBjb3B5IHRoZW0uIFVzZWZ1bCBmb3IgbGliR0wuc28gLT4gbGliR0wuc28uMSBmb3IgZXhhbXBsZS4KKyAgICBTWU1MSU5LUz1gbHMgLWwgJChzeXNyb290X2RpcikvdXNyL2xpYiB8IGdyZXAgLXYgL2xpYi8gfCBhd2sgJ3sgcHJpbnQgJDEwOyB9J2AKKyAgICBjZCAkKHN5c3Jvb3RfZGlyKS91c3IvbGliCisgICAgZm9yIFNMIGluICRTWU1MSU5LUzsgZG8KKyAgICAgICAgIyBjb252ZXJ0IC9saWIvbGliZm9vLnNvLjxuPiBpbnRvICdsaWJmb28uc28uPG4+JyBmb3IgdGhlIHRhcmdldAorICAgICAgICBsb2NhbCBEU1Q9YGVjaG8gJFNMYAorICAgICAgICAjIGNvbnZlcnQgbGliZm9vLnNvLjxuPiBpbnRvIGxpYmZvby5zbyBmb3IgdGhlIHNvdXJjZQorICAgICAgICBsb2NhbCBTUkM9YGVjaG8gJERTVCB8IHNlZCAtZSAncyFcLlswLTldKiQhIWcnYAorICAgICAgICBpZiBbICIkRFNUIiAhPSAiJFNSQyIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiQ29weWluZyBzeW1saW5rICRTUkMgLS0+ICREU1QiCisgICAgICAgICAgICBsbiAtc2YgJERTVCAkU1JDCisgICAgICAgIGZpCisgICAgZG9uZQorCisgICAgcGF0Y2hfbGlicmFyeSAkKHN5c3Jvb3RfZGlyKS91c3IvbGliL2xpYmMuc28KKyAgICBwYXRjaF9saWJyYXJ5ICQoc3lzcm9vdF9kaXIpL3Vzci9saWIvbGlicHRocmVhZC5zbworfQorCit0YXNrX2RlZmluZSBwYXRjaF90b29sY2hhaW5fc291cmNlcyAiUGF0Y2ggdG9vbGNoYWluIHNvdXJjZXMuIgordGFza19kZXBlbmRzIHBhdGNoX3Rvb2xjaGFpbl9zb3VyY2VzIGRvd25sb2FkX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfcGF0Y2hfdG9vbGNoYWluX3NvdXJjZXMgKCkKK3sKKyAgICBsb2cgIlBBVENIRVNfRElSID0gJFBBVENIRVNfRElSIgorICAgIGlmIFsgISAtZCAiJFBBVENIRVNfRElSIiBdOyB0aGVuCisgICAgICAgIGxvZyAiJFBBVENIRVNfRElSIGRvZXNuJ3QgZXhpc3QiCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKworICAgIGxvY2FsIFBBVENIRVM9YChjZCAkUEFUQ0hFU19ESVIgJiYgZmluZCAuIC1uYW1lICIqLnBhdGNoIiB8IHNvcnQgKSAyPiAvZGV2L251bGxgCisgICAgaWYgWyAteiAiJFBBVENIRVMiIF0gOyB0aGVuCisgICAgICAgIGxvZyAiTm8gcGF0Y2hlcyBmaWxlcyBpbiAkUEFUQ0hFU19ESVIiCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKyAgICAKKyAgICBQQVRDSEVTPWBlY2hvICRQQVRDSEVTIHwgc2VkIC1lIHMlXlwuLyUlZ2AKKyAgICBmb3IgUEFUQ0ggaW4gJFBBVENIRVM7IGRvCisgICAgICAgIFBBVENIRElSPWBkaXJuYW1lICRQQVRDSGAKKyAgICAgICAgUEFUQ0hOQU1FPWBiYXNlbmFtZSAkUEFUQ0hgCisgICAgICAgIGxvZyAiQXBwbHlpbmcgJFBBVENITkFNRSBpbnRvICRUT09MQ0hBSU5fU1JDX0RJUi8kUEFUQ0hESVIiCisgICAgICAgIChjZCAkVE9PTENIQUlOX1NSQ19ESVIvJFBBVENIRElSICYmIHBhdGNoIC1wMSA8ICRQQVRDSEVTX0RJUi8kUEFUQ0gpCisgICAgICAgIGZhaWxfcGFuaWMgIlBhdGNoIGZhaWx1cmUhISBQbGVhc2UgY2hlY2sgeW91ciBwYXRjaGVzIGRpcmVjdG9yeSEiCisgICAgZG9uZQorCisgICAgbG9nICJEb25lIHBhdGNoaW5nLiIKK30KKwordGFza19kZWZpbmUgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcyAiUHJlcGFyZSB0b29sY2hhaW4gc291cmNlcy4iCitpZiBbIC1uICIkR0lUX0JBU0UiIC1vIC1uICIkR0lUX1JFRkVSRU5DRSIgXTsgdGhlbgorICAgIHRhc2tfZGVwZW5kcyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzIHBhdGNoX3Rvb2xjaGFpbl9zb3VyY2VzCitmaQorY21kX3ByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMgKCkKK3sKKyAgICByZXR1cm4KK30KKwordGFzazJfZGVmaW5lIGNvbmZpZ3VyZV9iaW51dGlscyAiQ29uZmlndXJlIGJpbnV0aWxzLSRCSU5VVElMU19WRVJTSU9OIgordGFzazJfZGVwZW5kczEgY29uZmlndXJlX2JpbnV0aWxzIHByZXBhcmVfdG9vbGNoYWluX3NvdXJjZXMKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9iaW51dGlscyBjb3B5X3N5c3Jvb3QKK2NtZF9jb25maWd1cmVfYmludXRpbHMgKCkKK3sKKyAgICBPVVRfRElSPSQoYnVpbGRfYmludXRpbHNfZGlyKQorICAgIG1rZGlyIC1wICRPVVRfRElSICYmIGNkICRPVVRfRElSICYmCisgICAgJFRPT0xDSEFJTl9TUkNfRElSL2JpbnV0aWxzL2JpbnV0aWxzLSRCSU5VVElMU19WRVJTSU9OL2NvbmZpZ3VyZSBcCisgICAgICAgIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChzeXNyb290X2RpcikgXAorICAgICAgICAtLXRhcmdldD0kR0NDX1RBUkdFVAorfQorCit0YXNrMl9kZWZpbmUgYnVpbGRfYmludXRpbHMgIkJ1aWxkIGJpbnV0aWxzLSRCSU5VVElMU19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgYnVpbGRfYmludXRpbHMgY29uZmlndXJlX2JpbnV0aWxzCitjbWRfYnVpbGRfYmludXRpbHMgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2JpbnV0aWxzX2RpcikgJiYKKyAgICBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX2JpbnV0aWxzICJJbnN0YWxsIGJpbnV0aWxzLSRCSU5VVElMU19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9iaW51dGlscyBidWlsZF9iaW51dGlscworY21kX2luc3RhbGxfYmludXRpbHMgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX2JpbnV0aWxzX2RpcikgJiYKKyAgICBtYWtlIGluc3RhbGwKK30KKwordGFzazJfZGVmaW5lIGV4dHJhY3RfZ21wICJFeHRyYWN0IHNvdXJjZXMgZm9yIGdtcC0kR01QX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBleHRyYWN0X2dtcCBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfZXh0cmFjdF9nbXAgKCkKK3sKKyAgICBPVVRfRElSPSQoYnVpbGRfZ21wX2RpcikKKyAgICBHTVBfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvZ21wL2dtcC0kR01QX1ZFUlNJT04udGFyLmJ6MgorICAgIGlmIFsgISAtZiAiJEdNUF9UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgIEdNUF9UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi90YXJiYWxscy9nbXAtJEdNUF9WRVJTSU9OLnRhci5iejIKKyAgICAgICAgaWYgWyAhIC1mICIkR01QX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBmaW5kIGdtcC0kR01QX1ZFUlNJT04gc291cmNlcyEhIgorICAgICAgICBmaQorICAgIGZpCisgICAgbWtkaXIgLXAgJE9VVF9ESVIgJiYgY2QgJE9VVF9ESVIgJiYKKyAgICB0YXIgeGpmICIkR01QX1RBUkJBTEwiCit9CisKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfZ21wICJDb25maWd1cmUgZ21wLSRHTVBfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9nbXAgZXh0cmFjdF9nbXAgaW5zdGFsbF9iaW51dGlscworY21kX2NvbmZpZ3VyZV9nbXAgKCkKK3sKKyAgICBleHBvcnQgQUJJPSRHTVBfQUJJICYmCisgICAgY2QgJChidWlsZF9nbXBfZGlyKSAmJiBta2RpciAtcCBidWlsZCAmJiBjZCBidWlsZCAmJgorICAgIC4uL2dtcC0kR01QX1ZFUlNJT04vY29uZmlndXJlIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIC0taG9zdD0kR01QX1RBUkdFVCAtLWRpc2FibGUtc2hhcmVkCit9CisKK3Rhc2syX2RlZmluZSBidWlsZF9nbXAgIkJ1aWxkIGdtcC0kR01QX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBidWlsZF9nbXAgY29uZmlndXJlX2dtcAorY21kX2J1aWxkX2dtcCAoKQoreworICAgIGV4cG9ydCBBQkk9JEdNUF9BQkkgJiYKKyAgICBjZCAkKGJ1aWxkX2dtcF9kaXIpL2J1aWxkICYmCisgICAgbWFrZSAkTUFLRV9GTEFHUworfQorCit0YXNrMl9kZWZpbmUgaW5zdGFsbF9nbXAgIkluc3RhbGwgZ21wLSRHTVBfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGluc3RhbGxfZ21wIGJ1aWxkX2dtcAorY21kX2luc3RhbGxfZ21wICgpCit7CisgICAgY2QgJChidWlsZF9nbXBfZGlyKS9idWlsZCAmJgorICAgIG1ha2UgaW5zdGFsbAorfQorCisjIFRoaXJkLCBidWlsZCBtcGZyCit0YXNrMl9kZWZpbmUgZXh0cmFjdF9tcGZyICJFeHRyYWN0IHNvdXJjZXMgZnJvbSBtcGZyLSRNUEZSX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBleHRyYWN0X21wZnIgcHJlcGFyZV90b29sY2hhaW5fc291cmNlcworY21kX2V4dHJhY3RfbXBmciAoKQoreworICAgIE9VVF9ESVI9JChidWlsZF9tcGZyX2RpcikKKyAgICBNUEZSX1RBUkJBTEw9JFRPT0xDSEFJTl9TUkNfRElSL21wZnIvbXBmci0kTVBGUl9WRVJTSU9OLnRhci5iejIKKyAgICBpZiBbICEgLWYgIiRNUEZSX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgTVBGUl9UQVJCQUxMPSRUT09MQ0hBSU5fU1JDX0RJUi90YXJiYWxscy9tcGZyLSRNUEZSX1ZFUlNJT04udGFyLmJ6MgorICAgICAgICBpZiBbICEgLWYgIiRNUEZSX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBmaW5kIG1wZnItJE1QRlJfVkVSU0lPTiBzb3VyY2VzISEiCisgICAgICAgIGZpCisgICAgZmkKKyAgICBta2RpciAtcCAkT1VUX0RJUiAmJiBjZCAkT1VUX0RJUiAmJgorICAgIHRhciB4amYgIiRNUEZSX1RBUkJBTEwiCit9CisKK3Rhc2syX2RlZmluZSBjb25maWd1cmVfbXBmciAiQ29uZmlndXJlIG1wZnItJE1QRlJfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGNvbmZpZ3VyZV9tcGZyIGV4dHJhY3RfbXBmciBpbnN0YWxsX2dtcAorY21kX2NvbmZpZ3VyZV9tcGZyICgpCit7CisgICAgY2QgJChidWlsZF9tcGZyX2RpcikgJiYgbWtkaXIgLXAgYnVpbGQgJiYgY2QgYnVpbGQgJiYKKyAgICBydW4gLi4vbXBmci0kTVBGUl9WRVJTSU9OL2NvbmZpZ3VyZSBcCisgICAgICAgIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS1ob3N0PSRHTVBfVEFSR0VUIFwKKyAgICAgICAgLS13aXRoLWdtcD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1zeXNyb290PSQoc3lzcm9vdF9kaXIpIFwKKyAgICAgICAgLS1kaXNhYmxlLXNoYXJlZAorfQorCit0YXNrMl9kZWZpbmUgYnVpbGRfbXBmciAiQnVpbGQgbXBmci0kTVBGUl9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgYnVpbGRfbXBmciBjb25maWd1cmVfbXBmcgorY21kX2J1aWxkX21wZnIgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX21wZnJfZGlyKS9idWlsZCAmJgorICAgIHJ1biBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX21wZnIgIkluc3RhbGwgbXBmci0kTVBGUl9WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9tcGZyIGJ1aWxkX21wZnIKK2NtZF9pbnN0YWxsX21wZnIgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX21wZnJfZGlyKS9idWlsZCAmJgorICAgIHJ1biBtYWtlIGluc3RhbGwKK30KKwordGFzazJfZGVmaW5lIGV4dHJhY3RfbXBjICJFeHRyYWN0IHNvdXJjZXMgZm9yIG1wYy0kTVBDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMSBleHRyYWN0X21wYyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCitjbWRfZXh0cmFjdF9tcGMgKCkKK3sKKyAgICBPVVRfRElSPSQoYnVpbGRfbXBjX2RpcikKKyAgICBNUENfVEFSQkFMTD0kVE9PTENIQUlOX1NSQ19ESVIvbXBjL21wYy0kTVBDX1ZFUlNJT04udGFyLmd6CisgICAgaWYgWyAhIC1mICIkTVBDX1RBUkJBTEwiIF07IHRoZW4KKyAgICAgICAgTVBDX1RBUkJBTEw9JFRPT0xDSEFJTl9TUkNfRElSL3RhcmJhbGxzL21wYy0kTVBDX1ZFUlNJT04udGFyLmd6CisgICAgICAgIGlmIFsgISAtZiAiJE1QQ19UQVJCQUxMIiBdOyB0aGVuCisgICAgICAgICAgICBwYW5pYyAiQ2FuJ3QgZmluZCBtcGMtJE1QQ19WRVJTSU9OIHNvdXJjZXMhISIKKyAgICAgICAgZmkKKyAgICBmaQorICAgIG1rZGlyIC1wICRPVVRfRElSICYmIGNkICRPVVRfRElSICYmCisgICAgdGFyIHh6ZiAiJE1QQ19UQVJCQUxMIgorfQorCit0YXNrMl9kZWZpbmUgY29uZmlndXJlX21wYyAiQ29uZmlndXJlIG1wYy0kTVBDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfbXBjIGV4dHJhY3RfbXBjIGluc3RhbGxfbXBmcgorY21kX2NvbmZpZ3VyZV9tcGMgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX21wY19kaXIpICYmIG1rZGlyIC1wIGJ1aWxkICYmIGNkIGJ1aWxkICYmCisgICAgcnVuIC4uL21wYy0kTVBDX1ZFUlNJT04vY29uZmlndXJlIFwKKyAgICAgICAgLS1wcmVmaXg9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLWhvc3Q9JEdNUF9UQVJHRVQgXAorICAgICAgICAtLXdpdGgtZ21wPSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLW1wZnI9JChpbnN0YWxsX2RpcikgXAorICAgICAgICAtLXdpdGgtc3lzcm9vdD0kKHN5c3Jvb3RfZGlyKSBcCisgICAgICAgIC0tZGlzYWJsZS1zaGFyZWQKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX21wYyAiQnVpbGQgbXBjLSRNUENfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX21wYyBjb25maWd1cmVfbXBjCitjbWRfYnVpbGRfbXBjICgpCit7CisgICAgY2QgJChidWlsZF9tcGNfZGlyKS9idWlsZCAmJgorICAgIHJ1biBtYWtlICRNQUtFX0ZMQUdTCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX21wYyAiSW5zdGFsbCBtcGMtJE1QQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczIgaW5zdGFsbF9tcGMgYnVpbGRfbXBjCitjbWRfaW5zdGFsbF9tcGMgKCkKK3sKKyAgICBjZCAkKGJ1aWxkX21wY19kaXIpL2J1aWxkICYmCisgICAgcnVuIG1ha2UgaW5zdGFsbAorfQorCisjIEZvdXJ0aCwgdGhlIGNvbXBpbGVyIGl0c2VsZgordGFzazJfZGVmaW5lIGNvbmZpZ3VyZV9nY2MgIkNvbmZpZ3VyZSBnY2MtJEdDQ19WRVJTSU9OIgordGFzazJfZGVwZW5kczEgY29uZmlndXJlX2djYyBwcmVwYXJlX3Rvb2xjaGFpbl9zb3VyY2VzCit0YXNrMl9kZXBlbmRzMiBjb25maWd1cmVfZ2NjIGluc3RhbGxfYmludXRpbHMgaW5zdGFsbF9nbXAgaW5zdGFsbF9tcGZyIGluc3RhbGxfbXBjCitjbWRfY29uZmlndXJlX2djYyAoKQoreworICAgIE9VVF9ESVI9JChidWlsZF9nY2NfZGlyKQorICAgIG1rZGlyIC1wICRPVVRfRElSICYmIGNkICRPVVRfRElSICYmCisgICAgZXhwb3J0IFBBVEg9JChpbnN0YWxsX2RpcikvYmluOiRPTERfUEFUSCAmJgorICAgIGV4cG9ydCBDQz0kSE9TVF9DQyAmJgorICAgIGV4cG9ydCBDQ19GT1JfVEFSR0VUPSIkSE9TVF9DQyIgJiYKKyAgICBleHBvcnQgTERfTElCUkFSWV9QQVRIPSQoaW5zdGFsbF9kaXIpL2xpYjokT0xEX0xEX0xJQlJBUllfUEFUSCAmJgorICAgIGV4cG9ydCBMREZMQUdTPSItTCQoaW5zdGFsbF9kaXIpL2xpYiIgJiYKKyAgICBydW4gJFRPT0xDSEFJTl9TUkNfRElSL2djYy9nY2MtJEdDQ19WRVJTSU9OL2NvbmZpZ3VyZSBcCisgICAgICAgIC0tcHJlZml4PSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLXN5c3Jvb3Q9JChzeXNyb290X2RpcikgXAorICAgICAgICAtLWRpc2FibGUtbmxzIFwKKyAgICAgICAgLS13aXRoLWdtcD0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0td2l0aC1tcGZyPSQoaW5zdGFsbF9kaXIpIFwKKyAgICAgICAgLS13aXRoLW1wYz0kKGluc3RhbGxfZGlyKSBcCisgICAgICAgIC0tdGFyZ2V0PSRHQ0NfVEFSR0VUIFwKKyAgICAgICAgLS1kaXNhYmxlLXBsdWdpbiBcCisgICAgICAgIC0tZGlzYWJsZS1kb2NzIFwKKyAgICAgICAgLS1kaXNhYmxlLW11bHRpbGliIFwKKyAgICAgICAgLS1kaXNhYmxlLWJvb3RzdHJhcCBcCisgICAgICAgIC0tZGlzYWJsZS1saWJnb21wIFwKKyAgICAgICAgLS1kaXNhYmxlLWxpYm11ZGZsYXAgXAorICAgICAgICAtLWRpc2FibGUtbGlicXVhZG1hdGggXAorICAgICAgICAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UgXAorICAgICAgICAtLWVuYWJsZS1nb2xkPWRlZmF1bHQgXAorICAgICAgICAtLWVuYWJsZS1sYW5ndWFnZXM9YyxjKysKK30KKwordGFzazJfZGVmaW5lIGJ1aWxkX2djYyAiQnVpbGQgZ2NjLSRHQ0NfVkVSU0lPTiIKK3Rhc2syX2RlcGVuZHMyIGJ1aWxkX2djYyBjb25maWd1cmVfZ2NjCitjbWRfYnVpbGRfZ2NjICgpCit7CisgICAgZXhwb3J0IFBBVEg9JChpbnN0YWxsX2RpcikvYmluOiRPTERfUEFUSCAmJgorICAgIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg9JChpbnN0YWxsX2RpcikvbGliOiRPTERfTERfTElCUkFSWV9QQVRIICYmCisgICAgY2QgJChidWlsZF9nY2NfZGlyKSAmJgorICAgIG1ha2UgJE1BS0VfRkxBR1MKK30KKwordGFzazJfZGVmaW5lIGluc3RhbGxfZ2NjICJJbnN0YWxsIGdjYy0kR0NDX1ZFUlNJT04iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX2djYyBidWlsZF9nY2MKK2NtZF9pbnN0YWxsX2djYyAoKQoreworICAgIGV4cG9ydCBQQVRIPSQoaW5zdGFsbF9kaXIpL2JpbjokT0xEX1BBVEggJiYKKyAgICBleHBvcnQgTERfTElCUkFSWV9QQVRIPSQoaW5zdGFsbF9kaXIpL2xpYjokT0xEX0xEX0xJQlJBUllfUEFUSCAmJgorICAgIGNkICQoYnVpbGRfZ2NjX2RpcikgJiYKKyAgICBtYWtlIGluc3RhbGwKK30KKwordGFzazJfZGVmaW5lIGNsZWFudXBfdG9vbGNoYWluICJDbGVhbnVwIHRvb2xjaGFpbiIKK3Rhc2syX2RlcGVuZHMyIGNsZWFudXBfdG9vbGNoYWluIGluc3RhbGxfZ2NjCitjbWRfY2xlYW51cF90b29sY2hhaW4gKCkKK3sKKyAgICAjIFJlbW92ZSB1bi1uZWVkZWQgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCisgICAgcm0gLXJmICQoaW5zdGFsbF9kaXIpL3NoYXJlCisgICAgcm0gLXJmICQoaW5zdGFsbF9kaXIpL21hbgorICAgIHJtIC1yZiAkKGluc3RhbGxfZGlyKS9pbmZvCisgICAgcm0gLXJmICQoaW5zdGFsbF9kaXIpL2xpYjMyCisgICAgcm0gLXJmICQoaW5zdGFsbF9kaXIpL2xpYjY0CisgICAgcm0gLXJmICQoaW5zdGFsbF9kaXIpL2xpYmV4ZWMvKi8qL2luc3RhbGwtdG9vbHMKKyAgICAjcm0gLXJmICQoaW5zdGFsbF9kaXIpLyRHQ0NfVEFSR0VUL2JpbgorCisgICAgKHN0cmlwICQoaW5zdGFsbF9kaXIpL2Jpbi8qKQorICAgIChzdHJpcCAkKGluc3RhbGxfZGlyKS9saWJleGVjL2djYy8kR0NDX1RBUkdFVC8qLyopCisgICAgdHJ1ZQorfQorCit0YXNrMl9kZWZpbmUgcGFja2FnZV90b29sY2hhaW4gIlBhY2thZ2UgZmluYWwgdG9vbGNoYWluIgordGFzazJfZGVwZW5kczIgcGFja2FnZV90b29sY2hhaW4gY2xlYW51cF90b29sY2hhaW4KK2NtZF9wYWNrYWdlX3Rvb2xjaGFpbiAoKQoreworICAgICMgQ29weSB0aGlzIHNjcmlwdCB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKKyAgICBjcCAtZiAkMCAkKGluc3RhbGxfZGlyKQorICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjb3B5IGJ1aWxkIHNjcmlwdCB0byBpbnN0YWxsIGRpcmVjdG9yeSIKKworICAgIGlmIFsgLWQgIiRQQVRDSEVTX0RJUiIgXTsgdGhlbgorICAgICAgICAjIENvcHkgcGF0Y2hlcyB0byB0aGUgaW5zdGFsbCBkaXJlY3RvcnkKKyAgICAgICAgY3AgLXJmICIkUEFUQ0hFU19ESVIiICQoaW5zdGFsbF9kaXIpCisgICAgICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjb3B5IHBhdGNoIGRpcmVjdG9yeSB0byBpbnN0YWxsIGRpcmVjdG9yeSIKKyAgICBmaQorCisgICAgIyBDb3B5IHRoZSBTT1VSQ0VTIGZpbGUgYXMgd2VsbAorICAgIGNwICRET1dOTE9BRF9ESVIvU09VUkNFUyAkKGluc3RhbGxfZGlyKS9QQUNLQUdFX1NPVVJDRVMgJiYKKyAgICBjcCAkVE9PTENIQUlOX1NSQ19ESVIvU09VUkNFUyAkKGluc3RhbGxfZGlyKS9UT09MQ0hBSU5fU09VUkNFUworICAgIGZhaWxfcGFuaWMgIkNvdWxkIG5vdCBjb3B5IFNPVVJDRVMgZmlsZXMgdG8gaW5zdGFsbCBkaXJlY3RvcnkiCisKKyAgICAjIFBhY2thZ2UgZXZlcnl0aGluZworICAgIHBhY2tfYXJjaGl2ZSAkVE9PTENIQUlOX0FSQ0hJVkUgImBkaXJuYW1lICQoaW5zdGFsbF9kaXIpYCIgImBiYXNlbmFtZSAkKGluc3RhbGxfZGlyKWAiCit9CisKK3Rhc2syX2RlZmluZSBpbnN0YWxsX3Rvb2xjaGFpbiAiSW5zdGFsbCBmaW5hbCB0b29sY2hhaW4iCit0YXNrMl9kZXBlbmRzMiBpbnN0YWxsX3Rvb2xjaGFpbiBjbGVhbnVwX3Rvb2xjaGFpbgorY21kX2luc3RhbGxfdG9vbGNoYWluICgpCit7CisgICAgY29weV9kaXJlY3RvcnkgIiQoaW5zdGFsbF9kaXIpIiAiJFBSRUZJWF9ESVIvJFRPT0xDSEFJTl9OQU1FIgorICAgIGNwIC1mICQwICIkUFJFRklYX0RJUi8kVE9PTENIQUlOX05BTUUvIgorfQorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWNvbmQgdG9vbGNoYWluIGRlcGVuZHMgb24gdGhlIGZpcnN0IG9uZQordGFza19kZXBlbmRzIGNvbmZpZ3VyZV9iaW51dGlsc18yIGluc3RhbGxfZ2NjXzEKKworaWYgWyAiJE9OTFlfU1lTUk9PVCIgPSAieWVzIiBdOyB0aGVuCisgICAgTUFJTl9UQVNLPWNvcHlfc3lzcm9vdAorICAgIENPTVBMRVRJT05fVEVYVD0iRG9uZSwgc2VlIHN5c3Jvb3QgZmlsZXMgaW4gJChzeXNyb290X2RpcikiCitlbGlmIFsgLW4gIiRQUkVGSVhfRElSIiBdOyB0aGVuCisgICAgaWYgWyAteiAiJEJPT1RTVFJBUCIgXTsgdGhlbgorICAgICAgICBNQUlOX1RBU0s9aW5zdGFsbF90b29sY2hhaW5fMQorICAgIGVsc2UKKyAgICAgICAgTUFJTl9UQVNLPWluc3RhbGxfdG9vbGNoYWluXzIKKyAgICBmaQorICAgIENPTVBMRVRJT05fVEVYVD0iRG9uZSwgc2VlICRQUkVGSVhfRElSLyRUT09MQ0hBSU5fTkFNRSIKK2Vsc2UKKyAgICBpZiBbIC16ICIkQk9PVFNUUkFQIiBdOyB0aGVuCisgICAgICAgIE1BSU5fVEFTSz1wYWNrYWdlX3Rvb2xjaGFpbl8xCisgICAgZWxzZQorICAgICAgICBNQUlOX1RBU0s9cGFja2FnZV90b29sY2hhaW5fMgorICAgIGZpCisgICAgQ09NUExFVElPTl9URVhUPSJEb25lLCBzZWUgJFRPT0xDSEFJTl9BUkNISVZFIgorZmkKKworaWYgWyAiJExJU1RfVEFTS1MiIF07IHRoZW4KKyAgICB0YXNrX2R1bXAKK2Vsc2UKKyAgICBydW5fdGFzayAkTUFJTl9UQVNLCisgICAgZWNobyAiJENPTVBMRVRJT05fVEVYVCIKK2ZpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dtcC5oIGIvaW5jbHVkZS9nbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI5MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9nbXAuaApAQCAtMCwwICsxLDIxODMgQEAKKy8qIERlZmluaXRpb25zIGZvciBHTlUgbXVsdGlwbGUgcHJlY2lzaW9uIGZ1bmN0aW9ucy4gICAtKi0gbW9kZTogYyAtKi0KKworQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsCisyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIE1QIExpYnJhcnkuCisKK1RoZSBHTlUgTVAgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLworCisjaWZuZGVmIF9fR01QX0hfXworCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjaW5jbHVkZSA8aW9zZndkPiAgIC8qIGZvciBzdGQ6OmlzdHJlYW0sIHN0ZDo6b3N0cmVhbSwgc3RkOjpzdHJpbmcgKi8KKyNpbmNsdWRlIDxjc3RkaW8+CisjZW5kaWYKKworCisvKiBJbnN0YW50aWF0ZWQgYnkgY29uZmlndXJlLiAqLworI2lmICEgZGVmaW5lZCAoX19HTVBfV0lUSElOX0NPTkZJR1VSRSkKKyNkZWZpbmUgX19HTVBfQklUU19QRVJfTVBfTElNQiAgICAgICAgICAgICA2NAorI2RlZmluZSBfX0dNUF9IQVZFX0hPU1RfQ1BVX0ZBTUlMWV9wb3dlciAgIDAKKyNkZWZpbmUgX19HTVBfSEFWRV9IT1NUX0NQVV9GQU1JTFlfcG93ZXJwYyAwCisjZGVmaW5lIEdNUF9MSU1CX0JJVFMgICAgICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgR01QX05BSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgR01QX05VTUJfQklUUyAgICAgKEdNUF9MSU1CX0JJVFMgLSBHTVBfTkFJTF9CSVRTKQorI2RlZmluZSBHTVBfTlVNQl9NQVNLICAgICAoKH4gX19HTVBfQ0FTVCAobXBfbGltYl90LCAwKSkgPj4gR01QX05BSUxfQklUUykKKyNkZWZpbmUgR01QX05VTUJfTUFYICAgICAgR01QX05VTUJfTUFTSworI2RlZmluZSBHTVBfTkFJTF9NQVNLICAgICAofiBHTVBfTlVNQl9NQVNLKQorCisKKy8qIFRoZSBmb2xsb3dpbmcgKGV2ZXJ5dGhpbmcgdW5kZXIgaWZuZGVmIF9fR05VX01QX18pIG11c3QgYmUgaWRlbnRpY2FsIGluCisgICBnbXAuaCBhbmQgbXAuaCB0byBhbGxvdyBib3RoIHRvIGJlIGluY2x1ZGVkIGluIGFuIGFwcGxpY2F0aW9uIG9yIGR1cmluZworICAgdGhlIGxpYnJhcnkgYnVpbGQuICAqLworI2lmbmRlZiBfX0dOVV9NUF9fCisjZGVmaW5lIF9fR05VX01QX18gNAorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QgIC8qIHRlbGwgZ2NjIHN0ZGRlZi5oIHdlIG9ubHkgd2FudCBzaXplX3QgKi8KKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyNpbmNsdWRlIDxjc3RkZGVmPiAgICAgLyogZm9yIHNpemVfdCAqLworI2Vsc2UKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgLyogZm9yIHNpemVfdCAqLworI2VuZGlmCisjdW5kZWYgX19uZWVkX3NpemVfdAorCisvKiBJbnN0YW50aWF0ZWQgYnkgY29uZmlndXJlLiAqLworI2lmICEgZGVmaW5lZCAoX19HTVBfV0lUSElOX0NPTkZJR1VSRSkKKy8qICN1bmRlZiBfTE9OR19MT05HX0xJTUIgKi8KKyNkZWZpbmUgX19HTVBfTElCR01QX0RMTCAgMAorI2VuZGlmCisKKworLyogX19TVERDX18gLSBzb21lIEFOU0kgY29tcGlsZXJzIGRlZmluZSB0aGlzIG9ubHkgdG8gMCwgaGVuY2UgdGhlIHVzZSBvZgorICAgICAgICJkZWZpbmVkIiBhbmQgbm90ICJfX1NURENfXy0wIi4gIEluIHBhcnRpY3VsYXIgU3VuIHdvcmtzaG9wIEMgNS4wCisgICAgICAgc2V0cyBfX1NURENfXyB0byAwLCBidXQgcmVxdWlyZXMgIiMjIiBmb3IgdG9rZW4gcGFzdGluZy4KKworICAgX0FJWCAtIGdudSBhbnNpZGVjbC5oIGFzc2VydHMgdGhhdCBhbGwga25vd24gQUlYIGNvbXBpbGVycyBhcmUgQU5TSSBidXQKKyAgICAgICBkb24ndCBhbHdheXMgZGVmaW5lIF9fU1REQ19fLgorCisgICBfX0RFQ0MgLSBjdXJyZW50IHZlcnNpb25zIG9mIERFQyBDICg1LjkgZm9yIGluc3RhbmNlKSBmb3IgYWxwaGEgYXJlIEFOU0ksCisgICAgICAgYnV0IGRvbid0IGRlZmluZSBfX1NURENfXyBpbiB0aGVpciBkZWZhdWx0IG1vZGUuICBEb24ndCBrbm93IGlmIG9sZAorICAgICAgIHZlcnNpb25zIG1pZ2h0IGhhdmUgYmVlbiBLJlIsIGJ1dCBsZXQncyBub3Qgd29ycnkgYWJvdXQgdGhhdCB1bmxlc3MKKyAgICAgICBzb21lb25lIGlzIHN0aWxsIHVzaW5nIG9uZS4KKworICAgX21pcHMgLSBnbnUgYW5zaWRlY2wuaCBzYXlzIHRoZSBSSVNDL09TIE1JUFMgY29tcGlsZXIgaXMgQU5TSSBpbiBTVlI0CisgICAgICAgbW9kZSwgYnV0IGRvZXNuJ3QgZGVmaW5lIF9fU1REQ19fLgorCisgICBfTVNDX1ZFUiAtIE1pY3Jvc29mdCBDIGlzIEFOU0ksIGJ1dCBfX1NURENfXyBpcyB1bmRlZmluZWQgdW5sZXNzIHRoZSAvWmEKKyAgICAgICBvcHRpb24gaXMgZ2l2ZW4gKGluIHdoaWNoIGNhc2UgaXQncyAxKS4KKworICAgX1dJTjMyIC0gdGVzdGVkIGZvciBieSBnbnUgYW5zaWRlY2wuaCwgbm8gZG91YnQgb24gdGhlIGFzc3VtcHRpb24gdGhhdAorICAgICAgYWxsIHczMiBjb21waWxlcnMgYXJlIGFuc2kuCisKKyAgIE5vdGU6IFRoaXMgc2FtZSBzZXQgb2YgdGVzdHMgaXMgdXNlZCBieSBnZW4tcHNxci5jIGFuZAorICAgZGVtb3MvZXhwci9leHByLWltcGwuaCwgc28gaWYgYW55dGhpbmcgbmVlZHMgYWRkaW5nLCB0aGVuIGJlIHN1cmUgdG8KKyAgIHVwZGF0ZSB0aG9zZSB0b28uICAqLworCisjaWYgIGRlZmluZWQgKF9fU1REQ19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfQUlYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fREVDQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgKGRlZmluZWQgKF9fbWlwcykgJiYgZGVmaW5lZCAoX1NZU1RZUEVfU1ZSNCkpICAgICAgXAorICB8fCBkZWZpbmVkIChfTVNDX1ZFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9XSU4zMikKKyNkZWZpbmUgX19HTVBfSEFWRV9DT05TVCAgICAgICAgMQorI2RlZmluZSBfX0dNUF9IQVZFX1BST1RPVFlQRVMgICAxCisjZGVmaW5lIF9fR01QX0hBVkVfVE9LRU5fUEFTVEUgIDEKKyNlbHNlCisjZGVmaW5lIF9fR01QX0hBVkVfQ09OU1QgICAgICAgIDAKKyNkZWZpbmUgX19HTVBfSEFWRV9QUk9UT1RZUEVTICAgMAorI2RlZmluZSBfX0dNUF9IQVZFX1RPS0VOX1BBU1RFICAwCisjZW5kaWYKKworCisjaWYgX19HTVBfSEFWRV9DT05TVAorI2RlZmluZSBfX2dtcF9jb25zdCAgIGNvbnN0CisjZGVmaW5lIF9fZ21wX3NpZ25lZCAgc2lnbmVkCisjZWxzZQorI2RlZmluZSBfX2dtcF9jb25zdAorI2RlZmluZSBfX2dtcF9zaWduZWQKKyNlbmRpZgorCisKKy8qIF9fR01QX0RFQ0xTUEVDIHN1cHBvcnRzIFdpbmRvd3MgRExMIHZlcnNpb25zIG9mIGxpYmdtcCwgYW5kIGlzIGVtcHR5IGluCisgICBhbGwgb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworICAgV2hlbiBjb21waWxpbmcgb2JqZWN0cyBmb3IgbGliZ21wLCBfX0dNUF9ERUNMU1BFQyBpcyBhbiBleHBvcnQgZGlyZWN0aXZlLAorICAgb3Igd2hlbiBjb21waWxpbmcgZm9yIGFuIGFwcGxpY2F0aW9uIGl0J3MgYW4gaW1wb3J0IGRpcmVjdGl2ZS4gIFRoZSB0d28KKyAgIGNhc2VzIGFyZSBkaWZmZXJlbnRpYXRlZCBieSBfX0dNUF9XSVRISU5fR01QIGRlZmluZWQgYnkgdGhlIEdNUCBNYWtlZmlsZXMKKyAgIChhbmQgbm90IGRlZmluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbikuCisKKyAgIF9fR01QX0RFQ0xTUEVDX1hYIGlzIHNpbWlsYXJseSB1c2VkIGZvciBsaWJnbXB4eC4gIF9fR01QX1dJVEhJTl9HTVBYWAorICAgaW5kaWNhdGVzIHdoZW4gYnVpbGRpbmcgbGliZ21weHgsIGFuZCBpbiB0aGF0IGNhc2UgbGliZ21weHggZnVuY3Rpb25zIGFyZQorICAgZXhwb3J0cywgYnV0IGxpYmdtcCBmdW5jdGlvbnMgd2hpY2ggbWlnaHQgZ2V0IGNhbGxlZCBhcmUgaW1wb3J0cy4KKworICAgbGlibXAubGEgdXNlcyBfX0dNUF9ERUNMU1BFQywganVzdCBhcyBpZiBpdCB3ZXJlIGxpYmdtcC5sYS4gIGxpYmdtcCBhbmQKKyAgIGxpYm1wIGRvbid0IGNhbGwgZWFjaCBvdGhlciwgc28gdGhlcmUncyBubyBjb25mbGljdCBvciBjb25mdXNpb24uCisKKyAgIExpYnRvb2wgRExMX0VYUE9SVCBkZWZpbmUgaXMgbm90IHVzZWQuCisKKyAgIFRoZXJlJ3Mgbm8gYXR0ZW1wdCB0byBzdXBwb3J0IEdNUCBidWlsdCBib3RoIHN0YXRpYyBhbmQgRExMLiAgRG9pbmcgc28KKyAgIHdvdWxkIG1lYW4gYXBwbGljYXRpb25zIHdvdWxkIGhhdmUgdG8gdGVsbCB1cyB3aGljaCBvZiB0aGUgdHdvIGlzIGdvaW5nCisgICB0byBiZSB1c2VkIHdoZW4gbGlua2luZywgYW5kIHRoYXQgc2VlbXMgdmVyeSB0ZWRpb3VzIGFuZCBlcnJvciBwcm9uZSBpZgorICAgdXNpbmcgR01QIGJ5IGhhbmQsIGFuZCBlcXVhbGx5IHRlZGlvdXMgZnJvbSBhIHBhY2thZ2Ugc2luY2UgYXV0b2NvbmYgYW5kCisgICBhdXRvbWFrZSBkb24ndCBnaXZlIG11Y2ggaGVscC4KKworICAgX19HTVBfREVDTFNQRUMgaXMgcmVxdWlyZWQgb24gYWxsIGRvY3VtZW50ZWQgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKKyAgIHZhcmlhYmxlcywgdGhlIHZhcmlvdXMgaW50ZXJuYWxzIGluIGdtcC1pbXBsLmggZXRjIGNhbiBiZSBsZWZ0IHVuYWRvcm5lZC4KKyAgIEJ1dCBpbnRlcm5hbHMgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyBvciBzcGVlZCBtZWFzdXJpbmcgcHJvZ3JhbXMKKyAgIHNob3VsZCBoYXZlIF9fR01QX0RFQ0xTUEVDLCBhbmQgY2VydGFpbmx5IGNvbnN0YW50cyBvciB2YXJpYWJsZXMgbXVzdAorICAgaGF2ZSBpdCBvciB0aGUgd3JvbmcgYWRkcmVzcyB3aWxsIGJlIHJlc29sdmVkLgorCisgICBJbiBnY2MgX19kZWNsc3BlYyBjYW4gZ28gYXQgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgb2YgYSBwcm90b3R5cGUuCisKKyAgIEluIE1pY3Jvc29mdCBDIF9fZGVjbHNwZWMgbXVzdCBnbyBhdCB0aGUgc3RhcnQsIG9yIGFmdGVyIHRoZSB0eXBlIGxpa2UKKyAgIHZvaWQgX19kZWNsc3BlYyguLi4pICpmb28oKSIuICBUaGVyZSdzIG5vIF9fZGxsZXhwb3J0IG9yIGFueXRoaW5nIHRvCisgICBndWFyZCBhZ2FpbnN0IHNvbWVvbmUgZm9vbGlzaCAjZGVmaW5pbmcgZGxsZXhwb3J0LiAgX2V4cG9ydCB1c2VkIHRvIGJlCisgICBhdmFpbGFibGUsIGJ1dCBubyBsb25nZXIuCisKKyAgIEluIEJvcmxhbmQgQyBfZXhwb3J0IHN0aWxsIGV4aXN0cywgYnV0IG5lZWRzIHRvIGdvIGFmdGVyIHRoZSB0eXBlLCBsaWtlCisgICAidm9pZCBfZXhwb3J0IGZvbygpOyIuICBXb3VsZCBoYXZlIHRvIGNoYW5nZSB0aGUgX19HTVBfREVDTFNQRUMgc3ludGF4IHRvCisgICBtYWtlIHVzZSBvZiB0aGF0LiAgUHJvYmFibHkgbW9yZSB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gICovCisKKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfX2RlY2xzcGVjKF9fZGxsZXhwb3J0X18pCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgX19kZWNsc3BlYyhfX2RsbGltcG9ydF9fKQorI2VuZGlmCisjaWYgZGVmaW5lZCAoX01TQ19WRVIpIHx8IGRlZmluZWQgKF9fQk9STEFORENfXykKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfSU1QT1JUICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNlbmRpZgorI2lmZGVmIF9fV0FUQ09NQ19fCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0VYUE9SVCAgX19leHBvcnQKKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfSU1QT1JUICBfX2ltcG9ydAorI2VuZGlmCisjaWZkZWYgX19JQk1DX18KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfRVhQT1JUICBfRXhwb3J0CisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX0lNUE9SVCAgX0ltcG9ydAorI2VuZGlmCisKKyNpZiBfX0dNUF9MSUJHTVBfRExMCisjaWYgX19HTVBfV0lUSElOX0dNUAorLyogY29tcGlsaW5nIHRvIGdvIGludG8gYSBETEwgbGliZ21wICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDICBfX0dNUF9ERUNMU1BFQ19FWFBPUlQKKyNlbHNlCisvKiBjb21waWxpbmcgdG8gZ28gaW50byBhbiBhcHBsaWNhdGlvbiB3aGljaCB3aWxsIGxpbmsgdG8gYSBETEwgbGliZ21wICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDICBfX0dNUF9ERUNMU1BFQ19JTVBPUlQKKyNlbmRpZgorI2Vsc2UKKy8qIGFsbCBvdGhlciBjYXNlcyAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQworI2VuZGlmCisKKworI2lmZGVmIF9fR01QX1NIT1JUX0xJTUIKK3R5cGVkZWYgdW5zaWduZWQgaW50CQltcF9saW1iX3Q7Cit0eXBlZGVmIGludAkJCW1wX2xpbWJfc2lnbmVkX3Q7CisjZWxzZQorI2lmZGVmIF9MT05HX0xPTkdfTElNQgordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CW1wX2xpbWJfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludAkJbXBfbGltYl9zaWduZWRfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50CW1wX2xpbWJfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCW1wX2xpbWJfc2lnbmVkX3Q7CisjZW5kaWYKKyNlbmRpZgorCisvKiBGb3IgcmVmZXJlbmNlLCBub3RlIHRoYXQgdGhlIG5hbWUgX19tcHpfc3RydWN0IGdldHMgaW50byBDKysgbWFuZ2xlZAorICAgZnVuY3Rpb24gbmFtZXMsIHdoaWNoIG1lYW5zIGFsdGhvdWdoIHRoZSAiX18iIHN1Z2dlc3RzIGFuIGludGVybmFsLCB3ZQorICAgbXVzdCBsZWF2ZSB0aGlzIG5hbWUgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfbXBfYWxsb2M7CQkvKiBOdW1iZXIgb2YgKmxpbWJzKiBhbGxvY2F0ZWQgYW5kIHBvaW50ZWQKKwkJCQkgICB0byBieSB0aGUgX21wX2QgZmllbGQuICAqLworICBpbnQgX21wX3NpemU7CQkJLyogYWJzKF9tcF9zaXplKSBpcyB0aGUgbnVtYmVyIG9mIGxpbWJzIHRoZQorCQkJCSAgIGxhc3QgZmllbGQgcG9pbnRzIHRvLiAgSWYgX21wX3NpemUgaXMKKwkJCQkgICBuZWdhdGl2ZSB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiAgKi8KKyAgbXBfbGltYl90ICpfbXBfZDsJCS8qIFBvaW50ZXIgdG8gdGhlIGxpbWJzLiAgKi8KK30gX19tcHpfc3RydWN0OworCisjZW5kaWYgLyogX19HTlVfTVBfXyAqLworCisKK3R5cGVkZWYgX19tcHpfc3RydWN0IE1QX0lOVDsgICAgLyogZ21wIDEgc291cmNlIGNvbXBhdGliaWxpdHkgKi8KK3R5cGVkZWYgX19tcHpfc3RydWN0IG1wel90WzFdOworCit0eXBlZGVmIG1wX2xpbWJfdCAqCQltcF9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IG1wX2xpbWJfdCAqCW1wX3NyY3B0cjsKKyNpZiBkZWZpbmVkIChfQ1JBWSkgJiYgISBkZWZpbmVkIChfQ1JBWU1QUCkKKy8qIHBsYWluIGBpbnQnIGlzIG11Y2ggZmFzdGVyICg0OCBiaXRzKSAqLworI2RlZmluZSBfX0dNUF9NUF9TSVpFX1RfSU5UICAgICAxCit0eXBlZGVmIGludAkJCW1wX3NpemVfdDsKK3R5cGVkZWYgaW50CQkJbXBfZXhwX3Q7CisjZWxzZQorI2RlZmluZSBfX0dNUF9NUF9TSVpFX1RfSU5UICAgICAwCit0eXBlZGVmIGxvbmcgaW50CQltcF9zaXplX3Q7Cit0eXBlZGVmIGxvbmcgaW50CQltcF9leHBfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICBfX21wel9zdHJ1Y3QgX21wX251bTsKKyAgX19tcHpfc3RydWN0IF9tcF9kZW47Cit9IF9fbXBxX3N0cnVjdDsKKwordHlwZWRlZiBfX21wcV9zdHJ1Y3QgTVBfUkFUOyAgICAvKiBnbXAgMSBzb3VyY2UgY29tcGF0aWJpbGl0eSAqLwordHlwZWRlZiBfX21wcV9zdHJ1Y3QgbXBxX3RbMV07CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBfbXBfcHJlYzsJCQkvKiBNYXggcHJlY2lzaW9uLCBpbiBudW1iZXIgb2YgYG1wX2xpbWJfdCdzLgorCQkJCSAgIFNldCBieSBtcGZfaW5pdCBhbmQgbW9kaWZpZWQgYnkKKwkJCQkgICBtcGZfc2V0X3ByZWMuICBUaGUgYXJlYSBwb2ludGVkIHRvIGJ5IHRoZQorCQkJCSAgIF9tcF9kIGZpZWxkIGNvbnRhaW5zIGBwcmVjJyArIDEgbGltYnMuICAqLworICBpbnQgX21wX3NpemU7CQkJLyogYWJzKF9tcF9zaXplKSBpcyB0aGUgbnVtYmVyIG9mIGxpbWJzIHRoZQorCQkJCSAgIGxhc3QgZmllbGQgcG9pbnRzIHRvLiAgSWYgX21wX3NpemUgaXMKKwkJCQkgICBuZWdhdGl2ZSB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiAgKi8KKyAgbXBfZXhwX3QgX21wX2V4cDsJCS8qIEV4cG9uZW50LCBpbiB0aGUgYmFzZSBvZiBgbXBfbGltYl90Jy4gICovCisgIG1wX2xpbWJfdCAqX21wX2Q7CQkvKiBQb2ludGVyIHRvIHRoZSBsaW1icy4gICovCit9IF9fbXBmX3N0cnVjdDsKKworLyogdHlwZWRlZiBfX21wZl9zdHJ1Y3QgTVBfRkxPQVQ7ICovCit0eXBlZGVmIF9fbXBmX3N0cnVjdCBtcGZfdFsxXTsKKworLyogQXZhaWxhYmxlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBhbGdvcml0aG1zLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBHTVBfUkFORF9BTEdfREVGQVVMVCA9IDAsCisgIEdNUF9SQU5EX0FMR19MQyA9IEdNUF9SQU5EX0FMR19ERUZBVUxUIC8qIExpbmVhciBjb25ncnVlbnRpYWwuICAqLworfSBnbXBfcmFuZGFsZ190OworCisvKiBSYW5kb20gc3RhdGUgc3RydWN0LiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIG1wel90IF9tcF9zZWVkOwkgIC8qIF9tcF9kIG1lbWJlciBwb2ludHMgdG8gc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gKi8KKyAgZ21wX3JhbmRhbGdfdCBfbXBfYWxnOyAgLyogQ3VycmVudGx5IHVudXNlZC4gKi8KKyAgdW5pb24geworICAgIHZvaWQgKl9tcF9sYzsgICAgICAgICAvKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHBvaW50ZXJzIHN0cnVjdHVyZS4gICovCisgIH0gX21wX2FsZ2RhdGE7Cit9IF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3Q7Cit0eXBlZGVmIF9fZ21wX3JhbmRzdGF0ZV9zdHJ1Y3QgZ21wX3JhbmRzdGF0ZV90WzFdOworCisvKiBUeXBlcyBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGluIGdtcCBmaWxlcy4gICovCisvKiA/Pz8gU2hvdWxkIG5vdCBwb2xsdXRlIHVzZXIgbmFtZSBzcGFjZSB3aXRoIHRoZXNlID8/PyAqLwordHlwZWRlZiBfX2dtcF9jb25zdCBfX21wel9zdHJ1Y3QgKm1wel9zcmNwdHI7Cit0eXBlZGVmIF9fbXB6X3N0cnVjdCAqbXB6X3B0cjsKK3R5cGVkZWYgX19nbXBfY29uc3QgX19tcGZfc3RydWN0ICptcGZfc3JjcHRyOwordHlwZWRlZiBfX21wZl9zdHJ1Y3QgKm1wZl9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IF9fbXBxX3N0cnVjdCAqbXBxX3NyY3B0cjsKK3R5cGVkZWYgX19tcHFfc3RydWN0ICptcHFfcHRyOworCisKKy8qIFRoaXMgaXMgbm90IHdhbnRlZCBpbiBtcC5oLCBzbyBwdXQgaXQgb3V0c2lkZSB0aGUgX19HTlVfTVBfXyBjb21tb24KKyAgIHNlY3Rpb24uICovCisjaWYgX19HTVBfTElCR01QX0RMTAorI2lmIF9fR01QX1dJVEhJTl9HTVBYWAorLyogY29tcGlsaW5nIHRvIGdvIGludG8gYSBETEwgbGliZ21weHggKi8KKyNkZWZpbmUgX19HTVBfREVDTFNQRUNfWFggIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKy8qIGNvbXBpbGluZyB0byBnbyBpbnRvIGEgYXBwbGljYXRpb24gd2hpY2ggd2lsbCBsaW5rIHRvIGEgRExMIGxpYmdtcHh4ICovCisjZGVmaW5lIF9fR01QX0RFQ0xTUEVDX1hYICBfX0dNUF9ERUNMU1BFQ19JTVBPUlQKKyNlbmRpZgorI2Vsc2UKKy8qIGFsbCBvdGhlciBjYXNlcyAqLworI2RlZmluZSBfX0dNUF9ERUNMU1BFQ19YWAorI2VuZGlmCisKKworI2lmIF9fR01QX0hBVkVfUFJPVE9UWVBFUworI2RlZmluZSBfX0dNUF9QUk9UTyh4KSB4CisjZWxzZQorI2RlZmluZSBfX0dNUF9QUk9UTyh4KSAoKQorI2VuZGlmCisKKyNpZm5kZWYgX19NUE4KKyNpZiBfX0dNUF9IQVZFX1RPS0VOX1BBU1RFCisjZGVmaW5lIF9fTVBOKHgpIF9fZ21wbl8jI3gKKyNlbHNlCisjZGVmaW5lIF9fTVBOKHgpIF9fZ21wbl8vKioveAorI2VuZGlmCisjZW5kaWYKKworLyogRm9yIHJlZmVyZW5jZSwgImRlZmluZWQoRU9GKSIgY2Fubm90IGJlIHVzZWQgaGVyZS4gIEluIGcrKyAyLjk1LjQsCisgICA8aW9zdHJlYW0+IGRlZmluZXMgRU9GIGJ1dCBub3QgRklMRS4gICovCisjaWYgZGVmaW5lZCAoRklMRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChIX1NURElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX0hfU1RESU8pICAgICAgICAgICAgICAgLyogQUlYICovICAgICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IKSAgICAgICAgICAgICAgIC8qIGdsaWJjLCBTdW4sIFNDTyAqLyAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSF8pICAgICAgICAgICAgICAvKiBCU0QsIE9TRiAqLyAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19TVERJT19IKSAgICAgICAgICAgICAgLyogQm9ybGFuZCAqLyAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9fU1RESU9fSF9fKSAgICAgICAgICAgIC8qIElSSVggKi8gICAgICAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfU1RESU9fSU5DTFVERUQpICAgICAgICAvKiBIUFVYICovICAgICAgICAgICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX19kal9pbmNsdWRlX3N0ZGlvX2hfKSAgLyogREpHUFAgKi8gICAgICAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9GSUxFX0RFRklORUQpICAgICAgICAgIC8qIE1pY3Jvc29mdCAqLyAgICAgICAgICAgXAorICB8fCBkZWZpbmVkIChfX1NURElPX18pICAgICAgICAgICAgICAvKiBBcHBsZSBNUFcgTXJDICovICAgICAgIFwKKyAgfHwgZGVmaW5lZCAoX01TTF9TVERJT19IKSAgICAgICAgICAgLyogTWV0cm93ZXJrcyAqLyAgICAgICAgICBcCisgIHx8IGRlZmluZWQgKF9TVERJT19IX0lOQ0xVREVEKSAgICAgIC8qIFFOWDQgKi8JCVwKKyAgfHwgZGVmaW5lZCAoX0lTT19TVERJT19JU09fSCkgICAgICAgLyogU3VuIEMrKyAqLworI2RlZmluZSBfR01QX0hfSEFWRV9GSUxFIDEKKyNlbmRpZgorCisvKiBJbiBJU08gQywgaWYgYSBwcm90b3R5cGUgaW52b2x2aW5nICJzdHJ1Y3Qgb2JzdGFjayAqIiBpcyBnaXZlbiB3aXRob3V0CisgICB0aGF0IHN0cnVjdHVyZSBkZWZpbmVkLCB0aGVuIHRoZSBzdHJ1Y3QgaXMgc2NvcGVkIGRvd24gdG8ganVzdCB0aGUKKyAgIHByb3RvdHlwZSwgY2F1c2luZyBhIGNvbmZsaWN0IGlmIGl0J3Mgc3Vic2VxdWVudGx5IGRlZmluZWQgZm9yIHJlYWwuICBTbworICAgb25seSBnaXZlIHByb3RvdHlwZXMgaWYgd2UndmUgZ290IG9ic3RhY2suaC4gICovCisjaWYgZGVmaW5lZCAoX09CU1RBQ0tfSCkgICAvKiBnbGliYyA8b2JzdGFjay5oPiAqLworI2RlZmluZSBfR01QX0hfSEFWRV9PQlNUQUNLIDEKKyNlbmRpZgorCisvKiBUaGUgcHJvdG90eXBlcyBmb3IgZ21wX3ZwcmludGYgZXRjIGFyZSBwcm92aWRlZCBvbmx5IGlmIHZhX2xpc3QgaXMKKyAgIGF2YWlsYWJsZSwgdmlhIGFuIGFwcGxpY2F0aW9uIGhhdmluZyBpbmNsdWRlZCA8c3RkYXJnLmg+IG9yIDx2YXJhcmdzLmg+LgorICAgVXN1YWxseSB2YV9saXN0IGlzIGEgdHlwZWRlZiBzbyBjYW4ndCBiZSB0ZXN0ZWQgZGlyZWN0bHksIGJ1dCBDOTkKKyAgIHNwZWNpZmllcyB0aGF0IHZhX3N0YXJ0IGlzIGEgbWFjcm8gKGFuZCBpdCB3YXMgbm9ybWFsbHkgYSBtYWNybyBvbiBwYXN0CisgICBzeXN0ZW1zIHRvbyksIHNvIGxvb2sgZm9yIHRoYXQuCisKKyAgIDxzdGRpby5oPiB3aWxsIGRlZmluZSBzb21lIHNvcnQgb2YgdmFfbGlzdCBmb3IgdnByaW50ZiBhbmQgdmZwcmludGYsIGJ1dAorICAgbGV0J3Mgbm90IGJvdGhlciB0cnlpbmcgdG8gdXNlIHRoYXQgc2luY2UgaXQncyBub3Qgc3RhbmRhcmQgYW5kIHNpbmNlCisgICBhcHBsaWNhdGlvbiB1c2VzIGZvciBnbXBfdnByaW50ZiBldGMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlcXVpcmUgdGhlCisgICB3aG9sZSA8c3RkYXJnLmg+IG9yIDx2YXJhcmdzLmg+IGFueXdheS4gICovCisKKyNpZmRlZiB2YV9zdGFydAorI2RlZmluZSBfR01QX0hfSEFWRV9WQV9MSVNUIDEKKyNlbmRpZgorCisvKiBUZXN0IGZvciBnY2MgPj0gbWFqLm1pbiwgYXMgcGVyIF9fR05VQ19QUkVSRVEgaW4gZ2xpYmMgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19HTlVDX01JTk9SX18pCisjZGVmaW5lIF9fR01QX0dOVUNfUFJFUkVRKG1haiwgbWluKSBcCisgICgoX19HTlVDX18gPDwgMTYpICsgX19HTlVDX01JTk9SX18gPj0gKChtYWopIDw8IDE2KSArIChtaW4pKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfR05VQ19QUkVSRVEobWFqLCBtaW4pICAwCisjZW5kaWYKKworLyogInB1cmUiIGlzIGluIGdjYyAyLjk2IGFuZCB1cCwgc2VlICIoZ2NjKUZ1bmN0aW9uIEF0dHJpYnV0ZXMiLiAgQmFzaWNhbGx5CisgICBpdCBtZWFucyBhIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBidXQgZXhhbWluZSBpdHMgYXJndW1lbnRzIGFuZCBtZW1vcnkKKyAgIChnbG9iYWwgb3IgdmlhIGFyZ3VtZW50cykgdG8gZ2VuZXJhdGUgYSByZXR1cm4gdmFsdWUsIGJ1dCBjaGFuZ2VzIG5vdGhpbmcKKyAgIGFuZCBoYXMgbm8gc2lkZS1lZmZlY3RzLiAgX19HTVBfTk9fQVRUUklCVVRFX0NPTlNUX1BVUkUgbGV0cworICAgdHVuZS9jb21tb24uYyBldGMgdHVybiB0aGlzIG9mZiB3aGVuIHRyeWluZyB0byB3cml0ZSB0aW1pbmcgbG9vcHMuICAqLworI2lmIF9fR01QX0dOVUNfUFJFUkVRICgyLDk2KSAmJiAhIGRlZmluZWQgKF9fR01QX05PX0FUVFJJQlVURV9DT05TVF9QVVJFKQorI2RlZmluZSBfX0dNUF9BVFRSSUJVVEVfUFVSRSAgIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZWxzZQorI2RlZmluZSBfX0dNUF9BVFRSSUJVVEVfUFVSRQorI2VuZGlmCisKKworLyogX19HTVBfQ0FTVCBhbGxvd3MgdXMgdG8gdXNlIHN0YXRpY19jYXN0IGluIEMrKywgc28gb3VyIG1hY3JvcyBhcmUgY2xlYW4KKyAgIHRvICJnKysgLVdvbGQtc3R5bGUtY2FzdCIuCisKKyAgIENhc3RzIGluICJleHRlcm4gaW5saW5lIiBjb2RlIHdpdGhpbiBhbiBleHRlcm4gIkMiIGJsb2NrIGRvbid0IGluZHVjZQorICAgdGhlc2Ugd2FybmluZ3MsIHNvIF9fR01QX0NBU1Qgb25seSBuZWVkcyB0byBiZSB1c2VkIG9uIGRvY3VtZW50ZWQKKyAgIG1hY3Jvcy4gICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBfX0dNUF9DQVNUKHR5cGUsIGV4cHIpICAoc3RhdGljX2Nhc3Q8dHlwZT4gKGV4cHIpKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfQ0FTVCh0eXBlLCBleHByKSAgKCh0eXBlKSAoZXhwcikpCisjZW5kaWYKKworCisvKiBBbiBlbXB0eSAidGhyb3cgKCkiIG1lYW5zIHRoZSBmdW5jdGlvbiBkb2Vzbid0IHRocm93IGFueSBDKysgZXhjZXB0aW9ucywKKyAgIHRoaXMgY2FuIHNhdmUgc29tZSBzdGFjayBmcmFtZSBpbmZvIGluIGFwcGxpY2F0aW9ucy4KKworICAgQ3VycmVudGx5IGl0J3MgZ2l2ZW4gb25seSBvbiBmdW5jdGlvbnMgd2hpY2ggbmV2ZXIgZGl2aWRlLWJ5LXplcm8gZXRjLAorICAgZG9uJ3QgYWxsb2NhdGUgbWVtb3J5LCBhbmQgYXJlIGV4cGVjdGVkIHRvIG5ldmVyIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5LgorICAgVGhpcyBsZWF2ZXMgb3BlbiB0aGUgcG9zc2liaWxpdHkgb2YgYSBDKysgdGhyb3cgZnJvbSBhIGZ1dHVyZSBHTVAKKyAgIGV4Y2VwdGlvbnMgc2NoZW1lLgorCisgICBtcHpfc2V0X3VpIGV0YyBhcmUgb21pdHRlZCB0byBsZWF2ZSBvcGVuIHRoZSBsYXp5IGFsbG9jYXRpb24gc2NoZW1lCisgICBkZXNjcmliZWQgaW4gZG9jL3Rhc2tzLmh0bWwuICBtcHpfZ2V0X2QgZXRjIGFyZSBvbWl0dGVkIHRvIGxlYXZlIG9wZW4KKyAgIGV4Y2VwdGlvbnMgZm9yIGZsb2F0IG92ZXJmbG93cy4KKworICAgTm90ZSB0aGF0IF9fR01QX05PVEhST1cgbXVzdCBiZSBnaXZlbiBvbiBhbnkgaW5saW5lcyB0aGUgc2FtZSBhcyBvbiB0aGVpcgorICAgcHJvdG90eXBlcyAoZm9yIGcrKyBhdCBsZWFzdCwgd2hlcmUgdGhleSdyZSB1c2VkIHRvZ2V0aGVyKS4gIE5vdGUgYWxzbworICAgdGhhdCBnKysgMy4wIGRlbWFuZHMgdGhhdCBfX0dNUF9OT1RIUk9XIGlzIGJlZm9yZSBvdGhlciBhdHRyaWJ1dGVzIGxpa2UKKyAgIF9fR01QX0FUVFJJQlVURV9QVVJFLiAgKi8KKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorI2RlZmluZSBfX0dNUF9OT1RIUk9XICB0aHJvdyAoKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfTk9USFJPVworI2VuZGlmCisKKworLyogUE9SVE1FOiBXaGF0IG90aGVyIGNvbXBpbGVycyBoYXZlIGEgdXNlZnVsICJleHRlcm4gaW5saW5lIj8gICJzdGF0aWMKKyAgIGlubGluZSIgd291bGQgYmUgYW4gYWNjZXB0YWJsZSBzdWJzdGl0dXRlIGlmIHRoZSBjb21waWxlciAob3IgbGlua2VyKQorICAgZGlzY2FyZHMgdW51c2VkIHN0YXRpY3MuICAqLworCisgLyogZ2NjIGhhcyBfX2lubGluZV9fIGluIGFsbCBtb2RlcywgaW5jbHVkaW5nIHN0cmljdCBhbnNpLiAgR2l2ZSBhIHByb3RvdHlwZQorICAgIGZvciBhbiBpbmxpbmUgdG9vLCBzbyBhcyB0byBjb3JyZWN0bHkgc3BlY2lmeSAiZGxsaW1wb3J0IiBvbiB3aW5kb3dzLCBpbgorICAgIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCByYXRoZXIgdGhhbiBpbmxpbmVkLgorICAgIEdDQyA0LjMgYW5kIGFib3ZlIHdpdGggLXN0ZD1jOTkgb3IgLXN0ZD1nbnU5OSBpbXBsZW1lbnRzIElTTyBDOTkKKyAgICBpbmxpbmUgc2VtYW50aWNzLCB1bmxlc3MgLWZnbnU4OS1pbmxpbmUgaXMgdXNlZC4gICovCisjaWZkZWYgX19HTlVDX18KKyNpZiAoZGVmaW5lZCBfX0dOVUNfU1REQ19JTkxJTkVfXykgfHwgKF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPT0gMikKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSBleHRlcm4gX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18pKQorI2Vsc2UKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgICAgIGV4dGVybiBfX2lubGluZV9fCisjZW5kaWYKKyNkZWZpbmUgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgIDEKKyNlbmRpZgorCisvKiBERUMgQyAoZWcuIHZlcnNpb24gNS45KSBzdXBwb3J0cyAic3RhdGljIF9faW5saW5lIGZvbygpIiwgZXZlbiBpbiAtc3RkMQorICAgc3RyaWN0IEFOU0kgbW9kZS4gIElubGluaW5nIGlzIGRvbmUgZXZlbiB3aGVuIG5vdCBvcHRpbWl6aW5nIChpZS4gLU8wCisgICBtb2RlLCB3aGljaCBpcyB0aGUgZGVmYXVsdCksIGJ1dCBhbiB1bm5lY2Vzc2FyeSBsb2NhbCBjb3B5IG9mIGZvbyBpcworICAgZW1pdHRlZCB1bmxlc3MgLU8gaXMgdXNlZC4gICJleHRlcm4gX19pbmxpbmUiIGlzIGFjY2VwdGVkLCBidXQgdGhlCisgICAiZXh0ZXJuIiBhcHBlYXJzIHRvIGJlIGlnbm9yZWQsIGllLiBpdCBiZWNvbWVzIGEgcGxhaW4gZ2xvYmFsIGZ1bmN0aW9uCisgICBidXQgd2hpY2ggaXMgaW5saW5lZCB3aXRoaW4gaXRzIGZpbGUuICBEb24ndCBrbm93IGlmIGFsbCBvbGQgdmVyc2lvbnMgb2YKKyAgIERFQyBDIHN1cHBvcnRlZCBfX2lubGluZSwgYnV0IGFzIGEgc3RhcnQgbGV0J3MgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvcgorICAgY3VycmVudCB2ZXJzaW9ucy4gICovCisjaWZkZWYgX19ERUNDCisjZGVmaW5lIF9fR01QX0VYVEVSTl9JTkxJTkUgIHN0YXRpYyBfX2lubGluZQorI2VuZGlmCisKKy8qIFNDTyBPcGVuVU5JWCA4IGNjIHN1cHBvcnRzICJzdGF0aWMgaW5saW5lIGZvbygpIiBidXQgbm90IGluIC1YYyBzdHJpY3QKKyAgIEFOU0kgbW9kZSAoX19TVERDX18gaXMgMSBpbiB0aGF0IG1vZGUpLiAgSW5saW5pbmcgb25seSBhY3R1YWxseSB0YWtlcworICAgcGxhY2UgdW5kZXIgLU8uICBXaXRob3V0IC1PICJmb28iIHNlZW1zIHRvIGJlIGVtaXR0ZWQgd2hldGhlciBpdCdzIHVzZWQKKyAgIG9yIG5vdCwgd2hpY2ggaXMgd2FzdGVmdWwuICAiZXh0ZXJuIGlubGluZSBmb28oKSIgaXNuJ3QgdXNlZnVsLCB0aGUKKyAgICJleHRlcm4iIGlzIGFwcGFyZW50bHkgaWdub3JlZCwgc28gZm9vIGlzIGlubGluZWQgaWYgcG9zc2libGUgYnV0IGFsc28KKyAgIGVtaXR0ZWQgYXMgYSBnbG9iYWwsIHdoaWNoIGNhdXNlcyBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9ycyB3aGVuCisgICBidWlsZGluZyBhIHNoYXJlZCBsaWJnbXAuICAqLworI2lmZGVmIF9fU0NPX1ZFUlNJT05fXworI2lmIF9fU0NPX1ZFUlNJT05fXyA+IDQwMDAwMDAwMCAmJiBfX1NURENfXyAhPSAxIFwKKyAgJiYgISBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKQorI2RlZmluZSBfX0dNUF9FWFRFUk5fSU5MSU5FICBzdGF0aWMgaW5saW5lCisjZW5kaWYKKyNlbmRpZgorCisvKiBDKysgYWx3YXlzIGhhcyAiaW5saW5lIiBhbmQgc2luY2UgaXQncyBhIG5vcm1hbCBmZWF0dXJlIHRoZSBsaW5rZXIgc2hvdWxkCisgICBkaXNjYXJkIGR1cGxpY2F0ZSBub24taW5saW5lZCBjb3BpZXMsIG9yIGlmIGl0IGRvZXNuJ3QgdGhlbiB0aGF0J3MgYQorICAgcHJvYmxlbSBmb3IgZXZlcnlvbmUsIG5vdCBqdXN0IEdNUC4gICovCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpICYmICEgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkKKyNkZWZpbmUgX19HTVBfRVhURVJOX0lOTElORSAgaW5saW5lCisjZW5kaWYKKworLyogRG9uJ3QgZG8gYW55IGlubGluaW5nIHdpdGhpbiBhIGNvbmZpZ3VyZSBydW4sIHNpbmNlIGlmIHRoZSBjb21waWxlciBlbmRzCisgICB1cCBlbWl0dGluZyBjb3BpZXMgb2YgdGhlIGNvZGUgaW50byB0aGUgb2JqZWN0IGZpbGUgaXQgY2FuIGVuZCB1cAorICAgZGVtYW5kaW5nIHRoZSB2YXJpb3VzIHN1cHBvcnQgcm91dGluZXMgKGxpa2UgbXBuX3BvcGNvdW50KSBmb3IgbGlua2luZywKKyAgIG1ha2luZyB0aGUgImFsbG9jYSIgdGVzdCBhbmQgcGVyaGFwcyBvdGhlcnMgZmFpbC4gIEFuZCBvbiBocHBhIGlhNjQgYQorICAgcHJlLXJlbGVhc2UgZ2NjIDMuMiB3YXMgc2VlbiBub3QgcmVzcGVjdGluZyB0aGUgImV4dGVybiIgaW4gImV4dGVybgorICAgX19pbmxpbmVfXyIsIHRyaWdnZXJpbmcgdGhpcyBwcm9ibGVtIHRvby4gICovCisjaWYgZGVmaW5lZCAoX19HTVBfV0lUSElOX0NPTkZJR1VSRSkgJiYgISBfX0dNUF9XSVRISU5fQ09ORklHVVJFX0lOTElORQorI3VuZGVmIF9fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorCisvKiBCeSBkZWZhdWx0LCBkb24ndCBnaXZlIGEgcHJvdG90eXBlIHdoZW4gdGhlcmUncyBnb2luZyB0byBiZSBhbiBpbmxpbmUKKyAgIHZlcnNpb24uICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBDcmF5IEMrKyBvYmplY3RzIHRvIHRoZSBjb21iaW5hdGlvbiBvZgorICAgcHJvdG90eXBlIGFuZCBpbmxpbmUuICAqLworI2lmZGVmIF9fR01QX0VYVEVSTl9JTkxJTkUKKyNpZm5kZWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMKKyNkZWZpbmUgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgIDAKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgIDEKKyNlbmRpZgorCisKKyNkZWZpbmUgX19HTVBfQUJTKHgpICAgKCh4KSA+PSAwID8gKHgpIDogLSh4KSkKKyNkZWZpbmUgX19HTVBfTUFYKGgsaSkgKChoKSA+IChpKSA/IChoKSA6IChpKSkKKworLyogX19HTVBfVVNIUlRfTUFYIGlzIG5vdCAifiAodW5zaWduZWQgc2hvcnQpIDAiIGJlY2F1c2Ugc2hvcnQgaXMgcHJvbW90ZWQKKyAgIHRvIGludCBieSAifiIuICAqLworI2RlZmluZSBfX0dNUF9VSU5UX01BWCAgICh+ICh1bnNpZ25lZCkgMCkKKyNkZWZpbmUgX19HTVBfVUxPTkdfTUFYICAofiAodW5zaWduZWQgbG9uZykgMCkKKyNkZWZpbmUgX19HTVBfVVNIUlRfTUFYICAoKHVuc2lnbmVkIHNob3J0KSB+MCkKKworCisvKiBfX2J1aWx0aW5fZXhwZWN0IGlzIGluIGdjYyAzLjAsIGFuZCBub3QgaW4gMi45NS4gKi8KKyNpZiBfX0dNUF9HTlVDX1BSRVJFUSAoMywwKQorI2RlZmluZSBfX0dNUF9MSUtFTFkoY29uZCkgICAgX19idWlsdGluX2V4cGVjdCAoKGNvbmQpICE9IDAsIDEpCisjZGVmaW5lIF9fR01QX1VOTElLRUxZKGNvbmQpICBfX2J1aWx0aW5fZXhwZWN0ICgoY29uZCkgIT0gMCwgMCkKKyNlbHNlCisjZGVmaW5lIF9fR01QX0xJS0VMWShjb25kKSAgICAoY29uZCkKKyNkZWZpbmUgX19HTVBfVU5MSUtFTFkoY29uZCkgIChjb25kKQorI2VuZGlmCisKKyNpZmRlZiBfQ1JBWQorI2RlZmluZSBfX0dNUF9DUkFZX1ByYWdtYShzdHIpICBfUHJhZ21hIChzdHIpCisjZWxzZQorI2RlZmluZSBfX0dNUF9DUkFZX1ByYWdtYShzdHIpCisjZW5kaWYKKworCisvKiBBbGxvdyBkaXJlY3QgdXNlciBhY2Nlc3MgdG8gbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBvZiBhIG1wcV90IG9iamVjdC4gICovCisjZGVmaW5lIG1wcV9udW1yZWYoUSkgKCYoKFEpLT5fbXBfbnVtKSkKKyNkZWZpbmUgbXBxX2RlbnJlZihRKSAoJigoUSktPl9tcF9kZW4pKQorCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgewordXNpbmcgc3RkOjpGSUxFOworI2VuZGlmCisKKyNkZWZpbmUgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgX19nbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBfc2V0X21lbW9yeV9mdW5jdGlvbnMgX19HTVBfUFJPVE8gKCh2b2lkICooKikgKHNpemVfdCksCisJCQkJICAgICAgdm9pZCAqKCopICh2b2lkICosIHNpemVfdCwgc2l6ZV90KSwKKwkJCQkgICAgICB2b2lkICgqKSAodm9pZCAqLCBzaXplX3QpKSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyBfX2dtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucworX19HTVBfREVDTFNQRUMgdm9pZCBtcF9nZXRfbWVtb3J5X2Z1bmN0aW9ucyBfX0dNUF9QUk9UTyAoKHZvaWQgKigqKikgKHNpemVfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqKikgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqKikgKHZvaWQgKiwgc2l6ZV90KSkpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXBfYml0c19wZXJfbGltYiBfX2dtcF9iaXRzX3Blcl9saW1iCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gX19nbXBfY29uc3QgaW50IG1wX2JpdHNfcGVyX2xpbWI7CisKKyNkZWZpbmUgZ21wX2Vycm5vIF9fZ21wX2Vycm5vCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gaW50IGdtcF9lcnJubzsKKworI2RlZmluZSBnbXBfdmVyc2lvbiBfX2dtcF92ZXJzaW9uCitfX0dNUF9ERUNMU1BFQyBleHRlcm4gX19nbXBfY29uc3QgY2hhciAqIF9fZ21wX2NvbnN0IGdtcF92ZXJzaW9uOworCisKKy8qKioqKioqKioqKioqKioqIFJhbmRvbSBudW1iZXIgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBnbXBfcmFuZGluaXQgX19nbXBfcmFuZGluaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRpbml0IF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCBnbXBfcmFuZGFsZ190LCAuLi4pKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfZGVmYXVsdCBfX2dtcF9yYW5kaW5pdF9kZWZhdWx0CitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kaW5pdF9kZWZhdWx0IF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90KSk7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X2xjXzJleHAgX19nbXBfcmFuZGluaXRfbGNfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZGluaXRfbGNfMmV4cCBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsCisJCQkJICAgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfbGNfMmV4cF9zaXplIF9fZ21wX3JhbmRpbml0X2xjXzJleHBfc2l6ZQorX19HTVBfREVDTFNQRUMgaW50IGdtcF9yYW5kaW5pdF9sY18yZXhwX3NpemUgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIHVuc2lnbmVkIGxvbmcpKTsKKworI2RlZmluZSBnbXBfcmFuZGluaXRfbXQgX19nbXBfcmFuZGluaXRfbXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRpbml0X210IF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90KSk7CisKKyNkZWZpbmUgZ21wX3JhbmRpbml0X3NldCBfX2dtcF9yYW5kaW5pdF9zZXQKK3ZvaWQgZ21wX3JhbmRpbml0X3NldCBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwgX19nbXBfY29uc3QgX19nbXBfcmFuZHN0YXRlX3N0cnVjdCAqKSk7CisKKyNkZWZpbmUgZ21wX3JhbmRzZWVkIF9fZ21wX3JhbmRzZWVkCitfX0dNUF9ERUNMU1BFQyB2b2lkIGdtcF9yYW5kc2VlZCBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIGdtcF9yYW5kc2VlZF91aSBfX2dtcF9yYW5kc2VlZF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBnbXBfcmFuZHNlZWRfdWkgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgZ21wX3JhbmRjbGVhciBfX2dtcF9yYW5kY2xlYXIKK19fR01QX0RFQ0xTUEVDIHZvaWQgZ21wX3JhbmRjbGVhciBfX0dNUF9QUk9UTyAoKGdtcF9yYW5kc3RhdGVfdCkpOworCisjZGVmaW5lIGdtcF91cmFuZG9tYl91aSBfX2dtcF91cmFuZG9tYl91aQordW5zaWduZWQgbG9uZyBnbXBfdXJhbmRvbWJfdWkgX19HTVBfUFJPVE8gKChnbXBfcmFuZHN0YXRlX3QsIHVuc2lnbmVkIGxvbmcpKTsKKworI2RlZmluZSBnbXBfdXJhbmRvbW1fdWkgX19nbXBfdXJhbmRvbW1fdWkKK3Vuc2lnbmVkIGxvbmcgZ21wX3VyYW5kb21tX3VpIF9fR01QX1BST1RPICgoZ21wX3JhbmRzdGF0ZV90LCB1bnNpZ25lZCBsb25nKSk7CisKKworLyoqKioqKioqKioqKioqKiogRm9ybWF0dGVkIG91dHB1dCByb3V0aW5lcy4gICoqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgZ21wX2FzcHJpbnRmIF9fZ21wX2FzcHJpbnRmCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX2FzcHJpbnRmIF9fR01QX1BST1RPICgoY2hhciAqKiwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKworI2RlZmluZSBnbXBfZnByaW50ZiBfX2dtcF9mcHJpbnRmCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgaW50IGdtcF9mcHJpbnRmIF9fR01QX1BST1RPICgoRklMRSAqLCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX29ic3RhY2tfcHJpbnRmIF9fZ21wX29ic3RhY2tfcHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfT0JTVEFDSykKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfb2JzdGFja19wcmludGYgX19HTVBfUFJPVE8gKChzdHJ1Y3Qgb2JzdGFjayAqLCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX29ic3RhY2tfdnByaW50ZiBfX2dtcF9vYnN0YWNrX3ZwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9PQlNUQUNLKSAmJiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF9vYnN0YWNrX3ZwcmludGYgX19HTVBfUFJPVE8gKChzdHJ1Y3Qgb2JzdGFjayAqLCBfX2dtcF9jb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIGdtcF9wcmludGYgX19nbXBfcHJpbnRmCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ByaW50ZiBfX0dNUF9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX3NucHJpbnRmIF9fZ21wX3NucHJpbnRmCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3NucHJpbnRmIF9fR01QX1BST1RPICgoY2hhciAqLCBzaXplX3QsIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNkZWZpbmUgZ21wX3NwcmludGYgX19nbXBfc3ByaW50ZgorX19HTVBfREVDTFNQRUMgaW50IGdtcF9zcHJpbnRmIF9fR01QX1BST1RPICgoY2hhciAqLCBfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworCisjZGVmaW5lIGdtcF92YXNwcmludGYgX19nbXBfdmFzcHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdmFzcHJpbnRmIF9fR01QX1BST1RPICgoY2hhciAqKiwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdmZwcmludGYgX19nbXBfdmZwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9GSUxFKSAmJiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92ZnByaW50ZiBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnByaW50ZiBfX2dtcF92cHJpbnRmCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdnByaW50ZiBfX0dNUF9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3ZzbnByaW50ZiBfX2dtcF92c25wcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92c25wcmludGYgX19HTVBfUFJPVE8gKChjaGFyICosIHNpemVfdCwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnNwcmludGYgX19nbXBfdnNwcmludGYKKyNpZiBkZWZpbmVkIChfR01QX0hfSEFWRV9WQV9MSVNUKQorX19HTVBfREVDTFNQRUMgaW50IGdtcF92c3ByaW50ZiBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKiBGb3JtYXR0ZWQgaW5wdXQgcm91dGluZXMuICAqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGdtcF9mc2NhbmYgX19nbXBfZnNjYW5mCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgaW50IGdtcF9mc2NhbmYgX19HTVBfUFJPVE8gKChGSUxFICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgLi4uKSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfc2NhbmYgX19nbXBfc2NhbmYKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfc2NhbmYgX19HTVBfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyICosIC4uLikpOworCisjZGVmaW5lIGdtcF9zc2NhbmYgX19nbXBfc3NjYW5mCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3NzY2FuZiBfX0dNUF9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIgKiwgX19nbXBfY29uc3QgY2hhciAqLCAuLi4pKTsKKworI2RlZmluZSBnbXBfdmZzY2FuZiBfX2dtcF92ZnNjYW5mCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfRklMRSkgJiYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKK19fR01QX0RFQ0xTUEVDIGludCBnbXBfdmZzY2FuZiBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgX19nbXBfY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2RlZmluZSBnbXBfdnNjYW5mIF9fZ21wX3ZzY2FuZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3ZzY2FuZiBfX0dNUF9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNkZWZpbmUgZ21wX3Zzc2NhbmYgX19nbXBfdnNzY2FuZgorI2lmIGRlZmluZWQgKF9HTVBfSF9IQVZFX1ZBX0xJU1QpCitfX0dNUF9ERUNMU1BFQyBpbnQgZ21wX3Zzc2NhbmYgX19HTVBfUFJPVE8gKChfX2dtcF9jb25zdCBjaGFyICosIF9fZ21wX2NvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKiogSW50ZWdlciAoaS5lLiBaKSByb3V0aW5lcy4gICoqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX21wel9yZWFsbG9jIF9fZ21wel9yZWFsbG9jCisjZGVmaW5lIG1wel9yZWFsbG9jIF9fZ21wel9yZWFsbG9jCitfX0dNUF9ERUNMU1BFQyB2b2lkICpfbXB6X3JlYWxsb2MgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcHpfYWJzIF9fZ21wel9hYnMKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfYWJzKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWJzIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2FkZCBfX2dtcHpfYWRkCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hZGQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2FkZF91aSBfX2dtcHpfYWRkX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9hZGRfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9hZGRtdWwgX19nbXB6X2FkZG11bAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWRkbXVsIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9hZGRtdWxfdWkgX19nbXB6X2FkZG11bF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYWRkbXVsX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfYW5kIF9fZ21wel9hbmQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2FuZCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfYXJyYXlfaW5pdCBfX2dtcHpfYXJyYXlfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfYXJyYXlfaW5pdCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX3NpemVfdCwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXB6X2Jpbl91aSBfX2dtcHpfYmluX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9iaW5fdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9iaW5fdWl1aSBfX2dtcHpfYmluX3VpdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2Jpbl91aXVpIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfcSBfX2dtcHpfY2Rpdl9xCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jZGl2X3EgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfcV8yZXhwIF9fZ21wel9jZGl2X3FfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9xXzJleHAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfcV91aSBfX2dtcHpfY2Rpdl9xX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfY2Rpdl9xX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xciBfX2dtcHpfY2Rpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9xciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfY2Rpdl9xcl91aSBfX2dtcHpfY2Rpdl9xcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcXJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9jZGl2X3IgX19nbXB6X2NkaXZfcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfY2Rpdl9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9jZGl2X3JfMmV4cCBfX2dtcHpfY2Rpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NkaXZfcl8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIG1wel9jZGl2X3JfdWkgX19nbXB6X2NkaXZfcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2NkaXZfcl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2NkaXZfdWkgX19nbXB6X2NkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9jZGl2X3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY2xlYXIgX19nbXB6X2NsZWFyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jbGVhciBfX0dNUF9QUk9UTyAoKG1wel9wdHIpKTsKKworI2RlZmluZSBtcHpfY2xyYml0IF9fZ21wel9jbHJiaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2NscmJpdCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2NtcCBfX2dtcHpfY21wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2NtcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jbXBfZCBfX2dtcHpfY21wX2QKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY21wX2QgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBkb3VibGUpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBfbXB6X2NtcF9zaSBfX2dtcHpfY21wX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgX21wel9jbXBfc2kgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBzaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHpfY21wX3VpIF9fZ21wel9jbXBfdWkKK19fR01QX0RFQ0xTUEVDIGludCBfbXB6X2NtcF91aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfY21wYWJzIF9fZ21wel9jbXBhYnMKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY21wYWJzIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NtcGFic19kIF9fZ21wel9jbXBhYnNfZAorX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBhYnNfZCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIGRvdWJsZSkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jbXBhYnNfdWkgX19nbXB6X2NtcGFic191aQorX19HTVBfREVDTFNQRUMgaW50IG1wel9jbXBhYnNfdWkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NvbSBfX2dtcHpfY29tCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jb20gX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2NvbWJpdCBfX2dtcHpfY29tYml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9jb21iaXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfcCBfX2dtcHpfY29uZ3J1ZW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50X3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2NvbmdydWVudF8yZXhwX3AgX19nbXB6X2NvbmdydWVudF8yZXhwX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50XzJleHBfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9jb25ncnVlbnRfdWlfcCBfX2dtcHpfY29uZ3J1ZW50X3VpX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfY29uZ3J1ZW50X3VpX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2RpdmV4YWN0IF9fZ21wel9kaXZleGFjdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZGl2ZXhhY3QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2RpdmV4YWN0X3VpIF9fZ21wel9kaXZleGFjdF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZGl2ZXhhY3RfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgbXB6X2RpdmlzaWJsZV9wIF9fZ21wel9kaXZpc2libGVfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9kaXZpc2libGVfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZGl2aXNpYmxlX3VpX3AgX19nbXB6X2RpdmlzaWJsZV91aV9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2RpdmlzaWJsZV91aV9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZykpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9kaXZpc2libGVfMmV4cF9wIF9fZ21wel9kaXZpc2libGVfMmV4cF9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2RpdmlzaWJsZV8yZXhwX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZHVtcCBfX2dtcHpfZHVtcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZHVtcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZXhwb3J0IF9fZ21wel9leHBvcnQKK19fR01QX0RFQ0xTUEVDIHZvaWQgKm1wel9leHBvcnQgX19HTVBfUFJPVE8gKCh2b2lkICosIHNpemVfdCAqLCBpbnQsIHNpemVfdCwgaW50LCBzaXplX3QsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZmFjX3VpIF9fZ21wel9mYWNfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZhY191aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcSBfX2dtcHpfZmRpdl9xCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mZGl2X3EgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcV8yZXhwIF9fZ21wel9mZGl2X3FfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmRpdl9xXzJleHAgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9mZGl2X3FfdWkgX19nbXB6X2ZkaXZfcV91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2ZkaXZfcV91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcXIgX19nbXB6X2ZkaXZfcXIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfcXIgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcXJfdWkgX19nbXB6X2ZkaXZfcXJfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9mZGl2X3FyX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZmRpdl9yIF9fZ21wel9mZGl2X3IKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ZkaXZfciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZmRpdl9yXzJleHAgX19nbXB6X2ZkaXZfcl8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9mZGl2X3JfMmV4cCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZkaXZfcl91aSBfX2dtcHpfZmRpdl9yX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZmRpdl9yX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZmRpdl91aSBfX2dtcHpfZmRpdl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2ZkaXZfdWkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9maWJfdWkgX19nbXB6X2ZpYl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmliX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZmliMl91aSBfX2dtcHpfZmliMl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfZmliMl91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2ZpdHNfc2ludF9wIF9fZ21wel9maXRzX3NpbnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3NpbnRfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9maXRzX3Nsb25nX3AgX19nbXB6X2ZpdHNfc2xvbmdfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3Nsb25nX3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZml0c19zc2hvcnRfcCBfX2dtcHpfZml0c19zc2hvcnRfcAorX19HTVBfREVDTFNQRUMgaW50IG1wel9maXRzX3NzaG9ydF9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2ZpdHNfdWludF9wIF9fZ21wel9maXRzX3VpbnRfcAorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VpbnRfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c191aW50X3AgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9maXRzX3Vsb25nX3AgX19nbXB6X2ZpdHNfdWxvbmdfcAorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3Vsb25nX3ApCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2ZpdHNfdWxvbmdfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2ZpdHNfdXNob3J0X3AgX19nbXB6X2ZpdHNfdXNob3J0X3AKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191c2hvcnRfcCkKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfZml0c191c2hvcnRfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X2djZCBfX2dtcHpfZ2NkCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9nY2QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2djZF91aSBfX2dtcHpfZ2NkX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZ2NkX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfZ2NkZXh0IF9fZ21wel9nY2RleHQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2djZGV4dCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfZ2V0X2QgX19nbXB6X2dldF9kCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXB6X2dldF9kIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9nZXRfZF8yZXhwIF9fZ21wel9nZXRfZF8yZXhwCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXB6X2dldF9kXzJleHAgX19HTVBfUFJPVE8gKChzaWduZWQgbG9uZyBpbnQgKiwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9nZXRfc2kgX19nbXB6X2dldF9zaQorX19HTVBfREVDTFNQRUMgLyogc2lnbmVkICovIGxvbmcgaW50IG1wel9nZXRfc2kgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfZ2V0X3N0ciBfX2dtcHpfZ2V0X3N0cgorX19HTVBfREVDTFNQRUMgY2hhciAqbXB6X2dldF9zdHIgX19HTVBfUFJPVE8gKChjaGFyICosIGludCwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9nZXRfdWkgX19nbXB6X2dldF91aQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9nZXRfdWkpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfZ2V0X3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfZ2V0bGltYm4gX19nbXB6X2dldGxpbWJuCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldGxpbWJuKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wel9nZXRsaW1ibiBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIG1wX3NpemVfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisjZW5kaWYKKworI2RlZmluZSBtcHpfaGFtZGlzdCBfX2dtcHpfaGFtZGlzdAorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X2hhbWRpc3QgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfaW1wb3J0IF9fZ21wel9pbXBvcnQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2ltcG9ydCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHNpemVfdCwgaW50LCBzaXplX3QsIGludCwgc2l6ZV90LCBfX2dtcF9jb25zdCB2b2lkICopKTsKKworI2RlZmluZSBtcHpfaW5pdCBfX2dtcHpfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdCBfX0dNUF9QUk9UTyAoKG1wel9wdHIpKTsKKworI2RlZmluZSBtcHpfaW5pdDIgX19nbXB6X2luaXQyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0MiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcpKTsKKworI2RlZmluZSBtcHpfaW5pdF9zZXQgX19nbXB6X2luaXRfc2V0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9pbml0X3NldCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfaW5pdF9zZXRfZCBfX2dtcHpfaW5pdF9zZXRfZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdF9zZXRfZCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGRvdWJsZSkpOworCisjZGVmaW5lIG1wel9pbml0X3NldF9zaSBfX2dtcHpfaW5pdF9zZXRfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X2luaXRfc2V0X3NpIF9fR01QX1BST1RPICgobXB6X3B0ciwgc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X2luaXRfc2V0X3N0ciBfX2dtcHpfaW5pdF9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2luaXRfc2V0X3N0ciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIF9fZ21wX2NvbnN0IGNoYXIgKiwgaW50KSk7CisKKyNkZWZpbmUgbXB6X2luaXRfc2V0X3VpIF9fZ21wel9pbml0X3NldF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW5pdF9zZXRfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9pbnBfcmF3IF9fZ21wel9pbnBfcmF3CisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wel9pbnBfcmF3IF9fR01QX1BST1RPICgobXB6X3B0ciwgRklMRSAqKSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfaW5wX3N0ciBfX2dtcHpfaW5wX3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfaW5wX3N0ciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIEZJTEUgKiwgaW50KSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfaW52ZXJ0IF9fZ21wel9pbnZlcnQKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfaW52ZXJ0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9pb3IgX19nbXB6X2lvcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfaW9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9qYWNvYmkgX19nbXB6X2phY29iaQorX19HTVBfREVDTFNQRUMgaW50IG1wel9qYWNvYmkgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2tyb25lY2tlciBtcHpfamFjb2JpICAvKiBhbGlhcyAqLworCisjZGVmaW5lIG1wel9rcm9uZWNrZXJfc2kgX19nbXB6X2tyb25lY2tlcl9zaQorX19HTVBfREVDTFNQRUMgaW50IG1wel9rcm9uZWNrZXJfc2kgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBsb25nKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2tyb25lY2tlcl91aSBfX2dtcHpfa3JvbmVja2VyX3VpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X2tyb25lY2tlcl91aSBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfc2lfa3JvbmVja2VyIF9fZ21wel9zaV9rcm9uZWNrZXIKK19fR01QX0RFQ0xTUEVDIGludCBtcHpfc2lfa3JvbmVja2VyIF9fR01QX1BST1RPICgobG9uZywgbXB6X3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel91aV9rcm9uZWNrZXIgX19nbXB6X3VpX2tyb25lY2tlcgorX19HTVBfREVDTFNQRUMgaW50IG1wel91aV9rcm9uZWNrZXIgX19HTVBfUFJPVE8gKCh1bnNpZ25lZCBsb25nLCBtcHpfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X2xjbSBfX2dtcHpfbGNtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9sY20gX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X2xjbV91aSBfX2dtcHpfbGNtX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9sY21fdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgbXB6X2xlZ2VuZHJlIG1wel9qYWNvYmkgIC8qIGFsaWFzICovCisKKyNkZWZpbmUgbXB6X2x1Y251bV91aSBfX2dtcHpfbHVjbnVtX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9sdWNudW1fdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9sdWNudW0yX3VpIF9fZ21wel9sdWNudW0yX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9sdWNudW0yX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfbWlsbGVycmFiaW4gX19nbXB6X21pbGxlcnJhYmluCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X21pbGxlcnJhYmluIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgaW50KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X21vZCBfX2dtcHpfbW9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tb2QgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X21vZF91aSBtcHpfZmRpdl9yX3VpIC8qIHNhbWUgYXMgZmRpdl9yIGJlY2F1c2UgZGl2aXNvciB1bnNpZ25lZCAqLworCisjZGVmaW5lIG1wel9tdWwgX19nbXB6X211bAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfbXVsIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9tdWxfMmV4cCBfX2dtcHpfbXVsXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X211bF8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfbXVsX3NpIF9fZ21wel9tdWxfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X211bF9zaSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X211bF91aSBfX2dtcHpfbXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9tdWxfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9uZWcgX19nbXB6X25lZworI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9uZWcpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9uZWcgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyKSk7CisjZW5kaWYKKworI2RlZmluZSBtcHpfbmV4dHByaW1lIF9fZ21wel9uZXh0cHJpbWUKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X25leHRwcmltZSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfb3V0X3JhdyBfX2dtcHpfb3V0X3JhdworI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcHpfb3V0X3JhdyBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgbXB6X3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X291dF9zdHIgX19nbXB6X291dF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X291dF9zdHIgX19HTVBfUFJPVE8gKChGSUxFICosIGludCwgbXB6X3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3BlcmZlY3RfcG93ZXJfcCBfX2dtcHpfcGVyZmVjdF9wb3dlcl9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3BlcmZlY3RfcG93ZXJfcCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfcGVyZmVjdF9zcXVhcmVfcCBfX2dtcHpfcGVyZmVjdF9zcXVhcmVfcAorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wZXJmZWN0X3NxdWFyZV9wKQorX19HTVBfREVDTFNQRUMgaW50IG1wel9wZXJmZWN0X3NxdWFyZV9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3BvcGNvdW50IF9fZ21wel9wb3Bjb3VudAorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wb3Bjb3VudCkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel9wb3Bjb3VudCBfX0dNUF9QUk9UTyAoKG1wel9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3Bvd191aSBfX2dtcHpfcG93X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wb3dfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9wb3dtIF9fZ21wel9wb3dtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wb3dtIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9wb3dtX3VpIF9fZ21wel9wb3dtX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9wb3dtX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfcHJvYmFiX3ByaW1lX3AgX19nbXB6X3Byb2JhYl9wcmltZV9wCitfX0dNUF9ERUNMU1BFQyBpbnQgbXB6X3Byb2JhYl9wcmltZV9wIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgaW50KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3JhbmRvbSBfX2dtcHpfcmFuZG9tCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9yYW5kb20gX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcHpfcmFuZG9tMiBfX2dtcHpfcmFuZG9tMgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcmFuZG9tMiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wel9yZWFsbG9jMiBfX2dtcHpfcmVhbGxvYzIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3JlYWxsb2MyIF9fR01QX1BST1RPICgobXB6X3B0ciwgdW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIG1wel9yZW1vdmUgX19nbXB6X3JlbW92ZQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3JlbW92ZSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfcm9vdCBfX2dtcHpfcm9vdAorX19HTVBfREVDTFNQRUMgaW50IG1wel9yb290IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfcm9vdHJlbSBfX2dtcHpfcm9vdHJlbQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfcm9vdHJlbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsbXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfcnJhbmRvbWIgX19nbXB6X3JyYW5kb21iCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9ycmFuZG9tYiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfc2NhbjAgX19nbXB6X3NjYW4wCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfc2NhbjAgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3NjYW4xIF9fZ21wel9zY2FuMQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3NjYW4xIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zZXQgX19nbXB6X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zZXRfZCBfX2dtcHpfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9kIF9fR01QX1BST1RPICgobXB6X3B0ciwgZG91YmxlKSk7CisKKyNkZWZpbmUgbXB6X3NldF9mIF9fZ21wel9zZXRfZgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc2V0X2YgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3NldF9xIF9fZ21wel9zZXRfcQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zZXRfcSkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF9xIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXBxX3NyY3B0cikpOworI2VuZGlmCisKKyNkZWZpbmUgbXB6X3NldF9zaSBfX2dtcHpfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRfc2kgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBzaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfc2V0X3N0ciBfX2dtcHpfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wel9zZXRfc3RyIF9fR01QX1BST1RPICgobXB6X3B0ciwgX19nbXBfY29uc3QgY2hhciAqLCBpbnQpKTsKKworI2RlZmluZSBtcHpfc2V0X3VpIF9fZ21wel9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3NldF91aSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3NldGJpdCBfX2dtcHpfc2V0Yml0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zZXRiaXQgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9zaXplIF9fZ21wel9zaXplCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NpemUpCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X3NpemUgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wel9zaXplaW5iYXNlIF9fZ21wel9zaXplaW5iYXNlCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXB6X3NpemVpbmJhc2UgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCBpbnQpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wel9zcXJ0IF9fZ21wel9zcXJ0CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zcXJ0IF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zcXJ0cmVtIF9fZ21wel9zcXJ0cmVtCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zcXJ0cmVtIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zdWIgX19nbXB6X3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3ViIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel9zdWJfdWkgX19nbXB6X3N1Yl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfc3ViX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdWlfc3ViIF9fZ21wel91aV9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3VpX3N1YiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3N1Ym11bCBfX2dtcHpfc3VibXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWJtdWwgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXB6X3N1Ym11bF91aSBfX2dtcHpfc3VibXVsX3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zdWJtdWxfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel9zd2FwIF9fZ21wel9zd2FwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel9zd2FwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3B0cikpIF9fR01QX05PVEhST1c7CisKKyNkZWZpbmUgbXB6X3RkaXZfdWkgX19nbXB6X3RkaXZfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3VpIF9fR01QX1BST1RPICgobXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHpfdGRpdl9xIF9fZ21wel90ZGl2X3EKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xXzJleHAgX19nbXB6X3RkaXZfcV8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel90ZGl2X3FfMmV4cCBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXB6X3RkaXZfcV91aSBfX2dtcHpfdGRpdl9xX3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcHpfdGRpdl9xX3VpIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xciBfX2dtcHpfdGRpdl9xcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9xciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHpfdGRpdl9xcl91aSBfX2dtcHpfdGRpdl9xcl91aQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXB6X3RkaXZfcXJfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel90ZGl2X3IgX19nbXB6X3RkaXZfcgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHpfdGRpdl9yIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel90ZGl2X3JfMmV4cCBfX2dtcHpfdGRpdl9yXzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3RkaXZfcl8yZXhwIF9fR01QX1BST1RPICgobXB6X3B0ciwgbXB6X3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdGRpdl9yX3VpIF9fZ21wel90ZGl2X3JfdWkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wel90ZGl2X3JfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCBtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wel90c3RiaXQgX19nbXB6X3RzdGJpdAorX19HTVBfREVDTFNQRUMgaW50IG1wel90c3RiaXQgX19HTVBfUFJPVE8gKChtcHpfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXB6X3VpX3Bvd191aSBfX2dtcHpfdWlfcG93X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91aV9wb3dfdWkgX19HTVBfUFJPVE8gKChtcHpfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdXJhbmRvbWIgX19nbXB6X3VyYW5kb21iCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91cmFuZG9tYiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHpfdXJhbmRvbW0gX19nbXB6X3VyYW5kb21tCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wel91cmFuZG9tbSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIGdtcF9yYW5kc3RhdGVfdCwgbXB6X3NyY3B0cikpOworCisjZGVmaW5lIG1wel94b3IgX19nbXB6X3hvcgorI2RlZmluZSBtcHpfZW9yIF9fZ21wel94b3IKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXB6X3hvciBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wel9zcmNwdHIsIG1wel9zcmNwdHIpKTsKKworCisvKioqKioqKioqKioqKioqKiBSYXRpb25hbCAoaS5lLiBRKSByb3V0aW5lcy4gICoqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgbXBxX2FicyBfX2dtcHFfYWJzCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBxX2FicykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2FicyBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9hZGQgX19nbXBxX2FkZAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfYWRkIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9jYW5vbmljYWxpemUgX19nbXBxX2Nhbm9uaWNhbGl6ZQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfY2Fub25pY2FsaXplIF9fR01QX1BST1RPICgobXBxX3B0cikpOworCisjZGVmaW5lIG1wcV9jbGVhciBfX2dtcHFfY2xlYXIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2NsZWFyIF9fR01QX1BST1RPICgobXBxX3B0cikpOworCisjZGVmaW5lIG1wcV9jbXAgX19nbXBxX2NtcAorX19HTVBfREVDTFNQRUMgaW50IG1wcV9jbXAgX19HTVBfUFJPVE8gKChtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgX21wcV9jbXBfc2kgX19nbXBxX2NtcF9zaQorX19HTVBfREVDTFNQRUMgaW50IF9tcHFfY21wX3NpIF9fR01QX1BST1RPICgobXBxX3NyY3B0ciwgbG9uZywgdW5zaWduZWQgbG9uZykpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIF9tcHFfY21wX3VpIF9fZ21wcV9jbXBfdWkKK19fR01QX0RFQ0xTUEVDIGludCBfbXBxX2NtcF91aSBfX0dNUF9QUk9UTyAoKG1wcV9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wcV9kaXYgX19nbXBxX2RpdgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZGl2IF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9kaXZfMmV4cCBfX2dtcHFfZGl2XzJleHAKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2Rpdl8yZXhwIF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0ciwgdW5zaWduZWQgbG9uZykpOworCisjZGVmaW5lIG1wcV9lcXVhbCBfX2dtcHFfZXF1YWwKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfZXF1YWwgX19HTVBfUFJPVE8gKChtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcHFfZ2V0X251bSBfX2dtcHFfZ2V0X251bQorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZ2V0X251bSBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfZ2V0X2RlbiBfX2dtcHFfZ2V0X2RlbgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfZ2V0X2RlbiBfX0dNUF9QUk9UTyAoKG1wel9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfZ2V0X2QgX19nbXBxX2dldF9kCitfX0dNUF9ERUNMU1BFQyBkb3VibGUgbXBxX2dldF9kIF9fR01QX1BST1RPICgobXBxX3NyY3B0cikpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wcV9nZXRfc3RyIF9fZ21wcV9nZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBjaGFyICptcHFfZ2V0X3N0ciBfX0dNUF9QUk9UTyAoKGNoYXIgKiwgaW50LCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX2luaXQgX19nbXBxX2luaXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX2luaXQgX19HTVBfUFJPVE8gKChtcHFfcHRyKSk7CisKKyNkZWZpbmUgbXBxX2lucF9zdHIgX19nbXBxX2lucF9zdHIKKyNpZmRlZiBfR01QX0hfSEFWRV9GSUxFCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBxX2lucF9zdHIgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBGSUxFICosIGludCkpOworI2VuZGlmCisKKyNkZWZpbmUgbXBxX2ludiBfX2dtcHFfaW52CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9pbnYgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX211bCBfX2dtcHFfbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9tdWwgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyLCBtcHFfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX211bF8yZXhwIF9fZ21wcV9tdWxfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfbXVsXzJleHAgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHFfc3JjcHRyLCB1bnNpZ25lZCBsb25nKSk7CisKKyNkZWZpbmUgbXBxX25lZyBfX2dtcHFfbmVnCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBxX25lZykKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX25lZyBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9vdXRfc3RyIF9fZ21wcV9vdXRfc3RyCisjaWZkZWYgX0dNUF9IX0hBVkVfRklMRQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wcV9vdXRfc3RyIF9fR01QX1BST1RPICgoRklMRSAqLCBpbnQsIG1wcV9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wcV9zZXQgX19nbXBxX3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0IF9fR01QX1BST1RPICgobXBxX3B0ciwgbXBxX3NyY3B0cikpOworCisjZGVmaW5lIG1wcV9zZXRfZCBfX2dtcHFfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9kIF9fR01QX1BST1RPICgobXBxX3B0ciwgZG91YmxlKSk7CisKKyNkZWZpbmUgbXBxX3NldF9kZW4gX19nbXBxX3NldF9kZW4KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9kZW4gX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9mIF9fZ21wcV9zZXRfZgorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc2V0X2YgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9udW0gX19nbXBxX3NldF9udW0KK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3NldF9udW0gX19HTVBfUFJPVE8gKChtcHFfcHRyLCBtcHpfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBxX3NldF9zaSBfX2dtcHFfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfc2kgX19HTVBfUFJPVE8gKChtcHFfcHRyLCBzaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBxX3NldF9zdHIgX19nbXBxX3NldF9zdHIKK19fR01QX0RFQ0xTUEVDIGludCBtcHFfc2V0X3N0ciBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIF9fZ21wX2NvbnN0IGNoYXIgKiwgaW50KSk7CisKKyNkZWZpbmUgbXBxX3NldF91aSBfX2dtcHFfc2V0X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfdWkgX19HTVBfUFJPVE8gKChtcHFfcHRyLCB1bnNpZ25lZCBsb25nIGludCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcHFfc2V0X3ogX19nbXBxX3NldF96CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wcV9zZXRfeiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc3ViIF9fZ21wcV9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBxX3N1YiBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9zcmNwdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcHFfc3dhcCBfX2dtcHFfc3dhcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcHFfc3dhcCBfX0dNUF9QUk9UTyAoKG1wcV9wdHIsIG1wcV9wdHIpKSBfX0dNUF9OT1RIUk9XOworCisKKy8qKioqKioqKioqKioqKioqIEZsb2F0IChpLmUuIEYpIHJvdXRpbmVzLiAgKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBtcGZfYWJzIF9fZ21wZl9hYnMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FicyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfYWRkIF9fZ21wZl9hZGQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FkZCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfYWRkX3VpIF9fZ21wZl9hZGRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2FkZF91aSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisjZGVmaW5lIG1wZl9jZWlsIF9fZ21wZl9jZWlsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9jZWlsIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9jbGVhciBfX2dtcGZfY2xlYXIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2NsZWFyIF9fR01QX1BST1RPICgobXBmX3B0cikpOworCisjZGVmaW5lIG1wZl9jbXAgX19nbXBmX2NtcAorX19HTVBfREVDTFNQRUMgaW50IG1wZl9jbXAgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfY21wX2QgX19nbXBmX2NtcF9kCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcF9kIF9fR01QX1BST1RPICgobXBmX3NyY3B0ciwgZG91YmxlKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2NtcF9zaSBfX2dtcGZfY21wX3NpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcF9zaSBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIsIHNpZ25lZCBsb25nIGludCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2NtcF91aSBfX2dtcGZfY21wX3VpCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX2NtcF91aSBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZGl2IF9fZ21wZl9kaXYKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2RpdiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfZGl2XzJleHAgX19nbXBmX2Rpdl8yZXhwCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9kaXZfMmV4cCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX2Rpdl91aSBfX2dtcGZfZGl2X3VpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9kaXZfdWkgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9kdW1wIF9fZ21wZl9kdW1wCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9kdW1wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9lcSBfX2dtcGZfZXEKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZXEgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyLCBtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3NpbnRfcCBfX2dtcGZfZml0c19zaW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c19zaW50X3AgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c19zbG9uZ19wIF9fZ21wZl9maXRzX3Nsb25nX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c19zbG9uZ19wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfc3Nob3J0X3AgX19nbXBmX2ZpdHNfc3Nob3J0X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c19zc2hvcnRfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9maXRzX3VpbnRfcCBfX2dtcGZfZml0c191aW50X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c191aW50X3AgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZml0c191bG9uZ19wIF9fZ21wZl9maXRzX3Vsb25nX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c191bG9uZ19wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2ZpdHNfdXNob3J0X3AgX19nbXBmX2ZpdHNfdXNob3J0X3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfZml0c191c2hvcnRfcCBfX0dNUF9QUk9UTyAoKG1wZl9zcmNwdHIpKSBfX0dNUF9OT1RIUk9XIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wZl9mbG9vciBfX2dtcGZfZmxvb3IKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2Zsb29yIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9nZXRfZCBfX2dtcGZfZ2V0X2QKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcGZfZ2V0X2QgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9kXzJleHAgX19nbXBmX2dldF9kXzJleHAKK19fR01QX0RFQ0xTUEVDIGRvdWJsZSBtcGZfZ2V0X2RfMmV4cCBfX0dNUF9QUk9UTyAoKHNpZ25lZCBsb25nIGludCAqLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2dldF9kZWZhdWx0X3ByZWMgX19nbXBmX2dldF9kZWZhdWx0X3ByZWMKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wZl9nZXRfZGVmYXVsdF9wcmVjIF9fR01QX1BST1RPICgodm9pZCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9wcmVjIF9fZ21wZl9nZXRfcHJlYworX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXBmX2dldF9wcmVjIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX2dldF9zaSBfX2dtcGZfZ2V0X3NpCitfX0dNUF9ERUNMU1BFQyBsb25nIG1wZl9nZXRfc2kgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfZ2V0X3N0ciBfX2dtcGZfZ2V0X3N0cgorX19HTVBfREVDTFNQRUMgY2hhciAqbXBmX2dldF9zdHIgX19HTVBfUFJPVE8gKChjaGFyICosIG1wX2V4cF90ICosIGludCwgc2l6ZV90LCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2dldF91aSBfX2dtcGZfZ2V0X3VpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIG1wZl9nZXRfdWkgX19HTVBfUFJPVE8gKChtcGZfc3JjcHRyKSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcGZfaW5pdCBfX2dtcGZfaW5pdAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIpKTsKKworI2RlZmluZSBtcGZfaW5pdDIgX19nbXBmX2luaXQyCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0MiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0IF9fZ21wZl9pbml0X3NldAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfaW5pdF9zZXQgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX2luaXRfc2V0X2QgX19nbXBmX2luaXRfc2V0X2QKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0X2QgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBkb3VibGUpKTsKKworI2RlZmluZSBtcGZfaW5pdF9zZXRfc2kgX19nbXBmX2luaXRfc2V0X3NpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9pbml0X3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9pbml0X3NldF9zdHIgX19nbXBmX2luaXRfc2V0X3N0cgorX19HTVBfREVDTFNQRUMgaW50IG1wZl9pbml0X3NldF9zdHIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCkpOworCisjZGVmaW5lIG1wZl9pbml0X3NldF91aSBfX2dtcGZfaW5pdF9zZXRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX2luaXRfc2V0X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfaW5wX3N0ciBfX2dtcGZfaW5wX3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcGZfaW5wX3N0ciBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIEZJTEUgKiwgaW50KSk7CisjZW5kaWYKKworI2RlZmluZSBtcGZfaW50ZWdlcl9wIF9fZ21wZl9pbnRlZ2VyX3AKK19fR01QX0RFQ0xTUEVDIGludCBtcGZfaW50ZWdlcl9wIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX211bCBfX2dtcGZfbXVsCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9tdWwgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX211bF8yZXhwIF9fZ21wZl9tdWxfMmV4cAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfbXVsXzJleHAgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9tdWxfdWkgX19nbXBmX211bF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfbXVsX3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfbmVnIF9fZ21wZl9uZWcKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX25lZyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfb3V0X3N0ciBfX2dtcGZfb3V0X3N0cgorI2lmZGVmIF9HTVBfSF9IQVZFX0ZJTEUKK19fR01QX0RFQ0xTUEVDIHNpemVfdCBtcGZfb3V0X3N0ciBfX0dNUF9QUk9UTyAoKEZJTEUgKiwgaW50LCBzaXplX3QsIG1wZl9zcmNwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wZl9wb3dfdWkgX19nbXBmX3Bvd191aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcG93X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfcmFuZG9tMiBfX2dtcGZfcmFuZG9tMgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcmFuZG9tMiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wX3NpemVfdCwgbXBfZXhwX3QpKTsKKworI2RlZmluZSBtcGZfcmVsZGlmZiBfX2dtcGZfcmVsZGlmZgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfcmVsZGlmZiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2V0IF9fZ21wZl9zZXQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2V0X2QgX19nbXBmX3NldF9kCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfZCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIGRvdWJsZSkpOworCisjZGVmaW5lIG1wZl9zZXRfZGVmYXVsdF9wcmVjIF9fZ21wZl9zZXRfZGVmYXVsdF9wcmVjCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfZGVmYXVsdF9wcmVjIF9fR01QX1BST1RPICgodW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wZl9zZXRfcHJlYyBfX2dtcGZfc2V0X3ByZWMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9wcmVjIF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc2V0X3ByZWNfcmF3IF9fZ21wZl9zZXRfcHJlY19yYXcKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9wcmVjX3JhdyBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50KSkgX19HTVBfTk9USFJPVzsKKworI2RlZmluZSBtcGZfc2V0X3EgX19nbXBmX3NldF9xCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfcSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wcV9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2V0X3NpIF9fZ21wZl9zZXRfc2kKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NldF9zaSBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9zZXRfc3RyIF9fZ21wZl9zZXRfc3RyCitfX0dNUF9ERUNMU1BFQyBpbnQgbXBmX3NldF9zdHIgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCkpOworCisjZGVmaW5lIG1wZl9zZXRfdWkgX19nbXBmX3NldF91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc2V0X3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc2V0X3ogX19nbXBmX3NldF96CitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wZl9zZXRfeiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wel9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfc2l6ZSBfX2dtcGZfc2l6ZQorX19HTVBfREVDTFNQRUMgc2l6ZV90IG1wZl9zaXplIF9fR01QX1BST1RPICgobXBmX3NyY3B0cikpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBmX3NxcnQgX19nbXBmX3NxcnQKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NxcnQgX19HTVBfUFJPVE8gKChtcGZfcHRyLCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3NxcnRfdWkgX19nbXBmX3NxcnRfdWkKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3NxcnRfdWkgX19HTVBfUFJPVE8gKChtcGZfcHRyLCB1bnNpZ25lZCBsb25nIGludCkpOworCisjZGVmaW5lIG1wZl9zdWIgX19nbXBmX3N1YgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3ViIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl9zdWJfdWkgX19nbXBmX3N1Yl91aQorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3ViX3VpIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcGZfc3dhcCBfX2dtcGZfc3dhcAorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfc3dhcCBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIG1wZl9wdHIpKSBfX0dNUF9OT1RIUk9XOworCisjZGVmaW5lIG1wZl90cnVuYyBfX2dtcGZfdHJ1bmMKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3RydW5jIF9fR01QX1BST1RPICgobXBmX3B0ciwgbXBmX3NyY3B0cikpOworCisjZGVmaW5lIG1wZl91aV9kaXYgX19nbXBmX3VpX2RpdgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfdWlfZGl2IF9fR01QX1BST1RPICgobXBmX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wZl9zcmNwdHIpKTsKKworI2RlZmluZSBtcGZfdWlfc3ViIF9fZ21wZl91aV9zdWIKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBmX3VpX3N1YiBfX0dNUF9QUk9UTyAoKG1wZl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGZfc3JjcHRyKSk7CisKKyNkZWZpbmUgbXBmX3VyYW5kb21iIF9fZ21wZl91cmFuZG9tYgorX19HTVBfREVDTFNQRUMgdm9pZCBtcGZfdXJhbmRvbWIgX19HTVBfUFJPVE8gKChtcGZfdCwgZ21wX3JhbmRzdGF0ZV90LCB1bnNpZ25lZCBsb25nIGludCkpOworCisKKy8qKioqKioqKioqKiogTG93IGxldmVsIHBvc2l0aXZlLWludGVnZXIgKGkuZS4gTikgcm91dGluZXMuICAqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgdWdseSwgYnV0IHdlIG5lZWQgdG8gbWFrZSB1c2VyIGNhbGxzIHJlYWNoIHRoZSBwcmVmaXhlZCBmdW5jdGlvbi4gKi8KKworI2RlZmluZSBtcG5fYWRkIF9fTVBOKGFkZCkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGQgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsbXBfc2l6ZV90KSk7CisjZW5kaWYKKworI2RlZmluZSBtcG5fYWRkXzEgX19NUE4oYWRkXzEpCisjaWYgX19HTVBfSU5MSU5FX1BST1RPVFlQRVMgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXBuX2FkZF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpIF9fR01QX05PVEhST1c7CisjZW5kaWYKKworI2RlZmluZSBtcG5fYWRkX24gX19NUE4oYWRkX24pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2FkZF9uIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSk7CisKKyNkZWZpbmUgbXBuX2FkZG11bF8xIF9fTVBOKGFkZG11bF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9hZGRtdWxfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpOworCisjZGVmaW5lIG1wbl9iZGl2bW9kIF9fTVBOKGJkaXZtb2QpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2JkaXZtb2QgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgbG9uZyBpbnQpKTsKKworI2RlZmluZSBtcG5fY21wIF9fTVBOKGNtcCkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY21wKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9jbXAgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9kaXZleGFjdF9ieTMoZHN0LHNyYyxzaXplKSBcCisgIG1wbl9kaXZleGFjdF9ieTNjIChkc3QsIHNyYywgc2l6ZSwgX19HTVBfQ0FTVCAobXBfbGltYl90LCAwKSkKKworI2RlZmluZSBtcG5fZGl2ZXhhY3RfYnkzYyBfX01QTihkaXZleGFjdF9ieTNjKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9kaXZleGFjdF9ieTNjIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSk7CisKKyNkZWZpbmUgbXBuX2Rpdm1vZF8xKHFwLG5wLG5zaXplLGRsaW1iKSBcCisgIG1wbl9kaXZyZW1fMSAocXAsIF9fR01QX0NBU1QgKG1wX3NpemVfdCwgMCksIG5wLCBuc2l6ZSwgZGxpbWIpCisKKyNkZWZpbmUgbXBuX2RpdnJlbSBfX01QTihkaXZyZW0pCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fZGl2cmVtXzEgX19NUE4oZGl2cmVtXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbV8xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKTsKKworI2RlZmluZSBtcG5fZGl2cmVtXzIgX19NUE4oZGl2cmVtXzIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2RpdnJlbV8yIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIpKTsKKworI2RlZmluZSBtcG5fZ2NkIF9fTVBOKGdjZCkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fZ2NkIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9wdHIsIG1wX3NpemVfdCwgbXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fZ2NkXzEgX19NUE4oZ2NkXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX2djZF8xIF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9nY2RleHQgX19NUE4oZ2NkZXh0KQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9nY2RleHQgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90ICosIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9nZXRfc3RyIF9fTVBOKGdldF9zdHIpCitfX0dNUF9ERUNMU1BFQyBzaXplX3QgbXBuX2dldF9zdHIgX19HTVBfUFJPVE8gKCh1bnNpZ25lZCBjaGFyICosIGludCwgbXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5faGFtZGlzdCBfX01QTihoYW1kaXN0KQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXBuX2hhbWRpc3QgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NyY3B0ciwgbXBfc2l6ZV90KSkgX19HTVBfTk9USFJPVyBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fbHNoaWZ0IF9fTVBOKGxzaGlmdCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbHNoaWZ0IF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisKKyNkZWZpbmUgbXBuX21vZF8xIF9fTVBOKG1vZF8xKQorX19HTVBfREVDTFNQRUMgbXBfbGltYl90IG1wbl9tb2RfMSBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgbXBfc2l6ZV90LCBtcF9saW1iX3QpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fbXVsIF9fTVBOKG11bCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fbXVsIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fbXVsXzEgX19NUE4obXVsXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX211bF8xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSk7CisKKyNkZWZpbmUgbXBuX211bF9uIF9fTVBOKG11bF9uKQorX19HTVBfREVDTFNQRUMgdm9pZCBtcG5fbXVsX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fcGVyZmVjdF9zcXVhcmVfcCBfX01QTihwZXJmZWN0X3NxdWFyZV9wKQorX19HTVBfREVDTFNQRUMgaW50IG1wbl9wZXJmZWN0X3NxdWFyZV9wIF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9zaXplX3QpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fcG9wY291bnQgX19NUE4ocG9wY291bnQpCitfX0dNUF9ERUNMU1BFQyB1bnNpZ25lZCBsb25nIGludCBtcG5fcG9wY291bnQgX19HTVBfUFJPVE8gKChtcF9zcmNwdHIsIG1wX3NpemVfdCkpIF9fR01QX05PVEhST1cgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3Bvd18xIF9fTVBOKHBvd18xKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9wb3dfMSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfcHRyKSk7CisKKy8qIHVuZG9jdW1lbnRlZCBub3csIGJ1dCByZXRhaW5lZCBoZXJlIGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBtcG5fcHJlaW52X21vZF8xIF9fTVBOKHByZWludl9tb2RfMSkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fcHJlaW52X21vZF8xIF9fR01QX1BST1RPICgobXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX2xpbWJfdCwgbXBfbGltYl90KSkgX19HTVBfQVRUUklCVVRFX1BVUkU7CisKKyNkZWZpbmUgbXBuX3JhbmRvbSBfX01QTihyYW5kb20pCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9yYW5kb20gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9yYW5kb20yIF9fTVBOKHJhbmRvbTIpCitfX0dNUF9ERUNMU1BFQyB2b2lkIG1wbl9yYW5kb20yIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fcnNoaWZ0IF9fTVBOKHJzaGlmdCkKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fcnNoaWZ0IF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgdW5zaWduZWQgaW50KSk7CisKKyNkZWZpbmUgbXBuX3NjYW4wIF9fTVBOKHNjYW4wKQorX19HTVBfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBpbnQgbXBuX3NjYW4wIF9fR01QX1BST1RPICgobXBfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCkpIF9fR01QX0FUVFJJQlVURV9QVVJFOworCisjZGVmaW5lIG1wbl9zY2FuMSBfX01QTihzY2FuMSkKK19fR01QX0RFQ0xTUEVDIHVuc2lnbmVkIGxvbmcgaW50IG1wbl9zY2FuMSBfX0dNUF9QUk9UTyAoKG1wX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQpKSBfX0dNUF9BVFRSSUJVVEVfUFVSRTsKKworI2RlZmluZSBtcG5fc2V0X3N0ciBfX01QTihzZXRfc3RyKQorX19HTVBfREVDTFNQRUMgbXBfc2l6ZV90IG1wbl9zZXRfc3RyIF9fR01QX1BST1RPICgobXBfcHRyLCBfX2dtcF9jb25zdCB1bnNpZ25lZCBjaGFyICosIHNpemVfdCwgaW50KSk7CisKKyNkZWZpbmUgbXBuX3NxcnRyZW0gX19NUE4oc3FydHJlbSkKK19fR01QX0RFQ0xTUEVDIG1wX3NpemVfdCBtcG5fc3FydHJlbSBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCkpOworCisjZGVmaW5lIG1wbl9zdWIgX19NUE4oc3ViKQorI2lmIF9fR01QX0lOTElORV9QUk9UT1RZUEVTIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWIpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1YiBfX0dNUF9QUk9UTyAoKG1wX3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QsIG1wX3NyY3B0cixtcF9zaXplX3QpKTsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9zdWJfMSBfX01QTihzdWJfMSkKKyNpZiBfX0dNUF9JTkxJTkVfUFJPVE9UWVBFUyB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1Yl8xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSkgX19HTVBfTk9USFJPVzsKKyNlbmRpZgorCisjZGVmaW5lIG1wbl9zdWJfbiBfX01QTihzdWJfbikKK19fR01QX0RFQ0xTUEVDIG1wX2xpbWJfdCBtcG5fc3ViX24gX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3NyY3B0ciwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworI2RlZmluZSBtcG5fc3VibXVsXzEgX19NUE4oc3VibXVsXzEpCitfX0dNUF9ERUNMU1BFQyBtcF9saW1iX3QgbXBuX3N1Ym11bF8xIF9fR01QX1BST1RPICgobXBfcHRyLCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfbGltYl90KSk7CisKKyNkZWZpbmUgbXBuX3RkaXZfcXIgX19NUE4odGRpdl9xcikKK19fR01QX0RFQ0xTUEVDIHZvaWQgbXBuX3RkaXZfcXIgX19HTVBfUFJPVE8gKChtcF9wdHIsIG1wX3B0ciwgbXBfc2l6ZV90LCBtcF9zcmNwdHIsIG1wX3NpemVfdCwgbXBfc3JjcHRyLCBtcF9zaXplX3QpKTsKKworCisvKioqKioqKioqKioqKioqKiBtcHogaW5saW5lcyAqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBwcm92aWRlZCBhcyBpbmxpbmVzIHdoZXJlIHBvc3NpYmxlLCBidXQgYWx3YXlzIGV4aXN0IGFzCisgICBsaWJyYXJ5IGZ1bmN0aW9ucyB0b28sIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKworICAgV2l0aGluIGdtcCBpdHNlbGYgdGhpcyBpbmxpbmluZyBnZW5lcmFsbHkgaXNuJ3QgcmVsaWVkIG9uLCBzaW5jZSBpdAorICAgZG9lc24ndCBnZXQgZG9uZSBmb3IgYWxsIGNvbXBpbGVycywgd2hlcmVhcyBpZiBzb21ldGhpbmcgaXMgd29ydGgKKyAgIGlubGluaW5nIHRoZW4gaXQncyB3b3J0aCBhcnJhbmdpbmcgYWx3YXlzLgorCisgICBUaGVyZSBhcmUgdHdvIHN0eWxlcyBvZiBpbmxpbmluZyBoZXJlLiAgV2hlbiB0aGUgc2FtZSBiaXQgb2YgY29kZSBpcworICAgd2FudGVkIGZvciB0aGUgaW5saW5lIGFzIGZvciB0aGUgbGlicmFyeSB2ZXJzaW9uLCB0aGVuIF9fR01QX0ZPUkNFX2ZvbworICAgYXJyYW5nZXMgZm9yIHRoYXQgY29kZSB0byBiZSBlbWl0dGVkIGFuZCB0aGUgX19HTVBfRVhURVJOX0lOTElORQorICAgZGlyZWN0aXZlIHN1cHByZXNzZWQsIGVnLiBtcHpfZml0c191aW50X3AuICBXaGVuIGEgZGlmZmVyZW50IGJpdCBvZiBjb2RlCisgICBpcyB3YW50ZWQgZm9yIHRoZSBpbmxpbmUgdGhhbiBmb3IgdGhlIGxpYnJhcnkgdmVyc2lvbiwgdGhlbgorICAgX19HTVBfRk9SQ0VfZm9vIGFycmFuZ2VzIHRoZSBpbmxpbmUgdG8gYmUgc3VwcHJlc3NlZCwgZWcuIG1wel9hYnMuICAqLworCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgJiYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfYWJzKQorX19HTVBfRVhURVJOX0lOTElORSB2b2lkCittcHpfYWJzIChtcHpfcHRyIF9fZ21wX3csIG1wel9zcmNwdHIgX19nbXBfdSkKK3sKKyAgaWYgKF9fZ21wX3cgIT0gX19nbXBfdSkKKyAgICBtcHpfc2V0IChfX2dtcF93LCBfX2dtcF91KTsKKyAgX19nbXBfdy0+X21wX3NpemUgPSBfX0dNUF9BQlMgKF9fZ21wX3ctPl9tcF9zaXplKTsKK30KKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA9PSAwCisjZGVmaW5lIF9fR01QWl9GSVRTX1VUWVBFX1AoeixtYXh2YWwpCQkJCQlcCisgIG1wX3NpemVfdCAgX19nbXBfbiA9IHotPl9tcF9zaXplOwkJCQkJXAorICBtcF9wdHIgIF9fZ21wX3AgPSB6LT5fbXBfZDsJCQkJCQlcCisgIHJldHVybiAoX19nbXBfbiA9PSAwIHx8IChfX2dtcF9uID09IDEgJiYgX19nbXBfcFswXSA8PSBtYXh2YWwpKTsKKyNlbHNlCisjZGVmaW5lIF9fR01QWl9GSVRTX1VUWVBFX1AoeixtYXh2YWwpCQkJCQlcCisgIG1wX3NpemVfdCAgX19nbXBfbiA9IHotPl9tcF9zaXplOwkJCQkJXAorICBtcF9wdHIgIF9fZ21wX3AgPSB6LT5fbXBfZDsJCQkJCQlcCisgIHJldHVybiAoX19nbXBfbiA9PSAwIHx8IChfX2dtcF9uID09IDEgJiYgX19nbXBfcFswXSA8PSBtYXh2YWwpCVwKKwkgIHx8IChfX2dtcF9uID09IDIgJiYgX19nbXBfcFsxXSA8PSAoKG1wX2xpbWJfdCkgbWF4dmFsID4+IEdNUF9OVU1CX0JJVFMpKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VpbnRfcCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VpbnRfcCkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgoraW50CittcHpfZml0c191aW50X3AgKG1wel9zcmNwdHIgX19nbXBfeikgX19HTVBfTk9USFJPVworeworICBfX0dNUFpfRklUU19VVFlQRV9QIChfX2dtcF96LCBfX0dNUF9VSU5UX01BWCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3Vsb25nX3ApCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191bG9uZ19wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wel9maXRzX3Vsb25nX3AgKG1wel9zcmNwdHIgX19nbXBfeikgX19HTVBfTk9USFJPVworeworICBfX0dNUFpfRklUU19VVFlQRV9QIChfX2dtcF96LCBfX0dNUF9VTE9OR19NQVgpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfZml0c191c2hvcnRfcCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9maXRzX3VzaG9ydF9wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wel9maXRzX3VzaG9ydF9wIChtcHpfc3JjcHRyIF9fZ21wX3opIF9fR01QX05PVEhST1cKK3sKKyAgX19HTVBaX0ZJVFNfVVRZUEVfUCAoX19nbXBfeiwgX19HTVBfVVNIUlRfTUFYKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X2dldF91aSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9nZXRfdWkpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK3Vuc2lnbmVkIGxvbmcKK21wel9nZXRfdWkgKG1wel9zcmNwdHIgX19nbXBfeikgX19HTVBfTk9USFJPVworeworICBtcF9wdHIgX19nbXBfcCA9IF9fZ21wX3otPl9tcF9kOworICBtcF9zaXplX3QgX19nbXBfbiA9IF9fZ21wX3otPl9tcF9zaXplOworICBtcF9saW1iX3QgX19nbXBfbCA9IF9fZ21wX3BbMF07CisgIC8qIFRoaXMgaXMgYSAiI2lmIiByYXRoZXIgdGhhbiBhIHBsYWluICJpZiIgc28gYXMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzCisgICAgIGFib3V0ICI8PCBHTVBfTlVNQl9CSVRTIiBleGNlZWRpbmcgdGhlIHR5cGUgc2l6ZSwgYW5kIHRvIGF2b2lkIEJvcmxhbmQKKyAgICAgQysrIDYuMCB3YXJuaW5ncyBhYm91dCBjb25kaXRpb24gYWx3YXlzIHRydWUgZm9yIHNvbWV0aGluZyBsaWtlCisgICAgICJfX0dNUF9VTE9OR19NQVggPCBHTVBfTlVNQl9NQVNLIi4gICovCisjaWYgR01QX05BSUxfQklUUyA9PSAwIHx8IGRlZmluZWQgKF9MT05HX0xPTkdfTElNQikKKyAgLyogbGltYj09bG9uZyBhbmQgbm8gbmFpbHMsIG9yIGxpbWI9PWxvbmdsb25nLCBvbmUgbGltYiBpcyBlbm91Z2ggKi8KKyAgcmV0dXJuIChfX2dtcF9uICE9IDAgPyBfX2dtcF9sIDogMCk7CisjZWxzZQorICAvKiBsaW1iPT1sb25nIGFuZCBuYWlscywgbmVlZCB0d28gbGltYnMgd2hlbiBhdmFpbGFibGUgKi8KKyAgX19nbXBfbiA9IF9fR01QX0FCUyAoX19nbXBfbik7CisgIGlmIChfX2dtcF9uIDw9IDEpCisgICAgcmV0dXJuIChfX2dtcF9uICE9IDAgPyBfX2dtcF9sIDogMCk7CisgIGVsc2UKKyAgICByZXR1cm4gX19nbXBfbCArIChfX2dtcF9wWzFdIDw8IEdNUF9OVU1CX0JJVFMpOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9nZXRsaW1ibikKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9nZXRsaW1ibikKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorbXBfbGltYl90CittcHpfZ2V0bGltYm4gKG1wel9zcmNwdHIgX19nbXBfeiwgbXBfc2l6ZV90IF9fZ21wX24pIF9fR01QX05PVEhST1cKK3sKKyAgbXBfbGltYl90ICBfX2dtcF9yZXN1bHQgPSAwOworICBpZiAoX19HTVBfTElLRUxZIChfX2dtcF9uID49IDAgJiYgX19nbXBfbiA8IF9fR01QX0FCUyAoX19nbXBfei0+X21wX3NpemUpKSkKKyAgICBfX2dtcF9yZXN1bHQgPSBfX2dtcF96LT5fbXBfZFtfX2dtcF9uXTsKKyAgcmV0dXJuIF9fZ21wX3Jlc3VsdDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgJiYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfbmVnKQorX19HTVBfRVhURVJOX0lOTElORSB2b2lkCittcHpfbmVnIChtcHpfcHRyIF9fZ21wX3csIG1wel9zcmNwdHIgX19nbXBfdSkKK3sKKyAgaWYgKF9fZ21wX3cgIT0gX19nbXBfdSkKKyAgICBtcHpfc2V0IChfX2dtcF93LCBfX2dtcF91KTsKKyAgX19nbXBfdy0+X21wX3NpemUgPSAtIF9fZ21wX3ctPl9tcF9zaXplOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcGVyZmVjdF9zcXVhcmVfcCkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9wZXJmZWN0X3NxdWFyZV9wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wel9wZXJmZWN0X3NxdWFyZV9wIChtcHpfc3JjcHRyIF9fZ21wX2EpCit7CisgIG1wX3NpemVfdCBfX2dtcF9hc2l6ZTsKKyAgaW50ICAgICAgIF9fZ21wX3Jlc3VsdDsKKworICBfX2dtcF9hc2l6ZSA9IF9fZ21wX2EtPl9tcF9zaXplOworICBfX2dtcF9yZXN1bHQgPSAoX19nbXBfYXNpemUgPj0gMCk7ICAvKiB6ZXJvIGlzIGEgc3F1YXJlLCBuZWdhdGl2ZXMgYXJlIG5vdCAqLworICBpZiAoX19HTVBfTElLRUxZIChfX2dtcF9hc2l6ZSA+IDApKQorICAgIF9fZ21wX3Jlc3VsdCA9IG1wbl9wZXJmZWN0X3NxdWFyZV9wIChfX2dtcF9hLT5fbXBfZCwgX19nbXBfYXNpemUpOworICByZXR1cm4gX19nbXBfcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcG9wY291bnQpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfcG9wY291bnQpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK3Vuc2lnbmVkIGxvbmcKK21wel9wb3Bjb3VudCAobXB6X3NyY3B0ciBfX2dtcF91KSBfX0dNUF9OT1RIUk9XCit7CisgIG1wX3NpemVfdCAgICAgIF9fZ21wX3VzaXplOworICB1bnNpZ25lZCBsb25nICBfX2dtcF9yZXN1bHQ7CisKKyAgX19nbXBfdXNpemUgPSBfX2dtcF91LT5fbXBfc2l6ZTsKKyAgX19nbXBfcmVzdWx0ID0gKF9fZ21wX3VzaXplIDwgMCA/IF9fR01QX1VMT05HX01BWCA6IDApOworICBpZiAoX19HTVBfTElLRUxZIChfX2dtcF91c2l6ZSA+IDApKQorICAgIF9fZ21wX3Jlc3VsdCA9ICBtcG5fcG9wY291bnQgKF9fZ21wX3UtPl9tcF9kLCBfX2dtcF91c2l6ZSk7CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zZXRfcSkKKyNpZiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wel9zZXRfcSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgordm9pZAorbXB6X3NldF9xIChtcHpfcHRyIF9fZ21wX3csIG1wcV9zcmNwdHIgX19nbXBfdSkKK3sKKyAgbXB6X3RkaXZfcSAoX19nbXBfdywgbXBxX251bXJlZiAoX19nbXBfdSksIG1wcV9kZW5yZWYgKF9fZ21wX3UpKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgfHwgZGVmaW5lZCAoX19HTVBfRk9SQ0VfbXB6X3NpemUpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHpfc2l6ZSkKK19fR01QX0VYVEVSTl9JTkxJTkUKKyNlbmRpZgorc2l6ZV90CittcHpfc2l6ZSAobXB6X3NyY3B0ciBfX2dtcF96KSBfX0dNUF9OT1RIUk9XCit7CisgIHJldHVybiBfX0dNUF9BQlMgKF9fZ21wX3otPl9tcF9zaXplKTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIG1wcSBpbmxpbmVzICoqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSAmJiAhIGRlZmluZWQgKF9fR01QX0ZPUkNFX21wcV9hYnMpCitfX0dNUF9FWFRFUk5fSU5MSU5FIHZvaWQKK21wcV9hYnMgKG1wcV9wdHIgX19nbXBfdywgbXBxX3NyY3B0ciBfX2dtcF91KQoreworICBpZiAoX19nbXBfdyAhPSBfX2dtcF91KQorICAgIG1wcV9zZXQgKF9fZ21wX3csIF9fZ21wX3UpOworICBfX2dtcF93LT5fbXBfbnVtLl9tcF9zaXplID0gX19HTVBfQUJTIChfX2dtcF93LT5fbXBfbnVtLl9tcF9zaXplKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19HTVBfRVhURVJOX0lOTElORSkgJiYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcHFfbmVnKQorX19HTVBfRVhURVJOX0lOTElORSB2b2lkCittcHFfbmVnIChtcHFfcHRyIF9fZ21wX3csIG1wcV9zcmNwdHIgX19nbXBfdSkKK3sKKyAgaWYgKF9fZ21wX3cgIT0gX19nbXBfdSkKKyAgICBtcHFfc2V0IChfX2dtcF93LCBfX2dtcF91KTsKKyAgX19nbXBfdy0+X21wX251bS5fbXBfc2l6ZSA9IC0gX19nbXBfdy0+X21wX251bS5fbXBfc2l6ZTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqIG1wbiBpbmxpbmVzICoqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBjb21tZW50cyB3aXRoIF9fR01QTl9BRERfMSBiZWxvdyBhcHBseSBoZXJlIHRvby4KKworICAgVGhlIHRlc3QgZm9yIEZVTkNUSU9OIHJldHVybmluZyAwIHNob3VsZCBwcmVkaWN0IHdlbGwuICBJZiBpdCdzIGFzc3VtZWQKKyAgIHt5cCx5c2l6ZX0gd2lsbCB1c3VhbGx5IGhhdmUgYSByYW5kb20gbnVtYmVyIG9mIGJpdHMgdGhlbiB0aGUgaGlnaCBsaW1iCisgICB3b24ndCBiZSBmdWxsIGFuZCBhIGNhcnJ5IG91dCB3aWxsIG9jY3VyIGEgZ29vZCBkZWFsIGxlc3MgdGhhbiA1MCUgb2YgdGhlCisgICB0aW1lLgorCisgICB5c2l6ZT09MCBpc24ndCBhIGRvY3VtZW50ZWQgZmVhdHVyZSwgYnV0IGlzIHVzZWQgaW50ZXJuYWxseSBpbiBhIGZldworICAgcGxhY2VzLgorCisgICBQcm9kdWNpbmcgY291dCBsYXN0IHN0b3BzIGl0IHVzaW5nIHVwIGEgcmVnaXN0ZXIgZHVyaW5nIHRoZSBtYWluIHBhcnQgb2YKKyAgIHRoZSBjYWxjdWxhdGlvbiwgdGhvdWdoIGdjYyAoYXMgb2YgMy4wKSBvbiBhbiAiaWYgKG1wbl9hZGQgKC4uLikpIgorICAgZG9lc24ndCBzZWVtIGFibGUgdG8gbW92ZSB0aGUgdHJ1ZSBhbmQgZmFsc2UgbGVncyBvZiB0aGUgY29uZGl0aW9uYWwgdXAKKyAgIHRvIHRoZSB0d28gcGxhY2VzIGNvdXQgaXMgZ2VuZXJhdGVkLiAgKi8KKworI2RlZmluZSBfX0dNUE5fQU9SUyhjb3V0LCB3cCwgeHAsIHhzaXplLCB5cCwgeXNpemUsIEZVTkNUSU9OLCBURVNUKSAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCAgX19nbXBfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX2xpbWJfdCAgX19nbXBfeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHlzaXplKSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHhzaXplKSA+PSAoeXNpemUpKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEUyX1AgKHdwLCB4c2l6ZSwgeHAsIHhzaXplKSk7ICovICAgICAgXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEUyX1AgKHdwLCB4c2l6ZSwgeXAsIHlzaXplKSk7ICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fZ21wX2kgPSAoeXNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2dtcF9pICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoRlVOQ1RJT04gKHdwLCB4cCwgeXAsIF9fZ21wX2kpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChfX2dtcF9pID49ICh4c2l6ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoY291dCkgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBnb3RvIF9fZ21wX2RvbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fZ21wX3ggPSAoeHApW19fZ21wX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUgKFRFU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgod3ApICE9ICh4cCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19HTVBOX0NPUFlfUkVTVCAod3AsIHhwLCB4c2l6ZSwgX19nbXBfaSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjb3V0KSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dtcF9kb25lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fR01QTl9BREQoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplKSAgICAgICAgICAgICAgXAorICBfX0dNUE5fQU9SUyAoY291dCwgd3AsIHhwLCB4c2l6ZSwgeXAsIHlzaXplLCBtcG5fYWRkX24sICAgICAgIFwKKyAgICAgICAgICAgICAgICgoKHdwKVtfX2dtcF9pKytdID0gKF9fZ21wX3ggKyAxKSAmIEdNUF9OVU1CX01BU0spID09IDApKQorI2RlZmluZSBfX0dNUE5fU1VCKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSkgICAgICAgICAgICAgIFwKKyAgX19HTVBOX0FPUlMgKGNvdXQsIHdwLCB4cCwgeHNpemUsIHlwLCB5c2l6ZSwgbXBuX3N1Yl9uLCAgICAgICBcCisgICAgICAgICAgICAgICAoKCh3cClbX19nbXBfaSsrXSA9IChfX2dtcF94IC0gMSkgJiBHTVBfTlVNQl9NQVNLKSwgX19nbXBfeCA9PSAwKSkKKworCisvKiBUaGUgdXNlIG9mIF9fZ21wX2kgaW5kZXhpbmcgaXMgZGVzaWduZWQgdG8gZW5zdXJlIGEgY29tcGlsZSB0aW1lIHNyYz09ZHN0CisgICByZW1haW5zIG5pY2UgYW5kIGNsZWFyIHRvIHRoZSBjb21waWxlciwgc28gdGhhdCBfX0dNUE5fQ09QWV9SRVNUIGNhbgorICAgZGlzYXBwZWFyLCBhbmQgdGhlIGxvYWQvYWRkL3N0b3JlIGdldHMgYSBjaGFuY2UgdG8gYmVjb21lIGEKKyAgIHJlYWQtbW9kaWZ5LXdyaXRlIG9uIENJU0MgQ1BVcy4KKworICAgQWx0ZXJuYXRpdmVzOgorCisgICBVc2luZyBhIHBhaXIgb2YgcG9pbnRlcnMgaW5zdGVhZCBvZiBpbmRleGluZyB3b3VsZCBiZSBwb3NzaWJsZSwgYnV0IGdjYworICAgaXNuJ3QgYWJsZSB0byByZWNvZ25pc2UgY29tcGlsZS10aW1lIHNyYz09ZHN0IGluIHRoYXQgY2FzZSwgZXZlbiB3aGVuIHRoZQorICAgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIG1vcmUgb3IgbGVzcyB0b2dldGhlci4gIE90aGVyIGNvbXBpbGVycyB3b3VsZAorICAgdmVyeSBsaWtlbHkgaGF2ZSBzaW1pbGFyIGRpZmZpY3VsdHkuCisKKyAgIGdjYyBjb3VsZCB1c2UgImlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzcmM9PWRzdCkgJiYgc3JjPT1kc3QpIiBvcgorICAgc2ltaWxhciB0byBkZXRlY3QgYSBjb21waWxlLXRpbWUgc3JjPT1kc3QuICBUaGlzIHdvcmtzIG5pY2VseSBvbiBnY2MKKyAgIDIuOTUueCwgaXQncyBub3QgZ29vZCBvbiBnY2MgMy4wIHdoZXJlIF9fYnVpbHRpbl9jb25zdGFudF9wKHA9PXApIHNlZW1zCisgICB0byBiZSBhbHdheXMgZmFsc2UsIGZvciBhIHBvaW50ZXIgcC4gIEJ1dCB0aGUgY3VycmVudCBjb2RlIGZvcm0gc2VlbXMKKyAgIGdvb2QgZW5vdWdoIGZvciBzcmM9PWRzdCBhbnl3YXkuCisKKyAgIGdjYyBvbiB4ODYgYXMgdXN1YWwgZG9lc24ndCBnaXZlIHBhcnRpY3VsYXJseSBnb29kIGZsYWdzIGhhbmRsaW5nIGZvciB0aGUKKyAgIGNhcnJ5L2JvcnJvdyBkZXRlY3Rpb24uICBJdCdzIHRlbXB0aW5nIHRvIHdhbnQgc29tZSBtdWx0aSBpbnN0cnVjdGlvbiBhc20KKyAgIGJsb2NrcyB0byBoZWxwIGl0LCBhbmQgdGhpcyB3YXMgdHJpZWQsIGJ1dCBpbiB0cnV0aCB0aGVyZSdzIG9ubHkgYSBmZXcKKyAgIGluc3RydWN0aW9ucyB0byBzYXZlIGFuZCBhbnkgZ2FpbiBpcyBhbGwgdG9vIGVhc2lseSBsb3N0IGJ5IHJlZ2lzdGVyCisgICBqdWdnbGluZyBzZXR0aW5nIHVwIGZvciB0aGUgYXNtLiAgKi8KKworI2lmIEdNUF9OQUlMX0JJVFMgPT0gMAorI2RlZmluZSBfX0dNUE5fQU9SU18xKGNvdXQsIGRzdCwgc3JjLCBuLCB2LCBPUCwgQ0IpCQlcCisgIGRvIHsJCQkJCQkJCVwKKyAgICBtcF9zaXplX3QgIF9fZ21wX2k7CQkJCQkJXAorICAgIG1wX2xpbWJfdCAgX19nbXBfeCwgX19nbXBfcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJXAorICAgIC8qIEFTU0VSVCAoKG4pID49IDEpOyAqLwkJCQkJXAorICAgIC8qIEFTU0VSVCAoTVBOX1NBTUVfT1JfU0VQQVJBVEVfUCAoZHN0LCBzcmMsIG4pKTsgKi8JXAorCQkJCQkJCQlcCisgICAgX19nbXBfeCA9IChzcmMpWzBdOwkJCQkJCVwKKyAgICBfX2dtcF9yID0gX19nbXBfeCBPUCAodik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRzdClbMF0gPSBfX2dtcF9yOwkJCQkJCVwKKyAgICBpZiAoQ0IgKF9fZ21wX3IsIF9fZ21wX3gsICh2KSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7CQkJCQkJCQlcCisJKGNvdXQpID0gMTsJCQkJCQlcCisJZm9yIChfX2dtcF9pID0gMTsgX19nbXBfaSA8IChuKTspICAgICAgICAgICAgICAgICAgICAgICBcCisJICB7CQkJCQkJCVwKKwkgICAgX19nbXBfeCA9IChzcmMpW19fZ21wX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgX19nbXBfciA9IF9fZ21wX3ggT1AgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKGRzdClbX19nbXBfaV0gPSBfX2dtcF9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKytfX2dtcF9pOwkJCQkJCVwKKwkgICAgaWYgKCFDQiAoX19nbXBfciwgX19nbXBfeCwgMSkpICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICB7CQkJCQkJCVwKKwkJaWYgKChzcmMpICE9IChkc3QpKQkJCQlcCisJCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIF9fZ21wX2kpOyAgICAgIFwKKwkJKGNvdXQpID0gMDsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJXAorCSAgICAgIH0JCQkJCQkJXAorCSAgfQkJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgICAgZWxzZQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQlcCisJaWYgKChzcmMpICE9IChkc3QpKQkJCQkJXAorCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIDEpOwkJCVwKKwkoY291dCkgPSAwOwkJCQkJCVwKKyAgICAgIH0JCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgR01QX05BSUxfQklUUyA+PSAxCisjZGVmaW5lIF9fR01QTl9BT1JTXzEoY291dCwgZHN0LCBzcmMsIG4sIHYsIE9QLCBDQikJCVwKKyAgZG8gewkJCQkJCQkJXAorICAgIG1wX3NpemVfdCAgX19nbXBfaTsJCQkJCQlcCisgICAgbXBfbGltYl90ICBfX2dtcF94LCBfX2dtcF9yOwkJCQlcCisJCQkJCQkJCVwKKyAgICAvKiBBU1NFUlQgKChuKSA+PSAxKTsgKi8JCQkJCVwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKGRzdCwgc3JjLCBuKSk7ICovCVwKKwkJCQkJCQkJXAorICAgIF9fZ21wX3ggPSAoc3JjKVswXTsJCQkJCQlcCisgICAgX19nbXBfciA9IF9fZ21wX3ggT1AgKHYpOwkJCQkJXAorICAgIChkc3QpWzBdID0gX19nbXBfciAmIEdNUF9OVU1CX01BU0s7CQkJCVwKKyAgICBpZiAoX19nbXBfciA+PiBHTVBfTlVNQl9CSVRTICE9IDApCQkJCVwKKyAgICAgIHsJCQkJCQkJCVwKKwkoY291dCkgPSAxOwkJCQkJCVwKKwlmb3IgKF9fZ21wX2kgPSAxOyBfX2dtcF9pIDwgKG4pOykJCQlcCisJICB7CQkJCQkJCVwKKwkgICAgX19nbXBfeCA9IChzcmMpW19fZ21wX2ldOwkJCQlcCisJICAgIF9fZ21wX3IgPSBfX2dtcF94IE9QIDE7CQkJCVwKKwkgICAgKGRzdClbX19nbXBfaV0gPSBfX2dtcF9yICYgR01QX05VTUJfTUFTSzsJCVwKKwkgICAgKytfX2dtcF9pOwkJCQkJCVwKKwkgICAgaWYgKF9fZ21wX3IgPj4gR01QX05VTUJfQklUUyA9PSAwKQkJCVwKKwkgICAgICB7CQkJCQkJCVwKKwkJaWYgKChzcmMpICE9IChkc3QpKQkJCQlcCisJCSAgX19HTVBOX0NPUFlfUkVTVCAoZHN0LCBzcmMsIG4sIF9fZ21wX2kpOwlcCisJCShjb3V0KSA9IDA7CQkJCQlcCisJCWJyZWFrOwkJCQkJCVwKKwkgICAgICB9CQkJCQkJCVwKKwkgIH0JCQkJCQkJXAorICAgICAgfQkJCQkJCQkJXAorICAgIGVsc2UJCQkJCQkJXAorICAgICAgewkJCQkJCQkJXAorCWlmICgoc3JjKSAhPSAoZHN0KSkJCQkJCVwKKwkgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBuLCAxKTsJCQlcCisJKGNvdXQpID0gMDsJCQkJCQlcCisgICAgICB9CQkJCQkJCQlcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBfX0dNUE5fQUREQ0Iocix4LHkpICgocikgPCAoeSkpCisjZGVmaW5lIF9fR01QTl9TVUJDQihyLHgseSkgKCh4KSA8ICh5KSkKKworI2RlZmluZSBfX0dNUE5fQUREXzEoY291dCwgZHN0LCBzcmMsIG4sIHYpCSAgICAgXAorICBfX0dNUE5fQU9SU18xKGNvdXQsIGRzdCwgc3JjLCBuLCB2LCArLCBfX0dNUE5fQUREQ0IpCisjZGVmaW5lIF9fR01QTl9TVUJfMShjb3V0LCBkc3QsIHNyYywgbiwgdikJICAgICBcCisgIF9fR01QTl9BT1JTXzEoY291dCwgZHN0LCBzcmMsIG4sIHYsIC0sIF9fR01QTl9TVUJDQikKKworCisvKiBDb21wYXJlIHt4cCxzaXplfSBhbmQge3lwLHNpemV9LCBzZXR0aW5nICJyZXN1bHQiIHRvIHBvc2l0aXZlLCB6ZXJvIG9yCisgICBuZWdhdGl2ZS4gIHNpemU9PTAgaXMgYWxsb3dlZC4gIE9uIHJhbmRvbSBkYXRhIHVzdWFsbHkgb25seSBvbmUgbGltYiB3aWxsCisgICBuZWVkIHRvIGJlIGV4YW1pbmVkIHRvIGdldCBhIHJlc3VsdCwgc28gaXQncyB3b3J0aCBoYXZpbmcgaXQgaW5saW5lLiAgKi8KKyNkZWZpbmUgX19HTVBOX0NNUChyZXN1bHQsIHhwLCB5cCwgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9zaXplX3QgIF9fZ21wX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtcF9saW1iX3QgIF9fZ21wX3gsIF9fZ21wX3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzaXplKSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocmVzdWx0KSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2dtcF9pID0gKHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoLS1fX2dtcF9pID49IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19nbXBfeCA9ICh4cClbX19nbXBfaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19nbXBfeSA9ICh5cClbX19nbXBfaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fZ21wX3ggIT0gX19nbXBfeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIENhbm5vdCB1c2UgX19nbXBfeCAtIF9fZ21wX3ksIG1heSBvdmVyZmxvdyBhbiAiaW50IiAqLyAgIFwKKyAgICAgICAgICAgIChyZXN1bHQpID0gKF9fZ21wX3ggPiBfX2dtcF95ID8gMSA6IC0xKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisjaWYgZGVmaW5lZCAoX19HTVBOX0NPUFkpICYmICEgZGVmaW5lZCAoX19HTVBOX0NPUFlfUkVTVCkKKyNkZWZpbmUgX19HTVBOX0NPUFlfUkVTVChkc3QsIHNyYywgc2l6ZSwgc3RhcnQpICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHN0YXJ0KSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzdGFydCkgPD0gKHNpemUpKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19HTVBOX0NPUFkgKChkc3QpKyhzdGFydCksIChzcmMpKyhzdGFydCksIChzaXplKS0oc3RhcnQpKTsgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENvcHkge3NyYyxzaXplfSB0byB7ZHN0LHNpemV9LCBzdGFydGluZyBhdCAic3RhcnQiLiAgVGhpcyBpcyBkZXNpZ25lZCB0bworICAga2VlcCB0aGUgaW5kZXhpbmcgZHN0W2pdIGFuZCBzcmNbal0gbmljZSBhbmQgc2ltcGxlIGZvciBfX0dNUE5fQUREXzEsCisgICBfX0dNUE5fQURELCBldGMuICAqLworI2lmICEgZGVmaW5lZCAoX19HTVBOX0NPUFlfUkVTVCkKKyNkZWZpbmUgX19HTVBOX0NPUFlfUkVTVChkc3QsIHNyYywgc2l6ZSwgc3RhcnQpICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1wX3NpemVfdCBfX2dtcF9qOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKChzaXplKSA+PSAwKTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQVNTRVJUICgoc3RhcnQpID49IDApOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEFTU0VSVCAoKHN0YXJ0KSA8PSAoc2l6ZSkpOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBBU1NFUlQgKE1QTl9TQU1FX09SX1NFUEFSQVRFX1AgKGRzdCwgc3JjLCBzaXplKSk7ICovICAgICBcCisgICAgX19HTVBfQ1JBWV9QcmFnbWEgKCJfQ1JJIGl2ZGVwIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoX19nbXBfaiA9IChzdGFydCk7IF9fZ21wX2ogPCAoc2l6ZSk7IF9fZ21wX2orKykgICAgICAgIFwKKyAgICAgIChkc3QpW19fZ21wX2pdID0gKHNyYylbX19nbXBfal07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogRW5oYW5jZW1lbnQ6IFVzZSBzb21lIG9mIHRoZSBzbWFydGVyIGNvZGUgZnJvbSBnbXAtaW1wbC5oLiAgTWF5YmUgdXNlCisgICBtcG5fY29weWkgaWYgdGhlcmUncyBhIG5hdGl2ZSB2ZXJzaW9uLCBhbmQgaWYgd2UgZG9uJ3QgbWluZCBkZW1hbmRpbmcKKyAgIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBpdCAob24gdGFyZ2V0cyB3aGljaCB1c2UgaXQpLiAgKi8KKworI2lmICEgZGVmaW5lZCAoX19HTVBOX0NPUFkpCisjZGVmaW5lIF9fR01QTl9DT1BZKGRzdCwgc3JjLCBzaXplKSAgIF9fR01QTl9DT1BZX1JFU1QgKGRzdCwgc3JjLCBzaXplLCAwKQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9hZGQpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wbl9hZGQgKG1wX3B0ciBfX2dtcF93cCwgbXBfc3JjcHRyIF9fZ21wX3hwLCBtcF9zaXplX3QgX19nbXBfeHNpemUsIG1wX3NyY3B0ciBfX2dtcF95cCwgbXBfc2l6ZV90IF9fZ21wX3lzaXplKQoreworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9BREQgKF9fZ21wX2MsIF9fZ21wX3dwLCBfX2dtcF94cCwgX19nbXBfeHNpemUsIF9fZ21wX3lwLCBfX2dtcF95c2l6ZSk7CisgIHJldHVybiBfX2dtcF9jOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkXzEpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fYWRkXzEpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX2FkZF8xIChtcF9wdHIgX19nbXBfZHN0LCBtcF9zcmNwdHIgX19nbXBfc3JjLCBtcF9zaXplX3QgX19nbXBfc2l6ZSwgbXBfbGltYl90IF9fZ21wX24pIF9fR01QX05PVEhST1cKK3sKKyAgbXBfbGltYl90ICBfX2dtcF9jOworICBfX0dNUE5fQUREXzEgKF9fZ21wX2MsIF9fZ21wX2RzdCwgX19nbXBfc3JjLCBfX2dtcF9zaXplLCBfX2dtcF9uKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9jbXApCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fY21wKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCitpbnQKK21wbl9jbXAgKG1wX3NyY3B0ciBfX2dtcF94cCwgbXBfc3JjcHRyIF9fZ21wX3lwLCBtcF9zaXplX3QgX19nbXBfc2l6ZSkgX19HTVBfTk9USFJPVworeworICBpbnQgX19nbXBfcmVzdWx0OworICBfX0dNUE5fQ01QIChfX2dtcF9yZXN1bHQsIF9fZ21wX3hwLCBfX2dtcF95cCwgX19nbXBfc2l6ZSk7CisgIHJldHVybiBfX2dtcF9yZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR01QX0VYVEVSTl9JTkxJTkUpIHx8IGRlZmluZWQgKF9fR01QX0ZPUkNFX21wbl9zdWIpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViKQorX19HTVBfRVhURVJOX0lOTElORQorI2VuZGlmCittcF9saW1iX3QKK21wbl9zdWIgKG1wX3B0ciBfX2dtcF93cCwgbXBfc3JjcHRyIF9fZ21wX3hwLCBtcF9zaXplX3QgX19nbXBfeHNpemUsIG1wX3NyY3B0ciBfX2dtcF95cCwgbXBfc2l6ZV90IF9fZ21wX3lzaXplKQoreworICBtcF9saW1iX3QgIF9fZ21wX2M7CisgIF9fR01QTl9TVUIgKF9fZ21wX2MsIF9fZ21wX3dwLCBfX2dtcF94cCwgX19nbXBfeHNpemUsIF9fZ21wX3lwLCBfX2dtcF95c2l6ZSk7CisgIHJldHVybiBfX2dtcF9jOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dNUF9FWFRFUk5fSU5MSU5FKSB8fCBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViXzEpCisjaWYgISBkZWZpbmVkIChfX0dNUF9GT1JDRV9tcG5fc3ViXzEpCitfX0dNUF9FWFRFUk5fSU5MSU5FCisjZW5kaWYKK21wX2xpbWJfdAorbXBuX3N1Yl8xIChtcF9wdHIgX19nbXBfZHN0LCBtcF9zcmNwdHIgX19nbXBfc3JjLCBtcF9zaXplX3QgX19nbXBfc2l6ZSwgbXBfbGltYl90IF9fZ21wX24pIF9fR01QX05PVEhST1cKK3sKKyAgbXBfbGltYl90ICBfX2dtcF9jOworICBfX0dNUE5fU1VCXzEgKF9fZ21wX2MsIF9fZ21wX2RzdCwgX19nbXBfc3JjLCBfX2dtcF9zaXplLCBfX2dtcF9uKTsKKyAgcmV0dXJuIF9fZ21wX2M7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKworLyogQWxsb3cgZmFzdGVyIHRlc3RpbmcgZm9yIG5lZ2F0aXZlLCB6ZXJvLCBhbmQgcG9zaXRpdmUuICAqLworI2RlZmluZSBtcHpfc2duKFopICgoWiktPl9tcF9zaXplIDwgMCA/IC0xIDogKFopLT5fbXBfc2l6ZSA+IDApCisjZGVmaW5lIG1wZl9zZ24oRikgKChGKS0+X21wX3NpemUgPCAwID8gLTEgOiAoRiktPl9tcF9zaXplID4gMCkKKyNkZWZpbmUgbXBxX3NnbihRKSAoKFEpLT5fbXBfbnVtLl9tcF9zaXplIDwgMCA/IC0xIDogKFEpLT5fbXBfbnVtLl9tcF9zaXplID4gMCkKKworLyogV2hlbiB1c2luZyBHQ0MsIG9wdGltaXplIGNlcnRhaW4gY29tbW9uIGNvbXBhcmlzb25zLiAgKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykKKyNkZWZpbmUgbXB6X2NtcF91aShaLFVJKSBcCisgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoVUkpICYmIChVSSkgPT0gMAkJCQlcCisgICA/IG1wel9zZ24gKFopIDogX21wel9jbXBfdWkgKFosVUkpKQorI2RlZmluZSBtcHpfY21wX3NpKFosU0kpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChTSSkgJiYgKFNJKSA9PSAwID8gbXB6X3NnbiAoWikJCQlcCisgICA6IF9fYnVpbHRpbl9jb25zdGFudF9wIChTSSkgJiYgKFNJKSA+IDAJCQkJXAorICAgID8gX21wel9jbXBfdWkgKFosIF9fR01QX0NBU1QgKHVuc2lnbmVkIGxvbmcgaW50LCBTSSkpCQlcCisgICA6IF9tcHpfY21wX3NpIChaLFNJKSkKKyNkZWZpbmUgbXBxX2NtcF91aShRLE5VSSxEVUkpIFwKKyAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChOVUkpICYmIChOVUkpID09IDAJCQkJXAorICAgPyBtcHFfc2duIChRKSA6IF9tcHFfY21wX3VpIChRLE5VSSxEVUkpKQorI2RlZmluZSBtcHFfY21wX3NpKHEsbixkKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19idWlsdGluX2NvbnN0YW50X3AgKChuKSA+PSAwKSAmJiAobikgPj0gMCAgXAorICAgPyBtcHFfY21wX3VpIChxLCBfX0dNUF9DQVNUICh1bnNpZ25lZCBsb25nLCBuKSwgZCkgXAorICAgOiBfbXBxX2NtcF9zaSAocSwgbiwgZCkpCisjZWxzZQorI2RlZmluZSBtcHpfY21wX3VpKFosVUkpIF9tcHpfY21wX3VpIChaLFVJKQorI2RlZmluZSBtcHpfY21wX3NpKFosVUkpIF9tcHpfY21wX3NpIChaLFVJKQorI2RlZmluZSBtcHFfY21wX3VpKFEsTlVJLERVSSkgX21wcV9jbXBfdWkgKFEsTlVJLERVSSkKKyNkZWZpbmUgbXBxX2NtcF9zaShxLG4sZCkgIF9tcHFfY21wX3NpKHEsbixkKQorI2VuZGlmCisKKworLyogVXNpbmcgIiYiIHJhdGhlciB0aGFuICImJiIgbWVhbnMgdGhlc2UgY2FuIGNvbWUgb3V0IGJyYW5jaC1mcmVlLiAgRXZlcnkKKyAgIG1wel90IGhhcyBhdCBsZWFzdCBvbmUgbGltYiBhbGxvY2F0ZWQsIHNvIGZldGNoaW5nIHRoZSBsb3cgbGltYiBpcyBhbHdheXMKKyAgIGFsbG93ZWQuICAqLworI2RlZmluZSBtcHpfb2RkX3AoeikgICAoKCh6KS0+X21wX3NpemUgIT0gMCkgJiBfX0dNUF9DQVNUIChpbnQsICh6KS0+X21wX2RbMF0pKQorI2RlZmluZSBtcHpfZXZlbl9wKHopICAoISBtcHpfb2RkX3AgKHopKQorCisKKy8qKioqKioqKioqKioqKioqIEMrKyByb3V0aW5lcyAqKioqKioqKioqKioqKioqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCAoc3RkOjpvc3RyZWFtICYsIG1wel9zcmNwdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0gJiwgbXBxX3NyY3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSAmLCBtcGZfc3JjcHRyKTsKK19fR01QX0RFQ0xTUEVDX1hYIHN0ZDo6aXN0cmVhbSYgb3BlcmF0b3I+PiAoc3RkOjppc3RyZWFtICYsIG1wel9wdHIpOworX19HTVBfREVDTFNQRUNfWFggc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+IChzdGQ6OmlzdHJlYW0gJiwgbXBxX3B0cik7CitfX0dNUF9ERUNMU1BFQ19YWCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yPj4gKHN0ZDo6aXN0cmVhbSAmLCBtcGZfcHRyKTsKKyNlbmRpZgorCisKKy8qIFNvdXJjZS1sZXZlbCBjb21wYXRpYmlsaXR5IHdpdGggR01QIDIgYW5kIGVhcmxpZXIuICovCisjZGVmaW5lIG1wbl9kaXZtb2QocXAsbnAsbnNpemUsZHAsZHNpemUpIFwKKyAgbXBuX2RpdnJlbSAocXAsIF9fR01QX0NBU1QgKG1wX3NpemVfdCwgMCksIG5wLCBuc2l6ZSwgZHAsIGRzaXplKQorCisvKiBTb3VyY2UtbGV2ZWwgY29tcGF0aWJpbGl0eSB3aXRoIEdNUCAxLiAgKi8KKyNkZWZpbmUgbXB6X21kaXYJbXB6X2ZkaXZfcQorI2RlZmluZSBtcHpfbWRpdm1vZAltcHpfZmRpdl9xcgorI2RlZmluZSBtcHpfbW1vZAltcHpfZmRpdl9yCisjZGVmaW5lIG1wel9tZGl2X3VpCW1wel9mZGl2X3FfdWkKKyNkZWZpbmUgbXB6X21kaXZtb2RfdWkocSxyLG4sZCkgXAorICAoKChyKSA9PSAwKSA/IG1wel9mZGl2X3FfdWkgKHEsbixkKSA6IG1wel9mZGl2X3FyX3VpIChxLHIsbixkKSkKKyNkZWZpbmUgbXB6X21tb2RfdWkocixuLGQpIFwKKyAgKCgocikgPT0gMCkgPyBtcHpfZmRpdl91aSAobixkKSA6IG1wel9mZGl2X3JfdWkgKHIsbixkKSkKKworLyogVXNlZnVsIHN5bm9ueW1zLCBidXQgbm90IHF1aXRlIGNvbXBhdGlibGUgd2l0aCBHTVAgMS4gICovCisjZGVmaW5lIG1wel9kaXYJCW1wel9mZGl2X3EKKyNkZWZpbmUgbXB6X2Rpdm1vZAltcHpfZmRpdl9xcgorI2RlZmluZSBtcHpfZGl2X3VpCW1wel9mZGl2X3FfdWkKKyNkZWZpbmUgbXB6X2Rpdm1vZF91aQltcHpfZmRpdl9xcl91aQorI2RlZmluZSBtcHpfZGl2XzJleHAJbXB6X2ZkaXZfcV8yZXhwCisjZGVmaW5lIG1wel9tb2RfMmV4cAltcHpfZmRpdl9yXzJleHAKKworZW51bQoreworICBHTVBfRVJST1JfTk9ORSA9IDAsCisgIEdNUF9FUlJPUl9VTlNVUFBPUlRFRF9BUkdVTUVOVCA9IDEsCisgIEdNUF9FUlJPUl9ESVZJU0lPTl9CWV9aRVJPID0gMiwKKyAgR01QX0VSUk9SX1NRUlRfT0ZfTkVHQVRJVkUgPSA0LAorICBHTVBfRVJST1JfSU5WQUxJRF9BUkdVTUVOVCA9IDgKK307CisKKy8qIERlZmluZSBDQyBhbmQgQ0ZMQUdTIHdoaWNoIHdlcmUgdXNlZCB0byBidWlsZCB0aGlzIHZlcnNpb24gb2YgR01QICovCisjZGVmaW5lIF9fR01QX0NDICIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzEveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9iaW4veDg2XzY0LWxpbnV4LWdjYyIKKyNkZWZpbmUgX19HTVBfQ0ZMQUdTICItTzIgLW02NCAtbXR1bmU9azgiCisKKy8qIE1ham9yIHZlcnNpb24gbnVtYmVyIGlzIHRoZSB2YWx1ZSBvZiBfX0dOVV9NUF9fIHRvbywgYWJvdmUgYW5kIGluIG1wLmguICovCisjZGVmaW5lIF9fR05VX01QX1ZFUlNJT04gNAorI2RlZmluZSBfX0dOVV9NUF9WRVJTSU9OX01JTk9SIDIKKyNkZWZpbmUgX19HTlVfTVBfVkVSU0lPTl9QQVRDSExFVkVMIDQKKworI2RlZmluZSBfX0dNUF9IX18KKyNlbmRpZiAvKiBfX0dNUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjLmggYi9pbmNsdWRlL21wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzNmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wYy5oCkBAIC0wLDAgKzEsMjYwIEBACisvKiBtcGMuaCAtLSBJbmNsdWRlIGZpbGUgZm9yIG1wYy4KKworQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5IEFuZHJlYXMgRW5nZSwgUGF1bCBaaW1tZXJtYW5uLCBQaGlsaXBwZSBUaFwnZXZlbnkKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE1QQyBMaWJyYXJ5LgorCitUaGUgTVBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGUgTVBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBNUEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCitNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpZm5kZWYgX19NUENfSAorI2RlZmluZSBfX01QQ19ICisKKyNpbmNsdWRlICJnbXAuaCIKKyNpbmNsdWRlICJtcGZyLmgiCisKKy8qIERlZmluZSBNUEMgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTVBDX1ZFUlNJT05fTUFKT1IgMAorI2RlZmluZSBNUENfVkVSU0lPTl9NSU5PUiA4CisjZGVmaW5lIE1QQ19WRVJTSU9OX1BBVENITEVWRUwgMQorI2RlZmluZSBNUENfVkVSU0lPTl9TVFJJTkcgIjAuOC4xIgorCisvKiBNYWNyb3MgZGVhbGluZyB3aXRoIE1QQyBWRVJTSU9OICovCisjZGVmaW5lIE1QQ19WRVJTSU9OX05VTShhLGIsYykgKCgoYSkgPDwgMTZMKSB8ICgoYikgPDwgOCkgfCAoYykpCisjZGVmaW5lIE1QQ19WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1QQ19WRVJTSU9OX05VTShNUENfVkVSU0lPTl9NQUpPUixNUENfVkVSU0lPTl9NSU5PUixNUENfVkVSU0lPTl9QQVRDSExFVkVMKQorCisvKiBDaGVjayBpZiBzdGRpby5oIGlzIGluY2x1ZGVkICovCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfRklMRSkKKyMgZGVmaW5lIF9NUENfSF9IQVZFX0ZJTEUgMQorI2VuZGlmCisKKy8qIENoZWNrIGlmIHN0ZGludC5oL2ludHR5cGVzLmggaXMgaW5jbHVkZWQgKi8KKyNpZiBkZWZpbmVkIChJTlRNQVhfQykgJiYgZGVmaW5lZCAoVUlOVE1BWF9DKQorIyBkZWZpbmUgX01QQ19IX0hBVkVfSU5UTUFYX1QgMQorI2VuZGlmCisKKy8qIFJldHVybiB2YWx1ZXMgKi8KKworLyogVHJhbnNmb3JtIG5lZ2F0aXZlIHRvIDIsIHBvc2l0aXZlIHRvIDEsIGxlYXZlIDAgdW5jaGFuZ2VkICovCisjZGVmaW5lIE1QQ19JTkVYX1BPUyhpbmV4KSAoKChpbmV4KSA8IDApID8gMiA6ICgoaW5leCkgPT0gMCkgPyAwIDogMSkKKy8qIFRyYW5zZm9ybSAyIHRvIG5lZ2F0aXZlLCAxIHRvIHBvc2l0aXZlLCBsZWF2ZSAwIHVuY2hhbmdlZCAqLworI2RlZmluZSBNUENfSU5FWF9ORUcoaW5leCkgKCgoaW5leCkgPT0gMikgPyAtMSA6ICgoaW5leCkgPT0gMCkgPyAwIDogMSkKKworLyogdGhlIGdsb2JhbCBpbmV4YWN0IGZsYWcgaXMgbWFkZSBvZiAocmVhbCBmbGFnKSArIDQgKiAoaW1hZ2luYXJ5IGZsYWcpLCB3aGVyZQorICAgZWFjaCBvZiB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IGluZXhhY3QgZmxhZyBhcmU6CisgICAwIHdoZW4gdGhlIHJlc3VsdCBpcyBleGFjdCAobm8gcm91bmRpbmcgZXJyb3IpCisgICAxIHdoZW4gdGhlIHJlc3VsdCBpcyBsYXJnZXIgdGhhbiB0aGUgZXhhY3QgdmFsdWUKKyAgIDIgd2hlbiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhbiB0aGUgZXhhY3QgdmFsdWUgKi8KKyNkZWZpbmUgTVBDX0lORVgoaW5leF9yZSwgaW5leF9pbSkgXAorICAgICAgICAoTVBDX0lORVhfUE9TKGluZXhfcmUpIHwgKE1QQ19JTkVYX1BPUyhpbmV4X2ltKSA8PCAyKSkKKyNkZWZpbmUgTVBDX0lORVhfUkUoaW5leCkgTVBDX0lORVhfTkVHKChpbmV4KSAmIDMpCisjZGVmaW5lIE1QQ19JTkVYX0lNKGluZXgpIE1QQ19JTkVYX05FRygoaW5leCkgPj4gMikKKworLyogRGVmaW5pdGlvbiBvZiByb3VuZGluZyBtb2RlcyAqLworCisvKiBhIGNvbXBsZXggcm91bmRpbmcgbW9kZSBpcyBqdXN0IGEgcGFpciBvZiB0d28gcmVhbCByb3VuZGluZyBtb2RlcworICAgd2UgcmVzZXJ2ZSBmb3VyIGJpdHMgZm9yIGEgcmVhbCByb3VuZGluZyBtb2RlLiAgKi8KK3R5cGVkZWYgaW50IG1wY19ybmRfdDsKKworI2RlZmluZSBSTkRDKHIxLHIyKSAoKChpbnQpKHIxKSkgKyAoKGludCkocjIpIDw8IDQpKQorI2RlZmluZSBNUENfUk5EX1JFKHgpICgobXBfcm5kX3QpKCh4KSAmIDB4MEYpKQorI2RlZmluZSBNUENfUk5EX0lNKHgpICgobXBfcm5kX3QpKCh4KSA+PiA0KSkKKworI2RlZmluZSBNUENfUk5ETk4gUk5EQyhHTVBfUk5ETixHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORE5aIFJOREMoR01QX1JORE4sR01QX1JORFopCisjZGVmaW5lIE1QQ19STkROVSBSTkRDKEdNUF9STkROLEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5ETkQgUk5EQyhHTVBfUk5ETixHTVBfUk5ERCkKKworI2RlZmluZSBNUENfUk5EWk4gUk5EQyhHTVBfUk5EWixHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORFpaIFJOREMoR01QX1JORFosR01QX1JORFopCisjZGVmaW5lIE1QQ19STkRaVSBSTkRDKEdNUF9STkRaLEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5EWkQgUk5EQyhHTVBfUk5EWixHTVBfUk5ERCkKKworI2RlZmluZSBNUENfUk5EVU4gUk5EQyhHTVBfUk5EVSxHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORFVaIFJOREMoR01QX1JORFUsR01QX1JORFopCisjZGVmaW5lIE1QQ19STkRVVSBSTkRDKEdNUF9STkRVLEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5EVUQgUk5EQyhHTVBfUk5EVSxHTVBfUk5ERCkKKworI2RlZmluZSBNUENfUk5ERE4gUk5EQyhHTVBfUk5ERCxHTVBfUk5ETikKKyNkZWZpbmUgTVBDX1JORERaIFJOREMoR01QX1JOREQsR01QX1JORFopCisjZGVmaW5lIE1QQ19STkREVSBSTkRDKEdNUF9STkRELEdNUF9STkRVKQorI2RlZmluZSBNUENfUk5EREQgUk5EQyhHTVBfUk5ERCxHTVBfUk5ERCkKKworCisvKiBEZWZpbml0aW9ucyBvZiB0eXBlcyBhbmQgdGhlaXIgc2VtYW50aWNzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgbXBmcl90IHJlOworICBtcGZyX3QgaW07Cit9CitfX21wY19zdHJ1Y3Q7CisKK3R5cGVkZWYgX19tcGNfc3RydWN0IG1wY190WzFdOwordHlwZWRlZiBfX21wY19zdHJ1Y3QgKm1wY19wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IF9fbXBjX3N0cnVjdCAqbXBjX3NyY3B0cjsKKworLyogUHJvdG90eXBlczogU3VwcG9ydCBvZiBLJlIgY29tcGlsZXIgKi8KKyNpZiBkZWZpbmVkIChfX0dNUF9QUk9UTykKKyMgZGVmaW5lIF9fTVBDX1BST1RPIF9fR01QX1BST1RPCisjZWxpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjIGRlZmluZSBfX01QQ19QUk9UTyh4KSB4CisjZWxzZQorIyBkZWZpbmUgX19NUENfUFJPVE8oeCkgKCkKKyNlbmRpZgorCisvKiBTdXBwb3J0IGZvciBXSU5ET1dTIERsbDoKKyAgIENoZWNrIGlmIHdlIGFyZSBpbnNpZGUgYSBNUEMgYnVpbGQsIGFuZCBpZiBzbyBleHBvcnQgdGhlIGZ1bmN0aW9ucy4KKyAgIE90aGVyd2lzZSBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIEdNUCAqLworI2lmIGRlZmluZWQoX19NUENfV0lUSElOX01QQykgJiYgX19HTVBfTElCR01QX0RMTAorIyBkZWZpbmUgX19NUENfREVDTFNQRUMgX19HTVBfREVDTFNQRUNfRVhQT1JUCisjZWxzZQorIyBkZWZpbmUgX19NUENfREVDTFNQRUMgX19HTVBfREVDTFNQRUMKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hZGQgICAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FkZF9mciBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2FkZF91aSBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3N1YiAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3ViX2ZyIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZnJfc3ViIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBmcl9zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3ViX3VpIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfdWlfdWlfc3ViIF9fTVBDX1BST1RPICgobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX211bCAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX2ZyIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX3VpIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX3NpIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbG9uZyBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsX2kgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgaW50LCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NxciAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfZGl2ICAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19wb3cgICAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19mciBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19sZCBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIGxvbmcgZG91YmxlLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19kIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgZG91YmxlLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3Bvd19zaSBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIGxvbmcsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfcG93X3VpIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZywgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19wb3dfeiAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcHpfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Rpdl9mciBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2ZyX2RpdiBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wZnJfc3JjcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Rpdl91aSBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3VpX2RpdiBfX01QQ19QUk9UTyAoKG1wY19wdHIsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2Rpdl8yZXhwIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbXVsXzJleHAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCB1bnNpZ25lZCBsb25nIGludCwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jb25qICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfbmVnICAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX25vcm0gIF9fTVBDX1BST1RPICgobXBmcl9wdHIsIG1wY19zcmNwdHIsIG1wX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hYnMgICBfX01QQ19QUk9UTyAoKG1wZnJfcHRyLCBtcGNfc3JjcHRyLCBtcF9ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3FydCAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldCAgICAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2QgICAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgZG91YmxlLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9kX2QgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIGRvdWJsZSwgZG91YmxlLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9sZCAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIGxvbmcgZG91YmxlLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9sZF9sZCBfX01QQ19QUk9UTyAoKG1wY19wdHIsIGxvbmcgZG91YmxlLCBsb25nIGRvdWJsZSwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfZiAgICAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGZfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9mX2YgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wZl9zcmNwdHIsIG1wZl9zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2ZyICAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBmcl9zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X2ZyX2ZyIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF9xICAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wcV9zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3FfcSAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBxX3NyY3B0ciwgbXBxX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc2kgICAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBsb25nIGludCwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc2lfc2kgX19NUENfUFJPVE8gKChtcGNfcHRyLCBsb25nIGludCwgbG9uZyBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3VpICAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3VpX3VpIF9fTVBDX1BST1RPICgobXBjX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50LCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX3NldF96ICAgICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wel9zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3pfeiAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXB6X3NyY3B0ciwgbXB6X3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyB2b2lkIG1wY19zd2FwICAgICAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfcHRyKSk7CisKKyNpZmRlZiBfTVBDX0hfSEFWRV9JTlRNQVhfVAorX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3NqIF9fTVBDX1BST1RPICgobXBjX3B0ciwgaW50bWF4X3QsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3VqIF9fTVBDX1BST1RPICgobXBjX3B0ciwgdWludG1heF90LCAgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zZXRfc2pfc2ogX19NUENfUFJPVE8gKChtcGNfcHRyLCBpbnRtYXhfdCwgaW50bWF4X3QsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3VqX3VqIF9fTVBDX1BST1RPICgobXBjX3B0ciwgdWludG1heF90LCB1aW50bWF4X3QsIG1wY19ybmRfdCkpOworI2VuZGlmCisKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX3NldF9uYW4gICAgIF9fTVBDX1BST1RPICgobXBjX3B0cikpOworCitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19yZWFsIF9fTVBDX1BST1RPICgobXBmcl9wdHIsIG1wY19zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2ltYWcgX19NUENfUFJPVE8gKChtcGZyX3B0ciwgbXBjX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYXJnICBfX01QQ19QUk9UTyAoKG1wZnJfcHRyLCBtcGNfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19wcm9qIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jbXAgIF9fTVBDX1BST1RPICgobXBjX3NyY3B0ciwgbXBjX3NyY3B0cikpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfY21wX3NpX3NpIF9fTVBDX1BST1RPICgobXBjX3NyY3B0ciwgbG9uZyBpbnQsIGxvbmcgaW50KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19leHAgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19sb2cgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zaW4gIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jb3MgIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY190YW4gIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19zaW5oIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19jb3NoIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY190YW5oIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hc2luICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYWNvcyAgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2F0YW4gIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyBpbnQgIG1wY19hc2luaCBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfYWNvc2ggX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcGNfc3JjcHRyLCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIGludCAgbXBjX2F0YW5oIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBjX3NyY3B0ciwgbXBjX3JuZF90KSk7CitfX01QQ19ERUNMU1BFQyB2b2lkIG1wY19jbGVhciAgIF9fTVBDX1BST1RPICgobXBjX3B0cikpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfdXJhbmRvbSBfX01QQ19QUk9UTyAoKG1wY19wdHIsIGdtcF9yYW5kc3RhdGVfdCkpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfaW5pdDIgX19NUENfUFJPVE8gKChtcGNfcHRyLCBtcF9wcmVjX3QpKTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX2luaXQzIF9fTVBDX1BST1RPICgobXBjX3B0ciwgbXBfcHJlY190LCBtcF9wcmVjX3QpKTsKK19fTVBDX0RFQ0xTUEVDIG1wX3ByZWNfdCBtcGNfZ2V0X3ByZWMgX19NUENfUFJPVE8oKG1wY19zcmNwdHIgeCkpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfZ2V0X3ByZWMyIF9fTVBDX1BST1RPKChtcF9wcmVjX3QgKnByLCBtcF9wcmVjX3QgKnBpLCBtcGNfc3JjcHRyIHgpKTsKK19fTVBDX0RFQ0xTUEVDIHZvaWQgbXBjX3NldF9wcmVjICBfX01QQ19QUk9UTyAoKG1wY19wdHIsIG1wX3ByZWNfdCkpOworX19NUENfREVDTFNQRUMgX19nbXBfY29uc3QgY2hhciAqIG1wY19nZXRfdmVyc2lvbiBfX01QQ19QUk9UTyAoKHZvaWQpKTsKKworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc3RydG9jICAgIF9NUEZSX1BST1RPICgobXBjX3B0ciwgY2hhciAqLCBjaGFyICoqLCBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgaW50ICBtcGNfc2V0X3N0ciAgIF9NUEZSX1BST1RPICgobXBjX3B0ciwgY2hhciAqLCBpbnQsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgY2hhciAqIG1wY19nZXRfc3RyIF9NUEZSX1BST1RPICgoaW50LCBzaXplX3QsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworX19NUENfREVDTFNQRUMgdm9pZCBtcGNfZnJlZV9zdHIgIF9NUEZSX1BST1RPICgoY2hhciAqKSk7CisjaWZkZWYgX01QQ19IX0hBVkVfRklMRQorX19NUENfREVDTFNQRUMgaW50IG1wY19pbnBfc3RyIF9fTVBDX1BST1RPICgobXBjX3B0ciwgRklMRSAqLCBzaXplX3QgKiwgaW50LCBtcGNfcm5kX3QpKTsKK19fTVBDX0RFQ0xTUEVDIHNpemVfdCBtcGNfb3V0X3N0ciBfX01QQ19QUk9UTyAoKEZJTEUgKiwgaW50LCBzaXplX3QsIG1wY19zcmNwdHIsIG1wY19ybmRfdCkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisjZGVmaW5lIG1wY19yZWFscmVmKHgpICgoeCktPnJlKQorI2RlZmluZSBtcGNfaW1hZ3JlZih4KSAoKHgpLT5pbSkKKworI2RlZmluZSBtcGNfYWRkX3NpKHgsIHksIHosIHJuZCkgXAorICggKHopID49IDAgPyBtcGNfYWRkX3VpICgoeCksICh5KSwgKHVuc2lnbmVkIGxvbmcgaW50KSAoeiksIChybmQpKSA6IG1wY19zdWJfdWkgKCh4KSwgKHkpLCAodW5zaWduZWQgbG9uZyBpbnQpICgtKHopKSwgKHJuZCkpICkKKyNkZWZpbmUgbXBjX2NtcF9zaSh4LCB5KSBcCisgKCBtcGNfY21wX3NpX3NpICgoeCksICh5KSwgMGwpICkKKyNkZWZpbmUgbXBjX3VpX3N1Yih4LCB5LCB6LCByKSBtcGNfdWlfdWlfc3ViICh4LCB5LCAwdWwsIHosIHIpCisKKy8qCisgICBEZWZpbmUgYSBmYWtlIG1wZnJfc2V0X2ZyIHNvIHRoYXQsIGZvciBpbnN0YW5jZSwgbXBjX3NldF9mcl96IHdvdWxkCisgICBiZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgICBtcGNfc2V0X2ZyX3ogKG1wY190IHJvcCwgbXBmcl90IHgsIG1wel90IHksIG1wY19ybmRfdCBybmQpCisgICAgICAgTVBDX1NFVF9YX1kgKGZyLCB6LCByb3AsIHgsIHksIHJuZCkKKyovCisjaWZuZGVmIG1wZnJfc2V0X2ZyCisjZGVmaW5lIG1wZnJfc2V0X2ZyIG1wZnJfc2V0CisjZW5kaWYKKyNkZWZpbmUgTVBDX1NFVF9YX1kocmVhbF90LCBpbWFnX3QsIHosIHJlYWxfdmFsdWUsIGltYWdfdmFsdWUsIHJuZCkgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgX2luZXhfcmUsIF9pbmV4X2ltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfaW5leF9yZSA9IChtcGZyX3NldF8gIyMgcmVhbF90KSAobXBjX3JlYWxyZWYgKHopLCAocmVhbF92YWx1ZSksIE1QQ19STkRfUkUgKHJuZCkpOyBcCisgICAgX2luZXhfaW0gPSAobXBmcl9zZXRfICMjIGltYWdfdCkgKG1wY19pbWFncmVmICh6KSwgKGltYWdfdmFsdWUpLCBNUENfUk5EX0lNIChybmQpKTsgXAorICAgIHJldHVybiBNUENfSU5FWCAoX2luZXhfcmUsIF9pbmV4X2ltKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBpZm5kZWYgX19NUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGYybXBmci5oIGIvaW5jbHVkZS9tcGYybXBmci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODllZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wZjJtcGZyLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIG1wZjJtcGZyLmggLS0gQ29tcGF0aWJpbGl0eSBpbmNsdWRlIGZpbGUgd2l0aCBtcGYuCisKK0NvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorQ29udHJpYnV0ZWQgYnkgdGhlIEFyZW5haXJlIGFuZCBDYWNhbyBwcm9qZWN0cywgSU5SSUEuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgTVBGUiBMaWJyYXJ5LgorCitUaGUgR05VIE1QRlIgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoZSBHTlUgTVBGUiBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKK29yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgR05VIE1QRlIgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sCitNQSAwMjExMC0xMzAxLCBVU0EuICovCisKKyNpZm5kZWYgX19NUEZSX0ZST01fTVBGX18KKyNkZWZpbmUgX19NUEZSX0ZST01fTUZGX18KKworLyogdHlwZXMgKi8KKyNkZWZpbmUgbXBmX3QgbXBmcl90CisjZGVmaW5lIG1wZl9zcmNwdHIgbXBmcl9zcmNwdHIKKyNkZWZpbmUgbXBmX3B0ciBtcGZyX3B0cgorCisvKiBHZXQgY3VycmVudCBSb3VuZGluZyBNb2RlICovCisjaWZuZGVmIE1QRlJfREVGQVVMVF9STkQKKyMgZGVmaW5lIE1QRlJfREVGQVVMVF9STkQgbXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlICgpCisjZW5kaWYKKworLyogbXBmX2luaXQgaW5pdGFsaXplcyBhdCAwICovCisjdW5kZWYgbXBmX2luaXQKKyNkZWZpbmUgbXBmX2luaXQoeCkgbXBmcl9pbml0X3NldF91aSAoKHgpLCAwLCBNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9pbml0MgorI2RlZmluZSBtcGZfaW5pdDIoeCxwKSAobXBmcl9pbml0MigoeCksKHApKSwgbXBmcl9zZXRfdWkgKCh4KSwgMCwgTVBGUl9ERUZBVUxUX1JORCkpCisKKy8qIGZ1bmN0aW9ucyB3aGljaCBkb24ndCB0YWtlIGFzIGFyZ3VtZW50IHRoZSByb3VuZGluZyBtb2RlICovCisjdW5kZWYgbXBmX2NlaWwKKyNkZWZpbmUgbXBmX2NlaWwgbXBmcl9jZWlsCisjdW5kZWYgbXBmX2NsZWFyCisjZGVmaW5lIG1wZl9jbGVhciBtcGZyX2NsZWFyCisjdW5kZWYgbXBmX2NtcAorI2RlZmluZSBtcGZfY21wIG1wZnJfY21wCisjdW5kZWYgbXBmX2NtcF9zaQorI2RlZmluZSBtcGZfY21wX3NpIG1wZnJfY21wX3NpCisjdW5kZWYgbXBmX2NtcF91aQorI2RlZmluZSBtcGZfY21wX3VpIG1wZnJfY21wX3VpCisjdW5kZWYgbXBmX2NtcF9kCisjZGVmaW5lIG1wZl9jbXBfZCBtcGZyX2NtcF9kCisjdW5kZWYgbXBmX2VxCisjZGVmaW5lIG1wZl9lcSBtcGZyX2VxCisjdW5kZWYgbXBmX2Zsb29yCisjZGVmaW5lIG1wZl9mbG9vciBtcGZyX2Zsb29yCisjdW5kZWYgbXBmX2dldF9wcmVjCisjZGVmaW5lIG1wZl9nZXRfcHJlYyBtcGZyX2dldF9wcmVjCisjdW5kZWYgbXBmX2ludGVnZXJfcAorI2RlZmluZSBtcGZfaW50ZWdlcl9wIG1wZnJfaW50ZWdlcl9wCisjdW5kZWYgbXBmX3JhbmRvbTIKKyNkZWZpbmUgbXBmX3JhbmRvbTIgbXBmcl9yYW5kb20yCisjdW5kZWYgbXBmX3NldF9kZWZhdWx0X3ByZWMKKyNkZWZpbmUgbXBmX3NldF9kZWZhdWx0X3ByZWMgbXBmcl9zZXRfZGVmYXVsdF9wcmVjCisjdW5kZWYgbXBmX2dldF9kZWZhdWx0X3ByZWMKKyNkZWZpbmUgbXBmX2dldF9kZWZhdWx0X3ByZWMgbXBmcl9nZXRfZGVmYXVsdF9wcmVjCisjdW5kZWYgbXBmX3NldF9wcmVjCisjZGVmaW5lIG1wZl9zZXRfcHJlYyBtcGZyX3NldF9wcmVjCisjdW5kZWYgbXBmX3NldF9wcmVjX3JhdworI2RlZmluZSBtcGZfc2V0X3ByZWNfcmF3KHgscCkgbXBmcl9wcmVjX3JvdW5kKHgscCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl90cnVuYworI2RlZmluZSBtcGZfdHJ1bmMgbXBmcl90cnVuYworI3VuZGVmIG1wZl9zZ24KKyNkZWZpbmUgbXBmX3NnbiBtcGZyX3NnbgorI3VuZGVmIG1wZl9zd2FwCisjZGVmaW5lIG1wZl9zd2FwIG1wZnJfc3dhcAorI3VuZGVmIG1wZl9kdW1wCisjZGVmaW5lIG1wZl9kdW1wIG1wZnJfZHVtcAorCisvKiBmdW5jdGlvbnMgd2hpY2ggdGFrZSBhcyBhcmd1bWVudCB0aGUgcm91bmRpbmcgbW9kZSAqLworI3VuZGVmIG1wZl9hYnMKKyNkZWZpbmUgbXBmX2Ficyh4LHkpIG1wZnJfYWJzKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9hZGQKKyNkZWZpbmUgbXBmX2FkZCh4LHkseikgbXBmcl9hZGQoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfYWRkX3VpCisjZGVmaW5lIG1wZl9hZGRfdWkoeCx5LHopIG1wZnJfYWRkX3VpKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2RpdgorI2RlZmluZSBtcGZfZGl2KHgseSx6KSBtcGZyX2Rpdih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9kaXZfdWkKKyNkZWZpbmUgbXBmX2Rpdl91aSh4LHkseikgbXBmcl9kaXZfdWkoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZGl2XzJleHAKKyNkZWZpbmUgbXBmX2Rpdl8yZXhwKHgseSx6KSBtcGZyX2Rpdl8yZXhwKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2ZpdHNfc2xvbmdfcAorI2RlZmluZSBtcGZfZml0c19zbG9uZ19wKHgpIG1wZnJfZml0c191bG9uZ19wKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZml0c191bG9uZ19wCisjZGVmaW5lIG1wZl9maXRzX3Vsb25nX3AoeCkgbXBmcl9maXRzX3Vsb25nX3AoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9maXRzX3NpbnRfcAorI2RlZmluZSBtcGZfZml0c19zaW50X3AoeCkgbXBmcl9maXRzX3VpbnRfcCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2ZpdHNfdWludF9wCisjZGVmaW5lIG1wZl9maXRzX3VpbnRfcCh4KSBtcGZyX2ZpdHNfdWludF9wKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZml0c19zc2hvcnRfcAorI2RlZmluZSBtcGZfZml0c19zc2hvcnRfcCh4KSBtcGZyX2ZpdHNfdXNob3J0X3AoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9maXRzX3VzaG9ydF9wCisjZGVmaW5lIG1wZl9maXRzX3VzaG9ydF9wKHgpIG1wZnJfZml0c191c2hvcnRfcCh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2dldF9zdHIKKyNkZWZpbmUgbXBmX2dldF9zdHIoeCx5LHosdCx1KSBtcGZyX2dldF9zdHIoeCx5LHosdCx1LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2dldF9kCisjZGVmaW5lIG1wZl9nZXRfZCh4KSBtcGZyX2dldF9kKHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZ2V0X2RfMmV4cAorI2RlZmluZSBtcGZfZ2V0X2RfMmV4cChlLHgpIG1wZnJfZ2V0X2RfMmV4cChlLHgsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfZ2V0X3VpCisjZGVmaW5lIG1wZl9nZXRfdWkoeCkgbXBmcl9nZXRfdWkoeCxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9nZXRfc2kKKyNkZWZpbmUgbXBmX2dldF9zaSh4KSBtcGZyX2dldF91aSh4LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2lucF9zdHIKKyNkZWZpbmUgbXBmX2lucF9zdHIoeCx5LHopIG1wZnJfaW5wX3N0cih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXRfc3RyCisjZGVmaW5lIG1wZl9zZXRfc3RyKHgseSx6KSBtcGZyX3NldF9zdHIoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5pdF9zZXQKKyNkZWZpbmUgbXBmX2luaXRfc2V0KHgseSkgbXBmcl9pbml0X3NldCh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5pdF9zZXRfZAorI2RlZmluZSBtcGZfaW5pdF9zZXRfZCh4LHkpIG1wZnJfaW5pdF9zZXRfZCh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5pdF9zZXRfc2kKKyNkZWZpbmUgbXBmX2luaXRfc2V0X3NpKHgseSkgbXBmcl9pbml0X3NldF9zaSh4LHksTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfaW5pdF9zZXRfc3RyCisjZGVmaW5lIG1wZl9pbml0X3NldF9zdHIoeCx5LHopIG1wZnJfaW5pdF9zZXRfc3RyKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX2luaXRfc2V0X3VpCisjZGVmaW5lIG1wZl9pbml0X3NldF91aSh4LHkpIG1wZnJfaW5pdF9zZXRfdWkoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX211bAorI2RlZmluZSBtcGZfbXVsKHgseSx6KSBtcGZyX211bCh4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9tdWxfMmV4cAorI2RlZmluZSBtcGZfbXVsXzJleHAoeCx5LHopIG1wZnJfbXVsXzJleHAoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfbXVsX3VpCisjZGVmaW5lIG1wZl9tdWxfdWkoeCx5LHopIG1wZnJfbXVsX3VpKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX25lZworI2RlZmluZSBtcGZfbmVnKHgseSkgbXBmcl9uZWcoeCx5LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX291dF9zdHIKKyNkZWZpbmUgbXBmX291dF9zdHIoeCx5LHosdCkgbXBmcl9vdXRfc3RyKHgseSx6LHQsTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfcG93X3VpCisjZGVmaW5lIG1wZl9wb3dfdWkoeCx5LHopIG1wZnJfcG93X3VpKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3JlbGRpZmYKKyNkZWZpbmUgbXBmX3JlbGRpZmYoeCx5LHopIG1wZnJfcmVsZGlmZih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXQKKyNkZWZpbmUgbXBmX3NldCh4LHkpIG1wZnJfc2V0KHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXRfZAorI2RlZmluZSBtcGZfc2V0X2QoeCx5KSBtcGZyX3NldF9kKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXRfcQorI2RlZmluZSBtcGZfc2V0X3EoeCx5KSBtcGZyX3NldF9xKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXRfc2kKKyNkZWZpbmUgbXBmX3NldF9zaSh4LHkpIG1wZnJfc2V0X3NpKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXRfdWkKKyNkZWZpbmUgbXBmX3NldF91aSh4LHkpIG1wZnJfc2V0X3VpKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zZXRfegorI2RlZmluZSBtcGZfc2V0X3ooeCx5KSBtcGZyX3NldF96KHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zcXJ0CisjZGVmaW5lIG1wZl9zcXJ0KHgseSkgbXBmcl9zcXJ0KHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zcXJ0X3VpCisjZGVmaW5lIG1wZl9zcXJ0X3VpKHgseSkgbXBmcl9zcXJ0X3VpKHgseSxNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl9zdWIKKyNkZWZpbmUgbXBmX3N1Yih4LHkseikgbXBmcl9zdWIoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfc3ViX3VpCisjZGVmaW5lIG1wZl9zdWJfdWkoeCx5LHopIG1wZnJfc3ViX3VpKHgseSx6LE1QRlJfREVGQVVMVF9STkQpCisjdW5kZWYgbXBmX3VpX2RpdgorI2RlZmluZSBtcGZfdWlfZGl2KHgseSx6KSBtcGZyX3VpX2Rpdih4LHkseixNUEZSX0RFRkFVTFRfUk5EKQorI3VuZGVmIG1wZl91aV9zdWIKKyNkZWZpbmUgbXBmX3VpX3N1Yih4LHkseikgbXBmcl91aV9zdWIoeCx5LHosTVBGUl9ERUZBVUxUX1JORCkKKyN1bmRlZiBtcGZfdXJhbmRvbWIKKyNkZWZpbmUgbXBmX3VyYW5kb21iKHgseSxuKSBtcGZyX3VyYW5kb21iKHgseSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wZnIuaCBiL2luY2x1ZGUvbXBmci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTk1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wZnIuaApAQCAtMCwwICsxLDgzOSBAQAorLyogbXBmci5oIC0tIEluY2x1ZGUgZmlsZSBmb3IgbXBmci4KKworQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitDb250cmlidXRlZCBieSB0aGUgQXJlbmFpcmUgYW5kIENhY2FvIHByb2plY3RzLCBJTlJJQS4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUEZSIExpYnJhcnkuCisKK1RoZSBHTlUgTVBGUiBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhlIEdOVSBNUEZSIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBHTlUgTVBGUiBMaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKK01BIDAyMTEwLTEzMDEsIFVTQS4gKi8KKworI2lmbmRlZiBfX01QRlJfSAorI2RlZmluZSBfX01QRlJfSAorCisvKiBEZWZpbmUgTVBGUiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNUEZSX1ZFUlNJT05fTUFKT1IgMgorI2RlZmluZSBNUEZSX1ZFUlNJT05fTUlOT1IgNAorI2RlZmluZSBNUEZSX1ZFUlNJT05fUEFUQ0hMRVZFTCAxCisjZGVmaW5lIE1QRlJfVkVSU0lPTl9TVFJJTkcgIjIuNC4xIgorCisvKiBNYWNyb3MgZGVhbGluZyB3aXRoIE1QRlIgVkVSU0lPTiAqLworI2RlZmluZSBNUEZSX1ZFUlNJT05fTlVNKGEsYixjKSAoKChhKSA8PCAxNkwpIHwgKChiKSA8PCA4KSB8IChjKSkKKyNkZWZpbmUgTVBGUl9WRVJTSU9OIFwKK01QRlJfVkVSU0lPTl9OVU0oTVBGUl9WRVJTSU9OX01BSk9SLE1QRlJfVkVSU0lPTl9NSU5PUixNUEZSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKworLyogQ2hlY2sgaWYgR01QIGlzIGluY2x1ZGVkLCBhbmQgdHJ5IHRvIGluY2x1ZGUgaXQgKFdvcmtzIHdpdGggbG9jYWwgR01QKSAqLworI2lmbmRlZiBfX0dNUF9IX18KKyMgaW5jbHVkZSA8Z21wLmg+CisjZW5kaWYKKworLyogQ2hlY2sgaWYgc3RkaW8uaCBpcyBpbmNsdWRlZCBvciBpZiB0aGUgdXNlciB3YW50cyBGSUxFICovCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfRklMRSkgfHwgZGVmaW5lZCAoTVBGUl9VU0VfRklMRSkKKyMgZGVmaW5lIF9NUEZSX0hfSEFWRV9GSUxFIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dNUF9IX0hBVkVfVkFfTElTVCkKKyMgZGVmaW5lIF9NUEZSX0hfSEFWRV9WQV9MSVNUIDEKKyNlbmRpZgorCisvKiBDaGVjayBpZiBzdGRpbnQuaC9pbnR0eXBlcy5oIGlzIGluY2x1ZGVkIG9yIGlmIHRoZSB1c2VyIHdhbnRzIGludG1heF90ICovCisjaWYgKGRlZmluZWQgKElOVE1BWF9DKSAmJiBkZWZpbmVkIChVSU5UTUFYX0MpKSB8fCBkZWZpbmVkIChNUEZSX1VTRV9JTlRNQVhfVCkKKyMgZGVmaW5lIF9NUEZSX0hfSEFWRV9JTlRNQVhfVCAxCisjZW5kaWYKKworLyogRGVmaW5pdGlvbiBvZiByb3VuZGluZyBtb2RlcyAoRE9OJ1QgVVNFIEdNUF9STkROQSEpCisgICBXYXJuaW5nISBDaGFuZ2luZyB0aGUgY29udGVudHMgb2YgdGhpcyBlbnVtIHNob3VsZCBiZSBzZWVuIGFzIGFuCisgICBpbnRlcmZhY2UgY2hhbmdlIHNpbmNlIHRoZSBvbGQgYW5kIHRoZSBuZXcgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlCisgICAodGhlIGludGVnZXIgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIGVudW1lcmF0ZWQgdHlwZSBjYW4gZXZlbiBjaGFuZ2UsCisgICBzZWUgSVNPIEM5OSwgNi43LjIuMiM0KSwgYW5kIGluIE1ha2VmaWxlLmFtLCBBR0Ugc2hvdWxkIGJlIHNldCB0byAwLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgR01QX1JORE49MCwgR01QX1JORFosIEdNUF9STkRVLCBHTVBfUk5ERCwgR01QX1JORF9NQVgsCisgIEdNUF9STkROQT0tMQorfSBtcGZyX3JuZF90OworCisvKiBEZWZpbmUgcHJlY2lzaW9uIDogMSAoc2hvcnQpLCAyIChpbnQpIG9yIDMgKGxvbmcpIChET04nVCBVU0UgSVQhKSovCisjaWZuZGVmIF9NUEZSX1BSRUNfRk9STUFUCisjIGlmIF9fR01QX01QX1NJWkVfVF9JTlQgPT0gMQorIyAgZGVmaW5lIF9NUEZSX1BSRUNfRk9STUFUIDIKKyMgZWxzZQorIyAgZGVmaW5lIF9NUEZSX1BSRUNfRk9STUFUIDMKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgICBfTVBGUl9QUkVDX0ZPUk1BVCA9PSAxCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1wZnJfcHJlY190OworI2VsaWYgX01QRlJfUFJFQ19GT1JNQVQgPT0gMgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICBtcGZyX3ByZWNfdDsKKyNlbGlmIF9NUEZSX1BSRUNfRk9STUFUID09IDMKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgbXBmcl9wcmVjX3Q7CisjZWxzZQorIyBlcnJvciAiSW52YWxpZCBNUEZSIFByZWMgZm9ybWF0IgorI2VuZGlmCisKKy8qIERlZmluaXRpb24gb2YgcHJlY2lzaW9uIGxpbWl0cyAqLworI2RlZmluZSBNUEZSX1BSRUNfTUlOIDIKKyNkZWZpbmUgTVBGUl9QUkVDX01BWCAoKG1wZnJfcHJlY190KSgobXBmcl9wcmVjX3QpKH4obXBmcl9wcmVjX3QpMCk+PjEpKQorCisvKiBEZWZpbml0aW9uIG9mIHNpZ24gKi8KK3R5cGVkZWYgaW50ICAgICAgICAgIG1wZnJfc2lnbl90OworCisvKiBEZWZpbml0aW9uIG9mIHRoZSBzdGFuZGFyZCBleHBvbmVudCBsaW1pdHMgKi8KKyNkZWZpbmUgTVBGUl9FTUFYX0RFRkFVTFQgKChtcF9leHBfdCkgKCgodW5zaWduZWQgbG9uZykgMSA8PCAzMCkgLSAxKSkKKyNkZWZpbmUgTVBGUl9FTUlOX0RFRkFVTFQgKC0oTVBGUl9FTUFYX0RFRkFVTFQpKQorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBtYWluIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBtcGZyX3ByZWNfdCAgX21wZnJfcHJlYzsKKyAgbXBmcl9zaWduX3QgIF9tcGZyX3NpZ247CisgIG1wX2V4cF90ICAgICBfbXBmcl9leHA7CisgIG1wX2xpbWJfdCAgICpfbXBmcl9kOworfSBfX21wZnJfc3RydWN0OworCisvKiBDb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdHlwZXMgb2YgTVBGUiAqLworI2lmbmRlZiBtcF9ybmRfdAorIyBkZWZpbmUgbXBfcm5kX3QgIG1wZnJfcm5kX3QKKyNlbmRpZgorI2lmbmRlZiBtcF9wcmVjX3QKKyMgZGVmaW5lIG1wX3ByZWNfdCBtcGZyX3ByZWNfdAorI2VuZGlmCisKKy8qCisgICBUaGUgcmVwcmVzZW50ZWQgbnVtYmVyIGlzCisgICAgICBfc2lnbiooX2Rbay0xXS9CK19kW2stMl0vQl4yKy4uLitfZFswXS9CXmspKjJeX2V4cAorICAgd2hlcmUgaz1jZWlsKF9tcF9wcmVjL0JJVFNfUEVSX01QX0xJTUIpIGFuZCBCPTJeQklUU19QRVJfTVBfTElNQi4KKworICAgRm9yIHRoZSBtc2IgKG1vc3Qgc2lnbmlmaWNhbnQgYml0KSBub3JtYWxpemVkIHJlcHJlc2VudGF0aW9uLCB3ZSBtdXN0IGhhdmUKKyAgICAgIF9kW2stMV0+PUIvMiwgdW5sZXNzIHRoZSBudW1iZXIgaXMgc2luZ3VsYXIuCisKKyAgIFdlIG11c3QgYWxzbyBoYXZlIHRoZSBsYXN0IGsqQklUU19QRVJfTVBfTElNQi1fcHJlYyBiaXRzIHNldCB0byB6ZXJvLgorKi8KKwordHlwZWRlZiBfX21wZnJfc3RydWN0IG1wZnJfdFsxXTsKK3R5cGVkZWYgX19tcGZyX3N0cnVjdCAqbXBmcl9wdHI7Cit0eXBlZGVmIF9fZ21wX2NvbnN0IF9fbXBmcl9zdHJ1Y3QgKm1wZnJfc3JjcHRyOworCisvKiBGb3IgdGhvc2Ugd2hvIG5lZWQgYSBkaXJlY3QgYW5kIGZhc3QgYWNjZXNzIHRvIHRoZSBzaWduIGZpZWxkLgorICAgSG93ZXZlciBpdCBpcyBub3QgaW4gdGhlIEFQSSwgdGh1cyB1c2UgaXQgYXQgeW91ciBvd24gcmlzazogaXQgbWlnaHQKKyAgIG5vdCBiZSBzdXBwb3J0ZWQsIG9yIGNoYW5nZSBuYW1lLCBpbiBmdXJ0aGVyIHZlcnNpb25zIQorICAgVW5mb3J0dW5hdGVseSwgaXQgbXVzdCBiZSBkZWZpbmVkIGhlcmUgKGluc3RlYWQgb2YgTVBGUidzIGludGVybmFsCisgICBoZWFkZXIgZmlsZSBtcGZyLWltcGwuaCkgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHNvbWUgbWFjcm9zIGJlbG93LgorKi8KKyNkZWZpbmUgTVBGUl9TSUdOKHgpICgoeCktPl9tcGZyX3NpZ24pCisKKy8qIFN0YWNrIGludGVyZmFjZSAqLwordHlwZWRlZiBlbnVtIHsKKyAgTVBGUl9OQU5fS0lORCA9IDAsCisgIE1QRlJfSU5GX0tJTkQgPSAxLCBNUEZSX1pFUk9fS0lORCA9IDIsIE1QRlJfUkVHVUxBUl9LSU5EID0gMworfSBtcGZyX2tpbmRfdDsKKworLyogR01QIGRlZmluZXM6CisgICAgKyBzaXplX3Q6ICAgICAgICAgICAgICAgIFN0YW5kYXJkIHNpemVfdAorICAgICsgX19HTVBfQVRUUklCVVRFX1BVUkUgICBBdHRyaWJ1dGUgZm9yIG1hdGggZnVuY3Rpb25zLgorICAgICsgX19HTVBfTk9USFJPVyAgICAgICAgICBGb3IgQysrOiBjYW4ndCB0aHJvdyAuCisgICAgKyBfX0dNUF9FWFRFUk5fSU5MSU5FICAgIEF0dHJpYnV0ZSBmb3IgaW5saW5lIGZ1bmN0aW9uLgorICAgICogX19nbXBfY29uc3QgICAgICAgICAgICBjb25zdCAoU3VwcG9ydHMgZm9yIEsmUiBjb21waWxlciBvbmx5IGZvciBtcGZyLmgpLgorICAgICsgX19HTVBfREVDTFNQRUNfRVhQT1JUICBjb21waWxpbmcgdG8gZ28gaW50byBhIERMTAorICAgICsgX19HTVBfREVDTFNQRUNfSU1QT1JUICBjb21waWxpbmcgdG8gZ28gaW50byBhIGFwcGxpY2F0aW9uCisqLworLyogRXh0cmEgTVBGUiBkZWZpbmVzICovCisjZGVmaW5lIF9fTVBGUl9TRU5USU5FTF9BVFRSCisjaWYgZGVmaW5lZCAoX19HTlVDX18pCisjIGlmIF9fR05VQ19fID49IDQKKyMgIHVuZGVmIF9fTVBGUl9TRU5USU5FTF9BVFRSCisjICBkZWZpbmUgX19NUEZSX1NFTlRJTkVMX0FUVFIgX19hdHRyaWJ1dGVfXyAoKHNlbnRpbmVsKSkKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQcm90b3R5cGVzOiBTdXBwb3J0IG9mIEsmUiBjb21waWxlciAqLworI2lmIGRlZmluZWQgKF9fR01QX1BST1RPKQorIyBkZWZpbmUgX01QRlJfUFJPVE8gX19HTVBfUFJPVE8KKyNlbGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgZGVmaW5lIF9NUEZSX1BST1RPKHgpIHgKKyNlbHNlCisjIGRlZmluZSBfTVBGUl9QUk9UTyh4KSAoKQorI2VuZGlmCisvKiBTdXBwb3J0IGZvciBXSU5ET1dTIERsbDoKKyAgIENoZWNrIGlmIHdlIGFyZSBpbnNpZGUgYSBNUEZSIGJ1aWxkLCBhbmQgaWYgc28gZXhwb3J0IHRoZSBmdW5jdGlvbnMuCisgICBPdGhlcndpc2UgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBHTVAgKi8KKyNpZiBkZWZpbmVkKF9fTVBGUl9XSVRISU5fTVBGUikgJiYgX19HTVBfTElCR01QX0RMTAorIyBkZWZpbmUgX19NUEZSX0RFQ0xTUEVDIF9fR01QX0RFQ0xTUEVDX0VYUE9SVAorI2Vsc2UKKyMgZGVmaW5lIF9fTVBGUl9ERUNMU1BFQyBfX0dNUF9ERUNMU1BFQworI2VuZGlmCisKKy8qIE5vdGU6IHNvbWUgZnVuY3Rpb25zIG5lZWQgdGhhdCBhIHNwZWNpZmljIHN5c3RlbSBoZWFkZXIgaXMgaW5jbHVkZWQgYmVmb3JlCisgICBtcGZyLmggdG8gYmUgZGVmaW5lZC4gSWYgdGhlIHVzZXIgZm9yZ2V0cyB0byBpbmNsdWRlIHRoZSBoZWFkZXIsIHRoZSBtcGZyCisgICBmdW5jdGlvbiBwcm90b3R5cGUgaW4gdGhlIHVzZXIgb2JqZWN0IGZpbGUgaXMgbm90IGNvcnJlY3QuIEluIG9yZGVyIHRvCisgICByYWlzZSBhIGxpbmtlciBlcnJvciBpbiB0aGF0IGNhc2UsIHdlIGNoYW5nZSB0aGVpciBpbnRlcm5hbCBuYW1lIGluIHRoZQorICAgR05VIG1wZnIgbGlicmFyeSAocHJlZml4ZWQgYnkgX19nbXBmciBpbnN0ZWFkIG9mIG1wZnIpKi8KKyNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK19fTVBGUl9ERUNMU1BFQyBfX2dtcF9jb25zdCBjaGFyICogbXBmcl9nZXRfdmVyc2lvbiBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBfX2dtcF9jb25zdCBjaGFyICogbXBmcl9nZXRfcGF0Y2hlcyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKKworX19NUEZSX0RFQ0xTUEVDIG1wX2V4cF90IG1wZnJfZ2V0X2VtaW4gICAgIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIGludCAgICAgIG1wZnJfc2V0X2VtaW4gICAgIF9NUEZSX1BST1RPICgobXBfZXhwX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBtcF9leHBfdCBtcGZyX2dldF9lbWluX21pbiBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBtcF9leHBfdCBtcGZyX2dldF9lbWluX21heCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBtcF9leHBfdCBtcGZyX2dldF9lbWF4ICAgICBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgICAgICBtcGZyX3NldF9lbWF4ICAgICBfTVBGUl9QUk9UTyAoKG1wX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgbXBfZXhwX3QgbXBmcl9nZXRfZW1heF9taW4gX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgbXBfZXhwX3QgbXBmcl9nZXRfZW1heF9tYXggX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSBfTVBGUl9QUk9UTygobXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIG1wX3JuZF90IG1wZnJfZ2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSBfTVBGUl9QUk9UTygodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIF9fZ21wX2NvbnN0IGNoYXIgKgorICAgbXBmcl9wcmludF9ybmRfbW9kZSBfTVBGUl9QUk9UTygobXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2NsZWFyX2ZsYWdzIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl91bmRlcmZsb3cgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2NsZWFyX292ZXJmbG93IF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl9uYW5mbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9jbGVhcl9pbmV4ZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXJfZXJhbmdlZmxhZyBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfdW5kZXJmbG93IF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfb3ZlcmZsb3cgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9uYW5mbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfaW5leGZsYWcgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9lcmFuZ2VmbGFnIF9NUEZSX1BST1RPICgodm9pZCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdW5kZXJmbG93X3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfb3ZlcmZsb3dfcCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9uYW5mbGFnX3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfaW5leGZsYWdfcCBfTVBGUl9QUk9UTyAoKHZvaWQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9lcmFuZ2VmbGFnX3AgX01QRlJfUFJPVE8gKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9jaGVja19yYW5nZSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9pbml0MiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9pbml0IF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfY2xlYXIgX01QRlJfUFJPVE8gKChtcGZyX3B0cikpOworCitfX01QRlJfREVDTFNQRUMgdm9pZAorICBtcGZyX2luaXRzMiBfTVBGUl9QUk9UTyAoKG1wX3ByZWNfdCwgbXBmcl9wdHIsIC4uLikpIF9fTVBGUl9TRU5USU5FTF9BVFRSOworX19NUEZSX0RFQ0xTUEVDIHZvaWQKKyAgbXBmcl9pbml0cyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCAuLi4pKSBfX01QRlJfU0VOVElORUxfQVRUUjsKK19fTVBGUl9ERUNMU1BFQyB2b2lkCisgIG1wZnJfY2xlYXJzIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIC4uLikpIF9fTVBGUl9TRU5USU5FTF9BVFRSOworCitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfcHJlY19yb3VuZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3ByZWNfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX2Nhbl9yb3VuZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcF9leHBfdCwgbXBmcl9ybmRfdCwgbXBmcl9ybmRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3ByZWNfdCkpOworCitfX01QRlJfREVDTFNQRUMgbXBfZXhwX3QgbXBmcl9nZXRfZXhwIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfZXhwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgbXBfcHJlY190IG1wZnJfZ2V0X3ByZWMgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9wcmVjIF9NUEZSX1BST1RPKChtcGZyX3B0ciwgbXBmcl9wcmVjX3QpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X3ByZWNfcmF3IF9NUEZSX1BST1RPKChtcGZyX3B0ciwgbXBmcl9wcmVjX3QpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfc2V0X2RlZmF1bHRfcHJlYyBfTVBGUl9QUk9UTygobXBmcl9wcmVjX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBtcF9wcmVjX3QgbXBmcl9nZXRfZGVmYXVsdF9wcmVjIF9NUEZSX1BST1RPKCh2b2lkKSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBkb3VibGUsIG1wZnJfcm5kX3QpKTsKKyNpZmRlZiBNUEZSX1dBTlRfREVDSU1BTF9GTE9BVFMKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfZGVjaW1hbDY0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIF9EZWNpbWFsNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX3JuZF90KSk7CisjZW5kaWYKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfbGQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyBkb3VibGUsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3NldF9uYW4gX01QRlJfUFJPVE8gKChtcGZyX3B0cikpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zZXRfaW5mIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGludCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX3NldF9mIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9nZXRfZiBfTVBGUl9QUk9UTyAoKG1wZl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2V0X3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX3NldF9zaV8yZXhwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcsIG1wX2V4cF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3VpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3B0cix1bnNpZ25lZCBsb25nLG1wX2V4cF90LG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQKKyAgbXBmcl9zZXRfcSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3N0ciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludAorICBtcGZyX2luaXRfc2V0X3N0ciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0NCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCwgaW50KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfYWJzIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbmVnIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2lnbmJpdCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0c2lnbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfY29weXNpZ24gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKKyNpZmRlZiBfTVBGUl9IX0hBVkVfSU5UTUFYX1QKKyNkZWZpbmUgbXBmcl9zZXRfc2ogX19nbXBmcl9zZXRfc2oKKyNkZWZpbmUgbXBmcl9zZXRfc2pfMmV4cCBfX2dtcGZyX3NldF9zal8yZXhwCisjZGVmaW5lIG1wZnJfc2V0X3VqIF9fZ21wZnJfc2V0X3VqCisjZGVmaW5lIG1wZnJfc2V0X3VqXzJleHAgX19nbXBmcl9zZXRfdWpfMmV4cAorI2RlZmluZSBtcGZyX2dldF9zaiBfX2dtcGZyX21wZnJfZ2V0X3NqCisjZGVmaW5lIG1wZnJfZ2V0X3VqIF9fZ21wZnJfbXBmcl9nZXRfdWoKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZXRfc2ogX01QRlJfUFJPVE8gKChtcGZyX3QsIGludG1heF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3NqXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3QsIGludG1heF90LCBpbnRtYXhfdCwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NldF91aiBfTVBGUl9QUk9UTyAoKG1wZnJfdCwgdWludG1heF90LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50CisgIG1wZnJfc2V0X3VqXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3QsIHVpbnRtYXhfdCwgaW50bWF4X3QsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnRtYXhfdCBtcGZyX2dldF9zaiBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdWludG1heF90IG1wZnJfZ2V0X3VqIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKyNlbmRpZgorCitfX01QRlJfREVDTFNQRUMgbXBfZXhwX3QgbXBmcl9nZXRfel9leHAgX01QRlJfUFJPVE8gKChtcHpfcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGRvdWJsZSBtcGZyX2dldF9kIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKyNpZmRlZiBNUEZSX1dBTlRfREVDSU1BTF9GTE9BVFMKK19fTVBGUl9ERUNMU1BFQyBfRGVjaW1hbDY0IG1wZnJfZ2V0X2RlY2ltYWw2NCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9ybmRfdCkpOworI2VuZGlmCitfX01QRlJfREVDTFNQRUMgbG9uZyBkb3VibGUgbXBmcl9nZXRfbGQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBkb3VibGUgbXBmcl9nZXRfZDEgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGRvdWJsZSBtcGZyX2dldF9kXzJleHAgX01QRlJfUFJPVE8gKChsb25nKiwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBsb25nIGRvdWJsZSBtcGZyX2dldF9sZF8yZXhwIF9NUEZSX1BST1RPICgobG9uZyosIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgbG9uZyBtcGZyX2dldF9zaSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdW5zaWduZWQgbG9uZyBtcGZyX2dldF91aSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgY2hhciptcGZyX2dldF9zdHIgX01QRlJfUFJPVE8gKChjaGFyKiwgbXBfZXhwX3QqLCBpbnQsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2dldF96IF9NUEZSX1BST1RPICgobXB6X3B0ciB6LCBtcGZyX3NyY3B0ciBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9mcmVlX3N0ciBfTVBGUl9QUk9UTyAoKGNoYXIgKikpOworCisKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfcmFuZG9tIF9NUEZSX1BST1RPICgobXBmcl9wdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkIG1wZnJfcmFuZG9tMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wX3NpemVfdCxtcF9leHBfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VyYW5kb21iIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGdtcF9yYW5kc3RhdGVfdCkpOworCitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX25leHRhYm92ZSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX25leHRiZWxvdyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX25leHR0b3dhcmQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIpKTsKKworI2lmZGVmIF9NUEZSX0hfSEFWRV9GSUxFCisjZGVmaW5lIG1wZnJfaW5wX3N0ciBfX2dtcGZyX2lucF9zdHIKKyNkZWZpbmUgbXBmcl9vdXRfc3RyIF9fZ21wZnJfb3V0X3N0cgorX19NUEZSX0RFQ0xTUEVDIHNpemVfdCBtcGZyX2lucF9zdHIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgRklMRSosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIHNpemVfdCBtcGZyX291dF9zdHIgX01QRlJfUFJPVE8gKChGSUxFKiwgaW50LCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisjZGVmaW5lIG1wZnJfZnByaW50ZiBfX2dtcGZyX2ZwcmludGYKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mcHJpbnRmIF9NUEZSX1BST1RPICgoRklMRSosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pKTsKKyNlbmRpZgorX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3ByaW50ZiBfTVBGUl9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIqLCAuLi4pKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hc3ByaW50ZiBfTVBGUl9QUk9UTyAoKGNoYXIqKiwgX19nbXBfY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zcHJpbnRmIF9NUEZSX1BST1RPICgoY2hhciosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zbnByaW50ZiBfTVBGUl9QUk9UTyAoKGNoYXIqLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2dtcF9jb25zdCBjaGFyKiwgLi4uKSk7CisKKyNpZmRlZiBfTVBGUl9IX0hBVkVfVkFfTElTVAorI2lmZGVmIF9NUEZSX0hfSEFWRV9GSUxFCisjZGVmaW5lIG1wZnJfdmZwcmludGYgX19nbXBmcl92ZnByaW50ZgorX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3ZmcHJpbnRmIF9NUEZSX1BST1RPICgoRklMRSosIF9fZ21wX2NvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCkpOworI2VuZGlmIC8qIF9NUEZSX0hfSEFWRV9GSUxFICovCisjZGVmaW5lIG1wZnJfdnByaW50ZiBfX2dtcGZyX3ZwcmludGYKKyNkZWZpbmUgbXBmcl92YXNwcmludGYgX19nbXBmcl92YXNwcmludGYKKyNkZWZpbmUgbXBmcl92c3ByaW50ZiBfX2dtcGZyX3ZzcHJpbnRmCisjZGVmaW5lIG1wZnJfdnNucHJpbnRmIF9fZ21wZnJfdnNucHJpbnRmCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdnByaW50ZiBfTVBGUl9QUk9UTyAoKF9fZ21wX2NvbnN0IGNoYXIqLCB2YV9saXN0KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdmFzcHJpbnRmIF9NUEZSX1BST1RPICgoY2hhcioqLCBfX2dtcF9jb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdnNwcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiwgX19nbXBfY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl92c25wcmludGYgX01QRlJfUFJPVE8gKChjaGFyKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nbXBfY29uc3QgY2hhciosIHZhX2xpc3QpKTsKKyNlbmRpZiAvKiBfTVBGUl9IX0hBVkVfVkFfTElTVCAqLworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93X3NpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcG93X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50LCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdWlfcG93X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91aV9wb3cgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgdW5zaWduZWQgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9wb3dfeiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wel9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3NxcnQgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zcXJ0X3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yZWNfc3FydCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FkZCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3N1YiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RpdiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VpX3N1YiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3VpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfdWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3VpX2RpdiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZGRfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdWJfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaV9zdWIgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9kaXZfc2kgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnQsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaV9kaXYgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FkZF9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3N1Yl9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rfc3ViIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX211bF9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rpdl9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RfZGl2IF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3FyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvbnN0X3BpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jb25zdF9sb2cyIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jb25zdF9ldWxlciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29uc3RfY2F0YWxhbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hZ20gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xvZyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbG9nMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sb2cxMCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sb2cxcCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2V4cCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXhwMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9leHAxMCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9leHBtMSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9laW50IF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xpMiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NtcCAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXAzIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyLCBpbnQpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfZCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBkb3VibGUpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfbGQgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbG9uZyBkb3VibGUpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBhYnMgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jbXBfdWkgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgdW5zaWduZWQgbG9uZykpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NtcF9zaSBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBsb25nKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3VpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgdW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3NpXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX2V4cF90KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX3JlbGRpZmYgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2VxIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zZ24gX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsXzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2XzJleHAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsXzJ1aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZywgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Rpdl8ydWkgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9tdWxfMnNpIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2XzJzaSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZywgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmludCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yb3VuZCBfTVBGUl9QUk9UTygobXBmcl9wdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfdHJ1bmMgX01QRlJfUFJPVE8oKG1wZnJfcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NlaWwgX01QRlJfUFJPVE8oKG1wZnJfcHRyLCBtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2Zsb29yIF9NUEZSX1BST1RPKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yaW50X3JvdW5kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmludF90cnVuYyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JpbnRfY2VpbCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfcmludF9mbG9vciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZyYWMgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbW9kZiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9yZW1xdW8gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbG9uZyosIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcF9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3JlbWFpbmRlciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9mbW9kIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcF9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c191bG9uZ19wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfc2xvbmdfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3VpbnRfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3NpbnRfcCBfTVBGUl9QUk9UTygobXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX3VzaG9ydF9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZpdHNfc3Nob3J0X3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZml0c191aW50bWF4X3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9maXRzX2ludG1heF9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2V4dHJhY3QgX01QRlJfUFJPVE8gKChtcHpfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9zd2FwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHRyKSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCBtcGZyX2R1bXAgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbmFuX3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfaW5mX3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbnVtYmVyX3AgX01QRlJfUFJPVE8oKG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfaW50ZWdlcl9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl96ZXJvX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ3JlYXRlcl9wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZ3JlYXRlcmVxdWFsX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbGVzc19wIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIsIG1wZnJfc3JjcHRyKSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbGVzc2VxdWFsX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sZXNzZ3JlYXRlcl9wIF9NUEZSX1BST1RPKChtcGZyX3NyY3B0cixtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2VxdWFsX3AgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl91bm9yZGVyZWRfcCBfTVBGUl9QUk9UTyAoKG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYXRhbmggX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hY29zaCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FzaW5oIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29zaCBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaW5oIF9NUEZSX1BST1RPKChtcGZyX3B0cixtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3RhbmggX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2luaF9jb3NoIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2VjaCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY3NjaCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY290aCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9hY29zIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2FzaW4gX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYXRhbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zaW4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3Npbl9jb3MgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY29zIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl90YW4gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2F0YW4yIF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc2VjIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jc2MgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2NvdCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9oeXBvdCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZXJmIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9lcmZjIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9jYnJ0IF9NUEZSX1BST1RPICgobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3Jvb3QgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cix1bnNpZ25lZCBsb25nLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9nYW1tYSBfTVBGUl9QUk9UTygobXBmcl9wdHIsbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2xuZ2FtbWEgX01QRlJfUFJPVE8oKG1wZnJfcHRyLG1wZnJfc3JjcHRyLG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9sZ2FtbWEgX01QRlJfUFJPVE8oKG1wZnJfcHRyLGludCosbXBmcl9zcmNwdHIsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3pldGEgX01QRlJfUFJPVE8gKChtcGZyX3B0cixtcGZyX3NyY3B0cixtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfemV0YV91aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLHVuc2lnbmVkIGxvbmcsbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZhY191aSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB1bnNpZ25lZCBsb25nIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfajAgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9qMSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2puIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIGxvbmcsIG1wZnJfc3JjcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX3kwIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfeTEgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl95biBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBsb25nLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX21pbiBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX21heCBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2RpbSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9ybmRfdCkpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2X3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ViX3ogX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHpfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3ogX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXB6X3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfbXVsX3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZGl2X3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfYWRkX3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfc3ViX3EgX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcHFfc3JjcHRyLCBtcGZyX3JuZF90KSk7CitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX3EgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBxX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfY21wX2YgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0ciwgbXBmX3NyY3B0cikpOworCitfX01QRlJfREVDTFNQRUMgaW50IG1wZnJfZm1hIF9NUEZSX1BST1RPICgobXBmcl9wdHIsIG1wZnJfc3JjcHRyLCBtcGZyX3NyY3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGZyX3NyY3B0ciwgbXBmcl9ybmRfdCkpOworX19NUEZSX0RFQ0xTUEVDIGludCBtcGZyX2ZtcyBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBtcGZyX3NyY3B0ciwgbXBmcl9zcmNwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBmcl9zcmNwdHIsIG1wZnJfcm5kX3QpKTsKK19fTVBGUl9ERUNMU1BFQyBpbnQgbXBmcl9zdW0gX01QRlJfUFJPVE8gKChtcGZyX3B0ciwgbXBmcl9wdHIgKl9fZ21wX2NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHZvaWQgbXBmcl9mcmVlX2NhY2hlIF9NUEZSX1BST1RPICgodm9pZCkpOworCitfX01QRlJfREVDTFNQRUMgaW50ICBtcGZyX3N1Ym5vcm1hbGl6ZSBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX3JuZF90KSk7CisKK19fTVBGUl9ERUNMU1BFQyBpbnQgIG1wZnJfc3RydG9mciBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBfX2dtcF9jb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqLCBpbnQsIG1wZnJfcm5kX3QpKTsKKworX19NUEZSX0RFQ0xTUEVDIHNpemVfdCBtcGZyX2N1c3RvbV9nZXRfc2l6ZSAgIF9NUEZSX1BST1RPICgobXBfcHJlY190KSk7CitfX01QRlJfREVDTFNQRUMgdm9pZCAgIG1wZnJfY3VzdG9tX2luaXQgICAgICAgX01QRlJfUFJPVE8gKCh2b2lkICosIG1wX3ByZWNfdCkpOworX19NUEZSX0RFQ0xTUEVDIHZvaWQgKiBtcGZyX2N1c3RvbV9nZXRfbWFudGlzc2EgX01QRlJfUFJPVE8gKChtcGZyX3NyY3B0cikpOworX19NUEZSX0RFQ0xTUEVDIG1wX2V4cF90IG1wZnJfY3VzdG9tX2dldF9leHAgIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkICAgbXBmcl9jdXN0b21fbW92ZSAgICAgICBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCB2b2lkICopKTsKK19fTVBGUl9ERUNMU1BFQyB2b2lkICAgbXBmcl9jdXN0b21faW5pdF9zZXQgICBfTVBGUl9QUk9UTyAoKG1wZnJfcHRyLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX2V4cF90LCBtcF9wcmVjX3QsIHZvaWQgKikpOworX19NUEZSX0RFQ0xTUEVDIGludCAgICBtcGZyX2N1c3RvbV9nZXRfa2luZCAgIF9NUEZSX1BST1RPICgobXBmcl9zcmNwdHIpKTsKKworI2lmIGRlZmluZWQgKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisKKy8qIERPTidUIFVTRSBUSElTISAoRm9yIE1QRlItcHVibGljIG1hY3JvcyBvbmx5LCBzZWUgYmVsb3cuKQorICAgVGhlIG1wZnJfc2duIG1hY3JvIHVzZXMgdGhlIGZhY3QgdGhhdCBfX01QRlJfRVhQX05BTiBhbmQgX19NUEZSX0VYUF9aRVJPCisgICBhcmUgdGhlIHNtYWxsZXN0IHZhbHVlcy4gKi8KKyNpZiBfX0dNUF9NUF9TSVpFX1RfSU5UCisjZGVmaW5lIF9fTVBGUl9FWFBfTkFOICAoKG1wX2V4cF90KSgofigofih1bnNpZ25lZCBpbnQpMCk+PjEpKSsyKSkKKyNkZWZpbmUgX19NUEZSX0VYUF9aRVJPICgobXBfZXhwX3QpKCh+KCh+KHVuc2lnbmVkIGludCkwKT4+MSkpKzEpKQorI2RlZmluZSBfX01QRlJfRVhQX0lORiAgKChtcF9leHBfdCkoKH4oKH4odW5zaWduZWQgaW50KTApPj4xKSkrMykpCisjZWxzZQorI2RlZmluZSBfX01QRlJfRVhQX05BTiAgKChtcF9leHBfdCkoKH4oKH4odW5zaWduZWQgbG9uZykwKT4+MSkpKzIpKQorI2RlZmluZSBfX01QRlJfRVhQX1pFUk8gKChtcF9leHBfdCkoKH4oKH4odW5zaWduZWQgbG9uZykwKT4+MSkpKzEpKQorI2RlZmluZSBfX01QRlJfRVhQX0lORiAgKChtcF9leHBfdCkoKH4oKH4odW5zaWduZWQgbG9uZykwKT4+MSkpKzMpKQorI2VuZGlmCisKKy8qIERlZmluZSBNUEZSX1VTRV9FWFRFTlNJT04gdG8gYXZvaWQgImdjYyAtcGVkYW50aWMiIHdhcm5pbmdzLiAqLworI2lmbmRlZiBNUEZSX0VYVEVOU0lPTgorIyBpZiBkZWZpbmVkKE1QRlJfVVNFX0VYVEVOU0lPTikKKyMgIGRlZmluZSBNUEZSX0VYVEVOU0lPTiBfX2V4dGVuc2lvbl9fCisjIGVsc2UKKyMgIGRlZmluZSBNUEZSX0VYVEVOU0lPTgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdhcm5pbmchIFRoaXMgbWFjcm8gZG9lc24ndCB3b3JrIHdpdGggSyZSIEMgYW5kIHNob3VsZG4ndCBiZSB1c2VkCisgICBpbnRlcm5hbGx5LiBGb3IgcHVibGljIHVzZSBvbmx5LCBidXQgc2VlIHRoZSBNUEZSIG1hbnVhbC4gKi8KKyNkZWZpbmUgTVBGUl9ERUNMX0lOSVQoX3gsIF9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1QRlJfRVhURU5TSU9OIG1wX2xpbWJfdCBfX2dtcGZyX2xvY2FsX3RhYl8jI194WygoX3ApLTEpL0dNUF9OVU1CX0JJVFMrMV07IFwKKyAgTVBGUl9FWFRFTlNJT04gbXBmcl90IF94ID0ge3soX3ApLDEsX19NUEZSX0VYUF9OQU4sX19nbXBmcl9sb2NhbF90YWJfIyNfeH19CisKKy8qIEZhc3QgYWNjZXNzIG1hY3JvcyB0byByZXBsYWNlIGZ1bmN0aW9uIGludGVyZmFjZS4KKyAgIElmIHRoZSBVU0VSIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBtYWNybyBpbnRlcmZhY2UsIGxldCBoaW0gbWFrZSBoYXBweQorICAgZXZlbiBpZiBpdCBwcm9kdWNlcyBmYXN0ZXIgYW5kIHNtYWxsZXIgY29kZS4gKi8KKyNpZm5kZWYgTVBGUl9VU0VfTk9fTUFDUk8KKworLyogSW5saW5pbmcgdGhlc2VzIGZ1bmN0aW9ucyBpcyBib3RoIGZhc3RlciBhbmQgc21hbGxlciAqLworI2RlZmluZSBtcGZyX25hbl9wKF94KSAgICAoKF94KS0+X21wZnJfZXhwID09IF9fTVBGUl9FWFBfTkFOKQorI2RlZmluZSBtcGZyX2luZl9wKF94KSAgICAoKF94KS0+X21wZnJfZXhwID09IF9fTVBGUl9FWFBfSU5GKQorI2RlZmluZSBtcGZyX3plcm9fcChfeCkgICAoKF94KS0+X21wZnJfZXhwID09IF9fTVBGUl9FWFBfWkVSTykKKyNkZWZpbmUgbXBmcl9zZ24oX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKF94KS0+X21wZnJfZXhwIDwgX19NUEZSX0VYUF9JTkYgPyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAobXBmcl9uYW5fcCAoX3gpID8gbXBmcl9zZXRfZXJhbmdlZmxhZyAoKSA6ICh2b2lkKSAwKSwgMCA6IFwKKyAgIE1QRlJfU0lHTiAoX3gpKQorCisvKiBQcmV2ZW50IHRoZW0gZnJvbSB1c2luZyBhcyBsdmFsdWVzICovCisjZGVmaW5lIG1wZnJfZ2V0X3ByZWMoX3gpICgoX3gpLT5fbXBmcl9wcmVjICsgMCkKKyNkZWZpbmUgbXBmcl9nZXRfZXhwKF94KSAgKChfeCktPl9tcGZyX2V4cCArIDApCisKKyNkZWZpbmUgbXBmcl9yb3VuZChhLGIpIG1wZnJfcmludCgoYSksIChiKSwgR01QX1JORE5BKQorI2RlZmluZSBtcGZyX3RydW5jKGEsYikgbXBmcl9yaW50KChhKSwgKGIpLCBHTVBfUk5EWikKKyNkZWZpbmUgbXBmcl9jZWlsKGEsYikgIG1wZnJfcmludCgoYSksIChiKSwgR01QX1JORFUpCisjZGVmaW5lIG1wZnJfZmxvb3IoYSxiKSBtcGZyX3JpbnQoKGEpLCAoYiksIEdNUF9STkREKQorCisjZGVmaW5lIG1wZnJfY21wX3VpKGIsaSkgbXBmcl9jbXBfdWlfMmV4cCgoYiksKGkpLDApCisjZGVmaW5lIG1wZnJfY21wX3NpKGIsaSkgbXBmcl9jbXBfc2lfMmV4cCgoYiksKGkpLDApCisjZGVmaW5lIG1wZnJfc2V0KGEsYixyKSAgbXBmcl9zZXQ0KGEsYixyLE1QRlJfU0lHTihiKSkKKyNkZWZpbmUgbXBmcl9hYnMoYSxiLHIpICBtcGZyX3NldDQoYSxiLHIsMSkKKyNkZWZpbmUgbXBmcl9jb3B5c2lnbihhLGIsYyxyKSBtcGZyX3NldDQoYSxiLHIsTVBGUl9TSUdOKGMpKQorI2RlZmluZSBtcGZyX3NldHNpZ24oYSxiLHMscikgbXBmcl9zZXQ0KGEsYixyLChzKSA/IC0xIDogMSkKKyNkZWZpbmUgbXBmcl9zaWduYml0KHgpICAoTVBGUl9TSUdOKHgpIDwgMCkKKyNkZWZpbmUgbXBmcl9jbXAoYiwgYykgICBtcGZyX2NtcDMoYiwgYywgMSkKKyNkZWZpbmUgbXBmcl9tdWxfMmV4cCh5LHgsbixyKSBtcGZyX211bF8ydWkoKHkpLCh4KSwobiksKHIpKQorI2RlZmluZSBtcGZyX2Rpdl8yZXhwKHkseCxuLHIpIG1wZnJfZGl2XzJ1aSgoeSksKHgpLChuKSwocikpCisKKworLyogV2hlbiB1c2luZyBHQ0MsIG9wdGltaXplIGNlcnRhaW4gY29tbW9uIGNvbXBhcmlzb25zIGFuZCBhZmZlY3RhdGlvbnMuCisgICArIFJlbW92ZSBJQ0Mgc2luY2UgaXQgZGVmaW5lcyBfX0dOVUNfXyBidXQgcHJvZHVjZXMgYQorICAgICBodWdlIG51bWJlciBvZiB3YXJuaW5ncyBpZiB5b3UgdXNlIHRoaXMgY29kZS4KKyAgICAgVkw6IEkgY291bGRuJ3QgcmVwcm9kdWNlIGEgc2luZ2xlIHdhcm5pbmcgd2hlbiBlbmFibGluZyB0aGVzZSBtYWNyb3MKKyAgICAgd2l0aCBpY2MgMTAuMSAyMDA4MDIxMiBvbiBJdGFuaXVtLiBCdXQgd2l0aCB0aGlzIHZlcnNpb24sIF9fSUNDIGlzbid0CisgICAgIGRlZmluZWQgKF9fSU5URUxfQ09NUElMRVIgaXMsIHRob3VnaCksIHNvIHRoYXQgdGhlc2UgbWFjcm9zIGFyZSBlbmFibGVkCisgICAgIGFueXdheS4gQ2hlY2tpbmcgd2l0aCBvdGhlciBJQ0MgdmVyc2lvbnMgaXMgbmVlZGVkLiBQb3NzaWJseSBkZXRlY3QKKyAgICAgd2hldGhlciB3YXJuaW5ncyBhcmUgcHJvZHVjZWQgb3Igbm90IHdpdGggYSBjb25maWd1cmUgdGVzdC4KKyAgICsgUmVtb3ZlIEMrKyB0b28sIHNpbmNlIGl0IGNvbXBsYWlucyB0b28gbXVjaC4gKi8KKyNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JQ0MpICYmICFkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2lmIChfX0dOVUNfXyA+PSAyKQorI3VuZGVmIG1wZnJfY21wX3VpCisvKiBXZSB1c2UgdGhlIGZhY3QgdGhhdCBtcGZyX3NnbiBvbiBOYU4gc2V0cyB0aGUgZXJhbmdlIGZsYWcgYW5kIHJldHVybnMgMC4gKi8KKyNkZWZpbmUgbXBmcl9jbXBfdWkoX2YsX3UpICAgICAgICAgICAgICAgICBcCisgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfdSkgJiYgKF91KSA9PSAwID8gXAorICAgbXBmcl9zZ24gKF9mKSA6ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIG1wZnJfY21wX3VpXzJleHAgKChfZiksKF91KSwwKSkKKyN1bmRlZiBtcGZyX2NtcF9zaQorI2RlZmluZSBtcGZyX2NtcF9zaShfZixfcykgICAgICAgICAgICAgICAgIFwKKyAoX19idWlsdGluX2NvbnN0YW50X3AgKF9zKSAmJiAoX3MpID49IDAgPyBcCisgICBtcGZyX2NtcF91aSAoKF9mKSwgKF9zKSkgOiAgICAgICAgICAgICAgXAorICAgbXBmcl9jbXBfc2lfMmV4cCAoKF9mKSwgKF9zKSwgMCkpCisjaWYgX19HTlVDX18gPiAyIHx8IF9fR05VQ19NSU5PUl9fID49IDk1CisjdW5kZWYgbXBmcl9zZXRfdWkKKyNkZWZpbmUgbXBmcl9zZXRfdWkoX2YsX3UsX3IpICAgICAgICAgICAgICBcCisgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfdSkgJiYgKF91KSA9PSAwID8gXAorICAgX19leHRlbnNpb25fXyAoeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgbXBmcl9wdHIgX3AgPSAoX2YpOyAgICAgICAgICAgICAgICAgICBcCisgICAgIF9wLT5fbXBmcl9zaWduID0gMTsgICAgICAgICAgICAgICAgICAgXAorICAgICBfcC0+X21wZnJfZXhwID0gX19NUEZSX0VYUF9aRVJPOyAgICAgIFwKKyAgICAgKHZvaWQpIChfcik7IDA7IH0pIDogICAgICAgICAgICAgICAgICBcCisgICBtcGZyX3NldF91aV8yZXhwICgoX2YpLCAoX3UpLCAwLCAoX3IpKSkKKyNlbmRpZgorI3VuZGVmIG1wZnJfc2V0X3NpCisjZGVmaW5lIG1wZnJfc2V0X3NpKF9mLF9zLF9yKSAgICAgICAgICAgICAgXAorIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX3MpICYmIChfcykgPj0gMCA/IFwKKyAgIG1wZnJfc2V0X3VpICgoX2YpLCAoX3MpLCAoX3IpKSA6ICAgICAgICBcCisgICBtcGZyX3NldF9zaV8yZXhwICgoX2YpLCAoX3MpLCAwLCAoX3IpKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIE1hY3JvIHZlcnNpb24gb2YgbXBmcl9zdGFjayBpbnRlcmZhY2UgZm9yIGZhc3QgYWNjZXNzICovCisjZGVmaW5lIG1wZnJfY3VzdG9tX2dldF9zaXplKHApICgoc2l6ZV90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKCgocCkrR01QX05VTUJfQklUUy0xKS9HTVBfTlVNQl9CSVRTKnNpemVvZiAobXBfbGltYl90KSkpCisjZGVmaW5lIG1wZnJfY3VzdG9tX2luaXQobSxwKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXBmcl9jdXN0b21fZ2V0X21hbnRpc3NhKHgpICgodm9pZCopKCh4KS0+X21wZnJfZCkpCisjZGVmaW5lIG1wZnJfY3VzdG9tX2dldF9leHAoeCkgKCh4KS0+X21wZnJfZXhwKQorI2RlZmluZSBtcGZyX2N1c3RvbV9tb3ZlKHgsbSkgZG8geyAoKHgpLT5fbXBmcl9kID0gKG1wX2xpbWJfdCopKG0pKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbXBmcl9jdXN0b21faW5pdF9zZXQoeCxrLGUscCxtKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIG1wZnJfcHRyIF94ID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1wX2V4cF90IF9lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1wZnJfa2luZF90IF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBfcywgX2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9rID0gKGspOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChfayA+PSAwKSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPSAobXBmcl9raW5kX3QpIF9rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPSAobXBmcl9raW5kX3QpIC1rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3MgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9lID0gX3QgPT0gTVBGUl9SRUdVTEFSX0tJTkQgPyAoZSkgOiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPT0gTVBGUl9OQU5fS0lORCA/IF9fTVBGUl9FWFBfTkFOIDogICAgICAgICAgICAgICAgICAgICBcCisgICAgX3QgPT0gTVBGUl9JTkZfS0lORCA/IF9fTVBGUl9FWFBfSU5GIDogX19NUEZSX0VYUF9aRVJPOyAgICBcCisgIF94LT5fbXBmcl9wcmVjID0gKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF94LT5fbXBmcl9zaWduID0gX3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF94LT5fbXBmcl9leHAgID0gX2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF94LT5fbXBmcl9kICAgID0gKG1wX2xpbWJfdCopIChtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbXBmcl9jdXN0b21fZ2V0X2tpbmQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICh4KS0+X21wZnJfZXhwID4gIF9fTVBGUl9FWFBfSU5GID8gKGludClNUEZSX1JFR1VMQVJfS0lORCpNUEZSX1NJR04gKHgpIFwKKyAgOiAoeCktPl9tcGZyX2V4cCA9PSBfX01QRlJfRVhQX0lORiA/IChpbnQpTVBGUl9JTkZfS0lORCpNUEZSX1NJR04gKHgpICAgICBcCisgIDogKHgpLT5fbXBmcl9leHAgPT0gX19NUEZSX0VYUF9OQU4gPyAoaW50KU1QRlJfTkFOX0tJTkQgICAgICAgICAgICAgICAgICAgXAorICA6IChpbnQpIE1QRlJfWkVST19LSU5EICogTVBGUl9TSUdOICh4KSApCisKKworI2VuZGlmIC8qIE1QRlJfVVNFX05PX01BQ1JPICovCisKKy8qIFRoZXNlcyBhcmUgZGVmaW5lZCB0byBiZSBtYWNyb3MgKi8KKyNkZWZpbmUgbXBmcl9pbml0X3NldF9zaSh4LCBpLCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXRfc2koKHgpLCAoaSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfdWkoeCwgaSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X3VpKCh4KSwgKGkpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X2QoeCwgZCwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X2QoKHgpLCAoZCksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfbGQoeCwgZCwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X2xkKCh4KSwgKGQpLCAocm5kKSkgKQorI2RlZmluZSBtcGZyX2luaXRfc2V0X3ooeCwgaSwgcm5kKSBcCisgKCBtcGZyX2luaXQoeCksIG1wZnJfc2V0X3ooKHgpLCAoaSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfcSh4LCBpLCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXRfcSgoeCksIChpKSwgKHJuZCkpICkKKyNkZWZpbmUgbXBmcl9pbml0X3NldCh4LCB5LCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXQoKHgpLCAoeSksIChybmQpKSApCisjZGVmaW5lIG1wZnJfaW5pdF9zZXRfZih4LCB5LCBybmQpIFwKKyAoIG1wZnJfaW5pdCh4KSwgbXBmcl9zZXRfZigoeCksICh5KSwgKHJuZCkpICkKKworLyogQ29tcGF0aWJpbGl0eSBsYXllciAtLSBvYnNvbGV0ZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyAqLworI2RlZmluZSBtcGZyX2NtcF9hYnMgbXBmcl9jbXBhYnMKKyNkZWZpbmUgbXBmcl9yb3VuZF9wcmVjKHgscixwKSBtcGZyX3ByZWNfcm91bmQoeCxwLHIpCisjZGVmaW5lIF9fZ21wX2RlZmF1bHRfcm91bmRpbmdfbW9kZSAobXBmcl9nZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlKCkpCisjZGVmaW5lIF9fbXBmcl9lbWluIChtcGZyX2dldF9lbWluKCkpCisjZGVmaW5lIF9fbXBmcl9lbWF4IChtcGZyX2dldF9lbWF4KCkpCisjZGVmaW5lIF9fbXBmcl9kZWZhdWx0X2ZwX2JpdF9wcmVjaXNpb24gKG1wZnJfZ2V0X2RlZmF1bHRfZnBfYml0X3ByZWNpc2lvbigpKQorI2RlZmluZSBNUEZSX0VNSU5fTUlOIG1wZnJfZ2V0X2VtaW5fbWluKCkKKyNkZWZpbmUgTVBGUl9FTUlOX01BWCBtcGZyX2dldF9lbWluX21heCgpCisjZGVmaW5lIE1QRlJfRU1BWF9NSU4gbXBmcl9nZXRfZW1heF9taW4oKQorI2RlZmluZSBNUEZSX0VNQVhfTUFYIG1wZnJfZ2V0X2VtYXhfbWF4KCkKKyNkZWZpbmUgbXBmcl92ZXJzaW9uIChtcGZyX2dldF92ZXJzaW9uKCkpCisjaWZuZGVmIG1wel9zZXRfZnIKKyMgZGVmaW5lIG1wel9zZXRfZnIgbXBmcl9nZXRfegorI2VuZGlmCisjZGVmaW5lIG1wZnJfYWRkX29uZV91bHAoeCxyKSBcCisgKG1wZnJfc2duICh4KSA+IDAgPyBtcGZyX25leHRhYm92ZSAoeCkgOiBtcGZyX25leHRiZWxvdyAoeCkpCisjZGVmaW5lIG1wZnJfc3ViX29uZV91bHAoeCxyKSBcCisgKG1wZnJfc2duICh4KSA+IDAgPyBtcGZyX25leHRiZWxvdyAoeCkgOiBtcGZyX25leHRhYm92ZSAoeCkpCisKKyNlbmRpZiAvKiBfX01QRlJfSCovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0YmVnaW4ubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRiZWdpbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2UyMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0YmVnaW4ubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0YmVnaW5TLm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0YmVnaW5TLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5Mzg2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRiZWdpblMubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0YmVnaW5ULm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0YmVnaW5ULm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmN2UwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRiZWdpblQubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0ZW5kLm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0ZW5kLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkYWNhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRlbmQubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0ZW5kUy5vIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NydGVuZFMubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY4NGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NydGVuZFMubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0ZmFzdG1hdGgubyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRmYXN0bWF0aC5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWNmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0ZmFzdG1hdGgubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0cHJlYzMyLm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0cHJlYzMyLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjMmIxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRwcmVjMzIubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0cHJlYzY0Lm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0cHJlYzY0Lm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhMmU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRwcmVjNjQubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0cHJlYzgwLm8gYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY3J0cHJlYzgwLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4MjNlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jcnRwcmVjODAubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvZ2Nvdi1zcmMvZ2Nvdi1pby5jIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2djb3YtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWVjZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2djb3YtaW8uYwpAQCAtMCwwICsxLDk4MCBAQAorLyogRmlsZSBmb3JtYXQgZm9yIGNvdmVyYWdlIGluZm9ybWF0aW9uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcsCisgICAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEJvYiBNYW5zb24gPG1hbnNvbkBjeWdudXMuY29tPi4KKyAgIENvbXBsZXRlbHkgcmVtYW5nbGVkIGJ5IE5hdGhhbiBTaWR3ZWxsIDxuYXRoYW5AY29kZXNvdXJjZXJ5LmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIFJvdXRpbmVzIGRlY2xhcmVkIGluIGdjb3YtaW8uaC4gIFRoaXMgZmlsZSBzaG91bGQgYmUgI2luY2x1ZGVkIGJ5CisgICBhbm90aGVyIHNvdXJjZSBmaWxlLCBhZnRlciBoYXZpbmcgI2luY2x1ZGVkIGdjb3YtaW8uaC4gICovCisKKy8qIFJlZGVmaW5lIHRoZXNlIGhlcmUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBvbmVzIGluIHN5c3RlbS5oIHNpbmNlCisgKiBpbmNsdWRpbmcgc3lzdGVtLmggbGVhZHMgdG8gY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMgb2Ygb3RoZXIKKyAqIHN5bWJvbHMgYW5kIG1hY3Jvcy4gICovCisjdW5kZWYgTUlOCisjZGVmaW5lIE1JTihYLFkpICgoWCkgPCAoWSkgPyAoWCkgOiAoWSkpCisKKyNpZiAhSU5fR0NPVgorc3RhdGljIHZvaWQgZ2Nvdl93cml0ZV9ibG9jayAodW5zaWduZWQpOworc3RhdGljIGdjb3ZfdW5zaWduZWRfdCAqZ2Nvdl93cml0ZV93b3JkcyAodW5zaWduZWQpOworI2VuZGlmCitzdGF0aWMgY29uc3QgZ2Nvdl91bnNpZ25lZF90ICpnY292X3JlYWRfd29yZHMgKHVuc2lnbmVkKTsKKyNpZiAhSU5fTElCR0NPVgorc3RhdGljIHZvaWQgZ2Nvdl9hbGxvY2F0ZSAodW5zaWduZWQpOworI2VuZGlmCisKKyNpZmRlZiBfX0dDT1ZfS0VSTkVMX18KK3N0cnVjdCBnY292X3ZhciBnY292X3ZhciBBVFRSSUJVVEVfSElEREVOOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgZ2Nvdl91bnNpZ25lZF90IGZyb21fZmlsZSAoZ2Nvdl91bnNpZ25lZF90IHZhbHVlKQoreworI2lmICFJTl9MSUJHQ09WCisgIGlmIChnY292X3Zhci5lbmRpYW4pCisgICAgeworICAgICAgdmFsdWUgPSAodmFsdWUgPj4gMTYpIHwgKHZhbHVlIDw8IDE2KTsKKyAgICAgIHZhbHVlID0gKCh2YWx1ZSAmIDB4ZmYwMGZmKSA8PCA4KSB8ICgodmFsdWUgPj4gOCkgJiAweGZmMDBmZik7CisgICAgfQorI2VuZGlmCisgIHJldHVybiB2YWx1ZTsKK30KKworLyogT3BlbiBhIGdjb3YgZmlsZS4gTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBvcGVuIGFuZCBNT0RFCisgICBpbmRpY2F0ZXMgd2hldGhlciBhIG5ldyBmaWxlIHNob3VsZCBiZSBjcmVhdGVkLCBvciBhbiBleGlzdGluZyBmaWxlCisgICBvcGVuZWQuIElmIE1PREUgaXMgPj0gMCBhbiBleGlzdGluZyBmaWxlIHdpbGwgYmUgb3BlbmVkLCBpZgorICAgcG9zc2libGUsIGFuZCBpZiBNT0RFIGlzIDw9IDAsIGEgbmV3IGZpbGUgd2lsbCBiZSBjcmVhdGVkLiBVc2UKKyAgIE1PREU9MCB0byBhdHRlbXB0IHRvIHJlb3BlbiBhbiBleGlzdGluZyBmaWxlIGFuZCB0aGVuIGZhbGwgYmFjayBvbgorICAgY3JlYXRpbmcgYSBuZXcgb25lLiAgSWYgTU9ERSA8IDAsIHRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkIGluCisgICByZWFkLW9ubHkgbW9kZS4gIE90aGVyd2lzZSBpdCB3aWxsIGJlIG9wZW5lZCBmb3IgbW9kaWZpY2F0aW9uLgorICAgUmV0dXJuIHplcm8gb24gZmFpbHVyZSwgPjAgb24gb3BlbmluZyBhbiBleGlzdGluZyBmaWxlIGFuZCA8MCBvbgorICAgY3JlYXRpbmcgYSBuZXcgb25lLiAgKi8KKworI2lmbmRlZiBfX0dDT1ZfS0VSTkVMX18KK0dDT1ZfTElOS0FHRSBpbnQKKyNpZiBJTl9MSUJHQ09WCitnY292X29wZW4gKGNvbnN0IGNoYXIgKm5hbWUpCisjZWxzZQorZ2Nvdl9vcGVuIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSkKKyNlbmRpZgoreworI2lmIElOX0xJQkdDT1YKKyAgY29uc3QgaW50IG1vZGUgPSAwOworI2VuZGlmCisjaWYgR0NPVl9MT0NLRUQKKyAgc3RydWN0IGZsb2NrIHNfZmxvY2s7CisgIGludCBmZDsKKworICBzX2Zsb2NrLmxfd2hlbmNlID0gU0VFS19TRVQ7CisgIHNfZmxvY2subF9zdGFydCA9IDA7CisgIHNfZmxvY2subF9sZW4gPSAwOyAvKiBVbnRpbCBFT0YuICAqLworICBzX2Zsb2NrLmxfcGlkID0gZ2V0cGlkICgpOworI2VuZGlmCisKKyAgZ2NjX2Fzc2VydCAoIWdjb3ZfdmFyLmZpbGUpOworICBnY292X3Zhci5zdGFydCA9IDA7CisgIGdjb3ZfdmFyLm9mZnNldCA9IGdjb3ZfdmFyLmxlbmd0aCA9IDA7CisgIGdjb3ZfdmFyLm92ZXJyZWFkID0gLTF1OworICBnY292X3Zhci5lcnJvciA9IDA7CisjaWYgIUlOX0xJQkdDT1YKKyAgZ2Nvdl92YXIuZW5kaWFuID0gMDsKKyNlbmRpZgorI2lmIEdDT1ZfTE9DS0VECisgIGlmIChtb2RlID4gMCkKKyAgICB7CisgICAgICAvKiBSZWFkLW9ubHkgbW9kZSAtIGFjcXVpcmUgYSByZWFkLWxvY2suICAqLworICAgICAgc19mbG9jay5sX3R5cGUgPSBGX1JETENLOworICAgICAgZmQgPSBvcGVuIChuYW1lLCBPX1JET05MWSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV3JpdGUgbW9kZSAtIGFjcXVpcmUgYSB3cml0ZS1sb2NrLiAgKi8KKyAgICAgIHNfZmxvY2subF90eXBlID0gRl9XUkxDSzsKKyAgICAgIGZkID0gb3BlbiAobmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDY2Nik7CisgICAgfQorICBpZiAoZmQgPCAwKQorICAgIHJldHVybiAwOworCisgIHdoaWxlIChmY250bCAoZmQsIEZfU0VUTEtXLCAmc19mbG9jaykgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgY29udGludWU7CisKKyAgZ2Nvdl92YXIuZmlsZSA9IGZkb3BlbiAoZmQsIChtb2RlID4gMCkgPyAicmIiIDogInIrYiIpOworCisgIGlmICghZ2Nvdl92YXIuZmlsZSkKKyAgICB7CisgICAgICBjbG9zZSAoZmQpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIGlmIChtb2RlID4gMCkKKyAgICBnY292X3Zhci5tb2RlID0gMTsKKyAgZWxzZSBpZiAobW9kZSA9PSAwKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgICBpZiAoZnN0YXQgKGZkLCAmc3QpIDwgMCkKKwl7CisJICBmY2xvc2UgKGdjb3ZfdmFyLmZpbGUpOworCSAgZ2Nvdl92YXIuZmlsZSA9IDA7CisJICByZXR1cm4gMDsKKwl9CisgICAgICBpZiAoc3Quc3Rfc2l6ZSAhPSAwKQorCWdjb3ZfdmFyLm1vZGUgPSAxOworICAgICAgZWxzZQorCWdjb3ZfdmFyLm1vZGUgPSBtb2RlICogMiArIDE7CisgICAgfQorICBlbHNlCisgICAgZ2Nvdl92YXIubW9kZSA9IG1vZGUgKiAyICsgMTsKKyNlbHNlCisgIGlmIChtb2RlID49IDApCisgICAgZ2Nvdl92YXIuZmlsZSA9IGZvcGVuIChuYW1lLCAobW9kZSA+IDApID8gInJiIiA6ICJyK2IiKTsKKworICBpZiAoZ2Nvdl92YXIuZmlsZSkKKyAgICBnY292X3Zhci5tb2RlID0gMTsKKyAgZWxzZSBpZiAobW9kZSA8PSAwKQorICAgIHsKKyAgICAgIGdjb3ZfdmFyLmZpbGUgPSBmb3BlbiAobmFtZSwgIncrYiIpOworICAgICAgaWYgKGdjb3ZfdmFyLmZpbGUpCisJZ2Nvdl92YXIubW9kZSA9IG1vZGUgKiAyICsgMTsKKyAgICB9CisgIGlmICghZ2Nvdl92YXIuZmlsZSkKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgIHNldGJ1ZiAoZ2Nvdl92YXIuZmlsZSwgKGNoYXIgKikwKTsKKworICByZXR1cm4gMTsKK30KKyNlbHNlIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCitleHRlcm4gX0dDT1ZfRklMRSAqZ2Nvdl9jdXJyZW50X2ZpbGU7CisKK0dDT1ZfTElOS0FHRSBpbnQKK2djb3Zfb3BlbiAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgZ2Nvdl92YXIuc3RhcnQgPSAwOworICBnY292X3Zhci5vZmZzZXQgPSBnY292X3Zhci5sZW5ndGggPSAwOworICBnY292X3Zhci5vdmVycmVhZCA9IC0xdTsKKyAgZ2Nvdl92YXIuZXJyb3IgPSAwOworICBnY292X3Zhci5maWxlID0gZ2Nvdl9jdXJyZW50X2ZpbGU7CisgIGdjb3ZfdmFyLm1vZGUgPSAxOworCisgIHJldHVybiAxOworfQorI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisvKiBDbG9zZSB0aGUgY3VycmVudCBnY292IGZpbGUuIEZsdXNoZXMgZGF0YSB0byBkaXNrLiBSZXR1cm5zIG5vbnplcm8KKyAgIG9uIGZhaWx1cmUgb3IgZXJyb3IgZmxhZyBzZXQuICAqLworCitHQ09WX0xJTktBR0UgaW50CitnY292X2Nsb3NlICh2b2lkKQoreworICBpZiAoZ2Nvdl92YXIuZmlsZSkKKyAgICB7CisjaWYgIUlOX0dDT1YKKyAgICAgIGlmIChnY292X3Zhci5vZmZzZXQgJiYgZ2Nvdl92YXIubW9kZSA8IDApCisJZ2Nvdl93cml0ZV9ibG9jayAoZ2Nvdl92YXIub2Zmc2V0KTsKKyNlbmRpZgorICAgICAgX0dDT1ZfZmNsb3NlIChnY292X3Zhci5maWxlKTsKKyAgICAgIGdjb3ZfdmFyLmZpbGUgPSAwOworICAgICAgZ2Nvdl92YXIubGVuZ3RoID0gMDsKKyAgICB9CisjaWYgIUlOX0xJQkdDT1YKKyAgZnJlZSAoZ2Nvdl92YXIuYnVmZmVyKTsKKyAgZ2Nvdl92YXIuYWxsb2MgPSAwOworICBnY292X3Zhci5idWZmZXIgPSAwOworI2VuZGlmCisgIGdjb3ZfdmFyLm1vZGUgPSAwOworICByZXR1cm4gZ2Nvdl92YXIuZXJyb3I7Cit9CisKKyNpZiAhSU5fTElCR0NPVgorLyogTW9kaWZ5IEZJTEVOQU1FIHRvIGEgY2Fub25pY2FsIGZvcm0gYWZ0ZXIgc3RyaXBwaW5nIGtub3duIHByZWZpeGVzCisgICBpbiBwbGFjZS4gIEl0IHJlbW92ZXMgJy9wcm9jL3NlbGYvY3dkJyBhbmQgJy9wcm9jL3NlbGYvY3dkLy4nLgorICAgUmV0dXJucyB0aGUgaW4tcGxhY2UgbW9kaWZpZWQgZmlsZW5hbWUuICAqLworCitHQ09WX0xJTktBR0UgY2hhciAqCitnY292X2Nhbm9uaWNhbF9maWxlbmFtZSAoY2hhciAqZmlsZW5hbWUpCit7CisgIHN0YXRpYyBjaGFyIGN3ZF9kb3Rfc3RyW10gPSAiL3Byb2Mvc2VsZi9jd2QvLi8iOworICBpbnQgY3dkX2RvdF9sZW4gPSBzdHJsZW4gKGN3ZF9kb3Rfc3RyKTsKKyAgaW50IGN3ZF9sZW4gPSBjd2RfZG90X2xlbiAtIDI7IC8qIHdpdGhvdXQgdHJhaWxpbmcgJy4vJyAqLworICBpbnQgZmlsZW5hbWVfbGVuID0gc3RybGVuIChmaWxlbmFtZSk7CisgIC8qIGRlbGV0ZSB0aGUgbG9uZ2VyIHByZWZpeCBmaXJzdCAqLworICBpZiAoMCA9PSBzdHJuY21wIChmaWxlbmFtZSwgY3dkX2RvdF9zdHIsIGN3ZF9kb3RfbGVuKSkKKyAgICB7CisgICAgICBtZW1tb3ZlIChmaWxlbmFtZSwgZmlsZW5hbWUgKyBjd2RfZG90X2xlbiwgZmlsZW5hbWVfbGVuIC0gY3dkX2RvdF9sZW4pOworICAgICAgZmlsZW5hbWVbZmlsZW5hbWVfbGVuIC0gY3dkX2RvdF9sZW5dID0gJ1wwJzsKKyAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKKyAgaWYgKDAgPT0gc3RybmNtcCAoZmlsZW5hbWUsIGN3ZF9kb3Rfc3RyLCBjd2RfbGVuKSkKKyAgICB7CisgICAgICBtZW1tb3ZlIChmaWxlbmFtZSwgZmlsZW5hbWUgKyBjd2RfbGVuLCBmaWxlbmFtZV9sZW4gLSBjd2RfbGVuKTsKKyAgICAgIGZpbGVuYW1lW2ZpbGVuYW1lX2xlbiAtIGN3ZF9sZW5dID0gJ1wwJzsKKyAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisgIHJldHVybiBmaWxlbmFtZTsKK30KKworLyogUmVhZCBMRU4gd29yZHMgYW5kIGNvbnN0cnVjdCBsb2FkIGxhdGVuY3kgaW5mbyBMTF9JTkZPLiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3ZfcmVhZF9wbXVfbG9hZF9sYXRlbmN5X2luZm8gKGdjb3ZfcG11X2xsX2luZm9fdCAqbGxfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3ZfdW5zaWduZWRfdCBsZW4gQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGxsX2luZm8tPmNvdW50cyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbGxfaW5mby0+c2VsZiA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbGxfaW5mby0+Y3VtID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBsbF9pbmZvLT5sdF8xMCA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbGxfaW5mby0+bHRfMzIgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIGxsX2luZm8tPmx0XzY0ID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBsbF9pbmZvLT5sdF8yNTYgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIGxsX2luZm8tPmx0XzEwMjQgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIGxsX2luZm8tPmd0XzEwMjQgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIGxsX2luZm8tPndzZWxmID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBsbF9pbmZvLT5jb2RlX2FkZHIgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgbGxfaW5mby0+bGluZSA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbGxfaW5mby0+ZGlzY3JpbWluYXRvciA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgZmlsZW5hbWUgPSBnY292X3JlYWRfc3RyaW5nICgpOworICBpZiAoZmlsZW5hbWUpCisgICAgbGxfaW5mby0+ZmlsZW5hbWUgPSBnY292X2Nhbm9uaWNhbF9maWxlbmFtZSAoeHN0cmR1cCAoZmlsZW5hbWUpKTsKKyAgZWxzZQorICAgIGxsX2luZm8tPmZpbGVuYW1lID0gMDsKK30KKworLyogUmVhZCBMRU4gd29yZHMgYW5kIGNvbnN0cnVjdCBicmFuY2ggbWlzcHJlZGljdCBpbmZvIEJSTV9JTkZPLiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3ZfcmVhZF9wbXVfYnJhbmNoX21pc3ByZWRpY3RfaW5mbyAoZ2Nvdl9wbXVfYnJtX2luZm9fdCAqYnJtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3ZfdW5zaWduZWRfdCBsZW4gQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgIGJybV9pbmZvLT5jb3VudHMgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIGJybV9pbmZvLT5zZWxmID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBicm1faW5mby0+Y3VtID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBicm1faW5mby0+Y29kZV9hZGRyID0gZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7CisgIGJybV9pbmZvLT5saW5lID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBicm1faW5mby0+ZGlzY3JpbWluYXRvciA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgZmlsZW5hbWUgPSBnY292X3JlYWRfc3RyaW5nICgpOworICBpZiAoZmlsZW5hbWUpCisgICAgYnJtX2luZm8tPmZpbGVuYW1lID0gZ2Nvdl9jYW5vbmljYWxfZmlsZW5hbWUgKHhzdHJkdXAgKGZpbGVuYW1lKSk7CisgIGVsc2UKKyAgICBicm1faW5mby0+ZmlsZW5hbWUgPSAwOworfQorCisvKiBSZWFkIExFTiB3b3JkcyBmcm9tIGFuIG9wZW4gZ2NvdiBmaWxlIGFuZCBjb25zdHJ1Y3QgZGF0YSBpbnRvIHBtdQorICAgdG9vbCBoZWFkZXIgVE9PTF9IRUFERVIuICAqLworCitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3JlYWRfcG11X3Rvb2xfaGVhZGVyIChnY292X3BtdV90b29sX2hlYWRlcl90ICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Nvdl91bnNpZ25lZF90IGxlbiBBVFRSSUJVVEVfVU5VU0VEKQoreworICBjb25zdCBjaGFyICpzdHI7CisgIHN0ciA9IGdjb3ZfcmVhZF9zdHJpbmcgKCk7CisgIGhlYWRlci0+aG9zdF9jcHUgPSBzdHIgPyB4c3RyZHVwIChzdHIpIDogMDsKKyAgc3RyID0gZ2Nvdl9yZWFkX3N0cmluZyAoKTsKKyAgaGVhZGVyLT5ob3N0bmFtZSA9IHN0ciA/IHhzdHJkdXAgKHN0cikgOiAwOworICBzdHIgPSBnY292X3JlYWRfc3RyaW5nICgpOworICBoZWFkZXItPmtlcm5lbF92ZXJzaW9uID0gc3RyID8geHN0cmR1cCAoc3RyKSA6IDA7CisgIHN0ciA9IGdjb3ZfcmVhZF9zdHJpbmcgKCk7CisgIGhlYWRlci0+Y29sdW1uX2hlYWRlciA9IHN0ciA/IHhzdHJkdXAgKHN0cikgOiAwOworICBzdHIgPSBnY292X3JlYWRfc3RyaW5nICgpOworICBoZWFkZXItPmNvbHVtbl9kZXNjcmlwdGlvbiA9IHN0ciA/IHhzdHJkdXAgKHN0cikgOiAwOworICBzdHIgPSBnY292X3JlYWRfc3RyaW5nICgpOworICBoZWFkZXItPmZ1bGxfaGVhZGVyID0gc3RyID8geHN0cmR1cCAoc3RyKSA6IDA7Cit9CisjZW5kaWYKKworI2lmICFJTl9MSUJHQ09WCisvKiBDaGVjayBpZiBNQUdJQyBpcyBFWFBFQ1RFRC4gVXNlIGl0IHRvIGRldGVybWluZSBlbmRpYW5uZXNzIG9mIHRoZQorICAgZmlsZS4gUmV0dXJucyArMSBmb3Igc2FtZSBlbmRpYW4sIC0xIGZvciBvdGhlciBlbmRpYW4gYW5kIHplcm8gZm9yCisgICBub3QgRVhQRUNURUQuICAqLworCitHQ09WX0xJTktBR0UgaW50CitnY292X21hZ2ljIChnY292X3Vuc2lnbmVkX3QgbWFnaWMsIGdjb3ZfdW5zaWduZWRfdCBleHBlY3RlZCkKK3sKKyAgaWYgKG1hZ2ljID09IGV4cGVjdGVkKQorICAgIHJldHVybiAxOworICBtYWdpYyA9IChtYWdpYyA+PiAxNikgfCAobWFnaWMgPDwgMTYpOworICBtYWdpYyA9ICgobWFnaWMgJiAweGZmMDBmZikgPDwgOCkgfCAoKG1hZ2ljID4+IDgpICYgMHhmZjAwZmYpOworICBpZiAobWFnaWMgPT0gZXhwZWN0ZWQpCisgICAgeworICAgICAgZ2Nvdl92YXIuZW5kaWFuID0gMTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiAhSU5fTElCR0NPVgorc3RhdGljIHZvaWQKK2djb3ZfYWxsb2NhdGUgKHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgc2l6ZV90IG5ld19zaXplID0gZ2Nvdl92YXIuYWxsb2M7CisKKyAgaWYgKCFuZXdfc2l6ZSkKKyAgICBuZXdfc2l6ZSA9IEdDT1ZfQkxPQ0tfU0laRTsKKyAgbmV3X3NpemUgKz0gbGVuZ3RoOworICBuZXdfc2l6ZSAqPSAyOworCisgIGdjb3ZfdmFyLmFsbG9jID0gbmV3X3NpemU7CisgIGdjb3ZfdmFyLmJ1ZmZlciA9IFhSRVNJWkVWQVIgKGdjb3ZfdW5zaWduZWRfdCwgZ2Nvdl92YXIuYnVmZmVyLCBuZXdfc2l6ZSA8PCAyKTsKK30KKyNlbmRpZgorCisjaWYgIUlOX0dDT1YKKy8qIFdyaXRlIG91dCB0aGUgY3VycmVudCBibG9jaywgaWYgbmVlZHMgYmUuICAqLworCitzdGF0aWMgdm9pZAorZ2Nvdl93cml0ZV9ibG9jayAodW5zaWduZWQgc2l6ZSkKK3sKKyAgaWYgKF9HQ09WX2Z3cml0ZSAoZ2Nvdl92YXIuYnVmZmVyLCBzaXplIDw8IDIsIDEsIGdjb3ZfdmFyLmZpbGUpICE9IDEpCisgICAgZ2Nvdl92YXIuZXJyb3IgPSAxOworICBnY292X3Zhci5zdGFydCArPSBzaXplOworICBnY292X3Zhci5vZmZzZXQgLT0gc2l6ZTsKK30KKworI2lmIElOX0xJQkdDT1YKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHdvcmRzIFNUUklORyB3b3VsZCBuZWVkIGluY2x1ZGluZyB0aGUgbGVuZ3RoCisgICBmaWVsZCBpbiB0aGUgb3V0cHV0IHN0cmVhbSBpdHNlbGYuICBUaGlzIHNob3VsZCBiZSBpZGVudGljYWwgdG8KKyAgICJhbGxvYyIgY2FsY3VsYXRpb24gaW4gZ2Nvdl93cml0ZV9zdHJpbmcoKS4gICovCisKK0dDT1ZfTElOS0FHRSBnY292X3Vuc2lnbmVkX3QKK2djb3Zfc3RyaW5nX2xlbmd0aCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICBnY292X3Vuc2lnbmVkX3QgbGVuID0gKHN0cmluZykgPyBzdHJsZW4gKHN0cmluZykgOiAwOworICAvKiArIDEgYmVjYXVzZSBvZiB0aGUgbGVuZ3RoIGZpZWxkLiAgKi8KKyAgZ2Nvdl91bnNpZ25lZF90IGFsbG9jID0gMSArICgobGVuICsgNCkgPj4gMik7CisKKyAgLyogQ2FuIG5vdCB3cml0ZSBhIGJpZ2dlciB0aGFuIEdDT1ZfQkxPQ0tfU0laRSBzdHJpbmcgeWV0ICovCisgIGdjY19hc3NlcnQgKGFsbG9jIDwgR0NPVl9CTE9DS19TSVpFKTsKKyAgcmV0dXJuIGFsbG9jOworfQorI2VuZGlmCisKKy8qIEFsbG9jYXRlIHNwYWNlIHRvIHdyaXRlIEJZVEVTIGJ5dGVzIHRvIHRoZSBnY292IGZpbGUuIFJldHVybiBhCisgICBwb2ludGVyIHRvIHRob3NlIGJ5dGVzLCBvciBOVUxMIG9uIGZhaWx1cmUuICAqLworCitzdGF0aWMgZ2Nvdl91bnNpZ25lZF90ICoKK2djb3Zfd3JpdGVfd29yZHMgKHVuc2lnbmVkIHdvcmRzKQoreworICBnY292X3Vuc2lnbmVkX3QgKnJlc3VsdDsKKworICBnY2NfYXNzZXJ0IChnY292X3Zhci5tb2RlIDwgMCk7CisjaWYgSU5fTElCR0NPVgorICBpZiAoZ2Nvdl92YXIub2Zmc2V0ICsgd29yZHMgPj0gR0NPVl9CTE9DS19TSVpFKQorICAgIHsKKyAgICAgIGdjb3Zfd3JpdGVfYmxvY2sgKE1JTiAoZ2Nvdl92YXIub2Zmc2V0LCBHQ09WX0JMT0NLX1NJWkUpKTsKKyAgICAgIGlmIChnY292X3Zhci5vZmZzZXQpCisJeworCSAgZ2NjX2Fzc2VydCAoZ2Nvdl92YXIub2Zmc2V0IDwgR0NPVl9CTE9DS19TSVpFKTsKKwkgIG1lbWNweSAoZ2Nvdl92YXIuYnVmZmVyLAorICAgICAgICAgICAgICAgICAgZ2Nvdl92YXIuYnVmZmVyICsgR0NPVl9CTE9DS19TSVpFLAorICAgICAgICAgICAgICAgICAgZ2Nvdl92YXIub2Zmc2V0IDw8IDIpOworCX0KKyAgICB9CisjZWxzZQorICBpZiAoZ2Nvdl92YXIub2Zmc2V0ICsgd29yZHMgPiBnY292X3Zhci5hbGxvYykKKyAgICBnY292X2FsbG9jYXRlIChnY292X3Zhci5vZmZzZXQgKyB3b3Jkcyk7CisjZW5kaWYKKyAgcmVzdWx0ID0gJmdjb3ZfdmFyLmJ1ZmZlcltnY292X3Zhci5vZmZzZXRdOworICBnY292X3Zhci5vZmZzZXQgKz0gd29yZHM7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogV3JpdGUgdW5zaWduZWQgVkFMVUUgdG8gY292ZXJhZ2UgZmlsZS4gIFNldHMgZXJyb3IgZmxhZworICAgYXBwcm9wcmlhdGVseS4gICovCisKK0dDT1ZfTElOS0FHRSB2b2lkCitnY292X3dyaXRlX3Vuc2lnbmVkIChnY292X3Vuc2lnbmVkX3QgdmFsdWUpCit7CisgIGdjb3ZfdW5zaWduZWRfdCAqYnVmZmVyID0gZ2Nvdl93cml0ZV93b3JkcyAoMSk7CisKKyAgYnVmZmVyWzBdID0gdmFsdWU7Cit9CisKKy8qIFdyaXRlIGNvdW50ZXIgVkFMVUUgdG8gY292ZXJhZ2UgZmlsZS4gIFNldHMgZXJyb3IgZmxhZworICAgYXBwcm9wcmlhdGVseS4gICovCisKKyNpZiBJTl9MSUJHQ09WCitHQ09WX0xJTktBR0Ugdm9pZAorZ2Nvdl93cml0ZV9jb3VudGVyIChnY292X3R5cGUgdmFsdWUpCit7CisgIGdjb3ZfdW5zaWduZWRfdCAqYnVmZmVyID0gZ2Nvdl93cml0ZV93b3JkcyAoMik7CisKKyAgYnVmZmVyWzBdID0gKGdjb3ZfdW5zaWduZWRfdCkgdmFsdWU7CisgIGlmIChzaXplb2YgKHZhbHVlKSA+IHNpemVvZiAoZ2Nvdl91bnNpZ25lZF90KSkKKyAgICBidWZmZXJbMV0gPSAoZ2Nvdl91bnNpZ25lZF90KSAodmFsdWUgPj4gMzIpOworICBlbHNlCisgICAgYnVmZmVyWzFdID0gMDsKK30KKyNlbmRpZiAvKiBJTl9MSUJHQ09WICovCisKKy8qIFdyaXRlIFNUUklORyB0byBjb3ZlcmFnZSBmaWxlLiAgU2V0cyBlcnJvciBmbGFnIG9uIGZpbGUKKyAgIGVycm9yLCBvdmVyZmxvdyBmbGFnIG9uIG92ZXJmbG93ICovCisKK0dDT1ZfTElOS0FHRSB2b2lkCitnY292X3dyaXRlX3N0cmluZyAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICB1bnNpZ25lZCBsZW5ndGggPSAwOworICB1bnNpZ25lZCBhbGxvYyA9IDA7CisgIGdjb3ZfdW5zaWduZWRfdCAqYnVmZmVyOworCisgIGlmIChzdHJpbmcpCisgICAgeworICAgICAgbGVuZ3RoID0gc3RybGVuIChzdHJpbmcpOworICAgICAgYWxsb2MgPSAobGVuZ3RoICsgNCkgPj4gMjsKKyAgICB9CisKKyAgYnVmZmVyID0gZ2Nvdl93cml0ZV93b3JkcyAoMSArIGFsbG9jKTsKKworICBidWZmZXJbMF0gPSBhbGxvYzsKKyAgYnVmZmVyW2FsbG9jXSA9IDA7CisgIG1lbWNweSAoJmJ1ZmZlclsxXSwgc3RyaW5nLCBsZW5ndGgpOworfQorCisjaWYgIUlOX0xJQkdDT1YKKy8qIFdyaXRlIGEgdGFnIFRBRyBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHJlY29yZCBsZW5ndGguIFJldHVybiBhCisgICB2YWx1ZSB0byBiZSB1c2VkIGZvciBnY292X3dyaXRlX2xlbmd0aC4gICovCisKK0dDT1ZfTElOS0FHRSBnY292X3Bvc2l0aW9uX3QKK2djb3Zfd3JpdGVfdGFnIChnY292X3Vuc2lnbmVkX3QgdGFnKQoreworICBnY292X3Bvc2l0aW9uX3QgcmVzdWx0ID0gZ2Nvdl92YXIuc3RhcnQgKyBnY292X3Zhci5vZmZzZXQ7CisgIGdjb3ZfdW5zaWduZWRfdCAqYnVmZmVyID0gZ2Nvdl93cml0ZV93b3JkcyAoMik7CisKKyAgYnVmZmVyWzBdID0gdGFnOworICBidWZmZXJbMV0gPSAwOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIFdyaXRlIGEgcmVjb3JkIGxlbmd0aCB1c2luZyBQT1NJVElPTiwgd2hpY2ggd2FzIHJldHVybmVkIGJ5CisgICBnY292X3dyaXRlX3RhZy4gIFRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgdGhlIGVuZCBvZiB0aGUKKyAgIHJlY29yZCwgYW5kIGlzIHJlc3RvcmVkIGJlZm9yZSByZXR1cm5pbmcuICBSZXR1cm5zIG5vbnplcm8gb24KKyAgIG92ZXJmbG93LiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3Zfd3JpdGVfbGVuZ3RoIChnY292X3Bvc2l0aW9uX3QgcG9zaXRpb24pCit7CisgIHVuc2lnbmVkIG9mZnNldDsKKyAgZ2Nvdl91bnNpZ25lZF90IGxlbmd0aDsKKyAgZ2Nvdl91bnNpZ25lZF90ICpidWZmZXI7CisKKyAgZ2NjX2Fzc2VydCAoZ2Nvdl92YXIubW9kZSA8IDApOworICBnY2NfYXNzZXJ0IChwb3NpdGlvbiArIDIgPD0gZ2Nvdl92YXIuc3RhcnQgKyBnY292X3Zhci5vZmZzZXQpOworICBnY2NfYXNzZXJ0IChwb3NpdGlvbiA+PSBnY292X3Zhci5zdGFydCk7CisgIG9mZnNldCA9IHBvc2l0aW9uIC0gZ2Nvdl92YXIuc3RhcnQ7CisgIGxlbmd0aCA9IGdjb3ZfdmFyLm9mZnNldCAtIG9mZnNldCAtIDI7CisgIGJ1ZmZlciA9IChnY292X3Vuc2lnbmVkX3QgKikgJmdjb3ZfdmFyLmJ1ZmZlcltvZmZzZXRdOworICBidWZmZXJbMV0gPSBsZW5ndGg7CisgIGlmIChnY292X3Zhci5vZmZzZXQgPj0gR0NPVl9CTE9DS19TSVpFKQorICAgIGdjb3Zfd3JpdGVfYmxvY2sgKGdjb3ZfdmFyLm9mZnNldCk7Cit9CisKKyNlbHNlIC8qIElOX0xJQkdDT1YgKi8KKworLyogV3JpdGUgYSB0YWcgVEFHIGFuZCBsZW5ndGggTEVOR1RILiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3Zfd3JpdGVfdGFnX2xlbmd0aCAoZ2Nvdl91bnNpZ25lZF90IHRhZywgZ2Nvdl91bnNpZ25lZF90IGxlbmd0aCkKK3sKKyAgZ2Nvdl91bnNpZ25lZF90ICpidWZmZXIgPSBnY292X3dyaXRlX3dvcmRzICgyKTsKKworICBidWZmZXJbMF0gPSB0YWc7CisgIGJ1ZmZlclsxXSA9IGxlbmd0aDsKK30KKworLyogV3JpdGUgYSBzdW1tYXJ5IHN0cnVjdHVyZSB0byB0aGUgZ2NvdiBmaWxlLiAgUmV0dXJuIG5vbnplcm8gb24KKyAgIG92ZXJmbG93LiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3Zfd3JpdGVfc3VtbWFyeSAoZ2Nvdl91bnNpZ25lZF90IHRhZywgY29uc3Qgc3RydWN0IGdjb3Zfc3VtbWFyeSAqc3VtbWFyeSkKK3sKKyAgdW5zaWduZWQgaXg7CisgIGNvbnN0IHN0cnVjdCBnY292X2N0cl9zdW1tYXJ5ICpjc3VtOworCisgIGdjb3Zfd3JpdGVfdGFnX2xlbmd0aCAodGFnLCBHQ09WX1RBR19TVU1NQVJZX0xFTkdUSCk7CisgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKHN1bW1hcnktPmNoZWNrc3VtKTsKKyAgZm9yIChjc3VtID0gc3VtbWFyeS0+Y3RycywgaXggPSBHQ09WX0NPVU5URVJTX1NVTU1BQkxFOyBpeC0tOyBjc3VtKyspCisgICAgeworICAgICAgZ2Nvdl93cml0ZV91bnNpZ25lZCAoY3N1bS0+bnVtKTsKKyAgICAgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKGNzdW0tPnJ1bnMpOworICAgICAgZ2Nvdl93cml0ZV9jb3VudGVyIChjc3VtLT5zdW1fYWxsKTsKKyAgICAgIGdjb3Zfd3JpdGVfY291bnRlciAoY3N1bS0+cnVuX21heCk7CisgICAgICBnY292X3dyaXRlX2NvdW50ZXIgKGNzdW0tPnN1bV9tYXgpOworICAgIH0KK30KKyNlbmRpZiAvKiBJTl9MSUJHQ09WICovCisKKyNlbmRpZiAvKiFJTl9HQ09WICovCisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gcmVhZCBCWVRFUyBieXRlcyBmcm9tIHRoZSBnY292IGZpbGUuIFJldHVybnMKKyAgIE5VTEwgb24gZmFpbHVyZSAocmVhZCBwYXN0IEVPRikuICAqLworCitzdGF0aWMgY29uc3QgZ2Nvdl91bnNpZ25lZF90ICoKK2djb3ZfcmVhZF93b3JkcyAodW5zaWduZWQgd29yZHMpCit7CisgIGNvbnN0IGdjb3ZfdW5zaWduZWRfdCAqcmVzdWx0OworICB1bnNpZ25lZCBleGNlc3MgPSBnY292X3Zhci5sZW5ndGggLSBnY292X3Zhci5vZmZzZXQ7CisKKyAgZ2NjX2Fzc2VydCAoZ2Nvdl92YXIubW9kZSA+IDApOworICBnY2NfYXNzZXJ0ICh3b3JkcyA8IEdDT1ZfQkxPQ0tfU0laRSk7CisgIGlmIChleGNlc3MgPCB3b3JkcykKKyAgICB7CisgICAgICBnY292X3Zhci5zdGFydCArPSBnY292X3Zhci5vZmZzZXQ7CisjaWYgSU5fTElCR0NPVgorICAgICAgaWYgKGV4Y2VzcykKKwl7CisJICBnY2NfYXNzZXJ0IChleGNlc3MgPCBHQ09WX0JMT0NLX1NJWkUpOworCSAgbWVtbW92ZSAoZ2Nvdl92YXIuYnVmZmVyLCBnY292X3Zhci5idWZmZXIgKyBnY292X3Zhci5vZmZzZXQsIGV4Y2VzcyAqIDQpOworCX0KKyNlbHNlCisgICAgICBtZW1tb3ZlIChnY292X3Zhci5idWZmZXIsIGdjb3ZfdmFyLmJ1ZmZlciArIGdjb3ZfdmFyLm9mZnNldCwgZXhjZXNzICogNCk7CisjZW5kaWYKKyAgICAgIGdjb3ZfdmFyLm9mZnNldCA9IDA7CisgICAgICBnY292X3Zhci5sZW5ndGggPSBleGNlc3M7CisjaWYgSU5fTElCR0NPVgorICAgICAgZXhjZXNzID0gKHNpemVvZiAoZ2Nvdl92YXIuYnVmZmVyKSAvIHNpemVvZiAoZ2Nvdl92YXIuYnVmZmVyWzBdKSkgLSBnY292X3Zhci5sZW5ndGg7CisjZWxzZQorICAgICAgaWYgKGdjb3ZfdmFyLmxlbmd0aCArIHdvcmRzID4gZ2Nvdl92YXIuYWxsb2MpCisJZ2Nvdl9hbGxvY2F0ZSAoZ2Nvdl92YXIubGVuZ3RoICsgd29yZHMpOworICAgICAgZXhjZXNzID0gZ2Nvdl92YXIuYWxsb2MgLSBnY292X3Zhci5sZW5ndGg7CisjZW5kaWYKKyAgICAgIGV4Y2VzcyA9IF9HQ09WX2ZyZWFkIChnY292X3Zhci5idWZmZXIgKyBnY292X3Zhci5sZW5ndGgsCisJCSAgICAgIDEsIGV4Y2VzcyA8PCAyLCBnY292X3Zhci5maWxlKSA+PiAyOworICAgICAgZ2Nvdl92YXIubGVuZ3RoICs9IGV4Y2VzczsKKyAgICAgIGlmIChnY292X3Zhci5sZW5ndGggPCB3b3JkcykKKwl7CisJICBnY292X3Zhci5vdmVycmVhZCArPSB3b3JkcyAtIGdjb3ZfdmFyLmxlbmd0aDsKKwkgIGdjb3ZfdmFyLmxlbmd0aCA9IDA7CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorICByZXN1bHQgPSAmZ2Nvdl92YXIuYnVmZmVyW2djb3ZfdmFyLm9mZnNldF07CisgIGdjb3ZfdmFyLm9mZnNldCArPSB3b3JkczsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogUmVhZCB1bnNpZ25lZCB2YWx1ZSBmcm9tIGEgY292ZXJhZ2UgZmlsZS4gU2V0cyBlcnJvciBmbGFnIG9uIGZpbGUKKyAgIGVycm9yLCBvdmVyZmxvdyBmbGFnIG9uIG92ZXJmbG93ICovCisKK0dDT1ZfTElOS0FHRSBnY292X3Vuc2lnbmVkX3QKK2djb3ZfcmVhZF91bnNpZ25lZCAodm9pZCkKK3sKKyAgZ2Nvdl91bnNpZ25lZF90IHZhbHVlOworICBjb25zdCBnY292X3Vuc2lnbmVkX3QgKmJ1ZmZlciA9IGdjb3ZfcmVhZF93b3JkcyAoMSk7CisKKyAgaWYgKCFidWZmZXIpCisgICAgcmV0dXJuIDA7CisgIHZhbHVlID0gZnJvbV9maWxlIChidWZmZXJbMF0pOworICByZXR1cm4gdmFsdWU7Cit9CisKKy8qIFJlYWQgY291bnRlciB2YWx1ZSBmcm9tIGEgY292ZXJhZ2UgZmlsZS4gU2V0cyBlcnJvciBmbGFnIG9uIGZpbGUKKyAgIGVycm9yLCBvdmVyZmxvdyBmbGFnIG9uIG92ZXJmbG93ICovCisKK0dDT1ZfTElOS0FHRSBnY292X3R5cGUKK2djb3ZfcmVhZF9jb3VudGVyICh2b2lkKQoreworICBnY292X3R5cGUgdmFsdWU7CisgIGNvbnN0IGdjb3ZfdW5zaWduZWRfdCAqYnVmZmVyID0gZ2Nvdl9yZWFkX3dvcmRzICgyKTsKKworICBpZiAoIWJ1ZmZlcikKKyAgICByZXR1cm4gMDsKKyAgdmFsdWUgPSBmcm9tX2ZpbGUgKGJ1ZmZlclswXSk7CisgIGlmIChzaXplb2YgKHZhbHVlKSA+IHNpemVvZiAoZ2Nvdl91bnNpZ25lZF90KSkKKyAgICB2YWx1ZSB8PSAoKGdjb3ZfdHlwZSkgZnJvbV9maWxlIChidWZmZXJbMV0pKSA8PCAzMjsKKyAgZWxzZSBpZiAoYnVmZmVyWzFdKQorICAgIGdjb3ZfdmFyLmVycm9yID0gLTE7CisKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKiBSZWFkIHN0cmluZyBmcm9tIGNvdmVyYWdlIGZpbGUuIFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljCisgICBidWZmZXIsIG9yIE5VTEwgb24gZW1wdHkgc3RyaW5nLiBZb3UgbXVzdCBjb3B5IHRoZSBzdHJpbmcgYmVmb3JlCisgICBjYWxsaW5nIGFub3RoZXIgZ2NvdiBmdW5jdGlvbi4gICovCisKK0dDT1ZfTElOS0FHRSBjb25zdCBjaGFyICoKK2djb3ZfcmVhZF9zdHJpbmcgKHZvaWQpCit7CisgIHVuc2lnbmVkIGxlbmd0aCA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKworICBpZiAoIWxlbmd0aCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gKGNvbnN0IGNoYXIgKikgZ2Nvdl9yZWFkX3dvcmRzIChsZW5ndGgpOworfQorCitHQ09WX0xJTktBR0Ugdm9pZAorZ2Nvdl9yZWFkX3N1bW1hcnkgKHN0cnVjdCBnY292X3N1bW1hcnkgKnN1bW1hcnkpCit7CisgIHVuc2lnbmVkIGl4OworICBzdHJ1Y3QgZ2Nvdl9jdHJfc3VtbWFyeSAqY3N1bTsKKworICBzdW1tYXJ5LT5jaGVja3N1bSA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgZm9yIChjc3VtID0gc3VtbWFyeS0+Y3RycywgaXggPSBHQ09WX0NPVU5URVJTX1NVTU1BQkxFOyBpeC0tOyBjc3VtKyspCisgICAgeworICAgICAgY3N1bS0+bnVtID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICAgICAgY3N1bS0+cnVucyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgICAgIGNzdW0tPnN1bV9hbGwgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGNzdW0tPnJ1bl9tYXggPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGNzdW0tPnN1bV9tYXggPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICB9Cit9CisKKyNpZiAhSU5fTElCR0NPViAmJiBJTl9HQ09WICE9IDEKKy8qIFJlYWQgTEVOIHdvcmRzICh1bnNpZ25lZCB0eXBlKSBhbmQgY29uc3RydWN0IE1PRF9JTkZPLiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3ZfcmVhZF9tb2R1bGVfaW5mbyAoc3RydWN0IGdjb3ZfbW9kdWxlX2luZm8gKm1vZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBnY292X3Vuc2lnbmVkX3QgbGVuKQoreworICBnY292X3Vuc2lnbmVkX3Qgc3JjX2ZpbGVuYW1lX2xlbiwgZmlsZW5hbWVfbGVuLCBpLCBqLCBudW1fc3RyaW5nczsKKyAgbW9kX2luZm8tPmlkZW50ID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBtb2RfaW5mby0+aXNfcHJpbWFyeSA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbW9kX2luZm8tPmlzX2V4cG9ydGVkID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBtb2RfaW5mby0+bGFuZyAgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIG1vZF9pbmZvLT5udW1fcXVvdGVfcGF0aHMgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIG1vZF9pbmZvLT5udW1fYnJhY2tldF9wYXRocyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbW9kX2luZm8tPm51bV9jcHBfZGVmaW5lcyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbW9kX2luZm8tPm51bV9jcHBfaW5jbHVkZXMgPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgIG1vZF9pbmZvLT5udW1fY2xfYXJncyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbGVuIC09IDk7CisKKyAgZmlsZW5hbWVfbGVuID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBtb2RfaW5mby0+ZGFfZmlsZW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChmaWxlbmFtZV9sZW4gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGdjb3ZfdW5zaWduZWRfdCkpOworICBmb3IgKGkgPSAwOyBpIDwgZmlsZW5hbWVfbGVuOyBpKyspCisgICAgKChnY292X3Vuc2lnbmVkX3QgKikgbW9kX2luZm8tPmRhX2ZpbGVuYW1lKVtpXSA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgbGVuIC09IChmaWxlbmFtZV9sZW4gKyAxKTsKKworICBzcmNfZmlsZW5hbWVfbGVuID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBtb2RfaW5mby0+c291cmNlX2ZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3JjX2ZpbGVuYW1lX2xlbiAqCisJCQkJCQlzaXplb2YgKGdjb3ZfdW5zaWduZWRfdCkpOworICBmb3IgKGkgPSAwOyBpIDwgc3JjX2ZpbGVuYW1lX2xlbjsgaSsrKQorICAgICgoZ2Nvdl91bnNpZ25lZF90ICopIG1vZF9pbmZvLT5zb3VyY2VfZmlsZW5hbWUpW2ldID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICBsZW4gLT0gKHNyY19maWxlbmFtZV9sZW4gKyAxKTsKKworICBudW1fc3RyaW5ncyA9IG1vZF9pbmZvLT5udW1fcXVvdGVfcGF0aHMgKyBtb2RfaW5mby0+bnVtX2JyYWNrZXRfcGF0aHMgKworICAgIG1vZF9pbmZvLT5udW1fY3BwX2RlZmluZXMgKyBtb2RfaW5mby0+bnVtX2NwcF9pbmNsdWRlcyArCisgICAgbW9kX2luZm8tPm51bV9jbF9hcmdzOworICBmb3IgKGogPSAwOyBqIDwgbnVtX3N0cmluZ3M7IGorKykKKyAgIHsKKyAgICAgZ2Nvdl91bnNpZ25lZF90IHN0cmluZ19sZW4gPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgICAgIG1vZF9pbmZvLT5zdHJpbmdfYXJyYXlbal0gPQorICAgICAgIChjaGFyICopIHhtYWxsb2MgKHN0cmluZ19sZW4gKiBzaXplb2YgKGdjb3ZfdW5zaWduZWRfdCkpOworICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nX2xlbjsgaSsrKQorICAgICAgICgoZ2Nvdl91bnNpZ25lZF90ICopIG1vZF9pbmZvLT5zdHJpbmdfYXJyYXlbal0pW2ldID0KKwkgZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICAgICBsZW4gLT0gKHN0cmluZ19sZW4gKyAxKTsKKyAgIH0KKyAgZ2NjX2Fzc2VydCAoIWxlbik7Cit9CisjZW5kaWYKKworI2lmICFJTl9MSUJHQ09WCisvKiBSZXNldCB0byBhIGtub3duIHBvc2l0aW9uLiAgQkFTRSBzaG91bGQgaGF2ZSBiZWVuIG9idGFpbmVkIGZyb20KKyAgIGdjb3ZfcG9zaXRpb24sIExFTkdUSCBzaG91bGQgYmUgYSByZWNvcmQgbGVuZ3RoLiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3Zfc3luYyAoZ2Nvdl9wb3NpdGlvbl90IGJhc2UsIGdjb3ZfdW5zaWduZWRfdCBsZW5ndGgpCit7CisjaWZkZWYgX19HQ09WX0tFUk5FTF9fCisgIC8qIHNob3VsZCBub3QgcmVhY2ggdGhpcyBwb2ludCAqLworICBnY2NfYXNzZXJ0ICgwKTsKKyNlbHNlIC8qIF9fR0NPVl9LRVJORUxfXyAqLworICBnY2NfYXNzZXJ0IChnY292X3Zhci5tb2RlID4gMCk7CisgIGJhc2UgKz0gbGVuZ3RoOworICBpZiAoYmFzZSAtIGdjb3ZfdmFyLnN0YXJ0IDw9IGdjb3ZfdmFyLmxlbmd0aCkKKyAgICBnY292X3Zhci5vZmZzZXQgPSBiYXNlIC0gZ2Nvdl92YXIuc3RhcnQ7CisgIGVsc2UKKyAgICB7CisgICAgICBnY292X3Zhci5vZmZzZXQgPSBnY292X3Zhci5sZW5ndGggPSAwOworICAgICAgX0dDT1ZfZnNlZWsgKGdjb3ZfdmFyLmZpbGUsIGJhc2UgPDwgMiwgU0VFS19TRVQpOworICAgICAgZ2Nvdl92YXIuc3RhcnQgPSBfR0NPVl9mdGVsbCAoZ2Nvdl92YXIuZmlsZSkgPj4gMjsKKyAgICB9CisjZW5kaWYgLyogX19HQ09WX0tFUk5FTF9fICovCit9CisjZW5kaWYKKworI2lmIElOX0xJQkdDT1YKKy8qIE1vdmUgdG8gYSBnaXZlbiBwb3NpdGlvbiBpbiBhIGdjb3YgZmlsZS4gICovCisKK0dDT1ZfTElOS0FHRSB2b2lkCitnY292X3NlZWsgKGdjb3ZfcG9zaXRpb25fdCBiYXNlKQoreworICBnY2NfYXNzZXJ0IChnY292X3Zhci5tb2RlIDwgMCk7CisgIGlmIChnY292X3Zhci5vZmZzZXQpCisgICAgZ2Nvdl93cml0ZV9ibG9jayAoZ2Nvdl92YXIub2Zmc2V0KTsKKyAgX0dDT1ZfZnNlZWsgKGdjb3ZfdmFyLmZpbGUsIGJhc2UgPDwgMiwgU0VFS19TRVQpOworICBnY292X3Zhci5zdGFydCA9IF9HQ09WX2Z0ZWxsIChnY292X3Zhci5maWxlKSA+PiAyOworfQorCisvKiBUcnVuY2F0ZSB0aGUgZ2NvdiBmaWxlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3ZfdHJ1bmNhdGUgKHZvaWQpCit7CisjaWZkZWYgX19HQ09WX0tFUk5FTF9fCisgIC8qIHNob3VsZCBub3QgcmVhY2ggdGhpcyBwb2ludCAqLworICBnY2NfYXNzZXJ0ICgwKTsKKyNlbHNlIC8qIF9fR0NPVl9LRVJORUxfXyAqLworICBsb25nIG9mZnM7CisgIGludCBmaWxlbnVtOworICBnY2NfYXNzZXJ0IChnY292X3Zhci5tb2RlIDwgMCk7CisgIGlmIChnY292X3Zhci5vZmZzZXQpCisgICAgZ2Nvdl93cml0ZV9ibG9jayAoZ2Nvdl92YXIub2Zmc2V0KTsKKyAgb2ZmcyA9IGZ0ZWxsIChnY292X3Zhci5maWxlKTsKKyAgZmlsZW51bSA9IGZpbGVubyAoZ2Nvdl92YXIuZmlsZSk7CisgIGlmIChvZmZzID09IC0xIHx8IGZpbGVudW0gPT0gLTEgfHwgZnRydW5jYXRlIChmaWxlbnVtLCBvZmZzKSkKKyAgICBnY292X3Zhci5lcnJvciA9IDE7CisjZW5kaWYgLyogX19HQ09WX0tFUk5FTF9fICovCit9CisjZW5kaWYKKworI2lmbmRlZiBfX0dDT1ZfS0VSTkVMX18KKy8qIENvbnZlcnQgYW4gdW5zaWduZWQgTlVNQkVSIHRvIGEgcGVyY2VudGFnZSBhZnRlciBkaXZpZGluZyBieQorICAgMTAwLiAgKi8KKworR0NPVl9MSU5LQUdFIGZsb2F0Citjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAoY29uc3QgdW5zaWduZWQgbnVtYmVyKQoreworICByZXR1cm4gKGZsb2F0KW51bWJlciAvIDEwMC4wZjsKK30KKyNlbmRpZgorCisjaWYgIUlOX0xJQkdDT1YgJiYgSU5fR0NPViAhPSAxCisvKiBQcmludCBsb2FkIGxhdGVuY3kgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgTExfSU5GTyBpbiBhIGh1bWFuIHJlYWRhYmxlCisgICBmb3JtYXQgaW50byBhbiBvcGVuIG91dHB1dCBmaWxlIHBvaW50ZWQgYnkgRlAuIE5FV0xJTkUgc3BlY2lmaWVzCisgICB3aGV0aGVyIG9yIG5vdCB0byBwcmludCBhIHRyYWlsaW5nIG5ld2xpbmUuICAqLworCitHQ09WX0xJTktBR0Ugdm9pZAorcHJpbnRfbG9hZF9sYXRlbmN5X2xpbmUgKEZJTEUgKmZwLCBjb25zdCBnY292X3BtdV9sbF9pbmZvX3QgKmxsX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBwcmludF9uZXdsaW5lIG5ld2xpbmUpCit7CisgIGlmICghbGxfaW5mbykKKyAgICByZXR1cm47CisgIGZwcmludGYgKGZwLCAiICV1ICUuMmYlJSAlLjJmJSUgJS4yZiUlICUuMmYlJSAlLjJmJSUgJS4yZiUlICUuMmYlJSAiCisgICAgICAgICAgICIlLjJmJSUgJS4yZiUlICIgSE9TVF9XSURFU1RfSU5UX1BSSU5UX0hFWCAiICVzICVkICVkIiwKKyAgICAgICAgICAgbGxfaW5mby0+Y291bnRzLAorICAgICAgICAgICBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAobGxfaW5mby0+c2VsZiksCisgICAgICAgICAgIGNvbnZlcnRfdW5zaWduZWRfdG9fcGN0IChsbF9pbmZvLT5jdW0pLAorICAgICAgICAgICBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAobGxfaW5mby0+bHRfMTApLAorICAgICAgICAgICBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAobGxfaW5mby0+bHRfMzIpLAorICAgICAgICAgICBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAobGxfaW5mby0+bHRfNjQpLAorICAgICAgICAgICBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAobGxfaW5mby0+bHRfMjU2KSwKKyAgICAgICAgICAgY29udmVydF91bnNpZ25lZF90b19wY3QgKGxsX2luZm8tPmx0XzEwMjQpLAorICAgICAgICAgICBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAobGxfaW5mby0+Z3RfMTAyNCksCisgICAgICAgICAgIGNvbnZlcnRfdW5zaWduZWRfdG9fcGN0IChsbF9pbmZvLT53c2VsZiksCisgICAgICAgICAgIGxsX2luZm8tPmNvZGVfYWRkciwKKyAgICAgICAgICAgbGxfaW5mby0+ZmlsZW5hbWUsCisgICAgICAgICAgIGxsX2luZm8tPmxpbmUsCisgICAgICAgICAgIGxsX2luZm8tPmRpc2NyaW1pbmF0b3IpOworICBpZiAobmV3bGluZSA9PSBhZGRfbmV3bGluZSkKKyAgICBmcHJpbnRmIChmcCwgIlxuIik7Cit9CisKKy8qIFByaW50IEJSTV9JTkZPIGludG8gdGhlIGZpbGUgcG9pbnRlZCBieSBGUC4gIE5FV0xJTkUgc3BlY2lmaWVzCisgICB3aGV0aGVyIG9yIG5vdCB0byBwcmludCBhIHRyYWlsaW5nIG5ld2xpbmUuICAqLworCitHQ09WX0xJTktBR0Ugdm9pZAorcHJpbnRfYnJhbmNoX21pc3ByZWRpY3RfbGluZSAoRklMRSAqZnAsIGNvbnN0IGdjb3ZfcG11X2JybV9pbmZvX3QgKmJybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBwcmludF9uZXdsaW5lIG5ld2xpbmUpCit7CisgIGlmICghYnJtX2luZm8pCisgICAgcmV0dXJuOworICBmcHJpbnRmIChmcCwgIiAldSAlLjJmJSUgJS4yZiUlICIgSE9TVF9XSURFU1RfSU5UX1BSSU5UX0hFWCAiICVzICVkICVkIiwKKyAgICAgICAgICAgYnJtX2luZm8tPmNvdW50cywKKyAgICAgICAgICAgY29udmVydF91bnNpZ25lZF90b19wY3QgKGJybV9pbmZvLT5zZWxmKSwKKyAgICAgICAgICAgY29udmVydF91bnNpZ25lZF90b19wY3QgKGJybV9pbmZvLT5jdW0pLAorICAgICAgICAgICBicm1faW5mby0+Y29kZV9hZGRyLAorICAgICAgICAgICBicm1faW5mby0+ZmlsZW5hbWUsCisgICAgICAgICAgIGJybV9pbmZvLT5saW5lLAorICAgICAgICAgICBicm1faW5mby0+ZGlzY3JpbWluYXRvcik7CisgIGlmIChuZXdsaW5lID09IGFkZF9uZXdsaW5lKQorICAgIGZwcmludGYgKGZwLCAiXG4iKTsKK30KKworLyogUHJpbnQgVE9PTF9IRUFERVIgaW50byB0aGUgZmlsZSBwb2ludGVkIGJ5IEZQLiAgTkVXTElORSBzcGVjaWZpZXMKKyAgIHdoZXRoZXIgb3Igbm90IHRvIHByaW50IGEgdHJhaWxpbmcgbmV3bGluZS4gICovCisKK0dDT1ZfTElOS0FHRSB2b2lkCitwcmludF9wbXVfdG9vbF9oZWFkZXIgKEZJTEUgKmZwLCBnY292X3BtdV90b29sX2hlYWRlcl90ICp0b29sX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBwcmludF9uZXdsaW5lIG5ld2xpbmUpCit7CisgIGlmICghdG9vbF9oZWFkZXIpCisgICAgcmV0dXJuOworICBmcHJpbnRmIChmcCwgIlxuaG9zdF9jcHU6ICVzXG4iLCB0b29sX2hlYWRlci0+aG9zdF9jcHUpOworICBmcHJpbnRmIChmcCwgImhvc3RuYW1lOiAlc1xuIiwgdG9vbF9oZWFkZXItPmhvc3RuYW1lKTsKKyAgZnByaW50ZiAoZnAsICJrZXJuZWxfdmVyc2lvbjogJXNcbiIsIHRvb2xfaGVhZGVyLT5rZXJuZWxfdmVyc2lvbik7CisgIGZwcmludGYgKGZwLCAiY29sdW1uX2hlYWRlcjogJXNcbiIsIHRvb2xfaGVhZGVyLT5jb2x1bW5faGVhZGVyKTsKKyAgZnByaW50ZiAoZnAsICJjb2x1bW5fZGVzY3JpcHRpb246ICVzXG4iLCB0b29sX2hlYWRlci0+Y29sdW1uX2Rlc2NyaXB0aW9uKTsKKyAgZnByaW50ZiAoZnAsICJmdWxsX2hlYWRlcjogJXNcbiIsIHRvb2xfaGVhZGVyLT5mdWxsX2hlYWRlcik7CisgIGlmIChuZXdsaW5lID09IGFkZF9uZXdsaW5lKQorICAgIGZwcmludGYgKGZwLCAiXG4iKTsKK30KKyNlbmRpZgorCisjaWYgSU5fR0NPViA+IDAKKy8qIFJldHVybiB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgZ2NvdiBmaWxlLiAgKi8KKworR0NPVl9MSU5LQUdFIHRpbWVfdAorZ2Nvdl90aW1lICh2b2lkKQoreworICBzdHJ1Y3Qgc3RhdCBzdGF0dXM7CisKKyAgaWYgKGZzdGF0IChmaWxlbm8gKGdjb3ZfdmFyLmZpbGUpLCAmc3RhdHVzKSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZQorICAgIHJldHVybiBzdGF0dXMuc3RfbXRpbWU7Cit9CisjZW5kaWYgLyogSU5fR0NPViAqLworCisjaWZkZWYgX19HQ09WX0tFUk5FTF9fCisKKy8qIEZpbGUgZmNsb3NlIG9wZXJhdGlvbiBpbiBrZXJuZWwgbW9kZS4gICovCisKK2ludAora2VybmVsX2ZpbGVfZmNsb3NlIChnY292X2tlcm5lbF92ZmlsZSAqZnApCit7CisgIHJldHVybiAwOworfQorCisvKiBGaWxlIGZ0ZWxsIG9wZXJhdGlvbiBpbiBrZXJuZWwgbW9kZS4gSXQgY3VycmVudGx5IHNob3VsZCBub3QKKyAgIGJlIGNhbGxlZC4gICovCisKK2xvbmcKK2tlcm5lbF9maWxlX2Z0ZWxsIChnY292X2tlcm5lbF92ZmlsZSAqZnApCit7CisgIGdjY19hc3NlcnQgKDApOyAgLyogc2hvdWxkIG5vdCByZWFjaCBoZXJlICovCisgIHJldHVybiAwOworfQorCisvKiBGaWxlIGZzZWVrIG9wZXJhdGlvbiBpbiBrZXJuZWwgbW9kZS4gSXQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICB3aXRoIE9GRlNFVD09MCBhbmQgV0hFTkNFPT0wIHRvIGEgZnJlc2hseSBvcGVuZWQgZmlsZS4gICovCisKK2ludAora2VybmVsX2ZpbGVfZnNlZWsgKGdjb3Zfa2VybmVsX3ZmaWxlICpmcCwgbG9uZyBvZmZzZXQsIGludCB3aGVuY2UpCit7CisgIGdjY19hc3NlcnQgKG9mZnNldCA9PSAwICYmIHdoZW5jZSA9PSAwICYmIGZwLT5jb3VudCA9PSAwKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEZpbGUgZnRydW5jYXRlIG9wZXJhdGlvbiBpbiBrZXJuZWwgbW9kZS4gSXQgY3VycmVudGx5IHNob3VsZCBub3QKKyAgIGJlIGNhbGxlZC4gICovCisKK2ludAora2VybmVsX2ZpbGVfZnRydW5jYXRlIChnY292X2tlcm5lbF92ZmlsZSAqZnAsIG9mZl90IHZhbHVlKQoreworICBnY2NfYXNzZXJ0ICgwKTsgIC8qIHNob3VsZCBub3QgcmVhY2ggaGVyZSAqLworICByZXR1cm4gMDsKK30KKworLyogRmlsZSBmcmVhZCBvcGVyYXRpb24gaW4ga2VybmVsIG1vZGUuIEl0IGN1cnJlbnRseSBzaG91bGQgbm90CisgICBiZSBjYWxsZWQuICAqLworCitpbnQKK2tlcm5lbF9maWxlX2ZyZWFkICh2b2lkICpwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbml0ZW1zLAorICAgICAgICAgICAgICAgICAgZ2Nvdl9rZXJuZWxfdmZpbGUgKmZwKQoreworICBnY2NfYXNzZXJ0ICgwKTsgIC8qIHNob3VsZCBub3QgcmVhY2ggaGVyZSAqLworICByZXR1cm4gMDsKK30KKworLyogRmlsZSBmd3JpdGUgb3BlcmF0aW9uIGluIGtlcm5lbCBtb2RlLiBJdCBvdXRwdXRzIHRoZSBkYXRhCisgICB0byBhIGJ1ZmZlciBpbiB0aGUgdmlydWFsIGZpbGUuICAqLworCitpbnQKK2tlcm5lbF9maWxlX2Z3cml0ZSAoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3Qgbml0ZW1zLCBnY292X2tlcm5lbF92ZmlsZSAqZnApCit7CisgIGNoYXIgKnZidWY7CisgIHVuc2lnbmVkIHZzaXplLCB2cG9zOworICB1bnNpZ25lZCBsZW47CisKKyAgaWYgKCFmcCkgcmV0dXJuIDA7CisKKyAgdmJ1ZiA9IGZwLT5idWY7CisgIHZzaXplID0gZnAtPnNpemU7CisgIHZwb3MgPSBmcC0+Y291bnQ7CisKKyAgaWYgKHZzaXplIDw9IHZwb3MpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUgorICAgICAgICAgIkdDT1ZfS0VSTkVMOiBzb21ldGhpbmcgd3Jvbmc6IHZidWY9JXAgdnNpemU9JXUgdnBvcz0ldVxuIiwKKyAgICAgICAgICB2YnVmLCB2c2l6ZSwgdnBvcyk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGxlbiA9IHZzaXplIC0gdnBvczsKKyAgbGVuIC89IHNpemU7CisKKyAgaWYgKGxlbiA+IG5pdGVtcykKKyAgICBsZW4gPSBuaXRlbXM7CisKKyAgbWVtY3B5ICh2YnVmK3Zwb3MsIHB0ciwgc2l6ZSpsZW4pOworICBmcC0+Y291bnQgKz0gbGVuKnNpemU7CisKKyAgaWYgKGxlbiAhPSBuaXRlbXMpCisgICAgcHJpbnRrIChLRVJOX0VSUgorICAgICAgICAiR0NPVl9LRVJORUw6IHNvbWV0aGluZyB3cm9uZzogc2l6ZT0lbHUgbml0ZW1zPSVsdSByZXQ9JWRcbiIsCisgICAgICAgIHNpemUsIG5pdGVtcywgbGVuKTsKKyAgcmV0dXJuIGxlbjsKK30KKworLyogRmlsZSBmaWxlbm8gb3BlcmF0aW9uIGluIGtlcm5lbCBtb2RlLiBJdCBjdXJyZW50bHkgc2hvdWxkIG5vdAorICAgYmUgY2FsbGVkLiAgKi8KKworaW50CitrZXJuZWxfZmlsZV9maWxlbm8gKGdjb3Zfa2VybmVsX3ZmaWxlICpmcCkKK3sKKyAgZ2NjX2Fzc2VydCAoMCk7ICAvKiBzaG91bGQgbm90IHJlYWNoIGhlcmUgKi8KKyAgcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBfX0dDT1ZfS0VSTkVMX18gKi8KKworI2lmIElOX0dDT1YgIT0gMQorLyogRGVsZXRlIHBtdSB0b29sIGhlYWRlciBUT09MX0hFQURFUi4gICovCisKK0dDT1ZfTElOS0FHRSB2b2lkCitkZXN0cm95X3BtdV90b29sX2hlYWRlciAoZ2Nvdl9wbXVfdG9vbF9oZWFkZXJfdCAqdG9vbF9oZWFkZXIpCit7CisgIGlmICghdG9vbF9oZWFkZXIpCisgICAgcmV0dXJuOworICBpZiAodG9vbF9oZWFkZXItPmhvc3RfY3B1KQorICAgIGZyZWUgKHRvb2xfaGVhZGVyLT5ob3N0X2NwdSk7CisgIGlmICh0b29sX2hlYWRlci0+aG9zdG5hbWUpCisgICAgZnJlZSAodG9vbF9oZWFkZXItPmhvc3RuYW1lKTsKKyAgaWYgKHRvb2xfaGVhZGVyLT5rZXJuZWxfdmVyc2lvbikKKyAgICBmcmVlICh0b29sX2hlYWRlci0+a2VybmVsX3ZlcnNpb24pOworICBpZiAodG9vbF9oZWFkZXItPmNvbHVtbl9oZWFkZXIpCisgICAgZnJlZSAodG9vbF9oZWFkZXItPmNvbHVtbl9oZWFkZXIpOworICBpZiAodG9vbF9oZWFkZXItPmNvbHVtbl9kZXNjcmlwdGlvbikKKyAgICBmcmVlICh0b29sX2hlYWRlci0+Y29sdW1uX2Rlc2NyaXB0aW9uKTsKKyAgaWYgKHRvb2xfaGVhZGVyLT5mdWxsX2hlYWRlcikKKyAgICBmcmVlICh0b29sX2hlYWRlci0+ZnVsbF9oZWFkZXIpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBHQ09WX0tFUk5FTCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2djb3YtaW8uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9nY292LXNyYy9nY292LWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwYWUyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9nY292LXNyYy9nY292LWlvLmgKQEAgLTAsMCArMSw5NjggQEAKKy8qIEZpbGUgZm9ybWF0IGZvciBjb3ZlcmFnZSBpbmZvcm1hdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAyLAorICAgMjAwMywgMjAwNCwgMjAwNSwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IEJvYiBNYW5zb24gPG1hbnNvbkBjeWdudXMuY29tPi4KKyAgIENvbXBsZXRlbHkgcmVtYW5nbGVkIGJ5IE5hdGhhbiBTaWR3ZWxsIDxuYXRoYW5AY29kZXNvdXJjZXJ5LmNvbT4uCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKworLyogQ292ZXJhZ2UgaW5mb3JtYXRpb24gaXMgaGVsZCBpbiB0d28gZmlsZXMuICBBIG5vdGVzIGZpbGUsIHdoaWNoIGlzCisgICBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLCBhbmQgYSBkYXRhIGZpbGUsIHdoaWNoIGlzIGdlbmVyYXRlZCBieQorICAgdGhlIHByb2dyYW0gdW5kZXIgdGVzdC4gIEJvdGggZmlsZXMgdXNlIGEgc2ltaWxhciBzdHJ1Y3R1cmUuICBXZSBkbworICAgbm90IGF0dGVtcHQgdG8gbWFrZSB0aGVzZSBmaWxlcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzCisgICB2ZXJzaW9ucywgYXMgeW91IG9ubHkgbmVlZCBjb3ZlcmFnZSBpbmZvcm1hdGlvbiB3aGVuIGRldmVsb3BpbmcgYQorICAgcHJvZ3JhbS4gIFdlIGRvIGhvbGQgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gdGhhdCBtaXNtYXRjaGVzIGNhbiBiZQorICAgZGV0ZWN0ZWQsIGFuZCB3ZSB1c2UgYSBmb3JtYXQgdGhhdCBhbGxvd3MgdG9vbHMgdG8gc2tpcCBpbmZvcm1hdGlvbgorICAgdGhleSBkbyBub3QgdW5kZXJzdGFuZCBvciBhcmUgbm90IGludGVyZXN0ZWQgaW4uCisKKyAgIE51bWJlcnMgYXJlIHJlY29yZGVkIGluIHRoZSAzMiBiaXQgdW5zaWduZWQgYmluYXJ5IGZvcm0gb2YgdGhlCisgICBlbmRpYW5uZXNzIG9mIHRoZSBtYWNoaW5lIGdlbmVyYXRpbmcgdGhlIGZpbGUuIDY0IGJpdCBudW1iZXJzIGFyZQorICAgc3RvcmVkIGFzIHR3byAzMiBiaXQgbnVtYmVycywgdGhlIGxvdyBwYXJ0IGZpcnN0LiAgU3RyaW5ncyBhcmUKKyAgIHBhZGRlZCB3aXRoIDEgdG8gNCBOVUwgYnl0ZXMsIHRvIGJyaW5nIHRoZSBsZW5ndGggdXAgdG8gYSBtdWx0aXBsZQorICAgb2YgNC4gVGhlIG51bWJlciBvZiA0IGJ5dGVzIGlzIHN0b3JlZCwgZm9sbG93ZWQgYnkgdGhlIHBhZGRlZAorICAgc3RyaW5nLiBaZXJvIGxlbmd0aCBhbmQgTlVMTCBzdHJpbmdzIGFyZSBzaW1wbHkgc3RvcmVkIGFzIGEgbGVuZ3RoCisgICBvZiB6ZXJvICh0aGV5IGhhdmUgbm8gdHJhaWxpbmcgTlVMIG9yIHBhZGRpbmcpLgorCisgICAJaW50MzI6ICBieXRlMyBieXRlMiBieXRlMSBieXRlMCB8IGJ5dGUwIGJ5dGUxIGJ5dGUyIGJ5dGUzCisJaW50NjQ6ICBpbnQzMjpsb3cgaW50MzI6aGlnaAorCXN0cmluZzogaW50MzI6MCB8IGludDMyOmxlbmd0aCBjaGFyKiBjaGFyOjAgcGFkZGluZworCXBhZGRpbmc6IHwgY2hhcjowIHwgY2hhcjowIGNoYXI6MCB8IGNoYXI6MCBjaGFyOjAgY2hhcjowCisJaXRlbTogaW50MzIgfCBpbnQ2NCB8IHN0cmluZworCisgICBUaGUgYmFzaWMgZm9ybWF0IG9mIHRoZSBmaWxlcyBpcworCisgICAJZmlsZSA6IGludDMyOm1hZ2ljIGludDMyOnZlcnNpb24gaW50MzI6c3RhbXAgcmVjb3JkKgorCisgICBUaGUgbWFnaWMgaWRlbnQgaXMgZGlmZmVyZW50IGZvciB0aGUgbm90ZXMgYW5kIHRoZSBkYXRhIGZpbGVzLiAgVGhlCisgICBtYWdpYyBpZGVudCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgZmlsZSwgd2hlbgorICAgcmVhZGluZy4gIFRoZSB2ZXJzaW9uIGlzIHRoZSBzYW1lIGZvciBib3RoIGZpbGVzIGFuZCBpcyBkZXJpdmVkCisgICBmcm9tIGdjYydzIHZlcnNpb24gbnVtYmVyLiBUaGUgc3RhbXAgdmFsdWUgaXMgdXNlZCB0byBzeW5jaHJvbml6ZQorICAgbm90ZSBhbmQgZGF0YSBmaWxlcyBhbmQgdG8gc3luY2hyb25pemUgbWVyZ2luZyB3aXRoaW4gYSBkYXRhCisgICBmaWxlLiBJdCBuZWVkIG5vdCBiZSBhbiBhYnNvbHV0ZSB0aW1lIHN0YW1wLCBtZXJlbHkgYSB0aWNrZXIgdGhhdAorICAgaW5jcmVtZW50cyBmYXN0IGVub3VnaCBhbmQgY3ljbGVzIHNsb3cgZW5vdWdoIHRvIGRpc3Rpbmd1aXNoCisgICBkaWZmZXJlbnQgY29tcGlsZS9ydW4vY29tcGlsZSBjeWNsZXMuCisKKyAgIEFsdGhvdWdoIHRoZSBpZGVudCBhbmQgdmVyc2lvbiBhcmUgZm9ybWFsbHkgMzIgYml0IG51bWJlcnMsIHRoZXkKKyAgIGFyZSBkZXJpdmVkIGZyb20gNCBjaGFyYWN0ZXIgQVNDSUkgc3RyaW5ncy4gIFRoZSB2ZXJzaW9uIG51bWJlcgorICAgY29uc2lzdHMgb2YgdGhlIHNpbmdsZSBjaGFyYWN0ZXIgbWFqb3IgdmVyc2lvbiBudW1iZXIsIGEgdHdvCisgICBjaGFyYWN0ZXIgbWlub3IgdmVyc2lvbiBudW1iZXIgKGxlYWRpbmcgemVybyBmb3IgdmVyc2lvbnMgbGVzcyB0aGFuCisgICAxMCksIGFuZCBhIHNpbmdsZSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIHRoZSByZWxlYXNlLgorICAgVGhhdCB3aWxsIGJlICdlJyBleHBlcmltZW50YWwsICdwJyBwcmVyZWxlYXNlIGFuZCAncicgZm9yIHJlbGVhc2UuCisgICBCZWNhdXNlLCBieSBnb29kIGZvcnR1bmUsIHRoZXNlIGFyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIsIHN0cmluZworICAgY29sbGF0aW5nIGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdmVyc2lvbiBzdHJpbmdzLiAgQmUgYXdhcmUgdGhhdAorICAgdGhlICdlJyBkZXNpZ25hdGlvbiB3aWxsIChuYXR1cmFsbHkpIGJlIHVuc3RhYmxlIGFuZCBtaWdodCBiZQorICAgaW5jb21wYXRpYmxlIHdpdGggaXRzZWxmLiAgRm9yIGdjYyAzLjQgZXhwZXJpbWVudGFsLCBpdCB3b3VsZCBiZQorICAgJzMwNGUnICgweDMzMzAzNDY1KS4gIFdoZW4gdGhlIG1ham9yIHZlcnNpb24gcmVhY2hlcyAxMCwgdGhlCisgICBsZXR0ZXJzIEEtWiB3aWxsIGJlIHVzZWQuICBBc3N1bWluZyBtaW5vciBpbmNyZW1lbnRzIHJlbGVhc2VzIGV2ZXJ5CisgICA2IG1vbnRocywgd2UgaGF2ZSB0byBtYWtlIGEgbWFqb3IgaW5jcmVtZW50IGV2ZXJ5IDUwIHllYXJzLgorICAgQXNzdW1pbmcgbWFqb3IgaW5jcmVtZW50cyByZWxlYXNlcyBldmVyeSA1IHllYXJzLCB3ZSdyZSBvayBmb3IgdGhlCisgICBuZXh0IDE1NSB5ZWFycyAtLSBnb29kIGVub3VnaCBmb3IgbWUuCisKKyAgIEEgcmVjb3JkIGhhcyBhIHRhZywgbGVuZ3RoIGFuZCB2YXJpYWJsZSBhbW91bnQgb2YgZGF0YS4KKworICAgCXJlY29yZDogaGVhZGVyIGRhdGEKKwloZWFkZXI6IGludDMyOnRhZyBpbnQzMjpsZW5ndGgKKwlkYXRhOiBpdGVtKgorCisgICBSZWNvcmRzIGFyZSBub3QgbmVzdGVkLCBidXQgdGhlcmUgaXMgYSByZWNvcmQgaGllcmFyY2h5LiAgVGFnCisgICBudW1iZXJzIHJlZmxlY3QgdGhpcyBoaWVyYXJjaHkuICBUYWdzIGFyZSB1bmlxdWUgYWNyb3NzIG5vdGUgYW5kCisgICBkYXRhIGZpbGVzLiAgU29tZSByZWNvcmQgdHlwZXMgaGF2ZSBhIHZhcnlpbmcgYW1vdW50IG9mIGRhdGEuICBUaGUKKyAgIExFTkdUSCBpcyB0aGUgbnVtYmVyIG9mIDRieXRlcyB0aGF0IGZvbGxvdyBhbmQgaXMgdXN1YWxseSB1c2VkIHRvCisgICBkZXRlcm1pbmUgaG93IG11Y2ggZGF0YS4gIFRoZSB0YWcgdmFsdWUgaXMgc3BsaXQgaW50byA0IDgtYml0CisgICBmaWVsZHMsIG9uZSBmb3IgZWFjaCBvZiBmb3VyIHBvc3NpYmxlIGxldmVscy4gIFRoZSBtb3N0IHNpZ25pZmljYW50CisgICBpcyBhbGxvY2F0ZWQgZmlyc3QuICBVbnVzZWQgbGV2ZWxzIGFyZSB6ZXJvLiAgQWN0aXZlIGxldmVscyBhcmUKKyAgIG9kZC12YWx1ZWQsIHNvIHRoYXQgdGhlIExTQiBvZiB0aGUgbGV2ZWwgaXMgb25lLiAgQSBzdWItbGV2ZWwKKyAgIGluY29ycG9yYXRlcyB0aGUgdmFsdWVzIG9mIGl0cyBzdXBlcmxldmVscy4gIFRoaXMgZm9ybWF0dGluZyBhbGxvd3MKKyAgIHlvdSB0byBkZXRlcm1pbmUgdGhlIHRhZyBoaWVyYXJjaHksIHdpdGhvdXQgdW5kZXJzdGFuZGluZyB0aGUgdGFncworICAgdGhlbXNlbHZlcywgYW5kIGlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIHNlY3Rpb24gbnVtYmVyaW5nIHVzZWQKKyAgIGluIHRlY2huaWNhbCBkb2N1bWVudHMuICBMZXZlbCB2YWx1ZXMgWzEuLjNmXSBhcmUgdXNlZCBmb3IgY29tbW9uCisgICB0YWdzLCB2YWx1ZXMgWzQxLi45Zl0gZm9yIHRoZSBub3RlcyBmaWxlIGFuZCBbYTEuLmZmXSBmb3IgdGhlIGRhdGEKKyAgIGZpbGUuCisKKyAgIFRoZSBiYXNpYyBibG9jayBncmFwaCBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcmVjb3JkcworICAgCW5vdGU6IHVuaXQgZnVuY3Rpb24tZ3JhcGgqCisJdW5pdDogaGVhZGVyIGludDMyOmNoZWNrc3VtIHN0cmluZzpzb3VyY2UKKwlmdW5jdGlvbi1ncmFwaDogYW5ub3VuY2VfZnVuY3Rpb24gYmFzaWNfYmxvY2tzIHthcmNzIHwgbGluZXN9KgorCWFubm91bmNlX2Z1bmN0aW9uOiBoZWFkZXIgaW50MzI6aWRlbnQKKwkJaW50MzI6bGluZW5vX2NoZWNrc3VtIGludDMyOmNmZ19jaGVja3N1bQorCQlzdHJpbmc6bmFtZSBzdHJpbmc6c291cmNlIGludDMyOmxpbmVubworCWJhc2ljX2Jsb2NrOiBoZWFkZXIgaW50MzI6ZmxhZ3MqCisJYXJjczogaGVhZGVyIGludDMyOmJsb2NrX25vIGFyYyoKKwlhcmM6ICBpbnQzMjpkZXN0X2Jsb2NrIGludDMyOmZsYWdzCisgICAgICAgIGxpbmVzOiBoZWFkZXIgaW50MzI6YmxvY2tfbm8gbGluZSoKKyAgICAgICAgICAgICAgIGludDMyOjAgc3RyaW5nOk5VTEwKKwlsaW5lOiAgaW50MzI6bGluZV9ubyB8IGludDMyOjAgc3RyaW5nOmZpbGVuYW1lCisKKyAgIFRoZSBCQVNJQ19CTE9DSyByZWNvcmQgaG9sZHMgcGVyLWJiIGZsYWdzLiAgVGhlIG51bWJlciBvZiBibG9ja3MKKyAgIGNhbiBiZSBpbmZlcnJlZCBmcm9tIGl0cyBkYXRhIGxlbmd0aC4gIFRoZXJlIGlzIG9uZSBBUkNTIHJlY29yZCBwZXIKKyAgIGJhc2ljIGJsb2NrLiAgVGhlIG51bWJlciBvZiBhcmNzIGZyb20gYSBiYiBpcyBpbXBsaWNpdCBmcm9tIHRoZQorICAgZGF0YSBsZW5ndGguICBJdCBlbnVtZXJhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYiBhbmQgcGVyLWFyYyBmbGFncy4KKyAgIFRoZXJlIGlzIG9uZSBMSU5FUyByZWNvcmQgcGVyIGJhc2ljIGJsb2NrLCBpdCBlbnVtZXJhdGVzIHRoZSBzb3VyY2UKKyAgIGxpbmVzIHdoaWNoIGJlbG9uZyB0byB0aGF0IGJhc2ljIGJsb2NrLiAgU291cmNlIGZpbGUgbmFtZXMgYXJlCisgICBpbnRyb2R1Y2VkIGJ5IGEgbGluZSBudW1iZXIgb2YgMCwgZm9sbG93aW5nIGxpbmVzIGFyZSBmcm9tIHRoZSBuZXcKKyAgIHNvdXJjZSBmaWxlLiAgVGhlIGluaXRpYWwgc291cmNlIGZpbGUgZm9yIHRoZSBmdW5jdGlvbiBpcyBOVUxMLCBidXQKKyAgIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHNob3VsZCBiZSByZW1lbWJlcmVkIGZyb20gb25lIExJTkVTIHJlY29yZAorICAgdG8gdGhlIG5leHQuICBUaGUgZW5kIG9mIGEgYmxvY2sgaXMgaW5kaWNhdGVkIGJ5IGFuIGVtcHR5IGZpbGVuYW1lCisgICAtIHRoaXMgZG9lcyBub3QgcmVzZXQgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUuICBOb3RlIHRoZXJlIGlzIG5vCisgICBvcmRlcmluZyBvZiB0aGUgQVJDUyBhbmQgTElORVMgcmVjb3JkczogdGhleSBtYXkgYmUgaW4gYW55IG9yZGVyLAorICAgaW50ZXJsZWF2ZWQgaW4gYW55IG1hbm5lci4gIFRoZSBjdXJyZW50IGZpbGVuYW1lIGZvbGxvd3MgdGhlIG9yZGVyCisgICB0aGUgTElORVMgcmVjb3JkcyBhcmUgc3RvcmVkIGluIHRoZSBmaWxlLCAqbm90KiB0aGUgb3JkZXJpbmcgb2YgdGhlCisgICBibG9ja3MgdGhleSBhcmUgZm9yLgorCisgICBUaGUgZGF0YSBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcmVjb3Jkcy4KKyAgICAgICAgZGF0YToge3VuaXQgZnVuY3Rpb24tZGF0YSogc3VtbWFyeTpvYmplY3Qgc3VtbWFyeTpwcm9ncmFtKn0qCisJdW5pdDogaGVhZGVyIGludDMyOmNoZWNrc3VtCisgICAgICAgIGZ1bmN0aW9uLWRhdGE6CWFubm91bmNlX2Z1bmN0aW9uIGFyY19jb3VudHMKKwlhbm5vdW5jZV9mdW5jdGlvbjogaGVhZGVyIGludDMyOmlkZW50CisJCWludDMyOmxpbmVub19jaGVja3N1bSBpbnQzMjpjZmdfY2hlY2tzdW0KKwlhcmNfY291bnRzOiBoZWFkZXIgaW50NjQ6Y291bnQqCisJc3VtbWFyeTogaW50MzI6Y2hlY2tzdW0ge2NvdW50LXN1bW1hcnl9R0NPVl9DT1VOVEVSUworCWNvdW50LXN1bW1hcnk6CWludDMyOm51bSBpbnQzMjpydW5zIGludDY0OnN1bQorCQkJaW50NjQ6bWF4IGludDY0OnN1bV9tYXgKKworICAgVGhlIEFOTk9VTkNFX0ZVTkNUSU9OIHJlY29yZCBpcyB0aGUgc2FtZSBhcyB0aGF0IGluIHRoZSBub3RlIGZpbGUsCisgICBidXQgd2l0aG91dCB0aGUgc291cmNlIGxvY2F0aW9uLiAgVGhlIEFSQ19DT1VOVFMgZ2l2ZXMgdGhlIGNvdW50ZXIKKyAgIHZhbHVlcyBmb3IgdGhvc2UgYXJjcyB0aGF0IGFyZSBpbnN0cnVtZW50ZWQuICBUaGUgU1VNTUFSWSByZWNvcmRzCisgICBnaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3aG9sZSBvYmplY3QgZmlsZSBhbmQgYWJvdXQgdGhlIHdob2xlCisgICBwcm9ncmFtLiAgVGhlIGNoZWNrc3VtIGlzIHVzZWQgZm9yIHdob2xlIHByb2dyYW0gc3VtbWFyaWVzLCBhbmQKKyAgIGRpc2FtYmlndWF0ZXMgZGlmZmVyZW50IHByb2dyYW1zIHdoaWNoIGluY2x1ZGUgdGhlIHNhbWUKKyAgIGluc3RydW1lbnRlZCBvYmplY3QgZmlsZS4gIFRoZXJlIG1heSBiZSBzZXZlcmFsIHByb2dyYW0gc3VtbWFyaWVzLAorICAgZWFjaCB3aXRoIGEgdW5pcXVlIGNoZWNrc3VtLiAgVGhlIG9iamVjdCBzdW1tYXJ5J3MgY2hlY2tzdW0gaXMgemVyby4KKyAgIE5vdGUgdGhhdCB0aGUgZGF0YSBmaWxlIG1pZ2h0IGNvbnRhaW4gaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIHJ1bnMKKyAgIGNvbmNhdGVuYXRlZCwgb3IgdGhlIGRhdGEgbWlnaHQgYmUgbWVyZ2VkLgorCisgICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYm90aCB0aGUgY29tcGlsZXIsIGdjb3YgdG9vbHMgYW5kIHRoZQorICAgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkgbGliZ2Nvdi4gSU5fTElCR0NPViBhbmQgSU5fR0NPViBhcmUgdXNlZCB0bworICAgZGlzdGluZ3Vpc2ggd2hpY2ggY2FzZSBpcyB3aGljaC4gIElmIElOX0xJQkdDT1YgaXMgbm9uemVybywKKyAgIGxpYmdjb3YgaXMgYmVpbmcgYnVpbHQuIElmIElOX0dDT1YgaXMgbm9uemVybywgdGhlIGdjb3YgdG9vbHMgYXJlCisgICBiZWluZyBidWlsdC4gT3RoZXJ3aXNlIHRoZSBjb21waWxlciBpcyBiZWluZyBidWlsdC4gSU5fR0NPViBtYXkgYmUKKyAgIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLiBJZiBwb3NpdGl2ZSwgd2UgYXJlIGNvbXBpbGluZyBhIHRvb2wgdGhhdAorICAgcmVxdWlyZXMgYWRkaXRpb25hbCBmdW5jdGlvbnMgKHNlZSB0aGUgY29kZSBmb3Iga25vd2xlZGdlIG9mIHdoYXQKKyAgIHRob3NlIGZ1bmN0aW9ucyBhcmUpLiAgKi8KKworI2lmbmRlZiBHQ0NfR0NPVl9JT19ICisjZGVmaW5lIEdDQ19HQ09WX0lPX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19HQ09WX0tFUk5FTF9fCisjZGVmaW5lIF9fR0NPVl9LRVJORUxfXworI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2lmZGVmIF9fR0NPVl9LRVJORUxfXworI2RlZmluZSBHQ09WX0xJTktBR0UgLyogbm90aGluZyAqLworCisvKiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBmb3IKKyAgICBCSVRTX1BFUl9VTklUIGFuZAorICAgIExPTkdfTE9OR19UWVBFX1NJWkUKKyAgVGhleSBhcmUgZGVmaW5lZCBpbiBnY2MvZGVmYXVsdHMuaCBhbmQgZ2NjL2NvbmZpZy88YXJjaF9kZXBlbmRfZmlsZXM+CisgIChsaWtlLCBnY2MvY29uZmlnL2kzODYvaTM4Ni5oKS4gQW5kIGl0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgCisgIGluIGJ1aWxkIHNjcmlwdHMuIEhlcmUgSSBoYXJkY29kZWQgdGhlIHZhbHVlIGZvciB4ODYuICAKKyAgVG9kbzogdXNpbmcgYSBwcm9ncmFtIHRvIGF1dG8tZ2VuZXJhdGUgdGhlIHZhdWxlcyBpbiBidWlsZCB0aW1lLiAgKi8KKyNkZWZpbmUgQklUU19QRVJfVU5JVCA4CisjZGVmaW5lIExPTkdfTE9OR19UWVBFX1NJWkUgNjQKKworLyogVGhlcmUgYXJlIG1hbnkgZ2NjX2Fzc2VydGlvbnMuIFNldCB0aGUgdmF1bGUgdG8gMSBpZiB3ZSB3YW50IGEgd2FybmluZworICAgbWVzc2FnZSBpZiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiAgKi8KKyNpZm5kZWYgRU5BQkxFX0FTU0VSVF9DSEVDS0lORworI2RlZmluZSBFTkFCTEVfQVNTRVJUX0NIRUNLSU5HIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNlbmRpZiAvKiBfX0dDT1ZfS0VSTkVMX18gKi8KKworLyogV3JhcHBlcnMgdG8gdGhlIGZpbGUgb3BlcmF0aW9ucy4gICovCisjaWZuZGVmIF9fR0NPVl9LRVJORUxfXworIyBkZWZpbmUgX0dDT1ZfRklMRSAgICAgIEZJTEUKKyMgZGVmaW5lIF9HQ09WX2ZjbG9zZSAgICBmY2xvc2UKKyMgZGVmaW5lIF9HQ09WX2Z0ZWxsICAgICBmdGVsbAorIyBkZWZpbmUgX0dDT1ZfZnNlZWsgICAgIGZzZWVrCisjIGRlZmluZSBfR0NPVl9mdHJ1bmNhdGUgZnRydW5jYXRlCisjIGRlZmluZSBfR0NPVl9mcmVhZCAgICAgZnJlYWQKKyMgZGVmaW5lIF9HQ09WX2Z3cml0ZSAgICBmd3JpdGUKKyMgZGVmaW5lIF9HQ09WX2ZyZWFkICAgICBmcmVhZAorIyBkZWZpbmUgX0dDT1ZfZmlsZW5vICAgIGZpbGVubworI2Vsc2UgLyogX19HQ09WX0tFUk5FTF9fICovCisvKiBJbiBMaW51eCBrZXJuZWwgbW9kZSwgYSB2aXJ0dWFsIGZpbGUgaXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBnY292X2luZm87Cit0eXBlZGVmIHN0cnVjdCB7CisgIGxvbmcgc2l6ZTsgLyogc2l6ZSBvZiBidWYgKi8KKyAgbG9uZyBjb3VudDsgLyogZWxlbWVudCB3cml0dGVuIGludG8gYnVmICovCisgIHN0cnVjdCBnY292X2luZm8gKmluZm87CisgIGNoYXIgYnVmWzBdOworfSBnY292X2tlcm5lbF92ZmlsZTsKKworIyBkZWZpbmUgX0dDT1ZfRklMRSBnY292X2tlcm5lbF92ZmlsZQorCisvKiBnY2NfYXNzZXJ0KCkgcHJpbnRzIG91dCBhIHdhcm5pbmcgaWYgdGhlIGNoZWNrIGZhaWxzLiBJdAorICAgd2lsbCBub3QgYWJvcnQuICAqLworI2lmIEVOQUJMRV9BU1NFUlRfQ0hFQ0tJTkcKKyMgZGVmaW5lIGdjY19hc3NlcnQoRVhQUikgXAorICAgICgodm9pZCkoIShFWFBSKSA/IHByaW50ayAoS0VSTl9XQVJOSU5HIFwKKyAgICAgICJHQ09WIGFzc2VydGlvbiBmYWlsczogZnVuYz0lcyBsaW5lPSVkXG4iLCBcCisgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fKSwgMCA6IDApKQorI2Vsc2UKKyMgZGVmaW5lIGdjY19hc3NlcnQoRVhQUikgKCh2b2lkKSgwICYmIChFWFBSKSkpCisjZW5kaWYKKworLyogV3JhcHBlcnMgdG8gdGhlIGZpbGUgb3BlcmF0aW9ucy4gICovCisjIGRlZmluZSBfR0NPVl9mY2xvc2UgICAgIGtlcm5lbF9maWxlX2ZjbG9zZQorIyBkZWZpbmUgX0dDT1ZfZnRlbGwgICAgICBrZXJuZWxfZmlsZV9mdGVsbAorIyBkZWZpbmUgX0dDT1ZfZnNlZWsgICAgICBrZXJuZWxfZmlsZV9mc2VlaworIyBkZWZpbmUgX0dDT1ZfZnRydW5jYXRlICBrZXJuZWxfZmlsZV9mdHJ1bmNhdGUKKyMgZGVmaW5lIF9HQ09WX2ZyZWFkICAgICAga2VybmVsX2ZpbGVfZnJlYWQKKyMgZGVmaW5lIF9HQ09WX2Z3cml0ZSAgICAga2VybmVsX2ZpbGVfZndyaXRlCisjIGRlZmluZSBfR0NPVl9maWxlbm8gICAgIGtlcm5lbF9maWxlX2ZpbGVubworCisvKiBEZWNsYXJhdGlvbnMgZm9yIHZpcnR1YWwgZmlsZXMgb3BlcmF0aW9ucy4gICovCitleHRlcm4gaW50IGtlcm5lbF9maWxlX2ZjbG9zZSAoZ2Nvdl9rZXJuZWxfdmZpbGUgKik7CitleHRlcm4gbG9uZyBrZXJuZWxfZmlsZV9mdGVsbCAoZ2Nvdl9rZXJuZWxfdmZpbGUgKik7CitleHRlcm4gaW50IGtlcm5lbF9maWxlX2ZzZWVrIChnY292X2tlcm5lbF92ZmlsZSAqLCBsb25nLCBpbnQpOworZXh0ZXJuIGludCBrZXJuZWxfZmlsZV9mdHJ1bmNhdGUgKGdjb3Zfa2VybmVsX3ZmaWxlICosIG9mZl90KTsKK2V4dGVybiBpbnQga2VybmVsX2ZpbGVfZnJlYWQgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsCisgICAgZ2Nvdl9rZXJuZWxfdmZpbGUgKik7CitleHRlcm4gaW50IGtlcm5lbF9maWxlX2Z3cml0ZSAoY29uc3Qgdm9pZCAqLCBzaXplX3QsIHNpemVfdCwKKyAgICBnY292X2tlcm5lbF92ZmlsZSAqKTsKK2V4dGVybiBpbnQga2VybmVsX2ZpbGVfZmlsZW5vKGdjb3Zfa2VybmVsX3ZmaWxlICopOworI2VuZGlmIC8qIEdDT1ZfS0VSTkVMICovCisjaWYgSU5fTElCR0NPVgorCisjdW5kZWYgRlVOQ19JRF9XSURUSAorI3VuZGVmIEZVTkNfSURfTUFTSworLyogQWJvdXQgdGhlIHRhcmdldCAqLworCisjaWYgQklUU19QRVJfVU5JVCA9PSA4Cit0eXBlZGVmIHVuc2lnbmVkIGdjb3ZfdW5zaWduZWRfdCBfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0kpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGdjb3ZfcG9zaXRpb25fdCBfX2F0dHJpYnV0ZV9fICgobW9kZSAoU0kpKSk7CisjaWYgTE9OR19MT05HX1RZUEVfU0laRSA+IDMyCit0eXBlZGVmIHNpZ25lZCBnY292X3R5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKERJKSkpOworI2RlZmluZSBGVU5DX0lEX1dJRFRIIDMyCisjZGVmaW5lIEZVTkNfSURfTUFTSyAoKDFsbCA8PCBGVU5DX0lEX1dJRFRIKSAtIDEpCisjZWxzZQordHlwZWRlZiBzaWduZWQgZ2Nvdl90eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKKyNkZWZpbmUgRlVOQ19JRF9XSURUSCAxNgorI2RlZmluZSBGVU5DX0lEX01BU0sgKCgxIDw8IEZVTkNfSURfV0lEVEgpIC0gMSkKKyNlbmRpZgorI2Vsc2UgICAvKiBCSVRTX1BFUl9VTklUICE9IDggICovCisjaWYgQklUU19QRVJfVU5JVCA9PSAxNgordHlwZWRlZiB1bnNpZ25lZCBnY292X3Vuc2lnbmVkX3QgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKEhJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBnY292X3Bvc2l0aW9uX3QgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKEhJKSkpOworI2lmIExPTkdfTE9OR19UWVBFX1NJWkUgPiAzMgordHlwZWRlZiBzaWduZWQgZ2Nvdl90eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChTSSkpKTsKKyNkZWZpbmUgRlVOQ19JRF9XSURUSCAzMgorI2RlZmluZSBGVU5DX0lEX01BU0sgKCgxbGwgPDwgRlVOQ19JRF9XSURUSCkgLSAxKQorI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGdjb3ZfdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoSEkpKSk7CisjZGVmaW5lIEZVTkNfSURfV0lEVEggMTYKKyNkZWZpbmUgRlVOQ19JRF9NQVNLICgoMSA8PCBGVU5DX0lEX1dJRFRIKSAtIDEpCisjZW5kaWYKKyNlbHNlICAvKiBCSVRTX1BFUl9VTklUICE9IDE2ICAqLwordHlwZWRlZiB1bnNpZ25lZCBnY292X3Vuc2lnbmVkX3QgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFFJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBnY292X3Bvc2l0aW9uX3QgX19hdHRyaWJ1dGVfXyAoKG1vZGUgKFFJKSkpOworI2lmIExPTkdfTE9OR19UWVBFX1NJWkUgPiAzMgordHlwZWRlZiBzaWduZWQgZ2Nvdl90eXBlIF9fYXR0cmlidXRlX18gKChtb2RlIChISSkpKTsKKyNkZWZpbmUgRlVOQ19JRF9XSURUSCAzMgorI2RlZmluZSBGVU5DX0lEX01BU0sgKCgxbGwgPDwgRlVOQ19JRF9XSURUSCkgLSAxKQorI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGdjb3ZfdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZSAoUUkpKSk7CisjZGVmaW5lIEZVTkNfSURfV0lEVEggMTYKKyNkZWZpbmUgRlVOQ19JRF9NQVNLICgoMSA8PCBGVU5DX0lEX1dJRFRIKSAtIDEpCisjZW5kaWYKKyNlbmRpZiAvKiBCSVRTX1BFUl9VTklUID09IDE2ICAqLyAKKworI2VuZGlmICAvKiBCSVRTX1BFUl9VTklUID09IDggICovCisKKyN1bmRlZiBFWFRSQUNUX01PRFVMRV9JRF9GUk9NX0dMT0JBTF9JRAorI3VuZGVmIEVYVFJBQ1RfRlVOQ19JRF9GUk9NX0dMT0JBTF9JRAorI3VuZGVmIEdFTl9GVU5DX0dMT0JBTF9JRAorI2RlZmluZSBFWFRSQUNUX01PRFVMRV9JRF9GUk9NX0dMT0JBTF9JRChnaWQpIFwKKyAgICAgICAgICAgICAgICAoZ2Nvdl91bnNpZ25lZF90KSgoKGdpZCkgPj4gRlVOQ19JRF9XSURUSCkgJiBGVU5DX0lEX01BU0spCisjZGVmaW5lIEVYVFJBQ1RfRlVOQ19JRF9GUk9NX0dMT0JBTF9JRChnaWQpIFwKKyAgICAgICAgICAgICAgICAoZ2Nvdl91bnNpZ25lZF90KSgoZ2lkKSAmIEZVTkNfSURfTUFTSykKKyNkZWZpbmUgR0VOX0ZVTkNfR0xPQkFMX0lEKG0sZikgKCgoKGdjb3ZfdHlwZSkgKG0pKSA8PCBGVU5DX0lEX1dJRFRIKSB8IChmKSkKKworCisjaWYgZGVmaW5lZCAoVEFSR0VUX1BPU0lYX0lPKQorI2RlZmluZSBHQ09WX0xPQ0tFRCAxCisjZWxzZQorI2RlZmluZSBHQ09WX0xPQ0tFRCAwCisjZW5kaWYKKworI2Vsc2UgLyogIUlOX0xJQkdDT1YgKi8KKy8qIEFib3V0IHRoZSBob3N0ICovCisKK3R5cGVkZWYgdW5zaWduZWQgZ2Nvdl91bnNpZ25lZF90OwordHlwZWRlZiB1bnNpZ25lZCBnY292X3Bvc2l0aW9uX3Q7CisKKy8qIGdjb3ZfdHlwZSBpcyB0eXBlZGVmJ2QgZWxzZXdoZXJlIGZvciB0aGUgY29tcGlsZXIgKi8KKyNpZiBJTl9HQ09WCisjZGVmaW5lIEdDT1ZfTElOS0FHRSBzdGF0aWMKK3R5cGVkZWYgSE9TVF9XSURFU1RfSU5UIGdjb3ZfdHlwZTsKKyNpZiBJTl9HQ09WID4gMAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNkZWZpbmUgRlVOQ19JRF9XSURUSCBIT1NUX0JJVFNfUEVSX1dJREVfSU5ULzIKKyNkZWZpbmUgRlVOQ19JRF9NQVNLICgoMUwgPDwgRlVOQ19JRF9XSURUSCkgLSAxKQorI2RlZmluZSBFWFRSQUNUX01PRFVMRV9JRF9GUk9NX0dMT0JBTF9JRChnaWQpICh1bnNpZ25lZCkoKChnaWQpID4+IEZVTkNfSURfV0lEVEgpICYgRlVOQ19JRF9NQVNLKQorI2RlZmluZSBFWFRSQUNUX0ZVTkNfSURfRlJPTV9HTE9CQUxfSUQoZ2lkKSAodW5zaWduZWQpKChnaWQpICYgRlVOQ19JRF9NQVNLKQorI2RlZmluZSBGVU5DX0dMT0JBTF9JRChtLGYpICgoKChIT1NUX1dJREVfSU5UKSAobSkpIDw8IEZVTkNfSURfV0lEVEgpIHwgKGYpCisKKyNlbHNlIC8qIUlOX0dDT1YgKi8KKyNkZWZpbmUgR0NPVl9UWVBFX1NJWkUgKExPTkdfTE9OR19UWVBFX1NJWkUgPiAzMiA/IDY0IDogMzIpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKEhPU1RfSEFTX0ZfU0VUTEtXKQorI2RlZmluZSBHQ09WX0xPQ0tFRCAxCisjZWxzZQorI2RlZmluZSBHQ09WX0xPQ0tFRCAwCisjZW5kaWYKKworI2VuZGlmIC8qICFJTl9MSUJHQ09WICovCisKKy8qIEluIGdjb3Ygd2Ugd2FudCBmdW5jdGlvbiBsaW5rYWdlIHRvIGJlIHN0YXRpYy4gIEluIHRoZSBjb21waWxlciB3ZSB3YW50CisgICBpdCBleHRlcm4sIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgZnJvbSBlbHNld2hlcmUuICBJbiBsaWJnY292IHdlCisgICBuZWVkIHRoZXNlIGZ1bmN0aW9ucyB0byBiZSBleHRlcm4sIHNvIHByZWZpeCB0aGVtIHdpdGggX19nY292LiAgSW4KKyAgIGxpYmdjb3YgdGhleSBtdXN0IGFsc28gYmUgaGlkZGVuIHNvIHRoYXQgdGhlIGluc3RhbmNlIGluIHRoZSBleGVjdXRhYmxlCisgICBpcyBub3QgYWxzbyB1c2VkIGluIGEgRFNPLiAgKi8KKyNpZiBJTl9MSUJHQ09WCisKKyNpZm5kZWYgX19HQ09WX0tFUk5FTF9fCisjaW5jbHVkZSAidGNvbmZpZy5oIgorI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisjZGVmaW5lIGdjb3ZfdmFyIF9fZ2Nvdl92YXIKKyNkZWZpbmUgZ2Nvdl9vcGVuIF9fZ2Nvdl9vcGVuCisjZGVmaW5lIGdjb3ZfY2xvc2UgX19nY292X2Nsb3NlCisjZGVmaW5lIGdjb3Zfd3JpdGVfdGFnX2xlbmd0aCBfX2djb3Zfd3JpdGVfdGFnX2xlbmd0aAorI2RlZmluZSBnY292X3Bvc2l0aW9uIF9fZ2Nvdl9wb3NpdGlvbgorI2RlZmluZSBnY292X3NlZWsgX19nY292X3NlZWsKKyNkZWZpbmUgZ2Nvdl9yZXdyaXRlIF9fZ2Nvdl9yZXdyaXRlCisjZGVmaW5lIGdjb3ZfdHJ1bmNhdGUgX19nY292X3RydW5jYXRlCisjZGVmaW5lIGdjb3ZfaXNfZXJyb3IgX19nY292X2lzX2Vycm9yCisjZGVmaW5lIGdjb3Zfd3JpdGVfdW5zaWduZWQgX19nY292X3dyaXRlX3Vuc2lnbmVkCisjZGVmaW5lIGdjb3Zfd3JpdGVfY291bnRlciBfX2djb3Zfd3JpdGVfY291bnRlcgorI2RlZmluZSBnY292X3dyaXRlX3N1bW1hcnkgX19nY292X3dyaXRlX3N1bW1hcnkKKyNkZWZpbmUgZ2Nvdl93cml0ZV9tb2R1bGVfaW5mbyBfX2djb3Zfd3JpdGVfbW9kdWxlX2luZm8KKyNkZWZpbmUgZ2Nvdl93cml0ZV9zdHJpbmcgX19nY292X3dyaXRlX3N0cmluZworI2RlZmluZSBnY292X3N0cmluZ19sZW5ndGggX19nY292X3N0cmluZ19sZW5ndGgKKyNkZWZpbmUgZ2Nvdl9yZWFkX3Vuc2lnbmVkIF9fZ2Nvdl9yZWFkX3Vuc2lnbmVkCisjZGVmaW5lIGdjb3ZfcmVhZF9jb3VudGVyIF9fZ2Nvdl9yZWFkX2NvdW50ZXIKKyNkZWZpbmUgZ2Nvdl9yZWFkX3N0cmluZyBfX2djb3ZfcmVhZF9zdHJpbmcKKyNkZWZpbmUgZ2Nvdl9yZWFkX3N1bW1hcnkgX19nY292X3JlYWRfc3VtbWFyeQorI2RlZmluZSBnY292X3JlYWRfbW9kdWxlX2luZm8gX19nY292X3JlYWRfbW9kdWxlX2luZm8KKyNkZWZpbmUgZ2Nvdl9zb3J0X25fdmFscyBfX2djb3Zfc29ydF9uX3ZhbHMKKyNkZWZpbmUgZ2Nvdl9jYW5vbmljYWxfZmlsZW5hbWUgX2djb3ZfY2Fub25pY2FsX2ZpbGVuYW1lCisjZGVmaW5lIGdjb3ZfcmVhZF9wbXVfbG9hZF9sYXRlbmN5X2luZm8gX19nY292X3JlYWRfcG11X2xvYWRfbGF0ZW5jeV9pbmZvCisjZGVmaW5lIGdjb3ZfcmVhZF9wbXVfYnJhbmNoX21pc3ByZWRpY3RfaW5mbyBfX2djb3ZfcmVhZF9wbXVfYnJhbmNoX21pc3ByZWRpY3RfaW5mbworI2RlZmluZSBnY292X3JlYWRfcG11X3Rvb2xfaGVhZGVyIF9fZ2Nvdl9yZWFkX3BtdV90b29sX2hlYWRlcgorI2RlZmluZSBkZXN0cm95X3BtdV90b29sX2hlYWRlciBfX2Rlc3Ryb3lfcG11X3Rvb2xfaGVhZGVyCisKKworLyogUG9pc29uIHRoZXNlLCBzbyB0aGV5IGRvbid0IGFjY2lkZW50YWxseSBzbGlwIGluLiAgKi8KKyNwcmFnbWEgR0NDIHBvaXNvbiBnY292X3dyaXRlX3RhZyBnY292X3dyaXRlX2xlbmd0aAorI3ByYWdtYSBHQ0MgcG9pc29uIGdjb3Zfc3luYyBnY292X3RpbWUgZ2Nvdl9tYWdpYworCisjaWZkZWYgSEFWRV9HQVNfSElEREVOCisjZGVmaW5lIEFUVFJJQlVURV9ISURERU4gIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoImhpZGRlbiIpKSkKKyNlbHNlCisjZGVmaW5lIEFUVFJJQlVURV9ISURERU4KKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIEFUVFJJQlVURV9ISURERU4KKworI2VuZGlmCisKKyNpZm5kZWYgR0NPVl9MSU5LQUdFCisjZGVmaW5lIEdDT1ZfTElOS0FHRSBleHRlcm4KKyNlbmRpZgorCisvKiBGaWxlIHN1ZmZpeGVzLiAgKi8KKyNkZWZpbmUgR0NPVl9EQVRBX1NVRkZJWCAiLmdjZGEiCisjZGVmaW5lIEdDT1ZfTk9URV9TVUZGSVggIi5nY25vIgorCisvKiBGaWxlIG1hZ2ljLiBNdXN0IG5vdCBiZSBwYWxpbmRyb21lcy4gICovCisjZGVmaW5lIEdDT1ZfREFUQV9NQUdJQyAoKGdjb3ZfdW5zaWduZWRfdCkweDY3NjM2NDYxKSAvKiAiZ2NkYSIgKi8KKyNkZWZpbmUgR0NPVl9OT1RFX01BR0lDICgoZ2Nvdl91bnNpZ25lZF90KTB4Njc2MzZlNmYpIC8qICJnY25vIiAqLworCisvKiBnY292LWlvdi5oIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBtYWtlZmlsZSBmcm9tCisgICB2ZXJzaW9uLmMsIGl0IGxvb2tzIGxpa2UKKyAgIAkjZGVmaW5lIEdDT1ZfVkVSU0lPTiAoKGdjb3ZfdW5zaWduZWRfdCkweDg5YWJjZGVmKQorKi8KKyNpbmNsdWRlICJnY292LWlvdi5oIgorCisvKiBDb252ZXJ0IGEgbWFnaWMgb3IgdmVyc2lvbiBudW1iZXIgdG8gYSA0IGNoYXJhY3RlciBzdHJpbmcuICAqLworI2RlZmluZSBHQ09WX1VOU0lHTkVEMlNUUklORyhBUlJBWSxWQUxVRSkJXAorICAoKEFSUkFZKVswXSA9IChjaGFyKSgoVkFMVUUpID4+IDI0KSwJCVwKKyAgIChBUlJBWSlbMV0gPSAoY2hhcikoKFZBTFVFKSA+PiAxNiksCQlcCisgICAoQVJSQVkpWzJdID0gKGNoYXIpKChWQUxVRSkgPj4gOCksCQlcCisgICAoQVJSQVkpWzNdID0gKGNoYXIpKChWQUxVRSkgPj4gMCkpCisKKy8qIFRoZSByZWNvcmQgdGFncy4gIFZhbHVlcyBbMS4uM2ZdIGFyZSBmb3IgdGFncyB3aGljaCBtYXkgYmUgaW4gZWl0aGVyCisgICBmaWxlLiAgVmFsdWVzIFs0MS4uOWZdIGZvciB0aG9zZSBpbiB0aGUgbm90ZSBmaWxlIGFuZCBbYTEuLmZmXSBmb3IKKyAgIHRoZSBkYXRhIGZpbGUuICBUaGUgdGFnIHZhbHVlIHplcm8gaXMgdXNlZCBhcyBhbiBleHBsaWNpdCBlbmQgb2YKKyAgIGZpbGUgbWFya2VyIC0tIGl0IGlzIG5vdCByZXF1aXJlZCB0byBiZSBwcmVzZW50LiAgKi8KKworI2RlZmluZSBHQ09WX1RBR19GVU5DVElPTgkgKChnY292X3Vuc2lnbmVkX3QpMHgwMTAwMDAwMCkKKyNkZWZpbmUgR0NPVl9UQUdfRlVOQ1RJT05fTEVOR1RIICgzKQorI2RlZmluZSBHQ09WX1RBR19CTE9DS1MJCSAoKGdjb3ZfdW5zaWduZWRfdCkweDAxNDEwMDAwKQorI2RlZmluZSBHQ09WX1RBR19CTE9DS1NfTEVOR1RIKE5VTSkgKE5VTSkKKyNkZWZpbmUgR0NPVl9UQUdfQkxPQ0tTX05VTShMRU5HVEgpIChMRU5HVEgpCisjZGVmaW5lIEdDT1ZfVEFHX0FSQ1MJCSAoKGdjb3ZfdW5zaWduZWRfdCkweDAxNDMwMDAwKQorI2RlZmluZSBHQ09WX1RBR19BUkNTX0xFTkdUSChOVU0pICAoMSArIChOVU0pICogMikKKyNkZWZpbmUgR0NPVl9UQUdfQVJDU19OVU0oTEVOR1RIKSAgKCgoTEVOR1RIKSAtIDEpIC8gMikKKyNkZWZpbmUgR0NPVl9UQUdfTElORVMJCSAoKGdjb3ZfdW5zaWduZWRfdCkweDAxNDUwMDAwKQorI2RlZmluZSBHQ09WX1RBR19DT1VOVEVSX0JBU0UgCSAoKGdjb3ZfdW5zaWduZWRfdCkweDAxYTEwMDAwKQorI2RlZmluZSBHQ09WX1RBR19DT1VOVEVSX0xFTkdUSChOVU0pICgoTlVNKSAqIDIpCisjZGVmaW5lIEdDT1ZfVEFHX0NPVU5URVJfTlVNKExFTkdUSCkgKChMRU5HVEgpIC8gMikKKyNkZWZpbmUgR0NPVl9UQUdfT0JKRUNUX1NVTU1BUlkgICgoZ2Nvdl91bnNpZ25lZF90KTB4YTEwMDAwMDApCisjZGVmaW5lIEdDT1ZfVEFHX1BST0dSQU1fU1VNTUFSWSAoKGdjb3ZfdW5zaWduZWRfdCkweGEzMDAwMDAwKQorI2RlZmluZSBHQ09WX1RBR19TVU1NQVJZX0xFTkdUSCAgXAorCSgxICsgR0NPVl9DT1VOVEVSU19TVU1NQUJMRSAqICgyICsgMyAqIDIpKQorI2RlZmluZSBHQ09WX1RBR19NT0RVTEVfSU5GTyAoKGdjb3ZfdW5zaWduZWRfdCkweGE0MDAwMDAwKQorI2RlZmluZSBHQ09WX1RBR19QTVVfTE9BRF9MQVRFTkNZX0lORk8gKChnY292X3Vuc2lnbmVkX3QpMHhhNTAwMDAwMCkKKyNkZWZpbmUgR0NPVl9UQUdfUE1VX0xPQURfTEFURU5DWV9MRU5HVEgoZmlsZW5hbWUpICBcCisgIChnY292X3N0cmluZ19sZW5ndGggKGZpbGVuYW1lKSArIDEyICsgMikKKyNkZWZpbmUgR0NPVl9UQUdfUE1VX0JSQU5DSF9NSVNQUkVESUNUX0lORk8gKChnY292X3Vuc2lnbmVkX3QpMHhhNzAwMDAwMCkKKyNkZWZpbmUgR0NPVl9UQUdfUE1VX0JSQU5DSF9NSVNQUkVESUNUX0xFTkdUSChmaWxlbmFtZSkgIFwKKyAgKGdjb3Zfc3RyaW5nX2xlbmd0aCAoZmlsZW5hbWUpICsgNSArIDIpCisjZGVmaW5lIEdDT1ZfVEFHX1BNVV9UT09MX0hFQURFUiAoKGdjb3ZfdW5zaWduZWRfdCkweGE5MDAwMDAwKQorCisvKiBDb3VudGVycyB0aGF0IGFyZSBjb2xsZWN0ZWQuICAqLworI2RlZmluZSBHQ09WX0NPVU5URVJfQVJDUyAJMCAgLyogQXJjIHRyYW5zaXRpb25zLiAgKi8KKyNkZWZpbmUgR0NPVl9DT1VOVEVSU19TVU1NQUJMRQkxICAvKiBDb3VudGVycyB3aGljaCBjYW4gYmUKKwkJCQkgICAgICBzdW1tYXJpZWQuICAqLworI2RlZmluZSBHQ09WX0ZJUlNUX1ZBTFVFX0NPVU5URVIgMSAvKiBUaGUgZmlyc3Qgb2YgY291bnRlcnMgdXNlZCBmb3IgdmFsdWUKKwkJCQkgICAgICBwcm9maWxpbmcuICBUaGV5IG11c3QgZm9ybSBhIGNvbnNlY3V0aXZlCisJCQkJICAgICAgaW50ZXJ2YWwgYW5kIHRoZWlyIG9yZGVyIG11c3QgbWF0Y2gKKwkJCQkgICAgICB0aGUgb3JkZXIgb2YgSElTVF9UWVBFcyBpbgorCQkJCSAgICAgIHZhbHVlLXByb2YuaC4gICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9WX0lOVEVSVkFMCTEgIC8qIEhpc3RvZ3JhbSBvZiB2YWx1ZSBpbnNpZGUgYW4gaW50ZXJ2YWwuICAqLworI2RlZmluZSBHQ09WX0NPVU5URVJfVl9QT1cyCTIgIC8qIEhpc3RvZ3JhbSBvZiBleGFjdCBwb3dlcjIgbG9nYXJpdGhtCisJCQkJICAgICAgb2YgYSB2YWx1ZS4gICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9WX1NJTkdMRQkzICAvKiBUaGUgbW9zdCBjb21tb24gdmFsdWUgb2YgZXhwcmVzc2lvbi4gICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9WX0RFTFRBCTQgIC8qIFRoZSBtb3N0IGNvbW1vbiBkaWZmZXJlbmNlIGJldHdlZW4KKwkJCQkgICAgICBjb25zZWN1dGl2ZSB2YWx1ZXMgb2YgZXhwcmVzc2lvbi4gICovCisKKyNkZWZpbmUgR0NPVl9DT1VOVEVSX1ZfSU5ESVIJNSAgLyogVGhlIG1vc3QgY29tbW9uIGluZGlyZWN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgR0NPVl9DT1VOVEVSX0FWRVJBR0UJNiAgLyogQ29tcHV0ZSBhdmVyYWdlIHZhbHVlIHBhc3NlZCB0byB0aGUKKwkJCQkgICAgICBjb3VudGVyLiAgKi8KKyNkZWZpbmUgR0NPVl9DT1VOVEVSX0lPUgk3ICAvKiBJT1Igb2YgdGhlIGFsbCB2YWx1ZXMgcGFzc2VkIHRvCisJCQkJICAgICAgY291bnRlci4gICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9JQ0FMTF9UT1BOViA4IC8qIFRvcCBOIHZhbHVlIHRyYWNraW5nIGZvciBpbmRpcmVjdCBjYWxscyAqLworI2RlZmluZSBHQ09WX0xBU1RfVkFMVUVfQ09VTlRFUiA4ICAvKiBUaGUgbGFzdCBvZiBjb3VudGVycyB1c2VkIGZvciB2YWx1ZQorCQkJCSAgICAgIHByb2ZpbGluZy4gICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9ESVJFQ1RfQ0FMTCA5IC8qIERpcmVjdCBjYWxsIGNvdW50cy4gICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9SRVVTRV9ESVNUIDEwIC8qIFJldXNlIGRpc3RhbmNlIG1lYXN1cmUuICAqLworI2RlZmluZSBHQ09WX0NPVU5URVJTCQkxMQorCisvKiBOdW1iZXIgb2YgY291bnRlcnMgdXNlZCBmb3IgdmFsdWUgcHJvZmlsaW5nLiAgKi8KKyNkZWZpbmUgR0NPVl9OX1ZBTFVFX0NPVU5URVJTIFwKKyAgKEdDT1ZfTEFTVF9WQUxVRV9DT1VOVEVSIC0gR0NPVl9GSVJTVF9WQUxVRV9DT1VOVEVSICsgMSkKKworICAvKiBBIGxpc3Qgb2YgaHVtYW4gcmVhZGFibGUgbmFtZXMgb2YgdGhlIGNvdW50ZXJzICovCisjZGVmaW5lIEdDT1ZfQ09VTlRFUl9OQU1FUwl7ImFyY3MiLCAiaW50ZXJ2YWwiLCAicG93MiIsICJzaW5nbGUiLCBcCisJCQkJICJkZWx0YSIsImluZGlyZWN0X2NhbGwiLCAiYXZlcmFnZSIsICJpb3IiLCBcCisJCQkJICJpbmRpcmVjdF9jYWxsX3RvcG4iLCAiZGlyZWN0X2NhbGwiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV1c2VfZGlzdGFuY2UifQorCisjZGVmaW5lIEdDT1ZfSUNBTExfVE9QTl9WQUwgIDIgICAvKiBUcmFjayB0d28gaG90dGVzdCBjYWxsZWVzICovCisjZGVmaW5lIEdDT1ZfSUNBTExfVE9QTl9OQ09VTlRTICA5IC8qIFRoZSBudW1iZXIgb2YgY291bnRlciBlbnRyaWVzIHBlciBpY2FsbCBjYWxsc2l0ZSAqLworICAvKiBOYW1lcyBvZiBtZXJnZSBmdW5jdGlvbnMgZm9yIGNvdW50ZXJzLiAgKi8KKyNkZWZpbmUgR0NPVl9NRVJHRV9GVU5DVElPTlMJeyJfX2djb3ZfbWVyZ2VfYWRkIiwJXAorCQkJCSAiX19nY292X21lcmdlX2FkZCIsCVwKKwkJCQkgIl9fZ2Nvdl9tZXJnZV9hZGQiLAlcCisJCQkJICJfX2djb3ZfbWVyZ2Vfc2luZ2xlIiwJXAorCQkJCSAiX19nY292X21lcmdlX2RlbHRhIiwgIFwKKwkJCQkgIl9fZ2Nvdl9tZXJnZV9zaW5nbGUiLCBcCisJCQkJICJfX2djb3ZfbWVyZ2VfYWRkIiwJXAorCQkJCSAiX19nY292X21lcmdlX2lvciIsCVwKKwkJCQkgIl9fZ2Nvdl9tZXJnZV9pY2FsbF90b3BuIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19nY292X21lcmdlX2RjIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19nY292X21lcmdlX3JldXNlZGlzdCIgfQorCisvKiBDb252ZXJ0IGEgY291bnRlciBpbmRleCB0byBhIHRhZy4gICovCisjZGVmaW5lIEdDT1ZfVEFHX0ZPUl9DT1VOVEVSKENPVU5UKQkJCQlcCisJKEdDT1ZfVEFHX0NPVU5URVJfQkFTRSArICgoZ2Nvdl91bnNpZ25lZF90KShDT1VOVCkgPDwgMTcpKQorLyogQ29udmVydCBhIHRhZyB0byBhIGNvdW50ZXIuICAqLworI2RlZmluZSBHQ09WX0NPVU5URVJfRk9SX1RBRyhUQUcpCQkJCQlcCisJKCh1bnNpZ25lZCkoKChUQUcpIC0gR0NPVl9UQUdfQ09VTlRFUl9CQVNFKSA+PiAxNykpCisvKiBDaGVjayB3aGV0aGVyIGEgdGFnIGlzIGEgY291bnRlciB0YWcuICAqLworI2RlZmluZSBHQ09WX1RBR19JU19DT1VOVEVSKFRBRykJCQkJXAorCSghKChUQUcpICYgMHhGRkZGKSAmJiBHQ09WX0NPVU5URVJfRk9SX1RBRyAoVEFHKSA8IEdDT1ZfQ09VTlRFUlMpCisKKy8qIFRoZSB0YWcgbGV2ZWwgbWFzayBoYXMgMSdzIGluIHRoZSBwb3NpdGlvbiBvZiB0aGUgaW5uZXIgbGV2ZWxzLCAmCisgICB0aGUgbHNiIG9mIHRoZSBjdXJyZW50IGxldmVsLCBhbmQgemVybyBvbiB0aGUgY3VycmVudCBhbmQgb3V0ZXIKKyAgIGxldmVscy4gICovCisjZGVmaW5lIEdDT1ZfVEFHX01BU0soVEFHKSAoKChUQUcpIC0gMSkgXiAoVEFHKSkKKworLyogUmV0dXJuIG5vbnplcm8gaWYgU1VCIGlzIGFuIGltbWVkaWF0ZSBzdWJ0YWcgb2YgVEFHLiAgKi8KKyNkZWZpbmUgR0NPVl9UQUdfSVNfU1VCVEFHKFRBRyxTVUIpCQkJCVwKKwkoR0NPVl9UQUdfTUFTSyAoVEFHKSA+PiA4ID09IEdDT1ZfVEFHX01BU0sgKFNVQikgCVwKKwkgJiYgISgoKFNVQikgXiAoVEFHKSkgJiB+R0NPVl9UQUdfTUFTSyhUQUcpKSkKKworLyogUmV0dXJuIG5vbnplcm8gaWYgU1VCIGlzIGF0IGEgc3VibGV2ZWwgdG8gVEFHLiAgKi8KKyNkZWZpbmUgR0NPVl9UQUdfSVNfU1VCTEVWRUwoVEFHLFNVQikJCQkJXAorICAgICAJKEdDT1ZfVEFHX01BU0sgKFRBRykgPiBHQ09WX1RBR19NQVNLIChTVUIpKQorCisvKiBCYXNpYyBibG9jayBmbGFncy4gICovCisjZGVmaW5lIEdDT1ZfQkxPQ0tfVU5FWFBFQ1RFRAkoMSA8PCAxKQorCisvKiBBcmMgZmxhZ3MuICAqLworI2RlZmluZSBHQ09WX0FSQ19PTl9UUkVFIAkoMSA8PCAwKQorI2RlZmluZSBHQ09WX0FSQ19GQUtFCQkoMSA8PCAxKQorI2RlZmluZSBHQ09WX0FSQ19GQUxMVEhST1VHSAkoMSA8PCAyKQorCisvKiBTdHJ1Y3R1cmVkIHJlY29yZHMuICAqLworCisvKiBDdW11bGF0aXZlIGNvdW50ZXIgZGF0YS4gICovCitzdHJ1Y3QgZ2Nvdl9jdHJfc3VtbWFyeQoreworICBnY292X3Vuc2lnbmVkX3QgbnVtOwkJLyogbnVtYmVyIG9mIGNvdW50ZXJzLiAgKi8KKyAgZ2Nvdl91bnNpZ25lZF90IHJ1bnM7CQkvKiBudW1iZXIgb2YgcHJvZ3JhbSBydW5zICovCisgIGdjb3ZfdHlwZSBzdW1fYWxsOwkJLyogc3VtIG9mIGFsbCBjb3VudGVycyBhY2N1bXVsYXRlZC4gICovCisgIGdjb3ZfdHlwZSBydW5fbWF4OwkJLyogbWF4aW11bSB2YWx1ZSBvbiBhIHNpbmdsZSBydW4uICAqLworICBnY292X3R5cGUgc3VtX21heDsgICAgCS8qIHN1bSBvZiBpbmRpdmlkdWFsIHJ1biBtYXggdmFsdWVzLiAgKi8KK307CisKKy8qIE9iamVjdCAmIHByb2dyYW0gc3VtbWFyeSByZWNvcmQuICAqLworc3RydWN0IGdjb3Zfc3VtbWFyeQoreworICBnY292X3Vuc2lnbmVkX3QgY2hlY2tzdW07CS8qIGNoZWNrc3VtIG9mIHByb2dyYW0gKi8KKyAgc3RydWN0IGdjb3ZfY3RyX3N1bW1hcnkgY3Ryc1tHQ09WX0NPVU5URVJTX1NVTU1BQkxFXTsKK307CisKKyNkZWZpbmUgR0NPVl9NT0RVTEVfVU5LTk9XTl9MQU5HICAwCisjZGVmaW5lIEdDT1ZfTU9EVUxFX0NfTEFORyAgICAxCisjZGVmaW5lIEdDT1ZfTU9EVUxFX0NQUF9MQU5HICAyCisjZGVmaW5lIEdDT1ZfTU9EVUxFX0ZPUlRfTEFORyAzCisKKyNkZWZpbmUgR0NPVl9NT0RVTEVfQVNNX1NUTVRTICgxIDw8IDE2KQorI2RlZmluZSBHQ09WX01PRFVMRV9MQU5HX01BU0sgMHhmZmZmCisKK2VudW0gcHJpbnRfbmV3bGluZSB7bm9fbmV3bGluZSwgYWRkX25ld2xpbmV9OworCisvKiBTb3VyY2UgbW9kdWxlIGluZm8uIFRoZSBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIGluCisgICBib3RoIHJ1bnRpbWUgYW5kIHByb2ZpbGUtdXNlIHBoYXNlLiBNYWtlIHN1cmUgdG8gYWxsb2NhdGUKKyAgIGVub3VnaCBzcGFjZSBmb3IgdGhlIHZhcmlhYmxlIGxlbmd0aCBtZW1iZXIuICAqLworc3RydWN0IGdjb3ZfbW9kdWxlX2luZm8KK3sKKyAgZ2Nvdl91bnNpZ25lZF90IGlkZW50OworICBnY292X3Vuc2lnbmVkX3QgaXNfcHJpbWFyeTsgLyogdGhpcyBpcyBvdmVybG9hZGVkIHRvIG1lYW4gdHdvIHRoaW5nczoKKwkJCQkgKDEpIG1lYW5zIEZETy9MSVBPIGluIGluc3RydW1lbnRlZCBiaW5hcnkuCisJCQkJICgyKSBtZWFucyBJU19QUklNQVJZIGluIHBlcnNpc3RlbnQgZmlsZSBvcgorCQkJCSAgICAgbWVtb3J5IGNvcHkgdXNlZCBpbiBwcm9maWxlLXVzZS4gICovCisgIGdjb3ZfdW5zaWduZWRfdCBpc19leHBvcnRlZDsKKyAgZ2Nvdl91bnNpZ25lZF90IGxhbmc7IC8qIGxvd2VyIDE2IGJpdHMgZW5jb2RlIHRoZSBsYW5ndWFnZSwgYW5kIHRoZSB1cHBlcgorCQkJICAgMTYgYml0cyBlbm9jZGUgb3RoZXIgYXR0cmlidXRlcywgc3VjaCBhcyB3aGV0aGVyCisJCQkgICBhbnkgYXNzZW1ibGVyIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgZXRjLiAgKi8KKyAgY2hhciAqZGFfZmlsZW5hbWU7CisgIGNoYXIgKnNvdXJjZV9maWxlbmFtZTsKKyAgZ2Nvdl91bnNpZ25lZF90IG51bV9xdW90ZV9wYXRoczsKKyAgZ2Nvdl91bnNpZ25lZF90IG51bV9icmFja2V0X3BhdGhzOworICBnY292X3Vuc2lnbmVkX3QgbnVtX2NwcF9kZWZpbmVzOworICBnY292X3Vuc2lnbmVkX3QgbnVtX2NwcF9pbmNsdWRlczsKKyAgZ2Nvdl91bnNpZ25lZF90IG51bV9jbF9hcmdzOworICBjaGFyICpzdHJpbmdfYXJyYXlbMV07Cit9OworCitleHRlcm4gc3RydWN0IGdjb3ZfbW9kdWxlX2luZm8gKiptb2R1bGVfaW5mb3M7CitleHRlcm4gdW5zaWduZWQgcHJpbWFyeV9tb2R1bGVfaWQ7CisjZGVmaW5lIFBSSU1BUllfTU9EVUxFX0VYUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtb2R1bGVfaW5mb3NbMF0tPmlzX2V4cG9ydGVkCQkJCQkJXAorICAgJiYgISgobW9kdWxlX2luZm9zWzBdLT5sYW5nICYgR0NPVl9NT0RVTEVfQVNNX1NUTVRTKQkJCVwKKwkmJiBmbGFnX3JpcGFfZGlzYWxsb3dfYXNtX21vZHVsZXMpKQorCisvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaGFyZHdhcmUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyB1bml0LiAgKi8KK3N0cnVjdCBnY292X3BtdV9pbmZvCit7CisgIGNvbnN0IGNoYXIgKnBtdV9wcm9maWxlX2ZpbGVuYW1lOwkvKiBwbXUgcHJvZmlsZSBmaWxlbmFtZSAgKi8KKyAgY29uc3QgY2hhciAqcG11X3Rvb2w7ICAJLyogY2Fub25pY2FsIHBtdSB0b29sIG9wdGlvbnMgICovCisgIGdjb3ZfdW5zaWduZWRfdCBwbXVfdG9wX25fYWRkcmVzczsgIC8qIGhvdyBtYW55IHRvcCBhZGRyZXNzZXMgdG8gc3ltYm9saXplICovCit9OworCisvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgUE1VIHRvb2wgaGVhZGVyLiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjb3ZfcG11X3Rvb2xfaGVhZGVyIHsKKyAgY2hhciAqaG9zdF9jcHU7CisgIGNoYXIgKmhvc3RuYW1lOworICBjaGFyICprZXJuZWxfdmVyc2lvbjsKKyAgY2hhciAqY29sdW1uX2hlYWRlcjsKKyAgY2hhciAqY29sdW1uX2Rlc2NyaXB0aW9uOworICBjaGFyICpmdWxsX2hlYWRlcjsKK30gZ2Nvdl9wbXVfdG9vbF9oZWFkZXJfdDsKKworLyogQXZhaWxhYmxlIG9ubHkgZm9yIFBNVXMgd2hpY2ggc3VwcG9ydCBQRUJTIG9yIElCUyB1c2luZyBwZm1vbgorICAgdG9vbC4gSWYgYW55IGZpZWxkIGhlcmUgaXMgY2hhbmdlZCwgdGhlIGxlbmd0aCBjb21wdXRhdGlvbiBpbgorICAgR0NPVl9UQUdfUE1VX0xPQURfTEFURU5DWV9MRU5HVEggbXVzdCBiZSB1cGRhdGVkIGFzIHdlbGwuIEFsbAorICAgcGVyY2VudGFnZXMgYXJlIG11bHRpcGxpZWQgYnkgMTAwIHRvIG1ha2UgdGhlbSBvdXQgb2YgMTAwMDAgYW5kCisgICBvbmx5IGludGVnZXIgcGFydCBpcyBrZXB0LiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjb3ZfcG11X2xvYWRfbGF0ZW5jeV9pbmZvCit7CisgIGdjb3ZfdW5zaWduZWRfdCBjb3VudHM7ICAgICAvKiByYXcgY291bnQgb2Ygc2FtcGxlcyAqLworICBnY292X3Vuc2lnbmVkX3Qgc2VsZjsgICAgICAgLyogcGVyIDEwayBvZiB0b3RhbCBzYW1wbGVzICovCisgIGdjb3ZfdW5zaWduZWRfdCBjdW07ICAgICAgICAvKiBwZXIgMTBrIGN1bXVsYXRpdmUgd2VpZ2h0ICovCisgIGdjb3ZfdW5zaWduZWRfdCBsdF8xMDsgICAgICAvKiBwZXIgMTBrIHdpdGggbGF0ZW5jeSA8PSAxMCBjeWNsZXMgKi8KKyAgZ2Nvdl91bnNpZ25lZF90IGx0XzMyOyAgICAgIC8qIHBlciAxMGsgd2l0aCBsYXRlbmN5IDw9IDMyIGN5Y2xlcyAqLworICBnY292X3Vuc2lnbmVkX3QgbHRfNjQ7ICAgICAgLyogcGVyIDEwayB3aXRoIGxhdGVuY3kgPD0gNjQgY3ljbGVzICovCisgIGdjb3ZfdW5zaWduZWRfdCBsdF8yNTY7ICAgICAvKiBwZXIgMTBrIHdpdGggbGF0ZW5jeSA8PSAyNTYgY3ljbGVzICovCisgIGdjb3ZfdW5zaWduZWRfdCBsdF8xMDI0OyAgICAvKiBwZXIgMTBrIHdpdGggbGF0ZW5jeSA8PSAxMDI0IGN5Y2xlcyAqLworICBnY292X3Vuc2lnbmVkX3QgZ3RfMTAyNDsgICAgLyogcGVyIDEwayB3aXRoIGxhdGVuY3kgPiAxMDI0IGN5Y2xlcyAqLworICBnY292X3Vuc2lnbmVkX3Qgd3NlbGY7ICAgICAgLyogd2VpZ2h0ZWQgYXZlcmFnZSBjb3N0IG9mIHRoaXMgbWlzcyBpbiBjeWNsZXMgKi8KKyAgZ2Nvdl90eXBlIGNvZGVfYWRkcjsgICAgICAgIC8qIHRoZSBhY3R1YWwgbWlzcyBhZGRyZXNzIChwYysxIGZvciBJbnRlbCkgKi8KKyAgZ2Nvdl91bnNpZ25lZF90IGxpbmU7ICAgICAgIC8qIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtaXNzICovCisgIGdjb3ZfdW5zaWduZWRfdCBkaXNjcmltaW5hdG9yOyAgIC8qIGRpc2NyaW1pbmF0b3IgaW5mb3JtYXRpb24gZm9yIHRoaXMgbWlzcyAqLworICBjaGFyICpmaWxlbmFtZTsgICAgICAgLyogZmlsZW5hbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIG1pc3MgKi8KK30gZ2Nvdl9wbXVfbGxfaW5mb190OworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGR1cmluZyBydW50aW1lIGFzIHdlbGwgYXMgaW4gZ2Nvdi4gICovCit0eXBlZGVmIHN0cnVjdCBsb2FkX2xhdGVuY3lfaW5mb3MKK3sKKyAgLyogQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGxvYWQgbGF0ZW5jeSBmaWVsZHMuICAqLworICBnY292X3BtdV9sbF9pbmZvX3QgKipsbF9hcnJheTsKKyAgLyogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsb2FkIGxhdGVuY3kgYXJyYXkuICAqLworICB1bnNpZ25lZCBsbF9jb3VudDsKKyAgLyogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGN1cnJlbnRseSBhbGxvY2F0ZWQgaW4gdGhlIGFycmF5LgorICAgICBVc2VkIGZvciBib29ra2VlcGluZy4gICovCisgIHVuc2lnbmVkIGFsbG9jX2xsX2NvdW50OworICAvKiBQTVUgdG9vbCBoZWFkZXIgKi8KKyAgZ2Nvdl9wbXVfdG9vbF9oZWFkZXJfdCAqcG11X3Rvb2xfaGVhZGVyOworfSBsbF9pbmZvc190OworCisvKiBBdmFpbGFibGUgb25seSBmb3IgUE1VcyB3aGljaCBzdXBwb3J0IFBFQlMgb3IgSUJTIHVzaW5nIHBmbW9uCisgICB0b29sLiBJZiBhbnkgZmllbGQgaGVyZSBpcyBjaGFuZ2VkLCB0aGUgbGVuZ3RoIGNvbXB1dGF0aW9uIGluCisgICBHQ09WX1RBR19QTVVfQlJfTUlTUFJFRElDVF9MRU5HVEggbXVzdCBiZSB1cGRhdGVkIGFzIHdlbGwuIEFsbAorICAgcGVyY2VudGFnZXMgYXJlIG11bHRpcGxpZWQgYnkgMTAwIHRvIG1ha2UgdGhlbSBvdXQgb2YgMTAwMDAgYW5kCisgICBvbmx5IGludGVnZXIgcGFydCBpcyBrZXB0LiAgKi8KK3R5cGVkZWYgc3RydWN0IGdjb3ZfcG11X2JyYW5jaF9taXNwcmVkaWN0X2luZm8KK3sKKyAgZ2Nvdl91bnNpZ25lZF90IGNvdW50czsgICAgIC8qIHJhdyBjb3VudCBvZiBzYW1wbGVzICovCisgIGdjb3ZfdW5zaWduZWRfdCBzZWxmOyAgICAgICAvKiBwZXIgMTBrIG9mIHRvdGFsIHNhbXBsZXMgKi8KKyAgZ2Nvdl91bnNpZ25lZF90IGN1bTsgICAgICAgIC8qIHBlciAxMGsgY3VtdWxhdGl2ZSB3ZWlnaHQgKi8KKyAgZ2Nvdl90eXBlIGNvZGVfYWRkcjsgICAgICAgIC8qIHRoZSBhY3R1YWwgbWlzcHJlZGljdCBhZGRyZXNzICovCisgIGdjb3ZfdW5zaWduZWRfdCBsaW5lOyAgICAgICAvKiBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZXZlbnQgKi8KKyAgZ2Nvdl91bnNpZ25lZF90IGRpc2NyaW1pbmF0b3I7ICAgLyogZGlzY3JpbWluYXRvciBmb3IgdGhpcyBldmVudCAqLworICBjaGFyICpmaWxlbmFtZTsgICAgICAgLyogZmlsZW5hbWUgY29ycmVzcG9uZGluZyB0byB0aGlzIGV2ZW50ICovCit9IGdjb3ZfcG11X2JybV9pbmZvX3Q7CisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZHVyaW5nIHJ1bnRpbWUgYXMgd2VsbCBhcyBpbiBnY292LiAgKi8KK3R5cGVkZWYgc3RydWN0IGJyYW5jaF9taXNwcmVkaWN0X2luZm9zCit7CisgIC8qIEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBtaXNwcmVkaWN0IGVudHJpZXMuICAqLworICBnY292X3BtdV9icm1faW5mb190ICoqYnJtX2FycmF5OworICAvKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFib3ZlIGFycmF5LiAgKi8KKyAgdW5zaWduZWQgYnJtX2NvdW50OworICAvKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgY3VycmVudGx5IGFsbG9jYXRlZCBpbiB0aGUgYXJyYXkuCisgICAgIFVzZWQgZm9yIGJvb2trZWVwaW5nLiAgKi8KKyAgdW5zaWduZWQgYWxsb2NfYnJtX2NvdW50OworICAvKiBQTVUgdG9vbCBoZWFkZXIgKi8KKyAgZ2Nvdl9wbXVfdG9vbF9oZWFkZXJfdCAqcG11X3Rvb2xfaGVhZGVyOworfSBicm1faW5mb3NfdDsKKworLyogU3RydWN0dXJlcyBlbWJlZGRlZCBpbiBjb3ZlcmFnZWQgcHJvZ3JhbS4gIFRoZSBzdHJ1Y3R1cmVzIGdlbmVyYXRlZAorICAgYnkgd3JpdGVfcHJvZmlsZSBtdXN0IG1hdGNoIHRoZXNlLiAgKi8KKworI2lmIElOX0xJQkdDT1YKKy8qIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGZ1bmN0aW9uLiAgVGhpcyB1c2VzIHRoZSB0cmFpbGluZyBhcnJheQorICAgaWRpb20uIFRoZSBudW1iZXIgb2YgY291bnRlcnMgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb3VudGVyX21hc2sKKyAgIGluIGdjb3ZfaW5mby4gIFdlIGhvbGQgYW4gYXJyYXkgb2YgZnVuY3Rpb24gaW5mbywgc28gaGF2ZSB0bworICAgZXhwbGljaXRseSBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgYXJyYXkgc3RyaWRlLiAgKi8KKworc3RydWN0IGdjb3ZfZm5faW5mbworeworICBnY292X3Vuc2lnbmVkX3QgaWRlbnQ7CS8qIHVuaXF1ZSBpZGVudCBvZiBmdW5jdGlvbiAqLworICBnY292X3Vuc2lnbmVkX3QgbGluZW5vX2NoZWNrc3VtOwkvKiBmdW5jdGlvbiBsaW5lb19jaGVja3N1bSAqLworICBnY292X3Vuc2lnbmVkX3QgY2ZnX2NoZWNrc3VtOwkvKiBmdW5jdGlvbiBjZmcgY2hlY2tzdW0gKi8KKyAgZ2Nvdl91bnNpZ25lZF90IGRjX29mZnNldDsgICAgLyogZGlyZWN0IGNhbGwgb2Zmc2V0ICovCisgIHVuc2lnbmVkIG5fY3Ryc1swXTsJCS8qIGluc3RydW1lbnRlZCBjb3VudGVycyAqLworfTsKKworLyogVHlwZSBvZiBmdW5jdGlvbiB1c2VkIHRvIG1lcmdlIGNvdW50ZXJzLiAgKi8KK3R5cGVkZWYgdm9pZCAoKmdjb3ZfbWVyZ2VfZm4pIChnY292X3R5cGUgKiwgZ2Nvdl91bnNpZ25lZF90KTsKKworLyogSW5mb3JtYXRpb24gYWJvdXQgY291bnRlcnMuICAqLworc3RydWN0IGdjb3ZfY3RyX2luZm8KK3sKKyAgZ2Nvdl91bnNpZ25lZF90IG51bTsJCS8qIG51bWJlciBvZiBjb3VudGVycy4gICovCisgIGdjb3ZfdHlwZSAqdmFsdWVzOwkJLyogdGhlaXIgdmFsdWVzLiAgKi8KKyAgZ2Nvdl9tZXJnZV9mbiBtZXJnZTsgIAkvKiBUaGUgZnVuY3Rpb24gdXNlZCB0byBtZXJnZSB0aGVtLiAgKi8KK307CisKKy8qIEluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG9iamVjdCBmaWxlLiAgKi8KK3N0cnVjdCBnY292X2luZm8KK3sKKyAgZ2Nvdl91bnNpZ25lZF90IHZlcnNpb247CS8qIGV4cGVjdGVkIHZlcnNpb24gbnVtYmVyICovCisgIHN0cnVjdCBnY292X21vZHVsZV9pbmZvICptb2RfaW5mbzsgLyogYWRkdGlvbmFsIG1vZHVsZSBpbmZvLiAgKi8KKyAgc3RydWN0IGdjb3ZfaW5mbyAqbmV4dDsJLyogbGluayB0byBuZXh0LCB1c2VkIGJ5IGxpYmdjb3YgKi8KKworICBnY292X3Vuc2lnbmVkX3Qgc3RhbXA7CS8qIHVuaXF1aWZ5aW5nIHRpbWUgc3RhbXAgKi8KKyAgY29uc3QgY2hhciAqZmlsZW5hbWU7CQkvKiBvdXRwdXQgZmlsZSBuYW1lICovCisgIGdjb3ZfdW5zaWduZWRfdCBlb2ZfcG9zOyAgICAgIC8qIGVuZCBwb3NpdGlvbiBvZiBwcm9maWxlIGRhdGEgKi8KKyAgdW5zaWduZWQgbl9mdW5jdGlvbnM7CQkvKiBudW1iZXIgb2YgZnVuY3Rpb25zICovCisgIGNvbnN0IHN0cnVjdCBnY292X2ZuX2luZm8gKmZ1bmN0aW9uczsgLyogdGFibGUgb2YgZnVuY3Rpb25zICovCisKKyAgdW5zaWduZWQgY3RyX21hc2s7CQkvKiBtYXNrIG9mIGNvdW50ZXJzIGluc3RydW1lbnRlZC4gICovCisgIHN0cnVjdCBnY292X2N0cl9pbmZvIGNvdW50c1swXTsgLyogY291bnQgZGF0YS4gVGhlIG51bWJlciBvZiBiaXRzCisJCQkJICAgICBzZXQgaW4gdGhlIGN0cl9tYXNrIGZpZWxkCisJCQkJICAgICBkZXRlcm1pbmVzIGhvdyBiaWcgdGhpcyBhcnJheQorCQkJCSAgICAgaXMuICAqLworfTsKKworLyogSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgaW1wb3J0ZWQgbW9kdWxlLiAgKi8KK3N0cnVjdCBkeW5faW1wX21vZAoreworICBjb25zdCBzdHJ1Y3QgZ2Nvdl9pbmZvICppbXBfbW9kOworICBkb3VibGUgd2VpZ2h0OworfTsKKworLyogUmVnaXN0ZXIgYSBuZXcgb2JqZWN0IGZpbGUgbW9kdWxlLiAgKi8KK2V4dGVybiB2b2lkIF9fZ2Nvdl9pbml0IChzdHJ1Y3QgZ2Nvdl9pbmZvICopIEFUVFJJQlVURV9ISURERU47CisKKy8qIENhbGxlZCBiZWZvcmUgZm9yaywgdG8gYXZvaWQgZG91YmxlIGNvdW50aW5nLiAgKi8KK2V4dGVybiB2b2lkIF9fZ2Nvdl9mbHVzaCAodm9pZCkgQVRUUklCVVRFX0hJRERFTjsKKworLyogVGhlIG1lcmdlIGZ1bmN0aW9uIHRoYXQganVzdCBzdW1zIHRoZSBjb3VudGVycy4gICovCitleHRlcm4gdm9pZCBfX2djb3ZfbWVyZ2VfYWRkIChnY292X3R5cGUgKiwgdW5zaWduZWQpIEFUVFJJQlVURV9ISURERU47CisKKy8qIFRoZSBtZXJnZSBmdW5jdGlvbiB0byBjaG9vc2UgdGhlIG1vc3QgY29tbW9uIHZhbHVlLiAgKi8KK2V4dGVybiB2b2lkIF9fZ2Nvdl9tZXJnZV9zaW5nbGUgKGdjb3ZfdHlwZSAqLCB1bnNpZ25lZCkgQVRUUklCVVRFX0hJRERFTjsKKworLyogVGhlIG1lcmdlIGZ1bmN0aW9uIHRvIGNob29zZSB0aGUgbW9zdCBjb21tb24gZGlmZmVyZW5jZSBiZXR3ZWVuCisgICBjb25zZWN1dGl2ZSB2YWx1ZXMuICAqLworZXh0ZXJuIHZvaWQgX19nY292X21lcmdlX2RlbHRhIChnY292X3R5cGUgKiwgdW5zaWduZWQpIEFUVFJJQlVURV9ISURERU47CisKKy8qIFRoZSBtZXJnZSBmdW5jdGlvbiB0aGF0IGp1c3Qgb3JzIHRoZSBjb3VudGVycyB0b2dldGhlci4gICovCitleHRlcm4gdm9pZCBfX2djb3ZfbWVyZ2VfaW9yIChnY292X3R5cGUgKiwgdW5zaWduZWQpIEFUVFJJQlVURV9ISURERU47CisKKy8qIFRoZSBtZXJnZSBmdW5jdGlvbiB1c2VkIGZvciBkaXJlY3QgY2FsbCBjb3VudGVycy4gICovCitleHRlcm4gdm9pZCBfX2djb3ZfbWVyZ2VfZGMgKGdjb3ZfdHlwZSAqLCB1bnNpZ25lZCkgQVRUUklCVVRFX0hJRERFTjsKKworLyogVGhlIG1lcmdlIGZ1bmN0aW9uIHVzZWQgZm9yIHJldXNlIGRpc3RhbmNlIGNvdW50ZXJzLiAgKi8KK2V4dGVybiB2b2lkIF9fZ2Nvdl9tZXJnZV9yZXVzZWRpc3QgKGdjb3ZfdHlwZSAqLCB1bnNpZ25lZCkgQVRUUklCVVRFX0hJRERFTjsKKworLyogVGhlIG1lcmdlIGZ1bmN0aW9uIHVzZWQgZm9yIGluZGlyZWN0IGNhbGwgY291bnRlcnMuICAqLworZXh0ZXJuIHZvaWQgX19nY292X21lcmdlX2ljYWxsX3RvcG4gKGdjb3ZfdHlwZSAqLCB1bnNpZ25lZCkgQVRUUklCVVRFX0hJRERFTjsKKworLyogVGhlIHByb2ZpbGVyIGZ1bmN0aW9ucy4gICovCitleHRlcm4gdm9pZCBfX2djb3ZfaW50ZXJ2YWxfcHJvZmlsZXIgKGdjb3ZfdHlwZSAqLCBnY292X3R5cGUsIGludCwgdW5zaWduZWQpOworZXh0ZXJuIHZvaWQgX19nY292X3BvdzJfcHJvZmlsZXIgKGdjb3ZfdHlwZSAqLCBnY292X3R5cGUpOworZXh0ZXJuIHZvaWQgX19nY292X29uZV92YWx1ZV9wcm9maWxlciAoZ2Nvdl90eXBlICosIGdjb3ZfdHlwZSk7CitleHRlcm4gdm9pZCBfX2djb3ZfaW5kaXJlY3RfY2FsbF9wcm9maWxlciAoZ2Nvdl90eXBlICosIGdjb3ZfdHlwZSwgdm9pZCAqLCB2b2lkICopOworZXh0ZXJuIHZvaWQgX19nY292X2luZGlyZWN0X2NhbGxfdG9wbl9wcm9maWxlciAodm9pZCAqLCB2b2lkICosIGdjb3ZfdW5zaWduZWRfdCkgQVRUUklCVVRFX0hJRERFTjsKK2V4dGVybiB2b2lkIF9fZ2Nvdl9kaXJlY3RfY2FsbF9wcm9maWxlciAodm9pZCAqLCB2b2lkICosIGdjb3ZfdW5zaWduZWRfdCkgQVRUUklCVVRFX0hJRERFTjsKK2V4dGVybiB2b2lkIF9fZ2Nvdl9hdmVyYWdlX3Byb2ZpbGVyIChnY292X3R5cGUgKiwgZ2Nvdl90eXBlKTsKK2V4dGVybiB2b2lkIF9fZ2Nvdl9pb3JfcHJvZmlsZXIgKGdjb3ZfdHlwZSAqLCBnY292X3R5cGUpOworZXh0ZXJuIHZvaWQgX19nY292X3NvcnRfbl92YWxzIChnY292X3R5cGUgKnZhbHVlX2FycmF5LCBpbnQgbik7CisKKy8qIEluaXRpYWxpemUvc3RhcnQvc3RvcC9kdW1wIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgdW5pdCAoUE1VKSBwcm9maWxlICovCit2b2lkIF9fZ2Nvdl9pbml0X3BtdV9wcm9maWxlciAoc3RydWN0IGdjb3ZfcG11X2luZm8gKikgQVRUUklCVVRFX0hJRERFTjsKK3ZvaWQgX19nY292X3N0YXJ0X3BtdV9wcm9maWxlciAodm9pZCkgQVRUUklCVVRFX0hJRERFTjsKK3ZvaWQgX19nY292X3N0b3BfcG11X3Byb2ZpbGVyICh2b2lkKSBBVFRSSUJVVEVfSElEREVOOwordm9pZCBfX2djb3ZfZW5kX3BtdV9wcm9maWxlciAoaW50IGdjZGFfZXJyb3IpIEFUVFJJQlVURV9ISURERU47CisKKyNpZm5kZWYgaW5oaWJpdF9saWJjCisvKiBUaGUgd3JhcHBlcnMgYXJvdW5kIHNvbWUgbGlicmFyeSBmdW5jdGlvbnMuLiAgKi8KK2V4dGVybiBwaWRfdCBfX2djb3ZfZm9yayAodm9pZCkgQVRUUklCVVRFX0hJRERFTjsKK2V4dGVybiBpbnQgX19nY292X2V4ZWNsIChjb25zdCBjaGFyICosIGNoYXIgKiwgLi4uKSBBVFRSSUJVVEVfSElEREVOOworZXh0ZXJuIGludCBfX2djb3ZfZXhlY2xwIChjb25zdCBjaGFyICosIGNoYXIgKiwgLi4uKSBBVFRSSUJVVEVfSElEREVOOworZXh0ZXJuIGludCBfX2djb3ZfZXhlY2xlIChjb25zdCBjaGFyICosIGNoYXIgKiwgLi4uKSBBVFRSSUJVVEVfSElEREVOOworZXh0ZXJuIGludCBfX2djb3ZfZXhlY3YgKGNvbnN0IGNoYXIgKiwgY2hhciAqY29uc3QgW10pIEFUVFJJQlVURV9ISURERU47CitleHRlcm4gaW50IF9fZ2Nvdl9leGVjdnAgKGNvbnN0IGNoYXIgKiwgY2hhciAqY29uc3QgW10pIEFUVFJJQlVURV9ISURERU47CitleHRlcm4gaW50IF9fZ2Nvdl9leGVjdmUgKGNvbnN0IGNoYXIgKiwgY2hhciAgKmNvbnN0IFtdLCBjaGFyICpjb25zdCBbXSkKKyAgQVRUUklCVVRFX0hJRERFTjsKKyNlbmRpZgorCisjZW5kaWYgLyogSU5fTElCR0NPViAqLworCisjaWYgSU5fTElCR0NPViA+PSAwCisKKy8qIE9wdGltdW0gbnVtYmVyIG9mIGdjb3ZfdW5zaWduZWRfdCdzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGRpc2suICAqLworI2RlZmluZSBHQ09WX0JMT0NLX1NJWkUgKDEgPDwgMTApCisKK3N0cnVjdCBnY292X3ZhcgoreworICBfR0NPVl9GSUxFICpmaWxlOworICBnY292X3Bvc2l0aW9uX3Qgc3RhcnQ7CS8qIFBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgYmxvY2sgKi8KKyAgdW5zaWduZWQgb2Zmc2V0OwkJLyogUmVhZC93cml0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGJsb2NrLiAgKi8KKyAgdW5zaWduZWQgbGVuZ3RoOwkJLyogUmVhZCBsaW1pdCBpbiB0aGUgYmxvY2suICAqLworICB1bnNpZ25lZCBvdmVycmVhZDsJCS8qIE51bWJlciBvZiB3b3JkcyBvdmVycmVhZC4gICovCisgIGludCBlcnJvcjsJCQkvKiA8IDAgb3ZlcmZsb3csID4gMCBkaXNrIGVycm9yLiAgKi8KKyAgaW50IG1vZGU7CSAgICAgICAgICAgICAgICAvKiA8IDAgd3JpdGluZywgPiAwIHJlYWRpbmcgKi8KKyNpZiBJTl9MSUJHQ09WCisgIC8qIEhvbGRzIG9uZSBibG9jayBwbHVzIDQgYnl0ZXMsIHRodXMgYWxsIGNvdmVyYWdlIHJlYWRzICYgd3JpdGVzCisgICAgIGZpdCB3aXRoaW4gdGhpcyBidWZmZXIgYW5kIHdlIGFsd2F5cyBjYW4gdHJhbnNmZXIgR0NPVl9CTE9DS19TSVpFCisgICAgIHRvIGFuZCBmcm9tIHRoZSBkaXNrLiBsaWJnY292IG5ldmVyIGJhY2t0cmFja3MgYW5kIG9ubHkgd3JpdGVzIDQKKyAgICAgb3IgOCBieXRlIG9iamVjdHMuICAqLworICBnY292X3Vuc2lnbmVkX3QgYnVmZmVyW0dDT1ZfQkxPQ0tfU0laRSArIDFdOworI2Vsc2UKKyAgaW50IGVuZGlhbjsJCQkvKiBTd2FwIGVuZGlhbm5lc3MuICAqLworICAvKiBIb2xkcyBhIHZhcmlhYmxlIGxlbmd0aCBibG9jaywgYXMgdGhlIGNvbXBpbGVyIGNhbiB3cml0ZQorICAgICBzdHJpbmdzIGFuZCBuZWVkcyB0byBiYWNrdHJhY2suICAqLworICBzaXplX3QgYWxsb2M7CisgIGdjb3ZfdW5zaWduZWRfdCAqYnVmZmVyOworI2VuZGlmCit9OworCisvKiBJbiBrZXJuZWwgbW9kZSwgbW92ZSBnY292X3ZhciBkZWZpbml0aW9uIHRvIGdjb3YtaW8uYworICAgdG8gYXZvaWQgZHVsaXBjYXRlIGRlZmluaXRpb25zLiAgKi8KKyNpZm5kZWYgX19HQ09WX0tFUk5FTF9fCitHQ09WX0xJTktBR0Ugc3RydWN0IGdjb3ZfdmFyIGdjb3ZfdmFyIEFUVFJJQlVURV9ISURERU47CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBnY292X3ZhciBnY292X3ZhcjsKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgZ2NvdiBmaWxlcy4gSW4gbGliZ2NvdiB5b3UgY2FuCisgICBvcGVuIHRoZSBmaWxlIGZvciByZWFkaW5nIHRoZW4gd3JpdGluZy4gRWxzZXdoZXJlIHlvdSBjYW4gb3BlbiB0aGUKKyAgIGZpbGUgZWl0aGVyIGZvciByZWFkaW5nIG9yIGZvciB3cml0aW5nLiBXaGVuIHJlYWRpbmcgYSBmaWxlIHlvdSBtYXkKKyAgIHVzZSB0aGUgZ2Nvdl9yZWFkXyogZnVuY3Rpb25zLCBnY292X3N5bmMsIGdjb3ZfcG9zaXRpb24sICYKKyAgIGdjb3ZfZXJyb3IuIFdoZW4gd3JpdGluZyBhIGZpbGUgeW91IG1heSB1c2UgdGhlIGdjb3Zfd3JpdGUKKyAgIGZ1bmN0aW9ucywgZ2Nvdl9zZWVrICYgZ2Nvdl9lcnJvci4gV2hlbiBhIGZpbGUgaXMgdG8gYmUgcmV3cml0dGVuCisgICB5b3UgdXNlIHRoZSBmdW5jdGlvbnMgZm9yIHJlYWRpbmcsIHRoZW4gZ2Nvdl9yZXdyaXRlIHRoZW4gdGhlCisgICBmdW5jdGlvbnMgZm9yIHdyaXRpbmcuICBZb3VyIGZpbGUgbWF5IGJlY29tZSBjb3JydXB0ZWQgaWYgeW91IGJyZWFrCisgICB0aGVzZSBpbnZhcmlhbnRzLiAgKi8KKyNpZiBJTl9MSUJHQ09WCitHQ09WX0xJTktBR0UgaW50IGdjb3Zfb3BlbiAoY29uc3QgY2hhciAqLypuYW1lKi8pIEFUVFJJQlVURV9ISURERU47CisjZWxzZQorR0NPVl9MSU5LQUdFIGludCBnY292X29wZW4gKGNvbnN0IGNoYXIgKi8qbmFtZSovLCBpbnQgLypkaXJlY3Rpb24qLyk7CitHQ09WX0xJTktBR0UgaW50IGdjb3ZfbWFnaWMgKGdjb3ZfdW5zaWduZWRfdCwgZ2Nvdl91bnNpZ25lZF90KTsKKyNlbmRpZgorR0NPVl9MSU5LQUdFIGludCBnY292X2Nsb3NlICh2b2lkKSBBVFRSSUJVVEVfSElEREVOOworCisvKiBBdmFpbGFibGUgZXZlcnl3aGVyZS4gICovCitzdGF0aWMgZ2Nvdl9wb3NpdGlvbl90IGdjb3ZfcG9zaXRpb24gKHZvaWQpOworc3RhdGljIGludCBnY292X2lzX2Vycm9yICh2b2lkKTsKKworR0NPVl9MSU5LQUdFIGNvbnN0IGNoYXIgKmdjb3ZfcmVhZF9zdHJpbmcgKHZvaWQpIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0UgZ2Nvdl91bnNpZ25lZF90IGdjb3ZfcmVhZF91bnNpZ25lZCAodm9pZCkgQVRUUklCVVRFX0hJRERFTjsKK0dDT1ZfTElOS0FHRSBnY292X3R5cGUgZ2Nvdl9yZWFkX2NvdW50ZXIgKHZvaWQpIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3JlYWRfc3VtbWFyeSAoc3RydWN0IGdjb3Zfc3VtbWFyeSAqKSBBVFRSSUJVVEVfSElEREVOOworR0NPVl9MSU5LQUdFIGNoYXIgKmdjb3ZfY2Fub25pY2FsX2ZpbGVuYW1lIChjaGFyICpmaWxlbmFtZSkgQVRUUklCVVRFX0hJRERFTjsKK0dDT1ZfTElOS0FHRSB2b2lkCitnY292X3JlYWRfcG11X2xvYWRfbGF0ZW5jeV9pbmZvIChnY292X3BtdV9sbF9pbmZvX3QgKmxsX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY292X3Vuc2lnbmVkX3QgbGVuKSBBVFRSSUJVVEVfSElEREVOOworR0NPVl9MSU5LQUdFIHZvaWQKK2djb3ZfcmVhZF9wbXVfYnJhbmNoX21pc3ByZWRpY3RfaW5mbyAoZ2Nvdl9wbXVfYnJtX2luZm9fdCAqYnJtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3ZfdW5zaWduZWRfdCBsZW4pIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0Ugdm9pZAorZ2Nvdl9yZWFkX3BtdV90b29sX2hlYWRlciAoZ2Nvdl9wbXVfdG9vbF9oZWFkZXJfdCAqdG9vbF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY292X3Vuc2lnbmVkX3QgbGVuKSBBVFRSSUJVVEVfSElEREVOOworI2lmbmRlZiBfX0dDT1ZfS0VSTkVMX18KK0dDT1ZfTElOS0FHRSBmbG9hdCBjb252ZXJ0X3Vuc2lnbmVkX3RvX3BjdCAoCisgICAgY29uc3QgdW5zaWduZWQgbnVtYmVyKSBBVFRSSUJVVEVfSElEREVOOworI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisjaWYgIUlOX0xJQkdDT1YgJiYgSU5fR0NPViAhPSAxCitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3JlYWRfbW9kdWxlX2luZm8gKHN0cnVjdCBnY292X21vZHVsZV9pbmZvICptb2RfaW5mbywKKwkJCQkJIGdjb3ZfdW5zaWduZWRfdCBsZW4pIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0Ugdm9pZCBwcmludF9sb2FkX2xhdGVuY3lfbGluZSAoRklMRSAqZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Nvdl9wbXVfbGxfaW5mb190ICpsbF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW0gcHJpbnRfbmV3bGluZSk7CitHQ09WX0xJTktBR0Ugdm9pZAorcHJpbnRfYnJhbmNoX21pc3ByZWRpY3RfbGluZSAoRklMRSAqZnAsIGNvbnN0IGdjb3ZfcG11X2JybV9pbmZvX3QgKmJybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBwcmludF9uZXdsaW5lKTsKK0dDT1ZfTElOS0FHRSB2b2lkIHByaW50X3BtdV90b29sX2hlYWRlciAoRklMRSAqZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3ZfcG11X3Rvb2xfaGVhZGVyX3QgKnRvb2xfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtIHByaW50X25ld2xpbmUpOworI2VuZGlmCisKKyNpZiBJTl9HQ09WICE9IDEKK0dDT1ZfTElOS0FHRSB2b2lkIGRlc3Ryb3lfcG11X3Rvb2xfaGVhZGVyIChnY292X3BtdV90b29sX2hlYWRlcl90ICp0b29sX2hlYWRlcikKKyAgQVRUUklCVVRFX0hJRERFTjsKKyNlbmRpZgorCisjaWYgSU5fTElCR0NPVgorLyogQXZhaWxhYmxlIG9ubHkgaW4gbGliZ2NvdiAqLworR0NPVl9MSU5LQUdFIHZvaWQgZ2Nvdl93cml0ZV9jb3VudGVyIChnY292X3R5cGUpIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3dyaXRlX3RhZ19sZW5ndGggKGdjb3ZfdW5zaWduZWRfdCwgZ2Nvdl91bnNpZ25lZF90KQorICAgIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3dyaXRlX3N1bW1hcnkgKGdjb3ZfdW5zaWduZWRfdCAvKnRhZyovLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBnY292X3N1bW1hcnkgKikKKyAgICBBVFRSSUJVVEVfSElEREVOOworCitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3dyaXRlX21vZHVsZV9pbmZvcyAoc3RydWN0IGdjb3ZfaW5mbyAqbW9kX2luZm8pCisgICAgQVRUUklCVVRFX0hJRERFTjsKK0dDT1ZfTElOS0FHRSBjb25zdCBzdHJ1Y3QgZHluX2ltcF9tb2QgKioKK2djb3ZfZ2V0X3NvcnRlZF9pbXBvcnRfbW9kdWxlX2FycmF5IChzdHJ1Y3QgZ2Nvdl9pbmZvICptb2RfaW5mbywgdW5zaWduZWQgKmxlbikKKyAgICBBVFRSSUJVVEVfSElEREVOOworc3RhdGljIHZvaWQgZ2Nvdl9yZXdyaXRlICh2b2lkKTsKK0dDT1ZfTElOS0FHRSB2b2lkIGdjb3Zfc2VlayAoZ2Nvdl9wb3NpdGlvbl90IC8qcG9zaXRpb24qLykgQVRUUklCVVRFX0hJRERFTjsKK0dDT1ZfTElOS0FHRSB2b2lkIGdjb3ZfdHJ1bmNhdGUgKHZvaWQpIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0UgZ2Nvdl91bnNpZ25lZF90IGdjb3Zfc3RyaW5nX2xlbmd0aCAoY29uc3QgY2hhciAqKSBBVFRSSUJVVEVfSElEREVOOworR0NPVl9MSU5LQUdFIHVuc2lnbmVkIGdjb3ZfZ2NkYV9maWxlX3NpemUgKHN0cnVjdCBnY292X2luZm8gKik7CisjZWxzZQorLyogQXZhaWxhYmxlIG91dHNpZGUgbGliZ2NvdiAqLworR0NPVl9MSU5LQUdFIHZvaWQgZ2Nvdl9zeW5jIChnY292X3Bvc2l0aW9uX3QgLypiYXNlKi8sCisJCQkgICAgIGdjb3ZfdW5zaWduZWRfdCAvKmxlbmd0aCAqLyk7CisjZW5kaWYKKworI2lmICFJTl9HQ09WCisvKiBBdmFpbGFibGUgb3V0c2lkZSBnY292ICovCitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3dyaXRlX3Vuc2lnbmVkIChnY292X3Vuc2lnbmVkX3QpIEFUVFJJQlVURV9ISURERU47CitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3dyaXRlX3N0cmluZyAoY29uc3QgY2hhciAqKSBBVFRSSUJVVEVfSElEREVOOworI2VuZGlmCisKKyNpZiAhSU5fR0NPViAmJiAhSU5fTElCR0NPVgorLyogQXZhaWxhYmxlIG9ubHkgaW4gY29tcGlsZXIgKi8KK0dDT1ZfTElOS0FHRSBnY292X3Bvc2l0aW9uX3QgZ2Nvdl93cml0ZV90YWcgKGdjb3ZfdW5zaWduZWRfdCk7CitHQ09WX0xJTktBR0Ugdm9pZCBnY292X3dyaXRlX2xlbmd0aCAoZ2Nvdl9wb3NpdGlvbl90IC8qcG9zaXRpb24qLyk7CisjZW5kaWYKKworI2lmIElOX0dDT1YgPiAwCisvKiBBdmFpbGFibGUgaW4gZ2NvdiAqLworR0NPVl9MSU5LQUdFIHRpbWVfdCBnY292X3RpbWUgKHZvaWQpOworI2VuZGlmCisKKy8qIFNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGdjb3YgZmlsZS4gICovCisKK3N0YXRpYyBpbmxpbmUgZ2Nvdl9wb3NpdGlvbl90CitnY292X3Bvc2l0aW9uICh2b2lkKQoreworICByZXR1cm4gZ2Nvdl92YXIuc3RhcnQgKyBnY292X3Zhci5vZmZzZXQ7Cit9CisKKy8qIFJldHVybiBub256ZXJvIGlmIHRoZSBlcnJvciBmbGFnIGlzIHNldC4gICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitnY292X2lzX2Vycm9yICh2b2lkKQoreworICByZXR1cm4gZ2Nvdl92YXIuZmlsZSA/IGdjb3ZfdmFyLmVycm9yIDogMTsKK30KKworI2lmIElOX0xJQkdDT1YKKy8qIE1vdmUgdG8gYmVnaW5uaW5nIG9mIGZpbGUgYW5kIGluaXRpYWxpemUgZm9yIHdyaXRpbmcuICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2djb3ZfcmV3cml0ZSAodm9pZCkKK3sKKyAgZ2NjX2Fzc2VydCAoZ2Nvdl92YXIubW9kZSA+IDApOworICBnY292X3Zhci5tb2RlID0gLTE7CisgIGdjb3ZfdmFyLnN0YXJ0ID0gMDsKKyAgZ2Nvdl92YXIub2Zmc2V0ID0gMDsKKyAgX0dDT1ZfZnNlZWsgKGdjb3ZfdmFyLmZpbGUsIDBMLCBTRUVLX1NFVCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIElOX0xJQkdDT1YgPj0gMCAqLworCisjZW5kaWYgLyogR0NDX0dDT1ZfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2djb3YtaW92LmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvZ2Nvdi1zcmMvZ2Nvdi1pb3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY0MWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2djb3YtaW92LmgKQEAgLTAsMCArMSw0IEBACisvKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgcHJvZ3JhbSBgYnVpbGQvZ2Nvdi1pb3YnCisgICBmcm9tIGA0LjYueC1nb29nbGUgKDQgNikgYW5kIHByZXJlbGVhc2UgKHApJy4gICovCisKKyNkZWZpbmUgR0NPVl9WRVJTSU9OICgoZ2Nvdl91bnNpZ25lZF90KTB4MzQzMDM2NzApICAvKiA0MDZwICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvZ2Nvdi1zcmMvbGliZ2Nvdi5jIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2xpYmdjb3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNjMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2djb3Ytc3JjL2xpYmdjb3YuYwpAQCAtMCwwICsxLDE5ODkgQEAKKy8qIFJvdXRpbmVzIHJlcXVpcmVkIGZvciBpbnN0cnVtZW50aW5nIGEgcHJvZ3JhbS4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgsIDIwMDksIDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBBc3N1bWUgY29tcGlsaW5nIGZvciBMaW51eCBLZXJuZWwgaWYgX19LRVJORUxfXyBpcyBkZWZpbmVkLiAgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisgLyogRGVmaW5lIE1BQ1JPcyB0byBiZSB1c2VkIGJ5IGtlcm5lbCBjb21waWxhdGlvbi4gICovCisjIGRlZmluZSBMX2djb3YKKyMgZGVmaW5lIExfZ2Nvdl9pbnRlcnZhbF9wcm9maWxlcgorIyBkZWZpbmUgTF9nY292X3BvdzJfcHJvZmlsZXIKKyMgZGVmaW5lIExfZ2Nvdl9vbmVfdmFsdWVfcHJvZmlsZXIKKyMgZGVmaW5lIExfZ2Nvdl9pbmRpcmVjdF9jYWxsX3Byb2ZpbGVyCisjIGRlZmluZSBMX2djb3ZfYXZlcmFnZV9wcm9maWxlcgorIyBkZWZpbmUgTF9nY292X2lvcl9wcm9maWxlcgorCisjIGRlZmluZSBIQVZFX0NDX1RMUyAwCisjIGRlZmluZSBfX0dDT1ZfS0VSTkVMX18KKworIyBkZWZpbmUgSU5fTElCR0NPViAxCisjIGRlZmluZSBJTl9HQ09WIDAKKyNlbHNlIC8qIF9fS0VSTkVMX18gKi8KKyNpbmNsdWRlICJ0Y29uZmlnLmgiCisjaW5jbHVkZSAidHN5c3RlbS5oIgorI2luY2x1ZGUgImNvcmV0eXBlcy5oIgorI2luY2x1ZGUgInRtLmgiCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjaWYgMQorI2RlZmluZSBUSFJFQURfUFJFRklYIF9fdGhyZWFkCisjZWxzZQorI2RlZmluZSBUSFJFQURfUFJFRklYCisjZW5kaWYKKworI2lmbmRlZiBfX0dDT1ZfS0VSTkVMX18KKyNpZiBkZWZpbmVkKGluaGliaXRfbGliYykKKyNkZWZpbmUgSU5fTElCR0NPViAoLTEpCisjZWxzZQorI3VuZGVmIE5VTEwgLyogQXZvaWQgZXJyb3JzIGlmIHN0ZGlvLmggYW5kIG91ciBzdGRkZWYuaCBtaXNtYXRjaC4gICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgSU5fTElCR0NPViAxCisjaWYgZGVmaW5lZChMX2djb3YpCisjZGVmaW5lIEdDT1ZfTElOS0FHRSAvKiBub3RoaW5nICovCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisjaW5jbHVkZSAiZ2Nvdi1pby5oIgorCisjaWYgZGVmaW5lZChpbmhpYml0X2xpYmMpCisvKiBJZiBsaWJjIGFuZCBpdHMgaGVhZGVyIGZpbGVzIGFyZSBub3QgYXZhaWxhYmxlLCBwcm92aWRlIGR1bW15IGZ1bmN0aW9ucy4gICovCisKKyNpZmRlZiBMX2djb3YKK3ZvaWQgX19nY292X2luaXQgKHN0cnVjdCBnY292X2luZm8gKnAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKSB7fQordm9pZCBfX2djb3ZfZmx1c2ggKHZvaWQpIHt9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9tZXJnZV9hZGQKK3ZvaWQgX19nY292X21lcmdlX2FkZCAoZ2Nvdl90eXBlICpjb3VudGVycyAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkgICAgICAgdW5zaWduZWQgbl9jb3VudGVycyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpIHt9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9tZXJnZV9zaW5nbGUKK3ZvaWQgX19nY292X21lcmdlX3NpbmdsZSAoZ2Nvdl90eXBlICpjb3VudGVycyAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJICB1bnNpZ25lZCBuX2NvdW50ZXJzIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkge30KKyNlbmRpZgorCisjaWZkZWYgTF9nY292X21lcmdlX2RlbHRhCit2b2lkIF9fZ2Nvdl9tZXJnZV9kZWx0YSAoZ2Nvdl90eXBlICpjb3VudGVycyAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorCQkJIHVuc2lnbmVkIG5fY291bnRlcnMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKSB7fQorI2VuZGlmCisKKyNlbHNlCisKKyNpZm5kZWYgX19HQ09WX0tFUk5FTF9fCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgR0NPVl9MT0NLRUQKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisjaWZkZWYgTF9nY292CisjaW5jbHVkZSAiZ2Nvdi1pby5jIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBvdXRwdXRpbmcgZXJyb3JzLiAgKi8KK3N0YXRpYyBpbnQKK2djb3ZfZXJyb3IgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICBpbnQgcmV0OworICB2YV9saXN0IGFyZ3A7CisgIHZhX3N0YXJ0IChhcmdwLCBmbXQpOworI2lmZGVmIF9fR0NPVl9LRVJORUxfXworICByZXQgPSB2cHJpbnRrIChmbXQsIGFyZ3ApOworI2Vsc2UKKyAgcmV0ID0gdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdwKTsKKyNlbmRpZgorICB2YV9lbmQgKGFyZ3ApOworICByZXR1cm4gcmV0OworfQorCisjaWZuZGVmIF9fR0NPVl9LRVJORUxfXworLyogRW1pdHRlZCBpbiBjb3ZlcmFnZS5jLiAgKi8KK2V4dGVybiBjaGFyICogX19nY292X3BtdV9wcm9maWxlX2ZpbGVuYW1lOworZXh0ZXJuIGNoYXIgKiBfX2djb3ZfcG11X3Byb2ZpbGVfb3B0aW9uczsKK2V4dGVybiBnY292X3Vuc2lnbmVkX3QgX19nY292X3BtdV90b3Bfbl9hZGRyZXNzOworCisvKiBTYW1wbGluZyByYXRlLiAgKi8KK2V4dGVybiBnY292X3Vuc2lnbmVkX3QgX19nY292X3NhbXBsaW5nX3JhdGU7CitzdGF0aWMgaW50IGdjb3Zfc2FtcGxpbmdfcmF0ZV9pbml0aWFsaXplZCA9IDA7Cit2b2lkIF9fZ2Nvdl9zZXRfc2FtcGxpbmdfcmF0ZSAodW5zaWduZWQgaW50IHJhdGUpOworCisvKiBTZXQgc2FtcGxpbmcgcmF0ZSB0byBSQVRFLiAgKi8KKwordm9pZCBfX2djb3Zfc2V0X3NhbXBsaW5nX3JhdGUgKHVuc2lnbmVkIGludCByYXRlKQoreworICBfX2djb3Zfc2FtcGxpbmdfcmF0ZSA9IHJhdGU7Cit9CisKKy8qIFBlciB0aHJlYWQgc2FtcGxlIGNvdW50ZXIuICAqLworVEhSRUFEX1BSRUZJWCBnY292X3Vuc2lnbmVkX3QgX19nY292X3NhbXBsZV9jb3VudGVyID0gMDsKKworLyogQ2hhaW4gb2YgcGVyLW9iamVjdCBnY292IHN0cnVjdHVyZXMuICAqLworZXh0ZXJuIHN0cnVjdCBnY292X2luZm8gKl9fZ2Nvdl9saXN0OworCisvKiBTaXplIG9mIHRoZSBsb25nZXN0IGZpbGUgbmFtZS4gKi8KK3N0YXRpYyBzaXplX3QgZ2Nvdl9tYXhfZmlsZW5hbWUgPSAwOworI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisvKiBVbmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBlYWNoIG1vZHVsZSAob2JqZWN0IGZpbGUpLiAgKi8KK3N0YXRpYyBnY292X3Vuc2lnbmVkX3QgZ2Nvdl9jdXJfbW9kdWxlX2lkID0gMDsKKworLyogUG9pbnRlciB0byB0aGUgZGlyZWN0LWNhbGwgY291bnRlcnMgKHBlciBjYWxsLXNpdGUgY291bnRlcnMpLgorICAgSW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlci4gICovCitUSFJFQURfUFJFRklYIGdjb3ZfdHlwZSAqX19nY292X2RpcmVjdF9jYWxsX2NvdW50ZXJzIEFUVFJJQlVURV9ISURERU47CisKKy8qIERpcmVjdCBjYWxsIGNhbGxlZSBhZGRyZXNzLiAgKi8KK1RIUkVBRF9QUkVGSVggdm9pZCAqX19nY292X2RpcmVjdF9jYWxsX2NhbGxlZSBBVFRSSUJVVEVfSElEREVOOworCisvKiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdC1jYWxsIGNvdW50ZXJzIChwZXIgY2FsbC1zaXRlIGNvdW50ZXJzKS4KKyAgIEluaXRpYWxpemVkIGJ5IHRoZSBjYWxsZXIuICAqLworVEhSRUFEX1BSRUZJWCBnY292X3R5cGUgKl9fZ2Nvdl9pbmRpcmVjdF9jYWxsX3RvcG5fY291bnRlcnMgQVRUUklCVVRFX0hJRERFTjsKKworLyogSW5kaXJlY3QgY2FsbCBjYWxsZWUgYWRkcmVzcy4gICovCitUSFJFQURfUFJFRklYIHZvaWQgKl9fZ2Nvdl9pbmRpcmVjdF9jYWxsX3RvcG5fY2FsbGVlIEFUVFJJQlVURV9ISURERU47CisKKy8qIEEgcHJvZ3JhbSBjaGVja3N1bSBhbGxvd3MgdXMgdG8gZGlzdGluZ3Vpc2ggcHJvZ3JhbSBkYXRhIGZvciBhbgorICAgb2JqZWN0IGZpbGUgaW5jbHVkZWQgaW4gbXVsdGlwbGUgcHJvZ3JhbXMuICAqLworc3RhdGljIGdjb3ZfdW5zaWduZWRfdCBnY292X2NyYzMyOworCisvKiBEeW5hbWljIGNhbGwgZ3JhcGggYnVpbGQgYW5kIGZvcm0gbW9kdWxlIGdyb3Vwcy4gICovCit2b2lkIF9fZ2Nvdl9jb21wdXRlX21vZHVsZV9ncm91cHMgKHZvaWQpIEFUVFJJQlVURV9ISURERU47Cit2b2lkIF9fZ2Nvdl9maW5hbGl6ZV9keW5fY2FsbGdyYXBoICh2b2lkKSBBVFRSSUJVVEVfSElEREVOOworCisvKiBQcm9maWxlIHN1bW1hcnkgZm9yIHRoZSBnZGNhIGZpbGUsIHVzZWQgaW4gc2FuaXR5IGNoZWNrPyAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Nvdl9zdW1tYXJ5IGFsbDsKKworLyogUHJvZmlsZSBzdW1tYXJ5IGZvciB0aGlzIHByb2dyYW0gaW4gY3VycmVudCBleGV1Y3Rpb24uICAqLworc3RhdGljIHN0cnVjdCBnY292X3N1bW1hcnkgdGhpc19wcm9ncmFtOworCisvKiBQcm9maWxlIHN1bW1hcnkgZm9yIHRoaXMgb2JqZWN0IGluIGN1cnJlbnQgZXhlY3VjdGlvbi4gICovCitzdGF0aWMgc3RydWN0IGdjb3Zfc3VtbWFyeSB0aGlzX29iamVjdDsKKworLyogTWVyZ2VkIHByb2ZpbGUgc3VtbWFyeSBmb3IgdGhpcyBwcm9ncmFtLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Nvdl9zdW1tYXJ5IHByb2dyYW07CisKKy8qIE1lcmdlZCBwcm9maWxlIHN1bW1hcnkgZm9yIHRoaXMgb2JqZWN0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Nvdl9zdW1tYXJ5IG9iamVjdDsKKworLyogUmVjb3JkIHRoZSBwb3NpdGlvbiBvZiBzdW1tYXJ5IGluZm8uICAqLworc3RhdGljIGdjb3ZfcG9zaXRpb25fdCBzdW1tYXJ5X3BvcyA9IDA7CisKKy8qIFJlY29yZCB0aGUgcG9zdGlvbiBvZiBlb2YuICAqLworc3RhdGljIGdjb3ZfcG9zaXRpb25fdCBlb2ZfcG9zID0gMDsKKworLyogTnVtYmVyIG9mIGNoYXJzIGluIHByZWZpeCB0byBiZSBzdHJpcHBlZC4gICovCitzdGF0aWMgaW50IGdjb3ZfcHJlZml4X3N0cmlwID0gMDsKKworLyogVGhlIGxlbmd0aCBvZiBwYXRoIHByZWZpeC4gICovCitzdGF0aWMgc2l6ZV90IHByZWZpeF9sZW5ndGggPSAwOworCisvKiBnaV9maWxlbmFtZSBpcyBjdXJyZW50IG9iamVjdCBmaWxlbmFtZS4KKyAgIGdpX2ZpbGVuYW1lX3VwIHBvaW50cyB0byB0aGUgc3RyaXBwZWQgZmlsZW5hbWUuICAqLworc3RhdGljIGNoYXIgKmdpX2ZpbGVuYW1lLCAqZ2lfZmlsZW5hbWVfdXA7CisKK3N0YXRpYyBpbnQgZ2Nvdl9vcGVuX2J5X2ZpbGVuYW1lIChjaGFyICogZ2lfZmlsZW5hbWUpOworc3RhdGljIGludCBnY292X2V4aXRfaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBnY292X2R1bXBfb25lX2djb3YgKHN0cnVjdCBnY292X2luZm8gKmdpX3B0cik7CisKKy8qIE1ha2Ugc3VyZSBwYXRoIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gRklMRU5BTUUgZXhpc3RzLCBjcmVhdGUKKyAgIG1pc3NpbmcgZGlyZWN0b3JpZXMuIEZJTEVOQU1FIG11c3QgYmUgd3JpdGFibGUuCisgICBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuICAqLworCitzdGF0aWMgaW50CitjcmVhdGVfZmlsZV9kaXJlY3RvcnkgKGNoYXIgKmZpbGVuYW1lKQoreworI2lmICFkZWZpbmVkKFRBUkdFVF9QT1NJWF9JTykgJiYgIWRlZmluZWQoX1dJTjMyKQorICAodm9pZCkgZmlsZW5hbWU7CisgIHJldHVybiAtMTsKKyNlbHNlCisgIGNoYXIgKnM7CisKKyAgcyA9IGZpbGVuYW1lOworCisgIGlmIChIQVNfRFJJVkVfU1BFQyhzKSkKKyAgICBzICs9IDI7CisgIGlmIChJU19ESVJfU0VQQVJBVE9SKCpzKSkKKyAgICArK3M7CisgIGZvciAoOyAqcyAhPSAnXDAnOyBzKyspCisgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IoKnMpKQorICAgICAgeworICAgICAgICBjaGFyIHNlcCA9ICpzOworCSpzICA9ICdcMCc7CisKKyAgICAgICAgLyogVHJ5IHRvIG1ha2UgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gICovCisgICAgICAgIGlmIChhY2Nlc3MgKGZpbGVuYW1lLCBGX09LKSA9PSAtMQorI2lmZGVmIFRBUkdFVF9QT1NJWF9JTworICAgICAgICAgICAgJiYgbWtkaXIgKGZpbGVuYW1lLCAwNzU1KSA9PSAtMQorI2Vsc2UKKyAgICAgICAgICAgICYmIG1rZGlyIChmaWxlbmFtZSkgPT0gLTEKKyNlbmRpZgorICAgICAgICAgICAgLyogVGhlIGRpcmVjdG9yeSBtaWdodCBoYXZlIGJlZW4gbWFkZSBieSBhbm90aGVyIHByb2Nlc3MuICAqLworCSAgICAmJiBlcnJubyAhPSBFRVhJU1QpCisJICB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcm9maWxpbmc6JXM6Q2Fubm90IGNyZWF0ZSBkaXJlY3RvcnlcbiIsCisJCSAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgKnMgPSBzZXA7CisJICAgIHJldHVybiAtMTsKKwkgIH07CisKKwkqcyA9IHNlcDsKKyAgICAgIH07CisgIHJldHVybiAwOworI2VuZGlmCit9CisKKy8qIE9wZW4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiAgKi8KKworc3RhdGljIGludAorZ2Nvdl9vcGVuX2J5X2ZpbGVuYW1lIChjaGFyICogZ2lfZmlsZW5hbWUpCit7CisgIGlmICghZ2Nvdl9vcGVuIChnaV9maWxlbmFtZSkpCisgICAgeworICAgICAgLyogT3BlbiBmYWlsZWQgbGlrZWx5IGR1ZSB0byBtaXNzZWQgZGlyZWN0b3J5LgorICAgICAgICAgQ3JlYXRlIGRpcmVjdG9yeSBhbmQgcmV0cnkgdG8gb3BlbiBmaWxlLiAgKi8KKyAgICAgIGlmIChjcmVhdGVfZmlsZV9kaXJlY3RvcnkgKGdpX2ZpbGVuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGdjb3ZfZXJyb3IgKCJwcm9maWxpbmc6JXM6U2tpcFxuIiwgZ2lfZmlsZW5hbWUpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgaWYgKCFnY292X29wZW4gKGdpX2ZpbGVuYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIGdjb3ZfZXJyb3IgKCJwcm9maWxpbmc6JXM6Q2Fubm90IG9wZW5cbiIsIGdpX2ZpbGVuYW1lKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiAwOworfQorCisKKy8qIERldGVybWluZSB3aGV0aGVyIGEgY291bnRlciBpcyBhY3RpdmUuICAqLworCitzdGF0aWMgaW5saW5lIGludAorZ2Nvdl9jb3VudGVyX2FjdGl2ZSAoY29uc3Qgc3RydWN0IGdjb3ZfaW5mbyAqaW5mbywgdW5zaWduZWQgaW50IHR5cGUpCit7CisgIHJldHVybiAoMSA8PCB0eXBlKSAmIGluZm8tPmN0cl9tYXNrOworfQorCisjaWZuZGVmIF9fR0NPVl9LRVJORUxfXworLyogQ2hlY2sgaWYgVkVSU0lPTiBvZiB0aGUgaW5mbyBibG9jayBQVFIgbWF0Y2hlcyBsaWJnY292IG9uZS4KKyAgIFJldHVybiAxIG9uIHN1Y2Nlc3MsIG9yIHplcm8gaW4gY2FzZSBvZiB2ZXJzaW9ucyBtaXNtYXRjaC4KKyAgIElmIEZJTEVOQU1FIGlzIG5vdCBOVUxMLCBpdHMgdmFsdWUgdXNlZCBmb3IgcmVwb3J0aW5nIHB1cnBvc2VzCisgICBpbnN0ZWFkIG9mIHZhbHVlIGZyb20gdGhlIGluZm8gYmxvY2suICAqLworCitzdGF0aWMgaW50CitnY292X3ZlcnNpb24gKHN0cnVjdCBnY292X2luZm8gKnB0ciBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIAorICAgICAgICAgICAgICBnY292X3Vuc2lnbmVkX3QgdmVyc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGlmICh2ZXJzaW9uICE9IEdDT1ZfVkVSU0lPTikKKyAgICB7CisgICAgICBjaGFyIHZbNF0sIGVbNF07CisKKyAgICAgIEdDT1ZfVU5TSUdORUQyU1RSSU5HICh2LCB2ZXJzaW9uKTsKKyAgICAgIEdDT1ZfVU5TSUdORUQyU1RSSU5HIChlLCBHQ09WX1ZFUlNJT04pOworCisgICAgICBpZiAoZmlsZW5hbWUpCisgICAgICAgIGdjb3ZfZXJyb3IgKCJwcm9maWxpbmc6JXM6VmVyc2lvbiBtaXNtYXRjaCAtIGV4cGVjdGVkICUuNHMgZ290ICUuNHNcbiIsCisgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGUsIHYpOworICAgICAgZWxzZQorICAgICAgICBnY292X2Vycm9yICgicHJvZmlsaW5nOlZlcnNpb24gbWlzbWF0Y2ggLSBleHBlY3RlZCAlLjRzIGdvdCAlLjRzXG4iLCBlLCB2KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgR0NPVl9HRVRfRklMRU5BTUUgZ2Nvdl9zdHJpcF9sZWFkaW5nX2RpcnMKKworLyogU3RyaXAgR0NPVl9QUkVGSVhfU1RSSVAgbGV2ZWxzIG9mIGxlYWRpbmcgJy8nIGZyb20gRklMRU5BTUUgYW5kCisgICBwdXQgdGhlIHJlc3VsdCBpbnRvIEdJX0ZJTEVOQU1FX1VQLiAgKi8KKworc3RhdGljIHZvaWQKK2djb3Zfc3RyaXBfbGVhZGluZ19kaXJzIChpbnQgcHJlZml4X2xlbmd0aCwgaW50IGdjb3ZfcHJlZml4X3N0cmlwLAorCQkJIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpnaV9maWxlbmFtZV91cCkKK3sKKyAgLyogQXZvaWQgdG8gYWRkIG11bHRpcGxlIGRyaXZlIGxldHRlcnMgaW50byBjb21iaW5lZCBwYXRoLiAgKi8KKyAgaWYgKHByZWZpeF9sZW5ndGggIT0gMCAmJiBIQVNfRFJJVkVfU1BFQyhmaWxlbmFtZSkpCisgICAgZmlsZW5hbWUgKz0gMjsKKworICAvKiBCdWlsZCByZWxvY2F0ZWQgZmlsZW5hbWUsIHN0cmlwcGluZyBvZmYgbGVhZGluZworICAgICBkaXJlY3RvcmllcyBmcm9tIHRoZSBpbml0aWFsIGZpbGVuYW1lIGlmIHJlcXVlc3RlZC4gKi8KKyAgaWYgKGdjb3ZfcHJlZml4X3N0cmlwID4gMCkKKyAgICB7CisgICAgICBpbnQgbGV2ZWwgPSAwOworICAgICAgY29uc3QgY2hhciAqcyA9IGZpbGVuYW1lOworICAgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IoKnMpKQorCSsrczsKKworICAgICAgLyogU2tpcCBzZWxlY3RlZCBkaXJlY3RvcnkgbGV2ZWxzLiAqLworICAgICAgZm9yICg7ICgqcyAhPSAnXDAnKSAmJiAobGV2ZWwgPCBnY292X3ByZWZpeF9zdHJpcCk7IHMrKykKKyAgICAgICAgaWYgKElTX0RJUl9TRVBBUkFUT1IoKnMpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gczsKKyAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgfQorICAgIH0KKyAgLyogVXBkYXRlIGNvbXBsZXRlIGZpbGVuYW1lIHdpdGggc3RyaXBwZWQgb3JpZ2luYWwuICovCisgIGlmIChwcmVmaXhfbGVuZ3RoICE9IDAgJiYgIUlTX0RJUl9TRVBBUkFUT1IgKCpmaWxlbmFtZSkpCisgICAgeworICAgICAgLyogSWYgcHJlZml4IGlzIGdpdmVuLCBhZGQgZGlyZWN0b3J5IHNlcGFyYXRvci4gICovCisgICAgICBzdHJjcHkgKGdpX2ZpbGVuYW1lX3VwLCAiLyIpOworICAgICAgc3RyY3B5IChnaV9maWxlbmFtZV91cCArIDEsIGZpbGVuYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICBzdHJjcHkgKGdpX2ZpbGVuYW1lX3VwLCBmaWxlbmFtZSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBzcGFjZSB0byBzdG9yZSBjdXJyZW50IGZpbGUgbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCitnY292X2FsbG9jX2ZpbGVuYW1lICh2b2lkKQoreworICAvKiBHZXQgZmlsZSBuYW1lIHJlbG9jYXRpb24gcHJlZml4LiAgTm9uLWFic29sdXRlIHZhbHVlcyBhcmUgaWdub3JlZC4gICovCisgIGNoYXIgKmdjb3ZfcHJlZml4ID0gMDsKKworICBwcmVmaXhfbGVuZ3RoID0gMDsKKyAgZ2Nvdl9wcmVmaXhfc3RyaXAgPSAwOworCisgIHsKKyAgICAvKiBDaGVjayBpZiB0aGUgbGV2ZWwgb2YgZGlycyB0byBzdHJpcCBvZmYgc3BlY2lmaWVkLiAqLworICAgIGNoYXIgKnRtcCA9IGdldGVudiAoIkdDT1ZfUFJFRklYX1NUUklQIik7CisgICAgaWYgKHRtcCkKKyAgICAgIHsKKyAgICAgICAgZ2Nvdl9wcmVmaXhfc3RyaXAgPSBhdG9pICh0bXApOworICAgICAgICAvKiBEbyBub3QgY29uc2lkZXIgbmVnYXRpdmUgdmFsdWVzLiAqLworICAgICAgICBpZiAoZ2Nvdl9wcmVmaXhfc3RyaXAgPCAwKQorICAgICAgICAgIGdjb3ZfcHJlZml4X3N0cmlwID0gMDsKKyAgICAgIH0KKyAgfQorICAvKiBHZXQgZmlsZSBuYW1lIHJlbG9jYXRpb24gcHJlZml4LiAgTm9uLWFic29sdXRlIHZhbHVlcyBhcmUgaWdub3JlZC4gKi8KKyAgZ2Nvdl9wcmVmaXggPSBnZXRlbnYgKCJHQ09WX1BSRUZJWCIpOworICBpZiAoZ2Nvdl9wcmVmaXgpCisgICAgeworICAgICAgcHJlZml4X2xlbmd0aCA9IHN0cmxlbihnY292X3ByZWZpeCk7CisKKyAgICAgIC8qIFJlbW92ZSBhbiB1bm5lY2Vzc2FyeSB0cmFpbGluZyAnLycgKi8KKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SIChnY292X3ByZWZpeFtwcmVmaXhfbGVuZ3RoIC0gMV0pKQorICAgICAgICBwcmVmaXhfbGVuZ3RoLS07CisgICAgfQorICBlbHNlCisgICAgcHJlZml4X2xlbmd0aCA9IDA7CisKKyAgLyogSWYgbm8gcHJlZml4IHdhcyBzcGVjaWZpZWQgYW5kIGEgcHJlZml4IHN0aXAsIHRoZW4gd2UgYXNzdW1lCisgICAgIHJlbGF0aXZlLiAgKi8KKyAgaWYgKGdjb3ZfcHJlZml4X3N0cmlwICE9IDAgJiYgcHJlZml4X2xlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgIGdjb3ZfcHJlZml4ID0gIi4iOworICAgICAgcHJlZml4X2xlbmd0aCA9IDE7CisgICAgfQorCisgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBmaWxlbmFtZSBzY3JhdGNoIHNwYWNlLiAgKi8KKyAgZ2lfZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHByZWZpeF9sZW5ndGggKyBnY292X21heF9maWxlbmFtZSArIDIpOworICBpZiAocHJlZml4X2xlbmd0aCkKKyAgICBtZW1jcHkgKGdpX2ZpbGVuYW1lLCBnY292X3ByZWZpeCwgcHJlZml4X2xlbmd0aCk7CisKKyAgZ2lfZmlsZW5hbWVfdXAgPSBnaV9maWxlbmFtZSArIHByZWZpeF9sZW5ndGg7Cit9CisKKy8qIFN0b3AgdGhlIHBtdSBwcm9maWxlciBhbmQgZHVtcCBwbXUgcHJvZmlsZSBpbmZvIGludG8gdGhlIGdsb2JhbCBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK3BtdV9wcm9maWxlX3N0b3AgKHZvaWQpCit7CisgIGNvbnN0IGNoYXIgKnBtdV9wcm9maWxlX2ZpbGVuYW1lID0gIF9fZ2Nvdl9wbXVfcHJvZmlsZV9maWxlbmFtZTsKKyAgY29uc3QgY2hhciAqcG11X29wdGlvbnMgPSBfX2djb3ZfcG11X3Byb2ZpbGVfb3B0aW9uczsKKyAgc2l6ZV90IGZpbGVuYW1lX2xlbmd0aDsKKyAgaW50IGdjZGFfZXJyb3I7CisKKyAgaWYgKCFwbXVfcHJvZmlsZV9maWxlbmFtZSB8fCAhcG11X29wdGlvbnMpCisgICAgcmV0dXJuOworCisgIF9fZ2Nvdl9zdG9wX3BtdV9wcm9maWxlciAoKTsKKworICBmaWxlbmFtZV9sZW5ndGggPSBzdHJsZW4gKHBtdV9wcm9maWxlX2ZpbGVuYW1lKTsKKyAgaWYgKGZpbGVuYW1lX2xlbmd0aCA+IGdjb3ZfbWF4X2ZpbGVuYW1lKQorICAgIGdjb3ZfbWF4X2ZpbGVuYW1lID0gZmlsZW5hbWVfbGVuZ3RoOworICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZmlsZW5hbWUgc2NyYXRjaCBzcGFjZS4gICovCisgIGdjb3ZfYWxsb2NfZmlsZW5hbWUgKCk7CisgIEdDT1ZfR0VUX0ZJTEVOQU1FIChwcmVmaXhfbGVuZ3RoLCBnY292X3ByZWZpeF9zdHJpcCwgcG11X3Byb2ZpbGVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBnaV9maWxlbmFtZV91cCk7CisgIC8qIE9wZW4gdGhlIGdjZGEgZmlsZSBmb3Igd3JpdGluZy4gV2UgZG9uJ3Qgc3VwcG9ydCBtZXJnZSB5ZXQuICAqLworICBnY2RhX2Vycm9yID0gZ2Nvdl9vcGVuX2J5X2ZpbGVuYW1lIChnaV9maWxlbmFtZSk7CisgIF9fZ2Nvdl9lbmRfcG11X3Byb2ZpbGVyIChnY2RhX2Vycm9yKTsKKyAgaWYgKChnY2RhX2Vycm9yID0gZ2Nvdl9jbG9zZSAoKSkpCisgICAgZ2Nvdl9lcnJvciAoZ2NkYV9lcnJvciAgPCAwID8gICJwbXVfcHJvZmlsZV9zdG9wOiVzOk92ZXJmbG93IHdyaXRpbmdcbiIgOgorICAgICAgICAgICAgICAgICJwbXVfcHJvZmlsZV9zdG9wOiVzOkVycm9yIHdyaXRpbmdcbiIsCisgICAgICAgICAgICAgICAgZ2lfZmlsZW5hbWUpOworfQorCisvKiBTb3J0IE4gZW50cmllcyBpbiBWQUxVRV9BUlJBWSBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICAgRWFjaCBlbnRyeSBpbiBWQUxVRV9BUlJBWSBoYXMgdHdvIHZhbHVlcy4gVGhlIHNvcnRpbmcKKyAgIGlzIGJhc2VkIG9uIHRoZSBzZWNvbmQgdmFsdWUuICAqLworCitHQ09WX0xJTktBR0UgIHZvaWQKK2djb3Zfc29ydF9uX3ZhbHMgKGdjb3ZfdHlwZSAqdmFsdWVfYXJyYXksIGludCBuKQoreworICBpbnQgaiwgazsKKyAgZm9yIChqID0gMjsgaiA8IG47IGogKz0gMikKKyAgICB7CisgICAgICBnY292X3R5cGUgY3VyX2VudFsyXTsKKyAgICAgIGN1cl9lbnRbMF0gPSB2YWx1ZV9hcnJheVtqXTsKKyAgICAgIGN1cl9lbnRbMV0gPSB2YWx1ZV9hcnJheVtqICsgMV07CisgICAgICBrID0gaiAtIDI7CisgICAgICB3aGlsZSAoayA+PSAwICYmIHZhbHVlX2FycmF5W2sgKyAxXSA8IGN1cl9lbnRbMV0pCisgICAgICAgIHsKKyAgICAgICAgICB2YWx1ZV9hcnJheVtrICsgMl0gPSB2YWx1ZV9hcnJheVtrXTsKKyAgICAgICAgICB2YWx1ZV9hcnJheVtrICsgM10gPSB2YWx1ZV9hcnJheVtrKzFdOworICAgICAgICAgIGsgLT0gMjsKKyAgICAgICAgfQorICAgICAgdmFsdWVfYXJyYXlbayArIDJdID0gY3VyX2VudFswXTsKKyAgICAgIHZhbHVlX2FycmF5W2sgKyAzXSA9IGN1cl9lbnRbMV07CisgICAgfQorfQorCisvKiBTb3J0IHRoZSBwcm9maWxlIGNvdW50ZXJzIGZvciBhbGwgaW5kaXJlY3QgY2FsbCBzaXRlcy4gQ291bnRlcnMKKyAgIGZvciBlYWNoIGNhbGwgc2l0ZSBhcmUgYWxsb2NhdGVkIGluIGFycmF5IENPVU5URVJTLiAgKi8KKworc3RhdGljIHZvaWQKK2djb3Zfc29ydF9pY2FsbF90b3BuX2NvdW50ZXIgKGNvbnN0IHN0cnVjdCBnY292X2N0cl9pbmZvICpjb3VudGVycykKK3sKKyAgaW50IGk7CisgIGdjb3ZfdHlwZSAqdmFsdWVzOworICBpbnQgbiA9IGNvdW50ZXJzLT5udW07CisgIGdjY19hc3NlcnQgKCEobiAlIEdDT1ZfSUNBTExfVE9QTl9OQ09VTlRTKSk7CisKKyAgdmFsdWVzID0gY291bnRlcnMtPnZhbHVlczsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArPSBHQ09WX0lDQUxMX1RPUE5fTkNPVU5UUykKKyAgICB7CisgICAgICBnY292X3R5cGUgKnZhbHVlX2FycmF5ID0gJnZhbHVlc1tpICsgMV07CisgICAgICBnY292X3NvcnRfbl92YWxzICh2YWx1ZV9hcnJheSwgR0NPVl9JQ0FMTF9UT1BOX05DT1VOVFMgLSAxKTsKKyAgICB9Cit9CisKKy8qIFdyaXRlIGltcG9ydGVkIGZpbGVzIChhdXhpbGlhcnkgbW9kdWxlcykgZm9yIHByaW1hcnkgbW9kdWxlIEdJX1BUUgorICAgaW50byBmaWxlIEdJX0ZJTEVOQU1FLiAgKi8KKworc3RhdGljIHZvaWQKK2djb3Zfd3JpdGVfaW1wb3J0X2ZpbGUgKGNoYXIgKmdpX2ZpbGVuYW1lLCBzdHJ1Y3QgZ2Nvdl9pbmZvICpnaV9wdHIpCit7CisgIGNoYXIgICpnaV9pbXBvcnRzX2ZpbGVuYW1lOworICBjb25zdCBjaGFyICpnY292X3N1ZmZpeDsKKyAgRklMRSAqaW1wb3J0c19maWxlOworICBzaXplX3QgcHJlZml4X2xlbmd0aCwgc3VmZml4X2xlbmd0aDsKKworICBnY292X3N1ZmZpeCA9IGdldGVudiAoIkdDT1ZfSU1QT1JUU19TVUZGSVgiKTsKKyAgaWYgKCFnY292X3N1ZmZpeCB8fCAhc3RybGVuIChnY292X3N1ZmZpeCkpCisgICAgZ2Nvdl9zdWZmaXggPSAiLmltcG9ydHMiOworICBzdWZmaXhfbGVuZ3RoID0gc3RybGVuIChnY292X3N1ZmZpeCk7CisgIHByZWZpeF9sZW5ndGggPSBzdHJsZW4gKGdpX2ZpbGVuYW1lKTsKKyAgZ2lfaW1wb3J0c19maWxlbmFtZSA9IChjaGFyICopIGFsbG9jYSAocHJlZml4X2xlbmd0aCArIHN1ZmZpeF9sZW5ndGggKyAxKTsKKyAgbWVtc2V0IChnaV9pbXBvcnRzX2ZpbGVuYW1lLCAwLCBwcmVmaXhfbGVuZ3RoICsgc3VmZml4X2xlbmd0aCArIDEpOworICBtZW1jcHkgKGdpX2ltcG9ydHNfZmlsZW5hbWUsIGdpX2ZpbGVuYW1lLCBwcmVmaXhfbGVuZ3RoKTsKKyAgbWVtY3B5IChnaV9pbXBvcnRzX2ZpbGVuYW1lICsgcHJlZml4X2xlbmd0aCwgZ2Nvdl9zdWZmaXgsIHN1ZmZpeF9sZW5ndGgpOworICBpbXBvcnRzX2ZpbGUgPSBmb3BlbiAoZ2lfaW1wb3J0c19maWxlbmFtZSwgInciKTsKKyAgaWYgKGltcG9ydHNfZmlsZSkKKyAgICB7CisgICAgICBjb25zdCBzdHJ1Y3QgZHluX2ltcF9tb2QgKippbXBfbW9kczsKKyAgICAgIHVuc2lnbmVkIGksIGltcF9sZW47CisgICAgICBpbXBfbW9kcyA9IGdjb3ZfZ2V0X3NvcnRlZF9pbXBvcnRfbW9kdWxlX2FycmF5IChnaV9wdHIsICZpbXBfbGVuKTsKKyAgICAgIGlmIChpbXBfbW9kcykKKyAgICAgICAgeworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbXBfbGVuOyBpKyspCisJICAgIHsKKwkgICAgICBmcHJpbnRmIChpbXBvcnRzX2ZpbGUsICIlc1xuIiwKKwkJICAgICAgIGltcF9tb2RzW2ldLT5pbXBfbW9kLT5tb2RfaW5mby0+c291cmNlX2ZpbGVuYW1lKTsKKwkgICAgICBmcHJpbnRmIChpbXBvcnRzX2ZpbGUsICIlcyVzXG4iLAorCQkgICAgICAgaW1wX21vZHNbaV0tPmltcF9tb2QtPm1vZF9pbmZvLT5kYV9maWxlbmFtZSwgR0NPVl9EQVRBX1NVRkZJWCk7CisJICAgIH0KKyAgICAgICAgICBmcmVlIChpbXBfbW9kcyk7CisgICAgICAgIH0KKyAgICAgIGZjbG9zZSAoaW1wb3J0c19maWxlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitnY292X2R1bXBfbW9kdWxlX2luZm8gKHZvaWQpCit7CisgIHN0cnVjdCBnY292X2luZm8gKmdpX3B0cjsKKworICBfX2djb3ZfY29tcHV0ZV9tb2R1bGVfZ3JvdXBzICgpOworCisgIC8qIE5vdyB3cml0ZSBvdXQgbW9kdWxlIGdyb3VwIGluZm8uICAqLworICBmb3IgKGdpX3B0ciA9IF9fZ2Nvdl9saXN0OyBnaV9wdHI7IGdpX3B0ciA9IGdpX3B0ci0+bmV4dCkKKyAgeworICAgIGludCBlcnJvcjsKKworICAgIEdDT1ZfR0VUX0ZJTEVOQU1FIChwcmVmaXhfbGVuZ3RoLCBnY292X3ByZWZpeF9zdHJpcCwgZ2lfcHRyLT5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2lfZmlsZW5hbWVfdXApOworICAgIGVycm9yID0gZ2Nvdl9vcGVuX2J5X2ZpbGVuYW1lIChnaV9maWxlbmFtZSk7CisgICAgaWYgKGVycm9yICE9IDApCisgICAgICBjb250aW51ZTsKKworICAgIC8qIE92ZXJ3cml0ZSB0aGUgemVybyB3b3JkIGF0IHRoZSBvZiB0aGUgZmlsZS4gICovCisgICAgZ2Nvdl9yZXdyaXRlICgpOworICAgIGdjb3Zfc2VlayAoZ2lfcHRyLT5lb2ZfcG9zKTsKKworICAgIGdjb3Zfd3JpdGVfbW9kdWxlX2luZm9zIChnaV9wdHIpOworICAgIGdjb3ZfdHJ1bmNhdGUgKCk7CisKKyAgICBpZiAoKGVycm9yID0gZ2Nvdl9jbG9zZSAoKSkpCisgICAgICAgICBnY292X2Vycm9yIChlcnJvciAgPCAwID8gICJwcm9maWxpbmc6JXM6T3ZlcmZsb3cgd3JpdGluZ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9maWxpbmc6JXM6RXJyb3Igd3JpdGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lfZmlsZW5hbWUpOworICAgIGdjb3Zfd3JpdGVfaW1wb3J0X2ZpbGUgKGdpX2ZpbGVuYW1lLCBnaV9wdHIpOworICB9CisgIF9fZ2Nvdl9maW5hbGl6ZV9keW5fY2FsbGdyYXBoICgpOworfQorCisvKiBEdW1wIHRoZSBjb3ZlcmFnZSBjb3VudHMuIFdlIG1lcmdlIHdpdGggZXhpc3RpbmcgY291bnRzIHdoZW4KKyAgIHBvc3NpYmxlLCB0byBhdm9pZCBncm93aW5nIHRoZSAuZGEgZmlsZXMgYWQgaW5maW5pdHVtLiBXZSB1c2UgdGhpcworICAgcHJvZ3JhbSdzIGNoZWNrc3VtIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IGFjY3VtdWxhdGUgd2hvbGUgcHJvZ3JhbQorICAgc3RhdGlzdGljcyB0byB0aGUgY29ycmVjdCBzdW1tYXJ5LiBBbiBvYmplY3QgZmlsZSBtaWdodCBiZSBlbWJlZGRlZAorICAgaW4gdHdvIHNlcGFyYXRlIHByb2dyYW1zLCBhbmQgd2UgbXVzdCBrZWVwIHRoZSB0d28gcHJvZ3JhbQorICAgc3VtbWFyaWVzIHNlcGFyYXRlLiAgKi8KKworc3RhdGljIHZvaWQKK2djb3ZfZXhpdCAodm9pZCkKK3sKKyAgc3RydWN0IGdjb3ZfaW5mbyAqZ2lfcHRyOworICBpbnQgZHVtcF9tb2R1bGVfaW5mbzsKKworICAvKiBTdG9wIGFuZCB3cml0ZSB0aGUgUE1VIHByb2ZpbGUgZGF0YSBpbnRvIHRoZSBnbG9iYWwgZmlsZS4gICovCisgIHBtdV9wcm9maWxlX3N0b3AgKCk7CisKKyAgZHVtcF9tb2R1bGVfaW5mbyA9IGdjb3ZfZXhpdF9pbml0ICgpOworCisgIGZvciAoZ2lfcHRyID0gX19nY292X2xpc3Q7IGdpX3B0cjsgZ2lfcHRyID0gZ2lfcHRyLT5uZXh0KQorICAgIGdjb3ZfZHVtcF9vbmVfZ2NvdiAoZ2lfcHRyKTsKKworICBpZiAoZHVtcF9tb2R1bGVfaW5mbykKKyAgICBnY292X2R1bXBfbW9kdWxlX2luZm8gKCk7CisKKyAgZnJlZSAoZ2lfZmlsZW5hbWUpOworfQorCisvKiBBZGQgYSBuZXcgb2JqZWN0IGZpbGUgb250byB0aGUgYmIgY2hhaW4uICBJbnZva2VkIGF1dG9tYXRpY2FsbHkKKyAgIHdoZW4gcnVubmluZyBhbiBvYmplY3QgZmlsZSdzIGdsb2JhbCBjdG9ycy4gICovCisKK3ZvaWQKK19fZ2Nvdl9pbml0IChzdHJ1Y3QgZ2Nvdl9pbmZvICppbmZvKQoreworICBpZiAoIWdjb3Zfc2FtcGxpbmdfcmF0ZV9pbml0aWFsaXplZCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyKiBlbnZfdmFsdWVfc3RyID0gZ2V0ZW52ICgiR0NPVl9TQU1QTElOR19SQVRFIik7CisgICAgICBpZiAoZW52X3ZhbHVlX3N0cikKKyAgICAgICAgeworICAgICAgICAgIGludCBlbnZfdmFsdWVfaW50ID0gYXRvaShlbnZfdmFsdWVfc3RyKTsKKyAgICAgICAgICBpZiAoZW52X3ZhbHVlX2ludCA+PSAxKQorICAgICAgICAgICAgX19nY292X3NhbXBsaW5nX3JhdGUgPSBlbnZfdmFsdWVfaW50OworICAgICAgICB9CisgICAgICBnY292X3NhbXBsaW5nX3JhdGVfaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KKworICBpZiAoIWluZm8tPnZlcnNpb24pCisgICAgcmV0dXJuOworCisgIGlmIChnY292X3ZlcnNpb24gKGluZm8sIGluZm8tPnZlcnNpb24sIDApKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKnB0ciA9IGluZm8tPmZpbGVuYW1lOworICAgICAgZ2Nvdl91bnNpZ25lZF90IGNyYzMyID0gZ2Nvdl9jcmMzMjsKKyAgICAgIHNpemVfdCBmaWxlbmFtZV9sZW5ndGggPSBzdHJsZW4gKGluZm8tPmZpbGVuYW1lKTsKKyAgICAgIHN0cnVjdCBnY292X3BtdV9pbmZvIHBtdV9pbmZvOworCisgICAgICAvKiBSZWZyZXNoIHRoZSBsb25nZXN0IGZpbGUgbmFtZSBpbmZvcm1hdGlvbi4gICovCisgICAgICBpZiAoZmlsZW5hbWVfbGVuZ3RoID4gZ2Nvdl9tYXhfZmlsZW5hbWUpCisgICAgICAgIGdjb3ZfbWF4X2ZpbGVuYW1lID0gZmlsZW5hbWVfbGVuZ3RoOworCisgICAgICAvKiBJbml0aWFsaXplIHRoZSBwbXUgcHJvZmlsZXIuICAqLworICAgICAgcG11X2luZm8ucG11X3Byb2ZpbGVfZmlsZW5hbWUgPSBfX2djb3ZfcG11X3Byb2ZpbGVfZmlsZW5hbWU7CisgICAgICBwbXVfaW5mby5wbXVfdG9vbCA9IF9fZ2Nvdl9wbXVfcHJvZmlsZV9vcHRpb25zOworICAgICAgcG11X2luZm8ucG11X3RvcF9uX2FkZHJlc3MgPSBfX2djb3ZfcG11X3RvcF9uX2FkZHJlc3M7CisgICAgICBfX2djb3ZfaW5pdF9wbXVfcHJvZmlsZXIgKCZwbXVfaW5mbyk7CisgICAgICBpZiAocG11X2luZm8ucG11X3Byb2ZpbGVfZmlsZW5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZWZyZXNoIHRoZSBsb25nZXN0IGZpbGUgbmFtZSBpbmZvcm1hdGlvbi4gICovCisgICAgICAgICAgZmlsZW5hbWVfbGVuZ3RoID0gc3RybGVuIChwbXVfaW5mby5wbXVfcHJvZmlsZV9maWxlbmFtZSk7CisgICAgICAgICAgaWYgKGZpbGVuYW1lX2xlbmd0aCA+IGdjb3ZfbWF4X2ZpbGVuYW1lKQorICAgICAgICAgICAgZ2Nvdl9tYXhfZmlsZW5hbWUgPSBmaWxlbmFtZV9sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgLyogQXNzaWduIHRoZSBtb2R1bGUgSUQgKHN0YXJ0aW5nIGF0IDEpLiAgKi8KKyAgICAgIGluZm8tPm1vZF9pbmZvLT5pZGVudCA9ICgrK2djb3ZfY3VyX21vZHVsZV9pZCk7CisgICAgICBnY2NfYXNzZXJ0IChFWFRSQUNUX01PRFVMRV9JRF9GUk9NX0dMT0JBTF9JRCAoR0VOX0ZVTkNfR0xPQkFMX0lEICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tb2RfaW5mby0+aWRlbnQsIDApKQorICAgICAgICAgICAgICAgICAgPT0gaW5mby0+bW9kX2luZm8tPmlkZW50KTsKKworICAgICAgZG8KKwl7CisJICB1bnNpZ25lZCBpeDsKKwkgIGdjb3ZfdW5zaWduZWRfdCB2YWx1ZSA9ICpwdHIgPDwgMjQ7CisKKwkgIGZvciAoaXggPSA4OyBpeC0tOyB2YWx1ZSA8PD0gMSkKKwkgICAgeworCSAgICAgIGdjb3ZfdW5zaWduZWRfdCBmZWVkYmFjazsKKworCSAgICAgIGZlZWRiYWNrID0gKHZhbHVlIF4gY3JjMzIpICYgMHg4MDAwMDAwMCA/IDB4MDRjMTFkYjcgOiAwOworCSAgICAgIGNyYzMyIDw8PSAxOworCSAgICAgIGNyYzMyIF49IGZlZWRiYWNrOworCSAgICB9CisJfSB3aGlsZSAoKnB0cisrKTsKKworICAgICAgZ2Nvdl9jcmMzMiA9IGNyYzMyOworCisgICAgICBpZiAoIV9fZ2Nvdl9saXN0KQorICAgICAgICB7CisgICAgICAgICAgYXRleGl0IChnY292X2V4aXQpOworICAgICAgICAgIC8qIFN0YXJ0IHBtdSBwcm9maWxlci4gKi8KKyAgICAgICAgICBfX2djb3Zfc3RhcnRfcG11X3Byb2ZpbGVyICgpOworICAgICAgICB9CisKKyAgICAgIGluZm8tPm5leHQgPSBfX2djb3ZfbGlzdDsKKyAgICAgIF9fZ2Nvdl9saXN0ID0gaW5mbzsKKyAgICB9CisgIGluZm8tPnZlcnNpb24gPSAwOworfQorCisvKiBDYWxsZWQgYmVmb3JlIGZvcmsgb3IgZXhlYyAtIHdyaXRlIG91dCBwcm9maWxlIGluZm9ybWF0aW9uIGdhdGhlcmVkIHNvCisgICBmYXIgYW5kIHJlc2V0IGl0IHRvIHplcm8uICBUaGlzIGF2b2lkcyBkdXBsaWNhdGlvbiBvciBsb3NzIG9mIHRoZQorICAgcHJvZmlsZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBzbyBmYXIuICAqLworCit2b2lkCitfX2djb3ZfZmx1c2ggKHZvaWQpCit7CisgIGNvbnN0IHN0cnVjdCBnY292X2luZm8gKmdpX3B0cjsKKworICBfX2djb3Zfc3RvcF9wbXVfcHJvZmlsZXIgKCk7CisgIGdjb3ZfZXhpdCAoKTsKKyAgZm9yIChnaV9wdHIgPSBfX2djb3ZfbGlzdDsgZ2lfcHRyOyBnaV9wdHIgPSBnaV9wdHItPm5leHQpCisgICAgeworICAgICAgdW5zaWduZWQgdF9peDsKKyAgICAgIGNvbnN0IHN0cnVjdCBnY292X2N0cl9pbmZvICpjaV9wdHI7CisKKyAgICAgIGZvciAodF9peCA9IDAsIGNpX3B0ciA9IGdpX3B0ci0+Y291bnRzOyB0X2l4ICE9IEdDT1ZfQ09VTlRFUlM7IHRfaXgrKykKKyAgICAgICAgaWYgKGdjb3ZfY291bnRlcl9hY3RpdmUgKGdpX3B0ciwgdF9peCkpCisJICB7CisJICAgIG1lbXNldCAoY2lfcHRyLT52YWx1ZXMsIDAsIHNpemVvZiAoZ2Nvdl90eXBlKSAqIGNpX3B0ci0+bnVtKTsKKwkgICAgY2lfcHRyKys7CisJICB9CisgICAgfQorICBfX2djb3Zfc3RhcnRfcG11X3Byb2ZpbGVyICgpOworfQorCisjZWxzZSAvKiBfX0dDT1ZfS0VSTkVMX18gKi8KKworI2RlZmluZSBHQ09WX0dFVF9GSUxFTkFNRSBnY292X2dldF9maWxlbmFtZQorCisvKiBDb3B5IHRoZSBmaWxlbmFtZSB0byB0aGUgYnVmZmVyLiAgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitnY292X2dldF9maWxlbmFtZSAoaW50IHByZWZpeF9sZW5ndGggX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAorICAgICAgICAgICAgICAgICAgIGludCBnY292X3ByZWZpeF9zdHJpcCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmdpX2ZpbGVuYW1lX3VwKQoreworICAgIHN0cmNweSAoZ2lfZmlsZW5hbWVfdXAsIGZpbGVuYW1lKTsKK30KKworLyogU29ydCB0aGUgcHJvZmlsZSBjb3VudGVycyBmb3IgYWxsIGluZGlyZWN0IGNhbGwgc2l0ZXMuIENvdW50ZXJzCisgICBmb3IgZWFjaCBjYWxsIHNpdGUgYXJlIGFsbG9jYXRlZCBpbiBhcnJheSBDT1VOVEVSUy4gICovCisKK3N0YXRpYyB2b2lkCitnY292X3NvcnRfaWNhbGxfdG9wbl9jb3VudGVyIChjb25zdCBzdHJ1Y3QgZ2Nvdl9jdHJfaW5mbyAqY291bnRlcnMpCit7CisgIC8qIEVtcHR5ICovCit9CisKKy8qIFJlc2VydmVzIGEgYnVmZmVyIHRvIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlaW5nIHByb2Nlc3NlZC4gICovCitzdGF0aWMgY2hhciBfa2VybmVsX2dpX2ZpbGVuYW1lWzUyMF07CisKKy8qIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBzcGFjZSB0byBzdG9yZSBjdXJyZW50IGZpbGUgbmFtZS4gICovCisKK3N0YXRpYyB2b2lkCitnY292X2FsbG9jX2ZpbGVuYW1lICh2b2lkKQoreworICBwcmVmaXhfbGVuZ3RoID0gMDsKKyAgZ2Nvdl9wcmVmaXhfc3RyaXAgPSAwOworICBnaV9maWxlbmFtZSA9IF9rZXJuZWxfZ2lfZmlsZW5hbWU7CisgIGdpX2ZpbGVuYW1lX3VwID0gX2tlcm5lbF9naV9maWxlbmFtZTsKK30KKworI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIGFjdGl2ZSBjb3VudGVycyBpbiBnY292X2luZm8gSU5GTywKKyAgIHRoZSBjb3VudGVyIGFycmF5cyBhcmUgc3RvcmVkIGluIFZBTFVFUyBpZiB0aGUgY29taW5nCisgICB2YWx1ZSBvZiBWQUxVRVMgIT0wLiBJZiBGTEFHX1NPUlRfSUNBTExfVE9QTl9DT1VOVEVSICE9MCwKKyAgIHRoZSBpY2FsbF90b3BuX2NvdW50ZXIgaW4gSU5GTyB3aWxsIGJlIHNvcnRlZC4KKyAgIFJldHVybjogdGhlIG51bWJlciBvZiBhY3RpdmUgY291bnRlciB0eXBlcy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2djb3ZfY291bnRlcl9hcnJheSAoY29uc3Qgc3RydWN0IGdjb3ZfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgZ2Nvdl90eXBlICp2YWx1ZXNbR0NPVl9DT1VOVEVSU10sCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFnX3NvcnRfaWNhbGxfdG9wbl9jb3VudGVyKQoreworICB1bnNpZ25lZCBpbnQgaTsKKyAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IEdDT1ZfQ09VTlRFUlM7IGkrKykgeworICAgIGlmIChnY292X2NvdW50ZXJfYWN0aXZlIChpbmZvLCBpKSkKKyAgICAgIHsKKyAgICAgICAgaWYgKHZhbHVlcykKKyAgICAgICAgICB2YWx1ZXNbcmVzdWx0XSA9IGluZm8tPmNvdW50c1tyZXN1bHRdLnZhbHVlczsKKyAgICAgICAgaWYgKGZsYWdfc29ydF9pY2FsbF90b3BuX2NvdW50ZXIgJiYKKyAgICAgICAgICAgIChpID09IEdDT1ZfQ09VTlRFUl9JQ0FMTF9UT1BOVikpCisgICAgICAgICAgZ2Nvdl9zb3J0X2ljYWxsX3RvcG5fY291bnRlciAoJmluZm8tPmNvdW50c1tyZXN1bHRdKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogQ29tcHV0ZSBvYmplY3Qgc3VtbWFyeSByZWNvcmVkIGluIGdjb3ZfaW5mbyBJTkZPLiBUaGUgcmVzdWx0IGlzCisgICBzdG9yZWQgaW4gT0JKX1NVTS4gTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICB6ZXJvaW5nIG91dCBPQkpfU1VNLCBvdGhlcndpc2UgdGhlIHN1bW1hcnkgaXMgYWNjdW11bGF0ZWQuICAqLworCitzdGF0aWMgdm9pZAorZ2Nvdl9vYmplY3Rfc3VtbWFyeSAoc3RydWN0IGdjb3ZfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnY292X3N1bW1hcnkgKm9ial9zdW0pCit7CisgIGNvbnN0IHN0cnVjdCBnY292X2N0cl9pbmZvICpjaV9wdHI7CisgIHN0cnVjdCBnY292X2N0cl9zdW1tYXJ5ICpjc19wdHI7CisgIGdjb3ZfdW5zaWduZWRfdCBjX251bTsKKyAgdW5zaWduZWQgdF9peDsKKworICAvKiBUb3RhbHMgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLworICBjaV9wdHIgPSBpbmZvLT5jb3VudHM7CisgIGZvciAodF9peCA9IDA7IHRfaXggPCBHQ09WX0NPVU5URVJTX1NVTU1BQkxFOyB0X2l4KyspCisgICAgeworICAgICAgaWYgKCFnY292X2NvdW50ZXJfYWN0aXZlIChpbmZvLCB0X2l4KSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGNzX3B0ciA9ICYob2JqX3N1bS0+Y3Ryc1t0X2l4XSk7CisgICAgICBjc19wdHItPm51bSArPSBjaV9wdHItPm51bTsKKyAgICAgIGZvciAoY19udW0gPSAwOyBjX251bSA8IGNpX3B0ci0+bnVtOyBjX251bSsrKQorICAgICAgICB7CisgICAgICAgICAgY3NfcHRyLT5zdW1fYWxsICs9IGNpX3B0ci0+dmFsdWVzW2NfbnVtXTsKKyAgICAgICAgICBpZiAoY3NfcHRyLT5ydW5fbWF4IDwgY2lfcHRyLT52YWx1ZXNbY19udW1dKQorICAgICAgICAgICAgY3NfcHRyLT5ydW5fbWF4ID0gY2lfcHRyLT52YWx1ZXNbY19udW1dOworICAgICAgICB9CisgICAgICBjaV9wdHIrKzsKKyAgICB9Cit9CisKKy8qIE1lcmdlIHdpdGggZXhpc3RpbmcgZ2NkYSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB0byBhdm9pZAorICAgZXhjZXNzaXZlIGdyb3d0aGUgb2YgdGhlIGZpbGVzLiAgKi8KKworc3RhdGljIGludAorZ2Nvdl9tZXJnZV9nY2RhX2ZpbGUgKHN0cnVjdCBnY292X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgZ2Nvdl90eXBlICp2YWx1ZXNbR0NPVl9DT1VOVEVSU10sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlfc3RyaWRlKQoreworICBzdHJ1Y3QgZ2Nvdl9jdHJfc3VtbWFyeSAqY3Nfb2JqLCAqY3NfdG9iaiwgKmNzX3ByZywgKmNzX3RwcmcsICpjc19hbGw7CisgIHVuc2lnbmVkIHRfaXgsIGZfaXg7CisKKyNpZm5kZWYgX19HQ09WX0tFUk5FTF9fCisgIGNvbnN0IHN0cnVjdCBnY292X2ZuX2luZm8gKmZpX3B0cjsKKyAgdW5zaWduZWQgY19peCwgbl9jb3VudHM7CisgIGludCBlcnJvciA9IDA7CisgIGdjb3ZfdW5zaWduZWRfdCB0YWcsIGxlbmd0aDsKKworICBlb2ZfcG9zID0gMDsKKyAgc3VtbWFyeV9wb3MgPSAwOworCisgIHRhZyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgaWYgKHRhZykKKyAgICB7CisgICAgICAvKiBNZXJnZSBkYXRhIGZyb20gZmlsZS4gICovCisgICAgICBpZiAodGFnICE9IEdDT1ZfREFUQV9NQUdJQykKKyAgICAgICAgeworICAgICAgICAgIGdjb3ZfZXJyb3IgKCJwcm9maWxpbmc6JXM6Tm90IGEgZ2NvdiBkYXRhIGZpbGVcbiIsIGdpX2ZpbGVuYW1lKTsKKyAgICAgICAgICBnb3RvIHJlYWRfZmF0YWw7CisgICAgICAgIH0KKyAgICAgbGVuZ3RoID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICAgICBpZiAoIWdjb3ZfdmVyc2lvbiAoaW5mbywgbGVuZ3RoLCBnaV9maWxlbmFtZSkpCisgICAgICAgZ290byByZWFkX2ZhdGFsOworCisgICAgIGxlbmd0aCA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgICAgaWYgKGxlbmd0aCAhPSBpbmZvLT5zdGFtcCkKKyAgICAgICAvKiBSZWFkIGZyb20gYSBkaWZmZXJlbnQgY29tcGlsYXRpb24uIE92ZXJ3cml0ZSB0aGUgZmlsZS4gICovCisgICAgICAgZ290byByZXdyaXRlOworCisgICAgIC8qIE1lcmdlIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggZnVuY3Rpb24uICAqLworICAgICBmb3IgKGZfaXggPSAwOyBmX2l4IDwgaW5mby0+bl9mdW5jdGlvbnM7IGZfaXgrKykKKyAgICAgICB7CisgICAgICAgICBmaV9wdHIgPSAoY29uc3Qgc3RydWN0IGdjb3ZfZm5faW5mbyAqKQorICAgICAgICAgICAgICAgICAgICgoY29uc3QgY2hhciAqKSBpbmZvLT5mdW5jdGlvbnMgKyBmX2l4ICogZmlfc3RyaWRlKTsKKyAgICAgICAgIHRhZyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgICAgICAgIGxlbmd0aCA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKworICAgICAgICAgLyogQ2hlY2sgZnVuY3Rpb24uICAqLworICAgICAgICAgaWYgKHRhZyAhPSBHQ09WX1RBR19GVU5DVElPTgorCSAgICAgfHwgbGVuZ3RoICE9IEdDT1ZfVEFHX0ZVTkNUSU9OX0xFTkdUSAorICAgICAgICAgICAgIHx8IGdjb3ZfcmVhZF91bnNpZ25lZCAoKSAhPSBmaV9wdHItPmlkZW50CisgICAgICAgICAgICAgfHwgZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpICE9IGZpX3B0ci0+bGluZW5vX2NoZWNrc3VtCisgICAgICAgICAgICAgfHwgZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpICE9IGZpX3B0ci0+Y2ZnX2NoZWNrc3VtKQorICAgICAgICAgICBnb3RvIHJlYWRfbWlzbWF0Y2g7CisKKyAgICAgICAgICAgY19peCA9IDA7CisgICAgICAgICAgIGZvciAodF9peCA9IDA7IHRfaXggPCBHQ09WX0NPVU5URVJTOyB0X2l4KyspCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgZ2Nvdl9tZXJnZV9mbiBtZXJnZTsKKworICAgICAgICAgICAgICAgaWYgKCEoKDEgPDwgdF9peCkgJiBpbmZvLT5jdHJfbWFzaykpCisgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICBuX2NvdW50cyA9IGZpX3B0ci0+bl9jdHJzW2NfaXhdOworICAgICAgICAgICAgICAgbWVyZ2UgPSBpbmZvLT5jb3VudHNbY19peF0ubWVyZ2U7CisKKyAgICAgICAgICAgICAgIHRhZyA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgICAgICAgICAgICAgIGxlbmd0aCA9IGdjb3ZfcmVhZF91bnNpZ25lZCAoKTsKKyAgICAgICAgICAgICAgIGlmICh0YWcgIT0gR0NPVl9UQUdfRk9SX0NPVU5URVIgKHRfaXgpCisgICAgICAgICAgICAgICAgICAgfHwgbGVuZ3RoICE9IEdDT1ZfVEFHX0NPVU5URVJfTEVOR1RIIChuX2NvdW50cykpCisgICAgICAgICAgICAgICAgIGdvdG8gcmVhZF9taXNtYXRjaDsKKyAgICAgICAgICAgICAgICgqbWVyZ2UpICh2YWx1ZXNbY19peF0sIG5fY291bnRzKTsKKyAgICAgICAgICAgICAgIHZhbHVlc1tjX2l4XSArPSBuX2NvdW50czsKKyAgICAgICAgICAgICAgIGNfaXgrKzsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgIGlmICgoZXJyb3IgPSBnY292X2lzX2Vycm9yICgpKSkKKyAgICAgICAgICAgICBnb3RvIHJlYWRfZXJyb3I7CisgICAgICAgfQorCisgICAgICAgZl9peCA9IH4wdTsKKyAgICAgICAvKiBDaGVjayBwcm9ncmFtICYgb2JqZWN0IHN1bW1hcnkuICAqLworICAgICAgIHdoaWxlICgxKQorICAgICAgICAgeworICAgICAgICAgICBpbnQgaXNfcHJvZ3JhbTsKKworICAgICAgICAgICBlb2ZfcG9zID0gZ2Nvdl9wb3NpdGlvbiAoKTsKKyAgICAgICAgICAgdGFnID0gZ2Nvdl9yZWFkX3Vuc2lnbmVkICgpOworICAgICAgICAgICBpZiAoIXRhZykKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBsZW5ndGggPSBnY292X3JlYWRfdW5zaWduZWQgKCk7CisgICAgICAgICAgIGlzX3Byb2dyYW0gPSB0YWcgPT0gR0NPVl9UQUdfUFJPR1JBTV9TVU1NQVJZOworICAgICAgICAgICBpZiAobGVuZ3RoICE9IEdDT1ZfVEFHX1NVTU1BUllfTEVOR1RICisgICAgICAgICAgICAgICB8fCAoIWlzX3Byb2dyYW0gJiYgdGFnICE9IEdDT1ZfVEFHX09CSkVDVF9TVU1NQVJZKSkKKyAgICAgICAgICAgICBnb3RvIHJlYWRfbWlzbWF0Y2g7CisgICAgICAgICAgIGdjb3ZfcmVhZF9zdW1tYXJ5IChpc19wcm9ncmFtID8gJnByb2dyYW0gOiAmb2JqZWN0KTsKKyAgICAgICAgICAgaWYgKChlcnJvciA9IGdjb3ZfaXNfZXJyb3IgKCkpKQorICAgICAgICAgICAgIGdvdG8gcmVhZF9lcnJvcjsKKyAgICAgICAgICAgaWYgKGlzX3Byb2dyYW0gJiYgcHJvZ3JhbS5jaGVja3N1bSA9PSBnY292X2NyYzMyKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHN1bW1hcnlfcG9zID0gZW9mX3BvczsKKyAgICAgICAgICAgICAgIGdvdG8gcmV3cml0ZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgfQorCisgICAgZ290byByZXdyaXRlOworCityZWFkX2Vycm9yOjsKKyAgICBnY292X2Vycm9yIChlcnJvciA8IDAgPyAicHJvZmlsaW5nOiVzOk92ZXJmbG93IG1lcmdpbmdcbiIKKyAgICAgICAgICAgICAgICA6ICJwcm9maWxpbmc6JXM6RXJyb3IgbWVyZ2luZ1xuIiwgZ2lfZmlsZW5hbWUpOworICAgIGdvdG8gcmVhZF9mYXRhbDsKKworI2VuZGlmIC8qIF9fR0NPVl9LRVJORUxfXyAqLworCisgICAgZ290byByZXdyaXRlOworCityZWFkX21pc21hdGNoOjsKKyAgICBnY292X2Vycm9yICgicHJvZmlsaW5nOiVzOk1lcmdlIG1pc21hdGNoIGZvciAlc1xuIiwgZ2lfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgIGZfaXggKyAxID8gImZ1bmN0aW9uIiA6ICJzdW1tYXJpZXMiKTsKKyAgICBnb3RvIHJlYWRfZmF0YWw7IC8qIHdvcmstYXJvdW5kIHRoZSBjb21waWxlciB3YXJuaW5nICovCisKK3JlYWRfZmF0YWw6OworICAgIGdjb3ZfY2xvc2UgKCk7CisgICAgcmV0dXJuIDE7CisKK3Jld3JpdGU6OworICAgIGdjb3ZfcmV3cml0ZSAoKTsKKyAgICBpZiAoIXN1bW1hcnlfcG9zKQorICAgICAgbWVtc2V0ICgmcHJvZ3JhbSwgMCwgc2l6ZW9mIChwcm9ncmFtKSk7CisKKyAgICAvKiBNZXJnZSB0aGUgc3VtbWFyaWVzLiAgKi8KKyAgICBmX2l4ID0gfjB1OworICAgIGZvciAodF9peCA9IDA7IHRfaXggPCBHQ09WX0NPVU5URVJTX1NVTU1BQkxFOyB0X2l4KyspCisgICAgICB7CisgICAgICAgIGNzX29iaiA9ICZvYmplY3QuY3Ryc1t0X2l4XTsKKyAgICAgICAgY3NfdG9iaiA9ICZ0aGlzX29iamVjdC5jdHJzW3RfaXhdOworICAgICAgICBjc19wcmcgPSAmcHJvZ3JhbS5jdHJzW3RfaXhdOworICAgICAgICBjc190cHJnID0gJnRoaXNfcHJvZ3JhbS5jdHJzW3RfaXhdOworICAgICAgICBjc19hbGwgPSAmYWxsLmN0cnNbdF9peF07CisKKyAgICAgICAgaWYgKCgxIDw8IHRfaXgpICYgaW5mby0+Y3RyX21hc2spCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjc19vYmotPnJ1bnMrKykKKyAgICAgICAgICAgICAgY3Nfb2JqLT5udW0gPSBjc190b2JqLT5udW07CisgICAgICAgICAgICBlbHNlIGlmIChjc19vYmotPm51bSAhPSBjc190b2JqLT5udW0pCisgICAgICAgICAgICAgICBnb3RvIHJlYWRfbWlzbWF0Y2g7CisgICAgICAgICAgICBjc19vYmotPnN1bV9hbGwgKz0gY3NfdG9iai0+c3VtX2FsbDsKKyAgICAgICAgICAgIGlmIChjc19vYmotPnJ1bl9tYXggPCBjc190b2JqLT5ydW5fbWF4KQorICAgICAgICAgICAgICBjc19vYmotPnJ1bl9tYXggPSBjc190b2JqLT5ydW5fbWF4OworICAgICAgICAgICAgY3Nfb2JqLT5zdW1fbWF4ICs9IGNzX3RvYmotPnJ1bl9tYXg7CisKKyAgICAgICAgICAgIGlmICghY3NfcHJnLT5ydW5zKyspCisgICAgICAgICAgICAgIGNzX3ByZy0+bnVtID0gY3NfdHByZy0+bnVtOworICAgICAgICAgICAgZWxzZSBpZiAoY3NfcHJnLT5udW0gIT0gY3NfdHByZy0+bnVtKQorICAgICAgICAgICAgICBnb3RvIHJlYWRfbWlzbWF0Y2g7CisgICAgICAgICAgICBjc19wcmctPnN1bV9hbGwgKz0gY3NfdHByZy0+c3VtX2FsbDsKKyAgICAgICAgICAgIGlmIChjc19wcmctPnJ1bl9tYXggPCBjc190cHJnLT5ydW5fbWF4KQorICAgICAgICAgICAgICBjc19wcmctPnJ1bl9tYXggPSBjc190cHJnLT5ydW5fbWF4OworICAgICAgICAgICAgY3NfcHJnLT5zdW1fbWF4ICs9IGNzX3RwcmctPnJ1bl9tYXg7CisgICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjc19vYmotPm51bSB8fCBjc19wcmctPm51bSkKKyAgICAgICAgICBnb3RvIHJlYWRfbWlzbWF0Y2g7CisKKyAgICAgICAgaWYgKCFjc19hbGwtPnJ1bnMgJiYgY3NfcHJnLT5ydW5zKQorICAgICAgICAgIG1lbWNweSAoY3NfYWxsLCBjc19wcmcsIHNpemVvZiAoKmNzX2FsbCkpOworICAgICAgICBlbHNlIGlmICghYWxsLmNoZWNrc3VtCisgICAgICAgICAgICAgICAgICYmICghR0NPVl9MT0NLRUQgfHwgY3NfYWxsLT5ydW5zID09IGNzX3ByZy0+cnVucykKKyAgICAgICAgICAgICAgICAgJiYgbWVtY21wIChjc19hbGwsIGNzX3ByZywgc2l6ZW9mICgqY3NfYWxsKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgZ2Nvdl9lcnJvciAoInByb2ZpbGluZzolczpJbnZvY2F0aW9uIG1pc21hdGNoIC0gIgorICAgICAgICAgICAgICAgICJzb21lIGRhdGEgZmlsZXMgbWF5IGhhdmUgYmVlbiByZW1vdmVkJXMiLAorICAgICAgICAgICAgZ2lfZmlsZW5hbWUsIEdDT1ZfTE9DS0VECisgICAgICAgICAgICA/ICIiIDogIiBvciBjb25jdXJyZW50IHVwZGF0ZSB3aXRob3V0IGxvY2tpbmcgc3VwcG9ydCIpOworICAgICAgICAgICAgYWxsLmNoZWNrc3VtID0gfjB1OworICAgICAgICAgIH0KKyAgICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBmdW5jdGlvbl9pbmZvIHN0cmlkZS4gVGhpcyBkZXBlbmRzIG9uIHRoZQorICAgbnVtYmVyIG9mIGNvdW50ZXIgdHlwZXMgYmVpbmcgbWVhc3VyZWQuCisgICBOVU1fQ09VTlRFUl9UWVBFUyBpcyBudW1iZXIgb2YgY291bnRlciB0eXBlcyByZWNvcmRlZC4KKyAgIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcyBmb3IgYWNjZXNzaW5nIG5leHQgZm5faW5mbworICAgKGFsaWduZWQgdG8gZ2Nvdl9mbl9pbmZvKS4gICovCisKK3N0YXRpYyB1bnNpZ25lZAorZ2Nvdl9jb21wdXRlX2ZpX3N0cmlkZSAodW5zaWduZWQgbnVtX2NvdW50ZXJfdHlwZXMpCit7CisgICB1bnNpZ25lZCBmaV9zdHJpZGU7CisKKyAgIGZpX3N0cmlkZSA9IG9mZnNldG9mIChzdHJ1Y3QgZ2Nvdl9mbl9pbmZvLCBuX2N0cnMpICsKKyAgICAgICAgICAgICAgIG51bV9jb3VudGVyX3R5cGVzICogc2l6ZW9mICh1bnNpZ25lZCk7CisgICBpZiAoX19hbGlnbm9mX18gKHN0cnVjdCBnY292X2ZuX2luZm8pID4gc2l6ZW9mICh1bnNpZ25lZCkpCisgICB7CisgICAgIGZpX3N0cmlkZSArPSBfX2FsaWdub2ZfXyAoc3RydWN0IGdjb3ZfZm5faW5mbykgLSAxOworICAgICBmaV9zdHJpZGUgJj0gfihfX2FsaWdub2ZfXyAoc3RydWN0IGdjb3ZfZm5faW5mbykgLSAxKTsKKyAgIH0KKyAgIHJldHVybiBmaV9zdHJpZGU7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZSBvZiBnY2RhIGZpbGUgdG8gYmUgd3JpdHRlbi4gTm90ZQorICAgdGhlIHNpemUgaXMgaW4gdW5pdHMgb2YgZ2Nvdl90eXBlLiAgKi8KKworR0NPVl9MSU5LQUdFIHVuc2lnbmVkCitnY292X2djZGFfZmlsZV9zaXplIChzdHJ1Y3QgZ2Nvdl9pbmZvICpnaV9wdHIpCit7CisgIHVuc2lnbmVkIHNpemU7CisgIGNvbnN0IHN0cnVjdCBnY292X2ZuX2luZm8gKmZpX3B0cjsKKyAgdW5zaWduZWQgZl9peCwgdF9peCwgY19peDsKKyAgdW5zaWduZWQgbl9jb3VudHM7CisgIHVuc2lnbmVkIGZpX3N0cmlkZTsKKyAgZ2Nvdl90eXBlICp2YWx1ZXNbR0NPVl9DT1VOVEVSU107CisKKyAgY19peCA9IGdjb3ZfY291bnRlcl9hcnJheSAoZ2lfcHRyLCB2YWx1ZXMsIDApOworICBmaV9zdHJpZGUgPSBnY292X2NvbXB1dGVfZmlfc3RyaWRlIChjX2l4KTsKKworICAvKiBHQ09WX0RBVEFfTUFHSUMsIEdDT1ZfVkVSU0lPTiBhbmQgdGltZV9zdGFtcC4gICovCisgIHNpemUgPSAzOworCisgIC8qIHNpemUgZm9yIGVhY2ggZnVuY3Rpb24uICAqLworICBmb3IgKGZfaXggPSAwOyBmX2l4IDwgZ2lfcHRyLT5uX2Z1bmN0aW9uczsgZl9peCsrKQorICAgIHsKKyAgICAgIGZpX3B0ciA9IChjb25zdCBzdHJ1Y3QgZ2Nvdl9mbl9pbmZvICopCisgICAgICAgICgoY29uc3QgY2hhciAqKSBnaV9wdHItPmZ1bmN0aW9ucyArIGZfaXggKiBmaV9zdHJpZGUpOworCisgICAgICBzaXplICs9IDIgLyogdGFnX2xlbmd0aCBpdHNlbGYgKi8KKyAgICAgICAgICAgICAgKyBHQ09WX1RBR19GVU5DVElPTl9MRU5HVEg7IC8qIGlkZW50LCBsaW5lbm9fY2tzdW0sIGNmZ19ja3NtICovCisKKyAgICAgIGNfaXggPSAwOworICAgICAgZm9yICh0X2l4ID0gMDsgdF9peCA8IEdDT1ZfQ09VTlRFUlM7IHRfaXgrKykKKyAgICAgICAgeworICAgICAgICAgIGlmICghKCgxIDw8IHRfaXgpICYgZ2lfcHRyLT5jdHJfbWFzaykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIG5fY291bnRzID0gZmlfcHRyLT5uX2N0cnNbY19peF07CisgICAgICAgICAgc2l6ZSArPSAyICsgR0NPVl9UQUdfQ09VTlRFUl9MRU5HVEggKG5fY291bnRzKTsKKyAgICAgICAgICBjX2l4Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyogT2JqZWN0IHN1bW1hcnkuICAqLworICBzaXplICs9IDIgKyBHQ09WX1RBR19TVU1NQVJZX0xFTkdUSDsKKworICAvKiBQcm9ncmFtIHN1bW1hcnkuICAqLworICBzaXplICs9IDIgKyBHQ09WX1RBR19TVU1NQVJZX0xFTkdUSDsKKworICBzaXplICs9IDE7CisKKyAgcmV0dXJuIHNpemUqNDsKK30KKworLyogV3JpdGUgcHJvZmlsZSBkYXRhIChpbmNsdWRpbmcgc3VtbWFyeSBhbmQgbW9kdWxlIGdyb3VwaW5nIGluZm9ybWF0aW9uLAorICAgaWYgYXZhaWxhYmxlLCB0byBmaWxlLiAgKi8KKworc3RhdGljIHZvaWQKK2djb3Zfd3JpdGVfZ2NkYV9maWxlIChzdHJ1Y3QgZ2Nvdl9pbmZvICpnaV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlfc3RyaWRlKQoreworICAgICAgY29uc3Qgc3RydWN0IGdjb3ZfZm5faW5mbyAqZmlfcHRyOworICAgICAgZ2Nvdl90eXBlICp2YWx1ZXNbR0NPVl9DT1VOVEVSU107CisgICAgICB1bnNpZ25lZCB0X2l4LCBjX2l4LCBmX2l4LCBuX2NvdW50czsKKyAgICAgIGludCBlcnJvciA9IDA7CisKKyAgICAgIC8qIFdyaXRlIG91dCB0aGUgZGF0YS4gICovCisgICAgICBnY292X3dyaXRlX3RhZ19sZW5ndGggKEdDT1ZfREFUQV9NQUdJQywgR0NPVl9WRVJTSU9OKTsKKyAgICAgIGdjb3Zfd3JpdGVfdW5zaWduZWQgKGdpX3B0ci0+c3RhbXApOworCisgICAgICBnY292X2NvdW50ZXJfYXJyYXkgKGdpX3B0ciwgdmFsdWVzLCAwKTsKKworICAgICAgLyogV3JpdGUgZXhlY3V0aW9uIGNvdW50cyBmb3IgZWFjaCBmdW5jdGlvbi4gICovCisgICAgICBmb3IgKGZfaXggPSAwOyBmX2l4IDwgZ2lfcHRyLT5uX2Z1bmN0aW9uczsgZl9peCsrKQorICAgICAgICB7CisJICBmaV9wdHIgPSAoY29uc3Qgc3RydWN0IGdjb3ZfZm5faW5mbyAqKQorCQkgICgoY29uc3QgY2hhciAqKSBnaV9wdHItPmZ1bmN0aW9ucyArIGZfaXggKiBmaV9zdHJpZGUpOworCisJICAvKiBBbm5vdW5jZSBmdW5jdGlvbi4gICovCisJICBnY292X3dyaXRlX3RhZ19sZW5ndGggKEdDT1ZfVEFHX0ZVTkNUSU9OLCBHQ09WX1RBR19GVU5DVElPTl9MRU5HVEgpOworCSAgZ2Nvdl93cml0ZV91bnNpZ25lZCAoZmlfcHRyLT5pZGVudCk7CisJICBnY292X3dyaXRlX3Vuc2lnbmVkIChmaV9wdHItPmxpbmVub19jaGVja3N1bSk7CisJICBnY292X3dyaXRlX3Vuc2lnbmVkIChmaV9wdHItPmNmZ19jaGVja3N1bSk7CisKKwkgIGNfaXggPSAwOworCSAgZm9yICh0X2l4ID0gMDsgdF9peCA8IEdDT1ZfQ09VTlRFUlM7IHRfaXgrKykKKwkgICAgeworCSAgICAgIGdjb3ZfdHlwZSAqY19wdHI7CisKKwkgICAgICBpZiAoISgoMSA8PCB0X2l4KSAmIGdpX3B0ci0+Y3RyX21hc2spKQorCQljb250aW51ZTsKKworCSAgICAgIG5fY291bnRzID0gZmlfcHRyLT5uX2N0cnNbY19peF07CisKKwkgICAgICBnY292X3dyaXRlX3RhZ19sZW5ndGggKEdDT1ZfVEFHX0ZPUl9DT1VOVEVSICh0X2l4KSwKKwkJCQkgICAgIEdDT1ZfVEFHX0NPVU5URVJfTEVOR1RIIChuX2NvdW50cykpOworCSAgICAgIGNfcHRyID0gdmFsdWVzW2NfaXhdOworCSAgICAgIHdoaWxlIChuX2NvdW50cy0tKQorCQlnY292X3dyaXRlX2NvdW50ZXIgKCpjX3B0cisrKTsKKworCSAgICAgIHZhbHVlc1tjX2l4XSA9IGNfcHRyOworCSAgICAgIGNfaXgrKzsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIE9iamVjdCBmaWxlIHN1bW1hcnkuICAqLworICAgICAgZ2Nvdl93cml0ZV9zdW1tYXJ5IChHQ09WX1RBR19PQkpFQ1RfU1VNTUFSWSwgJm9iamVjdCk7CisKKyAgICAgIC8qIEdlbmVyYXRlIHdob2xlIHByb2dyYW0gc3RhdGlzdGljcy4gICovCisgICAgICBwcm9ncmFtLmNoZWNrc3VtID0gZ2Nvdl9jcmMzMjsKKyAgICAgIGlmIChlb2ZfcG9zKQorCWdjb3Zfc2VlayAoZW9mX3Bvcyk7CisgICAgICBnY292X3dyaXRlX3N1bW1hcnkgKEdDT1ZfVEFHX1BST0dSQU1fU1VNTUFSWSwgJnByb2dyYW0pOworICAgICAgaWYgKCFzdW1tYXJ5X3BvcykKKwlnY292X3dyaXRlX3Vuc2lnbmVkICgwKTsKKworICAgICAgLyogVE9ETzogdGhlcmUgaXMgYSBwcm9ibGVtIGhlcmUgLS0gaWYgdGhlcmUgYXJlIG90aGVyIHByb2dyYW0KKyAgICAgICAgIHN1bW1hcnkgZGF0YSBhZnRlciB0aGUgbWF0Y2hpbmcgb25lLCBzZXR0aW5nIGVvZl9wb3MgdG8gdGhpcworICAgICAgICAgcG9zaXRpb24gbWVhbnMgdGhhdCB0aGUgbW9kdWxlIGluZm8gdGFibGUgd2lsbCBvdmVyd3JpdGUgdGhlCisgICAgICAgICB0aG9zZSBvdGhlciBwcm9ncmFtIHN1bW1hcnkuIEl0IGFsc28gbWVhbnMgYSBtaXNtYXRjaCBlcnJvcgorICAgICAgICAgbWF5IG9jY3VyIGF0IHRoZSBuZXh0IG1lcmdlIGlmIG5vIG1hdGNoaW5nIHByb2dyYW0gc3VtbWFyeSBpcworICAgICAgICAgZm91bmQgYmVmb3JlIHRoZSBtb2R1bGUgaW5mbyBkYXRhLiAgKi8KKyAgICAgIGlmICghc3VtbWFyeV9wb3MpCisgICAgICAgIGdpX3B0ci0+ZW9mX3BvcyA9IGdjb3ZfcG9zaXRpb24gKCkgLSAxOworICAgICAgZWxzZQorICAgICAgICBnaV9wdHItPmVvZl9wb3MgPSBnY292X3Bvc2l0aW9uICgpOworCisgICAgICBpZiAoKGVycm9yID0gZ2Nvdl9jbG9zZSAoKSkpCisJICBnY292X2Vycm9yIChlcnJvciAgPCAwID8KKwkJICAgInByb2ZpbGluZzolczpPdmVyZmxvdyB3cml0aW5nXG4iIDoKKwkJICAgInByb2ZpbGluZzolczpFcnJvciB3cml0aW5nXG4iLAorCQkgICBnaV9maWxlbmFtZSk7Cit9CisKKy8qIERvIHNvbWUgcHJlcGFyYXRpb24gd29yayBiZWZvcmUgY2FsbGluZyB0aGUgYWN0dWFsIGR1bXBpbmcKKyAgIHJvdXRpbmUuCisgICBSZXR1cm46IDEgd2hlbiBtb2R1bGUgZ3JvdXBpbmcgaW5mbyBuZWVkcyB0byBiZSBkdW1wZWQsCisgICAgICAgICAgIDAgb3RoZXJ3aXNlLiAgKi8KKworc3RhdGljIGludAorZ2Nvdl9leGl0X2luaXQgKHZvaWQpCit7CisgIHN0cnVjdCBnY292X2luZm8gKmdpX3B0cjsKKyAgaW50IGR1bXBfbW9kdWxlX2luZm8gPSAwOworCisgIGR1bXBfbW9kdWxlX2luZm8gPSAwOworICBnY292X3ByZWZpeF9zdHJpcCA9IDA7CisKKyAgbWVtc2V0ICgmYWxsLCAwLCBzaXplb2YgKGFsbCkpOworCisgIC8qIEZpbmQgdGhlIHRvdGFscyBmb3IgdGhpcyBleGVjdXRpb24uICAqLworICBtZW1zZXQgKCZ0aGlzX3Byb2dyYW0sIDAsIHNpemVvZiAodGhpc19wcm9ncmFtKSk7CisgIGZvciAoZ2lfcHRyID0gX19nY292X2xpc3Q7IGdpX3B0cjsgZ2lfcHRyID0gZ2lfcHRyLT5uZXh0KQorICAgIHsKKyAgICAgIGdjb3Zfb2JqZWN0X3N1bW1hcnkgKGdpX3B0ciwgJnRoaXNfcHJvZ3JhbSk7CisKKyAgICAgIC8qIFRoZSBJU19QUklNQVJZIGZpZWxkIGlzIG92ZXJsb2FkZWQgdG8gaW5kaWNhdGUgaWYgdGhpcyBtb2R1bGUKKyAgICAgICAgIGlzIEZETy9MSVBPLiAgKi8KKyAgICAgIGR1bXBfbW9kdWxlX2luZm8gfD0gZ2lfcHRyLT5tb2RfaW5mby0+aXNfcHJpbWFyeTsKKyAgICB9CisKKyAgZ2Nvdl9hbGxvY19maWxlbmFtZSAoKTsKKworICByZXR1cm4gZHVtcF9tb2R1bGVfaW5mbzsKK30KKworLyogRHVtcCBvbmUgZW50cnkgaW4gdGhlIGdjb3ZfaW5mbyBsaXN0IChmb3Igb25lIG9iamVjdCkuICAqLworCitzdGF0aWMgdm9pZAorZ2Nvdl9kdW1wX29uZV9nY292IChzdHJ1Y3QgZ2Nvdl9pbmZvICpnaV9wdHIpCit7CisgIGdjb3ZfdHlwZSAqdmFsdWVzW0dDT1ZfQ09VTlRFUlNdOworICB1bnNpZ25lZCBmaV9zdHJpZGU7CisgIHVuc2lnbmVkIGNfaXg7CisgIGludCByZXQ7CisKKyAgbWVtc2V0ICgmdGhpc19vYmplY3QsIDAsIHNpemVvZiAodGhpc19vYmplY3QpKTsKKyAgbWVtc2V0ICgmb2JqZWN0LCAwLCBzaXplb2YgKG9iamVjdCkpOworCisgIGdjb3Zfb2JqZWN0X3N1bW1hcnkgKGdpX3B0ciwgJnRoaXNfb2JqZWN0KTsKKworICBjX2l4ID0gZ2Nvdl9jb3VudGVyX2FycmF5IChnaV9wdHIsIHZhbHVlcywgMSk7CisKKyAgZmlfc3RyaWRlID0gZ2Nvdl9jb21wdXRlX2ZpX3N0cmlkZSAoY19peCk7CisKKyAgR0NPVl9HRVRfRklMRU5BTUUgKHByZWZpeF9sZW5ndGgsIGdjb3ZfcHJlZml4X3N0cmlwLCBnaV9wdHItPmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgZ2lfZmlsZW5hbWVfdXApOworCisgIGlmIChnY292X29wZW5fYnlfZmlsZW5hbWUgKGdpX2ZpbGVuYW1lKSA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgLyogTm93IG1lcmdlIHRoaXMgZmlsZS4gICovCisgIHJldCA9IGdjb3ZfbWVyZ2VfZ2NkYV9maWxlIChnaV9wdHIsIHZhbHVlcywgZmlfc3RyaWRlKTsKKyAgaWYgKHJldCAhPSAwICkgcmV0dXJuOworCisgIGdjb3Zfd3JpdGVfZ2NkYV9maWxlIChnaV9wdHIsIGZpX3N0cmlkZSk7Cit9CisKKyNlbmRpZiAvKiBMX2djb3YgKi8KKworI2lmZGVmIExfZ2Nvdl9tZXJnZV9hZGQKKy8qIFRoZSBwcm9maWxlIG1lcmdpbmcgZnVuY3Rpb24gdGhhdCBqdXN0IGFkZHMgdGhlIGNvdW50ZXJzLiAgSXQgaXMgZ2l2ZW4KKyAgIGFuIGFycmF5IENPVU5URVJTIG9mIE5fQ09VTlRFUlMgb2xkIGNvdW50ZXJzIGFuZCBpdCByZWFkcyB0aGUgc2FtZSBudW1iZXIKKyAgIG9mIGNvdW50ZXJzIGZyb20gdGhlIGdjb3YgZmlsZS4gICovCit2b2lkCitfX2djb3ZfbWVyZ2VfYWRkIChnY292X3R5cGUgKmNvdW50ZXJzLCB1bnNpZ25lZCBuX2NvdW50ZXJzKQoreworICBmb3IgKDsgbl9jb3VudGVyczsgY291bnRlcnMrKywgbl9jb3VudGVycy0tKQorICAgICpjb3VudGVycyArPSBnY292X3JlYWRfY291bnRlciAoKTsKK30KKyNlbmRpZiAvKiBMX2djb3ZfbWVyZ2VfYWRkICovCisKKyNpZmRlZiBMX2djb3ZfbWVyZ2VfaW9yCisvKiBUaGUgcHJvZmlsZSBtZXJnaW5nIGZ1bmN0aW9uIHRoYXQganVzdCBhZGRzIHRoZSBjb3VudGVycy4gIEl0IGlzIGdpdmVuCisgICBhbiBhcnJheSBDT1VOVEVSUyBvZiBOX0NPVU5URVJTIG9sZCBjb3VudGVycyBhbmQgaXQgcmVhZHMgdGhlIHNhbWUgbnVtYmVyCisgICBvZiBjb3VudGVycyBmcm9tIHRoZSBnY292IGZpbGUuICAqLwordm9pZAorX19nY292X21lcmdlX2lvciAoZ2Nvdl90eXBlICpjb3VudGVycywgdW5zaWduZWQgbl9jb3VudGVycykKK3sKKyAgZm9yICg7IG5fY291bnRlcnM7IGNvdW50ZXJzKyssIG5fY291bnRlcnMtLSkKKyAgICAqY291bnRlcnMgfD0gZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9tZXJnZV9yZXVzZWRpc3QKKworLyogUmV0dXJuIHRoZSB3ZWlnaHRlZCBhcml0aG1ldGljIG1lYW4gb2YgdHdvIHZhbHVlcy4gICovCisKK3N0YXRpYyBnY292X3R5cGUKK19fZ2Nvdl93ZWlnaHRlZF9tZWFuMiAoZ2Nvdl90eXBlIHZhbHVlMSwgZ2Nvdl90eXBlIGNvdW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2Nvdl90eXBlIHZhbHVlMiwgZ2Nvdl90eXBlIGNvdW50MikKK3sKKyAgaWYgKGNvdW50MSArIGNvdW50MiA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuICh2YWx1ZTEgKiBjb3VudDEgKyB2YWx1ZTIgKiBjb3VudDIpIC8gKGNvdW50MSArIGNvdW50Mik7Cit9CisKK3ZvaWQKK19fZ2Nvdl9tZXJnZV9yZXVzZWRpc3QgKGdjb3ZfdHlwZSAqY291bnRlcnMsIHVuc2lnbmVkIG5fY291bnRlcnMpCit7CisgIHVuc2lnbmVkIGk7CisKKyAgZ2NjX2Fzc2VydCghKG5fY291bnRlcnMgJSA0KSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG5fY291bnRlcnM7IGkgKz0gNCkKKyAgICB7CisgICAgICAvKiBEZWNvZGUgY3VycmVudCB2YWx1ZXMuICAqLworICAgICAgZ2Nvdl90eXBlIGNfbWVhbl9kaXN0ID0gY291bnRlcnNbaV07CisgICAgICBnY292X3R5cGUgY19tZWFuX3NpemUgPSBjb3VudGVyc1tpKzFdOworICAgICAgZ2Nvdl90eXBlIGNfY291bnQgPSBjb3VudGVyc1tpKzJdOworICAgICAgZ2Nvdl90eXBlIGNfZGlzdF94X3NpemUgPSBjb3VudGVyc1tpKzNdOworCisgICAgICAvKiBSZWFkIGFuZCBkZWNvZGUgdmFsdWVzIGluIGZpbGUuICAqLworICAgICAgZ2Nvdl90eXBlIGZfbWVhbl9kaXN0ID0gX19nY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGdjb3ZfdHlwZSBmX21lYW5fc2l6ZSA9IF9fZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7CisgICAgICBnY292X3R5cGUgZl9jb3VudCA9IF9fZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7CisgICAgICBnY292X3R5cGUgZl9kaXN0X3hfc2l6ZSA9IF9fZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7CisKKyAgICAgIC8qIENvbXB1dGUgYWdncmVnYXRlcy4gICovCisgICAgICBnY292X3R5cGUgYV9tZWFuX2Rpc3QgPSBfX2djb3Zfd2VpZ2h0ZWRfbWVhbjIgKAorICAgICAgICAgIGZfbWVhbl9kaXN0LCBmX2NvdW50LCBjX21lYW5fZGlzdCwgY19jb3VudCk7CisgICAgICBnY292X3R5cGUgYV9tZWFuX3NpemUgPSBfX2djb3Zfd2VpZ2h0ZWRfbWVhbjIgKAorICAgICAgICAgIGZfbWVhbl9zaXplLCBmX2NvdW50LCBjX21lYW5fc2l6ZSwgY19jb3VudCk7CisgICAgICBnY292X3R5cGUgYV9jb3VudCA9IGZfY291bnQgKyBjX2NvdW50OworICAgICAgZ2Nvdl90eXBlIGFfZGlzdF94X3NpemUgPSBmX2Rpc3RfeF9zaXplICsgY19kaXN0X3hfc2l6ZTsKKworICAgICAgLyogRW5jb2RlIGJhY2sgaW50byBjb3VudGVycy4gICovCisgICAgICBjb3VudGVyc1tpXSA9IGFfbWVhbl9kaXN0OworICAgICAgY291bnRlcnNbaSsxXSA9IGFfbWVhbl9zaXplOworICAgICAgY291bnRlcnNbaSsyXSA9IGFfY291bnQ7CisgICAgICBjb3VudGVyc1tpKzNdID0gYV9kaXN0X3hfc2l6ZTsKKyAgICB9Cit9CisKKyNlbmRpZgorCisjaWZkZWYgTF9nY292X21lcmdlX2RjCisKKy8qIFJldHVybnMgMSBpZiB0aGUgZnVuY3Rpb24gZ2xvYmFsIGlkIEdJRCBpcyBub3QgdmFsaWQuICAqLworCitzdGF0aWMgaW50CitfX2djb3ZfaXNfZ2lkX2luc2FuZSAoZ2Nvdl90eXBlIGdpZCkKK3sKKyAgaWYgKEVYVFJBQ1RfTU9EVUxFX0lEX0ZST01fR0xPQkFMX0lEIChnaWQpID09IDAKKyAgICAgIHx8IEVYVFJBQ1RfRlVOQ19JRF9GUk9NX0dMT0JBTF9JRCAoZ2lkKSA9PSAwKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLyogVGhlIHByb2ZpbGUgbWVyZ2luZyBmdW5jdGlvbiB1c2VkIGZvciBtZXJnaW5nIGRpcmVjdCBjYWxsIGNvdW50cworICAgVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiBhcnJheSBDT1VOVEVSUyBvZiBOX0NPVU5URVJTIG9sZCBjb3VudGVycyBhbmQgaXQKKyAgIHJlYWRzIHRoZSBzYW1lIG51bWJlciBvZiBjb3VudGVycyBmcm9tIHRoZSBnY292IGZpbGUuICAqLworCit2b2lkCitfX2djb3ZfbWVyZ2VfZGMgKGdjb3ZfdHlwZSAqY291bnRlcnMsIHVuc2lnbmVkIG5fY291bnRlcnMpCit7CisgIHVuc2lnbmVkIGk7CisKKyAgZ2NjX2Fzc2VydCAoIShuX2NvdW50ZXJzICUgMikpOworICBmb3IgKGkgPSAwOyBpIDwgbl9jb3VudGVyczsgaSArPSAyKQorICAgIHsKKyAgICAgIGdjb3ZfdHlwZSBnbG9iYWxfaWQgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGdjb3ZfdHlwZSBjYWxsX2NvdW50ID0gZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7CisKKyAgICAgIC8qIE5vdGUgdGhhdCBnbG9iYWwgaWQgY291bnRlciBtYXkgbmV2ZXIgaGF2ZSBiZWVuIHNldCBpZiBubyBjYWxscyB3ZXJlCisJIG1hZGUgZnJvbSB0aGlzIGNhbGwtc2l0ZS4gICovCisgICAgICBpZiAoY291bnRlcnNbaV0gJiYgZ2xvYmFsX2lkKQorICAgICAgICB7CisgICAgICAgICAgLyogVE9ETyByYWNlIGNvbmRpdGlvbiByZXF1aXJlcyB1cyBkbyB0aGUgZm9sbG93aW5nIGNvcnJlY3Rpb24uICAqLworICAgICAgICAgIGlmIChfX2djb3ZfaXNfZ2lkX2luc2FuZSAoY291bnRlcnNbaV0pKQorICAgICAgICAgICAgY291bnRlcnNbaV0gPSBnbG9iYWxfaWQ7CisgICAgICAgICAgZWxzZSBpZiAoX19nY292X2lzX2dpZF9pbnNhbmUgKGdsb2JhbF9pZCkpCisgICAgICAgICAgICBnbG9iYWxfaWQgPSBjb3VudGVyc1tpXTsKKworICAgICAgICAgIGdjY19hc3NlcnQgKGNvdW50ZXJzW2ldID09IGdsb2JhbF9pZCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGdsb2JhbF9pZCkKKwljb3VudGVyc1tpXSA9IGdsb2JhbF9pZDsKKworICAgICAgY291bnRlcnNbaSArIDFdICs9IGNhbGxfY291bnQ7CisKKyAgICAgIC8qIFJlc2V0LiAqLworICAgICAgaWYgKF9fZ2Nvdl9pc19naWRfaW5zYW5lIChjb3VudGVyc1tpXSkpCisgICAgICAgIGNvdW50ZXJzW2ldID0gY291bnRlcnNbaSArIDFdID0gMDsKKworICAgICAgLyogQXNzZXJ0IHRoYXQgdGhlIGludmFyaWFudCAoZ2xvYmFsX2lkID09IDApIDw9PT4gKGNhbGxfY291bnQgPT0gMCkKKwkgaG9sZHMgdHJ1ZSBhZnRlciBtZXJnaW5nLiAgKi8KKyAgICAgIGlmIChjb3VudGVyc1tpXSA9PSAwKQorICAgICAgICBjb3VudGVyc1tpKzFdID0gMDsKKyAgICAgIGlmIChjb3VudGVyc1tpICsgMV0gPT0gMCkKKyAgICAgICAgY291bnRlcnNbaV0gPSAwOworICAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgTF9nY292X21lcmdlX2ljYWxsX3RvcG4KKy8qIFRoZSBwcm9maWxlIG1lcmdpbmcgZnVuY3Rpb24gdXNlZCBmb3IgbWVyZ2luZyBpbmRpcmVjdCBjYWxsIGNvdW50cworICAgVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiBhcnJheSBDT1VOVEVSUyBvZiBOX0NPVU5URVJTIG9sZCBjb3VudGVycyBhbmQgaXQKKyAgIHJlYWRzIHRoZSBzYW1lIG51bWJlciBvZiBjb3VudGVycyBmcm9tIHRoZSBnY292IGZpbGUuICAqLworCit2b2lkCitfX2djb3ZfbWVyZ2VfaWNhbGxfdG9wbiAoZ2Nvdl90eXBlICpjb3VudGVycywgdW5zaWduZWQgbl9jb3VudGVycykKK3sKKyAgdW5zaWduZWQgaSwgaiwgaywgbTsKKworICBnY2NfYXNzZXJ0ICghKG5fY291bnRlcnMgJSBHQ09WX0lDQUxMX1RPUE5fTkNPVU5UUykpOworICBmb3IgKGkgPSAwOyBpIDwgbl9jb3VudGVyczsgaSArPSBHQ09WX0lDQUxMX1RPUE5fTkNPVU5UUykKKyAgICB7CisgICAgICBnY292X3R5cGUgKnZhbHVlX2FycmF5ID0gJmNvdW50ZXJzW2kgKyAxXTsKKyAgICAgIHVuc2lnbmVkIHRtcF9zaXplID0gMiAqIChHQ09WX0lDQUxMX1RPUE5fTkNPVU5UUyAtIDEpOworICAgICAgZ2Nvdl90eXBlICp0bXBfYXJyYXkgCisgICAgICAgICAgPSAoZ2Nvdl90eXBlICopIGFsbG9jYSAodG1wX3NpemUgKiBzaXplb2YgKGdjb3ZfdHlwZSkpOworCisgICAgICBmb3IgKGogPSAwOyBqIDwgdG1wX3NpemU7IGorKykKKyAgICAgICAgdG1wX2FycmF5W2pdID0gMDsKKworICAgICAgZm9yIChqID0gMDsgaiA8IEdDT1ZfSUNBTExfVE9QTl9OQ09VTlRTIC0gMTsgaiArPSAyKQorICAgICAgICB7CisgICAgICAgICAgdG1wX2FycmF5W2pdID0gdmFsdWVfYXJyYXlbal07CisgICAgICAgICAgdG1wX2FycmF5W2ogKyAxXSA9IHZhbHVlX2FycmF5IFtqICsgMV07CisgICAgICAgIH0KKworICAgICAgLyogU2tpcCB0aGUgbnVtYmVyX29mX2V2aWN0aW9uIGVudHJ5LiAgKi8KKyAgICAgIGdjb3ZfcmVhZF9jb3VudGVyICgpOworICAgICAgZm9yIChrID0gMDsgayA8IEdDT1ZfSUNBTExfVE9QTl9OQ09VTlRTIC0gMTsgayArPSAyKQorICAgICAgICB7CisgICAgICAgICAgaW50IGZvdW5kID0gMDsKKyAgICAgICAgICBnY292X3R5cGUgZ2xvYmFsX2lkID0gZ2Nvdl9yZWFkX2NvdW50ZXIgKCk7CisgICAgICAgICAgZ2Nvdl90eXBlIGNhbGxfY291bnQgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgajsgbSArPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAodG1wX2FycmF5W21dID09IGdsb2JhbF9pZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICB0bXBfYXJyYXlbbSArIDFdICs9IGNhbGxfY291bnQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdG1wX2FycmF5W2pdID0gZ2xvYmFsX2lkOworICAgICAgICAgICAgICB0bXBfYXJyYXlbaiArIDFdID0gY2FsbF9jb3VudDsKKyAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAvKiBOb3cgc29ydCB0aGUgdGVtcCBhcnJheSAqLworICAgICAgZ2Nvdl9zb3J0X25fdmFscyAodG1wX2FycmF5LCBqKTsKKworICAgICAgLyogTm93IGNvcHkgYmFjayB0aGUgdG9wIGhhbGYgb2YgdGhlIHRlbXAgYXJyYXkgKi8KKyAgICAgIGZvciAoayA9IDA7IGsgPCBHQ09WX0lDQUxMX1RPUE5fTkNPVU5UUyAtIDE7IGsgKz0gMikKKyAgICAgICAgeworICAgICAgICAgIHZhbHVlX2FycmF5W2tdID0gdG1wX2FycmF5W2tdOworICAgICAgICAgIHZhbHVlX2FycmF5W2sgKyAxXSA9IHRtcF9hcnJheVtrICsgMV07CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKKworCisjaWZkZWYgTF9nY292X21lcmdlX3NpbmdsZQorLyogVGhlIHByb2ZpbGUgbWVyZ2luZyBmdW5jdGlvbiBmb3IgY2hvb3NpbmcgdGhlIG1vc3QgY29tbW9uIHZhbHVlLgorICAgSXQgaXMgZ2l2ZW4gYW4gYXJyYXkgQ09VTlRFUlMgb2YgTl9DT1VOVEVSUyBvbGQgY291bnRlcnMgYW5kIGl0CisgICByZWFkcyB0aGUgc2FtZSBudW1iZXIgb2YgY291bnRlcnMgZnJvbSB0aGUgZ2NvdiBmaWxlLiAgVGhlIGNvdW50ZXJzCisgICBhcmUgc3BsaXQgaW50byAzLXR1cGxlcyB3aGVyZSB0aGUgbWVtYmVycyBvZiB0aGUgdHVwbGUgaGF2ZQorICAgbWVhbmluZ3M6CisKKyAgIC0tIHRoZSBzdG9yZWQgY2FuZGlkYXRlIG9uIHRoZSBtb3N0IGNvbW1vbiB2YWx1ZSBvZiB0aGUgbWVhc3VyZWQgZW50aXR5CisgICAtLSBjb3VudGVyCisgICAtLSB0b3RhbCBudW1iZXIgb2YgZXZhbHVhdGlvbnMgb2YgdGhlIHZhbHVlICAqLwordm9pZAorX19nY292X21lcmdlX3NpbmdsZSAoZ2Nvdl90eXBlICpjb3VudGVycywgdW5zaWduZWQgbl9jb3VudGVycykKK3sKKyAgdW5zaWduZWQgaSwgbl9tZWFzdXJlczsKKyAgZ2Nvdl90eXBlIHZhbHVlLCBjb3VudGVyLCBhbGw7CisKKyAgZ2NjX2Fzc2VydCAoIShuX2NvdW50ZXJzICUgMykpOworICBuX21lYXN1cmVzID0gbl9jb3VudGVycyAvIDM7CisgIGZvciAoaSA9IDA7IGkgPCBuX21lYXN1cmVzOyBpKyssIGNvdW50ZXJzICs9IDMpCisgICAgeworICAgICAgdmFsdWUgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGNvdW50ZXIgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGFsbCA9IGdjb3ZfcmVhZF9jb3VudGVyICgpOworCisgICAgICBpZiAoY291bnRlcnNbMF0gPT0gdmFsdWUpCisJY291bnRlcnNbMV0gKz0gY291bnRlcjsKKyAgICAgIGVsc2UgaWYgKGNvdW50ZXIgPiBjb3VudGVyc1sxXSkKKwl7CisJICBjb3VudGVyc1swXSA9IHZhbHVlOworCSAgY291bnRlcnNbMV0gPSBjb3VudGVyIC0gY291bnRlcnNbMV07CisJfQorICAgICAgZWxzZQorCWNvdW50ZXJzWzFdIC09IGNvdW50ZXI7CisgICAgICBjb3VudGVyc1syXSArPSBhbGw7CisgICAgfQorfQorI2VuZGlmIC8qIExfZ2Nvdl9tZXJnZV9zaW5nbGUgKi8KKworI2lmZGVmIExfZ2Nvdl9tZXJnZV9kZWx0YQorLyogVGhlIHByb2ZpbGUgbWVyZ2luZyBmdW5jdGlvbiBmb3IgY2hvb3NpbmcgdGhlIG1vc3QgY29tbW9uCisgICBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGV2YWx1YXRpb25zIG9mIHRoZSB2YWx1ZS4gIEl0IGlzCisgICBnaXZlbiBhbiBhcnJheSBDT1VOVEVSUyBvZiBOX0NPVU5URVJTIG9sZCBjb3VudGVycyBhbmQgaXQgcmVhZHMgdGhlCisgICBzYW1lIG51bWJlciBvZiBjb3VudGVycyBmcm9tIHRoZSBnY292IGZpbGUuICBUaGUgY291bnRlcnMgYXJlIHNwbGl0CisgICBpbnRvIDQtdHVwbGVzIHdoZXJlIHRoZSBtZW1iZXJzIG9mIHRoZSB0dXBsZSBoYXZlIG1lYW5pbmdzOgorCisgICAtLSB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgbWVhc3VyZWQgZW50aXR5CisgICAtLSB0aGUgc3RvcmVkIGNhbmRpZGF0ZSBvbiB0aGUgbW9zdCBjb21tb24gZGlmZmVyZW5jZQorICAgLS0gY291bnRlcgorICAgLS0gdG90YWwgbnVtYmVyIG9mIGV2YWx1YXRpb25zIG9mIHRoZSB2YWx1ZSAgKi8KK3ZvaWQKK19fZ2Nvdl9tZXJnZV9kZWx0YSAoZ2Nvdl90eXBlICpjb3VudGVycywgdW5zaWduZWQgbl9jb3VudGVycykKK3sKKyAgdW5zaWduZWQgaSwgbl9tZWFzdXJlczsKKyAgZ2Nvdl90eXBlIHZhbHVlLCBjb3VudGVyLCBhbGw7CisKKyAgZ2NjX2Fzc2VydCAoIShuX2NvdW50ZXJzICUgNCkpOworICBuX21lYXN1cmVzID0gbl9jb3VudGVycyAvIDQ7CisgIGZvciAoaSA9IDA7IGkgPCBuX21lYXN1cmVzOyBpKyssIGNvdW50ZXJzICs9IDQpCisgICAgeworICAgICAgLyogbGFzdCA9ICovIGdjb3ZfcmVhZF9jb3VudGVyICgpOworICAgICAgdmFsdWUgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGNvdW50ZXIgPSBnY292X3JlYWRfY291bnRlciAoKTsKKyAgICAgIGFsbCA9IGdjb3ZfcmVhZF9jb3VudGVyICgpOworCisgICAgICBpZiAoY291bnRlcnNbMV0gPT0gdmFsdWUpCisJY291bnRlcnNbMl0gKz0gY291bnRlcjsKKyAgICAgIGVsc2UgaWYgKGNvdW50ZXIgPiBjb3VudGVyc1syXSkKKwl7CisJICBjb3VudGVyc1sxXSA9IHZhbHVlOworCSAgY291bnRlcnNbMl0gPSBjb3VudGVyIC0gY291bnRlcnNbMl07CisJfQorICAgICAgZWxzZQorCWNvdW50ZXJzWzJdIC09IGNvdW50ZXI7CisgICAgICBjb3VudGVyc1szXSArPSBhbGw7CisgICAgfQorfQorI2VuZGlmIC8qIExfZ2Nvdl9tZXJnZV9kZWx0YSAqLworCisjaWZkZWYgTF9nY292X2ludGVydmFsX3Byb2ZpbGVyCisvKiBJZiBWQUxVRSBpcyBpbiBpbnRlcnZhbCA8U1RBUlQsIFNUQVJUICsgU1RFUFMgLSAxPiwgdGhlbiBpbmNyZWFzZXMgdGhlCisgICBjb3JyZXNwb25kaW5nIGNvdW50ZXIgaW4gQ09VTlRFUlMuICBJZiB0aGUgVkFMVUUgaXMgYWJvdmUgb3IgYmVsb3cKKyAgIHRoZSBpbnRlcnZhbCwgQ09VTlRFUlNbU1RFUFNdIG9yIENPVU5URVJTW1NURVBTICsgMV0gaXMgaW5jcmVhc2VkCisgICBpbnN0ZWFkLiAgKi8KKwordm9pZAorX19nY292X2ludGVydmFsX3Byb2ZpbGVyIChnY292X3R5cGUgKmNvdW50ZXJzLCBnY292X3R5cGUgdmFsdWUsCisJCQkgIGludCBzdGFydCwgdW5zaWduZWQgc3RlcHMpCit7CisgIGdjb3ZfdHlwZSBkZWx0YSA9IHZhbHVlIC0gc3RhcnQ7CisgIGlmIChkZWx0YSA8IDApCisgICAgY291bnRlcnNbc3RlcHMgKyAxXSsrOworICBlbHNlIGlmIChkZWx0YSA+PSBzdGVwcykKKyAgICBjb3VudGVyc1tzdGVwc10rKzsKKyAgZWxzZQorICAgIGNvdW50ZXJzW2RlbHRhXSsrOworfQorI2VuZGlmCisKKyNpZmRlZiBMX2djb3ZfcG93Ml9wcm9maWxlcgorLyogSWYgVkFMVUUgaXMgYSBwb3dlciBvZiB0d28sIENPVU5URVJTWzFdIGlzIGluY3JlbWVudGVkLiAgT3RoZXJ3aXNlCisgICBDT1VOVEVSU1swXSBpcyBpbmNyZW1lbnRlZC4gICovCisKK3ZvaWQKK19fZ2Nvdl9wb3cyX3Byb2ZpbGVyIChnY292X3R5cGUgKmNvdW50ZXJzLCBnY292X3R5cGUgdmFsdWUpCit7CisgIGlmICh2YWx1ZSAmICh2YWx1ZSAtIDEpKQorICAgIGNvdW50ZXJzWzBdKys7CisgIGVsc2UKKyAgICBjb3VudGVyc1sxXSsrOworfQorI2VuZGlmCisKKy8qIFRyaWVzIHRvIGRldGVybWluZSB0aGUgbW9zdCBjb21tb24gdmFsdWUgYW1vbmcgaXRzIGlucHV0cy4gIENoZWNrcyBpZiB0aGUKKyAgIHZhbHVlIHN0b3JlZCBpbiBDT1VOVEVSU1swXSBtYXRjaGVzIFZBTFVFLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgQ09VTlRFUlNbMV0KKyAgIGlzIGluY3JlbWVudGVkLiAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgYW5kIENPVU5URVJTWzFdIGlzIG5vdCB6ZXJvLAorICAgQ09VTlRFUlNbMV0gaXMgZGVjcmVtZW50ZWQuICBPdGhlcndpc2UgQ09VTlRFUlNbMV0gaXMgc2V0IHRvIG9uZSBhbmQKKyAgIFZBTFVFIGlzIHN0b3JlZCB0byBDT1VOVEVSU1swXS4gIFRoaXMgYWxnb3JpdGhtIGd1YXJhbnRlZXMgdGhhdCBpZiB0aGlzCisgICBmdW5jdGlvbiBpcyBjYWxsZWQgbW9yZSB0aGFuIDUwJSBvZiB0aGUgdGltZSB3aXRoIG9uZSB2YWx1ZSwgdGhpcyB2YWx1ZQorICAgd2lsbCBiZSBpbiBDT1VOVEVSU1swXSBpbiB0aGUgZW5kLgorCisgICBJbiBhbnkgY2FzZSwgQ09VTlRFUlNbMl0gaXMgaW5jcmVtZW50ZWQuICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ2Nvdl9vbmVfdmFsdWVfcHJvZmlsZXJfYm9keSAoZ2Nvdl90eXBlICpjb3VudGVycywgZ2Nvdl90eXBlIHZhbHVlKQoreworICBpZiAodmFsdWUgPT0gY291bnRlcnNbMF0pCisgICAgY291bnRlcnNbMV0rKzsKKyAgZWxzZSBpZiAoY291bnRlcnNbMV0gPT0gMCkKKyAgICB7CisgICAgICBjb3VudGVyc1sxXSA9IDE7CisgICAgICBjb3VudGVyc1swXSA9IHZhbHVlOworICAgIH0KKyAgZWxzZQorICAgIGNvdW50ZXJzWzFdLS07CisgIGNvdW50ZXJzWzJdKys7Cit9CisKKyNpZmRlZiBMX2djb3ZfaW5kaXJlY3RfY2FsbF90b3BuX3Byb2ZpbGVyCisvKiBUcmllcyB0byBrZWVwIHRyYWNrIHRoZSBtb3N0IGZyZXF1ZW50IE4gdmFsdWVzIGluIHRoZSBjb3VudGVycyB3aGVyZQorICAgTiBpcyBzcGVjaWZpZWQgYnkgcGFyYW1ldGVyIFRPUE5fVkFMLiBUbyB0cmFjayB0b3AgTiB2YWx1ZXMsIDIqTiBjb3VudGVyCisgICBlbnRyaWVzIGFyZSB1c2VkLgorICAgY291bnRlclswXSAtLS0gdGhlIGFjY3VtYXRpdmUgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyBvbmUgZW50cnkgaW4KKyAgICAgICAgICAgICAgICAgIGluIHRoZSBjb3VudGVycyBnZXRzIGV2aWN0ZWQvcmVwbGFjZWQgZHVlIHRvIGxpbWl0ZWQgY2FwYWNpdHkuCisgICAgICAgICAgICAgICAgICBXaGVuIHRoaXMgdmFsdWUgcmVhY2hlcyBhIHRocmVzaG9sZCwgdGhlIGJvdHRvbSBOIHZhbHVlcyBhcmUKKyAgICAgICAgICAgICAgICAgIGNsZWFyZWQuCisgICBjb3VudGVyWzFdIHRocm91Z2ggY291bnRlclsyKk5dIHJlY29yZHMgdGhlIHRvcCAyKk4gdmFsdWVzIGNvbGxlY3RlZCBzbyBmYXIuCisgICBFYWNoIHZhbHVlIGlzIHJlcHJlc2VudGVkIGJ5IHR3byBlbnRyaWVzOiBjb3VudFsyKmkrMV0gaXMgdGhlIGl0aCB2YWx1ZSwgYW5kCisgICBjb3VudFsyKmkrMl0gaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWUgaXMgc2Vlbi4gICovCisKK3N0YXRpYyB2b2lkCitfX2djb3ZfdG9wbl92YWx1ZV9wcm9maWxlcl9ib2R5IChnY292X3R5cGUgKmNvdW50ZXJzLCBnY292X3R5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY292X3Vuc2lnbmVkX3QgdG9wbl92YWwpCit7CisgICB1bnNpZ25lZCBpLCBmb3VuZCA9IDAsIGhhdmVfemVyb19jb3VudCA9IDA7CisKKyAgIGdjb3ZfdHlwZSAqZW50cnk7CisgICBnY292X3R5cGUgKmxmdV9lbnRyeSA9ICZjb3VudGVyc1sxXTsKKyAgIGdjb3ZfdHlwZSAqdmFsdWVfYXJyYXkgPSAmY291bnRlcnNbMV07CisgICBnY292X3R5cGUgKm51bV9ldmljdGlvbiA9ICZjb3VudGVyc1swXTsKKworICAgLyogVGhlcmUgYXJlIDIqdG9wbl92YWwgdmFsdWVzIHRyYWNrZWQsIGVhY2ggdmFsdWUgdGFrZXMgdHdvIHNsb3RzIGluIHRoZQorICAgICAgY291bnRlciBhcnJheSAqLworICAgZm9yICggaSA9IDA7IGkgPCAodG9wbl92YWwgPDwgMik7IGkgKz0gMikKKyAgICAgeworICAgICAgIGVudHJ5ID0gJnZhbHVlX2FycmF5W2ldOworICAgICAgIGlmICggZW50cnlbMF0gPT0gdmFsdWUpCisgICAgICAgICB7CisgICAgICAgICAgIGVudHJ5WzFdKysgOworICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgIGVsc2UgaWYgKGVudHJ5WzFdID09IDApCisgICAgICAgICB7CisgICAgICAgICAgIGxmdV9lbnRyeSA9IGVudHJ5OworICAgICAgICAgICBoYXZlX3plcm9fY291bnQgPSAxOworICAgICAgICAgfQorICAgICAgZWxzZSBpZiAoZW50cnlbMV0gPCBsZnVfZW50cnlbMV0pCisgICAgICAgIGxmdV9lbnRyeSA9IGVudHJ5OworICAgICB9CisKKyAgIGlmIChmb3VuZCkKKyAgICAgcmV0dXJuOworCisgICAvKiBsZnVfZW50cnkgaXMgZWl0aGVyIGFuIGVtcHR5IGVudHJ5IG9yIGFuIGVudHJ5CisgICAgICB3aXRoIGxvd2VzdCBjb3VudCwgd2hpY2ggd2lsbCBiZSBldmljdGVkLiAgKi8KKyAgIGxmdV9lbnRyeVswXSA9IHZhbHVlOworICAgbGZ1X2VudHJ5WzFdID0gMTsKKworI2RlZmluZSBHQ09WX0lDQUxMX0NPVU5URVJfQ0xFQVJfVEhSRVNIT0xEIDMwMDAKKworICAgLyogVG9vIG1hbnkgZXZpY3Rpb25zIC0tIHRpbWUgdG8gY2xlYXIgYm90dG9tIGVudHJpZXMgdG8gCisgICAgICBhdm9pZCBob3QgdmFsdWVzIGJ1bXBpbmcgZWFjaCBvdGhlciBvdXQuICAqLworICAgaWYgKCAhaGF2ZV96ZXJvX2NvdW50IAorICAgICAgICAmJiArKypudW1fZXZpY3Rpb24gPj0gR0NPVl9JQ0FMTF9DT1VOVEVSX0NMRUFSX1RIUkVTSE9MRCkKKyAgICAgeworICAgICAgIHVuc2lnbmVkIGksIGo7CisgICAgICAgZ2Nvdl90eXBlICpwLCBtaW52OworICAgICAgIGdjb3ZfdHlwZSogdG1wX2NudHMgCisgICAgICAgICAgID0gKGdjb3ZfdHlwZSAqKWFsbG9jYSAodG9wbl92YWwgKiBzaXplb2YoZ2Nvdl90eXBlKSk7CisKKyAgICAgICAqbnVtX2V2aWN0aW9uID0gMDsKKworICAgICAgIGZvciAoIGkgPSAwOyBpIDwgdG9wbl92YWw7IGkrKyApCisgICAgICAgICB0bXBfY250c1tpXSA9IDA7CisKKyAgICAgICAvKiBGaW5kIHRoZSBsYXJnZXN0IHRvcG5fdmFsIHZhbHVlcyBmcm9tIHRoZSBncm91cCBvZgorICAgICAgICAgIDIqdG9wbl92YWwgdmFsdWVzIGFuZCBwdXQgdGhlbSBpbnRvIHRtcF9jbnRzLiAqLworCisgICAgICAgZm9yICggaSA9IDA7IGkgPCAyICogdG9wbl92YWw7IGkgKz0gMiApIAorICAgICAgICAgeworICAgICAgICAgICBwID0gMDsKKyAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCB0b3BuX3ZhbDsgaisrICkgCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCAhcCB8fCB0bXBfY250c1tqXSA8ICpwICkgCisgICAgICAgICAgICAgICAgICBwID0gJnRtcF9jbnRzW2pdOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggdmFsdWVfYXJyYXlbaSArIDFdID4gKnAgKQorICAgICAgICAgICAgICAqcCA9IHZhbHVlX2FycmF5W2kgKyAxXTsKKyAgICAgICAgIH0KKworICAgICAgIG1pbnYgPSB0bXBfY250c1swXTsKKyAgICAgICBmb3IgKCBqID0gMTsgaiA8IHRvcG5fdmFsOyBqKysgKQorICAgICAgICAgeworICAgICAgICAgICBpZiAodG1wX2NudHNbal0gPCBtaW52KQorICAgICAgICAgICAgIG1pbnYgPSB0bXBfY250c1tqXTsKKyAgICAgICAgIH0KKyAgICAgICAvKiBaZXJvIG91dCBsb3cgdmFsdWUgZW50cmllcyAgKi8KKyAgICAgICBmb3IgKCBpID0gMDsgaSA8IDIgKiB0b3BuX3ZhbDsgaSArPSAyICkKKyAgICAgICAgIHsKKyAgICAgICAgICAgaWYgKHZhbHVlX2FycmF5W2kgKyAxXSA8IG1pbnYpIAorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHZhbHVlX2FycmF5W2ldID0gMDsKKyAgICAgICAgICAgICAgIHZhbHVlX2FycmF5W2kgKyAxXSA9IDA7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9Cit9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9vbmVfdmFsdWVfcHJvZmlsZXIKK3ZvaWQKK19fZ2Nvdl9vbmVfdmFsdWVfcHJvZmlsZXIgKGdjb3ZfdHlwZSAqY291bnRlcnMsIGdjb3ZfdHlwZSB2YWx1ZSkKK3sKKyAgX19nY292X29uZV92YWx1ZV9wcm9maWxlcl9ib2R5IChjb3VudGVycywgdmFsdWUpOworfQorI2VuZGlmCisKKyNpZmRlZiBMX2djb3ZfaW5kaXJlY3RfY2FsbF9wcm9maWxlcgorCisvKiBCeSBkZWZhdWx0LCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgdXNlIGZ1bmN0aW9uIGFkZHJlc3NlcyBpbiB0aGUKKyAgIHZ0YWJsZSBlbnRyaWVzLiAgU2V0dGluZyBUQVJHRVRfVlRBQkxFX1VTRVNfREVTQ1JJUFRPUlMgdG8gbm9uemVybworICAgdGVsbHMgdGhlIGNvbXBpbGVyIHRvIHVzZSBmdW5jdGlvbiBkZXNjcmlwdG9ycyBpbnN0ZWFkLiAgVGhlIHZhbHVlCisgICBvZiB0aGlzIG1hY3JvIHNheXMgaG93IG1hbnkgd29yZHMgd2lkZSB0aGUgZGVzY3JpcHRvciBpcyAobm9ybWFsbHkgMiksCisgICBidXQgaXQgbWF5IGJlIGRlcGVuZGVudCBvbiB0YXJnZXQgZmxhZ3MuICBTaW5jZSB3ZSBkbyBub3QgaGF2ZSBhY2Nlc3MKKyAgIHRvIHRoZSB0YXJnZXQgZmxhZ3MgaGVyZSB3ZSBqdXN0IGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBzZXQgYW5kIHVzZQorICAgdGhhdCB0byBzZXQgVlRBQkxFX1VTRVNfREVTQ1JJUFRPUlMgdG8gMCBvciAxLgorCisgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiBkZXNjcmlwdG9yIG1heSBiZSB0cmVhdGVkCisgICBhcyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbi4gICovCisKKyNpZmRlZiBUQVJHRVRfVlRBQkxFX1VTRVNfREVTQ1JJUFRPUlMKKyNkZWZpbmUgVlRBQkxFX1VTRVNfREVTQ1JJUFRPUlMgMQorI2Vsc2UKKyNkZWZpbmUgVlRBQkxFX1VTRVNfREVTQ1JJUFRPUlMgMAorI2VuZGlmCisKKy8qIFRyaWVzIHRvIGRldGVybWluZSB0aGUgbW9zdCBjb21tb24gdmFsdWUgYW1vbmcgaXRzIGlucHV0cy4gKi8KK3ZvaWQKK19fZ2Nvdl9pbmRpcmVjdF9jYWxsX3Byb2ZpbGVyIChnY292X3R5cGUqIGNvdW50ZXIsIGdjb3ZfdHlwZSB2YWx1ZSwKKwkJCSAgICAgICB2b2lkKiBjdXJfZnVuYywgdm9pZCogY2FsbGVlX2Z1bmMpCit7CisgIC8qIElmIHRoZSBDKysgdmlydHVhbCB0YWJsZXMgY29udGFpbiBmdW5jdGlvbiBkZXNjcmlwdG9ycyB0aGVuIG9uZQorICAgICBmdW5jdGlvbiBtYXkgaGF2ZSBtdWx0aXBsZSBkZXNjcmlwdG9ycyBhbmQgd2UgbmVlZCB0byBkZXJlZmVyZW5jZQorICAgICB0aGUgZGVzY3JpcHRvcnMgdG8gc2VlIGlmIHRoZXkgcG9pbnQgdG8gdGhlIHNhbWUgZnVuY3Rpb24uICAqLworICBpZiAoY3VyX2Z1bmMgPT0gY2FsbGVlX2Z1bmMKKyAgICAgIHx8IChWVEFCTEVfVVNFU19ERVNDUklQVE9SUyAmJiBjYWxsZWVfZnVuYworCSAgJiYgKih2b2lkICoqKSBjdXJfZnVuYyA9PSAqKHZvaWQgKiopIGNhbGxlZV9mdW5jKSkKKyAgICBfX2djb3Zfb25lX3ZhbHVlX3Byb2ZpbGVyX2JvZHkgKGNvdW50ZXIsIHZhbHVlKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBMX2djb3ZfaW5kaXJlY3RfY2FsbF90b3BuX3Byb2ZpbGVyCitleHRlcm4gVEhSRUFEX1BSRUZJWCBnY292X3R5cGUgKl9fZ2Nvdl9pbmRpcmVjdF9jYWxsX3RvcG5fY291bnRlcnMgQVRUUklCVVRFX0hJRERFTjsKK2V4dGVybiBUSFJFQURfUFJFRklYIHZvaWQgKl9fZ2Nvdl9pbmRpcmVjdF9jYWxsX3RvcG5fY2FsbGVlIEFUVFJJQlVURV9ISURERU47CisjaWZkZWYgVEFSR0VUX1ZUQUJMRV9VU0VTX0RFU0NSSVBUT1JTCisjZGVmaW5lIFZUQUJMRV9VU0VTX0RFU0NSSVBUT1JTIDEKKyNlbHNlCisjZGVmaW5lIFZUQUJMRV9VU0VTX0RFU0NSSVBUT1JTIDAKKyNlbmRpZgordm9pZAorX19nY292X2luZGlyZWN0X2NhbGxfdG9wbl9wcm9maWxlciAodm9pZCAqY3VyX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjdXJfbW9kdWxlX2djb3ZfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3ZfdW5zaWduZWRfdCBjdXJfZnVuY19pZCkKK3sKKyAgdm9pZCAqY2FsbGVlX2Z1bmMgPSBfX2djb3ZfaW5kaXJlY3RfY2FsbF90b3BuX2NhbGxlZTsKKyAgZ2Nvdl90eXBlICpjb3VudGVyID0gX19nY292X2luZGlyZWN0X2NhbGxfdG9wbl9jb3VudGVyczsKKyAgLyogSWYgdGhlIEMrKyB2aXJ0dWFsIHRhYmxlcyBjb250YWluIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIHRoZW4gb25lCisgICAgIGZ1bmN0aW9uIG1heSBoYXZlIG11bHRpcGxlIGRlc2NyaXB0b3JzIGFuZCB3ZSBuZWVkIHRvIGRlcmVmZXJlbmNlCisgICAgIHRoZSBkZXNjcmlwdG9ycyB0byBzZWUgaWYgdGhleSBwb2ludCB0byB0aGUgc2FtZSBmdW5jdGlvbi4gICovCisgIGlmIChjdXJfZnVuYyA9PSBjYWxsZWVfZnVuYworICAgICAgfHwgKFZUQUJMRV9VU0VTX0RFU0NSSVBUT1JTICYmIGNhbGxlZV9mdW5jCisJICAmJiAqKHZvaWQgKiopIGN1cl9mdW5jID09ICoodm9pZCAqKikgY2FsbGVlX2Z1bmMpKQorICAgIHsKKyAgICAgIGdjb3ZfdHlwZSBnbG9iYWxfaWQgCisgICAgICAgICAgPSAoKHN0cnVjdCBnY292X2luZm8gKikgY3VyX21vZHVsZV9nY292X2luZm8pLT5tb2RfaW5mby0+aWRlbnQ7CisgICAgICBnbG9iYWxfaWQgPSBHRU5fRlVOQ19HTE9CQUxfSUQgKGdsb2JhbF9pZCwgY3VyX2Z1bmNfaWQpOworICAgICAgX19nY292X3RvcG5fdmFsdWVfcHJvZmlsZXJfYm9keSAoY291bnRlciwgZ2xvYmFsX2lkLCBHQ09WX0lDQUxMX1RPUE5fVkFMKTsKKyAgICAgIF9fZ2Nvdl9pbmRpcmVjdF9jYWxsX3RvcG5fY2FsbGVlID0gMDsKKyAgICB9Cit9CisKKyNlbmRpZgorCisjaWZkZWYgTF9nY292X2RpcmVjdF9jYWxsX3Byb2ZpbGVyCitleHRlcm4gVEhSRUFEX1BSRUZJWCBnY292X3R5cGUgKl9fZ2Nvdl9kaXJlY3RfY2FsbF9jb3VudGVycyBBVFRSSUJVVEVfSElEREVOOworZXh0ZXJuIFRIUkVBRF9QUkVGSVggdm9pZCAqX19nY292X2RpcmVjdF9jYWxsX2NhbGxlZSBBVFRSSUJVVEVfSElEREVOOworLyogRGlyZWN0IGNhbGwgcHJvZmlsZXIuICovCit2b2lkCitfX2djb3ZfZGlyZWN0X2NhbGxfcHJvZmlsZXIgKHZvaWQgKmN1cl9mdW5jLAorCQkJICAgICB2b2lkICpjdXJfbW9kdWxlX2djb3ZfaW5mbywKKwkJCSAgICAgZ2Nvdl91bnNpZ25lZF90IGN1cl9mdW5jX2lkKQoreworICBpZiAoY3VyX2Z1bmMgPT0gX19nY292X2RpcmVjdF9jYWxsX2NhbGxlZSkKKyAgICB7CisgICAgICBnY292X3R5cGUgZ2xvYmFsX2lkIAorICAgICAgICAgID0gKChzdHJ1Y3QgZ2Nvdl9pbmZvICopIGN1cl9tb2R1bGVfZ2Nvdl9pbmZvKS0+bW9kX2luZm8tPmlkZW50OworICAgICAgZ2xvYmFsX2lkID0gR0VOX0ZVTkNfR0xPQkFMX0lEIChnbG9iYWxfaWQsIGN1cl9mdW5jX2lkKTsKKyAgICAgIF9fZ2Nvdl9kaXJlY3RfY2FsbF9jb3VudGVyc1swXSA9IGdsb2JhbF9pZDsKKyAgICAgIF9fZ2Nvdl9kaXJlY3RfY2FsbF9jb3VudGVyc1sxXSsrOworICAgICAgX19nY292X2RpcmVjdF9jYWxsX2NhbGxlZSA9IDA7CisgICAgfQorfQorI2VuZGlmCisKKworI2lmZGVmIExfZ2Nvdl9hdmVyYWdlX3Byb2ZpbGVyCisvKiBJbmNyZWFzZSBjb3JyZXNwb25kaW5nIENPVU5URVIgYnkgVkFMVUUuICBGSVhNRTogUGVyaGFwcyB3ZSB3YW50CisgICB0byBzYXR1cmF0ZSB1cC4gICovCisKK3ZvaWQKK19fZ2Nvdl9hdmVyYWdlX3Byb2ZpbGVyIChnY292X3R5cGUgKmNvdW50ZXJzLCBnY292X3R5cGUgdmFsdWUpCit7CisgIGNvdW50ZXJzWzBdICs9IHZhbHVlOworICBjb3VudGVyc1sxXSArKzsKK30KKyNlbmRpZgorCisjaWZkZWYgTF9nY292X2lvcl9wcm9maWxlcgorLyogSW5jcmVhc2UgY29ycmVzcG9uZGluZyBDT1VOVEVSIGJ5IFZBTFVFLiAgRklYTUU6IFBlcmhhcHMgd2Ugd2FudAorICAgdG8gc2F0dXJhdGUgdXAuICAqLworCit2b2lkCitfX2djb3ZfaW9yX3Byb2ZpbGVyIChnY292X3R5cGUgKmNvdW50ZXJzLCBnY292X3R5cGUgdmFsdWUpCit7CisgICpjb3VudGVycyB8PSB2YWx1ZTsKK30KKyNlbmRpZgorCisjaWZkZWYgTF9nY292X2ZvcmsKKy8qIEEgd3JhcHBlciBmb3IgdGhlIGZvcmsgZnVuY3Rpb24uICBGbHVzaGVzIHRoZSBhY2N1bXVsYXRlZCBwcm9maWxpbmcgZGF0YSwgc28KKyAgIHRoYXQgdGhleSBhcmUgbm90IGNvdW50ZWQgdHdpY2UuICAqLworCitwaWRfdAorX19nY292X2ZvcmsgKHZvaWQpCit7CisgIF9fZ2Nvdl9mbHVzaCAoKTsKKyAgcmV0dXJuIGZvcmsgKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9leGVjbAorLyogQSB3cmFwcGVyIGZvciB0aGUgZXhlY2wgZnVuY3Rpb24uICBGbHVzaGVzIHRoZSBhY2N1bXVsYXRlZCBwcm9maWxpbmcgZGF0YSwgc28KKyAgIHRoYXQgdGhleSBhcmUgbm90IGxvc3QuICAqLworCitpbnQKK19fZ2Nvdl9leGVjbCAoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqYXJnLCAuLi4pCit7CisgIHZhX2xpc3QgYXAsIGFxOworICB1bnNpZ25lZCBpLCBsZW5ndGg7CisgIGNoYXIgKiphcmdzOworCisgIF9fZ2Nvdl9mbHVzaCAoKTsKKworICB2YV9zdGFydCAoYXAsIGFyZyk7CisgIHZhX2NvcHkgKGFxLCBhcCk7CisKKyAgbGVuZ3RoID0gMjsKKyAgd2hpbGUgKHZhX2FyZyAoYXAsIGNoYXIgKikpCisgICAgbGVuZ3RoKys7CisgIHZhX2VuZCAoYXApOworCisgIGFyZ3MgPSAoY2hhciAqKikgYWxsb2NhIChsZW5ndGggKiBzaXplb2YgKHZvaWQgKikpOworICBhcmdzWzBdID0gYXJnOworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgYXJnc1tpXSA9IHZhX2FyZyAoYXEsIGNoYXIgKik7CisgIHZhX2VuZCAoYXEpOworCisgIHJldHVybiBleGVjdiAocGF0aCwgYXJncyk7Cit9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9leGVjbHAKKy8qIEEgd3JhcHBlciBmb3IgdGhlIGV4ZWNscCBmdW5jdGlvbi4gIEZsdXNoZXMgdGhlIGFjY3VtdWxhdGVkIHByb2ZpbGluZyBkYXRhLCBzbworICAgdGhhdCB0aGV5IGFyZSBub3QgbG9zdC4gICovCisKK2ludAorX19nY292X2V4ZWNscCAoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqYXJnLCAuLi4pCit7CisgIHZhX2xpc3QgYXAsIGFxOworICB1bnNpZ25lZCBpLCBsZW5ndGg7CisgIGNoYXIgKiphcmdzOworCisgIF9fZ2Nvdl9mbHVzaCAoKTsKKworICB2YV9zdGFydCAoYXAsIGFyZyk7CisgIHZhX2NvcHkgKGFxLCBhcCk7CisKKyAgbGVuZ3RoID0gMjsKKyAgd2hpbGUgKHZhX2FyZyAoYXAsIGNoYXIgKikpCisgICAgbGVuZ3RoKys7CisgIHZhX2VuZCAoYXApOworCisgIGFyZ3MgPSAoY2hhciAqKikgYWxsb2NhIChsZW5ndGggKiBzaXplb2YgKHZvaWQgKikpOworICBhcmdzWzBdID0gYXJnOworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgYXJnc1tpXSA9IHZhX2FyZyAoYXEsIGNoYXIgKik7CisgIHZhX2VuZCAoYXEpOworCisgIHJldHVybiBleGVjdnAgKHBhdGgsIGFyZ3MpOworfQorI2VuZGlmCisKKyNpZmRlZiBMX2djb3ZfZXhlY2xlCisvKiBBIHdyYXBwZXIgZm9yIHRoZSBleGVjbGUgZnVuY3Rpb24uICBGbHVzaGVzIHRoZSBhY2N1bXVsYXRlZCBwcm9maWxpbmcgZGF0YSwgc28KKyAgIHRoYXQgdGhleSBhcmUgbm90IGxvc3QuICAqLworCitpbnQKK19fZ2Nvdl9leGVjbGUgKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKmFyZywgLi4uKQoreworICB2YV9saXN0IGFwLCBhcTsKKyAgdW5zaWduZWQgaSwgbGVuZ3RoOworICBjaGFyICoqYXJnczsKKyAgY2hhciAqKmVudnA7CisKKyAgX19nY292X2ZsdXNoICgpOworCisgIHZhX3N0YXJ0IChhcCwgYXJnKTsKKyAgdmFfY29weSAoYXEsIGFwKTsKKworICBsZW5ndGggPSAyOworICB3aGlsZSAodmFfYXJnIChhcCwgY2hhciAqKSkKKyAgICBsZW5ndGgrKzsKKyAgdmFfZW5kIChhcCk7CisKKyAgYXJncyA9IChjaGFyICoqKSBhbGxvY2EgKGxlbmd0aCAqIHNpemVvZiAodm9pZCAqKSk7CisgIGFyZ3NbMF0gPSBhcmc7CisgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykKKyAgICBhcmdzW2ldID0gdmFfYXJnIChhcSwgY2hhciAqKTsKKyAgZW52cCA9IHZhX2FyZyAoYXEsIGNoYXIgKiopOworICB2YV9lbmQgKGFxKTsKKworICByZXR1cm4gZXhlY3ZlIChwYXRoLCBhcmdzLCBlbnZwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgTF9nY292X2V4ZWN2CisvKiBBIHdyYXBwZXIgZm9yIHRoZSBleGVjdiBmdW5jdGlvbi4gIEZsdXNoZXMgdGhlIGFjY3VtdWxhdGVkIHByb2ZpbGluZyBkYXRhLCBzbworICAgdGhhdCB0aGV5IGFyZSBub3QgbG9zdC4gICovCisKK2ludAorX19nY292X2V4ZWN2IChjb25zdCBjaGFyICpwYXRoLCBjaGFyICpjb25zdCBhcmd2W10pCit7CisgIF9fZ2Nvdl9mbHVzaCAoKTsKKyAgcmV0dXJuIGV4ZWN2IChwYXRoLCBhcmd2KTsKK30KKyNlbmRpZgorCisjaWZkZWYgTF9nY292X2V4ZWN2cAorLyogQSB3cmFwcGVyIGZvciB0aGUgZXhlY3ZwIGZ1bmN0aW9uLiAgRmx1c2hlcyB0aGUgYWNjdW11bGF0ZWQgcHJvZmlsaW5nIGRhdGEsIHNvCisgICB0aGF0IHRoZXkgYXJlIG5vdCBsb3N0LiAgKi8KKworaW50CitfX2djb3ZfZXhlY3ZwIChjb25zdCBjaGFyICpwYXRoLCBjaGFyICpjb25zdCBhcmd2W10pCit7CisgIF9fZ2Nvdl9mbHVzaCAoKTsKKyAgcmV0dXJuIGV4ZWN2cCAocGF0aCwgYXJndik7Cit9CisjZW5kaWYKKworI2lmZGVmIExfZ2Nvdl9leGVjdmUKKy8qIEEgd3JhcHBlciBmb3IgdGhlIGV4ZWN2ZSBmdW5jdGlvbi4gIEZsdXNoZXMgdGhlIGFjY3VtdWxhdGVkIHByb2ZpbGluZyBkYXRhLCBzbworICAgdGhhdCB0aGV5IGFyZSBub3QgbG9zdC4gICovCisKK2ludAorX19nY292X2V4ZWN2ZSAoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqY29uc3QgYXJndltdLCBjaGFyICpjb25zdCBlbnZwW10pCit7CisgIF9fZ2Nvdl9mbHVzaCAoKTsKKyAgcmV0dXJuIGV4ZWN2ZSAocGF0aCwgYXJndiwgZW52cCk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fR0NPVl9LRVJORUxfXworLyoKKyAqIFByb3ZpZGUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqICAgX19nY292X2luaXQKKyAqICAgX19nY292X2V4aXQKKyAqCisgKiBQcm92aWRlIHRoZSBmb2xsb3dpbmcgZHVtbXkgbWVyZ2UgZnVuY3Rpb25zOgorICogICBfX2djb3ZfbWVyZ2VfYWRkCisgKiAgIF9fZ2Nvdl9tZXJnZV9zaW5nbGUKKyAqICAgX19nY292X21lcmdlX2RlbHRhCisgKiAgIF9fZ2Nvdl9tZXJnZV9pb3IKKyAqICAgX19nY292X21lcmdlX2ljYWxsX3RvcG4KKyAqICAgX19nY292X21lcmdlX2RjCisgKiAgIF9fZ2Nvdl9tZXJnZV9yZXVzZWRpc3QKKyAqCisgKiBSZXVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqICAgX19nY292X2ludGVydmFsX3Byb2ZpbGVyKCkKKyAqICAgX19nY292X3BvdzJfcHJvZmlsZXIoKQorICogICBfX2djb3ZfYXZlcmFnZV9wcm9maWxlcigpCisgKiAgIF9fZ2Nvdl9pb3JfcHJvZmlsZXIoKQorICogICBfX2djb3Zfb25lX3ZhbHVlX3Byb2ZpbGVyKCkKKyAqICAgX19nY292X2luZGlyZWN0X2NhbGxfcHJvZmlsZXIoKQorICogICAgIHwtPiBfX2djb3Zfb25lX3ZhbHVlX3Byb2ZpbGVyX2JvZHkoKQorICoKKyAqIEZvciBMSVBPOiAoVEJEKQorICogIENoYW5nZSBzbGlnaHRseSBmb3IgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisgKiAgIF9fZ2Nvdl9tZXJnZV9pY2FsbF90b3BuCisgKiAgIF9fZ2Nvdl9tZXJnZV9kYworICoKKyAqICBSZXVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqICAgX19nY292X2RpcmVjdF9jYWxsX3Byb2ZpbGVyKCkKKyAqICAgX19nY292X2luZGlyZWN0X2NhbGxfdG9wbl9wcm9maWxlcigpCisgKiAgICAgfC0+IF9fZ2Nvdl90b3BuX3ZhbHVlX3Byb2ZpbGVyX2JvZHkoKQorICoKKyAqLworCisvKiBDdXJyZW50IHZpcnVhbCBnY2RhIGZpbGUuIFRoaXMgaXMgZm9yIGtlcm5lbCB1c2Ugb25seS4gICovCitnY292X2tlcm5lbF92ZmlsZSAqZ2Nvdl9jdXJyZW50X2ZpbGU7CisKKy8qIFNldCBjdXJyZW50IHZpcnV0YWwgZ2NkYSBmaWxlLiBJdCBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIGR1bXBpbmcKKyAgIHByb2ZpbGUgZGF0YS4gICovCisKK3ZvaWQKK2djb3Zfc2V0X3ZmaWxlIChnY292X2tlcm5lbF92ZmlsZSAqZmlsZSkKK3sKKyAgZ2Nvdl9jdXJyZW50X2ZpbGUgPSBmaWxlOworfQorCisvKiBEdW1wIG9uZSBlbnRyeSBpbiB0aGUgZ2Nvdl9pbmZvIGxpc3QgKGZvciBvbmUgb2JqZWN0KSBpbiBrZXJuZWwuICAqLworCit2b2lkCitnY292X2tlcm5lbF9kdW1wX29uZV9nY292IChzdHJ1Y3QgZ2Nvdl9pbmZvICppbmZvKQoreworICBnY2NfYXNzZXJ0IChnY292X2N1cnJlbnRfZmlsZSk7CisKKyAgZ2Nvdl9leGl0X2luaXQgKCk7CisKKyAgZ2Nvdl9kdW1wX29uZV9nY292IChpbmZvKTsKK30KKworI2RlZmluZSBEVU1NWV9GVU5DKGZ1bmMpIFwKK3ZvaWQgZnVuYyAoZ2Nvdl90eXBlICpjb3VudGVycyAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBcCisgICAgICAgICAgIHVuc2lnbmVkIG5fY291bnRlcnMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKSB7fQorCitEVU1NWV9GVU5DIChfX2djb3ZfbWVyZ2VfYWRkKQorRVhQT1JUX1NZTUJPTCAoX19nY292X21lcmdlX2FkZCk7CisKK0RVTU1ZX0ZVTkMgKF9fZ2Nvdl9tZXJnZV9zaW5nbGUpCitFWFBPUlRfU1lNQk9MIChfX2djb3ZfbWVyZ2Vfc2luZ2xlKTsKKworRFVNTVlfRlVOQyAoX19nY292X21lcmdlX2RlbHRhKQorRVhQT1JUX1NZTUJPTCAoX19nY292X21lcmdlX2RlbHRhKTsKKworRFVNTVlfRlVOQyhfX2djb3ZfbWVyZ2VfaW9yKQorRVhQT1JUX1NZTUJPTCAoX19nY292X21lcmdlX2lvcik7CisKK0RVTU1ZX0ZVTkMgKF9fZ2Nvdl9tZXJnZV9pY2FsbF90b3BuKQorRVhQT1JUX1NZTUJPTCAoX19nY292X21lcmdlX2ljYWxsX3RvcG4pOworCitEVU1NWV9GVU5DIChfX2djb3ZfbWVyZ2VfZGMpCitFWFBPUlRfU1lNQk9MIChfX2djb3ZfbWVyZ2VfZGMpOworCitEVU1NWV9GVU5DIChfX2djb3ZfbWVyZ2VfcmV1c2VkaXN0KQorRVhQT1JUX1NZTUJPTCAoX19nY292X21lcmdlX3JldXNlZGlzdCk7CisKK0VYUE9SVF9TWU1CT0wgKF9fZ2Nvdl9hdmVyYWdlX3Byb2ZpbGVyKTsKK0VYUE9SVF9TWU1CT0wgKF9fZ2Nvdl9pbmRpcmVjdF9jYWxsX3Byb2ZpbGVyKTsKK0VYUE9SVF9TWU1CT0wgKF9fZ2Nvdl9pbnRlcnZhbF9wcm9maWxlcik7CitFWFBPUlRfU1lNQk9MIChfX2djb3ZfaW9yX3Byb2ZpbGVyKTsKK0VYUE9SVF9TWU1CT0wgKF9fZ2Nvdl9vbmVfdmFsdWVfcHJvZmlsZXIpOworRVhQT1JUX1NZTUJPTCAoX19nY292X3BvdzJfcHJvZmlsZXIpOworCisjZW5kaWYgLyogX19HQ09WX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBpbmhpYml0X2xpYmMgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL1JFQURNRSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg2YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1RoaXMgUkVBRE1FIGZpbGUgaXMgY29waWVkIGludG8gdGhlIGRpcmVjdG9yeSBmb3IgR0NDLW9ubHkgaGVhZGVyIGZpbGVzCit3aGVuIGZpeGluY2x1ZGVzIGlzIHJ1biBieSB0aGUgbWFrZWZpbGUgZm9yIEdDQy4KKworTWFueSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgd2VyZSBhdXRvbWF0aWNhbGx5IGVkaXRlZCBmcm9tIHRoZQorc3RhbmRhcmQgc3lzdGVtIGhlYWRlciBmaWxlcyBieSB0aGUgZml4aW5jbHVkZXMgcHJvY2Vzcy4gIFRoZXkgYXJlCitzeXN0ZW0tc3BlY2lmaWMsIGFuZCB3aWxsIG5vdCB3b3JrIG9uIGFueSBvdGhlciBraW5kIG9mIHN5c3RlbS4gIFRoZXkKK2FyZSBhbHNvIG5vdCBwYXJ0IG9mIEdDQy4gIFRoZSByZWFzb24gd2UgaGF2ZSB0byBkbyB0aGlzIGlzIGJlY2F1c2UKK0dDQyByZXF1aXJlcyBBTlNJIEMgaGVhZGVycyBhbmQgbWFueSB2ZW5kb3JzIHN1cHBseSBBTlNJLWluY29tcGF0aWJsZQoraGVhZGVycy4KKworQmVjYXVzZSB0aGlzIGlzIGFuIGF1dG9tYXRlZCBwcm9jZXNzLCBzb21ldGltZXMgaGVhZGVycyBnZXQgImZpeGVkIgordGhhdCBkbyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBuZWVkIGEgZml4LiAgQXMgbG9uZyBhcyBub3RoaW5nIGlzIGJyb2tlbgorYnkgdGhlIHByb2Nlc3MsIGl0IGlzIGp1c3QgYW4gdW5mb3J0dW5hdGUgY29sbGF0ZXJhbCBpbmNvbnZlbmllbmNlLgorV2Ugd291bGQgbGlrZSB0byByZWN0aWZ5IGl0LCBpZiBpdCBpcyBub3QgInRvbyBpbmNvbnZlbmllbnQiLgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvWDExL1h3MzJkZWZzLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS1maXhlZC9YMTEvWHczMmRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc3ZDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvWDExL1h3MzJkZWZzLmgKQEAgLTAsMCArMSw5MCBAQAorLyogIERPIE5PVCBFRElUIFRISVMgRklMRS4KKworICAgIEl0IGhhcyBiZWVuIGF1dG8tZWRpdGVkIGJ5IGZpeGluY2x1ZGVzIGZyb206CisKKwkiL3RtcC9hbmRyZXdoc2llaC1nY2MtNjQtZW1pWm5aLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdzMyZGVmcy5oIgorCisgICAgVGhpcyBoYWQgdG8gYmUgZG9uZSB0byBjb3JyZWN0IG5vbi1zdGFuZGFyZCB1c2FnZXMgaW4gdGhlCisgICAgb3JpZ2luYWwsIG1hbnVmYWN0dXJlciBzdXBwbGllZCBoZWFkZXIgZmlsZS4gICovCisKKy8qICRYb3JnOiBYdzMyZGVmcy5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDQgY29za3JleSBFeHAgJCAqLworCisjaWZuZGVmIF9YVzMyREVGU19ICisjZGVmaW5lICBfWFczMkRFRlNfSAorCisjaWZkZWYgX19HTlVDX18gLyogbWluZ3cgaXMgbW9yZSBjbG9zZSB0byBfX3VuaXhfXyB0aGFuIG1zdmMgKi8KKyNpZiAhZGVmaW5lZChfX2RhZGRyX3RfZGVmaW5lZCkgCit0eXBlZGVmIGNoYXIgKmNhZGRyX3Q7CisjZW5kaWYKKyNkZWZpbmUgbHN0YXQgc3RhdAorCisjZWxzZQordHlwZWRlZiBjaGFyICpjYWRkcl90OworCisjZGVmaW5lIGFjY2VzcwkgICBfYWNjZXNzCisjZGVmaW5lIGFsbG9jYQkgICBfYWxsb2NhCisjZGVmaW5lIGNoZGlyCV9jaGRpcgorI2RlZmluZSBjaG1vZAkgICBfY2htb2QKKyNkZWZpbmUgY2xvc2UJICAgX2Nsb3NlCisjZGVmaW5lIGNyZWF0CSAgIF9jcmVhdAorI2RlZmluZSBkdXAJICAgX2R1cAorI2RlZmluZSBkdXAyCSAgIF9kdXAyCisjZGVmaW5lIGVudmlyb24gICAgIF9lbnZpcm9uCisjZGVmaW5lIGV4ZWNsCSBfZXhlY2wKKyNkZWZpbmUgZXhlY2xlCSBfZXhlY2xlCisjZGVmaW5lIGV4ZWNscAkgX2V4ZWNscAorI2RlZmluZSBleGVjbHBlICBfZXhlY2xwZQorI2RlZmluZSBleGVjdgkgX2V4ZWN2CisjZGVmaW5lIGV4ZWN2ZQkgX2V4ZWN2ZQorI2RlZmluZSBleGVjdnAJIF9leGVjdnAKKyNkZWZpbmUgZXhlY3ZwZSAgX2V4ZWN2cGUKKyNkZWZpbmUgZmRvcGVuCSAgX2Zkb3BlbgorI2RlZmluZSBmaWxlbm8JICBfZmlsZW5vCisjZGVmaW5lIGZzdGF0CSBfZnN0YXQKKyNkZWZpbmUgZ2V0Y3dkCV9nZXRjd2QKKyNkZWZpbmUgZ2V0cGlkCSBfZ2V0cGlkCisjZGVmaW5lIGh5cG90CQlfaHlwb3QKKyNkZWZpbmUgaXNhc2NpaSBfX2lzYXNjaWkKKyNkZWZpbmUgaXNhdHR5CSAgIF9pc2F0dHkKKyNkZWZpbmUgbHNlZWsJICAgX2xzZWVrCisjZGVmaW5lIG1rZGlyCV9ta2RpcgorI2RlZmluZSBta3RlbXAJICAgX21rdGVtcAorI2RlZmluZSBvcGVuCSAgIF9vcGVuCisjZGVmaW5lIHB1dGVudgkgICAgX3B1dGVudgorI2RlZmluZSByZWFkCSAgIF9yZWFkCisjZGVmaW5lIHJtZGlyCV9ybWRpcgorI2RlZmluZSBzbGVlcCh4KSBfc2xlZXAoKHgpICogMTAwMCkKKyNkZWZpbmUgc3RhdAkgX3N0YXQKKyNkZWZpbmUgc3lzX2Vycmxpc3QgX3N5c19lcnJsaXN0CisjZGVmaW5lIHN5c19uZXJyICAgIF9zeXNfbmVycgorI2RlZmluZSB1bWFzawkgICBfdW1hc2sKKyNkZWZpbmUgdW5saW5rCSAgIF91bmxpbmsKKyNkZWZpbmUgd3JpdGUJICAgX3dyaXRlCisjZGVmaW5lIHJhbmRvbSAgIHJhbmQKKyNkZWZpbmUgc3JhbmRvbSAgc3JhbmQKKworI2RlZmluZSBPX1JET05MWSAgICBfT19SRE9OTFkKKyNkZWZpbmUgT19XUk9OTFkgICAgX09fV1JPTkxZCisjZGVmaW5lIE9fUkRXUgkgICAgX09fUkRXUgorI2RlZmluZSBPX0FQUEVORCAgICBfT19BUFBFTkQKKyNkZWZpbmUgT19DUkVBVCAgICAgX09fQ1JFQVQKKyNkZWZpbmUgT19UUlVOQyAgICAgX09fVFJVTkMKKyNkZWZpbmUgT19FWENMCSAgICBfT19FWENMCisjZGVmaW5lIE9fVEVYVAkgICAgX09fVEVYVAorI2RlZmluZSBPX0JJTkFSWSAgICBfT19CSU5BUlkKKyNkZWZpbmUgT19SQVcJICAgIF9PX0JJTkFSWQorCisjZGVmaW5lIFNfSUZNVAkgX1NfSUZNVAorI2RlZmluZSBTX0lGRElSICBfU19JRkRJUgorI2RlZmluZSBTX0lGQ0hSICBfU19JRkNIUgorI2RlZmluZSBTX0lGUkVHICBfU19JRlJFRworI2RlZmluZSBTX0lSRUFEICBfU19JUkVBRAorI2RlZmluZSBTX0lXUklURSBfU19JV1JJVEUKKyNkZWZpbmUgU19JRVhFQyAgX1NfSUVYRUMKKworI2RlZmluZQlGX09LCTAKKyNkZWZpbmUJWF9PSwkxCisjZGVmaW5lCVdfT0sJMgorI2RlZmluZQlSX09LCTQKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS1maXhlZC9saW1pdHMuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzM1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS1maXhlZC9saW1pdHMuaApAQCAtMCwwICsxLDE3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk0LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGlzIGFkbWluaXN0cml2aWEgZ2V0cyBhZGRlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGxpbWl0cy5oCisgICBpZiB0aGUgc3lzdGVtIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgbGltaXRzLmguICAqLworCisvKiBXZSB1c2UgX0dDQ19MSU1JVFNfSF8gYmVjYXVzZSB3ZSB3YW50IHRoaXMgbm90IHRvIG1hdGNoCisgICBhbnkgbWFjcm9zIHRoYXQgdGhlIHN5c3RlbSdzIGxpbWl0cy5oIHVzZXMgZm9yIGl0cyBvd24gcHVycG9zZXMuICAqLworI2lmbmRlZiBfR0NDX0xJTUlUU19IXyAgLyogVGVybWluYXRlZCBpbiBsaW1pdHkuaC4gICovCisjZGVmaW5lIF9HQ0NfTElNSVRTX0hfCisKKyNpZm5kZWYgX0xJQkNfTElNSVRTX0hfCisvKiBVc2UgIi4uLiIgc28gdGhhdCB3ZSBmaW5kIHN5c2xpbWl0cy5oIG9ubHkgaW4gdGhpcyBzYW1lIGRpcmVjdG9yeS4gICovCisjaW5jbHVkZSAic3lzbGltaXRzLmgiCisjZW5kaWYKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyAgIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0xJTUlUU19IX19fCisjZGVmaW5lIF9MSU1JVFNfSF9fXworCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGBjaGFyJy4gICovCisjdW5kZWYgQ0hBUl9CSVQKKyNkZWZpbmUgQ0hBUl9CSVQgX19DSEFSX0JJVF9fCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgbXVsdGlieXRlIGNoYXJhY3Rlci4gICovCisjaWZuZGVmIE1CX0xFTl9NQVgKKyNkZWZpbmUgTUJfTEVOX01BWCAxCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKi8KKyN1bmRlZiBTQ0hBUl9NSU4KKyNkZWZpbmUgU0NIQVJfTUlOICgtU0NIQVJfTUFYIC0gMSkKKyN1bmRlZiBTQ0hBUl9NQVgKKyNkZWZpbmUgU0NIQVJfTUFYIF9fU0NIQVJfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgY2hhcicgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVUNIQVJfTUFYCisjaWYgX19TQ0hBUl9NQVhfXyA9PSBfX0lOVF9NQVhfXworIyBkZWZpbmUgVUNIQVJfTUFYIChTQ0hBUl9NQVggKiAyVSArIDFVKQorI2Vsc2UKKyMgZGVmaW5lIFVDSEFSX01BWCAoU0NIQVJfTUFYICogMiArIDEpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgY2hhcicgY2FuIGhvbGQuICAqLworI2lmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisjIHVuZGVmIENIQVJfTUlOCisjIGlmIF9fU0NIQVJfTUFYX18gPT0gX19JTlRfTUFYX18KKyMgIGRlZmluZSBDSEFSX01JTiAwVQorIyBlbHNlCisjICBkZWZpbmUgQ0hBUl9NSU4gMAorIyBlbmRpZgorIyB1bmRlZiBDSEFSX01BWAorIyBkZWZpbmUgQ0hBUl9NQVggVUNIQVJfTUFYCisjZWxzZQorIyB1bmRlZiBDSEFSX01JTgorIyBkZWZpbmUgQ0hBUl9NSU4gU0NIQVJfTUlOCisjIHVuZGVmIENIQVJfTUFYCisjIGRlZmluZSBDSEFSX01BWCBTQ0hBUl9NQVgKKyNlbmRpZgorCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgc2hvcnQgaW50JyBjYW4gaG9sZC4gICovCisjdW5kZWYgU0hSVF9NSU4KKyNkZWZpbmUgU0hSVF9NSU4gKC1TSFJUX01BWCAtIDEpCisjdW5kZWYgU0hSVF9NQVgKKyNkZWZpbmUgU0hSVF9NQVggX19TSFJUX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVVNIUlRfTUFYCisjaWYgX19TSFJUX01BWF9fID09IF9fSU5UX01BWF9fCisjIGRlZmluZSBVU0hSVF9NQVggKFNIUlRfTUFYICogMlUgKyAxVSkKKyNlbHNlCisjIGRlZmluZSBVU0hSVF9NQVggKFNIUlRfTUFYICogMiArIDEpCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGludCcgY2FuIGhvbGQuICAqLworI3VuZGVmIElOVF9NSU4KKyNkZWZpbmUgSU5UX01JTiAoLUlOVF9NQVggLSAxKQorI3VuZGVmIElOVF9NQVgKKyNkZWZpbmUgSU5UX01BWCBfX0lOVF9NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVJTlRfTUFYCisjZGVmaW5lIFVJTlRfTUFYIChJTlRfTUFYICogMlUgKyAxVSkKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgaW50JyBjYW4gaG9sZC4KKyAgIChTYW1lIGFzIGBpbnQnKS4gICovCisjdW5kZWYgTE9OR19NSU4KKyNkZWZpbmUgTE9OR19NSU4gKC1MT05HX01BWCAtIDFMKQorI3VuZGVmIExPTkdfTUFYCisjZGVmaW5lIExPTkdfTUFYIF9fTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjdW5kZWYgVUxPTkdfTUFYCisjZGVmaW5lIFVMT05HX01BWCAoTE9OR19NQVggKiAyVUwgKyAxVUwpCisKKyNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjIHVuZGVmIExMT05HX01JTgorIyBkZWZpbmUgTExPTkdfTUlOICgtTExPTkdfTUFYIC0gMUxMKQorIyB1bmRlZiBMTE9OR19NQVgKKyMgZGVmaW5lIExMT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyMgdW5kZWYgVUxMT05HX01BWAorIyBkZWZpbmUgVUxMT05HX01BWCAoTExPTkdfTUFYICogMlVMTCArIDFVTEwpCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgPyBkZWZpbmVkIChfX1VTRV9HTlUpIDogIWRlZmluZWQgKF9fU1RSSUNUX0FOU0lfXykKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjIHVuZGVmIExPTkdfTE9OR19NSU4KKyMgZGVmaW5lIExPTkdfTE9OR19NSU4gKC1MT05HX0xPTkdfTUFYIC0gMUxMKQorIyB1bmRlZiBMT05HX0xPTkdfTUFYCisjIGRlZmluZSBMT05HX0xPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworIyB1bmRlZiBVTE9OR19MT05HX01BWAorIyBkZWZpbmUgVUxPTkdfTE9OR19NQVggKExPTkdfTE9OR19NQVggKiAyVUxMICsgMVVMTCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTUlUU19IX19fICovCisvKiBUaGlzIGFkbWluaXN0cml2aWEgZ2V0cyBhZGRlZCB0byB0aGUgZW5kIG9mIGxpbWl0cy5oCisgICBpZiB0aGUgc3lzdGVtIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgbGltaXRzLmguICAqLworCisjZWxzZSAvKiBub3QgX0dDQ19MSU1JVFNfSF8gKi8KKworI2lmZGVmIF9HQ0NfTkVYVF9MSU1JVFNfSAorI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CQkvKiByZWN1cnNlIGRvd24gdG8gdGhlIHJlYWwgb25lICovCisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBfR0NDX0xJTUlUU19IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvbGludXgvYS5vdXQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL2xpbnV4L2Eub3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkOWVmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL2xpbnV4L2Eub3V0LmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qICBETyBOT1QgRURJVCBUSElTIEZJTEUuCisKKyAgICBJdCBoYXMgYmVlbiBhdXRvLWVkaXRlZCBieSBmaXhpbmNsdWRlcyBmcm9tOgorCisJIi90bXAvYW5kcmV3aHNpZWgtZ2NjLTY0LWVtaVpuWi8yL3g4Nl82NC1saW51eC1nbGliYzIuNy00LjYvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hLm91dC5oIgorCisgICAgVGhpcyBoYWQgdG8gYmUgZG9uZSB0byBjb3JyZWN0IG5vbi1zdGFuZGFyZCB1c2FnZXMgaW4gdGhlCisgICAgb3JpZ2luYWwsIG1hbnVmYWN0dXJlciBzdXBwbGllZCBoZWFkZXIgZmlsZS4gICovCisKKyNpZm5kZWYgX19BX09VVF9HTlVfSF9fCisjZGVmaW5lIF9fQV9PVVRfR05VX0hfXworCisjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KKworI2lmbmRlZiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KKworI2luY2x1ZGUgPGFzbS9hLm91dC5oPgorCisjZW5kaWYgLyogX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fICovCisKKy8qIHRoZXNlIGdvIGluIHRoZSBOX01BQ0hUWVBFIGZpZWxkICovCitlbnVtIG1hY2hpbmVfdHlwZSB7CisjaWYgZGVmaW5lZCAoTV9PTERTVU4yKQorICBNX19PTERTVU4yID0gTV9PTERTVU4yLAorI2Vsc2UKKyAgTV9PTERTVU4yID0gMCwKKyNlbmRpZgorI2lmIGRlZmluZWQgKE1fNjgwMTApCisgIE1fXzY4MDEwID0gTV82ODAxMCwKKyNlbHNlCisgIE1fNjgwMTAgPSAxLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoTV82ODAyMCkKKyAgTV9fNjgwMjAgPSBNXzY4MDIwLAorI2Vsc2UKKyAgTV82ODAyMCA9IDIsCisjZW5kaWYKKyNpZiBkZWZpbmVkIChNX1NQQVJDKQorICBNX19TUEFSQyA9IE1fU1BBUkMsCisjZWxzZQorICBNX1NQQVJDID0gMywKKyNlbmRpZgorICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bidzIG51bWJlcnMgKi8KKyAgTV8zODYgPSAxMDAsCisgIE1fTUlQUzEgPSAxNTEsCS8qIE1JUFMgUjMwMDAvUjMwMDAgYmluYXJ5ICovCisgIE1fTUlQUzIgPSAxNTIJCS8qIE1JUFMgUjYwMDAvUjQwMDAgYmluYXJ5ICovCit9OworCisjaWYgIWRlZmluZWQgKE5fTUFHSUMpCisjZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCisjZW5kaWYKKyNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweGZmKSkKKyNkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKKyNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCisJIHwgKCgoaW50KSh0eXBlKSAmIDB4ZmYpIDw8IDE2KSBcCisJIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQorI2RlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAorCSgoZXhlYykuYV9pbmZvID0gKCgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpKQorCisjZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCisJKChleGVjKS5hX2luZm8gPSBcCisJICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCisKKyNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9IFwKKwkgKChleGVjKS5hX2luZm8mMHgwMGZmZmZmZikgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisKKy8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIE9NQUdJQyAwNDA3CisvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDA0MTAKKy8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIFpNQUdJQyAwNDEzCisvKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gCisgICBUaGUgZmlyc3QgcGFnZSBpcyB1bm1hcHBlZCB0byBoZWxwIHRyYXAgTlVMTCBwb2ludGVyIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgUU1BR0lDIDAzMTQKKworLyogQ29kZSBpbmRpY2F0aW5nIGNvcmUgZmlsZS4gICovCisjZGVmaW5lIENNQUdJQyAwNDIxCisKKyNpZiAhZGVmaW5lZCAoTl9CQURNQUcpCisjZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCisJCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAorICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyBcCisJCSAgICAgICAgJiYgTl9NQUdJQyh4KSAhPSBRTUFHSUMpCisjZW5kaWYKKworI2RlZmluZSBfTl9IRFJPRkYoeCkgKDEwMjQgLSBzaXplb2YgKHN0cnVjdCBleGVjKSkKKworI2lmICFkZWZpbmVkIChOX1RYVE9GRikKKyNkZWZpbmUgTl9UWFRPRkYoeCkgXAorIChOX01BR0lDKHgpID09IFpNQUdJQyA/IF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOiBcCisgIChOX01BR0lDKHgpID09IFFNQUdJQyA/IDAgOiBzaXplb2YgKHN0cnVjdCBleGVjKSkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0RBVE9GRikKKyNkZWZpbmUgTl9EQVRPRkYoeCkgKE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKE5fVFJFTE9GRikKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0RSRUxPRkYpCisjZGVmaW5lIE5fRFJFTE9GRih4KSAoTl9UUkVMT0ZGKHgpICsgTl9UUlNJWkUoeCkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX1NZTU9GRikKKyNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fRFJFTE9GRih4KSArIE5fRFJTSVpFKHgpKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTl9TVFJPRkYpCisjZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArIE5fU1lNU0laRSh4KSkKKyNlbmRpZgorCisvKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNpZiAhZGVmaW5lZCAoTl9UWFRBRERSKQorI2RlZmluZSBOX1RYVEFERFIoeCkgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gUEFHRV9TSVpFIDogMCkKKyNlbmRpZgorCisvKiBBZGRyZXNzIG9mIGRhdGEgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLgorICAgTm90ZSB0aGF0IGl0IGlzIHVwIHRvIHlvdSB0byBkZWZpbmUgU0VHTUVOVF9TSVpFCisgICBvbiBtYWNoaW5lcyBub3QgbGlzdGVkIGhlcmUuICAqLworI2lmIGRlZmluZWQodmF4KSB8fCBkZWZpbmVkKGhwMzAwKSB8fCBkZWZpbmVkKHB5cikKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIHBhZ2Vfc2l6ZQorI2VuZGlmCisjaWZkZWYJc29ueQorI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgyMDAwCisjZW5kaWYJLyogU29ueS4gICovCisjaWZkZWYgaXM2OGsKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MjAwMDAKKyNlbmRpZgorI2lmIGRlZmluZWQobTY4aykgJiYgZGVmaW5lZChQT1JUQVIpCisjZGVmaW5lIFBBR0VfU0laRSAweDQwMAorI2RlZmluZSBTRUdNRU5UX1NJWkUgUEFHRV9TSVpFCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykKKyNkZWZpbmUgU0VHTUVOVF9TSVpFCTEwMjQKKyNlbHNlCisjaWZuZGVmIFNFR01FTlRfU0laRQorI2RlZmluZSBTRUdNRU5UX1NJWkUJUEFHRV9TSVpFCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX05fU0VHTUVOVF9ST1VORCh4KSBBTElHTih4LCBTRUdNRU5UX1NJWkUpCisKKyNkZWZpbmUgX05fVFhURU5EQUREUih4KSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpCisKKyNpZm5kZWYgTl9EQVRBRERSCisjZGVmaW5lIE5fREFUQUREUih4KSBcCisgICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKF9OX1RYVEVOREFERFIoeCkpIFwKKyAgICAgOiAoX05fU0VHTUVOVF9ST1VORCAoX05fVFhURU5EQUREUih4KSkpKQorI2VuZGlmCisKKy8qIEFkZHJlc3Mgb2YgYnNzIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCisjaWYgIWRlZmluZWQgKE5fQlNTQUREUikKKyNkZWZpbmUgTl9CU1NBRERSKHgpIChOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQorI2VuZGlmCisMCisjaWYgIWRlZmluZWQgKE5fTkxJU1RfREVDTEFSRUQpCitzdHJ1Y3Qgbmxpc3QgeworICB1bmlvbiB7CisgICAgY2hhciAqbl9uYW1lOworICAgIHN0cnVjdCBubGlzdCAqbl9uZXh0OworICAgIGxvbmcgbl9zdHJ4OworICB9IG5fdW47CisgIHVuc2lnbmVkIGNoYXIgbl90eXBlOworICBjaGFyIG5fb3RoZXI7CisgIHNob3J0IG5fZGVzYzsKKyAgdW5zaWduZWQgbG9uZyBuX3ZhbHVlOworfTsKKyNlbmRpZiAvKiBubyBOX05MSVNUX0RFQ0xBUkVELiAgKi8KKworI2lmICFkZWZpbmVkIChOX1VOREYpCisjZGVmaW5lIE5fVU5ERiAwCisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9BQlMpCisjZGVmaW5lIE5fQUJTIDIKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX1RFWFQpCisjZGVmaW5lIE5fVEVYVCA0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9EQVRBKQorI2RlZmluZSBOX0RBVEEgNgorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fQlNTKQorI2RlZmluZSBOX0JTUyA4CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9GTikKKyNkZWZpbmUgTl9GTiAxNQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTl9FWFQpCisjZGVmaW5lIE5fRVhUIDEKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX1RZUEUpCisjZGVmaW5lIE5fVFlQRSAwMzYKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX1NUQUIpCisjZGVmaW5lIE5fU1RBQiAwMzQwCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyB0eXBlIGluZGljYXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBhIHN5bWJvbCBhcyBiZWluZworICAgYW4gaW5kaXJlY3QgcmVmZXJlbmNlIHRvIGFub3RoZXIgc3ltYm9sLiAgVGhlIG90aGVyIHN5bWJvbAorICAgYXBwZWFycyBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzeW1ib2wuCisKKyAgIEluZGlyZWN0aW9uIGlzIGFzeW1tZXRyaWNhbC4gIFRoZSBvdGhlciBzeW1ib2wncyB2YWx1ZSB3aWxsIGJlIHVzZWQKKyAgIHRvIHNhdGlzZnkgcmVxdWVzdHMgZm9yIHRoZSBpbmRpcmVjdCBzeW1ib2wsIGJ1dCBub3QgdmljZSB2ZXJzYS4KKyAgIElmIHRoZSBvdGhlciBzeW1ib2wgZG9lcyBub3QgaGF2ZSBhIGRlZmluaXRpb24sIGxpYnJhcmllcyB3aWxsCisgICBiZSBzZWFyY2hlZCB0byBmaW5kIGEgZGVmaW5pdGlvbi4gICovCisjZGVmaW5lIE5fSU5EUiAweGEKKworLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KKyAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgorICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAorICAgZWxlbWVudCdzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KKyAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCisKKyAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKKyAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KKyAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCisgICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KKworLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLworI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKworLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCisjZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KKwwKKyNpZiAhZGVmaW5lZCAoTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQpCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCisgICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKKyAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgorICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLworCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCit7CisgIC8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLworICBpbnQgcl9hZGRyZXNzOworICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OworICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0CisgICAgIGFuZCBpdCBzaG91bGQgYmUgcmVsb2NhdGVkIGZvciBjaGFuZ2VzIGluIGl0cyBvd24gYWRkcmVzcworICAgICBhcyB3ZWxsIGFzIGZvciBjaGFuZ2VzIGluIHRoZSBzeW1ib2wgb3Igc2VjdGlvbiBzcGVjaWZpZWQuICAqLworICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOworICAvKiBMZW5ndGggKGFzIGV4cG9uZW50IG9mIDIpIG9mIHRoZSBmaWVsZCB0byBiZSByZWxvY2F0ZWQuCisgICAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOworICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgorICAgICAgICAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCisJICBpbiBmaWxlJ3MgdGhlIHN5bWJvbCB0YWJsZS4KKyAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KKyAgICAgICAgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKKwkgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCisgIHVuc2lnbmVkIGludCByX2V4dGVybjoxOworICAvKiBGb3VyIGJpdHMgdGhhdCBhcmVuJ3QgdXNlZCwgYnV0IHdoZW4gd3JpdGluZyBhbiBvYmplY3QgZmlsZQorICAgICBpdCBpcyBkZXNpcmFibGUgdG8gY2xlYXIgdGhlbS4gICovCisjaWZkZWYgTlMzMksKKyAgdW5zaWduZWQgcl9ic3I6MTsKKyAgdW5zaWduZWQgcl9kaXNwOjE7CisgIHVuc2lnbmVkIHJfcGFkOjI7CisjZWxzZQorICB1bnNpZ25lZCBpbnQgcl9wYWQ6NDsKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBubyBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRC4gICovCisKKworI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS1maXhlZC9zeXNsaW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYyODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvc3lzbGltaXRzLmgKQEAgLTAsMCArMSw4IEBACisvKiBzeXNsaW1pdHMuaCBzdGFuZHMgZm9yIHRoZSBzeXN0ZW0ncyBvd24gbGltaXRzLmggZmlsZS4KKyAgIElmIHdlIGNhbiB1c2UgaXQgb2sgdW5tb2RpZmllZCwgdGhlbiB3ZSBpbnN0YWxsIHRoaXMgdGV4dC4KKyAgIElmIGZpeGluY2x1ZGVzIGZpeGVzIGl0LCB0aGVuIHRoZSBmaXhlZCB2ZXJzaW9uIGlzIGluc3RhbGxlZAorICAgaW5zdGVhZCBvZiB0aGlzIHRleHQuICAqLworCisjZGVmaW5lIF9HQ0NfTkVYVF9MSU1JVFNfSAkJLyogdGVsbCBnY2MncyBsaW1pdHMuaCB0byByZWN1cnNlICovCisjaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4KKyN1bmRlZiBfR0NDX05FWFRfTElNSVRTX0gKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL3RnbWF0aC5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUtZml4ZWQvdGdtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMjE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlLWZpeGVkL3RnbWF0aC5oCkBAIC0wLDAgKzEsNDU4IEBACisvKiAgRE8gTk9UIEVESVQgVEhJUyBGSUxFLgorCisgICAgSXQgaGFzIGJlZW4gYXV0by1lZGl0ZWQgYnkgZml4aW5jbHVkZXMgZnJvbToKKworCSIvdG1wL2FuZHJld2hzaWVoLWdjYy02NC1lbWlablovMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGdtYXRoLmgiCisKKyAgICBUaGlzIGhhZCB0byBiZSBkb25lIHRvIGNvcnJlY3Qgbm9uLXN0YW5kYXJkIHVzYWdlcyBpbiB0aGUKKyAgICBvcmlnaW5hbCwgbWFudWZhY3R1cmVyIHN1cHBsaWVkIGhlYWRlciBmaWxlLiAgKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMjIgVHlwZS1nZW5lcmljIG1hdGgJPHRnbWF0aC5oPgorICovCisKKyNpZm5kZWYgX1RHTUFUSF9ICisjZGVmaW5lIF9UR01BVEhfSAkxCisKKy8qIEluY2x1ZGUgdGhlIG5lZWRlZCBoZWFkZXJzLiAgKi8KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8Y29tcGxleC5oPgorCisKKy8qIFNpbmNlIGBjb21wbGV4JyBpcyBjdXJyZW50bHkgbm90IHJlYWxseSBpbXBsZW1lbnRlZCBpbiBtb3N0IEMgY29tcGlsZXJzCisgICBhbmQgaWYgaXQgaXMgaW1wbGVtZW50ZWQsIHRoZSBpbXBsZW1lbnRhdGlvbnMgZGlmZmVyLiAgVGhpcyBtYWtlcyBpdAorICAgcXVpdGUgZGlmZmljdWx0IHRvIHdyaXRlIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGhlYWRlci4gIFdlCisgICBkbyBub3QgdHJ5IHRoaXMgZm9yIG5vdyBhbmQgaW5zdGVhZCBjb25jZW50cmF0ZSBvbmx5IG9uIEdOVSBDQy4gIE9uY2UKKyAgIHdlIGhhdmUgbW9yZSBpbmZvcm1hdGlvbiBzdXBwb3J0IGZvciBvdGhlciBjb21waWxlcnMgbWlnaHQgZm9sbG93LiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEgKDIsIDcpCisKKyMgaWZkZWYgX19OT19MT05HX0RPVUJMRV9NQVRICisjICBkZWZpbmUgX190Z21sKGZjdCkgZmN0CisjIGVsc2UKKyMgIGRlZmluZSBfX3RnbWwoZmN0KSBmY3QgIyMgbAorIyBlbmRpZgorCisvKiBUaGlzIGlzIHVnbHkgYnV0IHVubGVzcyBnY2MgZ2V0cyBhcHByb3ByaWF0ZSBidWlsdGlucyB3ZSBoYXZlIHRvIGRvCisgICBzb21ldGhpbmcgbGlrZSB0aGlzLiAgRG9uJ3QgYXNrIGhvdyBpdCB3b3Jrcy4gICovCisKKy8qIDEgaWYgJ3R5cGUnIGlzIGEgZmxvYXRpbmcgdHlwZSwgMCBpZiAndHlwZScgaXMgYW4gaW50ZWdlciB0eXBlLgorICAgQWxsb3dzIGZvciBfQm9vbC4gIEV4cGFuZHMgdG8gYW4gaW50ZWdlciBjb25zdGFudCBleHByZXNzaW9uLiAgKi8KKyMgZGVmaW5lIF9fZmxvYXRpbmdfdHlwZSh0eXBlKSAoX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKCh0eXBlKSAwKSA9PSA4IHx8IChfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoKHR5cGUpIDApID09IDkgJiYgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fICgodHlwZSkgMCkpID09IDgpKQorCisvKiBUaGUgdGdtYXRoIHJlYWwgdHlwZSBmb3IgVCwgd2hlcmUgRSBpcyAwIGlmIFQgaXMgYW4gaW50ZWdlciB0eXBlIGFuZAorICAgMSBmb3IgYSBmbG9hdGluZyB0eXBlLiAgKi8KKyMgZGVmaW5lIF9fdGdtYXRoX3JlYWxfdHlwZV9zdWIoVCwgRSkgXAorICBfX3R5cGVvZl9fICgqKDAgPyAoX190eXBlb2ZfXyAoMCA/IChkb3VibGUgKikgMCA6ICh2b2lkICopIChFKSkpIDAJICAgICAgXAorCQkgIDogKF9fdHlwZW9mX18gKDAgPyAoVCAqKSAwIDogKHZvaWQgKikgKCEoRSkpKSkgMCkpCisKKy8qIFRoZSB0Z21hdGggcmVhbCB0eXBlIG9mIEVYUFIuICAqLworIyBkZWZpbmUgX190Z21hdGhfcmVhbF90eXBlKGV4cHIpIFwKKyAgX190Z21hdGhfcmVhbF90eXBlX3N1YiAoX190eXBlb2ZfXyAoKF9fdHlwZW9mX18gKGV4cHIpKSAwKSwJCSAgICAgIFwKKwkJCSAgX19mbG9hdGluZ190eXBlIChfX3R5cGVvZl9fIChleHByKSkpCisKKworLyogV2UgaGF2ZSB0d28ga2luZHMgb2YgZ2VuZXJpYyBtYWNyb3M6IHRvIHN1cHBvcnQgZnVuY3Rpb25zIHdoaWNoIGFyZQorICAgb25seSBkZWZpbmVkIG9uIHJlYWwgdmFsdWVkIHBhcmFtZXRlcnMgYW5kIHRob3NlIHdoaWNoIGFyZSBkZWZpbmVkCisgICBmb3IgY29tcGxleCBmdW5jdGlvbnMgYXMgd2VsbC4gICovCisjIGRlZmluZSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkoVmFsLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKFZhbCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IChWYWwpCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwpID09IHNpemVvZiAoZmxvYXQpKQkJCSAgICAgIFwKKwkJICAgICA/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIEZjdCMjZiAoVmFsKQkJICAgICAgXAorCQkgICAgIDogKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgX190Z21sKEZjdCkgKFZhbCkpKQorCisjIGRlZmluZSBfX1RHTUFUSF9VTkFSWV9SRUFMX1JFVF9PTkxZKFZhbCwgUmV0VHlwZSwgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChWYWwpID09IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbCkgIT0gOCkJCSAgICAgIFwKKwkJICAgICA/IChSZXRUeXBlKSBGY3QgKFZhbCkJCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsKSA9PSBzaXplb2YgKGZsb2F0KSkJCQkgICAgICBcCisJCSAgICAgPyAoUmV0VHlwZSkgRmN0IyNmIChWYWwpCQkJCSAgICAgIFwKKwkJICAgICA6IChSZXRUeXBlKSBfX3RnbWwoRmN0KSAoVmFsKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkoVmFsMSwgVmFsMiwgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwxKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIEZjdCAoVmFsMSwgVmFsMikJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChmbG9hdCkpCQkgICAgICBcCisJCSAgICAgPyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgRmN0IyNmIChWYWwxLCBWYWwyKQkgICAgICBcCisJCSAgICAgOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIpKSkKKworIyBkZWZpbmUgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWShWYWwxLCBWYWwyLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoc2l6ZW9mIChWYWwxKSA+IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgIHx8IHNpemVvZiAoVmFsMikgPiBzaXplb2YgKGRvdWJsZSkpCQkgICAgICBcCisJCSAgICAgICYmIF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlICgoVmFsMSkgKyAoVmFsMikpID09IDgpICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBfX3RnbWwoRmN0KSAoVmFsMSwgVmFsMikJCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBzaXplb2YgKFZhbDIpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDEpICE9IDgJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwyKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QgKFZhbDEsIFZhbDIpCQkJCQkgICAgICBcCisJCSAgICAgOiAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCMjZiAoVmFsMSwgVmFsMikpKQorCisjIGRlZmluZSBfX1RHTUFUSF9URVJOQVJZX0ZJUlNUX1NFQ09ORF9SRUFMX09OTFkoVmFsMSwgVmFsMiwgVmFsMywgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoKHNpemVvZiAoVmFsMSkgPiBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgICB8fCBzaXplb2YgKFZhbDIpID4gc2l6ZW9mIChkb3VibGUpKQkJICAgICAgXAorCQkgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoKFZhbDEpICsgKFZhbDIpKSA9PSA4KSAgICAgIFwKKwkJICAgICA/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkgICAgICAgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIsIFZhbDMpCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBzaXplb2YgKFZhbDIpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDEpICE9IDgJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwyKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QgKFZhbDEsIFZhbDIsIFZhbDMpCQkJCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkgICAgICAgRmN0IyNmIChWYWwxLCBWYWwyLCBWYWwzKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1RFUk5BUllfUkVBTF9PTkxZKFZhbDEsIFZhbDIsIFZhbDMsIEZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKChzaXplb2YgKFZhbDEpID4gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChWYWwyKSA+IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChWYWwzKSA+IHNpemVvZiAoZG91YmxlKSkJCSAgICAgIFwKKwkJICAgICAgJiYgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKChWYWwxKSArIChWYWwyKSArIChWYWwzKSkgICBcCisJCQkgPT0gOCkJCQkJCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwzKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIF9fdGdtbChGY3QpIChWYWwxLCBWYWwyLCBWYWwzKQkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKFZhbDEpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgc2l6ZW9mIChWYWwyKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoVmFsMykgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMSkgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDIpICE9IDgJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwzKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMykpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QgKFZhbDEsIFZhbDIsIFZhbDMpCQkJCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDMpKSAwKSkJICAgICAgXAorCQkgICAgICAgRmN0IyNmIChWYWwxLCBWYWwyLCBWYWwzKSkpCisKKy8qIFhYWCBUaGlzIGRlZmluaXRpb24gaGFzIHRvIGJlIGNoYW5nZWQgYXMgc29vbiBhcyB0aGUgY29tcGlsZXIgdW5kZXJzdGFuZHMKKyAgIHRoZSBpbWFnaW5hcnkga2V5d29yZC4gICovCisjIGRlZmluZSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcoVmFsLCBGY3QsIENmY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKFZhbCkpICE9IDgpCSAgICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIEZjdCAoVmFsKQkJICAgICAgXAorCQkJOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBDZmN0IChWYWwpKQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChmbG9hdCkpCSAgICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIEZjdCMjZiAoVmFsKQkgICAgICBcCisJCQk6IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIENmY3QjI2YgKFZhbCkpCSAgICAgIFwKKwkJICAgICA6ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIF9fdGdtbChGY3QpIChWYWwpCSAgICAgIFwKKwkJCTogKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgX190Z21sKENmY3QpIChWYWwpKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX0lNQUcoVmFsLCBDZmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwpKSAhPSA4KQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2ZfXyAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMAkgICAgICBcCisJCQkJICAgICsgX0NvbXBsZXhfSSkpIENmY3QgKFZhbCkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGZsb2F0KSkJICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mX18gKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDAJICAgICAgXAorCQkJCSAgICArIF9Db21wbGV4X0kpKSBDZmN0IyNmIChWYWwpCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZl9fICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwCSAgICAgIFwKKwkJCQkgICAgKyBfQ29tcGxleF9JKSkgX190Z21sKENmY3QpIChWYWwpKSkKKworLyogWFhYIFRoaXMgZGVmaW5pdGlvbiBoYXMgdG8gYmUgY2hhbmdlZCBhcyBzb29uIGFzIHRoZSBjb21waWxlciB1bmRlcnN0YW5kcworICAgdGhlIGltYWdpbmFyeSBrZXl3b3JkLiAgKi8KKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTChWYWwsIEZjdCwgQ2ZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoZG91YmxlKQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsKSkgIT0gOCkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgRmN0IChWYWwpCQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIENmY3QgKFZhbCkpCQkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChmbG9hdCkpCSAgICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIEZjdCMjZiAoVmFsKQkJCQkJICAgICAgXAorCQkJOiAoX190eXBlb2ZfXyAoX19yZWFsX18gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMCkpXAorCQkJICBDZmN0IyNmIChWYWwpKQkJCQkgICAgICBcCisJCSAgICAgOiAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoVmFsKSkJICAgICAgXAorCQkJPyAoX190eXBlb2ZfXyAoX19yZWFsX18gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMCkpXAorCQkJICBfX3RnbWwoRmN0KSAoVmFsKQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIF9fdGdtbChDZmN0KSAoVmFsKSkpKQorCisvKiBYWFggVGhpcyBkZWZpbml0aW9uIGhhcyB0byBiZSBjaGFuZ2VkIGFzIHNvb24gYXMgdGhlIGNvbXBpbGVyIHVuZGVyc3RhbmRzCisgICB0aGUgaW1hZ2luYXJ5IGtleXdvcmQuICAqLworIyBkZWZpbmUgX19UR01BVEhfQklOQVJZX1JFQUxfSU1BRyhWYWwxLCBWYWwyLCBGY3QsIENmY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID4gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJICAgICAgIHx8IHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA+IHNpemVvZiAoZG91YmxlKSkJICAgICAgXAorCQkgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKFZhbDEpCSAgICAgIFwKKwkJCQkJCSAgKyBfX3JlYWxfXyAoVmFsMikpID09IDgpICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID09IHNpemVvZiAoVmFsMSkJICAgICAgXAorCQkJICYmIHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA9PSBzaXplb2YgKFZhbDIpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIF9fdGdtbChGY3QpIChWYWwxLCBWYWwyKQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgX190Z21sKENmY3QpIChWYWwxLCBWYWwyKSkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID09IHNpemVvZiAoZG91YmxlKQkgICAgICBcCisJCQl8fCBzaXplb2YgKF9fcmVhbF9fIChWYWwyKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsMSkpICE9IDggICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsMikpICE9IDgpICAgIFwKKwkJICAgICA/ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsMSkpID09IHNpemVvZiAoVmFsMSkJICAgICAgXAorCQkJICYmIHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA9PSBzaXplb2YgKFZhbDIpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIEZjdCAoVmFsMSwgVmFsMikJCQkJICAgICAgXAorCQkJOiAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkJICBDZmN0IChWYWwxLCBWYWwyKSkJCQkJICAgICAgXAorCQkgICAgIDogKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChWYWwxKQkgICAgICBcCisJCQkgJiYgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID09IHNpemVvZiAoVmFsMikpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgRmN0IyNmIChWYWwxLCBWYWwyKQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIENmY3QjI2YgKFZhbDEsIFZhbDIpKSkpCisjZWxzZQorIyBlcnJvciAiVW5zdXBwb3J0ZWQgY29tcGlsZXI7IHlvdSBjYW5ub3QgdXNlIDx0Z21hdGguaD4iCisjZW5kaWYKKworCisvKiBVbmFyeSBmdW5jdGlvbnMgZGVmaW5lZCBmb3IgcmVhbCBhbmQgY29tcGxleCB2YWx1ZXMuICAqLworCisKKy8qIFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLiAgKi8KKworLyogQXJjIGNvc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgYWNvcyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhY29zLCBjYWNvcykKKy8qIEFyYyBzaW5lIG9mIFguICAqLworI2RlZmluZSBhc2luKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFzaW4sIGNhc2luKQorLyogQXJjIHRhbmdlbnQgb2YgWC4gICovCisjZGVmaW5lIGF0YW4oVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYXRhbiwgY2F0YW4pCisvKiBBcmMgdGFuZ2VudCBvZiBZL1guICAqLworI2RlZmluZSBhdGFuMihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBhdGFuMikKKworLyogQ29zaW5lIG9mIFguICAqLworI2RlZmluZSBjb3MoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgY29zLCBjY29zKQorLyogU2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgc2luKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIHNpbiwgY3NpbikKKy8qIFRhbmdlbnQgb2YgWC4gICovCisjZGVmaW5lIHRhbihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCB0YW4sIGN0YW4pCisKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGFyYyBjb3NpbmUgb2YgWC4gICovCisjZGVmaW5lIGFjb3NoKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFjb3NoLCBjYWNvc2gpCisvKiBIeXBlcmJvbGljIGFyYyBzaW5lIG9mIFguICAqLworI2RlZmluZSBhc2luaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhc2luaCwgY2FzaW5oKQorLyogSHlwZXJib2xpYyBhcmMgdGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgYXRhbmgoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYXRhbmgsIGNhdGFuaCkKKworLyogSHlwZXJib2xpYyBjb3NpbmUgb2YgWC4gICovCisjZGVmaW5lIGNvc2goVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgY29zaCwgY2Nvc2gpCisvKiBIeXBlcmJvbGljIHNpbmUgb2YgWC4gICovCisjZGVmaW5lIHNpbmgoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgc2luaCwgY3NpbmgpCisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWC4gICovCisjZGVmaW5lIHRhbmgoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgdGFuaCwgY3RhbmgpCisKKworLyogRXhwb25lbnRpYWwgYW5kIGxvZ2FyaXRobWljIGZ1bmN0aW9ucy4gICovCisKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFguICAqLworI2RlZmluZSBleHAoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgZXhwLCBjZXhwKQorCisvKiBCcmVhayBWQUxVRSBpbnRvIGEgbm9ybWFsaXplZCBmcmFjdGlvbiBhbmQgYW4gaW50ZWdyYWwgcG93ZXIgb2YgMi4gICovCisjZGVmaW5lIGZyZXhwKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGZyZXhwKQorCisvKiBYIHRpbWVzICh0d28gdG8gdGhlIEVYUCBwb3dlcikuICAqLworI2RlZmluZSBsZGV4cChWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfRklSU1RfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBsZGV4cCkKKworLyogTmF0dXJhbCBsb2dhcml0aG0gb2YgWC4gICovCisjZGVmaW5lIGxvZyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBsb2csIGNsb2cpCisKKy8qIEJhc2UtdGVuIGxvZ2FyaXRobSBvZiBYLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIGxvZzEwKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGxvZzEwLCBfX2Nsb2cxMCkKKyNlbHNlCisjIGRlZmluZSBsb2cxMChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBsb2cxMCkKKyNlbmRpZgorCisvKiBSZXR1cm4gZXhwKFgpIC0gMS4gICovCisjZGVmaW5lIGV4cG0xKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGV4cG0xKQorCisvKiBSZXR1cm4gbG9nKDEgKyBYKS4gICovCisjZGVmaW5lIGxvZzFwKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxvZzFwKQorCisvKiBSZXR1cm4gdGhlIGJhc2UgMiBzaWduZWQgaW50ZWdyYWwgZXhwb25lbnQgb2YgWC4gICovCisjZGVmaW5lIGxvZ2IoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbG9nYikKKworLyogQ29tcHV0ZSBiYXNlLTIgZXhwb25lbnRpYWwgb2YgWC4gICovCisjZGVmaW5lIGV4cDIoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZXhwMikKKworLyogQ29tcHV0ZSBiYXNlLTIgbG9nYXJpdGhtIG9mIFguICAqLworI2RlZmluZSBsb2cyKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxvZzIpCisKKworLyogUG93ZXIgZnVuY3Rpb25zLiAgKi8KKworLyogUmV0dXJuIFggdG8gdGhlIFkgcG93ZXIuICAqLworI2RlZmluZSBwb3coVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfSU1BRyAoVmFsMSwgVmFsMiwgcG93LCBjcG93KQorCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFguICAqLworI2RlZmluZSBzcXJ0KFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIHNxcnQsIGNzcXJ0KQorCisvKiBSZXR1cm4gYHNxcnQoWCpYICsgWSpZKScuICAqLworI2RlZmluZSBoeXBvdChWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBoeXBvdCkKKworLyogUmV0dXJuIHRoZSBjdWJlIHJvb3Qgb2YgWC4gICovCisjZGVmaW5lIGNicnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgY2JydCkKKworCisvKiBOZWFyZXN0IGludGVnZXIsIGFic29sdXRlIHZhbHVlLCBhbmQgcmVtYWluZGVyIGZ1bmN0aW9ucy4gICovCisKKy8qIFNtYWxsZXN0IGludGVncmFsIHZhbHVlIG5vdCBsZXNzIHRoYW4gWC4gICovCisjZGVmaW5lIGNlaWwoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgY2VpbCkKKworLyogQWJzb2x1dGUgdmFsdWUgb2YgWC4gICovCisjZGVmaW5lIGZhYnMoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUdfUkVUX1JFQUwgKFZhbCwgZmFicywgY2FicykKKworLyogTGFyZ2VzdCBpbnRlZ2VyIG5vdCBncmVhdGVyIHRoYW4gWC4gICovCisjZGVmaW5lIGZsb29yKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGZsb29yKQorCisvKiBGbG9hdGluZy1wb2ludCBtb2R1bG8gcmVtYWluZGVyIG9mIFgvWS4gICovCisjZGVmaW5lIGZtb2QoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZm1vZCkKKworLyogUm91bmQgWCB0byBpbnRlZ3JhbCB2YWx1ZWluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCB1c2luZyBjdXJyZW50CisgICByb3VuZGluZyBkaXJlY3Rpb24sIGJ1dCBkbyBub3QgcmFpc2UgaW5leGFjdCBleGNlcHRpb24uICAqLworI2RlZmluZSBuZWFyYnlpbnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbmVhcmJ5aW50KQorCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheSBmcm9tCisgICB6ZXJvLiAgKi8KKyNkZWZpbmUgcm91bmQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgcm91bmQpCisKKy8qIFJvdW5kIFggdG8gdGhlIGludGVncmFsIHZhbHVlIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCBuZWFyZXN0IGJ1dAorICAgbm90IGxhcmdlciBpbiBtYWduaXR1ZGUuICAqLworI2RlZmluZSB0cnVuYyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCB0cnVuYykKKworLyogQ29tcHV0ZSByZW1haW5kZXIgb2YgWCBhbmQgWSBhbmQgcHV0IGluICpRVU8gYSB2YWx1ZSB3aXRoIHNpZ24gb2YgeC95CisgICBhbmQgbWFnbml0dWRlIGNvbmdydWVudCBgbW9kIDJebicgdG8gdGhlIG1hZ25pdHVkZSBvZiB0aGUgaW50ZWdyYWwKKyAgIHF1b3RpZW50IHgveSwgd2l0aCBuID49IDMuICAqLworI2RlZmluZSByZW1xdW8oVmFsMSwgVmFsMiwgVmFsMykgXAorICAgICBfX1RHTUFUSF9URVJOQVJZX0ZJUlNUX1NFQ09ORF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIFZhbDMsIHJlbXF1bykKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlIGFjY29yZGluZyB0byBjdXJyZW50IHJvdW5kaW5nCisgICBkaXJlY3Rpb24uICAqLworI2RlZmluZSBscmludChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBpbnQsIGxyaW50KQorI2RlZmluZSBsbHJpbnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX1JFVF9PTkxZIChWYWwsIGxvbmcgbG9uZyBpbnQsIGxscmludCkKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbQorICAgemVyby4gICovCisjZGVmaW5lIGxyb3VuZChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBpbnQsIGxyb3VuZCkKKyNkZWZpbmUgbGxyb3VuZChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBsb25nIGludCwgbGxyb3VuZCkKKworCisvKiBSZXR1cm4gWCB3aXRoIGl0cyBzaWduZWQgY2hhbmdlZCB0byBZJ3MuICAqLworI2RlZmluZSBjb3B5c2lnbihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBjb3B5c2lnbikKKworLyogRXJyb3IgYW5kIGdhbW1hIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIGVyZihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBlcmYpCisjZGVmaW5lIGVyZmMoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZXJmYykKKyNkZWZpbmUgdGdhbW1hKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIHRnYW1tYSkKKyNkZWZpbmUgbGdhbW1hKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxnYW1tYSkKKworCisvKiBSZXR1cm4gdGhlIGludGVnZXIgbmVhcmVzdCBYIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlCisgICBwcmV2YWlsaW5nIHJvdW5kaW5nIG1vZGUuICAqLworI2RlZmluZSByaW50KFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIHJpbnQpCisKKy8qIFJldHVybiBYICsgZXBzaWxvbiBpZiBYIDwgWSwgWCAtIGVwc2lsb24gaWYgWCA+IFkuICAqLworI2RlZmluZSBuZXh0YWZ0ZXIoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgbmV4dGFmdGVyKQorI2RlZmluZSBuZXh0dG93YXJkKFZhbDEsIFZhbDIpIFwKKyAgICAgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgbmV4dHRvd2FyZCkKKworLyogUmV0dXJuIHRoZSByZW1haW5kZXIgb2YgaW50ZWdlciBkaXZpc29uIFggLyBZIHdpdGggaW5maW5pdGUgcHJlY2lzaW9uLiAgKi8KKyNkZWZpbmUgcmVtYWluZGVyKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHJlbWFpbmRlcikKKworLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisjIGRlZmluZSBzY2FsYihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBzY2FsYikKKyNlbmRpZgorCisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCisjZGVmaW5lIHNjYWxibihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfRklSU1RfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBzY2FsYm4pCisKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KKyNkZWZpbmUgc2NhbGJsbihWYWwxLCBWYWwyKSBcCisgICAgIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHNjYWxibG4pCisKKy8qIFJldHVybiB0aGUgYmluYXJ5IGV4cG9uZW50IG9mIFgsIHdoaWNoIG11c3QgYmUgbm9uemVyby4gICovCisjZGVmaW5lIGlsb2diKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBpbnQsIGlsb2diKQorCisKKy8qIFJldHVybiBwb3NpdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gWCBhbmQgWS4gICovCisjZGVmaW5lIGZkaW0oVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZmRpbSkKKworLyogUmV0dXJuIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworI2RlZmluZSBmbWF4KFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGZtYXgpCisKKy8qIFJldHVybiBtaW5pbXVtIG51bWVyaWMgdmFsdWUgZnJvbSBYIGFuZCBZLiAgKi8KKyNkZWZpbmUgZm1pbihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBmbWluKQorCisKKy8qIE11bHRpcGx5LWFkZCBmdW5jdGlvbiBjb21wdXRlZCBhcyBhIHRlcm5hcnkgb3BlcmF0aW9uLiAgKi8KKyNkZWZpbmUgZm1hKFZhbDEsIFZhbDIsIFZhbDMpIFwKKyAgICAgX19UR01BVEhfVEVSTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIFZhbDMsIGZtYSkKKworCisvKiBBYnNvbHV0ZSB2YWx1ZSwgY29uanVnYXRlcywgYW5kIHByb2plY3Rpb24uICAqLworCisvKiBBcmd1bWVudCB2YWx1ZSBvZiBaLiAgKi8KKyNkZWZpbmUgY2FyZyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTCAoVmFsLCBjYXJnLCBjYXJnKQorCisvKiBDb21wbGV4IGNvbmp1Z2F0ZSBvZiBaLiAgKi8KKyNkZWZpbmUgY29uaihWYWwpIF9fVEdNQVRIX1VOQVJZX0lNQUcgKFZhbCwgY29uaikKKworLyogUHJvamVjdGlvbiBvZiBaIG9udG8gdGhlIFJpZW1hbm4gc3BoZXJlLiAgKi8KKyNkZWZpbmUgY3Byb2ooVmFsKSBfX1RHTUFUSF9VTkFSWV9JTUFHIChWYWwsIGNwcm9qKQorCisKKy8qIERlY29tcG9zaW5nIGNvbXBsZXggdmFsdWVzLiAgKi8KKworLyogSW1hZ2luYXJ5IHBhcnQgb2YgWi4gICovCisjZGVmaW5lIGNpbWFnKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMIChWYWwsIGNpbWFnLCBjaW1hZykKKworLyogUmVhbCBwYXJ0IG9mIFouICAqLworI2RlZmluZSBjcmVhbChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTCAoVmFsLCBjcmVhbCwgY3JlYWwpCisKKyNlbmRpZiAvKiB0Z21hdGguaCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYWJtaW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9hYm1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDg3ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYWJtaW50cmluLmgKQEAgLTAsMCArMSw1NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxhYm1pbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQUJNX18KKyMgZXJyb3IgIkFCTSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19BQk1fXyAqLworCisjaWZuZGVmIF9BQk1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfQUJNSU5UUklOX0hfSU5DTFVERUQKKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19semNudDE2ICh1bnNpZ25lZCBzaG9ydCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6cyAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHpjbnQgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6IChfX1gpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x6Y250NjQgKHVuc2lnbmVkIGxvbmcgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2NsemwgKF9fWCk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9BQk1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYW1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9hbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ3YjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYW1taW50cmluLmgKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBBTUQgUHJvZ3JhbW1lcnMKKyAgIE1hbnVhbCBVcGRhdGUsIHZlcnNpb24gMi54ICovCisKKyNpZm5kZWYgX0FNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9BTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFNEFfXworIyBlcnJvciAiU1NFNEEgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCBkZWZpbml0aW9ucyBmcm9tIHRoZSBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyIGZpbGVzKi8KKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NkIChkb3VibGUgKiBfX1AsIF9fbTEyOGQgX19ZKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHNkIChfX1AsIChfX3YyZGYpIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9zcyAoZmxvYXQgKiBfX1AsIF9fbTEyOCBfX1kpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vdm50c3MgKF9fUCwgKF9fdjRzZikgX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9zaTY0IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfZXh0cnEgKChfX3YyZGkpIF9fWCwgKF9fdjE2cWkpIF9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RpX3NpNjQgKF9fbTEyOGkgX19YLCB1bnNpZ25lZCBjb25zdCBpbnQgX19JLCB1bnNpZ25lZCBjb25zdCBpbnQgX19MKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4dHJxaSAoKF9fdjJkaSkgX19YLCBfX0ksIF9fTCk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fZXh0cmFjdGlfc2k2NChYLCBJLCBMKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2V4dHJxaSAoKF9fdjJkaSkoX19tMTI4aSkoWCksCQlcCisJCQkJICAgICh1bnNpZ25lZCBpbnQpKEkpLCAodW5zaWduZWQgaW50KShMKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X3NpNjQgKF9fbTEyOGkgX19YLF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2luc2VydHEgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydGlfc2k2NChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIHVuc2lnbmVkIGNvbnN0IGludCBfX0ksIHVuc2lnbmVkIGNvbnN0IGludCBfX0wpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfaW5zZXJ0cWkgKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSwgX19JLCBfX0wpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2luc2VydGlfc2k2NChYLCBZLCBJLCBMKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2luc2VydHFpICgoX192MmRpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAoX192MmRpKShfX20xMjhpKShZKSwJCVwKKwkJCQkgICAgICAodW5zaWduZWQgaW50KShJKSwgKHVuc2lnbmVkIGludCkoTCkpKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NTRTRBX18gKi8KKworI2VuZGlmIC8qIF9BTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYXZ4aW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9hdnhpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDQyMTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYXZ4aW50cmluLmgKQEAgLTAsMCArMSwxNDI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDExLjAuICAqLworCisjaWZuZGVmIF9JTU1JTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxhdnhpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGltbWludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBJbnRlcm5hbCBkYXRhIHR5cGVzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGludHJpbnNpY3MuICAqLwordHlwZWRlZiBkb3VibGUgX192NGRmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSkpOwordHlwZWRlZiBmbG9hdCBfX3Y4c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyBfX3Y0ZGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIGludCBfX3Y4c2kgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIHNob3J0IF9fdjE2aGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpKSk7Cit0eXBlZGVmIGNoYXIgX192MzJxaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKKworLyogVGhlIEludGVsIEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdGhhdCB3ZSBtdXN0IGFsbG93IGFsaWFzaW5nIHdpdGggb3RoZXIKKyAgIHZlY3RvciB0eXBlcywgYW5kIHRoZWlyIHNjYWxhciBjb21wb25lbnRzLiAgKi8KK3R5cGVkZWYgZmxvYXQgX19tMjU2IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDMyKSwKKwkJCQkgICAgIF9fbWF5X2FsaWFzX18pKTsKK3R5cGVkZWYgbG9uZyBsb25nIF9fbTI1NmkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpLAorCQkJCQkgIF9fbWF5X2FsaWFzX18pKTsKK3R5cGVkZWYgZG91YmxlIF9fbTI1NmQgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMzIpLAorCQkJCSAgICAgICBfX21heV9hbGlhc19fKSk7CisKKy8qIENvbXBhcmUgcHJlZGljYXRlcyBmb3Igc2NhbGFyIGFuZCBwYWNrZWQgY29tcGFyZSBpbnRyaW5zaWNzLiAgKi8KKworLyogRXF1YWwgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0VRX09RCTB4MDAKKy8qIExlc3MtdGhhbiAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MVF9PUwkweDAxCisvKiBMZXNzLXRoYW4tb3ItZXF1YWwgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTEVfT1MJMHgwMgorLyogVW5vcmRlcmVkIChub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9VTk9SRF9RCTB4MDMKKy8qIE5vdC1lcXVhbCAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9ORVFfVVEJMHgwNAorLyogTm90LWxlc3MtdGhhbiAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05MVF9VUwkweDA1CisvKiBOb3QtbGVzcy10aGFuLW9yLWVxdWFsICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfTkxFX1VTCTB4MDYKKy8qIE9yZGVyZWQgKG5vbnNpZ25hbGluZykgICAqLworI2RlZmluZSBfQ01QX09SRF9RCTB4MDcKKy8qIEVxdWFsICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0VRX1VRCTB4MDgKKy8qIE5vdC1ncmVhdGVyLXRoYW4tb3ItZXF1YWwgKHVub3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OR0VfVVMJMHgwOQorLyogTm90LWdyZWF0ZXItdGhhbiAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05HVF9VUwkweDBhCisvKiBGYWxzZSAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRkFMU0VfT1EJMHgwYgorLyogTm90LWVxdWFsIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9ORVFfT1EJMHgwYworLyogR3JlYXRlci10aGFuLW9yLWVxdWFsIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dFX09TCTB4MGQKKy8qIEdyZWF0ZXItdGhhbiAob3JkZXJlZCwgc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9HVF9PUwkweDBlCisvKiBUcnVlICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX1RSVUVfVVEJMHgwZgorLyogRXF1YWwgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRVFfT1MJMHgxMAorLyogTGVzcy10aGFuIChvcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9MVF9PUQkweDExCisvKiBMZXNzLXRoYW4tb3ItZXF1YWwgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0xFX09RCTB4MTIKKy8qIFVub3JkZXJlZCAoc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9VTk9SRF9TCTB4MTMKKy8qIE5vdC1lcXVhbCAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05FUV9VUwkweDE0CisvKiBOb3QtbGVzcy10aGFuICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05MVF9VUQkweDE1CisvKiBOb3QtbGVzcy10aGFuLW9yLWVxdWFsICh1bm9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05MRV9VUQkweDE2CisvKiBPcmRlcmVkIChzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX09SRF9TCTB4MTcKKy8qIEVxdWFsICh1bm9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRVFfVVMJMHgxOAorLyogTm90LWdyZWF0ZXItdGhhbi1vci1lcXVhbCAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OR0VfVVEJMHgxOQorLyogTm90LWdyZWF0ZXItdGhhbiAodW5vcmRlcmVkLCBub24tc2lnbmFsaW5nKSAgKi8KKyNkZWZpbmUgX0NNUF9OR1RfVVEJMHgxYQorLyogRmFsc2UgKG9yZGVyZWQsIHNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfRkFMU0VfT1MJMHgxYgorLyogTm90LWVxdWFsIChvcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX05FUV9PUwkweDFjCisvKiBHcmVhdGVyLXRoYW4tb3ItZXF1YWwgKG9yZGVyZWQsIG5vbi1zaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX0dFX09RCTB4MWQKKy8qIEdyZWF0ZXItdGhhbiAob3JkZXJlZCwgbm9uLXNpZ25hbGluZykgICovCisjZGVmaW5lIF9DTVBfR1RfT1EJMHgxZQorLyogVHJ1ZSAodW5vcmRlcmVkLCBzaWduYWxpbmcpICAqLworI2RlZmluZSBfQ01QX1RSVUVfVVMJMHgxZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hZGRfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hZGRwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYWRkc3VicGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYWRkc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYWRkc3VicHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYW5kX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYW5kcGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYW5kX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfYW5kcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2FuZG5vdF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2FuZG5wZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9hbmRub3RfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9hbmRucHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKKy8qIERvdWJsZS9zaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGJsZW5kIGluc3RydWN0aW9ucyAtIHNlbGVjdAorICAgZGF0YSBmcm9tIDIgc291cmNlcyB1c2luZyBjb25zdGFudC92YXJpYWJsZSBtYXNrLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYmxlbmRfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHBkMjU2ICgoX192NGRmKV9fWCwKKwkJCQkJICAgICAgKF9fdjRkZilfX1ksCisJCQkJCSAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYmxlbmRfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9ibGVuZHBzMjU2ICgoX192OHNmKV9fWCwKKwkJCQkJICAgICAoX192OHNmKV9fWSwKKwkJCQkJICAgICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tMjU2X2JsZW5kX3BkKFgsIFksIE0pCQkJCQlcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfYmxlbmRwZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCQlcCisJCQkJCShfX3Y0ZGYpKF9fbTI1NmQpKFkpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tMjU2X2JsZW5kX3BzKFgsIFksIE0pCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9ibGVuZHBzMjU2ICgoX192OHNmKShfX20yNTYpKFgpLAkJXAorCQkJCSAgICAgICAoX192OHNmKShfX20yNTYpKFkpLCAoaW50KShNKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYmxlbmR2X3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1ksIF9fbTI1NmQgX19NKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkMjU2ICgoX192NGRmKV9fWCwKKwkJCQkJICAgICAgIChfX3Y0ZGYpX19ZLAorCQkJCQkgICAgICAgKF9fdjRkZilfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2JsZW5kdl9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSwgX19tMjU2IF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBzMjU2ICgoX192OHNmKV9fWCwKKwkJCQkJICAgICAgKF9fdjhzZilfX1ksCisJCQkJCSAgICAgIChfX3Y4c2YpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZGl2X3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfZGl2cGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZGl2X3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZGl2cHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKKy8qIERvdCBwcm9kdWN0IGluc3RydWN0aW9ucyB3aXRoIG1hc2stZGVmaW5lZCBzdW1taW5nIGFuZCB6ZXJvaW5nIHBhcnRzCisgICBvZiByZXN1bHQuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2RwX3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfZHBwczI1NiAoKF9fdjhzZilfX1gsCisJCQkJCSAgKF9fdjhzZilfX1ksCisJCQkJCSAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9kcF9wcyhYLCBZLCBNKQkJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2RwcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCQlcCisJCQkJICAgIChfX3Y4c2YpKF9fbTI1NikoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9oYWRkX3BkIChfX20yNTZkIF9fWCwgX19tMjU2ZCBfX1kpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfaGFkZHBkMjU2ICgoX192NGRmKV9fWCwgKF9fdjRkZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hhZGRfcHMgKF9fbTI1NiBfX1gsIF9fbTI1NiBfX1kpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9oYWRkcHMyNTYgKChfX3Y4c2YpX19YLCAoX192OHNmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2hzdWJfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9oc3VicGQyNTYgKChfX3Y0ZGYpX19YLCAoX192NGRmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaHN1Yl9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2hzdWJwczI1NiAoKF9fdjhzZilfX1gsIChfX3Y4c2YpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWF4X3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbWF4cGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWF4X3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbWF4cHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21pbl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX21pbnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21pbl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX21pbnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tdWxfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9tdWxwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tdWxfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9tdWxwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfb3JfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9vcnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X29yX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfb3JwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2h1ZmZsZV9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3NodWZwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLAorCQkJCQkgICAgIF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2h1ZmZsZV9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgY29uc3QgaW50IF9fbWFzaykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3NodWZwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLAorCQkJCQkgICAgX19tYXNrKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9zaHVmZmxlX3BkKEEsIEIsIE4pCQkJCQlcCisgICgoX19tMjU2ZClfX2J1aWx0aW5faWEzMl9zaHVmcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKEEpLAkJXAorCQkJCSAgICAgIChfX3Y0ZGYpKF9fbTI1NmQpKEIpLCAoaW50KShOKSkpCisKKyNkZWZpbmUgX21tMjU2X3NodWZmbGVfcHMoQSwgQiwgTikJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3NodWZwczI1NiAoKF9fdjhzZikoX19tMjU2KShBKSwJCVwKKwkJCQkgICAgICAoX192OHNmKShfX20yNTYpKEIpLCAoaW50KShOKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfc3VicGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfc3VicHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3hvcl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3hvcnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3hvcl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3hvcnBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgY29uc3QgaW50IF9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9jbXBwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZLCBfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcF9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSwgY29uc3QgaW50IF9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcHBzICgoX192NHNmKV9fWCwgKF9fdjRzZilfX1ksIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcF9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZLCBjb25zdCBpbnQgX19QKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2NtcHBkMjU2ICgoX192NGRmKV9fWCwgKF9fdjRkZilfX1ksCisJCQkJCSAgICBfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2NtcF9wcyAoX19tMjU2IF9fWCwgX19tMjU2IF9fWSwgY29uc3QgaW50IF9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2NtcHBzMjU2ICgoX192OHNmKV9fWCwgKF9fdjhzZilfX1ksCisJCQkJCSAgIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcF9zZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBjb25zdCBpbnQgX19QKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2NtcHNkICgoX192MmRmKV9fWCwgKF9fdjJkZilfX1ksIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wX3NzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBjb25zdCBpbnQgX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wc3MgKChfX3Y0c2YpX19YLCAoX192NHNmKV9fWSwgX19QKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9jbXBfcGQoWCwgWSwgUCkJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfY21wcGQgKChfX3YyZGYpKF9fbTEyOGQpKFgpLAkJXAorCQkJCSAgIChfX3YyZGYpKF9fbTEyOGQpKFkpLCAoaW50KShQKSkpCisKKyNkZWZpbmUgX21tX2NtcF9wcyhYLCBZLCBQKQkJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcHBzICgoX192NHNmKShfX20xMjgpKFgpLAkJCVwKKwkJCQkgIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKFApKSkKKworI2RlZmluZSBfbW0yNTZfY21wX3BkKFgsIFksIFApCQkJCQkJXAorICAoKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX2NtcHBkMjU2ICgoX192NGRmKShfX20yNTZkKShYKSwJCVwKKwkJCQkgICAgICAoX192NGRmKShfX20yNTZkKShZKSwgKGludCkoUCkpKQorCisjZGVmaW5lIF9tbTI1Nl9jbXBfcHMoWCwgWSwgUCkJCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9jbXBwczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJCVwKKwkJCQkgICAgIChfX3Y4c2YpKF9fbTI1NikoWSksIChpbnQpKFApKSkKKworI2RlZmluZSBfbW1fY21wX3NkKFgsIFksIFApCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2NtcHNkICgoX192MmRmKShfX20xMjhkKShYKSwJCVwKKwkJCQkgICAoX192MmRmKShfX20xMjhkKShZKSwgKGludCkoUCkpKQorCisjZGVmaW5lIF9tbV9jbXBfc3MoWCwgWSwgUCkJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBzcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCQlcCisJCQkJICAoX192NHNmKShfX20xMjgpKFkpLCAoaW50KShQKSkpCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpMzJfcGQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpX19idWlsdGluX2lhMzJfY3Z0ZHEycGQyNTYgKChfX3Y0c2kpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0ZXBpMzJfcHMgKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTI1NilfX2J1aWx0aW5faWEzMl9jdnRkcTJwczI1NiAoKF9fdjhzaSkgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRwZF9wcyAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzMjU2ICgoX192NGRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRwc19lcGkzMiAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKV9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxMjU2ICgoX192OHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRwc19wZCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKV9fYnVpbHRpbl9pYTMyX2N2dHBzMnBkMjU2ICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnR0cGRfZXBpMzIgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxMjU2ICgoX192NGRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRwZF9lcGkzMiAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTI1NiAoKF9fdjRkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY3Z0dHBzX2VwaTMyIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NmkpX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxMjU2ICgoX192OHNmKSBfX0EpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0ZjEyOF9wZCAoX19tMjU2ZCBfX1gsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmV4dHJhY3RmMTI4X3BkMjU2ICgoX192NGRmKV9fWCwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0ZjEyOF9wcyAoX19tMjU2IF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9wczI1NiAoKF9fdjhzZilfX1gsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX20yNTZpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZXh0cmFjdGYxMjhfc2kyNTYgKChfX3Y4c2kpX19YLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2V4dHJhY3RfZXBpMzIgKF9fbTI1NmkgX19YLCBpbnQgY29uc3QgX19OKQoreworICBfX20xMjhpIF9fWSA9IF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NiAoX19YLCBfX04gPj4gMik7CisgIHJldHVybiBfbW1fZXh0cmFjdF9lcGkzMiAoX19ZLCBfX04gJSA0KTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0X2VwaTE2IChfX20yNTZpIF9fWCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDMpOworICByZXR1cm4gX21tX2V4dHJhY3RfZXBpMTYgKF9fWSwgX19OICUgOCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfZXh0cmFjdF9lcGk4IChfX20yNTZpIF9fWCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDQpOworICByZXR1cm4gX21tX2V4dHJhY3RfZXBpOCAoX19ZLCBfX04gJSAxNik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9leHRyYWN0X2VwaTY0IChfX20yNTZpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDEpOworICByZXR1cm4gX21tX2V4dHJhY3RfZXBpNjQgKF9fWSwgX19OICUgMik7Cit9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0ZjEyOF9wZChYLCBOKQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9wZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCVwKKwkJCQkJCShpbnQpKE4pKSkKKworI2RlZmluZSBfbW0yNTZfZXh0cmFjdGYxMjhfcHMoWCwgTikJCQkJCVwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9wczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJXAorCQkJCQkgICAgICAgKGludCkoTikpKQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0ZjEyOF9zaTI1NihYLCBOKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZleHRyYWN0ZjEyOF9zaTI1NiAoKF9fdjhzaSkoX19tMjU2aSkoWCksCVwKKwkJCQkJCShpbnQpKE4pKSkKKworI2RlZmluZSBfbW0yNTZfZXh0cmFjdF9lcGkzMihYLCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiAyKTsJCVwKKyAgICAgIF9tbV9leHRyYWN0X2VwaTMyIChfX1ksIChOKSAlIDQpOwkJCQkJXAorICAgIH0pKQorCisjZGVmaW5lIF9tbTI1Nl9leHRyYWN0X2VwaTE2KFgsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDMpOwkJXAorICAgICAgX21tX2V4dHJhY3RfZXBpMTYgKF9fWSwgKE4pICUgOCk7CQkJCQlcCisgICAgfSkpCisKKyNkZWZpbmUgX21tMjU2X2V4dHJhY3RfZXBpOChYLCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiA0KTsJCVwKKyAgICAgIF9tbV9leHRyYWN0X2VwaTggKF9fWSwgKE4pICUgMTYpOwkJCQkJXAorICAgIH0pKQorCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBfbW0yNTZfZXh0cmFjdF9lcGk2NChYLCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiAxKTsJCVwKKyAgICAgIF9tbV9leHRyYWN0X2VwaTY0IChfX1ksIChOKSAlIDIpOwkJCQkJXAorICAgIH0pKQorI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfemVyb2FsbCAodm9pZCkKK3sKKyAgX19idWlsdGluX2lhMzJfdnplcm9hbGwgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3plcm91cHBlciAodm9pZCkKK3sKKyAgX19idWlsdGluX2lhMzJfdnplcm91cHBlciAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybXV0ZXZhcl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZCAoKF9fdjJkZilfX0EsCisJCQkJCQkoX192MmRpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGV2YXJfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZpIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQyNTYgKChfX3Y0ZGYpX19BLAorCQkJCQkJICAgKF9fdjRkaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm11dGV2YXJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzICgoX192NHNmKV9fQSwKKwkJCQkJICAgICAgIChfX3Y0c2kpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRldmFyX3BzIChfX20yNTYgX19BLCBfX20yNTZpIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczI1NiAoKF9fdjhzZilfX0EsCisJCQkJCQkgIChfX3Y4c2kpX19DKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybXV0ZV9wZCAoX19tMTI4ZCBfX1gsIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHBkICgoX192MmRmKV9fWCwgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZV9wZCAoX19tMjU2ZCBfX1gsIGNvbnN0IGludCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHBkMjU2ICgoX192NGRmKV9fWCwgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtdXRlX3BzIChfX20xMjggX19YLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm1pbHBzICgoX192NHNmKV9fWCwgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9wZXJtdXRlX3BzIChfX20yNTYgX19YLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm1pbHBzMjU2ICgoX192OHNmKV9fWCwgX19DKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9wZXJtdXRlX3BkKFgsIEMpCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksIChpbnQpKEMpKSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZV9wZChYLCBDKQkJCQkJCVwKKyAgKChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92cGVybWlscGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAkoaW50KShDKSkpCisKKyNkZWZpbmUgX21tX3Blcm11dGVfcHMoWCwgQykJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybWlscHMgKChfX3Y0c2YpKF9fbTEyOCkoWCksIChpbnQpKEMpKSkKKworI2RlZmluZSBfbW0yNTZfcGVybXV0ZV9wcyhYLCBDKQkJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWxwczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwgKGludCkoQykpKQorI2VuZGlmCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGUyZjEyOF9wZCAoX19tMjU2ZCBfX1gsIF9fbTI1NmQgX19ZLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcGQyNTYgKChfX3Y0ZGYpX19YLAorCQkJCQkJICAgIChfX3Y0ZGYpX19ZLAorCQkJCQkJICAgIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZTJmMTI4X3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9wczI1NiAoKF9fdjhzZilfX1gsCisJCQkJCQkgICAoX192OHNmKV9fWSwKKwkJCQkJCSAgIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGUyZjEyOF9zaTI1NiAoX19tMjU2aSBfX1gsIF9fbTI1NmkgX19ZLCBjb25zdCBpbnQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfc2kyNTYgKChfX3Y4c2kpX19YLAorCQkJCQkJICAgIChfX3Y4c2kpX19ZLAorCQkJCQkJICAgIF9fQyk7Cit9CisjZWxzZQorI2RlZmluZSBfbW0yNTZfcGVybXV0ZTJmMTI4X3BkKFgsIFksIEMpCQkJCQlcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm0yZjEyOF9wZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCVwKKwkJCQkJICAgICAgKF9fdjRkZikoX19tMjU2ZCkoWSksCVwKKwkJCQkJICAgICAgKGludCkoQykpKQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMmYxMjhfcHMoWCwgWSwgQykJCQkJCVwKKyAgKChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfcHMyNTYgKChfX3Y4c2YpKF9fbTI1NikoWCksCVwKKwkJCQkJICAgICAoX192OHNmKShfX20yNTYpKFkpLAlcCisJCQkJCSAgICAgKGludCkoQykpKQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMmYxMjhfc2kyNTYoWCwgWSwgQykJCQkJXAorICAoKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtMmYxMjhfc2kyNTYgKChfX3Y4c2kpKF9fbTI1NmkpKFgpLAlcCisJCQkJCSAgICAgIChfX3Y4c2kpKF9fbTI1NmkpKFkpLAlcCisJCQkJCSAgICAgIChpbnQpKEMpKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Jyb2FkY2FzdF9zcyAoZmxvYXQgY29uc3QgKl9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3Zicm9hZGNhc3RzcyAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0X3NkIChkb3VibGUgY29uc3QgKl9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0c2QyNTYgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfYnJvYWRjYXN0X3NzIChmbG9hdCBjb25zdCAqX19YKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdHNzMjU2IChfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3RfcGQgKF9fbTEyOGQgY29uc3QgKl9fWCkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92YnJvYWRjYXN0ZjEyOF9wZDI1NiAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9icm9hZGNhc3RfcHMgKF9fbTEyOCBjb25zdCAqX19YKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmJyb2FkY2FzdGYxMjhfcHMyNTYgKF9fWCk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydGYxMjhfcGQgKF9fbTI1NmQgX19YLCBfX20xMjhkIF9fWSwgY29uc3QgaW50IF9fTykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9wZDI1NiAoKF9fdjRkZilfX1gsCisJCQkJCQkgICAgIChfX3YyZGYpX19ZLAorCQkJCQkJICAgICBfX08pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydGYxMjhfcHMgKF9fbTI1NiBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX08pCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9wczI1NiAoKF9fdjhzZilfX1gsCisJCQkJCQkgICAgKF9fdjRzZilfX1ksCisJCQkJCQkgICAgX19PKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoX19tMjU2aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19PKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX3ZpbnNlcnRmMTI4X3NpMjU2ICgoX192OHNpKV9fWCwKKwkJCQkJCSAgICAgKF9fdjRzaSlfX1ksCisJCQkJCQkgICAgIF9fTyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydF9lcGkzMiAoX19tMjU2aSBfX1gsIGludCBfX0QsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiAyKTsKKyAgX19ZID0gX21tX2luc2VydF9lcGkzMiAoX19ZLCBfX0QsIF9fTiAlIDQpOworICByZXR1cm4gX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKF9fWCwgX19ZLCBfX04gPj4gMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydF9lcGkxNiAoX19tMjU2aSBfX1gsIGludCBfX0QsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiAzKTsKKyAgX19ZID0gX21tX2luc2VydF9lcGkxNiAoX19ZLCBfX0QsIF9fTiAlIDgpOworICByZXR1cm4gX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKF9fWCwgX19ZLCBfX04gPj4gMyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydF9lcGk4IChfX20yNTZpIF9fWCwgaW50IF9fRCwgaW50IGNvbnN0IF9fTikKK3sKKyAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKF9fWCwgX19OID4+IDQpOworICBfX1kgPSBfbW1faW5zZXJ0X2VwaTggKF9fWSwgX19ELCBfX04gJSAxNik7CisgIHJldHVybiBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoX19YLCBfX1ksIF9fTiA+PiA0KTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2luc2VydF9lcGk2NCAoX19tMjU2aSBfX1gsIGxvbmcgbG9uZyBfX0QsIGludCBjb25zdCBfX04pCit7CisgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2IChfX1gsIF9fTiA+PiAxKTsKKyAgX19ZID0gX21tX2luc2VydF9lcGk2NCAoX19ZLCBfX0QsIF9fTiAlIDIpOworICByZXR1cm4gX21tMjU2X2luc2VydGYxMjhfc2kyNTYgKF9fWCwgX19ZLCBfX04gPj4gMSk7Cit9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRmMTI4X3BkKFgsIFksIE8pCQkJCQlcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmluc2VydGYxMjhfcGQyNTYgKChfX3Y0ZGYpKF9fbTI1NmQpKFgpLAlcCisJCQkJCSAgICAgICAoX192MmRmKShfX20xMjhkKShZKSwJXAorCQkJCQkgICAgICAgKGludCkoTykpKQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRmMTI4X3BzKFgsIFksIE8pCQkJCQlcCisgICgoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9wczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJXAorCQkJCQkgICAgICAoX192NHNmKShfX20xMjgpKFkpLCAgCVwKKwkJCQkJICAgICAgKGludCkoTykpKQorCisjZGVmaW5lIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2KFgsIFksIE8pCQkJCVwKKyAgKChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl92aW5zZXJ0ZjEyOF9zaTI1NiAoKF9fdjhzaSkoX19tMjU2aSkoWCksCVwKKwkJCQkJICAgICAgIChfX3Y0c2kpKF9fbTEyOGkpKFkpLAlcCisJCQkJCSAgICAgICAoaW50KShPKSkpCisKKyNkZWZpbmUgX21tMjU2X2luc2VydF9lcGkzMihYLCBELCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiAyKTsJCVwKKyAgICAgIF9fWSA9IF9tbV9pbnNlcnRfZXBpMzIgKF9fWSwgKEQpLCAoTikgJSA0KTsJCQlcCisgICAgICBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoKFgpLCBfX1ksIChOKSA+PiAyKTsJCQlcCisgICAgfSkpCisKKyNkZWZpbmUgX21tMjU2X2luc2VydF9lcGkxNihYLCBELCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiAzKTsJCVwKKyAgICAgIF9fWSA9IF9tbV9pbnNlcnRfZXBpMTYgKF9fWSwgKEQpLCAoTikgJSA4KTsJCQlcCisgICAgICBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoKFgpLCBfX1ksIChOKSA+PiAzKTsJCQlcCisgICAgfSkpCisKKyNkZWZpbmUgX21tMjU2X2luc2VydF9lcGk4KFgsIEQsIE4pCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX19tMTI4aSBfX1kgPSBfbW0yNTZfZXh0cmFjdGYxMjhfc2kyNTYgKChYKSwgKE4pID4+IDQpOwkJXAorICAgICAgX19ZID0gX21tX2luc2VydF9lcGk4IChfX1ksIChEKSwgKE4pICUgMTYpOwkJCVwKKyAgICAgIF9tbTI1Nl9pbnNlcnRmMTI4X3NpMjU2ICgoWCksIF9fWSwgKE4pID4+IDQpOwkJCVwKKyAgICB9KSkKKworI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX21tMjU2X2luc2VydF9lcGk2NChYLCBELCBOKQkJCQkJXAorICAoX19leHRlbnNpb25fXwkJCQkJCQlcCisgICAoewkJCQkJCQkJCVwKKyAgICAgIF9fbTEyOGkgX19ZID0gX21tMjU2X2V4dHJhY3RmMTI4X3NpMjU2ICgoWCksIChOKSA+PiAxKTsJCVwKKyAgICAgIF9fWSA9IF9tbV9pbnNlcnRfZXBpNjQgKF9fWSwgKEQpLCAoTikgJSAyKTsJCQlcCisgICAgICBfbW0yNTZfaW5zZXJ0ZjEyOF9zaTI1NiAoKFgpLCBfX1ksIChOKSA+PiAxKTsJCQlcCisgICAgfSkpCisjZW5kaWYKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sb2FkX3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICooX19tMjU2ZCAqKV9fUDsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RvcmVfcGQgKGRvdWJsZSAqX19QLCBfX20yNTZkIF9fQSkKK3sKKyAgKihfX20yNTZkICopX19QID0gX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2xvYWRfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAqKF9fbTI1NiAqKV9fUDsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RvcmVfcHMgKGZsb2F0ICpfX1AsIF9fbTI1NiBfX0EpCit7CisgICooX19tMjU2ICopX19QID0gX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sb2FkdV9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbG9hZHVwZDI1NiAoX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3RvcmV1X3BkIChkb3VibGUgKl9fUCwgX19tMjU2ZCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JldXBkMjU2IChfX1AsIChfX3Y0ZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sb2FkdV9wcyAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX2xvYWR1cHMyNTYgKF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0b3JldV9wcyAoZmxvYXQgKl9fUCwgX19tMjU2IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmV1cHMyNTYgKF9fUCwgKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sb2FkX3NpMjU2IChfX20yNTZpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAqX19QOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdG9yZV9zaTI1NiAoX19tMjU2aSAqX19QLCBfX20yNTZpIF9fQSkKK3sKKyAgKl9fUCA9IF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbG9hZHVfc2kyNTYgKF9fbTI1NmkgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9sb2FkZHF1MjU2ICgoY2hhciBjb25zdCAqKV9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0b3JldV9zaTI1NiAoX19tMjU2aSAqX19QLCBfX20yNTZpIF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfc3RvcmVkcXUyNTYgKChjaGFyICopX19QLCAoX192MzJxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrbG9hZF9wZCAoZG91YmxlIGNvbnN0ICpfX1AsIF9fbTEyOGkgX19NKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcGQgKChjb25zdCBfX3YyZGYgKilfX1AsCisJCQkJCSAgICAgIChfX3YyZGkpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza3N0b3JlX3BkIChkb3VibGUgKl9fUCwgX19tMTI4aSBfX00sIF9fbTEyOGQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZCAoKF9fdjJkZiAqKV9fUCwgKF9fdjJkaSlfX00sIChfX3YyZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza2xvYWRfcGQgKGRvdWJsZSBjb25zdCAqX19QLCBfX20yNTZpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkMjU2ICgoY29uc3QgX192NGRmICopX19QLAorCQkJCQkJIChfX3Y0ZGkpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza3N0b3JlX3BkIChkb3VibGUgKl9fUCwgX19tMjU2aSBfX00sIF9fbTI1NmQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZDI1NiAoKF9fdjRkZiAqKV9fUCwgKF9fdjRkaSlfX00sIChfX3Y0ZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrbG9hZF9wcyAoZmxvYXQgY29uc3QgKl9fUCwgX19tMTI4aSBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzICgoY29uc3QgX192NHNmICopX19QLAorCQkJCQkgICAgIChfX3Y0c2kpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFza3N0b3JlX3BzIChmbG9hdCAqX19QLCBfX20xMjhpIF9fTSwgX19tMTI4IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcHMgKChfX3Y0c2YgKilfX1AsIChfX3Y0c2kpX19NLCAoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza2xvYWRfcHMgKGZsb2F0IGNvbnN0ICpfX1AsIF9fbTI1NmkgX19NKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbWFza2xvYWRwczI1NiAoKGNvbnN0IF9fdjhzZiAqKV9fUCwKKwkJCQkJCShfX3Y4c2kpX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFza3N0b3JlX3BzIChmbG9hdCAqX19QLCBfX20yNTZpIF9fTSwgX19tMjU2IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbWFza3N0b3JlcHMyNTYgKChfX3Y4c2YgKilfX1AsIChfX3Y4c2kpX19NLCAoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbW92ZWhkdXBfcHMgKF9fbTI1NiBfX1gpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9tb3ZzaGR1cDI1NiAoKF9fdjhzZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X21vdmVsZHVwX3BzIChfX20yNTYgX19YKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfbW92c2xkdXAyNTYgKChfX3Y4c2YpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbW92ZWR1cF9wZCAoX19tMjU2ZCBfX1gpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfbW92ZGR1cDI1NiAoKF9fdjRkZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9sZGRxdV9zaTI1NiAoX19tMjU2aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTI1NmkpIF9fYnVpbHRpbl9pYTMyX2xkZHF1MjU2ICgoY2hhciBjb25zdCAqKV9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0cmVhbV9zaTI1NiAoX19tMjU2aSAqX19BLCBfX20yNTZpIF9fQikKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRkcTI1NiAoKF9fdjRkaSAqKV9fQSwgKF9fdjRkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zdHJlYW1fcGQgKGRvdWJsZSAqX19BLCBfX20yNTZkIF9fQikKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRwZDI1NiAoX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3N0cmVhbV9wcyAoZmxvYXQgKl9fUCwgX19tMjU2IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRwczI1NiAoX19QLCAoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcmNwX3BzIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcmNwcHMyNTYgKChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9yc3FydF9wcyAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMyNTYgKChfX3Y4c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3FydF9wZCAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfc3FydHBkMjU2ICgoX192NGRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc3FydF9wcyAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3NxcnRwczI1NiAoKF9fdjhzZilfX0EpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9yb3VuZF9wZCAoX19tMjU2ZCBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfcm91bmRwZDI1NiAoKF9fdjRkZilfX1YsIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcm91bmRfcHMgKF9fbTI1NiBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl9yb3VuZHBzMjU2ICgoX192OHNmKV9fViwgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbTI1Nl9yb3VuZF9wZChWLCBNKSBcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfcm91bmRwZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoViksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW0yNTZfcm91bmRfcHMoViwgTSkgXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfcm91bmRwczI1NiAoKF9fdjhzZikoX19tMjU2KShWKSwgKGludCkoTSkpKQorI2VuZGlmCisKKyNkZWZpbmUgX21tMjU2X2NlaWxfcGQoVikJX21tMjU2X3JvdW5kX3BkICgoViksIF9NTV9GUk9VTkRfQ0VJTCkKKyNkZWZpbmUgX21tMjU2X2Zsb29yX3BkKFYpCV9tbTI1Nl9yb3VuZF9wZCAoKFYpLCBfTU1fRlJPVU5EX0ZMT09SKQorI2RlZmluZSBfbW0yNTZfY2VpbF9wcyhWKQlfbW0yNTZfcm91bmRfcHMgKChWKSwgX01NX0ZST1VORF9DRUlMKQorI2RlZmluZSBfbW0yNTZfZmxvb3JfcHMoVikJX21tMjU2X3JvdW5kX3BzICgoViksIF9NTV9GUk9VTkRfRkxPT1IpCisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2hpX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdW5wY2tocGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3VucGFja2xvX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdW5wY2tscGQyNTYgKChfX3Y0ZGYpX19BLCAoX192NGRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdW5wYWNraGlfcHMgKF9fbTI1NiBfX0EsIF9fbTI1NiBfX0IpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl91bnBja2hwczI1NiAoKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl91bnBhY2tsb19wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQikKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3VucGNrbHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3R6X3BkIChfX20xMjhkIF9fTSwgX19tMTI4ZCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdHpwZCAoKF9fdjJkZilfX00sIChfX3YyZGYpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0Y19wZCAoX19tMTI4ZCBfX00sIF9fbTEyOGQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RjcGQgKChfX3YyZGYpX19NLCAoX192MmRmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdG56Y19wZCAoX19tMTI4ZCBfX00sIF9fbTEyOGQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RuemNwZCAoKF9fdjJkZilfX00sIChfX3YyZGYpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV90ZXN0el9wcyAoX19tMTI4IF9fTSwgX19tMTI4IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBzICgoX192NHNmKV9fTSwgKF9fdjRzZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RjX3BzIChfX20xMjggX19NLCBfX20xMjggX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RjcHMgKChfX3Y0c2YpX19NLCAoX192NHNmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdG56Y19wcyAoX19tMTI4IF9fTSwgX19tMTI4IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcHMgKChfX3Y0c2YpX19NLCAoX192NHNmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdHpfcGQgKF9fbTI1NmQgX19NLCBfX20yNTZkIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkMjU2ICgoX192NGRmKV9fTSwgKF9fdjRkZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3RjX3BkIChfX20yNTZkIF9fTSwgX19tMjU2ZCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdGNwZDI1NiAoKF9fdjRkZilfX00sIChfX3Y0ZGYpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0bnpjX3BkIChfX20yNTZkIF9fTSwgX19tMjU2ZCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkMjU2ICgoX192NGRmKV9fTSwgKF9fdjRkZilfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3R6X3BzIChfX20yNTYgX19NLCBfX20yNTYgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3R6cHMyNTYgKChfX3Y4c2YpX19NLCAoX192OHNmKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdGNfcHMgKF9fbTI1NiBfX00sIF9fbTI1NiBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92dGVzdGNwczI1NiAoKF9fdjhzZilfX00sIChfX3Y4c2YpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0bnpjX3BzIChfX20yNTYgX19NLCBfX20yNTYgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdnRlc3RuemNwczI1NiAoKF9fdjhzZilfX00sIChfX3Y4c2YpX19WKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl90ZXN0el9zaTI1NiAoX19tMjU2aSBfX00sIF9fbTI1NmkgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHRlc3R6MjU2ICgoX192NGRpKV9fTSwgKF9fdjRkaSlfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Rlc3RjX3NpMjU2IChfX20yNTZpIF9fTSwgX19tMjU2aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdGMyNTYgKChfX3Y0ZGkpX19NLCAoX192NGRpKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfdGVzdG56Y19zaTI1NiAoX19tMjU2aSBfX00sIF9fbTI1NmkgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHRlc3RuemMyNTYgKChfX3Y0ZGkpX19NLCAoX192NGRpKV9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbW92ZW1hc2tfcGQgKF9fbTI1NmQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbW92bXNrcGQyNTYgKChfX3Y0ZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tb3ZlbWFza19wcyAoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX21vdm1za3BzMjU2ICgoX192OHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHplcm9fcGQgKHZvaWQpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZkKXsgMC4wLCAwLjAsIDAuMCwgMC4wIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0emVyb19wcyAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1Nil7IDAuMCwgMC4wLCAwLjAsIDAuMCwKKwkJCQkgMC4wLCAwLjAsIDAuMCwgMC4wIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHplcm9fc2kyNTYgKHZvaWQpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3Y0ZGkpeyAwLCAwLCAwLCAwIH07Cit9CisKKy8qIENyZWF0ZSB0aGUgdmVjdG9yIFtBIEIgQyBEXS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRfcGQgKGRvdWJsZSBfX0EsIGRvdWJsZSBfX0IsIGRvdWJsZSBfX0MsIGRvdWJsZSBfX0QpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZkKXsgX19ELCBfX0MsIF9fQiwgX19BIH07Cit9CisKKy8qIENyZWF0ZSB0aGUgdmVjdG9yIFtBIEIgQyBEIEUgRiBHIEhdLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0X3BzIChmbG9hdCBfX0EsIGZsb2F0IF9fQiwgZmxvYXQgX19DLCBmbG9hdCBfX0QsCisJICAgICAgIGZsb2F0IF9fRSwgZmxvYXQgX19GLCBmbG9hdCBfX0csIGZsb2F0IF9fSCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1Nil7IF9fSCwgX19HLCBfX0YsIF9fRSwKKwkJCQkgX19ELCBfX0MsIF9fQiwgX19BIH07Cit9CisKKy8qIENyZWF0ZSB0aGUgdmVjdG9yIFtBIEIgQyBEIEUgRiBHIEhdLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldF9lcGkzMiAoaW50IF9fQSwgaW50IF9fQiwgaW50IF9fQywgaW50IF9fRCwKKwkJICBpbnQgX19FLCBpbnQgX19GLCBpbnQgX19HLCBpbnQgX19IKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192OHNpKXsgX19ILCBfX0csIF9fRiwgX19FLAorCQkJCQkgIF9fRCwgX19DLCBfX0IsIF9fQSB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRfZXBpMTYgKHNob3J0IF9fcTE1LCBzaG9ydCBfX3ExNCwgc2hvcnQgX19xMTMsIHNob3J0IF9fcTEyLAorCQkgIHNob3J0IF9fcTExLCBzaG9ydCBfX3ExMCwgc2hvcnQgX19xMDksIHNob3J0IF9fcTA4LAorCQkgIHNob3J0IF9fcTA3LCBzaG9ydCBfX3EwNiwgc2hvcnQgX19xMDUsIHNob3J0IF9fcTA0LAorCQkgIHNob3J0IF9fcTAzLCBzaG9ydCBfX3EwMiwgc2hvcnQgX19xMDEsIHNob3J0IF9fcTAwKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192MTZoaSl7CisgICAgX19xMDAsIF9fcTAxLCBfX3EwMiwgX19xMDMsIF9fcTA0LCBfX3EwNSwgX19xMDYsIF9fcTA3LAorICAgIF9fcTA4LCBfX3EwOSwgX19xMTAsIF9fcTExLCBfX3ExMiwgX19xMTMsIF9fcTE0LCBfX3ExNQorICB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRfZXBpOCAgKGNoYXIgX19xMzEsIGNoYXIgX19xMzAsIGNoYXIgX19xMjksIGNoYXIgX19xMjgsCisJCSAgY2hhciBfX3EyNywgY2hhciBfX3EyNiwgY2hhciBfX3EyNSwgY2hhciBfX3EyNCwKKwkJICBjaGFyIF9fcTIzLCBjaGFyIF9fcTIyLCBjaGFyIF9fcTIxLCBjaGFyIF9fcTIwLAorCQkgIGNoYXIgX19xMTksIGNoYXIgX19xMTgsIGNoYXIgX19xMTcsIGNoYXIgX19xMTYsCisJCSAgY2hhciBfX3ExNSwgY2hhciBfX3ExNCwgY2hhciBfX3ExMywgY2hhciBfX3ExMiwKKwkJICBjaGFyIF9fcTExLCBjaGFyIF9fcTEwLCBjaGFyIF9fcTA5LCBjaGFyIF9fcTA4LAorCQkgIGNoYXIgX19xMDcsIGNoYXIgX19xMDYsIGNoYXIgX19xMDUsIGNoYXIgX19xMDQsCisJCSAgY2hhciBfX3EwMywgY2hhciBfX3EwMiwgY2hhciBfX3EwMSwgY2hhciBfX3EwMCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjMycWkpeworICAgIF9fcTAwLCBfX3EwMSwgX19xMDIsIF9fcTAzLCBfX3EwNCwgX19xMDUsIF9fcTA2LCBfX3EwNywKKyAgICBfX3EwOCwgX19xMDksIF9fcTEwLCBfX3ExMSwgX19xMTIsIF9fcTEzLCBfX3ExNCwgX19xMTUsCisgICAgX19xMTYsIF9fcTE3LCBfX3ExOCwgX19xMTksIF9fcTIwLCBfX3EyMSwgX19xMjIsIF9fcTIzLAorICAgIF9fcTI0LCBfX3EyNSwgX19xMjYsIF9fcTI3LCBfX3EyOCwgX19xMjksIF9fcTMwLCBfX3EzMQorICB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRfZXBpNjR4IChsb25nIGxvbmcgX19BLCBsb25nIGxvbmcgX19CLCBsb25nIGxvbmcgX19DLAorCQkgICBsb25nIGxvbmcgX19EKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2aSkoX192NGRpKXsgX19ELCBfX0MsIF9fQiwgX19BIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cyBlcXVhbCB0byBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTZkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldDFfcGQgKGRvdWJsZSBfX0EpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZkKXsgX19BLCBfX0EsIF9fQSwgX19BIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cyBlcXVhbCB0byBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0MV9wcyAoZmxvYXQgX19BKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMjU2KXsgX19BLCBfX0EsIF9fQSwgX19BLAorCQkJCSBfX0EsIF9fQSwgX19BLCBfX0EgfTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIGVxdWFsIHRvIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0MV9lcGkzMiAoaW50IF9fQSkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTI1NmkpKF9fdjhzaSl7IF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJCQkJICBfX0EsIF9fQSwgX19BLCBfX0EgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0MV9lcGkxNiAoc2hvcnQgX19BKQoreworICByZXR1cm4gX21tMjU2X3NldF9lcGkxNiAoX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsCisJCQkgICBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldDFfZXBpOCAoY2hhciBfX0EpCit7CisgIHJldHVybiBfbW0yNTZfc2V0X2VwaTggKF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLAorCQkJICBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJCSAgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsCisJCQkgIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0MV9lcGk2NHggKGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20yNTZpKShfX3Y0ZGkpeyBfX0EsIF9fQSwgX19BLCBfX0EgfTsKK30KKworLyogQ3JlYXRlIHZlY3RvcnMgb2YgZWxlbWVudHMgaW4gdGhlIHJldmVyc2VkIG9yZGVyIGZyb20gdGhlCisgICBfbW0yNTZfc2V0X1hYWCBmdW5jdGlvbnMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRyX3BkIChkb3VibGUgX19BLCBkb3VibGUgX19CLCBkb3VibGUgX19DLCBkb3VibGUgX19EKQoreworICByZXR1cm4gX21tMjU2X3NldF9wZCAoX19ELCBfX0MsIF9fQiwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9zZXRyX3BzIChmbG9hdCBfX0EsIGZsb2F0IF9fQiwgZmxvYXQgX19DLCBmbG9hdCBfX0QsCisJCWZsb2F0IF9fRSwgZmxvYXQgX19GLCBmbG9hdCBfX0csIGZsb2F0IF9fSCkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfcHMgKF9fSCwgX19HLCBfX0YsIF9fRSwgX19ELCBfX0MsIF9fQiwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0cl9lcGkzMiAoaW50IF9fQSwgaW50IF9fQiwgaW50IF9fQywgaW50IF9fRCwKKwkJICAgaW50IF9fRSwgaW50IF9fRiwgaW50IF9fRywgaW50IF9fSCkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfZXBpMzIgKF9fSCwgX19HLCBfX0YsIF9fRSwgX19ELCBfX0MsIF9fQiwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfc2V0cl9lcGkxNiAoc2hvcnQgX19xMTUsIHNob3J0IF9fcTE0LCBzaG9ydCBfX3ExMywgc2hvcnQgX19xMTIsCisJCSAgIHNob3J0IF9fcTExLCBzaG9ydCBfX3ExMCwgc2hvcnQgX19xMDksIHNob3J0IF9fcTA4LAorCQkgICBzaG9ydCBfX3EwNywgc2hvcnQgX19xMDYsIHNob3J0IF9fcTA1LCBzaG9ydCBfX3EwNCwKKwkJICAgc2hvcnQgX19xMDMsIHNob3J0IF9fcTAyLCBzaG9ydCBfX3EwMSwgc2hvcnQgX19xMDApCit7CisgIHJldHVybiBfbW0yNTZfc2V0X2VwaTE2IChfX3EwMCwgX19xMDEsIF9fcTAyLCBfX3EwMywKKwkJCSAgIF9fcTA0LCBfX3EwNSwgX19xMDYsIF9fcTA3LAorCQkJICAgX19xMDgsIF9fcTA5LCBfX3ExMCwgX19xMTEsCisJCQkgICBfX3ExMiwgX19xMTMsIF9fcTE0LCBfX3ExNSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHJfZXBpOCAgKGNoYXIgX19xMzEsIGNoYXIgX19xMzAsIGNoYXIgX19xMjksIGNoYXIgX19xMjgsCisJCSAgIGNoYXIgX19xMjcsIGNoYXIgX19xMjYsIGNoYXIgX19xMjUsIGNoYXIgX19xMjQsCisJCSAgIGNoYXIgX19xMjMsIGNoYXIgX19xMjIsIGNoYXIgX19xMjEsIGNoYXIgX19xMjAsCisJCSAgIGNoYXIgX19xMTksIGNoYXIgX19xMTgsIGNoYXIgX19xMTcsIGNoYXIgX19xMTYsCisJCSAgIGNoYXIgX19xMTUsIGNoYXIgX19xMTQsIGNoYXIgX19xMTMsIGNoYXIgX19xMTIsCisJCSAgIGNoYXIgX19xMTEsIGNoYXIgX19xMTAsIGNoYXIgX19xMDksIGNoYXIgX19xMDgsCisJCSAgIGNoYXIgX19xMDcsIGNoYXIgX19xMDYsIGNoYXIgX19xMDUsIGNoYXIgX19xMDQsCisJCSAgIGNoYXIgX19xMDMsIGNoYXIgX19xMDIsIGNoYXIgX19xMDEsIGNoYXIgX19xMDApCit7CisgIHJldHVybiBfbW0yNTZfc2V0X2VwaTggKF9fcTAwLCBfX3EwMSwgX19xMDIsIF9fcTAzLAorCQkJICBfX3EwNCwgX19xMDUsIF9fcTA2LCBfX3EwNywKKwkJCSAgX19xMDgsIF9fcTA5LCBfX3ExMCwgX19xMTEsCisJCQkgIF9fcTEyLCBfX3ExMywgX19xMTQsIF9fcTE1LAorCQkJICBfX3ExNiwgX19xMTcsIF9fcTE4LCBfX3ExOSwKKwkJCSAgX19xMjAsIF9fcTIxLCBfX3EyMiwgX19xMjMsCisJCQkgIF9fcTI0LCBfX3EyNSwgX19xMjYsIF9fcTI3LAorCQkJICBfX3EyOCwgX19xMjksIF9fcTMwLCBfX3EzMSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3NldHJfZXBpNjR4IChsb25nIGxvbmcgX19BLCBsb25nIGxvbmcgX19CLCBsb25nIGxvbmcgX19DLAorCQkgICAgbG9uZyBsb25nIF9fRCkKK3sKKyAgcmV0dXJuIF9tbTI1Nl9zZXRfZXBpNjR4IChfX0QsIF9fQywgX19CLCBfX0EpOworfQorCisvKiBDYXN0cyBiZXR3ZWVuIHZhcmlvdXMgU1AsIERQLCBJTlQgdmVjdG9yIHR5cGVzLiAgTm90ZSB0aGF0IHRoZXNlIGRvIG5vCisgICBjb252ZXJzaW9uIG9mIHZhbHVlcywgdGhleSBqdXN0IGNoYW5nZSB0aGUgdHlwZS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RwZF9wcyAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTZpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RwZF9zaTI1NiAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMjU2aSkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cHNfcGQgKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cHNfc2kyNTYoX19tMjU2IF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHNpMjU2X3BzIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHNpMjU2X3BkIChfX20yNTZpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2Nhc3RwZDI1Nl9wZDEyOCAoX19tMjU2ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcGRfcGQyNTYgKChfX3Y0ZGYpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cHMyNTZfcHMxMjggKF9fbTI1NiBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9wc19wczI1NiAoKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0c2kyNTZfc2kxMjggKF9fbTI1NmkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3NpX3NpMjU2ICgoX192OHNpKV9fQSk7Cit9CisKKy8qIFdoZW4gY2FzdCBpcyBkb25lIGZyb20gYSAxMjggdG8gMjU2LWJpdCB0eXBlLCB0aGUgbG93IDEyOCBiaXRzIG9mCisgICB0aGUgMjU2LWJpdCByZXN1bHQgY29udGFpbiBzb3VyY2UgcGFyYW1ldGVyIHZhbHVlIGFuZCB0aGUgdXBwZXIgMTI4CisgICBiaXRzIG9mIHRoZSByZXN1bHQgYXJlIHVuZGVmaW5lZC4gIFRob3NlIGludHJpbnNpY3Mgc2hvdWxkbid0CisgICBnZW5lcmF0ZSBhbnkgZXh0cmEgbW92ZXMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jYXN0cGQxMjhfcGQyNTYgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3BkMjU2X3BkICgoX192MmRmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHBzMTI4X3BzMjU2IChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfcHMyNTZfcHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfY2FzdHNpMTI4X3NpMjU2IChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZpKSBfX2J1aWx0aW5faWEzMl9zaTI1Nl9zaSAoKF9fdjRzaSlfX0EpOworfQpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYm1paW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9ibWlpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjVmMmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYm1paW50cmluLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfWDg2SU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Ym1paW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX0JNSV9fCisjIGVycm9yICJCTUkgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2VuZGlmIC8qIF9fQk1JX18gKi8KKworI2lmbmRlZiBfQk1JSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0JNSUlOVFJJTl9IX0lOQ0xVREVECisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHpjbnRfdTE2ICh1bnNpZ25lZCBzaG9ydCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6cyAoX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190emNudF91MTYgKHVuc2lnbmVkIHNob3J0IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHpzIChfX1gpOworfQorCisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2FuZG5fdTMyICh1bnNpZ25lZCBpbnQgX19YLCB1bnNpZ25lZCBpbnQgX19ZKQoreworICB1bnNpZ25lZCBpbnQgdG1wID0gfihfX1gpICYgKF9fWSk7CisgIHJldHVybiB0bXA7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JleHRyX3UzMiAodW5zaWduZWQgaW50IF9fWCwgdW5zaWduZWQgaW50IF9fWSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2JleHRyX3UzMiAoX19YLCBfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNpX3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgdW5zaWduZWQgaW50IHRtcCA9IChfX1gpICYgKC0oX19YKSk7CisgIHJldHVybiB0bXA7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc21za191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHVuc2lnbmVkIGludCB0bXAgPSAoX19YKSBeIChfX1ggLSAxKTsKKyAgcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzcl91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHVuc2lnbmVkIGludCB0bXAgPSAoX19YKSAmIChfX1ggLSAxKTsKKyAgcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHpjbnRfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworICByZXR1cm4gX19idWlsdGluX2NseiAoX19YKTsKK30KKworCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX190emNudF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6IChfX1gpOworfQorCisKKyNpZmRlZiAgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYW5kbl91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1kpCit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyB0bXAgPSB+KF9fWCkgJiAoX19ZKTsKKyAgcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmV4dHJfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCB1bnNpZ25lZCBsb25nIGxvbmcgX19ZKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJfdTY0IChfX1gsIF9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2Jsc2lfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgdG1wID0gKF9fWCkgJiAoLShfX1gpKTsKKyAgcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzbXNrX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpIF4gKF9fWCAtIDEpOworICByZXR1cm4gdG1wOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ibHNyX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpICYgKF9fWCAtIDEpOworICByZXR1cm4gdG1wOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19semNudF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY2x6bGwgKF9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3R6Y250X3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHpsbCAoX19YKTsKK30KKworI2VuZGlmIC8qIF9feDg2XzY0X18gICovCisKKyNlbmRpZiAvKiBfQk1JSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2JtbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvYm1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkNGU3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2JtbWludHJpbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfQk1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0JNTUlOVFJJTl9IX0lOQ0xVREVECisKKyMgZXJyb3IgIlNTRTUgaW5zdHJ1Y3Rpb24gc2V0IHJlbW92ZWQgZnJvbSBjb21waWxlciIKKworI2VuZGlmIC8qIF9CTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvY3B1aWQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2NwdWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZjQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2NwdWlkLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgKiBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgKiAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAqIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgKiBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAqIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKiAlZWN4ICovCisjZGVmaW5lIGJpdF9TU0UzCSgxIDw8IDApCisjZGVmaW5lIGJpdF9QQ0xNVUwJKDEgPDwgMSkKKyNkZWZpbmUgYml0X1NTU0UzCSgxIDw8IDkpCisjZGVmaW5lIGJpdF9GTUEJCSgxIDw8IDEyKQorI2RlZmluZSBiaXRfQ01QWENIRzE2QgkoMSA8PCAxMykKKyNkZWZpbmUgYml0X1NTRTRfMQkoMSA8PCAxOSkKKyNkZWZpbmUgYml0X1NTRTRfMgkoMSA8PCAyMCkKKyNkZWZpbmUgYml0X01PVkJFCSgxIDw8IDIyKQorI2RlZmluZSBiaXRfUE9QQ05UCSgxIDw8IDIzKQorI2RlZmluZSBiaXRfQUVTCQkoMSA8PCAyNSkKKyNkZWZpbmUgYml0X1hTQVZFCSgxIDw8IDI2KQorI2RlZmluZSBiaXRfT1NYU0FWRQkoMSA8PCAyNykKKyNkZWZpbmUgYml0X0FWWAkJKDEgPDwgMjgpCisjZGVmaW5lIGJpdF9GMTZDCSgxIDw8IDI5KQorI2RlZmluZSBiaXRfUkRSTkQJKDEgPDwgMzApCisKKy8qICVlZHggKi8KKyNkZWZpbmUgYml0X0NNUFhDSEc4QgkoMSA8PCA4KQorI2RlZmluZSBiaXRfQ01PVgkoMSA8PCAxNSkKKyNkZWZpbmUgYml0X01NWAkJKDEgPDwgMjMpCisjZGVmaW5lIGJpdF9GWFNBVkUJKDEgPDwgMjQpCisjZGVmaW5lIGJpdF9TU0UJCSgxIDw8IDI1KQorI2RlZmluZSBiaXRfU1NFMgkoMSA8PCAyNikKKworLyogRXh0ZW5kZWQgRmVhdHVyZXMgKi8KKy8qICVlY3ggKi8KKyNkZWZpbmUgYml0X0xBSEZfTE0JKDEgPDwgMCkKKyNkZWZpbmUgYml0X0FCTQkJKDEgPDwgNSkKKyNkZWZpbmUgYml0X1NTRTRhCSgxIDw8IDYpCisjZGVmaW5lIGJpdF9YT1AgICAgICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgYml0X0xXUCAJKDEgPDwgMTUpCisjZGVmaW5lIGJpdF9GTUE0ICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgYml0X1RCTSAgICAgICAgICgxIDw8IDIxKQorCisvKiAlZWR4ICovCisjZGVmaW5lIGJpdF9NTVhFWFQJKDEgPDwgMjIpCisjZGVmaW5lIGJpdF9MTQkJKDEgPDwgMjkpCisjZGVmaW5lIGJpdF8zRE5PV1AJKDEgPDwgMzApCisjZGVmaW5lIGJpdF8zRE5PVwkoMSA8PCAzMSkKKworLyogRXh0ZW5kZWQgRmVhdHVyZXMgKCVlYXggPT0gNykgKi8KKyNkZWZpbmUgYml0X0ZTR1NCQVNFCSgxIDw8IDApCisjZGVmaW5lIGJpdF9CTUkJCSgxIDw8IDMpCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKF9fUElDX18pCisvKiAlZWJ4IG1heSBiZSB0aGUgUElDIHJlZ2lzdGVyLiAgKi8KKyNpZiBfX0dOVUNfXyA+PSAzCisjZGVmaW5lIF9fY3B1aWQobGV2ZWwsIGEsIGIsIGMsIGQpCQkJXAorICBfX2FzbV9fICgieGNoZ3tsfVx0eyUlfWVieCwgJTFcblx0IgkJCVwKKwkgICAiY3B1aWRcblx0IgkJCQkJXAorCSAgICJ4Y2hne2x9XHR7JSV9ZWJ4LCAlMVxuXHQiCQkJXAorCSAgIDogIj1hIiAoYSksICI9ciIgKGIpLCAiPWMiIChjKSwgIj1kIiAoZCkJXAorCSAgIDogIjAiIChsZXZlbCkpCisKKyNkZWZpbmUgX19jcHVpZF9jb3VudChsZXZlbCwgY291bnQsIGEsIGIsIGMsIGQpCQlcCisgIF9fYXNtX18gKCJ4Y2hne2x9XHR7JSV9ZWJ4LCAlMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGd7bH1cdHslJX1lYngsICUxXG5cdCIJCQlcCisJICAgOiAiPWEiIChhKSwgIj1yIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSwgIjIiIChjb3VudCkpCisjZWxzZQorLyogSG9zdCBHQ0NzIG9sZGVyIHRoYW4gMy4wIHdlcmVuJ3Qgc3VwcG9ydGluZyBJbnRlbCBhc20gc3ludGF4CisgICBub3IgYWx0ZXJuYXRpdmVzIGluIGkzODYgY29kZS4gICovCisjZGVmaW5lIF9fY3B1aWQobGV2ZWwsIGEsIGIsIGMsIGQpCQkJXAorICBfX2FzbV9fICgieGNoZ2xcdCUlZWJ4LCAlMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGdsXHQlJWVieCwgJTFcblx0IgkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPXIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpKQorCisjZGVmaW5lIF9fY3B1aWRfY291bnQobGV2ZWwsIGNvdW50LCBhLCBiLCBjLCBkKQkJXAorICBfX2FzbV9fICgieGNoZ2xcdCUlZWJ4LCAlMVxuXHQiCQkJXAorCSAgICJjcHVpZFxuXHQiCQkJCQlcCisJICAgInhjaGdsXHQlJWVieCwgJTFcblx0IgkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPXIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpLCAiMiIgKGNvdW50KSkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgX19jcHVpZChsZXZlbCwgYSwgYiwgYywgZCkJCQlcCisgIF9fYXNtX18gKCJjcHVpZFxuXHQiCQkJCQlcCisJICAgOiAiPWEiIChhKSwgIj1iIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKQlcCisJICAgOiAiMCIgKGxldmVsKSkKKworI2RlZmluZSBfX2NwdWlkX2NvdW50KGxldmVsLCBjb3VudCwgYSwgYiwgYywgZCkJCVwKKyAgX19hc21fXyAoImNwdWlkXG5cdCIJCQkJCVwKKwkgICA6ICI9YSIgKGEpLCAiPWIiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpCVwKKwkgICA6ICIwIiAobGV2ZWwpLCAiMiIgKGNvdW50KSkKKyNlbmRpZgorCisvKiBSZXR1cm4gaGlnaGVzdCBzdXBwb3J0ZWQgaW5wdXQgdmFsdWUgZm9yIGNwdWlkIGluc3RydWN0aW9uLiAgZXh0IGNhbgorICAgYmUgZWl0aGVyIDB4MCBvciAweDgwMDAwMDAgdG8gcmV0dXJuIGhpZ2hlc3Qgc3VwcG9ydGVkIHZhbHVlIGZvcgorICAgYmFzaWMgb3IgZXh0ZW5kZWQgY3B1aWQgaW5mb3JtYXRpb24uICBGdW5jdGlvbiByZXR1cm5zIDAgaWYgY3B1aWQKKyAgIGlzIG5vdCBzdXBwb3J0ZWQgb3Igd2hhdGV2ZXIgY3B1aWQgcmV0dXJucyBpbiBlYXggcmVnaXN0ZXIuICBJZiBzaWcKKyAgIHBvaW50ZXIgaXMgbm9uLW51bGwsIHRoZW4gZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgc2lnbmF0dXJlCisgICAoYXMgZm91bmQgaW4gZWJ4IHJlZ2lzdGVyKSBhcmUgcmV0dXJuZWQgaW4gbG9jYXRpb24gcG9pbnRlZCBieSBzaWcuICAqLworCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2dldF9jcHVpZF9tYXggKHVuc2lnbmVkIGludCBfX2V4dCwgdW5zaWduZWQgaW50ICpfX3NpZykKK3sKKyAgdW5zaWduZWQgaW50IF9fZWF4LCBfX2VieCwgX19lY3gsIF9fZWR4OworCisjaWZuZGVmIF9feDg2XzY0X18KKyAgLyogU2VlIGlmIHdlIGNhbiB1c2UgY3B1aWQuICBPbiBBTUQ2NCB3ZSBhbHdheXMgY2FuLiAgKi8KKyNpZiBfX0dOVUNfXyA+PSAzCisgIF9fYXNtX18gKCJwdXNoZntsfGR9XG5cdCIKKwkgICAicHVzaGZ7bHxkfVxuXHQiCisJICAgInBvcHtsfVx0JTBcblx0IgorCSAgICJtb3Z7bH1cdHslMCwgJTF8JTEsICUwfVxuXHQiCisJICAgInhvcntsfVx0eyUyLCAlMHwlMCwgJTJ9XG5cdCIKKwkgICAicHVzaHtsfVx0JTBcblx0IgorCSAgICJwb3Bme2x8ZH1cblx0IgorCSAgICJwdXNoZntsfGR9XG5cdCIKKwkgICAicG9we2x9XHQlMFxuXHQiCisJICAgInBvcGZ7bHxkfVxuXHQiCisJICAgOiAiPSZyIiAoX19lYXgpLCAiPSZyIiAoX19lYngpCisJICAgOiAiaSIgKDB4MDAyMDAwMDApKTsKKyNlbHNlCisvKiBIb3N0IEdDQ3Mgb2xkZXIgdGhhbiAzLjAgd2VyZW4ndCBzdXBwb3J0aW5nIEludGVsIGFzbSBzeW50YXgKKyAgIG5vciBhbHRlcm5hdGl2ZXMgaW4gaTM4NiBjb2RlLiAgKi8KKyAgX19hc21fXyAoInB1c2hmbFxuXHQiCisJICAgInB1c2hmbFxuXHQiCisJICAgInBvcGxcdCUwXG5cdCIKKwkgICAibW92bFx0JTAsICUxXG5cdCIKKwkgICAieG9ybFx0JTIsICUwXG5cdCIKKwkgICAicHVzaGxcdCUwXG5cdCIKKwkgICAicG9wZmxcblx0IgorCSAgICJwdXNoZmxcblx0IgorCSAgICJwb3BsXHQlMFxuXHQiCisJICAgInBvcGZsXG5cdCIKKwkgICA6ICI9JnIiIChfX2VheCksICI9JnIiIChfX2VieCkKKwkgICA6ICJpIiAoMHgwMDIwMDAwMCkpOworI2VuZGlmCisKKyAgaWYgKCEoKF9fZWF4IF4gX19lYngpICYgMHgwMDIwMDAwMCkpCisgICAgcmV0dXJuIDA7CisjZW5kaWYKKworICAvKiBIb3N0IHN1cHBvcnRzIGNwdWlkLiAgUmV0dXJuIGhpZ2hlc3Qgc3VwcG9ydGVkIGNwdWlkIGlucHV0IHZhbHVlLiAgKi8KKyAgX19jcHVpZCAoX19leHQsIF9fZWF4LCBfX2VieCwgX19lY3gsIF9fZWR4KTsKKworICBpZiAoX19zaWcpCisgICAgKl9fc2lnID0gX19lYng7CisKKyAgcmV0dXJuIF9fZWF4OworfQorCisvKiBSZXR1cm4gY3B1aWQgZGF0YSBmb3IgcmVxdWVzdGVkIGNwdWlkIGxldmVsLCBhcyBmb3VuZCBpbiByZXR1cm5lZAorICAgZWF4LCBlYngsIGVjeCBhbmQgZWR4IHJlZ2lzdGVycy4gIFRoZSBmdW5jdGlvbiBjaGVja3MgaWYgY3B1aWQgaXMKKyAgIHN1cHBvcnRlZCBhbmQgcmV0dXJucyAxIGZvciB2YWxpZCBjcHVpZCBpbmZvcm1hdGlvbiBvciAwIGZvcgorICAgdW5zdXBwb3J0ZWQgY3B1aWQgbGV2ZWwuICBBbGwgcG9pbnRlcnMgYXJlIHJlcXVpcmVkIHRvIGJlIG5vbi1udWxsLiAgKi8KKworc3RhdGljIF9faW5saW5lIGludAorX19nZXRfY3B1aWQgKHVuc2lnbmVkIGludCBfX2xldmVsLAorCSAgICAgdW5zaWduZWQgaW50ICpfX2VheCwgdW5zaWduZWQgaW50ICpfX2VieCwKKwkgICAgIHVuc2lnbmVkIGludCAqX19lY3gsIHVuc2lnbmVkIGludCAqX19lZHgpCit7CisgIHVuc2lnbmVkIGludCBfX2V4dCA9IF9fbGV2ZWwgJiAweDgwMDAwMDAwOworCisgIGlmIChfX2dldF9jcHVpZF9tYXggKF9fZXh0LCAwKSA8IF9fbGV2ZWwpCisgICAgcmV0dXJuIDA7CisKKyAgX19jcHVpZCAoX19sZXZlbCwgKl9fZWF4LCAqX19lYngsICpfX2VjeCwgKl9fZWR4KTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9jcm9zcy1zdGRhcmcuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2Nyb3NzLXN0ZGFyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzlmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9jcm9zcy1zdGRhcmcuaApAQCAtMCwwICsxLDczIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9fQ1JPU1NfU1REQVJHX0hfSU5DTFVERUQKKyNkZWZpbmUgX19DUk9TU19TVERBUkdfSF9JTkNMVURFRAorCisvKiBNYWtlIHN1cmUgdGhhdCBmb3Igbm9uIHg2NCB0YXJnZXRzIGNyb3NzIGJ1aWx0aW5zIGFyZSBkZWZpbmVkLiAgKi8KKyNpZm5kZWYgX194ODZfNjRfXworLyogQ2FsbCBhYmkgbXNfYWJpLiAgKi8KKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX2xpc3QgX19idWlsdGluX3ZhX2xpc3QKKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX2NvcHkgX19idWlsdGluX3ZhX2NvcHkKKyNkZWZpbmUgX19idWlsdGluX21zX3ZhX3N0YXJ0IF9fYnVpbHRpbl92YV9zdGFydAorI2RlZmluZSBfX2J1aWx0aW5fbXNfdmFfZW5kIF9fYnVpbHRpbl92YV9lbmQKKworLyogQ2FsbCBhYmkgc3lzdl9hYmkuICAqLworI2RlZmluZSBfX2J1aWx0aW5fc3lzdl92YV9saXN0IF9fYnVpbHRpbl92YV9saXN0CisjZGVmaW5lIF9fYnVpbHRpbl9zeXN2X3ZhX2NvcHkgX19idWlsdGluX3ZhX2NvcHkKKyNkZWZpbmUgX19idWlsdGluX3N5c3ZfdmFfc3RhcnQgX19idWlsdGluX3ZhX3N0YXJ0CisjZGVmaW5lIF9fYnVpbHRpbl9zeXN2X3ZhX2VuZCBfX2J1aWx0aW5fdmFfZW5kCisjZW5kaWYKKworI2RlZmluZSBfX21zX3ZhX2NvcHkoX19kLF9fcykgX19idWlsdGluX21zX3ZhX2NvcHkoX19kLF9fcykKKyNkZWZpbmUgX19tc192YV9zdGFydChfX3YsX19sKSBfX2J1aWx0aW5fbXNfdmFfc3RhcnQoX192LF9fbCkKKyNkZWZpbmUgX19tc192YV9hcmcoX192LF9fbCkJX19idWlsdGluX3ZhX2FyZyhfX3YsX19sKQorI2RlZmluZSBfX21zX3ZhX2VuZChfX3YpIF9fYnVpbHRpbl9tc192YV9lbmQoX192KQorCisjZGVmaW5lIF9fc3lzdl92YV9jb3B5KF9fZCxfX3MpIF9fYnVpbHRpbl9zeXN2X3ZhX2NvcHkoX19kLF9fcykKKyNkZWZpbmUgX19zeXN2X3ZhX3N0YXJ0KF9fdixfX2wpIF9fYnVpbHRpbl9zeXN2X3ZhX3N0YXJ0KF9fdixfX2wpCisjZGVmaW5lIF9fc3lzdl92YV9hcmcoX192LF9fbCkJX19idWlsdGluX3ZhX2FyZyhfX3YsX19sKQorI2RlZmluZSBfX3N5c3ZfdmFfZW5kKF9fdikgX19idWlsdGluX3N5c3ZfdmFfZW5kKF9fdikKKworI2lmbmRlZiBfX0dOVUNfU1lTVl9WQV9MSVNUCisjZGVmaW5lIF9fR05VQ19TWVNWX1ZBX0xJU1QKKyAgdHlwZWRlZiBfX2J1aWx0aW5fc3lzdl92YV9saXN0IF9fZ251Y19zeXN2X3ZhX2xpc3Q7CisjZW5kaWYKKworI2lmbmRlZiBfU1lTVl9WQV9MSVNUX0RFRklORUQKKyNkZWZpbmUgX1NZU1ZfVkFfTElTVF9ERUZJTkVECisgIHR5cGVkZWYgX19nbnVjX3N5c3ZfdmFfbGlzdCBzeXN2X3ZhX2xpc3Q7CisjZW5kaWYKKworI2lmbmRlZiBfX0dOVUNfTVNfVkFfTElTVAorI2RlZmluZSBfX0dOVUNfTVNfVkFfTElTVAorICB0eXBlZGVmIF9fYnVpbHRpbl9tc192YV9saXN0IF9fZ251Y19tc192YV9saXN0OworI2VuZGlmCisKKyNpZm5kZWYgX01TX1ZBX0xJU1RfREVGSU5FRAorI2RlZmluZSBfTVNfVkFfTElTVF9ERUZJTkVECisgIHR5cGVkZWYgX19nbnVjX21zX3ZhX2xpc3QgbXNfdmFfbGlzdDsKKyNlbmRpZgorCisjZW5kaWYgLyogX19DUk9TU19TVERBUkdfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvZW1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9lbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRjZDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvZW1taW50cmluLmgKQEAgLTAsMCArMSwxNTEzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjAuICAqLworCisjaWZuZGVmIF9FTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfRU1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRTJfXworIyBlcnJvciAiU1NFMiBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRSBoZWFkZXIgZmlsZXMqLworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorCisvKiBTU0UyICovCit0eXBlZGVmIGRvdWJsZSBfX3YyZGYgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyBfX3YyZGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7Cit0eXBlZGVmIGludCBfX3Y0c2kgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7Cit0eXBlZGVmIHNob3J0IF9fdjhoaSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKK3R5cGVkZWYgY2hhciBfX3YxNnFpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOworCisvKiBUaGUgSW50ZWwgQVBJIGlzIGZsZXhpYmxlIGVub3VnaCB0aGF0IHdlIG11c3QgYWxsb3cgYWxpYXNpbmcgd2l0aCBvdGhlcgorICAgdmVjdG9yIHR5cGVzLCBhbmQgdGhlaXIgc2NhbGFyIGNvbXBvbmVudHMuICAqLwordHlwZWRlZiBsb25nIGxvbmcgX19tMTI4aSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNiksIF9fbWF5X2FsaWFzX18pKTsKK3R5cGVkZWYgZG91YmxlIF9fbTEyOGQgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpLCBfX21heV9hbGlhc19fKSk7CisKKy8qIENyZWF0ZSBhIHNlbGVjdG9yIGZvciB1c2Ugd2l0aCB0aGUgU0hVRlBEIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgX01NX1NIVUZGTEUyKGZwMSxmcDApIFwKKyAoKChmcDEpIDw8IDEpIHwgKGZwMCkpCisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGVsZW1lbnQgMCBhcyBGIGFuZCB0aGUgcmVzdCB6ZXJvLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9zZCAoZG91YmxlIF9fRikKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGQpeyBfX0YsIDAuMCB9OworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBib3RoIGVsZW1lbnRzIGVxdWFsIHRvIEYuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9wZCAoZG91YmxlIF9fRikKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGQpeyBfX0YsIF9fRiB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcGQxIChkb3VibGUgX19GKQoreworICByZXR1cm4gX21tX3NldDFfcGQgKF9fRik7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIHRoZSBsb3dlciB2YWx1ZSBYIGFuZCB1cHBlciB2YWx1ZSBXLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9wZCAoZG91YmxlIF9fVywgZG91YmxlIF9fWCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGQpeyBfX1gsIF9fVyB9OworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCB0aGUgbG93ZXIgdmFsdWUgVyBhbmQgdXBwZXIgdmFsdWUgWC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX3BkIChkb3VibGUgX19XLCBkb3VibGUgX19YKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4ZCl7IF9fVywgX19YIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciBvZiB6ZXJvcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXR6ZXJvX3BkICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4ZCl7IDAuMCwgMC4wIH07Cit9CisKKy8qIFNldHMgdGhlIGxvdyBEUEZQIHZhbHVlIG9mIEEgZnJvbSB0aGUgbG93IHZhbHVlIG9mIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCisvKiBMb2FkIHR3byBEUEZQIHZhbHVlcyBmcm9tIFAuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuICooX19tMTI4ZCAqKV9fUDsKK30KKworLyogTG9hZCB0d28gRFBGUCB2YWx1ZXMgZnJvbSBQLiAgVGhlIGFkZHJlc3MgbmVlZCBub3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWR1X3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2xvYWR1cGQgKF9fUCk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCB0d28gZWxlbWVudHMgZXF1YWwgdG8gKlAuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZDFfcGQgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gX21tX3NldDFfcGQgKCpfX1ApOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBlbGVtZW50IDAgYXMgKlAgYW5kIHRoZSByZXN0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9zZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fc2V0X3NkICgqX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9wZDEgKGRvdWJsZSBjb25zdCAqX19QKQoreworICByZXR1cm4gX21tX2xvYWQxX3BkIChfX1ApOworfQorCisvKiBMb2FkIHR3byBEUEZQIHZhbHVlcyBpbiByZXZlcnNlIG9yZGVyLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRyX3BkIChkb3VibGUgY29uc3QgKl9fUCkKK3sKKyAgX19tMTI4ZCBfX3RtcCA9IF9tbV9sb2FkX3BkIChfX1ApOworICByZXR1cm4gX19idWlsdGluX2lhMzJfc2h1ZnBkIChfX3RtcCwgX190bXAsIF9NTV9TSFVGRkxFMiAoMCwxKSk7Cit9CisKKy8qIFN0b3JlIHR3byBEUEZQIHZhbHVlcy4gIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlX3BkIChkb3VibGUgKl9fUCwgX19tMTI4ZCBfX0EpCit7CisgICooX19tMTI4ZCAqKV9fUCA9IF9fQTsKK30KKworLyogU3RvcmUgdHdvIERQRlAgdmFsdWVzLiAgVGhlIGFkZHJlc3MgbmVlZCBub3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JldV9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwZCAoX19QLCBfX0EpOworfQorCisvKiBTdG9yZXMgdGhlIGxvd2VyIERQRlAgdmFsdWUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfc2QgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgKl9fUCA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkZiAoX19BLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzZF9mNjQgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRmIChfX0EsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZWxfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgX21tX3N0b3JlX3NkIChfX1AsIF9fQSk7Cit9CisKKy8qIFN0b3JlcyB0aGUgdXBwZXIgRFBGUCB2YWx1ZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZWhfcGQgKGRvdWJsZSAqX19QLCBfX20xMjhkIF9fQSkKK3sKKyAgKl9fUCA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkZiAoX19BLCAxKTsKK30KKworLyogU3RvcmUgdGhlIGxvd2VyIERQRlAgdmFsdWUgYWNyb3NzIHR3byB3b3Jkcy4KKyAgIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlMV9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICBfbW1fc3RvcmVfcGQgKF9fUCwgX19idWlsdGluX2lhMzJfc2h1ZnBkIChfX0EsIF9fQSwgX01NX1NIVUZGTEUyICgwLDApKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlX3BkMSAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICBfbW1fc3RvcmUxX3BkIChfX1AsIF9fQSk7Cit9CisKKy8qIFN0b3JlIHR3byBEUEZQIHZhbHVlcyBpbiByZXZlcnNlIG9yZGVyLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3Jlcl9wZCAoZG91YmxlICpfX1AsIF9fbTEyOGQgX19BKQoreworICBfbW1fc3RvcmVfcGQgKF9fUCwgX19idWlsdGluX2lhMzJfc2h1ZnBkIChfX0EsIF9fQSwgX01NX1NIVUZGTEUyICgwLDEpKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2kxMjhfc2kzMiAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2kgKChfX3Y0c2kpX19BLCAwKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMTI4X3NpNjQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MmRpICgoX192MmRpKV9fQSwgMCk7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTEyOF9zaTY0eCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGkgKChfX3YyZGkpX19BLCAwKTsKK30KKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2FkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2FkZHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3N1YnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3N1YnNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX211bHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX211bHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9kaXZfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2RpdnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9kaXZfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2RpdnNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcXJ0X3BkIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NxcnRwZCAoKF9fdjJkZilfX0EpOworfQorCisvKiBSZXR1cm4gcGFpciB7c3FydCAoQVswKSwgQlsxXX0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3FydF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICBfX3YyZGYgX190bXAgPSBfX2J1aWx0aW5faWEzMl9tb3ZzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3NxcnRzZCAoKF9fdjJkZilfX3RtcCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbWlucGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbWluc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbWF4cGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbWF4c2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfYW5kcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZG5vdF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfYW5kbnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9vcl9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfb3JwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1feG9yX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl94b3JwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGVxcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBsdHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsZV9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbGVwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGd0cGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGdlX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBnZXBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZXFfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5lcXBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubHRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5sdHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBubGVfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5sZXBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ3RfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5ndHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ2VfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG5nZXBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBvcmRfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG9yZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXB1bm9yZF9wZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wdW5vcmRwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcGVxc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGx0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBsdHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wbGVzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3Rfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tb3ZzZCAoKF9fdjJkZikgX19BLAorCQkJCQkgKF9fdjJkZikKKwkJCQkJIF9fYnVpbHRpbl9pYTMyX2NtcGx0c2QgKChfX3YyZGYpIF9fQiwKKwkJCQkJCQkJIChfX3YyZGYpCisJCQkJCQkJCSBfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ2Vfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9tb3ZzZCAoKF9fdjJkZikgX19BLAorCQkJCQkgKF9fdjJkZikKKwkJCQkJIF9fYnVpbHRpbl9pYTMyX2NtcGxlc2QgKChfX3YyZGYpIF9fQiwKKwkJCQkJCQkJIChfX3YyZGYpCisJCQkJCQkJCSBfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmVxX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBuZXFzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmx0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBubHRzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmxlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jbXBubGVzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmd0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfbW92c2QgKChfX3YyZGYpIF9fQSwKKwkJCQkJIChfX3YyZGYpCisJCQkJCSBfX2J1aWx0aW5faWEzMl9jbXBubHRzZCAoKF9fdjJkZikgX19CLAorCQkJCQkJCQkgIChfX3YyZGYpCisJCQkJCQkJCSAgX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG5nZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX21vdnNkICgoX192MmRmKSBfX0EsCisJCQkJCSAoX192MmRmKQorCQkJCQkgX19idWlsdGluX2lhMzJfY21wbmxlc2QgKChfX3YyZGYpIF9fQiwKKwkJCQkJCQkJICAoX192MmRmKQorCQkJCQkJCQkgIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBvcmRfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2NtcG9yZHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXB1bm9yZF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY21wdW5vcmRzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pZXFfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGVxICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlsdF9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkbHQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWxlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pc2RsZSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pZ3Rfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGd0ICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlnZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkZ2UgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taW5lcV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taXNkbmVxICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pZXFfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RlcSAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWx0X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkbHQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdWNvbWlsZV9zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlzZGxlICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Vjb21pZ3Rfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RndCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWdlX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl91Y29taXNkZ2UgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdWNvbWluZXFfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RuZXEgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQik7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciBvZiBRaSwgd2hlcmUgaSBpcyB0aGUgZWxlbWVudCBudW1iZXIuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfZXBpNjR4IChsb25nIGxvbmcgX19xMSwgbG9uZyBsb25nIF9fcTApCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhpKShfX3YyZGkpeyBfX3EwLCBfX3ExIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9lcGk2NCAoX19tNjQgX19xMSwgIF9fbTY0IF9fcTApCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0eCAoKGxvbmcgbG9uZylfX3ExLCAobG9uZyBsb25nKV9fcTApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfZXBpMzIgKGludCBfX3EzLCBpbnQgX19xMiwgaW50IF9fcTEsIGludCBfX3EwKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4aSkoX192NHNpKXsgX19xMCwgX19xMSwgX19xMiwgX19xMyB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfZXBpMTYgKHNob3J0IF9fcTcsIHNob3J0IF9fcTYsIHNob3J0IF9fcTUsIHNob3J0IF9fcTQsCisJICAgICAgIHNob3J0IF9fcTMsIHNob3J0IF9fcTIsIHNob3J0IF9fcTEsIHNob3J0IF9fcTApCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhpKShfX3Y4aGkpeworICAgIF9fcTAsIF9fcTEsIF9fcTIsIF9fcTMsIF9fcTQsIF9fcTUsIF9fcTYsIF9fcTcgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X2VwaTggKGNoYXIgX19xMTUsIGNoYXIgX19xMTQsIGNoYXIgX19xMTMsIGNoYXIgX19xMTIsCisJICAgICAgY2hhciBfX3ExMSwgY2hhciBfX3ExMCwgY2hhciBfX3EwOSwgY2hhciBfX3EwOCwKKwkgICAgICBjaGFyIF9fcTA3LCBjaGFyIF9fcTA2LCBjaGFyIF9fcTA1LCBjaGFyIF9fcTA0LAorCSAgICAgIGNoYXIgX19xMDMsIGNoYXIgX19xMDIsIGNoYXIgX19xMDEsIGNoYXIgX19xMDApCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjhpKShfX3YxNnFpKXsKKyAgICBfX3EwMCwgX19xMDEsIF9fcTAyLCBfX3EwMywgX19xMDQsIF9fcTA1LCBfX3EwNiwgX19xMDcsCisgICAgX19xMDgsIF9fcTA5LCBfX3ExMCwgX19xMTEsIF9fcTEyLCBfX3ExMywgX19xMTQsIF9fcTE1CisgIH07Cit9CisKKy8qIFNldCBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3IgdG8gQS4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfZXBpNjR4IChsb25nIGxvbmcgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NHggKF9fQSwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9lcGk2NCAoX19tNjQgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NCAoX19BLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX2VwaTMyIChpbnQgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGkzMiAoX19BLCBfX0EsIF9fQSwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9lcGkxNiAoc2hvcnQgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGkxNiAoX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX2VwaTggKGNoYXIgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGk4IChfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwKKwkJICAgICAgIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BLCBfX0EsIF9fQSwgX19BKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIG9mIFFpLCB3aGVyZSBpIGlzIHRoZSBlbGVtZW50IG51bWJlci4KKyAgIFRoZSBwYXJhbWV0ZXIgb3JkZXIgaXMgcmV2ZXJzZWQgZnJvbSB0aGUgX21tX3NldF9lcGkqIGZ1bmN0aW9ucy4gICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfZXBpNjQgKF9fbTY0IF9fcTAsIF9fbTY0IF9fcTEpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0IChfX3ExLCBfX3EwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9lcGkzMiAoaW50IF9fcTAsIGludCBfX3ExLCBpbnQgX19xMiwgaW50IF9fcTMpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTMyIChfX3EzLCBfX3EyLCBfX3ExLCBfX3EwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9lcGkxNiAoc2hvcnQgX19xMCwgc2hvcnQgX19xMSwgc2hvcnQgX19xMiwgc2hvcnQgX19xMywKKwkgICAgICAgIHNob3J0IF9fcTQsIHNob3J0IF9fcTUsIHNob3J0IF9fcTYsIHNob3J0IF9fcTcpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTE2IChfX3E3LCBfX3E2LCBfX3E1LCBfX3E0LCBfX3EzLCBfX3EyLCBfX3ExLCBfX3EwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9lcGk4IChjaGFyIF9fcTAwLCBjaGFyIF9fcTAxLCBjaGFyIF9fcTAyLCBjaGFyIF9fcTAzLAorCSAgICAgICBjaGFyIF9fcTA0LCBjaGFyIF9fcTA1LCBjaGFyIF9fcTA2LCBjaGFyIF9fcTA3LAorCSAgICAgICBjaGFyIF9fcTA4LCBjaGFyIF9fcTA5LCBjaGFyIF9fcTEwLCBjaGFyIF9fcTExLAorCSAgICAgICBjaGFyIF9fcTEyLCBjaGFyIF9fcTEzLCBjaGFyIF9fcTE0LCBjaGFyIF9fcTE1KQoreworICByZXR1cm4gX21tX3NldF9lcGk4IChfX3ExNSwgX19xMTQsIF9fcTEzLCBfX3ExMiwgX19xMTEsIF9fcTEwLCBfX3EwOSwgX19xMDgsCisJCSAgICAgICBfX3EwNywgX19xMDYsIF9fcTA1LCBfX3EwNCwgX19xMDMsIF9fcTAyLCBfX3EwMSwgX19xMDApOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBlbGVtZW50IDAgYXMgKlAgYW5kIHRoZSByZXN0IHplcm8uICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3NpMTI4IChfX20xMjhpIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAqX19QOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkdV9zaTEyOCAoX19tMTI4aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2xvYWRkcXUgKChjaGFyIGNvbnN0ICopX19QKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZGxfZXBpNjQgKF9fbTEyOGkgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjQgKChfX202NCkwTEwsICooX19tNjQgKilfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZV9zaTEyOCAoX19tMTI4aSAqX19QLCBfX20xMjhpIF9fQikKK3sKKyAgKl9fUCA9IF9fQjsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmV1X3NpMTI4IChfX20xMjhpICpfX1AsIF9fbTEyOGkgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWRxdSAoKGNoYXIgKilfX1AsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlbF9lcGk2NCAoX19tMTI4aSAqX19QLCBfX20xMjhpIF9fQikKK3sKKyAgKihsb25nIGxvbmcgKilfX1AgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGkgKChfX3YyZGkpX19CLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVwaTY0X3BpNjQgKF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3YyZGkgKChfX3YyZGkpX19CLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92cGk2NF9lcGk2NCAoX19tNjQgX19BKQoreworICByZXR1cm4gX21tX3NldF9lcGk2NCAoKF9fbTY0KTBMTCwgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZV9lcGk2NCAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9tb3ZxMTI4ICgoX192MmRpKSBfX0EpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0emVyb19zaTEyOCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOGkpKF9fdjRzaSl7IDAsIDAsIDAsIDAgfTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpMzJfcGQgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0ZHEycGQgKChfX3Y0c2kpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpMzJfcHMgKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRkcTJwcyAoKF9fdjRzaSkgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGRfZXBpMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0cGQyZHEgKChfX3YyZGYpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwZF9waTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9jdnRwZDJwaSAoKF9fdjJkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwZF9wcyAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KV9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzICgoX192MmRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0cGRfZXBpMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxICgoX192MmRmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHBkX3BpMzIgKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX2N2dHRwZDJwaSAoKF9fdjJkZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGkzMl9wZCAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0cGkycGQgKChfX3Yyc2kpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBzX2VwaTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfY3Z0cHMyZHEgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRwc19lcGkzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcSAoKF9fdjRzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHNfcGQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRwczJwZCAoKF9fdjRzZikgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzZF9zaTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpICgoX192MmRmKSBfX0EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2Rfc2k2NCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzZDJzaTY0ICgoX192MmRmKSBfX0EpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2Rfc2k2NHggKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0c2Qyc2k2NCAoKF9fdjJkZikgX19BKTsKK30KKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzZF9zaTMyIChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHRzZDJzaSAoKF9fdjJkZikgX19BKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzZF9zaTY0IChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHRzZDJzaTY0ICgoX192MmRmKSBfX0EpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNkX3NpNjR4IChfX20xMjhkIF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHRzZDJzaTY0ICgoX192MmRmKSBfX0EpOworfQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2Rfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOGQgX19CKQoreworICByZXR1cm4gKF9fbTEyOClfX2J1aWx0aW5faWEzMl9jdnRzZDJzcyAoKF9fdjRzZikgX19BLCAoX192MmRmKSBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTMyX3NkIChfX20xMjhkIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHNpMnNkICgoX192MmRmKSBfX0EsIF9fQik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBJbnRlbCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9zZCAoX19tMTI4ZCBfX0EsIGxvbmcgbG9uZyBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9jdnRzaTY0MnNkICgoX192MmRmKSBfX0EsIF9fQik7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NHhfc2QgKF9fbTEyOGQgX19BLCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfY3Z0c2k2NDJzZCAoKF9fdjJkZikgX19BLCBfX0IpOworfQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNzX3NkIChfX20xMjhkIF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX2N2dHNzMnNkICgoX192MmRmKSBfX0EsIChfX3Y0c2YpX19CKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZV9wZChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9zaHVmcGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgX19tYXNrKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9zaHVmZmxlX3BkKEEsIEIsIE4pCQkJCQkJXAorICAoKF9fbTEyOGQpX19idWlsdGluX2lhMzJfc2h1ZnBkICgoX192MmRmKShfX20xMjhkKShBKSwJCVwKKwkJCQkgICAoX192MmRmKShfX20xMjhkKShCKSwgKGludCkoTikpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl91bnBja2hwZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhkKV9fYnVpbHRpbl9pYTMyX3VucGNrbHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkaF9wZCAoX19tMTI4ZCBfX0EsIGRvdWJsZSBjb25zdCAqX19CKQoreworICByZXR1cm4gKF9fbTEyOGQpX19idWlsdGluX2lhMzJfbG9hZGhwZCAoKF9fdjJkZilfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRsX3BkIChfX20xMjhkIF9fQSwgZG91YmxlIGNvbnN0ICpfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZClfX2J1aWx0aW5faWEzMl9sb2FkbHBkICgoX192MmRmKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlbWFza19wZCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9tb3Ztc2twZCAoKF9fdjJkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrc19lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFja3Nzd2IxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2tzX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGFja3VzX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNraGlfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHVucGNraGJ3MTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tod2QxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2toZHExMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tocWRxMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2tsb19lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wdW5wY2tsYncxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZDEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2xkcTEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3B1bnBja2xxZHExMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGR3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGRkMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGRxMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhZGRzYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkc3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHNfZXB1OCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFkZHVzYjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX2VwdTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYWRkdXN3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YmIxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3VidzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3ViZDEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX2VwaTY0IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3VicTEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnN3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJzX2VwdTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19lcHUxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHN1YnVzdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcG1hZGR3ZDEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsaGlfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtdWxodzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsbG9fZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtdWxsdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9zdTMyIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wbXVsdWRxICgoX192MnNpKV9fQSwgKF9fdjJzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfZXB1MzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtdWx1ZHExMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfZXBpMTYgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHdpMTI4ICgoX192OGhpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsaV9lcGkzMiAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsZGkxMjggKChfX3Y0c2kpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX2VwaTY0IChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxxaTEyOCAoKF9fdjJkaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYWlfZXBpMTYgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYXdpMTI4ICgoX192OGhpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JhaV9lcGkzMiAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JhZGkxMjggKChfX3Y0c2kpX19BLCBfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX3NpMTI4IChfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmxkcWkxMjggKF9fQSwgX19OICogOCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfc2kxMjggKF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbGRxaTEyOCAoX19BLCBfX04gKiA4KTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9zcmxpX3NpMTI4KEEsIE4pIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmxkcWkxMjggKChfX20xMjhpKShBKSwgKGludCkoTikgKiA4KSkKKyNkZWZpbmUgX21tX3NsbGlfc2kxMjgoQSwgTikgXAorICAoKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbGRxaTEyOCAoKF9fbTEyOGkpKEEpLCAoaW50KShOKSAqIDgpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfZXBpMTYgKF9fbTEyOGkgX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybHdpMTI4ICgoX192OGhpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9lcGkzMiAoX19tMTI4aSBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc3JsZGkxMjggKChfX3Y0c2kpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmxpX2VwaTY0IChfX20xMjhpIF9fQSwgaW50IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzcmxxaTEyOCAoKF9fdjJkaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNsbHcxMjgoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2xsX2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2xsZDEyOCgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxfZXBpNjQgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzbGxxMTI4KChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYV9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYXcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYV9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNyYWQxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybHcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybF9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybGQxMjggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybF9lcGk2NCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNybHExMjggKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZF9zaTEyOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGFuZDEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kbm90X3NpMTI4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wYW5kbjEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fb3Jfc2kxMjggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BvcjEyOCAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1feG9yX3NpMTI4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9weG9yMTI4ICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9lcGk4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZXFiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX2VwaTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZXF3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlcV9lcGkzMiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGVxZDEyOCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbHRfZXBpOCAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGd0YjEyOCAoKF9fdjE2cWkpX19CLCAoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9lcGkxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGNtcGd0dzEyOCAoKF9fdjhoaSlfX0IsIChfX3Y4aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbHRfZXBpMzIgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBndGQxMjggKChfX3Y0c2kpX19CLCAoX192NHNpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X2VwaTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBndGIxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BjbXBndHcxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X2VwaTMyIChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wY21wZ3RkMTI4ICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfZXBpMTYgKF9fbTEyOGkgY29uc3QgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gKHVuc2lnbmVkIHNob3J0KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y4aGkgKChfX3Y4aGkpX19BLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfZXBpMTYgKF9fbTEyOGkgY29uc3QgX19BLCBpbnQgY29uc3QgX19ELCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjhoaSAoKF9fdjhoaSlfX0EsIF9fRCwgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTE2KEEsIE4pIFwKKyAgKChpbnQpICh1bnNpZ25lZCBzaG9ydCkgX19idWlsdGluX2lhMzJfdmVjX2V4dF92OGhpICgoX192OGhpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1faW5zZXJ0X2VwaTE2KEEsIEQsIE4pCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y4aGkgKChfX3Y4aGkpKF9fbTEyOGkpKEEpLAlcCisJCQkJCSAgKGludCkoRCksIChpbnQpKE4pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtYXhzdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X2VwdTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtYXh1YjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXBpMTYgKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtaW5zdzEyOCAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX2VwdTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BtaW51YjEyOCAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVtYXNrX2VwaTggKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG1vdm1za2IxMjggKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhpX2VwdTE2IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wbXVsaHV3MTI4ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlaGlfZXBpMTYgKF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19tYXNrKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcHNodWZodyAoKF9fdjhoaSlfX0EsIF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVsb19lcGkxNiAoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmx3ICgoX192OGhpKV9fQSwgX19tYXNrKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZV9lcGkzMiAoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX21hc2spCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2h1ZmQgKChfX3Y0c2kpX19BLCBfX21hc2spOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3NodWZmbGVoaV9lcGkxNihBLCBOKSBcCisgICgoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2h1Zmh3ICgoX192OGhpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEsIE4pIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzaHVmbHcgKChfX3Y4aGkpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbV9zaHVmZmxlX2VwaTMyKEEsIE4pIFwKKyAgKChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BzaHVmZCAoKF9fdjRzaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXNrbW92ZXVfc2kxMjggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgY2hhciAqX19DKQoreworICBfX2J1aWx0aW5faWEzMl9tYXNrbW92ZHF1ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQiwgX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYXZnX2VwdTggKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKV9fYnVpbHRpbl9pYTMyX3BhdmdiMTI4ICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2F2Z19lcHUxNiAoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpX19idWlsdGluX2lhMzJfcGF2Z3cxMjggKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NhZF9lcHU4IChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSlfX2J1aWx0aW5faWEzMl9wc2FkYncxMjggKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NpMzIgKGludCAqX19BLCBpbnQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudGkgKF9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3NpMTI4IChfX20xMjhpICpfX0EsIF9fbTEyOGkgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudGRxICgoX192MmRpICopX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9wZCAoZG91YmxlICpfX0EsIF9fbTEyOGQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHBkIChfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2xmbHVzaCAodm9pZCBjb25zdCAqX19BKQoreworICBfX2J1aWx0aW5faWEzMl9jbGZsdXNoIChfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sZmVuY2UgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX2xmZW5jZSAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWZlbmNlICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9tZmVuY2UgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMzJfc2kxMjggKGludCBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTMyICgwLCAwLCAwLCBfX0EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjRfc2kxMjggKGxvbmcgbG9uZyBfX0EpCit7CisgIHJldHVybiBfbW1fc2V0X2VwaTY0eCAoMCwgX19BKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0eF9zaTEyOCAobG9uZyBsb25nIF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9zZXRfZXBpNjR4ICgwLCBfX0EpOworfQorI2VuZGlmCisKKy8qIENhc3RzIGJldHdlZW4gdmFyaW91cyBTUCwgRFAsIElOVCB2ZWN0b3IgdHlwZXMuICBOb3RlIHRoYXQgdGhlc2UgZG8gbm8KKyAgIGNvbnZlcnNpb24gb2YgdmFsdWVzLCB0aGV5IGp1c3QgY2hhbmdlIHRoZSB0eXBlLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2FzdHBkX3BzKF9fbTEyOGQgX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0cGRfc2kxMjgoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19BOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0cHNfcGQoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3Rwc19zaTEyOChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fQTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jYXN0c2kxMjhfcHMoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX0E7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Nhc3RzaTEyOF9wZChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX0E7Cit9CisKKyNlbmRpZiAvKiBfX1NTRTJfXyAgKi8KKworI2VuZGlmIC8qIF9FTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvZmxvYXQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4Y2MwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2Zsb2F0LmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNS4yLjQuMi4yICBDaGFyYWN0ZXJpc3RpY3Mgb2YgZmxvYXRpbmcgdHlwZXMgPGZsb2F0Lmg+CisgKi8KKworI2lmbmRlZiBfRkxPQVRfSF9fXworI2RlZmluZSBfRkxPQVRfSF9fXworCisvKiBSYWRpeCBvZiBleHBvbmVudCByZXByZXNlbnRhdGlvbiwgYi4gKi8KKyN1bmRlZiBGTFRfUkFESVgKKyNkZWZpbmUgRkxUX1JBRElYCV9fRkxUX1JBRElYX18KKworLyogTnVtYmVyIG9mIGJhc2UtRkxUX1JBRElYIGRpZ2l0cyBpbiB0aGUgc2lnbmlmaWNhbmQsIHAuICAqLworI3VuZGVmIEZMVF9NQU5UX0RJRworI3VuZGVmIERCTF9NQU5UX0RJRworI3VuZGVmIExEQkxfTUFOVF9ESUcKKyNkZWZpbmUgRkxUX01BTlRfRElHCV9fRkxUX01BTlRfRElHX18KKyNkZWZpbmUgREJMX01BTlRfRElHCV9fREJMX01BTlRfRElHX18KKyNkZWZpbmUgTERCTF9NQU5UX0RJRwlfX0xEQkxfTUFOVF9ESUdfXworCisvKiBOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMsIHEsIHN1Y2ggdGhhdCBhbnkgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdpdGggcQorICAgZGVjaW1hbCBkaWdpdHMgY2FuIGJlIHJvdW5kZWQgaW50byBhIGZsb2F0aW5nLXBvaW50IG51bWJlciB3aXRoIHAgcmFkaXggYgorICAgZGlnaXRzIGFuZCBiYWNrIGFnYWluIHdpdGhvdXQgY2hhbmdlIHRvIHRoZSBxIGRlY2ltYWwgZGlnaXRzLAorCisJcCAqIGxvZzEwKGIpCQkJaWYgYiBpcyBhIHBvd2VyIG9mIDEwCisJZmxvb3IoKHAgLSAxKSAqIGxvZzEwKGIpKQlvdGhlcndpc2UKKyovCisjdW5kZWYgRkxUX0RJRworI3VuZGVmIERCTF9ESUcKKyN1bmRlZiBMREJMX0RJRworI2RlZmluZSBGTFRfRElHCQlfX0ZMVF9ESUdfXworI2RlZmluZSBEQkxfRElHCQlfX0RCTF9ESUdfXworI2RlZmluZSBMREJMX0RJRwlfX0xEQkxfRElHX18KKworLyogTWluaW11bSBpbnQgeCBzdWNoIHRoYXQgRkxUX1JBRElYKiooeC0xKSBpcyBhIG5vcm1hbGl6ZWQgZmxvYXQsIGVtaW4gKi8KKyN1bmRlZiBGTFRfTUlOX0VYUAorI3VuZGVmIERCTF9NSU5fRVhQCisjdW5kZWYgTERCTF9NSU5fRVhQCisjZGVmaW5lIEZMVF9NSU5fRVhQCV9fRkxUX01JTl9FWFBfXworI2RlZmluZSBEQkxfTUlOX0VYUAlfX0RCTF9NSU5fRVhQX18KKyNkZWZpbmUgTERCTF9NSU5fRVhQCV9fTERCTF9NSU5fRVhQX18KKworLyogTWluaW11bSBuZWdhdGl2ZSBpbnRlZ2VyIHN1Y2ggdGhhdCAxMCByYWlzZWQgdG8gdGhhdCBwb3dlciBpcyBpbiB0aGUKKyAgIHJhbmdlIG9mIG5vcm1hbGl6ZWQgZmxvYXRpbmctcG9pbnQgbnVtYmVycywKKworCWNlaWwobG9nMTAoYikgKiAoZW1pbiAtIDEpKQorKi8KKyN1bmRlZiBGTFRfTUlOXzEwX0VYUAorI3VuZGVmIERCTF9NSU5fMTBfRVhQCisjdW5kZWYgTERCTF9NSU5fMTBfRVhQCisjZGVmaW5lIEZMVF9NSU5fMTBfRVhQCV9fRkxUX01JTl8xMF9FWFBfXworI2RlZmluZSBEQkxfTUlOXzEwX0VYUAlfX0RCTF9NSU5fMTBfRVhQX18KKyNkZWZpbmUgTERCTF9NSU5fMTBfRVhQCV9fTERCTF9NSU5fMTBfRVhQX18KKworLyogTWF4aW11bSBpbnQgeCBzdWNoIHRoYXQgRkxUX1JBRElYKiooeC0xKSBpcyBhIHJlcHJlc2VudGFibGUgZmxvYXQsIGVtYXguICAqLworI3VuZGVmIEZMVF9NQVhfRVhQCisjdW5kZWYgREJMX01BWF9FWFAKKyN1bmRlZiBMREJMX01BWF9FWFAKKyNkZWZpbmUgRkxUX01BWF9FWFAJX19GTFRfTUFYX0VYUF9fCisjZGVmaW5lIERCTF9NQVhfRVhQCV9fREJMX01BWF9FWFBfXworI2RlZmluZSBMREJMX01BWF9FWFAJX19MREJMX01BWF9FWFBfXworCisvKiBNYXhpbXVtIGludGVnZXIgc3VjaCB0aGF0IDEwIHJhaXNlZCB0byB0aGF0IHBvd2VyIGlzIGluIHRoZSByYW5nZSBvZgorICAgcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVycywKKworCWZsb29yKGxvZzEwKCgxIC0gYioqLXApICogYioqZW1heCkpCisqLworI3VuZGVmIEZMVF9NQVhfMTBfRVhQCisjdW5kZWYgREJMX01BWF8xMF9FWFAKKyN1bmRlZiBMREJMX01BWF8xMF9FWFAKKyNkZWZpbmUgRkxUX01BWF8xMF9FWFAJX19GTFRfTUFYXzEwX0VYUF9fCisjZGVmaW5lIERCTF9NQVhfMTBfRVhQCV9fREJMX01BWF8xMF9FWFBfXworI2RlZmluZSBMREJMX01BWF8xMF9FWFAJX19MREJMX01BWF8xMF9FWFBfXworCisvKiBNYXhpbXVtIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nLXBvaW50IG51bWJlciwKKworCSgxIC0gYioqLXApICogYioqZW1heAorKi8KKyN1bmRlZiBGTFRfTUFYCisjdW5kZWYgREJMX01BWAorI3VuZGVmIExEQkxfTUFYCisjZGVmaW5lIEZMVF9NQVgJCV9fRkxUX01BWF9fCisjZGVmaW5lIERCTF9NQVgJCV9fREJMX01BWF9fCisjZGVmaW5lIExEQkxfTUFYCV9fTERCTF9NQVhfXworCisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBsZWFzdCB2YWx1ZSBncmVhdGVyIHRoYW4gMSB0aGF0IGlzCisgICByZXByZXNlbnRhYmxlIGluIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCB0eXBlLCBiKioxLXAuICAqLworI3VuZGVmIEZMVF9FUFNJTE9OCisjdW5kZWYgREJMX0VQU0lMT04KKyN1bmRlZiBMREJMX0VQU0lMT04KKyNkZWZpbmUgRkxUX0VQU0lMT04JX19GTFRfRVBTSUxPTl9fCisjZGVmaW5lIERCTF9FUFNJTE9OCV9fREJMX0VQU0lMT05fXworI2RlZmluZSBMREJMX0VQU0lMT04JX19MREJMX0VQU0lMT05fXworCisvKiBNaW5pbXVtIG5vcm1hbGl6ZWQgcG9zaXRpdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBiKiooZW1pbiAtIDEpLiAgKi8KKyN1bmRlZiBGTFRfTUlOCisjdW5kZWYgREJMX01JTgorI3VuZGVmIExEQkxfTUlOCisjZGVmaW5lIEZMVF9NSU4JCV9fRkxUX01JTl9fCisjZGVmaW5lIERCTF9NSU4JCV9fREJMX01JTl9fCisjZGVmaW5lIExEQkxfTUlOCV9fTERCTF9NSU5fXworCisvKiBBZGRpdGlvbiByb3VuZHMgdG8gMDogemVybywgMTogbmVhcmVzdCwgMjogK2luZiwgMzogLWluZiwgLTE6IHVua25vd24uICAqLworLyogPz8/IFRoaXMgaXMgc3VwcG9zZWQgdG8gY2hhbmdlIHdpdGggY2FsbHMgdG8gZmVzZXRyb3VuZCBpbiA8ZmVudi5oPi4gICovCisjdW5kZWYgRkxUX1JPVU5EUworI2RlZmluZSBGTFRfUk9VTkRTIDEKKworI2lmIGRlZmluZWQgKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorLyogVGhlIGZsb2F0aW5nLXBvaW50IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBtZXRob2QuCisgICAgICAgIC0xICBpbmRldGVybWluYXRlCisgICAgICAgICAwICBldmFsdWF0ZSBhbGwgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIGp1c3QgdG8gdGhlIHJhbmdlIGFuZAorICAgICAgICAgICAgcHJlY2lzaW9uIG9mIHRoZSB0eXBlCisgICAgICAgICAxICBldmFsdWF0ZSBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgb2YgdHlwZSBmbG9hdCBhbmQgZG91YmxlCisgICAgICAgICAgICB0byB0aGUgcmFuZ2UgYW5kIHByZWNpc2lvbiBvZiB0aGUgZG91YmxlIHR5cGUsIGV2YWx1YXRlCisgICAgICAgICAgICBsb25nIGRvdWJsZSBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgdG8gdGhlIHJhbmdlIGFuZAorICAgICAgICAgICAgcHJlY2lzaW9uIG9mIHRoZSBsb25nIGRvdWJsZSB0eXBlCisgICAgICAgICAyICBldmFsdWF0ZSBhbGwgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIHRvIHRoZSByYW5nZSBhbmQKKyAgICAgICAgICAgIHByZWNpc2lvbiBvZiB0aGUgbG9uZyBkb3VibGUgdHlwZQorCisgICA/Pz8gVGhpcyBvdWdodCB0byBjaGFuZ2Ugd2l0aCB0aGUgc2V0dGluZyBvZiB0aGUgZnAgY29udHJvbCB3b3JkOworICAgdGhlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBjb21waWxlciBhc3N1bWVzIHRoZSB3aWRlc3Qgc2V0dGluZy4gICovCisjdW5kZWYgRkxUX0VWQUxfTUVUSE9ECisjZGVmaW5lIEZMVF9FVkFMX01FVEhPRAlfX0ZMVF9FVkFMX01FVEhPRF9fCisKKy8qIE51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgbiwgc3VjaCB0aGF0IGFueSBmbG9hdGluZy1wb2ludCBudW1iZXIgaW4gdGhlCisgICB3aWRlc3Qgc3VwcG9ydGVkIGZsb2F0aW5nIHR5cGUgd2l0aCBwbWF4IHJhZGl4IGIgZGlnaXRzIGNhbiBiZSByb3VuZGVkCisgICB0byBhIGZsb2F0aW5nLXBvaW50IG51bWJlciB3aXRoIG4gZGVjaW1hbCBkaWdpdHMgYW5kIGJhY2sgYWdhaW4gd2l0aG91dAorICAgY2hhbmdlIHRvIHRoZSB2YWx1ZSwKKworCXBtYXggKiBsb2cxMChiKQkJCWlmIGIgaXMgYSBwb3dlciBvZiAxMAorCWNlaWwoMSArIHBtYXggKiBsb2cxMChiKSkJb3RoZXJ3aXNlCisqLworI3VuZGVmIERFQ0lNQUxfRElHCisjZGVmaW5lIERFQ0lNQUxfRElHCV9fREVDSU1BTF9ESUdfXworCisjZW5kaWYgLyogQzk5ICovCisKKyNpZiBkZWZpbmVkIChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID4gMTk5OTAxTAorLyogVmVyc2lvbnMgb2YgREVDSU1BTF9ESUcgZm9yIGVhY2ggZmxvYXRpbmctcG9pbnQgdHlwZS4gICovCisjdW5kZWYgRkxUX0RFQ0lNQUxfRElHCisjdW5kZWYgREJMX0RFQ0lNQUxfRElHCisjdW5kZWYgTERCTF9ERUNJTUFMX0RJRworI2RlZmluZSBGTFRfREVDSU1BTF9ESUcJCV9fRkxUX0RFQ0lNQUxfRElHX18KKyNkZWZpbmUgREJMX0RFQ0lNQUxfRElHCQlfX0RCTF9ERUNJTUFMX0RJR19fCisjZGVmaW5lIExEQkxfREVDSU1BTF9ESUcJX19ERUNJTUFMX0RJR19fCisKKy8qIFdoZXRoZXIgdHlwZXMgc3VwcG9ydCBzdWJub3JtYWwgbnVtYmVycy4gICovCisjdW5kZWYgRkxUX0hBU19TVUJOT1JNCisjdW5kZWYgREJMX0hBU19TVUJOT1JNCisjdW5kZWYgTERCTF9IQVNfU1VCTk9STQorI2RlZmluZSBGTFRfSEFTX1NVQk5PUk0JCV9fRkxUX0hBU19ERU5PUk1fXworI2RlZmluZSBEQkxfSEFTX1NVQk5PUk0JCV9fREJMX0hBU19ERU5PUk1fXworI2RlZmluZSBMREJMX0hBU19TVUJOT1JNCV9fTERCTF9IQVNfREVOT1JNX18KKworLyogTWluaW11bSBwb3NpdGl2ZSB2YWx1ZXMsIGluY2x1ZGluZyBzdWJub3JtYWxzLiAgKi8KKyN1bmRlZiBGTFRfVFJVRV9NSU4KKyN1bmRlZiBEQkxfVFJVRV9NSU4KKyN1bmRlZiBMREJMX1RSVUVfTUlOCisjaWYgX19GTFRfSEFTX0RFTk9STV9fCisjZGVmaW5lIEZMVF9UUlVFX01JTglfX0ZMVF9ERU5PUk1fTUlOX18KKyNlbHNlCisjZGVmaW5lIEZMVF9UUlVFX01JTglfX0ZMVF9NSU5fXworI2VuZGlmCisjaWYgX19EQkxfSEFTX0RFTk9STV9fCisjZGVmaW5lIERCTF9UUlVFX01JTglfX0RCTF9ERU5PUk1fTUlOX18KKyNlbHNlCisjZGVmaW5lIERCTF9UUlVFX01JTglfX0RCTF9NSU5fXworI2VuZGlmCisjaWYgX19MREJMX0hBU19ERU5PUk1fXworI2RlZmluZSBMREJMX1RSVUVfTUlOCV9fTERCTF9ERU5PUk1fTUlOX18KKyNlbHNlCisjZGVmaW5lIExEQkxfVFJVRV9NSU4JX19MREJMX01JTl9fCisjZW5kaWYKKworI2VuZGlmIC8qIEMxWCAqLworCisjaWZkZWYgX19TVERDX1dBTlRfREVDX0ZQX18KKy8qIERyYWZ0IFRlY2huaWNhbCBSZXBvcnQgMjQ3MzIsIGV4dGVuc2lvbiBmb3IgZGVjaW1hbCBmbG9hdGluZy1wb2ludAorICAgYXJpdGhtZXRpYzogQ2hhcmFjdGVyaXN0aWMgb2YgZGVjaW1hbCBmbG9hdGluZyB0eXBlcyA8ZmxvYXQuaD4uICAqLworCisvKiBOdW1iZXIgb2YgYmFzZS1GTFRfUkFESVggZGlnaXRzIGluIHRoZSBzaWduaWZpY2FuZCwgcC4gICovCisjdW5kZWYgREVDMzJfTUFOVF9ESUcKKyN1bmRlZiBERUM2NF9NQU5UX0RJRworI3VuZGVmIERFQzEyOF9NQU5UX0RJRworI2RlZmluZSBERUMzMl9NQU5UX0RJRwlfX0RFQzMyX01BTlRfRElHX18KKyNkZWZpbmUgREVDNjRfTUFOVF9ESUcJX19ERUM2NF9NQU5UX0RJR19fCisjZGVmaW5lIERFQzEyOF9NQU5UX0RJRwlfX0RFQzEyOF9NQU5UX0RJR19fCisKKy8qIE1pbmltdW0gZXhwb25lbnQuICovCisjdW5kZWYgREVDMzJfTUlOX0VYUAorI3VuZGVmIERFQzY0X01JTl9FWFAKKyN1bmRlZiBERUMxMjhfTUlOX0VYUAorI2RlZmluZSBERUMzMl9NSU5fRVhQCV9fREVDMzJfTUlOX0VYUF9fCisjZGVmaW5lIERFQzY0X01JTl9FWFAJX19ERUM2NF9NSU5fRVhQX18KKyNkZWZpbmUgREVDMTI4X01JTl9FWFAJX19ERUMxMjhfTUlOX0VYUF9fCisKKy8qIE1heGltdW0gZXhwb25lbnQuICovCisjdW5kZWYgREVDMzJfTUFYX0VYUAorI3VuZGVmIERFQzY0X01BWF9FWFAKKyN1bmRlZiBERUMxMjhfTUFYX0VYUAorI2RlZmluZSBERUMzMl9NQVhfRVhQCV9fREVDMzJfTUFYX0VYUF9fCisjZGVmaW5lIERFQzY0X01BWF9FWFAJX19ERUM2NF9NQVhfRVhQX18KKyNkZWZpbmUgREVDMTI4X01BWF9FWFAJX19ERUMxMjhfTUFYX0VYUF9fCisKKy8qIE1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZGVjaW1hbCBmbG9hdGluZy1wb2ludCBudW1iZXIKKyAgICh0aGVyZSBhcmUgNiwgMTUsIGFuZCAzMyA5cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludHMgcmVzcGVjdGl2ZWx5KS4gKi8KKyN1bmRlZiBERUMzMl9NQVgKKyN1bmRlZiBERUM2NF9NQVgKKyN1bmRlZiBERUMxMjhfTUFYCisjZGVmaW5lIERFQzMyX01BWCAgIF9fREVDMzJfTUFYX18KKyNkZWZpbmUgREVDNjRfTUFYICAgX19ERUM2NF9NQVhfXworI2RlZmluZSBERUMxMjhfTUFYICBfX0RFQzEyOF9NQVhfXworCisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBsZWFzdCB2YWx1ZSBncmVhdGVyIHRoYW4gMSB0aGF0IGlzCisgICByZXByZXNlbnRhYmxlIGluIHRoZSBnaXZlbiBmbG9hdGluZyBwb2ludCB0eXBlLiAqLworI3VuZGVmIERFQzMyX0VQU0lMT04KKyN1bmRlZiBERUM2NF9FUFNJTE9OCisjdW5kZWYgREVDMTI4X0VQU0lMT04KKyNkZWZpbmUgREVDMzJfRVBTSUxPTglfX0RFQzMyX0VQU0lMT05fXworI2RlZmluZSBERUM2NF9FUFNJTE9OCV9fREVDNjRfRVBTSUxPTl9fCisjZGVmaW5lIERFQzEyOF9FUFNJTE9OCV9fREVDMTI4X0VQU0lMT05fXworCisvKiBNaW5pbXVtIG5vcm1hbGl6ZWQgcG9zaXRpdmUgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAqLworI3VuZGVmIERFQzMyX01JTgorI3VuZGVmIERFQzY0X01JTgorI3VuZGVmIERFQzEyOF9NSU4KKyNkZWZpbmUgREVDMzJfTUlOCV9fREVDMzJfTUlOX18KKyNkZWZpbmUgREVDNjRfTUlOCV9fREVDNjRfTUlOX18KKyNkZWZpbmUgREVDMTI4X01JTglfX0RFQzEyOF9NSU5fXworCisvKiBNaW5pbXVtIHN1Ym5vcm1hbCBwb3NpdGl2ZSBmbG9hdGluZy1wb2ludCBudW1iZXIuICovCisjdW5kZWYgREVDMzJfU1VCTk9STUFMX01JTgorI3VuZGVmIERFQzY0X1NVQk5PUk1BTF9NSU4KKyN1bmRlZiBERUMxMjhfU1VCTk9STUFMX01JTgorI2RlZmluZSBERUMzMl9TVUJOT1JNQUxfTUlOICAgICAgIF9fREVDMzJfU1VCTk9STUFMX01JTl9fCisjZGVmaW5lIERFQzY0X1NVQk5PUk1BTF9NSU4gICAgICAgX19ERUM2NF9TVUJOT1JNQUxfTUlOX18KKyNkZWZpbmUgREVDMTI4X1NVQk5PUk1BTF9NSU4gICAgICBfX0RFQzEyOF9TVUJOT1JNQUxfTUlOX18KKworLyogVGhlIGZsb2F0aW5nLXBvaW50IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBtZXRob2QuCisgICAgICAgICAtMSAgaW5kZXRlcm1pbmF0ZQorICAgICAgICAgMCAgZXZhbHVhdGUgYWxsIG9wZXJhdGlvbnMgYW5kIGNvbnN0YW50cyBqdXN0IHRvIHRoZSByYW5nZSBhbmQKKyAgICAgICAgICAgIHByZWNpc2lvbiBvZiB0aGUgdHlwZQorICAgICAgICAgMSAgZXZhbHVhdGUgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIG9mIHR5cGUgX0RlY2ltYWwzMiAKKwkgICAgYW5kIF9EZWNpbWFsNjQgdG8gdGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgdGhlIF9EZWNpbWFsNjQgCisgICAgICAgICAgICB0eXBlLCBldmFsdWF0ZSBfRGVjaW1hbDEyOCBvcGVyYXRpb25zIGFuZCBjb25zdGFudHMgdG8gdGhlIAorCSAgICByYW5nZSBhbmQgcHJlY2lzaW9uIG9mIHRoZSBfRGVjaW1hbDEyOCB0eXBlOworCSAyICBldmFsdWF0ZSBhbGwgb3BlcmF0aW9ucyBhbmQgY29uc3RhbnRzIHRvIHRoZSByYW5nZSBhbmQKKwkgICAgcHJlY2lzaW9uIG9mIHRoZSBfRGVjaW1hbDEyOCB0eXBlLiAgKi8KKworI3VuZGVmIERFQ19FVkFMX01FVEhPRAorI2RlZmluZSBERUNfRVZBTF9NRVRIT0QJX19ERUNfRVZBTF9NRVRIT0RfXworCisjZW5kaWYgLyogX19TVERDX1dBTlRfREVDX0ZQX18gKi8KKworI2VuZGlmIC8qIF9GTE9BVF9IX19fICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9mbWE0aW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9mbWE0aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzMGJmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2ZtYTRpbnRyaW4uaApAQCAtMCwwICsxLDIzNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxmbWE0aW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfRk1BNElOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9GTUE0SU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX0ZNQTRfXworIyBlcnJvciAiRk1BNCBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTRBLCBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyIGZpbGVzLiAgKi8KKyNpbmNsdWRlIDxhbW1pbnRyaW4uaD4KKworLyogMTI4YiBGbG9hdGluZyBwb2ludCBtdWx0aXBseS9hZGQgdHlwZSBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIChfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQorCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAtKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIC0oX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXN1Yl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJfc2QgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc2QgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgLShfX3YyZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ubWFjY19wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQiwgX19tMTI4IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzICgtKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tYWNjX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAoX192MmRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbm1hY2Nfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzcyAoLShfX3Y0c2YpX19BLCAoX192NHNmKV9fQiwgKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ubWFjY19zZCAoX19tMTI4ZCBfX0EsIF9fbTEyOGQgX19CLCBfX20xMjhkIF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZCAoLShfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkcHMgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAtKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3NzIChfX20xMjggX19BLCBfX20xMjggX19CLCBfX20xMjggX19DKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3MgKC0oX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIC0oX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX25tc3ViX3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkICgtKF9fdjJkZilfX0EsIChfX3YyZGYpX19CLCAtKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRzdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAoX192NHNmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hZGRzdWJfcGQgKF9fbTEyOGQgX19BLCBfX20xMjhkIF9fQiwgX19tMTI4ZCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQgKChfX3YyZGYpX19BLCAoX192MmRmKV9fQiwgKF9fdjJkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21zdWJhZGRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IsIF9fbTEyOCBfX0MpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CLCAtKF9fdjRzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tc3ViYWRkX3BkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IsIF9fbTEyOGQgX19DKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkICgoX192MmRmKV9fQSwgKF9fdjJkZilfX0IsIC0oX192MmRmKV9fQyk7Cit9CisKKy8qIDI1NmIgRmxvYXRpbmcgcG9pbnQgbXVsdGlwbHkvYWRkIHR5cGUgaW5zdHJ1Y3Rpb25zLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFjY19wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgoX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbWFjY19wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAoX192NGRmKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20yNTYgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXN1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKKworeworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgLShfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAtKF9fdjRkZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X25tYWNjX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYgKC0oX192OHNmKV9fQSwgKF9fdjhzZilfX0IsIChfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbm1hY2NfcGQgKF9fbTI1NmQgX19BLCBfX20yNTZkIF9fQiwgX19tMjU2ZCBfX0MpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYgKC0oX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ubXN1Yl9wcyAoX19tMjU2IF9fQSwgX19tMjU2IF9fQiwgX19tMjU2IF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2ICgtKF9fdjhzZilfX0EsIChfX3Y4c2YpX19CLCAtKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9ubXN1Yl9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1NiAoLShfX3Y0ZGYpX19BLCAoX192NGRmKV9fQiwgLShfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWRkc3ViX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgKF9fdjhzZilfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tYWRkc3ViX3BkIChfX20yNTZkIF9fQSwgX19tMjU2ZCBfX0IsIF9fbTI1NmQgX19DKQoreworICByZXR1cm4gKF9fbTI1NmQpIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2ICgoX192NGRmKV9fQSwgKF9fdjRkZilfX0IsIChfX3Y0ZGYpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9tc3ViYWRkX3BzIChfX20yNTYgX19BLCBfX20yNTYgX19CLCBfX20yNTYgX19DKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTYgKChfX3Y4c2YpX19BLCAoX192OHNmKV9fQiwgLShfX3Y4c2YpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfbXN1YmFkZF9wZCAoX19tMjU2ZCBfX0EsIF9fbTI1NmQgX19CLCBfX20yNTZkIF9fQykKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1NiAoKF9fdjRkZilfX0EsIChfX3Y0ZGYpX19CLCAtKF9fdjRkZilfX0MpOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9pYTMyaW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9pYTMyaW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjMjBhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2lhMzJpbnRyaW4uaApAQCAtMCwwICsxLDIzNCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxpYTMyaW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogMzJiaXQgYnNmICovCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYnNmZCAoaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9jdHogKF9fWCk7Cit9CisKKy8qIDMyYml0IGJzciAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzcmQgKGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9ic3JzaSAoX19YKTsKK30KKworLyogMzJiaXQgYnN3YXAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ic3dhcGQgKGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMiAoX19YKTsKK30KKworI2lmZGVmIF9fU1NFNF8yX18KKy8qIDMyYml0IGFjY3VtdWxhdGUgQ1JDMzIgKHBvbHlub21pYWwgMHgxMUVEQzZGNDEpIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19jcmMzMmIgKHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGNoYXIgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJxaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fY3JjMzJ3ICh1bnNpZ25lZCBpbnQgX19DLCB1bnNpZ25lZCBzaG9ydCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMmhpIChfX0MsIF9fVik7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19jcmMzMmQgKHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGludCBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMnNpIChfX0MsIF9fVik7Cit9CisjZW5kaWYgLyogU1NFNC4yICovCisKKy8qIDMyYml0IHBvcGNudCAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3BvcGNudGQgKHVuc2lnbmVkIGludCBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQgKF9fWCk7Cit9CisKKy8qIHJkcG1jICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcmRwbWMgKGludCBfX1MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHBtYyAoX19TKTsKK30KKworLyogcmR0c2MgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yZHRzYyAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkdHNjICgpOworfQorCisvKiByZHRzY3AgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yZHRzY3AgKHVuc2lnbmVkIGludCAqX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmR0c2NwIChfX0EpOworfQorCisvKiA4Yml0IHJvbCAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb2xiICh1bnNpZ25lZCBjaGFyIF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JvbHFpIChfX1gsIF9fQyk7Cit9CisKKy8qIDE2Yml0IHJvbCAqLworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9sdyAodW5zaWduZWQgc2hvcnQgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcm9saGkgKF9fWCwgX19DKTsKK30KKworLyogMzJiaXQgcm9sICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9sZCAodW5zaWduZWQgaW50IF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX1ggPDwgX19DKSB8IChfX1ggPj4gKDMyIC0gX19DKSk7Cit9CisKKy8qIDhiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgY2hhcgorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JvcmIgKHVuc2lnbmVkIGNoYXIgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcm9ycWkgKF9fWCwgX19DKTsKK30KKworLyogMTZiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb3J3ICh1bnNpZ25lZCBzaG9ydCBfX1gsIGludCBfX0MpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yb3JoaSAoX19YLCBfX0MpOworfQorCisvKiAzMmJpdCByb3IgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb3JkICh1bnNpZ25lZCBpbnQgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gKF9fWCA+PiBfX0MpIHwgKF9fWCA8PCAoMzIgLSBfX0MpKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIDY0Yml0IGJzZiAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzZnEgKGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fY3R6bGwgKF9fWCk7Cit9CisKKy8qIDY0Yml0IGJzciAqLworZXh0ZXJuIF9faW5saW5lIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JzcnEgKGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9ic3JkaSAoX19YKTsKK30KKworLyogNjRiaXQgYnN3YXAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19ic3dhcHEgKGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXA2NCAoX19YKTsKK30KKworI2lmZGVmIF9fU1NFNF8yX18KKy8qIDY0Yml0IGFjY3VtdWxhdGUgQ1JDMzIgKHBvbHlub21pYWwgMHgxMUVEQzZGNDEpIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19jcmMzMnEgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX0MsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jcmMzMmRpIChfX0MsIF9fVik7Cit9CisjZW5kaWYKKworLyogNjRiaXQgcG9wY250ICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcG9wY250cSAodW5zaWduZWQgbG9uZyBsb25nIF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGxsIChfX1gpOworfQorCisvKiA2NGJpdCByb2wgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19yb2xxICh1bnNpZ25lZCBsb25nIGxvbmcgX19YLCBpbnQgX19DKQoreworICByZXR1cm4gKF9fWCA8PCBfX0MpIHwgKF9fWCA+PiAoNjQgLSBfX0MpKTsKK30KKworLyogNjRiaXQgcm9yICovCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fcm9ycSAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX1ggPj4gX19DKSB8IChfX1ggPDwgKDY0IC0gX19DKSk7Cit9CisKKyNkZWZpbmUgX2Jzd2FwNjQoYSkJCV9fYnN3YXBxKGEpCisjZGVmaW5lIF9wb3BjbnQ2NChhKQkJX19wb3BjbnRxKGEpCisjZGVmaW5lIF9scm90bChhLGIpCQlfX3JvbHEoKGEpLCAoYikpCisjZGVmaW5lIF9scm90cihhLGIpCQlfX3JvcnEoKGEpLCAoYikpCisjZWxzZQorI2RlZmluZSBfbHJvdGwoYSxiKQkJX19yb2xkKChhKSwgKGIpKQorI2RlZmluZSBfbHJvdHIoYSxiKQkJX19yb3JkKChhKSwgKGIpKQorI2VuZGlmCisKKyNkZWZpbmUgX2JpdF9zY2FuX2ZvcndhcmQoYSkJX19ic2ZkKGEpCisjZGVmaW5lIF9iaXRfc2Nhbl9yZXZlcnNlKGEpCV9fYnNyZChhKQorI2RlZmluZSBfYnN3YXAoYSkJCV9fYnN3YXBkKGEpCisjZGVmaW5lIF9wb3BjbnQzMihhKQkJX19wb3BjbnRkKGEpCisjZGVmaW5lIF9yZHBtYyhhKQkJX19yZHBtYyhhKQorI2RlZmluZSBfcmR0c2MoKQkJX19yZHRzYygpCisjZGVmaW5lIF9yZHRzY3AoYSkJCV9fcmR0c2NwKGEpCisjZGVmaW5lIF9yb3R3bChhLGIpCQlfX3JvbHcoKGEpLCAoYikpCisjZGVmaW5lIF9yb3R3cihhLGIpCQlfX3JvcncoKGEpLCAoYikpCisjZGVmaW5lIF9yb3RsKGEsYikJCV9fcm9sZCgoYSksIChiKSkKKyNkZWZpbmUgX3JvdHIoYSxiKQkJX19yb3JkKChhKSwgKGIpKQpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvaW1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9pbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWExYTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvaW1taW50cmluLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfSU1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX0lNTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZmRlZiBfX01NWF9fCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19TU0VfXworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRTJfXworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRTNfXworI2luY2x1ZGUgPHBtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTU0UzX18KKyNpbmNsdWRlIDx0bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TU0U0XzJfXykgfHwgZGVmaW5lZCAoX19TU0U0XzFfXykKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19BRVNfXykgfHwgZGVmaW5lZCAoX19QQ0xNVUxfXykKKyNpbmNsdWRlIDx3bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19BVlhfXworI2luY2x1ZGUgPGF2eGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1JEUk5EX18KK2V4dGVybiBfX2lubGluZSBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JkcmFuZDE2X3N0ZXAgKHVuc2lnbmVkIHNob3J0ICpfX1ApCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZHJhbmQxNl9zdGVwIChfX1ApOworfQorCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHJhbmQzMl9zdGVwICh1bnNpZ25lZCBpbnQgKl9fUCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkcmFuZDMyX3N0ZXAgKF9fUCk7Cit9CisjZW5kaWYgLyogX19SRFJORF9fICovCisKKyNpZmRlZiAgX194ODZfNjRfXworI2lmZGVmIF9fRlNHU0JBU0VfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmVhZGZzYmFzZV91MzIgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGZzYmFzZTMyICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZWFkZnNiYXNlX3U2NCAodm9pZCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlNjQgKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQKK19fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX3JlYWRnc2Jhc2VfdTMyICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcmRnc2Jhc2UzMiAoKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfcmVhZGdzYmFzZV91NjQgKHZvaWQpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTY0ICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVmc2Jhc2VfdTMyICh1bnNpZ25lZCBpbnQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmZzYmFzZTMyIChfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVmc2Jhc2VfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmZzYmFzZTY0IChfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVnc2Jhc2VfdTMyICh1bnNpZ25lZCBpbnQgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmdzYmFzZTMyIChfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZAorX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfd3JpdGVnc2Jhc2VfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19CKQoreworICBfX2J1aWx0aW5faWEzMl93cmdzYmFzZTY0IChfX0IpOworfQorI2VuZGlmIC8qIF9fRlNHU0JBU0VfXyAqLworCisjaWZkZWYgX19SRFJORF9fCitleHRlcm4gX19pbmxpbmUgaW50CitfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19yZHJhbmQ2NF9zdGVwICh1bnNpZ25lZCBsb25nIGxvbmcgKl9fUCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3JkcmFuZDY0X3N0ZXAgKF9fUCk7Cit9CisjZW5kaWYgLyogX19SRFJORF9fICovCisjZW5kaWYgLyogX194ODZfNjRfXyAgKi8KKworI2lmZGVmIF9fRjE2Q19fCitleHRlcm4gX19pbmxpbmUgZmxvYXQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfY3Z0c2hfc3MgKHVuc2lnbmVkIHNob3J0IF9fUykKK3sKKyAgX192OGhpIF9fSCA9IF9fZXh0ZW5zaW9uX18gKF9fdjhoaSl7IF9fUywgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBfX3Y0c2YgX19BID0gX19idWlsdGluX2lhMzJfdmN2dHBoMnBzIChfX0gpOworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNmIChfX0EsIDApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBoX3BzIChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwcyAoKF9fdjhoaSkgX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9jdnRwaF9wcyAoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAoX19tMjU2KSBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMyNTYgKChfX3Y4aGkpIF9fQSk7Cit9CisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19jdnRzc19zaCAoZmxvYXQgX19GLCBjb25zdCBpbnQgX19JKQoreworICBfX3Y0c2YgX19BID0gIF9fZXh0ZW5zaW9uX18gKF9fdjRzZil7IF9fRiwgMCwgMCwgMCB9OworICBfX3Y4aGkgX19IID0gX19idWlsdGluX2lhMzJfdmN2dHBzMnBoIChfX0EsIF9fSSk7CisgIHJldHVybiAodW5zaWduZWQgc2hvcnQpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjhoaSAoX19ILCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHNfcGggKF9fbTEyOCBfX0EsIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmN2dHBzMnBoICgoX192NHNmKSBfX0EsIF9fSSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X2N2dHBzX3BoIChfX20yNTYgX19BLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDI1NiAoKF9fdjhzZikgX19BLCBfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX2N2dHNzX3NoKF9fRiwgX19JKQkJCQkJCVwKKyAgKF9fZXh0ZW5zaW9uX18gCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICAgX192NHNmIF9fQSA9ICBfX2V4dGVuc2lvbl9fIChfX3Y0c2YpeyBfX0YsIDAsIDAsIDAgfTsJCVwKKyAgICAgIF9fdjhoaSBfX0ggPSBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGggKF9fQSwgX19JKTsJCQlcCisgICAgICAodW5zaWduZWQgc2hvcnQpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjhoaSAoX19ILCAwKTsJCVwKKyAgICB9KSkKKworI2RlZmluZSBfbW1fY3Z0cHNfcGgoQSwgSSkgXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaCAoKF9fdjRzZikoX19tMTI4KSBBLCAoaW50KSAoSSkpKQorCisjZGVmaW5lIF9tbTI1Nl9jdnRwc19waChBLCBJKSBcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2ICgoX192OHNmKShfX20yNTYpIEEsIChpbnQpIChJKSkpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fRjE2Q19fICovCisKKyNlbmRpZiAvKiBfSU1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2lzbzY0Ni5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvaXNvNjQ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmZjlkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2lzbzY0Ni5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy45ICBBbHRlcm5hdGl2ZSBzcGVsbGluZ3MgIDxpc282NDYuaD4KKyAqLworCisjaWZuZGVmIF9JU082NDZfSAorI2RlZmluZSBfSVNPNjQ2X0gKKworI2lmbmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBhbmQJJiYKKyNkZWZpbmUgYW5kX2VxCSY9CisjZGVmaW5lIGJpdGFuZAkmCisjZGVmaW5lIGJpdG9yCXwKKyNkZWZpbmUgY29tcGwJfgorI2RlZmluZSBub3QJIQorI2RlZmluZSBub3RfZXEJIT0KKyNkZWZpbmUgb3IJfHwKKyNkZWZpbmUgb3JfZXEJfD0KKyNkZWZpbmUgeG9yCV4KKyNkZWZpbmUgeG9yX2VxCV49CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9sd3BpbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL2x3cGludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NGIwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9sd3BpbnRyaW4uaApAQCAtMCwwICsxLDEwMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDxsd3BpbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9MV1BJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfTFdQSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX0xXUF9fCisjIGVycm9yICJMV1AgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2xsd3BjYiAodm9pZCAqcGNiQWRkcmVzcykKK3sKKyAgX19idWlsdGluX2lhMzJfbGx3cGNiIChwY2JBZGRyZXNzKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgKiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fc2x3cGNiICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfc2x3cGNiICgpOworfQorCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fbHdwdmFsMzIgKHVuc2lnbmVkIGludCBkYXRhMiwgdW5zaWduZWQgaW50IGRhdGExLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgIF9fYnVpbHRpbl9pYTMyX2x3cHZhbDMyIChkYXRhMiwgZGF0YTEsIGZsYWdzKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX19sd3B2YWw2NCAodW5zaWduZWQgbG9uZyBsb25nIGRhdGEyLCB1bnNpZ25lZCBpbnQgZGF0YTEsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgX19idWlsdGluX2lhMzJfbHdwdmFsNjQgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX2x3cHZhbDMyKEQyLCBEMSwgRikgXAorICAoX19idWlsdGluX2lhMzJfbHdwdmFsMzIgKCh1bnNpZ25lZCBpbnQpIChEMiksICh1bnNpZ25lZCBpbnQpIChEMSksIFwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoRikpKQorI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX19sd3B2YWw2NChEMiwgRDEsIEYpIFwKKyAgKF9fYnVpbHRpbl9pYTMyX2x3cHZhbDY0ICgodW5zaWduZWQgbG9uZyBsb25nKSAoRDIpLCAodW5zaWduZWQgaW50KSAoRDEpLCBcCisJCQkgICAgKHVuc2lnbmVkIGludCkgKEYpKSkKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x3cGluczMyICh1bnNpZ25lZCBpbnQgZGF0YTIsIHVuc2lnbmVkIGludCBkYXRhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbHdwaW5zMzIgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorCisjaWZkZWYgX194ODZfNjRfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2x3cGluczY0ICh1bnNpZ25lZCBsb25nIGxvbmcgZGF0YTIsIHVuc2lnbmVkIGludCBkYXRhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfbHdwaW5zNjQgKGRhdGEyLCBkYXRhMSwgZmxhZ3MpOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfX2x3cGluczMyKEQyLCBEMSwgRikgXAorICAoX19idWlsdGluX2lhMzJfbHdwaW5zMzIgKCh1bnNpZ25lZCBpbnQpIChEMiksICh1bnNpZ25lZCBpbnQpIChEMSksIFwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoRikpKQorI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX19sd3BpbnM2NChEMiwgRDEsIEYpIFwKKyAgKF9fYnVpbHRpbl9pYTMyX2x3cGluczY0ICgodW5zaWduZWQgbG9uZyBsb25nKSAoRDIpLCAodW5zaWduZWQgaW50KSAoRDEpLCBcCisJCQkgICAgKHVuc2lnbmVkIGludCkgKEYpKSkKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xXUF9fICovCisKKyNlbmRpZiAvKiBfTFdQSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL21tM2Rub3cuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL21tM2Rub3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA3MzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvbW0zZG5vdy5oCkBAIC0wLDAgKzEsMjE1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIG1tM2Rub3cuaCAob2Ygc3VwcG9zZWRseSBBTUQgb3JpZ2luKSBpbmNsdWRlZCB3aXRoCisgICBNU1ZDIDcuMS4gICovCisKKyNpZm5kZWYgX01NM0ROT1dfSF9JTkNMVURFRAorI2RlZmluZSBfTU0zRE5PV19IX0lOQ0xVREVECisKKyNpZmRlZiBfXzNkTk9XX18KKworI2luY2x1ZGUgPG1taW50cmluLmg+CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fZmVtbXMgKHZvaWQpCit7CisgIF9fYnVpbHRpbl9pYTMyX2ZlbW1zKCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bhdmd1c2IgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bhdmd1c2IgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmMmlkIChfX202NCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGYyaWQgKChfX3Yyc2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZhY2MgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmYWNjICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZmFkZCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZhZGQgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmY21wZXEgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZXEgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmY21wZ2UgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZ2UgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmY21wZ3QgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmY21wZ3QgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmbWF4IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZm1heCAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZtaW4gKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmbWluICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZm11bCAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZtdWwgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcmNwIChfX202NCBfX0EpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZyY3AgKChfX3Yyc2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZyY3BpdDEgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmcmNwaXQxICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnJjcGl0MiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZyY3BpdDIgKChfX3Yyc2YpX19BLCAoX192MnNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcnNxcnQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJzcXJ0ICgoX192MnNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmcnNxaXQxIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnJzcWl0MSAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGZzdWIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bmc3ViICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnN1YnIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bmc3ViciAoKF9fdjJzZilfX0EsIChfX3Yyc2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGkyZmQgKF9fbTY0IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9waTJmZCAoKF9fdjJzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbXVsaHJ3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wbXVsaHJ3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3ByZWZldGNoICh2b2lkICpfX1ApCit7CisgIF9fYnVpbHRpbl9wcmVmZXRjaCAoX19QLCAwLCAzIC8qIF9NTV9ISU5UX1QwICovKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wcmVmZXRjaHcgKHZvaWQgKl9fUCkKK3sKKyAgX19idWlsdGluX3ByZWZldGNoIChfX1AsIDEsIDMgLyogX01NX0hJTlRfVDAgKi8pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9mcm9tX2Zsb2F0IChmbG9hdCBfX0EpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX202NCkoX192MnNmKXsgX19BLCAwLjBmIH07Cit9CisKK2V4dGVybiBfX2lubGluZSBmbG9hdCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3RvX2Zsb2F0IChfX202NCBfX0EpCit7CisgIHVuaW9uIHsgX192MnNmIHY7IGZsb2F0IGFbMl07IH0gX190bXA7CisgIF9fdG1wLnYgPSAoX192MnNmKV9fQTsKKyAgcmV0dXJuIF9fdG1wLmFbMF07Cit9CisKKyNpZmRlZiBfXzNkTk9XX0FfXworCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZjJpdyAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BmMml3ICgoX192MnNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BmbmFjYyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpX19idWlsdGluX2lhMzJfcGZuYWNjICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wZnBuYWNjIChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NClfX2J1aWx0aW5faWEzMl9wZnBuYWNjICgoX192MnNmKV9fQSwgKF9fdjJzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9waTJmdyAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3BpMmZ3ICgoX192MnNpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Bzd2FwZCAoX19tNjQgX19BKQoreworICByZXR1cm4gKF9fbTY0KV9fYnVpbHRpbl9pYTMyX3Bzd2FwZHNmICgoX192MnNmKV9fQSk7Cit9CisKKyNlbmRpZiAvKiBfXzNkTk9XX0FfXyAqLworI2VuZGlmIC8qIF9fM2ROT1dfXyAqLworCisjZW5kaWYgLyogX01NM0ROT1dfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvbW1fbWFsbG9jLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9tbV9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTlmMmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvbW1fbWFsbG9jLmgKQEAgLTAsMCArMSw1NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9NTV9NQUxMT0NfSF9JTkNMVURFRAorI2RlZmluZSBfTU1fTUFMTE9DX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBXZSBjYW4ndCBkZXBlbmQgb24gPHN0ZGxpYi5oPiBzaW5jZSB0aGUgcHJvdG90eXBlIG9mIHBvc2l4X21lbWFsaWduCisgICBtYXkgbm90IGJlIHZpc2libGUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIGludCBwb3NpeF9tZW1hbGlnbiAodm9pZCAqKiwgc2l6ZV90LCBzaXplX3QpOworI2Vsc2UKK2V4dGVybiAiQyIgaW50IHBvc2l4X21lbWFsaWduICh2b2lkICoqLCBzaXplX3QsIHNpemVfdCkgdGhyb3cgKCk7CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lIHZvaWQgKgorX21tX21hbGxvYyAoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQpCit7CisgIHZvaWQgKnB0cjsKKyAgaWYgKGFsaWdubWVudCA9PSAxKQorICAgIHJldHVybiBtYWxsb2MgKHNpemUpOworICBpZiAoYWxpZ25tZW50ID09IDIgfHwgKHNpemVvZiAodm9pZCAqKSA9PSA4ICYmIGFsaWdubWVudCA9PSA0KSkKKyAgICBhbGlnbm1lbnQgPSBzaXplb2YgKHZvaWQgKik7CisgIGlmIChwb3NpeF9tZW1hbGlnbiAoJnB0ciwgYWxpZ25tZW50LCBzaXplKSA9PSAwKQorICAgIHJldHVybiBwdHI7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK19tbV9mcmVlICh2b2lkICogcHRyKQoreworICBmcmVlIChwdHIpOworfQorCisjZW5kaWYgLyogX01NX01BTExPQ19IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9tbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvbW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTdlMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvbW1pbnRyaW4uaApAQCAtMCwwICsxLDkyMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gOS4wLiAgKi8KKworI2lmbmRlZiBfTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fTU1YX18KKyMgZXJyb3IgIk1NWCBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorLyogVGhlIEludGVsIEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdGhhdCB3ZSBtdXN0IGFsbG93IGFsaWFzaW5nIHdpdGggb3RoZXIKKyAgIHZlY3RvciB0eXBlcywgYW5kIHRoZWlyIHNjYWxhciBjb21wb25lbnRzLiAgKi8KK3R5cGVkZWYgaW50IF9fbTY0IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpLCBfX21heV9hbGlhc19fKSk7CisKKy8qIEludGVybmFsIGRhdGEgdHlwZXMgZm9yIGltcGxlbWVudGluZyB0aGUgaW50cmluc2ljcy4gICovCit0eXBlZGVmIGludCBfX3Yyc2kgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoOCkpKTsKK3R5cGVkZWYgc2hvcnQgX192NGhpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpKSk7Cit0eXBlZGVmIGNoYXIgX192OHFpIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpKSk7Cit0eXBlZGVmIGxvbmcgbG9uZyBfX3YxZGkgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoOCkpKTsKK3R5cGVkZWYgZmxvYXQgX192MnNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpKSk7CisKKy8qIEVtcHR5IHRoZSBtdWx0aW1lZGlhIHN0YXRlLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2VtcHR5ICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9lbW1zICgpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX2VtcHR5ICh2b2lkKQoreworICBfbW1fZW1wdHkgKCk7Cit9CisKKy8qIENvbnZlcnQgSSB0byBhIF9fbTY0IG9iamVjdC4gIFRoZSBpbnRlZ2VyIGlzIHplcm8tZXh0ZW5kZWQgdG8gNjQtYml0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpMzJfc2k2NCAoaW50IF9faSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjJzaSAoX19pLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0ICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX2Zyb21faW50IChpbnQgX19pKQoreworICByZXR1cm4gX21tX2N2dHNpMzJfc2k2NCAoX19pKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KKy8qIENvbnZlcnQgSSB0byBhIF9fbTY0IG9iamVjdC4gICovCisKKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fZnJvbV9pbnQ2NCAobG9uZyBsb25nIF9faSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjRfbTY0IChsb25nIGxvbmcgX19pKQoreworICByZXR1cm4gKF9fbTY0KSBfX2k7Cit9CisKKy8qIE1pY3Jvc29mdCBpbnRyaW5zaWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0ICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTY0eF9zaTY0IChsb25nIGxvbmcgX19pKQoreworICByZXR1cm4gKF9fbTY0KSBfX2k7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCAgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BpNjR4IChsb25nIGxvbmcgX19pKQoreworICByZXR1cm4gKF9fbTY0KSBfX2k7Cit9CisjZW5kaWYKKworLyogQ29udmVydCB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgX19tNjQgb2JqZWN0IGludG8gYW4gaW50ZWdlci4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjRfc2kzMiAoX19tNjQgX19pKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92MnNpICgoX192MnNpKV9faSwgMCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV90b19pbnQgKF9fbTY0IF9faSkKK3sKKyAgcmV0dXJuIF9tbV9jdnRzaTY0X3NpMzIgKF9faSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBDb252ZXJ0IHRoZSBfX202NCBvYmplY3QgdG8gYSA2NGJpdCBpbnRlZ2VyLiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV90b19pbnQ2NCAoX19tNjQgX19pKQoreworICByZXR1cm4gKGxvbmcgbG9uZylfX2k7Cit9CisKK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0bTY0X3NpNjQgKF9fbTY0IF9faSkKK3sKKyAgcmV0dXJuIChsb25nIGxvbmcpX19pOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9zaTY0eCAoX19tNjQgX19pKQoreworICByZXR1cm4gKGxvbmcgbG9uZylfX2k7Cit9CisjZW5kaWYKKworLyogUGFjayB0aGUgZm91ciAxNi1iaXQgdmFsdWVzIGZyb20gTTEgaW50byB0aGUgbG93ZXIgZm91ciA4LWJpdCB2YWx1ZXMgb2YKKyAgIHRoZSByZXN1bHQsIGFuZCB0aGUgZm91ciAxNi1iaXQgdmFsdWVzIGZyb20gTTIgaW50byB0aGUgdXBwZXIgZm91ciA4LWJpdAorICAgdmFsdWVzIG9mIHRoZSByZXN1bHQsIGFsbCB3aXRoIHNpZ25lZCBzYXR1cmF0aW9uLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYWNrc19waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWNrc3N3YiAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWNrc3N3YiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9wYWNrc19waTE2IChfX20xLCBfX20yKTsKK30KKworLyogUGFjayB0aGUgdHdvIDMyLWJpdCB2YWx1ZXMgZnJvbSBNMSBpbiB0byB0aGUgbG93ZXIgdHdvIDE2LWJpdCB2YWx1ZXMgb2YKKyAgIHRoZSByZXN1bHQsIGFuZCB0aGUgdHdvIDMyLWJpdCB2YWx1ZXMgZnJvbSBNMiBpbnRvIHRoZSB1cHBlciB0d28gMTYtYml0CisgICB2YWx1ZXMgb2YgdGhlIHJlc3VsdCwgYWxsIHdpdGggc2lnbmVkIHNhdHVyYXRpb24uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2tzX3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3ICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhY2tzc2R3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3BhY2tzX3BpMzIgKF9fbTEsIF9fbTIpOworfQorCisvKiBQYWNrIHRoZSBmb3VyIDE2LWJpdCB2YWx1ZXMgZnJvbSBNMSBpbnRvIHRoZSBsb3dlciBmb3VyIDgtYml0IHZhbHVlcyBvZgorICAgdGhlIHJlc3VsdCwgYW5kIHRoZSBmb3VyIDE2LWJpdCB2YWx1ZXMgZnJvbSBNMiBpbnRvIHRoZSB1cHBlciBmb3VyIDgtYml0CisgICB2YWx1ZXMgb2YgdGhlIHJlc3VsdCwgYWxsIHdpdGggdW5zaWduZWQgc2F0dXJhdGlvbi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGFja3NfcHUxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFja3Vzd2IgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFja3Vzd2IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fcGFja3NfcHUxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIEludGVybGVhdmUgdGhlIGZvdXIgOC1iaXQgdmFsdWVzIGZyb20gdGhlIGhpZ2ggaGFsZiBvZiBNMSB3aXRoIHRoZSBmb3VyCisgICA4LWJpdCB2YWx1ZXMgZnJvbSB0aGUgaGlnaCBoYWxmIG9mIE0yLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2hidyAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wdW5wY2toYncgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fdW5wYWNraGlfcGk4IChfX20xLCBfX20yKTsKK30KKworLyogSW50ZXJsZWF2ZSB0aGUgdHdvIDE2LWJpdCB2YWx1ZXMgZnJvbSB0aGUgaGlnaCBoYWxmIG9mIE0xIHdpdGggdGhlIHR3bworICAgMTYtYml0IHZhbHVlcyBmcm9tIHRoZSBoaWdoIGhhbGYgb2YgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZCAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wdW5wY2tod2QgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fdW5wYWNraGlfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIEludGVybGVhdmUgdGhlIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBoaWdoIGhhbGYgb2YgTTEgd2l0aCB0aGUgMzItYml0CisgICB2YWx1ZSBmcm9tIHRoZSBoaWdoIGhhbGYgb2YgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2hpX3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2hkcSAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wdW5wY2toZHEgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fdW5wYWNraGlfcGkzMiAoX19tMSwgX19tMik7Cit9CisKKy8qIEludGVybGVhdmUgdGhlIGZvdXIgOC1iaXQgdmFsdWVzIGZyb20gdGhlIGxvdyBoYWxmIG9mIE0xIHdpdGggdGhlIGZvdXIKKyAgIDgtYml0IHZhbHVlcyBmcm9tIHRoZSBsb3cgaGFsZiBvZiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2tsYncgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHVucGNrbGJ3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3VucGFja2xvX3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIEludGVybGVhdmUgdGhlIHR3byAxNi1iaXQgdmFsdWVzIGZyb20gdGhlIGxvdyBoYWxmIG9mIE0xIHdpdGggdGhlIHR3bworICAgMTYtYml0IHZhbHVlcyBmcm9tIHRoZSBsb3cgaGFsZiBvZiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdW5wYWNrbG9fcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHVucGNrbHdkICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B1bnBja2x3ZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19waTE2IChfX20xLCBfX20yKTsKK30KKworLyogSW50ZXJsZWF2ZSB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGxvdyBoYWxmIG9mIE0xIHdpdGggdGhlIDMyLWJpdAorICAgdmFsdWUgZnJvbSB0aGUgbG93IGhhbGYgb2YgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xkcSAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wdW5wY2tsZHEgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fcGkzMiAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgOC1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGRiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGRiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZF9waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hZGRfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgMzItYml0IHZhbHVlcyBpbiBNMSB0byB0aGUgMzItYml0IHZhbHVlcyBpbiBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkX3BpMzIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGRkICgoX192MnNpKV9fbTEsIChfX3Yyc2kpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGRkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZF9waTMyIChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0yLiAgKi8KKyNpZmRlZiBfX1NTRTJfXworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9zaTY0IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkcSAoKF9fdjFkaSlfX20xLCAoX192MWRpKV9fbTIpOworfQorI2VuZGlmCisKKy8qIEFkZCB0aGUgOC1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTIgdXNpbmcgc2lnbmVkCisgICBzYXR1cmF0ZWQgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhZGRzYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkc2IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkc19waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTIgdXNpbmcgc2lnbmVkCisgICBzYXR1cmF0ZWQgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkc3cgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFkZHN3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZHNfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIEFkZCB0aGUgOC1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTIgdXNpbmcgdW5zaWduZWQKKyAgIHNhdHVyYXRlZCBhcml0aG1ldGljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzX3B1OCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFkZHVzYiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYWRkdXNiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2FkZHNfcHU4IChfX20xLCBfX20yKTsKK30KKworLyogQWRkIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0xIHRvIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0yIHVzaW5nIHVuc2lnbmVkCisgICBzYXR1cmF0ZWQgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWRkc19wdTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWRkdXN3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BhZGR1c3cgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fYWRkc19wdTE2IChfX20xLCBfX20yKTsKK30KKworLyogU3VidHJhY3QgdGhlIDgtYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9waTggKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1Yl9waTggKF9fbTEsIF9fbTIpOworfQorCisvKiBTdWJ0cmFjdCB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0xLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YncgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YncgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3ViX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBTdWJ0cmFjdCB0aGUgMzItYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSAzMi1iaXQgdmFsdWVzIGluIE0xLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YmQgKChfX3Yyc2kpX19tMSwgKF9fdjJzaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YmQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3ViX3BpMzIgKF9fbTEsIF9fbTIpOworfQorCisvKiBBZGQgdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTEgdG8gdGhlIDY0LWJpdCB2YWx1ZXMgaW4gTTIuICAqLworI2lmZGVmIF9fU1NFMl9fCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3ViX3NpNjQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzdWJxICgoX192MWRpKV9fbTEsIChfX3YxZGkpX19tMik7Cit9CisjZW5kaWYKKworLyogU3VidHJhY3QgdGhlIDgtYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTEgdXNpbmcgc2lnbmVkCisgICBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3Vic2IgKChfX3Y4cWkpX19tMSwgKF9fdjhxaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YnNiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1YnNfcGk4IChfX20xLCBfX20yKTsKK30KKworLyogU3VidHJhY3QgdGhlIDE2LWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMSB1c2luZworICAgc2lnbmVkIHNhdHVyYXRpbmcgYXJpdGhtZXRpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3Vic19waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3Vic3cgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHN1YnN3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1YnNfcGkxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIFN1YnRyYWN0IHRoZSA4LWJpdCB2YWx1ZXMgaW4gTTIgZnJvbSB0aGUgOC1iaXQgdmFsdWVzIGluIE0xIHVzaW5nCisgICB1bnNpZ25lZCBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfcHU4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3VidXNiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzdWJ1c2IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fc3Vic19wdTggKF9fbTEsIF9fbTIpOworfQorCisvKiBTdWJ0cmFjdCB0aGUgMTYtYml0IHZhbHVlcyBpbiBNMiBmcm9tIHRoZSAxNi1iaXQgdmFsdWVzIGluIE0xIHVzaW5nCisgICB1bnNpZ25lZCBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1YnNfcHUxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHN1YnVzdyAoKF9fdjRoaSlfX20xLCAoX192NGhpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3VidXN3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX3N1YnNfcHUxNiAoX19tMSwgX19tMik7Cit9CisKKy8qIE11bHRpcGx5IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNMSBieSBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTTIgcHJvZHVjaW5nCisgICBmb3VyIDMyLWJpdCBpbnRlcm1lZGlhdGUgcmVzdWx0cywgd2hpY2ggYXJlIHRoZW4gc3VtbWVkIGJ5IHBhaXJzIHRvCisgICBwcm9kdWNlIHR3byAzMi1iaXQgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFkZF9waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWFkZHdkICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtYWRkd2QgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fbWFkZF9waTE2IChfX20xLCBfX20yKTsKK30KKworLyogTXVsdGlwbHkgZm91ciBzaWduZWQgMTYtYml0IHZhbHVlcyBpbiBNMSBieSBmb3VyIHNpZ25lZCAxNi1iaXQgdmFsdWVzIGluCisgICBNMiBhbmQgcHJvZHVjZSB0aGUgaGlnaCAxNiBiaXRzIG9mIHRoZSAzMi1iaXQgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsaGlfcGkxNiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG11bGh3ICgoX192NGhpKV9fbTEsIChfX3Y0aGkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtdWxodyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9tdWxoaV9waTE2IChfX20xLCBfX20yKTsKK30KKworLyogTXVsdGlwbHkgZm91ciAxNi1iaXQgdmFsdWVzIGluIE0xIGJ5IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNMiBhbmQgcHJvZHVjZQorICAgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSByZXN1bHRzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxsb19waTE2IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbXVsbHcgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG11bGx3IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX211bGxvX3BpMTYgKF9fbTEsIF9fbTIpOworfQorCisvKiBTaGlmdCBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTSBsZWZ0IGJ5IENPVU5ULiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxfcGkxNiAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2xsdyAoKF9fdjRoaSlfX20sIChfX3Y0aGkpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzbGx3IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc2xsX3BpMTYgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX3BpMTYgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzbGx3aSAoKF9fdjRoaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2xsd2kgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc2xsaV9waTE2IChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCB0d28gMzItYml0IHZhbHVlcyBpbiBNIGxlZnQgYnkgQ09VTlQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbF9waTMyIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzbGxkICgoX192MnNpKV9fbSwgKF9fdjJzaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNsbGQgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zbGxfcGkzMiAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NsbGlfcGkzMiAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNsbGRpICgoX192MnNpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzbGxkaSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zbGxpX3BpMzIgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IHRoZSA2NC1iaXQgdmFsdWUgaW4gTSBsZWZ0IGJ5IENPVU5ULiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxfc2k2NCAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2xscSAoKF9fdjFkaSlfX20sIChfX3YxZGkpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzbGxxIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc2xsX3NpNjQgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zbGxpX3NpNjQgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzbGxxaSAoKF9fdjFkaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2xscWkgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc2xsaV9zaTY0IChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gTSByaWdodCBieSBDT1VOVDsgc2hpZnQgaW4gdGhlIHNpZ24gYml0LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFfcGkxNiAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JhdyAoKF9fdjRoaSlfX20sIChfX3Y0aGkpX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmF3IChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JhX3BpMTYgKF9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcmFpX3BpMTYgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmF3aSAoKF9fdjRoaSlfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3Jhd2kgKF9fbTY0IF9fbSwgaW50IF9fY291bnQpCit7CisgIHJldHVybiBfbW1fc3JhaV9waTE2IChfX20sIF9fY291bnQpOworfQorCisvKiBTaGlmdCB0d28gMzItYml0IHZhbHVlcyBpbiBNIHJpZ2h0IGJ5IENPVU5UOyBzaGlmdCBpbiB0aGUgc2lnbiBiaXQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYV9waTMyIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmFkICgoX192MnNpKV9fbSwgKF9fdjJzaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNyYWQgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmFfcGkzMiAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NyYWlfcGkzMiAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNyYWRpICgoX192MnNpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmFkaSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmFpX3BpMzIgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IGZvdXIgMTYtYml0IHZhbHVlcyBpbiBNIHJpZ2h0IGJ5IENPVU5UOyBzaGlmdCBpbiB6ZXJvcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsX3BpMTYgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNybHcgKChfX3Y0aGkpX19tLCAoX192NGhpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JsdyAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NybF9waTE2IChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9waTE2IChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3Jsd2kgKChfX3Y0aGkpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNybHdpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NybGlfcGkxNiAoX19tLCBfX2NvdW50KTsKK30KKworLyogU2hpZnQgdHdvIDMyLWJpdCB2YWx1ZXMgaW4gTSByaWdodCBieSBDT1VOVDsgc2hpZnQgaW4gemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybF9waTMyIChfX202NCBfX20sIF9fbTY0IF9fY291bnQpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzcmxkICgoX192MnNpKV9fbSwgKF9fdjJzaSlfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNybGQgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmxfcGkzMiAoX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NybGlfcGkzMiAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNybGRpICgoX192MnNpKV9fbSwgX19jb3VudCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzcmxkaSAoX19tNjQgX19tLCBpbnQgX19jb3VudCkKK3sKKyAgcmV0dXJuIF9tbV9zcmxpX3BpMzIgKF9fbSwgX19jb3VudCk7Cit9CisKKy8qIFNoaWZ0IHRoZSA2NC1iaXQgdmFsdWUgaW4gTSBsZWZ0IGJ5IENPVU5UOyBzaGlmdCBpbiB6ZXJvcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsX3NpNjQgKF9fbTY0IF9fbSwgX19tNjQgX19jb3VudCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcHNybHEgKChfX3YxZGkpX19tLCAoX192MWRpKV9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc3JscSAoX19tNjQgX19tLCBfX202NCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NybF9zaTY0IChfX20sIF9fY291bnQpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3JsaV9zaTY0IChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc3JscWkgKChfX3YxZGkpX19tLCBfX2NvdW50KTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcHNybHFpIChfX202NCBfX20sIGludCBfX2NvdW50KQoreworICByZXR1cm4gX21tX3NybGlfc2k2NCAoX19tLCBfX2NvdW50KTsKK30KKworLyogQml0LXdpc2UgQU5EIHRoZSA2NC1iaXQgdmFsdWVzIGluIE0xIGFuZCBNMi4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kX3NpNjQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wYW5kIChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGFuZCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hbmRfc2k2NCAoX19tMSwgX19tMik7Cit9CisKKy8qIEJpdC13aXNlIGNvbXBsZW1lbnQgdGhlIDY0LWJpdCB2YWx1ZSBpbiBNMSBhbmQgYml0LXdpc2UgQU5EIGl0IHdpdGggdGhlCisgICA2NC1iaXQgdmFsdWUgaW4gTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZG5vdF9zaTY0IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGFuZG4gKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYW5kbiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9hbmRub3Rfc2k2NCAoX19tMSwgX19tMik7Cit9CisKKy8qIEJpdC13aXNlIGluY2x1c2l2ZSBPUiB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMSBhbmQgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX29yX3NpNjQgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wb3IgKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wb3IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fb3Jfc2k2NCAoX19tMSwgX19tMik7Cit9CisKKy8qIEJpdC13aXNlIGV4Y2x1c2l2ZSBPUiB0aGUgNjQtYml0IHZhbHVlcyBpbiBNMSBhbmQgTTIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3hvcl9zaTY0IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcHhvciAoX19tMSwgX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3B4b3IgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1feG9yX3NpNjQgKF9fbTEsIF9fbTIpOworfQorCisvKiBDb21wYXJlIGVpZ2h0IDgtYml0IHZhbHVlcy4gIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgMHhGRiBpZiB0aGUKKyAgIHRlc3QgaXMgdHJ1ZSBhbmQgemVybyBpZiBmYWxzZS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfcGk4IChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wY21wZXFiICgoX192OHFpKV9fbTEsIChfX3Y4cWkpX19tMik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BjbXBlcWIgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiBfbW1fY21wZXFfcGk4IChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3BpOCAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGNtcGd0YiAoKF9fdjhxaSlfX20xLCAoX192OHFpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wY21wZ3RiIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2NtcGd0X3BpOCAoX19tMSwgX19tMik7Cit9CisKKy8qIENvbXBhcmUgZm91ciAxNi1iaXQgdmFsdWVzLiAgVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyAweEZGRkYgaWYKKyAgIHRoZSB0ZXN0IGlzIHRydWUgYW5kIHplcm8gaWYgZmFsc2UuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlcXcgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGNtcGVxdyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9jbXBlcV9waTE2IChfX20xLCBfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3BpMTYgKF9fbTY0IF9fbTEsIF9fbTY0IF9fbTIpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BjbXBndHcgKChfX3Y0aGkpX19tMSwgKF9fdjRoaSlfX20yKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGNtcGd0dyAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIF9tbV9jbXBndF9waTE2IChfX20xLCBfX20yKTsKK30KKworLyogQ29tcGFyZSB0d28gMzItYml0IHZhbHVlcy4gIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgMHhGRkZGRkZGRiBpZgorICAgdGhlIHRlc3QgaXMgdHJ1ZSBhbmQgemVybyBpZiBmYWxzZS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGNtcGVxZCAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wY21wZXFkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2NtcGVxX3BpMzIgKF9fbTEsIF9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfcGkzMiAoX19tNjQgX19tMSwgX19tNjQgX19tMikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGNtcGd0ZCAoKF9fdjJzaSlfX20xLCAoX192MnNpKV9fbTIpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wY21wZ3RkIChfX202NCBfX20xLCBfX202NCBfX20yKQoreworICByZXR1cm4gX21tX2NtcGd0X3BpMzIgKF9fbTEsIF9fbTIpOworfQorCisvKiBDcmVhdGVzIGEgNjQtYml0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHplcm9fc2k2NCAodm9pZCkKK3sKKyAgcmV0dXJuIChfX202NCkwTEw7Cit9CisKKy8qIENyZWF0ZXMgYSB2ZWN0b3Igb2YgdHdvIDMyLWJpdCB2YWx1ZXM7IEkwIGlzIGxlYXN0IHNpZ25pZmljYW50LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcGkzMiAoaW50IF9faTEsIGludCBfX2kwKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92MnNpIChfX2kwLCBfX2kxKTsKK30KKworLyogQ3JlYXRlcyBhIHZlY3RvciBvZiBmb3VyIDE2LWJpdCB2YWx1ZXM7IFcwIGlzIGxlYXN0IHNpZ25pZmljYW50LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfcGkxNiAoc2hvcnQgX193Mywgc2hvcnQgX193Miwgc2hvcnQgX193MSwgc2hvcnQgX193MCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjRoaSAoX193MCwgX193MSwgX193MiwgX193Myk7Cit9CisKKy8qIENyZWF0ZXMgYSB2ZWN0b3Igb2YgZWlnaHQgOC1iaXQgdmFsdWVzOyBCMCBpcyBsZWFzdCBzaWduaWZpY2FudC4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BpOCAoY2hhciBfX2I3LCBjaGFyIF9fYjYsIGNoYXIgX19iNSwgY2hhciBfX2I0LAorCSAgICAgY2hhciBfX2IzLCBjaGFyIF9fYjIsIGNoYXIgX19iMSwgY2hhciBfX2IwKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfaW5pdF92OHFpIChfX2IwLCBfX2IxLCBfX2IyLCBfX2IzLAorCQkJCQkgICAgICAgX19iNCwgX19iNSwgX19iNiwgX19iNyk7Cit9CisKKy8qIFNpbWlsYXIsIGJ1dCB3aXRoIHRoZSBhcmd1bWVudHMgaW4gcmV2ZXJzZSBvcmRlci4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9waTMyIChpbnQgX19pMCwgaW50IF9faTEpCit7CisgIHJldHVybiBfbW1fc2V0X3BpMzIgKF9faTEsIF9faTApOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0cl9waTE2IChzaG9ydCBfX3cwLCBzaG9ydCBfX3cxLCBzaG9ydCBfX3cyLCBzaG9ydCBfX3czKQoreworICByZXR1cm4gX21tX3NldF9waTE2IChfX3czLCBfX3cyLCBfX3cxLCBfX3cwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldHJfcGk4IChjaGFyIF9fYjAsIGNoYXIgX19iMSwgY2hhciBfX2IyLCBjaGFyIF9fYjMsCisJICAgICAgY2hhciBfX2I0LCBjaGFyIF9fYjUsIGNoYXIgX19iNiwgY2hhciBfX2I3KQoreworICByZXR1cm4gX21tX3NldF9waTggKF9fYjcsIF9fYjYsIF9fYjUsIF9fYjQsIF9fYjMsIF9fYjIsIF9fYjEsIF9fYjApOworfQorCisvKiBDcmVhdGVzIGEgdmVjdG9yIG9mIHR3byAzMi1iaXQgdmFsdWVzLCBib3RoIGVsZW1lbnRzIGNvbnRhaW5pbmcgSS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0MV9waTMyIChpbnQgX19pKQoreworICByZXR1cm4gX21tX3NldF9waTMyIChfX2ksIF9faSk7Cit9CisKKy8qIENyZWF0ZXMgYSB2ZWN0b3Igb2YgZm91ciAxNi1iaXQgdmFsdWVzLCBhbGwgZWxlbWVudHMgY29udGFpbmluZyBXLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX3BpMTYgKHNob3J0IF9fdykKK3sKKyAgcmV0dXJuIF9tbV9zZXRfcGkxNiAoX193LCBfX3csIF9fdywgX193KTsKK30KKworLyogQ3JlYXRlcyBhIHZlY3RvciBvZiBlaWdodCA4LWJpdCB2YWx1ZXMsIGFsbCBlbGVtZW50cyBjb250YWluaW5nIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldDFfcGk4IChjaGFyIF9fYikKK3sKKyAgcmV0dXJuIF9tbV9zZXRfcGk4IChfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7Cit9CisKKyNlbmRpZiAvKiBfX01NWF9fICovCisjZW5kaWYgLyogX01NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL25tbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvbm1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyZDI2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL25tbWludHJpbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiAxMC4wLiAgKi8KKworI2lmbmRlZiBfTk1NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX05NTUlOVFJJTl9IX0lOQ0xVREVECisKKyNpZm5kZWYgX19TU0U0XzJfXworIyBlcnJvciAiU1NFNC4yIGluc3RydWN0aW9uIHNldCBub3QgZW5hYmxlZCIKKyNlbHNlCisvKiBXZSBqdXN0IGluY2x1ZGUgU1NFNC4xIGhlYWRlciBmaWxlLiAgKi8KKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNlbmRpZiAvKiBfX1NTRTRfMl9fICovCisKKyNlbmRpZiAvKiBfTk1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3BtbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvcG1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjOWFlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3BtbWludHJpbi5oCkBAIC0wLDAgKzEsMTI4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjAuICAqLworCisjaWZuZGVmIF9QTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfUE1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRTNfXworIyBlcnJvciAiU1NFMyBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTRTIgYW5kIFNTRSBoZWFkZXIgZmlsZXMqLworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvKiBBZGRpdGlvbmFsIGJpdHMgaW4gdGhlIE1YQ1NSLiAgKi8KKyNkZWZpbmUgX01NX0RFTk9STUFMU19aRVJPX01BU0sJCTB4MDA0MAorI2RlZmluZSBfTU1fREVOT1JNQUxTX1pFUk9fT04JCTB4MDA0MAorI2RlZmluZSBfTU1fREVOT1JNQUxTX1pFUk9fT0ZGCQkweDAwMDAKKworI2RlZmluZSBfTU1fU0VUX0RFTk9STUFMU19aRVJPX01PREUobW9kZSkgXAorICBfbW1fc2V0Y3NyICgoX21tX2dldGNzciAoKSAmIH5fTU1fREVOT1JNQUxTX1pFUk9fTUFTSykgfCAobW9kZSkpCisjZGVmaW5lIF9NTV9HRVRfREVOT1JNQUxTX1pFUk9fTU9ERSgpIFwKKyAgKF9tbV9nZXRjc3IoKSAmIF9NTV9ERU5PUk1BTFNfWkVST19NQVNLKQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZHN1Yl9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzICgoX192NHNmKV9fWCwgKF9fdjRzZilfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1kpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9oYWRkcHMgKChfX3Y0c2YpX19YLCAoX192NHNmKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2hzdWJwcyAoKF9fdjRzZilfX1gsIChfX3Y0c2YpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlaGR1cF9wcyAoX19tMTI4IF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNoZHVwICgoX192NHNmKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZWxkdXBfcHMgKF9fbTEyOCBfX1gpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzbGR1cCAoKF9fdjRzZilfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRzdWJfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9hZGRzdWJwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2hhZGRwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1Yl9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX2hzdWJwZCAoKF9fdjJkZilfX1gsIChfX3YyZGYpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZGR1cF9wZCAoZG91YmxlIGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fbG9hZDFfcGQgKF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVkdXBfcGQgKF9fbTEyOGQgX19YKQoreworICByZXR1cm4gX21tX3NodWZmbGVfcGQgKF9fWCwgX19YLCBfTU1fU0hVRkZMRTIgKDAsMCkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sZGRxdV9zaTEyOCAoX19tMTI4aSBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2xkZHF1ICgoY2hhciBjb25zdCAqKV9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vbml0b3IgKHZvaWQgY29uc3QgKiBfX1AsIHVuc2lnbmVkIGludCBfX0UsIHVuc2lnbmVkIGludCBfX0gpCit7CisgIF9fYnVpbHRpbl9pYTMyX21vbml0b3IgKF9fUCwgX19FLCBfX0gpOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9td2FpdCAodW5zaWduZWQgaW50IF9fRSwgdW5zaWduZWQgaW50IF9fSCkKK3sKKyAgX19idWlsdGluX2lhMzJfbXdhaXQgKF9fRSwgX19IKTsKK30KKworI2VuZGlmIC8qIF9fU1NFM19fICovCisKKyNlbmRpZiAvKiBfUE1NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3BvcGNudGludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvcG9wY250aW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0ZDY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3BvcGNudGludHJpbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfX1BPUENOVF9fCisjIGVycm9yICJQT1BDTlQgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2VuZGlmIC8qIF9fUE9QQ05UX18gKi8KKworI2lmbmRlZiBfUE9QQ05USU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1BPUENOVElOVFJJTl9IX0lOQ0xVREVECisKKy8qIENhbGN1bGF0ZSBhIG51bWJlciBvZiBiaXRzIHNldCB0byAxLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcG9wY250X3UzMiAodW5zaWduZWQgaW50IF9fWCkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudCAoX19YKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BvcGNudF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbCAoX19YKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1BPUENOVElOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zbW1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMmM1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zbW1pbnRyaW4uaApAQCAtMCwwICsxLDgzMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKworLyogSW1wbGVtZW50ZWQgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBpbmNsdWRlZCBpbiB0aGUgSW50ZWwgQysrIENvbXBpbGVyCisgICBVc2VyIEd1aWRlIGFuZCBSZWZlcmVuY2UsIHZlcnNpb24gMTAuMC4gICovCisKKyNpZm5kZWYgX1NNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9TTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NFNF8xX18KKyMgZXJyb3IgIlNTRTQuMSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisvKiBXZSBuZWVkIGRlZmluaXRpb25zIGZyb20gdGhlIFNTU0UzLCBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyCisgICBmaWxlcy4gICovCisjaW5jbHVkZSA8dG1taW50cmluLmg+CisKKy8qIFJvdW5kaW5nIG1vZGUgbWFjcm9zLiAqLworI2RlZmluZSBfTU1fRlJPVU5EX1RPX05FQVJFU1RfSU5UCTB4MDAKKyNkZWZpbmUgX01NX0ZST1VORF9UT19ORUdfSU5GCQkweDAxCisjZGVmaW5lIF9NTV9GUk9VTkRfVE9fUE9TX0lORgkJMHgwMgorI2RlZmluZSBfTU1fRlJPVU5EX1RPX1pFUk8JCTB4MDMKKyNkZWZpbmUgX01NX0ZST1VORF9DVVJfRElSRUNUSU9OCTB4MDQKKworI2RlZmluZSBfTU1fRlJPVU5EX1JBSVNFX0VYQwkJMHgwMAorI2RlZmluZSBfTU1fRlJPVU5EX05PX0VYQwkJMHgwOAorCisjZGVmaW5lIF9NTV9GUk9VTkRfTklOVAkJXAorICAoX01NX0ZST1VORF9UT19ORUFSRVNUX0lOVCB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX0ZMT09SCVwKKyAgKF9NTV9GUk9VTkRfVE9fTkVHX0lORiB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX0NFSUwJCVwKKyAgKF9NTV9GUk9VTkRfVE9fUE9TX0lORiB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX1RSVU5DCVwKKyAgKF9NTV9GUk9VTkRfVE9fWkVSTyB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX1JJTlQJCVwKKyAgKF9NTV9GUk9VTkRfQ1VSX0RJUkVDVElPTiB8IF9NTV9GUk9VTkRfUkFJU0VfRVhDKQorI2RlZmluZSBfTU1fRlJPVU5EX05FQVJCWUlOVAlcCisgIChfTU1fRlJPVU5EX0NVUl9ESVJFQ1RJT04gfCBfTU1fRlJPVU5EX05PX0VYQykKKworLyogVGVzdCBJbnN0cnVjdGlvbiAqLworLyogUGFja2VkIGludGVnZXIgMTI4LWJpdCBiaXR3aXNlIGNvbXBhcmlzb24uIFJldHVybiAxIGlmCisgICAoX19WICYgX19NKSA9PSAwLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fdGVzdHpfc2kxMjggKF9fbTEyOGkgX19NLCBfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0ejEyOCAoKF9fdjJkaSlfX00sIChfX3YyZGkpX19WKTsKK30KKworLyogUGFja2VkIGludGVnZXIgMTI4LWJpdCBiaXR3aXNlIGNvbXBhcmlzb24uIFJldHVybiAxIGlmCisgICAoX19WICYgfl9fTSkgPT0gMC4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RjX3NpMTI4IChfX20xMjhpIF9fTSwgX19tMTI4aSBfX1YpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wdGVzdGMxMjggKChfX3YyZGkpX19NLCAoX192MmRpKV9fVik7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIDEyOC1iaXQgYml0d2lzZSBjb21wYXJpc29uLiBSZXR1cm4gMSBpZgorICAgKF9fViAmIF9fTSkgIT0gMCAmJiAoX19WICYgfl9fTSkgIT0gMC4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Rlc3RuemNfc2kxMjggKF9fbTEyOGkgX19NLCBfX20xMjhpIF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMTI4ICgoX192MmRpKV9fTSwgKF9fdjJkaSlfX1YpOworfQorCisvKiBNYWNyb3MgZm9yIHBhY2tlZCBpbnRlZ2VyIDEyOC1iaXQgY29tcGFyaXNvbiBpbnRyaW5zaWNzLiAgKi8KKyNkZWZpbmUgX21tX3Rlc3RfYWxsX3plcm9zKE0sIFYpIF9tbV90ZXN0el9zaTEyOCAoKE0pLCAoVikpCisKKyNkZWZpbmUgX21tX3Rlc3RfYWxsX29uZXMoVikgXAorICBfbW1fdGVzdGNfc2kxMjggKChWKSwgX21tX2NtcGVxX2VwaTMyICgoViksIChWKSkpCisKKyNkZWZpbmUgX21tX3Rlc3RfbWl4X29uZXNfemVyb3MoTSwgVikgX21tX3Rlc3RuemNfc2kxMjggKChNKSwgKFYpKQorCisvKiBQYWNrZWQvc2NhbGFyIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3VuZF9wZCAoX19tMTI4ZCBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfcm91bmRwZCAoKF9fdjJkZilfX1YsIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdW5kX3NkKF9fbTEyOGQgX19ELCBfX20xMjhkIF9fViwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9yb3VuZHNkICgoX192MmRmKV9fRCwKKwkJCQkJICAgKF9fdjJkZilfX1YsCisJCQkJCSAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcm91bmRfcGQoViwgTSkgXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQgKChfX3YyZGYpKF9fbTEyOGQpKFYpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX3JvdW5kX3NkKEQsIFYsIE0pCQkJCQkJXAorICAoKF9fbTEyOGQpIF9fYnVpbHRpbl9pYTMyX3JvdW5kc2QgKChfX3YyZGYpKF9fbTEyOGQpKEQpLAkJXAorCQkJCSAgICAgKF9fdjJkZikoX19tMTI4ZCkoViksIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBQYWNrZWQvc2NhbGFyIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdW5kX3BzIChfX20xMjggX19WLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcm91bmRwcyAoKF9fdjRzZilfX1YsIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm91bmRfc3MgKF9fbTEyOCBfX0QsIF9fbTEyOCBfX1YsIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yb3VuZHNzICgoX192NHNmKV9fRCwKKwkJCQkJICAoX192NHNmKV9fViwKKwkJCQkJICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX3JvdW5kX3BzKFYsIE0pIFwKKyAgKChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMgKChfX3Y0c2YpKF9fbTEyOCkoViksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW1fcm91bmRfc3MoRCwgViwgTSkJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yb3VuZHNzICgoX192NHNmKShfX20xMjgpKEQpLAkJXAorCQkJCSAgICAoX192NHNmKShfX20xMjgpKFYpLCAoaW50KShNKSkpCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBjZWlsL2Zsb29yIGludHJpbnNpY3MuICAqLworI2RlZmluZSBfbW1fY2VpbF9wZChWKQkgICBfbW1fcm91bmRfcGQgKChWKSwgX01NX0ZST1VORF9DRUlMKQorI2RlZmluZSBfbW1fY2VpbF9zZChELCBWKSAgX21tX3JvdW5kX3NkICgoRCksIChWKSwgX01NX0ZST1VORF9DRUlMKQorCisjZGVmaW5lIF9tbV9mbG9vcl9wZChWKQkgICBfbW1fcm91bmRfcGQoKFYpLCBfTU1fRlJPVU5EX0ZMT09SKQorI2RlZmluZSBfbW1fZmxvb3Jfc2QoRCwgVikgX21tX3JvdW5kX3NkICgoRCksIChWKSwgX01NX0ZST1VORF9GTE9PUikKKworI2RlZmluZSBfbW1fY2VpbF9wcyhWKQkgICBfbW1fcm91bmRfcHMgKChWKSwgX01NX0ZST1VORF9DRUlMKQorI2RlZmluZSBfbW1fY2VpbF9zcyhELCBWKSAgX21tX3JvdW5kX3NzICgoRCksIChWKSwgX01NX0ZST1VORF9DRUlMKQorCisjZGVmaW5lIF9tbV9mbG9vcl9wcyhWKQkgICBfbW1fcm91bmRfcHMgKChWKSwgX01NX0ZST1VORF9GTE9PUikKKyNkZWZpbmUgX21tX2Zsb29yX3NzKEQsIFYpIF9tbV9yb3VuZF9zcyAoKEQpLCAoViksIF9NTV9GUk9VTkRfRkxPT1IpCisKKy8qIFNTRTQuMSAqLworCisvKiBJbnRlZ2VyIGJsZW5kIGluc3RydWN0aW9ucyAtIHNlbGVjdCBkYXRhIGZyb20gMiBzb3VyY2VzIHVzaW5nCisgICBjb25zdGFudC92YXJpYWJsZSBtYXNrLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR3MTI4ICgoX192OGhpKV9fWCwKKwkJCQkJICAgICAgKF9fdjhoaSlfX1ksCisJCQkJCSAgICAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYmxlbmRfZXBpMTYoWCwgWSwgTSkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR3MTI4ICgoX192OGhpKShfX20xMjhpKShYKSwJCVwKKwkJCQkJKF9fdjhoaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9ibGVuZHZfZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBfX20xMjhpIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjEyOCAoKF9fdjE2cWkpX19YLAorCQkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCQkgICAgICAgKF9fdjE2cWkpX19NKTsKK30KKworLyogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBibGVuZCBpbnN0cnVjdGlvbnMgLSBzZWxlY3QgZGF0YQorICAgZnJvbSAyIHNvdXJjZXMgdXNpbmcgY29uc3RhbnQvdmFyaWFibGUgbWFzay4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9ibGVuZHBzICgoX192NHNmKV9fWCwKKwkJCQkJICAoX192NHNmKV9fWSwKKwkJCQkJICBfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2JsZW5kX3BzKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYmxlbmRwcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCVwKKwkJCQkgICAgKF9fdjRzZikoX19tMTI4KShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmR2X3BzIChfX20xMjggX19YLCBfX20xMjggX19ZLCBfX20xMjggX19NKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfYmxlbmR2cHMgKChfX3Y0c2YpX19YLAorCQkJCQkgICAoX192NHNmKV9fWSwKKwkJCQkJICAgKF9fdjRzZilfX00pOworfQorCisvKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGJsZW5kIGluc3RydWN0aW9ucyAtIHNlbGVjdCBkYXRhCisgICBmcm9tIDIgc291cmNlcyB1c2luZyBjb25zdGFudC92YXJpYWJsZSBtYXNrLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYmxlbmRfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHBkICgoX192MmRmKV9fWCwKKwkJCQkJICAgKF9fdjJkZilfX1ksCisJCQkJCSAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fYmxlbmRfcGQoWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfYmxlbmRwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQlcCisJCQkJICAgICAoX192MmRmKShfX20xMjhkKShZKSwgKGludCkoTSkpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2JsZW5kdl9wZCAoX19tMTI4ZCBfX1gsIF9fbTEyOGQgX19ZLCBfX20xMjhkIF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl9ibGVuZHZwZCAoKF9fdjJkZilfX1gsCisJCQkJCSAgICAoX192MmRmKV9fWSwKKwkJCQkJICAgIChfX3YyZGYpX19NKTsKK30KKworLyogRG90IHByb2R1Y3QgaW5zdHJ1Y3Rpb25zIHdpdGggbWFzay1kZWZpbmVkIHN1bW1pbmcgYW5kIHplcm9pbmcgcGFydHMKKyAgIG9mIHJlc3VsdC4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZHBfcHMgKF9fbTEyOCBfX1gsIF9fbTEyOCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9kcHBzICgoX192NHNmKV9fWCwKKwkJCQkgICAgICAgKF9fdjRzZilfX1ksCisJCQkJICAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2RwX3BkIChfX20xMjhkIF9fWCwgX19tMTI4ZCBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZHBwZCAoKF9fdjJkZilfX1gsCisJCQkJCShfX3YyZGYpX19ZLAorCQkJCQlfX00pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2RwX3BzKFgsIFksIE0pCQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfZHBwcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCQlcCisJCQkJIChfX3Y0c2YpKF9fbTEyOCkoWSksIChpbnQpKE0pKSkKKworI2RlZmluZSBfbW1fZHBfcGQoWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfZHBwZCAoKF9fdjJkZikoX19tMTI4ZCkoWCksCQkJXAorCQkJCSAgKF9fdjJkZikoX19tMTI4ZCkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBQYWNrZWQgaW50ZWdlciA2NC1iaXQgY29tcGFyaXNvbiwgemVyb2luZyBvciBmaWxsaW5nIHdpdGggb25lcworICAgY29ycmVzcG9uZGluZyBwYXJ0cyBvZiByZXN1bHQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXFfZXBpNjQgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZXFxICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisvKiAgTWluL21heCBwYWNrZWQgaW50ZWdlciBpbnN0cnVjdGlvbnMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW5zYjEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXBpOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXhzYjEyOCAoKF9fdjE2cWkpX19YLCAoX192MTZxaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fZXB1MTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWludXcxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9lcHUxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtYXh1dzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX2VwaTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1pbnNkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbWF4c2QxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9lcHUzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtaW51ZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWF4X2VwdTMyIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1heHVkMTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCisvKiBQYWNrZWQgaW50ZWdlciAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2l0aCB0cnVuY2F0aW9uIG9mIHVwcGVyCisgICBoYWx2ZXMgb2YgcmVzdWx0cy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxsb19lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxsZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworLyogUGFja2VkIGludGVnZXIgMzItYml0IG11bHRpcGxpY2F0aW9uIG9mIDIgcGFpcnMgb2Ygb3BlcmFuZHMKKyAgIHdpdGggdHdvIDY0LWJpdCByZXN1bHRzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxkcTEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworLyogSW5zZXJ0IHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgaW50byBwYWNrZWQgc2luZ2xlIHByZWNpc2lvbiBhcnJheQorICAgZWxlbWVudCBzZWxlY3RlZCBieSBpbmRleCBOLiAgVGhlIGJpdHMgWzctNl0gb2YgTiBkZWZpbmUgUworICAgaW5kZXgsIHRoZSBiaXRzIFs1LTRdIGRlZmluZSBEIGluZGV4LCBhbmQgYml0cyBbMy0wXSBkZWZpbmUKKyAgIHplcm9pbmcgbWFzayBmb3IgRC4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X3BzIChfX20xMjggX19ELCBfX20xMjggX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfaW5zZXJ0cHMxMjggKChfX3Y0c2YpX19ELAorCQkJCQkgICAgICAoX192NHNmKV9fUywKKwkJCQkJICAgICAgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9pbnNlcnRfcHMoRCwgUywgTikJCQkJCQlcCisgICgoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9pbnNlcnRwczEyOCAoKF9fdjRzZikoX19tMTI4KShEKSwJCVwKKwkJCQkJKF9fdjRzZikoX19tMTI4KShTKSwgKGludCkoTikpKQorI2VuZGlmCisKKy8qIEhlbHBlciBtYWNybyB0byBjcmVhdGUgdGhlIE4gdmFsdWUgZm9yIF9tbV9pbnNlcnRfcHMuICAqLworI2RlZmluZSBfTU1fTUtfSU5TRVJUUFNfTkRYKFMsIEQsIE0pICgoKFMpIDw8IDYpIHwgKChEKSA8PCA0KSB8IChNKSkKKworLyogRXh0cmFjdCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2Ygc2luZ2xlIHByZWNpc2lvbiBmbG9hdCBmcm9tIHBhY2tlZAorICAgc2luZ2xlIHByZWNpc2lvbiBhcnJheSBlbGVtZW50IG9mIFggc2VsZWN0ZWQgYnkgaW5kZXggTi4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9wcyAoX19tMTI4IF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgdW5pb24geyBpbnQgaTsgZmxvYXQgZjsgfSBfX3RtcDsKKyAgX190bXAuZiA9IF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoKF9fdjRzZilfX1gsIF9fTik7CisgIHJldHVybiBfX3RtcC5pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2V4dHJhY3RfcHMoWCwgTikJCQkJCQlcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCVwKKyAgICh7CQkJCQkJCQkJXAorICAgICB1bmlvbiB7IGludCBpOyBmbG9hdCBmOyB9IF9fdG1wOwkJCQkJXAorICAgICBfX3RtcC5mID0gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NHNmICgoX192NHNmKShfX20xMjgpKFgpLCAoaW50KShOKSk7IFwKKyAgICAgX190bXAuaTsJCQkJCQkJCVwKKyAgIH0pKQorI2VuZGlmCisKKy8qIEV4dHJhY3QgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgaW50bworICAgRCBmcm9tIHBhY2tlZCBzaW5nbGUgcHJlY2lzaW9uIGFycmF5IGVsZW1lbnQgb2YgUyBzZWxlY3RlZAorICAgYnkgaW5kZXggTi4gICovCisjZGVmaW5lIF9NTV9FWFRSQUNUX0ZMT0FUKEQsIFMsIE4pIFwKKyAgeyAoRCkgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2YgKChfX3Y0c2YpKFMpLCAoTikpOyB9CisgIAorLyogRXh0cmFjdCBzcGVjaWZpZWQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdCBlbGVtZW50IGludG8gdGhlIGxvd2VyCisgICBwYXJ0IG9mIF9fbTEyOC4gICovCisjZGVmaW5lIF9NTV9QSUNLX09VVF9QUyhYLCBOKQkJCQlcCisgIF9tbV9pbnNlcnRfcHMgKF9tbV9zZXR6ZXJvX3BzICgpLCAoWCksIAkJXAorCQkgX01NX01LX0lOU0VSVFBTX05EWCAoKE4pLCAwLCAweDBlKSkKKworLyogSW5zZXJ0IGludGVnZXIsIFMsIGludG8gcGFja2VkIGludGVnZXIgYXJyYXkgZWxlbWVudCBvZiBECisgICBzZWxlY3RlZCBieSBpbmRleCBOLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faW5zZXJ0X2VwaTggKF9fbTEyOGkgX19ELCBpbnQgX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjE2cWkgKChfX3YxNnFpKV9fRCwKKwkJCQkJCSBfX1MsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2luc2VydF9lcGkzMiAoX19tMTI4aSBfX0QsIGludCBfX1MsIGNvbnN0IGludCBfX04pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdmVjX3NldF92NHNpICgoX192NHNpKV9fRCwKKwkJCQkJCSBfX1MsIF9fTik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfZXBpNjQgKF9fbTEyOGkgX19ELCBsb25nIGxvbmcgX19TLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjJkaSAoKF9fdjJkaSlfX0QsCisJCQkJCQkgX19TLCBfX04pOworfQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBfbW1faW5zZXJ0X2VwaTgoRCwgUywgTikJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3YxNnFpICgoX192MTZxaSkoX19tMTI4aSkoRCksCVwKKwkJCQkJICAgKGludCkoUyksIChpbnQpKE4pKSkKKworI2RlZmluZSBfbW1faW5zZXJ0X2VwaTMyKEQsIFMsIE4pCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y0c2kgKChfX3Y0c2kpKF9fbTEyOGkpKEQpLAlcCisJCQkJCSAgKGludCkoUyksIChpbnQpKE4pKSkKKworI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgX21tX2luc2VydF9lcGk2NChELCBTLCBOKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjJkaSAoKF9fdjJkaSkoX19tMTI4aSkoRCksCQlcCisJCQkJCSAgKGxvbmcgbG9uZykoUyksIChpbnQpKE4pKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIEV4dHJhY3QgaW50ZWdlciBmcm9tIHBhY2tlZCBpbnRlZ2VyIGFycmF5IGVsZW1lbnQgb2YgWCBzZWxlY3RlZCBieQorICAgaW5kZXggTi4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZXh0cmFjdF9lcGk4IChfX20xMjhpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgIHJldHVybiAodW5zaWduZWQgY2hhcikgX19idWlsdGluX2lhMzJfdmVjX2V4dF92MTZxaSAoKF9fdjE2cWkpX19YLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfZXBpMzIgKF9fbTEyOGkgX19YLCBjb25zdCBpbnQgX19OKQoreworICAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzaSAoKF9fdjRzaSlfX1gsIF9fTik7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nICBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9leHRyYWN0X2VwaTY0IChfX20xMjhpIF9fWCwgY29uc3QgaW50IF9fTikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSlfX1gsIF9fTik7Cit9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTgoWCwgTikgXAorICAoKGludCkgKHVuc2lnbmVkIGNoYXIpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjE2cWkgKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fZXh0cmFjdF9lcGkzMihYLCBOKSBcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2kgKChfX3Y0c2kpKF9fbTEyOGkpKFgpLCAoaW50KShOKSkpCisKKyNpZmRlZiBfX3g4Nl82NF9fCisjZGVmaW5lIF9tbV9leHRyYWN0X2VwaTY0KFgsIE4pIFwKKyAgKChsb25nIGxvbmcpIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjJkaSAoKF9fdjJkaSkoX19tMTI4aSkoWCksIChpbnQpKE4pKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIFJldHVybiBob3Jpem9udGFsIHBhY2tlZCB3b3JkIG1pbmltdW0gYW5kIGl0cyBpbmRleCBpbiBiaXRzIFsxNTowXQorICAgYW5kIGJpdHMgWzE4OjE2XSByZXNwZWN0aXZlbHkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWlucG9zX2VwdTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waG1pbnBvc3V3MTI4ICgoX192OGhpKV9fWCk7Cit9CisKKy8qIFBhY2tlZCBpbnRlZ2VyIHNpZ24tZXh0ZW5zaW9uLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpOF9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnN4YmQxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTE2X2VwaTMyIChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3ZDEyOCAoKF9fdjhoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGk4X2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hicTEyOCAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXBpMzJfZXBpNjQgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3ZzeGRxMTI4ICgoX192NHNpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwaTE2X2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3h3cTEyOCAoKF9fdjhoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcGk4X2VwaTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92c3hidzEyOCAoKF9fdjE2cWkpX19YKTsKK30KKworLyogUGFja2VkIGludGVnZXIgemVyby1leHRlbnNpb24uICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwdThfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Btb3Z6eGJkMTI4ICgoX192MTZxaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcHUxNl9lcGkzMiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d2QxMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXB1OF9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YnExMjggKChfX3YxNnFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dGVwdTMyX2VwaTY0IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wbW92enhkcTEyOCAoKF9fdjRzaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRlcHUxNl9lcGk2NCAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4d3ExMjggKChfX3Y4aGkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0ZXB1OF9lcGkxNiAoX19tMTI4aSBfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1vdnp4YncxMjggKChfX3YxNnFpKV9fWCk7Cit9CisKKy8qIFBhY2sgOCBkb3VibGUgd29yZHMgZnJvbSAyIG9wZXJhbmRzIGludG8gOCB3b3JkcyBvZiByZXN1bHQgd2l0aAorICAgdW5zaWduZWQgc2F0dXJhdGlvbi4gKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3BhY2t1c19lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MTI4ICgoX192NHNpKV9fWCwgKF9fdjRzaSlfX1kpOworfQorCisvKiBTdW0gYWJzb2x1dGUgOC1iaXQgaW50ZWdlciBkaWZmZXJlbmNlIG9mIGFkamFjZW50IGdyb3VwcyBvZiA0CisgICBieXRlIGludGVnZXJzIGluIHRoZSBmaXJzdCAyIG9wZXJhbmRzLiAgU3RhcnRpbmcgb2Zmc2V0cyB3aXRoaW4KKyAgIG9wZXJhbmRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAzcmQgbWFzayBvcGVyYW5kLiAgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXBzYWRid19lcHU4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbXBzYWRidzEyOCAoKF9fdjE2cWkpX19YLAorCQkJCQkgICAgICAoX192MTZxaSlfX1ksIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fbXBzYWRid19lcHU4KFgsIFksIE0pCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbXBzYWRidzEyOCAoKF9fdjE2cWkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCQkoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBMb2FkIGRvdWJsZSBxdWFkd29yZCB1c2luZyBub24tdGVtcG9yYWwgYWxpZ25lZCBoaW50LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0cmVhbV9sb2FkX3NpMTI4IChfX20xMjhpICpfX1gpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfbW92bnRkcWEgKChfX3YyZGkgKikgX19YKTsKK30KKworI2lmZGVmIF9fU1NFNF8yX18KKworLyogVGhlc2UgbWFjcm9zIHNwZWNpZnkgdGhlIHNvdXJjZSBkYXRhIGZvcm1hdC4gICovCisjZGVmaW5lIF9TSUREX1VCWVRFX09QUwkJCTB4MDAKKyNkZWZpbmUgX1NJRERfVVdPUkRfT1BTCQkJMHgwMQorI2RlZmluZSBfU0lERF9TQllURV9PUFMJCQkweDAyCisjZGVmaW5lIF9TSUREX1NXT1JEX09QUwkJCTB4MDMKKworLyogVGhlc2UgbWFjcm9zIHNwZWNpZnkgdGhlIGNvbXBhcmlzb24gb3BlcmF0aW9uLiAgKi8KKyNkZWZpbmUgX1NJRERfQ01QX0VRVUFMX0FOWQkJMHgwMAorI2RlZmluZSBfU0lERF9DTVBfUkFOR0VTCQkweDA0CisjZGVmaW5lIF9TSUREX0NNUF9FUVVBTF9FQUNICQkweDA4CisjZGVmaW5lIF9TSUREX0NNUF9FUVVBTF9PUkRFUkVECQkweDBjCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSB0aGUgcG9sYXJpdHkuICAqLworI2RlZmluZSBfU0lERF9QT1NJVElWRV9QT0xBUklUWQkJMHgwMAorI2RlZmluZSBfU0lERF9ORUdBVElWRV9QT0xBUklUWQkJMHgxMAorI2RlZmluZSBfU0lERF9NQVNLRURfUE9TSVRJVkVfUE9MQVJJVFkJMHgyMAorI2RlZmluZSBfU0lERF9NQVNLRURfTkVHQVRJVkVfUE9MQVJJVFkJMHgzMAorCisvKiBUaGVzZSBtYWNyb3Mgc3BlY2lmeSB0aGUgb3V0cHV0IHNlbGVjdGlvbiBpbiBfbW1fY21wWHN0cmkgKCkuICAqLworI2RlZmluZSBfU0lERF9MRUFTVF9TSUdOSUZJQ0FOVAkJMHgwMAorI2RlZmluZSBfU0lERF9NT1NUX1NJR05JRklDQU5UCQkweDQwCisKKy8qIFRoZXNlIG1hY3JvcyBzcGVjaWZ5IHRoZSBvdXRwdXQgc2VsZWN0aW9uIGluIF9tbV9jbXBYc3RybSAoKS4gICovCisjZGVmaW5lIF9TSUREX0JJVF9NQVNLCQkJMHgwMAorI2RlZmluZSBfU0lERF9VTklUX01BU0sJCQkweDQwCisKKy8qIEludHJpbnNpY3MgZm9yIHRleHQvc3RyaW5nIHByb2Nlc3NpbmcuICAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RybSAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RybTEyOCAoKF9fdjE2cWkpX19YLAorCQkJCQkJKF9fdjE2cWkpX19ZLAorCQkJCQkJX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RyaSAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpMTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVzdHJtIChfX20xMjhpIF9fWCwgaW50IF9fTFgsIF9fbTEyOGkgX19ZLCBpbnQgX19MWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjggKChfX3YxNnFpKV9fWCwgX19MWCwKKwkJCQkJCShfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkJCV9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZXN0cmkgKF9fbTEyOGkgX19YLCBpbnQgX19MWCwgX19tMTI4aSBfX1ksIGludCBfX0xZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGVzdHJpMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgKF9fdjE2cWkpX19ZLCBfX0xZLAorCQkJCSAgICAgIF9fTSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fY21waXN0cm0oWCwgWSwgTSkJCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJtMTI4ICgoX192MTZxaSkoX19tMTI4aSkoWCksCVwKKwkJCQkJICAoX192MTZxaSkoX19tMTI4aSkoWSksIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGlzdHJpKFgsIFksIE0pCQkJCQkJXAorICAoKGludCkgX19idWlsdGluX2lhMzJfcGNtcGlzdHJpMTI4ICgoX192MTZxaSkoX19tMTI4aSkoWCksCQlcCisJCQkJICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX2NtcGVzdHJtKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJXAorCQkJCQkgIChpbnQpKExYKSwgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCBcCisJCQkJCSAgKGludCkoTFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBlc3RyaShYLCBMWCwgWSwgTFksIE0pCQkJCQlcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmkxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLAlcCisJCQkJICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShMWSksCVwKKwkJCQkgICAgICAoaW50KShNKSkpCisjZW5kaWYKKworLyogSW50cmluc2ljcyBmb3IgdGV4dC9zdHJpbmcgcHJvY2Vzc2luZyBhbmQgcmVhZGluZyB2YWx1ZXMgb2YKKyAgIEVGbGFncy4gICovCisKKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21waXN0cmEgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWExMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJjIChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21waXN0cmljMTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBpc3RybyAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19NKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOCAoKF9fdjE2cWkpX19YLAorCQkJCSAgICAgICAoX192MTZxaSlfX1ksCisJCQkJICAgICAgIF9fTSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21waXN0cnMgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSwgY29uc3QgaW50IF9fTSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXMxMjggKChfX3YxNnFpKV9fWCwKKwkJCQkgICAgICAgKF9fdjE2cWkpX19ZLAorCQkJCSAgICAgICBfX00pOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGlzdHJ6IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1ksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21waXN0cml6MTI4ICgoX192MTZxaSlfX1gsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyYSAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlhMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyYyAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmljMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RybyAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlvMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RycyAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlzMTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBlc3RyeiAoX19tMTI4aSBfX1gsIGludCBfX0xYLCBfX20xMjhpIF9fWSwgaW50IF9fTFksIGNvbnN0IGludCBfX00pCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9wY21wZXN0cml6MTI4ICgoX192MTZxaSlfX1gsIF9fTFgsCisJCQkJICAgICAgIChfX3YxNnFpKV9fWSwgX19MWSwKKwkJCQkgICAgICAgX19NKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9jbXBpc3RyYShYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWExMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RyYyhYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RybyhYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaW8xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RycyhYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisjZGVmaW5lIF9tbV9jbXBpc3RyeihYLCBZLCBNKQkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXoxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjE2cWkpKF9fbTEyOGkpKFkpLCAoaW50KShNKSkpCisKKyNkZWZpbmUgX21tX2NtcGVzdHJhKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWExMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJjKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJvKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJzKFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXMxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNkZWZpbmUgX21tX2NtcGVzdHJ6KFgsIExYLCBZLCBMWSwgTSkJCQkJCVwKKyAgKChpbnQpIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXoxMjggKChfX3YxNnFpKShfX20xMjhpKShYKSwgKGludCkoTFgpLCBcCisJCQkJICAgICAgIChfX3YxNnFpKShfX20xMjhpKShZKSwgKGludCkoTFkpLCBcCisJCQkJICAgICAgIChpbnQpKE0pKSkKKyNlbmRpZgorCisvKiBQYWNrZWQgaW50ZWdlciA2NC1iaXQgY29tcGFyaXNvbiwgemVyb2luZyBvciBmaWxsaW5nIHdpdGggb25lcworICAgY29ycmVzcG9uZGluZyBwYXJ0cyBvZiByZXN1bHQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wZ3RfZXBpNjQgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wY21wZ3RxICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisjaWZkZWYgX19QT1BDTlRfXworI2luY2x1ZGUgPHBvcGNudGludHJpbi5oPgorI2VuZGlmCisKKy8qIEFjY3VtdWxhdGUgQ1JDMzIgKHBvbHlub21pYWwgMHgxMUVEQzZGNDEpIHZhbHVlLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3JjMzJfdTggKHVuc2lnbmVkIGludCBfX0MsIHVuc2lnbmVkIGNoYXIgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJxaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NyYzMyX3UxNiAodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgc2hvcnQgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJoaSAoX19DLCBfX1YpOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NyYzMyX3UzMiAodW5zaWduZWQgaW50IF9fQywgdW5zaWduZWQgaW50IF9fVikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NyYzMyc2kgKF9fQywgX19WKTsKK30KKworI2lmZGVmIF9feDg2XzY0X18KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3JjMzJfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19DLCB1bnNpZ25lZCBsb25nIGxvbmcgX19WKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3JjMzJkaSAoX19DLCBfX1YpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NTRTRfMl9fICovCisKKyNlbmRpZiAvKiBfX1NTRTRfMV9fICovCisKKyNlbmRpZiAvKiBfU01NSU5UUklOX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC9zc3AuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC9zc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZlMGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3NwL3NzcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIE9iamVjdCBzaXplIGNoZWNraW5nIHN1cHBvcnQgbWFjcm9zLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisjaWZuZGVmIF9TU1BfSAorI2RlZmluZSBfU1NQX0ggMQorCisjaWYgX0ZPUlRJRllfU09VUkNFID4gMCAmJiBfX09QVElNSVpFX18gPiAwIFwKKyAgICAmJiBkZWZpbmVkIF9fR05VQ19fIFwKKyAgICAmJiAoX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDEpKSBcCisgICAgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgaWYgX0ZPUlRJRllfU09VUkNFID09IDEKKyMgIGRlZmluZSBfX1NTUF9GT1JUSUZZX0xFVkVMIDEKKyMgZWxpZiBfRk9SVElGWV9TT1VSQ0UgPiAxCisjICBkZWZpbmUgX19TU1BfRk9SVElGWV9MRVZFTCAyCisjIGVuZGlmCisjZW5kaWYKKworI2lmIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyBkZWZpbmUgX19zc3BfYm9zKHB0cikgX19idWlsdGluX29iamVjdF9zaXplIChwdHIsIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAxKQorIyBkZWZpbmUgX19zc3BfYm9zMChwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCAwKQorCisjIGRlZmluZSBfX1NTUF9SRURJUkVDVChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgbmFtZSBwcm90byBfX2FzbV9fIChfX1NTUF9BU01OQU1FICgjYWxpYXMpKQorIyBkZWZpbmUgX19TU1BfQVNNTkFNRShjbmFtZSkgIF9fU1NQX0FTTU5BTUUyIChfX1VTRVJfTEFCRUxfUFJFRklYX18sIGNuYW1lKQorIyBkZWZpbmUgX19TU1BfQVNNTkFNRTIocHJlZml4LCBjbmFtZSkgX19TU1BfQVNNTkFNRTMgKHByZWZpeCkgY25hbWUKKyMgZGVmaW5lIF9fU1NQX0FTTU5BTUUzKHByZWZpeCkgI3ByZWZpeAorCisjIHVuZGVmIF9fU1NQX0hBVkVfVlNOUFJJTlRGCisKK2V4dGVybiB2b2lkIF9fY2hrX2ZhaWwgKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfU1NQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC9zdGRpby5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3NwL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzY2E2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC9zdGRpby5oCkBAIC0wLDAgKzEsMTAwIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN0ZGlvIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKworI2lmbmRlZiBfU1NQX1NURElPX0gKKyNkZWZpbmUgX1NTUF9TVERJT19IIDEKKworI2luY2x1ZGUgPHNzcC5oPgorI2luY2x1ZGVfbmV4dCA8c3RkaW8uaD4KKworI2lmIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI3VuZGVmIHNwcmludGYKKyN1bmRlZiB2c3ByaW50ZgorI3VuZGVmIHNucHJpbnRmCisjdW5kZWYgdnNucHJpbnRmCisjdW5kZWYgZ2V0cworI3VuZGVmIGZnZXRzCisKK2V4dGVybiBpbnQgX19zcHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgaW50IF9fZmxhZywgc2l6ZV90IF9fc2xlbiwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9fdnNwcmludGZfY2hrIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBpbnQgX19mbGFnLCBzaXplX3QgX19zbGVuLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gX19mb3JtYXQsCisJCQkgICB2YV9saXN0IF9fYXApOworCisjZGVmaW5lIHNwcmludGYoc3RyLCAuLi4pIFwKKyAgX19idWlsdGluX19fc3ByaW50Zl9jaGsgKHN0ciwgMCwgX19zc3BfYm9zIChzdHIpLCBcCisJCQkgICBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgdnNwcmludGYoc3RyLCBmbXQsIGFwKSBcCisgIF9fYnVpbHRpbl9fX3ZzcHJpbnRmX2NoayAoc3RyLCAwLCBfX3NzcF9ib3MgKHN0ciksIGZtdCwgYXApCisKK2V4dGVybiBpbnQgX19zbnByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3RfXyBfX3MsIHNpemVfdCBfX24sIGludCBfX2ZsYWcsCisJCQkgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Zvcm1hdCwKKwkJCSAgIC4uLik7CitleHRlcm4gaW50IF9fdnNucHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgc2l6ZV90IF9fbiwgaW50IF9fZmxhZywKKwkJCSAgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Zvcm1hdCwKKwkJCSAgICB2YV9saXN0IF9fYXApOworCisjZGVmaW5lIHNucHJpbnRmKHN0ciwgbGVuLCAuLi4pIFwKKyAgX19idWlsdGluX19fc25wcmludGZfY2hrIChzdHIsIGxlbiwgMCwgX19zc3BfYm9zIChzdHIpLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgdnNucHJpbnRmKHN0ciwgbGVuLCBmbXQsIGFwKSBcCisgIF9fYnVpbHRpbl9fX3ZzbnByaW50Zl9jaGsgKHN0ciwgbGVuLCAwLCBfX3NzcF9ib3MgKHN0ciksIGZtdCwgYXApCisKK2V4dGVybiBjaGFyICpfX2dldHNfY2hrIChjaGFyICpfX3N0ciwgc2l6ZV90KTsKK2V4dGVybiBjaGFyICpfX1NTUF9SRURJUkVDVCAoX19nZXRzX2FsaWFzLCAoY2hhciAqX19zdHIpLCBnZXRzKTsKKworZXh0ZXJuIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorZ2V0cyAoY2hhciAqX19zdHIpCit7CisgIGlmIChfX3NzcF9ib3MgKF9fc3RyKSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX19nZXRzX2NoayAoX19zdHIsIF9fc3NwX2JvcyAoX19zdHIpKTsKKyAgcmV0dXJuIF9fZ2V0c19hbGlhcyAoX19zdHIpOworfQorCitleHRlcm4gY2hhciAqX19TU1BfUkVESVJFQ1QgKF9fZmdldHNfYWxpYXMsCisJCQkgICAgIChjaGFyICpfX3Jlc3RyaWN0X18gX19zLCBpbnQgX19uLAorCQkJICAgICAgRklMRSAqX19yZXN0cmljdF9fIF9fc3RyZWFtKSwgZmdldHMpOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitmZ2V0cyAoY2hhciAqX19yZXN0cmljdF9fIF9fcywgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdF9fIF9fc3RyZWFtKQoreworICBpZiAoX19zc3BfYm9zIChfX3MpICE9IChzaXplX3QpIC0xICYmIChzaXplX3QpIF9fbiA+IF9fc3NwX2JvcyAoX19zKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19mZ2V0c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2VuZGlmIC8qIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwICovCisjZW5kaWYgLyogX1NTUF9TVERJT19IICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zc3Avc3RyaW5nLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zc3Avc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0NzU0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC9zdHJpbmcuaApAQCAtMCwwICsxLDE2NyBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdHJpbmcgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworCisjaWZuZGVmIF9TU1BfU1RSSU5HX0gKKyNkZWZpbmUgX1NTUF9TVFJJTkdfSCAxCisKKyNpbmNsdWRlIDxzc3AuaD4KKyNpbmNsdWRlX25leHQgPHN0cmluZy5oPgorCisjaWYgX19TU1BfRk9SVElGWV9MRVZFTCA+IDAKKworI3VuZGVmIG1lbWNweQorI3VuZGVmIG1lbW1vdmUKKyN1bmRlZiBtZW1zZXQKKyN1bmRlZiBzdHJjYXQKKyN1bmRlZiBzdHJjcHkKKyN1bmRlZiBzdHJuY2F0CisjdW5kZWYgc3RybmNweQorI3VuZGVmIG1lbXBjcHkKKyN1bmRlZiBzdHBjcHkKKyN1bmRlZiBiY29weQorI3VuZGVmIGJ6ZXJvCisKKyNkZWZpbmUgbWVtY3B5KGRlc3QsIHNyYywgbGVuKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbWNweV9jaGsgKGRlc3QsIHNyYywgbGVuLCBfX3NzcF9ib3MwIChkZXN0KSkJCVwKKyAgIDogX19tZW1jcHlfaWNoayAoZGVzdCwgc3JjLCBsZW4pKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHZvaWQgKgorX19tZW1jcHlfaWNoayAodm9pZCAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3Qgdm9pZCAqX19yZXN0cmljdF9fIF9fc3JjLAorCSAgICAgICBzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19zc3BfYm9zMCAoX19kZXN0KSk7Cit9CisKKworI2RlZmluZSBtZW1tb3ZlKGRlc3QsIHNyYywgbGVuKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbW1vdmVfY2hrIChkZXN0LCBzcmMsIGxlbiwgX19zc3BfYm9zMCAoZGVzdCkpCQlcCisgICA6IF9fbWVtbW92ZV9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgdm9pZCAqCitfX21lbW1vdmVfaWNoayAodm9pZCAqX19kZXN0LCBjb25zdCB2b2lkICpfX3NyYywgc2l6ZV90IF9fbGVuKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtbW92ZV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX3NzcF9ib3MwIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIG1lbXBjcHkoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MwIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fbWVtcGNweV9jaGsgKGRlc3QsIHNyYywgbGVuLCBfX3NzcF9ib3MwIChkZXN0KSkJXAorICAgOiBfX21lbXBjcHlfaWNoayAoZGVzdCwgc3JjLCBsZW4pKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIHZvaWQgKgorX19tZW1wY3B5X2ljaGsgKHZvaWQgKl9fcmVzdHJpY3RfXyBfX2Rlc3QsIGNvbnN0IHZvaWQgKl9fcmVzdHJpY3RfXyBfX3NyYywKKwkJc2l6ZV90IF9fbGVuKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtcGNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX3NzcF9ib3MwIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIG1lbXNldChkZXN0LCBjaCwgbGVuKSBcCisgICgoX19zc3BfYm9zMCAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKGRlc3QsIGNoLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQkJXAorICAgOiBfX21lbXNldF9pY2hrIChkZXN0LCBjaCwgbGVuKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSB2b2lkICoKK19fbWVtc2V0X2ljaGsgKHZvaWQgKl9fZGVzdCwgaW50IF9fY2gsIHNpemVfdCBfX2xlbikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKF9fZGVzdCwgX19jaCwgX19sZW4sIF9fc3NwX2JvczAgKF9fZGVzdCkpOworfQorCisjZGVmaW5lIGJjb3B5KHNyYywgZGVzdCwgbGVuKSAoKHZvaWQpIFwKKyAoKF9fc3NwX2JvczAgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19tZW1tb3ZlX2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQlcCisgICA6IF9fbWVtbW92ZV9pY2hrIChkZXN0LCBzcmMsIGxlbikpKQorI2RlZmluZSBiemVybyhkZXN0LCBsZW4pICgodm9pZCkgXAorICAoKF9fc3NwX2JvczAgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19tZW1zZXRfY2hrIChkZXN0LCAnXDAnLCBsZW4sIF9fc3NwX2JvczAgKGRlc3QpKQlcCisgICA6IF9fbWVtc2V0X2ljaGsgKGRlc3QsICdcMCcsIGxlbikpKQorCisKKyNkZWZpbmUgc3RyY3B5KGRlc3QsIHNyYykgXAorICAoKF9fc3NwX2JvcyAoZGVzdCkgIT0gKHNpemVfdCkgLTEpCQkJCQlcCisgICA/IF9fYnVpbHRpbl9fX3N0cmNweV9jaGsgKGRlc3QsIHNyYywgX19zc3BfYm9zIChkZXN0KSkJCVwKKyAgIDogX19zdHJjcHlfaWNoayAoZGVzdCwgc3JjKSkKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBjaGFyICoKK19fc3RyY3B5X2ljaGsgKGNoYXIgKl9fcmVzdHJpY3RfXyBfX2Rlc3QsIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX3NyYykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fc3NwX2JvcyAoX19kZXN0KSk7Cit9CisKKworI2RlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBcCisgICgoX19zc3BfYm9zIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fc3RwY3B5X2NoayAoZGVzdCwgc3JjLCBfX3NzcF9ib3MgKGRlc3QpKQkJXAorICAgOiBfX3N0cGNweV9pY2hrIChkZXN0LCBzcmMpKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorX19zdHBjcHlfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RwY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19zdHJuY3B5X2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvcyAoZGVzdCkpCQlcCisgICA6IF9fc3RybmNweV9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitfX3N0cm5jcHlfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjLAorCQlzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fc3NwX2JvcyAoX19kZXN0KSk7Cit9CisKKworI2RlZmluZSBzdHJjYXQoZGVzdCwgc3JjKSBcCisgICgoX19zc3BfYm9zIChkZXN0KSAhPSAoc2l6ZV90KSAtMSkJCQkJCVwKKyAgID8gX19idWlsdGluX19fc3RyY2F0X2NoayAoZGVzdCwgc3JjLCBfX3NzcF9ib3MgKGRlc3QpKQkJXAorICAgOiBfX3N0cmNhdF9pY2hrIChkZXN0LCBzcmMpKQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXykpIGNoYXIgKgorX19zdHJjYXRfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RyY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19zc3BfYm9zIChfX2Rlc3QpKTsKK30KKworCisjZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBsZW4pIFwKKyAgKChfX3NzcF9ib3MgKGRlc3QpICE9IChzaXplX3QpIC0xKQkJCQkJXAorICAgPyBfX2J1aWx0aW5fX19zdHJuY2F0X2NoayAoZGVzdCwgc3JjLCBsZW4sIF9fc3NwX2JvcyAoZGVzdCkpCQlcCisgICA6IF9fc3RybmNhdF9pY2hrIChkZXN0LCBzcmMsIGxlbikpCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitfX3N0cm5jYXRfaWNoayAoY2hhciAqX19yZXN0cmljdF9fIF9fZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fc3JjLAorCQlzaXplX3QgX19sZW4pCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fc3NwX2JvcyAoX19kZXN0KSk7Cit9CisKKyNlbmRpZiAvKiBfX1NTUF9GT1JUSUZZX0xFVkVMID4gMCAqLworI2VuZGlmIC8qIF9TU1BfU1RSSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC91bmlzdGQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3NzcC91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNmZTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3NwL3VuaXN0ZC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3IgdW5pc3RkIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKK2NvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCithbmQgdG8gZGlzdHJpYnV0ZSB0aG9zZSBjb21iaW5hdGlvbnMgd2l0aG91dCBhbnkgcmVzdHJpY3Rpb24gY29taW5nCitmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucworZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgordGhlIGZpbGUsIGFuZCBkaXN0cmlidXRpb24gd2hlbiBub3QgbGlua2VkIGludG8gYSBjb21iaW5lCitleGVjdXRhYmxlLikKKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKworI2lmbmRlZiBfU1NQX1VOSVNURF9ICisjZGVmaW5lIF9TU1BfVU5JU1REX0ggMQorCisjaW5jbHVkZSA8c3NwLmg+CisjaW5jbHVkZV9uZXh0IDx1bmlzdGQuaD4KKworI2lmIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwCisKKyN1bmRlZiByZWFkCisjdW5kZWYgcmVhZGxpbmsKKyN1bmRlZiBnZXRjd2QKKworZXh0ZXJuIHNzaXplX3QgX19TU1BfUkVESVJFQ1QgKF9fcmVhZF9hbGlhcywgKGludCBfX2ZkLCB2b2lkICpfX2J1ZiwKKwkJCQkJICAgICAgc2l6ZV90IF9fbmJ5dGVzKSwgcmVhZCk7CisKK2V4dGVybiBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKSBzc2l6ZV90CityZWFkIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcykKK3sKKyAgaWYgKF9fc3NwX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSAmJiBfX25ieXRlcyA+IF9fc3NwX2JvczAgKF9fYnVmKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19yZWFkX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMpOworfQorCitleHRlcm4gaW50IF9fU1NQX1JFRElSRUNUIChfX3JlYWRsaW5rX2FsaWFzLAorCQkJICAgKGNvbnN0IGNoYXIgKl9fcmVzdHJpY3RfXyBfX3BhdGgsCisJCQkgICAgY2hhciAqX19yZXN0cmljdF9fIF9fYnVmLCBzaXplX3QgX19sZW4pLAorCQkJICAgcmVhZGxpbmspOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgaW50CityZWFkbGluayAoY29uc3QgY2hhciAqX19yZXN0cmljdF9fIF9fcGF0aCwgY2hhciAqX19yZXN0cmljdF9fIF9fYnVmLAorCSAgc2l6ZV90IF9fbGVuKQoreworICBpZiAoX19zc3BfYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEgJiYgX19sZW4gPiBfX3NzcF9ib3MgKF9fYnVmKSkKKyAgICBfX2Noa19mYWlsICgpOworICByZXR1cm4gX19yZWFkbGlua19hbGlhcyAoX19wYXRoLCBfX2J1ZiwgX19sZW4pOworfQorCitleHRlcm4gY2hhciAqX19TU1BfUkVESVJFQ1QgKF9fZ2V0Y3dkX2FsaWFzLAorCQkJICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpLCBnZXRjd2QpOworCitleHRlcm4gaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkgY2hhciAqCitnZXRjd2QgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplKQoreworICBpZiAoX19zc3BfYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEgJiYgX19zaXplID4gX19zc3BfYm9zIChfX2J1ZikpCisgICAgX19jaGtfZmFpbCAoKTsKKyAgcmV0dXJuIF9fZ2V0Y3dkX2FsaWFzIChfX2J1ZiwgX19zaXplKTsKK30KKworI2VuZGlmIC8qIF9fU1NQX0ZPUlRJRllfTEVWRUwgPiAwICovCisjZW5kaWYgLyogX1NTUF9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkYXJnLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zdGRhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRjMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkYXJnLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk4OSwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy4xNSAgVmFyaWFibGUgYXJndW1lbnRzICA8c3RkYXJnLmg+CisgKi8KKworI2lmbmRlZiBfU1REQVJHX0gKKyNpZm5kZWYgX0FOU0lfU1REQVJHX0hfCisjaWZuZGVmIF9fbmVlZF9fX3ZhX2xpc3QKKyNkZWZpbmUgX1NUREFSR19ICisjZGVmaW5lIF9BTlNJX1NUREFSR19IXworI2VuZGlmIC8qIG5vdCBfX25lZWRfX192YV9saXN0ICovCisjdW5kZWYgX19uZWVkX19fdmFfbGlzdAorCisvKiBEZWZpbmUgX19nbnVjX3ZhX2xpc3QuICAqLworCisjaWZuZGVmIF9fR05VQ19WQV9MSVNUCisjZGVmaW5lIF9fR05VQ19WQV9MSVNUCit0eXBlZGVmIF9fYnVpbHRpbl92YV9saXN0IF9fZ251Y192YV9saXN0OworI2VuZGlmCisKKy8qIERlZmluZSB0aGUgc3RhbmRhcmQgbWFjcm9zIGZvciB0aGUgdXNlciwKKyAgIGlmIHRoaXMgaW52b2NhdGlvbiB3YXMgZnJvbSB0aGUgdXNlciBwcm9ncmFtLiAgKi8KKyNpZmRlZiBfU1REQVJHX0gKKworI2RlZmluZSB2YV9zdGFydCh2LGwpCV9fYnVpbHRpbl92YV9zdGFydCh2LGwpCisjZGVmaW5lIHZhX2VuZCh2KQlfX2J1aWx0aW5fdmFfZW5kKHYpCisjZGVmaW5lIHZhX2FyZyh2LGwpCV9fYnVpbHRpbl92YV9hcmcodixsKQorI2lmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykgfHwgX19TVERDX1ZFUlNJT05fXyArIDAgPj0gMTk5OTAwTCB8fCBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorI2RlZmluZSB2YV9jb3B5KGQscykJX19idWlsdGluX3ZhX2NvcHkoZCxzKQorI2VuZGlmCisjZGVmaW5lIF9fdmFfY29weShkLHMpCV9fYnVpbHRpbl92YV9jb3B5KGQscykKKworLyogRGVmaW5lIHZhX2xpc3QsIGlmIGRlc2lyZWQsIGZyb20gX19nbnVjX3ZhX2xpc3QuICovCisvKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IGRlZmluZSB2YV9saXN0IHdoZW4gY2FsbGVkIGZyb20KKyAgIHN0ZGlvLmgsIGJlY2F1c2UgQU5TSSBDIHNheXMgdGhhdCBzdGRpby5oIGlzIG5vdCBzdXBwb3NlZCB0byBkZWZpbmUKKyAgIHZhX2xpc3QuICBzdGRpby5oIG5lZWRzIHRvIGhhdmUgYWNjZXNzIHRvIHRoYXQgZGF0YSB0eXBlLCAKKyAgIGJ1dCBtdXN0IG5vdCB1c2UgdGhhdCBuYW1lLiAgSXQgc2hvdWxkIHVzZSB0aGUgbmFtZSBfX2dudWNfdmFfbGlzdCwKKyAgIHdoaWNoIGlzIHNhZmUgYmVjYXVzZSBpdCBpcyByZXNlcnZlZCBmb3IgdGhlIGltcGxlbWVudGF0aW9uLiAgKi8KKworI2lmZGVmIF9ISURERU5fVkFfTElTVCAgLyogT24gT1NGMSwgdGhpcyBtZWFucyB2YXJhcmdzLmggaXMgImhhbGYtbG9hZGVkIi4gICovCisjdW5kZWYgX1ZBX0xJU1QKKyNlbmRpZgorCisjaWZkZWYgX0JTRF9WQV9MSVNUCisjdW5kZWYgX0JTRF9WQV9MSVNUCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19zdnI0X18pIHx8IChkZWZpbmVkKF9TQ09fRFMpICYmICFkZWZpbmVkKF9fVkFfTElTVCkpCisvKiBTVlI0LjIgdXNlcyBfVkFfTElTVCBmb3IgYW4gaW50ZXJuYWwgYWxpYXMgZm9yIHZhX2xpc3QsCisgICBzbyB3ZSBtdXN0IGF2b2lkIHRlc3RpbmcgaXQgYW5kIHNldHRpbmcgaXQgaGVyZS4KKyAgIFNWUjQgdXNlcyBfVkFfTElTVCBhcyBhIGZsYWcgaW4gc3RkYXJnLmgsIGJ1dCB3ZSBzaG91bGQKKyAgIGhhdmUgbm8gY29uZmxpY3Qgd2l0aCB0aGF0LiAgKi8KKyNpZm5kZWYgX1ZBX0xJU1RfCisjZGVmaW5lIF9WQV9MSVNUXworI2lmZGVmIF9faTg2MF9fCisjaWZuZGVmIF9WQV9MSVNUCisjZGVmaW5lIF9WQV9MSVNUIHZhX2xpc3QKKyNlbmRpZgorI2VuZGlmIC8qIF9faTg2MF9fICovCit0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CisjaWZkZWYgX1NDT19EUworI2RlZmluZSBfX1ZBX0xJU1QKKyNlbmRpZgorI2VuZGlmIC8qIF9WQV9MSVNUXyAqLworI2Vsc2UgLyogbm90IF9fc3ZyNF9fIHx8IF9TQ09fRFMgKi8KKworLyogVGhlIG1hY3JvIF9WQV9MSVNUXyBpcyB0aGUgc2FtZSB0aGluZyB1c2VkIGJ5IHRoaXMgZmlsZSBpbiBVbHRyaXguCisgICBCdXQgb24gQlNEIE5FVDIgd2UgbXVzdCBub3QgdGVzdCBvciBkZWZpbmUgb3IgdW5kZWYgaXQuCisgICAoTm90ZSB0aGF0IHRoZSBjb21tZW50cyBpbiBORVQgMidzIGFuc2kuaAorICAgYXJlIGluY29ycmVjdCBmb3IgX1ZBX0xJU1RfLS1zZWUgc3RkaW8uaCEpICAqLworI2lmICFkZWZpbmVkIChfVkFfTElTVF8pIHx8IGRlZmluZWQgKF9fQlNEX05FVDJfXykgfHwgZGVmaW5lZCAoX19fXzM4NkJTRF9fX18pIHx8IGRlZmluZWQgKF9fYnNkaV9fKSB8fCBkZWZpbmVkIChfX3NlcXVlbnRfXykgfHwgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoV0lOTlQpCisvKiBUaGUgbWFjcm8gX1ZBX0xJU1RfREVGSU5FRCBpcyB1c2VkIGluIFdpbmRvd3MgTlQgMy41ICAqLworI2lmbmRlZiBfVkFfTElTVF9ERUZJTkVECisvKiBUaGUgbWFjcm8gX1ZBX0xJU1QgaXMgdXNlZCBpbiBTQ08gVW5peCAzLjIuICAqLworI2lmbmRlZiBfVkFfTElTVAorLyogVGhlIG1hY3JvIF9WQV9MSVNUX1RfSCBpcyB1c2VkIGluIHRoZSBCdWxsIGRweDIgICovCisjaWZuZGVmIF9WQV9MSVNUX1RfSAorLyogVGhlIG1hY3JvIF9fdmFfbGlzdF9fIGlzIHVzZWQgYnkgQmVPUy4gICovCisjaWZuZGVmIF9fdmFfbGlzdF9fCit0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CisjZW5kaWYgLyogbm90IF9fdmFfbGlzdF9fICovCisjZW5kaWYgLyogbm90IF9WQV9MSVNUX1RfSCAqLworI2VuZGlmIC8qIG5vdCBfVkFfTElTVCAqLworI2VuZGlmIC8qIG5vdCBfVkFfTElTVF9ERUZJTkVEICovCisjaWYgIShkZWZpbmVkIChfX0JTRF9ORVQyX18pIHx8IGRlZmluZWQgKF9fX18zODZCU0RfX19fKSB8fCBkZWZpbmVkIChfX2JzZGlfXykgfHwgZGVmaW5lZCAoX19zZXF1ZW50X18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSkKKyNkZWZpbmUgX1ZBX0xJU1RfCisjZW5kaWYKKyNpZm5kZWYgX1ZBX0xJU1QKKyNkZWZpbmUgX1ZBX0xJU1QKKyNlbmRpZgorI2lmbmRlZiBfVkFfTElTVF9ERUZJTkVECisjZGVmaW5lIF9WQV9MSVNUX0RFRklORUQKKyNlbmRpZgorI2lmbmRlZiBfVkFfTElTVF9UX0gKKyNkZWZpbmUgX1ZBX0xJU1RfVF9ICisjZW5kaWYKKyNpZm5kZWYgX192YV9saXN0X18KKyNkZWZpbmUgX192YV9saXN0X18KKyNlbmRpZgorCisjZW5kaWYgLyogbm90IF9WQV9MSVNUXywgZXhjZXB0IG9uIGNlcnRhaW4gc3lzdGVtcyAqLworCisjZW5kaWYgLyogbm90IF9fc3ZyNF9fICovCisKKyNlbmRpZiAvKiBfU1REQVJHX0ggKi8KKworI2VuZGlmIC8qIG5vdCBfQU5TSV9TVERBUkdfSF8gKi8KKyNlbmRpZiAvKiBub3QgX1NUREFSR19IICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zdGRib29sLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zdGRib29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkOTExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3N0ZGJvb2wuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgKiBJU08gQyBTdGFuZGFyZDogIDcuMTYgIEJvb2xlYW4gdHlwZSBhbmQgdmFsdWVzICA8c3RkYm9vbC5oPgorICovCisKKyNpZm5kZWYgX1NUREJPT0xfSAorI2RlZmluZSBfU1REQk9PTF9ICisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2RlZmluZSBib29sCV9Cb29sCisjZGVmaW5lIHRydWUJMQorI2RlZmluZSBmYWxzZQkwCisKKyNlbHNlIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIFN1cHBvcnRpbmcgPHN0ZGJvb2wuaD4gaW4gQysrIGlzIGEgR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIF9Cb29sCWJvb2wKKyNkZWZpbmUgYm9vbAlib29sCisjZGVmaW5lIGZhbHNlCWZhbHNlCisjZGVmaW5lIHRydWUJdHJ1ZQorCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyogU2lnbmFsIHRoYXQgYWxsIHRoZSBkZWZpbml0aW9ucyBhcmUgcHJlc2VudC4gICovCisjZGVmaW5lIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCTEKKworI2VuZGlmCS8qIHN0ZGJvb2wuaCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkZGVmLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zdGRkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjVlZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkZGVmLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qIENvcHlyaWdodCAoQykgMTk4OSwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAwNCwgMjAwOQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qCisgKiBJU08gQyBTdGFuZGFyZDogIDcuMTcgIENvbW1vbiBkZWZpbml0aW9ucyAgPHN0ZGRlZi5oPgorICovCisjaWYgKCFkZWZpbmVkKF9TVERERUZfSCkgJiYgIWRlZmluZWQoX1NURERFRl9IXykgJiYgIWRlZmluZWQoX0FOU0lfU1REREVGX0gpIFwKKyAgICAgJiYgIWRlZmluZWQoX19TVERERUZfSF9fKSkgXAorICAgIHx8IGRlZmluZWQoX19uZWVkX3djaGFyX3QpIHx8IGRlZmluZWQoX19uZWVkX3NpemVfdCkgXAorICAgIHx8IGRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgfHwgZGVmaW5lZChfX25lZWRfTlVMTCkgXAorICAgIHx8IGRlZmluZWQoX19uZWVkX3dpbnRfdCkKKworLyogQW55IG9uZSBvZiB0aGVzZSBzeW1ib2xzIF9fbmVlZF8qIG1lYW5zIHRoYXQgR05VIGxpYmMKKyAgIHdhbnRzIHVzIGp1c3QgdG8gZGVmaW5lIG9uZSBkYXRhIHR5cGUuICBTbyBkb24ndCBkZWZpbmUKKyAgIHRoZSBzeW1ib2xzIHRoYXQgaW5kaWNhdGUgdGhpcyBmaWxlJ3MgZW50aXJlIGpvYiBoYXMgYmVlbiBkb25lLiAgKi8KKyNpZiAoIWRlZmluZWQoX19uZWVkX3djaGFyX3QpICYmICFkZWZpbmVkKF9fbmVlZF9zaXplX3QpCVwKKyAgICAgJiYgIWRlZmluZWQoX19uZWVkX3B0cmRpZmZfdCkgJiYgIWRlZmluZWQoX19uZWVkX05VTEwpCVwKKyAgICAgJiYgIWRlZmluZWQoX19uZWVkX3dpbnRfdCkpCisjZGVmaW5lIF9TVERERUZfSAorI2RlZmluZSBfU1REREVGX0hfCisvKiBzbmFyb2ZmQG5leHQuY29tIHNheXMgdGhlIE5lWFQgbmVlZHMgdGhpcy4gICovCisjZGVmaW5lIF9BTlNJX1NURERFRl9ICisvKiBJcml4IDUuMSBuZWVkcyB0aGlzLiAgKi8KKyNkZWZpbmUgX19TVERERUZfSF9fCisjZW5kaWYKKworI2lmbmRlZiBfX3N5c19zdGR0eXBlc19oCisvKiBUaGlzIGF2b2lkcyBsb3NzYWdlIG9uIFN1bk9TIGJ1dCBvbmx5IGlmIHN0ZHR5cGVzLmggY29tZXMgZmlyc3QuCisgICBUaGVyZSdzIG5vIHdheSB0byB3aW4gd2l0aCB0aGUgb3RoZXIgb3JkZXIhICBTdW4gbG9zc2FnZS4gICovCisKKy8qIE9uIDQuM2JzZC1uZXQyLCBtYWtlIHN1cmUgYW5zaS5oIGlzIGluY2x1ZGVkLCBzbyB3ZSBoYXZlCisgICBvbmUgbGVzcyBjYXNlIHRvIGRlYWwgd2l0aCBpbiB0aGUgZm9sbG93aW5nLiAgKi8KKyNpZiBkZWZpbmVkIChfX0JTRF9ORVQyX18pIHx8IGRlZmluZWQgKF9fX18zODZCU0RfX19fKSB8fCAoZGVmaW5lZCAoX19GcmVlQlNEX18pICYmIChfX0ZyZWVCU0RfXyA8IDUpKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCisjaW5jbHVkZSA8bWFjaGluZS9hbnNpLmg+CisjZW5kaWYKKy8qIE9uIEZyZWVCU0QgNSwgbWFjaGluZS9hbnNpLmggZG9lcyBub3QgZXhpc3QgYW55bW9yZS4uLiAqLworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX18gPj0gNSkKKyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisjZW5kaWYKKworLyogSW4gNC4zYnNkLW5ldDIsIG1hY2hpbmUvYW5zaS5oIGRlZmluZXMgdGhlc2Ugc3ltYm9scywgd2hpY2ggYXJlCisgICBkZWZpbmVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgaXMgKm5vdCogZGVmaW5lZC4KKyAgIEZyZWVCU0QtMi4xIGRlZmluZXMgX01BQ0hJTkVfQU5TSV9IXyBpbnN0ZWFkIG9mIF9BTlNJX0hfLgorICAgTmV0QlNEIGRlZmluZXMgX0kzODZfQU5TSV9IXyBhbmQgX1g4Nl82NF9BTlNJX0hfIGluc3RlYWQgb2YgX0FOU0lfSF8gKi8KKyNpZiBkZWZpbmVkKF9BTlNJX0hfKSB8fCBkZWZpbmVkKF9NQUNISU5FX0FOU0lfSF8pIHx8IGRlZmluZWQoX1g4Nl82NF9BTlNJX0hfKSAgfHwgZGVmaW5lZChfSTM4Nl9BTlNJX0hfKQorI2lmICFkZWZpbmVkKF9TSVpFX1RfKSAmJiAhZGVmaW5lZChfQlNEX1NJWkVfVF8pCisjZGVmaW5lIF9TSVpFX1QKKyNlbmRpZgorI2lmICFkZWZpbmVkKF9QVFJESUZGX1RfKSAmJiAhZGVmaW5lZChfQlNEX1BUUkRJRkZfVF8pCisjZGVmaW5lIF9QVFJESUZGX1QKKyNlbmRpZgorLyogT24gQlNELzM4NiAxLjEsIGF0IGxlYXN0LCBtYWNoaW5lL2Fuc2kuaCBkZWZpbmVzIF9CU0RfV0NIQVJfVF8KKyAgIGluc3RlYWQgb2YgX1dDSEFSX1RfLiAqLworI2lmICFkZWZpbmVkKF9XQ0hBUl9UXykgJiYgIWRlZmluZWQoX0JTRF9XQ0hBUl9UXykKKyNpZm5kZWYgX0JTRF9XQ0hBUl9UXworI2RlZmluZSBfV0NIQVJfVAorI2VuZGlmCisjZW5kaWYKKy8qIFVuZGVmIF9GT09fVF8gaWYgd2UgYXJlIHN1cHBvc2VkIHRvIGRlZmluZSBmb29fdC4gICovCisjaWYgZGVmaW5lZCAoX19uZWVkX3B0cmRpZmZfdCkgfHwgZGVmaW5lZCAoX1NURERFRl9IXykKKyN1bmRlZiBfUFRSRElGRl9UXworI3VuZGVmIF9CU0RfUFRSRElGRl9UXworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19uZWVkX3NpemVfdCkgfHwgZGVmaW5lZCAoX1NURERFRl9IXykKKyN1bmRlZiBfU0laRV9UXworI3VuZGVmIF9CU0RfU0laRV9UXworI2VuZGlmCisjaWYgZGVmaW5lZCAoX19uZWVkX3djaGFyX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pCisjdW5kZWYgX1dDSEFSX1RfCisjdW5kZWYgX0JTRF9XQ0hBUl9UXworI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZChfQU5TSV9IXykgfHwgZGVmaW5lZChfTUFDSElORV9BTlNJX0hfKSB8fCBkZWZpbmVkKF9YODZfNjRfQU5TSV9IXykgfHwgZGVmaW5lZChfSTM4Nl9BTlNJX0hfKSAqLworCisvKiBTZXF1ZW50J3MgaGVhZGVyIGZpbGVzIHVzZSBfUFRSRElGRl9UXyBpbiBzb21lIGNvbmZsaWN0aW5nIHdheS4KKyAgIEp1c3QgaWdub3JlIGl0LiAgKi8KKyNpZiBkZWZpbmVkIChfX3NlcXVlbnRfXykgJiYgZGVmaW5lZCAoX1BUUkRJRkZfVF8pCisjdW5kZWYgX1BUUkRJRkZfVF8KKyNlbmRpZgorCisvKiBPbiBWeFdvcmtzLCA8dHlwZS92eFR5cGVzQmFzZS5oPiBtYXkgaGF2ZSBkZWZpbmVkIG1hY3JvcyBsaWtlCisgICBfVFlQRV9zaXplX3Qgd2hpY2ggd2lsbCB0eXBlZGVmIHNpemVfdC4gIGZpeGluY2x1ZGVzIHBhdGNoZWQgdGhlCisgICB2eFR5cGVzQmFzZS5oIHNvIHRoYXQgdGhpcyBtYWNybyBpcyBvbmx5IGRlZmluZWQgaWYgX0dDQ19TSVpFX1QgaXMKKyAgIG5vdCBkZWZpbmVkLCBhbmQgc28gdGhhdCBkZWZpbmluZyB0aGlzIG1hY3JvIGRlZmluZXMgX0dDQ19TSVpFX1QuCisgICBJZiB3ZSBmaW5kIHRoYXQgdGhlIG1hY3JvcyBhcmUgc3RpbGwgZGVmaW5lZCBhdCB0aGlzIHBvaW50LCB3ZSBtdXN0CisgICBpbnZva2UgdGhlbSBzbyB0aGF0IHRoZSB0eXBlIGlzIGRlZmluZWQgYXMgZXhwZWN0ZWQuICAqLworI2lmIGRlZmluZWQgKF9UWVBFX3B0cmRpZmZfdCkgJiYgKGRlZmluZWQgKF9fbmVlZF9wdHJkaWZmX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pKQorX1RZUEVfcHRyZGlmZl90OworI3VuZGVmIF9UWVBFX3B0cmRpZmZfdAorI2VuZGlmCisjaWYgZGVmaW5lZCAoX1RZUEVfc2l6ZV90KSAmJiAoZGVmaW5lZCAoX19uZWVkX3NpemVfdCkgfHwgZGVmaW5lZCAoX1NURERFRl9IXykpCitfVFlQRV9zaXplX3Q7CisjdW5kZWYgX1RZUEVfc2l6ZV90CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfVFlQRV93Y2hhcl90KSAmJiAoZGVmaW5lZCAoX19uZWVkX3djaGFyX3QpIHx8IGRlZmluZWQgKF9TVERERUZfSF8pKQorX1RZUEVfd2NoYXJfdDsKKyN1bmRlZiBfVFlQRV93Y2hhcl90CisjZW5kaWYKKworLyogSW4gY2FzZSBub2JvZHkgaGFzIGRlZmluZWQgdGhlc2UgdHlwZXMsIGJ1dCB3ZSBhcmVuJ3QgcnVubmluZyB1bmRlcgorICAgR0NDIDIuMDAsIG1ha2Ugc3VyZSB0aGF0IF9fUFRSRElGRl9UWVBFX18sIF9fU0laRV9UWVBFX18sIGFuZAorICAgX19XQ0hBUl9UWVBFX18gaGF2ZSByZWFzb25hYmxlIHZhbHVlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUKKyAgIHBhcnRzIG9mIEdDQyBpcyBjb21waWxlZCBieSBhbiBvbGRlciBjb21waWxlciwgdGhhdCBhY3R1YWxseQorICAgaW5jbHVkZSBnc3RkZGVmLmgsIHN1Y2ggYXMgY29sbGVjdDIuICAqLworCisvKiBTaWduZWQgdHlwZSBvZiBkaWZmZXJlbmNlIG9mIHR3byBwb2ludGVycy4gICovCisKKy8qIERlZmluZSB0aGlzIHR5cGUgaWYgd2UgYXJlIGRvaW5nIHRoZSB3aG9sZSBqb2IsCisgICBvciBpZiB3ZSB3YW50IHRoaXMgdHlwZSBpbiBwYXJ0aWN1bGFyLiAgKi8KKyNpZiBkZWZpbmVkIChfU1REREVGX0gpIHx8IGRlZmluZWQgKF9fbmVlZF9wdHJkaWZmX3QpCisjaWZuZGVmIF9QVFJESUZGX1QJLyogaW4gY2FzZSA8c3lzL3R5cGVzLmg+IGhhcyBkZWZpbmVkIGl0LiAqLworI2lmbmRlZiBfVF9QVFJESUZGXworI2lmbmRlZiBfVF9QVFJESUZGCisjaWZuZGVmIF9fUFRSRElGRl9UCisjaWZuZGVmIF9QVFJESUZGX1RfCisjaWZuZGVmIF9CU0RfUFRSRElGRl9UXworI2lmbmRlZiBfX19pbnRfcHRyZGlmZl90X2gKKyNpZm5kZWYgX0dDQ19QVFJESUZGX1QKKyNkZWZpbmUgX1BUUkRJRkZfVAorI2RlZmluZSBfVF9QVFJESUZGXworI2RlZmluZSBfVF9QVFJESUZGCisjZGVmaW5lIF9fUFRSRElGRl9UCisjZGVmaW5lIF9QVFJESUZGX1RfCisjZGVmaW5lIF9CU0RfUFRSRElGRl9UXworI2RlZmluZSBfX19pbnRfcHRyZGlmZl90X2gKKyNkZWZpbmUgX0dDQ19QVFJESUZGX1QKKyNpZm5kZWYgX19QVFJESUZGX1RZUEVfXworI2RlZmluZSBfX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50CisjZW5kaWYKK3R5cGVkZWYgX19QVFJESUZGX1RZUEVfXyBwdHJkaWZmX3Q7CisjZW5kaWYgLyogX0dDQ19QVFJESUZGX1QgKi8KKyNlbmRpZiAvKiBfX19pbnRfcHRyZGlmZl90X2ggKi8KKyNlbmRpZiAvKiBfQlNEX1BUUkRJRkZfVF8gKi8KKyNlbmRpZiAvKiBfUFRSRElGRl9UXyAqLworI2VuZGlmIC8qIF9fUFRSRElGRl9UICovCisjZW5kaWYgLyogX1RfUFRSRElGRiAqLworI2VuZGlmIC8qIF9UX1BUUkRJRkZfICovCisjZW5kaWYgLyogX1BUUkRJRkZfVCAqLworCisvKiBJZiB0aGlzIHN5bWJvbCBoYXMgZG9uZSBpdHMgam9iLCBnZXQgcmlkIG9mIGl0LiAgKi8KKyN1bmRlZglfX25lZWRfcHRyZGlmZl90CisKKyNlbmRpZiAvKiBfU1REREVGX0ggb3IgX19uZWVkX3B0cmRpZmZfdC4gICovCisKKy8qIFVuc2lnbmVkIHR5cGUgb2YgYHNpemVvZicgc29tZXRoaW5nLiAgKi8KKworLyogRGVmaW5lIHRoaXMgdHlwZSBpZiB3ZSBhcmUgZG9pbmcgdGhlIHdob2xlIGpvYiwKKyAgIG9yIGlmIHdlIHdhbnQgdGhpcyB0eXBlIGluIHBhcnRpY3VsYXIuICAqLworI2lmIGRlZmluZWQgKF9TVERERUZfSCkgfHwgZGVmaW5lZCAoX19uZWVkX3NpemVfdCkKKyNpZm5kZWYgX19zaXplX3RfXwkvKiBCZU9TICovCisjaWZuZGVmIF9fU0laRV9UX18JLyogQ3JheSBVbmljb3MvTWsgKi8KKyNpZm5kZWYgX1NJWkVfVAkvKiBpbiBjYXNlIDxzeXMvdHlwZXMuaD4gaGFzIGRlZmluZWQgaXQuICovCisjaWZuZGVmIF9TWVNfU0laRV9UX0gKKyNpZm5kZWYgX1RfU0laRV8KKyNpZm5kZWYgX1RfU0laRQorI2lmbmRlZiBfX1NJWkVfVAorI2lmbmRlZiBfU0laRV9UXworI2lmbmRlZiBfQlNEX1NJWkVfVF8KKyNpZm5kZWYgX1NJWkVfVF9ERUZJTkVEXworI2lmbmRlZiBfU0laRV9UX0RFRklORUQKKyNpZm5kZWYgX0JTRF9TSVpFX1RfREVGSU5FRF8JLyogRGFyd2luICovCisjaWZuZGVmIF9TSVpFX1RfREVDTEFSRUQJLyogRnJlZUJTRCA1ICovCisjaWZuZGVmIF9fX2ludF9zaXplX3RfaAorI2lmbmRlZiBfR0NDX1NJWkVfVAorI2lmbmRlZiBfU0laRVRfCisjaWZuZGVmIF9fc2l6ZV90CisjZGVmaW5lIF9fc2l6ZV90X18JLyogQmVPUyAqLworI2RlZmluZSBfX1NJWkVfVF9fCS8qIENyYXkgVW5pY29zL01rICovCisjZGVmaW5lIF9TSVpFX1QKKyNkZWZpbmUgX1NZU19TSVpFX1RfSAorI2RlZmluZSBfVF9TSVpFXworI2RlZmluZSBfVF9TSVpFCisjZGVmaW5lIF9fU0laRV9UCisjZGVmaW5lIF9TSVpFX1RfCisjZGVmaW5lIF9CU0RfU0laRV9UXworI2RlZmluZSBfU0laRV9UX0RFRklORURfCisjZGVmaW5lIF9TSVpFX1RfREVGSU5FRAorI2RlZmluZSBfQlNEX1NJWkVfVF9ERUZJTkVEXwkvKiBEYXJ3aW4gKi8KKyNkZWZpbmUgX1NJWkVfVF9ERUNMQVJFRAkvKiBGcmVlQlNEIDUgKi8KKyNkZWZpbmUgX19faW50X3NpemVfdF9oCisjZGVmaW5lIF9HQ0NfU0laRV9UCisjZGVmaW5lIF9TSVpFVF8KKyNpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgJiYgKF9fRnJlZUJTRF9fID49IDUpCisvKiBfX3NpemVfdCBpcyBhIHR5cGVkZWYgb24gRnJlZUJTRCA1ISwgbXVzdCBub3QgdHJhc2ggaXQuICovCisjZWxzZQorI2RlZmluZSBfX3NpemVfdAorI2VuZGlmCisjaWZuZGVmIF9fU0laRV9UWVBFX18KKyNkZWZpbmUgX19TSVpFX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAorI2VuZGlmCisjaWYgIShkZWZpbmVkIChfX0dOVUdfXykgJiYgZGVmaW5lZCAoc2l6ZV90KSkKK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7CisjaWZkZWYgX19CRU9TX18KK3R5cGVkZWYgbG9uZyBzc2l6ZV90OworI2VuZGlmIC8qIF9fQkVPU19fICovCisjZW5kaWYgLyogIShkZWZpbmVkIChfX0dOVUdfXykgJiYgZGVmaW5lZCAoc2l6ZV90KSkgKi8KKyNlbmRpZiAvKiBfX3NpemVfdCAqLworI2VuZGlmIC8qIF9TSVpFVF8gKi8KKyNlbmRpZiAvKiBfR0NDX1NJWkVfVCAqLworI2VuZGlmIC8qIF9fX2ludF9zaXplX3RfaCAqLworI2VuZGlmIC8qIF9TSVpFX1RfREVDTEFSRUQgKi8KKyNlbmRpZiAvKiBfQlNEX1NJWkVfVF9ERUZJTkVEXyAqLworI2VuZGlmIC8qIF9TSVpFX1RfREVGSU5FRCAqLworI2VuZGlmIC8qIF9TSVpFX1RfREVGSU5FRF8gKi8KKyNlbmRpZiAvKiBfQlNEX1NJWkVfVF8gKi8KKyNlbmRpZiAvKiBfU0laRV9UXyAqLworI2VuZGlmIC8qIF9fU0laRV9UICovCisjZW5kaWYgLyogX1RfU0laRSAqLworI2VuZGlmIC8qIF9UX1NJWkVfICovCisjZW5kaWYgLyogX1NZU19TSVpFX1RfSCAqLworI2VuZGlmIC8qIF9TSVpFX1QgKi8KKyNlbmRpZiAvKiBfX1NJWkVfVF9fICovCisjZW5kaWYgLyogX19zaXplX3RfXyAqLworI3VuZGVmCV9fbmVlZF9zaXplX3QKKyNlbmRpZiAvKiBfU1REREVGX0ggb3IgX19uZWVkX3NpemVfdC4gICovCisKKworLyogV2lkZSBjaGFyYWN0ZXIgdHlwZS4KKyAgIExvY2FsZS13cml0ZXJzIHNob3VsZCBjaGFuZ2UgdGhpcyBhcyBuZWNlc3NhcnkgdG8KKyAgIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCB1bmlxdWUgdmFsdWVzIG5vdCBiZXR3ZWVuIDAgYW5kIDEyNywKKyAgIGFuZCBub3QgKHdjaGFyX3QpIC0xLCBmb3IgZWFjaCBkZWZpbmVkIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICAqLworCisvKiBEZWZpbmUgdGhpcyB0eXBlIGlmIHdlIGFyZSBkb2luZyB0aGUgd2hvbGUgam9iLAorICAgb3IgaWYgd2Ugd2FudCB0aGlzIHR5cGUgaW4gcGFydGljdWxhci4gICovCisjaWYgZGVmaW5lZCAoX1NURERFRl9IKSB8fCBkZWZpbmVkIChfX25lZWRfd2NoYXJfdCkKKyNpZm5kZWYgX193Y2hhcl90X18JLyogQmVPUyAqLworI2lmbmRlZiBfX1dDSEFSX1RfXwkvKiBDcmF5IFVuaWNvcy9NayAqLworI2lmbmRlZiBfV0NIQVJfVAorI2lmbmRlZiBfVF9XQ0hBUl8KKyNpZm5kZWYgX1RfV0NIQVIKKyNpZm5kZWYgX19XQ0hBUl9UCisjaWZuZGVmIF9XQ0hBUl9UXworI2lmbmRlZiBfQlNEX1dDSEFSX1RfCisjaWZuZGVmIF9CU0RfV0NIQVJfVF9ERUZJTkVEXyAgICAvKiBEYXJ3aW4gKi8KKyNpZm5kZWYgX0JTRF9SVU5FX1RfREVGSU5FRF8JLyogRGFyd2luICovCisjaWZuZGVmIF9XQ0hBUl9UX0RFQ0xBUkVEIC8qIEZyZWVCU0QgNSAqLworI2lmbmRlZiBfV0NIQVJfVF9ERUZJTkVEXworI2lmbmRlZiBfV0NIQVJfVF9ERUZJTkVECisjaWZuZGVmIF9XQ0hBUl9UX0gKKyNpZm5kZWYgX19faW50X3djaGFyX3RfaAorI2lmbmRlZiBfX0lOVF9XQ0hBUl9UX0gKKyNpZm5kZWYgX0dDQ19XQ0hBUl9UCisjZGVmaW5lIF9fd2NoYXJfdF9fCS8qIEJlT1MgKi8KKyNkZWZpbmUgX19XQ0hBUl9UX18JLyogQ3JheSBVbmljb3MvTWsgKi8KKyNkZWZpbmUgX1dDSEFSX1QKKyNkZWZpbmUgX1RfV0NIQVJfCisjZGVmaW5lIF9UX1dDSEFSCisjZGVmaW5lIF9fV0NIQVJfVAorI2RlZmluZSBfV0NIQVJfVF8KKyNkZWZpbmUgX0JTRF9XQ0hBUl9UXworI2RlZmluZSBfV0NIQVJfVF9ERUZJTkVEXworI2RlZmluZSBfV0NIQVJfVF9ERUZJTkVECisjZGVmaW5lIF9XQ0hBUl9UX0gKKyNkZWZpbmUgX19faW50X3djaGFyX3RfaAorI2RlZmluZSBfX0lOVF9XQ0hBUl9UX0gKKyNkZWZpbmUgX0dDQ19XQ0hBUl9UCisjZGVmaW5lIF9XQ0hBUl9UX0RFQ0xBUkVECisKKy8qIE9uIEJTRC8zODYgMS4xLCBhdCBsZWFzdCwgbWFjaGluZS9hbnNpLmggZGVmaW5lcyBfQlNEX1dDSEFSX1RfCisgICBpbnN0ZWFkIG9mIF9XQ0hBUl9UXywgYW5kIF9CU0RfUlVORV9UXyAod2hpY2gsIHVubGlrZSB0aGUgb3RoZXIKKyAgIHN5bWJvbHMgaW4gdGhlIF9GT09fVF8gZmFtaWx5LCBzdGF5cyBkZWZpbmVkIGV2ZW4gYWZ0ZXIgaXRzCisgICBjb3JyZXNwb25kaW5nIHR5cGUgaXMgZGVmaW5lZCkuICBJZiB3ZSBkZWZpbmUgd2NoYXJfdCwgdGhlbiB3ZQorICAgbXVzdCB1bmRlZiBfV0NIQVJfVF87IGZvciBCU0QvMzg2IDEuMSAoYW5kIHBlcmhhcHMgb3RoZXJzKSwgaWYKKyAgIHdlIHVuZGVmIF9XQ0hBUl9UXywgdGhlbiB3ZSBtdXN0IGFsc28gZGVmaW5lIHJ1bmVfdCwgc2luY2UgCisgICBoZWFkZXJzIGxpa2UgcnVuZXR5cGUuaCBhc3N1bWUgdGhhdCBpZiBtYWNoaW5lL2Fuc2kuaCBpcyBpbmNsdWRlZCwKKyAgIGFuZCBfQlNEX1dDSEFSX1RfIGlzIG5vdCBkZWZpbmVkLCB0aGVuIHJ1bmVfdCBpcyBhdmFpbGFibGUuCisgICBtYWNoaW5lL2Fuc2kuaCBzYXlzLCAiTm90ZSB0aGF0IF9XQ0hBUl9UXyBhbmQgX1JVTkVfVF8gbXVzdCBiZSBvZgorICAgdGhlIHNhbWUgdHlwZS4iICovCisjaWZkZWYgX0JTRF9XQ0hBUl9UXworI3VuZGVmIF9CU0RfV0NIQVJfVF8KKyNpZmRlZiBfQlNEX1JVTkVfVF8KKyNpZiAhZGVmaW5lZCAoX0FOU0lfU09VUkNFKSAmJiAhZGVmaW5lZCAoX1BPU0lYX1NPVVJDRSkKK3R5cGVkZWYgX0JTRF9SVU5FX1RfIHJ1bmVfdDsKKyNkZWZpbmUgX0JTRF9XQ0hBUl9UX0RFRklORURfCisjZGVmaW5lIF9CU0RfUlVORV9UX0RFRklORURfCS8qIERhcndpbiAqLworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSAmJiAoX19GcmVlQlNEX18gPCA1KQorLyogV2h5IGlzIHRoaXMgZmlsZSBzbyBoYXJkIHRvIG1haW50YWluIHByb3Blcmx5PyAgSW4gY29udHJhc3QgdG8KKyAgIHRoZSBjb21tZW50IGFib3ZlIHJlZ2FyZGluZyBCU0QvMzg2IDEuMSwgb24gRnJlZUJTRCBmb3IgYXMgbG9uZworICAgYXMgdGhlIHN5bWJvbCBoYXMgZXhpc3RlZCwgX0JTRF9SVU5FX1RfIG11c3Qgbm90IHN0YXkgZGVmaW5lZCBvcgorICAgcmVkdW5kYW50IHR5cGVkZWZzIHdpbGwgb2NjdXIgd2hlbiBzdGRsaWIuaCBpcyBpbmNsdWRlZCBhZnRlciB0aGlzIGZpbGUuICovCisjdW5kZWYgX0JTRF9SVU5FX1RfCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKy8qIEZyZWVCU0QgNSBjYW4ndCBiZSBoYW5kbGVkIHdlbGwgdXNpbmcgInRyYWRpdGlvbmFsIiBsb2dpYyBhYm92ZQorICAgc2luY2UgaXQgbm8gbG9uZ2VyIGRlZmluZXMgX0JTRF9SVU5FX1RfIHlldCBzdGlsbCBkZXNpcmVzIHRvIGV4cG9ydAorICAgcnVuZV90IGluIHNvbWUgY2FzZXMuLi4gKi8KKyNpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgJiYgKF9fRnJlZUJTRF9fID49IDUpCisjaWYgIWRlZmluZWQgKF9BTlNJX1NPVVJDRSkgJiYgIWRlZmluZWQgKF9QT1NJWF9TT1VSQ0UpCisjaWYgX19CU0RfVklTSUJMRQorI2lmbmRlZiBfUlVORV9UX0RFQ0xBUkVECit0eXBlZGVmIF9fcnVuZV90ICAgICAgICBydW5lX3Q7CisjZGVmaW5lIF9SVU5FX1RfREVDTEFSRUQKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fV0NIQVJfVFlQRV9fCisjZGVmaW5lIF9fV0NIQVJfVFlQRV9fIGludAorI2VuZGlmCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIF9fV0NIQVJfVFlQRV9fIHdjaGFyX3Q7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBfV0NIQVJfVF9ERUNMQVJFRCAqLworI2VuZGlmIC8qIF9CU0RfUlVORV9UX0RFRklORURfICovCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBfX1dDSEFSX1RfXyAqLworI2VuZGlmIC8qIF9fd2NoYXJfdF9fICovCisjdW5kZWYJX19uZWVkX3djaGFyX3QKKyNlbmRpZiAvKiBfU1REREVGX0ggb3IgX19uZWVkX3djaGFyX3QuICAqLworCisjaWYgZGVmaW5lZCAoX19uZWVkX3dpbnRfdCkKKyNpZm5kZWYgX1dJTlRfVAorI2RlZmluZSBfV0lOVF9UCisKKyNpZm5kZWYgX19XSU5UX1RZUEVfXworI2RlZmluZSBfX1dJTlRfVFlQRV9fIHVuc2lnbmVkIGludAorI2VuZGlmCit0eXBlZGVmIF9fV0lOVF9UWVBFX18gd2ludF90OworI2VuZGlmCisjdW5kZWYgX19uZWVkX3dpbnRfdAorI2VuZGlmCisKKy8qICBJbiA0LjNic2QtbmV0MiwgbGVhdmUgdGhlc2UgdW5kZWZpbmVkIHRvIGluZGljYXRlIHRoYXQgc2l6ZV90LCBldGMuCisgICAgYXJlIGFscmVhZHkgZGVmaW5lZC4gICovCisvKiAgQlNEL09TIDMuMSBhbmQgRnJlZUJTRCBbMjNdLnggcmVxdWlyZSB0aGUgTUFDSElORV9BTlNJX0ggY2hlY2sgaGVyZS4gICovCisvKiAgTmV0QlNEIDUgcmVxdWlyZXMgdGhlIEkzODZfQU5TSV9IIGFuZCBYODZfNjRfQU5TSV9IIGNoZWNrcyBoZXJlLiAgKi8KKyNpZiBkZWZpbmVkKF9BTlNJX0hfKSB8fCBkZWZpbmVkKF9NQUNISU5FX0FOU0lfSF8pIHx8IGRlZmluZWQoX1g4Nl82NF9BTlNJX0hfKSB8fCBkZWZpbmVkKF9JMzg2X0FOU0lfSF8pCisvKiAgVGhlIHJlZmVyZW5jZXMgdG8gX0dDQ19QVFJESUZGX1RfLCBfR0NDX1NJWkVfVF8sIGFuZCBfR0NDX1dDSEFSX1RfCisgICAgYXJlIHByb2JhYmx5IHR5cG9zIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgMi44IGlzIHJlbGVhc2VkLiAgKi8KKyNpZmRlZiBfR0NDX1BUUkRJRkZfVF8KKyN1bmRlZiBfUFRSRElGRl9UXworI3VuZGVmIF9CU0RfUFRSRElGRl9UXworI2VuZGlmCisjaWZkZWYgX0dDQ19TSVpFX1RfCisjdW5kZWYgX1NJWkVfVF8KKyN1bmRlZiBfQlNEX1NJWkVfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfV0NIQVJfVF8KKyN1bmRlZiBfV0NIQVJfVF8KKyN1bmRlZiBfQlNEX1dDSEFSX1RfCisjZW5kaWYKKy8qICBUaGUgZm9sbG93aW5nIG9uZXMgYXJlIHRoZSByZWFsIG9uZXMuICAqLworI2lmZGVmIF9HQ0NfUFRSRElGRl9UCisjdW5kZWYgX1BUUkRJRkZfVF8KKyN1bmRlZiBfQlNEX1BUUkRJRkZfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfU0laRV9UCisjdW5kZWYgX1NJWkVfVF8KKyN1bmRlZiBfQlNEX1NJWkVfVF8KKyNlbmRpZgorI2lmZGVmIF9HQ0NfV0NIQVJfVAorI3VuZGVmIF9XQ0hBUl9UXworI3VuZGVmIF9CU0RfV0NIQVJfVF8KKyNlbmRpZgorI2VuZGlmIC8qIF9BTlNJX0hfIHx8IF9NQUNISU5FX0FOU0lfSF8gfHwgX1g4Nl82NF9BTlNJX0hfIHx8IF9JMzg2X0FOU0lfSF8gKi8KKworI2VuZGlmIC8qIF9fc3lzX3N0ZHR5cGVzX2ggKi8KKworLyogQSBudWxsIHBvaW50ZXIgY29uc3RhbnQuICAqLworCisjaWYgZGVmaW5lZCAoX1NURERFRl9IKSB8fCBkZWZpbmVkIChfX25lZWRfTlVMTCkKKyN1bmRlZiBOVUxMCQkvKiBpbiBjYXNlIDxzdGRpby5oPiBoYXMgZGVmaW5lZCBpdC4gKi8KKyNpZmRlZiBfX0dOVUdfXworI2RlZmluZSBOVUxMIF9fbnVsbAorI2Vsc2UgICAvKiBHKysgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2Vsc2UgICAvKiBDKysgKi8KKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYgIC8qIEMrKyAqLworI2VuZGlmICAvKiBHKysgKi8KKyNlbmRpZgkvKiBOVUxMIG5vdCBkZWZpbmVkIGFuZCA8c3RkZGVmLmg+IG9yIG5lZWQgTlVMTC4gICovCisjdW5kZWYJX19uZWVkX05VTEwKKworI2lmZGVmIF9TVERERUZfSAorCisvKiBPZmZzZXQgb2YgbWVtYmVyIE1FTUJFUiBpbiBhIHN0cnVjdCBvZiB0eXBlIFRZUEUuICovCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgX19idWlsdGluX29mZnNldG9mIChUWVBFLCBNRU1CRVIpCisKKyNlbmRpZiAvKiBfU1REREVGX0ggd2FzIGRlZmluZWQgdGhpcyB0aW1lICovCisKKyNlbmRpZiAvKiAhX1NURERFRl9IICYmICFfU1REREVGX0hfICYmICFfQU5TSV9TVERERUZfSCAmJiAhX19TVERERUZfSF9fCisJICB8fCBfX25lZWRfWFhYIHdhcyBub3QgZGVmaW5lZCBiZWZvcmUgKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3N0ZGZpeC5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkZml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZWMwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3N0ZGZpeC5oCkBAIC0wLDAgKzEsMjA0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIElTTy9JRUMgSlRDMSBTQzIyIFdHMTQgTjExNjkKKyAqIERhdGU6IDIwMDYtMDQtMDQKKyAqIElTTy9JRUMgVFIgMTgwMzcKKyAqIFByb2dyYW1taW5nIGxhbmd1YWdlcyAtIEMgLSBFeHRlbnNpb25zIHRvIHN1cHBvcnQgZW1iZWRkZWQgcHJvY2Vzc29ycworICovCisKKyNpZm5kZWYgX1NUREZJWF9ICisjZGVmaW5lIF9TVERGSVhfSAorCisvKiA3LjE4YS4xIEludHJvZHVjdGlvbi4gICovCisKKyN1bmRlZiBmcmFjdAorI3VuZGVmIGFjY3VtCisjdW5kZWYgc2F0CisjZGVmaW5lIGZyYWN0CQlfRnJhY3QKKyNkZWZpbmUgYWNjdW0JCV9BY2N1bQorI2RlZmluZSBzYXQJCV9TYXQKKworLyogNy4xOGEuMyBQcmVjaXNpb24gbWFjcm9zLiAgKi8KKworI3VuZGVmIFNGUkFDVF9GQklUCisjdW5kZWYgU0ZSQUNUX01JTgorI3VuZGVmIFNGUkFDVF9NQVgKKyN1bmRlZiBTRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBTRlJBQ1RfRkJJVAlfX1NGUkFDVF9GQklUX18KKyNkZWZpbmUgU0ZSQUNUX01JTglfX1NGUkFDVF9NSU5fXworI2RlZmluZSBTRlJBQ1RfTUFYCV9fU0ZSQUNUX01BWF9fCisjZGVmaW5lIFNGUkFDVF9FUFNJTE9OCV9fU0ZSQUNUX0VQU0lMT05fXworCisjdW5kZWYgVVNGUkFDVF9GQklUCisjdW5kZWYgVVNGUkFDVF9NSU4KKyN1bmRlZiBVU0ZSQUNUX01BWAorI3VuZGVmIFVTRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBVU0ZSQUNUX0ZCSVQJX19VU0ZSQUNUX0ZCSVRfXworI2RlZmluZSBVU0ZSQUNUX01JTglfX1VTRlJBQ1RfTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVU0ZSQUNUX01BWAlfX1VTRlJBQ1RfTUFYX18KKyNkZWZpbmUgVVNGUkFDVF9FUFNJTE9OCV9fVVNGUkFDVF9FUFNJTE9OX18KKworI3VuZGVmIEZSQUNUX0ZCSVQKKyN1bmRlZiBGUkFDVF9NSU4KKyN1bmRlZiBGUkFDVF9NQVgKKyN1bmRlZiBGUkFDVF9FUFNJTE9OCisjZGVmaW5lIEZSQUNUX0ZCSVQJX19GUkFDVF9GQklUX18KKyNkZWZpbmUgRlJBQ1RfTUlOCV9fRlJBQ1RfTUlOX18KKyNkZWZpbmUgRlJBQ1RfTUFYCV9fRlJBQ1RfTUFYX18KKyNkZWZpbmUgRlJBQ1RfRVBTSUxPTglfX0ZSQUNUX0VQU0lMT05fXworCisjdW5kZWYgVUZSQUNUX0ZCSVQKKyN1bmRlZiBVRlJBQ1RfTUlOCisjdW5kZWYgVUZSQUNUX01BWAorI3VuZGVmIFVGUkFDVF9FUFNJTE9OCisjZGVmaW5lIFVGUkFDVF9GQklUCV9fVUZSQUNUX0ZCSVRfXworI2RlZmluZSBVRlJBQ1RfTUlOCV9fVUZSQUNUX01JTl9fCQkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUZSQUNUX01BWAlfX1VGUkFDVF9NQVhfXworI2RlZmluZSBVRlJBQ1RfRVBTSUxPTglfX1VGUkFDVF9FUFNJTE9OX18KKworI3VuZGVmIExGUkFDVF9GQklUCisjdW5kZWYgTEZSQUNUX01JTgorI3VuZGVmIExGUkFDVF9NQVgKKyN1bmRlZiBMRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBMRlJBQ1RfRkJJVAlfX0xGUkFDVF9GQklUX18KKyNkZWZpbmUgTEZSQUNUX01JTglfX0xGUkFDVF9NSU5fXworI2RlZmluZSBMRlJBQ1RfTUFYCV9fTEZSQUNUX01BWF9fCisjZGVmaW5lIExGUkFDVF9FUFNJTE9OCV9fTEZSQUNUX0VQU0lMT05fXworCisjdW5kZWYgVUxGUkFDVF9GQklUCisjdW5kZWYgVUxGUkFDVF9NSU4KKyN1bmRlZiBVTEZSQUNUX01BWAorI3VuZGVmIFVMRlJBQ1RfRVBTSUxPTgorI2RlZmluZSBVTEZSQUNUX0ZCSVQJX19VTEZSQUNUX0ZCSVRfXworI2RlZmluZSBVTEZSQUNUX01JTglfX1VMRlJBQ1RfTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTEZSQUNUX01BWAlfX1VMRlJBQ1RfTUFYX18KKyNkZWZpbmUgVUxGUkFDVF9FUFNJTE9OCV9fVUxGUkFDVF9FUFNJTE9OX18KKworI3VuZGVmIExMRlJBQ1RfRkJJVAorI3VuZGVmIExMRlJBQ1RfTUlOCisjdW5kZWYgTExGUkFDVF9NQVgKKyN1bmRlZiBMTEZSQUNUX0VQU0lMT04KKyNkZWZpbmUgTExGUkFDVF9GQklUCV9fTExGUkFDVF9GQklUX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMRlJBQ1RfTUlOCV9fTExGUkFDVF9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMRlJBQ1RfTUFYCV9fTExGUkFDVF9NQVhfXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMRlJBQ1RfRVBTSUxPTglfX0xMRlJBQ1RfRVBTSUxPTl9fCS8qIEdDQyBleHRlbnNpb24uICAqLworCisjdW5kZWYgVUxMRlJBQ1RfRkJJVAorI3VuZGVmIFVMTEZSQUNUX01JTgorI3VuZGVmIFVMTEZSQUNUX01BWAorI3VuZGVmIFVMTEZSQUNUX0VQU0lMT04KKyNkZWZpbmUgVUxMRlJBQ1RfRkJJVAlfX1VMTEZSQUNUX0ZCSVRfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMRlJBQ1RfTUlOCV9fVUxMRlJBQ1RfTUlOX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEZSQUNUX01BWAlfX1VMTEZSQUNUX01BWF9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExGUkFDVF9FUFNJTE9OCV9fVUxMRlJBQ1RfRVBTSUxPTl9fCS8qIEdDQyBleHRlbnNpb24uICAqLworCisjdW5kZWYgU0FDQ1VNX0ZCSVQKKyN1bmRlZiBTQUNDVU1fSUJJVAorI3VuZGVmIFNBQ0NVTV9NSU4KKyN1bmRlZiBTQUNDVU1fTUFYCisjdW5kZWYgU0FDQ1VNX0VQU0lMT04KKyNkZWZpbmUgU0FDQ1VNX0ZCSVQJX19TQUNDVU1fRkJJVF9fCisjZGVmaW5lIFNBQ0NVTV9JQklUCV9fU0FDQ1VNX0lCSVRfXworI2RlZmluZSBTQUNDVU1fTUlOCV9fU0FDQ1VNX01JTl9fCisjZGVmaW5lIFNBQ0NVTV9NQVgJX19TQUNDVU1fTUFYX18KKyNkZWZpbmUgU0FDQ1VNX0VQU0lMT04JX19TQUNDVU1fRVBTSUxPTl9fCisKKyN1bmRlZiBVU0FDQ1VNX0ZCSVQKKyN1bmRlZiBVU0FDQ1VNX0lCSVQKKyN1bmRlZiBVU0FDQ1VNX01JTgorI3VuZGVmIFVTQUNDVU1fTUFYCisjdW5kZWYgVVNBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIFVTQUNDVU1fRkJJVAlfX1VTQUNDVU1fRkJJVF9fCisjZGVmaW5lIFVTQUNDVU1fSUJJVAlfX1VTQUNDVU1fSUJJVF9fCisjZGVmaW5lIFVTQUNDVU1fTUlOCV9fVVNBQ0NVTV9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVTQUNDVU1fTUFYCV9fVVNBQ0NVTV9NQVhfXworI2RlZmluZSBVU0FDQ1VNX0VQU0lMT04JX19VU0FDQ1VNX0VQU0lMT05fXworCisjdW5kZWYgQUNDVU1fRkJJVAorI3VuZGVmIEFDQ1VNX0lCSVQKKyN1bmRlZiBBQ0NVTV9NSU4KKyN1bmRlZiBBQ0NVTV9NQVgKKyN1bmRlZiBBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIEFDQ1VNX0ZCSVQJX19BQ0NVTV9GQklUX18KKyNkZWZpbmUgQUNDVU1fSUJJVAlfX0FDQ1VNX0lCSVRfXworI2RlZmluZSBBQ0NVTV9NSU4JX19BQ0NVTV9NSU5fXworI2RlZmluZSBBQ0NVTV9NQVgJX19BQ0NVTV9NQVhfXworI2RlZmluZSBBQ0NVTV9FUFNJTE9OCV9fQUNDVU1fRVBTSUxPTl9fCisKKyN1bmRlZiBVQUNDVU1fRkJJVAorI3VuZGVmIFVBQ0NVTV9JQklUCisjdW5kZWYgVUFDQ1VNX01JTgorI3VuZGVmIFVBQ0NVTV9NQVgKKyN1bmRlZiBVQUNDVU1fRVBTSUxPTgorI2RlZmluZSBVQUNDVU1fRkJJVAlfX1VBQ0NVTV9GQklUX18KKyNkZWZpbmUgVUFDQ1VNX0lCSVQJX19VQUNDVU1fSUJJVF9fCisjZGVmaW5lIFVBQ0NVTV9NSU4JX19VQUNDVU1fTUlOX18JCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVQUNDVU1fTUFYCV9fVUFDQ1VNX01BWF9fCisjZGVmaW5lIFVBQ0NVTV9FUFNJTE9OCV9fVUFDQ1VNX0VQU0lMT05fXworCisjdW5kZWYgTEFDQ1VNX0ZCSVQKKyN1bmRlZiBMQUNDVU1fSUJJVAorI3VuZGVmIExBQ0NVTV9NSU4KKyN1bmRlZiBMQUNDVU1fTUFYCisjdW5kZWYgTEFDQ1VNX0VQU0lMT04KKyNkZWZpbmUgTEFDQ1VNX0ZCSVQJX19MQUNDVU1fRkJJVF9fCisjZGVmaW5lIExBQ0NVTV9JQklUCV9fTEFDQ1VNX0lCSVRfXworI2RlZmluZSBMQUNDVU1fTUlOCV9fTEFDQ1VNX01JTl9fCisjZGVmaW5lIExBQ0NVTV9NQVgJX19MQUNDVU1fTUFYX18KKyNkZWZpbmUgTEFDQ1VNX0VQU0lMT04JX19MQUNDVU1fRVBTSUxPTl9fCisKKyN1bmRlZiBVTEFDQ1VNX0ZCSVQKKyN1bmRlZiBVTEFDQ1VNX0lCSVQKKyN1bmRlZiBVTEFDQ1VNX01JTgorI3VuZGVmIFVMQUNDVU1fTUFYCisjdW5kZWYgVUxBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIFVMQUNDVU1fRkJJVAlfX1VMQUNDVU1fRkJJVF9fCisjZGVmaW5lIFVMQUNDVU1fSUJJVAlfX1VMQUNDVU1fSUJJVF9fCisjZGVmaW5lIFVMQUNDVU1fTUlOCV9fVUxBQ0NVTV9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMQUNDVU1fTUFYCV9fVUxBQ0NVTV9NQVhfXworI2RlZmluZSBVTEFDQ1VNX0VQU0lMT04JX19VTEFDQ1VNX0VQU0lMT05fXworCisjdW5kZWYgTExBQ0NVTV9GQklUCisjdW5kZWYgTExBQ0NVTV9JQklUCisjdW5kZWYgTExBQ0NVTV9NSU4KKyN1bmRlZiBMTEFDQ1VNX01BWAorI3VuZGVmIExMQUNDVU1fRVBTSUxPTgorI2RlZmluZSBMTEFDQ1VNX0ZCSVQJX19MTEFDQ1VNX0ZCSVRfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgTExBQ0NVTV9JQklUCV9fTExBQ0NVTV9JQklUX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMQUNDVU1fTUlOCV9fTExBQ0NVTV9NSU5fXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMQUNDVU1fTUFYCV9fTExBQ0NVTV9NQVhfXwkJLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIExMQUNDVU1fRVBTSUxPTglfX0xMQUNDVU1fRVBTSUxPTl9fCS8qIEdDQyBleHRlbnNpb24uICAqLworCisjdW5kZWYgVUxMQUNDVU1fRkJJVAorI3VuZGVmIFVMTEFDQ1VNX0lCSVQKKyN1bmRlZiBVTExBQ0NVTV9NSU4KKyN1bmRlZiBVTExBQ0NVTV9NQVgKKyN1bmRlZiBVTExBQ0NVTV9FUFNJTE9OCisjZGVmaW5lIFVMTEFDQ1VNX0ZCSVQJX19VTExBQ0NVTV9GQklUX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEFDQ1VNX0lCSVQJX19VTExBQ0NVTV9JQklUX18JLyogR0NDIGV4dGVuc2lvbi4gICovCisjZGVmaW5lIFVMTEFDQ1VNX01JTglfX1VMTEFDQ1VNX01JTl9fCS8qIEdDQyBleHRlbnNpb24uICAqLworI2RlZmluZSBVTExBQ0NVTV9NQVgJX19VTExBQ0NVTV9NQVhfXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgVUxMQUNDVU1fRVBTSUxPTglfX1VMTEFDQ1VNX0VQU0lMT05fXwkvKiBHQ0MgZXh0ZW5zaW9uLiAgKi8KKworI2VuZGlmIC8qIF9TVERGSVhfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkaW50LWdjYy5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkaW50LWdjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzgwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zdGRpbnQtZ2NjLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKK2FueSBsYXRlciB2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyoKKyAqIElTTyBDIFN0YW5kYXJkOiAgNy4xOCAgSW50ZWdlciB0eXBlcyAgPHN0ZGludC5oPgorICovCisKKyNpZm5kZWYgX0dDQ19TVERJTlRfSAorI2RlZmluZSBfR0NDX1NURElOVF9ICisKKy8qIDcuOC4xLjEgRXhhY3Qtd2lkdGggaW50ZWdlciB0eXBlcyAqLworCisjaWZkZWYgX19JTlQ4X1RZUEVfXwordHlwZWRlZiBfX0lOVDhfVFlQRV9fIGludDhfdDsKKyNlbmRpZgorI2lmZGVmIF9fSU5UMTZfVFlQRV9fCit0eXBlZGVmIF9fSU5UMTZfVFlQRV9fIGludDE2X3Q7CisjZW5kaWYKKyNpZmRlZiBfX0lOVDMyX1RZUEVfXwordHlwZWRlZiBfX0lOVDMyX1RZUEVfXyBpbnQzMl90OworI2VuZGlmCisjaWZkZWYgX19JTlQ2NF9UWVBFX18KK3R5cGVkZWYgX19JTlQ2NF9UWVBFX18gaW50NjRfdDsKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDhfVFlQRV9fCit0eXBlZGVmIF9fVUlOVDhfVFlQRV9fIHVpbnQ4X3Q7CisjZW5kaWYKKyNpZmRlZiBfX1VJTlQxNl9UWVBFX18KK3R5cGVkZWYgX19VSU5UMTZfVFlQRV9fIHVpbnQxNl90OworI2VuZGlmCisjaWZkZWYgX19VSU5UMzJfVFlQRV9fCit0eXBlZGVmIF9fVUlOVDMyX1RZUEVfXyB1aW50MzJfdDsKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDY0X1RZUEVfXwordHlwZWRlZiBfX1VJTlQ2NF9UWVBFX18gdWludDY0X3Q7CisjZW5kaWYKKworLyogNy44LjEuMiBNaW5pbXVtLXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKwordHlwZWRlZiBfX0lOVF9MRUFTVDhfVFlQRV9fIGludF9sZWFzdDhfdDsKK3R5cGVkZWYgX19JTlRfTEVBU1QxNl9UWVBFX18gaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgX19JTlRfTEVBU1QzMl9UWVBFX18gaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgX19JTlRfTEVBU1Q2NF9UWVBFX18gaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgX19VSU5UX0xFQVNUOF9UWVBFX18gdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgX19VSU5UX0xFQVNUMTZfVFlQRV9fIHVpbnRfbGVhc3QxNl90OwordHlwZWRlZiBfX1VJTlRfTEVBU1QzMl9UWVBFX18gdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIF9fVUlOVF9MRUFTVDY0X1RZUEVfXyB1aW50X2xlYXN0NjRfdDsKKworLyogNy44LjEuMyBGYXN0ZXN0IG1pbmltdW0td2lkdGggaW50ZWdlciB0eXBlcyAqLworCit0eXBlZGVmIF9fSU5UX0ZBU1Q4X1RZUEVfXyBpbnRfZmFzdDhfdDsKK3R5cGVkZWYgX19JTlRfRkFTVDE2X1RZUEVfXyBpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIF9fSU5UX0ZBU1QzMl9UWVBFX18gaW50X2Zhc3QzMl90OwordHlwZWRlZiBfX0lOVF9GQVNUNjRfVFlQRV9fIGludF9mYXN0NjRfdDsKK3R5cGVkZWYgX19VSU5UX0ZBU1Q4X1RZUEVfXyB1aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUMTZfVFlQRV9fIHVpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUMzJfVFlQRV9fIHVpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIF9fVUlOVF9GQVNUNjRfVFlQRV9fIHVpbnRfZmFzdDY0X3Q7CisKKy8qIDcuOC4xLjQgSW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIGhvbGRpbmcgb2JqZWN0IHBvaW50ZXJzICovCisKKyNpZmRlZiBfX0lOVFBUUl9UWVBFX18KK3R5cGVkZWYgX19JTlRQVFJfVFlQRV9fIGludHB0cl90OworI2VuZGlmCisjaWZkZWYgX19VSU5UUFRSX1RZUEVfXwordHlwZWRlZiBfX1VJTlRQVFJfVFlQRV9fIHVpbnRwdHJfdDsKKyNlbmRpZgorCisvKiA3LjguMS41IEdyZWF0ZXN0LXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKwordHlwZWRlZiBfX0lOVE1BWF9UWVBFX18gaW50bWF4X3Q7Cit0eXBlZGVmIF9fVUlOVE1BWF9UWVBFX18gdWludG1heF90OworCisjaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX1NURENfTElNSVRfTUFDUk9TCisKKy8qIDcuMTguMiBMaW1pdHMgb2Ygc3BlY2lmaWVkLXdpZHRoIGludGVnZXIgdHlwZXMgKi8KKworI2lmZGVmIF9fSU5UOF9NQVhfXworIyB1bmRlZiBJTlQ4X01BWAorIyBkZWZpbmUgSU5UOF9NQVggX19JTlQ4X01BWF9fCisjIHVuZGVmIElOVDhfTUlOCisjIGRlZmluZSBJTlQ4X01JTiAoLUlOVDhfTUFYIC0gMSkKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDhfTUFYX18KKyMgdW5kZWYgVUlOVDhfTUFYCisjIGRlZmluZSBVSU5UOF9NQVggX19VSU5UOF9NQVhfXworI2VuZGlmCisjaWZkZWYgX19JTlQxNl9NQVhfXworIyB1bmRlZiBJTlQxNl9NQVgKKyMgZGVmaW5lIElOVDE2X01BWCBfX0lOVDE2X01BWF9fCisjIHVuZGVmIElOVDE2X01JTgorIyBkZWZpbmUgSU5UMTZfTUlOICgtSU5UMTZfTUFYIC0gMSkKKyNlbmRpZgorI2lmZGVmIF9fVUlOVDE2X01BWF9fCisjIHVuZGVmIFVJTlQxNl9NQVgKKyMgZGVmaW5lIFVJTlQxNl9NQVggX19VSU5UMTZfTUFYX18KKyNlbmRpZgorI2lmZGVmIF9fSU5UMzJfTUFYX18KKyMgdW5kZWYgSU5UMzJfTUFYCisjIGRlZmluZSBJTlQzMl9NQVggX19JTlQzMl9NQVhfXworIyB1bmRlZiBJTlQzMl9NSU4KKyMgZGVmaW5lIElOVDMyX01JTiAoLUlOVDMyX01BWCAtIDEpCisjZW5kaWYKKyNpZmRlZiBfX1VJTlQzMl9NQVhfXworIyB1bmRlZiBVSU5UMzJfTUFYCisjIGRlZmluZSBVSU5UMzJfTUFYIF9fVUlOVDMyX01BWF9fCisjZW5kaWYKKyNpZmRlZiBfX0lOVDY0X01BWF9fCisjIHVuZGVmIElOVDY0X01BWAorIyBkZWZpbmUgSU5UNjRfTUFYIF9fSU5UNjRfTUFYX18KKyMgdW5kZWYgSU5UNjRfTUlOCisjIGRlZmluZSBJTlQ2NF9NSU4gKC1JTlQ2NF9NQVggLSAxKQorI2VuZGlmCisjaWZkZWYgX19VSU5UNjRfTUFYX18KKyMgdW5kZWYgVUlOVDY0X01BWAorIyBkZWZpbmUgVUlOVDY0X01BWCBfX1VJTlQ2NF9NQVhfXworI2VuZGlmCisKKyN1bmRlZiBJTlRfTEVBU1Q4X01BWAorI2RlZmluZSBJTlRfTEVBU1Q4X01BWCBfX0lOVF9MRUFTVDhfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1Q4X01JTgorI2RlZmluZSBJTlRfTEVBU1Q4X01JTiAoLUlOVF9MRUFTVDhfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUOF9NQVgKKyNkZWZpbmUgVUlOVF9MRUFTVDhfTUFYIF9fVUlOVF9MRUFTVDhfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QxNl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUFYIF9fSU5UX0xFQVNUMTZfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QxNl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMTZfTUlOICgtSU5UX0xFQVNUMTZfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUMTZfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QxNl9NQVggX19VSU5UX0xFQVNUMTZfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QzMl9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUFYIF9fSU5UX0xFQVNUMzJfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1QzMl9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUMzJfTUlOICgtSU5UX0xFQVNUMzJfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUMzJfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1QzMl9NQVggX19VSU5UX0xFQVNUMzJfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1Q2NF9NQVgKKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUFYIF9fSU5UX0xFQVNUNjRfTUFYX18KKyN1bmRlZiBJTlRfTEVBU1Q2NF9NSU4KKyNkZWZpbmUgSU5UX0xFQVNUNjRfTUlOICgtSU5UX0xFQVNUNjRfTUFYIC0gMSkKKyN1bmRlZiBVSU5UX0xFQVNUNjRfTUFYCisjZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVggX19VSU5UX0xFQVNUNjRfTUFYX18KKworI3VuZGVmIElOVF9GQVNUOF9NQVgKKyNkZWZpbmUgSU5UX0ZBU1Q4X01BWCBfX0lOVF9GQVNUOF9NQVhfXworI3VuZGVmIElOVF9GQVNUOF9NSU4KKyNkZWZpbmUgSU5UX0ZBU1Q4X01JTiAoLUlOVF9GQVNUOF9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDhfTUFYCisjZGVmaW5lIFVJTlRfRkFTVDhfTUFYIF9fVUlOVF9GQVNUOF9NQVhfXworI3VuZGVmIElOVF9GQVNUMTZfTUFYCisjZGVmaW5lIElOVF9GQVNUMTZfTUFYIF9fSU5UX0ZBU1QxNl9NQVhfXworI3VuZGVmIElOVF9GQVNUMTZfTUlOCisjZGVmaW5lIElOVF9GQVNUMTZfTUlOICgtSU5UX0ZBU1QxNl9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDE2X01BWAorI2RlZmluZSBVSU5UX0ZBU1QxNl9NQVggX19VSU5UX0ZBU1QxNl9NQVhfXworI3VuZGVmIElOVF9GQVNUMzJfTUFYCisjZGVmaW5lIElOVF9GQVNUMzJfTUFYIF9fSU5UX0ZBU1QzMl9NQVhfXworI3VuZGVmIElOVF9GQVNUMzJfTUlOCisjZGVmaW5lIElOVF9GQVNUMzJfTUlOICgtSU5UX0ZBU1QzMl9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDMyX01BWAorI2RlZmluZSBVSU5UX0ZBU1QzMl9NQVggX19VSU5UX0ZBU1QzMl9NQVhfXworI3VuZGVmIElOVF9GQVNUNjRfTUFYCisjZGVmaW5lIElOVF9GQVNUNjRfTUFYIF9fSU5UX0ZBU1Q2NF9NQVhfXworI3VuZGVmIElOVF9GQVNUNjRfTUlOCisjZGVmaW5lIElOVF9GQVNUNjRfTUlOICgtSU5UX0ZBU1Q2NF9NQVggLSAxKQorI3VuZGVmIFVJTlRfRkFTVDY0X01BWAorI2RlZmluZSBVSU5UX0ZBU1Q2NF9NQVggX19VSU5UX0ZBU1Q2NF9NQVhfXworCisjaWZkZWYgX19JTlRQVFJfTUFYX18KKyMgdW5kZWYgSU5UUFRSX01BWAorIyBkZWZpbmUgSU5UUFRSX01BWCBfX0lOVFBUUl9NQVhfXworIyB1bmRlZiBJTlRQVFJfTUlOCisjIGRlZmluZSBJTlRQVFJfTUlOICgtSU5UUFRSX01BWCAtIDEpCisjZW5kaWYKKyNpZmRlZiBfX1VJTlRQVFJfTUFYX18KKyMgdW5kZWYgVUlOVFBUUl9NQVgKKyMgZGVmaW5lIFVJTlRQVFJfTUFYIF9fVUlOVFBUUl9NQVhfXworI2VuZGlmCisKKyN1bmRlZiBJTlRNQVhfTUFYCisjZGVmaW5lIElOVE1BWF9NQVggX19JTlRNQVhfTUFYX18KKyN1bmRlZiBJTlRNQVhfTUlOCisjZGVmaW5lIElOVE1BWF9NSU4gKC1JTlRNQVhfTUFYIC0gMSkKKyN1bmRlZiBVSU5UTUFYX01BWAorI2RlZmluZSBVSU5UTUFYX01BWCBfX1VJTlRNQVhfTUFYX18KKworLyogNy4xOC4zIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzICovCisKKyN1bmRlZiBQVFJESUZGX01BWAorI2RlZmluZSBQVFJESUZGX01BWCBfX1BUUkRJRkZfTUFYX18KKyN1bmRlZiBQVFJESUZGX01JTgorI2RlZmluZSBQVFJESUZGX01JTiAoLVBUUkRJRkZfTUFYIC0gMSkKKworI3VuZGVmIFNJR19BVE9NSUNfTUFYCisjZGVmaW5lIFNJR19BVE9NSUNfTUFYIF9fU0lHX0FUT01JQ19NQVhfXworI3VuZGVmIFNJR19BVE9NSUNfTUlOCisjZGVmaW5lIFNJR19BVE9NSUNfTUlOIF9fU0lHX0FUT01JQ19NSU5fXworCisjdW5kZWYgU0laRV9NQVgKKyNkZWZpbmUgU0laRV9NQVggX19TSVpFX01BWF9fCisKKyN1bmRlZiBXQ0hBUl9NQVgKKyNkZWZpbmUgV0NIQVJfTUFYIF9fV0NIQVJfTUFYX18KKyN1bmRlZiBXQ0hBUl9NSU4KKyNkZWZpbmUgV0NIQVJfTUlOIF9fV0NIQVJfTUlOX18KKworI3VuZGVmIFdJTlRfTUFYCisjZGVmaW5lIFdJTlRfTUFYIF9fV0lOVF9NQVhfXworI3VuZGVmIFdJTlRfTUlOCisjZGVmaW5lIFdJTlRfTUlOIF9fV0lOVF9NSU5fXworCisjZW5kaWYgLyogIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX1NURENfTElNSVRfTUFDUk9TICovCisKKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKworI3VuZGVmIElOVDhfQworI2RlZmluZSBJTlQ4X0MoYykgX19JTlQ4X0MoYykKKyN1bmRlZiBJTlQxNl9DCisjZGVmaW5lIElOVDE2X0MoYykgX19JTlQxNl9DKGMpCisjdW5kZWYgSU5UMzJfQworI2RlZmluZSBJTlQzMl9DKGMpIF9fSU5UMzJfQyhjKQorI3VuZGVmIElOVDY0X0MKKyNkZWZpbmUgSU5UNjRfQyhjKSBfX0lOVDY0X0MoYykKKyN1bmRlZiBVSU5UOF9DCisjZGVmaW5lIFVJTlQ4X0MoYykgX19VSU5UOF9DKGMpCisjdW5kZWYgVUlOVDE2X0MKKyNkZWZpbmUgVUlOVDE2X0MoYykgX19VSU5UMTZfQyhjKQorI3VuZGVmIFVJTlQzMl9DCisjZGVmaW5lIFVJTlQzMl9DKGMpIF9fVUlOVDMyX0MoYykKKyN1bmRlZiBVSU5UNjRfQworI2RlZmluZSBVSU5UNjRfQyhjKSBfX1VJTlQ2NF9DKGMpCisjdW5kZWYgSU5UTUFYX0MKKyNkZWZpbmUgSU5UTUFYX0MoYykgX19JTlRNQVhfQyhjKQorI3VuZGVmIFVJTlRNQVhfQworI2RlZmluZSBVSU5UTUFYX0MoYykgX19VSU5UTUFYX0MoYykKKworI2VuZGlmIC8qICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19TVERDX0NPTlNUQU5UX01BQ1JPUyAqLworCisjZW5kaWYgLyogX0dDQ19TVERJTlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkaW50LmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDVmODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvc3RkaW50LmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9HQ0NfV1JBUF9TVERJTlRfSAorI2lmIF9fU1REQ19IT1NURURfXworIyBpbmNsdWRlX25leHQgPHN0ZGludC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAic3RkaW50LWdjYy5oIgorI2VuZGlmCisjZGVmaW5lIF9HQ0NfV1JBUF9TVERJTlRfSAorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS90Ym1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3RibWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjQzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS90Ym1pbnRyaW4uaApAQCAtMCwwICsxLDE5MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorIyBlcnJvciAiTmV2ZXIgdXNlIDx0Ym1pbnRyaW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHg4NmludHJpbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9fVEJNX18KKyMgZXJyb3IgIlRCTSBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZW5kaWYgLyogX19UQk1fXyAqLworCisjaWZuZGVmIF9UQk1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfVEJNSU5UUklOX0hfSU5DTFVERUQKKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmV4dHJpX3UzMiAodW5zaWduZWQgaW50IF9fWCwgY29uc3QgdW5zaWduZWQgaW50IF9fSSkKK3sKKwlyZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJpX3UzMiAoX19YLCBfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX19iZXh0cmlfdTMyKFgsIEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1bnNpZ25lZCBpbnQpX19idWlsdGluX2lhMzJfYmV4dHJpX3UzMiAoKHVuc2lnbmVkIGludCkoWCksIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KShJKSkpCisjZW5kaWYgLypfX09QVElNSVpFX18gKi8KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjZmlsbF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX1gpICYgKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaV91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX1gpIHwgKH4oKF9fWCkgKyAxKSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaWNfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworCXVuc2lnbmVkIGludCB0bXAgPSAofihfX1gpKSAmICgoX19YKSArIDEpOworCXJldHVybiB0bXA7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JsY21za191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX1gpIF4gKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjc191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX1gpIHwgKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzZmlsbF91MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisJdW5zaWduZWQgaW50IHRtcCA9IChfX1gpIHwgKChfX1gpIC0gMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzaWNfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworCXVuc2lnbmVkIGludCB0bXAgPSAofihfX1gpKSB8ICgoX19YKSAtIDEpOworCXJldHVybiB0bXA7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3QxbXNrY191MzIgKHVuc2lnbmVkIGludCBfX1gpCit7CisJdW5zaWduZWQgaW50IHRtcCA9ICh+KF9fWCkpIHwgKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fdHptc2tfdTMyICh1bnNpZ25lZCBpbnQgX19YKQoreworCXVuc2lnbmVkIGludCB0bXAgPSAofihfX1gpKSAmICgoX19YKSAtIDEpOworCXJldHVybiB0bXA7Cit9CisKKworCisjaWZkZWYgX194ODZfNjRfXworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmV4dHJpX3U2NCAodW5zaWduZWQgbG9uZyBsb25nIF9fWCwgY29uc3QgdW5zaWduZWQgaW50IF9fSSkKK3sKKwlyZXR1cm4gX19idWlsdGluX2lhMzJfYmV4dHJpX3U2NCAoX19YLCBfX0kpOworfQorI2Vsc2UKKyNkZWZpbmUgX19iZXh0cmlfdTY0KFgsIEkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpX19idWlsdGluX2lhMzJfYmV4dHJpX3U2NCAoKHVuc2lnbmVkIGxvbmcgbG9uZykoWCksIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShJKSkpCisjZW5kaWYgLypfX09QVElNSVpFX18gKi8KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjZmlsbF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpICYgKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaV91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpIHwgKH4oKF9fWCkgKyAxKSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjaWNfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXAgPSAofihfX1gpKSAmICgoX19YKSArIDEpOworCXJldHVybiB0bXA7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX2JsY21za191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpIF4gKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxjc191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpIHwgKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzZmlsbF91NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9IChfX1gpIHwgKChfX1gpIC0gMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fYmxzaWNfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXAgPSAofihfX1gpKSB8ICgoX19YKSAtIDEpOworCXJldHVybiB0bXA7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3QxbXNrY191NjQgKHVuc2lnbmVkIGxvbmcgbG9uZyBfX1gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcCA9ICh+KF9fWCkpIHwgKChfX1gpICsgMSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19fdHptc2tfdTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgX19YKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXAgPSAofihfX1gpKSAmICgoX19YKSAtIDEpOworCXJldHVybiB0bXA7Cit9CisKKworI2VuZGlmIC8qIF9feDg2XzY0X18gICovCisjZW5kaWYgLyogX1RCTUlOVFJJTl9IX0lOQ0xVREVEICovCisKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3RtbWludHJpbi5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvdG1taW50cmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzNTY2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3RtbWludHJpbi5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIEltcGxlbWVudGVkIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaW5jbHVkZWQgaW4gdGhlIEludGVsIEMrKyBDb21waWxlcgorICAgVXNlciBHdWlkZSBhbmQgUmVmZXJlbmNlLCB2ZXJzaW9uIDkuMS4gICovCisKKyNpZm5kZWYgX1RNTUlOVFJJTl9IX0lOQ0xVREVECisjZGVmaW5lIF9UTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fU1NTRTNfXworIyBlcnJvciAiU1NTRTMgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCBkZWZpbml0aW9ucyBmcm9tIHRoZSBTU0UzLCBTU0UyIGFuZCBTU0UgaGVhZGVyIGZpbGVzKi8KKyNpbmNsdWRlIDxwbW1pbnRyaW4uaD4KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BoYWRkdzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9lcGkzMiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BoYWRkZDEyOCAoKF9fdjRzaSlfX1gsIChfX3Y0c2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHNfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waGFkZHN3MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9waTE2IChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGhhZGR3ICgoX192NGhpKV9fWCwgKF9fdjRoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZF9waTMyIChfX202NCBfX1gsIF9fbTY0IF9fWSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGhhZGRkICgoX192MnNpKV9fWCwgKF9fdjJzaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHNfcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BoYWRkc3cgKChfX3Y0aGkpX19YLCAoX192NGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJfZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waHN1YncxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJfZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9waHN1YmQxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJzX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGhzdWJzdzEyOCAoKF9fdjhoaSlfX1gsIChfX3Y4aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJfcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Boc3VidyAoKF9fdjRoaSlfX1gsIChfX3Y0aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJfcGkzMiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Boc3ViZCAoKF9fdjJzaSlfX1gsIChfX3Yyc2kpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJzX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9waHN1YnN3ICgoX192NGhpKV9fWCwgKF9fdjRoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWRkdWJzX2VwaTE2IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MTI4ICgoX192MTZxaSlfX1gsIChfX3YxNnFpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWRkdWJzX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cgKChfX3Y4cWkpX19YLCAoX192OHFpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhyc19lcGkxNiAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3MTI4ICgoX192OGhpKV9fWCwgKF9fdjhoaSlfX1kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbXVsaHJzX3BpMTYgKF9fbTY0IF9fWCwgX19tNjQgX19ZKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdyAoKF9fdjRoaSlfX1gsIChfX3Y0aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2h1ZmZsZV9lcGk4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNodWZiMTI4ICgoX192MTZxaSlfX1gsIChfX3YxNnFpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlX3BpOCAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzaHVmYiAoKF9fdjhxaSlfX1gsIChfX3Y4cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2lnbl9lcGk4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcHNpZ25iMTI4ICgoX192MTZxaSlfX1gsIChfX3YxNnFpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NpZ25fZXBpMTYgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2lnbncxMjggKChfX3Y4aGkpX19YLCAoX192OGhpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NpZ25fZXBpMzIgKF9fbTEyOGkgX19YLCBfX20xMjhpIF9fWSkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wc2lnbmQxMjggKChfX3Y0c2kpX19YLCAoX192NHNpKV9fWSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaWduX3BpOCAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzaWduYiAoKF9fdjhxaSlfX1gsIChfX3Y4cWkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NpZ25fcGkxNiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzaWdudyAoKF9fdjRoaSlfX1gsIChfX3Y0aGkpX19ZKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NpZ25fcGkzMiAoX19tNjQgX19YLCBfX202NCBfX1kpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BzaWduZCAoKF9fdjJzaSlfX1gsIChfX3Yyc2kpX19ZKTsKK30KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWxpZ25yX2VwaTgoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIxMjggKChfX3YyZGkpX19YLAorCQkJCQkgICAgICAoX192MmRpKV9fWSwgX19OICogOCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hbGlnbnJfcGk4KF9fbTY0IF9fWCwgX19tNjQgX19ZLCBjb25zdCBpbnQgX19OKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWxpZ25yICgoX192MWRpKV9fWCwKKwkJCQkJIChfX3YxZGkpX19ZLCBfX04gKiA4KTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9hbGlnbnJfZXBpOChYLCBZLCBOKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIxMjggKChfX3YyZGkpKF9fbTEyOGkpKFgpLAkJXAorCQkJCQkoX192MmRpKShfX20xMjhpKShZKSwJCVwKKwkJCQkJKGludCkoTikgKiA4KSkKKyNkZWZpbmUgX21tX2FsaWducl9waTgoWCwgWSwgTikJCQkJCQlcCisgICgoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhbGlnbnIgKChfX3YxZGkpKF9fbTY0KShYKSwJCQlcCisJCQkJICAgKF9fdjFkaSkoX19tNjQpKFkpLAkJCVwKKwkJCQkgICAoaW50KShOKSAqIDgpKQorI2VuZGlmCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Fic19lcGk4IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzYjEyOCAoKF9fdjE2cWkpX19YKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWJzX2VwaTE2IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9wYWJzdzEyOCAoKF9fdjhoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hYnNfZXBpMzIgKF9fbTEyOGkgX19YKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BhYnNkMTI4ICgoX192NHNpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hYnNfcGk4IChfX202NCBfX1gpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhYnNiICgoX192OHFpKV9fWCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hYnNfcGkxNiAoX19tNjQgX19YKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYWJzdyAoKF9fdjRoaSlfX1gpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWJzX3BpMzIgKF9fbTY0IF9fWCkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFic2QgKChfX3Yyc2kpX19YKTsKK30KKworI2VuZGlmIC8qIF9fU1NTRTNfXyAqLworCisjZW5kaWYgLyogX1RNTUlOVFJJTl9IX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS91bndpbmQuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3Vud2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjkwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS91bndpbmQuaApAQCAtMCwwICsxLDI3NiBAQAorLyogRXhjZXB0aW9uIGhhbmRsaW5nIGFuZCBmcmFtZSB1bndpbmQgcnVudGltZSBpbnRlcmZhY2Ugcm91dGluZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworICAgR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAgIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisgICBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisgICAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKyAgIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisgICBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKyAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIFRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBDKysgQUJJIGZvciBJQS02NC4gIFdoZXJlIHdlIGRpdmVyZ2UKKyAgIGZvciBjcm9zcy1hcmNoaXRlY3R1cmUgY29tcGF0aWJpbGl0eSBhcmUgbm90ZWQgd2l0aCAiQEBAIi4gICovCisKKyNpZm5kZWYgX1VOV0lORF9ICisjZGVmaW5lIF9VTldJTkRfSAorCisjaWZuZGVmIEhJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBMZXZlbCAxOiBCYXNlIEFCSSAgKi8KKworLyogQEBAIFRoZSBJQS02NCBBQkkgdXNlcyB1aW50NjQgdGhyb3VnaG91dC4gIE1vc3QgcGxhY2VzIHRoaXMgaXMKKyAgIGluZWZmaWNpZW50IGZvciAzMi1iaXQgYW5kIHNtYWxsZXIgbWFjaGluZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX1dvcmQgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX191bndpbmRfd29yZF9fKSkpOwordHlwZWRlZiBzaWduZWQgX1Vud2luZF9Td29yZCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX3Vud2luZF93b3JkX18pKSk7CisjaWYgZGVmaW5lZChfX2lhNjRfXykgJiYgZGVmaW5lZChfX2hwdXhfXykKK3R5cGVkZWYgdW5zaWduZWQgX1Vud2luZF9QdHIgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX193b3JkX18pKSk7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX1B0ciBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX3BvaW50ZXJfXykpKTsKKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX0ludGVybmFsX1B0ciBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX3BvaW50ZXJfXykpKTsKKworLyogQEBAIFRoZSBJQS02NCBBQkkgdXNlcyBhIDY0LWJpdCB3b3JkIHRvIGlkZW50aWZ5IHRoZSBwcm9kdWNlciBhbmQKKyAgIGNvbnN1bWVyIG9mIGFuIGV4Y2VwdGlvbi4gIFdlJ2xsIGdvIGFsb25nIHdpdGggdGhpcyBmb3Igbm93IGV2ZW4gb24KKyAgIDMyLWJpdCBtYWNoaW5lcy4gIFdlJ2xsIG5lZWQgdG8gcHJvdmlkZSBzb21lIG90aGVyIG9wdGlvbiBmb3IKKyAgIDE2LWJpdCBtYWNoaW5lcyBhbmQgZm9yIG1hY2hpbmVzIHdpdGggPiA4IGJpdHMgcGVyIGJ5dGUuICAqLwordHlwZWRlZiB1bnNpZ25lZCBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcyBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18pKSk7CisKKy8qIFRoZSB1bndpbmQgaW50ZXJmYWNlIHVzZXMgcmVhc29uIGNvZGVzIGluIHNldmVyYWwgY29udGV4dHMgdG8KKyAgIGlkZW50aWZ5IHRoZSByZWFzb25zIGZvciBmYWlsdXJlcyBvciBvdGhlciBhY3Rpb25zLiAgKi8KK3R5cGVkZWYgZW51bQoreworICBfVVJDX05PX1JFQVNPTiA9IDAsCisgIF9VUkNfRk9SRUlHTl9FWENFUFRJT05fQ0FVR0hUID0gMSwKKyAgX1VSQ19GQVRBTF9QSEFTRTJfRVJST1IgPSAyLAorICBfVVJDX0ZBVEFMX1BIQVNFMV9FUlJPUiA9IDMsCisgIF9VUkNfTk9STUFMX1NUT1AgPSA0LAorICBfVVJDX0VORF9PRl9TVEFDSyA9IDUsCisgIF9VUkNfSEFORExFUl9GT1VORCA9IDYsCisgIF9VUkNfSU5TVEFMTF9DT05URVhUID0gNywKKyAgX1VSQ19DT05USU5VRV9VTldJTkQgPSA4Cit9IF9VbndpbmRfUmVhc29uX0NvZGU7CisKKworLyogVGhlIHVud2luZCBpbnRlcmZhY2UgdXNlcyBhIHBvaW50ZXIgdG8gYW4gZXhjZXB0aW9uIGhlYWRlciBvYmplY3QKKyAgIGFzIGl0cyByZXByZXNlbnRhdGlvbiBvZiBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duLiBJbiBnZW5lcmFsLCB0aGUKKyAgIGZ1bGwgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhjZXB0aW9uIG9iamVjdCBpcyBsYW5ndWFnZS0gYW5kCisgICBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYywgYnV0IGl0IHdpbGwgYmUgcHJlZml4ZWQgYnkgYSBoZWFkZXIKKyAgIHVuZGVyc3Rvb2QgYnkgdGhlIHVud2luZCBpbnRlcmZhY2UuICAqLworCitzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb247CisKK3R5cGVkZWYgdm9pZCAoKl9VbndpbmRfRXhjZXB0aW9uX0NsZWFudXBfRm4pIChfVW53aW5kX1JlYXNvbl9Db2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKK3N0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbgoreworICBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcyBleGNlcHRpb25fY2xhc3M7CisgIF9VbndpbmRfRXhjZXB0aW9uX0NsZWFudXBfRm4gZXhjZXB0aW9uX2NsZWFudXA7CisgIF9VbndpbmRfV29yZCBwcml2YXRlXzE7CisgIF9VbndpbmRfV29yZCBwcml2YXRlXzI7CisKKyAgLyogQEBAIFRoZSBJQS02NCBBQkkgc2F5cyB0aGF0IHRoaXMgc3RydWN0dXJlIG11c3QgYmUgZG91YmxlLXdvcmQgYWxpZ25lZC4KKyAgICAgVGFraW5nIHRoYXQgbGl0ZXJhbGx5IGRvZXMgbm90IG1ha2UgbXVjaCBzZW5zZSBnZW5lcmljYWxseS4gIEluc3RlYWQgd2UKKyAgICAgcHJvdmlkZSB0aGUgbWF4aW11bSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgYW55IHR5cGUgZm9yIHRoZSBtYWNoaW5lLiAgKi8KK30gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18pKTsKKworCisvKiBUaGUgQUNUSU9OUyBhcmd1bWVudCB0byB0aGUgcGVyc29uYWxpdHkgcm91dGluZSBpcyBhIGJpdHdpc2UgT1Igb2Ygb25lCisgICBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLiAgKi8KK3R5cGVkZWYgaW50IF9VbndpbmRfQWN0aW9uOworCisjZGVmaW5lIF9VQV9TRUFSQ0hfUEhBU0UJMQorI2RlZmluZSBfVUFfQ0xFQU5VUF9QSEFTRQkyCisjZGVmaW5lIF9VQV9IQU5ETEVSX0ZSQU1FCTQKKyNkZWZpbmUgX1VBX0ZPUkNFX1VOV0lORAk4CisjZGVmaW5lIF9VQV9FTkRfT0ZfU1RBQ0sJMTYKKworLyogVGhlIHRhcmdldCBjYW4gb3ZlcnJpZGUgdGhpcyBtYWNybyB0byBkZWZpbmUgYW55IGJhY2stZW5kLXNwZWNpZmljCisgICBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciB0aGUgbG93ZXN0LWxldmVsIHN0YWNrIGZyYW1lLiAgKi8KKyNpZm5kZWYgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCisjZGVmaW5lIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorI2VuZGlmCisKKy8qIFRoaXMgaXMgYW4gb3BhcXVlIHR5cGUgdXNlZCB0byByZWZlciB0byBhIHN5c3RlbS1zcGVjaWZpYyBkYXRhCisgICBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgc3lzdGVtIHVud2luZGVyLiBUaGlzIGNvbnRleHQgaXMgY3JlYXRlZCBhbmQKKyAgIGRlc3Ryb3llZCBieSB0aGUgc3lzdGVtLCBhbmQgcGFzc2VkIHRvIHRoZSBwZXJzb25hbGl0eSByb3V0aW5lCisgICBkdXJpbmcgdW53aW5kaW5nLiAgKi8KK3N0cnVjdCBfVW53aW5kX0NvbnRleHQ7CisKKy8qIFJhaXNlIGFuIGV4Y2VwdGlvbiwgcGFzc2luZyBhbG9uZyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIG9iamVjdC4gICovCitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfUmFpc2VFeGNlcHRpb24gKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKKworLyogUmFpc2UgYW4gZXhjZXB0aW9uIGZvciBmb3JjZWQgdW53aW5kaW5nLiAgKi8KKwordHlwZWRlZiBfVW53aW5kX1JlYXNvbl9Db2RlICgqX1Vud2luZF9TdG9wX0ZuKQorICAgICAoaW50LCBfVW53aW5kX0FjdGlvbiwgX1Vud2luZF9FeGNlcHRpb25fQ2xhc3MsCisgICAgICBzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKiwgc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCB2b2lkICopOworCitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfRm9yY2VkVW53aW5kIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKiwgX1Vud2luZF9TdG9wX0ZuLCB2b2lkICopOworCisvKiBIZWxwZXIgdG8gaW52b2tlIHRoZSBleGNlcHRpb25fY2xlYW51cCByb3V0aW5lLiAgKi8KK2V4dGVybiB2b2lkIF9VbndpbmRfRGVsZXRlRXhjZXB0aW9uIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKKy8qIFJlc3VtZSBwcm9wYWdhdGlvbiBvZiBhbiBleGlzdGluZyBleGNlcHRpb24uICBUaGlzIGlzIHVzZWQgYWZ0ZXIKKyAgIGUuZy4gZXhlY3V0aW5nIGNsZWFudXAgY29kZSwgYW5kIG5vdCB0byBpbXBsZW1lbnQgcmV0aHJvd2luZy4gICovCitleHRlcm4gdm9pZCBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfUmVzdW1lIChzdHJ1Y3QgX1Vud2luZF9FeGNlcHRpb24gKik7CisKKy8qIEBAQCBSZXN1bWUgcHJvcGFnYXRpb24gb2YgYSBGT1JDRV9VTldJTkQgZXhjZXB0aW9uLCBvciB0byByZXRocm93CisgICBhIG5vcm1hbCBleGNlcHRpb24gdGhhdCB3YXMgaGFuZGxlZC4gICovCitleHRlcm4gX1Vud2luZF9SZWFzb25fQ29kZSBMSUJHQ0MyX1VOV0lORF9BVFRSSUJVVEUKK19VbndpbmRfUmVzdW1lX29yX1JldGhyb3cgKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKKworLyogQEBAIFVzZSB1bndpbmQgZGF0YSB0byBwZXJmb3JtIGEgc3RhY2sgYmFja3RyYWNlLiAgVGhlIHRyYWNlIGNhbGxiYWNrCisgICBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHN0YWNrIGZyYW1lIGluIHRoZSBjYWxsIGNoYWluLCBidXQgbm8gY2xlYW51cAorICAgYWN0aW9ucyBhcmUgcGVyZm9ybWVkLiAgKi8KK3R5cGVkZWYgX1Vud2luZF9SZWFzb25fQ29kZSAoKl9VbndpbmRfVHJhY2VfRm4pCisgICAgIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIHZvaWQgKik7CisKK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9CYWNrdHJhY2UgKF9VbndpbmRfVHJhY2VfRm4sIHZvaWQgKik7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgY29tbXVuaWNhdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdW53aW5kCisgICBjb250ZXh0IChpLmUuIHRoZSB1bndpbmQgZGVzY3JpcHRvcnMgYW5kIHRoZSB1c2VyIHJlZ2lzdGVyIHN0YXRlKSBiZXR3ZWVuCisgICB0aGUgdW53aW5kIGxpYnJhcnkgYW5kIHRoZSBwZXJzb25hbGl0eSByb3V0aW5lIGFuZCBsYW5kaW5nIHBhZC4gIE9ubHkKKyAgIHNlbGVjdGVkIHJlZ2lzdGVycyBtYXkgYmUgbWFuaXB1bGF0ZWQuICAqLworCitleHRlcm4gX1Vud2luZF9Xb3JkIF9VbndpbmRfR2V0R1IgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgaW50KTsKK2V4dGVybiB2b2lkIF9VbndpbmRfU2V0R1IgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKiwgaW50LCBfVW53aW5kX1dvcmQpOworCitleHRlcm4gX1Vud2luZF9QdHIgX1Vud2luZF9HZXRJUCAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKK2V4dGVybiBfVW53aW5kX1B0ciBfVW53aW5kX0dldElQSW5mbyAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqLCBpbnQgKik7CitleHRlcm4gdm9pZCBfVW53aW5kX1NldElQIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICosIF9VbndpbmRfUHRyKTsKKworLyogQEBAIFJldHJpZXZlIHRoZSBDRkEgb2YgdGhlIGdpdmVuIGNvbnRleHQuICAqLworZXh0ZXJuIF9VbndpbmRfV29yZCBfVW53aW5kX0dldENGQSAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKworZXh0ZXJuIHZvaWQgKl9VbndpbmRfR2V0TGFuZ3VhZ2VTcGVjaWZpY0RhdGEgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKik7CisKK2V4dGVybiBfVW53aW5kX1B0ciBfVW53aW5kX0dldFJlZ2lvblN0YXJ0IChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworCisKKy8qIFRoZSBwZXJzb25hbGl0eSByb3V0aW5lIGlzIHRoZSBmdW5jdGlvbiBpbiB0aGUgQysrIChvciBvdGhlciBsYW5ndWFnZSkKKyAgIHJ1bnRpbWUgbGlicmFyeSB3aGljaCBzZXJ2ZXMgYXMgYW4gaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN5c3RlbSB1bndpbmQKKyAgIGxpYnJhcnkgYW5kIGxhbmd1YWdlLXNwZWNpZmljIGV4Y2VwdGlvbiBoYW5kbGluZyBzZW1hbnRpY3MuICBJdCBpcworICAgc3BlY2lmaWMgdG8gdGhlIGNvZGUgZnJhZ21lbnQgZGVzY3JpYmVkIGJ5IGFuIHVud2luZCBpbmZvIGJsb2NrLCBhbmQKKyAgIGl0IGlzIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgcG9pbnRlciBpbiB0aGUgdW53aW5kIGluZm8gYmxvY2ssIGFuZAorICAgaGVuY2UgaXQgaGFzIG5vIEFCSS1zcGVjaWZpZWQgbmFtZS4KKworICAgTm90ZSB0aGF0IHRoaXMgaW1wbGllcyB0aGF0IHR3byBkaWZmZXJlbnQgQysrIGltcGxlbWVudGF0aW9ucyBjYW4KKyAgIHVzZSBkaWZmZXJlbnQgbmFtZXMsIGFuZCBoYXZlIGRpZmZlcmVudCBjb250ZW50cyBpbiB0aGUgbGFuZ3VhZ2UKKyAgIHNwZWNpZmljIGRhdGEgYXJlYS4gIE1vcmVvdmVyLCB0aGF0IHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBkYXRhCisgICBhcmVhIGNvbnRhaW5zIG5vIHZlcnNpb24gaW5mbyBiZWNhdXNlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGludm9rZWQKKyAgIHByb3ZpZGVzIG1vcmUgZWZmZWN0aXZlIHZlcnNpb25pbmcgYnkgZGV0ZWN0aW5nIGF0IGxpbmsgdGltZSB0aGUKKyAgIGxhY2sgb2YgY29kZSB0byBoYW5kbGUgdGhlIGRpZmZlcmVudCBkYXRhIGZvcm1hdC4gICovCisKK3R5cGVkZWYgX1Vud2luZF9SZWFzb25fQ29kZSAoKl9VbndpbmRfUGVyc29uYWxpdHlfRm4pCisgICAgIChpbnQsIF9VbndpbmRfQWN0aW9uLCBfVW53aW5kX0V4Y2VwdGlvbl9DbGFzcywKKyAgICAgIHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqLCBzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworCisvKiBAQEAgVGhlIGZvbGxvd2luZyBhbHRlcm5hdGUgZW50cnkgcG9pbnRzIGFyZSBmb3Igc2V0am1wL2xvbmdqbXAKKyAgIGJhc2VkIHVud2luZGluZy4gICovCisKK3N0cnVjdCBTakxqX0Z1bmN0aW9uX0NvbnRleHQ7CitleHRlcm4gdm9pZCBfVW53aW5kX1NqTGpfUmVnaXN0ZXIgKHN0cnVjdCBTakxqX0Z1bmN0aW9uX0NvbnRleHQgKik7CitleHRlcm4gdm9pZCBfVW53aW5kX1NqTGpfVW5yZWdpc3RlciAoc3RydWN0IFNqTGpfRnVuY3Rpb25fQ29udGV4dCAqKTsKKworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1NqTGpfUmFpc2VFeGNlcHRpb24gKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKK2V4dGVybiBfVW53aW5kX1JlYXNvbl9Db2RlIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9TakxqX0ZvcmNlZFVud2luZCAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICosIF9VbndpbmRfU3RvcF9Gbiwgdm9pZCAqKTsKK2V4dGVybiB2b2lkIExJQkdDQzJfVU5XSU5EX0FUVFJJQlVURQorX1Vud2luZF9TakxqX1Jlc3VtZSAoc3RydWN0IF9VbndpbmRfRXhjZXB0aW9uICopOworZXh0ZXJuIF9VbndpbmRfUmVhc29uX0NvZGUgTElCR0NDMl9VTldJTkRfQVRUUklCVVRFCitfVW53aW5kX1NqTGpfUmVzdW1lX29yX1JldGhyb3cgKHN0cnVjdCBfVW53aW5kX0V4Y2VwdGlvbiAqKTsKKworLyogQEBAIFRoZSBmb2xsb3dpbmcgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGJhc2UgYWRkcmVzc2VzIGZvciB0ZXh0CisgICBhbmQgZGF0YS1yZWxhdGl2ZSBhZGRyZXNzaW5nIGluIHRoZSBMRFNBLiAgSW4gb3JkZXIgdG8gc3RheSBsaW5rCisgICBjb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkIEFCSSBmb3IgSUEtNjQsIHdlIGlubGluZSB0aGVzZS4gICovCisKKyNpZmRlZiBfX2lhNjRfXworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgaW5saW5lIF9VbndpbmRfUHRyCitfVW53aW5kX0dldERhdGFSZWxCYXNlIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICpfQykKK3sKKyAgLyogVGhlIEdQIGlzIHN0b3JlZCBpbiBSMS4gICovCisgIHJldHVybiBfVW53aW5kX0dldEdSIChfQywgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX1Vud2luZF9QdHIKK19VbndpbmRfR2V0VGV4dFJlbEJhc2UgKHN0cnVjdCBfVW53aW5kX0NvbnRleHQgKl9DIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkpCit7CisgIGFib3J0ICgpOworICByZXR1cm4gMDsKK30KKworLyogQEBAIFJldHJpZXZlIHRoZSBCYWNraW5nIFN0b3JlIFBvaW50ZXIgb2YgdGhlIGdpdmVuIGNvbnRleHQuICAqLworZXh0ZXJuIF9VbndpbmRfV29yZCBfVW53aW5kX0dldEJTUCAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKKyNlbHNlCitleHRlcm4gX1Vud2luZF9QdHIgX1Vud2luZF9HZXREYXRhUmVsQmFzZSAoc3RydWN0IF9VbndpbmRfQ29udGV4dCAqKTsKK2V4dGVybiBfVW53aW5kX1B0ciBfVW53aW5kX0dldFRleHRSZWxCYXNlIChzdHJ1Y3QgX1Vud2luZF9Db250ZXh0ICopOworI2VuZGlmCisKKy8qIEBAQCBHaXZlbiBhbiBhZGRyZXNzLCByZXR1cm4gdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBmdW5jdGlvbiB0aGF0CisgICBjb250YWlucyBpdC4gICovCitleHRlcm4gdm9pZCAqIF9VbndpbmRfRmluZEVuY2xvc2luZ0Z1bmN0aW9uICh2b2lkICpwYyk7CisKKyNpZm5kZWYgX19TSVpFT0ZfTE9OR19fCisgICNlcnJvciAiX19TSVpFT0ZfTE9OR19fIG1hY3JvIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKKyNpZm5kZWYgX19TSVpFT0ZfUE9JTlRFUl9fCisgICNlcnJvciAiX19TSVpFT0ZfUE9JTlRFUl9fIG1hY3JvIG5vdCBkZWZpbmVkIgorI2VuZGlmCisKKworLyogbGViMTI4IHR5cGUgbnVtYmVycyBoYXZlIGEgcG90ZW50aWFsbHkgdW5saW1pdGVkIHNpemUuCisgICBUaGUgdGFyZ2V0IG9mIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgb2YgX3NsZWIxMjhfdCBhbmQgX3VsZWIxMjhfdAorICAgaXMgdG8gaGF2ZSBlZmZpY2llbnQgZGF0YSB0eXBlcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbGViMTI4IHR5cGUKKyAgIG51bWJlcnMgdXNlZCBpbiB0aGUgdW53aW5kIGNvZGUuCisgICBNb3N0bHkgdGhlc2UgdHlwZXMgd2lsbCBzaW1wbHkgYmUgZGVmaW5lZCB0byBsb25nIGFuZCB1bnNpZ25lZCBsb25nCisgICBleGNlcHQgd2hlbiBhIHVuc2lnbmVkIGxvbmcgZGF0YSB0eXBlIG9uIHRoZSB0YXJnZXQgbWFjaGluZSBpcyBub3QKKyAgIGNhcGFibGUgb2Ygc3RvcmluZyBhIHBvaW50ZXIuICAqLworCisjaWYgX19TSVpFT0ZfTE9OR19fID49IF9fU0laRU9GX1BPSU5URVJfXworICB0eXBlZGVmIGxvbmcgX3NsZWIxMjhfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF91bGViMTI4X3Q7CisjZWxpZiBfX1NJWkVPRl9MT05HX0xPTkdfXyA+PSBfX1NJWkVPRl9QT0lOVEVSX18KKyAgdHlwZWRlZiBsb25nIGxvbmcgX3NsZWIxMjhfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX3VsZWIxMjhfdDsKKyNlbHNlCisjIGVycm9yICJXaGF0IHR5cGUgc2hhbGwgd2UgdXNlIGZvciBfc2xlYjEyOF90PyIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaWZuZGVmIEhJREVfRVhQT1JUUworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKyNlbmRpZgorCisjZW5kaWYgLyogdW53aW5kLmggKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3ZhcmFyZ3MuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3ZhcmFyZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjk4MDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUvdmFyYXJncy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfVkFSQVJHU19ICisjZGVmaW5lIF9WQVJBUkdTX0gKKworI2Vycm9yICJHQ0Mgbm8gbG9uZ2VyIGltcGxlbWVudHMgPHZhcmFyZ3MuaD4uIgorI2Vycm9yICJSZXZpc2UgeW91ciBjb2RlIHRvIHVzZSA8c3RkYXJnLmg+LiIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS93bW1pbnRyaW4uaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbmNsdWRlL3dtbWludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGJkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS93bW1pbnRyaW4uaApAQCAtMCwwICsxLDEyMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiAxMC4xLiAgKi8KKworI2lmbmRlZiBfV01NSU5UUklOX0hfSU5DTFVERUQKKyNkZWZpbmUgX1dNTUlOVFJJTl9IX0lOQ0xVREVECisKKy8qIFdlIG5lZWQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgU1NFMiBoZWFkZXIgZmlsZS4gICovCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpZiAhZGVmaW5lZCAoX19BRVNfXykgJiYgIWRlZmluZWQgKF9fUENMTVVMX18pCisjIGVycm9yICJBRVMvUENMTVVMIGluc3RydWN0aW9ucyBub3QgZW5hYmxlZCIKKyNlbHNlCisKKy8qIEFFUyAqLworCisjaWZkZWYgX19BRVNfXworLyogUGVyZm9ybXMgMSByb3VuZCBvZiBBRVMgZGVjcnlwdGlvbiBvZiB0aGUgZmlyc3QgbTEyOGkgdXNpbmcgCisgICB0aGUgc2Vjb25kIG0xMjhpIGFzIGEgcm91bmQga2V5LiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Flc2RlY19zaTEyOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2RlYzEyOCAoKF9fdjJkaSlfX1gsIChfX3YyZGkpX19ZKTsKK30KKworLyogUGVyZm9ybXMgdGhlIGxhc3Qgcm91bmQgb2YgQUVTIGRlY3J5cHRpb24gb2YgdGhlIGZpcnN0IG0xMjhpIAorICAgdXNpbmcgdGhlIHNlY29uZCBtMTI4aSBhcyBhIHJvdW5kIGtleS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZXNkZWNsYXN0X3NpMTI4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDEyOCAoKF9fdjJkaSlfX1gsCisJCQkJCQkgKF9fdjJkaSlfX1kpOworfQorCisvKiBQZXJmb3JtcyAxIHJvdW5kIG9mIEFFUyBlbmNyeXB0aW9uIG9mIHRoZSBmaXJzdCBtMTI4aSB1c2luZyAKKyAgIHRoZSBzZWNvbmQgbTEyOGkgYXMgYSByb3VuZCBrZXkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWVzZW5jX3NpMTI4IChfX20xMjhpIF9fWCwgX19tMTI4aSBfX1kpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfYWVzZW5jMTI4ICgoX192MmRpKV9fWCwgKF9fdjJkaSlfX1kpOworfQorCisvKiBQZXJmb3JtcyB0aGUgbGFzdCByb3VuZCBvZiBBRVMgZW5jcnlwdGlvbiBvZiB0aGUgZmlyc3QgbTEyOGkKKyAgIHVzaW5nIHRoZSBzZWNvbmQgbTEyOGkgYXMgYSByb3VuZCBrZXkuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWVzZW5jbGFzdF9zaTEyOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3QxMjggKChfX3YyZGkpX19YLCAoX192MmRpKV9fWSk7Cit9CisKKy8qIFBlcmZvcm1zIHRoZSBJbnZlcnNlTWl4Q29sdW1uIG9wZXJhdGlvbiBvbiB0aGUgc291cmNlIG0xMjhpIAorICAgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gbTEyOGkgZGVzdGluYXRpb24uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWVzaW1jX3NpMTI4IChfX20xMjhpIF9fWCkKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNpbWMxMjggKChfX3YyZGkpX19YKTsKK30KKworLyogR2VuZXJhdGVzIGEgbTEyOGkgcm91bmQga2V5IGZvciB0aGUgaW5wdXQgbTEyOGkgQUVTIGNpcGhlciBrZXkgYW5kCisgICBieXRlIHJvdW5kIGNvbnN0YW50LiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNvbXBpbGUgdGltZQorICAgY29uc3RhbnQuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYWVza2V5Z2VuYXNzaXN0X3NpMTI4IChfX20xMjhpIF9fWCwgY29uc3QgaW50IF9fQykKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl9hZXNrZXlnZW5hc3Npc3QxMjggKChfX3YyZGkpX19YLCBfX0MpOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2Flc2tleWdlbmFzc2lzdF9zaTEyOChYLCBDKQkJCQkJXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX2Flc2tleWdlbmFzc2lzdDEyOCAoKF9fdjJkaSkoX19tMTI4aSkoWCksCVwKKwkJCQkJCShpbnQpKEMpKSkKKyNlbmRpZgorI2VuZGlmICAvKiBfX0FFU19fICovCisKKy8qIFBDTE1VTCAqLworCisjaWZkZWYgX19QQ0xNVUxfXworLyogUGVyZm9ybXMgY2FycnktbGVzcyBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uIG9mIDY0LWJpdCBoYWx2ZXMgb2YKKyAgIDEyOC1iaXQgaW5wdXQgb3BlcmFuZHMuICBUaGUgdGhpcmQgcGFyYW1ldGVyIGluZHVjYXRlcyB3aGljaCA2NC1iaXQKKyAgIGhhdmVzIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIHYxIGFuZCB2MiBzaG91bGQgYmUgdXNlZC4gSXQgbXVzdCBiZQorICAgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY2xtdWxlcGk2NF9zaTEyOCAoX19tMTI4aSBfX1gsIF9fbTEyOGkgX19ZLCBjb25zdCBpbnQgX19JKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3BjbG11bHFkcTEyOCAoKF9fdjJkaSlfX1gsCisJCQkJCQkoX192MmRpKV9fWSwgX19JKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9jbG11bGVwaTY0X3NpMTI4KFgsIFksIEkpCQkJCQlcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfcGNsbXVscWRxMTI4ICgoX192MmRpKShfX20xMjhpKShYKSwJCVwKKwkJCQkJICAoX192MmRpKShfX20xMjhpKShZKSwgKGludCkoSSkpKQorI2VuZGlmCisjZW5kaWYgIC8qIF9fUENMTVVMX18gICovCisKKyNlbmRpZiAvKiBfX0FFU19fL19fUENMTVVMX18gKi8KKworI2VuZGlmIC8qIF9XTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUveDg2aW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS94ODZpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI0M2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUveDg2aW50cmluLmgKQEAgLTAsMCArMSw5NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9YODZJTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfWDg2SU5UUklOX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGlhMzJpbnRyaW4uaD4KKworI2lmZGVmIF9fTU1YX18KKyNpbmNsdWRlIDxtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRV9fCisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFMl9fCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NFM19fCisjaW5jbHVkZSA8cG1taW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1NTRTNfXworI2luY2x1ZGUgPHRtbWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1NTRTRBX18KKyNpbmNsdWRlIDxhbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TU0U0XzJfXykgfHwgZGVmaW5lZCAoX19TU0U0XzFfXykKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19BRVNfXykgfHwgZGVmaW5lZCAoX19QQ0xNVUxfXykKKyNpbmNsdWRlIDx3bW1pbnRyaW4uaD4KKyNlbmRpZgorCisvKiBGb3IgaW5jbHVkaW5nIEFWWCBpbnN0cnVjdGlvbnMgKi8KKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKworI2lmZGVmIF9fM2ROT1dfXworI2luY2x1ZGUgPG1tM2Rub3cuaD4KKyNlbmRpZgorCisjaWZkZWYgX19GTUE0X18KKyNpbmNsdWRlIDxmbWE0aW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fWE9QX18KKyNpbmNsdWRlIDx4b3BpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19MV1BfXworI2luY2x1ZGUgPGx3cGludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0FCTV9fCisjaW5jbHVkZSA8YWJtaW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQk1JX18KKyNpbmNsdWRlIDxibWlpbnRyaW4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19UQk1fXworI2luY2x1ZGUgPHRibWludHJpbi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX1BPUENOVF9fCisjaW5jbHVkZSA8cG9wY250aW50cmluLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9YODZJTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUveG1taW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS94bW1pbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWVmYTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUveG1taW50cmluLmgKQEAgLTAsMCArMSwxMjUxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKKyAgIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorICAgcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorICAgMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisgICBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworICAgc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisgICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBJbXBsZW1lbnRlZCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVkIGluIHRoZSBJbnRlbCBDKysgQ29tcGlsZXIKKyAgIFVzZXIgR3VpZGUgYW5kIFJlZmVyZW5jZSwgdmVyc2lvbiA5LjAuICAqLworCisjaWZuZGVmIF9YTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfWE1NSU5UUklOX0hfSU5DTFVERUQKKworI2lmbmRlZiBfX1NTRV9fCisjIGVycm9yICJTU0UgaW5zdHJ1Y3Rpb24gc2V0IG5vdCBlbmFibGVkIgorI2Vsc2UKKworLyogV2UgbmVlZCB0eXBlIGRlZmluaXRpb25zIGZyb20gdGhlIE1NWCBoZWFkZXIgZmlsZS4gICovCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKworLyogR2V0IF9tbV9tYWxsb2MgKCkgYW5kIF9tbV9mcmVlICgpLiAgKi8KKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKworLyogVGhlIEludGVsIEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdGhhdCB3ZSBtdXN0IGFsbG93IGFsaWFzaW5nIHdpdGggb3RoZXIKKyAgIHZlY3RvciB0eXBlcywgYW5kIHRoZWlyIHNjYWxhciBjb21wb25lbnRzLiAgKi8KK3R5cGVkZWYgZmxvYXQgX19tMTI4IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSwgX19tYXlfYWxpYXNfXykpOworCisvKiBJbnRlcm5hbCBkYXRhIHR5cGVzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGludHJpbnNpY3MuICAqLwordHlwZWRlZiBmbG9hdCBfX3Y0c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisKKy8qIENyZWF0ZSBhIHNlbGVjdG9yIGZvciB1c2Ugd2l0aCB0aGUgU0hVRlBTIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgX01NX1NIVUZGTEUoZnAzLGZwMixmcDEsZnAwKSBcCisgKCgoZnAzKSA8PCA2KSB8ICgoZnAyKSA8PCA0KSB8ICgoZnAxKSA8PCAyKSB8IChmcDApKQorCisvKiBDb25zdGFudHMgZm9yIHVzZSB3aXRoIF9tbV9wcmVmZXRjaC4gICovCitlbnVtIF9tbV9oaW50Cit7CisgIF9NTV9ISU5UX1QwID0gMywKKyAgX01NX0hJTlRfVDEgPSAyLAorICBfTU1fSElOVF9UMiA9IDEsCisgIF9NTV9ISU5UX05UQSA9IDAKK307CisKKy8qIEJpdHMgaW4gdGhlIE1YQ1NSLiAgKi8KKyNkZWZpbmUgX01NX0VYQ0VQVF9NQVNLICAgICAgIDB4MDAzZgorI2RlZmluZSBfTU1fRVhDRVBUX0lOVkFMSUQgICAgMHgwMDAxCisjZGVmaW5lIF9NTV9FWENFUFRfREVOT1JNICAgICAweDAwMDIKKyNkZWZpbmUgX01NX0VYQ0VQVF9ESVZfWkVSTyAgIDB4MDAwNAorI2RlZmluZSBfTU1fRVhDRVBUX09WRVJGTE9XICAgMHgwMDA4CisjZGVmaW5lIF9NTV9FWENFUFRfVU5ERVJGTE9XICAweDAwMTAKKyNkZWZpbmUgX01NX0VYQ0VQVF9JTkVYQUNUICAgIDB4MDAyMAorCisjZGVmaW5lIF9NTV9NQVNLX01BU0sgICAgICAgICAweDFmODAKKyNkZWZpbmUgX01NX01BU0tfSU5WQUxJRCAgICAgIDB4MDA4MAorI2RlZmluZSBfTU1fTUFTS19ERU5PUk0gICAgICAgMHgwMTAwCisjZGVmaW5lIF9NTV9NQVNLX0RJVl9aRVJPICAgICAweDAyMDAKKyNkZWZpbmUgX01NX01BU0tfT1ZFUkZMT1cgICAgIDB4MDQwMAorI2RlZmluZSBfTU1fTUFTS19VTkRFUkZMT1cgICAgMHgwODAwCisjZGVmaW5lIF9NTV9NQVNLX0lORVhBQ1QgICAgICAweDEwMDAKKworI2RlZmluZSBfTU1fUk9VTkRfTUFTSyAgICAgICAgMHg2MDAwCisjZGVmaW5lIF9NTV9ST1VORF9ORUFSRVNUICAgICAweDAwMDAKKyNkZWZpbmUgX01NX1JPVU5EX0RPV04gICAgICAgIDB4MjAwMAorI2RlZmluZSBfTU1fUk9VTkRfVVAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIF9NTV9ST1VORF9UT1dBUkRfWkVSTyAweDYwMDAKKworI2RlZmluZSBfTU1fRkxVU0hfWkVST19NQVNLICAgMHg4MDAwCisjZGVmaW5lIF9NTV9GTFVTSF9aRVJPX09OICAgICAweDgwMDAKKyNkZWZpbmUgX01NX0ZMVVNIX1pFUk9fT0ZGICAgIDB4MDAwMAorCisvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgemVyb3MuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXR6ZXJvX3BzICh2b2lkKQoreworICByZXR1cm4gX19leHRlbnNpb25fXyAoX19tMTI4KXsgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiB9OworfQorCisvKiBQZXJmb3JtIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBvbiB0aGUgbG93ZXIgU1BGUCAoc2luZ2xlLXByZWNpc2lvbgorICAgZmxvYXRpbmctcG9pbnQpIHZhbHVlcyBvZiBBIGFuZCBCOyB0aGUgdXBwZXIgdGhyZWUgU1BGUCB2YWx1ZXMgYXJlCisgICBwYXNzZWQgdGhyb3VnaCBmcm9tIEEuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FkZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2FkZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N1Yl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3N1YnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX211bHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2Rpdl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2RpdnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NxcnRfc3MgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zcXJ0c3MgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yY3Bfc3MgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9yY3BzcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JzcXJ0X3NzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcnNxcnRzcyAoKF9fdjRzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21pbl9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21pbnNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21heHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBQZXJmb3JtIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBvbiB0aGUgZm91ciBTUEZQIHZhbHVlcyBpbiBBIGFuZCBCLiAgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hZGRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9hZGRwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdWJfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zdWJwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tdWxfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tdWxwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9kaXZfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9kaXZwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zcXJ0X3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc3FydHBzICgoX192NHNmKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcmNwX3BzIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfcmNwcHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yc3FydF9wcyAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9taW5wcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tYXhwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogUGVyZm9ybSBsb2dpY2FsIGJpdC13aXNlIG9wZXJhdGlvbnMgb24gMTI4LWJpdCB2YWx1ZXMuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2FuZF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2FuZHBzIChfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fYW5kbm90X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfYW5kbnBzIChfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fb3JfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9vcnBzIChfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1feG9yX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfeG9ycHMgKF9fQSwgX19CKTsKK30KKworLyogUGVyZm9ybSBhIGNvbXBhcmlzb24gb24gdGhlIGxvd2VyIFNQRlAgdmFsdWVzIG9mIEEgYW5kIEIuICBJZiB0aGUKKyAgIGNvbXBhcmlzb24gaXMgdHJ1ZSwgcGxhY2UgYSBtYXNrIG9mIGFsbCBvbmVzIGluIHRoZSByZXN1bHQsIG90aGVyd2lzZSBhCisgICBtYXNrIG9mIHplcm9zLiAgVGhlIHVwcGVyIHRocmVlIFNQRlAgdmFsdWVzIGFyZSBwYXNzZWQgdGhyb3VnaCBmcm9tIEEuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZXFzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGx0c3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbGVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBsZXNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c3MgKChfX3Y0c2YpIF9fQSwKKwkJCQkJKF9fdjRzZikKKwkJCQkJX19idWlsdGluX2lhMzJfY21wbHRzcyAoKF9fdjRzZikgX19CLAorCQkJCQkJCQkoX192NHNmKQorCQkJCQkJCQlfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBnZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdnNzICgoX192NHNmKSBfX0EsCisJCQkJCShfX3Y0c2YpCisJCQkJCV9fYnVpbHRpbl9pYTMyX2NtcGxlc3MgKChfX3Y0c2YpIF9fQiwKKwkJCQkJCQkJKF9fdjRzZikKKwkJCQkJCQkJX19BKSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmVxc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmx0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmx0c3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmxlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmxlc3MgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92c3MgKChfX3Y0c2YpIF9fQSwKKwkJCQkJKF9fdjRzZikKKwkJCQkJX19idWlsdGluX2lhMzJfY21wbmx0c3MgKChfX3Y0c2YpIF9fQiwKKwkJCQkJCQkJIChfX3Y0c2YpCisJCQkJCQkJCSBfX0EpKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBuZ2Vfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzcyAoKF9fdjRzZikgX19BLAorCQkJCQkoX192NHNmKQorCQkJCQlfX2J1aWx0aW5faWEzMl9jbXBubGVzcyAoKF9fdjRzZikgX19CLAorCQkJCQkJCQkgKF9fdjRzZikKKwkJCQkJCQkJIF9fQSkpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcG9yZF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcG9yZHNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcHVub3JkX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wdW5vcmRzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogUGVyZm9ybSBhIGNvbXBhcmlzb24gb24gdGhlIGZvdXIgU1BGUCB2YWx1ZXMgb2YgQSBhbmQgQi4gIEZvciBlYWNoCisgICBlbGVtZW50LCBpZiB0aGUgY29tcGFyaXNvbiBpcyB0cnVlLCBwbGFjZSBhIG1hc2sgb2YgYWxsIG9uZXMgaW4gdGhlCisgICByZXN1bHQsIG90aGVyd2lzZSBhIG1hc2sgb2YgemVyb3MuICAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGVxX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZXFwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBsdF9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGx0cHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbGVfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXBsZXBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NtcGd0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wZ3RwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbXBnZV9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2NtcGdlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmVxX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmVxcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmx0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmx0cHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmxlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmxlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmd0X3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmd0cHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wbmdlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wbmdlcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wb3JkX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY21wb3JkcHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY21wdW5vcmRfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9jbXB1bm9yZHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBDb21wYXJlIHRoZSBsb3dlciBTUEZQIHZhbHVlcyBvZiBBIGFuZCBCIGFuZCByZXR1cm4gMSBpZiB0cnVlCisgICBhbmQgMCBpZiBmYWxzZS4gICovCisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taWVxICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlsdF9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlsdCAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbGVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jb21pbGUgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29taWd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taWd0ICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWlnZV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2NvbWlnZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21pbmVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY29taW5lcSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWVxX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWllcSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWx0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlsdCAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWxlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlsZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWd0X3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlndCAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taWdlX3NzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdWNvbWlnZSAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91Y29taW5lcV9zcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3Vjb21pbmVxICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBDb252ZXJ0IHRoZSBsb3dlciBTUEZQIHZhbHVlIHRvIGEgMzItYml0IGludGVnZXIgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CisgICByb3VuZGluZyBtb2RlLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3Nfc2kzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dF9zczJzaSAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9tbV9jdnRzc19zaTMyIChfX0EpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogQ29udmVydCB0aGUgbG93ZXIgU1BGUCB2YWx1ZSB0byBhIDMyLWJpdCBpbnRlZ2VyIGFjY29yZGluZyB0byB0aGUKKyAgIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gICovCisKKy8qIEludGVsIGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNzX3NpNjQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorCisvKiBNaWNyb3NvZnQgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c3Nfc2k2NHggKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorI2VuZGlmCisKKy8qIENvbnZlcnQgdGhlIHR3byBsb3dlciBTUEZQIHZhbHVlcyB0byAzMi1iaXQgaW50ZWdlcnMgYWNjb3JkaW5nIHRvIHRoZQorICAgY3VycmVudCByb3VuZGluZyBtb2RlLiAgUmV0dXJuIHRoZSBpbnRlZ2VycyBpbiBwYWNrZWQgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHNfcGkzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfY3Z0cHMycGkgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRfcHMycGkgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfbW1fY3Z0cHNfcGkzMiAoX19BKTsKK30KKworLyogVHJ1bmNhdGUgdGhlIGxvd2VyIFNQRlAgdmFsdWUgdG8gYSAzMi1iaXQgaW50ZWdlci4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzc19zaTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpICgoX192NHNmKSBfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRfc3Myc2kgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfbW1fY3Z0dHNzX3NpMzIgKF9fQSk7Cit9CisKKyNpZmRlZiBfX3g4Nl82NF9fCisvKiBUcnVuY2F0ZSB0aGUgbG93ZXIgU1BGUCB2YWx1ZSB0byBhIDMyLWJpdCBpbnRlZ2VyLiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBsb25nIGxvbmcgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0dHNzX3NpNjQgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2k2NCAoKF9fdjRzZikgX19BKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRzc19zaTY0eCAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaTY0ICgoX192NHNmKSBfX0EpOworfQorI2VuZGlmCisKKy8qIFRydW5jYXRlIHRoZSB0d28gbG93ZXIgU1BGUCB2YWx1ZXMgdG8gMzItYml0IGludGVnZXJzLiAgUmV0dXJuIHRoZQorICAgaW50ZWdlcnMgaW4gcGFja2VkIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHRwc19waTMyIChfX20xMjggX19BKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9jdnR0cHMycGkgKChfX3Y0c2YpIF9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnR0X3BzMnBpIChfX20xMjggX19BKQoreworICByZXR1cm4gX21tX2N2dHRwc19waTMyIChfX0EpOworfQorCisvKiBDb252ZXJ0IEIgdG8gYSBTUEZQIHZhbHVlIGFuZCBpbnNlcnQgaXQgYXMgZWxlbWVudCB6ZXJvIGluIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRzaTMyX3NzIChfX20xMjggX19BLCBpbnQgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0c2kyc3MgKChfX3Y0c2YpIF9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRfc2kyc3MgKF9fbTEyOCBfX0EsIGludCBfX0IpCit7CisgIHJldHVybiBfbW1fY3Z0c2kzMl9zcyAoX19BLCBfX0IpOworfQorCisjaWZkZWYgX194ODZfNjRfXworLyogQ29udmVydCBCIHRvIGEgU1BGUCB2YWx1ZSBhbmQgaW5zZXJ0IGl0IGFzIGVsZW1lbnQgemVybyBpbiBBLiAgKi8KKworLyogSW50ZWwgaW50cmluc2ljLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0c2k2NF9zcyAoX19tMTI4IF9fQSwgbG9uZyBsb25nIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2N2dHNpNjQyc3MgKChfX3Y0c2YpIF9fQSwgX19CKTsKK30KKworLyogTWljcm9zb2Z0IGludHJpbnNpYy4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNpNjR4X3NzIChfX20xMjggX19BLCBsb25nIGxvbmcgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0c2k2NDJzcyAoKF9fdjRzZikgX19BLCBfX0IpOworfQorI2VuZGlmCisKKy8qIENvbnZlcnQgdGhlIHR3byAzMi1iaXQgdmFsdWVzIGluIEIgdG8gU1BGUCBmb3JtIGFuZCBpbnNlcnQgdGhlbQorICAgYXMgdGhlIHR3byBsb3dlciBlbGVtZW50cyBpbiBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cGkzMl9wcyAoX19tMTI4IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKChfX3Y0c2YpIF9fQSwgKF9fdjJzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dF9waTJwcyAoX19tMTI4IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX2N2dHBpMzJfcHMgKF9fQSwgX19CKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciBzaWduZWQgMTYtYml0IHZhbHVlcyBpbiBBIHRvIFNQRlAgZm9ybS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBpMTZfcHMgKF9fbTY0IF9fQSkKK3sKKyAgX192NGhpIF9fc2lnbjsKKyAgX192MnNpIF9faGlzaSwgX19sb3NpOworICBfX3Y0c2YgX196ZXJvLCBfX3JhLCBfX3JiOworCisgIC8qIFRoaXMgY29tcGFyaXNvbiBhZ2FpbnN0IHplcm8gZ2l2ZXMgdXMgYSBtYXNrIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAgICAgZmlsbCBpbiB0aGUgbWlzc2luZyBzaWduIGJpdHMgaW4gdGhlIHVucGFjayBvcGVyYXRpb25zIGJlbG93LCBzbworICAgICB0aGF0IHdlIGdldCBzaWduZWQgdmFsdWVzIGFmdGVyIHVucGFja2luZy4gICovCisgIF9fc2lnbiA9IF9fYnVpbHRpbl9pYTMyX3BjbXBndHcgKChfX3Y0aGkpMExMLCAoX192NGhpKV9fQSk7CisKKyAgLyogQ29udmVydCB0aGUgZm91ciB3b3JkcyB0byBkb3VibGV3b3Jkcy4gICovCisgIF9fbG9zaSA9IChfX3Yyc2kpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCAoKF9fdjRoaSlfX0EsIF9fc2lnbik7CisgIF9faGlzaSA9IChfX3Yyc2kpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZCAoKF9fdjRoaSlfX0EsIF9fc2lnbik7CisKKyAgLyogQ29udmVydCB0aGUgZG91Ymxld29yZHMgdG8gZmxvYXRpbmcgcG9pbnQgdHdvIGF0IGEgdGltZS4gICovCisgIF9femVybyA9IChfX3Y0c2YpIF9tbV9zZXR6ZXJvX3BzICgpOworICBfX3JhID0gX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKF9femVybywgX19sb3NpKTsKKyAgX19yYiA9IF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzIChfX3JhLCBfX2hpc2kpOworCisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3JhLCBfX3JiKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciB1bnNpZ25lZCAxNi1iaXQgdmFsdWVzIGluIEEgdG8gU1BGUCBmb3JtLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY3Z0cHUxNl9wcyAoX19tNjQgX19BKQoreworICBfX3Yyc2kgX19oaXNpLCBfX2xvc2k7CisgIF9fdjRzZiBfX3plcm8sIF9fcmEsIF9fcmI7CisKKyAgLyogQ29udmVydCB0aGUgZm91ciB3b3JkcyB0byBkb3VibGV3b3Jkcy4gICovCisgIF9fbG9zaSA9IChfX3Yyc2kpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCAoKF9fdjRoaSlfX0EsIChfX3Y0aGkpMExMKTsKKyAgX19oaXNpID0gKF9fdjJzaSkgX19idWlsdGluX2lhMzJfcHVucGNraHdkICgoX192NGhpKV9fQSwgKF9fdjRoaSkwTEwpOworCisgIC8qIENvbnZlcnQgdGhlIGRvdWJsZXdvcmRzIHRvIGZsb2F0aW5nIHBvaW50IHR3byBhdCBhIHRpbWUuICAqLworICBfX3plcm8gPSAoX192NHNmKSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX19yYSA9IF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzIChfX3plcm8sIF9fbG9zaSk7CisgIF9fcmIgPSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoX19yYSwgX19oaXNpKTsKKworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92bGhwcyAoX19yYSwgX19yYik7Cit9CisKKy8qIENvbnZlcnQgdGhlIGxvdyBmb3VyIHNpZ25lZCA4LWJpdCB2YWx1ZXMgaW4gQSB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaThfcHMgKF9fbTY0IF9fQSkKK3sKKyAgX192OHFpIF9fc2lnbjsKKworICAvKiBUaGlzIGNvbXBhcmlzb24gYWdhaW5zdCB6ZXJvIGdpdmVzIHVzIGEgbWFzayB0aGF0IGNhbiBiZSB1c2VkIHRvCisgICAgIGZpbGwgaW4gdGhlIG1pc3Npbmcgc2lnbiBiaXRzIGluIHRoZSB1bnBhY2sgb3BlcmF0aW9ucyBiZWxvdywgc28KKyAgICAgdGhhdCB3ZSBnZXQgc2lnbmVkIHZhbHVlcyBhZnRlciB1bnBhY2tpbmcuICAqLworICBfX3NpZ24gPSBfX2J1aWx0aW5faWEzMl9wY21wZ3RiICgoX192OHFpKTBMTCwgKF9fdjhxaSlfX0EpOworCisgIC8qIENvbnZlcnQgdGhlIGZvdXIgbG93IGJ5dGVzIHRvIHdvcmRzLiAgKi8KKyAgX19BID0gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wdW5wY2tsYncgKChfX3Y4cWkpX19BLCBfX3NpZ24pOworCisgIHJldHVybiBfbW1fY3Z0cGkxNl9wcyhfX0EpOworfQorCisvKiBDb252ZXJ0IHRoZSBsb3cgZm91ciB1bnNpZ25lZCA4LWJpdCB2YWx1ZXMgaW4gQSB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwdThfcHMoX19tNjQgX19BKQoreworICBfX0EgPSAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3B1bnBja2xidyAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpMExMKTsKKyAgcmV0dXJuIF9tbV9jdnRwdTE2X3BzKF9fQSk7Cit9CisKKy8qIENvbnZlcnQgdGhlIGZvdXIgc2lnbmVkIDMyLWJpdCB2YWx1ZXMgaW4gQSBhbmQgQiB0byBTUEZQIGZvcm0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwaTMyeDJfcHMoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIF9fdjRzZiBfX3plcm8gPSAoX192NHNmKSBfbW1fc2V0emVyb19wcyAoKTsKKyAgX192NHNmIF9fc2ZhID0gX19idWlsdGluX2lhMzJfY3Z0cGkycHMgKF9femVybywgKF9fdjJzaSlfX0EpOworICBfX3Y0c2YgX19zZmIgPSBfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyAoX19zZmEsIChfX3Yyc2kpX19CKTsKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX21vdmxocHMgKF9fc2ZhLCBfX3NmYik7Cit9CisKKy8qIENvbnZlcnQgdGhlIGZvdXIgU1BGUCB2YWx1ZXMgaW4gQSB0byBmb3VyIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHBzX3BpMTYoX19tMTI4IF9fQSkKK3sKKyAgX192NHNmIF9faGlzZiA9IChfX3Y0c2YpX19BOworICBfX3Y0c2YgX19sb3NmID0gX19idWlsdGluX2lhMzJfbW92aGxwcyAoX19oaXNmLCBfX2hpc2YpOworICBfX3Yyc2kgX19oaXNpID0gX19idWlsdGluX2lhMzJfY3Z0cHMycGkgKF9faGlzZik7CisgIF9fdjJzaSBfX2xvc2kgPSBfX2J1aWx0aW5faWEzMl9jdnRwczJwaSAoX19sb3NmKTsKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcGFja3NzZHcgKF9faGlzaSwgX19sb3NpKTsKK30KKworLyogQ29udmVydCB0aGUgZm91ciBTUEZQIHZhbHVlcyBpbiBBIHRvIGZvdXIgc2lnbmVkIDgtYml0IGludGVnZXJzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jdnRwc19waTgoX19tMTI4IF9fQSkKK3sKKyAgX192NGhpIF9fdG1wID0gKF9fdjRoaSkgX21tX2N2dHBzX3BpMTYgKF9fQSk7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diIChfX3RtcCwgKF9fdjRoaSkwTEwpOworfQorCisvKiBTZWxlY3RzIGZvdXIgc3BlY2lmaWMgU1BGUCB2YWx1ZXMgZnJvbSBBIGFuZCBCIGJhc2VkIG9uIE1BU0suICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaHVmZmxlX3BzIChfX20xMjggX19BLCBfX20xMjggX19CLCBpbnQgY29uc3QgX19tYXNrKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2h1ZnBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IsIF9fbWFzayk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fc2h1ZmZsZV9wcyhBLCBCLCBNQVNLKQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfc2h1ZnBzICgoX192NHNmKShfX20xMjgpKEEpLAkJCVwKKwkJCQkgICAoX192NHNmKShfX20xMjgpKEIpLCAoaW50KShNQVNLKSkpCisjZW5kaWYKKworLyogU2VsZWN0cyBhbmQgaW50ZXJsZWF2ZXMgdGhlIHVwcGVyIHR3byBTUEZQIHZhbHVlcyBmcm9tIEEgYW5kIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV91bnBhY2toaV9wcyAoX19tMTI4IF9fQSwgX19tMTI4IF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3VucGNraHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBTZWxlY3RzIGFuZCBpbnRlcmxlYXZlcyB0aGUgbG93ZXIgdHdvIFNQRlAgdmFsdWVzIGZyb20gQSBhbmQgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3VucGFja2xvX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdW5wY2tscHMgKChfX3Y0c2YpX19BLCAoX192NHNmKV9fQik7Cit9CisKKy8qIFNldHMgdGhlIHVwcGVyIHR3byBTUEZQIHZhbHVlcyB3aXRoIDY0LWJpdHMgb2YgZGF0YSBsb2FkZWQgZnJvbSBQOworICAgdGhlIGxvd2VyIHR3byB2YWx1ZXMgYXJlIHBhc3NlZCB0aHJvdWdoIGZyb20gQS4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRoX3BpIChfX20xMjggX19BLCBfX202NCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZGhwcyAoKF9fdjRzZilfX0EsIChjb25zdCBfX3Yyc2YgKilfX1ApOworfQorCisvKiBTdG9yZXMgdGhlIHVwcGVyIHR3byBTUEZQIHZhbHVlcyBvZiBBIGludG8gUC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZWhfcGkgKF9fbTY0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fYnVpbHRpbl9pYTMyX3N0b3JlaHBzICgoX192MnNmICopX19QLCAoX192NHNmKV9fQSk7Cit9CisKKy8qIE1vdmVzIHRoZSB1cHBlciB0d28gdmFsdWVzIG9mIEIgaW50byB0aGUgbG93ZXIgdHdvIHZhbHVlcyBvZiBBLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZWhsX3BzIChfX20xMjggX19BLCBfX20xMjggX19CKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbW92aGxwcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogTW92ZXMgdGhlIGxvd2VyIHR3byB2YWx1ZXMgb2YgQiBpbnRvIHRoZSB1cHBlciB0d28gdmFsdWVzIG9mIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tb3ZlbGhfcHMgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCisvKiBTZXRzIHRoZSBsb3dlciB0d28gU1BGUCB2YWx1ZXMgd2l0aCA2NC1iaXRzIG9mIGRhdGEgbG9hZGVkIGZyb20gUDsKKyAgIHRoZSB1cHBlciB0d28gdmFsdWVzIGFyZSBwYXNzZWQgdGhyb3VnaCBmcm9tIEEuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkbF9waSAoX19tMTI4IF9fQSwgX19tNjQgY29uc3QgKl9fUCkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX2xvYWRscHMgKChfX3Y0c2YpX19BLCAoY29uc3QgX192MnNmICopX19QKTsKK30KKworLyogU3RvcmVzIHRoZSBsb3dlciB0d28gU1BGUCB2YWx1ZXMgb2YgQSBpbnRvIFAuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVsX3BpIChfX202NCAqX19QLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZWxwcyAoKF9fdjJzZiAqKV9fUCwgKF9fdjRzZilfX0EpOworfQorCisvKiBDcmVhdGVzIGEgNC1iaXQgbWFzayBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIFNQRlAgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbW92ZW1hc2tfcHMgKF9fbTEyOCBfX0EpCit7CisgIHJldHVybiBfX2J1aWx0aW5faWEzMl9tb3Ztc2twcyAoKF9fdjRzZilfX0EpOworfQorCisvKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZ2V0Y3NyICh2b2lkKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfc3RteGNzciAoKTsKK30KKworLyogUmVhZCBleGNlcHRpb24gYml0cyBmcm9tIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fR0VUX0VYQ0VQVElPTl9TVEFURSAodm9pZCkKK3sKKyAgcmV0dXJuIF9tbV9nZXRjc3IoKSAmIF9NTV9FWENFUFRfTUFTSzsKK30KKworZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9HRVRfRVhDRVBUSU9OX01BU0sgKHZvaWQpCit7CisgIHJldHVybiBfbW1fZ2V0Y3NyKCkgJiBfTU1fTUFTS19NQVNLOworfQorCitleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX0dFVF9ST1VORElOR19NT0RFICh2b2lkKQoreworICByZXR1cm4gX21tX2dldGNzcigpICYgX01NX1JPVU5EX01BU0s7Cit9CisKK2V4dGVybiBfX2lubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fR0VUX0ZMVVNIX1pFUk9fTU9ERSAodm9pZCkKK3sKKyAgcmV0dXJuIF9tbV9nZXRjc3IoKSAmIF9NTV9GTFVTSF9aRVJPX01BU0s7Cit9CisKKy8qIFNldCB0aGUgY29udHJvbCByZWdpc3RlciB0byBJLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldGNzciAodW5zaWduZWQgaW50IF9fSSkKK3sKKyAgX19idWlsdGluX2lhMzJfbGRteGNzciAoX19JKTsKK30KKworLyogU2V0IGV4Y2VwdGlvbiBiaXRzIGluIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX1NFVF9FWENFUFRJT05fU1RBVEUodW5zaWduZWQgaW50IF9fbWFzaykKK3sKKyAgX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9FWENFUFRfTUFTSykgfCBfX21hc2spOworfQorCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19NTV9TRVRfRVhDRVBUSU9OX01BU0sgKHVuc2lnbmVkIGludCBfX21hc2spCit7CisgIF9tbV9zZXRjc3IoKF9tbV9nZXRjc3IoKSAmIH5fTU1fTUFTS19NQVNLKSB8IF9fbWFzayk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX01NX1NFVF9ST1VORElOR19NT0RFICh1bnNpZ25lZCBpbnQgX19tb2RlKQoreworICBfbW1fc2V0Y3NyKChfbW1fZ2V0Y3NyKCkgJiB+X01NX1JPVU5EX01BU0spIHwgX19tb2RlKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfTU1fU0VUX0ZMVVNIX1pFUk9fTU9ERSAodW5zaWduZWQgaW50IF9fbW9kZSkKK3sKKyAgX21tX3NldGNzcigoX21tX2dldGNzcigpICYgfl9NTV9GTFVTSF9aRVJPX01BU0spIHwgX19tb2RlKTsKK30KKworLyogQ3JlYXRlIGEgdmVjdG9yIHdpdGggZWxlbWVudCAwIGFzIEYgYW5kIHRoZSByZXN0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRfc3MgKGZsb2F0IF9fRikKK3sKKyAgcmV0dXJuIF9fZXh0ZW5zaW9uX18gKF9fbTEyOCkoX192NHNmKXsgX19GLCAwLjBmLCAwLjBmLCAwLjBmIH07Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBmb3VyIGVsZW1lbnRzIGVxdWFsIHRvIEYuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXQxX3BzIChmbG9hdCBfX0YpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpKF9fdjRzZil7IF9fRiwgX19GLCBfX0YsIF9fRiB9OworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NldF9wczEgKGZsb2F0IF9fRikKK3sKKyAgcmV0dXJuIF9tbV9zZXQxX3BzIChfX0YpOworfQorCisvKiBDcmVhdGUgYSB2ZWN0b3Igd2l0aCBlbGVtZW50IDAgYXMgKlAgYW5kIHRoZSByZXN0IHplcm8uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2FkX3NzIChmbG9hdCBjb25zdCAqX19QKQoreworICByZXR1cm4gX21tX3NldF9zcyAoKl9fUCk7Cit9CisKKy8qIENyZWF0ZSBhIHZlY3RvciB3aXRoIGFsbCBmb3VyIGVsZW1lbnRzIGVxdWFsIHRvICpQLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZDFfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fc2V0MV9wcyAoKl9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbG9hZF9wczEgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiBfbW1fbG9hZDFfcHMgKF9fUCk7Cit9CisKKy8qIExvYWQgZm91ciBTUEZQIHZhbHVlcyBmcm9tIFAuICBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWRfcHMgKGZsb2F0IGNvbnN0ICpfX1ApCit7CisgIHJldHVybiAoX19tMTI4KSAqKF9fdjRzZiAqKV9fUDsKK30KKworLyogTG9hZCBmb3VyIFNQRlAgdmFsdWVzIGZyb20gUC4gIFRoZSBhZGRyZXNzIG5lZWQgbm90IGJlIDE2LWJ5dGUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2xvYWR1X3BzIChmbG9hdCBjb25zdCAqX19QKQoreworICByZXR1cm4gKF9fbTEyOCkgX19idWlsdGluX2lhMzJfbG9hZHVwcyAoX19QKTsKK30KKworLyogTG9hZCBmb3VyIFNQRlAgdmFsdWVzIGluIHJldmVyc2Ugb3JkZXIuICBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9sb2Fkcl9wcyAoZmxvYXQgY29uc3QgKl9fUCkKK3sKKyAgX192NHNmIF9fdG1wID0gKihfX3Y0c2YgKilfX1A7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9zaHVmcHMgKF9fdG1wLCBfX3RtcCwgX01NX1NIVUZGTEUgKDAsMSwyLDMpKTsKK30KKworLyogQ3JlYXRlIHRoZSB2ZWN0b3IgW1ogWSBYIFddLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2V0X3BzIChjb25zdCBmbG9hdCBfX1osIGNvbnN0IGZsb2F0IF9fWSwgY29uc3QgZmxvYXQgX19YLCBjb25zdCBmbG9hdCBfX1cpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpKF9fdjRzZil7IF9fVywgX19YLCBfX1ksIF9fWiB9OworfQorCisvKiBDcmVhdGUgdGhlIHZlY3RvciBbVyBYIFkgWl0uICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zZXRyX3BzIChmbG9hdCBfX1osIGZsb2F0IF9fWSwgZmxvYXQgX19YLCBmbG9hdCBfX1cpCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIChfX20xMjgpKF9fdjRzZil7IF9fWiwgX19ZLCBfX1gsIF9fVyB9OworfQorCisvKiBTdG9yZXMgdGhlIGxvd2VyIFNQRlAgdmFsdWUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfc3MgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgICpfX1AgPSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0c2YgKChfX3Y0c2YpX19BLCAwKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGZsb2F0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2N2dHNzX2YzMiAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRzZiAoKF9fdjRzZilfX0EsIDApOworfQorCisvKiBTdG9yZSBmb3VyIFNQRlAgdmFsdWVzLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfcHMgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgICooX192NHNmICopX19QID0gKF9fdjRzZilfX0E7Cit9CisKKy8qIFN0b3JlIGZvdXIgU1BGUCB2YWx1ZXMuICBUaGUgYWRkcmVzcyBuZWVkIG5vdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmV1X3BzIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9zdG9yZXVwcyAoX19QLCAoX192NHNmKV9fQSk7Cit9CisKKy8qIFN0b3JlIHRoZSBsb3dlciBTUEZQIHZhbHVlIGFjcm9zcyBmb3VyIHdvcmRzLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3N0b3JlMV9wcyAoZmxvYXQgKl9fUCwgX19tMTI4IF9fQSkKK3sKKyAgX192NHNmIF9fdmEgPSAoX192NHNmKV9fQTsKKyAgX192NHNmIF9fdG1wID0gX19idWlsdGluX2lhMzJfc2h1ZnBzIChfX3ZhLCBfX3ZhLCBfTU1fU0hVRkZMRSAoMCwwLDAsMCkpOworICBfbW1fc3RvcmV1X3BzIChfX1AsIF9fdG1wKTsKK30KKworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RvcmVfcHMxIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfbW1fc3RvcmUxX3BzIChfX1AsIF9fQSk7Cit9CisKKy8qIFN0b3JlIGZvdXIgU1BGUCB2YWx1ZXMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZC4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdG9yZXJfcHMgKGZsb2F0ICpfX1AsIF9fbTEyOCBfX0EpCit7CisgIF9fdjRzZiBfX3ZhID0gKF9fdjRzZilfX0E7CisgIF9fdjRzZiBfX3RtcCA9IF9fYnVpbHRpbl9pYTMyX3NodWZwcyAoX192YSwgX192YSwgX01NX1NIVUZGTEUgKDAsMSwyLDMpKTsKKyAgX21tX3N0b3JlX3BzIChfX1AsIF9fdG1wKTsKK30KKworLyogU2V0cyB0aGUgbG93IFNQRlAgdmFsdWUgb2YgQSBmcm9tIHRoZSBsb3cgdmFsdWUgb2YgQi4gICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl9tb3ZzcyAoKF9fdjRzZilfX0EsIChfX3Y0c2YpX19CKTsKK30KKworLyogRXh0cmFjdHMgb25lIG9mIHRoZSBmb3VyIHdvcmRzIG9mIEEuICBUaGUgc2VsZWN0b3IgTiBtdXN0IGJlIGltbWVkaWF0ZS4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2V4dHJhY3RfcGkxNiAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfdmVjX2V4dF92NGhpICgoX192NGhpKV9fQSwgX19OKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BleHRydyAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX21tX2V4dHJhY3RfcGkxNiAoX19BLCBfX04pOworfQorI2Vsc2UKKyNkZWZpbmUgX21tX2V4dHJhY3RfcGkxNihBLCBOKQlcCisgICgoaW50KSBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0aGkgKChfX3Y0aGkpKF9fbTY0KShBKSwgKGludCkoTikpKQorCisjZGVmaW5lIF9tX3BleHRydyhBLCBOKSBfbW1fZXh0cmFjdF9waTE2KEEsIE4pCisjZW5kaWYKKworLyogSW5zZXJ0cyB3b3JkIEQgaW50byBvbmUgb2YgZm91ciB3b3JkcyBvZiBBLiAgVGhlIHNlbGVjdG9yIE4gbXVzdCBiZQorICAgaW1tZWRpYXRlLiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9pbnNlcnRfcGkxNiAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19ELCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y0aGkgKChfX3Y0aGkpX19BLCBfX0QsIF9fTik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BpbnNydyAoX19tNjQgY29uc3QgX19BLCBpbnQgY29uc3QgX19ELCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gX21tX2luc2VydF9waTE2IChfX0EsIF9fRCwgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9pbnNlcnRfcGkxNihBLCBELCBOKQkJCQlcCisgICgoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3ZlY19zZXRfdjRoaSAoKF9fdjRoaSkoX19tNjQpKEEpLAlcCisJCQkJCShpbnQpKEQpLCAoaW50KShOKSkpCisKKyNkZWZpbmUgX21fcGluc3J3KEEsIEQsIE4pIF9tbV9pbnNlcnRfcGkxNihBLCBELCBOKQorI2VuZGlmCisKKy8qIENvbXB1dGUgdGhlIGVsZW1lbnQtd2lzZSBtYXhpbXVtIG9mIHNpZ25lZCAxNi1iaXQgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYXhfcGkxNiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3BtYXhzdyAoKF9fdjRoaSlfX0EsIChfX3Y0aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcG1heHN3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9tYXhfcGkxNiAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSBlbGVtZW50LXdpc2UgbWF4aW11bSBvZiB1bnNpZ25lZCA4LWJpdCB2YWx1ZXMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21heF9wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWF4dWIgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtYXh1YiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fbWF4X3B1OCAoX19BLCBfX0IpOworfQorCisvKiBDb21wdXRlIHRoZSBlbGVtZW50LXdpc2UgbWluaW11bSBvZiBzaWduZWQgMTYtYml0IHZhbHVlcy4gICovCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWluX3BpMTYgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbWluc3cgKChfX3Y0aGkpX19BLCAoX192NGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BtaW5zdyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fbWluX3BpMTYgKF9fQSwgX19CKTsKK30KKworLyogQ29tcHV0ZSB0aGUgZWxlbWVudC13aXNlIG1pbmltdW0gb2YgdW5zaWduZWQgOC1iaXQgdmFsdWVzLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9taW5fcHU4IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIChfX202NCkgX19idWlsdGluX2lhMzJfcG1pbnViICgoX192OHFpKV9fQSwgKF9fdjhxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbWludWIgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX21pbl9wdTggKF9fQSwgX19CKTsKK30KKworLyogQ3JlYXRlIGFuIDgtYml0IG1hc2sgb2YgdGhlIHNpZ25zIG9mIDgtYml0IHZhbHVlcy4gICovCitleHRlcm4gX19pbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21vdmVtYXNrX3BpOCAoX19tNjQgX19BKQoreworICByZXR1cm4gX19idWlsdGluX2lhMzJfcG1vdm1za2IgKChfX3Y4cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3Btb3Ztc2tiIChfX202NCBfX0EpCit7CisgIHJldHVybiBfbW1fbW92ZW1hc2tfcGk4IChfX0EpOworfQorCisvKiBNdWx0aXBseSBmb3VyIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZXMgaW4gQSBieSBmb3VyIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZXMKKyAgIGluIEIgYW5kIHByb2R1Y2UgdGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgMzItYml0IHJlc3VsdHMuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX211bGhpX3B1MTYgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wbXVsaHV3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wbXVsaHV3IChfX202NCBfX0EsIF9fbTY0IF9fQikKK3sKKyAgcmV0dXJuIF9tbV9tdWxoaV9wdTE2IChfX0EsIF9fQik7Cit9CisKKy8qIFJldHVybiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb3VyIDE2LWJpdCB2YWx1ZXMgaW4gQS4gIFRoZSBzZWxlY3RvcgorICAgbXVzdCBiZSBhbiBpbW1lZGlhdGUuICAqLworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NodWZmbGVfcGkxNiAoX19tNjQgX19BLCBpbnQgY29uc3QgX19OKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2h1ZncgKChfX3Y0aGkpX19BLCBfX04pOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wc2h1ZncgKF9fbTY0IF9fQSwgaW50IGNvbnN0IF9fTikKK3sKKyAgcmV0dXJuIF9tbV9zaHVmZmxlX3BpMTYgKF9fQSwgX19OKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9zaHVmZmxlX3BpMTYoQSwgTikgXAorICAoKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2h1ZncgKChfX3Y0aGkpKF9fbTY0KShBKSwgKGludCkoTikpKQorCisjZGVmaW5lIF9tX3BzaHVmdyhBLCBOKSBfbW1fc2h1ZmZsZV9waTE2IChBLCBOKQorI2VuZGlmCisKKy8qIENvbmRpdGlvbmFsbHkgc3RvcmUgYnl0ZSBlbGVtZW50cyBvZiBBIGludG8gUC4gIFRoZSBoaWdoIGJpdCBvZiBlYWNoCisgICBieXRlIGluIHRoZSBzZWxlY3RvciBOIGRldGVybWluZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBieXRlIGZyb20KKyAgIEEgaXMgc3RvcmVkLiAgKi8KK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hc2ttb3ZlX3NpNjQgKF9fbTY0IF9fQSwgX19tNjQgX19OLCBjaGFyICpfX1ApCit7CisgIF9fYnVpbHRpbl9pYTMyX21hc2ttb3ZxICgoX192OHFpKV9fQSwgKF9fdjhxaSlfX04sIF9fUCk7Cit9CisKK2V4dGVybiBfX2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fbWFza21vdnEgKF9fbTY0IF9fQSwgX19tNjQgX19OLCBjaGFyICpfX1ApCit7CisgIF9tbV9tYXNrbW92ZV9zaTY0IChfX0EsIF9fTiwgX19QKTsKK30KKworLyogQ29tcHV0ZSB0aGUgcm91bmRlZCBhdmVyYWdlcyBvZiB0aGUgdW5zaWduZWQgOC1iaXQgdmFsdWVzIGluIEEgYW5kIEIuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2F2Z19wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wYXZnYiAoKF9fdjhxaSlfX0EsIChfX3Y4cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21fcGF2Z2IgKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gX21tX2F2Z19wdTggKF9fQSwgX19CKTsKK30KKworLyogQ29tcHV0ZSB0aGUgcm91bmRlZCBhdmVyYWdlcyBvZiB0aGUgdW5zaWduZWQgMTYtYml0IHZhbHVlcyBpbiBBIGFuZCBCLiAgKi8KK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9hdmdfcHUxNiAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiAoX19tNjQpIF9fYnVpbHRpbl9pYTMyX3Bhdmd3ICgoX192NGhpKV9fQSwgKF9fdjRoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tNjQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbV9wYXZndyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fYXZnX3B1MTYgKF9fQSwgX19CKTsKK30KKworLyogQ29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBvZiB0aGUgdW5zaWduZWQgOC1iaXQKKyAgIHZhbHVlcyBpbiBBIGFuZCBCLiAgUmV0dXJuIHRoZSB2YWx1ZSBpbiB0aGUgbG93ZXIgMTYtYml0IHdvcmQ7IHRoZQorICAgdXBwZXIgd29yZHMgYXJlIGNsZWFyZWQuICAqLworZXh0ZXJuIF9faW5saW5lIF9fbTY0IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3NhZF9wdTggKF9fbTY0IF9fQSwgX19tNjQgX19CKQoreworICByZXR1cm4gKF9fbTY0KSBfX2J1aWx0aW5faWEzMl9wc2FkYncgKChfX3Y4cWkpX19BLCAoX192OHFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX202NCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tX3BzYWRidyAoX19tNjQgX19BLCBfX202NCBfX0IpCit7CisgIHJldHVybiBfbW1fc2FkX3B1OCAoX19BLCBfX0IpOworfQorCisvKiBMb2FkcyBvbmUgY2FjaGUgbGluZSBmcm9tIGFkZHJlc3MgUCB0byBhIGxvY2F0aW9uICJjbG9zZXIiIHRvIHRoZQorICAgcHJvY2Vzc29yLiAgVGhlIHNlbGVjdG9yIEkgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHByZWZldGNoIG9wZXJhdGlvbi4gICovCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wcmVmZXRjaCAoY29uc3Qgdm9pZCAqX19QLCBlbnVtIF9tbV9oaW50IF9fSSkKK3sKKyAgX19idWlsdGluX3ByZWZldGNoIChfX1AsIDAsIF9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcHJlZmV0Y2goUCwgSSkgXAorICBfX2J1aWx0aW5fcHJlZmV0Y2ggKChQKSwgMCwgKEkpKQorI2VuZGlmCisKKy8qIFN0b3JlcyB0aGUgZGF0YSBpbiBBIHRvIHRoZSBhZGRyZXNzIFAgd2l0aG91dCBwb2xsdXRpbmcgdGhlIGNhY2hlcy4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zdHJlYW1fcGkgKF9fbTY0ICpfX1AsIF9fbTY0IF9fQSkKK3sKKyAgX19idWlsdGluX2lhMzJfbW92bnRxICgodW5zaWduZWQgbG9uZyBsb25nICopX19QLCAodW5zaWduZWQgbG9uZyBsb25nKV9fQSk7Cit9CisKKy8qIExpa2V3aXNlLiAgVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc3RyZWFtX3BzIChmbG9hdCAqX19QLCBfX20xMjggX19BKQoreworICBfX2J1aWx0aW5faWEzMl9tb3ZudHBzIChfX1AsIChfX3Y0c2YpX19BKTsKK30KKworLyogR3VhcmFudGVlcyB0aGF0IGV2ZXJ5IHByZWNlZGluZyBzdG9yZSBpcyBnbG9iYWxseSB2aXNpYmxlIGJlZm9yZQorICAgYW55IHN1YnNlcXVlbnQgc3RvcmUuICAqLworZXh0ZXJuIF9faW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2ZlbmNlICh2b2lkKQoreworICBfX2J1aWx0aW5faWEzMl9zZmVuY2UgKCk7Cit9CisKKy8qIFRoZSBleGVjdXRpb24gb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgZGVsYXllZCBieSBhbiBpbXBsZW1lbnRhdGlvbgorICAgc3BlY2lmaWMgYW1vdW50IG9mIHRpbWUuICBUaGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbW9kaWZ5IHRoZQorICAgYXJjaGl0ZWN0dXJhbCBzdGF0ZS4gICovCitleHRlcm4gX19pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wYXVzZSAodm9pZCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyZXA7IG5vcCIgOiA6ICk7Cit9CisKKy8qIFRyYW5zcG9zZSB0aGUgNHg0IG1hdHJpeCBjb21wb3NlZCBvZiByb3dbMC0zXS4gICovCisjZGVmaW5lIF9NTV9UUkFOU1BPU0U0X1BTKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMpCQkJXAorZG8gewkJCQkJCQkJCVwKKyAgX192NHNmIF9fcjAgPSAocm93MCksIF9fcjEgPSAocm93MSksIF9fcjIgPSAocm93MiksIF9fcjMgPSAocm93Myk7CVwKKyAgX192NHNmIF9fdDAgPSBfX2J1aWx0aW5faWEzMl91bnBja2xwcyAoX19yMCwgX19yMSk7CQkJXAorICBfX3Y0c2YgX190MSA9IF9fYnVpbHRpbl9pYTMyX3VucGNrbHBzIChfX3IyLCBfX3IzKTsJCQlcCisgIF9fdjRzZiBfX3QyID0gX19idWlsdGluX2lhMzJfdW5wY2tocHMgKF9fcjAsIF9fcjEpOwkJCVwKKyAgX192NHNmIF9fdDMgPSBfX2J1aWx0aW5faWEzMl91bnBja2hwcyAoX19yMiwgX19yMyk7CQkJXAorICAocm93MCkgPSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3QwLCBfX3QxKTsJCQkJXAorICAocm93MSkgPSBfX2J1aWx0aW5faWEzMl9tb3ZobHBzIChfX3QxLCBfX3QwKTsJCQkJXAorICAocm93MikgPSBfX2J1aWx0aW5faWEzMl9tb3ZsaHBzIChfX3QyLCBfX3QzKTsJCQkJXAorICAocm93MykgPSBfX2J1aWx0aW5faWEzMl9tb3ZobHBzIChfX3QzLCBfX3QyKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyogRm9yIGJhY2t3YXJkIHNvdXJjZSBjb21wYXRpYmlsaXR5LiAgKi8KKyNpZmRlZiBfX1NTRTJfXworIyBpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjZW5kaWYgLyogX19TU0VfXyAqLworI2VuZGlmIC8qIF9YTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUveG9waW50cmluLmggYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5jbHVkZS94b3BpbnRyaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJjYjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luY2x1ZGUveG9waW50cmluLmgKQEAgLTAsMCArMSw4MzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCisgICBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKyAgIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKyAgIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorICAgYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKyAgIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfWDg2SU5UUklOX0hfSU5DTFVERUQKKyMgZXJyb3IgIk5ldmVyIHVzZSA8eG9waW50cmluLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDx4ODZpbnRyaW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfWE9QTU1JTlRSSU5fSF9JTkNMVURFRAorI2RlZmluZSBfWE9QTU1JTlRSSU5fSF9JTkNMVURFRAorCisjaWZuZGVmIF9fWE9QX18KKyMgZXJyb3IgIlhPUCBpbnN0cnVjdGlvbiBzZXQgbm90IGVuYWJsZWQiCisjZWxzZQorCisjaW5jbHVkZSA8Zm1hNGludHJpbi5oPgorCisvKiBJbnRlZ2VyIG11bHRpcGx5L2FkZCBpbnRydWN0aW9ucy4gKi8KK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NzX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzc3d3ICgoX192OGhpKV9fQSwoX192OGhpKV9fQiwgKF9fdjhoaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzd3cgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQiwgKF9fdjhoaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjc2RfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzc3dkICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IsIChfX3Y0c2kpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY2RfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzd2QgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjc19lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3NzZGQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjRzaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWNjX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3Y0c2kpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY3Nsb19lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFsICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IsIChfX3YyZGkpX19DKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fbWFjY2xvX2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxbCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NzaGlfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWNzc2RxaCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CLCAoX192MmRpKV9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX21hY2NoaV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hY3NkcWggKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQiwgKF9fdjJkaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWRkc2RfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CLCBfX20xMjhpIF9fQykKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBtYWRjc3N3ZCAoKF9fdjhoaSlfX0EsKF9fdjhoaSlfX0IsKF9fdjRzaSlfX0MpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9tYWRkZF9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cG1hZGNzd2QgKChfX3Y4aGkpX19BLChfX3Y4aGkpX19CLChfX3Y0c2kpX19DKTsKK30KKworLyogUGFja2VkIEludGVnZXIgSG9yaXpvbnRhbCBBZGQgYW5kIFN1YnRyYWN0ICovCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkd19lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGRidyAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZGRfZXBpOChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkYmQgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRxX2VwaTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJxICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkZF9lcGkxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkd2QgKChfX3Y4aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHFfZXBpMTYoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdxICgoX192OGhpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRxX2VwaTMyKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGRkcSAoKF9fdjRzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkd19lcHU4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR1YncgKChfX3YxNnFpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRkX2VwdTgoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHViZCAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHFfZXB1OChfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkdWJxICgoX192MTZxaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oYWRkZF9lcHUxNihfX20xMjhpIF9fQSkKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBoYWRkdXdkICgoX192OGhpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hhZGRxX2VwdTE2KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhhZGR1d3EgKChfX3Y4aGkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faGFkZHFfZXB1MzIoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVkcSAoKF9fdjRzaSlfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9oc3Vid19lcGk4KF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhzdWJidyAoKF9fdjE2cWkpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1faHN1YmRfZXBpMTYoX19tMTI4aSBfX0EpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwaHN1YndkICgoX192OGhpKV9fQSk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2hzdWJxX2VwaTMyKF9fbTEyOGkgX19BKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGhzdWJkcSAoKF9fdjRzaSlfX0EpOworfQorCisvKiBWZWN0b3IgY29uZGl0aW9uYWwgbW92ZSBhbmQgcGVybXV0ZSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jbW92X3NpMTI4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQiwgX19tMTI4aSBfX0MpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY21vdiAoX19BLCBfX0IsIF9fQyk7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3Blcm1fZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IsIF9fbTEyOGkgX19DKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHBlcm0gKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CLCAoX192MTZxaSlfX0MpOworfQorCisvKiBQYWNrZWQgSW50ZWdlciBSb3RhdGVzIGFuZCBTaGlmdHMKKyAgIFJvdGF0ZXMgLSBOb24tSW1tZWRpYXRlIGZvcm0gKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90X2VwaTgoX19tMTI4aSBfX0EsICBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3RiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdF9lcGkxNihfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdHcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdF9lcGkzMihfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdGQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdF9lcGk2NChfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpICBfX2J1aWx0aW5faWEzMl92cHJvdHEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKKy8qIFJvdGF0ZXMgLSBJbW1lZGlhdGUgZm9ybSAqLworCisjaWZkZWYgX19PUFRJTUlaRV9fCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RpX2VwaTgoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90YmkgKChfX3YxNnFpKV9fQSwgX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcm90aV9lcGkxNihfX20xMjhpIF9fQSwgY29uc3QgaW50IF9fQikKK3sKKyAgcmV0dXJuICAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3R3aSAoKF9fdjhoaSlfX0EsIF9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX3JvdGlfZXBpMzIoX19tMTI4aSBfX0EsIGNvbnN0IGludCBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90ZGkgKChfX3Y0c2kpX19BLCBfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9yb3RpX2VwaTY0KF9fbTEyOGkgX19BLCBjb25zdCBpbnQgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdHFpICgoX192MmRpKV9fQSwgX19CKTsKK30KKyNlbHNlCisjZGVmaW5lIF9tbV9yb3RpX2VwaTgoQSwgTikgXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90YmkgKChfX3YxNnFpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2RlZmluZSBfbW1fcm90aV9lcGkxNihBLCBOKSBcCisgICgoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnByb3R3aSAoKF9fdjhoaSkoX19tMTI4aSkoQSksIChpbnQpKE4pKSkKKyNkZWZpbmUgX21tX3JvdGlfZXBpMzIoQSwgTikgXAorICAoKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwcm90ZGkgKChfX3Y0c2kpKF9fbTEyOGkpKEEpLCAoaW50KShOKSkpCisjZGVmaW5lIF9tbV9yb3RpX2VwaTY0KEEsIE4pIFwKKyAgKChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHJvdHFpICgoX192MmRpKShfX20xMjhpKShBKSwgKGludCkoTikpKQorI2VuZGlmCisKKy8qIFNoaWZ0cyAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGxfZXBpOChfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNobGIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hsX2VwaTE2KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hsdyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hsX2VwaTMyKF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hsX2VwaTY0KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hscSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9zaGFfZXBpOChfX20xMjhpIF9fQSwgIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cHNoYWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hhX2VwaTE2KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hhdyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hhX2VwaTMyKF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hhZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fc2hhX2VwaTY0KF9fbTEyOGkgX19BLCAgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAgKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3Zwc2hhcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworLyogQ29tcGFyZSBhbmQgUHJlZGljYXRlIEdlbmVyYXRpb24KKyAgIHBjb20gKGludGVnZXIsIHVuc2luZ2VkIGJ5dGVzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0dWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZXViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ3R1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdldWIgKChfX3YxNnFpKV9fQSwgKF9fdjE2cWkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXB1OChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcXViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcHU4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbW5lcXViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2V1YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwdTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZXViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgdW5zaW5nZWQgd29yZHMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0dXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxldXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0dXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdldXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwdTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxdXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXF1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXB1MTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2V1dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcHUxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVldXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgdW5zaW5nZWQgZG91YmxlIHdvcmRzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sdHVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZXVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndHVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21nZXVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcHUzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcXVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxdWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwdTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWZhbHNldWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXB1MzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZXVkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHVuc2luZ2VkIHF1YWQgd29yZHMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0dXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWxlX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxldXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0dXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdldXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWVxX2VwdTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxdXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXF1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXB1NjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2V1cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tdHJ1ZV9lcHU2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVldXEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgc2lnbmVkIGJ5dGVzKSAqLworCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sdF9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWxlYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0YiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21nZV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdlYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcGk4KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWVxYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXFiICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWZhbHNlX2VwaTgoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2ViICgoX192MTZxaSlfX0EsIChfX3YxNnFpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXBpOChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb210cnVlYiAoKF9fdjE2cWkpX19BLCAoX192MTZxaSlfX0IpOworfQorCisvKnBjb20gKGludGVnZXIsIHNpZ25lZCB3b3JkcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHR3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwaTE2KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0dyAoKF9fdjhoaSlfX0EsIChfX3Y4aGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2V3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXF3ICgoX192OGhpKV9fQSwgKF9fdjhoaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcGkxNihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXBpMTYoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZXcgKChfX3Y4aGkpX19BLCAoX192OGhpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgc2lnbmVkIGRvdWJsZSB3b3JkcykgKi8KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbHRfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbHRkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21sZV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21sZWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWd0X2VwaTMyKF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWd0ZCAoKF9fdjRzaSlfX0EsIChfX3Y0c2kpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZ2VfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZ2VkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21lcV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21lcWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbW5lcV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21uZXFkICgoX192NHNpKV9fQSwgKF9fdjRzaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21mYWxzZV9lcGkzMihfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21mYWxzZWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbXRydWVfZXBpMzIoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tdHJ1ZWQgKChfX3Y0c2kpX19BLCAoX192NHNpKV9fQik7Cit9CisKKy8qcGNvbSAoaW50ZWdlciwgc2lnbmVkIHF1YWQgd29yZHMpICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWx0X2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWx0cSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tbGVfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbGVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21ndF9lcGk2NChfX20xMjhpIF9fQSwgX19tMTI4aSBfX0IpCit7CisgIHJldHVybiAoX19tMTI4aSkgX19idWlsdGluX2lhMzJfdnBjb21ndHEgKChfX3YyZGkpX19BLCAoX192MmRpKV9fQik7Cit9CisKK2V4dGVybiBfX2lubGluZSBfX20xMjhpIF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2NvbWdlX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbWdlcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZXFfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZXFxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb21uZXFfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tbmVxcSAoKF9fdjJkaSlfX0EsIChfX3YyZGkpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGkgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fY29tZmFsc2VfZXBpNjQoX19tMTI4aSBfX0EsIF9fbTEyOGkgX19CKQoreworICByZXR1cm4gKF9fbTEyOGkpIF9fYnVpbHRpbl9pYTMyX3ZwY29tZmFsc2VxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4aSBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9jb210cnVlX2VwaTY0KF9fbTEyOGkgX19BLCBfX20xMjhpIF9fQikKK3sKKyAgcmV0dXJuIChfX20xMjhpKSBfX2J1aWx0aW5faWEzMl92cGNvbXRydWVxICgoX192MmRpKV9fQSwgKF9fdjJkaSlfX0IpOworfQorCisvKiBGUkNaICovCisKK2V4dGVybiBfX2lubGluZSBfX20xMjggX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZnJjel9wcyAoX19tMTI4IF9fQSkKK3sKKyAgcmV0dXJuIChfX20xMjgpIF9fYnVpbHRpbl9pYTMyX3ZmcmN6cHMgKChfX3Y0c2YpX19BKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fZnJjel9wZCAoX19tMTI4ZCBfX0EpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZyY3pwZCAoKF9fdjJkZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tX2ZyY3pfc3MgKF9fbTEyOCBfX0EsIF9fbTEyOCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92ZnJjenNzICgoX192NHNmKV9fQSwgKF9fdjRzZilfX0IpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9mcmN6X3NkIChfX20xMjhkIF9fQSwgX19tMTI4ZCBfX0IpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdmZyY3pzZCAoKF9fdjJkZilfX0EsIChfX3YyZGYpX19CKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NiBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mcmN6X3BzIChfX20yNTYgX19BKQoreworICByZXR1cm4gKF9fbTI1NikgX19idWlsdGluX2lhMzJfdmZyY3pwczI1NiAoKF9fdjhzZilfX0EpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2ZCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbTI1Nl9mcmN6X3BkIChfX20yNTZkIF9fQSkKK3sKKyAgcmV0dXJuIChfX20yNTZkKSBfX2J1aWx0aW5faWEzMl92ZnJjenBkMjU2ICgoX192NGRmKV9fQSk7Cit9CisKKy8qIFBFUk1JTDIgKi8KKworI2lmZGVmIF9fT1BUSU1JWkVfXworZXh0ZXJuIF9faW5saW5lIF9fbTEyOGQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW1fcGVybXV0ZTJfcGQgKF9fbTEyOGQgX19YLCBfX20xMjhkIF9fWSwgX19tMTI4aSBfX0MsIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMTI4ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwZCAoKF9fdjJkZilfX1gsCisJCQkJCSAgICAgIChfX3YyZGYpX19ZLAorCQkJCQkgICAgICAoX192MmRpKV9fQywKKwkJCQkJICAgICAgX19JKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTI1NmQgX19hdHRyaWJ1dGVfXygoX19nbnVfaW5saW5lX18sIF9fYWx3YXlzX2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfbW0yNTZfcGVybXV0ZTJfcGQgKF9fbTI1NmQgX19YLCBfX20yNTZkIF9fWSwgX19tMjU2aSBfX0MsIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwZDI1NiAoKF9fdjRkZilfX1gsCisJCQkJCQkgKF9fdjRkZilfX1ksCisJCQkJCQkgKF9fdjRkaSlfX0MsCisJCQkJCQkgX19JKTsKK30KKworZXh0ZXJuIF9faW5saW5lIF9fbTEyOCBfX2F0dHJpYnV0ZV9fKChfX2dudV9pbmxpbmVfXywgX19hbHdheXNfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKK19tbV9wZXJtdXRlMl9wcyAoX19tMTI4IF9fWCwgX19tMTI4IF9fWSwgX19tMTI4aSBfX0MsIGNvbnN0IGludCBfX0kpCit7CisgIHJldHVybiAoX19tMTI4KSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzICgoX192NHNmKV9fWCwKKwkJCQkJICAgICAoX192NHNmKV9fWSwKKwkJCQkJICAgICAoX192NHNpKV9fQywKKwkJCQkJICAgICBfX0kpOworfQorCitleHRlcm4gX19pbmxpbmUgX19tMjU2IF9fYXR0cmlidXRlX18oKF9fZ251X2lubGluZV9fLCBfX2Fsd2F5c19pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQorX21tMjU2X3Blcm11dGUyX3BzIChfX20yNTYgX19YLCBfX20yNTYgX19ZLCBfX20yNTZpIF9fQywgY29uc3QgaW50IF9fSSkKK3sKKyAgcmV0dXJuIChfX20yNTYpIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMyNTYgKChfX3Y4c2YpX19YLAorCQkJCQkJKF9fdjhzZilfX1ksCisJCQkJCQkoX192OHNpKV9fQywKKwkJCQkJCV9fSSk7Cit9CisjZWxzZQorI2RlZmluZSBfbW1fcGVybXV0ZTJfcGQoWCwgWSwgQywgSSkJCQkJCVwKKyAgKChfX20xMjhkKSBfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkICgoX192MmRmKShfX20xMjhkKShYKSwJCVwKKwkJCQkJKF9fdjJkZikoX19tMTI4ZCkoWSksCQlcCisJCQkJCShfX3YyZGkpKF9fbTEyOGQpKEMpLAkJXAorCQkJCQkoaW50KShJKSkpCisKKyNkZWZpbmUgX21tMjU2X3Blcm11dGUyX3BkKFgsIFksIEMsIEkpCQkJCQlcCisgICgoX19tMjU2ZCkgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwZDI1NiAoKF9fdjRkZikoX19tMjU2ZCkoWCksCVwKKwkJCQkJICAgKF9fdjRkZikoX19tMjU2ZCkoWSksCVwKKwkJCQkJICAgKF9fdjRkaSkoX19tMjU2ZCkoQyksCVwKKwkJCQkJICAgKGludCkoSSkpKQorCisjZGVmaW5lIF9tbV9wZXJtdXRlMl9wcyhYLCBZLCBDLCBJKQkJCQkJXAorICAoKF9fbTEyOCkgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwcyAoKF9fdjRzZikoX19tMTI4KShYKSwJCVwKKwkJCQkgICAgICAgKF9fdjRzZikoX19tMTI4KShZKSwJCVwKKwkJCQkgICAgICAgKF9fdjRzaSkoX19tMTI4KShDKSwJCVwKKwkJCQkgICAgICAgKGludCkoSSkpKQorCisjZGVmaW5lIF9tbTI1Nl9wZXJtdXRlMl9wcyhYLCBZLCBDLCBJKQkJCQkJXAorICAoKF9fbTI1NikgX19idWlsdGluX2lhMzJfdnBlcm1pbDJwczI1NiAoKF9fdjhzZikoX19tMjU2KShYKSwJCVwKKwkJCQkJICAoX192OHNmKShfX20yNTYpKFkpLCAgCVwKKwkJCQkJICAoX192OHNpKShfX20yNTYpKEMpLAkJXAorIAkJCQkJICAoaW50KShJKSkpCisjZW5kaWYgLyogX19PUFRJTUlaRV9fICovCisKKyNlbmRpZiAvKiBfX1hPUF9fICovCisKKyNlbmRpZiAvKiBfWE9QTU1JTlRSSU5fSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvZml4aW5jX2xpc3QgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9maXhpbmNfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJiYzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvZml4aW5jX2xpc3QKQEAgLTAsMCArMSBAQAorOwpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvZ3N5c2xpbWl0cy5oIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvZ3N5c2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjI4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9nc3lzbGltaXRzLmgKQEAgLTAsMCArMSw4IEBACisvKiBzeXNsaW1pdHMuaCBzdGFuZHMgZm9yIHRoZSBzeXN0ZW0ncyBvd24gbGltaXRzLmggZmlsZS4KKyAgIElmIHdlIGNhbiB1c2UgaXQgb2sgdW5tb2RpZmllZCwgdGhlbiB3ZSBpbnN0YWxsIHRoaXMgdGV4dC4KKyAgIElmIGZpeGluY2x1ZGVzIGZpeGVzIGl0LCB0aGVuIHRoZSBmaXhlZCB2ZXJzaW9uIGlzIGluc3RhbGxlZAorICAgaW5zdGVhZCBvZiB0aGlzIHRleHQuICAqLworCisjZGVmaW5lIF9HQ0NfTkVYVF9MSU1JVFNfSAkJLyogdGVsbCBnY2MncyBsaW1pdHMuaCB0byByZWN1cnNlICovCisjaW5jbHVkZV9uZXh0IDxsaW1pdHMuaD4KKyN1bmRlZiBfR0NDX05FWFRfTElNSVRTX0gKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvUkVBRE1FIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvaW5jbHVkZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4NmE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1RoaXMgUkVBRE1FIGZpbGUgaXMgY29waWVkIGludG8gdGhlIGRpcmVjdG9yeSBmb3IgR0NDLW9ubHkgaGVhZGVyIGZpbGVzCit3aGVuIGZpeGluY2x1ZGVzIGlzIHJ1biBieSB0aGUgbWFrZWZpbGUgZm9yIEdDQy4KKworTWFueSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnkgd2VyZSBhdXRvbWF0aWNhbGx5IGVkaXRlZCBmcm9tIHRoZQorc3RhbmRhcmQgc3lzdGVtIGhlYWRlciBmaWxlcyBieSB0aGUgZml4aW5jbHVkZXMgcHJvY2Vzcy4gIFRoZXkgYXJlCitzeXN0ZW0tc3BlY2lmaWMsIGFuZCB3aWxsIG5vdCB3b3JrIG9uIGFueSBvdGhlciBraW5kIG9mIHN5c3RlbS4gIFRoZXkKK2FyZSBhbHNvIG5vdCBwYXJ0IG9mIEdDQy4gIFRoZSByZWFzb24gd2UgaGF2ZSB0byBkbyB0aGlzIGlzIGJlY2F1c2UKK0dDQyByZXF1aXJlcyBBTlNJIEMgaGVhZGVycyBhbmQgbWFueSB2ZW5kb3JzIHN1cHBseSBBTlNJLWluY29tcGF0aWJsZQoraGVhZGVycy4KKworQmVjYXVzZSB0aGlzIGlzIGFuIGF1dG9tYXRlZCBwcm9jZXNzLCBzb21ldGltZXMgaGVhZGVycyBnZXQgImZpeGVkIgordGhhdCBkbyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBuZWVkIGEgZml4LiAgQXMgbG9uZyBhcyBub3RoaW5nIGlzIGJyb2tlbgorYnkgdGhlIHByb2Nlc3MsIGl0IGlzIGp1c3QgYW4gdW5mb3J0dW5hdGUgY29sbGF0ZXJhbCBpbmNvbnZlbmllbmNlLgorV2Ugd291bGQgbGlrZSB0byByZWN0aWZ5IGl0LCBpZiBpdCBpcyBub3QgInRvbyBpbmNvbnZlbmllbnQiLgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvaW5jbHVkZS9saW1pdHMuaCBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvbGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjMzVlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2luY2x1ZGUvbGltaXRzLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogVGhpcyBhZG1pbmlzdHJpdmlhIGdldHMgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiBsaW1pdHMuaAorICAgaWYgdGhlIHN5c3RlbSBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGxpbWl0cy5oLiAgKi8KKworLyogV2UgdXNlIF9HQ0NfTElNSVRTX0hfIGJlY2F1c2Ugd2Ugd2FudCB0aGlzIG5vdCB0byBtYXRjaAorICAgYW55IG1hY3JvcyB0aGF0IHRoZSBzeXN0ZW0ncyBsaW1pdHMuaCB1c2VzIGZvciBpdHMgb3duIHB1cnBvc2VzLiAgKi8KKyNpZm5kZWYgX0dDQ19MSU1JVFNfSF8gIC8qIFRlcm1pbmF0ZWQgaW4gbGltaXR5LmguICAqLworI2RlZmluZSBfR0NDX0xJTUlUU19IXworCisjaWZuZGVmIF9MSUJDX0xJTUlUU19IXworLyogVXNlICIuLi4iIHNvIHRoYXQgd2UgZmluZCBzeXNsaW1pdHMuaCBvbmx5IGluIHRoaXMgc2FtZSBkaXJlY3RvcnkuICAqLworI2luY2x1ZGUgInN5c2xpbWl0cy5oIgorI2VuZGlmCisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisgICAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKK3ZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKK1dBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2ZvciBtb3JlIGRldGFpbHMuCisKK1VuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCithIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaWZuZGVmIF9MSU1JVFNfSF9fXworI2RlZmluZSBfTElNSVRTX0hfX18KKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBgY2hhcicuICAqLworI3VuZGVmIENIQVJfQklUCisjZGVmaW5lIENIQVJfQklUIF9fQ0hBUl9CSVRfXworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICAqLworI2lmbmRlZiBNQl9MRU5fTUFYCisjZGVmaW5lIE1CX0xFTl9NQVggMQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBjaGFyJyBjYW4gaG9sZC4gICovCisjdW5kZWYgU0NIQVJfTUlOCisjZGVmaW5lIFNDSEFSX01JTiAoLVNDSEFSX01BWCAtIDEpCisjdW5kZWYgU0NIQVJfTUFYCisjZGVmaW5lIFNDSEFSX01BWCBfX1NDSEFSX01BWF9fCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVDSEFSX01BWAorI2lmIF9fU0NIQVJfTUFYX18gPT0gX19JTlRfTUFYX18KKyMgZGVmaW5lIFVDSEFSX01BWCAoU0NIQVJfTUFYICogMlUgKyAxVSkKKyNlbHNlCisjIGRlZmluZSBVQ0hBUl9NQVggKFNDSEFSX01BWCAqIDIgKyAxKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYGNoYXInIGNhbiBob2xkLiAgKi8KKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworIyB1bmRlZiBDSEFSX01JTgorIyBpZiBfX1NDSEFSX01BWF9fID09IF9fSU5UX01BWF9fCisjICBkZWZpbmUgQ0hBUl9NSU4gMFUKKyMgZWxzZQorIyAgZGVmaW5lIENIQVJfTUlOIDAKKyMgZW5kaWYKKyMgdW5kZWYgQ0hBUl9NQVgKKyMgZGVmaW5lIENIQVJfTUFYIFVDSEFSX01BWAorI2Vsc2UKKyMgdW5kZWYgQ0hBUl9NSU4KKyMgZGVmaW5lIENIQVJfTUlOIFNDSEFSX01JTgorIyB1bmRlZiBDSEFSX01BWAorIyBkZWZpbmUgQ0hBUl9NQVggU0NIQVJfTUFYCisjZW5kaWYKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAqLworI3VuZGVmIFNIUlRfTUlOCisjZGVmaW5lIFNIUlRfTUlOICgtU0hSVF9NQVggLSAxKQorI3VuZGVmIFNIUlRfTUFYCisjZGVmaW5lIFNIUlRfTUFYIF9fU0hSVF9NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVTSFJUX01BWAorI2lmIF9fU0hSVF9NQVhfXyA9PSBfX0lOVF9NQVhfXworIyBkZWZpbmUgVVNIUlRfTUFYIChTSFJUX01BWCAqIDJVICsgMVUpCisjZWxzZQorIyBkZWZpbmUgVVNIUlRfTUFYIChTSFJUX01BWCAqIDIgKyAxKQorI2VuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKi8KKyN1bmRlZiBJTlRfTUlOCisjZGVmaW5lIElOVF9NSU4gKC1JTlRfTUFYIC0gMSkKKyN1bmRlZiBJTlRfTUFYCisjZGVmaW5lIElOVF9NQVggX19JTlRfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyN1bmRlZiBVSU5UX01BWAorI2RlZmluZSBVSU5UX01BWCAoSU5UX01BWCAqIDJVICsgMVUpCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBsb25nIGludCcgY2FuIGhvbGQuCisgICAoU2FtZSBhcyBgaW50JykuICAqLworI3VuZGVmIExPTkdfTUlOCisjZGVmaW5lIExPTkdfTUlOICgtTE9OR19NQVggLSAxTCkKKyN1bmRlZiBMT05HX01BWAorI2RlZmluZSBMT05HX01BWCBfX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMCkuICAqLworI3VuZGVmIFVMT05HX01BWAorI2RlZmluZSBVTE9OR19NQVggKExPTkdfTUFYICogMlVMICsgMVVMKQorCisjaWYgZGVmaW5lZCAoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyB1bmRlZiBMTE9OR19NSU4KKyMgZGVmaW5lIExMT05HX01JTiAoLUxMT05HX01BWCAtIDFMTCkKKyMgdW5kZWYgTExPTkdfTUFYCisjIGRlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwKS4gICovCisjIHVuZGVmIFVMTE9OR19NQVgKKyMgZGVmaW5lIFVMTE9OR19NQVggKExMT05HX01BWCAqIDJVTEwgKyAxVUxMKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pID8gZGVmaW5lZCAoX19VU0VfR05VKSA6ICFkZWZpbmVkIChfX1NUUklDVF9BTlNJX18pCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhIGBzaWduZWQgbG9uZyBsb25nIGludCcgY2FuIGhvbGQuICAqLworIyB1bmRlZiBMT05HX0xPTkdfTUlOCisjIGRlZmluZSBMT05HX0xPTkdfTUlOICgtTE9OR19MT05HX01BWCAtIDFMTCkKKyMgdW5kZWYgTE9OR19MT05HX01BWAorIyBkZWZpbmUgTE9OR19MT05HX01BWCBfX0xPTkdfTE9OR19NQVhfXworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDApLiAgKi8KKyMgdW5kZWYgVUxPTkdfTE9OR19NQVgKKyMgZGVmaW5lIFVMT05HX0xPTkdfTUFYIChMT05HX0xPTkdfTUFYICogMlVMTCArIDFVTEwpCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU1JVFNfSF9fXyAqLworLyogVGhpcyBhZG1pbmlzdHJpdmlhIGdldHMgYWRkZWQgdG8gdGhlIGVuZCBvZiBsaW1pdHMuaAorICAgaWYgdGhlIHN5c3RlbSBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGxpbWl0cy5oLiAgKi8KKworI2Vsc2UgLyogbm90IF9HQ0NfTElNSVRTX0hfICovCisKKyNpZmRlZiBfR0NDX05FWFRfTElNSVRTX0gKKyNpbmNsdWRlX25leHQgPGxpbWl0cy5oPgkJLyogcmVjdXJzZSBkb3duIHRvIHRoZSByZWFsIG9uZSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgX0dDQ19MSU1JVFNfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL21hY3JvX2xpc3QgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9tYWNyb19saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGQ1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9tYWNyb19saXN0CkBAIC0wLDAgKzEsMiBAQAorbGludXgKK3VuaXgKZGlmZiAtLWdpdCBhL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL21raGVhZGVycy5jb25mIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvbWtoZWFkZXJzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2MzJiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL21raGVhZGVycy5jb25mCkBAIC0wLDAgKzEsMyBAQAorU1lTVEVNX0hFQURFUl9ESVI9Ii90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3N5c3Jvb3Qke3N5c3Jvb3RfaGVhZGVyc19zdWZmaXh9L3Vzci9pbmNsdWRlIgorT1RIRVJfRklYSU5DTFVERVNfRElSUz0iIgorU1RNUF9GSVhJTkM9InN0bXAtZml4aW5jIgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmdjYy5hIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmdjYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjVkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZ2NjLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmdjY19laC5hIGIvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmdjY19laC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGQzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZ2NjX2VoLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmdjb3YuYSBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJnY292LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1Y2Y2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJnY292LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYmdtcC5hIGIvbGliL2xpYmdtcC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTE3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGliZ21wLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2xpYmdtcC5sYSBiL2xpYi9saWJnbXAubGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTcyOTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saWJnbXAubGEKQEAgLTAsMCArMSwzNSBAQAorIyBsaWJnbXAubGEgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgbGlidG9vbCAxLjUuMjQgKDEuMTIyMC4yLjQ1NSAyMDA3LzA2LzI0IDAyOjEzOjI5KQorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JycKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPScnCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9J2xpYmdtcC5hJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmdtcC4KK2N1cnJlbnQ9NworYWdlPTQKK3JldmlzaW9uPTQKKworIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/CitpbnN0YWxsZWQ9eWVzCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPW5vCisKKyMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgorZGxvcGVuPScnCitkbHByZW9wZW49JycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPScvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9saWInCmRpZmYgLS1naXQgYS9saWIvbGliaWJlcnR5LmEgYi9saWIvbGliaWJlcnR5LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4ZmU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saWJpYmVydHkuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvbGlibXBjLmEgYi9saWIvbGlibXBjLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmODA3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saWJtcGMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvbGlibXBjLmxhIGIvbGliL2xpYm1wYy5sYQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MDdlNWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2xpYm1wYy5sYQpAQCAtMCwwICsxLDQxIEBACisjIGxpYm1wYy5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAoR05VIGxpYnRvb2wpIDIuMi42IERlYmlhbi0yLjIuNmEtNAorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JycKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPScnCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9J2xpYm1wYy5hJworCisjIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgoraW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nIC1ML3RtcC9haHNpZWgtZ2NjLTY0LVgyNzE5MC8yL3g4Nl82NC1saW51eC1nbGliYzIuNy00LjYvbGliIC90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L2xpYi9saWJtcGZyLmxhIC90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L2xpYi9saWJnbXAubGEnCisKKyMgTmFtZXMgb2YgYWRkaXRpb25hbCB3ZWFrIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkKK3dlYWtfbGlicmFyeV9uYW1lcz0nJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYm1wYy4KK2N1cnJlbnQ9MgorYWdlPTAKK3JldmlzaW9uPTAKKworIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/CitpbnN0YWxsZWQ9eWVzCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPW5vCisKKyMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgorZGxvcGVuPScnCitkbHByZW9wZW49JycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPScvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9saWInCmRpZmYgLS1naXQgYS9saWIvbGlibXBmci5hIGIvbGliL2xpYm1wZnIuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ0NjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2xpYm1wZnIuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvbGlibXBmci5sYSBiL2xpYi9saWJtcGZyLmxhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYzNhODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGlibXBmci5sYQpAQCAtMCwwICsxLDQxIEBACisjIGxpYm1wZnIubGEgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggKEdOVSBsaWJ0b29sKSAyLjIKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPScnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSdsaWJtcGZyLmEnCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPScnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPScgLUwvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9saWIgL3RtcC9haHNpZWgtZ2NjLTY0LVgyNzE5MC8yL3g4Nl82NC1saW51eC1nbGliYzIuNy00LjYvbGliL2xpYmdtcC5sYScKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPScnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGlibXBmci4KK2N1cnJlbnQ9MworYWdlPTIKK3JldmlzaW9uPTAKKworIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/CitpbnN0YWxsZWQ9eWVzCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPW5vCisKKyMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgorZGxvcGVuPScnCitkbHByZW9wZW49JycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPScvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9saWInCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NjMSBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY2MxCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViYTE0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NjMQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NjMXBsdXMgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NjMXBsdXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE3NWU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvY2MxcGx1cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2NvbGxlY3QyIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jb2xsZWN0MgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNmExNmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9jb2xsZWN0MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvZml4aW5jLnNoIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2ZpeGluYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzNhZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2ZpeGluYy5zaApAQCAtMCwwICsxLDQ5OCBAQAorIyEvYmluL3NoCisjCisjIEluc3RhbGwgbW9kaWZpZWQgdmVyc2lvbnMgb2YgY2VydGFpbiBBTlNJLWluY29tcGF0aWJsZSBzeXN0ZW0gaGVhZGVyCisjIGZpbGVzIHdoaWNoIGFyZSBmaXhlZCB0byB3b3JrIGNvcnJlY3RseSB3aXRoIEFOU0kgQyBhbmQgcGxhY2VkIGluIGEKKyMgZGlyZWN0b3J5IHRoYXQgR0NDIHdpbGwgc2VhcmNoLgorIworIyBTZWUgUkVBRE1FLWZpeGluYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMKKyMgIGZpeGluY2x1ZGVzIGNvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMiwgMjAwOQorIyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBmaXhpbmNsdWRlcyBpcyBmcmVlIHNvZnR3YXJlLgorIyAKKyMgWW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMgCisjIGZpeGluY2x1ZGVzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyMgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyAKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBmaXhpbmNsdWRlczsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorIyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworCisjIFVzYWdlOiBmaXhpbmMuc2ggb3V0cHV0LWRpciBpbnB1dC1kaXIKKyMKKyMgRGlyZWN0b3J5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHRzLgorIyBGYWlsIGlmIG5vIGFyZyB0byBzcGVjaWZ5IGEgZGlyZWN0b3J5IGZvciB0aGUgb3V0cHV0LgoraWYgWyAieCQxIiA9ICJ4IiBdCit0aGVuCisgIGVjaG8gZml4aW5jbHVkZXM6IG5vIG91dHB1dCBkaXJlY3Rvcnkgc3BlY2lmaWVkCisgIGV4aXQgMQorZmkKKworTElCPSR7MX0KK3NoaWZ0CisKKyMgTWFrZSBzdXJlIGl0IGV4aXN0cy4KK2lmIFsgISAtZCAkTElCIF07IHRoZW4KKyAgbWtkaXIgJExJQiB8fCB7CisgICAgZWNobyBmaXhpbmNsdWRlczogIG91dHB1dCBkaXIgJ2AnJExJQiInIGNhbm5vdCBiZSBjcmVhdGVkIgorICAgIGV4aXQgMQorICB9CitlbHNlCisgICggY2QgJExJQiAmJiB0b3VjaCBET05FICYmIHJtIERPTkUgKSB8fCB7CisgICAgZWNobyBmaXhpbmNsdWRlczogIG91dHB1dCBkaXIgJ2AnJExJQiInIGlzIGFuIGludmFsaWQgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorICB9CitmaQorCitpZiB0ZXN0IC16ICIkVkVSQk9TRSIKK3RoZW4KKyAgVkVSQk9TRT0yCisgIGV4cG9ydCBWRVJCT1NFCitlbHNlCisgIGNhc2UgIiRWRVJCT1NFIiBpbgorICBbMC05XSApIDogOzsKKyAgKiApICBWRVJCT1NFPTMgOzsKKyAgZXNhYworZmkKKworIyBEZWZpbmUgd2hhdCB0YXJnZXQgc3lzdGVtIHdlJ3JlIGZpeGluZy4KKyMKK2lmIHRlc3QgLXIgLi9NYWtlZmlsZTsgdGhlbgorICB0YXJnZXRfY2Fub25pY2FsPSJgc2VkIC1uIC1lICdzLF50YXJnZXRbIAldKj1bIAldKlwoLipcKSQsXDEscCcgPCBNYWtlZmlsZWAiCitmaQorCisjIElmIG5vdCBmcm9tIHRoZSBNYWtlZmlsZSwgdGhlbiB0cnkgY29uZmlnLmd1ZXNzCisjCitpZiB0ZXN0IC16ICIke3RhcmdldF9jYW5vbmljYWx9IiA7IHRoZW4KKyAgaWYgdGVzdCAteCAuL2NvbmZpZy5ndWVzcyA7IHRoZW4KKyAgICB0YXJnZXRfY2Fub25pY2FsPSJgY29uZmlnLmd1ZXNzYCIgOyBmaQorICB0ZXN0IC16ICIke3RhcmdldF9jYW5vbmljYWx9IiAmJiB0YXJnZXRfY2Fub25pY2FsPXVua25vd24KK2ZpCitleHBvcnQgdGFyZ2V0X2Nhbm9uaWNhbAorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyBEZWZpbmUgUFdEQ01EIGFzIGEgY29tbWFuZCB0byB1c2UgdG8gZ2V0IHRoZSB3b3JraW5nIGRpcgorIyBpbiB0aGUgZm9ybSB0aGF0IHdlIHdhbnQuCitQV0RDTUQ9JHtQV0RDTUQtcHdkfQorCitjYXNlICJgJFBXRENNRGAiIGluCisvLyopCisgICAgIyBPbiBhbiBBcG9sbG8sIGRpc2NhcmQgZXZlcnl0aGluZyBiZWZvcmUgYC91c3InLgorICAgIFBXRENNRD0iZXZhbCBwd2QgfCBzZWQgLWUgJ3MsLiovdXNyLywvdXNyLywnIgorICAgIDs7Citlc2FjCisKKyMgT3JpZ2luYWwgZGlyZWN0b3J5LgorT1JJR0RJUj1gJHtQV0RDTUR9YAorZXhwb3J0IE9SSUdESVIKK0ZJWElOQ0w9YCR7UFdEQ01EfWAvZml4aW5jbAoraWYgWyAhIC14ICRGSVhJTkNMIF0gOyB0aGVuCisgIGVjaG8gIkNhbm5vdCBmaW5kIGZpeGluY2wiID4mMgorICBleGl0IDEKK2ZpCitleHBvcnQgRklYSU5DTAorCisjIE1ha2UgTElCIGFic29sdXRlIG9ubHkgaWYgbmVlZGVkIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhlIGFtZC4KK2Nhc2UgJExJQiBpbgorLyopCisgICAgOzsKKyopCisgICAgY2QgJExJQjsgTElCPWAke1BXRENNRH1gCisgICAgOzsKK2VzYWMKKworaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMAordGhlbiBlY2hvIEZpeGluZyBoZWFkZXJzIGludG8gJHtMSUJ9IGZvciAke3RhcmdldF9jYW5vbmljYWx9IHRhcmdldCA7IGZpCisKKyMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBzeXN0ZW0gaGFzIHN5bWJvbGljIGxpbmtzLgoraWYgdGVzdCAtbiAiJERKRElSIjsgdGhlbgorICBMSU5LUz1mYWxzZQorZWxpZiBsbiAtcyBYICRMSUIvU2hvdWxkTm90RXhpc3QgMj4vZGV2L251bGw7IHRoZW4KKyAgcm0gLWYgJExJQi9TaG91bGROb3RFeGlzdAorICBMSU5LUz10cnVlCitlbGlmIGxuIC1zIFggL3RtcC9TaG91bGROb3RFeGlzdCAyPi9kZXYvbnVsbDsgdGhlbgorICBybSAtZiAvdG1wL1Nob3VsZE5vdEV4aXN0CisgIExJTktTPXRydWUKK2Vsc2UKKyAgTElOS1M9ZmFsc2UKK2ZpCisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCisjICBJbiB0aGUgZmlsZSBtYWNyb19saXN0IGFyZSBsaXN0ZWQgYWxsIHRoZSBwcmVkZWZpbmVkCisjICBtYWNyb3MgdGhhdCBhcmUgbm90IGluIHRoZSBDODkgcmVzZXJ2ZWQgbmFtZXNwYWNlICh0aGUgcmVzZXJ2ZWQKKyMgIG5hbWVzcGFjZSBpcyBhbGwgaWRlbnRpZmllcnMgYmVnaW5ubmluZyB3aXRoIHR3byB1bmRlcnNjb3JlcyBvciBvbmUKKyMgIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYSBjYXBpdGFsIGxldHRlcikuICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBmaW5kCisjICBhbnkgb2YgdGhvc2UgbWFjcm9zIGluIGEgaGVhZGVyIGZpbGUgaXMgd3JpdHRlbiB0byBNTl9OQU1FX1BBVC4KKyMKKyMgIE5vdGUgZGVwZW5kZW5jeSBvbiBBU0NJSS4gXDAxMiA9IG5ld2xpbmUuCisjICB0ciAnICcgJ1xuJyBpcywgYWxhcywgbm90IHBvcnRhYmxlLgorCitpZiB0ZXN0IC1zICR7TUFDUk9fTElTVH0KK3RoZW4KKyAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMDsgdGhlbgorICAgIGVjaG8gIkZvcmJpZGRlbiBpZGVudGlmaWVyczogYHRyICdcMDEyJyAnICcgPCAke01BQ1JPX0xJU1R9YCIKKyAgZmkKKyAgTU5fTkFNRV9QQVQ9ImBzZWQgJ3MvXi9cXFxcPC87IHMvJC9cXFxcPi87ICQhcy8kL3wvJyBcCisgICAgICA8ICR7TUFDUk9fTElTVH0gfCB0ciAtZCAnXDAxMidgIgorICBleHBvcnQgTU5fTkFNRV9QQVQKK2Vsc2UKKyAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMAorICB0aGVuIGVjaG8gIk5vIGZvcmJpZGRlbiBpZGVudGlmaWVycyBkZWZpbmVkIGJ5IHRoaXMgdGFyZ2V0IiA7IGZpCitmaQorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyAgU2VhcmNoIGVhY2ggaW5wdXQgZGlyZWN0b3J5IGZvciBicm9rZW4gaGVhZGVyIGZpbGVzLgorIyAgVGhpcyBsb29wIGVuZHMgbmVhciB0aGUgZW5kIG9mIHRoZSBmaWxlLgorIworaWYgdGVzdCAkIyAtZXEgMAordGhlbgorICAgIElOUFVUTElTVD0iL3Vzci9pbmNsdWRlIgorZWxzZQorICAgIElOUFVUTElTVD0iJEAiCitmaQorCitmb3IgSU5QVVQgaW4gJHtJTlBVVExJU1R9IDsgZG8KKworY2QgJHtPUklHRElSfQorCisjICBNYWtlIHN1cmUgYSBkaXJlY3RvcnkgZXhpc3RzIGJlZm9yZSBjaGFuZ2luZyBpbnRvIGl0LAorIyAgb3RoZXJ3aXNlIFNvbGFyaXMyIHdpbGwgZmFpbC1leGl0IHRoZSBzY3JpcHQuCisjCitpZiBbICEgLWQgJHtJTlBVVH0gXTsgdGhlbgorICBjb250aW51ZQorZmkKK2NkICR7SU5QVVR9CisKK0lOUFVUPWAke1BXRENNRH1gCitleHBvcnQgSU5QVVQKKworIworIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMKKyMKK2lmIHRlc3QgJFZFUkJPU0UgLWd0IDEKK3RoZW4gZWNobyBGaW5kaW5nIGRpcmVjdG9yaWVzIGFuZCBsaW5rcyB0byBkaXJlY3RvcmllcyA7IGZpCisKKyMgRmluZCBhbGwgZGlyZWN0b3JpZXMgYW5kIGFsbCBzeW1saW5rcyB0aGF0IHBvaW50IHRvIGRpcmVjdG9yaWVzLgorIyBQdXQgdGhlIGxpc3QgaW4gJGFsbF9kaXJzLgorIyBFYWNoIHRpbWUgd2UgZmluZCBhIHN5bWxpbmssIGFkZCBpdCB0byBuZXdkaXJzCisjIHNvIHRoYXQgd2UgZG8gYW5vdGhlciBmaW5kIHdpdGhpbiB0aGUgZGlyIHRoZSBsaW5rIHBvaW50cyB0by4KKyMgTm90ZSB0aGF0ICRhbGxfZGlycyBtYXkgaGF2ZSBkdXBsaWNhdGVzIGluIGl0OworIyBsYXRlciBwYXJ0cyBvZiB0aGlzIGZpbGUgYXJlIHN1cHBvc2VkIHRvIGlnbm9yZSB0aGVtLgorZGlycz0iLiIKK2xldmVscz0yCithbGxfZGlycz0iIgorc2VhcmNoX2RpcnM9IiIKKword2hpbGUgWyAtbiAiJGRpcnMiIF0gJiYgWyAkbGV2ZWxzIC1ndCAwIF0KK2RvCisgIGxldmVscz1gZXhwciAkbGV2ZWxzIC0gMWAKKyAgbmV3ZGlycz0KKyAgZm9yIGQgaW4gJGRpcnMKKyAgZG8KKyAgICBpZiB0ZXN0ICRWRVJCT1NFIC1ndCAxCisgICAgdGhlbiBlY2hvICIgU2VhcmNoaW5nICRJTlBVVC8kZCIgOyBmaQorCisgICAgIyBGaW5kIGFsbCBkaXJlY3RvcmllcyB1bmRlciAkZCwgcmVsYXRpdmUgdG8gJGQsIGV4Y2x1ZGluZyAkZCBpdHNlbGYuCisgICAgIyAoVGhlIC8uIGlzIG5lZWRlZCBhZnRlciAkZCBpbiBjYXNlICRkIGlzIGEgc3ltbGluay4pCisgICAgYWxsX2RpcnM9IiRhbGxfZGlycyBgZmluZCAkZC8uIC10eXBlIGQgLXByaW50IHwgXAorICAgICAgICAgICAgICAgc2VkIC1lICcvXC9cLiQvZCcgLWUgJ3NALy4vQC9AZydgIgorICAgICMgRmluZCBhbGwgbGlua3MgdG8gZGlyZWN0b3JpZXMuCisgICAgIyBVc2luZyBgLWV4ZWMgdGVzdCAtZCcgaW4gZmluZCBmYWlscyBvbiBzb21lIHN5c3RlbXMsCisgICAgIyBhbmQgdHJ5aW5nIHRvIHJ1biB0ZXN0IHZpYSBzaCBmYWlscyBvbiBvdGhlcnMsCisgICAgIyBzbyB0aGlzIGlzIHRoZSBzaW1wbGVzdCBhbHRlcm5hdGl2ZSBsZWZ0LgorICAgICMgRmlyc3QgZmluZCBhbGwgdGhlIGxpbmtzLCB0aGVuIHRlc3QgZWFjaCBvbmUuCisgICAgdGhlc2VsaW5rcz0KKyAgICAkTElOS1MgJiYgXAorICAgICAgdGhlc2VsaW5rcz1gZmluZCAkZC8uIC10eXBlIGwgLXByaW50IHwgc2VkIC1lICdzQC8uL0AvQGcnYAorICAgIGZvciBkMSBpbiAkdGhlc2VsaW5rcyAtLWR1bW15LS0KKyAgICBkbworICAgICAgIyBJZiB0aGUgbGluayBwb2ludHMgdG8gYSBkaXJlY3RvcnksCisgICAgICAjIGFkZCB0aGF0IGRpciB0byAkbmV3ZGlycworICAgICAgaWYgWyAtZCAkZDEgXQorICAgICAgdGhlbgorICAgICAgICBhbGxfZGlycz0iJGFsbF9kaXJzICRkMSIKKyAgICAgICAgaWYgWyAiYGxzIC1sZCAkZDEgfCBzZWQgLW4gJ3MvLiotPiAvL3AnYCIgIT0gIi4iIF0KKyAgICAgICAgdGhlbgorICAgICAgICAgIG5ld2RpcnM9IiRuZXdkaXJzICRkMSIKKyAgICAgICAgICBzZWFyY2hfZGlycz0iJHNlYXJjaF9kaXJzICRkMSIKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZG9uZQorICBkb25lCisKKyAgZGlycz0iJG5ld2RpcnMiCitkb25lCisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCitkaXJzPQoraWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgordGhlbiBlY2hvICJBbGwgZGlyZWN0b3JpZXMgKGluY2x1ZGluZyBsaW5rcyB0byBkaXJlY3Rvcmllcyk6IgorICAgICBlY2hvICRhbGxfZGlycworZmkKKworZm9yIGZpbGUgaW4gJGFsbF9kaXJzOyBkbworICBybSAtcmYgJExJQi8kZmlsZQorICBpZiBbICEgLWQgJExJQi8kZmlsZSBdCisgIHRoZW4gbWtkaXIgJExJQi8kZmlsZQorICBmaQorZG9uZQorbWtkaXIgJExJQi9yb290CisKKyMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjCisjCisjIHRyZWV0b3BzIGdldHMgYW4gYWx0ZXJuYXRpbmcgbGlzdAorIyBvZiBvbGQgZGlyZWN0b3JpZXMgdG8gY29weQorIyBhbmQgdGhlIG5ldyBkaXJlY3RvcmllcyB0byBjb3B5IHRvLgordHJlZXRvcHM9Ii4gJHtMSUJ9IgorCitpZiAkTElOS1M7IHRoZW4KKyAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMQorICB0aGVuIGVjaG8gJ01ha2luZyBzeW1ib2xpYyBkaXJlY3RvcnkgbGlua3MnIDsgZmkKKyAgY3dkPWAke1BXRENNRH1gCisKKyAgZm9yIHN5bV9saW5rIGluICRzZWFyY2hfZGlyczsgZG8KKyAgICBjZCAke0lOUFVUfQorICAgIGRlc3Q9YGxzIC1sZCAke3N5bV9saW5rfSB8IHNlZCAtbiAncy8uKi0+IC8vcCdgCisKKyAgICAjIEluIGNhc2UgJGRlc3QgaXMgcmVsYXRpdmUsIGdldCB0byAke3N5bV9saW5rfSdzIGRpciBmaXJzdC4KKyAgICAjCisgICAgY2QgLi9gZWNobyAke3N5bV9saW5rfSB8IHNlZCAnczsvW14vXSokOzsnYAorCisgICAgIyBDaGVjayB0aGF0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4KKyAgICAjIFJlZGlyZWN0aW9ucyBjaGFuZ2VkIHRvIGF2b2lkIGJ1ZyBpbiBzaCBvbiBVbHRyaXguCisgICAgIworICAgIChjZCAkZGVzdCkgPiAvZGV2L251bGwgMj4mMQorICAgIGlmIFsgJD8gPSAwIF07IHRoZW4KKyAgICAgIGNkICRkZXN0CisKKyAgICAgICMgZnVsbF9kZXN0X2RpciBnZXRzIHRoZSBkaXIgdGhhdCB0aGUgbGluayBhY3R1YWxseSBsZWFkcyB0by4KKyAgICAgICMKKyAgICAgIGZ1bGxfZGVzdF9kaXI9YCR7UFdEQ01EfWAKKworICAgICAgIyBDYW5vbmljYWxpemUgJHtJTlBVVH0gbm93IHRvIG1pbmltaXplIHRoZSB0aW1lIGFuCisgICAgICAjIGF1dG9tb3VudGVyIGhhcyB0byBjaGFuZ2UgdGhlIHJlc3VsdCBvZiAke1BXRENNRH0uCisgICAgICAjCisgICAgICBjaW5wdXQ9YGNkICR7SU5QVVR9OyAke1BXRENNRH1gCisKKyAgICAgICMgSWYgYSBsaW5rIHBvaW50cyB0byAuLCBtYWtlIGEgc2ltaWxhciBsaW5rIHRvIC4KKyAgICAgICMKKyAgICAgIGlmIFsgJHtmdWxsX2Rlc3RfZGlyfSA9ICR7Y2lucHV0fSBdOyB0aGVuCisgICAgICAgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDIKKyAgICAgICAgdGhlbiBlY2hvICR7c3ltX2xpbmt9ICctPicgLiAnOiBNYWtpbmcgc2VsZiBsaW5rJyA7IGZpCisgICAgICAgIHJtIC1mciAke0xJQn0vJHtzeW1fbGlua30gPiAvZGV2L251bGwgMj4mMQorICAgICAgICBsbiAtcyAuICR7TElCfS8ke3N5bV9saW5rfSA+IC9kZXYvbnVsbCAyPiYxCisKKyAgICAgICMgSWYgbGluayBsZWFkcyBiYWNrIGludG8gJHtJTlBVVH0sCisgICAgICAjIG1ha2UgYSBzaW1pbGFyIGxpbmsgaGVyZS4KKyAgICAgICMKKyAgICAgIGVsaWYgZXhwciAke2Z1bGxfZGVzdF9kaXJ9IDogIiR7Y2lucHV0fS8uKiIgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgIyBZIGdldHMgdGhlIGFjdHVhbCB0YXJnZXQgZGlyIG5hbWUsIHJlbGF0aXZlIHRvICR7SU5QVVR9LgorICAgICAgICB5PWBlY2hvICR7ZnVsbF9kZXN0X2Rpcn0gfCBzZWQgLW4gInMmJHtjaW5wdXR9LyYmcCJgCisgICAgICAgICMgRE9UUyBpcyB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tICR7TElCfS8ke3N5bV9saW5rfSBiYWNrIHRvICR7TElCfS4KKyAgICAgICAgZG90cz1gZWNobyAiJHtzeW1fbGlua30iIHwKKyAgICAgICAgICBzZWQgLWUgJ3NAXi4vQEAnIC1lICdzQC8uL0AvQGcnIC1lICdzQFteL11bXi9dKkAuLkBnJyAtZSAnc0AuLiRAQCdgCisgICAgICAgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDIKKyAgICAgICAgdGhlbiBlY2hvICR7c3ltX2xpbmt9ICctPicgJGRvdHMkeSAnOiBNYWtpbmcgbG9jYWwgbGluaycgOyBmaQorICAgICAgICBybSAtZnIgJHtMSUJ9LyR7c3ltX2xpbmt9ID4gL2Rldi9udWxsIDI+JjEKKyAgICAgICAgbG4gLXMgJGRvdHMkeSAke0xJQn0vJHtzeW1fbGlua30gPiAvZGV2L251bGwgMj4mMQorCisgICAgICBlbHNlCisgICAgICAgICMgSWYgdGhlIGxpbmsgaXMgdG8gYSBkaXIgJHRhcmdldCBvdXRzaWRlICR7SU5QVVR9LAorICAgICAgICAjIHJlcG9pbnQgdGhlIGxpbmsgYXQgJHtJTlBVVH0vcm9vdCR0YXJnZXQKKyAgICAgICAgIyBhbmQgcHJvY2VzcyAkdGFyZ2V0IGludG8gJHtJTlBVVH0vcm9vdCR0YXJnZXQKKyAgICAgICAgIyB0cmVhdCB0aGlzIGRpcmVjdG9yeSBhcyBpZiBpdCBhY3R1YWxseSBjb250YWluZWQgdGhlIGZpbGVzLgorICAgICAgICAjCisgICAgICAgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDIKKyAgICAgICAgdGhlbiBlY2hvICR7c3ltX2xpbmt9ICctPicgcm9vdCR7ZnVsbF9kZXN0X2Rpcn0gJzogTWFraW5nIHJvb3RlZCBsaW5rJworICAgICAgICBmaQorICAgICAgICBpZiBbIC1kICRMSUIvcm9vdCR7ZnVsbF9kZXN0X2Rpcn0gXQorICAgICAgICB0aGVuIHRydWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIGRpcm5hbWU9cm9vdCR7ZnVsbF9kZXN0X2Rpcn0vCisgICAgICAgICAgZGlybWFkZT0uCisgICAgICAgICAgY2QgJExJQgorICAgICAgICAgIHdoaWxlIFsgeCRkaXJuYW1lICE9IHggXTsgZG8KKyAgICAgICAgICAgIGNvbXBvbmVudD1gZWNobyAkZGlybmFtZSB8IHNlZCAtZSAnc3wvLiokfHwnYAorICAgICAgICAgICAgbWtkaXIgJGNvbXBvbmVudCA+L2Rldi9udWxsIDI+JjEKKyAgICAgICAgICAgIGNkICRjb21wb25lbnQKKyAgICAgICAgICAgIGRpcm1hZGU9JGRpcm1hZGUvJGNvbXBvbmVudAorICAgICAgICAgICAgZGlybmFtZT1gZWNobyAkZGlybmFtZSB8IHNlZCAtZSAnc3xbXi9dKi98fCdgCisgICAgICAgICAgZG9uZQorICAgICAgICBmaQorCisgICAgICAgICMgRHVwbGljYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgY3JlYXRlZCBpbiAke0xJQn0vJHtzeW1fbGlua30gaW4gbmV3CisgICAgICAgICMgcm9vdCBhcmVhLgorICAgICAgICAjCisgICAgICAgIGZvciBmaWxlMiBpbiAkYWxsX2RpcnM7IGRvCisgICAgICAgICAgY2FzZSAkZmlsZTIgaW4KKyAgICAgICAgICAgICR7c3ltX2xpbmt9LyopCisgICAgICAgICAgICAgIGR1cGRpcj0ke0xJQn0vcm9vdCR7ZnVsbF9kZXN0X2Rpcn0vYGVjaG8gJGZpbGUyIHwKKyAgICAgICAgICAgICAgICAgICAgICBzZWQgLW4gInN8XiR7c3ltX2xpbmt9L3x8cCJgCisgICAgICAgICAgICAgIGlmIHRlc3QgJFZFUkJPU0UgLWd0IDIKKyAgICAgICAgICAgICAgdGhlbiBlY2hvICJEdXBsaWNhdGluZyAke3N5bV9saW5rfSdzICR7ZHVwZGlyfSIgOyBmaQorICAgICAgICAgICAgICBpZiBbIC1kICR7ZHVwZGlyfSBdCisgICAgICAgICAgICAgIHRoZW4gdHJ1ZQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWtkaXIgJHtkdXBkaXJ9CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZG9uZQorCisgICAgICAgICMgR2V0IHRoZSBwYXRoIGZyb20gJHtMSUJ9IHRvICR7c3ltX2xpbmt9LCBhY2NvdW50aW5nIGZvciBzeW1saW5rcy4KKyAgICAgICAgIworICAgICAgICBwYXJlbnQ9YGVjaG8gIiR7c3ltX2xpbmt9IiB8IHNlZCAtZSAnc0AvW14vXSokQEAnYAorICAgICAgICBsaWJhYnM9YGNkICR7TElCfTsgJHtQV0RDTUR9YAorICAgICAgICBmaWxlMj1gY2QgJHtMSUJ9OyBjZCAkcGFyZW50OyAke1BXRENNRH0gfCBzZWQgLWUgInNAXiR7bGliYWJzfUBAImAKKworICAgICAgICAjIERPVFMgaXMgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSAke0xJQn0vJHtzeW1fbGlua30gYmFjayB0byAke0xJQn0uCisgICAgICAgICMKKyAgICAgICAgZG90cz1gZWNobyAiJGZpbGUyIiB8IHNlZCAtZSAnc0AvW14vXSpALi4vQGcnYAorICAgICAgICBybSAtZnIgJHtMSUJ9LyR7c3ltX2xpbmt9ID4gL2Rldi9udWxsIDI+JjEKKyAgICAgICAgbG4gLXMgJHtkb3RzfXJvb3Qke2Z1bGxfZGVzdF9kaXJ9ICR7TElCfS8ke3N5bV9saW5rfSA+IC9kZXYvbnVsbCAyPiYxCisgICAgICAgIHRyZWV0b3BzPSIkdHJlZXRvcHMgJHtzeW1fbGlua30gJHtMSUJ9L3Jvb3Qke2Z1bGxfZGVzdF9kaXJ9IgorICAgICAgZmkKKyAgICBmaQorICBkb25lCitmaQorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworcmVxdWlyZWQ9CitzZXQgeCAkdHJlZXRvcHMKK3NoaWZ0Cit3aGlsZSBbICQjICE9IDAgXTsgZG8KKyAgIyAkMSBpcyBhbiBvbGQgZGlyZWN0b3J5IHRvIGNvcHksIGFuZCAkMiBpcyB0aGUgbmV3IGRpcmVjdG9yeSB0byBjb3B5IHRvLgorICAjCisgIFNSQ0RJUj1gY2QgJHtJTlBVVH0gOyBjZCAkMSA7ICR7UFdEQ01EfWAKKyAgZXhwb3J0IFNSQ0RJUgorCisgIEZJTkRfQkFTRT0kMQorICBleHBvcnQgRklORF9CQVNFCisgIHNoaWZ0CisKKyAgREVTVERJUj1gY2QgJDE7JHtQV0RDTUR9YAorICBleHBvcnQgREVTVERJUgorICBzaGlmdAorCisgICMgVGhlIHNhbWUgZGlyIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gdHJlZXRvcHMuCisgICMgVGhlcmUncyBubyBuZWVkIHRvIHNjYW4gaXQgbW9yZSB0aGFuIG9uY2UuCisgICMKKyAgaWYgWyAtZiAke0RFU1RESVJ9L0RPTkUgXQorICB0aGVuIGNvbnRpbnVlIDsgZmkKKworICB0b3VjaCAke0RFU1RESVJ9L0RPTkUKKyAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMQorICB0aGVuIGVjaG8gRml4aW5nIGRpcmVjdG9yeSAke1NSQ0RJUn0gaW50byAke0RFU1RESVJ9IDsgZmkKKworICAjIENoZWNrIGZpbGVzIHdoaWNoIGFyZSBzeW1saW5rcyBhcyB3ZWxsIGFzIHRob3NlIHdoaWNoIGFyZSBmaWxlcy4KKyAgIworICBjZCAke0lOUFVUfQorICByZXF1aXJlZD0iJHJlcXVpcmVkIGBpZiAkTElOS1M7IHRoZW4KKyAgICBmaW5kICR7RklORF9CQVNFfS8uIC1uYW1lICcqLmgnIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQKKyAgZWxzZQorICAgIGZpbmQgJHtGSU5EX0JBU0V9Ly4gLW5hbWUgJyouaCcgLXR5cGUgZiAtcHJpbnQKKyAgZmkgfCBcCisgICAgc2VkIC1lICdzOy9cLi87LztnJyAtZSAnczsvLyo7LztnJyB8IFwKKyAgICAke0ZJWElOQ0x9YCIKK2RvbmUKKworIyMgTWFrZSBzdXJlIHRoYXQgYW55IGluY2x1ZGUgZmlsZXMgcmVmZXJlbmNlZCB1c2luZyBkb3VibGUgcXVvdGVzCisjIyBleGlzdCBpbiB0aGUgZml4ZWQgZGlyZWN0b3J5LiAgVGhpcyBjb21lcyBsYXN0IHNpbmNlIG90aGVyd2lzZQorIyMgd2UgbWlnaHQgZW5kIHVwIGRlbGV0aW5nIHNvbWUgb2YgdGhlc2UgZmlsZXMgImJlY2F1c2UgdGhleSBkb24ndAorIyMgbmVlZCBhbnkgY2hhbmdlLiIKK3NldCB4IGBlY2hvICRyZXF1aXJlZGAKK3NoaWZ0Cit3aGlsZSBbICQjICE9IDAgXTsgZG8KKyAgbmV3cmVxPQorICB3aGlsZSBbICQjICE9IDAgXTsgZG8KKyAgICAjICQxIGlzIHRoZSBkaXJlY3RvcnkgdG8gY29weSBmcm9tLAorICAgICMgJDIgaXMgdGhlIHVuZml4ZWQgZmlsZSwKKyAgICAjICQzIGlzIHRoZSBmaXhlZCBmaWxlIG5hbWUuCisgICAgIworICAgIGNkICR7SU5QVVR9CisgICAgY2QgJDEKKyAgICBpZiBbIC1mICQyIF0gOyB0aGVuCisgICAgICBpZiBbIC1yICQyIF0gJiYgWyAhIC1yICQzIF07IHRoZW4KKyAgICAgICAgY3AgJDIgJDMgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIkNhbid0IGNvcHkgJDIiID4mMgorICAgICAgICBjaG1vZCArdyAkMyAyPi9kZXYvbnVsbAorICAgICAgICBjaG1vZCBhK3IgJDMgMj4vZGV2L251bGwKKyAgICAgICAgaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMgorICAgICAgICB0aGVuIGVjaG8gQ29waWVkICQyIDsgZmkKKyAgICAgICAgZm9yIGluY2x1ZGUgaW4gYGVncmVwICdeWyAJXSojWyAJXSppbmNsdWRlWyAJXSoiW14vXScgJDMgfAorICAgICAgICAgICAgIHNlZCAtZSAncy9eWyAJXSojWyAJXSppbmNsdWRlWyAJXSoiXChbXiJdKlwpIi4qJC9cMS8nYAorICAgICAgICBkbworCSAgZGlyPWBlY2hvICQyIHwgc2VkIC1lIHMnfC9bXi9dKiR8fCdgCisJICBkaXIyPWBlY2hvICQzIHwgc2VkIC1lIHMnfC9bXi9dKiR8fCdgCisJICBuZXdyZXE9IiRuZXdyZXEgJDEgJGRpci8kaW5jbHVkZSAkZGlyMi8kaW5jbHVkZSIKKyAgICAgICAgZG9uZQorICAgICAgZmkKKyAgICBmaQorICAgIHNoaWZ0OyBzaGlmdDsgc2hpZnQKKyAgZG9uZQorICBzZXQgeCAkbmV3cmVxCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgJFZFUkJPU0UgLWd0IDIKK3RoZW4gZWNobyAnQ2xlYW5pbmcgdXAgRE9ORSBmaWxlcy4nIDsgZmkKK2NkICRMSUIKKyMgTG9vayBmb3IgZmlsZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LCBmb3IgdGhlIGJlbmVmaXQgb2YKKyMgRE9TL1dpbmRvd3MgZmlsZXN5c3RlbXMuCitmaW5kIC4gLW5hbWUgJ1tEZF1bT29dW05uXVtFZV0nIC1leGVjIHJtIC1mICd7fScgJzsnCisKK2lmIHRlc3QgJFZFUkJPU0UgLWd0IDEKK3RoZW4gZWNobyAnQ2xlYW5pbmcgdXAgdW5uZWVkZWQgZGlyZWN0b3JpZXM6JyA7IGZpCitjZCAkTElCCithbGxfZGlycz1gZmluZCAuIC10eXBlIGQgXCEgLW5hbWUgJy4nIC1wcmludCB8IHNvcnQgLXJgCitmb3IgZmlsZSBpbiAkYWxsX2RpcnM7IGRvCisgIGlmIHJtZGlyICRMSUIvJGZpbGUgPiAvZGV2L251bGwKKyAgdGhlbgorICAgIHRlc3QgJFZFUkJPU0UgLWd0IDMgJiYgZWNobyAiICByZW1vdmVkICRmaWxlIgorICBmaQorZG9uZSAyPiAvZGV2L251bGwKKworIyBPbiBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBvcnQgc3ltbGlua3MsIGBmaW5kJyBtYXkgYmFyZgorIyBpZiBjYWxsZWQgd2l0aCAiLXR5cGUgbCIgcHJlZGljYXRlLiAgU28gb25seSB1c2UgdGhhdCBpZgorIyB3ZSBrbm93IHdlIHNob3VsZCBsb29rIGZvciBzeW1saW5rcy4KK2lmICRMSU5LUzsgdGhlbgorICB0ZXN0ICRWRVJCT1NFIC1ndCAyICYmIGVjaG8gIlJlbW92aW5nIHVudXNlZCBzeW1saW5rcyIKKworICBhbGxfZGlycz1gZmluZCAuIC10eXBlIGwgLXByaW50YAorICBmb3IgZmlsZSBpbiAkYWxsX2RpcnMKKyAgZG8KKyAgICBpZiB0ZXN0ICEgLWQgJGZpbGUKKyAgICB0aGVuCisgICAgICBybSAtZiAkZmlsZQorICAgICAgdGVzdCAkVkVSQk9TRSAtZ3QgMyAmJiBlY2hvICIgIHJlbW92ZWQgJGZpbGUiCisgICAgICBybWRpciBgZGlybmFtZSAkZmlsZWAgPiAvZGV2L251bGwgJiYgXAorICAgICAgICAgICB0ZXN0ICRWRVJCT1NFIC1ndCAzICYmIFwKKyAgICAgICAgICAgZWNobyAiICByZW1vdmVkIGBkaXJuYW1lICRmaWxlYCIKKyAgICBmaQorICBkb25lIDI+IC9kZXYvbnVsbAorZmkKKworaWYgdGVzdCAkVkVSQk9TRSAtZ3QgMAordGhlbiBlY2hvIGZpeGluY2x1ZGVzIGlzIGRvbmUgOyBmaQorCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIworIworIyBFbmQgb2YgZm9yIElOUFVUIGRpcmVjdG9yaWVzCisjCitkb25lCisjCisjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIyAjICMgIwpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2ZpeGluY2wgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2luc3RhbGwtdG9vbHMvZml4aW5jbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzkxNzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL2ZpeGluY2wKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL21raGVhZGVycyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9ta2hlYWRlcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQwZWZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9ta2hlYWRlcnMKQEAgLTAsMCArMSwxMDQgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworI1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworI0dDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisjdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyNTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorI3ZlcnNpb24uCisKKyNHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyNBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyNGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyNmb3IgbW9yZSBkZXRhaWxzLgorCisjWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyNhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQorIzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBCYXNpYyBpbmZvcm1hdGlvbgordGFyZ2V0PXg4Nl82NC1wYy1saW51eC1nbnUKK3RhcmdldF9ub25jYW5vbmljYWw9eDg2XzY0LWxpbnV4Cit2ZXJzaW9uPTQuNi54LWdvb2dsZQorCitWRVJCT1NFPTAKK3doaWxlIFsgeCQxID0geC12IF0gOyBkbworICAgIHNoaWZ0CisgICAgVkVSQk9TRT1gZXhwciAkVkVSQk9TRSArIDFgCitkb25lCitleHBvcnQgVkVSQk9TRQorCitpZiBbIHgkMSA9IHgtLWhlbHAgXSA7IHRoZW4KKyAgICBlY2hvICJVc2FnZTogbWtoZWFkZXJzIFtvcHRpb25zXSBbcHJlZml4IFtpc3lzcm9vdF1dIgorICAgIGVjaG8gIk9wdGlvbnM6IgorICAgIGVjaG8gIiAgLXYgICAgICAgIFByaW50IG1vcmUgb3V0cHV0IChtYXkgYmUgcmVwZWF0ZWQgZm9yIGV2ZW4gbW9yZSBvdXRwdXQpIgorICAgIGVjaG8gIiAgLS1oZWxwICAgIFRoaXMgaGVscCIKKyAgICBlY2hvICIgIC0tdmVyc2lvbiBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorICAgIGV4aXQgMAorZmkKKworaWYgWyB4JDEgPSB4LS12ZXJzaW9uIF0gOyB0aGVuCisgICAgZWNobyAibWtoZWFkZXJzIChHQ0MpIHZlcnNpb24gJHZlcnNpb24iCisgICAgZWNobyAiQ29weXJpZ2h0IDIwMDIsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIgorICAgIGVjaG8gIlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUiCisgICAgZWNobyAidGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyIKKyAgICBlY2hvICJhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LiIKKyAgICBleGl0IDAKK2ZpCisKKyMgQ29tbW9uIHByZWZpeCBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgoraWYgWyB4JDEgIT0geCBdIDsgdGhlbgorICBwcmVmaXg9JDEKKyAgc2hpZnQKK2Vsc2UKKyAgcHJlZml4PS90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42CitmaQorCisjIEFsbG93IGZvciBhbHRlcm5hdGUgaXN5c3Jvb3QgaW4gd2hpY2ggdG8gZmluZCBoZWFkZXJzCitpZiBbIHgkMSAhPSB4IF0gOyB0aGVuCisgIGlzeXNyb290PSQxCisgIHNoaWZ0CitlbHNlCisgIGlzeXNyb290PQorZmkKKworIyBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gcHV0IGhvc3QgZGVwZW5kZW50IHByb2dyYW1zIGFuZCBsaWJyYXJpZXMKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorIyBEaXJlY3RvcnkgaW4gd2hpY2ggdG8gcHV0IHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBjb21waWxlci4KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2xpYmV4ZWNkaXI9JHtleGVjX3ByZWZpeH0vbGliZXhlYworIyBEaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbXBpbGVyIGZpbmRzIGxpYnJhcmllcywgZXRjLgorbGlic3ViZGlyPSR7bGliZGlyfS9nY2MvJHt0YXJnZXRfbm9uY2Fub25pY2FsfS8ke3ZlcnNpb259CisjIERpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIgZmluZHMgZXhlY3V0YWJsZXMKK2xpYmV4ZWNzdWJkaXI9JHtsaWJleGVjZGlyfS9nY2MvJHt0YXJnZXRfbm9uY2Fub25pY2FsfS8ke3ZlcnNpb259CisKK2l0b29sc2Rpcj0ke2xpYmV4ZWNzdWJkaXJ9L2luc3RhbGwtdG9vbHMKK2l0b29sc2RhdGFkaXI9JHtsaWJzdWJkaXJ9L2luc3RhbGwtdG9vbHMKK2luY2Rpcj0ke2xpYnN1YmRpcn0vaW5jbHVkZS1maXhlZAorbWtpbnN0YWxsZGlycz0iL2Jpbi9iYXNoICR7aXRvb2xzZGlyfS9ta2luc3RhbGxkaXJzIgorCitjZCAke2l0b29sc2Rpcn0KK3JtIC1yZiAke2luY2Rpcn0vKgorCitmb3IgbWwgaW4gYGNhdCAke2l0b29sc2RhdGFkaXJ9L2ZpeGluY19saXN0YDsgZG8KKyAgc3lzcm9vdF9oZWFkZXJzX3N1ZmZpeD1gZWNobyAke21sfSB8IHNlZCAtZSAncy87LiokLy8nYAorICBtdWx0aV9kaXI9YGVjaG8gJHttbH0gfCBzZWQgLWUgJ3MvXlteO10qOy8vJ2AKKyAgc3ViaW5jZGlyPSR7aW5jZGlyfSR7bXVsdGlfZGlyfQorICAuICR7aXRvb2xzZGF0YWRpcn0vbWtoZWFkZXJzLmNvbmYKKyAgaWYgWyB4JHtTVE1QX0ZJWElOQ30gIT0geCBdIDsgdGhlbgorCVRBUkdFVF9NQUNISU5FPSIke3RhcmdldH0iIHRhcmdldF9jYW5vbmljYWw9IiR7dGFyZ2V0fSIgXAorCSAgICBNQUNST19MSVNUPSIke2l0b29sc2RhdGFkaXJ9L21hY3JvX2xpc3QiIFwKKwkgICAgL2Jpbi9iYXNoIC4vZml4aW5jLnNoICR7c3ViaW5jZGlyfSBcCisJICAgICR7aXN5c3Jvb3R9JHtTWVNURU1fSEVBREVSX0RJUn0gJHtPVEhFUl9GSVhJTkNMVURFU19ESVJTfQorCXJtIC1mICR7c3ViaW5jZGlyfS9zeXNsaW1pdHMuaAorCWlmIFsgLWYgJHtzdWJpbmNkaXJ9L2xpbWl0cy5oIF07IHRoZW4KKwkgIG12ICR7c3ViaW5jZGlyfS9saW1pdHMuaCAke3N1YmluY2Rpcn0vc3lzbGltaXRzLmgKKwllbHNlCisJICBjcCAke2l0b29sc2RhdGFkaXJ9L2dzeXNsaW1pdHMuaCAke3N1YmluY2Rpcn0vc3lzbGltaXRzLmgKKwlmaQorICBmaQorCisgIGNwICR7aXRvb2xzZGF0YWRpcn0vaW5jbHVkZSR7bXVsdGlfZGlyfS9saW1pdHMuaCAke3N1YmluY2Rpcn0KK2RvbmUKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9ta2luc3RhbGxkaXJzIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9pbnN0YWxsLXRvb2xzL21raW5zdGFsbGRpcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDE5MWE0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvaW5zdGFsbC10b29scy9ta2luc3RhbGxkaXJzCkBAIC0wLDAgKzEsMTYyIEBACisjISAvYmluL3NoCisjIG1raW5zdGFsbGRpcnMgLS0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQorCitzY3JpcHR2ZXJzaW9uPTIwMDktMDQtMjguMjE7ICMgVVRDCisKKyMgT3JpZ2luYWwgYXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+CisjIENyZWF0ZWQ6IDE5OTMtMDUtMTYKKyMgUHVibGljIGRvbWFpbi4KKyMKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KKworbmw9JworJworSUZTPSIgIiIJJG5sIgorZXJyc3RhdHVzPTAKK2Rpcm1vZGU9CisKK3VzYWdlPSJcCitVc2FnZTogbWtpbnN0YWxsZGlycyBbLWhdIFstLWhlbHBdIFstLXZlcnNpb25dIFstbSBNT0RFXSBESVIgLi4uCisKK0NyZWF0ZSBlYWNoIGRpcmVjdG9yeSBESVIgKHdpdGggbW9kZSBNT0RFLCBpZiBzcGVjaWZpZWQpLCBpbmNsdWRpbmcgYWxsCitsZWFkaW5nIGZpbGUgbmFtZSBjb21wb25lbnRzLgorCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+LiIKKworIyBwcm9jZXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLWggfCAtLWhlbHAgfCAtLWgqKSAgICAgICAgICMgLWggZm9yIGhlbHAKKyAgICAgIGVjaG8gIiR1c2FnZSIKKyAgICAgIGV4aXQgJD8KKyAgICAgIDs7CisgICAgLW0pICAgICAgICAgICAgICAgICAgICAgICAgICMgLW0gUEVSTSBhcmcKKyAgICAgIHNoaWZ0CisgICAgICB0ZXN0ICQjIC1lcSAwICYmIHsgZWNobyAiJHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KKyAgICAgIGRpcm1vZGU9JDEKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAgIC0tdmVyc2lvbikKKyAgICAgIGVjaG8gIiQwICRzY3JpcHR2ZXJzaW9uIgorICAgICAgZXhpdCAkPworICAgICAgOzsKKyAgICAtLSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICBzaGlmdAorICAgICAgYnJlYWsKKyAgICAgIDs7CisgICAgLSopICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICAgIGVjaG8gIiR1c2FnZSIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworICAgICopICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IG5vbi1vcHQgYXJnCisgICAgICBicmVhaworICAgICAgOzsKKyAgZXNhYworZG9uZQorCitmb3IgZmlsZQorZG8KKyAgaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisgICAgc2hpZnQKKyAgZWxzZQorICAgIGJyZWFrCisgIGZpCitkb25lCisKK2Nhc2UgJCMgaW4KKyAgMCkgZXhpdCAwIDs7Citlc2FjCisKKyMgU29sYXJpcyA4J3MgbWtkaXIgLXAgaXNuJ3QgdGhyZWFkLXNhZmUuICBJZiB5b3UgbWtkaXIgLXAgYS9iIGFuZAorIyBta2RpciAtcCBhL2MgYXQgdGhlIHNhbWUgdGltZSwgYm90aCB3aWxsIGRldGVjdCB0aGF0IGEgaXMgbWlzc2luZywKKyMgb25lIHdpbGwgY3JlYXRlIGEsIHRoZW4gdGhlIG90aGVyIHdpbGwgdHJ5IHRvIGNyZWF0ZSBhIGFuZCBkaWUgd2l0aAorIyBhICJGaWxlIGV4aXN0cyIgZXJyb3IuICBUaGlzIGlzIGEgcHJvYmxlbSB3aGVuIGNhbGxpbmcgbWtpbnN0YWxsZGlycworIyBmcm9tIGEgcGFyYWxsZWwgbWFrZS4gIFdlIHVzZSAtLXZlcnNpb24gaW4gdGhlIHByb2JlIHRvIHJlc3RyaWN0CisjIG91cnNlbHZlcyB0byBHTlUgbWtkaXIsIHdoaWNoIGlzIHRocmVhZC1zYWZlLgorY2FzZSAkZGlybW9kZSBpbgorICAnJykKKyAgICBpZiBta2RpciAtcCAtLXZlcnNpb24gLiA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLXAgLS0gIiRAIgorICAgIGVsc2UKKyAgICAgICMgT24gTmV4dFN0ZXAgYW5kIE9wZW5TdGVwLCB0aGUgYG1rZGlyJyBjb21tYW5kIGRvZXMgbm90CisgICAgICAjIHJlY29nbml6ZSBhbnkgb3B0aW9uLiAgSXQgd2lsbCBpbnRlcnByZXQgYWxsIG9wdGlvbnMgYXMKKyAgICAgICMgZGlyZWN0b3JpZXMgdG8gY3JlYXRlLCBhbmQgdGhlbiBhYm9ydCBiZWNhdXNlIGAuJyBhbHJlYWR5CisgICAgICAjIGV4aXN0cy4KKyAgICAgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgICAgICB0ZXN0IC1kIC4vLS12ZXJzaW9uICYmIHJtZGlyIC4vLS12ZXJzaW9uCisgICAgZmkKKyAgICA7OworICAqKQorICAgIGlmIG1rZGlyIC1tICIkZGlybW9kZSIgLXAgLS12ZXJzaW9uIC4gPi9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgdGVzdCAhIC1kIC4vLS12ZXJzaW9uOyB0aGVuCisgICAgICBlY2hvICJta2RpciAtbSAkZGlybW9kZSAtcCAtLSAkKiIKKyAgICAgIGV4ZWMgbWtkaXIgLW0gIiRkaXJtb2RlIiAtcCAtLSAiJEAiCisgICAgZWxzZQorICAgICAgIyBDbGVhbiB1cCBhZnRlciBOZXh0U3RlcCBhbmQgT3BlblN0ZXAgbWtkaXIuCisgICAgICBmb3IgZCBpbiAuLy1tIC4vLXAgLi8tLXZlcnNpb24gIi4vJGRpcm1vZGUiOworICAgICAgZG8KKyAgICAgICAgdGVzdCAtZCAkZCAmJiBybWRpciAkZAorICAgICAgZG9uZQorICAgIGZpCisgICAgOzsKK2VzYWMKKworZm9yIGZpbGUKK2RvCisgIGNhc2UgJGZpbGUgaW4KKyAgICAvKikgcGF0aGNvbXA9LyA7OworICAgICopICBwYXRoY29tcD0gOzsKKyAgZXNhYworICBvSUZTPSRJRlMKKyAgSUZTPS8KKyAgc2V0IGZub3JkICRmaWxlCisgIHNoaWZ0CisgIElGUz0kb0lGUworCisgIGZvciBkCisgIGRvCisgICAgdGVzdCAieCRkIiA9IHggJiYgY29udGludWUKKworICAgIHBhdGhjb21wPSRwYXRoY29tcCRkCisgICAgY2FzZSAkcGF0aGNvbXAgaW4KKyAgICAgIC0qKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorICAgICAgZWNobyAibWtkaXIgJHBhdGhjb21wIgorCisgICAgICBta2RpciAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKyAgICAgIGlmIHRlc3QgISAtZCAiJHBhdGhjb21wIjsgdGhlbgorCWVycnN0YXR1cz0kbGFzdGVycgorICAgICAgZWxzZQorCWlmIHRlc3QgISAteiAiJGRpcm1vZGUiOyB0aGVuCisJICBlY2hvICJjaG1vZCAkZGlybW9kZSAkcGF0aGNvbXAiCisJICBsYXN0ZXJyPQorCSAgY2htb2QgIiRkaXJtb2RlIiAiJHBhdGhjb21wIiB8fCBsYXN0ZXJyPSQ/CisKKwkgIGlmIHRlc3QgISAteiAiJGxhc3RlcnIiOyB0aGVuCisJICAgIGVycnN0YXR1cz0kbGFzdGVycgorCSAgZmkKKwlmaQorICAgICAgZmkKKyAgICBmaQorCisgICAgcGF0aGNvbXA9JHBhdGhjb21wLworICBkb25lCitkb25lCisKK2V4aXQgJGVycnN0YXR1cworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5sYSBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4ubGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTc1YzQyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4ubGEKQEAgLTAsMCArMSw0MSBAQAorIyBsaWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGxpYnRvb2wgKEdOVSBsaWJ0b29sIDEuMzEzNCAyMDA5LTExLTI5KSAyLjIuN2EKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSdsaWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5zby4wJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9J2xpYmZ1bmN0aW9uX3Jlb3JkZXJpbmdfcGx1Z2luLnNvLjAuMC4wIGxpYmZ1bmN0aW9uX3Jlb3JkZXJpbmdfcGx1Z2luLnNvLjAgbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4uc28nCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9JycKKworIyBMaW5rZXIgZmxhZ3MgdGhhdCBjYW4gbm90IGdvIGluIGRlcGVuZGVuY3lfbGlicy4KK2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9JycKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JyAtTC90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L2xpYicKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPScnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4uCitjdXJyZW50PTAKK2FnZT0wCityZXZpc2lvbj0wCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz15ZXMKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JycKK2RscHJlb3Blbj0nJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9Jy90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUnCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmZ1bmN0aW9uX3Jlb3JkZXJpbmdfcGx1Z2luLnNvIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ODE4ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5zbwpAQCAtMCwwICsxIEBACitsaWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4uc28uMCBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4uc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42ODE4ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYmZ1bmN0aW9uX3Jlb3JkZXJpbmdfcGx1Z2luLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJmdW5jdGlvbl9yZW9yZGVyaW5nX3BsdWdpbi5zby4wLjAuMCBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4uc28uMC4wLjAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzlkN2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGliZnVuY3Rpb25fcmVvcmRlcmluZ19wbHVnaW4uc28uMC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJsdG9fcGx1Z2luLmxhIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJsdG9fcGx1Z2luLmxhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkZDdhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmx0b19wbHVnaW4ubGEKQEAgLTAsMCArMSw0MSBAQAorIyBsaWJsdG9fcGx1Z2luLmxhIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgbGlidG9vbCAoR05VIGxpYnRvb2wgMS4zMTM0IDIwMDktMTEtMjkpIDIuMi43YQorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9J2xpYmx0b19wbHVnaW4uc28uMCcKKworIyBOYW1lcyBvZiB0aGlzIGxpYnJhcnkuCitsaWJyYXJ5X25hbWVzPSdsaWJsdG9fcGx1Z2luLnNvLjAuMC4wIGxpYmx0b19wbHVnaW4uc28uMCBsaWJsdG9fcGx1Z2luLnNvJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PScnCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPScnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPScgLUwvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi9saWInCisKKyMgTmFtZXMgb2YgYWRkaXRpb25hbCB3ZWFrIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkKK3dlYWtfbGlicmFyeV9uYW1lcz0nJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmx0b19wbHVnaW4uCitjdXJyZW50PTAKK2FnZT0wCityZXZpc2lvbj0wCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz15ZXMKKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JycKK2RscHJlb3Blbj0nJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9Jy90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUnCmRpZmYgLS1naXQgYS9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmx0b19wbHVnaW4uc28gYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmx0b19wbHVnaW4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjI1YmE4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGlibHRvX3BsdWdpbi5zbwpAQCAtMCwwICsxIEBACitsaWJsdG9fcGx1Z2luLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJsdG9fcGx1Z2luLnNvLjAgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2xpYmx0b19wbHVnaW4uc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5mMjViYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJsdG9fcGx1Z2luLnNvLjAKQEAgLTAsMCArMSBAQAorbGlibHRvX3BsdWdpbi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGlibHRvX3BsdWdpbi5zby4wLjAuMCBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbGlibHRvX3BsdWdpbi5zby4wLjAuMApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45Y2QwMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9saWJsdG9fcGx1Z2luLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbHRvLXdyYXBwZXIgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2x0by13cmFwcGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEzNTM1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJleGVjL2djYy94ODZfNjQtbGludXgvNC42LngtZ29vZ2xlL2x0by13cmFwcGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbHRvMSBiL2xpYmV4ZWMvZ2NjL3g4Nl82NC1saW51eC80LjYueC1nb29nbGUvbHRvMQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDRlMDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliZXhlYy9nY2MveDg2XzY0LWxpbnV4LzQuNi54LWdvb2dsZS9sdG8xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVlOTBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbC5oCkBAIC0wLDAgKzEsMjI1MiBAQAorLyoKKyAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkKKyAqIFZlcnNpb246ICA3LjAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBCUklBTiBQQVVMIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIF9fZ2xfaF8KKyNkZWZpbmUgX19nbF9oXworCisjaWYgZGVmaW5lZChVU0VfTUdMX05BTUVTUEFDRSkKKyNpbmNsdWRlICJnbF9tYW5nbGUuaCIKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCZWdpbiBzeXN0ZW0tc3BlY2lmaWMgc3R1ZmYuIERvIG5vdCBkbyBhbnkgb2YgdGhpcyB3aGVuIGJ1aWxkaW5nCisgKiBmb3IgU2NpVGVjaCBTTkFQLCBhcyB0aGlzIGlzIGFsbCBkb25lIGJlZm9yZSB0aGlzIGhlYWRlciBmaWxlIGlzCisgKiBpbmNsdWRlZC4gCisgKi8KKyNpZiAhZGVmaW5lZChfX1NDSVRFQ0hfU05BUF9fKQorCisjaWYgZGVmaW5lZChfX0JFT1NfXykKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIHRvIGdldCBzb21lIEJlT1MtaXNtcyAqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1RFUCkgJiYgKGRlZmluZWQoTmVYVCkgfHwgZGVmaW5lZChOZVhUX1BETykpCisjZGVmaW5lIE9QRU5TVEVQCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIF9fV0lOMzJfXworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1RFUCkgJiYgKGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSkKKyMgIGlmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkgJiYgZGVmaW5lZChCVUlMRF9HTDMyKSAvKiB0YWcgc3BlY2lmeSB3ZSdyZSBidWlsZGluZyBtZXNhIGFzIGEgRExMICovCisjICAgIGRlZmluZSBHTEFQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgIGVsaWYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKSAmJiBkZWZpbmVkKF9ETEwpIC8qIHRhZyBzcGVjaWZ5aW5nIHdlJ3JlIGJ1aWxkaW5nIGZvciBETEwgcnVudGltZSBzdXBwb3J0ICovCisjICAgIGRlZmluZSBHTEFQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgIGVsc2UgLyogZm9yIHVzZSB3aXRoIHN0YXRpYyBsaW5rIGxpYiBidWlsZCBvZiBXaW4zMiBlZGl0aW9uIG9ubHkgKi8KKyMgICAgZGVmaW5lIEdMQVBJIGV4dGVybgorIyAgZW5kaWYgLyogX1NUQVRJQ19NRVNBIHN1cHBvcnQgKi8KKyMgIGRlZmluZSBHTEFQSUVOVFJZIF9fc3RkY2FsbAorI2VsaWYgZGVmaW5lZChfX0NZR1dJTl9fKSAmJiBkZWZpbmVkKFVTRV9PUEVOR0wzMikgLyogdXNlIG5hdGl2ZSB3aW5kb3dzIG9wZW5nbDMyICovCisjICBkZWZpbmUgR0xBUEkgZXh0ZXJuCisjICBkZWZpbmUgR0xBUElFTlRSWSBfX3N0ZGNhbGwKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAzMDMKKyMgIGRlZmluZSBHTEFQSSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgZGVmaW5lIEdMQVBJRU5UUlkKKyNlbmRpZiAvKiBXSU4zMiAmJiAhQ1lHV0lOICovCisKKyNpZiAoZGVmaW5lZChfX0JFT1NfXykgJiYgZGVmaW5lZChfX1BPV0VSUENfXykpIHx8IGRlZmluZWQoX19RVUlDS0RSQVdfXykKKyMgIGRlZmluZSBQUkFHTUFfRVhQT1JUX1NVUFBPUlRFRAkJMQorI2VuZGlmCisKKy8qCisgKiBXSU5ET1dTOiBJbmNsdWRlIHdpbmRvd3MuaCBoZXJlIHRvIGRlZmluZSBBUElFTlRSWS4KKyAqIEl0IGlzIGFsc28gdXNlZnVsIHdoZW4gYXBwbGljYXRpb25zIGluY2x1ZGUgdGhpcyBmaWxlIGJ5CisgKiBpbmNsdWRpbmcgb25seSBnbHV0LmgsIHNpbmNlIGdsdXQuaCBkZXBlbmRzIG9uIHdpbmRvd3MuaC4KKyAqIEFwcGxpY2F0aW9ucyBuZWVkaW5nIHRvIGluY2x1ZGUgd2luZG93cy5oIHdpdGggcGFybXMgb3RoZXIKKyAqIHRoYW4gIldJTjMyX0xFQU5fQU5EX01FQU4iIG1heSBpbmNsdWRlIHdpbmRvd3MuaCBiZWZvcmUKKyAqIGdsdXQuaCBvciBnbC5oLgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKEFQSUVOVFJZKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOR0RJXykgJiYgIWRlZmluZWQoX0dOVV9IX1dJTkRPV1MzMl9ERUZJTkVTKSBcCisgICAgICYmICFkZWZpbmVkKE9QRU5TVEVQKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2luY2x1ZGUgPEdML21lc2Ffd2dsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQobWFjaW50b3NoKSAmJiBQUkFHTUFfSU1QT1JUX1NVUFBPUlRFRAorI3ByYWdtYSBpbXBvcnQgb24KKyNlbmRpZgorCisjaWZuZGVmIEdMQVBJCisjZGVmaW5lIEdMQVBJIGV4dGVybgorI2VuZGlmCisKKyNpZm5kZWYgR0xBUElFTlRSWQorI2RlZmluZSBHTEFQSUVOVFJZCisjZW5kaWYKKworI2lmbmRlZiBBUElFTlRSWQorI2RlZmluZSBBUElFTlRSWSBHTEFQSUVOVFJZCisjZW5kaWYKKworLyogIlAiIHN1ZmZpeCB0byBiZSB1c2VkIGZvciBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiAqLworI2lmbmRlZiBBUElFTlRSWVAKKyNkZWZpbmUgQVBJRU5UUllQIEFQSUVOVFJZICoKKyNlbmRpZgorCisjaWZuZGVmIEdMQVBJRU5UUllQCisjZGVmaW5lIEdMQVBJRU5UUllQIEdMQVBJRU5UUlkgKgorI2VuZGlmCisKKyNpZmRlZiBDRU5URVJMSU5FX0NMUFAKKyNkZWZpbmUgc2lnbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQoUFJBR01BX0VYUE9SVF9TVVBQT1JURUQpCisjcHJhZ21hIGV4cG9ydCBvbgorI2VuZGlmCisKKyNlbmRpZiAvKiAhX19TQ0lURUNIX1NOQVBfXyAqLworLyoKKyAqIEVuZCBzeXN0ZW0tc3BlY2lmaWMgc3R1ZmYuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzEgICAxCisjZGVmaW5lIEdMX1ZFUlNJT05fMV8yICAgMQorI2RlZmluZSBHTF9WRVJTSU9OXzFfMyAgIDEKKyNkZWZpbmUgR0xfQVJCX2ltYWdpbmcgICAxCisKKworLyoKKyAqIERhdGF0eXBlcworICovCit0eXBlZGVmIHVuc2lnbmVkIGludAlHTGVudW07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJR0xib29sZWFuOwordHlwZWRlZiB1bnNpZ25lZCBpbnQJR0xiaXRmaWVsZDsKK3R5cGVkZWYgdm9pZAkJR0x2b2lkOwordHlwZWRlZiBzaWduZWQgY2hhcglHTGJ5dGU7CQkvKiAxLWJ5dGUgc2lnbmVkICovCit0eXBlZGVmIHNob3J0CQlHTHNob3J0OwkvKiAyLWJ5dGUgc2lnbmVkICovCit0eXBlZGVmIGludAkJR0xpbnQ7CQkvKiA0LWJ5dGUgc2lnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJR0x1Ynl0ZTsJLyogMS1ieXRlIHVuc2lnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CUdMdXNob3J0OwkvKiAyLWJ5dGUgdW5zaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50CUdMdWludDsJCS8qIDQtYnl0ZSB1bnNpZ25lZCAqLwordHlwZWRlZiBpbnQJCUdMc2l6ZWk7CS8qIDQtYnl0ZSBzaWduZWQgKi8KK3R5cGVkZWYgZmxvYXQJCUdMZmxvYXQ7CS8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXQgKi8KK3R5cGVkZWYgZmxvYXQJCUdMY2xhbXBmOwkvKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0IGluIFswLDFdICovCit0eXBlZGVmIGRvdWJsZQkJR0xkb3VibGU7CS8qIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQgKi8KK3R5cGVkZWYgZG91YmxlCQlHTGNsYW1wZDsJLyogZG91YmxlIHByZWNpc2lvbiBmbG9hdCBpbiBbMCwxXSAqLworCisKKworLyoKKyAqIENvbnN0YW50cworICovCisKKy8qIEJvb2xlYW4gdmFsdWVzICovCisjZGVmaW5lIEdMX0ZBTFNFCQkJCTB4MAorI2RlZmluZSBHTF9UUlVFCQkJCQkweDEKKworLyogRGF0YSB0eXBlcyAqLworI2RlZmluZSBHTF9CWVRFCQkJCQkweDE0MDAKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURQkJCTB4MTQwMQorI2RlZmluZSBHTF9TSE9SVAkJCQkweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQJCQkweDE0MDMKKyNkZWZpbmUgR0xfSU5UCQkJCQkweDE0MDQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UCQkJCTB4MTQwNQorI2RlZmluZSBHTF9GTE9BVAkJCQkweDE0MDYKKyNkZWZpbmUgR0xfMl9CWVRFUwkJCQkweDE0MDcKKyNkZWZpbmUgR0xfM19CWVRFUwkJCQkweDE0MDgKKyNkZWZpbmUgR0xfNF9CWVRFUwkJCQkweDE0MDkKKyNkZWZpbmUgR0xfRE9VQkxFCQkJCTB4MTQwQQorCisvKiBQcmltaXRpdmVzICovCisjZGVmaW5lIEdMX1BPSU5UUwkJCQkweDAwMDAKKyNkZWZpbmUgR0xfTElORVMJCQkJMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUAkJCQkweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUAkJCQkweDAwMDMKKyNkZWZpbmUgR0xfVFJJQU5HTEVTCQkJCTB4MDAwNAorI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUAkJCTB4MDAwNQorI2RlZmluZSBHTF9UUklBTkdMRV9GQU4JCQkJMHgwMDA2CisjZGVmaW5lIEdMX1FVQURTCQkJCTB4MDAwNworI2RlZmluZSBHTF9RVUFEX1NUUklQCQkJCTB4MDAwOAorI2RlZmluZSBHTF9QT0xZR09OCQkJCTB4MDAwOQorCisvKiBWZXJ0ZXggQXJyYXlzICovCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWQkJCQkweDgwNzQKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZCQkJCTB4ODA3NQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWQkJCQkweDgwNzYKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVkJCQkJMHg4MDc3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkJCQkweDgwNzgKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZCQkJMHg4MDc5CisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TSVpFCQkJMHg4MDdBCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9UWVBFCQkJMHg4MDdCCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUJCQkweDgwN0MKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1RZUEUJCQkweDgwN0UKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERQkJCTB4ODA3RgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TSVpFCQkJMHg4MDgxCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1RZUEUJCQkweDgwODIKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU1RSSURFCQkJMHg4MDgzCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX1RZUEUJCQkweDgwODUKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfU1RSSURFCQkJMHg4MDg2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRQkJMHg4MDg4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRQkJMHg4MDg5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFCQkweDgwOEEKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX1NUUklERQkJMHg4MDhDCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSCQkJMHg4MDhFCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSCQkJMHg4MDhGCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BPSU5URVIJCQkweDgwOTAKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUgkJCTB4ODA5MQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIJCTB4ODA5MgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUgkJMHg4MDkzCisjZGVmaW5lIEdMX1YyRgkJCQkJMHgyQTIwCisjZGVmaW5lIEdMX1YzRgkJCQkJMHgyQTIxCisjZGVmaW5lIEdMX0M0VUJfVjJGCQkJCTB4MkEyMgorI2RlZmluZSBHTF9DNFVCX1YzRgkJCQkweDJBMjMKKyNkZWZpbmUgR0xfQzNGX1YzRgkJCQkweDJBMjQKKyNkZWZpbmUgR0xfTjNGX1YzRgkJCQkweDJBMjUKKyNkZWZpbmUgR0xfQzRGX04zRl9WM0YJCQkJMHgyQTI2CisjZGVmaW5lIEdMX1QyRl9WM0YJCQkJMHgyQTI3CisjZGVmaW5lIEdMX1Q0Rl9WNEYJCQkJMHgyQTI4CisjZGVmaW5lIEdMX1QyRl9DNFVCX1YzRgkJCQkweDJBMjkKKyNkZWZpbmUgR0xfVDJGX0MzRl9WM0YJCQkJMHgyQTJBCisjZGVmaW5lIEdMX1QyRl9OM0ZfVjNGCQkJCTB4MkEyQgorI2RlZmluZSBHTF9UMkZfQzRGX04zRl9WM0YJCQkweDJBMkMKKyNkZWZpbmUgR0xfVDRGX0M0Rl9OM0ZfVjRGCQkJMHgyQTJECisKKy8qIE1hdHJpeCBNb2RlICovCisjZGVmaW5lIEdMX01BVFJJWF9NT0RFCQkJCTB4MEJBMAorI2RlZmluZSBHTF9NT0RFTFZJRVcJCQkJMHgxNzAwCisjZGVmaW5lIEdMX1BST0pFQ1RJT04JCQkJMHgxNzAxCisjZGVmaW5lIEdMX1RFWFRVUkUJCQkJMHgxNzAyCisKKy8qIFBvaW50cyAqLworI2RlZmluZSBHTF9QT0lOVF9TTU9PVEgJCQkJMHgwQjEwCisjZGVmaW5lIEdMX1BPSU5UX1NJWkUJCQkJMHgwQjExCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfR1JBTlVMQVJJVFkgCQkweDBCMTMKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9SQU5HRQkJCTB4MEIxMgorCisvKiBMaW5lcyAqLworI2RlZmluZSBHTF9MSU5FX1NNT09USAkJCQkweDBCMjAKKyNkZWZpbmUgR0xfTElORV9TVElQUExFCQkJCTB4MEIyNAorI2RlZmluZSBHTF9MSU5FX1NUSVBQTEVfUEFUVEVSTgkJCTB4MEIyNQorI2RlZmluZSBHTF9MSU5FX1NUSVBQTEVfUkVQRUFUCQkJMHgwQjI2CisjZGVmaW5lIEdMX0xJTkVfV0lEVEgJCQkJMHgwQjIxCisjZGVmaW5lIEdMX0xJTkVfV0lEVEhfR1JBTlVMQVJJVFkJCTB4MEIyMworI2RlZmluZSBHTF9MSU5FX1dJRFRIX1JBTkdFCQkJMHgwQjIyCisKKy8qIFBvbHlnb25zICovCisjZGVmaW5lIEdMX1BPSU5UCQkJCTB4MUIwMAorI2RlZmluZSBHTF9MSU5FCQkJCQkweDFCMDEKKyNkZWZpbmUgR0xfRklMTAkJCQkJMHgxQjAyCisjZGVmaW5lIEdMX0NXCQkJCQkweDA5MDAKKyNkZWZpbmUgR0xfQ0NXCQkJCQkweDA5MDEKKyNkZWZpbmUgR0xfRlJPTlQJCQkJMHgwNDA0CisjZGVmaW5lIEdMX0JBQ0sJCQkJCTB4MDQwNQorI2RlZmluZSBHTF9QT0xZR09OX01PREUJCQkJMHgwQjQwCisjZGVmaW5lIEdMX1BPTFlHT05fU01PT1RICQkJMHgwQjQxCisjZGVmaW5lIEdMX1BPTFlHT05fU1RJUFBMRQkJCTB4MEI0MgorI2RlZmluZSBHTF9FREdFX0ZMQUcJCQkJMHgwQjQzCisjZGVmaW5lIEdMX0NVTExfRkFDRQkJCQkweDBCNDQKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUJCQkweDBCNDUKKyNkZWZpbmUgR0xfRlJPTlRfRkFDRQkJCQkweDBCNDYKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SCQkweDgwMzgKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMJCQkweDJBMDAKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfUE9JTlQJCQkweDJBMDEKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfTElORQkJCTB4MkEwMgorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMCQkJMHg4MDM3CisKKy8qIERpc3BsYXkgTGlzdHMgKi8KKyNkZWZpbmUgR0xfQ09NUElMRQkJCQkweDEzMDAKKyNkZWZpbmUgR0xfQ09NUElMRV9BTkRfRVhFQ1VURQkJCTB4MTMwMQorI2RlZmluZSBHTF9MSVNUX0JBU0UJCQkJMHgwQjMyCisjZGVmaW5lIEdMX0xJU1RfSU5ERVgJCQkJMHgwQjMzCisjZGVmaW5lIEdMX0xJU1RfTU9ERQkJCQkweDBCMzAKKworLyogRGVwdGggYnVmZmVyICovCisjZGVmaW5lIEdMX05FVkVSCQkJCTB4MDIwMAorI2RlZmluZSBHTF9MRVNTCQkJCQkweDAyMDEKKyNkZWZpbmUgR0xfRVFVQUwJCQkJMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTAkJCQkweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUgkJCQkweDAyMDQKKyNkZWZpbmUgR0xfTk9URVFVQUwJCQkJMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTAkJCQkweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTCQkJCTB4MDIwNworI2RlZmluZSBHTF9ERVBUSF9URVNUCQkJCTB4MEI3MQorI2RlZmluZSBHTF9ERVBUSF9CSVRTCQkJCTB4MEQ1NgorI2RlZmluZSBHTF9ERVBUSF9DTEVBUl9WQUxVRQkJCTB4MEI3MworI2RlZmluZSBHTF9ERVBUSF9GVU5DCQkJCTB4MEI3NAorI2RlZmluZSBHTF9ERVBUSF9SQU5HRQkJCQkweDBCNzAKKyNkZWZpbmUgR0xfREVQVEhfV1JJVEVNQVNLCQkJMHgwQjcyCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVAkJCTB4MTkwMgorCisvKiBMaWdodGluZyAqLworI2RlZmluZSBHTF9MSUdIVElORwkJCQkweDBCNTAKKyNkZWZpbmUgR0xfTElHSFQwCQkJCTB4NDAwMAorI2RlZmluZSBHTF9MSUdIVDEJCQkJMHg0MDAxCisjZGVmaW5lIEdMX0xJR0hUMgkJCQkweDQwMDIKKyNkZWZpbmUgR0xfTElHSFQzCQkJCTB4NDAwMworI2RlZmluZSBHTF9MSUdIVDQJCQkJMHg0MDA0CisjZGVmaW5lIEdMX0xJR0hUNQkJCQkweDQwMDUKKyNkZWZpbmUgR0xfTElHSFQ2CQkJCTB4NDAwNgorI2RlZmluZSBHTF9MSUdIVDcJCQkJMHg0MDA3CisjZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQJCQkweDEyMDUKKyNkZWZpbmUgR0xfU1BPVF9DVVRPRkYJCQkJMHgxMjA2CisjZGVmaW5lIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OCQkJMHgxMjA3CisjZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTgkJCTB4MTIwOAorI2RlZmluZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04JCTB4MTIwOQorI2RlZmluZSBHTF9BTUJJRU5UCQkJCTB4MTIwMAorI2RlZmluZSBHTF9ESUZGVVNFCQkJCTB4MTIwMQorI2RlZmluZSBHTF9TUEVDVUxBUgkJCQkweDEyMDIKKyNkZWZpbmUgR0xfU0hJTklORVNTCQkJCTB4MTYwMQorI2RlZmluZSBHTF9FTUlTU0lPTgkJCQkweDE2MDAKKyNkZWZpbmUgR0xfUE9TSVRJT04JCQkJMHgxMjAzCisjZGVmaW5lIEdMX1NQT1RfRElSRUNUSU9OCQkJMHgxMjA0CisjZGVmaW5lIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UJCQkweDE2MDIKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVhFUwkJCTB4MTYwMworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERQkJCTB4MEI1MgorI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIJCTB4MEI1MQorI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UCQkJMHgwQjUzCisjZGVmaW5lIEdMX0ZST05UX0FORF9CQUNLCQkJMHgwNDA4CisjZGVmaW5lIEdMX1NIQURFX01PREVMCQkJCTB4MEI1NAorI2RlZmluZSBHTF9GTEFUCQkJCQkweDFEMDAKKyNkZWZpbmUgR0xfU01PT1RICQkJCTB4MUQwMQorI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTAkJCTB4MEI1NworI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTF9GQUNFCQkJMHgwQjU1CisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUgkJMHgwQjU2CisjZGVmaW5lIEdMX05PUk1BTElaRQkJCQkweDBCQTEKKworLyogVXNlciBjbGlwcGluZyBwbGFuZXMgKi8KKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTAJCQkJMHgzMDAwCisjZGVmaW5lIEdMX0NMSVBfUExBTkUxCQkJCTB4MzAwMQorI2RlZmluZSBHTF9DTElQX1BMQU5FMgkJCQkweDMwMDIKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTMJCQkJMHgzMDAzCisjZGVmaW5lIEdMX0NMSVBfUExBTkU0CQkJCTB4MzAwNAorI2RlZmluZSBHTF9DTElQX1BMQU5FNQkJCQkweDMwMDUKKworLyogQWNjdW11bGF0aW9uIGJ1ZmZlciAqLworI2RlZmluZSBHTF9BQ0NVTV9SRURfQklUUwkJCTB4MEQ1OAorI2RlZmluZSBHTF9BQ0NVTV9HUkVFTl9CSVRTCQkJMHgwRDU5CisjZGVmaW5lIEdMX0FDQ1VNX0JMVUVfQklUUwkJCTB4MEQ1QQorI2RlZmluZSBHTF9BQ0NVTV9BTFBIQV9CSVRTCQkJMHgwRDVCCisjZGVmaW5lIEdMX0FDQ1VNX0NMRUFSX1ZBTFVFCQkJMHgwQjgwCisjZGVmaW5lIEdMX0FDQ1VNCQkJCTB4MDEwMAorI2RlZmluZSBHTF9BREQJCQkJCTB4MDEwNAorI2RlZmluZSBHTF9MT0FECQkJCQkweDAxMDEKKyNkZWZpbmUgR0xfTVVMVAkJCQkJMHgwMTAzCisjZGVmaW5lIEdMX1JFVFVSTgkJCQkweDAxMDIKKworLyogQWxwaGEgdGVzdGluZyAqLworI2RlZmluZSBHTF9BTFBIQV9URVNUCQkJCTB4MEJDMAorI2RlZmluZSBHTF9BTFBIQV9URVNUX1JFRgkJCTB4MEJDMgorI2RlZmluZSBHTF9BTFBIQV9URVNUX0ZVTkMJCQkweDBCQzEKKworLyogQmxlbmRpbmcgKi8KKyNkZWZpbmUgR0xfQkxFTkQJCQkJMHgwQkUyCisjZGVmaW5lIEdMX0JMRU5EX1NSQwkJCQkweDBCRTEKKyNkZWZpbmUgR0xfQkxFTkRfRFNUCQkJCTB4MEJFMAorI2RlZmluZSBHTF9aRVJPCQkJCQkweDAKKyNkZWZpbmUgR0xfT05FCQkJCQkweDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SCQkJCTB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SCQkJMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQQkJCQkweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQQkJCTB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEJCQkJMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEJCQkweDAzMDUKKyNkZWZpbmUgR0xfRFNUX0NPTE9SCQkJCTB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SCQkJMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURQkJCTB4MDMwOAorCisvKiBSZW5kZXIgTW9kZSAqLworI2RlZmluZSBHTF9GRUVEQkFDSwkJCQkweDFDMDEKKyNkZWZpbmUgR0xfUkVOREVSCQkJCTB4MUMwMAorI2RlZmluZSBHTF9TRUxFQ1QJCQkJMHgxQzAyCisKKy8qIEZlZWRiYWNrICovCisjZGVmaW5lIEdMXzJECQkJCQkweDA2MDAKKyNkZWZpbmUgR0xfM0QJCQkJCTB4MDYwMQorI2RlZmluZSBHTF8zRF9DT0xPUgkJCQkweDA2MDIKKyNkZWZpbmUgR0xfM0RfQ09MT1JfVEVYVFVSRQkJCTB4MDYwMworI2RlZmluZSBHTF80RF9DT0xPUl9URVhUVVJFCQkJMHgwNjA0CisjZGVmaW5lIEdMX1BPSU5UX1RPS0VOCQkJCTB4MDcwMQorI2RlZmluZSBHTF9MSU5FX1RPS0VOCQkJCTB4MDcwMgorI2RlZmluZSBHTF9MSU5FX1JFU0VUX1RPS0VOCQkJMHgwNzA3CisjZGVmaW5lIEdMX1BPTFlHT05fVE9LRU4JCQkweDA3MDMKKyNkZWZpbmUgR0xfQklUTUFQX1RPS0VOCQkJCTB4MDcwNAorI2RlZmluZSBHTF9EUkFXX1BJWEVMX1RPS0VOCQkJMHgwNzA1CisjZGVmaW5lIEdMX0NPUFlfUElYRUxfVE9LRU4JCQkweDA3MDYKKyNkZWZpbmUgR0xfUEFTU19USFJPVUdIX1RPS0VOCQkJMHgwNzAwCisjZGVmaW5lIEdMX0ZFRURCQUNLX0JVRkZFUl9QT0lOVEVSCQkweDBERjAKKyNkZWZpbmUgR0xfRkVFREJBQ0tfQlVGRkVSX1NJWkUJCQkweDBERjEKKyNkZWZpbmUgR0xfRkVFREJBQ0tfQlVGRkVSX1RZUEUJCQkweDBERjIKKworLyogU2VsZWN0aW9uICovCisjZGVmaW5lIEdMX1NFTEVDVElPTl9CVUZGRVJfUE9JTlRFUgkJMHgwREYzCisjZGVmaW5lIEdMX1NFTEVDVElPTl9CVUZGRVJfU0laRQkJMHgwREY0CisKKy8qIEZvZyAqLworI2RlZmluZSBHTF9GT0cJCQkJCTB4MEI2MAorI2RlZmluZSBHTF9GT0dfTU9ERQkJCQkweDBCNjUKKyNkZWZpbmUgR0xfRk9HX0RFTlNJVFkJCQkJMHgwQjYyCisjZGVmaW5lIEdMX0ZPR19DT0xPUgkJCQkweDBCNjYKKyNkZWZpbmUgR0xfRk9HX0lOREVYCQkJCTB4MEI2MQorI2RlZmluZSBHTF9GT0dfU1RBUlQJCQkJMHgwQjYzCisjZGVmaW5lIEdMX0ZPR19FTkQJCQkJMHgwQjY0CisjZGVmaW5lIEdMX0xJTkVBUgkJCQkweDI2MDEKKyNkZWZpbmUgR0xfRVhQCQkJCQkweDA4MDAKKyNkZWZpbmUgR0xfRVhQMgkJCQkJMHgwODAxCisKKy8qIExvZ2ljIE9wcyAqLworI2RlZmluZSBHTF9MT0dJQ19PUAkJCQkweDBCRjEKKyNkZWZpbmUgR0xfSU5ERVhfTE9HSUNfT1AJCQkweDBCRjEKKyNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AJCQkweDBCRjIKKyNkZWZpbmUgR0xfTE9HSUNfT1BfTU9ERQkJCTB4MEJGMAorI2RlZmluZSBHTF9DTEVBUgkJCQkweDE1MDAKKyNkZWZpbmUgR0xfU0VUCQkJCQkweDE1MEYKKyNkZWZpbmUgR0xfQ09QWQkJCQkJMHgxNTAzCisjZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQJCQkweDE1MEMKKyNkZWZpbmUgR0xfTk9PUAkJCQkJMHgxNTA1CisjZGVmaW5lIEdMX0lOVkVSVAkJCQkweDE1MEEKKyNkZWZpbmUgR0xfQU5ECQkJCQkweDE1MDEKKyNkZWZpbmUgR0xfTkFORAkJCQkJMHgxNTBFCisjZGVmaW5lIEdMX09SCQkJCQkweDE1MDcKKyNkZWZpbmUgR0xfTk9SCQkJCQkweDE1MDgKKyNkZWZpbmUgR0xfWE9SCQkJCQkweDE1MDYKKyNkZWZpbmUgR0xfRVFVSVYJCQkJMHgxNTA5CisjZGVmaW5lIEdMX0FORF9SRVZFUlNFCQkJCTB4MTUwMgorI2RlZmluZSBHTF9BTkRfSU5WRVJURUQJCQkJMHgxNTA0CisjZGVmaW5lIEdMX09SX1JFVkVSU0UJCQkJMHgxNTBCCisjZGVmaW5lIEdMX09SX0lOVkVSVEVECQkJCTB4MTUwRAorCisvKiBTdGVuY2lsICovCisjZGVmaW5lIEdMX1NURU5DSUxfQklUUwkJCQkweDBENTcKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUCQkJCTB4MEI5MAorI2RlZmluZSBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFCQkJMHgwQjkxCisjZGVmaW5lIEdMX1NURU5DSUxfRlVOQwkJCQkweDBCOTIKKyNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLCQkJMHgwQjkzCisjZGVmaW5lIEdMX1NURU5DSUxfRkFJTAkJCQkweDBCOTQKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwJCTB4MEI5NQorI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUwkJMHgwQjk2CisjZGVmaW5lIEdMX1NURU5DSUxfUkVGCQkJCTB4MEI5NworI2RlZmluZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSwkJCTB4MEI5OAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYCQkJMHgxOTAxCisjZGVmaW5lIEdMX0tFRVAJCQkJCTB4MUUwMAorI2RlZmluZSBHTF9SRVBMQUNFCQkJCTB4MUUwMQorI2RlZmluZSBHTF9JTkNSCQkJCQkweDFFMDIKKyNkZWZpbmUgR0xfREVDUgkJCQkJMHgxRTAzCisKKy8qIEJ1ZmZlcnMsIFBpeGVsIERyYXdpbmcvUmVhZGluZyAqLworI2RlZmluZSBHTF9OT05FCQkJCQkweDAKKyNkZWZpbmUgR0xfTEVGVAkJCQkJMHgwNDA2CisjZGVmaW5lIEdMX1JJR0hUCQkJCTB4MDQwNworLypHTF9GUk9OVAkJCQkJMHgwNDA0ICovCisvKkdMX0JBQ0sJCQkJCTB4MDQwNSAqLworLypHTF9GUk9OVF9BTkRfQkFDSwkJCQkweDA0MDggKi8KKyNkZWZpbmUgR0xfRlJPTlRfTEVGVAkJCQkweDA0MDAKKyNkZWZpbmUgR0xfRlJPTlRfUklHSFQJCQkJMHgwNDAxCisjZGVmaW5lIEdMX0JBQ0tfTEVGVAkJCQkweDA0MDIKKyNkZWZpbmUgR0xfQkFDS19SSUdIVAkJCQkweDA0MDMKKyNkZWZpbmUgR0xfQVVYMAkJCQkJMHgwNDA5CisjZGVmaW5lIEdMX0FVWDEJCQkJCTB4MDQwQQorI2RlZmluZSBHTF9BVVgyCQkJCQkweDA0MEIKKyNkZWZpbmUgR0xfQVVYMwkJCQkJMHgwNDBDCisjZGVmaW5lIEdMX0NPTE9SX0lOREVYCQkJCTB4MTkwMAorI2RlZmluZSBHTF9SRUQJCQkJCTB4MTkwMworI2RlZmluZSBHTF9HUkVFTgkJCQkweDE5MDQKKyNkZWZpbmUgR0xfQkxVRQkJCQkJMHgxOTA1CisjZGVmaW5lIEdMX0FMUEhBCQkJCTB4MTkwNgorI2RlZmluZSBHTF9MVU1JTkFOQ0UJCQkJMHgxOTA5CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQQkJCTB4MTkwQQorI2RlZmluZSBHTF9BTFBIQV9CSVRTCQkJCTB4MEQ1NQorI2RlZmluZSBHTF9SRURfQklUUwkJCQkweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUwkJCQkweDBENTMKKyNkZWZpbmUgR0xfQkxVRV9CSVRTCQkJCTB4MEQ1NAorI2RlZmluZSBHTF9JTkRFWF9CSVRTCQkJCTB4MEQ1MQorI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTCQkJMHgwRDUwCisjZGVmaW5lIEdMX0FVWF9CVUZGRVJTCQkJCTB4MEMwMAorI2RlZmluZSBHTF9SRUFEX0JVRkZFUgkJCQkweDBDMDIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIJCQkJMHgwQzAxCisjZGVmaW5lIEdMX0RPVUJMRUJVRkZFUgkJCQkweDBDMzIKKyNkZWZpbmUgR0xfU1RFUkVPCQkJCTB4MEMzMworI2RlZmluZSBHTF9CSVRNQVAJCQkJMHgxQTAwCisjZGVmaW5lIEdMX0NPTE9SCQkJCTB4MTgwMAorI2RlZmluZSBHTF9ERVBUSAkJCQkweDE4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTAkJCQkweDE4MDIKKyNkZWZpbmUgR0xfRElUSEVSCQkJCTB4MEJEMAorI2RlZmluZSBHTF9SR0IJCQkJCTB4MTkwNworI2RlZmluZSBHTF9SR0JBCQkJCQkweDE5MDgKKworLyogSW1wbGVtZW50YXRpb24gbGltaXRzICovCisjZGVmaW5lIEdMX01BWF9MSVNUX05FU1RJTkcJCQkweDBCMzEKKyNkZWZpbmUgR0xfTUFYX0VWQUxfT1JERVIJCQkweDBEMzAKKyNkZWZpbmUgR0xfTUFYX0xJR0hUUwkJCQkweDBEMzEKKyNkZWZpbmUgR0xfTUFYX0NMSVBfUExBTkVTCQkJMHgwRDMyCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUJCQkweDBEMzMKKyNkZWZpbmUgR0xfTUFYX1BJWEVMX01BUF9UQUJMRQkJCTB4MEQzNAorI2RlZmluZSBHTF9NQVhfQVRUUklCX1NUQUNLX0RFUFRICQkweDBEMzUKKyNkZWZpbmUgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSAkJMHgwRDM2CisjZGVmaW5lIEdMX01BWF9OQU1FX1NUQUNLX0RFUFRICQkJMHgwRDM3CisjZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRICQkweDBEMzgKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgJCTB4MEQzOQorI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUwkJCTB4MEQzQQorI2RlZmluZSBHTF9NQVhfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSAkweDBEM0IKKworLyogR2V0cyAqLworI2RlZmluZSBHTF9BVFRSSUJfU1RBQ0tfREVQVEgJCQkweDBCQjAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FUVFJJQl9TVEFDS19ERVBUSAkJMHgwQkIxCisjZGVmaW5lIEdMX0NPTE9SX0NMRUFSX1ZBTFVFCQkJMHgwQzIyCisjZGVmaW5lIEdMX0NPTE9SX1dSSVRFTUFTSwkJCTB4MEMyMworI2RlZmluZSBHTF9DVVJSRU5UX0lOREVYCQkJMHgwQjAxCisjZGVmaW5lIEdMX0NVUlJFTlRfQ09MT1IJCQkweDBCMDAKKyNkZWZpbmUgR0xfQ1VSUkVOVF9OT1JNQUwJCQkweDBCMDIKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfQ09MT1IJCQkweDBCMDQKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfRElTVEFOQ0UJCTB4MEIwOQorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9JTkRFWAkJCTB4MEIwNQorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTgkJMHgwQjA3CisjZGVmaW5lIEdMX0NVUlJFTlRfUkFTVEVSX1RFWFRVUkVfQ09PUkRTCTB4MEIwNgorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9QT1NJVElPTl9WQUxJRAkweDBCMDgKKyNkZWZpbmUgR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUwkJMHgwQjAzCisjZGVmaW5lIEdMX0lOREVYX0NMRUFSX1ZBTFVFCQkJMHgwQzIwCisjZGVmaW5lIEdMX0lOREVYX01PREUJCQkJMHgwQzMwCisjZGVmaW5lIEdMX0lOREVYX1dSSVRFTUFTSwkJCTB4MEMyMQorI2RlZmluZSBHTF9NT0RFTFZJRVdfTUFUUklYCQkJMHgwQkE2CisjZGVmaW5lIEdMX01PREVMVklFV19TVEFDS19ERVBUSAkJMHgwQkEzCisjZGVmaW5lIEdMX05BTUVfU1RBQ0tfREVQVEgJCQkweDBENzAKKyNkZWZpbmUgR0xfUFJPSkVDVElPTl9NQVRSSVgJCQkweDBCQTcKKyNkZWZpbmUgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSAkJMHgwQkE0CisjZGVmaW5lIEdMX1JFTkRFUl9NT0RFCQkJCTB4MEM0MAorI2RlZmluZSBHTF9SR0JBX01PREUJCQkJMHgwQzMxCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFUUklYCQkJMHgwQkE4CisjZGVmaW5lIEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgJCQkweDBCQTUKKyNkZWZpbmUgR0xfVklFV1BPUlQJCQkJMHgwQkEyCisKKy8qIEV2YWx1YXRvcnMgKi8KKyNkZWZpbmUgR0xfQVVUT19OT1JNQUwJCQkJMHgwRDgwCisjZGVmaW5lIEdMX01BUDFfQ09MT1JfNAkJCQkweDBEOTAKKyNkZWZpbmUgR0xfTUFQMV9JTkRFWAkJCQkweDBEOTEKKyNkZWZpbmUgR0xfTUFQMV9OT1JNQUwJCQkJMHgwRDkyCisjZGVmaW5lIEdMX01BUDFfVEVYVFVSRV9DT09SRF8xCQkJMHgwRDkzCisjZGVmaW5lIEdMX01BUDFfVEVYVFVSRV9DT09SRF8yCQkJMHgwRDk0CisjZGVmaW5lIEdMX01BUDFfVEVYVFVSRV9DT09SRF8zCQkJMHgwRDk1CisjZGVmaW5lIEdMX01BUDFfVEVYVFVSRV9DT09SRF80CQkJMHgwRDk2CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYXzMJCQkweDBEOTcKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfNAkJCTB4MEQ5OAorI2RlZmluZSBHTF9NQVAyX0NPTE9SXzQJCQkJMHgwREIwCisjZGVmaW5lIEdMX01BUDJfSU5ERVgJCQkJMHgwREIxCisjZGVmaW5lIEdMX01BUDJfTk9STUFMCQkJCTB4MERCMgorI2RlZmluZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMQkJCTB4MERCMworI2RlZmluZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMgkJCTB4MERCNAorI2RlZmluZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfMwkJCTB4MERCNQorI2RlZmluZSBHTF9NQVAyX1RFWFRVUkVfQ09PUkRfNAkJCTB4MERCNgorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF8zCQkJMHgwREI3CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYXzQJCQkweDBEQjgKKyNkZWZpbmUgR0xfTUFQMV9HUklEX0RPTUFJTgkJCTB4MEREMAorI2RlZmluZSBHTF9NQVAxX0dSSURfU0VHTUVOVFMJCQkweDBERDEKKyNkZWZpbmUgR0xfTUFQMl9HUklEX0RPTUFJTgkJCTB4MEREMgorI2RlZmluZSBHTF9NQVAyX0dSSURfU0VHTUVOVFMJCQkweDBERDMKKyNkZWZpbmUgR0xfQ09FRkYJCQkJMHgwQTAwCisjZGVmaW5lIEdMX09SREVSCQkJCTB4MEEwMQorI2RlZmluZSBHTF9ET01BSU4JCQkJMHgwQTAyCisKKy8qIEhpbnRzICovCisjZGVmaW5lIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVAkJMHgwQzUwCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UCQkJMHgwQzUxCisjZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQJCQkweDBDNTIKKyNkZWZpbmUgR0xfUE9MWUdPTl9TTU9PVEhfSElOVAkJCTB4MEM1MworI2RlZmluZSBHTF9GT0dfSElOVAkJCQkweDBDNTQKKyNkZWZpbmUgR0xfRE9OVF9DQVJFCQkJCTB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUCQkJCTB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QJCQkJMHgxMTAyCisKKy8qIFNjaXNzb3IgYm94ICovCisjZGVmaW5lIEdMX1NDSVNTT1JfQk9YCQkJCTB4MEMxMAorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QJCQkJMHgwQzExCisKKy8qIFBpeGVsIE1vZGUgLyBUcmFuc2ZlciAqLworI2RlZmluZSBHTF9NQVBfQ09MT1IJCQkJMHgwRDEwCisjZGVmaW5lIEdMX01BUF9TVEVOQ0lMCQkJCTB4MEQxMQorI2RlZmluZSBHTF9JTkRFWF9TSElGVAkJCQkweDBEMTIKKyNkZWZpbmUgR0xfSU5ERVhfT0ZGU0VUCQkJCTB4MEQxMworI2RlZmluZSBHTF9SRURfU0NBTEUJCQkJMHgwRDE0CisjZGVmaW5lIEdMX1JFRF9CSUFTCQkJCTB4MEQxNQorI2RlZmluZSBHTF9HUkVFTl9TQ0FMRQkJCQkweDBEMTgKKyNkZWZpbmUgR0xfR1JFRU5fQklBUwkJCQkweDBEMTkKKyNkZWZpbmUgR0xfQkxVRV9TQ0FMRQkJCQkweDBEMUEKKyNkZWZpbmUgR0xfQkxVRV9CSUFTCQkJCTB4MEQxQgorI2RlZmluZSBHTF9BTFBIQV9TQ0FMRQkJCQkweDBEMUMKKyNkZWZpbmUgR0xfQUxQSEFfQklBUwkJCQkweDBEMUQKKyNkZWZpbmUgR0xfREVQVEhfU0NBTEUJCQkJMHgwRDFFCisjZGVmaW5lIEdMX0RFUFRIX0JJQVMJCQkJMHgwRDFGCisjZGVmaW5lIEdMX1BJWEVMX01BUF9TX1RPX1NfU0laRQkJMHgwQ0IxCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0lfU0laRQkJMHgwQ0IwCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX1JfU0laRQkJMHgwQ0IyCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0dfU0laRQkJMHgwQ0IzCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0JfU0laRQkJMHgwQ0I0CisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0FfU0laRQkJMHgwQ0I1CisjZGVmaW5lIEdMX1BJWEVMX01BUF9SX1RPX1JfU0laRQkJMHgwQ0I2CisjZGVmaW5lIEdMX1BJWEVMX01BUF9HX1RPX0dfU0laRQkJMHgwQ0I3CisjZGVmaW5lIEdMX1BJWEVMX01BUF9CX1RPX0JfU0laRQkJMHgwQ0I4CisjZGVmaW5lIEdMX1BJWEVMX01BUF9BX1RPX0FfU0laRQkJMHgwQ0I5CisjZGVmaW5lIEdMX1BJWEVMX01BUF9TX1RPX1MJCQkweDBDNzEKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fSQkJCTB4MEM3MAorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19SCQkJMHgwQzcyCisjZGVmaW5lIEdMX1BJWEVMX01BUF9JX1RPX0cJCQkweDBDNzMKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0lfVE9fQgkJCTB4MEM3NAorI2RlZmluZSBHTF9QSVhFTF9NQVBfSV9UT19BCQkJMHgwQzc1CisjZGVmaW5lIEdMX1BJWEVMX01BUF9SX1RPX1IJCQkweDBDNzYKKyNkZWZpbmUgR0xfUElYRUxfTUFQX0dfVE9fRwkJCTB4MEM3NworI2RlZmluZSBHTF9QSVhFTF9NQVBfQl9UT19CCQkJMHgwQzc4CisjZGVmaW5lIEdMX1BJWEVMX01BUF9BX1RPX0EJCQkweDBDNzkKKyNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQJCQkweDBEMDUKKyNkZWZpbmUgR0xfUEFDS19MU0JfRklSU1QJCQkweDBEMDEKKyNkZWZpbmUgR0xfUEFDS19ST1dfTEVOR1RICQkJMHgwRDAyCisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9QSVhFTFMJCQkweDBEMDQKKyNkZWZpbmUgR0xfUEFDS19TS0lQX1JPV1MJCQkweDBEMDMKKyNkZWZpbmUgR0xfUEFDS19TV0FQX0JZVEVTCQkJMHgwRDAwCisjZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQJCQkweDBDRjUKKyNkZWZpbmUgR0xfVU5QQUNLX0xTQl9GSVJTVAkJCTB4MENGMQorI2RlZmluZSBHTF9VTlBBQ0tfUk9XX0xFTkdUSAkJCTB4MENGMgorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9QSVhFTFMJCQkweDBDRjQKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfUk9XUwkJCTB4MENGMworI2RlZmluZSBHTF9VTlBBQ0tfU1dBUF9CWVRFUwkJCTB4MENGMAorI2RlZmluZSBHTF9aT09NX1gJCQkJMHgwRDE2CisjZGVmaW5lIEdMX1pPT01fWQkJCQkweDBEMTcKKworLyogVGV4dHVyZSBtYXBwaW5nICovCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WCQkJCTB4MjMwMAorI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFCQkJMHgyMjAwCisjZGVmaW5lIEdMX1RFWFRVUkVfMUQJCQkJMHgwREUwCisjZGVmaW5lIEdMX1RFWFRVUkVfMkQJCQkJMHgwREUxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TCQkJMHgyODAyCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9UCQkJMHgyODAzCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUgkJCTB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIJCQkweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfQ09MT1IJCQkweDIyMDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fUwkJCTB4MEM2MAorI2RlZmluZSBHTF9URVhUVVJFX0dFTl9UCQkJMHgwQzYxCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX01PREUJCQkweDI1MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9CT1JERVJfQ09MT1IJCQkweDEwMDQKKyNkZWZpbmUgR0xfVEVYVFVSRV9XSURUSAkJCTB4MTAwMAorI2RlZmluZSBHTF9URVhUVVJFX0hFSUdIVAkJCTB4MTAwMQorI2RlZmluZSBHTF9URVhUVVJFX0JPUkRFUgkJCTB4MTAwNQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBPTkVOVFMJCQkweDEwMDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRURfU0laRQkJCTB4ODA1QworI2RlZmluZSBHTF9URVhUVVJFX0dSRUVOX1NJWkUJCQkweDgwNUQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1NJWkUJCQkweDgwNUUKKyNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9TSVpFCQkJMHg4MDVGCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1NJWkUJCTB4ODA2MAorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFCQkweDgwNjEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVAkJMHgyNzAwCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUgkJMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVAkJMHgyNzAxCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSCQkJMHgyNzAzCisjZGVmaW5lIEdMX09CSkVDVF9MSU5FQVIJCQkweDI0MDEKKyNkZWZpbmUgR0xfT0JKRUNUX1BMQU5FCQkJCTB4MjUwMQorI2RlZmluZSBHTF9FWUVfTElORUFSCQkJCTB4MjQwMAorI2RlZmluZSBHTF9FWUVfUExBTkUJCQkJMHgyNTAyCisjZGVmaW5lIEdMX1NQSEVSRV9NQVAJCQkJMHgyNDAyCisjZGVmaW5lIEdMX0RFQ0FMCQkJCTB4MjEwMQorI2RlZmluZSBHTF9NT0RVTEFURQkJCQkweDIxMDAKKyNkZWZpbmUgR0xfTkVBUkVTVAkJCQkweDI2MDAKKyNkZWZpbmUgR0xfUkVQRUFUCQkJCTB4MjkwMQorI2RlZmluZSBHTF9DTEFNUAkJCQkweDI5MDAKKyNkZWZpbmUgR0xfUwkJCQkJMHgyMDAwCisjZGVmaW5lIEdMX1QJCQkJCTB4MjAwMQorI2RlZmluZSBHTF9SCQkJCQkweDIwMDIKKyNkZWZpbmUgR0xfUQkJCQkJMHgyMDAzCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1IJCQkweDBDNjIKKyNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fUQkJCTB4MEM2MworCisvKiBVdGlsaXR5ICovCisjZGVmaW5lIEdMX1ZFTkRPUgkJCQkweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIJCQkJMHgxRjAxCisjZGVmaW5lIEdMX1ZFUlNJT04JCQkJMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMJCQkJMHgxRjAzCisKKy8qIEVycm9ycyAqLworI2RlZmluZSBHTF9OT19FUlJPUiAJCQkJMHgwCisjZGVmaW5lIEdMX0lOVkFMSURfRU5VTQkJCQkweDA1MDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRQkJCTB4MDUwMQorI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTgkJCTB4MDUwMgorI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVwkJCTB4MDUwMworI2RlZmluZSBHTF9TVEFDS19VTkRFUkZMT1cJCQkweDA1MDQKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWQkJCTB4MDUwNQorCisvKiBnbFB1c2gvUG9wQXR0cmliIGJpdHMgKi8KKyNkZWZpbmUgR0xfQ1VSUkVOVF9CSVQJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBHTF9QT0lOVF9CSVQJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBHTF9MSU5FX0JJVAkJCQkweDAwMDAwMDA0CisjZGVmaW5lIEdMX1BPTFlHT05fQklUCQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgR0xfUE9MWUdPTl9TVElQUExFX0JJVAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0xfUElYRUxfTU9ERV9CSVQJCQkweDAwMDAwMDIwCisjZGVmaW5lIEdMX0xJR0hUSU5HX0JJVAkJCQkweDAwMDAwMDQwCisjZGVmaW5lIEdMX0ZPR19CSVQJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUCQkJMHgwMDAwMDEwMAorI2RlZmluZSBHTF9BQ0NVTV9CVUZGRVJfQklUCQkJMHgwMDAwMDIwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQJCQkweDAwMDAwNDAwCisjZGVmaW5lIEdMX1ZJRVdQT1JUX0JJVAkJCQkweDAwMDAwODAwCisjZGVmaW5lIEdMX1RSQU5TRk9STV9CSVQJCQkweDAwMDAxMDAwCisjZGVmaW5lIEdMX0VOQUJMRV9CSVQJCQkJMHgwMDAwMjAwMAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUCQkJMHgwMDAwNDAwMAorI2RlZmluZSBHTF9ISU5UX0JJVAkJCQkweDAwMDA4MDAwCisjZGVmaW5lIEdMX0VWQUxfQklUCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgR0xfTElTVF9CSVQJCQkJMHgwMDAyMDAwMAorI2RlZmluZSBHTF9URVhUVVJFX0JJVAkJCQkweDAwMDQwMDAwCisjZGVmaW5lIEdMX1NDSVNTT1JfQklUCQkJCTB4MDAwODAwMDAKKyNkZWZpbmUgR0xfQUxMX0FUVFJJQl9CSVRTCQkJMHgwMDBGRkZGRgorCisKKy8qIE9wZW5HTCAxLjEgKi8KKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRAkJCTB4ODA2MworI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzJECQkJMHg4MDY0CisjZGVmaW5lIEdMX1RFWFRVUkVfUFJJT1JJVFkJCQkweDgwNjYKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRVNJREVOVAkJCTB4ODA2NworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMUQJCQkweDgwNjgKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzJECQkJMHg4MDY5CisjZGVmaW5lIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUCQkweDEwMDMKKyNkZWZpbmUgR0xfQUxQSEE0CQkJCTB4ODAzQgorI2RlZmluZSBHTF9BTFBIQTgJCQkJMHg4MDNDCisjZGVmaW5lIEdMX0FMUEhBMTIJCQkJMHg4MDNECisjZGVmaW5lIEdMX0FMUEhBMTYJCQkJMHg4MDNFCisjZGVmaW5lIEdMX0xVTUlOQU5DRTQJCQkJMHg4MDNGCisjZGVmaW5lIEdMX0xVTUlOQU5DRTgJCQkJMHg4MDQwCisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyCQkJCTB4ODA0MQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNgkJCQkweDgwNDIKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNF9BTFBIQTQJCQkweDgwNDMKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNl9BTFBIQTIJCQkweDgwNDQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQTgJCQkweDgwNDUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTJfQUxQSEE0CQkJMHg4MDQ2CisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0FMUEhBMTIJCQkweDgwNDcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfQUxQSEExNgkJCTB4ODA0OAorI2RlZmluZSBHTF9JTlRFTlNJVFkJCQkJMHg4MDQ5CisjZGVmaW5lIEdMX0lOVEVOU0lUWTQJCQkJMHg4MDRBCisjZGVmaW5lIEdMX0lOVEVOU0lUWTgJCQkJMHg4MDRCCisjZGVmaW5lIEdMX0lOVEVOU0lUWTEyCQkJCTB4ODA0QworI2RlZmluZSBHTF9JTlRFTlNJVFkxNgkJCQkweDgwNEQKKyNkZWZpbmUgR0xfUjNfRzNfQjIJCQkJMHgyQTEwCisjZGVmaW5lIEdMX1JHQjQJCQkJCTB4ODA0RgorI2RlZmluZSBHTF9SR0I1CQkJCQkweDgwNTAKKyNkZWZpbmUgR0xfUkdCOAkJCQkJMHg4MDUxCisjZGVmaW5lIEdMX1JHQjEwCQkJCTB4ODA1MgorI2RlZmluZSBHTF9SR0IxMgkJCQkweDgwNTMKKyNkZWZpbmUgR0xfUkdCMTYJCQkJMHg4MDU0CisjZGVmaW5lIEdMX1JHQkEyCQkJCTB4ODA1NQorI2RlZmluZSBHTF9SR0JBNAkJCQkweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMQkJCQkweDgwNTcKKyNkZWZpbmUgR0xfUkdCQTgJCQkJMHg4MDU4CisjZGVmaW5lIEdMX1JHQjEwX0EyCQkJCTB4ODA1OQorI2RlZmluZSBHTF9SR0JBMTIJCQkJMHg4MDVBCisjZGVmaW5lIEdMX1JHQkExNgkJCQkweDgwNUIKKyNkZWZpbmUgR0xfQ0xJRU5UX1BJWEVMX1NUT1JFX0JJVAkJMHgwMDAwMDAwMQorI2RlZmluZSBHTF9DTElFTlRfVkVSVEVYX0FSUkFZX0JJVAkJMHgwMDAwMDAwMgorI2RlZmluZSBHTF9BTExfQ0xJRU5UX0FUVFJJQl9CSVRTIAkJMHhGRkZGRkZGRgorI2RlZmluZSBHTF9DTElFTlRfQUxMX0FUVFJJQl9CSVRTIAkJMHhGRkZGRkZGRgorCisKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhckluZGV4KCBHTGZsb2F0IGMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXJDb2xvciggR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXIoIEdMYml0ZmllbGQgbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleE1hc2soIEdMdWludCBtYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yTWFzayggR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEFscGhhRnVuYyggR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCbGVuZEZ1bmMoIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMb2dpY09wKCBHTGVudW0gb3Bjb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEN1bGxGYWNlKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGcm9udEZhY2UoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvaW50U2l6ZSggR0xmbG9hdCBzaXplICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpbmVXaWR0aCggR0xmbG9hdCB3aWR0aCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaW5lU3RpcHBsZSggR0xpbnQgZmFjdG9yLCBHTHVzaG9ydCBwYXR0ZXJuICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBvbHlnb25Nb2RlKCBHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldCggR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9seWdvblN0aXBwbGUoIGNvbnN0IEdMdWJ5dGUgKm1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0UG9seWdvblN0aXBwbGUoIEdMdWJ5dGUgKm1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRWRnZUZsYWcoIEdMYm9vbGVhbiBmbGFnICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVkZ2VGbGFndiggY29uc3QgR0xib29sZWFuICpmbGFnICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFNjaXNzb3IoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xpcFBsYW5lKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZG91YmxlICplcXVhdGlvbiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmUoIEdMZW51bSBwbGFuZSwgR0xkb3VibGUgKmVxdWF0aW9uICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERyYXdCdWZmZXIoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlYWRCdWZmZXIoIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVuYWJsZSggR0xlbnVtIGNhcCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEaXNhYmxlKCBHTGVudW0gY2FwICk7CisKK0dMQVBJIEdMYm9vbGVhbiBHTEFQSUVOVFJZIGdsSXNFbmFibGVkKCBHTGVudW0gY2FwICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRW5hYmxlQ2xpZW50U3RhdGUoIEdMZW51bSBjYXAgKTsgIC8qIDEuMSAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoIEdMZW51bSBjYXAgKTsgIC8qIDEuMSAqLworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldEJvb2xlYW52KCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldERvdWJsZXYoIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRGbG9hdHYoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldEludGVnZXJ2KCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQdXNoQXR0cmliKCBHTGJpdGZpZWxkIG1hc2sgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9wQXR0cmliKCB2b2lkICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUHVzaENsaWVudEF0dHJpYiggR0xiaXRmaWVsZCBtYXNrICk7ICAvKiAxLjEgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9wQ2xpZW50QXR0cmliKCB2b2lkICk7ICAvKiAxLjEgKi8KKworCitHTEFQSSBHTGludCBHTEFQSUVOVFJZIGdsUmVuZGVyTW9kZSggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgR0xlbnVtIEdMQVBJRU5UUlkgZ2xHZXRFcnJvciggdm9pZCApOworCitHTEFQSSBjb25zdCBHTHVieXRlICogR0xBUElFTlRSWSBnbEdldFN0cmluZyggR0xlbnVtIG5hbWUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRmluaXNoKCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZsdXNoKCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEhpbnQoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlICk7CisKKworLyoKKyAqIERlcHRoIEJ1ZmZlcgorICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENsZWFyRGVwdGgoIEdMY2xhbXBkIGRlcHRoICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlcHRoRnVuYyggR0xlbnVtIGZ1bmMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGVwdGhNYXNrKCBHTGJvb2xlYW4gZmxhZyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEZXB0aFJhbmdlKCBHTGNsYW1wZCBuZWFyX3ZhbCwgR0xjbGFtcGQgZmFyX3ZhbCApOworCisKKy8qCisgKiBBY2N1bXVsYXRpb24gQnVmZmVyCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xlYXJBY2N1bSggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xBY2N1bSggR0xlbnVtIG9wLCBHTGZsb2F0IHZhbHVlICk7CisKKworLyoKKyAqIFRyYW5zZm9ybWF0aW9uCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWF0cml4TW9kZSggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsT3J0aG8oIEdMZG91YmxlIGxlZnQsIEdMZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgYm90dG9tLCBHTGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGRvdWJsZSBuZWFyX3ZhbCwgR0xkb3VibGUgZmFyX3ZhbCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGcnVzdHVtKCBHTGRvdWJsZSBsZWZ0LCBHTGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgYm90dG9tLCBHTGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZG91YmxlIG5lYXJfdmFsLCBHTGRvdWJsZSBmYXJfdmFsICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZpZXdwb3J0KCBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUHVzaE1hdHJpeCggdm9pZCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQb3BNYXRyaXgoIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9hZElkZW50aXR5KCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWRNYXRyaXhkKCBjb25zdCBHTGRvdWJsZSAqbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9hZE1hdHJpeGYoIGNvbnN0IEdMZmxvYXQgKm0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdE1hdHJpeGQoIGNvbnN0IEdMZG91YmxlICptICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiggY29uc3QgR0xmbG9hdCAqbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSb3RhdGVkKCBHTGRvdWJsZSBhbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUm90YXRlZiggR0xmbG9hdCBhbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTY2FsZWQoIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFNjYWxlZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUcmFuc2xhdGVkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUcmFuc2xhdGVmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICk7CisKKworLyoKKyAqIERpc3BsYXkgTGlzdHMKKyAqLworCitHTEFQSSBHTGJvb2xlYW4gR0xBUElFTlRSWSBnbElzTGlzdCggR0x1aW50IGxpc3QgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGVsZXRlTGlzdHMoIEdMdWludCBsaXN0LCBHTHNpemVpIHJhbmdlICk7CisKK0dMQVBJIEdMdWludCBHTEFQSUVOVFJZIGdsR2VuTGlzdHMoIEdMc2l6ZWkgcmFuZ2UgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTmV3TGlzdCggR0x1aW50IGxpc3QsIEdMZW51bSBtb2RlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEVuZExpc3QoIHZvaWQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2FsbExpc3QoIEdMdWludCBsaXN0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENhbGxMaXN0cyggR0xzaXplaSBuLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKmxpc3RzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpc3RCYXNlKCBHTHVpbnQgYmFzZSApOworCisKKy8qCisgKiBEcmF3aW5nIEZ1bmN0aW9ucworICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJlZ2luKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFbmQoIHZvaWQgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MmYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyaSggR0xpbnQgeCwgR0xpbnQgeSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4MnMoIEdMc2hvcnQgeCwgR0xzaG9ydCB5ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4M2koIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNzKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0ZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0aSggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVmVydGV4NHMoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgyZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDJzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXgzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDNzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0ZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXg0ZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFZlcnRleDRzdiggY29uc3QgR0xzaG9ydCAqdiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNiKCBHTGJ5dGUgbngsIEdMYnl0ZSBueSwgR0xieXRlIG56ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzZCggR0xkb3VibGUgbngsIEdMZG91YmxlIG55LCBHTGRvdWJsZSBueiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2YoIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE5vcm1hbDNpKCBHTGludCBueCwgR0xpbnQgbnksIEdMaW50IG56ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzcyggR0xzaG9ydCBueCwgR0xzaG9ydCBueSwgR0xzaG9ydCBueiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzYnYoIGNvbnN0IEdMYnl0ZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2R2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTm9ybWFsM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWwzc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleGQoIEdMZG91YmxlIGMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4ZiggR0xmbG9hdCBjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleGkoIEdMaW50IGMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4cyggR0xzaG9ydCBjICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleHViKCBHTHVieXRlIGMgKTsgIC8qIDEuMSAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xJbmRleGR2KCBjb25zdCBHTGRvdWJsZSAqYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhmdiggY29uc3QgR0xmbG9hdCAqYyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhpdiggY29uc3QgR0xpbnQgKmMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4c3YoIGNvbnN0IEdMc2hvcnQgKmMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEluZGV4dWJ2KCBjb25zdCBHTHVieXRlICpjICk7ICAvKiAxLjEgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzYiggR0xieXRlIHJlZCwgR0xieXRlIGdyZWVuLCBHTGJ5dGUgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzZCggR0xkb3VibGUgcmVkLCBHTGRvdWJsZSBncmVlbiwgR0xkb3VibGUgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzZiggR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzaSggR0xpbnQgcmVkLCBHTGludCBncmVlbiwgR0xpbnQgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzcyggR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sIEdMc2hvcnQgYmx1ZSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzdWIoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3VpKCBHTHVpbnQgcmVkLCBHTHVpbnQgZ3JlZW4sIEdMdWludCBibHVlICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjN1cyggR0x1c2hvcnQgcmVkLCBHTHVzaG9ydCBncmVlbiwgR0x1c2hvcnQgYmx1ZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRiKCBHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYnl0ZSBibHVlLCBHTGJ5dGUgYWxwaGEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yNGQoIEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZG91YmxlIGJsdWUsIEdMZG91YmxlIGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRmKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRpKCBHTGludCByZWQsIEdMaW50IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBibHVlLCBHTGludCBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0cyggR0xzaG9ydCByZWQsIEdMc2hvcnQgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2hvcnQgYmx1ZSwgR0xzaG9ydCBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0dWIoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjR1aSggR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGJsdWUsIEdMdWludCBhbHBoYSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0dXMoIEdMdXNob3J0IHJlZCwgR0x1c2hvcnQgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVzaG9ydCBibHVlLCBHTHVzaG9ydCBhbHBoYSApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2J2KCBjb25zdCBHTGJ5dGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2R2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM2l2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3Izc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3VidiggY29uc3QgR0x1Ynl0ZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3IzdWl2KCBjb25zdCBHTHVpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yM3VzdiggY29uc3QgR0x1c2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0YnYoIGNvbnN0IEdMYnl0ZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0ZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0aXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjRzdiggY29uc3QgR0xzaG9ydCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0dWJ2KCBjb25zdCBHTHVieXRlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvcjR1aXYoIGNvbnN0IEdMdWludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3I0dXN2KCBjb25zdCBHTHVzaG9ydCAqdiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMWQoIEdMZG91YmxlIHMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMWYoIEdMZmxvYXQgcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxaSggR0xpbnQgcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxcyggR0xzaG9ydCBzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMmQoIEdMZG91YmxlIHMsIEdMZG91YmxlIHQgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMmYoIEdMZmxvYXQgcywgR0xmbG9hdCB0ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJpKCBHTGludCBzLCBHTGludCB0ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJzKCBHTHNob3J0IHMsIEdMc2hvcnQgdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNkKCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNmKCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNpKCBHTGludCBzLCBHTGludCB0LCBHTGludCByICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNzKCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNGQoIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNGYoIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0aSggR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0cyggR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMWR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkMWl2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQxc3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJmdiggY29uc3QgR0xmbG9hdCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQyaXYoIGNvbnN0IEdMaW50ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDJzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNkdiggY29uc3QgR0xkb3VibGUgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhDb29yZDNpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkM3N2KCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNGR2KCBjb25zdCBHTGRvdWJsZSAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkNGl2KCBjb25zdCBHTGludCAqdiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4Q29vcmQ0c3YoIGNvbnN0IEdMc2hvcnQgKnYgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MyZCggR0xkb3VibGUgeCwgR0xkb3VibGUgeSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMmYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MyaSggR0xpbnQgeCwgR0xpbnQgeSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zMnMoIEdMc2hvcnQgeCwgR0xzaG9ydCB5ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zM2koIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHogKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNzKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRkKCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0ZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0aSggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmFzdGVyUG9zNHMoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MyZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MyZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczJzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3MzZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczNzdiggY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0ZHYoIGNvbnN0IEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSYXN0ZXJQb3M0ZnYoIGNvbnN0IEdMZmxvYXQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRpdiggY29uc3QgR0xpbnQgKnYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJhc3RlclBvczRzdiggY29uc3QgR0xzaG9ydCAqdiApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RkKCBHTGRvdWJsZSB4MSwgR0xkb3VibGUgeTEsIEdMZG91YmxlIHgyLCBHTGRvdWJsZSB5MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdGYoIEdMZmxvYXQgeDEsIEdMZmxvYXQgeTEsIEdMZmxvYXQgeDIsIEdMZmxvYXQgeTIgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlY3RpKCBHTGludCB4MSwgR0xpbnQgeTEsIEdMaW50IHgyLCBHTGludCB5MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdHMoIEdMc2hvcnQgeDEsIEdMc2hvcnQgeTEsIEdMc2hvcnQgeDIsIEdMc2hvcnQgeTIgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0ZHYoIGNvbnN0IEdMZG91YmxlICp2MSwgY29uc3QgR0xkb3VibGUgKnYyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZWN0ZnYoIGNvbnN0IEdMZmxvYXQgKnYxLCBjb25zdCBHTGZsb2F0ICp2MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdGl2KCBjb25zdCBHTGludCAqdjEsIGNvbnN0IEdMaW50ICp2MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVjdHN2KCBjb25zdCBHTHNob3J0ICp2MSwgY29uc3QgR0xzaG9ydCAqdjIgKTsKKworCisvKgorICogVmVydGV4IEFycmF5cyAgKDEuMSkKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnB0ciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXIoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwdHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5kZXhQb2ludGVyKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcHRyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlciggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnB0ciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFZGdlRmxhZ1BvaW50ZXIoIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnB0ciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQb2ludGVydiggR0xlbnVtIHBuYW1lLCBHTHZvaWQgKipwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQXJyYXlFbGVtZW50KCBHTGludCBpICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbERyYXdBcnJheXMoIEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEludGVybGVhdmVkQXJyYXlzKCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKTsKKworLyoKKyAqIExpZ2h0aW5nCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU2hhZGVNb2RlbCggR0xlbnVtIG1vZGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRmKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRpKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExpZ2h0ZnYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodGl2KCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TGlnaHRmdiggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldExpZ2h0aXYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xMaWdodE1vZGVsaSggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTGlnaHRNb2RlbGl2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWF0ZXJpYWxmKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXRlcmlhbGkoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hdGVyaWFsaXYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0TWF0ZXJpYWxmdiggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNYXRlcmlhbGl2KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yTWF0ZXJpYWwoIEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSApOworCisKKy8qCisgKiBSYXN0ZXIgZnVuY3Rpb25zCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUGl4ZWxab29tKCBHTGZsb2F0IHhmYWN0b3IsIEdMZmxvYXQgeWZhY3RvciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbFN0b3JlZiggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZmVyZiggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZmVyaSggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQaXhlbE1hcGZ2KCBHTGVudW0gbWFwLCBHTHNpemVpIG1hcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsTWFwdWl2KCBHTGVudW0gbWFwLCBHTHNpemVpIG1hcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp2YWx1ZXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFBpeGVsTWFwdXN2KCBHTGVudW0gbWFwLCBHTHNpemVpIG1hcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1c2hvcnQgKnZhbHVlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQaXhlbE1hcGZ2KCBHTGVudW0gbWFwLCBHTGZsb2F0ICp2YWx1ZXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFBpeGVsTWFwdWl2KCBHTGVudW0gbWFwLCBHTHVpbnQgKnZhbHVlcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0UGl4ZWxNYXB1c3YoIEdMZW51bSBtYXAsIEdMdXNob3J0ICp2YWx1ZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQml0bWFwKCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB4b3JpZywgR0xmbG9hdCB5b3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB4bW92ZSwgR0xmbG9hdCB5bW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1Ynl0ZSAqYml0bWFwICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlYWRQaXhlbHMoIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x2b2lkICpwaXhlbHMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRHJhd1BpeGVscyggR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlQaXhlbHMoIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlICk7CisKKy8qCisgKiBTdGVuY2lsaW5nCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmMoIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFN0ZW5jaWxNYXNrKCBHTHVpbnQgbWFzayApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTdGVuY2lsT3AoIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwoIEdMaW50IHMgKTsKKworCisKKy8qCisgKiBUZXh0dXJlIG1hcHBpbmcKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhHZW5kKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgcGFyYW0gKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEdlbmYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhHZW5pKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4R2VuZHYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGRvdWJsZSAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhHZW5mdiggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4R2VuaXYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleEdlbmR2KCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4R2VuZnYoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleEdlbml2KCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEVudmYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4RW52aSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhFbnZmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEVudml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0VGV4RW52ZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhFbnZpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleFBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEltYWdlMUQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTGludCBib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRUZXhJbWFnZSggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x2b2lkICpwaXhlbHMgKTsKKworCisvKiAxLjEgZnVuY3Rpb25zICovCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdlblRleHR1cmVzKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJpbmRUZXh0dXJlKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQcmlvcml0aXplVGV4dHVyZXMoIEdMc2l6ZWkgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x1aW50ICp0ZXh0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xjbGFtcGYgKnByaW9yaXRpZXMgKTsKKworR0xBUEkgR0xib29sZWFuIEdMQVBJRU5UUlkgZ2xBcmVUZXh0dXJlc1Jlc2lkZW50KCBHTHNpemVpIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiAqcmVzaWRlbmNlcyApOworCitHTEFQSSBHTGJvb2xlYW4gR0xBUElFTlRSWSBnbElzVGV4dHVyZSggR0x1aW50IHRleHR1cmUgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTFEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weVRleEltYWdlMUQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciApOworCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBib3JkZXIgKTsKKworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApOworCisKKy8qCisgKiBFdmFsdWF0b3JzCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwMWQoIEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgb3JkZXIsIGNvbnN0IEdMZG91YmxlICpwb2ludHMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcDFmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBvcmRlciwgY29uc3QgR0xmbG9hdCAqcG9pbnRzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcDJkKCBHTGVudW0gdGFyZ2V0LAorCQkgICAgIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwgR0xpbnQgdXN0cmlkZSwgR0xpbnQgdW9yZGVyLAorCQkgICAgIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLAorCQkgICAgIGNvbnN0IEdMZG91YmxlICpwb2ludHMgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcDJmKCBHTGVudW0gdGFyZ2V0LAorCQkgICAgIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwKKwkJICAgICBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGludCB2c3RyaWRlLCBHTGludCB2b3JkZXIsCisJCSAgICAgY29uc3QgR0xmbG9hdCAqcG9pbnRzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1hcGR2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcXVlcnksIEdMZG91YmxlICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNYXBmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTGZsb2F0ICp2ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNYXBpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHF1ZXJ5LCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQxZCggR0xkb3VibGUgdSApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMWYoIEdMZmxvYXQgdSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQxZHYoIGNvbnN0IEdMZG91YmxlICp1ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQxZnYoIGNvbnN0IEdMZmxvYXQgKnUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbENvb3JkMmQoIEdMZG91YmxlIHUsIEdMZG91YmxlIHYgKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxDb29yZDJmKCBHTGZsb2F0IHUsIEdMZmxvYXQgdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQyZHYoIGNvbnN0IEdMZG91YmxlICp1ICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsQ29vcmQyZnYoIGNvbnN0IEdMZmxvYXQgKnUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwR3JpZDFkKCBHTGludCB1biwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyICk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNYXBHcmlkMWYoIEdMaW50IHVuLCBHTGZsb2F0IHUxLCBHTGZsb2F0IHUyICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1hcEdyaWQyZCggR0xpbnQgdW4sIEdMZG91YmxlIHUxLCBHTGRvdWJsZSB1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgdm4sIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2MiApOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTWFwR3JpZDJmKCBHTGludCB1biwgR0xmbG9hdCB1MSwgR0xmbG9hdCB1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgdm4sIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRXZhbFBvaW50MSggR0xpbnQgaSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsUG9pbnQyKCBHTGludCBpLCBHTGludCBqICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEV2YWxNZXNoMSggR0xlbnVtIG1vZGUsIEdMaW50IGkxLCBHTGludCBpMiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xFdmFsTWVzaDIoIEdMZW51bSBtb2RlLCBHTGludCBpMSwgR0xpbnQgaTIsIEdMaW50IGoxLCBHTGludCBqMiApOworCisKKy8qCisgKiBGb2cKKyAqLworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGb2dmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRm9naSggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGb2dmdiggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRm9naXYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApOworCisKKy8qCisgKiBTZWxlY3Rpb24gYW5kIEZlZWRiYWNrCisgKi8KKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRmVlZGJhY2tCdWZmZXIoIEdMc2l6ZWkgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMZmxvYXQgKmJ1ZmZlciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQYXNzVGhyb3VnaCggR0xmbG9hdCB0b2tlbiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTZWxlY3RCdWZmZXIoIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpidWZmZXIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSW5pdE5hbWVzKCB2b2lkICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWROYW1lKCBHTHVpbnQgbmFtZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xQdXNoTmFtZSggR0x1aW50IG5hbWUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUG9wTmFtZSggdm9pZCApOworCisKKworLyoKKyAqIE9wZW5HTCAxLjIKKyAqLworCisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMCQkJMHg4MDNBCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UJCQkweDgxMkYKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTCQkweDgwRTgKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMJCQkweDgwRTkKKyNkZWZpbmUgR0xfQkdSCQkJCQkweDgwRTAKKyNkZWZpbmUgR0xfQkdSQQkJCQkJMHg4MEUxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIJCQkweDgwMzIKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYJCTB4ODM2MgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNQkJCTB4ODM2MworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNV9SRVYJCTB4ODM2NAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80CQkweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYJCTB4ODM2NQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xCQkweDgwMzQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVYJCTB4ODM2NgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOAkJCTB4ODAzNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYJCTB4ODM2NworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBfMTBfMTBfMgkJMHg4MDM2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yXzEwXzEwXzEwX1JFVgkJMHg4MzY4CisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wJCTB4ODFGOAorI2RlZmluZSBHTF9TSU5HTEVfQ09MT1IJCQkJMHg4MUY5CisjZGVmaW5lIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SCQkweDgxRkEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9ECQkJMHg4MTNBCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xPRAkJCTB4ODEzQgorI2RlZmluZSBHTF9URVhUVVJFX0JBU0VfTEVWRUwJCQkweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUwJCQkweDgxM0QKKyNkZWZpbmUgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UJCTB4MEIxMgorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9HUkFOVUxBUklUWQkweDBCMTMKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UJCTB4MEIyMgorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9HUkFOVUxBUklUWQkweDBCMjMKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFCQkweDg0NkQKKyNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFCQkweDg0NkUKKyNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFUwkJCTB4ODA2QgorI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVAkJCTB4ODA2QworI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9JTUFHRVMJCQkweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVAkJCTB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNECQkJCTB4ODA2RgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzNECQkJMHg4MDcwCisjZGVmaW5lIEdMX1RFWFRVUkVfREVQVEgJCQkweDgwNzEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1IJCQkweDgwNzIKKyNkZWZpbmUgR0xfTUFYXzNEX1RFWFRVUkVfU0laRQkJCTB4ODA3MworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfM0QJCQkweDgwNkEKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHMoIEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsCisJR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKnBpeGVscyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB6b2Zmc2V0LCBHTGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0ICk7CisKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWVRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKworCisvKgorICogR0xfQVJCX2ltYWdpbmcKKyAqLworCisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SCQkJMHg4MDAxCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUgkJMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBCQkJMHg4MDAzCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQQkJMHg4MDA0CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFCQkJCTB4ODBEMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFCQkweDgwRDEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUJMHg4MEQyCisjZGVmaW5lIEdMX1BST1hZX0NPTE9SX1RBQkxFCQkJMHg4MEQzCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEUJMHg4MEQ0CisjZGVmaW5lIEdMX1BST1hZX1BPU1RfQ09MT1JfTUFUUklYX0NPTE9SX1RBQkxFCTB4ODBENQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9TQ0FMRQkJCTB4ODBENgorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9CSUFTCQkJMHg4MEQ3CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0ZPUk1BVAkJCTB4ODBEOAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9XSURUSAkJCTB4ODBEOQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9SRURfU0laRQkJCTB4ODBEQQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFCQkweDgwREIKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQkxVRV9TSVpFCQkweDgwREMKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRQkJMHg4MERECisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0xVTUlOQU5DRV9TSVpFCQkweDgwREUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfSU5URU5TSVRZX1NJWkUJCTB4ODBERgorI2RlZmluZSBHTF9DT05WT0xVVElPTl8xRAkJCTB4ODAxMAorI2RlZmluZSBHTF9DT05WT0xVVElPTl8yRAkJCTB4ODAxMQorI2RlZmluZSBHTF9TRVBBUkFCTEVfMkQJCQkJMHg4MDEyCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFCQkweDgwMTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFCQkweDgwMTQKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX0JJQVMJCTB4ODAxNQorI2RlZmluZSBHTF9SRURVQ0UJCQkJMHg4MDE2CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZPUk1BVAkJCTB4ODAxNworI2RlZmluZSBHTF9DT05WT0xVVElPTl9XSURUSAkJCTB4ODAxOAorI2RlZmluZSBHTF9DT05WT0xVVElPTl9IRUlHSFQJCQkweDgwMTkKKyNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRICQkweDgwMUEKKyNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX0hFSUdIVAkJMHg4MDFCCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFCQkweDgwMUMKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRQkJMHg4MDFECisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9TQ0FMRQkJMHg4MDFFCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUJCTB4ODAxRgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX1JFRF9CSUFTCQkweDgwMjAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTCQkweDgwMjEKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVMJCTB4ODAyMgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVMJCTB4ODAyMworI2RlZmluZSBHTF9DT05TVEFOVF9CT1JERVIJCQkweDgxNTEKKyNkZWZpbmUgR0xfUkVQTElDQVRFX0JPUkRFUgkJCTB4ODE1MworI2RlZmluZSBHTF9DT05WT0xVVElPTl9CT1JERVJfQ09MT1IJCTB4ODE1NAorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVgJCQkJMHg4MEIxCisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSAkJMHg4MEIyCisjZGVmaW5lIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEgJCTB4ODBCMworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfU0NBTEUJCTB4ODBCNAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRQkweDgwQjUKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRQkJMHg4MEI2CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX1NDQUxFCTB4ODBCNworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUwkJMHg4MEI4CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX0JJQVMJCTB4ODBCOQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9CTFVFX0JJQVMJCTB4ODBCQQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTCQkweDgwQkIKKyNkZWZpbmUgR0xfSElTVE9HUkFNCQkJCTB4ODAyNAorI2RlZmluZSBHTF9QUk9YWV9ISVNUT0dSQU0JCQkweDgwMjUKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1dJRFRICQkJMHg4MDI2CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9GT1JNQVQJCQkweDgwMjcKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1JFRF9TSVpFCQkJMHg4MDI4CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9HUkVFTl9TSVpFCQkJMHg4MDI5CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9CTFVFX1NJWkUJCQkweDgwMkEKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0FMUEhBX1NJWkUJCQkweDgwMkIKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFCQkweDgwMkMKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1NJTksJCQkweDgwMkQKKyNkZWZpbmUgR0xfTUlOTUFYCQkJCTB4ODAyRQorI2RlZmluZSBHTF9NSU5NQVhfRk9STUFUCQkJMHg4MDJGCisjZGVmaW5lIEdMX01JTk1BWF9TSU5LCQkJCTB4ODAzMAorI2RlZmluZSBHTF9UQUJMRV9UT09fTEFSR0UJCQkweDgwMzEKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT04JCQkweDgwMDkKKyNkZWZpbmUgR0xfTUlOCQkJCQkweDgwMDcKKyNkZWZpbmUgR0xfTUFYCQkJCQkweDgwMDgKKyNkZWZpbmUgR0xfRlVOQ19BREQJCQkJMHg4MDA2CisjZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1QJCQkweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUCQkweDgwMEIKKyNkZWZpbmUgR0xfQkxFTkRfQ09MT1IJCQkJMHg4MDA1CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JUYWJsZSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbG9yU3ViVGFibGUoIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIHN0YXJ0LCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQgKmRhdGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGludCAqcGFyYW1zKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5Q29sb3JTdWJUYWJsZSggR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvcHlDb2xvclRhYmxlKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGFibGUgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uKCBHTGVudW0gbW9kZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xCbGVuZENvbG9yKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsSGlzdG9ncmFtKCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLAorCQkJCSAgIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmsgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsUmVzZXRIaXN0b2dyYW0oIEdMZW51bSB0YXJnZXQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtKCBHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsCisJCQkJICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsCisJCQkJICAgICAgR0x2b2lkICp2YWx1ZXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwkJCQkJCSBHTGZsb2F0ICpwYXJhbXMgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwkJCQkJCSBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE1pbm1heCggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAorCQkJCUdMYm9vbGVhbiBzaW5rICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFJlc2V0TWlubWF4KCBHTGVudW0gdGFyZ2V0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1pbm1heCggR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdm9pZCAqdmFsdWVzICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJCQkJCSAgICAgIEdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCQkJCQkgICAgICBHTGludCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbnZvbHV0aW9uRmlsdGVyMUQoIEdMZW51bSB0YXJnZXQsCisJR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwKKwljb25zdCBHTHZvaWQgKmltYWdlICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbnZvbHV0aW9uRmlsdGVyMkQoIEdMZW51bSB0YXJnZXQsCisJR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwKKwlHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwKKwlHTGZsb2F0IHBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCUdMaW50IHBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJY29uc3QgR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxRCggR0xlbnVtIHRhcmdldCwKKwlHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGggKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkQoIEdMZW51bSB0YXJnZXQsCisJR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLAorCUdMc2l6ZWkgaGVpZ2h0KTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25GaWx0ZXIoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsCisJR0xlbnVtIHR5cGUsIEdMdm9pZCAqaW1hZ2UgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLAorCUdMZmxvYXQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsCisJR0xpbnQgKnBhcmFtcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTZXBhcmFibGVGaWx0ZXIyRCggR0xlbnVtIHRhcmdldCwKKwlHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LAorCUdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4gKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0U2VwYXJhYmxlRmlsdGVyKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LAorCUdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3BhbiApOworCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5EQ09MT1JQUk9DKSAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OUFJPQykgKEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRVBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRVBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT0xPUlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT0xPUlRBQkxFUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JTVUJUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTHNpemVpIGNvdW50LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SU1VCVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTkZJTFRFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNFUEFSQUJMRUZJTFRFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVBBUkFCTEVGSUxURVIyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJU1RPR1JBTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUlOTUFYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVEhJU1RPR1JBTVBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRNSU5NQVhQUk9DKSAoR0xlbnVtIHRhcmdldCk7CisKKworCisvKgorICogT3BlbkdMIDEuMworICovCisKKy8qIG11bHRpdGV4dHVyZSAqLworI2RlZmluZSBHTF9URVhUVVJFMAkJCQkweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEJCQkJMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyCQkJCTB4ODRDMgorI2RlZmluZSBHTF9URVhUVVJFMwkJCQkweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQJCQkJMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1CQkJCTB4ODRDNQorI2RlZmluZSBHTF9URVhUVVJFNgkJCQkweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcJCQkJMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4CQkJCTB4ODRDOAorI2RlZmluZSBHTF9URVhUVVJFOQkJCQkweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwCQkJCTB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEJCQkJMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMgkJCQkweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzCQkJCTB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQJCQkJMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNQkJCQkweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2CQkJCTB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcJCQkJMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOAkJCQkweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5CQkJCTB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAJCQkJMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMQkJCQkweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyCQkJCTB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMJCQkJMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNAkJCQkweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1CQkJCTB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYJCQkJMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNwkJCQkweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4CQkJCTB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkJCQkJMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMAkJCQkweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxCQkJCTB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRQkJCTB4ODRFMAorI2RlZmluZSBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUJCTB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUUwkJCTB4ODRFMgorLyogdGV4dHVyZV9jdWJlX21hcCAqLworI2RlZmluZSBHTF9OT1JNQUxfTUFQCQkJCTB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUAkJCTB4ODUxMgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQCQkJMHg4NTEzCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUAkJMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWAkJMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWAkJMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWQkJMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWQkJMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWgkJMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWgkJMHg4NTFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAJCTB4ODUxQgorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFCQkweDg1MUMKKy8qIHRleHR1cmVfY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9BTFBIQQkJCTB4ODRFOQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRQkJCTB4ODRFQQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQQkJMHg4NEVCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZCQkJMHg4NEVDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCCQkJMHg4NEVECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQQkJCTB4ODRFRQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlQJCTB4ODRFRgorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRURfSU1BR0VfU0laRQkweDg2QTAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VECQkJMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUwkweDg2QTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMJCTB4ODZBMworLyogbXVsdGlzYW1wbGUgKi8KKyNkZWZpbmUgR0xfTVVMVElTQU1QTEUJCQkJMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRQkJMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUJCQkweDgwOUYKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFCQkJMHg4MEEwCisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTCQkJMHg4MEE4CisjZGVmaW5lIEdMX1NBTVBMRVMJCQkJMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRQkJMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQJCTB4ODBBQgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVQJCQkweDIwMDAwMDAwCisvKiB0cmFuc3Bvc2VfbWF0cml4ICovCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9NT0RFTFZJRVdfTUFUUklYCQkweDg0RTMKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1BST0pFQ1RJT05fTUFUUklYCQkweDg0RTQKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYCQkweDg0RTUKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWAkJMHg4NEU2CisvKiB0ZXh0dXJlX2Vudl9jb21iaW5lICovCisjZGVmaW5lIEdMX0NPTUJJTkUJCQkJMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCCQkJCTB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBCQkJMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCCQkJCTB4ODU4MAorI2RlZmluZSBHTF9TT1VSQ0UxX1JHQgkJCQkweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0IJCQkJMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEEJCQkweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQQkJCTB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBCQkJMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQgkJCQkweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCCQkJCTB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0IJCQkJMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBCQkJMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBCQkJMHg4NTk5CisjZGVmaW5lIEdMX09QRVJBTkQyX0FMUEhBCQkJMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRQkJCQkweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRAkJCQkweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEUJCQkJMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUCQkJCTB4ODRFNworI2RlZmluZSBHTF9DT05TVEFOVAkJCQkweDg1NzYKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUgkJCTB4ODU3NworI2RlZmluZSBHTF9QUkVWSU9VUwkJCQkweDg1NzgKKy8qIHRleHR1cmVfZW52X2RvdDMgKi8KKyNkZWZpbmUgR0xfRE9UM19SR0IJCQkJMHg4NkFFCisjZGVmaW5lIEdMX0RPVDNfUkdCQQkJCQkweDg2QUYKKy8qIHRleHR1cmVfYm9yZGVyX2NsYW1wICovCisjZGVmaW5lIEdMX0NMQU1QX1RPX0JPUkRFUgkJCTB4ODEyRAorCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlKCBHTGVudW0gdGV4dHVyZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKCBHTGVudW0gdGV4dHVyZSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UxRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsb2QsIEdMdm9pZCAqaW1nICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaSggR0xlbnVtIHRhcmdldCwgR0xpbnQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXMoIEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZnYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpKCBHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQycyggR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2QoIEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZnYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYgKTsKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpKCBHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzcyggR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZCggR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2ICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aSggR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdiApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHMoIEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7CisKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGQoIGNvbnN0IEdMZG91YmxlIG1bMTZdICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmKCBjb25zdCBHTGZsb2F0IG1bMTZdICk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkKCBjb25zdCBHTGRvdWJsZSBtWzE2XSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZiggY29uc3QgR0xmbG9hdCBtWzE2XSApOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKTsKKwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRVBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NUFJFU1NFRFRFWElNQUdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCB2b2lkICppbWcpOworCisKKy8qCisgKiBHTF9BUkJfbXVsdGl0ZXh0dXJlIChBUkIgZXh0ZW5zaW9uIDEgYW5kIE9wZW5HTCAxLjIuMSkKKyAqLworI2lmbmRlZiBHTF9BUkJfbXVsdGl0ZXh0dXJlCisjZGVmaW5lIEdMX0FSQl9tdWx0aXRleHR1cmUgMQorCisjZGVmaW5lIEdMX1RFWFRVUkUwX0FSQgkJCQkweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTFfQVJCCQkJCTB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMl9BUkIJCQkJMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzX0FSQgkJCQkweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTRfQVJCCQkJCTB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNV9BUkIJCQkJMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2X0FSQgkJCQkweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTdfQVJCCQkJCTB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOF9BUkIJCQkJMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5X0FSQgkJCQkweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwX0FSQgkJCTB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTFfQVJCCQkJMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMl9BUkIJCQkweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzX0FSQgkJCTB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTRfQVJCCQkJMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNV9BUkIJCQkweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2X0FSQgkJCTB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTdfQVJCCQkJMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOF9BUkIJCQkweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5X0FSQgkJCTB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjBfQVJCCQkJMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMV9BUkIJCQkweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyX0FSQgkJCTB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjNfQVJCCQkJMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNF9BUkIJCQkweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1X0FSQgkJCTB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjZfQVJCCQkJMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyN19BUkIJCQkweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4X0FSQgkJCTB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjlfQVJCCQkJMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMF9BUkIJCQkweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxX0FSQgkJCTB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRV9BUkIJCQkweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFX0FSQgkJMHg4NEUxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTX0FSQgkJMHg4NEUyCisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmVBUkIoR0xlbnVtIHRleHR1cmUpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQihHTGVudW0gdGV4dHVyZSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWRBUkIoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcyk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZkFSQihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaUFSQihHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzQVJCKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcyk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkQVJCKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZBUkIoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaUFSQihHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzQVJCKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3ZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2RBUkIoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZkFSQihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZnZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2lBUkIoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc0FSQihHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3ZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGRBUkIoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgciwgR0xkb3VibGUgcSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZkFSQihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmdkFSQihHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aUFSQihHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXZBUkIoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzQVJCKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0LCBHTHNob3J0IHIsIEdMc2hvcnQgcSk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2QVJCKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVBUkJQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworCisjZW5kaWYgLyogR0xfQVJCX211bHRpdGV4dHVyZSAqLworCisKKworLyoKKyAqIERlZmluZSB0aGlzIHRva2VuIGlmIHlvdSB3YW50ICJvbGQtc3R5bGUiIGhlYWRlciBmaWxlIGJlaGF2aW91ciAoZXh0ZW5zaW9ucworICogZGVmaW5lZCBpbiBnbC5oKS4gIE90aGVyd2lzZSwgZXh0ZW5zaW9ucyB3aWxsIGJlIGluY2x1ZGVkIGZyb20gZ2xleHQuaC4KKyAqLworI2lmIGRlZmluZWQoR0xfR0xFWFRfTEVHQUNZKQorCisvKiBBbGwgZXh0ZW5zaW9ucyB0aGF0IHVzZWQgdG8gYmUgaGVyZSBhcmUgbm93IGZvdW5kIGluIGdsZXh0LmggKi8KKworI2Vsc2UgIC8qIEdMX0dMRVhUX0xFR0FDWSAqLworCisjaW5jbHVkZSA8R0wvZ2xleHQuaD4KKworI2VuZGlmICAvKiBHTF9HTEVYVF9MRUdBQ1kgKi8KKworCisKKyNpZiBHTF9BUkJfc2hhZGVyX29iamVjdHMKKworI2lmbmRlZiBHTF9NRVNBX3NoYWRlcl9kZWJ1ZworI2RlZmluZSBHTF9NRVNBX3NoYWRlcl9kZWJ1ZyAxCisKKyNkZWZpbmUgR0xfREVCVUdfT0JKRUNUX01FU0EgICAgICAgICAgICAgIDB4ODc1OQorI2RlZmluZSBHTF9ERUJVR19QUklOVF9NRVNBICAgICAgICAgICAgICAgMHg4NzVBCisjZGVmaW5lIEdMX0RFQlVHX0FTU0VSVF9NRVNBICAgICAgICAgICAgICAweDg3NUIKKworR0xBUEkgR0xoYW5kbGVBUkIgR0xBUElFTlRSWSBnbENyZWF0ZURlYnVnT2JqZWN0TUVTQSAodm9pZCk7CitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xDbGVhckRlYnVnTG9nTUVTQSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gbG9nVHlwZSwgR0xlbnVtIHNoYWRlclR5cGUpOworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2V0RGVidWdMb2dNRVNBIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBsb2dUeXBlLCBHTGVudW0gc2hhZGVyVHlwZSwgR0xzaXplaSBtYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyQVJCICpkZWJ1Z0xvZyk7CitHTEFQSSBHTHNpemVpIEdMQVBJRU5UUlkgZ2xHZXREZWJ1Z0xvZ0xlbmd0aE1FU0EgKEdMaGFuZGxlQVJCIG9iaiwgR0xlbnVtIGxvZ1R5cGUsIEdMZW51bSBzaGFkZXJUeXBlKTsKKworI2VuZGlmIC8qIEdMX01FU0Ffc2hhZGVyX2RlYnVnICovCisKKyNlbmRpZiAvKiBHTF9BUkJfc2hhZGVyX29iamVjdHMgKi8KKworCisvKgorICogPz8/LiBHTF9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisgKiBYWFggb2Jzb2xldGUKKyAqLworI2lmbmRlZiBHTF9NRVNBX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX01FU0FfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQorCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfTUVTQQkJCTB4ODc1MAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9NRVNBCQkweDg3NTEKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzhfMjRfUkVWX01FU0EJCTB4ODc1MgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xNV8xX01FU0EJCTB4ODc1MworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzE1X1JFVl9NRVNBCQkweDg3NTQKKworI2VuZGlmIC8qIEdMX01FU0FfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KKworCisjaWZuZGVmIEdMX01FU0FfcHJvZ3JhbV9kZWJ1ZworI2RlZmluZSBHTF9NRVNBX3Byb2dyYW1fZGVidWcgMQorCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fUE9TSVRJT05fTUVTQSAgICAgICAweDhiYjAKKyNkZWZpbmUgR0xfRlJBR01FTlRfUFJPR1JBTV9DQUxMQkFDS19NRVNBICAgICAgIDB4OGJiMQorI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0NBTExCQUNLX0ZVTkNfTUVTQSAgMHg4YmIyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fQ0FMTEJBQ0tfREFUQV9NRVNBICAweDhiYjMKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9TSVRJT05fTUVTQSAgICAgICAgIDB4OGJiNAorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9DQUxMQkFDS19NRVNBICAgICAgICAgMHg4YmI1CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX0NBTExCQUNLX0ZVTkNfTUVTQSAgICAweDhiYjYKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fQ0FMTEJBQ0tfREFUQV9NRVNBICAgIDB4OGJiNworCit0eXBlZGVmIHZvaWQgKCpHTHByb2dyYW1jYWxsYmFja01FU0EpKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqZGF0YSk7CisKK0dMQVBJIHZvaWQgR0xBUElFTlRSWSBnbFByb2dyYW1DYWxsYmFja01FU0EoR0xlbnVtIHRhcmdldCwgR0xwcm9ncmFtY2FsbGJhY2tNRVNBIGNhbGxiYWNrLCBHTHZvaWQgKmRhdGEpOworCitHTEFQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUmVnaXN0ZXJmdk1FU0EoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgKnYpOworCisjZW5kaWYgLyogR0xfTUVTQV9wcm9ncmFtX2RlYnVnICovCisKKworI2lmbmRlZiBHTF9BVElfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfQVRJX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIDEKKworI2RlZmluZSBHTF9BTFBIQV9CTEVORF9FUVVBVElPTl9BVEkJICAgICAgICAweDg4M0QKKworR0xBUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlQVRJKCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBICk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUFUSVBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBKTsKKworI2VuZGlmIC8qIEdMX0FUSV9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAqLworCisKKworLyoqCisgKiogTk9URSEhISEhICBJZiB5b3UgYWRkIG5ldyBmdW5jdGlvbnMgdG8gdGhpcyBmaWxlLCBvciB1cGRhdGUKKyAqKiBnbGV4dC5oIGJlIHN1cmUgdG8gcmVnZW5lcmF0ZSB0aGUgZ2xfbWFuZ2xlLmggZmlsZS4gIFNlZSBjb21tZW50cworICoqIGluIHRoYXQgZmlsZSBmb3IgZGV0YWlscy4KKyAqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCZWdpbiBzeXN0ZW0tc3BlY2lmaWMgc3R1ZmYKKyAqLworI2lmIGRlZmluZWQoUFJBR01BX0VYUE9SVF9TVVBQT1JURUQpCisjcHJhZ21hIGV4cG9ydCBvZmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChtYWNpbnRvc2gpICYmIFBSQUdNQV9JTVBPUlRfU1VQUE9SVEVECisjcHJhZ21hIGltcG9ydCBvZmYKKyNlbmRpZgorLyoKKyAqIEVuZCBzeXN0ZW0tc3BlY2lmaWMgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsX2hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dsX21hbmdsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbF9tYW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNkNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbF9tYW5nbGUuaApAQCAtMCwwICsxLDE1NjggQEAKKyNpZiAwCisjZGVmaW5lIEdMX01BTkdMRV9DMSAiRE8gTk9UIEVESVQhISEgLSBUTyBSRUdFTkVSQVRFIGZyb20gZ2wuaCwgRVhFQ1VURSBUSElTIEZJTEUgSU4gU0hFTEwgKC9iaW4vc2gpIGFuZCBzYXZlIHRoZSBvdXRwdXQiCisjZGVmaW5lIEdMX01BTkdMRV9DMiAiVGhpcyBmaWxlIGlzIHVzZWQgdG8gY3JlYXRlIEdMIGZ1bmN0aW9uIHByb3R5cGVzIGFuZCBhbGlhc2VzIGZvciB0aGUgZnVuY3Rpb24gbmFtZXMiCisJZmlsZXM9ImdsLmggZ2xleHQuaCIKKyNkZWZpbmUgR0xfTUFOR0xFX0MzICJnZXQgcmVnZW5lcmF0aW9uIGhlYWRlciAtIGNvcHkgZXZlcnl0aGluZyBpbiB0aGlzIGZpbGUgYWJvdmUgdGhlICdSRUdFTkVSQVRFX1RPX0VORCcgbGluZSIKKwlhd2sgCSchZG9uZTsgL15cL1wqUkVHRU5FUkFURV9UT19FTkQvIHtkb25lPTF9JyAkMAorCWVjaG8gIiIKKyNkZWZpbmUgR0xfTUFOR0xFX0M0IGdldCBhbGlhc2VzCisJZ3JlcCAnXkdMQVBJJyAkZmlsZXMgfCBzZWQgLWUgJ3MvLipFTlRSWSBnbFwoW14oIF0qXCkuKiQvI2RlZmluZSBnbFwxCQlNQU5HTEUoXDEpLycgfCBzb3J0IHwgdW5pcQorCWVjaG8gIiIKKwllY2hvICIjZW5kaWYgLyogR0xfTUFOR0xFX0ggKi8iCisJZXhpdAorI2VuZGlmIC8qIFJFR0VORVJBVElPTiAqLworCisvKgorICogSWYgeW91IGNvbXBpbGUgTWVzYSB3aXRoIFVTRV9NR0xfTkFNRVNQQUNFIGRlZmluZWQgdGhlbiB5b3UgY2FuIGxpbmsKKyAqIHlvdXIgYXBwbGljYXRpb24gYm90aCB3aXRoIE9wZW5HTCBhbmQgTWVzYS4gIFRoZSBNZXNhIGZ1bmN0aW9ucyB3aWxsCisgKiBiZSByZWRlZmluZWQgc28gdGhleSBhcmUgcHJlZml4ZWQgd2l0aCAibWdsIiBpbnN0ZWFkIG9mICJnbCIuCisgKiBNZ2wgY29udHJpYnV0ZWQgYnkgUmFuZHkgRnJhbmsgKHJmcmFua0Byc2luYy5jb20pCisgKiBSZWduZXJhdGlvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IFJheSBUaWNlIChyYXl0QG1hLnVsdHJhLm5ldCkKKyAqLworCisjaWZuZGVmIEdMX01BTkdMRV9ICisjZGVmaW5lIEdMX01BTkdMRV9ICisKKyNpZm5kZWYgICBNQU5HTEUKKyNkZWZpbmUgICBNQU5HTEUoeCkgbWdsIyN4CisjZW5kaWYgIC8qTUFOR0xFKi8KKworLypSRUdFTkVSQVRFX1RPX0VORC0tLS0tLS0tLS0tQUxMIExJTkVTIEJFTE9XIEhFUkUgR0VUIFJFUExBQ0VEIE9OIFJFR0VORVJBVElPTiAqLworCisjZGVmaW5lIGdsQWNjdW0JCU1BTkdMRShBY2N1bSkKKyNkZWZpbmUgZ2xBY3RpdmVTdGVuY2lsRmFjZUVYVAkJTUFOR0xFKEFjdGl2ZVN0ZW5jaWxGYWNlRVhUKQorI2RlZmluZSBnbEFjdGl2ZVRleHR1cmVBUkIJCU1BTkdMRShBY3RpdmVUZXh0dXJlQVJCKQorI2RlZmluZSBnbEFjdGl2ZVRleHR1cmUJCU1BTkdMRShBY3RpdmVUZXh0dXJlKQorI2RlZmluZSBnbEFjdGl2ZVZhcnlpbmdOVgkJTUFOR0xFKEFjdGl2ZVZhcnlpbmdOVikKKyNkZWZpbmUgZ2xBbHBoYUZyYWdtZW50T3AxQVRJCQlNQU5HTEUoQWxwaGFGcmFnbWVudE9wMUFUSSkKKyNkZWZpbmUgZ2xBbHBoYUZyYWdtZW50T3AyQVRJCQlNQU5HTEUoQWxwaGFGcmFnbWVudE9wMkFUSSkKKyNkZWZpbmUgZ2xBbHBoYUZyYWdtZW50T3AzQVRJCQlNQU5HTEUoQWxwaGFGcmFnbWVudE9wM0FUSSkKKyNkZWZpbmUgZ2xBbHBoYUZ1bmMJCU1BTkdMRShBbHBoYUZ1bmMpCisjZGVmaW5lIGdsQXBwbHlUZXh0dXJlRVhUCQlNQU5HTEUoQXBwbHlUZXh0dXJlRVhUKQorI2RlZmluZSBnbEFyZVByb2dyYW1zUmVzaWRlbnROVgkJTUFOR0xFKEFyZVByb2dyYW1zUmVzaWRlbnROVikKKyNkZWZpbmUgZ2xBcmVUZXh0dXJlc1Jlc2lkZW50RVhUCQlNQU5HTEUoQXJlVGV4dHVyZXNSZXNpZGVudEVYVCkKKyNkZWZpbmUgZ2xBcmVUZXh0dXJlc1Jlc2lkZW50CQlNQU5HTEUoQXJlVGV4dHVyZXNSZXNpZGVudCkKKyNkZWZpbmUgZ2xBcnJheUVsZW1lbnRFWFQJCU1BTkdMRShBcnJheUVsZW1lbnRFWFQpCisjZGVmaW5lIGdsQXJyYXlFbGVtZW50CQlNQU5HTEUoQXJyYXlFbGVtZW50KQorI2RlZmluZSBnbEFycmF5T2JqZWN0QVRJCQlNQU5HTEUoQXJyYXlPYmplY3RBVEkpCisjZGVmaW5lIGdsQXN5bmNNYXJrZXJTR0lYCQlNQU5HTEUoQXN5bmNNYXJrZXJTR0lYKQorI2RlZmluZSBnbEF0dGFjaE9iamVjdEFSQgkJTUFOR0xFKEF0dGFjaE9iamVjdEFSQikKKyNkZWZpbmUgZ2xBdHRhY2hTaGFkZXIJCU1BTkdMRShBdHRhY2hTaGFkZXIpCisjZGVmaW5lIGdsQmVnaW5GcmFnbWVudFNoYWRlckFUSQkJTUFOR0xFKEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkpCisjZGVmaW5lIGdsQmVnaW4JCU1BTkdMRShCZWdpbikKKyNkZWZpbmUgZ2xCZWdpbk9jY2x1c2lvblF1ZXJ5TlYJCU1BTkdMRShCZWdpbk9jY2x1c2lvblF1ZXJ5TlYpCisjZGVmaW5lIGdsQmVnaW5RdWVyeUFSQgkJTUFOR0xFKEJlZ2luUXVlcnlBUkIpCisjZGVmaW5lIGdsQmVnaW5RdWVyeQkJTUFOR0xFKEJlZ2luUXVlcnkpCisjZGVmaW5lIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoQmVnaW5UcmFuc2Zvcm1GZWVkYmFja05WKQorI2RlZmluZSBnbEJlZ2luVmVydGV4U2hhZGVyRVhUCQlNQU5HTEUoQmVnaW5WZXJ0ZXhTaGFkZXJFWFQpCisjZGVmaW5lIGdsQmluZEF0dHJpYkxvY2F0aW9uQVJCCQlNQU5HTEUoQmluZEF0dHJpYkxvY2F0aW9uQVJCKQorI2RlZmluZSBnbEJpbmRBdHRyaWJMb2NhdGlvbgkJTUFOR0xFKEJpbmRBdHRyaWJMb2NhdGlvbikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyQVJCCQlNQU5HTEUoQmluZEJ1ZmZlckFSQikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyQmFzZU5WCQlNQU5HTEUoQmluZEJ1ZmZlckJhc2VOVikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyCQlNQU5HTEUoQmluZEJ1ZmZlcikKKyNkZWZpbmUgZ2xCaW5kQnVmZmVyT2Zmc2V0TlYJCU1BTkdMRShCaW5kQnVmZmVyT2Zmc2V0TlYpCisjZGVmaW5lIGdsQmluZEJ1ZmZlclJhbmdlTlYJCU1BTkdMRShCaW5kQnVmZmVyUmFuZ2VOVikKKyNkZWZpbmUgZ2xCaW5kRnJhZ0RhdGFMb2NhdGlvbkVYVAkJTUFOR0xFKEJpbmRGcmFnRGF0YUxvY2F0aW9uRVhUKQorI2RlZmluZSBnbEJpbmRGcmFnbWVudFNoYWRlckFUSQkJTUFOR0xFKEJpbmRGcmFnbWVudFNoYWRlckFUSSkKKyNkZWZpbmUgZ2xCaW5kRnJhbWVidWZmZXJFWFQJCU1BTkdMRShCaW5kRnJhbWVidWZmZXJFWFQpCisjZGVmaW5lIGdsQmluZExpZ2h0UGFyYW1ldGVyRVhUCQlNQU5HTEUoQmluZExpZ2h0UGFyYW1ldGVyRVhUKQorI2RlZmluZSBnbEJpbmRNYXRlcmlhbFBhcmFtZXRlckVYVAkJTUFOR0xFKEJpbmRNYXRlcmlhbFBhcmFtZXRlckVYVCkKKyNkZWZpbmUgZ2xCaW5kUGFyYW1ldGVyRVhUCQlNQU5HTEUoQmluZFBhcmFtZXRlckVYVCkKKyNkZWZpbmUgZ2xCaW5kUHJvZ3JhbUFSQgkJTUFOR0xFKEJpbmRQcm9ncmFtQVJCKQorI2RlZmluZSBnbEJpbmRQcm9ncmFtTlYJCU1BTkdMRShCaW5kUHJvZ3JhbU5WKQorI2RlZmluZSBnbEJpbmRSZW5kZXJidWZmZXJFWFQJCU1BTkdMRShCaW5kUmVuZGVyYnVmZmVyRVhUKQorI2RlZmluZSBnbEJpbmRUZXhHZW5QYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kVGV4R2VuUGFyYW1ldGVyRVhUKQorI2RlZmluZSBnbEJpbmRUZXh0dXJlRVhUCQlNQU5HTEUoQmluZFRleHR1cmVFWFQpCisjZGVmaW5lIGdsQmluZFRleHR1cmUJCU1BTkdMRShCaW5kVGV4dHVyZSkKKyNkZWZpbmUgZ2xCaW5kVGV4dHVyZVVuaXRQYXJhbWV0ZXJFWFQJCU1BTkdMRShCaW5kVGV4dHVyZVVuaXRQYXJhbWV0ZXJFWFQpCisjZGVmaW5lIGdsQmluZFZlcnRleEFycmF5QVBQTEUJCU1BTkdMRShCaW5kVmVydGV4QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xCaW5kVmVydGV4U2hhZGVyRVhUCQlNQU5HTEUoQmluZFZlcnRleFNoYWRlckVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNiRVhUCQlNQU5HTEUoQmlub3JtYWwzYkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNidkVYVAkJTUFOR0xFKEJpbm9ybWFsM2J2RVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2RFWFQJCU1BTkdMRShCaW5vcm1hbDNkRVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM2R2RVhUCQlNQU5HTEUoQmlub3JtYWwzZHZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzZkVYVAkJTUFOR0xFKEJpbm9ybWFsM2ZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWwzZnZFWFQJCU1BTkdMRShCaW5vcm1hbDNmdkVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNpRVhUCQlNQU5HTEUoQmlub3JtYWwzaUVYVCkKKyNkZWZpbmUgZ2xCaW5vcm1hbDNpdkVYVAkJTUFOR0xFKEJpbm9ybWFsM2l2RVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM3NFWFQJCU1BTkdMRShCaW5vcm1hbDNzRVhUKQorI2RlZmluZSBnbEJpbm9ybWFsM3N2RVhUCQlNQU5HTEUoQmlub3JtYWwzc3ZFWFQpCisjZGVmaW5lIGdsQmlub3JtYWxQb2ludGVyRVhUCQlNQU5HTEUoQmlub3JtYWxQb2ludGVyRVhUKQorI2RlZmluZSBnbEJpdG1hcAkJTUFOR0xFKEJpdG1hcCkKKyNkZWZpbmUgZ2xCbGVuZENvbG9yRVhUCQlNQU5HTEUoQmxlbmRDb2xvckVYVCkKKyNkZWZpbmUgZ2xCbGVuZENvbG9yCQlNQU5HTEUoQmxlbmRDb2xvcikKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uRVhUCQlNQU5HTEUoQmxlbmRFcXVhdGlvbkVYVCkKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uCQlNQU5HTEUoQmxlbmRFcXVhdGlvbikKKyNkZWZpbmUgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVBVEkJCU1BTkdMRShCbGVuZEVxdWF0aW9uU2VwYXJhdGVBVEkpCisjZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUCQlNQU5HTEUoQmxlbmRFcXVhdGlvblNlcGFyYXRlRVhUKQorI2RlZmluZSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZQkJTUFOR0xFKEJsZW5kRXF1YXRpb25TZXBhcmF0ZSkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmMJCU1BTkdMRShCbGVuZEZ1bmMpCisjZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGVFWFQJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZUVYVCkKKyNkZWZpbmUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUlOR1IJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZUlOR1IpCisjZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGUJCU1BTkdMRShCbGVuZEZ1bmNTZXBhcmF0ZSkKKyNkZWZpbmUgZ2xCbGl0RnJhbWVidWZmZXJFWFQJCU1BTkdMRShCbGl0RnJhbWVidWZmZXJFWFQpCisjZGVmaW5lIGdsQnVmZmVyRGF0YUFSQgkJTUFOR0xFKEJ1ZmZlckRhdGFBUkIpCisjZGVmaW5lIGdsQnVmZmVyRGF0YQkJTUFOR0xFKEJ1ZmZlckRhdGEpCisjZGVmaW5lIGdsQnVmZmVyUGFyYW1ldGVyaUFQUExFCQlNQU5HTEUoQnVmZmVyUGFyYW1ldGVyaUFQUExFKQorI2RlZmluZSBnbEJ1ZmZlclN1YkRhdGFBUkIJCU1BTkdMRShCdWZmZXJTdWJEYXRhQVJCKQorI2RlZmluZSBnbEJ1ZmZlclN1YkRhdGEJCU1BTkdMRShCdWZmZXJTdWJEYXRhKQorI2RlZmluZSBnbENhbGxMaXN0CQlNQU5HTEUoQ2FsbExpc3QpCisjZGVmaW5lIGdsQ2FsbExpc3RzCQlNQU5HTEUoQ2FsbExpc3RzKQorI2RlZmluZSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQJCU1BTkdMRShDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKQorI2RlZmluZSBnbENsYW1wQ29sb3JBUkIJCU1BTkdMRShDbGFtcENvbG9yQVJCKQorI2RlZmluZSBnbENsZWFyQWNjdW0JCU1BTkdMRShDbGVhckFjY3VtKQorI2RlZmluZSBnbENsZWFyQ29sb3JJaUVYVAkJTUFOR0xFKENsZWFyQ29sb3JJaUVYVCkKKyNkZWZpbmUgZ2xDbGVhckNvbG9ySXVpRVhUCQlNQU5HTEUoQ2xlYXJDb2xvckl1aUVYVCkKKyNkZWZpbmUgZ2xDbGVhckNvbG9yCQlNQU5HTEUoQ2xlYXJDb2xvcikKKyNkZWZpbmUgZ2xDbGVhckRlYnVnTG9nTUVTQQkJTUFOR0xFKENsZWFyRGVidWdMb2dNRVNBKQorI2RlZmluZSBnbENsZWFyRGVwdGhkTlYJCU1BTkdMRShDbGVhckRlcHRoZE5WKQorI2RlZmluZSBnbENsZWFyRGVwdGgJCU1BTkdMRShDbGVhckRlcHRoKQorI2RlZmluZSBnbENsZWFySW5kZXgJCU1BTkdMRShDbGVhckluZGV4KQorI2RlZmluZSBnbENsZWFyCQlNQU5HTEUoQ2xlYXIpCisjZGVmaW5lIGdsQ2xlYXJTdGVuY2lsCQlNQU5HTEUoQ2xlYXJTdGVuY2lsKQorI2RlZmluZSBnbENsaWVudEFjdGl2ZVRleHR1cmVBUkIJCU1BTkdMRShDbGllbnRBY3RpdmVUZXh0dXJlQVJCKQorI2RlZmluZSBnbENsaWVudEFjdGl2ZVRleHR1cmUJCU1BTkdMRShDbGllbnRBY3RpdmVUZXh0dXJlKQorI2RlZmluZSBnbENsaWVudEFjdGl2ZVZlcnRleFN0cmVhbUFUSQkJTUFOR0xFKENsaWVudEFjdGl2ZVZlcnRleFN0cmVhbUFUSSkKKyNkZWZpbmUgZ2xDbGlwUGxhbmUJCU1BTkdMRShDbGlwUGxhbmUpCisjZGVmaW5lIGdsQ29sb3IzYgkJTUFOR0xFKENvbG9yM2IpCisjZGVmaW5lIGdsQ29sb3IzYnYJCU1BTkdMRShDb2xvcjNidikKKyNkZWZpbmUgZ2xDb2xvcjNkCQlNQU5HTEUoQ29sb3IzZCkKKyNkZWZpbmUgZ2xDb2xvcjNkdgkJTUFOR0xFKENvbG9yM2R2KQorI2RlZmluZSBnbENvbG9yM2YJCU1BTkdMRShDb2xvcjNmKQorI2RlZmluZSBnbENvbG9yM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKENvbG9yM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xDb2xvcjNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoQ29sb3IzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xDb2xvcjNmdgkJTUFOR0xFKENvbG9yM2Z2KQorI2RlZmluZSBnbENvbG9yM2hOVgkJTUFOR0xFKENvbG9yM2hOVikKKyNkZWZpbmUgZ2xDb2xvcjNodk5WCQlNQU5HTEUoQ29sb3IzaHZOVikKKyNkZWZpbmUgZ2xDb2xvcjNpCQlNQU5HTEUoQ29sb3IzaSkKKyNkZWZpbmUgZ2xDb2xvcjNpdgkJTUFOR0xFKENvbG9yM2l2KQorI2RlZmluZSBnbENvbG9yM3MJCU1BTkdMRShDb2xvcjNzKQorI2RlZmluZSBnbENvbG9yM3N2CQlNQU5HTEUoQ29sb3Izc3YpCisjZGVmaW5lIGdsQ29sb3IzdWIJCU1BTkdMRShDb2xvcjN1YikKKyNkZWZpbmUgZ2xDb2xvcjN1YnYJCU1BTkdMRShDb2xvcjN1YnYpCisjZGVmaW5lIGdsQ29sb3IzdWkJCU1BTkdMRShDb2xvcjN1aSkKKyNkZWZpbmUgZ2xDb2xvcjN1aXYJCU1BTkdMRShDb2xvcjN1aXYpCisjZGVmaW5lIGdsQ29sb3IzdXMJCU1BTkdMRShDb2xvcjN1cykKKyNkZWZpbmUgZ2xDb2xvcjN1c3YJCU1BTkdMRShDb2xvcjN1c3YpCisjZGVmaW5lIGdsQ29sb3I0YgkJTUFOR0xFKENvbG9yNGIpCisjZGVmaW5lIGdsQ29sb3I0YnYJCU1BTkdMRShDb2xvcjRidikKKyNkZWZpbmUgZ2xDb2xvcjRkCQlNQU5HTEUoQ29sb3I0ZCkKKyNkZWZpbmUgZ2xDb2xvcjRkdgkJTUFOR0xFKENvbG9yNGR2KQorI2RlZmluZSBnbENvbG9yNGYJCU1BTkdMRShDb2xvcjRmKQorI2RlZmluZSBnbENvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbENvbG9yNGZ2CQlNQU5HTEUoQ29sb3I0ZnYpCisjZGVmaW5lIGdsQ29sb3I0aE5WCQlNQU5HTEUoQ29sb3I0aE5WKQorI2RlZmluZSBnbENvbG9yNGh2TlYJCU1BTkdMRShDb2xvcjRodk5WKQorI2RlZmluZSBnbENvbG9yNGkJCU1BTkdMRShDb2xvcjRpKQorI2RlZmluZSBnbENvbG9yNGl2CQlNQU5HTEUoQ29sb3I0aXYpCisjZGVmaW5lIGdsQ29sb3I0cwkJTUFOR0xFKENvbG9yNHMpCisjZGVmaW5lIGdsQ29sb3I0c3YJCU1BTkdMRShDb2xvcjRzdikKKyNkZWZpbmUgZ2xDb2xvcjR1YgkJTUFOR0xFKENvbG9yNHViKQorI2RlZmluZSBnbENvbG9yNHViVmVydGV4MmZTVU4JCU1BTkdMRShDb2xvcjR1YlZlcnRleDJmU1VOKQorI2RlZmluZSBnbENvbG9yNHViVmVydGV4MmZ2U1VOCQlNQU5HTEUoQ29sb3I0dWJWZXJ0ZXgyZnZTVU4pCisjZGVmaW5lIGdsQ29sb3I0dWJWZXJ0ZXgzZlNVTgkJTUFOR0xFKENvbG9yNHViVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsQ29sb3I0dWJWZXJ0ZXgzZnZTVU4JCU1BTkdMRShDb2xvcjR1YlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xDb2xvcjR1YnYJCU1BTkdMRShDb2xvcjR1YnYpCisjZGVmaW5lIGdsQ29sb3I0dWkJCU1BTkdMRShDb2xvcjR1aSkKKyNkZWZpbmUgZ2xDb2xvcjR1aXYJCU1BTkdMRShDb2xvcjR1aXYpCisjZGVmaW5lIGdsQ29sb3I0dXMJCU1BTkdMRShDb2xvcjR1cykKKyNkZWZpbmUgZ2xDb2xvcjR1c3YJCU1BTkdMRShDb2xvcjR1c3YpCisjZGVmaW5lIGdsQ29sb3JGcmFnbWVudE9wMUFUSQkJTUFOR0xFKENvbG9yRnJhZ21lbnRPcDFBVEkpCisjZGVmaW5lIGdsQ29sb3JGcmFnbWVudE9wMkFUSQkJTUFOR0xFKENvbG9yRnJhZ21lbnRPcDJBVEkpCisjZGVmaW5lIGdsQ29sb3JGcmFnbWVudE9wM0FUSQkJTUFOR0xFKENvbG9yRnJhZ21lbnRPcDNBVEkpCisjZGVmaW5lIGdsQ29sb3JNYXNrSW5kZXhlZEVYVAkJTUFOR0xFKENvbG9yTWFza0luZGV4ZWRFWFQpCisjZGVmaW5lIGdsQ29sb3JNYXNrCQlNQU5HTEUoQ29sb3JNYXNrKQorI2RlZmluZSBnbENvbG9yTWF0ZXJpYWwJCU1BTkdMRShDb2xvck1hdGVyaWFsKQorI2RlZmluZSBnbENvbG9yUG9pbnRlckVYVAkJTUFOR0xFKENvbG9yUG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xDb2xvclBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoQ29sb3JQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xDb2xvclBvaW50ZXIJCU1BTkdMRShDb2xvclBvaW50ZXIpCisjZGVmaW5lIGdsQ29sb3JQb2ludGVydklOVEVMCQlNQU5HTEUoQ29sb3JQb2ludGVydklOVEVMKQorI2RlZmluZSBnbENvbG9yU3ViVGFibGVFWFQJCU1BTkdMRShDb2xvclN1YlRhYmxlRVhUKQorI2RlZmluZSBnbENvbG9yU3ViVGFibGUJCU1BTkdMRShDb2xvclN1YlRhYmxlKQorI2RlZmluZSBnbENvbG9yVGFibGVFWFQJCU1BTkdMRShDb2xvclRhYmxlRVhUKQorI2RlZmluZSBnbENvbG9yVGFibGUJCU1BTkdMRShDb2xvclRhYmxlKQorI2RlZmluZSBnbENvbG9yVGFibGVQYXJhbWV0ZXJmdgkJTUFOR0xFKENvbG9yVGFibGVQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kJCU1BTkdMRShDb2xvclRhYmxlUGFyYW1ldGVyZnZTR0kpCisjZGVmaW5lIGdsQ29sb3JUYWJsZVBhcmFtZXRlcml2CQlNQU5HTEUoQ29sb3JUYWJsZVBhcmFtZXRlcml2KQorI2RlZmluZSBnbENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSQkJTUFOR0xFKENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSSkKKyNkZWZpbmUgZ2xDb2xvclRhYmxlU0dJCQlNQU5HTEUoQ29sb3JUYWJsZVNHSSkKKyNkZWZpbmUgZ2xDb21iaW5lcklucHV0TlYJCU1BTkdMRShDb21iaW5lcklucHV0TlYpCisjZGVmaW5lIGdsQ29tYmluZXJPdXRwdXROVgkJTUFOR0xFKENvbWJpbmVyT3V0cHV0TlYpCisjZGVmaW5lIGdsQ29tYmluZXJQYXJhbWV0ZXJmTlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcmZOVikKKyNkZWZpbmUgZ2xDb21iaW5lclBhcmFtZXRlcmZ2TlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsQ29tYmluZXJQYXJhbWV0ZXJpTlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcmlOVikKKyNkZWZpbmUgZ2xDb21iaW5lclBhcmFtZXRlcml2TlYJCU1BTkdMRShDb21iaW5lclBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsQ29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYJCU1BTkdMRShDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xDb21waWxlU2hhZGVyQVJCCQlNQU5HTEUoQ29tcGlsZVNoYWRlckFSQikKKyNkZWZpbmUgZ2xDb21waWxlU2hhZGVyCQlNQU5HTEUoQ29tcGlsZVNoYWRlcikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4SW1hZ2UxREFSQgkJTUFOR0xFKENvbXByZXNzZWRUZXhJbWFnZTFEQVJCKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhJbWFnZTFECQlNQU5HTEUoQ29tcHJlc3NlZFRleEltYWdlMUQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleEltYWdlMkRBUkIJCU1BTkdMRShDb21wcmVzc2VkVGV4SW1hZ2UyREFSQikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRAkJTUFOR0xFKENvbXByZXNzZWRUZXhJbWFnZTJEKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhJbWFnZTNEQVJCCQlNQU5HTEUoQ29tcHJlc3NlZFRleEltYWdlM0RBUkIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleEltYWdlM0QJCU1BTkdMRShDb21wcmVzc2VkVGV4SW1hZ2UzRCkKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UxREFSQgkJTUFOR0xFKENvbXByZXNzZWRUZXhTdWJJbWFnZTFEQVJCKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFECQlNQU5HTEUoQ29tcHJlc3NlZFRleFN1YkltYWdlMUQpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkRBUkIJCU1BTkdMRShDb21wcmVzc2VkVGV4U3ViSW1hZ2UyREFSQikKKyNkZWZpbmUgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRAkJTUFOR0xFKENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKQorI2RlZmluZSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNEQVJCCQlNQU5HTEUoQ29tcHJlc3NlZFRleFN1YkltYWdlM0RBUkIpCisjZGVmaW5lIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0QJCU1BTkdMRShDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvbkZpbHRlcjFERVhUCQlNQU5HTEUoQ29udm9sdXRpb25GaWx0ZXIxREVYVCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvbkZpbHRlcjFECQlNQU5HTEUoQ29udm9sdXRpb25GaWx0ZXIxRCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvbkZpbHRlcjJERVhUCQlNQU5HTEUoQ29udm9sdXRpb25GaWx0ZXIyREVYVCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvbkZpbHRlcjJECQlNQU5HTEUoQ29udm9sdXRpb25GaWx0ZXIyRCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZFWFQJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcmZFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmCQlNQU5HTEUoQ29udm9sdXRpb25QYXJhbWV0ZXJmKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyZnYJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaUVYVAkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyaUVYVCkKKyNkZWZpbmUgZ2xDb252b2x1dGlvblBhcmFtZXRlcmkJCU1BTkdMRShDb252b2x1dGlvblBhcmFtZXRlcmkpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdgkJTUFOR0xFKENvbnZvbHV0aW9uUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsQ29weUNvbG9yU3ViVGFibGVFWFQJCU1BTkdMRShDb3B5Q29sb3JTdWJUYWJsZUVYVCkKKyNkZWZpbmUgZ2xDb3B5Q29sb3JTdWJUYWJsZQkJTUFOR0xFKENvcHlDb2xvclN1YlRhYmxlKQorI2RlZmluZSBnbENvcHlDb2xvclRhYmxlCQlNQU5HTEUoQ29weUNvbG9yVGFibGUpCisjZGVmaW5lIGdsQ29weUNvbG9yVGFibGVTR0kJCU1BTkdMRShDb3B5Q29sb3JUYWJsZVNHSSkKKyNkZWZpbmUgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxREVYVAkJTUFOR0xFKENvcHlDb252b2x1dGlvbkZpbHRlcjFERVhUKQorI2RlZmluZSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjFECQlNQU5HTEUoQ29weUNvbnZvbHV0aW9uRmlsdGVyMUQpCisjZGVmaW5lIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkRFWFQJCU1BTkdMRShDb3B5Q29udm9sdXRpb25GaWx0ZXIyREVYVCkKKyNkZWZpbmUgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyRAkJTUFOR0xFKENvcHlDb252b2x1dGlvbkZpbHRlcjJEKQorI2RlZmluZSBnbENvcHlQaXhlbHMJCU1BTkdMRShDb3B5UGl4ZWxzKQorI2RlZmluZSBnbENvcHlUZXhJbWFnZTFERVhUCQlNQU5HTEUoQ29weVRleEltYWdlMURFWFQpCisjZGVmaW5lIGdsQ29weVRleEltYWdlMUQJCU1BTkdMRShDb3B5VGV4SW1hZ2UxRCkKKyNkZWZpbmUgZ2xDb3B5VGV4SW1hZ2UyREVYVAkJTUFOR0xFKENvcHlUZXhJbWFnZTJERVhUKQorI2RlZmluZSBnbENvcHlUZXhJbWFnZTJECQlNQU5HTEUoQ29weVRleEltYWdlMkQpCisjZGVmaW5lIGdsQ29weVRleFN1YkltYWdlMURFWFQJCU1BTkdMRShDb3B5VGV4U3ViSW1hZ2UxREVYVCkKKyNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UxRAkJTUFOR0xFKENvcHlUZXhTdWJJbWFnZTFEKQorI2RlZmluZSBnbENvcHlUZXhTdWJJbWFnZTJERVhUCQlNQU5HTEUoQ29weVRleFN1YkltYWdlMkRFWFQpCisjZGVmaW5lIGdsQ29weVRleFN1YkltYWdlMkQJCU1BTkdMRShDb3B5VGV4U3ViSW1hZ2UyRCkKKyNkZWZpbmUgZ2xDb3B5VGV4U3ViSW1hZ2UzREVYVAkJTUFOR0xFKENvcHlUZXhTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbENvcHlUZXhTdWJJbWFnZTNECQlNQU5HTEUoQ29weVRleFN1YkltYWdlM0QpCisjZGVmaW5lIGdsQ3JlYXRlRGVidWdPYmplY3RNRVNBCQlNQU5HTEUoQ3JlYXRlRGVidWdPYmplY3RNRVNBKQorI2RlZmluZSBnbENyZWF0ZVByb2dyYW0JCU1BTkdMRShDcmVhdGVQcm9ncmFtKQorI2RlZmluZSBnbENyZWF0ZVByb2dyYW1PYmplY3RBUkIJCU1BTkdMRShDcmVhdGVQcm9ncmFtT2JqZWN0QVJCKQorI2RlZmluZSBnbENyZWF0ZVNoYWRlcgkJTUFOR0xFKENyZWF0ZVNoYWRlcikKKyNkZWZpbmUgZ2xDcmVhdGVTaGFkZXJPYmplY3RBUkIJCU1BTkdMRShDcmVhdGVTaGFkZXJPYmplY3RBUkIpCisjZGVmaW5lIGdsQ3VsbEZhY2UJCU1BTkdMRShDdWxsRmFjZSkKKyNkZWZpbmUgZ2xDdWxsUGFyYW1ldGVyZHZFWFQJCU1BTkdMRShDdWxsUGFyYW1ldGVyZHZFWFQpCisjZGVmaW5lIGdsQ3VsbFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoQ3VsbFBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEN1cnJlbnRQYWxldHRlTWF0cml4QVJCCQlNQU5HTEUoQ3VycmVudFBhbGV0dGVNYXRyaXhBUkIpCisjZGVmaW5lIGdsRGVmb3JtYXRpb25NYXAzZFNHSVgJCU1BTkdMRShEZWZvcm1hdGlvbk1hcDNkU0dJWCkKKyNkZWZpbmUgZ2xEZWZvcm1hdGlvbk1hcDNmU0dJWAkJTUFOR0xFKERlZm9ybWF0aW9uTWFwM2ZTR0lYKQorI2RlZmluZSBnbERlZm9ybVNHSVgJCU1BTkdMRShEZWZvcm1TR0lYKQorI2RlZmluZSBnbERlbGV0ZUFzeW5jTWFya2Vyc1NHSVgJCU1BTkdMRShEZWxldGVBc3luY01hcmtlcnNTR0lYKQorI2RlZmluZSBnbERlbGV0ZUJ1ZmZlcnNBUkIJCU1BTkdMRShEZWxldGVCdWZmZXJzQVJCKQorI2RlZmluZSBnbERlbGV0ZUJ1ZmZlcnMJCU1BTkdMRShEZWxldGVCdWZmZXJzKQorI2RlZmluZSBnbERlbGV0ZUZlbmNlc0FQUExFCQlNQU5HTEUoRGVsZXRlRmVuY2VzQVBQTEUpCisjZGVmaW5lIGdsRGVsZXRlRmVuY2VzTlYJCU1BTkdMRShEZWxldGVGZW5jZXNOVikKKyNkZWZpbmUgZ2xEZWxldGVGcmFnbWVudFNoYWRlckFUSQkJTUFOR0xFKERlbGV0ZUZyYWdtZW50U2hhZGVyQVRJKQorI2RlZmluZSBnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVAkJTUFOR0xFKERlbGV0ZUZyYW1lYnVmZmVyc0VYVCkKKyNkZWZpbmUgZ2xEZWxldGVMaXN0cwkJTUFOR0xFKERlbGV0ZUxpc3RzKQorI2RlZmluZSBnbERlbGV0ZU9iamVjdEFSQgkJTUFOR0xFKERlbGV0ZU9iamVjdEFSQikKKyNkZWZpbmUgZ2xEZWxldGVPY2NsdXNpb25RdWVyaWVzTlYJCU1BTkdMRShEZWxldGVPY2NsdXNpb25RdWVyaWVzTlYpCisjZGVmaW5lIGdsRGVsZXRlUHJvZ3JhbQkJTUFOR0xFKERlbGV0ZVByb2dyYW0pCisjZGVmaW5lIGdsRGVsZXRlUHJvZ3JhbXNBUkIJCU1BTkdMRShEZWxldGVQcm9ncmFtc0FSQikKKyNkZWZpbmUgZ2xEZWxldGVQcm9ncmFtc05WCQlNQU5HTEUoRGVsZXRlUHJvZ3JhbXNOVikKKyNkZWZpbmUgZ2xEZWxldGVRdWVyaWVzQVJCCQlNQU5HTEUoRGVsZXRlUXVlcmllc0FSQikKKyNkZWZpbmUgZ2xEZWxldGVRdWVyaWVzCQlNQU5HTEUoRGVsZXRlUXVlcmllcykKKyNkZWZpbmUgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUCQlNQU5HTEUoRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCkKKyNkZWZpbmUgZ2xEZWxldGVTaGFkZXIJCU1BTkdMRShEZWxldGVTaGFkZXIpCisjZGVmaW5lIGdsRGVsZXRlVGV4dHVyZXNFWFQJCU1BTkdMRShEZWxldGVUZXh0dXJlc0VYVCkKKyNkZWZpbmUgZ2xEZWxldGVUZXh0dXJlcwkJTUFOR0xFKERlbGV0ZVRleHR1cmVzKQorI2RlZmluZSBnbERlbGV0ZVZlcnRleEFycmF5c0FQUExFCQlNQU5HTEUoRGVsZXRlVmVydGV4QXJyYXlzQVBQTEUpCisjZGVmaW5lIGdsRGVsZXRlVmVydGV4U2hhZGVyRVhUCQlNQU5HTEUoRGVsZXRlVmVydGV4U2hhZGVyRVhUKQorI2RlZmluZSBnbERlcHRoQm91bmRzZE5WCQlNQU5HTEUoRGVwdGhCb3VuZHNkTlYpCisjZGVmaW5lIGdsRGVwdGhCb3VuZHNFWFQJCU1BTkdMRShEZXB0aEJvdW5kc0VYVCkKKyNkZWZpbmUgZ2xEZXB0aEZ1bmMJCU1BTkdMRShEZXB0aEZ1bmMpCisjZGVmaW5lIGdsRGVwdGhNYXNrCQlNQU5HTEUoRGVwdGhNYXNrKQorI2RlZmluZSBnbERlcHRoUmFuZ2VkTlYJCU1BTkdMRShEZXB0aFJhbmdlZE5WKQorI2RlZmluZSBnbERlcHRoUmFuZ2UJCU1BTkdMRShEZXB0aFJhbmdlKQorI2RlZmluZSBnbERldGFjaE9iamVjdEFSQgkJTUFOR0xFKERldGFjaE9iamVjdEFSQikKKyNkZWZpbmUgZ2xEZXRhY2hTaGFkZXIJCU1BTkdMRShEZXRhY2hTaGFkZXIpCisjZGVmaW5lIGdsRGV0YWlsVGV4RnVuY1NHSVMJCU1BTkdMRShEZXRhaWxUZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xEaXNhYmxlQ2xpZW50U3RhdGUJCU1BTkdMRShEaXNhYmxlQ2xpZW50U3RhdGUpCisjZGVmaW5lIGdsRGlzYWJsZUluZGV4ZWRFWFQJCU1BTkdMRShEaXNhYmxlSW5kZXhlZEVYVCkKKyNkZWZpbmUgZ2xEaXNhYmxlCQlNQU5HTEUoRGlzYWJsZSkKKyNkZWZpbmUgZ2xEaXNhYmxlVmFyaWFudENsaWVudFN0YXRlRVhUCQlNQU5HTEUoRGlzYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVCkKKyNkZWZpbmUgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIJCU1BTkdMRShEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlBUkIpCisjZGVmaW5lIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5CQlNQU5HTEUoRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KQorI2RlZmluZSBnbERyYXdBcnJheXNFWFQJCU1BTkdMRShEcmF3QXJyYXlzRVhUKQorI2RlZmluZSBnbERyYXdBcnJheXNJbnN0YW5jZWRFWFQJCU1BTkdMRShEcmF3QXJyYXlzSW5zdGFuY2VkRVhUKQorI2RlZmluZSBnbERyYXdBcnJheXMJCU1BTkdMRShEcmF3QXJyYXlzKQorI2RlZmluZSBnbERyYXdCdWZmZXIJCU1BTkdMRShEcmF3QnVmZmVyKQorI2RlZmluZSBnbERyYXdCdWZmZXJzQVJCCQlNQU5HTEUoRHJhd0J1ZmZlcnNBUkIpCisjZGVmaW5lIGdsRHJhd0J1ZmZlcnNBVEkJCU1BTkdMRShEcmF3QnVmZmVyc0FUSSkKKyNkZWZpbmUgZ2xEcmF3QnVmZmVycwkJTUFOR0xFKERyYXdCdWZmZXJzKQorI2RlZmluZSBnbERyYXdFbGVtZW50QXJyYXlBUFBMRQkJTUFOR0xFKERyYXdFbGVtZW50QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudEFycmF5QVRJCQlNQU5HTEUoRHJhd0VsZW1lbnRBcnJheUFUSSkKKyNkZWZpbmUgZ2xEcmF3RWxlbWVudHNJbnN0YW5jZWRFWFQJCU1BTkdMRShEcmF3RWxlbWVudHNJbnN0YW5jZWRFWFQpCisjZGVmaW5lIGdsRHJhd0VsZW1lbnRzCQlNQU5HTEUoRHJhd0VsZW1lbnRzKQorI2RlZmluZSBnbERyYXdNZXNoQXJyYXlzU1VOCQlNQU5HTEUoRHJhd01lc2hBcnJheXNTVU4pCisjZGVmaW5lIGdsRHJhd1BpeGVscwkJTUFOR0xFKERyYXdQaXhlbHMpCisjZGVmaW5lIGdsRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUJCU1BTkdMRShEcmF3UmFuZ2VFbGVtZW50QXJyYXlBUFBMRSkKKyNkZWZpbmUgZ2xEcmF3UmFuZ2VFbGVtZW50QXJyYXlBVEkJCU1BTkdMRShEcmF3UmFuZ2VFbGVtZW50QXJyYXlBVEkpCisjZGVmaW5lIGdsRHJhd1JhbmdlRWxlbWVudHNFWFQJCU1BTkdMRShEcmF3UmFuZ2VFbGVtZW50c0VYVCkKKyNkZWZpbmUgZ2xEcmF3UmFuZ2VFbGVtZW50cwkJTUFOR0xFKERyYXdSYW5nZUVsZW1lbnRzKQorI2RlZmluZSBnbEVkZ2VGbGFnCQlNQU5HTEUoRWRnZUZsYWcpCisjZGVmaW5lIGdsRWRnZUZsYWdQb2ludGVyRVhUCQlNQU5HTEUoRWRnZUZsYWdQb2ludGVyRVhUKQorI2RlZmluZSBnbEVkZ2VGbGFnUG9pbnRlckxpc3RJQk0JCU1BTkdMRShFZGdlRmxhZ1BvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbEVkZ2VGbGFnUG9pbnRlcgkJTUFOR0xFKEVkZ2VGbGFnUG9pbnRlcikKKyNkZWZpbmUgZ2xFZGdlRmxhZ3YJCU1BTkdMRShFZGdlRmxhZ3YpCisjZGVmaW5lIGdsRWxlbWVudFBvaW50ZXJBUFBMRQkJTUFOR0xFKEVsZW1lbnRQb2ludGVyQVBQTEUpCisjZGVmaW5lIGdsRWxlbWVudFBvaW50ZXJBVEkJCU1BTkdMRShFbGVtZW50UG9pbnRlckFUSSkKKyNkZWZpbmUgZ2xFbmFibGVDbGllbnRTdGF0ZQkJTUFOR0xFKEVuYWJsZUNsaWVudFN0YXRlKQorI2RlZmluZSBnbEVuYWJsZUluZGV4ZWRFWFQJCU1BTkdMRShFbmFibGVJbmRleGVkRVhUKQorI2RlZmluZSBnbEVuYWJsZQkJTUFOR0xFKEVuYWJsZSkKKyNkZWZpbmUgZ2xFbmFibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQJCU1BTkdMRShFbmFibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQpCisjZGVmaW5lIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXlBUkIJCU1BTkdMRShFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheUFSQikKKyNkZWZpbmUgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheQkJTUFOR0xFKEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KQorI2RlZmluZSBnbEVuZEZyYWdtZW50U2hhZGVyQVRJCQlNQU5HTEUoRW5kRnJhZ21lbnRTaGFkZXJBVEkpCisjZGVmaW5lIGdsRW5kTGlzdAkJTUFOR0xFKEVuZExpc3QpCisjZGVmaW5lIGdsRW5kCQlNQU5HTEUoRW5kKQorI2RlZmluZSBnbEVuZE9jY2x1c2lvblF1ZXJ5TlYJCU1BTkdMRShFbmRPY2NsdXNpb25RdWVyeU5WKQorI2RlZmluZSBnbEVuZFF1ZXJ5QVJCCQlNQU5HTEUoRW5kUXVlcnlBUkIpCisjZGVmaW5lIGdsRW5kUXVlcnkJCU1BTkdMRShFbmRRdWVyeSkKKyNkZWZpbmUgZ2xFbmRUcmFuc2Zvcm1GZWVkYmFja05WCQlNQU5HTEUoRW5kVHJhbnNmb3JtRmVlZGJhY2tOVikKKyNkZWZpbmUgZ2xFbmRWZXJ0ZXhTaGFkZXJFWFQJCU1BTkdMRShFbmRWZXJ0ZXhTaGFkZXJFWFQpCisjZGVmaW5lIGdsRXZhbENvb3JkMWQJCU1BTkdMRShFdmFsQ29vcmQxZCkKKyNkZWZpbmUgZ2xFdmFsQ29vcmQxZHYJCU1BTkdMRShFdmFsQ29vcmQxZHYpCisjZGVmaW5lIGdsRXZhbENvb3JkMWYJCU1BTkdMRShFdmFsQ29vcmQxZikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQxZnYJCU1BTkdMRShFdmFsQ29vcmQxZnYpCisjZGVmaW5lIGdsRXZhbENvb3JkMmQJCU1BTkdMRShFdmFsQ29vcmQyZCkKKyNkZWZpbmUgZ2xFdmFsQ29vcmQyZHYJCU1BTkdMRShFdmFsQ29vcmQyZHYpCisjZGVmaW5lIGdsRXZhbENvb3JkMmYJCU1BTkdMRShFdmFsQ29vcmQyZikKKyNkZWZpbmUgZ2xFdmFsQ29vcmQyZnYJCU1BTkdMRShFdmFsQ29vcmQyZnYpCisjZGVmaW5lIGdsRXZhbE1hcHNOVgkJTUFOR0xFKEV2YWxNYXBzTlYpCisjZGVmaW5lIGdsRXZhbE1lc2gxCQlNQU5HTEUoRXZhbE1lc2gxKQorI2RlZmluZSBnbEV2YWxNZXNoMgkJTUFOR0xFKEV2YWxNZXNoMikKKyNkZWZpbmUgZ2xFdmFsUG9pbnQxCQlNQU5HTEUoRXZhbFBvaW50MSkKKyNkZWZpbmUgZ2xFdmFsUG9pbnQyCQlNQU5HTEUoRXZhbFBvaW50MikKKyNkZWZpbmUgZ2xFeGVjdXRlUHJvZ3JhbU5WCQlNQU5HTEUoRXhlY3V0ZVByb2dyYW1OVikKKyNkZWZpbmUgZ2xFeHRyYWN0Q29tcG9uZW50RVhUCQlNQU5HTEUoRXh0cmFjdENvbXBvbmVudEVYVCkKKyNkZWZpbmUgZ2xGZWVkYmFja0J1ZmZlcgkJTUFOR0xFKEZlZWRiYWNrQnVmZmVyKQorI2RlZmluZSBnbEZpbmFsQ29tYmluZXJJbnB1dE5WCQlNQU5HTEUoRmluYWxDb21iaW5lcklucHV0TlYpCisjZGVmaW5lIGdsRmluaXNoQXN5bmNTR0lYCQlNQU5HTEUoRmluaXNoQXN5bmNTR0lYKQorI2RlZmluZSBnbEZpbmlzaEZlbmNlQVBQTEUJCU1BTkdMRShGaW5pc2hGZW5jZUFQUExFKQorI2RlZmluZSBnbEZpbmlzaEZlbmNlTlYJCU1BTkdMRShGaW5pc2hGZW5jZU5WKQorI2RlZmluZSBnbEZpbmlzaAkJTUFOR0xFKEZpbmlzaCkKKyNkZWZpbmUgZ2xGaW5pc2hPYmplY3RBUFBMRQkJTUFOR0xFKEZpbmlzaE9iamVjdEFQUExFKQorI2RlZmluZSBnbEZpbmlzaFRleHR1cmVTVU5YCQlNQU5HTEUoRmluaXNoVGV4dHVyZVNVTlgpCisjZGVmaW5lIGdsRmx1c2gJCU1BTkdMRShGbHVzaCkKKyNkZWZpbmUgZ2xGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlQVBQTEUJCU1BTkdMRShGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlQVBQTEUpCisjZGVmaW5lIGdsRmx1c2hQaXhlbERhdGFSYW5nZU5WCQlNQU5HTEUoRmx1c2hQaXhlbERhdGFSYW5nZU5WKQorI2RlZmluZSBnbEZsdXNoUmFzdGVyU0dJWAkJTUFOR0xFKEZsdXNoUmFzdGVyU0dJWCkKKyNkZWZpbmUgZ2xGbHVzaFZlcnRleEFycmF5UmFuZ2VBUFBMRQkJTUFOR0xFKEZsdXNoVmVydGV4QXJyYXlSYW5nZUFQUExFKQorI2RlZmluZSBnbEZsdXNoVmVydGV4QXJyYXlSYW5nZU5WCQlNQU5HTEUoRmx1c2hWZXJ0ZXhBcnJheVJhbmdlTlYpCisjZGVmaW5lIGdsRm9nQ29vcmRkRVhUCQlNQU5HTEUoRm9nQ29vcmRkRVhUKQorI2RlZmluZSBnbEZvZ0Nvb3JkZAkJTUFOR0xFKEZvZ0Nvb3JkZCkKKyNkZWZpbmUgZ2xGb2dDb29yZGR2RVhUCQlNQU5HTEUoRm9nQ29vcmRkdkVYVCkKKyNkZWZpbmUgZ2xGb2dDb29yZGR2CQlNQU5HTEUoRm9nQ29vcmRkdikKKyNkZWZpbmUgZ2xGb2dDb29yZGZFWFQJCU1BTkdMRShGb2dDb29yZGZFWFQpCisjZGVmaW5lIGdsRm9nQ29vcmRmCQlNQU5HTEUoRm9nQ29vcmRmKQorI2RlZmluZSBnbEZvZ0Nvb3JkZnZFWFQJCU1BTkdMRShGb2dDb29yZGZ2RVhUKQorI2RlZmluZSBnbEZvZ0Nvb3JkZnYJCU1BTkdMRShGb2dDb29yZGZ2KQorI2RlZmluZSBnbEZvZ0Nvb3JkaE5WCQlNQU5HTEUoRm9nQ29vcmRoTlYpCisjZGVmaW5lIGdsRm9nQ29vcmRodk5WCQlNQU5HTEUoRm9nQ29vcmRodk5WKQorI2RlZmluZSBnbEZvZ0Nvb3JkUG9pbnRlckVYVAkJTUFOR0xFKEZvZ0Nvb3JkUG9pbnRlckVYVCkKKyNkZWZpbmUgZ2xGb2dDb29yZFBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoRm9nQ29vcmRQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xGb2dDb29yZFBvaW50ZXIJCU1BTkdMRShGb2dDb29yZFBvaW50ZXIpCisjZGVmaW5lIGdsRm9nZgkJTUFOR0xFKEZvZ2YpCisjZGVmaW5lIGdsRm9nRnVuY1NHSVMJCU1BTkdMRShGb2dGdW5jU0dJUykKKyNkZWZpbmUgZ2xGb2dmdgkJTUFOR0xFKEZvZ2Z2KQorI2RlZmluZSBnbEZvZ2kJCU1BTkdMRShGb2dpKQorI2RlZmluZSBnbEZvZ2l2CQlNQU5HTEUoRm9naXYpCisjZGVmaW5lIGdsRnJhZ21lbnRDb2xvck1hdGVyaWFsU0dJWAkJTUFOR0xFKEZyYWdtZW50Q29sb3JNYXRlcmlhbFNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRMaWdodGZTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodGZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRmdlNHSVgJCU1BTkdMRShGcmFnbWVudExpZ2h0ZnZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRpU0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRpU0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0aXZTR0lYCQlNQU5HTEUoRnJhZ21lbnRMaWdodGl2U0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0TW9kZWxmU0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRNb2RlbGZTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRNb2RlbGZ2U0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRNb2RlbGZ2U0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudExpZ2h0TW9kZWxpU0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRNb2RlbGlTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TGlnaHRNb2RlbGl2U0dJWAkJTUFOR0xFKEZyYWdtZW50TGlnaHRNb2RlbGl2U0dJWCkKKyNkZWZpbmUgZ2xGcmFnbWVudE1hdGVyaWFsZlNHSVgJCU1BTkdMRShGcmFnbWVudE1hdGVyaWFsZlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRNYXRlcmlhbGZ2U0dJWAkJTUFOR0xFKEZyYWdtZW50TWF0ZXJpYWxmdlNHSVgpCisjZGVmaW5lIGdsRnJhZ21lbnRNYXRlcmlhbGlTR0lYCQlNQU5HTEUoRnJhZ21lbnRNYXRlcmlhbGlTR0lYKQorI2RlZmluZSBnbEZyYWdtZW50TWF0ZXJpYWxpdlNHSVgJCU1BTkdMRShGcmFnbWVudE1hdGVyaWFsaXZTR0lYKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlMURFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmUxREVYVCkKKyNkZWZpbmUgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVAkJTUFOR0xFKEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlM0RFWFQpCisjZGVmaW5lIGdsRnJhbWVidWZmZXJUZXh0dXJlRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQJCU1BTkdMRShGcmFtZWJ1ZmZlclRleHR1cmVGYWNlRVhUKQorI2RlZmluZSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUCQlNQU5HTEUoRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXJFWFQpCisjZGVmaW5lIGdsRnJhbWVab29tU0dJWAkJTUFOR0xFKEZyYW1lWm9vbVNHSVgpCisjZGVmaW5lIGdsRnJlZU9iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKEZyZWVPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsRnJvbnRGYWNlCQlNQU5HTEUoRnJvbnRGYWNlKQorI2RlZmluZSBnbEZydXN0dW0JCU1BTkdMRShGcnVzdHVtKQorI2RlZmluZSBnbEdlbkFzeW5jTWFya2Vyc1NHSVgJCU1BTkdMRShHZW5Bc3luY01hcmtlcnNTR0lYKQorI2RlZmluZSBnbEdlbkJ1ZmZlcnNBUkIJCU1BTkdMRShHZW5CdWZmZXJzQVJCKQorI2RlZmluZSBnbEdlbkJ1ZmZlcnMJCU1BTkdMRShHZW5CdWZmZXJzKQorI2RlZmluZSBnbEdlbmVyYXRlTWlwbWFwRVhUCQlNQU5HTEUoR2VuZXJhdGVNaXBtYXBFWFQpCisjZGVmaW5lIGdsR2VuRmVuY2VzQVBQTEUJCU1BTkdMRShHZW5GZW5jZXNBUFBMRSkKKyNkZWZpbmUgZ2xHZW5GZW5jZXNOVgkJTUFOR0xFKEdlbkZlbmNlc05WKQorI2RlZmluZSBnbEdlbkZyYWdtZW50U2hhZGVyc0FUSQkJTUFOR0xFKEdlbkZyYWdtZW50U2hhZGVyc0FUSSkKKyNkZWZpbmUgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQJCU1BTkdMRShHZW5GcmFtZWJ1ZmZlcnNFWFQpCisjZGVmaW5lIGdsR2VuTGlzdHMJCU1BTkdMRShHZW5MaXN0cykKKyNkZWZpbmUgZ2xHZW5PY2NsdXNpb25RdWVyaWVzTlYJCU1BTkdMRShHZW5PY2NsdXNpb25RdWVyaWVzTlYpCisjZGVmaW5lIGdsR2VuUHJvZ3JhbXNBUkIJCU1BTkdMRShHZW5Qcm9ncmFtc0FSQikKKyNkZWZpbmUgZ2xHZW5Qcm9ncmFtc05WCQlNQU5HTEUoR2VuUHJvZ3JhbXNOVikKKyNkZWZpbmUgZ2xHZW5RdWVyaWVzQVJCCQlNQU5HTEUoR2VuUXVlcmllc0FSQikKKyNkZWZpbmUgZ2xHZW5RdWVyaWVzCQlNQU5HTEUoR2VuUXVlcmllcykKKyNkZWZpbmUgZ2xHZW5SZW5kZXJidWZmZXJzRVhUCQlNQU5HTEUoR2VuUmVuZGVyYnVmZmVyc0VYVCkKKyNkZWZpbmUgZ2xHZW5TeW1ib2xzRVhUCQlNQU5HTEUoR2VuU3ltYm9sc0VYVCkKKyNkZWZpbmUgZ2xHZW5UZXh0dXJlc0VYVAkJTUFOR0xFKEdlblRleHR1cmVzRVhUKQorI2RlZmluZSBnbEdlblRleHR1cmVzCQlNQU5HTEUoR2VuVGV4dHVyZXMpCisjZGVmaW5lIGdsR2VuVmVydGV4QXJyYXlzQVBQTEUJCU1BTkdMRShHZW5WZXJ0ZXhBcnJheXNBUFBMRSkKKyNkZWZpbmUgZ2xHZW5WZXJ0ZXhTaGFkZXJzRVhUCQlNQU5HTEUoR2VuVmVydGV4U2hhZGVyc0VYVCkKKyNkZWZpbmUgZ2xHZXRBY3RpdmVBdHRyaWJBUkIJCU1BTkdMRShHZXRBY3RpdmVBdHRyaWJBUkIpCisjZGVmaW5lIGdsR2V0QWN0aXZlQXR0cmliCQlNQU5HTEUoR2V0QWN0aXZlQXR0cmliKQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm1BUkIJCU1BTkdMRShHZXRBY3RpdmVVbmlmb3JtQVJCKQorI2RlZmluZSBnbEdldEFjdGl2ZVVuaWZvcm0JCU1BTkdMRShHZXRBY3RpdmVVbmlmb3JtKQorI2RlZmluZSBnbEdldEFjdGl2ZVZhcnlpbmdOVgkJTUFOR0xFKEdldEFjdGl2ZVZhcnlpbmdOVikKKyNkZWZpbmUgZ2xHZXRBcnJheU9iamVjdGZ2QVRJCQlNQU5HTEUoR2V0QXJyYXlPYmplY3RmdkFUSSkKKyNkZWZpbmUgZ2xHZXRBcnJheU9iamVjdGl2QVRJCQlNQU5HTEUoR2V0QXJyYXlPYmplY3RpdkFUSSkKKyNkZWZpbmUgZ2xHZXRBdHRhY2hlZE9iamVjdHNBUkIJCU1BTkdMRShHZXRBdHRhY2hlZE9iamVjdHNBUkIpCisjZGVmaW5lIGdsR2V0QXR0YWNoZWRTaGFkZXJzCQlNQU5HTEUoR2V0QXR0YWNoZWRTaGFkZXJzKQorI2RlZmluZSBnbEdldEF0dHJpYkxvY2F0aW9uQVJCCQlNQU5HTEUoR2V0QXR0cmliTG9jYXRpb25BUkIpCisjZGVmaW5lIGdsR2V0QXR0cmliTG9jYXRpb24JCU1BTkdMRShHZXRBdHRyaWJMb2NhdGlvbikKKyNkZWZpbmUgZ2xHZXRCb29sZWFuSW5kZXhlZHZFWFQJCU1BTkdMRShHZXRCb29sZWFuSW5kZXhlZHZFWFQpCisjZGVmaW5lIGdsR2V0Qm9vbGVhbnYJCU1BTkdMRShHZXRCb29sZWFudikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQgkJTUFOR0xFKEdldEJ1ZmZlclBhcmFtZXRlcml2QVJCKQorI2RlZmluZSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2CQlNQU5HTEUoR2V0QnVmZmVyUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0QnVmZmVyUG9pbnRlcnZBUkIJCU1BTkdMRShHZXRCdWZmZXJQb2ludGVydkFSQikKKyNkZWZpbmUgZ2xHZXRCdWZmZXJQb2ludGVydgkJTUFOR0xFKEdldEJ1ZmZlclBvaW50ZXJ2KQorI2RlZmluZSBnbEdldEJ1ZmZlclN1YkRhdGFBUkIJCU1BTkdMRShHZXRCdWZmZXJTdWJEYXRhQVJCKQorI2RlZmluZSBnbEdldEJ1ZmZlclN1YkRhdGEJCU1BTkdMRShHZXRCdWZmZXJTdWJEYXRhKQorI2RlZmluZSBnbEdldENsaXBQbGFuZQkJTUFOR0xFKEdldENsaXBQbGFuZSkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlRVhUCQlNQU5HTEUoR2V0Q29sb3JUYWJsZUVYVCkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlCQlNQU5HTEUoR2V0Q29sb3JUYWJsZSkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSQkJTUFOR0xFKEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSSkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQpCisjZGVmaW5lIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2CQlNQU5HTEUoR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSQkJTUFOR0xFKEdldENvbG9yVGFibGVQYXJhbWV0ZXJpdlNHSSkKKyNkZWZpbmUgZ2xHZXRDb2xvclRhYmxlU0dJCQlNQU5HTEUoR2V0Q29sb3JUYWJsZVNHSSkKKyNkZWZpbmUgZ2xHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOVgkJTUFOR0xFKEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0Q29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0Q29tYmluZXJPdXRwdXRQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldENvbWJpbmVyT3V0cHV0UGFyYW1ldGVyaXZOVgkJTUFOR0xFKEdldENvbWJpbmVyT3V0cHV0UGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOVgkJTUFOR0xFKEdldENvbWJpbmVyU3RhZ2VQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldENvbXByZXNzZWRUZXhJbWFnZUFSQgkJTUFOR0xFKEdldENvbXByZXNzZWRUZXhJbWFnZUFSQikKKyNkZWZpbmUgZ2xHZXRDb21wcmVzc2VkVGV4SW1hZ2UJCU1BTkdMRShHZXRDb21wcmVzc2VkVGV4SW1hZ2UpCisjZGVmaW5lIGdsR2V0Q29udm9sdXRpb25GaWx0ZXJFWFQJCU1BTkdMRShHZXRDb252b2x1dGlvbkZpbHRlckVYVCkKKyNkZWZpbmUgZ2xHZXRDb252b2x1dGlvbkZpbHRlcgkJTUFOR0xFKEdldENvbnZvbHV0aW9uRmlsdGVyKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldENvbnZvbHV0aW9uUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRDb252b2x1dGlvblBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldERlYnVnTG9nTGVuZ3RoTUVTQQkJTUFOR0xFKEdldERlYnVnTG9nTGVuZ3RoTUVTQSkKKyNkZWZpbmUgZ2xHZXREZWJ1Z0xvZ01FU0EJCU1BTkdMRShHZXREZWJ1Z0xvZ01FU0EpCisjZGVmaW5lIGdsR2V0RGV0YWlsVGV4RnVuY1NHSVMJCU1BTkdMRShHZXREZXRhaWxUZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXREb3VibGV2CQlNQU5HTEUoR2V0RG91YmxldikKKyNkZWZpbmUgZ2xHZXRFcnJvcgkJTUFOR0xFKEdldEVycm9yKQorI2RlZmluZSBnbEdldEZlbmNlaXZOVgkJTUFOR0xFKEdldEZlbmNlaXZOVikKKyNkZWZpbmUgZ2xHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0RmluYWxDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRGaW5hbENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0RmluYWxDb21iaW5lcklucHV0UGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRGbG9hdHYJCU1BTkdMRShHZXRGbG9hdHYpCisjZGVmaW5lIGdsR2V0Rm9nRnVuY1NHSVMJCU1BTkdMRShHZXRGb2dGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXRGcmFnRGF0YUxvY2F0aW9uRVhUCQlNQU5HTEUoR2V0RnJhZ0RhdGFMb2NhdGlvbkVYVCkKKyNkZWZpbmUgZ2xHZXRGcmFnbWVudExpZ2h0ZnZTR0lYCQlNQU5HTEUoR2V0RnJhZ21lbnRMaWdodGZ2U0dJWCkKKyNkZWZpbmUgZ2xHZXRGcmFnbWVudExpZ2h0aXZTR0lYCQlNQU5HTEUoR2V0RnJhZ21lbnRMaWdodGl2U0dJWCkKKyNkZWZpbmUgZ2xHZXRGcmFnbWVudE1hdGVyaWFsZnZTR0lYCQlNQU5HTEUoR2V0RnJhZ21lbnRNYXRlcmlhbGZ2U0dJWCkKKyNkZWZpbmUgZ2xHZXRGcmFnbWVudE1hdGVyaWFsaXZTR0lYCQlNQU5HTEUoR2V0RnJhZ21lbnRNYXRlcmlhbGl2U0dJWCkKKyNkZWZpbmUgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldEhhbmRsZUFSQgkJTUFOR0xFKEdldEhhbmRsZUFSQikKKyNkZWZpbmUgZ2xHZXRIaXN0b2dyYW1FWFQJCU1BTkdMRShHZXRIaXN0b2dyYW1FWFQpCisjZGVmaW5lIGdsR2V0SGlzdG9ncmFtCQlNQU5HTEUoR2V0SGlzdG9ncmFtKQorI2RlZmluZSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRIaXN0b2dyYW1QYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2CQlNQU5HTEUoR2V0SGlzdG9ncmFtUGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQCQlNQU5HTEUoR2V0SW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQKQorI2RlZmluZSBnbEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUAkJTUFOR0xFKEdldEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaXZIUCkKKyNkZWZpbmUgZ2xHZXRJbmZvTG9nQVJCCQlNQU5HTEUoR2V0SW5mb0xvZ0FSQikKKyNkZWZpbmUgZ2xHZXRJbnN0cnVtZW50c1NHSVgJCU1BTkdMRShHZXRJbnN0cnVtZW50c1NHSVgpCisjZGVmaW5lIGdsR2V0SW50ZWdlckluZGV4ZWR2RVhUCQlNQU5HTEUoR2V0SW50ZWdlckluZGV4ZWR2RVhUKQorI2RlZmluZSBnbEdldEludGVnZXJ2CQlNQU5HTEUoR2V0SW50ZWdlcnYpCisjZGVmaW5lIGdsR2V0SW52YXJpYW50Qm9vbGVhbnZFWFQJCU1BTkdMRShHZXRJbnZhcmlhbnRCb29sZWFudkVYVCkKKyNkZWZpbmUgZ2xHZXRJbnZhcmlhbnRGbG9hdHZFWFQJCU1BTkdMRShHZXRJbnZhcmlhbnRGbG9hdHZFWFQpCisjZGVmaW5lIGdsR2V0SW52YXJpYW50SW50ZWdlcnZFWFQJCU1BTkdMRShHZXRJbnZhcmlhbnRJbnRlZ2VydkVYVCkKKyNkZWZpbmUgZ2xHZXRMaWdodGZ2CQlNQU5HTEUoR2V0TGlnaHRmdikKKyNkZWZpbmUgZ2xHZXRMaWdodGl2CQlNQU5HTEUoR2V0TGlnaHRpdikKKyNkZWZpbmUgZ2xHZXRMaXN0UGFyYW1ldGVyZnZTR0lYCQlNQU5HTEUoR2V0TGlzdFBhcmFtZXRlcmZ2U0dJWCkKKyNkZWZpbmUgZ2xHZXRMaXN0UGFyYW1ldGVyaXZTR0lYCQlNQU5HTEUoR2V0TGlzdFBhcmFtZXRlcml2U0dJWCkKKyNkZWZpbmUgZ2xHZXRMb2NhbENvbnN0YW50Qm9vbGVhbnZFWFQJCU1BTkdMRShHZXRMb2NhbENvbnN0YW50Qm9vbGVhbnZFWFQpCisjZGVmaW5lIGdsR2V0TG9jYWxDb25zdGFudEZsb2F0dkVYVAkJTUFOR0xFKEdldExvY2FsQ29uc3RhbnRGbG9hdHZFWFQpCisjZGVmaW5lIGdsR2V0TG9jYWxDb25zdGFudEludGVnZXJ2RVhUCQlNQU5HTEUoR2V0TG9jYWxDb25zdGFudEludGVnZXJ2RVhUKQorI2RlZmluZSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcmZ2TlYJCU1BTkdMRShHZXRNYXBBdHRyaWJQYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldE1hcEF0dHJpYlBhcmFtZXRlcml2TlYJCU1BTkdMRShHZXRNYXBBdHRyaWJQYXJhbWV0ZXJpdk5WKQorI2RlZmluZSBnbEdldE1hcENvbnRyb2xQb2ludHNOVgkJTUFOR0xFKEdldE1hcENvbnRyb2xQb2ludHNOVikKKyNkZWZpbmUgZ2xHZXRNYXBkdgkJTUFOR0xFKEdldE1hcGR2KQorI2RlZmluZSBnbEdldE1hcGZ2CQlNQU5HTEUoR2V0TWFwZnYpCisjZGVmaW5lIGdsR2V0TWFwaXYJCU1BTkdMRShHZXRNYXBpdikKKyNkZWZpbmUgZ2xHZXRNYXBQYXJhbWV0ZXJmdk5WCQlNQU5HTEUoR2V0TWFwUGFyYW1ldGVyZnZOVikKKyNkZWZpbmUgZ2xHZXRNYXBQYXJhbWV0ZXJpdk5WCQlNQU5HTEUoR2V0TWFwUGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xHZXRNYXRlcmlhbGZ2CQlNQU5HTEUoR2V0TWF0ZXJpYWxmdikKKyNkZWZpbmUgZ2xHZXRNYXRlcmlhbGl2CQlNQU5HTEUoR2V0TWF0ZXJpYWxpdikKKyNkZWZpbmUgZ2xHZXRNaW5tYXhFWFQJCU1BTkdMRShHZXRNaW5tYXhFWFQpCisjZGVmaW5lIGdsR2V0TWlubWF4CQlNQU5HTEUoR2V0TWlubWF4KQorI2RlZmluZSBnbEdldE1pbm1heFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoR2V0TWlubWF4UGFyYW1ldGVyZnZFWFQpCisjZGVmaW5lIGdsR2V0TWlubWF4UGFyYW1ldGVyZnYJCU1BTkdMRShHZXRNaW5tYXhQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldE1pbm1heFBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldE1pbm1heFBhcmFtZXRlcml2CQlNQU5HTEUoR2V0TWlubWF4UGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0T2JqZWN0QnVmZmVyZnZBVEkJCU1BTkdMRShHZXRPYmplY3RCdWZmZXJmdkFUSSkKKyNkZWZpbmUgZ2xHZXRPYmplY3RCdWZmZXJpdkFUSQkJTUFOR0xFKEdldE9iamVjdEJ1ZmZlcml2QVRJKQorI2RlZmluZSBnbEdldE9iamVjdFBhcmFtZXRlcmZ2QVJCCQlNQU5HTEUoR2V0T2JqZWN0UGFyYW1ldGVyZnZBUkIpCisjZGVmaW5lIGdsR2V0T2JqZWN0UGFyYW1ldGVyaXZBUkIJCU1BTkdMRShHZXRPYmplY3RQYXJhbWV0ZXJpdkFSQikKKyNkZWZpbmUgZ2xHZXRPY2NsdXNpb25RdWVyeWl2TlYJCU1BTkdMRShHZXRPY2NsdXNpb25RdWVyeWl2TlYpCisjZGVmaW5lIGdsR2V0T2NjbHVzaW9uUXVlcnl1aXZOVgkJTUFOR0xFKEdldE9jY2x1c2lvblF1ZXJ5dWl2TlYpCisjZGVmaW5lIGdsR2V0UGl4ZWxNYXBmdgkJTUFOR0xFKEdldFBpeGVsTWFwZnYpCisjZGVmaW5lIGdsR2V0UGl4ZWxNYXB1aXYJCU1BTkdMRShHZXRQaXhlbE1hcHVpdikKKyNkZWZpbmUgZ2xHZXRQaXhlbE1hcHVzdgkJTUFOR0xFKEdldFBpeGVsTWFwdXN2KQorI2RlZmluZSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTCQlNQU5HTEUoR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMpCisjZGVmaW5lIGdsR2V0UGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMJCU1BTkdMRShHZXRQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUykKKyNkZWZpbmUgZ2xHZXRQb2ludGVydkVYVAkJTUFOR0xFKEdldFBvaW50ZXJ2RVhUKQorI2RlZmluZSBnbEdldFBvaW50ZXJ2CQlNQU5HTEUoR2V0UG9pbnRlcnYpCisjZGVmaW5lIGdsR2V0UG9seWdvblN0aXBwbGUJCU1BTkdMRShHZXRQb2x5Z29uU3RpcHBsZSkKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVyZHZBUkIJCU1BTkdMRShHZXRQcm9ncmFtRW52UGFyYW1ldGVyZHZBUkIpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmZ2QVJCCQlNQU5HTEUoR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmZ2QVJCKQorI2RlZmluZSBnbEdldFByb2dyYW1FbnZQYXJhbWV0ZXJJaXZOVgkJTUFOR0xFKEdldFByb2dyYW1FbnZQYXJhbWV0ZXJJaXZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVySXVpdk5WCQlNQU5HTEUoR2V0UHJvZ3JhbUVudlBhcmFtZXRlckl1aXZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtSW5mb0xvZwkJTUFOR0xFKEdldFByb2dyYW1JbmZvTG9nKQorI2RlZmluZSBnbEdldFByb2dyYW1pdkFSQgkJTUFOR0xFKEdldFByb2dyYW1pdkFSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtaXYJCU1BTkdMRShHZXRQcm9ncmFtaXYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbWl2TlYJCU1BTkdMRShHZXRQcm9ncmFtaXZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJkdkFSQgkJTUFOR0xFKEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmR2QVJCKQorI2RlZmluZSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2QVJCCQlNQU5HTEUoR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVyZnZBUkIpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbUxvY2FsUGFyYW1ldGVySWl2TlYJCU1BTkdMRShHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJaXZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJdWl2TlYJCU1BTkdMRShHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJdWl2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZHZOVgkJTUFOR0xFKEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmR2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZnZOVgkJTUFOR0xFKEdldFByb2dyYW1OYW1lZFBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsR2V0UHJvZ3JhbVBhcmFtZXRlcmR2TlYJCU1BTkdMRShHZXRQcm9ncmFtUGFyYW1ldGVyZHZOVikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtUGFyYW1ldGVyZnZOVgkJTUFOR0xFKEdldFByb2dyYW1QYXJhbWV0ZXJmdk5WKQorI2RlZmluZSBnbEdldFByb2dyYW1SZWdpc3RlcmZ2TUVTQQkJTUFOR0xFKEdldFByb2dyYW1SZWdpc3RlcmZ2TUVTQSkKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtU3RyaW5nQVJCCQlNQU5HTEUoR2V0UHJvZ3JhbVN0cmluZ0FSQikKKyNkZWZpbmUgZ2xHZXRQcm9ncmFtU3RyaW5nTlYJCU1BTkdMRShHZXRQcm9ncmFtU3RyaW5nTlYpCisjZGVmaW5lIGdsR2V0UXVlcnlpdkFSQgkJTUFOR0xFKEdldFF1ZXJ5aXZBUkIpCisjZGVmaW5lIGdsR2V0UXVlcnlpdgkJTUFOR0xFKEdldFF1ZXJ5aXYpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3RpNjR2RVhUCQlNQU5HTEUoR2V0UXVlcnlPYmplY3RpNjR2RVhUKQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0aXZBUkIJCU1BTkdMRShHZXRRdWVyeU9iamVjdGl2QVJCKQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0aXYJCU1BTkdMRShHZXRRdWVyeU9iamVjdGl2KQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0dWk2NHZFWFQJCU1BTkdMRShHZXRRdWVyeU9iamVjdHVpNjR2RVhUKQorI2RlZmluZSBnbEdldFF1ZXJ5T2JqZWN0dWl2QVJCCQlNQU5HTEUoR2V0UXVlcnlPYmplY3R1aXZBUkIpCisjZGVmaW5lIGdsR2V0UXVlcnlPYmplY3R1aXYJCU1BTkdMRShHZXRRdWVyeU9iamVjdHVpdikKKyNkZWZpbmUgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVAkJTUFOR0xFKEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKQorI2RlZmluZSBnbEdldFNlcGFyYWJsZUZpbHRlckVYVAkJTUFOR0xFKEdldFNlcGFyYWJsZUZpbHRlckVYVCkKKyNkZWZpbmUgZ2xHZXRTZXBhcmFibGVGaWx0ZXIJCU1BTkdMRShHZXRTZXBhcmFibGVGaWx0ZXIpCisjZGVmaW5lIGdsR2V0U2hhZGVySW5mb0xvZwkJTUFOR0xFKEdldFNoYWRlckluZm9Mb2cpCisjZGVmaW5lIGdsR2V0U2hhZGVyaXYJCU1BTkdMRShHZXRTaGFkZXJpdikKKyNkZWZpbmUgZ2xHZXRTaGFkZXJTb3VyY2VBUkIJCU1BTkdMRShHZXRTaGFkZXJTb3VyY2VBUkIpCisjZGVmaW5lIGdsR2V0U2hhZGVyU291cmNlCQlNQU5HTEUoR2V0U2hhZGVyU291cmNlKQorI2RlZmluZSBnbEdldFNoYXJwZW5UZXhGdW5jU0dJUwkJTUFOR0xFKEdldFNoYXJwZW5UZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXRTdHJpbmcJCU1BTkdMRShHZXRTdHJpbmcpCisjZGVmaW5lIGdsR2V0VGV4QnVtcFBhcmFtZXRlcmZ2QVRJCQlNQU5HTEUoR2V0VGV4QnVtcFBhcmFtZXRlcmZ2QVRJKQorI2RlZmluZSBnbEdldFRleEJ1bXBQYXJhbWV0ZXJpdkFUSQkJTUFOR0xFKEdldFRleEJ1bXBQYXJhbWV0ZXJpdkFUSSkKKyNkZWZpbmUgZ2xHZXRUZXhFbnZmdgkJTUFOR0xFKEdldFRleEVudmZ2KQorI2RlZmluZSBnbEdldFRleEVudml2CQlNQU5HTEUoR2V0VGV4RW52aXYpCisjZGVmaW5lIGdsR2V0VGV4RmlsdGVyRnVuY1NHSVMJCU1BTkdMRShHZXRUZXhGaWx0ZXJGdW5jU0dJUykKKyNkZWZpbmUgZ2xHZXRUZXhHZW5kdgkJTUFOR0xFKEdldFRleEdlbmR2KQorI2RlZmluZSBnbEdldFRleEdlbmZ2CQlNQU5HTEUoR2V0VGV4R2VuZnYpCisjZGVmaW5lIGdsR2V0VGV4R2VuaXYJCU1BTkdMRShHZXRUZXhHZW5pdikKKyNkZWZpbmUgZ2xHZXRUZXhJbWFnZQkJTUFOR0xFKEdldFRleEltYWdlKQorI2RlZmluZSBnbEdldFRleExldmVsUGFyYW1ldGVyZnYJCU1BTkdMRShHZXRUZXhMZXZlbFBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbEdldFRleExldmVsUGFyYW1ldGVyaXYJCU1BTkdMRShHZXRUZXhMZXZlbFBhcmFtZXRlcml2KQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlcmZ2CQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVyZnYpCisjZGVmaW5lIGdsR2V0VGV4UGFyYW1ldGVySWl2RVhUCQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVySWl2RVhUKQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlckl1aXZFWFQJCU1BTkdMRShHZXRUZXhQYXJhbWV0ZXJJdWl2RVhUKQorI2RlZmluZSBnbEdldFRleFBhcmFtZXRlcml2CQlNQU5HTEUoR2V0VGV4UGFyYW1ldGVyaXYpCisjZGVmaW5lIGdsR2V0VHJhY2tNYXRyaXhpdk5WCQlNQU5HTEUoR2V0VHJhY2tNYXRyaXhpdk5WKQorI2RlZmluZSBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ05WCQlNQU5HTEUoR2V0VHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nTlYpCisjZGVmaW5lIGdsR2V0VW5pZm9ybUJ1ZmZlclNpemVFWFQJCU1BTkdMRShHZXRVbmlmb3JtQnVmZmVyU2l6ZUVYVCkKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtZnZBUkIJCU1BTkdMRShHZXRVbmlmb3JtZnZBUkIpCisjZGVmaW5lIGdsR2V0VW5pZm9ybWZ2CQlNQU5HTEUoR2V0VW5pZm9ybWZ2KQorI2RlZmluZSBnbEdldFVuaWZvcm1pdkFSQgkJTUFOR0xFKEdldFVuaWZvcm1pdkFSQikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtaXYJCU1BTkdMRShHZXRVbmlmb3JtaXYpCisjZGVmaW5lIGdsR2V0VW5pZm9ybUxvY2F0aW9uQVJCCQlNQU5HTEUoR2V0VW5pZm9ybUxvY2F0aW9uQVJCKQorI2RlZmluZSBnbEdldFVuaWZvcm1Mb2NhdGlvbgkJTUFOR0xFKEdldFVuaWZvcm1Mb2NhdGlvbikKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtT2Zmc2V0RVhUCQlNQU5HTEUoR2V0VW5pZm9ybU9mZnNldEVYVCkKKyNkZWZpbmUgZ2xHZXRVbmlmb3JtdWl2RVhUCQlNQU5HTEUoR2V0VW5pZm9ybXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RmdkFUSQkJTUFOR0xFKEdldFZhcmlhbnRBcnJheU9iamVjdGZ2QVRJKQorI2RlZmluZSBnbEdldFZhcmlhbnRBcnJheU9iamVjdGl2QVRJCQlNQU5HTEUoR2V0VmFyaWFudEFycmF5T2JqZWN0aXZBVEkpCisjZGVmaW5lIGdsR2V0VmFyaWFudEJvb2xlYW52RVhUCQlNQU5HTEUoR2V0VmFyaWFudEJvb2xlYW52RVhUKQorI2RlZmluZSBnbEdldFZhcmlhbnRGbG9hdHZFWFQJCU1BTkdMRShHZXRWYXJpYW50RmxvYXR2RVhUKQorI2RlZmluZSBnbEdldFZhcmlhbnRJbnRlZ2VydkVYVAkJTUFOR0xFKEdldFZhcmlhbnRJbnRlZ2VydkVYVCkKKyNkZWZpbmUgZ2xHZXRWYXJpYW50UG9pbnRlcnZFWFQJCU1BTkdMRShHZXRWYXJpYW50UG9pbnRlcnZFWFQpCisjZGVmaW5lIGdsR2V0VmFyeWluZ0xvY2F0aW9uTlYJCU1BTkdMRShHZXRWYXJ5aW5nTG9jYXRpb25OVikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGZ2QVRJCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliQXJyYXlPYmplY3RmdkFUSSkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGl2QVRJCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliQXJyYXlPYmplY3RpdkFUSSkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJkdkFSQgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmR2QVJCKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYmR2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliZHYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliZHZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmR2TlYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliZnZBUkIJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJmdkFSQikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJmdgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYmZ2KQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYmZ2TlYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJmdk5WKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYklpdkVYVAkJTUFOR0xFKEdldFZlcnRleEF0dHJpYklpdkVYVCkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2RVhUCQlNQU5HTEUoR2V0VmVydGV4QXR0cmliSXVpdkVYVCkKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJpdkFSQgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYml2QVJCKQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYml2CQlNQU5HTEUoR2V0VmVydGV4QXR0cmliaXYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliaXZOVgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYml2TlYpCisjZGVmaW5lIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZBUkIJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydkFSQikKKyNkZWZpbmUgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydgkJTUFOR0xFKEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KQorI2RlZmluZSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2TlYJCU1BTkdMRShHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydk5WKQorI2RlZmluZSBnbEdsb2JhbEFscGhhRmFjdG9yYlNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9yYlNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcmRTVU4JCU1BTkdMRShHbG9iYWxBbHBoYUZhY3RvcmRTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3JmU1VOCQlNQU5HTEUoR2xvYmFsQWxwaGFGYWN0b3JmU1VOKQorI2RlZmluZSBnbEdsb2JhbEFscGhhRmFjdG9yaVNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9yaVNVTikKKyNkZWZpbmUgZ2xHbG9iYWxBbHBoYUZhY3RvcnNTVU4JCU1BTkdMRShHbG9iYWxBbHBoYUZhY3RvcnNTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3J1YlNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9ydWJTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3J1aVNVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9ydWlTVU4pCisjZGVmaW5lIGdsR2xvYmFsQWxwaGFGYWN0b3J1c1NVTgkJTUFOR0xFKEdsb2JhbEFscGhhRmFjdG9ydXNTVU4pCisjZGVmaW5lIGdsSGludAkJTUFOR0xFKEhpbnQpCisjZGVmaW5lIGdsSGludFBHSQkJTUFOR0xFKEhpbnRQR0kpCisjZGVmaW5lIGdsSGlzdG9ncmFtRVhUCQlNQU5HTEUoSGlzdG9ncmFtRVhUKQorI2RlZmluZSBnbEhpc3RvZ3JhbQkJTUFOR0xFKEhpc3RvZ3JhbSkKKyNkZWZpbmUgZ2xJZ2xvb0ludGVyZmFjZVNHSVgJCU1BTkdMRShJZ2xvb0ludGVyZmFjZVNHSVgpCisjZGVmaW5lIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmSFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZIUCkKKyNkZWZpbmUgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFApCisjZGVmaW5lIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpSFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmlIUCkKKyNkZWZpbmUgZ2xJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAJCU1BTkdMRShJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFApCisjZGVmaW5lIGdsSW5kZXhkCQlNQU5HTEUoSW5kZXhkKQorI2RlZmluZSBnbEluZGV4ZHYJCU1BTkdMRShJbmRleGR2KQorI2RlZmluZSBnbEluZGV4ZgkJTUFOR0xFKEluZGV4ZikKKyNkZWZpbmUgZ2xJbmRleEZ1bmNFWFQJCU1BTkdMRShJbmRleEZ1bmNFWFQpCisjZGVmaW5lIGdsSW5kZXhmdgkJTUFOR0xFKEluZGV4ZnYpCisjZGVmaW5lIGdsSW5kZXhpCQlNQU5HTEUoSW5kZXhpKQorI2RlZmluZSBnbEluZGV4aXYJCU1BTkdMRShJbmRleGl2KQorI2RlZmluZSBnbEluZGV4TWFzawkJTUFOR0xFKEluZGV4TWFzaykKKyNkZWZpbmUgZ2xJbmRleE1hdGVyaWFsRVhUCQlNQU5HTEUoSW5kZXhNYXRlcmlhbEVYVCkKKyNkZWZpbmUgZ2xJbmRleFBvaW50ZXJFWFQJCU1BTkdMRShJbmRleFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsSW5kZXhQb2ludGVyTGlzdElCTQkJTUFOR0xFKEluZGV4UG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsSW5kZXhQb2ludGVyCQlNQU5HTEUoSW5kZXhQb2ludGVyKQorI2RlZmluZSBnbEluZGV4cwkJTUFOR0xFKEluZGV4cykKKyNkZWZpbmUgZ2xJbmRleHN2CQlNQU5HTEUoSW5kZXhzdikKKyNkZWZpbmUgZ2xJbmRleHViCQlNQU5HTEUoSW5kZXh1YikKKyNkZWZpbmUgZ2xJbmRleHVidgkJTUFOR0xFKEluZGV4dWJ2KQorI2RlZmluZSBnbEluaXROYW1lcwkJTUFOR0xFKEluaXROYW1lcykKKyNkZWZpbmUgZ2xJbnNlcnRDb21wb25lbnRFWFQJCU1BTkdMRShJbnNlcnRDb21wb25lbnRFWFQpCisjZGVmaW5lIGdsSW5zdHJ1bWVudHNCdWZmZXJTR0lYCQlNQU5HTEUoSW5zdHJ1bWVudHNCdWZmZXJTR0lYKQorI2RlZmluZSBnbEludGVybGVhdmVkQXJyYXlzCQlNQU5HTEUoSW50ZXJsZWF2ZWRBcnJheXMpCisjZGVmaW5lIGdsSXNBc3luY01hcmtlclNHSVgJCU1BTkdMRShJc0FzeW5jTWFya2VyU0dJWCkKKyNkZWZpbmUgZ2xJc0J1ZmZlckFSQgkJTUFOR0xFKElzQnVmZmVyQVJCKQorI2RlZmluZSBnbElzQnVmZmVyCQlNQU5HTEUoSXNCdWZmZXIpCisjZGVmaW5lIGdsSXNFbmFibGVkSW5kZXhlZEVYVAkJTUFOR0xFKElzRW5hYmxlZEluZGV4ZWRFWFQpCisjZGVmaW5lIGdsSXNFbmFibGVkCQlNQU5HTEUoSXNFbmFibGVkKQorI2RlZmluZSBnbElzRmVuY2VBUFBMRQkJTUFOR0xFKElzRmVuY2VBUFBMRSkKKyNkZWZpbmUgZ2xJc0ZlbmNlTlYJCU1BTkdMRShJc0ZlbmNlTlYpCisjZGVmaW5lIGdsSXNGcmFtZWJ1ZmZlckVYVAkJTUFOR0xFKElzRnJhbWVidWZmZXJFWFQpCisjZGVmaW5lIGdsSXNMaXN0CQlNQU5HTEUoSXNMaXN0KQorI2RlZmluZSBnbElzT2JqZWN0QnVmZmVyQVRJCQlNQU5HTEUoSXNPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsSXNPY2NsdXNpb25RdWVyeU5WCQlNQU5HTEUoSXNPY2NsdXNpb25RdWVyeU5WKQorI2RlZmluZSBnbElzUHJvZ3JhbUFSQgkJTUFOR0xFKElzUHJvZ3JhbUFSQikKKyNkZWZpbmUgZ2xJc1Byb2dyYW0JCU1BTkdMRShJc1Byb2dyYW0pCisjZGVmaW5lIGdsSXNQcm9ncmFtTlYJCU1BTkdMRShJc1Byb2dyYW1OVikKKyNkZWZpbmUgZ2xJc1F1ZXJ5QVJCCQlNQU5HTEUoSXNRdWVyeUFSQikKKyNkZWZpbmUgZ2xJc1F1ZXJ5CQlNQU5HTEUoSXNRdWVyeSkKKyNkZWZpbmUgZ2xJc1JlbmRlcmJ1ZmZlckVYVAkJTUFOR0xFKElzUmVuZGVyYnVmZmVyRVhUKQorI2RlZmluZSBnbElzU2hhZGVyCQlNQU5HTEUoSXNTaGFkZXIpCisjZGVmaW5lIGdsSXNUZXh0dXJlRVhUCQlNQU5HTEUoSXNUZXh0dXJlRVhUKQorI2RlZmluZSBnbElzVGV4dHVyZQkJTUFOR0xFKElzVGV4dHVyZSkKKyNkZWZpbmUgZ2xJc1ZhcmlhbnRFbmFibGVkRVhUCQlNQU5HTEUoSXNWYXJpYW50RW5hYmxlZEVYVCkKKyNkZWZpbmUgZ2xJc1ZlcnRleEFycmF5QVBQTEUJCU1BTkdMRShJc1ZlcnRleEFycmF5QVBQTEUpCisjZGVmaW5lIGdsTGlnaHRFbnZpU0dJWAkJTUFOR0xFKExpZ2h0RW52aVNHSVgpCisjZGVmaW5lIGdsTGlnaHRmCQlNQU5HTEUoTGlnaHRmKQorI2RlZmluZSBnbExpZ2h0ZnYJCU1BTkdMRShMaWdodGZ2KQorI2RlZmluZSBnbExpZ2h0aQkJTUFOR0xFKExpZ2h0aSkKKyNkZWZpbmUgZ2xMaWdodGl2CQlNQU5HTEUoTGlnaHRpdikKKyNkZWZpbmUgZ2xMaWdodE1vZGVsZgkJTUFOR0xFKExpZ2h0TW9kZWxmKQorI2RlZmluZSBnbExpZ2h0TW9kZWxmdgkJTUFOR0xFKExpZ2h0TW9kZWxmdikKKyNkZWZpbmUgZ2xMaWdodE1vZGVsaQkJTUFOR0xFKExpZ2h0TW9kZWxpKQorI2RlZmluZSBnbExpZ2h0TW9kZWxpdgkJTUFOR0xFKExpZ2h0TW9kZWxpdikKKyNkZWZpbmUgZ2xMaW5lU3RpcHBsZQkJTUFOR0xFKExpbmVTdGlwcGxlKQorI2RlZmluZSBnbExpbmVXaWR0aAkJTUFOR0xFKExpbmVXaWR0aCkKKyNkZWZpbmUgZ2xMaW5rUHJvZ3JhbUFSQgkJTUFOR0xFKExpbmtQcm9ncmFtQVJCKQorI2RlZmluZSBnbExpbmtQcm9ncmFtCQlNQU5HTEUoTGlua1Byb2dyYW0pCisjZGVmaW5lIGdsTGlzdEJhc2UJCU1BTkdMRShMaXN0QmFzZSkKKyNkZWZpbmUgZ2xMaXN0UGFyYW1ldGVyZlNHSVgJCU1BTkdMRShMaXN0UGFyYW1ldGVyZlNHSVgpCisjZGVmaW5lIGdsTGlzdFBhcmFtZXRlcmZ2U0dJWAkJTUFOR0xFKExpc3RQYXJhbWV0ZXJmdlNHSVgpCisjZGVmaW5lIGdsTGlzdFBhcmFtZXRlcmlTR0lYCQlNQU5HTEUoTGlzdFBhcmFtZXRlcmlTR0lYKQorI2RlZmluZSBnbExpc3RQYXJhbWV0ZXJpdlNHSVgJCU1BTkdMRShMaXN0UGFyYW1ldGVyaXZTR0lYKQorI2RlZmluZSBnbExvYWRJZGVudGl0eURlZm9ybWF0aW9uTWFwU0dJWAkJTUFOR0xFKExvYWRJZGVudGl0eURlZm9ybWF0aW9uTWFwU0dJWCkKKyNkZWZpbmUgZ2xMb2FkSWRlbnRpdHkJCU1BTkdMRShMb2FkSWRlbnRpdHkpCisjZGVmaW5lIGdsTG9hZE1hdHJpeGQJCU1BTkdMRShMb2FkTWF0cml4ZCkKKyNkZWZpbmUgZ2xMb2FkTWF0cml4ZgkJTUFOR0xFKExvYWRNYXRyaXhmKQorI2RlZmluZSBnbExvYWROYW1lCQlNQU5HTEUoTG9hZE5hbWUpCisjZGVmaW5lIGdsTG9hZFByb2dyYW1OVgkJTUFOR0xFKExvYWRQcm9ncmFtTlYpCisjZGVmaW5lIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGRBUkIJCU1BTkdMRShMb2FkVHJhbnNwb3NlTWF0cml4ZEFSQikKKyNkZWZpbmUgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZAkJTUFOR0xFKExvYWRUcmFuc3Bvc2VNYXRyaXhkKQorI2RlZmluZSBnbExvYWRUcmFuc3Bvc2VNYXRyaXhmQVJCCQlNQU5HTEUoTG9hZFRyYW5zcG9zZU1hdHJpeGZBUkIpCisjZGVmaW5lIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGYJCU1BTkdMRShMb2FkVHJhbnNwb3NlTWF0cml4ZikKKyNkZWZpbmUgZ2xMb2NrQXJyYXlzRVhUCQlNQU5HTEUoTG9ja0FycmF5c0VYVCkKKyNkZWZpbmUgZ2xMb2dpY09wCQlNQU5HTEUoTG9naWNPcCkKKyNkZWZpbmUgZ2xNYXAxZAkJTUFOR0xFKE1hcDFkKQorI2RlZmluZSBnbE1hcDFmCQlNQU5HTEUoTWFwMWYpCisjZGVmaW5lIGdsTWFwMmQJCU1BTkdMRShNYXAyZCkKKyNkZWZpbmUgZ2xNYXAyZgkJTUFOR0xFKE1hcDJmKQorI2RlZmluZSBnbE1hcEJ1ZmZlckFSQgkJTUFOR0xFKE1hcEJ1ZmZlckFSQikKKyNkZWZpbmUgZ2xNYXBCdWZmZXIJCU1BTkdMRShNYXBCdWZmZXIpCisjZGVmaW5lIGdsTWFwQ29udHJvbFBvaW50c05WCQlNQU5HTEUoTWFwQ29udHJvbFBvaW50c05WKQorI2RlZmluZSBnbE1hcEdyaWQxZAkJTUFOR0xFKE1hcEdyaWQxZCkKKyNkZWZpbmUgZ2xNYXBHcmlkMWYJCU1BTkdMRShNYXBHcmlkMWYpCisjZGVmaW5lIGdsTWFwR3JpZDJkCQlNQU5HTEUoTWFwR3JpZDJkKQorI2RlZmluZSBnbE1hcEdyaWQyZgkJTUFOR0xFKE1hcEdyaWQyZikKKyNkZWZpbmUgZ2xNYXBPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShNYXBPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsTWFwUGFyYW1ldGVyZnZOVgkJTUFOR0xFKE1hcFBhcmFtZXRlcmZ2TlYpCisjZGVmaW5lIGdsTWFwUGFyYW1ldGVyaXZOVgkJTUFOR0xFKE1hcFBhcmFtZXRlcml2TlYpCisjZGVmaW5lIGdsTWF0ZXJpYWxmCQlNQU5HTEUoTWF0ZXJpYWxmKQorI2RlZmluZSBnbE1hdGVyaWFsZnYJCU1BTkdMRShNYXRlcmlhbGZ2KQorI2RlZmluZSBnbE1hdGVyaWFsaQkJTUFOR0xFKE1hdGVyaWFsaSkKKyNkZWZpbmUgZ2xNYXRlcmlhbGl2CQlNQU5HTEUoTWF0ZXJpYWxpdikKKyNkZWZpbmUgZ2xNYXRyaXhJbmRleFBvaW50ZXJBUkIJCU1BTkdMRShNYXRyaXhJbmRleFBvaW50ZXJBUkIpCisjZGVmaW5lIGdsTWF0cml4SW5kZXh1YnZBUkIJCU1BTkdMRShNYXRyaXhJbmRleHVidkFSQikKKyNkZWZpbmUgZ2xNYXRyaXhJbmRleHVpdkFSQgkJTUFOR0xFKE1hdHJpeEluZGV4dWl2QVJCKQorI2RlZmluZSBnbE1hdHJpeEluZGV4dXN2QVJCCQlNQU5HTEUoTWF0cml4SW5kZXh1c3ZBUkIpCisjZGVmaW5lIGdsTWF0cml4TW9kZQkJTUFOR0xFKE1hdHJpeE1vZGUpCisjZGVmaW5lIGdsTWlubWF4RVhUCQlNQU5HTEUoTWlubWF4RVhUKQorI2RlZmluZSBnbE1pbm1heAkJTUFOR0xFKE1pbm1heCkKKyNkZWZpbmUgZ2xNdWx0aURyYXdBcnJheXNFWFQJCU1BTkdMRShNdWx0aURyYXdBcnJheXNFWFQpCisjZGVmaW5lIGdsTXVsdGlEcmF3QXJyYXlzCQlNQU5HTEUoTXVsdGlEcmF3QXJyYXlzKQorI2RlZmluZSBnbE11bHRpRHJhd0VsZW1lbnRBcnJheUFQUExFCQlNQU5HTEUoTXVsdGlEcmF3RWxlbWVudEFycmF5QVBQTEUpCisjZGVmaW5lIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQJCU1BTkdMRShNdWx0aURyYXdFbGVtZW50c0VYVCkKKyNkZWZpbmUgZ2xNdWx0aURyYXdFbGVtZW50cwkJTUFOR0xFKE11bHRpRHJhd0VsZW1lbnRzKQorI2RlZmluZSBnbE11bHRpRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUJCU1BTkdMRShNdWx0aURyYXdSYW5nZUVsZW1lbnRBcnJheUFQUExFKQorI2RlZmluZSBnbE11bHRpTW9kZURyYXdBcnJheXNJQk0JCU1BTkdMRShNdWx0aU1vZGVEcmF3QXJyYXlzSUJNKQorI2RlZmluZSBnbE11bHRpTW9kZURyYXdFbGVtZW50c0lCTQkJTUFOR0xFKE11bHRpTW9kZURyYXdFbGVtZW50c0lCTSkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWRBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMWRBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFkCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFkKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZHZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMWR2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZHYJCU1BTkdMRShNdWx0aVRleENvb3JkMWR2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxZkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWYJCU1BTkdMRShNdWx0aVRleENvb3JkMWYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFmdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZnZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFmdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQxZnYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFoTlYJCU1BTkdMRShNdWx0aVRleENvb3JkMWhOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWh2TlYJCU1BTkdMRShNdWx0aVRleENvb3JkMWh2TlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFpQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFpQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxaQkJTUFOR0xFKE11bHRpVGV4Q29vcmQxaSkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWl2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFpdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMWl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDFpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMXNBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMXNBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDFzCQlNQU5HTEUoTXVsdGlUZXhDb29yZDFzKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxc3ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMXN2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQxc3YJCU1BTkdMRShNdWx0aVRleENvb3JkMXN2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZEFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZEFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmQJCU1BTkdMRShNdWx0aVRleENvb3JkMmQpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJkdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZHZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJkdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZHYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJmQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJmQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyZgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyZikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmZ2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJmdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmZ2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDJmdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmhOVgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyaE5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaHZOVgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyaHZOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMmlBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMmlBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJpCQlNQU5HTEUoTXVsdGlUZXhDb29yZDJpKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaXZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkMml2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyaXYJCU1BTkdMRShNdWx0aVRleENvb3JkMml2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQyc0FSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyc0FSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkMnMJCU1BTkdMRShNdWx0aVRleENvb3JkMnMpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJzdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyc3ZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDJzdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQyc3YpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNkQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNkQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZAkJTUFOR0xFKE11bHRpVGV4Q29vcmQzZCkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2R2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNkdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2R2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDNkdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkM2ZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNmCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNmKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZnZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkM2Z2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzZnYJCU1BTkdMRShNdWx0aVRleENvb3JkM2Z2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaE5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNoTlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNodk5WCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNodk5WKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzaUFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaUFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM2kJCU1BTkdMRShNdWx0aVRleENvb3JkM2kpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNpdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaXZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNpdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQzaXYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDNzQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNzQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQzcwkJTUFOR0xFKE11bHRpVGV4Q29vcmQzcykKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM3N2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDNzdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkM3N2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDNzdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGRBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNGRBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRkCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRkKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZHZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNGR2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZHYJCU1BTkdMRShNdWx0aVRleENvb3JkNGR2KQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0ZkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGYJCU1BTkdMRShNdWx0aVRleENvb3JkNGYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRmdkFSQgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZnZBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRmdgkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0ZnYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRoTlYJCU1BTkdMRShNdWx0aVRleENvb3JkNGhOVikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGh2TlYJCU1BTkdMRShNdWx0aVRleENvb3JkNGh2TlYpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRpQVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRpQVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0aQkJTUFOR0xFKE11bHRpVGV4Q29vcmQ0aSkKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGl2QVJCCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRpdkFSQikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNGl2CQlNQU5HTEUoTXVsdGlUZXhDb29yZDRpdikKKyNkZWZpbmUgZ2xNdWx0aVRleENvb3JkNHNBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNHNBUkIpCisjZGVmaW5lIGdsTXVsdGlUZXhDb29yZDRzCQlNQU5HTEUoTXVsdGlUZXhDb29yZDRzKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0c3ZBUkIJCU1BTkdMRShNdWx0aVRleENvb3JkNHN2QVJCKQorI2RlZmluZSBnbE11bHRpVGV4Q29vcmQ0c3YJCU1BTkdMRShNdWx0aVRleENvb3JkNHN2KQorI2RlZmluZSBnbE11bHRNYXRyaXhkCQlNQU5HTEUoTXVsdE1hdHJpeGQpCisjZGVmaW5lIGdsTXVsdE1hdHJpeGYJCU1BTkdMRShNdWx0TWF0cml4ZikKKyNkZWZpbmUgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZEFSQgkJTUFOR0xFKE11bHRUcmFuc3Bvc2VNYXRyaXhkQVJCKQorI2RlZmluZSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkCQlNQU5HTEUoTXVsdFRyYW5zcG9zZU1hdHJpeGQpCisjZGVmaW5lIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGZBUkIJCU1BTkdMRShNdWx0VHJhbnNwb3NlTWF0cml4ZkFSQikKKyNkZWZpbmUgZ2xNdWx0VHJhbnNwb3NlTWF0cml4ZgkJTUFOR0xFKE11bHRUcmFuc3Bvc2VNYXRyaXhmKQorI2RlZmluZSBnbE5ld0xpc3QJCU1BTkdMRShOZXdMaXN0KQorI2RlZmluZSBnbE5ld09iamVjdEJ1ZmZlckFUSQkJTUFOR0xFKE5ld09iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xOb3JtYWwzYgkJTUFOR0xFKE5vcm1hbDNiKQorI2RlZmluZSBnbE5vcm1hbDNidgkJTUFOR0xFKE5vcm1hbDNidikKKyNkZWZpbmUgZ2xOb3JtYWwzZAkJTUFOR0xFKE5vcm1hbDNkKQorI2RlZmluZSBnbE5vcm1hbDNkdgkJTUFOR0xFKE5vcm1hbDNkdikKKyNkZWZpbmUgZ2xOb3JtYWwzZgkJTUFOR0xFKE5vcm1hbDNmKQorI2RlZmluZSBnbE5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbE5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsTm9ybWFsM2Z2CQlNQU5HTEUoTm9ybWFsM2Z2KQorI2RlZmluZSBnbE5vcm1hbDNoTlYJCU1BTkdMRShOb3JtYWwzaE5WKQorI2RlZmluZSBnbE5vcm1hbDNodk5WCQlNQU5HTEUoTm9ybWFsM2h2TlYpCisjZGVmaW5lIGdsTm9ybWFsM2kJCU1BTkdMRShOb3JtYWwzaSkKKyNkZWZpbmUgZ2xOb3JtYWwzaXYJCU1BTkdMRShOb3JtYWwzaXYpCisjZGVmaW5lIGdsTm9ybWFsM3MJCU1BTkdMRShOb3JtYWwzcykKKyNkZWZpbmUgZ2xOb3JtYWwzc3YJCU1BTkdMRShOb3JtYWwzc3YpCisjZGVmaW5lIGdsTm9ybWFsUG9pbnRlckVYVAkJTUFOR0xFKE5vcm1hbFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsTm9ybWFsUG9pbnRlckxpc3RJQk0JCU1BTkdMRShOb3JtYWxQb2ludGVyTGlzdElCTSkKKyNkZWZpbmUgZ2xOb3JtYWxQb2ludGVyCQlNQU5HTEUoTm9ybWFsUG9pbnRlcikKKyNkZWZpbmUgZ2xOb3JtYWxQb2ludGVydklOVEVMCQlNQU5HTEUoTm9ybWFsUG9pbnRlcnZJTlRFTCkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zYkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNiQVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNidkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNidkFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zZEFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNkQVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNkdkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNkdkFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zZkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNmQVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNmdkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNmdkFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zaUFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNpQVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNpdkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNpdkFUSSkKKyNkZWZpbmUgZ2xOb3JtYWxTdHJlYW0zc0FUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNzQVRJKQorI2RlZmluZSBnbE5vcm1hbFN0cmVhbTNzdkFUSQkJTUFOR0xFKE5vcm1hbFN0cmVhbTNzdkFUSSkKKyNkZWZpbmUgZ2xPcnRobwkJTUFOR0xFKE9ydGhvKQorI2RlZmluZSBnbFBhc3NUZXhDb29yZEFUSQkJTUFOR0xFKFBhc3NUZXhDb29yZEFUSSkKKyNkZWZpbmUgZ2xQYXNzVGhyb3VnaAkJTUFOR0xFKFBhc3NUaHJvdWdoKQorI2RlZmluZSBnbFBpeGVsRGF0YVJhbmdlTlYJCU1BTkdMRShQaXhlbERhdGFSYW5nZU5WKQorI2RlZmluZSBnbFBpeGVsTWFwZnYJCU1BTkdMRShQaXhlbE1hcGZ2KQorI2RlZmluZSBnbFBpeGVsTWFwdWl2CQlNQU5HTEUoUGl4ZWxNYXB1aXYpCisjZGVmaW5lIGdsUGl4ZWxNYXB1c3YJCU1BTkdMRShQaXhlbE1hcHVzdikKKyNkZWZpbmUgZ2xQaXhlbFN0b3JlZgkJTUFOR0xFKFBpeGVsU3RvcmVmKQorI2RlZmluZSBnbFBpeGVsU3RvcmVpCQlNQU5HTEUoUGl4ZWxTdG9yZWkpCisjZGVmaW5lIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmU0dJUwkJTUFOR0xFKFBpeGVsVGV4R2VuUGFyYW1ldGVyZlNHSVMpCisjZGVmaW5lIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmdlNHSVMJCU1BTkdMRShQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUykKKyNkZWZpbmUgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmlTR0lTCQlNQU5HTEUoUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpU0dJUykKKyNkZWZpbmUgZ2xQaXhlbFRleEdlblBhcmFtZXRlcml2U0dJUwkJTUFOR0xFKFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTKQorI2RlZmluZSBnbFBpeGVsVGV4R2VuU0dJWAkJTUFOR0xFKFBpeGVsVGV4R2VuU0dJWCkKKyNkZWZpbmUgZ2xQaXhlbFRyYW5zZmVyZgkJTUFOR0xFKFBpeGVsVHJhbnNmZXJmKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmZXJpCQlNQU5HTEUoUGl4ZWxUcmFuc2ZlcmkpCisjZGVmaW5lIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmRVhUCQlNQU5HTEUoUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyZnZFWFQJCU1BTkdMRShQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZ2RVhUKQorI2RlZmluZSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVAkJTUFOR0xFKFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVCkKKyNkZWZpbmUgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcml2RVhUCQlNQU5HTEUoUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJpdkVYVCkKKyNkZWZpbmUgZ2xQaXhlbFpvb20JCU1BTkdMRShQaXhlbFpvb20pCisjZGVmaW5lIGdsUE5UcmlhbmdsZXNmQVRJCQlNQU5HTEUoUE5UcmlhbmdsZXNmQVRJKQorI2RlZmluZSBnbFBOVHJpYW5nbGVzaUFUSQkJTUFOR0xFKFBOVHJpYW5nbGVzaUFUSSkKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZBUkIJCU1BTkdMRShQb2ludFBhcmFtZXRlcmZBUkIpCisjZGVmaW5lIGdsUG9pbnRQYXJhbWV0ZXJmRVhUCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmRVhUKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyZgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyZikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZTR0lTCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmU0dJUykKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2QVJCCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdkFSQikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2RVhUCQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdkVYVCkKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2CQlNQU5HTEUoUG9pbnRQYXJhbWV0ZXJmdikKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmZ2U0dJUwkJTUFOR0xFKFBvaW50UGFyYW1ldGVyZnZTR0lTKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaQkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xQb2ludFBhcmFtZXRlcmlOVgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaU5WKQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaXYJCU1BTkdMRShQb2ludFBhcmFtZXRlcml2KQorI2RlZmluZSBnbFBvaW50UGFyYW1ldGVyaXZOVgkJTUFOR0xFKFBvaW50UGFyYW1ldGVyaXZOVikKKyNkZWZpbmUgZ2xQb2ludFNpemUJCU1BTkdMRShQb2ludFNpemUpCisjZGVmaW5lIGdsUG9sbEFzeW5jU0dJWAkJTUFOR0xFKFBvbGxBc3luY1NHSVgpCisjZGVmaW5lIGdsUG9sbEluc3RydW1lbnRzU0dJWAkJTUFOR0xFKFBvbGxJbnN0cnVtZW50c1NHSVgpCisjZGVmaW5lIGdsUG9seWdvbk1vZGUJCU1BTkdMRShQb2x5Z29uTW9kZSkKKyNkZWZpbmUgZ2xQb2x5Z29uT2Zmc2V0RVhUCQlNQU5HTEUoUG9seWdvbk9mZnNldEVYVCkKKyNkZWZpbmUgZ2xQb2x5Z29uT2Zmc2V0CQlNQU5HTEUoUG9seWdvbk9mZnNldCkKKyNkZWZpbmUgZ2xQb2x5Z29uU3RpcHBsZQkJTUFOR0xFKFBvbHlnb25TdGlwcGxlKQorI2RlZmluZSBnbFBvcEF0dHJpYgkJTUFOR0xFKFBvcEF0dHJpYikKKyNkZWZpbmUgZ2xQb3BDbGllbnRBdHRyaWIJCU1BTkdMRShQb3BDbGllbnRBdHRyaWIpCisjZGVmaW5lIGdsUG9wTWF0cml4CQlNQU5HTEUoUG9wTWF0cml4KQorI2RlZmluZSBnbFBvcE5hbWUJCU1BTkdMRShQb3BOYW1lKQorI2RlZmluZSBnbFByaW1pdGl2ZVJlc3RhcnRJbmRleE5WCQlNQU5HTEUoUHJpbWl0aXZlUmVzdGFydEluZGV4TlYpCisjZGVmaW5lIGdsUHJpbWl0aXZlUmVzdGFydE5WCQlNQU5HTEUoUHJpbWl0aXZlUmVzdGFydE5WKQorI2RlZmluZSBnbFByaW9yaXRpemVUZXh0dXJlc0VYVAkJTUFOR0xFKFByaW9yaXRpemVUZXh0dXJlc0VYVCkKKyNkZWZpbmUgZ2xQcmlvcml0aXplVGV4dHVyZXMJCU1BTkdMRShQcmlvcml0aXplVGV4dHVyZXMpCisjZGVmaW5lIGdsUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNmdk5WCQlNQU5HTEUoUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNmdk5WKQorI2RlZmluZSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzSWl2TlYJCU1BTkdMRShQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0lpdk5WKQorI2RlZmluZSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzSXVpdk5WCQlNQU5HTEUoUHJvZ3JhbUJ1ZmZlclBhcmFtZXRlcnNJdWl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUNhbGxiYWNrTUVTQQkJTUFOR0xFKFByb2dyYW1DYWxsYmFja01FU0EpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRkQVJCCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcjRkQVJCKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZHZBUkIJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVyNGR2QVJCKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZkFSQgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXI0ZkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZ2QVJCCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcjRmdkFSQikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVySTRpTlYJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVySTRpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0aXZOVgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJJNGl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0dWlOVgkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0dWl2TlYJCU1BTkdMRShQcm9ncmFtRW52UGFyYW1ldGVySTR1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtRW52UGFyYW1ldGVyczRmdkVYVAkJTUFOR0xFKFByb2dyYW1FbnZQYXJhbWV0ZXJzNGZ2RVhUKQorI2RlZmluZSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJzSTRpdk5WCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcnNJNGl2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbUVudlBhcmFtZXRlcnNJNHVpdk5WCQlNQU5HTEUoUHJvZ3JhbUVudlBhcmFtZXRlcnNJNHVpdk5WKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRkQVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGRBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2QVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGR2QVJCKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmQVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZBUkIpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2QVJCCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyNGZ2QVJCKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aU5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpTlYpCisjZGVmaW5lIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpdk5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTRpdk5WKQorI2RlZmluZSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWlOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWlOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpdk5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVySTR1aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzNGZ2RVhUCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVCkKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTRpdk5WCQlNQU5HTEUoUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0aXZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJzSTR1aXZOVgkJTUFOR0xFKFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNHVpdk5WKQorI2RlZmluZSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkTlYJCU1BTkdMRShQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZE5WKQorI2RlZmluZSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WCQlNQU5HTEUoUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGR2TlYpCisjZGVmaW5lIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZOVgkJTUFOR0xFKFByb2dyYW1OYW1lZFBhcmFtZXRlcjRmTlYpCisjZGVmaW5lIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZ2TlYJCU1BTkdMRShQcm9ncmFtTmFtZWRQYXJhbWV0ZXI0ZnZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyNGROVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0ZE5WKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXI0ZHZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0ZHZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyNGZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0Zk5WKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXI0ZnZOVgkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXI0ZnZOVikKKyNkZWZpbmUgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVAkJTUFOR0xFKFByb2dyYW1QYXJhbWV0ZXJpRVhUKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXJzNGR2TlYJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyczRkdk5WKQorI2RlZmluZSBnbFByb2dyYW1QYXJhbWV0ZXJzNGZ2TlYJCU1BTkdMRShQcm9ncmFtUGFyYW1ldGVyczRmdk5WKQorI2RlZmluZSBnbFByb2dyYW1TdHJpbmdBUkIJCU1BTkdMRShQcm9ncmFtU3RyaW5nQVJCKQorI2RlZmluZSBnbFByb2dyYW1WZXJ0ZXhMaW1pdE5WCQlNQU5HTEUoUHJvZ3JhbVZlcnRleExpbWl0TlYpCisjZGVmaW5lIGdsUHVzaEF0dHJpYgkJTUFOR0xFKFB1c2hBdHRyaWIpCisjZGVmaW5lIGdsUHVzaENsaWVudEF0dHJpYgkJTUFOR0xFKFB1c2hDbGllbnRBdHRyaWIpCisjZGVmaW5lIGdsUHVzaE1hdHJpeAkJTUFOR0xFKFB1c2hNYXRyaXgpCisjZGVmaW5lIGdsUHVzaE5hbWUJCU1BTkdMRShQdXNoTmFtZSkKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyZAkJTUFOR0xFKFJhc3RlclBvczJkKQorI2RlZmluZSBnbFJhc3RlclBvczJkdgkJTUFOR0xFKFJhc3RlclBvczJkdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyZgkJTUFOR0xFKFJhc3RlclBvczJmKQorI2RlZmluZSBnbFJhc3RlclBvczJmdgkJTUFOR0xFKFJhc3RlclBvczJmdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MyaQkJTUFOR0xFKFJhc3RlclBvczJpKQorI2RlZmluZSBnbFJhc3RlclBvczJpdgkJTUFOR0xFKFJhc3RlclBvczJpdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MycwkJTUFOR0xFKFJhc3RlclBvczJzKQorI2RlZmluZSBnbFJhc3RlclBvczJzdgkJTUFOR0xFKFJhc3RlclBvczJzdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzZAkJTUFOR0xFKFJhc3RlclBvczNkKQorI2RlZmluZSBnbFJhc3RlclBvczNkdgkJTUFOR0xFKFJhc3RlclBvczNkdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzZgkJTUFOR0xFKFJhc3RlclBvczNmKQorI2RlZmluZSBnbFJhc3RlclBvczNmdgkJTUFOR0xFKFJhc3RlclBvczNmdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzaQkJTUFOR0xFKFJhc3RlclBvczNpKQorI2RlZmluZSBnbFJhc3RlclBvczNpdgkJTUFOR0xFKFJhc3RlclBvczNpdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3MzcwkJTUFOR0xFKFJhc3RlclBvczNzKQorI2RlZmluZSBnbFJhc3RlclBvczNzdgkJTUFOR0xFKFJhc3RlclBvczNzdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0ZAkJTUFOR0xFKFJhc3RlclBvczRkKQorI2RlZmluZSBnbFJhc3RlclBvczRkdgkJTUFOR0xFKFJhc3RlclBvczRkdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0ZgkJTUFOR0xFKFJhc3RlclBvczRmKQorI2RlZmluZSBnbFJhc3RlclBvczRmdgkJTUFOR0xFKFJhc3RlclBvczRmdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0aQkJTUFOR0xFKFJhc3RlclBvczRpKQorI2RlZmluZSBnbFJhc3RlclBvczRpdgkJTUFOR0xFKFJhc3RlclBvczRpdikKKyNkZWZpbmUgZ2xSYXN0ZXJQb3M0cwkJTUFOR0xFKFJhc3RlclBvczRzKQorI2RlZmluZSBnbFJhc3RlclBvczRzdgkJTUFOR0xFKFJhc3RlclBvczRzdikKKyNkZWZpbmUgZ2xSZWFkQnVmZmVyCQlNQU5HTEUoUmVhZEJ1ZmZlcikKKyNkZWZpbmUgZ2xSZWFkSW5zdHJ1bWVudHNTR0lYCQlNQU5HTEUoUmVhZEluc3RydW1lbnRzU0dJWCkKKyNkZWZpbmUgZ2xSZWFkUGl4ZWxzCQlNQU5HTEUoUmVhZFBpeGVscykKKyNkZWZpbmUgZ2xSZWN0ZAkJTUFOR0xFKFJlY3RkKQorI2RlZmluZSBnbFJlY3RkdgkJTUFOR0xFKFJlY3RkdikKKyNkZWZpbmUgZ2xSZWN0ZgkJTUFOR0xFKFJlY3RmKQorI2RlZmluZSBnbFJlY3RmdgkJTUFOR0xFKFJlY3RmdikKKyNkZWZpbmUgZ2xSZWN0aQkJTUFOR0xFKFJlY3RpKQorI2RlZmluZSBnbFJlY3RpdgkJTUFOR0xFKFJlY3RpdikKKyNkZWZpbmUgZ2xSZWN0cwkJTUFOR0xFKFJlY3RzKQorI2RlZmluZSBnbFJlY3RzdgkJTUFOR0xFKFJlY3RzdikKKyNkZWZpbmUgZ2xSZWZlcmVuY2VQbGFuZVNHSVgJCU1BTkdMRShSZWZlcmVuY2VQbGFuZVNHSVgpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVAkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQ292ZXJhZ2VOVgkJTUFOR0xFKFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUNvdmVyYWdlTlYpCisjZGVmaW5lIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUCQlNQU5HTEUoUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKQorI2RlZmluZSBnbFJlbmRlck1vZGUJCU1BTkdMRShSZW5kZXJNb2RlKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZVBvaW50ZXJTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGVQb2ludGVyU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXViU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWJTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWJ2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWJ2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3IzZlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlDb2xvcjNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlDb2xvcjNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpQ29sb3I0dWJWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aU5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmVmVydGV4M2ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlWZXJ0ZXgzZlNVTgkJTUFOR0xFKFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldWlWZXJ0ZXgzZnZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1aXZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1aXZTVU4pCisjZGVmaW5lIGdsUmVwbGFjZW1lbnRDb2RldXNTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1c1NVTikKKyNkZWZpbmUgZ2xSZXBsYWNlbWVudENvZGV1c3ZTVU4JCU1BTkdMRShSZXBsYWNlbWVudENvZGV1c3ZTVU4pCisjZGVmaW5lIGdsUmVxdWVzdFJlc2lkZW50UHJvZ3JhbXNOVgkJTUFOR0xFKFJlcXVlc3RSZXNpZGVudFByb2dyYW1zTlYpCisjZGVmaW5lIGdsUmVzZXRIaXN0b2dyYW1FWFQJCU1BTkdMRShSZXNldEhpc3RvZ3JhbUVYVCkKKyNkZWZpbmUgZ2xSZXNldEhpc3RvZ3JhbQkJTUFOR0xFKFJlc2V0SGlzdG9ncmFtKQorI2RlZmluZSBnbFJlc2V0TWlubWF4RVhUCQlNQU5HTEUoUmVzZXRNaW5tYXhFWFQpCisjZGVmaW5lIGdsUmVzZXRNaW5tYXgJCU1BTkdMRShSZXNldE1pbm1heCkKKyNkZWZpbmUgZ2xSZXNpemVCdWZmZXJzTUVTQQkJTUFOR0xFKFJlc2l6ZUJ1ZmZlcnNNRVNBKQorI2RlZmluZSBnbFJvdGF0ZWQJCU1BTkdMRShSb3RhdGVkKQorI2RlZmluZSBnbFJvdGF0ZWYJCU1BTkdMRShSb3RhdGVmKQorI2RlZmluZSBnbFNhbXBsZUNvdmVyYWdlQVJCCQlNQU5HTEUoU2FtcGxlQ292ZXJhZ2VBUkIpCisjZGVmaW5lIGdsU2FtcGxlQ292ZXJhZ2UJCU1BTkdMRShTYW1wbGVDb3ZlcmFnZSkKKyNkZWZpbmUgZ2xTYW1wbGVNYXBBVEkJCU1BTkdMRShTYW1wbGVNYXBBVEkpCisjZGVmaW5lIGdsU2FtcGxlTWFza0VYVAkJTUFOR0xFKFNhbXBsZU1hc2tFWFQpCisjZGVmaW5lIGdsU2FtcGxlTWFza1NHSVMJCU1BTkdMRShTYW1wbGVNYXNrU0dJUykKKyNkZWZpbmUgZ2xTYW1wbGVQYXR0ZXJuRVhUCQlNQU5HTEUoU2FtcGxlUGF0dGVybkVYVCkKKyNkZWZpbmUgZ2xTYW1wbGVQYXR0ZXJuU0dJUwkJTUFOR0xFKFNhbXBsZVBhdHRlcm5TR0lTKQorI2RlZmluZSBnbFNjYWxlZAkJTUFOR0xFKFNjYWxlZCkKKyNkZWZpbmUgZ2xTY2FsZWYJCU1BTkdMRShTY2FsZWYpCisjZGVmaW5lIGdsU2Npc3NvcgkJTUFOR0xFKFNjaXNzb3IpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzYkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2JFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzYgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2IpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzYnZFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNidkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNidgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2J2KQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2RFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNkRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2QJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNkKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2R2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZHZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzZHYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNkdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNmRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNmCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNmdkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM2Z2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2Z2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzZnYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzaE5WCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzaE5WKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2h2TlYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNodk5WKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2lFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNpRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2kJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNpKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM2l2RVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzaXZFWFQpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzaXYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjNpdikKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNzRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3Izc0VYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNzCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3IzcykKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjNzdkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3N2RVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3N2CQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3Izc3YpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWJFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1YkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1YgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3ViKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VidkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VidkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1YnYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1YnYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdWlFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1aUVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1aQkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VpKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VpdkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VpdkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1aXYJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1aXYpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3IzdXNFWFQJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1c0VYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1cwkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VzKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yM3VzdkVYVAkJTUFOR0xFKFNlY29uZGFyeUNvbG9yM3VzdkVYVCkKKyNkZWZpbmUgZ2xTZWNvbmRhcnlDb2xvcjN1c3YJCU1BTkdMRShTZWNvbmRhcnlDb2xvcjN1c3YpCisjZGVmaW5lIGdsU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUCQlNQU5HTEUoU2Vjb25kYXJ5Q29sb3JQb2ludGVyRVhUKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlckxpc3RJQk0JCU1BTkdMRShTZWNvbmRhcnlDb2xvclBvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlcgkJTUFOR0xFKFNlY29uZGFyeUNvbG9yUG9pbnRlcikKKyNkZWZpbmUgZ2xTZWxlY3RCdWZmZXIJCU1BTkdMRShTZWxlY3RCdWZmZXIpCisjZGVmaW5lIGdsU2VwYXJhYmxlRmlsdGVyMkRFWFQJCU1BTkdMRShTZXBhcmFibGVGaWx0ZXIyREVYVCkKKyNkZWZpbmUgZ2xTZXBhcmFibGVGaWx0ZXIyRAkJTUFOR0xFKFNlcGFyYWJsZUZpbHRlcjJEKQorI2RlZmluZSBnbFNldEZlbmNlQVBQTEUJCU1BTkdMRShTZXRGZW5jZUFQUExFKQorI2RlZmluZSBnbFNldEZlbmNlTlYJCU1BTkdMRShTZXRGZW5jZU5WKQorI2RlZmluZSBnbFNldEZyYWdtZW50U2hhZGVyQ29uc3RhbnRBVEkJCU1BTkdMRShTZXRGcmFnbWVudFNoYWRlckNvbnN0YW50QVRJKQorI2RlZmluZSBnbFNldEludmFyaWFudEVYVAkJTUFOR0xFKFNldEludmFyaWFudEVYVCkKKyNkZWZpbmUgZ2xTZXRMb2NhbENvbnN0YW50RVhUCQlNQU5HTEUoU2V0TG9jYWxDb25zdGFudEVYVCkKKyNkZWZpbmUgZ2xTaGFkZU1vZGVsCQlNQU5HTEUoU2hhZGVNb2RlbCkKKyNkZWZpbmUgZ2xTaGFkZXJPcDFFWFQJCU1BTkdMRShTaGFkZXJPcDFFWFQpCisjZGVmaW5lIGdsU2hhZGVyT3AyRVhUCQlNQU5HTEUoU2hhZGVyT3AyRVhUKQorI2RlZmluZSBnbFNoYWRlck9wM0VYVAkJTUFOR0xFKFNoYWRlck9wM0VYVCkKKyNkZWZpbmUgZ2xTaGFkZXJTb3VyY2VBUkIJCU1BTkdMRShTaGFkZXJTb3VyY2VBUkIpCisjZGVmaW5lIGdsU2hhZGVyU291cmNlCQlNQU5HTEUoU2hhZGVyU291cmNlKQorI2RlZmluZSBnbFNoYXJwZW5UZXhGdW5jU0dJUwkJTUFOR0xFKFNoYXJwZW5UZXhGdW5jU0dJUykKKyNkZWZpbmUgZ2xTcHJpdGVQYXJhbWV0ZXJmU0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcmZTR0lYKQorI2RlZmluZSBnbFNwcml0ZVBhcmFtZXRlcmZ2U0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcmZ2U0dJWCkKKyNkZWZpbmUgZ2xTcHJpdGVQYXJhbWV0ZXJpU0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcmlTR0lYKQorI2RlZmluZSBnbFNwcml0ZVBhcmFtZXRlcml2U0dJWAkJTUFOR0xFKFNwcml0ZVBhcmFtZXRlcml2U0dJWCkKKyNkZWZpbmUgZ2xTdGFydEluc3RydW1lbnRzU0dJWAkJTUFOR0xFKFN0YXJ0SW5zdHJ1bWVudHNTR0lYKQorI2RlZmluZSBnbFN0ZW5jaWxDbGVhclRhZ0VYVAkJTUFOR0xFKFN0ZW5jaWxDbGVhclRhZ0VYVCkKKyNkZWZpbmUgZ2xTdGVuY2lsRnVuYwkJTUFOR0xFKFN0ZW5jaWxGdW5jKQorI2RlZmluZSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGVBVEkJCU1BTkdMRShTdGVuY2lsRnVuY1NlcGFyYXRlQVRJKQorI2RlZmluZSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUJCU1BTkdMRShTdGVuY2lsRnVuY1NlcGFyYXRlKQorI2RlZmluZSBnbFN0ZW5jaWxNYXNrCQlNQU5HTEUoU3RlbmNpbE1hc2spCisjZGVmaW5lIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZQkJTUFOR0xFKFN0ZW5jaWxNYXNrU2VwYXJhdGUpCisjZGVmaW5lIGdsU3RlbmNpbE9wCQlNQU5HTEUoU3RlbmNpbE9wKQorI2RlZmluZSBnbFN0ZW5jaWxPcFNlcGFyYXRlQVRJCQlNQU5HTEUoU3RlbmNpbE9wU2VwYXJhdGVBVEkpCisjZGVmaW5lIGdsU3RlbmNpbE9wU2VwYXJhdGUJCU1BTkdMRShTdGVuY2lsT3BTZXBhcmF0ZSkKKyNkZWZpbmUgZ2xTdG9wSW5zdHJ1bWVudHNTR0lYCQlNQU5HTEUoU3RvcEluc3RydW1lbnRzU0dJWCkKKyNkZWZpbmUgZ2xTdHJpbmdNYXJrZXJHUkVNRURZCQlNQU5HTEUoU3RyaW5nTWFya2VyR1JFTUVEWSkKKyNkZWZpbmUgZ2xTd2l6emxlRVhUCQlNQU5HTEUoU3dpenpsZUVYVCkKKyNkZWZpbmUgZ2xUYWdTYW1wbGVCdWZmZXJTR0lYCQlNQU5HTEUoVGFnU2FtcGxlQnVmZmVyU0dJWCkKKyNkZWZpbmUgZ2xUYW5nZW50M2JFWFQJCU1BTkdMRShUYW5nZW50M2JFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNidkVYVAkJTUFOR0xFKFRhbmdlbnQzYnZFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNkRVhUCQlNQU5HTEUoVGFuZ2VudDNkRVhUKQorI2RlZmluZSBnbFRhbmdlbnQzZHZFWFQJCU1BTkdMRShUYW5nZW50M2R2RVhUKQorI2RlZmluZSBnbFRhbmdlbnQzZkVYVAkJTUFOR0xFKFRhbmdlbnQzZkVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M2Z2RVhUCQlNQU5HTEUoVGFuZ2VudDNmdkVYVCkKKyNkZWZpbmUgZ2xUYW5nZW50M2lFWFQJCU1BTkdMRShUYW5nZW50M2lFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNpdkVYVAkJTUFOR0xFKFRhbmdlbnQzaXZFWFQpCisjZGVmaW5lIGdsVGFuZ2VudDNzRVhUCQlNQU5HTEUoVGFuZ2VudDNzRVhUKQorI2RlZmluZSBnbFRhbmdlbnQzc3ZFWFQJCU1BTkdMRShUYW5nZW50M3N2RVhUKQorI2RlZmluZSBnbFRhbmdlbnRQb2ludGVyRVhUCQlNQU5HTEUoVGFuZ2VudFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVGJ1ZmZlck1hc2szREZYCQlNQU5HTEUoVGJ1ZmZlck1hc2szREZYKQorI2RlZmluZSBnbFRlc3RGZW5jZUFQUExFCQlNQU5HTEUoVGVzdEZlbmNlQVBQTEUpCisjZGVmaW5lIGdsVGVzdEZlbmNlTlYJCU1BTkdMRShUZXN0RmVuY2VOVikKKyNkZWZpbmUgZ2xUZXN0T2JqZWN0QVBQTEUJCU1BTkdMRShUZXN0T2JqZWN0QVBQTEUpCisjZGVmaW5lIGdsVGV4QnVmZmVyRVhUCQlNQU5HTEUoVGV4QnVmZmVyRVhUKQorI2RlZmluZSBnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSQkJTUFOR0xFKFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSkKKyNkZWZpbmUgZ2xUZXhCdW1wUGFyYW1ldGVyaXZBVEkJCU1BTkdMRShUZXhCdW1wUGFyYW1ldGVyaXZBVEkpCisjZGVmaW5lIGdsVGV4Q29vcmQxZAkJTUFOR0xFKFRleENvb3JkMWQpCisjZGVmaW5lIGdsVGV4Q29vcmQxZHYJCU1BTkdMRShUZXhDb29yZDFkdikKKyNkZWZpbmUgZ2xUZXhDb29yZDFmCQlNQU5HTEUoVGV4Q29vcmQxZikKKyNkZWZpbmUgZ2xUZXhDb29yZDFmdgkJTUFOR0xFKFRleENvb3JkMWZ2KQorI2RlZmluZSBnbFRleENvb3JkMWhOVgkJTUFOR0xFKFRleENvb3JkMWhOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDFodk5WCQlNQU5HTEUoVGV4Q29vcmQxaHZOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDFpCQlNQU5HTEUoVGV4Q29vcmQxaSkKKyNkZWZpbmUgZ2xUZXhDb29yZDFpdgkJTUFOR0xFKFRleENvb3JkMWl2KQorI2RlZmluZSBnbFRleENvb3JkMXMJCU1BTkdMRShUZXhDb29yZDFzKQorI2RlZmluZSBnbFRleENvb3JkMXN2CQlNQU5HTEUoVGV4Q29vcmQxc3YpCisjZGVmaW5lIGdsVGV4Q29vcmQyZAkJTUFOR0xFKFRleENvb3JkMmQpCisjZGVmaW5lIGdsVGV4Q29vcmQyZHYJCU1BTkdMRShUZXhDb29yZDJkdikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmU1VOCQlNQU5HTEUoVGV4Q29vcmQyZkNvbG9yM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjNmVmVydGV4M2Z2U1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOCQlNQU5HTEUoVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZDb2xvcjR1YlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmCQlNQU5HTEUoVGV4Q29vcmQyZikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmTm9ybWFsM2ZWZXJ0ZXgzZlNVTgkJTUFOR0xFKFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOKQorI2RlZmluZSBnbFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDJmVmVydGV4M2ZTVU4JCU1BTkdMRShUZXhDb29yZDJmVmVydGV4M2ZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZlZlcnRleDNmdlNVTgkJTUFOR0xFKFRleENvb3JkMmZWZXJ0ZXgzZnZTVU4pCisjZGVmaW5lIGdsVGV4Q29vcmQyZnYJCU1BTkdMRShUZXhDb29yZDJmdikKKyNkZWZpbmUgZ2xUZXhDb29yZDJoTlYJCU1BTkdMRShUZXhDb29yZDJoTlYpCisjZGVmaW5lIGdsVGV4Q29vcmQyaHZOVgkJTUFOR0xFKFRleENvb3JkMmh2TlYpCisjZGVmaW5lIGdsVGV4Q29vcmQyaQkJTUFOR0xFKFRleENvb3JkMmkpCisjZGVmaW5lIGdsVGV4Q29vcmQyaXYJCU1BTkdMRShUZXhDb29yZDJpdikKKyNkZWZpbmUgZ2xUZXhDb29yZDJzCQlNQU5HTEUoVGV4Q29vcmQycykKKyNkZWZpbmUgZ2xUZXhDb29yZDJzdgkJTUFOR0xFKFRleENvb3JkMnN2KQorI2RlZmluZSBnbFRleENvb3JkM2QJCU1BTkdMRShUZXhDb29yZDNkKQorI2RlZmluZSBnbFRleENvb3JkM2R2CQlNQU5HTEUoVGV4Q29vcmQzZHYpCisjZGVmaW5lIGdsVGV4Q29vcmQzZgkJTUFOR0xFKFRleENvb3JkM2YpCisjZGVmaW5lIGdsVGV4Q29vcmQzZnYJCU1BTkdMRShUZXhDb29yZDNmdikKKyNkZWZpbmUgZ2xUZXhDb29yZDNoTlYJCU1BTkdMRShUZXhDb29yZDNoTlYpCisjZGVmaW5lIGdsVGV4Q29vcmQzaHZOVgkJTUFOR0xFKFRleENvb3JkM2h2TlYpCisjZGVmaW5lIGdsVGV4Q29vcmQzaQkJTUFOR0xFKFRleENvb3JkM2kpCisjZGVmaW5lIGdsVGV4Q29vcmQzaXYJCU1BTkdMRShUZXhDb29yZDNpdikKKyNkZWZpbmUgZ2xUZXhDb29yZDNzCQlNQU5HTEUoVGV4Q29vcmQzcykKKyNkZWZpbmUgZ2xUZXhDb29yZDNzdgkJTUFOR0xFKFRleENvb3JkM3N2KQorI2RlZmluZSBnbFRleENvb3JkNGQJCU1BTkdMRShUZXhDb29yZDRkKQorI2RlZmluZSBnbFRleENvb3JkNGR2CQlNQU5HTEUoVGV4Q29vcmQ0ZHYpCisjZGVmaW5lIGdsVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmU1VOCQlNQU5HTEUoVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmU1VOKQorI2RlZmluZSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZnZTVU4JCU1BTkdMRShUZXhDb29yZDRmQ29sb3I0Zk5vcm1hbDNmVmVydGV4NGZ2U1VOKQorI2RlZmluZSBnbFRleENvb3JkNGYJCU1BTkdMRShUZXhDb29yZDRmKQorI2RlZmluZSBnbFRleENvb3JkNGZWZXJ0ZXg0ZlNVTgkJTUFOR0xFKFRleENvb3JkNGZWZXJ0ZXg0ZlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmVmVydGV4NGZ2U1VOCQlNQU5HTEUoVGV4Q29vcmQ0ZlZlcnRleDRmdlNVTikKKyNkZWZpbmUgZ2xUZXhDb29yZDRmdgkJTUFOR0xFKFRleENvb3JkNGZ2KQorI2RlZmluZSBnbFRleENvb3JkNGhOVgkJTUFOR0xFKFRleENvb3JkNGhOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDRodk5WCQlNQU5HTEUoVGV4Q29vcmQ0aHZOVikKKyNkZWZpbmUgZ2xUZXhDb29yZDRpCQlNQU5HTEUoVGV4Q29vcmQ0aSkKKyNkZWZpbmUgZ2xUZXhDb29yZDRpdgkJTUFOR0xFKFRleENvb3JkNGl2KQorI2RlZmluZSBnbFRleENvb3JkNHMJCU1BTkdMRShUZXhDb29yZDRzKQorI2RlZmluZSBnbFRleENvb3JkNHN2CQlNQU5HTEUoVGV4Q29vcmQ0c3YpCisjZGVmaW5lIGdsVGV4Q29vcmRQb2ludGVyRVhUCQlNQU5HTEUoVGV4Q29vcmRQb2ludGVyRVhUKQorI2RlZmluZSBnbFRleENvb3JkUG9pbnRlckxpc3RJQk0JCU1BTkdMRShUZXhDb29yZFBvaW50ZXJMaXN0SUJNKQorI2RlZmluZSBnbFRleENvb3JkUG9pbnRlcgkJTUFOR0xFKFRleENvb3JkUG9pbnRlcikKKyNkZWZpbmUgZ2xUZXhDb29yZFBvaW50ZXJ2SU5URUwJCU1BTkdMRShUZXhDb29yZFBvaW50ZXJ2SU5URUwpCisjZGVmaW5lIGdsVGV4RW52ZgkJTUFOR0xFKFRleEVudmYpCisjZGVmaW5lIGdsVGV4RW52ZnYJCU1BTkdMRShUZXhFbnZmdikKKyNkZWZpbmUgZ2xUZXhFbnZpCQlNQU5HTEUoVGV4RW52aSkKKyNkZWZpbmUgZ2xUZXhFbnZpdgkJTUFOR0xFKFRleEVudml2KQorI2RlZmluZSBnbFRleEZpbHRlckZ1bmNTR0lTCQlNQU5HTEUoVGV4RmlsdGVyRnVuY1NHSVMpCisjZGVmaW5lIGdsVGV4R2VuZAkJTUFOR0xFKFRleEdlbmQpCisjZGVmaW5lIGdsVGV4R2VuZHYJCU1BTkdMRShUZXhHZW5kdikKKyNkZWZpbmUgZ2xUZXhHZW5mCQlNQU5HTEUoVGV4R2VuZikKKyNkZWZpbmUgZ2xUZXhHZW5mdgkJTUFOR0xFKFRleEdlbmZ2KQorI2RlZmluZSBnbFRleEdlbmkJCU1BTkdMRShUZXhHZW5pKQorI2RlZmluZSBnbFRleEdlbml2CQlNQU5HTEUoVGV4R2VuaXYpCisjZGVmaW5lIGdsVGV4SW1hZ2UxRAkJTUFOR0xFKFRleEltYWdlMUQpCisjZGVmaW5lIGdsVGV4SW1hZ2UyRAkJTUFOR0xFKFRleEltYWdlMkQpCisjZGVmaW5lIGdsVGV4SW1hZ2UzREVYVAkJTUFOR0xFKFRleEltYWdlM0RFWFQpCisjZGVmaW5lIGdsVGV4SW1hZ2UzRAkJTUFOR0xFKFRleEltYWdlM0QpCisjZGVmaW5lIGdsVGV4SW1hZ2U0RFNHSVMJCU1BTkdMRShUZXhJbWFnZTREU0dJUykKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJmCQlNQU5HTEUoVGV4UGFyYW1ldGVyZikKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJmdgkJTUFOR0xFKFRleFBhcmFtZXRlcmZ2KQorI2RlZmluZSBnbFRleFBhcmFtZXRlcklpdkVYVAkJTUFOR0xFKFRleFBhcmFtZXRlcklpdkVYVCkKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJpCQlNQU5HTEUoVGV4UGFyYW1ldGVyaSkKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJJdWl2RVhUCQlNQU5HTEUoVGV4UGFyYW1ldGVySXVpdkVYVCkKKyNkZWZpbmUgZ2xUZXhQYXJhbWV0ZXJpdgkJTUFOR0xFKFRleFBhcmFtZXRlcml2KQorI2RlZmluZSBnbFRleFN1YkltYWdlMURFWFQJCU1BTkdMRShUZXhTdWJJbWFnZTFERVhUKQorI2RlZmluZSBnbFRleFN1YkltYWdlMUQJCU1BTkdMRShUZXhTdWJJbWFnZTFEKQorI2RlZmluZSBnbFRleFN1YkltYWdlMkRFWFQJCU1BTkdMRShUZXhTdWJJbWFnZTJERVhUKQorI2RlZmluZSBnbFRleFN1YkltYWdlMkQJCU1BTkdMRShUZXhTdWJJbWFnZTJEKQorI2RlZmluZSBnbFRleFN1YkltYWdlM0RFWFQJCU1BTkdMRShUZXhTdWJJbWFnZTNERVhUKQorI2RlZmluZSBnbFRleFN1YkltYWdlM0QJCU1BTkdMRShUZXhTdWJJbWFnZTNEKQorI2RlZmluZSBnbFRleFN1YkltYWdlNERTR0lTCQlNQU5HTEUoVGV4U3ViSW1hZ2U0RFNHSVMpCisjZGVmaW5lIGdsVGV4dHVyZUNvbG9yTWFza1NHSVMJCU1BTkdMRShUZXh0dXJlQ29sb3JNYXNrU0dJUykKKyNkZWZpbmUgZ2xUZXh0dXJlTGlnaHRFWFQJCU1BTkdMRShUZXh0dXJlTGlnaHRFWFQpCisjZGVmaW5lIGdsVGV4dHVyZU1hdGVyaWFsRVhUCQlNQU5HTEUoVGV4dHVyZU1hdGVyaWFsRVhUKQorI2RlZmluZSBnbFRleHR1cmVOb3JtYWxFWFQJCU1BTkdMRShUZXh0dXJlTm9ybWFsRVhUKQorI2RlZmluZSBnbFRyYWNrTWF0cml4TlYJCU1BTkdMRShUcmFja01hdHJpeE5WKQorI2RlZmluZSBnbFRyYW5zZm9ybUZlZWRiYWNrQXR0cmlic05WCQlNQU5HTEUoVHJhbnNmb3JtRmVlZGJhY2tBdHRyaWJzTlYpCisjZGVmaW5lIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nc05WCQlNQU5HTEUoVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nc05WKQorI2RlZmluZSBnbFRyYW5zbGF0ZWQJCU1BTkdMRShUcmFuc2xhdGVkKQorI2RlZmluZSBnbFRyYW5zbGF0ZWYJCU1BTkdMRShUcmFuc2xhdGVmKQorI2RlZmluZSBnbFVuaWZvcm0xZkFSQgkJTUFOR0xFKFVuaWZvcm0xZkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMWYJCU1BTkdMRShVbmlmb3JtMWYpCisjZGVmaW5lIGdsVW5pZm9ybTFmdkFSQgkJTUFOR0xFKFVuaWZvcm0xZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTFmdgkJTUFOR0xFKFVuaWZvcm0xZnYpCisjZGVmaW5lIGdsVW5pZm9ybTFpQVJCCQlNQU5HTEUoVW5pZm9ybTFpQVJCKQorI2RlZmluZSBnbFVuaWZvcm0xaQkJTUFOR0xFKFVuaWZvcm0xaSkKKyNkZWZpbmUgZ2xVbmlmb3JtMWl2QVJCCQlNQU5HTEUoVW5pZm9ybTFpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMWl2CQlNQU5HTEUoVW5pZm9ybTFpdikKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpRVhUCQlNQU5HTEUoVW5pZm9ybTF1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtMXVpdkVYVAkJTUFOR0xFKFVuaWZvcm0xdWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm0yZkFSQgkJTUFOR0xFKFVuaWZvcm0yZkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMmYJCU1BTkdMRShVbmlmb3JtMmYpCisjZGVmaW5lIGdsVW5pZm9ybTJmdkFSQgkJTUFOR0xFKFVuaWZvcm0yZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTJmdgkJTUFOR0xFKFVuaWZvcm0yZnYpCisjZGVmaW5lIGdsVW5pZm9ybTJpQVJCCQlNQU5HTEUoVW5pZm9ybTJpQVJCKQorI2RlZmluZSBnbFVuaWZvcm0yaQkJTUFOR0xFKFVuaWZvcm0yaSkKKyNkZWZpbmUgZ2xVbmlmb3JtMml2QVJCCQlNQU5HTEUoVW5pZm9ybTJpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtMml2CQlNQU5HTEUoVW5pZm9ybTJpdikKKyNkZWZpbmUgZ2xVbmlmb3JtMnVpRVhUCQlNQU5HTEUoVW5pZm9ybTJ1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtMnVpdkVYVAkJTUFOR0xFKFVuaWZvcm0ydWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm0zZkFSQgkJTUFOR0xFKFVuaWZvcm0zZkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtM2YJCU1BTkdMRShVbmlmb3JtM2YpCisjZGVmaW5lIGdsVW5pZm9ybTNmdkFSQgkJTUFOR0xFKFVuaWZvcm0zZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTNmdgkJTUFOR0xFKFVuaWZvcm0zZnYpCisjZGVmaW5lIGdsVW5pZm9ybTNpQVJCCQlNQU5HTEUoVW5pZm9ybTNpQVJCKQorI2RlZmluZSBnbFVuaWZvcm0zaQkJTUFOR0xFKFVuaWZvcm0zaSkKKyNkZWZpbmUgZ2xVbmlmb3JtM2l2QVJCCQlNQU5HTEUoVW5pZm9ybTNpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtM2l2CQlNQU5HTEUoVW5pZm9ybTNpdikKKyNkZWZpbmUgZ2xVbmlmb3JtM3VpRVhUCQlNQU5HTEUoVW5pZm9ybTN1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtM3VpdkVYVAkJTUFOR0xFKFVuaWZvcm0zdWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm00ZkFSQgkJTUFOR0xFKFVuaWZvcm00ZkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtNGYJCU1BTkdMRShVbmlmb3JtNGYpCisjZGVmaW5lIGdsVW5pZm9ybTRmdkFSQgkJTUFOR0xFKFVuaWZvcm00ZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybTRmdgkJTUFOR0xFKFVuaWZvcm00ZnYpCisjZGVmaW5lIGdsVW5pZm9ybTRpQVJCCQlNQU5HTEUoVW5pZm9ybTRpQVJCKQorI2RlZmluZSBnbFVuaWZvcm00aQkJTUFOR0xFKFVuaWZvcm00aSkKKyNkZWZpbmUgZ2xVbmlmb3JtNGl2QVJCCQlNQU5HTEUoVW5pZm9ybTRpdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtNGl2CQlNQU5HTEUoVW5pZm9ybTRpdikKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpRVhUCQlNQU5HTEUoVW5pZm9ybTR1aUVYVCkKKyNkZWZpbmUgZ2xVbmlmb3JtNHVpdkVYVAkJTUFOR0xFKFVuaWZvcm00dWl2RVhUKQorI2RlZmluZSBnbFVuaWZvcm1CdWZmZXJFWFQJCU1BTkdMRShVbmlmb3JtQnVmZmVyRVhUKQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyZnZBUkIJCU1BTkdMRShVbmlmb3JtTWF0cml4MmZ2QVJCKQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4MmZ2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgyeDNmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgyeDNmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4Mng0ZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4Mng0ZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDNmdkFSQgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgzZnZBUkIpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDNmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgzZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDN4MmZ2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDN4MmZ2KQorI2RlZmluZSBnbFVuaWZvcm1NYXRyaXgzeDRmdgkJTUFOR0xFKFVuaWZvcm1NYXRyaXgzeDRmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NGZ2QVJCCQlNQU5HTEUoVW5pZm9ybU1hdHJpeDRmdkFSQikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NGZ2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDRmdikKKyNkZWZpbmUgZ2xVbmlmb3JtTWF0cml4NHgyZnYJCU1BTkdMRShVbmlmb3JtTWF0cml4NHgyZnYpCisjZGVmaW5lIGdsVW5pZm9ybU1hdHJpeDR4M2Z2CQlNQU5HTEUoVW5pZm9ybU1hdHJpeDR4M2Z2KQorI2RlZmluZSBnbFVubG9ja0FycmF5c0VYVAkJTUFOR0xFKFVubG9ja0FycmF5c0VYVCkKKyNkZWZpbmUgZ2xVbm1hcEJ1ZmZlckFSQgkJTUFOR0xFKFVubWFwQnVmZmVyQVJCKQorI2RlZmluZSBnbFVubWFwQnVmZmVyCQlNQU5HTEUoVW5tYXBCdWZmZXIpCisjZGVmaW5lIGdsVW5tYXBPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShVbm1hcE9iamVjdEJ1ZmZlckFUSSkKKyNkZWZpbmUgZ2xVcGRhdGVPYmplY3RCdWZmZXJBVEkJCU1BTkdMRShVcGRhdGVPYmplY3RCdWZmZXJBVEkpCisjZGVmaW5lIGdsVXNlUHJvZ3JhbQkJTUFOR0xFKFVzZVByb2dyYW0pCisjZGVmaW5lIGdsVXNlUHJvZ3JhbU9iamVjdEFSQgkJTUFOR0xFKFVzZVByb2dyYW1PYmplY3RBUkIpCisjZGVmaW5lIGdsVmFsaWRhdGVQcm9ncmFtQVJCCQlNQU5HTEUoVmFsaWRhdGVQcm9ncmFtQVJCKQorI2RlZmluZSBnbFZhbGlkYXRlUHJvZ3JhbQkJTUFOR0xFKFZhbGlkYXRlUHJvZ3JhbSkKKyNkZWZpbmUgZ2xWYXJpYW50QXJyYXlPYmplY3RBVEkJCU1BTkdMRShWYXJpYW50QXJyYXlPYmplY3RBVEkpCisjZGVmaW5lIGdsVmFyaWFudGJ2RVhUCQlNQU5HTEUoVmFyaWFudGJ2RVhUKQorI2RlZmluZSBnbFZhcmlhbnRkdkVYVAkJTUFOR0xFKFZhcmlhbnRkdkVYVCkKKyNkZWZpbmUgZ2xWYXJpYW50ZnZFWFQJCU1BTkdMRShWYXJpYW50ZnZFWFQpCisjZGVmaW5lIGdsVmFyaWFudGl2RVhUCQlNQU5HTEUoVmFyaWFudGl2RVhUKQorI2RlZmluZSBnbFZhcmlhbnRQb2ludGVyRVhUCQlNQU5HTEUoVmFyaWFudFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVmFyaWFudHN2RVhUCQlNQU5HTEUoVmFyaWFudHN2RVhUKQorI2RlZmluZSBnbFZhcmlhbnR1YnZFWFQJCU1BTkdMRShWYXJpYW50dWJ2RVhUKQorI2RlZmluZSBnbFZhcmlhbnR1aXZFWFQJCU1BTkdMRShWYXJpYW50dWl2RVhUKQorI2RlZmluZSBnbFZhcmlhbnR1c3ZFWFQJCU1BTkdMRShWYXJpYW50dXN2RVhUKQorI2RlZmluZSBnbFZlcnRleDJkCQlNQU5HTEUoVmVydGV4MmQpCisjZGVmaW5lIGdsVmVydGV4MmR2CQlNQU5HTEUoVmVydGV4MmR2KQorI2RlZmluZSBnbFZlcnRleDJmCQlNQU5HTEUoVmVydGV4MmYpCisjZGVmaW5lIGdsVmVydGV4MmZ2CQlNQU5HTEUoVmVydGV4MmZ2KQorI2RlZmluZSBnbFZlcnRleDJoTlYJCU1BTkdMRShWZXJ0ZXgyaE5WKQorI2RlZmluZSBnbFZlcnRleDJodk5WCQlNQU5HTEUoVmVydGV4Mmh2TlYpCisjZGVmaW5lIGdsVmVydGV4MmkJCU1BTkdMRShWZXJ0ZXgyaSkKKyNkZWZpbmUgZ2xWZXJ0ZXgyaXYJCU1BTkdMRShWZXJ0ZXgyaXYpCisjZGVmaW5lIGdsVmVydGV4MnMJCU1BTkdMRShWZXJ0ZXgycykKKyNkZWZpbmUgZ2xWZXJ0ZXgyc3YJCU1BTkdMRShWZXJ0ZXgyc3YpCisjZGVmaW5lIGdsVmVydGV4M2QJCU1BTkdMRShWZXJ0ZXgzZCkKKyNkZWZpbmUgZ2xWZXJ0ZXgzZHYJCU1BTkdMRShWZXJ0ZXgzZHYpCisjZGVmaW5lIGdsVmVydGV4M2YJCU1BTkdMRShWZXJ0ZXgzZikKKyNkZWZpbmUgZ2xWZXJ0ZXgzZnYJCU1BTkdMRShWZXJ0ZXgzZnYpCisjZGVmaW5lIGdsVmVydGV4M2hOVgkJTUFOR0xFKFZlcnRleDNoTlYpCisjZGVmaW5lIGdsVmVydGV4M2h2TlYJCU1BTkdMRShWZXJ0ZXgzaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXgzaQkJTUFOR0xFKFZlcnRleDNpKQorI2RlZmluZSBnbFZlcnRleDNpdgkJTUFOR0xFKFZlcnRleDNpdikKKyNkZWZpbmUgZ2xWZXJ0ZXgzcwkJTUFOR0xFKFZlcnRleDNzKQorI2RlZmluZSBnbFZlcnRleDNzdgkJTUFOR0xFKFZlcnRleDNzdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0ZAkJTUFOR0xFKFZlcnRleDRkKQorI2RlZmluZSBnbFZlcnRleDRkdgkJTUFOR0xFKFZlcnRleDRkdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0ZgkJTUFOR0xFKFZlcnRleDRmKQorI2RlZmluZSBnbFZlcnRleDRmdgkJTUFOR0xFKFZlcnRleDRmdikKKyNkZWZpbmUgZ2xWZXJ0ZXg0aE5WCQlNQU5HTEUoVmVydGV4NGhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXg0aHZOVgkJTUFOR0xFKFZlcnRleDRodk5WKQorI2RlZmluZSBnbFZlcnRleDRpCQlNQU5HTEUoVmVydGV4NGkpCisjZGVmaW5lIGdsVmVydGV4NGl2CQlNQU5HTEUoVmVydGV4NGl2KQorI2RlZmluZSBnbFZlcnRleDRzCQlNQU5HTEUoVmVydGV4NHMpCisjZGVmaW5lIGdsVmVydGV4NHN2CQlNQU5HTEUoVmVydGV4NHN2KQorI2RlZmluZSBnbFZlcnRleEFycmF5UGFyYW1ldGVyaUFQUExFCQlNQU5HTEUoVmVydGV4QXJyYXlQYXJhbWV0ZXJpQVBQTEUpCisjZGVmaW5lIGdsVmVydGV4QXJyYXlSYW5nZUFQUExFCQlNQU5HTEUoVmVydGV4QXJyYXlSYW5nZUFQUExFKQorI2RlZmluZSBnbFZlcnRleEFycmF5UmFuZ2VOVgkJTUFOR0xFKFZlcnRleEFycmF5UmFuZ2VOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZEFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjFkQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFkCQlNQU5HTEUoVmVydGV4QXR0cmliMWQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWROVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFkTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWR2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMWR2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFkdgkJTUFOR0xFKFZlcnRleEF0dHJpYjFkdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFmQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMWZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMWZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxZnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxZnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWZ2CQlNQU5HTEUoVmVydGV4QXR0cmliMWZ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMWZ2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWhOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFoTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMWh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIxaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxc0FSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjFzQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFzCQlNQU5HTEUoVmVydGV4QXR0cmliMXMpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMXNOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFzTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMXN2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMXN2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjFzdgkJTUFOR0xFKFZlcnRleEF0dHJpYjFzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIxc3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjFzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJkQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMmRBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmQJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZE5WCQlNQU5HTEUoVmVydGV4QXR0cmliMmROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZHZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZHZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmR2CQlNQU5HTEUoVmVydGV4QXR0cmliMmR2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMmR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZgkJTUFOR0xFKFZlcnRleEF0dHJpYjJmKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJmTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJmdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjJmdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyZnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMmZ2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyaE5WCQlNQU5HTEUoVmVydGV4QXR0cmliMmhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyaHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjJodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJzQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliMnNBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMnMJCU1BTkdMRShWZXJ0ZXhBdHRyaWIycykKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyc05WCQlNQU5HTEUoVmVydGV4QXR0cmliMnNOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIyc3ZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIyc3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliMnN2CQlNQU5HTEUoVmVydGV4QXR0cmliMnN2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjJzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliMnN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2RBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZEFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZAkJTUFOR0xFKFZlcnRleEF0dHJpYjNkKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNkTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNkdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjNkdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZHYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZHYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2R2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjNmQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNmCQlNQU5HTEUoVmVydGV4QXR0cmliM2YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNmTlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM2Z2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliM2Z2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNmdgkJTUFOR0xFKFZlcnRleEF0dHJpYjNmdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjNmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNoTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzaE5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliM2h2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM3NBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzc0FSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzcwkJTUFOR0xFKFZlcnRleEF0dHJpYjNzKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNzTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzc05WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjNzdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjNzdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWIzc3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzc3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliM3N2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWIzc3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0YnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0YnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGJ2CQlNQU5HTEUoVmVydGV4QXR0cmliNGJ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRkQVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNGRBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGQJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZE5WCQlNQU5HTEUoVmVydGV4QXR0cmliNGROVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZHZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZHZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGR2CQlNQU5HTEUoVmVydGV4QXR0cmliNGR2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliNGR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZgkJTUFOR0xFKFZlcnRleEF0dHJpYjRmKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRmTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0Zk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRmdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRmdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0ZnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNGZ2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0ZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0aE5WCQlNQU5HTEUoVmVydGV4QXR0cmliNGhOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0aHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjRodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRpdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRpdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0aXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE5idkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROYnZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE5idgkJTUFOR0xFKFZlcnRleEF0dHJpYjROYnYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE5pdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROaXZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE5pdgkJTUFOR0xFKFZlcnRleEF0dHJpYjROaXYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE5zdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROc3ZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE5zdgkJTUFOR0xFKFZlcnRleEF0dHJpYjROc3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51YkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdWJBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51YgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdWIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51YnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnVidkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnVidgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdWJ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdWl2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNE51aXZBUkIpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNE51aXYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0TnVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0TnVzdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjROdXN2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjROdXN2CQlNQU5HTEUoVmVydGV4QXR0cmliNE51c3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHNBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0c0FSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0cwkJTUFOR0xFKFZlcnRleEF0dHJpYjRzKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRzTlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0c05WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjRzdkFSQgkJTUFOR0xFKFZlcnRleEF0dHJpYjRzdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0c3YJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0c3YpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliNHN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0c3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dWJOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1Yk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1YnZBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dWJ2QVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1YnYJCU1BTkdMRShWZXJ0ZXhBdHRyaWI0dWJ2KQorI2RlZmluZSBnbFZlcnRleEF0dHJpYjR1YnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYjR1YnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dWl2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNHVpdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dWl2CQlNQU5HTEUoVmVydGV4QXR0cmliNHVpdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dXN2QVJCCQlNQU5HTEUoVmVydGV4QXR0cmliNHVzdkFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWI0dXN2CQlNQU5HTEUoVmVydGV4QXR0cmliNHVzdikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdEFUSQkJTUFOR0xFKFZlcnRleEF0dHJpYkFycmF5T2JqZWN0QVRJKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkxaUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkxaUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMWl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTFpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMXVpRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTF1aUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMXVpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkxdWl2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkyaUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkyaUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMml2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTJpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMnVpRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTJ1aUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJMnVpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkydWl2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkkzaUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkzaUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJM2l2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTNpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJM3VpRVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTN1aUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJM3VpdkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkkzdWl2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0YnZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNGJ2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0aUVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0aUVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNGl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTRpdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHN2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTRzdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJNHVidkVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYkk0dWJ2RVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWlFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVpRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYkk0dWl2RVhUCQlNQU5HTEUoVmVydGV4QXR0cmliSTR1aXZFWFQpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliSTR1c3ZFWFQJCU1BTkdMRShWZXJ0ZXhBdHRyaWJJNHVzdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJJUG9pbnRlckVYVAkJTUFOR0xFKFZlcnRleEF0dHJpYklQb2ludGVyRVhUKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlBvaW50ZXJBUkIJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQb2ludGVyQVJCKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlBvaW50ZXIJCU1BTkdMRShWZXJ0ZXhBdHRyaWJQb2ludGVyKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYlBvaW50ZXJOVgkJTUFOR0xFKFZlcnRleEF0dHJpYlBvaW50ZXJOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMWR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMWR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczFmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczFmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMxaHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMxaHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMXN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMXN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczJkdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczJkdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMyZnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMyZnZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzMmh2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzMmh2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczJzdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczJzdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMzZHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMzZHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzM2Z2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzM2Z2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczNodk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczNodk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnMzc3ZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnMzc3ZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzNGR2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzNGR2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczRmdk5WCQlNQU5HTEUoVmVydGV4QXR0cmliczRmdk5WKQorI2RlZmluZSBnbFZlcnRleEF0dHJpYnM0aHZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnM0aHZOVikKKyNkZWZpbmUgZ2xWZXJ0ZXhBdHRyaWJzNHN2TlYJCU1BTkdMRShWZXJ0ZXhBdHRyaWJzNHN2TlYpCisjZGVmaW5lIGdsVmVydGV4QXR0cmliczR1YnZOVgkJTUFOR0xFKFZlcnRleEF0dHJpYnM0dWJ2TlYpCisjZGVmaW5lIGdsVmVydGV4QmxlbmRBUkIJCU1BTkdMRShWZXJ0ZXhCbGVuZEFSQikKKyNkZWZpbmUgZ2xWZXJ0ZXhCbGVuZEVudmZBVEkJCU1BTkdMRShWZXJ0ZXhCbGVuZEVudmZBVEkpCisjZGVmaW5lIGdsVmVydGV4QmxlbmRFbnZpQVRJCQlNQU5HTEUoVmVydGV4QmxlbmRFbnZpQVRJKQorI2RlZmluZSBnbFZlcnRleFBvaW50ZXJFWFQJCU1BTkdMRShWZXJ0ZXhQb2ludGVyRVhUKQorI2RlZmluZSBnbFZlcnRleFBvaW50ZXJMaXN0SUJNCQlNQU5HTEUoVmVydGV4UG9pbnRlckxpc3RJQk0pCisjZGVmaW5lIGdsVmVydGV4UG9pbnRlcgkJTUFOR0xFKFZlcnRleFBvaW50ZXIpCisjZGVmaW5lIGdsVmVydGV4UG9pbnRlcnZJTlRFTAkJTUFOR0xFKFZlcnRleFBvaW50ZXJ2SU5URUwpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMWRBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMWZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMWlBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xaUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xaXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xaXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMXNBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xc0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0xc3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0xc3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMmRBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMmZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMmlBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yaUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yaXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yaXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtMnNBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yc0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0yc3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0yc3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM2RBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM2ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM2lBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zaUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zaXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zaXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtM3NBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zc0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW0zc3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW0zc3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNGRBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZEFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00ZHZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZHZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNGZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZkFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00ZnZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00ZnZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNGlBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00aUFUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00aXZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00aXZBVEkpCisjZGVmaW5lIGdsVmVydGV4U3RyZWFtNHNBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00c0FUSSkKKyNkZWZpbmUgZ2xWZXJ0ZXhTdHJlYW00c3ZBVEkJCU1BTkdMRShWZXJ0ZXhTdHJlYW00c3ZBVEkpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0ZkVYVAkJTUFOR0xFKFZlcnRleFdlaWdodGZFWFQpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0ZnZFWFQJCU1BTkdMRShWZXJ0ZXhXZWlnaHRmdkVYVCkKKyNkZWZpbmUgZ2xWZXJ0ZXhXZWlnaHRoTlYJCU1BTkdMRShWZXJ0ZXhXZWlnaHRoTlYpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0aHZOVgkJTUFOR0xFKFZlcnRleFdlaWdodGh2TlYpCisjZGVmaW5lIGdsVmVydGV4V2VpZ2h0UG9pbnRlckVYVAkJTUFOR0xFKFZlcnRleFdlaWdodFBvaW50ZXJFWFQpCisjZGVmaW5lIGdsVmlld3BvcnQJCU1BTkdMRShWaWV3cG9ydCkKKyNkZWZpbmUgZ2xXZWlnaHRidkFSQgkJTUFOR0xFKFdlaWdodGJ2QVJCKQorI2RlZmluZSBnbFdlaWdodGR2QVJCCQlNQU5HTEUoV2VpZ2h0ZHZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0ZnZBUkIJCU1BTkdMRShXZWlnaHRmdkFSQikKKyNkZWZpbmUgZ2xXZWlnaHRpdkFSQgkJTUFOR0xFKFdlaWdodGl2QVJCKQorI2RlZmluZSBnbFdlaWdodFBvaW50ZXJBUkIJCU1BTkdMRShXZWlnaHRQb2ludGVyQVJCKQorI2RlZmluZSBnbFdlaWdodHN2QVJCCQlNQU5HTEUoV2VpZ2h0c3ZBUkIpCisjZGVmaW5lIGdsV2VpZ2h0dWJ2QVJCCQlNQU5HTEUoV2VpZ2h0dWJ2QVJCKQorI2RlZmluZSBnbFdlaWdodHVpdkFSQgkJTUFOR0xFKFdlaWdodHVpdkFSQikKKyNkZWZpbmUgZ2xXZWlnaHR1c3ZBUkIJCU1BTkdMRShXZWlnaHR1c3ZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMmRBUkIJCU1BTkdMRShXaW5kb3dQb3MyZEFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZAkJTUFOR0xFKFdpbmRvd1BvczJkKQorI2RlZmluZSBnbFdpbmRvd1BvczJkTUVTQQkJTUFOR0xFKFdpbmRvd1BvczJkTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZHZBUkIJCU1BTkdMRShXaW5kb3dQb3MyZHZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMmR2CQlNQU5HTEUoV2luZG93UG9zMmR2KQorI2RlZmluZSBnbFdpbmRvd1BvczJkdk1FU0EJCU1BTkdMRShXaW5kb3dQb3MyZHZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJmQVJCCQlNQU5HTEUoV2luZG93UG9zMmZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMmYJCU1BTkdMRShXaW5kb3dQb3MyZikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZk1FU0EJCU1BTkdMRShXaW5kb3dQb3MyZk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMmZ2QVJCCQlNQU5HTEUoV2luZG93UG9zMmZ2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJmdgkJTUFOR0xFKFdpbmRvd1BvczJmdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyZnZNRVNBCQlNQU5HTEUoV2luZG93UG9zMmZ2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyaUFSQgkJTUFOR0xFKFdpbmRvd1BvczJpQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczJpCQlNQU5HTEUoV2luZG93UG9zMmkpCisjZGVmaW5lIGdsV2luZG93UG9zMmlNRVNBCQlNQU5HTEUoV2luZG93UG9zMmlNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczJpdkFSQgkJTUFOR0xFKFdpbmRvd1BvczJpdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MyaXYJCU1BTkdMRShXaW5kb3dQb3MyaXYpCisjZGVmaW5lIGdsV2luZG93UG9zMml2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczJpdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zMnNBUkIJCU1BTkdMRShXaW5kb3dQb3Myc0FSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MycwkJTUFOR0xFKFdpbmRvd1BvczJzKQorI2RlZmluZSBnbFdpbmRvd1BvczJzTUVTQQkJTUFOR0xFKFdpbmRvd1BvczJzTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3Myc3ZBUkIJCU1BTkdMRShXaW5kb3dQb3Myc3ZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zMnN2CQlNQU5HTEUoV2luZG93UG9zMnN2KQorI2RlZmluZSBnbFdpbmRvd1BvczJzdk1FU0EJCU1BTkdMRShXaW5kb3dQb3Myc3ZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNkQVJCCQlNQU5HTEUoV2luZG93UG9zM2RBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM2QJCU1BTkdMRShXaW5kb3dQb3MzZCkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZE1FU0EJCU1BTkdMRShXaW5kb3dQb3MzZE1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM2R2QVJCCQlNQU5HTEUoV2luZG93UG9zM2R2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNkdgkJTUFOR0xFKFdpbmRvd1BvczNkdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZHZNRVNBCQlNQU5HTEUoV2luZG93UG9zM2R2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZkFSQgkJTUFOR0xFKFdpbmRvd1BvczNmQVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNmCQlNQU5HTEUoV2luZG93UG9zM2YpCisjZGVmaW5lIGdsV2luZG93UG9zM2ZNRVNBCQlNQU5HTEUoV2luZG93UG9zM2ZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNmdkFSQgkJTUFOR0xFKFdpbmRvd1BvczNmdkFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzZnYJCU1BTkdMRShXaW5kb3dQb3MzZnYpCisjZGVmaW5lIGdsV2luZG93UG9zM2Z2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczNmdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM2lBUkIJCU1BTkdMRShXaW5kb3dQb3MzaUFSQikKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzaQkJTUFOR0xFKFdpbmRvd1BvczNpKQorI2RlZmluZSBnbFdpbmRvd1BvczNpTUVTQQkJTUFOR0xFKFdpbmRvd1BvczNpTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3MzaXZBUkIJCU1BTkdMRShXaW5kb3dQb3MzaXZBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM2l2CQlNQU5HTEUoV2luZG93UG9zM2l2KQorI2RlZmluZSBnbFdpbmRvd1BvczNpdk1FU0EJCU1BTkdMRShXaW5kb3dQb3MzaXZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczNzQVJCCQlNQU5HTEUoV2luZG93UG9zM3NBUkIpCisjZGVmaW5lIGdsV2luZG93UG9zM3MJCU1BTkdMRShXaW5kb3dQb3MzcykKKyNkZWZpbmUgZ2xXaW5kb3dQb3Mzc01FU0EJCU1BTkdMRShXaW5kb3dQb3Mzc01FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zM3N2QVJCCQlNQU5HTEUoV2luZG93UG9zM3N2QVJCKQorI2RlZmluZSBnbFdpbmRvd1BvczNzdgkJTUFOR0xFKFdpbmRvd1BvczNzdikKKyNkZWZpbmUgZ2xXaW5kb3dQb3Mzc3ZNRVNBCQlNQU5HTEUoV2luZG93UG9zM3N2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0ZE1FU0EJCU1BTkdMRShXaW5kb3dQb3M0ZE1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNGR2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczRkdk1FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNGZNRVNBCQlNQU5HTEUoV2luZG93UG9zNGZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRmdk1FU0EJCU1BTkdMRShXaW5kb3dQb3M0ZnZNRVNBKQorI2RlZmluZSBnbFdpbmRvd1BvczRpTUVTQQkJTUFOR0xFKFdpbmRvd1BvczRpTUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0aXZNRVNBCQlNQU5HTEUoV2luZG93UG9zNGl2TUVTQSkKKyNkZWZpbmUgZ2xXaW5kb3dQb3M0c01FU0EJCU1BTkdMRShXaW5kb3dQb3M0c01FU0EpCisjZGVmaW5lIGdsV2luZG93UG9zNHN2TUVTQQkJTUFOR0xFKFdpbmRvd1BvczRzdk1FU0EpCisjZGVmaW5lIGdsV3JpdGVNYXNrRVhUCQlNQU5HTEUoV3JpdGVNYXNrRVhUKQorCisjZW5kaWYgLyogR0xfTUFOR0xFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2xleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2xleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE5YTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbGV4dC5oCkBAIC0wLDAgKzEsNzI2MCBAQAorI2lmbmRlZiBfX2dsZXh0X2hfCisjZGVmaW5lIF9fZ2xleHRfaF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqIAorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqIAorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqIAorKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKyovCisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZuZGVmIEFQSUVOVFJZCisjZGVmaW5lIEFQSUVOVFJZCisjZW5kaWYKKyNpZm5kZWYgQVBJRU5UUllQCisjZGVmaW5lIEFQSUVOVFJZUCBBUElFTlRSWSAqCisjZW5kaWYKKyNpZm5kZWYgR0xBUEkKKyNkZWZpbmUgR0xBUEkgZXh0ZXJuCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhlYWRlciBmaWxlIHZlcnNpb24gbnVtYmVyLCByZXF1aXJlZCBieSBPcGVuR0wgQUJJIGZvciBMaW51eCAqLworLyogZ2xleHQuaCBsYXN0IHVwZGF0ZWQgMjAwNy8wMi8xMiAqLworLyogQ3VycmVudCB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cub3BlbmdsLm9yZy9yZWdpc3RyeS8gKi8KKyNkZWZpbmUgR0xfR0xFWFRfVkVSU0lPTiAzOQorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8yCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEVfM18zXzIgICAgICAgICAgICAweDgwMzIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84ICAgICAgICAgICAweDgwMzUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzIgICAgICAgIDB4ODAzNgorI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRCAgICAgICAgICAgICAweDgwNkEKKyNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAgIDB4ODA2QgorI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgICAgMHg4MDZDCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgIDB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNEICAgICAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0QgICAgICAgICAgICAgICAweDgwNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSCAgICAgICAgICAgICAgICAgIDB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUiAgICAgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgICAgICAgICAgICAweDgwNzMKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURV8yXzNfM19SRVYgICAgICAgIDB4ODM2MgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81X1JFViAgICAgICAweDgzNjQKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVYgICAgIDB4ODM2NQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFViAgICAgMHg4MzY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViAgICAgICAweDgzNjcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICAgIDB4ODM2OAorI2RlZmluZSBHTF9CR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUwCisjZGVmaW5lIEdMX0JHUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5CisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EICAgICAgICAgICAgICAgIDB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0QgICAgICAgICAgICAgICAgMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTCAgICAgICAgICAgICAweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUwgICAgICAgICAgICAgIDB4ODEzRAorI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9DT0xPUl9DT05UUk9MICAgICAgMHg4MUY4CisjZGVmaW5lIEdMX1NJTkdMRV9DT0xPUiAgICAgICAgICAgICAgICAgICAweDgxRjkKKyNkZWZpbmUgR0xfU0VQQVJBVEVfU1BFQ1VMQVJfQ09MT1IgICAgICAgIDB4ODFGQQorI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX0dSQU5VTEFSSVRZICAweDBCMTMKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9HUkFOVUxBUklUWSAgMHgwQjIzCisjZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKKyNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ltYWdpbmcKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBICAgICAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICAgICAgIDB4ODAwNAorI2RlZmluZSBHTF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgMHg4MDA1CisjZGVmaW5lIEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNworI2RlZmluZSBHTF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA4CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVCAgICAgICAgICAgICAgICAgIDB4ODAwQQorI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgICAgICAgICAgMHg4MDBCCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OXzFEICAgICAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMkQgICAgICAgICAgICAgICAgIDB4ODAxMQorI2RlZmluZSBHTF9TRVBBUkFCTEVfMkQgICAgICAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9NT0RFICAgICAgICAweDgwMTMKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRklMVEVSX1NDQUxFICAgICAgIDB4ODAxNAorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfQklBUyAgICAgICAgMHg4MDE1CisjZGVmaW5lIEdMX1JFRFVDRSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMTYKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fRk9STUFUICAgICAgICAgICAgIDB4ODAxNworI2RlZmluZSBHTF9DT05WT0xVVElPTl9XSURUSCAgICAgICAgICAgICAgMHg4MDE4CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0hFSUdIVCAgICAgICAgICAgICAweDgwMTkKKyNkZWZpbmUgR0xfTUFYX0NPTlZPTFVUSU9OX1dJRFRIICAgICAgICAgIDB4ODAxQQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fSEVJR0hUICAgICAgICAgMHg4MDFCCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX1NDQUxFICAgICAweDgwMUMKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9TQ0FMRSAgIDB4ODAxRAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0JMVUVfU0NBTEUgICAgMHg4MDFFCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQUxQSEFfU0NBTEUgICAweDgwMUYKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfQklBUyAgICAgIDB4ODAyMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX0JJQVMgICAgMHg4MDIxCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fQkxVRV9CSUFTICAgICAweDgwMjIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9CSUFTICAgIDB4ODAyMworI2RlZmluZSBHTF9ISVNUT0dSQU0gICAgICAgICAgICAgICAgICAgICAgMHg4MDI0CisjZGVmaW5lIEdMX1BST1hZX0hJU1RPR1JBTSAgICAgICAgICAgICAgICAweDgwMjUKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1dJRFRIICAgICAgICAgICAgICAgIDB4ODAyNgorI2RlZmluZSBHTF9ISVNUT0dSQU1fRk9STUFUICAgICAgICAgICAgICAgMHg4MDI3CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9SRURfU0laRSAgICAgICAgICAgICAweDgwMjgKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0dSRUVOX1NJWkUgICAgICAgICAgIDB4ODAyOQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQkxVRV9TSVpFICAgICAgICAgICAgMHg4MDJBCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9BTFBIQV9TSVpFICAgICAgICAgICAweDgwMkIKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0xVTUlOQU5DRV9TSVpFICAgICAgIDB4ODAyQworI2RlZmluZSBHTF9ISVNUT0dSQU1fU0lOSyAgICAgICAgICAgICAgICAgMHg4MDJECisjZGVmaW5lIEdMX01JTk1BWCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMkUKKyNkZWZpbmUgR0xfTUlOTUFYX0ZPUk1BVCAgICAgICAgICAgICAgICAgIDB4ODAyRgorI2RlZmluZSBHTF9NSU5NQVhfU0lOSyAgICAgICAgICAgICAgICAgICAgMHg4MDMwCisjZGVmaW5lIEdMX1RBQkxFX1RPT19MQVJHRSAgICAgICAgICAgICAgICAweDgwMzEKKyNkZWZpbmUgR0xfQ09MT1JfTUFUUklYICAgICAgICAgICAgICAgICAgIDB4ODBCMQorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggICAgICAgMHg4MEIyCisjZGVmaW5lIEdMX01BWF9DT0xPUl9NQVRSSVhfU1RBQ0tfREVQVEggICAweDgwQjMKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX1NDQUxFICAgIDB4ODBCNAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9TQ0FMRSAgMHg4MEI1CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0JMVUVfU0NBTEUgICAweDgwQjYKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfU0NBTEUgIDB4ODBCNworI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9SRURfQklBUyAgICAgMHg4MEI4CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX0JJQVMgICAweDgwQjkKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTICAgIDB4ODBCQQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9BTFBIQV9CSUFTICAgMHg4MEJCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAgICAgICAweDgwRDAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSAgIDB4ODBEMQorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRSAgMHg4MEQyCisjZGVmaW5lIEdMX1BST1hZX0NPTE9SX1RBQkxFICAgICAgICAgICAgICAweDgwRDMKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT05WT0xVVElPTl9DT0xPUl9UQUJMRSAweDgwRDQKKyNkZWZpbmUgR0xfUFJPWFlfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEUgMHg4MEQ1CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFICAgICAgICAgICAgICAweDgwRDYKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBUyAgICAgICAgICAgICAgIDB4ODBENworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVQgICAgICAgICAgICAgMHg4MEQ4CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRIICAgICAgICAgICAgICAweDgwRDkKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkUgICAgICAgICAgIDB4ODBEQQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFICAgICAgICAgMHg4MERCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRSAgICAgICAgICAweDgwREMKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRSAgICAgICAgIDB4ODBERAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRSAgICAgMHg4MERFCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFICAgICAweDgwREYKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSICAgICAgICAgICAgICAgIDB4ODE1MQorI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSICAgICAgICAgICAgICAgMHg4MTUzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUiAgICAgICAweDgxNTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV8zCisjZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCisjZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAweDg0RTEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgorI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWCAgICAgMHg4NEUzCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWCAgICAweDg0RTQKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX1RFWFRVUkVfTUFUUklYICAgICAgIDB4ODRFNQorI2RlZmluZSBHTF9UUkFOU1BPU0VfQ09MT1JfTUFUUklYICAgICAgICAgMHg4NEU2CisjZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVQgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBHTF9OT1JNQUxfTUFQICAgICAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQICAgICAgICAgICAgICAgICAweDg1MTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAweDg1MTUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAgICAweDg1MTgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgMHg4NTFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAweDg1MUIKKyNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgIDB4ODUxQworI2RlZmluZSBHTF9DT01QUkVTU0VEX0FMUEhBICAgICAgICAgICAgICAgMHg4NEU5CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFICAgICAgICAgICAweDg0RUEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQUxQSEEgICAgIDB4ODRFQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX0lOVEVOU0lUWSAgICAgICAgICAgMHg4NEVDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCICAgICAgICAgICAgICAgICAweDg0RUQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBICAgICAgICAgICAgICAgIDB4ODRFRQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTSU9OX0hJTlQgICAgICAgMHg4NEVGCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRF9JTUFHRV9TSVpFICAweDg2QTAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEICAgICAgICAgICAgIDB4ODZBMQorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSICAgICAgICAgICAgICAgIDB4ODEyRAorI2RlZmluZSBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQiAgICAgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NPVVJDRTFfUkdCICAgICAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEEgICAgICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5QQorI2RlZmluZSBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEU3CisjZGVmaW5lIEdMX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgICAgICAweDg1NzYKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgIDB4ODU3NworI2RlZmluZSBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc4CisjZGVmaW5lIEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg2QUUKKyNkZWZpbmUgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzQKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM5CisjZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0EKKyNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQgorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgIDB4ODEyOAorI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgMHg4MTI5CisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAweDgxOTEKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgIDB4ODE5MgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNiAgICAgICAgICAgICAgMHg4MUE1CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0ICAgICAgICAgICAgICAweDgxQTYKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzIgICAgICAgICAgICAgIDB4ODFBNworI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgMHg4MzcwCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX1NPVVJDRSAgICAgICAgICAweDg0NTAKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEUgICAgICAgICAgICAgICAgIDB4ODQ1MQorI2RlZmluZSBHTF9GUkFHTUVOVF9ERVBUSCAgICAgICAgICAgICAgICAgMHg4NDUyCisjZGVmaW5lIEdMX0NVUlJFTlRfRk9HX0NPT1JESU5BVEUgICAgICAgICAweDg0NTMKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfVFlQRSAgICAgIDB4ODQ1NAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9TVFJJREUgICAgMHg4NDU1CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1BPSU5URVIgICAweDg0NTYKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVkgICAgICAgICAgIDB4ODQ1NworI2RlZmluZSBHTF9DT0xPUl9TVU0gICAgICAgICAgICAgICAgICAgICAgMHg4NDU4CisjZGVmaW5lIEdMX0NVUlJFTlRfU0VDT05EQVJZX0NPTE9SICAgICAgICAweDg0NTkKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1NJWkUgICAgIDB4ODQ1QQorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfVFlQRSAgICAgMHg4NDVCCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9TVFJJREUgICAweDg0NUMKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1BPSU5URVIgIDB4ODQ1RAorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVkgICAgICAgICAgMHg4NDVFCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0xPRF9CSUFTICAgICAgICAgICAweDg0RkQKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTCAgICAgICAgIDB4ODUwMAorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTICAgICAgICAgICAgICAgMHg4NTAxCisjZGVmaW5lIEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1NJWkUgICAgICAgICAgICAgMHg4ODRBCisjZGVmaW5lIEdMX0RFUFRIX1RFWFRVUkVfTU9ERSAgICAgICAgICAgICAweDg4NEIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX01PREUgICAgICAgICAgIDB4ODg0QworI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQyAgICAgICAgICAgMHg4ODRECisjZGVmaW5lIEdMX0NPTVBBUkVfUl9UT19URVhUVVJFICAgICAgICAgICAweDg4NEUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV81CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9RVUVSWV9DT1VOVEVSX0JJVFMgICAgICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfUVVFUlkgICAgICAgICAgICAgICAgICAweDg4NjUKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUICAgICAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICAgICAgICAgMHg4ODY3CisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MworI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgMHg4ODk0CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAweDg4OTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgIDB4ODg5NgorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgMHg4ODk3CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAweDg4OTgKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgIDB4ODg5OQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HIDB4ODg5QQorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlCCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUMKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlECisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAweDg4OUUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUYKKyNkZWZpbmUgR0xfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOAorI2RlZmluZSBHTF9XUklURV9PTkxZICAgICAgICAgICAgICAgICAgICAgMHg4OEI5CisjZGVmaW5lIEdMX1JFQURfV1JJVEUgICAgICAgICAgICAgICAgICAgICAweDg4QkEKKyNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTUyAgICAgICAgICAgICAgICAgIDB4ODhCQgorI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEICAgICAgICAgICAgICAgICAgMHg4OEJDCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUiAgICAgICAgICAgICAweDg4QkQKKyNkZWZpbmUgR0xfU1RSRUFNX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFMAorI2RlZmluZSBHTF9TVFJFQU1fUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEUxCisjZGVmaW5lIEdMX1NUUkVBTV9DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTIKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9TVEFUSUNfUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEU1CisjZGVmaW5lIEdMX1NUQVRJQ19DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTYKKyNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDB4ODhFOAorI2RlZmluZSBHTF9EWU5BTUlDX1JFQUQgICAgICAgICAgICAgICAgICAgMHg4OEU5CisjZGVmaW5lIEdMX0RZTkFNSUNfQ09QWSAgICAgICAgICAgICAgICAgICAweDg4RUEKKyNkZWZpbmUgR0xfU0FNUExFU19QQVNTRUQgICAgICAgICAgICAgICAgIDB4ODkxNAorI2RlZmluZSBHTF9GT0dfQ09PUkRfU1JDICAgICAgICAgICAgICAgICAgR0xfRk9HX0NPT1JESU5BVEVfU09VUkNFCisjZGVmaW5lIEdMX0ZPR19DT09SRCAgICAgICAgICAgICAgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURQorI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRCAgICAgICAgICAgICAgR0xfQ1VSUkVOVF9GT0dfQ09PUkRJTkFURQorI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfVFlQRQorI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfU1RSSURFICAgICAgICAgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFCisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWV9QT0lOVEVSICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9QT0lOVEVSCisjZGVmaW5lIEdMX0ZPR19DT09SRF9BUlJBWSAgICAgICAgICAgICAgICBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWQorI2RlZmluZSBHTF9GT0dfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfQlVGRkVSX0JJTkRJTkcKKyNkZWZpbmUgR0xfU1JDMF9SR0IgICAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTBfUkdCCisjZGVmaW5lIEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICBHTF9TT1VSQ0UxX1JHQgorI2RlZmluZSBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgR0xfU09VUkNFMl9SR0IKKyNkZWZpbmUgR0xfU1JDMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTBfQUxQSEEKKyNkZWZpbmUgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTFfQUxQSEEKKyNkZWZpbmUgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIEdMX1NPVVJDRTJfQUxQSEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMl8wCisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICBHTF9CTEVORF9FUVVBVElPTgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQgICAgMHg4NjIyCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAgICAgICAweDg2MjMKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUgICAgIDB4ODYyNAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUgICAgICAgMHg4NjI1CisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICAweDg2MjYKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRSAgICAgIDB4ODY0MgorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERSAgICAgICAgMHg4NjQzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAweDg2NDUKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZVTkMgICAgICAgICAgICAgIDB4ODgwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRkFJTCAgICAgICAgICAgICAgMHg4ODAxCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwgICAweDg4MDIKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUyAgIDB4ODgwMworI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTICAgICAgICAgICAgICAgMHg4ODI0CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMCAgICAgICAgICAgICAgICAgICAweDg4MjUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxICAgICAgICAgICAgICAgICAgIDB4ODgyNgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjIgICAgICAgICAgICAgICAgICAgMHg4ODI3CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMyAgICAgICAgICAgICAgICAgICAweDg4MjgKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI0ICAgICAgICAgICAgICAgICAgIDB4ODgyOQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjUgICAgICAgICAgICAgICAgICAgMHg4ODJBCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNiAgICAgICAgICAgICAgICAgICAweDg4MkIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI3ICAgICAgICAgICAgICAgICAgIDB4ODgyQworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjggICAgICAgICAgICAgICAgICAgMHg4ODJECisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOSAgICAgICAgICAgICAgICAgICAweDg4MkUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMCAgICAgICAgICAgICAgICAgIDB4ODgyRgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExICAgICAgICAgICAgICAgICAgMHg4ODMwCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTIgICAgICAgICAgICAgICAgICAweDg4MzEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMyAgICAgICAgICAgICAgICAgIDB4ODgzMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0ICAgICAgICAgICAgICAgICAgMHg4ODMzCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTUgICAgICAgICAgICAgICAgICAweDg4MzQKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgIDB4ODgzRAorI2RlZmluZSBHTF9QT0lOVF9TUFJJVEUgICAgICAgICAgICAgICAgICAgMHg4ODYxCisjZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0UgICAgICAgICAgICAgICAgICAweDg4NjIKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTICAgICAgICAgICAgIDB4ODg2OQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQgMHg4ODZBCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0NPT1JEUyAgICAgICAgICAgICAweDg4NzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAgICAgIDB4ODg3MgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVIgICAgICAgICAgICAgICAgMHg4QjMwCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVIgICAgICAgICAgICAgICAgICAweDhCMzEKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhCNDkKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgIDB4OEI0QQorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19GTE9BVFMgICAgICAgICAgICAgMHg4QjRCCisjZGVmaW5lIEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyAweDhCNEMKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QjRECisjZGVmaW5lIEdMX1NIQURFUl9UWVBFICAgICAgICAgICAgICAgICAgICAweDhCNEYKKyNkZWZpbmUgR0xfRkxPQVRfVkVDMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1MAorI2RlZmluZSBHTF9GTE9BVF9WRUMzICAgICAgICAgICAgICAgICAgICAgMHg4QjUxCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzQgICAgICAgICAgICAgICAgICAgICAweDhCNTIKKyNkZWZpbmUgR0xfSU5UX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1MworI2RlZmluZSBHTF9JTlRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU0CisjZGVmaW5lIEdMX0lOVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDhCNTUKKyNkZWZpbmUgR0xfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NgorI2RlZmluZSBHTF9CT09MX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgMHg4QjU3CisjZGVmaW5lIEdMX0JPT0xfVkVDMyAgICAgICAgICAgICAgICAgICAgICAweDhCNTgKKyNkZWZpbmUgR0xfQk9PTF9WRUM0ICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OQorI2RlZmluZSBHTF9GTE9BVF9NQVQyICAgICAgICAgICAgICAgICAgICAgMHg4QjVBCisjZGVmaW5lIEdMX0ZMT0FUX01BVDMgICAgICAgICAgICAgICAgICAgICAweDhCNUIKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1QworI2RlZmluZSBHTF9TQU1QTEVSXzFEICAgICAgICAgICAgICAgICAgICAgMHg4QjVECisjZGVmaW5lIEdMX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgICAgICAweDhCNUUKKyNkZWZpbmUgR0xfU0FNUExFUl8zRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RgorI2RlZmluZSBHTF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAgICAgMHg4QjYwCisjZGVmaW5lIEdMX1NBTVBMRVJfMURfU0hBRE9XICAgICAgICAgICAgICAweDhCNjEKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9TSEFET1cgICAgICAgICAgICAgIDB4OEI2MgorI2RlZmluZSBHTF9ERUxFVEVfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg4QjgwCisjZGVmaW5lIEdMX0NPTVBJTEVfU1RBVFVTICAgICAgICAgICAgICAgICAweDhCODEKKyNkZWZpbmUgR0xfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4OEI4MgorI2RlZmluZSBHTF9WQUxJREFURV9TVEFUVVMgICAgICAgICAgICAgICAgMHg4QjgzCisjZGVmaW5lIEdMX0lORk9fTE9HX0xFTkdUSCAgICAgICAgICAgICAgICAweDhCODQKKyNkZWZpbmUgR0xfQVRUQUNIRURfU0hBREVSUyAgICAgICAgICAgICAgIDB4OEI4NQorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STVMgICAgICAgICAgICAgICAgMHg4Qjg2CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggICAgICAweDhCODcKKyNkZWZpbmUgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEggICAgICAgICAgIDB4OEI4OAorI2RlZmluZSBHTF9BQ1RJVkVfQVRUUklCVVRFUyAgICAgICAgICAgICAgMHg4Qjg5CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCAgICAweDhCOEEKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVCAweDhCOEIKKyNkZWZpbmUgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OICAgICAgIDB4OEI4QworI2RlZmluZSBHTF9DVVJSRU5UX1BST0dSQU0gICAgICAgICAgICAgICAgMHg4QjhECisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9DT09SRF9PUklHSU4gICAgICAweDhDQTAKKyNkZWZpbmUgR0xfTE9XRVJfTEVGVCAgICAgICAgICAgICAgICAgICAgIDB4OENBMQorI2RlZmluZSBHTF9VUFBFUl9MRUZUICAgICAgICAgICAgICAgICAgICAgMHg4Q0EyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19SRUYgICAgICAgICAgICAgICAweDhDQTMKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgICAgICAgIDB4OENBNAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICAgICAgICAgMHg4Q0E1CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzJfMQorI2RlZmluZSBHTF9DVVJSRU5UX1JBU1RFUl9TRUNPTkRBUllfQ09MT1IgMHg4NDVGCisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSICAgICAgICAgICAgICAweDg4RUIKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUiAgICAgICAgICAgIDB4ODhFQworI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HICAgICAgMHg4OEVECisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElORyAgICAweDg4RUYKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMngzICAgICAgICAgICAgICAgICAgIDB4OEI2NQorI2RlZmluZSBHTF9GTE9BVF9NQVQyeDQgICAgICAgICAgICAgICAgICAgMHg4QjY2CisjZGVmaW5lIEdMX0ZMT0FUX01BVDN4MiAgICAgICAgICAgICAgICAgICAweDhCNjcKKyNkZWZpbmUgR0xfRkxPQVRfTUFUM3g0ICAgICAgICAgICAgICAgICAgIDB4OEI2OAorI2RlZmluZSBHTF9GTE9BVF9NQVQ0eDIgICAgICAgICAgICAgICAgICAgMHg4QjY5CisjZGVmaW5lIEdMX0ZMT0FUX01BVDR4MyAgICAgICAgICAgICAgICAgICAweDhCNkEKKyNkZWZpbmUgR0xfU1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MAorI2RlZmluZSBHTF9TUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQxCisjZGVmaW5lIEdMX1NSR0JfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDhDNDIKKyNkZWZpbmUgR0xfU1JHQjhfQUxQSEE4ICAgICAgICAgICAgICAgICAgIDB4OEM0MworI2RlZmluZSBHTF9TTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgMHg4QzQ0CisjZGVmaW5lIEdMX1NMVU1JTkFOQ0U4X0FMUEhBOCAgICAgICAgICAgICAweDhDNDUKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgIDB4OEM0NgorI2RlZmluZSBHTF9TTFVNSU5BTkNFOCAgICAgICAgICAgICAgICAgICAgMHg4QzQ3CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQiAgICAgICAgICAgICAgICAweDhDNDgKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBICAgICAgICAgIDB4OEM0OQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0UgICAgICAgICAgMHg4QzRBCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0xVTUlOQU5DRV9BTFBIQSAgICAweDhDNEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXRleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRTBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyX0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTNfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTZfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFN19BUkIgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4X0FSQiAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTlfQVJCICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTBfQVJCICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMV9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTNfQVJCICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNF9BUkIgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1X0FSQiAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTZfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxN19BUkIgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTlfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMF9BUkIgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjJfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyM19BUkIgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjVfQVJCICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNl9BUkIgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3X0FSQiAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjhfQVJCICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOV9BUkIgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwX0FSQiAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzFfQVJCICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFX0FSQiAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFX0FSQiAgICAgIDB4ODRFMQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9VTklUU19BUkIgICAgICAgICAgMHg4NEUyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdHJhbnNwb3NlX21hdHJpeAorI2RlZmluZSBHTF9UUkFOU1BPU0VfTU9ERUxWSUVXX01BVFJJWF9BUkIgMHg4NEUzCisjZGVmaW5lIEdMX1RSQU5TUE9TRV9QUk9KRUNUSU9OX01BVFJJWF9BUkIgMHg4NEU0CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9URVhUVVJFX01BVFJJWF9BUkIgICAweDg0RTUKKyNkZWZpbmUgR0xfVFJBTlNQT1NFX0NPTE9SX01BVFJJWF9BUkIgICAgIDB4ODRFNgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0FSQiAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFX0FSQiAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FX0FSQiAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9BUkIgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfQVJCICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRV9BUkIgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVF9BUkIgICAgIDB4ODBBQgorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CSVRfQVJCICAgICAgICAgICAgMHgyMDAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2FkZAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAKKyNkZWZpbmUgR0xfTk9STUFMX01BUF9BUkIgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9BUkIgICAgICAgICAgICAgMHg4NTEyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCICAgICAgICAgICAweDg1MTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQX0FSQiAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfQVJCIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfQVJCIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfQVJCIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfQVJCIDB4ODUxQQorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX0NVQkVfTUFQX0FSQiAgICAgMHg4NTFCCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfQVJCICAweDg1MUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2NvbXByZXNzaW9uCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfQUxQSEFfQVJCICAgICAgICAgICAweDg0RTkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9MVU1JTkFOQ0VfQVJCICAgICAgIDB4ODRFQQorI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9BTFBIQV9BUkIgMHg4NEVCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfSU5URU5TSVRZX0FSQiAgICAgICAweDg0RUMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfQVJCICAgICAgICAgICAgIDB4ODRFRAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVJCICAgICAgICAgICAgMHg4NEVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NJT05fSElOVF9BUkIgICAweDg0RUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QUkVTU0VEX0lNQUdFX1NJWkVfQVJCIDB4ODZBMAorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBSRVNTRURfQVJCICAgICAgICAgMHg4NkExCisjZGVmaW5lIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU19BUkIgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTX0FSQiAweDg2QTMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVJfQVJCICAgICAgICAgICAgMHg4MTJECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9BUkIgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX0FSQiAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9BUkIgIDB4ODEyOAorI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2JsZW5kCisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JVFNfQVJCICAgICAgICAgICAweDg2QTQKKyNkZWZpbmUgR0xfQUNUSVZFX1ZFUlRFWF9VTklUU19BUkIgICAgICAgIDB4ODZBNQorI2RlZmluZSBHTF9XRUlHSFRfU1VNX1VOSVRZX0FSQiAgICAgICAgICAgMHg4NkE2CisjZGVmaW5lIEdMX1ZFUlRFWF9CTEVORF9BUkIgICAgICAgICAgICAgICAweDg2QTcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9XRUlHSFRfQVJCICAgICAgICAgICAgIDB4ODZBOAorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9BUkIgICAgICAgICAgMHg4NkE5CisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfQVJCICAgICAgICAweDg2QUEKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1NJWkVfQVJCICAgICAgICAgIDB4ODZBQgorI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9BUkIgICAgICAgMHg4NkFDCisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9BUkIgICAgICAgICAgICAgICAweDg2QUQKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9BUkIgICAgICAgICAgICAgICAgIDB4MTcwMAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX0FSQiAgICAgICAgICAgICAgICAgMHg4NTBBCisjZGVmaW5lIEdMX01PREVMVklFVzJfQVJCICAgICAgICAgICAgICAgICAweDg3MjIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXM19BUkIgICAgICAgICAgICAgICAgIDB4ODcyMworI2RlZmluZSBHTF9NT0RFTFZJRVc0X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI0CisjZGVmaW5lIEdMX01PREVMVklFVzVfQVJCICAgICAgICAgICAgICAgICAweDg3MjUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXNl9BUkIgICAgICAgICAgICAgICAgIDB4ODcyNgorI2RlZmluZSBHTF9NT0RFTFZJRVc3X0FSQiAgICAgICAgICAgICAgICAgMHg4NzI3CisjZGVmaW5lIEdMX01PREVMVklFVzhfQVJCICAgICAgICAgICAgICAgICAweDg3MjgKKyNkZWZpbmUgR0xfTU9ERUxWSUVXOV9BUkIgICAgICAgICAgICAgICAgIDB4ODcyOQorI2RlZmluZSBHTF9NT0RFTFZJRVcxMF9BUkIgICAgICAgICAgICAgICAgMHg4NzJBCisjZGVmaW5lIEdMX01PREVMVklFVzExX0FSQiAgICAgICAgICAgICAgICAweDg3MkIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTJfQVJCICAgICAgICAgICAgICAgIDB4ODcyQworI2RlZmluZSBHTF9NT0RFTFZJRVcxM19BUkIgICAgICAgICAgICAgICAgMHg4NzJECisjZGVmaW5lIEdMX01PREVMVklFVzE0X0FSQiAgICAgICAgICAgICAgICAweDg3MkUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMTVfQVJCICAgICAgICAgICAgICAgIDB4ODcyRgorI2RlZmluZSBHTF9NT0RFTFZJRVcxNl9BUkIgICAgICAgICAgICAgICAgMHg4NzMwCisjZGVmaW5lIEdMX01PREVMVklFVzE3X0FSQiAgICAgICAgICAgICAgICAweDg3MzEKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMThfQVJCICAgICAgICAgICAgICAgIDB4ODczMgorI2RlZmluZSBHTF9NT0RFTFZJRVcxOV9BUkIgICAgICAgICAgICAgICAgMHg4NzMzCisjZGVmaW5lIEdMX01PREVMVklFVzIwX0FSQiAgICAgICAgICAgICAgICAweDg3MzQKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjFfQVJCICAgICAgICAgICAgICAgIDB4ODczNQorI2RlZmluZSBHTF9NT0RFTFZJRVcyMl9BUkIgICAgICAgICAgICAgICAgMHg4NzM2CisjZGVmaW5lIEdMX01PREVMVklFVzIzX0FSQiAgICAgICAgICAgICAgICAweDg3MzcKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjRfQVJCICAgICAgICAgICAgICAgIDB4ODczOAorI2RlZmluZSBHTF9NT0RFTFZJRVcyNV9BUkIgICAgICAgICAgICAgICAgMHg4NzM5CisjZGVmaW5lIEdMX01PREVMVklFVzI2X0FSQiAgICAgICAgICAgICAgICAweDg3M0EKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMjdfQVJCICAgICAgICAgICAgICAgIDB4ODczQgorI2RlZmluZSBHTF9NT0RFTFZJRVcyOF9BUkIgICAgICAgICAgICAgICAgMHg4NzNDCisjZGVmaW5lIEdMX01PREVMVklFVzI5X0FSQiAgICAgICAgICAgICAgICAweDg3M0QKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMzBfQVJCICAgICAgICAgICAgICAgIDB4ODczRQorI2RlZmluZSBHTF9NT0RFTFZJRVczMV9BUkIgICAgICAgICAgICAgICAgMHg4NzNGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfTUFUUklYX1BBTEVUVEVfQVJCICAgICAgICAgICAgIDB4ODg0MAorI2RlZmluZSBHTF9NQVhfTUFUUklYX1BBTEVUVEVfU1RBQ0tfREVQVEhfQVJCIDB4ODg0MQorI2RlZmluZSBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19BUkIgICAgICAgMHg4ODQyCisjZGVmaW5lIEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfQVJCICAgICAweDg4NDMKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX0FSQiAgICAgICAgIDB4ODg0NAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9JTkRFWF9BUkIgICAgICAgMHg4ODQ1CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX0FSQiAgICAweDg4NDYKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfQVJCICAgIDB4ODg0NworI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX0FSQiAgMHg4ODQ4CisjZGVmaW5lIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX0FSQiAweDg4NDkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jb21iaW5lCisjZGVmaW5lIEdMX0NPTUJJTkVfQVJCICAgICAgICAgICAgICAgICAgICAweDg1NzAKKyNkZWZpbmUgR0xfQ09NQklORV9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NTcyCisjZGVmaW5lIEdMX1NPVVJDRTBfUkdCX0FSQiAgICAgICAgICAgICAgICAweDg1ODAKKyNkZWZpbmUgR0xfU09VUkNFMV9SR0JfQVJCICAgICAgICAgICAgICAgIDB4ODU4MQorI2RlZmluZSBHTF9TT1VSQ0UyX1JHQl9BUkIgICAgICAgICAgICAgICAgMHg4NTgyCisjZGVmaW5lIEdMX1NPVVJDRTBfQUxQSEFfQVJCICAgICAgICAgICAgICAweDg1ODgKKyNkZWZpbmUgR0xfU09VUkNFMV9BTFBIQV9BUkIgICAgICAgICAgICAgIDB4ODU4OQorI2RlZmluZSBHTF9TT1VSQ0UyX0FMUEhBX0FSQiAgICAgICAgICAgICAgMHg4NThBCisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQl9BUkIgICAgICAgICAgICAgICAweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCX0FSQiAgICAgICAgICAgICAgIDB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0JfQVJCICAgICAgICAgICAgICAgMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBX0FSQiAgICAgICAgICAgICAweDg1OTgKKyNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEFfQVJCICAgICAgICAgICAgIDB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQV9BUkIgICAgICAgICAgICAgMHg4NTlBCisjZGVmaW5lIEdMX1JHQl9TQ0FMRV9BUkIgICAgICAgICAgICAgICAgICAweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRF9BUkIgICAgICAgICAgICAgICAgIDB4ODU3NAorI2RlZmluZSBHTF9JTlRFUlBPTEFURV9BUkIgICAgICAgICAgICAgICAgMHg4NTc1CisjZGVmaW5lIEdMX1NVQlRSQUNUX0FSQiAgICAgICAgICAgICAgICAgICAweDg0RTcKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODU3NgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX0FSQiAgICAgICAgICAgICAgMHg4NTc3CisjZGVmaW5lIEdMX1BSRVZJT1VTX0FSQiAgICAgICAgICAgICAgICAgICAweDg1NzgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9jcm9zc2JhcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZW52X2RvdDMKKyNkZWZpbmUgR0xfRE9UM19SR0JfQVJCICAgICAgICAgICAgICAgICAgIDB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkFfQVJCICAgICAgICAgICAgICAgICAgMHg4NkFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUX0FSQiAgICAgICAgICAgIDB4ODM3MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTZfQVJCICAgICAgICAgIDB4ODFBNQorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNF9BUkIgICAgICAgICAgMHg4MUE2CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyX0FSQiAgICAgICAgICAweDgxQTcKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9TSVpFX0FSQiAgICAgICAgIDB4ODg0QQorI2RlZmluZSBHTF9ERVBUSF9URVhUVVJFX01PREVfQVJCICAgICAgICAgMHg4ODRCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFX0FSQiAgICAgICAweDg4NEMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkNfQVJCICAgICAgIDB4ODg0RAorI2RlZmluZSBHTF9DT01QQVJFX1JfVE9fVEVYVFVSRV9BUkIgICAgICAgMHg4ODRFCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZBSUxfVkFMVUVfQVJCIDB4ODBCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3dpbmRvd19wb3MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfcHJvZ3JhbQorI2RlZmluZSBHTF9DT0xPUl9TVU1fQVJCICAgICAgICAgICAgICAgICAgMHg4NDU4CisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiAgICAgICAgICAgICAweDg2MjAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEX0FSQiAweDg2MjIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFX0FSQiAgIDB4ODYyMworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERV9BUkIgMHg4NjI0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRV9BUkIgICAweDg2MjUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCX0FSQiAgICAgIDB4ODYyNgorI2RlZmluZSBHTF9QUk9HUkFNX0xFTkdUSF9BUkIgICAgICAgICAgICAgMHg4NjI3CisjZGVmaW5lIEdMX1BST0dSQU1fU1RSSU5HX0FSQiAgICAgICAgICAgICAweDg2MjgKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTUFUUklYX1NUQUNLX0RFUFRIX0FSQiAweDg2MkUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTUFUUklDRVNfQVJCICAgICAgIDB4ODYyRgorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9TVEFDS19ERVBUSF9BUkIgMHg4NjQwCisjZGVmaW5lIEdMX0NVUlJFTlRfTUFUUklYX0FSQiAgICAgICAgICAgICAweDg2NDEKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRV9BUkIgIDB4ODY0MgorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9UV09fU0lERV9BUkIgICAgMHg4NjQzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUl9BUkIgMHg4NjQ1CisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fQVJCICAgICAweDg2NEIKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5ESU5HX0FSQiAgICAgICAgICAgIDB4ODY3NworI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUVFJJQlNfQVJCICAgICAgICAgMHg4ODY5CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRF9BUkIgMHg4ODZBCisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfU1RSSU5HX0FSQiAgICAgICAweDg4NzQKKyNkZWZpbmUgR0xfUFJPR1JBTV9GT1JNQVRfQVNDSUlfQVJCICAgICAgIDB4ODg3NQorI2RlZmluZSBHTF9QUk9HUkFNX0ZPUk1BVF9BUkIgICAgICAgICAgICAgMHg4ODc2CisjZGVmaW5lIEdMX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAgICAgICAweDg4QTAKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fSU5TVFJVQ1RJT05TX0FSQiAgIDB4ODhBMQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9JTlNUUlVDVElPTlNfQVJCIDB4ODhBMgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfSU5TVFJVQ1RJT05TX0FSQiAweDg4QTMKKyNkZWZpbmUgR0xfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgICAgICAgIDB4ODhBNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URU1QT1JBUklFU19BUkIgICAgMHg4OEE1CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAweDg4QTYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFTVBPUkFSSUVTX0FSQiAweDg4QTcKKyNkZWZpbmUgR0xfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAgICAgICAgIDB4ODhBOAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9QQVJBTUVURVJTX0FSQiAgICAgMHg4OEE5CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCICAweDg4QUEKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1BBUkFNRVRFUlNfQVJCIDB4ODhBQgorI2RlZmluZSBHTF9QUk9HUkFNX0FUVFJJQlNfQVJCICAgICAgICAgICAgMHg4OEFDCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FUVFJJQlNfQVJCICAgICAgICAweDg4QUQKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgICAgIDB4ODhBRQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfQVRUUklCU19BUkIgMHg4OEFGCisjZGVmaW5lIEdMX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCICAweDg4QjAKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQUREUkVTU19SRUdJU1RFUlNfQVJCIDB4ODhCMQorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgMHg4OEIyCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9BRERSRVNTX1JFR0lTVEVSU19BUkIgMHg4OEIzCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfQVJCIDB4ODhCNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9FTlZfUEFSQU1FVEVSU19BUkIgMHg4OEI1CisjZGVmaW5lIEdMX1BST0dSQU1fVU5ERVJfTkFUSVZFX0xJTUlUU19BUkIgMHg4OEI2CisjZGVmaW5lIEdMX1RSQU5TUE9TRV9DVVJSRU5UX01BVFJJWF9BUkIgICAweDg4QjcKKyNkZWZpbmUgR0xfTUFUUklYMF9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMAorI2RlZmluZSBHTF9NQVRSSVgxX0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEMxCisjZGVmaW5lIEdMX01BVFJJWDJfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzIKKyNkZWZpbmUgR0xfTUFUUklYM19BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDMworI2RlZmluZSBHTF9NQVRSSVg0X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM0CisjZGVmaW5lIEdMX01BVFJJWDVfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzUKKyNkZWZpbmUgR0xfTUFUUklYNl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDNgorI2RlZmluZSBHTF9NQVRSSVg3X0FSQiAgICAgICAgICAgICAgICAgICAgMHg4OEM3CisjZGVmaW5lIEdMX01BVFJJWDhfQVJCICAgICAgICAgICAgICAgICAgICAweDg4QzgKKyNkZWZpbmUgR0xfTUFUUklYOV9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODhDOQorI2RlZmluZSBHTF9NQVRSSVgxMF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OENBCisjZGVmaW5lIEdMX01BVFJJWDExX0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0IKKyNkZWZpbmUgR0xfTUFUUklYMTJfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDQworI2RlZmluZSBHTF9NQVRSSVgxM19BUkIgICAgICAgICAgICAgICAgICAgMHg4OENECisjZGVmaW5lIEdMX01BVFJJWDE0X0FSQiAgICAgICAgICAgICAgICAgICAweDg4Q0UKKyNkZWZpbmUgR0xfTUFUUklYMTVfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhDRgorI2RlZmluZSBHTF9NQVRSSVgxNl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQwCisjZGVmaW5lIEdMX01BVFJJWDE3X0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDEKKyNkZWZpbmUgR0xfTUFUUklYMThfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEMgorI2RlZmluZSBHTF9NQVRSSVgxOV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQzCisjZGVmaW5lIEdMX01BVFJJWDIwX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDQKKyNkZWZpbmUgR0xfTUFUUklYMjFfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhENQorI2RlZmluZSBHTF9NQVRSSVgyMl9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ2CisjZGVmaW5lIEdMX01BVFJJWDIzX0FSQiAgICAgICAgICAgICAgICAgICAweDg4RDcKKyNkZWZpbmUgR0xfTUFUUklYMjRfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEOAorI2RlZmluZSBHTF9NQVRSSVgyNV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OEQ5CisjZGVmaW5lIEdMX01BVFJJWDI2X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REEKKyNkZWZpbmUgR0xfTUFUUklYMjdfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhEQgorI2RlZmluZSBHTF9NQVRSSVgyOF9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERDCisjZGVmaW5lIEdMX01BVFJJWDI5X0FSQiAgICAgICAgICAgICAgICAgICAweDg4REQKKyNkZWZpbmUgR0xfTUFUUklYMzBfQVJCICAgICAgICAgICAgICAgICAgIDB4ODhERQorI2RlZmluZSBHTF9NQVRSSVgzMV9BUkIgICAgICAgICAgICAgICAgICAgMHg4OERGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbQorI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiAgICAgICAgICAgMHg4ODA0CisjZGVmaW5lIEdMX1BST0dSQU1fQUxVX0lOU1RSVUNUSU9OU19BUkIgICAweDg4MDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAgIDB4ODgwNgorI2RlZmluZSBHTF9QUk9HUkFNX1RFWF9JTkRJUkVDVElPTlNfQVJCICAgMHg4ODA3CisjZGVmaW5lIEdMX1BST0dSQU1fTkFUSVZFX0FMVV9JTlNUUlVDVElPTlNfQVJCIDB4ODgwOAorI2RlZmluZSBHTF9QUk9HUkFNX05BVElWRV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MDkKKyNkZWZpbmUgR0xfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODBBCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0FMVV9JTlNUUlVDVElPTlNfQVJCIDB4ODgwQgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEMKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODBECisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX05BVElWRV9BTFVfSU5TVFJVQ1RJT05TX0FSQiAweDg4MEUKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTkFUSVZFX1RFWF9JTlNUUlVDVElPTlNfQVJCIDB4ODgwRgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVYX0lORElSRUNUSU9OU19BUkIgMHg4ODEwCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0NPT1JEU19BUkIgICAgICAgICAweDg4NzEKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICAgIDB4ODg3MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFX0FSQiAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFX0FSQiAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQVJCICAgICAgICAgICAgICAgMHg4ODkyCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0FSQiAgICAgICAweDg4OTMKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCICAgICAgIDB4ODg5NAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTYKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HX0FSQiAweDg4OTcKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5OAorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODk5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QQorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5QworI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODlECisjZGVmaW5lIEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19BUkIgMHg4ODlFCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdfQVJCIDB4ODg5RgorI2RlZmluZSBHTF9SRUFEX09OTFlfQVJCICAgICAgICAgICAgICAgICAgMHg4OEI4CisjZGVmaW5lIEdMX1dSSVRFX09OTFlfQVJCICAgICAgICAgICAgICAgICAweDg4QjkKKyNkZWZpbmUgR0xfUkVBRF9XUklURV9BUkIgICAgICAgICAgICAgICAgIDB4ODhCQQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX0FSQiAgICAgICAgICAgICAgMHg4OEJCCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRURfQVJCICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSX0FSQiAgICAgICAgIDB4ODhCRAorI2RlZmluZSBHTF9TVFJFQU1fRFJBV19BUkIgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUUkVBTV9SRUFEX0FSQiAgICAgICAgICAgICAgICAweDg4RTEKKyNkZWZpbmUgR0xfU1RSRUFNX0NPUFlfQVJCICAgICAgICAgICAgICAgIDB4ODhFMgorI2RlZmluZSBHTF9TVEFUSUNfRFJBV19BUkIgICAgICAgICAgICAgICAgMHg4OEU0CisjZGVmaW5lIEdMX1NUQVRJQ19SRUFEX0FSQiAgICAgICAgICAgICAgICAweDg4RTUKKyNkZWZpbmUgR0xfU1RBVElDX0NPUFlfQVJCICAgICAgICAgICAgICAgIDB4ODhFNgorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVdfQVJCICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0RZTkFNSUNfUkVBRF9BUkIgICAgICAgICAgICAgICAweDg4RTkKKyNkZWZpbmUgR0xfRFlOQU1JQ19DT1BZX0FSQiAgICAgICAgICAgICAgIDB4ODhFQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9RVUVSWV9DT1VOVEVSX0JJVFNfQVJCICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfUVVFUllfQVJCICAgICAgICAgICAgICAweDg4NjUKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FSQiAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0FSQiAgICAgMHg4ODY3CisjZGVmaW5lIEdMX1NBTVBMRVNfUEFTU0VEX0FSQiAgICAgICAgICAgICAweDg5MTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkZXJfb2JqZWN0cworI2RlZmluZSBHTF9QUk9HUkFNX09CSkVDVF9BUkIgICAgICAgICAgICAgMHg4QjQwCisjZGVmaW5lIEdMX1NIQURFUl9PQkpFQ1RfQVJCICAgICAgICAgICAgICAweDhCNDgKKyNkZWZpbmUgR0xfT0JKRUNUX1RZUEVfQVJCICAgICAgICAgICAgICAgIDB4OEI0RQorI2RlZmluZSBHTF9PQkpFQ1RfU1VCVFlQRV9BUkIgICAgICAgICAgICAgMHg4QjRGCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzJfQVJCICAgICAgICAgICAgICAgICAweDhCNTAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDM19BUkIgICAgICAgICAgICAgICAgIDB4OEI1MQorI2RlZmluZSBHTF9GTE9BVF9WRUM0X0FSQiAgICAgICAgICAgICAgICAgMHg4QjUyCisjZGVmaW5lIEdMX0lOVF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgICAweDhCNTMKKyNkZWZpbmUgR0xfSU5UX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAgIDB4OEI1NAorI2RlZmluZSBHTF9JTlRfVkVDNF9BUkIgICAgICAgICAgICAgICAgICAgMHg4QjU1CisjZGVmaW5lIEdMX0JPT0xfQVJCICAgICAgICAgICAgICAgICAgICAgICAweDhCNTYKKyNkZWZpbmUgR0xfQk9PTF9WRUMyX0FSQiAgICAgICAgICAgICAgICAgIDB4OEI1NworI2RlZmluZSBHTF9CT09MX1ZFQzNfQVJCICAgICAgICAgICAgICAgICAgMHg4QjU4CisjZGVmaW5lIEdMX0JPT0xfVkVDNF9BUkIgICAgICAgICAgICAgICAgICAweDhCNTkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMl9BUkIgICAgICAgICAgICAgICAgIDB4OEI1QQorI2RlZmluZSBHTF9GTE9BVF9NQVQzX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVCCisjZGVmaW5lIEdMX0ZMT0FUX01BVDRfQVJCICAgICAgICAgICAgICAgICAweDhCNUMKKyNkZWZpbmUgR0xfU0FNUExFUl8xRF9BUkIgICAgICAgICAgICAgICAgIDB4OEI1RAorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSQiAgICAgICAgICAgICAgICAgMHg4QjVFCisjZGVmaW5lIEdMX1NBTVBMRVJfM0RfQVJCICAgICAgICAgICAgICAgICAweDhCNUYKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX0FSQiAgICAgICAgICAgICAgIDB4OEI2MAorI2RlZmluZSBHTF9TQU1QTEVSXzFEX1NIQURPV19BUkIgICAgICAgICAgMHg4QjYxCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfU0hBRE9XX0FSQiAgICAgICAgICAweDhCNjIKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9SRUNUX0FSQiAgICAgICAgICAgIDB4OEI2MworI2RlZmluZSBHTF9TQU1QTEVSXzJEX1JFQ1RfU0hBRE9XX0FSQiAgICAgMHg4QjY0CisjZGVmaW5lIEdMX09CSkVDVF9ERUxFVEVfU1RBVFVTX0FSQiAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfT0JKRUNUX0NPTVBJTEVfU1RBVFVTX0FSQiAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9PQkpFQ1RfTElOS19TVEFUVVNfQVJCICAgICAgICAgMHg4QjgyCisjZGVmaW5lIEdMX09CSkVDVF9WQUxJREFURV9TVEFUVVNfQVJCICAgICAweDhCODMKKyNkZWZpbmUgR0xfT0JKRUNUX0lORk9fTE9HX0xFTkdUSF9BUkIgICAgIDB4OEI4NAorI2RlZmluZSBHTF9PQkpFQ1RfQVRUQUNIRURfT0JKRUNUU19BUkIgICAgMHg4Qjg1CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfVU5JRk9STVNfQVJCICAgICAweDhCODYKKyNkZWZpbmUgR0xfT0JKRUNUX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEhfQVJCIDB4OEI4NworI2RlZmluZSBHTF9PQkpFQ1RfU0hBREVSX1NPVVJDRV9MRU5HVEhfQVJCIDB4OEI4OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9zaGFkZXIKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9BUkIgICAgICAgICAgICAgIDB4OEIzMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIgMHg4QjRBCisjZGVmaW5lIEdMX01BWF9WQVJZSU5HX0ZMT0FUU19BUkIgICAgICAgICAweDhCNEIKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTX0FSQiAweDhCNEMKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCIDB4OEI0RAorI2RlZmluZSBHTF9PQkpFQ1RfQUNUSVZFX0FUVFJJQlVURVNfQVJCICAgMHg4Qjg5CisjZGVmaW5lIEdMX09CSkVDVF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEhfQVJCIDB4OEI4QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQVJCICAgICAgICAgICAgMHg4QjMwCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFNfQVJCIDB4OEI0OQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX0FSQiAweDhCOEIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMAorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT05fQVJCICAgMHg4QjhDCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9BUkIgICAgICAgICAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfQ09PUkRfUkVQTEFDRV9BUkIgICAgICAgICAgICAgIDB4ODg2MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW1fc2hhZG93CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZHJhd19idWZmZXJzCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlNfQVJCICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwX0FSQiAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjFfQVJCICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMl9BUkIgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzX0FSQiAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjRfQVJCICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNV9BUkIgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2X0FSQiAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjdfQVJCICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOF9BUkIgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5X0FSQiAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwX0FSQiAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTFfQVJCICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMl9BUkIgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzX0FSQiAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTRfQVJCICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNV9BUkIgICAgICAgICAgICAgIDB4ODgzNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFX0FSQiAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRV9BUkIgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9BUkIgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX0FSQiAweDg0RjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9jb2xvcl9idWZmZXJfZmxvYXQKKyNkZWZpbmUgR0xfUkdCQV9GTE9BVF9NT0RFX0FSQiAgICAgICAgICAgIDB4ODgyMAorI2RlZmluZSBHTF9DTEFNUF9WRVJURVhfQ09MT1JfQVJCICAgICAgICAgMHg4OTFBCisjZGVmaW5lIEdMX0NMQU1QX0ZSQUdNRU5UX0NPTE9SX0FSQiAgICAgICAweDg5MUIKKyNkZWZpbmUgR0xfQ0xBTVBfUkVBRF9DT0xPUl9BUkIgICAgICAgICAgIDB4ODkxQworI2RlZmluZSBHTF9GSVhFRF9PTkxZX0FSQiAgICAgICAgICAgICAgICAgMHg4OTFECisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfaGFsZl9mbG9hdF9waXhlbAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX0FSQiAgICAgICAgICAgICAgICAgMHgxNDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9URVhUVVJFX1JFRF9UWVBFX0FSQiAgICAgICAgICAgMHg4QzEwCisjZGVmaW5lIEdMX1RFWFRVUkVfR1JFRU5fVFlQRV9BUkIgICAgICAgICAweDhDMTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CTFVFX1RZUEVfQVJCICAgICAgICAgIDB4OEMxMgorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX1RZUEVfQVJCICAgICAgICAgMHg4QzEzCisjZGVmaW5lIEdMX1RFWFRVUkVfTFVNSU5BTkNFX1RZUEVfQVJCICAgICAweDhDMTQKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFTlNJVFlfVFlQRV9BUkIgICAgIDB4OEMxNQorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1RZUEVfQVJCICAgICAgICAgMHg4QzE2CisjZGVmaW5lIEdMX1VOU0lHTkVEX05PUk1BTElaRURfQVJCICAgICAgICAweDhDMTcKKyNkZWZpbmUgR0xfUkdCQTMyRl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODgxNAorI2RlZmluZSBHTF9SR0IzMkZfQVJCICAgICAgICAgICAgICAgICAgICAgMHg4ODE1CisjZGVmaW5lIEdMX0FMUEhBMzJGX0FSQiAgICAgICAgICAgICAgICAgICAweDg4MTYKKyNkZWZpbmUgR0xfSU5URU5TSVRZMzJGX0FSQiAgICAgICAgICAgICAgIDB4ODgxNworI2RlZmluZSBHTF9MVU1JTkFOQ0UzMkZfQVJCICAgICAgICAgICAgICAgMHg4ODE4CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTMyRl9BUkIgICAgICAgICAweDg4MTkKKyNkZWZpbmUgR0xfUkdCQTE2Rl9BUkIgICAgICAgICAgICAgICAgICAgIDB4ODgxQQorI2RlZmluZSBHTF9SR0IxNkZfQVJCICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCisjZGVmaW5lIEdMX0FMUEhBMTZGX0FSQiAgICAgICAgICAgICAgICAgICAweDg4MUMKKyNkZWZpbmUgR0xfSU5URU5TSVRZMTZGX0FSQiAgICAgICAgICAgICAgIDB4ODgxRAorI2RlZmluZSBHTF9MVU1JTkFOQ0UxNkZfQVJCICAgICAgICAgICAgICAgMHg4ODFFCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2Rl9BUkIgICAgICAgICAweDg4MUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9waXhlbF9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0FSQiAgICAgICAgICAweDg4RUIKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIgICAgICAgIDB4ODhFQworI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HX0FSQiAgMHg4OEVECisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElOR19BUkIgMHg4OEVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYWJncgorI2RlZmluZSBHTF9BQkdSX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfY29sb3IKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1JfRVhUICAgICAgICAgICAgIDB4ODAwMQorI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JfRVhUICAgMHg4MDAyCisjZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBX0VYVCAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBX0VYVCAgIDB4ODAwNAorI2RlZmluZSBHTF9CTEVORF9DT0xPUl9FWFQgICAgICAgICAgICAgICAgMHg4MDA1CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcG9seWdvbl9vZmZzZXQKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRVhUICAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1JfRVhUICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0JJQVNfRVhUICAgICAgICAweDgwMzkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlCisjZGVmaW5lIEdMX0FMUEhBNF9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwM0IKKyNkZWZpbmUgR0xfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAzQworI2RlZmluZSBHTF9BTFBIQTEyX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MDNECisjZGVmaW5lIEdMX0FMUEhBMTZfRVhUICAgICAgICAgICAgICAgICAgICAweDgwM0UKKyNkZWZpbmUgR0xfTFVNSU5BTkNFNF9FWFQgICAgICAgICAgICAgICAgIDB4ODAzRgorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0VYVCAgICAgICAgICAgICAgICAgMHg4MDQwCisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0VYVCAgICAgICAgICAgICAgICAweDgwNDEKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfRVhUICAgICAgICAgICAgICAgIDB4ODA0MgorI2RlZmluZSBHTF9MVU1JTkFOQ0U0X0FMUEhBNF9FWFQgICAgICAgICAgMHg4MDQzCisjZGVmaW5lIEdMX0xVTUlOQU5DRTZfQUxQSEEyX0VYVCAgICAgICAgICAweDgwNDQKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQThfRVhUICAgICAgICAgIDB4ODA0NQorI2RlZmluZSBHTF9MVU1JTkFOQ0UxMl9BTFBIQTRfRVhUICAgICAgICAgMHg4MDQ2CisjZGVmaW5lIEdMX0xVTUlOQU5DRTEyX0FMUEhBMTJfRVhUICAgICAgICAweDgwNDcKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZfQUxQSEExNl9FWFQgICAgICAgIDB4ODA0OAorI2RlZmluZSBHTF9JTlRFTlNJVFlfRVhUICAgICAgICAgICAgICAgICAgMHg4MDQ5CisjZGVmaW5lIEdMX0lOVEVOU0lUWTRfRVhUICAgICAgICAgICAgICAgICAweDgwNEEKKyNkZWZpbmUgR0xfSU5URU5TSVRZOF9FWFQgICAgICAgICAgICAgICAgIDB4ODA0QgorI2RlZmluZSBHTF9JTlRFTlNJVFkxMl9FWFQgICAgICAgICAgICAgICAgMHg4MDRDCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2X0VYVCAgICAgICAgICAgICAgICAweDgwNEQKKyNkZWZpbmUgR0xfUkdCMl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0RQorI2RlZmluZSBHTF9SR0I0X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDRGCisjZGVmaW5lIEdMX1JHQjVfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwNTAKKyNkZWZpbmUgR0xfUkdCOF9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0IxMF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDUyCisjZGVmaW5lIEdMX1JHQjEyX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTMKKyNkZWZpbmUgR0xfUkdCMTZfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NAorI2RlZmluZSBHTF9SR0JBMl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU1CisjZGVmaW5lIEdMX1JHQkE0X0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0JBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDU4CisjZGVmaW5lIEdMX1JHQjEwX0EyX0VYVCAgICAgICAgICAgICAgICAgICAweDgwNTkKKyNkZWZpbmUgR0xfUkdCQTEyX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODA1QQorI2RlZmluZSBHTF9SR0JBMTZfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDVCCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVEX1NJWkVfRVhUICAgICAgICAgICAweDgwNUMKKyNkZWZpbmUgR0xfVEVYVFVSRV9HUkVFTl9TSVpFX0VYVCAgICAgICAgIDB4ODA1RAorI2RlZmluZSBHTF9URVhUVVJFX0JMVUVfU0laRV9FWFQgICAgICAgICAgMHg4MDVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQUxQSEFfU0laRV9FWFQgICAgICAgICAweDgwNUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9MVU1JTkFOQ0VfU0laRV9FWFQgICAgIDB4ODA2MAorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVOU0lUWV9TSVpFX0VYVCAgICAgMHg4MDYxCisjZGVmaW5lIEdMX1JFUExBQ0VfRVhUICAgICAgICAgICAgICAgICAgICAweDgwNjIKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8xRF9FWFQgICAgICAgICAgIDB4ODA2MworI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzJEX0VYVCAgICAgICAgICAgMHg4MDY0CisjZGVmaW5lIEdMX1RFWFRVUkVfVE9PX0xBUkdFX0VYVCAgICAgICAgICAweDgwNjUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlM0QKKyNkZWZpbmUgR0xfUEFDS19TS0lQX0lNQUdFU19FWFQgICAgICAgICAgIDB4ODA2QgorI2RlZmluZSBHTF9QQUNLX0lNQUdFX0hFSUdIVF9FWFQgICAgICAgICAgMHg4MDZDCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFU19FWFQgICAgICAgICAweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVF9FWFQgICAgICAgIDB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNEX0VYVCAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfM0RfRVhUICAgICAgICAgICAweDgwNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9FWFQgICAgICAgICAgICAgIDB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUl9FWFQgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkVfRVhUICAgICAgICAweDgwNzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9maWx0ZXI0CisjZGVmaW5lIEdMX0ZJTFRFUjRfU0dJUyAgICAgICAgICAgICAgICAgICAweDgxNDYKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVI0X1NJWkVfU0dJUyAgICAgIDB4ODE0NworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3N1YnRleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb3B5X3RleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9oaXN0b2dyYW0KKyNkZWZpbmUgR0xfSElTVE9HUkFNX0VYVCAgICAgICAgICAgICAgICAgIDB4ODAyNAorI2RlZmluZSBHTF9QUk9YWV9ISVNUT0dSQU1fRVhUICAgICAgICAgICAgMHg4MDI1CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9XSURUSF9FWFQgICAgICAgICAgICAweDgwMjYKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0ZPUk1BVF9FWFQgICAgICAgICAgIDB4ODAyNworI2RlZmluZSBHTF9ISVNUT0dSQU1fUkVEX1NJWkVfRVhUICAgICAgICAgMHg4MDI4CisjZGVmaW5lIEdMX0hJU1RPR1JBTV9HUkVFTl9TSVpFX0VYVCAgICAgICAweDgwMjkKKyNkZWZpbmUgR0xfSElTVE9HUkFNX0JMVUVfU0laRV9FWFQgICAgICAgIDB4ODAyQQorI2RlZmluZSBHTF9ISVNUT0dSQU1fQUxQSEFfU0laRV9FWFQgICAgICAgMHg4MDJCCisjZGVmaW5lIEdMX0hJU1RPR1JBTV9MVU1JTkFOQ0VfU0laRV9FWFQgICAweDgwMkMKKyNkZWZpbmUgR0xfSElTVE9HUkFNX1NJTktfRVhUICAgICAgICAgICAgIDB4ODAyRAorI2RlZmluZSBHTF9NSU5NQVhfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4MDJFCisjZGVmaW5lIEdMX01JTk1BWF9GT1JNQVRfRVhUICAgICAgICAgICAgICAweDgwMkYKKyNkZWZpbmUgR0xfTUlOTUFYX1NJTktfRVhUICAgICAgICAgICAgICAgIDB4ODAzMAorI2RlZmluZSBHTF9UQUJMRV9UT09fTEFSR0VfRVhUICAgICAgICAgICAgMHg4MDMxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fMURfRVhUICAgICAgICAgICAgIDB4ODAxMAorI2RlZmluZSBHTF9DT05WT0xVVElPTl8yRF9FWFQgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMX1NFUEFSQUJMRV8yRF9FWFQgICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fQk9SREVSX01PREVfRVhUICAgIDB4ODAxMworI2RlZmluZSBHTF9DT05WT0xVVElPTl9GSUxURVJfU0NBTEVfRVhUICAgMHg4MDE0CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0ZJTFRFUl9CSUFTX0VYVCAgICAweDgwMTUKKyNkZWZpbmUgR0xfUkVEVUNFX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAxNgorI2RlZmluZSBHTF9DT05WT0xVVElPTl9GT1JNQVRfRVhUICAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX1dJRFRIX0VYVCAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xfQ09OVk9MVVRJT05fSEVJR0hUX0VYVCAgICAgICAgIDB4ODAxOQorI2RlZmluZSBHTF9NQVhfQ09OVk9MVVRJT05fV0lEVEhfRVhUICAgICAgMHg4MDFBCisjZGVmaW5lIEdMX01BWF9DT05WT0xVVElPTl9IRUlHSFRfRVhUICAgICAweDgwMUIKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9SRURfU0NBTEVfRVhUIDB4ODAxQworI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0dSRUVOX1NDQUxFX0VYVCAweDgwMUQKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX1NDQUxFX0VYVCAweDgwMUUKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9BTFBIQV9TQ0FMRV9FWFQgMHg4MDFGCisjZGVmaW5lIEdMX1BPU1RfQ09OVk9MVVRJT05fUkVEX0JJQVNfRVhUICAweDgwMjAKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9HUkVFTl9CSUFTX0VYVCAweDgwMjEKKyNkZWZpbmUgR0xfUE9TVF9DT05WT0xVVElPTl9CTFVFX0JJQVNfRVhUIDB4ODAyMgorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0FMUEhBX0JJQVNfRVhUIDB4ODAyMworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJX2NvbG9yX21hdHJpeAorI2RlZmluZSBHTF9DT0xPUl9NQVRSSVhfU0dJICAgICAgICAgICAgICAgMHg4MEIxCisjZGVmaW5lIEdMX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgICAweDgwQjIKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX01BVFJJWF9TVEFDS19ERVBUSF9TR0kgMHg4MEIzCisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX1JFRF9TQ0FMRV9TR0kgMHg4MEI0CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0dSRUVOX1NDQUxFX1NHSSAweDgwQjUKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9TQ0FMRV9TR0kgMHg4MEI2CisjZGVmaW5lIEdMX1BPU1RfQ09MT1JfTUFUUklYX0FMUEhBX1NDQUxFX1NHSSAweDgwQjcKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfUkVEX0JJQVNfU0dJIDB4ODBCOAorI2RlZmluZSBHTF9QT1NUX0NPTE9SX01BVFJJWF9HUkVFTl9CSUFTX1NHSSAweDgwQjkKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQkxVRV9CSUFTX1NHSSAweDgwQkEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQUxQSEFfQklBU19TR0kgMHg4MEJCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfU0dJICAgICAgICAgICAgICAgIDB4ODBEMAorI2RlZmluZSBHTF9QT1NUX0NPTlZPTFVUSU9OX0NPTE9SX1RBQkxFX1NHSSAweDgwRDEKKyNkZWZpbmUgR0xfUE9TVF9DT0xPUl9NQVRSSVhfQ09MT1JfVEFCTEVfU0dJIDB4ODBEMgorI2RlZmluZSBHTF9QUk9YWV9DT0xPUl9UQUJMRV9TR0kgICAgICAgICAgMHg4MEQzCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfQ09OVk9MVVRJT05fQ09MT1JfVEFCTEVfU0dJIDB4ODBENAorI2RlZmluZSBHTF9QUk9YWV9QT1NUX0NPTE9SX01BVFJJWF9DT0xPUl9UQUJMRV9TR0kgMHg4MEQ1CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1NDQUxFX1NHSSAgICAgICAgICAweDgwRDYKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQklBU19TR0kgICAgICAgICAgIDB4ODBENworI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9GT1JNQVRfU0dJICAgICAgICAgMHg4MEQ4CisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX1dJRFRIX1NHSSAgICAgICAgICAweDgwRDkKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfUkVEX1NJWkVfU0dJICAgICAgIDB4ODBEQQorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9HUkVFTl9TSVpFX1NHSSAgICAgMHg4MERCCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0JMVUVfU0laRV9TR0kgICAgICAweDgwREMKKyNkZWZpbmUgR0xfQ09MT1JfVEFCTEVfQUxQSEFfU0laRV9TR0kgICAgIDB4ODBERAorI2RlZmluZSBHTF9DT0xPUl9UQUJMRV9MVU1JTkFOQ0VfU0laRV9TR0kgMHg4MERFCisjZGVmaW5lIEdMX0NPTE9SX1RBQkxFX0lOVEVOU0lUWV9TSVpFX1NHSSAweDgwREYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9QSVhFTF9URVhUVVJFX1NHSVMgICAgICAgICAgICAgMHg4MzUzCisjZGVmaW5lIEdMX1BJWEVMX0ZSQUdNRU5UX1JHQl9TT1VSQ0VfU0dJUyAweDgzNTQKKyNkZWZpbmUgR0xfUElYRUxfRlJBR01FTlRfQUxQSEFfU09VUkNFX1NHSVMgMHg4MzU1CisjZGVmaW5lIEdMX1BJWEVMX0dST1VQX0NPTE9SX1NHSVMgICAgICAgICAweDgzNTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZQorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1NHSVggICAgICAgICAgICAgMHg4MTM5CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fTU9ERV9TR0lYICAgICAgICAweDgzMkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZTRECisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9WT0xVTUVTX1NHSVMgICAgICAgICAweDgxMzAKKyNkZWZpbmUgR0xfUEFDS19JTUFHRV9ERVBUSF9TR0lTICAgICAgICAgIDB4ODEzMQorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9WT0xVTUVTX1NHSVMgICAgICAgMHg4MTMyCisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9ERVBUSF9TR0lTICAgICAgICAweDgxMzMKKyNkZWZpbmUgR0xfVEVYVFVSRV80RF9TR0lTICAgICAgICAgICAgICAgIDB4ODEzNAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzREX1NHSVMgICAgICAgICAgMHg4MTM1CisjZGVmaW5lIEdMX1RFWFRVUkVfNERTSVpFX1NHSVMgICAgICAgICAgICAweDgxMzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1FfU0dJUyAgICAgICAgICAgIDB4ODEzNworI2RlZmluZSBHTF9NQVhfNERfVEVYVFVSRV9TSVpFX1NHSVMgICAgICAgMHg4MTM4CisjZGVmaW5lIEdMX1RFWFRVUkVfNERfQklORElOR19TR0lTICAgICAgICAweDgxNEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfVEFCTEVfU0dJICAgICAgICAweDgwQkMKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV9DT0xPUl9UQUJMRV9TR0kgIDB4ODBCRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NteWthCisjZGVmaW5lIEdMX0NNWUtfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwMEMKKyNkZWZpbmUgR0xfQ01ZS0FfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODAwRAorI2RlZmluZSBHTF9QQUNLX0NNWUtfSElOVF9FWFQgICAgICAgICAgICAgMHg4MDBFCisjZGVmaW5lIEdMX1VOUEFDS19DTVlLX0hJTlRfRVhUICAgICAgICAgICAweDgwMEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX29iamVjdAorI2RlZmluZSBHTF9URVhUVVJFX1BSSU9SSVRZX0VYVCAgICAgICAgICAgMHg4MDY2CisjZGVmaW5lIEdMX1RFWFRVUkVfUkVTSURFTlRfRVhUICAgICAgICAgICAweDgwNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9CSU5ESU5HX0VYVCAgICAgICAgIDB4ODA2OAorI2RlZmluZSBHTF9URVhUVVJFXzJEX0JJTkRJTkdfRVhUICAgICAgICAgMHg4MDY5CisjZGVmaW5lIEdMX1RFWFRVUkVfM0RfQklORElOR19FWFQgICAgICAgICAweDgwNkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZGV0YWlsX3RleHR1cmUKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfMkRfU0dJUyAgICAgICAgIDB4ODA5NQorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV8yRF9CSU5ESU5HX1NHSVMgMHg4MDk2CisjZGVmaW5lIEdMX0xJTkVBUl9ERVRBSUxfU0dJUyAgICAgICAgICAgICAweDgwOTcKKyNkZWZpbmUgR0xfTElORUFSX0RFVEFJTF9BTFBIQV9TR0lTICAgICAgIDB4ODA5OAorI2RlZmluZSBHTF9MSU5FQVJfREVUQUlMX0NPTE9SX1NHSVMgICAgICAgMHg4MDk5CisjZGVmaW5lIEdMX0RFVEFJTF9URVhUVVJFX0xFVkVMX1NHSVMgICAgICAweDgwOUEKKyNkZWZpbmUgR0xfREVUQUlMX1RFWFRVUkVfTU9ERV9TR0lTICAgICAgIDB4ODA5QgorI2RlZmluZSBHTF9ERVRBSUxfVEVYVFVSRV9GVU5DX1BPSU5UU19TR0lTIDB4ODA5QworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19zaGFycGVuX3RleHR1cmUKKyNkZWZpbmUgR0xfTElORUFSX1NIQVJQRU5fU0dJUyAgICAgICAgICAgIDB4ODBBRAorI2RlZmluZSBHTF9MSU5FQVJfU0hBUlBFTl9BTFBIQV9TR0lTICAgICAgMHg4MEFFCisjZGVmaW5lIEdMX0xJTkVBUl9TSEFSUEVOX0NPTE9SX1NHSVMgICAgICAweDgwQUYKKyNkZWZpbmUgR0xfU0hBUlBFTl9URVhUVVJFX0ZVTkNfUE9JTlRTX1NHSVMgMHg4MEIwCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX3BpeGVscworI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFXzNfM18yX0VYVCAgICAgICAgMHg4MDMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfRVhUICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMV9FWFQgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9FWFQgICAgICAgMHg4MDM1CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yX0VYVCAgICAweDgwMzYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9sb2QKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EX1NHSVMgICAgICAgICAgIDB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0RfU0dJUyAgICAgICAgICAgMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTF9TR0lTICAgICAgICAweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUxfU0dJUyAgICAgICAgIDB4ODEzRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9TR0lTICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19NQVNLX1NHSVMgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9TR0lTICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19TR0lTICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMXzFQQVNTX1NHSVMgICAgICAgICAgICAgICAgICAgICAweDgwQTEKKyNkZWZpbmUgR0xfMlBBU1NfMF9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBMgorI2RlZmluZSBHTF8yUEFTU18xX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEEzCisjZGVmaW5lIEdMXzRQQVNTXzBfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTQKKyNkZWZpbmUgR0xfNFBBU1NfMV9TR0lTICAgICAgICAgICAgICAgICAgIDB4ODBBNQorI2RlZmluZSBHTF80UEFTU18yX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIEdMXzRQQVNTXzNfU0dJUyAgICAgICAgICAgICAgICAgICAweDgwQTcKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfU0dJUyAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX1NHSVMgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX1NHSVMgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfSU5WRVJUX1NHSVMgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9TQU1QTEVfUEFUVEVSTl9TR0lTICAgICAgICAgICAgMHg4MEFDCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcmVzY2FsZV9ub3JtYWwKKyNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUxfRVhUICAgICAgICAgICAgIDB4ODAzQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfRVhUICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9FWFQgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfRVhUICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9FWFQgICAgICAgICAgICAgICAgMHg4MDc3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfRVhUICAgICAgICAweDgwNzgKKyNkZWZpbmUgR0xfRURHRV9GTEFHX0FSUkFZX0VYVCAgICAgICAgICAgIDB4ODA3OQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU0laRV9FWFQgICAgICAgICAgMHg4MDdBCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9UWVBFX0VYVCAgICAgICAgICAweDgwN0IKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NUUklERV9FWFQgICAgICAgIDB4ODA3QworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQ09VTlRfRVhUICAgICAgICAgMHg4MDdECisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFX0VYVCAgICAgICAgICAweDgwN0UKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERV9FWFQgICAgICAgIDB4ODA3RgorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfQ09VTlRfRVhUICAgICAgICAgMHg4MDgwCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NJWkVfRVhUICAgICAgICAgICAweDgwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgIDB4ODA4MgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TVFJJREVfRVhUICAgICAgICAgMHg4MDgzCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgICAweDgwODQKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfVFlQRV9FWFQgICAgICAgICAgIDB4ODA4NQorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9TVFJJREVfRVhUICAgICAgICAgMHg4MDg2CisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0NPVU5UX0VYVCAgICAgICAgICAweDgwODcKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFX0VYVCAgIDB4ODA4OAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEVfRVhUICAgMHg4MDg5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFX0VYVCAweDgwOEEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9DT1VOVF9FWFQgIDB4ODA4QgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfU1RSSURFX0VYVCAgICAgMHg4MDhDCisjZGVmaW5lIEdMX0VER0VfRkxBR19BUlJBWV9DT1VOVF9FWFQgICAgICAweDgwOEQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVJfRVhUICAgICAgIDB4ODA4RQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAgMHg4MDhGCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BPSU5URVJfRVhUICAgICAgICAweDgwOTAKKyNkZWZpbmUgR0xfSU5ERVhfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAgIDB4ODA5MQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVJfRVhUIDB4ODA5MgorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfUE9JTlRFUl9FWFQgICAgMHg4MDkzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbWlzY19hdHRyaWJ1dGUKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9TR0lTICAgICAgICAgICAweDgxOTEKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlRfU0dJUyAgICAgIDB4ODE5MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jbGlwbWFwCisjZGVmaW5lIEdMX0xJTkVBUl9DTElQTUFQX0xJTkVBUl9TR0lYICAgICAweDgxNzAKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0NFTlRFUl9TR0lYICAgIDB4ODE3MQorI2RlZmluZSBHTF9URVhUVVJFX0NMSVBNQVBfRlJBTUVfU0dJWCAgICAgMHg4MTcyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ0xJUE1BUF9PRkZTRVRfU0dJWCAgICAweDgxNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAweDgxNzQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0xPRF9PRkZTRVRfU0dJWCAweDgxNzUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DTElQTUFQX0RFUFRIX1NHSVggICAgIDB4ODE3NgorI2RlZmluZSBHTF9NQVhfQ0xJUE1BUF9ERVBUSF9TR0lYICAgICAgICAgMHg4MTc3CisjZGVmaW5lIEdMX01BWF9DTElQTUFQX1ZJUlRVQUxfREVQVEhfU0dJWCAweDgxNzgKKyNkZWZpbmUgR0xfTkVBUkVTVF9DTElQTUFQX05FQVJFU1RfU0dJWCAgIDB4ODQ0RAorI2RlZmluZSBHTF9ORUFSRVNUX0NMSVBNQVBfTElORUFSX1NHSVggICAgMHg4NDRFCisjZGVmaW5lIEdMX0xJTkVBUl9DTElQTUFQX05FQVJFU1RfU0dJWCAgICAweDg0NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9TR0lYICAgICAgICAgICAweDgxOUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX09QRVJBVE9SX1NHSVggIDB4ODE5QgorI2RlZmluZSBHTF9URVhUVVJFX0xFUVVBTF9SX1NHSVggICAgICAgICAgMHg4MTlDCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VRVUFMX1JfU0dJWCAgICAgICAgICAweDgxOUQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9lZGdlX2NsYW1wCisjZGVmaW5lIEdMX0NMQU1QX1RPX0VER0VfU0dJUyAgICAgICAgICAgICAweDgxMkYKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fQk9SREVSX1NHSVMgICAgICAgICAgIDB4ODEyRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAorI2RlZmluZSBHTF9GVU5DX0FERF9FWFQgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMX01JTl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9FWFQgICAgICAgICAgICAgMHg4MDA5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfc3VidHJhY3QKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVF9FWFQgICAgICAgICAgICAgIDB4ODAwQQorI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RfRVhUICAgICAgMHg4MDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbG9naWNfb3AKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW50ZXJsYWNlCisjZGVmaW5lIEdMX0lOVEVSTEFDRV9TR0lYICAgICAgICAgICAgICAgICAweDgwOTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGlsZXMKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9CRVNUX0FMSUdOTUVOVF9TR0lYIDB4ODEzRQorI2RlZmluZSBHTF9QSVhFTF9USUxFX0NBQ0hFX0lOQ1JFTUVOVF9TR0lYIDB4ODEzRgorI2RlZmluZSBHTF9QSVhFTF9USUxFX1dJRFRIX1NHSVggICAgICAgICAgMHg4MTQwCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfSEVJR0hUX1NHSVggICAgICAgICAweDgxNDEKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9HUklEX1dJRFRIX1NHSVggICAgIDB4ODE0MgorI2RlZmluZSBHTF9QSVhFTF9USUxFX0dSSURfSEVJR0hUX1NHSVggICAgMHg4MTQzCisjZGVmaW5lIEdMX1BJWEVMX1RJTEVfR1JJRF9ERVBUSF9TR0lYICAgICAweDgxNDQKKyNkZWZpbmUgR0xfUElYRUxfVElMRV9DQUNIRV9TSVpFX1NHSVggICAgIDB4ODE0NQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlX3NlbGVjdAorI2RlZmluZSBHTF9EVUFMX0FMUEhBNF9TR0lTICAgICAgICAgICAgICAgMHg4MTEwCisjZGVmaW5lIEdMX0RVQUxfQUxQSEE4X1NHSVMgICAgICAgICAgICAgICAweDgxMTEKKyNkZWZpbmUgR0xfRFVBTF9BTFBIQTEyX1NHSVMgICAgICAgICAgICAgIDB4ODExMgorI2RlZmluZSBHTF9EVUFMX0FMUEhBMTZfU0dJUyAgICAgICAgICAgICAgMHg4MTEzCisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFNF9TR0lTICAgICAgICAgICAweDgxMTQKKyNkZWZpbmUgR0xfRFVBTF9MVU1JTkFOQ0U4X1NHSVMgICAgICAgICAgIDB4ODExNQorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRTEyX1NHSVMgICAgICAgICAgMHg4MTE2CisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFMTZfU0dJUyAgICAgICAgICAweDgxMTcKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFk0X1NHSVMgICAgICAgICAgIDB4ODExOAorI2RlZmluZSBHTF9EVUFMX0lOVEVOU0lUWThfU0dJUyAgICAgICAgICAgMHg4MTE5CisjZGVmaW5lIEdMX0RVQUxfSU5URU5TSVRZMTJfU0dJUyAgICAgICAgICAweDgxMUEKKyNkZWZpbmUgR0xfRFVBTF9JTlRFTlNJVFkxNl9TR0lTICAgICAgICAgIDB4ODExQgorI2RlZmluZSBHTF9EVUFMX0xVTUlOQU5DRV9BTFBIQTRfU0dJUyAgICAgMHg4MTFDCisjZGVmaW5lIEdMX0RVQUxfTFVNSU5BTkNFX0FMUEhBOF9TR0lTICAgICAweDgxMUQKKyNkZWZpbmUgR0xfUVVBRF9BTFBIQTRfU0dJUyAgICAgICAgICAgICAgIDB4ODExRQorI2RlZmluZSBHTF9RVUFEX0FMUEhBOF9TR0lTICAgICAgICAgICAgICAgMHg4MTFGCisjZGVmaW5lIEdMX1FVQURfTFVNSU5BTkNFNF9TR0lTICAgICAgICAgICAweDgxMjAKKyNkZWZpbmUgR0xfUVVBRF9MVU1JTkFOQ0U4X1NHSVMgICAgICAgICAgIDB4ODEyMQorI2RlZmluZSBHTF9RVUFEX0lOVEVOU0lUWTRfU0dJUyAgICAgICAgICAgMHg4MTIyCisjZGVmaW5lIEdMX1FVQURfSU5URU5TSVRZOF9TR0lTICAgICAgICAgICAweDgxMjMKKyNkZWZpbmUgR0xfRFVBTF9URVhUVVJFX1NFTEVDVF9TR0lTICAgICAgIDB4ODEyNAorI2RlZmluZSBHTF9RVUFEX1RFWFRVUkVfU0VMRUNUX1NHSVMgICAgICAgMHg4MTI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Nwcml0ZQorI2RlZmluZSBHTF9TUFJJVEVfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MTQ4CisjZGVmaW5lIEdMX1NQUklURV9NT0RFX1NHSVggICAgICAgICAgICAgICAweDgxNDkKKyNkZWZpbmUgR0xfU1BSSVRFX0FYSVNfU0dJWCAgICAgICAgICAgICAgIDB4ODE0QQorI2RlZmluZSBHTF9TUFJJVEVfVFJBTlNMQVRJT05fU0dJWCAgICAgICAgMHg4MTRCCisjZGVmaW5lIEdMX1NQUklURV9BWElBTF9TR0lYICAgICAgICAgICAgICAweDgxNEMKKyNkZWZpbmUgR0xfU1BSSVRFX09CSkVDVF9BTElHTkVEX1NHSVggICAgIDB4ODE0RAorI2RlZmluZSBHTF9TUFJJVEVfRVlFX0FMSUdORURfU0dJWCAgICAgICAgMHg4MTRFCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbXVsdGlfYnVmZmVyCisjZGVmaW5lIEdMX1RFWFRVUkVfTVVMVElfQlVGRkVSX0hJTlRfU0dJWCAweDgxMkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUlOX0VYVCAgICAgICAgICAgICAweDgxMjYKKyNkZWZpbmUgR0xfUE9JTlRfU0laRV9NQVhfRVhUICAgICAgICAgICAgIDB4ODEyNworI2RlZmluZSBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFX0VYVCAgMHg4MTI4CisjZGVmaW5lIEdMX0RJU1RBTkNFX0FUVEVOVUFUSU9OX0VYVCAgICAgICAweDgxMjkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTl9TR0lTICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYX1NHSVMgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRV9TR0lTIDB4ODEyOAorI2RlZmluZSBHTF9ESVNUQU5DRV9BVFRFTlVBVElPTl9TR0lTICAgICAgMHg4MTI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2luc3RydW1lbnRzCisjZGVmaW5lIEdMX0lOU1RSVU1FTlRfQlVGRkVSX1BPSU5URVJfU0dJWCAweDgxODAKKyNkZWZpbmUgR0xfSU5TVFJVTUVOVF9NRUFTVVJFTUVOVFNfU0dJWCAgIDB4ODE4MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX3NjYWxlX2JpYXMKKyNkZWZpbmUgR0xfUE9TVF9URVhUVVJFX0ZJTFRFUl9CSUFTX1NHSVggIDB4ODE3OQorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1NHSVggMHg4MTdBCisjZGVmaW5lIEdMX1BPU1RfVEVYVFVSRV9GSUxURVJfQklBU19SQU5HRV9TR0lYIDB4ODE3QgorI2RlZmluZSBHTF9QT1NUX1RFWFRVUkVfRklMVEVSX1NDQUxFX1JBTkdFX1NHSVggMHg4MTdDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYW1lem9vbQorI2RlZmluZSBHTF9GUkFNRVpPT01fU0dJWCAgICAgICAgICAgICAgICAgMHg4MThCCisjZGVmaW5lIEdMX0ZSQU1FWk9PTV9GQUNUT1JfU0dJWCAgICAgICAgICAweDgxOEMKKyNkZWZpbmUgR0xfTUFYX0ZSQU1FWk9PTV9GQUNUT1JfU0dJWCAgICAgIDB4ODE4RAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRmZkTWFza1NHSVgKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERUZPUk1BVElPTl9CSVRfU0dJWCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfR0VPTUVUUllfREVGT1JNQVRJT05fQklUX1NHSVggIDB4MDAwMDAwMDIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcG9seW5vbWlhbF9mZmQKKyNkZWZpbmUgR0xfR0VPTUVUUllfREVGT1JNQVRJT05fU0dJWCAgICAgIDB4ODE5NAorI2RlZmluZSBHTF9URVhUVVJFX0RFRk9STUFUSU9OX1NHSVggICAgICAgMHg4MTk1CisjZGVmaW5lIEdMX0RFRk9STUFUSU9OU19NQVNLX1NHSVggICAgICAgICAweDgxOTYKKyNkZWZpbmUgR0xfTUFYX0RFRk9STUFUSU9OX09SREVSX1NHSVggICAgIDB4ODE5NworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9yZWZlcmVuY2VfcGxhbmUKKyNkZWZpbmUgR0xfUkVGRVJFTkNFX1BMQU5FX1NHSVggICAgICAgICAgIDB4ODE3RAorI2RlZmluZSBHTF9SRUZFUkVOQ0VfUExBTkVfRVFVQVRJT05fU0dJWCAgMHg4MTdFCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZsdXNoX3Jhc3RlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9kZXB0aF90ZXh0dXJlCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2X1NHSVggICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfU0dJWCAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9TR0lYICAgICAgICAgMHg4MUE3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2ZvZ19mdW5jdGlvbgorI2RlZmluZSBHTF9GT0dfRlVOQ19TR0lTICAgICAgICAgICAgICAgICAgMHg4MTJBCisjZGVmaW5lIEdMX0ZPR19GVU5DX1BPSU5UU19TR0lTICAgICAgICAgICAweDgxMkIKKyNkZWZpbmUgR0xfTUFYX0ZPR19GVU5DX1BPSU5UU19TR0lTICAgICAgIDB4ODEyQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mb2dfb2Zmc2V0CisjZGVmaW5lIEdMX0ZPR19PRkZTRVRfU0dJWCAgICAgICAgICAgICAgICAweDgxOTgKKyNkZWZpbmUgR0xfRk9HX09GRlNFVF9WQUxVRV9TR0lYICAgICAgICAgIDB4ODE5OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtCisjZGVmaW5lIEdMX0lNQUdFX1NDQUxFX1hfSFAgICAgICAgICAgICAgICAweDgxNTUKKyNkZWZpbmUgR0xfSU1BR0VfU0NBTEVfWV9IUCAgICAgICAgICAgICAgIDB4ODE1NgorI2RlZmluZSBHTF9JTUFHRV9UUkFOU0xBVEVfWF9IUCAgICAgICAgICAgMHg4MTU3CisjZGVmaW5lIEdMX0lNQUdFX1RSQU5TTEFURV9ZX0hQICAgICAgICAgICAweDgxNTgKKyNkZWZpbmUgR0xfSU1BR0VfUk9UQVRFX0FOR0xFX0hQICAgICAgICAgIDB4ODE1OQorI2RlZmluZSBHTF9JTUFHRV9ST1RBVEVfT1JJR0lOX1hfSFAgICAgICAgMHg4MTVBCisjZGVmaW5lIEdMX0lNQUdFX1JPVEFURV9PUklHSU5fWV9IUCAgICAgICAweDgxNUIKKyNkZWZpbmUgR0xfSU1BR0VfTUFHX0ZJTFRFUl9IUCAgICAgICAgICAgIDB4ODE1QworI2RlZmluZSBHTF9JTUFHRV9NSU5fRklMVEVSX0hQICAgICAgICAgICAgMHg4MTVECisjZGVmaW5lIEdMX0lNQUdFX0NVQklDX1dFSUdIVF9IUCAgICAgICAgICAweDgxNUUKKyNkZWZpbmUgR0xfQ1VCSUNfSFAgICAgICAgICAgICAgICAgICAgICAgIDB4ODE1RgorI2RlZmluZSBHTF9BVkVSQUdFX0hQICAgICAgICAgICAgICAgICAgICAgMHg4MTYwCisjZGVmaW5lIEdMX0lNQUdFX1RSQU5TRk9STV8yRF9IUCAgICAgICAgICAweDgxNjEKKyNkZWZpbmUgR0xfUE9TVF9JTUFHRV9UUkFOU0ZPUk1fQ09MT1JfVEFCTEVfSFAgMHg4MTYyCisjZGVmaW5lIEdMX1BST1hZX1BPU1RfSU1BR0VfVFJBTlNGT1JNX0NPTE9SX1RBQkxFX0hQIDB4ODE2MworI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfY29udm9sdXRpb25fYm9yZGVyX21vZGVzCisjZGVmaW5lIEdMX0lHTk9SRV9CT1JERVJfSFAgICAgICAgICAgICAgICAweDgxNTAKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQk9SREVSX0hQICAgICAgICAgICAgIDB4ODE1MQorI2RlZmluZSBHTF9SRVBMSUNBVEVfQk9SREVSX0hQICAgICAgICAgICAgMHg4MTUzCisjZGVmaW5lIEdMX0NPTlZPTFVUSU9OX0JPUkRFUl9DT0xPUl9IUCAgICAweDgxNTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOR1JfcGFsZXR0ZV9idWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9hZGRfZW52CisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0JJQVNfU0dJWCAgICAgICAgICAweDgwQkUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZQorI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX3ZlcnRleF9oaW50cworI2RlZmluZSBHTF9WRVJURVhfREFUQV9ISU5UX1BHSSAgICAgICAgICAgMHgxQTIyQQorI2RlZmluZSBHTF9WRVJURVhfQ09OU0lTVEVOVF9ISU5UX1BHSSAgICAgMHgxQTIyQgorI2RlZmluZSBHTF9NQVRFUklBTF9TSURFX0hJTlRfUEdJICAgICAgICAgMHgxQTIyQworI2RlZmluZSBHTF9NQVhfVkVSVEVYX0hJTlRfUEdJICAgICAgICAgICAgMHgxQTIyRAorI2RlZmluZSBHTF9DT0xPUjNfQklUX1BHSSAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBHTF9DT0xPUjRfQklUX1BHSSAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBHTF9FREdFRkxBR19CSVRfUEdJICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBHTF9JTkRFWF9CSVRfUEdJICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBHTF9NQVRfQU1CSUVOVF9CSVRfUEdJICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBHTF9NQVRfQU1CSUVOVF9BTkRfRElGRlVTRV9CSVRfUEdJIDB4MDAyMDAwMDAKKyNkZWZpbmUgR0xfTUFUX0RJRkZVU0VfQklUX1BHSSAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgR0xfTUFUX0VNSVNTSU9OX0JJVF9QR0kgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgR0xfTUFUX0NPTE9SX0lOREVYRVNfQklUX1BHSSAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgR0xfTUFUX1NISU5JTkVTU19CSVRfUEdJICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgR0xfTUFUX1NQRUNVTEFSX0JJVF9QR0kgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgR0xfTk9STUFMX0JJVF9QR0kgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQxX0JJVF9QR0kgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQyX0JJVF9QR0kgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQzX0JJVF9QR0kgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0xfVEVYQ09PUkQ0X0JJVF9QR0kgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgR0xfVkVSVEVYMjNfQklUX1BHSSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfVkVSVEVYNF9CSVRfUEdJICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIEdMX1BHSV9taXNjX2hpbnRzCisjZGVmaW5lIEdMX1BSRUZFUl9ET1VCTEVCVUZGRVJfSElOVF9QR0kgICAweDFBMUY4CisjZGVmaW5lIEdMX0NPTlNFUlZFX01FTU9SWV9ISU5UX1BHSSAgICAgICAweDFBMUZECisjZGVmaW5lIEdMX1JFQ0xBSU1fTUVNT1JZX0hJTlRfUEdJICAgICAgICAweDFBMUZFCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19IQU5ETEVfUEdJICAgICAweDFBMjAyCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19CRUdJTl9ISU5UX1BHSSAweDFBMjAzCisjZGVmaW5lIEdMX05BVElWRV9HUkFQSElDU19FTkRfSElOVF9QR0kgICAweDFBMjA0CisjZGVmaW5lIEdMX0FMV0FZU19GQVNUX0hJTlRfUEdJICAgICAgICAgICAweDFBMjBDCisjZGVmaW5lIEdMX0FMV0FZU19TT0ZUX0hJTlRfUEdJICAgICAgICAgICAweDFBMjBECisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfT0JKX0hJTlRfUEdJICAgICAgICAweDFBMjBFCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfV0lOX0hJTlRfUEdJICAgICAgICAweDFBMjBGCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfRlJHX0hJTlRfUEdJICAgICAgICAweDFBMjEwCisjZGVmaW5lIEdMX0FMTE9XX0RSQVdfTUVNX0hJTlRfUEdJICAgICAgICAweDFBMjExCisjZGVmaW5lIEdMX1NUUklDVF9ERVBUSEZVTkNfSElOVF9QR0kgICAgICAweDFBMjE2CisjZGVmaW5lIEdMX1NUUklDVF9MSUdIVElOR19ISU5UX1BHSSAgICAgICAweDFBMjE3CisjZGVmaW5lIEdMX1NUUklDVF9TQ0lTU09SX0hJTlRfUEdJICAgICAgICAweDFBMjE4CisjZGVmaW5lIEdMX0ZVTExfU1RJUFBMRV9ISU5UX1BHSSAgICAgICAgICAweDFBMjE5CisjZGVmaW5lIEdMX0NMSVBfTkVBUl9ISU5UX1BHSSAgICAgICAgICAgICAweDFBMjIwCisjZGVmaW5lIEdMX0NMSVBfRkFSX0hJTlRfUEdJICAgICAgICAgICAgICAweDFBMjIxCisjZGVmaW5lIEdMX1dJREVfTElORV9ISU5UX1BHSSAgICAgICAgICAgICAweDFBMjIyCisjZGVmaW5lIEdMX0JBQ0tfTk9STUFMU19ISU5UX1BHSSAgICAgICAgICAweDFBMjIzCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDFfRVhUICAgICAgICAgICAgICAgMHg4MEUyCisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMl9FWFQgICAgICAgICAgICAgICAweDgwRTMKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVg0X0VYVCAgICAgICAgICAgICAgIDB4ODBFNAorI2RlZmluZSBHTF9DT0xPUl9JTkRFWDhfRVhUICAgICAgICAgICAgICAgMHg4MEU1CisjZGVmaW5lIEdMX0NPTE9SX0lOREVYMTJfRVhUICAgICAgICAgICAgICAweDgwRTYKKyNkZWZpbmUgR0xfQ09MT1JfSU5ERVgxNl9FWFQgICAgICAgICAgICAgIDB4ODBFNworI2RlZmluZSBHTF9URVhUVVJFX0lOREVYX1NJWkVfRVhUICAgICAgICAgMHg4MEVECisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY2xpcF92b2x1bWVfaGludAorI2RlZmluZSBHTF9DTElQX1ZPTFVNRV9DTElQUElOR19ISU5UX0VYVCAgMHg4MEYwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2xpc3RfcHJpb3JpdHkKKyNkZWZpbmUgR0xfTElTVF9QUklPUklUWV9TR0lYICAgICAgICAgICAgIDB4ODE4MgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9pcl9pbnN0cnVtZW50MQorI2RlZmluZSBHTF9JUl9JTlNUUlVNRU5UMV9TR0lYICAgICAgICAgICAgMHg4MTdGCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2NhbGxpZ3JhcGhpY19mcmFnbWVudAorI2RlZmluZSBHTF9DQUxMSUdSQVBISUNfRlJBR01FTlRfU0dJWCAgICAgMHg4MTgzCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19TX1NHSVggICAgICAgIDB4ODE4RQorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX1RfU0dJWCAgICAgICAgMHg4MThGCisjZGVmaW5lIEdMX1RFWFRVUkVfTE9EX0JJQVNfUl9TR0lYICAgICAgICAweDgxOTAKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc2hhZG93X2FtYmllbnQKKyNkZWZpbmUgR0xfU0hBRE9XX0FNQklFTlRfU0dJWCAgICAgICAgICAgIDB4ODBCRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X3RleHR1cmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9tYXRlcmlhbAorI2RlZmluZSBHTF9JTkRFWF9NQVRFUklBTF9FWFQgICAgICAgICAgICAgMHg4MUI4CisjZGVmaW5lIEdMX0lOREVYX01BVEVSSUFMX1BBUkFNRVRFUl9FWFQgICAweDgxQjkKKyNkZWZpbmUgR0xfSU5ERVhfTUFURVJJQUxfRkFDRV9FWFQgICAgICAgIDB4ODFCQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2luZGV4X2Z1bmMKKyNkZWZpbmUgR0xfSU5ERVhfVEVTVF9FWFQgICAgICAgICAgICAgICAgIDB4ODFCNQorI2RlZmluZSBHTF9JTkRFWF9URVNUX0ZVTkNfRVhUICAgICAgICAgICAgMHg4MUI2CisjZGVmaW5lIEdMX0lOREVYX1RFU1RfUkVGX0VYVCAgICAgICAgICAgICAweDgxQjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9hcnJheV9mb3JtYXRzCisjZGVmaW5lIEdMX0lVSV9WMkZfRVhUICAgICAgICAgICAgICAgICAgICAweDgxQUQKKyNkZWZpbmUgR0xfSVVJX1YzRl9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODFBRQorI2RlZmluZSBHTF9JVUlfTjNGX1YyRl9FWFQgICAgICAgICAgICAgICAgMHg4MUFGCisjZGVmaW5lIEdMX0lVSV9OM0ZfVjNGX0VYVCAgICAgICAgICAgICAgICAweDgxQjAKKyNkZWZpbmUgR0xfVDJGX0lVSV9WMkZfRVhUICAgICAgICAgICAgICAgIDB4ODFCMQorI2RlZmluZSBHTF9UMkZfSVVJX1YzRl9FWFQgICAgICAgICAgICAgICAgMHg4MUIyCisjZGVmaW5lIEdMX1QyRl9JVUlfTjNGX1YyRl9FWFQgICAgICAgICAgICAweDgxQjMKKyNkZWZpbmUgR0xfVDJGX0lVSV9OM0ZfVjNGX0VYVCAgICAgICAgICAgIDB4ODFCNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbXBpbGVkX3ZlcnRleF9hcnJheQorI2RlZmluZSBHTF9BUlJBWV9FTEVNRU5UX0xPQ0tfRklSU1RfRVhUICAgMHg4MUE4CisjZGVmaW5lIEdMX0FSUkFZX0VMRU1FTlRfTE9DS19DT1VOVF9FWFQgICAweDgxQTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9FWFQgICAgICAgICAgICAgICAgMHg4MUFBCisjZGVmaW5lIEdMX0NVTExfVkVSVEVYX0VZRV9QT1NJVElPTl9FWFQgICAweDgxQUIKKyNkZWZpbmUgR0xfQ1VMTF9WRVJURVhfT0JKRUNUX1BPU0lUSU9OX0VYVCAweDgxQUMKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2IKKyNkZWZpbmUgR0xfWUNSQ0JfNDIyX1NHSVggICAgICAgICAgICAgICAgIDB4ODFCQgorI2RlZmluZSBHTF9ZQ1JDQl80NDRfU0dJWCAgICAgICAgICAgICAgICAgMHg4MUJDCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUSU5HX1NHSVggICAgICAgICAweDg0MDAKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfTUFURVJJQUxfU0dJWCAgIDB4ODQwMQorI2RlZmluZSBHTF9GUkFHTUVOVF9DT0xPUl9NQVRFUklBTF9GQUNFX1NHSVggMHg4NDAyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0NPTE9SX01BVEVSSUFMX1BBUkFNRVRFUl9TR0lYIDB4ODQwMworI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfTElHSFRTX1NHSVggICAgICAgMHg4NDA0CisjZGVmaW5lIEdMX01BWF9BQ1RJVkVfTElHSFRTX1NHSVggICAgICAgICAweDg0MDUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9SQVNURVJfTk9STUFMX1NHSVggICAgIDB4ODQwNgorI2RlZmluZSBHTF9MSUdIVF9FTlZfTU9ERV9TR0lYICAgICAgICAgICAgMHg4NDA3CisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUX01PREVMX0xPQ0FMX1ZJRVdFUl9TR0lYIDB4ODQwOAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9UV09fU0lERV9TR0lYIDB4ODQwOQorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVF9NT0RFTF9BTUJJRU5UX1NHSVggMHg4NDBBCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUX01PREVMX05PUk1BTF9JTlRFUlBPTEFUSU9OX1NHSVggMHg4NDBCCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUMF9TR0lYICAgICAgICAgICAweDg0MEMKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQxX1NHSVggICAgICAgICAgIDB4ODQwRAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDJfU0dJWCAgICAgICAgICAgMHg4NDBFCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUM19TR0lYICAgICAgICAgICAweDg0MEYKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ0X1NHSVggICAgICAgICAgIDB4ODQxMAorI2RlZmluZSBHTF9GUkFHTUVOVF9MSUdIVDVfU0dJWCAgICAgICAgICAgMHg4NDExCisjZGVmaW5lIEdMX0ZSQUdNRU5UX0xJR0hUNl9TR0lYICAgICAgICAgICAweDg0MTIKKyNkZWZpbmUgR0xfRlJBR01FTlRfTElHSFQ3X1NHSVggICAgICAgICAgIDB4ODQxMworI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3Jhc3RlcnBvc19jbGlwCisjZGVmaW5lIEdMX1JBU1RFUl9QT1NJVElPTl9VTkNMSVBQRURfSUJNICAweDE5MjYyCisjZW5kaWYKKworI2lmbmRlZiBHTF9IUF90ZXh0dXJlX2xpZ2h0aW5nCisjZGVmaW5lIEdMX1RFWFRVUkVfTElHSFRJTkdfTU9ERV9IUCAgICAgICAweDgxNjcKKyNkZWZpbmUgR0xfVEVYVFVSRV9QT1NUX1NQRUNVTEFSX0hQICAgICAgIDB4ODE2OAorI2RlZmluZSBHTF9URVhUVVJFX1BSRV9TUEVDVUxBUl9IUCAgICAgICAgMHg4MTY5CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19yYW5nZV9lbGVtZW50cworI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVNfRVhUICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTX0VYVCAgICAgICAweDgwRTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1dJTl9waG9uZ19zaGFkaW5nCisjZGVmaW5lIEdMX1BIT05HX1dJTiAgICAgICAgICAgICAgICAgICAgICAweDgwRUEKKyNkZWZpbmUgR0xfUEhPTkdfSElOVF9XSU4gICAgICAgICAgICAgICAgIDB4ODBFQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfV0lOX3NwZWN1bGFyX2ZvZworI2RlZmluZSBHTF9GT0dfU1BFQ1VMQVJfVEVYVFVSRV9XSU4gICAgICAgMHg4MEVDCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfbGlnaHRfdGV4dHVyZQorI2RlZmluZSBHTF9GUkFHTUVOVF9NQVRFUklBTF9FWFQgICAgICAgICAgMHg4MzQ5CisjZGVmaW5lIEdMX0ZSQUdNRU5UX05PUk1BTF9FWFQgICAgICAgICAgICAweDgzNEEKKyNkZWZpbmUgR0xfRlJBR01FTlRfQ09MT1JfRVhUICAgICAgICAgICAgIDB4ODM0QworI2RlZmluZSBHTF9BVFRFTlVBVElPTl9FWFQgICAgICAgICAgICAgICAgMHg4MzRECisjZGVmaW5lIEdMX1NIQURPV19BVFRFTlVBVElPTl9FWFQgICAgICAgICAweDgzNEUKKyNkZWZpbmUgR0xfVEVYVFVSRV9BUFBMSUNBVElPTl9NT0RFX0VYVCAgIDB4ODM0RgorI2RlZmluZSBHTF9URVhUVVJFX0xJR0hUX0VYVCAgICAgICAgICAgICAgMHg4MzUwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFURVJJQUxfRkFDRV9FWFQgICAgICAweDgzNTEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVRFUklBTF9QQVJBTUVURVJfRVhUIDB4ODM1MgorLyogcmV1c2UgR0xfRlJBR01FTlRfREVQVEhfRVhUICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2JsZW5kX2FscGhhX21pbm1heAorI2RlZmluZSBHTF9BTFBIQV9NSU5fU0dJWCAgICAgICAgICAgICAgICAgMHg4MzIwCisjZGVmaW5lIEdMX0FMUEhBX01BWF9TR0lYICAgICAgICAgICAgICAgICAweDgzMjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW1wYWN0X3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9RX0NFSUxJTkdfU0dJWCAgIDB4ODE4NAorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX1FfUk9VTkRfU0dJWCAgICAgMHg4MTg1CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fUV9GTE9PUl9TR0lYICAgICAweDgxODYKKyNkZWZpbmUgR0xfUElYRUxfVEVYX0dFTl9BTFBIQV9SRVBMQUNFX1NHSVggMHg4MTg3CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfTk9fUkVQTEFDRV9TR0lYIDB4ODE4OAorI2RlZmluZSBHTF9QSVhFTF9URVhfR0VOX0FMUEhBX0xTX1NHSVggICAgMHg4MTg5CisjZGVmaW5lIEdMX1BJWEVMX1RFWF9HRU5fQUxQSEFfTVNfU0dJWCAgICAweDgxOEEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9iZ3JhCisjZGVmaW5lIEdMX0JHUl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTAKKyNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luYworI2RlZmluZSBHTF9BU1lOQ19NQVJLRVJfU0dJWCAgICAgICAgICAgICAgMHg4MzI5CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX3BpeGVsCisjZGVmaW5lIEdMX0FTWU5DX1RFWF9JTUFHRV9TR0lYICAgICAgICAgICAweDgzNUMKKyNkZWZpbmUgR0xfQVNZTkNfRFJBV19QSVhFTFNfU0dJWCAgICAgICAgIDB4ODM1RAorI2RlZmluZSBHTF9BU1lOQ19SRUFEX1BJWEVMU19TR0lYICAgICAgICAgMHg4MzVFCisjZGVmaW5lIEdMX01BWF9BU1lOQ19URVhfSU1BR0VfU0dJWCAgICAgICAweDgzNUYKKyNkZWZpbmUgR0xfTUFYX0FTWU5DX0RSQVdfUElYRUxTX1NHSVggICAgIDB4ODM2MAorI2RlZmluZSBHTF9NQVhfQVNZTkNfUkVBRF9QSVhFTFNfU0dJWCAgICAgMHg4MzYxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9BU1lOQ19ISVNUT0dSQU1fU0dJWCAgICAgICAgICAgMHg4MzJDCisjZGVmaW5lIEdMX01BWF9BU1lOQ19ISVNUT0dSQU1fU0dJWCAgICAgICAweDgzMkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lOVEVMX3RleHR1cmVfc2Npc3NvcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzCisjZGVmaW5lIEdMX1BBUkFMTEVMX0FSUkFZU19JTlRFTCAgICAgICAgICAweDgzRjQKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfUEFSQUxMRUxfUE9JTlRFUlNfSU5URUwgMHg4M0Y2CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGNworI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BBUkFMTEVMX1BPSU5URVJTX0lOVEVMIDB4ODNGOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfb2NjbHVzaW9uX3Rlc3QKKyNkZWZpbmUgR0xfT0NDTFVTSU9OX1RFU1RfSFAgICAgICAgICAgICAgIDB4ODE2NQorI2RlZmluZSBHTF9PQ0NMVVNJT05fVEVTVF9SRVNVTFRfSFAgICAgICAgMHg4MTY2CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtCisjZGVmaW5lIEdMX1BJWEVMX1RSQU5TRk9STV8yRF9FWFQgICAgICAgICAweDgzMzAKKyNkZWZpbmUgR0xfUElYRUxfTUFHX0ZJTFRFUl9FWFQgICAgICAgICAgIDB4ODMzMQorI2RlZmluZSBHTF9QSVhFTF9NSU5fRklMVEVSX0VYVCAgICAgICAgICAgMHg4MzMyCisjZGVmaW5lIEdMX1BJWEVMX0NVQklDX1dFSUdIVF9FWFQgICAgICAgICAweDgzMzMKKyNkZWZpbmUgR0xfQ1VCSUNfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODMzNAorI2RlZmluZSBHTF9BVkVSQUdFX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MzM1CisjZGVmaW5lIEdMX1BJWEVMX1RSQU5TRk9STV8yRF9TVEFDS19ERVBUSF9FWFQgMHg4MzM2CisjZGVmaW5lIEdMX01BWF9QSVhFTF9UUkFOU0ZPUk1fMkRfU1RBQ0tfREVQVEhfRVhUIDB4ODMzNworI2RlZmluZSBHTF9QSVhFTF9UUkFOU0ZPUk1fMkRfTUFUUklYX0VYVCAgMHg4MzM4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtX2NvbG9yX3RhYmxlCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2hhcmVkX3RleHR1cmVfcGFsZXR0ZQorI2RlZmluZSBHTF9TSEFSRURfVEVYVFVSRV9QQUxFVFRFX0VYVCAgICAgMHg4MUZCCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTF9FWFQgIDB4ODFGOAorI2RlZmluZSBHTF9TSU5HTEVfQ09MT1JfRVhUICAgICAgICAgICAgICAgMHg4MUY5CisjZGVmaW5lIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SX0VYVCAgICAweDgxRkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZWNvbmRhcnlfY29sb3IKKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0VYVCAgICAgICAgICAgICAgICAgIDB4ODQ1OAorI2RlZmluZSBHTF9DVVJSRU5UX1NFQ09OREFSWV9DT0xPUl9FWFQgICAgMHg4NDU5CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9TSVpFX0VYVCAweDg0NUEKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1RZUEVfRVhUIDB4ODQ1QgorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfU1RSSURFX0VYVCAweDg0NUMKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX1BPSU5URVJfRVhUIDB4ODQ1RAorI2RlZmluZSBHTF9TRUNPTkRBUllfQ09MT1JfQVJSQVlfRVhUICAgICAgMHg4NDVFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9wZXJ0dXJiX25vcm1hbAorI2RlZmluZSBHTF9QRVJUVVJCX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4NUFFCisjZGVmaW5lIEdMX1RFWFRVUkVfTk9STUFMX0VYVCAgICAgICAgICAgICAweDg1QUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZvZ19jb29yZAorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9TT1VSQ0VfRVhUICAgICAgMHg4NDUwCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0VYVCAgICAgICAgICAgICAweDg0NTEKKyNkZWZpbmUgR0xfRlJBR01FTlRfREVQVEhfRVhUICAgICAgICAgICAgIDB4ODQ1MgorI2RlZmluZSBHTF9DVVJSRU5UX0ZPR19DT09SRElOQVRFX0VYVCAgICAgMHg4NDUzCisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX1RZUEVfRVhUICAweDg0NTQKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfU1RSSURFX0VYVCAweDg0NTUKKyNkZWZpbmUgR0xfRk9HX0NPT1JESU5BVEVfQVJSQVlfUE9JTlRFUl9FWFQgMHg4NDU2CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0VYVCAgICAgICAweDg0NTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1JFTkRfc2NyZWVuX2Nvb3JkaW5hdGVzCisjZGVmaW5lIEdMX1NDUkVFTl9DT09SRElOQVRFU19SRU5EICAgICAgICAweDg0OTAKKyNkZWZpbmUgR0xfSU5WRVJURURfU0NSRUVOX1dfUkVORCAgICAgICAgIDB4ODQ5MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUKKyNkZWZpbmUgR0xfVEFOR0VOVF9BUlJBWV9FWFQgICAgICAgICAgICAgIDB4ODQzOQorI2RlZmluZSBHTF9CSU5PUk1BTF9BUlJBWV9FWFQgICAgICAgICAgICAgMHg4NDNBCisjZGVmaW5lIEdMX0NVUlJFTlRfVEFOR0VOVF9FWFQgICAgICAgICAgICAweDg0M0IKKyNkZWZpbmUgR0xfQ1VSUkVOVF9CSU5PUk1BTF9FWFQgICAgICAgICAgIDB4ODQzQworI2RlZmluZSBHTF9UQU5HRU5UX0FSUkFZX1RZUEVfRVhUICAgICAgICAgMHg4NDNFCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfU1RSSURFX0VYVCAgICAgICAweDg0M0YKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfVFlQRV9FWFQgICAgICAgIDB4ODQ0MAorI2RlZmluZSBHTF9CSU5PUk1BTF9BUlJBWV9TVFJJREVfRVhUICAgICAgMHg4NDQxCisjZGVmaW5lIEdMX1RBTkdFTlRfQVJSQVlfUE9JTlRFUl9FWFQgICAgICAweDg0NDIKKyNkZWZpbmUgR0xfQklOT1JNQUxfQVJSQVlfUE9JTlRFUl9FWFQgICAgIDB4ODQ0MworI2RlZmluZSBHTF9NQVAxX1RBTkdFTlRfRVhUICAgICAgICAgICAgICAgMHg4NDQ0CisjZGVmaW5lIEdMX01BUDJfVEFOR0VOVF9FWFQgICAgICAgICAgICAgICAweDg0NDUKKyNkZWZpbmUgR0xfTUFQMV9CSU5PUk1BTF9FWFQgICAgICAgICAgICAgIDB4ODQ0NgorI2RlZmluZSBHTF9NQVAyX0JJTk9STUFMX0VYVCAgICAgICAgICAgICAgMHg4NDQ3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9DT01CSU5FX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4NTcwCisjZGVmaW5lIEdMX0NPTUJJTkVfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1NzEKKyNkZWZpbmUgR0xfQ09NQklORV9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU3MgorI2RlZmluZSBHTF9SR0JfU0NBTEVfRVhUICAgICAgICAgICAgICAgICAgMHg4NTczCisjZGVmaW5lIEdMX0FERF9TSUdORURfRVhUICAgICAgICAgICAgICAgICAweDg1NzQKKyNkZWZpbmUgR0xfSU5URVJQT0xBVEVfRVhUICAgICAgICAgICAgICAgIDB4ODU3NQorI2RlZmluZSBHTF9DT05TVEFOVF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NTc2CisjZGVmaW5lIEdMX1BSSU1BUllfQ09MT1JfRVhUICAgICAgICAgICAgICAweDg1NzcKKyNkZWZpbmUgR0xfUFJFVklPVVNfRVhUICAgICAgICAgICAgICAgICAgIDB4ODU3OAorI2RlZmluZSBHTF9TT1VSQ0UwX1JHQl9FWFQgICAgICAgICAgICAgICAgMHg4NTgwCisjZGVmaW5lIEdMX1NPVVJDRTFfUkdCX0VYVCAgICAgICAgICAgICAgICAweDg1ODEKKyNkZWZpbmUgR0xfU09VUkNFMl9SR0JfRVhUICAgICAgICAgICAgICAgIDB4ODU4MgorI2RlZmluZSBHTF9TT1VSQ0UwX0FMUEhBX0VYVCAgICAgICAgICAgICAgMHg4NTg4CisjZGVmaW5lIEdMX1NPVVJDRTFfQUxQSEFfRVhUICAgICAgICAgICAgICAweDg1ODkKKyNkZWZpbmUgR0xfU09VUkNFMl9BTFBIQV9FWFQgICAgICAgICAgICAgIDB4ODU4QQorI2RlZmluZSBHTF9PUEVSQU5EMF9SR0JfRVhUICAgICAgICAgICAgICAgMHg4NTkwCisjZGVmaW5lIEdMX09QRVJBTkQxX1JHQl9FWFQgICAgICAgICAgICAgICAweDg1OTEKKyNkZWZpbmUgR0xfT1BFUkFORDJfUkdCX0VYVCAgICAgICAgICAgICAgIDB4ODU5MgorI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQV9FWFQgICAgICAgICAgICAgMHg4NTk4CisjZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBX0VYVCAgICAgICAgICAgICAweDg1OTkKKyNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEFfRVhUICAgICAgICAgICAgIDB4ODU5QQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfc3BlY3VsYXJfdmVjdG9yCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1NQRUNVTEFSX1ZFQ1RPUl9BUFBMRSAweDg1QjAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3RyYW5zZm9ybV9oaW50CisjZGVmaW5lIEdMX1RSQU5TRk9STV9ISU5UX0FQUExFICAgICAgICAgICAweDg1QjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX3NjYWxlCisjZGVmaW5lIEdMX0ZPR19TQ0FMRV9TR0lYICAgICAgICAgICAgICAgICAweDgxRkMKKyNkZWZpbmUgR0xfRk9HX1NDQUxFX1ZBTFVFX1NHSVggICAgICAgICAgIDB4ODFGRAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOWF9jb25zdGFudF9kYXRhCisjZGVmaW5lIEdMX1VOUEFDS19DT05TVEFOVF9EQVRBX1NVTlggICAgICAweDgxRDUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT05TVEFOVF9EQVRBX1NVTlggICAgIDB4ODFENgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2dsb2JhbF9hbHBoYQorI2RlZmluZSBHTF9HTE9CQUxfQUxQSEFfU1VOICAgICAgICAgICAgICAgMHg4MUQ5CisjZGVmaW5lIEdMX0dMT0JBTF9BTFBIQV9GQUNUT1JfU1VOICAgICAgICAweDgxREEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl90cmlhbmdsZV9saXN0CisjZGVmaW5lIEdMX1JFU1RBUlRfU1VOICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfUkVQTEFDRV9NSURETEVfU1VOICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9SRVBMQUNFX09MREVTVF9TVU4gICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFX0xJU1RfU1VOICAgICAgICAgICAgICAweDgxRDcKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9TVU4gICAgICAgICAgIDB4ODFEOAorI2RlZmluZSBHTF9SRVBMQUNFTUVOVF9DT0RFX0FSUkFZX1NVTiAgICAgMHg4NUMwCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfVFlQRV9TVU4gMHg4NUMxCisjZGVmaW5lIEdMX1JFUExBQ0VNRU5UX0NPREVfQVJSQVlfU1RSSURFX1NVTiAweDg1QzIKKyNkZWZpbmUgR0xfUkVQTEFDRU1FTlRfQ09ERV9BUlJBWV9QT0lOVEVSX1NVTiAweDg1QzMKKyNkZWZpbmUgR0xfUjFVSV9WM0ZfU1VOICAgICAgICAgICAgICAgICAgIDB4ODVDNAorI2RlZmluZSBHTF9SMVVJX0M0VUJfVjNGX1NVTiAgICAgICAgICAgICAgMHg4NUM1CisjZGVmaW5lIEdMX1IxVUlfQzNGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzYKKyNkZWZpbmUgR0xfUjFVSV9OM0ZfVjNGX1NVTiAgICAgICAgICAgICAgIDB4ODVDNworI2RlZmluZSBHTF9SMVVJX0M0Rl9OM0ZfVjNGX1NVTiAgICAgICAgICAgMHg4NUM4CisjZGVmaW5lIEdMX1IxVUlfVDJGX1YzRl9TVU4gICAgICAgICAgICAgICAweDg1QzkKKyNkZWZpbmUgR0xfUjFVSV9UMkZfTjNGX1YzRl9TVU4gICAgICAgICAgIDB4ODVDQQorI2RlZmluZSBHTF9SMVVJX1QyRl9DNEZfTjNGX1YzRl9TVU4gICAgICAgMHg4NUNCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdmVydGV4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCX0VYVCAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0JfRVhUICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBX0VYVCAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEFfRVhUICAgICAgICAgICAgMHg4MENCCisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX2NvbG9yX2NsYW1wCisjZGVmaW5lIEdMX1JFRF9NSU5fQ0xBTVBfSU5HUiAgICAgICAgICAgICAweDg1NjAKKyNkZWZpbmUgR0xfR1JFRU5fTUlOX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2MQorI2RlZmluZSBHTF9CTFVFX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAgMHg4NTYyCisjZGVmaW5lIEdMX0FMUEhBX01JTl9DTEFNUF9JTkdSICAgICAgICAgICAweDg1NjMKKyNkZWZpbmUgR0xfUkVEX01BWF9DTEFNUF9JTkdSICAgICAgICAgICAgIDB4ODU2NAorI2RlZmluZSBHTF9HUkVFTl9NQVhfQ0xBTVBfSU5HUiAgICAgICAgICAgMHg4NTY1CisjZGVmaW5lIEdMX0JMVUVfTUFYX0NMQU1QX0lOR1IgICAgICAgICAgICAweDg1NjYKKyNkZWZpbmUgR0xfQUxQSEFfTUFYX0NMQU1QX0lOR1IgICAgICAgICAgIDB4ODU2NworI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZAorI2RlZmluZSBHTF9JTlRFUkxBQ0VfUkVBRF9JTkdSICAgICAgICAgICAgMHg4NTY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfc3RlbmNpbF93cmFwCisjZGVmaW5lIEdMX0lOQ1JfV1JBUF9FWFQgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQX0VYVCAgICAgICAgICAgICAgICAgIDB4ODUwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUXzQyMl9waXhlbHMKKyNkZWZpbmUgR0xfNDIyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQworI2RlZmluZSBHTF80MjJfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MENECisjZGVmaW5lIEdMXzQyMl9BVkVSQUdFX0VYVCAgICAgICAgICAgICAgICAweDgwQ0UKKyNkZWZpbmUgR0xfNDIyX1JFVl9BVkVSQUdFX0VYVCAgICAgICAgICAgIDB4ODBDRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4Z2VuX3JlZmxlY3Rpb24KKyNkZWZpbmUgR0xfTk9STUFMX01BUF9OViAgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9OViAgICAgICAgICAgICAgMHg4NTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jdWJlX21hcAorI2RlZmluZSBHTF9OT1JNQUxfTUFQX0VYVCAgICAgICAgICAgICAgICAgMHg4NTExCisjZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQX0VYVCAgICAgICAgICAgICAweDg1MTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9FWFQgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfRVhUICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9FWFQgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9FWFQgMHg4NTE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9FWFQgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9FWFQgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9FWFQgMHg4NTE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9FWFQgMHg4NTFBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfQ1VCRV9NQVBfRVhUICAgICAweDg1MUIKKyNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRV9FWFQgIDB4ODUxQworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9XUkFQX0JPUkRFUl9TVU4gICAgICAgICAgICAgICAgMHg4MUQ0CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9lbnZfYWRkCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgMHg4NEZECisjZGVmaW5lIEdMX1RFWFRVUkVfRklMVEVSX0NPTlRST0xfRVhUICAgICAweDg1MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgICAgIDB4ODUwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAweDg0RkUKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUIDB4ODRGRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcKKyNkZWZpbmUgR0xfTU9ERUxWSUVXMF9TVEFDS19ERVBUSF9FWFQgICAgIEdMX01PREVMVklFV19TVEFDS19ERVBUSAorI2RlZmluZSBHTF9NT0RFTFZJRVcxX1NUQUNLX0RFUFRIX0VYVCAgICAgMHg4NTAyCisjZGVmaW5lIEdMX01PREVMVklFVzBfTUFUUklYX0VYVCAgICAgICAgICBHTF9NT0RFTFZJRVdfTUFUUklYCisjZGVmaW5lIEdMX01PREVMVklFVzFfTUFUUklYX0VYVCAgICAgICAgICAweDg1MDYKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVElOR19FWFQgICAgICAgICAgIDB4ODUwOQorI2RlZmluZSBHTF9NT0RFTFZJRVcwX0VYVCAgICAgICAgICAgICAgICAgR0xfTU9ERUxWSUVXCisjZGVmaW5lIEdMX01PREVMVklFVzFfRVhUICAgICAgICAgICAgICAgICAweDg1MEEKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfV0VJR0hUX0VYVCAgICAgIDB4ODUwQgorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX0VYVCAgICAgICAgMHg4NTBDCisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfU0laRV9FWFQgICAweDg1MEQKKyNkZWZpbmUgR0xfVkVSVEVYX1dFSUdIVF9BUlJBWV9UWVBFX0VYVCAgIDB4ODUwRQorI2RlZmluZSBHTF9WRVJURVhfV0VJR0hUX0FSUkFZX1NUUklERV9FWFQgMHg4NTBGCisjZGVmaW5lIEdMX1ZFUlRFWF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9FWFQgMHg4NTEwCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9saWdodF9tYXhfZXhwb25lbnQKKyNkZWZpbmUgR0xfTUFYX1NISU5JTkVTU19OViAgICAgICAgICAgICAgIDB4ODUwNAorI2RlZmluZSBHTF9NQVhfU1BPVF9FWFBPTkVOVF9OViAgICAgICAgICAgMHg4NTA1CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX05WICAgICAgICAgIDB4ODUxRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfTEVOR1RIX05WICAgMHg4NTFFCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9SQU5HRV9WQUxJRF9OViAgICAweDg1MUYKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BUlJBWV9SQU5HRV9FTEVNRU5UX05WIDB4ODUyMAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfUE9JTlRFUl9OViAgMHg4NTIxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMKKyNkZWZpbmUgR0xfUkVHSVNURVJfQ09NQklORVJTX05WICAgICAgICAgIDB4ODUyMgorI2RlZmluZSBHTF9WQVJJQUJMRV9BX05WICAgICAgICAgICAgICAgICAgMHg4NTIzCisjZGVmaW5lIEdMX1ZBUklBQkxFX0JfTlYgICAgICAgICAgICAgICAgICAweDg1MjQKKyNkZWZpbmUgR0xfVkFSSUFCTEVfQ19OViAgICAgICAgICAgICAgICAgIDB4ODUyNQorI2RlZmluZSBHTF9WQVJJQUJMRV9EX05WICAgICAgICAgICAgICAgICAgMHg4NTI2CisjZGVmaW5lIEdMX1ZBUklBQkxFX0VfTlYgICAgICAgICAgICAgICAgICAweDg1MjcKKyNkZWZpbmUgR0xfVkFSSUFCTEVfRl9OViAgICAgICAgICAgICAgICAgIDB4ODUyOAorI2RlZmluZSBHTF9WQVJJQUJMRV9HX05WICAgICAgICAgICAgICAgICAgMHg4NTI5CisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SMF9OViAgICAgICAgICAgICAweDg1MkEKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IxX05WICAgICAgICAgICAgIDB4ODUyQgorI2RlZmluZSBHTF9QUklNQVJZX0NPTE9SX05WICAgICAgICAgICAgICAgMHg4NTJDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9OViAgICAgICAgICAgICAweDg1MkQKKyNkZWZpbmUgR0xfU1BBUkUwX05WICAgICAgICAgICAgICAgICAgICAgIDB4ODUyRQorI2RlZmluZSBHTF9TUEFSRTFfTlYgICAgICAgICAgICAgICAgICAgICAgMHg4NTJGCisjZGVmaW5lIEdMX0RJU0NBUkRfTlYgICAgICAgICAgICAgICAgICAgICAweDg1MzAKKyNkZWZpbmUgR0xfRV9USU1FU19GX05WICAgICAgICAgICAgICAgICAgIDB4ODUzMQorI2RlZmluZSBHTF9TUEFSRTBfUExVU19TRUNPTkRBUllfQ09MT1JfTlYgMHg4NTMyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lERU5USVRZX05WICAgICAgICAgICAweDg1MzYKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5WRVJUX05WICAgICAgICAgICAgIDB4ODUzNworI2RlZmluZSBHTF9FWFBBTkRfTk9STUFMX05WICAgICAgICAgICAgICAgMHg4NTM4CisjZGVmaW5lIEdMX0VYUEFORF9ORUdBVEVfTlYgICAgICAgICAgICAgICAweDg1MzkKKyNkZWZpbmUgR0xfSEFMRl9CSUFTX05PUk1BTF9OViAgICAgICAgICAgIDB4ODUzQQorI2RlZmluZSBHTF9IQUxGX0JJQVNfTkVHQVRFX05WICAgICAgICAgICAgMHg4NTNCCisjZGVmaW5lIEdMX1NJR05FRF9JREVOVElUWV9OViAgICAgICAgICAgICAweDg1M0MKKyNkZWZpbmUgR0xfU0lHTkVEX05FR0FURV9OViAgICAgICAgICAgICAgIDB4ODUzRAorI2RlZmluZSBHTF9TQ0FMRV9CWV9UV09fTlYgICAgICAgICAgICAgICAgMHg4NTNFCisjZGVmaW5lIEdMX1NDQUxFX0JZX0ZPVVJfTlYgICAgICAgICAgICAgICAweDg1M0YKKyNkZWZpbmUgR0xfU0NBTEVfQllfT05FX0hBTEZfTlYgICAgICAgICAgIDB4ODU0MAorI2RlZmluZSBHTF9CSUFTX0JZX05FR0FUSVZFX09ORV9IQUxGX05WICAgMHg4NTQxCisjZGVmaW5lIEdMX0NPTUJJTkVSX0lOUFVUX05WICAgICAgICAgICAgICAweDg1NDIKKyNkZWZpbmUgR0xfQ09NQklORVJfTUFQUElOR19OViAgICAgICAgICAgIDB4ODU0MworI2RlZmluZSBHTF9DT01CSU5FUl9DT01QT05FTlRfVVNBR0VfTlYgICAgMHg4NTQ0CisjZGVmaW5lIEdMX0NPTUJJTkVSX0FCX0RPVF9QUk9EVUNUX05WICAgICAweDg1NDUKKyNkZWZpbmUgR0xfQ09NQklORVJfQ0RfRE9UX1BST0RVQ1RfTlYgICAgIDB4ODU0NgorI2RlZmluZSBHTF9DT01CSU5FUl9NVVhfU1VNX05WICAgICAgICAgICAgMHg4NTQ3CisjZGVmaW5lIEdMX0NPTUJJTkVSX1NDQUxFX05WICAgICAgICAgICAgICAweDg1NDgKKyNkZWZpbmUgR0xfQ09NQklORVJfQklBU19OViAgICAgICAgICAgICAgIDB4ODU0OQorI2RlZmluZSBHTF9DT01CSU5FUl9BQl9PVVRQVVRfTlYgICAgICAgICAgMHg4NTRBCisjZGVmaW5lIEdMX0NPTUJJTkVSX0NEX09VVFBVVF9OViAgICAgICAgICAweDg1NEIKKyNkZWZpbmUgR0xfQ09NQklORVJfU1VNX09VVFBVVF9OViAgICAgICAgIDB4ODU0QworI2RlZmluZSBHTF9NQVhfR0VORVJBTF9DT01CSU5FUlNfTlYgICAgICAgMHg4NTRECisjZGVmaW5lIEdMX05VTV9HRU5FUkFMX0NPTUJJTkVSU19OViAgICAgICAweDg1NEUKKyNkZWZpbmUgR0xfQ09MT1JfU1VNX0NMQU1QX05WICAgICAgICAgICAgIDB4ODU0RgorI2RlZmluZSBHTF9DT01CSU5FUjBfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUwCisjZGVmaW5lIEdMX0NPTUJJTkVSMV9OViAgICAgICAgICAgICAgICAgICAweDg1NTEKKyNkZWZpbmUgR0xfQ09NQklORVIyX05WICAgICAgICAgICAgICAgICAgIDB4ODU1MgorI2RlZmluZSBHTF9DT01CSU5FUjNfTlYgICAgICAgICAgICAgICAgICAgMHg4NTUzCisjZGVmaW5lIEdMX0NPTUJJTkVSNF9OViAgICAgICAgICAgICAgICAgICAweDg1NTQKKyNkZWZpbmUgR0xfQ09NQklORVI1X05WICAgICAgICAgICAgICAgICAgIDB4ODU1NQorI2RlZmluZSBHTF9DT01CSU5FUjZfTlYgICAgICAgICAgICAgICAgICAgMHg4NTU2CisjZGVmaW5lIEdMX0NPTUJJTkVSN19OViAgICAgICAgICAgICAgICAgICAweDg1NTcKKy8qIHJldXNlIEdMX1RFWFRVUkUwX0FSQiAqLworLyogcmV1c2UgR0xfVEVYVFVSRTFfQVJCICovCisvKiByZXVzZSBHTF9aRVJPICovCisvKiByZXVzZSBHTF9OT05FICovCisvKiByZXVzZSBHTF9GT0cgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZvZ19kaXN0YW5jZQorI2RlZmluZSBHTF9GT0dfRElTVEFOQ0VfTU9ERV9OViAgICAgICAgICAgMHg4NTVBCisjZGVmaW5lIEdMX0VZRV9SQURJQUxfTlYgICAgICAgICAgICAgICAgICAweDg1NUIKKyNkZWZpbmUgR0xfRVlFX1BMQU5FX0FCU09MVVRFX05WICAgICAgICAgIDB4ODU1QworLyogcmV1c2UgR0xfRVlFX1BMQU5FICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXhnZW5fZW1ib3NzCisjZGVmaW5lIEdMX0VNQk9TU19MSUdIVF9OViAgICAgICAgICAgICAgICAweDg1NUQKKyNkZWZpbmUgR0xfRU1CT1NTX0NPTlNUQU5UX05WICAgICAgICAgICAgIDB4ODU1RQorI2RlZmluZSBHTF9FTUJPU1NfTUFQX05WICAgICAgICAgICAgICAgICAgMHg4NTVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9ibGVuZF9zcXVhcmUKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfZW52X2NvbWJpbmU0CisjZGVmaW5lIEdMX0NPTUJJTkU0X05WICAgICAgICAgICAgICAgICAgICAweDg1MDMKKyNkZWZpbmUgR0xfU09VUkNFM19SR0JfTlYgICAgICAgICAgICAgICAgIDB4ODU4MworI2RlZmluZSBHTF9TT1VSQ0UzX0FMUEhBX05WICAgICAgICAgICAgICAgMHg4NThCCisjZGVmaW5lIEdMX09QRVJBTkQzX1JHQl9OViAgICAgICAgICAgICAgICAweDg1OTMKKyNkZWZpbmUgR0xfT1BFUkFORDNfQUxQSEFfTlYgICAgICAgICAgICAgIDB4ODU5QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV9yZXNpemVfYnVmZmVycworI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV93aW5kb3dfcG9zCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgICAweDgzRjAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgIDB4ODNGMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCAgMHg4M0YyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICAweDgzRjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9jdWxsX3ZlcnRleAorI2RlZmluZSBHTF9DVUxMX1ZFUlRFWF9JQk0gICAgICAgICAgICAgICAgMTAzMDUwCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fbXVsdGltb2RlX2RyYXdfYXJyYXlzCisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fdmVydGV4X2FycmF5X2xpc3RzCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAxMDMwNzAKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0xJU1RfSUJNICAgICAgICAgIDEwMzA3MQorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9MSVNUX0lCTSAgICAgICAgICAgMTAzMDcyCisjZGVmaW5lIEdMX0lOREVYX0FSUkFZX0xJU1RfSUJNICAgICAgICAgICAxMDMwNzMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9MSVNUX0lCTSAgIDEwMzA3NAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfTElTVF9JQk0gICAgICAgMTAzMDc1CisjZGVmaW5lIEdMX0ZPR19DT09SRElOQVRFX0FSUkFZX0xJU1RfSUJNICAxMDMwNzYKKyNkZWZpbmUgR0xfU0VDT05EQVJZX0NPTE9SX0FSUkFZX0xJU1RfSUJNIDEwMzA3NworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgMTAzMDgwCisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9MSVNUX1NUUklERV9JQk0gICAxMDMwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfTElTVF9TVFJJREVfSUJNICAgIDEwMzA4MgorI2RlZmluZSBHTF9JTkRFWF9BUlJBWV9MSVNUX1NUUklERV9JQk0gICAgMTAzMDgzCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NAorI2RlZmluZSBHTF9FREdFX0ZMQUdfQVJSQVlfTElTVF9TVFJJREVfSUJNIDEwMzA4NQorI2RlZmluZSBHTF9GT0dfQ09PUkRJTkFURV9BUlJBWV9MSVNUX1NUUklERV9JQk0gMTAzMDg2CisjZGVmaW5lIEdMX1NFQ09OREFSWV9DT0xPUl9BUlJBWV9MSVNUX1NUUklERV9JQk0gMTAzMDg3CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3N1YnNhbXBsZQorI2RlZmluZSBHTF9QQUNLX1NVQlNBTVBMRV9SQVRFX1NHSVggICAgICAgMHg4NUEwCisjZGVmaW5lIEdMX1VOUEFDS19TVUJTQU1QTEVfUkFURV9TR0lYICAgICAweDg1QTEKKyNkZWZpbmUgR0xfUElYRUxfU1VCU0FNUExFXzQ0NDRfU0dJWCAgICAgIDB4ODVBMgorI2RlZmluZSBHTF9QSVhFTF9TVUJTQU1QTEVfMjQyNF9TR0lYICAgICAgMHg4NUEzCisjZGVmaW5lIEdMX1BJWEVMX1NVQlNBTVBMRV80MjQyX1NHSVggICAgICAweDg1QTQKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiYQorI2RlZmluZSBHTF9ZQ1JDQl9TR0lYICAgICAgICAgICAgICAgICAgICAgMHg4MzE4CisjZGVmaW5lIEdMX1lDUkNCQV9TR0lYICAgICAgICAgICAgICAgICAgICAweDgzMTkKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9kZXB0aF9wYXNzX2luc3RydW1lbnQKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX1NHSVggICAgIDB4ODMxMAorI2RlZmluZSBHTF9ERVBUSF9QQVNTX0lOU1RSVU1FTlRfQ09VTlRFUlNfU0dJWCAweDgzMTEKKyNkZWZpbmUgR0xfREVQVEhfUEFTU19JTlNUUlVNRU5UX01BWF9TR0lYIDB4ODMxMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfM0RGWF90ZXh0dXJlX2NvbXByZXNzaW9uX0ZYVDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfRlhUMV8zREZYICAgICAgIDB4ODZCMAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfRlhUMV8zREZYICAgICAgMHg4NkIxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX01VTFRJU0FNUExFXzNERlggICAgICAgICAgICAgICAweDg2QjIKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfM0RGWCAgICAgICAgICAgIDB4ODZCMworI2RlZmluZSBHTF9TQU1QTEVTXzNERlggICAgICAgICAgICAgICAgICAgMHg4NkI0CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVF8zREZYICAgICAgICAgICAweDIwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX3RidWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9FWFQgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19NQVNLX0VYVCAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORV9FWFQgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19FWFQgICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMXzFQQVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgwQTEKKyNkZWZpbmUgR0xfMlBBU1NfMF9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBMgorI2RlZmluZSBHTF8yUEFTU18xX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEEzCisjZGVmaW5lIEdMXzRQQVNTXzBfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTQKKyNkZWZpbmUgR0xfNFBBU1NfMV9FWFQgICAgICAgICAgICAgICAgICAgIDB4ODBBNQorI2RlZmluZSBHTF80UEFTU18yX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE2CisjZGVmaW5lIEdMXzRQQVNTXzNfRVhUICAgICAgICAgICAgICAgICAgICAweDgwQTcKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlNfRVhUICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9NQVNLX1ZBTFVFX0VYVCAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX01BU0tfSU5WRVJUX0VYVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9TQU1QTEVfUEFUVEVSTl9FWFQgICAgICAgICAgICAgMHg4MEFDCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JJVF9FWFQgICAgICAgICAgICAweDIwMDAwMDAwCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ZlcnRleF9wcmVjbGlwCisjZGVmaW5lIEdMX1ZFUlRFWF9QUkVDTElQX1NHSVggICAgICAgICAgICAweDgzRUUKKyNkZWZpbmUgR0xfVkVSVEVYX1BSRUNMSVBfSElOVF9TR0lYICAgICAgIDB4ODNFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jb252b2x1dGlvbl9hY2N1cmFjeQorI2RlZmluZSBHTF9DT05WT0xVVElPTl9ISU5UX1NHSVggICAgICAgICAgMHg4MzE2CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1BBQ0tfUkVTQU1QTEVfU0dJWCAgICAgICAgICAgICAweDg0MkMKKyNkZWZpbmUgR0xfVU5QQUNLX1JFU0FNUExFX1NHSVggICAgICAgICAgIDB4ODQyRAorI2RlZmluZSBHTF9SRVNBTVBMRV9SRVBMSUNBVEVfU0dJWCAgICAgICAgMHg4NDJFCisjZGVmaW5lIEdMX1JFU0FNUExFX1pFUk9fRklMTF9TR0lYICAgICAgICAweDg0MkYKKyNkZWZpbmUgR0xfUkVTQU1QTEVfREVDSU1BVEVfU0dJWCAgICAgICAgIDB4ODQzMAorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbgorI2RlZmluZSBHTF9FWUVfRElTVEFOQ0VfVE9fUE9JTlRfU0dJUyAgICAgMHg4MUYwCisjZGVmaW5lIEdMX09CSkVDVF9ESVNUQU5DRV9UT19QT0lOVF9TR0lTICAweDgxRjEKKyNkZWZpbmUgR0xfRVlFX0RJU1RBTkNFX1RPX0xJTkVfU0dJUyAgICAgIDB4ODFGMgorI2RlZmluZSBHTF9PQkpFQ1RfRElTVEFOQ0VfVE9fTElORV9TR0lTICAgMHg4MUYzCisjZGVmaW5lIEdMX0VZRV9QT0lOVF9TR0lTICAgICAgICAgICAgICAgICAweDgxRjQKKyNkZWZpbmUgR0xfT0JKRUNUX1BPSU5UX1NHSVMgICAgICAgICAgICAgIDB4ODFGNQorI2RlZmluZSBHTF9FWUVfTElORV9TR0lTICAgICAgICAgICAgICAgICAgMHg4MUY2CisjZGVmaW5lIEdMX09CSkVDVF9MSU5FX1NHSVMgICAgICAgICAgICAgICAweDgxRjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09MT1JfV1JJVEVNQVNLX1NHSVMgICAweDgxRUYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0RPVDNfUkdCX0VYVCAgICAgICAgICAgICAgICAgICAweDg3NDAKKyNkZWZpbmUgR0xfRE9UM19SR0JBX0VYVCAgICAgICAgICAgICAgICAgIDB4ODc0MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX0FUSSAgICAgICAgICAgICAgIDB4ODc0MgorI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fRURHRV9BVEkgICAgICAgMHg4NzQzCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mZW5jZQorI2RlZmluZSBHTF9BTExfQ09NUExFVEVEX05WICAgICAgICAgICAgICAgMHg4NEYyCisjZGVmaW5lIEdMX0ZFTkNFX1NUQVRVU19OViAgICAgICAgICAgICAgICAweDg0RjMKKyNkZWZpbmUgR0xfRkVOQ0VfQ09ORElUSU9OX05WICAgICAgICAgICAgIDB4ODRGNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfSUJNX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0CisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVF9JQk0gICAgICAgICAgICAweDgzNzAKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V2YWx1YXRvcnMKKyNkZWZpbmUgR0xfRVZBTF8yRF9OViAgICAgICAgICAgICAgICAgICAgIDB4ODZDMAorI2RlZmluZSBHTF9FVkFMX1RSSUFOR1VMQVJfMkRfTlYgICAgICAgICAgMHg4NkMxCisjZGVmaW5lIEdMX01BUF9URVNTRUxMQVRJT05fTlYgICAgICAgICAgICAweDg2QzIKKyNkZWZpbmUgR0xfTUFQX0FUVFJJQl9VX09SREVSX05WICAgICAgICAgIDB4ODZDMworI2RlZmluZSBHTF9NQVBfQVRUUklCX1ZfT1JERVJfTlYgICAgICAgICAgMHg4NkM0CisjZGVmaW5lIEdMX0VWQUxfRlJBQ1RJT05BTF9URVNTRUxMQVRJT05fTlYgMHg4NkM1CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjBfTlYgICAgICAgICAweDg2QzYKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMV9OViAgICAgICAgIDB4ODZDNworI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIyX05WICAgICAgICAgMHg4NkM4CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjNfTlYgICAgICAgICAweDg2QzkKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCNF9OViAgICAgICAgIDB4ODZDQQorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI1X05WICAgICAgICAgMHg4NkNCCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjZfTlYgICAgICAgICAweDg2Q0MKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCN19OViAgICAgICAgIDB4ODZDRAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUI4X05WICAgICAgICAgMHg4NkNFCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjlfTlYgICAgICAgICAweDg2Q0YKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTBfTlYgICAgICAgIDB4ODZEMAorI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxMV9OViAgICAgICAgMHg4NkQxCisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjEyX05WICAgICAgICAweDg2RDIKKyNkZWZpbmUgR0xfRVZBTF9WRVJURVhfQVRUUklCMTNfTlYgICAgICAgIDB4ODZEMworI2RlZmluZSBHTF9FVkFMX1ZFUlRFWF9BVFRSSUIxNF9OViAgICAgICAgMHg4NkQ0CisjZGVmaW5lIEdMX0VWQUxfVkVSVEVYX0FUVFJJQjE1X05WICAgICAgICAweDg2RDUKKyNkZWZpbmUgR0xfTUFYX01BUF9URVNTRUxMQVRJT05fTlYgICAgICAgIDB4ODZENgorI2RlZmluZSBHTF9NQVhfUkFUSU9OQUxfRVZBTF9PUkRFUl9OViAgICAgMHg4NkQ3CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX05WICAgICAgICAgICAgICAgMHg4NEY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84X05WICAgICAgICAgICAweDg0RkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIKKyNkZWZpbmUgR0xfUEVSX1NUQUdFX0NPTlNUQU5UU19OViAgICAgICAgIDB4ODUzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfcmVjdGFuZ2xlCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVDVEFOR0xFX05WICAgICAgICAgICAweDg0RjUKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX1JFQ1RBTkdMRV9OViAgIDB4ODRGNgorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAgMHg4NEY3CisjZGVmaW5lIEdMX01BWF9SRUNUQU5HTEVfVEVYVFVSRV9TSVpFX05WICAweDg0RjgKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX1JFQ1RBTkdMRV9OViAgICAweDg2NEMKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfUkVDVEFOR0xFX1NDQUxFX05WIDB4ODY0RAorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg2NEUKKyNkZWZpbmUgR0xfUkdCQV9VTlNJR05FRF9ET1RfUFJPRFVDVF9NQVBQSU5HX05WIDB4ODZEOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfUzhfUzhfOF84X05WICAgICAgMHg4NkRBCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF84XzhfUzhfUzhfUkVWX05WICAweDg2REIKKyNkZWZpbmUgR0xfRFNEVF9NQUdfSU5URU5TSVRZX05WICAgICAgICAgIDB4ODZEQworI2RlZmluZSBHTF9TSEFERVJfQ09OU0lTVEVOVF9OViAgICAgICAgICAgMHg4NkRECisjZGVmaW5lIEdMX1RFWFRVUkVfU0hBREVSX05WICAgICAgICAgICAgICAweDg2REUKKyNkZWZpbmUgR0xfU0hBREVSX09QRVJBVElPTl9OViAgICAgICAgICAgIDB4ODZERgorI2RlZmluZSBHTF9DVUxMX01PREVTX05WICAgICAgICAgICAgICAgICAgMHg4NkUwCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFX01BVFJJWF9OViAgICAgICAweDg2RTEKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfU0NBTEVfTlYgICAgICAgIDB4ODZFMgorI2RlZmluZSBHTF9PRkZTRVRfVEVYVFVSRV9CSUFTX05WICAgICAgICAgMHg4NkUzCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX01BVFJJWF9OViAgICBHTF9PRkZTRVRfVEVYVFVSRV9NQVRSSVhfTlYKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfMkRfU0NBTEVfTlYgICAgIEdMX09GRlNFVF9URVhUVVJFX1NDQUxFX05WCisjZGVmaW5lIEdMX09GRlNFVF9URVhUVVJFXzJEX0JJQVNfTlYgICAgICBHTF9PRkZTRVRfVEVYVFVSRV9CSUFTX05WCisjZGVmaW5lIEdMX1BSRVZJT1VTX1RFWFRVUkVfSU5QVVRfTlYgICAgICAweDg2RTQKKyNkZWZpbmUgR0xfQ09OU1RfRVlFX05WICAgICAgICAgICAgICAgICAgIDB4ODZFNQorI2RlZmluZSBHTF9QQVNTX1RIUk9VR0hfTlYgICAgICAgICAgICAgICAgMHg4NkU2CisjZGVmaW5lIEdMX0NVTExfRlJBR01FTlRfTlYgICAgICAgICAgICAgICAweDg2RTcKKyNkZWZpbmUgR0xfT0ZGU0VUX1RFWFRVUkVfMkRfTlYgICAgICAgICAgIDB4ODZFOAorI2RlZmluZSBHTF9ERVBFTkRFTlRfQVJfVEVYVFVSRV8yRF9OViAgICAgMHg4NkU5CisjZGVmaW5lIEdMX0RFUEVOREVOVF9HQl9URVhUVVJFXzJEX05WICAgICAweDg2RUEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfTlYgICAgICAgICAgICAgICAgIDB4ODZFQworI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9ERVBUSF9SRVBMQUNFX05WICAgMHg4NkVECisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX1RFWFRVUkVfMkRfTlYgICAgICAweDg2RUUKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV9DVUJFX01BUF9OViAweDg2RjAKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfRElGRlVTRV9DVUJFX01BUF9OViAweDg2RjEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfUkVGTEVDVF9DVUJFX01BUF9OViAweDg2RjIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfQ09OU1RfRVlFX1JFRkxFQ1RfQ1VCRV9NQVBfTlYgMHg4NkYzCisjZGVmaW5lIEdMX0hJTE9fTlYgICAgICAgICAgICAgICAgICAgICAgICAweDg2RjQKKyNkZWZpbmUgR0xfRFNEVF9OViAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZGNQorI2RlZmluZSBHTF9EU0RUX01BR19OViAgICAgICAgICAgICAgICAgICAgMHg4NkY2CisjZGVmaW5lIEdMX0RTRFRfTUFHX1ZJQl9OViAgICAgICAgICAgICAgICAweDg2RjcKKyNkZWZpbmUgR0xfSElMTzE2X05WICAgICAgICAgICAgICAgICAgICAgIDB4ODZGOAorI2RlZmluZSBHTF9TSUdORURfSElMT19OViAgICAgICAgICAgICAgICAgMHg4NkY5CisjZGVmaW5lIEdMX1NJR05FRF9ISUxPMTZfTlYgICAgICAgICAgICAgICAweDg2RkEKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQkFfTlYgICAgICAgICAgICAgICAgIDB4ODZGQgorI2RlZmluZSBHTF9TSUdORURfUkdCQThfTlYgICAgICAgICAgICAgICAgMHg4NkZDCisjZGVmaW5lIEdMX1NJR05FRF9SR0JfTlYgICAgICAgICAgICAgICAgICAweDg2RkUKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQjhfTlYgICAgICAgICAgICAgICAgIDB4ODZGRgorI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFX05WICAgICAgICAgICAgMHg4NzAxCisjZGVmaW5lIEdMX1NJR05FRF9MVU1JTkFOQ0U4X05WICAgICAgICAgICAweDg3MDIKKyNkZWZpbmUgR0xfU0lHTkVEX0xVTUlOQU5DRV9BTFBIQV9OViAgICAgIDB4ODcwMworI2RlZmluZSBHTF9TSUdORURfTFVNSU5BTkNFOF9BTFBIQThfTlYgICAgMHg4NzA0CisjZGVmaW5lIEdMX1NJR05FRF9BTFBIQV9OViAgICAgICAgICAgICAgICAweDg3MDUKKyNkZWZpbmUgR0xfU0lHTkVEX0FMUEhBOF9OViAgICAgICAgICAgICAgIDB4ODcwNgorI2RlZmluZSBHTF9TSUdORURfSU5URU5TSVRZX05WICAgICAgICAgICAgMHg4NzA3CisjZGVmaW5lIEdMX1NJR05FRF9JTlRFTlNJVFk4X05WICAgICAgICAgICAweDg3MDgKKyNkZWZpbmUgR0xfRFNEVDhfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4ODcwOQorI2RlZmluZSBHTF9EU0RUOF9NQUc4X05WICAgICAgICAgICAgICAgICAgMHg4NzBBCisjZGVmaW5lIEdMX0RTRFQ4X01BRzhfSU5URU5TSVRZOF9OViAgICAgICAweDg3MEIKKyNkZWZpbmUgR0xfU0lHTkVEX1JHQl9VTlNJR05FRF9BTFBIQV9OViAgIDB4ODcwQworI2RlZmluZSBHTF9TSUdORURfUkdCOF9VTlNJR05FRF9BTFBIQThfTlYgMHg4NzBECisjZGVmaW5lIEdMX0hJX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MEUKKyNkZWZpbmUgR0xfTE9fU0NBTEVfTlYgICAgICAgICAgICAgICAgICAgIDB4ODcwRgorI2RlZmluZSBHTF9EU19TQ0FMRV9OViAgICAgICAgICAgICAgICAgICAgMHg4NzEwCisjZGVmaW5lIEdMX0RUX1NDQUxFX05WICAgICAgICAgICAgICAgICAgICAweDg3MTEKKyNkZWZpbmUgR0xfTUFHTklUVURFX1NDQUxFX05WICAgICAgICAgICAgIDB4ODcxMgorI2RlZmluZSBHTF9WSUJSQU5DRV9TQ0FMRV9OViAgICAgICAgICAgICAgMHg4NzEzCisjZGVmaW5lIEdMX0hJX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTQKKyNkZWZpbmUgR0xfTE9fQklBU19OViAgICAgICAgICAgICAgICAgICAgIDB4ODcxNQorI2RlZmluZSBHTF9EU19CSUFTX05WICAgICAgICAgICAgICAgICAgICAgMHg4NzE2CisjZGVmaW5lIEdMX0RUX0JJQVNfTlYgICAgICAgICAgICAgICAgICAgICAweDg3MTcKKyNkZWZpbmUgR0xfTUFHTklUVURFX0JJQVNfTlYgICAgICAgICAgICAgIDB4ODcxOAorI2RlZmluZSBHTF9WSUJSQU5DRV9CSUFTX05WICAgICAgICAgICAgICAgMHg4NzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfQk9SREVSX1ZBTFVFU19OViAgICAgICAweDg3MUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9ISV9TSVpFX05WICAgICAgICAgICAgIDB4ODcxQgorI2RlZmluZSBHTF9URVhUVVJFX0xPX1NJWkVfTlYgICAgICAgICAgICAgMHg4NzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfRFNfU0laRV9OViAgICAgICAgICAgICAweDg3MUQKKyNkZWZpbmUgR0xfVEVYVFVSRV9EVF9TSVpFX05WICAgICAgICAgICAgIDB4ODcxRQorI2RlZmluZSBHTF9URVhUVVJFX01BR19TSVpFX05WICAgICAgICAgICAgMHg4NzFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX3NoYWRlcjIKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfVEVYVFVSRV8zRF9OViAgICAgIDB4ODZFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlMgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfV0lUSE9VVF9GTFVTSF9OViAweDg1MzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX05WICAgICAgICAgICAgICAweDg2MjAKKyNkZWZpbmUgR0xfVkVSVEVYX1NUQVRFX1BST0dSQU1fTlYgICAgICAgIDB4ODYyMQorI2RlZmluZSBHTF9BVFRSSUJfQVJSQVlfU0laRV9OViAgICAgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9TVFJJREVfTlYgICAgICAgICAweDg2MjQKKyNkZWZpbmUgR0xfQVRUUklCX0FSUkFZX1RZUEVfTlYgICAgICAgICAgIDB4ODYyNQorI2RlZmluZSBHTF9DVVJSRU5UX0FUVFJJQl9OViAgICAgICAgICAgICAgMHg4NjI2CisjZGVmaW5lIEdMX1BST0dSQU1fTEVOR1RIX05WICAgICAgICAgICAgICAweDg2MjcKKyNkZWZpbmUgR0xfUFJPR1JBTV9TVFJJTkdfTlYgICAgICAgICAgICAgIDB4ODYyOAorI2RlZmluZSBHTF9NT0RFTFZJRVdfUFJPSkVDVElPTl9OViAgICAgICAgMHg4NjI5CisjZGVmaW5lIEdMX0lERU5USVRZX05WICAgICAgICAgICAgICAgICAgICAweDg2MkEKKyNkZWZpbmUgR0xfSU5WRVJTRV9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYyQgorI2RlZmluZSBHTF9UUkFOU1BPU0VfTlYgICAgICAgICAgICAgICAgICAgMHg4NjJDCisjZGVmaW5lIEdMX0lOVkVSU0VfVFJBTlNQT1NFX05WICAgICAgICAgICAweDg2MkQKKyNkZWZpbmUgR0xfTUFYX1RSQUNLX01BVFJJWF9TVEFDS19ERVBUSF9OViAweDg2MkUKKyNkZWZpbmUgR0xfTUFYX1RSQUNLX01BVFJJQ0VTX05WICAgICAgICAgIDB4ODYyRgorI2RlZmluZSBHTF9NQVRSSVgwX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMwCisjZGVmaW5lIEdMX01BVFJJWDFfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzEKKyNkZWZpbmUgR0xfTUFUUklYMl9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzMgorI2RlZmluZSBHTF9NQVRSSVgzX05WICAgICAgICAgICAgICAgICAgICAgMHg4NjMzCisjZGVmaW5lIEdMX01BVFJJWDRfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzQKKyNkZWZpbmUgR0xfTUFUUklYNV9OViAgICAgICAgICAgICAgICAgICAgIDB4ODYzNQorI2RlZmluZSBHTF9NQVRSSVg2X05WICAgICAgICAgICAgICAgICAgICAgMHg4NjM2CisjZGVmaW5lIEdMX01BVFJJWDdfTlYgICAgICAgICAgICAgICAgICAgICAweDg2MzcKKyNkZWZpbmUgR0xfQ1VSUkVOVF9NQVRSSVhfU1RBQ0tfREVQVEhfTlYgIDB4ODY0MAorI2RlZmluZSBHTF9DVVJSRU5UX01BVFJJWF9OViAgICAgICAgICAgICAgMHg4NjQxCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkVfTlYgICAweDg2NDIKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fVFdPX1NJREVfTlYgICAgIDB4ODY0MworI2RlZmluZSBHTF9QUk9HUkFNX1BBUkFNRVRFUl9OViAgICAgICAgICAgMHg4NjQ0CisjZGVmaW5lIEdMX0FUVFJJQl9BUlJBWV9QT0lOVEVSX05WICAgICAgICAweDg2NDUKKyNkZWZpbmUgR0xfUFJPR1JBTV9UQVJHRVRfTlYgICAgICAgICAgICAgIDB4ODY0NgorI2RlZmluZSBHTF9QUk9HUkFNX1JFU0lERU5UX05WICAgICAgICAgICAgMHg4NjQ3CisjZGVmaW5lIEdMX1RSQUNLX01BVFJJWF9OViAgICAgICAgICAgICAgICAweDg2NDgKKyNkZWZpbmUgR0xfVFJBQ0tfTUFUUklYX1RSQU5TRk9STV9OViAgICAgIDB4ODY0OQorI2RlZmluZSBHTF9WRVJURVhfUFJPR1JBTV9CSU5ESU5HX05WICAgICAgMHg4NjRBCisjZGVmaW5lIEdMX1BST0dSQU1fRVJST1JfUE9TSVRJT05fTlYgICAgICAweDg2NEIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTBfTlYgICAgICAgIDB4ODY1MAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMV9OViAgICAgICAgMHg4NjUxCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkyX05WICAgICAgICAweDg2NTIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTNfTlYgICAgICAgIDB4ODY1MworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZNF9OViAgICAgICAgMHg4NjU0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk1X05WICAgICAgICAweDg2NTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTZfTlYgICAgICAgIDB4ODY1NgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZN19OViAgICAgICAgMHg4NjU3CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVk4X05WICAgICAgICAweDg2NTgKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTlfTlYgICAgICAgIDB4ODY1OQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTBfTlYgICAgICAgMHg4NjVBCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxMV9OViAgICAgICAweDg2NUIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTEyX05WICAgICAgIDB4ODY1QworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZMTNfTlYgICAgICAgMHg4NjVECisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVkxNF9OViAgICAgICAweDg2NUUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWTE1X05WICAgICAgIDB4ODY1RgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIwXzRfTlYgICAgICAgMHg4NjYwCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjFfNF9OViAgICAgICAweDg2NjEKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMl80X05WICAgICAgIDB4ODY2MgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIzXzRfTlYgICAgICAgMHg4NjYzCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjRfNF9OViAgICAgICAweDg2NjQKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCNV80X05WICAgICAgIDB4ODY2NQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI2XzRfTlYgICAgICAgMHg4NjY2CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjdfNF9OViAgICAgICAweDg2NjcKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCOF80X05WICAgICAgIDB4ODY2OAorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUI5XzRfTlYgICAgICAgMHg4NjY5CisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEwXzRfTlYgICAgICAweDg2NkEKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTFfNF9OViAgICAgIDB4ODY2QgorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxMl80X05WICAgICAgMHg4NjZDCisjZGVmaW5lIEdMX01BUDFfVkVSVEVYX0FUVFJJQjEzXzRfTlYgICAgICAweDg2NkQKKyNkZWZpbmUgR0xfTUFQMV9WRVJURVhfQVRUUklCMTRfNF9OViAgICAgIDB4ODY2RQorI2RlZmluZSBHTF9NQVAxX1ZFUlRFWF9BVFRSSUIxNV80X05WICAgICAgMHg4NjZGCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjBfNF9OViAgICAgICAweDg2NzAKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMV80X05WICAgICAgIDB4ODY3MQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIyXzRfTlYgICAgICAgMHg4NjcyCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjNfNF9OViAgICAgICAweDg2NzMKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCNF80X05WICAgICAgIDB4ODY3NAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI1XzRfTlYgICAgICAgMHg4Njc1CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjZfNF9OViAgICAgICAweDg2NzYKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCN180X05WICAgICAgIDB4ODY3NworI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUI4XzRfTlYgICAgICAgMHg4Njc4CisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjlfNF9OViAgICAgICAweDg2NzkKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTBfNF9OViAgICAgIDB4ODY3QQorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxMV80X05WICAgICAgMHg4NjdCCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjEyXzRfTlYgICAgICAweDg2N0MKKyNkZWZpbmUgR0xfTUFQMl9WRVJURVhfQVRUUklCMTNfNF9OViAgICAgIDB4ODY3RAorI2RlZmluZSBHTF9NQVAyX1ZFUlRFWF9BVFRSSUIxNF80X05WICAgICAgMHg4NjdFCisjZGVmaW5lIEdMX01BUDJfVkVSVEVYX0FUVFJJQjE1XzRfTlYgICAgICAweDg2N0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9jb29yZGluYXRlX2NsYW1wCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0NMQU1QX1NfU0dJWCAgICAgICAweDgzNjkKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQ0xBTVBfVF9TR0lYICAgICAgIDB4ODM2QQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9DTEFNUF9SX1NHSVggICAgICAgMHg4MzZCCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NjYWxlYmlhc19oaW50CisjZGVmaW5lIEdMX1NDQUxFQklBU19ISU5UX1NHSVggICAgICAgICAgICAweDgzMjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9pbnRlcmxhY2UKKyNkZWZpbmUgR0xfSU5URVJMQUNFX09NTCAgICAgICAgICAgICAgICAgIDB4ODk4MAorI2RlZmluZSBHTF9JTlRFUkxBQ0VfUkVBRF9PTUwgICAgICAgICAgICAgMHg4OTgxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfc3Vic2FtcGxlCisjZGVmaW5lIEdMX0ZPUk1BVF9TVUJTQU1QTEVfMjRfMjRfT01MICAgICAweDg5ODIKKyNkZWZpbmUgR0xfRk9STUFUX1NVQlNBTVBMRV8yNDRfMjQ0X09NTCAgIDB4ODk4MworI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1BBQ0tfUkVTQU1QTEVfT01MICAgICAgICAgICAgICAweDg5ODQKKyNkZWZpbmUgR0xfVU5QQUNLX1JFU0FNUExFX09NTCAgICAgICAgICAgIDB4ODk4NQorI2RlZmluZSBHTF9SRVNBTVBMRV9SRVBMSUNBVEVfT01MICAgICAgICAgMHg4OTg2CisjZGVmaW5lIEdMX1JFU0FNUExFX1pFUk9fRklMTF9PTUwgICAgICAgICAweDg5ODcKKyNkZWZpbmUgR0xfUkVTQU1QTEVfQVZFUkFHRV9PTUwgICAgICAgICAgIDB4ODk4OAorI2RlZmluZSBHTF9SRVNBTVBMRV9ERUNJTUFURV9PTUwgICAgICAgICAgMHg4OTg5CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9jb3B5X2RlcHRoX3RvX2NvbG9yCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfVE9fUkdCQV9OViAgICAgICAweDg4NkUKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9UT19CR1JBX05WICAgICAgIDB4ODg2RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2Vudm1hcF9idW1wbWFwCisjZGVmaW5lIEdMX0JVTVBfUk9UX01BVFJJWF9BVEkgICAgICAgICAgICAweDg3NzUKKyNkZWZpbmUgR0xfQlVNUF9ST1RfTUFUUklYX1NJWkVfQVRJICAgICAgIDB4ODc3NgorI2RlZmluZSBHTF9CVU1QX05VTV9URVhfVU5JVFNfQVRJICAgICAgICAgMHg4Nzc3CisjZGVmaW5lIEdMX0JVTVBfVEVYX1VOSVRTX0FUSSAgICAgICAgICAgICAweDg3NzgKKyNkZWZpbmUgR0xfRFVEVl9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODc3OQorI2RlZmluZSBHTF9EVThEVjhfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4NzdBCisjZGVmaW5lIEdMX0JVTVBfRU5WTUFQX0FUSSAgICAgICAgICAgICAgICAweDg3N0IKKyNkZWZpbmUgR0xfQlVNUF9UQVJHRVRfQVRJICAgICAgICAgICAgICAgIDB4ODc3QworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQVRJICAgICAgICAgICAgMHg4OTIwCisjZGVmaW5lIEdMX1JFR18wX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjEKKyNkZWZpbmUgR0xfUkVHXzFfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyMgorI2RlZmluZSBHTF9SRUdfMl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTIzCisjZGVmaW5lIEdMX1JFR18zX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjQKKyNkZWZpbmUgR0xfUkVHXzRfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyNQorI2RlZmluZSBHTF9SRUdfNV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI2CisjZGVmaW5lIEdMX1JFR182X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MjcKKyNkZWZpbmUgR0xfUkVHXzdfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODkyOAorI2RlZmluZSBHTF9SRUdfOF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTI5CisjZGVmaW5lIEdMX1JFR185X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5MkEKKyNkZWZpbmUgR0xfUkVHXzEwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyQgorI2RlZmluZSBHTF9SRUdfMTFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJDCisjZGVmaW5lIEdMX1JFR18xMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MkQKKyNkZWZpbmUgR0xfUkVHXzEzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkyRQorI2RlZmluZSBHTF9SRUdfMTRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTJGCisjZGVmaW5lIEdMX1JFR18xNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzAKKyNkZWZpbmUgR0xfUkVHXzE2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzMQorI2RlZmluZSBHTF9SRUdfMTdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTMyCisjZGVmaW5lIEdMX1JFR18xOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzMKKyNkZWZpbmUgR0xfUkVHXzE5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNAorI2RlZmluZSBHTF9SRUdfMjBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM1CisjZGVmaW5lIEdMX1JFR18yMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzYKKyNkZWZpbmUgR0xfUkVHXzIyX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzNworI2RlZmluZSBHTF9SRUdfMjNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTM4CisjZGVmaW5lIEdMX1JFR18yNF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5MzkKKyNkZWZpbmUgR0xfUkVHXzI1X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzQQorI2RlZmluZSBHTF9SRUdfMjZfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNCCisjZGVmaW5lIEdMX1JFR18yN19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0MKKyNkZWZpbmUgR0xfUkVHXzI4X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODkzRAorI2RlZmluZSBHTF9SRUdfMjlfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTNFCisjZGVmaW5lIEdMX1JFR18zMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5M0YKKyNkZWZpbmUgR0xfUkVHXzMxX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0MAorI2RlZmluZSBHTF9DT05fMF9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQxCisjZGVmaW5lIEdMX0NPTl8xX0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDIKKyNkZWZpbmUgR0xfQ09OXzJfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0MworI2RlZmluZSBHTF9DT05fM19BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ0CisjZGVmaW5lIEdMX0NPTl80X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDUKKyNkZWZpbmUgR0xfQ09OXzVfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0NgorI2RlZmluZSBHTF9DT05fNl9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTQ3CisjZGVmaW5lIEdMX0NPTl83X0FUSSAgICAgICAgICAgICAgICAgICAgICAweDg5NDgKKyNkZWZpbmUgR0xfQ09OXzhfQVRJICAgICAgICAgICAgICAgICAgICAgIDB4ODk0OQorI2RlZmluZSBHTF9DT05fOV9BVEkgICAgICAgICAgICAgICAgICAgICAgMHg4OTRBCisjZGVmaW5lIEdMX0NPTl8xMF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEIKKyNkZWZpbmUgR0xfQ09OXzExX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0QworI2RlZmluZSBHTF9DT05fMTJfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTRECisjZGVmaW5lIEdMX0NPTl8xM19BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NEUKKyNkZWZpbmUgR0xfQ09OXzE0X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk0RgorI2RlZmluZSBHTF9DT05fMTVfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUwCisjZGVmaW5lIEdMX0NPTl8xNl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTEKKyNkZWZpbmUgR0xfQ09OXzE3X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1MgorI2RlZmluZSBHTF9DT05fMThfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTUzCisjZGVmaW5lIEdMX0NPTl8xOV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTQKKyNkZWZpbmUgR0xfQ09OXzIwX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1NQorI2RlZmluZSBHTF9DT05fMjFfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU2CisjZGVmaW5lIEdMX0NPTl8yMl9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NTcKKyNkZWZpbmUgR0xfQ09OXzIzX0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1OAorI2RlZmluZSBHTF9DT05fMjRfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTU5CisjZGVmaW5lIEdMX0NPTl8yNV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUEKKyNkZWZpbmUgR0xfQ09OXzI2X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1QgorI2RlZmluZSBHTF9DT05fMjdfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVDCisjZGVmaW5lIEdMX0NPTl8yOF9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NUQKKyNkZWZpbmUgR0xfQ09OXzI5X0FUSSAgICAgICAgICAgICAgICAgICAgIDB4ODk1RQorI2RlZmluZSBHTF9DT05fMzBfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4OTVGCisjZGVmaW5lIEdMX0NPTl8zMV9BVEkgICAgICAgICAgICAgICAgICAgICAweDg5NjAKKyNkZWZpbmUgR0xfTU9WX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2MQorI2RlZmluZSBHTF9BRERfQVRJICAgICAgICAgICAgICAgICAgICAgICAgMHg4OTYzCisjZGVmaW5lIEdMX01VTF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NjQKKyNkZWZpbmUgR0xfU1VCX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2NQorI2RlZmluZSBHTF9ET1QzX0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY2CisjZGVmaW5lIEdMX0RPVDRfQVRJICAgICAgICAgICAgICAgICAgICAgICAweDg5NjcKKyNkZWZpbmUgR0xfTUFEX0FUSSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2OAorI2RlZmluZSBHTF9MRVJQX0FUSSAgICAgICAgICAgICAgICAgICAgICAgMHg4OTY5CisjZGVmaW5lIEdMX0NORF9BVEkgICAgICAgICAgICAgICAgICAgICAgICAweDg5NkEKKyNkZWZpbmUgR0xfQ05EMF9BVEkgICAgICAgICAgICAgICAgICAgICAgIDB4ODk2QgorI2RlZmluZSBHTF9ET1QyX0FERF9BVEkgICAgICAgICAgICAgICAgICAgMHg4OTZDCisjZGVmaW5lIEdMX1NFQ09OREFSWV9JTlRFUlBPTEFUT1JfQVRJICAgICAweDg5NkQKKyNkZWZpbmUgR0xfTlVNX0ZSQUdNRU5UX1JFR0lTVEVSU19BVEkgICAgIDB4ODk2RQorI2RlZmluZSBHTF9OVU1fRlJBR01FTlRfQ09OU1RBTlRTX0FUSSAgICAgMHg4OTZGCisjZGVmaW5lIEdMX05VTV9QQVNTRVNfQVRJICAgICAgICAgICAgICAgICAweDg5NzAKKyNkZWZpbmUgR0xfTlVNX0lOU1RSVUNUSU9OU19QRVJfUEFTU19BVEkgIDB4ODk3MQorI2RlZmluZSBHTF9OVU1fSU5TVFJVQ1RJT05TX1RPVEFMX0FUSSAgICAgMHg4OTcyCisjZGVmaW5lIEdMX05VTV9JTlBVVF9JTlRFUlBPTEFUT1JfQ09NUE9ORU5UU19BVEkgMHg4OTczCisjZGVmaW5lIEdMX05VTV9MT09QQkFDS19DT01QT05FTlRTX0FUSSAgICAweDg5NzQKKyNkZWZpbmUgR0xfQ09MT1JfQUxQSEFfUEFJUklOR19BVEkgICAgICAgIDB4ODk3NQorI2RlZmluZSBHTF9TV0laWkxFX1NUUl9BVEkgICAgICAgICAgICAgICAgMHg4OTc2CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RRX0FUSSAgICAgICAgICAgICAgICAweDg5NzcKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJfRFJfQVRJICAgICAgICAgICAgIDB4ODk3OAorI2RlZmluZSBHTF9TV0laWkxFX1NUUV9EUV9BVEkgICAgICAgICAgICAgMHg4OTc5CisjZGVmaW5lIEdMX1NXSVpaTEVfU1RSUV9BVEkgICAgICAgICAgICAgICAweDg5N0EKKyNkZWZpbmUgR0xfU1dJWlpMRV9TVFJRX0RRX0FUSSAgICAgICAgICAgIDB4ODk3QgorI2RlZmluZSBHTF9SRURfQklUX0FUSSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9HUkVFTl9CSVRfQVRJICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9CTFVFX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF8yWF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF80WF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF84WF9CSVRfQVRJICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9IQUxGX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9RVUFSVEVSX0JJVF9BVEkgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBHTF9FSUdIVEhfQklUX0FUSSAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9TQVRVUkFURV9CSVRfQVRJICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTF9DT01QX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9ORUdBVEVfQklUX0FUSSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9CSUFTX0JJVF9BVEkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BuX3RyaWFuZ2xlcworI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfQVRJICAgICAgICAgICAgICAgMHg4N0YwCisjZGVmaW5lIEdMX01BWF9QTl9UUklBTkdMRVNfVEVTU0VMQVRJT05fTEVWRUxfQVRJIDB4ODdGMQorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfUE9JTlRfTU9ERV9BVEkgICAgMHg4N0YyCisjZGVmaW5lIEdMX1BOX1RSSUFOR0xFU19OT1JNQUxfTU9ERV9BVEkgICAweDg3RjMKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1RFU1NFTEFUSU9OX0xFVkVMX0FUSSAweDg3RjQKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfTElORUFSX0FUSSAweDg3RjUKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX1BPSU5UX01PREVfQ1VCSUNfQVRJIDB4ODdGNgorI2RlZmluZSBHTF9QTl9UUklBTkdMRVNfTk9STUFMX01PREVfTElORUFSX0FUSSAweDg3RjcKKyNkZWZpbmUgR0xfUE5fVFJJQU5HTEVTX05PUk1BTF9NT0RFX1FVQURSQVRJQ19BVEkgMHg4N0Y4CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9TVEFUSUNfQVRJICAgICAgICAgICAgICAgICAgICAgMHg4NzYwCisjZGVmaW5lIEdMX0RZTkFNSUNfQVRJICAgICAgICAgICAgICAgICAgICAweDg3NjEKKyNkZWZpbmUgR0xfUFJFU0VSVkVfQVRJICAgICAgICAgICAgICAgICAgIDB4ODc2MgorI2RlZmluZSBHTF9ESVNDQVJEX0FUSSAgICAgICAgICAgICAgICAgICAgMHg4NzYzCisjZGVmaW5lIEdMX09CSkVDVF9CVUZGRVJfU0laRV9BVEkgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfT0JKRUNUX0JVRkZFUl9VU0FHRV9BVEkgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9BUlJBWV9PQkpFQ1RfQlVGRkVSX0FUSSAgICAgICAgMHg4NzY2CisjZGVmaW5lIEdMX0FSUkFZX09CSkVDVF9PRkZTRVRfQVRJICAgICAgICAweDg3NjcKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfRVhUICAgICAgICAgICAgICAweDg3ODAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9CSU5ESU5HX0VYVCAgICAgIDB4ODc4MQorI2RlZmluZSBHTF9PUF9JTkRFWF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzgyCisjZGVmaW5lIEdMX09QX05FR0FURV9FWFQgICAgICAgICAgICAgICAgICAweDg3ODMKKyNkZWZpbmUgR0xfT1BfRE9UM19FWFQgICAgICAgICAgICAgICAgICAgIDB4ODc4NAorI2RlZmluZSBHTF9PUF9ET1Q0X0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg1CisjZGVmaW5lIEdMX09QX01VTF9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3ODYKKyNkZWZpbmUgR0xfT1BfQUREX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4NworI2RlZmluZSBHTF9PUF9NQUREX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4Nzg4CisjZGVmaW5lIEdMX09QX0ZSQUNfRVhUICAgICAgICAgICAgICAgICAgICAweDg3ODkKKyNkZWZpbmUgR0xfT1BfTUFYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc4QQorI2RlZmluZSBHTF9PUF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgMHg4NzhCCisjZGVmaW5lIEdMX09QX1NFVF9HRV9FWFQgICAgICAgICAgICAgICAgICAweDg3OEMKKyNkZWZpbmUgR0xfT1BfU0VUX0xUX0VYVCAgICAgICAgICAgICAgICAgIDB4ODc4RAorI2RlZmluZSBHTF9PUF9DTEFNUF9FWFQgICAgICAgICAgICAgICAgICAgMHg4NzhFCisjZGVmaW5lIEdMX09QX0ZMT09SX0VYVCAgICAgICAgICAgICAgICAgICAweDg3OEYKKyNkZWZpbmUgR0xfT1BfUk9VTkRfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5MAorI2RlZmluZSBHTF9PUF9FWFBfQkFTRV8yX0VYVCAgICAgICAgICAgICAgMHg4NzkxCisjZGVmaW5lIEdMX09QX0xPR19CQVNFXzJfRVhUICAgICAgICAgICAgICAweDg3OTIKKyNkZWZpbmUgR0xfT1BfUE9XRVJfRVhUICAgICAgICAgICAgICAgICAgIDB4ODc5MworI2RlZmluZSBHTF9PUF9SRUNJUF9FWFQgICAgICAgICAgICAgICAgICAgMHg4Nzk0CisjZGVmaW5lIEdMX09QX1JFQ0lQX1NRUlRfRVhUICAgICAgICAgICAgICAweDg3OTUKKyNkZWZpbmUgR0xfT1BfU1VCX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc5NgorI2RlZmluZSBHTF9PUF9DUk9TU19QUk9EVUNUX0VYVCAgICAgICAgICAgMHg4Nzk3CisjZGVmaW5lIEdMX09QX01VTFRJUExZX01BVFJJWF9FWFQgICAgICAgICAweDg3OTgKKyNkZWZpbmUgR0xfT1BfTU9WX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODc5OQorI2RlZmluZSBHTF9PVVRQVVRfVkVSVEVYX0VYVCAgICAgICAgICAgICAgMHg4NzlBCisjZGVmaW5lIEdMX09VVFBVVF9DT0xPUjBfRVhUICAgICAgICAgICAgICAweDg3OUIKKyNkZWZpbmUgR0xfT1VUUFVUX0NPTE9SMV9FWFQgICAgICAgICAgICAgIDB4ODc5QworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDBfRVhUICAgICAgMHg4NzlECisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMV9FWFQgICAgICAweDg3OUUKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyX0VYVCAgICAgIDB4ODc5RgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDNfRVhUICAgICAgMHg4N0EwCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JENF9FWFQgICAgICAweDg3QTEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ1X0VYVCAgICAgIDB4ODdBMgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDZfRVhUICAgICAgMHg4N0EzCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEN19FWFQgICAgICAweDg3QTQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQ4X0VYVCAgICAgIDB4ODdBNQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDlfRVhUICAgICAgMHg4N0E2CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTBfRVhUICAgICAweDg3QTcKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxMV9FWFQgICAgIDB4ODdBOAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDEyX0VYVCAgICAgMHg4N0E5CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTNfRVhUICAgICAweDg3QUEKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxNF9FWFQgICAgIDB4ODdBQgorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE1X0VYVCAgICAgMHg4N0FDCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTZfRVhUICAgICAweDg3QUQKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQxN19FWFQgICAgIDB4ODdBRQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDE4X0VYVCAgICAgMHg4N0FGCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMTlfRVhUICAgICAweDg3QjAKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyMF9FWFQgICAgIDB4ODdCMQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDIxX0VYVCAgICAgMHg4N0IyCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjJfRVhUICAgICAweDg3QjMKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyM19FWFQgICAgIDB4ODdCNAorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI0X0VYVCAgICAgMHg4N0I1CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjVfRVhUICAgICAweDg3QjYKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyNl9FWFQgICAgIDB4ODdCNworI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDI3X0VYVCAgICAgMHg4N0I4CisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMjhfRVhUICAgICAweDg3QjkKKyNkZWZpbmUgR0xfT1VUUFVUX1RFWFRVUkVfQ09PUkQyOV9FWFQgICAgIDB4ODdCQQorI2RlZmluZSBHTF9PVVRQVVRfVEVYVFVSRV9DT09SRDMwX0VYVCAgICAgMHg4N0JCCisjZGVmaW5lIEdMX09VVFBVVF9URVhUVVJFX0NPT1JEMzFfRVhUICAgICAweDg3QkMKKyNkZWZpbmUgR0xfT1VUUFVUX0ZPR19FWFQgICAgICAgICAgICAgICAgIDB4ODdCRAorI2RlZmluZSBHTF9TQ0FMQVJfRVhUICAgICAgICAgICAgICAgICAgICAgMHg4N0JFCisjZGVmaW5lIEdMX1ZFQ1RPUl9FWFQgICAgICAgICAgICAgICAgICAgICAweDg3QkYKKyNkZWZpbmUgR0xfTUFUUklYX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODdDMAorI2RlZmluZSBHTF9WQVJJQU5UX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4N0MxCisjZGVmaW5lIEdMX0lOVkFSSUFOVF9FWFQgICAgICAgICAgICAgICAgICAweDg3QzIKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfRVhUICAgICAgICAgICAgIDB4ODdDMworI2RlZmluZSBHTF9MT0NBTF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4N0M0CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0M1CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX1ZBUklBTlRTX0VYVCAweDg3QzYKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgMHg4N0M3CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0xPQ0FMX0NPTlNUQU5UU19FWFQgMHg4N0M4CisjZGVmaW5lIEdMX01BWF9WRVJURVhfU0hBREVSX0xPQ0FMU19FWFQgICAweDg3QzkKKyNkZWZpbmUgR0xfTUFYX09QVElNSVpFRF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0NBCisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9WQVJJQU5UU19FWFQgMHg4N0NCCisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9MT0NBTF9DT05TVEFOVFNfRVhUIDB4ODdDQworI2RlZmluZSBHTF9NQVhfT1BUSU1JWkVEX1ZFUlRFWF9TSEFERVJfSU5WQVJJQU5UU19FWFQgMHg4N0NECisjZGVmaW5lIEdMX01BWF9PUFRJTUlaRURfVkVSVEVYX1NIQURFUl9MT0NBTFNfRVhUIDB4ODdDRQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0lOU1RSVUNUSU9OU19FWFQgMHg4N0NGCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfVkFSSUFOVFNfRVhUICAgICAweDg3RDAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9JTlZBUklBTlRTX0VYVCAgIDB4ODdEMQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0xPQ0FMX0NPTlNUQU5UU19FWFQgMHg4N0QyCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfTE9DQUxTX0VYVCAgICAgICAweDg3RDMKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9PUFRJTUlaRURfRVhUICAgIDB4ODdENAorI2RlZmluZSBHTF9YX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q1CisjZGVmaW5lIEdMX1lfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RDYKKyNkZWZpbmUgR0xfWl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdENworI2RlZmluZSBHTF9XX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Q4CisjZGVmaW5lIEdMX05FR0FUSVZFX1hfRVhUICAgICAgICAgICAgICAgICAweDg3RDkKKyNkZWZpbmUgR0xfTkVHQVRJVkVfWV9FWFQgICAgICAgICAgICAgICAgIDB4ODdEQQorI2RlZmluZSBHTF9ORUdBVElWRV9aX0VYVCAgICAgICAgICAgICAgICAgMHg4N0RCCisjZGVmaW5lIEdMX05FR0FUSVZFX1dfRVhUICAgICAgICAgICAgICAgICAweDg3REMKKyNkZWZpbmUgR0xfWkVST19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODdERAorI2RlZmluZSBHTF9PTkVfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0RFCisjZGVmaW5lIEdMX05FR0FUSVZFX09ORV9FWFQgICAgICAgICAgICAgICAweDg3REYKKyNkZWZpbmUgR0xfTk9STUFMSVpFRF9SQU5HRV9FWFQgICAgICAgICAgIDB4ODdFMAorI2RlZmluZSBHTF9GVUxMX1JBTkdFX0VYVCAgICAgICAgICAgICAgICAgMHg4N0UxCisjZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0VYVCAgICAgICAgICAgICAweDg3RTIKKyNkZWZpbmUgR0xfTVZQX01BVFJJWF9FWFQgICAgICAgICAgICAgICAgIDB4ODdFMworI2RlZmluZSBHTF9WQVJJQU5UX1ZBTFVFX0VYVCAgICAgICAgICAgICAgMHg4N0U0CisjZGVmaW5lIEdMX1ZBUklBTlRfREFUQVRZUEVfRVhUICAgICAgICAgICAweDg3RTUKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9TVFJJREVfRVhUICAgICAgIDB4ODdFNgorI2RlZmluZSBHTF9WQVJJQU5UX0FSUkFZX1RZUEVfRVhUICAgICAgICAgMHg4N0U3CisjZGVmaW5lIEdMX1ZBUklBTlRfQVJSQVlfRVhUICAgICAgICAgICAgICAweDg3RTgKKyNkZWZpbmUgR0xfVkFSSUFOVF9BUlJBWV9QT0lOVEVSX0VYVCAgICAgIDB4ODdFOQorI2RlZmluZSBHTF9JTlZBUklBTlRfVkFMVUVfRVhUICAgICAgICAgICAgMHg4N0VBCisjZGVmaW5lIEdMX0lOVkFSSUFOVF9EQVRBVFlQRV9FWFQgICAgICAgICAweDg3RUIKKyNkZWZpbmUgR0xfTE9DQUxfQ09OU1RBTlRfVkFMVUVfRVhUICAgICAgIDB4ODdFQworI2RlZmluZSBHTF9MT0NBTF9DT05TVEFOVF9EQVRBVFlQRV9FWFQgICAgMHg4N0VECisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdmVydGV4X3N0cmVhbXMKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TVFJFQU1TX0FUSSAgICAgICAgIDB4ODc2QgorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNMF9BVEkgICAgICAgICAgICAgMHg4NzZDCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU0xX0FUSSAgICAgICAgICAgICAweDg3NkQKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTJfQVRJICAgICAgICAgICAgIDB4ODc2RQorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNM19BVEkgICAgICAgICAgICAgMHg4NzZGCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU00X0FUSSAgICAgICAgICAgICAweDg3NzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NUUkVBTTVfQVRJICAgICAgICAgICAgIDB4ODc3MQorI2RlZmluZSBHTF9WRVJURVhfU1RSRUFNNl9BVEkgICAgICAgICAgICAgMHg4NzcyCisjZGVmaW5lIEdMX1ZFUlRFWF9TVFJFQU03X0FUSSAgICAgICAgICAgICAweDg3NzMKKyNkZWZpbmUgR0xfVkVSVEVYX1NPVVJDRV9BVEkgICAgICAgICAgICAgIDB4ODc3NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9BVEkgICAgICAgICAgICAgIDB4ODc2OAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1RZUEVfQVRJICAgICAgICAgMHg4NzY5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfUE9JTlRFUl9BVEkgICAgICAweDg3NkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9tZXNoX2FycmF5CisjZGVmaW5lIEdMX1FVQURfTUVTSF9TVU4gICAgICAgICAgICAgICAgICAweDg2MTQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfTUVTSF9TVU4gICAgICAgICAgICAgIDB4ODYxNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3NsaWNlX2FjY3VtCisjZGVmaW5lIEdMX1NMSUNFX0FDQ1VNX1NVTiAgICAgICAgICAgICAgICAweDg1Q0MKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX211bHRpc2FtcGxlX2ZpbHRlcl9oaW50CisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0ZJTFRFUl9ISU5UX05WICAgICAweDg1MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2NsYW1wCisjZGVmaW5lIEdMX0RFUFRIX0NMQU1QX05WICAgICAgICAgICAgICAgICAweDg2NEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX29jY2x1c2lvbl9xdWVyeQorI2RlZmluZSBHTF9QSVhFTF9DT1VOVEVSX0JJVFNfTlYgICAgICAgICAgMHg4ODY0CisjZGVmaW5lIEdMX0NVUlJFTlRfT0NDTFVTSU9OX1FVRVJZX0lEX05WICAweDg4NjUKKyNkZWZpbmUgR0xfUElYRUxfQ09VTlRfTlYgICAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9QSVhFTF9DT1VOVF9BVkFJTEFCTEVfTlYgICAgICAgMHg4ODY3CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfUE9JTlRfU1BSSVRFX05WICAgICAgICAgICAgICAgIDB4ODg2MQorI2RlZmluZSBHTF9DT09SRF9SRVBMQUNFX05WICAgICAgICAgICAgICAgMHg4ODYyCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9SX01PREVfTlYgICAgICAgICAweDg4NjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMworI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFXzJEX05WIDB4ODg1MAorI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFXzJEX1NDQUxFX05WIDB4ODg1MQorI2RlZmluZSBHTF9PRkZTRVRfUFJPSkVDVElWRV9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg4NTIKKyNkZWZpbmUgR0xfT0ZGU0VUX1BST0pFQ1RJVkVfVEVYVFVSRV9SRUNUQU5HTEVfU0NBTEVfTlYgMHg4ODUzCisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1RFWFRVUkVfMkRfTlYgICAgICAweDg4NTQKKyNkZWZpbmUgR0xfT0ZGU0VUX0hJTE9fVEVYVFVSRV9SRUNUQU5HTEVfTlYgMHg4ODU1CisjZGVmaW5lIEdMX09GRlNFVF9ISUxPX1BST0pFQ1RJVkVfVEVYVFVSRV8yRF9OViAweDg4NTYKKyNkZWZpbmUgR0xfT0ZGU0VUX0hJTE9fUFJPSkVDVElWRV9URVhUVVJFX1JFQ1RBTkdMRV9OViAweDg4NTcKKyNkZWZpbmUgR0xfREVQRU5ERU5UX0hJTE9fVEVYVFVSRV8yRF9OViAgIDB4ODg1OAorI2RlZmluZSBHTF9ERVBFTkRFTlRfUkdCX1RFWFRVUkVfM0RfTlYgICAgMHg4ODU5CisjZGVmaW5lIEdMX0RFUEVOREVOVF9SR0JfVEVYVFVSRV9DVUJFX01BUF9OViAweDg4NUEKKyNkZWZpbmUgR0xfRE9UX1BST0RVQ1RfUEFTU19USFJPVUdIX05WICAgIDB4ODg1QgorI2RlZmluZSBHTF9ET1RfUFJPRFVDVF9URVhUVVJFXzFEX05WICAgICAgMHg4ODVDCisjZGVmaW5lIEdMX0RPVF9QUk9EVUNUX0FGRklORV9ERVBUSF9SRVBMQUNFX05WIDB4ODg1RAorI2RlZmluZSBHTF9ISUxPOF9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4ODVFCisjZGVmaW5lIEdMX1NJR05FRF9ISUxPOF9OViAgICAgICAgICAgICAgICAweDg4NUYKKyNkZWZpbmUgR0xfRk9SQ0VfQkxVRV9UT19PTkVfTlYgICAgICAgICAgIDB4ODg2MAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFkb3dfZnVuY3MKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVF9UV09fU0lERV9FWFQgICAgICAweDg5MTAKKyNkZWZpbmUgR0xfQUNUSVZFX1NURU5DSUxfRkFDRV9FWFQgICAgICAgIDB4ODkxMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX1RFWFRfRlJBR01FTlRfU0hBREVSX0FUSSAgICAgICAweDgyMDAKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlCisjZGVmaW5lIEdMX1VOUEFDS19DTElFTlRfU1RPUkFHRV9BUFBMRSAgICAweDg1QjIKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9BUFBMRSAgICAgICAgICAgIDB4ODc2OAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX1RZUEVfQVBQTEUgICAgICAgMHg4NzY5CisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfUE9JTlRFUl9BUFBMRSAgICAweDg3NkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2ZlbmNlCisjZGVmaW5lIEdMX0RSQVdfUElYRUxTX0FQUExFICAgICAgICAgICAgICAweDhBMEEKKyNkZWZpbmUgR0xfRkVOQ0VfQVBQTEUgICAgICAgICAgICAgICAgICAgIDB4OEEwQgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQklORElOR19BUFBMRSAgICAgMHg4NUI1CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1JBTkdFX0FQUExFICAgICAgIDB4ODUxRAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfTEVOR1RIX0FQUExFIDB4ODUxRQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RPUkFHRV9ISU5UX0FQUExFIDB4ODUxRgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUkFOR0VfUE9JTlRFUl9BUFBMRSAweDg1MjEKKyNkZWZpbmUgR0xfU1RPUkFHRV9DQUNIRURfQVBQTEUgICAgICAgICAgIDB4ODVCRQorI2RlZmluZSBHTF9TVE9SQUdFX1NIQVJFRF9BUFBMRSAgICAgICAgICAgMHg4NUJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV95Y2Jjcl80MjIKKyNkZWZpbmUgR0xfWUNCQ1JfNDIyX0FQUExFICAgICAgICAgICAgICAgIDB4ODVCOQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgICAgICAgMHg4NUJBCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgICAweDg1QkIKKyNlbmRpZgorCisjaWZuZGVmIEdMX1MzX3MzdGMKKyNkZWZpbmUgR0xfUkdCX1MzVEMgICAgICAgICAgICAgICAgICAgICAgIDB4ODNBMAorI2RlZmluZSBHTF9SR0I0X1MzVEMgICAgICAgICAgICAgICAgICAgICAgMHg4M0ExCisjZGVmaW5lIEdMX1JHQkFfUzNUQyAgICAgICAgICAgICAgICAgICAgICAweDgzQTIKKyNkZWZpbmUgR0xfUkdCQTRfUzNUQyAgICAgICAgICAgICAgICAgICAgIDB4ODNBMworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTX0FUSSAgICAgICAgICAgMHg4ODI0CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMF9BVEkgICAgICAgICAgICAgICAweDg4MjUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxX0FUSSAgICAgICAgICAgICAgIDB4ODgyNgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjJfQVRJICAgICAgICAgICAgICAgMHg4ODI3CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSM19BVEkgICAgICAgICAgICAgICAweDg4MjgKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI0X0FUSSAgICAgICAgICAgICAgIDB4ODgyOQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjVfQVRJICAgICAgICAgICAgICAgMHg4ODJBCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNl9BVEkgICAgICAgICAgICAgICAweDg4MkIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI3X0FUSSAgICAgICAgICAgICAgIDB4ODgyQworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjhfQVRJICAgICAgICAgICAgICAgMHg4ODJECisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOV9BVEkgICAgICAgICAgICAgICAweDg4MkUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMF9BVEkgICAgICAgICAgICAgIDB4ODgyRgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExX0FUSSAgICAgICAgICAgICAgMHg4ODMwCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTJfQVRJICAgICAgICAgICAgICAweDg4MzEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxM19BVEkgICAgICAgICAgICAgIDB4ODgzMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0X0FUSSAgICAgICAgICAgICAgMHg4ODMzCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTVfQVRJICAgICAgICAgICAgICAweDg4MzQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgR0xfVFlQRV9SR0JBX0ZMT0FUX0FUSSAgICAgICAgICAgIDB4ODgyMAorI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9VTkNMQU1QRURfVkFMVUVfQVRJIDB4ODgzNQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzCisjZGVmaW5lIEdMX01PRFVMQVRFX0FERF9BVEkgICAgICAgICAgICAgICAweDg3NDQKKyNkZWZpbmUgR0xfTU9EVUxBVEVfU0lHTkVEX0FERF9BVEkgICAgICAgIDB4ODc0NQorI2RlZmluZSBHTF9NT0RVTEFURV9TVUJUUkFDVF9BVEkgICAgICAgICAgMHg4NzQ2CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9mbG9hdAorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMzJfQVRJICAgICAgICAgICAgICAgMHg4ODE0CisjZGVmaW5lIEdMX1JHQl9GTE9BVDMyX0FUSSAgICAgICAgICAgICAgICAweDg4MTUKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQzMl9BVEkgICAgICAgICAgICAgIDB4ODgxNgorI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQzMl9BVEkgICAgICAgICAgMHg4ODE3CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDMyX0FUSSAgICAgICAgICAweDg4MTgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMzJfQVRJICAgIDB4ODgxOQorI2RlZmluZSBHTF9SR0JBX0ZMT0FUMTZfQVRJICAgICAgICAgICAgICAgMHg4ODFBCisjZGVmaW5lIEdMX1JHQl9GTE9BVDE2X0FUSSAgICAgICAgICAgICAgICAweDg4MUIKKyNkZWZpbmUgR0xfQUxQSEFfRkxPQVQxNl9BVEkgICAgICAgICAgICAgIDB4ODgxQworI2RlZmluZSBHTF9JTlRFTlNJVFlfRkxPQVQxNl9BVEkgICAgICAgICAgMHg4ODFECisjZGVmaW5lIEdMX0xVTUlOQU5DRV9GTE9BVDE2X0FUSSAgICAgICAgICAweDg4MUUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBX0ZMT0FUMTZfQVRJICAgIDB4ODgxRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIEdMX0ZMT0FUX1JfTlYgICAgICAgICAgICAgICAgICAgICAweDg4ODAKKyNkZWZpbmUgR0xfRkxPQVRfUkdfTlYgICAgICAgICAgICAgICAgICAgIDB4ODg4MQorI2RlZmluZSBHTF9GTE9BVF9SR0JfTlYgICAgICAgICAgICAgICAgICAgMHg4ODgyCisjZGVmaW5lIEdMX0ZMT0FUX1JHQkFfTlYgICAgICAgICAgICAgICAgICAweDg4ODMKKyNkZWZpbmUgR0xfRkxPQVRfUjE2X05WICAgICAgICAgICAgICAgICAgIDB4ODg4NAorI2RlZmluZSBHTF9GTE9BVF9SMzJfTlYgICAgICAgICAgICAgICAgICAgMHg4ODg1CisjZGVmaW5lIEdMX0ZMT0FUX1JHMTZfTlYgICAgICAgICAgICAgICAgICAweDg4ODYKKyNkZWZpbmUgR0xfRkxPQVRfUkczMl9OViAgICAgICAgICAgICAgICAgIDB4ODg4NworI2RlZmluZSBHTF9GTE9BVF9SR0IxNl9OViAgICAgICAgICAgICAgICAgMHg4ODg4CisjZGVmaW5lIEdMX0ZMT0FUX1JHQjMyX05WICAgICAgICAgICAgICAgICAweDg4ODkKKyNkZWZpbmUgR0xfRkxPQVRfUkdCQTE2X05WICAgICAgICAgICAgICAgIDB4ODg4QQorI2RlZmluZSBHTF9GTE9BVF9SR0JBMzJfTlYgICAgICAgICAgICAgICAgMHg4ODhCCisjZGVmaW5lIEdMX1RFWFRVUkVfRkxPQVRfQ09NUE9ORU5UU19OViAgICAweDg4OEMKKyNkZWZpbmUgR0xfRkxPQVRfQ0xFQVJfQ09MT1JfVkFMVUVfTlYgICAgIDB4ODg4RAorI2RlZmluZSBHTF9GTE9BVF9SR0JBX01PREVfTlYgICAgICAgICAgICAgMHg4ODhFCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9QUk9HUkFNX0xPQ0FMX1BBUkFNRVRFUlNfTlYgMHg4ODY4CisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fTlYgICAgICAgICAgICAweDg4NzAKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfQ09PUkRTX05WICAgICAgICAgIDB4ODg3MQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUU19OViAgICAgMHg4ODcyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1BST0dSQU1fQklORElOR19OViAgICAweDg4NzMKKyNkZWZpbmUgR0xfUFJPR1JBTV9FUlJPUl9TVFJJTkdfTlYgICAgICAgIDB4ODg3NAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfaGFsZl9mbG9hdAorI2RlZmluZSBHTF9IQUxGX0ZMT0FUX05WICAgICAgICAgICAgICAgICAgMHgxNDBCCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9waXhlbF9kYXRhX3JhbmdlCisjZGVmaW5lIEdMX1dSSVRFX1BJWEVMX0RBVEFfUkFOR0VfTlYgICAgICAweDg4NzgKKyNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX05WICAgICAgIDB4ODg3OQorI2RlZmluZSBHTF9XUklURV9QSVhFTF9EQVRBX1JBTkdFX0xFTkdUSF9OViAweDg4N0EKKyNkZWZpbmUgR0xfUkVBRF9QSVhFTF9EQVRBX1JBTkdFX0xFTkdUSF9OViAweDg4N0IKKyNkZWZpbmUgR0xfV1JJVEVfUElYRUxfREFUQV9SQU5HRV9QT0lOVEVSX05WIDB4ODg3QworI2RlZmluZSBHTF9SRUFEX1BJWEVMX0RBVEFfUkFOR0VfUE9JTlRFUl9OViAweDg4N0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0CisjZGVmaW5lIEdMX1BSSU1JVElWRV9SRVNUQVJUX05WICAgICAgICAgICAweDg1NTgKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX1JFU1RBUlRfSU5ERVhfTlYgICAgIDB4ODU1OQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9leHBhbmRfbm9ybWFsCisjZGVmaW5lIEdMX1RFWFRVUkVfVU5TSUdORURfUkVNQVBfTU9ERV9OViAweDg4OEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ZlcnRleF9wcm9ncmFtMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfc2VwYXJhdGVfc3RlbmNpbAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQ19BVEkgICAgICAgICAgMHg4ODAwCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GQUlMX0FUSSAgICAgICAgICAweDg4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTF9BVEkgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1NfQVRJIDB4ODgwMworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hdHRyaWJfYXJyYXlfb2JqZWN0CisjZW5kaWYKKworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTIDB4OEI5QgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0CisjZGVmaW5lIEdMX0RFUFRIX0JPVU5EU19URVNUX0VYVCAgICAgICAgICAweDg4OTAKKyNkZWZpbmUgR0xfREVQVEhfQk9VTkRTX0VYVCAgICAgICAgICAgICAgIDB4ODg5MQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wCisjZGVmaW5lIEdMX01JUlJPUl9DTEFNUF9FWFQgICAgICAgICAgICAgICAweDg3NDIKKyNkZWZpbmUgR0xfTUlSUk9SX0NMQU1QX1RPX0VER0VfRVhUICAgICAgIDB4ODc0MworI2RlZmluZSBHTF9NSVJST1JfQ0xBTVBfVE9fQk9SREVSX0VYVCAgICAgMHg4OTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCX0VYVCAgICAgICAgIEdMX0JMRU5EX0VRVUFUSU9OCisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBX0VYVCAgICAgICAweDg4M0QKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FfcGFja19pbnZlcnQKKyNkZWZpbmUgR0xfUEFDS19JTlZFUlRfTUVTQSAgICAgICAgICAgICAgIDB4ODc1OAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV95Y2Jjcl90ZXh0dXJlCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9NRVNBICAgICAgICAweDg1QkEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfOF84X1JFVl9NRVNBICAgIDB4ODVCQgorI2RlZmluZSBHTF9ZQ0JDUl9NRVNBICAgICAgICAgICAgICAgICAgICAgMHg4NzU3CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9FWFQgICAgICAgICAgMHg4OEVCCisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfRVhUICAgICAgICAweDg4RUMKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVJfQklORElOR19FWFQgIDB4ODhFRAorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSX0JJTkRJTkdfRVhUIDB4ODhFRgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbV9vcHRpb24KKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2ZyYWdtZW50X3Byb2dyYW0yCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0VYRUNfSU5TVFJVQ1RJT05TX05WIDB4ODhGNAorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9DQUxMX0RFUFRIX05WICAgICAgMHg4OEY1CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0lGX0RFUFRIX05WICAgICAgICAweDg4RjYKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fTE9PUF9ERVBUSF9OViAgICAgIDB4ODhGNworI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9MT09QX0NPVU5UX05WICAgICAgMHg4OEY4CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uCisvKiByZXVzZSBHTF9NQVhfUFJPR1JBTV9FWEVDX0lOU1RSVUNUSU9OU19OViAqLworLyogcmV1c2UgR0xfTUFYX1BST0dSQU1fQ0FMTF9ERVBUSF9OViAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0zCisvKiByZXVzZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OX0VYVCAweDA1MDYKKyNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX0VYVCAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX0VYVCAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9FWFQgMHg4Q0QwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfRVhUIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfRVhUIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9FWFQgMHg4Q0QzCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX0VYVCAweDhDRDQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUICAgICAgIDB4OENENQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfRVhUIDB4OENENgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9FWFQgMHg4Q0Q3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19FWFQgMHg4Q0Q5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRk9STUFUU19FWFQgMHg4Q0RBCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfRVhUIDB4OENEQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX1JFQURfQlVGRkVSX0VYVCAweDhDREMKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfRVhUICAgIDB4OENERAorI2RlZmluZSBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfRVhUICAgICAgMHg4Q0RGCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCAgICAgICAgICAweDhDRTAKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDFfRVhUICAgICAgICAgIDB4OENFMQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9FWFQgICAgICAgICAgMHg4Q0UyCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQzX0VYVCAgICAgICAgICAweDhDRTMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDRfRVhUICAgICAgICAgIDB4OENFNAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQgICAgICAgICAgMHg4Q0U1CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X0VYVCAgICAgICAgICAweDhDRTYKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDdfRVhUICAgICAgICAgIDB4OENFNworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9FWFQgICAgICAgICAgMHg4Q0U4CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ5X0VYVCAgICAgICAgICAweDhDRTkKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEwX0VYVCAgICAgICAgIDB4OENFQQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfRVhUICAgICAgICAgMHg4Q0VCCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9FWFQgICAgICAgICAweDhDRUMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEzX0VYVCAgICAgICAgIDB4OENFRAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfRVhUICAgICAgICAgMHg4Q0VFCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9FWFQgICAgICAgICAweDhDRUYKKyNkZWZpbmUgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQgICAgICAgICAgIDB4OEQwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhUICAgICAgICAgMHg4RDIwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0VYVCAgICAgICAgICAgICAgICAweDhENDAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0VYVCAgICAgICAgICAgICAgIDB4OEQ0MQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfRVhUICAgICAgICAgMHg4RDQyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFRfRVhUICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9FWFQgMHg4RDQ0CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxX0VYVCAgICAgICAgICAgICAweDhENDYKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDRfRVhUICAgICAgICAgICAgIDB4OEQ0NworI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYOF9FWFQgICAgICAgICAgICAgMHg4RDQ4CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxNl9FWFQgICAgICAgICAgICAweDhENDkKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX0VYVCAgICAgIDB4OEQ1MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9FWFQgICAgMHg4RDUxCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfRVhUICAgICAweDhENTIKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfRVhUICAgIDB4OEQ1MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9FWFQgICAgMHg4RDU0CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfRVhUICAweDhENTUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0dSRU1FRFlfc3RyaW5nX21hcmtlcgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfRVhUICAgICAgICAgICAgICAweDg0RjkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfRVhUICAgICAgICAgIDB4ODRGQQorI2RlZmluZSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVCAgICAgICAgICAgMHg4OEYwCisjZGVmaW5lIEdMX1RFWFRVUkVfU1RFTkNJTF9TSVpFX0VYVCAgICAgICAweDg4RjEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX2NsZWFyX3RhZworI2RlZmluZSBHTF9TVEVOQ0lMX1RBR19CSVRTX0VYVCAgICAgICAgICAgMHg4OEYyCisjZGVmaW5lIEdMX1NURU5DSUxfQ0xFQVJfVEFHX1ZBTFVFX0VYVCAgICAweDg4RjMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3NSR0IKKyNkZWZpbmUgR0xfU1JHQl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MAorI2RlZmluZSBHTF9TUkdCOF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4QzQxCisjZGVmaW5lIEdMX1NSR0JfQUxQSEFfRVhUICAgICAgICAgICAgICAgICAweDhDNDIKKyNkZWZpbmUgR0xfU1JHQjhfQUxQSEE4X0VYVCAgICAgICAgICAgICAgIDB4OEM0MworI2RlZmluZSBHTF9TTFVNSU5BTkNFX0FMUEhBX0VYVCAgICAgICAgICAgMHg4QzQ0CisjZGVmaW5lIEdMX1NMVU1JTkFOQ0U4X0FMUEhBOF9FWFQgICAgICAgICAweDhDNDUKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRV9FWFQgICAgICAgICAgICAgICAgIDB4OEM0NgorI2RlZmluZSBHTF9TTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgMHg4QzQ3CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9FWFQgICAgICAgICAgICAweDhDNDgKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX0VYVCAgICAgIDB4OEM0OQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NMVU1JTkFOQ0VfRVhUICAgICAgMHg4QzRBCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0xVTUlOQU5DRV9BTFBIQV9FWFQgMHg4QzRCCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUICAweDhDNEMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQgMHg4QzRECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUIDB4OEM0RQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQ1X0VYVCAweDhDNEYKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9ibGl0CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfRVhUICAgICAgICAgICAweDhDQTgKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQgICAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfRVhUICAgR0xfRlJBTUVCVUZGRVJfQklORElOR19FWFQKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0VYVCAgIDB4OENBQQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0VYVCAgICAgICAweDhDQUIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9FWFQgMHg4RDU2CisjZGVmaW5lIEdMX01BWF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAweDhENTcKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FYX3RleHR1cmVfc3RhY2sKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9TVEFDS19NRVNBWCAgICAgICAgIDB4ODc1OQorI2RlZmluZSBHTF9URVhUVVJFXzJEX1NUQUNLX01FU0FYICAgICAgICAgMHg4NzVBCisjZGVmaW5lIEdMX1BST1hZX1RFWFRVUkVfMURfU1RBQ0tfTUVTQVggICAweDg3NUIKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9TVEFDS19NRVNBWCAgIDB4ODc1QworI2RlZmluZSBHTF9URVhUVVJFXzFEX1NUQUNLX0JJTkRJTkdfTUVTQVggMHg4NzVECisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfU1RBQ0tfQklORElOR19NRVNBWCAweDg3NUUKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90aW1lcl9xdWVyeQorI2RlZmluZSBHTF9USU1FX0VMQVBTRURfRVhUICAgICAgICAgICAgICAgMHg4OEJGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ3B1X3Byb2dyYW1fcGFyYW1ldGVycworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfZmx1c2hfYnVmZmVyX3JhbmdlCisjZGVmaW5lIEdMX0JVRkZFUl9TRVJJQUxJWkVEX01PRElGWV9BUFBMRSAweDhBMTIKKyNkZWZpbmUgR0xfQlVGRkVSX0ZMVVNISU5HX1VOTUFQX0FQUExFICAgIDB4OEExMworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3Byb2dyYW00CisjZGVmaW5lIEdMX01JTl9QUk9HUkFNX1RFWEVMX09GRlNFVF9OViAgICAweDg5MDQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYRUxfT0ZGU0VUX05WICAgIDB4ODkwNQorI2RlZmluZSBHTF9QUk9HUkFNX0FUVFJJQl9DT01QT05FTlRTX05WICAgMHg4OTA2CisjZGVmaW5lIEdMX1BST0dSQU1fUkVTVUxUX0NPTVBPTkVOVFNfTlYgICAweDg5MDcKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fQVRUUklCX0NPTVBPTkVOVFNfTlYgMHg4OTA4CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1JFU1VMVF9DT01QT05FTlRTX05WIDB4ODkwOQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9HRU5FUklDX0FUVFJJQlNfTlYgMHg4REE1CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX0dFTkVSSUNfUkVTVUxUU19OViAweDhEQTYKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00CisjZGVmaW5lIEdMX0xJTkVTX0FESkFDRU5DWV9FWFQgICAgICAgICAgICAweDAwMEEKKyNkZWZpbmUgR0xfTElORV9TVFJJUF9BREpBQ0VOQ1lfRVhUICAgICAgIDB4MDAwQgorI2RlZmluZSBHTF9UUklBTkdMRVNfQURKQUNFTkNZX0VYVCAgICAgICAgMHgwMDBDCisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQX0FESkFDRU5DWV9FWFQgICAweDAwMEQKKyNkZWZpbmUgR0xfR0VPTUVUUllfUFJPR1JBTV9OViAgICAgICAgICAgIDB4OEMyNgorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9PVVRQVVRfVkVSVElDRVNfTlYgMHg4QzI3CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RPVEFMX09VVFBVVF9DT01QT05FTlRTX05WIDB4OEMyOAorI2RlZmluZSBHTF9HRU9NRVRSWV9WRVJUSUNFU19PVVRfRVhUICAgICAgMHg4RERBCisjZGVmaW5lIEdMX0dFT01FVFJZX0lOUFVUX1RZUEVfRVhUICAgICAgICAweDhEREIKKyNkZWZpbmUgR0xfR0VPTUVUUllfT1VUUFVUX1RZUEVfRVhUICAgICAgIDB4OEREQworI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVEVYVFVSRV9JTUFHRV9VTklUU19FWFQgMHg4QzI5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRF9FWFQgMHg4REE3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfVEFSR0VUU19FWFQgMHg4REE4CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfQ09VTlRfRVhUIDB4OERBOQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVJfRVhUIDB4OENENAorI2RlZmluZSBHTF9QUk9HUkFNX1BPSU5UX1NJWkVfRVhUICAgICAgICAgMHg4NjQyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyNAorI2RlZmluZSBHTF9HRU9NRVRSWV9TSEFERVJfRVhUICAgICAgICAgICAgMHg4REQ5CisvKiByZXVzZSBHTF9HRU9NRVRSWV9WRVJUSUNFU19PVVRfRVhUICovCisvKiByZXVzZSBHTF9HRU9NRVRSWV9JTlBVVF9UWVBFX0VYVCAqLworLyogcmV1c2UgR0xfR0VPTUVUUllfT1VUUFVUX1RZUEVfRVhUICovCisvKiByZXVzZSBHTF9NQVhfR0VPTUVUUllfVEVYVFVSRV9JTUFHRV9VTklUU19FWFQgKi8KKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1ZBUllJTkdfQ09NUE9ORU5UU19FWFQgMHg4RERECisjZGVmaW5lIEdMX01BWF9WRVJURVhfVkFSWUlOR19DT01QT05FTlRTX0VYVCAweDhEREUKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfQ09NUE9ORU5UU19FWFQgICAgIDB4OEI0QgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTX0VYVCAweDhEREYKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX09VVFBVVF9WRVJUSUNFU19FWFQgMHg4REUwCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9UT1RBTF9PVVRQVVRfQ09NUE9ORU5UU19FWFQgMHg4REUxCisvKiByZXVzZSBHTF9MSU5FU19BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9MSU5FX1NUUklQX0FESkFDRU5DWV9FWFQgKi8KKy8qIHJldXNlIEdMX1RSSUFOR0xFU19BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9UUklBTkdMRV9TVFJJUF9BREpBQ0VOQ1lfRVhUICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX1RBUkdFVFNfRVhUICovCisvKiByZXVzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0xBWUVSX0NPVU5UX0VYVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9MQVlFUkVEX0VYVCAqLworLyogcmV1c2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSX0VYVCAqLworLyogcmV1c2UgR0xfUFJPR1JBTV9QT0lOVF9TSVpFX0VYVCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW00CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfSU5URUdFUl9OViAweDg4RkQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ncHVfc2hhZGVyNAorI2RlZmluZSBHTF9TQU1QTEVSXzFEX0FSUkFZX0VYVCAgICAgICAgICAgMHg4REMwCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfQVJSQVlfRVhUICAgICAgICAgICAweDhEQzEKKyNkZWZpbmUgR0xfU0FNUExFUl9CVUZGRVJfRVhUICAgICAgICAgICAgIDB4OERDMgorI2RlZmluZSBHTF9TQU1QTEVSXzFEX0FSUkFZX1NIQURPV19FWFQgICAgMHg4REMzCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfQVJSQVlfU0hBRE9XX0VYVCAgICAweDhEQzQKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX1NIQURPV19FWFQgICAgICAgIDB4OERDNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDMl9FWFQgICAgICAgICAgMHg4REM2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUMzX0VYVCAgICAgICAgICAweDhEQzcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzRfRVhUICAgICAgICAgIDB4OERDOAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8xRF9FWFQgICAgICAgICAgICAgMHg4REM5CisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX0VYVCAgICAgICAgICAgICAweDhEQ0EKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfM0RfRVhUICAgICAgICAgICAgIDB4OERDQgorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9DVUJFX0VYVCAgICAgICAgICAgMHg4RENDCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzJEX1JFQ1RfRVhUICAgICAgICAweDhEQ0QKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMURfQVJSQVlfRVhUICAgICAgIDB4OERDRQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9BUlJBWV9FWFQgICAgICAgMHg4RENGCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX0JVRkZFUl9FWFQgICAgICAgICAweDhERDAKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMURfRVhUICAgIDB4OEREMQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9FWFQgICAgMHg4REQyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzNEX0VYVCAgICAweDhERDMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRV9FWFQgIDB4OERENAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9SRUNUX0VYVCAweDhERDUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfMURfQVJSQVlfRVhUIDB4OERENgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWV9FWFQgMHg4REQ3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0JVRkZFUl9FWFQgMHg4REQ4CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19pbnN0YW5jZWQKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wYWNrZWRfZmxvYXQKKyNkZWZpbmUgR0xfUjExRl9HMTFGX0IxMEZfRVhUICAgICAgICAgICAgIDB4OEMzQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWX0VYVCAweDhDM0IKKyNkZWZpbmUgR0xfUkdCQV9TSUdORURfQ09NUE9ORU5UU19FWFQgICAgIDB4OEMzQworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfYXJyYXkKKyNkZWZpbmUgR0xfVEVYVFVSRV8xRF9BUlJBWV9FWFQgICAgICAgICAgIDB4OEMxOAorI2RlZmluZSBHTF9QUk9YWV9URVhUVVJFXzFEX0FSUkFZX0VYVCAgICAgMHg4QzE5CisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfQVJSQVlfRVhUICAgICAgICAgICAweDhDMUEKKyNkZWZpbmUgR0xfUFJPWFlfVEVYVFVSRV8yRF9BUlJBWV9FWFQgICAgIDB4OEMxQgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMURfQVJSQVlfRVhUICAgMHg4QzFDCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWV9FWFQgICAweDhDMUQKKyNkZWZpbmUgR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTX0VYVCAgIDB4ODhGRgorI2RlZmluZSBHTF9DT01QQVJFX1JFRl9ERVBUSF9UT19URVhUVVJFX0VYVCAweDg4NEUKKy8qIHJldXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MQVlFUl9FWFQgKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfRVhUICAgICAgICAgICAgIDB4OEMyQQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9CVUZGRVJfU0laRV9FWFQgICAgMHg4QzJCCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19CVUZGRVJfRVhUICAgICAweDhDMkMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfREFUQV9TVE9SRV9CSU5ESU5HX0VYVCAweDhDMkQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfRk9STUFUX0VYVCAgICAgIDB4OEMyRQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fbGF0YworI2RlZmluZSBHTF9DT01QUkVTU0VEX0xVTUlOQU5DRV9MQVRDMV9FWFQgMHg4QzcwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX0xVTUlOQU5DRV9MQVRDMV9FWFQgMHg4QzcxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfTFVNSU5BTkNFX0FMUEhBX0xBVEMyX0VYVCAweDhDNzIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TSUdORURfTFVNSU5BTkNFX0FMUEhBX0xBVEMyX0VYVCAweDhDNzMKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRURfUkdUQzFfRVhUICAgICAgIDB4OERCQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SRURfUkdUQzFfRVhUIDB4OERCQworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JFRF9HUkVFTl9SR1RDMl9FWFQgMHg4REJECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFQgMHg4REJFCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zaGFyZWRfZXhwb25lbnQKKyNkZWZpbmUgR0xfUkdCOV9FNV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEMzRAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfNV85XzlfOV9SRVZfRVhUICAgMHg4QzNFCisjZGVmaW5lIEdMX1RFWFRVUkVfU0hBUkVEX1NJWkVfRVhUICAgICAgICAweDhDM0YKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMkZfTlYgICAgICAgICAgMHg4REFCCisjZGVmaW5lIEdMX0RFUFRIMzJGX1NURU5DSUw4X05WICAgICAgICAgICAweDhEQUMKKyNkZWZpbmUgR0xfRkxPQVRfMzJfVU5TSUdORURfSU5UXzI0XzhfUkVWX05WIDB4OERBRAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfRkxPQVRfTU9ERV9OViAgICAgMHg4REFGCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtNAorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGVfY292ZXJhZ2UKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0NPVkVSQUdFX1NBTVBMRVNfTlYgMHg4Q0FCCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9DT0xPUl9TQU1QTEVTX05WICAweDhFMTAKKyNkZWZpbmUgR0xfTUFYX01VTFRJU0FNUExFX0NPVkVSQUdFX01PREVTX05WIDB4OEUxMQorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9DT1ZFUkFHRV9NT0RFU19OViAgMHg4RTEyCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9TUkdCX0VYVCAgICAgICAgICAgMHg4REI5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRV9FWFQgICAweDhEQkEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3NoYWRlcjQKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BhcmFtZXRlcl9idWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfQklORElOR1NfTlYgMHg4REEwCisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfU0laRV9OViAweDhEQTEKKyNkZWZpbmUgR0xfVkVSVEVYX1BST0dSQU1fUEFSQU1FVEVSX0JVRkZFUl9OViAweDhEQTIKKyNkZWZpbmUgR0xfR0VPTUVUUllfUFJPR1JBTV9QQVJBTUVURVJfQlVGRkVSX05WIDB4OERBMworI2RlZmluZSBHTF9GUkFHTUVOVF9QUk9HUkFNX1BBUkFNRVRFUl9CVUZGRVJfTlYgMHg4REE0CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19idWZmZXJzMgorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdHJhbnNmb3JtX2ZlZWRiYWNrCisjZGVmaW5lIEdMX0JBQ0tfUFJJTUFSWV9DT0xPUl9OViAgICAgICAgICAweDhDNzcKKyNkZWZpbmUgR0xfQkFDS19TRUNPTkRBUllfQ09MT1JfTlYgICAgICAgIDB4OEM3OAorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX05WICAgICAgICAgICAgICAgMHg4Qzc5CisjZGVmaW5lIEdMX0NMSVBfRElTVEFOQ0VfTlYgICAgICAgICAgICAgICAweDhDN0EKKyNkZWZpbmUgR0xfVkVSVEVYX0lEX05WICAgICAgICAgICAgICAgICAgIDB4OEM3QgorI2RlZmluZSBHTF9QUklNSVRJVkVfSURfTlYgICAgICAgICAgICAgICAgMHg4QzdDCisjZGVmaW5lIEdMX0dFTkVSSUNfQVRUUklCX05WICAgICAgICAgICAgICAweDhDN0QKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0FUVFJJQlNfTlYgIDB4OEM3RQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREVfTlYgMHg4QzdGCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UU19OViAweDhDODAKKyNkZWZpbmUgR0xfQUNUSVZFX1ZBUllJTkdTX05WICAgICAgICAgICAgIDB4OEM4MQorI2RlZmluZSBHTF9BQ1RJVkVfVkFSWUlOR19NQVhfTEVOR1RIX05WICAgMHg4QzgyCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HU19OViAweDhDODMKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TVEFSVF9OViAweDhDODQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9TSVpFX05WIDB4OEM4NQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfUkVDT1JEX05WICAgMHg4Qzg2CisjZGVmaW5lIEdMX1BSSU1JVElWRVNfR0VORVJBVEVEX05WICAgICAgICAweDhDODcKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BSSU1JVElWRVNfV1JJVFRFTl9OViAweDhDODgKKyNkZWZpbmUgR0xfUkFTVEVSSVpFUl9ESVNDQVJEX05WICAgICAgICAgIDB4OEM4OQorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0FUVFJJQlNfTlYgMHg4QzhBCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQVRUUklCU19OViAweDhDOEIKKyNkZWZpbmUgR0xfSU5URVJMRUFWRURfQVRUUklCU19OViAgICAgICAgIDB4OEM4QworI2RlZmluZSBHTF9TRVBBUkFURV9BVFRSSUJTX05WICAgICAgICAgICAgMHg4QzhECisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTlYgICAweDhDOEUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HX05WIDB4OEM4RgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JpbmRhYmxlX3VuaWZvcm0KKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9CSU5EQUJMRV9VTklGT1JNU19FWFQgMHg4REUyCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9CSU5EQUJMRV9VTklGT1JNU19FWFQgMHg4REUzCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9CSU5EQUJMRV9VTklGT1JNU19FWFQgMHg4REU0CisjZGVmaW5lIEdMX01BWF9CSU5EQUJMRV9VTklGT1JNX1NJWkVfRVhUICAweDhERUQKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfRVhUICAgICAgICAgICAgIDB4OERFRQorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HX0VYVCAgICAgMHg4REVGCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9pbnRlZ2VyCisjZGVmaW5lIEdMX1JHQkEzMlVJX0VYVCAgICAgICAgICAgICAgICAgICAweDhENzAKKyNkZWZpbmUgR0xfUkdCMzJVSV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEQ3MQorI2RlZmluZSBHTF9BTFBIQTMyVUlfRVhUICAgICAgICAgICAgICAgICAgMHg4RDcyCisjZGVmaW5lIEdMX0lOVEVOU0lUWTMyVUlfRVhUICAgICAgICAgICAgICAweDhENzMKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMzJVSV9FWFQgICAgICAgICAgICAgIDB4OEQ3NAorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEzMlVJX0VYVCAgICAgICAgMHg4RDc1CisjZGVmaW5lIEdMX1JHQkExNlVJX0VYVCAgICAgICAgICAgICAgICAgICAweDhENzYKKyNkZWZpbmUgR0xfUkdCMTZVSV9FWFQgICAgICAgICAgICAgICAgICAgIDB4OEQ3NworI2RlZmluZSBHTF9BTFBIQTE2VUlfRVhUICAgICAgICAgICAgICAgICAgMHg4RDc4CisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2VUlfRVhUICAgICAgICAgICAgICAweDhENzkKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZVSV9FWFQgICAgICAgICAgICAgIDB4OEQ3QQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEExNlVJX0VYVCAgICAgICAgMHg4RDdCCisjZGVmaW5lIEdMX1JHQkE4VUlfRVhUICAgICAgICAgICAgICAgICAgICAweDhEN0MKKyNkZWZpbmUgR0xfUkdCOFVJX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4OEQ3RAorI2RlZmluZSBHTF9BTFBIQThVSV9FWFQgICAgICAgICAgICAgICAgICAgMHg4RDdFCisjZGVmaW5lIEdMX0lOVEVOU0lUWThVSV9FWFQgICAgICAgICAgICAgICAweDhEN0YKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOFVJX0VYVCAgICAgICAgICAgICAgIDB4OEQ4MAorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEE4VUlfRVhUICAgICAgICAgMHg4RDgxCisjZGVmaW5lIEdMX1JHQkEzMklfRVhUICAgICAgICAgICAgICAgICAgICAweDhEODIKKyNkZWZpbmUgR0xfUkdCMzJJX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4OEQ4MworI2RlZmluZSBHTF9BTFBIQTMySV9FWFQgICAgICAgICAgICAgICAgICAgMHg4RDg0CisjZGVmaW5lIEdMX0lOVEVOU0lUWTMySV9FWFQgICAgICAgICAgICAgICAweDhEODUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMzJJX0VYVCAgICAgICAgICAgICAgIDB4OEQ4NgorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEzMklfRVhUICAgICAgICAgMHg4RDg3CisjZGVmaW5lIEdMX1JHQkExNklfRVhUICAgICAgICAgICAgICAgICAgICAweDhEODgKKyNkZWZpbmUgR0xfUkdCMTZJX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4OEQ4OQorI2RlZmluZSBHTF9BTFBIQTE2SV9FWFQgICAgICAgICAgICAgICAgICAgMHg4RDhBCisjZGVmaW5lIEdMX0lOVEVOU0lUWTE2SV9FWFQgICAgICAgICAgICAgICAweDhEOEIKKyNkZWZpbmUgR0xfTFVNSU5BTkNFMTZJX0VYVCAgICAgICAgICAgICAgIDB4OEQ4QworI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEExNklfRVhUICAgICAgICAgMHg4RDhECisjZGVmaW5lIEdMX1JHQkE4SV9FWFQgICAgICAgICAgICAgICAgICAgICAweDhEOEUKKyNkZWZpbmUgR0xfUkdCOElfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4RgorI2RlZmluZSBHTF9BTFBIQThJX0VYVCAgICAgICAgICAgICAgICAgICAgMHg4RDkwCisjZGVmaW5lIEdMX0lOVEVOU0lUWThJX0VYVCAgICAgICAgICAgICAgICAweDhEOTEKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOElfRVhUICAgICAgICAgICAgICAgIDB4OEQ5MgorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEE4SV9FWFQgICAgICAgICAgMHg4RDkzCisjZGVmaW5lIEdMX1JFRF9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgICAweDhEOTQKKyNkZWZpbmUgR0xfR1JFRU5fSU5URUdFUl9FWFQgICAgICAgICAgICAgIDB4OEQ5NQorI2RlZmluZSBHTF9CTFVFX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAgMHg4RDk2CisjZGVmaW5lIEdMX0FMUEhBX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAweDhEOTcKKyNkZWZpbmUgR0xfUkdCX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAgIDB4OEQ5OAorI2RlZmluZSBHTF9SR0JBX0lOVEVHRVJfRVhUICAgICAgICAgICAgICAgMHg4RDk5CisjZGVmaW5lIEdMX0JHUl9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgICAweDhEOUEKKyNkZWZpbmUgR0xfQkdSQV9JTlRFR0VSX0VYVCAgICAgICAgICAgICAgIDB4OEQ5QgorI2RlZmluZSBHTF9MVU1JTkFOQ0VfSU5URUdFUl9FWFQgICAgICAgICAgMHg4RDlDCisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQV9JTlRFR0VSX0VYVCAgICAweDhEOUQKKyNkZWZpbmUgR0xfUkdCQV9JTlRFR0VSX01PREVfRVhUICAgICAgICAgIDB4OEQ5RQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzAKKy8qIEdMIHR5cGUgZm9yIHByb2dyYW0vc2hhZGVyIHRleHQgKi8KK3R5cGVkZWYgY2hhciBHTGNoYXI7CQkJLyogbmF0aXZlIGNoYXJhY3RlciAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzUKKy8qIEdMIHR5cGVzIGZvciBoYW5kbGluZyBsYXJnZSB2ZXJ0ZXggYnVmZmVyIG9iamVjdHMgKi8KK3R5cGVkZWYgcHRyZGlmZl90IEdMaW50cHRyOwordHlwZWRlZiBwdHJkaWZmX3QgR0xzaXplaXB0cjsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdAorLyogR0wgdHlwZXMgZm9yIGhhbmRsaW5nIGxhcmdlIHZlcnRleCBidWZmZXIgb2JqZWN0cyAqLwordHlwZWRlZiBwdHJkaWZmX3QgR0xpbnRwdHJBUkI7Cit0eXBlZGVmIHB0cmRpZmZfdCBHTHNpemVpcHRyQVJCOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisvKiBHTCB0eXBlcyBmb3IgaGFuZGxpbmcgc2hhZGVyIG9iamVjdCBoYW5kbGVzIGFuZCBwcm9ncmFtL3NoYWRlciB0ZXh0ICovCit0eXBlZGVmIGNoYXIgR0xjaGFyQVJCOwkJLyogbmF0aXZlIGNoYXJhY3RlciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xoYW5kbGVBUkI7CS8qIHNoYWRlciBvYmplY3QgaGFuZGxlICovCisjZW5kaWYKKworLyogR0wgdHlwZXMgZm9yICJoYWxmIiBwcmVjaXNpb24gKHMxMGU1KSBmbG9hdCBkYXRhIGluIGhvc3QgbWVtb3J5ICovCisjaWZuZGVmIEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEdMaGFsZkFSQjsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2hhbGZfZmxvYXQKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0xoYWxmTlY7CisjZW5kaWYKKworI2lmbmRlZiBHTEVYVF82NF9UWVBFU19ERUZJTkVECisvKiBUaGlzIGNvZGUgYmxvY2sgaXMgZHVwbGljYXRlZCBpbiBnbGV4dC5oLCBzbyBtdXN0IGJlIHByb3RlY3RlZCAqLworI2RlZmluZSBHTEVYVF82NF9UWVBFU19ERUZJTkVECisvKiBEZWZpbmUgaW50MzJfdCwgaW50NjRfdCwgYW5kIHVpbnQ2NF90IHR5cGVzIGZvciBVU1QvTVNDICovCisvKiAoYXMgdXNlZCBpbiB0aGUgR0xfRVhUX3RpbWVyX3F1ZXJ5IGV4dGVuc2lvbikuICovCisjaWYgZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgZGVmaW5lZChfX3N1bl9fKQorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWYgZGVmaW5lZChfX1NURENfXykKKyNpZiBkZWZpbmVkKF9fYXJjaDY0X18pCit0eXBlZGVmIGxvbmcgaW50IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVpbnQ2NF90OworI2Vsc2UKK3R5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVpbnQ2NF90OworI2VuZGlmIC8qIF9fYXJjaDY0X18gKi8KKyNlbmRpZiAvKiBfX1NURENfXyAqLworI2VsaWYgZGVmaW5lZCggX19WTVMgKQorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VU0xDX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBkZWZpbmVkKF9fVU5JWE9TMl9fKSB8fCBkZWZpbmVkKF9fU09MNjRfXykKK3R5cGVkZWYgbG9uZyBpbnQgaW50MzJfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVpbnQ2NF90OworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoX19HTlVDX18pCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKK3R5cGVkZWYgX19pbnQzMiBpbnQzMl90OwordHlwZWRlZiBfX2ludDY0IGludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0X3Q7CisjZWxzZQorI2luY2x1ZGUgPGludHR5cGVzLmg+ICAgICAvKiBGYWxsYmFjayBvcHRpb24gKi8KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RpbWVyX3F1ZXJ5Cit0eXBlZGVmIGludDY0X3QgR0xpbnQ2NEVYVDsKK3R5cGVkZWYgdWludDY0X3QgR0x1aW50NjRFWFQ7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfMgorI2RlZmluZSBHTF9WRVJTSU9OXzFfMiAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kQ29sb3IgKEdMY2xhbXBmLCBHTGNsYW1wZiwgR0xjbGFtcGYsIEdMY2xhbXBmKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVQYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb2xvclRhYmxlIChHTGVudW0sIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclN1YlRhYmxlIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbG9yU3ViVGFibGUgKEdMZW51bSwgR0xzaXplaSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjFEIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvbkZpbHRlcjJEIChHTGVudW0sIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb252b2x1dGlvblBhcmFtZXRlcmkgKEdMZW51bSwgR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlDb252b2x1dGlvbkZpbHRlcjFEIChHTGVudW0sIEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIyRCAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25GaWx0ZXIgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcmZ2IChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb252b2x1dGlvblBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2VwYXJhYmxlRmlsdGVyIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKiwgR0x2b2lkICosIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXBhcmFibGVGaWx0ZXIyRCAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKiwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbSAoR0xlbnVtLCBHTGJvb2xlYW4sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SGlzdG9ncmFtUGFyYW1ldGVyZnYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcml2IChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4IChHTGVudW0sIEdMYm9vbGVhbiwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNaW5tYXhQYXJhbWV0ZXJmdiAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyaXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaXN0b2dyYW0gKEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTGJvb2xlYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1pbm1heCAoR0xlbnVtLCBHTGVudW0sIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzZXRIaXN0b2dyYW0gKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVzZXRNaW5tYXggKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4SW1hZ2UzRCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVORENPTE9SUFJPQykgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlBST0MpIChHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRTUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SVEFCTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlNVQlRBQkxFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZQ09MT1JTVUJUQUJMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05GSUxURVIyRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09OVk9MVVRJT05QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMURQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTlZPTFVUSU9ORklMVEVSMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9ORklMVEVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKmltYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09OVk9MVVRJT05QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0VQQVJBQkxFRklMVEVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnJvdywgR0x2b2lkICpjb2x1bW4sIEdMdm9pZCAqc3Bhbik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFUEFSQUJMRUZJTFRFUjJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnJvdywgY29uc3QgR0x2b2lkICpjb2x1bW4pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEhJU1RPR1JBTVBBUkFNRVRFUklWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGJvb2xlYW4gcmVzZXQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnZhbHVlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUkZWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUlOTUFYUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNSU5NQVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGJvb2xlYW4gc2luayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFU0VUSElTVE9HUkFNUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVE1JTk1BWFBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFNVQklNQUdFM0RQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8xXzMKKyNkZWZpbmUgR0xfVkVSU0lPTl8xXzMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFkIChHTGVudW0sIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWR2IChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZiAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFpIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWl2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxcyAoR0xlbnVtLCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMXN2IChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJkdiAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmYgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJmdiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaSAoR0xlbnVtLCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaXYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyc3YgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2QgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNkdiAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2YgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNmdiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaSAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2l2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzcyAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM3N2IChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRkIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGR2IChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRpIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGl2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0cyAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHN2IChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZFRyYW5zcG9zZU1hdHJpeGQgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhmIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRUcmFuc3Bvc2VNYXRyaXhkIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYsIEdMYm9vbGVhbik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTFEIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0QgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTFEIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tcHJlc3NlZFRleEltYWdlIChHTGVudW0sIEdMaW50LCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVURVhUVVJFUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xJRU5UQUNUSVZFVEVYVFVSRVBST0MpIChHTGVudW0gdGV4dHVyZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUlQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJGVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IHMsIEdMaW50IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2hvcnQgcywgR0xzaG9ydCB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNGUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM1NQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU1ZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGRvdWJsZSBzLCBHTGRvdWJsZSB0LCBHTGRvdWJsZSByLCBHTGRvdWJsZSBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEZWUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENElQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCwgR0xpbnQgciwgR0xpbnQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQsIEdMc2hvcnQgciwgR0xzaG9ydCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRTVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UzRFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMkRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTJEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTFEUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NUFJFU1NFRFRFWElNQUdFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTHZvaWQgKmltZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzFfNAorI2RlZmluZSBHTF9WRVJTSU9OXzFfNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZiAoR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmdiAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGQgKEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGR2IChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXIgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0FycmF5cyAoR0xlbnVtLCBHTGludCAqLCBHTHNpemVpICosIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzIChHTGVudW0sIGNvbnN0IEdMc2l6ZWkgKiwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICosIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZiAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZ2IChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJpIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcml2IChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2IgKEdMYnl0ZSwgR0xieXRlLCBHTGJ5dGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2J2IChjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZCAoR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZHYgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2YgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2Z2IChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2kgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2l2IChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzIChHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNzdiAoY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YiAoR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWJ2IChjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpIChHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1aXYgKGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1cyAoR0x1c2hvcnQsIEdMdXNob3J0LCBHTHVzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdXN2IChjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXIgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZCAoR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZHYgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmIChHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnYgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmkgKEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMml2IChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MycyAoR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnN2IChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZHYgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnYgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2kgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpdiAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3MgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzdiAoY29uc3QgR0xzaG9ydCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERlBST0MpIChHTGZsb2F0IGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGVlBST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFBST0MpIChHTGRvdWJsZSBjb29yZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0NPT1JERFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlBST0MpIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlZQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFBST0MpIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGUFJPQykgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGVlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVZQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTUFJPQykgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJQUk9DKSAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCVlBST0MpIChjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJVlBST0MpIChjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU1BST0MpIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNWUFJPQykgKGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEVlBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MySVBST0MpIChHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyU1ZQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNEUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRFZQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzRlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVBST0MpIChHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lWUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NQUk9DKSAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTVlBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1ZFUlNJT05fMV81CisjZGVmaW5lIEdMX1ZFUlNJT05fMV81IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUXVlcmllcyAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVF1ZXJpZXMgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUXVlcnkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmVnaW5RdWVyeSAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZFF1ZXJ5IChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5aXYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdGl2IChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXYgKEdMdWludCwgR0xlbnVtLCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlciAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0J1ZmZlciAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0sIEdMc2l6ZWlwdHIsIGNvbnN0IEdMdm9pZCAqLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlclN1YkRhdGEgKEdMZW51bSwgR0xpbnRwdHIsIEdMc2l6ZWlwdHIsIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJTdWJEYXRhIChHTGVudW0sIEdMaW50cHRyLCBHTHNpemVpcHRyLCBHTHZvaWQgKik7CitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwQnVmZmVyIChHTGVudW0sIEdMZW51bSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlciAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2IChHTGVudW0sIEdMZW51bSwgR0x2b2lkKiAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlFVRVJJRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVFVRVJJRVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNRVUVSWVBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlFVRVJZUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFFVRVJZUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWUlWUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSVZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJVlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVCVUZGRVJTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNCVUZGRVJQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUkRBVEFQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJVRkZFUlNVQkRBVEFQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJVRkZFUlNVQkRBVEFQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIEdMdm9pZCAqZGF0YSk7Cit0eXBlZGVmIEdMdm9pZCogKEFQSUVOVFJZUCBQRk5HTE1BUEJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xVTk1BUEJVRkZFUlBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUEFSQU1FVEVSSVZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUE9JTlRFUlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfVkVSU0lPTl8yXzAKKyNkZWZpbmUgR0xfVkVSU0lPTl8yXzAgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QnVmZmVycyAoR0xzaXplaSwgY29uc3QgR0xlbnVtICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcFNlcGFyYXRlIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsTWFza1NlcGFyYXRlIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXR0YWNoU2hhZGVyIChHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEF0dHJpYkxvY2F0aW9uIChHTHVpbnQsIEdMdWludCwgY29uc3QgR0xjaGFyICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXBpbGVTaGFkZXIgKEdMdWludCk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtICh2b2lkKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbENyZWF0ZVNoYWRlciAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVNoYWRlciAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXRhY2hTaGFkZXIgKEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliIChHTHVpbnQsIEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGludCAqLCBHTGVudW0gKiwgR0xjaGFyICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm0gKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXR0YWNoZWRTaGFkZXJzIChHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0x1aW50ICopOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRBdHRyaWJMb2NhdGlvbiAoR0x1aW50LCBjb25zdCBHTGNoYXIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2IChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUluZm9Mb2cgKEdMdWludCwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyaXYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRTaGFkZXJJbmZvTG9nIChHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xjaGFyICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZSAoR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMY2hhciAqKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uIChHTHVpbnQsIGNvbnN0IEdMY2hhciAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnYgKEdMdWludCwgR0xpbnQsIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybWl2IChHTHVpbnQsIEdMaW50LCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJkdiAoR0x1aW50LCBHTGVudW0sIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2IChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2IChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbSAoR0x1aW50KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzU2hhZGVyIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmtQcm9ncmFtIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYWRlclNvdXJjZSAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGNoYXIqICosIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW0gKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmIChHTGludCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmIChHTGludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpIChHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaSAoR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpIChHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpIChHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00ZnYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0xaXYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMml2IChHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNpdiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm00aXYgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2IChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzZnYgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW0gKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWQgKEdMdWludCwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkdiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZiAoR0x1aW50LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxcyAoR0x1aW50LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc3YgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZCAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIycyAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc3YgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZCAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2YgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2IChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3MgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3N2IChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5idiAoR0x1aW50LCBjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5pdiAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnN2IChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YiAoR0x1aW50LCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVidiAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWl2IChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVzdiAoR0x1aW50LCBjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0YnYgKEdMdWludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZHYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGYgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZ2IChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGl2IChHTHVpbnQsIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnYgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWl2IChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dXN2IChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCwgR0xpbnQsIEdMZW51bSwgR0xib29sZWFuLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVQUk9DKSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxPUFNFUEFSQVRFUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVEVOQ0lMRlVOQ1NFUEFSQVRFUFJPQykgKEdMZW51bSBmcm9udGZ1bmMsIEdMZW51bSBiYWNrZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxNQVNLU0VQQVJBVEVQUk9DKSAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVRUQUNIU0hBREVSUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREFUVFJJQkxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBJTEVTSEFERVJQUk9DKSAoR0x1aW50IHNoYWRlcik7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQ1JFQVRFUFJPR1JBTVBST0MpICh2b2lkKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJQUk9DKSAoR0xlbnVtIHR5cGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFU0hBREVSUFJPQykgKEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBQ0hTSEFERVJQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFQVRUUklCUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBQ1RJVkVVTklGT1JNUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRBVFRBQ0hFRFNIQURFUlNQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKm9iaik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRBVFRSSUJMT0NBVElPTlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNSU5GT0xPR1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUklWUFJPQykgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUklORk9MT0dQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlNPVVJDRVBST0MpIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpzb3VyY2UpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUxPQ0FUSU9OUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNSVZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRFZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJGVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCSVZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJQT0lOVEVSVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNUFJPQykgKEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1NIQURFUlBST0MpIChHTHVpbnQgc2hhZGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElOS1BST0dSQU1QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJTT1VSQ0VQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiAqc3RyaW5nLCBjb25zdCBHTGludCAqbGVuZ3RoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zRlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00RlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMklQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00SVBST0MpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0xSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0ySVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zSVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk00SVZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgyRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDNGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNEZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBTElEQVRFUFJPR1JBTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkZWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTUFJPQykgKEdMdWludCBpbmRleCwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyU1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROQlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TklWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVieXRlIHgsIEdMdWJ5dGUgeSwgR0x1Ynl0ZSB6LCBHTHVieXRlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0TlVJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVVNWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0QlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RFZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRGUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRJVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U1ZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWJ5dGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUlWUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVTVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUE9JTlRFUlBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9WRVJTSU9OXzJfMQorI2RlZmluZSBHTF9WRVJTSU9OXzJfMSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyeDNmdiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3gyZnYgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJ4NGZ2IChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDJmdiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3g0ZnYgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDR4M2Z2IChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDJYM0ZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzWDJGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlg0RlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDRYMkZWUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzWDRGVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNFgzRlZQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXRleHR1cmUKKyNkZWZpbmUgR0xfQVJCX211bHRpdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmVBUkIgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xpZW50QWN0aXZlVGV4dHVyZUFSQiAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWRBUkIgKEdMZW51bSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZHZBUkIgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFmQVJCIChHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxZnZBUkIgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWlBUkIgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxaXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFzQVJCIChHTGVudW0sIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQxc3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmRBUkIgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmR2QVJCIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyZkFSQiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMmZ2QVJCIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpQVJCIChHTGVudW0sIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJpdkFSQiAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMnNBUkIgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJzdkFSQiAoR0xlbnVtLCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZEFSQiAoR0xlbnVtLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2R2QVJCIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzZkFSQiAoR0xlbnVtLCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkM2Z2QVJCIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNpQVJCIChHTGVudW0sIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDNzQVJCIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzc3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGRBUkIgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZHZBUkIgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmQVJCIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZnZBUkIgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGlBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0aXZBUkIgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRzQVJCIChHTGVudW0sIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0c3ZBUkIgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFDVElWRVRFWFRVUkVBUkJQUk9DKSAoR0xlbnVtIHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVURVhUVVJFQVJCUFJPQykgKEdMZW51bSB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMURWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDFJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMVNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQyRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMklBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgcywgR0xpbnQgdCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQySVZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaG9ydCBzLCBHTHNob3J0IHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMlNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgcywgR0xkb3VibGUgdCwgR0xkb3VibGUgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRFZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEM0ZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzRlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzU0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNTVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDREQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZG91YmxlIHMsIEdMZG91YmxlIHQsIEdMZG91YmxlIHIsIEdMZG91YmxlIHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0RlZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBzLCBHTGludCB0LCBHTGludCByLCBHTGludCBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDRJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0U0FSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNob3J0IHMsIEdMc2hvcnQgdCwgR0xzaG9ydCByLCBHTHNob3J0IHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFNWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RyYW5zcG9zZV9tYXRyaXgKKyNkZWZpbmUgR0xfQVJCX3RyYW5zcG9zZV9tYXRyaXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZkFSQiAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkVHJhbnNwb3NlTWF0cml4ZEFSQiAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGZBUkIgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdFRyYW5zcG9zZU1hdHJpeGRBUkIgKGNvbnN0IEdMZG91YmxlICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFRSQU5TUE9TRU1BVFJJWEZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQURUUkFOU1BPU0VNQVRSSVhEQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVFRSQU5TUE9TRU1BVFJJWEZBUkJQUk9DKSAoY29uc3QgR0xmbG9hdCAqbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRUUkFOU1BPU0VNQVRSSVhEQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICptKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9BUkJfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZUFSQiAoR0xjbGFtcGYsIEdMYm9vbGVhbik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRUFSQlBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfYWRkCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9hZGQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY3ViZV9tYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24KKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfY29tcHJlc3Npb24gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzREFSQiAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEQVJCIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMURBUkIgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzREFSQiAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkRBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMURBUkIgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21wcmVzc2VkVGV4SW1hZ2VBUkIgKEdMZW51bSwgR0xpbnQsIEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNEQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UyREFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWElNQUdFMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFM0RBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMkRBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NUFJFU1NFRFRFWFNVQklNQUdFMURBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT01QUkVTU0VEVEVYSU1BR0VBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMdm9pZCAqaW1nKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2JvcmRlcl9jbGFtcAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9ib3JkZXJfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfQVJCX3BvaW50X3BhcmFtZXRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZBUkIgKEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmdkFSQiAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJGQVJCUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZBUkJQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3ZlcnRleF9ibGVuZAorI2RlZmluZSBHTF9BUkJfdmVydGV4X2JsZW5kIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0YnZBUkIgKEdMaW50LCBjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0c3ZBUkIgKEdMaW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGl2QVJCIChHTGludCwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0ZnZBUkIgKEdMaW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdlaWdodGR2QVJCIChHTGludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0dWJ2QVJCIChHTGludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1c3ZBUkIgKEdMaW50LCBjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXZWlnaHR1aXZBUkIgKEdMaW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlckFSQiAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEJsZW5kQVJCIChHTGludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRCVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGJ5dGUgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHNob3J0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hUSVZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xpbnQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRGVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTGZsb2F0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0VJR0hURFZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0xkb3VibGUgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRVQlZBUkJQUk9DKSAoR0xpbnQgc2l6ZSwgY29uc3QgR0x1Ynl0ZSAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqd2VpZ2h0cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdFSUdIVFVJVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVpbnQgKndlaWdodHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXRUlHSFRQT0lOVEVSQVJCUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQkxFTkRBUkJQUk9DKSAoR0xpbnQgY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX21hdHJpeF9wYWxldHRlCisjZGVmaW5lIEdMX0FSQl9tYXRyaXhfcGFsZXR0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1cnJlbnRQYWxldHRlTWF0cml4QVJCIChHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1YnZBUkIgKEdMaW50LCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeEluZGV4dXN2QVJCIChHTGludCwgY29uc3QgR0x1c2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXh1aXZBUkIgKEdMaW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyQVJCIChHTGludCwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDVVJSRU5UUEFMRVRURU1BVFJJWEFSQlBST0MpIChHTGludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVUJWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWJ5dGUgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVRSSVhJTkRFWFVTVkFSQlBST0MpIChHTGludCBzaXplLCBjb25zdCBHTHVzaG9ydCAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYVUlWQVJCUFJPQykgKEdMaW50IHNpemUsIGNvbnN0IEdMdWludCAqaW5kaWNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYUE9JTlRFUkFSQlBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9lbnZfY3Jvc3NiYXIKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZW52X2Nyb3NzYmFyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfQVJCX2RlcHRoX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRvdworI2RlZmluZSBHTF9BUkJfc2hhZG93IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9zaGFkb3dfYW1iaWVudAorI2RlZmluZSBHTF9BUkJfc2hhZG93X2FtYmllbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3dpbmRvd19wb3MKKyNkZWZpbmUgR0xfQVJCX3dpbmRvd19wb3MgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZEFSQiAoR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZHZBUkIgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJmQVJCIChHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnZBUkIgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmlBUkIgKEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMml2QVJCIChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc0FSQiAoR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMnN2QVJCIChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNkQVJCIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZHZBUkIgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmQVJCIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZnZBUkIgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2lBUkIgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNpdkFSQiAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM3NBUkIgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzdkFSQiAoY29uc3QgR0xzaG9ydCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJEQVJCUFJPQykgKEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRFZBUkJQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MyRkFSQlBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGVkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklBUkJQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJVkFSQlBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTQVJCUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMlNWQVJCUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzREFSQlBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RWQVJCUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZBUkJQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGVkFSQlBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lBUkJQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNJVkFSQlBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNTQVJCUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1ZBUkJQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9wcm9ncmFtIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWRBUkIgKEdMdWludCwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFkdkFSQiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZkFSQiAoR0x1aW50LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnZBUkIgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc0FSQiAoR0x1aW50LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxc3ZBUkIgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZEFSQiAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJkdkFSQiAoR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZkFSQiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnZBUkIgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc0FSQiAoR0x1aW50LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyc3ZBUkIgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZEFSQiAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZHZBUkIgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2ZBUkIgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2QVJCIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3NBUkIgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM3N2QVJCIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5idkFSQiAoR0x1aW50LCBjb25zdCBHTGJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE5pdkFSQiAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnN2QVJCIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNE51YkFSQiAoR0x1aW50LCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVidkFSQiAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjROdWl2QVJCIChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0TnVzdkFSQiAoR0x1aW50LCBjb25zdCBHTHVzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0YnZBUkIgKEdMdWludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRkQVJCIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZHZBUkIgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZBUkIgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZ2QVJCIChHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGl2QVJCIChHTHVpbnQsIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzQVJCIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzdkFSQiAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjR1YnZBUkIgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWl2QVJCIChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dXN2QVJCIChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXJBUkIgKEdMdWludCwgR0xpbnQsIEdMZW51bSwgR0xib29sZWFuLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXlBUkIgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5QVJCIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1TdHJpbmdBUkIgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFByb2dyYW1BUkIgKEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtc0FSQiAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblByb2dyYW1zQVJCIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlcjRkQVJCIChHTGVudW0sIEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXI0ZHZBUkIgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZBUkIgKEdMZW51bSwgR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyNGZ2QVJCIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZEFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZHZBUkIgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXI0ZkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcjRmdkFSQiAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmR2QVJCIChHTGVudW0sIEdMdWludCwgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbUVudlBhcmFtZXRlcmZ2QVJCIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJkdkFSQiAoR0xlbnVtLCBHTHVpbnQsIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlcmZ2QVJCIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXZBUkIgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3RyaW5nQVJCIChHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmR2QVJCIChHTHVpbnQsIEdMZW51bSwgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnZBUkIgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2QVJCIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnZBUkIgKEdMdWludCwgR0xlbnVtLCBHTHZvaWQqICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNQcm9ncmFtQVJCIChHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMURWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIyRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMlNBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzREFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzRFZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5CVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VQkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWJ5dGUgeCwgR0x1Ynl0ZSB5LCBHTHVieXRlIHosIEdMdWJ5dGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjROVUlWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNE5VU1ZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRCVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNElWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0U0FSQlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVkFSQlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VUJWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVSVZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0VVNWQVJCUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1c2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFVkVSVEVYQVRUUklCQVJSQVlBUkJQUk9DKSAoR0x1aW50IGluZGV4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRVZFUlRFWEFUVFJJQkFSUkFZQVJCUFJPQykgKEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1TVFJJTkdBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdm9pZCAqc3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1BUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVQUk9HUkFNU0FSQlBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5QUk9HUkFNU0FSQlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcHJvZ3JhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUjREVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNEZBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSNEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNERWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUjRGQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSNEZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1FTlZQQVJBTUVURVJGVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUkRWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1MT0NBTFBBUkFNRVRFUkZWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1TVFJJTkdBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKnN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkRWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGRvdWJsZSAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCRlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQklWQVJCUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCUE9JTlRFUlZBUkJQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTUFJPR1JBTUFSQlBST0MpIChHTHVpbnQgcHJvZ3JhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbQorI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbSAxCisvKiBBbGwgQVJCX2ZyYWdtZW50X3Byb2dyYW0gZW50cnkgcG9pbnRzIGFyZSBzaGFyZWQgd2l0aCBBUkJfdmVydGV4X3Byb2dyYW0uICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdmVydGV4X2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfQVJCX3ZlcnRleF9idWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEJ1ZmZlckFSQiAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnNBUkIgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5CdWZmZXJzQVJCIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0J1ZmZlckFSQiAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCdWZmZXJEYXRhQVJCIChHTGVudW0sIEdMc2l6ZWlwdHJBUkIsIGNvbnN0IEdMdm9pZCAqLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlclN1YkRhdGFBUkIgKEdMZW51bSwgR0xpbnRwdHJBUkIsIEdMc2l6ZWlwdHJBUkIsIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJTdWJEYXRhQVJCIChHTGVudW0sIEdMaW50cHRyQVJCLCBHTHNpemVpcHRyQVJCLCBHTHZvaWQgKik7CitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwQnVmZmVyQVJCIChHTGVudW0sIEdMZW51bSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlckFSQiAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdkFSQiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2QVJCIChHTGVudW0sIEdMZW51bSwgR0x2b2lkKiAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRCVUZGRVJBUkJQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUJVRkZFUlNBUkJQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5CVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0JVRkZFUkFSQlBST0MpIChHTHVpbnQgYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyQVJCIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSU1VCREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSU1VCREFUQUFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ckFSQiBvZmZzZXQsIEdMc2l6ZWlwdHJBUkIgc2l6ZSwgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVSQVJCUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQQVJBTUVURVJJVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfb2NjbHVzaW9uX3F1ZXJ5CisjZGVmaW5lIEdMX0FSQl9vY2NsdXNpb25fcXVlcnkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5RdWVyaWVzQVJCIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUXVlcmllc0FSQiAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNRdWVyeUFSQiAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblF1ZXJ5QVJCIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kUXVlcnlBUkIgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlpdkFSQiAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0aXZBUkIgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpdkFSQiAoR0x1aW50LCBHTGVudW0sIEdMdWludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlFVRVJJRVNBUkJQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVFVRVJJRVNBUkJQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNRVUVSWUFSQlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCRUdJTlFVRVJZQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFFVRVJZQVJCUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWUlWQVJCUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSVZBUkJQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJVkFSQlBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRlcl9vYmplY3RzCisjZGVmaW5lIEdMX0FSQl9zaGFkZXJfb2JqZWN0cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZU9iamVjdEFSQiAoR0xoYW5kbGVBUkIpOworR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xHZXRIYW5kbGVBUkIgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGV0YWNoT2JqZWN0QVJCIChHTGhhbmRsZUFSQiwgR0xoYW5kbGVBUkIpOworR0xBUEkgR0xoYW5kbGVBUkIgQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXJPYmplY3RBUkIgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyU291cmNlQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgY29uc3QgR0xjaGFyQVJCKiAqLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVyQVJCIChHTGhhbmRsZUFSQik7CitHTEFQSSBHTGhhbmRsZUFSQiBBUElFTlRSWSBnbENyZWF0ZVByb2dyYW1PYmplY3RBUkIgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEF0dGFjaE9iamVjdEFSQiAoR0xoYW5kbGVBUkIsIEdMaGFuZGxlQVJCKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbUFSQiAoR0xoYW5kbGVBUkIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVzZVByb2dyYW1PYmplY3RBUkIgKEdMaGFuZGxlQVJCKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW1BUkIgKEdMaGFuZGxlQVJCKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWZBUkIgKEdMaW50LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMmZBUkIgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2ZBUkIgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGZBUkIgKEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMWlBUkIgKEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJpQVJCIChHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2lBUkIgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNGlBUkIgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTJmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTNmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTFpdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0yaXZBUkIgKEdMaW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM2l2QVJCIChHTGludCwgR0xzaXplaSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybTRpdkFSQiAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyZnZBUkIgKEdMaW50LCBHTHNpemVpLCBHTGJvb2xlYW4sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDNmdkFSQiAoR0xpbnQsIEdMc2l6ZWksIEdMYm9vbGVhbiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NGZ2QVJCIChHTGludCwgR0xzaXplaSwgR0xib29sZWFuLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdFBhcmFtZXRlcmZ2QVJCIChHTGhhbmRsZUFSQiwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE9iamVjdFBhcmFtZXRlcml2QVJCIChHTGhhbmRsZUFSQiwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbmZvTG9nQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXJBUkIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QXR0YWNoZWRPYmplY3RzQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGhhbmRsZUFSQiAqKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiwgY29uc3QgR0xjaGFyQVJCICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1BUkIgKEdMaGFuZGxlQVJCLCBHTHVpbnQsIEdMc2l6ZWksIEdMc2l6ZWkgKiwgR0xpbnQgKiwgR0xlbnVtICosIEdMY2hhckFSQiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnZBUkIgKEdMaGFuZGxlQVJCLCBHTGludCwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtaXZBUkIgKEdMaGFuZGxlQVJCLCBHTGludCwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0U2hhZGVyU291cmNlQVJCIChHTGhhbmRsZUFSQiwgR0xzaXplaSwgR0xzaXplaSAqLCBHTGNoYXJBUkIgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqKTsKK3R5cGVkZWYgR0xoYW5kbGVBUkIgKEFQSUVOVFJZUCBQRk5HTEdFVEhBTkRMRUFSQlBST0MpIChHTGVudW0gcG5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBQ0hPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTGhhbmRsZUFSQiBhdHRhY2hlZE9iaik7Cit0eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJPQkpFQ1RBUkJQUk9DKSAoR0xlbnVtIHNoYWRlclR5cGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTSEFERVJTT1VSQ0VBUkJQUk9DKSAoR0xoYW5kbGVBUkIgc2hhZGVyT2JqLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXJBUkIqICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01QSUxFU0hBREVSQVJCUFJPQykgKEdMaGFuZGxlQVJCIHNoYWRlck9iaik7Cit0eXBlZGVmIEdMaGFuZGxlQVJCIChBUElFTlRSWVAgUEZOR0xDUkVBVEVQUk9HUkFNT0JKRUNUQVJCUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBVFRBQ0hPQkpFQ1RBUkJQUk9DKSAoR0xoYW5kbGVBUkIgY29udGFpbmVyT2JqLCBHTGhhbmRsZUFSQiBvYmopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSU5LUFJPR1JBTUFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVVNFUFJPR1JBTU9CSkVDVEFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0ZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNEZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIsIEdMZmxvYXQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUlBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTJJQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0lBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNElBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIsIEdMaW50IHYzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTFGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMkZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTRGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMUlWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMklWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNM0lWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNElWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMkZWQVJCUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk1NQVRSSVgzRlZBUkJQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STU1BVFJJWDRGVkFSQlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RQQVJBTUVURVJGVkFSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUUEFSQU1FVEVSSVZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgb2JqLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTkZPTE9HQVJCUFJPQykgKEdMaGFuZGxlQVJCIG9iaiwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyQVJCICppbmZvTG9nKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQVRUQUNIRURPQkpFQ1RTQVJCUFJPQykgKEdMaGFuZGxlQVJCIGNvbnRhaW5lck9iaiwgR0xzaXplaSBtYXhDb3VudCwgR0xzaXplaSAqY291bnQsIEdMaGFuZGxlQVJCICpvYmopOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVVOSUZPUk1BUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0x1aW50IGluZGV4LCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXJBUkIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRVTklGT1JNRlZBUkJQUk9DKSAoR0xoYW5kbGVBUkIgcHJvZ3JhbU9iaiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1JVkFSQlBST0MpIChHTGhhbmRsZUFSQiBwcm9ncmFtT2JqLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNIQURFUlNPVVJDRUFSQlBST0MpIChHTGhhbmRsZUFSQiBvYmosIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhckFSQiAqc291cmNlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyCisjZGVmaW5lIEdMX0FSQl92ZXJ0ZXhfc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEF0dHJpYkxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiwgR0x1aW50LCBjb25zdCBHTGNoYXJBUkIgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliQVJCIChHTGhhbmRsZUFSQiwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMaW50ICosIEdMZW51bSAqLCBHTGNoYXJBUkIgKik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uQVJCIChHTGhhbmRsZUFSQiwgY29uc3QgR0xjaGFyQVJCICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREFUVFJJQkxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyQVJCICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQUNUSVZFQVRUUklCQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIEdMdWludCBpbmRleCwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyQVJCICpuYW1lKTsKK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVEFUVFJJQkxPQ0FUSU9OQVJCUFJPQykgKEdMaGFuZGxlQVJCIHByb2dyYW1PYmosIGNvbnN0IEdMY2hhckFSQiAqbmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfZnJhZ21lbnRfc2hhZGVyCisjZGVmaW5lIEdMX0FSQl9mcmFnbWVudF9zaGFkZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3NoYWRpbmdfbGFuZ3VhZ2VfMTAwCisjZGVmaW5lIEdMX0FSQl9zaGFkaW5nX2xhbmd1YWdlXzEwMCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvCisjZGVmaW5lIEdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BvaW50X3Nwcml0ZQorI2RlZmluZSBHTF9BUkJfcG9pbnRfc3ByaXRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl9mcmFnbWVudF9wcm9ncmFtX3NoYWRvdworI2RlZmluZSBHTF9BUkJfZnJhZ21lbnRfcHJvZ3JhbV9zaGFkb3cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2RyYXdfYnVmZmVycworI2RlZmluZSBHTF9BUkJfZHJhd19idWZmZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0J1ZmZlcnNBUkIgKEdMc2l6ZWksIGNvbnN0IEdMZW51bSAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTQVJCUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZQorI2RlZmluZSBHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2NvbG9yX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9BUkJfY29sb3JfYnVmZmVyX2Zsb2F0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xhbXBDb2xvckFSQiAoR0xlbnVtLCBHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ0xBTVBDT0xPUkFSQlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gY2xhbXApOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKKyNkZWZpbmUgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3RleHR1cmVfZmxvYXQKKyNkZWZpbmUgR0xfQVJCX3RleHR1cmVfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVJCX3BpeGVsX2J1ZmZlcl9vYmplY3QKKyNkZWZpbmUgR0xfQVJCX3BpeGVsX2J1ZmZlcl9vYmplY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2FiZ3IKKyNkZWZpbmUgR0xfRVhUX2FiZ3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2NvbG9yCisjZGVmaW5lIEdMX0VYVF9ibGVuZF9jb2xvciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kQ29sb3JFWFQgKEdMY2xhbXBmLCBHTGNsYW1wZiwgR0xjbGFtcGYsIEdMY2xhbXBmKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5EQ09MT1JFWFRQUk9DKSAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BvbHlnb25fb2Zmc2V0CisjZGVmaW5lIEdMX0VYVF9wb2x5Z29uX29mZnNldCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXRFWFQgKEdMZmxvYXQsIEdMZmxvYXQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUE9MWUdPTk9GRlNFVEVYVFBST0MpIChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCBiaWFzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlM0QKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmUzRCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlM0RFWFQgKEdMZW51bSwgR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWElNQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZmlsdGVyNAorI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfZmlsdGVyNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleEZpbHRlckZ1bmNTR0lTIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhGaWx0ZXJGdW5jU0dJUyAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhGSUxURVJGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZmlsdGVyLCBHTGZsb2F0ICp3ZWlnaHRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYRklMVEVSRlVOQ1NHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGZpbHRlciwgR0xzaXplaSBuLCBjb25zdCBHTGZsb2F0ICp3ZWlnaHRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdWJ0ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9zdWJ0ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UxREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29weV90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9jb3B5X3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UxREVYVCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyREVYVCAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UxREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkRFWFQgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzREVYVCAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTHNpemVpLCBHTHNpemVpKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhJTUFHRTFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMaW50IGJvcmRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaGlzdG9ncmFtCisjZGVmaW5lIEdMX0VYVF9oaXN0b2dyYW0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1FWFQgKEdMZW51bSwgR0xib29sZWFuLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEhpc3RvZ3JhbVBhcmFtZXRlcmZ2RVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRIaXN0b2dyYW1QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heEVYVCAoR0xlbnVtLCBHTGJvb2xlYW4sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWlubWF4UGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldE1pbm1heFBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSGlzdG9ncmFtRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xib29sZWFuKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNaW5tYXhFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGJvb2xlYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0SGlzdG9ncmFtRVhUIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlc2V0TWlubWF4RVhUIChHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMYm9vbGVhbiByZXNldCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdmFsdWVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSElTVE9HUkFNUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRISVNUT0dSQU1QQVJBTUVURVJJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xib29sZWFuIHJlc2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp2YWx1ZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNSU5NQVhQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1JTk1BWFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMYm9vbGVhbiBzaW5rKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUlOTUFYRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xib29sZWFuIHNpbmspOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNFVEhJU1RPR1JBTUVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVTRVRNSU5NQVhFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29udm9sdXRpb24KKyNkZWZpbmUgR0xfRVhUX2NvbnZvbHV0aW9uIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIxREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25GaWx0ZXIyREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmRVhUIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29udm9sdXRpb25QYXJhbWV0ZXJpRVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbnZvbHV0aW9uUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29udm9sdXRpb25GaWx0ZXIxREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weUNvbnZvbHV0aW9uRmlsdGVyMkRFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbnZvbHV0aW9uRmlsdGVyRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29udm9sdXRpb25QYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNlcGFyYWJsZUZpbHRlckVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICosIEdMdm9pZCAqLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2VwYXJhYmxlRmlsdGVyMkRFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICosIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9ORklMVEVSMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW1hZ2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUkZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTlZPTFVUSU9OUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT05WT0xVVElPTlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPUFlDT05WT0xVVElPTkZJTFRFUjJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTkZJTFRFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbWFnZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTlZPTFVUSU9OUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRDT05WT0xVVElPTlBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFNFUEFSQUJMRUZJTFRFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpyb3csIEdMdm9pZCAqY29sdW1uLCBHTHZvaWQgKnNwYW4pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVBBUkFCTEVGSUxURVIyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpyb3csIGNvbnN0IEdMdm9pZCAqY29sdW1uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV9jb2xvcl9tYXRyaXgKKyNkZWZpbmUgR0xfU0dJX2NvbG9yX21hdHJpeCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lfY29sb3JfdGFibGUKKyNkZWZpbmUgR0xfU0dJX2NvbG9yX3RhYmxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVNHSSAoR0xlbnVtLCBHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JUYWJsZVBhcmFtZXRlcmZ2U0dJIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvclRhYmxlUGFyYW1ldGVyaXZTR0kgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JUYWJsZVNHSSAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTGludCwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVNHSSAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVQYXJhbWV0ZXJmdlNHSSAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29sb3JUYWJsZVBhcmFtZXRlcml2U0dJIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFU0dJUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqdGFibGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSRlZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUlRBQkxFUEFSQU1FVEVSSVZTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SVEFCTEVTR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0YWJsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJJVlNHSVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9waXhlbF90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVhfcGl4ZWxfdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVGV4R2VuU0dJWCAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOU0dJWFBST0MpIChHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3BpeGVsX3RleHR1cmUKKyNkZWZpbmUgR0xfU0dJU19waXhlbF90ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpU0dJUyAoR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJpdlNHSVMgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUZXhHZW5QYXJhbWV0ZXJmU0dJUyAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRleEdlblBhcmFtZXRlcmZ2U0dJUyAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyaXZTR0lTIChHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBpeGVsVGV4R2VuUGFyYW1ldGVyZnZTR0lTIChHTGVudW0sIEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUklTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUklWU0dJU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRFWEdFTlBBUkFNRVRFUkZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVEVYR0VOUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUElYRUxURVhHRU5QQVJBTUVURVJJVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUElYRUxURVhHRU5QQVJBTUVURVJGVlNHSVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU190ZXh0dXJlNEQKKyNkZWZpbmUgR0xfU0dJU190ZXh0dXJlNEQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTREU0dJUyAoR0xlbnVtLCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTHNpemVpLCBHTGludCwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTREU0dJUyAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMc2l6ZWksIEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhJTUFHRTREU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xzaXplaSBzaXplNGQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0U0RFNHSVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHdvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTHNpemVpIHNpemU0ZCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlCisjZGVmaW5lIEdMX1NHSV90ZXh0dXJlX2NvbG9yX3RhYmxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9jbXlrYQorI2RlZmluZSBHTF9FWFRfY215a2EgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfb2JqZWN0CisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsQXJlVGV4dHVyZXNSZXNpZGVudEVYVCAoR0xzaXplaSwgY29uc3QgR0x1aW50ICosIEdMYm9vbGVhbiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZUVYVCAoR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzRVhUIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVGV4dHVyZXNFWFQgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVGV4dHVyZUVYVCAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmlvcml0aXplVGV4dHVyZXNFWFQgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGNsYW1wZiAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMQVJFVEVYVFVSRVNSRVNJREVOVEVYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMsIEdMYm9vbGVhbiAqcmVzaWRlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRURVhUVVJFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU1RFWFRVUkVFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUklPUklUSVpFVEVYVFVSRVNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzLCBjb25zdCBHTGNsYW1wZiAqcHJpb3JpdGllcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX2RldGFpbF90ZXh0dXJlCisjZGVmaW5lIEdMX1NHSVNfZGV0YWlsX3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXRhaWxUZXhGdW5jU0dJUyAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldERldGFpbFRleEZ1bmNTR0lTIChHTGVudW0sIEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERVRBSUxURVhGVU5DU0dJU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG4sIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVERFVEFJTFRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3NoYXJwZW5fdGV4dHVyZQorI2RlZmluZSBHTF9TR0lTX3NoYXJwZW5fdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNoYXJwZW5UZXhGdW5jU0dJUyAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFNoYXJwZW5UZXhGdW5jU0dJUyAoR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBUlBFTlRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUU0hBUlBFTlRFWEZVTkNTR0lTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgKnBvaW50cyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX3BpeGVscworI2RlZmluZSBHTF9FWFRfcGFja2VkX3BpeGVscyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfbG9kCisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9sb2QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9TR0lTX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlTWFza1NHSVMgKEdMY2xhbXBmLCBHTGJvb2xlYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZVBhdHRlcm5TR0lTIChHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFTUFTS1NHSVNQUk9DKSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTQU1QTEVQQVRURVJOU0dJU1BST0MpIChHTGVudW0gcGF0dGVybik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcmVzY2FsZV9ub3JtYWwKKyNkZWZpbmUgR0xfRVhUX3Jlc2NhbGVfbm9ybWFsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF92ZXJ0ZXhfYXJyYXkKKyNkZWZpbmUgR0xfRVhUX3ZlcnRleF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFycmF5RWxlbWVudEVYVCAoR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlckVYVCAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXNFWFQgKEdMZW51bSwgR0xpbnQsIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVkZ2VGbGFnUG9pbnRlckVYVCAoR0xzaXplaSwgR0xzaXplaSwgY29uc3QgR0xib29sZWFuICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFBvaW50ZXJ2RVhUIChHTGVudW0sIEdMdm9pZCogKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW5kZXhQb2ludGVyRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJFWFQgKEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyRVhUIChHTGludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBUlJBWUVMRU1FTlRFWFRQUk9DKSAoR0xpbnQgaSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUE9JTlRFUkVYVFBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdBUlJBWVNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRURHRUZMQUdQT0lOVEVSRVhUUFJPQykgKEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGJvb2xlYW4gKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQT0lOVEVSVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElOREVYUE9JTlRFUkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRFBPSU5URVJFWFRQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9taXNjX2F0dHJpYnV0ZQorI2RlZmluZSBHTF9FWFRfbWlzY19hdHRyaWJ1dGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAKKyNkZWZpbmUgR0xfU0dJU19nZW5lcmF0ZV9taXBtYXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9jbGlwbWFwCisjZGVmaW5lIEdMX1NHSVhfY2xpcG1hcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NoYWRvdworI2RlZmluZSBHTF9TR0lYX3NoYWRvdyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfZWRnZV9jbGFtcAorI2RlZmluZSBHTF9TR0lTX3RleHR1cmVfZWRnZV9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lTX3RleHR1cmVfYm9yZGVyX2NsYW1wCisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9ib3JkZXJfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAorI2RlZmluZSBHTF9FWFRfYmxlbmRfbWlubWF4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbkVYVCAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05FWFRQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX3N1YnRyYWN0CisjZGVmaW5lIEdMX0VYVF9ibGVuZF9zdWJ0cmFjdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbG9naWNfb3AKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX2xvZ2ljX29wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW50ZXJsYWNlCisjZGVmaW5lIEdMX1NHSVhfaW50ZXJsYWNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfcGl4ZWxfdGlsZXMKKyNkZWZpbmUgR0xfU0dJWF9waXhlbF90aWxlcyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfc2VsZWN0CisjZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9zZWxlY3QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zcHJpdGUKKyNkZWZpbmUgR0xfU0dJWF9zcHJpdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJmU0dJWCAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJmdlNHSVggKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTcHJpdGVQYXJhbWV0ZXJpU0dJWCAoR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3ByaXRlUGFyYW1ldGVyaXZTR0lYIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSRlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSRlZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1BSSVRFUEFSQU1FVEVSSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNQUklURVBBUkFNRVRFUklWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX211bHRpX2J1ZmZlcgorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfbXVsdGlfYnVmZmVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzCisjZGVmaW5lIEdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmRVhUIChHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfcG9pbnRfcGFyYW1ldGVycworI2RlZmluZSBHTF9TR0lTX3BvaW50X3BhcmFtZXRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmZTR0lTIChHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnZTR0lTIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUkZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSRlZTR0lTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfaW5zdHJ1bWVudHMKKyNkZWZpbmUgR0xfU0dJWF9pbnN0cnVtZW50cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRJbnN0cnVtZW50c1NHSVggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluc3RydW1lbnRzQnVmZmVyU0dJWCAoR0xzaXplaSwgR0xpbnQgKik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbFBvbGxJbnN0cnVtZW50c1NHSVggKEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlYWRJbnN0cnVtZW50c1NHSVggKEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGFydEluc3RydW1lbnRzU0dJWCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RvcEluc3RydW1lbnRzU0dJWCAoR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xpbnQgKEFQSUVOVFJZUCBQRk5HTEdFVElOU1RSVU1FTlRTU0dJWFBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5TVFJVTUVOVFNCVUZGRVJTR0lYUFJPQykgKEdMc2l6ZWkgc2l6ZSwgR0xpbnQgKmJ1ZmZlcik7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xQT0xMSU5TVFJVTUVOVFNTR0lYUFJPQykgKEdMaW50ICptYXJrZXJfcCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFQURJTlNUUlVNRU5UU1NHSVhQUk9DKSAoR0xpbnQgbWFya2VyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RBUlRJTlNUUlVNRU5UU1NHSVhQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNUT1BJTlNUUlVNRU5UU1NHSVhQUk9DKSAoR0xpbnQgbWFya2VyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzCisjZGVmaW5lIEdMX1NHSVhfdGV4dHVyZV9zY2FsZV9iaWFzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZnJhbWV6b29tCisjZGVmaW5lIEdMX1NHSVhfZnJhbWV6b29tIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVab29tU0dJWCAoR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVaT09NU0dJWFBST0MpIChHTGludCBmYWN0b3IpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90YWdfc2FtcGxlX2J1ZmZlcgorI2RlZmluZSBHTF9TR0lYX3RhZ19zYW1wbGVfYnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFnU2FtcGxlQnVmZmVyU0dJWCAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQUdTQU1QTEVCVUZGRVJTR0lYUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9wb2x5bm9taWFsX2ZmZAorI2RlZmluZSBHTF9TR0lYX3BvbHlub21pYWxfZmZkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtYXRpb25NYXAzZFNHSVggKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGludCwgR0xpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xpbnQsIEdMaW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMaW50LCBHTGludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVmb3JtYXRpb25NYXAzZlNHSVggKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xpbnQsIEdMaW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGludCwgR0xpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMaW50LCBHTGludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWZvcm1TR0lYIChHTGJpdGZpZWxkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHlEZWZvcm1hdGlvbk1hcFNHSVggKEdMYml0ZmllbGQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVGT1JNQVRJT05NQVAzRFNHSVhQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xkb3VibGUgdTEsIEdMZG91YmxlIHUyLCBHTGludCB1c3RyaWRlLCBHTGludCB1b3JkZXIsIEdMZG91YmxlIHYxLCBHTGRvdWJsZSB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBHTGRvdWJsZSB3MSwgR0xkb3VibGUgdzIsIEdMaW50IHdzdHJpZGUsIEdMaW50IHdvcmRlciwgY29uc3QgR0xkb3VibGUgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFRk9STUFUSU9OTUFQM0ZTR0lYUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgdTEsIEdMZmxvYXQgdTIsIEdMaW50IHVzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xpbnQgdnN0cmlkZSwgR0xpbnQgdm9yZGVyLCBHTGZsb2F0IHcxLCBHTGZsb2F0IHcyLCBHTGludCB3c3RyaWRlLCBHTGludCB3b3JkZXIsIGNvbnN0IEdMZmxvYXQgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFRk9STVNHSVhQUk9DKSAoR0xiaXRmaWVsZCBtYXNrKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRElERU5USVRZREVGT1JNQVRJT05NQVBTR0lYUFJPQykgKEdMYml0ZmllbGQgbWFzayk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3JlZmVyZW5jZV9wbGFuZQorI2RlZmluZSBHTF9TR0lYX3JlZmVyZW5jZV9wbGFuZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlZmVyZW5jZVBsYW5lU0dJWCAoY29uc3QgR0xkb3VibGUgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRUZFUkVOQ0VQTEFORVNHSVhQUk9DKSAoY29uc3QgR0xkb3VibGUgKmVxdWF0aW9uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZmx1c2hfcmFzdGVyCisjZGVmaW5lIEdMX1NHSVhfZmx1c2hfcmFzdGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hSYXN0ZXJTR0lYICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIUkFTVEVSU0dJWFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZGVwdGhfdGV4dHVyZQorI2RlZmluZSBHTF9TR0lYX2RlcHRoX3RleHR1cmUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19mb2dfZnVuY3Rpb24KKyNkZWZpbmUgR0xfU0dJU19mb2dfZnVuY3Rpb24gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dGdW5jU0dJUyAoR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGb2dGdW5jU0dJUyAoR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZPR0ZVTkNTR0lTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xmbG9hdCAqcG9pbnRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURk9HRlVOQ1NHSVNQUk9DKSAoR0xmbG9hdCAqcG9pbnRzKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZm9nX29mZnNldAorI2RlZmluZSBHTF9TR0lYX2ZvZ19vZmZzZXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfaW1hZ2VfdHJhbnNmb3JtCisjZGVmaW5lIEdMX0hQX2ltYWdlX3RyYW5zZm9ybSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyaUhQIChHTGVudW0sIEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEltYWdlVHJhbnNmb3JtUGFyYW1ldGVyZkhQIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJpdkhQIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsSW1hZ2VUcmFuc2Zvcm1QYXJhbWV0ZXJmdkhQIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcml2SFAgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbWFnZVRyYW5zZm9ybVBhcmFtZXRlcmZ2SFAgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJJSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSRkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTElNQUdFVFJBTlNGT1JNUEFSQU1FVEVSSVZIUFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTUFHRVRSQU5TRk9STVBBUkFNRVRFUkZWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTUFHRVRSQU5TRk9STVBBUkFNRVRFUklWSFBQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUSU1BR0VUUkFOU0ZPUk1QQVJBTUVURVJGVkhQUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX2NvbnZvbHV0aW9uX2JvcmRlcl9tb2RlcworI2RlZmluZSBHTF9IUF9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF90ZXh0dXJlX2FkZF9lbnYKKyNkZWZpbmUgR0xfU0dJWF90ZXh0dXJlX2FkZF9lbnYgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2NvbG9yX3N1YnRhYmxlCisjZGVmaW5lIEdMX0VYVF9jb2xvcl9zdWJ0YWJsZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yU3ViVGFibGVFWFQgKEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5Q29sb3JTdWJUYWJsZUVYVCAoR0xlbnVtLCBHTHNpemVpLCBHTGludCwgR0xpbnQsIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JTVUJUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHN0YXJ0LCBHTHNpemVpIGNvdW50LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09QWUNPTE9SU1VCVEFCTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzdGFydCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9QR0lfdmVydGV4X2hpbnRzCisjZGVmaW5lIEdMX1BHSV92ZXJ0ZXhfaGludHMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfUEdJX21pc2NfaGludHMKKyNkZWZpbmUgR0xfUEdJX21pc2NfaGludHMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50UEdJIChHTGVudW0sIEdMaW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEhJTlRQR0lQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yVGFibGVFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbG9yVGFibGVFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyaXZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb2xvclRhYmxlUGFyYW1ldGVyZnZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnRhYmxlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09MT1JUQUJMRVBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTE9SVEFCTEVQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY2xpcF92b2x1bWVfaGludAorI2RlZmluZSBHTF9FWFRfY2xpcF92b2x1bWVfaGludCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2xpc3RfcHJpb3JpdHkKKyNkZWZpbmUgR0xfU0dJWF9saXN0X3ByaW9yaXR5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TGlzdFBhcmFtZXRlcmZ2U0dJWCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TGlzdFBhcmFtZXRlcml2U0dJWCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJmU0dJWCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJmdlNHSVggKEdMdWludCwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpc3RQYXJhbWV0ZXJpU0dJWCAoR0x1aW50LCBHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaXN0UGFyYW1ldGVyaXZTR0lYIChHTHVpbnQsIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMSVNUUEFSQU1FVEVSRlZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExJU1RQQVJBTUVURVJJVlNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExJU1RQQVJBTUVURVJGU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElTVFBBUkFNRVRFUkZWU0dJWFBST0MpIChHTHVpbnQgbGlzdCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSSVNHSVhQUk9DKSAoR0x1aW50IGxpc3QsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xMSVNUUEFSQU1FVEVSSVZTR0lYUFJPQykgKEdMdWludCBsaXN0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9pcl9pbnN0cnVtZW50MQorI2RlZmluZSBHTF9TR0lYX2lyX2luc3RydW1lbnQxIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfY2FsbGlncmFwaGljX2ZyYWdtZW50CisjZGVmaW5lIEdMX1NHSVhfY2FsbGlncmFwaGljX2ZyYWdtZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfbG9kX2JpYXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9zaGFkb3dfYW1iaWVudAorI2RlZmluZSBHTF9TR0lYX3NoYWRvd19hbWJpZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF90ZXh0dXJlCisjZGVmaW5lIEdMX0VYVF9pbmRleF90ZXh0dXJlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9pbmRleF9tYXRlcmlhbAorI2RlZmluZSBHTF9FWFRfaW5kZXhfbWF0ZXJpYWwgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbmRleE1hdGVyaWFsRVhUIChHTGVudW0sIEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWE1BVEVSSUFMRVhUUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfZnVuYworI2RlZmluZSBHTF9FWFRfaW5kZXhfZnVuYyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4RnVuY0VYVCAoR0xlbnVtLCBHTGNsYW1wZik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWEZVTkNFWFRQUk9DKSAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cworI2RlZmluZSBHTF9FWFRfaW5kZXhfYXJyYXlfZm9ybWF0cyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY29tcGlsZWRfdmVydGV4X2FycmF5CisjZGVmaW5lIEdMX0VYVF9jb21waWxlZF92ZXJ0ZXhfYXJyYXkgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2NrQXJyYXlzRVhUIChHTGludCwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVW5sb2NrQXJyYXlzRVhUICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTExPQ0tBUlJBWVNFWFRQUk9DKSAoR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTkxPQ0tBUlJBWVNFWFRQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgR0xfRVhUX2N1bGxfdmVydGV4IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbFBhcmFtZXRlcmR2RVhUIChHTGVudW0sIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEN1bGxQYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ1VMTFBBUkFNRVRFUkRWRVhUUFJPQykgKEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENVTExQQVJBTUVURVJGVkVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3ljcmNiCisjZGVmaW5lIEdMX1NHSVhfeWNyY2IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mcmFnbWVudF9saWdodGluZworI2RlZmluZSBHTF9TR0lYX2ZyYWdtZW50X2xpZ2h0aW5nIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRDb2xvck1hdGVyaWFsU0dJWCAoR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRmU0dJWCAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRmdlNHSVggKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRpU0dJWCAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudExpZ2h0aXZTR0lYIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsZlNHSVggKEdMZW51bSwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsZnZTR0lYIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRMaWdodE1vZGVsaVNHSVggKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYWdtZW50TGlnaHRNb2RlbGl2U0dJWCAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsZlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsZnZTR0lYIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFnbWVudE1hdGVyaWFsaVNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhZ21lbnRNYXRlcmlhbGl2U0dJWCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TGlnaHRmdlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYWdtZW50TGlnaHRpdlNHSVggKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudE1hdGVyaWFsZnZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGcmFnbWVudE1hdGVyaWFsaXZTR0lYIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRFbnZpU0dJWCAoR0xlbnVtLCBHTGludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVENPTE9STUFURVJJQUxTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gbW9kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRGU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRGVlNHSVhQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRJU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVExJR0hUSVZTR0lYUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMRlNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMRlZTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRMSUdIVE1PREVMSVNHSVhQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTElHSFRNT0RFTElWU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFHTUVOVE1BVEVSSUFMRlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQUdNRU5UTUFURVJJQUxGVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTElTR0lYUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBR01FTlRNQVRFUklBTElWU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRMSUdIVEZWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRMSUdIVElWU0dJWFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQUdNRU5UTUFURVJJQUxGVlNHSVhQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VURlJBR01FTlRNQVRFUklBTElWU0dJWFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTElHSFRFTlZJU0dJWFBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9yYXN0ZXJwb3NfY2xpcAorI2RlZmluZSBHTF9JQk1fcmFzdGVycG9zX2NsaXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSFBfdGV4dHVyZV9saWdodGluZworI2RlZmluZSBHTF9IUF90ZXh0dXJlX2xpZ2h0aW5nIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9kcmF3X3JhbmdlX2VsZW1lbnRzCisjZGVmaW5lIEdMX0VYVF9kcmF3X3JhbmdlX2VsZW1lbnRzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHNFWFQgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMc2l6ZWksIEdMZW51bSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVFNFWFRQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9XSU5fcGhvbmdfc2hhZGluZworI2RlZmluZSBHTF9XSU5fcGhvbmdfc2hhZGluZyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9XSU5fc3BlY3VsYXJfZm9nCisjZGVmaW5lIEdMX1dJTl9zcGVjdWxhcl9mb2cgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2xpZ2h0X3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX2xpZ2h0X3RleHR1cmUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBcHBseVRleHR1cmVFWFQgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUxpZ2h0RVhUIChHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleHR1cmVNYXRlcmlhbEVYVCAoR0xlbnVtLCBHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVBQTFlURVhUVVJFRVhUUFJPQykgKEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYVFVSRUxJR0hURVhUUFJPQykgKEdMZW51bSBwbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVNQVRFUklBTEVYVFBST0MpIChHTGVudW0gZmFjZSwgR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXgKKyNkZWZpbmUgR0xfU0dJWF9ibGVuZF9hbHBoYV9taW5tYXggMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JncmEKKyNkZWZpbmUgR0xfRVhUX2JncmEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9hc3luYworI2RlZmluZSBHTF9TR0lYX2FzeW5jIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQXN5bmNNYXJrZXJTR0lYIChHTHVpbnQpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xGaW5pc2hBc3luY1NHSVggKEdMdWludCAqKTsKK0dMQVBJIEdMaW50IEFQSUVOVFJZIGdsUG9sbEFzeW5jU0dJWCAoR0x1aW50ICopOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuQXN5bmNNYXJrZXJzU0dJWCAoR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlQXN5bmNNYXJrZXJzU0dJWCAoR0x1aW50LCBHTHNpemVpKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzQXN5bmNNYXJrZXJTR0lYIChHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQVNZTkNNQVJLRVJTR0lYUFJPQykgKEdMdWludCBtYXJrZXIpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMRklOSVNIQVNZTkNTR0lYUFJPQykgKEdMdWludCAqbWFya2VycCk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xQT0xMQVNZTkNTR0lYUFJPQykgKEdMdWludCAqbWFya2VycCk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMR0VOQVNZTkNNQVJLRVJTU0dJWFBST0MpIChHTHNpemVpIHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFQVNZTkNNQVJLRVJTU0dJWFBST0MpIChHTHVpbnQgbWFya2VyLCBHTHNpemVpIHJhbmdlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0FTWU5DTUFSS0VSU0dJWFBST0MpIChHTHVpbnQgbWFya2VyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfYXN5bmNfcGl4ZWwKKyNkZWZpbmUgR0xfU0dJWF9hc3luY19waXhlbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbQorI2RlZmluZSBHTF9TR0lYX2FzeW5jX2hpc3RvZ3JhbSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9JTlRFTF9wYXJhbGxlbF9hcnJheXMKKyNkZWZpbmUgR0xfSU5URUxfcGFyYWxsZWxfYXJyYXlzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlcnZJTlRFTCAoR0xpbnQsIEdMZW51bSwgY29uc3QgR0x2b2lkKiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVydklOVEVMIChHTGVudW0sIGNvbnN0IEdMdm9pZCogKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVydklOVEVMIChHTGludCwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkUG9pbnRlcnZJTlRFTCAoR0xpbnQsIEdMZW51bSwgY29uc3QgR0x2b2lkKiAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFBPSU5URVJWSU5URUxQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxQT0lOVEVSVklOVEVMUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1JQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkRQT0lOVEVSVklOVEVMUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0hQX29jY2x1c2lvbl90ZXN0CisjZGVmaW5lIEdMX0hQX29jY2x1c2lvbl90ZXN0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9waXhlbF90cmFuc2Zvcm0KKyNkZWZpbmUgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsVHJhbnNmb3JtUGFyYW1ldGVyaUVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcmZFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFRyYW5zZm9ybVBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUGl4ZWxUcmFuc2Zvcm1QYXJhbWV0ZXJmdkVYVCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUklFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVFJBTlNGT1JNUEFSQU1FVEVSRkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQSVhFTFRSQU5TRk9STVBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMVFJBTlNGT1JNUEFSQU1FVEVSRlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3BpeGVsX3RyYW5zZm9ybV9jb2xvcl90YWJsZQorI2RlZmluZSBHTF9FWFRfcGl4ZWxfdHJhbnNmb3JtX2NvbG9yX3RhYmxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zaGFyZWRfdGV4dHVyZV9wYWxldHRlCisjZGVmaW5lIEdMX0VYVF9zaGFyZWRfdGV4dHVyZV9wYWxldHRlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zZXBhcmF0ZV9zcGVjdWxhcl9jb2xvcgorI2RlZmluZSBHTF9FWFRfc2VwYXJhdGVfc3BlY3VsYXJfY29sb3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NlY29uZGFyeV9jb2xvcgorI2RlZmluZSBHTF9FWFRfc2Vjb25kYXJ5X2NvbG9yIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYkVYVCAoR0xieXRlLCBHTGJ5dGUsIEdMYnl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkRVhUIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNkdkVYVCAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZkVYVCAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzZnZFWFQgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaUVYVCAoR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzaXZFWFQgKGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3NFWFQgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3N2RVhUIChjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3ViRVhUIChHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1YnZFWFQgKGNvbnN0IEdMdWJ5dGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2Vjb25kYXJ5Q29sb3IzdWlFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VpdkVYVCAoY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM3VzRVhUIChHTHVzaG9ydCwgR0x1c2hvcnQsIEdMdXNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjN1c3ZFWFQgKGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yUG9pbnRlckVYVCAoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQkVYVFBST0MpIChHTGJ5dGUgcmVkLCBHTGJ5dGUgZ3JlZW4sIEdMYnl0ZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzQlZFWFRQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzREVYVFBST0MpIChHTGRvdWJsZSByZWQsIEdMZG91YmxlIGdyZWVuLCBHTGRvdWJsZSBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzRFZFWFRQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGRVhUUFJPQykgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSUVYVFBST0MpIChHTGludCByZWQsIEdMaW50IGdyZWVuLCBHTGludCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSVZFWFRQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTRVhUUFJPQykgKEdMc2hvcnQgcmVkLCBHTHNob3J0IGdyZWVuLCBHTHNob3J0IGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNTVkVYVFBST0MpIChjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUJFWFRQUk9DKSAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VCVkVYVFBST0MpIChjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVUlFWFRQUk9DKSAoR0x1aW50IHJlZCwgR0x1aW50IGdyZWVuLCBHTHVpbnQgYmx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM1VJVkVYVFBST0MpIChjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRUNPTkRBUllDT0xPUjNVU0VYVFBST0MpIChHTHVzaG9ydCByZWQsIEdMdXNob3J0IGdyZWVuLCBHTHVzaG9ydCBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzVVNWRVhUUFJPQykgKGNvbnN0IEdMdXNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSRVhUUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3BlcnR1cmJfbm9ybWFsCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3BlcnR1cmJfbm9ybWFsIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZU5vcm1hbEVYVCAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFRVUkVOT1JNQUxFWFRQUk9DKSAoR0xlbnVtIG1vZGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzCisjZGVmaW5lIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0FycmF5c0VYVCAoR0xlbnVtLCBHTGludCAqLCBHTHNpemVpICosIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUIChHTGVudW0sIGNvbnN0IEdMc2l6ZWkgKiwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICosIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mb2dfY29vcmQKKyNkZWZpbmUgR0xfRVhUX2ZvZ19jb29yZCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkZkVYVCAoR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGRFWFQgKEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZGR2RVhUIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dDb29yZFBvaW50ZXJFWFQgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRGRVhUUFJPQykgKEdMZmxvYXQgY29vcmQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKmNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRERVhUUFJPQykgKEdMZG91YmxlIGNvb3JkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkREVkVYVFBST0MpIChjb25zdCBHTGRvdWJsZSAqY29vcmQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SRFBPSU5URVJFWFRQUk9DKSAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfUkVORF9zY3JlZW5fY29vcmRpbmF0ZXMKKyNkZWZpbmUgR0xfUkVORF9zY3JlZW5fY29vcmRpbmF0ZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUKKyNkZWZpbmUgR0xfRVhUX2Nvb3JkaW5hdGVfZnJhbWUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2JFWFQgKEdMYnl0ZSwgR0xieXRlLCBHTGJ5dGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzYnZFWFQgKGNvbnN0IEdMYnl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2RFWFQgKEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZHZFWFQgKGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzZkVYVCAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUYW5nZW50M2lFWFQgKEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzaXZFWFQgKGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRhbmdlbnQzc0VYVCAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudDNzdkVYVCAoY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNiRVhUIChHTGJ5dGUsIEdMYnl0ZSwgR0xieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNidkVYVCAoY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2RFWFQgKEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsM2R2RVhUIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNmRVhUIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNpRVhUIChHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5vcm1hbDNpdkVYVCAoY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzc0VYVCAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmlub3JtYWwzc3ZFWFQgKGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGFuZ2VudFBvaW50ZXJFWFQgKEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbm9ybWFsUG9pbnRlckVYVCAoR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0JFWFRQUk9DKSAoR0xieXRlIHR4LCBHTGJ5dGUgdHksIEdMYnl0ZSB0eik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzQlZFWFRQUk9DKSAoY29uc3QgR0xieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNERVhUUFJPQykgKEdMZG91YmxlIHR4LCBHTGRvdWJsZSB0eSwgR0xkb3VibGUgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEFOR0VOVDNGRVhUUFJPQykgKEdMZmxvYXQgdHgsIEdMZmxvYXQgdHksIEdMZmxvYXQgdHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0ZWRVhUUFJPQykgKGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM0lFWFRQUk9DKSAoR0xpbnQgdHgsIEdMaW50IHR5LCBHTGludCB0eik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzSVZFWFRQUk9DKSAoY29uc3QgR0xpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUQU5HRU5UM1NFWFRQUk9DKSAoR0xzaG9ydCB0eCwgR0xzaG9ydCB0eSwgR0xzaG9ydCB0eik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlQzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0JFWFRQUk9DKSAoR0xieXRlIGJ4LCBHTGJ5dGUgYnksIEdMYnl0ZSBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0JWRVhUUFJPQykgKGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0RFWFRQUk9DKSAoR0xkb3VibGUgYngsIEdMZG91YmxlIGJ5LCBHTGRvdWJsZSBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0RWRVhUUFJPQykgKGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzRkVYVFBST0MpIChHTGZsb2F0IGJ4LCBHTGZsb2F0IGJ5LCBHTGZsb2F0IGJ6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzRlZFWFRQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0lFWFRQUk9DKSAoR0xpbnQgYngsIEdMaW50IGJ5LCBHTGludCBieik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTk9STUFMM0lWRVhUUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzU0VYVFBST0MpIChHTHNob3J0IGJ4LCBHTHNob3J0IGJ5LCBHTHNob3J0IGJ6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUwzU1ZFWFRQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRBTkdFTlRQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOT1JNQUxQT0lOVEVSRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Vudl9jb21iaW5lCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Vudl9jb21iaW5lIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX3NwZWN1bGFyX3ZlY3RvcgorI2RlZmluZSBHTF9BUFBMRV9zcGVjdWxhcl92ZWN0b3IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdHJhbnNmb3JtX2hpbnQKKyNkZWZpbmUgR0xfQVBQTEVfdHJhbnNmb3JtX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9mb2dfc2NhbGUKKyNkZWZpbmUgR0xfU0dJWF9mb2dfc2NhbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOWF9jb25zdGFudF9kYXRhCisjZGVmaW5lIEdMX1NVTlhfY29uc3RhbnRfZGF0YSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaFRleHR1cmVTVU5YICh2b2lkKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSFRFWFRVUkVTVU5YUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX2dsb2JhbF9hbHBoYQorI2RlZmluZSBHTF9TVU5fZ2xvYmFsX2FscGhhIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JiU1VOIChHTGJ5dGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdsb2JhbEFscGhhRmFjdG9yc1NVTiAoR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JpU1VOIChHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3JmU1VOIChHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcmRTVU4gKEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnViU1VOIChHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHbG9iYWxBbHBoYUZhY3RvcnVzU1VOIChHTHVzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2xvYmFsQWxwaGFGYWN0b3J1aVNVTiAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SQlNVTlBST0MpIChHTGJ5dGUgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JTU1VOUFJPQykgKEdMc2hvcnQgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JJU1VOUFJPQykgKEdMaW50IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SRlNVTlBST0MpIChHTGZsb2F0IGZhY3Rvcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdMT0JBTEFMUEhBRkFDVE9SRFNVTlBST0MpIChHTGRvdWJsZSBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVCU1VOUFJPQykgKEdMdWJ5dGUgZmFjdG9yKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0xPQkFMQUxQSEFGQUNUT1JVU1NVTlBST0MpIChHTHVzaG9ydCBmYWN0b3IpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHTE9CQUxBTFBIQUZBQ1RPUlVJU1VOUFJPQykgKEdMdWludCBmYWN0b3IpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU1VOX3RyaWFuZ2xlX2xpc3QKKyNkZWZpbmUgR0xfU1VOX3RyaWFuZ2xlX2xpc3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVNVTiAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1c1NVTiAoR0x1c2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXViU1VOIChHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aXZTVU4gKGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1c3ZTVU4gKGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVidlNVTiAoY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGVQb2ludGVyU1VOIChHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCogKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVNVTlBST0MpIChHTHVpbnQgY29kZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVTU1VOUFJPQykgKEdMdXNob3J0IGNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVQlNVTlBST0MpIChHTHVieXRlIGNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVVNWU1VOUFJPQykgKGNvbnN0IEdMdXNob3J0ICpjb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUJWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmNvZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVQT0lOVEVSU1VOUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fdmVydGV4CisjZGVmaW5lIEdMX1NVTl92ZXJ0ZXggMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDJmU1VOIChHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR1YlZlcnRleDJmdlNVTiAoY29uc3QgR0x1Ynl0ZSAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHViVmVydGV4M2ZTVU4gKEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMdWJ5dGUsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yNHViVmVydGV4M2Z2U1VOIChjb25zdCBHTHVieXRlICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRmVmVydGV4NGZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZWZXJ0ZXg0ZnZTVU4gKGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0dWJWZXJ0ZXgzZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNHViVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3IzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyZkNvbG9yNGZOb3JtYWwzZlZlcnRleDNmU1VOIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleENvb3JkNGZDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXg0ZlNVTiAoR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQ0ZkNvbG9yNGZOb3JtYWwzZlZlcnRleDRmdlNVTiAoY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNHViVmVydGV4M2ZTVU4gKEdMdWludCwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0x1Ynl0ZSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjR1YlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpTm9ybWFsM2ZWZXJ0ZXgzZnZTVU4gKGNvbnN0IEdMdWludCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlDb2xvcjRmTm9ybWFsM2ZWZXJ0ZXgzZlNVTiAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aUNvbG9yNGZOb3JtYWwzZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZlZlcnRleDNmdlNVTiAoY29uc3QgR0x1aW50ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXBsYWNlbWVudENvZGV1aVRleENvb3JkMmZOb3JtYWwzZlZlcnRleDNmU1VOIChHTHVpbnQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcGxhY2VtZW50Q29kZXVpVGV4Q29vcmQyZk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2ZTVU4gKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVwbGFjZW1lbnRDb2RldWlUZXhDb29yZDJmQ29sb3I0Zk5vcm1hbDNmVmVydGV4M2Z2U1VOIChjb25zdCBHTHVpbnQgKiwgY29uc3QgR0xmbG9hdCAqLCBjb25zdCBHTGZsb2F0ICosIGNvbnN0IEdMZmxvYXQgKiwgY29uc3QgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYMkZTVU5QUk9DKSAoR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYMkZWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRVQlZFUlRFWDNGU1VOUFJPQykgKEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SNFVCVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWJ5dGUgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqbiwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZWRVJURVgzRlNVTlBST0MpIChHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGVkVSVEVYNEZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgcCwgR0xmbG9hdCBxLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGVkVSVEVYNEZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNFVCVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMdWJ5dGUgciwgR0x1Ynl0ZSBnLCBHTHVieXRlIGIsIEdMdWJ5dGUgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjRVQlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0x1Ynl0ZSAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZDT0xPUjNGVkVSVEVYM0ZTVU5QUk9DKSAoR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1IzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTGZsb2F0ICp0YywgY29uc3QgR0xmbG9hdCAqYywgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQyRkNPTE9SNEZOT1JNQUwzRlZFUlRFWDNGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDJGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0RkNPTE9SNEZOT1JNQUwzRlZFUlRFWDRGU1VOUFJPQykgKEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHAsIEdMZmxvYXQgcSwgR0xmbG9hdCByLCBHTGZsb2F0IGcsIEdMZmxvYXQgYiwgR0xmbG9hdCBhLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhDT09SRDRGQ09MT1I0Rk5PUk1BTDNGVkVSVEVYNEZWU1VOUFJPQykgKGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICpjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRVQlZFUlRFWDNGU1VOUFJPQykgKEdMdWludCByYywgR0x1Ynl0ZSByLCBHTHVieXRlIGcsIEdMdWJ5dGUgYiwgR0x1Ynl0ZSBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRVQlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTHVieXRlICpjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSU5PUk1BTDNGVkVSVEVYM0ZTVU5QUk9DKSAoR0x1aW50IHJjLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlOT1JNQUwzRlZFUlRFWDNGVlNVTlBST0MpIChjb25zdCBHTHVpbnQgKnJjLCBjb25zdCBHTGZsb2F0ICpuLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFUExBQ0VNRU5UQ09ERVVJQ09MT1I0Rk5PUk1BTDNGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGVkVSVEVYM0ZWU1VOUFJPQykgKGNvbnN0IEdMdWludCAqcmMsIGNvbnN0IEdMZmxvYXQgKnRjLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVQTEFDRU1FTlRDT0RFVUlURVhDT09SRDJGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlNVTlBST0MpIChHTHVpbnQgcmMsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgZywgR0xmbG9hdCBiLCBHTGZsb2F0IGEsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnosIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVBMQUNFTUVOVENPREVVSVRFWENPT1JEMkZDT0xPUjRGTk9STUFMM0ZWRVJURVgzRlZTVU5QUk9DKSAoY29uc3QgR0x1aW50ICpyYywgY29uc3QgR0xmbG9hdCAqdGMsIGNvbnN0IEdMZmxvYXQgKmMsIGNvbnN0IEdMZmxvYXQgKm4sIGNvbnN0IEdMZmxvYXQgKnYpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZUVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFRVhUUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX2JsZW5kX2Z1bmNfc2VwYXJhdGUKKyNkZWZpbmUgR0xfSU5HUl9ibGVuZF9mdW5jX3NlcGFyYXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVJTkdSIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DU0VQQVJBVEVJTkdSUFJPQykgKEdMZW51bSBzZmFjdG9yUkdCLCBHTGVudW0gZGZhY3RvclJHQiwgR0xlbnVtIHNmYWN0b3JBbHBoYSwgR0xlbnVtIGRmYWN0b3JBbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JTkdSX2NvbG9yX2NsYW1wCisjZGVmaW5lIEdMX0lOR1JfY29sb3JfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfSU5HUl9pbnRlcmxhY2VfcmVhZAorI2RlZmluZSBHTF9JTkdSX2ludGVybGFjZV9yZWFkIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3dyYXAKKyNkZWZpbmUgR0xfRVhUX3N0ZW5jaWxfd3JhcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfNDIyX3BpeGVscworI2RlZmluZSBHTF9FWFRfNDIyX3BpeGVscyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXhnZW5fcmVmbGVjdGlvbgorI2RlZmluZSBHTF9OVl90ZXhnZW5fcmVmbGVjdGlvbiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TVU5fY29udm9sdXRpb25fYm9yZGVyX21vZGVzCisjZGVmaW5lIEdMX1NVTl9jb252b2x1dGlvbl9ib3JkZXJfbW9kZXMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2FkZAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9lbnZfYWRkIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2xvZF9iaWFzCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2xvZF9iaWFzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcKKyNkZWZpbmUgR0xfRVhUX3ZlcnRleF93ZWlnaHRpbmcgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRmRVhUIChHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRmdkVYVCAoY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhXZWlnaHRQb2ludGVyRVhUIChHTHNpemVpLCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEZFWFRQUk9DKSAoR0xmbG9hdCB3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRGVkVYVFBST0MpIChjb25zdCBHTGZsb2F0ICp3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRQT0lOVEVSRVhUUFJPQykgKEdMc2l6ZWkgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfbGlnaHRfbWF4X2V4cG9uZW50CisjZGVmaW5lIEdMX05WX2xpZ2h0X21heF9leHBvbmVudCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UKKyNkZWZpbmUgR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2hWZXJ0ZXhBcnJheVJhbmdlTlYgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UmFuZ2VOViAoR0xzaXplaSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRkxVU0hWRVJURVhBUlJBWVJBTkdFTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFSUkFZUkFOR0VOVlBST0MpIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVycworI2RlZmluZSBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcmZOViAoR0xlbnVtLCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclBhcmFtZXRlcml2TlYgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJQYXJhbWV0ZXJpTlYgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbWJpbmVySW5wdXROViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tYmluZXJPdXRwdXROViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGJvb2xlYW4sIEdMYm9vbGVhbiwgR0xib29sZWFuKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5hbENvbWJpbmVySW5wdXROViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lcklucHV0UGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVySW5wdXRQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldENvbWJpbmVyT3V0cHV0UGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRDb21iaW5lck91dHB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZpbmFsQ29tYmluZXJJbnB1dFBhcmFtZXRlcml2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSRk5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTUJJTkVSUEFSQU1FVEVSSVZOVlBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT01CSU5FUlBBUkFNRVRFUklOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJJTlBVVE5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJPVVRQVVROVlBST0MpIChHTGVudW0gc3RhZ2UsIEdMZW51bSBwb3J0aW9uLCBHTGVudW0gYWJPdXRwdXQsIEdMZW51bSBjZE91dHB1dCwgR0xlbnVtIHN1bU91dHB1dCwgR0xlbnVtIHNjYWxlLCBHTGVudW0gYmlhcywgR0xib29sZWFuIGFiRG90UHJvZHVjdCwgR0xib29sZWFuIGNkRG90UHJvZHVjdCwgR0xib29sZWFuIG11eFN1bSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTkFMQ09NQklORVJJTlBVVE5WUFJPQykgKEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIGlucHV0LCBHTGVudW0gbWFwcGluZywgR0xlbnVtIGNvbXBvbmVudFVzYWdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJJTlBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG9ydGlvbiwgR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSSU5QVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSB2YXJpYWJsZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJPVVRQVVRQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUQ09NQklORVJPVVRQVVRQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBvcnRpb24sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZJTkFMQ09NQklORVJJTlBVVFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZJTkFMQ09NQklORVJJTlBVVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHZhcmlhYmxlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZm9nX2Rpc3RhbmNlCisjZGVmaW5lIEdMX05WX2ZvZ19kaXN0YW5jZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXhnZW5fZW1ib3NzCisjZGVmaW5lIEdMX05WX3RleGdlbl9lbWJvc3MgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfYmxlbmRfc3F1YXJlCisjZGVmaW5lIEdMX05WX2JsZW5kX3NxdWFyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNAorI2RlZmluZSBHTF9OVl90ZXh0dXJlX2Vudl9jb21iaW5lNCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBX3Jlc2l6ZV9idWZmZXJzCisjZGVmaW5lIEdMX01FU0FfcmVzaXplX2J1ZmZlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZXNpemVCdWZmZXJzTUVTQSAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVNJWkVCVUZGRVJTTUVTQVBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0Ffd2luZG93X3BvcworI2RlZmluZSBHTF9NRVNBX3dpbmRvd19wb3MgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZE1FU0EgKEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmR2TUVTQSAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zMmZNRVNBIChHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyZnZNRVNBIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJpTUVTQSAoR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MyaXZNRVNBIChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Myc01FU0EgKEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczJzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2RNRVNBIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZHZNRVNBIChjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzZk1FU0EgKEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNmdk1FU0EgKGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zM2lNRVNBIChHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3MzaXZNRVNBIChjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3Mzc01FU0EgKEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczNzdk1FU0EgKGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGRNRVNBIChHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGR2TUVTQSAoY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNGZNRVNBIChHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xXaW5kb3dQb3M0ZnZNRVNBIChjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRpTUVTQSAoR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRpdk1FU0EgKGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFdpbmRvd1BvczRzTUVTQSAoR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV2luZG93UG9zNHN2TUVTQSAoY29uc3QgR0xzaG9ydCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMkRWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJGVk1FU0FQUk9DKSAoY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJJTUVTQVBST0MpIChHTGludCB4LCBHTGludCB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TMklWTUVTQVBST0MpIChjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTTUVTQVBST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzJTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNETUVTQVBST0MpIChHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0RWTUVTQVBST0MpIChjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzNGTUVTQVBST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0ZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM0lNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzSVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TM1NNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1MzU1ZNRVNBUFJPQykgKGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0RE1FU0FQUk9DKSAoR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzREVk1FU0FQUk9DKSAoY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0Rk1FU0FQUk9DKSAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNEZWTUVTQVBST0MpIChjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNElNRVNBUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xXSU5ET1dQT1M0SVZNRVNBUFJPQykgKGNvbnN0IEdMaW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMV0lORE9XUE9TNFNNRVNBUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdJTkRPV1BPUzRTVk1FU0FQUk9DKSAoY29uc3QgR0xzaG9ydCAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9JQk1fY3VsbF92ZXJ0ZXgKKyNkZWZpbmUgR0xfSUJNX2N1bGxfdmVydGV4IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV9tdWx0aW1vZGVfZHJhd19hcnJheXMKKyNkZWZpbmUgR0xfSUJNX211bHRpbW9kZV9kcmF3X2FycmF5cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpTW9kZURyYXdBcnJheXNJQk0gKGNvbnN0IEdMZW51bSAqLCBjb25zdCBHTGludCAqLCBjb25zdCBHTHNpemVpICosIEdMc2l6ZWksIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aU1vZGVEcmF3RWxlbWVudHNJQk0gKGNvbnN0IEdMZW51bSAqLCBjb25zdCBHTHNpemVpICosIEdMZW51bSwgY29uc3QgR0x2b2lkKiBjb25zdCAqLCBHTHNpemVpLCBHTGludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSU1PREVEUkFXQVJSQVlTSUJNUFJPQykgKGNvbnN0IEdMZW51bSAqbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQsIEdMaW50IG1vZGVzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSU1PREVEUkFXRUxFTUVOVFNJQk1QUk9DKSAoY29uc3QgR0xlbnVtICptb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogY29uc3QgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50LCBHTGludCBtb2Rlc3RyaWRlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0lCTV92ZXJ0ZXhfYXJyYXlfbGlzdHMKKyNkZWZpbmUgR0xfSUJNX3ZlcnRleF9hcnJheV9saXN0cyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlckxpc3RJQk0gKEdMaW50LCBHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvclBvaW50ZXJMaXN0SUJNIChHTGludCwgR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRWRnZUZsYWdQb2ludGVyTGlzdElCTSAoR0xpbnQsIGNvbnN0IEdMYm9vbGVhbiogKiwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkUG9pbnRlckxpc3RJQk0gKEdMZW51bSwgR0xpbnQsIGNvbnN0IEdMdm9pZCogKiwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEluZGV4UG9pbnRlckxpc3RJQk0gKEdMZW51bSwgR0xpbnQsIGNvbnN0IEdMdm9pZCogKiwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbFBvaW50ZXJMaXN0SUJNIChHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJMaXN0SUJNIChHTGludCwgR0xlbnVtLCBHTGludCwgY29uc3QgR0x2b2lkKiAqLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4UG9pbnRlckxpc3RJQk0gKEdMaW50LCBHTGVudW0sIEdMaW50LCBjb25zdCBHTHZvaWQqICosIEdMaW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1JQT0lOVEVSTElTVElCTVBST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFREdFRkxBR1BPSU5URVJMSVNUSUJNUFJPQykgKEdMaW50IHN0cmlkZSwgY29uc3QgR0xib29sZWFuKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRk9HQ09PUkRQT0lOVEVSTElTVElCTVBST0MpIChHTGVudW0gdHlwZSwgR0xpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQqICpwb2ludGVyLCBHTGludCBwdHJzdHJpZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xJTkRFWFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFBPSU5URVJMSVNUSUJNUFJPQykgKEdMZW51bSB0eXBlLCBHTGludCBzdHJpZGUsIGNvbnN0IEdMdm9pZCogKnBvaW50ZXIsIEdMaW50IHB0cnN0cmlkZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYUE9JTlRFUkxJU1RJQk1QUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMaW50IHN0cmlkZSwgY29uc3QgR0x2b2lkKiAqcG9pbnRlciwgR0xpbnQgcHRyc3RyaWRlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfc3Vic2FtcGxlCisjZGVmaW5lIEdMX1NHSVhfc3Vic2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2JhCisjZGVmaW5lIEdMX1NHSVhfeWNyY2JhIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlCisjZGVmaW5lIEdMX1NHSVhfeWNyY2Jfc3Vic2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfZGVwdGhfcGFzc19pbnN0cnVtZW50CisjZGVmaW5lIEdMX1NHSVhfZGVwdGhfcGFzc19pbnN0cnVtZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxCisjZGVmaW5lIEdMXzNERlhfdGV4dHVyZV9jb21wcmVzc2lvbl9GWFQxIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMXzNERlhfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfM0RGWF9tdWx0aXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF8zREZYX3RidWZmZXIKKyNkZWZpbmUgR0xfM0RGWF90YnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGJ1ZmZlck1hc2szREZYIChHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEJVRkZFUk1BU0szREZYUFJPQykgKEdMdWludCBtYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9FWFRfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVNYXNrRVhUIChHTGNsYW1wZiwgR0xib29sZWFuKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVQYXR0ZXJuRVhUIChHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0FNUExFTUFTS0VYVFBST0MpIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRVBBVFRFUk5FWFRQUk9DKSAoR0xlbnVtIHBhdHRlcm4pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF92ZXJ0ZXhfcHJlY2xpcAorI2RlZmluZSBHTF9TR0lYX3ZlcnRleF9wcmVjbGlwIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVhfY29udm9sdXRpb25fYWNjdXJhY3kKKyNkZWZpbmUgR0xfU0dJWF9jb252b2x1dGlvbl9hY2N1cmFjeSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3Jlc2FtcGxlCisjZGVmaW5lIEdMX1NHSVhfcmVzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJU19wb2ludF9saW5lX3RleGdlbgorI2RlZmluZSBHTF9TR0lTX3BvaW50X2xpbmVfdGV4Z2VuIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrCisjZGVmaW5lIEdMX1NHSVNfdGV4dHVyZV9jb2xvcl9tYXNrIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4dHVyZUNvbG9yTWFza1NHSVMgKEdMYm9vbGVhbiwgR0xib29sZWFuLCBHTGJvb2xlYW4sIEdMYm9vbGVhbik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xURVhUVVJFQ09MT1JNQVNLU0dJU1BST0MpIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfU0dJWF9pZ2xvb19pbnRlcmZhY2UKKyNkZWZpbmUgR0xfU0dJWF9pZ2xvb19pbnRlcmZhY2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJZ2xvb0ludGVyZmFjZVNHSVggKEdMZW51bSwgY29uc3QgR0x2b2lkICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSUdMT09JTlRFUkZBQ0VTR0lYUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0x2b2lkICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZW52X2RvdDMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZW52X2RvdDMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UKKyNkZWZpbmUgR0xfQVRJX3RleHR1cmVfbWlycm9yX29uY2UgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZmVuY2UKKyNkZWZpbmUgR0xfTlZfZmVuY2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbkZlbmNlc05WIChHTHNpemVpLCBHTHVpbnQgKik7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0ZlbmNlTlYgKEdMdWludCk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRGZW5jZWl2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZU5WIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5GRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xURVNURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRGRU5DRUlWTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGSU5JU0hGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2V2YWx1YXRvcnMKKyNkZWZpbmUgR0xfTlZfZXZhbHVhdG9ycyAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hcENvbnRyb2xQb2ludHNOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xpbnQsIEdMaW50LCBHTGJvb2xlYW4sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXBQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWFwUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQ29udHJvbFBvaW50c05WIChHTGVudW0sIEdMdWludCwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpLCBHTGJvb2xlYW4sIEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRNYXBQYXJhbWV0ZXJpdk5WIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQXR0cmliUGFyYW1ldGVyaXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TWFwQXR0cmliUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFdmFsTWFwc05WIChHTGVudW0sIEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNQVBDT05UUk9MUE9JTlRTTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gdHlwZSwgR0xzaXplaSB1c3RyaWRlLCBHTHNpemVpIHZzdHJpZGUsIEdMaW50IHVvcmRlciwgR0xpbnQgdm9yZGVyLCBHTGJvb2xlYW4gcGFja2VkLCBjb25zdCBHTHZvaWQgKnBvaW50cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1BUFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTUFQUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUENPTlRST0xQT0lOVFNOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSB0eXBlLCBHTHNpemVpIHVzdHJpZGUsIEdMc2l6ZWkgdnN0cmlkZSwgR0xib29sZWFuIHBhY2tlZCwgR0x2b2lkICpwb2ludHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVE1BUFBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRNQVBBVFRSSUJQQVJBTUVURVJJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUTUFQQVRUUklCUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVZBTE1BUFNOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbAorI2RlZmluZSBHTF9OVl9wYWNrZWRfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyCisjZGVmaW5lIEdMX05WX3JlZ2lzdGVyX2NvbWJpbmVyczIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21iaW5lclN0YWdlUGFyYW1ldGVyZnZOViAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0Q29tYmluZXJTdGFnZVBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09NQklORVJTVEFHRVBBUkFNRVRFUkZWTlZQUk9DKSAoR0xlbnVtIHN0YWdlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVENPTUJJTkVSU1RBR0VQQVJBTUVURVJGVk5WUFJPQykgKEdMZW51bSBzdGFnZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl92dGMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9yZWN0YW5nbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9zaGFkZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9zaGFkZXIyCisjZGVmaW5lIEdMX05WX3RleHR1cmVfc2hhZGVyMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UyCisjZGVmaW5lIEdMX05WX3ZlcnRleF9hcnJheV9yYW5nZTIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0KKyNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbEFyZVByb2dyYW1zUmVzaWRlbnROViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICosIEdMYm9vbGVhbiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kUHJvZ3JhbU5WIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEV4ZWN1dGVQcm9ncmFtTlYgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlblByb2dyYW1zTlYgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGFyYW1ldGVyZHZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbVBhcmFtZXRlcmZ2TlYgKEdMZW51bSwgR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtU3RyaW5nTlYgKEdMdWludCwgR0xlbnVtLCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRyYWNrTWF0cml4aXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZHZOViAoR0x1aW50LCBHTGVudW0sIEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2TlYgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydk5WIChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUHJvZ3JhbU5WIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRQcm9ncmFtTlYgKEdMZW51bSwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0ZE5WIChHTGVudW0sIEdMdWludCwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0ZHZOViAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXI0Zk5WIChHTGVudW0sIEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcjRmdk5WIChHTGVudW0sIEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyczRkdk5WIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyczRmdk5WIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlcXVlc3RSZXNpZGVudFByb2dyYW1zTlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFja01hdHJpeE5WIChHTGVudW0sIEdMdWludCwgR0xlbnVtLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXJOViAoR0x1aW50LCBHTGludCwgR0xlbnVtLCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWROViAoR0x1aW50LCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWR2TlYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMWZOViAoR0x1aW50LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnZOViAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFzTlYgKEdMdWludCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMXN2TlYgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZE5WIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmR2TlYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZOViAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnZOViAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJzTlYgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliMnN2TlYgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZE5WIChHTHVpbnQsIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNkdk5WIChHTHVpbnQsIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmTlYgKEdMdWludCwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2TlYgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzc05WIChHTHVpbnQsIEdMc2hvcnQsIEdMc2hvcnQsIEdMc2hvcnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNzdk5WIChHTHVpbnQsIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGROViAoR0x1aW50LCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGR2TlYgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNGZOViAoR0x1aW50LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0LCBHTGZsb2F0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnZOViAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRzTlYgKEdMdWludCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliNHN2TlYgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJOViAoR0x1aW50LCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlLCBHTHVieXRlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0dWJ2TlYgKEdMdWludCwgY29uc3QgR0x1Ynl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMWR2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFmdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczFzdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczJkdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyZnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMyc3ZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMzZHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM2Z2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzM3N2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzNGR2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRmdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczRzdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczR1YnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xBUkVQUk9HUkFNU1JFU0lERU5UTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zLCBHTGJvb2xlYW4gKnJlc2lkZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EUFJPR1JBTU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVBST0dSQU1TTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnByb2dyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRVhFQ1VURVBST0dSQU1OVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlBST0dSQU1TTlZQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKnByb2dyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBBUkFNRVRFUkRWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUEFSQU1FVEVSRlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUlWTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNU1RSSU5HTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWJ5dGUgKnByb2dyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRUUkFDS01BVFJJWElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZFUlRFWEFUVFJJQkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkVSVEVYQVRUUklCUE9JTlRFUlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqcG9pbnRlcik7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNTlZQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTE9BRFBST0dSQU1OVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjRETlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6LCBHTGRvdWJsZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUjREVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSNEZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVI0RlZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSUzREVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1QQVJBTUVURVJTNEZWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRVFVRVNUUkVTSURFTlRQUk9HUkFNU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwcm9ncmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRSQUNLTUFUUklYTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGFkZHJlc3MsIEdMZW51bSBtYXRyaXgsIEdMZW51bSB0cmFuc2Zvcm0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJQT0lOVEVSTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCBmc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFEVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxRk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMUZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMVNOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCMkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJGVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNob3J0IHgsIEdMc2hvcnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNETlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGRvdWJsZSB4LCBHTGRvdWJsZSB5LCBHTGRvdWJsZSB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0RWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNGTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM0ZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCM1NOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0RE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjREVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0Rk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNEZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFNOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRTVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRVQk5WUFJPQykgKEdMdWludCBpbmRleCwgR0x1Ynl0ZSB4LCBHTHVieXRlIHksIEdMdWJ5dGUgeiwgR0x1Ynl0ZSB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCNFVCVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1Ynl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxRFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzFGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMxU1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMkRWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGRvdWJsZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMyRlZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMlNWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNEVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTM0ZWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzNTVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0RFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZG91YmxlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzRGVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlM0U1ZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMc2hvcnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNFVCVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1Ynl0ZSAqdik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcAorI2RlZmluZSBHTF9TR0lYX3RleHR1cmVfY29vcmRpbmF0ZV9jbGFtcCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9TR0lYX3NjYWxlYmlhc19oaW50CisjZGVmaW5lIEdMX1NHSVhfc2NhbGViaWFzX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfT01MX2ludGVybGFjZQorI2RlZmluZSBHTF9PTUxfaW50ZXJsYWNlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX09NTF9zdWJzYW1wbGUKKyNkZWZpbmUgR0xfT01MX3N1YnNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9PTUxfcmVzYW1wbGUKKyNkZWZpbmUgR0xfT01MX3Jlc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2NvcHlfZGVwdGhfdG9fY29sb3IKKyNkZWZpbmUgR0xfTlZfY29weV9kZXB0aF90b19jb2xvciAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfZW52bWFwX2J1bXBtYXAKKyNkZWZpbmUgR0xfQVRJX2Vudm1hcF9idW1wbWFwIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVtcFBhcmFtZXRlcml2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEJ1bXBQYXJhbWV0ZXJmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFRleEJ1bXBQYXJhbWV0ZXJpdkFUSSAoR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUZXhCdW1wUGFyYW1ldGVyZnZBVEkgKEdMZW51bSwgR0xmbG9hdCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVTVBQQVJBTUVURVJJVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVTVBQQVJBTUVURVJGVkFUSVBST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYQlVNUFBBUkFNRVRFUklWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVEVYQlVNUFBBUkFNRVRFUkZWQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX2ZyYWdtZW50X3NoYWRlcgorI2RlZmluZSBHTF9BVElfZnJhZ21lbnRfc2hhZGVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xHZW5GcmFnbWVudFNoYWRlcnNBVEkgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZEZyYWdtZW50U2hhZGVyQVRJIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZUZyYWdtZW50U2hhZGVyQVRJIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luRnJhZ21lbnRTaGFkZXJBVEkgKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuZEZyYWdtZW50U2hhZGVyQVRJICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQYXNzVGV4Q29vcmRBVEkgKEdMdWludCwgR0x1aW50LCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZU1hcEFUSSAoR0x1aW50LCBHTHVpbnQsIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JGcmFnbWVudE9wMUFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvckZyYWdtZW50T3AyQVRJIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yRnJhZ21lbnRPcDNBVEkgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wMUFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wMkFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGcmFnbWVudE9wM0FUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0RnJhZ21lbnRTaGFkZXJDb25zdGFudEFUSSAoR0x1aW50LCBjb25zdCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xHRU5GUkFHTUVOVFNIQURFUlNBVElQUk9DKSAoR0x1aW50IHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREZSQUdNRU5UU0hBREVSQVRJUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZSQUdNRU5UU0hBREVSQVRJUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lORlJBR01FTlRTSEFERVJBVElQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVOREZSQUdNRU5UU0hBREVSQVRJUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQQVNTVEVYQ09PUkRBVElQUk9DKSAoR0x1aW50IGRzdCwgR0x1aW50IGNvb3JkLCBHTGVudW0gc3dpenpsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNBTVBMRU1BUEFUSVBST0MpIChHTHVpbnQgZHN0LCBHTHVpbnQgaW50ZXJwLCBHTGVudW0gc3dpenpsZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDFBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDJBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9SRlJBR01FTlRPUDNBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TWFzaywgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEFMUEhBRlJBR01FTlRPUDFBVElQUk9DKSAoR0xlbnVtIG9wLCBHTHVpbnQgZHN0LCBHTHVpbnQgZHN0TW9kLCBHTHVpbnQgYXJnMSwgR0x1aW50IGFyZzFSZXAsIEdMdWludCBhcmcxTW9kKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUxQSEFGUkFHTUVOVE9QMkFUSVBST0MpIChHTGVudW0gb3AsIEdMdWludCBkc3QsIEdMdWludCBkc3RNb2QsIEdMdWludCBhcmcxLCBHTHVpbnQgYXJnMVJlcCwgR0x1aW50IGFyZzFNb2QsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMlJlcCwgR0x1aW50IGFyZzJNb2QpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBTFBIQUZSQUdNRU5UT1AzQVRJUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IGRzdCwgR0x1aW50IGRzdE1vZCwgR0x1aW50IGFyZzEsIEdMdWludCBhcmcxUmVwLCBHTHVpbnQgYXJnMU1vZCwgR0x1aW50IGFyZzIsIEdMdWludCBhcmcyUmVwLCBHTHVpbnQgYXJnMk1vZCwgR0x1aW50IGFyZzMsIEdMdWludCBhcmczUmVwLCBHTHVpbnQgYXJnM01vZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFVEZSQUdNRU5UU0hBREVSQ09OU1RBTlRBVElQUk9DKSAoR0x1aW50IGRzdCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BuX3RyaWFuZ2xlcworI2RlZmluZSBHTF9BVElfcG5fdHJpYW5nbGVzIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUE5UcmlhbmdsZXNpQVRJIChHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQTlRyaWFuZ2xlc2ZBVEkgKEdMZW51bSwgR0xmbG9hdCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQTlRSSUFOR0xFU0lBVElQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBOVFJJQU5HTEVTRkFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QKKyNkZWZpbmUgR0xfQVRJX3ZlcnRleF9hcnJheV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbE5ld09iamVjdEJ1ZmZlckFUSSAoR0xzaXplaSwgY29uc3QgR0x2b2lkICosIEdMZW51bSk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc09iamVjdEJ1ZmZlckFUSSAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVcGRhdGVPYmplY3RCdWZmZXJBVEkgKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHZvaWQgKiwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPYmplY3RCdWZmZXJmdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0T2JqZWN0QnVmZmVyaXZBVEkgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmVlT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFycmF5T2JqZWN0QVRJIChHTGVudW0sIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBcnJheU9iamVjdGZ2QVRJIChHTGVudW0sIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBcnJheU9iamVjdGl2QVRJIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudEFycmF5T2JqZWN0QVRJIChHTHVpbnQsIEdMZW51bSwgR0xzaXplaSwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFZhcmlhbnRBcnJheU9iamVjdGZ2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50QXJyYXlPYmplY3RpdkFUSSAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xORVdPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0xzaXplaSBzaXplLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMZW51bSB1c2FnZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNPQkpFQ1RCVUZGRVJBVElQUk9DKSAoR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVQREFURU9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyLCBHTHVpbnQgb2Zmc2V0LCBHTHNpemVpIHNpemUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xlbnVtIHByZXNlcnZlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUT0JKRUNUQlVGRkVSRlZBVElQUk9DKSAoR0x1aW50IGJ1ZmZlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RCVUZGRVJJVkFUSVBST0MpIChHTHVpbnQgYnVmZmVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkVFT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBUlJBWU9CSkVDVEFUSVBST0MpIChHTGVudW0gYXJyYXksIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IGJ1ZmZlciwgR0x1aW50IG9mZnNldCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFSUkFZT0JKRUNURlZBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0xlbnVtIGFycmF5LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UQVJSQVlPQkpFQ1RBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5UQVJSQVlPQkpFQ1RGVkFUSVBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEFSUkFZT0JKRUNUSVZBVElQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3ZlcnRleF9zaGFkZXIKKyNkZWZpbmUgR0xfRVhUX3ZlcnRleF9zaGFkZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblZlcnRleFNoYWRlckVYVCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVmVydGV4U2hhZGVyRVhUICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVmVydGV4U2hhZGVyRVhUIChHTHVpbnQpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuVmVydGV4U2hhZGVyc0VYVCAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhTaGFkZXJFWFQgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AxRVhUIChHTGVudW0sIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZXJPcDJFWFQgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVyT3AzRVhUIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3dpenpsZUVYVCAoR0x1aW50LCBHTHVpbnQsIEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsV3JpdGVNYXNrRVhUIChHTHVpbnQsIEdMdWludCwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xJbnNlcnRDb21wb25lbnRFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEV4dHJhY3RDb21wb25lbnRFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsR2VuU3ltYm9sc0VYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZXRJbnZhcmlhbnRFWFQgKEdMdWludCwgR0xlbnVtLCBjb25zdCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2V0TG9jYWxDb25zdGFudEVYVCAoR0x1aW50LCBHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50YnZFWFQgKEdMdWludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRzdkVYVCAoR0x1aW50LCBjb25zdCBHTHNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnRpdkVYVCAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50ZnZFWFQgKEdMdWludCwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWYXJpYW50ZHZFWFQgKEdMdWludCwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudHVidkVYVCAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZhcmlhbnR1c3ZFWFQgKEdMdWludCwgY29uc3QgR0x1c2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudHVpdkVYVCAoR0x1aW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmFyaWFudFBvaW50ZXJFWFQgKEdMdWludCwgR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVWYXJpYW50Q2xpZW50U3RhdGVFWFQgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZVZhcmlhbnRDbGllbnRTdGF0ZUVYVCAoR0x1aW50KTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRMaWdodFBhcmFtZXRlckVYVCAoR0xlbnVtLCBHTGVudW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZE1hdGVyaWFsUGFyYW1ldGVyRVhUIChHTGVudW0sIEdMZW51bSk7CitHTEFQSSBHTHVpbnQgQVBJRU5UUlkgZ2xCaW5kVGV4R2VuUGFyYW1ldGVyRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtKTsKK0dMQVBJIEdMdWludCBBUElFTlRSWSBnbEJpbmRUZXh0dXJlVW5pdFBhcmFtZXRlckVYVCAoR0xlbnVtLCBHTGVudW0pOworR0xBUEkgR0x1aW50IEFQSUVOVFJZIGdsQmluZFBhcmFtZXRlckVYVCAoR0xlbnVtKTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzVmFyaWFudEVuYWJsZWRFWFQgKEdMdWludCwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWYXJpYW50Qm9vbGVhbnZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGJvb2xlYW4gKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEludGVnZXJ2RVhUIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudEZsb2F0dkVYVCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VmFyaWFudFBvaW50ZXJ2RVhUIChHTHVpbnQsIEdMZW51bSwgR0x2b2lkKiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRCb29sZWFudkVYVCAoR0x1aW50LCBHTGVudW0sIEdMYm9vbGVhbiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnZhcmlhbnRJbnRlZ2VydkVYVCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEludmFyaWFudEZsb2F0dkVYVCAoR0x1aW50LCBHTGVudW0sIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0TG9jYWxDb25zdGFudEJvb2xlYW52RVhUIChHTHVpbnQsIEdMZW51bSwgR0xib29sZWFuICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRJbnRlZ2VydkVYVCAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldExvY2FsQ29uc3RhbnRGbG9hdHZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGZsb2F0ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5WRVJURVhTSEFERVJFWFRQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEVORFZFUlRFWFNIQURFUkVYVFBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWFNIQURFUkVYVFBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWFNIQURFUlNFWFRQUk9DKSAoR0x1aW50IHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYU0hBREVSRVhUUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNIQURFUk9QMUVYVFBST0MpIChHTGVudW0gb3AsIEdMdWludCByZXMsIEdMdWludCBhcmcxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVST1AyRVhUUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEsIEdMdWludCBhcmcyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0hBREVST1AzRVhUUFJPQykgKEdMZW51bSBvcCwgR0x1aW50IHJlcywgR0x1aW50IGFyZzEsIEdMdWludCBhcmcyLCBHTHVpbnQgYXJnMyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNXSVpaTEVFWFRQUk9DKSAoR0x1aW50IHJlcywgR0x1aW50IGluLCBHTGVudW0gb3V0WCwgR0xlbnVtIG91dFksIEdMZW51bSBvdXRaLCBHTGVudW0gb3V0Vyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFdSSVRFTUFTS0VYVFBST0MpIChHTHVpbnQgcmVzLCBHTHVpbnQgaW4sIEdMZW51bSBvdXRYLCBHTGVudW0gb3V0WSwgR0xlbnVtIG91dFosIEdMZW51bSBvdXRXKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMSU5TRVJUQ09NUE9ORU5URVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBzcmMsIEdMdWludCBudW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFWFRSQUNUQ09NUE9ORU5URVhUUFJPQykgKEdMdWludCByZXMsIEdMdWludCBzcmMsIEdMdWludCBudW0pOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEdFTlNZTUJPTFNFWFRQUk9DKSAoR0xlbnVtIGRhdGF0eXBlLCBHTGVudW0gc3RvcmFnZXR5cGUsIEdMZW51bSByYW5nZSwgR0x1aW50IGNvbXBvbmVudHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRJTlZBUklBTlRFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VUTE9DQUxDT05TVEFOVEVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UQlZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTGJ5dGUgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UU1ZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHNob3J0ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVElWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xpbnQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5URlZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTGZsb2F0ICphZGRyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkFSSUFOVERWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0xkb3VibGUgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UVUJWRVhUUFJPQykgKEdMdWludCBpZCwgY29uc3QgR0x1Ynl0ZSAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRVU1ZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHVzaG9ydCAqYWRkcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZBUklBTlRVSVZFWFRQUk9DKSAoR0x1aW50IGlkLCBjb25zdCBHTHVpbnQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWQVJJQU5UUE9JTlRFUkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB0eXBlLCBHTHVpbnQgc3RyaWRlLCBjb25zdCBHTHZvaWQgKmFkZHIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkFCTEVWQVJJQU5UQ0xJRU5UU1RBVEVFWFRQUk9DKSAoR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRElTQUJMRVZBUklBTlRDTElFTlRTVEFURUVYVFBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRMSUdIVFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSB2YWx1ZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORE1BVEVSSUFMUEFSQU1FVEVSRVhUUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTHVpbnQgKEFQSUVOVFJZUCBQRk5HTEJJTkRURVhHRU5QQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIHVuaXQsIEdMZW51bSBjb29yZCwgR0xlbnVtIHZhbHVlKTsKK3R5cGVkZWYgR0x1aW50IChBUElFTlRSWVAgUEZOR0xCSU5EVEVYVFVSRVVOSVRQQVJBTUVURVJFWFRQUk9DKSAoR0xlbnVtIHVuaXQsIEdMZW51bSB2YWx1ZSk7Cit0eXBlZGVmIEdMdWludCAoQVBJRU5UUllQIFBGTkdMQklORFBBUkFNRVRFUkVYVFBST0MpIChHTGVudW0gdmFsdWUpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVkFSSUFOVEVOQUJMRURFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gY2FwKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEJPT0xFQU5WRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWQVJJQU5USU5URUdFUlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMaW50ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSSUFOVEZMT0FUVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFZBUklBTlRQT0lOVEVSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0x2b2lkKiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVkFSSUFOVEJPT0xFQU5WRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4gKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlZBUklBTlRJTlRFR0VSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRJTlZBUklBTlRGTE9BVFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMZmxvYXQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMT0NBTENPTlNUQU5UQk9PTEVBTlZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVExPQ0FMQ09OU1RBTlRJTlRFR0VSVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB2YWx1ZSwgR0xpbnQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRMT0NBTENPTlNUQU5URkxPQVRWRVhUUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHZhbHVlLCBHTGZsb2F0ICpkYXRhKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfc3RyZWFtcworI2RlZmluZSBHTF9BVElfdmVydGV4X3N0cmVhbXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xc0FUSSAoR0xlbnVtLCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xc3ZBVEkgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xaUFUSSAoR0xlbnVtLCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMWl2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFmQVRJIChHTGVudW0sIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTFkQVRJIChHTGVudW0sIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0xZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMnNBVEkgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMnN2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmlBVEkgKEdMZW51bSwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yaXZBVEkgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmZBVEkgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmZ2QVRJIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtMmRBVEkgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW0yZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM3NBVEkgKEdMZW51bSwgR0xzaG9ydCwgR0xzaG9ydCwgR0xzaG9ydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM3N2QVRJIChHTGVudW0sIGNvbnN0IEdMc2hvcnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2lBVEkgKEdMZW51bSwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtM2l2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNmQVRJIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNkQVRJIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTNkdkFUSSAoR0xlbnVtLCBjb25zdCBHTGRvdWJsZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00c0FUSSAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00c3ZBVEkgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00aUFUSSAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4U3RyZWFtNGl2QVRJIChHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRmQVRJIChHTGVudW0sIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRmdkFUSSAoR0xlbnVtLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFN0cmVhbTRkQVRJIChHTGVudW0sIEdMZG91YmxlLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhTdHJlYW00ZHZBVEkgKEdMZW51bSwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2JBVEkgKEdMZW51bSwgR0xieXRlLCBHTGJ5dGUsIEdMYnl0ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2J2QVRJIChHTGVudW0sIGNvbnN0IEdMYnl0ZSAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zc0FUSSAoR0xlbnVtLCBHTHNob3J0LCBHTHNob3J0LCBHTHNob3J0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zc3ZBVEkgKEdMZW51bSwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zaUFUSSAoR0xlbnVtLCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxTdHJlYW0zaXZBVEkgKEdMZW51bSwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2ZBVEkgKEdMZW51bSwgR0xmbG9hdCwgR0xmbG9hdCwgR0xmbG9hdCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2Z2QVRJIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2RBVEkgKEdMZW51bSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsU3RyZWFtM2R2QVRJIChHTGVudW0sIGNvbnN0IEdMZG91YmxlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVZlcnRleFN0cmVhbUFUSSAoR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhCbGVuZEVudmlBVEkgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEJsZW5kRW52ZkFUSSAoR0xlbnVtLCBHTGZsb2F0KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xSUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMUlWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xRkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0xRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMURBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTFEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMlNBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMklBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgeCwgR0xpbnQgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0yRlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNMkRBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTJEVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM1NBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zSUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0lWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zRkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNM0ZWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTNEQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU0zRFZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xkb3VibGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTRTVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00SUFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNElWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMaW50ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00RkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhTVFJFQU00RlZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYU1RSRUFNNERBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xkb3VibGUgeCwgR0xkb3VibGUgeSwgR0xkb3VibGUgeiwgR0xkb3VibGUgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFNUUkVBTTREVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGRvdWJsZSAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0JBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xieXRlIG54LCBHTGJ5dGUgbnksIEdMYnl0ZSBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNCVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGJ5dGUgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNTQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIEdMc2hvcnQgbngsIEdMc2hvcnQgbnksIEdMc2hvcnQgbnopOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zU1ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0lBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xpbnQgbngsIEdMaW50IG55LCBHTGludCBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNJVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGludCAqY29vcmRzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0ZBVElQUk9DKSAoR0xlbnVtIHN0cmVhbSwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTFNUUkVBTTNGVkFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBjb25zdCBHTGZsb2F0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xOT1JNQUxTVFJFQU0zREFUSVBST0MpIChHTGVudW0gc3RyZWFtLCBHTGRvdWJsZSBueCwgR0xkb3VibGUgbnksIEdMZG91YmxlIG56KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTk9STUFMU1RSRUFNM0RWQVRJUFJPQykgKEdMZW51bSBzdHJlYW0sIGNvbnN0IEdMZG91YmxlICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTElFTlRBQ1RJVkVWRVJURVhTVFJFQU1BVElQUk9DKSAoR0xlbnVtIHN0cmVhbSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEJMRU5ERU5WSUFUSVBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQkxFTkRFTlZGQVRJUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfZWxlbWVudF9hcnJheQorI2RlZmluZSBHTF9BVElfZWxlbWVudF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVsZW1lbnRQb2ludGVyQVRJIChHTGVudW0sIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudEFycmF5QVRJIChHTGVudW0sIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRBcnJheUFUSSAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTEVNRU5UUE9JTlRFUkFUSVBST0MpIChHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRBUlJBWUFUSVBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERSQVdSQU5HRUVMRU1FTlRBUlJBWUFUSVBST0MpIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9tZXNoX2FycmF5CisjZGVmaW5lIEdMX1NVTl9tZXNoX2FycmF5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd01lc2hBcnJheXNTVU4gKEdMZW51bSwgR0xpbnQsIEdMc2l6ZWksIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV01FU0hBUlJBWVNTVU5QUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIHdpZHRoKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX1NVTl9zbGljZV9hY2N1bQorI2RlZmluZSBHTF9TVU5fc2xpY2VfYWNjdW0gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfbXVsdGlzYW1wbGVfZmlsdGVyX2hpbnQKKyNkZWZpbmUgR0xfTlZfbXVsdGlzYW1wbGVfZmlsdGVyX2hpbnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZGVwdGhfY2xhbXAKKyNkZWZpbmUgR0xfTlZfZGVwdGhfY2xhbXAgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfb2NjbHVzaW9uX3F1ZXJ5CisjZGVmaW5lIEdMX05WX29jY2x1c2lvbl9xdWVyeSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdlbk9jY2x1c2lvblF1ZXJpZXNOViAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZU9jY2x1c2lvblF1ZXJpZXNOViAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNPY2NsdXNpb25RdWVyeU5WIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJlZ2luT2NjbHVzaW9uUXVlcnlOViAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmRPY2NsdXNpb25RdWVyeU5WICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPY2NsdXNpb25RdWVyeWl2TlYgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRPY2NsdXNpb25RdWVyeXVpdk5WIChHTHVpbnQsIEdMZW51bSwgR0x1aW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VOT0NDTFVTSU9OUVVFUklFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVPQ0NMVVNJT05RVUVSSUVTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNPQ0NMVVNJT05RVUVSWU5WUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJFR0lOT0NDTFVTSU9OUVVFUllOVlBST0MpIChHTHVpbnQgaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTkRPQ0NMVVNJT05RVUVSWU5WUFJPQykgKHZvaWQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQ0NMVVNJT05RVUVSWUlWTlZQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRPQ0NMVVNJT05RVUVSWVVJVk5WUFJPQykgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wb2ludF9zcHJpdGUKKyNkZWZpbmUgR0xfTlZfcG9pbnRfc3ByaXRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJpTlYgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyaXZOViAoR0xlbnVtLCBjb25zdCBHTGludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSSU5WUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUklWTlZQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfc2hhZGVyMworI2RlZmluZSBHTF9OVl90ZXh0dXJlX3NoYWRlcjMgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEKKyNkZWZpbmUgR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3NoYWRvd19mdW5jcworI2RlZmluZSBHTF9FWFRfc2hhZG93X2Z1bmNzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlCisjZGVmaW5lIEdMX0VYVF9zdGVuY2lsX3R3b19zaWRlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWN0aXZlU3RlbmNpbEZhY2VFWFQgKEdMZW51bSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xBQ1RJVkVTVEVOQ0lMRkFDRUVYVFBST0MpIChHTGVudW0gZmFjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dF9mcmFnbWVudF9zaGFkZXIKKyNkZWZpbmUgR0xfQVRJX3RleHRfZnJhZ21lbnRfc2hhZGVyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlCisjZGVmaW5lIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2VsZW1lbnRfYXJyYXkKKyNkZWZpbmUgR0xfQVBQTEVfZWxlbWVudF9hcnJheSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVsZW1lbnRQb2ludGVyQVBQTEUgKEdMZW51bSwgY29uc3QgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtLCBHTGludCwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMaW50LCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50QXJyYXlBUFBMRSAoR0xlbnVtLCBjb25zdCBHTGludCAqLCBjb25zdCBHTHNpemVpICosIEdMc2l6ZWkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpRHJhd1JhbmdlRWxlbWVudEFycmF5QVBQTEUgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIGNvbnN0IEdMaW50ICosIGNvbnN0IEdMc2l6ZWkgKiwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xFTEVNRU5UUE9JTlRFUkFQUExFUFJPQykgKEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV1JBTkdFRUxFTUVOVEFSUkFZQVBQTEVQUk9DKSAoR0xlbnVtIG1vZGUsIEdMdWludCBzdGFydCwgR0x1aW50IGVuZCwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdFTEVNRU5UQVJSQVlBUFBMRVBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSURSQVdSQU5HRUVMRU1FTlRBUlJBWUFQUExFUFJPQykgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQUExFX2ZlbmNlCisjZGVmaW5lIEdMX0FQUExFX2ZlbmNlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuRmVuY2VzQVBQTEUgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNBUFBMRSAoR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNldEZlbmNlQVBQTEUgKEdMdWludCk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xJc0ZlbmNlQVBQTEUgKEdMdWludCk7CitHTEFQSSBHTGJvb2xlYW4gQVBJRU5UUlkgZ2xUZXN0RmVuY2VBUFBMRSAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZUFQUExFIChHTHVpbnQpOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsVGVzdE9iamVjdEFQUExFIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmluaXNoT2JqZWN0QVBQTEUgKEdMZW51bSwgR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VORkVOQ0VTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTRVRGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNGRU5DRUFQUExFUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMVEVTVEZFTkNFQVBQTEVQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRklOSVNIRkVOQ0VBUFBMRVBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTFRFU1RPQkpFQ1RBUFBMRVBST0MpIChHTGVudW0gb2JqZWN0LCBHTHVpbnQgbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZJTklTSE9CSkVDVEFQUExFUFJPQykgKEdMZW51bSBvYmplY3QsIEdMaW50IG5hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9BUFBMRV92ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5QVBQTEUgKEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzQVBQTEUgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5WZXJ0ZXhBcnJheXNBUFBMRSAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNWZXJ0ZXhBcnJheUFQUExFIChHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZQVBQTEVQUk9DKSAoR0x1aW50IGFycmF5KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYQVJSQVlTQVBQTEVQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWEFSUkFZU0FQUExFUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlBUFBMRVBST0MpIChHTHVpbnQgYXJyYXkpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfdmVydGV4X2FycmF5X3JhbmdlCisjZGVmaW5lIEdMX0FQUExFX3ZlcnRleF9hcnJheV9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEFycmF5UmFuZ2VBUFBMRSAoR0xzaXplaSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoVmVydGV4QXJyYXlSYW5nZUFQUExFIChHTHNpemVpLCBHTHZvaWQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXJyYXlQYXJhbWV0ZXJpQVBQTEUgKEdMZW51bSwgR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVJSQVlSQU5HRUFQUExFUFJPQykgKEdMc2l6ZWkgbGVuZ3RoLCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSFZFUlRFWEFSUkFZUkFOR0VBUFBMRVBST0MpIChHTHNpemVpIGxlbmd0aCwgR0x2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVJSQVlQQVJBTUVURVJJQVBQTEVQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9BUFBMRV95Y2Jjcl80MjIKKyNkZWZpbmUgR0xfQVBQTEVfeWNiY3JfNDIyIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX1MzX3MzdGMKKyNkZWZpbmUgR0xfUzNfczN0YyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfZHJhd19idWZmZXJzCisjZGVmaW5lIEdMX0FUSV9kcmF3X2J1ZmZlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3QnVmZmVyc0FUSSAoR0xzaXplaSwgY29uc3QgR0xlbnVtICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0JVRkZFUlNBVElQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdAorI2RlZmluZSBHTF9BVElfcGl4ZWxfZm9ybWF0X2Zsb2F0IDEKKy8qIFRoaXMgaXMgcmVhbGx5IGEgV0dMIGV4dGVuc2lvbiwgYnV0IGRlZmluZXMgc29tZSBhc3NvY2lhdGVkIEdMIGVudW1zLgorICogQVRJIGRvZXMgbm90IGV4cG9ydCAiR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdCIgaW4gdGhlIEdMX0VYVEVOU0lPTlMgc3RyaW5nLgorICovCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfdGV4dHVyZV9lbnZfY29tYmluZTMKKyNkZWZpbmUgR0xfQVRJX3RleHR1cmVfZW52X2NvbWJpbmUzIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV90ZXh0dXJlX2Zsb2F0CisjZGVmaW5lIEdMX0FUSV90ZXh0dXJlX2Zsb2F0IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2Zsb2F0X2J1ZmZlcgorI2RlZmluZSBHTF9OVl9mbG9hdF9idWZmZXIgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZnJhZ21lbnRfcHJvZ3JhbQorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtIDEKKy8qIFNvbWUgTlZfZnJhZ21lbnRfcHJvZ3JhbSBlbnRyeSBwb2ludHMgYXJlIHNoYXJlZCB3aXRoIEFSQl92ZXJ0ZXhfcHJvZ3JhbS4gKi8KKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQsIEdMZmxvYXQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkTlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBHTGRvdWJsZSwgR0xkb3VibGUsIEdMZG91YmxlLCBHTGRvdWJsZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbU5hbWVkUGFyYW1ldGVyNGZ2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1Ynl0ZSAqLCBjb25zdCBHTGZsb2F0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1OYW1lZFBhcmFtZXRlcjRkdk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWJ5dGUgKiwgY29uc3QgR0xkb3VibGUgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZnZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UHJvZ3JhbU5hbWVkUGFyYW1ldGVyZHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVieXRlICosIEdMZG91YmxlICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNEZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTkFNRURQQVJBTUVURVI0RE5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZG91YmxlIHgsIEdMZG91YmxlIHksIEdMZG91YmxlIHosIEdMZG91YmxlIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTkFNRURQQVJBTUVURVI0RlZOVlBST0MpIChHTHVpbnQgaWQsIEdMc2l6ZWkgbGVuLCBjb25zdCBHTHVieXRlICpuYW1lLCBjb25zdCBHTGZsb2F0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTU5BTUVEUEFSQU1FVEVSNERWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgY29uc3QgR0xkb3VibGUgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNTkFNRURQQVJBTUVURVJGVk5WUFJPQykgKEdMdWludCBpZCwgR0xzaXplaSBsZW4sIGNvbnN0IEdMdWJ5dGUgKm5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1OQU1FRFBBUkFNRVRFUkRWTlZQUk9DKSAoR0x1aW50IGlkLCBHTHNpemVpIGxlbiwgY29uc3QgR0x1Ynl0ZSAqbmFtZSwgR0xkb3VibGUgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9oYWxmX2Zsb2F0CisjZGVmaW5lIEdMX05WX2hhbGZfZmxvYXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgyaE5WIChHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDJodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXgzaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4NGhOViAoR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleDRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3IzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjNodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDFoTlYgKEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDFodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDJoTlYgKEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQyaHZOViAoY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmQzaE5WIChHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDNodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZDRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkMWhOViAoR0xlbnVtLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDFodk5WIChHTGVudW0sIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQyaE5WIChHTGVudW0sIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDJodk5WIChHTGVudW0sIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaE5WIChHTGVudW0sIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQzaHZOViAoR0xlbnVtLCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGhOViAoR0xlbnVtLCBHTGhhbGZOViwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRodk5WIChHTGVudW0sIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ0Nvb3JkaE5WIChHTGhhbGZOVik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nQ29vcmRodk5WIChjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTZWNvbmRhcnlDb2xvcjNoTlYgKEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNlY29uZGFyeUNvbG9yM2h2TlYgKGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGhOViAoR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFdlaWdodGh2TlYgKGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFoTlYgKEdMdWludCwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjFodk5WIChHTHVpbnQsIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjJoTlYgKEdMdWludCwgR0xoYWxmTlYsIEdMaGFsZk5WKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyaHZOViAoR0x1aW50LCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzaE5WIChHTHVpbnQsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjNodk5WIChHTHVpbnQsIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRoTlYgKEdMdWludCwgR0xoYWxmTlYsIEdMaGFsZk5WLCBHTGhhbGZOViwgR0xoYWxmTlYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYjRodk5WIChHTHVpbnQsIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnMxaHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGhhbGZOViAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJzMmh2TlYgKEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xoYWxmTlYgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliczNodk5WIChHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaGFsZk5WICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYnM0aHZOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGhhbGZOViAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDJITlZQUk9DKSAoR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWDJIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYM0hOVlBST0MpIChHTGhhbGZOViB4LCBHTGhhbGZOViB5LCBHTGhhbGZOViB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYM0hWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVg0SE5WUFJPQykgKEdMaGFsZk5WIHgsIEdMaGFsZk5WIHksIEdMaGFsZk5WIHosIEdMaGFsZk5WIHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVg0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNITlZQUk9DKSAoR0xoYWxmTlYgbngsIEdMaGFsZk5WIG55LCBHTGhhbGZOViBueik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE5PUk1BTDNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1IzSE5WUFJPQykgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDT0xPUjNIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0SE5WUFJPQykgKEdMaGFsZk5WIHJlZCwgR0xoYWxmTlYgZ3JlZW4sIEdMaGFsZk5WIGJsdWUsIEdMaGFsZk5WIGFscGhhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQ09MT1I0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMUhOVlBST0MpIChHTGhhbGZOViBzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQxSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEMkhOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQySFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JEM0hOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWENPT1JENEhOVlBST0MpIChHTGhhbGZOViBzLCBHTGhhbGZOViB0LCBHTGhhbGZOViByLCBHTGhhbGZOViBxKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYQ09PUkQ0SFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQxSE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMUhWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JEMkhOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGhhbGZOViBzLCBHTGhhbGZOViB0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDJIVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMTVVMVElURVhDT09SRDNITlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xoYWxmTlYgcywgR0xoYWxmTlYgdCwgR0xoYWxmTlYgcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQzSFZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0SE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaGFsZk5WIHMsIEdMaGFsZk5WIHQsIEdMaGFsZk5WIHIsIEdMaGFsZk5WIHEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENEhWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREhOVlBST0MpIChHTGhhbGZOViBmb2cpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGT0dDT09SREhWTlZQUk9DKSAoY29uc3QgR0xoYWxmTlYgKmZvZyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNFQ09OREFSWUNPTE9SM0hOVlBST0MpIChHTGhhbGZOViByZWQsIEdMaGFsZk5WIGdyZWVuLCBHTGhhbGZOViBibHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU0VDT05EQVJZQ09MT1IzSFZOVlBST0MpIChjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWFdFSUdIVEhOVlBST0MpIChHTGhhbGZOViB3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhXRUlHSFRIVk5WUFJPQykgKGNvbnN0IEdMaGFsZk5WICp3ZWlnaHQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIxSE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjFIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIySE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjJIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUIzSE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjNIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUI0SE5WUFJPQykgKEdMdWludCBpbmRleCwgR0xoYWxmTlYgeCwgR0xoYWxmTlYgeSwgR0xoYWxmTlYgeiwgR0xoYWxmTlYgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQjRIVk5WUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTMUhWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCUzJIVk5WUFJPQykgKEdMdWludCBpbmRleCwgR0xzaXplaSBuLCBjb25zdCBHTGhhbGZOViAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQlMzSFZOVlBST0MpIChHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgbiwgY29uc3QgR0xoYWxmTlYgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJTNEhWTlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHNpemVpIG4sIGNvbnN0IEdMaGFsZk5WICp2KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3BpeGVsX2RhdGFfcmFuZ2UKKyNkZWZpbmUgR0xfTlZfcGl4ZWxfZGF0YV9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsRGF0YVJhbmdlTlYgKEdMZW51bSwgR0xzaXplaSwgR0x2b2lkICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoUGl4ZWxEYXRhUmFuZ2VOViAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBJWEVMREFUQVJBTkdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZW5ndGgsIEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZMVVNIUElYRUxEQVRBUkFOR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0CisjZGVmaW5lIEdMX05WX3ByaW1pdGl2ZV9yZXN0YXJ0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJpbWl0aXZlUmVzdGFydE5WICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcmltaXRpdmVSZXN0YXJ0SW5kZXhOViAoR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBSSU1JVElWRVJFU1RBUlROVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJJTUlUSVZFUkVTVEFSVElOREVYTlZQUk9DKSAoR0x1aW50IGluZGV4KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RleHR1cmVfZXhwYW5kX25vcm1hbAorI2RlZmluZSBHTF9OVl90ZXh0dXJlX2V4cGFuZF9ub3JtYWwgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0yCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9BVElfbWFwX29iamVjdF9idWZmZXIKKyNkZWZpbmUgR0xfQVRJX21hcF9vYmplY3RfYnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSBHTHZvaWQqIEFQSUVOVFJZIGdsTWFwT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVubWFwT2JqZWN0QnVmZmVyQVRJIChHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgR0x2b2lkKiAoQVBJRU5UUllQIFBGTkdMTUFQT0JKRUNUQlVGRkVSQVRJUFJPQykgKEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTk1BUE9CSkVDVEJVRkZFUkFUSVBST0MpIChHTHVpbnQgYnVmZmVyKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsCisjZGVmaW5lIEdMX0FUSV9zZXBhcmF0ZV9zdGVuY2lsIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGVBVEkgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZUFUSSAoR0xlbnVtLCBHTGVudW0sIEdMaW50LCBHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMU1RFTkNJTE9QU0VQQVJBVEVBVElQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIGRwZmFpbCwgR0xlbnVtIGRwcGFzcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFNURU5DSUxGVU5DU0VQQVJBVEVBVElQUk9DKSAoR0xlbnVtIGZyb250ZnVuYywgR0xlbnVtIGJhY2tmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FUSV92ZXJ0ZXhfYXR0cmliX2FycmF5X29iamVjdAorI2RlZmluZSBHTF9BVElfdmVydGV4X2F0dHJpYl9hcnJheV9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdEFUSSAoR0x1aW50LCBHTGludCwgR0xlbnVtLCBHTGJvb2xlYW4sIEdMc2l6ZWksIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGZ2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJBcnJheU9iamVjdGl2QVRJIChHTHVpbnQsIEdMZW51bSwgR0xpbnQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJBUlJBWU9CSkVDVEFUSVBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBidWZmZXIsIEdMdWludCBvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJBUlJBWU9CSkVDVEZWQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJBUlJBWU9CSkVDVElWQVRJUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9PRVNfcmVhZF9mb3JtYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2RlcHRoX2JvdW5kc190ZXN0CisjZGVmaW5lIEdMX0VYVF9kZXB0aF9ib3VuZHNfdGVzdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoQm91bmRzRVhUIChHTGNsYW1wZCwgR0xjbGFtcGQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVQVEhCT1VORFNFWFRQUk9DKSAoR0xjbGFtcGQgem1pbiwgR0xjbGFtcGQgem1heCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9taXJyb3JfY2xhbXAKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfbWlycm9yX2NsYW1wIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9FWFRfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVFWFQgKEdMZW51bSwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05TRVBBUkFURUVYVFBST0MpIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9NRVNBX3BhY2tfaW52ZXJ0CisjZGVmaW5lIEdMX01FU0FfcGFja19pbnZlcnQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTUVTQV95Y2Jjcl90ZXh0dXJlCisjZGVmaW5lIEdMX01FU0FfeWNiY3JfdGV4dHVyZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9FWFRfcGl4ZWxfYnVmZmVyX29iamVjdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbgorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtX29wdGlvbiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMgorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtMiAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTJfb3B0aW9uCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMl9vcHRpb24gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW0zCisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtMyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyRVhUIChHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXJFWFQgKEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUIChHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCAoR0xzaXplaSwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMaW50ICopOworR0xBUEkgR0xib29sZWFuIEFQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlckVYVCAoR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXJFWFQgKEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMURFWFQgKEdMZW51bSwgR0xlbnVtLCBHTGVudW0sIEdMdWludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHVpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzREVYVCAoR0xlbnVtLCBHTGVudW0sIEdMZW51bSwgR0x1aW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcEVYVCAoR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoQVBJRU5UUllQIFBGTkdMSVNSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRSRU5ERVJCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFTEVURVJFTkRFUkJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5SRU5ERVJCVUZGRVJTRVhUUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUkVOREVSQlVGRkVSUEFSQU1FVEVSSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgR0xib29sZWFuIChBUElFTlRSWVAgUEZOR0xJU0ZSQU1FQlVGRkVSRVhUUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFNRUJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xERUxFVEVGUkFNRUJVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFTkZSQU1FQlVGRkVSU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgR0xlbnVtIChBUElFTlRSWVAgUEZOR0xDSEVDS0ZSQU1FQlVGRkVSU1RBVFVTRVhUUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlJFTkRFUkJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEZSQU1FQlVGRkVSQVRUQUNITUVOVFBBUkFNRVRFUklWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRU5FUkFURU1JUE1BUEVYVFBST0MpIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0dSRU1FRFlfc3RyaW5nX21hcmtlcgorI2RlZmluZSBHTF9HUkVNRURZX3N0cmluZ19tYXJrZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdHJpbmdNYXJrZXJHUkVNRURZIChHTHNpemVpLCBjb25zdCBHTHZvaWQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVFJJTkdNQVJLRVJHUkVNRURZUFJPQykgKEdMc2l6ZWkgbGVuLCBjb25zdCBHTHZvaWQgKnN0cmluZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9zdGVuY2lsX2NsZWFyX3RhZworI2RlZmluZSBHTF9FWFRfc3RlbmNpbF9jbGVhcl90YWcgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsQ2xlYXJUYWdFWFQgKEdMc2l6ZWksIEdMdWludCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xTVEVOQ0lMQ0xFQVJUQUdFWFRQUk9DKSAoR0xzaXplaSBzdGVuY2lsVGFnQml0cywgR0x1aW50IHN0ZW5jaWxDbGVhclRhZyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zUkdCCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3NSR0IgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2ZyYW1lYnVmZmVyX2JsaXQKKyNkZWZpbmUgR0xfRVhUX2ZyYW1lYnVmZmVyX2JsaXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCbGl0RnJhbWVidWZmZXJFWFQgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xiaXRmaWVsZCwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJMSVRGUkFNRUJVRkZFUkVYVFBST0MpIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX01FU0FYX3RleHR1cmVfc3RhY2sKKyNkZWZpbmUgR0xfTUVTQVhfdGV4dHVyZV9zdGFjayAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGltZXJfcXVlcnkKKyNkZWZpbmUgR0xfRVhUX3RpbWVyX3F1ZXJ5IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3RpNjR2RVhUIChHTHVpbnQsIEdMZW51bSwgR0xpbnQ2NEVYVCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRRdWVyeU9iamVjdHVpNjR2RVhUIChHTHVpbnQsIEdMZW51bSwgR0x1aW50NjRFWFQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVEk2NFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50NjRFWFQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUVUk2NFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludDY0RVhUICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMKKyNkZWZpbmUgR0xfRVhUX2dwdV9wcm9ncmFtX3BhcmFtZXRlcnMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyczRmdkVYVCAoR0xlbnVtLCBHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyczRmdkVYVCAoR0xlbnVtLCBHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMZmxvYXQgKik7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNRU5WUEFSQU1FVEVSUzRGVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUlM0RlZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBQTEVfZmx1c2hfYnVmZmVyX3JhbmdlCisjZGVmaW5lIEdMX0FQUExFX2ZsdXNoX2J1ZmZlcl9yYW5nZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJ1ZmZlclBhcmFtZXRlcmlBUFBMRSAoR0xlbnVtLCBHTGVudW0sIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlQVBQTEUgKEdMZW51bSwgR0xpbnRwdHIsIEdMc2l6ZWlwdHIpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQlVGRkVSUEFSQU1FVEVSSUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGTFVTSE1BUFBFREJVRkZFUlJBTkdFQVBQTEVQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfZ3B1X3Byb2dyYW00CisjZGVmaW5lIEdMX05WX2dwdV9wcm9ncmFtNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aU5WIChHTGVudW0sIEdMdWludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0aXZOViAoR0xlbnVtLCBHTHVpbnQsIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlcnNJNGl2TlYgKEdMZW51bSwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJNHVpTlYgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1Mb2NhbFBhcmFtZXRlckk0dWl2TlYgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUxvY2FsUGFyYW1ldGVyc0k0dWl2TlYgKEdMZW51bSwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbUVudlBhcmFtZXRlckk0aU5WIChHTGVudW0sIEdMdWludCwgR0xpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNGl2TlYgKEdMZW51bSwgR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtRW52UGFyYW1ldGVyc0k0aXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpTlYgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJJNHVpdk5WIChHTGVudW0sIEdMdWludCwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1FbnZQYXJhbWV0ZXJzSTR1aXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtTG9jYWxQYXJhbWV0ZXJJaXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldFByb2dyYW1Mb2NhbFBhcmFtZXRlckl1aXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVySWl2TlYgKEdMZW51bSwgR0x1aW50LCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRQcm9ncmFtRW52UGFyYW1ldGVySXVpdk5WIChHTGVudW0sIEdMdWludCwgR0x1aW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRJTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1MT0NBTFBBUkFNRVRFUlNJNElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSTRVSU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeiwgR0x1aW50IHcpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVJJNFVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNTE9DQUxQQVJBTUVURVJTSTRVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUkk0SU5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJJNElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUlNJNElWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUkk0VUlOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUVOVlBBUkFNRVRFUkk0VUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFBST0dSQU1FTlZQQVJBTUVURVJTSTRVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUxPQ0FMUEFSQU1FVEVSSVVJVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNRU5WUEFSQU1FVEVSSUlWTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUVOVlBBUkFNRVRFUklVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00CisjZGVmaW5lIEdMX05WX2dlb21ldHJ5X3Byb2dyYW00IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUHJvZ3JhbVZlcnRleExpbWl0TlYgKEdMZW51bSwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUVYVCAoR0xlbnVtLCBHTGVudW0sIEdMdWludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyRVhUIChHTGVudW0sIEdMZW51bSwgR0x1aW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUZhY2VFWFQgKEdMZW51bSwgR0xlbnVtLCBHTHVpbnQsIEdMaW50LCBHTGVudW0pOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVZFUlRFWExJTUlUTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGltaXQpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRUxBWUVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFRkFDRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGVudW0gZmFjZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyNAorI2RlZmluZSBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXJpRVhUIChHTHVpbnQsIEdMZW51bSwgR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUklFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfTlZfdmVydGV4X3Byb2dyYW00CisjZGVmaW5lIEdMX05WX3ZlcnRleF9wcm9ncmFtNCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxaUVYVCAoR0x1aW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTJpRVhUIChHTHVpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTNpRVhUIChHTHVpbnQsIEdMaW50LCBHTGludCwgR0xpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0aUVYVCAoR0x1aW50LCBHTGludCwgR0xpbnQsIEdMaW50LCBHTGludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTF1aUVYVCAoR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkydWlFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkzdWlFWFQgKEdMdWludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1aUVYVCAoR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkxaXZFWFQgKEdMdWludCwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTJpdkVYVCAoR0x1aW50LCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM2l2RVhUIChHTHVpbnQsIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0aXZFWFQgKEdMdWludCwgY29uc3QgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTF1aXZFWFQgKEdMdWludCwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkkydWl2RVhUIChHTHVpbnQsIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJM3VpdkVYVCAoR0x1aW50LCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1aXZFWFQgKEdMdWludCwgY29uc3QgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0YnZFWFQgKEdMdWludCwgY29uc3QgR0xieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0c3ZFWFQgKEdMdWludCwgY29uc3QgR0xzaG9ydCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVidkVYVCAoR0x1aW50LCBjb25zdCBHTHVieXRlICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dXN2RVhUIChHTHVpbnQsIGNvbnN0IEdMdXNob3J0ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleEF0dHJpYklQb2ludGVyRVhUIChHTHVpbnQsIEdMaW50LCBHTGVudW0sIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJaXZFWFQgKEdMdWludCwgR0xlbnVtLCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2RVhUIChHTHVpbnQsIEdMZW51bSwgR0x1aW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTFJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkySUVYVFBST0MpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM0lFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxVUlFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkyVUlFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHkpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM1VJRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgeik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUlFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkySVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkzSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0SVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTGludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkkxVUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTJVSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVpbnQgKnYpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJJM1VJVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0VUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRCVkVYVFBST0MpIChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMYnl0ZSAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkk0U1ZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHNob3J0ICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRVQlZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVieXRlICp2KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVkVSVEVYQVRUUklCSTRVU1ZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBjb25zdCBHTHVzaG9ydCAqdik7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQklQT0lOVEVSRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJSVZFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRWRVJURVhBVFRSSUJJVUlWRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZ3B1X3NoYWRlcjQKKyNkZWZpbmUgR0xfRVhUX2dwdV9zaGFkZXI0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VW5pZm9ybXVpdkVYVCAoR0x1aW50LCBHTGludCwgR0x1aW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRGcmFnRGF0YUxvY2F0aW9uRVhUIChHTHVpbnQsIEdMdWludCwgY29uc3QgR0xjaGFyICopOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRGcmFnRGF0YUxvY2F0aW9uRVhUIChHTHVpbnQsIGNvbnN0IEdMY2hhciAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMXVpRVhUIChHTGludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMnVpRVhUIChHTGludCwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFVuaWZvcm0zdWlFWFQgKEdMaW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNHVpRVhUIChHTGludCwgR0x1aW50LCBHTHVpbnQsIEdMdWludCwgR0x1aW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMXVpdkVYVCAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtMnVpdkVYVCAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtM3VpdkVYVCAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtNHVpdkVYVCAoR0xpbnQsIEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1VSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEJJTkRGUkFHREFUQUxPQ0FUSU9ORVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgY29sb3IsIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIEdMaW50IChBUElFTlRSWVAgUEZOR0xHRVRGUkFHREFUQUxPQ0FUSU9ORVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMVVJRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMlVJRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0zVUlFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNFVJRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNMVVJVkVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFVOSUZPUk0yVUlWRVhUUFJPQykgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STTNVSVZFWFRQUk9DKSAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xVTklGT1JNNFVJVkVYVFBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfZHJhd19pbnN0YW5jZWQKKyNkZWZpbmUgR0xfRVhUX2RyYXdfaW5zdGFuY2VkIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5c0luc3RhbmNlZEVYVCAoR0xlbnVtLCBHTGludCwgR0xzaXplaSwgR0xzaXplaSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkRVhUIChHTGVudW0sIEdMc2l6ZWksIEdMZW51bSwgY29uc3QgR0x2b2lkICosIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0lOU1RBTkNFREVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRTSU5TVEFOQ0VERVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfcGFja2VkX2Zsb2F0CisjZGVmaW5lIEdMX0VYVF9wYWNrZWRfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfYXJyYXkKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfYXJyYXkgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9idWZmZXJfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4QnVmZmVyRVhUIChHTGVudW0sIEdMZW51bSwgR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWEJVRkZFUkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fbGF0YworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9sYXRjIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zaGFyZWRfZXhwb25lbnQKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfc2hhcmVkX2V4cG9uZW50IDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2RlcHRoX2J1ZmZlcl9mbG9hdAorI2RlZmluZSBHTF9OVl9kZXB0aF9idWZmZXJfZmxvYXQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZE5WIChHTGRvdWJsZSwgR0xkb3VibGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGhkTlYgKEdMZG91YmxlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEJvdW5kc2ROViAoR0xkb3VibGUsIEdMZG91YmxlKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VETlZQUk9DKSAoR0xkb3VibGUgek5lYXIsIEdMZG91YmxlIHpGYXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkRFUFRIRE5WUFJPQykgKEdMZG91YmxlIGRlcHRoKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMREVQVEhCT1VORFNETlZQUk9DKSAoR0xkb3VibGUgem1pbiwgR0xkb3VibGUgem1heCk7CisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFnbWVudF9wcm9ncmFtNAorI2RlZmluZSBHTF9OVl9mcmFnbWVudF9wcm9ncmFtNCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZV9jb3ZlcmFnZQorI2RlZmluZSBHTF9OVl9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZV9jb3ZlcmFnZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUNvdmVyYWdlTlYgKEdMZW51bSwgR0xzaXplaSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpKTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUNPVkVSQUdFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBjb3ZlcmFnZVNhbXBsZXMsIEdMc2l6ZWkgY29sb3JTYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMX0VYVF9mcmFtZWJ1ZmZlcl9zUkdCIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX2dlb21ldHJ5X3NoYWRlcjQKKyNkZWZpbmUgR0xfTlZfZ2VvbWV0cnlfc2hhZGVyNCAxCisjZW5kaWYKKworI2lmbmRlZiBHTF9OVl9wYXJhbWV0ZXJfYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9OVl9wYXJhbWV0ZXJfYnVmZmVyX29iamVjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFByb2dyYW1CdWZmZXJQYXJhbWV0ZXJzZnZOViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0xzaXplaSwgY29uc3QgR0xmbG9hdCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0lpdk5WIChHTGVudW0sIEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQcm9ncmFtQnVmZmVyUGFyYW1ldGVyc0l1aXZOViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0xzaXplaSwgY29uc3QgR0x1aW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUJVRkZFUlBBUkFNRVRFUlNGVk5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIsIEdMdWludCBpbmRleCwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMUFJPR1JBTUJVRkZFUlBBUkFNRVRFUlNJSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xQUk9HUkFNQlVGRkVSUEFSQU1FVEVSU0lVSVZOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqcGFyYW1zKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF9kcmF3X2J1ZmZlcnMyCisjZGVmaW5lIEdMX0VYVF9kcmF3X2J1ZmZlcnMyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JNYXNrSW5kZXhlZEVYVCAoR0x1aW50LCBHTGJvb2xlYW4sIEdMYm9vbGVhbiwgR0xib29sZWFuLCBHTGJvb2xlYW4pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEdldEJvb2xlYW5JbmRleGVkdkVYVCAoR0xlbnVtLCBHTHVpbnQsIEdMYm9vbGVhbiAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VySW5kZXhlZHZFWFQgKEdMZW51bSwgR0x1aW50LCBHTGludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVJbmRleGVkRVhUIChHTGVudW0sIEdMdWludCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZUluZGV4ZWRFWFQgKEdMZW51bSwgR0x1aW50KTsKK0dMQVBJIEdMYm9vbGVhbiBBUElFTlRSWSBnbElzRW5hYmxlZEluZGV4ZWRFWFQgKEdMZW51bSwgR0x1aW50KTsKKyNlbmRpZiAvKiBHTF9HTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTENPTE9STUFTS0lOREVYRURFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEJPT0xFQU5JTkRFWEVEVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMYm9vbGVhbiAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVElOVEVHRVJJTkRFWEVEVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50ICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5BQkxFSU5ERVhFREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xESVNBQkxFSU5ERVhFREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOwordHlwZWRlZiBHTGJvb2xlYW4gKEFQSUVOVFJZUCBQRk5HTElTRU5BQkxFRElOREVYRURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX05WX3RyYW5zZm9ybV9mZWVkYmFjaworI2RlZmluZSBHTF9OVl90cmFuc2Zvcm1fZmVlZGJhY2sgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCZWdpblRyYW5zZm9ybUZlZWRiYWNrTlYgKEdMZW51bSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2tOViAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVHJhbnNmb3JtRmVlZGJhY2tBdHRyaWJzTlYgKEdMdWludCwgY29uc3QgR0xpbnQgKiwgR0xlbnVtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kQnVmZmVyUmFuZ2VOViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0xpbnRwdHIsIEdMc2l6ZWlwdHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJPZmZzZXROViAoR0xlbnVtLCBHTHVpbnQsIEdMdWludCwgR0xpbnRwdHIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRCdWZmZXJCYXNlTlYgKEdMZW51bSwgR0x1aW50LCBHTHVpbnQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3NOViAoR0x1aW50LCBHTHNpemVpLCBjb25zdCBHTGludCAqLCBHTGVudW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVZhcnlpbmdOViAoR0x1aW50LCBjb25zdCBHTGNoYXIgKik7CitHTEFQSSBHTGludCBBUElFTlRSWSBnbEdldFZhcnlpbmdMb2NhdGlvbk5WIChHTHVpbnQsIGNvbnN0IEdMY2hhciAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRBY3RpdmVWYXJ5aW5nTlYgKEdMdWludCwgR0x1aW50LCBHTHNpemVpLCBHTHNpemVpICosIEdMc2l6ZWkgKiwgR0xlbnVtICosIEdMY2hhciAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdOViAoR0x1aW50LCBHTHVpbnQsIEdMaW50ICopOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQkVHSU5UUkFOU0ZPUk1GRUVEQkFDS05WUFJPQykgKEdMZW51bSBwcmltaXRpdmVNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMRU5EVFJBTlNGT1JNRkVFREJBQ0tOVlBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVFJBTlNGT1JNRkVFREJBQ0tBVFRSSUJTTlZQUk9DKSAoR0x1aW50IGNvdW50LCBjb25zdCBHTGludCAqYXR0cmlicywgR0xlbnVtIGJ1ZmZlck1vZGUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xCSU5EQlVGRkVSUkFOR0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUk9GRlNFVE5WUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0KTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQklOREJVRkZFUkJBU0VOVlBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xUUkFOU0ZPUk1GRUVEQkFDS1ZBUllJTkdTTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICpsb2NhdGlvbnMsIEdMZW51bSBidWZmZXJNb2RlKTsKK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMQUNUSVZFVkFSWUlOR05WUFJPQykgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVkFSWUlOR0xPQ0FUSU9OTlZQUk9DKSAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVEFDVElWRVZBUllJTkdOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xzaXplaSAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRUUkFOU0ZPUk1GRUVEQkFDS1ZBUllJTkdOVlBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTGludCAqbG9jYXRpb24pOworI2VuZGlmCisKKyNpZm5kZWYgR0xfRVhUX2JpbmRhYmxlX3VuaWZvcm0KKyNkZWZpbmUgR0xfRVhUX2JpbmRhYmxlX3VuaWZvcm0gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xVbmlmb3JtQnVmZmVyRVhUIChHTHVpbnQsIEdMaW50LCBHTHVpbnQpOworR0xBUEkgR0xpbnQgQVBJRU5UUlkgZ2xHZXRVbmlmb3JtQnVmZmVyU2l6ZUVYVCAoR0x1aW50LCBHTGludCk7CitHTEFQSSBHTGludHB0ciBBUElFTlRSWSBnbEdldFVuaWZvcm1PZmZzZXRFWFQgKEdMdWludCwgR0xpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVU5JRk9STUJVRkZFUkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCBidWZmZXIpOwordHlwZWRlZiBHTGludCAoQVBJRU5UUllQIFBGTkdMR0VUVU5JRk9STUJVRkZFUlNJWkVFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uKTsKK3R5cGVkZWYgR0xpbnRwdHIgKEFQSUVOVFJZUCBQRk5HTEdFVFVOSUZPUk1PRkZTRVRFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ludGVnZXIKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfaW50ZWdlciAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcklpdkVYVCAoR0xlbnVtLCBHTGVudW0sIGNvbnN0IEdMaW50ICopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlckl1aXZFWFQgKEdMZW51bSwgR0xlbnVtLCBjb25zdCBHTHVpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVySWl2RVhUIChHTGVudW0sIEdMZW51bSwgR0xpbnQgKik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVySXVpdkVYVCAoR0xlbnVtLCBHTGVudW0sIEdMdWludCAqKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9ySWlFWFQgKEdMaW50LCBHTGludCwgR0xpbnQsIEdMaW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9ySXVpRVhUIChHTHVpbnQsIEdMdWludCwgR0x1aW50LCBHTHVpbnQpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSSUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEFQSUVOVFJZUCBQRk5HTEdFVFRFWFBBUkFNRVRFUklJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xHRVRURVhQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkNPTE9SSUlFWFRQUk9DKSAoR0xpbnQgcmVkLCBHTGludCBncmVlbiwgR0xpbnQgYmx1ZSwgR0xpbnQgYWxwaGEpOwordHlwZWRlZiB2b2lkIChBUElFTlRSWVAgUEZOR0xDTEVBUkNPTE9SSVVJRVhUUFJPQykgKEdMdWludCByZWQsIEdMdWludCBncmVlbiwgR0x1aW50IGJsdWUsIEdMdWludCBhbHBoYSk7CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGEyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseC5oCkBAIC0wLDAgKzEsNTAwIEBACisvKgorICogTWVzYSAzLUQgZ3JhcGhpY3MgbGlicmFyeQorICogVmVyc2lvbjogIDYuNQorICogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgQnJpYW4gUGF1bCAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBCUklBTiBQQVVMIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIEdMWF9ICisjZGVmaW5lIEdMWF9ICisKKworI2lmZGVmIF9fVk1TCisjaW5jbHVkZSA8R0wvdm1zX3hfZml4Lmg+CisjIGlmZGVmIF9fY3BsdXNwbHVzCisvKiBWTVMgWGxpYi5oIGdpdmVzIHByb2JsZW1zIHdpdGggQysrLgorICogdGhpcyBhdm9pZHMgYSBidW5jaCBvZiB0cml2aWFsIHdhcm5pbmdzICovCisjcHJhZ21hIG1lc3NhZ2UgZGlzYWJsZSBub3NpbXBpbnQKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KKyNpZmRlZiBfX1ZNUworIyBpZmRlZiBfX2NwbHVzcGx1cworI3ByYWdtYSBtZXNzYWdlIGVuYWJsZSBub3NpbXBpbnQKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8R0wvZ2wuaD4KKworCisjaWYgZGVmaW5lZChVU0VfTUdMX05BTUVTUEFDRSkKKyNpbmNsdWRlICJnbHhfbWFuZ2xlLmgiCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBHTFhfVkVSU0lPTl8xXzEJCTEKKyNkZWZpbmUgR0xYX1ZFUlNJT05fMV8yCQkxCisjZGVmaW5lIEdMWF9WRVJTSU9OXzFfMwkJMQorI2RlZmluZSBHTFhfVkVSU0lPTl8xXzQJCTEKKworI2RlZmluZSBHTFhfRVhURU5TSU9OX05BTUUgICAiR0xYIgorCisKKworLyoKKyAqIFRva2VucyBmb3IgZ2xYQ2hvb3NlVmlzdWFsIGFuZCBnbFhHZXRDb25maWc6CisgKi8KKyNkZWZpbmUgR0xYX1VTRV9HTAkJMQorI2RlZmluZSBHTFhfQlVGRkVSX1NJWkUJCTIKKyNkZWZpbmUgR0xYX0xFVkVMCQkzCisjZGVmaW5lIEdMWF9SR0JBCQk0CisjZGVmaW5lIEdMWF9ET1VCTEVCVUZGRVIJNQorI2RlZmluZSBHTFhfU1RFUkVPCQk2CisjZGVmaW5lIEdMWF9BVVhfQlVGRkVSUwkJNworI2RlZmluZSBHTFhfUkVEX1NJWkUJCTgKKyNkZWZpbmUgR0xYX0dSRUVOX1NJWkUJCTkKKyNkZWZpbmUgR0xYX0JMVUVfU0laRQkJMTAKKyNkZWZpbmUgR0xYX0FMUEhBX1NJWkUJCTExCisjZGVmaW5lIEdMWF9ERVBUSF9TSVpFCQkxMgorI2RlZmluZSBHTFhfU1RFTkNJTF9TSVpFCTEzCisjZGVmaW5lIEdMWF9BQ0NVTV9SRURfU0laRQkxNAorI2RlZmluZSBHTFhfQUNDVU1fR1JFRU5fU0laRQkxNQorI2RlZmluZSBHTFhfQUNDVU1fQkxVRV9TSVpFCTE2CisjZGVmaW5lIEdMWF9BQ0NVTV9BTFBIQV9TSVpFCTE3CisKKworLyoKKyAqIEVycm9yIGNvZGVzIHJldHVybmVkIGJ5IGdsWEdldENvbmZpZzoKKyAqLworI2RlZmluZSBHTFhfQkFEX1NDUkVFTgkJMQorI2RlZmluZSBHTFhfQkFEX0FUVFJJQlVURQkyCisjZGVmaW5lIEdMWF9OT19FWFRFTlNJT04JMworI2RlZmluZSBHTFhfQkFEX1ZJU1VBTAkJNAorI2RlZmluZSBHTFhfQkFEX0NPTlRFWFQJCTUKKyNkZWZpbmUgR0xYX0JBRF9WQUxVRSAgICAgICAJNgorI2RlZmluZSBHTFhfQkFEX0VOVU0JCTcKKworCisvKgorICogR0xYIDEuMSBhbmQgbGF0ZXI6CisgKi8KKyNkZWZpbmUgR0xYX1ZFTkRPUgkJMQorI2RlZmluZSBHTFhfVkVSU0lPTgkJMgorI2RlZmluZSBHTFhfRVhURU5TSU9OUyAJCTMKKworCisvKgorICogR0xYIDEuMyBhbmQgbGF0ZXI6CisgKi8KKyNkZWZpbmUgR0xYX0NPTkZJR19DQVZFQVQJCTB4MjAKKyNkZWZpbmUgR0xYX0RPTlRfQ0FSRQkJCTB4RkZGRkZGRkYKKyNkZWZpbmUgR0xYX1hfVklTVUFMX1RZUEUJCTB4MjIKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1RZUEUJCTB4MjMKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFCTB4MjQKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRQkweDI1CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRQkweDI2CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFCTB4MjcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFCTB4MjgKKyNkZWZpbmUgR0xYX1dJTkRPV19CSVQJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9QSVhNQVBfQklUCQkJMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUEJVRkZFUl9CSVQJCQkweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9BVVhfQlVGRkVSU19CSVQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0xYX0ZST05UX0xFRlRfQlVGRkVSX0JJVAkweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9CVUZGRVJfQklUCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0JBQ0tfUklHSFRfQlVGRkVSX0JJVAkweDAwMDAwMDA4CisjZGVmaW5lIEdMWF9ERVBUSF9CVUZGRVJfQklUCQkweDAwMDAwMDIwCisjZGVmaW5lIEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQJCTB4MDAwMDAwNDAKKyNkZWZpbmUgR0xYX0FDQ1VNX0JVRkZFUl9CSVQJCTB4MDAwMDAwODAKKyNkZWZpbmUgR0xYX05PTkUJCQkweDgwMDAKKyNkZWZpbmUgR0xYX1NMT1dfQ09ORklHCQkJMHg4MDAxCisjZGVmaW5lIEdMWF9UUlVFX0NPTE9SCQkJMHg4MDAyCisjZGVmaW5lIEdMWF9ESVJFQ1RfQ09MT1IJCTB4ODAwMworI2RlZmluZSBHTFhfUFNFVURPX0NPTE9SCQkweDgwMDQKKyNkZWZpbmUgR0xYX1NUQVRJQ19DT0xPUgkJMHg4MDA1CisjZGVmaW5lIEdMWF9HUkFZX1NDQUxFCQkJMHg4MDA2CisjZGVmaW5lIEdMWF9TVEFUSUNfR1JBWQkJCTB4ODAwNworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfUkdCCQkweDgwMDgKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYCQkweDgwMDkKKyNkZWZpbmUgR0xYX1ZJU1VBTF9JRAkJCTB4ODAwQgorI2RlZmluZSBHTFhfU0NSRUVOCQkJMHg4MDBDCisjZGVmaW5lIEdMWF9OT05fQ09ORk9STUFOVF9DT05GSUcJMHg4MDBECisjZGVmaW5lIEdMWF9EUkFXQUJMRV9UWVBFCQkweDgwMTAKKyNkZWZpbmUgR0xYX1JFTkRFUl9UWVBFCQkJMHg4MDExCisjZGVmaW5lIEdMWF9YX1JFTkRFUkFCTEUJCTB4ODAxMgorI2RlZmluZSBHTFhfRkJDT05GSUdfSUQJCQkweDgwMTMKKyNkZWZpbmUgR0xYX1JHQkFfVFlQRQkJCTB4ODAxNAorI2RlZmluZSBHTFhfQ09MT1JfSU5ERVhfVFlQRQkJMHg4MDE1CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9XSURUSAkJMHg4MDE2CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9IRUlHSFQJCTB4ODAxNworI2RlZmluZSBHTFhfTUFYX1BCVUZGRVJfUElYRUxTCQkweDgwMTgKKyNkZWZpbmUgR0xYX1BSRVNFUlZFRF9DT05URU5UUwkJMHg4MDFCCisjZGVmaW5lIEdMWF9MQVJHRVNUX1BCVUZGRVIJCTB4ODAxQworI2RlZmluZSBHTFhfV0lEVEgJCQkweDgwMUQKKyNkZWZpbmUgR0xYX0hFSUdIVAkJCTB4ODAxRQorI2RlZmluZSBHTFhfRVZFTlRfTUFTSwkJCTB4ODAxRgorI2RlZmluZSBHTFhfREFNQUdFRAkJCTB4ODAyMAorI2RlZmluZSBHTFhfU0FWRUQJCQkweDgwMjEKKyNkZWZpbmUgR0xYX1dJTkRPVwkJCTB4ODAyMgorI2RlZmluZSBHTFhfUEJVRkZFUgkJCTB4ODAyMworI2RlZmluZSBHTFhfUEJVRkZFUl9IRUlHSFQgICAgICAgICAgICAgIDB4ODA0MAorI2RlZmluZSBHTFhfUEJVRkZFUl9XSURUSCAgICAgICAgICAgICAgIDB4ODA0MQorI2RlZmluZSBHTFhfUkdCQV9CSVQJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9CSVQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1BCVUZGRVJfQ0xPQkJFUl9NQVNLCTB4MDgwMDAwMDAKKworCisvKgorICogR0xYIDEuNCBhbmQgbGF0ZXI6CisgKi8KKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAweDE4NmEwIC8qMTAwMDAwKi8KKyNkZWZpbmUgR0xYX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAweDE4NmExIC8qMTAwMDAxKi8KKworCisKK3R5cGVkZWYgc3RydWN0IF9fR0xYY29udGV4dFJlYyAqR0xYQ29udGV4dDsKK3R5cGVkZWYgWElEIEdMWFBpeG1hcDsKK3R5cGVkZWYgWElEIEdMWERyYXdhYmxlOworLyogR0xYIDEuMyBhbmQgbGF0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9fR0xYRkJDb25maWdSZWMgKkdMWEZCQ29uZmlnOwordHlwZWRlZiBYSUQgR0xYRkJDb25maWdJRDsKK3R5cGVkZWYgWElEIEdMWENvbnRleHRJRDsKK3R5cGVkZWYgWElEIEdMWFdpbmRvdzsKK3R5cGVkZWYgWElEIEdMWFBidWZmZXI7CisKKworCitleHRlcm4gWFZpc3VhbEluZm8qIGdsWENob29zZVZpc3VhbCggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLAorCQkJCSAgICAgaW50ICphdHRyaWJMaXN0ICk7CisKK2V4dGVybiBHTFhDb250ZXh0IGdsWENyZWF0ZUNvbnRleHQoIERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpcywKKwkJCQkgICAgR0xYQ29udGV4dCBzaGFyZUxpc3QsIEJvb2wgZGlyZWN0ICk7CisKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lDb250ZXh0KCBEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY3R4ICk7CisKK2V4dGVybiBCb29sIGdsWE1ha2VDdXJyZW50KCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLAorCQkJICAgIEdMWENvbnRleHQgY3R4KTsKKworZXh0ZXJuIHZvaWQgZ2xYQ29weUNvbnRleHQoIERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBzcmMsIEdMWENvbnRleHQgZHN0LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbWFzayApOworCitleHRlcm4gdm9pZCBnbFhTd2FwQnVmZmVycyggRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSApOworCitleHRlcm4gR0xYUGl4bWFwIGdsWENyZWF0ZUdMWFBpeG1hcCggRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzdWFsLAorCQkJCSAgICAgUGl4bWFwIHBpeG1hcCApOworCitleHRlcm4gdm9pZCBnbFhEZXN0cm95R0xYUGl4bWFwKCBEaXNwbGF5ICpkcHksIEdMWFBpeG1hcCBwaXhtYXAgKTsKKworZXh0ZXJuIEJvb2wgZ2xYUXVlcnlFeHRlbnNpb24oIERpc3BsYXkgKmRweSwgaW50ICplcnJvcmIsIGludCAqZXZlbnQgKTsKKworZXh0ZXJuIEJvb2wgZ2xYUXVlcnlWZXJzaW9uKCBEaXNwbGF5ICpkcHksIGludCAqbWFqLCBpbnQgKm1pbiApOworCitleHRlcm4gQm9vbCBnbFhJc0RpcmVjdCggRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGN0eCApOworCitleHRlcm4gaW50IGdsWEdldENvbmZpZyggRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzdWFsLAorCQkJIGludCBhdHRyaWIsIGludCAqdmFsdWUgKTsKKworZXh0ZXJuIEdMWENvbnRleHQgZ2xYR2V0Q3VycmVudENvbnRleHQoIHZvaWQgKTsKKworZXh0ZXJuIEdMWERyYXdhYmxlIGdsWEdldEN1cnJlbnREcmF3YWJsZSggdm9pZCApOworCitleHRlcm4gdm9pZCBnbFhXYWl0R0woIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgZ2xYV2FpdFgoIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgZ2xYVXNlWEZvbnQoIEZvbnQgZm9udCwgaW50IGZpcnN0LCBpbnQgY291bnQsIGludCBsaXN0ICk7CisKKworCisvKiBHTFggMS4xIGFuZCBsYXRlciAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZyggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuICk7CisKK2V4dGVybiBjb25zdCBjaGFyICpnbFhRdWVyeVNlcnZlclN0cmluZyggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgbmFtZSApOworCitleHRlcm4gY29uc3QgY2hhciAqZ2xYR2V0Q2xpZW50U3RyaW5nKCBEaXNwbGF5ICpkcHksIGludCBuYW1lICk7CisKKworLyogR0xYIDEuMiBhbmQgbGF0ZXIgKi8KK2V4dGVybiBEaXNwbGF5ICpnbFhHZXRDdXJyZW50RGlzcGxheSggdm9pZCApOworCisKKy8qIEdMWCAxLjMgYW5kIGxhdGVyICovCitleHRlcm4gR0xYRkJDb25maWcgKmdsWENob29zZUZCQ29uZmlnKCBEaXNwbGF5ICpkcHksIGludCBzY3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmF0dHJpYkxpc3QsIGludCAqbml0ZW1zICk7CisKK2V4dGVybiBpbnQgZ2xYR2V0RkJDb25maWdBdHRyaWIoIERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSApOworCitleHRlcm4gR0xYRkJDb25maWcgKmdsWEdldEZCQ29uZmlncyggRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmVsZW1lbnRzICk7CisKK2V4dGVybiBYVmlzdWFsSW5mbyAqZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnKCBEaXNwbGF5ICpkcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xYRkJDb25maWcgY29uZmlnICk7CisKK2V4dGVybiBHTFhXaW5kb3cgZ2xYQ3JlYXRlV2luZG93KCBEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgd2luLCBjb25zdCBpbnQgKmF0dHJpYkxpc3QgKTsKKworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVdpbmRvdyggRGlzcGxheSAqZHB5LCBHTFhXaW5kb3cgd2luZG93ICk7CisKK2V4dGVybiBHTFhQaXhtYXAgZ2xYQ3JlYXRlUGl4bWFwKCBEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhtYXAgcGl4bWFwLCBjb25zdCBpbnQgKmF0dHJpYkxpc3QgKTsKKworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVBpeG1hcCggRGlzcGxheSAqZHB5LCBHTFhQaXhtYXAgcGl4bWFwICk7CisKK2V4dGVybiBHTFhQYnVmZmVyIGdsWENyZWF0ZVBidWZmZXIoIERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICphdHRyaWJMaXN0ICk7CisKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lQYnVmZmVyKCBEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1ZiApOworCitleHRlcm4gdm9pZCBnbFhRdWVyeURyYXdhYmxlKCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIGludCBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnZhbHVlICk7CisKK2V4dGVybiBHTFhDb250ZXh0IGdsWENyZWF0ZU5ld0NvbnRleHQoIERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbmRlclR5cGUsIEdMWENvbnRleHQgc2hhcmVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbCBkaXJlY3QgKTsKKworZXh0ZXJuIEJvb2wgZ2xYTWFrZUNvbnRleHRDdXJyZW50KCBEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMWERyYXdhYmxlIHJlYWQsIEdMWENvbnRleHQgY3R4ICk7CisKK2V4dGVybiBHTFhEcmF3YWJsZSBnbFhHZXRDdXJyZW50UmVhZERyYXdhYmxlKCB2b2lkICk7CisKK2V4dGVybiBpbnQgZ2xYUXVlcnlDb250ZXh0KCBEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY3R4LCBpbnQgYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdmFsdWUgKTsKKworZXh0ZXJuIHZvaWQgZ2xYU2VsZWN0RXZlbnQoIERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtYXNrICk7CisKK2V4dGVybiB2b2lkIGdsWEdldFNlbGVjdGVkRXZlbnQoIERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICptYXNrICk7CisKKworLyogR0xYIDEuNCBhbmQgbGF0ZXIgKi8KK2V4dGVybiB2b2lkICgqZ2xYR2V0UHJvY0FkZHJlc3MoY29uc3QgR0x1Ynl0ZSAqcHJvY25hbWUpKSggdm9pZCApOworCisKKyNpZm5kZWYgR0xYX0dMWEVYVF9MRUdBQ1kKKworI2luY2x1ZGUgPEdML2dseGV4dC5oPgorCisjZWxzZQorCisKKworLyoKKyAqIEFSQiAyLiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyAqLworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyNkZWZpbmUgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzIDEKKwordHlwZWRlZiB2b2lkICgqX19HTFhleHRGdW5jUHRyKSh2b2lkKTsKK2V4dGVybiBfX0dMWGV4dEZ1bmNQdHIgZ2xYR2V0UHJvY0FkZHJlc3NBUkIgKGNvbnN0IEdMdWJ5dGUgKik7CisKKyNlbmRpZiAvKiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MgKi8KKworCisKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX0xFR0FDWSAqLworCisKKy8qKgorICoqIFRoZSBmb2xsb3dpbmcgYXJlbid0IGluIGdseGV4dC5oIHlldC4KKyAqKi8KKworCisvKgorICogPz8/LiBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlCisgKi8KKyNpZm5kZWYgR0xYX05WX3ZlcnRleF9hcnJheV9yYW5nZQorI2RlZmluZSBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlCisKK2V4dGVybiB2b2lkICpnbFhBbGxvY2F0ZU1lbW9yeU5WKEdMc2l6ZWkgc2l6ZSwgR0xmbG9hdCByZWFkZnJlcSwgR0xmbG9hdCB3cml0ZWZyZXEsIEdMZmxvYXQgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgZ2xYRnJlZU1lbW9yeU5WKEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKiAoICogUEZOR0xYQUxMT0NBVEVNRU1PUllOVlBST0MpIChHTHNpemVpIHNpemUsIEdMZmxvYXQgcmVhZGZyZXEsIEdMZmxvYXQgd3JpdGVmcmVxLCBHTGZsb2F0IHByaW9yaXR5KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYRlJFRU1FTU9SWU5WUFJPQykgKEdMdm9pZCAqcG9pbnRlcik7CisKKyNlbmRpZiAvKiBHTFhfTlZfdmVydGV4X2FycmF5X3JhbmdlICovCisKKworLyoKKyAqID8/Py4gR0xYX01FU0FfYWxsb2NhdGVfbWVtb3J5CisgKi8gCisjaWZuZGVmIEdMWF9NRVNBX2FsbG9jYXRlX21lbW9yeQorI2RlZmluZSBHTFhfTUVTQV9hbGxvY2F0ZV9tZW1vcnkgMQorCitleHRlcm4gdm9pZCAqZ2xYQWxsb2NhdGVNZW1vcnlNRVNBKERpc3BsYXkgKmRweSwgaW50IHNjcm4sIHNpemVfdCBzaXplLCBmbG9hdCByZWFkZnJlcSwgZmxvYXQgd3JpdGVmcmVxLCBmbG9hdCBwcmlvcml0eSk7CitleHRlcm4gdm9pZCBnbFhGcmVlTWVtb3J5TUVTQShEaXNwbGF5ICpkcHksIGludCBzY3JuLCB2b2lkICpwb2ludGVyKTsKK2V4dGVybiBHTHVpbnQgZ2xYR2V0TWVtb3J5T2Zmc2V0TUVTQShEaXNwbGF5ICpkcHksIGludCBzY3JuLCBjb25zdCB2b2lkICpwb2ludGVyKTsKK3R5cGVkZWYgdm9pZCAqICggKiBQRk5HTFhBTExPQ0FURU1FTU9SWU1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2Nybiwgc2l6ZV90IHNpemUsIGZsb2F0IHJlYWRmcmVxLCBmbG9hdCB3cml0ZWZyZXEsIGZsb2F0IHByaW9yaXR5KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYRlJFRU1FTU9SWU1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2Nybiwgdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIEdMdWludCAoKiBQRk5HTFhHRVRNRU1PUllPRkZTRVRNRVNBUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcm4sIGNvbnN0IHZvaWQgKnBvaW50ZXIpOworCisjZW5kaWYgLyogR0xYX01FU0FfYWxsb2NhdGVfbWVtb3J5ICovCisKKworLyoKKyAqIEFSQiA/LiBHTFhfQVJCX3JlbmRlcl90ZXh0dXJlCisgKiBYWFggVGhpcyB3YXMgbmV2ZXIgZmluYWxpemVkIQorICovCisjaWZuZGVmIEdMWF9BUkJfcmVuZGVyX3RleHR1cmUKKyNkZWZpbmUgR0xYX0FSQl9yZW5kZXJfdGV4dHVyZSAxCisKK2V4dGVybiBCb29sIGdsWEJpbmRUZXhJbWFnZUFSQihEaXNwbGF5ICpkcHksIEdMWFBidWZmZXIgcGJ1ZmZlciwgaW50IGJ1ZmZlcik7CitleHRlcm4gQm9vbCBnbFhSZWxlYXNlVGV4SW1hZ2VBUkIoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWZmZXIsIGludCBidWZmZXIpOworZXh0ZXJuIEJvb2wgZ2xYRHJhd2FibGVBdHRyaWJBUkIoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBjb25zdCBpbnQgKmF0dHJpYkxpc3QpOworCisjZW5kaWYgLyogR0xYX0FSQl9yZW5kZXJfdGV4dHVyZSAqLworCisKKy8qCisgKiBSZW1vdmUgdGhpcyB3aGVuIGdseGV4dC5oIGlzIHVwZGF0ZWQuCisgKi8KKyNpZm5kZWYgR0xYX05WX2Zsb2F0X2J1ZmZlcgorI2RlZmluZSBHTFhfTlZfZmxvYXRfYnVmZmVyIDEKKworI2RlZmluZSBHTFhfRkxPQVRfQ09NUE9ORU5UU19OViAgICAgICAgIDB4MjBCMAorCisjZW5kaWYgLyogR0xYX05WX2Zsb2F0X2J1ZmZlciAqLworCisKKworLyoKKyAqICM/LiBHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlCisgKi8KKyNpZm5kZWYgR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZQorI2RlZmluZSBHTFhfTUVTQV9zd2FwX2ZyYW1lX3VzYWdlIDEKKworZXh0ZXJuIGludCBnbFhHZXRGcmFtZVVzYWdlTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBmbG9hdCAqdXNhZ2UpOworZXh0ZXJuIGludCBnbFhCZWdpbkZyYW1lVHJhY2tpbmdNRVNBKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOworZXh0ZXJuIGludCBnbFhFbmRGcmFtZVRyYWNraW5nTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlKTsKK2V4dGVybiBpbnQgZ2xYUXVlcnlGcmFtZVRyYWNraW5nTUVTQShEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90ICpzd2FwQ291bnQsIGludDY0X3QgKm1pc3NlZEZyYW1lcywgZmxvYXQgKmxhc3RNaXNzZWRVc2FnZSk7CisKK3R5cGVkZWYgaW50ICgqUEZOR0xYR0VURlJBTUVVU0FHRU1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgZmxvYXQgKnVzYWdlKTsKK3R5cGVkZWYgaW50ICgqUEZOR0xYQkVHSU5GUkFNRVRSQUNLSU5HTUVTQVBST0MpKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOwordHlwZWRlZiBpbnQgKCpQRk5HTFhFTkRGUkFNRVRSQUNLSU5HTUVTQVBST0MpKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOwordHlwZWRlZiBpbnQgKCpQRk5HTFhRVUVSWUZSQU1FVFJBQ0tJTkdNRVNBUFJPQykoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCAqc3dhcENvdW50LCBpbnQ2NF90ICptaXNzZWRGcmFtZXMsIGZsb2F0ICpsYXN0TWlzc2VkVXNhZ2UpOworCisjZW5kaWYgLyogR0xYX01FU0Ffc3dhcF9mcmFtZV91c2FnZSAqLworCisKKworLyoKKyAqICM/LiBHTFhfTUVTQV9zd2FwX2NvbnRyb2wKKyAqLworI2lmbmRlZiBHTFhfTUVTQV9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgR0xYX01FU0Ffc3dhcF9jb250cm9sIDEKKworZXh0ZXJuIGludCBnbFhTd2FwSW50ZXJ2YWxNRVNBKHVuc2lnbmVkIGludCBpbnRlcnZhbCk7CitleHRlcm4gaW50IGdsWEdldFN3YXBJbnRlcnZhbE1FU0Eodm9pZCk7CisKK3R5cGVkZWYgaW50ICgqUEZOR0xYU1dBUElOVEVSVkFMTUVTQVBST0MpKHVuc2lnbmVkIGludCBpbnRlcnZhbCk7Cit0eXBlZGVmIGludCAoKlBGTkdMWEdFVFNXQVBJTlRFUlZBTE1FU0FQUk9DKSh2b2lkKTsKKworI2VuZGlmIC8qIEdMWF9NRVNBX3N3YXBfY29udHJvbCAqLworCisKKworLyoKKyAqICM/LiBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAKKyAqIFhYWCBub3QgZmluaXNoZWQ/CisgKi8KKyNpZm5kZWYgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwCisjZGVmaW5lIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCAxCisKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9SR0JfRVhUICAgICAgICAweDIwRDAKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9SR0JBX0VYVCAgICAgICAweDIwRDEKKyNkZWZpbmUgR0xYX0JJTkRfVE9fTUlQTUFQX1RFWFRVUkVfRVhUICAgICAweDIwRDIKKyNkZWZpbmUgR0xYX0JJTkRfVE9fVEVYVFVSRV9UQVJHRVRTX0VYVCAgICAweDIwRDMKKyNkZWZpbmUgR0xYX1lfSU5WRVJURURfRVhUICAgICAgICAgICAgICAgICAweDIwRDQKKworI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfRVhUICAgICAgICAgICAgIDB4MjBENQorI2RlZmluZSBHTFhfVEVYVFVSRV9UQVJHRVRfRVhUICAgICAgICAgICAgIDB4MjBENgorI2RlZmluZSBHTFhfTUlQTUFQX1RFWFRVUkVfRVhUICAgICAgICAgICAgIDB4MjBENworCisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9OT05FX0VYVCAgICAgICAgMHgyMEQ4CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9SR0JfRVhUICAgICAgICAgMHgyMEQ5CisjZGVmaW5lIEdMWF9URVhUVVJFX0ZPUk1BVF9SR0JBX0VYVCAgICAgICAgMHgyMERBCisKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMURfQklUX0VYVCAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9URVhUVVJFXzJEX0JJVF9FWFQgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfQklUX0VYVCAgICAgIDB4MDAwMDAwMDQKKworI2RlZmluZSBHTFhfVEVYVFVSRV8xRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBEQgorI2RlZmluZSBHTFhfVEVYVFVSRV8yRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBEQworI2RlZmluZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfRVhUICAgICAgICAgIDB4MjBERAorCisjZGVmaW5lIEdMWF9GUk9OVF9MRUZUX0VYVCAgICAgICAgICAgICAgICAgMHgyMERFCisjZGVmaW5lIEdMWF9GUk9OVF9SSUdIVF9FWFQgICAgICAgICAgICAgICAgMHgyMERGCisjZGVmaW5lIEdMWF9CQUNLX0xFRlRfRVhUICAgICAgICAgICAgICAgICAgMHgyMEUwCisjZGVmaW5lIEdMWF9CQUNLX1JJR0hUX0VYVCAgICAgICAgICAgICAgICAgMHgyMEUxCisjZGVmaW5lIEdMWF9GUk9OVF9FWFQgICAgICAgICAgICAgICAgICAgICAgR0xYX0ZST05UX0xFRlRfRVhUCisjZGVmaW5lIEdMWF9CQUNLX0VYVCAgICAgICAgICAgICAgICAgICAgICAgR0xYX0JBQ0tfTEVGVF9FWFQKKyNkZWZpbmUgR0xYX0FVWDBfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTIKKyNkZWZpbmUgR0xYX0FVWDFfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTMgCisjZGVmaW5lIEdMWF9BVVgyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU0IAorI2RlZmluZSBHTFhfQVVYM19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFNSAKKyNkZWZpbmUgR0xYX0FVWDRfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRTYgCisjZGVmaW5lIEdMWF9BVVg1X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU3IAorI2RlZmluZSBHTFhfQVVYNl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFOAorI2RlZmluZSBHTFhfQVVYN19FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4MjBFOSAKKyNkZWZpbmUgR0xYX0FVWDhfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDIwRUEgCisjZGVmaW5lIEdMWF9BVVg5X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEVCCisKK2V4dGVybiB2b2lkIGdsWEJpbmRUZXhJbWFnZUVYVChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK2V4dGVybiB2b2lkIGdsWFJlbGVhc2VUZXhJbWFnZUVYVChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyKTsKKworI2VuZGlmIC8qIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcCAqLworCisKKworCisvKioqIFNob3VsZCB0aGVzZSBnbyBoZXJlLCBvciBpbiBhbm90aGVyIGhlYWRlcj8gKi8KKy8qCisqKiBHTFggRXZlbnRzCisqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBldmVudF90eXBlOwkJLyogR0xYX0RBTUFHRUQgb3IgR0xYX1NBVkVEICovCisgICAgaW50IGRyYXdfdHlwZTsJCS8qIEdMWF9XSU5ET1cgb3IgR0xYX1BCVUZGRVIgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJCS8qIHRydWUgaWYgdGhpcyBjYW1lIGZvciBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBkaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgR0xYRHJhd2FibGUgZHJhd2FibGU7CS8qIFhJRCBvZiBEcmF3YWJsZSAqLworICAgIHVuc2lnbmVkIGludCBidWZmZXJfbWFzazsJLyogbWFzayBpbmRpY2F0aW5nIHdoaWNoIGJ1ZmZlcnMgYXJlIGFmZmVjdGVkICovCisgICAgdW5zaWduZWQgaW50IGF1eF9idWZmZXI7CS8qIHdoaWNoIGF1eCBidWZmZXIgd2FzIGFmZmVjdGVkICovCisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGNvdW50OwkJCS8qIGlmIG5vbnplcm8sIGF0IGxlYXN0IHRoaXMgbWFueSBtb3JlICovCit9IEdMWFBidWZmZXJDbG9iYmVyRXZlbnQ7CisKK3R5cGVkZWYgdW5pb24gX19HTFhFdmVudCB7CisgICAgR0xYUGJ1ZmZlckNsb2JiZXJFdmVudCBnbHhwYnVmZmVyY2xvYmJlcjsKKyAgICBsb25nIHBhZFsyNF07Cit9IEdMWEV2ZW50OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4X21hbmdsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhfbWFuZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzOWE5NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvR0wvZ2x4X21hbmdsZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBNZXNhIDMtRCBncmFwaGljcyBsaWJyYXJ5CisgKiBWZXJzaW9uOiAgNi41CisgKiAKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA2ICBCcmlhbiBQYXVsICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJSSUFOIFBBVUwgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisKKyNpZm5kZWYgR0xYX01BTkdMRV9ICisjZGVmaW5lIEdMWF9NQU5HTEVfSAorCisjZGVmaW5lIGdsWENob29zZVZpc3VhbCBtZ2xYQ2hvb3NlVmlzdWFsCisjZGVmaW5lIGdsWENyZWF0ZUNvbnRleHQgbWdsWENyZWF0ZUNvbnRleHQKKyNkZWZpbmUgZ2xYRGVzdHJveUNvbnRleHQgbWdsWERlc3Ryb3lDb250ZXh0CisjZGVmaW5lIGdsWE1ha2VDdXJyZW50IG1nbFhNYWtlQ3VycmVudAorI2RlZmluZSBnbFhDb3B5Q29udGV4dCBtZ2xYQ29weUNvbnRleHQKKyNkZWZpbmUgZ2xYU3dhcEJ1ZmZlcnMgbWdsWFN3YXBCdWZmZXJzCisjZGVmaW5lIGdsWENyZWF0ZUdMWFBpeG1hcCBtZ2xYQ3JlYXRlR0xYUGl4bWFwCisjZGVmaW5lIGdsWERlc3Ryb3lHTFhQaXhtYXAgbWdsWERlc3Ryb3lHTFhQaXhtYXAKKyNkZWZpbmUgZ2xYUXVlcnlFeHRlbnNpb24gbWdsWFF1ZXJ5RXh0ZW5zaW9uCisjZGVmaW5lIGdsWFF1ZXJ5VmVyc2lvbiBtZ2xYUXVlcnlWZXJzaW9uCisjZGVmaW5lIGdsWElzRGlyZWN0IG1nbFhJc0RpcmVjdAorI2RlZmluZSBnbFhHZXRDb25maWcgbWdsWEdldENvbmZpZworI2RlZmluZSBnbFhHZXRDdXJyZW50Q29udGV4dCBtZ2xYR2V0Q3VycmVudENvbnRleHQKKyNkZWZpbmUgZ2xYR2V0Q3VycmVudERyYXdhYmxlIG1nbFhHZXRDdXJyZW50RHJhd2FibGUKKyNkZWZpbmUgZ2xYV2FpdEdMIG1nbFhXYWl0R0wKKyNkZWZpbmUgZ2xYV2FpdFggbWdsWFdhaXRYCisjZGVmaW5lIGdsWFVzZVhGb250IG1nbFhVc2VYRm9udAorI2RlZmluZSBnbFhRdWVyeUV4dGVuc2lvbnNTdHJpbmcgbWdsWFF1ZXJ5RXh0ZW5zaW9uc1N0cmluZworI2RlZmluZSBnbFhRdWVyeVNlcnZlclN0cmluZyBtZ2xYUXVlcnlTZXJ2ZXJTdHJpbmcKKyNkZWZpbmUgZ2xYR2V0Q2xpZW50U3RyaW5nIG1nbFhHZXRDbGllbnRTdHJpbmcKKyNkZWZpbmUgZ2xYQ3JlYXRlR0xYUGl4bWFwTUVTQSBtZ2xYQ3JlYXRlR0xYUGl4bWFwTUVTQQorI2RlZmluZSBnbFhSZWxlYXNlQnVmZmVyc01FU0EgbWdsWFJlbGVhc2VCdWZmZXJzTUVTQQorI2RlZmluZSBnbFhDb3B5U3ViQnVmZmVyTUVTQSBtZ2xYQ29weVN1YkJ1ZmZlck1FU0EKKyNkZWZpbmUgZ2xYR2V0VmlkZW9TeW5jU0dJIG1nbFhHZXRWaWRlb1N5bmNTR0kKKyNkZWZpbmUgZ2xYV2FpdFZpZGVvU3luY1NHSSBtZ2xYV2FpdFZpZGVvU3luY1NHSQorCisvKiBHTFggMS4yICovCisjZGVmaW5lIGdsWEdldEN1cnJlbnREaXNwbGF5IG1nbFhHZXRDdXJyZW50RGlzcGxheSAKKworLyogR0xYIDEuMyAqLworI2RlZmluZSBnbFhDaG9vc2VGQkNvbmZpZyBtZ2xYQ2hvb3NlRkJDb25maWcgICAgICAgICAgCisjZGVmaW5lIGdsWEdldEZCQ29uZmlnQXR0cmliIG1nbFhHZXRGQkNvbmZpZ0F0dHJpYiAgICAgICAKKyNkZWZpbmUgZ2xYR2V0RkJDb25maWdzIG1nbFhHZXRGQkNvbmZpZ3MgICAgICAgICAgICAKKyNkZWZpbmUgZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnIG1nbFhHZXRWaXN1YWxGcm9tRkJDb25maWcgICAKKyNkZWZpbmUgZ2xYQ3JlYXRlV2luZG93IG1nbFhDcmVhdGVXaW5kb3cgICAgICAgICAgICAKKyNkZWZpbmUgZ2xYRGVzdHJveVdpbmRvdyBtZ2xYRGVzdHJveVdpbmRvdyAgICAgICAgICAgCisjZGVmaW5lIGdsWENyZWF0ZVBpeG1hcCBtZ2xYQ3JlYXRlUGl4bWFwICAgICAgICAgICAgCisjZGVmaW5lIGdsWERlc3Ryb3lQaXhtYXAgbWdsWERlc3Ryb3lQaXhtYXAgICAgICAgICAgIAorI2RlZmluZSBnbFhDcmVhdGVQYnVmZmVyIG1nbFhDcmVhdGVQYnVmZmVyICAgICAgICAgICAKKyNkZWZpbmUgZ2xYRGVzdHJveVBidWZmZXIgbWdsWERlc3Ryb3lQYnVmZmVyICAgICAgICAgIAorI2RlZmluZSBnbFhRdWVyeURyYXdhYmxlIG1nbFhRdWVyeURyYXdhYmxlICAgICAgICAgICAKKyNkZWZpbmUgZ2xYQ3JlYXRlTmV3Q29udGV4dCBtZ2xYQ3JlYXRlTmV3Q29udGV4dCAgICAgICAgCisjZGVmaW5lIGdsWE1ha2VDb250ZXh0Q3VycmVudCBtZ2xYTWFrZUNvbnRleHRDdXJyZW50ICAgICAgCisjZGVmaW5lIGdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGUgbWdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGUgIAorI2RlZmluZSBnbFhRdWVyeUNvbnRleHQgbWdsWFF1ZXJ5Q29udGV4dCAgICAgICAgICAgIAorI2RlZmluZSBnbFhTZWxlY3RFdmVudCBtZ2xYU2VsZWN0RXZlbnQgICAgICAgICAgICAgCisjZGVmaW5lIGdsWEdldFNlbGVjdGVkRXZlbnQgbWdsWEdldFNlbGVjdGVkRXZlbnQgICAgCisKKy8qIEdMWCAxLjQgKi8KKyNkZWZpbmUgZ2xYR2V0UHJvY0FkZHJlc3MgbWdsWEdldFByb2NBZGRyZXNzCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL0dML2dseGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjY2ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9HTC9nbHhleHQuaApAQCAtMCwwICsxLDc4NSBAQAorI2lmbmRlZiBfX2dseGV4dF9oXworI2RlZmluZSBfX2dseGV4dF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKiogCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKiogCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKiogCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChBUElFTlRSWSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgQVBJRU5UUlkKKyNkZWZpbmUgQVBJRU5UUlkKKyNlbmRpZgorI2lmbmRlZiBBUElFTlRSWVAKKyNkZWZpbmUgQVBJRU5UUllQIEFQSUVOVFJZICoKKyNlbmRpZgorI2lmbmRlZiBHTEFQSQorI2RlZmluZSBHTEFQSSBleHRlcm4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGVhZGVyIGZpbGUgdmVyc2lvbiBudW1iZXIsIHJlcXVpcmVkIGJ5IE9wZW5HTCBBQkkgZm9yIExpbnV4ICovCisvKiBnbHhleHQuaCBsYXN0IHVwZGF0ZWQgMjAwNy8wNC8yMSAqLworLyogQ3VycmVudCB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cub3BlbmdsLm9yZy9yZWdpc3RyeS8gKi8KKyNkZWZpbmUgR0xYX0dMWEVYVF9WRVJTSU9OIDE5CisKKyNpZm5kZWYgR0xYX1ZFUlNJT05fMV8zCisjZGVmaW5lIEdMWF9XSU5ET1dfQklUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfUElYTUFQX0JJVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1BCVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9SR0JBX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfQ09MT1JfSU5ERVhfQklUICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX1BCVUZGRVJfQ0xPQkJFUl9NQVNLICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEdMWF9GUk9OVF9MRUZUX0JVRkZFUl9CSVQgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfRlJPTlRfUklHSFRfQlVGRkVSX0JJVCAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9CQUNLX1JJR0hUX0JVRkZFUl9CSVQgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTFhfQVVYX0JVRkZFUlNfQklUICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgR0xYX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTFhfQUNDVU1fQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgR0xYX0NPTkZJR19DQVZFQVQgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEdMWF9YX1ZJU1VBTF9UWVBFICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfVFlQRSAgICAgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYX1ZBTFVFICAgICAgICAweDI0CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9SRURfVkFMVUUgICAgICAgICAgMHgyNQorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgICAgIDB4MjYKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgICAgICAgICAweDI3CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRSAgICAgICAgMHgyOAorI2RlZmluZSBHTFhfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgR0xYX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgR0xYX1NMT1dfQ09ORklHICAgICAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgR0xYX1RSVUVfQ09MT1IgICAgICAgICAgICAgICAgICAgICAweDgwMDIKKyNkZWZpbmUgR0xYX0RJUkVDVF9DT0xPUiAgICAgICAgICAgICAgICAgICAweDgwMDMKKyNkZWZpbmUgR0xYX1BTRVVET19DT0xPUiAgICAgICAgICAgICAgICAgICAweDgwMDQKKyNkZWZpbmUgR0xYX1NUQVRJQ19DT0xPUiAgICAgICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgR0xYX0dSQVlfU0NBTEUgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xYX1NUQVRJQ19HUkFZICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JHQiAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0lOREVYICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xYX1ZJU1VBTF9JRCAgICAgICAgICAgICAgICAgICAgICAweDgwMEIKKyNkZWZpbmUgR0xYX1NDUkVFTiAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEMKKyNkZWZpbmUgR0xYX05PTl9DT05GT1JNQU5UX0NPTkZJRyAgICAgICAgICAweDgwMEQKKyNkZWZpbmUgR0xYX0RSQVdBQkxFX1RZUEUgICAgICAgICAgICAgICAgICAweDgwMTAKKyNkZWZpbmUgR0xYX1JFTkRFUl9UWVBFICAgICAgICAgICAgICAgICAgICAweDgwMTEKKyNkZWZpbmUgR0xYX1hfUkVOREVSQUJMRSAgICAgICAgICAgICAgICAgICAweDgwMTIKKyNkZWZpbmUgR0xYX0ZCQ09ORklHX0lEICAgICAgICAgICAgICAgICAgICAweDgwMTMKKyNkZWZpbmUgR0xYX1JHQkFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAweDgwMTQKKyNkZWZpbmUgR0xYX0NPTE9SX0lOREVYX1RZUEUgICAgICAgICAgICAgICAweDgwMTUKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX1dJRFRIICAgICAgICAgICAgICAweDgwMTYKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX0hFSUdIVCAgICAgICAgICAgICAweDgwMTcKKyNkZWZpbmUgR0xYX01BWF9QQlVGRkVSX1BJWEVMUyAgICAgICAgICAgICAweDgwMTgKKyNkZWZpbmUgR0xYX1BSRVNFUlZFRF9DT05URU5UUyAgICAgICAgICAgICAweDgwMUIKKyNkZWZpbmUgR0xYX0xBUkdFU1RfUEJVRkZFUiAgICAgICAgICAgICAgICAweDgwMUMKKyNkZWZpbmUgR0xYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMUQKKyNkZWZpbmUgR0xYX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMUUKKyNkZWZpbmUgR0xYX0VWRU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMUYKKyNkZWZpbmUgR0xYX0RBTUFHRUQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMjAKKyNkZWZpbmUgR0xYX1NBVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMjEKKyNkZWZpbmUgR0xYX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMjIKKyNkZWZpbmUgR0xYX1BCVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAweDgwMjMKKyNkZWZpbmUgR0xYX1BCVUZGRVJfSEVJR0hUICAgICAgICAgICAgICAgICAweDgwNDAKKyNkZWZpbmUgR0xYX1BCVUZGRVJfV0lEVEggICAgICAgICAgICAgICAgICAweDgwNDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9WRVJTSU9OXzFfNAorI2RlZmluZSBHTFhfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDEwMDAwMAorI2RlZmluZSBHTFhfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzCisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX211bHRpc2FtcGxlCisjZGVmaW5lIEdMWF9TQU1QTEVfQlVGRkVSU19BUkIgICAgICAgICAgICAgMTAwMDAwCisjZGVmaW5lIEdMWF9TQU1QTEVTX0FSQiAgICAgICAgICAgICAgICAgICAgMTAwMDAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2ZiY29uZmlnX2Zsb2F0CisjZGVmaW5lIEdMWF9SR0JBX0ZMT0FUX1RZUEVfQVJCICAgICAgICAgICAgMHgyMEI5CisjZGVmaW5lIEdMWF9SR0JBX0ZMT0FUX0JJVF9BUkIgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVNfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTX1NHSVMgICAgICAgICAgICAxMDAwMDAKKyNkZWZpbmUgR0xYX1NBTVBMRVNfU0dJUyAgICAgICAgICAgICAgICAgICAxMDAwMDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfdmlzdWFsX2luZm8KKyNkZWZpbmUgR0xYX1hfVklTVUFMX1RZUEVfRVhUICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9UWVBFX0VYVCAgICAgICAgICAgMHgyMworI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfSU5ERVhfVkFMVUVfRVhUICAgIDB4MjQKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX1JFRF9WQUxVRV9FWFQgICAgICAweDI1CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRV9FWFQgICAgMHgyNgorI2RlZmluZSBHTFhfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRV9FWFQgICAgIDB4MjcKKyNkZWZpbmUgR0xYX1RSQU5TUEFSRU5UX0FMUEhBX1ZBTFVFX0VYVCAgICAweDI4CisjZGVmaW5lIEdMWF9OT05FX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEdMWF9UUlVFX0NPTE9SX0VYVCAgICAgICAgICAgICAgICAgMHg4MDAyCisjZGVmaW5lIEdMWF9ESVJFQ1RfQ09MT1JfRVhUICAgICAgICAgICAgICAgMHg4MDAzCisjZGVmaW5lIEdMWF9QU0VVRE9fQ09MT1JfRVhUICAgICAgICAgICAgICAgMHg4MDA0CisjZGVmaW5lIEdMWF9TVEFUSUNfQ09MT1JfRVhUICAgICAgICAgICAgICAgMHg4MDA1CisjZGVmaW5lIEdMWF9HUkFZX1NDQUxFX0VYVCAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMWF9TVEFUSUNfR1JBWV9FWFQgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9SR0JfRVhUICAgICAgICAgICAgMHg4MDA4CisjZGVmaW5lIEdMWF9UUkFOU1BBUkVOVF9JTkRFWF9FWFQgICAgICAgICAgMHg4MDA5CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX3N3YXBfY29udHJvbAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV92aWRlb19zeW5jCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX21ha2VfY3VycmVudF9yZWFkCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF92aWRlb19zb3VyY2UKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfdmlzdWFsX3JhdGluZworI2RlZmluZSBHTFhfVklTVUFMX0NBVkVBVF9FWFQgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgR0xYX1NMT1dfVklTVUFMX0VYVCAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgR0xYX05PTl9DT05GT1JNQU5UX1ZJU1VBTF9FWFQgICAgICAweDgwMEQKKy8qIHJldXNlIEdMWF9OT05FX0VYVCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9pbXBvcnRfY29udGV4dAorI2RlZmluZSBHTFhfU0hBUkVfQ09OVEVYVF9FWFQgICAgICAgICAgICAgIDB4ODAwQQorI2RlZmluZSBHTFhfVklTVUFMX0lEX0VYVCAgICAgICAgICAgICAgICAgIDB4ODAwQgorI2RlZmluZSBHTFhfU0NSRUVOX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODAwQworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfZmJjb25maWcKKyNkZWZpbmUgR0xYX1dJTkRPV19CSVRfU0dJWCAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMWF9QSVhNQVBfQklUX1NHSVggICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTFhfUkdCQV9CSVRfU0dJWCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0NPTE9SX0lOREVYX0JJVF9TR0lYICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9EUkFXQUJMRV9UWVBFX1NHSVggICAgICAgICAgICAgMHg4MDEwCisjZGVmaW5lIEdMWF9SRU5ERVJfVFlQRV9TR0lYICAgICAgICAgICAgICAgMHg4MDExCisjZGVmaW5lIEdMWF9YX1JFTkRFUkFCTEVfU0dJWCAgICAgICAgICAgICAgMHg4MDEyCisjZGVmaW5lIEdMWF9GQkNPTkZJR19JRF9TR0lYICAgICAgICAgICAgICAgMHg4MDEzCisjZGVmaW5lIEdMWF9SR0JBX1RZUEVfU0dJWCAgICAgICAgICAgICAgICAgMHg4MDE0CisjZGVmaW5lIEdMWF9DT0xPUl9JTkRFWF9UWVBFX1NHSVggICAgICAgICAgMHg4MDE1CisvKiByZXVzZSBHTFhfU0NSRUVOX0VYVCAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfcGJ1ZmZlcgorI2RlZmluZSBHTFhfUEJVRkZFUl9CSVRfU0dJWCAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xYX0JVRkZFUl9DTE9CQkVSX01BU0tfU0dJWCAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEdMWF9GUk9OVF9MRUZUX0JVRkZFUl9CSVRfU0dJWCAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfRlJPTlRfUklHSFRfQlVGRkVSX0JJVF9TR0lYICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0JBQ0tfTEVGVF9CVUZGRVJfQklUX1NHSVggICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEdMWF9CQUNLX1JJR0hUX0JVRkZFUl9CSVRfU0dJWCAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTFhfQVVYX0JVRkZFUlNfQklUX1NHSVggICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgR0xYX0RFUFRIX0JVRkZFUl9CSVRfU0dJWCAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEdMWF9TVEVOQ0lMX0JVRkZFUl9CSVRfU0dJWCAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBHTFhfQUNDVU1fQlVGRkVSX0JJVF9TR0lYICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgR0xYX1NBTVBMRV9CVUZGRVJTX0JJVF9TR0lYICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9XSURUSF9TR0lYICAgICAgICAgMHg4MDE2CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9IRUlHSFRfU0dJWCAgICAgICAgMHg4MDE3CisjZGVmaW5lIEdMWF9NQVhfUEJVRkZFUl9QSVhFTFNfU0dJWCAgICAgICAgMHg4MDE4CisjZGVmaW5lIEdMWF9PUFRJTUFMX1BCVUZGRVJfV0lEVEhfU0dJWCAgICAgMHg4MDE5CisjZGVmaW5lIEdMWF9PUFRJTUFMX1BCVUZGRVJfSEVJR0hUX1NHSVggICAgMHg4MDFBCisjZGVmaW5lIEdMWF9QUkVTRVJWRURfQ09OVEVOVFNfU0dJWCAgICAgICAgMHg4MDFCCisjZGVmaW5lIEdMWF9MQVJHRVNUX1BCVUZGRVJfU0dJWCAgICAgICAgICAgMHg4MDFDCisjZGVmaW5lIEdMWF9XSURUSF9TR0lYICAgICAgICAgICAgICAgICAgICAgMHg4MDFECisjZGVmaW5lIEdMWF9IRUlHSFRfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MDFFCisjZGVmaW5lIEdMWF9FVkVOVF9NQVNLX1NHSVggICAgICAgICAgICAgICAgMHg4MDFGCisjZGVmaW5lIEdMWF9EQU1BR0VEX1NHSVggICAgICAgICAgICAgICAgICAgMHg4MDIwCisjZGVmaW5lIEdMWF9TQVZFRF9TR0lYICAgICAgICAgICAgICAgICAgICAgMHg4MDIxCisjZGVmaW5lIEdMWF9XSU5ET1dfU0dJWCAgICAgICAgICAgICAgICAgICAgMHg4MDIyCisjZGVmaW5lIEdMWF9QQlVGRkVSX1NHSVggICAgICAgICAgICAgICAgICAgMHg4MDIzCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX2N1c2hpb24KKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3ZpZGVvX3Jlc2l6ZQorI2RlZmluZSBHTFhfU1lOQ19GUkFNRV9TR0lYICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgR0xYX1NZTkNfU1dBUF9TR0lYICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9kbWJ1ZmZlcgorI2RlZmluZSBHTFhfRElHSVRBTF9NRURJQV9QQlVGRkVSX1NHSVggICAgIDB4ODAyNAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfc3dhcF9ncm91cAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfc3dhcF9iYXJyaWVyCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJU19ibGVuZGVkX292ZXJsYXkKKyNkZWZpbmUgR0xYX0JMRU5ERURfUkdCQV9TR0lTICAgICAgICAgICAgICAweDgwMjUKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lTX3NoYXJlZF9tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfTVVMVElTQU1QTEVfU1VCX1JFQ1RfV0lEVEhfU0dJUyAweDgwMjYKKyNkZWZpbmUgR0xYX01VTFRJU0FNUExFX1NVQl9SRUNUX0hFSUdIVF9TR0lTIDB4ODAyNworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NVTl9nZXRfdHJhbnNwYXJlbnRfaW5kZXgKKyNlbmRpZgorCisjaWZuZGVmIEdMWF8zREZYX211bHRpc2FtcGxlCisjZGVmaW5lIEdMWF9TQU1QTEVfQlVGRkVSU18zREZYICAgICAgICAgICAgMHg4MDUwCisjZGVmaW5lIEdMWF9TQU1QTEVTXzNERlggICAgICAgICAgICAgICAgICAgMHg4MDUxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9jb3B5X3N1Yl9idWZmZXIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3BpeG1hcF9jb2xvcm1hcAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfcmVsZWFzZV9idWZmZXJzCisjZW5kaWYKKworI2lmbmRlZiBHTFhfTUVTQV9zZXRfM2RmeF9tb2RlCisjZGVmaW5lIEdMWF8zREZYX1dJTkRPV19NT0RFX01FU0EgICAgICAgICAgMHgxCisjZGVmaW5lIEdMWF8zREZYX0ZVTExTQ1JFRU5fTU9ERV9NRVNBICAgICAgMHgyCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF92aXN1YWxfc2VsZWN0X2dyb3VwCisjZGVmaW5lIEdMWF9WSVNVQUxfU0VMRUNUX0dST1VQX1NHSVggICAgICAgMHg4MDI4CisjZW5kaWYKKworI2lmbmRlZiBHTFhfT01MX3N3YXBfbWV0aG9kCisjZGVmaW5lIEdMWF9TV0FQX01FVEhPRF9PTUwgICAgICAgICAgICAgICAgMHg4MDYwCisjZGVmaW5lIEdMWF9TV0FQX0VYQ0hBTkdFX09NTCAgICAgICAgICAgICAgMHg4MDYxCisjZGVmaW5lIEdMWF9TV0FQX0NPUFlfT01MICAgICAgICAgICAgICAgICAgMHg4MDYyCisjZGVmaW5lIEdMWF9TV0FQX1VOREVGSU5FRF9PTUwgICAgICAgICAgICAgMHg4MDYzCisjZW5kaWYKKworI2lmbmRlZiBHTFhfT01MX3N5bmNfY29udHJvbAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX05WX2Zsb2F0X2J1ZmZlcgorI2RlZmluZSBHTFhfRkxPQVRfQ09NUE9ORU5UU19OViAgICAgICAgICAgIDB4MjBCMAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfaHlwZXJwaXBlCisjZGVmaW5lIEdMWF9IWVBFUlBJUEVfUElQRV9OQU1FX0xFTkdUSF9TR0lYIDgwCisjZGVmaW5lIEdMWF9CQURfSFlQRVJQSVBFX0NPTkZJR19TR0lYICAgICAgOTEKKyNkZWZpbmUgR0xYX0JBRF9IWVBFUlBJUEVfU0dJWCAgICAgICAgICAgICA5MgorI2RlZmluZSBHTFhfSFlQRVJQSVBFX0RJU1BMQVlfUElQRV9TR0lYICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX0hZUEVSUElQRV9SRU5ERVJfUElQRV9TR0lYICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9QSVBFX1JFQ1RfU0dJWCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTFhfUElQRV9SRUNUX0xJTUlUU19TR0lYICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xYX0hZUEVSUElQRV9TVEVSRU9fU0dJWCAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEdMWF9IWVBFUlBJUEVfUElYRUxfQVZFUkFHRV9TR0lYICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfSFlQRVJQSVBFX0lEX1NHSVggICAgICAgICAgICAgIDB4ODAzMAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfYWdwX29mZnNldAorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9mYmNvbmZpZ19wYWNrZWRfZmxvYXQKKyNkZWZpbmUgR0xYX1JHQkFfVU5TSUdORURfRkxPQVRfVFlQRV9FWFQgICAweDIwQjEKKyNkZWZpbmUgR0xYX1JHQkFfVU5TSUdORURfRkxPQVRfQklUX0VYVCAgICAweDAwMDAwMDA4CisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgR0xYX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRV9FWFQgICAweDIwQjIKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfdGV4dHVyZV9mcm9tX3BpeG1hcAorI2RlZmluZSBHTFhfVEVYVFVSRV8xRF9CSVRfRVhUICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xYX1RFWFRVUkVfMkRfQklUX0VYVCAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMWF9URVhUVVJFX1JFQ1RBTkdMRV9CSVRfRVhUICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTFhfQklORF9UT19URVhUVVJFX1JHQl9FWFQgICAgICAgIDB4MjBEMAorI2RlZmluZSBHTFhfQklORF9UT19URVhUVVJFX1JHQkFfRVhUICAgICAgIDB4MjBEMQorI2RlZmluZSBHTFhfQklORF9UT19NSVBNQVBfVEVYVFVSRV9FWFQgICAgIDB4MjBEMgorI2RlZmluZSBHTFhfQklORF9UT19URVhUVVJFX1RBUkdFVFNfRVhUICAgIDB4MjBEMworI2RlZmluZSBHTFhfWV9JTlZFUlRFRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBENAorI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfRVhUICAgICAgICAgICAgIDB4MjBENQorI2RlZmluZSBHTFhfVEVYVFVSRV9UQVJHRVRfRVhUICAgICAgICAgICAgIDB4MjBENgorI2RlZmluZSBHTFhfTUlQTUFQX1RFWFRVUkVfRVhUICAgICAgICAgICAgIDB4MjBENworI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfTk9ORV9FWFQgICAgICAgIDB4MjBEOAorI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfUkdCX0VYVCAgICAgICAgIDB4MjBEOQorI2RlZmluZSBHTFhfVEVYVFVSRV9GT1JNQVRfUkdCQV9FWFQgICAgICAgIDB4MjBEQQorI2RlZmluZSBHTFhfVEVYVFVSRV8xRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBEQgorI2RlZmluZSBHTFhfVEVYVFVSRV8yRF9FWFQgICAgICAgICAgICAgICAgIDB4MjBEQworI2RlZmluZSBHTFhfVEVYVFVSRV9SRUNUQU5HTEVfRVhUICAgICAgICAgIDB4MjBERAorI2RlZmluZSBHTFhfRlJPTlRfTEVGVF9FWFQgICAgICAgICAgICAgICAgIDB4MjBERQorI2RlZmluZSBHTFhfRlJPTlRfUklHSFRfRVhUICAgICAgICAgICAgICAgIDB4MjBERgorI2RlZmluZSBHTFhfQkFDS19MRUZUX0VYVCAgICAgICAgICAgICAgICAgIDB4MjBFMAorI2RlZmluZSBHTFhfQkFDS19SSUdIVF9FWFQgICAgICAgICAgICAgICAgIDB4MjBFMQorI2RlZmluZSBHTFhfRlJPTlRfRVhUICAgICAgICAgICAgICAgICAgICAgIEdMWF9GUk9OVF9MRUZUX0VYVAorI2RlZmluZSBHTFhfQkFDS19FWFQgICAgICAgICAgICAgICAgICAgICAgIEdMWF9CQUNLX0xFRlRfRVhUCisjZGVmaW5lIEdMWF9BVVgwX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEUyCisjZGVmaW5lIEdMWF9BVVgxX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEUzCisjZGVmaW5lIEdMWF9BVVgyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU0CisjZGVmaW5lIEdMWF9BVVgzX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU1CisjZGVmaW5lIEdMWF9BVVg0X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU2CisjZGVmaW5lIEdMWF9BVVg1X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU3CisjZGVmaW5lIEdMWF9BVVg2X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU4CisjZGVmaW5lIEdMWF9BVVg3X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEU5CisjZGVmaW5lIEdMWF9BVVg4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEVBCisjZGVmaW5lIEdMWF9BVVg5X0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMEVCCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKK3R5cGVkZWYgdm9pZCAoKl9fR0xYZXh0RnVuY1B0cikodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF92aWRlb19zb3VyY2UKK3R5cGVkZWYgWElEIEdMWFZpZGVvU291cmNlU0dJWDsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2ZiY29uZmlnCit0eXBlZGVmIFhJRCBHTFhGQkNvbmZpZ0lEU0dJWDsKK3R5cGVkZWYgc3RydWN0IF9fR0xYRkJDb25maWdSZWMgKkdMWEZCQ29uZmlnU0dJWDsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3BidWZmZXIKK3R5cGVkZWYgWElEIEdMWFBidWZmZXJTR0lYOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZvciBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkgIC8qIGRpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBHTFhEcmF3YWJsZSBkcmF3YWJsZTsJICAvKiBpLmQuIG9mIERyYXdhYmxlICovCisgICAgaW50IGV2ZW50X3R5cGU7CQkgIC8qIEdMWF9EQU1BR0VEX1NHSVggb3IgR0xYX1NBVkVEX1NHSVggKi8KKyAgICBpbnQgZHJhd190eXBlOwkJICAvKiBHTFhfV0lORE9XX1NHSVggb3IgR0xYX1BCVUZGRVJfU0dJWCAqLworICAgIHVuc2lnbmVkIGludCBtYXNrOwkgIC8qIG1hc2sgaW5kaWNhdGluZyB3aGljaCBidWZmZXJzIGFyZSBhZmZlY3RlZCovCisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGNvdW50OwkJICAvKiBpZiBub256ZXJvLCBhdCBsZWFzdCB0aGlzIG1hbnkgbW9yZSAqLworfSBHTFhCdWZmZXJDbG9iYmVyRXZlbnRTR0lYOworI2VuZGlmCisKKyNpZm5kZWYgR0xFWFRfNjRfVFlQRVNfREVGSU5FRAorLyogVGhpcyBjb2RlIGJsb2NrIGlzIGR1cGxpY2F0ZWQgaW4gZ2x4ZXh0LmgsIHNvIG11c3QgYmUgcHJvdGVjdGVkICovCisjZGVmaW5lIEdMRVhUXzY0X1RZUEVTX0RFRklORUQKKy8qIERlZmluZSBpbnQzMl90LCBpbnQ2NF90LCBhbmQgdWludDY0X3QgdHlwZXMgZm9yIFVTVC9NU0MgKi8KKy8qIChhcyB1c2VkIGluIHRoZSBHTFhfT01MX3N5bmNfY29udHJvbCBleHRlbnNpb24pLiAqLworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIGRlZmluZWQoX19zdW5fXykgfHwgZGVmaW5lZChfX2RpZ2l0YWxfXykKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2lmIGRlZmluZWQoX19TVERDX18pCisjaWYgZGVmaW5lZChfX2FyY2g2NF9fKQordHlwZWRlZiBsb25nIGludCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1aW50NjRfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1aW50NjRfdDsKKyNlbmRpZiAvKiBfX2FyY2g2NF9fICovCisjZW5kaWYgLyogX19TVERDX18gKi8KKyNlbGlmIGRlZmluZWQoIF9fVk1TICkKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVVNMQ19fKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgZGVmaW5lZChfX1VOSVhPUzJfXykgfHwgZGVmaW5lZChfX1NPTDY0X18pCit0eXBlZGVmIGxvbmcgaW50IGludDMyX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1aW50NjRfdDsKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKF9fR05VQ19fKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgZGVmaW5lZChfV0lOMzIpCit0eXBlZGVmIF9faW50MzIgaW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NF90OworI2Vsc2UKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPiAgICAgLyogRmFsbGJhY2sgb3B0aW9uICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9WRVJTSU9OXzFfMworI2RlZmluZSBHTFhfVkVSU0lPTl8xXzMgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWEZCQ29uZmlnICogZ2xYR2V0RkJDb25maWdzIChEaXNwbGF5ICosIGludCwgaW50ICopOworZXh0ZXJuIEdMWEZCQ29uZmlnICogZ2xYQ2hvb3NlRkJDb25maWcgKERpc3BsYXkgKiwgaW50LCBjb25zdCBpbnQgKiwgaW50ICopOworZXh0ZXJuIGludCBnbFhHZXRGQkNvbmZpZ0F0dHJpYiAoRGlzcGxheSAqLCBHTFhGQkNvbmZpZywgaW50LCBpbnQgKik7CitleHRlcm4gWFZpc3VhbEluZm8gKiBnbFhHZXRWaXN1YWxGcm9tRkJDb25maWcgKERpc3BsYXkgKiwgR0xYRkJDb25maWcpOworZXh0ZXJuIEdMWFdpbmRvdyBnbFhDcmVhdGVXaW5kb3cgKERpc3BsYXkgKiwgR0xYRkJDb25maWcsIFdpbmRvdywgY29uc3QgaW50ICopOworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVdpbmRvdyAoRGlzcGxheSAqLCBHTFhXaW5kb3cpOworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVQaXhtYXAgKERpc3BsYXkgKiwgR0xYRkJDb25maWcsIFBpeG1hcCwgY29uc3QgaW50ICopOworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVBpeG1hcCAoRGlzcGxheSAqLCBHTFhQaXhtYXApOworZXh0ZXJuIEdMWFBidWZmZXIgZ2xYQ3JlYXRlUGJ1ZmZlciAoRGlzcGxheSAqLCBHTFhGQkNvbmZpZywgY29uc3QgaW50ICopOworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveVBidWZmZXIgKERpc3BsYXkgKiwgR0xYUGJ1ZmZlcik7CitleHRlcm4gdm9pZCBnbFhRdWVyeURyYXdhYmxlIChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCBpbnQsIHVuc2lnbmVkIGludCAqKTsKK2V4dGVybiBHTFhDb250ZXh0IGdsWENyZWF0ZU5ld0NvbnRleHQgKERpc3BsYXkgKiwgR0xYRkJDb25maWcsIGludCwgR0xYQ29udGV4dCwgQm9vbCk7CitleHRlcm4gQm9vbCBnbFhNYWtlQ29udGV4dEN1cnJlbnQgKERpc3BsYXkgKiwgR0xYRHJhd2FibGUsIEdMWERyYXdhYmxlLCBHTFhDb250ZXh0KTsKK2V4dGVybiBHTFhEcmF3YWJsZSBnbFhHZXRDdXJyZW50UmVhZERyYXdhYmxlICh2b2lkKTsKK2V4dGVybiBEaXNwbGF5ICogZ2xYR2V0Q3VycmVudERpc3BsYXkgKHZvaWQpOworZXh0ZXJuIGludCBnbFhRdWVyeUNvbnRleHQgKERpc3BsYXkgKiwgR0xYQ29udGV4dCwgaW50LCBpbnQgKik7CitleHRlcm4gdm9pZCBnbFhTZWxlY3RFdmVudCAoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBnbFhHZXRTZWxlY3RlZEV2ZW50IChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCB1bnNpZ25lZCBsb25nICopOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhGQkNvbmZpZyAqICggKiBQRk5HTFhHRVRGQkNPTkZJR1NQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm5lbGVtZW50cyk7Cit0eXBlZGVmIEdMWEZCQ29uZmlnICogKCAqIFBGTkdMWENIT09TRUZCQ09ORklHUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgY29uc3QgaW50ICphdHRyaWJfbGlzdCwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEdFVEZCQ09ORklHQVRUUklCUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgKnZhbHVlKTsKK3R5cGVkZWYgWFZpc3VhbEluZm8gKiAoICogUEZOR0xYR0VUVklTVUFMRlJPTUZCQ09ORklHUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnKTsKK3R5cGVkZWYgR0xYV2luZG93ICggKiBQRk5HTFhDUkVBVEVXSU5ET1dQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIFdpbmRvdyB3aW4sIGNvbnN0IGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhERVNUUk9ZV0lORE9XUFJPQykgKERpc3BsYXkgKmRweSwgR0xYV2luZG93IHdpbik7Cit0eXBlZGVmIEdMWFBpeG1hcCAoICogUEZOR0xYQ1JFQVRFUElYTUFQUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBQaXhtYXAgcGl4bWFwLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYREVTVFJPWVBJWE1BUFBST0MpIChEaXNwbGF5ICpkcHksIEdMWFBpeG1hcCBwaXhtYXApOwordHlwZWRlZiBHTFhQYnVmZmVyICggKiBQRk5HTFhDUkVBVEVQQlVGRkVSUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWcgY29uZmlnLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYREVTVFJPWVBCVUZGRVJQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyIHBidWYpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhRVUVSWURSQVdBQkxFUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhdywgaW50IGF0dHJpYnV0ZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIEdMWENvbnRleHQgKCAqIFBGTkdMWENSRUFURU5FV0NPTlRFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZyBjb25maWcsIGludCByZW5kZXJfdHlwZSwgR0xYQ29udGV4dCBzaGFyZV9saXN0LCBCb29sIGRpcmVjdCk7Cit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWE1BS0VDT05URVhUQ1VSUkVOVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIEdMWERyYXdhYmxlIHJlYWQsIEdMWENvbnRleHQgY3R4KTsKK3R5cGVkZWYgR0xYRHJhd2FibGUgKCAqIFBGTkdMWEdFVENVUlJFTlRSRUFERFJBV0FCTEVQUk9DKSAodm9pZCk7Cit0eXBlZGVmIERpc3BsYXkgKiAoICogUEZOR0xYR0VUQ1VSUkVOVERJU1BMQVlQUk9DKSAodm9pZCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllDT05URVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYQ29udGV4dCBjdHgsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhTRUxFQ1RFVkVOVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXcsIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzayk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEdFVFNFTEVDVEVERVZFTlRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCB1bnNpZ25lZCBsb25nICpldmVudF9tYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9WRVJTSU9OXzFfNAorI2RlZmluZSBHTFhfVkVSU0lPTl8xXzQgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIF9fR0xYZXh0RnVuY1B0ciBnbFhHZXRQcm9jQWRkcmVzcyAoY29uc3QgR0x1Ynl0ZSAqKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgX19HTFhleHRGdW5jUHRyICggKiBQRk5HTFhHRVRQUk9DQUREUkVTU1BST0MpIChjb25zdCBHTHVieXRlICpwcm9jTmFtZSk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfQVJCX2dldF9wcm9jX2FkZHJlc3MKKyNkZWZpbmUgR0xYX0FSQl9nZXRfcHJvY19hZGRyZXNzIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBfX0dMWGV4dEZ1bmNQdHIgZ2xYR2V0UHJvY0FkZHJlc3NBUkIgKGNvbnN0IEdMdWJ5dGUgKik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIF9fR0xYZXh0RnVuY1B0ciAoICogUEZOR0xYR0VUUFJPQ0FERFJFU1NBUkJQUk9DKSAoY29uc3QgR0x1Ynl0ZSAqcHJvY05hbWUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0FSQl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfQVJCX211bHRpc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9BUkJfZmJjb25maWdfZmxvYXQKKyNkZWZpbmUgR0xYX0FSQl9mYmNvbmZpZ19mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJU19tdWx0aXNhbXBsZQorI2RlZmluZSBHTFhfU0dJU19tdWx0aXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3Zpc3VhbF9pbmZvCisjZGVmaW5lIEdMWF9FWFRfdmlzdWFsX2luZm8gMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgR0xYX1NHSV9zd2FwX2NvbnRyb2wgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhTd2FwSW50ZXJ2YWxTR0kgKGludCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYU1dBUElOVEVSVkFMU0dJUFJPQykgKGludCBpbnRlcnZhbCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJX3ZpZGVvX3N5bmMKKyNkZWZpbmUgR0xYX1NHSV92aWRlb19zeW5jIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBpbnQgZ2xYR2V0VmlkZW9TeW5jU0dJICh1bnNpZ25lZCBpbnQgKik7CitleHRlcm4gaW50IGdsWFdhaXRWaWRlb1N5bmNTR0kgKGludCwgaW50LCB1bnNpZ25lZCBpbnQgKik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGludCAoICogUEZOR0xYR0VUVklERU9TWU5DU0dJUFJPQykgKHVuc2lnbmVkIGludCAqY291bnQpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFdBSVRWSURFT1NZTkNTR0lQUk9DKSAoaW50IGRpdmlzb3IsIGludCByZW1haW5kZXIsIHVuc2lnbmVkIGludCAqY291bnQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSV9tYWtlX2N1cnJlbnRfcmVhZAorI2RlZmluZSBHTFhfU0dJX21ha2VfY3VycmVudF9yZWFkIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCb29sIGdsWE1ha2VDdXJyZW50UmVhZFNHSSAoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSwgR0xYRHJhd2FibGUsIEdMWENvbnRleHQpOworZXh0ZXJuIEdMWERyYXdhYmxlIGdsWEdldEN1cnJlbnRSZWFkRHJhd2FibGVTR0kgKHZvaWQpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhNQUtFQ1VSUkVOVFJFQURTR0lQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3LCBHTFhEcmF3YWJsZSByZWFkLCBHTFhDb250ZXh0IGN0eCk7Cit0eXBlZGVmIEdMWERyYXdhYmxlICggKiBQRk5HTFhHRVRDVVJSRU5UUkVBRERSQVdBQkxFU0dJUFJPQykgKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fc291cmNlCisjZGVmaW5lIEdMWF9TR0lYX3ZpZGVvX3NvdXJjZSAxCisjaWZkZWYgX1ZMX0gKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBHTFhWaWRlb1NvdXJjZVNHSVggZ2xYQ3JlYXRlR0xYVmlkZW9Tb3VyY2VTR0lYIChEaXNwbGF5ICosIGludCwgVkxTZXJ2ZXIsIFZMUGF0aCwgaW50LCBWTE5vZGUpOworZXh0ZXJuIHZvaWQgZ2xYRGVzdHJveUdMWFZpZGVvU291cmNlU0dJWCAoRGlzcGxheSAqLCBHTFhWaWRlb1NvdXJjZVNHSVgpOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhWaWRlb1NvdXJjZVNHSVggKCAqIFBGTkdMWENSRUFURUdMWFZJREVPU09VUkNFU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBWTFNlcnZlciBzZXJ2ZXIsIFZMUGF0aCBwYXRoLCBpbnQgbm9kZUNsYXNzLCBWTE5vZGUgZHJhaW5Ob2RlKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYREVTVFJPWUdMWFZJREVPU09VUkNFU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWFZpZGVvU291cmNlU0dJWCBnbHh2aWRlb3NvdXJjZSk7CisjZW5kaWYgLyogX1ZMX0ggKi8KKyNlbmRpZgorCisjaWZuZGVmIEdMWF9FWFRfdmlzdWFsX3JhdGluZworI2RlZmluZSBHTFhfRVhUX3Zpc3VhbF9yYXRpbmcgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9pbXBvcnRfY29udGV4dAorI2RlZmluZSBHTFhfRVhUX2ltcG9ydF9jb250ZXh0IDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBEaXNwbGF5ICogZ2xYR2V0Q3VycmVudERpc3BsYXlFWFQgKHZvaWQpOworZXh0ZXJuIGludCBnbFhRdWVyeUNvbnRleHRJbmZvRVhUIChEaXNwbGF5ICosIEdMWENvbnRleHQsIGludCwgaW50ICopOworZXh0ZXJuIEdMWENvbnRleHRJRCBnbFhHZXRDb250ZXh0SURFWFQgKGNvbnN0IEdMWENvbnRleHQpOworZXh0ZXJuIEdMWENvbnRleHQgZ2xYSW1wb3J0Q29udGV4dEVYVCAoRGlzcGxheSAqLCBHTFhDb250ZXh0SUQpOworZXh0ZXJuIHZvaWQgZ2xYRnJlZUNvbnRleHRFWFQgKERpc3BsYXkgKiwgR0xYQ29udGV4dCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIERpc3BsYXkgKiAoICogUEZOR0xYR0VUQ1VSUkVOVERJU1BMQVlFWFRQUk9DKSAodm9pZCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllDT05URVhUSU5GT0VYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWENvbnRleHQgY29udGV4dCwgaW50IGF0dHJpYnV0ZSwgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIEdMWENvbnRleHRJRCAoICogUEZOR0xYR0VUQ09OVEVYVElERVhUUFJPQykgKGNvbnN0IEdMWENvbnRleHQgY29udGV4dCk7Cit0eXBlZGVmIEdMWENvbnRleHQgKCAqIFBGTkdMWElNUE9SVENPTlRFWFRFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0SUQgY29udGV4dElEKTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYRlJFRUNPTlRFWFRFWFRQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhDb250ZXh0IGNvbnRleHQpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfZmJjb25maWcKKyNkZWZpbmUgR0xYX1NHSVhfZmJjb25maWcgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBnbFhHZXRGQkNvbmZpZ0F0dHJpYlNHSVggKERpc3BsYXkgKiwgR0xYRkJDb25maWdTR0lYLCBpbnQsIGludCAqKTsKK2V4dGVybiBHTFhGQkNvbmZpZ1NHSVggKiBnbFhDaG9vc2VGQkNvbmZpZ1NHSVggKERpc3BsYXkgKiwgaW50LCBpbnQgKiwgaW50ICopOworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVHTFhQaXhtYXBXaXRoQ29uZmlnU0dJWCAoRGlzcGxheSAqLCBHTFhGQkNvbmZpZ1NHSVgsIFBpeG1hcCk7CitleHRlcm4gR0xYQ29udGV4dCBnbFhDcmVhdGVDb250ZXh0V2l0aENvbmZpZ1NHSVggKERpc3BsYXkgKiwgR0xYRkJDb25maWdTR0lYLCBpbnQsIEdMWENvbnRleHQsIEJvb2wpOworZXh0ZXJuIFhWaXN1YWxJbmZvICogZ2xYR2V0VmlzdWFsRnJvbUZCQ29uZmlnU0dJWCAoRGlzcGxheSAqLCBHTFhGQkNvbmZpZ1NHSVgpOworZXh0ZXJuIEdMWEZCQ29uZmlnU0dJWCBnbFhHZXRGQkNvbmZpZ0Zyb21WaXN1YWxTR0lYIChEaXNwbGF5ICosIFhWaXN1YWxJbmZvICopOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEdFVEZCQ09ORklHQVRUUklCU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnU0dJWCBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCAqdmFsdWUpOwordHlwZWRlZiBHTFhGQkNvbmZpZ1NHSVggKiAoICogUEZOR0xYQ0hPT1NFRkJDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHNjcmVlbiwgaW50ICphdHRyaWJfbGlzdCwgaW50ICpuZWxlbWVudHMpOwordHlwZWRlZiBHTFhQaXhtYXAgKCAqIFBGTkdMWENSRUFURUdMWFBJWE1BUFdJVEhDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRkJDb25maWdTR0lYIGNvbmZpZywgUGl4bWFwIHBpeG1hcCk7Cit0eXBlZGVmIEdMWENvbnRleHQgKCAqIFBGTkdMWENSRUFURUNPTlRFWFRXSVRIQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWEZCQ29uZmlnU0dJWCBjb25maWcsIGludCByZW5kZXJfdHlwZSwgR0xYQ29udGV4dCBzaGFyZV9saXN0LCBCb29sIGRpcmVjdCk7Cit0eXBlZGVmIFhWaXN1YWxJbmZvICogKCAqIFBGTkdMWEdFVFZJU1VBTEZST01GQkNPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnKTsKK3R5cGVkZWYgR0xYRkJDb25maWdTR0lYICggKiBQRk5HTFhHRVRGQkNPTkZJR0ZST01WSVNVQUxTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgWFZpc3VhbEluZm8gKnZpcyk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9wYnVmZmVyCisjZGVmaW5lIEdMWF9TR0lYX3BidWZmZXIgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWFBidWZmZXJTR0lYIGdsWENyZWF0ZUdMWFBidWZmZXJTR0lYIChEaXNwbGF5ICosIEdMWEZCQ29uZmlnU0dJWCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGludCAqKTsKK2V4dGVybiB2b2lkIGdsWERlc3Ryb3lHTFhQYnVmZmVyU0dJWCAoRGlzcGxheSAqLCBHTFhQYnVmZmVyU0dJWCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5R0xYUGJ1ZmZlclNHSVggKERpc3BsYXkgKiwgR0xYUGJ1ZmZlclNHSVgsIGludCwgdW5zaWduZWQgaW50ICopOworZXh0ZXJuIHZvaWQgZ2xYU2VsZWN0RXZlbnRTR0lYIChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIGdsWEdldFNlbGVjdGVkRXZlbnRTR0lYIChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCB1bnNpZ25lZCBsb25nICopOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhQYnVmZmVyU0dJWCAoICogUEZOR0xYQ1JFQVRFR0xYUEJVRkZFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhGQkNvbmZpZ1NHSVggY29uZmlnLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhERVNUUk9ZR0xYUEJVRkZFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyU0dJWCBwYnVmKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUdMWFBCVUZGRVJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYUGJ1ZmZlclNHSVggcGJ1ZiwgaW50IGF0dHJpYnV0ZSwgdW5zaWduZWQgaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWFNFTEVDVEVWRU5UU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCB1bnNpZ25lZCBsb25nIG1hc2spOwordHlwZWRlZiB2b2lkICggKiBQRk5HTFhHRVRTRUxFQ1RFREVWRU5UU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCB1bnNpZ25lZCBsb25nICptYXNrKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lfY3VzaGlvbgorI2RlZmluZSBHTFhfU0dJX2N1c2hpb24gMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQ3VzaGlvblNHSSAoRGlzcGxheSAqLCBXaW5kb3csIGZsb2F0KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYQ1VTSElPTlNHSVBST0MpIChEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW5kb3csIGZsb2F0IGN1c2hpb24pOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfdmlkZW9fcmVzaXplCisjZGVmaW5lIEdMWF9TR0lYX3ZpZGVvX3Jlc2l6ZSAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gaW50IGdsWEJpbmRDaGFubmVsVG9XaW5kb3dTR0lYIChEaXNwbGF5ICosIGludCwgaW50LCBXaW5kb3cpOworZXh0ZXJuIGludCBnbFhDaGFubmVsUmVjdFNHSVggKERpc3BsYXkgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5Q2hhbm5lbFJlY3RTR0lYIChEaXNwbGF5ICosIGludCwgaW50LCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7CitleHRlcm4gaW50IGdsWFF1ZXJ5Q2hhbm5lbERlbHRhc1NHSVggKERpc3BsYXkgKiwgaW50LCBpbnQsIGludCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBpbnQgZ2xYQ2hhbm5lbFJlY3RTeW5jU0dJWCAoRGlzcGxheSAqLCBpbnQsIGludCwgR0xlbnVtKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgaW50ICggKiBQRk5HTFhCSU5EQ0hBTk5FTFRPV0lORE9XU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgV2luZG93IHdpbmRvdyk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQ0hBTk5FTFJFQ1RTR0lYUFJPQykgKERpc3BsYXkgKmRpc3BsYXksIGludCBzY3JlZW4sIGludCBjaGFubmVsLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllDSEFOTkVMUkVDVFNHSVhQUk9DKSAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCAqZHgsIGludCAqZHksIGludCAqZHcsIGludCAqZGgpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWFFVRVJZQ0hBTk5FTERFTFRBU1NHSVhQUk9DKSAoRGlzcGxheSAqZGlzcGxheSwgaW50IHNjcmVlbiwgaW50IGNoYW5uZWwsIGludCAqeCwgaW50ICp5LCBpbnQgKncsIGludCAqaCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYQ0hBTk5FTFJFQ1RTWU5DU0dJWFBST0MpIChEaXNwbGF5ICpkaXNwbGF5LCBpbnQgc2NyZWVuLCBpbnQgY2hhbm5lbCwgR0xlbnVtIHN5bmN0eXBlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX2RtYnVmZmVyCisjZGVmaW5lIEdMWF9TR0lYX2RtYnVmZmVyIDEKKyNpZmRlZiBfRE1fQlVGRkVSX0hfCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQm9vbCBnbFhBc3NvY2lhdGVETVBidWZmZXJTR0lYIChEaXNwbGF5ICosIEdMWFBidWZmZXJTR0lYLCBETXBhcmFtcyAqLCBETWJ1ZmZlcik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWEFTU09DSUFURURNUEJVRkZFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhQYnVmZmVyU0dJWCBwYnVmZmVyLCBETXBhcmFtcyAqcGFyYW1zLCBETWJ1ZmZlciBkbWJ1ZmZlcik7CisjZW5kaWYgLyogX0RNX0JVRkZFUl9IXyAqLworI2VuZGlmCisKKyNpZm5kZWYgR0xYX1NHSVhfc3dhcF9ncm91cAorI2RlZmluZSBHTFhfU0dJWF9zd2FwX2dyb3VwIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWEpvaW5Td2FwR3JvdXBTR0lYIChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCBHTFhEcmF3YWJsZSk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEpPSU5TV0FQR1JPVVBTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIEdMWERyYXdhYmxlIG1lbWJlcik7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9zd2FwX2JhcnJpZXIKKyNkZWZpbmUgR0xYX1NHSVhfc3dhcF9iYXJyaWVyIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWEJpbmRTd2FwQmFycmllclNHSVggKERpc3BsYXkgKiwgR0xYRHJhd2FibGUsIGludCk7CitleHRlcm4gQm9vbCBnbFhRdWVyeU1heFN3YXBCYXJyaWVyc1NHSVggKERpc3BsYXkgKiwgaW50LCBpbnQgKik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEJJTkRTV0FQQkFSUklFUlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50IGJhcnJpZXIpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhRVUVSWU1BWFNXQVBCQVJSSUVSU1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgc2NyZWVuLCBpbnQgKm1heCk7CisjZW5kaWYKKworI2lmbmRlZiBHTFhfU1VOX2dldF90cmFuc3BhcmVudF9pbmRleAorI2RlZmluZSBHTFhfU1VOX2dldF90cmFuc3BhcmVudF9pbmRleCAxCisjaWZkZWYgR0xYX0dMWEVYVF9QUk9UT1RZUEVTCitleHRlcm4gU3RhdHVzIGdsWEdldFRyYW5zcGFyZW50SW5kZXhTVU4gKERpc3BsYXkgKiwgV2luZG93LCBXaW5kb3csIGxvbmcgKik7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIFN0YXR1cyAoICogUEZOR0xYR0VUVFJBTlNQQVJFTlRJTkRFWFNVTlBST0MpIChEaXNwbGF5ICpkcHksIFdpbmRvdyBvdmVybGF5LCBXaW5kb3cgdW5kZXJsYXksIGxvbmcgKnBUcmFuc3BhcmVudEluZGV4KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX2NvcHlfc3ViX2J1ZmZlcgorI2RlZmluZSBHTFhfTUVTQV9jb3B5X3N1Yl9idWZmZXIgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQgZ2xYQ29weVN1YkJ1ZmZlck1FU0EgKERpc3BsYXkgKiwgR0xYRHJhd2FibGUsIGludCwgaW50LCBpbnQsIGludCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWENPUFlTVUJCVUZGRVJNRVNBUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3BpeG1hcF9jb2xvcm1hcAorI2RlZmluZSBHTFhfTUVTQV9waXhtYXBfY29sb3JtYXAgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWFBpeG1hcCBnbFhDcmVhdGVHTFhQaXhtYXBNRVNBIChEaXNwbGF5ICosIFhWaXN1YWxJbmZvICosIFBpeG1hcCwgQ29sb3JtYXApOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhQaXhtYXAgKCAqIFBGTkdMWENSRUFURUdMWFBJWE1BUE1FU0FQUk9DKSAoRGlzcGxheSAqZHB5LCBYVmlzdWFsSW5mbyAqdmlzdWFsLCBQaXhtYXAgcGl4bWFwLCBDb2xvcm1hcCBjbWFwKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9NRVNBX3JlbGVhc2VfYnVmZmVycworI2RlZmluZSBHTFhfTUVTQV9yZWxlYXNlX2J1ZmZlcnMgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJvb2wgZ2xYUmVsZWFzZUJ1ZmZlcnNNRVNBIChEaXNwbGF5ICosIEdMWERyYXdhYmxlKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYUkVMRUFTRUJVRkZFUlNNRVNBUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0Ffc2V0XzNkZnhfbW9kZQorI2RlZmluZSBHTFhfTUVTQV9zZXRfM2RmeF9tb2RlIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCb29sIGdsWFNldDNEZnhNb2RlTUVTQSAoaW50KTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQm9vbCAoICogUEZOR0xYU0VUM0RGWE1PREVNRVNBUFJPQykgKGludCBtb2RlKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9TR0lYX3Zpc3VhbF9zZWxlY3RfZ3JvdXAKKyNkZWZpbmUgR0xYX1NHSVhfdmlzdWFsX3NlbGVjdF9ncm91cCAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfT01MX3N3YXBfbWV0aG9kCisjZGVmaW5lIEdMWF9PTUxfc3dhcF9tZXRob2QgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX09NTF9zeW5jX2NvbnRyb2wKKyNkZWZpbmUgR0xYX09NTF9zeW5jX2NvbnRyb2wgMQorI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJvb2wgZ2xYR2V0U3luY1ZhbHVlc09NTCAoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSwgaW50NjRfdCAqLCBpbnQ2NF90ICosIGludDY0X3QgKik7CitleHRlcm4gQm9vbCBnbFhHZXRNc2NSYXRlT01MIChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCBpbnQzMl90ICosIGludDMyX3QgKik7CitleHRlcm4gaW50NjRfdCBnbFhTd2FwQnVmZmVyc01zY09NTCAoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSwgaW50NjRfdCwgaW50NjRfdCwgaW50NjRfdCk7CitleHRlcm4gQm9vbCBnbFhXYWl0Rm9yTXNjT01MIChEaXNwbGF5ICosIEdMWERyYXdhYmxlLCBpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90LCBpbnQ2NF90ICosIGludDY0X3QgKiwgaW50NjRfdCAqKTsKK2V4dGVybiBCb29sIGdsWFdhaXRGb3JTYmNPTUwgKERpc3BsYXkgKiwgR0xYRHJhd2FibGUsIGludDY0X3QsIGludDY0X3QgKiwgaW50NjRfdCAqLCBpbnQ2NF90ICopOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCb29sICggKiBQRk5HTFhHRVRTWU5DVkFMVUVTT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgKnVzdCwgaW50NjRfdCAqbXNjLCBpbnQ2NF90ICpzYmMpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhHRVRNU0NSQVRFT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDMyX3QgKm51bWVyYXRvciwgaW50MzJfdCAqZGVub21pbmF0b3IpOwordHlwZWRlZiBpbnQ2NF90ICggKiBQRk5HTFhTV0FQQlVGRkVSU01TQ09NTFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQ2NF90IHRhcmdldF9tc2MsIGludDY0X3QgZGl2aXNvciwgaW50NjRfdCByZW1haW5kZXIpOwordHlwZWRlZiBCb29sICggKiBQRk5HTFhXQUlURk9STVNDT01MUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludDY0X3QgdGFyZ2V0X21zYywgaW50NjRfdCBkaXZpc29yLCBpbnQ2NF90IHJlbWFpbmRlciwgaW50NjRfdCAqdXN0LCBpbnQ2NF90ICptc2MsIGludDY0X3QgKnNiYyk7Cit0eXBlZGVmIEJvb2wgKCAqIFBGTkdMWFdBSVRGT1JTQkNPTUxQUk9DKSAoRGlzcGxheSAqZHB5LCBHTFhEcmF3YWJsZSBkcmF3YWJsZSwgaW50NjRfdCB0YXJnZXRfc2JjLCBpbnQ2NF90ICp1c3QsIGludDY0X3QgKm1zYywgaW50NjRfdCAqc2JjKTsKKyNlbmRpZgorCisjaWZuZGVmIEdMWF9OVl9mbG9hdF9idWZmZXIKKyNkZWZpbmUgR0xYX05WX2Zsb2F0X2J1ZmZlciAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfU0dJWF9oeXBlcnBpcGUKKyNkZWZpbmUgR0xYX1NHSVhfaHlwZXJwaXBlIDEKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCAgICAgbmV0d29ya0lkOworfSBHTFhIeXBlcnBpcGVOZXR3b3JrU0dJWDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCAgICAgY2hhbm5lbDsKKyAgICB1bnNpZ25lZCBpbnQKKyAgICAgIHBhcnRpY2lwYXRpb25UeXBlOworICAgIGludCAgICAgdGltZVNsaWNlOworfSBHTFhIeXBlcnBpcGVDb25maWdTR0lYOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBwaXBlTmFtZVtHTFhfSFlQRVJQSVBFX1BJUEVfTkFNRV9MRU5HVEhfU0dJWF07CisgICAgaW50IHNyY1hPcmlnaW4sIHNyY1lPcmlnaW4sIHNyY1dpZHRoLCBzcmNIZWlnaHQ7CisgICAgaW50IGRlc3RYT3JpZ2luLCBkZXN0WU9yaWdpbiwgZGVzdFdpZHRoLCBkZXN0SGVpZ2h0OworfSBHTFhQaXBlUmVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgcGlwZU5hbWVbR0xYX0hZUEVSUElQRV9QSVBFX05BTUVfTEVOR1RIX1NHSVhdOworICAgIGludCBYT3JpZ2luLCBZT3JpZ2luLCBtYXhIZWlnaHQsIG1heFdpZHRoOworfSBHTFhQaXBlUmVjdExpbWl0czsKKworI2lmZGVmIEdMWF9HTFhFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEdMWEh5cGVycGlwZU5ldHdvcmtTR0lYICogZ2xYUXVlcnlIeXBlcnBpcGVOZXR3b3JrU0dJWCAoRGlzcGxheSAqLCBpbnQgKik7CitleHRlcm4gaW50IGdsWEh5cGVycGlwZUNvbmZpZ1NHSVggKERpc3BsYXkgKiwgaW50LCBpbnQsIEdMWEh5cGVycGlwZUNvbmZpZ1NHSVggKiwgaW50ICopOworZXh0ZXJuIEdMWEh5cGVycGlwZUNvbmZpZ1NHSVggKiBnbFhRdWVyeUh5cGVycGlwZUNvbmZpZ1NHSVggKERpc3BsYXkgKiwgaW50LCBpbnQgKik7CitleHRlcm4gaW50IGdsWERlc3Ryb3lIeXBlcnBpcGVDb25maWdTR0lYIChEaXNwbGF5ICosIGludCk7CitleHRlcm4gaW50IGdsWEJpbmRIeXBlcnBpcGVTR0lYIChEaXNwbGF5ICosIGludCk7CitleHRlcm4gaW50IGdsWFF1ZXJ5SHlwZXJwaXBlQmVzdEF0dHJpYlNHSVggKERpc3BsYXkgKiwgaW50LCBpbnQsIGludCwgdm9pZCAqLCB2b2lkICopOworZXh0ZXJuIGludCBnbFhIeXBlcnBpcGVBdHRyaWJTR0lYIChEaXNwbGF5ICosIGludCwgaW50LCBpbnQsIHZvaWQgKik7CitleHRlcm4gaW50IGdsWFF1ZXJ5SHlwZXJwaXBlQXR0cmliU0dJWCAoRGlzcGxheSAqLCBpbnQsIGludCwgaW50LCB2b2lkICopOworI2VuZGlmIC8qIEdMWF9HTFhFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBHTFhIeXBlcnBpcGVOZXR3b3JrU0dJWCAqICggKiBQRk5HTFhRVUVSWUhZUEVSUElQRU5FVFdPUktTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50ICpucGlwZXMpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEhZUEVSUElQRUNPTkZJR1NHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgbmV0d29ya0lkLCBpbnQgbnBpcGVzLCBHTFhIeXBlcnBpcGVDb25maWdTR0lYICpjZmcsIGludCAqaHBJZCk7Cit0eXBlZGVmIEdMWEh5cGVycGlwZUNvbmZpZ1NHSVggKiAoICogUEZOR0xYUVVFUllIWVBFUlBJUEVDT05GSUdTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IGhwSWQsIGludCAqbnBpcGVzKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhERVNUUk9ZSFlQRVJQSVBFQ09ORklHU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCBocElkKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhCSU5ESFlQRVJQSVBFU0dJWFBST0MpIChEaXNwbGF5ICpkcHksIGludCBocElkKTsKK3R5cGVkZWYgaW50ICggKiBQRk5HTFhRVUVSWUhZUEVSUElQRUJFU1RBVFRSSUJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHRpbWVTbGljZSwgaW50IGF0dHJpYiwgaW50IHNpemUsIHZvaWQgKmF0dHJpYkxpc3QsIHZvaWQgKnJldHVybkF0dHJpYkxpc3QpOwordHlwZWRlZiBpbnQgKCAqIFBGTkdMWEhZUEVSUElQRUFUVFJJQlNHSVhQUk9DKSAoRGlzcGxheSAqZHB5LCBpbnQgdGltZVNsaWNlLCBpbnQgYXR0cmliLCBpbnQgc2l6ZSwgdm9pZCAqYXR0cmliTGlzdCk7Cit0eXBlZGVmIGludCAoICogUEZOR0xYUVVFUllIWVBFUlBJUEVBVFRSSUJTR0lYUFJPQykgKERpc3BsYXkgKmRweSwgaW50IHRpbWVTbGljZSwgaW50IGF0dHJpYiwgaW50IHNpemUsIHZvaWQgKnJldHVybkF0dHJpYkxpc3QpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX01FU0FfYWdwX29mZnNldAorI2RlZmluZSBHTFhfTUVTQV9hZ3Bfb2Zmc2V0IDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ2xYR2V0QUdQT2Zmc2V0TUVTQSAoY29uc3Qgdm9pZCAqKTsKKyNlbmRpZiAvKiBHTFhfR0xYRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50ICggKiBQRk5HTFhHRVRBR1BPRkZTRVRNRVNBUFJPQykgKGNvbnN0IHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9mYmNvbmZpZ19wYWNrZWRfZmxvYXQKKyNkZWZpbmUgR0xYX0VYVF9mYmNvbmZpZ19wYWNrZWRfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgR0xYX0VYVF9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIEdMWF9FWFRfZnJhbWVidWZmZXJfc1JHQiAxCisjZW5kaWYKKworI2lmbmRlZiBHTFhfRVhUX3RleHR1cmVfZnJvbV9waXhtYXAKKyNkZWZpbmUgR0xYX0VYVF90ZXh0dXJlX2Zyb21fcGl4bWFwIDEKKyNpZmRlZiBHTFhfR0xYRVhUX1BST1RPVFlQRVMKK2V4dGVybiB2b2lkIGdsWEJpbmRUZXhJbWFnZUVYVCAoRGlzcGxheSAqLCBHTFhEcmF3YWJsZSwgaW50LCBjb25zdCBpbnQgKik7CitleHRlcm4gdm9pZCBnbFhSZWxlYXNlVGV4SW1hZ2VFWFQgKERpc3BsYXkgKiwgR0xYRHJhd2FibGUsIGludCk7CisjZW5kaWYgLyogR0xYX0dMWEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIHZvaWQgKCAqIFBGTkdMWEJJTkRURVhJTUFHRUVYVFBST0MpIChEaXNwbGF5ICpkcHksIEdMWERyYXdhYmxlIGRyYXdhYmxlLCBpbnQgYnVmZmVyLCBjb25zdCBpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgdm9pZCAoICogUEZOR0xYUkVMRUFTRVRFWElNQUdFRVhUUFJPQykgKERpc3BsYXkgKmRweSwgR0xYRHJhd2FibGUgZHJhd2FibGUsIGludCBidWZmZXIpOworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9ERUNrZXlzeW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0RFQ2tleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjEwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9ERUNrZXlzeW0uaApAQCAtMCwwICsxLDY3IEBACisvKiAkWG9yZzogREVDa2V5c3ltLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyMiB4b3JnY3ZzIEV4cCAkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4OCBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogREVDIHByaXZhdGUga2V5c3ltcworICogKDI5dGggYml0IHNldCkKKyAqLworCisvKiB0d28ta2V5IGNvbXBvc2Ugc2VxdWVuY2UgaW5pdGlhdG9ycywgY2hvc2VuIHRvIG1hcCB0byBMYXRpbjEgY2hhcmFjdGVycyAqLworCisjZGVmaW5lIERYS19yaW5nX2FjY2VudCAgICAgICAgIDB4MTAwMEZFQjAKKyNkZWZpbmUgRFhLX2NpcmN1bWZsZXhfYWNjZW50ICAgMHgxMDAwRkU1RQorI2RlZmluZSBEWEtfY2VkaWxsYV9hY2NlbnQgICAgICAweDEwMDBGRTJDCisjZGVmaW5lIERYS19hY3V0ZV9hY2NlbnQgICAgICAgIDB4MTAwMEZFMjcKKyNkZWZpbmUgRFhLX2dyYXZlX2FjY2VudCAgICAgICAgMHgxMDAwRkU2MAorI2RlZmluZSBEWEtfdGlsZGUgICAgICAgICAgICAgICAweDEwMDBGRTdFCisjZGVmaW5lIERYS19kaWFlcmVzaXMgICAgICAgICAgIDB4MTAwMEZFMjIKKworLyogc3BlY2lhbCBrZXlzeW0gZm9yIExLMioqICJSZW1vdmUiIGtleSBvbiBlZGl0aW5nIGtleXBhZCAqLworCisjZGVmaW5lIERYS19SZW1vdmUJMHgxMDAwRkYwMCAgIC8qIFJlbW92ZSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSFBrZXlzeW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0hQa2V5c3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwOTI3NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0hQa2V5c3ltLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qICRYb3JnOiBIUGtleXN5bS5oLHYgMS41IDIwMDEvMDIvMDkgMDI6MDM6MjIgeG9yZ2N2cyBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cywKKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgSGV3bGV0dCBQYWNrYXJkCitvciBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKK0hFV0xFVFQtUEFDS0FSRCBNQUtFUyBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCBXSVRIIFJFR0FSRAorVE8gVEhJUyBTT0ZXQVJFLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBIZXdsZXR0LVBhY2thcmQgc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgZXJyb3JzCitjb250YWluZWQgaGVyZWluIG9yIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgb3IKK2NvbnNlcXVlbnRpYWwgZGFtYWdlcyBpbiBjb25uZWN0aW9uIHdpdGggdGhlIGZ1cm5pc2hpbmcsCitwZXJmb3JtYW5jZSwgb3IgdXNlIG9mIHRoaXMgbWF0ZXJpYWwuCisKKyovCisKKyNpZm5kZWYgX0hQS0VZU1lNX0gKKworI2RlZmluZSBfSFBLRVlTWU0KKworI2RlZmluZSBocFhLX0NsZWFyTGluZQkJMHgxMDAwRkY2RgorI2RlZmluZSBocFhLX0luc2VydExpbmUJCTB4MTAwMEZGNzAKKyNkZWZpbmUgaHBYS19EZWxldGVMaW5lCQkweDEwMDBGRjcxCisjZGVmaW5lIGhwWEtfSW5zZXJ0Q2hhcgkJMHgxMDAwRkY3MgorI2RlZmluZSBocFhLX0RlbGV0ZUNoYXIJCTB4MTAwMEZGNzMKKyNkZWZpbmUgaHBYS19CYWNrVGFiCQkweDEwMDBGRjc0CisjZGVmaW5lIGhwWEtfS1BfQmFja1RhYgkJMHgxMDAwRkY3NQorI2RlZmluZSBocFhLX01vZGVsb2NrMQkJMHgxMDAwRkY0OAorI2RlZmluZSBocFhLX01vZGVsb2NrMgkJMHgxMDAwRkY0OQorI2RlZmluZSBocFhLX1Jlc2V0CQkweDEwMDBGRjZDCisjZGVmaW5lIGhwWEtfU3lzdGVtCQkweDEwMDBGRjZECisjZGVmaW5lIGhwWEtfVXNlcgkJMHgxMDAwRkY2RQorI2RlZmluZSBocFhLX211dGVfYWN1dGUJCTB4MTAwMDAwQTgKKyNkZWZpbmUgaHBYS19tdXRlX2dyYXZlCQkweDEwMDAwMEE5CisjZGVmaW5lIGhwWEtfbXV0ZV9hc2NpaWNpcmN1bQkweDEwMDAwMEFBCisjZGVmaW5lIGhwWEtfbXV0ZV9kaWFlcmVzaXMJMHgxMDAwMDBBQgorI2RlZmluZSBocFhLX211dGVfYXNjaWl0aWxkZQkweDEwMDAwMEFDCisjZGVmaW5lIGhwWEtfbGlyYQkJMHgxMDAwMDBBRgorI2RlZmluZSBocFhLX2d1aWxkZXIJCTB4MTAwMDAwQkUKKyNkZWZpbmUgaHBYS19ZZGlhZXJlc2lzCQkweDEwMDAwMEVFCisjZGVmaW5lIGhwWEtfSU8JCQkweDEwMDAwMEVFCisjZGVmaW5lIGhwWEtfbG9uZ21pbnVzCQkweDEwMDAwMEY2CisjZGVmaW5lIGhwWEtfYmxvY2sJCTB4MTAwMDAwRkMKKworCisjaWZuZGVmIF9PU0ZfS2V5c3ltcworI2RlZmluZSBfT1NGX0tleXN5bXMKKworI2RlZmluZSBvc2ZYS19Db3B5CQkweDEwMDRGRjAyCisjZGVmaW5lIG9zZlhLX0N1dAkJMHgxMDA0RkYwMworI2RlZmluZSBvc2ZYS19QYXN0ZQkJMHgxMDA0RkYwNAorI2RlZmluZSBvc2ZYS19CYWNrVGFiCQkweDEwMDRGRjA3CisjZGVmaW5lIG9zZlhLX0JhY2tTcGFjZQkJMHgxMDA0RkYwOAorI2RlZmluZSBvc2ZYS19DbGVhcgkJMHgxMDA0RkYwQgorI2RlZmluZSBvc2ZYS19Fc2NhcGUJCTB4MTAwNEZGMUIKKyNkZWZpbmUgb3NmWEtfQWRkTW9kZQkJMHgxMDA0RkYzMQorI2RlZmluZSBvc2ZYS19QcmltYXJ5UGFzdGUJMHgxMDA0RkYzMgorI2RlZmluZSBvc2ZYS19RdWlja1Bhc3RlCTB4MTAwNEZGMzMKKyNkZWZpbmUgb3NmWEtfUGFnZUxlZnQJCTB4MTAwNEZGNDAKKyNkZWZpbmUgb3NmWEtfUGFnZVVwCQkweDEwMDRGRjQxCisjZGVmaW5lIG9zZlhLX1BhZ2VEb3duCQkweDEwMDRGRjQyCisjZGVmaW5lIG9zZlhLX1BhZ2VSaWdodAkJMHgxMDA0RkY0MworI2RlZmluZSBvc2ZYS19BY3RpdmF0ZQkJMHgxMDA0RkY0NAorI2RlZmluZSBvc2ZYS19NZW51QmFyCQkweDEwMDRGRjQ1CisjZGVmaW5lIG9zZlhLX0xlZnQJCTB4MTAwNEZGNTEKKyNkZWZpbmUgb3NmWEtfVXAJCTB4MTAwNEZGNTIKKyNkZWZpbmUgb3NmWEtfUmlnaHQJCTB4MTAwNEZGNTMKKyNkZWZpbmUgb3NmWEtfRG93bgkJMHgxMDA0RkY1NAorI2RlZmluZSBvc2ZYS19FbmRMaW5lCQkweDEwMDRGRjU3CisjZGVmaW5lIG9zZlhLX0JlZ2luTGluZQkJMHgxMDA0RkY1OAorI2RlZmluZSBvc2ZYS19FbmREYXRhCQkweDEwMDRGRjU5CisjZGVmaW5lIG9zZlhLX0JlZ2luRGF0YQkJMHgxMDA0RkY1QQorI2RlZmluZSBvc2ZYS19QcmV2TWVudQkJMHgxMDA0RkY1QgorI2RlZmluZSBvc2ZYS19OZXh0TWVudQkJMHgxMDA0RkY1QworI2RlZmluZSBvc2ZYS19QcmV2RmllbGQJCTB4MTAwNEZGNUQKKyNkZWZpbmUgb3NmWEtfTmV4dEZpZWxkCQkweDEwMDRGRjVFCisjZGVmaW5lIG9zZlhLX1NlbGVjdAkJMHgxMDA0RkY2MAorI2RlZmluZSBvc2ZYS19JbnNlcnQJCTB4MTAwNEZGNjMKKyNkZWZpbmUgb3NmWEtfVW5kbwkJMHgxMDA0RkY2NQorI2RlZmluZSBvc2ZYS19NZW51CQkweDEwMDRGRjY3CisjZGVmaW5lIG9zZlhLX0NhbmNlbAkJMHgxMDA0RkY2OQorI2RlZmluZSBvc2ZYS19IZWxwCQkweDEwMDRGRjZBCisjZGVmaW5lIG9zZlhLX1NlbGVjdEFsbAkJMHgxMDA0RkY3MQorI2RlZmluZSBvc2ZYS19EZXNlbGVjdEFsbAkweDEwMDRGRjcyCisjZGVmaW5lIG9zZlhLX1Jlc2VsZWN0CQkweDEwMDRGRjczCisjZGVmaW5lIG9zZlhLX0V4dGVuZAkJMHgxMDA0RkY3NAorI2RlZmluZSBvc2ZYS19SZXN0b3JlCQkweDEwMDRGRjc4CisjZGVmaW5lIG9zZlhLX0RlbGV0ZQkJMHgxMDA0RkZGRgorCisjZW5kaWYgLyogX09TRl9LZXlzeW1zICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGlzIGRlcHJlY2F0ZWQuCisgKiBUaGV5IGFyZSBsaXN0ZWQgYmVsb3cgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgWEtfUmVzZXQgICAgICAgICAgICAgICAgMHgxMDAwRkY2QworI2RlZmluZSBYS19TeXN0ZW0gICAgICAgICAgICAgICAweDEwMDBGRjZECisjZGVmaW5lIFhLX1VzZXIgICAgICAgICAgICAgICAgIDB4MTAwMEZGNkUKKyNkZWZpbmUgWEtfQ2xlYXJMaW5lICAgICAgICAgICAgMHgxMDAwRkY2RgorI2RlZmluZSBYS19JbnNlcnRMaW5lICAgICAgICAgICAweDEwMDBGRjcwCisjZGVmaW5lIFhLX0RlbGV0ZUxpbmUgICAgICAgICAgIDB4MTAwMEZGNzEKKyNkZWZpbmUgWEtfSW5zZXJ0Q2hhciAgICAgICAgICAgMHgxMDAwRkY3MgorI2RlZmluZSBYS19EZWxldGVDaGFyICAgICAgICAgICAweDEwMDBGRjczCisjZGVmaW5lIFhLX0JhY2tUYWIgICAgICAgICAgICAgIDB4MTAwMEZGNzQKKyNkZWZpbmUgWEtfS1BfQmFja1RhYiAgICAgICAgICAgMHgxMDAwRkY3NQorI2RlZmluZSBYS19FeHQxNmJpdF9MICAgICAgICAgICAweDEwMDBGRjc2CisjZGVmaW5lIFhLX0V4dDE2Yml0X1IgICAgICAgICAgIDB4MTAwMEZGNzcKKyNkZWZpbmUgWEtfbXV0ZV9hY3V0ZSAgICAgICAgICAgMHgxMDAwMDBhOAorI2RlZmluZSBYS19tdXRlX2dyYXZlICAgICAgICAgICAweDEwMDAwMGE5CisjZGVmaW5lIFhLX211dGVfYXNjaWljaXJjdW0gICAgIDB4MTAwMDAwYWEKKyNkZWZpbmUgWEtfbXV0ZV9kaWFlcmVzaXMgICAgICAgMHgxMDAwMDBhYgorI2RlZmluZSBYS19tdXRlX2FzY2lpdGlsZGUgICAgICAweDEwMDAwMGFjCisjZGVmaW5lIFhLX2xpcmEgICAgICAgICAgICAgICAgIDB4MTAwMDAwYWYKKyNkZWZpbmUgWEtfZ3VpbGRlciAgICAgICAgICAgICAgMHgxMDAwMDBiZQorI2lmbmRlZiBYS19ZZGlhZXJlc2lzCisjZGVmaW5lIFhLX1lkaWFlcmVzaXMgICAgICAgICAgIDB4MTAwMDAwZWUKKyNlbmRpZgorI2RlZmluZSBYS19JTyAgICAgICAgICAgICAgICAgICAweDEwMDAwMGVlCisjZGVmaW5lIFhLX2xvbmdtaW51cyAgICAgICAgICAgIDB4MTAwMDAwZjYKKyNkZWZpbmUgWEtfYmxvY2sgICAgICAgICAgICAgICAgMHgxMDAwMDBmYworCisjZW5kaWYgLyogX0hQS0VZU1lNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0ltVXRpbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvSW1VdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmMDM4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL0ltVXRpbC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qICRYRnJlZTg2OiB4Yy9saWIvWDExL0ltVXRpbC5oLHYgMS4yIDIwMDMvMDQvMTUgMjI6MTA6MDcgaGVycmIgRXhwICQgKi8KKworI2lmbmRlZiBfSU1VVElMX0hfCisjZGVmaW5lIF9JTVVUSUxfSF8KKworZXh0ZXJuIGludAorX1hHZXRTY2FubGluZVBhZCgKKyAgICBEaXNwbGF5ICpkcHksCisgICAgaW50IGRlcHRoKTsKKworZXh0ZXJuIGludAorX1hHZXRCaXRzUGVyUGl4ZWwoCisgRGlzcGxheSAqZHB5LAorIGludCBkZXB0aCk7CisKK2V4dGVybiBpbnQKK19YU2V0SW1hZ2UoCisgICAgWEltYWdlICpzcmNpbWcsCisgICAgcmVnaXN0ZXIgWEltYWdlICpkc3RpbWcsCisgICAgcmVnaXN0ZXIgaW50IHgsCisgICAgcmVnaXN0ZXIgaW50IHkpOworCitleHRlcm4gaW50CitfWFJldmVyc2VfQnl0ZXMoCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqYnB0LAorICAgIHJlZ2lzdGVyIGludCBuYik7CitleHRlcm4gdm9pZAorX1hJbml0SW1hZ2VGdW5jUHRycygKKyAgICByZWdpc3RlciBYSW1hZ2UgKmltYWdlKTsKKworI2VuZGlmIC8qIF9JTVVUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1N1bmtleXN5bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvU3Vua2V5c3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyMzQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1N1bmtleXN5bS5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiAkWG9yZzogU3Vua2V5c3ltLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyMiB4b3JnY3ZzIEV4cCAkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5OTEgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBNb3VudGFpbiBWaWV3LCBDQS4KKworICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gIHRvICB1c2UsICBjb3B5LCAgbW9kaWZ5LCAgYW5kICBkaXN0cmlidXRlICAgdGhpcworc29mdHdhcmUgIGFuZCAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBuby0KK3RpY2UgIGFwcGVhciAgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vLQordGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gIHN1cHBvcnRpbmcgIGRvY3UtCittZW50YXRpb24sICBhbmQgIHRoYXQgdGhlIG5hbWUgb2YgU3VuIG5vdCBiZSB1c2VkIGluCithZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gIG9mICB0aGUKK3NvZnR3YXJlICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gU3VuIAorbWFrZXMgIG5vICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5ICBvZiB0aGlzCitzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBhbnkKK2V4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU1VOIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyAgVEhJUyAgU09GVFdBUkUsCitJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVC0KK05FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTVU4gQkUgIExJLQorQUJMRSAgRk9SICBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAgREFUQSAgT1IKK1BST0ZJVFMsICBXSEVUSEVSICBJTiAgQU4gIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorT1RIRVIgVE9SVFVPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRmxvYXRpbmcgQWNjZW50CisgKi8KKworI2RlZmluZQlTdW5YS19GQV9HcmF2ZQkJMHgxMDA1RkYwMAorI2RlZmluZQlTdW5YS19GQV9DaXJjdW0JCTB4MTAwNUZGMDEKKyNkZWZpbmUJU3VuWEtfRkFfVGlsZGUJCTB4MTAwNUZGMDIKKyNkZWZpbmUJU3VuWEtfRkFfQWN1dGUJCTB4MTAwNUZGMDMKKyNkZWZpbmUJU3VuWEtfRkFfRGlhZXJlc2lzCTB4MTAwNUZGMDQKKyNkZWZpbmUJU3VuWEtfRkFfQ2VkaWxsYQkweDEwMDVGRjA1CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIEZ1bmN0aW9ucworICovCisKKyNkZWZpbmUJU3VuWEtfRjM2CQkweDEwMDVGRjEwCS8qIExhYmVsZWQgRjExICovCisjZGVmaW5lCVN1blhLX0YzNwkJMHgxMDA1RkYxMQkvKiBMYWJlbGVkIEYxMiAqLworCisjZGVmaW5lIFN1blhLX1N5c19SZXEgICAJMHgxMDA1RkY2MAorI2RlZmluZSBTdW5YS19QcmludF9TY3JlZW4JMHgwMDAwRkY2MQkvKiBTYW1lIGFzIFhLX1ByaW50ICovCisKKy8qCisgKiBJbnRlcm5hdGlvbmFsICYgTXVsdGktS2V5IENoYXJhY3RlciBDb21wb3NpdGlvbgorICovCisKKyNkZWZpbmUgU3VuWEtfQ29tcG9zZQkJMHgwMDAwRkYyMAkvKiBTYW1lIGFzIFhLX011bHRpX2tleSAqLworI2RlZmluZSBTdW5YS19BbHRHcmFwaAkJMHgwMDAwRkY3RQkvKiBTYW1lIGFzIFhLX01vZGVfc3dpdGNoICovCisKKy8qCisgKiBDdXJzb3IgQ29udHJvbAorICovCisKKyNkZWZpbmUgU3VuWEtfUGFnZVVwCQkweDAwMDBGRjU1IAkvKiBTYW1lIGFzIFhLX1ByaW9yICovCisjZGVmaW5lIFN1blhLX1BhZ2VEb3duCQkweDAwMDBGRjU2CS8qIFNhbWUgYXMgWEtfTmV4dCAqLworCisvKgorICogT3BlbiBMb29rIEZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgU3VuWEtfVW5kbwkJMHgwMDAwRkY2NQkvKiBTYW1lIGFzIFhLX1VuZG8gKi8KKyNkZWZpbmUgU3VuWEtfQWdhaW4JCTB4MDAwMEZGNjYJLyogU2FtZSBhcyBYS19SZWRvICovCisjZGVmaW5lIFN1blhLX0ZpbmQJCTB4MDAwMEZGNjgJLyogU2FtZSBhcyBYS19GaW5kICovCisjZGVmaW5lIFN1blhLX1N0b3AJCTB4MDAwMEZGNjkJLyogU2FtZSBhcyBYS19DYW5jZWwgKi8KKyNkZWZpbmUgU3VuWEtfUHJvcHMJCTB4MTAwNUZGNzAKKyNkZWZpbmUgU3VuWEtfRnJvbnQJCTB4MTAwNUZGNzEKKyNkZWZpbmUgU3VuWEtfQ29weQkJMHgxMDA1RkY3MgorI2RlZmluZSBTdW5YS19PcGVuCQkweDEwMDVGRjczCisjZGVmaW5lIFN1blhLX1Bhc3RlCQkweDEwMDVGRjc0CisjZGVmaW5lIFN1blhLX0N1dAkJMHgxMDA1RkY3NQorCisjZGVmaW5lIFN1blhLX1Bvd2VyU3dpdGNoCQkweDEwMDVGRjc2CisjZGVmaW5lIFN1blhLX0F1ZGlvTG93ZXJWb2x1bWUJCTB4MTAwNUZGNzcKKyNkZWZpbmUgU3VuWEtfQXVkaW9NdXRlCQkJMHgxMDA1RkY3OAorI2RlZmluZSBTdW5YS19BdWRpb1JhaXNlVm9sdW1lCQkweDEwMDVGRjc5CisjZGVmaW5lIFN1blhLX1ZpZGVvRGVnYXVzcwkJMHgxMDA1RkY3QQorI2RlZmluZSBTdW5YS19WaWRlb0xvd2VyQnJpZ2h0bmVzcwkweDEwMDVGRjdCCisjZGVmaW5lIFN1blhLX1ZpZGVvUmFpc2VCcmlnaHRuZXNzCTB4MTAwNUZGN0MKKyNkZWZpbmUgU3VuWEtfUG93ZXJTd2l0Y2hTaGlmdAkJMHgxMDA1RkY3RApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWM1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YLmgKQEAgLTAsMCArMSw3MjEgQEAKKy8qCisgKgkkWG9yZzogWC5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjIgeG9yZ2N2cyBFeHAgJAorICovCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgWCB3aW5kb3cgc3lzdGVtIGxpa2VseSB0byBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyAqLworCisjaWZuZGVmIFhfSAorI2RlZmluZSBYX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAorCitESUdJVEFMIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9YLmgsdiAxLjYgMjAwMy8wNy8wOSAxNToyNzoyOCB0c2kgRXhwICQgKi8KKworI2RlZmluZSBYX1BST1RPQ09MCTExCQkvKiBjdXJyZW50IHByb3RvY29sIHZlcnNpb24gKi8KKyNkZWZpbmUgWF9QUk9UT0NPTF9SRVZJU0lPTiAwCQkvKiBjdXJyZW50IG1pbm9yIHZlcnNpb24gKi8KKworLyogUmVzb3VyY2VzICovCisKKy8qCisgKiBfWFNFUlZFUjY0IG11c3QgT05MWSBiZSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIFggc2VydmVyIHNvdXJjZXMgb24KKyAqIHN5c3RlbXMgd2hlcmUgdW5zaWduZWQgbG9uZyBpcyBub3QgMzIgYml0cywgbXVzdCBOT1QgYmUgdXNlZCBpbgorICogY2xpZW50IG9yIGxpYnJhcnkgY29kZS4KKyAqLworI2lmbmRlZiBfWFNFUlZFUjY0CisjICBpZm5kZWYgX1hUWVBFREVGX1hJRAorIyAgICBkZWZpbmUgX1hUWVBFREVGX1hJRAordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJRDsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX01BU0sKKyMgICAgZGVmaW5lIF9YVFlQRURFRl9NQVNLCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTWFzazsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX0FUT00KKyMgICAgZGVmaW5lIF9YVFlQRURFRl9BVE9NCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQXRvbTsJCS8qIEFsc28gaW4gWGRlZnMuaCAqLworIyAgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBWaXN1YWxJRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBUaW1lOworI2Vsc2UKKyMgIGluY2x1ZGUgPFgxMS9YbWQuaD4KKyMgIGlmbmRlZiBfWFRZUEVERUZfWElECisjICAgIGRlZmluZSBfWFRZUEVERUZfWElECit0eXBlZGVmIENBUkQzMiBYSUQ7CisjICBlbmRpZgorIyAgaWZuZGVmIF9YVFlQRURFRl9NQVNLCisjICAgIGRlZmluZSBfWFRZUEVERUZfTUFTSwordHlwZWRlZiBDQVJEMzIgTWFzazsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hUWVBFREVGX0FUT00KKyMgICAgZGVmaW5lIF9YVFlQRURFRl9BVE9NCit0eXBlZGVmIENBUkQzMiBBdG9tOworIyAgZW5kaWYKK3R5cGVkZWYgQ0FSRDMyIFZpc3VhbElEOwordHlwZWRlZiBDQVJEMzIgVGltZTsKKyNlbmRpZgorCit0eXBlZGVmIFhJRCBXaW5kb3c7Cit0eXBlZGVmIFhJRCBEcmF3YWJsZTsKKyNpZm5kZWYgX1hUWVBFREVGX0ZPTlQKKyMgIGRlZmluZSBfWFRZUEVERUZfRk9OVAordHlwZWRlZiBYSUQgRm9udDsKKyNlbmRpZgordHlwZWRlZiBYSUQgUGl4bWFwOwordHlwZWRlZiBYSUQgQ3Vyc29yOwordHlwZWRlZiBYSUQgQ29sb3JtYXA7Cit0eXBlZGVmIFhJRCBHQ29udGV4dDsKK3R5cGVkZWYgWElEIEtleVN5bTsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEtleUNvZGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkVTRVJWRUQgUkVTT1VSQ0UgQU5EIENPTlNUQU5UIERFRklOSVRJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTm9uZQorI2RlZmluZSBOb25lICAgICAgICAgICAgICAgICAwTAkvKiB1bml2ZXJzYWwgbnVsbCByZXNvdXJjZSBvciBudWxsIGF0b20gKi8KKyNlbmRpZgorCisjZGVmaW5lIFBhcmVudFJlbGF0aXZlICAgICAgIDFMCS8qIGJhY2tncm91bmQgcGl4bWFwIGluIENyZWF0ZVdpbmRvdworCQkJCSAgICBhbmQgQ2hhbmdlV2luZG93QXR0cmlidXRlcyAqLworCisjZGVmaW5lIENvcHlGcm9tUGFyZW50ICAgICAgIDBMCS8qIGJvcmRlciBwaXhtYXAgaW4gQ3JlYXRlV2luZG93CisJCQkJICAgICAgIGFuZCBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzCisJCQkJICAgc3BlY2lhbCBWaXN1YWxJRCBhbmQgc3BlY2lhbCB3aW5kb3cKKwkJCQkgICAgICAgY2xhc3MgcGFzc2VkIHRvIENyZWF0ZVdpbmRvdyAqLworCisjZGVmaW5lIFBvaW50ZXJXaW5kb3cgICAgICAgIDBMCS8qIGRlc3RpbmF0aW9uIHdpbmRvdyBpbiBTZW5kRXZlbnQgKi8KKyNkZWZpbmUgSW5wdXRGb2N1cyAgICAgICAgICAgMUwJLyogZGVzdGluYXRpb24gd2luZG93IGluIFNlbmRFdmVudCAqLworCisjZGVmaW5lIFBvaW50ZXJSb290ICAgICAgICAgIDFMCS8qIGZvY3VzIHdpbmRvdyBpbiBTZXRJbnB1dEZvY3VzICovCisKKyNkZWZpbmUgQW55UHJvcGVydHlUeXBlICAgICAgMEwJLyogc3BlY2lhbCBBdG9tLCBwYXNzZWQgdG8gR2V0UHJvcGVydHkgKi8KKworI2RlZmluZSBBbnlLZXkJCSAgICAgMEwJLyogc3BlY2lhbCBLZXkgQ29kZSwgcGFzc2VkIHRvIEdyYWJLZXkgKi8KKworI2RlZmluZSBBbnlCdXR0b24gICAgICAgICAgICAwTAkvKiBzcGVjaWFsIEJ1dHRvbiBDb2RlLCBwYXNzZWQgdG8gR3JhYkJ1dHRvbiAqLworCisjZGVmaW5lIEFsbFRlbXBvcmFyeSAgICAgICAgIDBMCS8qIHNwZWNpYWwgUmVzb3VyY2UgSUQgcGFzc2VkIHRvIEtpbGxDbGllbnQgKi8KKworI2RlZmluZSBDdXJyZW50VGltZSAgICAgICAgICAwTAkvKiBzcGVjaWFsIFRpbWUgKi8KKworI2RlZmluZSBOb1N5bWJvbAkgICAgIDBMCS8qIHNwZWNpYWwgS2V5U3ltICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIEVWRU5UIERFRklOSVRJT05TIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnB1dCBFdmVudCBNYXNrcy4gVXNlZCBhcyBldmVudC1tYXNrIHdpbmRvdyBhdHRyaWJ1dGUgYW5kIGFzIGFyZ3VtZW50cworICAgdG8gR3JhYiByZXF1ZXN0cy4gIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGV2ZW50IG5hbWVzLiAgKi8KKworI2RlZmluZSBOb0V2ZW50TWFzawkJCTBMCisjZGVmaW5lIEtleVByZXNzTWFzawkJCSgxTDw8MCkgIAorI2RlZmluZSBLZXlSZWxlYXNlTWFzawkJCSgxTDw8MSkgIAorI2RlZmluZSBCdXR0b25QcmVzc01hc2sJCQkoMUw8PDIpICAKKyNkZWZpbmUgQnV0dG9uUmVsZWFzZU1hc2sJCSgxTDw8MykgIAorI2RlZmluZSBFbnRlcldpbmRvd01hc2sJCQkoMUw8PDQpICAKKyNkZWZpbmUgTGVhdmVXaW5kb3dNYXNrCQkJKDFMPDw1KSAgCisjZGVmaW5lIFBvaW50ZXJNb3Rpb25NYXNrCQkoMUw8PDYpICAKKyNkZWZpbmUgUG9pbnRlck1vdGlvbkhpbnRNYXNrCQkoMUw8PDcpICAKKyNkZWZpbmUgQnV0dG9uMU1vdGlvbk1hc2sJCSgxTDw8OCkgIAorI2RlZmluZSBCdXR0b24yTW90aW9uTWFzawkJKDFMPDw5KSAgCisjZGVmaW5lIEJ1dHRvbjNNb3Rpb25NYXNrCQkoMUw8PDEwKSAKKyNkZWZpbmUgQnV0dG9uNE1vdGlvbk1hc2sJCSgxTDw8MTEpIAorI2RlZmluZSBCdXR0b241TW90aW9uTWFzawkJKDFMPDwxMikgCisjZGVmaW5lIEJ1dHRvbk1vdGlvbk1hc2sJCSgxTDw8MTMpIAorI2RlZmluZSBLZXltYXBTdGF0ZU1hc2sJCQkoMUw8PDE0KQorI2RlZmluZSBFeHBvc3VyZU1hc2sJCQkoMUw8PDE1KSAKKyNkZWZpbmUgVmlzaWJpbGl0eUNoYW5nZU1hc2sJCSgxTDw8MTYpIAorI2RlZmluZSBTdHJ1Y3R1cmVOb3RpZnlNYXNrCQkoMUw8PDE3KSAKKyNkZWZpbmUgUmVzaXplUmVkaXJlY3RNYXNrCQkoMUw8PDE4KSAKKyNkZWZpbmUgU3Vic3RydWN0dXJlTm90aWZ5TWFzawkJKDFMPDwxOSkgCisjZGVmaW5lIFN1YnN0cnVjdHVyZVJlZGlyZWN0TWFzawkoMUw8PDIwKSAKKyNkZWZpbmUgRm9jdXNDaGFuZ2VNYXNrCQkJKDFMPDwyMSkgCisjZGVmaW5lIFByb3BlcnR5Q2hhbmdlTWFzawkJKDFMPDwyMikgCisjZGVmaW5lIENvbG9ybWFwQ2hhbmdlTWFzawkJKDFMPDwyMykgCisjZGVmaW5lIE93bmVyR3JhYkJ1dHRvbk1hc2sJCSgxTDw8MjQpIAorCisvKiBFdmVudCBuYW1lcy4gIFVzZWQgaW4gInR5cGUiIGZpZWxkIGluIFhFdmVudCBzdHJ1Y3R1cmVzLiAgTm90IHRvIGJlCitjb25mdXNlZCB3aXRoIGV2ZW50IG1hc2tzIGFib3ZlLiAgVGhleSBzdGFydCBmcm9tIDIgYmVjYXVzZSAwIGFuZCAxCithcmUgcmVzZXJ2ZWQgaW4gdGhlIHByb3RvY29sIGZvciBlcnJvcnMgYW5kIHJlcGxpZXMuICovCisKKyNkZWZpbmUgS2V5UHJlc3MJCTIKKyNkZWZpbmUgS2V5UmVsZWFzZQkJMworI2RlZmluZSBCdXR0b25QcmVzcwkJNAorI2RlZmluZSBCdXR0b25SZWxlYXNlCQk1CisjZGVmaW5lIE1vdGlvbk5vdGlmeQkJNgorI2RlZmluZSBFbnRlck5vdGlmeQkJNworI2RlZmluZSBMZWF2ZU5vdGlmeQkJOAorI2RlZmluZSBGb2N1c0luCQkJOQorI2RlZmluZSBGb2N1c091dAkJMTAKKyNkZWZpbmUgS2V5bWFwTm90aWZ5CQkxMQorI2RlZmluZSBFeHBvc2UJCQkxMgorI2RlZmluZSBHcmFwaGljc0V4cG9zZQkJMTMKKyNkZWZpbmUgTm9FeHBvc2UJCTE0CisjZGVmaW5lIFZpc2liaWxpdHlOb3RpZnkJMTUKKyNkZWZpbmUgQ3JlYXRlTm90aWZ5CQkxNgorI2RlZmluZSBEZXN0cm95Tm90aWZ5CQkxNworI2RlZmluZSBVbm1hcE5vdGlmeQkJMTgKKyNkZWZpbmUgTWFwTm90aWZ5CQkxOQorI2RlZmluZSBNYXBSZXF1ZXN0CQkyMAorI2RlZmluZSBSZXBhcmVudE5vdGlmeQkJMjEKKyNkZWZpbmUgQ29uZmlndXJlTm90aWZ5CQkyMgorI2RlZmluZSBDb25maWd1cmVSZXF1ZXN0CTIzCisjZGVmaW5lIEdyYXZpdHlOb3RpZnkJCTI0CisjZGVmaW5lIFJlc2l6ZVJlcXVlc3QJCTI1CisjZGVmaW5lIENpcmN1bGF0ZU5vdGlmeQkJMjYKKyNkZWZpbmUgQ2lyY3VsYXRlUmVxdWVzdAkyNworI2RlZmluZSBQcm9wZXJ0eU5vdGlmeQkJMjgKKyNkZWZpbmUgU2VsZWN0aW9uQ2xlYXIJCTI5CisjZGVmaW5lIFNlbGVjdGlvblJlcXVlc3QJMzAKKyNkZWZpbmUgU2VsZWN0aW9uTm90aWZ5CQkzMQorI2RlZmluZSBDb2xvcm1hcE5vdGlmeQkJMzIKKyNkZWZpbmUgQ2xpZW50TWVzc2FnZQkJMzMKKyNkZWZpbmUgTWFwcGluZ05vdGlmeQkJMzQKKyNkZWZpbmUgTEFTVEV2ZW50CQkzNQkvKiBtdXN0IGJlIGJpZ2dlciB0aGFuIGFueSBldmVudCAjICovCisKKworLyogS2V5IG1hc2tzLiBVc2VkIGFzIG1vZGlmaWVycyB0byBHcmFiQnV0dG9uIGFuZCBHcmFiS2V5LCByZXN1bHRzIG9mIFF1ZXJ5UG9pbnRlciwKKyAgIHN0YXRlIGluIHZhcmlvdXMga2V5LSwgbW91c2UtLCBhbmQgYnV0dG9uLXJlbGF0ZWQgZXZlbnRzLiAqLworCisjZGVmaW5lIFNoaWZ0TWFzawkJKDE8PDApCisjZGVmaW5lIExvY2tNYXNrCQkoMTw8MSkKKyNkZWZpbmUgQ29udHJvbE1hc2sJCSgxPDwyKQorI2RlZmluZSBNb2QxTWFzawkJKDE8PDMpCisjZGVmaW5lIE1vZDJNYXNrCQkoMTw8NCkKKyNkZWZpbmUgTW9kM01hc2sJCSgxPDw1KQorI2RlZmluZSBNb2Q0TWFzawkJKDE8PDYpCisjZGVmaW5lIE1vZDVNYXNrCQkoMTw8NykKKworLyogbW9kaWZpZXIgbmFtZXMuICBVc2VkIHRvIGJ1aWxkIGEgU2V0TW9kaWZpZXJNYXBwaW5nIHJlcXVlc3Qgb3IKKyAgIHRvIHJlYWQgYSBHZXRNb2RpZmllck1hcHBpbmcgcmVxdWVzdC4gIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlCisgICBtYXNrcyBkZWZpbmVkIGFib3ZlLiAqLworI2RlZmluZSBTaGlmdE1hcEluZGV4CQkwCisjZGVmaW5lIExvY2tNYXBJbmRleAkJMQorI2RlZmluZSBDb250cm9sTWFwSW5kZXgJCTIKKyNkZWZpbmUgTW9kMU1hcEluZGV4CQkzCisjZGVmaW5lIE1vZDJNYXBJbmRleAkJNAorI2RlZmluZSBNb2QzTWFwSW5kZXgJCTUKKyNkZWZpbmUgTW9kNE1hcEluZGV4CQk2CisjZGVmaW5lIE1vZDVNYXBJbmRleAkJNworCisKKy8qIGJ1dHRvbiBtYXNrcy4gIFVzZWQgaW4gc2FtZSBtYW5uZXIgYXMgS2V5IG1hc2tzIGFib3ZlLiBOb3QgdG8gYmUgY29uZnVzZWQKKyAgIHdpdGggYnV0dG9uIG5hbWVzIGJlbG93LiAqLworCisjZGVmaW5lIEJ1dHRvbjFNYXNrCQkoMTw8OCkKKyNkZWZpbmUgQnV0dG9uMk1hc2sJCSgxPDw5KQorI2RlZmluZSBCdXR0b24zTWFzawkJKDE8PDEwKQorI2RlZmluZSBCdXR0b240TWFzawkJKDE8PDExKQorI2RlZmluZSBCdXR0b241TWFzawkJKDE8PDEyKQorCisjZGVmaW5lIEFueU1vZGlmaWVyCQkoMTw8MTUpICAvKiB1c2VkIGluIEdyYWJCdXR0b24sIEdyYWJLZXkgKi8KKworCisvKiBidXR0b24gbmFtZXMuIFVzZWQgYXMgYXJndW1lbnRzIHRvIEdyYWJCdXR0b24gYW5kIGFzIGRldGFpbCBpbiBCdXR0b25QcmVzcworICAgYW5kIEJ1dHRvblJlbGVhc2UgZXZlbnRzLiAgTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYnV0dG9uIG1hc2tzIGFib3ZlLgorICAgTm90ZSB0aGF0IDAgaXMgYWxyZWFkeSBkZWZpbmVkIGFib3ZlIGFzICJBbnlCdXR0b24iLiAgKi8KKworI2RlZmluZSBCdXR0b24xCQkJMQorI2RlZmluZSBCdXR0b24yCQkJMgorI2RlZmluZSBCdXR0b24zCQkJMworI2RlZmluZSBCdXR0b240CQkJNAorI2RlZmluZSBCdXR0b241CQkJNQorCisvKiBOb3RpZnkgbW9kZXMgKi8KKworI2RlZmluZSBOb3RpZnlOb3JtYWwJCTAKKyNkZWZpbmUgTm90aWZ5R3JhYgkJMQorI2RlZmluZSBOb3RpZnlVbmdyYWIJCTIKKyNkZWZpbmUgTm90aWZ5V2hpbGVHcmFiYmVkCTMKKworI2RlZmluZSBOb3RpZnlIaW50CQkxCS8qIGZvciBNb3Rpb25Ob3RpZnkgZXZlbnRzICovCisJCSAgICAgICAKKy8qIE5vdGlmeSBkZXRhaWwgKi8KKworI2RlZmluZSBOb3RpZnlBbmNlc3RvcgkJMAorI2RlZmluZSBOb3RpZnlWaXJ0dWFsCQkxCisjZGVmaW5lIE5vdGlmeUluZmVyaW9yCQkyCisjZGVmaW5lIE5vdGlmeU5vbmxpbmVhcgkJMworI2RlZmluZSBOb3RpZnlOb25saW5lYXJWaXJ0dWFsCTQKKyNkZWZpbmUgTm90aWZ5UG9pbnRlcgkJNQorI2RlZmluZSBOb3RpZnlQb2ludGVyUm9vdAk2CisjZGVmaW5lIE5vdGlmeURldGFpbE5vbmUJNworCisvKiBWaXNpYmlsaXR5IG5vdGlmeSAqLworCisjZGVmaW5lIFZpc2liaWxpdHlVbm9ic2N1cmVkCQkwCisjZGVmaW5lIFZpc2liaWxpdHlQYXJ0aWFsbHlPYnNjdXJlZAkxCisjZGVmaW5lIFZpc2liaWxpdHlGdWxseU9ic2N1cmVkCQkyCisKKy8qIENpcmN1bGF0aW9uIHJlcXVlc3QgKi8KKworI2RlZmluZSBQbGFjZU9uVG9wCQkwCisjZGVmaW5lIFBsYWNlT25Cb3R0b20JCTEKKworLyogcHJvdG9jb2wgZmFtaWxpZXMgKi8KKworI2RlZmluZSBGYW1pbHlJbnRlcm5ldAkJMAkvKiBJUHY0ICovCisjZGVmaW5lIEZhbWlseURFQ25ldAkJMQorI2RlZmluZSBGYW1pbHlDaGFvcwkJMgorI2RlZmluZSBGYW1pbHlJbnRlcm5ldDYJCTYJLyogSVB2NiAqLworCisvKiBhdXRoZW50aWNhdGlvbiBmYW1pbGllcyBub3QgdGllZCB0byBhIHNwZWNpZmljIHByb3RvY29sICovCisjZGVmaW5lIEZhbWlseVNlcnZlckludGVycHJldGVkIDUKKworLyogUHJvcGVydHkgbm90aWZpY2F0aW9uICovCisKKyNkZWZpbmUgUHJvcGVydHlOZXdWYWx1ZQkwCisjZGVmaW5lIFByb3BlcnR5RGVsZXRlCQkxCisKKy8qIENvbG9yIE1hcCBub3RpZmljYXRpb24gKi8KKworI2RlZmluZSBDb2xvcm1hcFVuaW5zdGFsbGVkCTAKKyNkZWZpbmUgQ29sb3JtYXBJbnN0YWxsZWQJMQorCisvKiBHcmFiUG9pbnRlciwgR3JhYkJ1dHRvbiwgR3JhYktleWJvYXJkLCBHcmFiS2V5IE1vZGVzICovCisKKyNkZWZpbmUgR3JhYk1vZGVTeW5jCQkwCisjZGVmaW5lIEdyYWJNb2RlQXN5bmMJCTEKKworLyogR3JhYlBvaW50ZXIsIEdyYWJLZXlib2FyZCByZXBseSBzdGF0dXMgKi8KKworI2RlZmluZSBHcmFiU3VjY2VzcwkJMAorI2RlZmluZSBBbHJlYWR5R3JhYmJlZAkJMQorI2RlZmluZSBHcmFiSW52YWxpZFRpbWUJCTIKKyNkZWZpbmUgR3JhYk5vdFZpZXdhYmxlCQkzCisjZGVmaW5lIEdyYWJGcm96ZW4JCTQKKworLyogQWxsb3dFdmVudHMgbW9kZXMgKi8KKworI2RlZmluZSBBc3luY1BvaW50ZXIJCTAKKyNkZWZpbmUgU3luY1BvaW50ZXIJCTEKKyNkZWZpbmUgUmVwbGF5UG9pbnRlcgkJMgorI2RlZmluZSBBc3luY0tleWJvYXJkCQkzCisjZGVmaW5lIFN5bmNLZXlib2FyZAkJNAorI2RlZmluZSBSZXBsYXlLZXlib2FyZAkJNQorI2RlZmluZSBBc3luY0JvdGgJCTYKKyNkZWZpbmUgU3luY0JvdGgJCTcKKworLyogVXNlZCBpbiBTZXRJbnB1dEZvY3VzLCBHZXRJbnB1dEZvY3VzICovCisKKyNkZWZpbmUgUmV2ZXJ0VG9Ob25lCQkoaW50KU5vbmUKKyNkZWZpbmUgUmV2ZXJ0VG9Qb2ludGVyUm9vdAkoaW50KVBvaW50ZXJSb290CisjZGVmaW5lIFJldmVydFRvUGFyZW50CQkyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRVJST1IgQ09ERVMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU3VjY2VzcwkJICAgMAkvKiBldmVyeXRoaW5nJ3Mgb2theSAqLworI2RlZmluZSBCYWRSZXF1ZXN0CSAgIDEJLyogYmFkIHJlcXVlc3QgY29kZSAqLworI2RlZmluZSBCYWRWYWx1ZQkgICAyCS8qIGludCBwYXJhbWV0ZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lIEJhZFdpbmRvdwkgICAzCS8qIHBhcmFtZXRlciBub3QgYSBXaW5kb3cgKi8KKyNkZWZpbmUgQmFkUGl4bWFwCSAgIDQJLyogcGFyYW1ldGVyIG5vdCBhIFBpeG1hcCAqLworI2RlZmluZSBCYWRBdG9tCQkgICA1CS8qIHBhcmFtZXRlciBub3QgYW4gQXRvbSAqLworI2RlZmluZSBCYWRDdXJzb3IJICAgNgkvKiBwYXJhbWV0ZXIgbm90IGEgQ3Vyc29yICovCisjZGVmaW5lIEJhZEZvbnQJCSAgIDcJLyogcGFyYW1ldGVyIG5vdCBhIEZvbnQgKi8KKyNkZWZpbmUgQmFkTWF0Y2gJICAgOAkvKiBwYXJhbWV0ZXIgbWlzbWF0Y2ggKi8KKyNkZWZpbmUgQmFkRHJhd2FibGUJICAgOQkvKiBwYXJhbWV0ZXIgbm90IGEgUGl4bWFwIG9yIFdpbmRvdyAqLworI2RlZmluZSBCYWRBY2Nlc3MJICAxMAkvKiBkZXBlbmRpbmcgb24gY29udGV4dDoKKwkJCQkgLSBrZXkvYnV0dG9uIGFscmVhZHkgZ3JhYmJlZAorCQkJCSAtIGF0dGVtcHQgdG8gZnJlZSBhbiBpbGxlZ2FsIAorCQkJCSAgIGNtYXAgZW50cnkgCisJCQkJLSBhdHRlbXB0IHRvIHN0b3JlIGludG8gYSByZWFkLW9ubHkgCisJCQkJICAgY29sb3IgbWFwIGVudHJ5LgorIAkJCQktIGF0dGVtcHQgdG8gbW9kaWZ5IHRoZSBhY2Nlc3MgY29udHJvbAorCQkJCSAgIGxpc3QgZnJvbSBvdGhlciB0aGFuIHRoZSBsb2NhbCBob3N0LgorCQkJCSovCisjZGVmaW5lIEJhZEFsbG9jCSAgMTEJLyogaW5zdWZmaWNpZW50IHJlc291cmNlcyAqLworI2RlZmluZSBCYWRDb2xvcgkgIDEyCS8qIG5vIHN1Y2ggY29sb3JtYXAgKi8KKyNkZWZpbmUgQmFkR0MJCSAgMTMJLyogcGFyYW1ldGVyIG5vdCBhIEdDICovCisjZGVmaW5lIEJhZElEQ2hvaWNlCSAgMTQJLyogY2hvaWNlIG5vdCBpbiByYW5nZSBvciBhbHJlYWR5IHVzZWQgKi8KKyNkZWZpbmUgQmFkTmFtZQkJICAxNQkvKiBmb250IG9yIGNvbG9yIG5hbWUgZG9lc24ndCBleGlzdCAqLworI2RlZmluZSBCYWRMZW5ndGgJICAxNgkvKiBSZXF1ZXN0IGxlbmd0aCBpbmNvcnJlY3QgKi8KKyNkZWZpbmUgQmFkSW1wbGVtZW50YXRpb24gMTcJLyogc2VydmVyIGlzIGRlZmVjdGl2ZSAqLworCisjZGVmaW5lIEZpcnN0RXh0ZW5zaW9uRXJyb3IJMTI4CisjZGVmaW5lIExhc3RFeHRlbnNpb25FcnJvcgkyNTUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXSU5ET1cgREVGSU5JVElPTlMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdpbmRvdyBjbGFzc2VzIHVzZWQgYnkgQ3JlYXRlV2luZG93ICovCisvKiBOb3RlIHRoYXQgQ29weUZyb21QYXJlbnQgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIDAgYWJvdmUgKi8KKworI2RlZmluZSBJbnB1dE91dHB1dAkJMQorI2RlZmluZSBJbnB1dE9ubHkJCTIKKworLyogV2luZG93IGF0dHJpYnV0ZXMgZm9yIENyZWF0ZVdpbmRvdyBhbmQgQ2hhbmdlV2luZG93QXR0cmlidXRlcyAqLworCisjZGVmaW5lIENXQmFja1BpeG1hcAkJKDFMPDwwKQorI2RlZmluZSBDV0JhY2tQaXhlbAkJKDFMPDwxKQorI2RlZmluZSBDV0JvcmRlclBpeG1hcAkJKDFMPDwyKQorI2RlZmluZSBDV0JvcmRlclBpeGVsICAgICAgICAgICAoMUw8PDMpCisjZGVmaW5lIENXQml0R3Jhdml0eQkJKDFMPDw0KQorI2RlZmluZSBDV1dpbkdyYXZpdHkJCSgxTDw8NSkKKyNkZWZpbmUgQ1dCYWNraW5nU3RvcmUgICAgICAgICAgKDFMPDw2KQorI2RlZmluZSBDV0JhY2tpbmdQbGFuZXMJICAgICAgICAoMUw8PDcpCisjZGVmaW5lIENXQmFja2luZ1BpeGVsCSAgICAgICAgKDFMPDw4KQorI2RlZmluZSBDV092ZXJyaWRlUmVkaXJlY3QJKDFMPDw5KQorI2RlZmluZSBDV1NhdmVVbmRlcgkJKDFMPDwxMCkKKyNkZWZpbmUgQ1dFdmVudE1hc2sJCSgxTDw8MTEpCisjZGVmaW5lIENXRG9udFByb3BhZ2F0ZQkgICAgICAgICgxTDw8MTIpCisjZGVmaW5lIENXQ29sb3JtYXAJCSgxTDw8MTMpCisjZGVmaW5lIENXQ3Vyc29yCSAgICAgICAgKDFMPDwxNCkKKworLyogQ29uZmlndXJlV2luZG93IHN0cnVjdHVyZSAqLworCisjZGVmaW5lIENXWAkJCSgxPDwwKQorI2RlZmluZSBDV1kJCQkoMTw8MSkKKyNkZWZpbmUgQ1dXaWR0aAkJCSgxPDwyKQorI2RlZmluZSBDV0hlaWdodAkJKDE8PDMpCisjZGVmaW5lIENXQm9yZGVyV2lkdGgJCSgxPDw0KQorI2RlZmluZSBDV1NpYmxpbmcJCSgxPDw1KQorI2RlZmluZSBDV1N0YWNrTW9kZQkJKDE8PDYpCisKKworLyogQml0IEdyYXZpdHkgKi8KKworI2RlZmluZSBGb3JnZXRHcmF2aXR5CQkwCisjZGVmaW5lIE5vcnRoV2VzdEdyYXZpdHkJMQorI2RlZmluZSBOb3J0aEdyYXZpdHkJCTIKKyNkZWZpbmUgTm9ydGhFYXN0R3Jhdml0eQkzCisjZGVmaW5lIFdlc3RHcmF2aXR5CQk0CisjZGVmaW5lIENlbnRlckdyYXZpdHkJCTUKKyNkZWZpbmUgRWFzdEdyYXZpdHkJCTYKKyNkZWZpbmUgU291dGhXZXN0R3Jhdml0eQk3CisjZGVmaW5lIFNvdXRoR3Jhdml0eQkJOAorI2RlZmluZSBTb3V0aEVhc3RHcmF2aXR5CTkKKyNkZWZpbmUgU3RhdGljR3Jhdml0eQkJMTAKKworLyogV2luZG93IGdyYXZpdHkgKyBiaXQgZ3Jhdml0eSBhYm92ZSAqLworCisjZGVmaW5lIFVubWFwR3Jhdml0eQkJMAorCisvKiBVc2VkIGluIENyZWF0ZVdpbmRvdyBmb3IgYmFja2luZy1zdG9yZSBoaW50ICovCisKKyNkZWZpbmUgTm90VXNlZnVsICAgICAgICAgICAgICAgMAorI2RlZmluZSBXaGVuTWFwcGVkICAgICAgICAgICAgICAxCisjZGVmaW5lIEFsd2F5cyAgICAgICAgICAgICAgICAgIDIKKworLyogVXNlZCBpbiBHZXRXaW5kb3dBdHRyaWJ1dGVzIHJlcGx5ICovCisKKyNkZWZpbmUgSXNVbm1hcHBlZAkJMAorI2RlZmluZSBJc1Vudmlld2FibGUJCTEKKyNkZWZpbmUgSXNWaWV3YWJsZQkJMgorCisvKiBVc2VkIGluIENoYW5nZVNhdmVTZXQgKi8KKworI2RlZmluZSBTZXRNb2RlSW5zZXJ0ICAgICAgICAgICAwCisjZGVmaW5lIFNldE1vZGVEZWxldGUgICAgICAgICAgIDEKKworLyogVXNlZCBpbiBDaGFuZ2VDbG9zZURvd25Nb2RlICovCisKKyNkZWZpbmUgRGVzdHJveUFsbCAgICAgICAgICAgICAgMAorI2RlZmluZSBSZXRhaW5QZXJtYW5lbnQgICAgICAgICAxCisjZGVmaW5lIFJldGFpblRlbXBvcmFyeSAgICAgICAgIDIKKworLyogV2luZG93IHN0YWNraW5nIG1ldGhvZCAoaW4gY29uZmlndXJlV2luZG93KSAqLworCisjZGVmaW5lIEFib3ZlICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQmVsb3cgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUb3BJZiAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJvdHRvbUlmICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgT3Bwb3NpdGUgICAgICAgICAgICAgICAgNAorCisvKiBDaXJjdWxhdGlvbiBkaXJlY3Rpb24gKi8KKworI2RlZmluZSBSYWlzZUxvd2VzdCAgICAgICAgICAgICAwCisjZGVmaW5lIExvd2VySGlnaGVzdCAgICAgICAgICAgIDEKKworLyogUHJvcGVydHkgbW9kZXMgKi8KKworI2RlZmluZSBQcm9wTW9kZVJlcGxhY2UgICAgICAgICAwCisjZGVmaW5lIFByb3BNb2RlUHJlcGVuZCAgICAgICAgIDEKKyNkZWZpbmUgUHJvcE1vZGVBcHBlbmQgICAgICAgICAgMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdSQVBISUNTIERFRklOSVRJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGdyYXBoaWNzIGZ1bmN0aW9ucywgYXMgaW4gR0MuYWx1ICovCisKKyNkZWZpbmUJR1hjbGVhcgkJCTB4MAkJLyogMCAqLworI2RlZmluZSBHWGFuZAkJCTB4MQkJLyogc3JjIEFORCBkc3QgKi8KKyNkZWZpbmUgR1hhbmRSZXZlcnNlCQkweDIJCS8qIHNyYyBBTkQgTk9UIGRzdCAqLworI2RlZmluZSBHWGNvcHkJCQkweDMJCS8qIHNyYyAqLworI2RlZmluZSBHWGFuZEludmVydGVkCQkweDQJCS8qIE5PVCBzcmMgQU5EIGRzdCAqLworI2RlZmluZQlHWG5vb3AJCQkweDUJCS8qIGRzdCAqLworI2RlZmluZSBHWHhvcgkJCTB4NgkJLyogc3JjIFhPUiBkc3QgKi8KKyNkZWZpbmUgR1hvcgkJCTB4NwkJLyogc3JjIE9SIGRzdCAqLworI2RlZmluZSBHWG5vcgkJCTB4OAkJLyogTk9UIHNyYyBBTkQgTk9UIGRzdCAqLworI2RlZmluZSBHWGVxdWl2CQkJMHg5CQkvKiBOT1Qgc3JjIFhPUiBkc3QgKi8KKyNkZWZpbmUgR1hpbnZlcnQJCTB4YQkJLyogTk9UIGRzdCAqLworI2RlZmluZSBHWG9yUmV2ZXJzZQkJMHhiCQkvKiBzcmMgT1IgTk9UIGRzdCAqLworI2RlZmluZSBHWGNvcHlJbnZlcnRlZAkJMHhjCQkvKiBOT1Qgc3JjICovCisjZGVmaW5lIEdYb3JJbnZlcnRlZAkJMHhkCQkvKiBOT1Qgc3JjIE9SIGRzdCAqLworI2RlZmluZSBHWG5hbmQJCQkweGUJCS8qIE5PVCBzcmMgT1IgTk9UIGRzdCAqLworI2RlZmluZSBHWHNldAkJCTB4ZgkJLyogMSAqLworCisvKiBMaW5lU3R5bGUgKi8KKworI2RlZmluZSBMaW5lU29saWQJCTAKKyNkZWZpbmUgTGluZU9uT2ZmRGFzaAkJMQorI2RlZmluZSBMaW5lRG91YmxlRGFzaAkJMgorCisvKiBjYXBTdHlsZSAqLworCisjZGVmaW5lIENhcE5vdExhc3QJCTAKKyNkZWZpbmUgQ2FwQnV0dAkJCTEKKyNkZWZpbmUgQ2FwUm91bmQJCTIKKyNkZWZpbmUgQ2FwUHJvamVjdGluZwkJMworCisvKiBqb2luU3R5bGUgKi8KKworI2RlZmluZSBKb2luTWl0ZXIJCTAKKyNkZWZpbmUgSm9pblJvdW5kCQkxCisjZGVmaW5lIEpvaW5CZXZlbAkJMgorCisvKiBmaWxsU3R5bGUgKi8KKworI2RlZmluZSBGaWxsU29saWQJCTAKKyNkZWZpbmUgRmlsbFRpbGVkCQkxCisjZGVmaW5lIEZpbGxTdGlwcGxlZAkJMgorI2RlZmluZSBGaWxsT3BhcXVlU3RpcHBsZWQJMworCisvKiBmaWxsUnVsZSAqLworCisjZGVmaW5lIEV2ZW5PZGRSdWxlCQkwCisjZGVmaW5lIFdpbmRpbmdSdWxlCQkxCisKKy8qIHN1YndpbmRvdyBtb2RlICovCisKKyNkZWZpbmUgQ2xpcEJ5Q2hpbGRyZW4JCTAKKyNkZWZpbmUgSW5jbHVkZUluZmVyaW9ycwkxCisKKy8qIFNldENsaXBSZWN0YW5nbGVzIG9yZGVyaW5nICovCisKKyNkZWZpbmUgVW5zb3J0ZWQJCTAKKyNkZWZpbmUgWVNvcnRlZAkJCTEKKyNkZWZpbmUgWVhTb3J0ZWQJCTIKKyNkZWZpbmUgWVhCYW5kZWQJCTMKKworLyogQ29vcmRpbmF0ZU1vZGUgZm9yIGRyYXdpbmcgcm91dGluZXMgKi8KKworI2RlZmluZSBDb29yZE1vZGVPcmlnaW4JCTAJLyogcmVsYXRpdmUgdG8gdGhlIG9yaWdpbiAqLworI2RlZmluZSBDb29yZE1vZGVQcmV2aW91cyAgICAgICAxCS8qIHJlbGF0aXZlIHRvIHByZXZpb3VzIHBvaW50ICovCisKKy8qIFBvbHlnb24gc2hhcGVzICovCisKKyNkZWZpbmUgQ29tcGxleAkJCTAJLyogcGF0aHMgbWF5IGludGVyc2VjdCAqLworI2RlZmluZSBOb25jb252ZXgJCTEJLyogbm8gcGF0aHMgaW50ZXJzZWN0LCBidXQgbm90IGNvbnZleCAqLworI2RlZmluZSBDb252ZXgJCQkyCS8qIHdob2xseSBjb252ZXggKi8KKworLyogQXJjIG1vZGVzIGZvciBQb2x5RmlsbEFyYyAqLworCisjZGVmaW5lIEFyY0Nob3JkCQkwCS8qIGpvaW4gZW5kcG9pbnRzIG9mIGFyYyAqLworI2RlZmluZSBBcmNQaWVTbGljZQkJMQkvKiBqb2luIGVuZHBvaW50cyB0byBjZW50ZXIgb2YgYXJjICovCisKKy8qIEdDIGNvbXBvbmVudHM6IG1hc2tzIHVzZWQgaW4gQ3JlYXRlR0MsIENvcHlHQywgQ2hhbmdlR0MsIE9SJ2VkIGludG8KKyAgIEdDLnN0YXRlQ2hhbmdlcyAqLworCisjZGVmaW5lIEdDRnVuY3Rpb24gICAgICAgICAgICAgICgxTDw8MCkKKyNkZWZpbmUgR0NQbGFuZU1hc2sgICAgICAgICAgICAgKDFMPDwxKQorI2RlZmluZSBHQ0ZvcmVncm91bmQgICAgICAgICAgICAoMUw8PDIpCisjZGVmaW5lIEdDQmFja2dyb3VuZCAgICAgICAgICAgICgxTDw8MykKKyNkZWZpbmUgR0NMaW5lV2lkdGggICAgICAgICAgICAgKDFMPDw0KQorI2RlZmluZSBHQ0xpbmVTdHlsZSAgICAgICAgICAgICAoMUw8PDUpCisjZGVmaW5lIEdDQ2FwU3R5bGUgICAgICAgICAgICAgICgxTDw8NikKKyNkZWZpbmUgR0NKb2luU3R5bGUJCSgxTDw8NykKKyNkZWZpbmUgR0NGaWxsU3R5bGUJCSgxTDw8OCkKKyNkZWZpbmUgR0NGaWxsUnVsZQkJKDFMPDw5KSAKKyNkZWZpbmUgR0NUaWxlCQkJKDFMPDwxMCkKKyNkZWZpbmUgR0NTdGlwcGxlCQkoMUw8PDExKQorI2RlZmluZSBHQ1RpbGVTdGlwWE9yaWdpbgkoMUw8PDEyKQorI2RlZmluZSBHQ1RpbGVTdGlwWU9yaWdpbgkoMUw8PDEzKQorI2RlZmluZSBHQ0ZvbnQgCQkJKDFMPDwxNCkKKyNkZWZpbmUgR0NTdWJ3aW5kb3dNb2RlCQkoMUw8PDE1KQorI2RlZmluZSBHQ0dyYXBoaWNzRXhwb3N1cmVzICAgICAoMUw8PDE2KQorI2RlZmluZSBHQ0NsaXBYT3JpZ2luCQkoMUw8PDE3KQorI2RlZmluZSBHQ0NsaXBZT3JpZ2luCQkoMUw8PDE4KQorI2RlZmluZSBHQ0NsaXBNYXNrCQkoMUw8PDE5KQorI2RlZmluZSBHQ0Rhc2hPZmZzZXQJCSgxTDw8MjApCisjZGVmaW5lIEdDRGFzaExpc3QJCSgxTDw8MjEpCisjZGVmaW5lIEdDQXJjTW9kZQkJKDFMPDwyMikKKworI2RlZmluZSBHQ0xhc3RCaXQJCTIyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZPTlRTIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB1c2VkIGluIFF1ZXJ5Rm9udCAtLSBkcmF3IGRpcmVjdGlvbiAqLworCisjZGVmaW5lIEZvbnRMZWZ0VG9SaWdodAkJMAorI2RlZmluZSBGb250UmlnaHRUb0xlZnQJCTEKKworI2RlZmluZSBGb250Q2hhbmdlCQkyNTUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSU1BR0lORyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW1hZ2VGb3JtYXQgLS0gUHV0SW1hZ2UsIEdldEltYWdlICovCisKKyNkZWZpbmUgWFlCaXRtYXAJCTAJLyogZGVwdGggMSwgWFlGb3JtYXQgKi8KKyNkZWZpbmUgWFlQaXhtYXAJCTEJLyogZGVwdGggPT0gZHJhd2FibGUgZGVwdGggKi8KKyNkZWZpbmUgWlBpeG1hcAkJCTIJLyogZGVwdGggPT0gZHJhd2FibGUgZGVwdGggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ09MT1IgTUFQIFNUVUZGIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGb3IgQ3JlYXRlQ29sb3JtYXAgKi8KKworI2RlZmluZSBBbGxvY05vbmUJCTAJLyogY3JlYXRlIG1hcCB3aXRoIG5vIGVudHJpZXMgKi8KKyNkZWZpbmUgQWxsb2NBbGwJCTEJLyogYWxsb2NhdGUgZW50aXJlIG1hcCB3cml0ZWFibGUgKi8KKworCisvKiBGbGFncyB1c2VkIGluIFN0b3JlTmFtZWRDb2xvciwgU3RvcmVDb2xvcnMgKi8KKworI2RlZmluZSBEb1JlZAkJCSgxPDwwKQorI2RlZmluZSBEb0dyZWVuCQkJKDE8PDEpCisjZGVmaW5lIERvQmx1ZQkJCSgxPDwyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENVUlNPUiBTVFVGRgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBRdWVyeUJlc3RTaXplIENsYXNzICovCisKKyNkZWZpbmUgQ3Vyc29yU2hhcGUJCTAJLyogbGFyZ2VzdCBzaXplIHRoYXQgY2FuIGJlIGRpc3BsYXllZCAqLworI2RlZmluZSBUaWxlU2hhcGUJCTEJLyogc2l6ZSB0aWxlZCBmYXN0ZXN0ICovCisjZGVmaW5lIFN0aXBwbGVTaGFwZQkJMgkvKiBzaXplIHN0aXBwbGVkIGZhc3Rlc3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogS0VZQk9BUkQvUE9JTlRFUiBTVFVGRgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEF1dG9SZXBlYXRNb2RlT2ZmCTAKKyNkZWZpbmUgQXV0b1JlcGVhdE1vZGVPbgkxCisjZGVmaW5lIEF1dG9SZXBlYXRNb2RlRGVmYXVsdAkyCisKKyNkZWZpbmUgTGVkTW9kZU9mZgkJMAorI2RlZmluZSBMZWRNb2RlT24JCTEKKworLyogbWFza3MgZm9yIENoYW5nZUtleWJvYXJkQ29udHJvbCAqLworCisjZGVmaW5lIEtCS2V5Q2xpY2tQZXJjZW50CSgxTDw8MCkKKyNkZWZpbmUgS0JCZWxsUGVyY2VudAkJKDFMPDwxKQorI2RlZmluZSBLQkJlbGxQaXRjaAkJKDFMPDwyKQorI2RlZmluZSBLQkJlbGxEdXJhdGlvbgkJKDFMPDwzKQorI2RlZmluZSBLQkxlZAkJCSgxTDw8NCkKKyNkZWZpbmUgS0JMZWRNb2RlCQkoMUw8PDUpCisjZGVmaW5lIEtCS2V5CQkJKDFMPDw2KQorI2RlZmluZSBLQkF1dG9SZXBlYXRNb2RlCSgxTDw8NykKKworI2RlZmluZSBNYXBwaW5nU3VjY2VzcyAgICAgCTAKKyNkZWZpbmUgTWFwcGluZ0J1c3kgICAgICAgIAkxCisjZGVmaW5lIE1hcHBpbmdGYWlsZWQJCTIKKworI2RlZmluZSBNYXBwaW5nTW9kaWZpZXIJCTAKKyNkZWZpbmUgTWFwcGluZ0tleWJvYXJkCQkxCisjZGVmaW5lIE1hcHBpbmdQb2ludGVyCQkyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0NSRUVOIFNBVkVSIFNUVUZGIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERvbnRQcmVmZXJCbGFua2luZwkwCisjZGVmaW5lIFByZWZlckJsYW5raW5nCQkxCisjZGVmaW5lIERlZmF1bHRCbGFua2luZwkJMgorCisjZGVmaW5lIERpc2FibGVTY3JlZW5TYXZlcgkwCisjZGVmaW5lIERpc2FibGVTY3JlZW5JbnRlcnZhbAkwCisKKyNkZWZpbmUgRG9udEFsbG93RXhwb3N1cmVzCTAKKyNkZWZpbmUgQWxsb3dFeHBvc3VyZXMJCTEKKyNkZWZpbmUgRGVmYXVsdEV4cG9zdXJlcwkyCisKKy8qIGZvciBGb3JjZVNjcmVlblNhdmVyICovCisKKyNkZWZpbmUgU2NyZWVuU2F2ZXJSZXNldCAwCisjZGVmaW5lIFNjcmVlblNhdmVyQWN0aXZlIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIT1NUUyBBTkQgQ09OTkVDVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZm9yIENoYW5nZUhvc3RzICovCisKKyNkZWZpbmUgSG9zdEluc2VydAkJMAorI2RlZmluZSBIb3N0RGVsZXRlCQkxCisKKy8qIGZvciBDaGFuZ2VBY2Nlc3NDb250cm9sICovCisKKyNkZWZpbmUgRW5hYmxlQWNjZXNzCQkxICAgICAgCisjZGVmaW5lIERpc2FibGVBY2Nlc3MJCTAKKworLyogRGlzcGxheSBjbGFzc2VzICB1c2VkIGluIG9wZW5pbmcgdGhlIGNvbm5lY3Rpb24gCisgKiBOb3RlIHRoYXQgdGhlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9uZXMgYXJlIGV2ZW4gbnVtYmVyZWQgYW5kIHRoZQorICogZHluYW1pY2FsbHkgY2hhbmdlYWJsZSBvbmVzIGFyZSBvZGQgbnVtYmVyZWQgKi8KKworI2RlZmluZSBTdGF0aWNHcmF5CQkwCisjZGVmaW5lIEdyYXlTY2FsZQkJMQorI2RlZmluZSBTdGF0aWNDb2xvcgkJMgorI2RlZmluZSBQc2V1ZG9Db2xvcgkJMworI2RlZmluZSBUcnVlQ29sb3IJCTQKKyNkZWZpbmUgRGlyZWN0Q29sb3IJCTUKKworCisvKiBCeXRlIG9yZGVyICB1c2VkIGluIGltYWdlQnl0ZU9yZGVyIGFuZCBiaXRtYXBCaXRPcmRlciAqLworCisjZGVmaW5lIExTQkZpcnN0CQkwCisjZGVmaW5lIE1TQkZpcnN0CQkxCisKKyNlbmRpZiAvKiBYX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hGODZrZXlzeW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hGODZrZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBlZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWEY4NmtleXN5bS5oCkBAIC0wLDAgKzEsMjA1IEBACisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9YRjg2a2V5c3ltLmgsdiAxLjE2IDIwMDMvMDIvMTEgMDI6NTE6MTAgZGF3ZXMgRXhwICQgKi8KKworLyoKKyAqIFhGcmVlODYgdmVuZG9yIHNwZWNpZmljIGtleXN5bXMuCisgKgorICogVGhlIFhGcmVlODYga2V5c3ltIHJhbmdlIGlzIDB4MTAwODAwMDEgLSAweDEwMDhGRkZGLgorICoKKyAqIFdoZW4gYWRkaW5nIG5ldyBlbnRyaWVzLCB0aGUgeGMvbGliL1hLZXlzeW1EQiBmaWxlIHNob3VsZCBhbHNvIGJlCisgKiB1cGRhdGVkIHRvIG1ha2UgdGhlIG5ldyBlbnRyaWVzIHZpc2libGUgdG8gWGxpYi4KKyAqLworCisvKgorICogTW9kZUxvY2sKKyAqCisgKiBUaGlzIG9uZSBpcyBvbGQsIGFuZCBub3QgcmVhbGx5IHVzZWQgYW55IG1vcmUgc2luY2UgWEtCIG9mZmVycyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5LgorICovCisKKyNkZWZpbmUgWEY4NlhLX01vZGVMb2NrCQkweDEwMDhGRjAxCS8qIE1vZGUgU3dpdGNoIExvY2sgKi8KKworLyoKKyAqIE5vdGUsIDB4MTAwOEZGMDcgLSAweDEwMDhGRjBGIGFyZSBmcmVlIGFuZCBzaG91bGQgYmUgdXNlZCBmb3IgbWlzYyBuZXcKKyAqIGtleXN5bXMgdGhhdCBkb24ndCBmaXQgaW50byBhbnkgb2YgdGhlIGdyb3VwcyBiZWxvdy4KKyAqCisgKiAweDEwMDhGRjY0LCAweDEwMDhGRjZGLCAweDEwMDhGRjcxLCAweDEwMDhGRjgzIGFyZSBubyBsb25nZXIgdXNlZCwKKyAqIGFuZCBzaG91bGQgYmUgdXNlZCBmaXJzdCBmb3IgbmV3IGtleXN5bXMuCisgKgorICogQ2hlY2sgaW4ga2V5c3ltZGVmLmggZm9yIGdlbmVyaWMgc3ltYm9scyBiZWZvcmUgYWRkaW5nIG5ldyBYRnJlZTg2LXNwZWNpZmljCisgKiBzeW1ib2xzIGhlcmUuCisgKgorICogWC5Pcmcgd2lsbCBub3QgYmUgYWRkaW5nIHRvIHRoZSBYRjg2IHNldCBvZiBrZXlzeW1zLCB0aG91Z2ggdGhleSBoYXZlCisgKiBiZWVuIGFkb3B0ZWQgYW5kIGFyZSBjb25zaWRlcmVkIGEgInN0YW5kYXJkIiBwYXJ0IG9mIFgga2V5c3ltIGRlZmluaXRpb25zLgorICogWEZyZWU4NiBuZXZlciBwcm9wZXJseSBjb21tZW50ZWQgdGhlc2Uga2V5c3ltcywgc28gd2UgaGF2ZSBkb25lIG91cgorICogYmVzdCB0byBleHBsYWluIHRoZSBzZW1hbnRpYyBtZWFuaW5nIG9mIHRoZXNlIGtleXMuCisgKgorICogWEZyZWU4NiBoYXMgcmVtb3ZlZCB0aGVpciBtYWlsIGFyY2hpdmVzIG9mIHRoZSBwZXJpb2QsIHRoYXQgbWlnaHQgaGF2ZQorICogc2hlZCBtb3JlIGxpZ2h0IG9uIHNvbWUgb2YgdGhlc2UgZGVmaW5pdGlvbnMuIFVudGlsL3VubGVzcyB3ZSByZXN1cnJlY3QKKyAqIHRoZXNlIGFyY2hpdmVzLCB0aGVzZSBhcmUgZnJvbSBtZW1vcnkgYW5kIHVzYWdlLgorICovCisKKworLyogQmFja2xpZ2h0IGNvbnRyb2xzLiAqLworI2RlZmluZSBYRjg2WEtfTW9uQnJpZ2h0bmVzc1VwICAgMHgxMDA4RkYwMiAgLyogTW9uaXRvci9wYW5lbCBicmlnaHRuZXNzICovCisjZGVmaW5lIFhGODZYS19Nb25CcmlnaHRuZXNzRG93biAweDEwMDhGRjAzICAvKiBNb25pdG9yL3BhbmVsIGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgWEY4NlhLX0tiZExpZ2h0T25PZmYgICAgIDB4MTAwOEZGMDQgIC8qIEtleWJvYXJkcyBtYXkgYmUgbGl0ICAgICAqLworI2RlZmluZSBYRjg2WEtfS2JkQnJpZ2h0bmVzc1VwICAgMHgxMDA4RkYwNSAgLyogS2V5Ym9hcmRzIG1heSBiZSBsaXQgICAgICovCisjZGVmaW5lIFhGODZYS19LYmRCcmlnaHRuZXNzRG93biAweDEwMDhGRjA2ICAvKiBLZXlib2FyZHMgbWF5IGJlIGxpdCAgICAgKi8KKworLyoKKyAqIEtleXMgZm91bmQgb24gc29tZSAiSW50ZXJuZXQiIGtleWJvYXJkcy4KKyAqLworI2RlZmluZSBYRjg2WEtfU3RhbmRieQkJMHgxMDA4RkYxMCAgIC8qIFN5c3RlbSBpbnRvIHN0YW5kYnkgbW9kZSAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb0xvd2VyVm9sdW1lCTB4MTAwOEZGMTEgICAvKiBWb2x1bWUgY29udHJvbCBkb3duICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9NdXRlCTB4MTAwOEZGMTIgICAvKiBNdXRlIHNvdW5kIGZyb20gdGhlIHN5c3RlbSAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9SYWlzZVZvbHVtZQkweDEwMDhGRjEzICAgLyogVm9sdW1lIGNvbnRyb2wgdXAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUGxheQkweDEwMDhGRjE0ICAgLyogU3RhcnQgcGxheWluZyBvZiBhdWRpbyA+ICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvU3RvcAkweDEwMDhGRjE1ICAgLyogU3RvcCBwbGF5aW5nIGF1ZGlvICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUHJldgkweDEwMDhGRjE2ICAgLyogUHJldmlvdXMgdHJhY2sgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvTmV4dAkweDEwMDhGRjE3ICAgLyogTmV4dCB0cmFjayAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0hvbWVQYWdlCQkweDEwMDhGRjE4ICAgLyogRGlzcGxheSB1c2VyJ3MgaG9tZSBwYWdlICAgKi8KKyNkZWZpbmUgWEY4NlhLX01haWwJCTB4MTAwOEZGMTkgICAvKiBJbnZva2UgdXNlcidzIG1haWwgcHJvZ3JhbSAqLworI2RlZmluZSBYRjg2WEtfU3RhcnQJCTB4MTAwOEZGMUEgICAvKiBTdGFydCBhcHBsaWNhdGlvbiAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfU2VhcmNoCQkweDEwMDhGRjFCICAgLyogU2VhcmNoICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUmVjb3JkCTB4MTAwOEZGMUMgICAvKiBSZWNvcmQgYXVkaW8gYXBwbGljYXRpb24gICAqLworCisvKiBUaGVzZSBhcmUgc29tZXRpbWVzIGZvdW5kIG9uIFBEQSdzIChlLmcuIFBhbG0sIFBvY2tldFBDIG9yIGVsc2V3aGVyZSkgICAqLworI2RlZmluZSBYRjg2WEtfQ2FsY3VsYXRvcgkweDEwMDhGRjFEICAgLyogSW52b2tlIGNhbGN1bGF0b3IgcHJvZ3JhbSAgKi8KKyNkZWZpbmUgWEY4NlhLX01lbW8JCTB4MTAwOEZGMUUgICAvKiBJbnZva2UgTWVtbyB0YWtpbmcgcHJvZ3JhbSAqLworI2RlZmluZSBYRjg2WEtfVG9Eb0xpc3QJCTB4MTAwOEZGMUYgICAvKiBJbnZva2UgVG8gRG8gTGlzdCBwcm9ncmFtICAqLworI2RlZmluZSBYRjg2WEtfQ2FsZW5kYXIJCTB4MTAwOEZGMjAgICAvKiBJbnZva2UgQ2FsZW5kYXIgcHJvZ3JhbSAgICAqLworI2RlZmluZSBYRjg2WEtfUG93ZXJEb3duCTB4MTAwOEZGMjEgICAvKiBEZWVwIHNsZWVwIHRoZSBzeXN0ZW0gICAgICAqLworI2RlZmluZSBYRjg2WEtfQ29udHJhc3RBZGp1c3QJMHgxMDA4RkYyMiAgIC8qIEFkanVzdCBzY3JlZW4gY29udHJhc3QgICAgICovCisjZGVmaW5lIFhGODZYS19Sb2NrZXJVcAkJMHgxMDA4RkYyMyAgIC8qIFJvY2tlciBzd2l0Y2hlcyBleGlzdCB1cCAgICovCisjZGVmaW5lIFhGODZYS19Sb2NrZXJEb3duCTB4MTAwOEZGMjQgICAvKiBhbmQgZG93biAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfUm9ja2VyRW50ZXIJMHgxMDA4RkYyNSAgIC8qIGFuZCBsZXQgeW91IHByZXNzIHRoZW0gICAgICovCisKKy8qIFNvbWUgbW9yZSAiSW50ZXJuZXQiIGtleWJvYXJkIHN5bWJvbHMgKi8KKyNkZWZpbmUgWEY4NlhLX0JhY2sJCTB4MTAwOEZGMjYgICAvKiBMaWtlIGJhY2sgb24gYSBicm93c2VyICAgICAqLworI2RlZmluZSBYRjg2WEtfRm9yd2FyZAkJMHgxMDA4RkYyNyAgIC8qIExpa2UgZm9yd2FyZCBvbiBhIGJyb3dzZXIgICovCisjZGVmaW5lIFhGODZYS19TdG9wCQkweDEwMDhGRjI4ICAgLyogU3RvcCBjdXJyZW50IG9wZXJhdGlvbiAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JlZnJlc2gJCTB4MTAwOEZGMjkgICAvKiBSZWZyZXNoIHRoZSBwYWdlICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfUG93ZXJPZmYJCTB4MTAwOEZGMkEgICAvKiBQb3dlciBvZmYgc3lzdGVtIGVudGlyZWx5ICAqLworI2RlZmluZSBYRjg2WEtfV2FrZVVwCQkweDEwMDhGRjJCICAgLyogV2FrZSB1cCBzeXN0ZW0gZnJvbSBzbGVlcCAgKi8KKyNkZWZpbmUgWEY4NlhLX0VqZWN0ICAgICAgICAgICAgMHgxMDA4RkYyQyAgIC8qIEVqZWN0IGRldmljZSAoZS5nLiBEVkQpICAgICovCisjZGVmaW5lIFhGODZYS19TY3JlZW5TYXZlciAgICAgIDB4MTAwOEZGMkQgICAvKiBJbnZva2Ugc2NyZWVuc2F2ZXIgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfV1dXICAgICAgICAgICAgICAweDEwMDhGRjJFICAgLyogSW52b2tlIHdlYiBicm93c2VyICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NsZWVwICAgICAgICAgICAgMHgxMDA4RkYyRiAgIC8qIFB1dCBzeXN0ZW0gdG8gc2xlZXAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19GYXZvcml0ZXMJMHgxMDA4RkYzMCAgIC8qIFNob3cgZmF2b3JpdGUgbG9jYXRpb25zICAgICovCisjZGVmaW5lIFhGODZYS19BdWRpb1BhdXNlCTB4MTAwOEZGMzEgICAvKiBQYXVzZSBhdWRpbyBwbGF5aW5nICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQXVkaW9NZWRpYQkweDEwMDhGRjMyICAgLyogTGF1bmNoIG1lZGlhIGNvbGxlY3Rpb24gYXBwICovCisjZGVmaW5lIFhGODZYS19NeUNvbXB1dGVyCTB4MTAwOEZGMzMgICAvKiBEaXNwbGF5ICJNeSBDb21wdXRlciIgd2luZG93ICovCisjZGVmaW5lIFhGODZYS19WZW5kb3JIb21lCTB4MTAwOEZGMzQgICAvKiBEaXNwbGF5IHZlbmRvciBob21lIHdlYiBzaXRlICovCisjZGVmaW5lIFhGODZYS19MaWdodEJ1bGIJMHgxMDA4RkYzNSAgIC8qIExpZ2h0IGJ1bGIga2V5cyBleGlzdCAgICAgICAqLworI2RlZmluZSBYRjg2WEtfU2hvcAkJMHgxMDA4RkYzNiAgIC8qIERpc3BsYXkgc2hvcHBpbmcgd2ViIHNpdGUgICAqLworI2RlZmluZSBYRjg2WEtfSGlzdG9yeQkJMHgxMDA4RkYzNyAgIC8qIFNob3cgaGlzdG9yeSBvZiB3ZWIgc3VyZmluZyAqLworI2RlZmluZSBYRjg2WEtfT3BlblVSTAkJMHgxMDA4RkYzOCAgIC8qIE9wZW4gc2VsZWN0ZWQgVVJMICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQWRkRmF2b3JpdGUJMHgxMDA4RkYzOSAgIC8qIEFkZCBVUkwgdG8gZmF2b3JpdGVzIGxpc3QgICAqLworI2RlZmluZSBYRjg2WEtfSG90TGlua3MJCTB4MTAwOEZGM0EgICAvKiBTaG93ICJob3QiIGxpbmtzICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0JyaWdodG5lc3NBZGp1c3QJMHgxMDA4RkYzQiAgIC8qIEludm9rZSBicmlnaHRuZXNzIGFkai4gVUkgICAqLworI2RlZmluZSBYRjg2WEtfRmluYW5jZQkJMHgxMDA4RkYzQyAgIC8qIERpc3BsYXkgZmluYW5jaWFsIHNpdGUgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ29tbXVuaXR5CTB4MTAwOEZGM0QgICAvKiBEaXNwbGF5IHVzZXIncyBjb21tdW5pdHkgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0F1ZGlvUmV3aW5kCTB4MTAwOEZGM0UgICAvKiAicmV3aW5kIiBhdWRpbyB0cmFjayAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1hGODZCYWNrRm9yd2FyZAkweDEwMDhGRjNGICAgLyogPz8/ICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gwCQkweDEwMDhGRjQwICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gxCQkweDEwMDhGRjQxICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gyCQkweDEwMDhGRjQyICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2gzCQkweDEwMDhGRjQzICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g0CQkweDEwMDhGRjQ0ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g1CQkweDEwMDhGRjQ1ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g2CQkweDEwMDhGRjQ2ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g3CQkweDEwMDhGRjQ3ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g4CQkweDEwMDhGRjQ4ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2g5CQkweDEwMDhGRjQ5ICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hBCQkweDEwMDhGRjRBICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hCCQkweDEwMDhGRjRCICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hDCQkweDEwMDhGRjRDICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hECQkweDEwMDhGRjREICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hFCQkweDEwMDhGRjRFICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19MYXVuY2hGCQkweDEwMDhGRjRGICAgLyogTGF1bmNoIEFwcGxpY2F0aW9uICAgICAgICAgICovCisKKyNkZWZpbmUgWEY4NlhLX0FwcGxpY2F0aW9uTGVmdAkweDEwMDhGRjUwICAgLyogc3dpdGNoIHRvIGFwcGxpY2F0aW9uLCBsZWZ0ICovCisjZGVmaW5lIFhGODZYS19BcHBsaWNhdGlvblJpZ2h0CTB4MTAwOEZGNTEgICAvKiBzd2l0Y2ggdG8gYXBwbGljYXRpb24sIHJpZ2h0Ki8KKyNkZWZpbmUgWEY4NlhLX0Jvb2sJCTB4MTAwOEZGNTIgICAvKiBMYXVuY2ggYm9va3JlYWRlciAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NECQkweDEwMDhGRjUzICAgLyogTGF1bmNoIENEL0RWRCBwbGF5ZXIgICAgICAgICovCisjZGVmaW5lIFhGODZYS19DYWxjdWxhdGVyCTB4MTAwOEZGNTQgICAvKiBMYXVuY2ggQ2FsY3VsYXRlciAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NsZWFyCQkweDEwMDhGRjU1ICAgLyogQ2xlYXIgd2luZG93LCBzY3JlZW4gICAgICAgICovCisjZGVmaW5lIFhGODZYS19DbG9zZQkJMHgxMDA4RkY1NiAgIC8qIENsb3NlIHdpbmRvdyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ29weQkJMHgxMDA4RkY1NyAgIC8qIENvcHkgc2VsZWN0aW9uICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfQ3V0CQkweDEwMDhGRjU4ICAgLyogQ3V0IHNlbGVjdGlvbiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19EaXNwbGF5CQkweDEwMDhGRjU5ICAgLyogT3V0cHV0IHN3aXRjaCBrZXkgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19ET1MJCTB4MTAwOEZGNUEgICAvKiBMYXVuY2ggRE9TIChlbXVsYXRpb24pICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0RvY3VtZW50cwkweDEwMDhGRjVCICAgLyogT3BlbiBkb2N1bWVudHMgd2luZG93ICAgICAgICovCisjZGVmaW5lIFhGODZYS19FeGNlbAkJMHgxMDA4RkY1QyAgIC8qIExhdW5jaCBzcHJlYWQgc2hlZXQgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfRXhwbG9yZXIJCTB4MTAwOEZGNUQgICAvKiBMYXVuY2ggZmlsZSBleHBsb3JlciAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0dhbWUJCTB4MTAwOEZGNUUgICAvKiBMYXVuY2ggZ2FtZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0dvCQkweDEwMDhGRjVGICAgLyogR28gdG8gVVJMICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19pVG91Y2gJCTB4MTAwOEZGNjAgICAvKiBMb2dpdGNoIGlUb3VjaC0gZG9uJ3QgdXNlICAgKi8KKyNkZWZpbmUgWEY4NlhLX0xvZ09mZgkJMHgxMDA4RkY2MSAgIC8qIExvZyBvZmYgc3lzdGVtICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfTWFya2V0CQkweDEwMDhGRjYyICAgLyogPz8gICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19NZWV0aW5nCQkweDEwMDhGRjYzICAgLyogZW50ZXIgbWVldGluZyBpbiBjYWxlbmRhciAgICovCisjZGVmaW5lIFhGODZYS19NZW51S0IJCTB4MTAwOEZGNjUgICAvKiBkaXN0aW5ndXNoIGtleWJvYXJkIGZyb20gUEIgKi8KKyNkZWZpbmUgWEY4NlhLX01lbnVQQgkJMHgxMDA4RkY2NiAgIC8qIGRpc3RpbnVpc2ggUEIgZnJvbSBrZXlib2FyZCAqLworI2RlZmluZSBYRjg2WEtfTXlTaXRlcwkJMHgxMDA4RkY2NyAgIC8qIEZhdm91cml0ZXMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfTmV3CQkweDEwMDhGRjY4ICAgLyogTmV3IChmb2xkZXIsIGRvY3VtZW50Li4uICAgICovCisjZGVmaW5lIFhGODZYS19OZXdzCQkweDEwMDhGRjY5ICAgLyogTmV3cyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19PZmZpY2VIb21lCTB4MTAwOEZGNkEgICAvKiBPZmZpY2UgaG9tZSAob2xkIFN0YXJvZmZpY2UpKi8KKyNkZWZpbmUgWEY4NlhLX09wZW4JCTB4MTAwOEZGNkIgICAvKiBPcGVuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX09wdGlvbgkJMHgxMDA4RkY2QyAgIC8qID8/ICovCisjZGVmaW5lIFhGODZYS19QYXN0ZQkJMHgxMDA4RkY2RCAgIC8qIFBhc3RlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBYRjg2WEtfUGhvbmUJCTB4MTAwOEZGNkUgICAvKiBMYXVuY2ggcGhvbmU7IGRpYWwgbnVtYmVyICAgKi8KKyNkZWZpbmUgWEY4NlhLX1EJCTB4MTAwOEZGNzAgICAvKiBDb21wYXEncyBRIC0gZG9uJ3QgdXNlICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1JlcGx5CQkweDEwMDhGRjcyICAgLyogUmVwbHkgZS5nLiwgbWFpbCAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19SZWxvYWQJCTB4MTAwOEZGNzMgICAvKiBSZWxvYWQgd2ViIHBhZ2UsIGZpbGUsIGV0Yy4gKi8KKyNkZWZpbmUgWEY4NlhLX1JvdGF0ZVdpbmRvd3MJMHgxMDA4RkY3NCAgIC8qIFJvdGF0ZSB3aW5kb3dzIGUuZy4geHJhbmRyICAqLworI2RlZmluZSBYRjg2WEtfUm90YXRpb25QQgkweDEwMDhGRjc1ICAgLyogZG9uJ3QgdXNlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19Sb3RhdGlvbktCCTB4MTAwOEZGNzYgICAvKiBkb24ndCB1c2UgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NhdmUJCTB4MTAwOEZGNzcgICAvKiBTYXZlIChmaWxlLCBkb2N1bWVudCwgc3RhdGUgKi8KKyNkZWZpbmUgWEY4NlhLX1Njcm9sbFVwCQkweDEwMDhGRjc4ICAgLyogU2Nyb2xsIHdpbmRvdy9jb250ZW50cyB1cCAgICovCisjZGVmaW5lIFhGODZYS19TY3JvbGxEb3duCTB4MTAwOEZGNzkgICAvKiBTY3Jvb2wgd2luZG93L2NvbnRlbnRkIGRvd24gKi8KKyNkZWZpbmUgWEY4NlhLX1Njcm9sbENsaWNrCTB4MTAwOEZGN0EgICAvKiBVc2UgWEtCIG1vdXNla2V5cyBpbnN0ZWFkICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NlbmQJCTB4MTAwOEZGN0IgICAvKiBTZW5kIG1haWwsIGZpbGUsIG9iamVjdCAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1NwZWxsCQkweDEwMDhGRjdDICAgLyogU3BlbGwgY2hlY2tlciAgICAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19TcGxpdFNjcmVlbgkweDEwMDhGRjdEICAgLyogU3BsaXQgd2luZG93IG9yIHNjcmVlbiAgICAgICovCisjZGVmaW5lIFhGODZYS19TdXBwb3J0CQkweDEwMDhGRjdFICAgLyogR2V0IHN1cHBvcnQgKD8/KSAgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19UYXNrUGFuZQkJMHgxMDA4RkY3RiAgIC8qIFNob3cgdGFza3MgKi8KKyNkZWZpbmUgWEY4NlhLX1Rlcm1pbmFsCQkweDEwMDhGRjgwICAgLyogTGF1bmNoIHRlcm1pbmFsIGVtdWxhdG9yICAgICovCisjZGVmaW5lIFhGODZYS19Ub29scwkJMHgxMDA4RkY4MSAgIC8qIHRvb2xib3ggb2YgZGVza3RvcC9hcHAuICAgICAqLworI2RlZmluZSBYRjg2WEtfVHJhdmVsCQkweDEwMDhGRjgyICAgLyogPz8gKi8KKyNkZWZpbmUgWEY4NlhLX1VzZXJQQgkJMHgxMDA4RkY4NCAgIC8qID8/ICovCisjZGVmaW5lIFhGODZYS19Vc2VyMUtCCQkweDEwMDhGRjg1ICAgLyogPz8gKi8KKyNkZWZpbmUgWEY4NlhLX1VzZXIyS0IJCTB4MTAwOEZGODYgICAvKiA/PyAqLworI2RlZmluZSBYRjg2WEtfVmlkZW8JCTB4MTAwOEZGODcgICAvKiBMYXVuY2ggdmlkZW8gcGxheWVyICAgICAgICovCisjZGVmaW5lIFhGODZYS19XaGVlbEJ1dHRvbgkweDEwMDhGRjg4ICAgLyogYnV0dG9uIGZyb20gYSBtb3VzZSB3aGVlbCAqLworI2RlZmluZSBYRjg2WEtfV29yZAkJMHgxMDA4RkY4OSAgIC8qIExhdW5jaCB3b3JkIHByb2Nlc3NvciAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX1hmZXIJCTB4MTAwOEZGOEEKKyNkZWZpbmUgWEY4NlhLX1pvb21JbgkJMHgxMDA4RkY4QiAgIC8qIHpvb20gaW4gdmlldywgbWFwLCBldGMuICAgKi8KKyNkZWZpbmUgWEY4NlhLX1pvb21PdXQJCTB4MTAwOEZGOEMgICAvKiB6b29tIG91dCB2aWV3LCBtYXAsIGV0Yy4gICovCisKKyNkZWZpbmUgWEY4NlhLX0F3YXkJCTB4MTAwOEZGOEQgICAvKiBtYXJrIHlvdXJzZWxmIGFzIGF3YXkgICAgICovCisjZGVmaW5lIFhGODZYS19NZXNzZW5nZXIJMHgxMDA4RkY4RSAgIC8qIGFzIGluIGluc3RhbnQgbWVzc2FnaW5nICAgKi8KKyNkZWZpbmUgWEY4NlhLX1dlYkNhbQkJMHgxMDA4RkY4RiAgIC8qIExhdW5jaCB3ZWIgY2FtZXJhIGFwcC4gICAgKi8KKyNkZWZpbmUgWEY4NlhLX01haWxGb3J3YXJkCTB4MTAwOEZGOTAgICAvKiBGb3J3YXJkIGluIG1haWwgICAgICAgICAgICovCisjZGVmaW5lIFhGODZYS19QaWN0dXJlcwkJMHgxMDA4RkY5MSAgIC8qIFNob3cgcGljdHVyZXMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX011c2ljCQkweDEwMDhGRjkyICAgLyogTGF1bmNoIG11c2ljIGFwcGxpY2F0aW9uICAqLworCisvKiBLZXlzIGZvciBzcGVjaWFsIGFjdGlvbiBrZXlzIChob3Qga2V5cykgKi8KKy8qIFZpcnR1YWwgdGVybWluYWxzIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgKi8KKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8xCTB4MTAwOEZFMDEKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8yCTB4MTAwOEZFMDIKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8zCTB4MTAwOEZFMDMKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF80CTB4MTAwOEZFMDQKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF81CTB4MTAwOEZFMDUKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF82CTB4MTAwOEZFMDYKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF83CTB4MTAwOEZFMDcKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF84CTB4MTAwOEZFMDgKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF85CTB4MTAwOEZFMDkKKyNkZWZpbmUgWEY4NlhLX1N3aXRjaF9WVF8xMAkweDEwMDhGRTBBCisjZGVmaW5lIFhGODZYS19Td2l0Y2hfVlRfMTEJMHgxMDA4RkUwQgorI2RlZmluZSBYRjg2WEtfU3dpdGNoX1ZUXzEyCTB4MTAwOEZFMEMKKworI2RlZmluZSBYRjg2WEtfVW5ncmFiCQkweDEwMDhGRTIwICAgLyogZm9yY2UgdW5ncmFiICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgWEY4NlhLX0NsZWFyR3JhYgkweDEwMDhGRTIxICAgLyoga2lsbCBhcHBsaWNhdGlvbiB3aXRoIGdyYWIgKi8KKyNkZWZpbmUgWEY4NlhLX05leHRfVk1vZGUJMHgxMDA4RkUyMiAgIC8qIG5leHQgdmlkZW8gbW9kZSBhdmFpbGFibGUgICovCisjZGVmaW5lIFhGODZYS19QcmV2X1ZNb2RlCTB4MTAwOEZFMjMgICAvKiBwcmV2LiB2aWRlbyBtb2RlIGF2YWlsYWJsZSAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YS0JsaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hLQmxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWRjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YS0JsaWIuaApAQCAtMCwwICsxLDExNTEgQEAKKy8qICRYb3JnOiBYS0JsaWIuaCx2IDEuNiAyMDAwLzA4LzE3IDE5OjQ1OjAzIGNwcWJsZCBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkzIGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUgCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IAorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyAKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSAKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9saWIvWDExL1hLQmxpYi5oLHYgMy41IDIwMDMvMDQvMTcgMDI6MDY6MzEgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWEtCTElCX0hfCisjZGVmaW5lIF9YS0JMSUJfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCc3RyLmg+CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JBbnlFdmVudCB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogIyBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWEtCIGV2ZW50IG1pbm9yIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworfSBYa2JBbnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk5ld0tleWJvYXJkTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiTmV3S2V5Ym9hcmROb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwlpbnQJIAlvbGRfZGV2aWNlOwkvKiBkZXZpY2UgSUQgb2YgcHJldmlvdXMga2V5Ym9hcmQgKi8KKwlpbnQJIAltaW5fa2V5X2NvZGU7CS8qIG1pbmltdW0ga2V5IGNvZGUgKi8KKwlpbnQJCW1heF9rZXlfY29kZTsJLyogbWF4aW11bSBrZXkgY29kZSAqLworCWludAkgCW9sZF9taW5fa2V5X2NvZGU7LyogbWluIGtleSBjb2RlIG9mIHByZXZpb3VzIGtiZCAqLworCWludAkJb2xkX21heF9rZXlfY29kZTsvKiBtYXgga2V5IGNvZGUgb2YgcHJldmlvdXMga2JkICovCisJdW5zaWduZWQgaW50CWNoYW5nZWQ7CS8qIGNoYW5nZWQgYXNwZWN0cyBvZiB0aGUga2V5Ym9hcmQgKi8KKwljaGFyCSAJcmVxX21ham9yOwkvKiBtYWpvciBhbmQgbWlub3Igb3Bjb2RlIG9mIHJlcSAqLworCWNoYXIJIAlyZXFfbWlub3I7CS8qIHRoYXQgY2F1c2VkIGNoYW5nZSwgaWYgYXBwbGljYWJsZSAqLworfSBYa2JOZXdLZXlib2FyZE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiTWFwTm90aWZ5RXZlbnQgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYk1hcE5vdGlmeSAqLworCWludCAJCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZDsJLyogZmllbGRzIHdoaWNoIGhhdmUgYmVlbiBjaGFuZ2VkICovCisJdW5zaWduZWQgaW50IAlmbGFnczsJCS8qIHJlc2VydmVkICovCisJaW50IAkJZmlyc3RfdHlwZTsJLyogZmlyc3QgY2hhbmdlZCBrZXkgdHlwZSAqLworCWludCAJCW51bV90eXBlczsJLyogbnVtYmVyIG9mIGNoYW5nZWQga2V5IHR5cGVzICovCisJS2V5Q29kZQkJbWluX2tleV9jb2RlOworCUtleUNvZGUJCW1heF9rZXlfY29kZTsKKwlLZXlDb2RlCQlmaXJzdF9rZXlfc3ltOworCUtleUNvZGUJCWZpcnN0X2tleV9hY3Q7CisJS2V5Q29kZQkJZmlyc3Rfa2V5X2JlaGF2aW9yOworCUtleUNvZGUJCWZpcnN0X2tleV9leHBsaWNpdDsKKwlLZXlDb2RlCQlmaXJzdF9tb2RtYXBfa2V5OyAgCisJS2V5Q29kZQkJZmlyc3Rfdm1vZG1hcF9rZXk7CisJaW50CQludW1fa2V5X3N5bXM7CisJaW50CQludW1fa2V5X2FjdHM7CisJaW50CQludW1fa2V5X2JlaGF2aW9yczsKKwlpbnQJCW51bV9rZXlfZXhwbGljaXQ7CisJaW50IAkJbnVtX21vZG1hcF9rZXlzOworCWludCAJCW51bV92bW9kbWFwX2tleXM7CisJdW5zaWduZWQgaW50IAl2bW9kczsJCS8qIG1hc2sgb2YgY2hhbmdlZCB2aXJ0dWFsIG1vZHMgKi8KK30gWGtiTWFwTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTdGF0ZU5vdGlmeUV2ZW50IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiAjIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JTdGF0ZU5vdGlmeSAqLworCWludCAJCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCXVuc2lnbmVkIGludCAJY2hhbmdlZDsJLyogbWFzayBvZiBjaGFuZ2VkIHN0YXRlIGNvbXBvbmVudHMgKi8KKwlpbnQgCQlncm91cDsJCS8qIGtleWJvYXJkIGdyb3VwICovCisJaW50IAkJYmFzZV9ncm91cDsJLyogYmFzZSBrZXlib2FyZCBncm91cCAqLworCWludCAJCWxhdGNoZWRfZ3JvdXA7CS8qIGxhdGNoZWQga2V5Ym9hcmQgZ3JvdXAgKi8KKwlpbnQgCQlsb2NrZWRfZ3JvdXA7CS8qIGxvY2tlZCBrZXlib2FyZCBncm91cCAqLworCXVuc2lnbmVkIGludAltb2RzOwkJLyogbW9kaWZpZXIgc3RhdGUgKi8KKwl1bnNpZ25lZCBpbnQgCWJhc2VfbW9kczsJLyogYmFzZSBtb2RpZmllciBzdGF0ZSAqLworCXVuc2lnbmVkIGludAlsYXRjaGVkX21vZHM7CS8qIGxhdGNoZWQgbW9kaWZpZXJzICovCisJdW5zaWduZWQgaW50CWxvY2tlZF9tb2RzOwkvKiBsb2NrZWQgbW9kaWZpZXJzICovCisJaW50IAkJY29tcGF0X3N0YXRlOwkvKiBjb21wYXRpYmlsaXR5IHN0YXRlICovCisJdW5zaWduZWQgY2hhcglncmFiX21vZHM7CS8qIG1vZHMgdXNlZCBmb3IgZ3JhYnMgKi8KKwl1bnNpZ25lZCBjaGFyCWNvbXBhdF9ncmFiX21vZHM7LyogZ3JhYiBtb2RzIGZvciBub24tWEtCIGNsaWVudHMgKi8KKwl1bnNpZ25lZCBjaGFyCWxvb2t1cF9tb2RzOwkvKiBtb2RzIHNlbnQgdG8gY2xpZW50cyAqLworCXVuc2lnbmVkIGNoYXIJY29tcGF0X2xvb2t1cF9tb2RzOyAvKiBtb2RzIHNlbnQgdG8gbm9uLVhLQiBjbGllbnRzICovCisJaW50IAkJcHRyX2J1dHRvbnM7CS8qIHBvaW50ZXIgYnV0dG9uIHN0YXRlICovCisJS2V5Q29kZQkJa2V5Y29kZTsJLyoga2V5Y29kZSB0aGF0IGNhdXNlZCB0aGUgY2hhbmdlICovCisJY2hhciAJCWV2ZW50X3R5cGU7CS8qIEtleVByZXNzIG9yIEtleVJlbGVhc2UgKi8KKwljaGFyIAkJcmVxX21ham9yOwkvKiBNYWpvciBvcGNvZGUgb2YgcmVxdWVzdCAqLworCWNoYXIgCQlyZXFfbWlub3I7CS8qIE1pbm9yIG9wY29kZSBvZiByZXF1ZXN0ICovCit9IFhrYlN0YXRlTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb250cm9sc05vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkNvbnRyb2xzTm90aWZ5ICovCisJaW50IAkJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50CWNoYW5nZWRfY3RybHM7CS8qIGNvbnRyb2xzIHdpdGggY2hhbmdlZCBzdWItdmFsdWVzICovCisJdW5zaWduZWQgaW50IAllbmFibGVkX2N0cmxzOwkvKiBjb250cm9scyBjdXJyZW50bHkgZW5hYmxlZCAqLworCXVuc2lnbmVkIGludAllbmFibGVkX2N0cmxfY2hhbmdlczsvKiBjb250cm9scyBqdXN0IHtlbixkaXN9YWJsZWQgKi8KKwlpbnQgCQludW1fZ3JvdXBzOwkvKiB0b3RhbCBncm91cHMgb24ga2V5Ym9hcmQgKi8KKwlLZXlDb2RlCQlrZXljb2RlOwkvKiBrZXkgdGhhdCBjYXVzZWQgY2hhbmdlIG9yIDAgKi8KKwljaGFyIAkJZXZlbnRfdHlwZTsJLyogdHlwZSBvZiBldmVudCB0aGF0IGNhdXNlZCBjaGFuZ2UgKi8KKwljaGFyIAkJcmVxX21ham9yOwkvKiBpZiBrZXljb2RlPT0wLCBtYWpvciBhbmQgbWlub3IgKi8KKwljaGFyIAkJcmVxX21pbm9yOwkvKiBvcGNvZGUgb2YgcmVxIHRoYXQgY2F1c2VkIGNoYW5nZSAqLworfSBYa2JDb250cm9sc05vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiSW5kaWNhdG9yTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiSW5kaWNhdG9yTm90aWZ5ICovCisJaW50IAkJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50CWNoYW5nZWQ7CS8qIGluZGljYXRvcnMgd2l0aCBuZXcgc3RhdGUgb3IgbWFwICovCisJdW5zaWduZWQgaW50CXN0YXRlOwkgCS8qIGN1cnJlbnQgc3RhdGUgb2YgYWxsIGluZGljYXRvcnMgKi8KK30gWGtiSW5kaWNhdG9yTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JOYW1lc05vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYk5hbWVzTm90aWZ5ICovCisJaW50CSAJZGV2aWNlOwkJLyogZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkOwkvKiBuYW1lcyB0aGF0IGhhdmUgY2hhbmdlZCAqLworCWludAkgCWZpcnN0X3R5cGU7CS8qIGZpcnN0IGtleSB0eXBlIHdpdGggbmV3IG5hbWUgKi8KKwlpbnQJIAludW1fdHlwZXM7CS8qIG51bWJlciBvZiBrZXkgdHlwZXMgd2l0aCBuZXcgbmFtZXMgKi8KKwlpbnQJIAlmaXJzdF9sdmw7CS8qIGZpcnN0IGtleSB0eXBlIG5ldyBuZXcgbGV2ZWwgbmFtZXMgKi8KKwlpbnQJIAludW1fbHZsczsJLyogIyBvZiBrZXkgdHlwZXMgdy9uZXcgbGV2ZWwgbmFtZXMgKi8KKwlpbnQJIAludW1fYWxpYXNlczsJLyogdG90YWwgbnVtYmVyIG9mIGtleSBhbGlhc2VzKi8KKwlpbnQJIAludW1fcmFkaW9fZ3JvdXBzOy8qIHRvdGFsIG51bWJlciBvZiByYWRpbyBncm91cHMgKi8KKwl1bnNpZ25lZCBpbnQgCWNoYW5nZWRfdm1vZHM7CS8qIHZpcnR1YWwgbW9kaWZpZXJzIHdpdGggbmV3IG5hbWVzICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkX2dyb3VwczsJLyogZ3JvdXBzIHdpdGggbmV3IG5hbWVzICovCisJdW5zaWduZWQgaW50IAljaGFuZ2VkX2luZGljYXRvcnM7LyogaW5kaWNhdG9ycyB3aXRoIG5ldyBuYW1lcyAqLworCWludAkJZmlyc3Rfa2V5OwkvKiBmaXJzdCBrZXkgd2l0aCBuZXcgbmFtZSAqLworCWludAkJbnVtX2tleXM7CS8qIG51bWJlciBvZiBrZXlzIHdpdGggbmV3IG5hbWVzICovCit9IFhrYk5hbWVzTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wYXRNYXBOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JDb21wYXRNYXBOb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBpbnQgCWNoYW5nZWRfZ3JvdXBzOyAvKiBncm91cHMgd2l0aCBuZXcgY29tcGF0IG1hcHMgKi8KKwlpbnQJIAlmaXJzdF9zaTsJLyogZmlyc3QgbmV3IHN5bWJvbCBpbnRlcnAgKi8KKwlpbnQJIAludW1fc2k7CQkvKiBudW1iZXIgb2YgbmV3IHN5bWJvbCBpbnRlcnBzICovCisJaW50CSAJbnVtX3RvdGFsX3NpOwkvKiB0b3RhbCAjIG9mIHN5bWJvbCBpbnRlcnBzICovCit9IFhrYkNvbXBhdE1hcE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiQmVsbE5vdGlmeSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkJlbGxOb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwlpbnQJIAlwZXJjZW50OwkvKiByZXF1ZXN0ZWQgdm9sdW1lIGFzIGEgJSBvZiBtYXhpbXVtICovCisJaW50CSAJcGl0Y2g7CQkvKiByZXF1ZXN0ZWQgcGl0Y2ggaW4gSHogKi8KKwlpbnQJIAlkdXJhdGlvbjsJLyogcmVxdWVzdGVkIGR1cmF0aW9uIGluIHVzZWNvbmRzICovCisJaW50CSAJYmVsbF9jbGFzczsJLyogKGlucHV0IGV4dGVuc2lvbikgZmVlZGJhY2sgY2xhc3MgKi8KKwlpbnQJIAliZWxsX2lkOwkvKiAoaW5wdXQgZXh0ZW5zaW9uKSBJRCBvZiBmZWVkYmFjayAqLworCUF0b20gCQluYW1lOwkJLyogIm5hbWUiIG9mIHJlcXVlc3RlZCBiZWxsICovCisJV2luZG93IAkJd2luZG93OwkJLyogd2luZG93IGFzc29jaWF0ZWQgd2l0aCBldmVudCAqLworCUJvb2wJCWV2ZW50X29ubHk7CS8qICJldmVudCBvbmx5IiByZXF1ZXN0ZWQgKi8KK30gWGtiQmVsbE5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCBfWGtiQWN0aW9uTWVzc2FnZSB7CisJaW50IAkJdHlwZTsJCS8qIFhrYkFueUV2ZW50ICovCisJdW5zaWduZWQgbG9uZyAJc2VyaWFsOwkJLyogb2YgbGFzdCByZXEgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgCQlzZW5kX2V2ZW50OwkvKiBpcyB0aGlzIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdD8gKi8KKwlEaXNwbGF5ICoJZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVRpbWUgCQl0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IAkJeGtiX3R5cGU7CS8qIFhrYkFjdGlvbk1lc3NhZ2UgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwlLZXlDb2RlCQlrZXljb2RlOwkvKiBrZXkgdGhhdCBnZW5lcmF0ZWQgdGhlIGV2ZW50ICovCisJQm9vbCAJCXByZXNzOwkJLyogdHJ1ZSBpZiBhY3QgY2F1c2VkIGJ5IGtleSBwcmVzcyAqLworCUJvb2wgCQlrZXlfZXZlbnRfZm9sbG93czsvKiB0cnVlIGlmIGtleSBldmVudCBhbHNvIGdlbmVyYXRlZCAqLworCWludAkJZ3JvdXA7CQkvKiBlZmZlY3RpdmUgZ3JvdXAgKi8KKwl1bnNpZ25lZCBpbnQJbW9kczsJCS8qIGVmZmVjdGl2ZSBtb2RzICovCisJY2hhciAJCW1lc3NhZ2VbWGtiQWN0aW9uTWVzc2FnZUxlbmd0aCsxXTsgCisJCQkJCS8qIG1lc3NhZ2UgLS0gbGVhdmUgc3BhY2UgZm9yIE5VTCAqLworfSBYa2JBY3Rpb25NZXNzYWdlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JBY2Nlc3NYTm90aWZ5IHsKKwlpbnQgCQl0eXBlOwkJLyogWGtiQW55RXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIAlzZXJpYWw7CQkvKiBvZiBsYXN0IHJlcSBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCAJCXNlbmRfZXZlbnQ7CS8qIGlzIHRoaXMgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0PyAqLworCURpc3BsYXkgKglkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJVGltZSAJCXRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgCQl4a2JfdHlwZTsJLyogWGtiQWNjZXNzWE5vdGlmeSAqLworCWludAkgCWRldmljZTsJCS8qIGRldmljZSBJRCAqLworCWludAkgCWRldGFpbDsJCS8qIFhrYkFYTl8qICovCisJaW50CSAJa2V5Y29kZTsJLyoga2V5IG9mIGV2ZW50ICovCisJaW50CSAJc2tfZGVsYXk7CS8qIGN1cnJlbnQgc2xvdyBrZXlzIGRlbGF5ICovCisJaW50CQlkZWJvdW5jZV9kZWxheTsJLyogY3VycmVudCBkZWJvdW5jZSBkZWxheSAqLworfSBYa2JBY2Nlc3NYTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgeworCWludCAJCXR5cGU7CQkvKiBYa2JBbnlFdmVudCAqLworCXVuc2lnbmVkIGxvbmcgCXNlcmlhbDsJCS8qIG9mIGxhc3QgcmVxIHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIAkJc2VuZF9ldmVudDsJLyogaXMgdGhpcyBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3Q/ICovCisJRGlzcGxheSAqCWRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlUaW1lIAkJdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCAJCXhrYl90eXBlOwkvKiBYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKi8KKwlpbnQJIAlkZXZpY2U7CQkvKiBkZXZpY2UgSUQgKi8KKwl1bnNpZ25lZCBpbnQJcmVhc29uOwkJLyogcmVhc29uIGZvciB0aGUgZXZlbnQgKi8JCisJdW5zaWduZWQgaW50CXN1cHBvcnRlZDsJLyogbWFzayBvZiBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8JCisJdW5zaWduZWQgaW50CXVuc3VwcG9ydGVkOwkvKiBtYXNrIG9mIHVuc3VwcG9ydGVkIGZlYXR1cmVzICovCisJCQkJCS8qIHRoYXQgc29tZSBhcHAgdHJpZWQgdG8gdXNlICovCisJaW50CSAJZmlyc3RfYnRuOwkvKiBmaXJzdCBidXR0b24gdGhhdCBjaGFuZ2VkICovCisJaW50CSAJbnVtX2J0bnM7CS8qIHJhbmdlIG9mIGJ1dHRvbnMgY2hhbmdlZCAqLworCXVuc2lnbmVkIGludAlsZWRzX2RlZmluZWQ7ICAgLyogaW5kaWNhdG9ycyB3aXRoIG5hbWVzIG9yIG1hcHMgKi8KKwl1bnNpZ25lZCBpbnQJbGVkX3N0YXRlOwkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbmRpY2F0b3JzICovCisJaW50CQlsZWRfY2xhc3M7CS8qIGZlZWRiYWNrIGNsYXNzIGZvciBsZWQgY2hhbmdlcyAqLworCWludAkJbGVkX2lkOyAgIAkvKiBmZWVkYmFjayBpZCBmb3IgbGVkIGNoYW5nZXMgKi8KK30gWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgdW5pb24gX1hrYkV2ZW50IHsKKwlpbnQJCQkJdHlwZTsKKwlYa2JBbnlFdmVudAkJCWFueTsKKwlYa2JOZXdLZXlib2FyZE5vdGlmeUV2ZW50CW5ld19rYmQ7CisJWGtiTWFwTm90aWZ5RXZlbnQJCW1hcDsKKwlYa2JTdGF0ZU5vdGlmeUV2ZW50CQlzdGF0ZTsKKwlYa2JDb250cm9sc05vdGlmeUV2ZW50CQljdHJsczsKKwlYa2JJbmRpY2F0b3JOb3RpZnlFdmVudCAJaW5kaWNhdG9yczsKKwlYa2JOYW1lc05vdGlmeUV2ZW50CQluYW1lczsKKwlYa2JDb21wYXRNYXBOb3RpZnlFdmVudAkJY29tcGF0OworCVhrYkJlbGxOb3RpZnlFdmVudAkJYmVsbDsKKwlYa2JBY3Rpb25NZXNzYWdlRXZlbnQJCW1lc3NhZ2U7CisJWGtiQWNjZXNzWE5vdGlmeUV2ZW50CQlhY2Nlc3N4OworCVhrYkV4dGVuc2lvbkRldmljZU5vdGlmeUV2ZW50IAlkZXZpY2U7CisJWEV2ZW50CQkJCWNvcmU7Cit9IFhrYkV2ZW50OworCit0eXBlZGVmIHN0cnVjdAlfWGtiS2JkRHB5U3RhdGUJWGtiS2JkRHB5U3RhdGVSZWMsKlhrYktiZERweVN0YXRlUHRyOworCisJLyogWGtiT3BlbkRpc3BsYXkgZXJyb3IgY29kZXMgKi8KKyNkZWZpbmUJWGtiT0RfU3VjY2VzcwkJMAorI2RlZmluZQlYa2JPRF9CYWRMaWJyYXJ5VmVyc2lvbgkxCisjZGVmaW5lCVhrYk9EX0Nvbm5lY3Rpb25SZWZ1c2VkCTIKKyNkZWZpbmUJWGtiT0RfTm9uWGtiU2VydmVyCTMKKyNkZWZpbmUJWGtiT0RfQmFkU2VydmVyVmVyc2lvbgk0CisKKwkvKiBWYWx1ZXMgZm9yIFhsaWJGbGFncyAqLworI2RlZmluZQlYa2JMQ19Gb3JjZUxhdGluMUxvb2t1cAkJKDE8PDApCisjZGVmaW5lCVhrYkxDX0NvbnN1bWVMb29rdXBNb2RzCQkoMTw8MSkKKyNkZWZpbmUJWGtiTENfQWx3YXlzQ29uc3VtZVNoaWZ0QW5kTG9jayAoMTw8MikKKyNkZWZpbmUJWGtiTENfSWdub3JlTmV3S2V5Ym9hcmRzCSgxPDwzKQorI2RlZmluZQlYa2JMQ19Db250cm9sRmFsbGJhY2sJCSgxPDw0KQorI2RlZmluZQlYa2JMQ19Db25zdW1lS2V5c09uQ29tcG9zZUZhaWwJKDE8PDI5KQorI2RlZmluZQlYa2JMQ19Db21wb3NlTEVECQkoMTw8MzApCisjZGVmaW5lCVhrYkxDX0JlZXBPbkNvbXBvc2VGYWlsCQkoMTw8MzEpCisKKyNkZWZpbmUJWGtiTENfQWxsQ29tcG9zZUNvbnRyb2xzCSgweGMwMDAwMDAwKQorI2RlZmluZQlYa2JMQ19BbGxDb250cm9scwkJKDB4YzAwMDAwMWYpCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuCUJvb2wJWGtiSWdub3JlRXh0ZW5zaW9uKAorCUJvb2wJCQkvKiBpZ25vcmUgKi8KKyk7CisKK2V4dGVybglEaXNwbGF5ICpYa2JPcGVuRGlzcGxheSgKKwljaGFyICoJCQkvKiBuYW1lICovLAorCWludCAqCQkJLyogZXZfcnRybiAqLywKKwlpbnQgKgkJCS8qIGVycl9ydHJuICovLAorCWludCAqCQkJLyogbWFqb3JfcnRybiAqLywKKwlpbnQgKgkJCS8qIG1pbm9yX3J0cm4gKi8sCisJaW50ICoJCQkvKiByZWFzb24gKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlF1ZXJ5RXh0ZW5zaW9uKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCWludCAqCQkJLyogb3Bjb2RlUmV0dXJuICovLAorCWludCAqCQkJLyogZXZlbnRCYXNlUmV0dXJuICovLAorCWludCAqCQkJLyogZXJyb3JCYXNlUmV0dXJuICovLAorCWludCAqCQkJLyogbWFqb3JSdHJuICovLAorCWludCAqCQkJLyogbWlub3JSdHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JVc2VFeHRlbnNpb24oCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJaW50ICoJCQkvKiBtYWpvcl9ydHJuICovLAorCWludCAqCQkJLyogbWlub3JfcnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiTGlicmFyeVZlcnNpb24oCisJaW50ICoJCQkvKiBsaWJNYWpvclJ0cm4gKi8sCisJaW50ICoJCQkvKiBsaWJNaW5vclJ0cm4gKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiU2V0WGxpYkNvbnRyb2xzKAorCURpc3BsYXkqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiR2V0WGxpYkNvbnRyb2xzKAorCURpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiWGxpYkNvbnRyb2xzSW1wbGVtZW50ZWQodm9pZCk7CisKK3R5cGVkZWYJQXRvbQkoKlhrYkludGVybkF0b21GdW5jKSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlfWGNvbnN0IGNoYXIgKgkJLyogbmFtZSAqLywKKwlCb29sCQkJLyogb25seV9pZl9leGlzdHMgKi8KKyk7CisKK3R5cGVkZWYgY2hhciAqCSgqWGtiR2V0QXRvbU5hbWVGdW5jKSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlBdG9tCQkJLyogYXRvbSAqLworKTsKKworZXh0ZXJuIHZvaWQJCVhrYlNldEF0b21GdW5jcygKKwlYa2JJbnRlcm5BdG9tRnVuYwkvKiBnZXRBdG9tICovLAorCVhrYkdldEF0b21OYW1lRnVuYwkvKiBnZXROYW1lICovCispOworCitleHRlcm4JS2V5U3ltIFhrYktleWNvZGVUb0tleXN5bSgKKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKyNpZiBOZWVkV2lkZVByb3RvdHlwZXMKKwkJIHVuc2lnbmVkIGludCAJLyoga2MgKi8sCisjZWxzZQorCQkgS2V5Q29kZSAJLyoga2MgKi8sCisjZW5kaWYKKwkJIGludCAJCS8qIGdyb3VwICovLAorCQkgaW50CQkvKiBsZXZlbCAqLworKTsKKworZXh0ZXJuCXVuc2lnbmVkIGludAlYa2JLZXlzeW1Ub01vZGlmaWVycygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgS2V5U3ltIAkJCS8qIGtzICovCispOworCitleHRlcm4JQm9vbAkJWGtiTG9va3VwS2V5U3ltKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBLZXlDb2RlIAkJCS8qIGtleWNvZGUgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbW9kaWZpZXJzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBtb2RpZmllcnNfcmV0dXJuICovLAorICAgIEtleVN5bSAqCQkJLyoga2V5c3ltX3JldHVybiAqLworKTsKKworZXh0ZXJuCWludAkJWGtiTG9va3VwS2V5QmluZGluZygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgS2V5U3ltIAkJCS8qIHN5bV9ydHJuICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG1vZHMgKi8sCisgICAgY2hhciAqCQkJLyogYnVmZmVyICovLAorICAgIGludCAJCQkvKiBuYnl0ZXMgKi8sCisgICAgaW50ICogCQkJLyogZXh0cmFfcnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJCVhrYlRyYW5zbGF0ZUtleUNvZGUoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICBLZXlDb2RlIAkJCS8qIGtleWNvZGUgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogbW9kaWZpZXJzICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiBtb2RpZmllcnNfcmV0dXJuICovLAorICAgIEtleVN5bSAqCQkJLyoga2V5c3ltX3JldHVybiAqLworKTsKKworZXh0ZXJuCWludAkJWGtiVHJhbnNsYXRlS2V5U3ltKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICByZWdpc3RlciBLZXlTeW0gKgkJLyogc3ltX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBtb2RpZmllcnMgKi8sCisgICAgY2hhciAqCQkJLyogYnVmZmVyICovLAorICAgIGludCAJCQkvKiBuYnl0ZXMgKi8sCisgICAgaW50ICoJCQkvKiBleHRyYV9ydHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRBdXRvUmVwZWF0UmF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZWxheSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGludGVydmFsICovCispOworCitleHRlcm4JQm9vbAlYa2JHZXRBdXRvUmVwZWF0UmF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50ICoJCS8qIGRlbGF5UnRybiAqLywKKwl1bnNpZ25lZCBpbnQgKgkJLyogaW50ZXJ2YWxSdHJuICovCispOworCitleHRlcm4JQm9vbAlYa2JDaGFuZ2VFbmFibGVkQ29udHJvbHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGludAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JEZXZpY2VCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBkZXZpY2VTcGVjICovLAorCWludAkJCS8qIGJlbGxDbGFzcyAqLywKKwlpbnQJCQkvKiBiZWxsSUQgKi8sCisJaW50CQkJLyogcGVyY2VudCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiRm9yY2VEZXZpY2VCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCWludAkJCS8qIGRldmljZVNwZWMgKi8sCisJaW50CQkJLyogYmVsbENsYXNzICovLAorCWludAkJCS8qIGJlbGxJRCAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovCispOworCitleHRlcm4JQm9vbAlYa2JEZXZpY2VCZWxsRXZlbnQoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJV2luZG93CQkJLyogd2luICovLAorCWludAkJCS8qIGRldmljZVNwZWMgKi8sCisJaW50CQkJLyogYmVsbENsYXNzICovLAorCWludAkJCS8qIGJlbGxJRCAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovLAorCUF0b20JCQkvKiBuYW1lICovCispOworCitleHRlcm4JQm9vbAlYa2JCZWxsKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovLAorCUF0b20JCQkvKiBuYW1lICovCispOworCitleHRlcm4JQm9vbAlYa2JGb3JjZUJlbGwoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJaW50CQkJLyogcGVyY2VudCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQmVsbEV2ZW50KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVdpbmRvdwkJCS8qIHdpbiAqLywKKwlpbnQJCQkvKiBwZXJjZW50ICovLAorCUF0b20JCQkvKiBuYW1lICovCispOworCitleHRlcm4JQm9vbAlYa2JTZWxlY3RFdmVudHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VJRCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgaW50IAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JTZWxlY3RFdmVudERldGFpbHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlSUQgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZXZlbnRUeXBlICovLAorCXVuc2lnbmVkIGxvbmcgCQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgbG9uZyAJCS8qIGRldGFpbHMgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYk5vdGVNYXBDaGFuZ2VzKAorICAgIFhrYk1hcENoYW5nZXNQdHIJCS8qIG9sZCAqLywKKyAgICBYa2JNYXBOb3RpZnlFdmVudAkqCS8qIG5ldyAqLywKKyAgICB1bnNpZ25lZCBpbnQJIAkvKiB3YW50ZWQgKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYk5vdGVOYW1lQ2hhbmdlcygKKyAgICBYa2JOYW1lQ2hhbmdlc1B0cgkJLyogb2xkICovLAorICAgIFhrYk5hbWVzTm90aWZ5RXZlbnQJKgkvKiBuZXcgKi8sCisgICAgdW5zaWduZWQgaW50CSAJLyogd2FudGVkICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEluZGljYXRvclN0YXRlKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgKgkJLyogcFN0YXRlUnRybiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXREZXZpY2VJbmRpY2F0b3JTdGF0ZSgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElEICovLAorCXVuc2lnbmVkIGludCAqCQkvKiBwU3RhdGVSdHJuICovCispOworCitleHRlcm4JU3RhdHVzCSBYa2JHZXRJbmRpY2F0b3JNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgbG9uZwkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCUJvb2wJIFhrYlNldEluZGljYXRvck1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBsb25nIAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworI2RlZmluZQlYa2JOb3RlSW5kaWNhdG9yTWFwQ2hhbmdlcyhvLG4sdykgXAorCQkJCSgobyktPm1hcF9jaGFuZ2VzfD0oKG4pLT5tYXBfY2hhbmdlcyYodykpKQorI2RlZmluZQlYa2JOb3RlSW5kaWNhdG9yU3RhdGVDaGFuZ2VzKG8sbix3KVwKKwkJCQkoKG8pLT5zdGF0ZV9jaGFuZ2VzfD0oKG4pLT5zdGF0ZV9jaGFuZ2VzJih3KSkpCisjZGVmaW5lCVhrYkdldEluZGljYXRvck1hcENoYW5nZXMoZCx4LGMpIFwKKwkJCQkoWGtiR2V0SW5kaWNhdG9yTWFwKChkKSwoYyktPm1hcF9jaGFuZ2VzLHgpCisjZGVmaW5lCVhrYkNoYW5nZUluZGljYXRvck1hcHMoZCx4LGMpIFwKKwkJCQkoWGtiU2V0SW5kaWNhdG9yTWFwKChkKSwoYyktPm1hcF9jaGFuZ2VzLHgpKQorCitleHRlcm4JQm9vbAlYa2JHZXROYW1lZEluZGljYXRvcigKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlBdG9tCQkJLyogbmFtZSAqLywKKwlpbnQgKgkJCS8qIHBOZHhSdHJuICovLAorCUJvb2wgKgkJCS8qIHBTdGF0ZVJ0cm4gKi8sCisJWGtiSW5kaWNhdG9yTWFwUHRyCS8qIHBNYXBSdHJuICovLAorCUJvb2wgKgkJCS8qIHBSZWFsUnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiR2V0TmFtZWREZXZpY2VJbmRpY2F0b3IoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJRCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLywKKwlpbnQgKgkJCS8qIHBOZHhSdHJuICovLAorCUJvb2wgKgkJCS8qIHBTdGF0ZVJ0cm4gKi8sCisJWGtiSW5kaWNhdG9yTWFwUHRyCS8qIHBNYXBSdHJuICovLAorCUJvb2wgKgkJCS8qIHBSZWFsUnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0TmFtZWRJbmRpY2F0b3IoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8sCisJQm9vbAkJCS8qIGNoYW5nZVN0YXRlICovLAorCUJvb2wgCQkJLyogc3RhdGUgKi8sCisJQm9vbAkJCS8qIGNyZWF0ZU5ld01hcCAqLywKKwlYa2JJbmRpY2F0b3JNYXBQdHIJLyogcE1hcCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0TmFtZWREZXZpY2VJbmRpY2F0b3IoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJRCAqLywKKwlBdG9tCQkJLyogbmFtZSAqLywKKwlCb29sCQkJLyogY2hhbmdlU3RhdGUgKi8sCisJQm9vbCAJCQkvKiBzdGF0ZSAqLywKKwlCb29sCQkJLyogY3JlYXRlTmV3TWFwICovLAorCVhrYkluZGljYXRvck1hcFB0cgkvKiBwTWFwICovCispOworCitleHRlcm4JQm9vbAlYa2JMb2NrTW9kaWZpZXJzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50IAkJLyogYWZmZWN0ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiTGF0Y2hNb2RpZmllcnMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBhZmZlY3QgKi8sCisJdW5zaWduZWQgaW50IAkJLyogdmFsdWVzICovCispOworCitleHRlcm4JQm9vbAlYa2JMb2NrR3JvdXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBncm91cCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiTGF0Y2hHcm91cCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludCAJCS8qIGdyb3VwICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRTZXJ2ZXJJbnRlcm5hbE1vZHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBhZmZlY3RSZWFsICovLAorCXVuc2lnbmVkIGludCAJCS8qIHJlYWxWYWx1ZXMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBhZmZlY3RWaXJ0dWFsICovLAorCXVuc2lnbmVkIGludAkJLyogdmlydHVhbFZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0SWdub3JlTG9ja01vZHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBhZmZlY3RSZWFsICovLAorCXVuc2lnbmVkIGludCAJCS8qIHJlYWxWYWx1ZXMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBhZmZlY3RWaXJ0dWFsICovLAorCXVuc2lnbmVkIGludAkJLyogdmlydHVhbFZhbHVlcyAqLworKTsKKworCitleHRlcm4JQm9vbAlYa2JWaXJ0dWFsTW9kc1RvUmVhbCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB2aXJ0dWFsX21hc2sgKi8sCisJdW5zaWduZWQgaW50ICoJCS8qIG1hc2tfcnRybiAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQ29tcHV0ZUVmZmVjdGl2ZU1hcCgKKwlYa2JEZXNjUHRyIAkJLyogeGtiICovLAorCVhrYktleVR5cGVQdHIJCS8qIHR5cGUgKi8sCisJdW5zaWduZWQgY2hhciAqCQkvKiBtYXBfcnRybiAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JJbml0Q2Fub25pY2FsS2V5VHlwZXMoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorICAgIGludAkJCQkvKiBrZXlwYWRWTW9kICovCispOworCitleHRlcm4JWGtiRGVzY1B0ciBYa2JBbGxvY0tleWJvYXJkKAorCXZvaWQKKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVLZXlib2FyZCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZURlc2MgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NDbGllbnRNYXAoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50CQkvKiBuVHlwZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQWxsb2NTZXJ2ZXJNYXAoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50CQkvKiBuQWN0aW9ucyAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZUNsaWVudE1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hhdCAqLywKKyAgICBCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiRnJlZVNlcnZlck1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hhdCAqLywKKyAgICBCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuCVhrYktleVR5cGVQdHIJWGtiQWRkS2V5VHlwZSgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIEF0b20JCQkvKiBuYW1lICovLAorICAgIGludAkJCQkvKiBtYXBfY291bnQgKi8sCisgICAgQm9vbAkJCS8qIHdhbnRfcHJlc2VydmUgKi8sCisgICAgaW50CQkJCS8qIG51bV9sdmxzICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jSW5kaWNhdG9yTWFwcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkZyZWVJbmRpY2F0b3JNYXBzKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybglYa2JEZXNjUHRyIFhrYkdldE1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBkZXZpY2VTcGVjICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldFVwZGF0ZWRNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRNYXBDaGFuZ2VzKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIFhrYk1hcENoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKKworZXh0ZXJuCVN0YXR1cwlYa2JSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKAorICAgIFhrYk1hcE5vdGlmeUV2ZW50ICoJCS8qIGV2ZW50ICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleVR5cGVzKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGZpcnN0ICovLAorICAgIHVuc2lnbmVkIGludCAJCS8qIG51bSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldEtleVN5bXMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogZmlyc3QgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBudW0gKi8sCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlBY3Rpb25zKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBmaXJzdCAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBudW0gKi8sCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlCZWhhdmlvcnMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogZmlyc3RLZXkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuS2V5cyAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JU3RhdHVzCVhrYkdldFZpcnR1YWxNb2RzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5RXhwbGljaXRDb21wb25lbnRzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGZpcnN0S2V5ICovLAorCXVuc2lnbmVkIGludAkJLyogbktleXMgKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRLZXlNb2RpZmllck1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBmaXJzdEtleSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5LZXlzICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiR2V0S2V5VmlydHVhbE1vZE1hcCgKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGZpcnN0ICovLAorCXVuc2lnbmVkIGludAkJLyogbnVtICovLAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JBbGxvY0NvbnRyb2xzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoKi8KKyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVDb250cm9scygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXRDb250cm9scygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBsb25nCQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRDb250cm9scygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBsb25nCQkvKiB3aGljaCAqLywKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovCispOworCitleHRlcm4Jdm9pZAlYa2JOb3RlQ29udHJvbHNDaGFuZ2VzKAorICAgIFhrYkNvbnRyb2xzQ2hhbmdlc1B0cgkvKiBvbGQgKi8sCisgICAgWGtiQ29udHJvbHNOb3RpZnlFdmVudCAqCS8qIG5ldyAqLywKKyAgICB1bnNpZ25lZCBpbnQJIAkvKiB3YW50ZWQgKi8KKyk7CisKKyNkZWZpbmUJWGtiR2V0Q29udHJvbHNDaGFuZ2VzKGQseCxjKQlYa2JHZXRDb250cm9scyhkLChjKS0+Y2hhbmdlZF9jdHJscyx4KQorI2RlZmluZQlYa2JDaGFuZ2VDb250cm9scyhkLHgsYykJWGtiU2V0Q29udHJvbHMoZCwoYyktPmNoYW5nZWRfY3RybHMseCkKKworZXh0ZXJuCVN0YXR1cwlYa2JBbGxvY0NvbXBhdE1hcCgKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBuSW50ZXJwcmV0ICovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlQ29tcGF0TWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKyAgICBCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYa2JHZXRDb21wYXRNYXAoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0ciAJCS8qIHhrYiAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiU2V0Q29tcGF0TWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIgCQkvKiB4a2IgKi8sCisJQm9vbAkJCS8qIHVwZGF0ZUFjdGlvbnMgKi8KKyk7CisKK2V4dGVybglYa2JTeW1JbnRlcnByZXRQdHIgWGtiQWRkU3ltSW50ZXJwcmV0KAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JTeW1JbnRlcnByZXRQdHIJLyogc2kgKi8sCisJQm9vbAkJCS8qIHVwZGF0ZU1hcCAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jTmFtZXMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJaW50CQkJLyogblRvdGFsUkcgKi8sCisJaW50CQkJLyogblRvdGFsQWxpYXNlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXROYW1lcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldE5hbWVzKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50CQkvKiBmaXJzdFR5cGUgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuVHlwZXMgKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQ2hhbmdlTmFtZXMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYk5hbWVDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkZyZWVOYW1lcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZU1hcCAqLworKTsKKworCitleHRlcm4JU3RhdHVzCVhrYkdldFN0YXRlKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8sCisJWGtiU3RhdGVQdHIJCS8qIHJ0cm5TdGF0ZSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0TWFwKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQ2hhbmdlTWFwKAorCURpc3BsYXkqCQkvKiBkcHkgKi8sCisJWGtiRGVzY1B0cgkJLyogZGVzYyAqLywKKwlYa2JNYXBDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYlNldERldGVjdGFibGVBdXRvUmVwZWF0KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCUJvb2wJCQkvKiBkZXRlY3RhYmxlICovLAorCUJvb2wgKgkJCS8qIHN1cHBvcnRlZCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiR2V0RGV0ZWN0YWJsZUF1dG9SZXBlYXQoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJQm9vbCAqCQkJLyogc3VwcG9ydGVkICovCispOworCitleHRlcm4JQm9vbAlYa2JTZXRBdXRvUmVzZXRDb250cm9scygKKyAgICBEaXNwbGF5ICoJCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogY2hhbmdlcyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogYXV0b19jdHJscyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogYXV0b192YWx1ZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkdldEF1dG9SZXNldENvbnRyb2xzKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogYXV0b19jdHJscyAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogYXV0b19jdHJsX3ZhbHVlcyAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0UGVyQ2xpZW50Q29udHJvbHMoCisgICAgRGlzcGxheSAqCQkJLyogZHB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2hhbmdlICovLAorICAgIHVuc2lnbmVkIGludCAqCQkvKiB2YWx1ZXMgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkdldFBlckNsaWVudENvbnRyb2xzKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQgKgkJLyogY3RybHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGtiQ29weUtleVR5cGUoCisgICAgWGtiS2V5VHlwZVB0cgkvKiBmcm9tICovLAorICAgIFhrYktleVR5cGVQdHIJLyogaW50byAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYa2JDb3B5S2V5VHlwZXMoCisgICAgWGtiS2V5VHlwZVB0cgkvKiBmcm9tICovLAorICAgIFhrYktleVR5cGVQdHIJLyogaW50byAqLywKKyAgICBpbnQJCQkvKiBudW1fdHlwZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiUmVzaXplS2V5VHlwZSgKKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICAgaW50CQkJLyogdHlwZV9uZHggKi8sCisgICAgaW50CQkJLyogbWFwX2NvdW50ICovLAorICAgIEJvb2wJCS8qIHdhbnRfcHJlc2VydmUgKi8sCisgICAgaW50CQkJLyogbmV3X251bV9sdmxzICovCispOworCitleHRlcm4JS2V5U3ltICpYa2JSZXNpemVLZXlTeW1zKAorCVhrYkRlc2NQdHIJCS8qIGRlc2MgKi8sCisJaW50IAkJCS8qIGZvcktleSAqLywKKwlpbnQgCQkJLyogc3ltc05lZWRlZCAqLworKTsKKworZXh0ZXJuCVhrYkFjdGlvbiAqWGtiUmVzaXplS2V5QWN0aW9ucygKKwlYa2JEZXNjUHRyCQkvKiBkZXNjICovLAorCWludCAJCQkvKiBmb3JLZXkgKi8sCisJaW50IAkJCS8qIGFjdHNOZWVkZWQgKi8KKyk7CisKK2V4dGVybglTdGF0dXMgWGtiQ2hhbmdlVHlwZXNPZktleSgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJaW50IAkJCS8qIGtleSAqLywKKwlpbnQJCQkvKiBudW1fZ3JvdXBzICovLAorCXVuc2lnbmVkIGludAkJLyogZ3JvdXBzICovLAorCWludCAqCQkJLyogbmV3VHlwZXMgKi8sCisJWGtiTWFwQ2hhbmdlc1B0cgkvKiBwQ2hhbmdlcyAqLworKTsKKworZXh0ZXJuICBTdGF0dXMgICBYa2JDaGFuZ2VLZXljb2RlUmFuZ2UoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCWludAkJCS8qIG1pbktDICovLAorCWludAkJCS8qIG1heEtDICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKKy8qKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoqKi8KKworZXh0ZXJuCVhrYkNvbXBvbmVudExpc3RQdHIJWGtiTGlzdENvbXBvbmVudHMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCVhrYkNvbXBvbmVudE5hbWVzUHRyCS8qIHB0cm5zICovLAorCWludCAqCQkJLyogbWF4X2lub3V0ICovCispOworCitleHRlcm4Jdm9pZCBYa2JGcmVlQ29tcG9uZW50TGlzdCgKKwlYa2JDb21wb25lbnRMaXN0UHRyCS8qIGxpc3QgKi8KKyk7CisKK2V4dGVybglYa2JEZXNjUHRyIFhrYkdldEtleWJvYXJkKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkIGludCAJCS8qIHdoaWNoICovLAorCXVuc2lnbmVkIGludCAJCS8qIGRldmljZVNwZWMgKi8KKyk7CisKK2V4dGVybiBYa2JEZXNjUHRyIFhrYkdldEtleWJvYXJkQnlOYW1lKAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisgICAgWGtiQ29tcG9uZW50TmFtZXNQdHIJLyogbmFtZXMgKi8sCisgICAgdW5zaWduZWQgaW50IAkJLyogd2FudCAqLywKKyAgICB1bnNpZ25lZCBpbnQgCQkvKiBuZWVkICovLAorICAgIEJvb2wJCQkvKiBsb2FkICovCispOworCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKK2V4dGVybglpbnQJWGtiS2V5VHlwZXNGb3JDb3JlU3ltYm9scygJLyogcmV0dXJucyAjIG9mIGdyb3VwcyAqLworICAgIFhrYkRlc2NQdHIJLyogeGtiICovLAkJCS8qIGtleWJvYXJkIGRldmljZSAqLworICAgIGludAkJLyogbWFwX3dpZHRoICovLAkJLyogd2lkdGggb2YgY29yZSBLZXlTeW0gYXJyYXkgKi8KKyAgICBLZXlTeW0gKgkvKiBjb3JlX3N5bXMgKi8sCQkvKiBhbHdheXMgbWFwV2lkdGggc3ltYm9scyAqLworICAgIHVuc2lnbmVkIGludAkvKiBwcm90ZWN0ZWQgKi8sCS8qIGV4cGxpY2l0IGtleSB0eXBlcyAqLworICAgIGludCAqCS8qIHR5cGVzX2lub3V0ICovLAkJLyogYWx3YXlzIGZvdXIgdHlwZSBpbmRpY2VzICovCisgICAgS2V5U3ltICogCS8qIHhrYl9zeW1zX3J0cm4gKi8JCS8qIG11c3QgaGF2ZSBlbm91Z2ggc3BhY2UgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkFwcGx5Q29tcGF0TWFwVG9LZXkoCS8qIEZhbHNlIG9ubHkgb24gZXJyb3IgKi8KKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCQkvKiBrZXltYXAgdG8gYmUgZWRpdGVkICovCisgICAgS2V5Q29kZQkJLyoga2V5ICovLAkJLyoga2V5IHRvIGJlIHVwZGF0ZWQgKi8KKyAgICBYa2JDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8JCS8qIHJlc3VsdGluZyBjaGFuZ2VzIHRvIG1hcCAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiVXBkYXRlTWFwRnJvbUNvcmUoIC8qIEZhbHNlIG9ubHkgb24gZXJyb3IgKi8KKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCQkvKiBYS0Iga2V5Ym9hcmQgdG8gYmUgZWRpdGVkICovCisgICAgS2V5Q29kZQkJLyogZmlyc3Rfa2V5ICovLAkvKiBmaXJzdCBjaGFuZ2VkIGtleSAqLworICAgIGludAkJCS8qIG51bV9rZXlzICovLCAJLyogbnVtYmVyIG9mIGNoYW5nZWQga2V5cyAqLworICAgIGludAkJCS8qIG1hcF93aWR0aCAqLywJLyogd2lkdGggb2YgY29yZSBrZXltYXAgKi8KKyAgICBLZXlTeW0gKgkJLyogY29yZV9rZXlzeW1zICovLAkvKiBzeW1ib2xzIGZyb20gY29yZSBrZXltYXAgKi8KKyAgICBYa2JDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8JCS8qIHJlc3VsdGluZyBjaGFuZ2VzICovCispOworCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKK2V4dGVybglYa2JEZXZpY2VMZWRJbmZvUHRyCVhrYkFkZERldmljZUxlZEluZm8oCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJZCAqLworKTsKKworZXh0ZXJuCVN0YXR1cwkJCVhrYlJlc2l6ZURldmljZUJ1dHRvbkFjdGlvbnMoCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogbmV3VG90YWwgKi8KKyk7CisKK2V4dGVybglYa2JEZXZpY2VJbmZvUHRyCVhrYkFsbG9jRGV2aWNlSW5mbygKKwl1bnNpZ25lZCBpbnQJCS8qIGRldmljZVNwZWMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuQnV0dG9ucyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHN6TGVkcyAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiRnJlZURldmljZUluZm8oCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVEZXZJICovCispOworCitleHRlcm4Jdm9pZAlYa2JOb3RlRGV2aWNlQ2hhbmdlcygKKyAgICBYa2JEZXZpY2VDaGFuZ2VzUHRyCQkJLyogb2xkICovLAorICAgIFhrYkV4dGVuc2lvbkRldmljZU5vdGlmeUV2ZW50ICoJLyogbmV3ICovLAorICAgIHVuc2lnbmVkIGludAkgCQkvKiB3YW50ZWQgKi8KKyk7CisKK2V4dGVybglYa2JEZXZpY2VJbmZvUHRyIFhrYkdldERldmljZUluZm8oCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJdW5zaWduZWQgaW50IAkJLyogd2hpY2ggKi8sCisJdW5zaWduZWQgaW50CQkvKiBkZXZpY2VTcGVjICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJRCAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXREZXZpY2VJbmZvQ2hhbmdlcygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJWGtiRGV2aWNlQ2hhbmdlc1B0ciAJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXREZXZpY2VCdXR0b25BY3Rpb25zKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwlCb29sCQkJLyogYWxsICovLAorCXVuc2lnbmVkIGludAkJLyogZmlyc3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuQnRucyAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JHZXREZXZpY2VMZWRJbmZvKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZENsYXNzIChjbGFzcywgWElEZmx0LCBYSUFsbCkgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJZCAoaWQsIFhJRGZsdCwgWElBbGwpICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKFhrYlhJX0luZGljYXRvcntOYW1lcyxNYXB9TWFzayAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiU2V0RGV2aWNlSW5mbygKKwlEaXNwbGF5ICoJCS8qIGRweSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLworKTsKKworZXh0ZXJuCUJvb2wJWGtiQ2hhbmdlRGV2aWNlSW5mbygKKwlEaXNwbGF5KgkJLyogZHB5ICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGVzYyAqLywKKwlYa2JEZXZpY2VDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8KKyk7CisKK2V4dGVybiAgQm9vbCBYa2JTZXREZXZpY2VMZWRJbmZvKAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCVhrYkRldmljZUluZm9QdHIJLyogZGV2aSAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBsZWRDbGFzcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGxlZElEICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8KKyk7CisKK2V4dGVybglCb29sIFhrYlNldERldmljZUJ1dHRvbkFjdGlvbnMoCisJRGlzcGxheSAqCQkvKiBkcHkgKi8sCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogZmlyc3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuQnRucyAqLworKTsKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4JY2hhcglYa2JUb0NvbnRyb2woCisJY2hhcgkJLyogYyAqLworKTsKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4JQm9vbCBYa2JTZXREZWJ1Z2dpbmdGbGFncygKKyAgICBEaXNwbGF5ICoJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbWFzayAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZmxhZ3MgKi8sCisgICAgY2hhciAqCQkvKiBtc2cgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGN0cmxzX21hc2sgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGN0cmxzICovLAorICAgIHVuc2lnbmVkIGludCAqCS8qIHJ0cm5fZmxhZ3MgKi8sCisgICAgdW5zaWduZWQgaW50ICoJLyogcnRybl9jdHJscyAqLworKTsKKworZXh0ZXJuCUJvb2wgWGtiQXBwbHlWaXJ0dWFsTW9kQ2hhbmdlcygKKyAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgIHVuc2lnbmVkIGludAkJLyogY2hhbmdlZCAqLywKKyAgIFhrYkNoYW5nZXNQdHIJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiVXBkYXRlQWN0aW9uVmlydHVhbE1vZHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYkFjdGlvbiAqCQkvKiBhY3QgKi8sCisJdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVLZXlUeXBlVmlydHVhbE1vZHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYktleVR5cGVQdHIJCS8qIHR5cGUgKi8sCisJdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkICovLAorCVhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWEtCTElCX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YV0RGaWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YV0RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMjJlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hXREZpbGUuaApAQCAtMCwwICsxLDExNCBAQAorLyogJFhvcmc6IFhXREZpbGUuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIyIHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTg1LCAxOTg2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisvKgorICogWFdERmlsZS5oCU1JVCBQcm9qZWN0IEF0aGVuYSwgWCBXaW5kb3cgc3lzdGVtIHdpbmRvdyByYXN0ZXIKKyAqCQlpbWFnZSBkdW1wZXIsIGR1bXAgZmlsZSBmb3JtYXQgaGVhZGVyIGZpbGUuCisgKgorICogIEF1dGhvcjoJVG9ueSBEZWxsYSBGZXJhLCBERUMKKyAqCQkyNy1KdW4tODUKKyAqIAorICogTW9kaWZpZXI6ICAgIFdpbGxpYW0gRi4gV3lhdHQsIFNBTworICogICAgICAgICAgICAgIDE4LU5vdi04NiAgLSB2ZXJzaW9uIDYgZm9yIHNhdmluZy9yZXN0b3JpbmcgY29sb3IgbWFwcworICovCisKKyNpZm5kZWYgWFdERklMRV9ICisjZGVmaW5lIFhXREZJTEVfSAorCisjaW5jbHVkZSA8WDExL1htZC5oPgorCisjZGVmaW5lIFhXRF9GSUxFX1ZFUlNJT04gNworI2RlZmluZSBzel9YV0RoZWFkZXIgMTAwCisjZGVmaW5lIHN6X1hXRENvbG9yIDEyCisKK3R5cGVkZWYgQ0FSRDMyIHh3ZHZhbDsJCS8qIGZvciBvbGQgYnJva2VuIHByb2dyYW1zICovCisKKy8qIFZhbHVlcyBpbiB0aGUgZmlsZSBhcmUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LiAqLworCit0eXBlZGVmIHN0cnVjdCBfeHdkX2ZpbGVfaGVhZGVyIHsKKwkvKiBoZWFkZXJfc2l6ZSA9IFNJWkVPRihYV0RoZWFkZXIpICsgbGVuZ3RoIG9mIG51bGwtdGVybWluYXRlZAorCSAqIHdpbmRvdyBuYW1lLiAqLworCUNBUkQzMiBoZWFkZXJfc2l6ZSBCMzI7CQkKKworCUNBUkQzMiBmaWxlX3ZlcnNpb24gQjMyOwkvKiA9IFhXRF9GSUxFX1ZFUlNJT04gYWJvdmUgKi8KKwlDQVJEMzIgcGl4bWFwX2Zvcm1hdCBCMzI7CS8qIFpQaXhtYXAgb3IgWFlQaXhtYXAgKi8KKwlDQVJEMzIgcGl4bWFwX2RlcHRoIEIzMjsJLyogUGl4bWFwIGRlcHRoICovCisJQ0FSRDMyIHBpeG1hcF93aWR0aCBCMzI7CS8qIFBpeG1hcCB3aWR0aCAqLworCUNBUkQzMiBwaXhtYXBfaGVpZ2h0IEIzMjsJLyogUGl4bWFwIGhlaWdodCAqLworCUNBUkQzMiB4b2Zmc2V0IEIzMjsJCS8qIEJpdG1hcCB4IG9mZnNldCwgbm9ybWFsbHkgMCAqLworCUNBUkQzMiBieXRlX29yZGVyIEIzMjsJCS8qIG9mIGltYWdlIGRhdGE6IE1TQkZpcnN0LCBMU0JGaXJzdCAqLworCisJLyogYml0bWFwX3VuaXQgYXBwbGllcyB0byBiaXRtYXBzIChkZXB0aCAxIGZvcm1hdCBYWSkgb25seS4KKwkgKiBJdCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBlYWNoIHNjYW5saW5lIGlzIHBhZGRlZCB0by4gKi8KKwlDQVJEMzIgYml0bWFwX3VuaXQgQjMyOwkJCisKKwlDQVJEMzIgYml0bWFwX2JpdF9vcmRlciBCMzI7CS8qIGJpdG1hcHMgb25seTogTVNCRmlyc3QsIExTQkZpcnN0ICovCisKKwkvKiBiaXRtYXBfcGFkIGFwcGxpZXMgdG8gcGl4bWFwcyAobm9uLWJpdG1hcHMpIG9ubHkuCisJICogSXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgZWFjaCBzY2FubGluZSBpcyBwYWRkZWQgdG8uICovCisJQ0FSRDMyIGJpdG1hcF9wYWQgQjMyOwkJCisKKwlDQVJEMzIgYml0c19wZXJfcGl4ZWwgQjMyOwkvKiBCaXRzIHBlciBwaXhlbCAqLworCisJLyogYnl0ZXNfcGVyX2xpbmUgaXMgcGl4bWFwX3dpZHRoIHBhZGRlZCB0byBiaXRtYXBfdW5pdCAoYml0bWFwcykKKwkgKiBvciBiaXRtYXBfcGFkIChwaXhtYXBzKS4gIEl0IGlzIHRoZSBkZWx0YSAoaW4gYnl0ZXMpIHRvIGdldAorCSAqIHRvIHRoZSBzYW1lIHggcG9zaXRpb24gb24gYW4gYWRqYWNlbnQgcm93LiAqLworCUNBUkQzMiBieXRlc19wZXJfbGluZSBCMzI7CisJQ0FSRDMyIHZpc3VhbF9jbGFzcyBCMzI7CS8qIENsYXNzIG9mIGNvbG9ybWFwICovCisJQ0FSRDMyIHJlZF9tYXNrIEIzMjsJCS8qIFogcmVkIG1hc2sgKi8KKwlDQVJEMzIgZ3JlZW5fbWFzayBCMzI7CQkvKiBaIGdyZWVuIG1hc2sgKi8KKwlDQVJEMzIgYmx1ZV9tYXNrIEIzMjsJCS8qIFogYmx1ZSBtYXNrICovCisJQ0FSRDMyIGJpdHNfcGVyX3JnYiBCMzI7CS8qIExvZzIgb2YgZGlzdGluY3QgY29sb3IgdmFsdWVzICovCisJQ0FSRDMyIGNvbG9ybWFwX2VudHJpZXMgQjMyOwkvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBjb2xvcm1hcDsgbm90IHVzZWQ/ICovCisJQ0FSRDMyIG5jb2xvcnMgQjMyOwkJLyogTnVtYmVyIG9mIFhXRENvbG9yIHN0cnVjdHVyZXMgKi8KKwlDQVJEMzIgd2luZG93X3dpZHRoIEIzMjsJLyogV2luZG93IHdpZHRoICovCisJQ0FSRDMyIHdpbmRvd19oZWlnaHQgQjMyOwkvKiBXaW5kb3cgaGVpZ2h0ICovCisJQ0FSRDMyIHdpbmRvd194IEIzMjsJCS8qIFdpbmRvdyB1cHBlciBsZWZ0IFggY29vcmRpbmF0ZSAqLworCUNBUkQzMiB3aW5kb3dfeSBCMzI7CQkvKiBXaW5kb3cgdXBwZXIgbGVmdCBZIGNvb3JkaW5hdGUgKi8KKwlDQVJEMzIgd2luZG93X2JkcndpZHRoIEIzMjsJLyogV2luZG93IGJvcmRlciB3aWR0aCAqLworfSBYV0RGaWxlSGVhZGVyOworCisvKiBOdWxsLXRlcm1pbmF0ZWQgd2luZG93IG5hbWUgZm9sbG93cyB0aGUgYWJvdmUgc3RydWN0dXJlLiAqLworCisvKiBOZXh0IGNvbWVzIFhXRENvbG9yIHN0cnVjdHVyZXMsIGF0IG9mZnNldCBYV0RGaWxlSGVhZGVyLmhlYWRlcl9zaXplIGluCisgKiB0aGUgZmlsZS4gIFhXREZpbGVIZWFkZXIubmNvbG9ycyB0ZWxscyBob3cgbWFueSBYV0RDb2xvciBzdHJ1Y3R1cmVzCisgKiB0aGVyZSBhcmUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEMzIJcGl4ZWwgQjMyOworICAgICAgICBDQVJEMTYJcmVkIEIxNjsKKwlDQVJEMTYJZ3JlZW4gQjE2OworCUNBUkQxNglibHVlIEIxNjsKKyAgICAgICAgQ0FSRDgJZmxhZ3M7CisgICAgICAgIENBUkQ4CXBhZDsKK30gWFdEQ29sb3I7CisKKy8qIExhc3QgY29tZXMgdGhlIGltYWdlIGRhdGEgaW4gdGhlIGZvcm1hdCBkZXNjcmliZWQgYnkgWFdERmlsZUhlYWRlci4gKi8KKworI2VuZGlmIC8qIFhXREZJTEVfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YYWxsb2NhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YYWxsb2NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMjY3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhbGxvY2EuaApAQCAtMCwwICsxLDE0NSBAQAorLyogJFhvcmc6IFhhbGxvY2EuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIyIHhvcmdjdnMgRXhwICQgKi8KKworLyoKKworQ29weXJpZ2h0IDE5OTUsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKK2luY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKK0VYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvWGFsbG9jYS5oLHYgMy4xMCAyMDAxLzEyLzE0IDE5OjUzOjI1IGRhd2VzIEV4cCAkICovCisKKy8qCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGhlYWRlciBpcyB0byBkZWZpbmUgdGhlIG1hY3JvcyBBTExPQ0FURV9MT0NBTCBhbmQKKyAqIERFQUxMT0NBVEVfTE9DQUwgYXBwcm9wcmlhdGVseSBmb3IgdGhlIHBsYXRmb3JtIGJlaW5nIGNvbXBpbGVkIG9uLgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIG1ha2UgZmFzdCwgZnVuY3Rpb24tbG9jYWwgbWVtb3J5IGFsbG9jYXRpb25zLgorICogVGhlaXIgY2hhcmFjdGVyaXN0aWNzIGFyZSBhcyBmb2xsb3dzOgorICoKKyAqIHZvaWQgKkFMTE9DQVRFX0xPQ0FMKGludCBzaXplKQorICogICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gc2l6ZSBieXRlcyBvZiBtZW1vcnksIG9yIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24KKyAqICAgIGZhaWxlZC4gIFRoZSBtZW1vcnkgbXVzdCBiZSBmcmVlZCB3aXRoIERFQUxMT0NBVEVfTE9DQUwgYmVmb3JlIHRoZQorICogICAgZnVuY3Rpb24gdGhhdCBtYWRlIHRoZSBhbGxvY2F0aW9uIHJldHVybnMuICBZb3Ugc2hvdWxkIG5vdCBhc2sgZm9yCisgKiAgICBsYXJnZSBibG9ja3Mgb2YgbWVtb3J5IHdpdGggdGhpcyBmdW5jdGlvbiwgc2luY2Ugb24gbWFueSBwbGF0Zm9ybXMKKyAqICAgIHRoZSBtZW1vcnkgY29tZXMgZnJvbSB0aGUgc3RhY2ssIHdoaWNoIG1heSBoYXZlIGxpbWl0ZWQgc2l6ZS4KKyAqCisgKiB2b2lkIERFQUxMT0NBVEVfTE9DQUwodm9pZCAqKQorICogICAgRnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgQUxMT0NBVEVfTE9DQUwuICBPbWlzc2lvbiBvZiB0aGlzCisgKiAgICBzdGVwIG1heSBiZSBoYXJtbGVzcyBvbiBzb21lIHBsYXRmb3JtcywgYnV0IHdpbGwgcmVzdWx0IGluCisgKiAgICBtZW1vcnkgbGVha3Mgb3Igd29yc2Ugb24gb3RoZXJzLgorICoKKyAqIEJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLCB5b3Ugc2hvdWxkIGRlZmluZSB0d28gbWFjcm9zLAorICogQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0sgYW5kIERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0ssIHRoYXQgaGF2ZSB0aGUKKyAqIHNhbWUgY2hhcmFjdGVyaXN0aWNzIGFzIEFMTE9DQVRFX0xPQ0FMIGFuZCBERUFMTE9DQVRFX0xPQ0FMLiAgVGhlCisgKiBoZWFkZXIgdXNlcyB0aGUgZmFsbGJhY2tzIGlmIGl0IGRvZXNuJ3Qga25vdyBhICJiZXR0ZXIiIHdheSB0byBkZWZpbmUKKyAqIEFMTE9DQVRFX0xPQ0FMIGFuZCBERUFMTE9DQVRFX0xPQ0FMLiAgVHlwaWNhbCB1c2FnZSB3b3VsZCBiZToKKyAqCisgKiAgICAjZGVmaW5lIEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKF9zaXplKSBtYWxsb2MoX3NpemUpCisgKiAgICAjZGVmaW5lIERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0soX3B0cikgZnJlZShfcHRyKQorICogICAgI2luY2x1ZGUgIlhhbGxvY2EuaCIKKyAqLworCisjaWZuZGVmIFhBTExPQ0FfSAorI2RlZmluZSBYQUxMT0NBX0ggMQorCisjaWZuZGVmIElOQ0xVREVfQUxMT0NBX0gKKyMgaWYgZGVmaW5lZChfX1NVTlBST19DKSAgLyogTmVlZCB0byBhZGQgbW9yZSBoZXJlIHRvIG1hdGNoIEltYWtlICouY2YncyAqLworIyAgZGVmaW5lIElOQ0xVREVfQUxMT0NBX0gKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSU5DTFVERV9BTExPQ0FfSAorIyAgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYKKworI2lmbmRlZiBOT19BTExPQ0EKKy8qCisgKiBvcy1kZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBsb2NhbCBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24KKyAqIElmIHlvdSB3YW50IHNvbWV0aGluZyBvdGhlciB0aGFuIChERSlBTExPQ0FURV9MT0NBTF9GQUxMQkFDSworICogZm9yIEFMTE9DQVRFL0RFQUxMT0NBVEVfTE9DQUwgdGhlbiB5b3UgYWRkIHRoYXQgaW4gaGVyZS4KKyAqLworIyAgaWYgZGVmaW5lZChfX0hJR0hDX18pCisjICAgIGlmbmRlZiBOQ1IKKyAgICAgICBleHRlcm4gY2hhciAqYWxsb2NhKCk7CisjICAgICAgaWYgSENWRVJTSU9OIDwgMjEwMDMKKyMgICAgICAgIGRlZmluZSBBTExPQ0FURV9MT0NBTChzaXplKQlhbGxvY2EoKGludCkoc2l6ZSkpCisgICAgICAgICBwcmFnbWEgb24oYWxsb2NhKTsKKyMgICAgICBlbHNlIC8qIEhDVkVSU0lPTiA+PSAyMTAwMyAqLworIyAgICAgICAgZGVmaW5lCUFMTE9DQVRFX0xPQ0FMKHNpemUpCV9BbGxvY2EoKGludCkoc2l6ZSkpCisjICAgICAgZW5kaWYgLyogSENWRVJTSU9OIDwgMjEwMDMgKi8KKyMgICAgZWxzZSAvKiBOQ1IgKi8KKyMgICAgICBkZWZpbmUgQUxMT0NBVEVfTE9DQUwoc2l6ZSkJYWxsb2NhKHNpemUpCisjICAgIGVuZGlmCisjICBlbmRpZiAvKiBkZWZpbmVkKF9fSElHSENfXykgKi8KKworCisjICBpZmRlZiBfX0dOVUNfXworIyAgICBpZm5kZWYgYWxsb2NhCisjICAgICAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjICAgIGVuZGlmIC8qICFhbGxvY2EgKi8KKyMgICAgZGVmaW5lIEFMTE9DQVRFX0xPQ0FMKHNpemUpIGFsbG9jYSgoaW50KShzaXplKSkKKyMgIGVsc2UgLyogISBfX0dOVUNfXyAqLworCisvKgorICogd2FybmluZzogb2xkIG1pcHMgYWxsb2NhIChwcmUgMi4xMCkgaXMgdW51c2FibGUsIG5ldyBvbmUgaXMgYnVpbHQgaW4KKyAqIFRlc3QgaXMgZWFzeSwgdGhlIG5ldyBvbmUgaXMgbmFtZWQgX19idWlsdGluX2FsbG9jYSBhbmQgY29tZXMKKyAqIGZyb20gYWxsb2NhLmggd2hpY2ggI2RlZmluZXMgYWxsb2NhLgorICovCisjICAgIGlmbmRlZiBOQ1IKKyMgICAgICBpZiBkZWZpbmVkKHZheCkgfHwgZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoYXBvbGxvKSB8fCBkZWZpbmVkKHN0ZWxsYXIpIHx8IGRlZmluZWQoYWxsb2NhKQorLyoKKyAqIFNvbWUgU3lzdGVtIFYgYm94ZXMgZXh0cmFjdCBhbGxvY2EubyBmcm9tIC9saWIvbGliUFcuYTsgaWYgeW91CisgKiBkZWNpZGUgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgYWxsb2NhLCB5b3UgbWlnaHQgd2FudCB0byBmaXggaXQgaGVyZS4KKyAqLworLyogYWxsb2NhIG1pZ2h0IGJlIGEgbWFjcm8gdGFraW5nIG9uZSBhcmcgKGhpLCBTdW4hKSwgc28gZ2l2ZSBpdCBvbmUuICovCisjICAgICAgICBpZm5kZWYgX19zZ2kJCQkvKiBJUklYIDUvNiBoYXMgZGVmaW5pdGlvbiAqLworIyAgICAgICAgIGlmbmRlZiBfX1FOWF9fCisjICAgICAgICAgIGRlZmluZSBfX1hudWxsYXJnCQkvKiBhcyBub3RoaW5nICovCisjICAgICAgICAgIGlmbmRlZiBYX05PVF9TVERDX0VOVgorICAgICAgICAgICAgIGV4dGVybiB2b2lkICphbGxvY2EoX19YbnVsbGFyZyk7CisjICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBleHRlcm4gY2hhciAqYWxsb2NhKF9fWG51bGxhcmcpOworIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgIGVuZGlmIC8qIF9fUU5YX18gKi8KKyMgICAgICAgIGVuZGlmIC8qIF9fc2dpICovCisjICAgICAgICBkZWZpbmUgQUxMT0NBVEVfTE9DQUwoc2l6ZSkgYWxsb2NhKChpbnQpKHNpemUpKQorIyAgICAgIGVuZGlmIC8qIHdobyBkb2VzIGFsbG9jYSAqLworIyAgICBlbmRpZiAvKiBOQ1IgKi8KKyMgIGVuZGlmIC8qIF9fR05VQ19fICovCisKKyNlbmRpZiAvKiBOT19BTExPQ0EgKi8KKworI2lmICFkZWZpbmVkKEFMTE9DQVRFX0xPQ0FMKQorIyAgaWYgZGVmaW5lZChBTExPQ0FURV9MT0NBTF9GQUxMQkFDSykgJiYgZGVmaW5lZChERUFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLKQorIyAgICBkZWZpbmUgQUxMT0NBVEVfTE9DQUwoX3NpemUpICBBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyhfc2l6ZSkKKyMgICAgZGVmaW5lIERFQUxMT0NBVEVfTE9DQUwoX3B0cikgREVBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyhfcHRyKQorIyAgZWxzZSAvKiBubyBmYWxsYmFja3Mgc3VwcGxpZWQ7IGVycm9yICovCisjICAgIGRlZmluZSBBTExPQ0FURV9MT0NBTChfc2l6ZSkgIEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLIHVuZGVmaW5lZCEKKyMgICAgZGVmaW5lIERFQUxMT0NBVEVfTE9DQUwoX3B0cikgREVBTExPQ0FURV9MT0NBTF9GQUxMQkFDSyB1bmRlZmluZWQhCisjICBlbmRpZiAvKiBkZWZpbmVkKEFMTE9DQVRFX0xPQ0FMX0ZBTExCQUNLICYmIERFQUxMT0NBVEVfTE9DQUxfRkFMTEJBQ0spICovCisjZWxzZQorIyAgaWYgIWRlZmluZWQoREVBTExPQ0FURV9MT0NBTCkKKyMgICAgZGVmaW5lIERFQUxMT0NBVEVfTE9DQUwoX3B0cikgZG8ge30gd2hpbGUoMCkKKyMgIGVuZGlmCisjZW5kaWYgLyogZGVmaW5lZChBTExPQ0FURV9MT0NBTCkgKi8KKworI2VuZGlmIC8qIFhBTExPQ0FfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGFyY2guaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwNGU1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hhcmNoLmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgX1hBUkNIX0hfCisjZGVmaW5lIF9YQVJDSF9IXworCisvKgorICogQ29weXJpZ2h0IDE5OTcgTWV0cm8gTGluayBJbmNvcnBvcmF0ZWQKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUgbGlzdGVkIGNvcHlyaWdodCBob2xkZXIocykKKyAqIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZgorICogdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhYm92ZSBsaXN0ZWQKKyAqIGNvcHlyaWdodCBob2xkZXIocykgbWFrZShzKSBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yCisgKiBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBBQk9WRSBMSVNURUQgQ09QWVJJR0hUIEhPTERFUihTKSBESVNDTEFJTShTKSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRAorICogVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIExJU1RFRCBDT1BZUklHSFQgSE9MREVSKFMpIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCisgKiBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORworICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL1hhcmNoLmgsdiAxLjEwdHNpIEV4cCAkICovCisKKworLyoKKyAqIERldGVybWluZSB0aGUgbWFjaGluZSdzIGJ5dGUgb3JkZXIuCisgKi8KKworLyogU2VlIGlmIGl0IGlzIHNldCBpbiB0aGUgaW1ha2UgY29uZmlnIGZpcnN0ICovCisjaWZkZWYgWF9CWVRFX09SREVSCisKKyNkZWZpbmUgWF9CSUdfRU5ESUFOIDQzMjEKKyNkZWZpbmUgWF9MSVRUTEVfRU5ESUFOIDEyMzQKKworI2Vsc2UKKworI2lmZGVmIFNWUjQKKyNpZiBkZWZpbmVkKE5DUikgfHwgZGVmaW5lZChNaXBzKSB8fCBkZWZpbmVkKF9fc2dpKQorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyNlbHNlCisjaWYgIWRlZmluZWQoc3VuKQorI2luY2x1ZGUgPHN5cy9ieXRlb3JkZXIuaD4KKyNlbmRpZgorI2VuZGlmCisjZWxpZiBkZWZpbmVkKENTUkdfQkFTRUQpCisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KKyNlbGlmIGRlZmluZWQobGludXgpCisjaWYgZGVmaW5lZCBfX1NUUklDVF9BTlNJX18KKyN1bmRlZiBfX1NUUklDVF9BTlNJX18KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNkZWZpbmUgX19TVFJJQ1RfQU5TSV9fCisjZWxzZQorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2VuZGlmCisvKiAnZW5kaWFuLmgnIG1pZ2h0IGhhdmUgYmVlbiBpbmNsdWRlZCBiZWZvcmUgJ1hhcmNoLmgnICovCisjaWYgIWRlZmluZWQoTElUVExFX0VORElBTikgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIExJVFRMRV9FTkRJQU4gX19MSVRUTEVfRU5ESUFOCisjZW5kaWYKKyNpZiAhZGVmaW5lZChCSUdfRU5ESUFOKSAmJiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgQklHX0VORElBTiBfX0JJR19FTkRJQU4KKyNlbmRpZgorI2lmICFkZWZpbmVkKFBEUF9FTkRJQU4pICYmIGRlZmluZWQoX19QRFBfRU5ESUFOKQorI2RlZmluZSBQRFBfRU5ESUFOIF9fUERQX0VORElBTgorI2VuZGlmCisjaWYgIWRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChfX0JZVEVfT1JERVIpCisjZGVmaW5lIEJZVEVfT1JERVIgX19CWVRFX09SREVSCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoTHlueCkKKyNpZiAwCisvKiBMeW54T1MgMi40LjAgaGFzIHdyb25nIGRlZmluZXMgaW4gYnNkL2lwLmggKi8KKyNpbmNsdWRlIDxic2QvaW4uaD4KKyNpbmNsdWRlIDxic2QvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxic2QvaXAuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgQllURV9PUkRFUgorI2RlZmluZSBMSVRUTEVfRU5ESUFOIDEyMzQKKyNkZWZpbmUgQklHX0VORElBTiAgICA0MzIxCisKKyNpZiBkZWZpbmVkKF9fUU5YX18pICYmICFkZWZpbmVkKF9fUU5YTlRPX18pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fUU5YTlRPX18pCisjaWYgZGVmaW5lZChpMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2X18pCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgQllURV9PUkRFUiBCSUdfRU5ESUFOCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTHlueAorI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl9fKQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbHNlCisjZGVmaW5lIEJZVEVfT1JERVIgQklHX0VORElBTgorI2VuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChzdW4pICYmIGRlZmluZWQoU1ZSNCkpICYmICFkZWZpbmVkKEx5bngpCisjaW5jbHVkZSA8c3lzL2lzYV9kZWZzLmg+CisjaWZkZWYgX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKyNpZmRlZiBfQklHX0VORElBTgorI2RlZmluZSBCWVRFX09SREVSIEJJR19FTkRJQU4KKyNlbmRpZgorI2VuZGlmIC8qIHN1biAqLworI2VuZGlmIC8qIEJZVEVfT1JERVIgKi8KKworI2RlZmluZSBYX0JZVEVfT1JERVIgQllURV9PUkRFUgorI2RlZmluZSBYX0JJR19FTkRJQU4gQklHX0VORElBTgorI2RlZmluZSBYX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgorCisjZW5kaWYgLyogbm90IGluIGltYWtlIGNvbmZpZyAqLworCisjZW5kaWYgLyogX1hBUkNIX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YYXRvbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGF0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODVhNDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGF0b20uaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIFhBVE9NX0gKKyNkZWZpbmUgWEFUT01fSCAxCisKKy8qIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRQorICoKKyAqIERvIG5vdCBjaGFuZ2UhICBDaGFuZ2luZyB0aGlzIGZpbGUgaW1wbGllcyBhIHByb3RvY29sIGNoYW5nZSEKKyAqLworCisjZGVmaW5lIFhBX1BSSU1BUlkgKChBdG9tKSAxKQorI2RlZmluZSBYQV9TRUNPTkRBUlkgKChBdG9tKSAyKQorI2RlZmluZSBYQV9BUkMgKChBdG9tKSAzKQorI2RlZmluZSBYQV9BVE9NICgoQXRvbSkgNCkKKyNkZWZpbmUgWEFfQklUTUFQICgoQXRvbSkgNSkKKyNkZWZpbmUgWEFfQ0FSRElOQUwgKChBdG9tKSA2KQorI2RlZmluZSBYQV9DT0xPUk1BUCAoKEF0b20pIDcpCisjZGVmaW5lIFhBX0NVUlNPUiAoKEF0b20pIDgpCisjZGVmaW5lIFhBX0NVVF9CVUZGRVIwICgoQXRvbSkgOSkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjEgKChBdG9tKSAxMCkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjIgKChBdG9tKSAxMSkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjMgKChBdG9tKSAxMikKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjQgKChBdG9tKSAxMykKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjUgKChBdG9tKSAxNCkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjYgKChBdG9tKSAxNSkKKyNkZWZpbmUgWEFfQ1VUX0JVRkZFUjcgKChBdG9tKSAxNikKKyNkZWZpbmUgWEFfRFJBV0FCTEUgKChBdG9tKSAxNykKKyNkZWZpbmUgWEFfRk9OVCAoKEF0b20pIDE4KQorI2RlZmluZSBYQV9JTlRFR0VSICgoQXRvbSkgMTkpCisjZGVmaW5lIFhBX1BJWE1BUCAoKEF0b20pIDIwKQorI2RlZmluZSBYQV9QT0lOVCAoKEF0b20pIDIxKQorI2RlZmluZSBYQV9SRUNUQU5HTEUgKChBdG9tKSAyMikKKyNkZWZpbmUgWEFfUkVTT1VSQ0VfTUFOQUdFUiAoKEF0b20pIDIzKQorI2RlZmluZSBYQV9SR0JfQ09MT1JfTUFQICgoQXRvbSkgMjQpCisjZGVmaW5lIFhBX1JHQl9CRVNUX01BUCAoKEF0b20pIDI1KQorI2RlZmluZSBYQV9SR0JfQkxVRV9NQVAgKChBdG9tKSAyNikKKyNkZWZpbmUgWEFfUkdCX0RFRkFVTFRfTUFQICgoQXRvbSkgMjcpCisjZGVmaW5lIFhBX1JHQl9HUkFZX01BUCAoKEF0b20pIDI4KQorI2RlZmluZSBYQV9SR0JfR1JFRU5fTUFQICgoQXRvbSkgMjkpCisjZGVmaW5lIFhBX1JHQl9SRURfTUFQICgoQXRvbSkgMzApCisjZGVmaW5lIFhBX1NUUklORyAoKEF0b20pIDMxKQorI2RlZmluZSBYQV9WSVNVQUxJRCAoKEF0b20pIDMyKQorI2RlZmluZSBYQV9XSU5ET1cgKChBdG9tKSAzMykKKyNkZWZpbmUgWEFfV01fQ09NTUFORCAoKEF0b20pIDM0KQorI2RlZmluZSBYQV9XTV9ISU5UUyAoKEF0b20pIDM1KQorI2RlZmluZSBYQV9XTV9DTElFTlRfTUFDSElORSAoKEF0b20pIDM2KQorI2RlZmluZSBYQV9XTV9JQ09OX05BTUUgKChBdG9tKSAzNykKKyNkZWZpbmUgWEFfV01fSUNPTl9TSVpFICgoQXRvbSkgMzgpCisjZGVmaW5lIFhBX1dNX05BTUUgKChBdG9tKSAzOSkKKyNkZWZpbmUgWEFfV01fTk9STUFMX0hJTlRTICgoQXRvbSkgNDApCisjZGVmaW5lIFhBX1dNX1NJWkVfSElOVFMgKChBdG9tKSA0MSkKKyNkZWZpbmUgWEFfV01fWk9PTV9ISU5UUyAoKEF0b20pIDQyKQorI2RlZmluZSBYQV9NSU5fU1BBQ0UgKChBdG9tKSA0MykKKyNkZWZpbmUgWEFfTk9STV9TUEFDRSAoKEF0b20pIDQ0KQorI2RlZmluZSBYQV9NQVhfU1BBQ0UgKChBdG9tKSA0NSkKKyNkZWZpbmUgWEFfRU5EX1NQQUNFICgoQXRvbSkgNDYpCisjZGVmaW5lIFhBX1NVUEVSU0NSSVBUX1ggKChBdG9tKSA0NykKKyNkZWZpbmUgWEFfU1VQRVJTQ1JJUFRfWSAoKEF0b20pIDQ4KQorI2RlZmluZSBYQV9TVUJTQ1JJUFRfWCAoKEF0b20pIDQ5KQorI2RlZmluZSBYQV9TVUJTQ1JJUFRfWSAoKEF0b20pIDUwKQorI2RlZmluZSBYQV9VTkRFUkxJTkVfUE9TSVRJT04gKChBdG9tKSA1MSkKKyNkZWZpbmUgWEFfVU5ERVJMSU5FX1RISUNLTkVTUyAoKEF0b20pIDUyKQorI2RlZmluZSBYQV9TVFJJS0VPVVRfQVNDRU5UICgoQXRvbSkgNTMpCisjZGVmaW5lIFhBX1NUUklLRU9VVF9ERVNDRU5UICgoQXRvbSkgNTQpCisjZGVmaW5lIFhBX0lUQUxJQ19BTkdMRSAoKEF0b20pIDU1KQorI2RlZmluZSBYQV9YX0hFSUdIVCAoKEF0b20pIDU2KQorI2RlZmluZSBYQV9RVUFEX1dJRFRIICgoQXRvbSkgNTcpCisjZGVmaW5lIFhBX1dFSUdIVCAoKEF0b20pIDU4KQorI2RlZmluZSBYQV9QT0lOVF9TSVpFICgoQXRvbSkgNTkpCisjZGVmaW5lIFhBX1JFU09MVVRJT04gKChBdG9tKSA2MCkKKyNkZWZpbmUgWEFfQ09QWVJJR0hUICgoQXRvbSkgNjEpCisjZGVmaW5lIFhBX05PVElDRSAoKEF0b20pIDYyKQorI2RlZmluZSBYQV9GT05UX05BTUUgKChBdG9tKSA2MykKKyNkZWZpbmUgWEFfRkFNSUxZX05BTUUgKChBdG9tKSA2NCkKKyNkZWZpbmUgWEFfRlVMTF9OQU1FICgoQXRvbSkgNjUpCisjZGVmaW5lIFhBX0NBUF9IRUlHSFQgKChBdG9tKSA2NikKKyNkZWZpbmUgWEFfV01fQ0xBU1MgKChBdG9tKSA2NykKKyNkZWZpbmUgWEFfV01fVFJBTlNJRU5UX0ZPUiAoKEF0b20pIDY4KQorCisjZGVmaW5lIFhBX0xBU1RfUFJFREVGSU5FRCAoKEF0b20pIDY4KQorI2VuZGlmIC8qIFhBVE9NX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hjbXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hjbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzliYzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGNtcy5oCkBAIC0wLDAgKzEsODA1IEBACisvKiAkWG9yZzogWGNtcy5oLHYgMS42IDIwMDAvMDgvMTcgMTk6NDU6MDQgY3BxYmxkIEV4cCAkICovCisKKy8qCisgKiBDb2RlIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gKGMpIENvcHlyaWdodCAxOTkwIDE5OTEgVGVrdHJvbml4LCBJbmMuCisgKiAJQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogCisgKiBUaGlzIGZpbGUgaXMgYSBjb21wb25lbnQgb2YgYW4gWCBXaW5kb3cgU3lzdGVtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uCisgKiBvZiBYY21zIGJhc2VkIG9uIHRoZSBUZWtDb2xvciBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbS4gIFBlcm1pc3Npb24gaXMKKyAqIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgb3RoZXJ3aXNlIGRpc3RyaWJ1dGUgdGhpcworICogc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IHRoaXMgY29weXJpZ2h0LCBwZXJtaXNzaW9uLCBhbmQgZGlzY2xhaW1lciBub3RpY2UgaXMgcmVwcm9kdWNlZCBpbgorICogYWxsIGNvcGllcyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBUZWtDb2xvcgorICogaXMgYSB0cmFkZW1hcmsgb2YgVGVrdHJvbml4LCBJbmMuCisgKiAKKyAqIFRla3Ryb25peCBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZQorICogZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiBhbmQgd2l0aCBhbGwgZmF1bHRzLgorICogCisgKiBURUtUUk9OSVggRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIEFQUExJQ0FCTEUgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorICogUEFSVElDVUxBUiBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgU0hBTEwgVEVLVFJPTklYIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorICogUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GCisgKiBDT05UUkFDVCwgTkVHTElHRU5DRSwgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgVEhFIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICoKKyAqCURFU0NSSVBUSU9OCisgKgkJUHVibGljIGluY2x1ZGUgZmlsZSBmb3IgWCBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorICovCisvKiAkWEZyZWU4NjogeGMvbGliL1gxMS9YY21zLmgsdiAxLjcgMjAwMy8xMS8wMyAwMzo0NjoyNiBkYXdlcyBFeHAgJCAqLworI2lmbmRlZiBfWENNU19IXworI2RlZmluZSBfWENNU19IXworCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKworICAgIC8qCisgICAgICogWENNUyBTdGF0dXMgVmFsdWVzCisgICAgICovCisjZGVmaW5lIFhjbXNGYWlsdXJlCQkJMAorI2RlZmluZSBYY21zU3VjY2VzcwkJCTEKKyNkZWZpbmUgWGNtc1N1Y2Nlc3NXaXRoQ29tcHJlc3Npb24JMgorCisgICAgLyoKKyAgICAgKiBDb2xvciBTcGFjZSBGb3JtYXQgSUQncworICAgICAqICAgIENvbG9yIFNwYWNlIElEJ3MgYXJlIG9mIFhjbXNDb2xvckZvcm1hdCB0eXBlLgorICAgICAqCisgICAgICogICAgYml0IDMxCisgICAgICoJICAgIDAgPT0gRGV2aWNlLUluZGVwZW5kZW50CisgICAgICoJICAgIDEgPT0gRGV2aWNlLURlcGVuZGVudAorICAgICAqCisgICAgICogICAgYml0IDMwOgorICAgICAqCSAgICAwID09IFJlZ2lzdGVyZWQgd2l0aCBYIENvbnNvcnRpdW0KKyAgICAgKgkgICAgMSA9PSBVbnJlZ2lzdGVyZWQKKyAgICAgKi8KKyNkZWZpbmUgWGNtc1VuZGVmaW5lZEZvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDAKKyNkZWZpbmUgWGNtc0NJRVhZWkZvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDEKKyNkZWZpbmUgWGNtc0NJRXV2WUZvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDIKKyNkZWZpbmUgWGNtc0NJRXh5WUZvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDMKKyNkZWZpbmUgWGNtc0NJRUxhYkZvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDQKKyNkZWZpbmUgWGNtc0NJRUx1dkZvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDUKKyNkZWZpbmUgWGNtc1Rla0hWQ0Zvcm1hdAkoWGNtc0NvbG9yRm9ybWF0KTB4MDAwMDAwMDYKKyNkZWZpbmUgWGNtc1JHQkZvcm1hdAkJKFhjbXNDb2xvckZvcm1hdCkweDgwMDAwMDAwCisjZGVmaW5lIFhjbXNSR0JpRm9ybWF0CQkoWGNtc0NvbG9yRm9ybWF0KTB4ODAwMDAwMDEKKworICAgIC8qCisgICAgICogU3RhdGUgb2YgWGNtc1BlclNjcm5JbmZvCisgICAgICovCisjZGVmaW5lIFhjbXNJbml0Tm9uZQkJMHgwMAkvKiBubyBpbml0aWFsaXphdGlvbiBhdHRlbXB0ZWQgKi8KKyNkZWZpbmUgWGNtc0luaXRTdWNjZXNzCQkweDAxCS8qIGluaXRpYWxpemF0aW9uIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgWGNtc0luaXRGYWlsdXJlCQkweGZmCS8qIGZhaWx1cmUsIHVzZSBkZWZhdWx0cyAqLworCisjZGVmaW5lIERpc3BsYXlPZkNDQyhjY2MpCQkoKGNjYyktPmRweSkKKyNkZWZpbmUgU2NyZWVuTnVtYmVyT2ZDQ0MoY2NjKQkJKChjY2MpLT5zY3JlZW5OdW1iZXIpCisjZGVmaW5lIFZpc3VhbE9mQ0NDKGNjYykJCSgoY2NjKS0+dmlzdWFsKQorI2RlZmluZSBDbGllbnRXaGl0ZVBvaW50T2ZDQ0MoY2NjKQkoJihjY2MpLT5jbGllbnRXaGl0ZVB0KQorI2RlZmluZSBTY3JlZW5XaGl0ZVBvaW50T2ZDQ0MoY2NjKQkoJihjY2MpLT5wUGVyU2NybkluZm8tPnNjcmVlbldoaXRlUHQpCisjZGVmaW5lIEZ1bmN0aW9uU2V0T2ZDQ0MoY2NjKQkJKChjY2MpLT5wUGVyU2NybkluZm8tPmZ1bmN0aW9uU2V0KQorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWGNtc0NvbG9yRm9ybWF0OwkvKiBDb2xvciBTcGFjZSBGb3JtYXQgSUQgKi8KKwordHlwZWRlZiBkb3VibGUgWGNtc0Zsb2F0OworCisgICAgLyoKKyAgICAgKiBEZXZpY2UgUkdCCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgc2hvcnQgcmVkOwkJLyogc2NhbGVkIGZyb20gMHgwMDAwIHRvIDB4ZmZmZiAqLworICAgIHVuc2lnbmVkIHNob3J0IGdyZWVuOwkvKiBzY2FsZWQgZnJvbSAweDAwMDAgdG8gMHhmZmZmICovCisgICAgdW5zaWduZWQgc2hvcnQgYmx1ZTsJLyogc2NhbGVkIGZyb20gMHgwMDAwIHRvIDB4ZmZmZiAqLworfSBYY21zUkdCOworCisgICAgLyoKKyAgICAgKiBSR0IgSW50ZW5zaXR5CisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IHJlZDsJLyogMC4wIC0gMS4wICovCisgICAgWGNtc0Zsb2F0IGdyZWVuOwkvKiAwLjAgLSAxLjAgKi8KKyAgICBYY21zRmxvYXQgYmx1ZTsJLyogMC4wIC0gMS4wICovCit9IFhjbXNSR0JpOworCisgICAgLyoKKyAgICAgKiBDSUUgWFlaCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IFg7CisgICAgWGNtc0Zsb2F0IFk7CisgICAgWGNtc0Zsb2F0IFo7Cit9IFhjbXNDSUVYWVo7CisKKyAgICAvKgorICAgICAqIENJRSB1J3YnWQorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCB1X3ByaW1lOwkJLyogMC4wIC0gMS4wICovCisgICAgWGNtc0Zsb2F0IHZfcHJpbWU7CQkvKiAwLjAgLSAxLjAgKi8KKyAgICBYY21zRmxvYXQgWTsJCS8qIDAuMCAtIDEuMCAqLworfSBYY21zQ0lFdXZZOworCisgICAgLyoKKyAgICAgKiBDSUUgeHlZCisgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWGNtc0Zsb2F0IHg7CQkvKiAwLjAgLSAxLjAgKi8KKyAgICBYY21zRmxvYXQgeTsJCS8qIDAuMCAtIDEuMCAqLworICAgIFhjbXNGbG9hdCBZOwkJLyogMC4wIC0gMS4wICovCit9IFhjbXNDSUV4eVk7CisKKyAgICAvKgorICAgICAqIENJRSBMKmEqYioKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgTF9zdGFyOwkJLyogMC4wIC0gMTAwLjAgKi8KKyAgICBYY21zRmxvYXQgYV9zdGFyOworICAgIFhjbXNGbG9hdCBiX3N0YXI7Cit9IFhjbXNDSUVMYWI7CisKKyAgICAvKgorICAgICAqIENJRSBMKnUqdioKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgTF9zdGFyOwkJLyogMC4wIC0gMTAwLjAgKi8KKyAgICBYY21zRmxvYXQgdV9zdGFyOworICAgIFhjbXNGbG9hdCB2X3N0YXI7Cit9IFhjbXNDSUVMdXY7CisKKyAgICAvKgorICAgICAqIFRla0hWQworICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhjbXNGbG9hdCBIOwkJLyogMC4wIC0gMzYwLjAgKi8KKyAgICBYY21zRmxvYXQgVjsJCS8qIDAuMCAtIDEwMC4wICovCisgICAgWGNtc0Zsb2F0IEM7CQkvKiAwLjAgLSAxMDAuMCAqLworfSBYY21zVGVrSFZDOworCisgICAgLyoKKyAgICAgKiBQQUQKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYY21zRmxvYXQgcGFkMDsKKyAgICBYY21zRmxvYXQgcGFkMTsKKyAgICBYY21zRmxvYXQgcGFkMjsKKyAgICBYY21zRmxvYXQgcGFkMzsKK30gWGNtc1BhZDsKKworCisgICAgLyoKKyAgICAgKiBYQ01TIENvbG9yIFN0cnVjdHVyZQorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKwlYY21zUkdCIFJHQjsKKwlYY21zUkdCaSBSR0JpOworCVhjbXNDSUVYWVogQ0lFWFlaOworCVhjbXNDSUV1dlkgQ0lFdXZZOworCVhjbXNDSUV4eVkgQ0lFeHlZOworCVhjbXNDSUVMYWIgQ0lFTGFiOworCVhjbXNDSUVMdXYgQ0lFTHV2OworCVhjbXNUZWtIVkMgVGVrSFZDOworCVhjbXNQYWQgUGFkOworICAgIH0gc3BlYzsJCQkvKiB0aGUgY29sb3Igc3BlY2lmaWNhdGlvbgkqLworICAgIHVuc2lnbmVkIGxvbmcgcGl4ZWw7CS8qIHBpeGVsIHZhbHVlIChhcyBuZWVkZWQpCSovCisgICAgWGNtc0NvbG9yRm9ybWF0CWZvcm1hdDsJCS8qIHRoZSBzcGVjaWZpY2F0aW9uIGZvcm1hdAkqLworfSBYY21zQ29sb3I7CisKKworICAgIC8qCisgICAgICogWENNUyBQZXIgU2NyZWVuIHJlbGF0ZWQgZGF0YQorICAgICAqLworCit0eXBlZGVmIHN0cnVjdCBfWGNtc1BlclNjcm5JbmZvIHsKKyAgICBYY21zQ29sb3IJc2NyZWVuV2hpdGVQdDsJLyogU2NyZWVuIFdoaXRlIHBvaW50ICovCisgICAgWFBvaW50ZXIJZnVuY3Rpb25TZXQ7CS8qIHBvaW50ZXIgdG8gU2NyZWVuIENvbG9yIENoYXJhY3Rlcml6YXRpb24gKi8KKwkJCQkvKiAgICAgIEZ1bmN0aW9uIFNldCBzdHJ1Y3R1cmUJCSovCisgICAgWFBvaW50ZXIJc2NyZWVuRGF0YTsJLyogcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIFNjcmVlbiBDb2xvciovCisJCQkJLyoJQ2hhcmFjdGVyaXphdGlvbiBEYXRhCQkqLworICAgIHVuc2lnbmVkIGNoYXIgc3RhdGU7ICAgLyogWGNtc0luaXROb25lLCBYY21zSW5pdFN1Y2Nlc3MsIFhjbXNJbml0RmFpbHVyZSAqLworICAgIGNoYXIJcGFkWzNdOworfSBYY21zUGVyU2NybkluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YY21zQ0NDICpYY21zQ0NDOworCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNDb21wcmVzc2lvblByb2MpKAkJLyogR2FtdXQgQ29tcHJlc3Npb24gUHJvYyAqLworICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNXaGl0ZUFkanVzdFByb2MpKAkgCS8qIFdoaXRlIFBvaW50IEFkanVzdCBQcm9jICovCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGluaXRpYWxfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3IqCQkvKiB0YXJnZXRfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKKyAgICAvKgorICAgICAqIFhDTVMgQ29sb3IgQ29udmVyc2lvbiBDb250ZXh0CisgICAgICovCit0eXBlZGVmIHN0cnVjdCBfWGNtc0NDQyB7CisgICAgRGlzcGxheQkqZHB5OwkJCS8qIFggRGlzcGxheSAqLworICAgIGludAkJc2NyZWVuTnVtYmVyOwkJLyogWCBzY3JlZW4gbnVtYmVyICovCisgICAgVmlzdWFsCSp2aXN1YWw7CQkvKiBYIFZpc3VhbCAqLworICAgIFhjbXNDb2xvcgljbGllbnRXaGl0ZVB0OwkJLyogQ2xpZW50IFdoaXRlIFBvaW50ICovCisgICAgWGNtc0NvbXByZXNzaW9uUHJvYwlnYW11dENvbXBQcm9jOwkvKiBHYW11dCBDb21wcmVzc2lvbiBGdW5jdGlvbiAqLworICAgIFhQb2ludGVyCWdhbXV0Q29tcENsaWVudERhdGE7CS8qIEdhbXV0IENvbXAgRnVuYyBDbGllbnQgRGF0YSAqLworICAgIFhjbXNXaGl0ZUFkanVzdFByb2MJd2hpdGVQdEFkalByb2M7CS8qIFdoaXRlIFBvaW50IEFkanVzdG1lbnQgRnVuY3Rpb24gKi8KKyAgICBYUG9pbnRlcgl3aGl0ZVB0QWRqQ2xpZW50RGF0YTsJLyogV2hpdGUgUHQgQWRqIEZ1bmMgQ2xpZW50IERhdGEgKi8KKyAgICBYY21zUGVyU2NybkluZm8gKnBQZXJTY3JuSW5mbzsJLyogcG9pbnRlciB0byBwZXIgc2NyZWVuIGluZm9ybWF0aW9uICovCisJCQkJCS8qICBhc3NvY2lhdGVkIHdpdGggdGhlIGFib3ZlIGRpc3BsYXkgKi8KKwkJCQkJLyogIHNjcmVlbk51bWJlciAqLworfSBYY21zQ0NDUmVjOworCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNTY3JlZW5Jbml0UHJvYykoCS8qIFNjcmVlbiBJbml0aWFsaXphdGlvbiBQcm9jICovCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovLAorICAgIFhjbXNQZXJTY3JuSW5mbyoJLyogc2NyZWVuX2luZm8gKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKlhjbXNTY3JlZW5GcmVlUHJvYykoCisgICAgWFBvaW50ZXIJCS8qIHNjcmVlbkRhdGEgKi8KKyk7CisKKyAgICAvKgorICAgICAqIEZ1bmN0aW9uIExpc3QgUG9pbnRlciAtLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzLgorICAgICAqICAgIFRoZSBlbmQgb2YgbGlzdCBpcyBpbmRpY2F0ZWQgYnkgYSBOVUxMIHBvaW50ZXIuCisgICAgICovCisvKgorICogWFhYOiAgVGhlIHVzZSBvZiB0aGUgWGNtc0NvbnZlcnNpb25Qcm9jIHR5cGUgaXMgYnJva2VuLiAgVGhlCisgKiAgICAgICBkZXZpY2UtaW5kZXBlbmRlbnQgY29sb3VyIGNvbnZlcnNpb24gY29kZSB1c2VzIGl0IGFzOgorCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNDb252ZXJzaW9uUHJvYykoWGNtc0NDQywgWGNtc0NvbG9yICosIFhjbXNDb2xvciAqLCAKKwkJCQkgICAgIHVuc2lnbmVkIGludCk7CisKKyAqICAgICAgIHdoaWxlIHRoZSBkZXZpY2UtZGVwZW5kZW50IGNvZGUgdXNlcyBpdCBhczoKKwordHlwZWRlZiBTdGF0dXMgKCpYY21zQ29udmVyc2lvblByb2MpKFhjbXNDQ0MsIFhjbXNDb2xvciAqLCB1bnNpZ25lZCBpbnQsCisJCQkJICAgICBCb29sICopOworCisgKiAgICAgICBVbnRpbCB0aGlzIGlzIHJld29ya2VkLCBpdCdzIHByb2JhYmx5IGJlc3QgdG8gbGVhdmUgaXQgdW5wcm90b2l6ZWQuCisgKiAgICAgICBUaGUgY29kZSB3b3JrcyByZWdhcmRsZXNzLgorICovCit0eXBlZGVmIFN0YXR1cyAoKlhjbXNERENvbnZlcnNpb25Qcm9jKSggLyogdXNpbmcgZGV2aWNlLWRlcGVuZGVudCB2ZXJzaW9uICovCisgICAgWGNtc0NDQyAgICAgICAgICAgICAvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKiAgICAgICAgICAvKiBwY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIC8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCogICAgICAgICAgICAgICAvKiBwQ29tcHJlc3NlZCAqLworICAgICk7CisKK3R5cGVkZWYgU3RhdHVzICgqWGNtc0RJQ29udmVyc2lvblByb2MpKCAvKiB1c2luZyBkZXZpY2UtaW5kZXBlbmRlbnQgdmVyc2lvbiAqLworICAgIFhjbXNDQ0MgICAgICAgICAgICAgLyogY2NjICovLAorICAgIFhjbXNDb2xvciogICAgICAgICAgLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKiAgICAgICAgICAvKiBwY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIC8qIG5jb2xvcnMgKi8KKyAgICApOworCit0eXBlZGVmIFhjbXNESUNvbnZlcnNpb25Qcm9jIFhjbXNDb252ZXJzaW9uUHJvYzsKK3R5cGVkZWYgWGNtc0NvbnZlcnNpb25Qcm9jICpYY21zRnVuY0xpc3RQdHI7CisKK3R5cGVkZWYgaW50ICgqWGNtc1BhcnNlU3RyaW5nUHJvYykoCS8qIENvbG9yIFN0cmluZyBQYXJzaW5nIFByb2MgKi8KKyAgICBjaGFyKgkJLyogY29sb3Jfc3RyaW5nICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworICAgIC8qCisgICAgICogQ29sb3IgU3BhY2UgLS0gcGVyIENvbG9yIFNwYWNlIHJlbGF0ZWQgZGF0YSAoRGV2aWNlLUluZGVwZW5kZW50CisgICAgICogICAgb3IgRGV2aWNlLURlcGVuZGVudCkKKyAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9YY21zQ29sb3JTcGFjZSB7CisgICAgY29uc3QgY2hhciAqcHJlZml4OwkJLyogUHJlZml4IG9mIHN0cmluZyBmb3JtYXQuCQkqLworICAgIFhjbXNDb2xvckZvcm1hdCBpZDsJCS8qIEZvcm1hdCBJRCBudW1iZXIuCQkJKi8KKyAgICBYY21zUGFyc2VTdHJpbmdQcm9jIHBhcnNlU3RyaW5nOworCQkJCS8qIFN0cmluZyBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbgkqLworICAgIFhjbXNGdW5jTGlzdFB0ciB0b19DSUVYWVo7CS8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZnVuY3Rpb24gCSovCisJCQkJLyogICBwb2ludGVycyBzdWNoIHRoYXQgd2hlbiB0aGUJKi8KKwkJCQkvKiAgIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gc2VxdWVuY2UJKi8KKwkJCQkvKiAgIHdpbGwgY29udmVydCBhIFhjbXNDb2xvciBzdHJ1Y3R1cmUJKi8KKwkJCQkvKiAgIGZyb20gdGhpcyBjb2xvciBzcGFjZSB0byBDSUVYWVoJKi8KKwkJCQkvKiAgIHNwYWNlLgkJCQkqLworICAgIFhjbXNGdW5jTGlzdFB0ciBmcm9tX0NJRVhZWjsvKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGZ1bmN0aW9uIAkqLworCQkJCS8qICAgcG9pbnRlcnMgc3VjaCB0aGF0IHdoZW4gdGhlCSovCisJCQkJLyogICBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlCSovCisJCQkJLyogICB3aWxsIGNvbnZlcnQgYSBYY21zQ29sb3Igc3RydWN0dXJlCSovCisJCQkJLyogICBmcm9tIENJRVhZWiBzcGFjZSB0byB0aGlzIGNvbG9yCSovCisJCQkJLyogICBzcGFjZS4JCQkJKi8KKyAgICBpbnQgaW52ZXJzZV9mbGFnOwkJLyogSWYgMSwgaW5kaWNhdGVzIHRoYXQgZm9yIDAgPD0gaSA8IG4JKi8KKwkJCQkvKiAgIHdoZXJlIG4gaXMgdGhlIG51bWJlciBvZiBmdW5jdGlvbgkqLworCQkJCS8qICAgcG9pbnRlcnMgaW4gdGhlIGxpc3RzIHRvX0NJRVhZWgkqLworCQkJCS8qICAgYW5kIGZyb21fQ0lFWFlaOyBmb3IgZWFjaCBmdW5jdGlvbiAqLworCQkJCS8qICAgdG9fQ0lFWFlaW2ldIGl0cyBpbnZlcnNlIGZ1bmN0aW9uCSovCisJCQkJLyogICBpcyBmcm9tX0NJRVhZWltuIC0gaV0uCQkqLworCit9IFhjbXNDb2xvclNwYWNlOworCisgICAgLyoKKyAgICAgKiBTY3JlZW4gQ29sb3IgQ2hhcmFjdGVyaXphdGlvbiBGdW5jdGlvbiBTZXQgLS0gcGVyIGRldmljZSBjbGFzcworICAgICAqICAgIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zLgorICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX1hjbXNGdW5jdGlvblNldCB7CisgICAgWGNtc0NvbG9yU3BhY2UgKipERENvbG9yU3BhY2VzOworCQkJCS8qIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8JKi8KKwkJCQkvKiAgIERldmljZS1ERVBFTkRFTlQgY29sb3Igc3BhY2VzCSovCisJCQkJLyogICB1bmRlcnN0b29kIGJ5IHRoaXMgU0NDRnVuY1NldC4JKi8KKyAgICBYY21zU2NyZWVuSW5pdFByb2Mgc2NyZWVuSW5pdFByb2M7CisJCQkJLyogU2NyZWVuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHRoYXQJKi8KKwkJCQkvKiAgIHJlYWRzIFNjcmVlbiBDb2xvciBDaGFyYWN0ZXJpemF0aW9uKi8KKwkJCQkvKiAgIERhdGEgb2ZmIHByb3BlcnRpZXMgb24gdGhlIHNjcmVlbidzKi8KKwkJCQkvKiAgIHJvb3Qgd2luZG93LgkJCSovCisgICAgWGNtc1NjcmVlbkZyZWVQcm9jIHNjcmVlbkZyZWVQcm9jOworCQkJCS8qIEZ1bmN0aW9uIHRoYXQgZnJlZXMgdGhlIFNDQ0RhdGEJKi8KKwkJCQkvKiAgIHN0cnVjdHVyZXMuCQkJKi8KK30gWGNtc0Z1bmN0aW9uU2V0OworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBTdGF0dXMgWGNtc0FkZENvbG9yU3BhY2UgKAorICAgIFhjbXNDb2xvclNwYWNlKgkvKiBwQ29sb3JTcGFjZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQWRkRnVuY3Rpb25TZXQgKAorICAgIFhjbXNGdW5jdGlvblNldCoJLyogZnVuY3Rpb25TZXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0FsbG9jQ29sb3IgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX2luX291dCAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0FsbG9jTmFtZWRDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBjb2xvcl9zdHJpbmcgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3Jfc2Nybl9yZXR1cm4gKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfZXhhY3RfcmV0dXJuICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkJLyogcmVzdWx0X2Zvcm1hdCAqLworKTsKKworZXh0ZXJuIFhjbXNDQ0MgWGNtc0NDQ09mQ29sb3JtYXAgKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJDbGlwYWIoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYkNsaXBMKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJDbGlwTGFiKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJRdWVyeU1heEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIExfc3RhciAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUxhYlF1ZXJ5TWF4TCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiUXVlcnlNYXhMQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiUXVlcnlNaW5MICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBjaHJvbWEgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMYWJUb0NJRVhZWiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTGFiV2hpdGVTaGlmdENvbG9ycygKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogaW5pdGlhbF93aGl0ZV9wb2ludCovLAorICAgIFhjbXNDb2xvcioJCS8qIHRhcmdldF93aGl0ZV9wb2ludCovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2Q2xpcEwoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dkNsaXBMdXYoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yc19pbl9vdXQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGluZGV4ICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dkNsaXB1digKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2UXVlcnlNYXhDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWVfYW5nbGUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBMX3N0YXIgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVMdXZRdWVyeU1heEwgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIGNocm9tYSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dlF1ZXJ5TWF4TEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZV9hbmdsZSAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dlF1ZXJ5TWluTCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlX2FuZ2xlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFTHV2VG9DSUV1dlkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRUx1dldoaXRlU2hpZnRDb2xvcnMoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGluaXRpYWxfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3IqCQkvKiB0YXJnZXRfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRVhZWlRvQ0lFTGFiICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUVYWVpUb0NJRXV2WSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFWFlaVG9DSUV4eVkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRVhZWlRvUkdCaSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUV1dllUb0NJRUx1diAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zQ0lFdXZZVG9DSUVYWVogKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0NJRXV2WVRvVGVrSFZDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogd2hpdGVfcG9pbnQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDSUV4eVlUb0NJRVhZWiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIHdoaXRlX3BvaW50ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLworKTsKKworZXh0ZXJuIFhjbXNDb2xvciAqWGNtc0NsaWVudFdoaXRlUG9pbnRPZkNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNDb252ZXJ0Q29sb3JzICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JBcnJ5X2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbkNvbG9ycyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHRhcmdldEZvcm1hdCAqLywKKyAgICBCb29sKgkJLyogY29tcEFycnlfcmV0dXJuICovCispOworCitleHRlcm4gWGNtc0NDQyBYY21zQ3JlYXRlQ0NDICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludAkJCS8qIHNjcmVlbk51bWJlciAqLywKKyAgICBWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY2xpZW50V2hpdGVQdCAqLywKKyAgICBYY21zQ29tcHJlc3Npb25Qcm9jIC8qIGdhbXV0Q29tcFByb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGdhbXV0Q29tcENsaWVudERhdGEgKi8sCisgICAgWGNtc1doaXRlQWRqdXN0UHJvYwkvKiB3aGl0ZVB0QWRqUHJvYyAqLywKKyAgICBYUG9pbnRlcgkJLyogd2hpdGVQdEFkakNsaWVudERhdGEgKi8KKyk7CisKK2V4dGVybiBYY21zQ0NDIFhjbXNEZWZhdWx0Q0NDICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludAkJCS8qIHNjcmVlbk51bWJlciAqLworKTsKKworZXh0ZXJuIERpc3BsYXkgKlhjbXNEaXNwbGF5T2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworZXh0ZXJuIFhjbXNDb2xvckZvcm1hdCBYY21zRm9ybWF0T2ZQcmVmaXggKAorICAgIGNoYXIqCQkvKiBwcmVmaXggKi8KKyk7CisKK2V4dGVybiB2b2lkIFhjbXNGcmVlQ0NDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc0xvb2t1cENvbG9yICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGNvbG9yX3N0cmluZyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBwQ29sb3JfZXhhY3RfaW5fb3V0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIHBDb2xvcl9zY3JuX2luX291dCAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYY21zUHJlZml4T2ZGb3JtYXQgKAorICAgIFhjbXNDb2xvckZvcm1hdAkJLyogaWQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5QmxhY2sgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5Qmx1ZSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUXVlcnlDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogcENvbG9yX2luX291dCAqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJCS8qIHJlc3VsdF9mb3JtYXQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1F1ZXJ5Q29sb3JzICgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvckFycnlfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuQ29sb3JzICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiByZXN1bHRfZm9ybWF0ICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeUdyZWVuICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yRm9ybWF0CS8qIHRhcmdldF9mb3JtYXQgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNRdWVyeVJlZCAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUXVlcnlXaGl0ZSAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvckZvcm1hdAkvKiB0YXJnZXRfZm9ybWF0ICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zUkdCaVRvQ0lFWFlaICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1JHQmlUb1JHQiAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNSR0JUb1JHQmkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYY21zU2NyZWVuTnVtYmVyT2ZDQ0MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLworKTsKKworZXh0ZXJuIFhjbXNDb2xvciAqWGNtc1NjcmVlbldoaXRlUG9pbnRPZkNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitleHRlcm4gWGNtc0NDQyBYY21zU2V0Q0NDT2ZDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8KKyk7CisKK2V4dGVybiBYY21zQ29tcHJlc3Npb25Qcm9jIFhjbXNTZXRDb21wcmVzc2lvblByb2MgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29tcHJlc3Npb25Qcm9jCS8qIGNvbXByZXNzaW9uX3Byb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGNsaWVudF9kYXRhICovCispOworCitleHRlcm4gWGNtc1doaXRlQWRqdXN0UHJvYyBYY21zU2V0V2hpdGVBZGp1c3RQcm9jICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc1doaXRlQWRqdXN0UHJvYwkvKiB3aGl0ZV9hZGp1c3RfcHJvYyAqLywKKyAgICBYUG9pbnRlcgkJLyogY2xpZW50X2RhdGEgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1NldFdoaXRlUG9pbnQgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvciAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zU3RvcmVDb2xvciAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogcENvbG9yX2luICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNTdG9yZUNvbG9ycyAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JBcnJ5X2luICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuQ29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wQXJyeV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ0NsaXBDKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNDbGlwVigKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX2luX291dCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbmNvbG9ycyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaW5kZXggKi8sCisgICAgQm9vbCoJCS8qIGNvbXByZXNzaW9uX2ZsYWdzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDQ2xpcFZDKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBpbmRleCAqLywKKyAgICBCb29sKgkJLyogY29tcHJlc3Npb25fZmxhZ3NfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1heEMgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zRmxvYXQJCS8qIGh1ZSAqLywKKyAgICBYY21zRmxvYXQJCS8qIHZhbHVlICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDUXVlcnlNYXhWICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBjaHJvbWEgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1heFZDICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhjbXNUZWtIVkNRdWVyeU1heFZTYW1wbGVzICgKKyAgICBYY21zQ0NDCQkvKiBjY2MgKi8sCisgICAgWGNtc0Zsb2F0CQkvKiBodWUgKi8sCisgICAgWGNtc0NvbG9yKgkJLyogY29sb3JzX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbnNhbXBsZXMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ1F1ZXJ5TWluViAoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNGbG9hdAkJLyogaHVlICovLAorICAgIFhjbXNGbG9hdAkJLyogY2hyb21hICovLAorICAgIFhjbXNDb2xvcioJCS8qIGNvbG9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYY21zVGVrSFZDVG9DSUV1dlkgKAorICAgIFhjbXNDQ0MJCS8qIGNjYyAqLywKKyAgICBYY21zQ29sb3IqCQkvKiB3aGl0ZV9wb2ludCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnMgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGNtc1Rla0hWQ1doaXRlU2hpZnRDb2xvcnMoCisgICAgWGNtc0NDQwkJLyogY2NjICovLAorICAgIFhjbXNDb2xvcioJCS8qIGluaXRpYWxfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3IqCQkvKiB0YXJnZXRfd2hpdGVfcG9pbnQqLywKKyAgICBYY21zQ29sb3JGb3JtYXQJLyogdGFyZ2V0X2Zvcm1hdCAqLywKKyAgICBYY21zQ29sb3IqCQkvKiBjb2xvcnNfaW5fb3V0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBuY29sb3JzICovLAorICAgIEJvb2wqCQkvKiBjb21wcmVzc2lvbl9mbGFnc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBWaXN1YWwgKlhjbXNWaXN1YWxPZkNDQyAoCisgICAgWGNtc0NDQwkJLyogY2NjICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1hDTVNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hkZWZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTJkODkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZGVmcy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9YZGVmcy5oLHYgMS4yIDE5OTkvMDgvMjIgMDY6MjE6MjAgZGF3ZXMgRXhwICQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgMTk5OSAgVGhlIFhGcmVlODYgUHJvamVjdCBJbmMuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0CitJbmMuIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQorc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCithdXRob3JpemF0aW9uIGZyb20gVGhlIFhGcmVlODYgUHJvamVjdCBJbmMuLgorCisqLworCisvKioKKyAqKiBUeXBlcyBkZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudHMgCisgKiovCisKKyNpZm5kZWYgX1hERUZTX0gKKyNkZWZpbmUgX1hERUZTX0gKKworI2lmZGVmIF9YU0VSVkVSNjQKKyNpbmNsdWRlIDxYMTEvWG1kLmg+CisjZW5kaWYgCisKKyNpZm5kZWYgX1hUWVBFREVGX0FUT00KKyMgIGRlZmluZSBfWFRZUEVERUZfQVRPTQorIyAgaWZuZGVmIF9YU0VSVkVSNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBBdG9tOworIyAgZWxzZQordHlwZWRlZiBDQVJEMzIgQXRvbTsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBCb29sCisjICBpZm5kZWYgX1hUWVBFREVGX0JPT0wKKyMgICBkZWZpbmUgX1hUWVBFREVGX0JPT0wKK3R5cGVkZWYgaW50IEJvb2w7CisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX1BPSU5URVIKKyMgIGRlZmluZSBfWFRZUEVERUZfUE9JTlRFUgordHlwZWRlZiB2b2lkICpwb2ludGVyOworI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX0NMSUVOVFBUUgordHlwZWRlZiBzdHJ1Y3QgX0NsaWVudCAqQ2xpZW50UHRyOworIyAgZGVmaW5lIF9YVFlQRURFRl9DTElFTlRQVFIKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9YSUQKKyMgIGRlZmluZSBfWFRZUEVERUZfWElECisjICBpZm5kZWYgX1hTRVJWRVI2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJRDsKKyMgIGVsc2UKK3R5cGVkZWYgQ0FSRDMyIFhJRDsKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfWFRZUEVERUZfTUFTSworIyAgZGVmaW5lIF9YVFlQRURFRl9NQVNLCisjICBpZm5kZWYgX1hTRVJWRVI2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIE1hc2s7CisjICBlbHNlCit0eXBlZGVmIENBUkQzMiBNYXNrOworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9YVFlQRURFRl9GT05UUFRSCisjICBkZWZpbmUgX1hUWVBFREVGX0ZPTlRQVFIKK3R5cGVkZWYgc3RydWN0IF9Gb250ICpGb250UHRyOyAvKiBhbHNvIGluIGZvbnRzL2luY2x1ZGUvZm9udC5oICovCisjZW5kaWYKKworI2lmbmRlZiBfWFRZUEVERUZfRk9OVAorIyAgZGVmaW5lIF9YVFlQRURFRl9GT05UCit0eXBlZGVmIFhJRAlGb250OworI2VuZGlmCisKKyNpZm5kZWYgX1hUWVBFREVGX0ZTSUQKKyMgIGlmbmRlZiBfWFNFUlZFUjY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRlNJRDsKKyMgIGVsc2UKK3R5cGVkZWYgQ0FSRDMyIEZTSUQ7CisjICBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgRlNJRCBBY2NDb250ZXh0OworCisvKiBPUyBpbmRlcGVuZGVudCB0aW1lIHZhbHVlIAorICAgWFhYIFNob3VsZCBwcm9iYWJseSBnbyBpbiBYb3MuaCAqLwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCAqKk9TVGltZVB0cjsKKworCit0eXBlZGVmIHZvaWQgKCogQmxvY2tIYW5kbGVyUHJvY1B0cikocG9pbnRlciAvKiBibG9ja0RhdGEgKi8sCisJCQkJICAgICBPU1RpbWVQdHIgLyogcFRpbWVvdXQgKi8sCisJCQkJICAgICBwb2ludGVyIC8qIHBSZWFkbWFzayAqLyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNwcm90by5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjNiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZnVuY3Byb3RvLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qIFhmdW5jcHJvdG8uaC4gIEdlbmVyYXRlZCBmcm9tIFhmdW5jcHJvdG8uaC5pbiBieSBjb25maWd1cmUuICAqLworLyogJFhvcmc6IFhmdW5jcHJvdG8uaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIyIHhvcmdjdnMgRXhwICQgKi8KKy8qCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKgorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9YZnVuY3Byb3RvLmgsdiAzLjQgMjAwMS8xMi8xNCAxOTo1MzoyNSBkYXdlcyBFeHAgJCAqLworCisvKiBEZWZpbml0aW9ucyB0byBtYWtlIGZ1bmN0aW9uIHByb3RvdHlwZXMgbWFuYWdlYWJsZSAqLworCisjaWZuZGVmIF9YRlVOQ1BST1RPX0hfCisjZGVmaW5lIF9YRlVOQ1BST1RPX0hfCisKKyNpZm5kZWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworI2RlZmluZSBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzIDEKKyNlbmRpZiAvKiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzICovCisKKyNpZm5kZWYgTmVlZFZhcmFyZ3NQcm90b3R5cGVzCisjZGVmaW5lIE5lZWRWYXJhcmdzUHJvdG90eXBlcyAxCisjZW5kaWYgLyogTmVlZFZhcmFyZ3NQcm90b3R5cGVzICovCisKKyNpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisKKyNpZm5kZWYgTmVlZE5lc3RlZFByb3RvdHlwZXMKKyNkZWZpbmUgTmVlZE5lc3RlZFByb3RvdHlwZXMgMQorI2VuZGlmIC8qIE5lZWROZXN0ZWRQcm90b3R5cGVzICovCisKKyNpZm5kZWYgX1hjb25zdAorI2RlZmluZSBfWGNvbnN0IGNvbnN0CisjZW5kaWYgLyogX1hjb25zdCAqLworCisvKiBGdW5jdGlvbiBwcm90b3R5cGUgY29uZmlndXJhdGlvbiAoc2VlIGNvbmZpZ3VyZSBmb3IgbW9yZSBpbmZvKSAqLworI2lmbmRlZiBOQVJST1dQUk9UTworI2RlZmluZSBOQVJST1dQUk9UTyAKKyNlbmRpZgorI2lmbmRlZiBGVU5DUFJPVE8KKyNkZWZpbmUgRlVOQ1BST1RPIDE1CisjZW5kaWYKKworI2lmbmRlZiBOZWVkV2lkZVByb3RvdHlwZXMKKyNpZmRlZiBOQVJST1dQUk9UTworI2RlZmluZSBOZWVkV2lkZVByb3RvdHlwZXMgMAorI2Vsc2UKKyNkZWZpbmUgTmVlZFdpZGVQcm90b3R5cGVzIDEJCS8qIGRlZmF1bHQgdG8gbWFrZSBpbnRlcnJvcHQuIGVhc2llciAqLworI2VuZGlmCisjZW5kaWYgLyogTmVlZFdpZGVQcm90b3R5cGVzICovCisKKyNlbmRpZiAvKiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzICovCisKKyNpZm5kZWYgX1hGVU5DUFJPVE9CRUdJTgorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykgLyogZm9yIEMrKyBWMi4wICovCisjZGVmaW5lIF9YRlVOQ1BST1RPQkVHSU4gZXh0ZXJuICJDIiB7CS8qIGRvIG5vdCBsZWF2ZSBvcGVuIGFjcm9zcyBpbmNsdWRlcyAqLworI2RlZmluZSBfWEZVTkNQUk9UT0VORCB9CisjZWxzZQorI2RlZmluZSBfWEZVTkNQUk9UT0JFR0lOCisjZGVmaW5lIF9YRlVOQ1BST1RPRU5ECisjZW5kaWYKKyNlbmRpZiAvKiBfWEZVTkNQUk9UT0JFR0lOICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gNCkKKyMgZGVmaW5lIF9YX1NFTlRJTkVMKHgpIF9fYXR0cmlidXRlX18gKChfX3NlbnRpbmVsX18oeCkpKQorIyBkZWZpbmUgX1hfQVRUUklCVVRFX1BSSU5URih4LHkpIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXyx4LHkpKSkKKyNlbHNlCisjIGRlZmluZSBfWF9TRU5USU5FTCh4KQorIyBkZWZpbmUgX1hfQVRUUklCVVRFX1BSSU5URih4LHkpCisjZW5kaWYgLyogR05VQyA+PSA0ICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gNCkKKyMgZGVmaW5lIF9YX0VYUE9SVCAgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjIGRlZmluZSBfWF9ISURERU4gICAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjIGRlZmluZSBfWF9JTlRFUk5BTCAgICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJpbnRlcm5hbCIpKSkKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgKF9fU1VOUFJPX0MgPj0gMHg1NTApCisjIGRlZmluZSBfWF9FWFBPUlQgICAgICBfX2dsb2JhbAorIyBkZWZpbmUgX1hfSElEREVOICAgICAgX19oaWRkZW4KKyMgZGVmaW5lIF9YX0lOVEVSTkFMICAgIF9faGlkZGVuCisjZWxzZSAvKiBub3QgZ2NjID49IDQgYW5kIG5vdCBTdW4gU3R1ZGlvID49IDggKi8KKyMgZGVmaW5lIF9YX0VYUE9SVAorIyBkZWZpbmUgX1hfSElEREVOCisjIGRlZmluZSBfWF9JTlRFUk5BTAorI2VuZGlmIC8qIEdOVUMgPj0gNCAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fKSA+PSAzMDMpCisjIGRlZmluZSBfWF9MSUtFTFkoeCkgICBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQorIyBkZWZpbmUgX1hfVU5MSUtFTFkoeCkgX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKyMgZGVmaW5lIF9YX0lOTElORSAgICAgIGlubGluZQorI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiAoX19TVU5QUk9fQyA+PSAweDU1MCkKKyMgZGVmaW5lIF9YX0xJS0VMWSh4KSAgICh4KQorIyBkZWZpbmUgX1hfVU5MSUtFTFkoeCkgKHgpCisjIGRlZmluZSBfWF9JTkxJTkUgICAgICBpbmxpbmUKKyNlbHNlIC8qIG5vdCBnY2MgPj0gMy4zIGFuZCBub3QgU3VuIFN0dWRpbyA+PSA4ICovCisjIGRlZmluZSBfWF9MSUtFTFkoeCkgICAoeCkKKyMgZGVmaW5lIF9YX1VOTElLRUxZKHgpICh4KQorIyBkZWZpbmUgX1hfSU5MSU5FCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXykgPj0gMzAxKQorIyBkZWZpbmUgX1hfREVQUkVDQVRFRCAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjZWxzZSAvKiBub3QgZ2NjID49IDMuMSAqLworIyBkZWZpbmUgX1hfREVQUkVDQVRFRAorI2VuZGlmCisKKyNlbmRpZiAvKiBfWEZVTkNQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YZnVuY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDY5YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGZ1bmNzLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqICRYZG90T3JnOiB4Yy9pbmNsdWRlL1hmdW5jcy5oLHYgMS4yIDIwMDQvMDQvMjMgMTg6NDM6MDUgZWljaCBFeHAgJAorICogJFhvcmc6IFhmdW5jcy5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjIgeG9yZ2N2cyBFeHAgJAorICogCisgKiAKK0NvcHlyaWdodCAxOTkwLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICoKKyAqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvWGZ1bmNzLmgsdiAzLjEwIDIwMDIvMDUvMzEgMTg6NDU6MzggZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWEZVTkNTX0hfCisjZGVmaW5lIF9YRlVOQ1NfSF8KKworI2luY2x1ZGUgPFgxMS9Yb3NkZWZzLmg+CisKKy8qIHRoZSBvbGQgWGZ1bmNzLmgsIGZvciBwcmUtUjYgKi8KKyNpZiAhKGRlZmluZWQoWEZyZWU4NkxPQURFUikgJiYgZGVmaW5lZChJTl9NT0RVTEUpKQorCisjaWZkZWYgWF9VU0VCRlVOQ1MKK3ZvaWQgYmNvcHkoKTsKK3ZvaWQgYnplcm8oKTsKK2ludCBiY21wKCk7CisjZWxzZQorI2lmIGRlZmluZWQoU1lTVikgJiYgIWRlZmluZWQoX19TQ09fXykgJiYgIWRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChfX1VOSVhXQVJFX18pCisjaW5jbHVkZSA8bWVtb3J5Lmg+Cit2b2lkIGJjb3B5KCk7CisjZGVmaW5lIGJ6ZXJvKGIsbGVuKSBtZW1zZXQoYiwgMCwgbGVuKQorI2RlZmluZSBiY21wKGIxLGIyLGxlbikgbWVtY21wKGIxLCBiMiwgbGVuKQorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNkZWZpbmUgX1hGVU5DU19IX0lOQ0xVREVEX1NUUklOR19ICisjaWYgZGVmaW5lZChzdW4pCisjZGVmaW5lIGJjb3B5KGIxLGIyLGxlbikgbWVtbW92ZShiMiwgYjEsIChzaXplX3QpKGxlbikpCisjZGVmaW5lIGJ6ZXJvKGIsbGVuKSBtZW1zZXQoYiwgMCwgKHNpemVfdCkobGVuKSkKKyNkZWZpbmUgYmNtcChiMSxiMixsZW4pIG1lbWNtcChiMSwgYjIsIChzaXplX3QpKGxlbikpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmIC8qIFhfVVNFQkZVTkNTICovCisKKy8qIHRoZSBuZXcgWGZ1bmNzLmggKi8KKworI2lmICFkZWZpbmVkKFhfTk9UX1NURENfRU5WKSAmJiAoIWRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKFNWUjQpKQorLyogdGhlIEFOU0kgQyB3YXkgKi8KKyNpZm5kZWYgX1hGVU5DU19IX0lOQ0xVREVEX1NUUklOR19ICisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyN1bmRlZiBiemVybworI2RlZmluZSBiemVybyhiLGxlbikgbWVtc2V0KGIsMCxsZW4pCisjZWxzZSAvKiBlbHNlIFhfTk9UX1NURENfRU5WIG9yIFN1bk9TIDQgKi8KKyNpZiBkZWZpbmVkKFNZU1YpIHx8IGRlZmluZWQobHVuYSkgfHwgZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoX19zeGdfXykKKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNkZWZpbmUgbWVtbW92ZShkc3Qsc3JjLGxlbikgYmNvcHkoKGNoYXIgKikoc3JjKSwoY2hhciAqKShkc3QpLChpbnQpKGxlbikpCisjaWYgZGVmaW5lZChTWVNWKSAmJiBkZWZpbmVkKF9YQkNPUFlGVU5DKQorI3VuZGVmIG1lbW1vdmUKKyNkZWZpbmUgbWVtbW92ZShkc3Qsc3JjLGxlbikgX1hCQ09QWUZVTkMoKGNoYXIgKikoc3JjKSwoY2hhciAqKShkc3QpLChpbnQpKGxlbikpCisjZGVmaW5lIF9YTkVFREJDT1BZRlVOQworI2VuZGlmCisjZWxzZSAvKiBlbHNlIHZhbmlsbGEgQlNEICovCisjZGVmaW5lIG1lbW1vdmUoZHN0LHNyYyxsZW4pIGJjb3B5KChjaGFyICopKHNyYyksKGNoYXIgKikoZHN0KSwoaW50KShsZW4pKQorI2RlZmluZSBtZW1jcHkoZHN0LHNyYyxsZW4pIGJjb3B5KChjaGFyICopKHNyYyksKGNoYXIgKikoZHN0KSwoaW50KShsZW4pKQorI2RlZmluZSBtZW1jbXAoYjEsYjIsbGVuKSBiY21wKChjaGFyICopKGIxKSwoY2hhciAqKShiMiksKGludCkobGVuKSkKKyNlbmRpZiAvKiBTWVNWIGVsc2UgKi8KKyNlbmRpZiAvKiAhIFhfTk9UX1NURENfRU5WIGVsc2UgKi8KKworI2lmIGRlZmluZWQoWF9OT1RfU1REQ19FTlYpIHx8IChkZWZpbmVkKHN1bikgJiYgIWRlZmluZWQoU1ZSNCkpCisjZGVmaW5lIGF0ZXhpdChmKSBvbl9leGl0KGYsIDApCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0lOMzIgJiYgZGVmaW5lZCBfX01JTkdXMzJfXworI2RlZmluZSBiY29weShiMSxiMixsZW4pIG1lbW1vdmUoYjIsIGIxLCAoc2l6ZV90KShsZW4pKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhKGRlZmluZWQoWEZyZWU4NkxPQURFUikgJiYgZGVmaW5lZChJTl9NT0RVTEUpKSAqLworCisjZW5kaWYgLyogX1hGVU5DU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjY5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliLmgKQEAgLTAsMCArMSw0MDEzIEBACisvKiAkWGRvdE9yZzogbGliL1gxMS9pbmNsdWRlL1gxMS9YbGliLmgsdiAxLjYgMjAwNS0xMS0wOCAwNjozMzoyNSBqa2ogRXhwICQgKi8KKy8qICRYb3JnOiBYbGliLmgsdiAxLjYgMjAwMS8wMi8wOSAwMjowMzozOCB4b3JnY3ZzIEV4cCAkICovCisvKiAKKworQ29weXJpZ2h0IDE5ODUsIDE5ODYsIDE5ODcsIDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisvKiAkWEZyZWU4NjogeGMvbGliL1gxMS9YbGliLmgsdiAzLjI1IDIwMDMvMTEvMTcgMjI6MjA6MTAgZGF3ZXMgRXhwICQgKi8KKworCisvKgorICoJWGxpYi5oIC0gSGVhZGVyIGRlZmluaXRpb24gYW5kIHN1cHBvcnQgZmlsZSBmb3IgdGhlIEMgc3Vicm91dGluZQorICoJaW50ZXJmYWNlIGxpYnJhcnkgKFhsaWIpIHRvIHRoZSBYIFdpbmRvdyBTeXN0ZW0gUHJvdG9jb2wgKFYxMSkuCisgKglTdHJ1Y3R1cmVzIGFuZCBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggIl8iIGFyZSBwcml2YXRlIHRvIHRoZSBsaWJyYXJ5LgorICovCisjaWZuZGVmIF9YTElCX0hfCisjZGVmaW5lIF9YTElCX0hfCisKKyNkZWZpbmUgWGxpYlNwZWNpZmljYXRpb25SZWxlYXNlIDYKKworI2lmZGVmIFVTRworI2lmbmRlZiBfX1RZUEVTX18KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCQkvKiBmb3Jnb3QgdG8gcHJvdGVjdCBpdC4uLiAqLworI2RlZmluZSBfX1RZUEVTX18KKyNlbmRpZiAvKiBfX1RZUEVTX18gKi8KKyNlbHNlCisjaWYgZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiBkZWZpbmVkKE1PVE9ST0xBKQorI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2VuZGlmIC8qIFVTRyAqLworCisjaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1guaD4KKworLyogYXBwbGljYXRpb25zIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZXNlIHR3byBoZWFkZXJzIGJlaW5nIGluY2x1ZGVkISAqLworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL1hvc2RlZnMuaD4KKworI2lmbmRlZiBYX1dDSEFSCisjaWZkZWYgWF9OT1RfU1REQ19FTlYKKyNpZm5kZWYgSVNDCisjZGVmaW5lIFhfV0NIQVIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBYX1dDSEFSCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorI2lmZGVmIF9fVU5JWE9TMl9fCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorLyogcmVwbGFjZSB0aGlzIHdpdGggI2luY2x1ZGUgb3IgdHlwZWRlZiBhcHByb3ByaWF0ZSBmb3IgeW91ciBzeXN0ZW0gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB3Y2hhcl90OworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoSVNDKSAmJiBkZWZpbmVkKFVTRV9YTUJUT1dDKQorI2RlZmluZSB3Y3RvbWIoYSxiKQlfWHdjdG9tYihhLGIpCisjZGVmaW5lIG1ibGVuKGEsYikJX1htYmxlbihhLGIpIAorI2lmbmRlZiBVU0VfWFdDSEFSX1NUUklORworI2RlZmluZSBtYnRvd2MoYSxiLGMpCV9YbWJ0b3djKGEsYixjKQorI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIGludAorX1htYmxlbigKKyNpZmRlZiBJU0MKKyAgICBjaGFyIGNvbnN0ICpzdHIsCisgICAgc2l6ZV90IGxlbgorI2Vsc2UKKyAgICBjaGFyICpzdHIsCisgICAgaW50IGxlbgorI2VuZGlmCisgICAgKTsKKworLyogQVBJIG1lbnRpb25pbmcgIlVURjgiIG9yICJ1dGY4IiBpcyBhbiBYRnJlZTg2IGV4dGVuc2lvbiwgaW50cm9kdWNlZCBpbgorICAgTm92ZW1iZXIgMjAwMC4gSXRzIHByZXNlbmNlIGlzIGluZGljYXRlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgbWFjcm8uICovCisjZGVmaW5lIFhfSEFWRV9VVEY4X1NUUklORyAxCisKK3R5cGVkZWYgY2hhciAqWFBvaW50ZXI7CisKKyNkZWZpbmUgQm9vbCBpbnQKKyNkZWZpbmUgU3RhdHVzIGludAorI2RlZmluZSBUcnVlIDEKKyNkZWZpbmUgRmFsc2UgMAorCisjZGVmaW5lIFF1ZXVlZEFscmVhZHkgMAorI2RlZmluZSBRdWV1ZWRBZnRlclJlYWRpbmcgMQorI2RlZmluZSBRdWV1ZWRBZnRlckZsdXNoIDIKKworI2RlZmluZSBDb25uZWN0aW9uTnVtYmVyKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZmQpCisjZGVmaW5lIFJvb3RXaW5kb3coZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290KQorI2RlZmluZSBEZWZhdWx0U2NyZWVuKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZGVmYXVsdF9zY3JlZW4pCisjZGVmaW5lIERlZmF1bHRSb290V2luZG93KGRweSkgCShTY3JlZW5PZkRpc3BsYXkoZHB5LERlZmF1bHRTY3JlZW4oZHB5KSktPnJvb3QpCisjZGVmaW5lIERlZmF1bHRWaXN1YWwoZHB5LCBzY3IpIChTY3JlZW5PZkRpc3BsYXkoZHB5LHNjciktPnJvb3RfdmlzdWFsKQorI2RlZmluZSBEZWZhdWx0R0MoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5kZWZhdWx0X2djKQorI2RlZmluZSBCbGFja1BpeGVsKGRweSwgc2NyKSAJKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+YmxhY2tfcGl4ZWwpCisjZGVmaW5lIFdoaXRlUGl4ZWwoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT53aGl0ZV9waXhlbCkKKyNkZWZpbmUgQWxsUGxhbmVzIAkJKCh1bnNpZ25lZCBsb25nKX4wTCkKKyNkZWZpbmUgUUxlbmd0aChkcHkpIAkJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5xbGVuKQorI2RlZmluZSBEaXNwbGF5V2lkdGgoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT53aWR0aCkKKyNkZWZpbmUgRGlzcGxheUhlaWdodChkcHksIHNjcikgKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+aGVpZ2h0KQorI2RlZmluZSBEaXNwbGF5V2lkdGhNTShkcHksIHNjcikoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5td2lkdGgpCisjZGVmaW5lIERpc3BsYXlIZWlnaHRNTShkcHksIHNjcikoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5taGVpZ2h0KQorI2RlZmluZSBEaXNwbGF5UGxhbmVzKGRweSwgc2NyKSAoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X2RlcHRoKQorI2RlZmluZSBEaXNwbGF5Q2VsbHMoZHB5LCBzY3IpIAkoRGVmYXVsdFZpc3VhbChkcHksc2NyKS0+bWFwX2VudHJpZXMpCisjZGVmaW5lIFNjcmVlbkNvdW50KGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+bnNjcmVlbnMpCisjZGVmaW5lIFNlcnZlclZlbmRvcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnZlbmRvcikKKyNkZWZpbmUgUHJvdG9jb2xWZXJzaW9uKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cHJvdG9fbWFqb3JfdmVyc2lvbikKKyNkZWZpbmUgUHJvdG9jb2xSZXZpc2lvbihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPnByb3RvX21pbm9yX3ZlcnNpb24pCisjZGVmaW5lIFZlbmRvclJlbGVhc2UoZHB5KSAJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5yZWxlYXNlKQorI2RlZmluZSBEaXNwbGF5U3RyaW5nKGRweSkgCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+ZGlzcGxheV9uYW1lKQorI2RlZmluZSBEZWZhdWx0RGVwdGgoZHB5LCBzY3IpIAkoU2NyZWVuT2ZEaXNwbGF5KGRweSxzY3IpLT5yb290X2RlcHRoKQorI2RlZmluZSBEZWZhdWx0Q29sb3JtYXAoZHB5LCBzY3IpKFNjcmVlbk9mRGlzcGxheShkcHksc2NyKS0+Y21hcCkKKyNkZWZpbmUgQml0bWFwVW5pdChkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJpdG1hcF91bml0KQorI2RlZmluZSBCaXRtYXBCaXRPcmRlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJpdG1hcF9iaXRfb3JkZXIpCisjZGVmaW5lIEJpdG1hcFBhZChkcHkpIAkJKCgoX1hQcml2RGlzcGxheSlkcHkpLT5iaXRtYXBfcGFkKQorI2RlZmluZSBJbWFnZUJ5dGVPcmRlcihkcHkpIAkoKChfWFByaXZEaXNwbGF5KWRweSktPmJ5dGVfb3JkZXIpCisjaWZkZWYgQ1JBWSAvKiB1bmFibGUgdG8gZ2V0IFdPUkQ2NCB3aXRob3V0IHB1bGxpbmcgaW4gb3RoZXIgc3ltYm9scyAqLworI2RlZmluZSBOZXh0UmVxdWVzdChkcHkpCVhOZXh0UmVxdWVzdChkcHkpCisjZWxzZQorI2RlZmluZSBOZXh0UmVxdWVzdChkcHkpCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+cmVxdWVzdCArIDEpCisjZW5kaWYKKyNkZWZpbmUgTGFzdEtub3duUmVxdWVzdFByb2Nlc3NlZChkcHkpCSgoKF9YUHJpdkRpc3BsYXkpZHB5KS0+bGFzdF9yZXF1ZXN0X3JlYWQpCisKKy8qIG1hY3JvcyBmb3Igc2NyZWVuIG9yaWVudGVkIGFwcGxpY2F0aW9ucyAodG9vbGtpdCkgKi8KKyNkZWZpbmUgU2NyZWVuT2ZEaXNwbGF5KGRweSwgc2NyKSgmKChfWFByaXZEaXNwbGF5KWRweSktPnNjcmVlbnNbc2NyXSkKKyNkZWZpbmUgRGVmYXVsdFNjcmVlbk9mRGlzcGxheShkcHkpIFNjcmVlbk9mRGlzcGxheShkcHksRGVmYXVsdFNjcmVlbihkcHkpKQorI2RlZmluZSBEaXNwbGF5T2ZTY3JlZW4ocykJKChzKS0+ZGlzcGxheSkKKyNkZWZpbmUgUm9vdFdpbmRvd09mU2NyZWVuKHMpCSgocyktPnJvb3QpCisjZGVmaW5lIEJsYWNrUGl4ZWxPZlNjcmVlbihzKQkoKHMpLT5ibGFja19waXhlbCkKKyNkZWZpbmUgV2hpdGVQaXhlbE9mU2NyZWVuKHMpCSgocyktPndoaXRlX3BpeGVsKQorI2RlZmluZSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbihzKSgocyktPmNtYXApCisjZGVmaW5lIERlZmF1bHREZXB0aE9mU2NyZWVuKHMpCSgocyktPnJvb3RfZGVwdGgpCisjZGVmaW5lIERlZmF1bHRHQ09mU2NyZWVuKHMpCSgocyktPmRlZmF1bHRfZ2MpCisjZGVmaW5lIERlZmF1bHRWaXN1YWxPZlNjcmVlbihzKSgocyktPnJvb3RfdmlzdWFsKQorI2RlZmluZSBXaWR0aE9mU2NyZWVuKHMpCSgocyktPndpZHRoKQorI2RlZmluZSBIZWlnaHRPZlNjcmVlbihzKQkoKHMpLT5oZWlnaHQpCisjZGVmaW5lIFdpZHRoTU1PZlNjcmVlbihzKQkoKHMpLT5td2lkdGgpCisjZGVmaW5lIEhlaWdodE1NT2ZTY3JlZW4ocykJKChzKS0+bWhlaWdodCkKKyNkZWZpbmUgUGxhbmVzT2ZTY3JlZW4ocykJKChzKS0+cm9vdF9kZXB0aCkKKyNkZWZpbmUgQ2VsbHNPZlNjcmVlbihzKQkoRGVmYXVsdFZpc3VhbE9mU2NyZWVuKChzKSktPm1hcF9lbnRyaWVzKQorI2RlZmluZSBNaW5DbWFwc09mU2NyZWVuKHMpCSgocyktPm1pbl9tYXBzKQorI2RlZmluZSBNYXhDbWFwc09mU2NyZWVuKHMpCSgocyktPm1heF9tYXBzKQorI2RlZmluZSBEb2VzU2F2ZVVuZGVycyhzKQkoKHMpLT5zYXZlX3VuZGVycykKKyNkZWZpbmUgRG9lc0JhY2tpbmdTdG9yZShzKQkoKHMpLT5iYWNraW5nX3N0b3JlKQorI2RlZmluZSBFdmVudE1hc2tPZlNjcmVlbihzKQkoKHMpLT5yb290X2lucHV0X21hc2spCisKKy8qCisgKiBFeHRlbnNpb25zIG5lZWQgYSB3YXkgdG8gaGFuZyBwcml2YXRlIGRhdGEgb24gc29tZSBzdHJ1Y3R1cmVzLgorICovCit0eXBlZGVmIHN0cnVjdCBfWEV4dERhdGEgeworCWludCBudW1iZXI7CQkvKiBudW1iZXIgcmV0dXJuZWQgYnkgWFJlZ2lzdGVyRXh0ZW5zaW9uICovCisJc3RydWN0IF9YRXh0RGF0YSAqbmV4dDsJLyogbmV4dCBpdGVtIG9uIGxpc3Qgb2YgZGF0YSBmb3Igc3RydWN0dXJlICovCisJaW50ICgqZnJlZV9wcml2YXRlKSgJLyogY2FsbGVkIHRvIGZyZWUgcHJpdmF0ZSBzdG9yYWdlICovCisJc3RydWN0IF9YRXh0RGF0YSAqZXh0ZW5zaW9uCisJKTsKKwlYUG9pbnRlciBwcml2YXRlX2RhdGE7CS8qIGRhdGEgcHJpdmF0ZSB0byB0aGlzIGV4dGVuc2lvbi4gKi8KK30gWEV4dERhdGE7CisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24gbWVjaGFuaXNtLgorICovCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBwdWJsaWMgdG8gZXh0ZW5zaW9uLCBjYW5ub3QgYmUgY2hhbmdlZCAqLworCWludCBleHRlbnNpb247CQkvKiBleHRlbnNpb24gbnVtYmVyICovCisJaW50IG1ham9yX29wY29kZTsJLyogbWFqb3Igb3AtY29kZSBhc3NpZ25lZCBieSBzZXJ2ZXIgKi8KKwlpbnQgZmlyc3RfZXZlbnQ7CS8qIGZpcnN0IGV2ZW50IG51bWJlciBmb3IgdGhlIGV4dGVuc2lvbiAqLworCWludCBmaXJzdF9lcnJvcjsJLyogZmlyc3QgZXJyb3IgbnVtYmVyIGZvciB0aGUgZXh0ZW5zaW9uICovCit9IFhFeHRDb2RlczsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGZvciByZXRyaWV2aW5nIGluZm8gYWJvdXQgcGl4bWFwIGZvcm1hdHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBkZXB0aDsKKyAgICBpbnQgYml0c19wZXJfcGl4ZWw7CisgICAgaW50IHNjYW5saW5lX3BhZDsKK30gWFBpeG1hcEZvcm1hdFZhbHVlczsKKworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNldHRpbmcgZ3JhcGhpY3MgY29udGV4dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmdW5jdGlvbjsJCS8qIGxvZ2ljYWwgb3BlcmF0aW9uICovCisJdW5zaWduZWQgbG9uZyBwbGFuZV9tYXNrOy8qIHBsYW5lIG1hc2sgKi8KKwl1bnNpZ25lZCBsb25nIGZvcmVncm91bmQ7LyogZm9yZWdyb3VuZCBwaXhlbCAqLworCXVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZDsvKiBiYWNrZ3JvdW5kIHBpeGVsICovCisJaW50IGxpbmVfd2lkdGg7CQkvKiBsaW5lIHdpZHRoICovCisJaW50IGxpbmVfc3R5bGU7CSAJLyogTGluZVNvbGlkLCBMaW5lT25PZmZEYXNoLCBMaW5lRG91YmxlRGFzaCAqLworCWludCBjYXBfc3R5bGU7CSAgCS8qIENhcE5vdExhc3QsIENhcEJ1dHQsIAorCQkJCSAgIENhcFJvdW5kLCBDYXBQcm9qZWN0aW5nICovCisJaW50IGpvaW5fc3R5bGU7CSAJLyogSm9pbk1pdGVyLCBKb2luUm91bmQsIEpvaW5CZXZlbCAqLworCWludCBmaWxsX3N0eWxlOwkgCS8qIEZpbGxTb2xpZCwgRmlsbFRpbGVkLCAKKwkJCQkgICBGaWxsU3RpcHBsZWQsIEZpbGxPcGFldWVTdGlwcGxlZCAqLworCWludCBmaWxsX3J1bGU7CSAgCS8qIEV2ZW5PZGRSdWxlLCBXaW5kaW5nUnVsZSAqLworCWludCBhcmNfbW9kZTsJCS8qIEFyY0Nob3JkLCBBcmNQaWVTbGljZSAqLworCVBpeG1hcCB0aWxlOwkJLyogdGlsZSBwaXhtYXAgZm9yIHRpbGluZyBvcGVyYXRpb25zICovCisJUGl4bWFwIHN0aXBwbGU7CQkvKiBzdGlwcGxlIDEgcGxhbmUgcGl4bWFwIGZvciBzdGlwcGluZyAqLworCWludCB0c194X29yaWdpbjsJLyogb2Zmc2V0IGZvciB0aWxlIG9yIHN0aXBwbGUgb3BlcmF0aW9ucyAqLworCWludCB0c195X29yaWdpbjsKKyAgICAgICAgRm9udCBmb250OwkgICAgICAgIC8qIGRlZmF1bHQgdGV4dCBmb250IGZvciB0ZXh0IG9wZXJhdGlvbnMgKi8KKwlpbnQgc3Vid2luZG93X21vZGU7ICAgICAvKiBDbGlwQnlDaGlsZHJlbiwgSW5jbHVkZUluZmVyaW9ycyAqLworCUJvb2wgZ3JhcGhpY3NfZXhwb3N1cmVzOy8qIGJvb2xlYW4sIHNob3VsZCBleHBvc3VyZXMgYmUgZ2VuZXJhdGVkICovCisJaW50IGNsaXBfeF9vcmlnaW47CS8qIG9yaWdpbiBmb3IgY2xpcHBpbmcgKi8KKwlpbnQgY2xpcF95X29yaWdpbjsKKwlQaXhtYXAgY2xpcF9tYXNrOwkvKiBiaXRtYXAgY2xpcHBpbmc7IG90aGVyIGNhbGxzIGZvciByZWN0cyAqLworCWludCBkYXNoX29mZnNldDsJLyogcGF0dGVybmVkL2Rhc2hlZCBsaW5lIGluZm9ybWF0aW9uICovCisJY2hhciBkYXNoZXM7Cit9IFhHQ1ZhbHVlczsKKworLyoKKyAqIEdyYXBoaWNzIGNvbnRleHQuICBUaGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIGltcGxlbWVudGF0aW9uCisgKiBkZXBlbmRlbnQuICBBIEdDIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZSBieSBhcHBsaWNhdGlvbiBjb2RlLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9YR0MKKyNpZmRlZiBYTElCX0lMTEVHQUxfQUNDRVNTCit7CisgICAgWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisgICAgR0NvbnRleHQgZ2lkOwkvKiBwcm90b2NvbCBJRCBmb3IgZ3JhcGhpY3MgY29udGV4dCAqLworICAgIC8qIHRoZXJlIGlzIG1vcmUgdG8gdGhpcyBzdHJ1Y3R1cmUsIGJ1dCBpdCBpcyBwcml2YXRlIHRvIFhsaWIgKi8KK30KKyNlbmRpZgorKkdDOworCisvKgorICogVmlzdWFsIHN0cnVjdHVyZTsgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgY29sb3JtYXBwaW5nIHBvc3NpYmxlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJVmlzdWFsSUQgdmlzdWFsaWQ7CS8qIHZpc3VhbCBpZCBvZiB0aGlzIHZpc3VhbCAqLworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKwlpbnQgY19jbGFzczsJCS8qIEMrKyBjbGFzcyBvZiBzY3JlZW4gKG1vbm9jaHJvbWUsIGV0Yy4pICovCisjZWxzZQorCWludCBjbGFzczsJCS8qIGNsYXNzIG9mIHNjcmVlbiAobW9ub2Nocm9tZSwgZXRjLikgKi8KKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgcmVkX21hc2ssIGdyZWVuX21hc2ssIGJsdWVfbWFzazsJLyogbWFzayB2YWx1ZXMgKi8KKwlpbnQgYml0c19wZXJfcmdiOwkvKiBsb2cgYmFzZSAyIG9mIGRpc3RpbmN0IGNvbG9yIHZhbHVlcyAqLworCWludCBtYXBfZW50cmllczsJLyogY29sb3IgbWFwIGVudHJpZXMgKi8KK30gVmlzdWFsOworCisvKgorICogRGVwdGggc3RydWN0dXJlOyBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBwb3NzaWJsZSBkZXB0aC4KKyAqLwkKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgZGVwdGg7CQkvKiB0aGlzIGRlcHRoIChaKSBvZiB0aGUgZGVwdGggKi8KKwlpbnQgbnZpc3VhbHM7CQkvKiBudW1iZXIgb2YgVmlzdWFsIHR5cGVzIGF0IHRoaXMgZGVwdGggKi8KKwlWaXN1YWwgKnZpc3VhbHM7CS8qIGxpc3Qgb2YgdmlzdWFscyBwb3NzaWJsZSBhdCB0aGlzIGRlcHRoICovCit9IERlcHRoOworCisvKgorICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmVlbi4gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUKKyAqIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gIEEgU2NyZWVuIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZQorICogYnkgYXBwbGljYXRpb24gY29kZS4KKyAqLworCitzdHJ1Y3QgX1hEaXNwbGF5OwkJLyogRm9yd2FyZCBkZWNsYXJlIGJlZm9yZSB1c2UgZm9yIEMrKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJc3RydWN0IF9YRGlzcGxheSAqZGlzcGxheTsvKiBiYWNrIHBvaW50ZXIgdG8gZGlzcGxheSBzdHJ1Y3R1cmUgKi8KKwlXaW5kb3cgcm9vdDsJCS8qIFJvb3Qgd2luZG93IGlkLiAqLworCWludCB3aWR0aCwgaGVpZ2h0OwkvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHNjcmVlbiAqLworCWludCBtd2lkdGgsIG1oZWlnaHQ7CS8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgIGluIG1pbGxpbWV0ZXJzICovCisJaW50IG5kZXB0aHM7CQkvKiBudW1iZXIgb2YgZGVwdGhzIHBvc3NpYmxlICovCisJRGVwdGggKmRlcHRoczsJCS8qIGxpc3Qgb2YgYWxsb3dhYmxlIGRlcHRocyBvbiB0aGUgc2NyZWVuICovCisJaW50IHJvb3RfZGVwdGg7CQkvKiBiaXRzIHBlciBwaXhlbCAqLworCVZpc3VhbCAqcm9vdF92aXN1YWw7CS8qIHJvb3QgdmlzdWFsICovCisJR0MgZGVmYXVsdF9nYzsJCS8qIEdDIGZvciB0aGUgcm9vdCByb290IHZpc3VhbCAqLworCUNvbG9ybWFwIGNtYXA7CQkvKiBkZWZhdWx0IGNvbG9yIG1hcCAqLworCXVuc2lnbmVkIGxvbmcgd2hpdGVfcGl4ZWw7CisJdW5zaWduZWQgbG9uZyBibGFja19waXhlbDsJLyogV2hpdGUgYW5kIEJsYWNrIHBpeGVsIHZhbHVlcyAqLworCWludCBtYXhfbWFwcywgbWluX21hcHM7CS8qIG1heCBhbmQgbWluIGNvbG9yIG1hcHMgKi8KKwlpbnQgYmFja2luZ19zdG9yZTsJLyogTmV2ZXIsIFdoZW5NYXBwZWQsIEFsd2F5cyAqLworCUJvb2wgc2F2ZV91bmRlcnM7CQorCWxvbmcgcm9vdF9pbnB1dF9tYXNrOwkvKiBpbml0aWFsIHJvb3QgaW5wdXQgbWFzayAqLworfSBTY3JlZW47CisKKy8qCisgKiBGb3JtYXQgc3RydWN0dXJlOyBkZXNjcmliZXMgWkZvcm1hdCBkYXRhIHRoZSBzY3JlZW4gd2lsbCB1bmRlcnN0YW5kLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJaW50IGRlcHRoOwkJLyogZGVwdGggb2YgdGhpcyBpbWFnZSBmb3JtYXQgKi8KKwlpbnQgYml0c19wZXJfcGl4ZWw7CS8qIGJpdHMvcGl4ZWwgYXQgdGhpcyBkZXB0aCAqLworCWludCBzY2FubGluZV9wYWQ7CS8qIHNjYW5saW5lIG11c3QgcGFkZGVkIHRvIHRoaXMgbXVsdGlwbGUgKi8KK30gU2NyZWVuRm9ybWF0OworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNldHRpbmcgd2luZG93IGF0dHJpYnV0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQaXhtYXAgYmFja2dyb3VuZF9waXhtYXA7CS8qIGJhY2tncm91bmQgb3IgTm9uZSBvciBQYXJlbnRSZWxhdGl2ZSAqLworICAgIHVuc2lnbmVkIGxvbmcgYmFja2dyb3VuZF9waXhlbDsJLyogYmFja2dyb3VuZCBwaXhlbCAqLworICAgIFBpeG1hcCBib3JkZXJfcGl4bWFwOwkvKiBib3JkZXIgb2YgdGhlIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIGxvbmcgYm9yZGVyX3BpeGVsOwkvKiBib3JkZXIgcGl4ZWwgdmFsdWUgKi8KKyAgICBpbnQgYml0X2dyYXZpdHk7CQkvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCisgICAgaW50IHdpbl9ncmF2aXR5OwkJLyogb25lIG9mIHRoZSB3aW5kb3cgZ3Jhdml0eSB2YWx1ZXMgKi8KKyAgICBpbnQgYmFja2luZ19zdG9yZTsJCS8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2V2ZWQgaWYgcG9zc2libGUgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhY2tpbmdfcGl4ZWw7LyogdmFsdWUgdG8gdXNlIGluIHJlc3RvcmluZyBwbGFuZXMgKi8KKyAgICBCb29sIHNhdmVfdW5kZXI7CQkvKiBzaG91bGQgYml0cyB1bmRlciBiZSBzYXZlZD8gKHBvcHVwcykgKi8KKyAgICBsb25nIGV2ZW50X21hc2s7CQkvKiBzZXQgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIHNhdmVkICovCisgICAgbG9uZyBkb19ub3RfcHJvcGFnYXRlX21hc2s7CS8qIHNldCBvZiBldmVudHMgdGhhdCBzaG91bGQgbm90IHByb3BhZ2F0ZSAqLworICAgIEJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7CS8qIGJvb2xlYW4gdmFsdWUgZm9yIG92ZXJyaWRlLXJlZGlyZWN0ICovCisgICAgQ29sb3JtYXAgY29sb3JtYXA7CQkvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLworICAgIEN1cnNvciBjdXJzb3I7CQkvKiBjdXJzb3IgdG8gYmUgZGlzcGxheWVkIChvciBOb25lKSAqLworfSBYU2V0V2luZG93QXR0cmlidXRlczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB4LCB5OwkJCS8qIGxvY2F0aW9uIG9mIHdpbmRvdyAqLworICAgIGludCB3aWR0aCwgaGVpZ2h0OwkJLyogd2lkdGggYW5kIGhlaWdodCBvZiB3aW5kb3cgKi8KKyAgICBpbnQgYm9yZGVyX3dpZHRoOwkJLyogYm9yZGVyIHdpZHRoIG9mIHdpbmRvdyAqLworICAgIGludCBkZXB0aDsgICAgICAgICAgCS8qIGRlcHRoIG9mIHdpbmRvdyAqLworICAgIFZpc3VhbCAqdmlzdWFsOwkJLyogdGhlIGFzc29jaWF0ZWQgdmlzdWFsIHN0cnVjdHVyZSAqLworICAgIFdpbmRvdyByb290OyAgICAgICAgCS8qIHJvb3Qgb2Ygc2NyZWVuIGNvbnRhaW5pbmcgd2luZG93ICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIGludCBjX2NsYXNzOwkJLyogQysrIElucHV0T3V0cHV0LCBJbnB1dE9ubHkqLworI2Vsc2UKKyAgICBpbnQgY2xhc3M7CQkJLyogSW5wdXRPdXRwdXQsIElucHV0T25seSovCisjZW5kaWYKKyAgICBpbnQgYml0X2dyYXZpdHk7CQkvKiBvbmUgb2YgYml0IGdyYXZpdHkgdmFsdWVzICovCisgICAgaW50IHdpbl9ncmF2aXR5OwkJLyogb25lIG9mIHRoZSB3aW5kb3cgZ3Jhdml0eSB2YWx1ZXMgKi8KKyAgICBpbnQgYmFja2luZ19zdG9yZTsJCS8qIE5vdFVzZWZ1bCwgV2hlbk1hcHBlZCwgQWx3YXlzICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BsYW5lczsvKiBwbGFuZXMgdG8gYmUgcHJlc2VydmVkIGlmIHBvc3NpYmxlICovCisgICAgdW5zaWduZWQgbG9uZyBiYWNraW5nX3BpeGVsOy8qIHZhbHVlIHRvIGJlIHVzZWQgd2hlbiByZXN0b3JpbmcgcGxhbmVzICovCisgICAgQm9vbCBzYXZlX3VuZGVyOwkJLyogYm9vbGVhbiwgc2hvdWxkIGJpdHMgdW5kZXIgYmUgc2F2ZWQ/ICovCisgICAgQ29sb3JtYXAgY29sb3JtYXA7CQkvKiBjb2xvciBtYXAgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHdpbmRvdyAqLworICAgIEJvb2wgbWFwX2luc3RhbGxlZDsJCS8qIGJvb2xlYW4sIGlzIGNvbG9yIG1hcCBjdXJyZW50bHkgaW5zdGFsbGVkKi8KKyAgICBpbnQgbWFwX3N0YXRlOwkJLyogSXNVbm1hcHBlZCwgSXNVbnZpZXdhYmxlLCBJc1ZpZXdhYmxlICovCisgICAgbG9uZyBhbGxfZXZlbnRfbWFza3M7CS8qIHNldCBvZiBldmVudHMgYWxsIHBlb3BsZSBoYXZlIGludGVyZXN0IGluKi8KKyAgICBsb25nIHlvdXJfZXZlbnRfbWFzazsJLyogbXkgZXZlbnQgbWFzayAqLworICAgIGxvbmcgZG9fbm90X3Byb3BhZ2F0ZV9tYXNrOyAvKiBzZXQgb2YgZXZlbnRzIHRoYXQgc2hvdWxkIG5vdCBwcm9wYWdhdGUgKi8KKyAgICBCb29sIG92ZXJyaWRlX3JlZGlyZWN0OwkvKiBib29sZWFuIHZhbHVlIGZvciBvdmVycmlkZS1yZWRpcmVjdCAqLworICAgIFNjcmVlbiAqc2NyZWVuOwkJLyogYmFjayBwb2ludGVyIHRvIGNvcnJlY3Qgc2NyZWVuICovCit9IFhXaW5kb3dBdHRyaWJ1dGVzOworCisvKgorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIGhvc3Qgc2V0dGluZzsgZ2V0dGluZyByb3V0aW5lcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmYW1pbHk7CQkvKiBmb3IgZXhhbXBsZSBGYW1pbHlJbnRlcm5ldCAqLworCWludCBsZW5ndGg7CQkvKiBsZW5ndGggb2YgYWRkcmVzcywgaW4gYnl0ZXMgKi8KKwljaGFyICphZGRyZXNzOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSBieXRlcyAqLworfSBYSG9zdEFkZHJlc3M7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgU2VydmVyRmFtaWx5SW50ZXJwcmV0ZWQgYWRkcmVzc2VzIGluIGhvc3Qgcm91dGluZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHR5cGUgc3RyaW5nLCBpbiBieXRlcyAqLworCWludCB2YWx1ZWxlbmd0aDsJLyogbGVuZ3RoIG9mIHZhbHVlIHN0cmluZywgaW4gYnl0ZXMgKi8KKwljaGFyICp0eXBlOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSB0eXBlIHN0cmluZyAqLworCWNoYXIgKnZhbHVlOwkJLyogcG9pbnRlciB0byB3aGVyZSB0byBmaW5kIHRoZSBhZGRyZXNzICovCit9IFhTZXJ2ZXJJbnRlcnByZXRlZEFkZHJlc3M7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBmb3IgImltYWdlIiBkYXRhLCB1c2VkIGJ5IGltYWdlIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1hJbWFnZSB7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CQkvKiBzaXplIG9mIGltYWdlICovCisgICAgaW50IHhvZmZzZXQ7CQkvKiBudW1iZXIgb2YgcGl4ZWxzIG9mZnNldCBpbiBYIGRpcmVjdGlvbiAqLworICAgIGludCBmb3JtYXQ7CQkJLyogWFlCaXRtYXAsIFhZUGl4bWFwLCBaUGl4bWFwICovCisgICAgY2hhciAqZGF0YTsJCQkvKiBwb2ludGVyIHRvIGltYWdlIGRhdGEgKi8KKyAgICBpbnQgYnl0ZV9vcmRlcjsJCS8qIGRhdGEgYnl0ZSBvcmRlciwgTFNCRmlyc3QsIE1TQkZpcnN0ICovCisgICAgaW50IGJpdG1hcF91bml0OwkJLyogcXVhbnQuIG9mIHNjYW5saW5lIDgsIDE2LCAzMiAqLworICAgIGludCBiaXRtYXBfYml0X29yZGVyOwkvKiBMU0JGaXJzdCwgTVNCRmlyc3QgKi8KKyAgICBpbnQgYml0bWFwX3BhZDsJCS8qIDgsIDE2LCAzMiBlaXRoZXIgWFkgb3IgWlBpeG1hcCAqLworICAgIGludCBkZXB0aDsJCQkvKiBkZXB0aCBvZiBpbWFnZSAqLworICAgIGludCBieXRlc19wZXJfbGluZTsJCS8qIGFjY2VsYXJhdG9yIHRvIG5leHQgbGluZSAqLworICAgIGludCBiaXRzX3Blcl9waXhlbDsJCS8qIGJpdHMgcGVyIHBpeGVsIChaUGl4bWFwKSAqLworICAgIHVuc2lnbmVkIGxvbmcgcmVkX21hc2s7CS8qIGJpdHMgaW4geiBhcnJhbmdtZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBncmVlbl9tYXNrOworICAgIHVuc2lnbmVkIGxvbmcgYmx1ZV9tYXNrOworICAgIFhQb2ludGVyIG9iZGF0YTsJCS8qIGhvb2sgZm9yIHRoZSBvYmplY3Qgcm91dGluZXMgdG8gaGFuZyBvbiAqLworICAgIHN0cnVjdCBmdW5jcyB7CQkvKiBpbWFnZSBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KKwlzdHJ1Y3QgX1hJbWFnZSAqKCpjcmVhdGVfaW1hZ2UpKAorCQlzdHJ1Y3QgX1hEaXNwbGF5KiAvKiBkaXNwbGF5ICovLAorCQlWaXN1YWwqCQkvKiB2aXN1YWwgKi8sCisJCXVuc2lnbmVkIGludAkvKiBkZXB0aCAqLywKKwkJaW50CQkvKiBmb3JtYXQgKi8sCisJCWludAkJLyogb2Zmc2V0ICovLAorCQljaGFyKgkJLyogZGF0YSAqLywKKwkJdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorCQl1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorCQlpbnQJCS8qIGJpdG1hcF9wYWQgKi8sCisJCWludAkJLyogYnl0ZXNfcGVyX2xpbmUgKi8pOworCWludCAoKmRlc3Ryb3lfaW1hZ2UpICAgICAgICAoc3RydWN0IF9YSW1hZ2UgKik7CisJdW5zaWduZWQgbG9uZyAoKmdldF9waXhlbCkgIChzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCk7CisJaW50ICgqcHV0X3BpeGVsKSAgICAgICAgICAgIChzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCwgdW5zaWduZWQgbG9uZyk7CisJc3RydWN0IF9YSW1hZ2UgKigqc3ViX2ltYWdlKShzdHJ1Y3QgX1hJbWFnZSAqLCBpbnQsIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCWludCAoKmFkZF9waXhlbCkgICAgICAgICAgICAoc3RydWN0IF9YSW1hZ2UgKiwgbG9uZyk7CisJfSBmOworfSBYSW1hZ2U7CisKKy8qIAorICogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhSZWNvbmZpZ3VyZVdpbmRvdworICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGJvcmRlcl93aWR0aDsKKyAgICBXaW5kb3cgc2libGluZzsKKyAgICBpbnQgc3RhY2tfbW9kZTsKK30gWFdpbmRvd0NoYW5nZXM7CisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IGNvbG9yIG9wZXJhdGlvbnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgcGl4ZWw7CisJdW5zaWduZWQgc2hvcnQgcmVkLCBncmVlbiwgYmx1ZTsKKwljaGFyIGZsYWdzOyAgLyogZG9fcmVkLCBkb19ncmVlbiwgZG9fYmx1ZSAqLworCWNoYXIgcGFkOworfSBYQ29sb3I7CisKKy8qIAorICogRGF0YSBzdHJ1Y3R1cmVzIGZvciBncmFwaGljcyBvcGVyYXRpb25zLiAgT24gbW9zdCBtYWNoaW5lcywgdGhlc2UgYXJlCisgKiBjb25ncnVlbnQgd2l0aCB0aGUgd2lyZSBwcm90b2NvbCBzdHJ1Y3R1cmVzLCBzbyByZWZvcm1hdHRpbmcgdGhlIGRhdGEKKyAqIGNhbiBiZSBhdm9pZGVkIG9uIHRoZXNlIGFyY2hpdGVjdHVyZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4MSwgeTEsIHgyLCB5MjsKK30gWFNlZ21lbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4LCB5OworfSBYUG9pbnQ7CisgICAgCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeCwgeTsKKyAgICB1bnNpZ25lZCBzaG9ydCB3aWR0aCwgaGVpZ2h0OworfSBYUmVjdGFuZ2xlOworICAgIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNob3J0IHgsIHk7CisgICAgdW5zaWduZWQgc2hvcnQgd2lkdGgsIGhlaWdodDsKKyAgICBzaG9ydCBhbmdsZTEsIGFuZ2xlMjsKK30gWEFyYzsKKworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgWENoYW5nZUtleWJvYXJkQ29udHJvbCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCBrZXlfY2xpY2tfcGVyY2VudDsKKyAgICAgICAgaW50IGJlbGxfcGVyY2VudDsKKyAgICAgICAgaW50IGJlbGxfcGl0Y2g7CisgICAgICAgIGludCBiZWxsX2R1cmF0aW9uOworICAgICAgICBpbnQgbGVkOworICAgICAgICBpbnQgbGVkX21vZGU7CisgICAgICAgIGludCBrZXk7CisgICAgICAgIGludCBhdXRvX3JlcGVhdF9tb2RlOyAgIC8qIE9uLCBPZmYsIERlZmF1bHQgKi8KK30gWEtleWJvYXJkQ29udHJvbDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhHZXRLZXlib2FyZENvbnRyb2wgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQga2V5X2NsaWNrX3BlcmNlbnQ7CisJaW50IGJlbGxfcGVyY2VudDsKKwl1bnNpZ25lZCBpbnQgYmVsbF9waXRjaCwgYmVsbF9kdXJhdGlvbjsKKwl1bnNpZ25lZCBsb25nIGxlZF9tYXNrOworCWludCBnbG9iYWxfYXV0b19yZXBlYXQ7CisJY2hhciBhdXRvX3JlcGVhdHNbMzJdOworfSBYS2V5Ym9hcmRTdGF0ZTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIFhHZXRNb3Rpb25FdmVudHMuICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFRpbWUgdGltZTsKKwlzaG9ydCB4LCB5OworfSBYVGltZUNvb3JkOworCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgWHtTZXQsR2V0fU1vZGlmaWVyTWFwcGluZyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgCWludCBtYXhfa2V5cGVybW9kOwkvKiBUaGUgc2VydmVyJ3MgbWF4ICMgb2Yga2V5cyBwZXIgbW9kaWZpZXIgKi8KKyAJS2V5Q29kZSAqbW9kaWZpZXJtYXA7CS8qIEFuIDggYnkgbWF4X2tleXBlcm1vZCBhcnJheSBvZiBtb2RpZmllcnMgKi8KK30gWE1vZGlmaWVyS2V5bWFwOworCisKKy8qCisgKiBEaXNwbGF5IGRhdGF0eXBlIG1haW50YWluaW5nIGRpc3BsYXkgc3BlY2lmaWMgZGF0YS4KKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgorICogQSBEaXNwbGF5IHNob3VsZCBiZSB0cmVhdGVkIGFzIG9wYXF1ZSBieSBhcHBsaWNhdGlvbiBjb2RlLgorICovCisjaWZuZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKK3R5cGVkZWYgc3RydWN0IF9YRGlzcGxheSBEaXNwbGF5OworI2VuZGlmCisKK3N0cnVjdCBfWFByaXZhdGU7CQkvKiBGb3J3YXJkIGRlY2xhcmUgYmVmb3JlIHVzZSBmb3IgQysrICovCitzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWM7CisKK3R5cGVkZWYgc3RydWN0IAorI2lmZGVmIFhMSUJfSUxMRUdBTF9BQ0NFU1MKK19YRGlzcGxheQorI2VuZGlmCit7CisJWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisJc3RydWN0IF9YUHJpdmF0ZSAqcHJpdmF0ZTE7CisJaW50IGZkOwkJCS8qIE5ldHdvcmsgc29ja2V0LiAqLworCWludCBwcml2YXRlMjsKKwlpbnQgcHJvdG9fbWFqb3JfdmVyc2lvbjsvKiBtYWpvciB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KKwlpbnQgcHJvdG9fbWlub3JfdmVyc2lvbjsvKiBtaW5vciB2ZXJzaW9uIG9mIHNlcnZlcnMgWCBwcm90b2NvbCAqLworCWNoYXIgKnZlbmRvcjsJCS8qIHZlbmRvciBvZiB0aGUgc2VydmVyIGhhcmR3YXJlICovCisgICAgICAgIFhJRCBwcml2YXRlMzsKKwlYSUQgcHJpdmF0ZTQ7CisJWElEIHByaXZhdGU1OworCWludCBwcml2YXRlNjsKKwlYSUQgKCpyZXNvdXJjZV9hbGxvYykoCS8qIGFsbG9jYXRvciBmdW5jdGlvbiAqLworCQlzdHJ1Y3QgX1hEaXNwbGF5KgorCSk7CisJaW50IGJ5dGVfb3JkZXI7CQkvKiBzY3JlZW4gYnl0ZSBvcmRlciwgTFNCRmlyc3QsIE1TQkZpcnN0ICovCisJaW50IGJpdG1hcF91bml0OwkvKiBwYWRkaW5nIGFuZCBkYXRhIHJlcXVpcmVtZW50cyAqLworCWludCBiaXRtYXBfcGFkOwkJLyogcGFkZGluZyByZXF1aXJlbWVudHMgb24gYml0bWFwcyAqLworCWludCBiaXRtYXBfYml0X29yZGVyOwkvKiBMZWFzdFNpZ25pZmljYW50IG9yIE1vc3RTaWduaWZpY2FudCAqLworCWludCBuZm9ybWF0czsJCS8qIG51bWJlciBvZiBwaXhtYXAgZm9ybWF0cyBpbiBsaXN0ICovCisJU2NyZWVuRm9ybWF0ICpwaXhtYXBfZm9ybWF0OwkvKiBwaXhtYXAgZm9ybWF0IGxpc3QgKi8KKwlpbnQgcHJpdmF0ZTg7CisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG9mIHRoZSBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgX1hQcml2YXRlICpwcml2YXRlOSwgKnByaXZhdGUxMDsKKwlpbnQgcWxlbjsJCS8qIExlbmd0aCBvZiBpbnB1dCBldmVudCBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9yZXF1ZXN0X3JlYWQ7IC8qIHNlcSBudW1iZXIgb2YgbGFzdCBldmVudCByZWFkICovCisJdW5zaWduZWQgbG9uZyByZXF1ZXN0OwkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgbGFzdCByZXF1ZXN0LiAqLworCVhQb2ludGVyIHByaXZhdGUxMTsKKwlYUG9pbnRlciBwcml2YXRlMTI7CisJWFBvaW50ZXIgcHJpdmF0ZTEzOworCVhQb2ludGVyIHByaXZhdGUxNDsKKwl1bnNpZ25lZCBtYXhfcmVxdWVzdF9zaXplOyAvKiBtYXhpbXVtIG51bWJlciAzMiBiaXQgd29yZHMgaW4gcmVxdWVzdCovCisJc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjICpkYjsKKwlpbnQgKCpwcml2YXRlMTUpKAorCQlzdHJ1Y3QgX1hEaXNwbGF5KgorCQkpOworCWNoYXIgKmRpc3BsYXlfbmFtZTsJLyogImhvc3Q6ZGlzcGxheSIgc3RyaW5nIHVzZWQgb24gdGhpcyBjb25uZWN0Ki8KKwlpbnQgZGVmYXVsdF9zY3JlZW47CS8qIGRlZmF1bHQgc2NyZWVuIGZvciBvcGVyYXRpb25zICovCisJaW50IG5zY3JlZW5zOwkJLyogbnVtYmVyIG9mIHNjcmVlbnMgb24gdGhpcyBzZXJ2ZXIqLworCVNjcmVlbiAqc2NyZWVuczsJLyogcG9pbnRlciB0byBsaXN0IG9mIHNjcmVlbnMgKi8KKwl1bnNpZ25lZCBsb25nIG1vdGlvbl9idWZmZXI7CS8qIHNpemUgb2YgbW90aW9uIGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZTE2OworCWludCBtaW5fa2V5Y29kZTsJLyogbWluaW11bSBkZWZpbmVkIGtleWNvZGUgKi8KKwlpbnQgbWF4X2tleWNvZGU7CS8qIG1heGltdW0gZGVmaW5lZCBrZXljb2RlICovCisJWFBvaW50ZXIgcHJpdmF0ZTE3OworCVhQb2ludGVyIHByaXZhdGUxODsKKwlpbnQgcHJpdmF0ZTE5OworCWNoYXIgKnhkZWZhdWx0czsJLyogY29udGVudHMgb2YgZGVmYXVsdHMgZnJvbSBzZXJ2ZXIgKi8KKwkvKiB0aGVyZSBpcyBtb3JlIHRvIHRoaXMgc3RydWN0dXJlLCBidXQgaXQgaXMgcHJpdmF0ZSB0byBYbGliICovCit9CisjaWZkZWYgWExJQl9JTExFR0FMX0FDQ0VTUworRGlzcGxheSwgCisjZW5kaWYKKypfWFByaXZEaXNwbGF5OworCisjdW5kZWYgX1hFVkVOVF8KKyNpZm5kZWYgX1hFVkVOVF8KKy8qCisgKiBEZWZpbml0aW9ucyBvZiBzcGVjaWZpYyBldmVudHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IGl0IGlzIHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisJV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KKwlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KKwlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KKwlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLworCXVuc2lnbmVkIGludCBrZXljb2RlOwkvKiBkZXRhaWwgKi8KKwlCb29sIHNhbWVfc2NyZWVuOwkvKiBzYW1lIHNjcmVlbiBmbGFnICovCit9IFhLZXlFdmVudDsKK3R5cGVkZWYgWEtleUV2ZW50IFhLZXlQcmVzc2VkRXZlbnQ7Cit0eXBlZGVmIFhLZXlFdmVudCBYS2V5UmVsZWFzZWRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOwkJLyogb2YgZXZlbnQgKi8KKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CSAgICAgICAgLyogImV2ZW50IiB3aW5kb3cgaXQgaXMgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKwlXaW5kb3cgcm9vdDsJICAgICAgICAvKiByb290IHdpbmRvdyB0aGF0IHRoZSBldmVudCBvY2N1cnJlZCBvbiAqLworCVdpbmRvdyBzdWJ3aW5kb3c7CS8qIGNoaWxkIHdpbmRvdyAqLworCVRpbWUgdGltZTsJCS8qIG1pbGxpc2Vjb25kcyAqLworCWludCB4LCB5OwkJLyogcG9pbnRlciB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworCWludCB4X3Jvb3QsIHlfcm9vdDsJLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisJdW5zaWduZWQgaW50IGJ1dHRvbjsJLyogZGV0YWlsICovCisJQm9vbCBzYW1lX3NjcmVlbjsJLyogc2FtZSBzY3JlZW4gZmxhZyAqLworfSBYQnV0dG9uRXZlbnQ7Cit0eXBlZGVmIFhCdXR0b25FdmVudCBYQnV0dG9uUHJlc3NlZEV2ZW50OwordHlwZWRlZiBYQnV0dG9uRXZlbnQgWEJ1dHRvblJlbGVhc2VkRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsJCS8qIG9mIGV2ZW50ICovCisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkgICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisJV2luZG93IHJvb3Q7CSAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJyZWQgb24gKi8KKwlXaW5kb3cgc3Vid2luZG93OwkvKiBjaGlsZCB3aW5kb3cgKi8KKwlUaW1lIHRpbWU7CQkvKiBtaWxsaXNlY29uZHMgKi8KKwlpbnQgeCwgeTsJCS8qIHBvaW50ZXIgeCwgeSBjb29yZGluYXRlcyBpbiBldmVudCB3aW5kb3cgKi8KKwlpbnQgeF9yb290LCB5X3Jvb3Q7CS8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdGU7CS8qIGtleSBvciBidXR0b24gbWFzayAqLworCWNoYXIgaXNfaGludDsJCS8qIGRldGFpbCAqLworCUJvb2wgc2FtZV9zY3JlZW47CS8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KK30gWE1vdGlvbkV2ZW50OwordHlwZWRlZiBYTW90aW9uRXZlbnQgWFBvaW50ZXJNb3ZlZEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CQkvKiBvZiBldmVudCAqLworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsJICAgICAgICAvKiAiZXZlbnQiIHdpbmRvdyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLworCVdpbmRvdyByb290OwkgICAgICAgIC8qIHJvb3Qgd2luZG93IHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIG9uICovCisJV2luZG93IHN1YndpbmRvdzsJLyogY2hpbGQgd2luZG93ICovCisJVGltZSB0aW1lOwkJLyogbWlsbGlzZWNvbmRzICovCisJaW50IHgsIHk7CQkvKiBwb2ludGVyIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisJaW50IHhfcm9vdCwgeV9yb290OwkvKiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byByb290ICovCisJaW50IG1vZGU7CQkvKiBOb3RpZnlOb3JtYWwsIE5vdGlmeUdyYWIsIE5vdGlmeVVuZ3JhYiAqLworCWludCBkZXRhaWw7CisJLyoKKwkgKiBOb3RpZnlBbmNlc3RvciwgTm90aWZ5VmlydHVhbCwgTm90aWZ5SW5mZXJpb3IsIAorCSAqIE5vdGlmeU5vbmxpbmVhcixOb3RpZnlOb25saW5lYXJWaXJ0dWFsCisJICovCisJQm9vbCBzYW1lX3NjcmVlbjsJLyogc2FtZSBzY3JlZW4gZmxhZyAqLworCUJvb2wgZm9jdXM7CQkvKiBib29sZWFuIGZvY3VzICovCisJdW5zaWduZWQgaW50IHN0YXRlOwkvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KK30gWENyb3NzaW5nRXZlbnQ7Cit0eXBlZGVmIFhDcm9zc2luZ0V2ZW50IFhFbnRlcldpbmRvd0V2ZW50OwordHlwZWRlZiBYQ3Jvc3NpbmdFdmVudCBYTGVhdmVXaW5kb3dFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOwkJLyogRm9jdXNJbiBvciBGb2N1c091dCAqLworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsJCS8qIHdpbmRvdyBvZiBldmVudCAqLworCWludCBtb2RlOwkJLyogTm90aWZ5Tm9ybWFsLCBOb3RpZnlXaGlsZUdyYWJiZWQsCisJCQkJICAgTm90aWZ5R3JhYiwgTm90aWZ5VW5ncmFiICovCisJaW50IGRldGFpbDsKKwkvKgorCSAqIE5vdGlmeUFuY2VzdG9yLCBOb3RpZnlWaXJ0dWFsLCBOb3RpZnlJbmZlcmlvciwgCisJICogTm90aWZ5Tm9ubGluZWFyLE5vdGlmeU5vbmxpbmVhclZpcnR1YWwsIE5vdGlmeVBvaW50ZXIsCisJICogTm90aWZ5UG9pbnRlclJvb3QsIE5vdGlmeURldGFpbE5vbmUgCisJICovCit9IFhGb2N1c0NoYW5nZUV2ZW50OwordHlwZWRlZiBYRm9jdXNDaGFuZ2VFdmVudCBYRm9jdXNJbkV2ZW50OwordHlwZWRlZiBYRm9jdXNDaGFuZ2VFdmVudCBYRm9jdXNPdXRFdmVudDsKKworLyogZ2VuZXJhdGVkIG9uIEVudGVyV2luZG93IGFuZCBGb2N1c0luICB3aGVuIEtleU1hcFN0YXRlIHNlbGVjdGVkICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCWNoYXIga2V5X3ZlY3RvclszMl07Cit9IFhLZXltYXBFdmVudDsJCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJaW50IHgsIHk7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGNvdW50OwkJLyogaWYgbm9uLXplcm8sIGF0IGxlYXN0IHRoaXMgbWFueSBtb3JlICovCit9IFhFeHBvc2VFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJRHJhd2FibGUgZHJhd2FibGU7CisJaW50IHgsIHk7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGNvdW50OwkJLyogaWYgbm9uLXplcm8sIGF0IGxlYXN0IHRoaXMgbWFueSBtb3JlICovCisJaW50IG1ham9yX2NvZGU7CQkvKiBjb3JlIGlzIENvcHlBcmVhIG9yIENvcHlQbGFuZSAqLworCWludCBtaW5vcl9jb2RlOwkJLyogbm90IGRlZmluZWQgaW4gdGhlIGNvcmUgKi8KK30gWEdyYXBoaWNzRXhwb3NlRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCURyYXdhYmxlIGRyYXdhYmxlOworCWludCBtYWpvcl9jb2RlOwkJLyogY29yZSBpcyBDb3B5QXJlYSBvciBDb3B5UGxhbmUgKi8KKwlpbnQgbWlub3JfY29kZTsJCS8qIG5vdCBkZWZpbmVkIGluIHRoZSBjb3JlICovCit9IFhOb0V4cG9zZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCWludCBzdGF0ZTsJCS8qIFZpc2liaWxpdHkgc3RhdGUgKi8KK30gWFZpc2liaWxpdHlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHBhcmVudDsJCS8qIHBhcmVudCBvZiB0aGUgd2luZG93ICovCisJV2luZG93IHdpbmRvdzsJCS8qIHdpbmRvdyBpZCBvZiB3aW5kb3cgY3JlYXRlZCAqLworCWludCB4LCB5OwkJLyogd2luZG93IGxvY2F0aW9uICovCisJaW50IHdpZHRoLCBoZWlnaHQ7CS8qIHNpemUgb2Ygd2luZG93ICovCisJaW50IGJvcmRlcl93aWR0aDsJLyogYm9yZGVyIHdpZHRoICovCisJQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsJLyogY3JlYXRpb24gc2hvdWxkIGJlIG92ZXJyaWRkZW4gKi8KK30gWENyZWF0ZVdpbmRvd0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKK30gWERlc3Ryb3lXaW5kb3dFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7CisJQm9vbCBmcm9tX2NvbmZpZ3VyZTsKK30gWFVubWFwRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworCUJvb2wgb3ZlcnJpZGVfcmVkaXJlY3Q7CS8qIGJvb2xlYW4sIGlzIG92ZXJyaWRlIHNldC4uLiAqLworfSBYTWFwRXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBwYXJlbnQ7CisJV2luZG93IHdpbmRvdzsKK30gWE1hcFJlcXVlc3RFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7CisJV2luZG93IHBhcmVudDsKKwlpbnQgeCwgeTsKKwlCb29sIG92ZXJyaWRlX3JlZGlyZWN0OworfSBYUmVwYXJlbnRFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IGV2ZW50OworCVdpbmRvdyB3aW5kb3c7CisJaW50IHgsIHk7CisJaW50IHdpZHRoLCBoZWlnaHQ7CisJaW50IGJvcmRlcl93aWR0aDsKKwlXaW5kb3cgYWJvdmU7CisJQm9vbCBvdmVycmlkZV9yZWRpcmVjdDsKK30gWENvbmZpZ3VyZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgZXZlbnQ7CisJV2luZG93IHdpbmRvdzsKKwlpbnQgeCwgeTsKK30gWEdyYXZpdHlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlpbnQgd2lkdGgsIGhlaWdodDsKK30gWFJlc2l6ZVJlcXVlc3RFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHBhcmVudDsKKwlXaW5kb3cgd2luZG93OworCWludCB4LCB5OworCWludCB3aWR0aCwgaGVpZ2h0OworCWludCBib3JkZXJfd2lkdGg7CisJV2luZG93IGFib3ZlOworCWludCBkZXRhaWw7CQkvKiBBYm92ZSwgQmVsb3csIFRvcElmLCBCb3R0b21JZiwgT3Bwb3NpdGUgKi8KKwl1bnNpZ25lZCBsb25nIHZhbHVlX21hc2s7Cit9IFhDb25maWd1cmVSZXF1ZXN0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyBldmVudDsKKwlXaW5kb3cgd2luZG93OworCWludCBwbGFjZTsJCS8qIFBsYWNlT25Ub3AsIFBsYWNlT25Cb3R0b20gKi8KK30gWENpcmN1bGF0ZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgcGFyZW50OworCVdpbmRvdyB3aW5kb3c7CisJaW50IHBsYWNlOwkJLyogUGxhY2VPblRvcCwgUGxhY2VPbkJvdHRvbSAqLworfSBYQ2lyY3VsYXRlUmVxdWVzdEV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCUF0b20gYXRvbTsKKwlUaW1lIHRpbWU7CisJaW50IHN0YXRlOwkJLyogTmV3VmFsdWUsIERlbGV0ZWQgKi8KK30gWFByb3BlcnR5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CisJQXRvbSBzZWxlY3Rpb247CisJVGltZSB0aW1lOworfSBYU2VsZWN0aW9uQ2xlYXJFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IG93bmVyOworCVdpbmRvdyByZXF1ZXN0b3I7CisJQXRvbSBzZWxlY3Rpb247CisJQXRvbSB0YXJnZXQ7CisJQXRvbSBwcm9wZXJ0eTsKKwlUaW1lIHRpbWU7Cit9IFhTZWxlY3Rpb25SZXF1ZXN0RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworCUJvb2wgc2VuZF9ldmVudDsJLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyByZXF1ZXN0b3I7CisJQXRvbSBzZWxlY3Rpb247CisJQXRvbSB0YXJnZXQ7CisJQXRvbSBwcm9wZXJ0eTsJCS8qIEFUT00gb3IgTm9uZSAqLworCVRpbWUgdGltZTsKK30gWFNlbGVjdGlvbkV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OworCUNvbG9ybWFwIGNvbG9ybWFwOwkvKiBDT0xPUk1BUCBvciBOb25lICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorCUJvb2wgY19uZXc7CQkvKiBDKysgKi8KKyNlbHNlCisJQm9vbCBuZXc7CisjZW5kaWYKKwlpbnQgc3RhdGU7CQkvKiBDb2xvcm1hcEluc3RhbGxlZCwgQ29sb3JtYXBVbmluc3RhbGxlZCAqLworfSBYQ29sb3JtYXBFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisJQm9vbCBzZW5kX2V2ZW50OwkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKwlEaXNwbGF5ICpkaXNwbGF5OwkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisJV2luZG93IHdpbmRvdzsKKwlBdG9tIG1lc3NhZ2VfdHlwZTsKKwlpbnQgZm9ybWF0OworCXVuaW9uIHsKKwkJY2hhciBiWzIwXTsKKwkJc2hvcnQgc1sxMF07CisJCWxvbmcgbFs1XTsKKwkJfSBkYXRhOworfSBYQ2xpZW50TWVzc2FnZUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7CS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKwlXaW5kb3cgd2luZG93OwkJLyogdW51c2VkICovCisJaW50IHJlcXVlc3Q7CQkvKiBvbmUgb2YgTWFwcGluZ01vZGlmaWVyLCBNYXBwaW5nS2V5Ym9hcmQsCisJCQkJICAgTWFwcGluZ1BvaW50ZXIgKi8KKwlpbnQgZmlyc3Rfa2V5Y29kZTsJLyogZmlyc3Qga2V5Y29kZSAqLworCWludCBjb3VudDsJCS8qIGRlZmluZXMgcmFuZ2Ugb2YgY2hhbmdlIHcuIGZpcnN0X2tleWNvZGUqLworfSBYTWFwcGluZ0V2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJRGlzcGxheSAqZGlzcGxheTsJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVhJRCByZXNvdXJjZWlkOwkJLyogcmVzb3VyY2UgaWQgKi8KKwl1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogc2VyaWFsIG51bWJlciBvZiBmYWlsZWQgcmVxdWVzdCAqLworCXVuc2lnbmVkIGNoYXIgZXJyb3JfY29kZTsJLyogZXJyb3IgY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdF9jb2RlOwkvKiBNYWpvciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCisJdW5zaWduZWQgY2hhciBtaW5vcl9jb2RlOwkvKiBNaW5vciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCit9IFhFcnJvckV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKwlCb29sIHNlbmRfZXZlbnQ7CS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworCURpc3BsYXkgKmRpc3BsYXk7LyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworCVdpbmRvdyB3aW5kb3c7CS8qIHdpbmRvdyBvbiB3aGljaCBldmVudCB3YXMgcmVxdWVzdGVkIGluIGV2ZW50IG1hc2sgKi8KK30gWEFueUV2ZW50OworCisvKgorICogdGhpcyB1bmlvbiBpcyBkZWZpbmVkIHNvIFhsaWIgY2FuIGFsd2F5cyB1c2UgdGhlIHNhbWUgc2l6ZWQKKyAqIGV2ZW50IHN0cnVjdHVyZSBpbnRlcm5hbGx5LCB0byBhdm9pZCBtZW1vcnkgZnJhZ21lbnRhdGlvbi4KKyAqLwordHlwZWRlZiB1bmlvbiBfWEV2ZW50IHsKKyAgICAgICAgaW50IHR5cGU7CQkvKiBtdXN0IG5vdCBiZSBjaGFuZ2VkOyBmaXJzdCBlbGVtZW50ICovCisJWEFueUV2ZW50IHhhbnk7CisJWEtleUV2ZW50IHhrZXk7CisJWEJ1dHRvbkV2ZW50IHhidXR0b247CisJWE1vdGlvbkV2ZW50IHhtb3Rpb247CisJWENyb3NzaW5nRXZlbnQgeGNyb3NzaW5nOworCVhGb2N1c0NoYW5nZUV2ZW50IHhmb2N1czsKKwlYRXhwb3NlRXZlbnQgeGV4cG9zZTsKKwlYR3JhcGhpY3NFeHBvc2VFdmVudCB4Z3JhcGhpY3NleHBvc2U7CisJWE5vRXhwb3NlRXZlbnQgeG5vZXhwb3NlOworCVhWaXNpYmlsaXR5RXZlbnQgeHZpc2liaWxpdHk7CisJWENyZWF0ZVdpbmRvd0V2ZW50IHhjcmVhdGV3aW5kb3c7CisJWERlc3Ryb3lXaW5kb3dFdmVudCB4ZGVzdHJveXdpbmRvdzsKKwlYVW5tYXBFdmVudCB4dW5tYXA7CisJWE1hcEV2ZW50IHhtYXA7CisJWE1hcFJlcXVlc3RFdmVudCB4bWFwcmVxdWVzdDsKKwlYUmVwYXJlbnRFdmVudCB4cmVwYXJlbnQ7CisJWENvbmZpZ3VyZUV2ZW50IHhjb25maWd1cmU7CisJWEdyYXZpdHlFdmVudCB4Z3Jhdml0eTsKKwlYUmVzaXplUmVxdWVzdEV2ZW50IHhyZXNpemVyZXF1ZXN0OworCVhDb25maWd1cmVSZXF1ZXN0RXZlbnQgeGNvbmZpZ3VyZXJlcXVlc3Q7CisJWENpcmN1bGF0ZUV2ZW50IHhjaXJjdWxhdGU7CisJWENpcmN1bGF0ZVJlcXVlc3RFdmVudCB4Y2lyY3VsYXRlcmVxdWVzdDsKKwlYUHJvcGVydHlFdmVudCB4cHJvcGVydHk7CisJWFNlbGVjdGlvbkNsZWFyRXZlbnQgeHNlbGVjdGlvbmNsZWFyOworCVhTZWxlY3Rpb25SZXF1ZXN0RXZlbnQgeHNlbGVjdGlvbnJlcXVlc3Q7CisJWFNlbGVjdGlvbkV2ZW50IHhzZWxlY3Rpb247CisJWENvbG9ybWFwRXZlbnQgeGNvbG9ybWFwOworCVhDbGllbnRNZXNzYWdlRXZlbnQgeGNsaWVudDsKKwlYTWFwcGluZ0V2ZW50IHhtYXBwaW5nOworCVhFcnJvckV2ZW50IHhlcnJvcjsKKwlYS2V5bWFwRXZlbnQgeGtleW1hcDsKKwlsb25nIHBhZFsyNF07Cit9IFhFdmVudDsKKyNlbmRpZgorCisjZGVmaW5lIFhBbGxvY0lEKGRweSkgKCgqKChfWFByaXZEaXNwbGF5KWRweSktPnJlc291cmNlX2FsbG9jKSgoZHB5KSkpCisKKy8qCisgKiBwZXIgY2hhcmFjdGVyIGZvbnQgbWV0cmljIGluZm9ybWF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQJbGJlYXJpbmc7CS8qIG9yaWdpbiB0byBsZWZ0IGVkZ2Ugb2YgcmFzdGVyICovCisgICAgc2hvcnQJcmJlYXJpbmc7CS8qIG9yaWdpbiB0byByaWdodCBlZGdlIG9mIHJhc3RlciAqLworICAgIHNob3J0CXdpZHRoOwkJLyogYWR2YW5jZSB0byBuZXh0IGNoYXIncyBvcmlnaW4gKi8KKyAgICBzaG9ydAlhc2NlbnQ7CQkvKiBiYXNlbGluZSB0byB0b3AgZWRnZSBvZiByYXN0ZXIgKi8KKyAgICBzaG9ydAlkZXNjZW50OwkvKiBiYXNlbGluZSB0byBib3R0b20gZWRnZSBvZiByYXN0ZXIgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBhdHRyaWJ1dGVzOwkvKiBwZXIgY2hhciBmbGFncyAobm90IHByZWRlZmluZWQpICovCit9IFhDaGFyU3RydWN0OworCisvKgorICogVG8gYWxsb3cgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHdpdGggZm9udHMsIHRoZXJlIGFyZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMKKyAqIHJldHVybmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQXRvbSBuYW1lOworICAgIHVuc2lnbmVkIGxvbmcgY2FyZDMyOworfSBYRm9udFByb3A7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYRXh0RGF0YQkqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKyAgICBGb250ICAgICAgICBmaWQ7ICAgICAgICAgICAgLyogRm9udCBpZCBmb3IgdGhpcyBmb250ICovCisgICAgdW5zaWduZWQJZGlyZWN0aW9uOwkvKiBoaW50IGFib3V0IGRpcmVjdGlvbiB0aGUgZm9udCBpcyBwYWludGVkICovCisgICAgdW5zaWduZWQJbWluX2NoYXJfb3JfYnl0ZTI7LyogZmlyc3QgY2hhcmFjdGVyICovCisgICAgdW5zaWduZWQJbWF4X2NoYXJfb3JfYnl0ZTI7LyogbGFzdCBjaGFyYWN0ZXIgKi8KKyAgICB1bnNpZ25lZAltaW5fYnl0ZTE7CS8qIGZpcnN0IHJvdyB0aGF0IGV4aXN0cyAqLworICAgIHVuc2lnbmVkCW1heF9ieXRlMTsJLyogbGFzdCByb3cgdGhhdCBleGlzdHMgKi8KKyAgICBCb29sCWFsbF9jaGFyc19leGlzdDsvKiBmbGFnIGlmIGFsbCBjaGFyYWN0ZXJzIGhhdmUgbm9uLXplcm8gc2l6ZSovCisgICAgdW5zaWduZWQJZGVmYXVsdF9jaGFyOwkvKiBjaGFyIHRvIHByaW50IGZvciB1bmRlZmluZWQgY2hhcmFjdGVyICovCisgICAgaW50ICAgICAgICAgbl9wcm9wZXJ0aWVzOyAgIC8qIGhvdyBtYW55IHByb3BlcnRpZXMgdGhlcmUgYXJlICovCisgICAgWEZvbnRQcm9wCSpwcm9wZXJ0aWVzOwkvKiBwb2ludGVyIHRvIGFycmF5IG9mIGFkZGl0aW9uYWwgcHJvcGVydGllcyovCisgICAgWENoYXJTdHJ1Y3QJbWluX2JvdW5kczsJLyogbWluaW11bSBib3VuZHMgb3ZlciBhbGwgZXhpc3RpbmcgY2hhciovCisgICAgWENoYXJTdHJ1Y3QJbWF4X2JvdW5kczsJLyogbWF4aW11bSBib3VuZHMgb3ZlciBhbGwgZXhpc3RpbmcgY2hhciovCisgICAgWENoYXJTdHJ1Y3QJKnBlcl9jaGFyOwkvKiBmaXJzdF9jaGFyIHRvIGxhc3RfY2hhciBpbmZvcm1hdGlvbiAqLworICAgIGludAkJYXNjZW50OwkJLyogbG9nLiBleHRlbnQgYWJvdmUgYmFzZWxpbmUgZm9yIHNwYWNpbmcgKi8KKyAgICBpbnQJCWRlc2NlbnQ7CS8qIGxvZy4gZGVzY2VudCBiZWxvdyBiYXNlbGluZSBmb3Igc3BhY2luZyAqLworfSBYRm9udFN0cnVjdDsKKworLyoKKyAqIFBvbHlUZXh0IHJvdXRpbmVzIHRha2UgdGhlc2UgYXMgYXJndW1lbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqY2hhcnM7CQkvKiBwb2ludGVyIHRvIHN0cmluZyAqLworICAgIGludCBuY2hhcnM7CQkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKyAgICBpbnQgZGVsdGE7CQkJLyogZGVsdGEgYmV0d2VlbiBzdHJpbmdzICovCisgICAgRm9udCBmb250OwkJCS8qIGZvbnQgdG8gcHJpbnQgaXQgaW4sIE5vbmUgZG9uJ3QgY2hhbmdlICovCit9IFhUZXh0SXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogbm9ybWFsIDE2IGJpdCBjaGFyYWN0ZXJzIGFyZSB0d28gYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJ5dGUxOworICAgIHVuc2lnbmVkIGNoYXIgYnl0ZTI7Cit9CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX0FSTV9FQUJJX18pCitfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNlbmRpZgorWENoYXIyYjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWENoYXIyYiAqY2hhcnM7CQkvKiB0d28gYnl0ZSBjaGFyYWN0ZXJzICovCisgICAgaW50IG5jaGFyczsJCQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyAqLworICAgIGludCBkZWx0YTsJCQkvKiBkZWx0YSBiZXR3ZWVuIHN0cmluZ3MgKi8KKyAgICBGb250IGZvbnQ7CQkJLyogZm9udCB0byBwcmludCBpdCBpbiwgTm9uZSBkb24ndCBjaGFuZ2UgKi8KK30gWFRleHRJdGVtMTY7CisKKwordHlwZWRlZiB1bmlvbiB7IERpc3BsYXkgKmRpc3BsYXk7CisJCUdDIGdjOworCQlWaXN1YWwgKnZpc3VhbDsKKwkJU2NyZWVuICpzY3JlZW47CisJCVNjcmVlbkZvcm1hdCAqcGl4bWFwX2Zvcm1hdDsKKwkJWEZvbnRTdHJ1Y3QgKmZvbnQ7IH0gWEVEYXRhT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFJlY3RhbmdsZSAgICAgIG1heF9pbmtfZXh0ZW50OworICAgIFhSZWN0YW5nbGUgICAgICBtYXhfbG9naWNhbF9leHRlbnQ7Cit9IFhGb250U2V0RXh0ZW50czsKKworLyogdW51c2VkOgordHlwZWRlZiB2b2lkICgqWE9NUHJvYykoKTsKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfWE9NICpYT007Cit0eXBlZGVmIHN0cnVjdCBfWE9DICpYT0MsICpYRm9udFNldDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgICAgICAgICpjaGFyczsKKyAgICBpbnQgICAgICAgICAgICAgbmNoYXJzOworICAgIGludCAgICAgICAgICAgICBkZWx0YTsKKyAgICBYRm9udFNldCAgICAgICAgZm9udF9zZXQ7Cit9IFhtYlRleHRJdGVtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgd2NoYXJfdCAgICAgICAgKmNoYXJzOworICAgIGludCAgICAgICAgICAgICBuY2hhcnM7CisgICAgaW50ICAgICAgICAgICAgIGRlbHRhOworICAgIFhGb250U2V0ICAgICAgICBmb250X3NldDsKK30gWHdjVGV4dEl0ZW07CisKKyNkZWZpbmUgWE5SZXF1aXJlZENoYXJTZXQgInJlcXVpcmVkQ2hhclNldCIKKyNkZWZpbmUgWE5RdWVyeU9yaWVudGF0aW9uICJxdWVyeU9yaWVudGF0aW9uIgorI2RlZmluZSBYTkJhc2VGb250TmFtZSAiYmFzZUZvbnROYW1lIgorI2RlZmluZSBYTk9NQXV0b21hdGljICJvbUF1dG9tYXRpYyIKKyNkZWZpbmUgWE5NaXNzaW5nQ2hhclNldCAibWlzc2luZ0NoYXJTZXQiCisjZGVmaW5lIFhORGVmYXVsdFN0cmluZyAiZGVmYXVsdFN0cmluZyIKKyNkZWZpbmUgWE5PcmllbnRhdGlvbiAib3JpZW50YXRpb24iCisjZGVmaW5lIFhORGlyZWN0aW9uYWxEZXBlbmRlbnREcmF3aW5nICJkaXJlY3Rpb25hbERlcGVuZGVudERyYXdpbmciCisjZGVmaW5lIFhOQ29udGV4dHVhbERyYXdpbmcgImNvbnRleHR1YWxEcmF3aW5nIgorI2RlZmluZSBYTkZvbnRJbmZvICJmb250SW5mbyIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjaGFyc2V0X2NvdW50OworICAgIGNoYXIgKipjaGFyc2V0X2xpc3Q7Cit9IFhPTUNoYXJTZXRMaXN0OworCit0eXBlZGVmIGVudW0geworICAgIFhPTU9yaWVudGF0aW9uX0xUUl9UVEIsCisgICAgWE9NT3JpZW50YXRpb25fUlRMX1RUQiwKKyAgICBYT01PcmllbnRhdGlvbl9UVEJfTFRSLAorICAgIFhPTU9yaWVudGF0aW9uX1RUQl9SVEwsCisgICAgWE9NT3JpZW50YXRpb25fQ29udGV4dAorfSBYT3JpZW50YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbnVtX29yaWVudGF0aW9uOworICAgIFhPcmllbnRhdGlvbiAqb3JpZW50YXRpb247CS8qIElucHV0IFRleHQgZGVzY3JpcHRpb24gKi8KK30gWE9NT3JpZW50YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbnVtX2ZvbnQ7CisgICAgWEZvbnRTdHJ1Y3QgKipmb250X3N0cnVjdF9saXN0OworICAgIGNoYXIgKipmb250X25hbWVfbGlzdDsKK30gWE9NRm9udEluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YSU0gKlhJTTsKK3R5cGVkZWYgc3RydWN0IF9YSUMgKlhJQzsKKwordHlwZWRlZiB2b2lkICgqWElNUHJvYykoCisgICAgWElNLAorICAgIFhQb2ludGVyLAorICAgIFhQb2ludGVyCispOworCit0eXBlZGVmIEJvb2wgKCpYSUNQcm9jKSgKKyAgICBYSUMsCisgICAgWFBvaW50ZXIsCisgICAgWFBvaW50ZXIKKyk7CisKK3R5cGVkZWYgdm9pZCAoKlhJRFByb2MpKAorICAgIERpc3BsYXkqLAorICAgIFhQb2ludGVyLAorICAgIFhQb2ludGVyCispOworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWElNU3R5bGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudF9zdHlsZXM7CisgICAgWElNU3R5bGUgKnN1cHBvcnRlZF9zdHlsZXM7Cit9IFhJTVN0eWxlczsKKworI2RlZmluZSBYSU1QcmVlZGl0QXJlYQkJMHgwMDAxTAorI2RlZmluZSBYSU1QcmVlZGl0Q2FsbGJhY2tzCTB4MDAwMkwKKyNkZWZpbmUgWElNUHJlZWRpdFBvc2l0aW9uCTB4MDAwNEwKKyNkZWZpbmUgWElNUHJlZWRpdE5vdGhpbmcJMHgwMDA4TAorI2RlZmluZSBYSU1QcmVlZGl0Tm9uZQkJMHgwMDEwTAorI2RlZmluZSBYSU1TdGF0dXNBcmVhCQkweDAxMDBMCisjZGVmaW5lIFhJTVN0YXR1c0NhbGxiYWNrcwkweDAyMDBMCisjZGVmaW5lIFhJTVN0YXR1c05vdGhpbmcJMHgwNDAwTAorI2RlZmluZSBYSU1TdGF0dXNOb25lCQkweDA4MDBMCisKKyNkZWZpbmUgWE5WYU5lc3RlZExpc3QgIlhOVmFOZXN0ZWRMaXN0IgorI2RlZmluZSBYTlF1ZXJ5SW5wdXRTdHlsZSAicXVlcnlJbnB1dFN0eWxlIgorI2RlZmluZSBYTkNsaWVudFdpbmRvdyAiY2xpZW50V2luZG93IgorI2RlZmluZSBYTklucHV0U3R5bGUgImlucHV0U3R5bGUiCisjZGVmaW5lIFhORm9jdXNXaW5kb3cgImZvY3VzV2luZG93IgorI2RlZmluZSBYTlJlc291cmNlTmFtZSAicmVzb3VyY2VOYW1lIgorI2RlZmluZSBYTlJlc291cmNlQ2xhc3MgInJlc291cmNlQ2xhc3MiCisjZGVmaW5lIFhOR2VvbWV0cnlDYWxsYmFjayAiZ2VvbWV0cnlDYWxsYmFjayIKKyNkZWZpbmUgWE5EZXN0cm95Q2FsbGJhY2sgImRlc3Ryb3lDYWxsYmFjayIKKyNkZWZpbmUgWE5GaWx0ZXJFdmVudHMgImZpbHRlckV2ZW50cyIKKyNkZWZpbmUgWE5QcmVlZGl0U3RhcnRDYWxsYmFjayAicHJlZWRpdFN0YXJ0Q2FsbGJhY2siCisjZGVmaW5lIFhOUHJlZWRpdERvbmVDYWxsYmFjayAicHJlZWRpdERvbmVDYWxsYmFjayIKKyNkZWZpbmUgWE5QcmVlZGl0RHJhd0NhbGxiYWNrICJwcmVlZGl0RHJhd0NhbGxiYWNrIgorI2RlZmluZSBYTlByZWVkaXRDYXJldENhbGxiYWNrICJwcmVlZGl0Q2FyZXRDYWxsYmFjayIKKyNkZWZpbmUgWE5QcmVlZGl0U3RhdGVOb3RpZnlDYWxsYmFjayAicHJlZWRpdFN0YXRlTm90aWZ5Q2FsbGJhY2siCisjZGVmaW5lIFhOUHJlZWRpdEF0dHJpYnV0ZXMgInByZWVkaXRBdHRyaWJ1dGVzIgorI2RlZmluZSBYTlN0YXR1c1N0YXJ0Q2FsbGJhY2sgInN0YXR1c1N0YXJ0Q2FsbGJhY2siCisjZGVmaW5lIFhOU3RhdHVzRG9uZUNhbGxiYWNrICJzdGF0dXNEb25lQ2FsbGJhY2siCisjZGVmaW5lIFhOU3RhdHVzRHJhd0NhbGxiYWNrICJzdGF0dXNEcmF3Q2FsbGJhY2siCisjZGVmaW5lIFhOU3RhdHVzQXR0cmlidXRlcyAic3RhdHVzQXR0cmlidXRlcyIKKyNkZWZpbmUgWE5BcmVhICJhcmVhIgorI2RlZmluZSBYTkFyZWFOZWVkZWQgImFyZWFOZWVkZWQiCisjZGVmaW5lIFhOU3BvdExvY2F0aW9uICJzcG90TG9jYXRpb24iCisjZGVmaW5lIFhOQ29sb3JtYXAgImNvbG9yTWFwIgorI2RlZmluZSBYTlN0ZENvbG9ybWFwICJzdGRDb2xvck1hcCIKKyNkZWZpbmUgWE5Gb3JlZ3JvdW5kICJmb3JlZ3JvdW5kIgorI2RlZmluZSBYTkJhY2tncm91bmQgImJhY2tncm91bmQiCisjZGVmaW5lIFhOQmFja2dyb3VuZFBpeG1hcCAiYmFja2dyb3VuZFBpeG1hcCIKKyNkZWZpbmUgWE5Gb250U2V0ICJmb250U2V0IgorI2RlZmluZSBYTkxpbmVTcGFjZSAibGluZVNwYWNlIgorI2RlZmluZSBYTkN1cnNvciAiY3Vyc29yIgorCisjZGVmaW5lIFhOUXVlcnlJTVZhbHVlc0xpc3QgInF1ZXJ5SU1WYWx1ZXNMaXN0IgorI2RlZmluZSBYTlF1ZXJ5SUNWYWx1ZXNMaXN0ICJxdWVyeUlDVmFsdWVzTGlzdCIKKyNkZWZpbmUgWE5WaXNpYmxlUG9zaXRpb24gInZpc2libGVQb3NpdGlvbiIKKyNkZWZpbmUgWE5SNlByZWVkaXRDYWxsYmFjayAicjZQcmVlZGl0Q2FsbGJhY2siCisjZGVmaW5lIFhOU3RyaW5nQ29udmVyc2lvbkNhbGxiYWNrICJzdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2siCisjZGVmaW5lIFhOU3RyaW5nQ29udmVyc2lvbiAic3RyaW5nQ29udmVyc2lvbiIKKyNkZWZpbmUgWE5SZXNldFN0YXRlICJyZXNldFN0YXRlIgorI2RlZmluZSBYTkhvdEtleSAiaG90S2V5IgorI2RlZmluZSBYTkhvdEtleVN0YXRlICJob3RLZXlTdGF0ZSIKKyNkZWZpbmUgWE5QcmVlZGl0U3RhdGUgInByZWVkaXRTdGF0ZSIKKyNkZWZpbmUgWE5TZXBhcmF0b3JvZk5lc3RlZExpc3QgInNlcGFyYXRvcm9mTmVzdGVkTGlzdCIKKworI2RlZmluZSBYQnVmZmVyT3ZlcmZsb3cJCS0xCisjZGVmaW5lIFhMb29rdXBOb25lCQkxCisjZGVmaW5lIFhMb29rdXBDaGFycwkJMgorI2RlZmluZSBYTG9va3VwS2V5U3ltCQkzCisjZGVmaW5lIFhMb29rdXBCb3RoCQk0CisKK3R5cGVkZWYgdm9pZCAqWFZhTmVzdGVkTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhQb2ludGVyIGNsaWVudF9kYXRhOworICAgIFhJTVByb2MgY2FsbGJhY2s7Cit9IFhJTUNhbGxiYWNrOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFBvaW50ZXIgY2xpZW50X2RhdGE7CisgICAgWElDUHJvYyBjYWxsYmFjazsKK30gWElDQ2FsbGJhY2s7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBYSU1GZWVkYmFjazsKKworI2RlZmluZSBYSU1SZXZlcnNlCQkxTAorI2RlZmluZSBYSU1VbmRlcmxpbmUJCSgxTDw8MSkgCisjZGVmaW5lIFhJTUhpZ2hsaWdodAkJKDFMPDwyKQorI2RlZmluZSBYSU1QcmltYXJ5CSAJKDFMPDw1KQorI2RlZmluZSBYSU1TZWNvbmRhcnkJCSgxTDw8NikKKyNkZWZpbmUgWElNVGVydGlhcnkJIAkoMUw8PDcpCisjZGVmaW5lIFhJTVZpc2libGVUb0ZvcndhcmQgCSgxTDw8OCkKKyNkZWZpbmUgWElNVmlzaWJsZVRvQmFja3dvcmQgCSgxTDw8OSkKKyNkZWZpbmUgWElNVmlzaWJsZVRvQ2VudGVyIAkoMUw8PDEwKQorCit0eXBlZGVmIHN0cnVjdCBfWElNVGV4dCB7CisgICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworICAgIFhJTUZlZWRiYWNrICpmZWVkYmFjazsKKyAgICBCb29sIGVuY29kaW5nX2lzX3djaGFyOyAKKyAgICB1bmlvbiB7CisJY2hhciAqbXVsdGlfYnl0ZTsKKwl3Y2hhcl90ICp3aWRlX2NoYXI7CisgICAgfSBzdHJpbmc7IAorfSBYSU1UZXh0OworCit0eXBlZGVmCXVuc2lnbmVkIGxvbmcJIFhJTVByZWVkaXRTdGF0ZTsKKworI2RlZmluZQlYSU1QcmVlZGl0VW5Lbm93bgkwTAorI2RlZmluZQlYSU1QcmVlZGl0RW5hYmxlCTFMCisjZGVmaW5lCVhJTVByZWVkaXREaXNhYmxlCSgxTDw8MSkKKwordHlwZWRlZglzdHJ1Y3QJX1hJTVByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrU3RydWN0IHsKKyAgICBYSU1QcmVlZGl0U3RhdGUgc3RhdGU7Cit9IFhJTVByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrU3RydWN0OworCit0eXBlZGVmCXVuc2lnbmVkIGxvbmcJIFhJTVJlc2V0U3RhdGU7CisKKyNkZWZpbmUJWElNSW5pdGlhbFN0YXRlCQkxTAorI2RlZmluZQlYSU1QcmVzZXJ2ZVN0YXRlCSgxTDw8MSkKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhJTVN0cmluZ0NvbnZlcnNpb25GZWVkYmFjazsKKworI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uTGVmdEVkZ2UJKDB4MDAwMDAwMDEpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25SaWdodEVkZ2UJKDB4MDAwMDAwMDIpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25Ub3BFZGdlCSgweDAwMDAwMDA0KQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uQm90dG9tRWRnZQkoMHgwMDAwMDAwOCkKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkNvbmNlYWxlZAkoMHgwMDAwMDAxMCkKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbldyYXBwZWQJKDB4MDAwMDAwMjApCisKK3R5cGVkZWYgc3RydWN0IF9YSU1TdHJpbmdDb252ZXJzaW9uVGV4dCB7CisgICAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworICAgIFhJTVN0cmluZ0NvbnZlcnNpb25GZWVkYmFjayAqZmVlZGJhY2s7CisgICAgQm9vbCBlbmNvZGluZ19pc193Y2hhcjsgCisgICAgdW5pb24geworCWNoYXIgKm1iczsKKwl3Y2hhcl90ICp3Y3M7CisgICAgfSBzdHJpbmc7IAorfSBYSU1TdHJpbmdDb252ZXJzaW9uVGV4dDsKKwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydAlYSU1TdHJpbmdDb252ZXJzaW9uUG9zaXRpb247CisKK3R5cGVkZWYJdW5zaWduZWQgc2hvcnQJWElNU3RyaW5nQ29udmVyc2lvblR5cGU7CisKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbkJ1ZmZlcgkoMHgwMDAxKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uTGluZQkJKDB4MDAwMikKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvbldvcmQJCSgweDAwMDMpCisjZGVmaW5lCVhJTVN0cmluZ0NvbnZlcnNpb25DaGFyCQkoMHgwMDA0KQorCit0eXBlZGVmCXVuc2lnbmVkIHNob3J0CVhJTVN0cmluZ0NvbnZlcnNpb25PcGVyYXRpb247CisKKyNkZWZpbmUJWElNU3RyaW5nQ29udmVyc2lvblN1YnN0aXR1dGlvbgkoMHgwMDAxKQorI2RlZmluZQlYSU1TdHJpbmdDb252ZXJzaW9uUmV0cmlldmFsCSgweDAwMDIpCisKK3R5cGVkZWYgZW51bSB7CisgICAgWElNRm9yd2FyZENoYXIsIFhJTUJhY2t3YXJkQ2hhciwKKyAgICBYSU1Gb3J3YXJkV29yZCwgWElNQmFja3dhcmRXb3JkLAorICAgIFhJTUNhcmV0VXAsIFhJTUNhcmV0RG93biwKKyAgICBYSU1OZXh0TGluZSwgWElNUHJldmlvdXNMaW5lLAorICAgIFhJTUxpbmVTdGFydCwgWElNTGluZUVuZCwgCisgICAgWElNQWJzb2x1dGVQb3NpdGlvbiwKKyAgICBYSU1Eb250Q2hhbmdlCit9IFhJTUNhcmV0RGlyZWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBfWElNU3RyaW5nQ29udmVyc2lvbkNhbGxiYWNrU3RydWN0IHsKKyAgICBYSU1TdHJpbmdDb252ZXJzaW9uUG9zaXRpb24gcG9zaXRpb247CisgICAgWElNQ2FyZXREaXJlY3Rpb24gZGlyZWN0aW9uOworICAgIFhJTVN0cmluZ0NvbnZlcnNpb25PcGVyYXRpb24gb3BlcmF0aW9uOworICAgIHVuc2lnbmVkIHNob3J0IGZhY3RvcjsKKyAgICBYSU1TdHJpbmdDb252ZXJzaW9uVGV4dCAqdGV4dDsKK30gWElNU3RyaW5nQ29udmVyc2lvbkNhbGxiYWNrU3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfWElNUHJlZWRpdERyYXdDYWxsYmFja1N0cnVjdCB7CisgICAgaW50IGNhcmV0OwkJLyogQ3Vyc29yIG9mZnNldCB3aXRoaW4gcHJlLWVkaXQgc3RyaW5nICovCisgICAgaW50IGNoZ19maXJzdDsJLyogU3RhcnRpbmcgY2hhbmdlIHBvc2l0aW9uICovCisgICAgaW50IGNoZ19sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgY2hhbmdlIGluIGNoYXJhY3RlciBjb3VudCAqLworICAgIFhJTVRleHQgKnRleHQ7Cit9IFhJTVByZWVkaXREcmF3Q2FsbGJhY2tTdHJ1Y3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgWElNSXNJbnZpc2libGUsCS8qIERpc2FibGUgY2FyZXQgZmVlZGJhY2sgKi8gCisgICAgWElNSXNQcmltYXJ5LAkvKiBVSSBkZWZpbmVkIGNhcmV0IGZlZWRiYWNrICovCisgICAgWElNSXNTZWNvbmRhcnkJLyogVUkgZGVmaW5lZCBjYXJldCBmZWVkYmFjayAqLworfSBYSU1DYXJldFN0eWxlOworCit0eXBlZGVmIHN0cnVjdCBfWElNUHJlZWRpdENhcmV0Q2FsbGJhY2tTdHJ1Y3QgeworICAgIGludCBwb3NpdGlvbjsJCSAvKiBDYXJldCBvZmZzZXQgd2l0aGluIHByZS1lZGl0IHN0cmluZyAqLworICAgIFhJTUNhcmV0RGlyZWN0aW9uIGRpcmVjdGlvbjsgLyogQ2FyZXQgbW92ZXMgZGlyZWN0aW9uICovCisgICAgWElNQ2FyZXRTdHlsZSBzdHlsZTsJIC8qIEZlZWRiYWNrIG9mIHRoZSBjYXJldCAqLworfSBYSU1QcmVlZGl0Q2FyZXRDYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYSU1UZXh0VHlwZSwKKyAgICBYSU1CaXRtYXBUeXBlCit9IFhJTVN0YXR1c0RhdGFUeXBlOworCQordHlwZWRlZiBzdHJ1Y3QgX1hJTVN0YXR1c0RyYXdDYWxsYmFja1N0cnVjdCB7CisgICAgWElNU3RhdHVzRGF0YVR5cGUgdHlwZTsKKyAgICB1bmlvbiB7CisJWElNVGV4dCAqdGV4dDsKKwlQaXhtYXAgIGJpdG1hcDsKKyAgICB9IGRhdGE7Cit9IFhJTVN0YXR1c0RyYXdDYWxsYmFja1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1hJTUhvdEtleVRyaWdnZXIgeworICAgIEtleVN5bQkga2V5c3ltOworICAgIGludAkJIG1vZGlmaWVyOworICAgIGludAkJIG1vZGlmaWVyX21hc2s7Cit9IFhJTUhvdEtleVRyaWdnZXI7CisKK3R5cGVkZWYgc3RydWN0IF9YSU1Ib3RLZXlUcmlnZ2VycyB7CisgICAgaW50CQkJIG51bV9ob3Rfa2V5OworICAgIFhJTUhvdEtleVRyaWdnZXIJKmtleTsKK30gWElNSG90S2V5VHJpZ2dlcnM7CisKK3R5cGVkZWYJdW5zaWduZWQgbG9uZwkgWElNSG90S2V5U3RhdGU7CisKKyNkZWZpbmUJWElNSG90S2V5U3RhdGVPTgkoMHgwMDAxTCkKKyNkZWZpbmUJWElNSG90S2V5U3RhdGVPRkYJKDB4MDAwMkwpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudF92YWx1ZXM7CisgICAgY2hhciAqKnN1cHBvcnRlZF92YWx1ZXM7Cit9IFhJTVZhbHVlc0xpc3Q7CisKK19YRlVOQ1BST1RPQkVHSU4KKworI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9YTElCSU5UXykKKyNkZWZpbmUgX1hkZWJ1ZyAoKl9YZGVidWdfcCkKKyNlbmRpZgorCitleHRlcm4gaW50IF9YZGVidWc7CisKK2V4dGVybiBYRm9udFN0cnVjdCAqWExvYWRRdWVyeUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovCispOworCitleHRlcm4gWEZvbnRTdHJ1Y3QgKlhRdWVyeUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogZm9udF9JRCAqLworKTsKKworCitleHRlcm4gWFRpbWVDb29yZCAqWEdldE1vdGlvbkV2ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgVGltZQkJLyogc3RhcnQgKi8sCisgICAgVGltZQkJLyogc3RvcCAqLywKKyAgICBpbnQqCQkvKiBuZXZlbnRzX3JldHVybiAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcCAqWERlbGV0ZU1vZGlmaWVybWFwRW50cnkoCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGVfZW50cnkgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGtleWNvZGVfZW50cnkgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBtb2RpZmllciAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcAkqWEdldE1vZGlmaWVyTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIFhNb2RpZmllcktleW1hcAkqWEluc2VydE1vZGlmaWVybWFwRW50cnkoCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGVfZW50cnkgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGtleWNvZGVfZW50cnkgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBtb2RpZmllciAqLyAgICAKKyk7CisKK2V4dGVybiBYTW9kaWZpZXJLZXltYXAgKlhOZXdNb2RpZmllcm1hcCgKKyAgICBpbnQJCQkvKiBtYXhfa2V5c19wZXJfbW9kICovCispOworCitleHRlcm4gWEltYWdlICpYQ3JlYXRlSW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovLAorICAgIHVuc2lnbmVkIGludAkvKiBkZXB0aCAqLywKKyAgICBpbnQJCQkvKiBmb3JtYXQgKi8sCisgICAgaW50CQkJLyogb2Zmc2V0ICovLAorICAgIGNoYXIqCQkvKiBkYXRhICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIGludAkJCS8qIGJpdG1hcF9wYWQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfcGVyX2xpbmUgKi8KKyk7CitleHRlcm4gU3RhdHVzIFhJbml0SW1hZ2UoCisgICAgWEltYWdlKgkJLyogaW1hZ2UgKi8KKyk7CitleHRlcm4gWEltYWdlICpYR2V0SW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVfbWFzayAqLywKKyAgICBpbnQJCQkvKiBmb3JtYXQgKi8KKyk7CitleHRlcm4gWEltYWdlICpYR2V0U3ViSW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVfbWFzayAqLywKKyAgICBpbnQJCQkvKiBmb3JtYXQgKi8sCisgICAgWEltYWdlKgkJLyogZGVzdF9pbWFnZSAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3ggKi8sCisgICAgaW50CQkJLyogZGVzdF95ICovCispOworCisvKiAKKyAqIFggZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICovCitleHRlcm4gRGlzcGxheSAqWE9wZW5EaXNwbGF5KAorICAgIF9YY29uc3QgY2hhcioJLyogZGlzcGxheV9uYW1lICovCispOworCitleHRlcm4gdm9pZCBYcm1Jbml0aWFsaXplKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBjaGFyICpYRmV0Y2hCeXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuYnl0ZXNfcmV0dXJuICovCispOworZXh0ZXJuIGNoYXIgKlhGZXRjaEJ1ZmZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuYnl0ZXNfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ1ZmZlciAqLworKTsKK2V4dGVybiBjaGFyICpYR2V0QXRvbU5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQXRvbQkJLyogYXRvbSAqLworKTsKK2V4dGVybiBTdGF0dXMgWEdldEF0b21OYW1lcygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIEF0b20qCQkvKiBhdG9tcyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBjaGFyKioJCS8qIG5hbWVzX3JldHVybiAqLworKTsKK2V4dGVybiBjaGFyICpYR2V0RGVmYXVsdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHByb2dyYW0gKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBvcHRpb24gKi8JCSAgCispOworZXh0ZXJuIGNoYXIgKlhEaXNwbGF5TmFtZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLworKTsKK2V4dGVybiBjaGFyICpYS2V5c3ltVG9TdHJpbmcoCisgICAgS2V5U3ltCQkvKiBrZXlzeW0gKi8KKyk7CisKK2V4dGVybiBpbnQgKCpYU3luY2hyb25pemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQm9vbAkJLyogb25vZmYgKi8KKykpKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGludCAoKlhTZXRBZnRlckZ1bmN0aW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludCAoKikgKAorCSAgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLworICAgICAgICAgICAgKQkJLyogcHJvY2VkdXJlICovCispKSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBBdG9tIFhJbnRlcm5BdG9tKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogYXRvbV9uYW1lICovLAorICAgIEJvb2wJCS8qIG9ubHlfaWZfZXhpc3RzICovCQkgCispOworZXh0ZXJuIFN0YXR1cyBYSW50ZXJuQXRvbXMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBjaGFyKioJCS8qIG5hbWVzICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIG9ubHlJZkV4aXN0cyAqLywKKyAgICBBdG9tKgkJLyogYXRvbXNfcmV0dXJuICovCispOworZXh0ZXJuIENvbG9ybWFwIFhDb3B5Q29sb3JtYXBBbmRGcmVlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKK2V4dGVybiBDb2xvcm1hcCBYQ3JlYXRlQ29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICBpbnQJCQkvKiBhbGxvYyAqLwkJCSAKKyk7CitleHRlcm4gQ3Vyc29yIFhDcmVhdGVQaXhtYXBDdXJzb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgUGl4bWFwCQkvKiBzb3VyY2UgKi8sCisgICAgUGl4bWFwCQkvKiBtYXNrICovLAorICAgIFhDb2xvcioJCS8qIGZvcmVncm91bmRfY29sb3IgKi8sCisgICAgWENvbG9yKgkJLyogYmFja2dyb3VuZF9jb2xvciAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogeCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogeSAqLwkJCSAgIAorKTsKK2V4dGVybiBDdXJzb3IgWENyZWF0ZUdseXBoQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEZvbnQJCS8qIHNvdXJjZV9mb250ICovLAorICAgIEZvbnQJCS8qIG1hc2tfZm9udCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogc291cmNlX2NoYXIgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1hc2tfY2hhciAqLywKKyAgICBYQ29sb3IgX1hjb25zdCAqCS8qIGZvcmVncm91bmRfY29sb3IgKi8sCisgICAgWENvbG9yIF9YY29uc3QgKgkvKiBiYWNrZ3JvdW5kX2NvbG9yICovCispOworZXh0ZXJuIEN1cnNvciBYQ3JlYXRlRm9udEN1cnNvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogc2hhcGUgKi8KKyk7CitleHRlcm4gRm9udCBYTG9hZEZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovCispOworZXh0ZXJuIEdDIFhDcmVhdGVHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKKyAgICBYR0NWYWx1ZXMqCQkvKiB2YWx1ZXMgKi8KKyk7CitleHRlcm4gR0NvbnRleHQgWEdDb250ZXh0RnJvbUdDKAorICAgIEdDCQkJLyogZ2MgKi8KKyk7CitleHRlcm4gdm9pZCBYRmx1c2hHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovCispOworZXh0ZXJuIFBpeG1hcCBYQ3JlYXRlUGl4bWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBkZXB0aCAqLwkJICAgICAgICAKKyk7CitleHRlcm4gUGl4bWFwIFhDcmVhdGVCaXRtYXBGcm9tRGF0YSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CitleHRlcm4gUGl4bWFwIFhDcmVhdGVQaXhtYXBGcm9tQml0bWFwRGF0YSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBjaGFyKgkJLyogZGF0YSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGZnICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmcgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovCispOworZXh0ZXJuIFdpbmRvdyBYQ3JlYXRlU2ltcGxlV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogcGFyZW50ICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogYm9yZGVyX3dpZHRoICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYm9yZGVyICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmFja2dyb3VuZCAqLworKTsKK2V4dGVybiBXaW5kb3cgWEdldFNlbGVjdGlvbk93bmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEF0b20JCS8qIHNlbGVjdGlvbiAqLworKTsKK2V4dGVybiBXaW5kb3cgWENyZWF0ZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHBhcmVudCAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJvcmRlcl93aWR0aCAqLywKKyAgICBpbnQJCQkvKiBkZXB0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogY2xhc3MgKi8sCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKgkvKiBhdHRyaWJ1dGVzICovCispOyAKK2V4dGVybiBDb2xvcm1hcCAqWExpc3RJbnN0YWxsZWRDb2xvcm1hcHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludCoJCS8qIG51bV9yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhMaXN0Rm9udHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXR0ZXJuICovLAorICAgIGludAkJCS8qIG1heG5hbWVzICovLAorICAgIGludCoJCS8qIGFjdHVhbF9jb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhMaXN0Rm9udHNXaXRoSW5mbygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdHRlcm4gKi8sCisgICAgaW50CQkJLyogbWF4bmFtZXMgKi8sCisgICAgaW50KgkJLyogY291bnRfcmV0dXJuICovLAorICAgIFhGb250U3RydWN0KioJLyogaW5mb19yZXR1cm4gKi8KKyk7CitleHRlcm4gY2hhciAqKlhHZXRGb250UGF0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBucGF0aHNfcmV0dXJuICovCispOworZXh0ZXJuIGNoYXIgKipYTGlzdEV4dGVuc2lvbnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbmV4dGVuc2lvbnNfcmV0dXJuICovCispOworZXh0ZXJuIEF0b20gKlhMaXN0UHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50KgkJLyogbnVtX3Byb3BfcmV0dXJuICovCispOworZXh0ZXJuIFhIb3N0QWRkcmVzcyAqWExpc3RIb3N0cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBuaG9zdHNfcmV0dXJuICovLAorICAgIEJvb2wqCQkvKiBzdGF0ZV9yZXR1cm4gKi8KKyk7CitleHRlcm4gS2V5U3ltIFhLZXljb2RlVG9LZXlzeW0oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisjaWYgTmVlZFdpZGVQcm90b3R5cGVzCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGUgKi8sCisjZWxzZQorICAgIEtleUNvZGUJCS8qIGtleWNvZGUgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBpbmRleCAqLworKTsKK2V4dGVybiBLZXlTeW0gWExvb2t1cEtleXN5bSgKKyAgICBYS2V5RXZlbnQqCQkvKiBrZXlfZXZlbnQgKi8sCisgICAgaW50CQkJLyogaW5kZXggKi8KKyk7CitleHRlcm4gS2V5U3ltICpYR2V0S2V5Ym9hcmRNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorI2lmIE5lZWRXaWRlUHJvdG90eXBlcworICAgIHVuc2lnbmVkIGludAkvKiBmaXJzdF9rZXljb2RlICovLAorI2Vsc2UKKyAgICBLZXlDb2RlCQkvKiBmaXJzdF9rZXljb2RlICovLAorI2VuZGlmCisgICAgaW50CQkJLyoga2V5Y29kZV9jb3VudCAqLywKKyAgICBpbnQqCQkvKiBrZXlzeW1zX3Blcl9rZXljb2RlX3JldHVybiAqLworKTsKK2V4dGVybiBLZXlTeW0gWFN0cmluZ1RvS2V5c3ltKAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovCispOworZXh0ZXJuIGxvbmcgWE1heFJlcXVlc3RTaXplKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGxvbmcgWEV4dGVuZGVkTWF4UmVxdWVzdFNpemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gY2hhciAqWFJlc291cmNlTWFuYWdlclN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBjaGFyICpYU2NyZWVuUmVzb3VyY2VTdHJpbmcoCisJU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWERpc3BsYXlNb3Rpb25CdWZmZXJTaXplKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIFZpc3VhbElEIFhWaXN1YWxJREZyb21WaXN1YWwoCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovCispOworCisvKiBtdWx0aXRocmVhZCByb3V0aW5lcyAqLworCitleHRlcm4gU3RhdHVzIFhJbml0VGhyZWFkcygKKyAgICB2b2lkCispOworCitleHRlcm4gdm9pZCBYTG9ja0Rpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhVbmxvY2tEaXNwbGF5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCisvKiByb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoIGV4dGVuc2lvbnMgKi8KKworZXh0ZXJuIFhFeHRDb2RlcyAqWEluaXRFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovCispOworCitleHRlcm4gWEV4dENvZGVzICpYQWRkRXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIFhFeHREYXRhICpYRmluZE9uRXh0ZW5zaW9uTGlzdCgKKyAgICBYRXh0RGF0YSoqCQkvKiBzdHJ1Y3R1cmUgKi8sCisgICAgaW50CQkJLyogbnVtYmVyICovCispOworZXh0ZXJuIFhFeHREYXRhICoqWEVIZWFkT2ZFeHRlbnNpb25MaXN0KAorICAgIFhFRGF0YU9iamVjdAkvKiBvYmplY3QgKi8KKyk7CisKKy8qIHRoZXNlIGFyZSByb3V0aW5lcyBmb3Igd2hpY2ggdGhlcmUgYXJlIGFsc28gbWFjcm9zICovCitleHRlcm4gV2luZG93IFhSb290V2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gV2luZG93IFhEZWZhdWx0Um9vdFdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBXaW5kb3cgWFJvb3RXaW5kb3dPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gVmlzdWFsICpYRGVmYXVsdFZpc3VhbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIFZpc3VhbCAqWERlZmF1bHRWaXN1YWxPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gR0MgWERlZmF1bHRHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIEdDIFhEZWZhdWx0R0NPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYQmxhY2tQaXhlbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFdoaXRlUGl4ZWwoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhBbGxQbGFuZXMoCisgICAgdm9pZAorKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFhCbGFja1BpeGVsT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFdoaXRlUGl4ZWxPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYTmV4dFJlcXVlc3QoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYTGFzdEtub3duUmVxdWVzdFByb2Nlc3NlZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKK2V4dGVybiBjaGFyICpYU2VydmVyVmVuZG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIGNoYXIgKlhEaXNwbGF5U3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworZXh0ZXJuIENvbG9ybWFwIFhEZWZhdWx0Q29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiBDb2xvcm1hcCBYRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworZXh0ZXJuIFNjcmVlbiAqWFNjcmVlbk9mRGlzcGxheSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovCispOworZXh0ZXJuIFNjcmVlbiAqWERlZmF1bHRTY3JlZW5PZkRpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CitleHRlcm4gbG9uZyBYRXZlbnRNYXNrT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhTY3JlZW5OdW1iZXJPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqWEVycm9ySGFuZGxlcikgKAkgICAgLyogV0FSTklORywgdGhpcyB0eXBlIG5vdCBpbiBYbGliIHNwZWMgKi8KKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXJyb3JFdmVudCoJLyogZXJyb3JfZXZlbnQgKi8KKyk7CisKK2V4dGVybiBYRXJyb3JIYW5kbGVyIFhTZXRFcnJvckhhbmRsZXIgKAorICAgIFhFcnJvckhhbmRsZXIJLyogaGFuZGxlciAqLworKTsKKworCit0eXBlZGVmIGludCAoKlhJT0Vycm9ySGFuZGxlcikgKCAgICAvKiBXQVJOSU5HLCB0aGlzIHR5cGUgbm90IGluIFhsaWIgc3BlYyAqLworICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gWElPRXJyb3JIYW5kbGVyIFhTZXRJT0Vycm9ySGFuZGxlciAoCisgICAgWElPRXJyb3JIYW5kbGVyCS8qIGhhbmRsZXIgKi8KKyk7CisKKworZXh0ZXJuIFhQaXhtYXBGb3JtYXRWYWx1ZXMgKlhMaXN0UGl4bWFwRm9ybWF0cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gaW50ICpYTGlzdERlcHRocygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKKworLyogSUNDQ00gcm91dGluZXMgZm9yIHRoaW5ncyB0aGF0IGRvbid0IHJlcXVpcmUgc3BlY2lhbCBpbmNsdWRlIGZpbGVzOyAqLworLyogb3RoZXIgZGVjbGFyYXRpb25zIGFyZSBnaXZlbiBpbiBYdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIFN0YXR1cyBYUmVjb25maWd1cmVXTVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbWFzayAqLywKKyAgICBYV2luZG93Q2hhbmdlcyoJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01Qcm90b2NvbHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEF0b20qKgkJLyogcHJvdG9jb2xzX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gU3RhdHVzIFhTZXRXTVByb3RvY29scygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbSoJCS8qIHByb3RvY29scyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKK2V4dGVybiBTdGF0dXMgWEljb25pZnlXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CitleHRlcm4gU3RhdHVzIFhXaXRoZHJhd1dpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKK2V4dGVybiBTdGF0dXMgWEdldENvbW1hbmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGNoYXIqKioJCS8qIGFyZ3ZfcmV0dXJuICovLAorICAgIGludCoJCS8qIGFyZ2NfcmV0dXJuICovCispOworZXh0ZXJuIFN0YXR1cyBYR2V0V01Db2xvcm1hcFdpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFdpbmRvdyoqCQkvKiB3aW5kb3dzX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8KKyk7CitleHRlcm4gU3RhdHVzIFhTZXRXTUNvbG9ybWFwV2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93KgkJLyogY29sb3JtYXBfd2luZG93cyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLworKTsKK2V4dGVybiB2b2lkIFhGcmVlU3RyaW5nTGlzdCgKKyAgICBjaGFyKioJCS8qIGxpc3QgKi8KKyk7CitleHRlcm4gaW50IFhTZXRUcmFuc2llbnRGb3JIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cJCS8qIHByb3Bfd2luZG93ICovCispOworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBnaXZlbiBpbiBhbHBoYWJldGljYWwgb3JkZXIgKi8KKworZXh0ZXJuIGludCBYQWN0aXZhdGVTY3JlZW5TYXZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQWRkSG9zdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSG9zdEFkZHJlc3MqCS8qIGhvc3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWEFkZEhvc3RzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdHMgKi8sCisgICAgaW50CQkJLyogbnVtX2hvc3RzICovICAgIAorKTsKKworZXh0ZXJuIGludCBYQWRkVG9FeHRlbnNpb25MaXN0KAorICAgIHN0cnVjdCBfWEV4dERhdGEqKgkvKiBzdHJ1Y3R1cmUgKi8sCisgICAgWEV4dERhdGEqCQkvKiBleHRfZGF0YSAqLworKTsKKworZXh0ZXJuIGludCBYQWRkVG9TYXZlU2V0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYQWxsb2NDb2xvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgWENvbG9yKgkJLyogc2NyZWVuX2luX291dCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYQWxsb2NDb2xvckNlbGxzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBCb29sCSAgICAgICAgLyogY29udGlnICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBsYW5lX21hc2tzX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbnBsYW5lcyAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBwaXhlbHNfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCAJLyogbnBpeGVscyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYQWxsb2NDb2xvclBsYW5lcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8sCisgICAgQm9vbAkJLyogY29udGlnICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBpeGVsc19yZXR1cm4gKi8sCisgICAgaW50CQkJLyogbmNvbG9ycyAqLywKKyAgICBpbnQJCQkvKiBucmVkcyAqLywKKyAgICBpbnQJCQkvKiBuZ3JlZW5zICovLAorICAgIGludAkJCS8qIG5ibHVlcyAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBybWFza19yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogZ21hc2tfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIGJtYXNrX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYQWxsb2NOYW1lZENvbG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGNvbG9yX25hbWUgKi8sCisgICAgWENvbG9yKgkJLyogc2NyZWVuX2RlZl9yZXR1cm4gKi8sCisgICAgWENvbG9yKgkJLyogZXhhY3RfZGVmX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYQWxsb3dFdmVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXZlbnRfbW9kZSAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhBdXRvUmVwZWF0T2ZmKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhBdXRvUmVwZWF0T24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWEJlbGwoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogcGVyY2VudCAqLworKTsKKworZXh0ZXJuIGludCBYQml0bWFwQml0T3JkZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWEJpdG1hcFBhZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQml0bWFwVW5pdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYQ2VsbHNPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9tYXNrICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWEdDVmFsdWVzKgkJLyogdmFsdWVzICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VLZXlib2FyZENvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiB2YWx1ZV9tYXNrICovLAorICAgIFhLZXlib2FyZENvbnRyb2wqCS8qIHZhbHVlcyAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlS2V5Ym9hcmRNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGZpcnN0X2tleWNvZGUgKi8sCisgICAgaW50CQkJLyoga2V5c3ltc19wZXJfa2V5Y29kZSAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1zICovLAorICAgIGludAkJCS8qIG51bV9jb2RlcyAqLworKTsKKworZXh0ZXJuIGludCBYQ2hhbmdlUG9pbnRlckNvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQm9vbAkJLyogZG9fYWNjZWwgKi8sCisgICAgQm9vbAkJLyogZG9fdGhyZXNob2xkICovLAorICAgIGludAkJCS8qIGFjY2VsX251bWVyYXRvciAqLywKKyAgICBpbnQJCQkvKiBhY2NlbF9kZW5vbWluYXRvciAqLywKKyAgICBpbnQJCQkvKiB0aHJlc2hvbGQgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZVByb3BlcnR5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLywKKyAgICBBdG9tCQkvKiB0eXBlICovLAorICAgIGludAkJCS8qIGZvcm1hdCAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovLAorICAgIF9YY29uc3QgdW5zaWduZWQgY2hhcioJLyogZGF0YSAqLywKKyAgICBpbnQJCQkvKiBuZWxlbWVudHMgKi8KKyk7CisKK2V4dGVybiBpbnQgWENoYW5nZVNhdmVTZXQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIGNoYW5nZV9tb2RlICovCispOworCitleHRlcm4gaW50IFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyogLyogYXR0cmlidXRlcyAqLworKTsKKworZXh0ZXJuIEJvb2wgWENoZWNrSWZFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogZXZlbnQgKi8sCisgICAgICAgICAgICAgICBYUG9pbnRlcgkJCS8qIGFyZyAqLworICAgICAgICAgICAgICkJCS8qIHByZWRpY2F0ZSAqLywKKyAgICBYUG9pbnRlcgkJLyogYXJnICovCispOworCitleHRlcm4gQm9vbCBYQ2hlY2tNYXNrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhDaGVja1R5cGVkRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXZlbnRfdHlwZSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhDaGVja1R5cGVkV2luZG93RXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIGV2ZW50X3R5cGUgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCispOworCitleHRlcm4gQm9vbCBYQ2hlY2tXaW5kb3dFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWENpcmN1bGF0ZVN1YndpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIGRpcmVjdGlvbiAqLworKTsKKworZXh0ZXJuIGludCBYQ2lyY3VsYXRlU3Vid2luZG93c0Rvd24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhDaXJjdWxhdGVTdWJ3aW5kb3dzVXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhDbGVhckFyZWEoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICBCb29sCQkvKiBleHBvc3VyZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWENsZWFyV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYQ2xvc2VEaXNwbGF5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhDb25maWd1cmVXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB2YWx1ZV9tYXNrICovLAorICAgIFhXaW5kb3dDaGFuZ2VzKgkvKiB2YWx1ZXMgKi8JCSAKKyk7CisKK2V4dGVybiBpbnQgWENvbm5lY3Rpb25OdW1iZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWENvbnZlcnRTZWxlY3Rpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQXRvbQkJLyogc2VsZWN0aW9uICovLAorICAgIEF0b20gCQkvKiB0YXJnZXQgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8sCisgICAgV2luZG93CQkvKiByZXF1ZXN0b3IgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYQ29weUFyZWEoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIHNyYyAqLywKKyAgICBEcmF3YWJsZQkJLyogZGVzdCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovLAorICAgIGludAkJCS8qIGRlc3RfeCAqLywKKyAgICBpbnQJCQkvKiBkZXN0X3kgKi8KKyk7CisKK2V4dGVybiBpbnQgWENvcHlHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIHNyYyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHZhbHVlbWFzayAqLywKKyAgICBHQwkJCS8qIGRlc3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWENvcHlQbGFuZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogc3JjICovLAorICAgIERyYXdhYmxlCQkvKiBkZXN0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogc3JjX3ggKi8sCisgICAgaW50CQkJLyogc3JjX3kgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lICovCispOworCitleHRlcm4gaW50IFhEZWZhdWx0RGVwdGgoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKKworZXh0ZXJuIGludCBYRGVmYXVsdERlcHRoT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhEZWZhdWx0U2NyZWVuKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhEZWZpbmVDdXJzb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovCispOworCitleHRlcm4gaW50IFhEZWxldGVQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWERlc3Ryb3lXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhEZXN0cm95U3Vid2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWERvZXNCYWNraW5nU3RvcmUoCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovICAgIAorKTsKKworZXh0ZXJuIEJvb2wgWERvZXNTYXZlVW5kZXJzKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYRGlzYWJsZUFjY2Vzc0NvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKKworZXh0ZXJuIGludCBYRGlzcGxheUNlbGxzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlIZWlnaHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKKworZXh0ZXJuIGludCBYRGlzcGxheUhlaWdodE1NKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlLZXljb2RlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiBtaW5fa2V5Y29kZXNfcmV0dXJuICovLAorICAgIGludCoJCS8qIG1heF9rZXljb2Rlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlQbGFuZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuX251bWJlciAqLworKTsKKworZXh0ZXJuIGludCBYRGlzcGxheVdpZHRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERpc3BsYXlXaWR0aE1NKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbl9udW1iZXIgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdBcmMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogYW5nbGUxICovLAorICAgIGludAkJCS8qIGFuZ2xlMiAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0FyY3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYQXJjKgkJLyogYXJjcyAqLywKKyAgICBpbnQJCQkvKiBuYXJjcyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0ltYWdlU3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGxlbmd0aCAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd0ltYWdlU3RyaW5nMTYoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbGVuZ3RoICovCispOworCitleHRlcm4gaW50IFhEcmF3TGluZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHgxICovLAorICAgIGludAkJCS8qIHkxICovLAorICAgIGludAkJCS8qIHgyICovLAorICAgIGludAkJCS8qIHkyICovCispOworCitleHRlcm4gaW50IFhEcmF3TGluZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCisgICAgaW50CQkJLyogbnBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IFhEcmF3UG9pbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdQb2ludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYUG9pbnQqCQkvKiBwb2ludHMgKi8sCisgICAgaW50CQkJLyogbnBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gaW50IFhEcmF3UmVjdGFuZ2xlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhEcmF3UmVjdGFuZ2xlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGVzICovLAorICAgIGludAkJCS8qIG5yZWN0YW5nbGVzICovCispOworCitleHRlcm4gaW50IFhEcmF3U2VnbWVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYU2VnbWVudCoJCS8qIHNlZ21lbnRzICovLAorICAgIGludAkJCS8qIG5zZWdtZW50cyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1N0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdTdHJpbmcxNigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBfWGNvbnN0IFhDaGFyMmIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBpbnQgWERyYXdUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIFhUZXh0SXRlbSoJCS8qIGl0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIGludCBYRHJhd1RleHQxNigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICBYVGV4dEl0ZW0xNioJLyogaXRlbXMgKi8sCisgICAgaW50CQkJLyogbml0ZW1zICovCispOworCitleHRlcm4gaW50IFhFbmFibGVBY2Nlc3NDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhFdmVudHNRdWV1ZWQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYRmV0Y2hOYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBjaGFyKioJCS8qIHdpbmRvd19uYW1lX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYRmlsbEFyYygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICBpbnQJCQkvKiBhbmdsZTEgKi8sCisgICAgaW50CQkJLyogYW5nbGUyICovCispOworCitleHRlcm4gaW50IFhGaWxsQXJjcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhBcmMqCQkvKiBhcmNzICovLAorICAgIGludAkJCS8qIG5hcmNzICovCispOworCitleHRlcm4gaW50IFhGaWxsUG9seWdvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhQb2ludCoJCS8qIHBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBucG9pbnRzICovLAorICAgIGludAkJCS8qIHNoYXBlICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZpbGxSZWN0YW5nbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZpbGxSZWN0YW5nbGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIHJlY3RhbmdsZXMgKi8sCisgICAgaW50CQkJLyogbnJlY3RhbmdsZXMgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZsdXNoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhGb3JjZVNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIG1vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWUoCisgICAgdm9pZCoJCS8qIGRhdGEgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVDb2xvcnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIHBpeGVscyAqLywKKyAgICBpbnQJCQkvKiBucGl4ZWxzICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVzICovCispOworCitleHRlcm4gaW50IFhGcmVlQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovCispOworCitleHRlcm4gaW50IFhGcmVlRXh0ZW5zaW9uTGlzdCgKKyAgICBjaGFyKioJCS8qIGxpc3QgKi8gICAgCispOworCitleHRlcm4gaW50IFhGcmVlRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVGb250SW5mbygKKyAgICBjaGFyKioJCS8qIG5hbWVzICovLAorICAgIFhGb250U3RydWN0KgkvKiBmcmVlX2luZm8gKi8sCisgICAgaW50CQkJLyogYWN0dWFsX2NvdW50ICovCispOworCitleHRlcm4gaW50IFhGcmVlRm9udE5hbWVzKAorICAgIGNoYXIqKgkJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUZvbnRQYXRoKAorICAgIGNoYXIqKgkJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZyZWVNb2RpZmllcm1hcCgKKyAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYRnJlZVBpeG1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBQaXhtYXAJCS8qIHBpeG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYR2VvbWV0cnkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuICovLAorICAgIF9YY29uc3QgY2hhcioJLyogcG9zaXRpb24gKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBkZWZhdWx0X3Bvc2l0aW9uICovLAorICAgIHVuc2lnbmVkIGludAkvKiBid2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGZ3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZmhlaWdodCAqLywKKyAgICBpbnQJCQkvKiB4YWRkZXIgKi8sCisgICAgaW50CQkJLyogeWFkZGVyICovLAorICAgIGludCoJCS8qIHhfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfcmV0dXJuICovLAorICAgIGludCoJCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBoZWlnaHRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhHZXRFcnJvckRhdGFiYXNlVGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBtZXNzYWdlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZGVmYXVsdF9zdHJpbmcgKi8sCisgICAgY2hhcioJCS8qIGJ1ZmZlcl9yZXR1cm4gKi8sCisgICAgaW50CQkJLyogbGVuZ3RoICovCispOworCitleHRlcm4gaW50IFhHZXRFcnJvclRleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogY29kZSAqLywKKyAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBsZW5ndGggKi8KKyk7CisKK2V4dGVybiBCb29sIFhHZXRGb250UHJvcGVydHkoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIEF0b20JCS8qIGF0b20gKi8sCisgICAgdW5zaWduZWQgbG9uZyoJLyogdmFsdWVfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRHQ1ZhbHVlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogdmFsdWVtYXNrICovLAorICAgIFhHQ1ZhbHVlcyoJCS8qIHZhbHVlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldEdlb21ldHJ5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIFdpbmRvdyoJCS8qIHJvb3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIHhfcmV0dXJuICovLAorICAgIGludCoJCS8qIHlfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd2lkdGhfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaGVpZ2h0X3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGJvcmRlcl93aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBkZXB0aF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldEljb25OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBjaGFyKioJCS8qIGljb25fbmFtZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldElucHV0Rm9jdXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93KgkJLyogZm9jdXNfcmV0dXJuICovLAorICAgIGludCoJCS8qIHJldmVydF90b19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldEtleWJvYXJkQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYS2V5Ym9hcmRTdGF0ZSoJLyogdmFsdWVzX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0UG9pbnRlckNvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogYWNjZWxfbnVtZXJhdG9yX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBhY2NlbF9kZW5vbWluYXRvcl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogdGhyZXNob2xkX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYR2V0UG9pbnRlck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgY2hhcioJLyogbWFwX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBubWFwICovCispOworCitleHRlcm4gaW50IFhHZXRTY3JlZW5TYXZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQqCQkvKiB0aW1lb3V0X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBpbnRlcnZhbF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogcHJlZmVyX2JsYW5raW5nX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBhbGxvd19leHBvc3VyZXNfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRUcmFuc2llbnRGb3JIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBXaW5kb3cqCQkvKiBwcm9wX3dpbmRvd19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdldFdpbmRvd1Byb3BlcnR5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLywKKyAgICBsb25nCQkvKiBsb25nX29mZnNldCAqLywKKyAgICBsb25nCQkvKiBsb25nX2xlbmd0aCAqLywKKyAgICBCb29sCQkvKiBkZWxldGUgKi8sCisgICAgQXRvbQkJLyogcmVxX3R5cGUgKi8sCisgICAgQXRvbSoJCS8qIGFjdHVhbF90eXBlX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBhY3R1YWxfZm9ybWF0X3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBsb25nKgkvKiBuaXRlbXNfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGxvbmcqCS8qIGJ5dGVzX2FmdGVyX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBjaGFyKioJLyogcHJvcF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdpbmRvd0F0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhXaW5kb3dBdHRyaWJ1dGVzKgkvKiB3aW5kb3dfYXR0cmlidXRlc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEdyYWJCdXR0b24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9tYXNrICovLAorICAgIGludAkJCS8qIHBvaW50ZXJfbW9kZSAqLywKKyAgICBpbnQJCQkvKiBrZXlib2FyZF9tb2RlICovLAorICAgIFdpbmRvdwkJLyogY29uZmluZV90byAqLywKKyAgICBDdXJzb3IJCS8qIGN1cnNvciAqLworKTsKKworZXh0ZXJuIGludCBYR3JhYktleSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBrZXljb2RlICovLAorICAgIHVuc2lnbmVkIGludAkvKiBtb2RpZmllcnMgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lcl9ldmVudHMgKi8sCisgICAgaW50CQkJLyogcG9pbnRlcl9tb2RlICovLAorICAgIGludAkJCS8qIGtleWJvYXJkX21vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWEdyYWJLZXlib2FyZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAorICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCisgICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50IFhHcmFiUG9pbnRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovLAorICAgIEJvb2wJCS8qIG93bmVyX2V2ZW50cyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZXZlbnRfbWFzayAqLywKKyAgICBpbnQJCQkvKiBwb2ludGVyX21vZGUgKi8sCisgICAgaW50CQkJLyoga2V5Ym9hcmRfbW9kZSAqLywKKyAgICBXaW5kb3cJCS8qIGNvbmZpbmVfdG8gKi8sCisgICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYR3JhYlNlcnZlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYSGVpZ2h0TU1PZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWEhlaWdodE9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYSWZFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogZXZlbnQgKi8sCisgICAgICAgICAgICAgICBYUG9pbnRlcgkJCS8qIGFyZyAqLworICAgICAgICAgICAgICkJCS8qIHByZWRpY2F0ZSAqLywKKyAgICBYUG9pbnRlcgkJLyogYXJnICovCispOworCitleHRlcm4gaW50IFhJbWFnZUJ5dGVPcmRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIGludCBYSW5zdGFsbENvbG9ybWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKKworZXh0ZXJuIEtleUNvZGUgWEtleXN5bVRvS2V5Y29kZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBLZXlTeW0JCS8qIGtleXN5bSAqLworKTsKKworZXh0ZXJuIGludCBYS2lsbENsaWVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiByZXNvdXJjZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYTG9va3VwQ29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIF9YY29uc3QgY2hhcioJLyogY29sb3JfbmFtZSAqLywKKyAgICBYQ29sb3IqCQkvKiBleGFjdF9kZWZfcmV0dXJuICovLAorICAgIFhDb2xvcioJCS8qIHNjcmVlbl9kZWZfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhMb3dlcldpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1hcFJhaXNlZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8KKyk7CisKK2V4dGVybiBpbnQgWE1hcFN1YndpbmRvd3MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhNYXBXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhNYXNrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgbG9uZwkJLyogZXZlbnRfbWFzayAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWE1heENtYXBzT2ZTY3JlZW4oCisgICAgU2NyZWVuKgkJLyogc2NyZWVuICovCispOworCitleHRlcm4gaW50IFhNaW5DbWFwc09mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYTW92ZVJlc2l6ZVdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhNb3ZlV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWE5leHRFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWE5vT3AoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFBhcnNlQ29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3BlYyAqLywKKyAgICBYQ29sb3IqCQkvKiBleGFjdF9kZWZfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhQYXJzZUdlb21ldHJ5KAorICAgIF9YY29uc3QgY2hhcioJLyogcGFyc2VzdHJpbmcgKi8sCisgICAgaW50KgkJLyogeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3aWR0aF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoZWlnaHRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhQZWVrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnRfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhQZWVrSWZFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRXZlbnQqCQkvKiBldmVudF9yZXR1cm4gKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgIFhFdmVudCoJCS8qIGV2ZW50ICovLAorICAgICAgICAgICAgICAgWFBvaW50ZXIJCS8qIGFyZyAqLworICAgICAgICAgICAgICkJCS8qIHByZWRpY2F0ZSAqLywKKyAgICBYUG9pbnRlcgkJLyogYXJnICovCispOworCitleHRlcm4gaW50IFhQZW5kaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhQbGFuZXNPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFByb3RvY29sUmV2aXNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFByb3RvY29sVmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworCitleHRlcm4gaW50IFhQdXRCYWNrRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFB1dEltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgWEltYWdlKgkJLyogaW1hZ2UgKi8sCisgICAgaW50CQkJLyogc3JjX3ggKi8sCisgICAgaW50CQkJLyogc3JjX3kgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLwkgIAorKTsKKworZXh0ZXJuIGludCBYUUxlbmd0aCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYUXVlcnlCZXN0Q3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIHVuc2lnbmVkIGludCAgICAgICAgLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdFNpemUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogY2xhc3MgKi8sCisgICAgRHJhd2FibGUJCS8qIHdoaWNoX3NjcmVlbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdFN0aXBwbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIHdoaWNoX3NjcmVlbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5QmVzdFRpbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIHdoaWNoX3NjcmVlbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5Q29sb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCS8qIGRlZl9pbl9vdXQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5Q29sb3JzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYQ29sb3IqCQkvKiBkZWZzX2luX291dCAqLywKKyAgICBpbnQJCQkvKiBuY29sb3JzICovCispOworCitleHRlcm4gQm9vbCBYUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBuYW1lICovLAorICAgIGludCoJCS8qIG1ham9yX29wY29kZV9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZmlyc3RfZXZlbnRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGZpcnN0X2Vycm9yX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUXVlcnlLZXltYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgY2hhciBbMzJdCQkvKiBrZXlzX3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWFF1ZXJ5UG9pbnRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93KgkJLyogcm9vdF9yZXR1cm4gKi8sCisgICAgV2luZG93KgkJLyogY2hpbGRfcmV0dXJuICovLAorICAgIGludCoJCS8qIHJvb3RfeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogcm9vdF95X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB3aW5feF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogd2luX3lfcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCogICAgICAgLyogbWFza19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFF1ZXJ5VGV4dEV4dGVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogZm9udF9JRCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBuY2hhcnMgKi8sCisgICAgaW50KgkJLyogZGlyZWN0aW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2FzY2VudF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9kZXNjZW50X3JldHVybiAqLywKKyAgICBYQ2hhclN0cnVjdCoJLyogb3ZlcmFsbF9yZXR1cm4gKi8gICAgCispOworCitleHRlcm4gaW50IFhRdWVyeVRleHRFeHRlbnRzMTYoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWElECQkJLyogZm9udF9JRCAqLywKKyAgICBfWGNvbnN0IFhDaGFyMmIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBuY2hhcnMgKi8sCisgICAgaW50KgkJLyogZGlyZWN0aW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2FzY2VudF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9kZXNjZW50X3JldHVybiAqLywKKyAgICBYQ2hhclN0cnVjdCoJLyogb3ZlcmFsbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFF1ZXJ5VHJlZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93KgkJLyogcm9vdF9yZXR1cm4gKi8sCisgICAgV2luZG93KgkJLyogcGFyZW50X3JldHVybiAqLywKKyAgICBXaW5kb3cqKgkJLyogY2hpbGRyZW5fcmV0dXJuICovLAorICAgIHVuc2lnbmVkIGludCoJLyogbmNoaWxkcmVuX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYUmFpc2VXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhSZWFkQml0bWFwRmlsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZSAJCS8qIGQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBmaWxlbmFtZSAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8sCisgICAgUGl4bWFwKgkJLyogYml0bWFwX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB4X2hvdF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9ob3RfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhSZWFkQml0bWFwRmlsZURhdGEoCisgICAgX1hjb25zdCBjaGFyKgkvKiBmaWxlbmFtZSAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdpZHRoX3JldHVybiAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhlaWdodF9yZXR1cm4gKi8sCisgICAgdW5zaWduZWQgY2hhcioqCS8qIGRhdGFfcmV0dXJuICovLAorICAgIGludCoJCS8qIHhfaG90X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiB5X2hvdF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlYmluZEtleXN5bSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBLZXlTeW0JCS8qIGtleXN5bSAqLywKKyAgICBLZXlTeW0qCQkvKiBsaXN0ICovLAorICAgIGludAkJCS8qIG1vZF9jb3VudCAqLywKKyAgICBfWGNvbnN0IHVuc2lnbmVkIGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBpbnQJCQkvKiBieXRlc19zdHJpbmcgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlY29sb3JDdXJzb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ3Vyc29yCQkvKiBjdXJzb3IgKi8sCisgICAgWENvbG9yKgkJLyogZm9yZWdyb3VuZF9jb2xvciAqLywKKyAgICBYQ29sb3IqCQkvKiBiYWNrZ3JvdW5kX2NvbG9yICovCispOworCitleHRlcm4gaW50IFhSZWZyZXNoS2V5Ym9hcmRNYXBwaW5nKAorICAgIFhNYXBwaW5nRXZlbnQqCS8qIGV2ZW50X21hcCAqLyAgICAKKyk7CisKK2V4dGVybiBpbnQgWFJlbW92ZUZyb21TYXZlU2V0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYUmVtb3ZlSG9zdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSG9zdEFkZHJlc3MqCS8qIGhvc3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWFJlbW92ZUhvc3RzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhIb3N0QWRkcmVzcyoJLyogaG9zdHMgKi8sCisgICAgaW50CQkJLyogbnVtX2hvc3RzICovCispOworCitleHRlcm4gaW50IFhSZXBhcmVudFdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgV2luZG93CQkvKiBwYXJlbnQgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovCispOworCitleHRlcm4gaW50IFhSZXNldFNjcmVlblNhdmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhSZXNpemVXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitleHRlcm4gaW50IFhSZXN0YWNrV2luZG93cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cqCQkvKiB3aW5kb3dzICovLAorICAgIGludAkJCS8qIG53aW5kb3dzICovCispOworCitleHRlcm4gaW50IFhSb3RhdGVCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHJvdGF0ZSAqLworKTsKKworZXh0ZXJuIGludCBYUm90YXRlV2luZG93UHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgQXRvbSoJCS8qIHByb3BlcnRpZXMgKi8sCisgICAgaW50CQkJLyogbnVtX3Byb3AgKi8sCisgICAgaW50CQkJLyogbnBvc2l0aW9ucyAqLworKTsKKworZXh0ZXJuIGludCBYU2NyZWVuQ291bnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNlbGVjdElucHV0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovCispOworCitleHRlcm4gU3RhdHVzIFhTZW5kRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIEJvb2wJCS8qIHByb3BhZ2F0ZSAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3NlbmQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEFjY2Vzc0NvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0QXJjTW9kZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGFyY19tb2RlICovCispOworCitleHRlcm4gaW50IFhTZXRCYWNrZ3JvdW5kKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBiYWNrZ3JvdW5kICovCispOworCitleHRlcm4gaW50IFhTZXRDbGlwTWFzaygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFBpeG1hcAkJLyogcGl4bWFwICovCispOworCitleHRlcm4gaW50IFhTZXRDbGlwT3JpZ2luKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogY2xpcF94X29yaWdpbiAqLywKKyAgICBpbnQJCQkvKiBjbGlwX3lfb3JpZ2luICovCispOworCitleHRlcm4gaW50IFhTZXRDbGlwUmVjdGFuZ2xlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGNsaXBfeF9vcmlnaW4gKi8sCisgICAgaW50CQkJLyogY2xpcF95X29yaWdpbiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdGFuZ2xlcyAqLywKKyAgICBpbnQJCQkvKiBuICovLAorICAgIGludAkJCS8qIG9yZGVyaW5nICovCispOworCitleHRlcm4gaW50IFhTZXRDbG9zZURvd25Nb2RlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGNsb3NlX21vZGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldENvbW1hbmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIGNoYXIqKgkJLyogYXJndiAqLywKKyAgICBpbnQJCQkvKiBhcmdjICovCispOworCitleHRlcm4gaW50IFhTZXREYXNoZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBkYXNoX29mZnNldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhc2hfbGlzdCAqLywKKyAgICBpbnQJCQkvKiBuICovCispOworCitleHRlcm4gaW50IFhTZXRGaWxsUnVsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIGludAkJCS8qIGZpbGxfcnVsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0RmlsbFN0eWxlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogZmlsbF9zdHlsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0Rm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIEZvbnQJCS8qIGZvbnQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZvbnRQYXRoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGNoYXIqKgkJLyogZGlyZWN0b3JpZXMgKi8sCisgICAgaW50CQkJLyogbmRpcnMgKi8JICAgICAKKyk7CisKK2V4dGVybiBpbnQgWFNldEZvcmVncm91bmQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGZvcmVncm91bmQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEZ1bmN0aW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogZnVuY3Rpb24gKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldEdyYXBoaWNzRXhwb3N1cmVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgQm9vbAkJLyogZ3JhcGhpY3NfZXhwb3N1cmVzICovCispOworCitleHRlcm4gaW50IFhTZXRJY29uTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBpY29uX25hbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldElucHV0Rm9jdXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiBmb2N1cyAqLywKKyAgICBpbnQJCQkvKiByZXZlcnRfdG8gKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0TGluZUF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbGluZV93aWR0aCAqLywKKyAgICBpbnQJCQkvKiBsaW5lX3N0eWxlICovLAorICAgIGludAkJCS8qIGNhcF9zdHlsZSAqLywKKyAgICBpbnQJCQkvKiBqb2luX3N0eWxlICovCispOworCitleHRlcm4gaW50IFhTZXRNb2RpZmllck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWE1vZGlmaWVyS2V5bWFwKgkvKiBtb2RtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFBsYW5lTWFzaygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGxhbmVfbWFzayAqLworKTsKKworZXh0ZXJuIGludCBYU2V0UG9pbnRlck1hcHBpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCB1bnNpZ25lZCBjaGFyKgkvKiBtYXAgKi8sCisgICAgaW50CQkJLyogbm1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U2NyZWVuU2F2ZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogdGltZW91dCAqLywKKyAgICBpbnQJCQkvKiBpbnRlcnZhbCAqLywKKyAgICBpbnQJCQkvKiBwcmVmZXJfYmxhbmtpbmcgKi8sCisgICAgaW50CQkJLyogYWxsb3dfZXhwb3N1cmVzICovCispOworCitleHRlcm4gaW50IFhTZXRTZWxlY3Rpb25Pd25lcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBBdG9tCSAgICAgICAgLyogc2VsZWN0aW9uICovLAorICAgIFdpbmRvdwkJLyogb3duZXIgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U3RhdGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICB1bnNpZ25lZCBsb25nIAkvKiBmb3JlZ3JvdW5kICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYmFja2dyb3VuZCAqLywKKyAgICBpbnQJCQkvKiBmdW5jdGlvbiAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFN0aXBwbGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBQaXhtYXAJCS8qIHN0aXBwbGUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFN1YndpbmRvd01vZGUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiBzdWJ3aW5kb3dfbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0VFNPcmlnaW4oCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB0c194X29yaWdpbiAqLywKKyAgICBpbnQJCQkvKiB0c195X29yaWdpbiAqLworKTsKKworZXh0ZXJuIGludCBYU2V0VGlsZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFBpeG1hcAkJLyogdGlsZSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93QmFja2dyb3VuZCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBiYWNrZ3JvdW5kX3BpeGVsICovCispOworCitleHRlcm4gaW50IFhTZXRXaW5kb3dCYWNrZ3JvdW5kUGl4bWFwKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBQaXhtYXAJCS8qIGJhY2tncm91bmRfcGl4bWFwICovCispOworCitleHRlcm4gaW50IFhTZXRXaW5kb3dCb3JkZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogYm9yZGVyX3BpeGVsICovCispOworCitleHRlcm4gaW50IFhTZXRXaW5kb3dCb3JkZXJQaXhtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFBpeG1hcAkJLyogYm9yZGVyX3BpeG1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93Qm9yZGVyV2lkdGgoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLworKTsKKworZXh0ZXJuIGludCBYU2V0V2luZG93Q29sb3JtYXAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVCdWZmZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBieXRlcyAqLywKKyAgICBpbnQJCQkvKiBuYnl0ZXMgKi8sCisgICAgaW50CQkJLyogYnVmZmVyICovCispOworCitleHRlcm4gaW50IFhTdG9yZUJ5dGVzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogYnl0ZXMgKi8sCisgICAgaW50CQkJLyogbmJ5dGVzICovCispOworCitleHRlcm4gaW50IFhTdG9yZUNvbG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBYQ29sb3IqCQkvKiBjb2xvciAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVDb2xvcnMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQ29sb3JtYXAJCS8qIGNvbG9ybWFwICovLAorICAgIFhDb2xvcioJCS8qIGNvbG9yICovLAorICAgIGludAkJCS8qIG5jb2xvcnMgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN0b3JlTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB3aW5kb3dfbmFtZSAqLworKTsKKworZXh0ZXJuIGludCBYU3RvcmVOYW1lZENvbG9yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIENvbG9ybWFwCQkvKiBjb2xvcm1hcCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGNvbG9yICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogcGl4ZWwgKi8sCisgICAgaW50CQkJLyogZmxhZ3MgKi8KKyk7CisKK2V4dGVybiBpbnQgWFN5bmMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgQm9vbAkJLyogZGlzY2FyZCAqLworKTsKKworZXh0ZXJuIGludCBYVGV4dEV4dGVudHMoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIG5jaGFycyAqLywKKyAgICBpbnQqCQkvKiBkaXJlY3Rpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfYXNjZW50X3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBmb250X2Rlc2NlbnRfcmV0dXJuICovLAorICAgIFhDaGFyU3RydWN0KgkvKiBvdmVyYWxsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYVGV4dEV4dGVudHMxNigKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogbmNoYXJzICovLAorICAgIGludCoJCS8qIGRpcmVjdGlvbl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZm9udF9hc2NlbnRfcmV0dXJuICovLAorICAgIGludCoJCS8qIGZvbnRfZGVzY2VudF9yZXR1cm4gKi8sCisgICAgWENoYXJTdHJ1Y3QqCS8qIG92ZXJhbGxfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhUZXh0V2lkdGgoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gaW50IFhUZXh0V2lkdGgxNigKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBYQ2hhcjJiKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhUcmFuc2xhdGVDb29yZGluYXRlcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHNyY193ICovLAorICAgIFdpbmRvdwkJLyogZGVzdF93ICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIGludCoJCS8qIGRlc3RfeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZGVzdF95X3JldHVybiAqLywKKyAgICBXaW5kb3cqCQkvKiBjaGlsZF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZGVmaW5lQ3Vyc29yKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYVW5ncmFiQnV0dG9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBidXR0b24gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBXaW5kb3cJCS8qIGdyYWJfd2luZG93ICovCispOworCitleHRlcm4gaW50IFhVbmdyYWJLZXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyoga2V5Y29kZSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZ3JhYktleWJvYXJkKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVuZ3JhYlBvaW50ZXIoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgVGltZQkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludCBYVW5ncmFiU2VydmVyKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhVbmluc3RhbGxDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBDb2xvcm1hcAkJLyogY29sb3JtYXAgKi8KKyk7CisKK2V4dGVybiBpbnQgWFVubG9hZEZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRm9udAkJLyogZm9udCAqLworKTsKKworZXh0ZXJuIGludCBYVW5tYXBTdWJ3aW5kb3dzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLworKTsKKworZXh0ZXJuIGludCBYVW5tYXBXaW5kb3coCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovCispOworCitleHRlcm4gaW50IFhWZW5kb3JSZWxlYXNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCitleHRlcm4gaW50IFhXYXJwUG9pbnRlcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHNyY193ICovLAorICAgIFdpbmRvdwkJLyogZGVzdF93ICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHNyY19oZWlnaHQgKi8sCisgICAgaW50CQkJLyogZGVzdF94ICovLAorICAgIGludAkJCS8qIGRlc3RfeSAqLwkgICAgIAorKTsKKworZXh0ZXJuIGludCBYV2lkdGhNTU9mU2NyZWVuKAorICAgIFNjcmVlbioJCS8qIHNjcmVlbiAqLworKTsKKworZXh0ZXJuIGludCBYV2lkdGhPZlNjcmVlbigKKyAgICBTY3JlZW4qCQkvKiBzY3JlZW4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFdpbmRvd0V2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBsb25nCQkvKiBldmVudF9tYXNrICovLAorICAgIFhFdmVudCoJCS8qIGV2ZW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYV3JpdGVCaXRtYXBGaWxlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8sCisgICAgUGl4bWFwCQkvKiBiaXRtYXAgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgaW50CQkJLyogeF9ob3QgKi8sCisgICAgaW50CQkJLyogeV9ob3QgKi8JCSAgICAgCispOworCitleHRlcm4gQm9vbCBYU3VwcG9ydHNMb2NhbGUgKHZvaWQpOworCitleHRlcm4gY2hhciAqWFNldExvY2FsZU1vZGlmaWVycygKKyAgICBjb25zdCBjaGFyKgkJLyogbW9kaWZpZXJfbGlzdCAqLworKTsKKworZXh0ZXJuIFhPTSBYT3Blbk9NKAorICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKKyAgICBfWGNvbnN0IGNoYXIqCQkvKiByZXNfbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCQkvKiByZXNfY2xhc3MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWENsb3NlT00oCisgICAgWE9NCQkJLyogb20gKi8KKyk7CisKK2V4dGVybiBjaGFyICpYU2V0T01WYWx1ZXMoCisgICAgWE9NCQkJLyogb20gKi8sCisgICAgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gY2hhciAqWEdldE9NVmFsdWVzKAorICAgIFhPTQkJCS8qIG9tICovLAorICAgIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZPTSgKKyAgICBYT00JCQkvKiBvbSAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhMb2NhbGVPZk9NKAorICAgIFhPTQkJCS8qIG9tICovCispOworCitleHRlcm4gWE9DIFhDcmVhdGVPQygKKyAgICBYT00JCQkvKiBvbSAqLywKKyAgICAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiB2b2lkIFhEZXN0cm95T0MoCisgICAgWE9DCQkJLyogb2MgKi8KKyk7CisKK2V4dGVybiBYT00gWE9NT2ZPQygKKyAgICBYT0MJCQkvKiBvYyAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhTZXRPQ1ZhbHVlcygKKyAgICBYT0MJCQkvKiBvYyAqLywKKyAgICAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBjaGFyICpYR2V0T0NWYWx1ZXMoCisgICAgWE9DCQkJLyogb2MgKi8sCisgICAgLi4uCispIF9YX1NFTlRJTkVMKDApOworCitleHRlcm4gWEZvbnRTZXQgWENyZWF0ZUZvbnRTZXQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBiYXNlX2ZvbnRfbmFtZV9saXN0ICovLAorICAgIGNoYXIqKioJCS8qIG1pc3NpbmdfY2hhcnNldF9saXN0ICovLAorICAgIGludCoJCS8qIG1pc3NpbmdfY2hhcnNldF9jb3VudCAqLywKKyAgICBjaGFyKioJCS8qIGRlZl9zdHJpbmcgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhGcmVlRm9udFNldCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBpbnQgWEZvbnRzT2ZGb250U2V0KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBYRm9udFN0cnVjdCoqKgkvKiBmb250X3N0cnVjdF9saXN0ICovLAorICAgIGNoYXIqKioJCS8qIGZvbnRfbmFtZV9saXN0ICovCispOworCitleHRlcm4gY2hhciAqWEJhc2VGb250TmFtZUxpc3RPZkZvbnRTZXQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCispOworCitleHRlcm4gY2hhciAqWExvY2FsZU9mRm9udFNldCgKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhDb250ZXh0RGVwZW5kZW50RHJhd2luZygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhEaXJlY3Rpb25hbERlcGVuZGVudERyYXdpbmcoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCispOworCitleHRlcm4gQm9vbCBYQ29udGV4dHVhbERyYXdpbmcoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovCispOworCitleHRlcm4gWEZvbnRTZXRFeHRlbnRzICpYRXh0ZW50c09mRm9udFNldCgKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8KKyk7CisKK2V4dGVybiBpbnQgWG1iVGV4dEVzY2FwZW1lbnQoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gaW50IFh3Y1RleHRFc2NhcGVtZW50KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IHdjaGFyX3QqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogbnVtX3djaGFycyAqLworKTsKKworZXh0ZXJuIGludCBYdXRmOFRleHRFc2NhcGVtZW50KAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLworKTsKKworZXh0ZXJuIGludCBYbWJUZXh0RXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYd2NUZXh0RXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCB3Y2hhcl90KgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIG51bV93Y2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYdXRmOFRleHRFeHRlbnRzKAorICAgIFhGb250U2V0CQkvKiBmb250X3NldCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHRleHQgKi8sCisgICAgaW50CQkJLyogYnl0ZXNfdGV4dCAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9pbmtfcmV0dXJuICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2xvZ2ljYWxfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhtYlRleHRQZXJDaGFyRXh0ZW50cygKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGlua19leHRlbnRzX2J1ZmZlciAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogbG9naWNhbF9leHRlbnRzX2J1ZmZlciAqLywKKyAgICBpbnQJCQkvKiBidWZmZXJfc2l6ZSAqLywKKyAgICBpbnQqCQkvKiBudW1fY2hhcnMgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfaW5rX3JldHVybiAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogb3ZlcmFsbF9sb2dpY2FsX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYd2NUZXh0UGVyQ2hhckV4dGVudHMoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBpbmtfZXh0ZW50c19idWZmZXIgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGxvZ2ljYWxfZXh0ZW50c19idWZmZXIgKi8sCisgICAgaW50CQkJLyogYnVmZmVyX3NpemUgKi8sCisgICAgaW50KgkJLyogbnVtX2NoYXJzICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWHV0ZjhUZXh0UGVyQ2hhckV4dGVudHMoCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBpbmtfZXh0ZW50c19idWZmZXIgKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIGxvZ2ljYWxfZXh0ZW50c19idWZmZXIgKi8sCisgICAgaW50CQkJLyogYnVmZmVyX3NpemUgKi8sCisgICAgaW50KgkJLyogbnVtX2NoYXJzICovLAorICAgIFhSZWN0YW5nbGUqCQkvKiBvdmVyYWxsX2lua19yZXR1cm4gKi8sCisgICAgWFJlY3RhbmdsZSoJCS8qIG92ZXJhbGxfbG9naWNhbF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYkRyYXdUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIFhtYlRleHRJdGVtKgkvKiB0ZXh0X2l0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWHdjRHJhd1RleHQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgWHdjVGV4dEl0ZW0qCS8qIHRleHRfaXRlbXMgKi8sCisgICAgaW50CQkJLyogbml0ZW1zICovCispOworCitleHRlcm4gdm9pZCBYdXRmOERyYXdUZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIFhtYlRleHRJdGVtKgkvKiB0ZXh0X2l0ZW1zICovLAorICAgIGludAkJCS8qIG5pdGVtcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1iRHJhd1N0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFh3Y0RyYXdTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCispOworCitleHRlcm4gdm9pZCBYdXRmOERyYXdTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gdm9pZCBYbWJEcmF3SW1hZ2VTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBieXRlc190ZXh0ICovCispOworCitleHRlcm4gdm9pZCBYd2NEcmF3SW1hZ2VTdHJpbmcoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgWEZvbnRTZXQJCS8qIGZvbnRfc2V0ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovLAorICAgIF9YY29uc3Qgd2NoYXJfdCoJLyogdGV4dCAqLywKKyAgICBpbnQJCQkvKiBudW1fd2NoYXJzICovCispOworCitleHRlcm4gdm9pZCBYdXRmOERyYXdJbWFnZVN0cmluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYRm9udFNldAkJLyogZm9udF9zZXQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB0ZXh0ICovLAorICAgIGludAkJCS8qIGJ5dGVzX3RleHQgKi8KKyk7CisKK2V4dGVybiBYSU0gWE9wZW5JTSgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMqCS8qIHJkYiAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19uYW1lICovLAorICAgIGNoYXIqCQkJLyogcmVzX2NsYXNzICovCispOworCitleHRlcm4gU3RhdHVzIFhDbG9zZUlNKAorICAgIFhJTSAvKiBpbSAqLworKTsKKworZXh0ZXJuIGNoYXIgKlhHZXRJTVZhbHVlcygKKyAgICBYSU0gLyogaW0gKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIGNoYXIgKlhTZXRJTVZhbHVlcygKKyAgICBYSU0gLyogaW0gKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworZXh0ZXJuIERpc3BsYXkgKlhEaXNwbGF5T2ZJTSgKKyAgICBYSU0gLyogaW0gKi8KKyk7CisKK2V4dGVybiBjaGFyICpYTG9jYWxlT2ZJTSgKKyAgICBYSU0gLyogaW0qLworKTsKKworZXh0ZXJuIFhJQyBYQ3JlYXRlSUMoCisgICAgWElNIC8qIGltICovLCAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiB2b2lkIFhEZXN0cm95SUMoCisgICAgWElDIC8qIGljICovCispOworCitleHRlcm4gdm9pZCBYU2V0SUNGb2N1cygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhVbnNldElDRm9jdXMoCisgICAgWElDIC8qIGljICovCispOworCitleHRlcm4gd2NoYXJfdCAqWHdjUmVzZXRJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYbWJSZXNldElDKAorICAgIFhJQyAvKiBpYyAqLworKTsKKworZXh0ZXJuIGNoYXIgKlh1dGY4UmVzZXRJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiBjaGFyICpYU2V0SUNWYWx1ZXMoCisgICAgWElDIC8qIGljICovLCAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBjaGFyICpYR2V0SUNWYWx1ZXMoCisgICAgWElDIC8qIGljICovLCAuLi4KKykgX1hfU0VOVElORUwoMCk7CisKK2V4dGVybiBYSU0gWElNT2ZJQygKKyAgICBYSUMgLyogaWMgKi8KKyk7CisKK2V4dGVybiBCb29sIFhGaWx0ZXJFdmVudCgKKyAgICBYRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIFdpbmRvdwkvKiB3aW5kb3cgKi8KKyk7CisKK2V4dGVybiBpbnQgWG1iTG9va3VwU3RyaW5nKAorICAgIFhJQwkJCS8qIGljICovLAorICAgIFhLZXlQcmVzc2VkRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIGNoYXIqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ5dGVzX2J1ZmZlciAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1fcmV0dXJuICovLAorICAgIFN0YXR1cyoJCS8qIHN0YXR1c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWHdjTG9va3VwU3RyaW5nKAorICAgIFhJQwkJCS8qIGljICovLAorICAgIFhLZXlQcmVzc2VkRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIHdjaGFyX3QqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIHdjaGFyc19idWZmZXIgKi8sCisgICAgS2V5U3ltKgkJLyoga2V5c3ltX3JldHVybiAqLywKKyAgICBTdGF0dXMqCQkvKiBzdGF0dXNfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFh1dGY4TG9va3VwU3RyaW5nKAorICAgIFhJQwkJCS8qIGljICovLAorICAgIFhLZXlQcmVzc2VkRXZlbnQqCS8qIGV2ZW50ICovLAorICAgIGNoYXIqCQkvKiBidWZmZXJfcmV0dXJuICovLAorICAgIGludAkJCS8qIGJ5dGVzX2J1ZmZlciAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1fcmV0dXJuICovLAorICAgIFN0YXR1cyoJCS8qIHN0YXR1c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBYVmFOZXN0ZWRMaXN0IFhWYUNyZWF0ZU5lc3RlZExpc3QoCisgICAgaW50IC8qdW51c2VkKi8sIC4uLgorKSBfWF9TRU5USU5FTCgwKTsKKworLyogaW50ZXJuYWwgY29ubmVjdGlvbnMgZm9yIElNcyAqLworCitleHRlcm4gQm9vbCBYUmVnaXN0ZXJJTUluc3RhbnRpYXRlQ2FsbGJhY2soCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjKgkvKiByZGIgKi8sCisgICAgY2hhcioJCQkvKiByZXNfbmFtZSAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19jbGFzcyAqLywKKyAgICBYSURQcm9jCQkJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKworZXh0ZXJuIEJvb2wgWFVucmVnaXN0ZXJJTUluc3RhbnRpYXRlQ2FsbGJhY2soCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjKgkvKiByZGIgKi8sCisgICAgY2hhcioJCQkvKiByZXNfbmFtZSAqLywKKyAgICBjaGFyKgkJCS8qIHJlc19jbGFzcyAqLywKKyAgICBYSURQcm9jCQkJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKwordHlwZWRlZiB2b2lkICgqWENvbm5lY3Rpb25XYXRjaFByb2MpKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhQb2ludGVyCQkJLyogY2xpZW50X2RhdGEgKi8sCisgICAgaW50CQkJCS8qIGZkICovLAorICAgIEJvb2wJCQkvKiBvcGVuaW5nICovLAkgLyogb3BlbiBvciBjbG9zZSBmbGFnICovCisgICAgWFBvaW50ZXIqCQkJLyogd2F0Y2hfZGF0YSAqLyAvKiBvcGVuIHNldHMsIGNsb3NlIHVzZXMgKi8KKyk7CisgICAgCisKK2V4dGVybiBTdGF0dXMgWEludGVybmFsQ29ubmVjdGlvbk51bWJlcnMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50KioJCQkvKiBmZF9yZXR1cm4gKi8sCisgICAgaW50KgkJCS8qIGNvdW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIHZvaWQgWFByb2Nlc3NJbnRlcm5hbENvbm5lY3Rpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50CQkJCS8qIGZkICovCispOworCitleHRlcm4gU3RhdHVzIFhBZGRDb25uZWN0aW9uV2F0Y2goCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWENvbm5lY3Rpb25XYXRjaFByb2MJLyogY2FsbGJhY2sgKi8sCisgICAgWFBvaW50ZXIJCQkvKiBjbGllbnRfZGF0YSAqLworKTsKKworZXh0ZXJuIHZvaWQgWFJlbW92ZUNvbm5lY3Rpb25XYXRjaCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQ29ubmVjdGlvbldhdGNoUHJvYwkvKiBjYWxsYmFjayAqLywKKyAgICBYUG9pbnRlcgkJCS8qIGNsaWVudF9kYXRhICovCispOworCitleHRlcm4gdm9pZCBYU2V0QXV0aG9yaXphdGlvbigKKyAgICBjaGFyICoJCQkvKiBuYW1lICovLAorICAgIGludAkJCQkvKiBuYW1lbGVuICovLCAKKyAgICBjaGFyICoJCQkvKiBkYXRhICovLAorICAgIGludAkJCQkvKiBkYXRhbGVuICovCispOworCitleHRlcm4gaW50IF9YbWJ0b3djKAorICAgIHdjaGFyX3QgKgkJCS8qIHdzdHIgKi8sCisjaWZkZWYgSVNDCisgICAgY2hhciBjb25zdCAqCQkvKiBzdHIgKi8sCisgICAgc2l6ZV90CQkJLyogbGVuICovCisjZWxzZQorICAgIGNoYXIgKgkJCS8qIHN0ciAqLywKKyAgICBpbnQJCQkJLyogbGVuICovCisjZW5kaWYKKyk7CisKK2V4dGVybiBpbnQgX1h3Y3RvbWIoCisgICAgY2hhciAqCQkJLyogc3RyICovLAorICAgIHdjaGFyX3QJCQkvKiB3YyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YTElCX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliQ29uZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYkNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA4M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYkNvbmYuaApAQCAtMCwwICsxLDQwIEBACisvKiBpbmNsdWRlL1gxMS9YbGliQ29uZi5oLiAgR2VuZXJhdGVkIGZyb20gWGxpYkNvbmYuaC5pbiBieSBjb25maWd1cmUuICAqLworLyoKKyAqICRJZDogJAorICoKKyAqIENvcHlyaWdodCDCqSAyMDA1IEtlaXRoIFBhY2thcmQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KKyAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAorICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisgKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1hMSUJDT05GX0hfCisjZGVmaW5lIF9YTElCQ09ORl9IXworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgZXhwb3J0cyBkZWZpbmVzIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkKKyAqIHVzZSBYbGliaW50LmggYm90aCBpbnNpZGUgWGxpYiBhbmQgYnkgZXh0ZXJuYWwgbGlicmFyaWVzCisgKiBzdWNoIGFzIGV4dGVuc2lvbnMuCisgKi8KKworLyogVGhyZWFkaW5nIHN1cHBvcnQ/ICovCisjZGVmaW5lIFhUSFJFQURTIAorCisvKiBVc2UgbXVsdGktdGhyZWFkZWQgbGliYyBmdW5jdGlvbnM/ICovCisjZGVmaW5lIFhVU0VfTVRTQUZFX0FQSSAKKworI2VuZGlmIC8qIF9YTElCQ09ORl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYmludC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWGxpYmludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYWI3NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbGliaW50LmgKQEAgLTAsMCArMSwxMzI5IEBACisvKiAkWG9yZzogWGxpYmludC5oLHYgMS41IDIwMDEvMDIvMDkgMDI6MDM6MzggeG9yZ2N2cyBFeHAgJCAqLworCisvKgorCitDb3B5cmlnaHQgMTk4NCwgMTk4NSwgMTk4NywgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisvKiAkWEZyZWU4NjogeGMvbGliL1gxMS9YbGliaW50LmgsdiAzLjI3IDIwMDMvMDUvMjcgMjI6MjY6MjYgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1hMSUJJTlRfSF8KKyNkZWZpbmUgX1hMSUJJTlRfSF8gMQorCisvKgorICoJWGxpYmludC5oIC0gSGVhZGVyIGRlZmluaXRpb24gYW5kIHN1cHBvcnQgZmlsZSBmb3IgdGhlIGludGVybmFsCisgKglzdXBwb3J0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIEMgc3Vicm91dGluZSBpbnRlcmZhY2UKKyAqCWxpYnJhcnkgKFhsaWIpIHRvIHRoZSBYIFdpbmRvdyBTeXN0ZW0uCisgKgorICoJV2FybmluZywgdGhlcmUgYmUgZHJhZ29ucyBoZXJlLi4uLgorICovCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4JCS8qIHRvIGRlY2xhcmUgeEV2ZW50ICovCisjaW5jbHVkZSA8WDExL1hsaWJDb25mLmg+CS8qIGZvciBjb25maWd1cmVkIG9wdGlvbnMgbGlrZSBYVEhSRUFEUyAqLworCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgX1hGbHVzaCBfWEZsdXNoSXQKKyNlbmRpZgorCisvKgorICogSWYgeW91ciBCeXRlc1JlYWRhYmxlIGNvcnJlY3RseSBkZXRlY3RzIGJyb2tlbiBjb25uZWN0aW9ucywgdGhlbgorICogeW91IHNob3VsZCBOT1QgZGVmaW5lIFhDT05OX0NIRUNLX0ZSRVEuCisgKi8KKyNpZm5kZWYgWENPTk5fQ0hFQ0tfRlJFUQorI2RlZmluZSBYQ09OTl9DSEVDS19GUkVRIDI1NgorI2VuZGlmCisKK3N0cnVjdCBfWEdDCit7CisgICAgWEV4dERhdGEgKmV4dF9kYXRhOwkvKiBob29rIGZvciBleHRlbnNpb24gdG8gaGFuZyBkYXRhICovCisgICAgR0NvbnRleHQgZ2lkOwkvKiBwcm90b2NvbCBJRCBmb3IgZ3JhcGhpY3MgY29udGV4dCAqLworICAgIEJvb2wgcmVjdHM7CQkvKiBib29sZWFuOiBUUlVFIGlmIGNsaXBtYXNrIGlzIGxpc3Qgb2YgcmVjdGFuZ2xlcyAqLworICAgIEJvb2wgZGFzaGVzOwkvKiBib29sZWFuOiBUUlVFIGlmIGRhc2gtbGlzdCBpcyByZWFsbHkgYSBsaXN0ICovCisgICAgdW5zaWduZWQgbG9uZyBkaXJ0eTsvKiBjYWNoZSBkaXJ0eSBiaXRzICovCisgICAgWEdDVmFsdWVzIHZhbHVlczsJLyogc2hhZG93IHN0cnVjdHVyZSBvZiB2YWx1ZXMgKi8KK307CisKK3N0cnVjdCBfWERpc3BsYXkKK3sKKwlYRXh0RGF0YSAqZXh0X2RhdGE7CS8qIGhvb2sgZm9yIGV4dGVuc2lvbiB0byBoYW5nIGRhdGEgKi8KKwlzdHJ1Y3QgX1hGcmVlRnVuY3MgKmZyZWVfZnVuY3M7IC8qIGludGVybmFsIGZyZWUgZnVuY3Rpb25zICovCisJaW50IGZkOwkJCS8qIE5ldHdvcmsgc29ja2V0LiAqLworCWludCBjb25uX2NoZWNrZXI7ICAgICAgICAgLyogdWdseSB0aGluZyB1c2VkIGJ5IF9YRXZlbnRzUXVldWVkICovCisJaW50IHByb3RvX21ham9yX3ZlcnNpb247LyogbWFqLiB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KKwlpbnQgcHJvdG9fbWlub3JfdmVyc2lvbjsvKiBtaW5vciB2ZXJzaW9uIG9mIHNlcnZlcidzIFggcHJvdG9jb2wgKi8KKwljaGFyICp2ZW5kb3I7CQkvKiB2ZW5kb3Igb2YgdGhlIHNlcnZlciBoYXJkd2FyZSAqLworICAgICAgICBYSUQgcmVzb3VyY2VfYmFzZTsJLyogcmVzb3VyY2UgSUQgYmFzZSAqLworCVhJRCByZXNvdXJjZV9tYXNrOwkvKiByZXNvdXJjZSBJRCBtYXNrIGJpdHMgKi8KKwlYSUQgcmVzb3VyY2VfaWQ7CS8qIGFsbG9jYXRvciBjdXJyZW50IElEICovCisJaW50IHJlc291cmNlX3NoaWZ0OwkvKiBhbGxvY2F0b3Igc2hpZnQgdG8gY29ycmVjdCBiaXRzICovCisJWElEICgqcmVzb3VyY2VfYWxsb2MpKAkvKiBhbGxvY2F0b3IgZnVuY3Rpb24gKi8KKwkJc3RydWN0IF9YRGlzcGxheSoKKwkJKTsKKwlpbnQgYnl0ZV9vcmRlcjsJCS8qIHNjcmVlbiBieXRlIG9yZGVyLCBMU0JGaXJzdCwgTVNCRmlyc3QgKi8KKwlpbnQgYml0bWFwX3VuaXQ7CS8qIHBhZGRpbmcgYW5kIGRhdGEgcmVxdWlyZW1lbnRzICovCisJaW50IGJpdG1hcF9wYWQ7CQkvKiBwYWRkaW5nIHJlcXVpcmVtZW50cyBvbiBiaXRtYXBzICovCisJaW50IGJpdG1hcF9iaXRfb3JkZXI7CS8qIExlYXN0U2lnbmlmaWNhbnQgb3IgTW9zdFNpZ25pZmljYW50ICovCisJaW50IG5mb3JtYXRzOwkJLyogbnVtYmVyIG9mIHBpeG1hcCBmb3JtYXRzIGluIGxpc3QgKi8KKwlTY3JlZW5Gb3JtYXQgKnBpeG1hcF9mb3JtYXQ7CS8qIHBpeG1hcCBmb3JtYXQgbGlzdCAqLworCWludCB2bnVtYmVyOwkJLyogWGxpYidzIFggcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuICovCisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG9mIHRoZSBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgX1hTUUV2ZW50ICpoZWFkLCAqdGFpbDsJLyogSW5wdXQgZXZlbnQgcXVldWUuICovCisJaW50IHFsZW47CQkvKiBMZW5ndGggb2YgaW5wdXQgZXZlbnQgcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVxdWVzdF9yZWFkOyAvKiBzZXEgbnVtYmVyIG9mIGxhc3QgZXZlbnQgcmVhZCAqLworCXVuc2lnbmVkIGxvbmcgcmVxdWVzdDsJLyogc2VxdWVuY2UgbnVtYmVyIG9mIGxhc3QgcmVxdWVzdC4gKi8KKwljaGFyICpsYXN0X3JlcTsJCS8qIGJlZ2lubmluZyBvZiBsYXN0IHJlcXVlc3QsIG9yIGR1bW15ICovCisJY2hhciAqYnVmZmVyOwkJLyogT3V0cHV0IGJ1ZmZlciBzdGFydGluZyBhZGRyZXNzLiAqLworCWNoYXIgKmJ1ZnB0cjsJCS8qIE91dHB1dCBidWZmZXIgaW5kZXggcG9pbnRlci4gKi8KKwljaGFyICpidWZtYXg7CQkvKiBPdXRwdXQgYnVmZmVyIG1heGltdW0rMSBhZGRyZXNzLiAqLworCXVuc2lnbmVkIG1heF9yZXF1ZXN0X3NpemU7IC8qIG1heGltdW0gbnVtYmVyIDMyIGJpdCB3b3JkcyBpbiByZXF1ZXN0Ki8KKwlzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMgKmRiOworCWludCAoKnN5bmNoYW5kbGVyKSgJLyogU3luY2hyb25pemF0aW9uIGhhbmRsZXIgKi8KKwkJc3RydWN0IF9YRGlzcGxheSoKKwkJKTsKKwljaGFyICpkaXNwbGF5X25hbWU7CS8qICJob3N0OmRpc3BsYXkiIHN0cmluZyB1c2VkIG9uIHRoaXMgY29ubmVjdCovCisJaW50IGRlZmF1bHRfc2NyZWVuOwkvKiBkZWZhdWx0IHNjcmVlbiBmb3Igb3BlcmF0aW9ucyAqLworCWludCBuc2NyZWVuczsJCS8qIG51bWJlciBvZiBzY3JlZW5zIG9uIHRoaXMgc2VydmVyKi8KKwlTY3JlZW4gKnNjcmVlbnM7CS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBzY3JlZW5zICovCisJdW5zaWduZWQgbG9uZyBtb3Rpb25fYnVmZmVyOwkvKiBzaXplIG9mIG1vdGlvbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkgICAvKiBpbnRlcm5hbCBjb25uZWN0aW9uIGZsYWdzICovCisJaW50IG1pbl9rZXljb2RlOwkvKiBtaW5pbXVtIGRlZmluZWQga2V5Y29kZSAqLworCWludCBtYXhfa2V5Y29kZTsJLyogbWF4aW11bSBkZWZpbmVkIGtleWNvZGUgKi8KKwlLZXlTeW0gKmtleXN5bXM7CS8qIFRoaXMgc2VydmVyJ3Mga2V5c3ltcyAqLworCVhNb2RpZmllcktleW1hcCAqbW9kaWZpZXJtYXA7CS8qIFRoaXMgc2VydmVyJ3MgbW9kaWZpZXIga2V5bWFwICovCisJaW50IGtleXN5bXNfcGVyX2tleWNvZGU7LyogbnVtYmVyIG9mIHJvd3MgKi8KKwljaGFyICp4ZGVmYXVsdHM7CS8qIGNvbnRlbnRzIG9mIGRlZmF1bHRzIGZyb20gc2VydmVyICovCisJY2hhciAqc2NyYXRjaF9idWZmZXI7CS8qIHBsYWNlIHRvIGhhbmcgc2NyYXRjaCBidWZmZXIgKi8KKwl1bnNpZ25lZCBsb25nIHNjcmF0Y2hfbGVuZ3RoOwkvKiBsZW5ndGggb2Ygc2NyYXRjaCBidWZmZXIgKi8KKwlpbnQgZXh0X251bWJlcjsJCS8qIGV4dGVuc2lvbiBudW1iZXIgb24gdGhpcyBkaXNwbGF5ICovCisJc3RydWN0IF9YRXh0ZW4gKmV4dF9wcm9jczsgLyogZXh0ZW5zaW9ucyBpbml0aWFsaXplZCBvbiB0aGlzIGRpc3BsYXkgKi8KKwkvKgorCSAqIHRoZSBmb2xsb3dpbmcgY2FuIGJlIGZpeGVkIHNpemUsIGFzIHRoZSBwcm90b2NvbCBkZWZpbmVzIGhvdworCSAqIG11Y2ggYWRkcmVzcyBzcGFjZSBpcyBhdmFpbGFibGUuIAorCSAqIFdoaWxlIHRoaXMgY291bGQgYmUgZG9uZSB1c2luZyB0aGUgZXh0ZW5zaW9uIHZlY3RvciwgdGhlcmUKKwkgKiBtYXkgYmUgTUFOWSBldmVudHMgcHJvY2Vzc2VkLCBzbyBhIHNlYXJjaCB0aHJvdWdoIHRoZSBleHRlbnNpb24KKwkgKiBsaXN0IHRvIGZpbmQgdGhlIHJpZ2h0IHByb2NlZHVyZSBmb3IgZWFjaCBldmVudCBtaWdodCBiZQorCSAqIGV4cGVuc2l2ZSBpZiBtYW55IGV4dGVuc2lvbnMgYXJlIGJlaW5nIHVzZWQuCisJICovCisJQm9vbCAoKmV2ZW50X3ZlY1sxMjhdKSgJLyogdmVjdG9yIGZvciB3aXJlIHRvIGV2ZW50ICovCisJCURpc3BsYXkgKgkvKiBkcHkgKi8sCisJCVhFdmVudCAqCS8qIHJlICovLAorCQl4RXZlbnQgKgkvKiBldmVudCAqLworCQkpOworCVN0YXR1cyAoKndpcmVfdmVjWzEyOF0pKCAvKiB2ZWN0b3IgZm9yIGV2ZW50IHRvIHdpcmUgKi8KKwkJRGlzcGxheSAqCS8qIGRweSAqLywKKwkJWEV2ZW50ICoJLyogcmUgKi8sCisJCXhFdmVudCAqCS8qIGV2ZW50ICovCisJCSk7CisJS2V5U3ltIGxvY2tfbWVhbmluZzsJICAgLyogZm9yIFhMb29rdXBTdHJpbmcgKi8KKwlzdHJ1Y3QgX1hMb2NrSW5mbyAqbG9jazsgICAvKiBtdWx0aS10aHJlYWQgc3RhdGUsIGRpc3BsYXkgbG9jayAqLworCXN0cnVjdCBfWEludGVybmFsQXN5bmMgKmFzeW5jX2hhbmRsZXJzOyAvKiBmb3IgaW50ZXJuYWwgYXN5bmMgKi8KKwl1bnNpZ25lZCBsb25nIGJpZ3JlcV9zaXplOyAvKiBtYXggc2l6ZSBvZiBiaWcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgX1hMb2NrUHRycyAqbG9ja19mbnM7IC8qIHBvaW50ZXJzIHRvIHRocmVhZHMgZnVuY3Rpb25zICovCisJdm9pZCAoKmlkbGlzdF9hbGxvYykoCSAgIC8qIFhJRCBsaXN0IGFsbG9jYXRvciBmdW5jdGlvbiAqLworCQlEaXNwbGF5ICoJLyogZHB5ICovLAorCQlYSUQgKgkJLyogaWRzICovLAorCQlpbnQJCS8qIGNvdW50ICovCisJCSk7CisJLyogdGhpbmdzIGFib3ZlIHRoaXMgbGluZSBzaG91bGQgbm90IG1vdmUsIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSAqLworCXN0cnVjdCBfWEtleXRyYW5zICprZXlfYmluZGluZ3M7IC8qIGZvciBYTG9va3VwU3RyaW5nICovCisJRm9udCBjdXJzb3JfZm9udDsJICAgLyogZm9yIFhDcmVhdGVGb250Q3Vyc29yICovCisJc3RydWN0IF9YRGlzcGxheUF0b21zICphdG9tczsgLyogZm9yIFhJbnRlcm5BdG9tICovCisJdW5zaWduZWQgaW50IG1vZGVfc3dpdGNoOyAgLyoga2V5Ym9hcmQgZ3JvdXAgbW9kaWZpZXJzICovCisJdW5zaWduZWQgaW50IG51bV9sb2NrOyAgLyoga2V5Ym9hcmQgbnVtbG9jayBtb2RpZmllcnMgKi8KKwlzdHJ1Y3QgX1hDb250ZXh0REIgKmNvbnRleHRfZGI7IC8qIGNvbnRleHQgZGF0YWJhc2UgKi8KKwlCb29sICgqKmVycm9yX3ZlYykoCS8qIHZlY3RvciBmb3Igd2lyZSB0byBlcnJvciAqLworCQlEaXNwbGF5ICAgICAqCS8qIGRpc3BsYXkgKi8sCisJCVhFcnJvckV2ZW50ICoJLyogaGUgKi8sCisJCXhFcnJvciAgICAgICoJLyogd2UgKi8KKwkJKTsKKwkvKgorCSAqIFhjbXMgaW5mb3JtYXRpb24KKwkgKi8KKwlzdHJ1Y3QgeworCSAgIFhQb2ludGVyIGRlZmF1bHRDQ0NzOyAgLyogcG9pbnRlciB0byBhbiBhcnJheSBvZiBkZWZhdWx0IFhjbXNDQ0MgKi8KKwkgICBYUG9pbnRlciBjbGllbnRDbWFwczsgIC8qIHBvaW50ZXIgdG8gbGlua2VkIGxpc3Qgb2YgWGNtc0NtYXBSZWMgKi8KKwkgICBYUG9pbnRlciBwZXJWaXN1YWxJbnRlbnNpdHlNYXBzOworCQkJCSAgLyogbGlua2VkIGxpc3Qgb2YgWGNtc0ludGVuc2l0eU1hcCAqLworCX0gY21zOworCXN0cnVjdCBfWElNRmlsdGVyICppbV9maWx0ZXJzOworCXN0cnVjdCBfWFNRRXZlbnQgKnFmcmVlOyAvKiB1bmFsbG9jYXRlZCBldmVudCBxdWV1ZSBlbGVtZW50cyAqLworCXVuc2lnbmVkIGxvbmcgbmV4dF9ldmVudF9zZXJpYWxfbnVtOyAvKiBpbnNlcnRlZCBpbnRvIG5leHQgcXVldWUgZWx0ICovCisJc3RydWN0IF9YRXh0ZW4gKmZsdXNoZXM7IC8qIEZsdXNoIGhvb2tzICovCisJc3RydWN0IF9YQ29ubmVjdGlvbkluZm8gKmltX2ZkX2luZm87IC8qIF9YUmVnaXN0ZXJJbnRlcm5hbENvbm5lY3Rpb24gKi8KKwlpbnQgaW1fZmRfbGVuZ3RoOwkvKiBudW1iZXIgb2YgaW1fZmRfaW5mbyAqLworCXN0cnVjdCBfWENvbm5XYXRjaEluZm8gKmNvbm5fd2F0Y2hlcnM7IC8qIFhBZGRDb25uZWN0aW9uV2F0Y2ggKi8KKwlpbnQgd2F0Y2hlcl9jb3VudDsJLyogbnVtYmVyIG9mIGNvbm5fd2F0Y2hlcnMgKi8KKwlYUG9pbnRlciBmaWxlZGVzOwkvKiBzdHJ1Y3QgcG9sbGZkIGNhY2hlIGZvciBfWFdhaXRGb3JSZWFkYWJsZSAqLworCWludCAoKnNhdmVkc3luY2hhbmRsZXIpKCAvKiB1c2VyIHN5bmNoYW5kbGVyIHdoZW4gWGxpYiB1c3VycHMgKi8KKwkJRGlzcGxheSAqCS8qIGRweSAqLworCQkpOworCVhJRCByZXNvdXJjZV9tYXg7CS8qIGFsbG9jYXRvciBtYXggSUQgKi8KKwlpbnQgeGNtaXNjX29wY29kZTsJLyogbWFqb3Igb3Bjb2RlIGZvciBYQy1NSVNDICovCisJc3RydWN0IF9Ya2JJbmZvUmVjICp4a2JfaW5mbzsgLyogWEtCIGluZm8gKi8KKwlzdHJ1Y3QgX1h0cmFuc0Nvbm5JbmZvICp0cmFuc19jb25uOyAvKiB0cmFuc3BvcnQgY29ubmVjdGlvbiBvYmplY3QgKi8KKwlzdHJ1Y3QgX1gxMVhDQlByaXZhdGUgKnhjYjsgLyogWENCIGdsdWUgcHJpdmF0ZSBkYXRhICovCit9OworCisjZGVmaW5lIFhBbGxvY0lEcyhkcHksaWRzLG4pICgqKGRweSktPmlkbGlzdF9hbGxvYykoZHB5LGlkcyxuKQorCisvKgorICogZGVmaW5lIHRoZSBmb2xsb3dpbmcgaWYgeW91IHdhbnQgdGhlIERhdGEgbWFjcm8gdG8gYmUgYSBwcm9jZWR1cmUgaW5zdGVhZAorICovCisjaWZkZWYgQ1JBWQorI2RlZmluZSBEYXRhUm91dGluZUlzUHJvY2VkdXJlCisjZW5kaWYgLyogQ1JBWSAqLworCisjaWZuZGVmIF9YRVZFTlRfCisvKgorICogX1FFdmVudCBkYXRhdHlwZSBmb3IgdXNlIGluIGlucHV0IHF1ZXVlaW5nLgorICovCit0eXBlZGVmIHN0cnVjdCBfWFNRRXZlbnQKK3sKKyAgICBzdHJ1Y3QgX1hTUUV2ZW50ICpuZXh0OworICAgIFhFdmVudCBldmVudDsKKyAgICB1bnNpZ25lZCBsb25nIHFzZXJpYWxfbnVtOwkvKiBzbyBtdWx0aS10aHJlYWRlZCBjb2RlIGNhbiBmaW5kIG5ldyBvbmVzICovCit9IF9YUUV2ZW50OworI2VuZGlmCisKKyNpZmRlZiBYVEhSRUFEUwkJCS8qIGZvciB4UmVwbHkgKi8KKyNkZWZpbmUgTkVFRF9SRVBMSUVTCisjZW5kaWYKKworI2RlZmluZSBORUVEX0VWRU5UUworI2RlZmluZSBORUVEX1JFUExJRVMKKyNpbmNsdWRlIDxYMTEvWHByb3RvLmg+CisjaWZkZWYgX19zZ2kKKyNkZWZpbmUgX1NHSV9NUF9TT1VSQ0UgIC8qIHR1cm4gdGhpcyBvbiB0byBnZXQgTVAgc2FmZSBlcnJubyAqLworI2VuZGlmCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgX1hCQ09QWUZVTkMgX1hiY29weQorI2luY2x1ZGUgPFgxMS9YZnVuY3MuaD4KKyNpbmNsdWRlIDxYMTEvWG9zZGVmcy5oPgorCisvKiBVdGVrIGxlYXZlcyBrZXJuZWwgbWFjcm9zIGFyb3VuZCBpbiBpbmNsdWRlIGZpbGVzIChibGVhaCkgKi8KKyNpZmRlZiBkaXJ0eQorI3VuZGVmIGRpcnR5CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCisvKgorICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBjYW4gYmUgdXNlZCBmb3IgbG9ja2luZyByZXF1ZXN0cyBpbiBtdWx0aS10aHJlYWRlZAorICogYWRkcmVzcyBzcGFjZXMuCisgKi8KKyNpZmRlZiBYVEhSRUFEUworLyogQXV0aG9yOiBTdGVwaGVuIEdpbGRlYSwgTUlUIFggQ29uc29ydGl1bQorICoKKyAqIGRlY2xhcmF0aW9ucyBmb3IgQyBUaHJlYWRzIGxvY2tpbmcKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfTG9ja0luZm9SZWMgKkxvY2tJbmZvUHRyOworCisvKiBpbnRlcmZhY2VzIGZvciBsb2NraW5nLmMgKi8KK3N0cnVjdCBfWExvY2tQdHJzIHsKKyAgICAvKiB1c2VkIGJ5IGFsbCwgaW5jbHVkaW5nIGV4dGVuc2lvbnM7IGRvIG5vdCBtb3ZlICovCisgICAgdm9pZCAoKmxvY2tfZGlzcGxheSkoCisJCURpc3BsYXkgKmRweQorI2lmIGRlZmluZWQoWFRIUkVBRFNfV0FSTikgfHwgZGVmaW5lZChYVEhSRUFEU19GSUxFX0xJTkUpCisJCSwgY2hhciAqZmlsZQorCQksIGludCBsaW5lCisjZW5kaWYKKwkpOworICAgIHZvaWQgKCp1bmxvY2tfZGlzcGxheSkoCisJCURpc3BsYXkgKmRweQorI2lmIGRlZmluZWQoWFRIUkVBRFNfV0FSTikgfHwgZGVmaW5lZChYVEhSRUFEU19GSUxFX0xJTkUpCisJCSwgY2hhciAqZmlsZQorCQksIGludCBsaW5lCisjZW5kaWYKKwkpOworfTsKKworI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9YTElCSU5UXykKKyNkZWZpbmUgX1hDcmVhdGVNdXRleF9mbiAoKl9YQ3JlYXRlTXV0ZXhfZm5fcCkKKyNkZWZpbmUgX1hGcmVlTXV0ZXhfZm4gKCpfWEZyZWVNdXRleF9mbl9wKQorI2RlZmluZSBfWExvY2tNdXRleF9mbiAoKl9YTG9ja011dGV4X2ZuX3ApCisjZGVmaW5lIF9YVW5sb2NrTXV0ZXhfZm4gKCpfWFVubG9ja011dGV4X2ZuX3ApCisjZGVmaW5lIF9YZ2xvYmFsX2xvY2sgKCpfWGdsb2JhbF9sb2NrX3ApCisjZW5kaWYKKworLyogaW4gWGxpYkludC5jICovCitleHRlcm4gdm9pZCAoKl9YQ3JlYXRlTXV0ZXhfZm4pKAorICAgIExvY2tJbmZvUHRyIC8qIGxvY2sgKi8KKyk7CitleHRlcm4gdm9pZCAoKl9YRnJlZU11dGV4X2ZuKSgKKyAgICBMb2NrSW5mb1B0ciAvKiBsb2NrICovCispOworZXh0ZXJuIHZvaWQgKCpfWExvY2tNdXRleF9mbikoCisgICAgTG9ja0luZm9QdHIJLyogbG9jayAqLworI2lmIGRlZmluZWQoWFRIUkVBRFNfV0FSTikgfHwgZGVmaW5lZChYVEhSRUFEU19GSUxFX0xJTkUpCisgICAgLCBjaGFyICogLyogZmlsZSAqLworICAgICwgaW50IC8qIGxpbmUgKi8KKyNlbmRpZgorKTsKK2V4dGVybiB2b2lkICgqX1hVbmxvY2tNdXRleF9mbikoCisgICAgTG9ja0luZm9QdHIJLyogbG9jayAqLworI2lmIGRlZmluZWQoWFRIUkVBRFNfV0FSTikgfHwgZGVmaW5lZChYVEhSRUFEU19GSUxFX0xJTkUpCisgICAgLCBjaGFyICogLyogZmlsZSAqLworICAgICwgaW50IC8qIGxpbmUgKi8KKyNlbmRpZgorKTsKKworZXh0ZXJuIExvY2tJbmZvUHRyIF9YZ2xvYmFsX2xvY2s7CisKKyNpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorI2RlZmluZSBMb2NrRGlzcGxheShkKQkgICAgIGlmICgoZCktPmxvY2tfZm5zKSAoKihkKS0+bG9ja19mbnMtPmxvY2tfZGlzcGxheSkoKGQpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBVbmxvY2tEaXNwbGF5KGQpICAgICBpZiAoKGQpLT5sb2NrX2ZucykgKCooZCktPmxvY2tfZm5zLT51bmxvY2tfZGlzcGxheSkoKGQpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBfWExvY2tNdXRleChsb2NrKQkJaWYgKF9YTG9ja011dGV4X2ZuKSAoKl9YTG9ja011dGV4X2ZuKShsb2NrLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBfWFVubG9ja011dGV4KGxvY2spCWlmIChfWFVubG9ja011dGV4X2ZuKSAoKl9YVW5sb2NrTXV0ZXhfZm4pKGxvY2ssX19GSUxFX18sX19MSU5FX18pCisjZWxzZQorLyogdXNlZCBldmVyeXdoZXJlLCBzbyBtdXN0IGJlIGZhc3QgaWYgbm90IHVzaW5nIHRocmVhZHMgKi8KKyNkZWZpbmUgTG9ja0Rpc3BsYXkoZCkJICAgICBpZiAoKGQpLT5sb2NrX2ZucykgKCooZCktPmxvY2tfZm5zLT5sb2NrX2Rpc3BsYXkpKGQpCisjZGVmaW5lIFVubG9ja0Rpc3BsYXkoZCkgICAgIGlmICgoZCktPmxvY2tfZm5zKSAoKihkKS0+bG9ja19mbnMtPnVubG9ja19kaXNwbGF5KShkKQorI2RlZmluZSBfWExvY2tNdXRleChsb2NrKQkJaWYgKF9YTG9ja011dGV4X2ZuKSAoKl9YTG9ja011dGV4X2ZuKShsb2NrKQorI2RlZmluZSBfWFVubG9ja011dGV4KGxvY2spCWlmIChfWFVubG9ja011dGV4X2ZuKSAoKl9YVW5sb2NrTXV0ZXhfZm4pKGxvY2spCisjZW5kaWYKKyNkZWZpbmUgX1hDcmVhdGVNdXRleChsb2NrKQlpZiAoX1hDcmVhdGVNdXRleF9mbikgKCpfWENyZWF0ZU11dGV4X2ZuKShsb2NrKTsKKyNkZWZpbmUgX1hGcmVlTXV0ZXgobG9jaykJaWYgKF9YRnJlZU11dGV4X2ZuKSAoKl9YRnJlZU11dGV4X2ZuKShsb2NrKTsKKworI2Vsc2UgLyogWFRIUkVBRFMgKi8KKyNkZWZpbmUgTG9ja0Rpc3BsYXkoZGlzKQorI2RlZmluZSBfWExvY2tNdXRleChsb2NrKQorI2RlZmluZSBfWFVubG9ja011dGV4KGxvY2spCisjZGVmaW5lIFVubG9ja0Rpc3BsYXkoZGlzKQorI2RlZmluZSBfWENyZWF0ZU11dGV4KGxvY2spCisjZGVmaW5lIF9YRnJlZU11dGV4KGxvY2spCisjZW5kaWYKKworI2RlZmluZSBYZnJlZShwdHIpIGZyZWUoKHB0cikpCisKKy8qCisgKiBOb3RlIHRoYXQgc29tZSBtYWNoaW5lcyBkbyBub3QgcmV0dXJuIGEgdmFsaWQgcG9pbnRlciBmb3IgbWFsbG9jKDApLCBpbgorICogd2hpY2ggY2FzZSB3ZSBwcm92aWRlIGFuIGFsdGVybmF0ZSB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUKKyAqIGRlZmluZSBNQUxMT0NfMF9SRVRVUk5TX05VTEwuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUKKyAqIFhsaWIgY29kZSBleHBlY3RzIG1hbGxvYygwKSB0byByZXR1cm4gYSB2YWxpZCBwb2ludGVyIHRvIHN0b3JhZ2UuCisgKi8KKyNpZmRlZiBNQUxMT0NfMF9SRVRVUk5TX05VTEwKKworIyBkZWZpbmUgWG1hbGxvYyhzaXplKSBtYWxsb2MoKChzaXplKSA9PSAwID8gMSA6IChzaXplKSkpCisjIGRlZmluZSBYcmVhbGxvYyhwdHIsIHNpemUpIHJlYWxsb2MoKHB0ciksICgoc2l6ZSkgPT0gMCA/IDEgOiAoc2l6ZSkpKQorIyBkZWZpbmUgWGNhbGxvYyhuZWxlbSwgZWxzaXplKSBjYWxsb2MoKChuZWxlbSkgPT0gMCA/IDEgOiAobmVsZW0pKSwgKGVsc2l6ZSkpCisKKyNlbHNlCisKKyMgZGVmaW5lIFhtYWxsb2Moc2l6ZSkgbWFsbG9jKChzaXplKSkKKyMgZGVmaW5lIFhyZWFsbG9jKHB0ciwgc2l6ZSkgcmVhbGxvYygocHRyKSwgKHNpemUpKQorIyBkZWZpbmUgWGNhbGxvYyhuZWxlbSwgZWxzaXplKSBjYWxsb2MoKG5lbGVtKSwgKGVsc2l6ZSkpCisKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNkZWZpbmUgTE9DS0VEIDEKKyNkZWZpbmUgVU5MT0NLRUQgMAorCisjaWZuZGVmIEJVRlNJWkUKKyNkZWZpbmUgQlVGU0laRSAyMDQ4CQkJLyogWCBvdXRwdXQgYnVmZmVyIHNpemUuICovCisjZW5kaWYKKyNpZm5kZWYgUFRTUEVSQkFUQ0gKKyNkZWZpbmUgUFRTUEVSQkFUQ0ggMTAyNAkJLyogcG9pbnQgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBXTE5TUEVSQkFUQ0gKKyNkZWZpbmUgV0xOU1BFUkJBVENIIDUwCQkJLyogd2lkZSBsaW5lIGJhdGNoaW5nICovCisjZW5kaWYKKyNpZm5kZWYgWkxOU1BFUkJBVENICisjZGVmaW5lIFpMTlNQRVJCQVRDSCAxMDI0CQkvKiB0aGluIGxpbmUgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBXUkNUU1BFUkJBVENICisjZGVmaW5lIFdSQ1RTUEVSQkFUQ0ggMTAJCS8qIHdpZGUgbGluZSByZWN0YW5nbGUgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBaUkNUU1BFUkJBVENICisjZGVmaW5lIFpSQ1RTUEVSQkFUQ0ggMjU2CQkvKiB0aGluIGxpbmUgcmVjdGFuZ2xlIGJhdGNoaW5nICovCisjZW5kaWYKKyNpZm5kZWYgRlJDVFNQRVJCQVRDSAorI2RlZmluZSBGUkNUU1BFUkJBVENIIDI1NgkJLyogZmlsbGVkIHJlY3RhbmdsZSBiYXRjaGluZyAqLworI2VuZGlmCisjaWZuZGVmIEZBUkNTUEVSQkFUQ0gKKyNkZWZpbmUgRkFSQ1NQRVJCQVRDSCAyNTYJCS8qIGZpbGxlZCBhcmMgYmF0Y2hpbmcgKi8KKyNlbmRpZgorI2lmbmRlZiBDVVJTT1JGT05UCisjZGVmaW5lIENVUlNPUkZPTlQgImN1cnNvciIJCS8qIHN0YW5kYXJkIGN1cnNvciBmb250cyAqLworI2VuZGlmCisKKy8qCisgKiBEaXNwbGF5IGZsYWdzCisgKi8KKyNkZWZpbmUgWGxpYkRpc3BsYXlJT0Vycm9yCSgxTCA8PCAwKQorI2RlZmluZSBYbGliRGlzcGxheUNsb3NpbmcJKDFMIDw8IDEpCisjZGVmaW5lIFhsaWJEaXNwbGF5Tm9Ya2IJKDFMIDw8IDIpCisjZGVmaW5lIFhsaWJEaXNwbGF5UHJpdlN5bmMJKDFMIDw8IDMpCisjZGVmaW5lIFhsaWJEaXNwbGF5UHJvY0Nvbm5pCSgxTCA8PCA0KSAvKiBpbiBfWFByb2Nlc3NJbnRlcm5hbENvbm5lY3Rpb24gKi8KKyNkZWZpbmUgWGxpYkRpc3BsYXlSZWFkRXZlbnRzCSgxTCA8PCA1KSAvKiBpbiBfWFJlYWRFdmVudHMgKi8KKyNkZWZpbmUgWGxpYkRpc3BsYXlSZXBseQkoMUwgPDwgNSkgLyogaW4gX1hSZXBseSAqLworI2RlZmluZSBYbGliRGlzcGxheVdyaXRpbmcJKDFMIDw8IDYpIC8qIGluIF9YRmx1c2hJbnQsIF9YU2VuZCAqLworI2RlZmluZSBYbGliRGlzcGxheURmbHRSTURCICAgICAoMUwgPDwgNykgLyogbWFyayBpZiBSTSBkYiBmcm9tIFhHZXREZWZhdWx0ICovCisKKy8qCisgKiBYIFByb3RvY29sIHBhY2tldGl6aW5nIG1hY3Jvcy4KKyAqLworCisvKiAgIE5lZWQgdG8gc3RhcnQgcmVxdWVzdHMgb24gNjQgYml0IHdvcmQgYm91bmRhcmllcworICogICBvbiBhIENSQVkgY29tcHV0ZXIgc28gYWRkIGEgTm9PcCAoMTI3KSBpZiBuZWVkZWQuCisgKiAgIEEgY2hhcmFjdGVyIHBvaW50ZXIgb24gYSBDUkFZIGNvbXB1dGVyIHdpbGwgYmUgbm9uLXplcm8KKyAqICAgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQgNjEgYml0cyBvZiBpdCBpcyBub3QgcG9pbnRpbmcgdG8KKyAqICAgYSB3b3JkIGJvdW5kYXJ5LgorICovCisjaWZkZWYgV09SRDY0CisjZGVmaW5lIFdPUkQ2NEFMSUdOIGlmICgobG9uZylkcHktPmJ1ZnB0ciA+PiA2MSkge1wKKyAgICAgICAgICAgZHB5LT5sYXN0X3JlcSA9IGRweS0+YnVmcHRyO1wKKyAgICAgICAgICAgKihkcHktPmJ1ZnB0cikgICA9IFhfTm9PcGVyYXRpb247XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKzEpID0gIDA7XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKzIpID0gIDA7XAorICAgICAgICAgICAqKGRweS0+YnVmcHRyKzMpID0gIDE7XAorICAgICAgICAgICAgIGRweS0+cmVxdWVzdCsrO1wKKyAgICAgICAgICAgICBkcHktPmJ1ZnB0ciArPSA0O1wKKyAgICAgICAgIH0KKyNlbHNlIC8qIGVsc2UgZG9lcyBub3QgcmVxdWlyZSBhbGlnbm1lbnQgb24gNjQtYml0IGJvdW5kYXJpZXMgKi8KKyNkZWZpbmUgV09SRDY0QUxJR04KKyNlbmRpZiAvKiBXT1JENjQgKi8KKworCisvKgorICogR2V0UmVxIC0gR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBYIHJlcXVlc3QgcGFja2V0IGluIHRoZSBidWZmZXIgYW5kCisgKiByZXR1cm4gaXQuIAorICoKKyAqICJuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdCwgZS5nLiBDcmVhdGVQaXhtYXAsIE9wZW5Gb250LCBldGMuCisgKiAicmVxIiBpcyB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdCBwb2ludGVyLgorICoKKyAqLworCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBHZXRSZXEobmFtZSwgcmVxKSBcCisgICAgICAgIFdPUkQ2NEFMSUdOXAorCWlmICgoZHB5LT5idWZwdHIgKyBTSVpFT0YoeCMjbmFtZSMjUmVxKSkgPiBkcHktPmJ1Zm1heClcCisJCV9YRmx1c2goZHB5KTtcCisJcmVxID0gKHgjI25hbWUjI1JlcSAqKShkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKKwlyZXEtPnJlcVR5cGUgPSBYXyMjbmFtZTtcCisJcmVxLT5sZW5ndGggPSAoU0laRU9GKHgjI25hbWUjI1JlcSkpPj4yO1wKKwlkcHktPmJ1ZnB0ciArPSBTSVpFT0YoeCMjbmFtZSMjUmVxKTtcCisJZHB5LT5yZXF1ZXN0KysKKworI2Vsc2UgIC8qIG5vbi1BTlNJIEMgdXNlcyBlbXB0eSBjb21tZW50IGluc3RlYWQgb2YgIiMjIiBmb3IgdG9rZW4gY29uY2F0ZW5hdGlvbiAqLworI2RlZmluZSBHZXRSZXEobmFtZSwgcmVxKSBcCisgICAgICAgIFdPUkQ2NEFMSUdOXAorCWlmICgoZHB5LT5idWZwdHIgKyBTSVpFT0YoeC8qKi9uYW1lLyoqL1JlcSkpID4gZHB5LT5idWZtYXgpXAorCQlfWEZsdXNoKGRweSk7XAorCXJlcSA9ICh4LyoqL25hbWUvKiovUmVxICopKGRweS0+bGFzdF9yZXEgPSBkcHktPmJ1ZnB0cik7XAorCXJlcS0+cmVxVHlwZSA9IFhfLyoqL25hbWU7XAorCXJlcS0+bGVuZ3RoID0gKFNJWkVPRih4LyoqL25hbWUvKiovUmVxKSk+PjI7XAorCWRweS0+YnVmcHRyICs9IFNJWkVPRih4LyoqL25hbWUvKiovUmVxKTtcCisJZHB5LT5yZXF1ZXN0KysKKyNlbmRpZgorCisvKiBHZXRSZXFFeHRyYSBpcyB0aGUgc2FtZSBhcyBHZXRSZXEsIGJ1dCBhbGxvY2F0ZXMgIm4iIGFkZGl0aW9uYWwKKyAgIGJ5dGVzIGFmdGVyIHRoZSByZXF1ZXN0LiAibiIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQhICAqLworCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBHZXRSZXFFeHRyYShuYW1lLCBuLCByZXEpIFwKKyAgICAgICAgV09SRDY0QUxJR05cCisJaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4IyNuYW1lIyNSZXEpICsgbikgPiBkcHktPmJ1Zm1heClcCisJCV9YRmx1c2goZHB5KTtcCisJcmVxID0gKHgjI25hbWUjI1JlcSAqKShkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKKwlyZXEtPnJlcVR5cGUgPSBYXyMjbmFtZTtcCisJcmVxLT5sZW5ndGggPSAoU0laRU9GKHgjI25hbWUjI1JlcSkgKyBuKT4+MjtcCisJZHB5LT5idWZwdHIgKz0gU0laRU9GKHgjI25hbWUjI1JlcSkgKyBuO1wKKwlkcHktPnJlcXVlc3QrKworI2Vsc2UKKyNkZWZpbmUgR2V0UmVxRXh0cmEobmFtZSwgbiwgcmVxKSBcCisgICAgICAgIFdPUkQ2NEFMSUdOXAorCWlmICgoZHB5LT5idWZwdHIgKyBTSVpFT0YoeC8qKi9uYW1lLyoqL1JlcSkgKyBuKSA+IGRweS0+YnVmbWF4KVwKKwkJX1hGbHVzaChkcHkpO1wKKwlyZXEgPSAoeC8qKi9uYW1lLyoqL1JlcSAqKShkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKKwlyZXEtPnJlcVR5cGUgPSBYXy8qKi9uYW1lO1wKKwlyZXEtPmxlbmd0aCA9IChTSVpFT0YoeC8qKi9uYW1lLyoqL1JlcSkgKyBuKT4+MjtcCisJZHB5LT5idWZwdHIgKz0gU0laRU9GKHgvKiovbmFtZS8qKi9SZXEpICsgbjtcCisJZHB5LT5yZXF1ZXN0KysKKyNlbmRpZgorCisKKy8qCisgKiBHZXRSZXNSZXEgaXMgZm9yIHRob3NlIHJlcXVlc3RzIHRoYXQgaGF2ZSBhIHJlc291cmNlIElEIAorICogKFdpbmRvdywgUGl4bWFwLCBHQ29udGV4dCwgZXRjLikgYXMgdGhlaXIgc2luZ2xlIGFyZ3VtZW50LgorICogInJpZCIgaXMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLiAKKyAqLworCisjaWYgIWRlZmluZWQoVU5JWENQUCkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBHZXRSZXNSZXEobmFtZSwgcmlkLCByZXEpIFwKKyAgICAgICAgV09SRDY0QUxJR05cCisJaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4UmVzb3VyY2VSZXEpKSA+IGRweS0+YnVmbWF4KVwKKwkgICAgX1hGbHVzaChkcHkpO1wKKwlyZXEgPSAoeFJlc291cmNlUmVxICopIChkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKKwlyZXEtPnJlcVR5cGUgPSBYXyMjbmFtZTtcCisJcmVxLT5sZW5ndGggPSAyO1wKKwlyZXEtPmlkID0gKHJpZCk7XAorCWRweS0+YnVmcHRyICs9IFNJWkVPRih4UmVzb3VyY2VSZXEpO1wKKwlkcHktPnJlcXVlc3QrKworI2Vsc2UKKyNkZWZpbmUgR2V0UmVzUmVxKG5hbWUsIHJpZCwgcmVxKSBcCisgICAgICAgIFdPUkQ2NEFMSUdOXAorCWlmICgoZHB5LT5idWZwdHIgKyBTSVpFT0YoeFJlc291cmNlUmVxKSkgPiBkcHktPmJ1Zm1heClcCisJICAgIF9YRmx1c2goZHB5KTtcCisJcmVxID0gKHhSZXNvdXJjZVJlcSAqKSAoZHB5LT5sYXN0X3JlcSA9IGRweS0+YnVmcHRyKTtcCisJcmVxLT5yZXFUeXBlID0gWF8vKiovbmFtZTtcCisJcmVxLT5sZW5ndGggPSAyO1wKKwlyZXEtPmlkID0gKHJpZCk7XAorCWRweS0+YnVmcHRyICs9IFNJWkVPRih4UmVzb3VyY2VSZXEpO1wKKwlkcHktPnJlcXVlc3QrKworI2VuZGlmCisKKy8qCisgKiBHZXRFbXB0eVJlcSBpcyBmb3IgdGhvc2UgcmVxdWVzdHMgdGhhdCBoYXZlIG5vIGFyZ3VtZW50cworICogYXQgYWxsLiAKKyAqLworI2lmICFkZWZpbmVkKFVOSVhDUFApIHx8IGRlZmluZWQoQU5TSUNQUCkKKyNkZWZpbmUgR2V0RW1wdHlSZXEobmFtZSwgcmVxKSBcCisgICAgICAgIFdPUkQ2NEFMSUdOXAorCWlmICgoZHB5LT5idWZwdHIgKyBTSVpFT0YoeFJlcSkpID4gZHB5LT5idWZtYXgpXAorCSAgICBfWEZsdXNoKGRweSk7XAorCXJlcSA9ICh4UmVxICopIChkcHktPmxhc3RfcmVxID0gZHB5LT5idWZwdHIpO1wKKwlyZXEtPnJlcVR5cGUgPSBYXyMjbmFtZTtcCisJcmVxLT5sZW5ndGggPSAxO1wKKwlkcHktPmJ1ZnB0ciArPSBTSVpFT0YoeFJlcSk7XAorCWRweS0+cmVxdWVzdCsrCisjZWxzZQorI2RlZmluZSBHZXRFbXB0eVJlcShuYW1lLCByZXEpIFwKKyAgICAgICAgV09SRDY0QUxJR05cCisJaWYgKChkcHktPmJ1ZnB0ciArIFNJWkVPRih4UmVxKSkgPiBkcHktPmJ1Zm1heClcCisJICAgIF9YRmx1c2goZHB5KTtcCisJcmVxID0gKHhSZXEgKikgKGRweS0+bGFzdF9yZXEgPSBkcHktPmJ1ZnB0cik7XAorCXJlcS0+cmVxVHlwZSA9IFhfLyoqL25hbWU7XAorCXJlcS0+bGVuZ3RoID0gMTtcCisJZHB5LT5idWZwdHIgKz0gU0laRU9GKHhSZXEpO1wKKwlkcHktPnJlcXVlc3QrKworI2VuZGlmCisKKyNpZmRlZiBXT1JENjQKKyNkZWZpbmUgTWFrZUJpZ1JlcShyZXEsbikgXAorICAgIHsgXAorICAgIGNoYXIgX0JSZGF0WzRdOyBcCisgICAgdW5zaWduZWQgbG9uZyBfQlJsZW4gPSByZXEtPmxlbmd0aCAtIDE7IFwKKyAgICByZXEtPmxlbmd0aCA9IDA7IFwKKyAgICBtZW1jcHkoX0JSZGF0LCAoKGNoYXIgKilyZXEpICsgKF9CUmxlbiA8PCAyKSwgNCk7IFwKKyAgICBtZW1tb3ZlKCgoY2hhciAqKXJlcSkgKyA4LCAoKGNoYXIgKilyZXEpICsgNCwgX0JSbGVuIDw8IDIpOyBcCisgICAgbWVtY3B5KCgoY2hhciAqKXJlcSkgKyA0LCBfQlJkYXQsIDQpOyBcCisgICAgRGF0YTMyKGRweSwgKGxvbmcgKikmX0JSZGF0LCA0KTsgXAorICAgIH0KKyNlbHNlCisjaWZkZWYgTE9ORzY0CisjZGVmaW5lIE1ha2VCaWdSZXEocmVxLG4pIFwKKyAgICB7IFwKKyAgICBDQVJENjQgX0JSZGF0OyBcCisgICAgQ0FSRDMyIF9CUmxlbiA9IHJlcS0+bGVuZ3RoIC0gMTsgXAorICAgIHJlcS0+bGVuZ3RoID0gMDsgXAorICAgIF9CUmRhdCA9ICgoQ0FSRDMyICopcmVxKVtfQlJsZW5dOyBcCisgICAgbWVtbW92ZSgoKGNoYXIgKilyZXEpICsgOCwgKChjaGFyICopcmVxKSArIDQsIF9CUmxlbiA8PCAyKTsgXAorICAgICgoQ0FSRDMyICopcmVxKVsxXSA9IF9CUmxlbiArIG4gKyAyOyBcCisgICAgRGF0YTMyKGRweSwgJl9CUmRhdCwgNCk7IFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBNYWtlQmlnUmVxKHJlcSxuKSBcCisgICAgeyBcCisgICAgQ0FSRDMyIF9CUmRhdDsgXAorICAgIENBUkQzMiBfQlJsZW4gPSByZXEtPmxlbmd0aCAtIDE7IFwKKyAgICByZXEtPmxlbmd0aCA9IDA7IFwKKyAgICBfQlJkYXQgPSAoKENBUkQzMiAqKXJlcSlbX0JSbGVuXTsgXAorICAgIG1lbW1vdmUoKChjaGFyICopcmVxKSArIDgsICgoY2hhciAqKXJlcSkgKyA0LCBfQlJsZW4gPDwgMik7IFwKKyAgICAoKENBUkQzMiAqKXJlcSlbMV0gPSBfQlJsZW4gKyBuICsgMjsgXAorICAgIERhdGEzMihkcHksICZfQlJkYXQsIDQpOyBcCisgICAgfQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBTZXRSZXFMZW4ocmVxLG4sYmFkbGVuKSBcCisgICAgaWYgKChyZXEtPmxlbmd0aCArIG4pID4gKHVuc2lnbmVkKTY1NTM1KSB7IFwKKwlpZiAoZHB5LT5iaWdyZXFfc2l6ZSkgeyBcCisJICAgIE1ha2VCaWdSZXEocmVxLG4pIFwKKwl9IGVsc2UgeyBcCisJICAgIG4gPSBiYWRsZW47IFwKKwkgICAgcmVxLT5sZW5ndGggKz0gbjsgXAorCX0gXAorICAgIH0gZWxzZSBcCisJcmVxLT5sZW5ndGggKz0gbgorCisjZGVmaW5lIFN5bmNIYW5kbGUoKSBcCisJaWYgKGRweS0+c3luY2hhbmRsZXIpICgqZHB5LT5zeW5jaGFuZGxlcikoZHB5KQorCitleHRlcm4gdm9pZCBfWEZsdXNoR0NDYWNoZShEaXNwbGF5ICpkcHksIEdDIGdjKTsKKyNkZWZpbmUgRmx1c2hHQyhkcHksIGdjKSBcCisJaWYgKChnYyktPmRpcnR5KSBfWEZsdXNoR0NDYWNoZSgoZHB5KSwgKGdjKSkKKy8qCisgKiBEYXRhIC0gUGxhY2UgZGF0YSBpbiB0aGUgYnVmZmVyIGFuZCBwYWQgdGhlIGVuZCB0byBwcm92aWRlCisgKiAzMiBiaXQgd29yZCBhbGlnbm1lbnQuICBUcmFuc21pdCBpZiB0aGUgYnVmZmVyIGZpbGxzLgorICoKKyAqICJkcHkiIGlzIGEgcG9pbnRlciB0byBhIERpc3BsYXkuCisgKiAiZGF0YSIgaXMgYSBwaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlci4KKyAqICJsZW4iIGlzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyLgorICovCisjaWZuZGVmIERhdGFSb3V0aW5lSXNQcm9jZWR1cmUKKyNkZWZpbmUgRGF0YShkcHksIGRhdGEsIGxlbikge1wKKwlpZiAoZHB5LT5idWZwdHIgKyAobGVuKSA8PSBkcHktPmJ1Zm1heCkge1wKKwkJbWVtY3B5KGRweS0+YnVmcHRyLCBkYXRhLCAoaW50KWxlbik7XAorCQlkcHktPmJ1ZnB0ciArPSAoKGxlbikgKyAzKSAmIH4zO1wKKwl9IGVsc2VcCisJCV9YU2VuZChkcHksIGRhdGEsIGxlbik7XAorCX0KKyNlbmRpZiAvKiBEYXRhUm91dGluZUlzUHJvY2VkdXJlICovCisKKworLyogQWxsb2NhdGUgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLiAgTm8gcGFkZGluZyBpcyBkb25lLCBzbyBpZgorICogdGhlIGxlbmd0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LCB0aGUgY2FsbGVyIG11c3QgYmUKKyAqIGNhcmVmdWwgdG8gbGVhdmUgdGhlIGJ1ZmZlciBhbGlnbmVkIGFmdGVyIHNlbmRpbmcgdGhlCisgKiBjdXJyZW50IHJlcXVlc3QuCisgKgorICogInR5cGUiIGlzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIGJlaW5nIGFzc2lnbmVkIHRvLgorICogInB0ciIgaXMgdGhlIHBvaW50ZXIgYmVpbmcgYXNzaWduZWQgdG8uCisgKiAibiIgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZS4KKyAqCisgKiBFeGFtcGxlOiAKKyAqICAgIHhUZXh0RWx0ICplbHQ7CisgKiAgICBCdWZBbGxvYyAoeFRleHRFbHQgKiwgZWx0LCBuYnl0ZXMpCisgKi8KKworI2RlZmluZSBCdWZBbGxvYyh0eXBlLCBwdHIsIG4pIFwKKyAgICBpZiAoZHB5LT5idWZwdHIgKyAobikgPiBkcHktPmJ1Zm1heCkgXAorICAgICAgICBfWEZsdXNoIChkcHkpOyBcCisgICAgcHRyID0gKHR5cGUpIGRweS0+YnVmcHRyOyBcCisgICAgKHZvaWQpcHRyOyBcCisgICAgZHB5LT5idWZwdHIgKz0gKG4pOworCisjaWZkZWYgV09SRDY0CisjZGVmaW5lIERhdGExNihkcHksIGRhdGEsIGxlbikgX1hEYXRhMTYoZHB5LCAoc2hvcnQgKilkYXRhLCBsZW4pCisjZGVmaW5lIERhdGEzMihkcHksIGRhdGEsIGxlbikgX1hEYXRhMzIoZHB5LCAobG9uZyAqKWRhdGEsIGxlbikKKyNlbHNlCisjZGVmaW5lIERhdGExNihkcHksIGRhdGEsIGxlbikgRGF0YSgoZHB5KSwgKGNoYXIgKikoZGF0YSksIChsZW4pKQorI2RlZmluZSBfWFJlYWQxNlBhZChkcHksIGRhdGEsIGxlbikgX1hSZWFkUGFkKChkcHkpLCAoY2hhciAqKShkYXRhKSwgKGxlbikpCisjZGVmaW5lIF9YUmVhZDE2KGRweSwgZGF0YSwgbGVuKSBfWFJlYWQoKGRweSksIChjaGFyICopKGRhdGEpLCAobGVuKSkKKyNpZmRlZiBMT05HNjQKKyNkZWZpbmUgRGF0YTMyKGRweSwgZGF0YSwgbGVuKSBfWERhdGEzMihkcHksIChsb25nICopZGF0YSwgbGVuKQorZXh0ZXJuIGludCBfWERhdGEzMigKKwkgICAgIERpc3BsYXkgKmRweSwKKwkgICAgIHJlZ2lzdGVyIGxvbmcgKmRhdGEsCisJICAgICB1bnNpZ25lZCBsZW4KKyk7CitleHRlcm4gdm9pZCBfWFJlYWQzMigKKwkgICAgIERpc3BsYXkgKmRweSwKKwkgICAgIHJlZ2lzdGVyIGxvbmcgKmRhdGEsCisJICAgICBsb25nIGxlbgorKTsKKyNlbHNlCisjZGVmaW5lIERhdGEzMihkcHksIGRhdGEsIGxlbikgRGF0YSgoZHB5KSwgKGNoYXIgKikoZGF0YSksIChsZW4pKQorI2RlZmluZSBfWFJlYWQzMihkcHksIGRhdGEsIGxlbikgX1hSZWFkKChkcHkpLCAoY2hhciAqKShkYXRhKSwgKGxlbikpCisjZW5kaWYKKyNlbmRpZiAvKiBub3QgV09SRDY0ICovCisKKyNkZWZpbmUgUGFja0RhdGExNihkcHksZGF0YSxsZW4pIERhdGExNiAoZHB5LCBkYXRhLCBsZW4pCisjZGVmaW5lIFBhY2tEYXRhMzIoZHB5LGRhdGEsbGVuKSBEYXRhMzIgKGRweSwgZGF0YSwgbGVuKQorCisvKiBYbGliIG1hbnVhbCBpcyBib2d1cyAqLworI2RlZmluZSBQYWNrRGF0YShkcHksZGF0YSxsZW4pIFBhY2tEYXRhMTYgKGRweSwgZGF0YSwgbGVuKQorCisjZGVmaW5lIG1pbihhLGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgbWF4KGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIENJX05PTkVYSVNUQ0hBUihjcykgKCgoY3MpLT53aWR0aCA9PSAwKSAmJiBcCisJCQkgICAgICgoKGNzKS0+cmJlYXJpbmd8KGNzKS0+bGJlYXJpbmd8IFwKKwkJCSAgICAgICAoY3MpLT5hc2NlbnR8KGNzKS0+ZGVzY2VudCkgPT0gMCkpCisKKy8qIAorICogQ0lfR0VUX0NIQVJfSU5GT18xRCAtIHJldHVybiB0aGUgY2hhcmluZm8gc3RydWN0IGZvciB0aGUgaW5kaWNhdGVkIDhiaXQKKyAqIGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgaW4gdGhlIGNvbHVtbiBhbmQgZXhpc3RzLCB0aGVuIHJldHVybiB0aGUKKyAqIGFwcHJvcHJpYXRlIG1ldHJpY3MgKG5vdGUgdGhhdCBmb250cyB3aXRoIGNvbW1vbiBwZXItY2hhcmFjdGVyIG1ldHJpY3Mgd2lsbAorICogcmV0dXJuIG1pbl9ib3VuZHMpLiAgSWYgbm9uZSBvZiB0aGVzZSBob2xkIHRydWUsIHRyeSBhZ2FpbiB3aXRoIHRoZSBkZWZhdWx0CisgKiBjaGFyLgorICovCisjZGVmaW5lIENJX0dFVF9DSEFSX0lORk9fMUQoZnMsY29sLGRlZixjcykgXAoreyBcCisgICAgY3MgPSBkZWY7IFwKKyAgICBpZiAoY29sID49IGZzLT5taW5fY2hhcl9vcl9ieXRlMiAmJiBjb2wgPD0gZnMtPm1heF9jaGFyX29yX2J5dGUyKSB7IFwKKwlpZiAoZnMtPnBlcl9jaGFyID09IE5VTEwpIHsgXAorCSAgICBjcyA9ICZmcy0+bWluX2JvdW5kczsgXAorCX0gZWxzZSB7IFwKKwkgICAgY3MgPSAmZnMtPnBlcl9jaGFyWyhjb2wgLSBmcy0+bWluX2NoYXJfb3JfYnl0ZTIpXTsgXAorCSAgICBpZiAoQ0lfTk9ORVhJU1RDSEFSKGNzKSkgY3MgPSBkZWY7IFwKKwl9IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBDSV9HRVRfREVGQVVMVF9JTkZPXzFEKGZzLGNzKSBcCisgIENJX0dFVF9DSEFSX0lORk9fMUQgKGZzLCBmcy0+ZGVmYXVsdF9jaGFyLCBOVUxMLCBjcykKKworCisKKy8qCisgKiBDSV9HRVRfQ0hBUl9JTkZPXzJEIC0gcmV0dXJuIHRoZSBjaGFyaW5mbyBzdHJ1Y3QgZm9yIHRoZSBpbmRpY2F0ZWQgcm93IGFuZCAKKyAqIGNvbHVtbi4gIFRoaXMgaXMgdXNlZCBmb3IgZm9udHMgdGhhdCBoYXZlIG1vcmUgdGhhbiByb3cgemVyby4KKyAqLworI2RlZmluZSBDSV9HRVRfQ0hBUl9JTkZPXzJEKGZzLHJvdyxjb2wsZGVmLGNzKSBcCit7IFwKKyAgICBjcyA9IGRlZjsgXAorICAgIGlmIChyb3cgPj0gZnMtPm1pbl9ieXRlMSAmJiByb3cgPD0gZnMtPm1heF9ieXRlMSAmJiBcCisJY29sID49IGZzLT5taW5fY2hhcl9vcl9ieXRlMiAmJiBjb2wgPD0gZnMtPm1heF9jaGFyX29yX2J5dGUyKSB7IFwKKwlpZiAoZnMtPnBlcl9jaGFyID09IE5VTEwpIHsgXAorCSAgICBjcyA9ICZmcy0+bWluX2JvdW5kczsgXAorCX0gZWxzZSB7IFwKKwkgICAgY3MgPSAmZnMtPnBlcl9jaGFyWygocm93IC0gZnMtPm1pbl9ieXRlMSkgKiBcCisJCQkgICAgICAgIChmcy0+bWF4X2NoYXJfb3JfYnl0ZTIgLSBcCisJCQkJIGZzLT5taW5fY2hhcl9vcl9ieXRlMiArIDEpKSArIFwKKwkJCSAgICAgICAoY29sIC0gZnMtPm1pbl9jaGFyX29yX2J5dGUyKV07IFwKKwkgICAgaWYgKENJX05PTkVYSVNUQ0hBUihjcykpIGNzID0gZGVmOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorfQorCisjZGVmaW5lIENJX0dFVF9ERUZBVUxUX0lORk9fMkQoZnMsY3MpIFwKK3sgXAorICAgIHVuc2lnbmVkIGludCByID0gKGZzLT5kZWZhdWx0X2NoYXIgPj4gOCk7IFwKKyAgICB1bnNpZ25lZCBpbnQgYyA9IChmcy0+ZGVmYXVsdF9jaGFyICYgMHhmZik7IFwKKyAgICBDSV9HRVRfQ0hBUl9JTkZPXzJEIChmcywgciwgYywgTlVMTCwgY3MpOyBcCit9CisKKworI2lmZGVmIE1VU1RDT1BZCisKKy8qIGZvciB3aGVuIDMyLWJpdCBhbGlnbm1lbnQgaXMgbm90IGdvb2QgZW5vdWdoICovCisjZGVmaW5lIE9uZURhdGFDYXJkMzIoZHB5LGRzdGFkZHIsc3JjdmFyKSBcCisgIHsgZHB5LT5idWZwdHIgLT0gNDsgRGF0YTMyIChkcHksIChjaGFyICopICYoc3JjdmFyKSwgNCk7IH0KKworI2Vsc2UKKworLyogc3JjdmFyIG11c3QgYmUgYSB2YXJpYWJsZSBmb3IgbGFyZ2UgYXJjaGl0ZWN0dXJlIHZlcnNpb24gKi8KKyNkZWZpbmUgT25lRGF0YUNhcmQzMihkcHksZHN0YWRkcixzcmN2YXIpIFwKKyAgeyAqKENBUkQzMiAqKShkc3RhZGRyKSA9IChzcmN2YXIpOyB9CisKKyNlbmRpZiAvKiBNVVNUQ09QWSAqLworCit0eXBlZGVmIHN0cnVjdCBfWEludGVybmFsQXN5bmMgeworICAgIHN0cnVjdCBfWEludGVybmFsQXN5bmMgKm5leHQ7CisgICAgLyoKKyAgICAgKiBoYW5kbGVyIGFyZ3VtZW50czoKKyAgICAgKiByZXAgaXMgdGhlIGdlbmVyaWMgcmVwbHkgdGhhdCBjYXVzZWQgdGhpcyBoYW5kbGVyCisgICAgICogdG8gYmUgaW52b2tlZC4gIEl0IG11c3QgYWxzbyBiZSBwYXNzZWQgdG8gX1hHZXRBc3luY1JlcGx5LgorICAgICAqIGJ1ZiBhbmQgbGVuIGFyZSBvcGFxdWUgdmFsdWVzIHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8KKyAgICAgKiBfWEdldEFzeW5jUmVwbHkgb3IgX1hHZXRBc3luY0RhdGEuCisgICAgICogZGF0YSBpcyB0aGUgY2xvc3VyZSBzdG9yZWQgaW4gdGhpcyBzdHJ1Y3QuCisgICAgICogVGhlIGhhbmRsZXIgcmV0dXJucyBUcnVlIGlmZiBpdCBoYW5kbGVkIHRoaXMgcmVwbHkuCisgICAgICovCisgICAgQm9vbCAoKmhhbmRsZXIpKAorCQkgICAgRGlzcGxheSoJLyogZHB5ICovLAorCQkgICAgeFJlcGx5KgkvKiByZXAgKi8sCisJCSAgICBjaGFyKgkvKiBidWYgKi8sCisJCSAgICBpbnQJCS8qIGxlbiAqLywKKwkJICAgIFhQb2ludGVyCS8qIGRhdGEgKi8KKwkJICAgICk7CisgICAgWFBvaW50ZXIgZGF0YTsKK30gX1hBc3luY0hhbmRsZXI7CisKK3R5cGVkZWYgc3RydWN0IF9YQXN5bmNFU3RhdGUgeworICAgIHVuc2lnbmVkIGxvbmcgbWluX3NlcXVlbmNlX251bWJlcjsKKyAgICB1bnNpZ25lZCBsb25nIG1heF9zZXF1ZW5jZV9udW1iZXI7CisgICAgdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlOworICAgIHVuc2lnbmVkIGNoYXIgbWFqb3Jfb3Bjb2RlOworICAgIHVuc2lnbmVkIHNob3J0IG1pbm9yX29wY29kZTsKKyAgICB1bnNpZ25lZCBjaGFyIGxhc3RfZXJyb3JfcmVjZWl2ZWQ7CisgICAgaW50IGVycm9yX2NvdW50OworfSBfWEFzeW5jRXJyb3JTdGF0ZTsKKworZXh0ZXJuIHZvaWQgX1hEZXFBc3luY0hhbmRsZXIoRGlzcGxheSAqZHB5LCBfWEFzeW5jSGFuZGxlciAqaGFuZGxlcik7CisjZGVmaW5lIERlcUFzeW5jSGFuZGxlcihkcHksaGFuZGxlcikgeyBcCisgICAgaWYgKGRweS0+YXN5bmNfaGFuZGxlcnMgPT0gKGhhbmRsZXIpKSBcCisJZHB5LT5hc3luY19oYW5kbGVycyA9IChoYW5kbGVyKS0+bmV4dDsgXAorICAgIGVsc2UgXAorCV9YRGVxQXN5bmNIYW5kbGVyKGRweSwgaGFuZGxlcik7IFwKKyAgICB9CisKK3R5cGVkZWYgdm9pZCAoKkZyZWVGdW5jVHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqRnJlZU1vZG1hcFR5cGUpICgKKyAgICBYTW9kaWZpZXJLZXltYXAqCS8qIG1vZG1hcCAqLworKTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YRnJlZUZ1bmNzIHsKKyAgICBGcmVlRnVuY1R5cGUgYXRvbXM7CQkvKiBfWEZyZWVBdG9tVGFibGUgKi8KKyAgICBGcmVlTW9kbWFwVHlwZSBtb2RpZmllcm1hcDsJLyogWEZyZWVNb2RpZmllck1hcCAqLworICAgIEZyZWVGdW5jVHlwZSBrZXlfYmluZGluZ3M7CS8qIF9YRnJlZUtleUJpbmRpbmdzICovCisgICAgRnJlZUZ1bmNUeXBlIGNvbnRleHRfZGI7CS8qIF9YRnJlZUNvbnRleHREQiAqLworICAgIEZyZWVGdW5jVHlwZSBkZWZhdWx0Q0NDczsJLyogX1hjbXNGcmVlRGVmYXVsdENDQ3MgKi8KKyAgICBGcmVlRnVuY1R5cGUgY2xpZW50Q21hcHM7CS8qIF9YY21zRnJlZUNsaWVudENtYXBzICovCisgICAgRnJlZUZ1bmNUeXBlIGludGVuc2l0eU1hcHM7CS8qIF9YY21zRnJlZUludGVuc2l0eU1hcHMgKi8KKyAgICBGcmVlRnVuY1R5cGUgaW1fZmlsdGVyczsJLyogX1hGcmVlSU1GaWx0ZXJzICovCisgICAgRnJlZUZ1bmNUeXBlIHhrYjsJCS8qIF9Ya2JGcmVlSW5mbyAqLworfSBfWEZyZWVGdW5jUmVjOworCisvKiB0eXBlcyBmb3IgSW5pdEV4dC5jICovCit0eXBlZGVmIGludCAoKkNyZWF0ZUdDVHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCS8qIGdjICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqQ29weUdDVHlwZSkoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBHQwkJLyogZ2MgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpGbHVzaEdDVHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCS8qIGdjICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqRnJlZUdDVHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgR0MJCS8qIGdjICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqQ3JlYXRlRm9udFR5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFhGb250U3RydWN0KiAvKiBmcyAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovCispOworCit0eXBlZGVmIGludCAoKkZyZWVGb250VHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgWEZvbnRTdHJ1Y3QqIC8qIGZzICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8KKyk7CisKK3R5cGVkZWYgaW50ICgqQ2xvc2VEaXNwbGF5VHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgWEV4dENvZGVzKgkvKiBjb2RlcyAqLworKTsKKwordHlwZWRlZiBpbnQgKCpFcnJvclR5cGUpICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIHhFcnJvcioJLyogZXJyICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8sCisgICAgaW50KgkvKiByZXRfY29kZSAqLworKTsKKwordHlwZWRlZiBjaGFyKiAoKkVycm9yU3RyaW5nVHlwZSkgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkvKiBjb2RlICovLAorICAgIFhFeHRDb2RlcyoJLyogY29kZXMgKi8sCisgICAgY2hhcioJLyogYnVmZmVyICovLAorICAgIGludAkJLyogbmJ5dGVzICovCispOworCit0eXBlZGVmIHZvaWQgKCpQcmludEVycm9yVHlwZSkoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBYRXJyb3JFdmVudCogLyogZXYgKi8sCisgICAgdm9pZCoJLyogZnAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKkJlZm9yZUZsdXNoVHlwZSkoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBYRXh0Q29kZXMqCS8qIGNvZGVzICovLAorICAgIF9YY29uc3QgY2hhciogLyogZGF0YSAqLywKKyAgICBsb25nCS8qIGxlbiAqLworKTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YRXh0ZW4gewkJLyogcHJpdmF0ZSB0byBleHRlbnNpb24gbWVjaGFuaXNtICovCisJc3RydWN0IF9YRXh0ZW4gKm5leHQ7CQkvKiBuZXh0IGluIGxpc3QgKi8KKwlYRXh0Q29kZXMgY29kZXM7CQkvKiBwdWJsaWMgaW5mb3JtYXRpb24sIGFsbCBleHRlbnNpb24gdG9sZCAqLworCUNyZWF0ZUdDVHlwZSBjcmVhdGVfR0M7CQkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBHQyBjcmVhdGVkICovCisJQ29weUdDVHlwZSBjb3B5X0dDOwkJLyogcm91dGluZSB0byBjYWxsIHdoZW4gR0MgY29waWVkICovCisJRmx1c2hHQ1R5cGUgZmx1c2hfR0M7CQkvKiByb3V0aW5lIHRvIGNhbGwgd2hlbiBHQyBmbHVzaGVkICovCisJRnJlZUdDVHlwZSBmcmVlX0dDOwkJLyogcm91dGluZSB0byBjYWxsIHdoZW4gR0MgZnJlZWQgKi8KKwlDcmVhdGVGb250VHlwZSBjcmVhdGVfRm9udDsJLyogcm91dGluZSB0byBjYWxsIHdoZW4gRm9udCBjcmVhdGVkICovCisJRnJlZUZvbnRUeXBlIGZyZWVfRm9udDsJCS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIEZvbnQgZnJlZWQgKi8KKwlDbG9zZURpc3BsYXlUeXBlIGNsb3NlX2Rpc3BsYXk7CS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIGNvbm5lY3Rpb24gY2xvc2VkICovCisJRXJyb3JUeXBlIGVycm9yOwkJLyogd2hvIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMgKi8KKwlFcnJvclN0cmluZ1R5cGUgZXJyb3Jfc3RyaW5nOwkvKiByb3V0aW5lIHRvIHN1cHBseSBlcnJvciBzdHJpbmcgKi8KKwljaGFyICpuYW1lOwkJCS8qIG5hbWUgb2YgdGhpcyBleHRlbnNpb24gKi8KKwlQcmludEVycm9yVHlwZSBlcnJvcl92YWx1ZXM7CS8qIHJvdXRpbmUgdG8gc3VwcGx5IGVycm9yIHZhbHVlcyAqLworCUJlZm9yZUZsdXNoVHlwZSBiZWZvcmVfZmx1c2g7CS8qIHJvdXRpbmUgdG8gY2FsbCB3aGVuIHNlbmRpbmcgZGF0YSAqLworCXN0cnVjdCBfWEV4dGVuICpuZXh0X2ZsdXNoOwkvKiBuZXh0IGluIGxpc3Qgb2YgdGhvc2Ugd2l0aCBmbHVzaGVzICovCit9IF9YRXh0ZW5zaW9uOworCisvKiBleHRlbnNpb24gaG9va3MgKi8KKworI2lmZGVmIERhdGFSb3V0aW5lSXNQcm9jZWR1cmUKK2V4dGVybiB2b2lkIERhdGEoRGlzcGxheSAqZHB5LCBjaGFyICpkYXRhLCBsb25nIGxlbik7CisjZW5kaWYKK2V4dGVybiBpbnQgX1hFcnJvcigKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgeEVycm9yKgkvKiByZXAgKi8KKyk7CitleHRlcm4gaW50IF9YSU9FcnJvcigKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8KKyk7CitleHRlcm4gaW50ICgqX1hJT0Vycm9yRnVuY3Rpb24pKAorICAgIERpc3BsYXkqCS8qIGRweSAqLworKTsKK2V4dGVybiBpbnQgKCpfWEVycm9yRnVuY3Rpb24pKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgWEVycm9yRXZlbnQqCS8qIGVycm9yX2V2ZW50ICovCispOworZXh0ZXJuIHZvaWQgX1hFYXREYXRhKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBuICovCispOworZXh0ZXJuIGNoYXIgKl9YQWxsb2NTY3JhdGNoKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBuYnl0ZXMgKi8KKyk7CitleHRlcm4gY2hhciAqX1hBbGxvY1RlbXAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG5ieXRlcyAqLworKTsKK2V4dGVybiB2b2lkIF9YRnJlZVRlbXAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBjaGFyKgkJLyogYnVmICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbmJ5dGVzICovCispOworZXh0ZXJuIFZpc3VhbCAqX1hWSUR0b1Zpc3VhbCgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgVmlzdWFsSUQJLyogaWQgKi8KKyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfWFNldExhc3RSZXF1ZXN0UmVhZCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIHhHZW5lcmljUmVwbHkqCS8qIHJlcCAqLworKTsKK2V4dGVybiBpbnQgX1hHZXRIb3N0bmFtZSgKKyAgICBjaGFyKgkvKiBidWYgKi8sCisgICAgaW50CQkvKiBtYXhsZW4gKi8KKyk7CitleHRlcm4gU2NyZWVuICpfWFNjcmVlbk9mV2luZG93KAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBXaW5kb3cJLyogdyAqLworKTsKK2V4dGVybiBCb29sIF9YQXN5bmNFcnJvckhhbmRsZXIoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIHhSZXBseSoJLyogcmVwICovLAorICAgIGNoYXIqCS8qIGJ1ZiAqLywKKyAgICBpbnQJCS8qIGxlbiAqLywKKyAgICBYUG9pbnRlcgkvKiBkYXRhICovCispOworZXh0ZXJuIGNoYXIgKl9YR2V0QXN5bmNSZXBseSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgY2hhcioJLyogcmVwbGJ1ZiAqLywKKyAgICB4UmVwbHkqCS8qIHJlcCAqLywKKyAgICBjaGFyKgkvKiBidWYgKi8sCisgICAgaW50CQkvKiBsZW4gKi8sCisgICAgaW50CQkvKiBleHRyYSAqLywKKyAgICBCb29sCS8qIGRpc2NhcmQgKi8KKyk7CitleHRlcm4gdm9pZCBfWEdldEFzeW5jRGF0YSgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8sCisgICAgY2hhciAqCS8qIGRhdGEgKi8sCisgICAgY2hhciAqCS8qIGJ1ZiAqLywKKyAgICBpbnQJCS8qIGxlbiAqLywKKyAgICBpbnQJCS8qIHNraXAgKi8sCisgICAgaW50CQkvKiBkYXRhbGVuICovLAorICAgIGludAkJLyogZGlzY2FyZHRvdGFsICovCispOworZXh0ZXJuIHZvaWQgX1hTZXRTZXFTeW5jRnVuY3Rpb24oCisgICAgRGlzcGxheSoJLyogZHB5ICovCispOworZXh0ZXJuIHZvaWQgX1hGbHVzaCgKKyAgICBEaXNwbGF5KgkvKiBkcHkgKi8KKyk7CitleHRlcm4gaW50IF9YRXZlbnRzUXVldWVkKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBpbnQgCS8qIG1vZGUgKi8KKyk7CitleHRlcm4gdm9pZCBfWFJlYWRFdmVudHMoCisgICAgRGlzcGxheSoJLyogZHB5ICovCispOworZXh0ZXJuIGludCBfWFJlYWQoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIGNoYXIqCS8qIGRhdGEgKi8sCisgICAgbG9uZwkvKiBzaXplICovCispOworZXh0ZXJuIHZvaWQgX1hSZWFkUGFkKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICBjaGFyKgkvKiBkYXRhICovLAorICAgIGxvbmcJLyogc2l6ZSAqLworKTsKK2V4dGVybiB2b2lkIF9YU2VuZCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZGF0YSAqLywKKyAgICBsb25nCQkvKiBzaXplICovCispOworZXh0ZXJuIFN0YXR1cyBfWFJlcGx5KAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICB4UmVwbHkqCS8qIHJlcCAqLywKKyAgICBpbnQJCS8qIGV4dHJhICovLAorICAgIEJvb2wJLyogZGlzY2FyZCAqLworKTsKK2V4dGVybiB2b2lkIF9YRW5xKAorICAgIERpc3BsYXkqCS8qIGRweSAqLywKKyAgICB4RXZlbnQqCS8qIGV2ZW50ICovCispOworZXh0ZXJuIHZvaWQgX1hEZXEoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIF9YUUV2ZW50KgkvKiBwcmV2ICovLAorICAgIF9YUUV2ZW50KgkvKiBxZWx0ICovCispOworCitleHRlcm4gQm9vbCBfWFVua25vd25XaXJlRXZlbnQoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIFhFdmVudCoJLyogcmUgKi8sCisgICAgeEV2ZW50KgkvKiBldmVudCAqLworKTsKK2V4dGVybiBTdGF0dXMgX1hVbmtub3duTmF0aXZlRXZlbnQoCisgICAgRGlzcGxheSoJLyogZHB5ICovLAorICAgIFhFdmVudCoJLyogcmUgKi8sCisgICAgeEV2ZW50KgkvKiBldmVudCAqLworKTsKKworZXh0ZXJuIEJvb2wgX1hXaXJlVG9FdmVudChEaXNwbGF5ICpkcHksIFhFdmVudCAqcmUsIHhFdmVudCAqZXZlbnQpOworZXh0ZXJuIEJvb2wgX1hEZWZhdWx0V2lyZUVycm9yKERpc3BsYXkgKmRpc3BsYXksIFhFcnJvckV2ZW50ICpoZSwgeEVycm9yICp3ZSk7CitleHRlcm4gQm9vbCBfWFBvbGxmZENhY2hlSW5pdChEaXNwbGF5ICpkcHkpOworZXh0ZXJuIHZvaWQgX1hQb2xsZmRDYWNoZUFkZChEaXNwbGF5ICpkcHksIGludCBmZCk7CitleHRlcm4gdm9pZCBfWFBvbGxmZENhY2hlRGVsKERpc3BsYXkgKmRweSwgaW50IGZkKTsKK2V4dGVybiBYSUQgX1hBbGxvY0lEKERpc3BsYXkgKmRweSk7CitleHRlcm4gdm9pZCBfWEFsbG9jSURzKERpc3BsYXkgKmRweSwgWElEICppZHMsIGludCBjb3VudCk7CisKK2V4dGVybiBpbnQgX1hGcmVlRXh0RGF0YSgKKyAgICBYRXh0RGF0YSoJLyogZXh0ZW5zaW9uICovCispOworCitleHRlcm4gaW50ICgqWEVTZXRDcmVhdGVHQygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorCSAgICAgIEdDCQkJLyogZ2MgKi8sCisJICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKwkgICAgKQkJLyogcHJvYyAqLworKSkoCisgICAgRGlzcGxheSosIEdDLCBYRXh0Q29kZXMqCispOworCitleHRlcm4gaW50ICgqWEVTZXRDb3B5R0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8JICAgICAgCispKSgKKyAgICBEaXNwbGF5KiwgR0MsIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldEZsdXNoR0MoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgR0MJCQkvKiBnYyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8JICAgICAKKykpKAorICAgIERpc3BsYXkqLCBHQywgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0RnJlZUdDKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBpbnQgKCopICgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCisgICAgICAgICAgICApCQkvKiBwcm9jICovCSAgICAgCispKSgKKyAgICBEaXNwbGF5KiwgR0MsIFhFeHRDb2RlcyoKKyk7CisKK2V4dGVybiBpbnQgKCpYRVNldENyZWF0ZUZvbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEZvbnRTdHJ1Y3QqCQkvKiBmcyAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8gICAgCispKSgKKyAgICBEaXNwbGF5KiwgWEZvbnRTdHJ1Y3QqLCBYRXh0Q29kZXMqCispOworCitleHRlcm4gaW50ICgqWEVTZXRGcmVlRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBleHRlbnNpb24gKi8sCisgICAgaW50ICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRm9udFN0cnVjdCoJCS8qIGZzICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLyAgICAKKykpKAorICAgIERpc3BsYXkqLCBYRm9udFN0cnVjdCosIFhFeHRDb2RlcyoKKyk7IAorCitleHRlcm4gaW50ICgqWEVTZXRDbG9zZURpc3BsYXkoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8gICAgCispKSgKKyAgICBEaXNwbGF5KiwgWEV4dENvZGVzKgorKTsKKworZXh0ZXJuIGludCAoKlhFU2V0RXJyb3IoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIGludCAoKikgKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgeEVycm9yKgkJCS8qIGVyciAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisgICAgICAgICAgICAgIGludCoJCQkvKiByZXRfY29kZSAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLyAgICAKKykpKAorICAgIERpc3BsYXkqLCB4RXJyb3IqLCBYRXh0Q29kZXMqLCBpbnQqCispOworCitleHRlcm4gY2hhciogKCpYRVNldEVycm9yU3RyaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGV4dGVuc2lvbiAqLywKKyAgICBjaGFyKiAoKikgKAorCSAgICAgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgICAgaW50CQkJLyogY29kZSAqLywKKyAgICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLywKKyAgICAgICAgICAgICAgICBjaGFyKgkJCS8qIGJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgICBpbnQJCQkvKiBuYnl0ZXMgKi8KKyAgICAgICAgICAgICAgKQkJLyogcHJvYyAqLwkgICAgICAgCispKSgKKyAgICBEaXNwbGF5KiwgaW50LCBYRXh0Q29kZXMqLCBjaGFyKiwgaW50CispOworCitleHRlcm4gdm9pZCAoKlhFU2V0UHJpbnRFcnJvclZhbHVlcyAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXh0ZW5zaW9uICovLAorICAgIHZvaWQgKCopKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKwkgICAgICBYRXJyb3JFdmVudCoJCS8qIGV2ICovLAorCSAgICAgIHZvaWQqCQkJLyogZnAgKi8KKwkgICAgICkJCS8qIHByb2MgKi8KKykpKAorICAgIERpc3BsYXkqLCBYRXJyb3JFdmVudCosIHZvaWQqCispOworCitleHRlcm4gQm9vbCAoKlhFU2V0V2lyZVRvRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50CQkJLyogZXZlbnRfbnVtYmVyICovLAorICAgIEJvb2wgKCopICgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIHJlICovLAorICAgICAgICAgICAgICAgeEV2ZW50KgkJCS8qIGV2ZW50ICovCisgICAgICAgICAgICAgKQkJLyogcHJvYyAqLyAgICAKKykpKAorICAgIERpc3BsYXkqLCBYRXZlbnQqLCB4RXZlbnQqCispOworCitleHRlcm4gU3RhdHVzICgqWEVTZXRFdmVudFRvV2lyZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBldmVudF9udW1iZXIgKi8sCisgICAgU3RhdHVzICgqKSAoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRXZlbnQqCQkJLyogcmUgKi8sCisgICAgICAgICAgICAgIHhFdmVudCoJCQkvKiBldmVudCAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLyAgIAorKSkoCisgICAgRGlzcGxheSosIFhFdmVudCosIHhFdmVudCoKKyk7CisKK2V4dGVybiBCb29sICgqWEVTZXRXaXJlVG9FcnJvcigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBlcnJvcl9udW1iZXIgKi8sCisgICAgQm9vbCAoKikgKAorCSAgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisJICAgICAgIFhFcnJvckV2ZW50KgkJLyogaGUgKi8sCisJICAgICAgIHhFcnJvcioJCQkvKiB3ZSAqLworICAgICAgICAgICAgKQkJLyogcHJvYyAqLyAgIAorKSkoCisgICAgRGlzcGxheSosIFhFcnJvckV2ZW50KiwgeEVycm9yKgorKTsKKworZXh0ZXJuIHZvaWQgKCpYRVNldEJlZm9yZUZsdXNoKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIGVycm9yX251bWJlciAqLywKKyAgICB2b2lkICgqKSAoCisJICAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKwkgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisJICAgICAgIF9YY29uc3QgY2hhcioJCS8qIGRhdGEgKi8sCisJICAgICAgIGxvbmcJCQkvKiBsZW4gKi8KKyAgICAgICAgICAgICkJCS8qIHByb2MgKi8gICAKKykpKAorICAgIERpc3BsYXkqLCBYRXh0Q29kZXMqLCBfWGNvbnN0IGNoYXIqLCBsb25nCispOworCisvKiBpbnRlcm5hbCBjb25uZWN0aW9ucyBmb3IgSU1zICovCisKK3R5cGVkZWYgdm9pZCAoKl9YSW50ZXJuYWxDb25uZWN0aW9uUHJvYykoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50CQkJCS8qIGZkICovLAorICAgIFhQb2ludGVyCQkJLyogY2FsbF9kYXRhICovCispOworCisKK2V4dGVybiBTdGF0dXMgX1hSZWdpc3RlckludGVybmFsQ29ubmVjdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQJCQkJLyogZmQgKi8sCisgICAgX1hJbnRlcm5hbENvbm5lY3Rpb25Qcm9jCS8qIGNhbGxiYWNrICovLAorICAgIFhQb2ludGVyCQkJLyogY2FsbF9kYXRhICovCispOworCitleHRlcm4gdm9pZCBfWFVucmVnaXN0ZXJJbnRlcm5hbENvbm5lY3Rpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50CQkJCS8qIGZkICovCispOworCitleHRlcm4gdm9pZCBfWFByb2Nlc3NJbnRlcm5hbENvbm5lY3Rpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgc3RydWN0IF9YQ29ubmVjdGlvbkluZm8qCS8qIGNvbm5faW5mbyAqLworKTsKKworLyogRGlzcGxheSBzdHJ1Y3R1cmUgaGFzIHBvaW50ZXJzIHRvIHRoZXNlICovCisKK3N0cnVjdCBfWENvbm5lY3Rpb25JbmZvIHsJLyogaW5mbyBmcm9tIF9YUmVnaXN0ZXJJbnRlcm5hbENvbm5lY3Rpb24gKi8KKyAgICBpbnQgZmQ7CisgICAgX1hJbnRlcm5hbENvbm5lY3Rpb25Qcm9jIHJlYWRfY2FsbGJhY2s7CisgICAgWFBvaW50ZXIgY2FsbF9kYXRhOworICAgIFhQb2ludGVyICp3YXRjaF9kYXRhOwkvKiBzZXQvdXNlZCBieSBYQ29ubmVjdGlvbldhdGNoUHJvYyAqLworICAgIHN0cnVjdCBfWENvbm5lY3Rpb25JbmZvICpuZXh0OworfTsKKworc3RydWN0IF9YQ29ubldhdGNoSW5mbyB7CS8qIGluZm8gZnJvbSBYQWRkQ29ubmVjdGlvbldhdGNoICovCisgICAgWENvbm5lY3Rpb25XYXRjaFByb2MgZm47CisgICAgWFBvaW50ZXIgY2xpZW50X2RhdGE7CisgICAgc3RydWN0IF9YQ29ubldhdGNoSW5mbyAqbmV4dDsKK307CisKKyNpZmRlZiBfX1VOSVhPUzJfXworZXh0ZXJuIGNoYXIqIF9fWE9TMlJlZGlyUm9vdCgKKyAgICBjaGFyKgorKTsKKyNlbmRpZgorCitleHRlcm4gaW50IF9YVGV4dEhlaWdodCgKKyAgICBYRm9udFN0cnVjdCoJLyogZm9udF9zdHJ1Y3QgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJpbmcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiBpbnQgX1hUZXh0SGVpZ2h0MTYoCisgICAgWEZvbnRTdHJ1Y3QqCS8qIGZvbnRfc3RydWN0ICovLAorICAgIF9YY29uc3QgWENoYXIyYioJLyogc3RyaW5nICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCisjaWYgZGVmaW5lZChXSU4zMikKKworZXh0ZXJuIGludCBfWE9wZW5GaWxlKAorICAgIF9YY29uc3QgY2hhcioJLyogcGF0aCAqLywKKyAgICBpbnQJCQkvKiBmbGFncyAqLworKTsKKworZXh0ZXJuIGludCBfWE9wZW5GaWxlTW9kZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHBhdGggKi8sCisgICAgaW50CQkJLyogZmxhZ3MgKi8sCisgICAgbW9kZV90ICAgICAgICAgICAgICAvKiBtb2RlICovCispOworCitleHRlcm4gdm9pZCogX1hGb3BlbkZpbGUoCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXRoICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludCBfWEFjY2Vzc0ZpbGUoCisgICAgX1hjb25zdCBjaGFyKgkvKiBwYXRoICovCispOworI2Vsc2UKKyNkZWZpbmUgX1hPcGVuRmlsZShwYXRoLGZsYWdzKSBvcGVuKHBhdGgsZmxhZ3MpCisjZGVmaW5lIF9YT3BlbkZpbGVNb2RlKHBhdGgsZmxhZ3MsbW9kZSkgb3BlbihwYXRoLGZsYWdzLG1vZGUpCisjZGVmaW5lIF9YRm9wZW5GaWxlKHBhdGgsbW9kZSkgZm9wZW4ocGF0aCxtb2RlKQorI2VuZGlmCisKKy8qIEV2VG9XaXJlLmMgKi8KK2V4dGVybiBTdGF0dXMgX1hFdmVudFRvV2lyZShEaXNwbGF5ICpkcHksIFhFdmVudCAqcmUsIHhFdmVudCAqZXZlbnQpOworCitleHRlcm4gaW50IF9YRjg2TG9hZFF1ZXJ5TG9jYWxlRm9udCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogbmFtZSovLAorICAgIFhGb250U3RydWN0KioJLyogeGZwKi8sCisgICAgRm9udCoJCS8qIGZpZHAgKi8KKyk7CisKK2V4dGVybiB2b2lkIF9YUHJvY2Vzc1dpbmRvd0F0dHJpYnV0ZXMgKAorICAgIHJlZ2lzdGVyIERpc3BsYXkgKmRweSwKKyAgICB4Q2hhbmdlV2luZG93QXR0cmlidXRlc1JlcSAqcmVxLAorICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdmFsdWVtYXNrLAorICAgIHJlZ2lzdGVyIFhTZXRXaW5kb3dBdHRyaWJ1dGVzICphdHRyaWJ1dGVzKTsKKworZXh0ZXJuIGludCBfWERlZmF1bHRFcnJvcigKKyAgICAgICAgRGlzcGxheSAqZHB5LAorICAgICAgICBYRXJyb3JFdmVudCAqZXZlbnQpOworCitleHRlcm4gaW50IF9YRGVmYXVsdElPRXJyb3IoCisgICAgICAgIERpc3BsYXkgKmRweSk7CisKK2V4dGVybiB2b2lkIF9YU2V0Q2xpcFJlY3RhbmdsZXMgKAorICAgIHJlZ2lzdGVyIERpc3BsYXkgKmRweSwKKyAgICBHQyBnYywKKyAgICBpbnQgY2xpcF94X29yaWdpbiwgaW50IGNsaXBfeV9vcmlnaW4sCisgICAgWFJlY3RhbmdsZSAqcmVjdGFuZ2xlcywKKyAgICBpbnQgbiwKKyAgICBpbnQgb3JkZXJpbmcpOworCitTdGF0dXMgX1hHZXRXaW5kb3dBdHRyaWJ1dGVzKAorICAgIHJlZ2lzdGVyIERpc3BsYXkgKmRweSwKKyAgICBXaW5kb3cgdywKKyAgICBYV2luZG93QXR0cmlidXRlcyAqYXR0cik7CisKK2ludCBfWFB1dEJhY2tFdmVudCAoCisgICAgcmVnaXN0ZXIgRGlzcGxheSAqZHB5LCAKKyAgICByZWdpc3RlciBYRXZlbnQgKmV2ZW50KTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YTElCSU5UX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbG9jYWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMmY3YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hsb2NhbGUuaApAQCAtMCwwICsxLDYxIEBACisvKiAkWG9yZzogWGxvY2FsZS5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MzggeG9yZ2N2cyBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IDE5OTEsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworLyogJFhGcmVlODY6IHhjL2xpYi9YMTEvWGxvY2FsZS5oLHYgMS40IDIwMDEvMTIvMTQgMTk6NTQ6MDkgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWExPQ0FMRV9IXworI2RlZmluZSBfWExPQ0FMRV9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvWG9zZGVmcy5oPgorCisjaWZuZGVmIFhfTE9DQUxFCisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZWxzZQorCisjZGVmaW5lIExDX0FMTCAgICAgIDAKKyNkZWZpbmUgTENfQ09MTEFURSAgMQorI2RlZmluZSBMQ19DVFlQRSAgICAyCisjZGVmaW5lIExDX01PTkVUQVJZIDMKKyNkZWZpbmUgTENfTlVNRVJJQyAgNAorI2RlZmluZSBMQ19USU1FICAgICA1CisKK19YRlVOQ1BST1RPQkVHSU4KK2V4dGVybiBjaGFyICpfWHNldGxvY2FsZSgKKyAgICBpbnQgLyogY2F0ZWdvcnkgKi8sCisgICAgX1hjb25zdCBjaGFyKiAvKiBuYW1lICovCispOworX1hGVU5DUFJPVE9FTkQKKworI2RlZmluZSBzZXRsb2NhbGUgX1hzZXRsb2NhbGUKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZW5kaWYgLyogWF9MT0NBTEUgKi8KKworI2VuZGlmIC8qIF9YTE9DQUxFX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1htZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZmJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YbWQuaApAQCAtMCwwICsxLDIxMSBAQAorLyogJFhkb3RPcmc6ICQgKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL1htZC5oLHYgMy4xOHRzaSBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBYTURfSAorI2RlZmluZSBYTURfSCAxCisvKiAkWG9yZzogWG1kLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyMiB4b3JnY3ZzIEV4cCAkICovCisvKgorICogIFhtZC5oOiBNQUNISU5FIERFUEVOREVOVCBERUNMQVJBVElPTlMuCisgKi8KKworLyoKKyAqIFNwZWNpYWwgcGVyLW1hY2hpbmUgY29uZmlndXJhdGlvbiBmbGFncy4KKyAqLworI2lmIGRlZmluZWQoc3VuKSAmJiBkZWZpbmVkKF9fU1ZSNCkKKyMgaW5jbHVkZSA8c3lzL2lzYV9kZWZzLmg+IC8qIFNvbGFyaXM6IGRlZmluZXMgX0xQNjQgaWYgbmVjZXNzYXJ5ICovCisjZW5kaWYKKworI2lmZGVmIENSQVkKKyNkZWZpbmUgV09SRDY0CQkJCS8qIDY0LWJpdCBhcmNoaXRlY3R1cmUgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQgKF9MUDY0KSB8fCBcCisgICAgZGVmaW5lZChfX2FscGhhKSB8fCBkZWZpbmVkKF9fYWxwaGFfXykgfHwgXAorICAgIGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoaWE2NCkgfHwgXAorICAgIGRlZmluZWQoX19zcGFyYzY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9fczM5MHhfXykgfHwgXAorICAgIChkZWZpbmVkKF9faHBwYV9fKSAmJiBkZWZpbmVkKF9fTFA2NF9fKSkgfHwgXAorICAgIGRlZmluZWQoX19hbWQ2NF9fKSB8fCBkZWZpbmVkKGFtZDY0KSB8fCBcCisgICAgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBcCisgICAgKGRlZmluZWQoc2dpKSAmJiAoX01JUFNfU1pMT05HID09IDY0KSkKKyNkZWZpbmUgTE9ORzY0CQkJCS8qIDMyLzY0LWJpdCBhcmNoaXRlY3R1cmUgKi8KKyNlbmRpZgorCisvKgorICogU3R1ZmYgdG8gaGFuZGxlIGxhcmdlIGFyY2hpdGVjdHVyZSBtYWNoaW5lczsgdGhlIGNvbnN0YW50cyB3ZXJlIGdlbmVyYXRlZAorICogb24gYSAzMi1iaXQgbWFjaGluZSBhbmQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBwcm90b2NvbC4KKyAqLworI2lmZGVmIFdPUkQ2NAorI2RlZmluZSBNVVNUQ09QWQorI2VuZGlmIC8qIFdPUkQ2NCAqLworCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIG1hY3JvIHVzZWQgdG8gc2V0IGNvbnN0YW50cyBmb3Igc2l6ZSBvZiBuZXR3b3JrIHN0cnVjdHVyZXM7CisgKiBtYWNoaW5lcyB3aXRoIHByZXByb2Nlc3NvcnMgdGhhdCBjYW4ndCBoYW5kbGUgYWxsIG9mIHRoZSBzel8gc3ltYm9scworICogY2FuIGRlZmluZSB0aGlzIG1hY3JvIHRvIGJlIHNpemVvZih4KSBpZiBhbmQgb25seSBpZiB0aGVpciBjb21waWxlciBkb2Vzbid0CisgKiBwYWQgb3V0IHN0cnVjdHVyZXMgKGVzcC4gdGhlIHhUZXh0RWx0IHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBvbmx5IHR3bworICogb25lLWJ5dGUgZmllbGRzKS4gIE5ldHdvcmsgc3RydWN0dXJlcyBzaG91bGQgYWx3YXlzIGRlZmluZSBzel9zeW1ib2xzLgorICoKKyAqIFRoZSBzel8gcHJlZml4IGlzIHVzZWQgaW5zdGVhZCBvZiBzb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZSBzbyB0aGF0IHRoZQorICogc3ltYm9scyBhcmUgbm8gbW9yZSB0aGFuIDMyIGNoYXJhY3RlcnMgbG9uZyAod2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvciBzb21lCisgKiBjb21waWxlcnMgYW5kIHByZXByb2Nlc3NvcnMpLgorICoKKyAqIFRoZSBleHRyYSBpbmRpcmVjdGlvbiBpbiB0aGUgX19TVERDX18gY2FzZSBpcyB0byBnZXQgbWFjcm8gYXJndW1lbnRzIHRvCisgKiBleHBhbmQgY29ycmVjdGx5IGJlZm9yZSB0aGUgY29uY2F0ZW5hdGlvbiwgcmF0aGVyIHRoYW4gYWZ0ZXJ3YXJkLgorICovCisjaWYgKChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpKSAmJiAhZGVmaW5lZChVTklYQ1BQKSkgfHwgZGVmaW5lZChBTlNJQ1BQKQorI2RlZmluZSBfU0laRU9GKHgpIHN6XyMjeAorI2RlZmluZSBTSVpFT0YoeCkgX1NJWkVPRih4KQorI2Vsc2UKKyNkZWZpbmUgU0laRU9GKHgpIHN6Xy8qKi94CisjZW5kaWYgLyogaWYgQU5TSSBDIGNvbXBpbGVyIGVsc2Ugbm90ICovCisKKy8qCisgKiBCaXRmaWVsZCBzdWZmaXhlcyBmb3IgdGhlIHByb3RvY29sIHN0cnVjdHVyZSBlbGVtZW50cywgaWYgeW91CisgKiBuZWVkIHRoZW0uICBOb3RlIHRoYXQgYml0ZmllbGRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBzaWduZWQKKyAqIChvciBldmVuIHVuc2lnbmVkKSBhY2NvcmRpbmcgdG8gQU5TSSBDLgorICovCisjaWZkZWYgV09SRDY0Cit0eXBlZGVmIGxvbmcgSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQ0FSRDY0OworI2RlZmluZSBCMzIgOjMyCisjZGVmaW5lIEIxNiA6MTYKKyNpZmRlZiBVTlNJR05FREJJVEZJRUxEUwordHlwZWRlZiB1bnNpZ25lZCBpbnQgSU5UMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBJTlQxNjsKKyNlbHNlCisjaWZkZWYgX19TVERDX18KK3R5cGVkZWYgc2lnbmVkIGludCBJTlQzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBJTlQxNjsKKyNlbHNlCit0eXBlZGVmIGludCBJTlQzMjsKK3R5cGVkZWYgaW50IElOVDE2OworI2VuZGlmCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIEIzMgorI2RlZmluZSBCMTYKKyNpZmRlZiBMT05HNjQKK3R5cGVkZWYgbG9uZyBJTlQ2NDsKK3R5cGVkZWYgaW50IElOVDMyOworI2Vsc2UKK3R5cGVkZWYgbG9uZyBJTlQzMjsKKyNlbmRpZgordHlwZWRlZiBzaG9ydCBJTlQxNjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChzZ2kpIHx8IGRlZmluZWQoX0FJWCkKK3R5cGVkZWYgc2lnbmVkIGNoYXIgICAgSU5UODsKKyNlbHNlCit0eXBlZGVmIGNoYXIgICAgICAgICAgIElOVDg7CisjZW5kaWYKKworI2lmZGVmIExPTkc2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIENBUkQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IENBUkQzMjsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgQ0FSRDMyOworI2VuZGlmCisjaWYgIWRlZmluZWQoV09SRDY0KSAmJiAhZGVmaW5lZChMT05HNjQpCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBDQVJENjQ7CisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgQ0FSRDE2OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBDQVJEODsKKwordHlwZWRlZiBDQVJEMzIJCUJJVFMzMjsKK3R5cGVkZWYgQ0FSRDE2CQlCSVRTMTY7CisKKyNpZm5kZWYgSV9ORUVEX09TMl9ICit0eXBlZGVmIENBUkQ4CQlCWVRFOwordHlwZWRlZiBDQVJEOAkJQk9PTDsKKyNlbHNlCisjZGVmaW5lIEJZVEUJQ0FSRDgKKyNkZWZpbmUgQk9PTAlDQVJEOAorI2VuZGlmCisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3Igc2lnbi1leHRlbmRpbmcgYml0ZmllbGRzIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzCisgKi8KKyNpZiBkZWZpbmVkKFdPUkQ2NCkgJiYgZGVmaW5lZChVTlNJR05FREJJVEZJRUxEUykKKyNkZWZpbmUgY3Z0SU5UOHRvSW50KHZhbCkgICAoKCh2YWwpICYgMHgwMDAwMDA4MCkgPyAoKHZhbCkgfCAweGZmZmZmZmZmZmZmZmZmMDApIDogKHZhbCkpCisjZGVmaW5lIGN2dElOVDE2dG9JbnQodmFsKSAgKCgodmFsKSAmIDB4MDAwMDgwMDApID8gKCh2YWwpIHwgMHhmZmZmZmZmZmZmZmYwMDAwKSA6ICh2YWwpKQorI2RlZmluZSBjdnRJTlQzMnRvSW50KHZhbCkgICgoKHZhbCkgJiAweDgwMDAwMDAwKSA/ICgodmFsKSB8IDB4ZmZmZmZmZmYwMDAwMDAwMCkgOiAodmFsKSkKKyNkZWZpbmUgY3Z0SU5UOHRvU2hvcnQodmFsKSAgY3Z0SU5UOHRvSW50KHZhbCkKKyNkZWZpbmUgY3Z0SU5UMTZ0b1Nob3J0KHZhbCkgY3Z0SU5UMTZ0b0ludCh2YWwpCisjZGVmaW5lIGN2dElOVDMydG9TaG9ydCh2YWwpIGN2dElOVDMydG9JbnQodmFsKQorI2RlZmluZSBjdnRJTlQ4dG9Mb25nKHZhbCkgIGN2dElOVDh0b0ludCh2YWwpCisjZGVmaW5lIGN2dElOVDE2dG9Mb25nKHZhbCkgY3Z0SU5UMTZ0b0ludCh2YWwpCisjZGVmaW5lIGN2dElOVDMydG9Mb25nKHZhbCkgY3Z0SU5UMzJ0b0ludCh2YWwpCisjZWxzZQorI2RlZmluZSBjdnRJTlQ4dG9JbnQodmFsKSAodmFsKQorI2RlZmluZSBjdnRJTlQxNnRvSW50KHZhbCkgKHZhbCkKKyNkZWZpbmUgY3Z0SU5UMzJ0b0ludCh2YWwpICh2YWwpCisjZGVmaW5lIGN2dElOVDh0b1Nob3J0KHZhbCkgKHZhbCkKKyNkZWZpbmUgY3Z0SU5UMTZ0b1Nob3J0KHZhbCkgKHZhbCkKKyNkZWZpbmUgY3Z0SU5UMzJ0b1Nob3J0KHZhbCkgKHZhbCkKKyNkZWZpbmUgY3Z0SU5UOHRvTG9uZyh2YWwpICh2YWwpCisjZGVmaW5lIGN2dElOVDE2dG9Mb25nKHZhbCkgKHZhbCkKKyNkZWZpbmUgY3Z0SU5UMzJ0b0xvbmcodmFsKSAodmFsKQorI2VuZGlmIC8qIFdPUkQ2NCBhbmQgVU5TSUdORURCSVRGSUVMRFMgKi8KKworCisKKyNpZmRlZiBNVVNUQ09QWQorLyoKKyAqIFRoaXMgbWFjcm8gbXVzdCBub3QgY2FzdCBvciBlbHNlIHBvaW50ZXJzIHdpbGwgZ2V0IGFsaWduZWQgYW5kIGJlIHdyb25nCisgKi8KKyNkZWZpbmUgTkVYVFBUUihwLHQpICAoKChjaGFyICopIHApICsgU0laRU9GKHQpKQorI2Vsc2UgLyogZWxzZSBub3QgTVVTVENPUFksIHRoaXMgaXMgdXNlZCBmb3IgMzItYml0IG1hY2hpbmVzICovCisvKgorICogdGhpcyB2ZXJzaW9uIHNob3VsZCBsZWF2ZSByZXN1bHQgb2YgdHlwZSAodCAqKSwgYnV0IHRoYXQgc2hvdWxkIG9ubHkgYmUKKyAqIHVzZWQgd2hlbiBub3QgaW4gTVVTVENPUFkKKyAqLworI2RlZmluZSBORVhUUFRSKHAsdCkgKCgodCAqKShwKSkgKyAxKQorI2VuZGlmIC8qIE1VU1RDT1BZIC0gdXNlZCBtYWNoaW5lcyB3aG9zZSBDIHN0cnVjdHMgZG9uJ3QgbGluZSB1cCB3aXRoIHByb3RvICovCisKKyNlbmRpZiAvKiBYTURfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmI5M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiAkWGRvdE9yZzogcHJvdG8vWDExL1hvcy5oLHYgMS44IDIwMDUvMTEvMDggMDY6MzM6MjUgamtqIEV4cCAkCisgKiAkWG9yZzogWG9zLmgsdiAxLjYgMjAwMS8wMi8wOSAwMjowMzoyMiB4b3JnY3ZzIEV4cCAkCisgKiAKKyAqIAorQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKgorICogVGhlIFggV2luZG93IFN5c3RlbSBpcyBhIFRyYWRlbWFyayBvZiBUaGUgT3BlbiBHcm91cC4KKyAqCisgKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL1hvcy5oLHYgMy40MXRzaSBFeHAgJCAqLworCisvKiBUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiB0aGluZ3MgdG8gdHJ5IGFuZCBtaW5pbWl6ZSBzeXN0ZW0gZGVwZW5kZW5jaWVzCisgKiBpbiBhICJzaWduaWZpY2FudCIgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcy4KKyAqLworCisjaWZuZGVmIF9YT1NfSF8KKyNkZWZpbmUgX1hPU19IXworCisjaW5jbHVkZSA8WDExL1hvc2RlZnMuaD4KKworLyoKKyAqIEdldCBtYWpvciBkYXRhIHR5cGVzIChlc3AuIGNhZGRyX3QpCisgKi8KKworI2lmZGVmIFVTRworI2lmbmRlZiBfX1RZUEVTX18KKyNpZmRlZiBDUkFZCisjZGVmaW5lIHdvcmQgd29yZF90CisjZW5kaWYgLyogQ1JBWSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJCS8qIGZvcmdvdCB0byBwcm90ZWN0IGl0Li4uICovCisjZGVmaW5lIF9fVFlQRVNfXworI2VuZGlmIC8qIF9fVFlQRVNfXyAqLworI2Vsc2UgLyogVVNHICovCisjaWYgZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiBkZWZpbmVkKE1PVE9ST0xBKQorI3VuZGVmIF9QT1NJWF9TT1VSQ0UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2Vsc2UKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNlbmRpZiAvKiBVU0cgKi8KKworI2lmbmRlZiBzZ2kKKyNpZiBkZWZpbmVkKF9fU0NPX18pIHx8IGRlZmluZWQoX19VTklYV0FSRV9fKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9TRVFVRU5UXworLyoKKyAqIGluX3N5c3RtLmggY29tcGF0aWJpbGl0eSBiZXR3ZWVuIFN5c1YgYW5kIEJTRCB0eXBlcyB1X2NoYXIgdV9zaG9ydCB1X2xvbmcKKyAqIHNlbGVjdC5oICBmb3IgdHlwZWRlZiBvZiBhcmdzIHRvIHNlbGVjdCwgZmRfc2V0LCBtYXkgdXNlIFNWUjQgbGF0ZXIKKyAqLworI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYgLyogX1NFUVVFTlRfICovCisKKy8qCisgKiBKdXN0IGFib3V0IGV2ZXJ5b25lIG5lZWRzIHRoZSBzdHJpbmdzIHJvdXRpbmVzLiAgV2UgcHJvdmlkZSBib3RoIGZvcm1zIGhlcmUsCisgKiBpbmRleC9yaW5kZXggYW5kIHN0cmNoci9zdHJyY2hyLCBzbyBhbnkgc3lzdGVtcyB0aGF0IGRvbid0IHByb3ZpZGUgdGhlbSBhbGwKKyAqIG5lZWQgdG8gaGF2ZSAjZGVmaW5lcyBoZXJlLgorICoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCB0aGlzIHdheSwgcmF0aGVyIHRoYW4sIGUuZy46CisgKiAgICAjZGVmaW5lZCBpbmRleChzLGMpIHN0cmNocihzLGMpCisgKiBiZWNhdXNlIHNvbWVvbmUgbWlnaHQgYmUgdXNpbmcgdGhlbSBhcyBmdW5jdGlvbiBwb2ludGVycywgYW5kIHN1Y2gKKyAqIGEgY2hhbmdlIHdvdWxkIGJyZWFrIGNvbXBhdGliaWxpdHkgZm9yIGFueW9uZSB3aG8ncyByZWx5aW5nIG9uIHRoZW0KKyAqIGJlaW5nIHRoZSB3YXkgdGhleSBjdXJyZW50bHkgYXJlLiBTbyB3ZSdyZSBzdHVjayB3aXRoIHRoZW0gdGhpcyB3YXksCisgKiB3aGljaCBjYW4gYmUgcmVhbGx5IGluY29udmVuaWVudC4gOi0oCisgKi8KKworI2lmbmRlZiBYX05PVF9TVERDX0VOVgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorI2lmIChkZWZpbmVkKHN1bikgJiYgZGVmaW5lZChfX1NWUjQpKQorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmZGVmIF9fU1REQ19fCisjaWZuZGVmIGluZGV4CisjZGVmaW5lIGluZGV4KHMsYykgKHN0cmNocigocyksKGMpKSkKKyNlbmRpZgorI2lmbmRlZiByaW5kZXgKKyNkZWZpbmUgcmluZGV4KHMsYykgKHN0cnJjaHIoKHMpLChjKSkpCisjZW5kaWYKKyNlbHNlCisjaWZuZGVmIGluZGV4CisjZGVmaW5lIGluZGV4IHN0cmNocgorI2VuZGlmCisjaWZuZGVmIHJpbmRleAorI2RlZmluZSByaW5kZXggc3RycmNocgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjZWxzZQorCisjaWZkZWYgU1lTVgorI2lmIGRlZmluZWQoY2xpcHBlcikgfHwgZGVmaW5lZChfX2NsaXBwZXJfXykKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBpbmRleCBzdHJjaHIKKyNkZWZpbmUgcmluZGV4IHN0cnJjaHIKKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2RlZmluZSBzdHJjaHIgaW5kZXgKKyNkZWZpbmUgc3RycmNociByaW5kZXgKKyNlbmRpZgorCisjZW5kaWYgLyogWF9OT1RfU1REQ19FTlYgKi8KKworLyoKKyAqIHN0cmVycm9yKCkKKyAqLworI2lmIChkZWZpbmVkKFhfTk9UX1NURENfRU5WKSB8fCAoZGVmaW5lZChzdW4pICYmICFkZWZpbmVkKFNWUjQpKSB8fCBkZWZpbmVkKG1hY0lJKSkgJiYgIWRlZmluZWQoX19HTElCQ19fKQorI2lmbmRlZiBzdHJlcnJvcgorZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107CitleHRlcm4gaW50IHN5c19uZXJyOworI2RlZmluZSBzdHJlcnJvcihuKSBcCisgICAgKCgobikgPj0gMCAmJiAobikgPCBzeXNfbmVycikgPyBzeXNfZXJybGlzdFtuXSA6ICJ1bmtub3duIGVycm9yIikKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBHZXQgb3BlbigyKSBjb25zdGFudHMKKyAqLworI2lmIGRlZmluZWQoWF9OT1RfUE9TSVgpCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpZiBkZWZpbmVkKFVTTCkgfHwgZGVmaW5lZChDUkFZKSB8fCBkZWZpbmVkKE1PVE9ST0xBKSB8fCAoZGVmaW5lZChpMzg2KSAmJiAoZGVmaW5lZChTWVNWKSB8fCBkZWZpbmVkKFNWUjQpKSkgfHwgZGVmaW5lZChfX3N4Z19fKQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxYMTEvWHczMmRlZnMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNlbmRpZgorI2Vsc2UgLyogWF9OT1RfUE9TSVggKi8KKyNpZiAhZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiBkZWZpbmVkKG1hY0lJKQorI2RlZmluZSBfUE9TSVhfU09VUkNFCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisjZWxzZQorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNlbmRpZiAvKiBYX05PVF9QT1NJWCBlbHNlICovCisKKy8qCisgKiBHZXQgc3RydWN0IHRpbWV2YWwgYW5kIHN0cnVjdCB0bQorICovCisKKyNpZiBkZWZpbmVkKFNZU1YpICYmICFkZWZpbmVkKF9TRVFVRU5UXykKKworI2lmbmRlZiBVU0wKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIENSQVkKKyN1bmRlZiB3b3JkCisjZW5kaWYgLyogQ1JBWSAqLworI2lmIGRlZmluZWQoVVNHKSAmJiAhZGVmaW5lZChDUkFZKSAmJiAhZGVmaW5lZChNT1RPUk9MQSkgJiYgIWRlZmluZWQodW5pb3N1KSAmJiAhZGVmaW5lZChfX3N4Z19fKSAmJiAhZGVmaW5lZChjbGlwcGVyKSAmJiAhZGVmaW5lZChfX2NsaXBwZXJfXykKK3N0cnVjdCB0aW1ldmFsIHsKKyAgICBsb25nIHR2X3NlYzsKKyAgICBsb25nIHR2X3VzZWM7Cit9OworI2lmbmRlZiBVU0xfU0hBUkVMSUIKK3N0cnVjdCB0aW1lem9uZSB7CisgICAgaW50IHR6X21pbnV0ZXN3ZXN0OworICAgIGludCB0el9kc3R0aW1lOworfTsKKyNlbmRpZiAvKiBVU0xfU0hBUkVMSUIgKi8KKyNlbmRpZiAvKiBVU0cgKi8KKworI2lmZGVmIF9TRVFVRU5UXworc3RydWN0IHRpbWV6b25lIHsKKyAgICBpbnQgdHpfbWludXRlc3dlc3Q7CisgICAgaW50IHR6X2RzdHRpbWU7Cit9OworI2VuZGlmIC8qIF9TRVFVRU5UXyAqLworCisjZWxzZSAvKiBub3QgU1lTViAqLworCisjaWYgZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiBkZWZpbmVkKFNWUjQpCisvKiBuZWVkIHRvIG9taXQgX1BPU0lYX1NPVVJDRSBpbiBvcmRlciB0byBnZXQgd2hhdCB3ZSB3YW50IGluIFNWUjQgKi8KKyN1bmRlZiBfUE9TSVhfU09VUkNFCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2VsaWYgZGVmaW5lZChXSU4zMikKKyNpbmNsdWRlIDx0aW1lLmg+CisjaWYgIWRlZmluZWQoX1dJTlNPQ0tBUElfKSAmJiAhZGVmaW5lZChfV0lMTFdJTlNPQ0tfKSAmJiAhZGVmaW5lZChfVElNRVZBTF9ERUZJTkVEKSAmJiAhZGVmaW5lZChfU1RSVUNUX1RJTUVWQUwpCitzdHJ1Y3QgdGltZXZhbCB7CisgICAgbG9uZyAgICB0dl9zZWM7ICAgICAgICAgLyogc2Vjb25kcyAqLworICAgIGxvbmcgICAgdHZfdXNlYzsgICAgICAgIC8qIGFuZCBtaWNyb3NlY29uZHMgKi8KK307CisjZGVmaW5lIF9USU1FVkFMX0RFRklORUQKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2RlZmluZSBnZXR0aW1lb2ZkYXkodCkgXAoreyBcCisgICAgc3RydWN0IF90aW1lYiBfZ3RvZHRtcDsgXAorICAgIF9mdGltZSAoJl9ndG9kdG1wKTsgXAorICAgICh0KS0+dHZfc2VjID0gX2d0b2R0bXAudGltZTsgXAorICAgICh0KS0+dHZfdXNlYyA9IF9ndG9kdG1wLm1pbGxpdG0gKiAxMDAwOyBcCit9CisjZWxpZiBkZWZpbmVkKF9TRVFVRU5UXykgfHwgZGVmaW5lZChMeW54KQorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbGlmIGRlZmluZWQgKF9fUU5YX18pCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZmRfbWFzazsKKy8qIE1ha2Ugc3VyZSB3ZSBnZXQgMjU2IGJpdCBzZWxlY3QgbWFza3MgKi8KKyNkZWZpbmUgRkRfU0VUU0laRSAyNTYKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmIC8qIGRlZmluZWQoX1BPU0lYX1NPVVJDRSkgJiYgZGVmaW5lZChTVlI0KSAqLworCisjZW5kaWYgLyogU1lTViAqLworCisvKiBkZWZpbmUgWF9HRVRUSU1FT0ZEQVkgbWFjcm8sIGEgcG9ydGFibGUgZ2V0dGltZW9mZGF5KCkgKi8KKyNpZiBkZWZpbmVkKF9YT1BFTl9YUEc0KSB8fCBkZWZpbmVkKF9YT1BFTl9VTklYKSAvKiBfWE9QRU5fVU5JWCBpcyBYUEc0LjIgKi8KKyNkZWZpbmUgWF9HRVRUSU1FT0ZEQVkodCkgZ2V0dGltZW9mZGF5KHQsIChzdHJ1Y3QgdGltZXpvbmUqKTApCisjZWxzZQorI2lmIGRlZmluZWQoU1ZSNCkgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoV0lOMzIpCisjZGVmaW5lIFhfR0VUVElNRU9GREFZKHQpIGdldHRpbWVvZmRheSh0KQorI2Vsc2UKKyNkZWZpbmUgWF9HRVRUSU1FT0ZEQVkodCkgZ2V0dGltZW9mZGF5KHQsIChzdHJ1Y3QgdGltZXpvbmUqKTApCisjZW5kaWYKKyNlbmRpZiAvKiBYUEc0IGVsc2UgKi8KKworI2lmZGVmIF9fVU5JWE9TMl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZmRfbWFzazsKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNkZWZpbmUgTUFYX1BBVEggX1BPU0lYX1BBVEhfTUFYCisjZW5kaWYKKworI2lmZGVmIF9fR05VX18KKyNkZWZpbmUgUEFUSF9NQVggNDA5NgorI2RlZmluZSBNQVhQQVRITEVOIDQwOTYKKyNkZWZpbmUgT1BFTl9NQVggMjU2IC8qIFdlIGRlZmluZSBhIHJlYXNvbmFibGUgbGltaXQuICAqLworI2VuZGlmCisKKy8qIHVzZSBQT1NJWCBuYW1lIGZvciBzaWduYWwgKi8KKyNpZiBkZWZpbmVkKFhfTk9UX1BPU0lYKSAmJiBkZWZpbmVkKFNZU1YpICYmICFkZWZpbmVkKFNJR0NITEQpICYmICFkZWZpbmVkKElTQykKKyNkZWZpbmUgU0lHQ0hMRCBTSUdDTEQKKyNlbmRpZgorCisjaWZkZWYgSVNDCisjaW5jbHVkZSA8c3lzL2JzZHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2xpbWl0cy5oPgorI2RlZmluZSBOR1JPVVBTIDE2CisjZW5kaWYKKworI2lmIGRlZmluZWQoSVNDKSB8fCBkZWZpbmVkKF9fVU5JWE9TMl9fKSB8fCBcCisgICAgKGRlZmluZWQoX19saW51eF9fKSAmJiAhZGVmaW5lZChfX0dMSUJDX18pKSB8fCBcCisgICAgKGRlZmluZWQoX19RTlhfXykgJiYgIWRlZmluZWQoVU5JWENPTk4pKQorLyoKKyAqCVNvbWUgT1MncyBtYXkgbm90IGhhdmUgdGhpcworICovCisKKyNkZWZpbmUgWF9OT19TWVNfVU4gMQorCitzdHJ1Y3Qgc29ja2FkZHJfdW4geworCXNob3J0CXN1bl9mYW1pbHk7CisJY2hhcglzdW5fcGF0aFsxMDhdOworfTsKKyNlbmRpZgorCisjaW5jbHVkZSA8WDExL1hhcmNoLmg+CisKKyNlbmRpZiAvKiBfWE9TX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3Nfci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zX3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTJiZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zX3IuaApAQCAtMCwwICsxLDExNjAgQEAKKy8qICRYb3JnOiBYb3Nfci5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjIgeG9yZ2N2cyBFeHAgJCAqLworLyogJFhkb3RPcmc6IHByb3RvL1gxMS9Yb3Nfci5oLHYgMS41IDIwMDUvMDcvMTMgMDc6MjM6NTYga2VpdGhwIEV4cCAkICovCisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvWG9zX3IuaCx2IDEuMTh0c2kgRXhwICQgKi8KKworLyoKKyAqIFZhcmlvdXMgYW5kIHN1bmRyeSBUaHJlYWQtU2FmZSBmdW5jdGlvbnMgdXNlZCBieSBYMTEsIE1vdGlmLCBhbmQgQ0RFLgorICoKKyAqIFVzZSB0aGlzIGZpbGUgaW4gTVQtc2FmZSBjb2RlIHdoZXJlIHlvdSB3b3VsZCBoYXZlIGluY2x1ZGVkCisgKgk8ZGlyZW50Lmg+CWZvciByZWFkZGlyKCkKKyAqCTxncnAuaD4JCWZvciBnZXRncmdpZCgpIG9yIGdldGdybmFtKCkKKyAqCTxuZXRkYi5oPglmb3IgZ2V0aG9zdGJ5bmFtZSgpLCBnZXRob3N0YnlhZGRyKCksIG9yIGdldHNlcnZieW5hbWUoKQorICoJPHB3ZC5oPgkJZm9yIGdldHB3bmFtKCkgb3IgZ2V0cHd1aWQoKQorICoJPHN0cmluZy5oPglmb3Igc3RydG9rKCkKKyAqCTx0aW1lLmg+CWZvciBhc2N0aW1lKCksIGN0aW1lKCksIGxvY2FsdGltZSgpLCBvciBnbXRpbWUoKQorICoJPHVuaXN0ZC5oPglmb3IgZ2V0bG9naW4oKSBvciB0dHluYW1lKCkKKyAqIG9yIHRoZWlyIHRocmVhZC1zYWZlIGFuYWxvZ3MuCisgKgorICogSWYgeW91IGFyZSBvbiBhIHBsYXRmb3JtIHRoYXQgZGVmaW5lcyBYVEhSRUFEUyBidXQgZG9lcyBub3QgaGF2ZQorICogTVQtc2FmZSBzeXN0ZW0gQVBJIChlLmcuIFVuaXhXYXJlKSB5b3UgbXVzdCBkZWZpbmUgX1hvc19wcm9jZXNzTG9jaworICogYW5kIF9Yb3NfcHJvY2Vzc1VubG9jayBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4gIElmCisgKiB5b3UgYXJlIG9uIE9TRi8xIFYzLjIgYW5kIHBsYW4gdG8gdXNlIHJlYWRkaXIoKSwgeW91IG11c3QgYWxzbyBkZWZpbmUKKyAqIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZC4gIEZvciBjb252ZW5pZW5jZSBYT1NfVVNFX1hMSUJfTE9DS0lORyBvcgorICogWE9TX1VTRV9YVF9MT0NLSU5HIG1heSBiZSBkZWZpbmVkIHRvIG9idGFpbiBlaXRoZXIgWGxpYi1vbmx5IG9yCisgKiBYdC1iYXNlZCB2ZXJzaW9ucyBvZiB0aGVzZSBtYWNyb3MuICBUaGVzZSBtYWNyb3Mgd29uJ3QgcmVzdWx0IGluCisgKiB0cnVseSB0aHJlYWQtc2FmZSBjYWxscywgYnV0IHRoZXkgYXJlIGJldHRlciB0aGFuIG5vdGhpbmcuICBJZiB5b3UKKyAqIGRvIG5vdCB3YW50IGxvY2tpbmcgaW4gdGhpcyBzaXR1YXRpb24gZGVmaW5lIFhPU19VU0VfTk9fTE9DS0lORy4KKyAqCisgKiBOT1RFOiBPbiBzeXN0ZW1zIGxhY2tpbmcgYXBwcm9wcmlhdGUgX3IgZnVuY3Rpb25zIEdldGhvc3RieW5hbWUoKSwKKyAqCUdldGhvc3RieWFkZHIoKSwgYW5kIEdldHNlcnZieW5hbWUoKSBkbyBOT1QgY29weSB0aGUgaG9zdCBvcgorICoJcHJvdG9jb2wgbGlzdHMhCisgKgorICogTk9URTogT24gc3lzdGVtcyBsYWNraW5nIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRncmdpZCgpIGFuZAorICoJR2V0Z3JuYW0oKSBkbyBOT1QgY29weSB0aGUgbGlzdCBvZiBncm91cCBtZW1iZXJzIQorICoKKyAqIFRoaXMgaGVhZGVyIGlzIG5vbWluYWxseSBpbnRlbmRlZCB0byBzaW1wbGlmeSBwb3J0aW5nIFgxMSwgTW90aWYsIGFuZAorICogQ0RFOyBpdCBtYXkgYmUgdXNlZnVsIHRvIG90aGVyIHBlb3BsZSB0b28uICBUaGUgc3RydWN0dXJlIGJlbG93IGlzCisgKiBjb21wbGljYXRlZCwgbW9zdGx5IGJlY2F1c2UgUDEwMDMuMWMgKHRoZSBJRUVFIFBPU0lYIFRocmVhZHMgc3BlYykKKyAqIHdlbnQgdGhyb3VnaCBsb3RzIG9mIGRyYWZ0cywgYW5kIHNvbWUgdmVuZG9ycyBzaGlwcGVkIHN5c3RlbXMgYmFzZWQKKyAqIG9uIGRyYWZ0IEFQSSB0aGF0IHdlcmUgY2hhbmdlZCBsYXRlci4gIFVuZm9ydHVuYXRlbHkgUE9TSVggZGlkIG5vdAorICogcHJvdmlkZSBhIGZlYXR1cmUtdGVzdCBtYWNybyBmb3IgZGlzdGluZ3Vpc2hpbmcgZWFjaCBvZiB0aGUgZHJhZnRzLgorICovCisKKy8qCisgKiBUaGlzIGhlYWRlciBoYXMgc2V2ZXJhbCBwYXJ0cy4gIFNlYXJjaCBmb3IgIkVmZmVjdGl2ZSBwcm90b3R5cGVzIgorICogdG8gbG9jYXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzZWN0aW9uLgorICovCisKKy8qIFRoaXMgaGVhZGVyIGNhbiBiZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBkZWZpbmVzISAqLworI2lmbmRlZiBfWE9TX1JfSF8KKyMgZGVmaW5lIF9YT1NfUl9IXworCisjIGluY2x1ZGUgPFgxMS9Yb3MuaD4KKyMgaW5jbHVkZSA8WDExL1hmdW5jcy5oPgorCisjIGlmbmRlZiBYX05PVF9QT1NJWAorIyAgaWZkZWYgX1BPU0lYX1NPVVJDRQorIyAgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgZWxzZQorIyAgIGRlZmluZSBfUE9TSVhfU09VUkNFCisjICAgaW5jbHVkZSA8bGltaXRzLmg+CisjICAgdW5kZWYgX1BPU0lYX1NPVVJDRQorIyAgZW5kaWYKKyMgIGlmbmRlZiBMSU5FX01BWAorIyAgIGRlZmluZSBYX0xJTkVfTUFYIDIwNDgKKyMgIGVsc2UKKyMgICBkZWZpbmUgWF9MSU5FX01BWCBMSU5FX01BWAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiBfWE9TX1JfSCAqLworCisjaWZuZGVmIFdJTjMyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworIyBpZiBkZWZpbmVkKFhPU19VU0VfWExJQl9MT0NLSU5HKQorIyAgaWZuZGVmIFhBbGxvY0lEcyAvKiBYbGliaW50LmggZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBpbmNsdWRlIHByb3RlY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IF9Mb2NrSW5mb1JlYyAqTG9ja0luZm9QdHI7CitleHRlcm4gTG9ja0luZm9QdHIgX1hnbG9iYWxfbG9jazsKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19pc1RocmVhZEluaXRpYWxpemVkCisjICAgZGVmaW5lIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAkoX1hnbG9iYWxfbG9jaykKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKFhUSFJFQURTX1dBUk4pIHx8IGRlZmluZWQoWFRIUkVBRFNfRklMRV9MSU5FKQorIyAgIGlmbmRlZiBYQWxsb2NJRHMgLyogWGxpYmludC5oIGRvZXMgbm90IGhhdmUgbXVsdGlwbGUgaW5jbHVkZSBwcm90ZWN0aW9uICovCisjICAgIGluY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CS8qIGZvciBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzICovCitleHRlcm4gdm9pZCAoKl9YTG9ja011dGV4X2ZuKSgKKyMgICAgaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIExvY2tJbmZvUHRyCS8qIGxvY2sgKi8sIGNoYXIgKiAvKiBmaWxlICovLCBpbnQgLyogbGluZSAqLworIyAgICBlbmRpZgorKTsKK2V4dGVybiB2b2lkICgqX1hVbmxvY2tNdXRleF9mbikoCisjICAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovLCBjaGFyICogLyogZmlsZSAqLywgaW50IC8qIGxpbmUgKi8KKyMgICAgZW5kaWYKKyk7CisjICAgZW5kaWYKKyMgICBpZm5kZWYgX1hvc19wcm9jZXNzTG9jaworIyAgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawlcCisgIChfWExvY2tNdXRleF9mbiA/ICgqX1hMb2NrTXV0ZXhfZm4pKF9YZ2xvYmFsX2xvY2ssX19GSUxFX18sX19MSU5FX18pIDogMCkKKyMgICBlbmRpZgorIyAgIGlmbmRlZiBfWG9zX3Byb2Nlc3NVbmxvY2sKKyMgICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc1VubG9jawlcCisgIChfWFVubG9ja011dGV4X2ZuID8gKCpfWFVubG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrLF9fRklMRV9fLF9fTElORV9fKSA6IDApCisjICAgZW5kaWYKKyMgIGVsc2UKKyMgICBpZm5kZWYgWEFsbG9jSURzIC8qIFhsaWJpbnQuaCBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIGluY2x1ZGUgcHJvdGVjdGlvbiAqLworIyAgICBpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgkvKiBmb3IgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQgKCpfWExvY2tNdXRleF9mbikoCisjICAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICBMb2NrSW5mb1B0cgkvKiBsb2NrICovCisjICAgIGVuZGlmCispOworZXh0ZXJuIHZvaWQgKCpfWFVubG9ja011dGV4X2ZuKSgKKyMgICAgaWYgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcworICAgIExvY2tJbmZvUHRyCS8qIGxvY2sgKi8KKyMgICAgZW5kaWYKKyk7CisjICAgZW5kaWYKKyMgICBpZm5kZWYgX1hvc19wcm9jZXNzTG9jaworIyAgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawlcCisgIChfWExvY2tNdXRleF9mbiA/ICgoKl9YTG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrKSwgMCkgOiAwKQorIyAgIGVuZGlmCisjICAgaWZuZGVmIF9Yb3NfcHJvY2Vzc1VubG9jaworIyAgICBkZWZpbmUgX1hvc19wcm9jZXNzVW5sb2NrCVwKKyAgKF9YVW5sb2NrTXV0ZXhfZm4gPyAoKCpfWFVubG9ja011dGV4X2ZuKShfWGdsb2JhbF9sb2NrKSwgMCkgOiAwKQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoWE9TX1VTRV9YVF9MT0NLSU5HKQorIyAgaWZuZGVmIF9YdFRocmVhZHNJX2gKK2V4dGVybiB2b2lkICgqX1h0UHJvY2Vzc0xvY2spKHZvaWQpOworIyAgZW5kaWYKKyMgIGlmbmRlZiBfWHRpbnRyaW5zaWNQX2gKKyMgICBpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgkvKiBmb3IgTmVlZEZ1bmN0aW9uUHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQgWHRQcm9jZXNzTG9jaygKKyMgICBpZiBOZWVkRnVuY3Rpb25Qcm90b3R5cGVzCisgICAgdm9pZAorIyAgIGVuZGlmCispOworZXh0ZXJuIHZvaWQgWHRQcm9jZXNzVW5sb2NrKAorIyAgIGlmIE5lZWRGdW5jdGlvblByb3RvdHlwZXMKKyAgICB2b2lkCisjICAgZW5kaWYKKyk7CisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAorIyAgIGRlZmluZSBfWG9zX2lzVGhyZWFkSW5pdGlhbGl6ZWQJX1h0UHJvY2Vzc0xvY2sKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19wcm9jZXNzTG9jaworIyAgIGRlZmluZSBfWG9zX3Byb2Nlc3NMb2NrCQlYdFByb2Nlc3NMb2NrKCkKKyMgIGVuZGlmCisjICBpZm5kZWYgX1hvc19wcm9jZXNzVW5sb2NrCisjICAgZGVmaW5lIF9Yb3NfcHJvY2Vzc1VubG9jawkJWHRQcm9jZXNzVW5sb2NrKCkKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChYT1NfVVNFX05PX0xPQ0tJTkcpCisjICBpZm5kZWYgX1hvc19pc1RocmVhZEluaXRpYWxpemVkCisjICAgZGVmaW5lIF9Yb3NfaXNUaHJlYWRJbml0aWFsaXplZAkwCisjICBlbmRpZgorIyAgaWZuZGVmIF9Yb3NfcHJvY2Vzc0xvY2sKKyMgICBkZWZpbmUgX1hvc19wcm9jZXNzTG9jawkJMAorIyAgZW5kaWYKKyMgIGlmbmRlZiBfWG9zX3Byb2Nlc3NVbmxvY2sKKyMgICBkZWZpbmUgX1hvc19wcm9jZXNzVW5sb2NrCQkwCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQgV0lOMzIgKi8KKworLyoKKyAqIFNvbGFyaXMgZGVmaW5lcyB0aGUgUE9TSVggdGhyZWFkLXNhZmUgZmVhdHVyZSB0ZXN0IG1hY3JvLCBidXQKKyAqIHVzZXMgdGhlIG9sZGVyIFNWUjQgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIHVubGVzcyB0aGUgUE9TSVggb25lcworICogYXJlIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQuICBGaXggdGhlIGZlYXR1cmUgdGVzdCBtYWNyby4KKyAqLworI2lmIGRlZmluZWQoc3VuKSAmJiBkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICYmIFwKKwkoX1BPU0lYX0NfU09VUkNFIC0gMCA8IDE5OTUwNkwpICYmICFkZWZpbmVkKF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUykKKyMgdW5kZWYgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworI2VuZGlmCisKKy8qCisgKiBMeW54T1MgMy4xIGRlZmluZXMgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUyBidXQKKyAqIGdldHB3dWlkX3IgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBkZWZpbmVkIGJ5IFBPU0lYCisgKi8KKyNpZiBkZWZpbmVkKEx5bngpICYmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykKKyMgdW5kZWYgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworI2VuZGlmCisKKworLyoqKioqIDxwd2QuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPHB3ZC5oPiB3cmFwcGVyczoKKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9QV0RfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hnZXRwd3BhcmFtczsKKyAqCisgKiBzdHJ1Y3QgcGFzc3dkKiBfWEdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUsIF9YZ2V0cHdwYXJhbXMpOworICogc3RydWN0IHBhc3N3ZCogX1hHZXRwd3VpZCh1aWRfdCB1aWQsIF9YZ2V0cHdwYXJhbXMpOworICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9QV0RfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9QV0RfSCkKKyMgaW5jbHVkZSA8cHdkLmg+CisjIGlmIGRlZmluZWQoWFVTRV9NVFNBRkVfQVBJKSB8fCBkZWZpbmVkKFhVU0VfTVRTQUZFX1BXREFQSSkKKyMgIGRlZmluZSBYT1NfVVNFX01UU0FGRV9QV0RBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyN1bmRlZiBYX05FRURTX1BXUEFSQU1TCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX1BXRF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfUFdEX0gpCisvKiBEbyBub3RoaW5nICovCisKKyNlbGlmICFkZWZpbmVkKFhUSFJFQURTKSAmJiAhZGVmaW5lZChYX0ZPUkNFX1VTRV9NVFNBRkVfQVBJKQorLyogVXNlIHJlZ3VsYXIsIHVuc2FmZSBBUEkuICovCisjIGlmIGRlZmluZWQoWF9OT1RfUE9TSVgpICYmICFkZWZpbmVkKGkzODYpICYmICFkZWZpbmVkKFNZU1YpCitleHRlcm4gc3RydWN0IHBhc3N3ZCAqZ2V0cHd1aWQoKSwgKmdldHB3bmFtKCk7CisjIGVuZGlmCit0eXBlZGVmIGludCBfWGdldHB3cGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hHZXRwd3VpZCh1LHApCWdldHB3dWlkKCh1KSkKKyMgZGVmaW5lIF9YR2V0cHduYW0odSxwKQlnZXRwd25hbSgodSkpCisKKyNlbGlmICFkZWZpbmVkKFhPU19VU0VfTVRTQUZFX1BXREFQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX1BXREFQSSkKKy8qIFVuaXhXYXJlIDIuMCwgb3Igb3RoZXIgc3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICovCisjIGRlZmluZSBYX05FRURTX1BXUEFSQU1TCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBwYXNzd2QgcHdzOworICBjaGFyICAgcHdidWZbMTAyNF07CisgIHN0cnVjdCBwYXNzd2QqIHB3cDsKKyAgc2l6ZV90IGxlbjsKK30gX1hnZXRwd3BhcmFtczsKKworLyoKKyAqIE5ldEJTRCBhbmQgRnJlZUJTRCwgYXQgbGVhc3QsIGFyZSBtaXNzaW5nIHNldmVyYWwgb2YgdGhlIHVuaXh3YXJlIHBhc3N3ZAorICogZmllbGRzLgorICovCisKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfWHB3X2NvcHlQYXNzd2QoX1hnZXRwd3BhcmFtcyBwKQoreworICAgbWVtY3B5KCYocCkucHdzLCAocCkucHdwLCBzaXplb2Yoc3RydWN0IHBhc3N3ZCkpOworCisgICAocCkucHdzLnB3X25hbWUgPSAocCkucHdidWY7CisgICAocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X25hbWUpOworICAgc3RyY3B5KChwKS5wd3MucHdfbmFtZSwgKHApLnB3cC0+cHdfbmFtZSk7CisKKyAgIChwKS5wd3MucHdfcGFzc3dkID0gKHApLnB3cy5wd19uYW1lICsgKHApLmxlbiArIDE7CisgICAocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X3Bhc3N3ZCk7CisgICBzdHJjcHkoKHApLnB3cy5wd19wYXNzd2QsKHApLnB3cC0+cHdfcGFzc3dkKTsKKworICAgKHApLnB3cy5wd19jbGFzcyA9IChwKS5wd3MucHdfcGFzc3dkICsgKHApLmxlbiArIDE7CisgICAocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2NsYXNzKTsKKyAgIHN0cmNweSgocCkucHdzLnB3X2NsYXNzLCAocCkucHdwLT5wd19jbGFzcyk7CisKKyAgIChwKS5wd3MucHdfZ2Vjb3MgPSAocCkucHdzLnB3X2NsYXNzICsgKHApLmxlbiArIDE7CisgICAocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X2dlY29zKTsKKyAgIHN0cmNweSgocCkucHdzLnB3X2dlY29zLCAocCkucHdwLT5wd19nZWNvcyk7CisKKyAgIChwKS5wd3MucHdfZGlyID0gKHApLnB3cy5wd19nZWNvcyArIChwKS5sZW4gKyAxOworICAgKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19kaXIpOworICAgc3RyY3B5KChwKS5wd3MucHdfZGlyLCAocCkucHdwLT5wd19kaXIpOworCisgICAocCkucHdzLnB3X3NoZWxsID0gKHApLnB3cy5wd19kaXIgKyAocCkubGVuICsgMTsKKyAgIChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfc2hlbGwpOworICAgc3RyY3B5KChwKS5wd3MucHdfc2hlbGwsIChwKS5wd3AtPnB3X3NoZWxsKTsKKworICAgKHApLnB3cCA9ICYocCkucHdzOworfQorCisjZWxzZQorIyBkZWZpbmUgX1hwd19jb3B5UGFzc3dkKHApIFwKKyAgIChtZW1jcHkoJihwKS5wd3MsIChwKS5wd3AsIHNpemVvZihzdHJ1Y3QgcGFzc3dkKSksIFwKKyAgICAoKHApLnB3cy5wd19uYW1lID0gKHApLnB3YnVmKSwgXAorICAgICgocCkubGVuID0gc3RybGVuKChwKS5wd3AtPnB3X25hbWUpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X25hbWUsIChwKS5wd3AtPnB3X25hbWUpLCBcCisgICAgKChwKS5wd3MucHdfcGFzc3dkID0gKHApLnB3cy5wd19uYW1lICsgKHApLmxlbiArIDEpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfcGFzc3dkKSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19wYXNzd2QsKHApLnB3cC0+cHdfcGFzc3dkKSwgXAorICAgICgocCkucHdzLnB3X2FnZSA9IChwKS5wd3MucHdfcGFzc3dkICsgKHApLmxlbiArIDEpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfYWdlKSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19hZ2UsIChwKS5wd3AtPnB3X2FnZSksIFwKKyAgICAoKHApLnB3cy5wd19jb21tZW50ID0gKHApLnB3cy5wd19hZ2UgKyAocCkubGVuICsgMSksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19jb21tZW50KSksIFwKKyAgICBzdHJjcHkoKHApLnB3cy5wd19jb21tZW50LCAocCkucHdwLT5wd19jb21tZW50KSwgXAorICAgICgocCkucHdzLnB3X2dlY29zID0gKHApLnB3cy5wd19jb21tZW50ICsgKHApLmxlbiArIDEpLCBcCisgICAgKChwKS5sZW4gPSBzdHJsZW4oKHApLnB3cC0+cHdfZ2Vjb3MpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X2dlY29zLCAocCkucHdwLT5wd19nZWNvcyksIFwKKyAgICAoKHApLnB3cy5wd19kaXIgPSAocCkucHdzLnB3X2NvbW1lbnQgKyAocCkubGVuICsgMSksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19kaXIpKSwgXAorICAgIHN0cmNweSgocCkucHdzLnB3X2RpciwgKHApLnB3cC0+cHdfZGlyKSwgXAorICAgICgocCkucHdzLnB3X3NoZWxsID0gKHApLnB3cy5wd19kaXIgKyAocCkubGVuICsgMSksIFwKKyAgICAoKHApLmxlbiA9IHN0cmxlbigocCkucHdwLT5wd19zaGVsbCkpLCBcCisgICAgc3RyY3B5KChwKS5wd3MucHdfc2hlbGwsIChwKS5wd3AtPnB3X3NoZWxsKSwgXAorICAgICgocCkucHdwID0gJihwKS5wd3MpLCBcCisgICAgMCApCisjZW5kaWYKKyMgZGVmaW5lIF9YR2V0cHd1aWQodSxwKSBcCisoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAoKChwKS5wd3AgPSBnZXRwd3VpZCgodSkpKSA/IF9YcHdfY29weVBhc3N3ZChwKSwgMCA6IDApLCBcCisgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgIChwKS5wd3AgKQorIyBkZWZpbmUgX1hHZXRwd25hbSh1LHApIFwKKyggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICgoKHApLnB3cCA9IGdldHB3bmFtKCh1KSkpID8gX1hwd19jb3B5UGFzc3dkKHApLCAwIDogMCksIFwKKyAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgKHApLnB3cCApCisKKyNlbGlmICFkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICYmICFkZWZpbmVkKF9fQVBQTEVfXykKKy8qIFNWUjQgdGhyZWFkcywgQUlYIDQuMi4wIGFuZCBlYXJsaWVyIGFuZCBPU0YvMSAzLjIgYW5kIGVhcmxpZXIgcHRocmVhZHMgKi8KKyMgZGVmaW5lIFhfTkVFRFNfUFdQQVJBTVMKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IHBhc3N3ZCBwd3M7CisgIGNoYXIgcHdidWZbWF9MSU5FX01BWF07Cit9IF9YZ2V0cHdwYXJhbXM7CisjIGlmIGRlZmluZWQoX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMpIHx8ICFkZWZpbmVkKFNWUjQpIHx8IGRlZmluZWQoTHlueCkKKyMgIGlmbmRlZiBMeW54CisjICAgZGVmaW5lIF9YR2V0cHd1aWQodSxwKSBcCisoKGdldHB3dWlkX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSkgPT0gLTEpID8gTlVMTCA6ICYocCkucHdzKQorIyAgIGRlZmluZSBfWEdldHB3bmFtKHUscCkgXAorKChnZXRwd25hbV9yKCh1KSwmKHApLnB3cywocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZikpID09IC0xKSA/IE5VTEwgOiAmKHApLnB3cykKKyMgIGVsc2UgLyogTHlueCAqLworIyAgIGRlZmluZSBfWEdldHB3dWlkKHUscCkgXAorKChnZXRwd3VpZF9yKCYocCkucHdzLCh1KSwocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZikpID09IC0xKSA/IE5VTEwgOiAmKHApLnB3cykKKyMgICBkZWZpbmUgX1hHZXRwd25hbSh1LHApIFwKKygoZ2V0cHduYW1fcigmKHApLnB3cywodSksKHApLnB3YnVmLHNpemVvZigocCkucHdidWYpKSA9PSAtMSkgPyBOVUxMIDogJihwKS5wd3MpCisjICBlbmRpZgorIyBlbHNlIC8qIFNWUjQgKi8KKyMgIGRlZmluZSBfWEdldHB3dWlkKHUscCkgXAorKChnZXRwd3VpZF9yKCh1KSwmKHApLnB3cywocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZikpID09IE5VTEwpID8gTlVMTCA6ICYocCkucHdzKQorIyAgZGVmaW5lIF9YR2V0cHduYW0odSxwKSBcCisoKGdldHB3bmFtX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSkgPT0gTlVMTCkgPyBOVUxMIDogJihwKS5wd3MpCisjIGVuZGlmIC8qIFNWUjQgKi8KKworI2Vsc2UgLyogX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUyAqLworLyogRGlnaXRhbCBVTklYIDQuMCwgYnV0IG5vdCAoYmV0YSkgVDQuMC0xICovCisjIGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIE9TRi8xIFY0LjAgPHB3ZC5oPiBkb2Vzbid0IGRlY2xhcmUgdGhlIF9QIHJvdXRpbmVzLCBicmVha2luZyB1bmRlciBDKysuICovCitleHRlcm4gaW50IF9QZ2V0cHd1aWRfcih1aWRfdCwgc3RydWN0IHBhc3N3ZCAqLCBjaGFyICosIHNpemVfdCwgc3RydWN0IHBhc3N3ZCAqKik7CitleHRlcm4gaW50IF9QZ2V0cHduYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqLCBzaXplX3QsIHN0cnVjdCBwYXNzd2QgKiopOworIyBlbmRpZgorIyBkZWZpbmUgWF9ORUVEU19QV1BBUkFNUwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgcGFzc3dkIHB3czsKKyAgY2hhciBwd2J1ZltYX0xJTkVfTUFYXTsKKyAgc3RydWN0IHBhc3N3ZCogcHdwOworfSBfWGdldHB3cGFyYW1zOwordHlwZWRlZiBpbnQgX1hnZXRwd3JldDsKKyMgZGVmaW5lIF9YR2V0cHd1aWQodSxwKSBcCisoKGdldHB3dWlkX3IoKHUpLCYocCkucHdzLChwKS5wd2J1ZixzaXplb2YoKHApLnB3YnVmKSwmKHApLnB3cCkgPT0gMCkgPyBcCisgKHApLnB3cCA6IE5VTEwpCisjIGRlZmluZSBfWEdldHB3bmFtKHUscCkgXAorKChnZXRwd25hbV9yKCh1KSwmKHApLnB3cywocCkucHdidWYsc2l6ZW9mKChwKS5wd2J1ZiksJihwKS5wd3ApID09IDApID8gXAorIChwKS5wd3AgOiBOVUxMKQorI2VuZGlmIC8qIFhfSU5DTFVERV9QV0RfSCAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfUFdEX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfUFdEX0gpCisjIGRlZmluZSBfWE9TX0lOQ0xVREVEX1BXRF9ICisjZW5kaWYKKworCisvKioqKiogPG5ldGRiLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxuZXRkYi5oPiB3cmFwcGVyczoKKyAqCisgKiBOT1RFOiBPbiBzeXN0ZW1zIGxhY2tpbmcgdGhlIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRob3N0YnluYW1lKCksCisgKglHZXRob3N0YnlhZGRyKCksIGFuZCBHZXRzZXJ2YnluYW1lKCkgZG8gTk9UIGNvcHkgdGhlIGhvc3Qgb3IKKyAqCXByb3RvY29sIGxpc3RzIQorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX05FVERCX0gKKyAqICNkZWZpbmUgWE9TX1VTRV8uLi5fTE9DS0lORworICogI2luY2x1ZGUgPFgxMS9Yb3Nfci5oPgorICoKKyAqIHR5cGVkZWYgLi4uIF9YZ2V0aG9zdGJ5bmFtZXBhcmFtczsKKyAqIHR5cGVkZWYgLi4uIF9YZ2V0c2VydmJ5bmFtZXBhcmFtczsKKyAqCisgKiBzdHJ1Y3QgaG9zdGVudCogX1hHZXRob3N0YnluYW1lKGNvbnN0IGNoYXIqIG5hbWUsX1hnZXRob3N0YnluYW1lcGFyYW1zKTsKKyAqIHN0cnVjdCBob3N0ZW50KiBfWEdldGhvc3RieWFkZHIoY29uc3QgY2hhciogYWRkciwgaW50IGxlbiwgaW50IHR5cGUsCisgKgkJCQkgICBfWGdldGhvc3RieW5hbWVwYXJhbXMpOworICogc3RydWN0IHNlcnZlbnQqIF9YR2V0c2VydmJ5bmFtZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBwcm90bywKKyAqCQkJCSBfWGdldHNlcnZieW5hbWVwYXJhbXMpOworICovCisKKyN1bmRlZiBYVEhSRUFEU19ORUVEU19CWU5BTUVQQVJBTVMKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9ORVREQl9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX05FVERCX0gpIFwKKyAgICAmJiAhZGVmaW5lZChXSU4zMikKKyMgaW5jbHVkZSA8bmV0ZGIuaD4KKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfTkVUREJBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfTkVUREJBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYX0lOQ0xVREVfTkVUREJfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX05FVERCX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hnZXRob3N0YnluYW1lcGFyYW1zOyAvKiBkdW1teSAqLwordHlwZWRlZiBpbnQgX1hnZXRzZXJ2YnluYW1lcGFyYW1zOyAvKiBkdW1teSAqLworIyBkZWZpbmUgX1hHZXRob3N0YnluYW1lKGgsaHApCQlnZXRob3N0YnluYW1lKChoKSkKKyMgZGVmaW5lIF9YR2V0aG9zdGJ5YWRkcihhLGFsLHQsaHApCWdldGhvc3RieWFkZHIoKGEpLChhbCksKHQpKQorIyBkZWZpbmUgX1hHZXRzZXJ2YnluYW1lKHMscCxzcCkJZ2V0c2VydmJ5bmFtZSgocyksKHApKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9ORVREQkFQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX05FVERCQVBJKQorLyogVW5peFdhcmUgMi4wLCBvciBvdGhlciBzeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KKy8qIFdBUk5JTkc6ICBUaGUgaF9hZGRyX2xpc3QgYW5kIHNfYWxpYXNlcyB2YWx1ZXMgYXJlICpub3QqIGNvcGllZCEgKi8KKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGhvc3RlbnQgaGVudDsKKyAgY2hhciAgICAgICAgICAgaF9uYW1lW01BWEhPU1ROQU1FTEVOXTsKKyAgc3RydWN0IGhvc3RlbnQgKmhwdHI7Cit9IF9YZ2V0aG9zdGJ5bmFtZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IHNlcnZlbnQgc2VudDsKKyAgY2hhciAgICAgICAgICAgc19uYW1lWzI1NV07CisgIGNoYXIJCSBzX3Byb3RvWzI1NV07CisgIHN0cnVjdCBzZXJ2ZW50ICpzcHRyOworfSBfWGdldHNlcnZieW5hbWVwYXJhbXM7CisKKyMgZGVmaW5lIFhUSFJFQURTX05FRURTX0JZTkFNRVBBUkFNUworCisjIGRlZmluZSBfWGdfY29weUhvc3RlbnQoaHApIFwKKyAgIChtZW1jcHkoJihocCkuaGVudCwgKGhwKS5ocHRyLCBzaXplb2Yoc3RydWN0IGhvc3RlbnQpKSwgXAorICAgIHN0cmNweSgoaHApLmhfbmFtZSwgKGhwKS5ocHRyLT5oX25hbWUpLCBcCisgICAgKChocCkuaGVudC5oX25hbWUgPSAoaHApLmhfbmFtZSksIFwKKyAgICAoKGhwKS5ocHRyID0gJihocCkuaGVudCksIFwKKyAgICAgMCApCisjIGRlZmluZSBfWGdfY29weVNlcnZlbnQoc3ApIFwKKyAgIChtZW1jcHkoJihzcCkuc2VudCwgKHNwKS5zcHRyLCBzaXplb2Yoc3RydWN0IHNlcnZlbnQpKSwgXAorICAgIHN0cmNweSgoc3ApLnNfbmFtZSwgKHNwKS5zcHRyLT5zX25hbWUpLCBcCisgICAgKChzcCkuc2VudC5zX25hbWUgPSAoc3ApLnNfbmFtZSksIFwKKyAgICBzdHJjcHkoKHNwKS5zX3Byb3RvLCAoc3ApLnNwdHItPnNfcHJvdG8pLCBcCisgICAgKChzcCkuc2VudC5zX3Byb3RvID0gKHNwKS5zX3Byb3RvKSwgXAorICAgICgoc3ApLnNwdHIgPSAmKHNwKS5zZW50KSwgXAorICAgIDAgKQorIyBkZWZpbmUgX1hHZXRob3N0YnluYW1lKGgsaHApIFwKKyAgICgoX1hvc19wcm9jZXNzTG9jayksIFwKKyAgICAoKChocCkuaHB0ciA9IGdldGhvc3RieW5hbWUoKGgpKSkgPyBfWGdfY29weUhvc3RlbnQoaHApIDogMCksIFwKKyAgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgIChocCkuaHB0ciApCisjIGRlZmluZSBfWEdldGhvc3RieWFkZHIoYSxhbCx0LGhwKSBcCisgICAoKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAgKCgoaHApLmhwdHIgPSBnZXRob3N0YnlhZGRyKChhKSwoYWwpLCh0KSkpID8gX1hnX2NvcHlIb3N0ZW50KGhwKSA6IDApLCBcCisgICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgICAoaHApLmhwdHIgKQorIyBkZWZpbmUgX1hHZXRzZXJ2YnluYW1lKHMscCxzcCkgXAorICAgKChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgICgoKHNwKS5zcHRyID0gZ2V0c2VydmJ5bmFtZSgocyksKHApKSkgPyBfWGdfY29weVNlcnZlbnQoc3ApIDogMCksIFwKKyAgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgIChzcCkuc3B0ciApCisKKyNlbGlmIGRlZmluZWQoWFVTRV9ORVREQl9SX0FQSSkKKy8qCisgKiBQT1NJWCBkb2VzIG5vdCBzcGVjaWZ5IF9yIGVxdWl2YWxlbnRzIGZvciA8bmV0ZGIuaD4gQVBJLCBidXQgc29tZQorICogdmVuZG9ycyBwcm92aWRlIHRoZW0gYW55d2F5LiAgVXNlIHRoZW0gb25seSB3aGVuIGV4cGxpY2l0bHkgYXNrZWQuCisgKi8KKyMgaWZkZWYgX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMKKyMgIGlmbmRlZiBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisjICAgaWYgZGVmaW5lZChBSVhWMykgfHwgZGVmaW5lZChBSVhWNCkgfHwgZGVmaW5lZChfX29zZl9fKQorIyAgICBkZWZpbmUgWF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMgMQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisjICBkZWZpbmUgWF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMgMQorIyBlbmRpZgorCisjIGRlZmluZSBYVEhSRUFEU19ORUVEU19CWU5BTUVQQVJBTVMKKworIyBpZm5kZWYgWF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzdHJ1Y3QgaG9zdGVudCAgICAgIGhlbnQ7CisgICAgY2hhciAgICAgICAgICAgICAgICBoYnVmW1hfTElORV9NQVhdOworICAgIGludCAgICAgICAgICAgICAgICAgaGVycjsKK30gX1hnZXRob3N0YnluYW1lcGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0cnVjdCBzZXJ2ZW50ICAgICAgc2VudDsKKyAgICBjaGFyICAgICAgICAgICAgICAgIHNidWZbWF9MSU5FX01BWF07Cit9IF9YZ2V0c2VydmJ5bmFtZXBhcmFtczsKKyMgIGRlZmluZSBfWEdldGhvc3RieW5hbWUoaCxocCkgXAorICBnZXRob3N0YnluYW1lX3IoKGgpLCYoaHApLmhlbnQsKGhwKS5oYnVmLHNpemVvZigoaHApLmhidWYpLCYoaHApLmhlcnIpCisjICBkZWZpbmUgX1hHZXRob3N0YnlhZGRyKGEsYWwsdCxocCkgXAorICBnZXRob3N0YnlhZGRyX3IoKGEpLChhbCksKHQpLCYoaHApLmhlbnQsKGhwKS5oYnVmLHNpemVvZigoaHApLmhidWYpLCYoaHApLmhlcnIpCisjICBkZWZpbmUgX1hHZXRzZXJ2YnluYW1lKHMscCxzcCkgXAorICBnZXRzZXJ2YnluYW1lX3IoKHMpLChwKSwmKHNwKS5zZW50LChzcCkuc2J1ZixzaXplb2YoKHNwKS5zYnVmKSkKKyMgZWxzZQordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgaG9zdGVudCAgICAgIGhlbnQ7CisgIHN0cnVjdCBob3N0ZW50X2RhdGEgaGRhdGE7Cit9IF9YZ2V0aG9zdGJ5bmFtZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IHNlcnZlbnQgICAgICBzZW50OworICBzdHJ1Y3Qgc2VydmVudF9kYXRhIHNkYXRhOworfSBfWGdldHNlcnZieW5hbWVwYXJhbXM7CisjICBkZWZpbmUgX1hHZXRob3N0YnluYW1lKGgsaHApIFwKKyAgKGJ6ZXJvKChjaGFyKikmKGhwKS5oZGF0YSxzaXplb2YoKGhwKS5oZGF0YSkpLAlcCisgICAoKGdldGhvc3RieW5hbWVfcigoaCksJihocCkuaGVudCwmKGhwKS5oZGF0YSkgPT0gLTEpID8gTlVMTCA6ICYoaHApLmhlbnQpKQorIyAgZGVmaW5lIF9YR2V0aG9zdGJ5YWRkcihhLGFsLHQsaHApIFwKKyAgKGJ6ZXJvKChjaGFyKikmKGhwKS5oZGF0YSxzaXplb2YoKGhwKS5oZGF0YSkpLAlcCisgICAoKGdldGhvc3RieWFkZHJfcigoYSksKGFsKSwodCksJihocCkuaGVudCwmKGhwKS5oZGF0YSkgPT0gLTEpID8gTlVMTCA6ICYoaHApLmhlbnQpKQorIyAgZGVmaW5lIF9YR2V0c2VydmJ5bmFtZShzLHAsc3ApIFwKKyAgKGJ6ZXJvKChjaGFyKikmKHNwKS5zZGF0YSxzaXplb2YoKHNwKS5zZGF0YSkpLAlcCisgICAoKGdldHNlcnZieW5hbWVfcigocyksKHApLCYoc3ApLnNlbnQsJihzcCkuc2RhdGEpID09IC0xKSA/IE5VTEwgOiAmKHNwKS5zZW50KSApCisjIGVuZGlmCisjIGlmZGVmIFhfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisjICB1bmRlZiBYX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUworIyBlbmRpZgorCisjZWxzZQorLyogVGhlIHJlZ3VsYXIgQVBJIGlzIGFzc3VtZWQgdG8gYmUgTVQtc2FmZSB1bmRlciBQT1NJWC4gKi8KK3R5cGVkZWYgaW50IF9YZ2V0aG9zdGJ5bmFtZXBhcmFtczsgLyogZHVtbXkgKi8KK3R5cGVkZWYgaW50IF9YZ2V0c2VydmJ5bmFtZXBhcmFtczsgLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YR2V0aG9zdGJ5bmFtZShoLGhwKQkJZ2V0aG9zdGJ5bmFtZSgoaCkpCisjIGRlZmluZSBfWEdldGhvc3RieWFkZHIoYSxhbCx0LGhwKQlnZXRob3N0YnlhZGRyKChhKSwoYWwpLCh0KSkKKyMgZGVmaW5lIF9YR2V0c2VydmJ5bmFtZShzLHAsc3ApCWdldHNlcnZieW5hbWUoKHMpLChwKSkKKyNlbmRpZiAvKiBYX0lOQ0xVREVfTkVUREJfSCAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfTkVUREJfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9ORVREQl9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9ORVREQl9ICisjZW5kaWYKKworCisvKioqKiogPGRpcmVudC5oPiB3cmFwcGVycyAqKioqKi8KKworLyoKKyAqIEVmZmVjdGl2ZSBwcm90b3R5cGVzIGZvciA8ZGlyZW50Lmg+IHdyYXBwZXJzOgorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX0RJUkVOVF9ICisgKiAjZGVmaW5lIFhPU19VU0VfLi4uX0xPQ0tJTkcKKyAqICNpbmNsdWRlIDxYMTEvWG9zX3IuaD4KKyAqCisgKiB0eXBlZGVmIC4uLiBfWHJlYWRkaXJwYXJhbXM7CisgKgorICogc3RydWN0IGRpcmVudCAqX1hSZWFkZGlyKERJUiAqZGlyX3BvaW50ZXIsIF9YcmVhZGRpcnBhcmFtcyk7CisgKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX0RJUkVOVF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX0RJUkVOVF9IKQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaWYgIWRlZmluZWQoWF9OT1RfUE9TSVgpIHx8IGRlZmluZWQoU1lTVikgfHwgZGVmaW5lZChVU0cpCisjICBpbmNsdWRlIDxkaXJlbnQuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgorIyAgaWZuZGVmIGRpcmVudAorIyAgIGRlZmluZSBkaXJlbnQgZGlyZWN0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9ESVJFTlRBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfRElSRU5UQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX0RJUkVOVF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfRElSRU5UX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hyZWFkZGlycGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hSZWFkZGlyKGQscCkJcmVhZGRpcihkKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9ESVJFTlRBUEkpIHx8IGRlZmluZWQoWE5PX01UU0FGRV9ESVJFTlRBUEkpCisvKiBTeXN0ZW1zIHdpdGggdGhyZWFkIHN1cHBvcnQgYnV0IG5vIF9yIEFQSS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRpcmVudCAqcmVzdWx0OworICBzdHJ1Y3QgZGlyZW50IGRpcl9lbnRyeTsKKyMgaWZkZWYgX1BPU0lYX1BBVEhfTUFYCisgIGNoYXIgYnVmW19QT1NJWF9QQVRIX01BWF07CisjIGVsaWYgZGVmaW5lZChOQU1FX01BWCkKKyAgY2hhciBidWZbTkFNRV9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzI1NV07CisjIGVuZGlmCit9IF9YcmVhZGRpcnBhcmFtczsKKworIyBkZWZpbmUgX1hSZWFkZGlyKGQscCkJXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLAkJCQkJCSBcCisgICAoKChwKS5yZXN1bHQgPSByZWFkZGlyKChkKSkpID8JCQkJIFwKKyAgICAobWVtY3B5KCYoKHApLmRpcl9lbnRyeSksIChwKS5yZXN1bHQsIChwKS5yZXN1bHQtPmRfcmVjbGVuKSwgXAorICAgICAoKHApLnJlc3VsdCA9ICYocCkuZGlyX2VudHJ5KSwgMCkgOgkJCSBcCisgICAgMCksCQkJCQkJCQkgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksCQkJCQkgXAorICAgKHApLnJlc3VsdCApCisKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkaXJlbnQgKnJlc3VsdDsKKyAgc3RydWN0IGRpcmVudCBkaXJfZW50cnk7CisjIGlmZGVmIF9QT1NJWF9QQVRIX01BWAorICBjaGFyIGJ1ZltfUE9TSVhfUEFUSF9NQVhdOworIyBlbGlmIGRlZmluZWQoTkFNRV9NQVgpCisgIGNoYXIgYnVmW05BTUVfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1ZlsyNTVdOworIyBlbmRpZgorfSBfWHJlYWRkaXJwYXJhbXM7CisKKyMgaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKEFJWFYzKSB8fCBcCisgICAgIGRlZmluZWQoQUlYVjQpIHx8IGRlZmluZWQoX19BUFBMRV9fKQorLyogQUlYIGRlZmluZXMgdGhlIGRyYWZ0IFBPU0lYIHN5bWJvbCwgYnV0IHVzZXMgdGhlIGZpbmFsIEFQSS4gKi8KKy8qIFBPU0lYIGZpbmFsIEFQSSwgcmV0dXJucyAoaW50KTAgb24gc3VjY2Vzcy4gKi8KKyMgIGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIE9TRi8xIFY0LjAgPGRpcmVudC5oPiBkb2Vzbid0IGRlY2xhcmUgX1ByZWFkZGlyX3IsIGJyZWFraW5nIHVuZGVyIEMrKy4gKi8KK2V4dGVybiBpbnQgX1ByZWFkZGlyX3IoRElSICosIHN0cnVjdCBkaXJlbnQgKiwgc3RydWN0IGRpcmVudCAqKik7CisjICBlbmRpZgorIyAgZGVmaW5lIF9YUmVhZGRpcihkLHApCQkJCQkJXAorICAgIChyZWFkZGlyX3IoKGQpLCAmKChwKS5kaXJfZW50cnkpLCAmKChwKS5yZXN1bHQpKSA/IE5VTEwgOiAocCkucmVzdWx0KQorIyBlbGlmIGRlZmluZWQoX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMpICYmIGRlZmluZWQoX19vc2ZfXykKKy8qCisgKiBPU0YvMSBWMy4yIHJlYWRkaXJfcigpIHdpbGwgU0VHViBpZiB0aGUgbWFpbiBwcm9ncmFtIGlzIG5vdAorICogZXhwbGljaXRseSBsaW5rZWQgd2l0aCAtbGNfci4gIFRoZSBsaWJyYXJ5IFJFUVVJUkVETElCUyBkb24ndCBoZWxwLgorICogQXNzdW1lIHRoYXQgaWYgdGhyZWFkcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2UncmUgbGlua2VkIHByb3Blcmx5LgorICovCisjICBkZWZpbmUgX1hSZWFkZGlyKGQscCkJCQkJCQlcCisgKCAoX1hvc19pc1RocmVhZEluaXRpYWxpemVkKSA/CQkJCQkJXAorICAgKHJlYWRkaXJfcigoZCksICYoKHApLmRpcl9lbnRyeSkpID8gTlVMTCA6ICYoKHApLmRpcl9lbnRyeSkpIDoJXAorICAgKChfWG9zX3Byb2Nlc3NMb2NrKSwJCQkJCQkJXAorICAgICgoKHApLnJlc3VsdCA9IHJlYWRkaXIoKGQpKSkgPwkJCQkJXAorICAgICAobWVtY3B5KCYoKHApLmRpcl9lbnRyeSksIChwKS5yZXN1bHQsIChwKS5yZXN1bHQtPmRfcmVjbGVuKSwJXAorICAgICAgKChwKS5yZXN1bHQgPSAmKHApLmRpcl9lbnRyeSksIDApIDoJCQkJXAorICAgICAwKSwJCQkJCQkJCVwKKyAgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwJCQkJCQlcCisgICAgKHApLnJlc3VsdCkgKQorIyBlbGlmIGRlZmluZWQoX1BPU0lYX1JFRU5UUkFOVF9GVU5DVElPTlMpCisvKiBQT1NJWCBkcmFmdCBBUEksIHJldHVybnMgKGludCkwIG9uIHN1Y2Nlc3MuICovCisjICBkZWZpbmUgX1hSZWFkZGlyKGQscCkJXAorICAgIChyZWFkZGlyX3IoKGQpLCYoKHApLmRpcl9lbnRyeSkpID8gTlVMTCA6ICYoKHApLmRpcl9lbnRyeSkpCisjIGVsaWYgZGVmaW5lZChTVlI0KQorLyogUHJlLVBPU0lYIEFQSSwgcmV0dXJucyBub24tTlVMTCBvbiBzdWNjZXNzLiAqLworIyAgZGVmaW5lIF9YUmVhZGRpcihkLHApCShyZWFkZGlyX3IoKGQpLCAmKHApLmRpcl9lbnRyeSkpCisjIGVsc2UKKy8qIFdlIGhhdmUgbm8gaWRlYSB3aGF0IGlzIGdvaW5nIG9uLiAgRmFrZSBpdCBhbGwgdXNpbmcgcHJvY2VzcyBsb2Nrcy4gKi8KKyMgIGRlZmluZSBfWFJlYWRkaXIoZCxwKQlcCisgICAgKCAoX1hvc19wcm9jZXNzTG9jayksCQkJCQkJXAorICAgICAgKCgocCkucmVzdWx0ID0gcmVhZGRpcigoZCkpKSA/CQkJCQlcCisgICAgICAgKG1lbWNweSgmKChwKS5kaXJfZW50cnkpLCAocCkucmVzdWx0LCAocCkucmVzdWx0LT5kX3JlY2xlbiksCVwKKwkoKHApLnJlc3VsdCA9ICYocCkuZGlyX2VudHJ5KSwgMCkgOgkJCQlcCisgICAgICAgMCksCQkJCQkJCQlcCisgICAgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwJCQkJCQlcCisgICAgICAocCkucmVzdWx0ICkKKyMgZW5kaWYKKyNlbmRpZiAvKiBYX0lOQ0xVREVfRElSRU5UX0ggKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX0RJUkVOVF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX0RJUkVOVF9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9ESVJFTlRfSAorI2VuZGlmCisKKworLyoqKioqIDx1bmlzdGQuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPHVuaXN0ZC5oPiB3cmFwcGVyczoKKyAqCisgKiAjZGVmaW5lIFhfSU5DTFVERV9VTklTVERfSAorICogI2RlZmluZSBYT1NfVVNFXy4uLl9MT0NLSU5HCisgKiAjaW5jbHVkZSA8WDExL1hvc19yLmg+CisgKgorICogdHlwZWRlZiAuLi4gX1hnZXRsb2dpbnBhcmFtczsKKyAqIHR5cGVkZWYgLi4uIF9YdHR5bmFtZXBhcmFtczsKKyAqCisgKiBjaGFyICpfWEdldGxvZ2luKF9YZ2V0bG9naW5wYXJhbXMpOworICogY2hhciAqX1hUdHluYW1lKGludCwgX1h0dHluYW1lcGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfVU5JU1REX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfVU5JU1REX0gpCisvKiA8dW5pc3RkLmg+IGFscmVhZHkgaW5jbHVkZWQgYnkgPFgxMS9Yb3MuaD4gKi8KKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfVU5JU1REQVBJKQorIyAgZGVmaW5lIFhPU19VU0VfTVRTQUZFX1VOSVNUREFQSSAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFhfSU5DTFVERV9VTklTVERfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX1VOSVNURF9IKQorLyogRG8gbm90aGluZy4gKi8KKworI2VsaWYgIWRlZmluZWQoWFRIUkVBRFMpICYmICFkZWZpbmVkKFhfRk9SQ0VfVVNFX01UU0FGRV9BUEkpCisvKiBVc2UgcmVndWxhciwgdW5zYWZlIEFQSS4gKi8KK3R5cGVkZWYgaW50IF9YZ2V0bG9naW5wYXJhbXM7CS8qIGR1bW15ICovCit0eXBlZGVmIGludCBfWHR0eW5hbWVwYXJhbXM7CS8qIGR1bW15ICovCisjIGRlZmluZSBfWEdldGxvZ2luKHApCWdldGxvZ2luKCkKKyMgZGVmaW5lIF9YVHR5bmFtZShmKQl0dHluYW1lKChmKSkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfVU5JU1REQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfVU5JU1REQVBJKQorLyogU3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKnJlc3VsdDsKKyMgaWYgZGVmaW5lZChNQVhMT0dOQU1FKQorICBjaGFyIGJ1ZltNQVhMT0dOQU1FXTsKKyMgZWxpZiBkZWZpbmVkKExPR0lOX05BTUVfTUFYKQorICBjaGFyIGJ1ZltMT0dJTl9OQU1FX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbNjRdOworIyBlbmRpZgorfSBfWGdldGxvZ2lucGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpyZXN1bHQ7CisjIGlmZGVmIFRUWV9OQU1FX01BWAorICBjaGFyIGJ1ZltUVFlfTkFNRV9NQVhdOworIyBlbGlmIGRlZmluZWQoX1BPU0lYX1RUWV9OQU1FX01BWCkKKyAgY2hhciBidWZbX1BPU0lYX1RUWV9OQU1FX01BWF07CisjIGVsaWYgZGVmaW5lZChfUE9TSVhfUEFUSF9NQVgpCisgIGNoYXIgYnVmW19QT1NJWF9QQVRIX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbMjU2XTsKKyMgZW5kaWYKK30gX1h0dHluYW1lcGFyYW1zOworCisjIGRlZmluZSBfWEdldGxvZ2luKHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucmVzdWx0ID0gZ2V0bG9naW4oKSkgPyBcCisgICAgKHN0cm5jcHkoKHApLmJ1ZiwgKHApLnJlc3VsdCwgc2l6ZW9mKChwKS5idWYpKSwgXAorICAgICAoKHApLmJ1ZltzaXplb2YoKHApLmJ1ZiktMV0gPSAnXDAnKSwgXAorICAgICAoKHApLnJlc3VsdCA9IChwKS5idWYpLCAwKSA6IDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnJlc3VsdCApCisjZGVmaW5lIF9YVHR5bmFtZShmLHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucmVzdWx0ID0gdHR5bmFtZShmKSkgPyBcCisgICAgKHN0cm5jcHkoKHApLmJ1ZiwgKHApLnJlc3VsdCwgc2l6ZW9mKChwKS5idWYpKSwgXAorICAgICAoKHApLmJ1ZltzaXplb2YoKHApLmJ1ZiktMV0gPSAnXDAnKSwgXAorICAgICAoKHApLnJlc3VsdCA9IChwKS5idWYpLCAwKSA6IDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnJlc3VsdCApCisKKyNlbGlmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfUE9TSVhfUkVFTlRSQU5UX0ZVTkNUSU9OUykKKy8qIFBPU0lYIEFQSS4KKyAqCisgKiBleHRlcm4gaW50IGdldGxvZ2luX3IoY2hhciAqLCBzaXplX3QpOworICogZXh0ZXJuIGludCB0dHluYW1lX3IoaW50LCBjaGFyICosIHNpemVfdCk7CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyMgaWYgZGVmaW5lZChNQVhMT0dOQU1FKQorICBjaGFyIGJ1ZltNQVhMT0dOQU1FXTsKKyMgZWxpZiBkZWZpbmVkKExPR0lOX05BTUVfTUFYKQorICBjaGFyIGJ1ZltMT0dJTl9OQU1FX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbNjRdOworIyBlbmRpZgorfSBfWGdldGxvZ2lucGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworIyBpZmRlZiBUVFlfTkFNRV9NQVgKKyAgY2hhciBidWZbVFRZX05BTUVfTUFYXTsKKyMgZWxpZiBkZWZpbmVkKF9QT1NJWF9UVFlfTkFNRV9NQVgpCisgIGNoYXIgYnVmW19QT1NJWF9UVFlfTkFNRV9NQVhdOworIyBlbGlmIGRlZmluZWQoX1BPU0lYX1BBVEhfTUFYKQorICBjaGFyIGJ1ZltfUE9TSVhfUEFUSF9NQVhdOworIyBlbHNlCisgIGNoYXIgYnVmWzI1Nl07CisjIGVuZGlmCit9IF9YdHR5bmFtZXBhcmFtczsKKworIyBkZWZpbmUgX1hHZXRsb2dpbihwKQkoZ2V0bG9naW5fcigocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpID8gTlVMTCA6IChwKS5idWYpCisjIGRlZmluZSBfWFR0eW5hbWUoZixwKQlcCisJKHR0eW5hbWVfcigoZiksIChwKS5idWYsIHNpemVvZigocCkuYnVmKSkgPyBOVUxMIDogKHApLmJ1ZikKKworI2Vsc2UKKy8qIFByZS1QT1NJWCBBUEkuCisgKgorICogZXh0ZXJuIGNoYXIgKmdldGxvZ2luX3IoY2hhciAqLCBzaXplX3QpOworICogZXh0ZXJuIGNoYXIgKnR0eW5hbWVfcihpbnQsIGNoYXIgKiwgc2l6ZV90KTsKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworIyBpZiBkZWZpbmVkKE1BWExPR05BTUUpCisgIGNoYXIgYnVmW01BWExPR05BTUVdOworIyBlbGlmIGRlZmluZWQoTE9HSU5fTkFNRV9NQVgpCisgIGNoYXIgYnVmW0xPR0lOX05BTUVfTUFYXTsKKyMgZWxzZQorICBjaGFyIGJ1Zls2NF07CisjIGVuZGlmCit9IF9YZ2V0bG9naW5wYXJhbXM7Cit0eXBlZGVmIHN0cnVjdCB7CisjIGlmZGVmIFRUWV9OQU1FX01BWAorICBjaGFyIGJ1ZltUVFlfTkFNRV9NQVhdOworIyBlbGlmIGRlZmluZWQoX1BPU0lYX1RUWV9OQU1FX01BWCkKKyAgY2hhciBidWZbX1BPU0lYX1RUWV9OQU1FX01BWF07CisjIGVsaWYgZGVmaW5lZChfUE9TSVhfUEFUSF9NQVgpCisgIGNoYXIgYnVmW19QT1NJWF9QQVRIX01BWF07CisjIGVsc2UKKyAgY2hhciBidWZbMjU2XTsKKyMgZW5kaWYKK30gX1h0dHluYW1lcGFyYW1zOworCisjIGRlZmluZSBfWEdldGxvZ2luKHApCWdldGxvZ2luX3IoKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKQorIyBkZWZpbmUgX1hUdHluYW1lKGYscCkJdHR5bmFtZV9yKChmKSwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKQorI2VuZGlmIC8qIFhfSU5DTFVERV9VTklTVERfSCAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfVU5JU1REX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfVU5JU1REX0gpCisjIGRlZmluZSBfWE9TX0lOQ0xVREVEX1VOSVNURF9ICisjZW5kaWYKKworCisvKioqKiogPHN0cmluZy5oPiB3cmFwcGVycyAqKioqKi8KKworLyoKKyAqIEVmZmVjdGl2ZSBwcm90b3R5cGVzIGZvciA8c3RyaW5nLmg+IHdyYXBwZXJzOgorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX1NUUklOR19ICisgKiAjZGVmaW5lIFhPU19VU0VfLi4uX0xPQ0tJTkcKKyAqICNpbmNsdWRlIDxYMTEvWG9zX3IuaD4KKyAqCisgKiB0eXBlZGVmIC4uLiBfWHN0cnRva3BhcmFtczsKKyAqCisgKiBjaGFyICpfWFN0cnRvayhjaGFyICosIGNvbnN0IGNoYXIqLCBfWHN0cnRva3BhcmFtcyk7CisgKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX1NUUklOR19IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX1NUUklOR19IKQorLyogPHN0cmluZy5oPiBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIGJ5IDxYMTEvWG9zLmg+ICovCisjIGlmIGRlZmluZWQoWFVTRV9NVFNBRkVfQVBJKSB8fCBkZWZpbmVkKFhVU0VfTVRTQUZFX1NUUklOR0FQSSkKKyMgIGRlZmluZSBYT1NfVVNFX01UU0FGRV9TVFJJTkdBUEkgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYX0lOQ0xVREVfU1RSSU5HX0gpIHx8IGRlZmluZWQoX1hPU19JTkNMVURFRF9TVFJJTkdfSCkKKy8qIERvIG5vdGhpbmcuICovCisKKyNlbGlmICFkZWZpbmVkKFhUSFJFQURTKSAmJiAhZGVmaW5lZChYX0ZPUkNFX1VTRV9NVFNBRkVfQVBJKQorLyogVXNlIHJlZ3VsYXIsIHVuc2FmZSBBUEkuICovCit0eXBlZGVmIGludCBfWHN0cnRva3BhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YU3RydG9rKHMxLHMyLHApIFwKKyAoIHAgPSAwLCAodm9pZClwLCBzdHJ0b2soKHMxKSwoczIpKSApCisKKyNlbGlmICFkZWZpbmVkKFhPU19VU0VfTVRTQUZFX1NUUklOR0FQSSkgfHwgZGVmaW5lZChYTk9fTVRTQUZFX1NUUklOR0FQSSkKKy8qIFN5c3RlbXMgd2l0aCB0aHJlYWQgc3VwcG9ydCBidXQgbm8gX3IgQVBJLiAqLwordHlwZWRlZiBjaGFyICpfWHN0cnRva3BhcmFtczsKKyMgZGVmaW5lIF9YU3RydG9rKHMxLHMyLHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKChwKSA9IHN0cnRvaygoczEpLChzMikpKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKSApCisKKyNlbHNlCisvKiBQT1NJWCBvciBwcmUtUE9TSVggQVBJLiAqLwordHlwZWRlZiBjaGFyICogX1hzdHJ0b2twYXJhbXM7CisjIGRlZmluZSBfWFN0cnRvayhzMSxzMixwKQlzdHJ0b2tfcigoczEpLChzMiksJihwKSkKKyNlbmRpZiAvKiBYX0lOQ0xVREVfU1RSSU5HX0ggKi8KKworCisvKioqKiogPHRpbWUuaD4gd3JhcHBlcnMgKioqKiovCisKKy8qCisgKiBFZmZlY3RpdmUgcHJvdG90eXBlcyBmb3IgPHRpbWUuaD4gd3JhcHBlcnM6CisgKgorICogI2RlZmluZSBYX0lOQ0xVREVfVElNRV9ICisgKiAjZGVmaW5lIFhPU19VU0VfLi4uX0xPQ0tJTkcKKyAqICNpbmNsdWRlIDxYMTEvWG9zX3IuaD4KKyAqCisgKiB0eXBlZGVmIC4uLiBfWGF0aW1lcGFyYW1zOworICogdHlwZWRlZiAuLi4gX1hjdGltZXBhcmFtczsKKyAqIHR5cGVkZWYgLi4uIF9YZ3RpbWVwYXJhbXM7CisgKiB0eXBlZGVmIC4uLiBfWGx0aW1lcGFyYW1zOworICoKKyAqIGNoYXIgKl9YQXNjdGltZShjb25zdCBzdHJ1Y3QgdG0gKiwgX1hhdGltZXBhcmFtcyk7CisgKiBjaGFyICpfWEN0aW1lKGNvbnN0IHRpbWVfdCAqLCBfWGN0aW1lcGFyYW1zKTsKKyAqIHN0cnVjdCB0bSAqX1hHbXRpbWUoY29uc3QgdGltZV90ICosIF9YZ3RpbWVwYXJhbXMpOworICogc3RydWN0IHRtICpfWExvY2FsdGltZShjb25zdCB0aW1lX3QgKiwgX1hsdGltZXBhcmFtcyk7CisgKi8KKworI2lmIGRlZmluZWQoWF9JTkNMVURFX1RJTUVfSCkgJiYgIWRlZmluZWQoX1hPU19JTkNMVURFRF9USU1FX0gpCisjIGluY2x1ZGUgPHRpbWUuaD4KKyMgaWYgZGVmaW5lZChYVVNFX01UU0FGRV9BUEkpIHx8IGRlZmluZWQoWFVTRV9NVFNBRkVfVElNRUFQSSkKKyMgIGRlZmluZSBYT1NfVVNFX01UU0FGRV9USU1FQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX1RJTUVfSCkgfHwgZGVmaW5lZChfWE9TX0lOQ0xVREVEX1RJTUVfSCkKKy8qIERvIG5vdGhpbmcuICovCisKKyNlbGlmICFkZWZpbmVkKFhUSFJFQURTKSAmJiAhZGVmaW5lZChYX0ZPUkNFX1VTRV9NVFNBRkVfQVBJKQorLyogVXNlIHJlZ3VsYXIsIHVuc2FmZSBBUEkuICovCit0eXBlZGVmIGludCBfWGF0aW1lcGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hBc2N0aW1lKHQscCkJCWFzY3RpbWUoKHQpKQordHlwZWRlZiBpbnQgX1hjdGltZXBhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YQ3RpbWUodCxwKQkJY3RpbWUoKHQpKQordHlwZWRlZiBpbnQgX1hndGltZXBhcmFtczsJLyogZHVtbXkgKi8KKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCWdtdGltZSgodCkpCit0eXBlZGVmIGludCBfWGx0aW1lcGFyYW1zOwkvKiBkdW1teSAqLworIyBkZWZpbmUgX1hMb2NhbHRpbWUodCxwKQlsb2NhbHRpbWUoKHQpKQorCisjZWxpZiAhZGVmaW5lZChYT1NfVVNFX01UU0FGRV9USU1FQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfVElNRUFQSSkKKy8qIFN5c3RlbXMgd2l0aCB0aHJlYWQgc3VwcG9ydCBidXQgbm8gX3IgQVBJLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworIyBpZmRlZiBUSU1FTEVOCisgIGNoYXIgYnVmW1RJTUVMRU5dOworIyBlbHNlCisgIGNoYXIgYnVmWzI2XTsKKyMgZW5kaWYKKyAgY2hhciAqcmVzdWx0OworfSBfWGN0aW1lcGFyYW1zLCBfWGF0aW1lcGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgdG0gYnVmOworICBzdHJ1Y3QgdG0gKnJlc3VsdDsKK30gX1hndGltZXBhcmFtcywgX1hsdGltZXBhcmFtczsKKyMgZGVmaW5lIF9YQXNjdGltZSh0LHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucmVzdWx0ID0gYXNjdGltZSgodCkpKSA/IFwKKyAgICAoc3RybmNweSgocCkuYnVmLCAocCkucmVzdWx0LCBzaXplb2YoKHApLmJ1ZikpLCAocCkucmVzdWx0ID0gJihwKS5idWYpIDogXAorICAgIDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnJlc3VsdCApCisjIGRlZmluZSBfWEN0aW1lKHQscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5yZXN1bHQgPSBjdGltZSgodCkpKSA/IFwKKyAgICAoc3RybmNweSgocCkuYnVmLCAocCkucmVzdWx0LCBzaXplb2YoKHApLmJ1ZikpLCAocCkucmVzdWx0ID0gJihwKS5idWYpIDogXAorICAgIDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnJlc3VsdCApCisjIGRlZmluZSBfWEdtdGltZSh0LHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucmVzdWx0ID0gZ210aW1lKHQpKSA/IFwKKyAgICAobWVtY3B5KCYocCkuYnVmLCAocCkucmVzdWx0LCBzaXplb2YoKHApLmJ1ZikpLCAocCkucmVzdWx0ID0gJihwKS5idWYpIDogXAorICAgIDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnJlc3VsdCApCisjIGRlZmluZSBfWExvY2FsdGltZSh0LHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucmVzdWx0ID0gbG9jYWx0aW1lKHQpKSA/IFwKKyAgICAobWVtY3B5KCYocCkuYnVmLCAocCkucmVzdWx0LCBzaXplb2YoKHApLmJ1ZikpLCAocCkucmVzdWx0ID0gJihwKS5idWYpIDogXAorICAgIDApLCBcCisgICAoX1hvc19wcm9jZXNzVW5sb2NrKSwgXAorICAgKHApLnJlc3VsdCApCisKKyNlbGlmICFkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICYmIChkZWZpbmVkKF9fb3NmX18pIHx8IGRlZmluZWQoaHBWNCkpCisvKiBSZXR1cm5zIChpbnQpMCBvbiBzdWNjZXNzLiAgT1NGLzEgdjMuMiwgSFAvVVggMTAKKyAqCisgKiBleHRlcm4gaW50IGFzY3RpbWVfcihjb25zdCBzdHJ1Y3QgdG0gKnRpbWVwdHIsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1Zmxlbik7CisgKiBleHRlcm4gaW50IGN0aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKTsKKyAqIGV4dGVybiBpbnQgZ210aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICogZXh0ZXJuIGludCBsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVyLCBzdHJ1Y3QgdG0gKnJlc3VsdCk7CisgKi8KKyMgaWZkZWYgVElNRUxFTgordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbVElNRUxFTl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1tUSU1FTEVOXTsKKyMgZWxzZQordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbMjZdOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbMjZdOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdG0gX1hndGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHRtIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJKGFzY3RpbWVfcigodCksKHApLHNpemVvZigocCkpKSA/IE5VTEwgOiAocCkpCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCShjdGltZV9yKCh0KSwocCksc2l6ZW9mKChwKSkpID8gTlVMTCA6IChwKSkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCShnbXRpbWVfcigodCksJihwKSkgPyBOVUxMIDogJihwKSkKKyMgZGVmaW5lIF9YTG9jYWx0aW1lKHQscCkJKGxvY2FsdGltZV9yKCh0KSwmKHApKSA/IE5VTEwgOiAmKHApKQorCisjZWxpZiAhZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAmJiBkZWZpbmVkKHN1bikKKy8qIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgU29sYXJpcyAyLjUKKyAqCisgKiBleHRlcm4gY2hhciAqYXNjdGltZV9yKGNvbnN0IHN0cnVjdCB0bSAqdG0sY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyAqIGV4dGVybiBjaGFyICpjdGltZV9yKGNvbnN0IHRpbWVfdCAqY2xvY2ssIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CisgKiBleHRlcm4gc3RydWN0IHRtICpnbXRpbWVfcihjb25zdCB0aW1lX3QgKmNsb2NrLCBzdHJ1Y3QgdG0gKnJlcyk7CisgKiBleHRlcm4gc3RydWN0IHRtICpsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKmNsb2NrLCBzdHJ1Y3QgdG0gKnJlcyk7CisgKi8KKyMgaWZkZWYgVElNRUxFTgordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbVElNRUxFTl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1tUSU1FTEVOXTsKKyMgZWxzZQordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbMjZdOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbMjZdOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdG0gX1hndGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHRtIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJYXNjdGltZV9yKCh0KSwocCksc2l6ZW9mKChwKSkpCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCWN0aW1lX3IoKHQpLChwKSxzaXplb2YoKHApKSkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCWdtdGltZV9yKCh0KSwmKHApKQorIyBkZWZpbmUgX1hMb2NhbHRpbWUodCxwKQlsb2NhbHRpbWVfcigodCksJihwKSkKKworI2Vsc2UgLyogZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSAqLworLyogUE9TSVggZmluYWwgQVBJLiAgT1NGLzEgdjQuMCwgQUlYLCBldGMuCisgKgorICogZXh0ZXJuIGNoYXIgKmFzY3RpbWVfcihjb25zdCBzdHJ1Y3QgdG0gKnRpbWVwdHIsIGNoYXIgKmJ1ZmZlcik7CisgKiBleHRlcm4gY2hhciAqY3RpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVyLCBjaGFyICpidWZmZXIpOworICogZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICogZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lX3IoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworICovCisjIGlmIGRlZmluZWQoX19vc2ZfXykKKy8qIE9TRi8xIFY0LjAgPHRpbWUuaD4gZG9lc24ndCBkZWNsYXJlIHRoZSBfUCByb3V0aW5lcywgYnJlYWtpbmcgdW5kZXIgQysrLiAqLworZXh0ZXJuIGNoYXIgKl9QYXNjdGltZV9yKGNvbnN0IHN0cnVjdCB0bSAqLCBjaGFyICopOworZXh0ZXJuIGNoYXIgKl9QY3RpbWVfcihjb25zdCB0aW1lX3QgKiwgY2hhciAqKTsKK2V4dGVybiBzdHJ1Y3QgdG0gKl9QbG9jYWx0aW1lX3IoY29uc3QgdGltZV90ICosIHN0cnVjdCB0bSAqKTsKKyMgZW5kaWYKKyMgaWZkZWYgVElNRUxFTgordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbVElNRUxFTl07Cit0eXBlZGVmIGNoYXIgX1hjdGltZXBhcmFtc1tUSU1FTEVOXTsKKyMgZWxzZQordHlwZWRlZiBjaGFyIF9YYXRpbWVwYXJhbXNbMjZdOwordHlwZWRlZiBjaGFyIF9YY3RpbWVwYXJhbXNbMjZdOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdG0gX1hndGltZXBhcmFtczsKK3R5cGVkZWYgc3RydWN0IHRtIF9YbHRpbWVwYXJhbXM7CisjIGRlZmluZSBfWEFzY3RpbWUodCxwKQkJYXNjdGltZV9yKCh0KSwocCkpCisjIGRlZmluZSBfWEN0aW1lKHQscCkJCWN0aW1lX3IoKHQpLChwKSkKKyMgZGVmaW5lIF9YR210aW1lKHQscCkJCWdtdGltZV9yKCh0KSwmKHApKQorIyBkZWZpbmUgX1hMb2NhbHRpbWUodCxwKQlsb2NhbHRpbWVfcigodCksJihwKSkKKyNlbmRpZiAvKiBYX0lOQ0xVREVfVElNRV9IICovCisKKyNpZiBkZWZpbmVkKFhfSU5DTFVERV9USU1FX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfVElNRV9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9USU1FX0gKKyNlbmRpZgorCisKKy8qKioqKiA8Z3JwLmg+IHdyYXBwZXJzICoqKioqLworCisvKgorICogRWZmZWN0aXZlIHByb3RvdHlwZXMgZm9yIDxncnAuaD4gd3JhcHBlcnM6CisgKgorICogTk9URTogT24gc3lzdGVtcyBsYWNraW5nIGFwcHJvcHJpYXRlIF9yIGZ1bmN0aW9ucyBHZXRncmdpZCgpIGFuZAorICoJR2V0Z3JuYW0oKSBkbyBOT1QgY29weSB0aGUgbGlzdCBvZiBncm91cCBtZW1iZXJzIQorICoKKyAqIFJlbWVtYmVyIHRoYXQgZmdldGdyZW50KCksIHNldGdyZW50KCksIGdldGdyZW50KCksIGFuZCBlbmRncmVudCgpCisgKiBhcmUgbm90IGluY2x1ZGVkIGluIFBPU0lYLgorICoKKyAqICNkZWZpbmUgWF9JTkNMVURFX0dSUF9ICisgKiAjZGVmaW5lIFhPU19VU0VfLi4uX0xPQ0tJTkcKKyAqICNpbmNsdWRlIDxYMTEvWG9zX3IuaD4KKyAqCisgKiB0eXBlZGVmIC4uLiBfWGdldGdycGFyYW1zOworICoKKyAqIHN0cnVjdCBncm91cCAqX1hHZXRncmdpZChnaWRfdCwgX1hnZXRncnBhcmFtcyk7CisgKiBzdHJ1Y3QgZ3JvdXAgKl9YR2V0Z3JuYW0oY29uc3QgY2hhciAqLCBfWGdldGdycGFyYW1zKTsKKyAqLworCisjaWYgZGVmaW5lZChYX0lOQ0xVREVfR1JQX0gpICYmICFkZWZpbmVkKF9YT1NfSU5DTFVERURfR1JQX0gpCisjIGluY2x1ZGUgPGdycC5oPgorIyBpZiBkZWZpbmVkKFhVU0VfTVRTQUZFX0FQSSkgfHwgZGVmaW5lZChYVVNFX01UU0FGRV9HUlBBUEkpCisjICBkZWZpbmUgWE9TX1VTRV9NVFNBRkVfR1JQQVBJIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWF9JTkNMVURFX0dSUF9IKSB8fCBkZWZpbmVkKF9YT1NfSU5DTFVERURfR1JQX0gpCisvKiBEbyBub3RoaW5nLiAqLworCisjZWxpZiAhZGVmaW5lZChYVEhSRUFEUykgJiYgIWRlZmluZWQoWF9GT1JDRV9VU0VfTVRTQUZFX0FQSSkKKy8qIFVzZSByZWd1bGFyLCB1bnNhZmUgQVBJLiAqLwordHlwZWRlZiBpbnQgX1hnZXRncnBhcmFtczsJLyogZHVtbXkgKi8KKyNkZWZpbmUgX1hHZXRncmdpZChnLHApCWdldGdyZ2lkKChnKSkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApCWdldGdybmFtKChuKSkKKworI2VsaWYgIWRlZmluZWQoWE9TX1VTRV9NVFNBRkVfR1JQQVBJKSB8fCBkZWZpbmVkKFhOT19NVFNBRkVfR1JQQVBJKQorLyogU3lzdGVtcyB3aXRoIHRocmVhZCBzdXBwb3J0IGJ1dCBubyBfciBBUEkuICBVbml4V2FyZSAyLjAuICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBncm91cCBncnA7CisgIGNoYXIgYnVmW1hfTElORV9NQVhdOwkvKiBTaG91bGQgYmUgc3lzY29uZihfU0NfR0VUR1JfUl9TSVpFX01BWCk/ICovCisgIHN0cnVjdCBncm91cCAqcGdycDsKKyAgc2l6ZV90IGxlbjsKK30gX1hnZXRncnBhcmFtczsKKyNpZmRlZiBTVlI0CisvKiBDb3B5IHRoZSBncl9wYXNzd2QgZmllbGQgdG9vLiAqLworIyBkZWZpbmUgX1hncnBfY29weUdyb3VwKHApIFwKKyAoIG1lbWNweSgmKHApLmdycCwgKHApLnBncnAsIHNpemVvZihzdHJ1Y3QgZ3JvdXApKSwgXAorICAgKChwKS5ncnAuZ3JfbmFtZSA9IChwKS5idWYpLCBcCisgICAoKHApLmxlbiA9IHN0cmxlbigocCkucGdycC0+Z3JfbmFtZSkpLCBcCisgICBzdHJjcHkoKHApLmdycC5ncl9uYW1lLCAocCkucGdycC0+Z3JfbmFtZSksIFwKKyAgICgocCkuZ3JwLmdyX3Bhc3N3ZCA9IChwKS5ncnAuZ3JfbmFtZSArIChwKS5sZW4gKyAxKSwgXAorICAgKChwKS5wZ3JwID0gJihwKS5ncnApLCBcCisgICAwICkKKyNlbHNlCisjIGRlZmluZSBfWGdycF9jb3B5R3JvdXAocCkgXAorICggbWVtY3B5KCYocCkuZ3JwLCAocCkucGdycCwgc2l6ZW9mKHN0cnVjdCBncm91cCkpLCBcCisgICAoKHApLmdycC5ncl9uYW1lID0gKHApLmJ1ZiksIFwKKyAgIHN0cmNweSgocCkuZ3JwLmdyX25hbWUsIChwKS5wZ3JwLT5ncl9uYW1lKSwgXAorICAgKChwKS5wZ3JwID0gJihwKS5ncnApLCBcCisgICAwICkKKyNlbmRpZgorI2RlZmluZSBfWEdldGdyZ2lkKGcscCkgXAorICggKF9Yb3NfcHJvY2Vzc0xvY2spLCBcCisgICAoKChwKS5wZ3JwID0gZ2V0Z3JnaWQoKGcpKSkgPyBfWGdycF9jb3B5R3JvdXAocCkgOiAwKSwgXAorICAgKF9Yb3NfcHJvY2Vzc1VubG9jayksIFwKKyAgIChwKS5wZ3JwICkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApIFwKKyAoIChfWG9zX3Byb2Nlc3NMb2NrKSwgXAorICAgKCgocCkucGdycCA9IGdldGdybmFtKChuKSkpID8gX1hncnBfY29weUdyb3VwKHApIDogMCksIFwKKyAgIChfWG9zX3Byb2Nlc3NVbmxvY2spLCBcCisgICAocCkucGdycCApCisKKyNlbGlmICFkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpICYmIChkZWZpbmVkKHN1bikgfHwgZGVmaW5lZChfX29zZl9fKSkKKy8qIE5vbi1QT1NJWCBBUEkuICBTb2xhcmlzLCBERUMgdjMuMi4KKyAqCisgKiBleHRlcm4gc3RydWN0IGdyb3VwICpnZXRncmdpZF9yKGdpZF90LCBzdHJ1Y3QgZ3JvdXAgKiwgY2hhciAqLCBpbnQpOworICogZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JuYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBncm91cCAqLCBjaGFyICosIGludCk7CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGdyb3VwIGdycDsKKyAgY2hhciBidWZbWF9MSU5FX01BWF07CS8qIFNob3VsZCBiZSBzeXNjb25mKF9TQ19HRVRHUl9SX1NJWkVfTUFYKT8gKi8KK30gX1hnZXRncnBhcmFtczsKKyNkZWZpbmUgX1hHZXRncmdpZChnLHApCWdldGdyZ2lkX3IoKGcpLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKQorI2RlZmluZSBfWEdldGdybmFtKG4scCkJZ2V0Z3JuYW1fcigobiksICYocCkuZ3JwLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZikpCisKKyNlbGlmICFkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpCisvKiBOb24tUE9TSVggQVBJLiAgSFAvVVggMTAsIEFJWCA0LgorICoKKyAqIGV4dGVybiBpbnQgZ2V0Z3JnaWRfcihnaWRfdCwgc3RydWN0IGdyb3VwICosIGNoYXIgKiwgaW50KTsKKyAqIGV4dGVybiBpbnQgZ2V0Z3JuYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBncm91cCAqLCBjaGFyICosIGludCk7CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGdyb3VwIGdycDsKKyAgY2hhciBidWZbWF9MSU5FX01BWF07CS8qIFNob3VsZCBiZSBzeXNjb25mKF9TQ19HRVRHUl9SX1NJWkVfTUFYKT8gKi8KK30gX1hnZXRncnBhcmFtczsKKyNkZWZpbmUgX1hHZXRncmdpZChnLHApCVwKKyAoKGdldGdyZ2lkX3IoKGcpLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpKSA/IE5VTEwgOiAmKHApLmdycCkpCisjZGVmaW5lIF9YR2V0Z3JuYW0obixwKQlcCisgKChnZXRncm5hbV9yKChuKSwgJihwKS5ncnAsIChwKS5idWYsIHNpemVvZigocCkuYnVmKSkgPyBOVUxMIDogJihwKS5ncnApKQorCisjZWxzZQorLyogUE9TSVggZmluYWwgQVBJLiAgREVDIHY0LjAsIElSSVggNi4yLgorICoKKyAqIGludCBnZXRncmdpZF9yKGdpZF90LCBzdHJ1Y3QgZ3JvdXAgKiwgY2hhciAqLCBzaXplX3QsIHN0cnVjdCBncm91cCAqKik7CisgKiBpbnQgZ2V0Z3JuYW1fcihjb25zdCBjaGFyICosIHN0cnVjdCBncm91cCAqLCBjaGFyICosIHNpemVfdCwgc3RydWN0IGdyb3VwICoqKTsKKyAqLworIyBpZiBkZWZpbmVkKF9fb3NmX18pCisvKiBPU0YvMSBWNC4wIDxncnAuaD4gZG9lc24ndCBkZWNsYXJlIHRoZSBfUCByb3V0aW5lcywgYnJlYWtpbmcgdW5kZXIgQysrLiAqLworZXh0ZXJuIGludCBfUGdldGdyZ2lkX3IoZ2lkX3QsIHN0cnVjdCBncm91cCAqLCBjaGFyICosIHNpemVfdCwgc3RydWN0IGdyb3VwICoqKTsKK2V4dGVybiBpbnQgX1BnZXRncm5hbV9yKGNvbnN0IGNoYXIgKiwgc3RydWN0IGdyb3VwICosIGNoYXIgKiwgc2l6ZV90LCBzdHJ1Y3QgZ3JvdXAgKiopOworIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZ3JvdXAgZ3JwOworICBjaGFyIGJ1ZltYX0xJTkVfTUFYXTsJLyogU2hvdWxkIGJlIHN5c2NvbmYoX1NDX0dFVEdSX1JfU0laRV9NQVgpPyAqLworICBzdHJ1Y3QgZ3JvdXAgKnJlc3VsdDsKK30gX1hnZXRncnBhcmFtczsKKworI2RlZmluZSBfWEdldGdyZ2lkKGcscCkJXAorICgoZ2V0Z3JnaWRfcigoZyksICYocCkuZ3JwLCAocCkuYnVmLCBzaXplb2YoKHApLmJ1ZiksICYocCkucmVzdWx0KSA/IFwKKyAgIE5VTEwgOiAocCkucmVzdWx0KSkKKyNkZWZpbmUgX1hHZXRncm5hbShuLHApCVwKKyAoKGdldGdybmFtX3IoKG4pLCAmKHApLmdycCwgKHApLmJ1Ziwgc2l6ZW9mKChwKS5idWYpLCAmKHApLnJlc3VsdCkgPyBcCisgICBOVUxMIDogKHApLnJlc3VsdCkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoWF9JTkNMVURFX0dSUF9IKSAmJiAhZGVmaW5lZChfWE9TX0lOQ0xVREVEX0dSUF9IKQorIyBkZWZpbmUgX1hPU19JTkNMVURFRF9HUlBfSAorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvKiBDbG9zZSBzY29wZSBvZiAnZXh0ZXJuICJDIicgZGVjbGFyYXRpb24gd2hpY2ggZW5jbG9zZXMgZmlsZS4gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zZGVmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWG9zZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWQ3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yb3NkZWZzLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBPL1MtZGVwZW5kZW50IChtaXMpZmVhdHVyZSBtYWNybyBkZWZpbml0aW9ucworICoKKyAqICRYZG90T3JnOiB4Yy9pbmNsdWRlL1hvc2RlZnMuaCx2IDEuMyAyMDA1LzA0LzI4IDIyOjA0OjEyIGFsYW5jIEV4cCAkCisgKiAkWG9yZzogWG9zZGVmcy5oLHYgMS41IDIwMDEvMDIvMDkgMDI6MDM6MjMgeG9yZ2N2cyBFeHAgJAorICoKK0NvcHlyaWdodCAxOTkxLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9Yb3NkZWZzLmgsdiAzLjIwIDIwMDIvMDUvMzEgMTg6NDU6MzkgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWE9TREVGU19IXworI2RlZmluZSBfWE9TREVGU19IXworCisvKgorICogWF9OT1RfU1REQ19FTlYgbWVhbnMgZG9lcyBub3QgaGF2ZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgTGFjayBvZiB0aGlzCisgKiBzeW1ib2wgZG9lcyBOT1QgbWVhbiB0aGF0IHRoZSBzeXN0ZW0gaGFzIHN0ZGFyZy5oLgorICoKKyAqIFhfTk9UX1BPU0lYIG1lYW5zIGRvZXMgbm90IGhhdmUgUE9TSVggaGVhZGVyIGZpbGVzLiAgTGFjayBvZiB0aGlzCisgKiBzeW1ib2wgZG9lcyBOT1QgbWVhbiB0aGF0IHRoZSBQT1NJWCBlbnZpcm9ubWVudCBpcyB0aGUgZGVmYXVsdC4KKyAqIFlvdSBtYXkgc3RpbGwgaGF2ZSB0byBkZWZpbmUgX1BPU0lYX1NPVVJDRSB0byBnZXQgaXQuCisgKi8KKworI2lmZGVmIE5PU1RESERSUworI2RlZmluZSBYX05PVF9QT1NJWAorI2RlZmluZSBYX05PVF9TVERDX0VOVgorI2VuZGlmCisKKyNpZmRlZiBzb255CisjaWYgIWRlZmluZWQoU1lTVFlQRV9TWVNWKSAmJiAhZGVmaW5lZChfU1lTVFlQRV9TWVNWKQorI2RlZmluZSBYX05PVF9QT1NJWAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFVURUsKKyNkZWZpbmUgWF9OT1RfUE9TSVgKKyNkZWZpbmUgWF9OT1RfU1REQ19FTlYKKyNlbmRpZgorCisjaWZkZWYgdmF4CisjaWZuZGVmIHVsdHJpeAkJCS8qIGFzc3VtZSB2YW5pbGxhIEJTRCAqLworI2RlZmluZSBYX05PVF9QT1NJWAorI2RlZmluZSBYX05PVF9TVERDX0VOVgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIGx1bmEKKyNkZWZpbmUgWF9OT1RfUE9TSVgKKyNkZWZpbmUgWF9OT1RfU1REQ19FTlYKKyNlbmRpZgorCisjaWZkZWYgTWlwcworI2RlZmluZSBYX05PVF9QT1NJWAorI2RlZmluZSBYX05PVF9TVERDX0VOVgorI2VuZGlmCisgIAorI2lmZGVmIFVTTAorI2lmZGVmIFNZU1YgLyogKHJlbGVhc2UgMy4yKSAqLworI2RlZmluZSBYX05PVF9QT1NJWAorI2RlZmluZSBYX05PVF9TVERDX0VOVgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9TQ09fRFMKKyNpZm5kZWYgX19TQ09fXworI2RlZmluZSBfX1NDT19fCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgaTM4NgorI2lmZGVmIFNZU1YKKyNpZiAhZGVmaW5lZChJU0MpICYmICFkZWZpbmVkKF9fU0NPX18pICYmICFkZWZpbmVkKF9TRVFVRU5UXykgJiYgXAorCSFkZWZpbmVkKF9fVU5JWFdBUkVfXykgJiYgIWRlZmluZWQoc3VuKQorI2lmICFkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpCisjZGVmaW5lIFhfTk9UX1BPU0lYCisjZW5kaWYKKyNkZWZpbmUgWF9OT1RfU1REQ19FTlYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIE1PVE9ST0xBCisjaWZkZWYgU1lTVgorI2RlZmluZSBYX05PVF9TVERDX0VOVgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIHN1bgorLyogSW1ha2UgY29uZmlncyBkZWZpbmUgU1ZSNCBvbiBTb2xhcmlzLCBidXQgY2MgJiBnY2Mgb25seSBkZWZpbmUgX19TVlI0CisgKiBUaGlzIGNoZWNrIGFsbG93cyBub24tSW1ha2UgY29uZmlndXJlZCBwcm9ncmFtcyB0byBidWlsZCBjb3JyZWN0bHkuCisgKi8KKyNpZiBkZWZpbmVkKF9fU1ZSNCkgJiYgIWRlZmluZWQoU1ZSNCkKKyNkZWZpbmUgU1ZSNCAxCisjZW5kaWYKKyNpZmRlZiBTVlI0CisvKiBkZWZpbmUgdGhpcyB0byB3aGF0ZXZlciBpdCBuZWVkcyB0byBiZSAqLworI2RlZmluZSBYX1BPU0lYX0NfU09VUkNFIDE5OTMwMEwKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBfUE9TSVhfCisjZGVmaW5lIFhfTk9UX1BPU0lYCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChuZWNfZXdzX3N2cjIpIHx8IGRlZmluZWQoU1gpIHx8IGRlZmluZWQoUENfVVgpCisjZGVmaW5lIFhfTk9UX1BPU0lYCisjZGVmaW5lIFhfTk9UX1NURENfRU5WCisjZW5kaWYKKworI2lmZGVmIF9fVU5JWE9TMl9fCisjZGVmaW5lIFVTR0lTSAorI2RlZmluZSBOVUxMX05PVF9aRVJPCisjZW5kaWYKKworI2lmZGVmIF9fREFSV0lOX18KKyNkZWZpbmUgTlVMTF9OT1RfWkVSTworI2VuZGlmCisKKyNpZmRlZiBfX0dOVV9fCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIDQwOTYKKyNlbmRpZgorI2lmbmRlZiBNQVhQQVRITEVOCisjZGVmaW5lIE1BWFBBVEhMRU4gNDA5NgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VOSVhXQVJFX18pCisjIGlmbmRlZiBQQVRIX01BWAorIyAgZGVmaW5lIFBBVEhfTUFYCTEwMjQKKyMgZW5kaWYKKyMgaWZuZGVmIE1BWFBBVEhMRU4KKyMgIGRlZmluZSBNQVhQQVRITEVOCTEwMjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSBcCisJfHwgZGVmaW5lZChfX0Rhcndpbl9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjIGlmbmRlZiBDU1JHX0JBU0VECisjICBkZWZpbmUgQ1NSR19CQVNFRAorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfWE9TREVGU19IXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHBvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDgzYzIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHBvbGwuaApAQCAtMCwwICsxLDI1NSBAQAorLyogJFhvcmc6IFhwb2xsLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyMyB4b3JnY3ZzIEV4cCAkICovCisKKy8qCisKK0NvcHlyaWdodCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoKKyAqIENvcHlyaWdodCDCqSAyMDA1IERhbmllbCBTdG9uZQorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERhbmllbCBTdG9uZSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZworICogb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgRGFuaWVsIFN0b25lIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogREFOSUVMIFNUT05FIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKyAqIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorICogREFOSUVMIFNUT05FIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyovCisKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL1hwb2xsLmgsdiAzLjggMjAwMS8wMS8xNyAxNzo1MzoxMSBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9YUE9MTF9IXworI2RlZmluZSBfWFBPTExfSF8KKworI2lmbmRlZiBXSU4zMgorCisjaWZuZGVmIFVTRV9QT0xMCisKKyNpbmNsdWRlIDxYMTEvWG9zLmg+CisKKy8qIEJlbG93IGlzIHRoZSBtb25zdGVyIGJyYW5jaCBmcm9tIGhlbGwuICBCYXNpY2FsbHksIG1vc3Qgc3lzdGVtcyB3aWxsIGRyb3AgdG8KKyAqICd0aGUgYnJhbmNoIGJlbG93IGlzIHRoZSBmYWxsdGhyb3VnaCBmb3IgaGFsZndheSBtb2Rlcm4gc3lzdGVtcycsIGFuZCBpbmNsdWRlCisgKiA8c3lzL3NlbGVjdC5oPiwgc28gd2UgZ2V0IHRoZSBGRF8qIG1hY3Jvcy4gKi8KKyNpZiAhZGVmaW5lZChER1VYKQorIyBpZiAoZGVmaW5lZChTVlI0KSB8fCBkZWZpbmVkKENSQVkpIHx8IGRlZmluZWQoQUlYVjMpKSAmJiAhZGVmaW5lZChGRF9TRVRTSVpFKQorIyAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorIyAgaWZkZWYgbHVuYQorIyAgIGluY2x1ZGUgPHN5c2VudC5oPgorIyAgZW5kaWYKKyMgZWxzZSAvKiBub3QgU1ZSNC9DUkFZL0FJWHYzICovCisjICBpZiBkZWZpbmVkKEFJWFY0KSAvKiBBSVggNC4yIGZ1YmFyLWVkIDxzeXMvc2VsZWN0Lmg+LCBzbyB0cnkgcmVhbGx5IGhhcmQuICovCisjICAgaWYgIWRlZmluZWQoTkZEQklUUykKKyMgICAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorIyAgIGVuZGlmCisjICBlbHNlIC8qIHRoZSBicmFuY2ggYmVsb3cgaXMgdGhlIGZhbGx0aHJvdWdoIGZvciBoYWxmd2F5IG1vZGVybiBzeXN0ZW1zICovCisjICAgaWZkZWYgX19RTlhfXyAgLyogTWFrZSBzdXJlIHdlIGdldCAyNTYgYml0IHNlbGVjdCBtYXNrcyAqLworIyAgICBkZWZpbmUgRkRfU0VUU0laRSAyNTYKKyMgICBlbmRpZgorIyAgIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZSAvKiBER1VYICAtLSBObyBzeXMvc2VsZWN0IGluIEludGVsIERHL3V4ICovCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+IAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKworI2lmZGVmIENTUkdfQkFTRUQKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgaWYgQlNEIDwgMTk5MTAzCit0eXBlZGVmIGxvbmcgZmRfbWFzazsKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFhGRF9TRVRTSVpFCTI1NgorCisjaWZuZGVmIEZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUU0laRQlYRkRfU0VUU0laRQorI2VuZGlmCisKKyNpZm5kZWYgTkJCWQorI2RlZmluZSBOQkJZCTgJCS8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSAqLworI2VuZGlmCisKKyNpZm5kZWYgTkZEQklUUworI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKQkvKiBiaXRzIHBlciBtYXNrICovCisjZW5kaWYKKworI2lmbmRlZiBob3dtYW55CisjZGVmaW5lIGhvd21hbnkoeCx5KQkoKCh4KSsoKHkpLTEpKS8oeSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQlNEKSAmJiBCU0QgPCAxOTg5MTEgJiYgIWRlZmluZWQobHVuYSkKK3R5cGVkZWYgc3RydWN0IGZkX3NldCB7CisJZmRfbWFzayBmZHNfYml0c1tob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpXTsKK30gZmRfc2V0OworI2VuZGlmCisKKyNpZm5kZWYgaHB1eCAvKiBhbmQgcGVyaGFwcyBvbGQgQlNEID8/PyAqLworIyBkZWZpbmUgU2VsZWN0KG4scix3LGUsdCkgc2VsZWN0KG4sKGZkX3NldCopciwoZmRfc2V0Kil3LChmZF9zZXQqKWUsKHN0cnVjdCB0aW1ldmFsKil0KQorI2Vsc2UKKyMgaWZuZGVmIF9YUEc0X0VYVEVOREVEIC8qIEhQVVggOS54IGFuZCBlYXJsaWVyICovCisjICBkZWZpbmUgU2VsZWN0KG4scix3LGUsdCkgc2VsZWN0KG4sKGludCopciwoaW50Kil3LChpbnQqKWUsKHN0cnVjdCB0aW1ldmFsKil0KQorIyBlbHNlCisjICBkZWZpbmUgU2VsZWN0KG4scix3LGUsdCkgc2VsZWN0KG4sKGZkX3NldCopciwoZmRfc2V0Kil3LChmZF9zZXQqKWUsKHN0cnVjdCB0aW1ldmFsKil0KQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX19YX0ZEU19CSVRTIF9fZmRzX2JpdHMKKworI2lmbmRlZiBfX0ZEU19CSVRTCisjIGRlZmluZSBfX0ZEU19CSVRTKHApICAoKHApLT5fX1hfRkRTX0JJVFMpCisjZW5kaWYKKworI2RlZmluZSBfX1hGRFNfQklUUyhwLCBuKSAoX19GRFNfQklUUyhwKSlbbl0KKworI2lmbmRlZiBGRF9TRVQKKyNkZWZpbmUgRkRfU0VUKG4sIHApICAgIChfX1hGRFNfQklUUyhwLCAoKG4pL05GREJJVFMpKSB8PSAoKGZkX21hc2spMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2VuZGlmCisjaWZuZGVmIEZEX0NMUgorI2RlZmluZSBGRF9DTFIobiwgcCkgICAgKF9fWEZEU19CSVRTKChwKSwgKChuKS9ORkRCSVRTKSkgJj0gfigoZmRfbWFzaykxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZW5kaWYKKyNpZm5kZWYgRkRfSVNTRVQKKyNkZWZpbmUgRkRfSVNTRVQobiwgcCkgICgoX19YRkRTX0JJVFMoKHApLCAoKG4pL05GREJJVFMpKSkgJiAoKGZkX21hc2spMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2VuZGlmCisjaWZuZGVmIEZEX1pFUk8KKyNkZWZpbmUgRkRfWkVSTyhwKSAgICAgIGJ6ZXJvKChjaGFyICopKHApLCBzaXplb2YoKihwKSkpCisjZW5kaWYKKworLyoKKyAqIFRoZSBob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpIGNvbXB1dGVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisgKiBhcnJheS4gYmVmb3JlIGFjY2Vzc2luZyBhbiBlbGVtZW50IGluIHRoZSBhcnJheSB3ZSBjaGVjayBpdCBleGlzdHMuCisgKiBJZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZSBjb21waWxlciBkaXNjYXJkcyB0aGUgY29kZSB0byBhY2Nlc3MgaXQuIAorICovCisjZGVmaW5lIFhGRF9BTllTRVQocCkgXAorICAgICAgICAoKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiAwICYmIChfX1hGRFNfQklUUyhwLCAwKSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiAxICYmIChfX1hGRFNfQklUUyhwLCAxKSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiAyICYmIChfX1hGRFNfQklUUyhwLCAyKSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiAzICYmIChfX1hGRFNfQklUUyhwLCAzKSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiA0ICYmIChfX1hGRFNfQklUUyhwLCA0KSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiA1ICYmIChfX1hGRFNfQklUUyhwLCA1KSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiA2ICYmIChfX1hGRFNfQklUUyhwLCA2KSkpIHx8IFwKKyAgICAgICAgKGhvd21hbnkoRkRfU0VUU0laRSwgTkZEQklUUykgPiA3ICYmIChfX1hGRFNfQklUUyhwLCA3KSkpKQorCisjZGVmaW5lIFhGRF9DT1BZU0VUKHNyYyxkc3QpIHsgXAorICAgICAgICBpbnQgX19pX187IFwKKwkJZm9yIChfX2lfXyA9IDA7IF9faV9fIDwgaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKTsgX19pX18rKykgXAorICAgICAgICAgICAgX19YRkRTX0JJVFMoKGRzdCksIF9faV9fKSA9IF9fWEZEU19CSVRTKChzcmMpLCBfX2lfXyk7IFwKKyAgICAgICAgfQorI2RlZmluZSBYRkRfQU5EU0VUKGRzdCxiMSxiMikgeyBcCisgICAgICAgIGludCBfX2lfXzsgXAorICAgICAgICBmb3IgKF9faV9fID0gMDsgX19pX18gPCBob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpOyBfX2lfXysrKSBcCisgICAgICAgICAgICBfX1hGRFNfQklUUygoZHN0KSwgX19pX18pID0gKChfX1hGRFNfQklUUygoYjEpLCBfX2lfXykpICYgKF9fWEZEU19CSVRTKChiMiksIF9faV9fKSkpOyBcCisgICAgICAgIH0KKyNkZWZpbmUgWEZEX09SU0VUKGRzdCxiMSxiMikgeyBcCisgICAgICAgIGludCBfX2lfXzsgXAorICAgICAgICBmb3IgKF9faV9fID0gMDsgX19pX18gPCBob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpOyBfX2lfXysrKSBcCisJCV9fWEZEU19CSVRTKChkc3QpLCBfX2lfXykgPSAoKF9fWEZEU19CSVRTKChiMSksIF9faV9fKSkgfCAoX19YRkRTX0JJVFMoKGIyKSwgX19pX18pKSk7IFwKKyAgICAgICAgfSAgICAgICAgCisjZGVmaW5lIFhGRF9VTlNFVChkc3QsYjEpIHsgXAorICAgICAgICBpbnQgX19pX187IFwKKyAgICAgICAgZm9yIChfX2lfXyA9IDA7IF9faV9fIDwgaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKTsgX19pX18rKykgXAorICAgIAkJX19YRkRTX0JJVFMoKGRzdCksIF9faV9fKSAmPSB+KF9fWEZEU19CSVRTKChiMSksIF9faV9fKSk7IFwKKyAgICAgICAgfQorCisjZWxzZSAvKiBVU0VfUE9MTCAqLworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYgLyogVVNFX1BPTEwgKi8KKworI2Vsc2UgLyogV0lOMzIgKi8KKworI2RlZmluZSBYRkRfU0VUU0laRQkyNTYKKyNpZm5kZWYgRkRfU0VUU0laRQorI2RlZmluZSBGRF9TRVRTSVpFCVhGRF9TRVRTSVpFCisjZW5kaWYKKyNpbmNsdWRlIDxYMTEvWHdpbnNvY2suaD4KKworI2RlZmluZSBTZWxlY3QobixyLHcsZSx0KSBzZWxlY3QoMCwoZmRfc2V0KilyLChmZF9zZXQqKXcsKGZkX3NldCopZSwoc3RydWN0IHRpbWV2YWwqKXQpCisKKyNkZWZpbmUgWEZEX1NFVENPVU5UKHApCSgoKGZkX3NldCBGQVIgKikocCkpLT5mZF9jb3VudCkKKyNkZWZpbmUgWEZEX0ZEKHAsaSkgKCgoZmRfc2V0IEZBUiAqKShwKSktPmZkX2FycmF5W2ldKQorI2RlZmluZSBYRkRfQU5ZU0VUKHApCVhGRF9TRVRDT1VOVChwKQorCisjZGVmaW5lIFhGRF9DT1BZU0VUKHNyYyxkc3QpIHsgXAorICAgIHVfaW50IF9faTsgXAorICAgIEZEX1pFUk8oZHN0KTsgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgWEZEX1NFVENPVU5UKHNyYykgOyBfX2krKykgeyBcCisgICAgICAgIFhGRF9GRChkc3QsX19pKSA9IFhGRF9GRChzcmMsX19pKTsgXAorICAgIH0gXAorICAgIFhGRF9TRVRDT1VOVChkc3QpID0gWEZEX1NFVENPVU5UKHNyYyk7IFwKK30KKworI2RlZmluZSBYRkRfQU5EU0VUKGRzdCxiMSxiMikgeyBcCisgICAgdV9pbnQgX19pOyBcCisgICAgRkRfWkVSTyhkc3QpOyBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBYRkRfU0VUQ09VTlQoYjEpIDsgX19pKyspIHsgXAorICAgICAgICBpZiAoRkRfSVNTRVQoWEZEX0ZEKGIxLF9faSksIGIyKSkgXAorCSAgIEZEX1NFVChYRkRfRkQoYjEsX19pKSwgZHN0KTsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIFhGRF9PUlNFVChkc3QsYjEsYjIpIHsgXAorICAgIHVfaW50IF9faTsgXAorICAgIGlmIChkc3QgIT0gYjEpIFhGRF9DT1BZU0VUKGIxLGRzdCk7IFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IFhGRF9TRVRDT1VOVChiMikgOyBfX2krKykgeyBcCisgICAgICAgIGlmICghRkRfSVNTRVQoWEZEX0ZEKGIyLF9faSksIGRzdCkpIFwKKwkgICBGRF9TRVQoWEZEX0ZEKGIyLF9faSksIGRzdCk7IFwKKyAgICB9IFwKK30KKworLyogdGhpcyBvbmUgaXMgcmVhbGx5IHN1Yi1vcHRpbWFsICovCisjZGVmaW5lIFhGRF9VTlNFVChkc3QsYjEpIHsgXAorICAgIHVfaW50IF9faTsgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgWEZEX1NFVENPVU5UKGIxKSA7IF9faSsrKSB7IFwKKwlGRF9DTFIoWEZEX0ZEKGIxLF9faSksIGRzdCk7IFwKKyAgICB9IFwKK30KKworLyogd2UgaGF2ZSB0byBwYXkgdGhlIHByaWNlIG9mIGhhdmluZyBhbiBhcnJheSBoZXJlLCB1bmxpa2Ugd2l0aCBiaXRtYXNrcworICAgY2FsbGluZyB0d2ljZSBGRF9TRVQgd2l0aCB0aGUgc2FtZSBmZCBpcyBub3QgdHJhbnNwYXJlbnQsIHNvIGJlIGNhcmVmdWwgKi8KKyN1bmRlZiBGRF9TRVQKKyNkZWZpbmUgRkRfU0VUKGZkLHNldCkgZG8geyBcCisgICAgaWYgKFhGRF9TRVRDT1VOVChzZXQpIDwgRkRfU0VUU0laRSAmJiAhRkRfSVNTRVQoZmQsc2V0KSkgXAorICAgICAgICBYRkRfRkQoc2V0LFhGRF9TRVRDT1VOVChzZXQpKyspPShmZCk7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBnZXRkdGFibGVzaXplKCkgRkRfU0VUU0laRSAKKworI2VuZGlmIC8qIFdJTjMyICovCisKKyNlbmRpZiAvKiBfWFBPTExfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwcm90by5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViYmE3MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hwcm90by5oCkBAIC0wLDAgKzEsMjEyOSBAQAorLyoKKyAqCSRYb3JnOiBYcHJvdG8uaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIzIHhvcmdjdnMgRXhwICQKKyAqLworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFggd2luZG93IHN5c3RlbSB1c2VkIGJ5IHNlcnZlciBhbmQgYyBiaW5kaW5ncyAqLworCisvKgorICogVGhpcyBwYWNrZXQtY29uc3RydWN0aW9uIHNjaGVtZSBtYWtlcyB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgorICoKKyAqIDEuIFRoZSBjb21waWxlciBpcyBhYmxlCisgKiB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIGFkZHJlc3NlcyBvbmUtIGFuZCB0d28tYnl0ZSBxdWFudGl0aWVzLgorICogSW4gdGhlIHdvcnN0IGNhc2UsIHRoaXMgd291bGQgYmUgZG9uZSB3aXRoIGJpdC1maWVsZHMuICBJZiBiaXQtZmllbGRzCisgKiBhcmUgdXNlZCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlb3JkZXIgdGhlIHJlcXVlc3QgZmllbGRzIGluIHRoaXMgZmlsZSwKKyAqIGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG1hY2hpbmUgYXNzaWducyBiaXQgZmllbGRzIHRvCisgKiBtYWNoaW5lIHdvcmRzLiAgVGhlcmUgbWF5IGFsc28gYmUgYSBwcm9ibGVtIHdpdGggc2lnbiBleHRlbnNpb24sCisgKiBhcyBLK1Igc3BlY2lmeSB0aGF0IGJpdGZpZWxkcyBhcmUgYWx3YXlzIHVuc2lnbmVkLgorICoKKyAqIDIuIDItIGFuZCA0LWJ5dGUgZmllbGRzIGluIHBhY2tldCBzdHJ1Y3R1cmVzIG11c3QgYmUgb3JkZXJlZCBieSBoYW5kCisgKiBzdWNoIHRoYXQgdGhleSBhcmUgbmF0dXJhbGx5LWFsaWduZWQsIHNvIHRoYXQgbm8gY29tcGlsZXIgd2lsbCBldmVyCisgKiBpbnNlcnQgcGFkZGluZyBieXRlcy4KKyAqCisgKiAzLiBBbGwgcGFja2V0cyBhcmUgaGFuZC1wYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLCBmb3IKKyAqIHRoZSBzYW1lIHJlYXNvbi4KKyAqLworCisjaWZuZGVmIFhQUk9UT19ICisjZGVmaW5lIFhQUk9UT19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9YcHJvdG9zdHIuaD4KKworLyoKKyAqIERlZmluZSBjb25zdGFudHMgZm9yIHRoZSBzaXplcyBvZiB0aGUgbmV0d29yayBwYWNrZXRzLiAgVGhlIHN6XyBwcmVmaXggaXMKKyAqIHVzZWQgaW5zdGVhZCBvZiBzb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZSBzbyB0aGF0IHRoZSBzeW1ib2xzIGFyZSBubyBtb3JlCisgKiB0aGFuIDMyIGNoYXJhY3RlcnMgaW4gbGVuZ3RoICh3aGljaCBjYXVzZXMgcHJvYmxlbXMgZm9yIHNvbWUgY29tcGlsZXJzKS4KKyAqLworI2RlZmluZSBzel94U2VnbWVudCA4CisjZGVmaW5lIHN6X3hQb2ludCA0CisjZGVmaW5lIHN6X3hSZWN0YW5nbGUgOAorI2RlZmluZSBzel94QXJjIDEyCisjZGVmaW5lIHN6X3hDb25uQ2xpZW50UHJlZml4IDEyCisjZGVmaW5lIHN6X3hDb25uU2V0dXBQcmVmaXggOAorI2RlZmluZSBzel94Q29ublNldHVwIDMyCisjZGVmaW5lIHN6X3hQaXhtYXBGb3JtYXQgOAorI2RlZmluZSBzel94RGVwdGggOAorI2RlZmluZSBzel94VmlzdWFsVHlwZSAyNAorI2RlZmluZSBzel94V2luZG93Um9vdCA0MAorI2RlZmluZSBzel94VGltZWNvb3JkIDgKKyNkZWZpbmUgc3pfeEhvc3RFbnRyeSA0CisjZGVmaW5lIHN6X3hDaGFySW5mbyAxMgorI2RlZmluZSBzel94Rm9udFByb3AgOAorI2RlZmluZSBzel94VGV4dEVsdCAyCisjZGVmaW5lIHN6X3hDb2xvckl0ZW0gMTIKKyNkZWZpbmUgc3pfeHJnYiA4CisjZGVmaW5lIHN6X3hHZW5lcmljUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldFdpbmRvd0F0dHJpYnV0ZXNSZXBseSA0NAorI2RlZmluZSBzel94R2V0R2VvbWV0cnlSZXBseSAzMgorI2RlZmluZSBzel94UXVlcnlUcmVlUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEludGVybkF0b21SZXBseSAzMgorI2RlZmluZSBzel94R2V0QXRvbU5hbWVSZXBseSAzMgorI2RlZmluZSBzel94R2V0UHJvcGVydHlSZXBseSAzMgorI2RlZmluZSBzel94TGlzdFByb3BlcnRpZXNSZXBseSAzMgorI2RlZmluZSBzel94R2V0U2VsZWN0aW9uT3duZXJSZXBseSAzMgorI2RlZmluZSBzel94R3JhYlBvaW50ZXJSZXBseSAzMgorI2RlZmluZSBzel94UXVlcnlQb2ludGVyUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldE1vdGlvbkV2ZW50c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hUcmFuc2xhdGVDb29yZHNSZXBseSAzMgorI2RlZmluZSBzel94R2V0SW5wdXRGb2N1c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeUtleW1hcFJlcGx5IDQwCisjZGVmaW5lIHN6X3hRdWVyeUZvbnRSZXBseSA2MAorI2RlZmluZSBzel94UXVlcnlUZXh0RXh0ZW50c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hMaXN0Rm9udHNSZXBseSAzMgorI2RlZmluZSBzel94R2V0Rm9udFBhdGhSZXBseSAzMgorI2RlZmluZSBzel94R2V0SW1hZ2VSZXBseSAzMgorI2RlZmluZSBzel94TGlzdEluc3RhbGxlZENvbG9ybWFwc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEFsbG9jTmFtZWRDb2xvclJlcGx5IDMyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yQ2VsbHNSZXBseSAzMgorI2RlZmluZSBzel94QWxsb2NDb2xvclBsYW5lc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeUNvbG9yc1JlcGx5IDMyCisjZGVmaW5lIHN6X3hMb29rdXBDb2xvclJlcGx5IDMyCisjZGVmaW5lIHN6X3hRdWVyeUJlc3RTaXplUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFF1ZXJ5RXh0ZW5zaW9uUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RFeHRlbnNpb25zUmVwbHkgMzIKKyNkZWZpbmUgc3pfeFNldE1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94R2V0S2V5Ym9hcmRDb250cm9sUmVwbHkgNTIKKyNkZWZpbmUgc3pfeEdldFBvaW50ZXJDb250cm9sUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldFNjcmVlblNhdmVyUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RIb3N0c1JlcGx5IDMyCisjZGVmaW5lIHN6X3hTZXRNb2RpZmllck1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94RXJyb3IgMzIKKyNkZWZpbmUgc3pfeEV2ZW50IDMyCisjZGVmaW5lIHN6X3hLZXltYXBFdmVudCAzMgorI2RlZmluZSBzel94UmVxIDQKKyNkZWZpbmUgc3pfeFJlc291cmNlUmVxIDgKKyNkZWZpbmUgc3pfeENyZWF0ZVdpbmRvd1JlcSAzMgorI2RlZmluZSBzel94Q2hhbmdlV2luZG93QXR0cmlidXRlc1JlcSAxMgorI2RlZmluZSBzel94Q2hhbmdlU2F2ZVNldFJlcSA4CisjZGVmaW5lIHN6X3hSZXBhcmVudFdpbmRvd1JlcSAxNgorI2RlZmluZSBzel94Q29uZmlndXJlV2luZG93UmVxIDEyCisjZGVmaW5lIHN6X3hDaXJjdWxhdGVXaW5kb3dSZXEgOAorI2RlZmluZSBzel94SW50ZXJuQXRvbVJlcSA4CisjZGVmaW5lIHN6X3hDaGFuZ2VQcm9wZXJ0eVJlcSAyNAorI2RlZmluZSBzel94RGVsZXRlUHJvcGVydHlSZXEgMTIKKyNkZWZpbmUgc3pfeEdldFByb3BlcnR5UmVxIDI0CisjZGVmaW5lIHN6X3hTZXRTZWxlY3Rpb25Pd25lclJlcSAxNgorI2RlZmluZSBzel94Q29udmVydFNlbGVjdGlvblJlcSAyNAorI2RlZmluZSBzel94U2VuZEV2ZW50UmVxIDQ0CisjZGVmaW5lIHN6X3hHcmFiUG9pbnRlclJlcSAyNAorI2RlZmluZSBzel94R3JhYkJ1dHRvblJlcSAyNAorI2RlZmluZSBzel94VW5ncmFiQnV0dG9uUmVxIDEyCisjZGVmaW5lIHN6X3hDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYlJlcSAxNgorI2RlZmluZSBzel94R3JhYktleWJvYXJkUmVxIDE2CisjZGVmaW5lIHN6X3hHcmFiS2V5UmVxIDE2CisjZGVmaW5lIHN6X3hVbmdyYWJLZXlSZXEgMTIKKyNkZWZpbmUgc3pfeEFsbG93RXZlbnRzUmVxIDgKKyNkZWZpbmUgc3pfeEdldE1vdGlvbkV2ZW50c1JlcSAxNgorI2RlZmluZSBzel94VHJhbnNsYXRlQ29vcmRzUmVxIDE2CisjZGVmaW5lIHN6X3hXYXJwUG9pbnRlclJlcSAyNAorI2RlZmluZSBzel94U2V0SW5wdXRGb2N1c1JlcSAxMgorI2RlZmluZSBzel94T3BlbkZvbnRSZXEgMTIKKyNkZWZpbmUgc3pfeFF1ZXJ5VGV4dEV4dGVudHNSZXEgOAorI2RlZmluZSBzel94TGlzdEZvbnRzUmVxIDgKKyNkZWZpbmUgc3pfeFNldEZvbnRQYXRoUmVxIDgKKyNkZWZpbmUgc3pfeENyZWF0ZVBpeG1hcFJlcSAxNgorI2RlZmluZSBzel94Q3JlYXRlR0NSZXEgMTYKKyNkZWZpbmUgc3pfeENoYW5nZUdDUmVxIDEyCisjZGVmaW5lIHN6X3hDb3B5R0NSZXEgMTYKKyNkZWZpbmUgc3pfeFNldERhc2hlc1JlcSAxMgorI2RlZmluZSBzel94U2V0Q2xpcFJlY3RhbmdsZXNSZXEgMTIKKyNkZWZpbmUgc3pfeENvcHlBcmVhUmVxIDI4CisjZGVmaW5lIHN6X3hDb3B5UGxhbmVSZXEgMzIKKyNkZWZpbmUgc3pfeFBvbHlQb2ludFJlcSAxMgorI2RlZmluZSBzel94UG9seVNlZ21lbnRSZXEgMTIKKyNkZWZpbmUgc3pfeEZpbGxQb2x5UmVxIDE2CisjZGVmaW5lIHN6X3hQdXRJbWFnZVJlcSAyNAorI2RlZmluZSBzel94R2V0SW1hZ2VSZXEgMjAKKyNkZWZpbmUgc3pfeFBvbHlUZXh0UmVxIDE2CisjZGVmaW5lIHN6X3hJbWFnZVRleHRSZXEgMTYKKyNkZWZpbmUgc3pfeENyZWF0ZUNvbG9ybWFwUmVxIDE2CisjZGVmaW5lIHN6X3hDb3B5Q29sb3JtYXBBbmRGcmVlUmVxIDEyCisjZGVmaW5lIHN6X3hBbGxvY0NvbG9yUmVxIDE2CisjZGVmaW5lIHN6X3hBbGxvY05hbWVkQ29sb3JSZXEgMTIKKyNkZWZpbmUgc3pfeEFsbG9jQ29sb3JDZWxsc1JlcSAxMgorI2RlZmluZSBzel94QWxsb2NDb2xvclBsYW5lc1JlcSAxNgorI2RlZmluZSBzel94RnJlZUNvbG9yc1JlcSAxMgorI2RlZmluZSBzel94U3RvcmVDb2xvcnNSZXEgOAorI2RlZmluZSBzel94U3RvcmVOYW1lZENvbG9yUmVxIDE2CisjZGVmaW5lIHN6X3hRdWVyeUNvbG9yc1JlcSA4CisjZGVmaW5lIHN6X3hMb29rdXBDb2xvclJlcSAxMgorI2RlZmluZSBzel94Q3JlYXRlQ3Vyc29yUmVxIDMyCisjZGVmaW5lIHN6X3hDcmVhdGVHbHlwaEN1cnNvclJlcSAzMgorI2RlZmluZSBzel94UmVjb2xvckN1cnNvclJlcSAyMAorI2RlZmluZSBzel94UXVlcnlCZXN0U2l6ZVJlcSAxMgorI2RlZmluZSBzel94UXVlcnlFeHRlbnNpb25SZXEgOAorI2RlZmluZSBzel94Q2hhbmdlS2V5Ym9hcmRDb250cm9sUmVxIDgKKyNkZWZpbmUgc3pfeEJlbGxSZXEgNAorI2RlZmluZSBzel94Q2hhbmdlUG9pbnRlckNvbnRyb2xSZXEgMTIKKyNkZWZpbmUgc3pfeFNldFNjcmVlblNhdmVyUmVxIDEyCisjZGVmaW5lIHN6X3hDaGFuZ2VIb3N0c1JlcSA4CisjZGVmaW5lIHN6X3hMaXN0SG9zdHNSZXEgNAorI2RlZmluZSBzel94Q2hhbmdlTW9kZVJlcSA0CisjZGVmaW5lIHN6X3hSb3RhdGVQcm9wZXJ0aWVzUmVxIDEyCisjZGVmaW5lIHN6X3hSZXBseSAzMgorI2RlZmluZSBzel94R3JhYktleWJvYXJkUmVwbHkgMzIKKyNkZWZpbmUgc3pfeExpc3RGb250c1dpdGhJbmZvUmVwbHkgNjAKKyNkZWZpbmUgc3pfeFNldFBvaW50ZXJNYXBwaW5nUmVwbHkgMzIKKyNkZWZpbmUgc3pfeEdldEtleWJvYXJkTWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRQb2ludGVyTWFwcGluZ1JlcGx5IDMyCisjZGVmaW5lIHN6X3hHZXRNb2RpZmllck1hcHBpbmdSZXBseSAzMgorI2RlZmluZSBzel94TGlzdEZvbnRzV2l0aEluZm9SZXEgOAorI2RlZmluZSBzel94UG9seUxpbmVSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlBcmNSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlSZWN0YW5nbGVSZXEgMTIKKyNkZWZpbmUgc3pfeFBvbHlGaWxsUmVjdGFuZ2xlUmVxIDEyCisjZGVmaW5lIHN6X3hQb2x5RmlsbEFyY1JlcSAxMgorI2RlZmluZSBzel94UG9seVRleHQ4UmVxIDE2CisjZGVmaW5lIHN6X3hQb2x5VGV4dDE2UmVxIDE2CisjZGVmaW5lIHN6X3hJbWFnZVRleHQ4UmVxIDE2CisjZGVmaW5lIHN6X3hJbWFnZVRleHQxNlJlcSAxNgorI2RlZmluZSBzel94U2V0UG9pbnRlck1hcHBpbmdSZXEgNAorI2RlZmluZSBzel94Rm9yY2VTY3JlZW5TYXZlclJlcSA0CisjZGVmaW5lIHN6X3hTZXRDbG9zZURvd25Nb2RlUmVxIDQKKyNkZWZpbmUgc3pfeENsZWFyQXJlYVJlcSAxNgorI2RlZmluZSBzel94U2V0QWNjZXNzQ29udHJvbFJlcSA0CisjZGVmaW5lIHN6X3hHZXRLZXlib2FyZE1hcHBpbmdSZXEgOAorI2RlZmluZSBzel94U2V0TW9kaWZpZXJNYXBwaW5nUmVxIDQKKyNkZWZpbmUgc3pfeFByb3BJY29uU2l6ZSAyNAorI2RlZmluZSBzel94Q2hhbmdlS2V5Ym9hcmRNYXBwaW5nUmVxIDgKKworCisvKiBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUsCit3ZSBtdXN0IHJlZGVmaW5lIHRoZSBmb2xsb3dpbmcgdHlwZXMgaW4gdGVybXMgb2YgWG1kLmgncyB0eXBlcywgd2hpY2ggbWF5CitpbmNsdWRlIGJpdCBmaWVsZHMuICBBbGwgb2YgdGhlc2UgYXJlICN1bmRlZidkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLAorcmVzdG9yaW5nIHRoZSBkZWZpbml0aW9ucyBpbiBYLmguICAqLworCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgRHJhd2FibGUgQ0FSRDMyCisjZGVmaW5lIEZvbnQgQ0FSRDMyCisjZGVmaW5lIFBpeG1hcCBDQVJEMzIKKyNkZWZpbmUgQ3Vyc29yIENBUkQzMgorI2RlZmluZSBDb2xvcm1hcCBDQVJEMzIKKyNkZWZpbmUgR0NvbnRleHQgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorI2RlZmluZSBUaW1lIENBUkQzMgorI2RlZmluZSBLZXlDb2RlIENBUkQ4CisjZGVmaW5lIEtleVN5bSBDQVJEMzIKKworI2RlZmluZSBYX1RDUF9QT1JUIDYwMDAgICAgIC8qIGFkZCBkaXNwbGF5IG51bWJlciAqLworCisjZGVmaW5lIHhUcnVlICAgICAgICAxCisjZGVmaW5lIHhGYWxzZSAgICAgICAwCisKKwordHlwZWRlZiBDQVJEMTYgS2V5QnV0TWFzazsKKworLyoqKioqKioqKioqKioqKioqIAorICAgY29ubmVjdGlvbiBzZXR1cCBzdHJ1Y3R1cmUuICBUaGlzIGlzIGZvbGxvd2VkIGJ5CisgICBudW1Sb290cyB4V2luZG93Um9vdCBzdHJ1Y3RzLgorKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlieXRlT3JkZXI7CisgICAgQllURQlwYWQ7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTYsIG1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CW5ieXRlc0F1dGhQcm90byBCMTY7CS8qIEF1dGhvcml6YXRpb24gcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYJbmJ5dGVzQXV0aFN0cmluZyBCMTY7CS8qIEF1dGhvcml6YXRpb24gc3RyaW5nICovCisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4Q29ubkNsaWVudFByZWZpeDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgICAgIHN1Y2Nlc3M7CisgICAgQllURSAgICAgICAgICAgbGVuZ3RoUmVhc29uOyAvKm51bSBieXRlcyBpbiBzdHJpbmcgZm9sbG93aW5nIGlmIGZhaWx1cmUgKi8KKyAgICBDQVJEMTYgICAgICAgICBtYWpvclZlcnNpb24gQjE2LCAKKyAgICAgICAgICAgICAgICAgICBtaW5vclZlcnNpb24gQjE2OworICAgIENBUkQxNiAgICAgICAgIGxlbmd0aCBCMTY7ICAvKiAxLzQgYWRkaXRpb25hbCBieXRlcyBpbiBzZXR1cCBpbmZvICovCit9IHhDb25uU2V0dXBQcmVmaXg7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQzMiAgICAgICAgIHJlbGVhc2UgQjMyOworICAgIENBUkQzMiAgICAgICAgIHJpZEJhc2UgQjMyLCAKKyAgICAgICAgICAgICAgICAgICByaWRNYXNrIEIzMjsKKyAgICBDQVJEMzIgICAgICAgICBtb3Rpb25CdWZmZXJTaXplIEIzMjsKKyAgICBDQVJEMTYgICAgICAgICBuYnl0ZXNWZW5kb3IgQjE2OyAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHZlbmRvciBzdHJpbmcgKi8KKyAgICBDQVJEMTYgICAgICAgICBtYXhSZXF1ZXN0U2l6ZSBCMTY7CisgICAgQ0FSRDggICAgICAgICAgbnVtUm9vdHM7ICAgICAgICAgIC8qIG51bWJlciBvZiByb290cyBzdHJ1Y3RzIHRvIGZvbGxvdyAqLworICAgIENBUkQ4ICAgICAgICAgIG51bUZvcm1hdHM7ICAgICAgICAvKiBudW1iZXIgb2YgcGl4bWFwIGZvcm1hdHMgKi8KKyAgICBDQVJEOCAgICAgICAgICBpbWFnZUJ5dGVPcmRlcjsgICAgICAgIC8qIExTQkZpcnN0LCBNU0JGaXJzdCAqLworICAgIENBUkQ4ICAgICAgICAgIGJpdG1hcEJpdE9yZGVyOyAgICAgICAgLyogTGVhc3RTaWduaWZpY2FudCwgTW9zdFNpZ24uLi4qLworICAgIENBUkQ4ICAgICAgICAgIGJpdG1hcFNjYW5saW5lVW5pdCwgICAgIC8qIDgsIDE2LCAzMiAqLworICAgICAgICAgICAgICAgICAgIGJpdG1hcFNjYW5saW5lUGFkOyAgICAgLyogOCwgMTYsIDMyICovCisgICAgS2V5Q29kZQkgICBtaW5LZXlDb2RlLCBtYXhLZXlDb2RlOworICAgIENBUkQzMgkgICBwYWQyIEIzMjsKK30geENvbm5TZXR1cDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgICAgIGRlcHRoOworICAgIENBUkQ4ICAgICAgICAgIGJpdHNQZXJQaXhlbDsKKyAgICBDQVJEOCAgICAgICAgICBzY2FuTGluZVBhZDsKKyAgICBDQVJEOCAgICAgICAgICBwYWQxOworICAgIENBUkQzMgkgICBwYWQyIEIzMjsKK30geFBpeG1hcEZvcm1hdDsKKworLyogd2luZG93IHJvb3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlkZXB0aDsKKyAgICBDQVJEOCAJcGFkMTsKKyAgICBDQVJEMTYJblZpc3VhbHMgQjE2OyAgLyogbnVtYmVyIG9mIHhWaXN1YWxUeXBlIHN0cnVjdHVyZXMgZm9sbG93aW5nICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIH0geERlcHRoOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQgdmlzdWFsSUQgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCBjX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCBjbGFzczsKKyNlbmRpZgorICAgIENBUkQ4IGJpdHNQZXJSR0I7CisgICAgQ0FSRDE2IGNvbG9ybWFwRW50cmllcyBCMTY7CisgICAgQ0FSRDMyIHJlZE1hc2sgQjMyLCBncmVlbk1hc2sgQjMyLCBibHVlTWFzayBCMzI7CisgICAgQ0FSRDMyIHBhZCBCMzI7CisgICAgfSB4VmlzdWFsVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFdpbmRvdyAgICAgICAgIHdpbmRvd0lkIEIzMjsKKyAgICBDb2xvcm1hcCAgICAgICBkZWZhdWx0Q29sb3JtYXAgQjMyOworICAgIENBUkQzMiAgICAgICAgIHdoaXRlUGl4ZWwgQjMyLCBibGFja1BpeGVsIEIzMjsKKyAgICBDQVJEMzIgICAgICAgICBjdXJyZW50SW5wdXRNYXNrIEIzMjsgICAKKyAgICBDQVJEMTYgICAgICAgICBwaXhXaWR0aCBCMTYsIHBpeEhlaWdodCBCMTY7CisgICAgQ0FSRDE2ICAgICAgICAgbW1XaWR0aCBCMTYsIG1tSGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgICAgICAgICBtaW5JbnN0YWxsZWRNYXBzIEIxNiwgbWF4SW5zdGFsbGVkTWFwcyBCMTY7CisgICAgVmlzdWFsSUQgICAgICAgcm9vdFZpc3VhbElEIEIzMjsKKyAgICBDQVJEOCAgICAgICAgICBiYWNraW5nU3RvcmU7CisgICAgQk9PTCAgICAgICAgICAgc2F2ZVVuZGVyczsKKyAgICBDQVJEOCAgICAgICAgICByb290RGVwdGg7CisgICAgQ0FSRDggICAgICAgICAgbkRlcHRoczsgIC8qIG51bWJlciBvZiB4RGVwdGggc3RydWN0dXJlcyBmb2xsb3dpbmcgKi8KK30geFdpbmRvd1Jvb3Q7CisMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU3RydWN0dXJlIERlZm5zCisgKiAgIFN0cnVjdHVyZXMgbmVlZGVkIGZvciByZXBsaWVzIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBVc2VkIGluIEdldE1vdGlvbkV2ZW50cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDMyIHRpbWUgQjMyOworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKK30geFRpbWVjb29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IGZhbWlseTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geEhvc3RFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIElOVDE2IGxlZnRTaWRlQmVhcmluZyBCMTYsCisJICByaWdodFNpZGVCZWFyaW5nIEIxNiwKKwkgIGNoYXJhY3RlcldpZHRoIEIxNiwKKwkgIGFzY2VudCBCMTYsCisJICBkZXNjZW50IEIxNjsKKyAgICBDQVJEMTYgYXR0cmlidXRlcyBCMTY7Cit9IHhDaGFySW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEF0b20gbmFtZSBCMzI7CisgICAgQ0FSRDMyIHZhbHVlIEIzMjsKK30geEZvbnRQcm9wOworCisvKgorICogbm9uLWFsaWduZWQgYmlnLWVuZGlhbiBmb250IElEIGZvbGxvd3MgdGhpcyBzdHJ1Y3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgLyogZm9sbG93ZWQgYnkgc3RyaW5nICovCisgICAgQ0FSRDggbGVuOwkvKiBudW1iZXIgb2YgKmNoYXJhY3RlcnMqIGluIHN0cmluZywgb3IgRm9udENoYW5nZSAoMjU1KQorCQkgICBmb3IgZm9udCBjaGFuZ2UsIG9yIDAgaWYganVzdCBkZWx0YSBnaXZlbiAqLworICAgIElOVDggZGVsdGE7Cit9IHhUZXh0RWx0OworCisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIAorICAgIENBUkQzMiBwaXhlbCBCMzI7CisgICAgQ0FSRDE2IHJlZCBCMTYsIGdyZWVuIEIxNiwgYmx1ZSBCMTY7CisgICAgQ0FSRDggZmxhZ3M7ICAvKiBEb1JlZCwgRG9HcmVlbiwgRG9CbHVlIGJvb2xlYW5zICovCisgICAgQ0FSRDggcGFkOworfSB4Q29sb3JJdGVtOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYgcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNiwgcGFkIEIxNjsKK30geHJnYjsKKwordHlwZWRlZiBDQVJEOCBLRVlDT0RFOworDAorCisvKioqKioqKioqKioqKioqKioKKyAqIFhSZXA6CisgKiAgICBtZWFudCB0byBiZSAzMiBieXRlIHF1YW50aXR5IAorICoqKioqKioqKioqKioqKioqLworCisvKiBHZW5lcmljUmVwbHkgaXMgdGhlIGNvbW1vbiBmb3JtYXQgb2YgYWxsIHJlcGxpZXMuICBUaGUgImRhdGEiIGl0ZW1zCisgICBhcmUgc3BlY2lmaWMgdG8gZWFjaCBpbmRpdmlkdWFsIHJlcGx5IHR5cGUuICovCisKK3R5cGVkZWYgc3RydWN0IHsJCisgICAgQllURSB0eXBlOyAgICAgICAgICAgICAgLyogWF9SZXBseSAqLworICAgIEJZVEUgZGF0YTE7ICAgICAgICAgICAgIC8qIGRlcGVuZHMgb24gcmVwbHkgdHlwZSAqLworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7ICAvKiBvZiBsYXN0IHJlcXVlc3QgcmVjZWl2ZWQgYnkgc2VydmVyICovCisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAgICAgLyogNCBieXRlIHF1YW50aXRpZXMgYmV5b25kIHNpemUgb2YgR2VuZXJpY1JlcGx5ICovCisgICAgQ0FSRDMyIGRhdGEwMCBCMzI7CisgICAgQ0FSRDMyIGRhdGEwMSBCMzI7CisgICAgQ0FSRDMyIGRhdGEwMiBCMzI7CisgICAgQ0FSRDMyIGRhdGEwMyBCMzI7CisgICAgQ0FSRDMyIGRhdGEwNCBCMzI7CisgICAgQ0FSRDMyIGRhdGEwNSBCMzI7CisgICAgfSB4R2VuZXJpY1JlcGx5OworCisvKiBJbmRpdmlkdWFsIHJlcGx5IGZvcm1hdHMuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggYmFja2luZ1N0b3JlOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CS8qIE5PVCAwOyB0aGlzIGlzIGFuIGV4dHJhLWxhcmdlIHJlcGx5ICovCisgICAgVmlzdWFsSUQgdmlzdWFsSUQgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEMTYgY19jbGFzcyBCMTY7CisjZWxzZQorICAgIENBUkQxNiBjbGFzcyBCMTY7CisjZW5kaWYKKyAgICBDQVJEOCBiaXRHcmF2aXR5OworICAgIENBUkQ4IHdpbkdyYXZpdHk7CisgICAgQ0FSRDMyIGJhY2tpbmdCaXRQbGFuZXMgQjMyOworICAgIENBUkQzMiBiYWNraW5nUGl4ZWwgQjMyOworICAgIEJPT0wgc2F2ZVVuZGVyOworICAgIEJPT0wgbWFwSW5zdGFsbGVkOworICAgIENBUkQ4IG1hcFN0YXRlOworICAgIEJPT0wgb3ZlcnJpZGU7CisgICAgQ29sb3JtYXAgY29sb3JtYXAgQjMyOworICAgIENBUkQzMiBhbGxFdmVudE1hc2tzIEIzMjsKKyAgICBDQVJEMzIgeW91ckV2ZW50TWFzayBCMzI7CisgICAgQ0FSRDE2IGRvTm90UHJvcGFnYXRlTWFzayBCMTY7CisgICAgQ0FSRDE2IHBhZCBCMTY7CisgICAgfSB4R2V0V2luZG93QXR0cmlidXRlc1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMCAqLworICAgIFdpbmRvdyByb290IEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYgYm9yZGVyV2lkdGggQjE2OworICAgIENBUkQxNiBwYWQxIEIxNjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIH0geEdldEdlb21ldHJ5UmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgV2luZG93IHJvb3QgQjMyLCBwYXJlbnQgQjMyOworICAgIENBUkQxNiBuQ2hpbGRyZW4gQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhRdWVyeVRyZWVSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgLyogMCAqLworICAgIEF0b20gYXRvbSBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICB9IHhJbnRlcm5BdG9tUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiBvZiBhZGRpdGlvbmFsIGJ5dGVzICovCisgICAgQ0FSRDE2IG5hbWVMZW5ndGggQjE2OyAgLyogIyBvZiBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhHZXRBdG9tTmFtZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGZvcm1hdDsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAvKiBvZiBhZGRpdGlvbmFsIGJ5dGVzICovCisgICAgQXRvbSBwcm9wZXJ0eVR5cGUgQjMyOworICAgIENBUkQzMiBieXRlc0FmdGVyIEIzMjsKKyAgICBDQVJEMzIgbkl0ZW1zIEIzMjsgLyogIyBvZiA4LCAxNiwgb3IgMzItYml0IGVudGl0aWVzIGluIHJlcGx5ICovCisgICAgQ0FSRDMyIHBhZDEgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgfSB4R2V0UHJvcGVydHlSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblByb3BlcnRpZXMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geExpc3RQcm9wZXJ0aWVzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgV2luZG93IG93bmVyIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIH0geEdldFNlbGVjdGlvbk93bmVyUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBzdGF0dXM7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMzIgcGFkMSBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICB9IHhHcmFiUG9pbnRlclJlcGx5OworCit0eXBlZGVmIHhHcmFiUG9pbnRlclJlcGx5IHhHcmFiS2V5Ym9hcmRSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIHNhbWVTY3JlZW47CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBXaW5kb3cgcm9vdCBCMzIsIGNoaWxkIEIzMjsKKyAgICBJTlQxNiByb290WCBCMTYsIHJvb3RZIEIxNiwgd2luWCBCMTYsIHdpblkgQjE2OworICAgIENBUkQxNiBtYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkMSBCMTY7CisgICAgQ0FSRDMyIHBhZCBCMzI7CisgICAgfSB4UXVlcnlQb2ludGVyUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIG5FdmVudHMgQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgfSB4R2V0TW90aW9uRXZlbnRzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQk9PTCBzYW1lU2NyZWVuOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7IC8qIDAgKi8KKyAgICBXaW5kb3cgY2hpbGQgQjMyOworICAgIElOVDE2IGRzdFggQjE2LCBkc3RZIEIxNjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgfSB4VHJhbnNsYXRlQ29vcmRzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggcmV2ZXJ0VG87CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBXaW5kb3cgZm9jdXMgQjMyOworICAgIENBUkQzMiBwYWQxIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgfSB4R2V0SW5wdXRGb2N1c1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgLyogMiwgTk9UIDA7IHRoaXMgaXMgYW4gZXh0cmEtbGFyZ2UgcmVwbHkgKi8KKyAgICBCWVRFIG1hcFszMl07CisgICAgfSB4UXVlcnlLZXltYXBSZXBseTsKKworLyogV2FybmluZzogdGhpcyBNVVNUIG1hdGNoICh1cCB0byBjb21wb25lbnQgcmVuYW1pbmcpIHhMaXN0Rm9udHNXaXRoSW5mb1JlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfeFF1ZXJ5Rm9udFJlcGx5IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiBkZWZpbml0ZWx5ID4gMCwgZXZlbiBpZiAibkNoYXJJbmZvcyIgaXMgMCAqLworICAgIHhDaGFySW5mbyBtaW5Cb3VuZHM7IAorI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMSBCMzI7CisjZW5kaWYKKyAgICB4Q2hhckluZm8gbWF4Qm91bmRzOyAKKyNpZm5kZWYgV09SRDY0CisgICAgQ0FSRDMyIHdhbGlnbjIgQjMyOworI2VuZGlmCisgICAgQ0FSRDE2IG1pbkNoYXJPckJ5dGUyIEIxNiwgbWF4Q2hhck9yQnl0ZTIgQjE2OworICAgIENBUkQxNiBkZWZhdWx0Q2hhciBCMTY7CisgICAgQ0FSRDE2IG5Gb250UHJvcHMgQjE2OyAgLyogZm9sbG93ZWQgYnkgdGhpcyBtYW55IHhGb250UHJvcCBzdHJ1Y3R1cmVzICovCisgICAgQ0FSRDggZHJhd0RpcmVjdGlvbjsKKyAgICBDQVJEOCBtaW5CeXRlMSwgbWF4Qnl0ZTE7CisgICAgQk9PTCBhbGxDaGFyc0V4aXN0OworICAgIElOVDE2IGZvbnRBc2NlbnQgQjE2LCBmb250RGVzY2VudCBCMTY7CisgICAgQ0FSRDMyIG5DaGFySW5mb3MgQjMyOyAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeENoYXJJbmZvIHN0cnVjdHVyZXMgKi8KK30geFF1ZXJ5Rm9udFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRyYXdEaXJlY3Rpb247CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBJTlQxNiBmb250QXNjZW50IEIxNiwgZm9udERlc2NlbnQgQjE2OworICAgIElOVDE2IG92ZXJhbGxBc2NlbnQgQjE2LCBvdmVyYWxsRGVzY2VudCBCMTY7CisgICAgSU5UMzIgb3ZlcmFsbFdpZHRoIEIzMiwgb3ZlcmFsbExlZnQgQjMyLCBvdmVyYWxsUmlnaHQgQjMyOworICAgIENBUkQzMiBwYWQgQjMyOworICAgIH0geFF1ZXJ5VGV4dEV4dGVudHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgbkZvbnRzIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhMaXN0Rm9udHNSZXBseTsKKworLyogV2FybmluZzogdGhpcyBNVVNUIG1hdGNoICh1cCB0byBjb21wb25lbnQgcmVuYW1pbmcpIHhRdWVyeUZvbnRSZXBseSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBuYW1lTGVuZ3RoOyAgLyogMCBpbmRpY2F0ZXMgZW5kLW9mLXJlcGx5LXNlcXVlbmNlICovCisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIGRlZmluaXRlbHkgPiAwLCBldmVuIGlmICJuYW1lTGVuZ3RoIiBpcyAwICovCisgICAgeENoYXJJbmZvIG1pbkJvdW5kczsgCisjaWZuZGVmIFdPUkQ2NAorICAgIENBUkQzMiB3YWxpZ24xIEIzMjsKKyNlbmRpZgorICAgIHhDaGFySW5mbyBtYXhCb3VuZHM7IAorI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMiBCMzI7CisjZW5kaWYKKyAgICBDQVJEMTYgbWluQ2hhck9yQnl0ZTIgQjE2LCBtYXhDaGFyT3JCeXRlMiBCMTY7CisgICAgQ0FSRDE2IGRlZmF1bHRDaGFyIEIxNjsKKyAgICBDQVJEMTYgbkZvbnRQcm9wcyBCMTY7ICAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeEZvbnRQcm9wIHN0cnVjdHVyZXMgKi8KKyAgICBDQVJEOCBkcmF3RGlyZWN0aW9uOworICAgIENBUkQ4IG1pbkJ5dGUxLCBtYXhCeXRlMTsKKyAgICBCT09MIGFsbENoYXJzRXhpc3Q7CisgICAgSU5UMTYgZm9udEFzY2VudCBCMTYsIGZvbnREZXNjZW50IEIxNjsKKyAgICBDQVJEMzIgblJlcGxpZXMgQjMyOyAgIC8qIGhpbnQgYXMgdG8gaG93IG1hbnkgbW9yZSByZXBsaWVzIG1pZ2h0IGJlIGNvbWluZyAqLworfSB4TGlzdEZvbnRzV2l0aEluZm9SZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblBhdGhzIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhHZXRGb250UGF0aFJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgVmlzdWFsSUQgdmlzdWFsIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geEdldEltYWdlUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2IG5Db2xvcm1hcHMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geExpc3RJbnN0YWxsZWRDb2xvcm1hcHNSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAgIC8qIDAgKi8KKyAgICBDQVJEMTYgcmVkIEIxNiwgZ3JlZW4gQjE2LCBibHVlIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBpeGVsIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICB9IHhBbGxvY0NvbG9yUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMzIgcGl4ZWwgQjMyOworICAgIENBUkQxNiBleGFjdFJlZCBCMTYsIGV4YWN0R3JlZW4gQjE2LCBleGFjdEJsdWUgQjE2OworICAgIENBUkQxNiBzY3JlZW5SZWQgQjE2LCBzY3JlZW5HcmVlbiBCMTYsIHNjcmVlbkJsdWUgQjE2OworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgfSB4QWxsb2NOYW1lZENvbG9yUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2IG5QaXhlbHMgQjE2LCBuTWFza3MgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4QWxsb2NDb2xvckNlbGxzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7IC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgblBpeGVscyBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworICAgIENBUkQzMiByZWRNYXNrIEIzMiwgZ3JlZW5NYXNrIEIzMiwgYmx1ZU1hc2sgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgfSB4QWxsb2NDb2xvclBsYW5lc1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDE2IG5Db2xvcnMgQjE2OworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geFF1ZXJ5Q29sb3JzUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDE2IGV4YWN0UmVkIEIxNiwgZXhhY3RHcmVlbiBCMTYsIGV4YWN0Qmx1ZSBCMTY7CisgICAgQ0FSRDE2IHNjcmVlblJlZCBCMTYsIHNjcmVlbkdyZWVuIEIxNiwgc2NyZWVuQmx1ZSBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgfSB4TG9va3VwQ29sb3JSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4UXVlcnlCZXN0U2l6ZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIEJZVEUgcGFkMTsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOyAvKiAwICovCisgICAgQk9PTCAgcHJlc2VudDsKKyAgICBDQVJEOCBtYWpvcl9vcGNvZGU7CisgICAgQ0FSRDggZmlyc3RfZXZlbnQ7CisgICAgQ0FSRDggZmlyc3RfZXJyb3I7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhRdWVyeUV4dGVuc2lvblJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IG5FeHRlbnNpb25zOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIHBhZDIgQjMyOworICAgIENBUkQzMiBwYWQzIEIzMjsKKyAgICBDQVJEMzIgcGFkNCBCMzI7CisgICAgQ0FSRDMyIHBhZDUgQjMyOworICAgIENBUkQzMiBwYWQ2IEIzMjsKKyAgICBDQVJEMzIgcGFkNyBCMzI7CisgICAgfSB4TGlzdEV4dGVuc2lvbnNSZXBseTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggIHN1Y2Nlc3M7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhTZXRNYXBwaW5nUmVwbHk7Cit0eXBlZGVmIHhTZXRNYXBwaW5nUmVwbHkgeFNldFBvaW50ZXJNYXBwaW5nUmVwbHk7Cit0eXBlZGVmIHhTZXRNYXBwaW5nUmVwbHkgeFNldE1vZGlmaWVyTWFwcGluZ1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSB0eXBlOyAgLyogWF9SZXBseSAqLworICAgIENBUkQ4IG5FbHRzOyAgLyogaG93IG1hbnkgZWxlbWVudHMgZG9lcyB0aGUgbWFwIGhhdmUgKi8KKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQyIEIzMjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgQ0FSRDMyIHBhZDcgQjMyOworICAgIH0geEdldFBvaW50ZXJNYXBwaW5nUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7CisgICAgQ0FSRDgga2V5U3ltc1BlcktleUNvZGU7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKK30geEdldEtleWJvYXJkTWFwcGluZ1JlcGx5OyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsKKyAgICBDQVJEOCBudW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEMTYgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiBsZW5ndGggQjMyOworICAgIENBUkQzMiBwYWQxIEIzMjsKKyAgICBDQVJEMzIgcGFkMiBCMzI7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworfSB4R2V0TW9kaWZpZXJNYXBwaW5nUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQk9PTCBnbG9iYWxBdXRvUmVwZWF0OworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiA1ICovCisgICAgQ0FSRDMyIGxlZE1hc2sgQjMyOworICAgIENBUkQ4IGtleUNsaWNrUGVyY2VudCwgYmVsbFBlcmNlbnQ7CisgICAgQ0FSRDE2IGJlbGxQaXRjaCBCMTYsIGJlbGxEdXJhdGlvbiBCMTY7CisgICAgQ0FSRDE2IHBhZCBCMTY7CisgICAgQllURSBtYXBbMzJdOyAgLyogYml0IG1hc2tzIHN0YXJ0IGhlcmUgKi8KKyAgICB9IHhHZXRLZXlib2FyZENvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEMTYgYWNjZWxOdW1lcmF0b3IgQjE2LCBhY2NlbERlbm9taW5hdG9yIEIxNjsKKyAgICBDQVJEMTYgdGhyZXNob2xkIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIH0geEdldFBvaW50ZXJDb250cm9sUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAvKiBYX1JlcGx5ICovCisgICAgQllURSBwYWQxOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxlbmd0aCBCMzI7ICAvKiAwICovCisgICAgQ0FSRDE2IHRpbWVvdXQgQjE2LCBpbnRlcnZhbCBCMTY7CisgICAgQk9PTCBwcmVmZXJCbGFua2luZzsKKyAgICBCT09MIGFsbG93RXhwb3N1cmVzOworICAgIENBUkQxNiBwYWQyIEIxNjsKKyAgICBDQVJEMzIgcGFkMyBCMzI7CisgICAgQ0FSRDMyIHBhZDQgQjMyOworICAgIENBUkQzMiBwYWQ1IEIzMjsKKyAgICBDQVJEMzIgcGFkNiBCMzI7CisgICAgfSB4R2V0U2NyZWVuU2F2ZXJSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBCT09MIGVuYWJsZWQ7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgbkhvc3RzIEIxNjsKKyAgICBDQVJEMTYgcGFkMSBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKKyAgICB9IHhMaXN0SG9zdHNSZXBseTsKKworDAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWGVycm9yCisgKiAgICBBbGwgZXJyb3JzICBhcmUgMzIgYnl0ZXMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7ICAgICAgICAgICAgICAgICAgLyogWF9FcnJvciAqLworICAgIEJZVEUgZXJyb3JDb2RlOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7ICAgICAgIC8qIHRoZSBudGggcmVxdWVzdCBmcm9tIHRoaXMgY2xpZW50ICovCisgICAgQ0FSRDMyIHJlc291cmNlSUQgQjMyOworICAgIENBUkQxNiBtaW5vckNvZGUgQjE2OworICAgIENBUkQ4IG1ham9yQ29kZTsKKyAgICBCWVRFIHBhZDE7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7CisgICAgQ0FSRDMyIHBhZDYgQjMyOworICAgIENBUkQzMiBwYWQ3IEIzMjsKK30geEVycm9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHhFdmVudAorICogICAgQWxsIGV2ZW50cyBhcmUgMzIgYnl0ZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hFdmVudCB7CisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIEJZVEUgdHlwZTsKKwkgICAgQllURSBkZXRhaWw7CisJICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisJICAgIH0gdTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgVGltZSB0aW1lIEIzMjsKKwkgICAgV2luZG93IHJvb3QgQjMyLCBldmVudCBCMzIsIGNoaWxkIEIzMjsKKwkgICAgSU5UMTYgcm9vdFggQjE2LCByb290WSBCMTYsIGV2ZW50WCBCMTYsIGV2ZW50WSBCMTY7CisJICAgIEtleUJ1dE1hc2sgc3RhdGUgQjE2OworCSAgICBCT09MIHNhbWVTY3JlZW47CQkKKwkgICAgQllURSBwYWQxOworCX0ga2V5QnV0dG9uUG9pbnRlcjsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKyAgICAgICAgICAgIFRpbWUgdGltZSBCMzI7CisJICAgIFdpbmRvdyByb290IEIzMiwgZXZlbnQgQjMyLCBjaGlsZCBCMzI7CisJICAgIElOVDE2IHJvb3RYIEIxNiwgcm9vdFkgQjE2LCBldmVudFggQjE2LCBldmVudFkgQjE2OworCSAgICBLZXlCdXRNYXNrIHN0YXRlIEIxNjsKKwkgICAgQllURSBtb2RlOyAJCQkvKiByZWFsbHkgWE1vZGUgKi8KKwkgICAgQllURSBmbGFnczsJCS8qIHNhbWVTY3JlZW4gYW5kIGZvY3VzIGJvb2xlYW5zLCBwYWNrZWQgdG9nZXRoZXIgKi8KKyNkZWZpbmUgRUxGbGFnRm9jdXMgICAgICAgICgxPDwwKQorI2RlZmluZSBFTEZsYWdTYW1lU2NyZWVuICAgKDE8PDEpCisJfSBlbnRlckxlYXZlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQllURSBtb2RlOyAJCQkvKiByZWFsbHkgWE1vZGUgKi8KKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gZm9jdXM7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBDQVJEMTYgeCBCMTYsIHkgQjE2LCB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisJICAgIENBUkQxNiBjb3VudCBCMTY7CisJICAgIENBUkQxNiBwYWQyIEIxNjsKKwl9IGV4cG9zZTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworCSAgICBDQVJEMTYgeCBCMTYsIHkgQjE2LCB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisJICAgIENBUkQxNiBtaW5vckV2ZW50IEIxNjsKKwkgICAgQ0FSRDE2IGNvdW50IEIxNjsKKwkgICAgQllURSBtYWpvckV2ZW50OworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisJfSBncmFwaGljc0V4cG9zdXJlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisJICAgIENBUkQxNiBtaW5vckV2ZW50IEIxNjsKKwkgICAgQllURSBtYWpvckV2ZW50OworCSAgICBCWVRFIGJwYWQ7CisJfSBub0V4cG9zdXJlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQ0FSRDggc3RhdGU7CisJICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKKwl9IHZpc2liaWxpdHk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBwYXJlbnQgQjMyLCB3aW5kb3cgQjMyOworCSAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisJICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTYsIGJvcmRlcldpZHRoIEIxNjsKKwkgICAgQk9PTCBvdmVycmlkZTsKKwkgICAgQllURSBicGFkOworICAgICAgICB9IGNyZWF0ZU5vdGlmeTsKKy8qCisgKiBUaGUgZXZlbnQgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmVzIGZvciBEZXN0cm95Tm90aWZ5LCBVbm1hcE5vdGlmeSwKKyAqIE1hcE5vdGlmeSwgUmVwYXJlbnROb3RpZnksIENvbmZpZ3VyZU5vdGlmeSwgQ2lyY3VsYXRlTm90aWZ5LCBHcmF2aXR5Tm90aWZ5LAorICogbXVzdCBiZSBhdCB0aGUgc2FtZSBvZmZzZXQgYmVjYXVzZSBzZXJ2ZXIgaW50ZXJuYWwgY29kZSBpcyBkZXBlbmRpbmcgdXBvbgorICogdGhpcyB0byBwYXRjaCB1cCB0aGUgZXZlbnRzIGJlZm9yZSB0aGV5IGFyZSBkZWxpdmVyZWQuCisgKiBBbHNvIG5vdGUgdGhhdCBNYXBSZXF1ZXN0LCBDb25maWd1cmVSZXF1ZXN0IGFuZCBDaXJjdWxhdGVSZXF1ZXN0IGhhdmUKKyAqIHRoZSBzYW1lIG9mZnNldCBmb3IgdGhlIGV2ZW50IHdpbmRvdy4KKyAqLworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgZXZlbnQgQjMyLCB3aW5kb3cgQjMyOworCX0gZGVzdHJveU5vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IGV2ZW50IEIzMiwgd2luZG93IEIzMjsKKwkgICAgQk9PTCBmcm9tQ29uZmlndXJlOworCSAgICBCWVRFIHBhZDEsIHBhZDIsIHBhZDM7CisgICAgICAgIH0gdW5tYXBOb3RpZnk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzI7CisJICAgIEJPT0wgb3ZlcnJpZGU7CisJICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKKyAgICAgICAgfSBtYXBOb3RpZnk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBwYXJlbnQgQjMyLCB3aW5kb3cgQjMyOworICAgICAgICB9IG1hcFJlcXVlc3Q7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzIsIHBhcmVudCBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQk9PTCBvdmVycmlkZTsKKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gcmVwYXJlbnQ7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzIsIGFib3ZlU2libGluZyBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNiwgYm9yZGVyV2lkdGggQjE2OworCSAgICBCT09MIG92ZXJyaWRlOwkJCisJICAgIEJZVEUgYnBhZDsKKwl9IGNvbmZpZ3VyZU5vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHBhcmVudCBCMzIsIHdpbmRvdyBCMzIsIHNpYmxpbmcgQjMyOworCSAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisJICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTYsIGJvcmRlcldpZHRoIEIxNjsKKwkgICAgQ0FSRDE2IHZhbHVlTWFzayBCMTY7CisJICAgIENBUkQzMiBwYWQxIEIzMjsKKwl9IGNvbmZpZ3VyZVJlcXVlc3Q7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIFdpbmRvdyBldmVudCBCMzIsIHdpbmRvdyBCMzI7CisJICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKwkgICAgQ0FSRDMyIHBhZDEgQjMyLCBwYWQyIEIzMiwgcGFkMyBCMzIsIHBhZDQgQjMyOworCX0gZ3Jhdml0eTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHdpbmRvdyBCMzI7CisJICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisJfSByZXNpemVSZXF1ZXN0OworCXN0cnVjdCB7CisvKiBUaGUgZXZlbnQgZmllbGQgaW4gdGhlIGNpcmN1bGF0ZSByZWNvcmQgaXMgcmVhbGx5IHRoZSBwYXJlbnQgd2hlbiB0aGlzCisgICBpcyB1c2VkIGFzIGEgQ2lyY3VsYXRlUmVxdWVzdCBpbnN0ZWFkIG9mIGEgQ2lyY3VsYXRlTm90aWZ5ICovCisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgZXZlbnQgQjMyLCB3aW5kb3cgQjMyLCBwYXJlbnQgQjMyOworCSAgICBCWVRFIHBsYWNlOwkJCS8qIFRvcCBvciBCb3R0b20gKi8KKwkgICAgQllURSBwYWQxLCBwYWQyLCBwYWQzOworCX0gY2lyY3VsYXRlOworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQXRvbSBhdG9tIEIzMjsKKwkgICAgVGltZSB0aW1lIEIzMjsKKwkgICAgQllURSBzdGF0ZTsJCQkvKiBOZXdWYWx1ZSBvciBEZWxldGVkICovCisJICAgIEJZVEUgcGFkMTsKKwkgICAgQ0FSRDE2IHBhZDIgQjE2OworCX0gcHJvcGVydHk7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisgICAgICAgICAgICBUaW1lIHRpbWUgQjMyOyAgICAgCisJICAgIFdpbmRvdyB3aW5kb3cgQjMyOworCSAgICBBdG9tIGF0b20gQjMyOworCX0gc2VsZWN0aW9uQ2xlYXI7CisJc3RydWN0IHsKKyAgICAgICAgICAgIENBUkQzMiBwYWQwMCBCMzI7CisgICAgICAgICAgICBUaW1lIHRpbWUgQjMyOyAgICAKKwkgICAgV2luZG93IG93bmVyIEIzMiwgcmVxdWVzdG9yIEIzMjsKKwkgICAgQXRvbSBzZWxlY3Rpb24gQjMyLCB0YXJnZXQgQjMyLCBwcm9wZXJ0eSBCMzI7CisJfSBzZWxlY3Rpb25SZXF1ZXN0OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworICAgICAgICAgICAgVGltZSB0aW1lIEIzMjsgICAKKwkgICAgV2luZG93IHJlcXVlc3RvciBCMzI7CisJICAgIEF0b20gc2VsZWN0aW9uIEIzMiwgdGFyZ2V0IEIzMiwgcHJvcGVydHkgQjMyOworCX0gc2VsZWN0aW9uTm90aWZ5OworCXN0cnVjdCB7CisgICAgICAgICAgICBDQVJEMzIgcGFkMDAgQjMyOworCSAgICBXaW5kb3cgd2luZG93IEIzMjsKKwkgICAgQ29sb3JtYXAgY29sb3JtYXAgQjMyOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKwkgICAgQk9PTCBjX25ldzsKKyNlbHNlCisJICAgIEJPT0wgbmV3OworI2VuZGlmCisJICAgIEJZVEUgc3RhdGU7CQkJLyogSW5zdGFsbGVkIG9yIFVuSW5zdGFsbGVkICovCisJICAgIEJZVEUgcGFkMSwgcGFkMjsKKwl9IGNvbG9ybWFwOworCXN0cnVjdCB7CisJICAgIENBUkQzMiBwYWQwMCBCMzI7CisJICAgIENBUkQ4IHJlcXVlc3Q7CisJICAgIEtleUNvZGUgZmlyc3RLZXlDb2RlOworCSAgICBDQVJEOCBjb3VudDsKKwkgICAgQllURSBwYWQxOworCX0gbWFwcGluZ05vdGlmeTsKKwlzdHJ1Y3QgeworICAgICAgICAgICAgQ0FSRDMyIHBhZDAwIEIzMjsKKwkgICAgV2luZG93IHdpbmRvdyBCMzI7CisJICAgIHVuaW9uIHsKKwkJc3RydWN0IHsKKwkJICAgIEF0b20gdHlwZSBCMzI7CisJCSAgICBJTlQzMiBsb25nczAgQjMyOworCQkgICAgSU5UMzIgbG9uZ3MxIEIzMjsKKwkJICAgIElOVDMyIGxvbmdzMiBCMzI7CisJCSAgICBJTlQzMiBsb25nczMgQjMyOworCQkgICAgSU5UMzIgbG9uZ3M0IEIzMjsKKwkJfSBsOworCQlzdHJ1Y3QgeworCQkgICAgQXRvbSB0eXBlIEIzMjsKKwkJICAgIElOVDE2IHNob3J0czAgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzMSBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHMyIEIxNjsKKwkJICAgIElOVDE2IHNob3J0czMgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzNCBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHM1IEIxNjsKKwkJICAgIElOVDE2IHNob3J0czYgQjE2OworCQkgICAgSU5UMTYgc2hvcnRzNyBCMTY7CisJCSAgICBJTlQxNiBzaG9ydHM4IEIxNjsKKwkJICAgIElOVDE2IHNob3J0czkgQjE2OworCQl9IHM7CisJCXN0cnVjdCB7CisJCSAgICBBdG9tIHR5cGUgQjMyOworCQkgICAgSU5UOCBieXRlc1syMF07CisJCX0gYjsKKwkgICAgfSB1OyAKKwl9IGNsaWVudE1lc3NhZ2U7CisgICAgfSB1OworfSB4RXZlbnQ7CisKKy8qIEtleW1hcE5vdGlmeSBldmVudHMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYWJvdmUgdW5pb24gYmVjYXVzZSB0aGV5CisgICBhcmUgZGlmZmVyZW50IGZyb20gYWxsIG90aGVyIGV2ZW50czogdGhleSBkbyBub3QgaGF2ZSBhICJkZXRhaWwiCisgICBvciAic2VxdWVuY2VOdW1iZXIiLCBzbyB0aGVyZSBpcyByb29tIGZvciBhIDI0OC1iaXQga2V5IG1hc2suICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7CisgICAgQllURSBtYXBbMzFdOworICAgIH0geEtleW1hcEV2ZW50OworCisjZGVmaW5lIFhFdmVudFNpemUgKHNpemVvZih4RXZlbnQpKQorCisvKiBYUmVwbHkgaXMgdGhlIHVuaW9uIG9mIGFsbCB0aGUgcmVwbGllcyBhYm92ZSB3aG9zZSAiZml4ZWQgcGFydCIKK2ZpdHMgaW4gMzIgYnl0ZXMuICBJdCBkb2VzIE5PVCBpbmNsdWRlIEdldFdpbmRvd0F0dHJpYnV0ZXNSZXBseSwKK1F1ZXJ5Rm9udFJlcGx5LCBRdWVyeUtleW1hcFJlcGx5LCBvciBHZXRLZXlib2FyZENvbnRyb2xSZXBseSAKK0xpc3RGb250c1dpdGhJbmZvUmVwbHkgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgICAgeEdlbmVyaWNSZXBseSBnZW5lcmljOworICAgIHhHZXRHZW9tZXRyeVJlcGx5IGdlb207CisgICAgeFF1ZXJ5VHJlZVJlcGx5IHRyZWU7CisgICAgeEludGVybkF0b21SZXBseSBhdG9tOworICAgIHhHZXRBdG9tTmFtZVJlcGx5IGF0b21OYW1lOworICAgIHhHZXRQcm9wZXJ0eVJlcGx5IHByb3BlcnR5OworICAgIHhMaXN0UHJvcGVydGllc1JlcGx5IGxpc3RQcm9wZXJ0aWVzOworICAgIHhHZXRTZWxlY3Rpb25Pd25lclJlcGx5IHNlbGVjdGlvbjsKKyAgICB4R3JhYlBvaW50ZXJSZXBseSBncmFiUG9pbnRlcjsKKyAgICB4R3JhYktleWJvYXJkUmVwbHkgZ3JhYktleWJvYXJkOworICAgIHhRdWVyeVBvaW50ZXJSZXBseSBwb2ludGVyOworICAgIHhHZXRNb3Rpb25FdmVudHNSZXBseSBtb3Rpb25FdmVudHM7CisgICAgeFRyYW5zbGF0ZUNvb3Jkc1JlcGx5IGNvb3JkczsKKyAgICB4R2V0SW5wdXRGb2N1c1JlcGx5IGlucHV0Rm9jdXM7CisgICAgeFF1ZXJ5VGV4dEV4dGVudHNSZXBseSB0ZXh0RXh0ZW50czsKKyAgICB4TGlzdEZvbnRzUmVwbHkgZm9udHM7CisgICAgeEdldEZvbnRQYXRoUmVwbHkgZm9udFBhdGg7CisgICAgeEdldEltYWdlUmVwbHkgaW1hZ2U7CisgICAgeExpc3RJbnN0YWxsZWRDb2xvcm1hcHNSZXBseSBjb2xvcm1hcHM7CisgICAgeEFsbG9jQ29sb3JSZXBseSBhbGxvY0NvbG9yOworICAgIHhBbGxvY05hbWVkQ29sb3JSZXBseSBhbGxvY05hbWVkQ29sb3I7CisgICAgeEFsbG9jQ29sb3JDZWxsc1JlcGx5IGNvbG9yQ2VsbHM7CisgICAgeEFsbG9jQ29sb3JQbGFuZXNSZXBseSBjb2xvclBsYW5lczsKKyAgICB4UXVlcnlDb2xvcnNSZXBseSBjb2xvcnM7CisgICAgeExvb2t1cENvbG9yUmVwbHkgbG9va3VwQ29sb3I7CisgICAgeFF1ZXJ5QmVzdFNpemVSZXBseSBiZXN0U2l6ZTsKKyAgICB4UXVlcnlFeHRlbnNpb25SZXBseSBleHRlbnNpb247CisgICAgeExpc3RFeHRlbnNpb25zUmVwbHkgZXh0ZW5zaW9uczsKKyAgICB4U2V0TW9kaWZpZXJNYXBwaW5nUmVwbHkgc2V0TW9kaWZpZXJNYXBwaW5nOworICAgIHhHZXRNb2RpZmllck1hcHBpbmdSZXBseSBnZXRNb2RpZmllck1hcHBpbmc7CisgICAgeFNldFBvaW50ZXJNYXBwaW5nUmVwbHkgc2V0UG9pbnRlck1hcHBpbmc7CisgICAgeEdldEtleWJvYXJkTWFwcGluZ1JlcGx5IGdldEtleWJvYXJkTWFwcGluZzsKKyAgICB4R2V0UG9pbnRlck1hcHBpbmdSZXBseSBnZXRQb2ludGVyTWFwcGluZzsKKyAgICB4R2V0UG9pbnRlckNvbnRyb2xSZXBseSBwb2ludGVyQ29udHJvbDsKKyAgICB4R2V0U2NyZWVuU2F2ZXJSZXBseSBzY3JlZW5TYXZlcjsKKyAgICB4TGlzdEhvc3RzUmVwbHkgaG9zdHM7CisgICAgeEVycm9yIGVycm9yOworICAgIHhFdmVudCBldmVudDsKK30geFJlcGx5OworCisMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkVRVUVTVFMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBSZXF1ZXN0IHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCBfeFJlcSB7CisJQ0FSRDggcmVxVHlwZTsKKwlDQVJEOCBkYXRhOyAgICAgICAgICAgIC8qIG1lYW5pbmcgZGVwZW5kcyBvbiByZXF1ZXN0IHR5cGUgKi8KKwlDQVJEMTYgbGVuZ3RoIEIxNjsgICAgICAgICAvKiBsZW5ndGggaW4gNCBieXRlcyBxdWFudGl0aWVzIAorCQkJCSAgb2Ygd2hvbGUgcmVxdWVzdCwgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovCit9IHhSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIHN0cnVjdHVyZXMgdGhhdCBmb2xsb3cgcmVxdWVzdC4gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJlc291cmNlUmVxIGlzIHVzZWQgZm9yIGFueSByZXF1ZXN0IHdoaWNoIGhhcyBhIHJlc291cmNlIElEIAorICAgKG9yIEF0b20gb3IgVGltZSkgYXMgaXRzIG9uZSBhbmQgb25seSBhcmd1bWVudC4gICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQzMiBpZCBCMzI7ICAvKiBhIFdpbmRvdywgRHJhd2FibGUsIEZvbnQsIEdDb250ZXh0LCBQaXhtYXAsIGV0Yy4gKi8KKyAgICB9IHhSZXNvdXJjZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZGVwdGg7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpZCBCMzIsIHBhcmVudCBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTYsIGJvcmRlcldpZHRoIEIxNjsgIAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEMTYgY19jbGFzcyBCMTY7CisjZWxzZQorICAgIENBUkQxNiBjbGFzcyBCMTY7CisjZW5kaWYKKyAgICBWaXN1YWxJRCB2aXN1YWwgQjMyOworICAgIENBUkQzMiBtYXNrIEIzMjsKK30geENyZWF0ZVdpbmRvd1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQ0FSRDMyIHZhbHVlTWFzayBCMzI7IAorfSB4Q2hhbmdlV2luZG93QXR0cmlidXRlc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBtb2RlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworfSB4Q2hhbmdlU2F2ZVNldFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzIsIHBhcmVudCBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworfSB4UmVwYXJlbnRXaW5kb3dSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBDQVJEMTYgbWFzayBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworfSB4Q29uZmlndXJlV2luZG93UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBkaXJlY3Rpb247CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7Cit9IHhDaXJjdWxhdGVXaW5kb3dSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgLyogZm9sbG93ZWQgYnkgcGFkZGVkIHN0cmluZyAqLworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBvbmx5SWZFeGlzdHM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2IG5ieXRlcyAgQjE2OyAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc3RyaW5nICovCisgICAgQ0FSRDE2IHBhZCBCMTY7Cit9IHhJbnRlcm5BdG9tUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBtb2RlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gcHJvcGVydHkgQjMyLCB0eXBlIEIzMjsKKyAgICBDQVJEOCBmb3JtYXQ7CisgICAgQllURSBwYWRbM107CisgICAgQ0FSRDMyIG5Vbml0cyBCMzI7ICAgICAvKiBsZW5ndGggb2Ygc3R1ZmYgZm9sbG93aW5nLCBkZXBlbmRzIG9uIGZvcm1hdCAqLworfSB4Q2hhbmdlUHJvcGVydHlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gcHJvcGVydHkgQjMyOworfSB4RGVsZXRlUHJvcGVydHlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBCT09MIGNfZGVsZXRlOworI2Vsc2UKKyAgICBCT09MIGRlbGV0ZTsKKyNlbmRpZgorICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIEF0b20gcHJvcGVydHkgQjMyLCB0eXBlIEIzMjsKKyAgICBDQVJEMzIgbG9uZ09mZnNldCBCMzI7CisgICAgQ0FSRDMyIGxvbmdMZW5ndGggQjMyOworfSB4R2V0UHJvcGVydHlSZXE7CisgCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBBdG9tIHNlbGVjdGlvbiBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKK30geFNldFNlbGVjdGlvbk93bmVyUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgcmVxdWVzdG9yIEIzMjsKKyAgICBBdG9tIHNlbGVjdGlvbiBCMzIsIHRhcmdldCBCMzIsIHByb3BlcnR5IEIzMjsKKyAgICBUaW1lIHRpbWUgQjMyOworICAgIH0geENvbnZlcnRTZWxlY3Rpb25SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJPT0wgcHJvcGFnYXRlOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBkZXN0aW5hdGlvbiBCMzI7CisgICAgQ0FSRDMyIGV2ZW50TWFzayBCMzI7CisjaWZkZWYgV09SRDY0CisgICAgLyogdGhlIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBiZWVuIHF1YWQtYWxpZ25lZCAqLworICAgIEJZVEUgZXZlbnRkYXRhW1NJWkVPRih4RXZlbnQpXTsKKyNlbHNlCisgICAgeEV2ZW50IGV2ZW50OworI2VuZGlmIC8qIFdPUkQ2NCAqLworfSB4U2VuZEV2ZW50UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG93bmVyRXZlbnRzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgZXZlbnRNYXNrIEIxNjsKKyAgICBCWVRFIHBvaW50ZXJNb2RlLCBrZXlib2FyZE1vZGU7CisgICAgV2luZG93IGNvbmZpbmVUbyBCMzI7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKK30geEdyYWJQb2ludGVyUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG93bmVyRXZlbnRzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgZXZlbnRNYXNrIEIxNjsKKyAgICBCWVRFIHBvaW50ZXJNb2RlLCBrZXlib2FyZE1vZGU7CisgICAgV2luZG93IGNvbmZpbmVUbyBCMzI7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgQ0FSRDggYnV0dG9uOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBtb2RpZmllcnMgQjE2OworfSB4R3JhYkJ1dHRvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggYnV0dG9uOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBncmFiV2luZG93IEIzMjsKKyAgICBDQVJEMTYgbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geFVuZ3JhYkJ1dHRvblJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ3Vyc29yIGN1cnNvciBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKKyAgICBDQVJEMTYgZXZlbnRNYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkMiBCMTY7Cit9IHhDaGFuZ2VBY3RpdmVQb2ludGVyR3JhYlJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBvd25lckV2ZW50czsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgZ3JhYldpbmRvdyBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKKyAgICBCWVRFIHBvaW50ZXJNb2RlLCBrZXlib2FyZE1vZGU7ICAKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geEdyYWJLZXlib2FyZFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBvd25lckV2ZW50czsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgZ3JhYldpbmRvdyBCMzI7CisgICAgQ0FSRDE2IG1vZGlmaWVycyBCMTY7CisgICAgQ0FSRDgga2V5OworICAgIEJZVEUgcG9pbnRlck1vZGUsIGtleWJvYXJkTW9kZTsgIAorICAgIEJZVEUgcGFkMSwgcGFkMiwgcGFkMzsKK30geEdyYWJLZXlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IGtleTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgZ3JhYldpbmRvdyBCMzI7CisgICAgQ0FSRDE2IG1vZGlmaWVycyBCMTY7CisgICAgQ0FSRDE2IHBhZCBCMTY7Cit9IHhVbmdyYWJLZXlSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IG1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgVGltZSB0aW1lIEIzMjsKK30geEFsbG93RXZlbnRzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgd2luZG93IEIzMjsKKyAgICBUaW1lIHN0YXJ0IEIzMiwgc3RvcCBCMzI7Cit9IHhHZXRNb3Rpb25FdmVudHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBzcmNXaWQgQjMyLCBkc3RXaWQgQjMyOworICAgIElOVDE2IHNyY1ggQjE2LCBzcmNZIEIxNjsKK30geFRyYW5zbGF0ZUNvb3Jkc1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHNyY1dpZCBCMzIsIGRzdFdpZCBCMzI7CisgICAgSU5UMTYgc3JjWCBCMTYsIHNyY1kgQjE2OworICAgIENBUkQxNiBzcmNXaWR0aCBCMTYsIHNyY0hlaWdodCBCMTY7CisgICAgSU5UMTYgZHN0WCBCMTYsIGRzdFkgQjE2OworfSB4V2FycFBvaW50ZXJSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IHJldmVydFRvOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIFdpbmRvdyBmb2N1cyBCMzI7CisgICAgVGltZSB0aW1lIEIzMjsKK30geFNldElucHV0Rm9jdXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEZvbnQgZmlkIEIzMjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsKKyAgICBCWVRFIHBhZDEsIHBhZDI7CS8qIHN0cmluZyBmb2xsb3dzIG9uIHdvcmQgYm91bmRhcnkgKi8KK30geE9wZW5Gb250UmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCT09MIG9kZExlbmd0aDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBGb250IGZpZCBCMzI7CisgICAgfSB4UXVlcnlUZXh0RXh0ZW50c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2IG1heE5hbWVzIEIxNjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsgIC8qIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHN0cmluZyBieXRlcyAqLworfSB4TGlzdEZvbnRzUmVxOworCit0eXBlZGVmIHhMaXN0Rm9udHNSZXEgeExpc3RGb250c1dpdGhJbmZvUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgbkZvbnRzIEIxNjsKKyAgICBCWVRFIHBhZDEsIHBhZDI7CS8qIExJU1RvZlNUUklORzggZm9sbG93cyBvbiB3b3JkIGJvdW5kYXJ5ICovCit9IHhTZXRGb250UGF0aFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZGVwdGg7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgUGl4bWFwIHBpZCBCMzI7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7Cit9IHhDcmVhdGVQaXhtYXBSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgQ0FSRDMyIG1hc2sgQjMyOworfSB4Q3JlYXRlR0NSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBDQVJEMzIgbWFzayBCMzI7Cit9IHhDaGFuZ2VHQ1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IHNyY0dDIEIzMiwgZHN0R0MgQjMyOworICAgIENBUkQzMiBtYXNrIEIzMjsKK30geENvcHlHQ1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBDQVJEMTYgZGFzaE9mZnNldCBCMTY7CisgICAgQ0FSRDE2IG5EYXNoZXMgQjE2OyAgICAgICAgLyogbGVuZ3RoIExJU1RvZkNBUkQ4IG9mIHZhbHVlcyBmb2xsb3dpbmcgKi8KK30geFNldERhc2hlc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgb3JkZXJpbmc7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgR0NvbnRleHQgZ2MgQjMyOworICAgIElOVDE2IHhPcmlnaW4gQjE2LCB5T3JpZ2luIEIxNjsKK30geFNldENsaXBSZWN0YW5nbGVzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBleHBvc3VyZXM7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworICAgIENBUkQxNiB3aWR0aCBCMTYsIGhlaWdodCBCMTY7Cit9IHhDbGVhckFyZWFSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIHNyY0RyYXdhYmxlIEIzMiwgZHN0RHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBJTlQxNiBzcmNYIEIxNiwgc3JjWSBCMTYsIGRzdFggQjE2LCBkc3RZIEIxNjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworfSB4Q29weUFyZWFSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBzcmNEcmF3YWJsZSBCMzIsIGRzdERyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgSU5UMTYgc3JjWCBCMTYsIHNyY1kgQjE2LCBkc3RYIEIxNiwgZHN0WSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIgYml0UGxhbmUgQjMyOworfSB4Q29weVBsYW5lUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBjb29yZE1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKK30geFBvbHlQb2ludFJlcTsgICAgCisKK3R5cGVkZWYgeFBvbHlQb2ludFJlcSB4UG9seUxpbmVSZXE7ICAvKiBzYW1lIHJlcXVlc3Qgc3RydWN0dXJlICovCisKKy8qIFRoZSBmb2xsb3dpbmcgdXNlZCBmb3IgUG9seVNlZ21lbnQsIFBvbHlSZWN0YW5nbGUsIFBvbHlBcmMsIFBvbHlGaWxsUmVjdGFuZ2xlLCBQb2x5RmlsbEFyYyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBEcmF3YWJsZSBkcmF3YWJsZSBCMzI7CisgICAgR0NvbnRleHQgZ2MgQjMyOworfSB4UG9seVNlZ21lbnRSZXE7ICAgIAorCit0eXBlZGVmIHhQb2x5U2VnbWVudFJlcSB4UG9seUFyY1JlcTsKK3R5cGVkZWYgeFBvbHlTZWdtZW50UmVxIHhQb2x5UmVjdGFuZ2xlUmVxOwordHlwZWRlZiB4UG9seVNlZ21lbnRSZXEgeFBvbHlGaWxsUmVjdGFuZ2xlUmVxOwordHlwZWRlZiB4UG9seVNlZ21lbnRSZXEgeFBvbHlGaWxsQXJjUmVxOworCit0eXBlZGVmIHN0cnVjdCBfRmlsbFBvbHlSZXEgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBCWVRFIHNoYXBlOworICAgIEJZVEUgY29vcmRNb2RlOworICAgIENBUkQxNiBwYWQxIEIxNjsKK30geEZpbGxQb2x5UmVxOyAgICAKKworCit0eXBlZGVmIHN0cnVjdCBfUHV0SW1hZ2VSZXEgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZm9ybWF0OworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBJTlQxNiBkc3RYIEIxNiwgZHN0WSBCMTY7CisgICAgQ0FSRDggbGVmdFBhZDsKKyAgICBDQVJEOCBkZXB0aDsKKyAgICBDQVJEMTYgcGFkIEIxNjsKK30geFB1dEltYWdlUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQ0FSRDggZm9ybWF0OworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2IHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIgcGxhbmVNYXNrIEIzMjsKK30geEdldEltYWdlUmVxOyAgICAKKworLyogdGhlIGZvbGxvd2luZyB1c2VkIGJ5IFBvbHlUZXh0OCBhbmQgUG9seVRleHQxNiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUgZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0IGdjIEIzMjsKKyAgICBJTlQxNiB4IEIxNiwgeSBCMTY7CQkvKiBpdGVtcyAoeFRleHRFbHQpIHN0YXJ0IGFmdGVyIHN0cnVjdCAqLworfSB4UG9seVRleHRSZXE7ICAgIAorCit0eXBlZGVmIHhQb2x5VGV4dFJlcSB4UG9seVRleHQ4UmVxOwordHlwZWRlZiB4UG9seVRleHRSZXEgeFBvbHlUZXh0MTZSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgbkNoYXJzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBHQ29udGV4dCBnYyBCMzI7CisgICAgSU5UMTYgeCBCMTYsIHkgQjE2OworfSB4SW1hZ2VUZXh0UmVxOyAgICAKKwordHlwZWRlZiB4SW1hZ2VUZXh0UmVxIHhJbWFnZVRleHQ4UmVxOwordHlwZWRlZiB4SW1hZ2VUZXh0UmVxIHhJbWFnZVRleHQxNlJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBhbGxvYzsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBtaWQgQjMyOworICAgIFdpbmRvdyB3aW5kb3cgQjMyOworICAgIFZpc3VhbElEIHZpc3VhbCBCMzI7Cit9IHhDcmVhdGVDb2xvcm1hcFJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIG1pZCBCMzI7CisgICAgQ29sb3JtYXAgc3JjQ21hcCBCMzI7Cit9IHhDb3B5Q29sb3JtYXBBbmRGcmVlUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDE2IHJlZCBCMTYsIGdyZWVuIEIxNiwgYmx1ZSBCMTY7CisgICAgQ0FSRDE2IHBhZDIgQjE2OworfSB4QWxsb2NDb2xvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogZm9sbG93ZWQgYnkgc3RydWN0dXJlICovCisgICAgQllURSBwYWQxLCBwYWQyOworfSB4QWxsb2NOYW1lZENvbG9yUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBjb250aWd1b3VzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBjb2xvcnMgQjE2LCBwbGFuZXMgQjE2OworfSB4QWxsb2NDb2xvckNlbGxzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQk9PTCBjb250aWd1b3VzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQxNiBjb2xvcnMgQjE2LCByZWQgQjE2LCBncmVlbiBCMTYsIGJsdWUgQjE2OworfSB4QWxsb2NDb2xvclBsYW5lc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworICAgIENBUkQzMiBwbGFuZU1hc2sgQjMyOworfSB4RnJlZUNvbG9yc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENvbG9ybWFwIGNtYXAgQjMyOworfSB4U3RvcmVDb2xvcnNSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBDQVJEOCBmbGFnczsgICAvKiBEb1JlZCwgRG9HcmVlbiwgRG9CbHVlLCBhcyBpbiB4Q29sb3JJdGVtICovCisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7CisgICAgQ0FSRDMyIHBpeGVsIEIzMjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsgIC8qIG51bWJlciBvZiBuYW1lIHN0cmluZyBieXRlcyBmb2xsb3dpbmcgc3RydWN0dXJlICovCisgICAgQllURSBwYWQxLCBwYWQyOworICAgIH0geFN0b3JlTmFtZWRDb2xvclJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAgY21hcCBCMzI7Cit9IHhRdWVyeUNvbG9yc1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsgICAgLyogZm9sbG93ZWQgIGJ5IHN0cmluZyBvZiBsZW5ndGggbGVuICovCisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcCBjbWFwIEIzMjsKKyAgICBDQVJEMTYgbmJ5dGVzIEIxNjsgIC8qIG51bWJlciBvZiBzdHJpbmcgYnl0ZXMgZm9sbG93aW5nIHN0cnVjdHVyZSovCisgICAgQllURSBwYWQxLCBwYWQyOworfSB4TG9va3VwQ29sb3JSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDdXJzb3IgY2lkIEIzMjsKKyAgICBQaXhtYXAgc291cmNlIEIzMiwgbWFzayBCMzI7CisgICAgQ0FSRDE2IGZvcmVSZWQgQjE2LCBmb3JlR3JlZW4gQjE2LCBmb3JlQmx1ZSBCMTY7CisgICAgQ0FSRDE2IGJhY2tSZWQgQjE2LCBiYWNrR3JlZW4gQjE2LCBiYWNrQmx1ZSBCMTY7CisgICAgQ0FSRDE2IHggQjE2LCB5IEIxNjsKK30geENyZWF0ZUN1cnNvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEN1cnNvciBjaWQgQjMyOworICAgIEZvbnQgc291cmNlIEIzMiwgbWFzayBCMzI7CisgICAgQ0FSRDE2IHNvdXJjZUNoYXIgQjE2LCBtYXNrQ2hhciBCMTY7CisgICAgQ0FSRDE2IGZvcmVSZWQgQjE2LCBmb3JlR3JlZW4gQjE2LCBmb3JlQmx1ZSBCMTY7CisgICAgQ0FSRDE2IGJhY2tSZWQgQjE2LCBiYWNrR3JlZW4gQjE2LCBiYWNrQmx1ZSBCMTY7Cit9IHhDcmVhdGVHbHlwaEN1cnNvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEN1cnNvciBjdXJzb3IgQjMyOworICAgIENBUkQxNiBmb3JlUmVkIEIxNiwgZm9yZUdyZWVuIEIxNiwgZm9yZUJsdWUgQjE2OworICAgIENBUkQxNiBiYWNrUmVkIEIxNiwgYmFja0dyZWVuIEIxNiwgYmFja0JsdWUgQjE2OworfSB4UmVjb2xvckN1cnNvclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCBjX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCBjbGFzczsKKyNlbmRpZgorICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIERyYXdhYmxlIGRyYXdhYmxlIEIzMjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworfSB4UXVlcnlCZXN0U2l6ZVJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIENBUkQxNiBuYnl0ZXMgQjE2OyAgLyogbnVtYmVyIG9mIHN0cmluZyBieXRlcyBmb2xsb3dpbmcgc3RydWN0dXJlICovCisgICAgQllURSBwYWQxLCBwYWQyOworfSB4UXVlcnlFeHRlbnNpb25SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgIHJlcVR5cGU7CisgICAgQ0FSRDggICBudW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7Cit9IHhTZXRNb2RpZmllck1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IG5FbHRzOyAgLyogaG93IG1hbnkgZWxlbWVudHMgaW4gdGhlIG1hcCAqLworICAgIENBUkQxNiBsZW5ndGggQjE2OworfSB4U2V0UG9pbnRlck1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEtleUNvZGUgZmlyc3RLZXlDb2RlOworICAgIENBUkQ4IGNvdW50OworICAgIENBUkQxNiBwYWQxIEIxNjsKK30geEdldEtleWJvYXJkTWFwcGluZ1JlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIENBUkQ4IGtleUNvZGVzOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIEtleUNvZGUgZmlyc3RLZXlDb2RlOworICAgIENBUkQ4IGtleVN5bXNQZXJLZXlDb2RlOworICAgIENBUkQxNiBwYWQxIEIxNjsKK30geENoYW5nZUtleWJvYXJkTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgQ0FSRDMyIG1hc2sgQjMyOworfSB4Q2hhbmdlS2V5Ym9hcmRDb250cm9sUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgSU5UOCBwZXJjZW50OyAgLyogLTEwMCB0byAxMDAgKi8KKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKK30geEJlbGxSZXE7ICAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIHBhZDsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBJTlQxNiBhY2NlbE51bSBCMTYsIGFjY2VsRGVudW0gQjE2OworICAgIElOVDE2IHRocmVzaG9sZCBCMTY7ICAgICAgICAgICAgIAorICAgIEJPT0wgZG9BY2NlbCwgZG9UaHJlc2g7Cit9IHhDaGFuZ2VQb2ludGVyQ29udHJvbFJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBsZW5ndGggQjE2OworICAgIElOVDE2IHRpbWVvdXQgQjE2LCBpbnRlcnZhbCBCMTY7CisgICAgQllURSBwcmVmZXJCbGFuaywgYWxsb3dFeHBvc2U7ICAKKyAgICBDQVJEMTYgcGFkMiBCMTY7Cit9IHhTZXRTY3JlZW5TYXZlclJlcTsgICAgCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCByZXFUeXBlOworICAgIEJZVEUgbW9kZTsKKyAgICBDQVJEMTYgbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCBob3N0RmFtaWx5OworICAgIEJZVEUgcGFkOworICAgIENBUkQxNiBob3N0TGVuZ3RoIEIxNjsKK30geENoYW5nZUhvc3RzUmVxOyAgICAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgfSB4TGlzdEhvc3RzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggcmVxVHlwZTsKKyAgICBCWVRFIG1vZGU7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgfSB4Q2hhbmdlTW9kZVJlcTsKKwordHlwZWRlZiB4Q2hhbmdlTW9kZVJlcSB4U2V0QWNjZXNzQ29udHJvbFJlcTsKK3R5cGVkZWYgeENoYW5nZU1vZGVSZXEgeFNldENsb3NlRG93bk1vZGVSZXE7Cit0eXBlZGVmIHhDaGFuZ2VNb2RlUmVxIHhGb3JjZVNjcmVlblNhdmVyUmVxOworCit0eXBlZGVmIHN0cnVjdCB7IC8qIGZvbGxvd2VkIGJ5IExJU1Qgb2YgQVRPTSAqLworICAgIENBUkQ4IHJlcVR5cGU7CisgICAgQllURSBwYWQ7CisgICAgQ0FSRDE2IGxlbmd0aCBCMTY7CisgICAgV2luZG93IHdpbmRvdyBCMzI7CisgICAgQ0FSRDE2IG5BdG9tcyBCMTY7CisgICAgSU5UMTYgblBvc2l0aW9ucyBCMTY7CisgICAgfSB4Um90YXRlUHJvcGVydGllc1JlcTsKKyAgICAKKwwKKworLyogUmVwbHkgY29kZXMgKi8KKworI2RlZmluZSBYX1JlcGx5CQkxCQkvKiBOb3JtYWwgcmVwbHkgKi8KKyNkZWZpbmUgWF9FcnJvcgkJMAkJLyogRXJyb3IgKi8KKworLyogUmVxdWVzdCBjb2RlcyAqLworCisjZGVmaW5lIFhfQ3JlYXRlV2luZG93ICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgCisjZGVmaW5lIFhfQ2hhbmdlV2luZG93QXR0cmlidXRlcyAgICAgICAgMiAgICAgICAgCisjZGVmaW5lIFhfR2V0V2luZG93QXR0cmlidXRlcyAgICAgICAgICAgMyAgICAgCisjZGVmaW5lIFhfRGVzdHJveVdpbmRvdyAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBYX0Rlc3Ryb3lTdWJ3aW5kb3dzICAgICAgICAgICAgIDUgICAKKyNkZWZpbmUgWF9DaGFuZ2VTYXZlU2V0ICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFhfUmVwYXJlbnRXaW5kb3cgICAgICAgICAgICAgICAgNworI2RlZmluZSBYX01hcFdpbmRvdyAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWF9NYXBTdWJ3aW5kb3dzICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFhfVW5tYXBXaW5kb3cgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBYX1VubWFwU3Vid2luZG93cyAgICAgICAgICAgICAgMTEgIAorI2RlZmluZSBYX0NvbmZpZ3VyZVdpbmRvdyAgICAgICAgICAgICAgMTIgIAorI2RlZmluZSBYX0NpcmN1bGF0ZVdpbmRvdyAgICAgICAgICAgICAgMTMgIAorI2RlZmluZSBYX0dldEdlb21ldHJ5ICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgWF9RdWVyeVRyZWUgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFhfSW50ZXJuQXRvbSAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBYX0dldEF0b21OYW1lICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgWF9DaGFuZ2VQcm9wZXJ0eSAgICAgICAgICAgICAgIDE4IAorI2RlZmluZSBYX0RlbGV0ZVByb3BlcnR5ICAgICAgICAgICAgICAgMTkgCisjZGVmaW5lIFhfR2V0UHJvcGVydHkgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBYX0xpc3RQcm9wZXJ0aWVzICAgICAgICAgICAgICAgMjEgCisjZGVmaW5lIFhfU2V0U2VsZWN0aW9uT3duZXIgICAgICAgICAgICAyMiAgICAKKyNkZWZpbmUgWF9HZXRTZWxlY3Rpb25Pd25lciAgICAgICAgICAgIDIzICAgIAorI2RlZmluZSBYX0NvbnZlcnRTZWxlY3Rpb24gICAgICAgICAgICAgMjQgICAKKyNkZWZpbmUgWF9TZW5kRXZlbnQgICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIFhfR3JhYlBvaW50ZXIgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBYX1VuZ3JhYlBvaW50ZXIgICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgWF9HcmFiQnV0dG9uICAgICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIFhfVW5ncmFiQnV0dG9uICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBYX0NoYW5nZUFjdGl2ZVBvaW50ZXJHcmFiICAgICAgMzAgICAgICAgICAgCisjZGVmaW5lIFhfR3JhYktleWJvYXJkICAgICAgICAgICAgICAgICAzMQorI2RlZmluZSBYX1VuZ3JhYktleWJvYXJkICAgICAgICAgICAgICAgMzIgCisjZGVmaW5lIFhfR3JhYktleSAgICAgICAgICAgICAgICAgICAgICAzMworI2RlZmluZSBYX1VuZ3JhYktleSAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgWF9BbGxvd0V2ZW50cyAgICAgICAgICAgICAgICAgIDM1ICAgICAgIAorI2RlZmluZSBYX0dyYWJTZXJ2ZXIgICAgICAgICAgICAgICAgICAgMzYgICAgICAKKyNkZWZpbmUgWF9VbmdyYWJTZXJ2ZXIgICAgICAgICAgICAgICAgIDM3ICAgICAgICAKKyNkZWZpbmUgWF9RdWVyeVBvaW50ZXIgICAgICAgICAgICAgICAgIDM4ICAgICAgICAKKyNkZWZpbmUgWF9HZXRNb3Rpb25FdmVudHMgICAgICAgICAgICAgIDM5ICAgICAgICAgICAKKyNkZWZpbmUgWF9UcmFuc2xhdGVDb29yZHMgICAgICAgICAgICAgIDQwICAgICAgICAgICAgICAgIAorI2RlZmluZSBYX1dhcnBQb2ludGVyICAgICAgICAgICAgICAgICAgNDEgICAgICAgCisjZGVmaW5lIFhfU2V0SW5wdXRGb2N1cyAgICAgICAgICAgICAgICA0MiAgICAgICAgIAorI2RlZmluZSBYX0dldElucHV0Rm9jdXMgICAgICAgICAgICAgICAgNDMgICAgICAgICAKKyNkZWZpbmUgWF9RdWVyeUtleW1hcCAgICAgICAgICAgICAgICAgIDQ0ICAgICAgIAorI2RlZmluZSBYX09wZW5Gb250ICAgICAgICAgICAgICAgICAgICAgNDUgICAgCisjZGVmaW5lIFhfQ2xvc2VGb250ICAgICAgICAgICAgICAgICAgICA0NiAgICAgCisjZGVmaW5lIFhfUXVlcnlGb250ICAgICAgICAgICAgICAgICAgICA0NworI2RlZmluZSBYX1F1ZXJ5VGV4dEV4dGVudHMgICAgICAgICAgICAgNDggICAgIAorI2RlZmluZSBYX0xpc3RGb250cyAgICAgICAgICAgICAgICAgICAgNDkgIAorI2RlZmluZSBYX0xpc3RGb250c1dpdGhJbmZvICAgIAkgICAgICAgNTAgCisjZGVmaW5lIFhfU2V0Rm9udFBhdGggICAgICAgICAgICAgICAgICA1MSAKKyNkZWZpbmUgWF9HZXRGb250UGF0aCAgICAgICAgICAgICAgICAgIDUyIAorI2RlZmluZSBYX0NyZWF0ZVBpeG1hcCAgICAgICAgICAgICAgICAgNTMgICAgICAgIAorI2RlZmluZSBYX0ZyZWVQaXhtYXAgICAgICAgICAgICAgICAgICAgNTQgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVHQyAgICAgICAgICAgICAgICAgICAgIDU1ICAgIAorI2RlZmluZSBYX0NoYW5nZUdDICAgICAgICAgICAgICAgICAgICAgNTYgICAgCisjZGVmaW5lIFhfQ29weUdDICAgICAgICAgICAgICAgICAgICAgICA1NyAgCisjZGVmaW5lIFhfU2V0RGFzaGVzICAgICAgICAgICAgICAgICAgICA1OCAgICAgCisjZGVmaW5lIFhfU2V0Q2xpcFJlY3RhbmdsZXMgICAgICAgICAgICA1OSAgICAgICAgICAgICAKKyNkZWZpbmUgWF9GcmVlR0MgICAgICAgICAgICAgICAgICAgICAgIDYwICAKKyNkZWZpbmUgWF9DbGVhckFyZWEgICAgICAgICAgICAgICAgICAgIDYxICAgICAgICAgICAgIAorI2RlZmluZSBYX0NvcHlBcmVhICAgICAgICAgICAgICAgICAgICAgNjIgICAgCisjZGVmaW5lIFhfQ29weVBsYW5lICAgICAgICAgICAgICAgICAgICA2MyAgICAgCisjZGVmaW5lIFhfUG9seVBvaW50ICAgICAgICAgICAgICAgICAgICA2NCAgICAgCisjZGVmaW5lIFhfUG9seUxpbmUgICAgICAgICAgICAgICAgICAgICA2NSAgICAKKyNkZWZpbmUgWF9Qb2x5U2VnbWVudCAgICAgICAgICAgICAgICAgIDY2ICAgICAgIAorI2RlZmluZSBYX1BvbHlSZWN0YW5nbGUgICAgICAgICAgICAgICAgNjcgICAgICAgICAKKyNkZWZpbmUgWF9Qb2x5QXJjICAgICAgICAgICAgICAgICAgICAgIDY4ICAgCisjZGVmaW5lIFhfRmlsbFBvbHkgICAgICAgICAgICAgICAgICAgICA2OSAgICAKKyNkZWZpbmUgWF9Qb2x5RmlsbFJlY3RhbmdsZSAgICAgICAgICAgIDcwICAgICAgICAgICAgIAorI2RlZmluZSBYX1BvbHlGaWxsQXJjICAgICAgICAgICAgICAgICAgNzEgICAgICAgCisjZGVmaW5lIFhfUHV0SW1hZ2UgICAgICAgICAgICAgICAgICAgICA3MiAgICAKKyNkZWZpbmUgWF9HZXRJbWFnZSAgICAgICAgICAgICAgICAgICAgIDczIAorI2RlZmluZSBYX1BvbHlUZXh0OCAgICAgICAgICAgICAgICAgICAgNzQgICAgIAorI2RlZmluZSBYX1BvbHlUZXh0MTYgICAgICAgICAgICAgICAgICAgNzUgICAgICAKKyNkZWZpbmUgWF9JbWFnZVRleHQ4ICAgICAgICAgICAgICAgICAgIDc2ICAgICAgCisjZGVmaW5lIFhfSW1hZ2VUZXh0MTYgICAgICAgICAgICAgICAgICA3NyAgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVDb2xvcm1hcCAgICAgICAgICAgICAgIDc4ICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVDb2xvcm1hcCAgICAgICAgICAgICAgICAgNzkgICAgICAgIAorI2RlZmluZSBYX0NvcHlDb2xvcm1hcEFuZEZyZWUgICAgICAgICAgODAgICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9JbnN0YWxsQ29sb3JtYXAgICAgICAgICAgICAgIDgxICAgICAgICAgICAKKyNkZWZpbmUgWF9Vbmluc3RhbGxDb2xvcm1hcCAgICAgICAgICAgIDgyICAgICAgICAgICAgIAorI2RlZmluZSBYX0xpc3RJbnN0YWxsZWRDb2xvcm1hcHMgICAgICAgODMgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgWF9BbGxvY0NvbG9yICAgICAgICAgICAgICAgICAgIDg0ICAgICAgCisjZGVmaW5lIFhfQWxsb2NOYW1lZENvbG9yICAgICAgICAgICAgICA4NSAgICAgICAgICAgCisjZGVmaW5lIFhfQWxsb2NDb2xvckNlbGxzICAgICAgICAgICAgICA4NiAgICAgICAgICAgCisjZGVmaW5lIFhfQWxsb2NDb2xvclBsYW5lcyAgICAgICAgICAgICA4NyAgICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVDb2xvcnMgICAgICAgICAgICAgICAgICAgODggICAgICAKKyNkZWZpbmUgWF9TdG9yZUNvbG9ycyAgICAgICAgICAgICAgICAgIDg5ICAgICAgIAorI2RlZmluZSBYX1N0b3JlTmFtZWRDb2xvciAgICAgICAgICAgICAgOTAgICAgICAgICAgIAorI2RlZmluZSBYX1F1ZXJ5Q29sb3JzICAgICAgICAgICAgICAgICAgOTEgICAgICAgCisjZGVmaW5lIFhfTG9va3VwQ29sb3IgICAgICAgICAgICAgICAgICA5MiAgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVDdXJzb3IgICAgICAgICAgICAgICAgIDkzICAgICAgICAKKyNkZWZpbmUgWF9DcmVhdGVHbHlwaEN1cnNvciAgICAgICAgICAgIDk0ICAgICAgICAgICAgIAorI2RlZmluZSBYX0ZyZWVDdXJzb3IgICAgICAgICAgICAgICAgICAgOTUgICAgICAKKyNkZWZpbmUgWF9SZWNvbG9yQ3Vyc29yICAgICAgICAgICAgICAgIDk2ICAgICAgICAgCisjZGVmaW5lIFhfUXVlcnlCZXN0U2l6ZSAgICAgICAgICAgICAgICA5NyAgICAgICAgIAorI2RlZmluZSBYX1F1ZXJ5RXh0ZW5zaW9uICAgICAgICAgICAgICAgOTggICAgICAgICAgCisjZGVmaW5lIFhfTGlzdEV4dGVuc2lvbnMgICAgICAgICAgICAgICA5OSAgICAgICAgICAKKyNkZWZpbmUgWF9DaGFuZ2VLZXlib2FyZE1hcHBpbmcgICAgICAgIDEwMAorI2RlZmluZSBYX0dldEtleWJvYXJkTWFwcGluZyAgICAgICAgICAgMTAxCisjZGVmaW5lIFhfQ2hhbmdlS2V5Ym9hcmRDb250cm9sICAgICAgICAxMDIgICAgICAgICAgICAgICAgCisjZGVmaW5lIFhfR2V0S2V5Ym9hcmRDb250cm9sICAgICAgICAgICAxMDMgICAgICAgICAgICAgCisjZGVmaW5lIFhfQmVsbCAgICAgICAgICAgICAgICAgICAgICAgICAxMDQKKyNkZWZpbmUgWF9DaGFuZ2VQb2ludGVyQ29udHJvbCAgICAgICAgIDEwNQorI2RlZmluZSBYX0dldFBvaW50ZXJDb250cm9sICAgICAgICAgICAgMTA2CisjZGVmaW5lIFhfU2V0U2NyZWVuU2F2ZXIgICAgICAgICAgICAgICAxMDcgICAgICAgICAgCisjZGVmaW5lIFhfR2V0U2NyZWVuU2F2ZXIgICAgICAgICAgICAgICAxMDggICAgICAgICAgCisjZGVmaW5lIFhfQ2hhbmdlSG9zdHMgICAgICAgICAgICAgICAgICAxMDkgICAgICAgCisjZGVmaW5lIFhfTGlzdEhvc3RzICAgICAgICAgICAgICAgICAgICAxMTAgICAgIAorI2RlZmluZSBYX1NldEFjY2Vzc0NvbnRyb2wgICAgICAgICAgICAgMTExICAgICAgICAgICAgICAgCisjZGVmaW5lIFhfU2V0Q2xvc2VEb3duTW9kZSAgICAgICAgICAgICAxMTIKKyNkZWZpbmUgWF9LaWxsQ2xpZW50ICAgICAgICAgICAgICAgICAgIDExMyAKKyNkZWZpbmUgWF9Sb3RhdGVQcm9wZXJ0aWVzCSAgICAgICAxMTQKKyNkZWZpbmUgWF9Gb3JjZVNjcmVlblNhdmVyCSAgICAgICAxMTUKKyNkZWZpbmUgWF9TZXRQb2ludGVyTWFwcGluZyAgICAgICAgICAgIDExNgorI2RlZmluZSBYX0dldFBvaW50ZXJNYXBwaW5nICAgICAgICAgICAgMTE3CisjZGVmaW5lIFhfU2V0TW9kaWZpZXJNYXBwaW5nCSAgICAgICAxMTgKKyNkZWZpbmUgWF9HZXRNb2RpZmllck1hcHBpbmcJICAgICAgIDExOQorI2RlZmluZSBYX05vT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgMTI3CisKKy8qIHJlc3RvcmUgdGhlc2UgZGVmaW5pdGlvbnMgYmFjayB0byB0aGUgdHlwZWRlZnMgaW4gWC5oICovCisjdW5kZWYgV2luZG93CisjdW5kZWYgRHJhd2FibGUKKyN1bmRlZiBGb250CisjdW5kZWYgUGl4bWFwCisjdW5kZWYgQ3Vyc29yCisjdW5kZWYgQ29sb3JtYXAKKyN1bmRlZiBHQ29udGV4dAorI3VuZGVmIEF0b20KKyN1bmRlZiBWaXN1YWxJRAorI3VuZGVmIFRpbWUKKyN1bmRlZiBLZXlDb2RlCisjdW5kZWYgS2V5U3ltCisKKyNlbmRpZiAvKiBYUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3Rvc3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcHJvdG9zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQzZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHByb3Rvc3RyLmgKQEAgLTAsMCArMSw3OCBAQAorLyogJFhvcmc6IFhwcm90b3N0ci5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjMgeG9yZ2N2cyBFeHAgJCAqLworI2lmbmRlZiBYUFJPVE9TVFJVQ1RTX0gKKyNkZWZpbmUgWFBST1RPU1RSVUNUU19ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPFgxMS9YbWQuaD4KKworLyogVXNlZCBieSBQb2x5U2VnbWVudCAqLworCit0eXBlZGVmIHN0cnVjdCBfeFNlZ21lbnQgeworICAgIElOVDE2IHgxIEIxNiwgeTEgQjE2LCB4MiBCMTYsIHkyIEIxNjsKK30geFNlZ21lbnQ7CisKKy8qIFBPSU5UICovCisKK3R5cGVkZWYgc3RydWN0IF94UG9pbnQgeworCUlOVDE2CQl4IEIxNiwgeSBCMTY7Cit9IHhQb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgX3hSZWN0YW5nbGUgeworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgIHdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKK30geFJlY3RhbmdsZTsKKworLyogIEFSQyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3hBcmMgeworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgICB3aWR0aCBCMTYsIGhlaWdodCBCMTY7CisgICAgSU5UMTYgICBhbmdsZTEgQjE2LCBhbmdsZTIgQjE2OworfSB4QXJjOworCisjZW5kaWYgLyogWFBST1RPU1RSVUNUU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVnaW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YcmVnaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZjEyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZWdpb24uaApAQCAtMCwwICsxLDE5MCBAQAorLyogJFhvcmc6IHJlZ2lvbi5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6NDAgeG9yZ2N2cyBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YUkVHSU9OX0gKKyNkZWZpbmUgX1hSRUdJT05fSAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQgeDEsIHgyLCB5MSwgeTI7Cit9IEJveCwgQk9YLCBCb3hSZWMsICpCb3hQdHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworfVJFQ1RBTkdMRSwgUmVjdGFuZ2xlUmVjLCAqUmVjdGFuZ2xlUHRyOworCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIE1BWFNIT1JUIDMyNzY3CisjZGVmaW5lIE1JTlNIT1JUIC1NQVhTSE9SVAorI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworCisvKiAKKyAqICAgY2xpcCByZWdpb24KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiB7CisgICAgbG9uZyBzaXplOworICAgIGxvbmcgbnVtUmVjdHM7CisgICAgQk9YICpyZWN0czsKKyAgICBCT1ggZXh0ZW50czsKK30gUkVHSU9OOworCisvKiBYdXRpbC5oIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbjogCisgKiB0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiAqUmVnaW9uOyAKKyAqLyAgIAorCisvKiAgMSBpZiB0d28gQk9YcyBvdmVybGFwLgorICogIDAgaWYgdHdvIEJPWHMgZG8gbm90IG92ZXJsYXAuCisgKiAgUmVtZW1iZXIsIHgyIGFuZCB5MiBhcmUgbm90IGluIHRoZSByZWdpb24gCisgKi8KKyNkZWZpbmUgRVhURU5UQ0hFQ0socjEsIHIyKSBcCisJKChyMSktPngyID4gKHIyKS0+eDEgJiYgXAorCSAocjEpLT54MSA8IChyMiktPngyICYmIFwKKwkgKHIxKS0+eTIgPiAocjIpLT55MSAmJiBcCisJIChyMSktPnkxIDwgKHIyKS0+eTIpCisKKy8qCisgKiAgdXBkYXRlIHJlZ2lvbiBleHRlbnRzCisgKi8KKyNkZWZpbmUgRVhURU5UUyhyLGlkUmVjdCl7XAorICAgICAgICAgICAgaWYoKHIpLT54MSA8IChpZFJlY3QpLT5leHRlbnRzLngxKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueDEgPSAociktPngxO1wKKyAgICAgICAgICAgIGlmKChyKS0+eTEgPCAoaWRSZWN0KS0+ZXh0ZW50cy55MSlcCisgICAgICAgICAgICAgIChpZFJlY3QpLT5leHRlbnRzLnkxID0gKHIpLT55MTtcCisgICAgICAgICAgICBpZigociktPngyID4gKGlkUmVjdCktPmV4dGVudHMueDIpXAorICAgICAgICAgICAgICAoaWRSZWN0KS0+ZXh0ZW50cy54MiA9IChyKS0+eDI7XAorICAgICAgICAgICAgaWYoKHIpLT55MiA+IChpZFJlY3QpLT5leHRlbnRzLnkyKVwKKyAgICAgICAgICAgICAgKGlkUmVjdCktPmV4dGVudHMueTIgPSAociktPnkyO1wKKyAgICAgICAgfQorCisvKgorICogICBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSBpbiB0aGUgcHJlc2VudCByZWdpb24uCisgKi8KKyNkZWZpbmUgTUVNQ0hFQ0socmVnLCByZWN0LCBmaXJzdHJlY3Qpe1wKKyAgICAgICAgaWYgKChyZWcpLT5udW1SZWN0cyA+PSAoKHJlZyktPnNpemUgLSAxKSl7XAorICAgICAgICAgIChmaXJzdHJlY3QpID0gKEJPWCAqKSBYcmVhbGxvYyBcCisgICAgICAgICAgKChjaGFyICopKGZpcnN0cmVjdCksICh1bnNpZ25lZCkgKDIgKiAoc2l6ZW9mKEJPWCkpICogKChyZWcpLT5zaXplKSkpO1wKKyAgICAgICAgICBpZiAoKGZpcnN0cmVjdCkgPT0gMClcCisgICAgICAgICAgICByZXR1cm4oMCk7XAorICAgICAgICAgIChyZWcpLT5zaXplICo9IDI7XAorICAgICAgICAgIChyZWN0KSA9ICYoZmlyc3RyZWN0KVsocmVnKS0+bnVtUmVjdHNdO1wKKyAgICAgICAgIH1cCisgICAgICAgfQorCisvKiAgdGhpcyByb3V0aW5lIGNoZWNrcyB0byBzZWUgaWYgdGhlIHByZXZpb3VzIHJlY3RhbmdsZSBpcyB0aGUgc2FtZQorICogIG9yIHN1YnN1bWVzIHRoZSBuZXcgcmVjdGFuZ2xlIHRvIGFkZC4KKyAqLworCisjZGVmaW5lIENIRUNLX1BSRVZJT1VTKFJlZywgUiwgUngxLCBSeTEsIFJ4MiwgUnkyKVwKKyAgICAgICAgICAgICAgICghKCgoUmVnKS0+bnVtUmVjdHMgPiAwKSYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT55MSA9PSAoUnkxKSkgJiZcCisgICAgICAgICAgICAgICAgICAoKFItMSktPnkyID09IChSeTIpKSAmJlwKKyAgICAgICAgICAgICAgICAgICgoUi0xKS0+eDEgPD0gKFJ4MSkpICYmXAorICAgICAgICAgICAgICAgICAgKChSLTEpLT54MiA+PSAoUngyKSkpKQorCisvKiAgYWRkIGEgcmVjdGFuZ2xlIHRvIHRoZSBnaXZlbiBSZWdpb24gKi8KKyNkZWZpbmUgQUREUkVDVChyZWcsIHIsIHJ4MSwgcnkxLCByeDIsIHJ5Mil7XAorICAgIGlmICgoKHJ4MSkgPCAocngyKSkgJiYgKChyeTEpIDwgKHJ5MikpICYmXAorICAgICAgICBDSEVDS19QUkVWSU9VUygocmVnKSwgKHIpLCAocngxKSwgKHJ5MSksIChyeDIpLCAocnkyKSkpe1wKKyAgICAgICAgICAgICAgKHIpLT54MSA9IChyeDEpO1wKKyAgICAgICAgICAgICAgKHIpLT55MSA9IChyeTEpO1wKKyAgICAgICAgICAgICAgKHIpLT54MiA9IChyeDIpO1wKKyAgICAgICAgICAgICAgKHIpLT55MiA9IChyeTIpO1wKKyAgICAgICAgICAgICAgRVhURU5UUygociksIChyZWcpKTtcCisgICAgICAgICAgICAgIChyZWcpLT5udW1SZWN0cysrO1wKKyAgICAgICAgICAgICAgKHIpKys7XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfQorCisKKworLyogIGFkZCBhIHJlY3RhbmdsZSB0byB0aGUgZ2l2ZW4gUmVnaW9uICovCisjZGVmaW5lIEFERFJFQ1ROT1gocmVnLCByLCByeDEsIHJ5MSwgcngyLCByeTIpe1wKKyAgICAgICAgICAgIGlmICgocngxIDwgcngyKSAmJiAocnkxIDwgcnkyKSAmJlwKKyAgICAgICAgICAgICAgICBDSEVDS19QUkVWSU9VUygocmVnKSwgKHIpLCAocngxKSwgKHJ5MSksIChyeDIpLCAocnkyKSkpe1wKKyAgICAgICAgICAgICAgKHIpLT54MSA9IChyeDEpO1wKKyAgICAgICAgICAgICAgKHIpLT55MSA9IChyeTEpO1wKKyAgICAgICAgICAgICAgKHIpLT54MiA9IChyeDIpO1wKKyAgICAgICAgICAgICAgKHIpLT55MiA9IChyeTIpO1wKKyAgICAgICAgICAgICAgKHJlZyktPm51bVJlY3RzKys7XAorICAgICAgICAgICAgICAocikrKztcCisgICAgICAgICAgICB9XAorICAgICAgICB9CisKKyNkZWZpbmUgRU1QVFlfUkVHSU9OKHBSZWcpIHBSZWctPm51bVJlY3RzID0gMAorCisjZGVmaW5lIFJFR0lPTl9OT1RfRU1QVFkocFJlZykgcFJlZy0+bnVtUmVjdHMKKworI2RlZmluZSBJTkJPWChyLCB4LCB5KSBcCisgICAgICAoICggKChyKS54MiA+ICB4KSkgJiYgXAorICAgICAgICAoICgocikueDEgPD0geCkpICYmIFwKKyAgICAgICAgKCAoKHIpLnkyID4gIHkpKSAmJiBcCisgICAgICAgICggKChyKS55MSA8PSB5KSkgKQorCisvKgorICogbnVtYmVyIG9mIHBvaW50cyB0byBidWZmZXIgYmVmb3JlIHNlbmRpbmcgdGhlbSBvZmYKKyAqIHRvIHNjYW5saW5lcygpIDogIE11c3QgYmUgYW4gZXZlbiBudW1iZXIKKyAqLworI2RlZmluZSBOVU1QVFNUT0JVRkZFUiAyMDAKKworLyoKKyAqIHVzZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3IgcG9pbnRzIGFuZCBsaW5rCisgKiB0aGUgYnVmZmVycyB0b2dldGhlcgorICovCit0eXBlZGVmIHN0cnVjdCBfUE9JTlRCTE9DSyB7CisgICAgWFBvaW50IHB0c1tOVU1QVFNUT0JVRkZFUl07CisgICAgc3RydWN0IF9QT0lOVEJMT0NLICpuZXh0OworfSBQT0lOVEJMT0NLOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZXNvdXJjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHJlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMjEzNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1hyZXNvdXJjZS5oCkBAIC0wLDAgKzEsMzYwIEBACisvKiAkWG9yZzogWHJlc291cmNlLmgsdiAxLjcgMjAwMS8wMi8wOSAwMjowMzozOSB4b3JnY3ZzIEV4cCAkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NywgMTk4OCBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2xpYi9YMTEvWHJlc291cmNlLmgsdiAzLjggMjAwMS8xMi8xNCAxOTo1NDoxMCBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9YUkVTT1VSQ0VfSF8KKyNkZWZpbmUgX1hSRVNPVVJDRV9IXworCisjaWZuZGVmIF9YUF9QUklOVF9TRVJWRVJfCisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKgorICoqKiAgICAgICAgICBYIFJlc291cmNlIE1hbmFnZXIgSW50cmluc2ljcyAgICAgICAgICAgICAgICAgICAqKioKKyAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqCisgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitfWEZVTkNQUk9UT0JFR0lOCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWVtb3J5IE1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNoYXIgKlhwZXJtYWxsb2MoCisgICAgdW5zaWduZWQgaW50CS8qIHNpemUgKi8KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVhcmsgTWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGludCAgICAgICBYcm1RdWFyaywgKlhybVF1YXJrTGlzdDsKKyNkZWZpbmUgTlVMTFFVQVJLICgoWHJtUXVhcmspIDApCisKK3R5cGVkZWYgY2hhciAqWHJtU3RyaW5nOworI2RlZmluZSBOVUxMU1RSSU5HICgoWHJtU3RyaW5nKSAwKQorCisvKiBmaW5kIHF1YXJrIGZvciBzdHJpbmcsIGNyZWF0ZSBuZXcgcXVhcmsgaWYgbm9uZSBhbHJlYWR5IGV4aXN0cyAqLworZXh0ZXJuIFhybVF1YXJrIFhybVN0cmluZ1RvUXVhcmsoCisgICAgX1hjb25zdCBjaGFyKiAJLyogc3RyaW5nICovCispOworCitleHRlcm4gWHJtUXVhcmsgWHJtUGVybVN0cmluZ1RvUXVhcmsoCisgICAgX1hjb25zdCBjaGFyKiAJLyogc3RyaW5nICovCispOworCisvKiBmaW5kIHN0cmluZyBmb3IgcXVhcmsgKi8KK2V4dGVybiBYcm1TdHJpbmcgWHJtUXVhcmtUb1N0cmluZygKKyAgICBYcm1RdWFyayAJCS8qIHF1YXJrICovCispOworCitleHRlcm4gWHJtUXVhcmsgWHJtVW5pcXVlUXVhcmsoCisgICAgdm9pZAorKTsKKworI2RlZmluZSBYcm1TdHJpbmdzRXF1YWwoYTEsIGEyKSAoc3RyY21wKGExLCBhMikgPT0gMCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbnZlcnNpb24gb2YgU3RyaW5ncyB0byBMaXN0cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0ge1hybUJpbmRUaWdodGx5LCBYcm1CaW5kTG9vc2VseX0gWHJtQmluZGluZywgKlhybUJpbmRpbmdMaXN0OworCitleHRlcm4gdm9pZCBYcm1TdHJpbmdUb1F1YXJrTGlzdCgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHN0cmluZyAqLywKKyAgICBYcm1RdWFya0xpc3QJLyogcXVhcmtzX3JldHVybiAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtU3RyaW5nVG9CaW5kaW5nUXVhcmtMaXN0KAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyaW5nICovLAorICAgIFhybUJpbmRpbmdMaXN0CS8qIGJpbmRpbmdzX3JldHVybiAqLywKKyAgICBYcm1RdWFya0xpc3QJLyogcXVhcmtzX3JldHVybiAqLworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lIGFuZCBDbGFzcyBsaXN0cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBYcm1RdWFyayAgICAgWHJtTmFtZTsKK3R5cGVkZWYgWHJtUXVhcmtMaXN0IFhybU5hbWVMaXN0OworI2RlZmluZSBYcm1OYW1lVG9TdHJpbmcobmFtZSkJCVhybVF1YXJrVG9TdHJpbmcobmFtZSkKKyNkZWZpbmUgWHJtU3RyaW5nVG9OYW1lKHN0cmluZykJCVhybVN0cmluZ1RvUXVhcmsoc3RyaW5nKQorI2RlZmluZSBYcm1TdHJpbmdUb05hbWVMaXN0KHN0ciwgbmFtZSkJWHJtU3RyaW5nVG9RdWFya0xpc3Qoc3RyLCBuYW1lKQorCit0eXBlZGVmIFhybVF1YXJrICAgICBYcm1DbGFzczsKK3R5cGVkZWYgWHJtUXVhcmtMaXN0IFhybUNsYXNzTGlzdDsKKyNkZWZpbmUgWHJtQ2xhc3NUb1N0cmluZyhjX2NsYXNzKQlYcm1RdWFya1RvU3RyaW5nKGNfY2xhc3MpCisjZGVmaW5lIFhybVN0cmluZ1RvQ2xhc3MoY19jbGFzcykJWHJtU3RyaW5nVG9RdWFyayhjX2NsYXNzKQorI2RlZmluZSBYcm1TdHJpbmdUb0NsYXNzTGlzdChzdHIsY19jbGFzcykgWHJtU3RyaW5nVG9RdWFya0xpc3Qoc3RyLCBjX2NsYXNzKQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZXNvdXJjZSBSZXByZXNlbnRhdGlvbiBUeXBlcyBhbmQgVmFsdWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgWHJtUXVhcmsgICAgIFhybVJlcHJlc2VudGF0aW9uOworI2RlZmluZSBYcm1TdHJpbmdUb1JlcHJlc2VudGF0aW9uKHN0cmluZykgICBYcm1TdHJpbmdUb1F1YXJrKHN0cmluZykKKyNkZWZpbmUJWHJtUmVwcmVzZW50YXRpb25Ub1N0cmluZyh0eXBlKSAgIFhybVF1YXJrVG9TdHJpbmcodHlwZSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCAgICBzaXplOworICAgIFhQb2ludGVyCSAgICBhZGRyOworfSBYcm1WYWx1ZSwgKlhybVZhbHVlUHRyOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzb3VyY2UgTWFuYWdlciBGdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hybUhhc2hCdWNrZXRSZWMgKlhybUhhc2hCdWNrZXQ7Cit0eXBlZGVmIFhybUhhc2hCdWNrZXQgKlhybUhhc2hUYWJsZTsKK3R5cGVkZWYgWHJtSGFzaFRhYmxlIFhybVNlYXJjaExpc3RbXTsKK3R5cGVkZWYgc3RydWN0IF9Ycm1IYXNoQnVja2V0UmVjICpYcm1EYXRhYmFzZTsKKworCitleHRlcm4gdm9pZCBYcm1EZXN0cm95RGF0YWJhc2UoCisgICAgWHJtRGF0YWJhc2UJCS8qIGRhdGFiYXNlICovICAgIAorKTsKKworZXh0ZXJuIHZvaWQgWHJtUVB1dFJlc291cmNlKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1CaW5kaW5nTGlzdAkvKiBiaW5kaW5ncyAqLywKKyAgICBYcm1RdWFya0xpc3QJLyogcXVhcmtzICovLAorICAgIFhybVJlcHJlc2VudGF0aW9uCS8qIHR5cGUgKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUHV0UmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UqCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3BlY2lmaWVyICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdHlwZSAqLywKKyAgICBYcm1WYWx1ZSoJCS8qIHZhbHVlICovCispOworCitleHRlcm4gdm9pZCBYcm1RUHV0U3RyaW5nUmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UqCS8qIGRhdGFiYXNlICovLAorICAgIFhybUJpbmRpbmdMaXN0ICAgICAgLyogYmluZGluZ3MgKi8sCisgICAgWHJtUXVhcmtMaXN0CS8qIHF1YXJrcyAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIHZhbHVlICovCispOworCitleHRlcm4gdm9pZCBYcm1QdXRTdHJpbmdSZXNvdXJjZSgKKyAgICBYcm1EYXRhYmFzZSoJLyogZGF0YWJhc2UgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzcGVjaWZpZXIgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB2YWx1ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtUHV0TGluZVJlc291cmNlKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGxpbmUgKi8KKyk7CisKK2V4dGVybiBCb29sIFhybVFHZXRSZXNvdXJjZSgKKyAgICBYcm1EYXRhYmFzZQkJLyogZGF0YWJhc2UgKi8sCisgICAgWHJtTmFtZUxpc3QJCS8qIHF1YXJrX25hbWUgKi8sCisgICAgWHJtQ2xhc3NMaXN0CS8qIHF1YXJrX2NsYXNzICovLAorICAgIFhybVJlcHJlc2VudGF0aW9uKgkvKiBxdWFya190eXBlX3JldHVybiAqLywKKyAgICBYcm1WYWx1ZSoJCS8qIHZhbHVlX3JldHVybiAqLworKTsKKworZXh0ZXJuIEJvb2wgWHJtR2V0UmVzb3VyY2UoCisgICAgWHJtRGF0YWJhc2UJCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogc3RyX25hbWUgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiBzdHJfY2xhc3MgKi8sCisgICAgY2hhcioqCQkvKiBzdHJfdHlwZV9yZXR1cm4gKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhybVFHZXRTZWFyY2hMaXN0KAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1OYW1lTGlzdAkJLyogbmFtZXMgKi8sCisgICAgWHJtQ2xhc3NMaXN0CS8qIGNsYXNzZXMgKi8sCisgICAgWHJtU2VhcmNoTGlzdAkvKiBsaXN0X3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBsaXN0X2xlbmd0aCAqLworKTsKKworZXh0ZXJuIEJvb2wgWHJtUUdldFNlYXJjaFJlc291cmNlKAorICAgIFhybVNlYXJjaExpc3QJLyogbGlzdCAqLywKKyAgICBYcm1OYW1lCQkvKiBuYW1lICovLAorICAgIFhybUNsYXNzCQkvKiBjbGFzcyAqLywKKyAgICBYcm1SZXByZXNlbnRhdGlvbioJLyogdHlwZV9yZXR1cm4gKi8sCisgICAgWHJtVmFsdWUqCQkvKiB2YWx1ZV9yZXR1cm4gKi8KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzb3VyY2UgRGF0YWJhc2UgTWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YUF9QUklOVF9TRVJWRVJfCisKK2V4dGVybiB2b2lkIFhybVNldERhdGFiYXNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhybURhdGFiYXNlCQkvKiBkYXRhYmFzZSAqLworKTsKKworZXh0ZXJuIFhybURhdGFiYXNlIFhybUdldERhdGFiYXNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovCispOworCisjZW5kaWYgLyogIV9YUF9QUklOVF9TRVJWRVJfICovCisKK2V4dGVybiBYcm1EYXRhYmFzZSBYcm1HZXRGaWxlRGF0YWJhc2UoCisgICAgX1hjb25zdCBjaGFyKgkvKiBmaWxlbmFtZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYcm1Db21iaW5lRmlsZURhdGFiYXNlKAorICAgIF9YY29uc3QgY2hhciogCS8qIGZpbGVuYW1lICovLAorICAgIFhybURhdGFiYXNlKgkvKiB0YXJnZXQgKi8sCisgICAgQm9vbAkJLyogb3ZlcnJpZGUgKi8KKyk7CisKK2V4dGVybiBYcm1EYXRhYmFzZSBYcm1HZXRTdHJpbmdEYXRhYmFzZSgKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8gIC8qICBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nICovCispOworCitleHRlcm4gdm9pZCBYcm1QdXRGaWxlRGF0YWJhc2UoCisgICAgWHJtRGF0YWJhc2UJCS8qIGRhdGFiYXNlICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZmlsZW5hbWUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhybU1lcmdlRGF0YWJhc2VzKAorICAgIFhybURhdGFiYXNlCQkvKiBzb3VyY2VfZGIgKi8sCisgICAgWHJtRGF0YWJhc2UqCS8qIHRhcmdldF9kYiAqLworKTsKKworZXh0ZXJuIHZvaWQgWHJtQ29tYmluZURhdGFiYXNlKAorICAgIFhybURhdGFiYXNlCQkvKiBzb3VyY2VfZGIgKi8sCisgICAgWHJtRGF0YWJhc2UqCS8qIHRhcmdldF9kYiAqLywKKyAgICBCb29sCQkvKiBvdmVycmlkZSAqLworKTsKKworI2RlZmluZSBYcm1FbnVtQWxsTGV2ZWxzIDAKKyNkZWZpbmUgWHJtRW51bU9uZUxldmVsICAxCisKK2V4dGVybiBCb29sIFhybUVudW1lcmF0ZURhdGFiYXNlKAorICAgIFhybURhdGFiYXNlCQkvKiBkYiAqLywKKyAgICBYcm1OYW1lTGlzdAkJLyogbmFtZV9wcmVmaXggKi8sCisgICAgWHJtQ2xhc3NMaXN0CS8qIGNsYXNzX3ByZWZpeCAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovLAorICAgIEJvb2wgKCopKAorCSAgICAgWHJtRGF0YWJhc2UqCS8qIGRiICovLAorCSAgICAgWHJtQmluZGluZ0xpc3QJLyogYmluZGluZ3MgKi8sCisJICAgICBYcm1RdWFya0xpc3QJLyogcXVhcmtzICovLAorCSAgICAgWHJtUmVwcmVzZW50YXRpb24qCS8qIHR5cGUgKi8sCisJICAgICBYcm1WYWx1ZSoJCS8qIHZhbHVlICovLAorCSAgICAgWFBvaW50ZXIJCS8qIGNsb3N1cmUgKi8KKwkgICAgICkJCS8qIHByb2MgKi8sCisgICAgWFBvaW50ZXIJCS8qIGNsb3N1cmUgKi8KKyk7CisKK2V4dGVybiBjb25zdCBjaGFyICpYcm1Mb2NhbGVPZkRhdGFiYXNlKAorICAgIFhybURhdGFiYXNlIAkvKiBkYXRhYmFzZSAqLworKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbW1hbmQgbGluZSBvcHRpb24gbWFwcGluZyB0byByZXNvdXJjZSBlbnRyaWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisgICAgWHJtb3B0aW9uTm9BcmcsCS8qIFZhbHVlIGlzIHNwZWNpZmllZCBpbiBPcHRpb25EZXNjUmVjLnZhbHVlCSAgICAqLworICAgIFhybW9wdGlvbklzQXJnLCAgICAgLyogVmFsdWUgaXMgdGhlIG9wdGlvbiBzdHJpbmcgaXRzZWxmCQkgICAgKi8KKyAgICBYcm1vcHRpb25TdGlja3lBcmcsIC8qIFZhbHVlIGlzIGNoYXJhY3RlcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIG9wdGlvbiAqLworICAgIFhybW9wdGlvblNlcEFyZywgICAgLyogVmFsdWUgaXMgbmV4dCBhcmd1bWVudCBpbiBhcmd2CQkgICAgKi8KKyAgICBYcm1vcHRpb25SZXNBcmcsCS8qIFJlc291cmNlIGFuZCB2YWx1ZSBpbiBuZXh0IGFyZ3VtZW50IGluIGFyZ3YgICAgICAqLworICAgIFhybW9wdGlvblNraXBBcmcsICAgLyogSWdub3JlIHRoaXMgb3B0aW9uIGFuZCB0aGUgbmV4dCBhcmd1bWVudCBpbiBhcmd2ICovCisgICAgWHJtb3B0aW9uU2tpcExpbmUsICAvKiBJZ25vcmUgdGhpcyBvcHRpb24gYW5kIHRoZSByZXN0IG9mIGFyZ3YJICAgICovCisgICAgWHJtb3B0aW9uU2tpcE5BcmdzCS8qIElnbm9yZSB0aGlzIG9wdGlvbiBhbmQgdGhlIG5leHQgCisJCQkgICBPcHRpb25EZXNjUmVzLnZhbHVlIGFyZ3VtZW50cyBpbiBhcmd2ICovCit9IFhybU9wdGlvbktpbmQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyCSAgICAqb3B0aW9uOwkgICAgLyogT3B0aW9uIGFiYnJldmlhdGlvbiBpbiBhcmd2CSAgICAqLworICAgIGNoYXIJICAgICpzcGVjaWZpZXI7ICAgICAvKiBSZXNvdXJjZSBzcGVjaWZpZXIJCSAgICAqLworICAgIFhybU9wdGlvbktpbmQgICBhcmdLaW5kOwkgICAgLyogV2hpY2ggc3R5bGUgb2Ygb3B0aW9uIGl0IGlzCSAgICAqLworICAgIFhQb2ludGVyCSAgICB2YWx1ZTsJICAgIC8qIFZhbHVlIHRvIHByb3ZpZGUgaWYgWHJtb3B0aW9uTm9BcmcgICAqLworfSBYcm1PcHRpb25EZXNjUmVjLCAqWHJtT3B0aW9uRGVzY0xpc3Q7CisKKworZXh0ZXJuIHZvaWQgWHJtUGFyc2VDb21tYW5kKAorICAgIFhybURhdGFiYXNlKgkvKiBkYXRhYmFzZSAqLywKKyAgICBYcm1PcHRpb25EZXNjTGlzdAkvKiB0YWJsZSAqLywKKyAgICBpbnQJCQkvKiB0YWJsZV9jb3VudCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8sCisgICAgaW50KgkJLyogYXJnY19pbl9vdXQgKi8sCisgICAgY2hhcioqCQkvKiBhcmd2X2luX291dCAqLwkJICAgICAKKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWFJFU09VUkNFX0hfICovCisvKiBET04nVCBBREQgU1RVRkYgQUZURVIgVEhJUyAjZW5kaWYgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h0aHJlYWRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdGhyZWFkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjU0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdGhyZWFkcy5oCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogJFhvcmc6IFh0aHJlYWRzLmgsdiAxLjUgMjAwMS8wMi8wOSAwMjowMzoyMyB4b3JnY3ZzIEV4cCAkCisgKgorICogCitDb3B5cmlnaHQgMTk5MywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqICoKKyAqLworLyogJFhGcmVlODY6IFh0aHJlYWRzLmgsdiAzLjEwIDIwMDEvMTIvMTQgMTk6NTM6MjYgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWFRIUkVBRFNfSF8KKyNkZWZpbmUgX1hUSFJFQURTX0hfCisKKy8qIFJlZGVmaW5lIHRoZXNlIHRvIFh0TWFsbG9jL1h0RnJlZSBvciB3aGF0ZXZlciB5b3Ugd2FudCBiZWZvcmUgaW5jbHVkaW5nCisgKiB0aGlzIGhlYWRlciBmaWxlLgorICovCisjaWZuZGVmIHhtYWxsb2MKKyNkZWZpbmUgeG1hbGxvYyBtYWxsb2MKKyNlbmRpZgorI2lmbmRlZiB4ZnJlZQorI2RlZmluZSB4ZnJlZSBmcmVlCisjZW5kaWYKKworI2lmZGVmIENUSFJFQURTCisjaW5jbHVkZSA8Y3RocmVhZHMuaD4KK3R5cGVkZWYgY3RocmVhZF90IHh0aHJlYWRfdDsKK3R5cGVkZWYgc3RydWN0IGNvbmRpdGlvbiB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgc3RydWN0IG11dGV4IHhtdXRleF9yZWM7CisjZGVmaW5lIHh0aHJlYWRfaW5pdCgpIGN0aHJlYWRfaW5pdCgpCisjZGVmaW5lIHh0aHJlYWRfc2VsZiBjdGhyZWFkX3NlbGYKKyNkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgY3RocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkKKyNkZWZpbmUgeHRocmVhZF95aWVsZCgpIGN0aHJlYWRfeWllbGQoKQorI2RlZmluZSB4dGhyZWFkX2V4aXQodikgY3RocmVhZF9leGl0KHYpCisjZGVmaW5lIHh0aHJlYWRfc2V0X25hbWUodCxzdHIpIGN0aHJlYWRfc2V0X25hbWUodCxzdHIpCisjZGVmaW5lIHhtdXRleF9pbml0KG0pIG11dGV4X2luaXQobSkKKyNkZWZpbmUgeG11dGV4X2NsZWFyKG0pIG11dGV4X2NsZWFyKG0pCisjZGVmaW5lIHhtdXRleF9sb2NrKG0pIG11dGV4X2xvY2sobSkKKyNkZWZpbmUgeG11dGV4X3VubG9jayhtKSBtdXRleF91bmxvY2sobSkKKyNkZWZpbmUgeG11dGV4X3NldF9uYW1lKG0sc3RyKSBtdXRleF9zZXRfbmFtZShtLHN0cikKKyNkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGN2KSBjb25kaXRpb25faW5pdChjdikKKyNkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjdikgY29uZGl0aW9uX2NsZWFyKGN2KQorI2RlZmluZSB4Y29uZGl0aW9uX3dhaXQoY3YsbSkgY29uZGl0aW9uX3dhaXQoY3YsbSkKKyNkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoY3YpIGNvbmRpdGlvbl9zaWduYWwoY3YpCisjZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGN2KSBjb25kaXRpb25fYnJvYWRjYXN0KGN2KQorI2RlZmluZSB4Y29uZGl0aW9uX3NldF9uYW1lKGN2LHN0cikgY29uZGl0aW9uX3NldF9uYW1lKGN2LHN0cikKKyNlbHNlIC8qICFDVEhSRUFEUyAqLworI2lmIGRlZmluZWQoU1ZSNCkgJiYgIWRlZmluZWQoX19zZ2kpICYmICFkZWZpbmVkKF9TRVFVRU5UXykKKyNpbmNsdWRlIDx0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeW5jaC5oPgordHlwZWRlZiB0aHJlYWRfdCB4dGhyZWFkX3Q7Cit0eXBlZGVmIHRocmVhZF9rZXlfdCB4dGhyZWFkX2tleV90OwordHlwZWRlZiBjb25kX3QgeGNvbmRpdGlvbl9yZWM7Cit0eXBlZGVmIG11dGV4X3QgeG11dGV4X3JlYzsKKyNpZiBkZWZpbmVkKF9fVU5JWFdBUkVfXykKK2V4dGVybiB4dGhyZWFkX3QgKCpfeDExX3Rocl9zZWxmKSgpOworI2RlZmluZSB4dGhyZWFkX3NlbGYgIChfeDExX3Rocl9zZWxmKQorI2Vsc2UKKyNkZWZpbmUgeHRocmVhZF9zZWxmIHRocl9zZWxmCisjZW5kaWYKKyNkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgdGhyX2NyZWF0ZShOVUxMLDAsZnVuYyxjbG9zdXJlLFRIUl9ORVdfTFdQfFRIUl9ERVRBQ0hFRCxOVUxMKQorI2RlZmluZSB4dGhyZWFkX3lpZWxkKCkgdGhyX3lpZWxkKCkKKyNkZWZpbmUgeHRocmVhZF9leGl0KHYpIHRocl9leGl0KHYpCisjZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSB0aHJfa2V5Y3JlYXRlKGtwLGQpCisjaWZkZWYgc3VuCisjZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSAwCisjZWxzZQorI2RlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgdGhyX2tleWRlbGV0ZShrKQorI2VuZGlmCisjZGVmaW5lIHh0aHJlYWRfc2V0X3NwZWNpZmljKGssdikgdGhyX3NldHNwZWNpZmljKGssdikKKyNkZWZpbmUgeHRocmVhZF9nZXRfc3BlY2lmaWMoayx2cCkgdGhyX2dldHNwZWNpZmljKGssdnApCisjZGVmaW5lIHhtdXRleF9pbml0KG0pIG11dGV4X2luaXQobSxVU1lOQ19USFJFQUQsMCkKKyNkZWZpbmUgeG11dGV4X2NsZWFyKG0pIG11dGV4X2Rlc3Ryb3kobSkKKyNkZWZpbmUgeG11dGV4X2xvY2sobSkgbXV0ZXhfbG9jayhtKQorI2RlZmluZSB4bXV0ZXhfdW5sb2NrKG0pIG11dGV4X3VubG9jayhtKQorI2RlZmluZSB4Y29uZGl0aW9uX2luaXQoY3YpIGNvbmRfaW5pdChjdixVU1lOQ19USFJFQUQsMCkKKyNkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjdikgY29uZF9kZXN0cm95KGN2KQorI2RlZmluZSB4Y29uZGl0aW9uX3dhaXQoY3YsbSkgY29uZF93YWl0KGN2LG0pCisjZGVmaW5lIHhjb25kaXRpb25fc2lnbmFsKGN2KSBjb25kX3NpZ25hbChjdikKKyNkZWZpbmUgeGNvbmRpdGlvbl9icm9hZGNhc3QoY3YpIGNvbmRfYnJvYWRjYXN0KGN2KQorI2Vsc2UgLyogIVNWUjQgKi8KKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPFgxMS9Yd2luZG93cy5oPgordHlwZWRlZiBEV09SRCB4dGhyZWFkX3Q7Cit0eXBlZGVmIERXT1JEIHh0aHJlYWRfa2V5X3Q7CitzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyIHsKKyAgICBIQU5ETEUgc2VtOworICAgIHN0cnVjdCBfeHRocmVhZF93YWl0ZXIgKm5leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENSSVRJQ0FMX1NFQ1RJT04gY3M7CisgICAgc3RydWN0IF94dGhyZWFkX3dhaXRlciAqd2FpdGVyczsKK30geGNvbmRpdGlvbl9yZWM7Cit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04geG11dGV4X3JlYzsKKyNkZWZpbmUgeHRocmVhZF9pbml0KCkgX1h0aHJlYWRfaW5pdCgpCisjZGVmaW5lIHh0aHJlYWRfc2VsZiBHZXRDdXJyZW50VGhyZWFkSWQKKyNkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyBcCisgICAgRFdPUkQgX3RtcHRpZDsgXAorICAgIENyZWF0ZVRocmVhZChOVUxMLCAwLCAoTFBUSFJFQURfU1RBUlRfUk9VVElORSlmdW5jLCAoTFBWT0lEKWNsb3N1cmUsIDAsIFwKKwkJICZfdG1wdGlkKTsgXAorfQorI2RlZmluZSB4dGhyZWFkX3lpZWxkKCkgU2xlZXAoMCkKKyNkZWZpbmUgeHRocmVhZF9leGl0KHYpIEV4aXRUaHJlYWQoKERXT1JEKSh2KSkKKyNkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpICooa3ApID0gVGxzQWxsb2MoKQorI2RlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgVGxzRnJlZShrKQorI2RlZmluZSB4dGhyZWFkX3NldF9zcGVjaWZpYyhrLHYpIFRsc1NldFZhbHVlKGssdikKKyNkZWZpbmUgeHRocmVhZF9nZXRfc3BlY2lmaWMoayx2cCkgVGxzR2V0VmFsdWUoaykKKyNkZWZpbmUgeG11dGV4X2luaXQobSkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtKQorI2RlZmluZSB4bXV0ZXhfY2xlYXIobSkgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG0pCisjZGVmaW5lIF9YTVVURVhfTkVTVFMKKyNkZWZpbmUgeG11dGV4X2xvY2sobSkgRW50ZXJDcml0aWNhbFNlY3Rpb24obSkKKyNkZWZpbmUgeG11dGV4X3VubG9jayhtKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKQorI2RlZmluZSB4Y29uZGl0aW9uX2luaXQoY3YpIHsgXAorICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJihjdiktPmNzKTsgXAorICAgIChjdiktPndhaXRlcnMgPSBOVUxMOyBcCit9CisjZGVmaW5lIHhjb25kaXRpb25fY2xlYXIoY3YpIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpCitleHRlcm4gc3RydWN0IF94dGhyZWFkX3dhaXRlciAqX1h0aHJlYWRfd2FpdGVyKCk7CisjZGVmaW5lIHhjb25kaXRpb25fd2FpdChjdixtKSB7IFwKKyAgICBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICpfdG1wdGhyID0gX1h0aHJlYWRfd2FpdGVyKCk7IFwKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCisgICAgX3RtcHRoci0+bmV4dCA9IChjdiktPndhaXRlcnM7IFwKKyAgICAoY3YpLT53YWl0ZXJzID0gX3RtcHRocjsgXAorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCYoY3YpLT5jcyk7IFwKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsgXAorICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoX3RtcHRoci0+c2VtLCBJTkZJTklURSk7IFwKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsgXAorfQorI2RlZmluZSB4Y29uZGl0aW9uX3NpZ25hbChjdikgeyBcCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJihjdiktPmNzKTsgXAorICAgIGlmICgoY3YpLT53YWl0ZXJzKSB7IFwKKyAgICAgICAgUmVsZWFzZVNlbWFwaG9yZSgoY3YpLT53YWl0ZXJzLT5zZW0sIDEsIE5VTEwpOyBcCisJKGN2KS0+d2FpdGVycyA9IChjdiktPndhaXRlcnMtPm5leHQ7IFwKKyAgICB9IFwKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCit9CisjZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGN2KSB7IFwKKyAgICBzdHJ1Y3QgX3h0aHJlYWRfd2FpdGVyICpfdG1wdGhyOyBcCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJihjdiktPmNzKTsgXAorICAgIGZvciAoX3RtcHRociA9IChjdiktPndhaXRlcnM7IF90bXB0aHI7IF90bXB0aHIgPSBfdG1wdGhyLT5uZXh0KSBcCisJUmVsZWFzZVNlbWFwaG9yZShfdG1wdGhyLT5zZW0sIDEsIE5VTEwpOyBcCisgICAgKGN2KS0+d2FpdGVycyA9IE5VTEw7IFwKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmKGN2KS0+Y3MpOyBcCit9CisjZWxzZSAvKiAhV0lOMzIgKi8KKyNpZmRlZiBVU0VfVElTX1NVUFBPUlQKKy8qCisgKiBUSVMgc3VwcG9ydCBpcyBpbnRlbmRlZCBmb3IgdGhyZWFkIHNhZmUgbGlicmFyaWVzLgorICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGdlbmVyYWwgY2xpZW50IHByb2dyYW1taW5nLgorICovCisjaW5jbHVkZSA8dGlzLmg+Cit0eXBlZGVmIHB0aHJlYWRfdCB4dGhyZWFkX3Q7Cit0eXBlZGVmIHB0aHJlYWRfa2V5X3QgeHRocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9jb25kX3QgeGNvbmRpdGlvbl9yZWM7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCB4bXV0ZXhfcmVjOworI2RlZmluZSB4dGhyZWFkX3NlbGYgdGlzX3NlbGYKKyNkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyBwdGhyZWFkX3QgX3RtcHh0aHI7IFwKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJl90bXB4dGhyLE5VTEwsZnVuYyxjbG9zdXJlKTsgfQorI2RlZmluZSB4dGhyZWFkX3lpZWxkKCkgcHRocmVhZF95aWVsZF9ucCgpCisjZGVmaW5lIHh0aHJlYWRfZXhpdCh2KSBwdGhyZWFkX2V4aXQodikKKyNkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHRpc19rZXlfY3JlYXRlKGtwLGQpCisjZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSB0aXNfa2V5X2RlbGV0ZShrKQorI2RlZmluZSB4dGhyZWFkX3NldF9zcGVjaWZpYyhrLHYpIHRpc19zZXRzcGVjaWZpYyhrLHYpCisjZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApICoodnApID0gdGlzX2dldHNwZWNpZmljKGspCisjZGVmaW5lIFhNVVRFWF9JTklUSUFMSVpFUiBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisjZGVmaW5lIHhtdXRleF9pbml0KG0pIHRpc19tdXRleF9pbml0KG0pCisjZGVmaW5lIHhtdXRleF9jbGVhcihtKSB0aXNfbXV0ZXhfZGVzdHJveShtKQorI2RlZmluZSB4bXV0ZXhfbG9jayhtKSB0aXNfbXV0ZXhfbG9jayhtKQorI2RlZmluZSB4bXV0ZXhfdW5sb2NrKG0pIHRpc19tdXRleF91bmxvY2sobSkKKyNkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGMpIHRpc19jb25kX2luaXQoYykKKyNkZWZpbmUgeGNvbmRpdGlvbl9jbGVhcihjKSB0aXNfY29uZF9kZXN0cm95KGMpCisjZGVmaW5lIHhjb25kaXRpb25fd2FpdChjLG0pIHRpc19jb25kX3dhaXQoYyxtKQorI2RlZmluZSB4Y29uZGl0aW9uX3NpZ25hbChjKSB0aXNfY29uZF9zaWduYWwoYykKKyNkZWZpbmUgeGNvbmRpdGlvbl9icm9hZGNhc3QoYykgdGlzX2NvbmRfYnJvYWRjYXN0KGMpCisjZWxzZQorI2lmZGVmIFVTRV9OQlNEX1RIUkVBRExJQgorLyoKKyAqIE5ldEJTRCB0aHJlYWRsaWIgc3VwcG9ydCBpcyBpbnRlbmRlZCBmb3IgdGhyZWFkIHNhZmUgbGlicmFyaWVzLgorICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGdlbmVyYWwgY2xpZW50IHByb2dyYW1taW5nLgorICovCisjaW5jbHVkZSA8dGhyZWFkbGliLmg+Cit0eXBlZGVmIHRocl90IHh0aHJlYWRfdDsKK3R5cGVkZWYgdGhyZWFkX2tleV90IHh0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGNvbmRfdCB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgbXV0ZXhfdCB4bXV0ZXhfcmVjOworI2RlZmluZSB4dGhyZWFkX3NlbGYgdGhyX3NlbGYKKyNkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyB0aHJfdCBfdG1weHRocjsgXAorCS8qIFhYWCBDcmVhdGUgaXQgZGV0YWNoZWQ/ICAtLXRob3JwZWogKi8gXAorCXRocl9jcmVhdGUoJl90bXB4dGhyLE5VTEwsZnVuYyxjbG9zdXJlKTsgfQorI2RlZmluZSB4dGhyZWFkX3lpZWxkKCkgdGhyX3lpZWxkKCkKKyNkZWZpbmUgeHRocmVhZF9leGl0KHYpIHRocl9leGl0KHYpCisjZGVmaW5lIHh0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKSB0aHJfa2V5Y3JlYXRlKGtwLGQpCisjZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSB0aHJfa2V5ZGVsZXRlKGspCisjZGVmaW5lIHh0aHJlYWRfc2V0X3NwZWNpZmljKGssdikgdGhyX3NldHNwZWNpZmljKGssdikKKyNkZWZpbmUgeHRocmVhZF9nZXRfc3BlY2lmaWMoayx2cCkgKih2cCkgPSB0aHJfZ2V0c3BlY2lmaWMoaykKKyNkZWZpbmUgWE1VVEVYX0lOSVRJQUxJWkVSIE1VVEVYX0lOSVRJQUxJWkVSCisjZGVmaW5lIHhtdXRleF9pbml0KG0pIG11dGV4X2luaXQobSwgMCkKKyNkZWZpbmUgeG11dGV4X2NsZWFyKG0pIG11dGV4X2Rlc3Ryb3kobSkKKyNkZWZpbmUgeG11dGV4X2xvY2sobSkgbXV0ZXhfbG9jayhtKQorI2RlZmluZSB4bXV0ZXhfdW5sb2NrKG0pIG11dGV4X3VubG9jayhtKQorI2RlZmluZSB4Y29uZGl0aW9uX2luaXQoYykgY29uZF9pbml0KGMsIDAsIDApCisjZGVmaW5lIHhjb25kaXRpb25fY2xlYXIoYykgY29uZF9kZXN0cm95KGMpCisjZGVmaW5lIHhjb25kaXRpb25fd2FpdChjLG0pIGNvbmRfd2FpdChjLG0pCisjZGVmaW5lIHhjb25kaXRpb25fc2lnbmFsKGMpIGNvbmRfc2lnbmFsKGMpCisjZGVmaW5lIHhjb25kaXRpb25fYnJvYWRjYXN0KGMpIGNvbmRfYnJvYWRjYXN0KGMpCisjZWxzZQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3R5cGVkZWYgcHRocmVhZF90IHh0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCB4dGhyZWFkX2tleV90OwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCB4Y29uZGl0aW9uX3JlYzsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IHhtdXRleF9yZWM7CisjZGVmaW5lIHh0aHJlYWRfc2VsZiBwdGhyZWFkX3NlbGYKKyNkZWZpbmUgeHRocmVhZF95aWVsZCgpIHB0aHJlYWRfeWllbGQoKQorI2RlZmluZSB4dGhyZWFkX2V4aXQodikgcHRocmVhZF9leGl0KHYpCisjZGVmaW5lIHh0aHJlYWRfc2V0X3NwZWNpZmljKGssdikgcHRocmVhZF9zZXRzcGVjaWZpYyhrLHYpCisjZGVmaW5lIHhtdXRleF9jbGVhcihtKSBwdGhyZWFkX211dGV4X2Rlc3Ryb3kobSkKKyNkZWZpbmUgeG11dGV4X2xvY2sobSkgcHRocmVhZF9tdXRleF9sb2NrKG0pCisjZGVmaW5lIHhtdXRleF91bmxvY2sobSkgcHRocmVhZF9tdXRleF91bmxvY2sobSkKKyNpZm5kZWYgWFBSRV9TVEFOREFSRF9BUEkKKyNkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHB0aHJlYWRfa2V5X2NyZWF0ZShrcCxkKQorI2RlZmluZSB4dGhyZWFkX2tleV9kZWxldGUoaykgcHRocmVhZF9rZXlfZGVsZXRlKGspCisjZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApICoodnApID0gcHRocmVhZF9nZXRzcGVjaWZpYyhrKQorI2RlZmluZSB4dGhyZWFkX2ZvcmsoZnVuYyxjbG9zdXJlKSB7IHB0aHJlYWRfdCBfdG1weHRocjsgXAorCXB0aHJlYWRfY3JlYXRlKCZfdG1weHRocixOVUxMLGZ1bmMsY2xvc3VyZSk7IH0KKyNkZWZpbmUgWE1VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgeG11dGV4X2luaXQobSkgcHRocmVhZF9tdXRleF9pbml0KG0sIE5VTEwpCisjZGVmaW5lIHhjb25kaXRpb25faW5pdChjKSBwdGhyZWFkX2NvbmRfaW5pdChjLCBOVUxMKQorI2Vsc2UgLyogWFBSRV9TVEFOREFSRF9BUEkgKi8KKyNkZWZpbmUgeHRocmVhZF9rZXlfY3JlYXRlKGtwLGQpIHB0aHJlYWRfa2V5Y3JlYXRlKGtwLGQpCisjZGVmaW5lIHh0aHJlYWRfa2V5X2RlbGV0ZShrKSAwCisjZGVmaW5lIHh0aHJlYWRfZ2V0X3NwZWNpZmljKGssdnApIHB0aHJlYWRfZ2V0c3BlY2lmaWMoayx2cCkKKyNkZWZpbmUgeHRocmVhZF9mb3JrKGZ1bmMsY2xvc3VyZSkgeyBwdGhyZWFkX3QgX3RtcHh0aHI7IFwKKwlwdGhyZWFkX2NyZWF0ZSgmX3RtcHh0aHIscHRocmVhZF9hdHRyX2RlZmF1bHQsZnVuYyxjbG9zdXJlKTsgfQorI2RlZmluZSB4bXV0ZXhfaW5pdChtKSBwdGhyZWFkX211dGV4X2luaXQobSwgcHRocmVhZF9tdXRleGF0dHJfZGVmYXVsdCkKKyNkZWZpbmUgeGNvbmRpdGlvbl9pbml0KGMpIHB0aHJlYWRfY29uZF9pbml0KGMsIHB0aHJlYWRfY29uZGF0dHJfZGVmYXVsdCkKKyNlbmRpZiAvKiBYUFJFX1NUQU5EQVJEX0FQSSAqLworI2RlZmluZSB4Y29uZGl0aW9uX2NsZWFyKGMpIHB0aHJlYWRfY29uZF9kZXN0cm95KGMpCisjZGVmaW5lIHhjb25kaXRpb25fd2FpdChjLG0pIHB0aHJlYWRfY29uZF93YWl0KGMsbSkKKyNkZWZpbmUgeGNvbmRpdGlvbl9zaWduYWwoYykgcHRocmVhZF9jb25kX3NpZ25hbChjKQorI2RlZmluZSB4Y29uZGl0aW9uX2Jyb2FkY2FzdChjKSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGMpCisjaWYgZGVmaW5lZChfREVDVEhSRUFEU18pCitzdGF0aWMgeHRocmVhZF90IF9YX25vX3RocmVhZF9pZDsKKyNkZWZpbmUgeHRocmVhZF9oYXZlX2lkKGlkKSAhcHRocmVhZF9lcXVhbChpZCwgX1hfbm9fdGhyZWFkX2lkKQorI2RlZmluZSB4dGhyZWFkX2NsZWFyX2lkKGlkKSBpZCA9IF9YX25vX3RocmVhZF9pZAorI2RlZmluZSB4dGhyZWFkX2VxdWFsKGlkMSxpZDIpIHB0aHJlYWRfZXF1YWwoaWQxLCBpZDIpCisjZW5kaWYgLyogX0RFQ1RIUkVBRFNfICovCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjZGVmaW5lIHh0aHJlYWRfaGF2ZV9pZChpZCkgIXB0aHJlYWRfZXF1YWwoaWQsIDApCisjZGVmaW5lIHh0aHJlYWRfY2xlYXJfaWQoaWQpIGlkID0gMAorI2RlZmluZSB4dGhyZWFkX2VxdWFsKGlkMSxpZDIpIHB0aHJlYWRfZXF1YWwoaWQxLCBpZDIpCisjZW5kaWYgLyogbGludXggKi8KKyNpZiBkZWZpbmVkKF9DTUFfVkVORE9SXykgJiYgZGVmaW5lZChfQ01BX19JQk0pICYmIChfQ01BX1ZFTkRPUl8gPT0gX0NNQV9fSUJNKQorI2lmZGVmIERFQlVHCQkJLyogdG9vIG11Y2ggb2YgYSBoYWNrIHRvIGVuYWJsZSBub3JtYWxseSAqLworLyogc2VlIGFsc28gY21hX19vYmpfc2V0X25hbWUoKSAqLworI2RlZmluZSB4bXV0ZXhfc2V0X25hbWUobSxzdHIpICgoY2hhcioqKShtKS0+ZmllbGQxKVs1XSA9IChzdHIpCisjZGVmaW5lIHhjb25kaXRpb25fc2V0X25hbWUoY3Ysc3RyKSAoKGNoYXIqKikoY3YpLT5maWVsZDEpWzVdID0gKHN0cikKKyNlbmRpZiAvKiBERUJVRyAqLworI2VuZGlmIC8qIF9DTUFfVkVORE9SXyA9PSBfQ01BX19JQk0gKi8KKyNlbmRpZiAvKiBVU0VfTkJTRF9USFJFQURMSUIgKi8KKyNlbmRpZiAvKiBVU0VfVElTX1NVUFBPUlQgKi8KKyNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmIC8qIFNWUjQgKi8KKyNlbmRpZiAvKiBDVEhSRUFEUyAqLwordHlwZWRlZiB4Y29uZGl0aW9uX3JlYyAqeGNvbmRpdGlvbl90OwordHlwZWRlZiB4bXV0ZXhfcmVjICp4bXV0ZXhfdDsKKyNpZm5kZWYgeGNvbmRpdGlvbl9tYWxsb2MKKyNkZWZpbmUgeGNvbmRpdGlvbl9tYWxsb2MoKSAoeGNvbmRpdGlvbl90KXhtYWxsb2Moc2l6ZW9mKHhjb25kaXRpb25fcmVjKSkKKyNlbmRpZgorI2lmbmRlZiB4Y29uZGl0aW9uX2ZyZWUKKyNkZWZpbmUgeGNvbmRpdGlvbl9mcmVlKGMpIHhmcmVlKChjaGFyICopYykKKyNlbmRpZgorI2lmbmRlZiB4bXV0ZXhfbWFsbG9jCisjZGVmaW5lIHhtdXRleF9tYWxsb2MoKSAoeG11dGV4X3QpeG1hbGxvYyhzaXplb2YoeG11dGV4X3JlYykpCisjZW5kaWYKKyNpZm5kZWYgeG11dGV4X2ZyZWUKKyNkZWZpbmUgeG11dGV4X2ZyZWUobSkgeGZyZWUoKGNoYXIgKiltKQorI2VuZGlmCisjaWZuZGVmIHh0aHJlYWRfaGF2ZV9pZAorI2RlZmluZSB4dGhyZWFkX2hhdmVfaWQoaWQpIGlkCisjZW5kaWYKKyNpZm5kZWYgeHRocmVhZF9jbGVhcl9pZAorI2RlZmluZSB4dGhyZWFkX2NsZWFyX2lkKGlkKSBpZCA9IDAKKyNlbmRpZgorI2lmbmRlZiB4dGhyZWFkX2VxdWFsCisjZGVmaW5lIHh0aHJlYWRfZXF1YWwoaWQxLGlkMikgKChpZDEpID09IChpZDIpKQorI2VuZGlmCisvKiBhaWRzIHVuZGVyc3Rvb2QgYnkgc29tZSBkZWJ1Z2dlcnMgKi8KKyNpZm5kZWYgeHRocmVhZF9zZXRfbmFtZQorI2RlZmluZSB4dGhyZWFkX3NldF9uYW1lKHQsc3RyKQorI2VuZGlmCisjaWZuZGVmIHhtdXRleF9zZXRfbmFtZQorI2RlZmluZSB4bXV0ZXhfc2V0X25hbWUobSxzdHIpCisjZW5kaWYKKyNpZm5kZWYgeGNvbmRpdGlvbl9zZXRfbmFtZQorI2RlZmluZSB4Y29uZGl0aW9uX3NldF9uYW1lKGN2LHN0cikKKyNlbmRpZgorCisjZW5kaWYgLyogX1hUSFJFQURTX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9YdXRpbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjJlZjYzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHV0aWwuaApAQCAtMCwwICsxLDgyOCBAQAorLyogJFhvcmc6IFh1dGlsLmgsdiAxLjggMjAwMS8wMi8wOSAwMjowMzozOSB4b3JnY3ZzIEV4cCAkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4NywgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBEaWdpdGFsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2xpYi9YMTEvWHV0aWwuaCx2IDMuNiAyMDAzLzA0LzEzIDE5OjIyOjIwIGRhd2VzIEV4cCAkICovCisKKyNpZm5kZWYgX1hVVElMX0hfCisjZGVmaW5lIF9YVVRJTF9IXworCisvKiBZb3UgbXVzdCBpbmNsdWRlIDxYMTEvWGxpYi5oPiBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSAqLworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2tleXN5bS5oPgorCisvKiAKKyAqIEJpdG1hc2sgcmV0dXJuZWQgYnkgWFBhcnNlR2VvbWV0cnkoKS4gIEVhY2ggYml0IHRlbGxzIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgKiB2YWx1ZSAoeCwgeSwgd2lkdGgsIGhlaWdodCkgd2FzIGZvdW5kIGluIHRoZSBwYXJzZWQgc3RyaW5nLgorICovCisjZGVmaW5lIE5vVmFsdWUJCTB4MDAwMAorI2RlZmluZSBYVmFsdWUgIAkweDAwMDEKKyNkZWZpbmUgWVZhbHVlCQkweDAwMDIKKyNkZWZpbmUgV2lkdGhWYWx1ZSAgCTB4MDAwNAorI2RlZmluZSBIZWlnaHRWYWx1ZSAgCTB4MDAwOAorI2RlZmluZSBBbGxWYWx1ZXMgCTB4MDAwRgorI2RlZmluZSBYTmVnYXRpdmUgCTB4MDAxMAorI2RlZmluZSBZTmVnYXRpdmUgCTB4MDAyMAorCisvKgorICogbmV3IHZlcnNpb24gY29udGFpbmluZyBiYXNlX3dpZHRoLCBiYXNlX2hlaWdodCwgYW5kIHdpbl9ncmF2aXR5IGZpZWxkczsKKyAqIHVzZWQgd2l0aCBXTV9OT1JNQUxfSElOVFMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAJbG9uZyBmbGFnczsJLyogbWFya3Mgd2hpY2ggZmllbGRzIGluIHRoaXMgc3RydWN0dXJlIGFyZSBkZWZpbmVkICovCisJaW50IHgsIHk7CQkvKiBvYnNvbGV0ZSBmb3IgbmV3IHdpbmRvdyBtZ3JzLCBidXQgY2xpZW50cyAqLworCWludCB3aWR0aCwgaGVpZ2h0OwkvKiBzaG91bGQgc2V0IHNvIG9sZCB3bSdzIGRvbid0IG1lc3MgdXAgKi8KKwlpbnQgbWluX3dpZHRoLCBtaW5faGVpZ2h0OworCWludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisgICAgCWludCB3aWR0aF9pbmMsIGhlaWdodF9pbmM7CisJc3RydWN0IHsKKwkJaW50IHg7CS8qIG51bWVyYXRvciAqLworCQlpbnQgeTsJLyogZGVub21pbmF0b3IgKi8KKwl9IG1pbl9hc3BlY3QsIG1heF9hc3BlY3Q7CisJaW50IGJhc2Vfd2lkdGgsIGJhc2VfaGVpZ2h0OwkJLyogYWRkZWQgYnkgSUNDQ00gdmVyc2lvbiAxICovCisJaW50IHdpbl9ncmF2aXR5OwkJCS8qIGFkZGVkIGJ5IElDQ0NNIHZlcnNpb24gMSAqLworfSBYU2l6ZUhpbnRzOworCisvKgorICogVGhlIG5leHQgYmxvY2sgb2YgZGVmaW5pdGlvbnMgYXJlIGZvciB3aW5kb3cgbWFuYWdlciBwcm9wZXJ0aWVzIHRoYXQKKyAqIGNsaWVudHMgYW5kIGFwcGxpY2F0aW9ucyB1c2UgZm9yIGNvbW11bmljYXRpb24uCisgKi8KKworLyogZmxhZ3MgYXJndW1lbnQgaW4gc2l6ZSBoaW50cyAqLworI2RlZmluZSBVU1Bvc2l0aW9uCSgxTCA8PCAwKSAvKiB1c2VyIHNwZWNpZmllZCB4LCB5ICovCisjZGVmaW5lIFVTU2l6ZQkJKDFMIDw8IDEpIC8qIHVzZXIgc3BlY2lmaWVkIHdpZHRoLCBoZWlnaHQgKi8KKworI2RlZmluZSBQUG9zaXRpb24JKDFMIDw8IDIpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHBvc2l0aW9uICovCisjZGVmaW5lIFBTaXplCQkoMUwgPDwgMykgLyogcHJvZ3JhbSBzcGVjaWZpZWQgc2l6ZSAqLworI2RlZmluZSBQTWluU2l6ZQkoMUwgPDwgNCkgLyogcHJvZ3JhbSBzcGVjaWZpZWQgbWluaW11bSBzaXplICovCisjZGVmaW5lIFBNYXhTaXplCSgxTCA8PCA1KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBtYXhpbXVtIHNpemUgKi8KKyNkZWZpbmUgUFJlc2l6ZUluYwkoMUwgPDwgNikgLyogcHJvZ3JhbSBzcGVjaWZpZWQgcmVzaXplIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgUEFzcGVjdAkJKDFMIDw8IDcpIC8qIHByb2dyYW0gc3BlY2lmaWVkIG1pbiBhbmQgbWF4IGFzcGVjdCByYXRpb3MgKi8KKyNkZWZpbmUgUEJhc2VTaXplCSgxTCA8PCA4KSAvKiBwcm9ncmFtIHNwZWNpZmllZCBiYXNlIGZvciBpbmNyZW1lbnRpbmcgKi8KKyNkZWZpbmUgUFdpbkdyYXZpdHkJKDFMIDw8IDkpIC8qIHByb2dyYW0gc3BlY2lmaWVkIHdpbmRvdyBncmF2aXR5ICovCisKKy8qIG9ic29sZXRlICovCisjZGVmaW5lIFBBbGxIaW50cyAoUFBvc2l0aW9ufFBTaXplfFBNaW5TaXplfFBNYXhTaXplfFBSZXNpemVJbmN8UEFzcGVjdCkKKworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlsb25nIGZsYWdzOwkvKiBtYXJrcyB3aGljaCBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGRlZmluZWQgKi8KKwlCb29sIGlucHV0OwkvKiBkb2VzIHRoaXMgYXBwbGljYXRpb24gcmVseSBvbiB0aGUgd2luZG93IG1hbmFnZXIgdG8KKwkJCWdldCBrZXlib2FyZCBpbnB1dD8gKi8KKwlpbnQgaW5pdGlhbF9zdGF0ZTsJLyogc2VlIGJlbG93ICovCisJUGl4bWFwIGljb25fcGl4bWFwOwkvKiBwaXhtYXAgdG8gYmUgdXNlZCBhcyBpY29uICovCisJV2luZG93IGljb25fd2luZG93OyAJLyogd2luZG93IHRvIGJlIHVzZWQgYXMgaWNvbiAqLworCWludCBpY29uX3gsIGljb25feTsgCS8qIGluaXRpYWwgcG9zaXRpb24gb2YgaWNvbiAqLworCVBpeG1hcCBpY29uX21hc2s7CS8qIGljb24gbWFzayBiaXRtYXAgKi8KKwlYSUQgd2luZG93X2dyb3VwOwkvKiBpZCBvZiByZWxhdGVkIHdpbmRvdyBncm91cCAqLworCS8qIHRoaXMgc3RydWN0dXJlIG1heSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlICovCit9IFhXTUhpbnRzOworCisvKiBkZWZpbml0aW9uIGZvciBmbGFncyBvZiBYV01IaW50cyAqLworCisjZGVmaW5lIElucHV0SGludCAJCSgxTCA8PCAwKQorI2RlZmluZSBTdGF0ZUhpbnQgCQkoMUwgPDwgMSkKKyNkZWZpbmUgSWNvblBpeG1hcEhpbnQJCSgxTCA8PCAyKQorI2RlZmluZSBJY29uV2luZG93SGludAkJKDFMIDw8IDMpCisjZGVmaW5lIEljb25Qb3NpdGlvbkhpbnQgCSgxTCA8PCA0KQorI2RlZmluZSBJY29uTWFza0hpbnQJCSgxTCA8PCA1KQorI2RlZmluZSBXaW5kb3dHcm91cEhpbnQJCSgxTCA8PCA2KQorI2RlZmluZSBBbGxIaW50cyAoSW5wdXRIaW50fFN0YXRlSGludHxJY29uUGl4bWFwSGludHxJY29uV2luZG93SGludHwgXAorSWNvblBvc2l0aW9uSGludHxJY29uTWFza0hpbnR8V2luZG93R3JvdXBIaW50KQorI2RlZmluZSBYVXJnZW5jeUhpbnQJCSgxTCA8PCA4KQorCisvKiBkZWZpbml0aW9ucyBmb3IgaW5pdGlhbCB3aW5kb3cgc3RhdGUgKi8KKyNkZWZpbmUgV2l0aGRyYXduU3RhdGUgMAkvKiBmb3Igd2luZG93cyB0aGF0IGFyZSBub3QgbWFwcGVkICovCisjZGVmaW5lIE5vcm1hbFN0YXRlIDEJLyogbW9zdCBhcHBsaWNhdGlvbnMgd2FudCB0byBzdGFydCB0aGlzIHdheSAqLworI2RlZmluZSBJY29uaWNTdGF0ZSAzCS8qIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0YXJ0IGFzIGFuIGljb24gKi8KKworLyoKKyAqIE9ic29sZXRlIHN0YXRlcyBubyBsb25nZXIgZGVmaW5lZCBieSBJQ0NDTQorICovCisjZGVmaW5lIERvbnRDYXJlU3RhdGUgMAkvKiBkb24ndCBrbm93IG9yIGNhcmUgKi8KKyNkZWZpbmUgWm9vbVN0YXRlIDIJLyogYXBwbGljYXRpb24gd2FudHMgdG8gc3RhcnQgem9vbWVkICovCisjZGVmaW5lIEluYWN0aXZlU3RhdGUgNAkvKiBhcHBsaWNhdGlvbiBiZWxpZXZlcyBpdCBpcyBzZWxkb20gdXNlZDsgKi8KKwkJCS8qIHNvbWUgd20ncyBtYXkgcHV0IGl0IG9uIGluYWN0aXZlIG1lbnUgKi8KKworCisvKgorICogbmV3IHN0cnVjdHVyZSBmb3IgbWFuaXB1bGF0aW5nIFRFWFQgcHJvcGVydGllczsgdXNlZCB3aXRoIFdNX05BTUUsIAorICogV01fSUNPTl9OQU1FLCBXTV9DTElFTlRfTUFDSElORSwgYW5kIFdNX0NPTU1BTkQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyICp2YWx1ZTsJCS8qIHNhbWUgYXMgUHJvcGVydHkgcm91dGluZXMgKi8KKyAgICBBdG9tIGVuY29kaW5nOwkJCS8qIHByb3AgdHlwZSAqLworICAgIGludCBmb3JtYXQ7CQkJCS8qIHByb3AgZGF0YSBmb3JtYXQ6IDgsIDE2LCBvciAzMiAqLworICAgIHVuc2lnbmVkIGxvbmcgbml0ZW1zOwkJLyogbnVtYmVyIG9mIGRhdGEgaXRlbXMgaW4gdmFsdWUgKi8KK30gWFRleHRQcm9wZXJ0eTsKKworI2RlZmluZSBYTm9NZW1vcnkgLTEKKyNkZWZpbmUgWExvY2FsZU5vdFN1cHBvcnRlZCAtMgorI2RlZmluZSBYQ29udmVydGVyTm90Rm91bmQgLTMKKwordHlwZWRlZiBlbnVtIHsKKyAgICBYU3RyaW5nU3R5bGUsCQkvKiBTVFJJTkcgKi8KKyAgICBYQ29tcG91bmRUZXh0U3R5bGUsCQkvKiBDT01QT1VORF9URVhUICovCisgICAgWFRleHRTdHlsZSwJCQkvKiB0ZXh0IGluIG93bmVyJ3MgZW5jb2RpbmcgKGN1cnJlbnQgbG9jYWxlKSovCisgICAgWFN0ZElDQ1RleHRTdHlsZSwJCS8qIFNUUklORywgZWxzZSBDT01QT1VORF9URVhUICovCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBhbiBYRnJlZTg2IGV4dGVuc2lvbiwgaW50cm9kdWNlZCBpbiBOb3ZlbWJlciAyMDAwICovCisgICAgWFVURjhTdHJpbmdTdHlsZQkJLyogVVRGOF9TVFJJTkcgKi8KK30gWElDQ0VuY29kaW5nU3R5bGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgbWluX3dpZHRoLCBtaW5faGVpZ2h0OworCWludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CisJaW50IHdpZHRoX2luYywgaGVpZ2h0X2luYzsKK30gWEljb25TaXplOworCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciAqcmVzX25hbWU7CisJY2hhciAqcmVzX2NsYXNzOworfSBYQ2xhc3NIaW50OworCisjaWZkZWYgWFVUSUxfREVGSU5FX0ZVTkNUSU9OUworZXh0ZXJuIGludCBYRGVzdHJveUltYWdlKAorICAgICAgICBYSW1hZ2UgKnhpbWFnZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBYR2V0UGl4ZWwoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBpbnQgeCwgaW50IHkpOworZXh0ZXJuIGludCBYUHV0UGl4ZWwoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgIHVuc2lnbmVkIGxvbmcgcGl4ZWwpOworZXh0ZXJuIFhJbWFnZSAqWFN1YkltYWdlKAorICAgICAgICBYSW1hZ2UgKnhpbWFnZSwKKyAgICAgICAgaW50IHgsIGludCB5LAorICAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpOworZXh0ZXJuIGludCBYQWRkUGl4ZWwoCisgICAgICAgIFhJbWFnZSAqeGltYWdlLAorICAgICAgICBsb25nIHZhbHVlKTsKKyNlbHNlCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIGdpdmUgc29tZSBzdWdhciB0byB0aGUgaW1hZ2Ugcm91dGluZXMgc28gdGhhdAorICogbmFpdmUgcGVvcGxlIGFyZSBtb3JlIGNvbWZvcnRhYmxlIHdpdGggdGhlbS4KKyAqLworI2RlZmluZSBYRGVzdHJveUltYWdlKHhpbWFnZSkgXAorCSgoKigoeGltYWdlKS0+Zi5kZXN0cm95X2ltYWdlKSkoKHhpbWFnZSkpKQorI2RlZmluZSBYR2V0UGl4ZWwoeGltYWdlLCB4LCB5KSBcCisJKCgqKCh4aW1hZ2UpLT5mLmdldF9waXhlbCkpKCh4aW1hZ2UpLCAoeCksICh5KSkpCisjZGVmaW5lIFhQdXRQaXhlbCh4aW1hZ2UsIHgsIHksIHBpeGVsKSBcCisJKCgqKCh4aW1hZ2UpLT5mLnB1dF9waXhlbCkpKCh4aW1hZ2UpLCAoeCksICh5KSwgKHBpeGVsKSkpCisjZGVmaW5lIFhTdWJJbWFnZSh4aW1hZ2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpICBcCisJKCgqKCh4aW1hZ2UpLT5mLnN1Yl9pbWFnZSkpKCh4aW1hZ2UpLCAoeCksICh5KSwgKHdpZHRoKSwgKGhlaWdodCkpKQorI2RlZmluZSBYQWRkUGl4ZWwoeGltYWdlLCB2YWx1ZSkgXAorCSgoKigoeGltYWdlKS0+Zi5hZGRfcGl4ZWwpKSgoeGltYWdlKSwgKHZhbHVlKSkpCisjZW5kaWYKKworLyoKKyAqIENvbXBvc2Ugc2VxdWVuY2Ugc3RhdHVzIHN0cnVjdHVyZSwgdXNlZCBpbiBjYWxsaW5nIFhMb29rdXBTdHJpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YQ29tcG9zZVN0YXR1cyB7CisgICAgWFBvaW50ZXIgY29tcG9zZV9wdHI7CS8qIHN0YXRlIHRhYmxlIHBvaW50ZXIgKi8KKyAgICBpbnQgY2hhcnNfbWF0Y2hlZDsJCS8qIG1hdGNoIHN0YXRlICovCit9IFhDb21wb3NlU3RhdHVzOworCisvKgorICogS2V5c3ltIG1hY3JvcywgdXNlZCBvbiBLZXlzeW1zIHRvIHRlc3QgZm9yIGNsYXNzZXMgb2Ygc3ltYm9scworICovCisjZGVmaW5lIElzS2V5cGFkS2V5KGtleXN5bSkgXAorICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfS1BfU3BhY2UpICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0tQX0VxdWFsKSkKKworI2RlZmluZSBJc1ByaXZhdGVLZXlwYWRLZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSAweDExMDAwMDAwKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSAweDExMDBGRkZGKSkKKworI2RlZmluZSBJc0N1cnNvcktleShrZXlzeW0pIFwKKyAgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0hvbWUpICAgICAmJiAoKEtleVN5bSkoa2V5c3ltKSA8ICBYS19TZWxlY3QpKQorCisjZGVmaW5lIElzUEZLZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19LUF9GMSkgICAgICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0tQX0Y0KSkKKworI2RlZmluZSBJc0Z1bmN0aW9uS2V5KGtleXN5bSkgXAorICAoKChLZXlTeW0pKGtleXN5bSkgPj0gWEtfRjEpICAgICAgICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0YzNSkpCisKKyNkZWZpbmUgSXNNaXNjRnVuY3Rpb25LZXkoa2V5c3ltKSBcCisgICgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19TZWxlY3QpICAgJiYgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfQnJlYWspKQorCisjaWZkZWYgWEtfWEtCX0tFWVMKKyNkZWZpbmUgSXNNb2RpZmllcktleShrZXlzeW0pIFwKKyAgKCgoKEtleVN5bSkoa2V5c3ltKSA+PSBYS19TaGlmdF9MKSAmJiAoKEtleVN5bSkoa2V5c3ltKSA8PSBYS19IeXBlcl9SKSkgXAorICAgfHwgKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX0lTT19Mb2NrKSAmJiBcCisgICAgICAgKChLZXlTeW0pKGtleXN5bSkgPD0gWEtfSVNPX0xhc3RfR3JvdXBfTG9jaykpIFwKKyAgIHx8ICgoS2V5U3ltKShrZXlzeW0pID09IFhLX01vZGVfc3dpdGNoKSBcCisgICB8fCAoKEtleVN5bSkoa2V5c3ltKSA9PSBYS19OdW1fTG9jaykpCisjZWxzZQorI2RlZmluZSBJc01vZGlmaWVyS2V5KGtleXN5bSkgXAorICAoKCgoS2V5U3ltKShrZXlzeW0pID49IFhLX1NoaWZ0X0wpICYmICgoS2V5U3ltKShrZXlzeW0pIDw9IFhLX0h5cGVyX1IpKSBcCisgICB8fCAoKEtleVN5bSkoa2V5c3ltKSA9PSBYS19Nb2RlX3N3aXRjaCkgXAorICAgfHwgKChLZXlTeW0pKGtleXN5bSkgPT0gWEtfTnVtX0xvY2spKQorI2VuZGlmCisvKgorICogb3BhcXVlIHJlZmVyZW5jZSB0byBSZWdpb24gZGF0YSB0eXBlIAorICovCit0eXBlZGVmIHN0cnVjdCBfWFJlZ2lvbiAqUmVnaW9uOyAKKworLyogUmV0dXJuIHZhbHVlcyBmcm9tIFhSZWN0SW5SZWdpb24oKSAqLworIAorI2RlZmluZSBSZWN0YW5nbGVPdXQgMAorI2RlZmluZSBSZWN0YW5nbGVJbiAgMQorI2RlZmluZSBSZWN0YW5nbGVQYXJ0IDIKKyAKKworLyoKKyAqIEluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIHZpc3VhbCB1dGlsaXR5IHJvdXRpbmVzIHRvIGZpbmQgZGVzaXJlZCB2aXN1YWwKKyAqIHR5cGUgZnJvbSB0aGUgbWFueSB2aXN1YWxzIGEgZGlzcGxheSBtYXkgc3VwcG9ydC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIFZpc3VhbCAqdmlzdWFsOworICBWaXN1YWxJRCB2aXN1YWxpZDsKKyAgaW50IHNjcmVlbjsKKyAgaW50IGRlcHRoOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgaW50IGNfY2xhc3M7CQkJCQkvKiBDKysgKi8KKyNlbHNlCisgIGludCBjbGFzczsKKyNlbmRpZgorICB1bnNpZ25lZCBsb25nIHJlZF9tYXNrOworICB1bnNpZ25lZCBsb25nIGdyZWVuX21hc2s7CisgIHVuc2lnbmVkIGxvbmcgYmx1ZV9tYXNrOworICBpbnQgY29sb3JtYXBfc2l6ZTsKKyAgaW50IGJpdHNfcGVyX3JnYjsKK30gWFZpc3VhbEluZm87CisKKyNkZWZpbmUgVmlzdWFsTm9NYXNrCQkweDAKKyNkZWZpbmUgVmlzdWFsSURNYXNrIAkJMHgxCisjZGVmaW5lIFZpc3VhbFNjcmVlbk1hc2sJMHgyCisjZGVmaW5lIFZpc3VhbERlcHRoTWFzawkJMHg0CisjZGVmaW5lIFZpc3VhbENsYXNzTWFzawkJMHg4CisjZGVmaW5lIFZpc3VhbFJlZE1hc2tNYXNrCTB4MTAKKyNkZWZpbmUgVmlzdWFsR3JlZW5NYXNrTWFzawkweDIwCisjZGVmaW5lIFZpc3VhbEJsdWVNYXNrTWFzawkweDQwCisjZGVmaW5lIFZpc3VhbENvbG9ybWFwU2l6ZU1hc2sJMHg4MAorI2RlZmluZSBWaXN1YWxCaXRzUGVyUkdCTWFzawkweDEwMAorI2RlZmluZSBWaXN1YWxBbGxNYXNrCQkweDFGRgorCisvKgorICogVGhpcyBkZWZpbmVzIGEgd2luZG93IG1hbmFnZXIgcHJvcGVydHkgdGhhdCBjbGllbnRzIG1heSB1c2UgdG8KKyAqIHNoYXJlIHN0YW5kYXJkIGNvbG9yIG1hcHMgb2YgdHlwZSBSR0JfQ09MT1JfTUFQOgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQ29sb3JtYXAgY29sb3JtYXA7CisJdW5zaWduZWQgbG9uZyByZWRfbWF4OworCXVuc2lnbmVkIGxvbmcgcmVkX211bHQ7CisJdW5zaWduZWQgbG9uZyBncmVlbl9tYXg7CisJdW5zaWduZWQgbG9uZyBncmVlbl9tdWx0OworCXVuc2lnbmVkIGxvbmcgYmx1ZV9tYXg7CisJdW5zaWduZWQgbG9uZyBibHVlX211bHQ7CisJdW5zaWduZWQgbG9uZyBiYXNlX3BpeGVsOworCVZpc3VhbElEIHZpc3VhbGlkOwkJLyogYWRkZWQgYnkgSUNDQ00gdmVyc2lvbiAxICovCisJWElEIGtpbGxpZDsJCQkvKiBhZGRlZCBieSBJQ0NDTSB2ZXJzaW9uIDEgKi8KK30gWFN0YW5kYXJkQ29sb3JtYXA7CisKKyNkZWZpbmUgUmVsZWFzZUJ5RnJlZWluZ0NvbG9ybWFwICgoWElEKSAxTCkgIC8qIGZvciBraWxsaWQgZmllbGQgYWJvdmUgKi8KKworCisvKgorICogcmV0dXJuIGNvZGVzIGZvciBYUmVhZEJpdG1hcEZpbGUgYW5kIFhXcml0ZUJpdG1hcEZpbGUKKyAqLworI2RlZmluZSBCaXRtYXBTdWNjZXNzCQkwCisjZGVmaW5lIEJpdG1hcE9wZW5GYWlsZWQgCTEKKyNkZWZpbmUgQml0bWFwRmlsZUludmFsaWQgCTIKKyNkZWZpbmUgQml0bWFwTm9NZW1vcnkJCTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb250ZXh0IE1hbmFnZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBBc3NvY2lhdGl2ZSBsb29rdXAgdGFibGUgcmV0dXJuIGNvZGVzICovCisKKyNkZWZpbmUgWENTVUNDRVNTIDAJLyogTm8gZXJyb3IuICovCisjZGVmaW5lIFhDTk9NRU0gICAxICAgIC8qIE91dCBvZiBtZW1vcnkgKi8KKyNkZWZpbmUgWENOT0VOVCAgIDIgICAgLyogTm8gZW50cnkgaW4gdGFibGUgKi8KKwordHlwZWRlZiBpbnQgWENvbnRleHQ7CisKKyNkZWZpbmUgWFVuaXF1ZUNvbnRleHQoKSAgICAgICAoKFhDb250ZXh0KSBYcm1VbmlxdWVRdWFyaygpKQorI2RlZmluZSBYU3RyaW5nVG9Db250ZXh0KHN0cmluZykgICAoKFhDb250ZXh0KSBYcm1TdHJpbmdUb1F1YXJrKHN0cmluZykpCisKK19YRlVOQ1BST1RPQkVHSU4KKworLyogVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgYXJlIGFscGhhYmV0aXplZC4gKi8KKworZXh0ZXJuIFhDbGFzc0hpbnQgKlhBbGxvY0NsYXNzSGludCAoCisgICAgdm9pZAorKTsKKworZXh0ZXJuIFhJY29uU2l6ZSAqWEFsbG9jSWNvblNpemUgKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBYU2l6ZUhpbnRzICpYQWxsb2NTaXplSGludHMgKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBYU3RhbmRhcmRDb2xvcm1hcCAqWEFsbG9jU3RhbmRhcmRDb2xvcm1hcCAoCisgICAgdm9pZAorKTsKKworZXh0ZXJuIFhXTUhpbnRzICpYQWxsb2NXTUhpbnRzICgKKyAgICB2b2lkCispOworCitleHRlcm4gaW50IFhDbGlwQm94KAorICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBYUmVjdGFuZ2xlKgkJLyogcmVjdF9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBSZWdpb24gWENyZWF0ZVJlZ2lvbigKKyAgICB2b2lkCispOworCitleHRlcm4gY29uc3QgY2hhciAqWERlZmF1bHRTdHJpbmcgKHZvaWQpOworCitleHRlcm4gaW50IFhEZWxldGVDb250ZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIHJpZCAqLywKKyAgICBYQ29udGV4dAkJLyogY29udGV4dCAqLworKTsKKworZXh0ZXJuIGludCBYRGVzdHJveVJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8KKyk7CisKK2V4dGVybiBpbnQgWEVtcHR5UmVnaW9uKAorICAgIFJlZ2lvbgkJLyogciAqLworKTsKKworZXh0ZXJuIGludCBYRXF1YWxSZWdpb24oCisgICAgUmVnaW9uCQkvKiByMSAqLywKKyAgICBSZWdpb24JCS8qIHIyICovCispOworCitleHRlcm4gaW50IFhGaW5kQ29udGV4dCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYSUQJCQkvKiByaWQgKi8sCisgICAgWENvbnRleHQJCS8qIGNvbnRleHQgKi8sCisgICAgWFBvaW50ZXIqCQkvKiBkYXRhX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0Q2xhc3NIaW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYQ2xhc3NIaW50KgkJLyogY2xhc3NfaGludHNfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRJY29uU2l6ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhJY29uU2l6ZSoqCQkvKiBzaXplX2xpc3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0Tm9ybWFsSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50c19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFJHQkNvbG9ybWFwcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFN0YW5kYXJkQ29sb3JtYXAqKiAvKiBzdGRjbWFwX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBjb3VudF9yZXR1cm4gKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFNpemVIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzX3JldHVybiAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0U3RhbmRhcmRDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFN0YW5kYXJkQ29sb3JtYXAqCS8qIGNvbG9ybWFwX3JldHVybiAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLwkJCSAgICAKKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFRleHRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3BfcmV0dXJuICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gWFZpc3VhbEluZm8gKlhHZXRWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGxvbmcJCS8qIHZpbmZvX21hc2sgKi8sCisgICAgWFZpc3VhbEluZm8qCS8qIHZpbmZvX3RlbXBsYXRlICovLAorICAgIGludCoJCS8qIG5pdGVtc19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWEdldFdNQ2xpZW50TWFjaGluZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIFhXTUhpbnRzICpYR2V0V01IaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8JCSAgICAgIAorKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01JY29uTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYR2V0V01OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3BfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRXTU5vcm1hbEhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHNfcmV0dXJuICovLAorICAgIGxvbmcqCQkvKiBzdXBwbGllZF9yZXR1cm4gKi8gCispOworCitleHRlcm4gU3RhdHVzIFhHZXRXTVNpemVIaW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFNpemVIaW50cyoJCS8qIGhpbnRzX3JldHVybiAqLywKKyAgICBsb25nKgkJLyogc3VwcGxpZWRfcmV0dXJuICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gU3RhdHVzIFhHZXRab29tSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiB6aGludHNfcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhJbnRlcnNlY3RSZWdpb24oCisgICAgUmVnaW9uCQkvKiBzcmEgKi8sCisgICAgUmVnaW9uCQkvKiBzcmIgKi8sCisgICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhDb252ZXJ0Q2FzZSgKKyAgICBLZXlTeW0JCS8qIHN5bSAqLywKKyAgICBLZXlTeW0qCQkvKiBsb3dlciAqLywKKyAgICBLZXlTeW0qCQkvKiB1cHBlciAqLworKTsKKworZXh0ZXJuIGludCBYTG9va3VwU3RyaW5nKAorICAgIFhLZXlFdmVudCoJCS8qIGV2ZW50X3N0cnVjdCAqLywKKyAgICBjaGFyKgkJLyogYnVmZmVyX3JldHVybiAqLywKKyAgICBpbnQJCQkvKiBieXRlc19idWZmZXIgKi8sCisgICAgS2V5U3ltKgkJLyoga2V5c3ltX3JldHVybiAqLywKKyAgICBYQ29tcG9zZVN0YXR1cyoJLyogc3RhdHVzX2luX291dCAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYTWF0Y2hWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIGludAkJCS8qIHNjcmVlbiAqLywKKyAgICBpbnQJCQkvKiBkZXB0aCAqLywKKyAgICBpbnQJCQkvKiBjbGFzcyAqLywKKyAgICBYVmlzdWFsSW5mbyoJLyogdmluZm9fcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhPZmZzZXRSZWdpb24oCisgICAgUmVnaW9uCQkvKiByICovLAorICAgIGludAkJCS8qIGR4ICovLAorICAgIGludAkJCS8qIGR5ICovCispOworCitleHRlcm4gQm9vbCBYUG9pbnRJblJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgaW50CQkJLyogeCAqLywKKyAgICBpbnQJCQkvKiB5ICovCispOworCitleHRlcm4gUmVnaW9uIFhQb2x5Z29uUmVnaW9uKAorICAgIFhQb2ludCoJCS8qIHBvaW50cyAqLywKKyAgICBpbnQJCQkvKiBuICovLAorICAgIGludAkJCS8qIGZpbGxfcnVsZSAqLworKTsKKworZXh0ZXJuIGludCBYUmVjdEluUmVnaW9uKAorICAgIFJlZ2lvbgkJLyogciAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNhdmVDb250ZXh0KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIHJpZCAqLywKKyAgICBYQ29udGV4dAkJLyogY29udGV4dCAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRhdGEgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldENsYXNzSGludCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzICovCispOworCitleHRlcm4gaW50IFhTZXRJY29uU2l6ZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhJY29uU2l6ZSoJCS8qIHNpemVfbGlzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLyAgICAKKyk7CisKK2V4dGVybiBpbnQgWFNldE5vcm1hbEhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRSR0JDb2xvcm1hcHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTdGFuZGFyZENvbG9ybWFwKgkvKiBzdGRjbWFwcyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0U2l6ZUhpbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8sCisgICAgQXRvbQkJLyogcHJvcGVydHkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFN0YW5kYXJkUHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB3aW5kb3dfbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGljb25fbmFtZSAqLywKKyAgICBQaXhtYXAJCS8qIGljb25fcGl4bWFwICovLAorICAgIGNoYXIqKgkJLyogYXJndiAqLywKKyAgICBpbnQJCQkvKiBhcmdjICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFRleHRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gdm9pZCBYU2V0V01DbGllbnRNYWNoaW5lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3AgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNldFdNSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhXTUhpbnRzKgkJLyogd21faGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRXTUljb25OYW1lKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBYVGV4dFByb3BlcnR5KgkvKiB0ZXh0X3Byb3AgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTZXRXTU5hbWUoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhUZXh0UHJvcGVydHkqCS8qIHRleHRfcHJvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFdNTm9ybWFsSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50cyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNldFdNUHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogd2luZG93X25hbWUgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogaWNvbl9uYW1lICovLAorICAgIGNoYXIqKgkJLyogYXJndiAqLywKKyAgICBpbnQJCQkvKiBhcmdjICovLAorICAgIFhTaXplSGludHMqCQkvKiBub3JtYWxfaGludHMgKi8sCisgICAgWFdNSGludHMqCQkvKiB3bV9oaW50cyAqLywKKyAgICBYQ2xhc3NIaW50KgkJLyogY2xhc3NfaGludHMgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYlNldFdNUHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB3aW5kb3dfbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGljb25fbmFtZSAqLywKKyAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCisgICAgaW50CQkJLyogYXJnYyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogbm9ybWFsX2hpbnRzICovLAorICAgIFhXTUhpbnRzKgkJLyogd21faGludHMgKi8sCisgICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzICovCispOworCitleHRlcm4gdm9pZCBYdXRmOFNldFdNUHJvcGVydGllcygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgX1hjb25zdCBjaGFyKgkvKiB3aW5kb3dfbmFtZSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGljb25fbmFtZSAqLywKKyAgICBjaGFyKioJCS8qIGFyZ3YgKi8sCisgICAgaW50CQkJLyogYXJnYyAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogbm9ybWFsX2hpbnRzICovLAorICAgIFhXTUhpbnRzKgkJLyogd21faGludHMgKi8sCisgICAgWENsYXNzSGludCoJCS8qIGNsYXNzX2hpbnRzICovCispOworCitleHRlcm4gdm9pZCBYU2V0V01TaXplSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiBoaW50cyAqLywKKyAgICBBdG9tCQkvKiBwcm9wZXJ0eSAqLworKTsKKworZXh0ZXJuIGludCBYU2V0UmVnaW9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIEdDCQkJLyogZ2MgKi8sCisgICAgUmVnaW9uCQkvKiByICovCispOworCitleHRlcm4gdm9pZCBYU2V0U3RhbmRhcmRDb2xvcm1hcCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgWFN0YW5kYXJkQ29sb3JtYXAqCS8qIGNvbG9ybWFwICovLAorICAgIEF0b20JCS8qIHByb3BlcnR5ICovCispOworCitleHRlcm4gaW50IFhTZXRab29tSGludHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhTaXplSGludHMqCQkvKiB6aGludHMgKi8KKyk7CisKK2V4dGVybiBpbnQgWFNocmlua1JlZ2lvbigKKyAgICBSZWdpb24JCS8qIHIgKi8sCisgICAgaW50CQkJLyogZHggKi8sCisgICAgaW50CQkJLyogZHkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgKKyAgICBjaGFyKioJCS8qIGxpc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYU3VidHJhY3RSZWdpb24oCisgICAgUmVnaW9uCQkvKiBzcmEgKi8sCisgICAgUmVnaW9uCQkvKiBzcmIgKi8sCisgICAgUmVnaW9uCQkvKiBkcl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWG1iVGV4dExpc3RUb1RleHRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJZGlzcGxheSwKKyAgICBjaGFyKioJCWxpc3QsCisgICAgaW50CQkJY291bnQsCisgICAgWElDQ0VuY29kaW5nU3R5bGUJc3R5bGUsCisgICAgWFRleHRQcm9wZXJ0eSoJdGV4dF9wcm9wX3JldHVybgorKTsKKworZXh0ZXJuIGludCBYd2NUZXh0TGlzdFRvVGV4dFByb3BlcnR5KAorICAgIERpc3BsYXkqCQlkaXNwbGF5LAorICAgIHdjaGFyX3QqKgkJbGlzdCwKKyAgICBpbnQJCQljb3VudCwKKyAgICBYSUNDRW5jb2RpbmdTdHlsZQlzdHlsZSwKKyAgICBYVGV4dFByb3BlcnR5Kgl0ZXh0X3Byb3BfcmV0dXJuCispOworCitleHRlcm4gaW50IFh1dGY4VGV4dExpc3RUb1RleHRQcm9wZXJ0eSgKKyAgICBEaXNwbGF5KgkJZGlzcGxheSwKKyAgICBjaGFyKioJCWxpc3QsCisgICAgaW50CQkJY291bnQsCisgICAgWElDQ0VuY29kaW5nU3R5bGUJc3R5bGUsCisgICAgWFRleHRQcm9wZXJ0eSoJdGV4dF9wcm9wX3JldHVybgorKTsKKworZXh0ZXJuIHZvaWQgWHdjRnJlZVN0cmluZ0xpc3QoCisgICAgd2NoYXJfdCoqCQlsaXN0CispOworCitleHRlcm4gU3RhdHVzIFhUZXh0UHJvcGVydHlUb1N0cmluZ0xpc3QoCisgICAgWFRleHRQcm9wZXJ0eSoJLyogdGV4dF9wcm9wICovLAorICAgIGNoYXIqKioJCS8qIGxpc3RfcmV0dXJuICovLAorICAgIGludCoJCS8qIGNvdW50X3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYbWJUZXh0UHJvcGVydHlUb1RleHRMaXN0KAorICAgIERpc3BsYXkqCQlkaXNwbGF5LAorICAgIGNvbnN0IFhUZXh0UHJvcGVydHkqIHRleHRfcHJvcCwKKyAgICBjaGFyKioqCQlsaXN0X3JldHVybiwKKyAgICBpbnQqCQljb3VudF9yZXR1cm4KKyk7CisKK2V4dGVybiBpbnQgWHdjVGV4dFByb3BlcnR5VG9UZXh0TGlzdCgKKyAgICBEaXNwbGF5KgkJZGlzcGxheSwKKyAgICBjb25zdCBYVGV4dFByb3BlcnR5KiB0ZXh0X3Byb3AsCisgICAgd2NoYXJfdCoqKgkJbGlzdF9yZXR1cm4sCisgICAgaW50KgkJY291bnRfcmV0dXJuCispOworCitleHRlcm4gaW50IFh1dGY4VGV4dFByb3BlcnR5VG9UZXh0TGlzdCgKKyAgICBEaXNwbGF5KgkJZGlzcGxheSwKKyAgICBjb25zdCBYVGV4dFByb3BlcnR5KiB0ZXh0X3Byb3AsCisgICAgY2hhcioqKgkJbGlzdF9yZXR1cm4sCisgICAgaW50KgkJY291bnRfcmV0dXJuCispOworCitleHRlcm4gaW50IFhVbmlvblJlY3RXaXRoUmVnaW9uKAorICAgIFhSZWN0YW5nbGUqCQkvKiByZWN0YW5nbGUgKi8sCisgICAgUmVnaW9uCQkvKiBzcmNfcmVnaW9uICovLAorICAgIFJlZ2lvbgkJLyogZGVzdF9yZWdpb25fcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhVbmlvblJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHNyYSAqLywKKyAgICBSZWdpb24JCS8qIHNyYiAqLywKKyAgICBSZWdpb24JCS8qIGRyX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYV01HZW9tZXRyeSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBpbnQJCQkvKiBzY3JlZW5fbnVtYmVyICovLAorICAgIF9YY29uc3QgY2hhcioJLyogdXNlcl9nZW9tZXRyeSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGRlZmF1bHRfZ2VvbWV0cnkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJvcmRlcl93aWR0aCAqLywKKyAgICBYU2l6ZUhpbnRzKgkJLyogaGludHMgKi8sCisgICAgaW50KgkJLyogeF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogeV9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogd2lkdGhfcmV0dXJuICovLAorICAgIGludCoJCS8qIGhlaWdodF9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogZ3Jhdml0eV9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBpbnQgWFhvclJlZ2lvbigKKyAgICBSZWdpb24JCS8qIHNyYSAqLywKKyAgICBSZWdpb24JCS8qIHNyYiAqLywKKyAgICBSZWdpb24JCS8qIGRyX3JldHVybiAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHczMmRlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3MzJkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2MjRmZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3MzJkZWZzLmgKQEAgLTAsMCArMSw4MSBAQAorLyogJFhvcmc6IFh3MzJkZWZzLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NCBjb3NrcmV5IEV4cCAkICovCisKKyNpZm5kZWYgX1hXMzJERUZTX0gKKyNkZWZpbmUgIF9YVzMyREVGU19ICisKKyNpZmRlZiBfX0dOVUNfXyAvKiBtaW5ndyBpcyBtb3JlIGNsb3NlIHRvIHVuaXggdGhhbiBtc3ZjICovCisjaWYgIWRlZmluZWQoX19kYWRkcl90X2RlZmluZWQpIAordHlwZWRlZiBjaGFyICpjYWRkcl90OworI2VuZGlmCisjZGVmaW5lIGxzdGF0IHN0YXQKKworI2Vsc2UKK3R5cGVkZWYgY2hhciAqY2FkZHJfdDsKKworI2RlZmluZSBhY2Nlc3MJICAgX2FjY2VzcworI2RlZmluZSBhbGxvY2EJICAgX2FsbG9jYQorI2RlZmluZSBjaGRpcglfY2hkaXIKKyNkZWZpbmUgY2htb2QJICAgX2NobW9kCisjZGVmaW5lIGNsb3NlCSAgIF9jbG9zZQorI2RlZmluZSBjcmVhdAkgICBfY3JlYXQKKyNkZWZpbmUgZHVwCSAgIF9kdXAKKyNkZWZpbmUgZHVwMgkgICBfZHVwMgorI2RlZmluZSBlbnZpcm9uICAgICBfZW52aXJvbgorI2RlZmluZSBleGVjbAkgX2V4ZWNsCisjZGVmaW5lIGV4ZWNsZQkgX2V4ZWNsZQorI2RlZmluZSBleGVjbHAJIF9leGVjbHAKKyNkZWZpbmUgZXhlY2xwZSAgX2V4ZWNscGUKKyNkZWZpbmUgZXhlY3YJIF9leGVjdgorI2RlZmluZSBleGVjdmUJIF9leGVjdmUKKyNkZWZpbmUgZXhlY3ZwCSBfZXhlY3ZwCisjZGVmaW5lIGV4ZWN2cGUgIF9leGVjdnBlCisjZGVmaW5lIGZkb3BlbgkgIF9mZG9wZW4KKyNkZWZpbmUgZmlsZW5vCSAgX2ZpbGVubworI2RlZmluZSBmc3RhdAkgX2ZzdGF0CisjZGVmaW5lIGdldGN3ZAlfZ2V0Y3dkCisjZGVmaW5lIGdldHBpZAkgX2dldHBpZAorI2RlZmluZSBoeXBvdAkJX2h5cG90CisjZGVmaW5lIGlzYXNjaWkgX19pc2FzY2lpCisjZGVmaW5lIGlzYXR0eQkgICBfaXNhdHR5CisjZGVmaW5lIGxzZWVrCSAgIF9sc2VlaworI2RlZmluZSBta2RpcglfbWtkaXIKKyNkZWZpbmUgbWt0ZW1wCSAgIF9ta3RlbXAKKyNkZWZpbmUgb3BlbgkgICBfb3BlbgorI2RlZmluZSBwdXRlbnYJICAgIF9wdXRlbnYKKyNkZWZpbmUgcmVhZAkgICBfcmVhZAorI2RlZmluZSBybWRpcglfcm1kaXIKKyNkZWZpbmUgc2xlZXAoeCkgX3NsZWVwKCh4KSAqIDEwMDApCisjZGVmaW5lIHN0YXQJIF9zdGF0CisjZGVmaW5lIHN5c19lcnJsaXN0IF9zeXNfZXJybGlzdAorI2RlZmluZSBzeXNfbmVyciAgICBfc3lzX25lcnIKKyNkZWZpbmUgdW1hc2sJICAgX3VtYXNrCisjZGVmaW5lIHVubGluawkgICBfdW5saW5rCisjZGVmaW5lIHdyaXRlCSAgIF93cml0ZQorI2RlZmluZSByYW5kb20gICByYW5kCisjZGVmaW5lIHNyYW5kb20gIHNyYW5kCisKKyNkZWZpbmUgT19SRE9OTFkgICAgX09fUkRPTkxZCisjZGVmaW5lIE9fV1JPTkxZICAgIF9PX1dST05MWQorI2RlZmluZSBPX1JEV1IJICAgIF9PX1JEV1IKKyNkZWZpbmUgT19BUFBFTkQgICAgX09fQVBQRU5ECisjZGVmaW5lIE9fQ1JFQVQgICAgIF9PX0NSRUFUCisjZGVmaW5lIE9fVFJVTkMgICAgIF9PX1RSVU5DCisjZGVmaW5lIE9fRVhDTAkgICAgX09fRVhDTAorI2RlZmluZSBPX1RFWFQJICAgIF9PX1RFWFQKKyNkZWZpbmUgT19CSU5BUlkgICAgX09fQklOQVJZCisjZGVmaW5lIE9fUkFXCSAgICBfT19CSU5BUlkKKworI2RlZmluZSBTX0lGTVQJIF9TX0lGTVQKKyNkZWZpbmUgU19JRkRJUiAgX1NfSUZESVIKKyNkZWZpbmUgU19JRkNIUiAgX1NfSUZDSFIKKyNkZWZpbmUgU19JRlJFRyAgX1NfSUZSRUcKKyNkZWZpbmUgU19JUkVBRCAgX1NfSVJFQUQKKyNkZWZpbmUgU19JV1JJVEUgX1NfSVdSSVRFCisjZGVmaW5lIFNfSUVYRUMgIF9TX0lFWEVDCisKKyNkZWZpbmUJRl9PSwkwCisjZGVmaW5lCVhfT0sJMQorI2RlZmluZQlXX09LCTIKKyNkZWZpbmUJUl9PSwk0CisjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvWHdpbmRvd3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3aW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiOTg0MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3aW5kb3dzLmgKQEAgLTAsMCArMSw4MCBAQAorLyogJFhvcmckICovCisvKgorCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTC0KK0lUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UCitTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUwtCitJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tCitUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgaGFzIGZvciBzb2xlIHB1cnBvc2UgdG8gYWxsb3cgdG8gaW5jbHVkZSB3aW5kb3dzLmgKKyAqIHdpdGhvdXQgZ2V0dGluZyBhbnkgbmFtZSBjb25mbGljdHMgd2l0aCBvdXIgY29kZS4KKyAqIENvbmZsaWN0cyBjb21lIGZyb20gdGhlIGZhY3QgdGhhdCBpbmNsdWRpbmcgd2luZG93cy5oIGFjdHVhbGx5IHB1bGxzCisgKiBpbiB0aGUgd2hvbGUgV2luZG93cyBBUEkuLi4KKyAqLworCisjdW5kZWYgX1hGcmVlODZTZXJ2ZXIKKyNpZmRlZiBYRnJlZTg2U2VydmVyIAorI2RlZmluZSBfWEZyZWU4NlNlcnZlcgorI3VuZGVmIFhGcmVlODZTZXJ2ZXIKKyNlbmRpZgorCisjZGVmaW5lIEJPT0wgd0JPT0wKKyNkZWZpbmUgSU5UMzIgd0lOVDMyCisjdW5kZWYgU3RhdHVzCisjZGVmaW5lIFN0YXR1cyB3U3RhdHVzCisjZGVmaW5lIEFUT00gd0FUT00KKyNkZWZpbmUgQllURSB3QllURQorI2RlZmluZSBGcmVlUmVzb3VyY2Ugd0ZyZWVSZXNvdXJjZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBTdGF0dXMKKyNkZWZpbmUgU3RhdHVzIGludAorI3VuZGVmIEJZVEUKKyN1bmRlZiBCT09MCisjdW5kZWYgSU5UMzIKKyN1bmRlZiBBVE9NCisjdW5kZWYgRnJlZVJlc291cmNlCisjdW5kZWYgQ3JlYXRlV2luZG93QQorI3VuZGVmIG1pbgorI3VuZGVmIG1heAorCisjaWZkZWYgUkVTT1VSQ0VfSAorI3VuZGVmIFJUX0ZPTlQKKyN1bmRlZiBSVF9DVVJTT1IKKyNkZWZpbmUgUlRfRk9OVCAgICAgICAgICgoUkVTVFlQRSk0KQorI2RlZmluZSBSVF9DVVJTT1IgICAgICAgKChSRVNUWVBFKTUpCisjZW5kaWYKKworI2RlZmluZSBzbGVlcCh4KSBTbGVlcCgxMDAwKngpCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoUEFUSF9NQVgpIHx8IFBBVEhfTUFYIDwgMTAyNCkKKyN1bmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCAxMDI0CisjZW5kaWYKKworI2lmZGVmIF9YRnJlZTg2U2VydmVyCisjZGVmaW5lIFhGcmVlODZTZXJ2ZXIKKyN1bmRlZiBfWEZyZWU4NlNlcnZlcgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL1h3aW5zb2NrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yd2luc29jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzhjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9Yd2luc29jay5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qICRYb3JnOiBYd2luc29jay5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjMgeG9yZ2N2cyBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUwtCitJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVAorU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMLQorSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKK0lOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbQorVGhlIE9wZW4gR3JvdXAuCisKKyovCisKKy8qCisgKiBUaGlzIGhlYWRlciBmaWxlIGhhcyBmb3Igc29sZSBwdXJwb3NlIHRvIGFsbG93IHRvIGluY2x1ZGUgd2luc29jay5oCisgKiB3aXRob3V0IGdldHRpbmcgYW55IG5hbWUgY29uZmxpY3RzIHdpdGggb3VyIGNvZGUuCisgKiBDb25mbGljdHMgY29tZSBmcm9tIHRoZSBmYWN0IHRoYXQgaW5jbHVkaW5nIHdpbnNvY2suaCBhY3R1YWxseSBwdWxscworICogaW4gdGhlIHdob2xlIFdpbmRvd3MgQVBJLi4uCisgKi8KKworI3VuZGVmIF9YRnJlZTg2U2VydmVyCisjaWZkZWYgWEZyZWU4NlNlcnZlciAKKyNkZWZpbmUgX1hGcmVlODZTZXJ2ZXIKKyN1bmRlZiBYRnJlZTg2U2VydmVyCisjZW5kaWYKKworI2RlZmluZSBCT09MIHdCT09MCisjZGVmaW5lIElOVDMyIHdJTlQzMgorI3VuZGVmIFN0YXR1cworI2RlZmluZSBTdGF0dXMgd1N0YXR1cworI2RlZmluZSBBVE9NIHdBVE9NCisjZGVmaW5lIEJZVEUgd0JZVEUKKyNkZWZpbmUgRnJlZVJlc291cmNlIHdGcmVlUmVzb3VyY2UKKyNpbmNsdWRlIDx3aW5zb2NrLmg+CisjdW5kZWYgU3RhdHVzCisjZGVmaW5lIFN0YXR1cyBpbnQKKyN1bmRlZiBCWVRFCisjdW5kZWYgQk9PTAorI3VuZGVmIElOVDMyCisjdW5kZWYgQVRPTQorI3VuZGVmIEZyZWVSZXNvdXJjZQorI3VuZGVmIENyZWF0ZVdpbmRvd0EKKyN1bmRlZiBSVF9GT05UCisjdW5kZWYgUlRfQ1VSU09SCisKKyNpZmRlZiBfWEZyZWU4NlNlcnZlcgorI2RlZmluZSBYRnJlZTg2U2VydmVyCisjdW5kZWYgX1hGcmVlODZTZXJ2ZXIKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9hcF9rZXlzeW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2FwX2tleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTE5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9hcF9rZXlzeW0uaApAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk4NyBieSBBcG9sbG8gQ29tcHV0ZXIgSW5jLiwgQ2hlbG1zZm9yZCwgTWFzc2FjaHVzZXR0cy4KK0NvcHlyaWdodCAxOTg5IGJ5IEhld2xldHQtUGFja2FyZCBDb21wYW55LgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBkdXBsaWNhdGUsIGNoYW5nZSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKK2l0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgZ3JhbnRlZCwgcHJvdmlkZWQKK3RoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIHN1Y2ggY29weSBhbmQgdGhhdCB0aGlzCitjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUKK25hbWVzIG9mIEFwb2xsbyBDb21wdXRlciBJbmMuLCB0aGUgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIG9yIHRoZSBYCitDb25zb3J0aXVtIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCitkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIRVdMRVRULVBBQ0tBUkQgTUFLRVMgTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgV0lUSCBSRUdBUkQKK1RPIFRISVMgU09GV0FSRSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKK1BVUlBPU0UuICBIZXdsZXR0LVBhY2thcmQgc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgZXJyb3JzIAorY29udGFpbmVkIGhlcmVpbiBvciBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIG9yIAorY29uc2VxdWVudGlhbCBkYW1hZ2VzIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgZnVybmlzaGluZywgCitwZXJmb3JtYW5jZSwgb3IgdXNlIG9mIHRoaXMgbWF0ZXJpYWwuCisKK1RoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuCitUZWxlcGhvbmUgYW5kIFRlbGVncmFwaCBDb21wYW55IG9yIG9mIHRoZSBSZWdlbnRzIG9mIHRoZQorVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGFwWEtfTGluZURlbCAgICAgICAgICAgIDB4MTAwMEZGMDAKKyNkZWZpbmUgYXBYS19DaGFyRGVsICAgICAgICAgICAgMHgxMDAwRkYwMQorI2RlZmluZSBhcFhLX0NvcHkgICAgICAgICAgICAgICAweDEwMDBGRjAyCisjZGVmaW5lIGFwWEtfQ3V0ICAgICAgICAgICAgICAgIDB4MTAwMEZGMDMKKyNkZWZpbmUgYXBYS19QYXN0ZSAgICAgICAgICAgICAgMHgxMDAwRkYwNAorI2RlZmluZSBhcFhLX01vdmUgICAgICAgICAgICAgICAweDEwMDBGRjA1CisjZGVmaW5lIGFwWEtfR3JvdyAgICAgICAgICAgICAgIDB4MTAwMEZGMDYKKyNkZWZpbmUgYXBYS19DbWQgICAgICAgICAgICAgICAgMHgxMDAwRkYwNworI2RlZmluZSBhcFhLX1NoZWxsICAgICAgICAgICAgICAweDEwMDBGRjA4CisjZGVmaW5lIGFwWEtfTGVmdEJhciAgICAgICAgICAgIDB4MTAwMEZGMDkKKyNkZWZpbmUgYXBYS19SaWdodEJhciAgICAgICAgICAgMHgxMDAwRkYwQQorI2RlZmluZSBhcFhLX0xlZnRCb3ggICAgICAgICAgICAweDEwMDBGRjBCCisjZGVmaW5lIGFwWEtfUmlnaHRCb3ggICAgICAgICAgIDB4MTAwMEZGMEMKKyNkZWZpbmUgYXBYS19VcEJveCAgICAgICAgICAgICAgMHgxMDAwRkYwRAorI2RlZmluZSBhcFhLX0Rvd25Cb3ggICAgICAgICAgICAweDEwMDBGRjBFCisjZGVmaW5lIGFwWEtfUG9wICAgICAgICAgICAgICAgIDB4MTAwMEZGMEYKKyNkZWZpbmUgYXBYS19SZWFkICAgICAgICAgICAgICAgMHgxMDAwRkYxMAorI2RlZmluZSBhcFhLX0VkaXQgICAgICAgICAgICAgICAweDEwMDBGRjExCisjZGVmaW5lIGFwWEtfU2F2ZSAgICAgICAgICAgICAgIDB4MTAwMEZGMTIKKyNkZWZpbmUgYXBYS19FeGl0ICAgICAgICAgICAgICAgMHgxMDAwRkYxMworI2RlZmluZSBhcFhLX1JlcGVhdCAgICAgICAgICAgICAweDEwMDBGRjE0CisKKyNkZWZpbmUgYXBYS19LUF9wYXJlbmxlZnQgICAgICAgMHgxMDAwRkZBOAorI2RlZmluZSBhcFhLX0tQX3BhcmVucmlnaHQgICAgICAweDEwMDBGRkE5CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9jdXJzb3Jmb250LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9jdXJzb3Jmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyMDRmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2N1cnNvcmZvbnQuaApAQCAtMCwwICsxLDEwNyBAQAorLyogJFhvcmc6IGN1cnNvcmZvbnQuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjM5IHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTg3LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworI2RlZmluZSBYQ19udW1fZ2x5cGhzIDE1NAorI2RlZmluZSBYQ19YX2N1cnNvciAwCisjZGVmaW5lIFhDX2Fycm93IDIKKyNkZWZpbmUgWENfYmFzZWRfYXJyb3dfZG93biA0CisjZGVmaW5lIFhDX2Jhc2VkX2Fycm93X3VwIDYKKyNkZWZpbmUgWENfYm9hdCA4CisjZGVmaW5lIFhDX2JvZ29zaXR5IDEwCisjZGVmaW5lIFhDX2JvdHRvbV9sZWZ0X2Nvcm5lciAxMgorI2RlZmluZSBYQ19ib3R0b21fcmlnaHRfY29ybmVyIDE0CisjZGVmaW5lIFhDX2JvdHRvbV9zaWRlIDE2CisjZGVmaW5lIFhDX2JvdHRvbV90ZWUgMTgKKyNkZWZpbmUgWENfYm94X3NwaXJhbCAyMAorI2RlZmluZSBYQ19jZW50ZXJfcHRyIDIyCisjZGVmaW5lIFhDX2NpcmNsZSAyNAorI2RlZmluZSBYQ19jbG9jayAyNgorI2RlZmluZSBYQ19jb2ZmZWVfbXVnIDI4CisjZGVmaW5lIFhDX2Nyb3NzIDMwCisjZGVmaW5lIFhDX2Nyb3NzX3JldmVyc2UgMzIKKyNkZWZpbmUgWENfY3Jvc3NoYWlyIDM0CisjZGVmaW5lIFhDX2RpYW1vbmRfY3Jvc3MgMzYKKyNkZWZpbmUgWENfZG90IDM4CisjZGVmaW5lIFhDX2RvdGJveCA0MAorI2RlZmluZSBYQ19kb3VibGVfYXJyb3cgNDIKKyNkZWZpbmUgWENfZHJhZnRfbGFyZ2UgNDQKKyNkZWZpbmUgWENfZHJhZnRfc21hbGwgNDYKKyNkZWZpbmUgWENfZHJhcGVkX2JveCA0OAorI2RlZmluZSBYQ19leGNoYW5nZSA1MAorI2RlZmluZSBYQ19mbGV1ciA1MgorI2RlZmluZSBYQ19nb2JibGVyIDU0CisjZGVmaW5lIFhDX2d1bWJ5IDU2CisjZGVmaW5lIFhDX2hhbmQxIDU4CisjZGVmaW5lIFhDX2hhbmQyIDYwCisjZGVmaW5lIFhDX2hlYXJ0IDYyCisjZGVmaW5lIFhDX2ljb24gNjQKKyNkZWZpbmUgWENfaXJvbl9jcm9zcyA2NgorI2RlZmluZSBYQ19sZWZ0X3B0ciA2OAorI2RlZmluZSBYQ19sZWZ0X3NpZGUgNzAKKyNkZWZpbmUgWENfbGVmdF90ZWUgNzIKKyNkZWZpbmUgWENfbGVmdGJ1dHRvbiA3NAorI2RlZmluZSBYQ19sbF9hbmdsZSA3NgorI2RlZmluZSBYQ19scl9hbmdsZSA3OAorI2RlZmluZSBYQ19tYW4gODAKKyNkZWZpbmUgWENfbWlkZGxlYnV0dG9uIDgyCisjZGVmaW5lIFhDX21vdXNlIDg0CisjZGVmaW5lIFhDX3BlbmNpbCA4NgorI2RlZmluZSBYQ19waXJhdGUgODgKKyNkZWZpbmUgWENfcGx1cyA5MAorI2RlZmluZSBYQ19xdWVzdGlvbl9hcnJvdyA5MgorI2RlZmluZSBYQ19yaWdodF9wdHIgOTQKKyNkZWZpbmUgWENfcmlnaHRfc2lkZSA5NgorI2RlZmluZSBYQ19yaWdodF90ZWUgOTgKKyNkZWZpbmUgWENfcmlnaHRidXR0b24gMTAwCisjZGVmaW5lIFhDX3J0bF9sb2dvIDEwMgorI2RlZmluZSBYQ19zYWlsYm9hdCAxMDQKKyNkZWZpbmUgWENfc2JfZG93bl9hcnJvdyAxMDYKKyNkZWZpbmUgWENfc2JfaF9kb3VibGVfYXJyb3cgMTA4CisjZGVmaW5lIFhDX3NiX2xlZnRfYXJyb3cgMTEwCisjZGVmaW5lIFhDX3NiX3JpZ2h0X2Fycm93IDExMgorI2RlZmluZSBYQ19zYl91cF9hcnJvdyAxMTQKKyNkZWZpbmUgWENfc2Jfdl9kb3VibGVfYXJyb3cgMTE2CisjZGVmaW5lIFhDX3NodXR0bGUgMTE4CisjZGVmaW5lIFhDX3NpemluZyAxMjAKKyNkZWZpbmUgWENfc3BpZGVyIDEyMgorI2RlZmluZSBYQ19zcHJheWNhbiAxMjQKKyNkZWZpbmUgWENfc3RhciAxMjYKKyNkZWZpbmUgWENfdGFyZ2V0IDEyOAorI2RlZmluZSBYQ190Y3Jvc3MgMTMwCisjZGVmaW5lIFhDX3RvcF9sZWZ0X2Fycm93IDEzMgorI2RlZmluZSBYQ190b3BfbGVmdF9jb3JuZXIgMTM0CisjZGVmaW5lIFhDX3RvcF9yaWdodF9jb3JuZXIgMTM2CisjZGVmaW5lIFhDX3RvcF9zaWRlIDEzOAorI2RlZmluZSBYQ190b3BfdGVlIDE0MAorI2RlZmluZSBYQ190cmVrIDE0MgorI2RlZmluZSBYQ191bF9hbmdsZSAxNDQKKyNkZWZpbmUgWENfdW1icmVsbGEgMTQ2CisjZGVmaW5lIFhDX3VyX2FuZ2xlIDE0OAorI2RlZmluZSBYQ193YXRjaCAxNTAKKyNkZWZpbmUgWENfeHRlcm0gMTUyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL01JVE1pc2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvTUlUTWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTcwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL01JVE1pc2MuaApAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkFORE9NIENSVUZUISBUSElTIEhBUyBOTyBPRkZJQ0lBTCBYIENPTlNPUlRJVU0gT1IgWCBQUk9KRUNUIFRFQU0gQkxFU1NJTkcgKi8KKworLyogJFhvcmc6IE1JVE1pc2MuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIzIHhvcmdjdnMgRXhwICQgKi8KKworI2lmbmRlZiBfWE1JVE1JU0NfSF8KKyNkZWZpbmUgX1hNSVRNSVNDX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCisjZGVmaW5lIFhfTUlUU2V0QnVnTW9kZQkJCTAKKyNkZWZpbmUgWF9NSVRHZXRCdWdNb2RlCQkJMQorCisjZGVmaW5lIE1JVE1pc2NOdW1iZXJFdmVudHMJCTAKKworI2RlZmluZSBNSVRNaXNjTnVtYmVyRXJyb3JzCQkwCisKKyNpZm5kZWYgX01JVE1JU0NfU0VSVkVSXworCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWE1JVE1pc2NRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIGV2ZW50X2Jhc2VwICovLAorICAgIGludCoJCS8qIGVycm9yX2Jhc2VwICovCispOworCitTdGF0dXMgWE1JVE1pc2NTZXRCdWdNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQm9vbAkJLyogb25PZmYgKi8KKyk7CisKK0Jvb2wgWE1JVE1pc2NHZXRCdWdNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEVWSS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YRVZJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMzdmZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEVWSS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qICRYb3JnOiBYRVZJLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NCBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTcgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eQorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2JCAqLworCisjaWZuZGVmIF9YRVZJX0hfCisjZGVmaW5lIF9YRVZJX0hfCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKyNkZWZpbmUgWF9FVklRdWVyeVZlcnNpb24JCTAKKyNkZWZpbmUgWF9FVklHZXRWaXN1YWxJbmZvCQkxCisjZGVmaW5lIFhFVklfVFJBTlNQQVJFTkNZX05PTkUJCTAKKyNkZWZpbmUgWEVWSV9UUkFOU1BBUkVOQ1lfUElYRUwJCTEKKyNkZWZpbmUgWEVWSV9UUkFOU1BBUkVOQ1lfTUFTSwkJMgorI2lmbmRlZiBfWEVWSV9TRVJWRVJfCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQJCWNvcmVfdmlzdWFsX2lkOworICAgIGludAkJCXNjcmVlbjsKKyAgICBpbnQJCQlsZXZlbDsKKyAgICB1bnNpZ25lZCBpbnQJdHJhbnNwYXJlbmN5X3R5cGU7CisgICAgdW5zaWduZWQgaW50CXRyYW5zcGFyZW5jeV92YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQJbWluX2h3X2NvbG9ybWFwczsKKyAgICB1bnNpZ25lZCBpbnQJbWF4X2h3X2NvbG9ybWFwczsKKyAgICB1bnNpZ25lZCBpbnQJbnVtX2NvbG9ybWFwX2NvbmZsaWN0czsKKyAgICBWaXN1YWxJRCoJCWNvbG9ybWFwX2NvbmZsaWN0czsKK30gRXh0ZW5kZWRWaXN1YWxJbmZvOworX1hGVU5DUFJPVE9CRUdJTgorQm9vbCBYZXZpUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSogICAgICAgICAgICAvKiBkcHkgKi8KKyk7CitTdGF0dXMgWGV2aVF1ZXJ5VmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIG1ham9yVmVyc2lvbiAqLywKKyAgICBpbnQqCQkvKiBtaW5vclZlcnNpb24gKi8KKyk7CitTdGF0dXMgWGV2aUdldFZpc3VhbEluZm8oCisgICAgRGlzcGxheSoJCSAJLyogZHB5ICovLAorICAgIFZpc3VhbElEKgkJCS8qIHZpc3VhbF9xdWVyeSAqLywKKyAgICBpbnQJCQkJLyogblZpc3VhbF9xdWVyeSAqLywKKyAgICBFeHRlbmRlZFZpc3VhbEluZm8qKgkvKiBleHRlbmRlZFZpc3VhbEluZm9fcmV0dXJuICovLAorICAgIGludCoJCQkvKiBuSW5mb19yZXR1cm4gKi8KKyk7CitfWEZVTkNQUk9UT0VORAorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEVWSXN0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YRVZJc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4ZWY0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEVWSXN0ci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qICRYb3JnOiBYRVZJc3RyLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NCBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTcgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eQorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2JCAqLworCisjaWZuZGVmIF9FVklTVFJfSF8KKyNkZWZpbmUgX0VWSVNUUl9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEVWSS5oPgorCisjZGVmaW5lIFZpc3VhbElEIENBUkQzMgorI2RlZmluZSBFVklOQU1FICJFeHRlbmRlZC1WaXN1YWwtSW5mb3JtYXRpb24iCisjZGVmaW5lIFhFVklfTUFKT1JfVkVSU0lPTgkxCS8qIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFhFVklfTUlOT1JfVkVSU0lPTgkwCisKK3R5cGVkZWYgQ0FSRDMyIFZpc3VhbElEMzI7CisjZGVmaW5lIHN6X1Zpc3VhbElEMzIgNAorCit0eXBlZGVmIHN0cnVjdCBfeEV4dGVuZGVkVmlzdWFsSW5mbyB7CisgICAgVmlzdWFsSUQJY29yZV92aXN1YWxfaWQgQjMyOworICAgIElOVDgJc2NyZWVuOworICAgIElOVDgJbGV2ZWw7CisgICAgQ0FSRDgJdHJhbnNwYXJlbmN5X3R5cGU7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMzIJdHJhbnNwYXJlbmN5X3ZhbHVlIEIzMjsKKyAgICBDQVJEOAltaW5faHdfY29sb3JtYXBzOworICAgIENBUkQ4CW1heF9od19jb2xvcm1hcHM7CisgICAgQ0FSRDE2CW51bV9jb2xvcm1hcF9jb25mbGljdHMgQjE2OworfSB4RXh0ZW5kZWRWaXN1YWxJbmZvOworI2RlZmluZSBzel94RXh0ZW5kZWRWaXN1YWxJbmZvIDE2CisKK3R5cGVkZWYgc3RydWN0IF9YRVZJUXVlcnlWZXJzaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkJLyogYWx3YXlzIFhFVklSZXFDb2RlICovCisgICAgQ0FSRDgJeGV2aVJlcVR5cGU7CQkvKiBhbHdheXMgWF9FVklRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geEVWSVF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeEVWSVF1ZXJ5VmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4IAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNjsJLyogbWFqb3IgdmVyc2lvbiBvZiBFVkkgcHJvdG9jb2wgKi8KKyAgICBDQVJEMTYJbWlub3JWZXJzaW9uIEIxNjsJLyogbWlub3IgdmVyc2lvbiBvZiBFVkkgcHJvdG9jb2wgKi8KKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4RVZJUXVlcnlWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hFVklRdWVyeVZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfWEVWSUdldFZpc3VhbEluZm9SZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYRVZJUmVxQ29kZSAqLworICAgIENBUkQ4CXhldmlSZXFUeXBlOwkvKiBhbHdheXMgWF9FVklHZXRWaXN1YWxJbmZvICovCisgICAgQ0FSRDE2ICAgICAgbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgCW5fdmlzdWFsIEIzMjsKK30geEVWSUdldFZpc3VhbEluZm9SZXE7CisjZGVmaW5lIHN6X3hFVklHZXRWaXN1YWxJbmZvUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX1hFVklHZXRWaXN1YWxJbmZvUmVwbHkgeworICAgIEJZVEUJdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJbl9pbmZvIEIzMjsKKyAgICBDQVJEMzIJbl9jb25mbGljdHMgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geEVWSUdldFZpc3VhbEluZm9SZXBseTsKKyNkZWZpbmUgc3pfeEVWSUdldFZpc3VhbEluZm9SZXBseQkzMgorCisjdW5kZWYgVmlzdWFsSUQKKworI2VuZGlmIC8qIF9FVklTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTUyMjkyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YSS5oCkBAIC0wLDAgKzEsMjg3IEBACisvKiAkWG9yZzogWEkuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIzIHhvcmdjdnMgRXhwICQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworQ29weXJpZ2h0IDE5ODkgYnkgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnksIFBhbG8gQWx0bywgQ2FsaWZvcm5pYS4KKworCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBIZXdsZXR0LVBhY2thcmQgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworSEVXTEVUVC1QQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKK0FMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTAorSEVXTEVUVC1QQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YSS5oLHYgMS40IDIwMDEvMDEvMTcgMTc6NTM6MTYgZGF3ZXMgRXhwICQgKi8KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgc2VydmVyLCBsaWJyYXJ5IGFuZCBjbGllbnQgKi8KKworI2lmbmRlZiBfWElfSF8KKworI2RlZmluZSBfWElfSF8KKworI2RlZmluZSBzel94R2V0RXh0ZW5zaW9uVmVyc2lvblJlcQkJOAorI2RlZmluZSBzel94R2V0RXh0ZW5zaW9uVmVyc2lvblJlcGx5CQkzMgorI2RlZmluZSBzel94TGlzdElucHV0RGV2aWNlc1JlcQkJCTQKKyNkZWZpbmUgc3pfeExpc3RJbnB1dERldmljZXNSZXBseQkJMzIKKyNkZWZpbmUgc3pfeE9wZW5EZXZpY2VSZXEJCQk4CisjZGVmaW5lIHN6X3hPcGVuRGV2aWNlUmVwbHkJCQkzMgorI2RlZmluZSBzel94Q2xvc2VEZXZpY2VSZXEJCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VNb2RlUmVxCQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlTW9kZVJlcGx5CQkJMzIKKyNkZWZpbmUgc3pfeFNlbGVjdEV4dGVuc2lvbkV2ZW50UmVxCQkxMgorI2RlZmluZSBzel94R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXEJOAorI2RlZmluZSBzel94R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXBseQkzMgorI2RlZmluZSBzel94Q2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3RSZXEJMTIKKyNkZWZpbmUgc3pfeEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0UmVxCTgKKyNkZWZpbmUgc3pfeEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0UmVwbHkJMzIKKyNkZWZpbmUgc3pfeEdldERldmljZU1vdGlvbkV2ZW50c1JlcQkJMTYKKyNkZWZpbmUgc3pfeEdldERldmljZU1vdGlvbkV2ZW50c1JlcGx5CQkzMgorI2RlZmluZSBzel94Q2hhbmdlS2V5Ym9hcmREZXZpY2VSZXEJCTgKKyNkZWZpbmUgc3pfeENoYW5nZUtleWJvYXJkRGV2aWNlUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hDaGFuZ2VQb2ludGVyRGV2aWNlUmVxCQk4CisjZGVmaW5lIHN6X3hDaGFuZ2VQb2ludGVyRGV2aWNlUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hHcmFiRGV2aWNlUmVxCQkJMjAKKyNkZWZpbmUgc3pfeEdyYWJEZXZpY2VSZXBseQkJCTMyCisjZGVmaW5lIHN6X3hVbmdyYWJEZXZpY2VSZXEJCQkxMgorI2RlZmluZSBzel94R3JhYkRldmljZUtleVJlcQkJCTIwCisjZGVmaW5lIHN6X3hHcmFiRGV2aWNlS2V5UmVwbHkJCQkzMgorI2RlZmluZSBzel94VW5ncmFiRGV2aWNlS2V5UmVxCQkJMTYKKyNkZWZpbmUgc3pfeEdyYWJEZXZpY2VCdXR0b25SZXEJCQkyMAorI2RlZmluZSBzel94R3JhYkRldmljZUJ1dHRvblJlcGx5CQkzMgorI2RlZmluZSBzel94VW5ncmFiRGV2aWNlQnV0dG9uUmVxCQkxNgorI2RlZmluZSBzel94QWxsb3dEZXZpY2VFdmVudHNSZXEJCTEyCisjZGVmaW5lIHN6X3hHZXREZXZpY2VGb2N1c1JlcQkJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUZvY3VzUmVwbHkJCQkzMgorI2RlZmluZSBzel94U2V0RGV2aWNlRm9jdXNSZXEJCQkxNgorI2RlZmluZSBzel94R2V0RmVlZGJhY2tDb250cm9sUmVxCQk4CisjZGVmaW5lIHN6X3hHZXRGZWVkYmFja0NvbnRyb2xSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZUZlZWRiYWNrQ29udHJvbFJlcQkJMTIKKyNkZWZpbmUgc3pfeEdldERldmljZUtleU1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUtleU1hcHBpbmdSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZUtleU1hcHBpbmdSZXEJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVxCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VNb2RpZmllck1hcHBpbmdSZXBseQkzMgorI2RlZmluZSBzel94R2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94R2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcGx5CQkzMgorI2RlZmluZSBzel94U2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcQkJOAorI2RlZmluZSBzel94U2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcGx5CQkzMgorI2RlZmluZSBzel94UXVlcnlEZXZpY2VTdGF0ZVJlcQkJCTgKKyNkZWZpbmUgc3pfeFF1ZXJ5RGV2aWNlU3RhdGVSZXBseQkJMzIKKyNkZWZpbmUgc3pfeFNlbmRFeHRlbnNpb25FdmVudFJlcQkJMTYKKyNkZWZpbmUgc3pfeERldmljZUJlbGxSZXEJCQk4CisjZGVmaW5lIHN6X3hTZXREZXZpY2VWYWx1YXRvcnNSZXEJCTgKKyNkZWZpbmUgc3pfeFNldERldmljZVZhbHVhdG9yc1JlcGx5CQkzMgorI2RlZmluZSBzel94R2V0RGV2aWNlQ29udHJvbFJlcQkJCTgKKyNkZWZpbmUgc3pfeEdldERldmljZUNvbnRyb2xSZXBseQkJMzIKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZUNvbnRyb2xSZXEJCTgKKyNkZWZpbmUgc3pfeENoYW5nZURldmljZUNvbnRyb2xSZXBseQkJMzIKKworI2RlZmluZSBJTkFNRSAJCQkiWElucHV0RXh0ZW5zaW9uIgorCisjZGVmaW5lIFhJX0tFWUJPQVJECSJLRVlCT0FSRCIKKyNkZWZpbmUgWElfTU9VU0UJIk1PVVNFIgorI2RlZmluZSBYSV9UQUJMRVQJIlRBQkxFVCIKKyNkZWZpbmUgWElfVE9VQ0hTQ1JFRU4JIlRPVUNIU0NSRUVOIgorI2RlZmluZSBYSV9UT1VDSFBBRAkiVE9VQ0hQQUQiCisjZGVmaW5lIFhJX0JBUkNPREUJIkJBUkNPREUiCisjZGVmaW5lIFhJX0JVVFRPTkJPWAkiQlVUVE9OQk9YIgorI2RlZmluZSBYSV9LTk9CX0JPWAkiS05PQl9CT1giCisjZGVmaW5lIFhJX09ORV9LTk9CCSJPTkVfS05PQiIKKyNkZWZpbmUgWElfTklORV9LTk9CCSJOSU5FX0tOT0IiCisjZGVmaW5lIFhJX1RSQUNLQkFMTAkiVFJBQ0tCQUxMIgorI2RlZmluZSBYSV9RVUFEUkFUVVJFCSJRVUFEUkFUVVJFIgorI2RlZmluZSBYSV9JRF9NT0RVTEUJIklEX01PRFVMRSIKKyNkZWZpbmUgWElfU1BBQ0VCQUxMCSJTUEFDRUJBTEwiCisjZGVmaW5lIFhJX0RBVEFHTE9WRQkiREFUQUdMT1ZFIgorI2RlZmluZSBYSV9FWUVUUkFDS0VSCSJFWUVUUkFDS0VSIgorI2RlZmluZSBYSV9DVVJTT1JLRVlTCSJDVVJTT1JLRVlTIgorI2RlZmluZSBYSV9GT09UTU9VU0UJIkZPT1RNT1VTRSIKKworI2RlZmluZSBEb250X0NoZWNrCQkJMAorI2RlZmluZSBYSW5wdXRfSW5pdGlhbF9SZWxlYXNlCQkxCisjZGVmaW5lIFhJbnB1dF9BZGRfWERldmljZUJlbGwJCTIKKyNkZWZpbmUgWElucHV0X0FkZF9YU2V0RGV2aWNlVmFsdWF0b3JzCTMKKyNkZWZpbmUgWElucHV0X0FkZF9YQ2hhbmdlRGV2aWNlQ29udHJvbAk0CisjZGVmaW5lIFhJbnB1dF9BZGRfRGV2aWNlUHJlc2VuY2VOb3RpZnkJNQorCisjZGVmaW5lIFhJX0Fic2VudAkJMAorI2RlZmluZSBYSV9QcmVzZW50CQkxCisKKyNkZWZpbmUgWElfSW5pdGlhbF9SZWxlYXNlX01ham9yCQkxCisjZGVmaW5lIFhJX0luaXRpYWxfUmVsZWFzZV9NaW5vcgkJMAorCisjZGVmaW5lIFhJX0FkZF9YRGV2aWNlQmVsbF9NYWpvcgkJMQorI2RlZmluZSBYSV9BZGRfWERldmljZUJlbGxfTWlub3IJCTEKKworI2RlZmluZSBYSV9BZGRfWFNldERldmljZVZhbHVhdG9yc19NYWpvcgkxCisjZGVmaW5lIFhJX0FkZF9YU2V0RGV2aWNlVmFsdWF0b3JzX01pbm9yCTIKKworI2RlZmluZSBYSV9BZGRfWENoYW5nZURldmljZUNvbnRyb2xfTWFqb3IJMQorI2RlZmluZSBYSV9BZGRfWENoYW5nZURldmljZUNvbnRyb2xfTWlub3IJMworCisjZGVmaW5lIFhJX0FkZF9EZXZpY2VQcmVzZW5jZU5vdGlmeV9NYWpvcgkxCisjZGVmaW5lIFhJX0FkZF9EZXZpY2VQcmVzZW5jZU5vdGlmeV9NaW5vcgk0CisKKyNkZWZpbmUgREVWSUNFX1JFU09MVVRJT04JMQorI2RlZmluZSBERVZJQ0VfQUJTX0NBTElCICAgICAgICAyCisjZGVmaW5lIERFVklDRV9DT1JFICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVWSUNFX0VOQUJMRSAgICAgICAgICAgNAorI2RlZmluZSBERVZJQ0VfQUJTX0FSRUEgICAgICAgICA1CisKKyNkZWZpbmUgTm9TdWNoRXh0ZW5zaW9uCQkxCisKKyNkZWZpbmUgQ09VTlQJCQkwCisjZGVmaW5lIENSRUFURQkJCTEKKworI2RlZmluZSBOZXdQb2ludGVyCQkwCisjZGVmaW5lIE5ld0tleWJvYXJkCQkxCisKKyNkZWZpbmUgWFBPSU5URVIJCTAKKyNkZWZpbmUgWEtFWUJPQVJECQkxCisKKyNkZWZpbmUgVXNlWEtleWJvYXJkCQkweEZGCisKKyNkZWZpbmUgSXNYUG9pbnRlcgkJMAorI2RlZmluZSBJc1hLZXlib2FyZAkJMQorI2RlZmluZSBJc1hFeHRlbnNpb25EZXZpY2UJMgorI2RlZmluZSBJc1hFeHRlbnNpb25LZXlib2FyZCAgICAzCisjZGVmaW5lIElzWEV4dGVuc2lvblBvaW50ZXIgICAgIDQKKworI2RlZmluZSBBc3luY1RoaXNEZXZpY2UJCTAKKyNkZWZpbmUgU3luY1RoaXNEZXZpY2UJCTEKKyNkZWZpbmUgUmVwbGF5VGhpc0RldmljZQkyCisjZGVmaW5lIEFzeW5jT3RoZXJEZXZpY2VzCTMKKyNkZWZpbmUgQXN5bmNBbGwJCTQKKyNkZWZpbmUgU3luY0FsbAkJCTUKKworI2RlZmluZSBGb2xsb3dLZXlib2FyZCAJCTMKKyNpZm5kZWYgUmV2ZXJ0VG9Gb2xsb3dLZXlib2FyZAorI2RlZmluZSBSZXZlcnRUb0ZvbGxvd0tleWJvYXJkIAkzCisjZW5kaWYKKworI2RlZmluZSBEdkFjY2VsTnVtICAgICAgICAgICAgICAoMUwgPDwgMCkKKyNkZWZpbmUgRHZBY2NlbERlbm9tICAgICAgICAgICAgKDFMIDw8IDEpCisjZGVmaW5lIER2VGhyZXNob2xkICAgICAgICAgICAgICgxTCA8PCAyKQorCisjZGVmaW5lIER2S2V5Q2xpY2tQZXJjZW50CSgxTDw8MCkKKyNkZWZpbmUgRHZQZXJjZW50CQkoMUw8PDEpCisjZGVmaW5lIER2UGl0Y2gJCQkoMUw8PDIpCisjZGVmaW5lIER2RHVyYXRpb24JCSgxTDw8MykKKyNkZWZpbmUgRHZMZWQJCQkoMUw8PDQpCisjZGVmaW5lIER2TGVkTW9kZQkJKDFMPDw1KQorI2RlZmluZSBEdktleQkJCSgxTDw8NikKKyNkZWZpbmUgRHZBdXRvUmVwZWF0TW9kZQkoMUw8PDcpCisKKyNkZWZpbmUgRHZTdHJpbmcgICAgICAgICAgICAgICAgKDFMIDw8IDApCisKKyNkZWZpbmUgRHZJbnRlZ2VyICAgICAgICAgICAgICAgKDFMIDw8IDApCisKKyNkZWZpbmUgRGV2aWNlTW9kZSAgICAgICAgICAgICAgKDFMIDw8IDApCisjZGVmaW5lIFJlbGF0aXZlICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQWJzb2x1dGUgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFByb3hpbWl0eVN0YXRlICAgICAgICAgICgxTCA8PCAxKQorI2RlZmluZSBJblByb3hpbWl0eSAgICAgICAgICAgICAoMEwgPDwgMSkKKyNkZWZpbmUgT3V0T2ZQcm94aW1pdHkgICAgICAgICAgKDFMIDw8IDEpCisKKyNkZWZpbmUgQWRkVG9MaXN0ICAgICAgICAgICAgICAgMAorI2RlZmluZSBEZWxldGVGcm9tTGlzdCAgICAgICAgICAxCisKKyNkZWZpbmUgS2V5Q2xhc3MgIAkJMAorI2RlZmluZSBCdXR0b25DbGFzcyAgCQkxCisjZGVmaW5lIFZhbHVhdG9yQ2xhc3MgIAkJMgorI2RlZmluZSBGZWVkYmFja0NsYXNzICAJCTMKKyNkZWZpbmUgUHJveGltaXR5Q2xhc3MgIAk0CisjZGVmaW5lIEZvY3VzQ2xhc3MgIAkJNQorI2RlZmluZSBPdGhlckNsYXNzICAJCTYKKworI2RlZmluZSBLYmRGZWVkYmFja0NsYXNzICAJMAorI2RlZmluZSBQdHJGZWVkYmFja0NsYXNzICAJMQorI2RlZmluZSBTdHJpbmdGZWVkYmFja0NsYXNzICAJMgorI2RlZmluZSBJbnRlZ2VyRmVlZGJhY2tDbGFzcyAgCTMKKyNkZWZpbmUgTGVkRmVlZGJhY2tDbGFzcyAgCTQKKyNkZWZpbmUgQmVsbEZlZWRiYWNrQ2xhc3MgIAk1CisKKyNkZWZpbmUgX2RldmljZVBvaW50ZXJNb3Rpb25IaW50IDAKKyNkZWZpbmUgX2RldmljZUJ1dHRvbjFNb3Rpb24JIDEKKyNkZWZpbmUgX2RldmljZUJ1dHRvbjJNb3Rpb24JIDIKKyNkZWZpbmUgX2RldmljZUJ1dHRvbjNNb3Rpb24JIDMKKyNkZWZpbmUgX2RldmljZUJ1dHRvbjRNb3Rpb24JIDQKKyNkZWZpbmUgX2RldmljZUJ1dHRvbjVNb3Rpb24JIDUKKyNkZWZpbmUgX2RldmljZUJ1dHRvbk1vdGlvbgkgNgorI2RlZmluZSBfZGV2aWNlQnV0dG9uR3JhYgkgNworI2RlZmluZSBfZGV2aWNlT3duZXJHcmFiQnV0dG9uCSA4CisjZGVmaW5lIF9ub0V4dGVuc2lvbkV2ZW50CSA5CisKKyNkZWZpbmUgX2RldmljZVByZXNlbmNlCQkgMAorCisjZGVmaW5lIERldmljZUFkZGVkICAgICAgICAgICAgICAwCisjZGVmaW5lIERldmljZVJlbW92ZWQgICAgICAgICAgICAxCisjZGVmaW5lIERldmljZUVuYWJsZWQgICAgICAgICAgICAyCisjZGVmaW5lIERldmljZURpc2FibGVkICAgICAgICAgICAzCisjZGVmaW5lIERldmljZVVucmVjb3ZlcmFibGUgICAgICA0ICAKKworI2RlZmluZSBYSV9CYWREZXZpY2UJMAorI2RlZmluZSBYSV9CYWRFdmVudAkxCisjZGVmaW5lIFhJX0JhZE1vZGUJMgorI2RlZmluZSBYSV9EZXZpY2VCdXN5CTMKKyNkZWZpbmUgWElfQmFkQ2xhc3MJNAorCisvKiBNYWtlIFhFdmVudENsYXNzIGJlIGEgQ0FSRDMyIGZvciA2NCBiaXQgc2VydmVycy4gIERvbid0IGFmZmVjdCBjbGllbnQKKyAqIGRlZmluaXRpb24gb2YgWEV2ZW50Q2xhc3Mgc2luY2UgdGhhdCB3b3VsZCBiZSBhIGxpYnJhcnkgaW50ZXJmYWNlIGNoYW5nZS4KKyAqIFNlZSB0aGUgdG9wIG9mIFguaCBmb3IgbW9yZSBfWFNFUlZFUjY0IG1hZ2ljLgorICovCisjaWZkZWYgX1hTRVJWRVI2NAordHlwZWRlZglDQVJEMzIJCVhFdmVudENsYXNzOworI2Vsc2UKK3R5cGVkZWYJdW5zaWduZWQgbG9uZwlYRXZlbnRDbGFzczsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV4dGVuc2lvbiB2ZXJzaW9uIHN0cnVjdHVyZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBpbnQgICAJcHJlc2VudDsKKyAgICAgICAgc2hvcnQJbWFqb3JfdmVyc2lvbjsKKyAgICAgICAgc2hvcnQJbWlub3JfdmVyc2lvbjsKK30gWEV4dGVuc2lvblZlcnNpb247CisKKyNlbmRpZiAvKiBfWElfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElucHV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTg1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJbnB1dC5oCkBAIC0wLDAgKzEsMTIwMCBAQAorLyogJFhvcmc6IFhJbnB1dC5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjMgeG9yZ2N2cyBFeHAgJCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCitDb3B5cmlnaHQgMTk4OSBieSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhLgorCisJCQlBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIRVdMRVRULVBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitIRVdMRVRULVBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hJbnB1dC5oLHYgMS4zIDIwMDEvMTIvMTQgMTk6NTM6MjggZGF3ZXMgRXhwICQgKi8KKworLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgbGlicmFyeSBhbmQgY2xpZW50ICovCisKKyNpZm5kZWYgX1hJTlBVVF9IXworI2RlZmluZSBfWElOUFVUX0hfCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJLmg+CisKKyNkZWZpbmUgX2RldmljZUtleVByZXNzCQkwCisjZGVmaW5lIF9kZXZpY2VLZXlSZWxlYXNlCTEKKworI2RlZmluZSBfZGV2aWNlQnV0dG9uUHJlc3MJMAorI2RlZmluZSBfZGV2aWNlQnV0dG9uUmVsZWFzZQkxCisKKyNkZWZpbmUgX2RldmljZU1vdGlvbk5vdGlmeQkwCisKKyNkZWZpbmUgX2RldmljZUZvY3VzSW4JCTAKKyNkZWZpbmUgX2RldmljZUZvY3VzT3V0CQkxCisKKyNkZWZpbmUgX3Byb3hpbWl0eUluCQkwCisjZGVmaW5lIF9wcm94aW1pdHlPdXQJCTEKKworI2RlZmluZSBfZGV2aWNlU3RhdGVOb3RpZnkJMAorI2RlZmluZSBfZGV2aWNlTWFwcGluZ05vdGlmeQkxCisjZGVmaW5lIF9jaGFuZ2VEZXZpY2VOb3RpZnkJMgorCisjZGVmaW5lIEZpbmRUeXBlQW5kQ2xhc3MoZCx0eXBlLF9jbGFzcyxjbGFzc2lkLG9mZnNldCkgXAorICAgIHsgaW50IF9pOyBYSW5wdXRDbGFzc0luZm8gKl9pcDsgXAorICAgIHR5cGUgPSAwOyBfY2xhc3MgPSAwOyBcCisgICAgZm9yIChfaT0wLCBfaXA9ICgoWERldmljZSAqKSBkKS0+Y2xhc3NlczsgXAorCSBfaTwgKChYRGV2aWNlICopIGQpLT5udW1fY2xhc3NlczsgXAorCSBfaSsrLCBfaXArKykgXAorCWlmIChfaXAtPmlucHV0X2NsYXNzID09IGNsYXNzaWQpIFwKKwkgICAge3R5cGUgPSAgX2lwLT5ldmVudF90eXBlX2Jhc2UgKyBvZmZzZXQ7IFwKKwkgICAgIF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgdHlwZTt9fQorCisjZGVmaW5lIERldmljZUtleVByZXNzKGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgS2V5Q2xhc3MsIF9kZXZpY2VLZXlQcmVzcykKKworI2RlZmluZSBEZXZpY2VLZXlSZWxlYXNlKGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgS2V5Q2xhc3MsIF9kZXZpY2VLZXlSZWxlYXNlKQorCisjZGVmaW5lIERldmljZUJ1dHRvblByZXNzKGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgQnV0dG9uQ2xhc3MsIF9kZXZpY2VCdXR0b25QcmVzcykKKworI2RlZmluZSBEZXZpY2VCdXR0b25SZWxlYXNlKGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgQnV0dG9uQ2xhc3MsIF9kZXZpY2VCdXR0b25SZWxlYXNlKQorCisjZGVmaW5lIERldmljZU1vdGlvbk5vdGlmeShkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIFZhbHVhdG9yQ2xhc3MsIF9kZXZpY2VNb3Rpb25Ob3RpZnkpCisKKyNkZWZpbmUgRGV2aWNlRm9jdXNJbihkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIEZvY3VzQ2xhc3MsIF9kZXZpY2VGb2N1c0luKQorCisjZGVmaW5lIERldmljZUZvY3VzT3V0KGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgRm9jdXNDbGFzcywgX2RldmljZUZvY3VzT3V0KQorCisjZGVmaW5lIFByb3hpbWl0eUluKGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgUHJveGltaXR5Q2xhc3MsIF9wcm94aW1pdHlJbikKKworI2RlZmluZSBQcm94aW1pdHlPdXQoZCx0eXBlLF9jbGFzcykgXAorICAgIEZpbmRUeXBlQW5kQ2xhc3MoZCwgdHlwZSwgX2NsYXNzLCBQcm94aW1pdHlDbGFzcywgX3Byb3hpbWl0eU91dCkKKworI2RlZmluZSBEZXZpY2VTdGF0ZU5vdGlmeShkLHR5cGUsX2NsYXNzKSBcCisgICAgRmluZFR5cGVBbmRDbGFzcyhkLCB0eXBlLCBfY2xhc3MsIE90aGVyQ2xhc3MsIF9kZXZpY2VTdGF0ZU5vdGlmeSkKKworI2RlZmluZSBEZXZpY2VNYXBwaW5nTm90aWZ5KGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgT3RoZXJDbGFzcywgX2RldmljZU1hcHBpbmdOb3RpZnkpCisKKyNkZWZpbmUgQ2hhbmdlRGV2aWNlTm90aWZ5KGQsdHlwZSxfY2xhc3MpIFwKKyAgICBGaW5kVHlwZUFuZENsYXNzKGQsIHR5cGUsIF9jbGFzcywgT3RoZXJDbGFzcywgX2NoYW5nZURldmljZU5vdGlmeSkKKworI2RlZmluZSBEZXZpY2VQb2ludGVyTW90aW9uSGludChkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VQb2ludGVyTW90aW9uSGludDt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uMU1vdGlvbihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b24xTW90aW9uO30KKworI2RlZmluZSBEZXZpY2VCdXR0b24yTW90aW9uKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbjJNb3Rpb247fQorCisjZGVmaW5lIERldmljZUJ1dHRvbjNNb3Rpb24oZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlQnV0dG9uM01vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uNE1vdGlvbihkLHR5cGUsIF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfZGV2aWNlQnV0dG9uNE1vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uNU1vdGlvbihkLHR5cGUsX2NsYXNzKSBcCisgICAgeyBfY2xhc3MgPSAgKChYRGV2aWNlICopIGQpLT5kZXZpY2VfaWQgPDwgOCB8IF9kZXZpY2VCdXR0b241TW90aW9uO30KKworI2RlZmluZSBEZXZpY2VCdXR0b25Nb3Rpb24oZCx0eXBlLCBfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbk1vdGlvbjt9CisKKyNkZWZpbmUgRGV2aWNlT3duZXJHcmFiQnV0dG9uKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZU93bmVyR3JhYkJ1dHRvbjt9CisKKyNkZWZpbmUgRGV2aWNlQnV0dG9uUHJlc3NHcmFiKGQsdHlwZSxfY2xhc3MpIFwKKyAgICB7IF9jbGFzcyA9ICAoKFhEZXZpY2UgKikgZCktPmRldmljZV9pZCA8PCA4IHwgX2RldmljZUJ1dHRvbkdyYWI7fQorCisjZGVmaW5lIE5vRXh0ZW5zaW9uRXZlbnQoZCx0eXBlLF9jbGFzcykgXAorICAgIHsgX2NsYXNzID0gICgoWERldmljZSAqKSBkKS0+ZGV2aWNlX2lkIDw8IDggfCBfbm9FeHRlbnNpb25FdmVudDt9CisKKyNkZWZpbmUgRGV2aWNlUHJlc2VuY2UoZHB5LCB0eXBlLCBfY2xhc3MpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBleHRlcm4gaW50IF9YaUdldERldmljZVByZXNlbmNlTm90aWZ5RXZlbnQoRGlzcGxheSAqKTsgIFwKKyAgICAgICAgdHlwZSA9IF9YaUdldERldmljZVByZXNlbmNlTm90aWZ5RXZlbnQoZHB5KTsgICAgICAgICAgICBcCisgICAgICAgIF9jbGFzcyA9ICAoMHgxMDAwMCB8IF9kZXZpY2VQcmVzZW5jZSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBCYWREZXZpY2UoZHB5LGVycm9yKSBfeGliYWRkZXZpY2UoZHB5LCAmZXJyb3IpCisKKyNkZWZpbmUgQmFkQ2xhc3MoZHB5LGVycm9yKSBfeGliYWRjbGFzcyhkcHksICZlcnJvcikKKworI2RlZmluZSBCYWRFdmVudChkcHksZXJyb3IpIF94aWJhZGV2ZW50KGRweSwgJmVycm9yKQorCisjZGVmaW5lIEJhZE1vZGUoZHB5LGVycm9yKSBfeGliYWRtb2RlKGRweSwgJmVycm9yKQorCisjZGVmaW5lIERldmljZUJ1c3koZHB5LGVycm9yKSBfeGlkZXZpY2VidXN5KGRweSwgJmVycm9yKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlS2V5IGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCBieSBpbnB1dCBkZXZpY2VzIHRoYXQKKyAqIHN1cHBvcnQgaW5wdXQgY2xhc3MgS2V5cy4KKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgWCBwb2ludGVyIGlzIHJlcG9ydGVkIGluIHRoZSBjb29yZGluYXRlCisgKiBmaWVsZHMgb2YgdGhlIHgseSBhbmQgeF9yb290LHlfcm9vdCBmaWVsZHMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IAorICAgIHsKKyAgICBpbnQgICAgICAgICAgICB0eXBlOyAgICAgICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyAgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgKi8KKyAgICBCb29sICAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgZnJvbSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgIHdpbmRvdzsgICAgICAgLyogImV2ZW50IiB3aW5kb3cgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKyAgICBYSUQgICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBXaW5kb3cgICAgICAgICByb290OyAgICAgICAgIC8qIHJvb3Qgd2luZG93IGV2ZW50IG9jY3VyZWQgb24gKi8KKyAgICBXaW5kb3cgICAgICAgICBzdWJ3aW5kb3c7ICAgIC8qIGNoaWxkIHdpbmRvdyAqLworICAgIFRpbWUgICAgICAgICAgIHRpbWU7ICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgaW50ICAgICAgICAgICAgeCwgeTsgICAgICAgICAvKiB4LCB5IGNvb3JkaW5hdGVzIGluIGV2ZW50IHdpbmRvdyAqLworICAgIGludCAgICAgICAgICAgIHhfcm9vdDsgICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIGludCAgICAgICAgICAgIHlfcm9vdDsgICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIHVuc2lnbmVkIGludCAgIHN0YXRlOyAgICAgICAgLyoga2V5IG9yIGJ1dHRvbiBtYXNrICovCisgICAgdW5zaWduZWQgaW50ICAga2V5Y29kZTsgICAgICAvKiBkZXRhaWwgKi8KKyAgICBCb29sICAgICAgICAgICBzYW1lX3NjcmVlbjsgIC8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyICBheGVzX2NvdW50OworICAgIHVuc2lnbmVkIGNoYXIgIGZpcnN0X2F4aXM7CisgICAgaW50ICAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWERldmljZUtleUV2ZW50OworCit0eXBlZGVmIFhEZXZpY2VLZXlFdmVudCBYRGV2aWNlS2V5UHJlc3NlZEV2ZW50OwordHlwZWRlZiBYRGV2aWNlS2V5RXZlbnQgWERldmljZUtleVJlbGVhc2VkRXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlQnV0dG9uIGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCBieSBleHRlbnNpb24gZGV2aWNlcworICogdGhhdCBzdXBwb3J0IGlucHV0IGNsYXNzIEJ1dHRvbnMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7ICAgICAgIC8qICJldmVudCIgd2luZG93IHJlcG9ydGVkIHJlbGF0aXZlIHRvICovCisgICAgWElEICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBXaW5kb3cgICAgICAgIHJvb3Q7ICAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJlZCBvbiAqLworICAgIFdpbmRvdyAgICAgICAgc3Vid2luZG93OyAgICAvKiBjaGlsZCB3aW5kb3cgKi8KKyAgICBUaW1lICAgICAgICAgIHRpbWU7ICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgaW50ICAgICAgICAgICB4LCB5OyAgICAgICAgIC8qIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisgICAgaW50ICAgICAgICAgICB4X3Jvb3Q7ICAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICBpbnQgICAgICAgICAgIHlfcm9vdDsgICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIHVuc2lnbmVkIGludCAgc3RhdGU7ICAgICAgICAvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBpbnQgIGJ1dHRvbjsgICAgICAgLyogZGV0YWlsICovCisgICAgQm9vbCAgICAgICAgICBzYW1lX3NjcmVlbjsgIC8qIHNhbWUgc2NyZWVuIGZsYWcgKi8KKyAgICB1bnNpZ25lZCBpbnQgIGRldmljZV9zdGF0ZTsgLyogZGV2aWNlIGtleSBvciBidXR0b24gbWFzayAqLworICAgIHVuc2lnbmVkIGNoYXIgYXhlc19jb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyIGZpcnN0X2F4aXM7CisgICAgaW50ICAgICAgICAgICBheGlzX2RhdGFbNl07CisgICAgfSBYRGV2aWNlQnV0dG9uRXZlbnQ7CisKK3R5cGVkZWYgWERldmljZUJ1dHRvbkV2ZW50IFhEZXZpY2VCdXR0b25QcmVzc2VkRXZlbnQ7Cit0eXBlZGVmIFhEZXZpY2VCdXR0b25FdmVudCBYRGV2aWNlQnV0dG9uUmVsZWFzZWRFdmVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VNb3Rpb25Ob3RpZnkgZXZlbnQuICBUaGVzZSBldmVudHMgYXJlIHNlbnQgYnkgZXh0ZW5zaW9uIGRldmljZXMKKyAqIHRoYXQgc3VwcG9ydCBpbnB1dCBjbGFzcyBWYWx1YXRvcnMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IAorICAgIHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAvKiB0cnVlIGlmIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgICAvKiAiZXZlbnQiIHdpbmRvdyByZXBvcnRlZCByZWxhdGl2ZSB0byAqLworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgV2luZG93ICAgICAgICByb290OyAgICAgICAgLyogcm9vdCB3aW5kb3cgdGhhdCB0aGUgZXZlbnQgb2NjdXJlZCBvbiAqLworICAgIFdpbmRvdyAgICAgICAgc3Vid2luZG93OyAgIC8qIGNoaWxkIHdpbmRvdyAqLworICAgIFRpbWUgICAgICAgICAgdGltZTsgICAgICAgIC8qIG1pbGxpc2Vjb25kcyAqLworICAgIGludCAgICAgICAgICAgeCwgeTsgICAgICAgIC8qIHgsIHkgY29vcmRpbmF0ZXMgaW4gZXZlbnQgd2luZG93ICovCisgICAgaW50ICAgICAgICAgICB4X3Jvb3Q7ICAgICAgLyogY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gcm9vdCAqLworICAgIGludCAgICAgICAgICAgeV9yb290OyAgICAgIC8qIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHJvb3QgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHN0YXRlOyAgICAgICAvKiBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICBjaGFyICAgICAgICAgIGlzX2hpbnQ7ICAgICAvKiBkZXRhaWwgKi8KKyAgICBCb29sICAgICAgICAgIHNhbWVfc2NyZWVuOyAvKiBzYW1lIHNjcmVlbiBmbGFnICovCisgICAgdW5zaWduZWQgaW50ICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGF4ZXNfY291bnQ7CisgICAgdW5zaWduZWQgY2hhciBmaXJzdF9heGlzOworICAgIGludCAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWERldmljZU1vdGlvbkV2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUZvY3VzQ2hhbmdlIGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCB3aGVuIHRoZSBmb2N1cworICogb2YgYW4gZXh0ZW5zaW9uIGRldmljZSB0aGF0IGNhbiBiZSBmb2N1c2VkIGlzIGNoYW5nZWQuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IAorICAgIHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7ICAgICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAvKiB0cnVlIGlmIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgLyogImV2ZW50IiB3aW5kb3cgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gKi8KKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIGludCAgICAgICAgICAgbW9kZTsgICAgICAgLyogTm90aWZ5Tm9ybWFsLCBOb3RpZnlHcmFiLCBOb3RpZnlVbmdyYWIgKi8KKyAgICBpbnQgICAgICAgICAgIGRldGFpbDsKKwkvKgorCSAqIE5vdGlmeUFuY2VzdG9yLCBOb3RpZnlWaXJ0dWFsLCBOb3RpZnlJbmZlcmlvciwgCisJICogTm90aWZ5Tm9uTGluZWFyLE5vdGlmeU5vbkxpbmVhclZpcnR1YWwsIE5vdGlmeVBvaW50ZXIsCisJICogTm90aWZ5UG9pbnRlclJvb3QsIE5vdGlmeURldGFpbE5vbmUgCisJICovCisgICAgVGltZSAgICAgICAgICAgICAgICB0aW1lOworICAgIH0gWERldmljZUZvY3VzQ2hhbmdlRXZlbnQ7CisKK3R5cGVkZWYgWERldmljZUZvY3VzQ2hhbmdlRXZlbnQgWERldmljZUZvY3VzSW5FdmVudDsKK3R5cGVkZWYgWERldmljZUZvY3VzQ2hhbmdlRXZlbnQgWERldmljZUZvY3VzT3V0RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJveGltaXR5Tm90aWZ5IGV2ZW50cy4gIFRoZXNlIGV2ZW50cyBhcmUgc2VudCBieSB0aG9zZSBhYnNvbHV0ZQorICogcG9zaXRpb25pbmcgZGV2aWNlcyB0aGF0IGFyZSBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgcHJveGltaXR5IGluZm9ybWF0aW9uLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCAKKyAgICB7CisgICAgaW50ICAgICAgICAgICAgIHR5cGU7ICAgICAgLyogUHJveGltaXR5SW4gb3IgUHJveGltaXR5T3V0ICovICAgICAgICAKKyAgICB1bnNpZ25lZCBsb25nICAgc2VyaWFsOyAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICAgIHNlbmRfZXZlbnQ7IC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgICAqZGlzcGxheTsgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgICAgd2luZG93OyAgICAgIAorICAgIFhJRAkgICAgICAgICAgICBkZXZpY2VpZDsKKyAgICBXaW5kb3cgICAgICAgICAgcm9vdDsgICAgICAgICAgICAKKyAgICBXaW5kb3cgICAgICAgICAgc3Vid2luZG93OyAgICAgIAorICAgIFRpbWUgICAgICAgICAgICB0aW1lOyAgICAgICAgICAgIAorICAgIGludCAgICAgICAgICAgICB4LCB5OyAgICAgICAgICAgIAorICAgIGludCAgICAgICAgICAgICB4X3Jvb3QsIHlfcm9vdDsgIAorICAgIHVuc2lnbmVkIGludCAgICBzdGF0ZTsgICAgICAgICAgIAorICAgIEJvb2wgICAgICAgICAgICBzYW1lX3NjcmVlbjsgICAgIAorICAgIHVuc2lnbmVkIGludCAgICBkZXZpY2Vfc3RhdGU7IC8qIGRldmljZSBrZXkgb3IgYnV0dG9uIG1hc2sgKi8KKyAgICB1bnNpZ25lZCBjaGFyICAgYXhlc19jb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyICAgZmlyc3RfYXhpczsKKyAgICBpbnQgICAgICAgICAgICAgYXhpc19kYXRhWzZdOworICAgIH0gWFByb3hpbWl0eU5vdGlmeUV2ZW50OwordHlwZWRlZiBYUHJveGltaXR5Tm90aWZ5RXZlbnQgWFByb3hpbWl0eUluRXZlbnQ7Cit0eXBlZGVmIFhQcm94aW1pdHlOb3RpZnlFdmVudCBYUHJveGltaXR5T3V0RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlU3RhdGVOb3RpZnkgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgb24gRW50ZXJXaW5kb3cgYW5kIEZvY3VzSW4gCisgKiBmb3IgdGhvc2UgY2xpZW50cyB3aG8gaGF2ZSBzZWxlY3RlZCBEZXZpY2VTdGF0ZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIH0gWElucHV0Q2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsKKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIG51bV9jbGFzc2VzOworICAgIGNoYXIJICBkYXRhWzY0XTsKK30gWERldmljZVN0YXRlTm90aWZ5RXZlbnQ7CQorCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIJbnVtX3ZhbHVhdG9yczsKKyAgICB1bnNpZ25lZCBjaGFyCW1vZGU7CisgICAgaW50ICAgICAgICAJCXZhbHVhdG9yc1s2XTsKK30gWFZhbHVhdG9yU3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHNob3J0CQludW1fa2V5czsKKyAgICBjaGFyICAgICAgICAJa2V5c1szMl07Cit9IFhLZXlTdGF0dXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgdW5zaWduZWQgY2hhcgljX2NsYXNzOworI2Vsc2UKKyAgICB1bnNpZ25lZCBjaGFyCWNsYXNzOworI2VuZGlmCisgICAgdW5zaWduZWQgY2hhcglsZW5ndGg7CisgICAgc2hvcnQJCW51bV9idXR0b25zOworICAgIGNoYXIgICAgICAgIAlidXR0b25zWzMyXTsKK30gWEJ1dHRvblN0YXR1czsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VNYXBwaW5nTm90aWZ5IGV2ZW50LiAgVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGtleSBtYXBwaW5nLAorICogbW9kaWZpZXIgbWFwcGluZywgb3IgYnV0dG9uIG1hcHBpbmcgb2YgYW4gZXh0ZW5zaW9uIGRldmljZSBpcyBjaGFuZ2VkLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB0eXBlOworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgICAgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCAgICAgICAgICBzZW5kX2V2ZW50OyAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgICAgICAgKmRpc3BsYXk7ICAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93ICAgICAgICB3aW5kb3c7ICAgICAgIC8qIHVudXNlZCAqLworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIGludCAgICAgICAgICAgcmVxdWVzdDsgICAgICAvKiBvbmUgb2YgTWFwcGluZ01vZGlmaWVyLCBNYXBwaW5nS2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nUG9pbnRlciAqLworICAgIGludCAgICAgICAgICAgZmlyc3Rfa2V5Y29kZTsvKiBmaXJzdCBrZXljb2RlICovCisgICAgaW50ICAgICAgICAgICBjb3VudDsgICAgICAgIC8qIGRlZmluZXMgcmFuZ2Ugb2YgY2hhbmdlIHcuIGZpcnN0X2tleWNvZGUqLworfSBYRGV2aWNlTWFwcGluZ0V2ZW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZURldmljZU5vdGlmeSBldmVudC4gIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIGFuIAorICogWENoYW5nZUtleWJvYXJkIG9yIFhDaGFuZ2VQb2ludGVyIHJlcXVlc3QgaXMgbWFkZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgdHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgICAgICAgICAgc2VuZF9ldmVudDsgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICAgICAgICpkaXNwbGF5OyAgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFdpbmRvdyAgICAgICAgd2luZG93OyAgICAgICAvKiB1bnVzZWQgKi8KKyAgICBYSUQgICAgICAgICAgIGRldmljZWlkOworICAgIFRpbWUgICAgICAgICAgdGltZTsKKyAgICBpbnQgICAgICAgICAgIHJlcXVlc3Q7ICAgICAgLyogTmV3UG9pbnRlciBvciBOZXdLZXlib2FyZCAqLworfSBYQ2hhbmdlRGV2aWNlTm90aWZ5RXZlbnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlUHJlc2VuY2VOb3RpZnkgZXZlbnQuICBUaGlzIGV2ZW50IGlzIHNlbnQgd2hlbiB0aGUgbGlzdCBvZgorICogaW5wdXQgZGV2aWNlcyBjaGFuZ2VzLCBpbiB3aGljaCBjYXNlIGRldmNoYW5nZSB3aWxsIGJlIGZhbHNlLCBhbmQKKyAqIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2Ugd2lsbCBiZSBjb250YWluZWQgaW4gdGhlIGV2ZW50OworICogdGhlIGNsaWVudCBzaG91bGQgdXNlIFhMaXN0SW5wdXREZXZpY2VzKCkgdG8gbGVhcm4gd2hhdCBoYXMgY2hhbmdlZC4KKyAqCisgKiBJZiBkZXZjaGFuZ2UgaXMgdHJ1ZSwgYW4gYXR0cmlidXRlIHRoYXQgdGhlIHNlcnZlciBiZWxpZXZlcyBpcworICogaW1wb3J0YW50IGhhcyBjaGFuZ2VkIG9uIGEgZGV2aWNlLCBhbmQgdGhlIGNsaWVudCBzaG91bGQgdXNlCisgKiBYR2V0RGV2aWNlQ29udHJvbCB0byBleGFtaW5lIHRoZSBkZXZpY2UuICBJZiBjb250cm9sIGlzIG5vbi16ZXJvLAorICogdGhlbiB0aGF0IGNvbnRyb2wgaGFzIGNoYW5nZWQgbWVhbmluZ2Z1bGx5LgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIHR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sICAgICAgICAgIHNlbmRfZXZlbnQ7ICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAgICAgICAqZGlzcGxheTsgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgICAgICAgIHdpbmRvdzsgICAgICAgLyogdW51c2VkICovCisgICAgVGltZSAgICAgICAgICB0aW1lOworICAgIEJvb2wgICAgICAgICAgZGV2Y2hhbmdlOworICAgIFhJRCAgICAgICAgICAgZGV2aWNlaWQ7CisgICAgWElEICAgICAgICAgICBjb250cm9sOworfSBYRGV2aWNlUHJlc2VuY2VOb3RpZnlFdmVudDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb250cm9sIHN0cnVjdHVyZXMgZm9yIGlucHV0IGRldmljZXMgdGhhdCBzdXBwb3J0IGlucHV0IGNsYXNzCisgKiBGZWVkYmFjay4gIFRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBYR2V0RmVlZGJhY2tDb250cm9sIGFuZCAKKyAqIFhDaGFuZ2VGZWVkYmFja0NvbnRyb2wgZnVuY3Rpb25zLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgICBYSUQgICAgICAgICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICAgWElEICAgICAgICAgICAgY2xhc3M7CisjZW5kaWYKKyAgICAgaW50ICAgICAgICAgICAgbGVuZ3RoOworICAgICBYSUQgICAgICAgICAgICBpZDsKK30gWEZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIGNsaWNrOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBpbnQgICAgIHBpdGNoOworICAgIGludCAgICAgZHVyYXRpb247CisgICAgaW50ICAgICBsZWRfbWFzazsKKyAgICBpbnQgICAgIGdsb2JhbF9hdXRvX3JlcGVhdDsKKyAgICBjaGFyICAgIGF1dG9fcmVwZWF0c1szMl07Cit9IFhLYmRGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBhY2NlbE51bTsKKyAgICBpbnQgICAgIGFjY2VsRGVub207CisgICAgaW50ICAgICB0aHJlc2hvbGQ7Cit9IFhQdHJGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICByZXNvbHV0aW9uOworICAgIGludCAgICAgbWluVmFsOworICAgIGludCAgICAgbWF4VmFsOworfSBYSW50ZWdlckZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIG1heF9zeW1ib2xzOworICAgIGludCAgICAgbnVtX3N5bXNfc3VwcG9ydGVkOworICAgIEtleVN5bSAgKnN5bXNfc3VwcG9ydGVkOworfSBYU3RyaW5nRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBpbnQgICAgIHBpdGNoOworICAgIGludCAgICAgZHVyYXRpb247Cit9IFhCZWxsRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgbGVkX3ZhbHVlczsKKyAgICBpbnQgICAgIGxlZF9tYXNrOworfSBYTGVkRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICAgWElEICAgICAgICAgICAgY19jbGFzczsKKyNlbHNlCisgICAgIFhJRCAgICAgICAgICAgIGNsYXNzOworI2VuZGlmCisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgWElECSAgICBpZDsKK30gWEZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgYWNjZWxOdW07CisgICAgaW50ICAgICBhY2NlbERlbm9tOworICAgIGludCAgICAgdGhyZXNob2xkOworfSBYUHRyRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBjbGljazsKKyAgICBpbnQgICAgIHBlcmNlbnQ7CisgICAgaW50ICAgICBwaXRjaDsKKyAgICBpbnQgICAgIGR1cmF0aW9uOworICAgIGludCAgICAgbGVkX21hc2s7CisgICAgaW50ICAgICBsZWRfdmFsdWU7CisgICAgaW50ICAgICBrZXk7CisgICAgaW50ICAgICBhdXRvX3JlcGVhdF9tb2RlOworfSBYS2JkRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBudW1fa2V5c3ltczsKKyAgICBLZXlTeW0gICpzeW1zX3RvX2Rpc3BsYXk7Cit9IFhTdHJpbmdGZWVkYmFja0NvbnRyb2w7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElEICAgICBjX2NsYXNzOworI2Vsc2UKKyAgICBYSUQgICAgIGNsYXNzOworI2VuZGlmCisgICAgaW50ICAgICBsZW5ndGg7CisgICAgWElEICAgICBpZDsKKyAgICBpbnQgICAgIGludF90b19kaXNwbGF5OworfSBYSW50ZWdlckZlZWRiYWNrQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgICAgIGNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAgICAgY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgICAgIGxlbmd0aDsKKyAgICBYSUQgICAgIGlkOworICAgIGludCAgICAgcGVyY2VudDsKKyAgICBpbnQgICAgIHBpdGNoOworICAgIGludCAgICAgZHVyYXRpb247Cit9IFhCZWxsRmVlZGJhY2tDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRCAgICAgY19jbGFzczsKKyNlbHNlCisgICAgWElEICAgICBjbGFzczsKKyNlbmRpZgorICAgIGludCAgICAgbGVuZ3RoOworICAgIFhJRCAgICAgaWQ7CisgICAgaW50ICAgICBsZWRfbWFzazsKKyAgICBpbnQgICAgIGxlZF92YWx1ZXM7Cit9IFhMZWRGZWVkYmFja0NvbnRyb2w7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlIGNvbnRyb2wgc3RydWN0dXJlcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBYSUQgICAgICAgICAgICBjb250cm9sOworICAgICBpbnQgICAgICAgICAgICBsZW5ndGg7Cit9IFhEZXZpY2VDb250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIFhJRCAgICAgICAgICAgIGNvbnRyb2w7CisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgaW50ICAgICAgICAgICAgZmlyc3RfdmFsdWF0b3I7CisgICAgIGludCAgICAgICAgICAgIG51bV92YWx1YXRvcnM7CisgICAgIGludCAgICAgICAgICAgICpyZXNvbHV0aW9uczsKK30gWERldmljZVJlc29sdXRpb25Db250cm9sOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIFhJRCAgICAgICAgICAgIGNvbnRyb2w7CisgICAgIGludCAgICAgICAgICAgIGxlbmd0aDsKKyAgICAgaW50ICAgICAgICAgICAgbnVtX3ZhbHVhdG9yczsKKyAgICAgaW50ICAgICAgICAgICAgKnJlc29sdXRpb25zOworICAgICBpbnQgICAgICAgICAgICAqbWluX3Jlc29sdXRpb25zOworICAgICBpbnQgICAgICAgICAgICAqbWF4X3Jlc29sdXRpb25zOworfSBYRGV2aWNlUmVzb2x1dGlvblN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEICAgICAgICAgICAgIGNvbnRyb2w7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgbWluX3g7CisgICAgaW50ICAgICAgICAgICAgIG1heF94OworICAgIGludCAgICAgICAgICAgICBtaW5feTsKKyAgICBpbnQgICAgICAgICAgICAgbWF4X3k7CisgICAgaW50ICAgICAgICAgICAgIGZsaXBfeDsKKyAgICBpbnQgICAgICAgICAgICAgZmxpcF95OworICAgIGludCAgICAgICAgICAgICByb3RhdGlvbjsKKyAgICBpbnQgICAgICAgICAgICAgYnV0dG9uX3RocmVzaG9sZDsKK30gWERldmljZUFic0NhbGliQ29udHJvbCwgWERldmljZUFic0NhbGliU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYSUQgICAgICAgICAgICAgY29udHJvbDsKKyAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOworICAgIGludCAgICAgICAgICAgICBvZmZzZXRfeDsKKyAgICBpbnQgICAgICAgICAgICAgb2Zmc2V0X3k7CisgICAgaW50ICAgICAgICAgICAgIHdpZHRoOworICAgIGludCAgICAgICAgICAgICBoZWlnaHQ7CisgICAgaW50ICAgICAgICAgICAgIHNjcmVlbjsKKyAgICBYSUQgICAgICAgICAgICAgZm9sbG93aW5nOworfSBYRGV2aWNlQWJzQXJlYUNvbnRyb2wsIFhEZXZpY2VBYnNBcmVhU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYSUQgICAgICAgICAgICAgY29udHJvbDsKKyAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOworICAgIGludCAgICAgICAgICAgICBzdGF0dXM7Cit9IFhEZXZpY2VDb3JlQ29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhJRCAgICAgICAgICAgICBjb250cm9sOworICAgIGludCAgICAgICAgICAgICBsZW5ndGg7CisgICAgaW50ICAgICAgICAgICAgIHN0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgaXNjb3JlOworfSBYRGV2aWNlQ29yZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEICAgICAgICAgICAgIGNvbnRyb2w7CisgICAgaW50ICAgICAgICAgICAgIGxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgZW5hYmxlOworfSBYRGV2aWNlRW5hYmxlQ29udHJvbCwgWERldmljZUVuYWJsZVN0YXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFuIGFycmF5IG9mIFhEZXZpY2VMaXN0IHN0cnVjdHVyZXMgaXMgcmV0dXJuZWQgYnkgdGhlIAorICogWExpc3RJbnB1dERldmljZXMgZnVuY3Rpb24uICBFYWNoIGVudHJ5IGNvbnRhaW5zIGluZm9ybWF0aW9uCisgKiBhYm91dCBvbmUgaW5wdXQgZGV2aWNlLiAgQW1vbmcgdGhhdCBpbmZvcm1hdGlvbiBpcyBhbiBhcnJheSBvZiAKKyAqIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgdGhhdCBkZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIAorICogdGhlIGlucHV0IGRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hBbnlDbGFzc2luZm8gKlhBbnlDbGFzc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hBbnlDbGFzc2luZm8geworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBYSUQgCWNfY2xhc3M7CisjZWxzZQorICAgIFhJRCAJY2xhc3M7CisjZW5kaWYKKyAgICBpbnQgCWxlbmd0aDsKKyAgICB9IFhBbnlDbGFzc0luZm87CisKK3R5cGVkZWYgc3RydWN0IF9YRGV2aWNlSW5mbyAqWERldmljZUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9YRGV2aWNlSW5mbworICAgIHsKKyAgICBYSUQgICAgICAgICAgICAgICAgIGlkOyAgICAgICAgCisgICAgQXRvbSAgICAgICAgICAgICAgICB0eXBlOworICAgIGNoYXIgICAgICAgICAgICAgICAgKm5hbWU7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fY2xhc3NlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzZTsKKyAgICBYQW55Q2xhc3NQdHIgCWlucHV0Y2xhc3NpbmZvOworICAgIH0gWERldmljZUluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YS2V5SW5mbyAqWEtleUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF9YS2V5SW5mbworICAgIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElECQkJY19jbGFzczsKKyNlbHNlCisgICAgWElECQkJY2xhc3M7CisjZW5kaWYKKyAgICBpbnQJCQlsZW5ndGg7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICBtaW5fa2V5Y29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgICAgIG1heF9rZXljb2RlOworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgbnVtX2tleXM7CisgICAgfSBYS2V5SW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX1hCdXR0b25JbmZvICpYQnV0dG9uSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hCdXR0b25JbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgWElECQljX2NsYXNzOworI2Vsc2UKKyAgICBYSUQJCWNsYXNzOworI2VuZGlmCisgICAgaW50CQlsZW5ndGg7CisgICAgc2hvcnQgCW51bV9idXR0b25zOworICAgIH0gWEJ1dHRvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YQXhpc0luZm8gKlhBeGlzSW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hBeGlzSW5mbyB7CisgICAgaW50IAlyZXNvbHV0aW9uOworICAgIGludCAJbWluX3ZhbHVlOworICAgIGludCAJbWF4X3ZhbHVlOworICAgIH0gWEF4aXNJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfWFZhbHVhdG9ySW5mbyAqWFZhbHVhdG9ySW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QJX1hWYWx1YXRvckluZm8KKyAgICB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIFhJRAkJCWNfY2xhc3M7CisjZWxzZQorICAgIFhJRAkJCWNsYXNzOworI2VuZGlmCisgICAgaW50CQkJbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgbnVtX2F4ZXM7CisgICAgdW5zaWduZWQgY2hhciAgICAgICBtb2RlOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgbW90aW9uX2J1ZmZlcjsKKyAgICBYQXhpc0luZm9QdHIgICAgICAgIGF4ZXM7CisgICAgfSBYVmFsdWF0b3JJbmZvOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQW4gWERldmljZSBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQgYnkgdGhlIFhPcGVuRGV2aWNlIGZ1bmN0aW9uLiAgCisgKiBJdCBjb250YWlucyBhbiBhcnJheSBvZiBwb2ludGVycyB0byBYSW5wdXRDbGFzc0luZm8gc3RydWN0dXJlcy4KKyAqIEVhY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcyBvZiBpbnB1dCBzdXBwb3J0ZWQgYnkgdGhlCisgKiBkZXZpY2UsIGluY2x1ZGluZyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZGF0YSBmb3IgZWFjaCB0eXBlIG9mIGV2ZW50CisgKiB0aGUgZGV2aWNlIHJlcG9ydHMuCisgKgorICovCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBjaGFyICAgaW5wdXRfY2xhc3M7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgICBldmVudF90eXBlX2Jhc2U7Cit9IFhJbnB1dENsYXNzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBYSUQgICAgICAgICAgICAgICAgICAgIGRldmljZV9pZDsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBudW1fY2xhc3NlczsKKyAgICAgICAgWElucHV0Q2xhc3NJbmZvICAgICAgICAqY2xhc3NlczsKK30gWERldmljZTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGZvciB0aGUgCisgKiBYR2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHMgZnVuY3Rpb24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgWEV2ZW50Q2xhc3MgICAgIGV2ZW50X3R5cGU7CisgICAgICAgIFhJRCAgICAgICAgICAgICBkZXZpY2U7Cit9IFhFdmVudExpc3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXR1cm4gbW90aW9uIGhpc3RvcnkgZGF0YSBmcm9tIAorICogYW4gaW5wdXQgZGV2aWNlIHRoYXQgc3VwcG9ydHMgdGhlIGlucHV0IGNsYXNzIFZhbHVhdG9ycy4KKyAqIFRoaXMgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgYnkgdGhlIFhHZXREZXZpY2VNb3Rpb25FdmVudHMgZnVuY3Rpb24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgVGltZSAgIHRpbWU7CisgICAgICAgIGludCAgICAqZGF0YTsKK30gWERldmljZVRpbWVDb29yZDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZSBzdGF0ZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIHJldHVybmVkIGJ5IHRoZSBYUXVlcnlEZXZpY2VTdGF0ZSByZXF1ZXN0LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFhJRAkJZGV2aWNlX2lkOworICAgICAgICBpbnQJCW51bV9jbGFzc2VzOworICAgICAgICBYSW5wdXRDbGFzcwkqZGF0YTsKK30gWERldmljZVN0YXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5vdGUgdGhhdCB0aGUgbW9kZSBmaWVsZCBpcyBhIGJpdGZpZWxkIHRoYXQgcmVwb3J0cyB0aGUgUHJveGltaXR5CisgKiBzdGF0dXMgb2YgdGhlIGRldmljZSBhcyB3ZWxsIGFzIHRoZSBtb2RlLiAgVGhlIG1vZGUgZmllbGQgc2hvdWxkCisgKiBiZSBPUidkIHdpdGggdGhlIG1hc2sgRGV2aWNlTW9kZSBhbmQgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWVzCisgKiBBYnNvbHV0ZSBhbmQgUmVsYXRpdmUgdG8gZGV0ZXJtaW5lIHRoZSBtb2RlLCBhbmQgc2hvdWxkIGJlIE9SJ2QKKyAqIHdpdGggdGhlIG1hc2sgUHJveGltaXR5U3RhdGUgYW5kIGNvbXBhcmVkIHdpdGggdGhlIHZhbHVlcyBJblByb3hpbWl0eQorICogYW5kIE91dE9mUHJveGltaXR5IHRvIGRldGVybWluZSB0aGUgcHJveGltaXR5IHN0YXRlLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIJbnVtX3ZhbHVhdG9yczsKKyAgICB1bnNpZ25lZCBjaGFyCW1vZGU7CisgICAgaW50ICAgICAgICAJCSp2YWx1YXRvcnM7Cit9IFhWYWx1YXRvclN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIHVuc2lnbmVkIGNoYXIJY19jbGFzczsKKyNlbHNlCisgICAgdW5zaWduZWQgY2hhcgljbGFzczsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXIJbGVuZ3RoOworICAgIHNob3J0CQludW1fa2V5czsKKyAgICBjaGFyICAgICAgICAJa2V5c1szMl07Cit9IFhLZXlTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICB1bnNpZ25lZCBjaGFyCWNfY2xhc3M7CisjZWxzZQorICAgIHVuc2lnbmVkIGNoYXIJY2xhc3M7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBjaGFyCWxlbmd0aDsKKyAgICBzaG9ydAkJbnVtX2J1dHRvbnM7CisgICAgY2hhciAgICAgICAgCWJ1dHRvbnNbMzJdOworfSBYQnV0dG9uU3RhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb24gZGVmaW5pdGlvbnMuCisgKgorICovCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIGludAlYQ2hhbmdlS2V5Ym9hcmREZXZpY2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLworKTsKKworZXh0ZXJuIGludAlYQ2hhbmdlUG9pbnRlckRldmljZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIGludAkJCS8qIHhheGlzICovLAorICAgIGludAkJCS8qIHlheGlzICovCispOworCitleHRlcm4gaW50CVhHcmFiRGV2aWNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLywKKyAgICBCb29sCQkvKiBvd25lckV2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBldmVudCBjb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRfbGlzdCAqLywKKyAgICBpbnQJCQkvKiB0aGlzX2RldmljZV9tb2RlICovLAorICAgIGludAkJCS8qIG90aGVyX2RldmljZXNfbW9kZSAqLywKKyAgICBUaW1lCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50CVhVbmdyYWJEZXZpY2UoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBUaW1lIAkJLyogdGltZSAqLworKTsKKworZXh0ZXJuIGludAlYR3JhYkRldmljZUtleSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGludAkvKiBrZXkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBYRGV2aWNlKgkJLyogbW9kaWZpZXJfZGV2aWNlICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9jb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRfbGlzdCAqLywKKyAgICBpbnQJCQkvKiB0aGlzX2RldmljZV9tb2RlICovLAorICAgIGludAkJCS8qIG90aGVyX2RldmljZXNfbW9kZSAqLworKTsKKworZXh0ZXJuIGludAlYVW5ncmFiRGV2aWNlS2V5KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGtleSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFhEZXZpY2UqCQkvKiBtb2RpZmllcl9kZXYgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLworKTsKKworZXh0ZXJuIGludAlYR3JhYkRldmljZUJ1dHRvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGludAkvKiBidXR0b24gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIG1vZGlmaWVycyAqLywKKyAgICBYRGV2aWNlKgkJLyogbW9kaWZpZXJfZGV2aWNlICovLAorICAgIFdpbmRvdwkJLyogZ3JhYl93aW5kb3cgKi8sCisgICAgQm9vbAkJLyogb3duZXJfZXZlbnRzICovLAorICAgIHVuc2lnbmVkIGludAkvKiBldmVudF9jb3VudCAqLywKKyAgICBYRXZlbnRDbGFzcyoJLyogZXZlbnRfbGlzdCAqLywKKyAgICBpbnQJCQkvKiB0aGlzX2RldmljZV9tb2RlICovLAorICAgIGludAkJCS8qIG90aGVyX2RldmljZXNfbW9kZSAqLworKTsKKworZXh0ZXJuIGludAlYVW5ncmFiRGV2aWNlQnV0dG9uKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogbW9kaWZpZXJzICovLAorICAgIFhEZXZpY2UqCQkvKiBtb2RpZmllcl9kZXYgKi8sCisgICAgV2luZG93CQkvKiBncmFiX3dpbmRvdyAqLworKTsKKworZXh0ZXJuIGludAlYQWxsb3dEZXZpY2VFdmVudHMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBldmVudF9tb2RlICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBpbnQJWEdldERldmljZUZvY3VzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93KgkJLyogZm9jdXMgKi8sCisgICAgaW50KgkJLyogcmV2ZXJ0X3RvICovLAorICAgIFRpbWUqCQkvKiB0aW1lICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VGb2N1cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFdpbmRvdwkJLyogZm9jdXMgKi8sCisgICAgaW50CQkJLyogcmV2ZXJ0X3RvICovLAorICAgIFRpbWUJCS8qIHRpbWUgKi8KKyk7CisKK2V4dGVybiBYRmVlZGJhY2tTdGF0ZQkqWEdldEZlZWRiYWNrQ29udHJvbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIGludCoJCS8qIG51bV9mZWVkYmFja3MgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhGcmVlRmVlZGJhY2tMaXN0KAorICAgIFhGZWVkYmFja1N0YXRlKgkvKiBsaXN0ICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VGZWVkYmFja0NvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG1hc2sgKi8sCisgICAgWEZlZWRiYWNrQ29udHJvbCoJLyogZiAqLworKTsKKworZXh0ZXJuIGludAlYRGV2aWNlQmVsbCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFhJRAkJCS8qIGZlZWRiYWNrY2xhc3MgKi8sCisgICAgWElECQkJLyogZmVlZGJhY2tpZCAqLywKKyAgICBpbnQJCQkvKiBwZXJjZW50ICovCispOworCitleHRlcm4gS2V5U3ltCSpYR2V0RGV2aWNlS2V5TWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorI2lmIE5lZWRXaWRlUHJvdG90eXBlcworICAgIHVuc2lnbmVkIGludAkvKiBmaXJzdCAqLywKKyNlbHNlCisgICAgS2V5Q29kZQkJLyogZmlyc3QgKi8sCisjZW5kaWYKKyAgICBpbnQJCQkvKiBrZXljb3VudCAqLywKKyAgICBpbnQqCQkvKiBzeW1zX3Blcl9jb2RlICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VEZXZpY2VLZXlNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogc3ltc19wZXJfY29kZSAqLywKKyAgICBLZXlTeW0qCQkvKiBrZXlzeW1zICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gWE1vZGlmaWVyS2V5bWFwCSpYR2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8KKyk7CisKK2V4dGVybiBpbnQJWFNldERldmljZU1vZGlmaWVyTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIFhNb2RpZmllcktleW1hcCoJLyogbW9kbWFwICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VCdXR0b25NYXBwaW5nKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgdW5zaWduZWQgY2hhcioJLyogbWFwW10gKi8sCisgICAgaW50CQkJLyogbm1hcCAqLworKTsKKworZXh0ZXJuIGludAlYR2V0RGV2aWNlQnV0dG9uTWFwcGluZygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovLAorICAgIHVuc2lnbmVkIGNoYXIqCS8qIG1hcFtdICovLAorICAgIHVuc2lnbmVkIGludAkvKiBubWFwICovCispOworCitleHRlcm4gWERldmljZVN0YXRlCSpYUXVlcnlEZXZpY2VTdGF0ZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovCispOworCitleHRlcm4gdm9pZAlYRnJlZURldmljZVN0YXRlKAorICAgIFhEZXZpY2VTdGF0ZSoJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIFhFeHRlbnNpb25WZXJzaW9uCSpYR2V0RXh0ZW5zaW9uVmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIG5hbWUgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlSW5mbwkqWExpc3RJbnB1dERldmljZXMoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkJLyogbmRldmljZXMgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhGcmVlRGV2aWNlTGlzdCgKKyAgICBYRGV2aWNlSW5mbyoJLyogbGlzdCAqLworKTsKKworZXh0ZXJuIFhEZXZpY2UJKlhPcGVuRGV2aWNlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhJRAkJCS8qIGlkICovCispOworCitleHRlcm4gaW50CVhDbG9zZURldmljZSgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2aWNlICovCispOworCitleHRlcm4gaW50CVhTZXREZXZpY2VNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogbW9kZSAqLworKTsKKworZXh0ZXJuIGludAlYU2V0RGV2aWNlVmFsdWF0b3JzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50KgkJLyogdmFsdWF0b3JzICovLAorICAgIGludAkJCS8qIGZpcnN0X3ZhbHVhdG9yICovLAorICAgIGludAkJCS8qIG51bV92YWx1YXRvcnMgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlQ29udHJvbAkqWEdldERldmljZUNvbnRyb2woCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgWERldmljZSoJCS8qIGRldmljZSAqLywKKyAgICBpbnQJCQkvKiBjb250cm9sICovCispOworCitleHRlcm4gaW50CVhDaGFuZ2VEZXZpY2VDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgaW50CQkJLyogY29udHJvbCAqLywKKyAgICBYRGV2aWNlQ29udHJvbCoJLyogZCAqLworKTsKKworZXh0ZXJuIGludAlYU2VsZWN0RXh0ZW5zaW9uRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3ICovLAorICAgIFhFdmVudENsYXNzKgkvKiBldmVudF9saXN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gaW50IFhHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cygKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50KgkJLyogdGhpc19jbGllbnRfY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqKgkvKiB0aGlzX2NsaWVudF9saXN0ICovLAorICAgIGludCoJCS8qIGFsbF9jbGllbnRzX2NvdW50ICovLAorICAgIFhFdmVudENsYXNzKioJLyogYWxsX2NsaWVudHNfbGlzdCAqLworKTsKKworZXh0ZXJuIGludAlYQ2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqCS8qIGV2ZW50cyAqLywKKyAgICBpbnQJCQkvKiBtb2RlICovCispOworCitleHRlcm4gWEV2ZW50Q2xhc3MJKlhHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdCgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBpbnQqCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIFN0YXR1cwlYU2VuZEV4dGVuc2lvbkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgV2luZG93CQkvKiBkZXN0ICovLAorICAgIEJvb2wJCS8qIHByb3AgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgWEV2ZW50Q2xhc3MqCS8qIGxpc3QgKi8sCisgICAgWEV2ZW50KgkJLyogZXZlbnQgKi8KKyk7CisKK2V4dGVybiBYRGV2aWNlVGltZUNvb3JkCSpYR2V0RGV2aWNlTW90aW9uRXZlbnRzKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXZpY2UgKi8sCisgICAgVGltZQkJLyogc3RhcnQgKi8sCisgICAgVGltZQkJLyogc3RvcCAqLywKKyAgICBpbnQqCQkvKiBuRXZlbnRzICovLAorICAgIGludCoJCS8qIG1vZGUgKi8sCisgICAgaW50KgkJLyogYXhpc19jb3VudCAqLworKTsKKworZXh0ZXJuIHZvaWQJWEZyZWVEZXZpY2VNb3Rpb25FdmVudHMoCisgICAgWERldmljZVRpbWVDb29yZCoJLyogZXZlbnRzICovCispOworCitleHRlcm4gdm9pZAlYRnJlZURldmljZUNvbnRyb2woCisgICAgWERldmljZUNvbnRyb2wqCS8qIGNvbnRyb2wgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfWElOUFVUX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWElwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDZmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hJcHJvdG8uaApAQCAtMCwwICsxLDE2MTcgQEAKKy8qICRYb3JnOiBYSXByb3RvLmgsdiAxLjUgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKK0NvcHlyaWdodCAxOTg5IGJ5IEhld2xldHQtUGFja2FyZCBDb21wYW55LCBQYWxvIEFsdG8sIENhbGlmb3JuaWEuCisKKwkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0hFV0xFVFQtUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0hFV0xFVFQtUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKK0FOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKK0FSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKK1NPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWElwcm90by5oLHYgMS40IDIwMDEvMDEvMTcgMTc6NTM6MTcgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWElQUk9UT19ICisjZGVmaW5lIF9YSVBST1RPX0gKKworI2luY2x1ZGUgPFgxMS9YcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvWC5oPgorCisvKiBtYWtlIHN1cmUgdHlwZXMgaGF2ZSByaWdodCBzaXplcyBmb3IgcHJvdG9jb2wgc3RydWN0dXJlcy4gKi8KKyNkZWZpbmUgV2luZG93IENBUkQzMgorI2RlZmluZSBUaW1lIENBUkQzMgorI2RlZmluZSBLZXlDb2RlIENBUkQ4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBudW1iZXIgb2YgZXZlbnRzLCBlcnJvcnMsIGFuZCBleHRlbnNpb24gbmFtZS4KKyAqCisgKi8KKworI2RlZmluZSBNT1JFX0VWRU5UUwkweDgwCisjZGVmaW5lIERFVklDRV9CSVRTCTB4N0YKKworI2RlZmluZSBJbnB1dENsYXNzQml0cwkweDNGCS8qIGJpdHMgaW4gbW9kZSBmaWVsZCBmb3IgaW5wdXQgY2xhc3NlcyAqLworI2RlZmluZSBNb2RlQml0c1NoaWZ0CTYJLyogYW1vdW50IHRvIHNoaWZ0IHRoZSByZW1haW5pbmcgYml0cyAgICovCisKKyNkZWZpbmUgbnVtSW5wdXRDbGFzc2VzIDcKKworI2RlZmluZSBJRVZFTlRTCQkxNgorI2RlZmluZSBJRVJST1JTCQk1CisKKyNkZWZpbmUgQ0xJRU5UX1JFUQkJMQorCit0eXBlZGVmIHN0cnVjdCAgX1hFeHRFdmVudEluZm8KKyAgICB7CisgICAgTWFzawltYXNrOworICAgIEJZVEUgCXR5cGU7CisgICAgQllURQl3b3JkOworICAgIH0gWEV4dEV2ZW50SW5mbzsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICpQb2ludGVyOworCitzdHJ1Y3QgdG1hc2sKKyAgICB7CisgICAgTWFzawltYXNrOworICAgIFBvaW50ZXIgICAgIGRldjsKKyAgICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnQgY29uc3RhbnRzIHVzZWQgYnkgbGlicmFyeS4KKyAqCisgKi8KKworI2RlZmluZSBYSV9EZXZpY2VWYWx1YXRvcgkJMAorI2RlZmluZSBYSV9EZXZpY2VLZXlQcmVzcwkJMQorI2RlZmluZSBYSV9EZXZpY2VLZXlSZWxlYXNlCQkyCisjZGVmaW5lIFhJX0RldmljZUJ1dHRvblByZXNzCQkzCisjZGVmaW5lIFhJX0RldmljZUJ1dHRvblJlbGVhc2UJCTQKKyNkZWZpbmUgWElfRGV2aWNlTW90aW9uTm90aWZ5CQk1CisjZGVmaW5lIFhJX0RldmljZUZvY3VzSW4JCTYKKyNkZWZpbmUgWElfRGV2aWNlRm9jdXNPdXQJCTcKKyNkZWZpbmUgWElfUHJveGltaXR5SW4JCQk4CisjZGVmaW5lIFhJX1Byb3hpbWl0eU91dAkJCTkKKyNkZWZpbmUgWElfRGV2aWNlU3RhdGVOb3RpZnkJCTEwCisjZGVmaW5lIFhJX0RldmljZU1hcHBpbmdOb3RpZnkJCTExCisjZGVmaW5lIFhJX0NoYW5nZURldmljZU5vdGlmeQkJMTIKKyNkZWZpbmUgWElfRGV2aWNlS2V5c3RhdGVOb3RpZnkJCTEzCisjZGVmaW5lIFhJX0RldmljZUJ1dHRvbnN0YXRlTm90aWZ5CTE0CisjZGVmaW5lIFhJX0RldmljZVByZXNlbmNlTm90aWZ5CQkxNQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUHJvdG9jb2wgcmVxdWVzdCBjb25zdGFudHMKKyAqCisgKi8KKworI2RlZmluZSBYX0dldEV4dGVuc2lvblZlcnNpb24JCTEKKyNkZWZpbmUgWF9MaXN0SW5wdXREZXZpY2VzCQkyCisjZGVmaW5lIFhfT3BlbkRldmljZQkJCTMKKyNkZWZpbmUgWF9DbG9zZURldmljZQkJCTQKKyNkZWZpbmUgWF9TZXREZXZpY2VNb2RlCQkJNQorI2RlZmluZSBYX1NlbGVjdEV4dGVuc2lvbkV2ZW50ICAJNgorI2RlZmluZSBYX0dldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzCTcKKyNkZWZpbmUgWF9DaGFuZ2VEZXZpY2VEb250UHJvcGFnYXRlTGlzdCA4CisjZGVmaW5lIFhfR2V0RGV2aWNlRG9udFByb3BhZ2F0ZUxpc3QgCTkKKyNkZWZpbmUgWF9HZXREZXZpY2VNb3Rpb25FdmVudHMgCTEwCisjZGVmaW5lIFhfQ2hhbmdlS2V5Ym9hcmREZXZpY2UJCTExCisjZGVmaW5lIFhfQ2hhbmdlUG9pbnRlckRldmljZQkJMTIKKyNkZWZpbmUgWF9HcmFiRGV2aWNlIAkJCTEzCisjZGVmaW5lIFhfVW5ncmFiRGV2aWNlICAJCTE0CisjZGVmaW5lIFhfR3JhYkRldmljZUtleQkJCTE1CisjZGVmaW5lIFhfVW5ncmFiRGV2aWNlS2V5CQkxNgorI2RlZmluZSBYX0dyYWJEZXZpY2VCdXR0b24JCTE3CisjZGVmaW5lIFhfVW5ncmFiRGV2aWNlQnV0dG9uCQkxOAorI2RlZmluZSBYX0FsbG93RGV2aWNlRXZlbnRzCQkxOQorI2RlZmluZSBYX0dldERldmljZUZvY3VzCQkyMAorI2RlZmluZSBYX1NldERldmljZUZvY3VzCQkyMQorI2RlZmluZSBYX0dldEZlZWRiYWNrQ29udHJvbAkJMjIKKyNkZWZpbmUgWF9DaGFuZ2VGZWVkYmFja0NvbnRyb2wJCTIzCisjZGVmaW5lIFhfR2V0RGV2aWNlS2V5TWFwcGluZwkJMjQKKyNkZWZpbmUgWF9DaGFuZ2VEZXZpY2VLZXlNYXBwaW5nCTI1CisjZGVmaW5lIFhfR2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nCTI2CisjZGVmaW5lIFhfU2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nCTI3CisjZGVmaW5lIFhfR2V0RGV2aWNlQnV0dG9uTWFwcGluZwkyOAorI2RlZmluZSBYX1NldERldmljZUJ1dHRvbk1hcHBpbmcJMjkKKyNkZWZpbmUgWF9RdWVyeURldmljZVN0YXRlIAkJMzAKKyNkZWZpbmUgWF9TZW5kRXh0ZW5zaW9uRXZlbnQgCQkzMQorI2RlZmluZSBYX0RldmljZUJlbGwJCQkzMgorI2RlZmluZSBYX1NldERldmljZVZhbHVhdG9ycwkJMzMKKyNkZWZpbmUgWF9HZXREZXZpY2VDb250cm9sCQkzNAorI2RlZmluZSBYX0NoYW5nZURldmljZUNvbnRyb2wJCTM1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQcm90b2NvbCByZXF1ZXN0IGFuZCByZXBseSBzdHJ1Y3R1cmVzLgorICoKKyAqIEdldEV4dGVuc2lvblZlcnNpb24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVxVHlwZTsgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAvKiBhbHdheXMgWF9HZXRFeHRlbnNpb25WZXJzaW9uICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQxNiAJbmJ5dGVzIEIxNjsKKyAgICBDQVJEOCAJcGFkMSwgcGFkMjsKK30geEdldEV4dGVuc2lvblZlcnNpb25SZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAgIAkvKiBhbHdheXMgWF9HZXRFeHRlbnNpb25WZXJzaW9uICovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOworICAgIENBUkQxNiAJbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2IAltaW5vcl92ZXJzaW9uIEIxNjsKKyAgICBCT09MIAlwcmVzZW50OworICAgIENBUkQ4IAlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMiAJcGFkMDEgQjMyOworICAgIENBUkQzMiAJcGFkMDIgQjMyOworICAgIENBUkQzMiAJcGFkMDMgQjMyOworICAgIENBUkQzMiAJcGFkMDQgQjMyOworfSB4R2V0RXh0ZW5zaW9uVmVyc2lvblJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTGlzdElucHV0RGV2aWNlcy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOwkvKiBhbHdheXMgWF9MaXN0SW5wdXREZXZpY2VzIAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKK30geExpc3RJbnB1dERldmljZXNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9MaXN0SW5wdXREZXZpY2VzICAJKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDggCW5kZXZpY2VzOworICAgIENBUkQ4IAlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMiAJcGFkMDEgQjMyOworICAgIENBUkQzMiAJcGFkMDIgQjMyOworICAgIENBUkQzMiAJcGFkMDMgQjMyOworICAgIENBUkQzMiAJcGFkMDQgQjMyOworICAgIENBUkQzMiAJcGFkMDUgQjMyOworfSB4TGlzdElucHV0RGV2aWNlc1JlcGx5OworCit0eXBlZGVmIHN0cnVjdCBfeERldmljZUluZm8gKnhEZXZpY2VJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfeEFueUNsYXNzaW5mbyAqeEFueUNsYXNzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfeEFueUNsYXNzaW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4IAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCAJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAJbGVuZ3RoOworICAgIH0geEFueUNsYXNzSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX3hEZXZpY2VJbmZvIHsKKyAgICBDQVJEMzIJdHlwZSBCMzI7CisgICAgQ0FSRDgJaWQ7CisgICAgQ0FSRDggCW51bV9jbGFzc2VzOworICAgIENBUkQ4IAl1c2U7CisgICAgQ0FSRDggCXBhZDE7CisgICAgfSB4RGV2aWNlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX3hLZXlJbmZvICp4S2V5SW5mb1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3hLZXlJbmZvIHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggCWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4IAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4IAlsZW5ndGg7CisgICAgS2V5Q29kZSAJbWluX2tleWNvZGU7IAorICAgIEtleUNvZGUgCW1heF9rZXljb2RlOyAKKyAgICBDQVJEMTYgCW51bV9rZXlzIEIxNjsKKyAgICBDQVJEOCAJcGFkMSxwYWQyOworICAgIH0geEtleUluZm87CisKK3R5cGVkZWYgc3RydWN0IF94QnV0dG9uSW5mbyAqeEJ1dHRvbkluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94QnV0dG9uSW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4IAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCAJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAJbGVuZ3RoOworICAgIENBUkQxNiAJbnVtX2J1dHRvbnMgQjE2OworICAgIH0geEJ1dHRvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IF94VmFsdWF0b3JJbmZvICp4VmFsdWF0b3JJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfeFZhbHVhdG9ySW5mbyB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4IAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCAJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAJbGVuZ3RoOworICAgIENBUkQ4IAludW1fYXhlczsKKyAgICBDQVJEOCAJbW9kZTsKKyAgICBDQVJEMzIgCW1vdGlvbl9idWZmZXJfc2l6ZSBCMzI7CisgICAgfSB4VmFsdWF0b3JJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfeEF4aXNJbmZvICp4QXhpc0luZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IF94QXhpc0luZm8geworICAgIENBUkQzMiAJcmVzb2x1dGlvbiBCMzI7CisgICAgQ0FSRDMyIAltaW5fdmFsdWUgQjMyOworICAgIENBUkQzMiAJbWF4X3ZhbHVlIEIzMjsKKyAgICB9IHhBeGlzSW5mbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9wZW5EZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfT3BlbkRldmljZSAJCSovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geE9wZW5EZXZpY2VSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAgIAkvKiBhbHdheXMgWF9PcGVuRGV2aWNlICAgICAgICAJKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDggCW51bV9jbGFzc2VzOworICAgIEJZVEUgCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyIAlwYWQwMCBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMSBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMiBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMyBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNCBCMzI7CisgICAgfSB4T3BlbkRldmljZVJlcGx5OworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4IAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCAJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAJZXZlbnRfdHlwZV9iYXNlOworICAgIH0geElucHV0Q2xhc3NJbmZvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2xvc2VEZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQ2xvc2VEZXZpY2UgCSovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geENsb3NlRGV2aWNlUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0RGV2aWNlTW9kZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgCS8qIGFsd2F5cyBYX1NldERldmljZU1vZGUgCSovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIENBUkQ4ICAgICAgIG1vZGU7CisgICAgQllURSAJcGFkMSwgcGFkMjsKK30geFNldERldmljZU1vZGVSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAJLyogYWx3YXlzIFhfU2V0RGV2aWNlTW9kZSAgCSovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOworICAgIENBUkQ4IAlzdGF0dXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMiAJcGFkMDEgQjMyOworICAgIENBUkQzMiAJcGFkMDIgQjMyOworICAgIENBUkQzMiAJcGFkMDMgQjMyOworICAgIENBUkQzMiAJcGFkMDQgQjMyOworICAgIENBUkQzMiAJcGFkMDUgQjMyOworfSB4U2V0RGV2aWNlTW9kZVJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2VsZWN0RXh0ZW5zaW9uRXZlbnQuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2VsZWN0RXh0ZW5zaW9uRXZlbnQgKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgV2luZG93IAl3aW5kb3cgQjMyOworICAgIENBUkQxNgljb3VudCBCMTY7CisgICAgQ0FSRDE2CXBhZDAwIEIxNjsKK30geFNlbGVjdEV4dGVuc2lvbkV2ZW50UmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBYX0dldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworfSB4R2V0U2VsZWN0ZWRFeHRlbnNpb25FdmVudHNSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAgIAkvKiBHZXRTZWxlY3RlZEV4dGVuc2lvbkV2ZW50cwkqLworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYgCXRoaXNfY2xpZW50X2NvdW50IEIxNjsKKyAgICBDQVJEMTYgCWFsbF9jbGllbnRzX2NvdW50IEIxNjsKKyAgICBDQVJEMzIgCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIgCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIgCXBhZDA1IEIzMjsKK30geEdldFNlbGVjdGVkRXh0ZW5zaW9uRXZlbnRzUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VEb250UHJvcGFnYXRlTGlzdC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBYX0NoYW5nZURldmljZURvbnRQcm9wYWdhdGVMaXN0ICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworICAgIENBUkQxNiAJY291bnQgQjE2OworICAgIENBUkQ4IAltb2RlOworICAgIEJZVEUJcGFkOworfSB4Q2hhbmdlRGV2aWNlRG9udFByb3BhZ2F0ZUxpc3RSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdC4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBYX0dldERldmljZURvbnRQcm9wYWdhdGVMaXN0ICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworfSB4R2V0RGV2aWNlRG9udFByb3BhZ2F0ZUxpc3RSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAgICAvKiBHZXREZXZpY2VEb250UHJvcGFnYXRlTGlzdCAgICovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOworICAgIENBUkQxNiAJY291bnQgQjE2OworICAgIENBUkQxNiAJcGFkMDAgQjE2OworICAgIENBUkQzMiAJcGFkMDEgQjMyOworICAgIENBUkQzMiAJcGFkMDIgQjMyOworICAgIENBUkQzMiAJcGFkMDMgQjMyOworICAgIENBUkQzMiAJcGFkMDQgQjMyOworICAgIENBUkQzMiAJcGFkMDUgQjMyOworICAgIH0geEdldERldmljZURvbnRQcm9wYWdhdGVMaXN0UmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXREZXZpY2VNb3Rpb25FdmVudHMuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZU1vdGlvbkV2ZW50cyovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIFRpbWUgCXN0YXJ0IEIzMjsKKyAgICBUaW1lCXN0b3AgQjMyOworICAgIENBUkQ4CWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geEdldERldmljZU1vdGlvbkV2ZW50c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXBUeXBlOyAgCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCAJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZU1vdGlvbkV2ZW50cyAgKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIAluRXZlbnRzIEIzMjsKKyAgICBDQVJEOCAgCWF4ZXM7CisgICAgQ0FSRDggIAltb2RlOworICAgIEJZVEUJcGFkMSwgcGFkMjsKKyAgICBDQVJEMzIgCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIgCXBhZDA0IEIzMjsKK30geEdldERldmljZU1vdGlvbkV2ZW50c1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlS2V5Ym9hcmREZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogWF9DaGFuZ2VLZXlib2FyZERldmljZSAJKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgQ0FSRDggCWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geENoYW5nZUtleWJvYXJkRGV2aWNlUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggCXJlcFR5cGU7ICAJLyogWF9SZXBseSAJCQkqLworICAgIENBUkQ4IAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfQ2hhbmdlS2V5Ym9hcmREZXZpY2UqLworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAJbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEOCAJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIgCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIgCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIgCXBhZDA1IEIzMjsKKyAgICB9IHhDaGFuZ2VLZXlib2FyZERldmljZVJlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlUG9pbnRlckRldmljZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBYX0NoYW5nZVBvaW50ZXJEZXZpY2UgCSovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4IAl4YXhpczsKKyAgICBDQVJEOCAJeWF4aXM7CisgICAgQ0FSRDggCWRldmljZWlkOworICAgIEJZVEUJcGFkMTsKK30geENoYW5nZVBvaW50ZXJEZXZpY2VSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggCVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9DaGFuZ2VQb2ludGVyRGV2aWNlICovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOyAgLyogMCAqLworICAgIENBUkQ4IAlzdGF0dXM7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMiAJcGFkMDEgQjMyOworICAgIENBUkQzMiAJcGFkMDIgQjMyOworICAgIENBUkQzMiAJcGFkMDMgQjMyOworICAgIENBUkQzMiAJcGFkMDQgQjMyOworICAgIENBUkQzMiAJcGFkMDUgQjMyOworICAgIH0geENoYW5nZVBvaW50ZXJEZXZpY2VSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdyYWJEZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR3JhYkRldmljZSAqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgCWdyYWJXaW5kb3cgQjMyOworICAgIFRpbWUgCXRpbWUgQjMyOworICAgIENBUkQxNglldmVudF9jb3VudCBCMTY7CisgICAgQ0FSRDgJdGhpc19kZXZpY2VfbW9kZTsKKyAgICBDQVJEOAlvdGhlcl9kZXZpY2VzX21vZGU7CisgICAgQk9PTCAJb3duZXJFdmVudHM7CisgICAgQ0FSRDggCWRldmljZWlkOworICAgIENBUkQxNiAJcGFkMDEgQjE2OworfSB4R3JhYkRldmljZVJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXBUeXBlOyAgCS8qIFhfUmVwbHkgCQkJKi8KKyAgICBDQVJEOCAJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dyYWJEZXZpY2UgIAkqLworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAJbGVuZ3RoIEIzMjsgIC8qIDAgKi8KKyAgICBDQVJEOCAJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIgCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIgCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIgCXBhZDA1IEIzMjsKKyAgICB9IHhHcmFiRGV2aWNlUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVbmdyYWJEZXZpY2UuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfVW5HcmFiRGV2aWNlIAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBUaW1lIAl0aW1lIEIzMjsKKyAgICBDQVJEOCAJZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworfSB4VW5ncmFiRGV2aWNlUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR3JhYkRldmljZUtleS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlCSovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HcmFiRGV2aWNlS2V5IAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgCWdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNglldmVudF9jb3VudCBCMTY7CisgICAgQ0FSRDE2IAltb2RpZmllcnMgQjE2OworICAgIENBUkQ4CW1vZGlmaWVyX2RldmljZTsKKyAgICBDQVJEOAlncmFiYmVkX2RldmljZTsKKyAgICBDQVJEOAlrZXk7CisgICAgQllURSAJdGhpc19kZXZpY2VfbW9kZTsgIAorICAgIEJZVEUgCW90aGVyX2RldmljZXNfbW9kZTsgIAorICAgIEJPT0wgCW93bmVyRXZlbnRzOworICAgIEJZVEUJcGFkMSwgcGFkMjsKK30geEdyYWJEZXZpY2VLZXlSZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVbmdyYWJEZXZpY2VLZXkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfVW5ncmFiRGV2aWNlS2V5IAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgCWdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNgltb2RpZmllcnMgQjE2OworICAgIENBUkQ4IAltb2RpZmllcl9kZXZpY2U7CisgICAgQ0FSRDgJa2V5OworICAgIENBUkQ4CWdyYWJiZWRfZGV2aWNlOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geFVuZ3JhYkRldmljZUtleVJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdyYWJEZXZpY2VCdXR0b24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR3JhYkRldmljZUJ1dHRvbiAJKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgV2luZG93IAlncmFiV2luZG93IEIzMjsKKyAgICBDQVJEOAlncmFiYmVkX2RldmljZTsKKyAgICBDQVJEOAltb2RpZmllcl9kZXZpY2U7CisgICAgQ0FSRDE2IAlldmVudF9jb3VudCBCMTY7CisgICAgQ0FSRDE2IAltb2RpZmllcnMgQjE2OworICAgIEJZVEUgCXRoaXNfZGV2aWNlX21vZGU7ICAKKyAgICBCWVRFIAlvdGhlcl9kZXZpY2VzX21vZGU7ICAKKyAgICBDQVJEOCAJYnV0dG9uOworICAgIEJPT0wgCW93bmVyRXZlbnRzOworICAgIEJZVEUJcGFkMSwgcGFkMjsKK30geEdyYWJEZXZpY2VCdXR0b25SZXE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBVbmdyYWJEZXZpY2VCdXR0b24uCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfVW5ncmFiRGV2aWNlQnV0dG9uIAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cgCWdyYWJXaW5kb3cgQjMyOworICAgIENBUkQxNiAJbW9kaWZpZXJzIEIxNjsKKyAgICBDQVJEOCAJbW9kaWZpZXJfZGV2aWNlOworICAgIENBUkQ4IAlidXR0b247CisgICAgQ0FSRDggCWdyYWJiZWRfZGV2aWNlOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geFVuZ3JhYkRldmljZUJ1dHRvblJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFsbG93RGV2aWNlRXZlbnRzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0FsbG93RGV2aWNlRXZlbnRzIAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBUaW1lIAl0aW1lIEIzMjsKKyAgICBDQVJEOAltb2RlOworICAgIENBUkQ4IAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDI7Cit9IHhBbGxvd0RldmljZUV2ZW50c1JlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZUZvY3VzLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggCXJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VGb2N1cyAJKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgQ0FSRDggCWRldmljZWlkOworICAgIEJZVEUgCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhHZXREZXZpY2VGb2N1c1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXBUeXBlOyAgCS8qIFhfUmVwbHkgCQkJKi8KKyAgICBDQVJEOCAJUmVwVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX0dldERldmljZUZvY3VzICAJKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyIAlmb2N1cyBCMzI7CisgICAgVGltZSAJdGltZSBCMzI7CisgICAgQ0FSRDggIAlyZXZlcnRUbzsKKyAgICBCWVRFIAlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQzMiAJcGFkMDEgQjMyOworICAgIENBUkQzMiAJcGFkMDIgQjMyOworICAgIENBUkQzMiAJcGFkMDMgQjMyOworICAgIH0geEdldERldmljZUZvY3VzUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VGb2N1cy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2V0RGV2aWNlRm9jdXMgCSovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIFdpbmRvdyAJZm9jdXMgQjMyOworICAgIFRpbWUgICAJdGltZSBCMzI7CisgICAgQ0FSRDggIAlyZXZlcnRUbzsKKyAgICBDQVJEOCAgCWRldmljZTsKKyAgICBDQVJEMTYgCXBhZDAxIEIxNjsKK30geFNldERldmljZUZvY3VzUmVxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0RmVlZGJhY2tDb250cm9sLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgICAgIC8qIFhfR2V0RmVlZGJhY2tDb250cm9sICAJKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgQ0FSRDggCWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geEdldEZlZWRiYWNrQ29udHJvbFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5IAkJCSovCisgICAgQ0FSRDggIAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RmVlZGJhY2tDb250cm9sIAkqLworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbnVtX2ZlZWRiYWNrcyBCMTY7CisgICAgQ0FSRDE2CXBhZDAxIEIxNjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIENBUkQzMglwYWQwNiBCMzI7Cit9IHhHZXRGZWVkYmFja0NvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgCWNfY2xhc3M7IAkvKiBmZWVkYmFjayBjbGFzcwkJKi8KKyNlbHNlCisgICAgQ0FSRDggIAljbGFzczsgCQkvKiBmZWVkYmFjayBjbGFzcwkJKi8KKyNlbmRpZgorICAgIENBUkQ4ICAJaWQ7IAkJLyogZmVlZGJhY2sgaWQgICAgCQkqLworICAgIENBUkQxNiAgCWxlbmd0aCBCMTY7IAkvKiBmZWVkYmFjayBsZW5ndGgJCSovCit9IHhGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAgY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDggICBjbGFzczsKKyNlbmRpZgorICAgIENBUkQ4ICAgaWQ7CisgICAgQ0FSRDE2ICBsZW5ndGggQjE2OworICAgIENBUkQxNiAgcGl0Y2ggQjE2OworICAgIENBUkQxNiAgZHVyYXRpb24gQjE2OworICAgIENBUkQzMiAgbGVkX21hc2sgQjMyOworICAgIENBUkQzMiAgbGVkX3ZhbHVlcyBCMzI7CisgICAgQk9PTCAgICBnbG9iYWxfYXV0b19yZXBlYXQ7CisgICAgQ0FSRDggICBjbGljazsKKyAgICBDQVJEOCAgIHBlcmNlbnQ7CisgICAgQllURSAgICBwYWQ7CisgICAgQllURSAgICBhdXRvX3JlcGVhdHNbMzJdOworfSB4S2JkRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgIGNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4ICAgY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAgIGlkOworICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgIHBhZDEscGFkMjsKKyAgICBDQVJEMTYgIGFjY2VsTnVtIEIxNjsKKyAgICBDQVJEMTYgIGFjY2VsRGVub20gQjE2OworICAgIENBUkQxNiAgdGhyZXNob2xkIEIxNjsKK30geFB0ckZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggIAljX2NsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOCAgCWNsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDggICAJaWQ7CisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsgCS8qIGZlZWRiYWNrIGxlbmd0aCAgCQkqLworICAgIENBUkQzMglyZXNvbHV0aW9uIEIzMjsKKyAgICBJTlQzMgltaW5fdmFsdWUgQjMyOworICAgIElOVDMyCW1heF92YWx1ZSBCMzI7Cit9IHhJbnRlZ2VyRmVlZGJhY2tTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgCWNfY2xhc3M7ICAJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4ICAJY2xhc3M7ICAJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOCAgIAlpZDsKKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OyAJLyogZmVlZGJhY2sgbGVuZ3RoICAJCSovCisgICAgQ0FSRDE2CW1heF9zeW1ib2xzIEIxNjsKKyAgICBDQVJEMTYJbnVtX3N5bXNfc3VwcG9ydGVkIEIxNjsKK30geFN0cmluZ0ZlZWRiYWNrU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggIAljX2NsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOCAgCWNsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDgJaWQ7CisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsgCS8qIGZlZWRiYWNrIGxlbmd0aCAgCQkqLworICAgIENBUkQ4CXBlcmNlbnQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIENBUkQxNglwaXRjaCBCMTY7CisgICAgQ0FSRDE2CWR1cmF0aW9uIEIxNjsKK30geEJlbGxGZWVkYmFja1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAJY19jbGFzczsgIAkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDggIAljbGFzczsgIAkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4CWlkOworICAgIENBUkQxNiAgCWxlbmd0aCBCMTY7IAkvKiBmZWVkYmFjayBsZW5ndGggIAkJKi8KKyAgICBDQVJEMzIJbGVkX21hc2sgQjMyOworICAgIENBUkQzMglsZWRfdmFsdWVzIEIzMjsKK30geExlZEZlZWRiYWNrU3RhdGU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VGZWVkYmFja0NvbnRyb2wuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogWF9DaGFuZ2VGZWVkYmFja0NvbnRyb2wgIAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJbWFzayBCMzI7CisgICAgQ0FSRDggIAlkZXZpY2VpZDsKKyAgICBDQVJEOCAgCWZlZWRiYWNraWQ7CisgICAgQllURQlwYWQxLCBwYWQyOworfSB4Q2hhbmdlRmVlZGJhY2tDb250cm9sUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAJY19jbGFzczsgIAkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDggIAljbGFzczsgIAkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4ICAJaWQ7IAkJLyogZmVlZGJhY2sgaWQgICAgICAJCSovCisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsgCS8qIGZlZWRiYWNrIGxlbmd0aCAgCQkqLworfSB4RmVlZGJhY2tDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggIAljX2NsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOCAgCWNsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDggIAlpZDsgCQkvKiBmZWVkYmFjayBsZW5ndGggIAkJKi8KKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OyAJLyogZmVlZGJhY2sgbGVuZ3RoICAJCSovCisgICAgS2V5Q29kZSAJa2V5OyAKKyAgICBDQVJEOAlhdXRvX3JlcGVhdF9tb2RlOworICAgIElOVDgJY2xpY2s7CisgICAgSU5UOAlwZXJjZW50OworICAgIElOVDE2CXBpdGNoIEIxNjsKKyAgICBJTlQxNglkdXJhdGlvbiBCMTY7CisgICAgQ0FSRDMyCWxlZF9tYXNrIEIzMjsKKyAgICBDQVJEMzIJbGVkX3ZhbHVlcyBCMzI7Cit9IHhLYmRGZWVkYmFja0N0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgCWNfY2xhc3M7ICAJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4ICAJY2xhc3M7ICAJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOCAgCWlkOyAJCS8qIGZlZWRiYWNrIGlkICAgICAgCQkqLworICAgIENBUkQxNiAgCWxlbmd0aCBCMTY7IAkvKiBmZWVkYmFjayBsZW5ndGggIAkJKi8KKyAgICBDQVJEOCAgCXBhZDEscGFkMjsKKyAgICBJTlQxNgludW0gQjE2OworICAgIElOVDE2CWRlbm9tIEIxNjsKKyAgICBJTlQxNgl0aHJlc2ggQjE2OworfSB4UHRyRmVlZGJhY2tDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggIAljX2NsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOCAgCWNsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDggIAlpZDsgCQkvKiBmZWVkYmFjayBpZCAgICAgIAkJKi8KKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OyAJLyogZmVlZGJhY2sgbGVuZ3RoICAJCSovCisgICAgSU5UMzIJaW50X3RvX2Rpc3BsYXkgQjMyOworfSB4SW50ZWdlckZlZWRiYWNrQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAJY19jbGFzczsgIAkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbHNlCisgICAgQ0FSRDggIAljbGFzczsgIAkvKiBmZWVkYmFjayBjbGFzcyBpZAkJKi8KKyNlbmRpZgorICAgIENBUkQ4ICAJaWQ7IAkJLyogZmVlZGJhY2sgaWQgICAgICAJCSovCisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsgCS8qIGZlZWRiYWNrIGxlbmd0aCAgCQkqLworICAgIENBUkQ4ICAJcGFkMSxwYWQyOworICAgIENBUkQxNgludW1fa2V5c3ltcyBCMTY7Cit9IHhTdHJpbmdGZWVkYmFja0N0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgCWNfY2xhc3M7ICAJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZWxzZQorICAgIENBUkQ4ICAJY2xhc3M7ICAJLyogZmVlZGJhY2sgY2xhc3MgaWQJCSovCisjZW5kaWYKKyAgICBDQVJEOCAgCWlkOyAJCS8qIGZlZWRiYWNrIGlkICAgICAgCQkqLworICAgIENBUkQxNiAgCWxlbmd0aCBCMTY7IAkvKiBmZWVkYmFjayBsZW5ndGggIAkJKi8KKyAgICBJTlQ4CXBlcmNlbnQ7CisgICAgQllURQlwYWQxLCBwYWQyLCBwYWQzOworICAgIElOVDE2CXBpdGNoIEIxNjsKKyAgICBJTlQxNglkdXJhdGlvbiBCMTY7Cit9IHhCZWxsRmVlZGJhY2tDdGw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggIAljX2NsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2Vsc2UKKyAgICBDQVJEOCAgCWNsYXNzOyAgCS8qIGZlZWRiYWNrIGNsYXNzIGlkCQkqLworI2VuZGlmCisgICAgQ0FSRDggIAlpZDsgCQkvKiBmZWVkYmFjayBpZCAgICAgIAkJKi8KKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OyAJLyogZmVlZGJhY2sgbGVuZ3RoICAJCSovCisgICAgQ0FSRDMyCWxlZF9tYXNrIEIzMjsKKyAgICBDQVJEMzIJbGVkX3ZhbHVlcyBCMzI7Cit9IHhMZWRGZWVkYmFja0N0bDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZUtleU1hcHBpbmcuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgIAkvKiBhbHdheXMgWF9HZXREZXZpY2VLZXlNYXBwaW5nICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgCWRldmljZWlkOworICAgIEtleUNvZGUgCWZpcnN0S2V5Q29kZTsgCisgICAgQ0FSRDggCWNvdW50OworICAgIEJZVEUJcGFkMTsKK30geEdldERldmljZUtleU1hcHBpbmdSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgCXJlcFR5cGU7ICAJLyogWF9SZXBseSAJCQkqLworICAgIENBUkQ4ICAJUmVwVHlwZTsgICAgICAgCS8qIGFsd2F5cyBYX0dldERldmljZUtleU1hcHBpbmcgKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDggIAlrZXlTeW1zUGVyS2V5Q29kZTsKKyAgICBDQVJEOCAgCXBhZDA7CisgICAgQ0FSRDE2IAlwYWQxIEIxNjsKKyAgICBDQVJEMzIgCXBhZDIgQjMyOworICAgIENBUkQzMiAJcGFkMyBCMzI7CisgICAgQ0FSRDMyIAlwYWQ0IEIzMjsKKyAgICBDQVJEMzIgCXBhZDUgQjMyOworICAgIENBUkQzMiAJcGFkNiBCMzI7Cit9IHhHZXREZXZpY2VLZXlNYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGFuZ2VEZXZpY2VLZXlNYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggCXJlcVR5cGU7ICAgICAgICAvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZSAgICovCisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9DaGFuZ2VEZXZpY2VLZXlNYXBwaW5nICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgCWRldmljZWlkOworICAgIEtleUNvZGUgCWZpcnN0S2V5Q29kZTsKKyAgICBDQVJEOCAJa2V5U3ltc1BlcktleUNvZGU7CisgICAgQ0FSRDggCWtleUNvZGVzOworfSB4Q2hhbmdlRGV2aWNlS2V5TWFwcGluZ1JlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZU1vZGlmaWVyTWFwcGluZy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXFUeXBlOyAgICAgICAgLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUgICAqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgCWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geEdldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggIAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfR2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nICovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOworICAgIENBUkQ4ICAJbnVtS2V5UGVyTW9kaWZpZXI7CisgICAgQ0FSRDggIAlwYWQwOworICAgIENBUkQxNiAJcGFkMSBCMTY7CisgICAgQ0FSRDMyIAlwYWQyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDMgQjMyOworICAgIENBUkQzMiAJcGFkNCBCMzI7CisgICAgQ0FSRDMyIAlwYWQ1IEIzMjsKKyAgICBDQVJEMzIgCXBhZDYgQjMyOworfSB4R2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VNb2RpZmllck1hcHBpbmcuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVxVHlwZTsgICAgICAgIC8qIGlucHV0IGV4dGVuc2lvbiBtYWpvciBjb2RlICAgKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYX1NldERldmljZU1vZGlmaWVyTWFwcGluZyAqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgIAlkZXZpY2VpZDsKKyAgICBDQVJEOCAgIAludW1LZXlQZXJNb2RpZmllcjsKKyAgICBDQVJEMTYgIAlwYWQxIEIxNjsKK30geFNldERldmljZU1vZGlmaWVyTWFwcGluZ1JlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAJcmVwVHlwZTsgIAkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggIAlSZXBUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfU2V0RGV2aWNlTW9kaWZpZXJNYXBwaW5nICovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOworICAgIENBUkQ4ICAJc3VjY2VzczsKKyAgICBDQVJEOCAgCXBhZDA7CisgICAgQ0FSRDE2IAlwYWQxIEIxNjsKKyAgICBDQVJEMzIgCXBhZDIgQjMyOworICAgIENBUkQzMiAJcGFkMyBCMzI7CisgICAgQ0FSRDMyIAlwYWQ0IEIzMjsKKyAgICBDQVJEMzIgCXBhZDUgQjMyOworICAgIENBUkQzMiAJcGFkNiBCMzI7Cit9IHhTZXREZXZpY2VNb2RpZmllck1hcHBpbmdSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZUJ1dHRvbk1hcHBpbmcuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogWF9HZXREZXZpY2VCdXR0b25NYXBwaW5nICAgICAqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgIAlkZXZpY2VpZDsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7Cit9IHhHZXREZXZpY2VCdXR0b25NYXBwaW5nUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggIAlyZXBUeXBlOyAgCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCAgCVJlcFR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9HZXREZXZpY2VCdXR0b25NYXBwaW5nICovCisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIAlsZW5ndGggQjMyOworICAgIENBUkQ4IAluRWx0czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyIAlwYWQwMSBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMiBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMyBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNCBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNSBCMzI7Cit9IHhHZXREZXZpY2VCdXR0b25NYXBwaW5nUmVwbHk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXREZXZpY2VCdXR0b25NYXBwaW5nLgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgICAgIC8qIFhfU2V0RGV2aWNlQnV0dG9uTWFwcGluZyAgICAgKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgQ0FSRDggICAJZGV2aWNlaWQ7CisgICAgQ0FSRDggICAJbWFwX2xlbmd0aDsKKyAgICBCWVRFCXBhZDEsIHBhZDI7Cit9IHhTZXREZXZpY2VCdXR0b25NYXBwaW5nUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggIAlyZXBUeXBlOyAgCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDggIAlSZXBUeXBlOyAgICAgICAgCS8qIGFsd2F5cyBYX1NldERldmljZUJ1dHRvbk1hcHBpbmcgKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDggCXN0YXR1czsKKyAgICBCWVRFIAlwYWQwOworICAgIENBUkQxNiAJcGFkMSBCMTY7CisgICAgQ0FSRDMyIAlwYWQyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDMgQjMyOworICAgIENBUkQzMiAJcGFkNCBCMzI7CisgICAgQ0FSRDMyIAlwYWQ1IEIzMjsKKyAgICBDQVJEMzIgCXBhZDYgQjMyOworfSB4U2V0RGV2aWNlQnV0dG9uTWFwcGluZ1JlcGx5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUXVlcnlEZXZpY2VTdGF0ZS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9RdWVyeURldmljZVN0YXRlICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQ4ICAgCWRldmljZWlkOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKK30geFF1ZXJ5RGV2aWNlU3RhdGVSZXE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgCXJlcFR5cGU7ICAJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCAgCVJlcFR5cGU7ICAgICAgICAJLyogYWx3YXlzIFhfUXVlcnlEZXZpY2VTdGF0ZQkqLworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOCAJbnVtX2NsYXNzZXM7CisgICAgQllURSAJcGFkMDsKKyAgICBDQVJEMTYgCXBhZDEgQjE2OworICAgIENBUkQzMiAJcGFkMiBCMzI7CisgICAgQ0FSRDMyIAlwYWQzIEIzMjsKKyAgICBDQVJEMzIgCXBhZDQgQjMyOworICAgIENBUkQzMiAJcGFkNSBCMzI7CisgICAgQ0FSRDMyIAlwYWQ2IEIzMjsKK30geFF1ZXJ5RGV2aWNlU3RhdGVSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyAgICBDQVJEOCAgCWNfY2xhc3M7CisjZWxzZQorICAgIENBUkQ4ICAJY2xhc3M7CisjZW5kaWYKKyAgICBDQVJEOCAgCWxlbmd0aDsKKyAgICBDQVJEOAludW1fa2V5czsKKyAgICBCWVRFICAgCXBhZDE7CisgICAgQ0FSRDggIAlrZXlzWzMyXTsKK30geEtleVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQ4ICAJY19jbGFzczsKKyNlbHNlCisgICAgQ0FSRDggIAljbGFzczsKKyNlbmRpZgorICAgIENBUkQ4ICAJbGVuZ3RoOworICAgIENBUkQ4CW51bV9idXR0b25zOworICAgIEJZVEUgICAJcGFkMTsKKyAgICBDQVJEOCAgCWJ1dHRvbnNbMzJdOworfSB4QnV0dG9uU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisgICAgQ0FSRDggIAljX2NsYXNzOworI2Vsc2UKKyAgICBDQVJEOCAgCWNsYXNzOworI2VuZGlmCisgICAgQ0FSRDggIAlsZW5ndGg7CisgICAgQ0FSRDggIAludW1fdmFsdWF0b3JzOworICAgIENBUkQ4CW1vZGU7Cit9IHhWYWx1YXRvclN0YXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2VuZEV4dGVuc2lvbkV2ZW50LgorICogVEhJUyBSRVFVRVNUIE1VU1QgQkUgS0VQVCBBIE1VTFRJUExFIE9GIDggQllURVMgSU4gTEVOR1RIIQorICogTU9SRSBFVkVOVFMgTUFZIEZPTExPVyBBTkQgVEhFWSBNVVNUIEJFIFFVQUQtQUxJR05FRCEKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDggCVJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWF9TZW5kRXh0ZW5zaW9uRXZlbnQgKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgV2luZG93CWRlc3RpbmF0aW9uIEIzMjsKKyAgICBDQVJEOCAgIAlkZXZpY2VpZDsKKyAgICBCT09MICAgCXByb3BhZ2F0ZTsKKyAgICBDQVJEMTYJY291bnQgQjE2OworICAgIENBUkQ4CW51bV9ldmVudHM7CisgICAgQllURQlwYWQxLHBhZDIscGFkMzsKK30geFNlbmRFeHRlbnNpb25FdmVudFJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUJlbGwuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhfRGV2aWNlQmVsbCAqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOCAgIAlkZXZpY2VpZDsKKyAgICBDQVJEOAlmZWVkYmFja2lkOworICAgIENBUkQ4CWZlZWRiYWNrY2xhc3M7CisgICAgSU5UOAlwZXJjZW50OworfSB4RGV2aWNlQmVsbFJlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNldERldmljZVZhbHVhdG9ycy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXFUeXBlOwkvKiBpbnB1dCBleHRlbnNpb24gbWFqb3IgY29kZQkqLworICAgIENBUkQ4IAlSZXFUeXBlOyAgICAgCS8qIGFsd2F5cyBYX1NldERldmljZVZhbHVhdG9ycyAJKi8KKyAgICBDQVJEMTYgCWxlbmd0aCBCMTY7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDggICAgICAgZmlyc3RfdmFsdWF0b3I7CisgICAgQ0FSRDggICAgICAgbnVtX3ZhbHVhdG9yczsKKyAgICBCWVRFIAlwYWQxOworfSB4U2V0RGV2aWNlVmFsdWF0b3JzUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggCXJlcFR5cGU7ICAJLyogWF9SZXBseSAJCQkqLworICAgIENBUkQ4IAlSZXBUeXBlOyAgICAgCS8qIGFsd2F5cyBYX1NldERldmljZVZhbHVhdG9ycyAJKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDggCXN0YXR1czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyIAlwYWQwMSBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMiBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMyBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNCBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNSBCMzI7Cit9IHhTZXREZXZpY2VWYWx1YXRvcnNSZXBseTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldERldmljZUNvbnRyb2wuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgIAkvKiBhbHdheXMgWF9HZXREZXZpY2VDb250cm9sIAkqLworICAgIENBUkQxNiAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEOCAgICAgICBkZXZpY2VpZDsKKyAgICBCWVRFIAlwYWQyOworfSB4R2V0RGV2aWNlQ29udHJvbFJlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4IAlyZXBUeXBlOyAgCS8qIFhfUmVwbHkgCQkJKi8KKyAgICBDQVJEOCAJUmVwVHlwZTsgICAgIAkvKiBhbHdheXMgWF9HZXREZXZpY2VDb250cm9sIAkqLworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOCAJc3RhdHVzOworICAgIEJZVEUJcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIgCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIgCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIgCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIgCXBhZDA1IEIzMjsKK30geEdldERldmljZUNvbnRyb2xSZXBseTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgCWNvbnRyb2wgQjE2OyAJLyogY29udHJvbCB0eXBlICAgICAJIAkqLworICAgIENBUkQxNiAgCWxlbmd0aCBCMTY7IAkvKiBjb250cm9sIGxlbmd0aCAgCQkqLworfSB4RGV2aWNlU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYgIAljb250cm9sIEIxNjsgCQkvKiBjb250cm9sIHR5cGUgICAgIAkgCSovCisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsgCQkvKiBjb250cm9sIGxlbmd0aCAgCQkqLworICAgIENBUkQzMiAgCW51bV92YWx1YXRvcnMgQjMyOyAJLyogbnVtYmVyIG9mIHZhbHVhdG9ycwkJKi8KK30geERldmljZVJlc29sdXRpb25TdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBDQVJEMTYgICAgICAgICBjb250cm9sIEIxNjsKKyAgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsKKyAgICAgSU5UMzIgICAgICAgICAgbWluX3ggQjMyOworICAgICBJTlQzMiAgICAgICAgICBtYXhfeCBCMzI7CisgICAgIElOVDMyICAgICAgICAgIG1pbl95IEIzMjsKKyAgICAgSU5UMzIgICAgICAgICAgbWF4X3kgQjMyOworICAgICBDQVJEMzIgICAgICAgICBmbGlwX3ggQjMyOworICAgICBDQVJEMzIgICAgICAgICBmbGlwX3kgQjMyOworICAgICBDQVJEMzIgICAgICAgICByb3RhdGlvbiBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIGJ1dHRvbl90aHJlc2hvbGQgQjMyOworfSB4RGV2aWNlQWJzQ2FsaWJTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBDQVJEMTYgICAgICAgICBjb250cm9sIEIxNjsKKyAgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsKKyAgICAgQ0FSRDMyICAgICAgICAgb2Zmc2V0X3ggQjMyOworICAgICBDQVJEMzIgICAgICAgICBvZmZzZXRfeSBCMzI7CisgICAgIENBUkQzMiAgICAgICAgIHdpZHRoIEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgaGVpZ2h0IEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgc2NyZWVuIEIzMjsKKyAgICAgQ0FSRDMyICAgICAgICAgZm9sbG93aW5nIEIzMjsKK30geERldmljZUFic0FyZWFTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OyAgICAgICAgICAgIC8qIGNvbnRyb2wgdHlwZSAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggIEIxNjsgICAgICAgICAgICAvKiBjb250cm9sIGxlbmd0aCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDggICAgICAgc3RhdHVzOworICAgIENBUkQ4ICAgICAgIGlzY29yZTsKKyAgICBDQVJEMTYgICAgICBwYWQxIEIxNjsKK30geERldmljZUNvcmVTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OyAgICAgICAgICAgIC8qIGNvbnRyb2wgdHlwZSAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYgICAgICBsZW5ndGggIEIxNjsgICAgICAgICAgICAvKiBjb250cm9sIGxlbmd0aCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDggICAgICAgZW5hYmxlOworICAgIENBUkQ4ICAgICAgIHBhZDA7CisgICAgQ0FSRDE2ICAgICAgcGFkMSBCMTY7Cit9IHhEZXZpY2VFbmFibGVTdGF0ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoYW5nZURldmljZUNvbnRyb2wuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAJcmVxVHlwZTsJLyogaW5wdXQgZXh0ZW5zaW9uIG1ham9yIGNvZGUJKi8KKyAgICBDQVJEOCAJUmVxVHlwZTsgICAgIAkvKiBhbHdheXMgWF9DaGFuZ2VEZXZpY2VDb250cm9sICovCisgICAgQ0FSRDE2IAlsZW5ndGggQjE2OworICAgIENBUkQxNiAgICAgIGNvbnRyb2wgQjE2OworICAgIENBUkQ4ICAgICAgIGRldmljZWlkOworICAgIEJZVEUgICAgICAgIHBhZDA7Cit9IHhDaGFuZ2VEZXZpY2VDb250cm9sUmVxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggCXJlcFR5cGU7ICAJLyogWF9SZXBseSAJCQkqLworICAgIENBUkQ4IAlSZXBUeXBlOyAgICAgCS8qIGFsd2F5cyBYX0NoYW5nZURldmljZUNvbnRyb2wJKi8KKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgCWxlbmd0aCBCMzI7CisgICAgQ0FSRDggCXN0YXR1czsKKyAgICBCWVRFCXBhZDEsIHBhZDIsIHBhZDM7CisgICAgQ0FSRDMyIAlwYWQwMSBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMiBCMzI7CisgICAgQ0FSRDMyIAlwYWQwMyBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNCBCMzI7CisgICAgQ0FSRDMyIAlwYWQwNSBCMzI7Cit9IHhDaGFuZ2VEZXZpY2VDb250cm9sUmVwbHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEMTYgIAljb250cm9sIEIxNjsgCS8qIGNvbnRyb2wgdHlwZSAgICAgCSAJKi8KKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OyAJLyogY29udHJvbCBsZW5ndGggIAkJKi8KK30geERldmljZUN0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgCWNvbnRyb2wgQjE2OyAJCS8qIGNvbnRyb2wgdHlwZSAgICAgCSAJKi8KKyAgICBDQVJEMTYgIAlsZW5ndGggQjE2OyAJCS8qIGNvbnRyb2wgbGVuZ3RoICAJCSovCisgICAgQ0FSRDggIAlmaXJzdF92YWx1YXRvcjsgCS8qIGZpcnN0IHZhbHVhdG9yIHRvIGNoYW5nZSAgICAgKi8KKyAgICBDQVJEOCAgCW51bV92YWx1YXRvcnM7IAkJLyogbnVtYmVyIG9mIHZhbHVhdG9ycyB0byBjaGFuZ2UqLworICAgIENBUkQ4ICAJcGFkMSxwYWQyOworfSB4RGV2aWNlUmVzb2x1dGlvbkN0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICBDQVJEMTYgICAgICAgICBjb250cm9sIEIxNjsKKyAgICAgQ0FSRDE2ICAgICAgICAgbGVuZ3RoIEIxNjsKKyAgICAgSU5UMzIgICAgICAgICAgbWluX3g7CisgICAgIElOVDMyICAgICAgICAgIG1heF94OworICAgICBJTlQzMiAgICAgICAgICBtaW5feTsKKyAgICAgSU5UMzIgICAgICAgICAgbWF4X3k7CisgICAgIENBUkQzMiAgICAgICAgIGZsaXBfeDsKKyAgICAgQ0FSRDMyICAgICAgICAgZmxpcF95OworICAgICBDQVJEMzIgICAgICAgICByb3RhdGlvbjsKKyAgICAgQ0FSRDMyICAgICAgICAgYnV0dG9uX3RocmVzaG9sZDsKK30geERldmljZUFic0NhbGliQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgIENBUkQxNiAgICAgICAgIGNvbnRyb2wgQjE2OworICAgICBDQVJEMTYgICAgICAgICBsZW5ndGggQjE2OworICAgICBDQVJEMzIgICAgICAgICBvZmZzZXRfeDsKKyAgICAgQ0FSRDMyICAgICAgICAgb2Zmc2V0X3k7CisgICAgIElOVDMyICAgICAgICAgIHdpZHRoOworICAgICBJTlQzMiAgICAgICAgICBoZWlnaHQ7CisgICAgIElOVDMyICAgICAgICAgIHNjcmVlbjsKKyAgICAgQ0FSRDMyICAgICAgICAgZm9sbG93aW5nOworfSB4RGV2aWNlQWJzQXJlYUN0bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQxNiAgICAgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEMTYgICAgICAgICAgbGVuZ3RoICBCMTY7CisgICAgQ0FSRDggICAgICAgICAgIHN0YXR1czsKKyAgICBDQVJEOCAgICAgICAgICAgcGFkMDsKKyAgICBDQVJEMTYgICAgICAgICAgcGFkMSBCMTY7Cit9IHhEZXZpY2VDb3JlQ3RsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDE2ICAgICAgICAgIGNvbnRyb2wgQjE2OworICAgIENBUkQxNiAgICAgICAgICBsZW5ndGggIEIxNjsKKyAgICBDQVJEOCAgICAgICAgICAgZW5hYmxlOworICAgIENBUkQ4ICAgICAgICAgICBwYWQwOworICAgIENBUkQxNiAgICAgICAgICBwYWQxIEIxNjsKK30geERldmljZUVuYWJsZUN0bDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnB1dCBleHRlbnNpb24gZXZlbnRzLgorICoKKyAqIERldmljZVZhbHVhdG9yCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUgCXR5cGU7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgS2V5QnV0TWFzayAgZGV2aWNlX3N0YXRlIEIxNjsKKyAgICBDQVJEOAludW1fdmFsdWF0b3JzOworICAgIENBUkQ4ICAgICAgIGZpcnN0X3ZhbHVhdG9yOworICAgIElOVDMyIAl2YWx1YXRvcjAgQjMyOworICAgIElOVDMyIAl2YWx1YXRvcjEgQjMyOworICAgIElOVDMyIAl2YWx1YXRvcjIgQjMyOworICAgIElOVDMyIAl2YWx1YXRvcjMgQjMyOworICAgIElOVDMyIAl2YWx1YXRvcjQgQjMyOworICAgIElOVDMyIAl2YWx1YXRvcjUgQjMyOworICAgIH0gIGRldmljZVZhbHVhdG9yOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZUtleUJ1dHRvblBvaW50ZXIuCisgKgorICogVXNlZCBmb3I6IERldmljZUtleVByZXNzLCBEZXZpY2VLZXlSZWxlYXNlLAorICoJICAgICBEZXZpY2VCdXR0b25QcmVzcywgRGV2aWNlQnV0dG9uUmVsZWFzZSwKKyAqCSAgICAgUHJveGltaXR5SW4sIFByb3hpbWl0eU91dAorICoJICAgICBEZXZpY2VNb3Rpb25Ob3RpZnksCisgKiAKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFIAl0eXBlOworICAgIEJZVEUgICAgICAgIGRldGFpbDsKKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lICAgICAgICB0aW1lIEIzMjsKKyAgICBXaW5kb3cgICAgICByb290IEIzMjsKKyAgICBXaW5kb3cgICAgICBldmVudCBCMzI7CisgICAgV2luZG93ICAgICAgY2hpbGQgQjMyOworICAgIElOVDE2ICAgICAgIHJvb3RfeCBCMTY7CisgICAgSU5UMTYgICAgICAgcm9vdF95IEIxNjsKKyAgICBJTlQxNiAgICAgICBldmVudF94IEIxNjsKKyAgICBJTlQxNiAgICAgICBldmVudF95IEIxNjsKKyAgICBLZXlCdXRNYXNrICBzdGF0ZSBCMTY7CisgICAgQk9PTCAgICAgICAgc2FtZV9zY3JlZW47CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgfSAgZGV2aWNlS2V5QnV0dG9uUG9pbnRlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VGb2N1cy4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURSAJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXRhaWw7CisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZSAgICAgICAgdGltZSBCMzI7CisgICAgV2luZG93ICAgICAgd2luZG93IEIzMjsKKyAgICBCWVRFCW1vZGU7CisgICAgQ0FSRDggICAgICAgZGV2aWNlaWQ7CisgICAgQllURQlwYWQxLCBwYWQyOworICAgIENBUkQzMglwYWQwMCBCMzI7CisgICAgQ0FSRDMyCXBhZDAxIEIzMjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgfSAgZGV2aWNlRm9jdXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGV2aWNlU3RhdGVOb3RpZnkuCisgKgorICogTm90ZSB0aGF0IHRoZSB0d28gaGlnaC1vcmRlciBiaXRzIGluIHRoZSBjbGFzc2VzX3JlcG9ydGVkCisgKiBmaWVsZCBhcmUgdGhlIHByb3hpbWl0eSBzdGF0ZSAoSW5Qcm94aW1pdHkgb3IgT3V0T2ZQcm94aW1pdHkpLAorICogYW5kIHRoZSBkZXZpY2UgbW9kZSAoQWJzb2x1dGUgb3IgUmVsYXRpdmUpLCByZXNwZWN0aXZlbHkuCisgKgorICovCisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIEJZVEUgCXR5cGU7CisgICAgQllURSAgICAgICAgZGV2aWNlaWQ7CisgICAgQ0FSRDE2IAlzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZSAgICAgICAgdGltZSBCMzI7CisgICAgQ0FSRDgJbnVtX2tleXM7CisgICAgQ0FSRDgJbnVtX2J1dHRvbnM7CisgICAgQ0FSRDgJbnVtX3ZhbHVhdG9yczsKKyAgICBDQVJEOCAgICAgICBjbGFzc2VzX3JlcG9ydGVkOworICAgIENBUkQ4ICAgICAgIGJ1dHRvbnNbNF07CisgICAgQ0FSRDggICAgICAga2V5c1s0XTsKKyAgICBJTlQzMgl2YWx1YXRvcjAgQjMyOworICAgIElOVDMyCXZhbHVhdG9yMSBCMzI7CisgICAgSU5UMzIJdmFsdWF0b3IyIEIzMjsKKyAgICB9ICBkZXZpY2VTdGF0ZU5vdGlmeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VLZXlTdGF0ZU5vdGlmeS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURSAJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEOCAgICAgICBrZXlzWzI4XTsKKyAgICB9ICBkZXZpY2VLZXlTdGF0ZU5vdGlmeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VCdXR0b25TdGF0ZU5vdGlmeS4KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQllURSAJdHlwZTsKKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYgCXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEOCAgICAgICBidXR0b25zWzI4XTsKKyAgICB9ICBkZXZpY2VCdXR0b25TdGF0ZU5vdGlmeTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZpY2VNYXBwaW5nTm90aWZ5LgorICogRmllbGRzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggY29yZSBtYXBwaW5nbm90aWZ5IGV2ZW50LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFIAl0eXBlOworICAgIEJZVEUgICAgICAgIGRldmljZWlkOworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQ4ICAgICAgIHJlcXVlc3Q7CisgICAgS2V5Q29kZSAgICAgZmlyc3RLZXlDb2RlOworICAgIENBUkQ4ICAgICAgIGNvdW50OworICAgIEJZVEUgICAgICAgIHBhZDE7CisgICAgVGltZSAgICAgICAgdGltZSBCMzI7CisgICAgQ0FSRDMyCXBhZDAwIEIzMjsKKyAgICBDQVJEMzIJcGFkMDEgQjMyOworICAgIENBUkQzMglwYWQwMiBCMzI7CisgICAgQ0FSRDMyCXBhZDAzIEIzMjsKKyAgICBDQVJEMzIJcGFkMDQgQjMyOworICAgIH0gIGRldmljZU1hcHBpbmdOb3RpZnk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbmdlRGV2aWNlTm90aWZ5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFIAl0eXBlOworICAgIEJZVEUgICAgICAgIGRldmljZWlkOworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIENBUkQ4ICAgICAgIHJlcXVlc3Q7CisgICAgQllURSAgICAgICAgcGFkMSwgcGFkMiwgcGFkMzsKKyAgICBDQVJEMzIJcGFkMDAgQjMyOworICAgIENBUkQzMglwYWQwMSBCMzI7CisgICAgQ0FSRDMyCXBhZDAyIEIzMjsKKyAgICBDQVJEMzIJcGFkMDMgQjMyOworICAgIENBUkQzMglwYWQwNCBCMzI7CisgICAgfSAgY2hhbmdlRGV2aWNlTm90aWZ5OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRldmljZVByZXNlbmNlTm90aWZ5LgorICoKKyAqLworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCWVRFIAl0eXBlOworICAgIEJZVEUgICAgICAgIHBhZDAwOworICAgIENBUkQxNiAJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFRpbWUgICAgICAgIHRpbWUgQjMyOworICAgIEJZVEUgICAgICAgIGRldmNoYW5nZTsgLyogRGV2aWNle0FkZGVkfFJlbW92ZWR8RW5hYmxlZHxEaXNhYmxlZH0gKi8KKyAgICBCWVRFICAgICAgICBkZXZpY2VpZDsKKyAgICBDQVJEMTYgICAgICBjb250cm9sIEIxNjsKKyAgICBDQVJEMzIJcGFkMDIgQjMyOworICAgIENBUkQzMglwYWQwMyBCMzI7CisgICAgQ0FSRDMyCXBhZDA0IEIzMjsKKyAgICBDQVJEMzIJcGFkMDUgQjMyOworICAgIENBUkQzMglwYWQwNiBCMzI7CisgICAgfSAgZGV2aWNlUHJlc2VuY2VOb3RpZnk7CisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBUaW1lCisjdW5kZWYgS2V5Q29kZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTUzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQi5oCkBAIC0wLDAgKzEsNzg4IEBACisvKiAkWG9yZzogWEtCLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZSAKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgCitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIAorU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSAKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIAorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YS0IuaCx2IDEuNXRzaSBFeHAgJCAqLworCisjaWZuZGVmIF9YS0JfSF8KKyNkZWZpbmUJX1hLQl9IXworCisgICAgLyoKKyAgICAgKiBYS0IgcmVxdWVzdCBjb2RlcywgdXNlZCBpbjoKKyAgICAgKiAgLSAgeGtiUmVxVHlwZSBmaWVsZCBvZiBhbGwgcmVxdWVzdHMKKyAgICAgKiAgLSAgcmVxdWVzdE1pbm9yIGZpZWxkIG9mIHNvbWUgZXZlbnRzCisgICAgICovCisjZGVmaW5lCVhfa2JVc2VFeHRlbnNpb24JCSAwCisjZGVmaW5lCVhfa2JTZWxlY3RFdmVudHMJIAkgMQorI2RlZmluZQlYX2tiQmVsbAkJCSAzCisjZGVmaW5lCVhfa2JHZXRTdGF0ZQkJCSA0CisjZGVmaW5lCVhfa2JMYXRjaExvY2tTdGF0ZQkJIDUKKyNkZWZpbmUJWF9rYkdldENvbnRyb2xzCQkJIDYKKyNkZWZpbmUJWF9rYlNldENvbnRyb2xzCQkJIDcKKyNkZWZpbmUJWF9rYkdldE1hcAkJCSA4CisjZGVmaW5lCVhfa2JTZXRNYXAJCQkgOQorI2RlZmluZQlYX2tiR2V0Q29tcGF0TWFwCQkxMAorI2RlZmluZQlYX2tiU2V0Q29tcGF0TWFwCQkxMQorI2RlZmluZQlYX2tiR2V0SW5kaWNhdG9yU3RhdGUJCTEyCisjZGVmaW5lCVhfa2JHZXRJbmRpY2F0b3JNYXAJCTEzCisjZGVmaW5lCVhfa2JTZXRJbmRpY2F0b3JNYXAJCTE0CisjZGVmaW5lCVhfa2JHZXROYW1lZEluZGljYXRvcgkJMTUKKyNkZWZpbmUJWF9rYlNldE5hbWVkSW5kaWNhdG9yCQkxNgorI2RlZmluZQlYX2tiR2V0TmFtZXMJCQkxNworI2RlZmluZQlYX2tiU2V0TmFtZXMJCQkxOAorI2RlZmluZQlYX2tiR2V0R2VvbWV0cnkJCQkxOQorI2RlZmluZQlYX2tiU2V0R2VvbWV0cnkJCQkyMAorI2RlZmluZQlYX2tiUGVyQ2xpZW50RmxhZ3MJCTIxCisjZGVmaW5lCVhfa2JMaXN0Q29tcG9uZW50cwkJMjIKKyNkZWZpbmUJWF9rYkdldEtiZEJ5TmFtZQkJMjMKKyNkZWZpbmUJWF9rYkdldERldmljZUluZm8JCTI0CisjZGVmaW5lCVhfa2JTZXREZXZpY2VJbmZvCQkyNQorI2RlZmluZQlYX2tiU2V0RGVidWdnaW5nRmxhZ3MJCTEwMQorCisgICAgLyoKKyAgICAgKiBJbiB0aGUgWCBzZW5zZSwgWEtCIHJlcG9ydHMgb25seSBvbmUgZXZlbnQuCisgICAgICogVGhlIHR5cGUgZmllbGQgb2YgYWxsIFhLQiBldmVudHMgaXMgWGtiRXZlbnRDb2RlCisgICAgICovCisjZGVmaW5lCVhrYkV2ZW50Q29kZQkJCTAKKyNkZWZpbmUJWGtiTnVtYmVyRXZlbnRzCQkJKFhrYkV2ZW50Q29kZSsxKQorCisgICAgLyoKKyAgICAgKiBYS0IgaGFzIGEgbWlub3IgZXZlbnQgY29kZSBzbyBpdCBjYW4gdXNlIG9uZSBYIGV2ZW50IGNvZGUgZm9yIAorICAgICAqIG11bHRpcGxlIHB1cnBvc2VzLiAgCisgICAgICogIC0gcmVwb3J0ZWQgaW4gdGhlIHhrYlR5cGUgZmllbGQgb2YgYWxsIFhLQiBldmVudHMuCisgICAgICogIC0gWGtiU2VsZWN0RXZlbnREZXRhaWxzOiBJbmRpY2F0ZXMgdGhlIGV2ZW50IGZvciB3aGljaCBldmVudCBkZXRhaWxzIAorICAgICAqICAgIGFyZSBiZWluZyBjaGFuZ2VkCisgICAgICovCisjZGVmaW5lCVhrYk5ld0tleWJvYXJkTm90aWZ5CQkwCisjZGVmaW5lIFhrYk1hcE5vdGlmeQkJCTEKKyNkZWZpbmUJWGtiU3RhdGVOb3RpZnkJCQkyCisjZGVmaW5lIFhrYkNvbnRyb2xzTm90aWZ5CQkzCisjZGVmaW5lCVhrYkluZGljYXRvclN0YXRlTm90aWZ5CQk0CisjZGVmaW5lCVhrYkluZGljYXRvck1hcE5vdGlmeQkJNQorI2RlZmluZQlYa2JOYW1lc05vdGlmeQkJCTYKKyNkZWZpbmUgWGtiQ29tcGF0TWFwTm90aWZ5CQk3CisjZGVmaW5lCVhrYkJlbGxOb3RpZnkJCQk4CisjZGVmaW5lCVhrYkFjdGlvbk1lc3NhZ2UJCTkKKyNkZWZpbmUJWGtiQWNjZXNzWE5vdGlmeQkJMTAKKyNkZWZpbmUJWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5CTExCisKKyAgICAvKgorICAgICAqIEV2ZW50IE1hc2s6CisgICAgICogIC0gWGtiU2VsZWN0RXZlbnRzOiAgU3BlY2lmaWVzIGV2ZW50IGludGVyZXN0LgorICAgICAqLworI2RlZmluZQlYa2JOZXdLZXlib2FyZE5vdGlmeU1hc2sJKDFMIDw8IDApCisjZGVmaW5lIFhrYk1hcE5vdGlmeU1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JTdGF0ZU5vdGlmeU1hc2sJCSgxTCA8PCAyKQorI2RlZmluZSBYa2JDb250cm9sc05vdGlmeU1hc2sJCSgxTCA8PCAzKQorI2RlZmluZQlYa2JJbmRpY2F0b3JTdGF0ZU5vdGlmeU1hc2sJKDFMIDw8IDQpCisjZGVmaW5lCVhrYkluZGljYXRvck1hcE5vdGlmeU1hc2sJKDFMIDw8IDUpCisjZGVmaW5lCVhrYk5hbWVzTm90aWZ5TWFzawkJKDFMIDw8IDYpCisjZGVmaW5lIFhrYkNvbXBhdE1hcE5vdGlmeU1hc2sJCSgxTCA8PCA3KQorI2RlZmluZQlYa2JCZWxsTm90aWZ5TWFzawkJKDFMIDw8IDgpCisjZGVmaW5lCVhrYkFjdGlvbk1lc3NhZ2VNYXNrCQkoMUwgPDwgOSkKKyNkZWZpbmUJWGtiQWNjZXNzWE5vdGlmeU1hc2sJCSgxTCA8PCAxMCkKKyNkZWZpbmUJWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5TWFzawkoMUwgPDwgMTEpCisjZGVmaW5lCVhrYkFsbEV2ZW50c01hc2sJCSgweEZGRikKKworICAgIC8qCisgICAgICogTmV3S2V5Ym9hcmROb3RpZnkgZXZlbnQgZGV0YWlsczoKKyAgICAgKi8KKyNkZWZpbmUJWGtiTktOX0tleWNvZGVzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYk5LTl9HZW9tZXRyeU1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JOS05fRGV2aWNlSURNYXNrCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiQWxsTmV3S2V5Ym9hcmRFdmVudHNNYXNrCSgweDcpCisKKyAgICAvKgorICAgICAqIEFjY2Vzc1hOb3RpZnkgZXZlbnQgdHlwZXM6CisgICAgICogIC0gVGhlICd3aGF0JyBmaWVsZCBvZiBBY2Nlc3NYTm90aWZ5IGV2ZW50cyByZXBvcnRzIHRoZQorICAgICAqICAgIHJlYXNvbiB0aGF0IHRoZSBldmVudCB3YXMgZ2VuZXJhdGVkLgorICAgICAqLworI2RlZmluZQlYa2JBWE5fU0tQcmVzcwkJCTAKKyNkZWZpbmUJWGtiQVhOX1NLQWNjZXB0CQkJMQorI2RlZmluZQlYa2JBWE5fU0tSZWplY3QJCQkyCisjZGVmaW5lCVhrYkFYTl9TS1JlbGVhc2UJCTMKKyNkZWZpbmUJWGtiQVhOX0JLQWNjZXB0CQkJNAorI2RlZmluZQlYa2JBWE5fQktSZWplY3QJCQk1CisjZGVmaW5lCVhrYkFYTl9BWEtXYXJuaW5nCQk2CisKKyAgICAvKgorICAgICAqIEFjY2Vzc1hOb3RpZnkgZGV0YWlsczoKKyAgICAgKiAtIFVzZWQgYXMgYW4gZXZlbnQgZGV0YWlsIG1hc2sgdG8gbGltaXQgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2gKKyAgICAgKiAgIEFjY2Vzc1hOb3RpZnkgZXZlbnRzIGFyZSByZXBvcnRlZAorICAgICAqLworI2RlZmluZQlYa2JBWE5fU0tQcmVzc01hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JBWE5fU0tBY2NlcHRNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiQVhOX1NLUmVqZWN0TWFzawkJKDFMIDw8IDIpCisjZGVmaW5lCVhrYkFYTl9TS1JlbGVhc2VNYXNrCQkoMUwgPDwgMykKKyNkZWZpbmUJWGtiQVhOX0JLQWNjZXB0TWFzawkJKDFMIDw8IDQpCisjZGVmaW5lCVhrYkFYTl9CS1JlamVjdE1hc2sJCSgxTCA8PCA1KQorI2RlZmluZQlYa2JBWE5fQVhLV2FybmluZ01hc2sJCSgxTCA8PCA2KQorI2RlZmluZQlYa2JBbGxBY2Nlc3NYRXZlbnRzTWFzawkJKDB4ZikKKworICAgIC8qCisgICAgICogTWlzY2VsbGFuZW91cyBldmVudCBkZXRhaWxzOgorICAgICAqIC0gZXZlbnQgZGV0YWlsIG1hc2tzIGZvciBhc3NvcnRlZCBldmVudHMgdGhhdCBkb24ndCByZWFsbAorICAgICAqICAgaGF2ZSBhbnkgZGV0YWlscy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiQWxsU3RhdGVFdmVudHNNYXNrCQlYa2JBbGxTdGF0ZUNvbXBvbmVudHNNYXNrCisjZGVmaW5lCVhrYkFsbE1hcEV2ZW50c01hc2sJCVhrYkFsbE1hcENvbXBvbmVudHNNYXNrCisjZGVmaW5lCVhrYkFsbENvbnRyb2xFdmVudHNNYXNrCQlYa2JBbGxDb250cm9sc01hc2sKKyNkZWZpbmUJWGtiQWxsSW5kaWNhdG9yRXZlbnRzTWFzawlYa2JBbGxJbmRpY2F0b3JzTWFzaworI2RlZmluZQlYa2JBbGxOYW1lRXZlbnRzTWFzawkJWGtiQWxsTmFtZXNNYXNrCisjZGVmaW5lCVhrYkFsbENvbXBhdE1hcEV2ZW50c01hc2sJWGtiQWxsQ29tcGF0TWFzaworI2RlZmluZQlYa2JBbGxCZWxsRXZlbnRzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYkFsbEFjdGlvbk1lc3NhZ2VzTWFzawkoMUwgPDwgMCkKKworICAgIC8qCisgICAgICogWEtCIHJlcG9ydHMgb25lIGVycm9yOiAgQmFkS2V5Ym9hcmQKKyAgICAgKiBBIGZ1cnRoZXIgcmVhc29uIGZvciB0aGUgZXJyb3IgaXMgZW5jb2RlZCBpbnRvIHRvIG1vc3Qgc2lnbmlmaWNhbnQKKyAgICAgKiBieXRlIG9mIHRoZSByZXNvdXJjZUlEIGZvciB0aGUgZXJyb3I6CisgICAgICogICAgWGtiRXJyX0JhZERldmljZSAtIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24gd2FzIG5vdCBmb3VuZAorICAgICAqICAgIFhrYkVycl9CYWRDbGFzcyAgLSB0aGUgZGV2aWNlIHdhcyBmb3VuZCBidXQgaXQgZG9lc24ndCBiZWxvbmcgdG8gCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBjbGFzcy4KKyAgICAgKiAgICBYa2JFcnJfQmFkSWQgICAgIC0gdGhlIGRldmljZSB3YXMgZm91bmQgYW5kIGJlbG9uZ3MgdG8gdGhlIHJpZ2h0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBidXQgbm90IGZlZWRiYWNrIHdpdGggYSBtYXRjaGluZyBpZCB3YXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuCisgICAgICogVGhlIGxvdyBieXRlIG9mIHRoZSByZXNvdXJjZUlEIGZvciB0aGlzIGVycm9yIGNvbnRhaW5zIHRoZSBkZXZpY2UKKyAgICAgKiBpZCwgY2xhc3Mgc3BlY2lmaWVyIG9yIGZlZWRiYWNrIGlkIHRoYXQgZmFpbGVkLgorICAgICAqLworI2RlZmluZQlYa2JLZXlib2FyZAkJCTAKKyNkZWZpbmUJWGtiTnVtYmVyRXJyb3JzCQkJMQorCisjZGVmaW5lCVhrYkVycl9CYWREZXZpY2UJMHhmZgorI2RlZmluZQlYa2JFcnJfQmFkQ2xhc3MJCTB4ZmUKKyNkZWZpbmUJWGtiRXJyX0JhZElkCQkweGZkCisKKyAgICAvKgorICAgICAqIEtleWJvYXJkIENvbXBvbmVudHMgTWFzazoKKyAgICAgKiAtIFNwZWNpZmllcyB0aGUgY29tcG9uZW50cyB0aGF0IGZvbGxvdyBhIEdldEtleWJvYXJkQnlOYW1lUmVwbHkKKyAgICAgKi8KKyNkZWZpbmUJWGtiQ2xpZW50TWFwTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYlNlcnZlck1hcE1hc2sJCSgxTCA8PCAxKQorI2RlZmluZQlYa2JDb21wYXRNYXBNYXNrCQkoMUwgPDwgMikKKyNkZWZpbmUJWGtiSW5kaWNhdG9yTWFwTWFzawkJKDFMIDw8IDMpCisjZGVmaW5lCVhrYk5hbWVzTWFzawkJCSgxTCA8PCA0KQorI2RlZmluZQlYa2JHZW9tZXRyeU1hc2sJCQkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiQ29udHJvbHNNYXNrCQkJKDFMIDw8IDYpCisjZGVmaW5lCVhrYkFsbENvbXBvbmVudHNNYXNrCQkoMHg3ZikKKworICAgIC8qCisgICAgICogU3RhdGUgZGV0YWlsIG1hc2s6CisgICAgICogIC0gVGhlICdjaGFuZ2VkJyBmaWVsZCBvZiBTdGF0ZU5vdGlmeSBldmVudHMgcmVwb3J0cyB3aGljaCBvZgorICAgICAqICAgIHRoZSBrZXlib2FyZCBzdGF0ZSBjb21wb25lbnRzIGhhdmUgY2hhbmdlZC4KKyAgICAgKiAgLSBVc2VkIGFzIGFuIGV2ZW50IGRldGFpbCBtYXNrIHRvIGxpbWl0IHRoZSBjb25kaXRpb25zIHVuZGVyCisgICAgICogICAgd2hpY2ggU3RhdGVOb3RpZnkgZXZlbnRzIGFyZSByZXBvcnRlZC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiTW9kaWZpZXJTdGF0ZU1hc2sJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JNb2RpZmllckJhc2VNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiTW9kaWZpZXJMYXRjaE1hc2sJCSgxTCA8PCAyKQorI2RlZmluZQlYa2JNb2RpZmllckxvY2tNYXNrCQkoMUwgPDwgMykKKyNkZWZpbmUJWGtiR3JvdXBTdGF0ZU1hc2sJCSgxTCA8PCA0KQorI2RlZmluZQlYa2JHcm91cEJhc2VNYXNrCQkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiR3JvdXBMYXRjaE1hc2sJCSgxTCA8PCA2KQorI2RlZmluZSBYa2JHcm91cExvY2tNYXNrCQkoMUwgPDwgNykKKyNkZWZpbmUJWGtiQ29tcGF0U3RhdGVNYXNrCQkoMUwgPDwgOCkKKyNkZWZpbmUJWGtiR3JhYk1vZHNNYXNrCQkJKDFMIDw8IDkpCisjZGVmaW5lCVhrYkNvbXBhdEdyYWJNb2RzTWFzawkJKDFMIDw8IDEwKQorI2RlZmluZQlYa2JMb29rdXBNb2RzTWFzawkJKDFMIDw8IDExKQorI2RlZmluZQlYa2JDb21wYXRMb29rdXBNb2RzTWFzawkJKDFMIDw8IDEyKQorI2RlZmluZQlYa2JQb2ludGVyQnV0dG9uTWFzawkJKDFMIDw8IDEzKQorI2RlZmluZQlYa2JBbGxTdGF0ZUNvbXBvbmVudHNNYXNrCSgweDNmZmYpCisKKyAgICAvKgorICAgICAqIENvbnRyb2xzIGRldGFpbCBtYXNrczoKKyAgICAgKiAgVGhlIGNvbnRyb2xzIHNwZWNpZmllZCBpbiBYa2JBbGxDb250cm9sc01hc2s6CisgICAgICogIC0gVGhlICdjaGFuZ2VkJyBmaWVsZCBvZiBDb250cm9sc05vdGlmeSBldmVudHMgcmVwb3J0cyB3aGljaCBvZiAKKyAgICAgKiAgICB0aGUga2V5Ym9hcmQgY29udHJvbHMgaGF2ZSBjaGFuZ2VkLgorICAgICAqICAtIFRoZSAnY2hhbmdlQ29udHJvbHMnIGZpZWxkIG9mIHRoZSBTZXRDb250cm9scyByZXF1ZXN0IHNwZWNpZmllcworICAgICAqICAgIHRoZSBjb250cm9scyBmb3Igd2hpY2ggdmFsdWVzIGFyZSB0byBiZSBjaGFuZ2VkLgorICAgICAqICAtIFVzZWQgYXMgYW4gZXZlbnQgZGV0YWlsIG1hc2sgdG8gbGltaXQgdGhlIGNvbmRpdGlvbnMgdW5kZXIgCisgICAgICogICAgd2hpY2ggQ29udHJvbHNOb3RpZnkgZXZlbnRzIGFyZSByZXBvcnRlZC4KKyAgICAgKgorICAgICAqICBUaGUgY29udHJvbHMgc3BlY2lmaWVkIGluIHRoZSBYa2JBbGxCb29sZWFuQ3RybHNNYXNrOgorICAgICAqICAtIFRoZSAnZW5hYmxlZENvbnRyb2xzJyBmaWVsZCBvZiBDb250cm9sc05vdGlmeSBldmVudHMgcmVwb3J0cyB0aGUKKyAgICAgKiAgICBjdXJyZW50IHN0YXR1cyBvZiB0aGUgYm9vbGVhbiBjb250cm9scy4KKyAgICAgKiAgLSBUaGUgJ2VuYWJsZWRDb250cm9sc0NoYW5nZXMnIGZpZWxkIG9mIENvbnRyb2xzTm90aWZ5IGV2ZW50cyByZXBvcnRzCisgICAgICogICAgYW55IGJvb2xlYW4gY29udHJvbHMgdGhhdCBoYXZlIGJlZW4gdHVybmVkIG9uIG9yIG9mZi4KKyAgICAgKiAgLSBUaGUgJ2FmZmVjdEVuYWJsZWRDb250cm9scycgYW5kICdlbmFibGVkQ29udHJvbHMnIGZpZWxkcyBvZiB0aGUKKyAgICAgKiAgICBrYlNldENvbnRyb2xzIHJlcXVlc3QgY2hhbmdlIHRoZSBzZXQgb2YgZW5hYmxlZCBjb250cm9scy4KKyAgICAgKiAgLSBUaGUgJ2FjY2Vzc1hUaW1lb3V0TWFzaycgYW5kICdhY2Nlc3NYVGltZW91dFZhbHVlcycgZmllbGRzIG9mCisgICAgICogICAgYW4gWGtiQ29udHJvbHNSZWMgc3BlY2lmeSB0aGUgY29udHJvbHMgdG8gYmUgY2hhbmdlZCBpZiB0aGUga2V5Ym9hcmQKKyAgICAgKiAgICB0aW1lcyBvdXQgYW5kIHRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhleSBzaG91bGQgYmUgY2hhbmdlZC4KKyAgICAgKiAgLSBUaGUgJ2F1dG9DdHJscycgYW5kICdhdXRvQ3RybHNWYWx1ZXMnIGZpZWxkcyBvZiB0aGUgUGVyQ2xpZW50RmxhZ3MgCisgICAgICogICAgcmVxdWVzdCBzcGVjaWZpZXMgdGhlIHNwZWNpZnkgdGhlIGNvbnRyb2xzIHRvIGJlIHJlc2V0IHdoZW4gdGhlCisgICAgICogICAgY2xpZW50IGV4aXRzIGFuZCB0aGUgdmFsdWVzIHRvIHdoaWNoIHRoZXkgc2hvdWxkIGJlIHJlc2V0LgorICAgICAqICAtIFRoZSAnY3RybHMnIGZpZWxkIG9mIGFuIGluZGljYXRvciBtYXAgc3BlY2lmaWVzIHRoZSBjb250cm9scworICAgICAqICAgIHRoYXQgZHJpdmUgdGhlIGluZGljYXRvci4KKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIGJvb2xlYW4gY29udHJvbHMgYWZmZWN0ZWQgYnkgdGhlIFNldENvbnRyb2xzIGFuZAorICAgICAqICAgIExvY2tDb250cm9scyBrZXkgYWN0aW9ucy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiUmVwZWF0S2V5c01hc2sJICgxTCA8PCAwKQorI2RlZmluZQlYa2JTbG93S2V5c01hc2sJCSAoMUwgPDwgMSkKKyNkZWZpbmUJWGtiQm91bmNlS2V5c01hc2sJICgxTCA8PCAyKQorI2RlZmluZQlYa2JTdGlja3lLZXlzTWFzawkgKDFMIDw8IDMpCisjZGVmaW5lCVhrYk1vdXNlS2V5c01hc2sJICgxTCA8PCA0KQorI2RlZmluZQlYa2JNb3VzZUtleXNBY2NlbE1hc2sJICgxTCA8PCA1KQorI2RlZmluZQlYa2JBY2Nlc3NYS2V5c01hc2sJICgxTCA8PCA2KQorI2RlZmluZQlYa2JBY2Nlc3NYVGltZW91dE1hc2sJICgxTCA8PCA3KQorI2RlZmluZQlYa2JBY2Nlc3NYRmVlZGJhY2tNYXNrCSAoMUwgPDwgOCkKKyNkZWZpbmUJWGtiQXVkaWJsZUJlbGxNYXNrCSAoMUwgPDwgOSkKKyNkZWZpbmUJWGtiT3ZlcmxheTFNYXNrCQkgKDFMIDw8IDEwKQorI2RlZmluZQlYa2JPdmVybGF5Mk1hc2sJCSAoMUwgPDwgMTEpCisjZGVmaW5lCVhrYklnbm9yZUdyb3VwTG9ja01hc2sJICgxTCA8PCAxMikKKyNkZWZpbmUJWGtiR3JvdXBzV3JhcE1hc2sJICgxTCA8PCAyNykKKyNkZWZpbmUJWGtiSW50ZXJuYWxNb2RzTWFzawkgKDFMIDw8IDI4KQorI2RlZmluZQlYa2JJZ25vcmVMb2NrTW9kc01hc2sJICgxTCA8PCAyOSkKKyNkZWZpbmUJWGtiUGVyS2V5UmVwZWF0TWFzawkgKDFMIDw8IDMwKQorI2RlZmluZQlYa2JDb250cm9sc0VuYWJsZWRNYXNrCSAoMUwgPDwgMzEpCisKKyNkZWZpbmUJWGtiQWNjZXNzWE9wdGlvbnNNYXNrICAgIChYa2JTdGlja3lLZXlzTWFza3xYa2JBY2Nlc3NYRmVlZGJhY2tNYXNrKQorCisjZGVmaW5lCVhrYkFsbEJvb2xlYW5DdHJsc01hc2sJICgweDAwMDAxRkZGKQorI2RlZmluZQlYa2JBbGxDb250cm9sc01hc2sJICgweEY4MDAxRkZGKQorI2RlZmluZQlYa2JBbGxDb250cm9sRXZlbnRzTWFzawkgWGtiQWxsQ29udHJvbHNNYXNrCisKKyAgICAvKgorICAgICAqIEFjY2Vzc1ggT3B0aW9ucyBNYXNrCisgICAgICogIC0gVGhlICdhY2Nlc3NYT3B0aW9ucycgZmllbGQgb2YgYW4gWGtiQ29udHJvbHNSZWMgc3BlY2lmaWVzIHRoZQorICAgICAqICAgIEFjY2Vzc1ggb3B0aW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gZWZmZWN0LgorICAgICAqICAtIFRoZSAnYWNjZXNzWFRpbWVvdXRPcHRpb25zTWFzaycgYW5kICdhY2Nlc3NYVGltZW91dE9wdGlvbnNWYWx1ZXMnCisgICAgICogICAgZmllbGRzIG9mIGFuIFhrYkNvbnRyb2xzUmVjIHNwZWNpZnkgdGhlIEFjY2VzcyBYIG9wdGlvbnMgdG8gYmUgCisgICAgICogICAgY2hhbmdlZCBpZiB0aGUga2V5Ym9hcmQgdGltZXMgb3V0IGFuZCB0aGUgdmFsdWVzIHRvIHdoaWNoIHRoZXkgCisgICAgICogICAgc2hvdWxkIGJlIGNoYW5nZWQuCisgICAgICovCisjZGVmaW5lCVhrYkFYX1NLUHJlc3NGQk1hc2sJKDFMIDw8IDApCisjZGVmaW5lCVhrYkFYX1NLQWNjZXB0RkJNYXNrCSgxTCA8PCAxKQorI2RlZmluZQlYa2JBWF9GZWF0dXJlRkJNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JBWF9TbG93V2FybkZCTWFzawkoMUwgPDwgMykKKyNkZWZpbmUJWGtiQVhfSW5kaWNhdG9yRkJNYXNrCSgxTCA8PCA0KQorI2RlZmluZQlYa2JBWF9TdGlja3lLZXlzRkJNYXNrCSgxTCA8PCA1KQorI2RlZmluZQlYa2JBWF9Ud29LZXlzTWFzawkoMUwgPDwgNikKKyNkZWZpbmUJWGtiQVhfTGF0Y2hUb0xvY2tNYXNrCSgxTCA8PCA3KQorI2RlZmluZQlYa2JBWF9TS1JlbGVhc2VGQk1hc2sJKDFMIDw8IDgpCisjZGVmaW5lCVhrYkFYX1NLUmVqZWN0RkJNYXNrCSgxTCA8PCA5KQorI2RlZmluZQlYa2JBWF9CS1JlamVjdEZCTWFzawkoMUwgPDwgMTApCisjZGVmaW5lCVhrYkFYX0R1bWJCZWxsRkJNYXNrCSgxTCA8PCAxMSkKKyNkZWZpbmUJWGtiQVhfRkJPcHRpb25zTWFzawkoMHhGM0YpCisjZGVmaW5lCVhrYkFYX1NLT3B0aW9uc01hc2sJKDB4MEMwKQorI2RlZmluZQlYa2JBWF9BbGxPcHRpb25zTWFzawkoMHhGRkYpCisKKyAgICAvKgorICAgICAqIFhrYlVzZUNvcmVLYmQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb3JlIGtleWJvYXJkIHdpdGhvdXQgaGF2aW5nCisgICAgICogCQkJdG8gbG9vayB1cCBpdHMgWCBpbnB1dCBleHRlbnNpb24gaWRlbnRpZmllci4KKyAgICAgKiBYa2JVc2VDb3JlUHRyIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29yZSBwb2ludGVyIHdpdGhvdXQgaGF2aW5nCisgICAgICoJCQl0byBsb29rIHVwIGl0cyBYIGlucHV0IGV4dGVuc2lvbiBpZGVudGlmaWVyLgorICAgICAqIFhrYkRmbHRYSUNsYXNzIGlzIHVzZWQgdG8gc3BlY2lmeSAiZG9uJ3QgY2FyZSIgYW55IHBsYWNlIHRoYXQgdGhlCisgICAgICoJCQlYS0IgcHJvdG9jb2wgaXMgbG9va2luZyBmb3IgYW4gWCBJbnB1dCBFeHRlbnNpb24gCisgICAgICoJCQlkZXZpY2UgY2xhc3MuCisgICAgICogWGtiRGZsdFhJSWQgaXMgdXNlZCB0byBzcGVjaWZ5ICJkb24ndCBjYXJlIiBhbnkgcGxhY2UgdGhhdCB0aGUKKyAgICAgKgkJCVhLQiBwcm90b2NvbCBpcyBsb29raW5nIGZvciBhbiBYIElucHV0IEV4dGVuc2lvbgorICAgICAqCQkJZmVlZGJhY2sgaWRlbnRpZmllci4KKyAgICAgKiBYa2JBbGxYSUNsYXNzZXMgaXMgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGRldmljZSBpbmRpY2F0b3JzLAorICAgICAqCQkJd2hldGhlciB0aGV5J3JlIHBhcnQgb2YgdGhlIGluZGljYXRvciBmZWVkYmFjayBjbGFzcworICAgICAqCQkJb3IgdGhlIGtleWJvYXJkIGZlZWRiYWNrIGNsYXNzLgorICAgICAqIFhrYkFsbFhJSWRzIGlzIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCBkZXZpY2UgaW5kaWNhdG9yCisgICAgICoJCQlmZWVkYmFja3Mgd2l0aG91dCBoYXZpbmcgdG8gbGlzdCB0aGVtLgorICAgICAqIFhrYlhJTm9uZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gY2xhc3Mgb3IgaWQgaGFzIGJlZW4gc3BlY2lmaWVkLgorICAgICAqIFhrYkxlZ2FsWElMZWRDbGFzcyhjKSAgVHJ1ZSBpZiAnYycgc3BlY2lmaWVzIGEgbGVnYWwgY2xhc3Mgd2l0aCBMRURzCisgICAgICogWGtiTGVnYWxYSUJlbGxDbGFzcyhjKSBUcnVlIGlmICdjJyBzcGVjaWZpZXMgYSBsZWdhbCBjbGFzcyB3aXRoIGJlbGxzCisgICAgICogWGtiRXhwbGljaXRYSURldmljZShkKSBUcnVlIGlmICdkJyBleHBsaWNpdGx5IHNwZWNpZmllcyBhIGRldmljZQorICAgICAqIFhrYkV4cGxpY2l0WElDbGFzcyhjKSAgVHJ1ZSBpZiAnYycgZXhwbGljaXRseSBzcGVjaWZpZXMgYSBkZXZpY2UgY2xhc3MKKyAgICAgKiBYa2JFeHBsaWNpdFhJSWQoYykgICAgIFRydWUgaWYgJ2knIGV4cGxpY2l0bHkgc3BlY2lmaWVzIGEgZGV2aWNlIGlkCisgICAgICogWGtiU2luZ2xlWElDbGFzcyhjKSAgICBUcnVlIGlmICdjJyBzcGVjaWZpZXMgZXhhY3RseSBvbmUgZGV2aWNlIGNsYXNzLCAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgZGVmYXVsdC4KKyAgICAgKiBYa2JTaW5nbGVYSUlkKGkpICAgICAgIFRydWUgaWYgJ2knIHNwZWNpZmllcyBleGFjdGx5IG9uZSBkZXZpY2UgCisgICAgICoJICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIsIGluY2x1ZGluZyB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiVXNlQ29yZUtiZAkJMHgwMTAwCisjZGVmaW5lCVhrYlVzZUNvcmVQdHIJCTB4MDIwMAorI2RlZmluZQlYa2JEZmx0WElDbGFzcwkJMHgwMzAwCisjZGVmaW5lCVhrYkRmbHRYSUlkCQkweDA0MDAKKyNkZWZpbmUJWGtiQWxsWElDbGFzc2VzCQkweDA1MDAKKyNkZWZpbmUJWGtiQWxsWElJZHMJCTB4MDYwMAorI2RlZmluZQlYa2JYSU5vbmUJCTB4ZmYwMAorCisjZGVmaW5lCVhrYkxlZ2FsWElMZWRDbGFzcyhjKQkoKChjKT09S2JkRmVlZGJhY2tDbGFzcyl8fFwKKwkJCQkJKChjKT09TGVkRmVlZGJhY2tDbGFzcyl8fFwKKwkJCQkJKChjKT09WGtiRGZsdFhJQ2xhc3MpfHxcCisJCQkJCSgoYyk9PVhrYkFsbFhJQ2xhc3NlcykpCisjZGVmaW5lCVhrYkxlZ2FsWElCZWxsQ2xhc3MoYykJKCgoYyk9PUtiZEZlZWRiYWNrQ2xhc3MpfHxcCisJCQkJCSgoYyk9PUJlbGxGZWVkYmFja0NsYXNzKXx8XAorCQkJCQkoKGMpPT1Ya2JEZmx0WElDbGFzcyl8fFwKKwkJCQkJKChjKT09WGtiQWxsWElDbGFzc2VzKSkKKyNkZWZpbmUJWGtiRXhwbGljaXRYSURldmljZShjKQkoKChjKSYofjB4ZmYpKT09MCkKKyNkZWZpbmUJWGtiRXhwbGljaXRYSUNsYXNzKGMpCSgoKGMpJih+MHhmZikpPT0wKQorI2RlZmluZQlYa2JFeHBsaWNpdFhJSWQoYykJKCgoYykmKH4weGZmKSk9PTApCisjZGVmaW5lCVhrYlNpbmdsZVhJQ2xhc3MoYykJKCgoKGMpJih+MHhmZikpPT0wKXx8KChjKT09WGtiRGZsdFhJQ2xhc3MpKQorI2RlZmluZQlYa2JTaW5nbGVYSUlkKGMpCSgoKChjKSYofjB4ZmYpKT09MCl8fCgoYyk9PVhrYkRmbHRYSUlkKSkKKworI2RlZmluZQlYa2JOb01vZGlmaWVyCQkweGZmCisjZGVmaW5lCVhrYk5vU2hpZnRMZXZlbAkJMHhmZgorI2RlZmluZQlYa2JOb1NoYXBlCQkweGZmCisjZGVmaW5lCVhrYk5vSW5kaWNhdG9yCQkweGZmCisKKyNkZWZpbmUJWGtiTm9Nb2RpZmllck1hc2sJMAorI2RlZmluZQlYa2JBbGxNb2RpZmllcnNNYXNrCTB4ZmYKKyNkZWZpbmUJWGtiQWxsVmlydHVhbE1vZHNNYXNrCTB4ZmZmZgorCisjZGVmaW5lCVhrYk51bUtiZEdyb3VwcwkJNAorI2RlZmluZQlYa2JNYXhLYmRHcm91cAkJKFhrYk51bUtiZEdyb3Vwcy0xKQorCisjZGVmaW5lCVhrYk1heE1vdXNlS2V5c0J0bgk0CisKKyAgICAvKgorICAgICAqIEdyb3VwIEluZGV4IGFuZCBNYXNrOgorICAgICAqICAtIEluZGljZXMgaW50byB0aGUga3RfaW5kZXggYXJyYXkgb2YgYSBrZXkgdHlwZS4KKyAgICAgKiAgLSBNYXNrIHNwZWNpZmllcyB0eXBlcyB0byBiZSBjaGFuZ2VkIGZvciBYa2JDaGFuZ2VUeXBlc09mS2V5CisgICAgICovCisjZGVmaW5lCVhrYkdyb3VwMUluZGV4CQkwCisjZGVmaW5lCVhrYkdyb3VwMkluZGV4CQkxCisjZGVmaW5lCVhrYkdyb3VwM0luZGV4CQkyCisjZGVmaW5lCVhrYkdyb3VwNEluZGV4CQkzCisjZGVmaW5lCVhrYkFueUdyb3VwCQkyNTQKKyNkZWZpbmUJWGtiQWxsR3JvdXBzCQkyNTUKKworI2RlZmluZQlYa2JHcm91cDFNYXNrCQkoMTw8MCkKKyNkZWZpbmUJWGtiR3JvdXAyTWFzawkJKDE8PDEpCisjZGVmaW5lCVhrYkdyb3VwM01hc2sJCSgxPDwyKQorI2RlZmluZQlYa2JHcm91cDRNYXNrCQkoMTw8MykKKyNkZWZpbmUJWGtiQW55R3JvdXBNYXNrCQkoMTw8NykKKyNkZWZpbmUJWGtiQWxsR3JvdXBzTWFzawkoMHhmKQorCisgICAgLyoKKyAgICAgKiBCdWlsZENvcmVTdGF0ZTogR2l2ZW4gYSBrZXlib2FyZCBncm91cCBhbmQgYSBtb2RpZmllciBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgY29uc3RydWN0IHRoZSB2YWx1ZSB0byBiZSByZXBvcnRlZCBhbiBldmVudC4KKyAgICAgKiBHcm91cEZvckNvcmVTdGF0ZTogIEdpdmVuIHRoZSBzdGF0ZSByZXBvcnRlZCBpbiBhbiBldmVudCwKKyAgICAgKiAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSBrZXlib2FyZCBncm91cC4KKyAgICAgKiBJc0xlZ2FsR3JvdXA6ICAgUmV0dXJucyBUUlVFIGlmICdnJyBpcyBhIHZhbGlkIGdyb3VwIGluZGV4LgorICAgICAqLworI2RlZmluZQlYa2JCdWlsZENvcmVTdGF0ZShtLGcpCSgoKChnKSYweDMpPDwxMyl8KChtKSYweGZmKSkKKyNkZWZpbmUgWGtiR3JvdXBGb3JDb3JlU3RhdGUocykJKCgocyk+PjEzKSYweDMpCisjZGVmaW5lCVhrYklzTGVnYWxHcm91cChnKQkoKChnKT49MCkmJigoZyk8WGtiTnVtS2JkR3JvdXBzKSkKKworICAgIC8qCisgICAgICogR3JvdXBzV3JhcCB2YWx1ZXM6CisgICAgICogIC0gVGhlICdncm91cHNXcmFwJyBmaWVsZCBvZiBhbiBYa2JDb250cm9sc1JlYyBzcGVjaWZpZXMgdGhlCisgICAgICogICAgdHJlYXRtZW50IG9mIG91dCBvZiByYW5nZSBncm91cHMuCisgICAgICogIC0gQml0cyA2IGFuZCA3IG9mIHRoZSBncm91cCBpbmZvIGZpZWxkIG9mIGEga2V5IHN5bWJvbCBtYXAKKyAgICAgKiAgICBzcGVjaWZ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBvdXQgb2YgcmFuZ2UgZ3JvdXBzIGZvciB0aGUKKyAgICAgKiAgICBjb3JyZXNwb25kaW5nIGtleS4KKyAgICAgKi8KKyNkZWZpbmUJWGtiV3JhcEludG9SYW5nZQkoMHgwMCkKKyNkZWZpbmUJWGtiQ2xhbXBJbnRvUmFuZ2UJKDB4NDApCisjZGVmaW5lCVhrYlJlZGlyZWN0SW50b1JhbmdlCSgweDgwKQorCisgICAgLyoKKyAgICAgKiBBY3Rpb24gZmxhZ3M6ICBSZXBvcnRlZCBpbiB0aGUgJ2ZsYWdzJyBmaWVsZCBvZiBtb3N0IGtleSBhY3Rpb25zLgorICAgICAqIEludGVycHJldGF0aW9uIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIGFjdGlvbjsgbm90IGFsbCBhY3Rpb25zCisgICAgICogYWNjZXB0IGFsbCBmbGFncy4KKyAgICAgKgorICAgICAqIE9wdGlvbgkJCVVzZWQgZm9yIEFjdGlvbnMKKyAgICAgKiAtLS0tLS0JCQktLS0tLS0tLS0tLS0tLS0tCisgICAgICogQ2xlYXJMb2NrcwkJU2V0TW9kcywgTGF0Y2hNb2RzLCBTZXRHcm91cCwgTGF0Y2hHcm91cAorICAgICAqIExhdGNoVG9Mb2NrCQlTZXRNb2RzLCBMYXRjaE1vZHMsIFNldEdyb3VwLCBMYXRjaEdyb3VwCisgICAgICogTG9ja05vTG9jawkJTG9ja01vZHMsIElTT0xvY2ssIExvY2tQdHJCdG4sIExvY2tEZXZpY2VCdG4KKyAgICAgKiBMb2NrTm9VbmxvY2sJCUxvY2tNb2RzLCBJU09Mb2NrLCBMb2NrUHRyQnRuLCBMb2NrRGV2aWNlQnRuCisgICAgICogVXNlTW9kTWFwTW9kcwkJU2V0TW9kcywgTGF0Y2hNb2RzLCBMb2NrTW9kcywgSVNPTG9jaworICAgICAqIEdyb3VwQWJzb2x1dGUJCVNldEdyb3VwLCBMYXRjaEdyb3VwLCBMb2NrR3JvdXAsIElTT0xvY2sKKyAgICAgKiBVc2VEZmx0QnV0dG9uCQlQdHJCdG4sIExvY2tQdHJCdG4KKyAgICAgKiBOb0FjY2VsZXJhdGlvbgkJTW92ZVB0cgorICAgICAqIE1vdmVBYnNvbHV0ZVgJCU1vdmVQdHIKKyAgICAgKiBNb3ZlQWJzb2x1dGVZCQlNb3ZlUHRyCisgICAgICogSVNPRGZsdElzR3JvdXAJCUlTT0xvY2sKKyAgICAgKiBJU09Ob0FmZmVjdE1vZHMJCUlTT0xvY2sKKyAgICAgKiBJU09Ob0FmZmVjdEdyb3VwCQlJU09Mb2NrCisgICAgICogSVNPTm9BZmZlY3RQdHIJCUlTT0xvY2sKKyAgICAgKiBJU09Ob0FmZmVjdEN0cmxzCQlJU09Mb2NrCisgICAgICogTWVzc2FnZU9uUHJlc3MJCUFjdGlvbk1lc3NhZ2UKKyAgICAgKiBNZXNzYWdlT25SZWxlYXNlCQlBY3Rpb25NZXNzYWdlCisgICAgICogTWVzc2FnZUdlbktleUV2ZW50CUFjdGlvbk1lc3NhZ2UKKyAgICAgKiBBZmZlY3REZmx0QnRuCQlTZXRQdHJEZmx0CisgICAgICogRGZsdEJ0bkFic29sdXRlCQlTZXRQdHJEZmx0CisgICAgICogU3dpdGNoQXBwbGljYXRpb24JU3dpdGNoU2NyZWVuCisgICAgICogU3dpdGNoQWJzb2x1dGUJCVN3aXRjaFNjcmVlbgorICAgICAqLworCisjZGVmaW5lCVhrYlNBX0NsZWFyTG9ja3MJKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX0xhdGNoVG9Mb2NrCSgxTCA8PCAxKQorCisjZGVmaW5lCVhrYlNBX0xvY2tOb0xvY2sJKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX0xvY2tOb1VubG9jawkoMUwgPDwgMSkKKworI2RlZmluZQlYa2JTQV9Vc2VNb2RNYXBNb2RzCSgxTCA8PCAyKQorCisjZGVmaW5lCVhrYlNBX0dyb3VwQWJzb2x1dGUJKDFMIDw8IDIpCisjZGVmaW5lCVhrYlNBX1VzZURmbHRCdXR0b24JMAorCisjZGVmaW5lCVhrYlNBX05vQWNjZWxlcmF0aW9uCSgxTCA8PCAwKQorI2RlZmluZQlYa2JTQV9Nb3ZlQWJzb2x1dGVYCSgxTCA8PCAxKQorI2RlZmluZQlYa2JTQV9Nb3ZlQWJzb2x1dGVZCSgxTCA8PCAyKQorCisjZGVmaW5lCVhrYlNBX0lTT0RmbHRJc0dyb3VwIAkgKDFMIDw8IDcpCisjZGVmaW5lCVhrYlNBX0lTT05vQWZmZWN0TW9kcwkgKDFMIDw8IDYpCisjZGVmaW5lCVhrYlNBX0lTT05vQWZmZWN0R3JvdXAJICgxTCA8PCA1KQorI2RlZmluZQlYa2JTQV9JU09Ob0FmZmVjdFB0cgkgKDFMIDw8IDQpCisjZGVmaW5lCVhrYlNBX0lTT05vQWZmZWN0Q3RybHMJICgxTCA8PCAzKQorI2RlZmluZQlYa2JTQV9JU09BZmZlY3RNYXNrCSAoMHg3OCkKKworI2RlZmluZQlYa2JTQV9NZXNzYWdlT25QcmVzcwkgKDFMIDw8IDApCisjZGVmaW5lCVhrYlNBX01lc3NhZ2VPblJlbGVhc2UJICgxTCA8PCAxKQorI2RlZmluZQlYa2JTQV9NZXNzYWdlR2VuS2V5RXZlbnQgKDFMIDw8IDIpCisKKyNkZWZpbmUJWGtiU0FfQWZmZWN0RGZsdEJ0bgkxCisjZGVmaW5lCVhrYlNBX0RmbHRCdG5BYnNvbHV0ZQkoMUwgPDwgMikKKworI2RlZmluZQlYa2JTQV9Td2l0Y2hBcHBsaWNhdGlvbgkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiU0FfU3dpdGNoQWJzb2x1dGUJKDFMIDw8IDIpCisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFwcGx5IHRvIHRoZSBTQV9EZXZpY2VWYWx1YXRvciAKKyAgICAgKiBhY3Rpb24gb25seS4gIFZhbHVhdG9yIG9wZXJhdGlvbnMgc3BlY2lmeSB0aGUgYWN0aW9uIAorICAgICAqIHRvIGJlIHRha2VuLiAgIFZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIGFjdGlvbiBhcmUgCisgICAgICogbXVsdGlwbGllZCBieSAyXnNjYWxlIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkLgorICAgICAqLworI2RlZmluZQlYa2JTQV9JZ25vcmVWYWwJCSgweDAwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxNaW4JCSgweDEwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxDZW50ZXIJKDB4MjApCisjZGVmaW5lCVhrYlNBX1NldFZhbE1heAkJKDB4MzApCisjZGVmaW5lCVhrYlNBX1NldFZhbFJlbGF0aXZlCSgweDQwKQorI2RlZmluZQlYa2JTQV9TZXRWYWxBYnNvbHV0ZQkoMHg1MCkKKyNkZWZpbmUJWGtiU0FfVmFsT3BNYXNrCQkoMHg3MCkKKyNkZWZpbmUJWGtiU0FfVmFsU2NhbGVNYXNrCSgweDA3KQorI2RlZmluZQlYa2JTQV9WYWxPcChhKQkJKChhKSZYa2JTQV9WYWxPcE1hc2spCisjZGVmaW5lCVhrYlNBX1ZhbFNjYWxlKGEpCSgoYSkmWGtiU0FfVmFsU2NhbGVNYXNrKQorCisgICAgLyoKKyAgICAgKiBBY3Rpb24gdHlwZXM6IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIGtleSBhY3Rpb24uICBSZXBvcnRlZCBpbiB0aGUKKyAgICAgKiB0eXBlIGZpZWxkIG9mIGFsbCBrZXkgYWN0aW9ucy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0FfTm9BY3Rpb24JCTB4MDAKKyNkZWZpbmUJWGtiU0FfU2V0TW9kcwkJMHgwMQorI2RlZmluZQlYa2JTQV9MYXRjaE1vZHMJCTB4MDIKKyNkZWZpbmUJWGtiU0FfTG9ja01vZHMJCTB4MDMKKyNkZWZpbmUJWGtiU0FfU2V0R3JvdXAJCTB4MDQKKyNkZWZpbmUJWGtiU0FfTGF0Y2hHcm91cAkweDA1CisjZGVmaW5lCVhrYlNBX0xvY2tHcm91cAkJMHgwNgorI2RlZmluZQlYa2JTQV9Nb3ZlUHRyCQkweDA3CisjZGVmaW5lCVhrYlNBX1B0ckJ0bgkJMHgwOAorI2RlZmluZQlYa2JTQV9Mb2NrUHRyQnRuCTB4MDkKKyNkZWZpbmUJWGtiU0FfU2V0UHRyRGZsdAkweDBhCisjZGVmaW5lCVhrYlNBX0lTT0xvY2sJCTB4MGIKKyNkZWZpbmUJWGtiU0FfVGVybWluYXRlCQkweDBjCisjZGVmaW5lCVhrYlNBX1N3aXRjaFNjcmVlbgkweDBkCisjZGVmaW5lCVhrYlNBX1NldENvbnRyb2xzCTB4MGUKKyNkZWZpbmUJWGtiU0FfTG9ja0NvbnRyb2xzCTB4MGYKKyNkZWZpbmUJWGtiU0FfQWN0aW9uTWVzc2FnZQkweDEwCisjZGVmaW5lCVhrYlNBX1JlZGlyZWN0S2V5CTB4MTEKKyNkZWZpbmUJWGtiU0FfRGV2aWNlQnRuCQkweDEyCisjZGVmaW5lCVhrYlNBX0xvY2tEZXZpY2VCdG4JMHgxMworI2RlZmluZQlYa2JTQV9EZXZpY2VWYWx1YXRvcgkweDE0CisjZGVmaW5lCVhrYlNBX0xhc3RBY3Rpb24JWGtiU0FfRGV2aWNlVmFsdWF0b3IKKyNkZWZpbmUJWGtiU0FfTnVtQWN0aW9ucwkoWGtiU0FfTGFzdEFjdGlvbisxKQorCisjZGVmaW5lCVhrYlNBX1hGcmVlODZQcml2YXRlCTB4ODYKKworICAgIC8qCisgICAgICogU3BlY2lmaWVzIHRoZSBrZXkgYWN0aW9ucyB0aGF0IGNsZWFyIGxhdGNoZWQgZ3JvdXBzIG9yIG1vZGlmaWVycy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0FfQnJlYWtMYXRjaCBcCisJKCgxPDxYa2JTQV9Ob0FjdGlvbil8KDE8PFhrYlNBX1B0ckJ0bil8KDE8PFhrYlNBX0xvY2tQdHJCdG4pfFwKKwkoMTw8WGtiU0FfVGVybWluYXRlKXwoMTw8WGtiU0FfU3dpdGNoU2NyZWVuKXwoMTw8WGtiU0FfU2V0Q29udHJvbHMpfFwKKwkoMTw8WGtiU0FfTG9ja0NvbnRyb2xzKXwoMTw8WGtiU0FfQWN0aW9uTWVzc2FnZSl8XAorCSgxPDxYa2JTQV9SZWRpcmVjdEtleSl8KDE8PFhrYlNBX0RldmljZUJ0bil8KDE8PFhrYlNBX0xvY2tEZXZpY2VCdG4pKQorCSAKKyAgICAvKgorICAgICAqIE1hY3JvcyB0byBjbGFzc2lmeSBrZXkgYWN0aW9ucworICAgICAqLworI2RlZmluZQlYa2JJc01vZEFjdGlvbihhKQkoKChhKS0+dHlwZT49WGtiX1NBU2V0TW9kcykmJigoYSktPnR5cGU8PVhrYlNBX0xvY2tNb2RzKSkKKyNkZWZpbmUJWGtiSXNHcm91cEFjdGlvbihhKQkoKChhKS0+dHlwZT49WGtiU0FfU2V0R3JvdXApJiYoKGEpLT50eXBlPD1Ya2JTQV9Mb2NrR3JvdXApKQorI2RlZmluZQlYa2JJc1B0ckFjdGlvbihhKQkoKChhKS0+dHlwZT49WGtiU0FfTW92ZVB0cikmJigoYSktPnR5cGU8PVhrYlNBX1NldFB0ckRmbHQpKQorCisKKyAgICAvKgorICAgICAqIEtleSBCZWhhdmlvciBRdWFsaWZpZXI6CisgICAgICogICAgS0JfUGVybWFuZW50IGluZGljYXRlcyB0aGF0IHRoZSBiZWhhdmlvciBkZXNjcmliZXMgYW4gdW5hbHRlcmFibGUKKyAgICAgKiAgICBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUga2V5Ym9hcmQsIG5vdCBhbiBYS0Igc29mdHdhcmUtc2ltdWxhdGlvbiBvZgorICAgICAqICAgIHRoZSBsaXN0ZWQgYmVoYXZpb3IuCisgICAgICogS2V5IEJlaGF2aW9yIFR5cGVzOiAgCisgICAgICogICAgU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBrZXkuCisgICAgICovCisjZGVmaW5lCVhrYktCX1Blcm1hbmVudAkJMHg4MAorI2RlZmluZQlYa2JLQl9PcE1hc2sJCTB4N2YKKworI2RlZmluZQlYa2JLQl9EZWZhdWx0CQkweDAwCisjZGVmaW5lCVhrYktCX0xvY2sJCTB4MDEKKyNkZWZpbmUJWGtiS0JfUmFkaW9Hcm91cAkweDAyCisjZGVmaW5lCVhrYktCX092ZXJsYXkxCQkweDAzCisjZGVmaW5lCVhrYktCX092ZXJsYXkyCQkweDA0CisKKyNkZWZpbmUJWGtiS0JfUkdBbGxvd05vbmUJMHg4MAorCisgICAgLyoKKyAgICAgKiBWYXJpb3VzIG1hY3JvcyB3aGljaCBkZXNjcmliZSB0aGUgcmFuZ2Ugb2YgbGVnYWwga2V5Y29kZXMuCisgICAgICovCisjZGVmaW5lCVhrYk1pbkxlZ2FsS2V5Q29kZQk4CisjZGVmaW5lCVhrYk1heExlZ2FsS2V5Q29kZQkyNTUKKyNkZWZpbmUJWGtiTWF4S2V5Q291bnQJCShYa2JNYXhMZWdhbEtleUNvZGUtWGtiTWluTGVnYWxLZXlDb2RlKzEpCisjZGVmaW5lCVhrYlBlcktleUJpdEFycmF5U2l6ZQkoKFhrYk1heExlZ2FsS2V5Q29kZSsxKS84KQorLyogU2VlbXMga2luZGEgc2lsbHkgdG8gY2hlY2sgdGhhdCBhbiB1bnNpZ25lZCBjaGFyIGlzIDw9IDI1NS4uLiAqLworI2RlZmluZQlYa2JJc0xlZ2FsS2V5Y29kZShrKQkoKGspPj1Ya2JNaW5MZWdhbEtleUNvZGUpCisKKyAgICAvKgorICAgICAqIEFzc29ydGVkIGNvbnN0YW50cyBhbmQgbGltaXRzLgorICAgICAqLworI2RlZmluZQlYa2JOdW1Nb2RpZmllcnMJCTgKKyNkZWZpbmUJWGtiTnVtVmlydHVhbE1vZHMJMTYKKyNkZWZpbmUJWGtiTnVtSW5kaWNhdG9ycwkzMgorI2RlZmluZQlYa2JBbGxJbmRpY2F0b3JzTWFzawkoMHhmZmZmZmZmZikKKyNkZWZpbmUJWGtiTWF4UmFkaW9Hcm91cHMJMzIKKyNkZWZpbmUJWGtiQWxsUmFkaW9Hcm91cHNNYXNrCSgweGZmZmZmZmZmKQorI2RlZmluZQlYa2JNYXhTaGlmdExldmVsCTYzCisjZGVmaW5lCVhrYk1heFN5bXNQZXJLZXkJKFhrYk1heFNoaWZ0TGV2ZWwqWGtiTnVtS2JkR3JvdXBzKQorI2RlZmluZQlYa2JSR01heE1lbWJlcnMJCTEyCisjZGVmaW5lCVhrYkFjdGlvbk1lc3NhZ2VMZW5ndGgJNgorI2RlZmluZQlYa2JLZXlOYW1lTGVuZ3RoCTQKKyNkZWZpbmUJWGtiTWF4UmVkaXJlY3RDb3VudAk4CisKKyNkZWZpbmUJWGtiR2VvbVB0c1Blck1NCQkxMAorI2RlZmluZQlYa2JHZW9tTWF4Q29sb3JzCTMyCisjZGVmaW5lCVhrYkdlb21NYXhMYWJlbENvbG9ycwkzCisjZGVmaW5lCVhrYkdlb21NYXhQcmlvcml0eQkyNTUKKworICAgIC8qCisgICAgICogS2V5IFR5cGUgaW5kZXggYW5kIG1hc2sgZm9yIHRoZSBmb3VyIHN0YW5kYXJkIGtleSB0eXBlcy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiT25lTGV2ZWxJbmRleAkwCisjZGVmaW5lCVhrYlR3b0xldmVsSW5kZXgJMQorI2RlZmluZQlYa2JBbHBoYWJldGljSW5kZXgJMgorI2RlZmluZQlYa2JLZXlwYWRJbmRleAkJMworI2RlZmluZQlYa2JMYXN0UmVxdWlyZWRUeXBlCVhrYktleXBhZEluZGV4CisjZGVmaW5lCVhrYk51bVJlcXVpcmVkVHlwZXMJKFhrYkxhc3RSZXF1aXJlZFR5cGUrMSkKKyNkZWZpbmUJWGtiTWF4S2V5VHlwZXMJCTI1NQorCisjZGVmaW5lCVhrYk9uZUxldmVsTWFzawkJKDE8PDApCisjZGVmaW5lCVhrYlR3b0xldmVsTWFzawkJKDE8PDEpCisjZGVmaW5lCVhrYkFscGhhYmV0aWNNYXNrCSgxPDwyKQorI2RlZmluZQlYa2JLZXlwYWRNYXNrCQkoMTw8MykKKyNkZWZpbmUJWGtiQWxsUmVxdWlyZWRUeXBlcwkoMHhmKQorCisjZGVmaW5lCVhrYlNoaWZ0TGV2ZWwobikJKChuKS0xKQorI2RlZmluZQlYa2JTaGlmdExldmVsTWFzayhuKQkoMTw8KChuKS0xKSkKKworICAgIC8qCisgICAgICogRXh0ZW5zaW9uIG5hbWUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24KKyAgICAgKi8KKyNkZWZpbmUJWGtiTmFtZSAiWEtFWUJPQVJEIgorI2RlZmluZQlYa2JNYWpvclZlcnNpb24JMQorI2RlZmluZQlYa2JNaW5vclZlcnNpb24JMAorCisgICAgLyoKKyAgICAgKiBFeHBsaWNpdCBtYXAgY29tcG9uZW50czoKKyAgICAgKiAgLSBVc2VkIGluIHRoZSAnZXhwbGljaXQnIGZpZWxkIG9mIGFuIFhrYlNlcnZlck1hcC4gIFNwZWNpZmllcworICAgICAqICAgIHRoZSBrZXlib2FyZCBjb21wb25lbnRzIHRoYXQgc2hvdWxkIF9ub3RfIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseQorICAgICAqICAgIGluIHJlc3BvbnNlIHRvIGNvcmUgcHJvdG9jb2wga2V5Ym9hcmQgbWFwcGluZyByZXF1ZXN0cy4KKyAgICAgKi8KKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlc01hc2sJICAoMHgwZikKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlMU1hc2sJICAoMTw8MCkKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlMk1hc2sJICAoMTw8MSkKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlM01hc2sJICAoMTw8MikKKyNkZWZpbmUJWGtiRXhwbGljaXRLZXlUeXBlNE1hc2sJICAoMTw8MykKKyNkZWZpbmUJWGtiRXhwbGljaXRJbnRlcnByZXRNYXNrICAoMTw8NCkKKyNkZWZpbmUJWGtiRXhwbGljaXRBdXRvUmVwZWF0TWFzayAoMTw8NSkKKyNkZWZpbmUJWGtiRXhwbGljaXRCZWhhdmlvck1hc2sJICAoMTw8NikKKyNkZWZpbmUJWGtiRXhwbGljaXRWTW9kTWFwTWFzawkgICgxPDw3KQorI2RlZmluZQlYa2JBbGxFeHBsaWNpdE1hc2sJICAoMHhmZikKKworICAgIC8qCisgICAgICogTWFwIGNvbXBvbmVudHMgbWFza3M6CisgICAgICogVGhvc2UgaW4gQWxsTWFwQ29tcG9uZW50c01hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSBsb2FkZWQgb3IgY2hhbmdlZCBmb3IgdGhlCisgICAgICogICAgR2V0TWFwIGFuZCBTZXRNYXAgcmVxdWVzdHMuCisgICAgICogVGhvc2UgaW4gQ2xpZW50SW5mb01hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBjb21wb25lbnRzIHRvIGJlIGFsbG9jYXRlZCBieSBYa2JBbGxvY0NsaWVudE1hcC4KKyAgICAgKiBUaG9zZSBpbiBTZXJ2ZXJJbmZvTWFzazoKKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIGNvbXBvbmVudHMgdG8gYmUgYWxsb2NhdGVkIGJ5IFhrYkFsbG9jU2VydmVyTWFwLgorICAgICAqLworI2RlZmluZQlYa2JLZXlUeXBlc01hc2sJCSgxPDwwKQorI2RlZmluZQlYa2JLZXlTeW1zTWFzawkJKDE8PDEpCisjZGVmaW5lCVhrYk1vZGlmaWVyTWFwTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiRXhwbGljaXRDb21wb25lbnRzTWFzayAoMTw8MykKKyNkZWZpbmUgWGtiS2V5QWN0aW9uc01hc2sJKDE8PDQpCisjZGVmaW5lCVhrYktleUJlaGF2aW9yc01hc2sJKDE8PDUpCisjZGVmaW5lCVhrYlZpcnR1YWxNb2RzTWFzawkoMTw8NikKKyNkZWZpbmUJWGtiVmlydHVhbE1vZE1hcE1hc2sJKDE8PDcpCisKKyNkZWZpbmUJWGtiQWxsQ2xpZW50SW5mb01hc2sJKFhrYktleVR5cGVzTWFza3xYa2JLZXlTeW1zTWFza3xYa2JNb2RpZmllck1hcE1hc2spCisjZGVmaW5lCVhrYkFsbFNlcnZlckluZm9NYXNrCShYa2JFeHBsaWNpdENvbXBvbmVudHNNYXNrfFhrYktleUFjdGlvbnNNYXNrfFhrYktleUJlaGF2aW9yc01hc2t8WGtiVmlydHVhbE1vZHNNYXNrfFhrYlZpcnR1YWxNb2RNYXBNYXNrKQorI2RlZmluZQlYa2JBbGxNYXBDb21wb25lbnRzTWFzawkoWGtiQWxsQ2xpZW50SW5mb01hc2t8WGtiQWxsU2VydmVySW5mb01hc2spCisKKyAgICAvKgorICAgICAqIFN5bWJvbCBpbnRlcnByZXRhdGlvbnMgZmxhZ3M6CisgICAgICogIC0gVXNlZCBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2wgaW50ZXJwcmV0YXRpb24KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0lfQXV0b1JlcGVhdAkoMTw8MCkKKyNkZWZpbmUJWGtiU0lfTG9ja2luZ0tleQkoMTw8MSkKKworICAgIC8qCisgICAgICogU3ltYm9sIGludGVycHJldGF0aW9ucyBtYXRjaCBzcGVjaWZpY2F0aW9uOgorICAgICAqICAtIFVzZWQgaW4gdGhlIG1hdGNoIGZpZWxkIG9mIGEgc3ltYm9sIGludGVycHJldGF0aW9uIHRvIHNwZWNpZnkgCisgICAgICogICAgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggYW4gaW50ZXJwcmV0YXRpb24gaXMgdXNlZC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiU0lfTGV2ZWxPbmVPbmx5CSgweDgwKQorI2RlZmluZQlYa2JTSV9PcE1hc2sJCSgweDdmKQorI2RlZmluZQlYa2JTSV9Ob25lT2YJCSgwKQorI2RlZmluZQlYa2JTSV9BbnlPZk9yTm9uZQkoMSkKKyNkZWZpbmUJWGtiU0lfQW55T2YJCSgyKQorI2RlZmluZQlYa2JTSV9BbGxPZgkJKDMpCisjZGVmaW5lCVhrYlNJX0V4YWN0bHkJCSg0KQorCisgICAgLyoKKyAgICAgKiBJbmRpY2F0b3IgbWFwIGZsYWdzOgorICAgICAqICAtIFVzZWQgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGFuIGluZGljYXRvciBtYXAgdG8gaW5kaWNhdGUgdGhlCisgICAgICogICAgY29uZGl0aW9ucyB1bmRlciB3aGljaCBhbmQgaW5kaWNhdG9yIGNhbiBiZSBjaGFuZ2VkIGFuZCB0aGUKKyAgICAgKiAgICBlZmZlY3RzIG9mIGNoYW5naW5nIHRoZSBpbmRpY2F0b3IuCisgICAgICovCisjZGVmaW5lCVhrYklNX05vRXhwbGljaXQJKDFMIDw8IDcpCisjZGVmaW5lCVhrYklNX05vQXV0b21hdGljCSgxTCA8PCA2KQorI2RlZmluZQlYa2JJTV9MRUREcml2ZXNLQgkoMUwgPDwgNSkKKworICAgIC8qCisgICAgICogSW5kaWNhdG9yIG1hcCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnM6CisgICAgICogIC0gVXNlZCBieSB0aGUgJ3doaWNoX2dyb3VwcycgYW5kICd3aGljaF9tb2RzJyBmaWVsZHMgb2YgYW4gaW5kaWNhdG9yCisgICAgICogICAgbWFwIHRvIHNwZWNpZnkgd2hpY2gga2V5Ym9hcmQgY29tcG9uZW50cyBzaG91bGQgYmUgdXNlZCB0byBkcml2ZQorICAgICAqICAgIHRoZSBpbmRpY2F0b3IuCisgICAgICovCisjZGVmaW5lCVhrYklNX1VzZUJhc2UJCSgxTCA8PCAwKQorI2RlZmluZQlYa2JJTV9Vc2VMYXRjaGVkCSgxTCA8PCAxKQorI2RlZmluZQlYa2JJTV9Vc2VMb2NrZWQJCSgxTCA8PCAyKQorI2RlZmluZQlYa2JJTV9Vc2VFZmZlY3RpdmUJKDFMIDw8IDMpCisjZGVmaW5lCVhrYklNX1VzZUNvbXBhdAkJKDFMIDw8IDQpCisKKyNkZWZpbmUJWGtiSU1fVXNlTm9uZQkgIDAKKyNkZWZpbmUJWGtiSU1fVXNlQW55R3JvdXAgKFhrYklNX1VzZUJhc2V8WGtiSU1fVXNlTGF0Y2hlZHxYa2JJTV9Vc2VMb2NrZWRcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8WGtiSU1fVXNlRWZmZWN0aXZlKQorI2RlZmluZQlYa2JJTV9Vc2VBbnlNb2RzICAoWGtiSU1fVXNlQW55R3JvdXB8WGtiSU1fVXNlQ29tcGF0KQorCisgICAgLyoKKyAgICAgKiBDb21wYXRpYmlsaXR5IE1hcCBDb21wb250ZW50czoKKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIGNvbXBvbmVudHMgdG8gYmUgYWxsb2NhdGVkIGluIFhrYkFsbG9jQ29tcGF0TWFwLgorICAgICAqLworI2RlZmluZQlYa2JTeW1JbnRlcnBNYXNrCSgxPDwwKQorI2RlZmluZQlYa2JHcm91cENvbXBhdE1hc2sJKDE8PDEpCisjZGVmaW5lCVhrYkFsbENvbXBhdE1hc2sJKDB4MykKKworICAgIC8qCisgICAgICogTmFtZXMgY29tcG9uZW50IG1hc2s6CisgICAgICogIC0gU3BlY2lmaWVzIHRoZSBuYW1lcyB0byBiZSBsb2FkZWQgb3IgY2hhbmdlZCBmb3IgdGhlIEdldE5hbWVzIGFuZAorICAgICAqICAgIFNldE5hbWVzIHJlcXVlc3RzLgorICAgICAqICAtIFNwZWNpZmllcyB0aGUgbmFtZXMgdGhhdCBoYXZlIGNoYW5nZWQgaW4gYSBOYW1lc05vdGlmeSBldmVudC4KKyAgICAgKiAgLSBTcGVjaWZpZXMgdGhlIG5hbWVzIGNvbXBvbmVudHMgdG8gYmUgYWxsb2NhdGVkIGJ5IFhrYkFsbG9jTmFtZXMuCisgICAgICovCisjZGVmaW5lCVhrYktleWNvZGVzTmFtZU1hc2sJKDE8PDApCisjZGVmaW5lCVhrYkdlb21ldHJ5TmFtZU1hc2sJKDE8PDEpCisjZGVmaW5lCVhrYlN5bWJvbHNOYW1lTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiUGh5c1N5bWJvbHNOYW1lTWFzawkoMTw8MykKKyNkZWZpbmUJWGtiVHlwZXNOYW1lTWFzawkoMTw8NCkKKyNkZWZpbmUJWGtiQ29tcGF0TmFtZU1hc2sgCSgxPDw1KQorI2RlZmluZQlYa2JLZXlUeXBlTmFtZXNNYXNrCSgxPDw2KQorI2RlZmluZQlYa2JLVExldmVsTmFtZXNNYXNrCSgxPDw3KQorI2RlZmluZQlYa2JJbmRpY2F0b3JOYW1lc01hc2sJKDE8PDgpCisjZGVmaW5lCVhrYktleU5hbWVzTWFzawkJKDE8PDkpCisjZGVmaW5lCVhrYktleUFsaWFzZXNNYXNrCSgxPDwxMCkKKyNkZWZpbmUJWGtiVmlydHVhbE1vZE5hbWVzTWFzawkoMTw8MTEpCisjZGVmaW5lCVhrYkdyb3VwTmFtZXNNYXNrCSgxPDwxMikKKyNkZWZpbmUJWGtiUkdOYW1lc01hc2sJCSgxPDwxMykKKyNkZWZpbmUJWGtiQ29tcG9uZW50TmFtZXNNYXNrCSgweDNmKQorI2RlZmluZQlYa2JBbGxOYW1lc01hc2sJCSgweDNmZmYpCisKKyAgICAvKgorICAgICAqIEdldEJ5TmFtZSBjb21wb25lbnRzOgorICAgICAqICAtIFNwZWNpZmllcyBkZXNpcmVkIG9yIG5lY2Vzc2FyeSBjb21wb25lbnRzIHRvIEdldEtiZEJ5TmFtZSByZXF1ZXN0LgorICAgICAqICAtIFJlcG9ydHMgdGhlIGNvbXBvbmVudHMgdGhhdCB3ZXJlIGZvdW5kIGluIGEgR2V0S2JkQnlOYW1lUmVwbHkKKyAgICAgKi8KKyNkZWZpbmUJWGtiR0JOX1R5cGVzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYkdCTl9Db21wYXRNYXBNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiR0JOX0NsaWVudFN5bWJvbHNNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JHQk5fU2VydmVyU3ltYm9sc01hc2sJKDFMIDw8IDMpCisjZGVmaW5lCVhrYkdCTl9TeW1ib2xzTWFzayAoWGtiR0JOX0NsaWVudFN5bWJvbHNNYXNrfFhrYkdCTl9TZXJ2ZXJTeW1ib2xzTWFzaykKKyNkZWZpbmUJWGtiR0JOX0luZGljYXRvck1hcE1hc2sJCSgxTCA8PCA0KQorI2RlZmluZQlYa2JHQk5fS2V5TmFtZXNNYXNrCQkoMUwgPDwgNSkKKyNkZWZpbmUJWGtiR0JOX0dlb21ldHJ5TWFzawkJKDFMIDw8IDYpCisjZGVmaW5lCVhrYkdCTl9PdGhlck5hbWVzTWFzawkJKDFMIDw8IDcpCisjZGVmaW5lCVhrYkdCTl9BbGxDb21wb25lbnRzTWFzawkoMHhmZikKKworICAgICAvKgorICAgICAgKiBMaXN0Q29tcG9uZW50cyBmbGFncworICAgICAgKi8KKyNkZWZpbmUJWGtiTENfSGlkZGVuCQkJKDFMIDw8ICAwKQorI2RlZmluZQlYa2JMQ19EZWZhdWx0CQkJKDFMIDw8ICAxKQorI2RlZmluZQlYa2JMQ19QYXJ0aWFsCQkJKDFMIDw8ICAyKQorCisjZGVmaW5lCVhrYkxDX0FscGhhbnVtZXJpY0tleXMJCSgxTCA8PCAgOCkKKyNkZWZpbmUJWGtiTENfTW9kaWZpZXJLZXlzCQkoMUwgPDwgIDkpCisjZGVmaW5lCVhrYkxDX0tleXBhZEtleXMJCSgxTCA8PCAxMCkKKyNkZWZpbmUJWGtiTENfRnVuY3Rpb25LZXlzCQkoMUwgPDwgMTEpCisjZGVmaW5lCVhrYkxDX0FsdGVybmF0ZUdyb3VwCQkoMUwgPDwgMTIpCisKKyAgICAvKgorICAgICAqIFggSW5wdXQgRXh0ZW5zaW9uIEludGVyYWN0aW9ucworICAgICAqIC0gU3BlY2lmaWVzIHRoZSBwb3NzaWJsZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBYS0IgYW5kIHRoZSBYIGlucHV0CisgICAgICogICBleHRlbnNpb24KKyAgICAgKiAtIFVzZWQgdG8gcmVxdWVzdCAoWGtiR2V0RGV2aWNlSW5mbykgb3IgY2hhbmdlIChYS2JTZXREZXZpY2VJbmZvKQorICAgICAqICAgWEtCIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4dGVuc2lvbiBkZXZpY2UuCisgICAgICogLSBSZXBvcnRzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyBpbiB0aGUgcmVwbHkgdG8KKyAgICAgKiAgIFhrYkdldERldmljZUluZm8gb3IgaW4gYW4gWGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5IGV2ZW50LgorICAgICAqIFhrYlhJX1Vuc3VwcG9ydGVkRmVhdHVyZSBpcyByZXBvcnRlZCBpbiBYa2JFeHRlbnNpb25EZXZpY2VOb3RpZnkKKyAgICAgKiBldmVudHMgdG8gaW5kaWNhdGUgYW4gYXR0ZW1wdCB0byB1c2UgYW4gdW5zdXBwb3J0ZWQgZmVhdHVyZS4KKyAgICAgKi8KKyNkZWZpbmUJWGtiWElfS2V5Ym9hcmRzTWFzawkJKDFMIDw8IDApCisjZGVmaW5lCVhrYlhJX0J1dHRvbkFjdGlvbnNNYXNrCQkoMUwgPDwgMSkKKyNkZWZpbmUJWGtiWElfSW5kaWNhdG9yTmFtZXNNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JYSV9JbmRpY2F0b3JNYXBzTWFzawkJKDFMIDw8IDMpCisjZGVmaW5lCVhrYlhJX0luZGljYXRvclN0YXRlTWFzawkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiWElfVW5zdXBwb3J0ZWRGZWF0dXJlTWFzawkoMUwgPDwgMTUpCisjZGVmaW5lCVhrYlhJX0FsbEZlYXR1cmVzTWFzawkJKDB4MDAxZikKKyNkZWZpbmUJWGtiWElfQWxsRGV2aWNlRmVhdHVyZXNNYXNrCSgweDAwMWUpCisKKyNkZWZpbmUJWGtiWElfSW5kaWNhdG9yc01hc2sJCSgweDAwMWMpCisjZGVmaW5lCVhrYkFsbEV4dGVuc2lvbkRldmljZUV2ZW50c01hc2sgKDB4ODAxZikKKworICAgIC8qCisgICAgICogUGVyLUNsaWVudCBGbGFnczoKKyAgICAgKiAgLSBTcGVjaWZpZXMgZmxhZ3MgdG8gYmUgY2hhbmdlZCBieSB0aGUgUGVyQ2xpZW50RmxhZ3MgcmVxdWVzdC4KKyAgICAgKi8KKyNkZWZpbmUJWGtiUENGX0RldGVjdGFibGVBdXRvUmVwZWF0TWFzawkoMUwgPDwgMCkKKyNkZWZpbmUJWGtiUENGX0dyYWJzVXNlWEtCU3RhdGVNYXNrCSgxTCA8PCAxKQorI2RlZmluZQlYa2JQQ0ZfQXV0b1Jlc2V0Q29udHJvbHNNYXNrCSgxTCA8PCAyKQorI2RlZmluZQlYa2JQQ0ZfTG9va3VwU3RhdGVXaGVuR3JhYmJlZAkoMUwgPDwgMykKKyNkZWZpbmUJWGtiUENGX1NlbmRFdmVudFVzZXNYS0JTdGF0ZQkoMUwgPDwgNCkKKyNkZWZpbmUJWGtiUENGX0FsbEZsYWdzTWFzawkJKDB4MUYpCisKKyAgICAvKgorICAgICAqIERlYnVnZ2luZyBmbGFncyBhbmQgY29udHJvbHMKKyAgICAgKi8KKyNkZWZpbmUJWGtiREZfRGlzYWJsZUxvY2tzCSgxPDwwKQorCisjZW5kaWYgLyogX1hLQl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JnZW9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQmdlb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY5MDJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JnZW9tLmgKQEAgLTAsMCArMSw2NTkgQEAKKy8qICRYb3JnOiBYS0JnZW9tLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZSAKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgCitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIAorU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSAKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIAorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YS0JnZW9tLmgsdiAzLjkgMjAwMi8wOS8xOCAxNzoxMTo0MCB0c2kgRXhwICQgKi8KKworI2lmbmRlZiBfWEtCR0VPTV9IXworI2RlZmluZQlfWEtCR0VPTV9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCc3RyLmg+CisKKyNpZmRlZiBYS0JfSU5fU0VSVkVSCisjZGVmaW5lIFhrYkFkZEdlb21LZXlBbGlhcyAJCVNydlhrYkFkZEdlb21LZXlBbGlhcworI2RlZmluZSBYa2JBZGRHZW9tQ29sb3IgCQlTcnZYa2JBZGRHZW9tQ29sb3IKKyNkZWZpbmUgWGtiQWRkR2VvbURvb2RhZAkJU3J2WGtiQWRkR2VvbURvb2RhZAorI2RlZmluZSBYa2JBZGRHZW9tS2V5CQkJU3J2WGtiQWRkR2VvbUtleQorI2RlZmluZSBYa2JBZGRHZW9tT3V0bGluZQkJU3J2WGtiQWRkR2VvbU91dGxpbmUKKyNkZWZpbmUgWGtiQWRkR2VvbU92ZXJsYXkJCVNydlhrYkFkZEdlb21PdmVybGF5CisjZGVmaW5lIFhrYkFkZEdlb21PdmVybGF5Um93CQlTcnZYa2JBZGRHZW9tT3ZlcmxheVJvdworI2RlZmluZQlYa2JBZGRHZW9tT3ZlcmxheUtleQkJU3J2WGtiQWRkR2VvbU92ZXJsYXlLZXkKKyNkZWZpbmUgWGtiQWRkR2VvbVByb3BlcnR5CQlTcnZYa2JBZGRHZW9tUHJvcGVydHkKKyNkZWZpbmUgWGtiQWRkR2VvbVJvdwkJCVNydlhrYkFkZEdlb21Sb3cKKyNkZWZpbmUgWGtiQWRkR2VvbVNlY3Rpb24JCVNydlhrYkFkZEdlb21TZWN0aW9uCisjZGVmaW5lIFhrYkFkZEdlb21TaGFwZQkJCVNydlhrYkFkZEdlb21TaGFwZQorI2RlZmluZSBYa2JBbGxvY0dlb21LZXlBbGlhc2VzCQlTcnZYa2JBbGxvY0dlb21LZXlBbGlhc2VzCisjZGVmaW5lIFhrYkFsbG9jR2VvbUNvbG9ycwkJU3J2WGtiQWxsb2NHZW9tQ29sb3JzCisjZGVmaW5lIFhrYkFsbG9jR2VvbURvb2RhZHMJCVNydlhrYkFsbG9jR2VvbURvb2RhZHMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tS2V5cwkJU3J2WGtiQWxsb2NHZW9tS2V5cworI2RlZmluZSBYa2JBbGxvY0dlb21PdXRsaW5lcwkJU3J2WGtiQWxsb2NHZW9tT3V0bGluZXMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tUG9pbnRzCQlTcnZYa2JBbGxvY0dlb21Qb2ludHMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tUHJvcHMJCVNydlhrYkFsbG9jR2VvbVByb3BzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVJvd3MJCVNydlhrYkFsbG9jR2VvbVJvd3MKKyNkZWZpbmUgWGtiQWxsb2NHZW9tU2VjdGlvbkRvb2RhZHMJU3J2WGtiQWxsb2NHZW9tU2VjdGlvbkRvb2RhZHMKKyNkZWZpbmUgWGtiQWxsb2NHZW9tU2VjdGlvbnMJCVNydlhrYkFsbG9jR2VvbVNlY3Rpb25zCisjZGVmaW5lCVhrYkFsbG9jR2VvbU92ZXJsYXlzCQlTcnZYa2JBbGxvY0dlb21PdmVybGF5cworI2RlZmluZQlYa2JBbGxvY0dlb21PdmVybGF5Um93cwkJU3J2WGtiQWxsb2NHZW9tT3ZlcmxheVJvd3MKKyNkZWZpbmUJWGtiQWxsb2NHZW9tT3ZlcmxheUtleXMJCVNydlhrYkFsbG9jR2VvbU92ZXJsYXlLZXlzCisjZGVmaW5lIFhrYkFsbG9jR2VvbVNoYXBlcwkJU3J2WGtiQWxsb2NHZW9tU2hhcGVzCisjZGVmaW5lIFhrYkFsbG9jR2VvbWV0cnkJCVNydlhrYkFsbG9jR2VvbWV0cnkKKyNkZWZpbmUgWGtiRnJlZUdlb21LZXlBbGlhc2VzCQlTcnZYa2JGcmVlR2VvbUtleUFsaWFzZXMKKyNkZWZpbmUgWGtiRnJlZUdlb21Db2xvcnMJCVNydlhrYkZyZWVHZW9tQ29sb3JzCisjZGVmaW5lIFhrYkZyZWVHZW9tRG9vZGFkcwkJU3J2WGtiRnJlZUdlb21Eb29kYWRzCisjZGVmaW5lIFhrYkZyZWVHZW9tUHJvcGVydGllcwkJU3J2WGtiRnJlZUdlb21Qcm9wZXJ0aWVzCisjZGVmaW5lCVhrYkZyZWVHZW9tT3ZlcmxheUtleXMJCVNydlhrYkZyZWVHZW9tT3ZlcmxheUtleXMKKyNkZWZpbmUJWGtiRnJlZUdlb21PdmVybGF5Um93cwkJU3J2WGtiRnJlZUdlb21PdmVybGF5Um93cworI2RlZmluZQlYa2JGcmVlR2VvbU92ZXJsYXlzCQlTcnZYa2JGcmVlR2VvbU92ZXJsYXlzCisjZGVmaW5lCVhrYkZyZWVHZW9tS2V5cwkJCVNydlhrYkZyZWVHZW9tS2V5cworI2RlZmluZQlYa2JGcmVlR2VvbVJvd3MJCQlTcnZYa2JGcmVlR2VvbVJvd3MKKyNkZWZpbmUgWGtiRnJlZUdlb21TZWN0aW9ucwkJU3J2WGtiRnJlZUdlb21TZWN0aW9ucworI2RlZmluZQlYa2JGcmVlR2VvbVBvaW50cwkJU3J2WGtiRnJlZUdlb21Qb2ludHMKKyNkZWZpbmUJWGtiRnJlZUdlb21PdXRsaW5lcwkJU3J2WGtiRnJlZUdlb21PdXRsaW5lcworI2RlZmluZSBYa2JGcmVlR2VvbVNoYXBlcwkJU3J2WGtiRnJlZUdlb21TaGFwZXMKKyNkZWZpbmUgWGtiRnJlZUdlb21ldHJ5CQkJU3J2WGtiRnJlZUdlb21ldHJ5CisjZW5kaWYKKwordHlwZWRlZglzdHJ1Y3QgX1hrYlByb3BlcnR5IHsKKwljaGFyCSpuYW1lOworCWNoYXIJKnZhbHVlOworfSBYa2JQcm9wZXJ0eVJlYywqWGtiUHJvcGVydHlQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb2xvciB7CisJdW5zaWduZWQgaW50IAlwaXhlbDsKKwljaGFyICoJCXNwZWM7Cit9IFhrYkNvbG9yUmVjLCpYa2JDb2xvclB0cjsKKwordHlwZWRlZglzdHJ1Y3QgX1hrYlBvaW50IHsKKwlzaG9ydAl4OworCXNob3J0CXk7Cit9IFhrYlBvaW50UmVjLCAqWGtiUG9pbnRQdHI7CisKK3R5cGVkZWYgc3RydWN0CV9Ya2JCb3VuZHMgeworCXNob3J0CXgxLHkxOworCXNob3J0CXgyLHkyOworfSBYa2JCb3VuZHNSZWMsICpYa2JCb3VuZHNQdHI7CisjZGVmaW5lCVhrYkJvdW5kc1dpZHRoKGIpCSgoKGIpLT54MiktKChiKS0+eDEpKQorI2RlZmluZQlYa2JCb3VuZHNIZWlnaHQoYikJKCgoYiktPnkyKS0oKGIpLT55MSkpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JPdXRsaW5lIHsKKwl1bnNpZ25lZCBzaG9ydAludW1fcG9pbnRzOworCXVuc2lnbmVkIHNob3J0CXN6X3BvaW50czsKKwl1bnNpZ25lZCBzaG9ydAljb3JuZXJfcmFkaXVzOworCVhrYlBvaW50UHRyCXBvaW50czsKK30gWGtiT3V0bGluZVJlYywgKlhrYk91dGxpbmVQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTaGFwZSB7CisJQXRvbQkgCSBuYW1lOworCXVuc2lnbmVkIHNob3J0CSBudW1fb3V0bGluZXM7CisJdW5zaWduZWQgc2hvcnQJIHN6X291dGxpbmVzOworCVhrYk91dGxpbmVQdHIJIG91dGxpbmVzOworCVhrYk91dGxpbmVQdHIJIGFwcHJveDsKKwlYa2JPdXRsaW5lUHRyCSBwcmltYXJ5OworCVhrYkJvdW5kc1JlYwkgYm91bmRzOworfSBYa2JTaGFwZVJlYywgKlhrYlNoYXBlUHRyOworI2RlZmluZQlYa2JPdXRsaW5lSW5kZXgocyxvKQkoKGludCkoKG8pLSYocyktPm91dGxpbmVzWzBdKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlNoYXBlRG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CQkgdG9wOworCXNob3J0CQkgbGVmdDsKKwlzaG9ydAkgCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgY29sb3JfbmR4OworCXVuc2lnbmVkIHNob3J0CSBzaGFwZV9uZHg7Cit9IFhrYlNoYXBlRG9vZGFkUmVjLCAqWGtiU2hhcGVEb29kYWRQdHI7CisjZGVmaW5lCVhrYlNoYXBlRG9vZGFkQ29sb3IoZyxkKQkoJihnKS0+Y29sb3JzWyhkKS0+Y29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2hhcGVEb29kYWRTaGFwZShnLGQpCSgmKGcpLT5zaGFwZXNbKGQpLT5zaGFwZV9uZHhdKQorI2RlZmluZQlYa2JTZXRTaGFwZURvb2RhZENvbG9yKGcsZCxjKQkoKGQpLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisjZGVmaW5lCVhrYlNldFNoYXBlRG9vZGFkU2hhcGUoZyxkLHMpCSgoZCktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlRleHREb29kYWQgeworCUF0b20JCSBuYW1lOworCXVuc2lnbmVkIGNoYXIJIHR5cGU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJIAkgdG9wOworCXNob3J0CSAJIGxlZnQ7CisJc2hvcnQJIAkgYW5nbGU7CisJc2hvcnQJIAkgd2lkdGg7CisJc2hvcnQJCSBoZWlnaHQ7CisJdW5zaWduZWQgc2hvcnQJIGNvbG9yX25keDsKKwljaGFyICoJCSB0ZXh0OworCWNoYXIgKgkJIGZvbnQ7Cit9IFhrYlRleHREb29kYWRSZWMsICpYa2JUZXh0RG9vZGFkUHRyOworI2RlZmluZQlYa2JUZXh0RG9vZGFkQ29sb3IoZyxkKQkoJihnKS0+Y29sb3JzWyhkKS0+Y29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2V0VGV4dERvb2RhZENvbG9yKGcsZCxjKQkoKGQpLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJbmRpY2F0b3JEb29kYWQgeworCUF0b20JCSBuYW1lOworCXVuc2lnbmVkIGNoYXIJIHR5cGU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJIAkgdG9wOworCXNob3J0CSAJIGxlZnQ7CisJc2hvcnQJCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgc2hhcGVfbmR4OworCXVuc2lnbmVkIHNob3J0CSBvbl9jb2xvcl9uZHg7CisJdW5zaWduZWQgc2hvcnQJIG9mZl9jb2xvcl9uZHg7Cit9IFhrYkluZGljYXRvckRvb2RhZFJlYywgKlhrYkluZGljYXRvckRvb2RhZFB0cjsKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkU2hhcGUoZyxkKQkoJihnKS0+c2hhcGVzWyhkKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkT25Db2xvcihnLGQpCSgmKGcpLT5jb2xvcnNbKGQpLT5vbl9jb2xvcl9uZHhdKQorI2RlZmluZQlYa2JJbmRpY2F0b3JEb29kYWRPZmZDb2xvcihnLGQpCSgmKGcpLT5jb2xvcnNbKGQpLT5vZmZfY29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2V0SW5kaWNhdG9yRG9vZGFkT25Db2xvcihnLGQsYykgXAorCQkJCSgoZCktPm9uX2NvbG9yX25keD0gKGMpLSYoZyktPmNvbG9yc1swXSkKKyNkZWZpbmUJWGtiU2V0SW5kaWNhdG9yRG9vZGFkT2ZmQ29sb3IoZyxkLGMpIFwKKwkJCQkoKGQpLT5vZmZfY29sb3JfbmR4PSAoYyktJihnKS0+Y29sb3JzWzBdKQorI2RlZmluZQlYa2JTZXRJbmRpY2F0b3JEb29kYWRTaGFwZShnLGQscykgXAorCQkJCSgoZCktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkxvZ29Eb29kYWQgeworCUF0b20JCSBuYW1lOworCXVuc2lnbmVkIGNoYXIJIHR5cGU7CisJdW5zaWduZWQgY2hhcgkgcHJpb3JpdHk7CisJc2hvcnQJCSB0b3A7CisJc2hvcnQJCSBsZWZ0OworCXNob3J0CSAJIGFuZ2xlOworCXVuc2lnbmVkIHNob3J0CSBjb2xvcl9uZHg7CisJdW5zaWduZWQgc2hvcnQJIHNoYXBlX25keDsKKwljaGFyICoJCSBsb2dvX25hbWU7Cit9IFhrYkxvZ29Eb29kYWRSZWMsICpYa2JMb2dvRG9vZGFkUHRyOworI2RlZmluZQlYa2JMb2dvRG9vZGFkQ29sb3IoZyxkKQkJKCYoZyktPmNvbG9yc1soZCktPmNvbG9yX25keF0pCisjZGVmaW5lCVhrYkxvZ29Eb29kYWRTaGFwZShnLGQpCQkoJihnKS0+c2hhcGVzWyhkKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiU2V0TG9nb0Rvb2RhZENvbG9yKGcsZCxjKQkoKGQpLT5jb2xvcl9uZHg9IChjKS0mKGcpLT5jb2xvcnNbMF0pCisjZGVmaW5lCVhrYlNldExvZ29Eb29kYWRTaGFwZShnLGQscykJKChkKS0+c2hhcGVfbmR4PSAocyktJihnKS0+c2hhcGVzWzBdKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiQW55RG9vZGFkIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSB0eXBlOworCXVuc2lnbmVkIGNoYXIJIHByaW9yaXR5OworCXNob3J0CSAJIHRvcDsKKwlzaG9ydAkgCSBsZWZ0OworCXNob3J0CQkgYW5nbGU7Cit9IFhrYkFueURvb2RhZFJlYywgKlhrYkFueURvb2RhZFB0cjsKKwordHlwZWRlZiB1bmlvbiBfWGtiRG9vZGFkIHsKKwlYa2JBbnlEb29kYWRSZWMJCWFueTsKKwlYa2JTaGFwZURvb2RhZFJlYwlzaGFwZTsKKwlYa2JUZXh0RG9vZGFkUmVjCXRleHQ7CisJWGtiSW5kaWNhdG9yRG9vZGFkUmVjCWluZGljYXRvcjsKKwlYa2JMb2dvRG9vZGFkUmVjCWxvZ287Cit9IFhrYkRvb2RhZFJlYywgKlhrYkRvb2RhZFB0cjsKKworI2RlZmluZQlYa2JVbmtub3duRG9vZGFkCTAKKyNkZWZpbmUJWGtiT3V0bGluZURvb2RhZAkxCisjZGVmaW5lCVhrYlNvbGlkRG9vZGFkCQkyCisjZGVmaW5lCVhrYlRleHREb29kYWQJCTMKKyNkZWZpbmUJWGtiSW5kaWNhdG9yRG9vZGFkCTQKKyNkZWZpbmUJWGtiTG9nb0Rvb2RhZAkJNQorCit0eXBlZGVmIHN0cnVjdCBfWGtiS2V5IHsKKwlYa2JLZXlOYW1lUmVjCSBuYW1lOworCXNob3J0CQkgZ2FwOworCXVuc2lnbmVkIGNoYXIJIHNoYXBlX25keDsKKwl1bnNpZ25lZCBjaGFyCSBjb2xvcl9uZHg7Cit9IFhrYktleVJlYywgKlhrYktleVB0cjsKKyNkZWZpbmUJWGtiS2V5U2hhcGUoZyxrKQkoJihnKS0+c2hhcGVzWyhrKS0+c2hhcGVfbmR4XSkKKyNkZWZpbmUJWGtiS2V5Q29sb3IoZyxrKQkoJihnKS0+Y29sb3JzWyhrKS0+Y29sb3JfbmR4XSkKKyNkZWZpbmUJWGtiU2V0S2V5U2hhcGUoZyxrLHMpCSgoayktPnNoYXBlX25keD0gKHMpLSYoZyktPnNoYXBlc1swXSkKKyNkZWZpbmUJWGtiU2V0S2V5Q29sb3IoZyxrLGMpCSgoayktPmNvbG9yX25keD0gKGMpLSYoZyktPmNvbG9yc1swXSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlJvdyB7CisJc2hvcnQJIAl0b3A7CisJc2hvcnQJIAlsZWZ0OworCXVuc2lnbmVkIHNob3J0CW51bV9rZXlzOworCXVuc2lnbmVkIHNob3J0CXN6X2tleXM7CisJaW50CQl2ZXJ0aWNhbDsKKwlYa2JLZXlQdHIJa2V5czsKKwlYa2JCb3VuZHNSZWMJYm91bmRzOworfSBYa2JSb3dSZWMsICpYa2JSb3dQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTZWN0aW9uIHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBjaGFyCSBwcmlvcml0eTsKKwlzaG9ydAkgCSB0b3A7CisJc2hvcnQJIAkgbGVmdDsKKwl1bnNpZ25lZCBzaG9ydAkgd2lkdGg7CisJdW5zaWduZWQgc2hvcnQJIGhlaWdodDsKKwlzaG9ydAkgCSBhbmdsZTsKKwl1bnNpZ25lZCBzaG9ydAkgbnVtX3Jvd3M7CisJdW5zaWduZWQgc2hvcnQJIG51bV9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CSBudW1fb3ZlcmxheXM7CisJdW5zaWduZWQgc2hvcnQJIHN6X3Jvd3M7CisJdW5zaWduZWQgc2hvcnQJIHN6X2Rvb2RhZHM7CisJdW5zaWduZWQgc2hvcnQJIHN6X292ZXJsYXlzOworCVhrYlJvd1B0cgkgcm93czsKKwlYa2JEb29kYWRQdHIJIGRvb2RhZHM7CisJWGtiQm91bmRzUmVjCSBib3VuZHM7CisJc3RydWN0IF9Ya2JPdmVybGF5ICpvdmVybGF5czsKK30gWGtiU2VjdGlvblJlYywgKlhrYlNlY3Rpb25QdHI7CisKK3R5cGVkZWYJc3RydWN0IF9Ya2JPdmVybGF5S2V5IHsKKwlYa2JLZXlOYW1lUmVjCW92ZXI7CisJWGtiS2V5TmFtZVJlYwl1bmRlcjsKK30gWGtiT3ZlcmxheUtleVJlYywqWGtiT3ZlcmxheUtleVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk92ZXJsYXlSb3cgeworCXVuc2lnbmVkIHNob3J0CQlyb3dfdW5kZXI7CisJdW5zaWduZWQgc2hvcnQJCW51bV9rZXlzOworCXVuc2lnbmVkIHNob3J0CQlzel9rZXlzOworCVhrYk92ZXJsYXlLZXlQdHIJa2V5czsKK30gWGtiT3ZlcmxheVJvd1JlYywqWGtiT3ZlcmxheVJvd1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYk92ZXJsYXkgeworCUF0b20JCQluYW1lOworCVhrYlNlY3Rpb25QdHIJCXNlY3Rpb25fdW5kZXI7CisJdW5zaWduZWQgc2hvcnQJCW51bV9yb3dzOworCXVuc2lnbmVkIHNob3J0CQlzel9yb3dzOworCVhrYk92ZXJsYXlSb3dQdHIJcm93czsKKwlYa2JCb3VuZHNQdHIJCWJvdW5kczsKK30gWGtiT3ZlcmxheVJlYywqWGtiT3ZlcmxheVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkdlb21ldHJ5IHsKKwlBdG9tCQkgbmFtZTsKKwl1bnNpZ25lZCBzaG9ydAkgd2lkdGhfbW07CisJdW5zaWduZWQgc2hvcnQJIGhlaWdodF9tbTsKKwljaGFyICoJCSBsYWJlbF9mb250OworCVhrYkNvbG9yUHRyCSBsYWJlbF9jb2xvcjsKKwlYa2JDb2xvclB0cgkgYmFzZV9jb2xvcjsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfcHJvcGVydGllczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfY29sb3JzOworCXVuc2lnbmVkIHNob3J0CSBzel9zaGFwZXM7CisJdW5zaWduZWQgc2hvcnQgICBzel9zZWN0aW9uczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfZG9vZGFkczsKKwl1bnNpZ25lZCBzaG9ydAkgc3pfa2V5X2FsaWFzZXM7CisJdW5zaWduZWQgc2hvcnQJIG51bV9wcm9wZXJ0aWVzOworCXVuc2lnbmVkIHNob3J0CSBudW1fY29sb3JzOworCXVuc2lnbmVkIHNob3J0CSBudW1fc2hhcGVzOworCXVuc2lnbmVkIHNob3J0CSBudW1fc2VjdGlvbnM7CisJdW5zaWduZWQgc2hvcnQJIG51bV9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CSBudW1fa2V5X2FsaWFzZXM7CisJWGtiUHJvcGVydHlQdHIJIHByb3BlcnRpZXM7CisJWGtiQ29sb3JQdHIJIGNvbG9yczsKKwlYa2JTaGFwZVB0cgkgc2hhcGVzOworCVhrYlNlY3Rpb25QdHIJIHNlY3Rpb25zOworCVhrYkRvb2RhZFB0cgkgZG9vZGFkczsKKwlYa2JLZXlBbGlhc1B0cgkga2V5X2FsaWFzZXM7Cit9IFhrYkdlb21ldHJ5UmVjOworI2RlZmluZQlYa2JHZW9tQ29sb3JJbmRleChnLGMpCSgoaW50KSgoYyktJihnKS0+Y29sb3JzWzBdKSkKKworI2RlZmluZQlYa2JHZW9tUHJvcGVydGllc01hc2sJKDE8PDApCisjZGVmaW5lCVhrYkdlb21Db2xvcnNNYXNrCSgxPDwxKQorI2RlZmluZQlYa2JHZW9tU2hhcGVzTWFzawkoMTw8MikKKyNkZWZpbmUJWGtiR2VvbVNlY3Rpb25zTWFzawkoMTw8MykKKyNkZWZpbmUJWGtiR2VvbURvb2RhZHNNYXNrCSgxPDw0KQorI2RlZmluZQlYa2JHZW9tS2V5QWxpYXNlc01hc2sJKDE8PDUpCisjZGVmaW5lCVhrYkdlb21BbGxNYXNrCQkoMHgzZikKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkdlb21ldHJ5U2l6ZXMgeworCXVuc2lnbmVkIGludAl3aGljaDsKKwl1bnNpZ25lZCBzaG9ydAludW1fcHJvcGVydGllczsKKwl1bnNpZ25lZCBzaG9ydAludW1fY29sb3JzOworCXVuc2lnbmVkIHNob3J0CW51bV9zaGFwZXM7CisJdW5zaWduZWQgc2hvcnQJbnVtX3NlY3Rpb25zOworCXVuc2lnbmVkIHNob3J0CW51bV9kb29kYWRzOworCXVuc2lnbmVkIHNob3J0CW51bV9rZXlfYWxpYXNlczsKK30gWGtiR2VvbWV0cnlTaXplc1JlYywqWGtiR2VvbWV0cnlTaXplc1B0cjsKKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4JWGtiUHJvcGVydHlQdHIKK1hrYkFkZEdlb21Qcm9wZXJ0eSgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGNoYXIgKgkJLyogbmFtZSAqLywKKyAgICBjaGFyICoJCS8qIHZhbHVlICovCispOworCitleHRlcm4JWGtiS2V5QWxpYXNQdHIKK1hrYkFkZEdlb21LZXlBbGlhcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGNoYXIgKgkJLyogYWxpYXMgKi8sCisgICAgY2hhciAqCQkvKiByZWFsICovCispOworCitleHRlcm4JWGtiQ29sb3JQdHIKK1hrYkFkZEdlb21Db2xvcigKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGNoYXIgKgkJLyogc3BlYyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogcGl4ZWwgKi8KKyk7CisKK2V4dGVybglYa2JPdXRsaW5lUHRyCitYa2JBZGRHZW9tT3V0bGluZSgKKyAgICBYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8sCisgICAgaW50CQkJLyogc3pfcG9pbnRzICovCispOworCitleHRlcm4gWGtiU2hhcGVQdHIKK1hrYkFkZEdlb21TaGFwZSgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgaW50CQkJLyogc3pfb3V0bGluZXMgKi8KKyk7CisKK2V4dGVybiBYa2JLZXlQdHIKK1hrYkFkZEdlb21LZXkoCisgICAgWGtiUm93UHRyCQkvKiByb3cgKi8KKyk7CisKK2V4dGVybiBYa2JSb3dQdHIKK1hrYkFkZEdlb21Sb3coCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIGludAkJCS8qIHN6X2tleXMgKi8KKyk7CisKK2V4dGVybiBYa2JTZWN0aW9uUHRyCitYa2JBZGRHZW9tU2VjdGlvbigKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgaW50CQkJLyogc3pfcm93cyAqLywKKyAgICBpbnQJCQkvKiBzel9kb29kYWRzICovLAorICAgIGludAkJCS8qIHN6X292ZXJsYXlzICovCispOworCitleHRlcm4gWGtiT3ZlcmxheVB0cgorWGtiQWRkR2VvbU92ZXJsYXkoCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIEF0b20JCS8qIG5hbWUgKi8sCisgICAgaW50CQkJLyogc3pfcm93cyAqLworKTsKKworZXh0ZXJuIFhrYk92ZXJsYXlSb3dQdHIKK1hrYkFkZEdlb21PdmVybGF5Um93KAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBpbnQJCQkvKiByb3dfdW5kZXIgKi8sCisgICAgaW50CQkJLyogc3pfa2V5cyAqLworKTsKKworZXh0ZXJuIFhrYk92ZXJsYXlLZXlQdHIKK1hrYkFkZEdlb21PdmVybGF5S2V5KAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBYa2JPdmVybGF5Um93UHRyCS8qIHJvdyAqLywKKyAgICBjaGFyICoJCS8qIG92ZXIgKi8sCisgICAgY2hhciAqCQkvKiB1bmRlciAqLworKTsKKworZXh0ZXJuIFhrYkRvb2RhZFB0cgorWGtiQWRkR2VvbURvb2RhZCgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBBdG9tCQkvKiBuYW1lICovCispOworCisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbUtleUFsaWFzZXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21Db2xvcnMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21Eb29kYWRzKAorICAgIFhrYkRvb2RhZFB0cgkvKiBkb29kYWRzICovLAorICAgIGludAkJCS8qIG5Eb29kYWRzICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tUHJvcGVydGllcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbU92ZXJsYXlLZXlzKAorICAgIFhrYk92ZXJsYXlSb3dQdHIJLyogcm93ICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKK2V4dGVybiB2b2lkCitYa2JGcmVlR2VvbU92ZXJsYXlSb3dzKAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21PdmVybGF5cygKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tS2V5cygKKyAgICBYa2JSb3dQdHIJCS8qIHJvdyAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21Sb3dzKAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21TZWN0aW9ucygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIGZpcnN0ICovLAorICAgIGludAkJCS8qIGNvdW50ICovLAorICAgIEJvb2wJCS8qIGZyZWVBbGwgKi8KKyk7CisKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tUG9pbnRzKAorICAgIFhrYk91dGxpbmVQdHIJLyogb3V0bGluZSAqLywKKyAgICBpbnQJCQkvKiBmaXJzdCAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBCb29sCQkvKiBmcmVlQWxsICovCispOworCitleHRlcm4gdm9pZAorWGtiRnJlZUdlb21PdXRsaW5lcygKKyAgICBYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tU2hhcGVzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogZmlyc3QgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgQm9vbAkJLyogZnJlZUFsbCAqLworKTsKKworZXh0ZXJuIHZvaWQKK1hrYkZyZWVHZW9tZXRyeSgKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aGljaCAqLywKKyAgICBCb29sCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Qcm9wcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5Qcm9wcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tS2V5QWxpYXNlcygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5BbGlhc2VzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Db2xvcnMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuQ29sb3JzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21TaGFwZXMoCisgICAgWGtiR2VvbWV0cnlQdHIJLyogZ2VvbSAqLywKKyAgICBpbnQJCQkvKiBuU2hhcGVzICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21TZWN0aW9ucygKKyAgICBYa2JHZW9tZXRyeVB0cgkvKiBnZW9tICovLAorICAgIGludAkJCS8qIG5TZWN0aW9ucyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tT3ZlcmxheXMoCisgICAgWGtiU2VjdGlvblB0cgkvKiBzZWN0aW9uICovLAorICAgIGludAkJCS8qIG51bV9uZWVkZWQgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbU92ZXJsYXlSb3dzKAorICAgIFhrYk92ZXJsYXlQdHIJLyogb3ZlcmxheSAqLywKKyAgICBpbnQJCQkvKiBudW1fbmVlZGVkICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21PdmVybGF5S2V5cygKKyAgICBYa2JPdmVybGF5Um93UHRyCS8qIHJvdyAqLywKKyAgICBpbnQJCQkvKiBudW1fbmVlZGVkICovCispOworCitleHRlcm4gU3RhdHVzCitYa2JBbGxvY0dlb21Eb29kYWRzKAorICAgIFhrYkdlb21ldHJ5UHRyCS8qIGdlb20gKi8sCisgICAgaW50CQkJLyogbkRvb2RhZHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbVNlY3Rpb25Eb29kYWRzKAorICAgIFhrYlNlY3Rpb25QdHIJLyogc2VjdGlvbiAqLywKKyAgICBpbnQJCQkvKiBuRG9vZGFkcyAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tT3V0bGluZXMoCisgICAgWGtiU2hhcGVQdHIJCS8qIHNoYXBlICovLAorICAgIGludAkJCS8qIG5PTCAqLworKTsKKworZXh0ZXJuIFN0YXR1cworWGtiQWxsb2NHZW9tUm93cygKKyAgICBYa2JTZWN0aW9uUHRyCS8qIHNlY3Rpb24gKi8sCisgICAgaW50CQkJLyogblJvd3MgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbVBvaW50cygKKyAgICBYa2JPdXRsaW5lUHRyCS8qIG9sICovLAorICAgIGludAkJCS8qIG5QdHMgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMKK1hrYkFsbG9jR2VvbUtleXMoCisgICAgWGtiUm93UHRyCQkvKiByb3cgKi8sCisgICAgaW50CQkJLyogbktleXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMKK1hrYkFsbG9jR2VvbWV0cnkoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCVhrYkdlb21ldHJ5U2l6ZXNQdHIJLyogc2l6ZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMKK1hrYlNldEdlb21ldHJ5KAorCURpc3BsYXkgKgkJLyogZHB5ICovLAorCXVuc2lnbmVkCQkvKiBkZXZpY2VTcGVjICovLAorCVhrYkdlb21ldHJ5UHRyCQkvKiBnZW9tICovCispOworCitleHRlcm4JQm9vbAorWGtiQ29tcHV0ZVNoYXBlVG9wKAorCVhrYlNoYXBlUHRyCQkvKiBzaGFwZSAqLywKKwlYa2JCb3VuZHNQdHIJCS8qIGJvdW5kcyAqLworKTsKKworZXh0ZXJuCUJvb2wKK1hrYkNvbXB1dGVTaGFwZUJvdW5kcygKKwlYa2JTaGFwZVB0cgkJLyogc2hhcGUgKi8KKyk7CisKK2V4dGVybglCb29sCitYa2JDb21wdXRlUm93Qm91bmRzKAorCVhrYkdlb21ldHJ5UHRyCQkvKiBnZW9tICovLAorCVhrYlNlY3Rpb25QdHIJCS8qIHNlY3Rpb24gKi8sCisJWGtiUm93UHRyCQkvKiByb3cgKi8KKyk7CisKK2V4dGVybglCb29sCitYa2JDb21wdXRlU2VjdGlvbkJvdW5kcygKKwlYa2JHZW9tZXRyeVB0cgkJLyogZ2VvbSAqLywKKwlYa2JTZWN0aW9uUHRyCQkvKiBzZWN0aW9uICovCispOworCitleHRlcm4JY2hhciAqCitYa2JGaW5kT3ZlcmxheUZvcktleSgKKwlYa2JHZW9tZXRyeVB0cgkJLyogZ2VvbSAqLywKKwlYa2JTZWN0aW9uUHRyCQkvKiB3YW50ZWQgKi8sCisJY2hhciAqCQkJLyogdW5kZXIgKi8KKyk7CisKK2V4dGVybglTdGF0dXMKK1hrYkdldEdlb21ldHJ5KAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovCispOworCitleHRlcm4JU3RhdHVzCitYa2JHZXROYW1lZEdlb21ldHJ5KAorICAgIERpc3BsYXkgKgkJCS8qIGRweSAqLywKKyAgICBYa2JEZXNjUHRyCQkJLyogeGtiICovLAorICAgIEF0b20JCQkvKiBuYW1lICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1hLQlNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0Jwcm90by5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0Jwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnByb3RvLmgKQEAgLTAsMCArMSwxMjgyIEBACisvKiAkWG9yZzogWEtCcHJvdG8uaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5MyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNpbGljb24gR3JhcGhpY3Mgbm90IGJlIAordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gCitvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCitTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSAKK29mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1NJTElDT04gR1JBUEhJQ1MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgCitTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIAorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIAorREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAKK0RBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1hLQlBST1RPX0hfCisjZGVmaW5lCV9YS0JQUk9UT19IXworCisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQi5oPgorCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgQXRvbSBDQVJEMzIKKyNkZWZpbmUgVGltZSBDQVJEMzIKKyNkZWZpbmUgS2V5Q29kZSBDQVJEOAorI2RlZmluZSBLZXlTeW0gQ0FSRDMyCisKKyNkZWZpbmUJWGtiUGFkZGVkU2l6ZShuKQkoKCgodW5zaWduZWQgaW50KShuKSszKSA+PiAyKSA8PCAyKQorCit0eXBlZGVmIHN0cnVjdCBfeGtiVXNlRXh0ZW5zaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCVXNlRXh0ZW5zaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CXdhbnRlZE1ham9yIEIxNjsKKyAgICBDQVJEMTYJd2FudGVkTWlub3IgQjE2OworfSB4a2JVc2VFeHRlbnNpb25SZXE7CisjZGVmaW5lCXN6X3hrYlVzZUV4dGVuc2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JVc2VFeHRlbnNpb25SZXBseSB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJc3VwcG9ydGVkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXNlcnZlck1ham9yIEIxNjsKKyAgICBDQVJEMTYJc2VydmVyTWlub3IgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhrYlVzZUV4dGVuc2lvblJlcGx5OworI2RlZmluZQlzel94a2JVc2VFeHRlbnNpb25SZXBseQkzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiU2VsZWN0RXZlbnRzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIFhfS0JTZWxlY3RFdmVudHMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWFmZmVjdFdoaWNoIEIxNjsKKyAgICBDQVJEMTYJY2xlYXIgQjE2OworICAgIENBUkQxNglzZWxlY3RBbGwgQjE2OworICAgIENBUkQxNglhZmZlY3RNYXAgQjE2OworICAgIENBUkQxNgltYXAgQjE2OworfSB4a2JTZWxlY3RFdmVudHNSZXE7CisjZGVmaW5lCXN6X3hrYlNlbGVjdEV2ZW50c1JlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiQmVsbCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBYX0tCQmVsbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJYmVsbENsYXNzIEIxNjsKKyAgICBDQVJEMTYJYmVsbElEIEIxNjsKKyAgICBJTlQ4CXBlcmNlbnQ7CisgICAgQk9PTAlmb3JjZVNvdW5kOworICAgIEJPT0wJZXZlbnRPbmx5OworICAgIENBUkQ4CXBhZDE7CisgICAgSU5UMTYJcGl0Y2ggQjE2OworICAgIElOVDE2CWR1cmF0aW9uIEIxNjsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKK30geGtiQmVsbFJlcTsKKyNkZWZpbmUJc3pfeGtiQmVsbFJlcQkJMjgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldFN0YXRlIHsKKwlDQVJEOAkJcmVxVHlwZTsKKwlDQVJEOAkJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRTdGF0ZSAqLworCUNBUkQxNgkJbGVuZ3RoIEIxNjsKKwlDQVJEMTYJCWRldmljZVNwZWMgQjE2OworCUNBUkQxNgkJcGFkIEIxNjsKK30geGtiR2V0U3RhdGVSZXE7CisjZGVmaW5lCXN6X3hrYkdldFN0YXRlUmVxCTgKKwordHlwZWRlZglzdHJ1Y3QgX3hrYkdldFN0YXRlUmVwbHkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbW9kczsKKyAgICBDQVJEOAliYXNlTW9kczsKKyAgICBDQVJEOAlsYXRjaGVkTW9kczsKKyAgICBDQVJEOAlsb2NrZWRNb2RzOworICAgIENBUkQ4CWdyb3VwOworICAgIENBUkQ4CWxvY2tlZEdyb3VwOworICAgIElOVDE2CWJhc2VHcm91cCBCMTY7CisgICAgSU5UMTYJbGF0Y2hlZEdyb3VwIEIxNjsKKyAgICBDQVJEOAljb21wYXRTdGF0ZTsKKyAgICBDQVJEOAlncmFiTW9kczsKKyAgICBDQVJEOAljb21wYXRHcmFiTW9kczsKKyAgICBDQVJEOAlsb29rdXBNb2RzOworICAgIENBUkQ4CWNvbXBhdExvb2t1cE1vZHM7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcHRyQnRuU3RhdGUgQjE2OworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkdldFN0YXRlUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldFN0YXRlUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkxhdGNoTG9ja1N0YXRlIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCTGF0Y2hMb2NrU3RhdGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJYWZmZWN0TW9kTG9ja3M7CisgICAgQ0FSRDgJbW9kTG9ja3M7CisgICAgQk9PTAlsb2NrR3JvdXA7CisgICAgQ0FSRDgJZ3JvdXBMb2NrOworICAgIENBUkQ4CWFmZmVjdE1vZExhdGNoZXM7CisgICAgQ0FSRDgJbW9kTGF0Y2hlczsKKyAgICBDQVJEOAlwYWQ7CisgICAgQk9PTAlsYXRjaEdyb3VwOworICAgIElOVDE2CWdyb3VwTGF0Y2ggQjE2OworfSB4a2JMYXRjaExvY2tTdGF0ZVJlcTsKKyNkZWZpbmUJc3pfeGtiTGF0Y2hMb2NrU3RhdGVSZXEJCTE2CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRDb250cm9scyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkdldENvbnRyb2xzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworfSB4a2JHZXRDb250cm9sc1JlcTsKKyNkZWZpbmUJc3pfeGtiR2V0Q29udHJvbHNSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0Q29udHJvbHNSZXBseSB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJbWtEZmx0QnRuOworICAgIENBUkQ4CW51bUdyb3VwczsKKyAgICBDQVJEOAlncm91cHNXcmFwOworICAgIENBUkQ4CWludGVybmFsTW9kczsKKyAgICBDQVJEOAlpZ25vcmVMb2NrTW9kczsKKyAgICBDQVJEOAlpbnRlcm5hbFJlYWxNb2RzOworICAgIENBUkQ4CWlnbm9yZUxvY2tSZWFsTW9kczsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglpbnRlcm5hbFZNb2RzIEIxNjsKKyAgICBDQVJEMTYJaWdub3JlTG9ja1ZNb2RzIEIxNjsKKyAgICBDQVJEMTYJcmVwZWF0RGVsYXkgQjE2OworICAgIENBUkQxNglyZXBlYXRJbnRlcnZhbCBCMTY7CisgICAgQ0FSRDE2CXNsb3dLZXlzRGVsYXkgQjE2OworICAgIENBUkQxNglkZWJvdW5jZURlbGF5IEIxNjsKKyAgICBDQVJEMTYJbWtEZWxheSBCMTY7CisgICAgQ0FSRDE2CW1rSW50ZXJ2YWwgQjE2OworICAgIENBUkQxNglta1RpbWVUb01heCBCMTY7CisgICAgQ0FSRDE2CW1rTWF4U3BlZWQgQjE2OworICAgIElOVDE2CW1rQ3VydmUgQjE2OworICAgIENBUkQxNglheE9wdGlvbnMgQjE2OworICAgIENBUkQxNglheFRpbWVvdXQgQjE2OworICAgIENBUkQxNglheHRPcHRzTWFzayBCMTY7CisgICAgQ0FSRDE2CWF4dE9wdHNWYWx1ZXMgQjE2OworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJYXh0Q3RybHNNYXNrIEIzMjsKKyAgICBDQVJEMzIJYXh0Q3RybHNWYWx1ZXMgQjMyOworICAgIENBUkQzMgllbmFibGVkQ3RybHMgQjMyOworICAgIEJZVEUJcGVyS2V5UmVwZWF0W1hrYlBlcktleUJpdEFycmF5U2l6ZV07Cit9IHhrYkdldENvbnRyb2xzUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldENvbnRyb2xzUmVwbHkJOTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldENvbnRyb2xzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0Q29udHJvbHMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJYWZmZWN0SW50ZXJuYWxNb2RzOworICAgIENBUkQ4CWludGVybmFsTW9kczsKKyAgICBDQVJEOAlhZmZlY3RJZ25vcmVMb2NrTW9kczsKKyAgICBDQVJEOAlpZ25vcmVMb2NrTW9kczsKKyAgICBDQVJEMTYJYWZmZWN0SW50ZXJuYWxWTW9kcyBCMTY7CisgICAgQ0FSRDE2CWludGVybmFsVk1vZHMgQjE2OworICAgIENBUkQxNglhZmZlY3RJZ25vcmVMb2NrVk1vZHMgQjE2OworICAgIENBUkQxNglpZ25vcmVMb2NrVk1vZHMgQjE2OworICAgIENBUkQ4CW1rRGZsdEJ0bjsKKyAgICBDQVJEOAlncm91cHNXcmFwOworICAgIENBUkQxNglheE9wdGlvbnMgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJYWZmZWN0RW5hYmxlZEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJZW5hYmxlZEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJY2hhbmdlQ3RybHMgQjMyOworICAgIENBUkQxNglyZXBlYXREZWxheSBCMTY7CisgICAgQ0FSRDE2CXJlcGVhdEludGVydmFsIEIxNjsKKyAgICBDQVJEMTYJc2xvd0tleXNEZWxheSBCMTY7CisgICAgQ0FSRDE2CWRlYm91bmNlRGVsYXkgQjE2OworICAgIENBUkQxNglta0RlbGF5IEIxNjsKKyAgICBDQVJEMTYJbWtJbnRlcnZhbCBCMTY7CisgICAgQ0FSRDE2CW1rVGltZVRvTWF4IEIxNjsKKyAgICBDQVJEMTYJbWtNYXhTcGVlZCBCMTY7CisgICAgSU5UMTYJbWtDdXJ2ZSBCMTY7CisgICAgQ0FSRDE2CWF4VGltZW91dCBCMTY7CisgICAgQ0FSRDMyCWF4dEN0cmxzTWFzayBCMzI7CisgICAgQ0FSRDMyCWF4dEN0cmxzVmFsdWVzIEIzMjsKKyAgICBDQVJEMTYJYXh0T3B0c01hc2sgQjE2OworICAgIENBUkQxNglheHRPcHRzVmFsdWVzIEIxNjsKKyAgICBCWVRFCXBlcktleVJlcGVhdFtYa2JQZXJLZXlCaXRBcnJheVNpemVdOworfSB4a2JTZXRDb250cm9sc1JlcTsKKyNkZWZpbmUJc3pfeGtiU2V0Q29udHJvbHNSZXEJMTAwCisKK3R5cGVkZWYJc3RydWN0IF94a2JLVE1hcEVudHJ5V2lyZURlc2MgeworICAgIEJPT0wJYWN0aXZlOworICAgIENBUkQ4CW1hc2s7CisgICAgQ0FSRDgJbGV2ZWw7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiS1RNYXBFbnRyeVdpcmVEZXNjOworI2RlZmluZSBzel94a2JLVE1hcEVudHJ5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiS1RTZXRNYXBFbnRyeVdpcmVEZXNjIHsKKyAgICBDQVJEOAlsZXZlbDsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworfSB4a2JLVFNldE1hcEVudHJ5V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYktUU2V0TWFwRW50cnlXaXJlRGVzYwk0CisKK3R5cGVkZWYgc3RydWN0IF94a2JNb2RzV2lyZURlc2MgeworICAgIENBUkQ4CW1hc2s7CQkvKiBHZXRNYXAgb25seSAqLworICAgIENBUkQ4CXJlYWxNb2RzOworICAgIENBUkQxNgl2aXJ0dWFsTW9kcyBCMTY7Cit9IHhrYk1vZHNXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiTW9kc1dpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYktleVR5cGVXaXJlRGVzYyB7CisgICAgQ0FSRDgJbWFzazsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQ4CW51bUxldmVsczsKKyAgICBDQVJEOAluTWFwRW50cmllczsKKyAgICBCT09MCXByZXNlcnZlOworICAgIENBUkQ4CXBhZDsKK30geGtiS2V5VHlwZVdpcmVEZXNjOworI2RlZmluZQlzel94a2JLZXlUeXBlV2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiU3ltTWFwV2lyZURlc2MgeworICAgIENBUkQ4CWt0SW5kZXhbWGtiTnVtS2JkR3JvdXBzXTsKKyAgICBDQVJEOAlncm91cEluZm87CisgICAgQ0FSRDgJd2lkdGg7CisgICAgQ0FSRDE2CW5TeW1zIEIxNjsKK30geGtiU3ltTWFwV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlN5bU1hcFdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlZNb2RNYXBXaXJlRGVzYyB7CisgICAgS2V5Q29kZQlrZXk7CisgICAgQ0FSRDgJcGFkOworICAgIENBUkQxNgl2bW9kcyBCMTY7Cit9IHhrYlZNb2RNYXBXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiVk1vZE1hcFdpcmVEZXNjCTQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkJlaGF2aW9yV2lyZURlc2MgeworCUNBUkQ4CWtleTsKKwlDQVJEOAl0eXBlOworCUNBUkQ4CWRhdGE7CisJQ0FSRDgJcGFkOworfSB4a2JCZWhhdmlvcldpcmVEZXNjOworI2RlZmluZQlzel94a2JCZWhhdmlvcldpcmVEZXNjCTQKKwordHlwZWRlZglzdHJ1Y3QgX3hrYkFjdGlvbldpcmVEZXNjIHsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CWRhdGFbN107Cit9IHhrYkFjdGlvbldpcmVEZXNjOworI2RlZmluZQlzel94a2JBY3Rpb25XaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWZ1bGwgQjE2OworICAgIENBUkQxNglwYXJ0aWFsIEIxNjsKKyAgICBDQVJEOAlmaXJzdFR5cGU7CisgICAgQ0FSRDgJblR5cGVzOworICAgIEtleUNvZGUJZmlyc3RLZXlTeW07CisgICAgQ0FSRDgJbktleVN5bXM7CisgICAgS2V5Q29kZQlmaXJzdEtleUFjdDsKKyAgICBDQVJEOAluS2V5QWN0czsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QmVoYXZpb3I7CisgICAgQ0FSRDgJbktleUJlaGF2aW9yczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXlFeHBsaWNpdDsKKyAgICBDQVJEOAluS2V5RXhwbGljaXQ7CisgICAgS2V5Q29kZQlmaXJzdE1vZE1hcEtleTsKKyAgICBDQVJEOAluTW9kTWFwS2V5czsKKyAgICBLZXlDb2RlCWZpcnN0Vk1vZE1hcEtleTsKKyAgICBDQVJEOAluVk1vZE1hcEtleXM7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworfSB4a2JHZXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYkdldE1hcFJlcQkyOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TWFwUmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQ0FSRDE2CXByZXNlbnQgQjE2OworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJdG90YWxUeXBlczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5U3ltOworICAgIENBUkQxNgl0b3RhbFN5bXMgQjE2OworICAgIENBUkQ4CW5LZXlTeW1zOworICAgIEtleUNvZGUJZmlyc3RLZXlBY3Q7CisgICAgQ0FSRDE2CXRvdGFsQWN0cyBCMTY7CisgICAgQ0FSRDgJbktleUFjdHM7CisgICAgS2V5Q29kZQlmaXJzdEtleUJlaGF2aW9yOworICAgIENBUkQ4CW5LZXlCZWhhdmlvcnM7CisgICAgQ0FSRDgJdG90YWxLZXlCZWhhdmlvcnM7CisgICAgS2V5Q29kZQlmaXJzdEtleUV4cGxpY2l0OworICAgIENBUkQ4CW5LZXlFeHBsaWNpdDsKKyAgICBDQVJEOAl0b3RhbEtleUV4cGxpY2l0OworICAgIEtleUNvZGUJZmlyc3RNb2RNYXBLZXk7CisgICAgQ0FSRDgJbk1vZE1hcEtleXM7CisgICAgQ0FSRDgJdG90YWxNb2RNYXBLZXlzOworICAgIEtleUNvZGUJZmlyc3RWTW9kTWFwS2V5OworICAgIENBUkQ4CW5WTW9kTWFwS2V5czsKKyAgICBDQVJEOAl0b3RhbFZNb2RNYXBLZXlzOworICAgIENBUkQ4CXBhZDI7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKK30geGtiR2V0TWFwUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldE1hcFJlcGx5CQk0MAorCisjZGVmaW5lCVhrYlNldE1hcFJlc2l6ZVR5cGVzCQkoMUw8PDApCisjZGVmaW5lCVhrYlNldE1hcFJlY29tcHV0ZUFjdGlvbnMJKDFMPDwxKQorI2RlZmluZQlYa2JTZXRNYXBBbGxGbGFncwkJKDB4MykKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldE1hcCB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldE1hcCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcHJlc2VudCBCMTY7CisgICAgQ0FSRDE2CWZsYWdzIEIxNjsKKyAgICBLZXlDb2RlCW1pbktleUNvZGU7CisgICAgS2V5Q29kZQltYXhLZXlDb2RlOworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgS2V5Q29kZQlmaXJzdEtleVN5bTsKKyAgICBDQVJEOAluS2V5U3ltczsKKyAgICBDQVJEMTYJdG90YWxTeW1zIEIxNjsKKyAgICBLZXlDb2RlCWZpcnN0S2V5QWN0OworICAgIENBUkQ4CW5LZXlBY3RzOworICAgIENBUkQxNgl0b3RhbEFjdHMgQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXlCZWhhdmlvcjsKKyAgICBDQVJEOAluS2V5QmVoYXZpb3JzOworICAgIENBUkQ4CXRvdGFsS2V5QmVoYXZpb3JzOworICAgIEtleUNvZGUJZmlyc3RLZXlFeHBsaWNpdDsKKyAgICBDQVJEOAluS2V5RXhwbGljaXQ7CisgICAgQ0FSRDgJdG90YWxLZXlFeHBsaWNpdDsKKyAgICBLZXlDb2RlCWZpcnN0TW9kTWFwS2V5OworICAgIENBUkQ4CW5Nb2RNYXBLZXlzOworICAgIENBUkQ4CXRvdGFsTW9kTWFwS2V5czsKKyAgICBLZXlDb2RlCWZpcnN0Vk1vZE1hcEtleTsKKyAgICBDQVJEOAluVk1vZE1hcEtleXM7CisgICAgQ0FSRDgJdG90YWxWTW9kTWFwS2V5czsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworfSB4a2JTZXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYlNldE1hcFJlcQkzNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU3ltSW50ZXJwcmV0V2lyZURlc2MgeworICAgIENBUkQzMgkJc3ltIEIzMjsKKyAgICBDQVJEOAkJbW9kczsKKyAgICBDQVJEOAkJbWF0Y2g7CisgICAgQ0FSRDgJCXZpcnR1YWxNb2Q7CisgICAgQ0FSRDgJCWZsYWdzOworICAgIHhrYkFjdGlvbldpcmVEZXNjCWFjdDsKK30geGtiU3ltSW50ZXJwcmV0V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlN5bUludGVycHJldFdpcmVEZXNjCTE2CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRDb21wYXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRDb21wYXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIEJPT0wJZ2V0QWxsU0k7CisgICAgQ0FSRDE2CWZpcnN0U0kgQjE2OworICAgIENBUkQxNgluU0kgQjE2OworfSB4a2JHZXRDb21wYXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYkdldENvbXBhdE1hcFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0Q29tcGF0TWFwUmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CWZpcnN0U0kgQjE2OworICAgIENBUkQxNgluU0kgQjE2OworICAgIENBUkQxNgluVG90YWxTSSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4a2JHZXRDb21wYXRNYXBSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0Q29tcGF0TWFwUmVwbHkJCTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXRDb21wYXRNYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JTZXRDb21wYXRNYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBCT09MCXJlY29tcHV0ZUFjdGlvbnM7CisgICAgQk9PTAl0cnVuY2F0ZVNJOworICAgIENBUkQ4CWdyb3VwczsKKyAgICBDQVJEMTYJZmlyc3RTSSBCMTY7CisgICAgQ0FSRDE2CW5TSSBCMTY7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JTZXRDb21wYXRNYXBSZXE7CisjZGVmaW5lCXN6X3hrYlNldENvbXBhdE1hcFJlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0SW5kaWNhdG9yU3RhdGUgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRJbmRpY2F0b3JTdGF0ZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7Cit9IHhrYkdldEluZGljYXRvclN0YXRlUmVxOworI2RlZmluZQlzel94a2JHZXRJbmRpY2F0b3JTdGF0ZVJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRJbmRpY2F0b3JTdGF0ZVJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglzdGF0ZSBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geGtiR2V0SW5kaWNhdG9yU3RhdGVSZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0SW5kaWNhdG9yU3RhdGVSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0SW5kaWNhdG9yTWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0SW5kaWNhdG9yTWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworICAgIENBUkQzMgl3aGljaCBCMzI7Cit9IHhrYkdldEluZGljYXRvck1hcFJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0SW5kaWNhdG9yTWFwUmVxCTEyCisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXRJbmRpY2F0b3JNYXBSZXBseSB7CisgICAgQ0FSRDgJdHlwZTsJCS8qIGFsd2F5cyBYX1JlcGx5ICovCisgICAgQ0FSRDgJZGV2aWNlSUQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworICAgIENBUkQzMglyZWFsSW5kaWNhdG9ycyBCMzI7CisgICAgQ0FSRDgJbkluZGljYXRvcnM7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhrYkdldEluZGljYXRvck1hcFJlcGx5OworI2RlZmluZQlzel94a2JHZXRJbmRpY2F0b3JNYXBSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiSW5kaWNhdG9yTWFwV2lyZURlc2MgeworICAgIENBUkQ4CWZsYWdzOworICAgIENBUkQ4CXdoaWNoR3JvdXBzOworICAgIENBUkQ4CWdyb3VwczsKKyAgICBDQVJEOAl3aGljaE1vZHM7CisgICAgQ0FSRDgJbW9kczsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQzMgljdHJscyBCMzI7Cit9IHhrYkluZGljYXRvck1hcFdpcmVEZXNjOworI2RlZmluZQlzel94a2JJbmRpY2F0b3JNYXBXaXJlRGVzYwkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2V0SW5kaWNhdG9yTWFwIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0SW5kaWNhdG9yTWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworfSB4a2JTZXRJbmRpY2F0b3JNYXBSZXE7CisjZGVmaW5lCXN6X3hrYlNldEluZGljYXRvck1hcFJlcQkxMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TmFtZWRJbmRpY2F0b3IgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogWF9LQkdldE5hbWVkSW5kaWNhdG9yICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQXRvbQlpbmRpY2F0b3IgQjMyOworfSB4a2JHZXROYW1lZEluZGljYXRvclJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0TmFtZWRJbmRpY2F0b3JSZXEJCTE2CisKK3R5cGVkZWYJc3RydWN0IF94a2JHZXROYW1lZEluZGljYXRvclJlcGx5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEF0b20JaW5kaWNhdG9yIEIzMjsKKyAgICBCT09MCWZvdW5kOworICAgIEJPT0wJb247CisgICAgQk9PTAlyZWFsSW5kaWNhdG9yOworICAgIENBUkQ4CW5keDsKKyAgICBDQVJEOAlmbGFnczsKKyAgICBDQVJEOAl3aGljaEdyb3VwczsKKyAgICBDQVJEOAlncm91cHM7CisgICAgQ0FSRDgJd2hpY2hNb2RzOworICAgIENBUkQ4CW1vZHM7CisgICAgQ0FSRDgJcmVhbE1vZHM7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMzIJY3RybHMgQjMyOworICAgIEJPT0wJc3VwcG9ydGVkOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JHZXROYW1lZEluZGljYXRvclJlcGx5OworI2RlZmluZQlzel94a2JHZXROYW1lZEluZGljYXRvclJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXROYW1lZEluZGljYXRvciB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBYX0tCU2V0TmFtZWRJbmRpY2F0b3IgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CWxlZENsYXNzIEIxNjsKKyAgICBDQVJEMTYJbGVkSUQgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBBdG9tCWluZGljYXRvciBCMzI7CisgICAgQk9PTAlzZXRTdGF0ZTsKKyAgICBCT09MCW9uOworICAgIEJPT0wJc2V0TWFwOworICAgIEJPT0wJY3JlYXRlTWFwOworICAgIENBUkQ4CXBhZDI7CisgICAgQ0FSRDgJZmxhZ3M7CisgICAgQ0FSRDgJd2hpY2hHcm91cHM7CisgICAgQ0FSRDgJZ3JvdXBzOworICAgIENBUkQ4CXdoaWNoTW9kczsKKyAgICBDQVJEOAlyZWFsTW9kczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQzMgljdHJscyBCMzI7Cit9IHhrYlNldE5hbWVkSW5kaWNhdG9yUmVxOworI2RlZmluZQlzel94a2JTZXROYW1lZEluZGljYXRvclJlcQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0TmFtZXMgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXROYW1lcyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworfSB4a2JHZXROYW1lc1JlcTsKKyNkZWZpbmUJc3pfeGtiR2V0TmFtZXNSZXEJCTEyCisKK3R5cGVkZWYJc3RydWN0IF94a2JHZXROYW1lc1JlcGx5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl3aGljaCBCMzI7CisgICAgS2V5Q29kZQltaW5LZXlDb2RlOworICAgIEtleUNvZGUJbWF4S2V5Q29kZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJZ3JvdXBOYW1lczsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIEtleUNvZGUJZmlyc3RLZXk7CisgICAgQ0FSRDgJbktleXM7CisgICAgQ0FSRDMyCWluZGljYXRvcnMgQjMyOworICAgIENBUkQ4CW5SYWRpb0dyb3VwczsKKyAgICBDQVJEOAluS2V5QWxpYXNlczsKKyAgICBDQVJEMTYJbktUTGV2ZWxzIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkdldE5hbWVzUmVwbHk7CisjZGVmaW5lCXN6X3hrYkdldE5hbWVzUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldE5hbWVzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0TmFtZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJZGV2aWNlU3BlYyBCMTY7CisgICAgQ0FSRDE2CXZpcnR1YWxNb2RzIEIxNjsKKyAgICBDQVJEMzIJd2hpY2ggQjMyOworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJZmlyc3RLVExldmVsOworICAgIENBUkQ4CW5LVExldmVsczsKKyAgICBDQVJEMzIJaW5kaWNhdG9ycyBCMzI7CisgICAgQ0FSRDgJZ3JvdXBOYW1lczsKKyAgICBDQVJEOAluUmFkaW9Hcm91cHM7CisgICAgS2V5Q29kZQlmaXJzdEtleTsKKyAgICBDQVJEOAluS2V5czsKKyAgICBDQVJEOAluS2V5QWxpYXNlczsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNgl0b3RhbEtUTGV2ZWxOYW1lcyBCMTY7Cit9IHhrYlNldE5hbWVzUmVxOworI2RlZmluZQlzel94a2JTZXROYW1lc1JlcQkyOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiUG9pbnRXaXJlRGVzYyB7CisgICAgSU5UMTYJeCBCMTY7CisgICAgSU5UMTYJeSBCMTY7Cit9IHhrYlBvaW50V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlBvaW50V2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3V0bGluZVdpcmVEZXNjIHsKKyAgICBDQVJEOAluUG9pbnRzOworICAgIENBUkQ4CWNvcm5lclJhZGl1czsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiT3V0bGluZVdpcmVEZXNjOworI2RlZmluZQlzel94a2JPdXRsaW5lV2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2hhcGVXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAluT3V0bGluZXM7CisgICAgQ0FSRDgJcHJpbWFyeU5keDsKKyAgICBDQVJEOAlhcHByb3hOZHg7CisgICAgQ0FSRDgJcGFkOworfSB4a2JTaGFwZVdpcmVEZXNjOworI2RlZmluZQlzel94a2JTaGFwZVdpcmVEZXNjCTgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNlY3Rpb25XaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CXByaW9yaXR5OworICAgIENBUkQ4CW5Sb3dzOworICAgIENBUkQ4CW5Eb29kYWRzOworICAgIENBUkQ4CW5PdmVybGF5czsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geGtiU2VjdGlvbldpcmVEZXNjOworI2RlZmluZQlzel94a2JTZWN0aW9uV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlJvd1dpcmVEZXNjIHsKKyAgICBJTlQxNgl0b3AgQjE2OworICAgIElOVDE2CWxlZnQgQjE2OworICAgIENBUkQ4CW5LZXlzOworICAgIEJPT0wJdmVydGljYWw7CisgICAgQ0FSRDE2CXBhZCBCMTY7Cit9IHhrYlJvd1dpcmVEZXNjOworI2RlZmluZQlzel94a2JSb3dXaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JLZXlXaXJlRGVzYyB7CisgICAgQ0FSRDgJbmFtZVtYa2JLZXlOYW1lTGVuZ3RoXTsKKyAgICBJTlQxNglnYXAgQjE2OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQ4CWNvbG9yTmR4OworfSB4a2JLZXlXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiS2V5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3ZlcmxheVdpcmVEZXNjIHsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQ4CW5Sb3dzOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworfSB4a2JPdmVybGF5V2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYk92ZXJsYXlXaXJlRGVzYwk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JPdmVybGF5Um93V2lyZURlc2MgeworICAgQ0FSRDgJcm93VW5kZXI7CisgICBDQVJEOAluS2V5czsKKyAgIENBUkQxNglwYWQxIEIxNjsKK30geGtiT3ZlcmxheVJvd1dpcmVEZXNjOworI2RlZmluZQlzel94a2JPdmVybGF5Um93V2lyZURlc2MJNAorCit0eXBlZGVmIHN0cnVjdCBfeGtiT3ZlcmxheUtleVdpcmVEZXNjIHsKKyAgIENBUkQ4CW92ZXJbWGtiS2V5TmFtZUxlbmd0aF07CisgICBDQVJEOAl1bmRlcltYa2JLZXlOYW1lTGVuZ3RoXTsKK30geGtiT3ZlcmxheUtleVdpcmVEZXNjOworI2RlZmluZQlzel94a2JPdmVybGF5S2V5V2lyZURlc2MJOAorCit0eXBlZGVmIHN0cnVjdCBfeGtiU2hhcGVEb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CWNvbG9yTmR4OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYlNoYXBlRG9vZGFkV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYlNoYXBlRG9vZGFkV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlRleHREb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgQ0FSRDgJY29sb3JOZHg7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7Cit9IHhrYlRleHREb29kYWRXaXJlRGVzYzsKKyNkZWZpbmUJc3pfeGtiVGV4dERvb2RhZFdpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYyB7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBDQVJEOAl0eXBlOworICAgIENBUkQ4CXByaW9yaXR5OworICAgIElOVDE2CXRvcCBCMTY7CisgICAgSU5UMTYJbGVmdCBCMTY7CisgICAgSU5UMTYJYW5nbGUgQjE2OworICAgIENBUkQ4CXNoYXBlTmR4OworICAgIENBUkQ4CW9uQ29sb3JOZHg7CisgICAgQ0FSRDgJb2ZmQ29sb3JOZHg7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYkluZGljYXRvckRvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYwkyMAorCit0eXBlZGVmIHN0cnVjdCBfeGtiTG9nb0Rvb2RhZFdpcmVEZXNjIHsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQ4CXR5cGU7CisgICAgQ0FSRDgJcHJpb3JpdHk7CisgICAgSU5UMTYJdG9wIEIxNjsKKyAgICBJTlQxNglsZWZ0IEIxNjsKKyAgICBJTlQxNglhbmdsZSBCMTY7CisgICAgQ0FSRDgJY29sb3JOZHg7CisgICAgQ0FSRDgJc2hhcGVOZHg7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKK30geGtiTG9nb0Rvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JMb2dvRG9vZGFkV2lyZURlc2MJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFueURvb2RhZFdpcmVEZXNjIHsKKyAgICBBdG9tCW5hbWUgQjMyOworICAgIENBUkQ4CXR5cGU7CisgICAgQ0FSRDgJcHJpb3JpdHk7CisgICAgSU5UMTYJdG9wIEIxNjsKKyAgICBJTlQxNglsZWZ0IEIxNjsKKyAgICBJTlQxNglhbmdsZSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geGtiQW55RG9vZGFkV2lyZURlc2M7CisjZGVmaW5lCXN6X3hrYkFueURvb2RhZFdpcmVEZXNjCTIwCisKK3R5cGVkZWYgdW5pb24gX3hrYkRvb2RhZFdpcmVEZXNjIHsKKyAgICB4a2JBbnlEb29kYWRXaXJlRGVzYwlhbnk7CisgICAgeGtiU2hhcGVEb29kYWRXaXJlRGVzYwlzaGFwZTsKKyAgICB4a2JUZXh0RG9vZGFkV2lyZURlc2MJdGV4dDsKKyAgICB4a2JJbmRpY2F0b3JEb29kYWRXaXJlRGVzYwlpbmRpY2F0b3I7CisgICAgeGtiTG9nb0Rvb2RhZFdpcmVEZXNjCWxvZ287Cit9IHhrYkRvb2RhZFdpcmVEZXNjOworI2RlZmluZQlzel94a2JEb29kYWRXaXJlRGVzYwkyMAorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0R2VvbWV0cnkgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJeGtiUmVxVHlwZTsJLyogYWx3YXlzIFhfS0JHZXRHZW9tZXRyeSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBBdG9tCW5hbWUgQjMyOworfSB4a2JHZXRHZW9tZXRyeVJlcTsKKyNkZWZpbmUJc3pfeGtiR2V0R2VvbWV0cnlSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEdlb21ldHJ5UmVwbHkgeworICAgIENBUkQ4CXR5cGU7CQkvKiBhbHdheXMgWF9SZXBseSAqLworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBCT09MCWZvdW5kOworICAgIENBUkQ4CXBhZDsKKyAgICBDQVJEMTYJd2lkdGhNTSBCMTY7CisgICAgQ0FSRDE2CWhlaWdodE1NIEIxNjsKKyAgICBDQVJEMTYJblByb3BlcnRpZXMgQjE2OworICAgIENBUkQxNgluQ29sb3JzIEIxNjsKKyAgICBDQVJEMTYJblNoYXBlcyBCMTY7CisgICAgQ0FSRDE2CW5TZWN0aW9ucyBCMTY7CisgICAgQ0FSRDE2CW5Eb29kYWRzIEIxNjsKKyAgICBDQVJEMTYJbktleUFsaWFzZXMgQjE2OworICAgIENBUkQ4CWJhc2VDb2xvck5keDsKKyAgICBDQVJEOAlsYWJlbENvbG9yTmR4OworfSB4a2JHZXRHZW9tZXRyeVJlcGx5OworI2RlZmluZQlzel94a2JHZXRHZW9tZXRyeVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXRHZW9tZXRyeSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQlNldEdlb21ldHJ5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQ4CW5TaGFwZXM7CisgICAgQ0FSRDgJblNlY3Rpb25zOworICAgIEF0b20JbmFtZSBCMzI7CisgICAgQ0FSRDE2CXdpZHRoTU0gQjE2OworICAgIENBUkQxNgloZWlnaHRNTSBCMTY7CisgICAgQ0FSRDE2CW5Qcm9wZXJ0aWVzIEIxNjsKKyAgICBDQVJEMTYJbkNvbG9ycyBCMTY7CisgICAgQ0FSRDE2CW5Eb29kYWRzIEIxNjsKKyAgICBDQVJEMTYJbktleUFsaWFzZXMgQjE2OworICAgIENBUkQ4CWJhc2VDb2xvck5keDsKKyAgICBDQVJEOAlsYWJlbENvbG9yTmR4OworICAgIENBUkQxNglwYWQgQjE2OworfSB4a2JTZXRHZW9tZXRyeVJlcTsKKyNkZWZpbmUJc3pfeGtiU2V0R2VvbWV0cnlSZXEJMjgKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlBlckNsaWVudEZsYWdzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7LyogYWx3YXlzIFhfS0JQZXJDbGllbnRGbGFncyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCWNoYW5nZSBCMzI7CisgICAgQ0FSRDMyCXZhbHVlIEIzMjsKKyAgICBDQVJEMzIJY3RybHNUb0NoYW5nZSBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJscyBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJsVmFsdWVzIEIzMjsKK30geGtiUGVyQ2xpZW50RmxhZ3NSZXE7CisjZGVmaW5lCXN6X3hrYlBlckNsaWVudEZsYWdzUmVxCTI4CisKK3R5cGVkZWYgc3RydWN0IF94a2JQZXJDbGllbnRGbGFnc1JlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglzdXBwb3J0ZWQgQjMyOworICAgIENBUkQzMgl2YWx1ZSBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJscyBCMzI7CisgICAgQ0FSRDMyCWF1dG9DdHJsVmFsdWVzIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworfSB4a2JQZXJDbGllbnRGbGFnc1JlcGx5OworI2RlZmluZQlzel94a2JQZXJDbGllbnRGbGFnc1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JMaXN0Q29tcG9uZW50cyB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAl4a2JSZXFUeXBlOwkvKiBhbHdheXMgWF9LQkxpc3RDb21wb25lbnRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNgltYXhOYW1lcyBCMTY7Cit9IHhrYkxpc3RDb21wb25lbnRzUmVxOworI2RlZmluZQlzel94a2JMaXN0Q29tcG9uZW50c1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IF94a2JMaXN0Q29tcG9uZW50c1JlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgluS2V5bWFwcyBCMTY7CisgICAgQ0FSRDE2CW5LZXljb2RlcyBCMTY7CisgICAgQ0FSRDE2CW5UeXBlcyBCMTY7CisgICAgQ0FSRDE2CW5Db21wYXRNYXBzIEIxNjsKKyAgICBDQVJEMTYJblN5bWJvbHMgQjE2OworICAgIENBUkQxNgluR2VvbWV0cmllcyBCMTY7CisgICAgQ0FSRDE2CWV4dHJhIEIxNjsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geGtiTGlzdENvbXBvbmVudHNSZXBseTsKKyNkZWZpbmUJc3pfeGtiTGlzdENvbXBvbmVudHNSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0S2JkQnlOYW1lIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0S2JkQnlOYW1lICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWRldmljZVNwZWMgQjE2OworICAgIENBUkQxNgluZWVkIEIxNjsJLyogY29tYmluYXRpb24gb2YgWGtiR0JOXyogKi8KKyAgICBDQVJEMTYJd2FudCBCMTY7CS8qIGNvbWJpbmF0aW9uIG9mIFhrYkdCTl8qICovCisgICAgQk9PTAlsb2FkOworICAgIENBUkQ4CXBhZDsKK30geGtiR2V0S2JkQnlOYW1lUmVxOworI2RlZmluZQlzel94a2JHZXRLYmRCeU5hbWVSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkdldEtiZEJ5TmFtZVJlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQk9PTAlsb2FkZWQ7CisgICAgQk9PTAluZXdLZXlib2FyZDsKKyAgICBDQVJEMTYJZm91bmQgQjE2OwkvKiBjb21iaW5hdGlvbiBvZiBYa2JHQk5fKiAqLworICAgIENBUkQxNglyZXBvcnRlZCBCMTY7CS8qIGNvbWJpbmF0aW9uIG9mIFhrYkFsbENvbXBvbmVudHMgKi8KKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhrYkdldEtiZEJ5TmFtZVJlcGx5OworI2RlZmluZQlzel94a2JHZXRLYmRCeU5hbWVSZXBseQkzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiRGV2aWNlTGVkc1dpcmVEZXNjIHsKKyAgICBDQVJEMTYJbGVkQ2xhc3MgQjE2OworICAgIENBUkQxNglsZWRJRCBCMTY7CisgICAgQ0FSRDMyCW5hbWVzUHJlc2VudCBCMzI7CisgICAgQ0FSRDMyCW1hcHNQcmVzZW50IEIzMjsKKyAgICBDQVJEMzIJcGh5c0luZGljYXRvcnMgQjMyOworICAgIENBUkQzMglzdGF0ZSBCMzI7Cit9IHhrYkRldmljZUxlZHNXaXJlRGVzYzsKKyNkZWZpbmUgc3pfeGtiRGV2aWNlTGVkc1dpcmVEZXNjCTIwCisKK3R5cGVkZWYgc3RydWN0IF94a2JHZXREZXZpY2VJbmZvIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCR2V0RGV2aWNlSW5mbyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEMTYJd2FudGVkIEIxNjsKKyAgICBCT09MCWFsbEJ0bnM7CisgICAgQ0FSRDgJZmlyc3RCdG47CisgICAgQ0FSRDgJbkJ0bnM7CisgICAgQ0FSRDgJcGFkOworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKK30geGtiR2V0RGV2aWNlSW5mb1JlcTsKKyNkZWZpbmUJc3pfeGtiR2V0RGV2aWNlSW5mb1JlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfeGtiR2V0RGV2aWNlSW5mb1JlcGx5IHsKKyAgICBDQVJEOAl0eXBlOwkJLyogYWx3YXlzIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglwcmVzZW50IEIxNjsKKyAgICBDQVJEMTYJc3VwcG9ydGVkIEIxNjsKKyAgICBDQVJEMTYJdW5zdXBwb3J0ZWQgQjE2OworICAgIENBUkQxNgluRGV2aWNlTGVkRkJzIEIxNjsKKyAgICBDQVJEOAlmaXJzdEJ0bldhbnRlZDsKKyAgICBDQVJEOAluQnRuc1dhbnRlZDsKKyAgICBDQVJEOAlmaXJzdEJ0blJ0cm47CisgICAgQ0FSRDgJbkJ0bnNSdHJuOworICAgIENBUkQ4CXRvdGFsQnRuczsKKyAgICBCT09MCWhhc093blN0YXRlOworICAgIENBUkQxNglkZmx0S2JkRkIgQjE2OworICAgIENBUkQxNglkZmx0TGVkRkIgQjE2OworICAgIENBUkQxNglwYWQgQjE2OworICAgIEF0b20JZGV2VHlwZSBCMzI7Cit9IHhrYkdldERldmljZUluZm9SZXBseTsKKyNkZWZpbmUJc3pfeGtiR2V0RGV2aWNlSW5mb1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JTZXREZXZpY2VJbmZvIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0RGV2aWNlSW5mbyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNglkZXZpY2VTcGVjIEIxNjsKKyAgICBDQVJEOAlmaXJzdEJ0bjsKKyAgICBDQVJEOAluQnRuczsKKyAgICBDQVJEMTYJY2hhbmdlIEIxNjsKKyAgICBDQVJEMTYJbkRldmljZUxlZEZCcyBCMTY7Cit9IHhrYlNldERldmljZUluZm9SZXE7CisjZGVmaW5lCXN6X3hrYlNldERldmljZUluZm9SZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldERlYnVnZ2luZ0ZsYWdzIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXhrYlJlcVR5cGU7CS8qIGFsd2F5cyBYX0tCU2V0RGVidWdnaW5nRmxhZ3MgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJbXNnTGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKKyAgICBDQVJEMzIJYWZmZWN0RmxhZ3MgQjMyOworICAgIENBUkQzMglmbGFncyBCMzI7CisgICAgQ0FSRDMyCWFmZmVjdEN0cmxzIEIzMjsKKyAgICBDQVJEMzIJY3RybHMgQjMyOworfSB4a2JTZXREZWJ1Z2dpbmdGbGFnc1JlcTsKKyNkZWZpbmUJc3pfeGtiU2V0RGVidWdnaW5nRmxhZ3NSZXEJMjQKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYlNldERlYnVnZ2luZ0ZsYWdzUmVwbHkgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCWN1cnJlbnRGbGFncyBCMzI7CisgICAgQ0FSRDMyCWN1cnJlbnRDdHJscyBCMzI7CisgICAgQ0FSRDMyCXN1cHBvcnRlZEZsYWdzIEIzMjsKKyAgICBDQVJEMzIJc3VwcG9ydGVkQ3RybHMgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhrYlNldERlYnVnZ2luZ0ZsYWdzUmVwbHk7CisjZGVmaW5lCXN6X3hrYlNldERlYnVnZ2luZ0ZsYWdzUmVwbHkJMzIKKworCS8qCisJICogWCBLRVlCT0FSRCBFWFRFTlNJT04gRVZFTlQgU1RSVUNUVVJFUworCSAqLworCit0eXBlZGVmIHN0cnVjdCBfeGtiQW55RXZlbnQgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKyAgICBDQVJEMzIJcGFkNyBCMzI7Cit9IHhrYkFueUV2ZW50OworI2RlZmluZQlzel94a2JBbnlFdmVudCAzMgorCit0eXBlZGVmCXN0cnVjdCBfeGtiTmV3S2V5Ym9hcmROb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CW9sZERldmljZUlEOworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgS2V5Q29kZQlvbGRNaW5LZXlDb2RlOworICAgIEtleUNvZGUJb2xkTWF4S2V5Q29kZTsKKyAgICBDQVJEOAlyZXF1ZXN0TWFqb3I7CisgICAgQ0FSRDgJcmVxdWVzdE1pbm9yOworICAgIENBUkQxNgljaGFuZ2VkIEIxNjsKKyAgICBDQVJEOAlkZXRhaWw7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geGtiTmV3S2V5Ym9hcmROb3RpZnk7CisjZGVmaW5lCXN6X3hrYk5ld0tleWJvYXJkTm90aWZ5CTMyCisKK3R5cGVkZWYJc3RydWN0IF94a2JNYXBOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXB0ckJ0bkFjdGlvbnM7CisgICAgQ0FSRDE2CWNoYW5nZWQgQjE2OworICAgIEtleUNvZGUJbWluS2V5Q29kZTsKKyAgICBLZXlDb2RlCW1heEtleUNvZGU7CisgICAgQ0FSRDgJZmlyc3RUeXBlOworICAgIENBUkQ4CW5UeXBlczsKKyAgICBLZXlDb2RlCWZpcnN0S2V5U3ltOworICAgIENBUkQ4CW5LZXlTeW1zOworICAgIEtleUNvZGUJZmlyc3RLZXlBY3Q7CisgICAgQ0FSRDgJbktleUFjdHM7CisgICAgS2V5Q29kZQlmaXJzdEtleUJlaGF2aW9yOworICAgIENBUkQ4CW5LZXlCZWhhdmlvcnM7CisgICAgS2V5Q29kZQlmaXJzdEtleUV4cGxpY2l0OworICAgIENBUkQ4CW5LZXlFeHBsaWNpdDsKKyAgICBLZXlDb2RlCWZpcnN0TW9kTWFwS2V5OworICAgIENBUkQ4CW5Nb2RNYXBLZXlzOworICAgIEtleUNvZGUJZmlyc3RWTW9kTWFwS2V5OworICAgIENBUkQ4CW5WTW9kTWFwS2V5czsKKyAgICBDQVJEMTYJdmlydHVhbE1vZHMgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKK30geGtiTWFwTm90aWZ5OworI2RlZmluZQlzel94a2JNYXBOb3RpZnkJMzIKKwordHlwZWRlZglzdHJ1Y3QgX3hrYlN0YXRlTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAltb2RzOworICAgIENBUkQ4CWJhc2VNb2RzOworICAgIENBUkQ4CWxhdGNoZWRNb2RzOworICAgIENBUkQ4CWxvY2tlZE1vZHM7CisgICAgQ0FSRDgJZ3JvdXA7CisgICAgSU5UMTYJYmFzZUdyb3VwIEIxNjsKKyAgICBJTlQxNglsYXRjaGVkR3JvdXAgQjE2OworICAgIENBUkQ4CWxvY2tlZEdyb3VwOworICAgIENBUkQ4CWNvbXBhdFN0YXRlOworICAgIENBUkQ4CWdyYWJNb2RzOworICAgIENBUkQ4CWNvbXBhdEdyYWJNb2RzOworICAgIENBUkQ4CWxvb2t1cE1vZHM7CisgICAgQ0FSRDgJY29tcGF0TG9va3VwTW9kczsKKyAgICBDQVJEMTYJcHRyQnRuU3RhdGUgQjE2OworICAgIENBUkQxNgljaGFuZ2VkIEIxNjsKKyAgICBLZXlDb2RlCWtleWNvZGU7CisgICAgQ0FSRDgJZXZlbnRUeXBlOworICAgIENBUkQ4CXJlcXVlc3RNYWpvcjsKKyAgICBDQVJEOAlyZXF1ZXN0TWlub3I7Cit9IHhrYlN0YXRlTm90aWZ5OworI2RlZmluZQlzel94a2JTdGF0ZU5vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiQ29udHJvbHNOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CW51bUdyb3VwczsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCWNoYW5nZWRDb250cm9scyBCMzI7CisgICAgQ0FSRDMyCWVuYWJsZWRDb250cm9scyBCMzI7CisgICAgQ0FSRDMyCWVuYWJsZWRDb250cm9sQ2hhbmdlcyBCMzI7CisgICAgS2V5Q29kZQlrZXljb2RlOworICAgIENBUkQ4CWV2ZW50VHlwZTsKKyAgICBDQVJEOAlyZXF1ZXN0TWFqb3I7CisgICAgQ0FSRDgJcmVxdWVzdE1pbm9yOworICAgIENBUkQzMglwYWQyIEIzMjsKK30geGtiQ29udHJvbHNOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkNvbnRyb2xzTm90aWZ5CTMyCisKK3R5cGVkZWYgc3RydWN0IF94a2JJbmRpY2F0b3JOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CXBhZDIgQjE2OworICAgIENBUkQzMglzdGF0ZSBCMzI7CisgICAgQ0FSRDMyCWNoYW5nZWQgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4a2JJbmRpY2F0b3JOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkluZGljYXRvck5vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiTmFtZXNOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDE2CWNoYW5nZWQgQjE2OworICAgIENBUkQ4CWZpcnN0VHlwZTsKKyAgICBDQVJEOAluVHlwZXM7CisgICAgQ0FSRDgJZmlyc3RMZXZlbE5hbWU7CisgICAgQ0FSRDgJbkxldmVsTmFtZXM7CisgICAgQ0FSRDgJcGFkMjsKKyAgICBDQVJEOAluUmFkaW9Hcm91cHM7CisgICAgQ0FSRDgJbkFsaWFzZXM7CisgICAgQ0FSRDgJY2hhbmdlZEdyb3VwTmFtZXM7CisgICAgQ0FSRDE2CWNoYW5nZWRWaXJ0dWFsTW9kcyBCMTY7CisgICAgQ0FSRDgJZmlyc3RLZXk7CisgICAgQ0FSRDgJbktleXM7CisgICAgQ0FSRDMyCWNoYW5nZWRJbmRpY2F0b3JzIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYk5hbWVzTm90aWZ5OworI2RlZmluZQlzel94a2JOYW1lc05vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiQ29tcGF0TWFwTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAljaGFuZ2VkR3JvdXBzOworICAgIENBUkQxNglmaXJzdFNJIEIxNjsKKyAgICBDQVJEMTYJblNJIEIxNjsKKyAgICBDQVJEMTYJblRvdGFsU0kgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geGtiQ29tcGF0TWFwTm90aWZ5OworI2RlZmluZSBzel94a2JDb21wYXRNYXBOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkJlbGxOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIENBUkQ4CWJlbGxDbGFzczsKKyAgICBDQVJEOAliZWxsSUQ7CisgICAgQ0FSRDgJcGVyY2VudDsKKyAgICBDQVJEMTYJcGl0Y2ggQjE2OworICAgIENBUkQxNglkdXJhdGlvbiBCMTY7CisgICAgQXRvbQluYW1lIEIzMjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBCT09MCWV2ZW50T25seTsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7Cit9IHhrYkJlbGxOb3RpZnk7CisjZGVmaW5lCXN6X3hrYkJlbGxOb3RpZnkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFjdGlvbk1lc3NhZ2UgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIEtleUNvZGUJa2V5Y29kZTsKKyAgICBCT09MCXByZXNzOworICAgIEJPT0wJa2V5RXZlbnRGb2xsb3dzOworICAgIENBUkQ4CW1vZHM7CisgICAgQ0FSRDgJZ3JvdXA7CisgICAgQ0FSRDgJbWVzc2FnZVs4XTsKKyAgICBDQVJEMTYJcGFkMSBCMTY7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geGtiQWN0aW9uTWVzc2FnZTsKKyNkZWZpbmUJc3pfeGtiQWN0aW9uTWVzc2FnZQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX3hrYkFjY2Vzc1hOb3RpZnkgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCXhrYlR5cGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lCXRpbWUgQjMyOworICAgIENBUkQ4CWRldmljZUlEOworICAgIEtleUNvZGUJa2V5Y29kZTsKKyAgICBDQVJEMTYJZGV0YWlsIEIxNjsKKyAgICBDQVJEMTYJc2xvd0tleXNEZWxheSBCMTY7CisgICAgQ0FSRDE2CWRlYm91bmNlRGVsYXkgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geGtiQWNjZXNzWE5vdGlmeTsKKyNkZWZpbmUJc3pfeGtiQWNjZXNzWE5vdGlmeQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQl4a2JUeXBlOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgVGltZQl0aW1lIEIzMjsKKyAgICBDQVJEOAlkZXZpY2VJRDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglyZWFzb24gQjE2OworICAgIENBUkQxNglsZWRDbGFzcyBCMTY7CisgICAgQ0FSRDE2CWxlZElEIEIxNjsKKyAgICBDQVJEMzIJbGVkc0RlZmluZWQgQjMyOworICAgIENBUkQzMglsZWRTdGF0ZSBCMzI7CisgICAgQ0FSRDgJZmlyc3RCdG47CisgICAgQ0FSRDgJbkJ0bnM7CisgICAgQ0FSRDE2CXN1cHBvcnRlZCBCMTY7CisgICAgQ0FSRDE2CXVuc3VwcG9ydGVkIEIxNjsKKyAgICBDQVJEMTYJcGFkMyBCMTY7Cit9IHhrYkV4dGVuc2lvbkRldmljZU5vdGlmeTsKKyNkZWZpbmUJc3pfeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5CQkzMgorCit0eXBlZGVmIHN0cnVjdCBfeGtiRXZlbnQgeworICAgIHVuaW9uIHsKKwl4a2JBbnlFdmVudAkJYW55OworCXhrYk5ld0tleWJvYXJkTm90aWZ5CW5ld19rYmQ7CisJeGtiTWFwTm90aWZ5CQltYXA7CisJeGtiU3RhdGVOb3RpZnkJCXN0YXRlOworCXhrYkNvbnRyb2xzTm90aWZ5CWN0cmxzOworCXhrYkluZGljYXRvck5vdGlmeQlpbmRpY2F0b3JzOworCXhrYk5hbWVzTm90aWZ5CQluYW1lczsKKwl4a2JDb21wYXRNYXBOb3RpZnkJY29tcGF0OworCXhrYkJlbGxOb3RpZnkJCWJlbGw7CisJeGtiQWN0aW9uTWVzc2FnZQltZXNzYWdlOworCXhrYkFjY2Vzc1hOb3RpZnkJYWNjZXNzeDsKKwl4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgZGV2aWNlOworICAgIH0gdTsKK30geGtiRXZlbnQ7CisjZGVmaW5lIHN6X3hrYkV2ZW50CTMyCisKKyN1bmRlZiBXaW5kb3cKKyN1bmRlZiBBdG9tCisjdW5kZWYgVGltZQorI3VuZGVmIEtleUNvZGUKKyN1bmRlZiBLZXlTeW0KKworI2VuZGlmIC8qIF9YS0JQUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YS0JzcnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3J2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2MzBhZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3J2LmgKQEAgLTAsMCArMSwxMTg3IEBACisvKiAkWG9yZzogWEtCc3J2LmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKiAkWGRvdE9yZzogJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAxOTkzIGJ5IFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2lsaWNvbiBHcmFwaGljcyBub3QgYmUgCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiAKK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IAorb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKK3dpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKworU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyAKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgCitBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIElOIE5PIEVWRU5UIFNIQUxMIFNJTElDT04KK0dSQVBISUNTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIAorREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSAKK09SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAgV0lUSAorVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWEtCc3J2LmgsdiAzLjIyIDIwMDIvMTEvMjAgMDQ6NDk6MDEgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWEtCU1JWX0hfCisjZGVmaW5lCV9YS0JTUlZfSF8KKworI2lmZGVmIFhLQl9JTl9TRVJWRVIKKyNkZWZpbmUgWGtiQWxsb2NDbGllbnRNYXAJCVNydlhrYkFsbG9jQ2xpZW50TWFwCisjZGVmaW5lIFhrYkFsbG9jU2VydmVyTWFwCQlTcnZYa2JBbGxvY1NlcnZlck1hcAorI2RlZmluZSBYa2JDaGFuZ2VUeXBlc09mS2V5CQlTcnZYa2JDaGFuZ2VUeXBlc09mS2V5CisjZGVmaW5lCVhrYkFkZEtleVR5cGUJCQlTcnZYa2JBZGRLZXlUeXBlCisjZGVmaW5lIFhrYkNvcHlLZXlUeXBlCQkJU3J2WGtiQ29weUtleVR5cGUKKyNkZWZpbmUgWGtiQ29weUtleVR5cGVzCQkJU3J2WGtiQ29weUtleVR5cGVzCisjZGVmaW5lIFhrYkZyZWVDbGllbnRNYXAJCVNydlhrYkZyZWVDbGllbnRNYXAKKyNkZWZpbmUgWGtiRnJlZVNlcnZlck1hcAkJU3J2WGtiRnJlZVNlcnZlck1hcAorI2RlZmluZSBYa2JJbml0Q2Fub25pY2FsS2V5VHlwZXMJU3J2WGtiSW5pdENhbm9uaWNhbEtleVR5cGVzCisjZGVmaW5lCVhrYktleVR5cGVzRm9yQ29yZVN5bWJvbHMJU3J2WGtiS2V5VHlwZXNGb3JDb3JlU3ltYm9scworI2RlZmluZQlYa2JBcHBseUNvbXBhdE1hcFRvS2V5CQlTcnZYa2JBcHBseUNvbXBhdE1hcFRvS2V5CisjZGVmaW5lCVhrYlVwZGF0ZU1hcEZyb21Db3JlCQlTcnZYa2JVcGRhdGVNYXBGcm9tQ29yZQorI2RlZmluZSBYa2JSZXNpemVLZXlBY3Rpb25zCQlTcnZYa2JSZXNpemVLZXlBY3Rpb25zCisjZGVmaW5lIFhrYlJlc2l6ZUtleVN5bXMJCVNydlhrYlJlc2l6ZUtleVN5bXMKKyNkZWZpbmUgWGtiUmVzaXplS2V5VHlwZQkJU3J2WGtiUmVzaXplS2V5VHlwZQorI2RlZmluZSBYa2JBbGxvY0NvbXBhdE1hcAkJU3J2WGtiQWxsb2NDb21wYXRNYXAKKyNkZWZpbmUgWGtiQWxsb2NDb250cm9scwkJU3J2WGtiQWxsb2NDb250cm9scworI2RlZmluZSBYa2JBbGxvY0luZGljYXRvck1hcHMJCVNydlhrYkFsbG9jSW5kaWNhdG9yTWFwcworI2RlZmluZSBYa2JBbGxvY0tleWJvYXJkCQlTcnZYa2JBbGxvY0tleWJvYXJkCisjZGVmaW5lIFhrYkFsbG9jTmFtZXMJCQlTcnZYa2JBbGxvY05hbWVzCisjZGVmaW5lIFhrYkZyZWVDb21wYXRNYXAJCVNydlhrYkZyZWVDb21wYXRNYXAKKyNkZWZpbmUgWGtiRnJlZUNvbnRyb2xzCQkJU3J2WGtiRnJlZUNvbnRyb2xzCisjZGVmaW5lIFhrYkZyZWVJbmRpY2F0b3JNYXBzCQlTcnZYa2JGcmVlSW5kaWNhdG9yTWFwcworI2RlZmluZSBYa2JGcmVlS2V5Ym9hcmQJCQlTcnZYa2JGcmVlS2V5Ym9hcmQKKyNkZWZpbmUgWGtiRnJlZU5hbWVzCQkJU3J2WGtiRnJlZU5hbWVzCisjZGVmaW5lCVhrYkFkZERldmljZUxlZEluZm8JCVNydlhrYkFkZERldmljZUxlZEluZm8KKyNkZWZpbmUJWGtiQWxsb2NEZXZpY2VJbmZvCQlTcnZYa2JBbGxvY0RldmljZUluZm8KKyNkZWZpbmUJWGtiRnJlZURldmljZUluZm8JCVNydlhrYkZyZWVEZXZpY2VJbmZvCisjZGVmaW5lCVhrYlJlc2l6ZURldmljZUJ1dHRvbkFjdGlvbnMJU3J2WGtiUmVzaXplRGV2aWNlQnV0dG9uQWN0aW9ucworI2RlZmluZSBYa2JMYXRjaE1vZGlmaWVycwkJU3J2WGtiTGF0Y2hNb2RpZmllcnMKKyNkZWZpbmUgWGtiTGF0Y2hHcm91cAkJCVNydlhrYkxhdGNoR3JvdXAKKyNkZWZpbmUgWGtiVmlydHVhbE1vZHNUb1JlYWwJCVNydlhrYlZpcnR1YWxNb2RzVG9SZWFsCisjZGVmaW5lCVhrYkNoYW5nZUtleWNvZGVSYW5nZQkJU3J2WGtiQ2hhbmdlS2V5Y29kZVJhbmdlCisjZGVmaW5lCVhrYkFwcGx5VmlydHVhbE1vZENoYW5nZXMJU3J2WGtiQXBwbHlWaXJ0dWFsTW9kQ2hhbmdlcworI2RlZmluZQlYa2JVcGRhdGVBY3Rpb25WaXJ0dWFsTW9kcwlTcnZYa2JVcGRhdGVBY3Rpb25WaXJ0dWFsTW9kcworI2RlZmluZSBYa2JVcGRhdGVLZXlUeXBlVmlydHVhbE1vZHMJU3J2WGtiVXBkYXRlS2V5VHlwZVZpcnR1YWxNb2RzCisjZW5kaWYKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQnN0ci5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQnByb3RvLmg+CisjaW5jbHVkZSAiaW5wdXRzdHIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkludGVyZXN0IHsKKwlEZXZpY2VJbnRQdHIJCWRldjsKKwlDbGllbnRQdHIJCWNsaWVudDsKKwlYSUQJCQlyZXNvdXJjZTsKKwlzdHJ1Y3QgX1hrYkludGVyZXN0ICoJbmV4dDsKKwlDQVJEMTYJCQlleHREZXZOb3RpZnlNYXNrOworCUNBUkQxNgkJCXN0YXRlTm90aWZ5TWFzazsKKwlDQVJEMTYJCQluYW1lc05vdGlmeU1hc2s7CisJQ0FSRDMyIAkJCWN0cmxzTm90aWZ5TWFzazsKKwlDQVJEOAkJCWNvbXBhdE5vdGlmeU1hc2s7CisJQk9PTAkJCWJlbGxOb3RpZnlNYXNrOworCUJPT0wJCQlhY3Rpb25NZXNzYWdlTWFzazsKKwlDQVJEMTYJCQlhY2Nlc3NYTm90aWZ5TWFzazsKKwlDQVJEMzIJCQlpU3RhdGVOb3RpZnlNYXNrOworCUNBUkQzMgkJCWlNYXBOb3RpZnlNYXNrOworCUNBUkQxNgkJCWFsdFN5bXNOb3RpZnlNYXNrOworCUNBUkQzMgkJCWF1dG9DdHJsczsKKwlDQVJEMzIJCQlhdXRvQ3RybFZhbHVlczsKK30gWGtiSW50ZXJlc3RSZWMsKlhrYkludGVyZXN0UHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiUmFkaW9Hcm91cCB7CisJQ0FSRDgJCWZsYWdzOworCUNBUkQ4CQluTWVtYmVyczsKKwlDQVJEOAkJZGZsdERvd247CisJQ0FSRDgJCWN1cnJlbnREb3duOworCUNBUkQ4CQltZW1iZXJzW1hrYlJHTWF4TWVtYmVyc107Cit9IFhrYlJhZGlvR3JvdXBSZWMsICpYa2JSYWRpb0dyb3VwUHRyOworCit0eXBlZGVmIHN0cnVjdAlfWGtiRXZlbnRDYXVzZSB7CisJQ0FSRDgJCWtjOworCUNBUkQ4CQlldmVudDsKKwlDQVJEOAkJbWpyOworCUNBUkQ4CQltbnI7CisJQ2xpZW50UHRyCWNsaWVudDsKK30gWGtiRXZlbnRDYXVzZVJlYywqWGtiRXZlbnRDYXVzZVB0cjsKKyNkZWZpbmUJWGtiU2V0Q2F1c2VLZXkoYyxrLGUpCXsgKGMpLT5rYz0gKGspLChjKS0+ZXZlbnQ9IChlKSxcCisJCQkJICAoYyktPm1qcj0gKGMpLT5tbnI9IDA7IFwKKwkJCQkgIChjKS0+Y2xpZW50PSBOVUxMOyB9CisjZGVmaW5lCVhrYlNldENhdXNlUmVxKGMsaixuLGNsKSB7IChjKS0+a2M9IChjKS0+ZXZlbnQ9IDAsXAorCQkJCSAgKGMpLT5tanI9IChqKSwoYyktPm1ucj0gKG4pO1wKKwkJCQkgIChjKS0+Y2xpZW50PSAoY2wpOyB9CisjZGVmaW5lCVhrYlNldENhdXNlQ29yZVJlcShjLGUsY2wpIFhrYlNldENhdXNlUmVxKGMsZSwwLGNsKQorI2RlZmluZQlYa2JTZXRDYXVzZVhrYlJlcShjLGUsY2wpICBYa2JTZXRDYXVzZVJlcShjLFhrYlJlcUNvZGUsZSxjbCkKKyNkZWZpbmUJWGtiU2V0Q2F1c2VVbmtub3duKGMpCSAgIFhrYlNldENhdXNlS2V5KGMsMCwwKQorCisjZGVmaW5lCV9PRkZfVElNRVIJCTAKKyNkZWZpbmUJX0tSR19XQVJOX1RJTUVSCQkxCisjZGVmaW5lCV9LUkdfVElNRVIJCTIKKyNkZWZpbmUJX1NLX1RJTUVPVVRfVElNRVIJMworI2RlZmluZQlfQUxMX1RJTUVPVVRfVElNRVIJNAorCisjZGVmaW5lCV9CRUVQX05PTkUJCTAKKyNkZWZpbmUJX0JFRVBfRkVBVFVSRV9PTgkxCisjZGVmaW5lCV9CRUVQX0ZFQVRVUkVfT0ZGCTIKKyNkZWZpbmUJX0JFRVBfRkVBVFVSRV9DSEFOR0UJMworI2RlZmluZQlfQkVFUF9TTE9XX1dBUk4JCTQKKyNkZWZpbmUJX0JFRVBfU0xPV19QUkVTUwk1CisjZGVmaW5lCV9CRUVQX1NMT1dfQUNDRVBUCTYKKyNkZWZpbmUJX0JFRVBfU0xPV19SRUpFQ1QJNworI2RlZmluZQlfQkVFUF9TTE9XX1JFTEVBU0UJOAorI2RlZmluZQlfQkVFUF9TVElDS1lfTEFUQ0gJOQorI2RlZmluZQlfQkVFUF9TVElDS1lfTE9DSwkxMAorI2RlZmluZQlfQkVFUF9TVElDS1lfVU5MT0NLCTExCisjZGVmaW5lCV9CRUVQX0xFRF9PTgkJMTIKKyNkZWZpbmUJX0JFRVBfTEVEX09GRgkJMTMKKyNkZWZpbmUJX0JFRVBfTEVEX0NIQU5HRQkxNAorI2RlZmluZQlfQkVFUF9CT1VOQ0VfUkVKRUNUCTE1CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTcnZJbmZvIHsKKwlYa2JTdGF0ZVJlYwkgcHJldl9zdGF0ZTsKKwlYa2JTdGF0ZVJlYwkgc3RhdGU7CisJWGtiRGVzY1B0cgkgZGVzYzsKKworCURldmljZUludFB0cgkgZGV2aWNlOworCUtiZEN0cmxQcm9jUHRyCSBrYmRQcm9jOworCisJWGtiUmFkaW9Hcm91cFB0ciByYWRpb0dyb3VwczsKKwlDQVJEOAkJIG5SYWRpb0dyb3VwczsKKwlDQVJEOAkJIGNsZWFyTW9kczsKKwlDQVJEOAkJIHNldE1vZHM7CisJSU5UMTYJCSBncm91cENoYW5nZTsKKworCUNBUkQxNgkJIGRmbHRQdHJEZWx0YTsKKworCWRvdWJsZQkJIG1vdXNlS2V5c0N1cnZlOworCWRvdWJsZQkJIG1vdXNlS2V5c0N1cnZlRmFjdG9yOworCUlOVDE2CQkgbW91c2VLZXlzRFg7CisJSU5UMTYJCSBtb3VzZUtleXNEWTsKKwlDQVJEOAkJIG1vdXNlS2V5c0ZsYWdzOworCUJvb2wJCSBtb3VzZUtleXNBY2NlbDsKKwlDQVJEOAkJIG1vdXNlS2V5c0NvdW50ZXI7CisKKwlDQVJEOAkJIGxvY2tlZFB0ckJ1dHRvbnM7CisJQ0FSRDgJCSBzaGlmdEtleUNvdW50OworCUtleUNvZGUJCSBtb3VzZUtleTsKKwlLZXlDb2RlCQkgaW5hY3RpdmVLZXk7CisJS2V5Q29kZQkJIHNsb3dLZXk7CisJS2V5Q29kZQkJIHJlcGVhdEtleTsKKwlDQVJEOAkJIGtyZ1RpbWVyQWN0aXZlOworCUNBUkQ4CQkgYmVlcFR5cGU7CisJQ0FSRDgJCSBiZWVwQ291bnQ7CisKKwlDQVJEMzIJCSBmbGFnczsKKwlDQVJEMzIJCSBsYXN0UHRyRXZlbnRUaW1lOworCUNBUkQzMgkJIGxhc3RTaGlmdEV2ZW50VGltZTsKKwlPc1RpbWVyUHRyCSBiZWVwVGltZXI7CisJT3NUaW1lclB0cgkgbW91c2VLZXlUaW1lcjsKKwlPc1RpbWVyUHRyCSBzbG93S2V5c1RpbWVyOworCU9zVGltZXJQdHIJIGJvdW5jZUtleXNUaW1lcjsKKwlPc1RpbWVyUHRyCSByZXBlYXRLZXlUaW1lcjsKKwlPc1RpbWVyUHRyCSBrcmdUaW1lcjsKK30gWGtiU3J2SW5mb1JlYywgKlhrYlNydkluZm9QdHI7CisKKyNkZWZpbmUJWGtiU0xJX0lzRGVmYXVsdAkoMUw8PDApCisjZGVmaW5lCVhrYlNMSV9IYXNPd25TdGF0ZQkoMUw8PDEpCisKK3R5cGVkZWYgc3RydWN0CV9Ya2JTcnZMZWRJbmZvIHsKKwlDQVJEMTYJCQlmbGFnczsKKwlDQVJEMTYJCQljbGFzczsKKwlDQVJEMTYJCQlpZDsKKwl1bmlvbiB7CisJICAgIEtiZEZlZWRiYWNrUHRyCWtmOworCSAgICBMZWRGZWVkYmFja1B0cglsZjsKKwl9IAkJCWZiOworCisJQ0FSRDMyCQkJcGh5c0luZGljYXRvcnM7CisJQ0FSRDMyCQkJYXV0b1N0YXRlOworCUNBUkQzMgkJCWV4cGxpY2l0U3RhdGU7CisJQ0FSRDMyCQkJZWZmZWN0aXZlU3RhdGU7CisKKwlDQVJEMzIJCQltYXBzUHJlc2VudDsKKwlDQVJEMzIJCQluYW1lc1ByZXNlbnQ7CisJWGtiSW5kaWNhdG9yTWFwUHRyCW1hcHM7CisJQXRvbSAqCQkJbmFtZXM7CisKKwlDQVJEMzIJCQl1c2VzQmFzZTsKKwlDQVJEMzIJCQl1c2VzTGF0Y2hlZDsKKwlDQVJEMzIJCQl1c2VzTG9ja2VkOworCUNBUkQzMgkJCXVzZXNFZmZlY3RpdmU7CisJQ0FSRDMyCQkJdXNlc0NvbXBhdDsKKwlDQVJEMzIJCQl1c2VzQ29udHJvbHM7CisKKwlDQVJEMzIJCQl1c2VkQ29tcG9uZW50czsKK30gWGtiU3J2TGVkSW5mb1JlYywgKlhrYlNydkxlZEluZm9QdHI7CisKKy8qCisgKiBTZXR0aW5ncyBmb3IgeGtiQ2xpZW50RmxhZ3MgZmllbGQgKHVzZWQgYnkgRElYKQorICogVGhlc2UgZmxhZ3MgX211c3RfIG5vdCBvdmVybGFwIHdpdGggWGtiUENGXyoKKyAqLworI2RlZmluZQlfWGtiQ2xpZW50SW5pdGlhbGl6ZWQJCSgxPDwxNSkKKworI2RlZmluZQlfWGtiV2FudHNEZXRlY3RhYmxlQXV0b1JlcGVhdChjKVwKKwkoKGMpLT54a2JDbGllbnRGbGFncyZYa2JQQ0ZfRGV0ZWN0YWJsZUF1dG9SZXBlYXRNYXNrKQorCisvKgorICogU2V0dGluZ3MgZm9yIGZsYWdzIGZpZWxkCisgKi8KKyNkZWZpbmUJX1hrYlN0YXRlTm90aWZ5SW5Qcm9ncmVzcwkoMTw8MCkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQcm9jZXNzSW5wdXRQcm9jIHByb2Nlc3NJbnB1dFByb2M7CisgICAgUHJvY2Vzc0lucHV0UHJvYyByZWFsSW5wdXRQcm9jOworICAgIERldmljZVVud3JhcFByb2MgdW53cmFwUHJvYzsKK30geGtiRGV2aWNlSW5mb1JlYywgKnhrYkRldmljZUluZm9QdHI7CisKKyNkZWZpbmUgV1JBUF9QUk9DRVNTX0lOUFVUX1BST0MoZGV2aWNlLCBvbGRwcm9jcywgcHJvYywgdW53cmFwcHJvYykgXAorCWRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPSBwcm9jOyBcCisJb2xkcHJvY3MtPnByb2Nlc3NJbnB1dFByb2MgPSBcCisJb2xkcHJvY3MtPnJlYWxJbnB1dFByb2MgPSBkZXZpY2UtPnB1YmxpYy5yZWFsSW5wdXRQcm9jOyBcCisJZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYyA9IHByb2M7IFwKKwlvbGRwcm9jcy0+dW53cmFwUHJvYyA9IGRldmljZS0+dW53cmFwUHJvYzsgXAorCWRldmljZS0+dW53cmFwUHJvYyA9IHVud3JhcHByb2M7CisKKyNkZWZpbmUgQ09ORF9XUkFQX1BST0NFU1NfSU5QVVRfUFJPQyhkZXZpY2UsIG9sZHByb2NzLCBwcm9jLCB1bndyYXBwcm9jKSBcCisJaWYgKGRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPT0gZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYylcCisJICAgIGRldmljZS0+cHVibGljLnByb2Nlc3NJbnB1dFByb2MgPSBwcm9jOyBcCisJb2xkcHJvY3MtPnByb2Nlc3NJbnB1dFByb2MgPSBcCisJb2xkcHJvY3MtPnJlYWxJbnB1dFByb2MgPSBkZXZpY2UtPnB1YmxpYy5yZWFsSW5wdXRQcm9jOyBcCisJZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYyA9IHByb2M7IFwKKwlvbGRwcm9jcy0+dW53cmFwUHJvYyA9IGRldmljZS0+dW53cmFwUHJvYzsgXAorCWRldmljZS0+dW53cmFwUHJvYyA9IHVud3JhcHByb2M7CisKKyNkZWZpbmUgVU5XUkFQX1BST0NFU1NfSU5QVVRfUFJPQyhkZXZpY2UsIG9sZHByb2NzKSBcCisJZGV2aWNlLT5wdWJsaWMucHJvY2Vzc0lucHV0UHJvYyA9IG9sZHByb2NzLT5wcm9jZXNzSW5wdXRQcm9jOyBcCisJZGV2aWNlLT5wdWJsaWMucmVhbElucHV0UHJvYyA9IG9sZHByb2NzLT5yZWFsSW5wdXRQcm9jOyBcCisJZGV2aWNlLT51bndyYXBQcm9jID0gb2xkcHJvY3MtPnVud3JhcFByb2M7CisKKyNkZWZpbmUgWEtCREVWSUNFSU5GTyhkZXYpICgoeGtiRGV2aWNlSW5mb1B0cikgKGRldiktPmRldlByaXZhdGVzW3hrYkRldmljZVByaXZhdGVJbmRleF0ucHRyKQorCisvKioqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKiovCisKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCisjZGVmaW5lIFhrYkFYX0tSR01hc2sJIChYa2JTbG93S2V5c01hc2t8WGtiQm91bmNlS2V5c01hc2spCisjZGVmaW5lCVhrYkFsbEZpbHRlcmVkRXZlbnRzTWFzayBcCisJKFhrYkFjY2Vzc1hLZXlzTWFza3xYa2JSZXBlYXRLZXlzTWFza3xYa2JNb3VzZUtleXNBY2NlbE1hc2t8WGtiQVhfS1JHTWFzaykKKworLyoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KioqLworCitleHRlcm4gaW50CVhrYlJlcUNvZGU7CitleHRlcm4gaW50CVhrYkV2ZW50QmFzZTsKK2V4dGVybiBpbnQJWGtiS2V5Ym9hcmRFcnJvckNvZGU7CitleHRlcm4gaW50CVhrYkRpc2FibGVMb2NrQWN0aW9uczsKK2V4dGVybiBjaGFyICoJWGtiQmFzZURpcmVjdG9yeTsKK2V4dGVybiBjaGFyICoJWGtiQmluRGlyZWN0b3J5OworZXh0ZXJuIGNoYXIgKglYa2JJbml0aWFsTWFwOworZXh0ZXJuIGludAlfWGtiQ2xpZW50TWFqb3I7CitleHRlcm4gaW50CV9Ya2JDbGllbnRNaW5vcjsKK2V4dGVybiB1bnNpZ25lZAlpbnQgWGtiWElVbnN1cHBvcnRlZDsKKworZXh0ZXJuIGNoYXIgKglYa2JNb2RlbFVzZWQsKlhrYkxheW91dFVzZWQsKlhrYlZhcmlhbnRVc2VkLCpYa2JPcHRpb25zVXNlZDsKK2V4dGVybiBCb29sCW5vWGtiRXh0ZW5zaW9uOworZXh0ZXJuIEJvb2wJWGtiV2FudFJ1bGVzUHJvcDsKKworZXh0ZXJuIHBvaW50ZXIJWGtiTGFzdFJlcGVhdEV2ZW50OworCitleHRlcm4gQ0FSRDMyCXhrYkRlYnVnRmxhZ3M7CitleHRlcm4gQ0FSRDMyCXhrYkRlYnVnQ3RybHM7CisKKyNkZWZpbmUJX1hrYkFsbG9jKHMpCQl4YWxsb2MoKHMpKQorI2RlZmluZQlfWGtiQ2FsbG9jKG4scykJCVhjYWxsb2MoKG4pKihzKSkKKyNkZWZpbmUJX1hrYlJlYWxsb2MobyxzKQlYcmVhbGxvYygobyksKHMpKQorI2RlZmluZQlfWGtiVHlwZWRBbGxvYyh0KQkoKHQgKil4YWxsb2Moc2l6ZW9mKHQpKSkKKyNkZWZpbmUJX1hrYlR5cGVkQ2FsbG9jKG4sdCkJKCh0ICopWGNhbGxvYygobikqc2l6ZW9mKHQpKSkKKyNkZWZpbmUJX1hrYlR5cGVkUmVhbGxvYyhvLG4sdCkgXAorCSgobyk/KHQgKilYcmVhbGxvYygobyksKG4pKnNpemVvZih0KSk6X1hrYlR5cGVkQ2FsbG9jKG4sdCkpCisjZGVmaW5lCV9Ya2JDbGVhckVsZW1zKGEsZixsLHQpCWJ6ZXJvKCYoYSlbZl0sKChsKS0oZikrMSkqc2l6ZW9mKHQpKQorI2RlZmluZQlfWGtiRnJlZShwKQkJWGZyZWUocCkKKworI2RlZmluZQlfWGtiTGliRXJyb3IoYyxsLGQpIFwKKwl7IF9Ya2JFcnJDb2RlPSAoYyk7IF9Ya2JFcnJMb2NhdGlvbj0gKGwpOyBfWGtiRXJyRGF0YT0gKGQpOyB9CisjZGVmaW5lCV9Ya2JFcnJDb2RlMihhLGIpICgoWElEKSgoKCh1bnNpZ25lZCBpbnQpKGEpKTw8MjQpfCgoYikmMHhmZmZmZmYpKSkKKyNkZWZpbmUJX1hrYkVyckNvZGUzKGEsYixjKQlfWGtiRXJyQ29kZTIoYSwoKCh1bnNpZ25lZCBpbnQpKGIpKTw8MTYpfChjKSkKKyNkZWZpbmUJX1hrYkVyckNvZGU0KGEsYixjLGQpIF9Ya2JFcnJDb2RlMyhhLGIsKCgoKHVuc2lnbmVkIGludCkoYykpPDw4KXwoZCkpKQorCitleHRlcm4JaW50CURldmljZUtleVByZXNzLERldmljZUtleVJlbGVhc2U7CitleHRlcm4JaW50CURldmljZUJ1dHRvblByZXNzLERldmljZUJ1dHRvblJlbGVhc2U7CisKKyNpZmRlZiBYSU5QVVQKKyNkZWZpbmUJX1hrYklzUHJlc3NFdmVudCh0KQkoKCh0KT09S2V5UHJlc3MpfHwoKHQpPT1EZXZpY2VLZXlQcmVzcykpCisjZGVmaW5lCV9Ya2JJc1JlbGVhc2VFdmVudCh0KQkoKCh0KT09S2V5UmVsZWFzZSl8fCgodCk9PURldmljZUtleVJlbGVhc2UpKQorI2Vsc2UKKyNkZWZpbmUJX1hrYklzUHJlc3NFdmVudCh0KQkoKHQpPT1LZXlQcmVzcykKKyNkZWZpbmUJX1hrYklzUmVsZWFzZUV2ZW50KHQpCSgodCk9PUtleVJlbGVhc2UpCisjZW5kaWYKKworI2RlZmluZQlfWGtiQ29yZUtleWNvZGVJblJhbmdlKGMsaykJKCgoayk+PShjKS0+Y3VyS2V5U3ltcy5taW5LZXlDb2RlKSYmXAorCQkJCQkgKChrKTw9KGMpLT5jdXJLZXlTeW1zLm1heEtleUNvZGUpKQorI2RlZmluZQlfWGtiQ29yZU51bUtleXMoYykJKChjKS0+Y3VyS2V5U3ltcy5tYXhLZXlDb2RlLVwKKwkJCQkgKGMpLT5jdXJLZXlTeW1zLm1pbktleUNvZGUrMSkKKworI2RlZmluZQlYQ29udmVydENhc2UocyxsLHUpCVhrYkNvbnZlcnRDYXNlKHMsbCx1KQorI3VuZGVmCUlzS2V5cGFkS2V5CisjZGVmaW5lCUlzS2V5cGFkS2V5KHMpCQlYa2JLU0lzS2V5cGFkKHMpCisKKyNkZWZpbmUJU3RhdHVzCQlpbnQKKyNkZWZpbmUJWFBvaW50ZXIJcG9pbnRlcgorI2RlZmluZQlEaXNwbGF5CQlzdHJ1Y3QgX1hEaXNwbGF5CisKKyNpZm5kZWYgVHJ1ZQorI2RlZmluZQlUcnVlCTEKKyNkZWZpbmUJRmFsc2UJMAorI2VuZGlmCisKKyNpZm5kZWYgUEFUSF9NQVgKKyNpZmRlZiBNQVhQQVRITEVOCisjZGVmaW5lCVBBVEhfTUFYIE1BWFBBVEhMRU4KKyNlbHNlCisjZGVmaW5lCVBBVEhfTUFYIDEwMjQKKyNlbmRpZgorI2VuZGlmCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIHZvaWQgWGtiVXNlTXNnKAorICAgIHZvaWQKKyk7CisKK2V4dGVybiBpbnQgWGtiUHJvY2Vzc0FyZ3VtZW50cygKKyAgICBpbnQJCQkJLyogYXJnYyAqLywKKyAgICBjaGFyICoqCQkJLyogYXJndiAqLywKKyAgICBpbnQJCQkJLyogaSAqLworKTsKKworZXh0ZXJuCXZvaWQJWGtiU2V0RXh0ZW5zaW9uKERldmljZUludFB0ciBkZXZpY2UsIFByb2Nlc3NJbnB1dFByb2MgcHJvYyk7CisKK2V4dGVybgl2b2lkCVhrYkZyZWVDb21wYXRNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorICAgIEJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4Jdm9pZCBYa2JGcmVlTmFtZXMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVNYXAgKi8KKyk7CisKK2V4dGVybiBEZXZpY2VJbnRQdHIgX1hrYkxvb2t1cEFueURldmljZSgKKyAgICBpbnQJCQkvKiBpZCAqLywKKyAgICBpbnQgKgkJLyogd2h5X3J0cm4gKi8KKyk7CisKK2V4dGVybiBEZXZpY2VJbnRQdHIgX1hrYkxvb2t1cEtleWJvYXJkKAorICAgIGludAkJCS8qIGlkICovLAorICAgIGludCAqCQkvKiB3aHlfcnRybiAqLworKTsKKworZXh0ZXJuIERldmljZUludFB0ciBfWGtiTG9va3VwQmVsbERldmljZSgKKyAgICBpbnQJCQkvKiBpZCAqLywKKyAgICBpbnQgKgkJLyogd2h5X3J0cm4gKi8KKyk7CisKK2V4dGVybiBEZXZpY2VJbnRQdHIgX1hrYkxvb2t1cExlZERldmljZSgKKyAgICBpbnQJCQkvKiBpZCAqLywKKyAgICBpbnQgKgkJLyogd2h5X3J0cm4gKi8KKyk7CisKK2V4dGVybiBEZXZpY2VJbnRQdHIgX1hrYkxvb2t1cEJ1dHRvbkRldmljZSgKKyAgICBpbnQJCQkvKiBpZCAqLywKKyAgICBpbnQgKgkJLyogd2h5X3J0cm4gKi8KKyk7CisKK2V4dGVybglYa2JEZXNjUHRyIFhrYkFsbG9jS2V5Ym9hcmQoCisJdm9pZAorKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY0NsaWVudE1hcCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5UeXBlcyAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY1NlcnZlck1hcCgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5OZXdBY3Rpb25zICovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlQ2xpZW50TWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGF0ICovLAorICAgIEJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlU2VydmVyTWFwKAorICAgIFhrYkRlc2NQdHIJCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aGF0ICovLAorICAgIEJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4JU3RhdHVzIFhrYkFsbG9jSW5kaWNhdG9yTWFwcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiQWxsb2NDb21wYXRNYXAoCisgICAgWGtiRGVzY1B0cgkJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorICAgIHVuc2lnbmVkIGludAkJLyogbkludGVycHJldCAqLworKTsKKworZXh0ZXJuCVN0YXR1cyBYa2JBbGxvY05hbWVzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCWludAkJCS8qIG5Ub3RhbFJHICovLAorCWludAkJCS8qIG5Ub3RhbEFsaWFzZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiQWxsb2NDb250cm9scygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCovCispOworCitleHRlcm4JU3RhdHVzCVhrYkNvcHlLZXlUeXBlKAorICAgIFhrYktleVR5cGVQdHIJCS8qIGZyb20gKi8sCisgICAgWGtiS2V5VHlwZVB0cgkJLyogaW50byAqLworKTsKKworZXh0ZXJuCVN0YXR1cwlYa2JDb3B5S2V5VHlwZXMoCisgICAgWGtiS2V5VHlwZVB0cgkJLyogZnJvbSAqLywKKyAgICBYa2JLZXlUeXBlUHRyCQkvKiBpbnRvICovLAorICAgIGludAkJCQkvKiBudW1fdHlwZXMgKi8KKyk7CisKK2V4dGVybglTdGF0dXMJWGtiUmVzaXplS2V5VHlwZSgKKyAgICBYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisgICAgaW50CQkJLyogdHlwZV9uZHggKi8sCisgICAgaW50CQkJLyogbWFwX2NvdW50ICovLAorICAgIEJvb2wJCS8qIHdhbnRfcHJlc2VydmUgKi8sCisgICAgaW50CQkJLyogbmV3X251bV9sdmxzICovCispOworCitleHRlcm4Jdm9pZAlYa2JGcmVlS2V5Ym9hcmQoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisJQm9vbAkJCS8qIGZyZWVEZXNjICovCispOworCitleHRlcm4gIHZvaWQgWGtiU2V0QWN0aW9uS2V5TW9kcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiQWN0aW9uICoJCS8qIGFjdCAqLywKKwl1bnNpZ25lZCBpbnQgCQkvKiBtb2RzICovCispOworCitleHRlcm4gQm9vbCBYa2JDaGVja0FjdGlvblZNb2RzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwlYa2JBY3Rpb24gKgkJLyogYWN0ICovLAorCXVuc2lnbmVkIGludCAJCS8qIGNoYW5nZWQgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYkFwcGx5Vk1vZENoYW5nZXMoCisgICAgWGtiU3J2SW5mb1B0cgkvKiB4a2JpICovLAorICAgIHVuc2lnbmVkIGludAkvKiBjaGFuZ2VkICovLAorICAgIFhrYkNoYW5nZXNQdHIJLyogcENoYW5nZXMgKi8sCisgICAgdW5zaWduZWQgaW50ICoJLyogbmVlZENoZWNrc1J0cm4gKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQXBwbHlWTW9kQ2hhbmdlc1RvQWxsRGV2aWNlcygKKyAgICBEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorICAgIFhrYkRlc2NQdHIgCQkvKiB4a2IgKi8sCisgICAgdW5zaWduZWQgaW50IAkvKiBjaGFuZ2VkICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQgWGtiTWFza0ZvclZNYXNrKAorICAgIFhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogdm1hc2sgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYlZpcnR1YWxNb2RzVG9SZWFsKAorCVhrYkRlc2NQdHIJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkvKiB2aXJ0dWFfbWFzayAqLywKKwl1bnNpZ25lZCBpbnQgKgkvKiBtYXNrX3J0cm4gKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQJWGtiQWRqdXN0R3JvdXAoCisgICAgaW50CQkJLyogZ3JvdXAgKi8sCisgICAgWGtiQ29udHJvbHNQdHIJLyogY3RybHMgKi8KKyk7CisKK2V4dGVybiBLZXlTeW0gKlhrYlJlc2l6ZUtleVN5bXMoCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgIGludCAJCS8qIGtleSAqLywKKyAgICBpbnQgCQkvKiBuZWVkZWQgKi8KKyk7CisKK2V4dGVybiBYa2JBY3Rpb24gKlhrYlJlc2l6ZUtleUFjdGlvbnMoCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgIGludCAJCS8qIGtleSAqLywKKyAgICBpbnQgCQkvKiBuZWVkZWQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUtleVR5cGVzRnJvbUNvcmUoCisgICAgRGV2aWNlSW50UHRyCS8qIHBYRGV2ICovLAorICAgIEtleUNvZGUgCQkvKiBmaXJzdCAqLywKKyAgICBDQVJEOCAJCS8qIG51bSAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCS8qIHBDaGFuZ2VzICovCispOworCitleHRlcm4Jdm9pZCBYa2JVcGRhdGVEZXNjQWN0aW9ucygJCisgICAgWGtiRGVzY1B0cgkJLyogeGtiICovLAorICAgIEtleUNvZGUJCS8qIGZpcnN0ICovLAorICAgIENBUkQ4CQkvKiBudW0gKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVBY3Rpb25zKAorICAgIERldmljZUludFB0cgkvKiBwWERldiAqLywKKyAgICBLZXlDb2RlIAkJLyogZmlyc3QgKi8sCisgICAgQ0FSRDggCQkvKiBudW0gKi8sCisgICAgWGtiQ2hhbmdlc1B0ciAgCS8qIHBDaGFuZ2VzICovLAorICAgIHVuc2lnbmVkIGludCAqCS8qIG5lZWRDaGVja3NSdHJuICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUNvcmVEZXNjcmlwdGlvbigKKyAgICBEZXZpY2VJbnRQdHIJLyoga2V5YmQgKi8sCisgICAgQm9vbAkJLyogcmVzaXplICovCispOworCitleHRlcm4gdm9pZCBYa2JBcHBseU1hcHBpbmdDaGFuZ2UoCisgICAgRGV2aWNlSW50UHRyCS8qIHBYRGV2ICovLAorICAgIENBUkQ4IAkJLyogcmVxdWVzdCAqLywKKyAgICBLZXlDb2RlIAkJLyogZmlyc3RLZXkgKi8sCisgICAgQ0FSRDggCQkvKiBudW0gKi8sCisgICAgQ2xpZW50UHRyCQkvKiBjbGllbnQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlNldEluZGljYXRvcnMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBwWERldiAqLywKKyAgICBDQVJEMzIJCQkvKiBhZmZlY3QgKi8sCisgICAgQ0FSRDMyCQkJLyogdmFsdWVzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVJbmRpY2F0b3JzKAorICAgIERldmljZUludFB0cgkJLyoga2V5YmQgKi8sCisgICAgQ0FSRDMyCQkgCS8qIGNoYW5nZWQgKi8sCisgICAgQm9vbAkJCS8qIGNoZWNrX2VkZXZzICovLAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIHBDaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gWGtiU3J2TGVkSW5mb1B0ciBYa2JBbGxvY1NydkxlZEluZm8oCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgS2JkRmVlZGJhY2tQdHIJCS8qIGtmICovLAorICAgIExlZEZlZWRiYWNrUHRyCQkvKiBsZiAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIG5lZWRlZF9wYXJ0cyAqLworKTsKKworZXh0ZXJuIFhrYlNydkxlZEluZm9QdHIgWGtiRmluZFNydkxlZEluZm8oCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBjbGFzcyAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGlkICovLAorICAgIHVuc2lnbmVkIGludAkJLyogbmVlZGVkX3BhcnRzICovCispOworCitleHRlcm4gdm9pZCBYa2JBcHBseUxlZE5hbWVDaGFuZ2VzKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIFhrYlNydkxlZEluZm9QdHIJCS8qIHNsaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWRfbmFtZXMgKi8sCisgICAgeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5ICoJLyogZWQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQXBwbHlMZWRNYXBDaGFuZ2VzKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIFhrYlNydkxlZEluZm9QdHIJCS8qIHNsaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWRfbWFwcyAqLywKKyAgICB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKgkvKiBlZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JBcHBseUxlZFN0YXRlQ2hhbmdlcygKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKyAgICBYa2JTcnZMZWRJbmZvUHRyCQkvKiBzbGkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBjaGFuZ2VkX2xlZHMgKi8sCisgICAgeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5ICoJLyogZWQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiVXBkYXRlTGVkQXV0b1N0YXRlKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIFhrYlNydkxlZEluZm9QdHIJCS8qIHNsaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIG1hcHNfdG9fY2hlY2sgKi8sCisgICAgeGtiRXh0ZW5zaW9uRGV2aWNlTm90aWZ5ICoJLyogZWQgKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRmx1c2hMZWRFdmVudHMoCQorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgIFhrYlNydkxlZEluZm9QdHIJCS8qIHNsaSAqLywKKyAgICB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKgkvKiBlZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovLAorICAgIFhrYkV2ZW50Q2F1c2VQdHIJCS8qIGNhdXNlICovCispOworCitleHRlcm4gdm9pZCBYa2JVcGRhdGVBbGxEZXZpY2VJbmRpY2F0b3JzKAorICAgIFhrYkNoYW5nZXNQdHIJCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkJLyogY2F1c2UgKi8KKyk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgWGtiSW5kaWNhdG9yc1RvVXBkYXRlKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIHN0YXRlX2NoYW5nZXMgKi8sCisgICAgQm9vbAkJCS8qIGVuYWJsZWRfY3RybF9jaGFuZ2VzICovCispOworCitleHRlcm4gdm9pZCBYa2JDb21wdXRlRGVyaXZlZFN0YXRlKAorICAgIFhrYlNydkluZm9QdHIJCS8qIHhrYmkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkNoZWNrU2Vjb25kYXJ5RWZmZWN0cygKKyAgICBYa2JTcnZJbmZvUHRyCQkvKiB4a2JpICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2hpY2ggKi8sCisgICAgWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiQ2hlY2tJbmRpY2F0b3JNYXBzKAorICAgIERldmljZUludFB0cgkJLyogZGV2ICovLAorICAgIFhrYlNydkxlZEluZm9QdHIJCS8qIHNsaSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovCispOworCitleHRlcm4gdW5zaWduZWQgaW50IFhrYlN0YXRlQ2hhbmdlZEZsYWdzKAorICAgIFhrYlN0YXRlUHRyCQkJLyogb2xkICovLAorICAgIFhrYlN0YXRlUHRyCQkJLyogbmV3ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kU3RhdGVOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCS8qIGtiZCAqLywKKyAgICAgICB4a2JTdGF0ZU5vdGlmeSAqCS8qIHBTTiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZE1hcE5vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJLyoga2JkICovLAorICAgICAgIHhrYk1hcE5vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4JaW50ICBYa2JDb21wdXRlQ29udHJvbHNOb3RpZnkoCisJRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisJWGtiQ29udHJvbHNQdHIJCS8qIG9sZCAqLywKKwlYa2JDb250cm9sc1B0cgkJLyogbmV3ICovLAorCXhrYkNvbnRyb2xzTm90aWZ5ICoJLyogcENOICovLAorCUJvb2wJCQkvKiBmb3JjZUN0cmxQcm9jICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kQ29udHJvbHNOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgICAgeGtiQ29udHJvbHNOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZENvbXBhdE1hcE5vdGlmeSgKKwlEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKwl4a2JDb21wYXRNYXBOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuCXZvaWQgWGtiU2VuZEluZGljYXRvck5vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICAgICBpbnQJCQkvKiB4a2JUeXBlICovLAorICAgICAgIHhrYkluZGljYXRvck5vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JIYW5kbGVCZWxsKAorICAgICAgIEJPT0wJCS8qIGZvcmNlICovLAorICAgICAgIEJPT0wJCS8qIGV2ZW50T25seSAqLywKKyAgICAgICBEZXZpY2VJbnRQdHIJLyoga2JkICovLAorICAgICAgIENBUkQ4CQkvKiBwZXJjZW50ICovLAorICAgICAgIHBvaW50ZXIgCQkvKiBjdHJsICovLAorICAgICAgIENBUkQ4CQkvKiBjbGFzcyAqLywKKyAgICAgICBBdG9tCQkvKiBuYW1lICovLAorICAgICAgIFdpbmRvd1B0cgkvKiBwV2luICovLAorICAgICAgIENsaWVudFB0cgkvKiBwQ2xpZW50ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kQWNjZXNzWE5vdGlmeSgKKyAgICAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICAgICB4a2JBY2Nlc3NYTm90aWZ5ICoJLyogcEV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kTmFtZXNOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCS8qIGtiZCAqLywKKyAgICAgICB4a2JOYW1lc05vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kQ29tcGF0Tm90aWZ5KAorICAgICAgIERldmljZUludFB0cgkJLyoga2JkICovLAorICAgICAgIHhrYkNvbXBhdE1hcE5vdGlmeSAqCS8qIGV2ICovCispOworCitleHRlcm4Jdm9pZCBYa2JTZW5kQWN0aW9uTWVzc2FnZSgKKyAgICAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICAgICB4a2JBY3Rpb25NZXNzYWdlICoJLyogZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYlNlbmRFeHRlbnNpb25EZXZpY2VOb3RpZnkoCisgICAgICAgRGV2aWNlSW50UHRyCQkJLyoga2JkICovLAorICAgICAgIENsaWVudFB0cgkJCS8qIGNsaWVudCAqLywKKyAgICAgICB4a2JFeHRlbnNpb25EZXZpY2VOb3RpZnkgKgkvKiBldiAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiU2VuZE5vdGlmaWNhdGlvbigKKyAgICBEZXZpY2VJbnRQdHIJCS8qIGtiZCAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCQkvKiBwQ2hhbmdlcyAqLywKKyAgICBYa2JFdmVudENhdXNlUHRyCQkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiUHJvY2Vzc0tleWJvYXJkRXZlbnQoCisgICAgc3RydWN0IF94RXZlbnQgKiAJCS8qIHhFICovLAorICAgIERldmljZUludFB0cgkJLyoga2V5YmQgKi8sCisgICAgaW50IAkJCS8qIGNvdW50ICovCispOworCitleHRlcm4gdm9pZCBYa2JQcm9jZXNzT3RoZXJFdmVudCgKKyAgICBzdHJ1Y3QgX3hFdmVudCAqIAkJLyogeEUgKi8sCisgICAgRGV2aWNlSW50UHRyCQkvKiBrZXliZCAqLywKKyAgICBpbnQgCQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkhhbmRsZUFjdGlvbnMoCisgICAgRGV2aWNlSW50UHRyCQkvKiBkZXYgKi8sCisgICAgRGV2aWNlSW50UHRyCQkvKiBrYmQgKi8sCisgICAgc3RydWN0IF94RXZlbnQgKiAJCS8qIHhFICovLAorICAgIGludCAJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiRW5hYmxlRGlzYWJsZUNvbnRyb2xzKAorICAgIFhrYlNydkluZm9QdHIJLyogeGtiaSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGNoYW5nZSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIG5ld1ZhbHVlcyAqLywKKyAgICBYa2JDaGFuZ2VzUHRyCS8qIGNoYW5nZXMgKi8sCisgICAgWGtiRXZlbnRDYXVzZVB0cgkvKiBjYXVzZSAqLworKTsKKworZXh0ZXJuIHZvaWQgQWNjZXNzWEluaXQoCisgICAgRGV2aWNlSW50UHRyICAgICAgICAvKiBkZXYgKi8KKyk7CisKK2V4dGVybiBCb29sIEFjY2Vzc1hGaWx0ZXJQcmVzc0V2ZW50KAorICAgIHJlZ2lzdGVyIHN0cnVjdCBfeEV2ZW50ICoJLyogeEUgKi8sCisgICAgcmVnaXN0ZXIgRGV2aWNlSW50UHRyCS8qIGtleWJkICovLAorICAgIGludAkJCQkvKiBjb3VudCAqLworKTsKKworZXh0ZXJuIEJvb2wgQWNjZXNzWEZpbHRlclJlbGVhc2VFdmVudCgKKyAgICByZWdpc3RlciBzdHJ1Y3QgX3hFdmVudCAqCS8qIHhFICovLAorICAgIHJlZ2lzdGVyIERldmljZUludFB0cgkvKiBrZXliZCAqLywKKyAgICBpbnQJCQkJLyogY291bnQgKi8KKyk7CisKK2V4dGVybiB2b2lkIEFjY2Vzc1hDYW5jZWxSZXBlYXRLZXkoCisgICAgWGtiU3J2SW5mb1B0cgkvKiB4a2JpICovLAorICAgIEtleUNvZGUJCS8qIGtleSAqLworKTsKKworZXh0ZXJuIHZvaWQgQWNjZXNzWENvbXB1dGVDdXJ2ZUZhY3RvcigKKyAgICBYa2JTcnZJbmZvUHRyCS8qIHhrYmkgKi8sCisgICAgWGtiQ29udHJvbHNQdHIJLyogY3RybHMgKi8KKyk7CisKK2V4dGVybglYa2JEZXZpY2VMZWRJbmZvUHRyCVhrYkFkZERldmljZUxlZEluZm8oCisJWGtiRGV2aWNlSW5mb1B0cgkvKiBkZXZpICovLAorCXVuc2lnbmVkIGludAkJLyogbGVkQ2xhc3MgKi8sCisJdW5zaWduZWQgaW50CQkvKiBsZWRJZCAqLworKTsKKworZXh0ZXJuCVhrYkRldmljZUluZm9QdHIJWGtiQWxsb2NEZXZpY2VJbmZvKAorCXVuc2lnbmVkIGludAkJLyogZGV2aWNlU3BlYyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIG5CdXR0b25zICovLAorCXVuc2lnbmVkIGludAkJLyogc3pMZWRzICovCispOworCitleHRlcm4Jdm9pZCBYa2JGcmVlRGV2aWNlSW5mbygKKwlYa2JEZXZpY2VJbmZvUHRyCS8qIGRldmkgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlCb29sCQkJLyogZnJlZURldkkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGtiUmVzaXplRGV2aWNlQnV0dG9uQWN0aW9ucygKKwlYa2JEZXZpY2VJbmZvUHRyICAgICAgICAvKiBkZXZpICovLAorCXVuc2lnbmVkIGludCAgICAgICAgICAgIC8qIG5ld1RvdGFsICovCispOworCitleHRlcm4JWGtiSW50ZXJlc3RQdHIgWGtiRmluZENsaWVudFJlc291cmNlKAorICAgICAgIERldmljZVB0cgkvKiBpbkRldiAqLywKKyAgICAgICBDbGllbnRQdHIJLyogY2xpZW50ICovCispOworCitleHRlcm4JWGtiSW50ZXJlc3RQdHIgWGtiQWRkQ2xpZW50UmVzb3VyY2UoCisgICAgICAgRGV2aWNlUHRyCS8qIGluRGV2ICovLAorICAgICAgIENsaWVudFB0cgkvKiBjbGllbnQgKi8sCisgICAgICAgWElECQkvKiBpZCAqLworKTsKKworZXh0ZXJuCWludCBYa2JSZW1vdmVDbGllbnQoCisgICAgICAgRGV2aWNlUHRyCS8qIGluRGV2ICovLAorICAgICAgIENsaWVudFB0cgkvKiBjbGllbnQgKi8KKyk7CisKK2V4dGVybglpbnQgWGtiUmVtb3ZlUmVzb3VyY2VDbGllbnQoCisgICAgICAgRGV2aWNlUHRyCS8qIGluRGV2ICovLAorICAgICAgIFhJRAkJLyogaWQgKi8KKyk7CisKK2V4dGVybiBpbnQgWGtiRERYSW5pdERldmljZSgKKyAgICBEZXZpY2VJbnRQdHIgICAgICAgIC8qIGRldiAqLworKTsKKworZXh0ZXJuCWludCBYa2JERFhBY2Nlc3NYQmVlcCgKKyAgICBEZXZpY2VJbnRQdHIgICAgICAgIC8qIGRldiAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2hhdCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2hpY2ggKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkREWEtleUNsaWNrKAorICAgIERldmljZUludFB0cgkvKiBkZXYgKi8sCisgICAgaW50CQkJLyoga2V5Y29kZSAqLywKKyAgICBpbnQJCQkvKiBzeW50aGV0aWMgKi8KKyk7CisKK2V4dGVybiAJaW50IFhrYkREWFVzZXNTb2Z0UmVwZWF0KAorICAgIERldmljZUludFB0cgkvKiBkZXYgKi8KKyk7CisKK2V4dGVybgl2b2lkIFhrYkREWEtleWJkQ3RybFByb2MoCisJRGV2aWNlSW50UHRyCS8qIGRldiAqLywKKwlLZXliZEN0cmwgKgkvKiBjdHJsICovCispOworCitleHRlcm4gdm9pZCBYa2JERFhDaGFuZ2VDb250cm9scygKKwlEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorCVhrYkNvbnRyb2xzUHRyIAkvKiBvbGQgKi8sCisJWGtiQ29udHJvbHNQdHIgCS8qIG5ldyAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRERYVXBkYXRlSW5kaWNhdG9ycygKKwlEZXZpY2VJbnRQdHIJLyoga2V5YmQgKi8sCisJQ0FSRDMyCQkvKiBuZXdTdGF0ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRERYVXBkYXRlRGV2aWNlSW5kaWNhdG9ycygKKwlEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKwlYa2JTcnZMZWRJbmZvUHRyCS8qIHNsaSAqLywKKwlDQVJEMzIJCQkvKiBuZXdTdGF0ZSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRERYRmFrZVBvaW50ZXJCdXR0b24oCisJaW50IAkJLyogZXZlbnQgKi8sCisJaW50CQkvKiBidXR0b24gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkREWEZha2VQb2ludGVyTW90aW9uKAorIAl1bnNpZ25lZCBpbnQJLyogZmxhZ3MgKi8sCisJaW50CQkvKiB4ICovLAorCWludAkJLyogeSAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRERYRmFrZURldmljZUJ1dHRvbigKKwlEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorCUJvb2wJCS8qIHByZXNzICovLAorCWludAkJLyogYnV0dG9uICovCispOworCitleHRlcm4gaW50IFhrYkREWFRlcm1pbmF0ZVNlcnZlcigKKwlEZXZpY2VJbnRQdHIJLyogZGV2ICovLAorCUtleUNvZGUJCS8qIGtleSAqLywKKwlYa2JBY3Rpb24gKgkvKiBhY3QgKi8KKyk7CisKK2V4dGVybiBpbnQgWGtiRERYU3dpdGNoU2NyZWVuKAorCURldmljZUludFB0cgkvKiBkZXYgKi8sCisJS2V5Q29kZQkJLyoga2V5ICovLAorCVhrYkFjdGlvbiAqCS8qIGFjdCAqLworKTsKKworZXh0ZXJuIGludCBYa2JERFhQcml2YXRlKAorCURldmljZUludFB0cgkvKiBkZXYgKi8sCisJS2V5Q29kZQkJLyoga2V5ICovLAorCVhrYkFjdGlvbiAqCS8qIGFjdCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRGlzYWJsZUNvbXB1dGVkQXV0b1JlcGVhdHMoCisJRGV2aWNlSW50UHRyIAkvKiBwWERldiAqLywKKwl1bnNpZ25lZCBpbnQJLyoga2V5ICovCispOworCitleHRlcm4gdm9pZCBYa2JTZXRSZXBlYXRLZXlzKAorCURldmljZUludFB0ciAJLyogcFhEZXYgKi8sCisJaW50CQkvKiBrZXkgKi8sCisJaW50CSAJLyogb25vZmYgKi8KKyk7CisKK2V4dGVybglpbnQgWGtiTGF0Y2hNb2RpZmllcnMoCisJRGV2aWNlSW50UHRyIAkvKiBwWERldiAqLywKKwlDQVJEOCAJCS8qIG1hc2sgKi8sCisJQ0FSRDggCQkvKiBsYXRjaGVzICovCispOworCitleHRlcm4JaW50IFhrYkxhdGNoR3JvdXAoCisJRGV2aWNlSW50UHRyICAJLyogcFhEZXYgKi8sCisJaW50CSAgCS8qIGdyb3VwICovCispOworCitleHRlcm4Jdm9pZCBYa2JDbGVhckFsbExhdGNoZXNBbmRMb2NrcygKKwlEZXZpY2VJbnRQdHIJCS8qIGRldiAqLywKKwlYa2JTcnZJbmZvUHRyCQkvKiB4a2JpICovLAorCUJvb2wJCQkvKiBnZW5FdiAqLywKKwlYa2JFdmVudENhdXNlUHRyCS8qIGNhdXNlICovCispOworCitleHRlcm4Jdm9pZAlYa2JTZXRSdWxlc0RmbHRzKAorCWNoYXIgKgkJCS8qIHJ1bGVzRmlsZSAqLywKKwljaGFyICoJCQkvKiBtb2RlbCAqLywKKwljaGFyICoJCQkvKiBsYXlvdXQgKi8sCisJY2hhciAqCQkJLyogdmFyaWFudCAqLywKKwljaGFyICoJCQkvKiBvcHRpb25zICovCispOworCitleHRlcm4Jdm9pZAlYa2JJbml0RGV2aWNlKAorCURldmljZUludFB0ciAJLyogcFhEZXYgKi8KKyk7CisKK2V4dGVybglCb29sCVhrYkluaXRLZXlib2FyZERldmljZVN0cnVjdCgKKwlEZXZpY2VJbnRQdHIgCQkvKiBwWERldiAqLywKKwlYa2JDb21wb25lbnROYW1lc1B0cgkvKiBwTmFtZXMgKi8sCisJS2V5U3ltc1B0cgkJLyogcFN5bXMgKi8sCisJQ0FSRDggCQkJLyogcE1vZHMgKi9bXSwKKwlCZWxsUHJvY1B0cgkJLyogYmVsbFByb2MgKi8sCisJS2JkQ3RybFByb2NQdHIJCS8qIGN0cmxQcm9jICovCispOworCitleHRlcm4JaW50IFNQcm9jWGtiRGlzcGF0Y2goCisJQ2xpZW50UHRyCQkvKiBjbGllbnQgKi8KKyk7CisKK2V4dGVybiBYa2JHZW9tZXRyeVB0ciBYa2JMb29rdXBOYW1lZEdlb21ldHJ5KAorCURldmljZUludFB0cgkJLyogZGV2ICovLAorCUF0b20JCQkvKiBuYW1lICovLAorCUJvb2wgKgkJCS8qIHNob3VsZEZyZWUgKi8KKyk7CisKK2V4dGVybiBjaGFyICoJX1hrYkR1cFN0cmluZygKKwljaGFyICoJCQkvKiBzdHIgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhrYkNvbnZlcnRDYXNlKAorCUtleVN5bSAJCQkvKiBzeW0gKi8sCisJS2V5U3ltICoJCS8qIGxvd2VyICovLAorCUtleVN5bSAqCQkvKiB1cHBlciAqLworKTsKKworZXh0ZXJuCVN0YXR1cwkgWGtiQ2hhbmdlS2V5Y29kZVJhbmdlKAkKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJaW50IAkJCS8qIG1pbktDICovLAorCWludCAJCQkvKiBtYXhLQyAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gaW50IFhrYkZpbmlzaERldmljZUluaXQoCisJRGV2aWNlSW50UHRyCQkvKiBwWERldiAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRnJlZVNydkxlZEluZm8oCisJWGtiU3J2TGVkSW5mb1B0cgkvKiBzbGkgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYkZyZWVJbmZvKAorCVhrYlNydkluZm9QdHIJCS8qIHhrYmkgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWGtiQ2hhbmdlVHlwZXNPZktleSgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJaW50CQkJLyoga2V5ICovLAorCWludAkJCS8qIG5Hcm91cHMgKi8sCisJdW5zaWduZWQgaW50CQkvKiBncm91cHMgKi8sCisJaW50ICoJCQkvKiBuZXdUeXBlc0luICovLAorCVhrYk1hcENoYW5nZXNQdHIJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIFhrYktleVR5cGVQdHIgWGtiQWRkS2V5VHlwZSgKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJQXRvbQkJCS8qIG5hbWUgKi8sCisJaW50CQkJLyogbWFwX2NvdW50ICovLAorCUJvb2wJCQkvKiB3YW50X3ByZXNlcnZlICovLAorCWludAkJCS8qIG51bV9sdmxzICovCispOworCitleHRlcm4gU3RhdHVzIFhrYkluaXRDYW5vbmljYWxLZXlUeXBlcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJdW5zaWduZWQgaW50CQkvKiB3aGljaCAqLywKKwlpbnQJCQkvKiBrZXlwYWRWTW9kICovCispOworCitleHRlcm4gaW50IFhrYktleVR5cGVzRm9yQ29yZVN5bWJvbHMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCWludAkJCS8qIG1hcF93aWR0aCAqLywKKwlLZXlTeW0gKgkJLyogY29yZV9zeW1zICovLAorCXVuc2lnbmVkIGludAkJLyogcHJvdGVjdGVkICovLAorCWludCAqCQkJLyogdHlwZXNfaW5vdXQgKi8sCisJS2V5U3ltICoJCS8qIHhrYl9zeW1zX3J0cm4gKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYkFwcGx5Q29tcGF0TWFwVG9LZXkoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCUtleUNvZGUJCQkvKiBrZXkgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIEJvb2wgWGtiVXBkYXRlTWFwRnJvbUNvcmUoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCUtleUNvZGUJCQkvKiBmaXJzdF9rZXkgKi8sCisJaW50CQkJLyogbnVtX2tleXMgKi8sCisJaW50CQkJLyogbWFwX3dpZHRoICovLAorCUtleVN5bSAqCQkvKiBjb3JlX2tleXN5bXMgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiRnJlZUNvbnRyb2xzKAorCVhrYkRlc2NQdHIJCS8qIHhrYiAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdoaWNoICovLAorCUJvb2wJCQkvKiBmcmVlTWFwICovCispOworCitleHRlcm4gdm9pZCBYa2JGcmVlSW5kaWNhdG9yTWFwcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8KKyk7CisKK2V4dGVybiBCb29sIFhrYkFwcGx5VmlydHVhbE1vZENoYW5nZXMoCisJWGtiRGVzY1B0cgkJLyogeGtiICovLAorCXVuc2lnbmVkIGludAkJLyogY2hhbmdlZCAqLywKKwlYa2JDaGFuZ2VzUHRyCQkvKiBjaGFuZ2VzICovCispOworCitleHRlcm4gQm9vbCBYa2JVcGRhdGVBY3Rpb25WaXJ0dWFsTW9kcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiQWN0aW9uICoJCS8qIGFjdCAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWQgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhrYlVwZGF0ZUtleVR5cGVWaXJ0dWFsTW9kcygKKwlYa2JEZXNjUHRyCQkvKiB4a2IgKi8sCisJWGtiS2V5VHlwZVB0cgkJLyogdHlwZSAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIGNoYW5nZWQgKi8sCisJWGtiQ2hhbmdlc1B0cgkJLyogY2hhbmdlcyAqLworKTsKKworZXh0ZXJuIHZvaWQgWGtiU2VuZE5ld0tleWJvYXJkTm90aWZ5KAorCURldmljZUludFB0cgkJLyoga2JkICovLAorCXhrYk5ld0tleWJvYXJkTm90aWZ5ICoJLyogcE5LTiAqLworKTsKKworI2lmZGVmIFhLQlNSVl9ORUVEX0ZJTEVfRlVOQ1MKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLTWZvcm1hdC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hLQmZpbGUuaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YS0JydWxlcy5oPgorCisjZGVmaW5lCV9Ya2JMaXN0S2V5bWFwcwkJMAorI2RlZmluZQlfWGtiTGlzdEtleWNvZGVzCTEKKyNkZWZpbmUJX1hrYkxpc3RUeXBlcwkJMgorI2RlZmluZQlfWGtiTGlzdENvbXBhdAkJMworI2RlZmluZQlfWGtiTGlzdFN5bWJvbHMJCTQKKyNkZWZpbmUJX1hrYkxpc3RHZW9tZXRyeQk1CisjZGVmaW5lCV9Ya2JMaXN0TnVtQ29tcG9uZW50cwk2CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTcnZMaXN0SW5mbyB7CisJaW50CQlzelBvb2w7CisJaW50CQluUG9vbDsKKwljaGFyICoJCXBvb2w7CisKKwlpbnQJCW1heFJ0cm47CisJaW50CQluVG90YWw7CisKKwljaGFyICoJCXBhdHRlcm5bX1hrYkxpc3ROdW1Db21wb25lbnRzXTsKKwlpbnQJCW5Gb3VuZFtfWGtiTGlzdE51bUNvbXBvbmVudHNdOworfSBYa2JTcnZMaXN0SW5mb1JlYywqWGtiU3J2TGlzdEluZm9QdHI7CisKK2NoYXIgKgorWGtiR2V0UnVsZXNEZmx0cygKKwlYa2JSRl9WYXJEZWZzUHRyCS8qIGRlZnMgKi8KKyk7CisKK2V4dGVybiB2b2lkCVhrYlNldFJ1bGVzVXNlZCgKKwlYa2JSRl9WYXJEZWZzUHRyCS8qIGRlZnMgKi8KKyk7CisKKworZXh0ZXJuCVN0YXR1cwlYa2JERFhMaXN0KAorCURldmljZUludFB0cgkJLyogZGV2ICovLAorCVhrYlNydkxpc3RJbmZvUHRyCS8qIGxpc3RpbmcgKi8sCisJQ2xpZW50UHRyCQkvKiBjbGllbnQgKi8KKyk7CisKK2V4dGVybgl1bnNpZ25lZCBpbnQgWGtiRERYTG9hZEtleW1hcEJ5TmFtZXMoCisJRGV2aWNlSW50UHRyCQkvKiBrZXliZCAqLywKKwlYa2JDb21wb25lbnROYW1lc1B0cgkvKiBuYW1lcyAqLywKKwl1bnNpZ25lZCBpbnQJCS8qIHdhbnQgKi8sCisJdW5zaWduZWQgaW50CQkvKiBuZWVkICovLAorCVhrYkZpbGVJbmZvUHRyCQkvKiBmaW5mb1J0cm4gKi8sCisJY2hhciAqCQkJLyoga2V5bWFwTmFtZVJ0cm4gKi8sCisJaW50IAkJCS8qIGtleW1hcE5hbWVSdHJuTGVuICovCispOworCitleHRlcm4JQm9vbCBYa2JERFhOYW1lc0Zyb21SdWxlcygKKwlEZXZpY2VJbnRQdHIJCS8qIGtleWJkICovLAorCWNoYXIgKgkJCS8qIHJ1bGVzICovLAorCVhrYlJGX1ZhckRlZnNQdHIJLyogZGVmcyAqLywKKwlYa2JDb21wb25lbnROYW1lc1B0cgkvKiBuYW1lcyAqLworKTsKKworZXh0ZXJuCUZJTEUgKlhrYkREWE9wZW5Db25maWdGaWxlKAorCWNoYXIgKgkvKiBtYXBOYW1lICovLAorCWNoYXIgKgkvKiBmaWxlTmFtZVJ0cm4gKi8sCisJaW50CS8qIGZpbGVOYW1lUnRybkxlbiAqLworKTsKKworZXh0ZXJuCUJvb2wgWGtiRERYQXBwbHlDb25maWcoCisJWFBvaW50ZXIJLyogY2ZnX2luICovLAorCVhrYlNydkluZm9QdHIJLyogeGtiaSAqLworKTsKKworZXh0ZXJuIFhQb2ludGVyIFhrYkREWFByZWxvYWRDb25maWcoCisJY2hhciAqKgkJCS8qIHJ1bGVzRmlsZVJ0cm4gKi8sCisJWGtiUkZfVmFyRGVmc1B0cgkvKiBkZWZzICovLAorCVhrYkNvbXBvbmVudE5hbWVzUHRyCS8qIG5hbWVzICovLAorCURldmljZUludFB0cgkJLyogZGV2ICovCispOworCitleHRlcm4JaW50IF9Ya2JTdHJDYXNlQ21wKAorCWNoYXIgKgkJCS8qIHN0cjEgKi8sCisJY2hhciAqCQkJLyogc3RyMiAqLworKTsKKworI2VuZGlmIC8qIFhLQlNSVl9ORUVEX0ZJTEVfRlVOQ1MgKi8KKworCitfWEZVTkNQUk9UT0VORAorCisjZGVmaW5lCVhrYkF0b21HZXRTdHJpbmcoZCxzKQlOYW1lRm9yQXRvbShzKQorCisjZW5kaWYgLyogX1hLQlNSVl9IXyAqLworCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWEtCc3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjNmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hLQnN0ci5oCkBAIC0wLDAgKzEsNjE0IEBACisvKiAkWG9yZzogWEtCc3RyLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDE5OTMgYnkgU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZSAKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgCitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitTSUxJQ09OIEdSQVBISUNTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIAorU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSAKK0FORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgU0lMSUNPTgorR1JBUEhJQ1MgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCAKK0RBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIAorT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OICBXSVRICitUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9YS0JTVFJfSF8KKyNkZWZpbmUJX1hLQlNUUl9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEtCLmg+CisKKyNkZWZpbmUJWGtiQ2hhclRvSW50KHYpCQkoKHYpJjB4ODA/KGludCkoKHYpfCh+MHhmZikpOihpbnQpKCh2KSYweDdmKSkKKyNkZWZpbmUJWGtiSW50VG8yQ2hhcnMoaSxoLGwpCSgoKGgpPSgoaT4+OCkmMHhmZikpLCgobCk9KChpKSYweGZmKSkpCisKKyNpZiBkZWZpbmVkKFdPUkQ2NCkgJiYgZGVmaW5lZChVTlNJR05FREJJVEZJRUxEUykKKyNkZWZpbmUJWGtiMkNoYXJzVG9JbnQoaCxsKQkoKGgpJjB4ODA/KGludCkoKChoKTw8OCl8KGwpfCh+MHhmZmZmKSk6XAorCQkJCQkgIChpbnQpKCgoaCk8PDgpfChsKSYweDdmZmYpKQorI2Vsc2UKKyNkZWZpbmUJWGtiMkNoYXJzVG9JbnQoaCxsKQkoKHNob3J0KSgoKGgpPDw4KXwobCkpKQorI2VuZGlmCisKKwkvKgorCSAqIENvbW1vbiBkYXRhIHN0cnVjdHVyZXMgYW5kIGFjY2VzcyBtYWNyb3MKKwkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlN0YXRlUmVjIHsKKwl1bnNpZ25lZCBjaGFyCWdyb3VwOworCXVuc2lnbmVkIGNoYXIgICBsb2NrZWRfZ3JvdXA7CisJdW5zaWduZWQgc2hvcnQJYmFzZV9ncm91cDsKKwl1bnNpZ25lZCBzaG9ydAlsYXRjaGVkX2dyb3VwOworCXVuc2lnbmVkIGNoYXIJbW9kczsKKwl1bnNpZ25lZCBjaGFyCWJhc2VfbW9kczsKKwl1bnNpZ25lZCBjaGFyCWxhdGNoZWRfbW9kczsKKwl1bnNpZ25lZCBjaGFyCWxvY2tlZF9tb2RzOworCXVuc2lnbmVkIGNoYXIJY29tcGF0X3N0YXRlOworCXVuc2lnbmVkIGNoYXIJZ3JhYl9tb2RzOworCXVuc2lnbmVkIGNoYXIJY29tcGF0X2dyYWJfbW9kczsKKwl1bnNpZ25lZCBjaGFyCWxvb2t1cF9tb2RzOworCXVuc2lnbmVkIGNoYXIJY29tcGF0X2xvb2t1cF9tb2RzOworCXVuc2lnbmVkIHNob3J0CXB0cl9idXR0b25zOworfSBYa2JTdGF0ZVJlYywqWGtiU3RhdGVQdHI7CisjZGVmaW5lCVhrYk1vZExvY2tzKHMpCSAoKHMpLT5sb2NrZWRfbW9kcykKKyNkZWZpbmUJWGtiU3RhdGVNb2RzKHMpCSAoKHMpLT5iYXNlX21vZHN8KHMpLT5sYXRjaGVkX21vZHN8WGtiTW9kTG9ja3MocykpCisjZGVmaW5lCVhrYkdyb3VwTG9jayhzKQkgKChzKS0+bG9ja2VkX2dyb3VwKQorI2RlZmluZQlYa2JTdGF0ZUdyb3VwKHMpICgocyktPmJhc2VfZ3JvdXArKHMpLT5sYXRjaGVkX2dyb3VwK1hrYkdyb3VwTG9jayhzKSkKKyNkZWZpbmUJWGtiU3RhdGVGaWVsZEZyb21SZWMocykJWGtiQnVpbGRDb3JlU3RhdGUoKHMpLT5sb29rdXBfbW9kcywocyktPmdyb3VwKQorI2RlZmluZQlYa2JHcmFiU3RhdGVGcm9tUmVjKHMpCVhrYkJ1aWxkQ29yZVN0YXRlKChzKS0+Z3JhYl9tb2RzLChzKS0+Z3JvdXApCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JNb2RzIHsKKwl1bnNpZ25lZCBjaGFyCW1hc2s7CS8qIGVmZmVjdGl2ZSBtb2RzICovCisJdW5zaWduZWQgY2hhcglyZWFsX21vZHM7CisJdW5zaWduZWQgc2hvcnQJdm1vZHM7Cit9IFhrYk1vZHNSZWMsKlhrYk1vZHNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JLVE1hcEVudHJ5IHsKKwlCb29sCQlhY3RpdmU7CisJdW5zaWduZWQgY2hhcglsZXZlbDsKKwlYa2JNb2RzUmVjCW1vZHM7Cit9IFhrYktUTWFwRW50cnlSZWMsKlhrYktUTWFwRW50cnlQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JLZXlUeXBlIHsKKwlYa2JNb2RzUmVjCQltb2RzOworCXVuc2lnbmVkIGNoYXIJICAJbnVtX2xldmVsczsKKwl1bnNpZ25lZCBjaGFyCSAgCW1hcF9jb3VudDsKKwlYa2JLVE1hcEVudHJ5UHRyICAJbWFwOworCVhrYk1vZHNQdHIgIAkJcHJlc2VydmU7CisJQXRvbQkJICAJbmFtZTsKKwlBdG9tICoJCQlsZXZlbF9uYW1lczsKK30gWGtiS2V5VHlwZVJlYywgKlhrYktleVR5cGVQdHI7CisKKyNkZWZpbmUJWGtiTnVtR3JvdXBzKGcpCQkJKChnKSYweDBmKQorI2RlZmluZQlYa2JPdXRPZlJhbmdlR3JvdXBJbmZvKGcpCSgoZykmMHhmMCkKKyNkZWZpbmUJWGtiT3V0T2ZSYW5nZUdyb3VwQWN0aW9uKGcpCSgoZykmMHhjMCkKKyNkZWZpbmUJWGtiT3V0T2ZSYW5nZUdyb3VwTnVtYmVyKGcpCSgoKGcpJjB4MzApPj40KQorI2RlZmluZQlYa2JTZXRHcm91cEluZm8oZyx3LG4pCSgoKHcpJjB4YzApfCgoKG4pJjMpPDw0KXwoKGcpJjB4MGYpKQorI2RlZmluZQlYa2JTZXROdW1Hcm91cHMoZyxuKQkoKChnKSYweGYwKXwoKG4pJjB4MGYpKQorCisJLyoKKwkgKiBTdHJ1Y3R1cmVzIGFuZCBhY2Nlc3MgbWFjcm9zIHVzZWQgcHJpbWFyaWx5IGJ5IHRoZSBzZXJ2ZXIKKwkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkJlaGF2aW9yIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglkYXRhOworfSBYa2JCZWhhdmlvcjsKKworI2RlZmluZQlYa2JBbnlBY3Rpb25EYXRhU2l6ZSA3Cit0eXBlZGVmCXN0cnVjdCBfWGtiQW55QWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglkYXRhW1hrYkFueUFjdGlvbkRhdGFTaXplXTsKK30gWGtiQW55QWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBfWGtiTW9kQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCW1hc2s7CisJdW5zaWduZWQgY2hhcglyZWFsX21vZHM7CisJdW5zaWduZWQgY2hhcgl2bW9kczE7CisJdW5zaWduZWQgY2hhcgl2bW9kczI7Cit9IFhrYk1vZEFjdGlvbjsKKyNkZWZpbmUJWGtiTW9kQWN0aW9uVk1vZHMoYSkgICAgICBcCisJKChzaG9ydCkoKChhKS0+dm1vZHMxPDw4KXwoKGEpLT52bW9kczIpKSkKKyNkZWZpbmUJWGtiU2V0TW9kQWN0aW9uVk1vZHMoYSx2KSBcCisJKCgoYSktPnZtb2RzMT0oKCh2KT4+OCkmMHhmZikpLChhKS0+dm1vZHMyPSgodikmMHhmZikpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JHcm91cEFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJY2hhcgkJZ3JvdXBfWFhYOworfSBYa2JHcm91cEFjdGlvbjsKKyNkZWZpbmUJWGtiU0FHcm91cChhKQkJKFhrYkNoYXJUb0ludCgoYSktPmdyb3VwX1hYWCkpCisjZGVmaW5lCVhrYlNBU2V0R3JvdXAoYSxnKQkoKGEpLT5ncm91cF9YWFg9KGcpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiSVNPQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwl1bnNpZ25lZCBjaGFyCW1hc2s7CisJdW5zaWduZWQgY2hhcglyZWFsX21vZHM7CisJY2hhcgkJZ3JvdXBfWFhYOworCXVuc2lnbmVkIGNoYXIJYWZmZWN0OworCXVuc2lnbmVkIGNoYXIJdm1vZHMxOworCXVuc2lnbmVkIGNoYXIJdm1vZHMyOworfSBYa2JJU09BY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JQdHJBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJaGlnaF9YWFg7CisJdW5zaWduZWQgY2hhcglsb3dfWFhYOworCXVuc2lnbmVkIGNoYXIJaGlnaF9ZWVk7CisJdW5zaWduZWQgY2hhcglsb3dfWVlZOworfSBYa2JQdHJBY3Rpb247CisjZGVmaW5lCVhrYlB0ckFjdGlvblgoYSkgICAgICAoWGtiMkNoYXJzVG9JbnQoKGEpLT5oaWdoX1hYWCwoYSktPmxvd19YWFgpKQorI2RlZmluZQlYa2JQdHJBY3Rpb25ZKGEpICAgICAgKFhrYjJDaGFyc1RvSW50KChhKS0+aGlnaF9ZWVksKGEpLT5sb3dfWVlZKSkKKyNkZWZpbmUJWGtiU2V0UHRyQWN0aW9uWChhLHgpIChYa2JJbnRUbzJDaGFycyh4LChhKS0+aGlnaF9YWFgsKGEpLT5sb3dfWFhYKSkKKyNkZWZpbmUJWGtiU2V0UHRyQWN0aW9uWShhLHkpIChYa2JJbnRUbzJDaGFycyh5LChhKS0+aGlnaF9ZWVksKGEpLT5sb3dfWVlZKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYlB0ckJ0bkFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgljb3VudDsKKwl1bnNpZ25lZCBjaGFyCWJ1dHRvbjsKK30gWGtiUHRyQnRuQWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBfWGtiUHRyRGZsdEFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcglhZmZlY3Q7CisJY2hhcgkJdmFsdWVYWFg7Cit9IFhrYlB0ckRmbHRBY3Rpb247CisjZGVmaW5lCVhrYlNBUHRyRGZsdFZhbHVlKGEpCQkoWGtiQ2hhclRvSW50KChhKS0+dmFsdWVYWFgpKQorI2RlZmluZQlYa2JTQVNldFB0ckRmbHRWYWx1ZShhLGMpCSgoYSktPnZhbHVlWFhYPSAoKGMpJjB4ZmYpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiU3dpdGNoU2NyZWVuQWN0aW9uIHsKKwl1bnNpZ25lZCBjaGFyCXR5cGU7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKwljaGFyCQlzY3JlZW5YWFg7Cit9IFhrYlN3aXRjaFNjcmVlbkFjdGlvbjsKKyNkZWZpbmUJWGtiU0FTY3JlZW4oYSkJCQkoWGtiQ2hhclRvSW50KChhKS0+c2NyZWVuWFhYKSkKKyNkZWZpbmUJWGtiU0FTZXRTY3JlZW4oYSxzKQkJKChhKS0+c2NyZWVuWFhYPSAoKHMpJjB4ZmYpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiQ3RybHNBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJY3RybHMzOworCXVuc2lnbmVkIGNoYXIJY3RybHMyOworCXVuc2lnbmVkIGNoYXIJY3RybHMxOworCXVuc2lnbmVkIGNoYXIJY3RybHMwOworfSBYa2JDdHJsc0FjdGlvbjsKKyNkZWZpbmUJWGtiQWN0aW9uU2V0Q3RybHMoYSxjKQkoKChhKS0+Y3RybHMzPSgoKGMpPj4yNCkmMHhmZikpLFwKKwkJCQkJKChhKS0+Y3RybHMyPSgoKGMpPj4xNikmMHhmZikpLFwKKwkJCQkJKChhKS0+Y3RybHMxPSgoKGMpPj44KSYweGZmKSksXAorCQkJCQkoKGEpLT5jdHJsczA9KChjKSYweGZmKSkpCisjZGVmaW5lCVhrYkFjdGlvbkN0cmxzKGEpICgoKCh1bnNpZ25lZCBpbnQpKGEpLT5jdHJsczMpPDwyNCl8XAorCQkJICAgKCgodW5zaWduZWQgaW50KShhKS0+Y3RybHMyKTw8MTYpfFwKKwkJCSAgICgoKHVuc2lnbmVkIGludCkoYSktPmN0cmxzMSk8PDgpfFwKKwkJCSAgICgodW5zaWduZWQgaW50KSgoYSktPmN0cmxzMCkpKQorCit0eXBlZGVmIHN0cnVjdCBfWGtiTWVzc2FnZUFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgltZXNzYWdlWzZdOworfSBYa2JNZXNzYWdlQWN0aW9uOworCit0eXBlZGVmIHN0cnVjdAlfWGtiUmVkaXJlY3RLZXlBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCW5ld19rZXk7CisJdW5zaWduZWQgY2hhcgltb2RzX21hc2s7CisJdW5zaWduZWQgY2hhcgltb2RzOworCXVuc2lnbmVkIGNoYXIJdm1vZHNfbWFzazA7CisJdW5zaWduZWQgY2hhcgl2bW9kc19tYXNrMTsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzMDsKKwl1bnNpZ25lZCBjaGFyCXZtb2RzMTsKK30gWGtiUmVkaXJlY3RLZXlBY3Rpb247CisKKyNkZWZpbmUJWGtiU0FSZWRpcmVjdFZNb2RzKGEpCQkoKCgodW5zaWduZWQgaW50KShhKS0+dm1vZHMxKTw8OCl8XAorCQkJCQkoKHVuc2lnbmVkIGludCkoYSktPnZtb2RzMCkpCisjZGVmaW5lCVhrYlNBUmVkaXJlY3RTZXRWTW9kcyhhLG0pCSgoKGEpLT52bW9kc19tYXNrMT0oKChtKT4+OCkmMHhmZikpLFwKKwkJCQkJICgoYSktPnZtb2RzX21hc2swPSgobSkmMHhmZikpKQorI2RlZmluZQlYa2JTQVJlZGlyZWN0Vk1vZHNNYXNrKGEpCSgoKCh1bnNpZ25lZCBpbnQpKGEpLT52bW9kc19tYXNrMSk8PDgpfFwKKwkJCQkJKCh1bnNpZ25lZCBpbnQpKGEpLT52bW9kc19tYXNrMCkpCisjZGVmaW5lCVhrYlNBUmVkaXJlY3RTZXRWTW9kc01hc2soYSxtKQkoKChhKS0+dm1vZHNfbWFzazE9KCgobSk+PjgpJjB4ZmYpKSxcCisJCQkJCSAoKGEpLT52bW9kc19tYXNrMD0oKG0pJjB4ZmYpKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkRldmljZUJ0bkFjdGlvbiB7CisJdW5zaWduZWQgY2hhcgl0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgljb3VudDsKKwl1bnNpZ25lZCBjaGFyCWJ1dHRvbjsKKwl1bnNpZ25lZCBjaGFyCWRldmljZTsKK30gWGtiRGV2aWNlQnRuQWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBfWGtiRGV2aWNlVmFsdWF0b3JBY3Rpb24geworCXVuc2lnbmVkIGNoYXIJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCWRldmljZTsKKwl1bnNpZ25lZCBjaGFyCXYxX3doYXQ7CisJdW5zaWduZWQgY2hhcgl2MV9uZHg7CisJdW5zaWduZWQgY2hhcgl2MV92YWx1ZTsKKwl1bnNpZ25lZCBjaGFyCXYyX3doYXQ7CisJdW5zaWduZWQgY2hhcgl2Ml9uZHg7CisJdW5zaWduZWQgY2hhcgl2Ml92YWx1ZTsKK30gWGtiRGV2aWNlVmFsdWF0b3JBY3Rpb247CisKK3R5cGVkZWYJdW5pb24gX1hrYkFjdGlvbiB7CisJWGtiQW55QWN0aW9uCQlhbnk7CisJWGtiTW9kQWN0aW9uCQltb2RzOworCVhrYkdyb3VwQWN0aW9uCQlncm91cDsKKwlYa2JJU09BY3Rpb24JCWlzbzsKKwlYa2JQdHJBY3Rpb24JCXB0cjsKKwlYa2JQdHJCdG5BY3Rpb24JCWJ0bjsKKwlYa2JQdHJEZmx0QWN0aW9uCWRmbHQ7CisJWGtiU3dpdGNoU2NyZWVuQWN0aW9uCXNjcmVlbjsKKwlYa2JDdHJsc0FjdGlvbgkJY3RybHM7CisJWGtiTWVzc2FnZUFjdGlvbgltc2c7CisJWGtiUmVkaXJlY3RLZXlBY3Rpb24JcmVkaXJlY3Q7CisJWGtiRGV2aWNlQnRuQWN0aW9uCWRldmJ0bjsKKwlYa2JEZXZpY2VWYWx1YXRvckFjdGlvbglkZXZ2YWw7CisJdW5zaWduZWQgY2hhciAJCXR5cGU7Cit9IFhrYkFjdGlvbjsKKwordHlwZWRlZglzdHJ1Y3QgX1hrYkNvbnRyb2xzIHsKKwl1bnNpZ25lZCBjaGFyCW1rX2RmbHRfYnRuOworCXVuc2lnbmVkIGNoYXIJbnVtX2dyb3VwczsKKwl1bnNpZ25lZCBjaGFyCWdyb3Vwc193cmFwOworCVhrYk1vZHNSZWMJaW50ZXJuYWw7CisJWGtiTW9kc1JlYwlpZ25vcmVfbG9jazsKKwl1bnNpZ25lZCBpbnQJZW5hYmxlZF9jdHJsczsKKwl1bnNpZ25lZCBzaG9ydAlyZXBlYXRfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQJcmVwZWF0X2ludGVydmFsOworCXVuc2lnbmVkIHNob3J0CXNsb3dfa2V5c19kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAlkZWJvdW5jZV9kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAlta19kZWxheTsKKwl1bnNpZ25lZCBzaG9ydAlta19pbnRlcnZhbDsKKwl1bnNpZ25lZCBzaG9ydAlta190aW1lX3RvX21heDsKKwl1bnNpZ25lZCBzaG9ydAlta19tYXhfc3BlZWQ7CisJCSBzaG9ydAlta19jdXJ2ZTsKKwl1bnNpZ25lZCBzaG9ydAlheF9vcHRpb25zOworCXVuc2lnbmVkIHNob3J0CWF4X3RpbWVvdXQ7CisJdW5zaWduZWQgc2hvcnQJYXh0X29wdHNfbWFzazsKKwl1bnNpZ25lZCBzaG9ydAlheHRfb3B0c192YWx1ZXM7CisJdW5zaWduZWQgaW50CWF4dF9jdHJsc19tYXNrOworCXVuc2lnbmVkIGludAlheHRfY3RybHNfdmFsdWVzOworCXVuc2lnbmVkIGNoYXIJcGVyX2tleV9yZXBlYXRbWGtiUGVyS2V5Qml0QXJyYXlTaXplXTsKK30gWGtiQ29udHJvbHNSZWMsICpYa2JDb250cm9sc1B0cjsKKworI2RlZmluZQlYa2JBWF9BbnlGZWVkYmFjayhjKQkoKGMpLT5lbmFibGVkX2N0cmxzJlhrYkFjY2Vzc1hGZWVkYmFja01hc2spCisjZGVmaW5lCVhrYkFYX05lZWRPcHRpb24oYyx3KQkoKGMpLT5heF9vcHRpb25zJih3KSkKKyNkZWZpbmUJWGtiQVhfTmVlZEZlZWRiYWNrKGMsdykJKFhrYkFYX0FueUZlZWRiYWNrKGMpJiZYa2JBWF9OZWVkT3B0aW9uKGMsdykpCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JTZXJ2ZXJNYXBSZWMgeworCXVuc2lnbmVkIHNob3J0CQkgbnVtX2FjdHM7CisJdW5zaWduZWQgc2hvcnQJCSBzaXplX2FjdHM7CisJWGtiQWN0aW9uCQkqYWN0czsKKworCVhrYkJlaGF2aW9yCQkqYmVoYXZpb3JzOworCXVuc2lnbmVkIHNob3J0CQkqa2V5X2FjdHM7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorCS8qIGV4cGxpY2l0IGlzIGEgQysrIHJlc2VydmVkIHdvcmQgKi8KKwl1bnNpZ25lZCBjaGFyCQkqY19leHBsaWNpdDsKKyNlbHNlCisJdW5zaWduZWQgY2hhcgkJKmV4cGxpY2l0OworI2VuZGlmCisJdW5zaWduZWQgY2hhcgkJIHZtb2RzW1hrYk51bVZpcnR1YWxNb2RzXTsKKwl1bnNpZ25lZCBzaG9ydAkJKnZtb2RtYXA7Cit9IFhrYlNlcnZlck1hcFJlYywgKlhrYlNlcnZlck1hcFB0cjsKKworI2RlZmluZQlYa2JTTUtleUFjdGlvbnNQdHIobSxrKSAoJihtKS0+YWN0c1sobSktPmtleV9hY3RzW2tdXSkKKworCS8qCisJICogU3RydWN0dXJlcyBhbmQgYWNjZXNzIG1hY3JvcyB1c2VkIHByaW1hcmlseSBieSBjbGllbnRzCisJICovCisKK3R5cGVkZWYJc3RydWN0IF9Ya2JTeW1NYXBSZWMgeworCXVuc2lnbmVkIGNoYXIJIGt0X2luZGV4W1hrYk51bUtiZEdyb3Vwc107CisJdW5zaWduZWQgY2hhcgkgZ3JvdXBfaW5mbzsKKwl1bnNpZ25lZCBjaGFyCSB3aWR0aDsKKwl1bnNpZ25lZCBzaG9ydAkgb2Zmc2V0OworfSBYa2JTeW1NYXBSZWMsICpYa2JTeW1NYXBQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDbGllbnRNYXBSZWMgeworCXVuc2lnbmVkIGNoYXIJCSBzaXplX3R5cGVzOworCXVuc2lnbmVkIGNoYXIJCSBudW1fdHlwZXM7CisJWGtiS2V5VHlwZVB0cgkJIHR5cGVzOworCisJdW5zaWduZWQgc2hvcnQJCSBzaXplX3N5bXM7CisJdW5zaWduZWQgc2hvcnQJCSBudW1fc3ltczsKKwlLZXlTeW0JCQkqc3ltczsKKwlYa2JTeW1NYXBQdHIJCSBrZXlfc3ltX21hcDsKKworCXVuc2lnbmVkIGNoYXIJCSptb2RtYXA7Cit9IFhrYkNsaWVudE1hcFJlYywgKlhrYkNsaWVudE1hcFB0cjsKKworI2RlZmluZQlYa2JDTUtleUdyb3VwSW5mbyhtLGspICAoKG0pLT5rZXlfc3ltX21hcFtrXS5ncm91cF9pbmZvKQorI2RlZmluZQlYa2JDTUtleU51bUdyb3VwcyhtLGspCSAoWGtiTnVtR3JvdXBzKChtKS0+a2V5X3N5bV9tYXBba10uZ3JvdXBfaW5mbykpCisjZGVmaW5lCVhrYkNNS2V5R3JvdXBXaWR0aChtLGssZykgKFhrYkNNS2V5VHlwZShtLGssZyktPm51bV9sZXZlbHMpCisjZGVmaW5lCVhrYkNNS2V5R3JvdXBzV2lkdGgobSxrKSAoKG0pLT5rZXlfc3ltX21hcFtrXS53aWR0aCkKKyNkZWZpbmUJWGtiQ01LZXlUeXBlSW5kZXgobSxrLGcpICgobSktPmtleV9zeW1fbWFwW2tdLmt0X2luZGV4W2cmMHgzXSkKKyNkZWZpbmUJWGtiQ01LZXlUeXBlKG0sayxnKQkgKCYobSktPnR5cGVzW1hrYkNNS2V5VHlwZUluZGV4KG0sayxnKV0pCisjZGVmaW5lCVhrYkNNS2V5TnVtU3ltcyhtLGspIChYa2JDTUtleUdyb3Vwc1dpZHRoKG0saykqWGtiQ01LZXlOdW1Hcm91cHMobSxrKSkKKyNkZWZpbmUJWGtiQ01LZXlTeW1zT2Zmc2V0KG0saykJKChtKS0+a2V5X3N5bV9tYXBba10ub2Zmc2V0KQorI2RlZmluZQlYa2JDTUtleVN5bXNQdHIobSxrKQkoJihtKS0+c3ltc1tYa2JDTUtleVN5bXNPZmZzZXQobSxrKV0pCisKKwkvKgorCSAqIENvbXBhdGliaWxpdHkgc3RydWN0dXJlcyBhbmQgYWNjZXNzIG1hY3JvcworCSAqLworCit0eXBlZGVmIHN0cnVjdCBfWGtiU3ltSW50ZXJwcmV0UmVjIHsKKwlLZXlTeW0JCXN5bTsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJbWF0Y2g7CisJdW5zaWduZWQgY2hhcgltb2RzOworCXVuc2lnbmVkIGNoYXIJdmlydHVhbF9tb2Q7CisJWGtiQW55QWN0aW9uCWFjdDsKK30gWGtiU3ltSW50ZXJwcmV0UmVjLCpYa2JTeW1JbnRlcnByZXRQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wYXRNYXBSZWMgeworCVhrYlN5bUludGVycHJldFB0cgkgc3ltX2ludGVycHJldDsKKwlYa2JNb2RzUmVjCQkgZ3JvdXBzW1hrYk51bUtiZEdyb3Vwc107CisJdW5zaWduZWQgc2hvcnQJCSBudW1fc2k7CisJdW5zaWduZWQgc2hvcnQJCSBzaXplX3NpOworfSBYa2JDb21wYXRNYXBSZWMsICpYa2JDb21wYXRNYXBQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJbmRpY2F0b3JNYXBSZWMgeworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgl3aGljaF9ncm91cHM7CisJdW5zaWduZWQgY2hhcglncm91cHM7CisJdW5zaWduZWQgY2hhcgl3aGljaF9tb2RzOworCVhrYk1vZHNSZWMJbW9kczsKKwl1bnNpZ25lZCBpbnQJY3RybHM7Cit9IFhrYkluZGljYXRvck1hcFJlYywgKlhrYkluZGljYXRvck1hcFB0cjsKKworI2RlZmluZQlYa2JJTV9Jc0F1dG8oaSkJKCgoKGkpLT5mbGFncyZYa2JJTV9Ob0F1dG9tYXRpYyk9PTApJiZcCisJCQkgICAgKCgoaSktPndoaWNoX2dyb3VwcyYmKGkpLT5ncm91cHMpfHxcCisJCQkgICAgICgoaSktPndoaWNoX21vZHMmJihpKS0+bW9kcy5tYXNrKXx8XAorCQkJICAgICAoKGkpLT5jdHJscykpKQorI2RlZmluZQlYa2JJTV9JblVzZShpKQkoKChpKS0+ZmxhZ3MpfHwoKGkpLT53aGljaF9ncm91cHMpfHxcCisJCQkJCSgoaSktPndoaWNoX21vZHMpfHwoKGkpLT5jdHJscykpCisJCisKK3R5cGVkZWYgc3RydWN0IF9Ya2JJbmRpY2F0b3JSZWMgeworCXVuc2lnbmVkIGxvbmcJICAJcGh5c19pbmRpY2F0b3JzOworCVhrYkluZGljYXRvck1hcFJlYwltYXBzW1hrYk51bUluZGljYXRvcnNdOworfSBYa2JJbmRpY2F0b3JSZWMsKlhrYkluZGljYXRvclB0cjsKKwordHlwZWRlZglzdHJ1Y3QgX1hrYktleU5hbWVSZWMgeworCWNoYXIJbmFtZVtYa2JLZXlOYW1lTGVuZ3RoXTsKK30gWGtiS2V5TmFtZVJlYywqWGtiS2V5TmFtZVB0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYktleUFsaWFzUmVjIHsKKwljaGFyCXJlYWxbWGtiS2V5TmFtZUxlbmd0aF07CisJY2hhcglhbGlhc1tYa2JLZXlOYW1lTGVuZ3RoXTsKK30gWGtiS2V5QWxpYXNSZWMsKlhrYktleUFsaWFzUHRyOworCisJLyoKKwkgKiBOYW1lcyBmb3IgZXZlcnl0aGluZyAKKwkgKi8KK3R5cGVkZWYgc3RydWN0IF9Ya2JOYW1lc1JlYyB7CisJQXRvbQkJICBrZXljb2RlczsKKwlBdG9tCQkgIGdlb21ldHJ5OworCUF0b20JCSAgc3ltYm9sczsKKwlBdG9tICAgICAgICAgICAgICB0eXBlczsKKwlBdG9tCQkgIGNvbXBhdDsKKwlBdG9tCQkgIHZtb2RzW1hrYk51bVZpcnR1YWxNb2RzXTsKKwlBdG9tCQkgIGluZGljYXRvcnNbWGtiTnVtSW5kaWNhdG9yc107CisJQXRvbQkJICBncm91cHNbWGtiTnVtS2JkR3JvdXBzXTsKKwlYa2JLZXlOYW1lUHRyCSAga2V5czsKKwlYa2JLZXlBbGlhc1B0cgkgIGtleV9hbGlhc2VzOworCUF0b20JCSAqcmFkaW9fZ3JvdXBzOworCUF0b20JCSAgcGh5c19zeW1ib2xzOworCisJdW5zaWduZWQgY2hhcgkgIG51bV9rZXlzOworCXVuc2lnbmVkIGNoYXIJICBudW1fa2V5X2FsaWFzZXM7CisJdW5zaWduZWQgc2hvcnQJICBudW1fcmc7Cit9IFhrYk5hbWVzUmVjLCpYa2JOYW1lc1B0cjsKKwordHlwZWRlZglzdHJ1Y3QgX1hrYkdlb21ldHJ5CSpYa2JHZW9tZXRyeVB0cjsKKwkvKgorCSAqIFRpZSBpdCBhbGwgdG9nZXRoZXIgaW50byBvbmUgYmlnIGtleWJvYXJkIGRlc2NyaXB0aW9uCisJICovCit0eXBlZGVmCXN0cnVjdCBfWGtiRGVzYyB7CisJc3RydWN0IF9YRGlzcGxheSAqCWRweTsKKwl1bnNpZ25lZCBzaG9ydAkgCWZsYWdzOworCXVuc2lnbmVkIHNob3J0CQlkZXZpY2Vfc3BlYzsKKwlLZXlDb2RlCQkJbWluX2tleV9jb2RlOworCUtleUNvZGUJCQltYXhfa2V5X2NvZGU7CisKKwlYa2JDb250cm9sc1B0cgkJY3RybHM7CisJWGtiU2VydmVyTWFwUHRyCQlzZXJ2ZXI7CisJWGtiQ2xpZW50TWFwUHRyCQltYXA7CisJWGtiSW5kaWNhdG9yUHRyCQlpbmRpY2F0b3JzOworCVhrYk5hbWVzUHRyCQluYW1lczsKKwlYa2JDb21wYXRNYXBQdHIJCWNvbXBhdDsKKwlYa2JHZW9tZXRyeVB0cgkJZ2VvbTsKK30gWGtiRGVzY1JlYywgKlhrYkRlc2NQdHI7CisjZGVmaW5lCVhrYktleUtleVR5cGVJbmRleChkLGssZykJKFhrYkNNS2V5VHlwZUluZGV4KChkKS0+bWFwLGssZykpCisjZGVmaW5lCVhrYktleUtleVR5cGUoZCxrLGcpCQkoWGtiQ01LZXlUeXBlKChkKS0+bWFwLGssZykpCisjZGVmaW5lCVhrYktleUdyb3VwV2lkdGgoZCxrLGcpCQkoWGtiQ01LZXlHcm91cFdpZHRoKChkKS0+bWFwLGssZykpCisjZGVmaW5lCVhrYktleUdyb3Vwc1dpZHRoKGQsaykJCShYa2JDTUtleUdyb3Vwc1dpZHRoKChkKS0+bWFwLGspKQorI2RlZmluZQlYa2JLZXlHcm91cEluZm8oZCxrKQkJKFhrYkNNS2V5R3JvdXBJbmZvKChkKS0+bWFwLChrKSkpCisjZGVmaW5lCVhrYktleU51bUdyb3VwcyhkLGspCQkoWGtiQ01LZXlOdW1Hcm91cHMoKGQpLT5tYXAsKGspKSkKKyNkZWZpbmUJWGtiS2V5TnVtU3ltcyhkLGspCQkoWGtiQ01LZXlOdW1TeW1zKChkKS0+bWFwLChrKSkpCisjZGVmaW5lCVhrYktleVN5bXNQdHIoZCxrKQkJKFhrYkNNS2V5U3ltc1B0cigoZCktPm1hcCwoaykpKQorI2RlZmluZQlYa2JLZXlTeW0oZCxrLG4pCQkoWGtiS2V5U3ltc1B0cihkLGspW25dKQorI2RlZmluZQlYa2JLZXlTeW1FbnRyeShkLGssc2wsZykgXAorCShYa2JLZXlTeW0oZCxrLCgoWGtiS2V5R3JvdXBzV2lkdGgoZCxrKSooZykpKyhzbCkpKSkKKyNkZWZpbmUJWGtiS2V5QWN0aW9uKGQsayxuKSBcCisJKFhrYktleUhhc0FjdGlvbnMoZCxrKT8mWGtiS2V5QWN0aW9uc1B0cihkLGspW25dOk5VTEwpCisjZGVmaW5lCVhrYktleUFjdGlvbkVudHJ5KGQsayxzbCxnKSBcCisJKFhrYktleUhhc0FjdGlvbnMoZCxrKT9cCisJCVhrYktleUFjdGlvbihkLGssKChYa2JLZXlHcm91cHNXaWR0aChkLGspKihnKSkrKHNsKSkpOk5VTEwpCisKKyNkZWZpbmUJWGtiS2V5SGFzQWN0aW9ucyhkLGspCSgoZCktPnNlcnZlci0+a2V5X2FjdHNba10hPTApCisjZGVmaW5lCVhrYktleU51bUFjdGlvbnMoZCxrKQkoWGtiS2V5SGFzQWN0aW9ucyhkLGspP1hrYktleU51bVN5bXMoZCxrKToxKQorI2RlZmluZQlYa2JLZXlBY3Rpb25zUHRyKGQsaykJKFhrYlNNS2V5QWN0aW9uc1B0cigoZCktPnNlcnZlcixrKSkKKyNkZWZpbmUJWGtiS2V5Y29kZUluUmFuZ2UoZCxrKQkoKChrKT49KGQpLT5taW5fa2V5X2NvZGUpJiZcCisJCQkJICgoayk8PShkKS0+bWF4X2tleV9jb2RlKSkKKyNkZWZpbmUJWGtiTnVtS2V5cyhkKQkJKChkKS0+bWF4X2tleV9jb2RlLShkKS0+bWluX2tleV9jb2RlKzEpCisKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGNhbiBiZSB1c2VkIHRvIHRyYWNrIGNoYW5nZXMKKwkgKiB0byBhIGtleWJvYXJkIGRldmljZQorCSAqLwordHlwZWRlZiBzdHJ1Y3QgX1hrYk1hcENoYW5nZXMgeworCXVuc2lnbmVkIHNob3J0CQkgY2hhbmdlZDsKKwlLZXlDb2RlCQkJIG1pbl9rZXlfY29kZTsKKwlLZXlDb2RlCQkJIG1heF9rZXlfY29kZTsKKwl1bnNpZ25lZCBjaGFyCQkgZmlyc3RfdHlwZTsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX3R5cGVzOworCUtleUNvZGUJCQkgZmlyc3Rfa2V5X3N5bTsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX2tleV9zeW1zOworCUtleUNvZGUJCQkgZmlyc3Rfa2V5X2FjdDsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX2tleV9hY3RzOworCUtleUNvZGUJCQkgZmlyc3Rfa2V5X2JlaGF2aW9yOworCXVuc2lnbmVkIGNoYXIJCSBudW1fa2V5X2JlaGF2aW9yczsKKwlLZXlDb2RlIAkJIGZpcnN0X2tleV9leHBsaWNpdDsKKwl1bnNpZ25lZCBjaGFyCQkgbnVtX2tleV9leHBsaWNpdDsKKwlLZXlDb2RlCQkJIGZpcnN0X21vZG1hcF9rZXk7CisJdW5zaWduZWQgY2hhcgkJIG51bV9tb2RtYXBfa2V5czsKKwlLZXlDb2RlCQkJIGZpcnN0X3Ztb2RtYXBfa2V5OworCXVuc2lnbmVkIGNoYXIJCSBudW1fdm1vZG1hcF9rZXlzOworCXVuc2lnbmVkIGNoYXIJCSBwYWQ7CisJdW5zaWduZWQgc2hvcnQJCSB2bW9kczsKK30gWGtiTWFwQ2hhbmdlc1JlYywqWGtiTWFwQ2hhbmdlc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNvbnRyb2xzQ2hhbmdlcyB7CisJdW5zaWduZWQgaW50IAkJIGNoYW5nZWRfY3RybHM7CisJdW5zaWduZWQgaW50CQkgZW5hYmxlZF9jdHJsc19jaGFuZ2VzOworCUJvb2wJCQkgbnVtX2dyb3Vwc19jaGFuZ2VkOworfSBYa2JDb250cm9sc0NoYW5nZXNSZWMsKlhrYkNvbnRyb2xzQ2hhbmdlc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkluZGljYXRvckNoYW5nZXMgeworCXVuc2lnbmVkIGludAkJIHN0YXRlX2NoYW5nZXM7CisJdW5zaWduZWQgaW50CQkgbWFwX2NoYW5nZXM7Cit9IFhrYkluZGljYXRvckNoYW5nZXNSZWMsKlhrYkluZGljYXRvckNoYW5nZXNQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JOYW1lQ2hhbmdlcyB7CisJdW5zaWduZWQgaW50IAkJY2hhbmdlZDsKKwl1bnNpZ25lZCBjaGFyCQlmaXJzdF90eXBlOworCXVuc2lnbmVkIGNoYXIJCW51bV90eXBlczsKKwl1bnNpZ25lZCBjaGFyCQlmaXJzdF9sdmw7CisJdW5zaWduZWQgY2hhcgkJbnVtX2x2bHM7CisJdW5zaWduZWQgY2hhcgkJbnVtX2FsaWFzZXM7CisJdW5zaWduZWQgY2hhcgkJbnVtX3JnOworCXVuc2lnbmVkIGNoYXIJCWZpcnN0X2tleTsKKwl1bnNpZ25lZCBjaGFyCQludW1fa2V5czsKKwl1bnNpZ25lZCBzaG9ydAkJY2hhbmdlZF92bW9kczsKKwl1bnNpZ25lZCBsb25nCQljaGFuZ2VkX2luZGljYXRvcnM7CisJdW5zaWduZWQgY2hhcgkJY2hhbmdlZF9ncm91cHM7Cit9IFhrYk5hbWVDaGFuZ2VzUmVjLCpYa2JOYW1lQ2hhbmdlc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkNvbXBhdENoYW5nZXMgeworCXVuc2lnbmVkIGNoYXIJCWNoYW5nZWRfZ3JvdXBzOworCXVuc2lnbmVkIHNob3J0CQlmaXJzdF9zaTsKKwl1bnNpZ25lZCBzaG9ydAkJbnVtX3NpOworfSBYa2JDb21wYXRDaGFuZ2VzUmVjLCpYa2JDb21wYXRDaGFuZ2VzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ2hhbmdlcyB7CisJdW5zaWduZWQgc2hvcnQJCSBkZXZpY2Vfc3BlYzsKKwl1bnNpZ25lZCBzaG9ydAkJIHN0YXRlX2NoYW5nZXM7CisJWGtiTWFwQ2hhbmdlc1JlYwkgbWFwOworCVhrYkNvbnRyb2xzQ2hhbmdlc1JlYwkgY3RybHM7CisJWGtiSW5kaWNhdG9yQ2hhbmdlc1JlYwkgaW5kaWNhdG9yczsKKwlYa2JOYW1lQ2hhbmdlc1JlYwkgbmFtZXM7CisJWGtiQ29tcGF0Q2hhbmdlc1JlYwkgY29tcGF0OworfSBYa2JDaGFuZ2VzUmVjLCAqWGtiQ2hhbmdlc1B0cjsKKworCS8qCisJICogVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIHRvIGNvbnN0cnVjdCBhIGtleW1hcCBmcm9tIAorCSAqIGEgc2V0IG9mIGNvbXBvbmVudHMgb3IgdG8gbGlzdCBjb21wb25lbnRzIGluIHRoZSBzZXJ2ZXIKKwkgKiBkYXRhYmFzZS4KKwkgKi8KK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wb25lbnROYW1lcyB7CisJY2hhciAqCQkJIGtleW1hcDsKKwljaGFyICoJCQkga2V5Y29kZXM7CisJY2hhciAqCQkJIHR5cGVzOworCWNoYXIgKgkJCSBjb21wYXQ7CisJY2hhciAqCQkJIHN5bWJvbHM7CisJY2hhciAqCQkJIGdlb21ldHJ5OworfSBYa2JDb21wb25lbnROYW1lc1JlYywgKlhrYkNvbXBvbmVudE5hbWVzUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiQ29tcG9uZW50TmFtZSB7CisJdW5zaWduZWQgc2hvcnQJCWZsYWdzOworCWNoYXIgKgkJCW5hbWU7Cit9IFhrYkNvbXBvbmVudE5hbWVSZWMsKlhrYkNvbXBvbmVudE5hbWVQdHI7CisKK3R5cGVkZWYgc3RydWN0IF9Ya2JDb21wb25lbnRMaXN0IHsKKwlpbnQJCQludW1fa2V5bWFwczsKKwlpbnQJCQludW1fa2V5Y29kZXM7CisJaW50CQkJbnVtX3R5cGVzOworCWludAkJCW51bV9jb21wYXQ7CisJaW50CQkJbnVtX3N5bWJvbHM7CisJaW50CQkJbnVtX2dlb21ldHJ5OworCVhrYkNvbXBvbmVudE5hbWVQdHIJa2V5bWFwczsKKwlYa2JDb21wb25lbnROYW1lUHRyIAlrZXljb2RlczsKKwlYa2JDb21wb25lbnROYW1lUHRyCXR5cGVzOworCVhrYkNvbXBvbmVudE5hbWVQdHIJY29tcGF0OworCVhrYkNvbXBvbmVudE5hbWVQdHIJc3ltYm9sczsKKwlYa2JDb21wb25lbnROYW1lUHRyCWdlb21ldHJ5OworfSBYa2JDb21wb25lbnRMaXN0UmVjLCAqWGtiQ29tcG9uZW50TGlzdFB0cjsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZXMgZGVzY3JpYmUgYW5kIHRyYWNrIGNoYW5nZXMgdG8gYSAKKwkgKiBub24ta2V5Ym9hcmQgZXh0ZW5zaW9uIGRldmljZSAKKwkgKi8KK3R5cGVkZWYgc3RydWN0IF9Ya2JEZXZpY2VMZWRJbmZvIHsKKwl1bnNpZ25lZCBzaG9ydAkJCWxlZF9jbGFzczsKKwl1bnNpZ25lZCBzaG9ydAkJCWxlZF9pZDsKKwl1bnNpZ25lZCBpbnQJCQlwaHlzX2luZGljYXRvcnM7CisJdW5zaWduZWQgaW50CQkJbWFwc19wcmVzZW50OworCXVuc2lnbmVkIGludAkJCW5hbWVzX3ByZXNlbnQ7CisJdW5zaWduZWQgaW50CQkJc3RhdGU7CisJQXRvbSAJCQkJbmFtZXNbWGtiTnVtSW5kaWNhdG9yc107CisJWGtiSW5kaWNhdG9yTWFwUmVjCQltYXBzW1hrYk51bUluZGljYXRvcnNdOworfSBYa2JEZXZpY2VMZWRJbmZvUmVjLCpYa2JEZXZpY2VMZWRJbmZvUHRyOworCit0eXBlZGVmIHN0cnVjdCBfWGtiRGV2aWNlSW5mbyB7CisJY2hhciAqCQkJbmFtZTsKKwlBdG9tCQkJdHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJZGV2aWNlX3NwZWM7CisJQm9vbAkJCWhhc19vd25fc3RhdGU7CisJdW5zaWduZWQgc2hvcnQJCXN1cHBvcnRlZDsKKwl1bnNpZ25lZCBzaG9ydAkJdW5zdXBwb3J0ZWQ7CisKKwl1bnNpZ25lZCBzaG9ydAkJbnVtX2J0bnM7CisJWGtiQWN0aW9uICoJCWJ0bl9hY3RzOworCisJdW5zaWduZWQgc2hvcnQJCXN6X2xlZHM7CisJdW5zaWduZWQgc2hvcnQJCW51bV9sZWRzOworCXVuc2lnbmVkIHNob3J0CQlkZmx0X2tiZF9mYjsKKwl1bnNpZ25lZCBzaG9ydAkJZGZsdF9sZWRfZmI7CisJWGtiRGV2aWNlTGVkSW5mb1B0cglsZWRzOworfSBYa2JEZXZpY2VJbmZvUmVjLCpYa2JEZXZpY2VJbmZvUHRyOworCisjZGVmaW5lCVhrYlhJX0Rldkhhc0J0bkFjdHMoZCkJKCgoZCktPm51bV9idG5zPjApJiYoKGQpLT5idG5fYWN0cyE9TlVMTCkpCisjZGVmaW5lCVhrYlhJX0xlZ2FsRGV2QnRuKGQsYikJKFhrYlhJX0Rldkhhc0J0bkFjdHMoZCkmJigoYik8KGQpLT5udW1fYnRucykpCisjZGVmaW5lCVhrYlhJX0Rldkhhc0xlZHMoZCkJKCgoZCktPm51bV9sZWRzPjApJiYoKGQpLT5sZWRzIT1OVUxMKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkRldmljZUxlZENoYW5nZXMgeworCXVuc2lnbmVkIHNob3J0CQlsZWRfY2xhc3M7CisJdW5zaWduZWQgc2hvcnQJCWxlZF9pZDsKKwl1bnNpZ25lZCBpbnQJCWRlZmluZWQ7IC8qIG5hbWVzIG9yIG1hcHMgY2hhbmdlZCAqLworCXN0cnVjdCBfWGtiRGV2aWNlTGVkQ2hhbmdlcyAqbmV4dDsKK30gWGtiRGV2aWNlTGVkQ2hhbmdlc1JlYywqWGtiRGV2aWNlTGVkQ2hhbmdlc1B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX1hrYkRldmljZUNoYW5nZXMgeworCXVuc2lnbmVkIGludAkJY2hhbmdlZDsKKwl1bnNpZ25lZCBzaG9ydAkJZmlyc3RfYnRuOworCXVuc2lnbmVkIHNob3J0CQludW1fYnRuczsKKwlYa2JEZXZpY2VMZWRDaGFuZ2VzUmVjIAlsZWRzOworfSBYa2JEZXZpY2VDaGFuZ2VzUmVjLCpYa2JEZXZpY2VDaGFuZ2VzUHRyOworCisjZW5kaWYgLyogX1hLQlNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YTGJ4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hMYnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQ0NGYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YTGJ4LmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qICRYb3JnOiBYTGJ4LmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IDE5OTIgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTkNELiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTkNELiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIE5DRC4gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIE5DRC4KKyAqIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiAKKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hMYnguaCx2IDEuMyAyMDAyLzEwLzE2IDAxOjU5OjU1IGRhd2VzIEV4cCAkICovCisgCisjaWZuZGVmIF9YTEJYX0hfCisjZGVmaW5lIF9YTEJYX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCisvKgorICogTk9URTogIGFueSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgb3Bjb2RlcyBuZWVkcyB0byBiZSByZWZsZWN0ZWQKKyAqIGluIHRoZSBsYnhDYWNoZWFibGUgYXJyYXkgaW4gWHNlcnZlci9sYngvbGJ4bWFpbi5jCisgKi8KKyAKKyNkZWZpbmUgWF9MYnhRdWVyeVZlcnNpb24JCTAKKyNkZWZpbmUgWF9MYnhTdGFydFByb3h5CQkJMQorI2RlZmluZSBYX0xieFN0b3BQcm94eQkJCTIKKyNkZWZpbmUgWF9MYnhTd2l0Y2gJCQkzCisjZGVmaW5lIFhfTGJ4TmV3Q2xpZW50CQkJNAorI2RlZmluZSBYX0xieENsb3NlQ2xpZW50CQk1CisjZGVmaW5lIFhfTGJ4TW9kaWZ5U2VxdWVuY2UJCTYKKyNkZWZpbmUgWF9MYnhBbGxvd01vdGlvbgkJNworI2RlZmluZSBYX0xieEluY3JlbWVudFBpeGVsCQk4CisjZGVmaW5lIFhfTGJ4RGVsdGEJCQk5CisjZGVmaW5lCVhfTGJ4R2V0TW9kaWZpZXJNYXBwaW5nCQkxMAorI2RlZmluZQlYX0xieEludmFsaWRhdGVUYWcJCTEyCisjZGVmaW5lIFhfTGJ4UG9seVBvaW50CQkJMTMKKyNkZWZpbmUgWF9MYnhQb2x5TGluZQkJCTE0CisjZGVmaW5lIFhfTGJ4UG9seVNlZ21lbnQJCTE1CisjZGVmaW5lIFhfTGJ4UG9seVJlY3RhbmdsZQkJMTYKKyNkZWZpbmUgWF9MYnhQb2x5QXJjCQkJMTcKKyNkZWZpbmUgWF9MYnhGaWxsUG9seQkJCTE4CisjZGVmaW5lIFhfTGJ4UG9seUZpbGxSZWN0YW5nbGUJCTE5CisjZGVmaW5lIFhfTGJ4UG9seUZpbGxBcmMJCTIwCisjZGVmaW5lCVhfTGJ4R2V0S2V5Ym9hcmRNYXBwaW5nCQkyMQorI2RlZmluZQlYX0xieFF1ZXJ5Rm9udAkJCTIyCisjZGVmaW5lCVhfTGJ4Q2hhbmdlUHJvcGVydHkJCTIzCisjZGVmaW5lCVhfTGJ4R2V0UHJvcGVydHkJCTI0CisjZGVmaW5lCVhfTGJ4VGFnRGF0YQkJCTI1CisKKyNkZWZpbmUgWF9MYnhDb3B5QXJlYQkJCTI2CisjZGVmaW5lIFhfTGJ4Q29weVBsYW5lCQkJMjcKKyNkZWZpbmUgWF9MYnhQb2x5VGV4dDgJCQkyOAorI2RlZmluZSBYX0xieFBvbHlUZXh0MTYJCQkyOQorI2RlZmluZSBYX0xieEltYWdlVGV4dDgJCQkzMAorI2RlZmluZSBYX0xieEltYWdlVGV4dDE2CQkzMQorCisjZGVmaW5lIFhfTGJ4UXVlcnlFeHRlbnNpb24JCTMyCisjZGVmaW5lIFhfTGJ4UHV0SW1hZ2UJCQkzMworI2RlZmluZSBYX0xieEdldEltYWdlCQkJMzQKKworI2RlZmluZSBYX0xieEJlZ2luTGFyZ2VSZXF1ZXN0CQkzNQorI2RlZmluZSBYX0xieExhcmdlUmVxdWVzdERhdGEJCTM2CisjZGVmaW5lIFhfTGJ4RW5kTGFyZ2VSZXF1ZXN0CQkzNworCisjZGVmaW5lIFhfTGJ4SW50ZXJuQXRvbXMJCTM4CisjZGVmaW5lIFhfTGJ4R2V0V2luQXR0ckFuZEdlb20JCTM5CisKKyNkZWZpbmUgWF9MYnhHcmFiQ21hcAkJCTQwCisjZGVmaW5lIFhfTGJ4UmVsZWFzZUNtYXAJCTQxCisjZGVmaW5lIFhfTGJ4QWxsb2NDb2xvcgkJCTQyCisKKyNkZWZpbmUgWF9MYnhTeW5jCQkJNDMKKworI2RlZmluZSBMYnhOdW1iZXJSZXFzCQkJNDQKKworCisjZGVmaW5lIExieEV2ZW50CQkJMAorI2RlZmluZSBMYnhRdWlja01vdGlvbkRlbHRhRXZlbnQJMQorI2RlZmluZSBMYnhOdW1iZXJFdmVudHMJCQkyCisKKy8qIFRoaXMgaXMgYWx3YXlzIHRoZSBtYXN0ZXIgY2xpZW50ICovCisjZGVmaW5lIExieE1hc3RlckNsaWVudEluZGV4CQkwCisKKy8qIExieEV2ZW50IGxieFR5cGUgc3ViLWZpZWxkcyAqLworI2RlZmluZSBMYnhTd2l0Y2hFdmVudAkJCTAKKyNkZWZpbmUgTGJ4Q2xvc2VFdmVudAkJCTEKKyNkZWZpbmUgTGJ4RGVsdGFFdmVudAkJCTIKKyNkZWZpbmUgTGJ4SW52YWxpZGF0ZVRhZ0V2ZW50CQkzCisjZGVmaW5lIExieFNlbmRUYWdEYXRhRXZlbnQJCTQKKyNkZWZpbmUgTGJ4TGlzdGVuVG9PbmUJCQk1CisjZGVmaW5lIExieExpc3RlblRvQWxsCQkJNgorI2RlZmluZSBMYnhNb3Rpb25EZWx0YUV2ZW50CQk3CisjZGVmaW5lIExieFJlbGVhc2VDbWFwRXZlbnQJCTgKKyNkZWZpbmUgTGJ4RnJlZUNlbGxzRXZlbnQJCTkKKworLyoKKyAqIExieCBpbWFnZSBjb21wcmVzc2lvbiBtZXRob2RzCisgKgorICogTm8gY29tcHJlc3Npb24gaXMgYWx3YXlzIGFzc2lnbmVkIHRoZSB2YWx1ZSBvZiAwLgorICoKKyAqIFRoZSByZXN0IG9mIHRoZSBjb21wcmVzc2lvbiBtZXRob2Qgb3Bjb2RlcyBhcmUgYXNzaWduZWQgZHluYW1pY2FsbHkKKyAqIGF0IG9wdGlvbiBuZWdvdGlhdGlvbiB0aW1lLgorICovCisKKyNkZWZpbmUgTGJ4SW1hZ2VDb21wcmVzc05vbmUJCTAKKworCisjZGVmaW5lIEJhZExieENsaWVudAkJCTAKKyNkZWZpbmUgTGJ4TnVtYmVyRXJyb3JzCQkJKEJhZExieENsaWVudCArIDEpCisKKy8qIHRhZ2dlZCBkYXRhIHR5cGVzICovCisjZGVmaW5lCUxieFRhZ1R5cGVNb2RtYXAJCTEKKyNkZWZpbmUJTGJ4VGFnVHlwZUtleW1hcAkJMgorI2RlZmluZQlMYnhUYWdUeXBlUHJvcGVydHkJCTMKKyNkZWZpbmUJTGJ4VGFnVHlwZUZvbnQJCQk0CisjZGVmaW5lCUxieFRhZ1R5cGVDb25uSW5mbwkJNQorCisjaWZuZGVmIF9YTEJYX1NFUlZFUl8KKworI2luY2x1ZGUgPFgxMS9YZGVmcy5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYTGJ4UXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiByZXF1ZXN0cCAqLywKKyAgICBpbnQqCQkvKiBldmVudF9iYXNlcCAqLywKKyAgICBpbnQqCQkvKiBlcnJvcl9iYXNlcCAqLworKTsKKworQm9vbCBYTGJ4UXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogbWFqb3JWZXJzaW9uICovLAorICAgIGludCoJCS8qIG1pbm9yVmVyc2lvbiAqLworKTsKKworaW50IFhMYnhHZXRFdmVudEJhc2UoRGlzcGxheSAqZHB5KTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YU2htLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hTaG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUxNGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YU2htLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWFNobS5oLHYgMS4xMSAyMDAzLzA0LzAzIDE1OjExOjA3IGRhd2VzIEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVEhJUyBJUyBOT1QgQU4gWCBDT05TT1JUSVVNIFNUQU5EQVJEIE9SIEFOIFggUFJPSkVDVCBURUFNIFNQRUNJRklDQVRJT04gKi8KKworLyogJFhvcmc6IFhTaG0uaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKworI2lmbmRlZiBfWFNITV9IXworI2RlZmluZSBfWFNITV9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworI2RlZmluZSBYX1NobVF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX1NobUF0dGFjaAkJCTEKKyNkZWZpbmUgWF9TaG1EZXRhY2gJCQkyCisjZGVmaW5lIFhfU2htUHV0SW1hZ2UJCQkzCisjZGVmaW5lIFhfU2htR2V0SW1hZ2UJCQk0CisjZGVmaW5lIFhfU2htQ3JlYXRlUGl4bWFwCQk1CisKKyNkZWZpbmUgU2htQ29tcGxldGlvbgkJCTAKKyNkZWZpbmUgU2htTnVtYmVyRXZlbnRzCQkJKFNobUNvbXBsZXRpb24gKyAxKQorCisjZGVmaW5lIEJhZFNobVNlZwkJCTAKKyNkZWZpbmUgU2htTnVtYmVyRXJyb3JzCQkJKEJhZFNobVNlZyArIDEpCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBTaG1TZWc7CisKKyNpZm5kZWYgX1hTSE1fU0VSVkVSXwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAl0eXBlOwkJICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb21lIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIERyYXdhYmxlIGRyYXdhYmxlOwkgICAgLyogZHJhd2FibGUgb2YgcmVxdWVzdCAqLworICAgIGludCBtYWpvcl9jb2RlOwkgICAgLyogU2htUmVxQ29kZSAqLworICAgIGludCBtaW5vcl9jb2RlOwkgICAgLyogWF9TaG1QdXRJbWFnZSAqLworICAgIFNobVNlZyBzaG1zZWc7CSAgICAvKiB0aGUgU2htU2VnIHVzZWQgaW4gdGhlIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsgICAvKiB0aGUgb2Zmc2V0IGludG8gU2htU2VnIHVzZWQgaW4gdGhlIHJlcXVlc3QgKi8KK30gWFNobUNvbXBsZXRpb25FdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNobVNlZyBzaG1zZWc7CS8qIHJlc291cmNlIGlkICovCisgICAgaW50IHNobWlkOwkJLyoga2VybmVsIGlkICovCisgICAgY2hhciAqc2htYWRkcjsJLyogYWRkcmVzcyBpbiBjbGllbnQgKi8KKyAgICBCb29sIHJlYWRPbmx5OwkvKiBob3cgdGhlIHNlcnZlciBzaG91bGQgYXR0YWNoIGl0ICovCit9IFhTaG1TZWdtZW50SW5mbzsKKworX1hGVU5DUFJPVE9CRUdJTgorCitCb29sIFhTaG1RdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitpbnQgWFNobUdldEV2ZW50QmFzZSgKKyAgICBEaXNwbGF5KiAJCS8qIGRweSAqLworKTsKKworQm9vbCBYU2htUXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogbWFqb3JWZXJzaW9uICovLAorICAgIGludCoJCS8qIG1pbm9yVmVyc2lvbiAqLywKKyAgICBCb29sKgkJLyogc2hhcmVkUGl4bWFwcyAqLworKTsKKworaW50IFhTaG1QaXhtYXBGb3JtYXQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworU3RhdHVzIFhTaG1BdHRhY2goCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8KKyk7CisKK1N0YXR1cyBYU2htRGV0YWNoKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgWFNobVNlZ21lbnRJbmZvKgkvKiBzaG1pbmZvICovCispOworCitTdGF0dXMgWFNobVB1dEltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgRHJhd2FibGUJCS8qIGQgKi8sCisgICAgR0MJCQkvKiBnYyAqLywKKyAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLywKKyAgICBpbnQJCQkvKiBzcmNfeCAqLywKKyAgICBpbnQJCQkvKiBzcmNfeSAqLywKKyAgICBpbnQJCQkvKiBkc3RfeCAqLywKKyAgICBpbnQJCQkvKiBkc3RfeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogc3JjX3dpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfaGVpZ2h0ICovLAorICAgIEJvb2wJCS8qIHNlbmRfZXZlbnQgKi8KKyk7CisKK1N0YXR1cyBYU2htR2V0SW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBYSW1hZ2UqCQkvKiBpbWFnZSAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBwbGFuZV9tYXNrICovCispOworCitYSW1hZ2UgKlhTaG1DcmVhdGVJbWFnZSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8sCisgICAgaW50CQkJLyogZm9ybWF0ICovLAorICAgIGNoYXIqCQkvKiBkYXRhICovLAorICAgIFhTaG1TZWdtZW50SW5mbyoJLyogc2htaW5mbyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLworKTsKKworUGl4bWFwIFhTaG1DcmVhdGVQaXhtYXAoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBjaGFyKgkJLyogZGF0YSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGRlcHRoICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZWxzZSAvKiBfWFNITV9TRVJWRVJfICovCisKKyNpbmNsdWRlICJzY3JlZW5pbnQuaCIKKyNpbmNsdWRlICJwaXhtYXAuaCIKKyNpbmNsdWRlICJnYy5oIgorCitleHRlcm4gdm9pZCBTaG1SZWdpc3RlckZiRnVuY3MoCisgICAgU2NyZWVuUHRyIC8qIHBTY3JlZW4gKi8KKyk7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWFRlc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWFRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIxODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YVGVzdC5oCkBAIC0wLDAgKzEsMTY0IEBACisvKiAkWG9yZzogWFRlc3QuaCx2IDEuNSAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTkyLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YVGVzdC5oLHYgMy4zIDIwMDEvMTIvMTQgMTk6NTM6MjggZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWFRFU1RfSF8KKyNkZWZpbmUgX1hURVNUX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCisjZGVmaW5lIFhfWFRlc3RHZXRWZXJzaW9uCTAKKyNkZWZpbmUgWF9YVGVzdENvbXBhcmVDdXJzb3IJMQorI2RlZmluZSBYX1hUZXN0RmFrZUlucHV0CTIKKyNkZWZpbmUgWF9YVGVzdEdyYWJDb250cm9sCTMKKworI2RlZmluZSBYVGVzdE51bWJlckV2ZW50cwkwCisKKyNkZWZpbmUgWFRlc3ROdW1iZXJFcnJvcnMJMAorCisjZGVmaW5lIFhUZXN0TWFqb3JWZXJzaW9uCTIKKyNkZWZpbmUgWFRlc3RNaW5vclZlcnNpb24JMgorCisjZGVmaW5lIFhUZXN0RXh0ZW5zaW9uTmFtZQkiWFRFU1QiCisKKyNpZm5kZWYgX1hURVNUX1NFUlZFUl8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hJbnB1dC5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWFRlc3RRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIGV2ZW50X2Jhc2VwICovLAorICAgIGludCoJCS8qIGVycm9yX2Jhc2VwICovLAorICAgIGludCoJCS8qIG1ham9ycCAqLywKKyAgICBpbnQqCQkvKiBtaW5vcnAgKi8KKyk7CisKK0Jvb2wgWFRlc3RDb21wYXJlQ3Vyc29yV2l0aFdpbmRvdygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovLAorICAgIEN1cnNvcgkJLyogY3Vyc29yICovCispOworCitCb29sIFhUZXN0Q29tcGFyZUN1cnJlbnRDdXJzb3JXaXRoV2luZG93KAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8KKyk7CisKK2V4dGVybiBpbnQgWFRlc3RGYWtlS2V5RXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyoga2V5Y29kZSAqLywKKyAgICBCb29sCQkvKiBpc19wcmVzcyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGRlbGF5ICovCispOworCitleHRlcm4gaW50IFhUZXN0RmFrZUJ1dHRvbkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICBCb29sCQkvKiBpc19wcmVzcyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGRlbGF5ICovCispOworCitleHRlcm4gaW50IFhUZXN0RmFrZU1vdGlvbkV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50CQkJLyogc2NyZWVuICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGRlbGF5ICovCispOworCitleHRlcm4gaW50IFhUZXN0RmFrZVJlbGF0aXZlTW90aW9uRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQJCQkvKiB4ICovLAorICAgIGludAkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBkZWxheSAqLworKTsKKworZXh0ZXJuIGludCBYVGVzdEZha2VEZXZpY2VLZXlFdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXYgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGtleWNvZGUgKi8sCisgICAgQm9vbAkJLyogaXNfcHJlc3MgKi8sCisgICAgaW50KgkJLyogYXhlcyAqLywKKyAgICBpbnQJCQkvKiBuX2F4ZXMgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBkZWxheSAqLworKTsKKworZXh0ZXJuIGludCBYVGVzdEZha2VEZXZpY2VCdXR0b25FdmVudCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFhEZXZpY2UqCQkvKiBkZXYgKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGJ1dHRvbiAqLywKKyAgICBCb29sCQkvKiBpc19wcmVzcyAqLywKKyAgICBpbnQqCQkvKiBheGVzICovLAorICAgIGludAkJCS8qIG5fYXhlcyAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIGRlbGF5ICovCispOworCitleHRlcm4gaW50IFhUZXN0RmFrZVByb3hpbWl0eUV2ZW50KAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgWERldmljZSoJCS8qIGRldiAqLywKKyAgICBCb29sCQkvKiBpbl9wcm94ICovLAorICAgIGludCoJCS8qIGF4ZXMgKi8sCisgICAgaW50CQkJLyogbl9heGVzICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogZGVsYXkgKi8KKyk7CisKK2V4dGVybiBpbnQgWFRlc3RGYWtlRGV2aWNlTW90aW9uRXZlbnQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBYRGV2aWNlKgkJLyogZGV2ICovLAorICAgIEJvb2wJCS8qIGlzX3JlbGF0aXZlICovLAorICAgIGludAkJCS8qIGZpcnN0X2F4aXMgKi8sCisgICAgaW50KgkJLyogYXhlcyAqLywKKyAgICBpbnQJCQkvKiBuX2F4ZXMgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBkZWxheSAqLworKTsKKworZXh0ZXJuIGludCBYVGVzdEdyYWJDb250cm9sKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQm9vbAkJLyogaW1wZXJ2aW91cyAqLworKTsKKwordm9pZCBYVGVzdFNldEdDb250ZXh0T2ZHQygKKyAgICBHQwkJCS8qIGdjICovLAorICAgIEdDb250ZXh0CQkvKiBnaWQgKi8KKyk7CisKK3ZvaWQgWFRlc3RTZXRWaXN1YWxJRE9mVmlzdWFsKAorICAgIFZpc3VhbCoJCS8qIHZpc3VhbCAqLywKKyAgICBWaXN1YWxJRAkJLyogdmlzdWFsaWQgKi8KKyk7CisKK1N0YXR1cyBYVGVzdERpc2NhcmQoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YVEVTVF9TRVJWRVJfICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YYWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1ZjJiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWGFnLmgsdiAxLjUgMjAwMS8xMi8xNyAyMDo1MjoyNCBkYXdlcyBFeHAgJCAqLworLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisvKiAkWG9yZzogWGFnLmgsdiAxLjUgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisKKyNpZm5kZWYgX1hBR19IXworI2RlZmluZSBfWEFHX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCisjZGVmaW5lIFhfWGFnUXVlcnlWZXJzaW9uCQkwCisjZGVmaW5lIFhfWGFnQ3JlYXRlCQkJMQorI2RlZmluZSBYX1hhZ0Rlc3Ryb3kJCQkyCisjZGVmaW5lIFhfWGFnR2V0QXR0cgkJCTMKKyNkZWZpbmUgWF9YYWdRdWVyeQkJCTQKKyNkZWZpbmUgWF9YYWdDcmVhdGVBc3NvYwkJNQorI2RlZmluZSBYX1hhZ0Rlc3Ryb3lBc3NvYwkJNgorCisjZGVmaW5lIFhhZ0JhZEFwcEdyb3VwCQkJMAorI2RlZmluZSBYYWdOdW1iZXJFcnJvcnMJCQkoWGFnQmFkQXBwR3JvdXAgKyAxKQorCisjZGVmaW5lIFhhZ05zaW5nbGVTY3JlZW4JCTcKKyNkZWZpbmUgWGFnTmRlZmF1bHRSb290CQkJMQorI2RlZmluZSBYYWdOcm9vdFZpc3VhbAkJCTIKKyNkZWZpbmUgWGFnTmRlZmF1bHRDb2xvcm1hcAkJMworI2RlZmluZSBYYWdOYmxhY2tQaXhlbAkJCTQKKyNkZWZpbmUgWGFnTndoaXRlUGl4ZWwJCQk1CisjZGVmaW5lIFhhZ05hcHBHcm91cExlYWRlcgkJNgorCisjaWZuZGVmIF9YQUdfU0VSVkVSXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKwordHlwZWRlZiBYSUQgWEFwcEdyb3VwOworCitCb29sIFhhZ1F1ZXJ5VmVyc2lvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBpbnQqCQkJLyogbWFqb3JfdmVyc2lvbiAqLywKKyAgICBpbnQqCQkJLyogbWlub3JfdmVyc2lvbiAqLworKTsKKworU3RhdHVzIFhhZ0NyZWF0ZUVtYmVkZGVkQXBwbGljYXRpb25Hcm91cCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBWaXN1YWxJRAkJCS8qIHJvb3RfdmlzdWFsICovLAorICAgIENvbG9ybWFwCQkJLyogZGVmYXVsdF9jb2xvcm1hcCAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiBibGFja19waXhlbCAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiB3aGl0ZV9waXhlbCAqLywKKyAgICBYQXBwR3JvdXAqCQkJLyogYXBwX2dyb3VwX3JldHVybiAqLworKTsKKworU3RhdHVzIFhhZ0NyZWF0ZU5vbmVtYmVkZGVkQXBwbGljYXRpb25Hcm91cCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQXBwR3JvdXAqCQkJLyogYXBwX2dyb3VwX3JldHVybiAqLworKTsKKworU3RhdHVzIFhhZ0Rlc3Ryb3lBcHBsaWNhdGlvbkdyb3VwKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhBcHBHcm91cAkJCS8qIGFwcF9ncm91cCAqLworKTsKKworU3RhdHVzIFhhZ0dldEFwcGxpY2F0aW9uR3JvdXBBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhBcHBHcm91cAkJCS8qIGFwcF9ncm91cCAqLywKKyAgICAuLi4KKyk7CisKK1N0YXR1cyBYYWdRdWVyeUFwcGxpY2F0aW9uR3JvdXAoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWElECQkJCS8qIHJlc291cmNlX2Jhc2UgKi8sCisgICAgWEFwcEdyb3VwKgkJCS8qIGFwcF9ncm91cF9yZXQgKi8KKyk7CisKK1N0YXR1cyBYYWdDcmVhdGVBc3NvY2lhdGlvbigKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBXaW5kb3cqCQkJLyogd2luZG93X3JldCAqLywKKyAgICB2b2lkKgkJCS8qIHN5c3RlbV93aW5kb3cgKi8KKyk7CisKK1N0YXR1cyBYYWdEZXN0cm95QXNzb2NpYXRpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkJLyogd2luZG93ICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX1hBR19TRVJWRVJfICovCisKKyNlbmRpZiAvKiBfWEFHX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnc3J2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hhZ3Nydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzUwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hhZ3Nydi5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWGFnc3J2LmgsdiAxLjUgMjAwMy8wNy8xNiAwMTozODoyNCBkYXdlcyBFeHAgJCAqLworLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisvKiAkWG9yZzogWGFnc3J2LmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisKKyNpZm5kZWYgX1hBR1NSVl9IXworI2RlZmluZSBfWEFHU1JWX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiB2b2lkIFhhZ0Nvbm5lY3Rpb25JbmZvKAorICAgIENsaWVudFB0cgkJCS8qIGNsaWVudCAqLywKKyAgICB4Q29ublNldHVwUHJlZml4KioJCS8qIGNvbm5fcHJlZml4ICovLAorICAgIGNoYXIqKgkJCS8qIGNvbm5faW5mbyAqLywKKyAgICBpbnQqCQkJLyogbnVtX3NjcmVlbnMgKi8KKyk7CisKK2V4dGVybiBWaXN1YWxJRCBYYWdSb290VmlzdWFsKAorICAgIENsaWVudFB0cgkJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuIENvbG9ybWFwIFhhZ0RlZmF1bHRDb2xvcm1hcCgKKyAgICBDbGllbnRQdHIJCQkvKiBjbGllbnQgKi8KKyk7CisKK2V4dGVybiBDbGllbnRQdHIgWGFnTGVhZGVyKAorICAgIENsaWVudFB0cgkJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGFnQ2FsbENsaWVudFN0YXRlQ2hhbmdlKAorICAgIENsaWVudFB0cgkJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuIEJvb2wgWGFnSXNDb250cm9sbGVkUm9vdCAoCisgICAgQ2xpZW50UHRyCQkJLyogY2xpZW50ICovLAorICAgIFdpbmRvd1B0cgkJCS8qIHBQYXJlbnQgKi8KKyk7CisKK2V4dGVybiBYSUQgWGFnSWQgKAorICAgIENsaWVudFB0cgkJCS8qIGNsaWVudCAqLworKTsKKworZXh0ZXJuIHZvaWQgWGFnR2V0RGVsdGFJbmZvICgKKyAgICBDbGllbnRQdHIJCQkvKiBjbGllbnQgKi8sCisgICAgQ0FSRDMyKgkJCS8qIGJ1ZiAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YQUdTUlZfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YYWdzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNTUyNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnc3RyLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWGFnc3RyLmgsdiAxLjQgMjAwMS8xMi8xNCAxOTo1MzoyOCBkYXdlcyBFeHAgJCAqLworLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4LCAyMDAxICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisvKiAkWG9yZzogWGFnc3RyLmgsdiAxLjYgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisKKyNpZm5kZWYgX1hBR1NUUl9IXyAvKiB7ICovCisjZGVmaW5lIF9YQUdTVFJfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hhZy5oPgorCisjZGVmaW5lIFhBcHBHcm91cCBDQVJEMzIKKworI2RlZmluZSBYQUdOQU1FICJYQy1BUFBHUk9VUCIKKworI2RlZmluZSBYQUdfTUFKT1JfVkVSU0lPTgkxCS8qIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFhBR19NSU5PUl9WRVJTSU9OCTAKKworI2RlZmluZSBYYWdXaW5kb3dUeXBlWDExCTAKKyNkZWZpbmUgWGFnV2luZG93VHlwZU1hY2ludG9zaAkxCisjZGVmaW5lIFhhZ1dpbmRvd1R5cGVXaW4zMgkyCisjZGVmaW5lIFhhZ1dpbmRvd1R5cGVXaW4xNgkzCisKKy8qCisqIFJlZGVmaW5lIHNvbWUgYmFzaWMgdHlwZXMgdXNlZCBieSBzdHJ1Y3R1cmVzIGRlZmluZWQgaGVyZWluLiAgVGhpcyBhbGxvd3MKKyogYm90aCB0aGUgbGlicmFyeSBhbmQgc2VydmVyIHRvIHZpZXcgY29tbXVuaWNhdGVkIGRhdGEgYXMgMzItYml0IGVudGl0aWVzLAorKiB0aHVzIHByZXZlbnRpbmcgcHJvYmxlbXMgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMgd2hlcmUgbGliWGV4dCBzZWVzIHRoaXMKKyogZGF0YSBhcyA2NCBiaXRzIGFuZCB0aGUgc2VydmVyIHNlZXMgaXQgYXMgMzIgYml0cy4KKyovCisgCisjZGVmaW5lIENvbG9ybWFwIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgV2luZG93IENBUkQzMgorIAordHlwZWRlZiBzdHJ1Y3QgX1hhZ1F1ZXJ5VmVyc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMTYJY2xpZW50X21ham9yX3ZlcnNpb24gQjE2OworICAgIENBUkQxNgljbGllbnRfbWlub3JfdmVyc2lvbiBCMTY7Cit9IHhYYWdRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hYYWdRdWVyeVZlcnNpb25SZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXBhZDE7CisgICAgQ0FSRDE2CXNlcXVlbmNlX251bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXNlcnZlcl9tYWpvcl92ZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJc2VydmVyX21pbm9yX3ZlcnNpb24gQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhYYWdRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeFhhZ1F1ZXJ5VmVyc2lvblJlcGx5CTMyCisKKy8qIFNldCBBcHBHcm91cCBBdHRyaWJ1dGVzIG1hc2tzICovCisjZGVmaW5lIFhhZ1NpbmdsZVNjcmVlbk1hc2sJCTEgPDwgMAorI2RlZmluZSBYYWdEZWZhdWx0Um9vdE1hc2sJCTEgPDwgWGFnTmRlZmF1bHRSb290CisjZGVmaW5lIFhhZ1Jvb3RWaXN1YWxNYXNrCQkxIDw8IFhhZ05yb290VmlzdWFsCisjZGVmaW5lIFhhZ0RlZmF1bHRDb2xvcm1hcE1hc2sJCTEgPDwgWGFnTmRlZmF1bHRDb2xvcm1hcAorI2RlZmluZSBYYWdCbGFja1BpeGVsTWFzawkJMSA8PCBYYWdOYmxhY2tQaXhlbAorI2RlZmluZSBYYWdXaGl0ZVBpeGVsTWFzawkJMSA8PCBYYWdOd2hpdGVQaXhlbAorI2RlZmluZSBYYWdBcHBHcm91cExlYWRlck1hc2sJCTEgPDwgWGFnTmFwcEdyb3VwTGVhZGVyCisKK3R5cGVkZWYgc3RydWN0IF9YYWdDcmVhdGUgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnQ3JlYXRlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWEFwcEdyb3VwCWFwcF9ncm91cCBCMzI7CisgICAgQ0FSRDMyCWF0dHJpYl9tYXNrIEIzMjsgLyogTElTVG9mVkFMVUUgZm9sbG93cyAqLworfSB4WGFnQ3JlYXRlUmVxOworI2RlZmluZSBzel94WGFnQ3JlYXRlUmVxCQkxMgorCit0eXBlZGVmIHN0cnVjdCBfWGFnRGVzdHJveSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhhZ1JlcUNvZGUgKi8KKyAgICBDQVJEOAl4YWdSZXFUeXBlOwkvKiBhbHdheXMgWF9YYWdEZXN0cm95ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWEFwcEdyb3VwCWFwcF9ncm91cCAgQjMyOworfSB4WGFnRGVzdHJveVJlcTsKKyNkZWZpbmUgc3pfeFhhZ0Rlc3Ryb3lSZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgX1hhZ0dldEF0dHIgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYYWdSZXFDb2RlICovCisgICAgQ0FSRDgJeGFnUmVxVHlwZTsJLyogYWx3YXlzIFhfWGFnR2V0QXR0ciAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhBcHBHcm91cAlhcHBfZ3JvdXAgQjMyOworfSB4WGFnR2V0QXR0clJlcTsKKyNkZWZpbmUgc3pfeFhhZ0dldEF0dHJSZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBCT09MCXBhZDE7CisgICAgQ0FSRDE2CXNlcXVlbmNlX251bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgV2luZG93CWRlZmF1bHRfcm9vdCBCMzI7CisgICAgVmlzdWFsSUQJcm9vdF92aXN1YWwgQjMyOworICAgIENvbG9ybWFwCWRlZmF1bHRfY29sb3JtYXAgQjMyOworICAgIENBUkQzMglibGFja19waXhlbCBCMzI7CisgICAgQ0FSRDMyCXdoaXRlX3BpeGVsIEIzMjsKKyAgICBCT09MCXNpbmdsZV9zY3JlZW47CisgICAgQk9PTAlhcHBfZ3JvdXBfbGVhZGVyOworICAgIENBUkQxNglwYWQyIEIxNjsKK30geFhhZ0dldEF0dHJSZXBseTsKKyNkZWZpbmUgc3pfeFhhZ0dldEF0dHJSZXBseQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hhZ1F1ZXJ5IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ1F1ZXJ5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXJlc291cmNlIEIzMjsKK30geFhhZ1F1ZXJ5UmVxOworI2RlZmluZSBzel94WGFnUXVlcnlSZXEJCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIFhBcHBHcm91cAlhcHBfZ3JvdXAgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhYYWdRdWVyeVJlcGx5OworI2RlZmluZSBzel94WGFnUXVlcnlSZXBseQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hhZ0NyZWF0ZUFzc29jIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ0NyZWF0ZUFzc29jICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgV2luZG93CXdpbmRvdyBCMzI7CisgICAgQ0FSRDE2CXdpbmRvd190eXBlIEIxNjsKKyAgICBDQVJEMTYJc3lzdGVtX3dpbmRvd19sZW4gQjE2OyAvKiBMSVNUb2ZDQVJEOCBmb2xsb3dzICovCit9IHhYYWdDcmVhdGVBc3NvY1JlcTsKKyNkZWZpbmUgc3pfeFhhZ0NyZWF0ZUFzc29jUmVxCQkxMgorCit0eXBlZGVmIHN0cnVjdCBfWGFnRGVzdHJveUFzc29jIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGFnUmVxQ29kZSAqLworICAgIENBUkQ4CXhhZ1JlcVR5cGU7CS8qIGFsd2F5cyBYX1hhZ0Rlc3Ryb3lBc3NvYyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworfSB4WGFnRGVzdHJveUFzc29jUmVxOworI2RlZmluZSBzel94WGFnRGVzdHJveUFzc29jUmVxCQk4CisKKyN1bmRlZiBYQXBwR3JvdXAKKy8qCisgKiBDYW5jZWwgdGhlIHByZXZpb3VzIHJlZGVmaW5pdGlvbiBvZiB0aGUgYmFzaWMgdHlwZXMsIHRodXMgcmVzdG9yaW5nIHRoZWlyCisgKiBYLmggZGVmaW5pdGlvbnMuCisgKi8KKworI3VuZGVmIFdpbmRvdworI3VuZGVmIENvbG9ybWFwCisjdW5kZWYgVmlzdWFsSUQKKworI2VuZGlmIC8qIH0gX1hBR1NUUl9IXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hjdXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGN1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGYwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hjdXAuaApAQCAtMCwwICsxLDY5IEBACisvKiAkWG9yZzogWGN1cC5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworLyoKKworQ29weXJpZ2h0IDE5ODcsIDE5ODgsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyovCisvKiAkWEZyZWU4NiQgKi8KKworI2lmbmRlZiBfWENVUF9IXworI2RlZmluZSBfWENVUF9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworI2RlZmluZSBYX1hjdXBRdWVyeVZlcnNpb24JCQkwCisjZGVmaW5lIFhfWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzCTEKKyNkZWZpbmUgWF9YY3VwU3RvcmVDb2xvcnMJCQkyCisKKyNkZWZpbmUgWGN1cE51bWJlckVycm9ycwkJCTAKKworI2lmbmRlZiBfWENVUF9TRVJWRVJfCisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYY3VwUXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludCoJCQkvKiBtYWpvcl92ZXJzaW9uICovLAorICAgIGludCoJCQkvKiBtaW5vcl92ZXJzaW9uICovCispOworCitTdGF0dXMgWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludAkJCQkvKiBzY3JlZW4gKi8sCisgICAgWENvbG9yKioJCQkvKiBjb2xvcnNfb3V0ICovLAorICAgIGludCoJCQkvKiBuY29sb3JzICovCispOworCitTdGF0dXMgWGN1cFN0b3JlQ29sb3JzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkJLyogY29sb3JtYXAgKi8sCisgICAgWENvbG9yKgkJCS8qIGNvbG9ycyAqLywKKyAgICBpbnQJCQkJLyogbmNvbG9ycyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YQ1VQX1NFUlZFUl8gKi8KKworI2VuZGlmIC8qIF9YQ1VQX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGN1cHN0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YY3Vwc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyMWMzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGN1cHN0ci5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiAkWG9yZzogWGN1cHN0ci5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworCisvKgorCitDb3B5cmlnaHQgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWGN1cHN0ci5oLHYgMy41IDIwMDEvMDgvMDEgMDA6NDQ6MzUgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1hDVVBTVFJfSF8gLyogeyAqLworI2RlZmluZSBfWENVUFNUUl9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWGN1cC5oPgorCisjZGVmaW5lIFhDVVBOQU1FICJUT0ctQ1VQIgorCisjZGVmaW5lIFhDVVBfTUFKT1JfVkVSU0lPTgkxCS8qIGN1cnJlbnQgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFhDVVBfTUlOT1JfVkVSU0lPTgkwCisKK3R5cGVkZWYgc3RydWN0IF9YY3VwUXVlcnlWZXJzaW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgWGN1cFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4Y3VwUmVxVHlwZTsJLyogYWx3YXlzIFhfWGN1cFF1ZXJ5VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgljbGllbnRfbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CWNsaWVudF9taW5vcl92ZXJzaW9uIEIxNjsKK30geFhjdXBRdWVyeVZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hYY3VwUXVlcnlWZXJzaW9uUmVxCQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglzZXJ2ZXJfbWFqb3JfdmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CXNlcnZlcl9taW5vcl92ZXJzaW9uIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4WGN1cFF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94WGN1cFF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9YY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXMgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYY3VwUmVxQ29kZSAqLworICAgIENBUkQ4CXhjdXBSZXFUeXBlOwkvKiBhbHdheXMgWF9YY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJc2NyZWVuIEIzMjsKK30geFhjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllc1JlcTsKKyNkZWZpbmUgc3pfeFhjdXBHZXRSZXNlcnZlZENvbG9ybWFwRW50cmllc1JlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlwYWQxOworICAgIENBUkQxNglzZXF1ZW5jZV9udW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7CisgICAgQ0FSRDMyCXBhZDcgQjMyOworfSB4WGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzUmVwbHk7CisjZGVmaW5lIHN6X3hYY3VwR2V0UmVzZXJ2ZWRDb2xvcm1hcEVudHJpZXNSZXBseQkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1hjdXBTdG9yZUNvbG9ycyB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhjdXBSZXFDb2RlICovCisgICAgQ0FSRDgJeGN1cFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hjdXBTdG9yZUNvbG9ycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgljbWFwIEIzMjsKK30geFhjdXBTdG9yZUNvbG9yc1JlcTsKKyNkZWZpbmUgc3pfeFhjdXBTdG9yZUNvbG9yc1JlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIEJPT0wJcGFkMTsKKyAgICBDQVJEMTYJc2VxdWVuY2VfbnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworICAgIENBUkQzMglwYWQ3IEIzMjsKK30geFhjdXBTdG9yZUNvbG9yc1JlcGx5OworI2RlZmluZSBzel94WGN1cFN0b3JlQ29sb3JzUmVwbHkJMzIKKworI2VuZGlmIC8qIH0gX1hDVVBTVFJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZGJlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hkYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTIwNWEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZGJlLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qICRYb3JnOiBYZGJlLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqIAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgSEVXTEVUVC1QQUNLQVJEIENPTVBBTlkgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKiAKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBIZXdsZXR0LVBhY2thcmQKKyAqIENvbXBhbnkgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkuCisgKiAKKyAqICAgICBIZWFkZXIgZmlsZSBmb3IgWGxpYi1yZWxhdGVkIERCRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWGRiZS5oLHYgMy4yIDIwMDEvMDgvMDEgMDA6NDQ6MzUgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgWERCRV9ICisjZGVmaW5lIFhEQkVfSAorCisKKy8qIElOQ0xVREVTICovCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hkYmVwcm90by5oPgorCisKKy8qIERFRklORVMgKi8KKworLyogRXJyb3JzICovCisjZGVmaW5lIFhkYmVCYWRCdWZmZXIgICAgMAorCisKKy8qIFRZUEVERUZTICovCisKK3R5cGVkZWYgRHJhd2FibGUgWGRiZUJhY2tCdWZmZXI7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBYZGJlU3dhcEFjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBXaW5kb3cJCXN3YXBfd2luZG93OyAgICAvKiB3aW5kb3cgZm9yIHdoaWNoIHRvIHN3YXAgYnVmZmVycyAgICovCisgICAgWGRiZVN3YXBBY3Rpb24Jc3dhcF9hY3Rpb247ICAgIC8qIHN3YXAgYWN0aW9uIHRvIHVzZSBmb3Igc3dhcF93aW5kb3cgKi8KK30KK1hkYmVTd2FwSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBXaW5kb3cJd2luZG93OwkJCS8qIHdpbmRvdyB0aGF0IGJ1ZmZlciBiZWxvbmdzIHRvICovCit9CitYZGJlQmFja0J1ZmZlckF0dHJpYnV0ZXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CQkJdHlwZTsKKyAgICBEaXNwbGF5CQkqZGlzcGxheTsJLyogZGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhkYmVCYWNrQnVmZmVyCWJ1ZmZlcjsJCS8qIHJlc291cmNlIGlkICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nCXNlcmlhbDsJCS8qIHNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyCWVycm9yX2NvZGU7CS8qIGVycm9yIGJhc2UgKyBYZGJlQmFkQnVmZmVyICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyCXJlcXVlc3RfY29kZTsJLyogbWFqb3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICAqLworICAgIHVuc2lnbmVkIGNoYXIJbWlub3JfY29kZTsJLyogbWlub3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICAqLworfQorWGRiZUJ1ZmZlckVycm9yOworCisvKiBfWEZVTkNQUk9UT0JFR0lOIGFuZCBfWEZVTkNQUk9UT0VORCBhcmUgZGVmaW5lZCBhcyBub29wcworICogKGZvciBub24tQysrIGJ1aWxkcykgaW4gWDExL1hmdW5jcHJvdG8uaC4KKyAqLworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gU3RhdHVzIFhkYmVRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgICAgICAgICAgKi8sCisgICAgaW50KgkJLyogbWFqb3JfdmVyc2lvbl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogbWlub3JfdmVyc2lvbl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBYZGJlQmFja0J1ZmZlciBYZGJlQWxsb2NhdGVCYWNrQnVmZmVyTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgICAgICAqLywKKyAgICBYZGJlU3dhcEFjdGlvbgkvKiBzd2FwX2FjdGlvbiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYZGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgKi8sCisgICAgWGRiZUJhY2tCdWZmZXIJLyogYnVmZmVyICovCispOworCitleHRlcm4gU3RhdHVzIFhkYmVTd2FwQnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgKi8sCisgICAgWGRiZVN3YXBJbmZvKgkvKiBzd2FwX2luZm8gICAqLywKKyAgICBpbnQJCQkvKiBudW1fd2luZG93cyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYZGJlQmVnaW5JZGlvbSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitleHRlcm4gU3RhdHVzIFhkYmVFbmRJZGlvbSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitleHRlcm4gWGRiZVNjcmVlblZpc3VhbEluZm8gKlhkYmVHZXRWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgICAgICAgICAgICAqLywKKyAgICBEcmF3YWJsZSoJCS8qIHNjcmVlbl9zcGVjaWZpZXJzICovLAorICAgIGludCoJCS8qIG51bV9zY3JlZW5zICAgICAgICovCispOworCitleHRlcm4gdm9pZCBYZGJlRnJlZVZpc3VhbEluZm8oCisgICAgWGRiZVNjcmVlblZpc3VhbEluZm8qCS8qIHZpc3VhbF9pbmZvICovCispOworCitleHRlcm4gWGRiZUJhY2tCdWZmZXJBdHRyaWJ1dGVzICpYZGJlR2V0QmFja0J1ZmZlckF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAqLywKKyAgICBYZGJlQmFja0J1ZmZlcgkvKiBidWZmZXIgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBYREJFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZGJlcHJvdG8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZXByb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4YzU1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZXByb3RvLmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qICRYb3JnOiBYZGJlcHJvdG8uaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1ICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqIAorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIEhld2xldHQtUGFja2FyZAorICogQ29tcGFueSBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueS4KKyAqIAorICogICAgIEhlYWRlciBmaWxlIGZvciBYbGliLXJlbGF0ZWQgREJFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgWERCRV9QUk9UT19ICisjZGVmaW5lIFhEQkVfUFJPVE9fSAorCisvKiBJTkNMVURFUyAqLworCisKKy8qIERFRklORVMgKi8KKworLyogVmFsdWVzIGZvciBzd2FwX2FjdGlvbiBmaWVsZCBvZiBYZGJlU3dhcEluZm8gc3RydWN0dXJlICovCisjZGVmaW5lIFhkYmVVbmRlZmluZWQgICAgMAorI2RlZmluZSBYZGJlQmFja2dyb3VuZCAgIDEKKyNkZWZpbmUgWGRiZVVudG91Y2hlZCAgICAyCisjZGVmaW5lIFhkYmVDb3BpZWQgICAgICAgMworCisjaWZkZWYgTkVFRF9EQkVfUFJPVE9DT0wKKworI2RlZmluZSBEQkVfUFJPVE9DT0xfTkFNRSAiRE9VQkxFLUJVRkZFUiIKKworLyogQ3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgREJFX01BSk9SX1ZFUlNJT04gICAgICAgMQorI2RlZmluZSBEQkVfTUlOT1JfVkVSU0lPTiAgICAgICAwCisKKy8qIFVzZWQgd2hlbiBhZGRpbmcgZXh0ZW5zaW9uOyBhbHNvIHVzZWQgaW4gWGRiZSBtYWNyb3MgKi8KKyNkZWZpbmUgRGJlTnVtYmVyRXZlbnRzCQkJMAorI2RlZmluZSBEYmVCYWRCdWZmZXIJCQkwCisjZGVmaW5lIERiZU51bWJlckVycm9ycwkJCShEYmVCYWRCdWZmZXIgKyAxKQorCisvKiBSZXF1ZXN0IHZhbHVlcyB1c2VkIGluIChTKVByb2NEYmVEaXNwYXRjaCgpICovCisjZGVmaW5lIFhfRGJlR2V0VmVyc2lvbiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBYX0RiZUFsbG9jYXRlQmFja0J1ZmZlck5hbWUgICAgIDEKKyNkZWZpbmUgWF9EYmVEZWFsbG9jYXRlQmFja0J1ZmZlck5hbWUgICAyCisjZGVmaW5lIFhfRGJlU3dhcEJ1ZmZlcnMgICAgICAgICAgICAgICAgMworI2RlZmluZSBYX0RiZUJlZ2luSWRpb20gICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWF9EYmVFbmRJZGlvbSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFhfRGJlR2V0VmlzdWFsSW5mbyAgICAgICAgICAgICAgNgorI2RlZmluZSBYX0RiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzICAgIDcKKwordHlwZWRlZiBDQVJEOCAgeERiZVN3YXBBY3Rpb247Cit0eXBlZGVmIENBUkQzMiB4RGJlQmFja0J1ZmZlcjsKKworI2VuZGlmIC8qIE5FRURfREJFX1BST1RPQ09MICovCisKKworLyogVFlQRURFRlMgKi8KKworLyogQ2xpZW50IGRhdGEgdHlwZXMgKi8KKworLyogWGRiZVZpc3VhbEluZm8gYW5kIFhkYmVTY3JlZW5WaXN1YWxJbmZvIGFyZSBkZWZpbmVkIGluIHRoaXMgZmlsZSwKKyAqICJYZGJlcHJvdG8uaCIsIHJhdGhlciB0aGFuICJYZGJlLmgiIGJlY2F1c2UgdGhlIHNlcnZlciB1c2VzIHRoZXNlIGRhdGEKKyAqIHR5cGVzLgorICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVmlzdWFsSUQgICAgdmlzdWFsOyAgICAvKiBvbmUgdmlzdWFsIElEIHRoYXQgc3VwcG9ydHMgZG91YmxlLWJ1ZmZlcmluZyAqLworICAgIGludCAgICAgICAgIGRlcHRoOyAgICAgLyogZGVwdGggb2YgdmlzdWFsIGluIGJpdHMgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgICBwZXJmbGV2ZWw7IC8qIHBlcmZvcm1hbmNlIGxldmVsIG9mIHZpc3VhbCAgICAgICAgICAgICAgICAgICovCit9CitYZGJlVmlzdWFsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNvdW50OyAgICAgICAgICAvKiBudW1iZXIgb2YgaXRlbXMgaW4gdmlzdWFsX2RlcHRoICAgKi8KKyAgICBYZGJlVmlzdWFsSW5mbyAgICAgICp2aXNpbmZvOyAgICAgICAvKiBsaXN0IG9mIHZpc3VhbHMgJiBkZXB0aHMgZm9yIHNjcm4gKi8KK30KK1hkYmVTY3JlZW5WaXN1YWxJbmZvOworCisvKiBQcm90b2NvbCBkYXRhIHR5cGVzICovCisKKyNpZmRlZiBORUVEX0RCRV9QUk9UT0NPTAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQzMgkJd2luZG93IEIzMjsJLyogd2luZG93ICAgICAgKi8KKyAgICB4RGJlU3dhcEFjdGlvbglzd2FwQWN0aW9uOwkvKiBzd2FwIGFjdGlvbiAqLworICAgIENBUkQ4CQlwYWQxOwkJLyogdW51c2VkICAgICAgKi8KKyAgICBDQVJEMTYJCXBhZDIgQjE2OworCit9IHhEYmVTd2FwSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEMzIJdmlzdWFsSUQgQjMyOwkvKiBhc3NvY2lhdGVkIHZpc3VhbCAgICAgICovCisgICAgQ0FSRDgJZGVwdGg7CQkvKiBkZXB0aCBvZiB2aXN1YWwgICAgICAgICovCisgICAgQ0FSRDgJcGVyZkxldmVsOwkvKiBwZXJmb3JtYW5jZSBsZXZlbCBoaW50ICovCisgICAgQ0FSRDE2CXBhZDEgQjE2OworCit9IHhEYmVWaXNJbmZvOworI2RlZmluZSBzel94RGJlVmlzSW5mbwk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDMyCW4gQjMyOwkvKiBudW1iZXIgb2YgdmlzdWFsIGluZm8gaXRlbXMgaW4gbGlzdCAgKi8KKworfSB4RGJlU2NyZWVuVmlzSW5mbzsJLyogZm9sbG93ZWQgYnkgbiB4RGJlVmlzSW5mbyBpdGVtcyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiB3aW5kb3cgKi8KKworfSB4RGJlQnVmZmVyQXR0cmlidXRlczsKKworCisvKiBSZXF1ZXN0cyBhbmQgcmVwbGllcyAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZUdldFZlcnNpb24gKDApICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMikgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOAltYWpvclZlcnNpb247CS8qIGNsaWVudC1tYWpvci12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEOAltaW5vclZlcnNpb247CS8qIGNsaWVudC1taW5vci12ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYJdW51c2VkIEIxNjsJLyogdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IHhEYmVHZXRWZXJzaW9uUmVxOworI2RlZmluZSBzel94RGJlR2V0VmVyc2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURQl0eXBlOwkJCS8qIFJlcGx5OiBYX1JlcGx5ICgxKSAgICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIHVudXNlZCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsJLyogc2VxdWVuY2UgbnVtYmVyICAgICAgKi8KKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsJCS8qIHJlcGx5IGxlbmd0aDogKDApICAgICovCisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOwkJLyogc2VydmVyLW1ham9yLXZlcnNpb24gKi8KKyAgICBDQVJEOAltaW5vclZlcnNpb247CQkvKiBzZXJ2ZXItbWlub3ItdmVyc2lvbiAqLworICAgIENBUkQxNglwYWQxIEIxNjsJCS8qIHVudXNlZCAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKworfSB4RGJlR2V0VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94RGJlR2V0VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDgJCXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CQlkYmVSZXFUeXBlOwkvKiBYX0RiZUFsbG9jYXRlQmFja0J1ZmZlck5hbWUgKDEpICAgKi8KKyAgICBDQVJEMTYJCWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoNCkgICAgICAgICAgICAgICAqLworICAgIENBUkQzMgkJd2luZG93IEIzMjsJLyogd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgeERiZUJhY2tCdWZmZXIJYnVmZmVyIEIzMjsJLyogYmFjayBidWZmZXIgbmFtZSAgICAgICAgICAgICAgICAgICovCisgICAgeERiZVN3YXBBY3Rpb24Jc3dhcEFjdGlvbjsJLyogc3dhcCBhY3Rpb24gaGludCAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDgJCXBhZDE7CQkvKiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDQVJEMTYJCXBhZDIgQjE2OworCit9IHhEYmVBbGxvY2F0ZUJhY2tCdWZmZXJOYW1lUmVxOworI2RlZmluZSBzel94RGJlQWxsb2NhdGVCYWNrQnVmZmVyTmFtZVJlcQkxNgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CQlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAkJZGJlUmVxVHlwZTsJLyogWF9EYmVEZWFsbG9jYXRlQmFja0J1ZmZlck5hbWUgKDIpICovCisgICAgQ0FSRDE2CQlsZW5ndGggQjE2OwkvKiByZXF1ZXN0IGxlbmd0aDogKDIpICAgICAgICAgICAgICAgKi8KKyAgICB4RGJlQmFja0J1ZmZlcglidWZmZXIgQjMyOwkvKiBiYWNrIGJ1ZmZlciBuYW1lICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lUmVxOworI2RlZmluZSBzel94RGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBtYWpvci1vcGNvZGU6IGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICAqLworICAgIENBUkQ4CWRiZVJlcVR5cGU7CS8qIG1pbm9yLW9wY29kZTogYWx3YXlzIFhfRGJlU3dhcEJ1ZmZlcnMgKDMpICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMisybikgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCW4gQjMyOwkJLyogbiwgbnVtYmVyIG9mIHdpbmRvdy9zd2FwIGFjdGlvbiBwYWlycyAgICAgKi8KKworfSB4RGJlU3dhcEJ1ZmZlcnNSZXE7CQkvKiBmb2xsb3dlZCBieSBuIHdpbmRvdy9zd2FwIGFjdGlvbiBwYWlycyAgICAqLworI2RlZmluZSBzel94RGJlU3dhcEJ1ZmZlcnNSZXEJOAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZUJlZ2luSWRvbSAoNCkgICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMSkgICAgICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlQmVnaW5JZGlvbVJlcTsKKyNkZWZpbmUgc3pfeERiZUJlZ2luSWRpb21SZXEJNAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CXJlcVR5cGU7CS8qIG1ham9yLW9wY29kZTogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAlkYmVSZXFUeXBlOwkvKiBtaW5vci1vcGNvZGU6IGFsd2F5cyBYX0RiZUVuZElkb20gKDUpICAgICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMSkgICAgICAgICAgICAgICAgICAgICAgKi8KKworfSB4RGJlRW5kSWRpb21SZXE7CisjZGVmaW5lIHN6X3hEYmVFbmRJZGlvbVJlcQk0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgICAgICovCisgICAgQ0FSRDgJZGJlUmVxVHlwZTsJLyogYWx3YXlzIFhfRGJlR2V0VmlzdWFsSW5mbyAoNikgICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CS8qIHJlcXVlc3QgbGVuZ3RoOiAoMituKSAgICAgICAgICAqLworICAgIENBUkQzMgluIEIzMjsJCS8qIG4sIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gbGlzdCAqLworCit9IHhEYmVHZXRWaXN1YWxJbmZvUmVxOwkJLyogZm9sbG93ZWQgYnkgbiBkcmF3YWJsZXMgICAgICAgICovCisjZGVmaW5lIHN6X3hEYmVHZXRWaXN1YWxJbmZvUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCWVRFCXR5cGU7CQkJLyogUmVwbHk6IFhfUmVwbHkgKDEpICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CS8qIHNlcXVlbmNlIG51bWJlciAgICAgICAgICAgICAgICAgICAqLworICAgIENBUkQzMglsZW5ndGggQjMyOwkJLyogcmVwbHkgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCW07CQkJLyogbSwgbnVtYmVyIG9mIHZpc3VhbCBpbmZvcyBpbiBsaXN0ICovCisgICAgQ0FSRDMyCXBhZDEgQjMyOwkJLyogdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworCit9IHhEYmVHZXRWaXN1YWxJbmZvUmVwbHk7CQkvKiBmb2xsb3dlZCBieSBtIHZpc3VhbCBpbmZvcyAgICAgICAgKi8KKyNkZWZpbmUgc3pfeERiZUdldFZpc3VhbEluZm9SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIENBUkQ4CQlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAgICAgICAqLworICAgIENBUkQ4CQlkYmVSZXFUeXBlOwkvKiBYX0RiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzICg3KSAqLworICAgIENBUkQxNgkJbGVuZ3RoIEIxNjsJLyogcmVxdWVzdCBsZW5ndGg6ICgyKSAgICAgICAgICAgICAgKi8KKyAgICB4RGJlQmFja0J1ZmZlcglidWZmZXIgQjMyOwkvKiBiYWNrIGJ1ZmZlciBuYW1lICAgICAgICAgICAgICAgICAqLworCit9IHhEYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlc1JlcTsKKyNkZWZpbmUgc3pfeERiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCWVRFCXR5cGU7CQkJLyogUmVwbHk6IFhfUmVwbHkgKDEpICovCisgICAgQ0FSRDgJdW51c2VkOwkJCS8qIHVudXNlZCAgICAgICAgICAgICAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CS8qIHNlcXVlbmNlIG51bWJlciAgICAqLworICAgIENBUkQzMglsZW5ndGggQjMyOwkJLyogcmVwbHkgbGVuZ3RoOiAoMCkgICovCisgICAgQ0FSRDMyCWF0dHJpYnV0ZXM7CQkvKiBhdHRyaWJ1dGVzICAgICAgICAgKi8KKyAgICBDQVJEMzIJcGFkMSBCMzI7CQkvKiB1bnVzZWQgICAgICAgICAgICAgKi8KKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisKK30geERiZUdldEJhY2tCdWZmZXJBdHRyaWJ1dGVzUmVwbHk7CisjZGVmaW5lIHN6X3hEYmVHZXRCYWNrQnVmZmVyQXR0cmlidXRlc1JlcGx5CTMyCisKKyNlbmRpZiAvKiBORUVEX0RCRV9QUk9UT0NPTCAqLworCisjZW5kaWYgLyogWERCRV9QUk9UT19IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2MmM4YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGV4dC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiAkWG9yZzogWGV4dC5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJAorICoKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hleHQuaCx2IDEuNCAyMDAxLzEyLzE0IDE5OjUzOjI4IGRhd2VzIEV4cCAkICovCisKKyNpZm5kZWYgX1hFWFRfSF8KKyNkZWZpbmUgX1hFWFRfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIGludCAoKlhTZXRFeHRlbnNpb25FcnJvckhhbmRsZXIoCisgICAgaW50ICgqaGFuZGxlcikoCisJCSAgIERpc3BsYXkgKiwKKwkJICAgY2hhciAqLAorCQkgICBjaGFyICoKKwkJICAgKQorKSkoCisJCSAgIERpc3BsYXkgKiwKKwkJICAgY2hhciAqLAorCQkgICBjaGFyICoKKyk7CisKK2V4dGVybiBpbnQgWE1pc3NpbmdFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGV4dF9uYW1lICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZGVmaW5lIFhfRVhURU5TSU9OX1VOS05PV04gInVua25vd24iCisjZGVmaW5lIFhfRVhURU5TSU9OX01JU1NJTkcgIm1pc3NpbmciCisKKyNlbmRpZiAvKiBfWEVYVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2RwbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU1ZjRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zLmgKQEAgLTAsMCArMSw2NyBAQAorLyogJFhvcmc6IGRwbXMuaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgKGMpIDE5OTYgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMsIElOQ0xVRElORywgCitCVVQgTk9UIExJTUlURUQgVE8gQ09OU0VRVUVOVElBTCBPUiBJTkNJREVOVEFMIERBTUFHRVMsIE9SIE9USEVSIExJQUJJTElUWSwgCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIAorSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gCitzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyCitkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gRGlnaXRhbCAKK0VxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9kcG1zLmgsdiAzLjQgMjAwMC8wMy8xNSAxNjo1MTo1MSB0c2kgRXhwICQgKi8KKworI2lmbmRlZiBfWDExX0VYVEVOU0lPTlNfRFBNU19ICisjZGVmaW5lIF9YMTFfRVhURU5TSU9OU19EUE1TX0ggMQorCisvKgorICogSElTVE9SWQorICovCisvKgorICogQCgjKVJDU2ZpbGU6IGRwbXMuaCx2IFJldmlzaW9uOiAxLjEuNC4yICAoREVDKSBEYXRlOiAxOTk1LzExLzIxIDE5OjM0OjE3CisgKi8KKworCisjZGVmaW5lIERQTVNNb2RlT24JMAorI2RlZmluZSBEUE1TTW9kZVN0YW5kYnkJMQorI2RlZmluZSBEUE1TTW9kZVN1c3BlbmQJMgorI2RlZmluZSBEUE1TTW9kZU9mZgkzCisKKyNpZm5kZWYgRFBNU19TRVJWRVIKKworI2luY2x1ZGUgPFgxMS9YLmg+CisjaW5jbHVkZSA8WDExL1htZC5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIERQTVNRdWVyeUV4dGVuc2lvbihEaXNwbGF5ICosIGludCAqLCBpbnQgKik7CitleHRlcm4gU3RhdHVzIERQTVNHZXRWZXJzaW9uKERpc3BsYXkgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBCb29sIERQTVNDYXBhYmxlKERpc3BsYXkgKik7CitleHRlcm4gU3RhdHVzIERQTVNTZXRUaW1lb3V0cyhEaXNwbGF5ICosIENBUkQxNiwgQ0FSRDE2LCBDQVJEMTYpOworZXh0ZXJuIEJvb2wgRFBNU0dldFRpbWVvdXRzKERpc3BsYXkgKiwgQ0FSRDE2ICosIENBUkQxNiAqLCBDQVJEMTYgKik7CitleHRlcm4gU3RhdHVzIERQTVNFbmFibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0Rpc2FibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0ZvcmNlTGV2ZWwoRGlzcGxheSAqLCBDQVJEMTYpOworZXh0ZXJuIFN0YXR1cyBEUE1TSW5mbyhEaXNwbGF5ICosIENBUkQxNiAqLCBCT09MICopOworCitfWEZVTkNQUk9UT0VORAorI2VuZGlmIC8qICFEUE1TX1NFUlZFUiAqLworI2VuZGlmIC8qICFfWDExX0VYVEVOU0lPTlNfRFBNU19IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtc3N0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4NmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtc3N0ci5oCkBAIC0wLDAgKzEsMTg2IEBACisvKiAkWG9yZzogZHBtc3N0ci5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAoYykgMTk5NiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKK2luIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKK3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUuCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUywgSU5DTFVESU5HLCAKK0JVVCBOT1QgTElNSVRFRCBUTyBDT05TRVFVRU5USUFMIE9SIElOQ0lERU5UQUwgREFNQUdFUywgT1IgT1RIRVIgTElBQklMSVRZLCAKK1dIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgCitJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiAKK3NoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIKK2RlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBEaWdpdGFsIAorRXF1aXBtZW50IENvcnBvcmF0aW9uLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NiQgKi8KKworLyoKKyAqIEhJU1RPUlkKKyAqLworLyoKKyAqIEAoIylSQ1NmaWxlOiBkcG1zc3RyLmgsdiBSZXZpc2lvbjogMS4xLjQuMiAgKERFQykgRGF0ZTogMTk5NS8xMS8yMSAxOTozNDoxOQorICovCisKKyNpZm5kZWYgX0RQTVNTVFJfSF8KKyNkZWZpbmUgX0RQTVNTVFJfSF8KKworI2RlZmluZSBYX0RQTVNHZXRWZXJzaW9uCTAKKyNkZWZpbmUgWF9EUE1TQ2FwYWJsZQkJMQorI2RlZmluZSBYX0RQTVNHZXRUaW1lb3V0cwkyCisjZGVmaW5lIFhfRFBNU1NldFRpbWVvdXRzCTMKKyNkZWZpbmUgWF9EUE1TRW5hYmxlCQk0CisjZGVmaW5lIFhfRFBNU0Rpc2FibGUJCTUKKyNkZWZpbmUgWF9EUE1TRm9yY2VMZXZlbCAgICAgICAJNgorI2RlZmluZSBYX0RQTVNJbmZvICAgICAgIAk3CisKKyNkZWZpbmUgRFBNU051bWJlckV2ZW50cwkwCisKKyNkZWZpbmUgRFBNU051bWJlckVycm9ycwkwCisKKyNkZWZpbmUgRFBNU01ham9yVmVyc2lvbgkxCisjZGVmaW5lIERQTVNNaW5vclZlcnNpb24JMQorCisjZGVmaW5lIERQTVNFeHRlbnNpb25OYW1lCSJEUE1TIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNHZXRWZXJzaW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7Cit9IHhEUE1TR2V0VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeERQTVNHZXRWZXJzaW9uUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhEUE1TR2V0VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94RFBNU0dldFZlcnNpb25SZXBseSAzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNDYXBhYmxlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TQ2FwYWJsZVJlcTsKKyNkZWZpbmUgc3pfeERQTVNDYXBhYmxlUmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIEJPT0wJY2FwYWJsZTsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQxNglwYWQyIEIxNjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7CisgICAgQ0FSRDMyCXBhZDcgQjMyOworfSB4RFBNU0NhcGFibGVSZXBseTsKKyNkZWZpbmUgc3pfeERQTVNDYXBhYmxlUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TR2V0VGltZW91dHMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geERQTVNHZXRUaW1lb3V0c1JlcTsKKyNkZWZpbmUgc3pfeERQTVNHZXRUaW1lb3V0c1JlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJc3RhbmRieSBCMTY7CisgICAgQ0FSRDE2CXN1c3BlbmQgQjE2OworICAgIENBUkQxNglvZmYgQjE2OworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7Cit9IHhEUE1TR2V0VGltZW91dHNSZXBseTsKKyNkZWZpbmUgc3pfeERQTVNHZXRUaW1lb3V0c1JlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU1NldFRpbWVvdXRzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CXN0YW5kYnkgQjE2OworICAgIENBUkQxNglzdXNwZW5kIEIxNjsKKyAgICBDQVJEMTYJb2ZmIEIxNjsKKyAgICBDQVJEMTYJcGFkMCBCMTY7Cit9IHhEUE1TU2V0VGltZW91dHNSZXE7CisjZGVmaW5lIHN6X3hEUE1TU2V0VGltZW91dHNSZXEgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBEUE1TQ29kZSAqLworICAgIENBUkQ4CWRwbXNSZXFUeXBlOwkvKiBhbHdheXMgWF9EUE1TRW5hYmxlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhEUE1TRW5hYmxlUmVxOworI2RlZmluZSBzel94RFBNU0VuYWJsZVJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU0Rpc2FibGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geERQTVNEaXNhYmxlUmVxOworI2RlZmluZSBzel94RFBNU0Rpc2FibGVSZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIERQTVNDb2RlICovCisgICAgQ0FSRDgJZHBtc1JlcVR5cGU7CS8qIGFsd2F5cyBYX0RQTVNGb3JjZUxldmVsICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CWxldmVsIEIxNjsJLyogcG93ZXIgbGV2ZWwgcmVxdWVzdGVkICovCisgICAgQ0FSRDE2CXBhZDAgQjE2OworfSB4RFBNU0ZvcmNlTGV2ZWxSZXE7CisjZGVmaW5lIHN6X3hEUE1TRm9yY2VMZXZlbFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgRFBNU0NvZGUgKi8KKyAgICBDQVJEOAlkcG1zUmVxVHlwZTsJLyogYWx3YXlzIFhfRFBNU0luZm8gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geERQTVNJbmZvUmVxOworI2RlZmluZSBzel94RFBNU0luZm9SZXEgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CXBvd2VyX2xldmVsIEIxNjsKKyAgICBCT09MCXN0YXRlOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKK30geERQTVNJbmZvUmVwbHk7CisjZGVmaW5lIHN6X3hEUE1TSW5mb1JlcGx5IDMyCisKKyNlbmRpZiAvKiBfRFBNU1NUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2V4dHV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVkODFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiAkWG9yZzogZXh0dXRpbC5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJAorICoKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICoKKyAqIEF1dGhvcjogIEppbSBGdWx0b24sIE1JVCBUaGUgT3BlbiBHcm91cAorICogCisgKiAgICAgICAgICAgICAgICAgICAgIFhsaWIgRXh0ZW5zaW9uLVdyaXRpbmcgVXRpbGl0aWVzCisgKgorICogVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHV0aWxpdGllcyBmb3Igd3JpdGluZyB0aGUgY2xpZW50IEFQSSBmb3IgdmFyaW91cworICogcHJvdG9jb2wgZXh0ZW5zaW9ucy4gIFRIRVNFIElOVEVSRkFDRVMgQVJFIE5PVCBQQVJUIE9GIFRIRSBYIFNUQU5EQVJEIEFORAorICogQVJFIFNVQkpFQ1QgVE8gQ0hBTkdFIQorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL2V4dHV0aWwuaCx2IDEuOSAyMDAxLzEyLzE0IDE5OjUzOjI4IGRhd2VzIEV4cCAkICovCisKKyNpZm5kZWYgX0VYVFVUSUxfSF8KKyNkZWZpbmUgX0VYVFVUSUxfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hleHQuaD4KKworLyoKKyAqIFdlIG5lZWQgdG8ga2VlcCBhIGxpc3Qgb2Ygb3BlbiBkaXNwbGF5cyBzaW5jZSB0aGUgWGxpYiBkaXNwbGF5IGxpc3QgaXNuJ3QKKyAqIHB1YmxpYy4gIFdlIGFsc28gaGF2ZSB0byBwZXItZGlzcGxheSBpbmZvIGluIGEgc2VwYXJhdGUgYmxvY2sgc2luY2UgaXQgaXNuJ3QKKyAqIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgRGlzcGxheSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YRXh0RGlzcGxheUluZm8geworICAgIHN0cnVjdCBfWEV4dERpc3BsYXlJbmZvICpuZXh0OwkvKiBrZWVwIGEgbGlua2VkIGxpc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJCS8qIHdoaWNoIGRpc3BsYXkgdGhpcyBpcyAqLworICAgIFhFeHRDb2RlcyAqY29kZXM7CQkJLyogdGhlIGV4dGVuc2lvbiBwcm90b2NvbCBjb2RlcyAqLworICAgIFhQb2ludGVyIGRhdGE7CQkJLyogZXh0cmEgZGF0YSBmb3IgZXh0ZW5zaW9uIHRvIHVzZSAqLworfSBYRXh0RGlzcGxheUluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YRXh0ZW5zaW9uSW5mbyB7CisgICAgWEV4dERpc3BsYXlJbmZvICpoZWFkOwkJLyogc3RhcnQgb2YgbGlzdCAqLworICAgIFhFeHREaXNwbGF5SW5mbyAqY3VyOwkJLyogbW9zdCByZWNlbnRseSB1c2VkICovCisgICAgaW50IG5kaXNwbGF5czsJCQkvKiBudW1iZXIgb2YgZGlzcGxheXMgKi8KK30gWEV4dGVuc2lvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YRXh0ZW5zaW9uSG9va3MgeworICAgIGludCAoKmNyZWF0ZV9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorCSAgICAgIEdDCQkJLyogZ2MgKi8sCisJICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqY29weV9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBHQwkJCS8qIGdjICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpmbHVzaF9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBHQwkJCS8qIGdjICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpmcmVlX2djKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmNyZWF0ZV9mb250KSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhGb250U3RydWN0KgkJLyogZnMgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmZyZWVfZm9udCkoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRm9udFN0cnVjdCoJCS8qIGZzICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpjbG9zZV9kaXNwbGF5KSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIEJvb2wgKCp3aXJlX3RvX2V2ZW50KSgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIHJlICovLAorICAgICAgICAgICAgICAgeEV2ZW50KgkJCS8qIGV2ZW50ICovCispOworICAgIFN0YXR1cyAoKmV2ZW50X3RvX3dpcmUpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIHJlICovLAorICAgICAgICAgICAgICB4RXZlbnQqCQkJLyogZXZlbnQgKi8KKyk7CisgICAgaW50ICgqZXJyb3IpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgeEVycm9yKgkJCS8qIGVyciAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisgICAgICAgICAgICAgIGludCoJCQkvKiByZXRfY29kZSAqLworKTsKKyAgICBjaGFyICooKmVycm9yX3N0cmluZykoCisJICAgICAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgICBpbnQJCQkvKiBjb2RlICovLAorICAgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovLAorICAgICAgICAgICAgICAgIGNoYXIqCQkJLyogYnVmZmVyICovLAorICAgICAgICAgICAgICAgIGludAkJCS8qIG5ieXRlcyAqLworKTsKK30gWEV4dGVuc2lvbkhvb2tzOworCitleHRlcm4gWEV4dGVuc2lvbkluZm8gKlhleHRDcmVhdGVFeHRlbnNpb24oCisgICAgdm9pZAorKTsKK2V4dGVybiB2b2lkIFhleHREZXN0cm95RXh0ZW5zaW9uKAorICAgIFhFeHRlbnNpb25JbmZvKgkvKiBpbmZvICovCispOworZXh0ZXJuIFhFeHREaXNwbGF5SW5mbyAqWGV4dEFkZERpc3BsYXkoCisgICAgWEV4dGVuc2lvbkluZm8qCS8qIGV4dGluZm8gKi8sCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBjaGFyKgkJLyogZXh0X25hbWUgKi8sCisgICAgWEV4dGVuc2lvbkhvb2tzKgkvKiBob29rcyAqLywKKyAgICBpbnQJCQkvKiBuZXZlbnRzICovLAorICAgIFhQb2ludGVyCQkvKiBkYXRhICovCispOworZXh0ZXJuIGludCBYZXh0UmVtb3ZlRGlzcGxheSgKKyAgICBYRXh0ZW5zaW9uSW5mbyoJLyogZXh0aW5mbyAqLywKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworZXh0ZXJuIFhFeHREaXNwbGF5SW5mbyAqWGV4dEZpbmREaXNwbGF5KAorICAgIFhFeHRlbnNpb25JbmZvKgkvKiBleHRpbmZvICovLAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKKyNkZWZpbmUgWGV4dEhhc0V4dGVuc2lvbihpKSAoKGkpICYmICgoaSktPmNvZGVzKSkKKyNkZWZpbmUgWGV4dENoZWNrRXh0ZW5zaW9uKGRweSxpLG5hbWUsdmFsKSBcCisgIGlmICghWGV4dEhhc0V4dGVuc2lvbihpKSkgeyBYTWlzc2luZ0V4dGVuc2lvbiAoZHB5LCBuYW1lKTsgcmV0dXJuIHZhbDsgfQorI2RlZmluZSBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24oZHB5LGksbmFtZSkgXAorICBpZiAoIVhleHRIYXNFeHRlbnNpb24oaSkpIHsgWE1pc3NpbmdFeHRlbnNpb24gKGRweSwgbmFtZSk7IHJldHVybjsgfQorCisKKy8qCisgKiBoZWxwZXIgbWFjcm9zIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8gYWxsIGV4dGVuc2lvbnM7IGNhbGxlcgorICogc2hvdWxkIHByZWZpeCBpdCB3aXRoIHN0YXRpYyBpZiBleHRlbnNpb24gc291cmNlIGlzIGluIG9uZSBmaWxlOyB0aGlzCisgKiBjb3VsZCBiZSBhIHV0aWxpdHkgZnVuY3Rpb24sIGJ1dCBoYXZlIHRvIHN0YWNrIDYgdW51c2VkIGFyZ3VtZW50cyBmb3IgCisgKiBzb21ldGhpbmcgdGhhdCBpcyBjYWxsZWQgbWFueSwgbWFueSB0aW1lcyB3b3VsZCBiZSBiYWQuCisgKi8KKyNkZWZpbmUgWEVYVF9HRU5FUkFURV9GSU5EX0RJU1BMQVkocHJvYyxleHRpbmZvLGV4dG5hbWUsaG9va3MsbmV2LGRhdGEpIFwKK1hFeHREaXNwbGF5SW5mbyAqcHJvYyAoRGlzcGxheSAqZHB5KSBcCit7IFwKKyAgICBYRXh0RGlzcGxheUluZm8gKmRweWluZm87IFwKKyAgICBpZiAoIWV4dGluZm8pIHsgaWYgKCEoZXh0aW5mbyA9IFhleHRDcmVhdGVFeHRlbnNpb24oKSkpIHJldHVybiBOVUxMOyB9IFwKKyAgICBpZiAoIShkcHlpbmZvID0gWGV4dEZpbmREaXNwbGF5IChleHRpbmZvLCBkcHkpKSkgXAorICAgICAgZHB5aW5mbyA9IFhleHRBZGREaXNwbGF5IChleHRpbmZvLGRweSxleHRuYW1lLGhvb2tzLG5ldixkYXRhKTsgXAorICAgIHJldHVybiBkcHlpbmZvOyBcCit9CisKKyNkZWZpbmUgWEVYVF9GSU5EX0RJU1BMQVlfUFJPVE8ocHJvYykgXAorCVhFeHREaXNwbGF5SW5mbyAqcHJvYyhEaXNwbGF5ICpkcHkpCisKKyNkZWZpbmUgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZKHByb2MsZXh0aW5mbykgXAoraW50IHByb2MgKERpc3BsYXkgKmRweSwgWEV4dENvZGVzICpjb2RlcykgXAoreyBcCisgICAgcmV0dXJuIFhleHRSZW1vdmVEaXNwbGF5IChleHRpbmZvLCBkcHkpOyBcCit9CisKKyNkZWZpbmUgWEVYVF9DTE9TRV9ESVNQTEFZX1BST1RPKHByb2MpIFwKKwlpbnQgcHJvYyhEaXNwbGF5ICpkcHksIFhFeHRDb2RlcyAqY29kZXMpCisKKyNkZWZpbmUgWEVYVF9HRU5FUkFURV9FUlJPUl9TVFJJTkcocHJvYyxleHRuYW1lLG5lcnIsZXJybCkgXAorY2hhciAqcHJvYyAoRGlzcGxheSAqZHB5LCBpbnQgY29kZSwgWEV4dENvZGVzICpjb2RlcywgY2hhciAqYnVmLCBpbnQgbikgXAoreyAgXAorICAgIGNvZGUgLT0gY29kZXMtPmZpcnN0X2Vycm9yOyAgXAorICAgIGlmIChjb2RlID49IDAgJiYgY29kZSA8IG5lcnIpIHsgXAorCWNoYXIgdG1wWzI1Nl07IFwKKwlzcHJpbnRmICh0bXAsICIlcy4lZCIsIGV4dG5hbWUsIGNvZGUpOyBcCisJWEdldEVycm9yRGF0YWJhc2VUZXh0IChkcHksICJYUHJvdG9FcnJvciIsIHRtcCwgZXJybFtjb2RlXSwgYnVmLCBuKTsgXAorCXJldHVybiBidWY7IFwKKyAgICB9IFwKKyAgICByZXR1cm4gKGNoYXIgKikwOyBcCit9CisKKyNkZWZpbmUgWEVYVF9FUlJPUl9TVFJJTkdfUFJPVE8ocHJvYykgXAorCWNoYXIgKnByb2MoRGlzcGxheSAqZHB5LCBpbnQgY29kZSwgWEV4dENvZGVzICpjb2RlcywgY2hhciAqYnVmLCBpbnQgbikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhidWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ODNkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmLmgKQEAgLTAsMCArMSw1MSBAQAorLyogJFhvcmc6IGxieGJ1Zi5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwLCAxOTk0IE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4gbm90IGJlCisgKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIAorICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBBUy1JUycuICBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLAorICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBXSVRIT1VUCisgKiBMSU1JVEFUSU9OIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIE5FVFdPUksKKyAqIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORworICogU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIElOQ0xVRElORyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRiwgQU5ECisgKiBSRUdBUkRMRVNTIE9GIFdIRVRIRVIgSU4gQU4gQUNUSU9OIElOIENPTlRSQUNULCBUT1JUIE9SIE5FR0xJR0VOQ0UsCisgKiBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqIAorICovCisKKyNpZm5kZWYgX0JVRkZFUl9IXworI2RlZmluZSBfQlVGRkVSX0hfCisKKyNkZWZpbmUgSU5CVUZGRVJfU0laRQkJKDEgPDwgMTMpCS8qIDhLICovCisjZGVmaW5lIE9VVEJVRkZFUl9TSVpFCQkoMSA8PCAxMikJLyogNEsgKi8KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF96bGliYnVmZmVyICAqWmxpYkJ1ZmZlclB0cjsKKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIGludCAgSW5pdFpsaWJCdWZmZXIoWmxpYkJ1ZmZlclB0ciBiLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBGcmVlWmxpYkJ1ZmZlcihabGliQnVmZmVyUHRyIGIpOworZXh0ZXJuIGNoYXIgKlJlc2VydmVPdXRCdWYoWmxpYkJ1ZmZlclB0ciBvdXRidWYsIGludCBvdXRsZW4pOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYJLyogX0JVRkZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhidWZzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhMDZmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmc3RyLmgKQEAgLTAsMCArMSw0NSBAQAorLyogJFhvcmc6IGxieGJ1ZnN0ci5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwLCAxOTk0IE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4gbm90IGJlCisgKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIAorICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBBUy1JUycuICBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLAorICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBXSVRIT1VUCisgKiBMSU1JVEFUSU9OIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIE5FVFdPUksKKyAqIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORworICogU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIElOQ0xVRElORyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRiwgQU5ECisgKiBSRUdBUkRMRVNTIE9GIFdIRVRIRVIgSU4gQU4gQUNUSU9OIElOIENPTlRSQUNULCBUT1JUIE9SIE5FR0xJR0VOQ0UsCisgKiBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqIAorICovCisvKiAkWEZyZWU4NiQgKi8KKworI2lmbmRlZiBfQlVGRkVSU1RSX0hfCisjZGVmaW5lIF9CVUZGRVJTVFJfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2xieGJ1Zi5oPgorCisvKgorICogWkxJQiBJbnB1dC9PdXRwdXQgYnVmZmVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF96bGliYnVmZmVyIHsKKwljaGFyIAkqYnVmYmFzZTsKKwljaGFyCSpidWZlbmQ7CisJY2hhcgkqYnVmcHRyOworCWludCAgCWJ1ZmNudDsKK30gWmxpYkJ1ZmZlcjsKKworI2RlZmluZSBCWVRFU19BVkFJTChpbmJ1ZiwgbGVuKQlcCisJKCgoaW5idWYpLT5idWZjbnQgPj0gKGxlbikpID8gKGluYnVmKS0+YnVmcHRyIDogTlVMTCkKKworI2VuZGlmCS8qIF9CVUZGRVJTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4ZGVsdGFzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4ZGVsdGFzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhkZWx0YXN0ci5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiAkWG9yZzogbGJ4ZGVsdGFzdHIuaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk5MyBOZXR3b3JrIENvbXB1dGluZyBEZXZpY2VzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBOQ0QuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBOQ0QuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogTkNELiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTAorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgTkNELgorICogQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIAorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBMQlhfREVMVEFfU1RSVUNUX0gKKyNkZWZpbmUgTEJYX0RFTFRBX1NUUlVDVF9ICisKKyNkZWZpbmUgTUlOX0NBQ0hFQUJMRV9MRU4JCTgKKworI2RlZmluZSBERUxUQV9DQUNIRUFCTEUocGNhY2hlLCBsZW4pCVwKKwkoKGxlbikgPiBNSU5fQ0FDSEVBQkxFX0xFTiAmJiAobGVuKSA8PSAocGNhY2hlKS0+bWF4RGVsdGFzaXplKQorCisvKgorICogQW4gZW50cnkgaW4gdGhlIGRlbHRhIGNvbXBhY3RvciBjYWNoZQorICovCit0eXBlZGVmIHN0cnVjdCBfTEJYRGVsdGFFbGVtIHsKKyAgICBpbnQJCQlsZW5ndGg7CisgICAgdW5zaWduZWQgY2hhcgkqYnVmOworfSBMQlhEZWx0YUVsZW1SZWMsICpMQlhEZWx0YUVsZW1QdHI7CisKKworLyoKKyAqIERlbHRhIGNvbXBhY3RvciBjYWNoZQorICovCit0eXBlZGVmIHN0cnVjdCBfTEJYRGVsdGFzIHsKKyAgICB1bnNpZ25lZCBzaG9ydAluRGVsdGFzOworICAgIHVuc2lnbmVkIHNob3J0CW1heERlbHRhc2l6ZTsKKyAgICBMQlhEZWx0YUVsZW1QdHIJZGVsdGFzOworICAgIHVuc2lnbmVkIHNob3J0CW5leHREZWx0YTsKKyAgICB1bnNpZ25lZCBzaG9ydAlhY3RpdmVEZWx0YXM7CS8qIG9ubHkgbmVlZGVkIGZvciBvdXRnb2luZyAqLworfSBMQlhEZWx0YXNSZWMsICpMQlhEZWx0YXNQdHI7CisKKworLyoKKyAqIE1vdGlvbiBkZWx0YSBjYWNoZQorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHN3YXBwZWQ7CisgICAgQllURSBkZXRhaWw7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBUaW1lIHRpbWUgQjMyOworICAgIFdpbmRvdyByb290IEIzMiwgZXZlbnQgQjMyLCBjaGlsZCBCMzI7CisgICAgSU5UMTYgcm9vdFggQjE2LCByb290WSBCMTYsIGV2ZW50WCBCMTYsIGV2ZW50WSBCMTY7CisgICAgS2V5QnV0TWFzayBzdGF0ZSBCMTY7CisgICAgQk9PTCBzYW1lU2NyZWVuOwkJCit9IGxieE1vdGlvbkNhY2hlOworCisKKy8qCisgKiBNb3Rpb24gZGVsdGEgZXZlbnRzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBMYnhRdWlja01vdGlvbkRlbHRhRXZlbnQgKi8KKyAgICBDQVJEOCBkZWx0YVRpbWU7CisgICAgSU5UOCBkZWx0YVg7CisgICAgSU5UOCBkZWx0YVk7Cit9IGxieFF1aWNrTW90aW9uRGVsdGFFdmVudDsKKyNkZWZpbmUgc3pfbGJ4UXVpY2tNb3Rpb25EZWx0YUV2ZW50IDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBMYnhFdmVudCAqLworICAgIEJZVEUgbGJ4VHlwZTsJLyogTGJ4TW90aW9uRGVsdGFFdmVudCAqLworICAgIElOVDggZGVsdGFYOworICAgIElOVDggZGVsdGFZOworICAgIENBUkQxNiBkZWx0YVRpbWUgQjE2OworICAgIENBUkQxNiBkZWx0YVNlcXVlbmNlIEIxNjsKK30gbGJ4TW90aW9uRGVsdGFFdmVudDsKKyNkZWZpbmUgc3pfbGJ4TW90aW9uRGVsdGFFdmVudCA4CisKK2V4dGVybiBpbnQgTEJYSW5pdERlbHRhQ2FjaGUgKCBMQlhEZWx0YXNQdHIgcGNhY2hlLCBpbnQgbkRlbHRhcywgCisJCQkgICAgICAgaW50IG1heERlbHRhc2l6ZSApOworZXh0ZXJuIHZvaWQgTEJYRnJlZURlbHRhQ2FjaGUgKCBMQlhEZWx0YXNQdHIgcGNhY2hlICk7CitleHRlcm4gaW50IExCWERlbHRhTWluRGlmZnMgKCBMQlhEZWx0YXNQdHIgcGNhY2hlLCB1bnNpZ25lZCBjaGFyICppbm1zZywgCisJCQkgICAgICBpbnQgaW5tc2dsZW4sIGludCBtYXhkaWZmLCBpbnQgKnBpbmRleCApOworZXh0ZXJuIHZvaWQgTEJYRW5jb2RlRGVsdGEgKCBMQlhEZWx0YXNQdHIgcGNhY2hlLCB1bnNpZ25lZCBjaGFyICppbm1zZywgCisJCQkgICAgIGludCBuZGlmZiwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICpidWYgKTsKK2V4dGVybiBpbnQgTEJYRGVjb2RlRGVsdGEgKCBMQlhEZWx0YXNQdHIgcGNhY2hlLCB4TGJ4RGlmZkl0ZW0gKmRlbHRhcywgCisJCQkgICAgaW50IG5kaWZmLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKipidWYgKTsKK2V4dGVybiB2b2lkIExCWEFkZERlbHRhT3V0ICggTEJYRGVsdGFzUHRyIHBjYWNoZSwgdW5zaWduZWQgY2hhciAqaW5tc2csIAorCQkJICAgICBpbnQgaW5tc2dsZW4gKTsKK2V4dGVybiB2b2lkIExCWEFkZERlbHRhSW4gKCBMQlhEZWx0YXNQdHIgcGNhY2hlLCB1bnNpZ25lZCBjaGFyICppbm1zZywgCisJCQkgICAgaW50IGlubXNnbGVuICk7CisKKyNlbmRpZiAvKiBMQlhfREVMVEFfU1RSVUNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4aW1hZ2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4aW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDYyN2NmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhpbWFnZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKiAkWG9yZzogbGJ4aW1hZ2UuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9sYnhpbWFnZS5oLHYgMS40IDIwMDEvMTIvMjAgMTk6Mjg6NTQgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX0xCWF9JTUFHRV9IXworI2RlZmluZSBfTEJYX0lNQUdFX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK3R5cGVkZWYgc3RydWN0IF9MYnhCaXRtYXBDb21wTWV0aG9kIHsKKworICAgIGNoYXIgKm1ldGhvZE5hbWU7CisgICAgaW50IGluaXRlZDsKKyAgICBpbnQgbWV0aG9kT3BDb2RlOwkvKiB0byBiZSBmaWxsZWQgb24gcmVwbHkgZnJvbSBzZXJ2ZXIgKi8KKworICAgIGludCAoKmNvbXBJbml0KSgKKwl2b2lkCisgICAgKTsKKworICAgIGludCAoKmNvbXBGdW5jKSgKKwl1bnNpZ25lZCBjaGFyICoJCS8qIGluYnVmICovLAorCXVuc2lnbmVkIGNoYXIgKgkJLyogb3V0YnVmICovLAorCWludAkJCS8qIG91dGJ1ZlNpemUgKi8sCisJaW50CQkJLyogaW1hZ2VfYnl0ZXMgKi8sCisJaW50CQkJLyogcGl4ZWxzX3Blcl9saW5lICovLAorCWludAkJCS8qIHBhZGRlZF9ieXRlc19wZXJfc2NhbmxpbmUgKi8sCisJaW50CQkJLyogcmV2ZXJzZV9iaXRzICovLAorCWludCAqCQkJLyogYnl0ZXNDb21wcmVzc2VkICovCisgICAgKTsKKworICAgIGludCAoKmRlY29tcEZ1bmMpKAorCXVuc2lnbmVkIGNoYXIgKgkJLyogaW5idWYgKi8sCisJdW5zaWduZWQgY2hhciAqCQkvKiBvdXRidWYgKi8sCisJaW50CQkJLyogaW1hZ2VfYnl0ZXMgKi8sCisJaW50CQkJLyogcGl4ZWxzX3Blcl9saW5lICovLAorCWludAkJCS8qIHBhZGRlZF9ieXRlc19wZXJfc2NhbmxpbmUgKi8sCisJaW50CQkJLyogcmV2ZXJzZV9iaXRzICovCisgICAgKTsKKworfSBMYnhCaXRtYXBDb21wTWV0aG9kOworCisKKyNkZWZpbmUgTEJYX01BWF9ERVBUSFMgNQorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UGl4bWFwQ29tcE1ldGhvZCB7CisKKyAgICBjaGFyICptZXRob2ROYW1lOworICAgIHVuc2lnbmVkIGZvcm1hdE1hc2s7CisgICAgaW50IGRlcHRoQ291bnQ7CisgICAgaW50IGRlcHRoc1tMQlhfTUFYX0RFUFRIU107CisgICAgaW50IGluaXRlZDsKKyAgICBpbnQgbWV0aG9kT3BDb2RlOwkvKiB0byBiZSBmaWxsZWQgb24gcmVwbHkgZnJvbSBzZXJ2ZXIgKi8KKworICAgIGludCAoKmNvbXBJbml0KSgKKwl2b2lkCisgICAgKTsKKworICAgIGludCAoKmNvbXBGdW5jKSgKKwljaGFyICoJCQkvKiBpbmJ1ZiAqLywKKwljaGFyICoJCQkvKiBvdXRidWYgKi8sCisJaW50CQkJLyogb3V0YnVmU2l6ZSAqLywKKwlpbnQJCQkvKiBmb3JtYXQgKi8sCisJaW50CQkJLyogZGVwdGggKi8sCisJaW50CQkJLyogbnVtX3NjYW5fbGluZXMgKi8sCisJaW50CQkJLyogc2Nhbl9saW5lX3NpemUgKi8sCisJaW50ICoJCQkvKiBieXRlc0NvbXByZXNzZWQgKi8KKyAgICApOworCisgICAgaW50ICgqZGVjb21wRnVuYykoCisJY2hhciAqCQkJLyogaW5idWYgKi8sCisJY2hhciAqCQkJLyogb3V0YnVmICovLAorCWludAkJCS8qIG51bV9zY2FuX2xpbmVzICovLAorCWludAkJCS8qIHNjYW5fbGluZV9zaXplICovCisgICAgKTsKKworfSBMYnhQaXhtYXBDb21wTWV0aG9kOworCisKK2V4dGVybiBpbnQgTGJ4SW1hZ2VFbmNvZGVQYWNrQml0cyAoCitjaGFyICoJCQkvKiBpbmJ1ZiAqLywKK2NoYXIgKgkJCS8qIG91dGJ1ZiAqLywKK2ludAkJCS8qIG91dGJ1ZlNpemUgKi8sCitpbnQJCQkvKiBmb3JtYXQgKi8sCitpbnQJCQkvKiBkZXB0aCAqLywKK2ludAkJCS8qIG51bV9zY2FuX2xpbmVzICovLAoraW50CQkJLyogc2Nhbl9saW5lX3NpemUgKi8sCitpbnQgKgkJCS8qIGJ5dGVzQ29tcHJlc3NlZCAqLworKTsKKworZXh0ZXJuIGludCBMYnhJbWFnZUVuY29kZUZheEc0MkQgKAordW5zaWduZWQgY2hhciAqCQkvKiBpbmJ1ZiAqLywKK3Vuc2lnbmVkIGNoYXIgKgkJLyogb3V0YnVmICovLAoraW50CQkJLyogb3V0YnVmU2l6ZSAqLywKK2ludAkJCS8qIGltYWdlX2J5dGVzICovLAoraW50CQkJLyogcGl4ZWxzX3Blcl9saW5lICovLAoraW50CQkJLyogcGFkZGVkX2J5dGVzX3Blcl9zY2FubGluZSAqLywKK2ludAkJCS8qIHJldmVyc2VfYml0cyAqLywKK2ludCAqCQkJLyogYnl0ZXNDb21wcmVzc2VkICovCispOworCitleHRlcm4gaW50IExieEltYWdlRGVjb2RlUGFja0JpdHMgKAorY2hhciAqCQkJLyogaW5idWYgKi8sCitjaGFyICoJCQkvKiBvdXRidWYgKi8sCitpbnQJCQkvKiBudW1fc2Nhbl9saW5lcyAqLywKK2ludAkJCS8qIHNjYW5fbGluZV9zaXplICovCispOworCitleHRlcm4gaW50IExieEltYWdlRGVjb2RlRmF4RzQyRCAoCit1bnNpZ25lZCBjaGFyICoJCS8qIGluYnVmICovLAordW5zaWduZWQgY2hhciAqCQkvKiBvdXRidWYgKi8sCitpbnQJCQkvKiBpbWFnZV9ieXRlcyAqLywKK2ludAkJCS8qIHBpeGVsc19wZXJfbGluZSAqLywKK2ludAkJCS8qIHBhZGRlZF9ieXRlc19wZXJfc2NhbmxpbmUgKi8sCitpbnQJCQkvKiByZXZlcnNlX2JpdHMgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX1NVQ0NFU1MJCTAKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX05PX1NVUFBPUlQJCTEKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX0JBRF9NQUxMT0MJCTIKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX05PVF9XT1JUSF9JVAkJMworCisjZW5kaWYgLyogX0xCWF9JTUFHRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhvcHRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieG9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU4N2ZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhvcHRzLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qICRYb3JnOiBsYnhvcHRzLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IDE5OTQgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcywgSW5jLiBub3QgYmUKKyAqIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoaXMKKyAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBBUy1JUycuICBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLAorICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBXSVRIT1VUCisgKiBMSU1JVEFUSU9OIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIE5FVFdPUksKKyAqIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORworICogU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIElOQ0xVRElORyBMT1NTIE9GIFVTRSwgREFUQSwKKyAqIE9SIFBST0ZJVFMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRiwgQU5EIFJFR0FSRExFU1MgT0YKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIElOIENPTlRSQUNULCBUT1JUIE9SIE5FR0xJR0VOQ0UsIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9sYnhvcHRzLmgsdiAxLjUgMjAwMS8wMS8xNyAxNzo1MzoyMSBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9MQlhfT1BUU19IXworI2RlZmluZSBfTEJYX09QVFNfSF8KKworLyoKKyAqIE5lZ290aWFibGUgY29uZmlndXJhdGlvbiBvcHRpb25zCisgKi8KKyNkZWZpbmUgTEJYX09QVF9ERUxUQV9QUk9YWQkJMAorI2RlZmluZSBMQlhfT1BUX0RFTFRBX1NFUlZFUgkJMQorI2RlZmluZSBMQlhfT1BUX1NUUkVBTV9DT01QCQkyCisjZGVmaW5lIExCWF9PUFRfQklUTUFQX0NPTVAJCTMKKyNkZWZpbmUgTEJYX09QVF9QSVhNQVBfQ09NUAkJNAorI2RlZmluZSBMQlhfT1BUX01TR19DT01QCQk1CS8qIGFrYSAic3F1aXNoaW5nIiAqLworI2RlZmluZSBMQlhfT1BUX1VTRV9UQUdTCQk2CisjZGVmaW5lIExCWF9PUFRfQ01BUF9BTEwJCTcKKyNkZWZpbmUgTEJYX09QVF9FWFRFTlNJT04JCTI1NQorCisvKgorICogTGVuZ3RoIGZpZWxkcyBhcmUgZW5jb2RlZCBpbiAxIG9yIDMgYnl0ZXMKKyAqLworI2RlZmluZSBMQlhfT1BUX1NNQUxMTEVOX1NJWkUJCTEKKyNkZWZpbmUgTEJYX09QVF9CSUdMRU5fU0laRQkJMworI2RlZmluZSBMQlhfT1BUX0JJR0xFTl9NSU4JCTI1NgorCisjZGVmaW5lIExCWF9PUFRfREVDT0RFX0xFTihwLCBsZW4sIHNpemUpIFwKKyAgICBpZiAoKHApWzBdKSB7IFwKKwkobGVuKSA9IChwKVswXTsgXAorCShzaXplKSA9IExCWF9PUFRfU01BTExMRU5fU0laRTsgXAorICAgIH0gXAorICAgIGVsc2UgeyBcCisJKGxlbikgPSAoKExCWF9PUFRfQklHTEVOX01JTiArIChwKVsxXSkgPDwgOCkgfCAocClbMl07IFwKKwkoc2l6ZSkgPSBMQlhfT1BUX0JJR0xFTl9TSVpFOyBcCisgICAgfQorCisvKgorICogT3B0aW9uIGhlYWRlciBsZW5ndGhzCisgKi8KKyNkZWZpbmUgTEJYX09QVF9TTUFMTEhEUl9MRU4JCSgxICsgTEJYX09QVF9TTUFMTExFTl9TSVpFKQorI2RlZmluZSBMQlhfT1BUX0JJR0hEUl9MRU4JCSgxICsgTEJYX09QVF9CSUdMRU5fU0laRSkKKworLyoKKyAqIERlbHRhIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBMQlhfT1BUX0RFTFRBX1JFUUxFTgkJNgorI2RlZmluZSBMQlhfT1BUX0RFTFRBX1JFUExZTEVOCQkyCisjZGVmaW5lIExCWF9PUFRfREVMVEFfTkNBQ0hFX0RGTFQJMTYKKyNkZWZpbmUgTEJYX09QVF9ERUxUQV9NU0dMRU5fTUlOCTMyCisjZGVmaW5lIExCWF9PUFRfREVMVEFfTVNHTEVOX0RGTFQJNjQKKworCisvKgorICogU3RyZWFtIGNvbXByZXNzaW9uIG9wdHMKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCAoZGVmaW5lZChVU0cpICYmICFkZWZpbmVkKENSQVkpICYmICFkZWZpbmVkKHVtaXBzKSAmJiAhZGVmaW5lZChNT1RPUk9MQSkgJiYgIWRlZmluZWQodW5pb3N1KSAmJiAhZGVmaW5lZChfX3N4Z19fKSkKKworc3RydWN0IGlvdmVjIHsKKyAgICBjYWRkcl90IGlvdl9iYXNlOworICAgIGludCBpb3ZfbGVuOworfTsKKworI2Vsc2UKKyNpZm5kZWYgTHlueAorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8dWlvLmg+CisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKkxieFN0cmVhbUNvbXBIYW5kbGU7CisKK3R5cGVkZWYgc3RydWN0IF9MYnhTdHJlYW1PcHRzIHsKKyAgICBMYnhTdHJlYW1Db21wSGFuZGxlCSgqc3RyZWFtQ29tcEluaXQpKGludCBmZCwgcG9pbnRlciBhcmcpOworICAgIHBvaW50ZXIJCXN0cmVhbUNvbXBBcmc7CisgICAgaW50CQkJKCpzdHJlYW1Db21wU3R1ZmZJbnB1dCkoCisJCQkgICAgaW50IGZkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgICBpbnQgYnVmbGVuCisJCQkpOworICAgIGludAkJCSgqc3RyZWFtQ29tcElucHV0QXZhaWwpKAorCQkJICAgIGludCBmZAorCQkJKTsKKyAgICBpbnQJCQkoKnN0cmVhbUNvbXBGbHVzaCkoCisJCQkgICAgaW50IGZkCisJCQkpOworICAgIGludAkJCSgqc3RyZWFtQ29tcFJlYWQpKAorCQkJICAgIGludCBmZCwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgaW50IGJ1ZmxlbgorCQkJKTsKKyAgICBpbnQgICAgICAgICAJKCpzdHJlYW1Db21wV3JpdGVWKSgKKwkJCSAgICBpbnQgZmQsCisJCQkgICAgc3RydWN0IGlvdmVjICppb3YsCisJCQkgICAgaW50IGlvdmNudAorCQkJKTsKKyAgICB2b2lkCQkoKnN0cmVhbUNvbXBPbikoCisJCQkgICAgaW50IGZkCisJCQkpOworICAgIHZvaWQJCSgqc3RyZWFtQ29tcE9mZikoCisJCQkgICAgaW50IGZkCisJCQkpOworICAgIHZvaWQJCSgqc3RyZWFtQ29tcEZyZWVIYW5kbGUpKAorCQkJICAgIExieFN0cmVhbUNvbXBIYW5kbGUgaGFuZGxlCisJCQkpOworfSBMYnhTdHJlYW1PcHRzOworCisjZW5kaWYgLyogX0xCWF9PUFRTX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieHN0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjc5ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhzdHIuaApAQCAtMCwwICsxLDkzNSBAQAorLyogJFhvcmc6IGxieHN0ci5oLHYgMS40IDIwMDEvMDIvMTMgMjA6MTQ6MDQgcG9va2llIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IDE5OTIgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTkNELiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTkNELiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIE5DRC4gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIE5DRC4KKyAqIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiAKKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL2xieHN0ci5oLHYgMS4yIDIwMDEvMDgvMDEgMDA6NDQ6MzUgdHNpIEV4cCAkICovCisgCisjaWZuZGVmIF9MQlhTVFJfSF8KKyNkZWZpbmUgX0xCWFNUUl9IXworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWExieC5oPgorCisjZGVmaW5lIExCWE5BTUUgIkxCWCIKKworI2RlZmluZSBMQlhfTUFKT1JfVkVSU0lPTgkxCisjZGVmaW5lIExCWF9NSU5PUl9WRVJTSU9OCTAKKworLyoKKyAqIFJlZGVmaW5lIHNvbWUgYmFzaWMgdHlwZXMgdXNlZCBieSBzdHJ1Y3R1cmVzIGRlZmluZWQgaGVyZWluLiAgVGhpcyByZW1vdmVzCisgKiBhbnkgcG9zc2liaWxpdHkgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMgb2Ygb25lIGVudGl0eSB2aWV3aW5nIGNvbW11bmljYXRlZAorICogZGF0YSBhcyAzMi1iaXQgcXVhbnRpdGllcyBhbmQgYW5vdGhlciBlbnRpdHkgdmlld2luZyB0aGUgc2FtZSBkYXRhIGFzIDY0LWJpdAorICogcXVhbnRpdGllcy4KKyAqLworI2RlZmluZSBYSUQgQ0FSRDMyCisjZGVmaW5lIEF0b20gQ0FSRDMyCisjZGVmaW5lIENvbG9ybWFwIENBUkQzMgorI2RlZmluZSBEcmF3YWJsZSBDQVJEMzIKKyNkZWZpbmUgVmlzdWFsSUQgQ0FSRDMyCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJPT0wJc3VjY2VzczsJCS8qIFRSVUUgKi8KKyAgICBCT09MCWNoYW5nZVR5cGU7CisgICAgQ0FSRDE2CW1ham9yVmVyc2lvbiBCMTYsCisJCW1pbm9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CQkvKiAxLzQgYWRkaXRpb25hbCBieXRlcyBpbiBzZXR1cCBpbmZvICovCisgICAgQ0FSRDMyCXRhZyBCMzI7Cit9IHhMYnhDb25uU2V0dXBQcmVmaXg7CisKK3R5cGVkZWYgc3RydWN0IF9MYnhRdWVyeVZlcnNpb24geworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CQkvKiBhbHdheXMgWF9MYnhRdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieFF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeExieFF1ZXJ5VmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OwkvKiBtYWpvciB2ZXJzaW9uIG9mIExCWCBwcm90b2NvbCAqLworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIExCWCBwcm90b2NvbCAqLworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhRdWVyeVZlcnNpb25SZXBseTsKKyNkZWZpbmUgc3pfeExieFF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhTdGFydFByb3h5IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFN0YXJ0UHJveHkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieFN0YXJ0UHJveHlSZXE7CisjZGVmaW5lIHN6X3hMYnhTdGFydFByb3h5UmVxCSAgICA0CisKK3R5cGVkZWYgc3RydWN0IF9MYnhTdG9wUHJveHkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4U3RvcFByb3h5ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhMYnhTdG9wUHJveHlSZXE7CisjZGVmaW5lIHN6X3hMYnhTdG9wUHJveHlSZXEJICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFN3aXRjaCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhTd2l0Y2ggKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJY2xpZW50IEIzMjsJLyogbmV3IGNsaWVudCAqLworfSB4TGJ4U3dpdGNoUmVxOworI2RlZmluZSBzel94TGJ4U3dpdGNoUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieE5ld0NsaWVudCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhOZXdDbGllbnQgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJY2xpZW50IEIzMjsJLyogbmV3IGNsaWVudCAqLworfSB4TGJ4TmV3Q2xpZW50UmVxOworI2RlZmluZSBzel94TGJ4TmV3Q2xpZW50UmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENsb3NlQ2xpZW50IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieENsb3NlQ2xpZW50ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWNsaWVudCBCMzI7CS8qIG5ldyBjbGllbnQgKi8KK30geExieENsb3NlQ2xpZW50UmVxOworI2RlZmluZSBzel94TGJ4Q2xvc2VDbGllbnRSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4TW9kaWZ5U2VxdWVuY2UgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4TW9kaWZ5U2VxdWVuY2UgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYWRqdXN0IEIzMjsKK30geExieE1vZGlmeVNlcXVlbmNlUmVxOworI2RlZmluZSBzel94TGJ4TW9kaWZ5U2VxdWVuY2VSZXEgICAgOAorICAgIAordHlwZWRlZiBzdHJ1Y3QgX0xieEFsbG93TW90aW9uIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEFsbG93TW90aW9uICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCW51bSBCMzI7Cit9IHhMYnhBbGxvd01vdGlvblJlcTsKKyNkZWZpbmUgc3pfeExieEFsbG93TW90aW9uUmVxICAgIDgKKyAgICAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdyYWJDbWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ29sb3JtYXAJY21hcCBCMzI7Cit9IHhMYnhHcmFiQ21hcFJlcTsgICAgCisjZGVmaW5lIHN6X3hMYnhHcmFiQ21hcFJlcQk4CisKKyNkZWZpbmUgTEJYX1NNQVJUX0dSQUIJCTB4ODAKKyNkZWZpbmUgTEJYX0FVVE9fUkVMRUFTRQkweDQwCisjZGVmaW5lIExCWF8zQ0hBTk5FTFMJCTB4MjAKKyNkZWZpbmUgTEJYXzJCWVRFX1BJWEVMUwkweDEwCisjZGVmaW5lIExCWF9SR0JfQklUU19NQVNLCTB4MGYKKworI2RlZmluZSBMQlhfTElTVF9FTkQJCTAKKyNkZWZpbmUgTEJYX1BJWEVMX1BSSVZBVEUJMQorI2RlZmluZSBMQlhfUElYRUxfU0hBUkVECTIKKyNkZWZpbmUgTEJYX1BJWEVMX1JBTkdFX1BSSVZBVEUJMworI2RlZmluZSBMQlhfUElYRUxfUkFOR0VfU0hBUkVECTQKKyNkZWZpbmUgTEJYX05FWFRfQ0hBTk5FTAk1CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CWZsYWdzOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjE2OworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMTY7Cit9IHhMYnhHcmFiQ21hcFJlcGx5OworI2RlZmluZSBzel94TGJ4R3JhYkNtYXBSZXBseQkzMgorI2RlZmluZSBzel94TGJ4R3JhYkNtYXBSZXBseUhkcgk4CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4UmVsZWFzZUNtYXAgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDb2xvcm1hcAljbWFwIEIzMjsKK30geExieFJlbGVhc2VDbWFwUmVxOyAgICAKKyNkZWZpbmUgc3pfeExieFJlbGVhc2VDbWFwUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4QWxsb2NDb2xvciAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENvbG9ybWFwCWNtYXAgQjMyOworICAgIENBUkQzMglwaXhlbCBCMzI7CisgICAgQ0FSRDE2CXJlZCBCMTYsIGdyZWVuIEIxNiwgYmx1ZSBCMTY7CisgICAgQ0FSRDE2CXBhZCBCMTY7Cit9IHhMYnhBbGxvY0NvbG9yUmVxOyAgICAKKyNkZWZpbmUgc3pfeExieEFsbG9jQ29sb3JSZXEJMjAKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEluY3JlbWVudFBpeGVsIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEluY3JlbWVudFBpeGVsICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWNtYXAgQjMyOworICAgIENBUkQzMglwaXhlbCBCMzI7Cit9IHhMYnhJbmNyZW1lbnRQaXhlbFJlcTsKKyNkZWZpbmUgc3pfeExieEluY3JlbWVudFBpeGVsUmVxICAgIDEyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhEZWx0YSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhEZWx0YSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWRpZmZzOwkJLyogbnVtYmVyIG9mIGRpZmZzICovCisgICAgQ0FSRDgJY2luZGV4OwkJLyogY2FjaGUgaW5kZXggKi8KKwkJCQkvKiBsaXN0IG9mIGRpZmZzIGZvbGxvd3MgKi8KK30geExieERlbHRhUmVxOworI2RlZmluZSBzel94TGJ4RGVsdGFSZXEgICAgNgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4R2V0TW9kaWZpZXJNYXBwaW5nIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEdldE1vZGlmaWVyTWFwcGluZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGJ4R2V0TW9kaWZpZXJNYXBwaW5nUmVxOworI2RlZmluZQlzel94TGJ4R2V0TW9kaWZpZXJNYXBwaW5nUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJa2V5c3Blcm1vZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhHZXRNb2RpZmllck1hcHBpbmdSZXBseTsKKyNkZWZpbmUgc3pfeExieEdldE1vZGlmaWVyTWFwcGluZ1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhHZXRLZXlib2FyZE1hcHBpbmcgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4R2V0S2V5Ym9hcmRNYXBwaW5nICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgS2V5Q29kZQlmaXJzdEtleUNvZGU7CisgICAgQ0FSRDgJY291bnQ7CisgICAgQ0FSRDE2CXBhZDEgQjE2OworfSB4TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVxOworI2RlZmluZQlzel94TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQ0FSRDgJa2V5c3BlcmtleWNvZGU7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMzIJdGFnIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4TGJ4R2V0S2V5Ym9hcmRNYXBwaW5nUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhHZXRLZXlib2FyZE1hcHBpbmdSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UXVlcnlGb250IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieFF1ZXJ5Rm9udCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMglmaWQgQjMyOworfSB4TGJ4UXVlcnlGb250UmVxOworI2RlZmluZQlzel94TGJ4UXVlcnlGb250UmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEludGVybkF0b21zIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEludGVybkF0b21zICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW51bSBCMTY7Cit9IHhMYnhJbnRlcm5BdG9tc1JlcTsKKyNkZWZpbmUgc3pfeExieEludGVybkF0b21zUmVxCTYgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglhdG9tc1N0YXJ0IEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4TGJ4SW50ZXJuQXRvbXNSZXBseTsKKyNkZWZpbmUgc3pfeExieEludGVybkF0b21zUmVwbHkJCTMyCisjZGVmaW5lIHN6X3hMYnhJbnRlcm5BdG9tc1JlcGx5SGRyCTgKKworCit0eXBlZGVmIHN0cnVjdCBfTGJ4R2V0V2luQXR0ckFuZEdlb20geworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4R2V0V2luQXR0ckFuZEdlb20gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJaWQgQjMyOwkJLyogd2luZG93IGlkICovCit9IHhMYnhHZXRXaW5BdHRyQW5kR2VvbVJlcTsKKyNkZWZpbmUgc3pfeExieEdldFdpbkF0dHJBbmRHZW9tUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOCBiYWNraW5nU3RvcmU7CisgICAgQ0FSRDE2IHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgbGVuZ3RoIEIzMjsJLyogTk9UIDA7IHRoaXMgaXMgYW4gZXh0cmEtbGFyZ2UgcmVwbHkgKi8KKyAgICBWaXN1YWxJRCB2aXN1YWxJRCBCMzI7CisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQxNiBjX2NsYXNzIEIxNjsKKyNlbHNlCisgICAgQ0FSRDE2IGNsYXNzIEIxNjsKKyNlbmRpZgorICAgIENBUkQ4IGJpdEdyYXZpdHk7CisgICAgQ0FSRDggd2luR3Jhdml0eTsKKyAgICBDQVJEMzIgYmFja2luZ0JpdFBsYW5lcyBCMzI7CisgICAgQ0FSRDMyIGJhY2tpbmdQaXhlbCBCMzI7CisgICAgQk9PTCBzYXZlVW5kZXI7CisgICAgQk9PTCBtYXBJbnN0YWxsZWQ7CisgICAgQ0FSRDggbWFwU3RhdGU7CisgICAgQk9PTCBvdmVycmlkZTsKKyAgICBDb2xvcm1hcCBjb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyIGFsbEV2ZW50TWFza3MgQjMyOworICAgIENBUkQzMiB5b3VyRXZlbnRNYXNrIEIzMjsKKyAgICBDQVJEMTYgZG9Ob3RQcm9wYWdhdGVNYXNrIEIxNjsKKyAgICBDQVJEMTYgcGFkMSBCMTY7CisgICAgV2luZG93IHJvb3QgQjMyOworICAgIElOVDE2IHggQjE2LCB5IEIxNjsKKyAgICBDQVJEMTYgd2lkdGggQjE2LCBoZWlnaHQgQjE2OworICAgIENBUkQxNiBib3JkZXJXaWR0aCBCMTY7CisgICAgQ0FSRDggZGVwdGg7CisgICAgQ0FSRDggcGFkMjsKK30geExieEdldFdpbkF0dHJBbmRHZW9tUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhHZXRXaW5BdHRyQW5kR2VvbVJlcGx5IDYwCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4U3luYyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworfSB4TGJ4U3luY1JlcTsKKyNkZWZpbmUgc3pfeExieFN5bmNSZXEJNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhMYnhTeW5jUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhTeW5jUmVwbHkgMzIKKworCisvKiBhbiBMQlggc3F1aXNoZWQgY2hhcmluZm8gcGFja3MgdGhlIGRhdGEgaW4gYSBDQVJEMzIgYXMgZm9sbG93cyAqLworI2RlZmluZQlMQlhfV0lEVEhfU0hJRlQJCTI2CisjZGVmaW5lCUxCWF9MRUZUX1NISUZUCQkyMAorI2RlZmluZQlMQlhfUklHSFRfU0hJRlQJCTEzCisjZGVmaW5lCUxCWF9BU0NFTlRfU0hJRlQJNworI2RlZmluZQlMQlhfREVTQ0VOVF9TSElGVAkwCisKKyNkZWZpbmUJTEJYX1dJRFRIX0JJVFMJCTYKKyNkZWZpbmUJTEJYX0xFRlRfQklUUwkJNgorI2RlZmluZQlMQlhfUklHSFRfQklUUwkJNworI2RlZmluZQlMQlhfQVNDRU5UX0JJVFMJCTYKKyNkZWZpbmUJTEJYX0RFU0NFTlRfQklUUwk3CisKKyNkZWZpbmUJTEJYX1dJRFRIX01BU0sJCTB4ZmMwMDAwMDAKKyNkZWZpbmUJTEJYX0xFRlRfTUFTSwkJMHgwM2YwMDAwMAorI2RlZmluZQlMQlhfUklHSFRfTUFTSwkJMHgwMDBmZTAwMAorI2RlZmluZQlMQlhfQVNDRU5UX01BU0sJCTB4MDAwMDFmODAKKyNkZWZpbmUJTEJYX0RFU0NFTlRfTUFTSwkweDAwMDAwMDdmCisKKyNkZWZpbmUJTEJYX01BU0tfQklUUyh2YWwsIG4pCSgodW5zaWduZWQgaW50KSAoKHZhbCkgJiAoKDEgPDwgKG4pKSAtIDEpKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQzMgltZXRyaWNzIEIzMjsKK30geExieENoYXJJbmZvOworCisvKiBub3RlIHRoYXQgdGhpcyBpcyBpZGVudGljYWwgdG8geFF1ZXJ5Rm9udFJlcGx5IGV4Y2VwdCBmb3IgbWlzc2luZyAKKyAqIGZpcnN0IDIgd29yZHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHhDaGFySW5mbyBtaW5Cb3VuZHM7IAorLyogWFhYIGRvIHdlIG5lZWQgdG8gbGVhdmUgdGhpcyBndW5rPyAqLworI2lmbmRlZiBXT1JENjQKKyAgICBDQVJEMzIgd2FsaWduMSBCMzI7CisjZW5kaWYKKyAgICB4Q2hhckluZm8gbWF4Qm91bmRzOyAKKyNpZm5kZWYgV09SRDY0CisgICAgQ0FSRDMyIHdhbGlnbjIgQjMyOworI2VuZGlmCisgICAgQ0FSRDE2IG1pbkNoYXJPckJ5dGUyIEIxNiwgbWF4Q2hhck9yQnl0ZTIgQjE2OworICAgIENBUkQxNiBkZWZhdWx0Q2hhciBCMTY7CisgICAgQ0FSRDE2IG5Gb250UHJvcHMgQjE2OyAgLyogZm9sbG93ZWQgYnkgdGhpcyBtYW55IHhGb250UHJvcCBzdHJ1Y3R1cmVzICovCisgICAgQ0FSRDggZHJhd0RpcmVjdGlvbjsKKyAgICBDQVJEOCBtaW5CeXRlMSwgbWF4Qnl0ZTE7CisgICAgQk9PTCBhbGxDaGFyc0V4aXN0OworICAgIElOVDE2IGZvbnRBc2NlbnQgQjE2LCBmb250RGVzY2VudCBCMTY7CisgICAgQ0FSRDMyIG5DaGFySW5mb3MgQjMyOyAvKiBmb2xsb3dlZCBieSB0aGlzIG1hbnkgeExieENoYXJJbmZvIHN0cnVjdHVyZXMgKi8KK30geExieEZvbnRJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAljb21wcmVzc2lvbjsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgLyogWF9RdWVyeUZvbnQgc3RpY2tzIG11Y2ggb2YgdGhlIGRhdGEgaW4gdGhlIGJhc2UgcmVwbHkgcGFja2V0LAorICAgICAqIGJ1dCB3ZSBob3BlIHRoYXQgaXQgd29uJ3QgYmUgbmVlZGVkLCAoYW5kIGl0IHdvbid0IGZpdCBpbiAzMiBieXRlcworICAgICAqIHdpdGggdGhlIHRhZyBhbnl3YXlzKQorICAgICAqCisgICAgICogaWYgYW55IGFkZGl0aW9uYWwgZGF0YSBpcyBuZWVkZWQsIGl0cyBzZW50IGluIGEgeExieEZvbnRJbmZvCisgICAgICovCit9IHhMYnhRdWVyeUZvbnRSZXBseTsKKyNkZWZpbmUgc3pfeExieFF1ZXJ5Rm9udFJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhDaGFuZ2VQcm9wZXJ0eSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhDaGFuZ2VQcm9wZXJ0eSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworICAgIEF0b20JcHJvcGVydHkgQjMyOworICAgIEF0b20JdHlwZSBCMzI7CisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQ4CW1vZGU7CisgICAgQllURQlwYWRbMl07CisgICAgQ0FSRDMyCW5Vbml0cyBCMzI7Cit9IHhMYnhDaGFuZ2VQcm9wZXJ0eVJlcTsKKyNkZWZpbmUJc3pfeExieENoYW5nZVByb3BlcnR5UmVxCTI0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXBhZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhDaGFuZ2VQcm9wZXJ0eVJlcGx5OworI2RlZmluZSBzel94TGJ4Q2hhbmdlUHJvcGVydHlSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4R2V0UHJvcGVydHkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4R2V0UHJvcGVydHkgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBXaW5kb3cJd2luZG93IEIzMjsKKyAgICBBdG9tCXByb3BlcnR5IEIzMjsKKyAgICBBdG9tCXR5cGUgQjMyOworICAgIENBUkQ4CWRlbGV0ZTsKKyAgICBCWVRFCXBhZFszXTsKKyAgICBDQVJEMzIJbG9uZ09mZnNldCBCMzI7CisgICAgQ0FSRDMyCWxvbmdMZW5ndGggQjMyOworfSB4TGJ4R2V0UHJvcGVydHlSZXE7CisjZGVmaW5lCXN6X3hMYnhHZXRQcm9wZXJ0eVJlcQkyOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlmb3JtYXQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBBdG9tCXByb3BlcnR5VHlwZSBCMzI7CisgICAgQ0FSRDMyCWJ5dGVzQWZ0ZXIgQjMyOworICAgIENBUkQzMgluSXRlbXMgQjMyOworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhMYnhHZXRQcm9wZXJ0eVJlcGx5OworI2RlZmluZSBzel94TGJ4R2V0UHJvcGVydHlSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4VGFnRGF0YSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhUYWdEYXRhICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWElECQl0YWcgQjMyOworICAgIENBUkQzMglyZWFsX2xlbmd0aCBCMzI7CisgICAgLyogZGF0YSAqLworfSB4TGJ4VGFnRGF0YVJlcTsKKyNkZWZpbmUJc3pfeExieFRhZ0RhdGFSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEludmFsaWRhdGVUYWcgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4SW52YWxpZGF0ZVRhZyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgl0YWcgQjMyOworfSB4TGJ4SW52YWxpZGF0ZVRhZ1JlcTsKKyNkZWZpbmUJc3pfeExieEludmFsaWRhdGVUYWdSZXEJOAorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UHV0SW1hZ2UgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsJLyogYWx3YXlzIFhfTGJ4UHV0SW1hZ2UgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAljb21wcmVzc2lvbk1ldGhvZDsKKyAgICBDQVJEOAljYWNoZUVudHM7CisgICAgQ0FSRDgJYml0UGFja2VkOworICAgIC8qIHJlc3QgaXMgdmFyaWFibGUgKi8KK30geExieFB1dEltYWdlUmVxOworI2RlZmluZSBzel94TGJ4UHV0SW1hZ2VSZXEJNworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhHZXRJbWFnZSAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIERyYXdhYmxlCWRyYXdhYmxlIEIzMjsKKyAgICBJTlQxNgl4IEIxNiwgeSBCMTY7CisgICAgQ0FSRDE2CXdpZHRoIEIxNiwgaGVpZ2h0IEIxNjsKKyAgICBDQVJEMzIJcGxhbmVNYXNrIEIzMjsKKyAgICBDQVJEOAlmb3JtYXQ7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEMTYJcGFkMiBCMTY7Cit9IHhMYnhHZXRJbWFnZVJlcTsgICAgCisKKyNkZWZpbmUgc3pfeExieEdldEltYWdlUmVxIDI0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFIHR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4IGRlcHRoOworICAgIENBUkQxNiBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyIGxieExlbmd0aCBCMzI7CisgICAgQ0FSRDMyIHhMZW5ndGggQjMyOworICAgIFZpc3VhbElEIHZpc3VhbCBCMzI7CisgICAgQ0FSRDggY29tcHJlc3Npb25NZXRob2Q7CisgICAgQ0FSRDggcGFkMTsKKyAgICBDQVJEMTYgcGFkMiBCMTY7CisgICAgQ0FSRDMyIHBhZDMgQjMyOworICAgIENBUkQzMiBwYWQ0IEIzMjsKKyAgICBDQVJEMzIgcGFkNSBCMzI7Cit9IHhMYnhHZXRJbWFnZVJlcGx5OworCisjZGVmaW5lIHN6X3hMYnhHZXRJbWFnZVJlcGx5IDMyCisgIAorLyogRm9sbG93aW5nIHVzZWQgZm9yIExieFBvbHlQb2ludCwgTGJ4UG9seUxpbmUsIExieFBvbHlTZWdtZW50LAorICAgTGJ4UG9seVJlY3RhbmdsZSwgTGJ4UG9seUFyYywgTGJ4UG9seUZpbGxSZWN0YW5nbGUgYW5kIExieFBvbHlGaWxsQXJjICovCisKKyNkZWZpbmUgR0ZYX0NBQ0hFX1NJWkUgIDE1CisKKyNkZWZpbmUgR0ZYZENhY2hlRW50KGUpCSAgICAoKGUpICYgMHhmKQorI2RlZmluZSBHRlhnQ2FjaGVFbnQoZSkJICAgICgoKGUpID4+IDQpICYgMHhmKQorI2RlZmluZSBHRlhDYWNoZUVudHMoZCxnKSAgICgoKGQpICYgMHhmKSB8ICgoKGcpICYgMHhmKSA8PCA0KSkKKworI2RlZmluZSBHRlhDYWNoZU5vbmUgICAweGYKKwordHlwZWRlZiBzdHJ1Y3QgX0xieFBvbHlQb2ludCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWNhY2hlRW50czsKKyAgICBDQVJEOAlwYWRCeXRlczsKK30geExieFBvbHlQb2ludFJlcTsKKworI2RlZmluZSBzel94TGJ4UG9seVBvaW50UmVxCTYKKwordHlwZWRlZiB4TGJ4UG9seVBvaW50UmVxIHhMYnhQb2x5TGluZVJlcTsKK3R5cGVkZWYgeExieFBvbHlQb2ludFJlcSB4TGJ4UG9seVNlZ21lbnRSZXE7Cit0eXBlZGVmIHhMYnhQb2x5UG9pbnRSZXEgeExieFBvbHlSZWN0YW5nbGVSZXE7Cit0eXBlZGVmIHhMYnhQb2x5UG9pbnRSZXEgeExieFBvbHlBcmNSZXE7Cit0eXBlZGVmIHhMYnhQb2x5UG9pbnRSZXEgeExieFBvbHlGaWxsUmVjdGFuZ2xlUmVxOwordHlwZWRlZiB4TGJ4UG9seVBvaW50UmVxIHhMYnhQb2x5RmlsbEFyY1JlcTsKKworI2RlZmluZSBzel94TGJ4UG9seUxpbmVSZXEJCXN6X3hMYnhQb2x5UG9pbnRSZXEKKyNkZWZpbmUgc3pfeExieFBvbHlTZWdtZW50UmVxCQlzel94TGJ4UG9seVBvaW50UmVxCisjZGVmaW5lIHN6X3hMYnhQb2x5UmVjdGFuZ2xlUmVxCQlzel94TGJ4UG9seVBvaW50UmVxCisjZGVmaW5lIHN6X3hMYnhQb2x5QXJjUmVxCQlzel94TGJ4UG9seVBvaW50UmVxCisjZGVmaW5lIHN6X3hMYnhQb2x5RmlsbFJlY3RhbmdsZVJlcQlzel94TGJ4UG9seVBvaW50UmVxCisjZGVmaW5lIHN6X3hMYnhQb2x5RmlsbEFyYwkJc3pfeExieFBvbHlQb2ludFJlcQorCit0eXBlZGVmIHN0cnVjdCBfTGJ4RmlsbFBvbHkgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAljYWNoZUVudHM7CisgICAgQllURQlzaGFwZTsKKyAgICBDQVJEOAlwYWRCeXRlczsKK30geExieEZpbGxQb2x5UmVxOworI2RlZmluZSBzel94TGJ4RmlsbFBvbHlSZXEJNworCit0eXBlZGVmIHN0cnVjdCBfTGJ4Q29weUFyZWEgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBMYnhSZXFDb2RlICovCisgICAgQ0FSRDgJbGJ4UmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEOAlzcmNDYWNoZTsJLyogc291cmNlIGRyYXdhYmxlICovCisgICAgQ0FSRDgJY2FjaGVFbnRzOwkvKiBkZXN0IGRyYXdhYmxlIGFuZCBnYyAqLworICAgIC8qIGZvbGxvd2VkIGJ5IGVuY29kZWQgc3JjIHgsIHNyYyB5LCBkc3QgeCwgZHN0IHksIHdpZHRoLCBoZWlnaHQgKi8KK30geExieENvcHlBcmVhUmVxOworICAgIAorI2RlZmluZSBzel94TGJ4Q29weUFyZWFSZXEgIDYKKwordHlwZWRlZiBzdHJ1Y3QgX0xieENvcHlQbGFuZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgliaXRQbGFuZSBCMzI7CisgICAgQ0FSRDgJc3JjQ2FjaGU7CS8qIHNvdXJjZSBkcmF3YWJsZSAqLworICAgIENBUkQ4CWNhY2hlRW50czsJLyogZGVzdCBkcmF3YWJsZSBhbmQgZ2MgKi8KKyAgICAvKiBmb2xsb3dlZCBieSBlbmNvZGVkIHNyYyB4LCBzcmMgeSwgZHN0IHgsIGRzdCB5LCB3aWR0aCwgaGVpZ2h0ICovCit9IHhMYnhDb3B5UGxhbmVSZXE7CisgICAgCisjZGVmaW5lIHN6X3hMYnhDb3B5UGxhbmVSZXEgIDEwCisKK3R5cGVkZWYgc3RydWN0IF9MYnhQb2x5VGV4dCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CWNhY2hlRW50czsKKyAgICAvKiBmb2xsb3dlZCBieSBlbmNvZGVkIHNyYyB4LCBzcmMgeSBjb29yZGluYXRlcyBhbmQgdGV4dCBlbHRzICovCit9IHhMYnhQb2x5VGV4dFJlcTsKKworI2RlZmluZSBzel94TGJ4UG9seVRleHRSZXEgIDUKKwordHlwZWRlZiB4TGJ4UG9seVRleHRSZXEgeExieFBvbHlUZXh0OFJlcTsKK3R5cGVkZWYgeExieFBvbHlUZXh0UmVxIHhMYnhQb2x5VGV4dDE2UmVxOworICAgIAorI2RlZmluZSBzel94TGJ4UG9seVRleHRSZXEJNQorI2RlZmluZSBzel94TGJ4UG9seVRleHQ4UmVxCTUKKyNkZWZpbmUgc3pfeExieFBvbHlUZXh0MTZSZXEJNQorCit0eXBlZGVmIHN0cnVjdCBfTGJ4SW1hZ2VUZXh0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJY2FjaGVFbnRzOworICAgIENBUkQ4CW5DaGFyczsKKyAgICAvKiBmb2xsb3dlZCBieSBlbmNvZGVkIHNyYyB4LCBzcmMgeSBjb29yZGluYXRlcyBhbmQgc3RyaW5nICovCit9IHhMYnhJbWFnZVRleHRSZXE7CisgICAgCit0eXBlZGVmIHhMYnhJbWFnZVRleHRSZXEgeExieEltYWdlVGV4dDhSZXE7Cit0eXBlZGVmIHhMYnhJbWFnZVRleHRSZXEgeExieEltYWdlVGV4dDE2UmVxOworICAgIAorI2RlZmluZSBzel94TGJ4SW1hZ2VUZXh0UmVxCTYKKyNkZWZpbmUgc3pfeExieEltYWdlVGV4dDhSZXEJNgorI2RlZmluZSBzel94TGJ4SW1hZ2VUZXh0MTZSZXEJNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDggICAgICAgb2Zmc2V0OworICAgIENBUkQ4ICAgICAgIGRpZmY7Cit9IHhMYnhEaWZmSXRlbTsKKyNkZWZpbmUgc3pfeExieERpZmZJdGVtICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAluT3B0czsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglvcHREYXRhU3RhcnQgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhMYnhTdGFydFJlcGx5OworI2RlZmluZSBzel94TGJ4U3RhcnRSZXBseQkzMgorI2RlZmluZSBzel94TGJ4U3RhcnRSZXBseUhkcgk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhRdWVyeUV4dGVuc2lvbiB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhRdWVyeUV4dGVuc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgluYnl0ZXMgQjMyOworfSB4TGJ4UXVlcnlFeHRlbnNpb25SZXE7CisjZGVmaW5lCXN6X3hMYnhRdWVyeUV4dGVuc2lvblJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhRdWVyeUV4dGVuc2lvblJlcGx5IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CW51bVJlcXM7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBCT09MCXByZXNlbnQ7CisgICAgQ0FSRDgJbWFqb3Jfb3Bjb2RlOworICAgIENBUkQ4CWZpcnN0X2V2ZW50OworICAgIENBUkQ4CWZpcnN0X2Vycm9yOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisKKyAgICAvKiByZXBseSAmIGV2ZW50IGdlbmVyYXRpbmcgcmVxdWVzdHMgKi8KK30geExieFF1ZXJ5RXh0ZW5zaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hMYnhRdWVyeUV4dGVuc2lvblJlcGx5CTMyCisKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEJlZ2luTGFyZ2VSZXF1ZXN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieEJlZ2luTGFyZ2VSZXF1ZXN0ICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWxhcmdlUmVxTGVuZ3RoIEIzMjsKK30geExieEJlZ2luTGFyZ2VSZXF1ZXN0UmVxOworI2RlZmluZQlzel9CZWdpbkxhcmdlUmVxdWVzdFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhMYXJnZVJlcXVlc3REYXRhIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTGJ4UmVxQ29kZSAqLworICAgIENBUkQ4CWxieFJlcVR5cGU7CS8qIGFsd2F5cyBYX0xieExhcmdlUmVxdWVzdERhdGEgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICAvKiBmb2xsb3dlZCBieSBMSVNUb2ZDQVJEOCBkYXRhICovCit9IHhMYnhMYXJnZVJlcXVlc3REYXRhUmVxOworI2RlZmluZQlzel9MYXJnZVJlcXVlc3REYXRhUmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEVuZExhcmdlUmVxdWVzdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIExieFJlcUNvZGUgKi8KKyAgICBDQVJEOAlsYnhSZXFUeXBlOwkvKiBhbHdheXMgWF9MYnhFbmRMYXJnZVJlcXVlc3QgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geExieEVuZExhcmdlUmVxdWVzdFJlcTsKKyNkZWZpbmUJc3pfRW5kTGFyZ2VSZXF1ZXN0UmVxIDQKKworCisKK3R5cGVkZWYgc3RydWN0IF9MYnhTd2l0Y2hFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhTd2l0Y2hFdmVudCAqLworICAgIENBUkQxNglwYWQgQjE2OworICAgIENBUkQzMgljbGllbnQgQjMyOworfSB4TGJ4U3dpdGNoRXZlbnQ7CisjZGVmaW5lIHN6X3hMYnhTd2l0Y2hFdmVudAk4CisKK3R5cGVkZWYgc3RydWN0IF9MYnhDbG9zZUV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieENsb3NlRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMgljbGllbnQgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKKyAgICBDQVJEMzIJcGFkNSBCMzI7CisgICAgQ0FSRDMyCXBhZDYgQjMyOworfSB4TGJ4Q2xvc2VFdmVudDsKKyNkZWZpbmUgc3pfeExieENsb3NlRXZlbnQJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieEludmFsaWRhdGVUYWdFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhJbnZhbGlkYXRlVGFnRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMgl0YWdUeXBlIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4TGJ4SW52YWxpZGF0ZVRhZ0V2ZW50OworI2RlZmluZSBzel94TGJ4SW52YWxpZGF0ZVRhZ0V2ZW50IDMyCisKK3R5cGVkZWYgc3RydWN0IF9MYnhTZW5kVGFnRGF0YUV2ZW50IHsKKyAgICBCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgTGJ4RXZlbnQgKi8KKyAgICBCWVRFCWxieFR5cGU7CS8qIExieFNlbmRUYWdEYXRhRXZlbnQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMgl0YWcgQjMyOworICAgIENBUkQzMgl0YWdUeXBlIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4TGJ4U2VuZFRhZ0RhdGFFdmVudDsKKyNkZWZpbmUgc3pfeExieFNlbmRUYWdEYXRhRXZlbnQgMzIKKwordHlwZWRlZiBzdHJ1Y3QgX0xieExpc3RlblRvT25lRXZlbnQgeworICAgIEJZVEUJdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBMYnhFdmVudCAqLworICAgIEJZVEUJbGJ4VHlwZTsJLyogTGJ4TGlzdGVuVG9PbmVFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWNsaWVudCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhMYnhMaXN0ZW5Ub09uZUV2ZW50OworI2RlZmluZSBzel94TGJ4TGlzdGVuVG9PbmVFdmVudCAzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4TGlzdGVuVG9BbGxFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhMaXN0ZW5Ub0FsbEV2ZW50ICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworICAgIENBUkQzMglwYWQ2IEIzMjsKKyAgICBDQVJEMzIJcGFkNyBCMzI7Cit9IHhMYnhMaXN0ZW5Ub0FsbEV2ZW50OworI2RlZmluZSBzel94TGJ4TGlzdGVuVG9PbmVFdmVudCAzMgorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UmVsZWFzZUNtYXBFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhSZWxlYXNlQ21hcEV2ZW50ICovCisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDb2xvcm1hcAljb2xvcm1hcCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhMYnhSZWxlYXNlQ21hcEV2ZW50OworI2RlZmluZSBzel94TGJ4UmVsZWFzZUNtYXBFdmVudAkzMgorCisKK3R5cGVkZWYgc3RydWN0IF9MYnhGcmVlQ2VsbHNFdmVudCB7CisgICAgQllURQl0eXBlOwkJLyogYWx3YXlzIGV2ZW50QmFzZSArIExieEV2ZW50ICovCisgICAgQllURQlsYnhUeXBlOwkvKiBMYnhGcmVlQ2VsbHNFdmVudCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ29sb3JtYXAJY29sb3JtYXAgQjMyOworICAgIENBUkQzMglwaXhlbFN0YXJ0IEIzMjsKKyAgICBDQVJEMzIJcGl4ZWxFbmQgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geExieEZyZWVDZWxsc0V2ZW50OworI2RlZmluZSBzel94TGJ4RnJlZUNlbGxzRXZlbnQJMzIKKworCisvKgorICogc3F1aXNoZWQgWCBldmVudCBzaXplcy4gIElmIHRoZXNlIGNoYW5nZSwgYmUgc3VyZSB0byB1cGRhdGUgbGJ4cXVpc2guYworICogYW5kIHVuc3F1aXNoLmMgYXBwcm9wcmlhdGVseQorICoKKyAqIGxieHN6XyogaXMgdGhlIHBhZGRlZCBzcXVpc2hlZCBsZW5ndGgKKyAqIGxieHVwc3pfKiBpcyB0aGUgdW5wYWRkZWQgc3F1aXNoZWQgbGVuZ3RoCisgKi8KKworI2RlZmluZQkgIGxieHN6X0tleUJ1dHRvbkV2ZW50CQkzMgorI2RlZmluZQlsYnh1cHN6X0tleUJ1dHRvbkV2ZW50CQkzMQorCisjZGVmaW5lCSAgbGJ4c3pfRW50ZXJMZWF2ZUV2ZW50CQkzMgorI2RlZmluZQlsYnh1cHN6X0VudGVyTGVhdmVFdmVudAkJMzIKKworI2RlZmluZQkgIGxieHN6X0ZvY3VzRXZlbnQJCTEyCisjZGVmaW5lCWxieHVwc3pfRm9jdXNFdmVudAkJOQorCisjZGVmaW5lCSAgbGJ4c3pfS2V5bWFwRXZlbnQJCTMyCisjZGVmaW5lCWxieHVwc3pfS2V5bWFwRXZlbnQJCTMyCisKKyNkZWZpbmUJICBsYnhzel9FeHBvc2VFdmVudAkJMjAKKyNkZWZpbmUJbGJ4dXBzel9FeHBvc2VFdmVudAkJMTgKKworI2RlZmluZQkgIGxieHN6X0dmeEV4cG9zZUV2ZW50CQkyNAorI2RlZmluZQlsYnh1cHN6X0dmeEV4cG9zZUV2ZW50CQkyMQorCisjZGVmaW5lCSAgbGJ4c3pfTm9FeHBvc2VFdmVudAkJMTIKKyNkZWZpbmUJbGJ4dXBzel9Ob0V4cG9zZUV2ZW50CQkxMQorCisjZGVmaW5lCSAgbGJ4c3pfVmlzaWJpbGl0eUV2ZW50CQkxMgorI2RlZmluZQlsYnh1cHN6X1Zpc2liaWxpdHlFdmVudAkJOQorCisjZGVmaW5lCSAgbGJ4c3pfQ3JlYXRlTm90aWZ5RXZlbnQJMjQKKyNkZWZpbmUJbGJ4dXBzel9DcmVhdGVOb3RpZnlFdmVudAkyMworCisjZGVmaW5lCSAgbGJ4c3pfRGVzdHJveU5vdGlmeUV2ZW50CTEyCisjZGVmaW5lCWxieHVwc3pfRGVzdHJveU5vdGlmeUV2ZW50CTEyCisKKyNkZWZpbmUJICBsYnhzel9Vbm1hcE5vdGlmeUV2ZW50CTE2CisjZGVmaW5lCWxieHVwc3pfVW5tYXBOb3RpZnlFdmVudAkxMworCisjZGVmaW5lCSAgbGJ4c3pfTWFwTm90aWZ5RXZlbnQJCTE2CisjZGVmaW5lCWxieHVwc3pfTWFwTm90aWZ5RXZlbnQJCTEzCisKKyNkZWZpbmUJICBsYnhzel9NYXBSZXF1ZXN0RXZlbnQJCTEyCisjZGVmaW5lCWxieHVwc3pfTWFwUmVxdWVzdEV2ZW50CQkxMgorCisjZGVmaW5lCSAgbGJ4c3pfUmVwYXJlbnRFdmVudAkJMjQKKyNkZWZpbmUJbGJ4dXBzel9SZXBhcmVudEV2ZW50CQkyMQorCisjZGVmaW5lCSAgbGJ4c3pfQ29uZmlndXJlTm90aWZ5RXZlbnQJMjgKKyNkZWZpbmUJbGJ4dXBzel9Db25maWd1cmVOb3RpZnlFdmVudAkyNworCisjZGVmaW5lCSAgbGJ4c3pfQ29uZmlndXJlUmVxdWVzdEV2ZW50CTI4CisjZGVmaW5lCWxieHVwc3pfQ29uZmlndXJlUmVxdWVzdEV2ZW50CTI4CisKKyNkZWZpbmUJICBsYnhzel9HcmF2aXR5RXZlbnQJCTE2CisjZGVmaW5lCWxieHVwc3pfR3Jhdml0eUV2ZW50CQkxNgorCisjZGVmaW5lCSAgbGJ4c3pfUmVzaXplUmVxdWVzdEV2ZW50CTEyCisjZGVmaW5lCWxieHVwc3pfUmVzaXplUmVxdWVzdEV2ZW50CTEyCisKKyNkZWZpbmUJICBsYnhzel9DaXJjdWxhdGVFdmVudAkJMjAKKyNkZWZpbmUJbGJ4dXBzel9DaXJjdWxhdGVFdmVudAkJMTcKKworI2RlZmluZQkgIGxieHN6X1Byb3BlcnR5RXZlbnQJCTIwCisjZGVmaW5lCWxieHVwc3pfUHJvcGVydHlFdmVudAkJMTcKKworI2RlZmluZQkgIGxieHN6X1NlbGVjdGlvbkNsZWFyRXZlbnQJMTYKKyNkZWZpbmUJbGJ4dXBzel9TZWxlY3Rpb25DbGVhckV2ZW50CTE2CisKKyNkZWZpbmUJICBsYnhzel9TZWxlY3Rpb25SZXF1ZXN0RXZlbnQJMjgKKyNkZWZpbmUJbGJ4dXBzel9TZWxlY3Rpb25SZXF1ZXN0RXZlbnQJMjgKKworI2RlZmluZQkgIGxieHN6X1NlbGVjdGlvbk5vdGlmeUV2ZW50CTI0CisjZGVmaW5lCWxieHVwc3pfU2VsZWN0aW9uTm90aWZ5RXZlbnQJMjQKKworI2RlZmluZQkgIGxieHN6X0NvbG9ybWFwRXZlbnQJCTE2CisjZGVmaW5lCWxieHVwc3pfQ29sb3JtYXBFdmVudAkJMTQKKworI2RlZmluZQkgIGxieHN6X01hcHBpbmdOb3RpZnlFdmVudAk4CisjZGVmaW5lCWxieHVwc3pfTWFwcGluZ05vdGlmeUV2ZW50CTcKKworI2RlZmluZQkgIGxieHN6X0NsaWVudE1lc3NhZ2VFdmVudAkzMgorI2RlZmluZQlsYnh1cHN6X0NsaWVudE1lc3NhZ2VFdmVudAkzMgorCisjZGVmaW5lCWxieHN6X1Vua25vd25FdmVudAkJMzIKKworI2lmZGVmIERFQlVHCisKKyNkZWZpbmUgREJHX1NXSVRDSAkweDAwMDAwMDAxCisjZGVmaW5lIERCR19DTE9TRQkweDAwMDAwMDAyCisjZGVmaW5lIERCR19JTwkJMHgwMDAwMDAwNAorI2RlZmluZSBEQkdfUkVBRF9SRVEJMHgwMDAwMDAwOAorI2RlZmluZSBEQkdfTEVOCQkweDAwMDAwMDEwCisjZGVmaW5lIERCR19CTE9DSwkweDAwMDAwMDIwCisjZGVmaW5lIERCR19DTElFTlQJMHgwMDAwMDA0MAorI2RlZmluZSBEQkdfREVMVEEJMHgwMDAwMDA4MAorCitleHRlcm4gaW50IGxieERlYnVnOworCisjZGVmaW5lIERCRyhuLG0pICAgIGlmIChsYnhEZWJ1ZyAmIChuKSkgeyBmcHJpbnRmIG07IH0gZWxzZQorI2Vsc2UKKyNkZWZpbmUgREJHKG4sbSkKKyNlbmRpZgorCisvKgorICogQ2FuY2VsIHRoZSBwcmV2aW91cyByZWRlZmluaXRpb24gb2YgdGhlIGJhc2ljIHR5cGVzLCB0aHVzIHJlc3RvcmluZyB0aGVpcgorICogWC5oIGRlZmluaXRpb25zLgorICovCisKKyN1bmRlZiBYSUQKKyN1bmRlZiBBdG9tCisjdW5kZWYgQ29sb3JtYXAKKyN1bmRlZiBEcmF3YWJsZQorI3VuZGVmIFZpc3VhbElECisjdW5kZWYgV2luZG93CisKKyNlbmRpZgkvKiBfTEJYU1RSX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieHpsaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4emxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMjE4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2xieHpsaWIuaApAQCAtMCwwICsxLDY0IEBACisvKiAkWG9yZzogbGJ4emxpYi5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAxOTkzIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE5DRC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE5DRC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorICogc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBOQ0QuIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBOQ0QuCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcjogIERhbGUgVG9ub2dhaSwgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcworICovCisKKyNpZm5kZWYgX1pMSUJfSF8KKyNkZWZpbmUgX1pMSUJfSF8KKworI2RlZmluZSBaTElCX1NUUkNPTVBfT1BUCSJYQy1aTElCIgorI2RlZmluZSBaTElCX1NUUkNPTVBfT1BUX0xFTgk3CisKKyNkZWZpbmUgWkxJQl9QQUNLRVRfSERSTEVOCTIKKyNkZWZpbmUgWkxJQl9NQVhfREFUQUxFTgkweGZmZgorI2RlZmluZSBaTElCX01BWF9QTEFJTgkJMjcwCisjZGVmaW5lIFpMSUJfTUFYX09VVExFTgkJKFpMSUJfTUFYX1BMQUlOIDw8IDEpCisKKyNkZWZpbmUgWkxJQl9DT01QUkVTU19GTEFHCTB4ODAKKyNkZWZpbmUgWkxJQl9EQVRBTEVOX01BU0sJMHgwZgorCisjZGVmaW5lIFpMSUJfUFVUX1BLVEhEUihwLCBsZW4sIGNvbXBmbGFnKSBcCisgICAgeyBcCisJKHApWzBdID0gKCh1bnNpZ25lZCkobGVuKSkgPj4gOCB8ICgoY29tcGZsYWcpID8gWkxJQl9DT01QUkVTU19GTEFHIDogMCk7XAorCShwKVsxXSA9IChsZW4pICYgMHhmZjsgXAorICAgIH0KKworI2RlZmluZSBaTElCX0dFVF9EQVRBTEVOKHApIFwKKwkoKCgodW5zaWduZWQpKChwKVswXSAmIFpMSUJfREFUQUxFTl9NQVNLKSkgPDwgOCkgfCAodW5zaWduZWQpKHApWzFdKQorCisjZGVmaW5lIFpMSUJfQ09NUFJFU1NFRChwKSAoKHApWzBdICYgWkxJQl9DT01QUkVTU19GTEFHKQorCitzdHJ1Y3QgWmxpYkluZm87CisKK2V4dGVybiB2b2lkICogWmxpYkluaXQgKCBpbnQgZmQsIGludCBsZXZlbCApOworZXh0ZXJuIHZvaWQgWmxpYkZyZWUgKCBzdHJ1Y3QgWmxpYkluZm8gKmNvbXAgKTsKK2V4dGVybiBpbnQgWmxpYkZsdXNoICggaW50IGZkICk7CitleHRlcm4gaW50IFpsaWJTdHVmZklucHV0ICggaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBidWZsZW4gKTsKK2V4dGVybiB2b2lkIFpsaWJDb21wcmVzc09uICggaW50IGZkICk7CitleHRlcm4gdm9pZCBabGliQ29tcHJlc3NPZmYgKCBpbnQgZmQgKTsKK2V4dGVybiBpbnQgWmxpYldyaXRlICggaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBidWZsZW4gKTsKK2V4dGVybiBpbnQgWmxpYldyaXRlViAoIGludCBmZCwgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQgKTsKK2V4dGVybiBpbnQgWmxpYlJlYWQgKCBpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiApOworZXh0ZXJuIGludCBabGliSW5wdXRBdmFpbCAoIGludCBmZCApOworCisKKyNlbmRpZiAvKiBfWkxJQl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9taXRtaXNjc3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL21pdG1pc2NzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNhZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9taXRtaXNjc3RyLmgKQEAgLTAsMCArMSw3MCBAQAorLyogJFhGcmVlODYkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkFORE9NIENSVUZUISBUSElTIEhBUyBOTyBPRkZJQ0lBTCBYIENPTlNPUlRJVU0gT1IgWCBQUk9KRUNUIFRFQU0gQkxFU1NJTkcgKi8KKworLyogJFhvcmc6IG1pdG1pc2NzdHIuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKworI2lmbmRlZiBfTUlUTUlTQ1NUUl9IXworI2RlZmluZSBfTUlUTUlTQ1NUUl9IXworCisjaW5jbHVkZSAiTUlUTWlzYy5oIgorCisjZGVmaW5lIE1JVE1JU0NOQU1FICJNSVQtU1VORFJZLU5PTlNUQU5EQVJEIgorCit0eXBlZGVmIHN0cnVjdCBfU2V0QnVnTW9kZSB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIE1JVFJlcUNvZGUgKi8KKyAgICBDQVJEOAltaXRSZXFUeXBlOwkvKiBhbHdheXMgWF9NSVRTZXRCdWdNb2RlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQk9PTAlvbk9mZjsKKyAgICBCWVRFCXBhZDA7CisgICAgQ0FSRDE2CXBhZDE7Cit9IHhNSVRTZXRCdWdNb2RlUmVxOworI2RlZmluZSBzel94TUlUU2V0QnVnTW9kZVJlcQk4CisKK3R5cGVkZWYgc3RydWN0IF9HZXRCdWdNb2RlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgTUlUUmVxQ29kZSAqLworICAgIENBUkQ4CW1pdFJlcVR5cGU7CS8qIGFsd2F5cyBYX01JVEdldEJ1Z01vZGUgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geE1JVEdldEJ1Z01vZGVSZXE7CisjZGVmaW5lIHN6X3hNSVRHZXRCdWdNb2RlUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisgICAgQk9PTAlvbk9mZjsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4TUlUR2V0QnVnTW9kZVJlcGx5OworI2RlZmluZSBzel94TUlUR2V0QnVnTW9kZVJlcGx5CTMyCisKKyNlbmRpZiAvKiBfTUlUTUlTQ1NUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjRjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmLmgKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiAkWG9yZzogbXVsdGlidWYuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQKKyAqCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqLworCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL211bHRpYnVmLmgsdiAzLjQgMjAwMS8xMi8xNCAxOTo1MzoyOCBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9NVUxUSUJVRl9IXworI2RlZmluZSBfTVVMVElCVUZfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKKyNkZWZpbmUgTVVMVElCVUZGRVJfUFJPVE9DT0xfTkFNRSAiTXVsdGktQnVmZmVyaW5nIgorCisjZGVmaW5lIE1VTFRJQlVGRkVSX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBNVUxUSUJVRkZFUl9NSU5PUl9WRVJTSU9OCTEJLyogaGFzIENsZWFySW1hZ2VCdWZmZXJBcmVhICovCisKKyNkZWZpbmUgWF9NYnVmR2V0QnVmZmVyVmVyc2lvbgkJMAorI2RlZmluZSBYX01idWZDcmVhdGVJbWFnZUJ1ZmZlcnMJMQorI2RlZmluZSBYX01idWZEZXN0cm95SW1hZ2VCdWZmZXJzCTIKKyNkZWZpbmUgWF9NYnVmRGlzcGxheUltYWdlQnVmZmVycwkzCisjZGVmaW5lIFhfTWJ1ZlNldE1CdWZmZXJBdHRyaWJ1dGVzCTQKKyNkZWZpbmUgWF9NYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXMJNQorI2RlZmluZSBYX01idWZTZXRCdWZmZXJBdHRyaWJ1dGVzCTYKKyNkZWZpbmUgWF9NYnVmR2V0QnVmZmVyQXR0cmlidXRlcwk3CisjZGVmaW5lIFhfTWJ1ZkdldEJ1ZmZlckluZm8JCTgKKyNkZWZpbmUgWF9NYnVmQ3JlYXRlU3RlcmVvV2luZG93CTkKKyNkZWZpbmUgWF9NYnVmQ2xlYXJJbWFnZUJ1ZmZlckFyZWEJMTAKKworLyoKKyAqIHVwZGF0ZV9hY3Rpb24gZmllbGQKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlclVwZGF0ZUFjdGlvblVuZGVmaW5lZAkwCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlQWN0aW9uQmFja2dyb3VuZAkxCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlQWN0aW9uVW50b3VjaGVkCTIKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVBY3Rpb25Db3BpZWQJCTMKKworLyoKKyAqIHVwZGF0ZV9oaW50IGZpZWxkCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVIaW50RnJlcXVlbnQJCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVIaW50SW50ZXJtaXR0ZW50CTEKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVIaW50U3RhdGljCQkyCisKKy8qCisgKiB2YWx1ZW1hc2sgZmllbGRzCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJXaW5kb3dVcGRhdGVIaW50CSgxTCA8PCAwKQorI2RlZmluZSBNdWx0aWJ1ZmZlckJ1ZmZlckV2ZW50TWFzawkoMUwgPDwgMCkKKworLyoKKyAqIG1vbm8gdnMuIHN0ZXJlbyBhbmQgbGVmdCB2cy4gcmlnaHQKKyAqLworI2RlZmluZSBNdWx0aWJ1ZmZlck1vZGVNb25vCQkwCisjZGVmaW5lIE11bHRpYnVmZmVyTW9kZVN0ZXJlbwkJMQorI2RlZmluZSBNdWx0aWJ1ZmZlclNpZGVNb25vCQkwCisjZGVmaW5lIE11bHRpYnVmZmVyU2lkZUxlZnQJICAJMQorI2RlZmluZSBNdWx0aWJ1ZmZlclNpZGVSaWdodAkJMgorCisvKgorICogY2xvYmJlciBzdGF0ZQorICovCisjZGVmaW5lIE11bHRpYnVmZmVyVW5jbG9iYmVyZWQJCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJQYXJ0aWFsbHlDbG9iYmVyZWQJMQorI2RlZmluZSBNdWx0aWJ1ZmZlckZ1bGx5Q2xvYmJlcmVkCTIKKworLyoKKyAqIGV2ZW50IHN0dWZmCisgKi8KKyNkZWZpbmUgTXVsdGlidWZmZXJDbG9iYmVyTm90aWZ5TWFzawkweDAyMDAwMDAwCisjZGVmaW5lIE11bHRpYnVmZmVyVXBkYXRlTm90aWZ5TWFzawkweDA0MDAwMDAwCisKKyNkZWZpbmUgTXVsdGlidWZmZXJDbG9iYmVyTm90aWZ5CTAKKyNkZWZpbmUgTXVsdGlidWZmZXJVcGRhdGVOb3RpZnkJCTEKKyNkZWZpbmUgTXVsdGlidWZmZXJOdW1iZXJFdmVudHMJCShNdWx0aWJ1ZmZlclVwZGF0ZU5vdGlmeSArIDEpCisKKyNkZWZpbmUgTXVsdGlidWZmZXJCYWRCdWZmZXIJCTAKKyNkZWZpbmUgTXVsdGlidWZmZXJOdW1iZXJFcnJvcnMJCShNdWx0aWJ1ZmZlckJhZEJ1ZmZlciArIDEpCisKKworI2lmbmRlZiBfTVVMVElCVUZfU0VSVkVSXworLyoKKyAqIEV4dHJhIGRlZmluaXRpb25zIHRoYXQgd2lsbCBvbmx5IGJlIG5lZWRlZCBpbiB0aGUgY2xpZW50CisgKi8KK3R5cGVkZWYgWElEIE11bHRpYnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgaW50IHNlbmRfZXZlbnQ7CSAgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tZSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBNdWx0aWJ1ZmZlciBidWZmZXI7CSAgICAvKiBidWZmZXIgb2YgZXZlbnQgKi8KKyAgICBpbnQJc3RhdGU7CQkgICAgLyogc2VlIENsb2JiZXJlZCBjb25zdGFudHMgYWJvdmUgKi8KK30gWG1idWZDbG9iYmVyTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJdHlwZTsJCSAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBpbnQgc2VuZF9ldmVudDsJICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb21lIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkgICAgLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIE11bHRpYnVmZmVyIGJ1ZmZlcjsJICAgIC8qIGJ1ZmZlciBvZiBldmVudCAqLworfSBYbWJ1ZlVwZGF0ZU5vdGlmeUV2ZW50OworCisKKy8qCisgKiBwZXItd2luZG93IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgZ290CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZGlzcGxheWVkX2luZGV4OwkvKiB3aGljaCBidWZmZXIgaXMgYmVpbmcgZGlzcGxheWVkICovCisgICAgaW50IHVwZGF0ZV9hY3Rpb247CQkvKiBVbmRlZmluZWQsIEJhY2tncm91bmQsIFVudG91Y2hlZCwgQ29waWVkICovCisgICAgaW50IHVwZGF0ZV9oaW50OwkJLyogRnJlcXVlbnQsIEludGVybWl0dGVudCwgU3RhdGljICovCisgICAgaW50IHdpbmRvd19tb2RlOwkJLyogTW9ubywgU3RlcmVvICovCisgICAgaW50IG5idWZmZXJzOwkJLyogTnVtYmVyIG9mIGJ1ZmZlcnMgKi8KKyAgICBNdWx0aWJ1ZmZlciAqYnVmZmVyczsJLyogQnVmZmVycyAqLworfSBYbWJ1ZldpbmRvd0F0dHJpYnV0ZXM7CisKKy8qCisgKiBwZXItd2luZG93IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgc2V0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdXBkYXRlX2hpbnQ7CQkvKiBGcmVxdWVudCwgSW50ZXJtaXR0ZW50LCBTdGF0aWMgKi8KK30gWG1idWZTZXRXaW5kb3dBdHRyaWJ1dGVzOworCisKKy8qCisgKiBwZXItYnVmZmVyIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgZ290CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBXaW5kb3cgd2luZG93OwkJLyogd2hpY2ggd2luZG93IHRoaXMgYmVsb25ncyB0byAqLworICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzazsJLyogZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkICovCisgICAgaW50IGJ1ZmZlcl9pbmRleDsJCS8qIHdoaWNoIGJ1ZmZlciBpcyB0aGlzICovCisgICAgaW50IHNpZGU7CQkJLyogTW9ubywgTGVmdCwgUmlnaHQgKi8KK30gWG1idWZCdWZmZXJBdHRyaWJ1dGVzOworCisvKgorICogcGVyLWJ1ZmZlciBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyBldmVudF9tYXNrOwkvKiBldmVudHMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgKi8KK30gWG1idWZTZXRCdWZmZXJBdHRyaWJ1dGVzOworCisKKy8qCisgKiBwZXItc2NyZWVuIGJ1ZmZlciBpbmZvICh0aGVyZSB3aWxsIGJlIGxpc3RzIG9mIHRoZW0pCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBWaXN1YWxJRCB2aXN1YWxpZDsJCS8qIHZpc3VhbCB1c3VhYmxlIGF0IHRoaXMgZGVwdGggKi8KKyAgICBpbnQgbWF4X2J1ZmZlcnM7CQkvKiBtb3N0IGJ1ZmZlcnMgZm9yIHRoaXMgdmlzdWFsICovCisgICAgaW50IGRlcHRoOwkJCS8qIGRlcHRoIG9mIGJ1ZmZlcnMgdG8gYmUgY3JlYXRlZCAqLworfSBYbWJ1ZkJ1ZmZlckluZm87CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIEJvb2wgWG1idWZRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIGV2ZW50X2Jhc2VfcmV0dXJuICovLAorICAgIGludCoJCS8qIGVycm9yX2Jhc2VfcmV0dXJuICovCispOworCitleHRlcm4gU3RhdHVzIFhtYnVmR2V0VmVyc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIG1ham9yX3ZlcnNpb25fcmV0dXJuICovLAorICAgIGludCoJCS8qIG1pbm9yX3ZlcnNpb25fcmV0dXJuICovCispOworCitleHRlcm4gaW50IFhtYnVmQ3JlYXRlQnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJLyogdyAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBpbnQJCQkvKiB1cGRhdGVfYWN0aW9uICovLAorICAgIGludAkJCS8qIHVwZGF0ZV9oaW50ICovLAorICAgIE11bHRpYnVmZmVyKgkvKiBidWZmZXJzICovCispOworCitleHRlcm4gdm9pZCBYbWJ1ZkRlc3Ryb3lCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmRGlzcGxheUJ1ZmZlcnMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQJCQkvKiBjb3VudCAqLywKKyAgICBNdWx0aWJ1ZmZlcioJLyogYnVmZmVycyAqLywKKyAgICBpbnQJCQkvKiBtaW5fZGVsYXkgKi8sCisgICAgaW50CQkJLyogbWF4X2RlbGF5ICovCispOworCitleHRlcm4gU3RhdHVzIFhtYnVmR2V0V2luZG93QXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCQkvKiB3ICovLAorICAgIFhtYnVmV2luZG93QXR0cmlidXRlcyoJLyogYXR0ciAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJCS8qIHcgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogdmFsdWVtYXNrICovLAorICAgIFhtYnVmU2V0V2luZG93QXR0cmlidXRlcyoJLyogYXR0ciAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgTXVsdGlidWZmZXIJCQkvKiBiICovLAorICAgIFhtYnVmQnVmZmVyQXR0cmlidXRlcyoJLyogYXR0ciAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZDaGFuZ2VCdWZmZXJBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIE11bHRpYnVmZmVyCQkJLyogYiAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWG1idWZTZXRCdWZmZXJBdHRyaWJ1dGVzKgkvKiBhdHRyICovCispOworCitleHRlcm4gU3RhdHVzIFhtYnVmR2V0U2NyZWVuSW5mbygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJCS8qIGQgKi8sCisgICAgaW50KgkJCS8qIG5tb25vX3JldHVybiAqLywKKyAgICBYbWJ1ZkJ1ZmZlckluZm8qKgkJLyogbW9ub19pbmZvX3JldHVybiAqLywKKyAgICBpbnQqCQkJLyogbnN0ZXJlb19yZXR1cm4gKi8sCisgICAgWG1idWZCdWZmZXJJbmZvKioJCS8qIHN0ZXJlb19pbmZvX3JldHVybiAqLworKTsKKworZXh0ZXJuIFdpbmRvdyBYbWJ1ZkNyZWF0ZVN0ZXJlb1dpbmRvdygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCQkvKiBwYXJlbnQgKi8sCisgICAgaW50CQkJCS8qIHggKi8sCisgICAgaW50CQkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGJvcmRlcl93aWR0aCAqLywKKyAgICBpbnQJCQkJLyogZGVwdGggKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBjbGFzcyAqLywKKyAgICBWaXN1YWwqCQkJLyogdmlzdWFsICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIHZhbHVlbWFzayAqLywKKyAgICBYU2V0V2luZG93QXR0cmlidXRlcyoJLyogYXR0ciAqLywKKyAgICBNdWx0aWJ1ZmZlcioJCS8qIGxlZnRwICovLAorICAgIE11bHRpYnVmZmVyKgkJLyogcmlnaHRwICovCispOworCitleHRlcm4gdm9pZCBYbWJ1ZkNsZWFyQnVmZmVyQXJlYSgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBNdWx0aWJ1ZmZlcgkJCS8qIGJ1ZmZlciAqLywKKyAgICBpbnQJCQkJLyogeCAqLywKKyAgICBpbnQJCQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIHdpZHRoICovLAorICAgIHVuc2lnbmVkIGludAkJLyogaGVpZ2h0ICovLAorICAgIEJvb2wJCQkvKiBleHBvc3VyZXMgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbHNlCisKKyNpbmNsdWRlICJzY3JuaW50c3RyLmgiCisKK3R5cGVkZWYgQm9vbAkoKiBtYkluaXRGdW5jKSgpOworCitzdHJ1Y3QgX21idWZTY3JlZW47CQkvKiBkZWNsYXJlZCBpbiBtdWx0aWJ1ZnN0LmggKi8KKworZXh0ZXJuIHZvaWQJUmVnaXN0ZXJNdWx0aWJ1ZmZlckluaXQoCisgICAgU2NyZWVuUHRyCQkJLyogcFNjcmVlbiAqLywKKyAgICBCb29sICgqIC8qIGJ1Zk11bHRpYnVmZmVySW5pdCAqLykoCisJU2NyZWVuUHRyCQkvKiBwU2NyZWVuICovLAorCXN0cnVjdCBfbWJ1ZlNjcmVlbiAqCS8qIHBNQlNjcmVlbiAqLworICAgICkKKyk7CisKK3N0cnVjdCB4TWJ1ZkJ1ZmZlckluZm87CQkvKiBkZWNsYXJlZCBpbiBtdWx0aWJ1ZnN0LmggKi8KKworZXh0ZXJuIHZvaWQJUmVnaXN0ZXJEb3VibGVCdWZmZXJIYXJkd2FyZSgKKyAgICBTY3JlZW5QdHIJCQkvKiBwU2NyZWVuICovLAorICAgIGludAkJCQkvKiBuSW5mbyAqLywKKyAgICBzdHJ1Y3QgeE1idWZCdWZmZXJJbmZvICoJLyogcEluZm8gKi8sCisgICAgRGV2VW5pb24gKgkJCS8qIGZyYW1lQnVmZmVyICovLAorICAgIERldlVuaW9uCQkJLyogc2VsZWN0UGxhbmUgKi8sCisgICAgdm9pZCAoKiAvKiBDb3B5QnVmZmVyQml0c0Z1bmMgKi8gKSgpLAorICAgIHZvaWQgKCogLyogRHJhd1NlbGVjdFBsYW5lRnVuYyAqLyApKCkKKyk7CisKK2V4dGVybiBpbnQJQ3JlYXRlSW1hZ2VCdWZmZXJzICgKKyAgICBXaW5kb3dQdHIJCQkvKiBwV2luICovLAorICAgIGludAkJCQkvKiBuYnVmICovLAorICAgIFhJRCAqCQkJLyogaWRzICovLAorICAgIGludAkJCQkvKiBhY3Rpb24gKi8sCisgICAgaW50CQkJCS8qIGhpbnQgKi8KKyk7CitleHRlcm4gdm9pZAlEZXN0cm95SW1hZ2VCdWZmZXJzICgKKyAgICBXaW5kb3dQdHIJCQkvKiBwV2luICovCispOworZXh0ZXJuIGludAlEaXNwbGF5SW1hZ2VCdWZmZXJzICgKKyAgICBYSUQgKgkJCS8qIGlkcyAqLywKKyAgICBpbnQJCQkJLyogbmJ1ZiAqLworKTsKKworI2VuZGlmIC8qIF9NVUxUSUJVRl9TRVJWRVJfICovCisjZW5kaWYgLyogX01VTFRJQlVGX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbXVsdGlidWZzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjlhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmc3QuaApAQCAtMCwwICsxLDYwOSBAQAorLyoKKyAqICRYb3JnOiBtdWx0aWJ1ZnN0LmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKi8KKworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9tdWx0aWJ1ZnN0LmgsdiAzLjggMjAwMS8xMi8xOSAyMTozNzoyOSBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9NVUxUSUJVRlNUX0hfCisjZGVmaW5lIF9NVUxUSUJVRlNUX0hfCisKKy8qCisgKiBQcm90b2NvbCByZXF1ZXN0cyBjb25zdGFudHMgYW5kIGFsaWdubWVudCB2YWx1ZXMKKyAqLworCisjaW5jbHVkZSAibXVsdGlidWYuaCIKKyNpZmRlZiBfTVVMVElCVUZfU0VSVkVSXworI2luY2x1ZGUgImlucHV0c3RyLmgiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFVOSVhDUFApIHx8IGRlZmluZWQoQU5TSUNQUCkKKyNkZWZpbmUgTWJ1ZkdldFJlcShuYW1lLHJlcSxpbmZvKSBHZXRSZXEgKG5hbWUsIHJlcSk7IFwKKwlyZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOyBcCisJcmVxLT5tYnVmUmVxVHlwZSA9IFhfIyNuYW1lOworI2Vsc2UKKyNkZWZpbmUgTWJ1ZkdldFJlcShuYW1lLHJlcSxpbmZvKSBHZXRSZXEgKG5hbWUsIHJlcSk7IFwKKwlyZXEtPnJlcVR5cGUgPSBpbmZvLT5jb2Rlcy0+bWFqb3Jfb3Bjb2RlOyBcCisJcmVxLT5tYnVmUmVxVHlwZSA9IFhfLyoqL25hbWU7CisjZW5kaWYKKworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIERyYXdhYmxlIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgTXVsdGlidWZmZXIgQ0FSRDMyCisKK3R5cGVkZWYgc3RydWN0IHhNYnVmQnVmZmVySW5mbyB7CisJQ0FSRDMyCXZpc3VhbElEIEIzMjsJCS8qIGFzc29jaWF0ZWQgdmlzdWFsICovCisJQ0FSRDE2CW1heEJ1ZmZlcnMgQjE2OwkJLyogbWF4aW11bSBzdXBwb3J0ZWQgYnVmZmVycyAqLworCUNBUkQ4CWRlcHRoOwkJCS8qIGRlcHRoIG9mIHZpc3VhbCAocmVkdW5kYW50KSAqLworCUNBUkQ4CXVudXNlZDsKK30geE1idWZCdWZmZXJJbmZvOworI2RlZmluZSBzel94TWJ1ZkJ1ZmZlckluZm8gOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURSAgICB0eXBlOworICAgIEJZVEUgICAgdW51c2VkOworICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMiAgYnVmZmVyIEIzMjsJCQkvKiBhZmZlY3RlZCBidWZmZXIgKi8KKyAgICBCWVRFICAgIHN0YXRlOwkJCS8qIGN1cnJlbnQgc3RhdHVzICovCisgICAgQ0FSRDggICB1bnVzZWQxOworICAgIENBUkQxNiAgdW51c2VkMiBCMTY7CisgICAgQ0FSRDMyICB1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDQgQjMyOworICAgIENBUkQzMiAgdW51c2VkNSBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQ2IEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDcgQjMyOworfSB4TWJ1ZkNsb2JiZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUgICAgdHlwZTsKKyAgICBCWVRFICAgIHVudXNlZDsKKyAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIgIGJ1ZmZlciBCMzI7CQkJLyogYWZmZWN0ZWQgYnVmZmVyICovCisgICAgQ0FSRDMyICB0aW1lU3RhbXAgQjMyOwkJLyogdXBkYXRlIHRpbWUgKi8KKyAgICBDQVJEMzIgIHVudXNlZDEgQjMyOworICAgIENBUkQzMiAgdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIgIHVudXNlZDQgQjMyOworICAgIENBUkQzMiAgdW51c2VkNSBCMzI7CisgICAgQ0FSRDMyICB1bnVzZWQ2IEIzMjsKK30geE1idWZVcGRhdGVOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkJLyogYWx3YXlzIFhfTWJ1ZkdldEJ1ZmZlclZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geE1idWZHZXRCdWZmZXJWZXJzaW9uUmVxOworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlclZlcnNpb25SZXEJNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQ4CW1ham9yVmVyc2lvbjsJLyogbWFqb3IgdmVyc2lvbiBvZiBNdWx0aS1CdWZmZXJpbmcgcHJvdG9jb2wgKi8KKyAgICBDQVJEOAltaW5vclZlcnNpb247CS8qIG1pbm9yIHZlcnNpb24gb2YgTXVsdGktQnVmZmVyaW5nIHByb3RvY29sICovCisgICAgQ0FSRDE2CXBhZDEgQjE2OworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKKyAgICBDQVJEMzIJcGFkNiBCMzI7Cit9IHhNYnVmR2V0QnVmZmVyVmVyc2lvblJlcGx5OworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlclZlcnNpb25SZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkNyZWF0ZUltYWdlQnVmZmVycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworICAgIENBUkQ4CXVwZGF0ZUFjdGlvbjsJLyogYWN0aW9uIGF0IHVwZGF0ZSAqLworICAgIENBUkQ4CXVwZGF0ZUhpbnQ7CS8qIGhpbnQgYXMgdG8gZnJlcXVlbmN5IG9mIHVwZGF0ZXMgKi8KKyAgICBDQVJEMTYJdW51c2VkOworfSB4TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcTsJLyogZm9sbG93ZWQgYnkgYnVmZmVyIGlkcyAqLworI2RlZmluZSBzel94TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgludW1iZXJCdWZmZXIgQjE2OwkvKiBudW1iZXIgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCAqLworICAgIENBUkQxNgl1bnVzZWQxIEIxNjsKKyAgICBDQVJEMzIJdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDMgQjMyOworICAgIENBUkQzMgl1bnVzZWQ0IEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNSBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDYgQjMyOworfSB4TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcGx5OworI2RlZmluZSBzel94TWJ1ZkNyZWF0ZUltYWdlQnVmZmVyc1JlcGx5IDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmRGVzdHJveUltYWdlQnVmZmVycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQzMgl3aW5kb3cgQjMyOwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworfSB4TWJ1ZkRlc3Ryb3lJbWFnZUJ1ZmZlcnNSZXE7CisjZGVmaW5lIHN6X3hNYnVmRGVzdHJveUltYWdlQnVmZmVyc1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmRGlzcGxheUltYWdlQnVmZmVycyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQxNgltaW5EZWxheSBCMTY7CS8qIG1pbmltdW0gdGltZSBiZXR3ZWVuIGxhc3QgdXBkYXRlIGFuZCBub3cgKi8KKyAgICBDQVJEMTYJbWF4RGVsYXkgQjE2OwkvKiBtYXhpbXVtIHRpbWUgYmV0d2VlbiBsYXN0IHVwZGF0ZSBhbmQgbm93ICovCit9IHhNYnVmRGlzcGxheUltYWdlQnVmZmVyc1JlcTsJLyogZm9sbG93ZWQgYnkgbGlzdCBvZiBidWZmZXJzICovCisjZGVmaW5lIHN6X3hNYnVmRGlzcGxheUltYWdlQnVmZmVyc1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgY29kZXMtPm1ham9yX29wY29kZSAqLworICAgIENBUkQ4CW1idWZSZXFUeXBlOwkvKiBhbHdheXMgWF9NYnVmU2V0TUJ1ZmZlckF0dHJpYnV0ZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJd2luZG93IEIzMjsJLyogYXNzb2NpYXRlZCB3aW5kb3cgKi8KKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsJLyogbW9kaWZpZWQgZW50cmllcyAqLworfSB4TWJ1ZlNldE1CdWZmZXJBdHRyaWJ1dGVzUmVxOwkvKiBmb2xsb3dlZCBieSB2YWx1ZXMgKi8KKyNkZWZpbmUgc3pfeE1idWZTZXRNQnVmZmVyQXR0cmlidXRlc1JlcSAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkdldE1CdWZmZXJBdHRyaWJ1dGVzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCXdpbmRvdyBCMzI7CS8qIGFzc29jaWF0ZWQgd2luZG93ICovCit9IHhNYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXNSZXE7CisjZGVmaW5lIHN6X3hNYnVmR2V0TUJ1ZmZlckF0dHJpYnV0ZXNSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNglkaXNwbGF5ZWRCdWZmZXIgQjE2OwkvKiBjdXJyZW50bHkgdmlzaWJsZSBidWZmZXIgKi8KKyAgICBDQVJEOAl1cGRhdGVBY3Rpb247CisgICAgQ0FSRDgJdXBkYXRlSGludDsKKyAgICBDQVJEOAl3aW5kb3dNb2RlOworICAgIENBUkQ4CXVudXNlZDA7CisgICAgQ0FSRDE2CXVudXNlZDEgQjE2OworICAgIENBUkQzMgl1bnVzZWQyIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMyBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDQgQjMyOworICAgIENBUkQzMgl1bnVzZWQ1IEIzMjsKK30geE1idWZHZXRNQnVmZmVyQXR0cmlidXRlc1JlcGx5OworI2RlZmluZSBzel94TWJ1ZkdldE1CdWZmZXJBdHRyaWJ1dGVzUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZTZXRCdWZmZXJBdHRyaWJ1dGVzICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDMyCWJ1ZmZlciBCMzI7CisgICAgQ0FSRDMyCXZhbHVlTWFzayBCMzI7Cit9IHhNYnVmU2V0QnVmZmVyQXR0cmlidXRlc1JlcTsJLyogZm9sbG93ZWQgYnkgdmFsdWVzICovCisjZGVmaW5lIHN6X3hNYnVmU2V0QnVmZmVyQXR0cmlidXRlc1JlcSAxMgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXMgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIJYnVmZmVyIEIzMjsKK30geE1idWZHZXRCdWZmZXJBdHRyaWJ1dGVzUmVxOworI2RlZmluZSBzel94TWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXNSZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAl1bnVzZWQ7CQkJLyogbm90IHVzZWQgKi8KKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMgl3aW5kb3cgQjMyOworICAgIENBUkQzMglldmVudE1hc2sgQjMyOworICAgIENBUkQxNglidWZmZXJJbmRleCBCMTY7CisgICAgQ0FSRDgJc2lkZTsKKyAgICBDQVJEOAl1bnVzZWQwOworICAgIENBUkQzMgl1bnVzZWQxIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkMiBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDMgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckF0dHJpYnV0ZXNSZXBseTsKKyNkZWZpbmUgc3pfeE1idWZHZXRCdWZmZXJBdHRyaWJ1dGVzUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBjb2Rlcy0+bWFqb3Jfb3Bjb2RlICovCisgICAgQ0FSRDgJbWJ1ZlJlcVR5cGU7CS8qIGFsd2F5cyBYX01idWZHZXRCdWZmZXJJbmZvICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckluZm9SZXE7CisjZGVmaW5lIHN6X3hNYnVmR2V0QnVmZmVySW5mb1JlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIENBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgQ0FSRDE2CW5vcm1hbEluZm8gQjE2OworICAgIENBUkQxNglzdGVyZW9JbmZvIEIxNjsKKyAgICBDQVJEMzIJdW51c2VkMSBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDIgQjMyOworICAgIENBUkQzMgl1bnVzZWQzIEIzMjsKKyAgICBDQVJEMzIJdW51c2VkNCBCMzI7CisgICAgQ0FSRDMyCXVudXNlZDUgQjMyOworfSB4TWJ1ZkdldEJ1ZmZlckluZm9SZXBseTsJCQkvKiBmb2xsb3dlZCBieSBidWZmZXIgaW5mb3MgKi8KKyNkZWZpbmUgc3pfeE1idWZHZXRCdWZmZXJJbmZvUmVwbHkgMzIKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOAltYnVmUmVxVHlwZTsJLyogYWx3YXlzIFhfTWJ1ZkNyZWF0ZVN0ZXJlb1dpbmRvdyAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CXVudXNlZDA7CisgICAgQ0FSRDgJdW51c2VkMTsKKyAgICBDQVJEOAl1bnVzZWQyOworICAgIENBUkQ4CWRlcHRoOworICAgIFdpbmRvdwl3aWQgQjMyOworICAgIFdpbmRvdwlwYXJlbnQgQjMyOworICAgIE11bHRpYnVmZmVyCWxlZnQgQjMyOwkvKiBhc3NvY2lhdGVkIGJ1ZmZlcnMgKi8KKyAgICBNdWx0aWJ1ZmZlcglyaWdodCBCMzI7CisgICAgSU5UMTYJeCBCMTY7CisgICAgSU5UMTYJeSBCMTY7CisgICAgQ0FSRDE2CXdpZHRoIEIxNjsKKyAgICBDQVJEMTYJaGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYJYm9yZGVyV2lkdGggQjE2OyAgCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorICAgIENBUkQxNgljX2NsYXNzIEIxNjsKKyNlbHNlCisgICAgQ0FSRDE2CWNsYXNzIEIxNjsKKyNlbmRpZgorICAgIFZpc3VhbElECXZpc3VhbCBCMzI7CisgICAgQ0FSRDMyCW1hc2sgQjMyOworfSB4TWJ1ZkNyZWF0ZVN0ZXJlb1dpbmRvd1JlcTsJCS8qIGZvbGxvd2VkIGJ5IHZhbHVlIGxpc3QgKi8KKyNkZWZpbmUgc3pfeE1idWZDcmVhdGVTdGVyZW9XaW5kb3dSZXEgNDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIGNvZGVzLT5tYWpvcl9vcGNvZGUgKi8KKyAgICBDQVJEOCAgICAgbWJ1ZlJlcVR5cGU7ICAgIC8qIGFsd2F5cyBYX01idWZDbGVhckltYWdlQnVmZmVyQXJlYSAqLworICAgIENBUkQxNiAgICBsZW5ndGggQjE2OworICAgIE11bHRpYnVmZmVyICAgICAgIGJ1ZmZlciBCMzI7CisgICAgSU5UMTYgICAgIHggQjE2OworICAgIElOVDE2ICAgICB5IEIxNjsKKyAgICBDQVJEMTYgICAgd2lkdGggQjE2OworICAgIENBUkQxNiAgICBoZWlnaHQgQjE2OworICAgIENBUkQ4ICAgICB1bnVzZWQwOworICAgIENBUkQ4ICAgICB1bnVzZWQxOworICAgIENBUkQ4ICAgICB1bnVzZWQyOworICAgIEJPT0wgICAgICBleHBvc3VyZXM7Cit9IHhNYnVmQ2xlYXJJbWFnZUJ1ZmZlckFyZWFSZXE7CisjZGVmaW5lIHN6X3hNYnVmQ2xlYXJJbWFnZUJ1ZmZlckFyZWFSZXEgMjAKKworI3VuZGVmIFdpbmRvdworI3VuZGVmIERyYXdhYmxlCisjdW5kZWYgVmlzdWFsSUQKKyN1bmRlZiBNdWx0aWJ1ZmZlcgorCisKKyNpZmRlZiBfTVVMVElCVUZfU0VSVkVSXworLyogTWFjcm9zIGZvciB3cmFwcGluZyBhbmQgdW53cmFwcGluZyBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBTV0FQX0ZVTkNfVkVDVE9SKHBTVFJVQ1QxLHBTVFJVQ1QyLERBVEFfVFlQRSxGVU5DX05BTUUpCQlcCit7CQkJCQkJCQkJXAorICAgIERBVEFfVFlQRSAoKiB0bXBGbikoKTsJCQkJCQlcCisgICAgCQkJCQkJCQkJXAorICAgIHRtcEZuID0gcFNUUlVDVDEtPkZVTkNfTkFNRTsJCQkJCVwKKyAgICBwU1RSVUNUMS0+RlVOQ19OQU1FID0gcFNUUlVDVDItPkZVTkNfTkFNRTsJCQkJXAorICAgIHBTVFJVQ1QyLT5GVU5DX05BTUUgPSB0bXBGbjsJCQkJCVwKK30KKworI2lmICFkZWZpbmVkKFVOSVhDUFApIHx8IGRlZmluZWQoQU5TSUNQUCkKKyNkZWZpbmUgV1JBUF9TQ1JFRU5fRlVOQyhwU0NSRUVOLHBQUklWLEZVTkNfTkFNRSwgUFJJVl9GVU5DX05BTUUpCVwKK3sJCQkJCQkJCQlcCisgICAgaWYgKChwUFJJVi0+ZnVuY3NXcmFwcGVkICYgRlVOQ19OQU1FIyNNYXNrKSA9PSAwKQkJCVwKKyAgICB7CQkJCQkJCQkJXAorCXBQUklWLT5GVU5DX05BTUUgICA9IHBTQ1JFRU4tPkZVTkNfTkFNRTsJCQlcCisJcFNDUkVFTi0+RlVOQ19OQU1FID0gUFJJVl9GVU5DX05BTUU7CQkJCVwKKwlwUFJJVi0+ZnVuY3NXcmFwcGVkIHw9IEZVTkNfTkFNRSMjTWFzazsJCQkJXAorICAgIH0JCQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVU5XUkFQX1NDUkVFTl9GVU5DKHBTQ1JFRU4scFBSSVYsREFUQV9UWVBFLEZVTkNfTkFNRSkJCVwKK3sJCQkJCQkJCQlcCisgICAgU1dBUF9GVU5DX1ZFQ1RPUihwU0NSRUVOLHBQUklWLERBVEFfVFlQRSxGVU5DX05BTUUpOwkJXAorICAgIHBQUklWLT5mdW5jc1dyYXBwZWQgJj0gfihGVU5DX05BTUUjI01hc2spOwkJCQlcCit9CisKKyNkZWZpbmUgUkVXUkFQX1NDUkVFTl9GVU5DKHBTQ1JFRU4scFBSSVYsREFUQV9UWVBFLEZVTkNfTkFNRSkJCVwKK3sJCQkJCQkJCQlcCisgICAgaWYgKE1CX1NDUkVFTl9QUklWKHBTQ1JFRU4pLT5tYnVmV2luZG93Q291bnQpCQkJXAorICAgIHsJCQkJCQkJCQlcCisJU1dBUF9GVU5DX1ZFQ1RPUihwU0NSRUVOLHBQUklWLERBVEFfVFlQRSxGVU5DX05BTUUpOwkJXAorCXBQUklWLT5mdW5jc1dyYXBwZWQgfD0gRlVOQ19OQU1FIyNNYXNrOwkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30KKyNlbHNlCisjZGVmaW5lIFdSQVBfU0NSRUVOX0ZVTkMocFNDUkVFTixwUFJJVixGVU5DX05BTUUsIFBSSVZfRlVOQ19OQU1FKQlcCit7CQkJCQkJCQkJXAorICAgIGlmICgocFBSSVYtPmZ1bmNzV3JhcHBlZCAmIEZVTkNfTkFNRS8qKi9NYXNrKSA9PSAwKQkJCVwKKyAgICB7CQkJCQkJCQkJXAorCXBQUklWLT5GVU5DX05BTUUgICA9IHBTQ1JFRU4tPkZVTkNfTkFNRTsJCQlcCisJcFNDUkVFTi0+RlVOQ19OQU1FID0gUFJJVl9GVU5DX05BTUU7CQkJCVwKKwlwUFJJVi0+ZnVuY3NXcmFwcGVkIHw9IEZVTkNfTkFNRS8qKi9NYXNrOwkJCVwKKyAgICB9CQkJCQkJCQkJXAorfQorCisjZGVmaW5lIFVOV1JBUF9TQ1JFRU5fRlVOQyhwU0NSRUVOLHBQUklWLERBVEFfVFlQRSxGVU5DX05BTUUpCQlcCit7CQkJCQkJCQkJXAorICAgIFNXQVBfRlVOQ19WRUNUT1IocFNDUkVFTixwUFJJVixEQVRBX1RZUEUsRlVOQ19OQU1FKTsJCVwKKyAgICBwUFJJVi0+ZnVuY3NXcmFwcGVkICY9IH4oRlVOQ19OQU1FLyoqL01hc2spOwkJCVwKK30KKworI2RlZmluZSBSRVdSQVBfU0NSRUVOX0ZVTkMocFNDUkVFTixwUFJJVixEQVRBX1RZUEUsRlVOQ19OQU1FKQkJXAorewkJCQkJCQkJCVwKKyAgICBpZiAoTUJfU0NSRUVOX1BSSVYocFNDUkVFTiktPm1idWZXaW5kb3dDb3VudCkJCQlcCisgICAgewkJCQkJCQkJCVwKKwlTV0FQX0ZVTkNfVkVDVE9SKHBTQ1JFRU4scFBSSVYsREFUQV9UWVBFLEZVTkNfTkFNRSk7CQlcCisJcFBSSVYtPmZ1bmNzV3JhcHBlZCB8PSBGVU5DX05BTUUvKiovTWFzazsJCQlcCisgICAgfQkJCQkJCQkJCVwKK30KKyNlbmRpZgorCisvKiBUaGUgX011bHRpYnVmZmVyIGFuZCBfTXVsdGlidWZmZXJzIHN0cnVjdHVyZXMgYmVsb3cgcmVmZXIgdG8gZWFjaCBvdGhlciwKKyAqIHNvIHdlIG5lZWQgdGhpcyBmb3J3YXJkIGRlY2xhcmF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9NdWx0aWJ1ZmZlcnMJKk11bHRpYnVmZmVyc1B0cjsKKworLyoKKyAqIHBlci1NdWx0aWJ1ZmZlciBkYXRhCisgKi8KKyAKK3R5cGVkZWYgc3RydWN0IF9NdWx0aWJ1ZmZlciB7CisgICAgTXVsdGlidWZmZXJzUHRyIHBNdWx0aWJ1ZmZlcnM7ICAvKiBhc3NvY2lhdGVkIHdpbmRvdyBkYXRhICovCisgICAgTWFzawkgICAgZXZlbnRNYXNrOwkgICAgLyogTXVsdGlidWZmZXJDbG9iYmVyTm90aWZ5TWFza3xFeHBvc3VyZU1hc2t8TXVsdGlidWZmZXJVcGRhdGVOb3RpZnlNYXNrICovCisgICAgTWFzawkgICAgb3RoZXJFdmVudE1hc2s7IC8qIG1hc2sgb2YgYWxsIG90aGVyIGNsaWVudHMgZXZlbnQgbWFza3MgKi8KKyAgICBPdGhlckNsaWVudHMgICAgKm90aGVyQ2xpZW50czsgIC8qIG90aGVyIGNsaWVudHMgdGhhdCB3YW50IGV2ZW50cyAqLworICAgIGludAkJICAgIG51bWJlcjsJICAgIC8qIGluZGV4IG9mIHRoaXMgYnVmZmVyIGludG8gYXJyYXkgKi8KKyAgICBpbnQJCSAgICBzaWRlOwkgICAgLyogYWx3YXlzIE1vbm8gKi8KKyAgICBpbnQJCSAgICBjbG9iYmVyOwkgICAgLyogVW5jbG9iYmVyZWQsIFBhcnRpYWxseUNsb2JiZXJlZCwgRnVsbENsb2JiZXJlZCAqLworICAgIFBpeG1hcFB0cgkgICAgcFBpeG1hcDsJICAgIC8qIGFzc29jaWF0ZWQgcGl4bWFwICovCit9IE11bHRpYnVmZmVyUmVjLCAqTXVsdGlidWZmZXJQdHI7CisKKy8qCisgKiBwZXItd2luZG93IGRhdGEKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfTXVsdGlidWZmZXJzIHsKKyAgICBXaW5kb3dQdHIJcFdpbmRvdzsJCS8qIGFzc29jaWF0ZWQgd2luZG93ICovCisgICAgaW50CQludW1NdWx0aWJ1ZmZlcjsJCS8qIGNvdW50IG9mIGJ1ZmZlcnMgKi8KKyAgICBpbnQJCXJlZmNudDsJCQkvKiByZWYgY291bnQgZm9yIGRlbGV0ZSAqLworICAgIGludAkJZGlzcGxheWVkTXVsdGlidWZmZXI7CS8qIGN1cnJlbnRseSBhY3RpdmUgYnVmZmVyICovCisgICAgaW50CQl1cGRhdGVBY3Rpb247CQkvKiBVbmRlZmluZWQsIEJhY2tncm91bmQsIFVudG91Y2hlZCwgQ29waWVkICovCisgICAgaW50CQl1cGRhdGVIaW50OwkJLyogRnJlcXVlbnQsIEludGVybWl0dGVudCwgU3RhdGljICovCisgICAgaW50CQl3aW5kb3dNb2RlOwkJLyogYWx3YXlzIE1vbm8gKi8KKworICAgIFRpbWVTdGFtcAlsYXN0VXBkYXRlOwkJLyogdGltZSBvZiBsYXN0IHVwZGF0ZSAqLworCisgICAgdW5zaWduZWQgc2hvcnQJd2lkdGgsIGhlaWdodDsJLyogbGFzdCBrbm93biB3aW5kb3cgc2l6ZSAqLworICAgIHNob3J0CQl4LCB5OwkJLyogZm9yIHN0YXRpYyBncmF2aXR5ICovCisKKyAgICBNdWx0aWJ1ZmZlclB0cglidWZmZXJzOyAgICAgICAgLyogYXJyYXkgb2YgbnVtTXVsdGlidWZmZXIgYnVmZmVycyAqLworfSBNdWx0aWJ1ZmZlcnNSZWM7CisKKy8qCisgKiBwZXItc2NyZWVuIGRhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX011bHRpYnVmZmVyU2NyZWVuIHsKKyAgICBQb3NpdGlvbldpbmRvd1Byb2NQdHIgUG9zaXRpb25XaW5kb3c7CQkvKiBwV2luLCB4LHkgKi8KK30gTXVsdGlidWZmZXJTY3JlZW5SZWMsICpNdWx0aWJ1ZmZlclNjcmVlblB0cjsKKworLyoKKyAqIHBlciBkaXNwbGF5LWltYWdlLWJ1ZmZlcnMgcmVxdWVzdCBkYXRhLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9EaXNwbGF5UmVxdWVzdCB7CisgICAgc3RydWN0IF9EaXNwbGF5UmVxdWVzdAkqbmV4dDsKKyAgICBUaW1lU3RhbXAJCQlhY3RpdmF0ZVRpbWU7CisgICAgQ2xpZW50UHRyCQkJcENsaWVudDsKKyAgICBYSUQJCQkJaWQ7Cit9IERpc3BsYXlSZXF1ZXN0UmVjLCAqRGlzcGxheVJlcXVlc3RQdHI7CisKKyNkZWZpbmUgRGVzdHJveVdpbmRvd01hc2sJCSgxTDw8MCkKKyNkZWZpbmUgUG9zaXRpb25XaW5kb3dNYXNrCQkoMUw8PDEpCisjZGVmaW5lIFBvc3RWYWxpZGF0ZVRyZWVNYXNrCQkoMUw8PDIpCisjZGVmaW5lIENsaXBOb3RpZnlNYXNrCQkJKDFMPDwzKQorI2RlZmluZSBXaW5kb3dFeHBvc3VyZXNNYXNrCQkoMUw8PDQpCisjZGVmaW5lIENvcHlXaW5kb3dNYXNrCQkJKDFMPDw1KQorI2RlZmluZSBDbGVhclRvQmFja2dyb3VuZE1hc2sJCSgxTDw8NikKKyNkZWZpbmUgQ2hhbmdlV2luZG93QXR0cmlidXRlc01hc2sJKDFMPDw3KSAgICAKKworZXh0ZXJuIGludAkJTXVsdGlidWZmZXJTY3JlZW5JbmRleDsKK2V4dGVybiBpbnQJCU11bHRpYnVmZmVyV2luZG93SW5kZXg7CisKK2V4dGVybiBSRVNUWVBFCQlNdWx0aWJ1ZmZlckRyYXdhYmxlUmVzVHlwZTsKKworZXh0ZXJuIHZvaWQJCU11bHRpYnVmZmVyVXBkYXRlKAkvKiBwTWJ1ZmZlciwgdGltZSAqLworCQkJCU11bHRpYnVmZmVyUHRyIC8qIHBNdWx0aWJ1ZmZlciAqLywKKwkJCQlDQVJEMzIgLyogdGltZSAqLworCQkJCSk7CitleHRlcm4gdm9pZAkJTXVsdGlidWZmZXJFeHBvc2UoCS8qIHBNYnVmZmVyLCBwUmVnaW9uICovCisJCQkJTXVsdGlidWZmZXJQdHIgLyogcE11bHRpYnVmZmVyICovLAorCQkJCVJlZ2lvblB0ciAvKiBwUmVnaW9uICovCisJCQkJKTsKK2V4dGVybiB2b2lkCQlNdWx0aWJ1ZmZlckNsb2JiZXIoCS8qIHBNYnVmZmVyICovCisJCQkJTXVsdGlidWZmZXJQdHIgLyogcE11bHRpYnVmZmVyICovCisJCQkJKTsKKwordHlwZWRlZiBzdHJ1Y3QgX21idWZXaW5kb3cJKm1idWZXaW5kb3dQdHI7CisKKy8qCisgKiBwZXItYnVmZmVyIGRhdGEKKyAqLworCisjZGVmaW5lIE1CX0RJU1BMQVlFRF9CVUZGRVIocE1CV2luZG93KSBcCisgICAgKChwTUJXaW5kb3cpLT5idWZmZXJzICsgKHBNQldpbmRvdyktPmRpc3BsYXllZE11bHRpYnVmZmVyKQorIAordHlwZWRlZiBzdHJ1Y3QgX21idWZCdWZmZXIgeworICAgIG1idWZXaW5kb3dQdHIgICBwTUJXaW5kb3c7CSAgICAvKiBhc3NvY2lhdGVkIHdpbmRvdyBkYXRhICovCisgICAgTWFzawkgICAgZXZlbnRNYXNrOwkgICAgLyogY2xpZW50IGV2ZW50IG1hc2sgKi8KKyAgICBNYXNrCSAgICBvdGhlckV2ZW50TWFzazsgLyogdW5pb24gb2Ygb3RoZXIgY2xpZW50cycgZXZlbnQgbWFza3MgKi8KKyAgICBPdGhlckNsaWVudHNQdHIgb3RoZXJDbGllbnRzOyAgIC8qIG90aGVyIGNsaWVudHMgdGhhdCB3YW50IGV2ZW50cyAqLworICAgIGludAkJICAgIG51bWJlcjsJICAgIC8qIGluZGV4IG9mIHRoaXMgYnVmZmVyIGludG8gYXJyYXkgKi8KKyAgICBpbnQJCSAgICBzaWRlOwkgICAgLyogc3Rlcm8gc2lkZTogYWx3YXlzIE1vbm8gKi8KKyAgICBpbnQJCSAgICBjbG9iYmVyOwkgICAgLyogY2xvYmVyIHN0YXRlICovCisgICAgRHJhd2FibGVQdHIJICAgIHBEcmF3YWJsZTsJICAgIC8qIGFzc29jaWF0ZWQgZHJhd2FibGUgKi8KK30gbWJ1ZkJ1ZmZlclJlYywgKm1idWZCdWZmZXJQdHI7CisKKworLyoKKyAqIHBlci13aW5kb3cgZGF0YQorICovCisKKyNkZWZpbmUgTUJfV0lORE9XX1BSSVYocFdpbikgXAorICAgICgobWJ1ZldpbmRvd1B0cikoKHBXaW4pLT5kZXZQcml2YXRlc1tNdWx0aWJ1ZmZlcldpbmRvd0luZGV4XS5wdHIpKQorCit0eXBlZGVmIHN0cnVjdCBfbWJ1ZldpbmRvdyB7CisgICAgV2luZG93UHRyCXBXaW5kb3c7CQkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworICAgIGludAkJbnVtTXVsdGlidWZmZXI7CQkvKiBjb3VudCBvZiBidWZmZXJzICovCisgICAgbWJ1ZkJ1ZmZlclB0ciBidWZmZXJzOwkJLyogYXJyYXkgb2YgKG51bU11bHRpYnVmZmVyKSBidWZmZXJzICovCisgICAgaW50CQlkaXNwbGF5ZWRNdWx0aWJ1ZmZlcjsJLyogY3VycmVudGx5IGFjdGl2ZSBidWZmZXIgKi8KKyAgICBpbnQJCXVwZGF0ZUFjdGlvbjsJCS8qIFVuZGVmaW5lZCwgQmFja2dyb3VuZCwKKwkJCQkJICAgVW50b3VjaGVkLCBDb3BpZWQgKi8KKyAgICBpbnQJCXVwZGF0ZUhpbnQ7CQkvKiBGcmVxdWVudCwgSW50ZXJtaXR0ZW50LCBTdGF0aWMgKi8KKyAgICBpbnQJCXdpbmRvd01vZGU7CQkvKiBhbHdheXMgTW9ubyAqLworICAgIFRpbWVTdGFtcAlsYXN0VXBkYXRlOwkJLyogdGltZSBvZiBsYXN0IHVwZGF0ZSAqLworICAgIHNob3J0CQl4LCB5OwkJLyogZm9yIHN0YXRpYyBncmF2aXR5ICovCisgICAgdW5zaWduZWQgc2hvcnQJd2lkdGgsIGhlaWdodDsJLyogbGFzdCBrbm93biB3aW5kb3cgc2l6ZSAqLworICAgIERldlVuaW9uCQlkZXZQcml2YXRlOworfSBtYnVmV2luZG93UmVjOworCisKKy8qCisgKiBwZXItc2NyZWVuIGRhdGEKKyAqLworCisjZGVmaW5lIE1CX1NDUkVFTl9QUklWKHBTY3JlZW4pIFwKKyAgICAoKG1idWZTY3JlZW5QdHIpKChwU2NyZWVuKS0+ZGV2UHJpdmF0ZXNbTXVsdGlidWZmZXJTY3JlZW5JbmRleF0ucHRyKSkKKwordHlwZWRlZiBzdHJ1Y3QgX21idWZTY3JlZW4geworICAgIGxvbmcgbWJ1ZldpbmRvd0NvdW50OwkJLyogY291bnQgb2YgbXVsdGlidWZmZXJlZCB3aW5kb3dzICovCisKKyAgICAvKiBXcmFwIHBTY3JlZW4tPkRlc3Ryb3lXaW5kb3cgKi8KKyAgICBEZXN0cm95V2luZG93UHJvY1B0ciBEZXN0cm95V2luZG93OworICAgIGxvbmcgZnVuY3NXcmFwcGVkOwkJCS8qIGZsYWdzIHdoaWNoIGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCAqLworCisgICAgLyogSW5pdGlhbGl6ZWQgYnkgZGV2aWNlLWRlcGVuZGVudCBzZWN0aW9uICovCisgICAgaW50ICBuSW5mbzsJCQkJLyogbnVtYmVyIG9mIGJ1ZmZlciBpbmZvIHJlYydzICovCisgICAgeE1idWZCdWZmZXJJbmZvICpwSW5mbzsJCS8qIGJ1ZmZlciBpbmZvIChmb3IgTm9ybWFsIGJ1ZmZlcnMpICovCisKKyAgICBpbnQgICgqIENyZWF0ZUltYWdlQnVmZmVycykoCisJCVdpbmRvd1B0cgkJLyogcFdpbiAqLywKKwkJaW50CQkJLyogbmJ1ZiAqLywKKwkJWElEICoJCQkvKiBpZHMgKi8sCisJCWludAkJCS8qIGFjdGlvbiAqLywKKwkJaW50CQkJLyogaGludCAqLworICAgIAkJKTsKKyAgICB2b2lkICgqIERlc3Ryb3lJbWFnZUJ1ZmZlcnMpKAorCQlXaW5kb3dQdHIJCS8qIHBXaW4gKi8KKyAgICAJCSk7CisgICAgdm9pZCAoKiBEaXNwbGF5SW1hZ2VCdWZmZXJzKSgKKwkJU2NyZWVuUHRyCQkvKiBwU2NyZWVuICovLAorCQltYnVmQnVmZmVyUHRyICoJCS8qIHBwTUJCdWZmZXIgKi8sCisJCW1idWZXaW5kb3dQdHIgKgkJLyogcHBNQldpbmRvdyAqLywKKwkJaW50CQkJLyogbmJ1ZiAqLworICAgIAkJKTsKKyAgICB2b2lkICgqIENsZWFySW1hZ2VCdWZmZXJBcmVhKSgKKwkJbWJ1ZkJ1ZmZlclB0cgkJLyogcE1CQnVmZmVyICovLAorCQlzaG9ydAkJCS8qIHggKi8sCisJCXNob3J0CQkJLyogeSAqLywKKwkJdW5zaWduZWQgc2hvcnQJCS8qIHdpZHRoICovLAorCQl1bnNpZ25lZCBzaG9ydAkJLyogaGVpZ2h0ICovLAorCQlCb29sCQkJLyogZXhwb3N1cmVzICovCisgICAgCQkpOworICAgIEJvb2wgKCogQ2hhbmdlTUJ1ZmZlckF0dHJpYnV0ZXMpKAkvKiBwTUJXaW5kb3csIHZtYXNrICovIAorICAgIAkJLyogRklYTUUgKi8KKyAgICAJCSk7CisgICAgQm9vbCAoKiBDaGFuZ2VCdWZmZXJBdHRyaWJ1dGVzKSgJLyogcE1CQnVmZmVyLCB2bWFzayAqLworICAgIAkJLyogRklYTUUgKi8KKyAgICAJCSk7CisgICAgdm9pZCAoKiBEZWxldGVCdWZmZXJEcmF3YWJsZSkoCisJCURyYXdhYmxlUHRyCQkvKiBwRHJhd2FibGUgKi8KKyAgICAJCSk7CisgICAgdm9pZCAoKiBXcmFwU2NyZWVuRnVuY3MpKAorCQlTY3JlZW5QdHIJCS8qIHBTY3JlZW4gKi8KKyAgICAJCSk7CisgICAgdm9pZCAoKiBSZXNldFByb2MpKAorCQlTY3JlZW5QdHIJCS8qIHBTY3JlZW4gKi8KKyAgICAJCSk7CisgICAgRGV2VW5pb24JZGV2UHJpdmF0ZTsKK30gbWJ1ZlNjcmVlblJlYywgKm1idWZTY3JlZW5QdHI7CisKKworLyogUHJpdmF0ZXMgdG8gbWJ1ZlNjcmVlblJlYyAqLworCisjaWZkZWYgX01VTFRJQlVGX1BJWE1BUF8KKyNkZWZpbmUgTUJfU0NSRUVOX1BSSVZfUElYTUFQKHBTY3JlZW4pIFwKKyAgICAoKG1idWZQaXhtYXBQcml2UHRyKSBNQl9TQ1JFRU5fUFJJVigocFNjcmVlbikpLT5kZXZQcml2YXRlLnB0cikKKwordHlwZWRlZiBzdHJ1Y3QgX21idWZQaXhtYXBQcml2Cit7CisgICAgLyogUG9pbnRlcnMgdG8gd3JhcHBlZCBmdW5jdGlvbnMgKi8KKyAgICBQb3NpdGlvbldpbmRvd1Byb2NQdHIgUG9zaXRpb25XaW5kb3c7CQkvKiBwV2luLCB4LHkgKi8KKyAgICBsb25nIGZ1bmNzV3JhcHBlZDsJCQkvKiBmbGFncyB3aGljaCBmdW5jdGlvbnMgYXJlIHdyYXBwZWQgKi8KK30gbWJ1ZlBpeG1hcFByaXZSZWMsICptYnVmUGl4bWFwUHJpdlB0cjsKKyNlbmRpZiAvKiBfTVVMVElCVUZfUElYTUFQXyAqLworCisKKyNpZmRlZiBfTVVMVElCVUZfQlVGRkVSXworCitleHRlcm4gaW50IGZyYW1lV2luZG93UHJpdmF0ZUluZGV4OworCisjZGVmaW5lIE1CX1NDUkVFTl9QUklWX0JVRkZFUihwU2NyZWVuKSBcCisgICAgKChtYnVmQnVmZmVyUHJpdlB0cikgTUJfU0NSRUVOX1BSSVYoKHBTY3JlZW4pKS0+ZGV2UHJpdmF0ZS5wdHIpCisKK3R5cGVkZWYgc3RydWN0IF9tYnVmQnVmZmVyUHJpdgoreworICAgIERldlVuaW9uCSpmcmFtZUJ1ZmZlcjsJLyogQXJyYXkgb2Ygc2NyZWVuIGZyYW1lYnVmZmVycyAqLworICAgIERldlVuaW9uCXNlbGVjdFBsYW5lOwkvKiBQbGFuZShzKSB0aGF0IHNlbGVjdCBkaXNwbGF5ZWQgYnVmZmVyICovCisKKyAgICAvKiAKKyAgICAgKiBOb3RlOiBzdWJ0cmFjdFJnbiBhbmQgdW5pb25SZ24gbWF5IG92ZXJsYXAuIHN1YnRyYWN0UmduIGlzIGEgdW5pb24KKyAgICAgKiBvZiBhbGwgdGhlIG9sZCBjbGlwTGlzdHMgb2YgdGhlIHdpbmRvd3MgdGhhdCBhcmUgZGlzcGxheWluZworICAgICAqIHRoZSBiYWNrYnVmZmVyLiB1bmlvblJnbiBpcyB0aGUgdW5pb24gb2YgYWxsIHRoZSBuZXcgY2xpcExpc3RzCisgICAgICogb2YgdGhlIHNhbWUgd2luZG93cy4KKyAgICAgKi8KKworICAgIFJlZ2lvblJlYwliYWNrQnVmZmVyOwkvKiBBcmVhIG9mIHNjcmVlbiBkaXNwbGF5aW5nIGJhY2sgYnVmZmVyICovCisgICAgUmVnaW9uUmVjICAgc3VidHJhY3RSZ247CS8qIFJlZ2lvbnMgbG9zdCB0byBiYWNrQnVmZmVyICAgKi8KKyAgICBSZWdpb25SZWMgICB1bmlvblJnbjsJLyogUmVnaW9ucyBnYWluZWQgYnkgYmFja0J1ZmZlciAqLworICAgIEJvb2wJcmduQ2hhbmdlZDsJLyogVFJVRSBpZiAiYmFja0J1ZmZlciIgbmVlZHMgdG8gYmUgdXBkYXRlZCAqLworCisgICAgdm9pZCAoKiBDb3B5QnVmZmVyQml0cykoKTsJLyogcE1CV2luZG93LCBzcmNCdWZmZXJOdW0sIGRzdEJ1ZmZlck51bSAqLworICAgIHZvaWQgKCogRHJhd1NlbGVjdFBsYW5lKSgpOwkvKiBwU2NyZWVuLCBzZWxlY3RQbGFuZSwgcFJlZ2lvbiwgYnVmZmVyTnVtICovCisKKyAgICAvKiBQb2ludGVycyB0byB3cmFwcGVkIGZ1bmN0aW9ucyAqLworICAgIFBvc3RWYWxpZGF0ZVRyZWVQcm9jUHRyCVBvc3RWYWxpZGF0ZVRyZWU7IC8qIHBQYXJlbnQsIHBDaGlsZCwga2luZCAqLworICAgIENsaXBOb3RpZnlQcm9jUHRyCQlDbGlwTm90aWZ5OyAgICAgICAvKiBwV2luLCBkeCwgZHkgKi8KKyAgICBXaW5kb3dFeHBvc3VyZXNQcm9jUHRyCVdpbmRvd0V4cG9zdXJlczsgIC8qIHBXaW4sIHBSZWdpb24gKi8KKyAgICBDb3B5V2luZG93UHJvY1B0cgkJQ29weVdpbmRvdzsgICAgICAgLyogcFdpbiwgb2xkUHQsIHBPbGRSZWdpb24gKi8KKyAgICBDbGVhclRvQmFja2dyb3VuZFByb2NQdHIJQ2xlYXJUb0JhY2tncm91bmQ7IC8qIHBXaW4sIHgseSx3LGgsIHNlbmRFeHBvc2UgKi8KKyAgICBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzUHJvY1B0ciBDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzOyAvKiBwV2luLCB2bWFzayAqLworICAgIGxvbmcgZnVuY3NXcmFwcGVkOwkJCS8qIGZsYWdzIHdoaWNoIGZ1bmN0aW9ucyBhcmUgd3JhcHBlZCAqLworICAgIHVuc2lnbmVkICBpbkNsZWFyVG9CYWNrZ3JvdW5kOjE7CS8qIHVzZWQgYnkgV2luZG93RXhwb3N1cmUgKi8KK30gbWJ1ZkJ1ZmZlclByaXZSZWMsICptYnVmQnVmZmVyUHJpdlB0cjsKKyNlbmRpZiAvKiBfTVVMVElCVUZfQlVGRkVSXyAqLworCisjZW5kaWYgLyogX01VTFRJQlVGX1NFUlZFUl8gKi8KKyNlbmRpZiAvKiBfTVVMVElCVUZTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cml0eS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGFkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyaXR5LmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qICRYb3JnOiBzZWN1cml0eS5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworLyoKK0NvcHlyaWdodCAxOTk2LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKyovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL3NlY3VyaXR5LmgsdiAxLjMgMjAwMS8xMi8xNCAxOTo1MzoyOSBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9TRUNVUklUWV9ICisjZGVmaW5lIF9TRUNVUklUWV9ICisKKyNkZWZpbmUgX1hBVVRIX1NUUlVDVF9PTkxZCisjaW5jbHVkZSA8WDExL1hhdXRoLmg+CisKKy8qIGNvbnN0YW50cyB0aGF0IHNlcnZlciwgbGlicmFyeSwgYW5kIGFwcGxpY2F0aW9uIGFsbCBuZWVkICovCisKKyNkZWZpbmUgWFNlY3VyaXR5TnVtYmVyRXZlbnRzCQkxCisjZGVmaW5lIFhTZWN1cml0eU51bWJlckVycm9ycwkJMgorI2RlZmluZSBYU2VjdXJpdHlCYWRBdXRob3JpemF0aW9uCTAKKyNkZWZpbmUgWFNlY3VyaXR5QmFkQXV0aG9yaXphdGlvblByb3RvY29sIDEKKworLyogdHJ1c3QgbGV2ZWxzICovCisjZGVmaW5lIFhTZWN1cml0eUNsaWVudFRydXN0ZWQJCTAKKyNkZWZpbmUgWFNlY3VyaXR5Q2xpZW50VW50cnVzdGVkCTEKKworLyogYXV0aG9yaXphdGlvbiBhdHRyaWJ1dGUgbWFza3MgKi8KKyNkZWZpbmUgWFNlY3VyaXR5VGltZW91dAkJKDE8PDApCisjZGVmaW5lIFhTZWN1cml0eVRydXN0TGV2ZWwJCSgxPDwxKQorI2RlZmluZSBYU2VjdXJpdHlHcm91cCAgCQkoMTw8MikKKyNkZWZpbmUgWFNlY3VyaXR5RXZlbnRNYXNrCQkoMTw8MykKKyNkZWZpbmUgWFNlY3VyaXR5QWxsQXV0aG9yaXphdGlvbkF0dHJpYnV0ZXMgXAorIChYU2VjdXJpdHlUaW1lb3V0IHwgWFNlY3VyaXR5VHJ1c3RMZXZlbCB8IFhTZWN1cml0eUdyb3VwIHwgWFNlY3VyaXR5RXZlbnRNYXNrKQorCisvKiBldmVudCBtYXNrcyAqLworI2RlZmluZSBYU2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZE1hc2sgKDE8PDApCisjZGVmaW5lIFhTZWN1cml0eUFsbEV2ZW50TWFza3MgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWRNYXNrCisKKy8qIGV2ZW50IG9mZnNldHMgKi8KKyNkZWZpbmUgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWQgMAorICAgIAorI2RlZmluZSBYU2VjdXJpdHlBdXRob3JpemF0aW9uTmFtZQkiWEMtUVVFUlktU0VDVVJJVFktMSIKKyNkZWZpbmUgWFNlY3VyaXR5QXV0aG9yaXphdGlvbk5hbWVMZW4JMTkKKworCisjaWZuZGVmIF9TRUNVUklUWV9TRVJWRVIKKworX1hGVU5DUFJPVE9CRUdJTgorCitTdGF0dXMgWFNlY3VyaXR5UXVlcnlFeHRlbnNpb24gKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgKm1ham9yX3ZlcnNpb25fcmV0dXJuLAorICAgIGludCAqbWlub3JfdmVyc2lvbl9yZXR1cm4pOworCitYYXV0aCAqWFNlY3VyaXR5QWxsb2NYYXV0aCh2b2lkKTsKKwordm9pZCBYU2VjdXJpdHlGcmVlWGF1dGgoWGF1dGggKmF1dGgpOworCisvKiB0eXBlIGZvciByZXR1cm5lZCBhdXRoIGlkcyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhTZWN1cml0eUF1dGhvcml6YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgdGltZW91dDsKKyAgICB1bnNpZ25lZCBpbnQgdHJ1c3RfbGV2ZWw7CisgICAgWElEICAgICAgICAgIGdyb3VwOworICAgIGxvbmcJIGV2ZW50X21hc2s7Cit9IFhTZWN1cml0eUF1dGhvcml6YXRpb25BdHRyaWJ1dGVzOworCitYYXV0aCAqWFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBYYXV0aCAqYXV0aF9pbiwKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlbWFzaywKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uQXR0cmlidXRlcyAqYXR0cmlidXRlcywKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uICphdXRoX2lkX3JldHVybik7CisKK1N0YXR1cyBYU2VjdXJpdHlSZXZva2VBdXRob3JpemF0aW9uKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uIGF1dGhfaWQpOworCitfWEZVTkNQUk9UT0VORAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkgICAgICAvKiBldmVudCBiYXNlICsgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CSAgICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uIGF1dGhfaWQ7IC8qIHJldm9rZWQgYXV0aG9yaXphdGlvbiBpZCAqLworfSBYU2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZEV2ZW50OworCisjZWxzZSAvKiBfU0VDVVJJVFlfU0VSVkVSICovCisKKyNpbmNsdWRlICJpbnB1dC5oIiAgICAvKiBmb3IgRGV2aWNlSW50UHRyICovCisjaW5jbHVkZSAicHJvcGVydHkuaCIgLyogZm9yIFByb3BlcnR5UHRyICovCisjaW5jbHVkZSAicGl4bWFwLmgiICAgLyogZm9yIERyYXdhYmxlUHRyICovCisjaW5jbHVkZSAicmVzb3VyY2UuaCIgLyogZm9yIFJFU1RZUEUgKi8KKworLyogcmVzb3VyY2UgdHlwZSB0byBwYXNzIGluIExvb2t1cElEQnlUeXBlIGZvciBhdXRob3JpemF0aW9ucyAqLworZXh0ZXJuIFJFU1RZUEUgU2VjdXJpdHlBdXRob3JpemF0aW9uUmVzVHlwZTsKKworLyogdGhpcyBpcyB3aGF0IHdlIHN0b3JlIGZvciBhbiBhdXRob3JpemF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWElEIGlkOwkJCS8qIHJlc291cmNlIElEICovCisgICAgQ0FSRDMyIHRpbWVvdXQ7CS8qIGhvdyBsb25nIHRvIGxpdmUgaW4gc2Vjb25kcyBhZnRlciByZWZjbnQgPT0gMCAqLworICAgIHVuc2lnbmVkIGludCB0cnVzdExldmVsOwkvKiB0cnVzdGVkL3VudHJ1c3RlZCAqLworICAgIFhJRCBncm91cDsJCQkvKiBzZWUgZW1iZWRkaW5nIGV4dGVuc2lvbiAqLworICAgIHVuc2lnbmVkIGludCByZWZjbnQ7CS8qIGhvdyBtYW55IGNsaWVudHMgY29ubmVjdGVkIHdpdGggdGhpcyBhdXRoICovCisgICAgdW5zaWduZWQgaW50IHNlY29uZHNSZW1haW5pbmc7IC8qIG92ZXJmbG93IHRpbWUgYW1vdW50IGZvciA+NDkgZGF5cyAqLworICAgIE9zVGltZXJQdHIgdGltZXI7CQkvKiB0aW1lciBmb3IgdGhpcyBhdXRoICovCisgICAgc3RydWN0IF9PdGhlckNsaWVudHMgKmV2ZW50Q2xpZW50czsgLyogY2xpZW50cyB3YW50aW5nIGV2ZW50cyAqLworfSBTZWN1cml0eUF1dGhvcml6YXRpb25SZWMsICpTZWN1cml0eUF1dGhvcml6YXRpb25QdHI7CisKKy8qIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYSBHZW5lcmF0ZUF1dGhvcml6YXRpb24gcmVxdWVzdAorICogaXMgcHJvY2Vzc2VkIHRvIHNhbml0eSBjaGVjayB0aGUgZ3JvdXAgYXJndW1lbnQuICBUaGUgY2FsbCBkYXRhIHdpbGwKKyAqIGJlIGEgcG9pbnRlciB0byBhIFNlY3VyaXR5VmFsaWRhdGVHcm91cEluZm9SZWMgKGJlbG93KS4gIAorICogRnVuY3Rpb25zIHJlZ2lzdGVyZWQgb24gdGhpcyBjYWxsYmFjayBhcmUgZXhwZWN0ZWQgdG8gZXhhbWluZSB0aGUKKyAqIGdyb3VwIGFuZCBzZXQgdGhlIHZhbGlkIGZpZWxkIHRvIFRSVUUgaWYgdGhleSByZWNvZ25pemUgdGhlIGdyb3VwIGFzIGEKKyAqIGxlZ2l0aW1hdGUgZ3JvdXAuICBJZiB0aGV5IGRvbid0IHJlY29nbml6ZSBpdCwgdGhleSBzaG91bGQgbm90IGNoYW5nZSB0aGUKKyAqIHZhbGlkIGZpZWxkLgorICovCitleHRlcm4gQ2FsbGJhY2tMaXN0UHRyIFNlY3VyaXR5VmFsaWRhdGVHcm91cENhbGxiYWNrOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhJRCBncm91cDsJLyogdGhlIGdyb3VwIHRoYXQgd2FzIHNlbnQgaW4gR2VuZXJhdGVBdXRob3JpemF0aW9uICovCisgICAgQm9vbCB2YWxpZDsgLyogZGlkIGFueW9uZSByZWNvZ25pemUgaXQ/IGlmIHNvLCBzZXQgdG8gVFJVRSAqLworfSBTZWN1cml0eVZhbGlkYXRlR3JvdXBJbmZvUmVjOworCisvKiBQcm9jIHZlY3RvcnMgZm9yIHVudHJ1c3RlZCBjbGllbnRzLCBzd2FwcGVkIGFuZCB1bnN3YXBwZWQgdmVyc2lvbnMuCisgKiBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbCBwcm9jIHZlY3RvcnMgZXhjZXB0IHRoYXQgZXh0ZW5zaW9ucworICogdGhhdCBoYXZlbid0IGRlY2xhcmVkIHRoZW1zZWx2ZXMgc2VjdXJlIHdpbGwgaGF2ZSBQcm9jQmFkUmVxdWVzdCBwbHVnZ2VkCisgKiBpbiBmb3IgdGhlaXIgbWFqb3Igb3Bjb2RlIGRpc3BhdGNoZXIuICBUaGlzIHByZXZlbnRzIHVudHJ1c3RlZCBjbGllbnRzCisgKiBmcm9tIGd1ZXNzaW5nIGV4dGVuc2lvbiBtYWpvciBvcGNvZGVzIGFuZCB1c2luZyB0aGUgZXh0ZW5zaW9uIGV2ZW4gdGhvdWdoCisgKiB0aGUgZXh0ZW5zaW9uIGNhbid0IGJlIGxpc3RlZCBvciBxdWVyaWVkLgorICovCitleHRlcm4gaW50ICgqVW50cnVzdGVkUHJvY1ZlY3RvclsyNTZdKShDbGllbnRQdHIgY2xpZW50KTsKK2V4dGVybiBpbnQgKCpTd2FwcGVkVW50cnVzdGVkUHJvY1ZlY3RvclsyNTZdKShDbGllbnRQdHIgY2xpZW50KTsKKworZXh0ZXJuIEJvb2wgU2VjdXJpdHlDaGVja0RldmljZUFjY2VzcyhDbGllbnRQdHIgY2xpZW50LCBEZXZpY2VJbnRQdHIgZGV2LAorCQkJICAgICAgIEJvb2wgZnJvbVJlcXVlc3QpOworCitleHRlcm4gdm9pZCBTZWN1cml0eUF1ZGl0KGNoYXIgKmZvcm1hdCwgLi4uKTsKKworI2lmZGVmIExCWAorZXh0ZXJuIEJvb2wgU2VjdXJpdHlTYW1lTGV2ZWwoQ2xpZW50UHRyIGNsaWVudCwgWElEIGF1dGhJZCk7CisjZW5kaWYKKworZXh0ZXJuIGludCBYU2VjdXJpdHlPcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndiwgaW50IGkpOworCisvKiBHaXZlIHRoaXMgdmFsdWUgb3IgaGlnaGVyIHRvIHRoZSAtYXVkaXQgb3B0aW9uIHRvIGdldCBzZWN1cml0eSBtZXNzYWdlcyAqLworI2RlZmluZSBTRUNVUklUWV9BVURJVF9MRVZFTCA0CisKK2V4dGVybiB2b2lkIFNlY3VyaXR5Q2Vuc29ySW1hZ2UoCisgICAgQ2xpZW50UHRyIGNsaWVudCwKKyAgICBSZWdpb25QdHIgcFZpc2libGVSZWdpb24sCisgICAgbG9uZyB3aWR0aEJ5dGVzTGluZSwKKyAgICBEcmF3YWJsZVB0ciBwRHJhdywKKyAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorICAgIGNoYXIgKiBwQnVmKTsKKworI2RlZmluZSBTZWN1cml0eUFsbG93T3BlcmF0aW9uICAwCisjZGVmaW5lIFNlY3VyaXR5SWdub3JlT3BlcmF0aW9uIDEKKyNkZWZpbmUgU2VjdXJpdHlFcnJvck9wZXJhdGlvbiAgMgorCitjaGFyCitTZWN1cml0eUNoZWNrUHJvcGVydHlBY2Nlc3MoCisgICAgQ2xpZW50UHRyIGNsaWVudCwKKyAgICBXaW5kb3dQdHIgcFdpbiwKKyAgICBBVE9NICBwcm9wZXJ0eU5hbWUsCisgICAgTWFzayBhY2Nlc3NfbW9kZSk7CisKKyNkZWZpbmUgU0VDVVJJVFlfUE9MSUNZX0ZJTEVfVkVSU0lPTiAidmVyc2lvbi0xIgorCitjaGFyICoqU2VjdXJpdHlHZXRTaXRlUG9saWN5U3RyaW5ncyhpbnQgKm4pOworCisjZW5kaWYgLyogX1NFQ1VSSVRZX1NFUlZFUiAqLworCisjZW5kaWYgLyogX1NFQ1VSSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM3NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zZWN1cnN0ci5oCkBAIC0wLDAgKzEsMTE2IEBACisvKiAkWG9yZzogc2VjdXJzdHIuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9zZWN1cnN0ci5oLHYgMS4yIDIwMDEvMDgvMDEgMDA6NDQ6MzUgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1NFQ1VSU1RSX0gKKyNkZWZpbmUgX1NFQ1VSU1RSX0gKKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3NlY3VyaXR5Lmg+CisKKyNkZWZpbmUgU0VDVVJJVFlfRVhURU5TSU9OX05BTUUJCSJTRUNVUklUWSIKKyNkZWZpbmUgU0VDVVJJVFlfTUFKT1JfVkVSU0lPTgkJMQorI2RlZmluZSBTRUNVUklUWV9NSU5PUl9WRVJTSU9OCQkwCisKKyNkZWZpbmUgWF9TZWN1cml0eVF1ZXJ5VmVyc2lvbgkJMAorI2RlZmluZSBYX1NlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uIDEKKyNkZWZpbmUgWF9TZWN1cml0eVJldm9rZUF1dGhvcml6YXRpb24gICAyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXFUeXBlOworICAgIENBUkQ4ICAgICAgIHNlY3VyaXR5UmVxVHlwZTsKKyAgICBDQVJEMTYgICAgICBsZW5ndGggQjE2OworICAgIENBUkQxNiAgICAgIG1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2ICAgICAgbWlub3JWZXJzaW9uIEIxNjsKK30geFNlY3VyaXR5UXVlcnlWZXJzaW9uUmVxOworI2RlZmluZSBzel94U2VjdXJpdHlRdWVyeVZlcnNpb25SZXEgCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgdHlwZTsKKyAgICBDQVJEOCAgIHBhZDA7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGgJIEIzMjsKKyAgICBDQVJEMTYgIG1ham9yVmVyc2lvbiBCMTY7CisgICAgQ0FSRDE2ICBtaW5vclZlcnNpb24gQjE2OworICAgIENBUkQzMiAgcGFkMQkgQjMyOworICAgIENBUkQzMiAgcGFkMgkgQjMyOworICAgIENBUkQzMiAgcGFkMwkgQjMyOworICAgIENBUkQzMiAgcGFkNAkgQjMyOworICAgIENBUkQzMiAgcGFkNQkgQjMyOworIH0geFNlY3VyaXR5UXVlcnlWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hTZWN1cml0eVF1ZXJ5VmVyc2lvblJlcGx5ICAJMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgICAgIHJlcVR5cGU7CisgICAgQ0FSRDggICAgICAgc2VjdXJpdHlSZXFUeXBlOworICAgIENBUkQxNiAgICAgIGxlbmd0aCBCMTY7CisgICAgQ0FSRDE2CW5ieXRlc0F1dGhQcm90byBCMTY7CisgICAgQ0FSRDE2CW5ieXRlc0F1dGhEYXRhIEIxNjsKKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsgCisgICAgLyogYXV0aCBwcm90b2NvbCBuYW1lIHBhZGRlZCB0byA0IGJ5dGVzICovCisgICAgLyogYXV0aCBwcm90b2NvbCBkYXRhIHBhZGRlZCB0byA0IGJ5dGVzICovCisgICAgLyogbGlzdCBvZiBDQVJEMzIgdmFsdWVzLCBpZiBhbnkgKi8KK30geFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uUmVxOworI2RlZmluZSBzel94U2VjdXJpdHlHZW5lcmF0ZUF1dGhvcml6YXRpb25SZXEgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4ICAgdHlwZTsKKyAgICBDQVJEOCAgIHBhZDA7CisgICAgQ0FSRDE2ICBzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyICBsZW5ndGgJIEIzMjsKKyAgICBDQVJEMzIgIGF1dGhJZAkgQjMyOworICAgIENBUkQxNiAgZGF0YUxlbmd0aCAgIEIxNjsKKyAgICBDQVJEMTYgIHBhZDEJIEIxNjsKKyAgICBDQVJEMzIgIHBhZDIJIEIzMjsKKyAgICBDQVJEMzIgIHBhZDMJIEIzMjsKKyAgICBDQVJEMzIgIHBhZDQJIEIzMjsKKyAgICBDQVJEMzIgIHBhZDUJIEIzMjsKKyB9IHhTZWN1cml0eUdlbmVyYXRlQXV0aG9yaXphdGlvblJlcGx5OworI2RlZmluZSBzel94U2VjdXJpdHlHZW5lcmF0ZUF1dGhvcml6YXRpb25SZXBseSAgCTMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDQVJEOCAgICAgICByZXFUeXBlOworICAgIENBUkQ4ICAgICAgIHNlY3VyaXR5UmVxVHlwZTsKKyAgICBDQVJEMTYgICAgICBsZW5ndGggQjE2OworICAgIENBUkQzMglhdXRoSWQgQjMyOworfSB4U2VjdXJpdHlSZXZva2VBdXRob3JpemF0aW9uUmVxOworI2RlZmluZSBzel94U2VjdXJpdHlSZXZva2VBdXRob3JpemF0aW9uUmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgX3hTZWN1cml0eUF1dGhvcml6YXRpb25SZXZva2VkRXZlbnQgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWRldGFpbDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglhdXRoSWQgQjMyOworICAgIENBUkQzMglwYWQwCSBCMzI7CisgICAgQ0FSRDMyCXBhZDEJIEIzMjsKKyAgICBDQVJEMzIJcGFkMgkgQjMyOworICAgIENBUkQzMglwYWQzCSBCMzI7CisgICAgQ0FSRDMyCXBhZDQJIEIzMjsKKyAgICBDQVJEMzIJcGFkNQkgQjMyOworfSB4U2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZEV2ZW50OworI2RlZmluZSBzel94U2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZEV2ZW50IDMyCisKKyNlbmRpZiAvKiBfU0VDVVJTVFJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzNlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvc2hhcGUuaCx2IDEuMyAyMDAxLzEyLzE0IDE5OjUzOjI5IGRhd2VzIEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJFhvcmc6IHNoYXBlLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisKKyNpZm5kZWYgX1NIQVBFX0hfCisjZGVmaW5lIF9TSEFQRV9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworI2RlZmluZSBYX1NoYXBlUXVlcnlWZXJzaW9uCQkwCisjZGVmaW5lIFhfU2hhcGVSZWN0YW5nbGVzCQkxCisjZGVmaW5lIFhfU2hhcGVNYXNrCQkJMgorI2RlZmluZSBYX1NoYXBlQ29tYmluZQkJCTMKKyNkZWZpbmUgWF9TaGFwZU9mZnNldAkJCTQKKyNkZWZpbmUgWF9TaGFwZVF1ZXJ5RXh0ZW50cwkJNQorI2RlZmluZSBYX1NoYXBlU2VsZWN0SW5wdXQJCTYKKyNkZWZpbmUgWF9TaGFwZUlucHV0U2VsZWN0ZWQJCTcKKyNkZWZpbmUgWF9TaGFwZUdldFJlY3RhbmdsZXMJCTgKKworI2RlZmluZSBTaGFwZVNldAkJCTAKKyNkZWZpbmUgU2hhcGVVbmlvbgkJCTEKKyNkZWZpbmUgU2hhcGVJbnRlcnNlY3QJCQkyCisjZGVmaW5lIFNoYXBlU3VidHJhY3QJCQkzCisjZGVmaW5lIFNoYXBlSW52ZXJ0CQkJNAorCisjZGVmaW5lIFNoYXBlQm91bmRpbmcJCQkwCisjZGVmaW5lIFNoYXBlQ2xpcAkJCTEKKyNkZWZpbmUgU2hhcGVJbnB1dAkJCTIKKworI2RlZmluZSBTaGFwZU5vdGlmeU1hc2sJCQkoMUwgPDwgMCkKKyNkZWZpbmUgU2hhcGVOb3RpZnkJCQkwCisKKyNkZWZpbmUgU2hhcGVOdW1iZXJFdmVudHMJCShTaGFwZU5vdGlmeSArIDEpCisKKyNpZm5kZWYgX1NIQVBFX1NFUlZFUl8KKworI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgV2luZG93IHdpbmRvdzsJICAgIC8qIHdpbmRvdyBvZiBldmVudCAqLworICAgIGludCBraW5kOwkJICAgIC8qIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisgICAgaW50IHgsIHk7CQkgICAgLyogZXh0ZW50cyBvZiBuZXcgcmVnaW9uICovCisgICAgdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKyAgICBUaW1lIHRpbWU7CQkgICAgLyogc2VydmVyIHRpbWVzdGFtcCB3aGVuIHJlZ2lvbiBjaGFuZ2VkICovCisgICAgQm9vbCBzaGFwZWQ7CSAgICAvKiB0cnVlIGlmIHRoZSByZWdpb24gZXhpc3RzICovCit9IFhTaGFwZUV2ZW50OworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIFhTaGFwZVF1ZXJ5RXh0ZW5zaW9uICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIGludCoJLyogZXZlbnRfYmFzZSAqLywKKyAgICBpbnQqCS8qIGVycm9yX2Jhc2UgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFNoYXBlUXVlcnlWZXJzaW9uICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIGludCoJLyogbWFqb3JfdmVyc2lvbiAqLywKKyAgICBpbnQqCS8qIG1pbm9yX3ZlcnNpb24gKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTaGFwZUNvbWJpbmVSZWdpb24gKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFJlZ2lvbgkvKiByZWdpb24gKi8sCisgICAgaW50CQkvKiBvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZVJlY3RhbmdsZXMgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFhSZWN0YW5nbGUqCS8qIHJlY3RhbmdsZXMgKi8sCisgICAgaW50CQkvKiBuX3JlY3RzICovLAorICAgIGludAkJLyogb3AgKi8sCisgICAgaW50CQkvKiBvcmRlcmluZyAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZU1hc2sgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFBpeG1hcAkvKiBzcmMgKi8sCisgICAgaW50CQkvKiBvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZVNoYXBlICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkvKiBkZXN0ICovLAorICAgIGludAkJLyogZGVzdF9raW5kICovLAorICAgIGludAkJLyogeF9vZmYgKi8sCisgICAgaW50CQkvKiB5X29mZiAqLywKKyAgICBXaW5kb3cJLyogc3JjICovLAorICAgIGludAkJLyogc3JjX2tpbmQgKi8sCisgICAgaW50CQkvKiBvcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlT2Zmc2V0U2hhcGUgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovCispOworCitleHRlcm4gU3RhdHVzIFhTaGFwZVF1ZXJ5RXh0ZW50cyAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCisgICAgQm9vbCoJCS8qIGJvdW5kaW5nX3NoYXBlZCAqLywKKyAgICBpbnQqCQkvKiB4X2JvdW5kaW5nICovLAorICAgIGludCoJCS8qIHlfYm91bmRpbmcgKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiB3X2JvdW5kaW5nICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaF9ib3VuZGluZyAqLywKKyAgICBCb29sKgkJLyogY2xpcF9zaGFwZWQgKi8sCisgICAgaW50KgkJLyogeF9jbGlwICovLAorICAgIGludCoJCS8qIHlfY2xpcCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdfY2xpcCAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIGhfY2xpcCAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlU2VsZWN0SW5wdXQgKAorICAgIERpc3BsYXkqCQkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovLAorICAgIHVuc2lnbmVkIGxvbmcJLyogbWFzayAqLworKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgWFNoYXBlSW5wdXRTZWxlY3RlZCAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogd2luZG93ICovCispOworCitleHRlcm4gWFJlY3RhbmdsZSAqWFNoYXBlR2V0UmVjdGFuZ2xlcyAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogd2luZG93ICovLAorICAgIGludAkJLyoga2luZCAqLywKKyAgICBpbnQqCS8qIGNvdW50ICovLAorICAgIGludCoJLyogb3JkZXJpbmcgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBfU0hBUEVfU0VSVkVSXyAqLworCisjZW5kaWYgLyogX1NIQVBFX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlc3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NoYXBlc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0MmJhOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGVzdHIuaApAQCAtMCwwICsxLDIzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRYb3JnOiBzaGFwZXN0ci5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworCisjaWZuZGVmIF9TSEFQRVNUUl9IXworI2RlZmluZSBfU0hBUEVTVFJfSF8KKworLyoKKyAqIFByb3RvY29sIHJlcXVlc3RzIGNvbnN0YW50cyBhbmQgYWxpZ25tZW50IHZhbHVlcworICogVGhlc2Ugd291bGQgcmVhbGx5IGJlIGluIFNIQVBFJ3MgWC5oIGFuZCBYcHJvdG8uaCBlcXVpdmFsZW50cworICovCisKKyNpbmNsdWRlICJzaGFwZS5oIgorCisjZGVmaW5lIFdpbmRvdyBDQVJEMzIKKyNkZWZpbmUgVGltZSBDQVJEMzIKKworI2RlZmluZSBTSEFQRU5BTUUgIlNIQVBFIgorCisjZGVmaW5lIFNIQVBFX01BSk9SX1ZFUlNJT04JMQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBTSEFQRV9NSU5PUl9WRVJTSU9OCTEKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlUXVlcnlWZXJzaW9uIHsKKwlDQVJEOAlyZXFUeXBlOwkJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJCS8qIGFsd2F5cyBYX1NoYXBlUXVlcnlWZXJzaW9uICovCisJQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhTaGFwZVF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlUXVlcnlWZXJzaW9uUmVxCTQKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUJdHlwZTsJCQkvKiBYX1JlcGx5ICovCisJQ0FSRDgJdW51c2VkOwkJCS8qIG5vdCB1c2VkICovCisJQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKwlDQVJEMzIJbGVuZ3RoIEIzMjsKKwlDQVJEMTYJbWFqb3JWZXJzaW9uIEIxNjsJLyogbWFqb3IgdmVyc2lvbiBvZiBTSEFQRSBwcm90b2NvbCAqLworCUNBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIFNIQVBFIHByb3RvY29sICovCisJQ0FSRDMyCXBhZDAgQjMyOworCUNBUkQzMglwYWQxIEIzMjsKKwlDQVJEMzIJcGFkMiBCMzI7CisJQ0FSRDMyCXBhZDMgQjMyOworCUNBUkQzMglwYWQ0IEIzMjsKK30geFNoYXBlUXVlcnlWZXJzaW9uUmVwbHk7CisjZGVmaW5lIHN6X3hTaGFwZVF1ZXJ5VmVyc2lvblJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZVJlY3RhbmdsZXMgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlUmVjdGFuZ2xlcyAqLworCUNBUkQxNglsZW5ndGggQjE2OworCUNBUkQ4CW9wOwkJLyogU2V0LCAuLi4gKi8KKwlDQVJEOAlkZXN0S2luZDsJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEOAlvcmRlcmluZzsJLyogVW5Tb3J0ZWQsIFlTb3J0ZWQsIFlYU29ydGVkLCBZWEJhbmRlZCAqLworCUNBUkQ4CXBhZDA7CQkvKiBub3QgdXNlZCAqLworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKK30geFNoYXBlUmVjdGFuZ2xlc1JlcTsJCS8qIGZvbGxvd2VkIGJ5IHhSZWN0cyAqLworI2RlZmluZSBzel94U2hhcGVSZWN0YW5nbGVzUmVxCTE2CisKK3R5cGVkZWYgc3RydWN0IF9TaGFwZU1hc2sgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlTWFzayAqLworCUNBUkQxNglsZW5ndGggQjE2OworCisJQ0FSRDgJb3A7CQkvKiBTZXQsIC4uLiAqLworCUNBUkQ4CWRlc3RLaW5kOwkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQxNglqdW5rIEIxNjsJLyogbm90IHVzZWQgKi8KKworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKKwlDQVJEMzIJc3JjIEIzMjsJLyogMSBiaXQgcGl4bWFwICovCit9IHhTaGFwZU1hc2tSZXE7CisjZGVmaW5lIHN6X3hTaGFwZU1hc2tSZXEJMjAKKwkKK3R5cGVkZWYgc3RydWN0IF9TaGFwZUNvbWJpbmUgeworCUNBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaGFwZVJlcUNvZGUgKi8KKwlDQVJEOAlzaGFwZVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NoYXBlQ29tYmluZSAqLworCUNBUkQxNglsZW5ndGggQjE2OworCUNBUkQ4CW9wOwkJLyogU2V0LCAuLi4gKi8KKwlDQVJEOAlkZXN0S2luZDsJLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEOAlzcmNLaW5kOwkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQ4CWp1bms7CQkvKiBub3QgdXNlZCAqLworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKKwlXaW5kb3cJc3JjIEIzMjsKK30geFNoYXBlQ29tYmluZVJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlQ29tYmluZVJlcQkyMAorCQordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlT2Zmc2V0IHsKKwlDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisJQ0FSRDgJc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZU9mZnNldCAqLworCUNBUkQxNglsZW5ndGggQjE2OworCUNBUkQ4CWRlc3RLaW5kOwkvKiBTaGFwZUJvdW5kaW5nIG9yIFNoYXBlQ2xpcCAqLworCUNBUkQ4CWp1bmsxOwkJLyogbm90IHVzZWQgKi8KKwlDQVJEMTYJanVuazIgQjE2OwkvKiBub3QgdXNlZCAqLworCVdpbmRvdwlkZXN0IEIzMjsKKwlJTlQxNgl4T2ZmIEIxNjsKKwlJTlQxNgl5T2ZmIEIxNjsKK30geFNoYXBlT2Zmc2V0UmVxOworI2RlZmluZSBzel94U2hhcGVPZmZzZXRSZXEJMTYKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlUXVlcnlFeHRlbnRzIHsKKwlDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisJQ0FSRDgJc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZVF1ZXJ5RXh0ZW50cyAqLworCUNBUkQxNglsZW5ndGggQjE2OworCVdpbmRvdwl3aW5kb3cgQjMyOworfSB4U2hhcGVRdWVyeUV4dGVudHNSZXE7CisjZGVmaW5lIHN6X3hTaGFwZVF1ZXJ5RXh0ZW50c1JlcQk4CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworCUNBUkQ4CXVudXNlZDsJCQkvKiBub3QgdXNlZCAqLworCUNBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisJQ0FSRDMyCWxlbmd0aCBCMzI7CQkvKiAwICovCisJQ0FSRDgJYm91bmRpbmdTaGFwZWQ7CQkvKiB3aW5kb3cgaGFzIGJvdW5kaW5nIHNoYXBlICovCisJQ0FSRDgJY2xpcFNoYXBlZDsJCS8qIHdpbmRvdyBoYXMgY2xpcCBzaGFwZSAqLworCUNBUkQxNgl1bnVzZWQxIEIxNjsKKwlJTlQxNgl4Qm91bmRpbmdTaGFwZSBCMTY7CS8qIGV4dGVudHMgb2YgYm91bmRpbmcgc2hhcGUgKi8KKwlJTlQxNgl5Qm91bmRpbmdTaGFwZSBCMTY7CisJQ0FSRDE2CXdpZHRoQm91bmRpbmdTaGFwZSBCMTY7CisJQ0FSRDE2CWhlaWdodEJvdW5kaW5nU2hhcGUgQjE2OworCUlOVDE2CXhDbGlwU2hhcGUgQjE2OwkJLyogZXh0ZW50cyBvZiBjbGlwIHNoYXBlICovCisJSU5UMTYJeUNsaXBTaGFwZSBCMTY7CisJQ0FSRDE2CXdpZHRoQ2xpcFNoYXBlIEIxNjsKKwlDQVJEMTYJaGVpZ2h0Q2xpcFNoYXBlIEIxNjsKKwlDQVJEMzIJcGFkMSBCMzI7Cit9IHhTaGFwZVF1ZXJ5RXh0ZW50c1JlcGx5OworI2RlZmluZSBzel94U2hhcGVRdWVyeUV4dGVudHNSZXBseQkzMgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVTZWxlY3RJbnB1dCB7CisJQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworCUNBUkQ4CXNoYXBlUmVxVHlwZTsJLyogYWx3YXlzIFhfU2hhcGVTZWxlY3RJbnB1dCAqLworCUNBUkQxNglsZW5ndGggQjE2OworCVdpbmRvdwl3aW5kb3cgQjMyOworCUJZVEUJZW5hYmxlOwkJLyogeFRydWUgLT4gc2VuZCBldmVudHMgKi8KKwlCWVRFCXBhZDE7CisJQ0FSRDE2CXBhZDIgQjE2OworfSB4U2hhcGVTZWxlY3RJbnB1dFJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlU2VsZWN0SW5wdXRSZXEJMTIKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlTm90aWZ5IHsKKwlCWVRFCXR5cGU7CQkvKiBhbHdheXMgZXZlbnRCYXNlICsgU2hhcGVOb3RpZnkgKi8KKwlCWVRFCWtpbmQ7CQkvKiBlaXRoZXIgU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKwlDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworCVdpbmRvdwl3aW5kb3cgQjMyOworCUlOVDE2CXggQjE2OworCUlOVDE2CXkgQjE2OwkJLyogZXh0ZW50cyBvZiBuZXcgc2hhcGUgKi8KKwlDQVJEMTYJd2lkdGggQjE2OworCUNBUkQxNgloZWlnaHQgQjE2OworCVRpbWUJdGltZSBCMzI7CS8qIHRpbWUgb2YgY2hhbmdlICovCisJQllURQlzaGFwZWQ7CQkvKiBzZXQgd2hlbiBhIHNoYXBlIGFjdHVhbCBleGlzdHMgKi8KKwlCWVRFCXBhZDA7CisJQ0FSRDE2CXBhZDEgQjE2OworCUNBUkQzMglwYWQyIEIzMjsKKwlDQVJEMzIJcGFkMyBCMzI7Cit9IHhTaGFwZU5vdGlmeUV2ZW50OworI2RlZmluZSBzel94U2hhcGVOb3RpZnlFdmVudAkzMgorCit0eXBlZGVmIHN0cnVjdCBfU2hhcGVJbnB1dFNlbGVjdGVkIHsKKwlDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2hhcGVSZXFDb2RlICovCisJQ0FSRDgJc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZUlucHV0U2VsZWN0ZWQgKi8KKwlDQVJEMTYJbGVuZ3RoIEIxNjsKKwlXaW5kb3cJd2luZG93IEIzMjsKK30geFNoYXBlSW5wdXRTZWxlY3RlZFJlcTsKKyNkZWZpbmUgc3pfeFNoYXBlSW5wdXRTZWxlY3RlZFJlcSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworCUNBUkQ4CWVuYWJsZWQ7CQkvKiBjdXJyZW50IHN0YXR1cyAqLworCUNBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisJQ0FSRDMyCWxlbmd0aCBCMzI7CQkvKiAwICovCisJQ0FSRDMyCXBhZDEgQjMyOwkJLyogdW51c2VkICovCisJQ0FSRDMyCXBhZDIgQjMyOworCUNBUkQzMglwYWQzIEIzMjsKKwlDQVJEMzIJcGFkNCBCMzI7CisJQ0FSRDMyCXBhZDUgQjMyOworCUNBUkQzMglwYWQ2IEIzMjsKK30geFNoYXBlSW5wdXRTZWxlY3RlZFJlcGx5OworI2RlZmluZSBzel94U2hhcGVJbnB1dFNlbGVjdGVkUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NoYXBlR2V0UmVjdGFuZ2xlcyB7CisgICAgQ0FSRDggICByZXFUeXBlOwkJLyogYWx3YXlzIFNoYXBlUmVxQ29kZSAqLworICAgIENBUkQ4ICAgc2hhcGVSZXFUeXBlOwkvKiBhbHdheXMgWF9TaGFwZUdldFJlY3RhbmdsZXMgKi8KKyAgICBDQVJEMTYgIGxlbmd0aCBCMTY7CisgICAgV2luZG93ICB3aW5kb3cgQjMyOworICAgIENBUkQ4ICAga2luZDsJCS8qIFNoYXBlQm91bmRpbmcgb3IgU2hhcGVDbGlwICovCisgICAgQ0FSRDggICBqdW5rMTsKKyAgICBDQVJEMTYgIGp1bmsyIEIxNjsKK30geFNoYXBlR2V0UmVjdGFuZ2xlc1JlcTsKKyNkZWZpbmUgc3pfeFNoYXBlR2V0UmVjdGFuZ2xlc1JlcQkxMgorCit0eXBlZGVmIHN0cnVjdCB7CisJQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKwlDQVJEOAlvcmRlcmluZzsJLyogVW5Tb3J0ZWQsIFlTb3J0ZWQsIFlYU29ydGVkLCBZWEJhbmRlZCAqLworCUNBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisJQ0FSRDMyCWxlbmd0aCBCMzI7CQkvKiBub3QgemVybyAqLworCUNBUkQzMglucmVjdHMgQjMyOwkJLyogbnVtYmVyIG9mIHJlY3RhbmdsZXMgKi8KKwlDQVJEMzIgcGFkMSBCMzI7CisJQ0FSRDMyIHBhZDIgQjMyOworCUNBUkQzMiBwYWQzIEIzMjsKKwlDQVJEMzIgcGFkNCBCMzI7CisJQ0FSRDMyIHBhZDUgQjMyOworfSB4U2hhcGVHZXRSZWN0YW5nbGVzUmVwbHk7CQkvKiBmb2xsb3dlZCBieSB4UmVjdGFuZ2xlcyAqLworI2RlZmluZSBzel94U2hhcGVHZXRSZWN0YW5nbGVzUmVwbHkgMzIKKworI3VuZGVmIFdpbmRvdworI3VuZGVmIFRpbWUKKworI2VuZGlmIC8qIF9TSEFQRVNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaG1zdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NTM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2htc3RyLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvc2htc3RyLmgsdiAzLjMgMjAwMS8xMi8xNCAxOTo1MzoyOSBkYXdlcyBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRISVMgSVMgTk9UIEFOIFggQ09OU09SVElVTSBTVEFOREFSRCBPUiBBTiBYIFBST0pFQ1QgVEVBTSBTUEVDSUZJQ0FUSU9OICovCisKKyNpZm5kZWYgX1NITVNUUl9IXworI2RlZmluZSBfU0hNU1RSX0hfCisKKy8qICRYb3JnOiBzaG1zdHIuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKworI2luY2x1ZGUgIlhTaG0uaCIKKworI2RlZmluZSBTaG1TZWcgQ0FSRDMyCisjZGVmaW5lIERyYXdhYmxlIENBUkQzMgorI2RlZmluZSBWaXN1YWxJRCBDQVJEMzIKKyNkZWZpbmUgR0NvbnRleHQgQ0FSRDMyCisjZGVmaW5lIFBpeG1hcCBDQVJEMzIKKworI2RlZmluZSBTSE1OQU1FICJNSVQtU0hNIgorCisjZGVmaW5lIFNITV9NQUpPUl9WRVJTSU9OCTEJLyogY3VycmVudCB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgU0hNX01JTk9SX1ZFUlNJT04JMQorCisjaWZkZWYgX1hTSE1fU0VSVkVSXworI2RlZmluZSBYU0hNX1BVVF9JTUFHRV9BUkdTIFwKKyAgICBEcmF3YWJsZVB0cgkJLyogZHN0ICovLCBcCisgICAgR0NQdHIJCS8qIHBHQyAqLywgXAorICAgIGludAkJCS8qIGRlcHRoICovLCBcCisgICAgdW5zaWduZWQgaW50CS8qIGZvcm1hdCAqLywgXAorICAgIGludAkJCS8qIHcgKi8sIFwKKyAgICBpbnQJCQkvKiBoICovLCBcCisgICAgaW50CQkJLyogc3ggKi8sIFwKKyAgICBpbnQJCQkvKiBzeSAqLywgXAorICAgIGludAkJCS8qIHN3ICovLCBcCisgICAgaW50CQkJLyogc2ggKi8sIFwKKyAgICBpbnQJCQkvKiBkeCAqLywgXAorICAgIGludAkJCS8qIGR5ICovLCBcCisgICAgY2hhciAqCQkvKiBkYXRhICovCisKKyNkZWZpbmUgWFNITV9DUkVBVEVfUElYTUFQX0FSR1MgXAorICAgIFNjcmVlblB0cgkvKiBwU2NyZWVuICovLCBcCisgICAgaW50CQkvKiB3aWR0aCAqLywgXAorICAgIGludAkJLyogaGVpZ2h0ICovLCBcCisgICAgaW50CQkvKiBkZXB0aCAqLywgXAorICAgIGNoYXIgKgkvKiBhZGRyICovCisKK3R5cGVkZWYgc3RydWN0IF9TaG1GdW5jcyB7CisgICAgUGl4bWFwUHRyCSgqIENyZWF0ZVBpeG1hcCkoWFNITV9DUkVBVEVfUElYTUFQX0FSR1MpOworICAgIHZvaWQJKCogUHV0SW1hZ2UpKFhTSE1fUFVUX0lNQUdFX0FSR1MpOworfSBTaG1GdW5jcywgKlNobUZ1bmNzUHRyOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9TaG1RdWVyeVZlcnNpb24geworICAgIENBUkQ4CXJlcVR5cGU7CQkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CQkvKiBhbHdheXMgWF9TaG1RdWVyeVZlcnNpb24gKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geFNobVF1ZXJ5VmVyc2lvblJlcTsKKyNkZWZpbmUgc3pfeFNobVF1ZXJ5VmVyc2lvblJlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIEJPT0wJc2hhcmVkUGl4bWFwczsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQxNgltYWpvclZlcnNpb24gQjE2OwkvKiBtYWpvciB2ZXJzaW9uIG9mIFNITSBwcm90b2NvbCAqLworICAgIENBUkQxNgltaW5vclZlcnNpb24gQjE2OwkvKiBtaW5vciB2ZXJzaW9uIG9mIFNITSBwcm90b2NvbCAqLworICAgIENBUkQxNgl1aWQgQjE2OworICAgIENBUkQxNglnaWQgQjE2OworICAgIENBUkQ4CXBpeG1hcEZvcm1hdDsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQzMglwYWQ0IEIzMjsKK30geFNobVF1ZXJ5VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94U2htUXVlcnlWZXJzaW9uUmVwbHkJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUF0dGFjaCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFNobVJlcUNvZGUgKi8KKyAgICBDQVJEOAlzaG1SZXFUeXBlOwkvKiBhbHdheXMgWF9TaG1BdHRhY2ggKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBTaG1TZWcJc2htc2VnIEIzMjsKKyAgICBDQVJEMzIJc2htaWQgQjMyOworICAgIEJPT0wJcmVhZE9ubHk7CisgICAgQllURQlwYWQwOworICAgIENBUkQxNglwYWQxIEIxNjsKK30geFNobUF0dGFjaFJlcTsKKyNkZWZpbmUgc3pfeFNobUF0dGFjaFJlcQkxNgorCit0eXBlZGVmIHN0cnVjdCBfU2htRGV0YWNoIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobURldGFjaCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFNobVNlZwlzaG1zZWcgQjMyOworfSB4U2htRGV0YWNoUmVxOworI2RlZmluZSBzel94U2htRGV0YWNoUmVxCTgKKwordHlwZWRlZiBzdHJ1Y3QgX1NobVB1dEltYWdlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobVB1dEltYWdlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIEdDb250ZXh0CWdjIEIzMjsKKyAgICBDQVJEMTYJdG90YWxXaWR0aCBCMTY7CisgICAgQ0FSRDE2CXRvdGFsSGVpZ2h0IEIxNjsKKyAgICBDQVJEMTYJc3JjWCBCMTY7CisgICAgQ0FSRDE2CXNyY1kgQjE2OworICAgIENBUkQxNglzcmNXaWR0aCBCMTY7CisgICAgQ0FSRDE2CXNyY0hlaWdodCBCMTY7CisgICAgSU5UMTYJZHN0WCBCMTY7CisgICAgSU5UMTYJZHN0WSBCMTY7CisgICAgQ0FSRDgJZGVwdGg7CisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQ4CXNlbmRFdmVudDsKKyAgICBDQVJEOAlicGFkOworICAgIFNobVNlZwlzaG1zZWcgQjMyOworICAgIENBUkQzMglvZmZzZXQgQjMyOworfSB4U2htUHV0SW1hZ2VSZXE7ICAgIAorI2RlZmluZSBzel94U2htUHV0SW1hZ2VSZXEJNDAKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUdldEltYWdlIHsKKyAgICBDQVJEOAlyZXFUeXBlOwkvKiBhbHdheXMgU2htUmVxQ29kZSAqLworICAgIENBUkQ4CXNobVJlcVR5cGU7CS8qIGFsd2F5cyBYX1NobUdldEltYWdlICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIElOVDE2CXggQjE2OworICAgIElOVDE2CXkgQjE2OworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgQ0FSRDMyCXBsYW5lTWFzayBCMzI7CisgICAgQ0FSRDgJZm9ybWF0OworICAgIENBUkQ4CXBhZDA7CisgICAgQ0FSRDgJcGFkMTsKKyAgICBDQVJEOAlwYWQyOworICAgIFNobVNlZwlzaG1zZWcgQjMyOworICAgIENBUkQzMglvZmZzZXQgQjMyOworfSB4U2htR2V0SW1hZ2VSZXE7ICAgIAorI2RlZmluZSBzel94U2htR2V0SW1hZ2VSZXEJMzIKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUdldEltYWdlUmVwbHkgeworICAgIEJZVEUJdHlwZTsgIC8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAlkZXB0aDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIFZpc3VhbElECXZpc3VhbCBCMzI7CisgICAgQ0FSRDMyCXNpemUgQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKK30geFNobUdldEltYWdlUmVwbHk7CisjZGVmaW5lIHN6X3hTaG1HZXRJbWFnZVJlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IF9TaG1DcmVhdGVQaXhtYXAgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBTaG1SZXFDb2RlICovCisgICAgQ0FSRDgJc2htUmVxVHlwZTsJLyogYWx3YXlzIFhfU2htQ3JlYXRlUGl4bWFwICovCisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgUGl4bWFwCXBpZCBCMzI7CisgICAgRHJhd2FibGUJZHJhd2FibGUgQjMyOworICAgIENBUkQxNgl3aWR0aCBCMTY7CisgICAgQ0FSRDE2CWhlaWdodCBCMTY7CisgICAgQ0FSRDgJZGVwdGg7CisgICAgQ0FSRDgJcGFkMDsKKyAgICBDQVJEOAlwYWQxOworICAgIENBUkQ4CXBhZDI7CisgICAgU2htU2VnCXNobXNlZyBCMzI7CisgICAgQ0FSRDMyCW9mZnNldCBCMzI7Cit9IHhTaG1DcmVhdGVQaXhtYXBSZXE7CisjZGVmaW5lIHN6X3hTaG1DcmVhdGVQaXhtYXBSZXEgMjgKKwordHlwZWRlZiBzdHJ1Y3QgX1NobUNvbXBsZXRpb24geworICAgIEJZVEUJdHlwZTsJCS8qIGFsd2F5cyBldmVudEJhc2UgKyBTaG1Db21wbGV0aW9uICovCisgICAgQllURQlicGFkMDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIERyYXdhYmxlCWRyYXdhYmxlIEIzMjsKKyAgICBDQVJEMTYJbWlub3JFdmVudCBCMTY7CisgICAgQllURQltYWpvckV2ZW50OworICAgIEJZVEUJYnBhZDE7CisgICAgU2htU2VnCXNobXNlZyBCMzI7CisgICAgQ0FSRDMyCW9mZnNldCBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7Cit9IHhTaG1Db21wbGV0aW9uRXZlbnQ7CisjZGVmaW5lIHN6X3hTaG1Db21wbGV0aW9uRXZlbnQJMzIKKworI3VuZGVmIFNobVNlZworI3VuZGVmIERyYXdhYmxlCisjdW5kZWYgVmlzdWFsSUQKKyN1bmRlZiBHQ29udGV4dAorI3VuZGVmIFBpeG1hcAorCisjZW5kaWYgLyogX1NITVNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmJlNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zeW5jLmgKQEAgLTAsMCArMSw0NjkgQEAKKy8qICRYb3JnOiBzeW5jLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisvKgorCitDb3B5cmlnaHQgMTk5MSwgMTk5MywgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgMTk5MSwxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLAorYW5kIE9saXZldHRpIFJlc2VhcmNoIExpbWl0ZWQsIENhbWJyaWRnZSwgRW5nbGFuZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgRGlnaXRhbCBvciBPbGl2ZXR0aQorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKK0RJR0lUQUwgQU5EIE9MSVZFVFRJIERJU0NMQUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMKK1NPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEVZIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCitVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKK09USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKK1BFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvc3luYy5oLHYgMS40IDIwMDEvMTIvMjAgMTk6NDA6NTkgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1NZTkNfSF8KKyNkZWZpbmUgX1NZTkNfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworI2RlZmluZSBTWU5DX05BTUUgIlNZTkMiCisKKyNkZWZpbmUgU1lOQ19NQUpPUl9WRVJTSU9OCTMKKyNkZWZpbmUgU1lOQ19NSU5PUl9WRVJTSU9OCTAKKworI2RlZmluZSBYX1N5bmNJbml0aWFsaXplCQkwCisjZGVmaW5lIFhfU3luY0xpc3RTeXN0ZW1Db3VudGVycwkxCisjZGVmaW5lIFhfU3luY0NyZWF0ZUNvdW50ZXIJCTIKKyNkZWZpbmUgWF9TeW5jU2V0Q291bnRlcgkJMworI2RlZmluZSBYX1N5bmNDaGFuZ2VDb3VudGVyCQk0CisjZGVmaW5lIFhfU3luY1F1ZXJ5Q291bnRlciAgICAgICAgICAgICAgNQorI2RlZmluZSBYX1N5bmNEZXN0cm95Q291bnRlcgkJNgorI2RlZmluZSBYX1N5bmNBd2FpdAkJCTcKKyNkZWZpbmUgWF9TeW5jQ3JlYXRlQWxhcm0gICAgICAgICAgICAgICA4CisjZGVmaW5lIFhfU3luY0NoYW5nZUFsYXJtCSAgICAgICAgOQorI2RlZmluZSBYX1N5bmNRdWVyeUFsYXJtCSAgICAgICAxMAorI2RlZmluZSBYX1N5bmNEZXN0cm95QWxhcm0JICAgICAgIDExCisjZGVmaW5lIFhfU3luY1NldFByaW9yaXR5ICAgCSAgICAgICAxMgorI2RlZmluZSBYX1N5bmNHZXRQcmlvcml0eSAgIAkgICAgICAgMTMKKworI2RlZmluZSBYU3luY0NvdW50ZXJOb3RpZnkgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWFN5bmNBbGFybU5vdGlmeQkJMQorI2RlZmluZSBYU3luY0FsYXJtTm90aWZ5TWFzayAJCSgxTCA8PCBYU3luY0FsYXJtTm90aWZ5KQorCisjZGVmaW5lIFhTeW5jTnVtYmVyRXZlbnRzCQkyTAorCisjZGVmaW5lIFhTeW5jQmFkQ291bnRlcgkJCTBMCisjZGVmaW5lIFhTeW5jQmFkQWxhcm0JCQkxTAorI2RlZmluZSBYU3luY051bWJlckVycm9ycwkJKFhTeW5jQmFkQWxhcm0gKyAxKQorCisvKgorICogRmxhZ3MgZm9yIEFsYXJtIEF0dHJpYnV0ZXMKKyAqLworI2RlZmluZSBYU3luY0NBQ291bnRlcgkJCSgxTDw8MCkKKyNkZWZpbmUgWFN5bmNDQVZhbHVlVHlwZQkJKDFMPDwxKQorI2RlZmluZSBYU3luY0NBVmFsdWUJCQkoMUw8PDIpCisjZGVmaW5lIFhTeW5jQ0FUZXN0VHlwZQkJCSgxTDw8MykKKyNkZWZpbmUgWFN5bmNDQURlbHRhCQkJKDFMPDw0KQorI2RlZmluZSBYU3luY0NBRXZlbnRzCQkJKDFMPDw1KQorCisvKgorICogQ29uc3RhbnRzIGZvciB0aGUgdmFsdWVfdHlwZSBhcmd1bWVudCBvZiB2YXJpb3VzIHJlcXVlc3RzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgWFN5bmNBYnNvbHV0ZSwKKyAgICBYU3luY1JlbGF0aXZlCit9IFhTeW5jVmFsdWVUeXBlOworCisvKgorICogQWxhcm0gVGVzdCB0eXBlcworICovCit0eXBlZGVmIGVudW0geworICAgIFhTeW5jUG9zaXRpdmVUcmFuc2l0aW9uLAorICAgIFhTeW5jTmVnYXRpdmVUcmFuc2l0aW9uLAorICAgIFhTeW5jUG9zaXRpdmVDb21wYXJpc29uLAorICAgIFhTeW5jTmVnYXRpdmVDb21wYXJpc29uCit9IFhTeW5jVGVzdFR5cGU7CisKKy8qCisgKiBBbGFybSBzdGF0ZSBjb25zdGFudHMKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBYU3luY0FsYXJtQWN0aXZlLAorICAgIFhTeW5jQWxhcm1JbmFjdGl2ZSwKKyAgICBYU3luY0FsYXJtRGVzdHJveWVkCit9IFhTeW5jQWxhcm1TdGF0ZTsKKworCit0eXBlZGVmIFhJRCBYU3luY0NvdW50ZXI7Cit0eXBlZGVmIFhJRCBYU3luY0FsYXJtOwordHlwZWRlZiBzdHJ1Y3QgX1hTeW5jVmFsdWUgeworICAgIGludCBoaTsKKyAgICB1bnNpZ25lZCBpbnQgbG87Cit9IFhTeW5jVmFsdWU7CisKKy8qCisgKiAgIE1hY3Jvcy9mdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyA2NCBiaXQgdmFsdWVzCisgKi8KKworLyogaGF2ZSB0byBwdXQgdGhlc2UgcHJvdG90eXBlcyBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgbWFjcm8gZGVmaW5pdGlvbnMgKi8KKworZXh0ZXJuIHZvaWQgWFN5bmNJbnRUb1ZhbHVlKAorICAgIFhTeW5jVmFsdWUqIC8qcHYqLywKKyAgICBpbnQgLyppKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jSW50c1RvVmFsdWUoCisgICAgWFN5bmNWYWx1ZSogLypwdiovLAorICAgIHVuc2lnbmVkIGludCAvKmwqLywKKyAgICBpbnQgLypoKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVHcmVhdGVyVGhhbigKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVMZXNzVGhhbigKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVHcmVhdGVyT3JFcXVhbCgKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVMZXNzT3JFcXVhbCgKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVFcXVhbCgKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVJc05lZ2F0aXZlKAorICAgIFhTeW5jVmFsdWUgLyp2Ki8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVJc1plcm8oCisgICAgWFN5bmNWYWx1ZSAvKmEqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUlzUG9zaXRpdmUoCisgICAgWFN5bmNWYWx1ZSAvKnYqLworKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBYU3luY1ZhbHVlTG93MzIoCisgICAgWFN5bmNWYWx1ZSAvKnYqLworKTsKKworZXh0ZXJuIGludCBYU3luY1ZhbHVlSGlnaDMyKAorICAgIFhTeW5jVmFsdWUgLyp2Ki8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jVmFsdWVBZGQoCisgICAgWFN5bmNWYWx1ZSogLypwcmVzdWx0Ki8sCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovLAorICAgIGludCogLypwb3ZlcmZsb3cqLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNWYWx1ZVN1YnRyYWN0KAorICAgIFhTeW5jVmFsdWUqIC8qcHJlc3VsdCovLAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLywKKyAgICBpbnQqIC8qcG92ZXJmbG93Ki8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jTWF4VmFsdWUoCisgICAgWFN5bmNWYWx1ZSogLypwdiovCispOworCitleHRlcm4gdm9pZCBYU3luY01pblZhbHVlKAorICAgIFhTeW5jVmFsdWUqIC8qcHYqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworLyogIFRoZSBfWFN5bmMgbWFjcm9zIGJlbG93IGFyZSBmb3IgbGlicmFyeSBpbnRlcm5hbCB1c2Ugb25seS4gIFRoZXkgZXhpc3QgCisgKiAgc28gdGhhdCBpZiB3ZSBoYXZlIHRvIG1ha2UgYSBmaXgsIHdlIGNhbiBjaGFuZ2UgaXQgaW4gdGhpcyBvbmUgcGxhY2UKKyAqICBhbmQgaGF2ZSBib3RoIHRoZSBtYWNybyBhbmQgZnVuY3Rpb24gdmFyaWFudHMgaW5oZXJpdCB0aGUgZml4LgorICovCisKKyNkZWZpbmUgX1hTeW5jSW50VG9WYWx1ZShwdiwgaSkgICAgICgocHYpLT5oaT0oKGk8MCk/fjA6MCksKHB2KS0+bG89KGkpKQorI2RlZmluZSBfWFN5bmNJbnRzVG9WYWx1ZShwdiwgbCwgaCkgKChwdiktPmxvID0gKGwpLCAocHYpLT5oaSA9IChoKSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVHcmVhdGVyVGhhbihhLCBiKVwKKyAgICAoKGEpLmhpPihiKS5oaSB8fCAoKGEpLmhpPT0oYikuaGkgJiYgKGEpLmxvPihiKS5sbykpCisjZGVmaW5lIF9YU3luY1ZhbHVlTGVzc1RoYW4oYSwgYilcCisgICAgKChhKS5oaTwoYikuaGkgfHwgKChhKS5oaT09KGIpLmhpICYmIChhKS5sbzwoYikubG8pKQorI2RlZmluZSBfWFN5bmNWYWx1ZUdyZWF0ZXJPckVxdWFsKGEsIGIpXAorICAgICgoYSkuaGk+KGIpLmhpIHx8ICgoYSkuaGk9PShiKS5oaSAmJiAoYSkubG8+PShiKS5sbykpCisjZGVmaW5lIF9YU3luY1ZhbHVlTGVzc09yRXF1YWwoYSwgYilcCisgICAgKChhKS5oaTwoYikuaGkgfHwgKChhKS5oaT09KGIpLmhpICYmIChhKS5sbzw9KGIpLmxvKSkKKyNkZWZpbmUgX1hTeW5jVmFsdWVFcXVhbChhLCBiKQkoKGEpLmxvPT0oYikubG8gJiYgKGEpLmhpPT0oYikuaGkpCisjZGVmaW5lIF9YU3luY1ZhbHVlSXNOZWdhdGl2ZSh2KSAoKCh2KS5oaSAmIDB4ODAwMDAwMDApID8gMSA6IDApCisjZGVmaW5lIF9YU3luY1ZhbHVlSXNaZXJvKGEpCSgoYSkubG89PTAgJiYgKGEpLmhpPT0wKQorI2RlZmluZSBfWFN5bmNWYWx1ZUlzUG9zaXRpdmUodikgKCgodikuaGkgJiAweDgwMDAwMDAwKSA/IDAgOiAxKQorI2RlZmluZSBfWFN5bmNWYWx1ZUxvdzMyKHYpCSgodikubG8pCisjZGVmaW5lIF9YU3luY1ZhbHVlSGlnaDMyKHYpCSgodikuaGkpCisjZGVmaW5lIF9YU3luY1ZhbHVlQWRkKHByZXN1bHQsYSxiLHBvdmVyZmxvdykge1wKKwlpbnQgdCA9IChhKS5sbztcCisJQm9vbCBzaWduYSA9IFhTeW5jVmFsdWVJc05lZ2F0aXZlKGEpO1wKKwlCb29sIHNpZ25iID0gWFN5bmNWYWx1ZUlzTmVnYXRpdmUoYik7XAorCSgocHJlc3VsdCktPmxvID0gKGEpLmxvICsgKGIpLmxvKTtcCisJKChwcmVzdWx0KS0+aGkgPSAoYSkuaGkgKyAoYikuaGkpO1wKKwlpZiAodD4ocHJlc3VsdCktPmxvKSAocHJlc3VsdCktPmhpKys7XAorCSpwb3ZlcmZsb3cgPSAoKHNpZ25hID09IHNpZ25iKSAmJiAhKHNpZ25hID09IFhTeW5jVmFsdWVJc05lZ2F0aXZlKCpwcmVzdWx0KSkpO1wKKyAgICAgfQorI2RlZmluZSBfWFN5bmNWYWx1ZVN1YnRyYWN0KHByZXN1bHQsYSxiLHBvdmVyZmxvdykge1wKKwlpbnQgdCA9IChhKS5sbztcCisJQm9vbCBzaWduYSA9IFhTeW5jVmFsdWVJc05lZ2F0aXZlKGEpO1wKKwlCb29sIHNpZ25iID0gWFN5bmNWYWx1ZUlzTmVnYXRpdmUoYik7XAorCSgocHJlc3VsdCktPmxvID0gKGEpLmxvIC0gKGIpLmxvKTtcCisJKChwcmVzdWx0KS0+aGkgPSAoYSkuaGkgLSAoYikuaGkpO1wKKwlpZiAodD4ocHJlc3VsdCktPmxvKSAocHJlc3VsdCktPmhpLS07XAorCSpwb3ZlcmZsb3cgPSAoKHNpZ25hID09IHNpZ25iKSAmJiAhKHNpZ25hID09IFhTeW5jVmFsdWVJc05lZ2F0aXZlKCpwcmVzdWx0KSkpO1wKKyAgICAgfQorI2RlZmluZSBfWFN5bmNNYXhWYWx1ZShwdikgKChwdiktPmhpID0gMHg3ZmZmZmZmZiwgKHB2KS0+bG8gPSAweGZmZmZmZmZmKQorI2RlZmluZSBfWFN5bmNNaW5WYWx1ZShwdikgKChwdiktPmhpID0gMHg4MDAwMDAwMCwgKHB2KS0+bG8gPSAwKQorCisvKgorICogIFRoZXNlIGFyZSB0aGUgcHVibGljYWxseSB1c2FibGUgbWFjcm9zLiAgSWYgeW91IHdhbnQgdGhlIGZ1bmN0aW9uIHZlcnNpb24KKyAqICBvZiBvbmUgb2YgdGhlc2UsIGp1c3QgI3VuZGVmIHRoZSBtYWNybyB0byB1bmNvdmVyIHRoZSBmdW5jdGlvbi4KKyAqICAoVGhpcyBpcyB0aGUgc2FtZSBjb252ZW50aW9uIHRoYXQgdGhlIEFOU0kgQyBsaWJyYXJ5IHVzZXMuKQorICovCisKKyNkZWZpbmUgWFN5bmNJbnRUb1ZhbHVlKHB2LCBpKSBfWFN5bmNJbnRUb1ZhbHVlKHB2LCBpKQorI2RlZmluZSBYU3luY0ludHNUb1ZhbHVlKHB2LCBsLCBoKSBfWFN5bmNJbnRzVG9WYWx1ZShwdiwgbCwgaCkKKyNkZWZpbmUgWFN5bmNWYWx1ZUdyZWF0ZXJUaGFuKGEsIGIpIF9YU3luY1ZhbHVlR3JlYXRlclRoYW4oYSwgYikKKyNkZWZpbmUgWFN5bmNWYWx1ZUxlc3NUaGFuKGEsIGIpIF9YU3luY1ZhbHVlTGVzc1RoYW4oYSwgYikKKyNkZWZpbmUgWFN5bmNWYWx1ZUdyZWF0ZXJPckVxdWFsKGEsIGIpIF9YU3luY1ZhbHVlR3JlYXRlck9yRXF1YWwoYSwgYikKKyNkZWZpbmUgWFN5bmNWYWx1ZUxlc3NPckVxdWFsKGEsIGIpIF9YU3luY1ZhbHVlTGVzc09yRXF1YWwoYSwgYikKKyNkZWZpbmUgWFN5bmNWYWx1ZUVxdWFsKGEsIGIpIF9YU3luY1ZhbHVlRXF1YWwoYSwgYikKKyNkZWZpbmUgWFN5bmNWYWx1ZUlzTmVnYXRpdmUodikgX1hTeW5jVmFsdWVJc05lZ2F0aXZlKHYpCisjZGVmaW5lIFhTeW5jVmFsdWVJc1plcm8oYSkgX1hTeW5jVmFsdWVJc1plcm8oYSkKKyNkZWZpbmUgWFN5bmNWYWx1ZUlzUG9zaXRpdmUodikgX1hTeW5jVmFsdWVJc1Bvc2l0aXZlKHYpCisjZGVmaW5lIFhTeW5jVmFsdWVMb3czMih2KSBfWFN5bmNWYWx1ZUxvdzMyKHYpCisjZGVmaW5lIFhTeW5jVmFsdWVIaWdoMzIodikgX1hTeW5jVmFsdWVIaWdoMzIodikKKyNkZWZpbmUgWFN5bmNWYWx1ZUFkZChwcmVzdWx0LGEsYixwb3ZlcmZsb3cpIF9YU3luY1ZhbHVlQWRkKHByZXN1bHQsYSxiLHBvdmVyZmxvdykKKyNkZWZpbmUgWFN5bmNWYWx1ZVN1YnRyYWN0KHByZXN1bHQsYSxiLHBvdmVyZmxvdykgX1hTeW5jVmFsdWVTdWJ0cmFjdChwcmVzdWx0LGEsYixwb3ZlcmZsb3cpCisjZGVmaW5lIFhTeW5jTWF4VmFsdWUocHYpIF9YU3luY01heFZhbHVlKHB2KQorI2RlZmluZSBYU3luY01pblZhbHVlKHB2KSBfWFN5bmNNaW5WYWx1ZShwdikKKworI2lmbmRlZiBfU1lOQ19TRVJWRVIKKwordHlwZWRlZiBzdHJ1Y3QgX1hTeW5jU3lzdGVtQ291bnRlciB7CisgICAgY2hhciAqbmFtZTsJCQkvKiBudWxsLXRlcm1pbmF0ZWQgbmFtZSBvZiBzeXN0ZW0gY291bnRlciAqLworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiBjb3VudGVyIGlkIG9mIHRoaXMgc3lzdGVtIGNvdW50ZXIgKi8KKyAgICBYU3luY1ZhbHVlIHJlc29sdXRpb247CS8qIHJlc29sdXRpb24gb2YgdGhpcyBzeXN0ZW0gY291bnRlciAqLworfSBYU3luY1N5c3RlbUNvdW50ZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiBjb3VudGVyIHRvIHRyaWdnZXIgb24gKi8KKyAgICBYU3luY1ZhbHVlVHlwZSB2YWx1ZV90eXBlOwkvKiBhYnNvbHV0ZS9yZWxhdGl2ZSAqLworICAgIFhTeW5jVmFsdWUgd2FpdF92YWx1ZTsJLyogdmFsdWUgdG8gY29tcGFyZSBjb3VudGVyIHRvICovCisgICAgWFN5bmNUZXN0VHlwZSB0ZXN0X3R5cGU7CS8qIHBvcy9uZWcgY29tcGFyaXNvbi90cmFuc3Rpb24gKi8KK30gWFN5bmNUcmlnZ2VyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFN5bmNUcmlnZ2VyIHRyaWdnZXI7CS8qIHRyaWdnZXIgZm9yIGF3YWl0ICovCisgICAgWFN5bmNWYWx1ZSBldmVudF90aHJlc2hvbGQ7IC8qIHNlbmQgZXZlbnQgaWYgcGFzdCB0aHJlc2hvbGQgKi8KK30gWFN5bmNXYWl0Q29uZGl0aW9uOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYU3luY1RyaWdnZXIgdHJpZ2dlcjsKKyAgICBYU3luY1ZhbHVlICBkZWx0YTsKKyAgICBCb29sIGV2ZW50czsKKyAgICBYU3luY0FsYXJtU3RhdGUgc3RhdGU7Cit9IFhTeW5jQWxhcm1BdHRyaWJ1dGVzOworCisvKgorICogIEV2ZW50cworICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkvKiBldmVudCBiYXNlICsgWFN5bmNDb3VudGVyTm90aWZ5ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQ291bnRlciBjb3VudGVyOwkvKiBjb3VudGVyIGludm9sdmVkIGluIGF3YWl0ICovCisgICAgWFN5bmNWYWx1ZSB3YWl0X3ZhbHVlOwkvKiB2YWx1ZSBiZWluZyB3YWl0ZWQgZm9yICovCisgICAgWFN5bmNWYWx1ZSBjb3VudGVyX3ZhbHVlOwkvKiBjb3VudGVyIHZhbHVlIHdoZW4gdGhpcyBldmVudCB3YXMgc2VudCAqLworICAgIFRpbWUgdGltZTsJCQkvKiBtaWxsaXNlY29uZHMgKi8KKyAgICBpbnQgY291bnQ7CQkJLyogaG93IG1hbnkgbW9yZSBldmVudHMgdG8gY29tZSAqLworICAgIEJvb2wgZGVzdHJveWVkOwkJLyogVHJ1ZSBpZiBjb3VudGVyIHdhcyBkZXN0cm95ZWQgKi8KK30gWFN5bmNDb3VudGVyTm90aWZ5RXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkvKiBldmVudCBiYXNlICsgWFN5bmNDb3VudGVyTm90aWZ5ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CQkvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tIGEgU2VuZEV2ZW50IHJlcXVlc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQWxhcm0gYWxhcm07CQkvKiBhbGFybSB0aGF0IHRyaWdnZXJlZCAqLworICAgIFhTeW5jVmFsdWUgY291bnRlcl92YWx1ZTsJLyogdmFsdWUgdGhhdCB0cmlnZ2VyZWQgdGhlIGFsYXJtICovCisgICAgWFN5bmNWYWx1ZSBhbGFybV92YWx1ZTsJLyogdGVzdCAgdmFsdWUgb2YgdHJpZ2dlciBpbiBhbGFybSAqLworICAgIFRpbWUgdGltZTsJCQkvKiBtaWxsaXNlY29uZHMgKi8KKyAgICBYU3luY0FsYXJtU3RhdGUgc3RhdGU7CS8qIG5ldyBzdGF0ZSBvZiBhbGFybSAqLworfSBYU3luY0FsYXJtTm90aWZ5RXZlbnQ7CisKKy8qCisgKiAgRXJyb3JzIAorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgdHlwZTsJCQkKKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJLyogRGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhTeW5jQWxhcm0gYWxhcm07CQkvKiByZXNvdXJjZSBpZCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOwkvKiBzZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhciBlcnJvcl9jb2RlOwkvKiBlcnJvciBiYXNlICsgWFN5bmNCYWRBbGFybSAqLworICAgIHVuc2lnbmVkIGNoYXIgcmVxdWVzdF9jb2RlOwkvKiBNYWpvciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhciBtaW5vcl9jb2RlOwkvKiBNaW5vciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCit9IFhTeW5jQWxhcm1FcnJvcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCQorICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXI7CS8qIHJlc291cmNlIGlkICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qIHNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGVycm9yX2NvZGU7CS8qIGVycm9yIGJhc2UgKyBYU3luY0JhZENvdW50ZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJlcXVlc3RfY29kZTsJLyogTWFqb3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGNoYXIgbWlub3JfY29kZTsJLyogTWlub3Igb3AtY29kZSBvZiBmYWlsZWQgcmVxdWVzdCAqLworfSBYU3luY0NvdW50ZXJFcnJvcjsKKworLyogCisgKiAgUHJvdG90eXBlcworICovCisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIFN0YXR1cyBYU3luY1F1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgaW50KiAvKmV2ZW50X2Jhc2VfcmV0dXJuKi8sCisgICAgaW50KiAvKmVycm9yX2Jhc2VfcmV0dXJuKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNJbml0aWFsaXplKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgaW50KiAvKm1ham9yX3ZlcnNpb25fcmV0dXJuKi8sCisgICAgaW50KiAvKm1pbm9yX3ZlcnNpb25fcmV0dXJuKi8KKyk7CisKK2V4dGVybiBYU3luY1N5c3RlbUNvdW50ZXIgKlhTeW5jTGlzdFN5c3RlbUNvdW50ZXJzKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgaW50KiAvKm5fY291bnRlcnNfcmV0dXJuKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jRnJlZVN5c3RlbUNvdW50ZXJMaXN0KAorICAgIFhTeW5jU3lzdGVtQ291bnRlciogLypsaXN0Ki8KKyk7CisKK2V4dGVybiBYU3luY0NvdW50ZXIgWFN5bmNDcmVhdGVDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNWYWx1ZSAvKmluaXRpYWxfdmFsdWUqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY1NldENvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8sCisgICAgWFN5bmNWYWx1ZSAvKnZhbHVlKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNDaGFuZ2VDb3VudGVyKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNDb3VudGVyIC8qY291bnRlciovLAorICAgIFhTeW5jVmFsdWUgLyp2YWx1ZSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jRGVzdHJveUNvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNRdWVyeUNvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8sCisgICAgWFN5bmNWYWx1ZSogLyp2YWx1ZV9yZXR1cm4qLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0F3YWl0KAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNXYWl0Q29uZGl0aW9uKiAvKndhaXRfbGlzdCovLAorICAgIGludCAvKm5fY29uZGl0aW9ucyovCispOworCitleHRlcm4gWFN5bmNBbGFybSBYU3luY0NyZWF0ZUFsYXJtKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgdW5zaWduZWQgbG9uZyAvKnZhbHVlc19tYXNrKi8sCisgICAgWFN5bmNBbGFybUF0dHJpYnV0ZXMqIC8qdmFsdWVzKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNEZXN0cm95QWxhcm0oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0FsYXJtIC8qYWxhcm0qLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY1F1ZXJ5QWxhcm0oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0FsYXJtIC8qYWxhcm0qLywKKyAgICBYU3luY0FsYXJtQXR0cmlidXRlcyogLyp2YWx1ZXNfcmV0dXJuKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNDaGFuZ2VBbGFybSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQWxhcm0gLyphbGFybSovLAorICAgIHVuc2lnbmVkIGxvbmcgLyp2YWx1ZXNfbWFzayovLAorICAgIFhTeW5jQWxhcm1BdHRyaWJ1dGVzKiAvKnZhbHVlcyovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jU2V0UHJpb3JpdHkoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYSUQgLypjbGllbnRfcmVzb3VyY2VfaWQqLywKKyAgICBpbnQgLypwcmlvcml0eSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jR2V0UHJpb3JpdHkoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYSUQgLypjbGllbnRfcmVzb3VyY2VfaWQqLywKKyAgICBpbnQqIC8qcmV0dXJuX3ByaW9yaXR5Ki8KKyk7CisKKyNlbmRpZiAvKiBfU1lOQ19TRVJWRVIgKi8KKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9TWU5DX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luY3N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzg0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmNzdHIuaApAQCAtMCwwICsxLDQ5NCBAQAorLyogJFhvcmc6IHN5bmNzdHIuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAxOTkxLDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCithbmQgT2xpdmV0dGkgUmVzZWFyY2ggTGltaXRlZCwgQ2FtYnJpZGdlLCBFbmdsYW5kLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBEaWdpdGFsIG9yIE9saXZldHRpCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBBTkQgT0xJVkVUVEkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRVkgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKK1VTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9zeW5jc3RyLmgsdiAxLjMgMjAwMy8wNy8xNiAwMTozODoyNCBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9TWU5DU1RSX0hfCisjZGVmaW5lIF9TWU5DU1RSX0hfCisKKyNpbmNsdWRlICJzeW5jLmgiCisKKyNpZm5kZWYgX1NZTkNfT1MKKworLyogY292ZXIgdXAgdHlwZXMgZnJvbSBzeW5jLmggdG8gbWFrZSBzdXJlIHRoZXkncmUgdGhlIHJpZ2h0IHNpemUgZm9yCisgKiBwcm90b2NvbCBwYWNrYWdpbmcuICBUaGVzZSB3aWxsIGJlIHVuZGVmJ2VkIGFmdGVyIGFsbCB0aGUgcHJvdG9jb2wKKyAqIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuCisgKi8KKyNkZWZpbmUgWFN5bmNDb3VudGVyIENBUkQzMgorI2RlZmluZSBYU3luY0FsYXJtICAgQ0FSRDMyCisKKy8qCisgKiBJbml0aWFsaXplCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0luaXRpYWxpemUgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgQ0FSRDgJbWFqb3JWZXJzaW9uOworICAgIENBUkQ4CW1pbm9yVmVyc2lvbjsKKyAgICBDQVJEMTYJcGFkIEIxNjsKK30geFN5bmNJbml0aWFsaXplUmVxOworI2RlZmluZSBzel94U3luY0luaXRpYWxpemVSZXEJCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEJZVEUJdHlwZTsKKyAgICBDQVJEOAl1bnVzZWQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEOAltYWpvclZlcnNpb247CisgICAgQ0FSRDgJbWlub3JWZXJzaW9uOworICAgIENBUkQxNglwYWQgQjE2OworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7Cit9IHhTeW5jSW5pdGlhbGl6ZVJlcGx5OworI2RlZmluZSBzel94U3luY0luaXRpYWxpemVSZXBseQkzMgorCisvKgorICogTGlzdFN5c3RlbUNvdW50ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0xpc3RTeXN0ZW1Db3VudGVycworeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7Cit9IHhTeW5jTGlzdFN5c3RlbUNvdW50ZXJzUmVxOworI2RlZmluZSBzel94U3luY0xpc3RTeXN0ZW1Db3VudGVyc1JlcQk0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgSU5UMzIJbkNvdW50ZXJzIEIzMjsKKyAgICBDQVJEMzIJcGFkMCBCMzI7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworfSB4U3luY0xpc3RTeXN0ZW1Db3VudGVyc1JlcGx5OworI2RlZmluZSBzel94U3luY0xpc3RTeXN0ZW1Db3VudGVyc1JlcGx5CTMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7CisgICAgSU5UMzIJcmVzb2x1dGlvbl9oaSBCMzI7CisgICAgQ0FSRDMyCXJlc29sdXRpb25fbG8gQjMyOworICAgIENBUkQxNgluYW1lX2xlbmd0aCBCMTY7Cit9IHhTeW5jU3lzdGVtQ291bnRlcjsKKyNkZWZpbmUgc3pfeFN5bmNTeXN0ZW1Db3VudGVyIDE0CisKKy8qCisgKiBDcmVhdGUgQ291bnRlcgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDcmVhdGVDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjaWQgQjMyOworICAgIElOVDMyICAgICAgIGluaXRpYWxfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMglpbml0aWFsX3ZhbHVlX2xvIEIzMjsKK30geFN5bmNDcmVhdGVDb3VudGVyUmVxOworI2RlZmluZSBzel94U3luY0NyZWF0ZUNvdW50ZXJSZXEJMTYKKworLyoKKyAqIENoYW5nZSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0NoYW5nZUNvdW50ZXJSZXEgeworICAgIENBUkQ4CXJlcVR5cGU7CisgICAgQ0FSRDgJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2CWxlbmd0aCBCMTY7CisgICAgWFN5bmNDb3VudGVyIGNpZCBCMzI7CisgICAgSU5UMzIgICAgICAgdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgl2YWx1ZV9sbyBCMzI7Cit9IHhTeW5jQ2hhbmdlQ291bnRlclJlcTsKKyNkZWZpbmUgc3pfeFN5bmNDaGFuZ2VDb3VudGVyUmVxCTE2CisKKy8qCisgKiBTZXQgQ291bnRlcgorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNTZXRDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjaWQgQjMyOworICAgIElOVDMyICAgICAgIHZhbHVlX2hpIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVfbG8gQjMyOworfSB4U3luY1NldENvdW50ZXJSZXE7CisjZGVmaW5lIHN6X3hTeW5jU2V0Q291bnRlclJlcQkxNgorCisvKgorICogRGVzdHJveSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0Rlc3Ryb3lDb3VudGVyUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKK30geFN5bmNEZXN0cm95Q291bnRlclJlcTsKKyNkZWZpbmUgc3pfeFN5bmNEZXN0cm95Q291bnRlclJlcQk4CisKKy8qCisgKiBRdWVyeSBDb3VudGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY1F1ZXJ5Q291bnRlclJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7Cit9IHhTeW5jUXVlcnlDb3VudGVyUmVxOworI2RlZmluZSBzel94U3luY1F1ZXJ5Q291bnRlclJlcQkJOAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgSU5UMzIJdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgl2YWx1ZV9sbyBCMzI7CisgICAgQ0FSRDMyCXBhZDAgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworfSB4U3luY1F1ZXJ5Q291bnRlclJlcGx5OworI2RlZmluZSBzel94U3luY1F1ZXJ5Q291bnRlclJlcGx5CTMyCisKKy8qCisgKiBBd2FpdAorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNBd2FpdFJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKK30geFN5bmNBd2FpdFJlcTsKKyNkZWZpbmUgc3pfeFN5bmNBd2FpdFJlcQkJNAorCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNXYWl0Q29uZGl0aW9uIHsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7CisgICAgQ0FSRDMyCXZhbHVlX3R5cGUgQjMyOworICAgIElOVDMyICAgICAgIHdhaXRfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMiAgICAgIHdhaXRfdmFsdWVfbG8gQjMyOworICAgIENBUkQzMgl0ZXN0X3R5cGUgQjMyOworICAgIElOVDMyCWV2ZW50X3RocmVzaG9sZF9oaSBCMzI7CisgICAgQ0FSRDMyCWV2ZW50X3RocmVzaG9sZF9sbyBCMzI7Cit9IHhTeW5jV2FpdENvbmRpdGlvbjsKKyNkZWZpbmUgc3pfeFN5bmNXYWl0Q29uZGl0aW9uCQkyOAorCisvKgorICogQ3JlYXRlIEFsYXJtCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0NyZWF0ZUFsYXJtUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQWxhcm0JaWQgQjMyOworICAgIENBUkQzMiAgICAgIHZhbHVlTWFzayBCMzI7Cit9IHhTeW5jQ3JlYXRlQWxhcm1SZXE7CisjZGVmaW5lIHN6X3hTeW5jQ3JlYXRlQWxhcm1SZXEJCTEyCisKKy8qCisgKiBEZXN0cm95IEFsYXJtCisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0Rlc3Ryb3lBbGFybVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0FsYXJtCWFsYXJtIEIzMjsKK30geFN5bmNEZXN0cm95QWxhcm1SZXE7CisjZGVmaW5lIHN6X3hTeW5jRGVzdHJveUFsYXJtUmVxCQk4CisKKy8qCisgKiBRdWVyeSBBbGFybQorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNRdWVyeUFsYXJtUmVxIHsKKyAgICBDQVJEOAlyZXFUeXBlOworICAgIENBUkQ4CXN5bmNSZXFUeXBlOworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFhTeW5jQWxhcm0JYWxhcm0gQjMyOworfSB4U3luY1F1ZXJ5QWxhcm1SZXE7CisjZGVmaW5lIHN6X3hTeW5jUXVlcnlBbGFybVJlcQkJOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOworICAgIENBUkQ4CXVudXNlZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIFhTeW5jQ291bnRlciBjb3VudGVyIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVfdHlwZSBCMzI7CisgICAgSU5UMzIJd2FpdF92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCXdhaXRfdmFsdWVfbG8gQjMyOworICAgIENBUkQzMgl0ZXN0X3R5cGUgICAgICBCMzI7CisgICAgSU5UMzIJZGVsdGFfaGkgQjMyOworICAgIENBUkQzMglkZWx0YV9sbyBCMzI7CisgICAgQk9PTCAgICAgICAgZXZlbnRzOworICAgIEJZVEUgICAgICAgIHN0YXRlOworICAgIEJZVEUJcGFkMDsKKyAgICBCWVRFCXBhZDE7Cit9IHhTeW5jUXVlcnlBbGFybVJlcGx5OworI2RlZmluZSBzel94U3luY1F1ZXJ5QWxhcm1SZXBseQkJNDAKKworLyoKKyAqIENoYW5nZSBBbGFybQorICovCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDaGFuZ2VBbGFybVJlcSB7CisgICAgQ0FSRDgJcmVxVHlwZTsKKyAgICBDQVJEOAlzeW5jUmVxVHlwZTsKKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBYU3luY0FsYXJtCWFsYXJtIEIzMjsKKyAgICBDQVJEMzIJdmFsdWVNYXNrIEIzMjsKK30geFN5bmNDaGFuZ2VBbGFybVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNDaGFuZ2VBbGFybVJlcQkJMTIKKworLyoKKyAqIFNldFByaW9yaXR5CisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY1NldFByaW9yaXR5eworICAgIENBUkQ4ICAgCXJlcVR5cGU7CisgICAgQ0FSRDggICAJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgIAlpZCBCMzI7CisgICAgSU5UMzIgIAlwcmlvcml0eSBCMzI7Cit9IHhTeW5jU2V0UHJpb3JpdHlSZXE7CisjZGVmaW5lIHN6X3hTeW5jU2V0UHJpb3JpdHlSZXEJICAgIAkxMgorCisvKgorICogR2V0IFByaW9yaXR5CisgKi8KK3R5cGVkZWYgc3RydWN0IF94U3luY0dldFByaW9yaXR5eworICAgIENBUkQ4ICAgCXJlcVR5cGU7CisgICAgQ0FSRDggICAJc3luY1JlcVR5cGU7CisgICAgQ0FSRDE2ICAJbGVuZ3RoIEIxNjsKKyAgICBDQVJEMzIgIAlpZCBCMzI7IC8qWFhYIFhJRD8gKi8KK30geFN5bmNHZXRQcmlvcml0eVJlcTsKKyNkZWZpbmUgc3pfeFN5bmNHZXRQcmlvcml0eVJlcQkgICAgCSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CisgICAgQ0FSRDgJdW51c2VkOworICAgIENBUkQxNglzZXF1ZW5jZU51bWJlciBCMTY7CisgICAgQ0FSRDMyCWxlbmd0aCBCMzI7CisgICAgSU5UMzIgIAlwcmlvcml0eSBCMzI7CisgICAgQ0FSRDMyICAJcGFkMCBCMzI7CisgICAgQ0FSRDMyICAJcGFkMSBCMzI7CisgICAgQ0FSRDMyICAJcGFkMiBCMzI7CisgICAgQ0FSRDMyICAJcGFkMyBCMzI7CisgICAgQ0FSRDMyICAJcGFkNCBCMzI7Cit9IHhTeW5jR2V0UHJpb3JpdHlSZXBseTsKKyNkZWZpbmUgc3pfeFN5bmNHZXRQcmlvcml0eVJlcGx5CTMyCisKKy8qCisgKiBFdmVudHMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfeFN5bmNDb3VudGVyTm90aWZ5RXZlbnQgeworICAgIEJZVEUJdHlwZTsKKyAgICBCWVRFCWtpbmQ7CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBYU3luY0NvdW50ZXIgY291bnRlciBCMzI7CisgICAgSU5UMzIJd2FpdF92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCXdhaXRfdmFsdWVfbG8gQjMyOworICAgIElOVDMyCWNvdW50ZXJfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgljb3VudGVyX3ZhbHVlX2xvIEIzMjsKKyAgICBDQVJEMzIJdGltZSBCMzI7CisgICAgQ0FSRDE2CWNvdW50IEIxNjsKKyAgICBCT09MCWRlc3Ryb3llZDsKKyAgICBCWVRFICAgICAgICBwYWQwOworfSB4U3luY0NvdW50ZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgX3hTeW5jQWxhcm1Ob3RpZnlFdmVudCB7CisgICAgQllURQl0eXBlOworICAgIEJZVEUJa2luZDsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIFhTeW5jQWxhcm0JYWxhcm0gQjMyOworICAgIElOVDMyCWNvdW50ZXJfdmFsdWVfaGkgQjMyOworICAgIENBUkQzMgljb3VudGVyX3ZhbHVlX2xvIEIzMjsKKyAgICBJTlQzMglhbGFybV92YWx1ZV9oaSBCMzI7CisgICAgQ0FSRDMyCWFsYXJtX3ZhbHVlX2xvIEIzMjsKKyAgICBDQVJEMzIJdGltZSBCMzI7CisgICAgQ0FSRDggICAgICAgc3RhdGU7CisgICAgQllURSAgICAgICAgcGFkMDsKKyAgICBCWVRFICAgICAgICBwYWQxOworICAgIEJZVEUgICAgICAgIHBhZDI7Cit9IHhTeW5jQWxhcm1Ob3RpZnlFdmVudDsKKworI3VuZGVmIFhTeW5jQ291bnRlcgorI3VuZGVmIFhTeW5jQWxhcm0KKworI2VuZGlmIC8qIF9TWU5DX09TICovCisKKyNpZmRlZiBfU1lOQ19TRVJWRVIKKworI2RlZmluZSBDQVJENjQgWFN5bmNWYWx1ZSAvKiBYWFggdGVtcG9yYXJ5ISBuZWVkIHJlYWwgNjQgYml0IHZhbHVlcyBmb3IgQWxwaGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1N5bmNDb3VudGVyIHsKKyAgICBDbGllbnRQdHIJCWNsaWVudDsJLyogT3duaW5nIGNsaWVudC4gMCBmb3Igc3lzdGVtIGNvdW50ZXJzICovCisgICAgWFN5bmNDb3VudGVyCWlkOwkJLyogcmVzb3VyY2UgSUQgKi8KKyAgICBDQVJENjQJCXZhbHVlOwkJLyogY291bnRlciB2YWx1ZSAqLworICAgIHN0cnVjdCBfU3luY1RyaWdnZXJMaXN0ICpwVHJpZ2xpc3Q7CS8qIGxpc3Qgb2YgdHJpZ2dlcnMgKi8KKyAgICBCb29sCQliZWluZ0Rlc3Ryb3llZDsgLyogaW4gcHJvY2VzcyBvZiBnb2luZyBhd2F5ICovCisgICAgc3RydWN0IF9TeXNDb3VudGVySW5mbyAqcFN5c0NvdW50ZXJJbmZvOyAvKiBOVUxMIGlmIG5vdCBhIHN5c3RlbSBjb3VudGVyICovCit9IFN5bmNDb3VudGVyOworCisvKgorICogVGhlIFN5c3RlbSBDb3VudGVyIGludGVyZmFjZQorICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgWFN5bmNDb3VudGVyTmV2ZXJDaGFuZ2VzLAorICAgIFhTeW5jQ291bnRlck5ldmVySW5jcmVhc2VzLAorICAgIFhTeW5jQ291bnRlck5ldmVyRGVjcmVhc2VzLAorICAgIFhTeW5jQ291bnRlclVucmVzdHJpY3RlZAorfSBTeW5jQ291bnRlclR5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9TeXNDb3VudGVySW5mbyB7CisgICAgY2hhcgkqbmFtZTsKKyAgICBDQVJENjQJcmVzb2x1dGlvbjsKKyAgICBDQVJENjQJYnJhY2tldF9ncmVhdGVyOworICAgIENBUkQ2NAlicmFja2V0X2xlc3M7CisgICAgU3luY0NvdW50ZXJUeXBlIGNvdW50ZXJUeXBlOyAgLyogaG93IGNhbiB0aGlzIGNvdW50ZXIgY2hhbmdlICovCisgICAgdm9pZCAgICAgICAgKCpRdWVyeVZhbHVlKSgKKwkJCSAgICAgIHBvaW50ZXIgLypwQ291bnRlciovLAorCQkJICAgICAgQ0FSRDY0ICogLypmcmVzaHZhbHVlKi8KKyk7CisgICAgdm9pZAkoKkJyYWNrZXRWYWx1ZXMpKAorCQkJCSBwb2ludGVyIC8qcENvdW50ZXIqLywKKwkJCQkgQ0FSRDY0ICogLypsZXNzdGhhbiovLAorCQkJCSBDQVJENjQgKiAvKmdyZWF0ZXJ0aGFuKi8KKyk7Cit9IFN5c0NvdW50ZXJJbmZvOworCisKKwordHlwZWRlZiBzdHJ1Y3QgX1N5bmNUcmlnZ2VyIHsKKyAgICBTeW5jQ291bnRlciAqcENvdW50ZXI7CisgICAgQ0FSRDY0CXdhaXRfdmFsdWU7CS8qIHdhaXQgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgdmFsdWVfdHlwZTsgICAgIC8qIEFic29sdXRlIG9yIFJlbGF0aXZlICovCisgICAgdW5zaWduZWQgaW50IHRlc3RfdHlwZTsJLyogdHJhbnNpdGlvbiBvciBDb21wYXJpc2lvbiB0eXBlICovCisgICAgQ0FSRDY0CXRlc3RfdmFsdWU7CS8qIHRyaWdnZXIgZXZlbnQgdGhyZXNob2xkIHZhbHVlICovCisgICAgQm9vbAkoKkNoZWNrVHJpZ2dlcikoCisJCQkJc3RydWN0IF9TeW5jVHJpZ2dlciAqIC8qcFRyaWdnZXIqLywKKwkJCQlDQVJENjQgLypuZXd2YWwqLworCQkJCSk7CisgICAgdm9pZAkoKlRyaWdnZXJGaXJlZCkoCisJCQkJc3RydWN0IF9TeW5jVHJpZ2dlciAqIC8qcFRyaWdnZXIqLworCQkJCSk7CisgICAgdm9pZAkoKkNvdW50ZXJEZXN0cm95ZWQpKAorCQkJCXN0cnVjdCBfU3luY1RyaWdnZXIgKiAvKnBUcmlnZ2VyKi8KKwkJCQkgICAgKTsKK30gU3luY1RyaWdnZXI7CisKK3R5cGVkZWYgc3RydWN0IF9TeW5jVHJpZ2dlckxpc3QgeworICAgIFN5bmNUcmlnZ2VyICpwVHJpZ2dlcjsKKyAgICBzdHJ1Y3QgX1N5bmNUcmlnZ2VyTGlzdCAqbmV4dDsKK30gU3luY1RyaWdnZXJMaXN0OworCit0eXBlZGVmIHN0cnVjdCBfU3luY0FsYXJtQ2xpZW50TGlzdCB7CisgICAgQ2xpZW50UHRyCWNsaWVudDsKKyAgICBYSUQJCWRlbGV0ZV9pZDsKKyAgICBzdHJ1Y3QgX1N5bmNBbGFybUNsaWVudExpc3QgKm5leHQ7Cit9IFN5bmNBbGFybUNsaWVudExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IF9TeW5jQWxhcm0geworICAgIFN5bmNUcmlnZ2VyIHRyaWdnZXI7CisgICAgQ2xpZW50UHRyCWNsaWVudDsKKyAgICBYU3luY0FsYXJtIAlhbGFybV9pZDsKKyAgICBDQVJENjQJZGVsdGE7CisgICAgaW50CQlldmVudHM7CisgICAgaW50CQlzdGF0ZTsKKyAgICBTeW5jQWxhcm1DbGllbnRMaXN0ICpwRXZlbnRDbGllbnRzOworfSBTeW5jQWxhcm07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDbGllbnRQdHIJY2xpZW50OworICAgIENBUkQzMiAJZGVsZXRlX2lkOworICAgIGludAkJbnVtX3dhaXRjb25kaXRpb25zOworfSBTeW5jQXdhaXRIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTeW5jVHJpZ2dlciB0cmlnZ2VyOworICAgIENBUkQ2NAlldmVudF90aHJlc2hvbGQ7CisgICAgU3luY0F3YWl0SGVhZGVyICpwSGVhZGVyOworfSBTeW5jQXdhaXQ7CisKK3R5cGVkZWYgdW5pb24geworICAgIFN5bmNBd2FpdEhlYWRlciBoZWFkZXI7CisgICAgU3luY0F3YWl0CSAgICBhd2FpdDsKK30gU3luY0F3YWl0VW5pb247CisKKworZXh0ZXJuIHBvaW50ZXIgU3luY0NyZWF0ZVN5c3RlbUNvdW50ZXIoCisgICAgY2hhciAqCS8qIG5hbWUgKi8sCisgICAgQ0FSRDY0ICAJLyogaW5pdGFsX3ZhbHVlICovLAorICAgIENBUkQ2NCAgCS8qIHJlc29sdXRpb24gKi8sCisgICAgU3luY0NvdW50ZXJUeXBlIC8qIGNoYW5nZSBjaGFyYWN0ZXJpemF0aW9uICovLAorICAgIHZvaWQgICAgICAgICgqIC8qUXVlcnlWYWx1ZSovICkgKAorICAgICAgICBwb2ludGVyIC8qIHBDb3VudGVyICovLAorICAgICAgICBDQVJENjQgKiAvKiBwVmFsdWVfcmV0dXJuICovKSwgLyogWFhYIHByb3RvdHlwZSAqLworICAgIHZvaWQgICAgICAgICgqIC8qQnJhY2tldFZhbHVlcyovKSAoCisgICAgICAgIHBvaW50ZXIgLyogcENvdW50ZXIgKi8sIAorICAgICAgICBDQVJENjQgKiAvKiBwYnJhY2tldF9sZXNzICovLAorICAgICAgICBDQVJENjQgKiAvKiBwYnJhY2tldF9ncmVhdGVyICovKQorKTsKKworZXh0ZXJuIHZvaWQgU3luY0NoYW5nZUNvdW50ZXIoCisgICAgU3luY0NvdW50ZXIgKgkvKiBwQ291bnRlciovLAorICAgIENBUkQ2NCAgCQkvKiBuZXdfdmFsdWUgKi8KKyk7CisKK2V4dGVybiB2b2lkIFN5bmNEZXN0cm95U3lzdGVtQ291bnRlcigKKyAgICBwb2ludGVyIHBDb3VudGVyCispOworZXh0ZXJuIHZvaWQgSW5pdFNlcnZlcnRpbWUodm9pZCk7CisKKyNlbmRpZiAvKiBfU1lOQ19TRVJWRVIgKi8KKworI2VuZGlmIC8qIF9TWU5DU1RSX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ5Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDEuaApAQCAtMCwwICsxLDMyNiBAQAorLyogJFhvcmc6IHh0ZXN0ZXh0MS5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworLyoKKyAqIHh0ZXN0ZXh0MS5oCisgKgorICogWDExIElucHV0IFN5bnRoZXNpcyBFeHRlbnNpb24gaW5jbHVkZSBmaWxlCisgKi8KKworLyoKKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NiwgMTk4NywgMTk4OCBieSBIZXdsZXR0LVBhY2thcmQgQ29ycG9yYXRpb24KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dAorZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKK25vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0Citub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEhld2xldHQtUGFja2FyZCBub3QgYmUgdXNlZCBpbgorYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorCitIZXdsZXR0LVBhY2thcmQgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSAKK3N1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgCisiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorCitUaGlzIHNvZnR3YXJlIGlzIG5vdCBzdWJqZWN0IHRvIGFueSBsaWNlbnNlIG9mIHRoZSBBbWVyaWNhbgorVGVsZXBob25lIGFuZCBUZWxlZ3JhcGggQ29tcGFueSBvciBvZiB0aGUgUmVnZW50cyBvZiB0aGUKK1VuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKworKi8KKworLyoKKyAqIHRoZSB0eXBlZGVmcyBmb3IgQ0FSRDgsIENBUkQxNiwgYW5kIENBUkQzMiBhcmUgZGVmaW5lZCBpbiBYbWQuaAorICovCisKKy8qCisgKiB1c2VkIGluIHRoZSBYVGVzdFByZXNzQnV0dG9uIGFuZCBYVGVzdFByZXNzS2V5IGZ1bmN0aW9ucworICovCisjZGVmaW5lIFhUZXN0UFJFU1MgICAgICAgICAgICAgICAgICAgICAgMSA8PCAwCisjZGVmaW5lIFhUZXN0UkVMRUFTRSAgICAgICAgICAgICAgICAgICAgMSA8PCAxCisjZGVmaW5lIFhUZXN0U1RST0tFICAgICAgICAgICAgICAgICAgICAgMSA8PCAyCisKKy8qCisgKiBXaGVuIGRvaW5nIGEga2V5IG9yIGJ1dHRvbiBzdHJva2UsIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgKiB0byBkZWxheSBiZXR3ZWVuIHRoZSBwcmVzcyBhbmQgdGhlIHJlbGVhc2Ugb2YgYSBrZXkgb3IgYnV0dG9uCisgKiBpbiB0aGUgWFRlc3RQcmVzc0J1dHRvbiBhbmQgWFRlc3RQcmVzc0tleSBmdW5jdGlvbnMuCisgKi8KKworI2RlZmluZSBYVGVzdFNUUk9LRV9ERUxBWV9USU1FCQkxMAorCisvKgorICogdXNlZCBpbiB0aGUgWFRlc3RHZXRJbnB1dCBmdW5jdGlvbgorICovCisjZGVmaW5lIFhUZXN0RVhDTFVTSVZFICAgICAgICAgICAgICAgICAgMSA8PCAwCisjZGVmaW5lIFhUZXN0UEFDS0VEX0FDVElPTlMgICAgICAgICAgICAgMSA8PCAxCisjZGVmaW5lIFhUZXN0UEFDS0VEX01PVElPTiAgICAgICAgICAgICAgMSA8PCAyCisKKy8qCisgKiB1c2VkIGluIHRoZSBYVGVzdEZha2VJbnB1dCBmdW5jdGlvbgorICovCisjZGVmaW5lIFhUZXN0RkFLRV9BQ0tfTk9UX05FRURFRCAgICAgICAgMAorI2RlZmluZSBYVGVzdEZBS0VfQUNLX1JFUVVFU1QgICAgICAgICAgIDEKKworLyoKKyAqIHVzZWQgaW4gdGhlIFhUZXN0IGV4dGVuc2lvbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCisgKi8KKyNkZWZpbmUgWFRlc3RFWFRFTlNJT05fTkFNRSAgICAgICAgICAgICAiWFRlc3RFeHRlbnNpb24xIgorI2RlZmluZSBYVGVzdEVWRU5UX0NPVU5UICAgICAgICAgICAgICAgIDIKKworLyoKKyAqIFhUZXN0IHJlcXVlc3QgdHlwZSB2YWx1ZXMgCisgKgorICogdXNlZCBpbiB0aGUgWFRlc3QgZXh0ZW5zaW9uIHByb3RvY29sIHJlcXVlc3RzCisgKi8KKyNkZWZpbmUgWF9UZXN0RmFrZUlucHV0ICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBYX1Rlc3RHZXRJbnB1dCAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhfVGVzdFN0b3BJbnB1dCAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWF9UZXN0UmVzZXQgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBYX1Rlc3RRdWVyeUlucHV0U2l6ZSAgICAgICAgICAgICA1CisKKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhIGxpc3Qgb2YgaW5wdXQgYWN0aW9ucworICogdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLiAgSXQgc2hvdWxkIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mCisgKiA0IHNvIHRoYXQgdGhlIGVudGlyZSB4VGVzdEZha2VJbnB1dFJlcSBzdHJ1Y3R1cmUgc2l6ZSBpcyBhCisgKiBtdWx0aXBsZSBvZiA0LgorICovCisjZGVmaW5lIFhUZXN0TUFYX0FDVElPTl9MSVNUX1NJWkUgICAgICAgNjQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIHJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWFRlc3RSZXFDb2RlICAgICAgICAgICAgICovCisgICAgICAgIENBUkQ4ICAgWFRlc3RSZXFUeXBlOyAgIC8qIGFsd2F5cyBYX1Rlc3RGYWtlSW5wdXQgICAgICAgICAgICovCisgICAgICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsgICAgIC8qIDIgKyBYVGVzdE1BWF9BQ1RJT05fTElTVF9TSVpFLzQgKi8KKyAgICAgICAgQ0FSRDMyICBhY2sgQjMyOworICAgICAgICBDQVJEOCAgIGFjdGlvbl9saXN0W1hUZXN0TUFYX0FDVElPTl9MSVNUX1NJWkVdOworfSB4VGVzdEZha2VJbnB1dFJlcTsKKyNkZWZpbmUgc3pfeFRlc3RGYWtlSW5wdXRSZXEgKFhUZXN0TUFYX0FDVElPTl9MSVNUX1NJWkUgKyA4KQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgcmVxVHlwZTsgICAgICAgIC8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgICovCisgICAgICAgIENBUkQ4ICAgWFRlc3RSZXFUeXBlOyAgIC8qIGFsd2F5cyBYX1Rlc3RHZXRJbnB1dCAqLworICAgICAgICBDQVJEMTYgIGxlbmd0aCBCMTY7ICAgICAvKiAyICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBDQVJEMzIgIG1vZGUgQjMyOworfSB4VGVzdEdldElucHV0UmVxOworI2RlZmluZSBzel94VGVzdEdldElucHV0UmVxIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIHJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWFRlc3RSZXFDb2RlICAgKi8KKyAgICAgICAgQ0FSRDggICBYVGVzdFJlcVR5cGU7ICAgLyogYWx3YXlzIFhfVGVzdFN0b3BJbnB1dCAqLworICAgICAgICBDQVJEMTYgIGxlbmd0aCBCMzI7ICAgICAvKiAxICAgICAgICAgICAgICAgICAgICAgKi8KK30geFRlc3RTdG9wSW5wdXRSZXE7CisjZGVmaW5lIHN6X3hUZXN0U3RvcElucHV0UmVxIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIHJlcVR5cGU7ICAgICAgICAvKiBhbHdheXMgWFRlc3RSZXFDb2RlICovCisgICAgICAgIENBUkQ4ICAgWFRlc3RSZXFUeXBlOyAgIC8qIGFsd2F5cyBYX1Rlc3RSZXNldCAgICovCisgICAgICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsgICAgIC8qIDEgICAgICAgICAgICAgICAgICAgKi8KK30geFRlc3RSZXNldFJlcTsKKyNkZWZpbmUgc3pfeFRlc3RSZXNldFJlcSA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgQ0FSRDggICByZXFUeXBlOyAgICAgICAgLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAgICAgICAgKi8KKyAgICAgICAgQ0FSRDggICBYVGVzdFJlcVR5cGU7ICAgLyogYWx3YXlzIFhfVGVzdFF1ZXJ5SW5wdXRTaXplICovCisgICAgICAgIENBUkQxNiAgbGVuZ3RoIEIxNjsgICAgIC8qIDEgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IHhUZXN0UXVlcnlJbnB1dFNpemVSZXE7CisjZGVmaW5lIHN6X3hUZXN0UXVlcnlJbnB1dFNpemVSZXEgNAorCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmVwbHkgZm9yIHRoZSB4VGVzdFF1ZXJ5SW5wdXRTaXplCisgKiByZXF1ZXN0LiAgSXQgc2hvdWxkIHJlbWFpbiB0aGUgc2FtZSBtaW5pbXVtIHNpemUgYXMgb3RoZXIgcmVwbGllcworICogKDMyIGJ5dGVzKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBDQVJEOCAgIHR5cGU7ICAgICAgICAgICAvKiBhbHdheXMgWF9SZXBseSAgKi8KKyAgICAgICAgQ0FSRDggICBwYWQxOworICAgICAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICAgICAgQ0FSRDMyICBsZW5ndGggQjMyOyAgICAgLyogYWx3YXlzIDAgKi8KKyAgICAgICAgQ0FSRDMyICBzaXplX3JldHVybiBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMiBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMyBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkNCBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkNSBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkNiBCMzI7Cit9IHhUZXN0UXVlcnlJbnB1dFNpemVSZXBseTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBpbnB1dCBhY3Rpb24gd2lyZSBldmVudCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGV2ZW50IGlzIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIHRoZSBzZXJ2ZXIgaGFzIG9uZSBvcgorICogbW9yZSB1c2VyIGlucHV0IGFjdGlvbnMgdG8gcmVwb3J0IHRvIHRoZSBjbGllbnQuICBJdCBtdXN0CisgKiByZW1haW4gdGhlIHNhbWUgc2l6ZSBhcyBhbGwgb3RoZXIgd2lyZSBldmVudHMgKDMyIGJ5dGVzKS4KKyAqLworI2RlZmluZSBYVGVzdEFDVElPTlNfU0laRQkyOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdElucHV0QWN0aW9uVHlwZSAqLworICAgICAgICBDQVJEOCAgIHBhZDAwOworICAgICAgICBDQVJEMTYgIHNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICAgICAgQ0FSRDggICBhY3Rpb25zW1hUZXN0QUNUSU9OU19TSVpFXTsKK30geFRlc3RJbnB1dEFjdGlvbkV2ZW50OworCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIHhUZXN0RmFrZUFjayB3aXJlIGV2ZW50IHN0cnVjdHVyZS4KKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBoYXMgY29tcGxldGVseQorICogcHJvY2Vzc2VkIGl0cyBpbnB1dCBhY3Rpb24gYnVmZmVyLCBhbmQgaXMgcmVhZHkgZm9yIG1vcmUuCisgKiBJdCBtdXN0IHJlbWFpbiB0aGUgc2FtZSBzaXplIGFzIGFsbCBvdGhlciB3aXJlIGV2ZW50cyAoMzIgYnl0ZXMpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdEZha2VBY2tUeXBlICovCisgICAgICAgIENBUkQ4ICAgcGFkMDA7CisgICAgICAgIENBUkQxNiAgc2VxdWVuY2VOdW1iZXIgQjE2OworICAgICAgICBDQVJEMzIgIHBhZDAyIEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQwMyBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMDQgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDA1IEIzMjsKKyAgICAgICAgQ0FSRDMyICBwYWQwNiBCMzI7CisgICAgICAgIENBUkQzMiAgcGFkMDcgQjMyOworICAgICAgICBDQVJEMzIgIHBhZDA4IEIzMjsKK30geFRlc3RGYWtlQWNrRXZlbnQ7CisKKy8qCisgKiBUaGUgc2VydmVyIHNpZGUgb2YgdGhpcyBleHRlbnNpb24gZG9lcyBub3QgKGFuZCBzaG91bGQgbm90KSBoYXZlCisgKiBkZWZpbml0aW9ucyBmb3IgRGlzcGxheSBhbmQgV2luZG93LiAgVGhlIGlmbmRlZiBhbGxvd3MgdGhlIHNlcnZlcgorICogc2lkZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIGlnbm9yZSB0aGUgZm9sbG93aW5nIHR5cGVkZWZzLgorICovCisjaWZuZGVmIFhUZXN0U0VSVkVSX1NJREUKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgaW5wdXQgYWN0aW9uIGhvc3QgZm9ybWF0IGV2ZW50IHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgdGhlIGZvcm0gdGhhdCBhIGNsaWVudCB1c2luZyB0aGlzIGV4dGVuc2lvbiB3aWxsIHNlZSB3aGVuCisgKiBpdCByZWNlaXZlcyBhbiBpbnB1dCBhY3Rpb24gZXZlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICB0eXBlOyAgICAgICAgICAgLyogYWx3YXlzIFhUZXN0SW5wdXRBY3Rpb25UeXBlICovCisJRGlzcGxheSAqZGlzcGxheTsKKwlXaW5kb3cgIHdpbmRvdzsKKyAgICAgICAgQ0FSRDggICBhY3Rpb25zW1hUZXN0QUNUSU9OU19TSVpFXTsKK30gWFRlc3RJbnB1dEFjdGlvbkV2ZW50OworCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIHhUZXN0RmFrZUFjayBob3N0IGZvcm1hdCBldmVudCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIHRoZSBmb3JtIHRoYXQgYSBjbGllbnQgdXNpbmcgdGhpcyBleHRlbnNpb24gd2lsbCBzZWUgd2hlbgorICogaXQgcmVjZWl2ZXMgYW4gWFRlc3RGYWtlQWNrIGV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCAgICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdEZha2VBY2tUeXBlICovCisJRGlzcGxheSAqZGlzcGxheTsKKwlXaW5kb3cgIHdpbmRvdzsKK30gWFRlc3RGYWtlQWNrRXZlbnQ7CisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBmb3JtYXQgb2YgdGhlIGhlYWRlciBieXRlCisgKiBpbiB0aGUgaW5wdXQgYWN0aW9uIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgWFRlc3RBQ1RJT05fVFlQRV9NQVNLICAgMHgwMyAgICAvKiBiaXRzIDAgYW5kIDEgICAgICAgICAgKi8KKyNkZWZpbmUgWFRlc3RLRVlfU1RBVEVfTUFTSyAgICAgMHgwNCAgICAvKiBiaXQgMiAoa2V5IGFjdGlvbikgICAgKi8KKyNkZWZpbmUgWFRlc3RYX1NJR05fQklUX01BU0sgICAgMHgwNCAgICAvKiBiaXQgMiAobW90aW9uIGFjdGlvbikgKi8KKyNkZWZpbmUgWFRlc3RZX1NJR05fQklUX01BU0sgICAgMHgwOCAgICAvKiBiaXQgMyAobW90aW9uIGFjdGlvbikgKi8KKyNkZWZpbmUgWFRlc3RERVZJQ0VfSURfTUFTSyAgICAgMHhmMCAgICAvKiBiaXRzIDQgdGhyb3VnaCA3ICAgICAgKi8KKworI2RlZmluZSBYVGVzdE1BWF9ERVZJQ0VfSUQJMHgwZgorI2RlZmluZSBYVGVzdFBhY2tEZXZpY2VJRCh4KQkoKCh4KSAmIFhUZXN0TUFYX0RFVklDRV9JRCkgPDwgNCkKKyNkZWZpbmUgWFRlc3RVbnBhY2tEZXZpY2VJRCh4KQkoKCh4KSAmIFhUZXN0REVWSUNFX0lEX01BU0spID4+IDQpCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIGFjdGlvbiB0eXBlcy4KKyAqLworI2RlZmluZSBYVGVzdERFTEFZX0FDVElPTiAgICAgICAwCisjZGVmaW5lIFhUZXN0S0VZX0FDVElPTiAgICAgICAgIDEKKyNkZWZpbmUgWFRlc3RNT1RJT05fQUNUSU9OICAgICAgMgorI2RlZmluZSBYVGVzdEpVTVBfQUNUSU9OICAgICAgICAzCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciBrZXkvYnV0dG9uIG1vdGlvbiBpbnB1dCBhY3Rpb25zLgorICovCisjZGVmaW5lIFhUZXN0S0VZX1VQICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFRlc3RLRVlfRE9XTiAgICAgICAgICAgMHgwMAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIHdoaWNoIGRldmljZSwga2V5IHVwL2Rvd24gKi8KKyAgICAgICAgQ0FSRDggICBrZXljb2RlOyAgICAgICAgLyogd2hpY2gga2V5L2J1dHRvbiB0byBtb3ZlICAqLworICAgICAgICBDQVJEMTYgIGRlbGF5X3RpbWUgQjE2OyAvKiBob3cgbG9uZyB0byBkZWxheSAoaW4gbXMpICovCit9IFhUZXN0S2V5SW5mbzsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHBvaW50ZXIganVtcCBpbnB1dCBhY3Rpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIHdoaWNoIHBvaW50ZXIgICAgICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDggICBwYWQxOyAgICAgICAgICAgLyogdW51c2VkIHBhZGRpbmcgYnl0ZSAgICAgICAqLworICAgICAgICBDQVJEMTYgIGp1bXB4IEIxNjsgICAgICAvKiB4IGNvb3JkIHRvIGp1bXAgdG8gICAgICAgICovCisgICAgICAgIENBUkQxNiAganVtcHkgQjE2OyAgICAgIC8qIHkgY29vcmQgdG8ganVtcCB0byAgICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBkZWxheV90aW1lIEIxNjsgLyogaG93IGxvbmcgdG8gZGVsYXkgKGluIG1zKSAqLworfSBYVGVzdEp1bXBJbmZvOworCisvKgorICogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgcG9pbnRlciByZWxhdGl2ZSBtb3Rpb24gaW5wdXQKKyAqIGFjdGlvbnMuCisgKgorICogVGhlIHNpZ24gYml0cyBmb3IgdGhlIHggYW5kIHkgcmVsYXRpdmUgbW90aW9ucyBhcmUgY29udGFpbmVkCisgKiBpbiB0aGUgaGVhZGVyIGJ5dGUuICBUaGUgeCBhbmQgeSByZWxhdGl2ZSBtb3Rpb25zIGFyZSBwYWNrZWQKKyAqIGludG8gb25lIGJ5dGUgdG8gbWFrZSB0aGluZ3MgZml0IGluIDMyIGJpdHMuICBJZiB0aGUgcmVsYXRpdmUKKyAqIG1vdGlvbiByYW5nZSBpcyBsYXJnZXIgdGhhbiArLy0xNSwgdXNlIHRoZSBwb2ludGVyIGp1bXAgYWN0aW9uLgorICovCisjZGVmaW5lIFhUZXN0TU9USU9OX01BWCAgICAgICAgICAgIDE1CisjZGVmaW5lIFhUZXN0TU9USU9OX01JTiAgICAgICAgICAgIC0xNQorCisjZGVmaW5lIFhUZXN0WF9ORUdBVElWRSAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFRlc3RZX05FR0FUSVZFICAgICAgICAgICAgMHgwOAorCisjZGVmaW5lIFhUZXN0WF9NT1RJT05fTUFTSyAgICAgICAgIDB4MGYKKyNkZWZpbmUgWFRlc3RZX01PVElPTl9NQVNLICAgICAgICAgMHhmMAorCisjZGVmaW5lIFhUZXN0UGFja1hNb3Rpb25WYWx1ZSh4KSAgICgoeCkgJiBYVGVzdFhfTU9USU9OX01BU0spCisjZGVmaW5lIFhUZXN0UGFja1lNb3Rpb25WYWx1ZSh4KSAgICgoKHgpIDw8IDQpICYgWFRlc3RZX01PVElPTl9NQVNLKQorCisjZGVmaW5lIFhUZXN0VW5wYWNrWE1vdGlvblZhbHVlKHgpICgoeCkgJiBYVGVzdFhfTU9USU9OX01BU0spCisjZGVmaW5lIFhUZXN0VW5wYWNrWU1vdGlvblZhbHVlKHgpICgoKHgpICYgWFRlc3RZX01PVElPTl9NQVNLKSA+PiA0KQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIHdoaWNoIHBvaW50ZXIgICAgICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDggICBtb3Rpb25fZGF0YTsgICAgLyogeCx5IHJlbGF0aXZlIG1vdGlvbiAgICAgICAqLworICAgICAgICBDQVJEMTYgIGRlbGF5X3RpbWUgQjE2OyAvKiBob3cgbG9uZyB0byBkZWxheSAoaW4gbXMpICovCit9IFhUZXN0TW90aW9uSW5mbzsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yIGEgbG9uZyBkZWxheSBpbnB1dCBhY3Rpb24uICBJdCBpcyAKKyAqIHVzZWQgd2hlbiBtb3JlIHRoYW4gWFRlc3RTSE9SVF9ERUxBWV9USU1FIG1pbGxpc2Vjb25kcyBvZiBkZWxheQorICogKGFwcHJveGltYXRlbHkgb25lIG1pbnV0ZSkgaXMgbmVlZGVkLgorICoKKyAqIFRoZSBkZXZpY2UgSUQgZm9yIGEgZGVsYXkgaXMgYWx3YXlzIHNldCB0byBYVGVzdERFTEFZX0RFVklDRV9JRC4KKyAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGEgaGVhZGVyIGJ5dGUgd2l0aCBhIHZhbHVlIG9mIDAgaXMgbm90CisgKiBhIHZhbGlkIGhlYWRlciwgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQKKyAqIHRoZXJlIGFyZSBubyBtb3JlIGlucHV0IGFjdGlvbnMgaW4gYW4gWFRlc3RJbnB1dEFjdGlvbiBldmVudC4KKyAqLworCisjZGVmaW5lIFhUZXN0U0hPUlRfREVMQVlfVElNRQkweGZmZmYKKyNkZWZpbmUgWFRlc3RERUxBWV9ERVZJQ0VfSUQgICAgMHgwZiAgIAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIENBUkQ4ICAgaGVhZGVyOyAgICAgICAgIC8qIGFsd2F5cyBYVGVzdERFTEFZX0RFVklDRV9JRCAqLworICAgICAgICBDQVJEOCAgIHBhZDE7ICAgICAgICAgICAvKiB1bnVzZWQgcGFkZGluZyBieXRlICAgICAgICAgKi8KKyAgICAgICAgQ0FSRDE2ICBwYWQyIEIxNjsgICAgICAgLyogdW51c2VkIHBhZGRpbmcgd29yZCAgICAgICAgICovCisgICAgICAgIENBUkQzMiAgZGVsYXlfdGltZSBCMzI7IC8qIGhvdyBsb25nIHRvIGRlbGF5IChpbiBtcykgICAqLworfSBYVGVzdERlbGF5SW5mbzsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMveHRlc3RzdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTk2Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdHN0ci5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiAkWG9yZzogeHRlc3RzdHIuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTkyLCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisjaWZuZGVmIF9YVEVTVFNUUl9IXworI2RlZmluZSBfWFRFU1RTVFJfSF8KKworI2RlZmluZSBXaW5kb3cgQ0FSRDMyCisjZGVmaW5lIFRpbWUgQ0FSRDMyCisjZGVmaW5lIEN1cnNvciBDQVJEMzIKKworI2RlZmluZSBYVGVzdEN1cnJlbnRDdXJzb3IgKChDdXJzb3IpMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4dFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hUZXN0R2V0VmVyc2lvbiAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIENBUkQ4CW1ham9yVmVyc2lvbjsKKyAgICBDQVJEOAlwYWQ7CisgICAgQ0FSRDE2CW1pbm9yVmVyc2lvbiBCMTY7Cit9IHhYVGVzdEdldFZlcnNpb25SZXE7CisjZGVmaW5lIHN6X3hYVGVzdEdldFZlcnNpb25SZXEgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQllURQl0eXBlOwkJCS8qIFhfUmVwbHkgKi8KKyAgICBDQVJEOAltYWpvclZlcnNpb247CisgICAgQ0FSRDE2CXNlcXVlbmNlTnVtYmVyIEIxNjsKKyAgICBDQVJEMzIJbGVuZ3RoIEIzMjsKKyAgICBDQVJEMTYJbWlub3JWZXJzaW9uIEIxNjsKKyAgICBDQVJEMTYJcGFkMCBCMTY7CisgICAgQ0FSRDMyCXBhZDEgQjMyOworICAgIENBUkQzMglwYWQyIEIzMjsKKyAgICBDQVJEMzIJcGFkMyBCMzI7CisgICAgQ0FSRDMyCXBhZDQgQjMyOworICAgIENBUkQzMglwYWQ1IEIzMjsKK30geFhUZXN0R2V0VmVyc2lvblJlcGx5OworI2RlZmluZSBzel94WFRlc3RHZXRWZXJzaW9uUmVwbHkgMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENBUkQ4CXJlcVR5cGU7CS8qIGFsd2F5cyBYVGVzdFJlcUNvZGUgKi8KKyAgICBDQVJEOAl4dFJlcVR5cGU7CS8qIGFsd2F5cyBYX1hUZXN0Q29tcGFyZUN1cnNvciAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIFdpbmRvdwl3aW5kb3cgQjMyOworICAgIEN1cnNvcgljdXJzb3IgQjMyOworfSB4WFRlc3RDb21wYXJlQ3Vyc29yUmVxOworI2RlZmluZSBzel94WFRlc3RDb21wYXJlQ3Vyc29yUmVxIDEyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCWVRFCXR5cGU7CQkJLyogWF9SZXBseSAqLworICAgIEJPT0wJc2FtZTsKKyAgICBDQVJEMTYJc2VxdWVuY2VOdW1iZXIgQjE2OworICAgIENBUkQzMglsZW5ndGggQjMyOworICAgIENBUkQzMglwYWQwIEIzMjsKKyAgICBDQVJEMzIJcGFkMSBCMzI7CisgICAgQ0FSRDMyCXBhZDIgQjMyOworICAgIENBUkQzMglwYWQzIEIzMjsKKyAgICBDQVJEMzIJcGFkNCBCMzI7CisgICAgQ0FSRDMyCXBhZDUgQjMyOworfSB4WFRlc3RDb21wYXJlQ3Vyc29yUmVwbHk7CisjZGVmaW5lIHN6X3hYVGVzdENvbXBhcmVDdXJzb3JSZXBseSAzMgorCisvKiB1c2VkIG9ubHkgb24gdGhlIGNsaWVudCBzaWRlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAqLworICAgIENBUkQ4CXh0UmVxVHlwZTsJLyogYWx3YXlzIFhfWFRlc3RGYWtlSW5wdXQgKi8KKyAgICBDQVJEMTYJbGVuZ3RoIEIxNjsKKyAgICBCWVRFCXR5cGU7CisgICAgQllURQlkZXRhaWw7CisgICAgQ0FSRDE2CXBhZDAgQjE2OworICAgIFRpbWUJdGltZSBCMzI7CisgICAgV2luZG93CXJvb3QgQjMyOworICAgIENBUkQzMglwYWQxIEIzMjsKKyAgICBDQVJEMzIJcGFkMiBCMzI7CisgICAgSU5UMTYJcm9vdFggQjE2LCByb290WSBCMTY7CisgICAgQ0FSRDMyCXBhZDMgQjMyOworICAgIENBUkQxNglwYWQ0IEIxNjsKKyAgICBDQVJEOAlwYWQ1OworICAgIENBUkQ4CWRldmljZWlkOworfSB4WFRlc3RGYWtlSW5wdXRSZXE7CisjZGVmaW5lIHN6X3hYVGVzdEZha2VJbnB1dFJlcSAzNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ0FSRDgJcmVxVHlwZTsJLyogYWx3YXlzIFhUZXN0UmVxQ29kZSAqLworICAgIENBUkQ4CXh0UmVxVHlwZTsJLyogYWx3YXlzIFhfWFRlc3RHcmFiQ29udHJvbCAqLworICAgIENBUkQxNglsZW5ndGggQjE2OworICAgIEJPT0wJaW1wZXJ2aW91czsKKyAgICBDQVJEOAlwYWQwOworICAgIENBUkQ4CXBhZDE7CisgICAgQ0FSRDgJcGFkMjsKK30geFhUZXN0R3JhYkNvbnRyb2xSZXE7CisjZGVmaW5lIHN6X3hYVGVzdEdyYWJDb250cm9sUmVxIDgKKworI3VuZGVmIFdpbmRvdworI3VuZGVmIFRpbWUKKyN1bmRlZiBDdXJzb3IKKworI2VuZGlmIC8qIF9YVEVTVFNUUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9rZXlzeW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGUyOTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltLmgKQEAgLTAsMCArMSw3NiBAQAorLyogJFhvcmc6IGtleXN5bS5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjMgeG9yZ2N2cyBFeHAgJCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODcsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKworQ29weXJpZ2h0IDE5ODcgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAorZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgRGlnaXRhbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgCisKK0RJR0lUQUwgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCitESUdJVEFMIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLAorQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworU09GVFdBUkUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2tleXN5bS5oLHYgMS4zIDIwMDEvMDEvMTcgMTc6NTM6MTIgZGF3ZXMgRXhwICQgKi8KKworLyogZGVmYXVsdCBrZXlzeW1zICovCisjZGVmaW5lIFhLX01JU0NFTExBTlkKKyNkZWZpbmUgWEtfWEtCX0tFWVMKKyNkZWZpbmUgWEtfTEFUSU4xCisjZGVmaW5lIFhLX0xBVElOMgorI2RlZmluZSBYS19MQVRJTjMKKyNkZWZpbmUgWEtfTEFUSU40CisjZGVmaW5lIFhLX0xBVElOOAorI2RlZmluZSBYS19MQVRJTjkKKyNkZWZpbmUgWEtfQ0FVQ0FTVVMKKyNkZWZpbmUgWEtfR1JFRUsKKyNkZWZpbmUgWEtfS0FUQUtBTkEKKyNkZWZpbmUgWEtfQVJBQklDCisjZGVmaW5lIFhLX0NZUklMTElDCisjZGVmaW5lIFhLX0hFQlJFVworI2RlZmluZSBYS19USEFJCisjZGVmaW5lIFhLX0tPUkVBTgorI2RlZmluZSBYS19BUk1FTklBTgorI2RlZmluZSBYS19HRU9SR0lBTgorI2RlZmluZSBYS19WSUVUTkFNRVNFCisjZGVmaW5lIFhLX0NVUlJFTkNZCisjZGVmaW5lIFhLX01BVEhFTUFUSUNBTAorI2RlZmluZSBYS19CUkFJTExFCisKKyNpbmNsdWRlIDxYMTEva2V5c3ltZGVmLmg+CisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEva2V5c3ltZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhZGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oCkBAIC0wLDAgKzEsMjM1OCBAQAorLyogJFhvcmc6IGtleXN5bWRlZi5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjMgJCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAxOTg3LCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCitpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKK09SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KK0lOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCitPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvcgorb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorZnJvbSBUaGUgT3BlbiBHcm91cC4KKworCitDb3B5cmlnaHQgMTk4NyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgTWF5bmFyZCwgTWFzc2FjaHVzZXR0cworCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK3NvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKworRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCitBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCitBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCitXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCitBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCitTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6ICQgKi8KKworLyoKKyAqIFRoZSAiWDExIFdpbmRvdyBTeXN0ZW0gUHJvdG9jb2wiIHN0YW5kYXJkIGRlZmluZXMgaW4gQXBwZW5kaXggQSB0aGUKKyAqIGtleXN5bSBjb2Rlcy4gVGhlc2UgMjktYml0IGludGVnZXIgdmFsdWVzIGlkZW50aWZ5IGNoYXJhY3RlcnMgb3IKKyAqIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggZWFjaCBrZXkgKGUuZy4sIHZpYSB0aGUgdmlzaWJsZQorICogZW5ncmF2aW5nKSBvZiBhIGtleWJvYXJkIGxheW91dC4gVGhpcyBmaWxlIGFzc2lnbnMgbW5lbW9uaWMgbWFjcm8KKyAqIG5hbWVzIGZvciB0aGVzZSBrZXlzeW1zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBhbHNvIGNvbXBpbGVkIChieSB4Yy9saWIvWDExL3V0aWwvbWFrZWtleXMuYykgaW50bworICogaGFzaCB0YWJsZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBYMTEgbGlicmFyeSBmdW5jdGlvbnMgc3VjaCBhcworICogWFN0cmluZ1RvS2V5c3ltKCkgYW5kIFhLZXlzeW1Ub1N0cmluZygpLgorICoKKyAqIFdoZXJlIGEga2V5c3ltIGNvcnJlc3BvbmRzIG9uZS10by1vbmUgdG8gYW4gSVNPIDEwNjQ2IC8gVW5pY29kZQorICogY2hhcmFjdGVyLCB0aGlzIGlzIG5vdGVkIGluIGEgY29tbWVudCB0aGF0IHByb3ZpZGVzIGJvdGggdGhlIFUreHh4eAorICogVW5pY29kZSBwb3NpdGlvbiwgYXMgd2VsbCBhcyB0aGUgb2ZmaWNpYWwgVW5pY29kZSBuYW1lIG9mIHRoZQorICogY2hhcmFjdGVyLgorICoKKyAqIFdoZXJlIHRoZSBjb3JyZXNwb25kZW5jZSBpcyBlaXRoZXIgbm90IG9uZS10by1vbmUgb3Igc2VtYW50aWNhbGx5CisgKiB1bmNsZWFyLCB0aGUgVW5pY29kZSBwb3NpdGlvbiBhbmQgbmFtZSBhcmUgZW5jbG9zZWQgaW4KKyAqIHBhcmVudGhlc2VzLiBTdWNoIGxlZ2FjeSBrZXlzeW1zIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlcHJlY2F0ZWQKKyAqIGFuZCBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2UgaW4gZnV0dXJlIGtleWJvYXJkIG1hcHBpbmdzLgorICoKKyAqIEZvciBhbnkgZnV0dXJlIGV4dGVuc2lvbiBvZiB0aGUga2V5c3ltcyB3aXRoIGNoYXJhY3RlcnMgYWxyZWFkeQorICogZm91bmQgaW4gSVNPIDEwNjQ2IC8gVW5pY29kZSwgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gc2hhbGwgYmUKKyAqIHVzZWQuIFRoZSBuZXcga2V5c3ltIGNvZGUgcG9zaXRpb24gd2lsbCBzaW1wbHkgYmUgdGhlIGNoYXJhY3RlcidzCisgKiBVbmljb2RlIG51bWJlciBwbHVzIDB4MDEwMDAwMDAuIFRoZSBrZXlzeW0gdmFsdWVzIGluIHRoZSByYW5nZQorICogMHgwMTAwMDEwMCB0byAweDAxMTBmZmZmIGFyZSByZXNlcnZlZCB0byByZXByZXNlbnQgVW5pY29kZQorICogY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgVSswMTAwIHRvIFUrMTBGRkZGLgorICogCisgKiBXaGlsZSBtb3N0IG5ld2VyIFVuaWNvZGUtYmFzZWQgWDExIGNsaWVudHMgZG8gYWxyZWFkeSBhY2NlcHQKKyAqIFVuaWNvZGUtbWFwcGVkIGtleXN5bXMgaW4gdGhlIHJhbmdlIDB4MDEwMDAxMDAgdG8gMHgwMTEwZmZmZiwgaXQKKyAqIHdpbGwgcmVtYWluIG5lY2Vzc2FyeSBmb3IgY2xpZW50cyAtLSBpbiB0aGUgaW50ZXJlc3Qgb2YKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBzZXJ2ZXJzIC0tIHRvIGFsc28gdW5kZXJzdGFuZCB0aGUKKyAqIGV4aXN0aW5nIGxlZ2FjeSBrZXlzeW0gdmFsdWVzIGluIHRoZSByYW5nZSAweDAxMDAgdG8gMHgyMGZmLgorICoKKyAqIFdoZXJlIHNldmVyYWwgbW5lbW9uaWMgbmFtZXMgYXJlIGRlZmluZWQgZm9yIHRoZSBzYW1lIGtleXN5bSBpbiB0aGlzCisgKiBmaWxlLCBhbGwgYnV0IHRoZSBmaXJzdCBvbmUgbGlzdGVkIHNob3VsZCBiZSBjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCisgKgorICogTW5lbW9uaWMgbmFtZXMgZm9yIGtleXN5bXMgYXJlIGRlZmluZWQgaW4gdGhpcyBmaWxlIHdpdGggbGluZXMKKyAqIHRoYXQgbWF0Y2ggb25lIG9mIHRoZXNlIFBlcmwgcmVndWxhciBleHByZXNzaW9uczoKKyAqCisgKiAgICAvXlwjZGVmaW5lIFhLXyhbYS16QS1aXzAtOV0rKVxzKzB4KFswLTlhLWZdKylccypcL1wqIFUrKFswLTlBLUZdezQsNn0pICguKikgXCpcL1xzKiQvCisgKiAgICAvXlwjZGVmaW5lIFhLXyhbYS16QS1aXzAtOV0rKVxzKzB4KFswLTlhLWZdKylccypcL1wqXChVKyhbMC05QS1GXXs0LDZ9KSAoLiopXClcKlwvXHMqJC8KKyAqICAgIC9eXCNkZWZpbmUgWEtfKFthLXpBLVpfMC05XSspXHMrMHgoWzAtOWEtZl0rKVxzKihcL1wqXHMqKC4qKVxzKlwqXC8pP1xzKiQvCisgKgorICogV2hlbiBhZGRpbmcgbmV3IGtleXN5bXMgdG8gdGhpcyBmaWxlLCBkbyBub3QgZm9yZ2V0IHRvIGFsc28gdXBkYXRlIHRoZQorICogbWFwcGluZ3MgaW4geGMvbGliL1gxMS9LZXlCaW5kLmMgYW5kIHRoZSBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGluCisgKiB4Yy9kb2Mvc3BlY3MvWFByb3RvY29sL1gxMS5rZXlzeW1zLgorICovCisKKy8qCisgKiBOb3cgdGhhdCB0aGUgWG9yZyBjb2RlIGJhc2UgaXMgbWFuYWdlZCBpbiBHaXQgcmVwb3NpdG9yaWVzLCB0aGUgS2V5QmluZC5jCisgKiBhbmQgWDExLmtleXN5bXMgZmlsZXMgbWVudGlvbmVkIGluIHRoZSBsYXN0IGNvbW1lbnQgYmxvY2sgYXJlIGxvY2F0ZWQgYXQ6CisgKgorICogc3JjL0tleUJpbmQuYyBpbiB0aGUgcmVwbyBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy94b3JnL2xpYi9saWJYMTEKKyAqIHNwZWNzL1hQcm90b2NvbC9YMTEua2V5c3ltcyBpbiB0aGUgcmVwbyBnaXQ6Ly9hbm9uZ2l0LmZyZWVkZXNrdG9wLm9yZy94b3JnL2RvYy94b3JnLWRvY3MKKyAqLworCisjZGVmaW5lIFhLX1ZvaWRTeW1ib2wgICAgICAgICAgICAgICAgICAweGZmZmZmZiAgLyogVm9pZCBzeW1ib2wgKi8KKworI2lmZGVmIFhLX01JU0NFTExBTlkKKy8qCisgKiBUVFkgZnVuY3Rpb24ga2V5cywgY2xldmVybHkgY2hvc2VuIHRvIG1hcCB0byBBU0NJSSwgZm9yIGNvbnZlbmllbmNlIG9mCisgKiBwcm9ncmFtbWluZywgYnV0IGNvdWxkIGhhdmUgYmVlbiBhcmJpdHJhcnkgKGF0IHRoZSBjb3N0IG9mIGxvb2t1cAorICogdGFibGVzIGluIGNsaWVudCBjb2RlKS4KKyAqLworCisjZGVmaW5lIFhLX0JhY2tTcGFjZSAgICAgICAgICAgICAgICAgICAgIDB4ZmYwOCAgLyogQmFjayBzcGFjZSwgYmFjayBjaGFyICovCisjZGVmaW5lIFhLX1RhYiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwOQorI2RlZmluZSBYS19MaW5lZmVlZCAgICAgICAgICAgICAgICAgICAgICAweGZmMGEgIC8qIExpbmVmZWVkLCBMRiAqLworI2RlZmluZSBYS19DbGVhciAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMGIKKyNkZWZpbmUgWEtfUmV0dXJuICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjBkICAvKiBSZXR1cm4sIGVudGVyICovCisjZGVmaW5lIFhLX1BhdXNlICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYxMyAgLyogUGF1c2UsIGhvbGQgKi8KKyNkZWZpbmUgWEtfU2Nyb2xsX0xvY2sgICAgICAgICAgICAgICAgICAgMHhmZjE0CisjZGVmaW5lIFhLX1N5c19SZXEgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYxNQorI2RlZmluZSBYS19Fc2NhcGUgICAgICAgICAgICAgICAgICAgICAgICAweGZmMWIKKyNkZWZpbmUgWEtfRGVsZXRlICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmICAvKiBEZWxldGUsIHJ1Ym91dCAqLworCisKKworLyogSW50ZXJuYXRpb25hbCAmIG11bHRpLWtleSBjaGFyYWN0ZXIgY29tcG9zaXRpb24gKi8KKworI2RlZmluZSBYS19NdWx0aV9rZXkgICAgICAgICAgICAgICAgICAgICAweGZmMjAgIC8qIE11bHRpLWtleSBjaGFyYWN0ZXIgY29tcG9zZSAqLworI2RlZmluZSBYS19Db2RlaW5wdXQgICAgICAgICAgICAgICAgICAgICAweGZmMzcKKyNkZWZpbmUgWEtfU2luZ2xlQ2FuZGlkYXRlICAgICAgICAgICAgICAgMHhmZjNjCisjZGVmaW5lIFhLX011bHRpcGxlQ2FuZGlkYXRlICAgICAgICAgICAgIDB4ZmYzZAorI2RlZmluZSBYS19QcmV2aW91c0NhbmRpZGF0ZSAgICAgICAgICAgICAweGZmM2UKKworLyogSmFwYW5lc2Uga2V5Ym9hcmQgc3VwcG9ydCAqLworCisjZGVmaW5lIFhLX0thbmppICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyMSAgLyogS2FuamksIEthbmppIGNvbnZlcnQgKi8KKyNkZWZpbmUgWEtfTXVoZW5rYW4gICAgICAgICAgICAgICAgICAgICAgMHhmZjIyICAvKiBDYW5jZWwgQ29udmVyc2lvbiAqLworI2RlZmluZSBYS19IZW5rYW5fTW9kZSAgICAgICAgICAgICAgICAgICAweGZmMjMgIC8qIFN0YXJ0L1N0b3AgQ29udmVyc2lvbiAqLworI2RlZmluZSBYS19IZW5rYW4gICAgICAgICAgICAgICAgICAgICAgICAweGZmMjMgIC8qIEFsaWFzIGZvciBIZW5rYW5fTW9kZSAqLworI2RlZmluZSBYS19Sb21hamkgICAgICAgICAgICAgICAgICAgICAgICAweGZmMjQgIC8qIHRvIFJvbWFqaSAqLworI2RlZmluZSBYS19IaXJhZ2FuYSAgICAgICAgICAgICAgICAgICAgICAweGZmMjUgIC8qIHRvIEhpcmFnYW5hICovCisjZGVmaW5lIFhLX0thdGFrYW5hICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyNiAgLyogdG8gS2F0YWthbmEgKi8KKyNkZWZpbmUgWEtfSGlyYWdhbmFfS2F0YWthbmEgICAgICAgICAgICAgMHhmZjI3ICAvKiBIaXJhZ2FuYS9LYXRha2FuYSB0b2dnbGUgKi8KKyNkZWZpbmUgWEtfWmVua2FrdSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjI4ICAvKiB0byBaZW5rYWt1ICovCisjZGVmaW5lIFhLX0hhbmtha3UgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYyOSAgLyogdG8gSGFua2FrdSAqLworI2RlZmluZSBYS19aZW5rYWt1X0hhbmtha3UgICAgICAgICAgICAgICAweGZmMmEgIC8qIFplbmtha3UvSGFua2FrdSB0b2dnbGUgKi8KKyNkZWZpbmUgWEtfVG91cm9rdSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjJiICAvKiBBZGQgdG8gRGljdGlvbmFyeSAqLworI2RlZmluZSBYS19NYXNzeW8gICAgICAgICAgICAgICAgICAgICAgICAweGZmMmMgIC8qIERlbGV0ZSBmcm9tIERpY3Rpb25hcnkgKi8KKyNkZWZpbmUgWEtfS2FuYV9Mb2NrICAgICAgICAgICAgICAgICAgICAgMHhmZjJkICAvKiBLYW5hIExvY2sgKi8KKyNkZWZpbmUgWEtfS2FuYV9TaGlmdCAgICAgICAgICAgICAgICAgICAgMHhmZjJlICAvKiBLYW5hIFNoaWZ0ICovCisjZGVmaW5lIFhLX0Vpc3VfU2hpZnQgICAgICAgICAgICAgICAgICAgIDB4ZmYyZiAgLyogQWxwaGFudW1lcmljIFNoaWZ0ICovCisjZGVmaW5lIFhLX0Vpc3VfdG9nZ2xlICAgICAgICAgICAgICAgICAgIDB4ZmYzMCAgLyogQWxwaGFudW1lcmljIHRvZ2dsZSAqLworI2RlZmluZSBYS19LYW5qaV9CYW5nb3UgICAgICAgICAgICAgICAgICAweGZmMzcgIC8qIENvZGVpbnB1dCAqLworI2RlZmluZSBYS19aZW5fS29obyAgICAgICAgICAgICAgICAgICAgICAweGZmM2QgIC8qIE11bHRpcGxlL0FsbCBDYW5kaWRhdGUocykgKi8KKyNkZWZpbmUgWEtfTWFlX0tvaG8gICAgICAgICAgICAgICAgICAgICAgMHhmZjNlICAvKiBQcmV2aW91cyBDYW5kaWRhdGUgKi8KKworLyogMHhmZjMxIHRocnUgMHhmZjNmIGFyZSB1bmRlciBYS19LT1JFQU4gKi8KKworLyogQ3Vyc29yIGNvbnRyb2wgJiBtb3Rpb24gKi8KKworI2RlZmluZSBYS19Ib21lICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTAKKyNkZWZpbmUgWEtfTGVmdCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjUxICAvKiBNb3ZlIGxlZnQsIGxlZnQgYXJyb3cgKi8KKyNkZWZpbmUgWEtfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjUyICAvKiBNb3ZlIHVwLCB1cCBhcnJvdyAqLworI2RlZmluZSBYS19SaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTMgIC8qIE1vdmUgcmlnaHQsIHJpZ2h0IGFycm93ICovCisjZGVmaW5lIFhLX0Rvd24gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NCAgLyogTW92ZSBkb3duLCBkb3duIGFycm93ICovCisjZGVmaW5lIFhLX1ByaW9yICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NSAgLyogUHJpb3IsIHByZXZpb3VzICovCisjZGVmaW5lIFhLX1BhZ2VfVXAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NQorI2RlZmluZSBYS19OZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTYgIC8qIE5leHQgKi8KKyNkZWZpbmUgWEtfUGFnZV9Eb3duICAgICAgICAgICAgICAgICAgICAgMHhmZjU2CisjZGVmaW5lIFhLX0VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NyAgLyogRU9MICovCisjZGVmaW5lIFhLX0JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1OCAgLyogQk9MICovCisKKworLyogTWlzYyBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBYS19TZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjAgIC8qIFNlbGVjdCwgbWFyayAqLworI2RlZmluZSBYS19QcmludCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjEKKyNkZWZpbmUgWEtfRXhlY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgMHhmZjYyICAvKiBFeGVjdXRlLCBydW4sIGRvICovCisjZGVmaW5lIFhLX0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MyAgLyogSW5zZXJ0LCBpbnNlcnQgaGVyZSAqLworI2RlZmluZSBYS19VbmRvICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjUKKyNkZWZpbmUgWEtfUmVkbyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjY2ICAvKiBSZWRvLCBhZ2FpbiAqLworI2RlZmluZSBYS19NZW51ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNjcKKyNkZWZpbmUgWEtfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjY4ICAvKiBGaW5kLCBzZWFyY2ggKi8KKyNkZWZpbmUgWEtfQ2FuY2VsICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjY5ICAvKiBDYW5jZWwsIHN0b3AsIGFib3J0LCBleGl0ICovCisjZGVmaW5lIFhLX0hlbHAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2YSAgLyogSGVscCAqLworI2RlZmluZSBYS19CcmVhayAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNmIKKyNkZWZpbmUgWEtfTW9kZV9zd2l0Y2ggICAgICAgICAgICAgICAgICAgMHhmZjdlICAvKiBDaGFyYWN0ZXIgc2V0IHN3aXRjaCAqLworI2RlZmluZSBYS19zY3JpcHRfc3dpdGNoICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2RlZmluZSBYS19OdW1fTG9jayAgICAgICAgICAgICAgICAgICAgICAweGZmN2YKKworLyogS2V5cGFkIGZ1bmN0aW9ucywga2V5cGFkIG51bWJlcnMgY2xldmVybHkgY2hvc2VuIHRvIG1hcCB0byBBU0NJSSAqLworCisjZGVmaW5lIFhLX0tQX1NwYWNlICAgICAgICAgICAgICAgICAgICAgIDB4ZmY4MCAgLyogU3BhY2UgKi8KKyNkZWZpbmUgWEtfS1BfVGFiICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjg5CisjZGVmaW5lIFhLX0tQX0VudGVyICAgICAgICAgICAgICAgICAgICAgIDB4ZmY4ZCAgLyogRW50ZXIgKi8KKyNkZWZpbmUgWEtfS1BfRjEgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjkxICAvKiBQRjEsIEtQX0EsIC4uLiAqLworI2RlZmluZSBYS19LUF9GMiAgICAgICAgICAgICAgICAgICAgICAgICAweGZmOTIKKyNkZWZpbmUgWEtfS1BfRjMgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjkzCisjZGVmaW5lIFhLX0tQX0Y0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NAorI2RlZmluZSBYS19LUF9Ib21lICAgICAgICAgICAgICAgICAgICAgICAweGZmOTUKKyNkZWZpbmUgWEtfS1BfTGVmdCAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk2CisjZGVmaW5lIFhLX0tQX1VwICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NworI2RlZmluZSBYS19LUF9SaWdodCAgICAgICAgICAgICAgICAgICAgICAweGZmOTgKKyNkZWZpbmUgWEtfS1BfRG93biAgICAgICAgICAgICAgICAgICAgICAgMHhmZjk5CisjZGVmaW5lIFhLX0tQX1ByaW9yICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5YQorI2RlZmluZSBYS19LUF9QYWdlX1VwICAgICAgICAgICAgICAgICAgICAweGZmOWEKKyNkZWZpbmUgWEtfS1BfTmV4dCAgICAgICAgICAgICAgICAgICAgICAgMHhmZjliCisjZGVmaW5lIFhLX0tQX1BhZ2VfRG93biAgICAgICAgICAgICAgICAgIDB4ZmY5YgorI2RlZmluZSBYS19LUF9FbmQgICAgICAgICAgICAgICAgICAgICAgICAweGZmOWMKKyNkZWZpbmUgWEtfS1BfQmVnaW4gICAgICAgICAgICAgICAgICAgICAgMHhmZjlkCisjZGVmaW5lIFhLX0tQX0luc2VydCAgICAgICAgICAgICAgICAgICAgIDB4ZmY5ZQorI2RlZmluZSBYS19LUF9EZWxldGUgICAgICAgICAgICAgICAgICAgICAweGZmOWYKKyNkZWZpbmUgWEtfS1BfRXF1YWwgICAgICAgICAgICAgICAgICAgICAgMHhmZmJkICAvKiBFcXVhbHMgKi8KKyNkZWZpbmUgWEtfS1BfTXVsdGlwbHkgICAgICAgICAgICAgICAgICAgMHhmZmFhCisjZGVmaW5lIFhLX0tQX0FkZCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZhYgorI2RlZmluZSBYS19LUF9TZXBhcmF0b3IgICAgICAgICAgICAgICAgICAweGZmYWMgIC8qIFNlcGFyYXRvciwgb2Z0ZW4gY29tbWEgKi8KKyNkZWZpbmUgWEtfS1BfU3VidHJhY3QgICAgICAgICAgICAgICAgICAgMHhmZmFkCisjZGVmaW5lIFhLX0tQX0RlY2ltYWwgICAgICAgICAgICAgICAgICAgIDB4ZmZhZQorI2RlZmluZSBYS19LUF9EaXZpZGUgICAgICAgICAgICAgICAgICAgICAweGZmYWYKKworI2RlZmluZSBYS19LUF8wICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjAKKyNkZWZpbmUgWEtfS1BfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIxCisjZGVmaW5lIFhLX0tQXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiMgorI2RlZmluZSBYS19LUF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjMKKyNkZWZpbmUgWEtfS1BfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI0CisjZGVmaW5lIFhLX0tQXzUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiNQorI2RlZmluZSBYS19LUF82ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjYKKyNkZWZpbmUgWEtfS1BfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI3CisjZGVmaW5lIFhLX0tQXzggICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiOAorI2RlZmluZSBYS19LUF85ICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYjkKKworCisKKy8qCisgKiBBdXhpbGlhcnkgZnVuY3Rpb25zOyBub3RlIHRoZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgZm9yIGxlZnQgYW5kIHJpZ2h0CisgKiBmdW5jdGlvbiBrZXlzOyAgU3VuIGtleWJvYXJkcyBhbmQgYSBmZXcgb3RoZXIgbWFudWZhY3R1cmVycyBoYXZlIHN1Y2gKKyAqIGZ1bmN0aW9uIGtleSBncm91cHMgb24gdGhlIGxlZnQgYW5kL29yIHJpZ2h0IHNpZGVzIG9mIHRoZSBrZXlib2FyZC4KKyAqIFdlJ3ZlIG5vdCBmb3VuZCBhIGtleWJvYXJkIHdpdGggbW9yZSB0aGFuIDM1IGZ1bmN0aW9uIGtleXMgdG90YWwuCisgKi8KKworI2RlZmluZSBYS19GMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYmUKKyNkZWZpbmUgWEtfRjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmJmCisjZGVmaW5lIFhLX0YzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMAorI2RlZmluZSBYS19GNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzEKKyNkZWZpbmUgWEtfRjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmMyCisjZGVmaW5lIFhLX0Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMworI2RlZmluZSBYS19GNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzQKKyNkZWZpbmUgWEtfRjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM1CisjZGVmaW5lIFhLX0Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNgorI2RlZmluZSBYS19GMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzcKKyNkZWZpbmUgWEtfRjExICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM4CisjZGVmaW5lIFhLX0wxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOAorI2RlZmluZSBYS19GMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmYzkKKyNkZWZpbmUgWEtfTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmM5CisjZGVmaW5lIFhLX0YxMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYQorI2RlZmluZSBYS19MMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2EKKyNkZWZpbmUgWEtfRjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNiCisjZGVmaW5lIFhLX0w0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYgorI2RlZmluZSBYS19GMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2MKKyNkZWZpbmUgWEtfTDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNjCisjZGVmaW5lIFhLX0YxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZAorI2RlZmluZSBYS19MNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2QKKyNkZWZpbmUgWEtfRjE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNlCisjZGVmaW5lIFhLX0w3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZQorI2RlZmluZSBYS19GMTggICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmY2YKKyNkZWZpbmUgWEtfTDggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmNmCisjZGVmaW5lIFhLX0YxOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMAorI2RlZmluZSBYS19MOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDAKKyNkZWZpbmUgWEtfRjIwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQxCisjZGVmaW5lIFhLX0wxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMQorI2RlZmluZSBYS19GMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDIKKyNkZWZpbmUgWEtfUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQyCisjZGVmaW5lIFhLX0YyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMworI2RlZmluZSBYS19SMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDMKKyNkZWZpbmUgWEtfRjIzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ0CisjZGVmaW5lIFhLX1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNAorI2RlZmluZSBYS19GMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDUKKyNkZWZpbmUgWEtfUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ1CisjZGVmaW5lIFhLX0YyNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNgorI2RlZmluZSBYS19SNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDYKKyNkZWZpbmUgWEtfRjI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ3CisjZGVmaW5lIFhLX1I2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNworI2RlZmluZSBYS19GMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDgKKyNkZWZpbmUgWEtfUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmQ4CisjZGVmaW5lIFhLX0YyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOQorI2RlZmluZSBYS19SOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZDkKKyNkZWZpbmUgWEtfRjI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRhCisjZGVmaW5lIFhLX1I5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYQorI2RlZmluZSBYS19GMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGIKKyNkZWZpbmUgWEtfUjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRiCisjZGVmaW5lIFhLX0YzMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYworI2RlZmluZSBYS19SMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGMKKyNkZWZpbmUgWEtfRjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRkCisjZGVmaW5lIFhLX1IxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZAorI2RlZmluZSBYS19GMzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGUKKyNkZWZpbmUgWEtfUjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmRlCisjZGVmaW5lIFhLX0YzNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZgorI2RlZmluZSBYS19SMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZGYKKyNkZWZpbmUgWEtfRjM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmUwCisjZGVmaW5lIFhLX1IxNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMAorCisvKiBNb2RpZmllcnMgKi8KKworI2RlZmluZSBYS19TaGlmdF9MICAgICAgICAgICAgICAgICAgICAgICAweGZmZTEgIC8qIExlZnQgc2hpZnQgKi8KKyNkZWZpbmUgWEtfU2hpZnRfUiAgICAgICAgICAgICAgICAgICAgICAgMHhmZmUyICAvKiBSaWdodCBzaGlmdCAqLworI2RlZmluZSBYS19Db250cm9sX0wgICAgICAgICAgICAgICAgICAgICAweGZmZTMgIC8qIExlZnQgY29udHJvbCAqLworI2RlZmluZSBYS19Db250cm9sX1IgICAgICAgICAgICAgICAgICAgICAweGZmZTQgIC8qIFJpZ2h0IGNvbnRyb2wgKi8KKyNkZWZpbmUgWEtfQ2Fwc19Mb2NrICAgICAgICAgICAgICAgICAgICAgMHhmZmU1ICAvKiBDYXBzIGxvY2sgKi8KKyNkZWZpbmUgWEtfU2hpZnRfTG9jayAgICAgICAgICAgICAgICAgICAgMHhmZmU2ICAvKiBTaGlmdCBsb2NrICovCisKKyNkZWZpbmUgWEtfTWV0YV9MICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmU3ICAvKiBMZWZ0IG1ldGEgKi8KKyNkZWZpbmUgWEtfTWV0YV9SICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmU4ICAvKiBSaWdodCBtZXRhICovCisjZGVmaW5lIFhLX0FsdF9MICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlOSAgLyogTGVmdCBhbHQgKi8KKyNkZWZpbmUgWEtfQWx0X1IgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmVhICAvKiBSaWdodCBhbHQgKi8KKyNkZWZpbmUgWEtfU3VwZXJfTCAgICAgICAgICAgICAgICAgICAgICAgMHhmZmViICAvKiBMZWZ0IHN1cGVyICovCisjZGVmaW5lIFhLX1N1cGVyX1IgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlYyAgLyogUmlnaHQgc3VwZXIgKi8KKyNkZWZpbmUgWEtfSHlwZXJfTCAgICAgICAgICAgICAgICAgICAgICAgMHhmZmVkICAvKiBMZWZ0IGh5cGVyICovCisjZGVmaW5lIFhLX0h5cGVyX1IgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlZSAgLyogUmlnaHQgaHlwZXIgKi8KKyNlbmRpZiAvKiBYS19NSVNDRUxMQU5ZICovCisKKy8qCisgKiBLZXlib2FyZCAoWEtCKSBFeHRlbnNpb24gZnVuY3Rpb24gYW5kIG1vZGlmaWVyIGtleXMKKyAqIChmcm9tIEFwcGVuZGl4IEMgb2YgIlRoZSBYIEtleWJvYXJkIEV4dGVuc2lvbjogUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIpCisgKiBCeXRlIDMgPSAweGZlCisgKi8KKworI2lmZGVmIFhLX1hLQl9LRVlTCisjZGVmaW5lIFhLX0lTT19Mb2NrICAgICAgICAgICAgICAgICAgICAgIDB4ZmUwMQorI2RlZmluZSBYS19JU09fTGV2ZWwyX0xhdGNoICAgICAgICAgICAgICAweGZlMDIKKyNkZWZpbmUgWEtfSVNPX0xldmVsM19TaGlmdCAgICAgICAgICAgICAgMHhmZTAzCisjZGVmaW5lIFhLX0lTT19MZXZlbDNfTGF0Y2ggICAgICAgICAgICAgIDB4ZmUwNAorI2RlZmluZSBYS19JU09fTGV2ZWwzX0xvY2sgICAgICAgICAgICAgICAweGZlMDUKKyNkZWZpbmUgWEtfSVNPX0xldmVsNV9TaGlmdCAgICAgICAgICAgICAgMHhmZTExCisjZGVmaW5lIFhLX0lTT19MZXZlbDVfTGF0Y2ggICAgICAgICAgICAgIDB4ZmUxMgorI2RlZmluZSBYS19JU09fTGV2ZWw1X0xvY2sgICAgICAgICAgICAgICAweGZlMTMKKyNkZWZpbmUgWEtfSVNPX0dyb3VwX1NoaWZ0ICAgICAgICAgICAgICAgMHhmZjdlICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNkZWZpbmUgWEtfSVNPX0dyb3VwX0xhdGNoICAgICAgICAgICAgICAgMHhmZTA2CisjZGVmaW5lIFhLX0lTT19Hcm91cF9Mb2NrICAgICAgICAgICAgICAgIDB4ZmUwNworI2RlZmluZSBYS19JU09fTmV4dF9Hcm91cCAgICAgICAgICAgICAgICAweGZlMDgKKyNkZWZpbmUgWEtfSVNPX05leHRfR3JvdXBfTG9jayAgICAgICAgICAgMHhmZTA5CisjZGVmaW5lIFhLX0lTT19QcmV2X0dyb3VwICAgICAgICAgICAgICAgIDB4ZmUwYQorI2RlZmluZSBYS19JU09fUHJldl9Hcm91cF9Mb2NrICAgICAgICAgICAweGZlMGIKKyNkZWZpbmUgWEtfSVNPX0ZpcnN0X0dyb3VwICAgICAgICAgICAgICAgMHhmZTBjCisjZGVmaW5lIFhLX0lTT19GaXJzdF9Hcm91cF9Mb2NrICAgICAgICAgIDB4ZmUwZAorI2RlZmluZSBYS19JU09fTGFzdF9Hcm91cCAgICAgICAgICAgICAgICAweGZlMGUKKyNkZWZpbmUgWEtfSVNPX0xhc3RfR3JvdXBfTG9jayAgICAgICAgICAgMHhmZTBmCisKKyNkZWZpbmUgWEtfSVNPX0xlZnRfVGFiICAgICAgICAgICAgICAgICAgMHhmZTIwCisjZGVmaW5lIFhLX0lTT19Nb3ZlX0xpbmVfVXAgICAgICAgICAgICAgIDB4ZmUyMQorI2RlZmluZSBYS19JU09fTW92ZV9MaW5lX0Rvd24gICAgICAgICAgICAweGZlMjIKKyNkZWZpbmUgWEtfSVNPX1BhcnRpYWxfTGluZV9VcCAgICAgICAgICAgMHhmZTIzCisjZGVmaW5lIFhLX0lTT19QYXJ0aWFsX0xpbmVfRG93biAgICAgICAgIDB4ZmUyNAorI2RlZmluZSBYS19JU09fUGFydGlhbF9TcGFjZV9MZWZ0ICAgICAgICAweGZlMjUKKyNkZWZpbmUgWEtfSVNPX1BhcnRpYWxfU3BhY2VfUmlnaHQgICAgICAgMHhmZTI2CisjZGVmaW5lIFhLX0lTT19TZXRfTWFyZ2luX0xlZnQgICAgICAgICAgIDB4ZmUyNworI2RlZmluZSBYS19JU09fU2V0X01hcmdpbl9SaWdodCAgICAgICAgICAweGZlMjgKKyNkZWZpbmUgWEtfSVNPX1JlbGVhc2VfTWFyZ2luX0xlZnQgICAgICAgMHhmZTI5CisjZGVmaW5lIFhLX0lTT19SZWxlYXNlX01hcmdpbl9SaWdodCAgICAgIDB4ZmUyYQorI2RlZmluZSBYS19JU09fUmVsZWFzZV9Cb3RoX01hcmdpbnMgICAgICAweGZlMmIKKyNkZWZpbmUgWEtfSVNPX0Zhc3RfQ3Vyc29yX0xlZnQgICAgICAgICAgMHhmZTJjCisjZGVmaW5lIFhLX0lTT19GYXN0X0N1cnNvcl9SaWdodCAgICAgICAgIDB4ZmUyZAorI2RlZmluZSBYS19JU09fRmFzdF9DdXJzb3JfVXAgICAgICAgICAgICAweGZlMmUKKyNkZWZpbmUgWEtfSVNPX0Zhc3RfQ3Vyc29yX0Rvd24gICAgICAgICAgMHhmZTJmCisjZGVmaW5lIFhLX0lTT19Db250aW51b3VzX1VuZGVybGluZSAgICAgIDB4ZmUzMAorI2RlZmluZSBYS19JU09fRGlzY29udGludW91c19VbmRlcmxpbmUgICAweGZlMzEKKyNkZWZpbmUgWEtfSVNPX0VtcGhhc2l6ZSAgICAgICAgICAgICAgICAgMHhmZTMyCisjZGVmaW5lIFhLX0lTT19DZW50ZXJfT2JqZWN0ICAgICAgICAgICAgIDB4ZmUzMworI2RlZmluZSBYS19JU09fRW50ZXIgICAgICAgICAgICAgICAgICAgICAweGZlMzQKKworI2RlZmluZSBYS19kZWFkX2dyYXZlICAgICAgICAgICAgICAgICAgICAweGZlNTAKKyNkZWZpbmUgWEtfZGVhZF9hY3V0ZSAgICAgICAgICAgICAgICAgICAgMHhmZTUxCisjZGVmaW5lIFhLX2RlYWRfY2lyY3VtZmxleCAgICAgICAgICAgICAgIDB4ZmU1MgorI2RlZmluZSBYS19kZWFkX3RpbGRlICAgICAgICAgICAgICAgICAgICAweGZlNTMKKyNkZWZpbmUgWEtfZGVhZF9tYWNyb24gICAgICAgICAgICAgICAgICAgMHhmZTU0CisjZGVmaW5lIFhLX2RlYWRfYnJldmUgICAgICAgICAgICAgICAgICAgIDB4ZmU1NQorI2RlZmluZSBYS19kZWFkX2Fib3ZlZG90ICAgICAgICAgICAgICAgICAweGZlNTYKKyNkZWZpbmUgWEtfZGVhZF9kaWFlcmVzaXMgICAgICAgICAgICAgICAgMHhmZTU3CisjZGVmaW5lIFhLX2RlYWRfYWJvdmVyaW5nICAgICAgICAgICAgICAgIDB4ZmU1OAorI2RlZmluZSBYS19kZWFkX2RvdWJsZWFjdXRlICAgICAgICAgICAgICAweGZlNTkKKyNkZWZpbmUgWEtfZGVhZF9jYXJvbiAgICAgICAgICAgICAgICAgICAgMHhmZTVhCisjZGVmaW5lIFhLX2RlYWRfY2VkaWxsYSAgICAgICAgICAgICAgICAgIDB4ZmU1YgorI2RlZmluZSBYS19kZWFkX29nb25layAgICAgICAgICAgICAgICAgICAweGZlNWMKKyNkZWZpbmUgWEtfZGVhZF9pb3RhICAgICAgICAgICAgICAgICAgICAgMHhmZTVkCisjZGVmaW5lIFhLX2RlYWRfdm9pY2VkX3NvdW5kICAgICAgICAgICAgIDB4ZmU1ZQorI2RlZmluZSBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgICAgICAgICAweGZlNWYKKyNkZWZpbmUgWEtfZGVhZF9iZWxvd2RvdCAgICAgICAgICAgICAgICAgMHhmZTYwCisjZGVmaW5lIFhLX2RlYWRfaG9vayAgICAgICAgICAgICAgICAgICAgIDB4ZmU2MQorI2RlZmluZSBYS19kZWFkX2hvcm4gICAgICAgICAgICAgICAgICAgICAweGZlNjIKKyNkZWZpbmUgWEtfZGVhZF9zdHJva2UgICAgICAgICAgICAgICAgICAgMHhmZTYzCisjZGVmaW5lIFhLX2RlYWRfYWJvdmVjb21tYSAgICAgICAgICAgICAgIDB4ZmU2NAorI2RlZmluZSBYS19kZWFkX3BzaWxpICAgICAgICAgICAgICAgICAgICAweGZlNjQgIC8qIGFsaWFzIGZvciBkZWFkX2Fib3ZlY29tbWEgKi8KKyNkZWZpbmUgWEtfZGVhZF9hYm92ZXJldmVyc2VkY29tbWEgICAgICAgMHhmZTY1CisjZGVmaW5lIFhLX2RlYWRfZGFzaWEgICAgICAgICAgICAgICAgICAgIDB4ZmU2NiAgLyogYWxpYXMgZm9yIGRlYWRfYWJvdmVyZXZlcnNlZGNvbW1hICovCisKKyNkZWZpbmUgWEtfRmlyc3RfVmlydHVhbF9TY3JlZW4gICAgICAgICAgMHhmZWQwCisjZGVmaW5lIFhLX1ByZXZfVmlydHVhbF9TY3JlZW4gICAgICAgICAgIDB4ZmVkMQorI2RlZmluZSBYS19OZXh0X1ZpcnR1YWxfU2NyZWVuICAgICAgICAgICAweGZlZDIKKyNkZWZpbmUgWEtfTGFzdF9WaXJ0dWFsX1NjcmVlbiAgICAgICAgICAgMHhmZWQ0CisjZGVmaW5lIFhLX1Rlcm1pbmF0ZV9TZXJ2ZXIgICAgICAgICAgICAgIDB4ZmVkNQorCisjZGVmaW5lIFhLX0FjY2Vzc1hfRW5hYmxlICAgICAgICAgICAgICAgIDB4ZmU3MAorI2RlZmluZSBYS19BY2Nlc3NYX0ZlZWRiYWNrX0VuYWJsZSAgICAgICAweGZlNzEKKyNkZWZpbmUgWEtfUmVwZWF0S2V5c19FbmFibGUgICAgICAgICAgICAgMHhmZTcyCisjZGVmaW5lIFhLX1Nsb3dLZXlzX0VuYWJsZSAgICAgICAgICAgICAgIDB4ZmU3MworI2RlZmluZSBYS19Cb3VuY2VLZXlzX0VuYWJsZSAgICAgICAgICAgICAweGZlNzQKKyNkZWZpbmUgWEtfU3RpY2t5S2V5c19FbmFibGUgICAgICAgICAgICAgMHhmZTc1CisjZGVmaW5lIFhLX01vdXNlS2V5c19FbmFibGUgICAgICAgICAgICAgIDB4ZmU3NgorI2RlZmluZSBYS19Nb3VzZUtleXNfQWNjZWxfRW5hYmxlICAgICAgICAweGZlNzcKKyNkZWZpbmUgWEtfT3ZlcmxheTFfRW5hYmxlICAgICAgICAgICAgICAgMHhmZTc4CisjZGVmaW5lIFhLX092ZXJsYXkyX0VuYWJsZSAgICAgICAgICAgICAgIDB4ZmU3OQorI2RlZmluZSBYS19BdWRpYmxlQmVsbF9FbmFibGUgICAgICAgICAgICAweGZlN2EKKworI2RlZmluZSBYS19Qb2ludGVyX0xlZnQgICAgICAgICAgICAgICAgICAweGZlZTAKKyNkZWZpbmUgWEtfUG9pbnRlcl9SaWdodCAgICAgICAgICAgICAgICAgMHhmZWUxCisjZGVmaW5lIFhLX1BvaW50ZXJfVXAgICAgICAgICAgICAgICAgICAgIDB4ZmVlMgorI2RlZmluZSBYS19Qb2ludGVyX0Rvd24gICAgICAgICAgICAgICAgICAweGZlZTMKKyNkZWZpbmUgWEtfUG9pbnRlcl9VcExlZnQgICAgICAgICAgICAgICAgMHhmZWU0CisjZGVmaW5lIFhLX1BvaW50ZXJfVXBSaWdodCAgICAgICAgICAgICAgIDB4ZmVlNQorI2RlZmluZSBYS19Qb2ludGVyX0Rvd25MZWZ0ICAgICAgICAgICAgICAweGZlZTYKKyNkZWZpbmUgWEtfUG9pbnRlcl9Eb3duUmlnaHQgICAgICAgICAgICAgMHhmZWU3CisjZGVmaW5lIFhLX1BvaW50ZXJfQnV0dG9uX0RmbHQgICAgICAgICAgIDB4ZmVlOAorI2RlZmluZSBYS19Qb2ludGVyX0J1dHRvbjEgICAgICAgICAgICAgICAweGZlZTkKKyNkZWZpbmUgWEtfUG9pbnRlcl9CdXR0b24yICAgICAgICAgICAgICAgMHhmZWVhCisjZGVmaW5lIFhLX1BvaW50ZXJfQnV0dG9uMyAgICAgICAgICAgICAgIDB4ZmVlYgorI2RlZmluZSBYS19Qb2ludGVyX0J1dHRvbjQgICAgICAgICAgICAgICAweGZlZWMKKyNkZWZpbmUgWEtfUG9pbnRlcl9CdXR0b241ICAgICAgICAgICAgICAgMHhmZWVkCisjZGVmaW5lIFhLX1BvaW50ZXJfRGJsQ2xpY2tfRGZsdCAgICAgICAgIDB4ZmVlZQorI2RlZmluZSBYS19Qb2ludGVyX0RibENsaWNrMSAgICAgICAgICAgICAweGZlZWYKKyNkZWZpbmUgWEtfUG9pbnRlcl9EYmxDbGljazIgICAgICAgICAgICAgMHhmZWYwCisjZGVmaW5lIFhLX1BvaW50ZXJfRGJsQ2xpY2szICAgICAgICAgICAgIDB4ZmVmMQorI2RlZmluZSBYS19Qb2ludGVyX0RibENsaWNrNCAgICAgICAgICAgICAweGZlZjIKKyNkZWZpbmUgWEtfUG9pbnRlcl9EYmxDbGljazUgICAgICAgICAgICAgMHhmZWYzCisjZGVmaW5lIFhLX1BvaW50ZXJfRHJhZ19EZmx0ICAgICAgICAgICAgIDB4ZmVmNAorI2RlZmluZSBYS19Qb2ludGVyX0RyYWcxICAgICAgICAgICAgICAgICAweGZlZjUKKyNkZWZpbmUgWEtfUG9pbnRlcl9EcmFnMiAgICAgICAgICAgICAgICAgMHhmZWY2CisjZGVmaW5lIFhLX1BvaW50ZXJfRHJhZzMgICAgICAgICAgICAgICAgIDB4ZmVmNworI2RlZmluZSBYS19Qb2ludGVyX0RyYWc0ICAgICAgICAgICAgICAgICAweGZlZjgKKyNkZWZpbmUgWEtfUG9pbnRlcl9EcmFnNSAgICAgICAgICAgICAgICAgMHhmZWZkCisKKyNkZWZpbmUgWEtfUG9pbnRlcl9FbmFibGVLZXlzICAgICAgICAgICAgMHhmZWY5CisjZGVmaW5lIFhLX1BvaW50ZXJfQWNjZWxlcmF0ZSAgICAgICAgICAgIDB4ZmVmYQorI2RlZmluZSBYS19Qb2ludGVyX0RmbHRCdG5OZXh0ICAgICAgICAgICAweGZlZmIKKyNkZWZpbmUgWEtfUG9pbnRlcl9EZmx0QnRuUHJldiAgICAgICAgICAgMHhmZWZjCisKKyNlbmRpZiAvKiBYS19YS0JfS0VZUyAqLworCisvKgorICogMzI3MCBUZXJtaW5hbCBLZXlzCisgKiBCeXRlIDMgPSAweGZkCisgKi8KKworI2lmZGVmIFhLXzMyNzAKKyNkZWZpbmUgWEtfMzI3MF9EdXBsaWNhdGUgICAgICAgICAgICAgICAgMHhmZDAxCisjZGVmaW5lIFhLXzMyNzBfRmllbGRNYXJrICAgICAgICAgICAgICAgIDB4ZmQwMgorI2RlZmluZSBYS18zMjcwX1JpZ2h0MiAgICAgICAgICAgICAgICAgICAweGZkMDMKKyNkZWZpbmUgWEtfMzI3MF9MZWZ0MiAgICAgICAgICAgICAgICAgICAgMHhmZDA0CisjZGVmaW5lIFhLXzMyNzBfQmFja1RhYiAgICAgICAgICAgICAgICAgIDB4ZmQwNQorI2RlZmluZSBYS18zMjcwX0VyYXNlRU9GICAgICAgICAgICAgICAgICAweGZkMDYKKyNkZWZpbmUgWEtfMzI3MF9FcmFzZUlucHV0ICAgICAgICAgICAgICAgMHhmZDA3CisjZGVmaW5lIFhLXzMyNzBfUmVzZXQgICAgICAgICAgICAgICAgICAgIDB4ZmQwOAorI2RlZmluZSBYS18zMjcwX1F1aXQgICAgICAgICAgICAgICAgICAgICAweGZkMDkKKyNkZWZpbmUgWEtfMzI3MF9QQTEgICAgICAgICAgICAgICAgICAgICAgMHhmZDBhCisjZGVmaW5lIFhLXzMyNzBfUEEyICAgICAgICAgICAgICAgICAgICAgIDB4ZmQwYgorI2RlZmluZSBYS18zMjcwX1BBMyAgICAgICAgICAgICAgICAgICAgICAweGZkMGMKKyNkZWZpbmUgWEtfMzI3MF9UZXN0ICAgICAgICAgICAgICAgICAgICAgMHhmZDBkCisjZGVmaW5lIFhLXzMyNzBfQXR0biAgICAgICAgICAgICAgICAgICAgIDB4ZmQwZQorI2RlZmluZSBYS18zMjcwX0N1cnNvckJsaW5rICAgICAgICAgICAgICAweGZkMGYKKyNkZWZpbmUgWEtfMzI3MF9BbHRDdXJzb3IgICAgICAgICAgICAgICAgMHhmZDEwCisjZGVmaW5lIFhLXzMyNzBfS2V5Q2xpY2sgICAgICAgICAgICAgICAgIDB4ZmQxMQorI2RlZmluZSBYS18zMjcwX0p1bXAgICAgICAgICAgICAgICAgICAgICAweGZkMTIKKyNkZWZpbmUgWEtfMzI3MF9JZGVudCAgICAgICAgICAgICAgICAgICAgMHhmZDEzCisjZGVmaW5lIFhLXzMyNzBfUnVsZSAgICAgICAgICAgICAgICAgICAgIDB4ZmQxNAorI2RlZmluZSBYS18zMjcwX0NvcHkgICAgICAgICAgICAgICAgICAgICAweGZkMTUKKyNkZWZpbmUgWEtfMzI3MF9QbGF5ICAgICAgICAgICAgICAgICAgICAgMHhmZDE2CisjZGVmaW5lIFhLXzMyNzBfU2V0dXAgICAgICAgICAgICAgICAgICAgIDB4ZmQxNworI2RlZmluZSBYS18zMjcwX1JlY29yZCAgICAgICAgICAgICAgICAgICAweGZkMTgKKyNkZWZpbmUgWEtfMzI3MF9DaGFuZ2VTY3JlZW4gICAgICAgICAgICAgMHhmZDE5CisjZGVmaW5lIFhLXzMyNzBfRGVsZXRlV29yZCAgICAgICAgICAgICAgIDB4ZmQxYQorI2RlZmluZSBYS18zMjcwX0V4U2VsZWN0ICAgICAgICAgICAgICAgICAweGZkMWIKKyNkZWZpbmUgWEtfMzI3MF9DdXJzb3JTZWxlY3QgICAgICAgICAgICAgMHhmZDFjCisjZGVmaW5lIFhLXzMyNzBfUHJpbnRTY3JlZW4gICAgICAgICAgICAgIDB4ZmQxZAorI2RlZmluZSBYS18zMjcwX0VudGVyICAgICAgICAgICAgICAgICAgICAweGZkMWUKKyNlbmRpZiAvKiBYS18zMjcwICovCisKKy8qCisgKiBMYXRpbiAxCisgKiAoSVNPL0lFQyA4ODU5LTEgPSBVbmljb2RlIFUrMDAyMC4uVSswMEZGKQorICogQnl0ZSAzID0gMAorICovCisjaWZkZWYgWEtfTEFUSU4xCisjZGVmaW5lIFhLX3NwYWNlICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogVSswMDIwIFNQQUNFICovCisjZGVmaW5lIFhLX2V4Y2xhbSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMSAgLyogVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfcXVvdGVkYmwgICAgICAgICAgICAgICAgICAgICAgMHgwMDIyICAvKiBVKzAwMjIgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfbnVtYmVyc2lnbiAgICAgICAgICAgICAgICAgICAgMHgwMDIzICAvKiBVKzAwMjMgTlVNQkVSIFNJR04gKi8KKyNkZWZpbmUgWEtfZG9sbGFyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI0ICAvKiBVKzAwMjQgRE9MTEFSIFNJR04gKi8KKyNkZWZpbmUgWEtfcGVyY2VudCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI1ICAvKiBVKzAwMjUgUEVSQ0VOVCBTSUdOICovCisjZGVmaW5lIFhLX2FtcGVyc2FuZCAgICAgICAgICAgICAgICAgICAgIDB4MDAyNiAgLyogVSswMDI2IEFNUEVSU0FORCAqLworI2RlZmluZSBYS19hcG9zdHJvcGhlICAgICAgICAgICAgICAgICAgICAweDAwMjcgIC8qIFUrMDAyNyBBUE9TVFJPUEhFICovCisjZGVmaW5lIFhLX3F1b3RlcmlnaHQgICAgICAgICAgICAgICAgICAgIDB4MDAyNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19wYXJlbmxlZnQgICAgICAgICAgICAgICAgICAgICAweDAwMjggIC8qIFUrMDAyOCBMRUZUIFBBUkVOVEhFU0lTICovCisjZGVmaW5lIFhLX3BhcmVucmlnaHQgICAgICAgICAgICAgICAgICAgIDB4MDAyOSAgLyogVSswMDI5IFJJR0hUIFBBUkVOVEhFU0lTICovCisjZGVmaW5lIFhLX2FzdGVyaXNrICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYSAgLyogVSswMDJBIEFTVEVSSVNLICovCisjZGVmaW5lIFhLX3BsdXMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyYiAgLyogVSswMDJCIFBMVVMgU0lHTiAqLworI2RlZmluZSBYS19jb21tYSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmMgIC8qIFUrMDAyQyBDT01NQSAqLworI2RlZmluZSBYS19taW51cyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMmQgIC8qIFUrMDAyRCBIWVBIRU4tTUlOVVMgKi8KKyNkZWZpbmUgWEtfcGVyaW9kICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJlICAvKiBVKzAwMkUgRlVMTCBTVE9QICovCisjZGVmaW5lIFhLX3NsYXNoICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyZiAgLyogVSswMDJGIFNPTElEVVMgKi8KKyNkZWZpbmUgWEtfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBVKzAwMzAgRElHSVQgWkVSTyAqLworI2RlZmluZSBYS18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzEgIC8qIFUrMDAzMSBESUdJVCBPTkUgKi8KKyNkZWZpbmUgWEtfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMyICAvKiBVKzAwMzIgRElHSVQgVFdPICovCisjZGVmaW5lIFhLXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMyAgLyogVSswMDMzIERJR0lUIFRIUkVFICovCisjZGVmaW5lIFhLXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNCAgLyogVSswMDM0IERJR0lUIEZPVVIgKi8KKyNkZWZpbmUgWEtfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM1ICAvKiBVKzAwMzUgRElHSVQgRklWRSAqLworI2RlZmluZSBYS182ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzYgIC8qIFUrMDAzNiBESUdJVCBTSVggKi8KKyNkZWZpbmUgWEtfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM3ICAvKiBVKzAwMzcgRElHSVQgU0VWRU4gKi8KKyNkZWZpbmUgWEtfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4ICAvKiBVKzAwMzggRElHSVQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM5ICAvKiBVKzAwMzkgRElHSVQgTklORSAqLworI2RlZmluZSBYS19jb2xvbiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwM2EgIC8qIFUrMDAzQSBDT0xPTiAqLworI2RlZmluZSBYS19zZW1pY29sb24gICAgICAgICAgICAgICAgICAgICAweDAwM2IgIC8qIFUrMDAzQiBTRU1JQ09MT04gKi8KKyNkZWZpbmUgWEtfbGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNjICAvKiBVKzAwM0MgTEVTUy1USEFOIFNJR04gKi8KKyNkZWZpbmUgWEtfZXF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNkICAvKiBVKzAwM0QgRVFVQUxTIFNJR04gKi8KKyNkZWZpbmUgWEtfZ3JlYXRlciAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNlICAvKiBVKzAwM0UgR1JFQVRFUi1USEFOIFNJR04gKi8KKyNkZWZpbmUgWEtfcXVlc3Rpb24gICAgICAgICAgICAgICAgICAgICAgMHgwMDNmICAvKiBVKzAwM0YgUVVFU1RJT04gTUFSSyAqLworI2RlZmluZSBYS19hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAgIC8qIFUrMDA0MCBDT01NRVJDSUFMIEFUICovCisjZGVmaW5lIFhLX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MSAgLyogVSswMDQxIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi8KKyNkZWZpbmUgWEtfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQyICAvKiBVKzAwNDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiAqLworI2RlZmluZSBYS19DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDMgIC8qIFUrMDA0MyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDICovCisjZGVmaW5lIFhLX0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NCAgLyogVSswMDQ0IExBVElOIENBUElUQUwgTEVUVEVSIEQgKi8KKyNkZWZpbmUgWEtfRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ1ICAvKiBVKzAwNDUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSAqLworI2RlZmluZSBYS19GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDYgIC8qIFUrMDA0NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGICovCisjZGVmaW5lIFhLX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NyAgLyogVSswMDQ3IExBVElOIENBUElUQUwgTEVUVEVSIEcgKi8KKyNkZWZpbmUgWEtfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4ICAvKiBVKzAwNDggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCAqLworI2RlZmluZSBYS19JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDkgIC8qIFUrMDA0OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJICovCisjZGVmaW5lIFhLX0ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YSAgLyogVSswMDRBIExBVElOIENBUElUQUwgTEVUVEVSIEogKi8KKyNkZWZpbmUgWEtfSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRiICAvKiBVKzAwNEIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyAqLworI2RlZmluZSBYS19MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGMgIC8qIFUrMDA0QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMICovCisjZGVmaW5lIFhLX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0ZCAgLyogVSswMDREIExBVElOIENBUElUQUwgTEVUVEVSIE0gKi8KKyNkZWZpbmUgWEtfTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDRlICAvKiBVKzAwNEUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiAqLworI2RlZmluZSBYS19PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNGYgIC8qIFUrMDA0RiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MCAgLyogVSswMDUwIExBVElOIENBUElUQUwgTEVUVEVSIFAgKi8KKyNkZWZpbmUgWEtfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUxICAvKiBVKzAwNTEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUSAqLworI2RlZmluZSBYS19SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTIgIC8qIFUrMDA1MiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSICovCisjZGVmaW5lIFhLX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MyAgLyogVSswMDUzIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi8KKyNkZWZpbmUgWEtfVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU0ICAvKiBVKzAwNTQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCAqLworI2RlZmluZSBYS19VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTUgIC8qIFUrMDA1NSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVICovCisjZGVmaW5lIFhLX1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NiAgLyogVSswMDU2IExBVElOIENBUElUQUwgTEVUVEVSIFYgKi8KKyNkZWZpbmUgWEtfVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU3ICAvKiBVKzAwNTcgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyAqLworI2RlZmluZSBYS19YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTggIC8qIFUrMDA1OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBYICovCisjZGVmaW5lIFhLX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1OSAgLyogVSswMDU5IExBVElOIENBUElUQUwgTEVUVEVSIFkgKi8KKyNkZWZpbmUgWEtfWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDVhICAvKiBVKzAwNUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiAqLworI2RlZmluZSBYS19icmFja2V0bGVmdCAgICAgICAgICAgICAgICAgICAweDAwNWIgIC8qIFUrMDA1QiBMRUZUIFNRVUFSRSBCUkFDS0VUICovCisjZGVmaW5lIFhLX2JhY2tzbGFzaCAgICAgICAgICAgICAgICAgICAgIDB4MDA1YyAgLyogVSswMDVDIFJFVkVSU0UgU09MSURVUyAqLworI2RlZmluZSBYS19icmFja2V0cmlnaHQgICAgICAgICAgICAgICAgICAweDAwNWQgIC8qIFUrMDA1RCBSSUdIVCBTUVVBUkUgQlJBQ0tFVCAqLworI2RlZmluZSBYS19hc2NpaWNpcmN1bSAgICAgICAgICAgICAgICAgICAweDAwNWUgIC8qIFUrMDA1RSBDSVJDVU1GTEVYIEFDQ0VOVCAqLworI2RlZmluZSBYS191bmRlcnNjb3JlICAgICAgICAgICAgICAgICAgICAweDAwNWYgIC8qIFUrMDA1RiBMT1cgTElORSAqLworI2RlZmluZSBYS19ncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIFUrMDA2MCBHUkFWRSBBQ0NFTlQgKi8KKyNkZWZpbmUgWEtfcXVvdGVsZWZ0ICAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MSAgLyogVSswMDYxIExBVElOIFNNQUxMIExFVFRFUiBBICovCisjZGVmaW5lIFhLX2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MiAgLyogVSswMDYyIExBVElOIFNNQUxMIExFVFRFUiBCICovCisjZGVmaW5lIFhLX2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MyAgLyogVSswMDYzIExBVElOIFNNQUxMIExFVFRFUiBDICovCisjZGVmaW5lIFhLX2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NCAgLyogVSswMDY0IExBVElOIFNNQUxMIExFVFRFUiBEICovCisjZGVmaW5lIFhLX2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NSAgLyogVSswMDY1IExBVElOIFNNQUxMIExFVFRFUiBFICovCisjZGVmaW5lIFhLX2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NiAgLyogVSswMDY2IExBVElOIFNNQUxMIExFVFRFUiBGICovCisjZGVmaW5lIFhLX2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NyAgLyogVSswMDY3IExBVElOIFNNQUxMIExFVFRFUiBHICovCisjZGVmaW5lIFhLX2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2OCAgLyogVSswMDY4IExBVElOIFNNQUxMIExFVFRFUiBIICovCisjZGVmaW5lIFhLX2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2OSAgLyogVSswMDY5IExBVElOIFNNQUxMIExFVFRFUiBJICovCisjZGVmaW5lIFhLX2ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YSAgLyogVSswMDZBIExBVElOIFNNQUxMIExFVFRFUiBKICovCisjZGVmaW5lIFhLX2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YiAgLyogVSswMDZCIExBVElOIFNNQUxMIExFVFRFUiBLICovCisjZGVmaW5lIFhLX2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YyAgLyogVSswMDZDIExBVElOIFNNQUxMIExFVFRFUiBMICovCisjZGVmaW5lIFhLX20gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZCAgLyogVSswMDZEIExBVElOIFNNQUxMIExFVFRFUiBNICovCisjZGVmaW5lIFhLX24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZSAgLyogVSswMDZFIExBVElOIFNNQUxMIExFVFRFUiBOICovCisjZGVmaW5lIFhLX28gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZiAgLyogVSswMDZGIExBVElOIFNNQUxMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MCAgLyogVSswMDcwIExBVElOIFNNQUxMIExFVFRFUiBQICovCisjZGVmaW5lIFhLX3EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MSAgLyogVSswMDcxIExBVElOIFNNQUxMIExFVFRFUiBRICovCisjZGVmaW5lIFhLX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MiAgLyogVSswMDcyIExBVElOIFNNQUxMIExFVFRFUiBSICovCisjZGVmaW5lIFhLX3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MyAgLyogVSswMDczIExBVElOIFNNQUxMIExFVFRFUiBTICovCisjZGVmaW5lIFhLX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NCAgLyogVSswMDc0IExBVElOIFNNQUxMIExFVFRFUiBUICovCisjZGVmaW5lIFhLX3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NSAgLyogVSswMDc1IExBVElOIFNNQUxMIExFVFRFUiBVICovCisjZGVmaW5lIFhLX3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NiAgLyogVSswMDc2IExBVElOIFNNQUxMIExFVFRFUiBWICovCisjZGVmaW5lIFhLX3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NyAgLyogVSswMDc3IExBVElOIFNNQUxMIExFVFRFUiBXICovCisjZGVmaW5lIFhLX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OCAgLyogVSswMDc4IExBVElOIFNNQUxMIExFVFRFUiBYICovCisjZGVmaW5lIFhLX3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OSAgLyogVSswMDc5IExBVElOIFNNQUxMIExFVFRFUiBZICovCisjZGVmaW5lIFhLX3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3YSAgLyogVSswMDdBIExBVElOIFNNQUxMIExFVFRFUiBaICovCisjZGVmaW5lIFhLX2JyYWNlbGVmdCAgICAgICAgICAgICAgICAgICAgIDB4MDA3YiAgLyogVSswMDdCIExFRlQgQ1VSTFkgQlJBQ0tFVCAqLworI2RlZmluZSBYS19iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2MgIC8qIFUrMDA3QyBWRVJUSUNBTCBMSU5FICovCisjZGVmaW5lIFhLX2JyYWNlcmlnaHQgICAgICAgICAgICAgICAgICAgIDB4MDA3ZCAgLyogVSswMDdEIFJJR0hUIENVUkxZIEJSQUNLRVQgKi8KKyNkZWZpbmUgWEtfYXNjaWl0aWxkZSAgICAgICAgICAgICAgICAgICAgMHgwMDdlICAvKiBVKzAwN0UgVElMREUgKi8KKworI2RlZmluZSBYS19ub2JyZWFrc3BhY2UgICAgICAgICAgICAgICAgICAweDAwYTAgIC8qIFUrMDBBMCBOTy1CUkVBSyBTUEFDRSAqLworI2RlZmluZSBYS19leGNsYW1kb3duICAgICAgICAgICAgICAgICAgICAweDAwYTEgIC8qIFUrMDBBMSBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLICovCisjZGVmaW5lIFhLX2NlbnQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhMiAgLyogVSswMEEyIENFTlQgU0lHTiAqLworI2RlZmluZSBYS19zdGVybGluZyAgICAgICAgICAgICAgICAgICAgICAweDAwYTMgIC8qIFUrMDBBMyBQT1VORCBTSUdOICovCisjZGVmaW5lIFhLX2N1cnJlbmN5ICAgICAgICAgICAgICAgICAgICAgIDB4MDBhNCAgLyogVSswMEE0IENVUlJFTkNZIFNJR04gKi8KKyNkZWZpbmUgWEtfeWVuICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGE1ICAvKiBVKzAwQTUgWUVOIFNJR04gKi8KKyNkZWZpbmUgWEtfYnJva2VuYmFyICAgICAgICAgICAgICAgICAgICAgMHgwMGE2ICAvKiBVKzAwQTYgQlJPS0VOIEJBUiAqLworI2RlZmluZSBYS19zZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAweDAwYTcgIC8qIFUrMDBBNyBTRUNUSU9OIFNJR04gKi8KKyNkZWZpbmUgWEtfZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAgMHgwMGE4ICAvKiBVKzAwQTggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2NvcHlyaWdodCAgICAgICAgICAgICAgICAgICAgIDB4MDBhOSAgLyogVSswMEE5IENPUFlSSUdIVCBTSUdOICovCisjZGVmaW5lIFhLX29yZGZlbWluaW5lICAgICAgICAgICAgICAgICAgIDB4MDBhYSAgLyogVSswMEFBIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovCisjZGVmaW5lIFhLX2d1aWxsZW1vdGxlZnQgICAgICAgICAgICAgICAgIDB4MDBhYiAgLyogVSswMEFCIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX25vdHNpZ24gICAgICAgICAgICAgICAgICAgICAgIDB4MDBhYyAgLyogVSswMEFDIE5PVCBTSUdOICovCisjZGVmaW5lIFhLX2h5cGhlbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhZCAgLyogVSswMEFEIFNPRlQgSFlQSEVOICovCisjZGVmaW5lIFhLX3JlZ2lzdGVyZWQgICAgICAgICAgICAgICAgICAgIDB4MDBhZSAgLyogVSswMEFFIFJFR0lTVEVSRUQgU0lHTiAqLworI2RlZmluZSBYS19tYWNyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAwYWYgIC8qIFUrMDBBRiBNQUNST04gKi8KKyNkZWZpbmUgWEtfZGVncmVlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGIwICAvKiBVKzAwQjAgREVHUkVFIFNJR04gKi8KKyNkZWZpbmUgWEtfcGx1c21pbnVzICAgICAgICAgICAgICAgICAgICAgMHgwMGIxICAvKiBVKzAwQjEgUExVUy1NSU5VUyBTSUdOICovCisjZGVmaW5lIFhLX3R3b3N1cGVyaW9yICAgICAgICAgICAgICAgICAgIDB4MDBiMiAgLyogVSswMEIyIFNVUEVSU0NSSVBUIFRXTyAqLworI2RlZmluZSBYS190aHJlZXN1cGVyaW9yICAgICAgICAgICAgICAgICAweDAwYjMgIC8qIFUrMDBCMyBTVVBFUlNDUklQVCBUSFJFRSAqLworI2RlZmluZSBYS19hY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYjQgIC8qIFUrMDBCNCBBQ1VURSBBQ0NFTlQgKi8KKyNkZWZpbmUgWEtfbXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGI1ICAvKiBVKzAwQjUgTUlDUk8gU0lHTiAqLworI2RlZmluZSBYS19wYXJhZ3JhcGggICAgICAgICAgICAgICAgICAgICAweDAwYjYgIC8qIFUrMDBCNiBQSUxDUk9XIFNJR04gKi8KKyNkZWZpbmUgWEtfcGVyaW9kY2VudGVyZWQgICAgICAgICAgICAgICAgMHgwMGI3ICAvKiBVKzAwQjcgTUlERExFIERPVCAqLworI2RlZmluZSBYS19jZWRpbGxhICAgICAgICAgICAgICAgICAgICAgICAweDAwYjggIC8qIFUrMDBCOCBDRURJTExBICovCisjZGVmaW5lIFhLX29uZXN1cGVyaW9yICAgICAgICAgICAgICAgICAgIDB4MDBiOSAgLyogVSswMEI5IFNVUEVSU0NSSVBUIE9ORSAqLworI2RlZmluZSBYS19tYXNjdWxpbmUgICAgICAgICAgICAgICAgICAgICAweDAwYmEgIC8qIFUrMDBCQSBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IgKi8KKyNkZWZpbmUgWEtfZ3VpbGxlbW90cmlnaHQgICAgICAgICAgICAgICAgMHgwMGJiICAvKiBVKzAwQkIgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX29uZXF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgIDB4MDBiYyAgLyogVSswMEJDIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUiAqLworI2RlZmluZSBYS19vbmVoYWxmICAgICAgICAgICAgICAgICAgICAgICAweDAwYmQgIC8qIFUrMDBCRCBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYgKi8KKyNkZWZpbmUgWEtfdGhyZWVxdWFydGVycyAgICAgICAgICAgICAgICAgMHgwMGJlICAvKiBVKzAwQkUgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTICovCisjZGVmaW5lIFhLX3F1ZXN0aW9uZG93biAgICAgICAgICAgICAgICAgIDB4MDBiZiAgLyogVSswMEJGIElOVkVSVEVEIFFVRVNUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfQWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGMwICAvKiBVKzAwQzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX0FhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMSAgLyogVSswMEMxIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwYzIgIC8qIFUrMDBDMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19BdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzMgIC8qIFUrMDBDMyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfQWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGM0ICAvKiBVKzAwQzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19BcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzUgIC8qIFUrMDBDNSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS19BRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzYgIC8qIFUrMDBDNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRSAqLworI2RlZmluZSBYS19DY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAwYzcgIC8qIFUrMDBDNyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19FZ3JhdmUgICAgICAgICAgICAgICAgICAgICAgICAweDAwYzggIC8qIFUrMDBDOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfRWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM5ICAvKiBVKzAwQzkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBjYSAgLyogVSswMENBIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX0VkaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBjYiAgLyogVSswMENCIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfSWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGNjICAvKiBVKzAwQ0MgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX0lhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjZCAgLyogVSswMENEIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19JY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwY2UgIC8qIFUrMDBDRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19JZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwY2YgIC8qIFUrMDBDRiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX0VUSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMCAgLyogVSswMEQwIExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAqLworI2RlZmluZSBYS19FdGggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDAgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfTnRpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQxICAvKiBVKzAwRDEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX09ncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMiAgLyogVSswMEQyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19PYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZDMgIC8qIFUrMDBEMyBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMGQ0ICAvKiBVKzAwRDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfT3RpbGRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ1ICAvKiBVKzAwRDUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX09kaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBkNiAgLyogVSswMEQ2IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfbXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ3ICAvKiBVKzAwRDcgTVVMVElQTElDQVRJT04gU0lHTiAqLworI2RlZmluZSBYS19Pc2xhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDAwZDggIC8qIFUrMDBEOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX09vYmxpcXVlICAgICAgICAgICAgICAgICAgICAgIDB4MDBkOCAgLyogVSswMEQ4IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfVWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQ5ICAvKiBVKzAwRDkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX1VhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkYSAgLyogVSswMERBIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19VY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZGIgIC8qIFUrMDBEQiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19VZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZGMgIC8qIFUrMDBEQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX1lhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZCAgLyogVSswMEREIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19USE9STiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZGUgIC8qIFUrMDBERSBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAqLworI2RlZmluZSBYS19UaG9ybiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZGUgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfc3NoYXJwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGRmICAvKiBVKzAwREYgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKi8KKyNkZWZpbmUgWEtfYWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUwICAvKiBVKzAwRTAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19hYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTEgIC8qIFUrMDBFMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2FjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBlMiAgLyogVSswMEUyIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19hdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTMgIC8qIFUrMDBFMyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX2FkaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBlNCAgLyogVSswMEU0IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2FyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlNSAgLyogVSswMEU1IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS19hZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTYgIC8qIFUrMDBFNiBMQVRJTiBTTUFMTCBMRVRURVIgQUUgKi8KKyNkZWZpbmUgWEtfY2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwMGU3ICAvKiBVKzAwRTcgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX2VncmF2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlOCAgLyogVSswMEU4IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfZWFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGU5ICAvKiBVKzAwRTkgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19lY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAwZWEgIC8qIFUrMDBFQSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfZWRpYWVyZXNpcyAgICAgICAgICAgICAgICAgICAgMHgwMGViICAvKiBVKzAwRUIgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi8KKyNkZWZpbmUgWEtfaWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGVjICAvKiBVKzAwRUMgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19pYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZWQgIC8qIFUrMDBFRCBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2ljaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBlZSAgLyogVSswMEVFIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19pZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZWYgIC8qIFUrMDBFRiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS19ldGggICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjAgIC8qIFUrMDBGMCBMQVRJTiBTTUFMTCBMRVRURVIgRVRIICovCisjZGVmaW5lIFhLX250aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMSAgLyogVSswMEYxIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfb2dyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGYyICAvKiBVKzAwRjIgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19vYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjMgIC8qIFUrMDBGMyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBmNCAgLyogVSswMEY0IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19vdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjUgIC8qIFUrMDBGNSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX29kaWFlcmVzaXMgICAgICAgICAgICAgICAgICAgIDB4MDBmNiAgLyogVSswMEY2IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX2RpdmlzaW9uICAgICAgICAgICAgICAgICAgICAgIDB4MDBmNyAgLyogVSswMEY3IERJVklTSU9OIFNJR04gKi8KKyNkZWZpbmUgWEtfb3NsYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGY4ICAvKiBVKzAwRjggTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfb29ibGlxdWUgICAgICAgICAgICAgICAgICAgICAgMHgwMGY4ICAvKiBVKzAwRjggTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfdWdyYXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGY5ICAvKiBVKzAwRjkgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS191YWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmEgIC8qIFUrMDBGQSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX3VjaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDBmYiAgLyogVSswMEZCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS191ZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZmMgIC8qIFUrMDBGQyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqLworI2RlZmluZSBYS195YWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmQgIC8qIFUrMDBGRCBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX3Rob3JuICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmZSAgLyogVSswMEZFIExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAqLworI2RlZmluZSBYS195ZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDAwZmYgIC8qIFUrMDBGRiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqLworI2VuZGlmIC8qIFhLX0xBVElOMSAqLworCisvKgorICogTGF0aW4gMgorICogQnl0ZSAzID0gMQorICovCisKKyNpZmRlZiBYS19MQVRJTjIKKyNkZWZpbmUgWEtfQW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWExICAvKiBVKzAxMDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19icmV2ZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTIgIC8qIFUrMDJEOCBCUkVWRSAqLworI2RlZmluZSBYS19Mc3Ryb2tlICAgICAgICAgICAgICAgICAgICAgICAweDAxYTMgIC8qIFUrMDE0MSBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0xjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNSAgLyogVSswMTNEIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19TYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTYgIC8qIFUrMDE1QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfU2Nhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE5ICAvKiBVKzAxNjAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX1NjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFhYSAgLyogVSswMTVFIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX1RjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhYiAgLyogVSswMTY0IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19aYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYWMgIC8qIFUrMDE3OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfWmNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWFlICAvKiBVKzAxN0QgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX1phYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDFhZiAgLyogVSswMTdCIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfYW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWIxICAvKiBVKzAxMDUgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWIyICAvKiBVKzAyREIgT0dPTkVLICovCisjZGVmaW5lIFhLX2xzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiMyAgLyogVSswMTQyIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX2xjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiNSAgLyogVSswMTNFIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfc2FjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWI2ICAvKiBVKzAxNUIgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19jYXJvbiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYjcgIC8qIFUrMDJDNyBDQVJPTiAqLworI2RlZmluZSBYS19zY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYjkgIC8qIFUrMDE2MSBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3NjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFiYSAgLyogVSswMTVGIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS190Y2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYmIgIC8qIFUrMDE2NSBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3phY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFiYyAgLyogVSswMTdBIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAgMHgwMWJkICAvKiBVKzAyREQgRE9VQkxFIEFDVVRFIEFDQ0VOVCAqLworI2RlZmluZSBYS196Y2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYmUgIC8qIFUrMDE3RSBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX3phYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgIDB4MDFiZiAgLyogVSswMTdDIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1JhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjMCAgLyogVSswMTU0IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19BYnJldmUgICAgICAgICAgICAgICAgICAgICAgICAweDAxYzMgIC8qIFUrMDEwMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfTGFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWM1ICAvKiBVKzAxMzkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX0NhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFjNiAgLyogVSswMTA2IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19DY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxYzggIC8qIFUrMDEwQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfRW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwMWNhICAvKiBVKzAxMTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19FY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxY2MgIC8qIFUrMDExQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfRGNhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWNmICAvKiBVKzAxMEUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX0RzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMCAgLyogVSswMTEwIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfTmFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWQxICAvKiBVKzAxNDMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX05jYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkMiAgLyogVSswMTQ3IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19PZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAweDAxZDUgIC8qIFUrMDE1MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX1JjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFkOCAgLyogVSswMTU4IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19VcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxZDkgIC8qIFUrMDE2RSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRSAqLworI2RlZmluZSBYS19VZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgICAweDAxZGIgIC8qIFUrMDE3MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX1RjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFkZSAgLyogVSswMTYyIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX3JhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlMCAgLyogVSswMTU1IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfYWJyZXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWUzICAvKiBVKzAxMDMgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS19sYWN1dGUgICAgICAgICAgICAgICAgICAgICAgICAweDAxZTUgIC8qIFUrMDEzQSBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX2NhY3V0ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlNiAgLyogVSswMTA3IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUgKi8KKyNkZWZpbmUgWEtfY2Nhcm9uICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWU4ICAvKiBVKzAxMEQgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTiAqLworI2RlZmluZSBYS19lb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAweDAxZWEgIC8qIFUrMDExOSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19lY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZWMgIC8qIFUrMDExQiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX2RjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFlZiAgLyogVSswMTBGIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfZHN0cm9rZSAgICAgICAgICAgICAgICAgICAgICAgMHgwMWYwICAvKiBVKzAxMTEgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfbmFjdXRlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWYxICAvKiBVKzAxNDQgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19uY2Fyb24gICAgICAgICAgICAgICAgICAgICAgICAweDAxZjIgIC8qIFUrMDE0OCBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX29kb3VibGVhY3V0ZSAgICAgICAgICAgICAgICAgIDB4MDFmNSAgLyogVSswMTUxIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX3Vkb3VibGVhY3V0ZSAgICAgICAgICAgICAgICAgIDB4MDFmYiAgLyogVSswMTcxIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFICovCisjZGVmaW5lIFhLX3JjYXJvbiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFmOCAgLyogVSswMTU5IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfdXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWY5ICAvKiBVKzAxNkYgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFICovCisjZGVmaW5lIFhLX3RjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDFmZSAgLyogVSswMTYzIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19hYm92ZWRvdCAgICAgICAgICAgICAgICAgICAgICAweDAxZmYgIC8qIFUrMDJEOSBET1QgQUJPVkUgKi8KKyNlbmRpZiAvKiBYS19MQVRJTjIgKi8KKworLyoKKyAqIExhdGluIDMKKyAqIEJ5dGUgMyA9IDIKKyAqLworCisjaWZkZWYgWEtfTEFUSU4zCisjZGVmaW5lIFhLX0hzdHJva2UgICAgICAgICAgICAgICAgICAgICAgIDB4MDJhMSAgLyogVSswMTI2IExBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfSGNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmE2ICAvKiBVKzAxMjQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfSWFib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmE5ICAvKiBVKzAxMzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19HYnJldmUgICAgICAgICAgICAgICAgICAgICAgICAweDAyYWIgIC8qIFUrMDExRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfSmNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmFjICAvKiBVKzAxMzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfaHN0cm9rZSAgICAgICAgICAgICAgICAgICAgICAgMHgwMmIxICAvKiBVKzAxMjcgTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfaGNpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmI2ICAvKiBVKzAxMjUgTEFUSU4gU01BTEwgTEVUVEVSIEggV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX2lkb3RsZXNzICAgICAgICAgICAgICAgICAgICAgIDB4MDJiOSAgLyogVSswMTMxIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkgKi8KKyNkZWZpbmUgWEtfZ2JyZXZlICAgICAgICAgICAgICAgICAgICAgICAgMHgwMmJiICAvKiBVKzAxMUYgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS19qY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyYmMgIC8qIFUrMDEzNSBMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfQ2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmM1ICAvKiBVKzAxMEEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19DY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyYzYgIC8qIFUrMDEwOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19HYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAyZDUgIC8qIFUrMDEyMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX0djaXJjdW1mbGV4ICAgICAgICAgICAgICAgICAgIDB4MDJkOCAgLyogVSswMTFDIExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX1VicmV2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJkZCAgLyogVSswMTZDIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS19TY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyZGUgIC8qIFUrMDE1QyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWCAqLworI2RlZmluZSBYS19jYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAyZTUgIC8qIFUrMDEwQiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19jY2lyY3VtZmxleCAgICAgICAgICAgICAgICAgICAweDAyZTYgIC8qIFUrMDEwOSBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfZ2Fib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwMmY1ICAvKiBVKzAxMjEgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfZ2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmY4ICAvKiBVKzAxMUQgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX3VicmV2ZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDJmZCAgLyogVSswMTZEIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfc2NpcmN1bWZsZXggICAgICAgICAgICAgICAgICAgMHgwMmZlICAvKiBVKzAxNUQgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYICovCisjZW5kaWYgLyogWEtfTEFUSU4zICovCisKKworLyoKKyAqIExhdGluIDQKKyAqIEJ5dGUgMyA9IDMKKyAqLworCisjaWZkZWYgWEtfTEFUSU40CisjZGVmaW5lIFhLX2tyYSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhMiAgLyogVSswMTM4IExBVElOIFNNQUxMIExFVFRFUiBLUkEgKi8KKyNkZWZpbmUgWEtfa2FwcGEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2EyICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1JjZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNhMyAgLyogVSswMTU2IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX0l0aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhNSAgLyogVSswMTI4IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERSAqLworI2RlZmluZSBYS19MY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzYTYgIC8qIFUrMDEzQiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS19FbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzYWEgIC8qIFUrMDExMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0djZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNhYiAgLyogVSswMTIyIExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX1RzbGFzaCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNhYyAgLyogVSswMTY2IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfcmNlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2IzICAvKiBVKzAxNTcgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX2l0aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNiNSAgLyogVSswMTI5IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfbGNlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2I2ICAvKiBVKzAxM0MgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX2VtYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNiYSAgLyogVSswMTEzIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX2djZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNiYiAgLyogVSswMTIzIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQSAqLworI2RlZmluZSBYS190c2xhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDAzYmMgIC8qIFUrMDE2NyBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19FTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzYmQgIC8qIFUrMDE0QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkcgKi8KKyNkZWZpbmUgWEtfZW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwM2JmICAvKiBVKzAxNEIgTEFUSU4gU01BTEwgTEVUVEVSIEVORyAqLworI2RlZmluZSBYS19BbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzYzAgIC8qIFUrMDEwMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX0lvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDNjNyAgLyogVSswMTJFIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsgKi8KKyNkZWZpbmUgWEtfRWFib3ZlZG90ICAgICAgICAgICAgICAgICAgICAgMHgwM2NjICAvKiBVKzAxMTYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19JbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzY2YgIC8qIFUrMDEyQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OICovCisjZGVmaW5lIFhLX05jZWRpbGxhICAgICAgICAgICAgICAgICAgICAgIDB4MDNkMSAgLyogVSswMTQ1IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX09tYWNyb24gICAgICAgICAgICAgICAgICAgICAgIDB4MDNkMiAgLyogVSswMTRDIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfS2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2QzICAvKiBVKzAxMzYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfVW9nb25layAgICAgICAgICAgICAgICAgICAgICAgMHgwM2Q5ICAvKiBVKzAxNzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19VdGlsZGUgICAgICAgICAgICAgICAgICAgICAgICAweDAzZGQgIC8qIFUrMDE2OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfVW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2RlICAvKiBVKzAxNkEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19hbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzZTAgIC8qIFUrMDEwMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19pb2dvbmVrICAgICAgICAgICAgICAgICAgICAgICAweDAzZTcgIC8qIFUrMDEyRiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSyAqLworI2RlZmluZSBYS19lYWJvdmVkb3QgICAgICAgICAgICAgICAgICAgICAweDAzZWMgIC8qIFUrMDExNyBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19pbWFjcm9uICAgICAgICAgICAgICAgICAgICAgICAweDAzZWYgIC8qIFUrMDEyQiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTiAqLworI2RlZmluZSBYS19uY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgICAweDAzZjEgIC8qIFUrMDE0NiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEgKi8KKyNkZWZpbmUgWEtfb21hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2YyICAvKiBVKzAxNEQgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfa2NlZGlsbGEgICAgICAgICAgICAgICAgICAgICAgMHgwM2YzICAvKiBVKzAxMzcgTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBICovCisjZGVmaW5lIFhLX3VvZ29uZWsgICAgICAgICAgICAgICAgICAgICAgIDB4MDNmOSAgLyogVSswMTczIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLICovCisjZGVmaW5lIFhLX3V0aWxkZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDNmZCAgLyogVSswMTY5IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfdW1hY3JvbiAgICAgICAgICAgICAgICAgICAgICAgMHgwM2ZlICAvKiBVKzAxNkIgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKyNlbmRpZiAvKiBYS19MQVRJTjQgKi8KKworLyoKKyAqIExhdGluIDgKKyAqLworI2lmZGVmIFhLX0xBVElOOAorI2RlZmluZSBYS19CYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMDIgIC8qIFUrMUUwMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX2JhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUwMyAgLyogVSsxRTAzIExBVElOIFNNQUxMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX0RhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUwYSAgLyogVSsxRTBBIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfV2dyYXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZTgwICAvKiBVKzFFODAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEdSQVZFICovCisjZGVmaW5lIFhLX1dhY3V0ZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWU4MiAgLyogVSsxRTgyIExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBBQ1VURSAqLworI2RlZmluZSBYS19kYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMGIgIC8qIFUrMUUwQiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19ZZ3JhdmUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjIgIC8qIFUrMUVGMiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggR1JBVkUgKi8KKyNkZWZpbmUgWEtfRmFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTFlICAvKiBVKzFFMUUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19mYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlMWYgIC8qIFUrMUUxRiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19NYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNDAgIC8qIFUrMUU0MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBNIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX21hYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU0MSAgLyogVSsxRTQxIExBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1BhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU1NiAgLyogVSsxRTU2IExBVElOIENBUElUQUwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfd2dyYXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZTgxICAvKiBVKzFFODEgTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19wYWJvdmVkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlNTcgIC8qIFUrMUU1NyBMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS193YWN1dGUgICAgICAgICAgICAgICAgICAgICAweDEwMDFlODMgIC8qIFUrMUU4MyBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEFDVVRFICovCisjZGVmaW5lIFhLX1NhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2MCAgLyogVSsxRTYwIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfeWdyYXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWYzICAvKiBVKzFFRjMgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRSAqLworI2RlZmluZSBYS19XZGlhZXJlc2lzICAgICAgICAgICAgICAgICAweDEwMDFlODQgIC8qIFUrMUU4NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX3dkaWFlcmVzaXMgICAgICAgICAgICAgICAgIDB4MTAwMWU4NSAgLyogVSsxRTg1IExBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTICovCisjZGVmaW5lIFhLX3NhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2MSAgLyogVSsxRTYxIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX1djaXJjdW1mbGV4ICAgICAgICAgICAgICAgIDB4MTAwMDE3NCAgLyogVSswMTc0IExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX1RhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2YSAgLyogVSsxRTZBIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfWWNpcmN1bWZsZXggICAgICAgICAgICAgICAgMHgxMDAwMTc2ICAvKiBVKzAxNzYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIENJUkNVTUZMRVggKi8KKyNkZWZpbmUgWEtfd2NpcmN1bWZsZXggICAgICAgICAgICAgICAgMHgxMDAwMTc1ICAvKiBVKzAxNzUgTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYICovCisjZGVmaW5lIFhLX3RhYm92ZWRvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWU2YiAgLyogVSsxRTZCIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRE9UIEFCT1ZFICovCisjZGVmaW5lIFhLX3ljaXJjdW1mbGV4ICAgICAgICAgICAgICAgIDB4MTAwMDE3NyAgLyogVSswMTc3IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWCAqLworI2VuZGlmIC8qIFhLX0xBVElOOCAqLworCisvKgorICogTGF0aW4gOQorICogQnl0ZSAzID0gMHgxMworICovCisKKyNpZmRlZiBYS19MQVRJTjkKKyNkZWZpbmUgWEtfT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxM2JjICAvKiBVKzAxNTIgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRSAqLworI2RlZmluZSBYS19vZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzYmQgIC8qIFUrMDE1MyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRSAqLworI2RlZmluZSBYS19ZZGlhZXJlc2lzICAgICAgICAgICAgICAgICAgICAweDEzYmUgIC8qIFUrMDE3OCBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTICovCisjZW5kaWYgLyogWEtfTEFUSU45ICovCisKKy8qCisgKiBLYXRha2FuYQorICogQnl0ZSAzID0gNAorICovCisKKyNpZmRlZiBYS19LQVRBS0FOQQorI2RlZmluZSBYS19vdmVybGluZSAgICAgICAgICAgICAgICAgICAgICAweDA0N2UgIC8qIFUrMjAzRSBPVkVSTElORSAqLworI2RlZmluZSBYS19rYW5hX2Z1bGxzdG9wICAgICAgICAgICAgICAgICAweDA0YTEgIC8qIFUrMzAwMiBJREVPR1JBUEhJQyBGVUxMIFNUT1AgKi8KKyNkZWZpbmUgWEtfa2FuYV9vcGVuaW5nYnJhY2tldCAgICAgICAgICAgMHgwNGEyICAvKiBVKzMwMEMgTEVGVCBDT1JORVIgQlJBQ0tFVCAqLworI2RlZmluZSBYS19rYW5hX2Nsb3NpbmdicmFja2V0ICAgICAgICAgICAweDA0YTMgIC8qIFUrMzAwRCBSSUdIVCBDT1JORVIgQlJBQ0tFVCAqLworI2RlZmluZSBYS19rYW5hX2NvbW1hICAgICAgICAgICAgICAgICAgICAweDA0YTQgIC8qIFUrMzAwMSBJREVPR1JBUEhJQyBDT01NQSAqLworI2RlZmluZSBYS19rYW5hX2Nvbmp1bmN0aXZlICAgICAgICAgICAgICAweDA0YTUgIC8qIFUrMzBGQiBLQVRBS0FOQSBNSURETEUgRE9UICovCisjZGVmaW5lIFhLX2thbmFfbWlkZGxlZG90ICAgICAgICAgICAgICAgIDB4MDRhNSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX1dPICAgICAgICAgICAgICAgICAgICAgICAweDA0YTYgIC8qIFUrMzBGMiBLQVRBS0FOQSBMRVRURVIgV08gKi8KKyNkZWZpbmUgWEtfa2FuYV9hICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE3ICAvKiBVKzMwQTEgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIEEgKi8KKyNkZWZpbmUgWEtfa2FuYV9pICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE4ICAvKiBVKzMwQTMgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIEkgKi8KKyNkZWZpbmUgWEtfa2FuYV91ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGE5ICAvKiBVKzMwQTUgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFUgKi8KKyNkZWZpbmUgWEtfa2FuYV9lICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFhICAvKiBVKzMwQTcgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIEUgKi8KKyNkZWZpbmUgWEtfa2FuYV9vICAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFiICAvKiBVKzMwQTkgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIE8gKi8KKyNkZWZpbmUgWEtfa2FuYV95YSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGFjICAvKiBVKzMwRTMgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFlBICovCisjZGVmaW5lIFhLX2thbmFfeXUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhZCAgLyogVSszMEU1IEtBVEFLQU5BIExFVFRFUiBTTUFMTCBZVSAqLworI2RlZmluZSBYS19rYW5hX3lvICAgICAgICAgICAgICAgICAgICAgICAweDA0YWUgIC8qIFUrMzBFNyBLQVRBS0FOQSBMRVRURVIgU01BTEwgWU8gKi8KKyNkZWZpbmUgWEtfa2FuYV90c3UgICAgICAgICAgICAgICAgICAgICAgMHgwNGFmICAvKiBVKzMwQzMgS0FUQUtBTkEgTEVUVEVSIFNNQUxMIFRVICovCisjZGVmaW5lIFhLX2thbmFfdHUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRhZiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19wcm9sb25nZWRzb3VuZCAgICAgICAgICAgICAgICAweDA0YjAgIC8qIFUrMzBGQyBLQVRBS0FOQS1ISVJBR0FOQSBQUk9MT05HRUQgU09VTkQgTUFSSyAqLworI2RlZmluZSBYS19rYW5hX0EgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjEgIC8qIFUrMzBBMiBLQVRBS0FOQSBMRVRURVIgQSAqLworI2RlZmluZSBYS19rYW5hX0kgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjIgIC8qIFUrMzBBNCBLQVRBS0FOQSBMRVRURVIgSSAqLworI2RlZmluZSBYS19rYW5hX1UgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjMgIC8qIFUrMzBBNiBLQVRBS0FOQSBMRVRURVIgVSAqLworI2RlZmluZSBYS19rYW5hX0UgICAgICAgICAgICAgICAgICAgICAgICAweDA0YjQgIC8qIFUrMzBBOCBLQVRBS0FOQSBMRVRURVIgRSAqLworI2RlZmluZSBYS19rYW5hX08gICAgICAgICAgICAgICAgICAgICAgICAweDA0YjUgIC8qIFUrMzBBQSBLQVRBS0FOQSBMRVRURVIgTyAqLworI2RlZmluZSBYS19rYW5hX0tBICAgICAgICAgICAgICAgICAgICAgICAweDA0YjYgIC8qIFUrMzBBQiBLQVRBS0FOQSBMRVRURVIgS0EgKi8KKyNkZWZpbmUgWEtfa2FuYV9LSSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGI3ICAvKiBVKzMwQUQgS0FUQUtBTkEgTEVUVEVSIEtJICovCisjZGVmaW5lIFhLX2thbmFfS1UgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiOCAgLyogVSszMEFGIEtBVEFLQU5BIExFVFRFUiBLVSAqLworI2RlZmluZSBYS19rYW5hX0tFICAgICAgICAgICAgICAgICAgICAgICAweDA0YjkgIC8qIFUrMzBCMSBLQVRBS0FOQSBMRVRURVIgS0UgKi8KKyNkZWZpbmUgWEtfa2FuYV9LTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGJhICAvKiBVKzMwQjMgS0FUQUtBTkEgTEVUVEVSIEtPICovCisjZGVmaW5lIFhLX2thbmFfU0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiYiAgLyogVSszMEI1IEtBVEFLQU5BIExFVFRFUiBTQSAqLworI2RlZmluZSBYS19rYW5hX1NISSAgICAgICAgICAgICAgICAgICAgICAweDA0YmMgIC8qIFUrMzBCNyBLQVRBS0FOQSBMRVRURVIgU0kgKi8KKyNkZWZpbmUgWEtfa2FuYV9TVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGJkICAvKiBVKzMwQjkgS0FUQUtBTkEgTEVUVEVSIFNVICovCisjZGVmaW5lIFhLX2thbmFfU0UgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiZSAgLyogVSszMEJCIEtBVEFLQU5BIExFVFRFUiBTRSAqLworI2RlZmluZSBYS19rYW5hX1NPICAgICAgICAgICAgICAgICAgICAgICAweDA0YmYgIC8qIFUrMzBCRCBLQVRBS0FOQSBMRVRURVIgU08gKi8KKyNkZWZpbmUgWEtfa2FuYV9UQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGMwICAvKiBVKzMwQkYgS0FUQUtBTkEgTEVUVEVSIFRBICovCisjZGVmaW5lIFhLX2thbmFfQ0hJICAgICAgICAgICAgICAgICAgICAgIDB4MDRjMSAgLyogVSszMEMxIEtBVEFLQU5BIExFVFRFUiBUSSAqLworI2RlZmluZSBYS19rYW5hX1RJICAgICAgICAgICAgICAgICAgICAgICAweDA0YzEgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfa2FuYV9UU1UgICAgICAgICAgICAgICAgICAgICAgMHgwNGMyICAvKiBVKzMwQzQgS0FUQUtBTkEgTEVUVEVSIFRVICovCisjZGVmaW5lIFhLX2thbmFfVFUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjMiAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19rYW5hX1RFICAgICAgICAgICAgICAgICAgICAgICAweDA0YzMgIC8qIFUrMzBDNiBLQVRBS0FOQSBMRVRURVIgVEUgKi8KKyNkZWZpbmUgWEtfa2FuYV9UTyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGM0ICAvKiBVKzMwQzggS0FUQUtBTkEgTEVUVEVSIFRPICovCisjZGVmaW5lIFhLX2thbmFfTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjNSAgLyogVSszMENBIEtBVEFLQU5BIExFVFRFUiBOQSAqLworI2RlZmluZSBYS19rYW5hX05JICAgICAgICAgICAgICAgICAgICAgICAweDA0YzYgIC8qIFUrMzBDQiBLQVRBS0FOQSBMRVRURVIgTkkgKi8KKyNkZWZpbmUgWEtfa2FuYV9OVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGM3ICAvKiBVKzMwQ0MgS0FUQUtBTkEgTEVUVEVSIE5VICovCisjZGVmaW5lIFhLX2thbmFfTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjOCAgLyogVSszMENEIEtBVEFLQU5BIExFVFRFUiBORSAqLworI2RlZmluZSBYS19rYW5hX05PICAgICAgICAgICAgICAgICAgICAgICAweDA0YzkgIC8qIFUrMzBDRSBLQVRBS0FOQSBMRVRURVIgTk8gKi8KKyNkZWZpbmUgWEtfa2FuYV9IQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNhICAvKiBVKzMwQ0YgS0FUQUtBTkEgTEVUVEVSIEhBICovCisjZGVmaW5lIFhLX2thbmFfSEkgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjYiAgLyogVSszMEQyIEtBVEFLQU5BIExFVFRFUiBISSAqLworI2RlZmluZSBYS19rYW5hX0ZVICAgICAgICAgICAgICAgICAgICAgICAweDA0Y2MgIC8qIFUrMzBENSBLQVRBS0FOQSBMRVRURVIgSFUgKi8KKyNkZWZpbmUgWEtfa2FuYV9IVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNjICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2thbmFfSEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRjZCAgLyogVSszMEQ4IEtBVEFLQU5BIExFVFRFUiBIRSAqLworI2RlZmluZSBYS19rYW5hX0hPICAgICAgICAgICAgICAgICAgICAgICAweDA0Y2UgIC8qIFUrMzBEQiBLQVRBS0FOQSBMRVRURVIgSE8gKi8KKyNkZWZpbmUgWEtfa2FuYV9NQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGNmICAvKiBVKzMwREUgS0FUQUtBTkEgTEVUVEVSIE1BICovCisjZGVmaW5lIFhLX2thbmFfTUkgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkMCAgLyogVSszMERGIEtBVEFLQU5BIExFVFRFUiBNSSAqLworI2RlZmluZSBYS19rYW5hX01VICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDEgIC8qIFUrMzBFMCBLQVRBS0FOQSBMRVRURVIgTVUgKi8KKyNkZWZpbmUgWEtfa2FuYV9NRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQyICAvKiBVKzMwRTEgS0FUQUtBTkEgTEVUVEVSIE1FICovCisjZGVmaW5lIFhLX2thbmFfTU8gICAgICAgICAgICAgICAgICAgICAgIDB4MDRkMyAgLyogVSszMEUyIEtBVEFLQU5BIExFVFRFUiBNTyAqLworI2RlZmluZSBYS19rYW5hX1lBICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDQgIC8qIFUrMzBFNCBLQVRBS0FOQSBMRVRURVIgWUEgKi8KKyNkZWZpbmUgWEtfa2FuYV9ZVSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQ1ICAvKiBVKzMwRTYgS0FUQUtBTkEgTEVUVEVSIFlVICovCisjZGVmaW5lIFhLX2thbmFfWU8gICAgICAgICAgICAgICAgICAgICAgIDB4MDRkNiAgLyogVSszMEU4IEtBVEFLQU5BIExFVFRFUiBZTyAqLworI2RlZmluZSBYS19rYW5hX1JBICAgICAgICAgICAgICAgICAgICAgICAweDA0ZDcgIC8qIFUrMzBFOSBLQVRBS0FOQSBMRVRURVIgUkEgKi8KKyNkZWZpbmUgWEtfa2FuYV9SSSAgICAgICAgICAgICAgICAgICAgICAgMHgwNGQ4ICAvKiBVKzMwRUEgS0FUQUtBTkEgTEVUVEVSIFJJICovCisjZGVmaW5lIFhLX2thbmFfUlUgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkOSAgLyogVSszMEVCIEtBVEFLQU5BIExFVFRFUiBSVSAqLworI2RlZmluZSBYS19rYW5hX1JFICAgICAgICAgICAgICAgICAgICAgICAweDA0ZGEgIC8qIFUrMzBFQyBLQVRBS0FOQSBMRVRURVIgUkUgKi8KKyNkZWZpbmUgWEtfa2FuYV9STyAgICAgICAgICAgICAgICAgICAgICAgMHgwNGRiICAvKiBVKzMwRUQgS0FUQUtBTkEgTEVUVEVSIFJPICovCisjZGVmaW5lIFhLX2thbmFfV0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDRkYyAgLyogVSszMEVGIEtBVEFLQU5BIExFVFRFUiBXQSAqLworI2RlZmluZSBYS19rYW5hX04gICAgICAgICAgICAgICAgICAgICAgICAweDA0ZGQgIC8qIFUrMzBGMyBLQVRBS0FOQSBMRVRURVIgTiAqLworI2RlZmluZSBYS192b2ljZWRzb3VuZCAgICAgICAgICAgICAgICAgICAweDA0ZGUgIC8qIFUrMzA5QiBLQVRBS0FOQS1ISVJBR0FOQSBWT0lDRUQgU09VTkQgTUFSSyAqLworI2RlZmluZSBYS19zZW1pdm9pY2Vkc291bmQgICAgICAgICAgICAgICAweDA0ZGYgIC8qIFUrMzA5QyBLQVRBS0FOQS1ISVJBR0FOQSBTRU1JLVZPSUNFRCBTT1VORCBNQVJLICovCisjZGVmaW5lIFhLX2thbmFfc3dpdGNoICAgICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZW5kaWYgLyogWEtfS0FUQUtBTkEgKi8KKworLyoKKyAqIEFyYWJpYworICogQnl0ZSAzID0gNQorICovCisKKyNpZmRlZiBYS19BUkFCSUMKKyNkZWZpbmUgWEtfRmFyc2lfMCAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmYwICAvKiBVKzA2RjAgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFpFUk8gKi8KKyNkZWZpbmUgWEtfRmFyc2lfMSAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmYxICAvKiBVKzA2RjEgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE9ORSAqLworI2RlZmluZSBYS19GYXJzaV8yICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjIgIC8qIFUrMDZGMiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVFdPICovCisjZGVmaW5lIFhLX0ZhcnNpXzMgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmMyAgLyogVSswNkYzIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSAqLworI2RlZmluZSBYS19GYXJzaV80ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjQgIC8qIFUrMDZGNCBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUiAqLworI2RlZmluZSBYS19GYXJzaV81ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjUgIC8qIFUrMDZGNSBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRklWRSAqLworI2RlZmluZSBYS19GYXJzaV82ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjYgIC8qIFUrMDZGNiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0lYICovCisjZGVmaW5lIFhLX0ZhcnNpXzcgICAgICAgICAgICAgICAgICAgIDB4MTAwMDZmNyAgLyogVSswNkY3IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTiAqLworI2RlZmluZSBYS19GYXJzaV84ICAgICAgICAgICAgICAgICAgICAweDEwMDA2ZjggIC8qIFUrMDZGOCBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfRmFyc2lfOSAgICAgICAgICAgICAgICAgICAgMHgxMDAwNmY5ICAvKiBVKzA2RjkgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE5JTkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3BlcmNlbnQgICAgICAgICAgICAgMHgxMDAwNjZhICAvKiBVKzA2NkEgQVJBQklDIFBFUkNFTlQgU0lHTiAqLworI2RlZmluZSBYS19BcmFiaWNfc3VwZXJzY3JpcHRfYWxlZiAgICAweDEwMDA2NzAgIC8qIFUrMDY3MCBBUkFCSUMgTEVUVEVSIFNVUEVSU0NSSVBUIEFMRUYgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3R0ZWggICAgICAgICAgICAgICAgMHgxMDAwNjc5ICAvKiBVKzA2NzkgQVJBQklDIExFVFRFUiBUVEVIICovCisjZGVmaW5lIFhLX0FyYWJpY19wZWggICAgICAgICAgICAgICAgIDB4MTAwMDY3ZSAgLyogVSswNjdFIEFSQUJJQyBMRVRURVIgUEVIICovCisjZGVmaW5lIFhLX0FyYWJpY190Y2hlaCAgICAgICAgICAgICAgIDB4MTAwMDY4NiAgLyogVSswNjg2IEFSQUJJQyBMRVRURVIgVENIRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RkYWwgICAgICAgICAgICAgICAgMHgxMDAwNjg4ICAvKiBVKzA2ODggQVJBQklDIExFVFRFUiBEREFMICovCisjZGVmaW5lIFhLX0FyYWJpY19ycmVoICAgICAgICAgICAgICAgIDB4MTAwMDY5MSAgLyogVSswNjkxIEFSQUJJQyBMRVRURVIgUlJFSCAqLworI2RlZmluZSBYS19BcmFiaWNfY29tbWEgICAgICAgICAgICAgICAgICAweDA1YWMgIC8qIFUrMDYwQyBBUkFCSUMgQ09NTUEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2Z1bGxzdG9wICAgICAgICAgICAgMHgxMDAwNmQ0ICAvKiBVKzA2RDQgQVJBQklDIEZVTEwgU1RPUCAqLworI2RlZmluZSBYS19BcmFiaWNfMCAgICAgICAgICAgICAgICAgICAweDEwMDA2NjAgIC8qIFUrMDY2MCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTyAqLworI2RlZmluZSBYS19BcmFiaWNfMSAgICAgICAgICAgICAgICAgICAweDEwMDA2NjEgIC8qIFUrMDY2MSBBUkFCSUMtSU5ESUMgRElHSVQgT05FICovCisjZGVmaW5lIFhLX0FyYWJpY18yICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2MiAgLyogVSswNjYyIEFSQUJJQy1JTkRJQyBESUdJVCBUV08gKi8KKyNkZWZpbmUgWEtfQXJhYmljXzMgICAgICAgICAgICAgICAgICAgMHgxMDAwNjYzICAvKiBVKzA2NjMgQVJBQklDLUlORElDIERJR0lUIFRIUkVFICovCisjZGVmaW5lIFhLX0FyYWJpY180ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NCAgLyogVSswNjY0IEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSICovCisjZGVmaW5lIFhLX0FyYWJpY181ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NSAgLyogVSswNjY1IEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFICovCisjZGVmaW5lIFhLX0FyYWJpY182ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2NiAgLyogVSswNjY2IEFSQUJJQy1JTkRJQyBESUdJVCBTSVggKi8KKyNkZWZpbmUgWEtfQXJhYmljXzcgICAgICAgICAgICAgICAgICAgMHgxMDAwNjY3ICAvKiBVKzA2NjcgQVJBQklDLUlORElDIERJR0lUIFNFVkVOICovCisjZGVmaW5lIFhLX0FyYWJpY184ICAgICAgICAgICAgICAgICAgIDB4MTAwMDY2OCAgLyogVSswNjY4IEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVCAqLworI2RlZmluZSBYS19BcmFiaWNfOSAgICAgICAgICAgICAgICAgICAweDEwMDA2NjkgIC8qIFUrMDY2OSBBUkFCSUMtSU5ESUMgRElHSVQgTklORSAqLworI2RlZmluZSBYS19BcmFiaWNfc2VtaWNvbG9uICAgICAgICAgICAgICAweDA1YmIgIC8qIFUrMDYxQiBBUkFCSUMgU0VNSUNPTE9OICovCisjZGVmaW5lIFhLX0FyYWJpY19xdWVzdGlvbl9tYXJrICAgICAgICAgIDB4MDViZiAgLyogVSswNjFGIEFSQUJJQyBRVUVTVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YSAgICAgICAgICAgICAgICAgIDB4MDVjMSAgLyogVSswNjIxIEFSQUJJQyBMRVRURVIgSEFNWkEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX21hZGRhb25hbGVmICAgICAgICAgICAgMHgwNWMyICAvKiBVKzA2MjIgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphb25hbGVmICAgICAgICAgICAgMHgwNWMzICAvKiBVKzA2MjMgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhbXphb253YXcgICAgICAgICAgICAgMHgwNWM0ICAvKiBVKzA2MjQgQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemF1bmRlcmFsZWYgICAgICAgICAweDA1YzUgIC8qIFUrMDYyNSBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVyAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemFvbnllaCAgICAgICAgICAgICAweDA1YzYgIC8qIFUrMDYyNiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFICovCisjZGVmaW5lIFhLX0FyYWJpY19hbGVmICAgICAgICAgICAgICAgICAgIDB4MDVjNyAgLyogVSswNjI3IEFSQUJJQyBMRVRURVIgQUxFRiAqLworI2RlZmluZSBYS19BcmFiaWNfYmVoICAgICAgICAgICAgICAgICAgICAweDA1YzggIC8qIFUrMDYyOCBBUkFCSUMgTEVUVEVSIEJFSCAqLworI2RlZmluZSBYS19BcmFiaWNfdGVobWFyYnV0YSAgICAgICAgICAgICAweDA1YzkgIC8qIFUrMDYyOSBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBICovCisjZGVmaW5lIFhLX0FyYWJpY190ZWggICAgICAgICAgICAgICAgICAgIDB4MDVjYSAgLyogVSswNjJBIEFSQUJJQyBMRVRURVIgVEVIICovCisjZGVmaW5lIFhLX0FyYWJpY190aGVoICAgICAgICAgICAgICAgICAgIDB4MDVjYiAgLyogVSswNjJCIEFSQUJJQyBMRVRURVIgVEhFSCAqLworI2RlZmluZSBYS19BcmFiaWNfamVlbSAgICAgICAgICAgICAgICAgICAweDA1Y2MgIC8qIFUrMDYyQyBBUkFCSUMgTEVUVEVSIEpFRU0gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2hhaCAgICAgICAgICAgICAgICAgICAgMHgwNWNkICAvKiBVKzA2MkQgQVJBQklDIExFVFRFUiBIQUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2toYWggICAgICAgICAgICAgICAgICAgMHgwNWNlICAvKiBVKzA2MkUgQVJBQklDIExFVFRFUiBLSEFIICovCisjZGVmaW5lIFhLX0FyYWJpY19kYWwgICAgICAgICAgICAgICAgICAgIDB4MDVjZiAgLyogVSswNjJGIEFSQUJJQyBMRVRURVIgREFMICovCisjZGVmaW5lIFhLX0FyYWJpY190aGFsICAgICAgICAgICAgICAgICAgIDB4MDVkMCAgLyogVSswNjMwIEFSQUJJQyBMRVRURVIgVEhBTCAqLworI2RlZmluZSBYS19BcmFiaWNfcmEgICAgICAgICAgICAgICAgICAgICAweDA1ZDEgIC8qIFUrMDYzMSBBUkFCSUMgTEVUVEVSIFJFSCAqLworI2RlZmluZSBYS19BcmFiaWNfemFpbiAgICAgICAgICAgICAgICAgICAweDA1ZDIgIC8qIFUrMDYzMiBBUkFCSUMgTEVUVEVSIFpBSU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX3NlZW4gICAgICAgICAgICAgICAgICAgMHgwNWQzICAvKiBVKzA2MzMgQVJBQklDIExFVFRFUiBTRUVOICovCisjZGVmaW5lIFhLX0FyYWJpY19zaGVlbiAgICAgICAgICAgICAgICAgIDB4MDVkNCAgLyogVSswNjM0IEFSQUJJQyBMRVRURVIgU0hFRU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX3NhZCAgICAgICAgICAgICAgICAgICAgMHgwNWQ1ICAvKiBVKzA2MzUgQVJBQklDIExFVFRFUiBTQUQgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RhZCAgICAgICAgICAgICAgICAgICAgMHgwNWQ2ICAvKiBVKzA2MzYgQVJBQklDIExFVFRFUiBEQUQgKi8KKyNkZWZpbmUgWEtfQXJhYmljX3RhaCAgICAgICAgICAgICAgICAgICAgMHgwNWQ3ICAvKiBVKzA2MzcgQVJBQklDIExFVFRFUiBUQUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3phaCAgICAgICAgICAgICAgICAgICAgMHgwNWQ4ICAvKiBVKzA2MzggQVJBQklDIExFVFRFUiBaQUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2FpbiAgICAgICAgICAgICAgICAgICAgMHgwNWQ5ICAvKiBVKzA2MzkgQVJBQklDIExFVFRFUiBBSU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2doYWluICAgICAgICAgICAgICAgICAgMHgwNWRhICAvKiBVKzA2M0EgQVJBQklDIExFVFRFUiBHSEFJTiAqLworI2RlZmluZSBYS19BcmFiaWNfdGF0d2VlbCAgICAgICAgICAgICAgICAweDA1ZTAgIC8qIFUrMDY0MCBBUkFCSUMgVEFUV0VFTCAqLworI2RlZmluZSBYS19BcmFiaWNfZmVoICAgICAgICAgICAgICAgICAgICAweDA1ZTEgIC8qIFUrMDY0MSBBUkFCSUMgTEVUVEVSIEZFSCAqLworI2RlZmluZSBYS19BcmFiaWNfcWFmICAgICAgICAgICAgICAgICAgICAweDA1ZTIgIC8qIFUrMDY0MiBBUkFCSUMgTEVUVEVSIFFBRiAqLworI2RlZmluZSBYS19BcmFiaWNfa2FmICAgICAgICAgICAgICAgICAgICAweDA1ZTMgIC8qIFUrMDY0MyBBUkFCSUMgTEVUVEVSIEtBRiAqLworI2RlZmluZSBYS19BcmFiaWNfbGFtICAgICAgICAgICAgICAgICAgICAweDA1ZTQgIC8qIFUrMDY0NCBBUkFCSUMgTEVUVEVSIExBTSAqLworI2RlZmluZSBYS19BcmFiaWNfbWVlbSAgICAgICAgICAgICAgICAgICAweDA1ZTUgIC8qIFUrMDY0NSBBUkFCSUMgTEVUVEVSIE1FRU0gKi8KKyNkZWZpbmUgWEtfQXJhYmljX25vb24gICAgICAgICAgICAgICAgICAgMHgwNWU2ICAvKiBVKzA2NDYgQVJBQklDIExFVFRFUiBOT09OICovCisjZGVmaW5lIFhLX0FyYWJpY19oYSAgICAgICAgICAgICAgICAgICAgIDB4MDVlNyAgLyogVSswNjQ3IEFSQUJJQyBMRVRURVIgSEVIICovCisjZGVmaW5lIFhLX0FyYWJpY19oZWggICAgICAgICAgICAgICAgICAgIDB4MDVlNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19BcmFiaWNfd2F3ICAgICAgICAgICAgICAgICAgICAweDA1ZTggIC8qIFUrMDY0OCBBUkFCSUMgTEVUVEVSIFdBVyAqLworI2RlZmluZSBYS19BcmFiaWNfYWxlZm1ha3N1cmEgICAgICAgICAgICAweDA1ZTkgIC8qIFUrMDY0OSBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSAqLworI2RlZmluZSBYS19BcmFiaWNfeWVoICAgICAgICAgICAgICAgICAgICAweDA1ZWEgIC8qIFUrMDY0QSBBUkFCSUMgTEVUVEVSIFlFSCAqLworI2RlZmluZSBYS19BcmFiaWNfZmF0aGF0YW4gICAgICAgICAgICAgICAweDA1ZWIgIC8qIFUrMDY0QiBBUkFCSUMgRkFUSEFUQU4gKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RhbW1hdGFuICAgICAgICAgICAgICAgMHgwNWVjICAvKiBVKzA2NEMgQVJBQklDIERBTU1BVEFOICovCisjZGVmaW5lIFhLX0FyYWJpY19rYXNyYXRhbiAgICAgICAgICAgICAgIDB4MDVlZCAgLyogVSswNjREIEFSQUJJQyBLQVNSQVRBTiAqLworI2RlZmluZSBYS19BcmFiaWNfZmF0aGEgICAgICAgICAgICAgICAgICAweDA1ZWUgIC8qIFUrMDY0RSBBUkFCSUMgRkFUSEEgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2RhbW1hICAgICAgICAgICAgICAgICAgMHgwNWVmICAvKiBVKzA2NEYgQVJBQklDIERBTU1BICovCisjZGVmaW5lIFhLX0FyYWJpY19rYXNyYSAgICAgICAgICAgICAgICAgIDB4MDVmMCAgLyogVSswNjUwIEFSQUJJQyBLQVNSQSAqLworI2RlZmluZSBYS19BcmFiaWNfc2hhZGRhICAgICAgICAgICAgICAgICAweDA1ZjEgIC8qIFUrMDY1MSBBUkFCSUMgU0hBRERBICovCisjZGVmaW5lIFhLX0FyYWJpY19zdWt1biAgICAgICAgICAgICAgICAgIDB4MDVmMiAgLyogVSswNjUyIEFSQUJJQyBTVUtVTiAqLworI2RlZmluZSBYS19BcmFiaWNfbWFkZGFfYWJvdmUgICAgICAgICAweDEwMDA2NTMgIC8qIFUrMDY1MyBBUkFCSUMgTUFEREFIIEFCT1ZFICovCisjZGVmaW5lIFhLX0FyYWJpY19oYW16YV9hYm92ZSAgICAgICAgIDB4MTAwMDY1NCAgLyogVSswNjU0IEFSQUJJQyBIQU1aQSBBQk9WRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGFtemFfYmVsb3cgICAgICAgICAweDEwMDA2NTUgIC8qIFUrMDY1NSBBUkFCSUMgSEFNWkEgQkVMT1cgKi8KKyNkZWZpbmUgWEtfQXJhYmljX2plaCAgICAgICAgICAgICAgICAgMHgxMDAwNjk4ICAvKiBVKzA2OTggQVJBQklDIExFVFRFUiBKRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX3ZlaCAgICAgICAgICAgICAgICAgMHgxMDAwNmE0ICAvKiBVKzA2QTQgQVJBQklDIExFVFRFUiBWRUggKi8KKyNkZWZpbmUgWEtfQXJhYmljX2tlaGVoICAgICAgICAgICAgICAgMHgxMDAwNmE5ICAvKiBVKzA2QTkgQVJBQklDIExFVFRFUiBLRUhFSCAqLworI2RlZmluZSBYS19BcmFiaWNfZ2FmICAgICAgICAgICAgICAgICAweDEwMDA2YWYgIC8qIFUrMDZBRiBBUkFCSUMgTEVUVEVSIEdBRiAqLworI2RlZmluZSBYS19BcmFiaWNfbm9vbl9naHVubmEgICAgICAgICAweDEwMDA2YmEgIC8qIFUrMDZCQSBBUkFCSUMgTEVUVEVSIE5PT04gR0hVTk5BICovCisjZGVmaW5lIFhLX0FyYWJpY19oZWhfZG9hY2hhc2htZWUgICAgIDB4MTAwMDZiZSAgLyogVSswNkJFIEFSQUJJQyBMRVRURVIgSEVIIERPQUNIQVNITUVFICovCisjZGVmaW5lIFhLX0ZhcnNpX3llaCAgICAgICAgICAgICAgICAgIDB4MTAwMDZjYyAgLyogVSswNkNDIEFSQUJJQyBMRVRURVIgRkFSU0kgWUVIICovCisjZGVmaW5lIFhLX0FyYWJpY19mYXJzaV95ZWggICAgICAgICAgIDB4MTAwMDZjYyAgLyogVSswNkNDIEFSQUJJQyBMRVRURVIgRkFSU0kgWUVIICovCisjZGVmaW5lIFhLX0FyYWJpY195ZWhfYmFyZWUgICAgICAgICAgIDB4MTAwMDZkMiAgLyogVSswNkQyIEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRSAqLworI2RlZmluZSBYS19BcmFiaWNfaGVoX2dvYWwgICAgICAgICAgICAweDEwMDA2YzEgIC8qIFUrMDZDMSBBUkFCSUMgTEVUVEVSIEhFSCBHT0FMICovCisjZGVmaW5lIFhLX0FyYWJpY19zd2l0Y2ggICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisjZW5kaWYgLyogWEtfQVJBQklDICovCisKKy8qCisgKiBDeXJpbGxpYworICogQnl0ZSAzID0gNgorICovCisjaWZkZWYgWEtfQ1lSSUxMSUMKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfR0hFX2JhciAgICAgICAgICAgMHgxMDAwNDkyICAvKiBVKzA0OTIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2doZV9iYXIgICAgICAgICAgIDB4MTAwMDQ5MyAgLyogVSswNDkzIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUgV0lUSCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWkhFX2Rlc2NlbmRlciAgICAgMHgxMDAwNDk2ICAvKiBVKzA0OTYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3poZV9kZXNjZW5kZXIgICAgIDB4MTAwMDQ5NyAgLyogVSswNDk3IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfS0FfZGVzY2VuZGVyICAgICAgMHgxMDAwNDlhICAvKiBVKzA0OUEgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfa2FfZGVzY2VuZGVyICAgICAgMHgxMDAwNDliICAvKiBVKzA0OUIgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0tBX3ZlcnRzdHJva2UgICAgIDB4MTAwMDQ5YyAgLyogVSswNDlDIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBIFdJVEggVkVSVElDQUwgU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2thX3ZlcnRzdHJva2UgICAgIDB4MTAwMDQ5ZCAgLyogVSswNDlEIENZUklMTElDIFNNQUxMIExFVFRFUiBLQSBXSVRIIFZFUlRJQ0FMIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTl9kZXNjZW5kZXIgICAgICAweDEwMDA0YTIgIC8qIFUrMDRBMiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTiBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19lbl9kZXNjZW5kZXIgICAgICAweDEwMDA0YTMgIC8qIFUrMDRBMyBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4gV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfVV9zdHJhaWdodCAgICAgICAgMHgxMDAwNGFlICAvKiBVKzA0QUUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU1RSQUlHSFQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY191X3N0cmFpZ2h0ICAgICAgICAweDEwMDA0YWYgIC8qIFUrMDRBRiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU1RSQUlHSFQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19VX3N0cmFpZ2h0X2JhciAgICAweDEwMDA0YjAgIC8qIFUrMDRCMCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTVFJBSUdIVCBVIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3Vfc3RyYWlnaHRfYmFyICAgIDB4MTAwMDRiMSAgLyogVSswNEIxIENZUklMTElDIFNNQUxMIExFVFRFUiBTVFJBSUdIVCBVIFdJVEggU1RST0tFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0hBX2Rlc2NlbmRlciAgICAgIDB4MTAwMDRiMiAgLyogVSswNEIyIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBIFdJVEggREVTQ0VOREVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2hhX2Rlc2NlbmRlciAgICAgIDB4MTAwMDRiMyAgLyogVSswNEIzIENZUklMTElDIFNNQUxMIExFVFRFUiBIQSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19DSEVfZGVzY2VuZGVyICAgICAweDEwMDA0YjYgIC8qIFUrMDRCNiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgV0lUSCBERVNDRU5ERVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfY2hlX2Rlc2NlbmRlciAgICAgMHgxMDAwNGI3ICAvKiBVKzA0QjcgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSBXSVRIIERFU0NFTkRFUiAqLworI2RlZmluZSBYS19DeXJpbGxpY19DSEVfdmVydHN0cm9rZSAgICAweDEwMDA0YjggIC8qIFUrMDRCOCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgV0lUSCBWRVJUSUNBTCBTVFJPS0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfY2hlX3ZlcnRzdHJva2UgICAgMHgxMDAwNGI5ICAvKiBVKzA0QjkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSBXSVRIIFZFUlRJQ0FMIFNUUk9LRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19TSEhBICAgICAgICAgICAgICAweDEwMDA0YmEgIC8qIFUrMDRCQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEhBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3NoaGEgICAgICAgICAgICAgIDB4MTAwMDRiYiAgLyogVSswNEJCIENZUklMTElDIFNNQUxMIExFVFRFUiBTSEhBICovCisKKyNkZWZpbmUgWEtfQ3lyaWxsaWNfU0NIV0EgICAgICAgICAgICAgMHgxMDAwNGQ4ICAvKiBVKzA0RDggQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0NIV0EgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfc2Nod2EgICAgICAgICAgICAgMHgxMDAwNGQ5ICAvKiBVKzA0RDkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNDSFdBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0lfbWFjcm9uICAgICAgICAgIDB4MTAwMDRlMiAgLyogVSswNEUyIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaV9tYWNyb24gICAgICAgICAgMHgxMDAwNGUzICAvKiBVKzA0RTMgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfT19iYXIgICAgICAgICAgICAgMHgxMDAwNGU4ICAvKiBVKzA0RTggQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkFSUkVEIE8gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfb19iYXIgICAgICAgICAgICAgMHgxMDAwNGU5ICAvKiBVKzA0RTkgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJBUlJFRCBPICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1VfbWFjcm9uICAgICAgICAgIDB4MTAwMDRlZSAgLyogVSswNEVFIENZUklMTElDIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfdV9tYWNyb24gICAgICAgICAgMHgxMDAwNGVmICAvKiBVKzA0RUYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04gKi8KKworI2RlZmluZSBYS19TZXJiaWFuX2RqZSAgICAgICAgICAgICAgICAgICAweDA2YTEgIC8qIFUrMDQ1MiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9namUgICAgICAgICAgICAgICAgIDB4MDZhMiAgLyogVSswNDUzIENZUklMTElDIFNNQUxMIExFVFRFUiBHSkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaW8gICAgICAgICAgICAgICAgICAgMHgwNmEzICAvKiBVKzA0NTEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9pZSAgICAgICAgICAgICAgICAgIDB4MDZhNCAgLyogVSswNDU0IENZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gSUUgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5famUgICAgICAgICAgICAgICAgICAgMHgwNmE0ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9kc2UgICAgICAgICAgICAgICAgIDB4MDZhNSAgLyogVSswNDU1IENZUklMTElDIFNNQUxMIExFVFRFUiBEWkUgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX2kgICAgICAgICAgICAgICAgICAgMHgwNmE2ICAvKiBVKzA0NTYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSSAqLworI2RlZmluZSBYS19Va3Jhbmlhbl9pICAgICAgICAgICAgICAgICAgICAweDA2YTYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX3lpICAgICAgICAgICAgICAgICAgMHgwNmE3ICAvKiBVKzA0NTcgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX3lpICAgICAgICAgICAgICAgICAgIDB4MDZhNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19qZSAgICAgICAgICAgICAgICAgICAweDA2YTggIC8qIFUrMDQ1OCBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9qZSAgICAgICAgICAgICAgICAgICAgMHgwNmE4ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2xqZSAgICAgICAgICAgICAgICAgIDB4MDZhOSAgLyogVSswNDU5IENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9samUgICAgICAgICAgICAgICAgICAgMHgwNmE5ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX25qZSAgICAgICAgICAgICAgICAgIDB4MDZhYSAgLyogVSswNDVBIENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9uamUgICAgICAgICAgICAgICAgICAgMHgwNmFhICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1NlcmJpYW5fdHNoZSAgICAgICAgICAgICAgICAgIDB4MDZhYiAgLyogVSswNDVCIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9ramUgICAgICAgICAgICAgICAgIDB4MDZhYyAgLyogVSswNDVDIENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUgKi8KKyNkZWZpbmUgWEtfVWtyYWluaWFuX2doZV93aXRoX3VwdHVybiAgICAgMHgwNmFkICAvKiBVKzA0OTEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTiAqLworI2RlZmluZSBYS19CeWVsb3J1c3NpYW5fc2hvcnR1ICAgICAgICAgICAweDA2YWUgIC8qIFUrMDQ1RSBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19kemhlICAgICAgICAgICAgICAgICAweDA2YWYgIC8qIFUrMDQ1RiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRSAqLworI2RlZmluZSBYS19TZXJiaWFuX2R6ZSAgICAgICAgICAgICAgICAgICAweDA2YWYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfbnVtZXJvc2lnbiAgICAgICAgICAgICAgICAgICAgMHgwNmIwICAvKiBVKzIxMTYgTlVNRVJPIFNJR04gKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9ESkUgICAgICAgICAgICAgICAgICAgMHgwNmIxICAvKiBVKzA0MDIgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREpFICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9HSkUgICAgICAgICAgICAgICAgIDB4MDZiMiAgLyogVSswNDAzIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19JTyAgICAgICAgICAgICAgICAgICAweDA2YjMgIC8qIFUrMDQwMSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTyAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fSUUgICAgICAgICAgICAgICAgICAweDA2YjQgIC8qIFUrMDQwNCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5fSkUgICAgICAgICAgICAgICAgICAgMHgwNmI0ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX01hY2Vkb25pYV9EU0UgICAgICAgICAgICAgICAgIDB4MDZiNSAgLyogVSswNDA1IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRSAqLworI2RlZmluZSBYS19Va3JhaW5pYW5fSSAgICAgICAgICAgICAgICAgICAweDA2YjYgIC8qIFUrMDQwNiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkgKi8KKyNkZWZpbmUgWEtfVWtyYW5pYW5fSSAgICAgICAgICAgICAgICAgICAgMHgwNmI2ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9ZSSAgICAgICAgICAgICAgICAgIDB4MDZiNyAgLyogVSswNDA3IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJICovCisjZGVmaW5lIFhLX1VrcmFuaWFuX1lJICAgICAgICAgICAgICAgICAgIDB4MDZiNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19KRSAgICAgICAgICAgICAgICAgICAweDA2YjggIC8qIFUrMDQwOCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRSAqLworI2RlZmluZSBYS19TZXJiaWFuX0pFICAgICAgICAgICAgICAgICAgICAweDA2YjggIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfTEpFICAgICAgICAgICAgICAgICAgMHgwNmI5ICAvKiBVKzA0MDkgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTEpFICovCisjZGVmaW5lIFhLX1NlcmJpYW5fTEpFICAgICAgICAgICAgICAgICAgIDB4MDZiOSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19DeXJpbGxpY19OSkUgICAgICAgICAgICAgICAgICAweDA2YmEgIC8qIFUrMDQwQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBOSkUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9OSkUgICAgICAgICAgICAgICAgICAgMHgwNmJhICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX1NlcmJpYW5fVFNIRSAgICAgICAgICAgICAgICAgIDB4MDZiYiAgLyogVSswNDBCIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUgKi8KKyNkZWZpbmUgWEtfTWFjZWRvbmlhX0tKRSAgICAgICAgICAgICAgICAgMHgwNmJjICAvKiBVKzA0MEMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFICovCisjZGVmaW5lIFhLX1VrcmFpbmlhbl9HSEVfV0lUSF9VUFRVUk4gICAgIDB4MDZiZCAgLyogVSswNDkwIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTiAqLworI2RlZmluZSBYS19CeWVsb3J1c3NpYW5fU0hPUlRVICAgICAgICAgICAweDA2YmUgIC8qIFUrMDQwRSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0RaSEUgICAgICAgICAgICAgICAgIDB4MDZiZiAgLyogVSswNDBGIENZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUgKi8KKyNkZWZpbmUgWEtfU2VyYmlhbl9EWkUgICAgICAgICAgICAgICAgICAgMHgwNmJmICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3l1ICAgICAgICAgICAgICAgICAgIDB4MDZjMCAgLyogVSswNDRFIENZUklMTElDIFNNQUxMIExFVFRFUiBZVSAqLworI2RlZmluZSBYS19DeXJpbGxpY19hICAgICAgICAgICAgICAgICAgICAweDA2YzEgIC8qIFUrMDQzMCBDWVJJTExJQyBTTUFMTCBMRVRURVIgQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19iZSAgICAgICAgICAgICAgICAgICAweDA2YzIgIC8qIFUrMDQzMSBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfdHNlICAgICAgICAgICAgICAgICAgMHgwNmMzICAvKiBVKzA0NDYgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19kZSAgICAgICAgICAgICAgICAgICAweDA2YzQgIC8qIFUrMDQzNCBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfaWUgICAgICAgICAgICAgICAgICAgMHgwNmM1ICAvKiBVKzA0MzUgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2VmICAgICAgICAgICAgICAgICAgIDB4MDZjNiAgLyogVSswNDQ0IENZUklMTElDIFNNQUxMIExFVFRFUiBFRiAqLworI2RlZmluZSBYS19DeXJpbGxpY19naGUgICAgICAgICAgICAgICAgICAweDA2YzcgIC8qIFUrMDQzMyBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2hhICAgICAgICAgICAgICAgICAgIDB4MDZjOCAgLyogVSswNDQ1IENZUklMTElDIFNNQUxMIExFVFRFUiBIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19pICAgICAgICAgICAgICAgICAgICAweDA2YzkgIC8qIFUrMDQzOCBDWVJJTExJQyBTTUFMTCBMRVRURVIgSSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zaG9ydGkgICAgICAgICAgICAgICAweDA2Y2EgIC8qIFUrMDQzOSBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSSAqLworI2RlZmluZSBYS19DeXJpbGxpY19rYSAgICAgICAgICAgICAgICAgICAweDA2Y2IgIC8qIFUrMDQzQSBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZWwgICAgICAgICAgICAgICAgICAgMHgwNmNjICAvKiBVKzA0M0IgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2VtICAgICAgICAgICAgICAgICAgIDB4MDZjZCAgLyogVSswNDNDIENZUklMTElDIFNNQUxMIExFVFRFUiBFTSAqLworI2RlZmluZSBYS19DeXJpbGxpY19lbiAgICAgICAgICAgICAgICAgICAweDA2Y2UgIC8qIFUrMDQzRCBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfbyAgICAgICAgICAgICAgICAgICAgMHgwNmNmICAvKiBVKzA0M0UgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfcGUgICAgICAgICAgICAgICAgICAgMHgwNmQwICAvKiBVKzA0M0YgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3lhICAgICAgICAgICAgICAgICAgIDB4MDZkMSAgLyogVSswNDRGIENZUklMTElDIFNNQUxMIExFVFRFUiBZQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19lciAgICAgICAgICAgICAgICAgICAweDA2ZDIgIC8qIFUrMDQ0MCBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfZXMgICAgICAgICAgICAgICAgICAgMHgwNmQzICAvKiBVKzA0NDEgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3RlICAgICAgICAgICAgICAgICAgIDB4MDZkNCAgLyogVSswNDQyIENZUklMTElDIFNNQUxMIExFVFRFUiBURSAqLworI2RlZmluZSBYS19DeXJpbGxpY191ICAgICAgICAgICAgICAgICAgICAweDA2ZDUgIC8qIFUrMDQ0MyBDWVJJTExJQyBTTUFMTCBMRVRURVIgVSAqLworI2RlZmluZSBYS19DeXJpbGxpY196aGUgICAgICAgICAgICAgICAgICAweDA2ZDYgIC8qIFUrMDQzNiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3ZlICAgICAgICAgICAgICAgICAgIDB4MDZkNyAgLyogVSswNDMyIENZUklMTElDIFNNQUxMIExFVFRFUiBWRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zb2Z0c2lnbiAgICAgICAgICAgICAweDA2ZDggIC8qIFUrMDQ0QyBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3llcnUgICAgICAgICAgICAgICAgIDB4MDZkOSAgLyogVSswNDRCIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3plICAgICAgICAgICAgICAgICAgIDB4MDZkYSAgLyogVSswNDM3IENZUklMTElDIFNNQUxMIExFVFRFUiBaRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19zaGEgICAgICAgICAgICAgICAgICAweDA2ZGIgIC8qIFUrMDQ0OCBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2UgICAgICAgICAgICAgICAgICAgIDB4MDZkYyAgLyogVSswNDREIENZUklMTElDIFNNQUxMIExFVFRFUiBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX3NoY2hhICAgICAgICAgICAgICAgIDB4MDZkZCAgLyogVSswNDQ5IENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19jaGUgICAgICAgICAgICAgICAgICAweDA2ZGUgIC8qIFUrMDQ0NyBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX2hhcmRzaWduICAgICAgICAgICAgIDB4MDZkZiAgLyogVSswNDRBIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04gKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWVUgICAgICAgICAgICAgICAgICAgMHgwNmUwICAvKiBVKzA0MkUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfQSAgICAgICAgICAgICAgICAgICAgMHgwNmUxICAvKiBVKzA0MTAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19CRSAgICAgICAgICAgICAgICAgICAweDA2ZTIgIC8qIFUrMDQxMSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19UU0UgICAgICAgICAgICAgICAgICAweDA2ZTMgIC8qIFUrMDQyNiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfREUgICAgICAgICAgICAgICAgICAgMHgwNmU0ICAvKiBVKzA0MTQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfSUUgICAgICAgICAgICAgICAgICAgMHgwNmU1ICAvKiBVKzA0MTUgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfRUYgICAgICAgICAgICAgICAgICAgMHgwNmU2ICAvKiBVKzA0MjQgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfR0hFICAgICAgICAgICAgICAgICAgMHgwNmU3ICAvKiBVKzA0MTMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0hBICAgICAgICAgICAgICAgICAgIDB4MDZlOCAgLyogVSswNDI1IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0kgICAgICAgICAgICAgICAgICAgIDB4MDZlOSAgLyogVSswNDE4IENZUklMTElDIENBUElUQUwgTEVUVEVSIEkgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfU0hPUlRJICAgICAgICAgICAgICAgMHgwNmVhICAvKiBVKzA0MTkgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSSAqLworI2RlZmluZSBYS19DeXJpbGxpY19LQSAgICAgICAgICAgICAgICAgICAweDA2ZWIgIC8qIFUrMDQxQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTCAgICAgICAgICAgICAgICAgICAweDA2ZWMgIC8qIFUrMDQxQiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTCAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTSAgICAgICAgICAgICAgICAgICAweDA2ZWQgIC8qIFUrMDQxQyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FTiAgICAgICAgICAgICAgICAgICAweDA2ZWUgIC8qIFUrMDQxRCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTiAqLworI2RlZmluZSBYS19DeXJpbGxpY19PICAgICAgICAgICAgICAgICAgICAweDA2ZWYgIC8qIFUrMDQxRSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1BFICAgICAgICAgICAgICAgICAgIDB4MDZmMCAgLyogVSswNDFGIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1lBICAgICAgICAgICAgICAgICAgIDB4MDZmMSAgLyogVSswNDJGIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0VSICAgICAgICAgICAgICAgICAgIDB4MDZmMiAgLyogVSswNDIwIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0VTICAgICAgICAgICAgICAgICAgIDB4MDZmMyAgLyogVSswNDIxIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1RFICAgICAgICAgICAgICAgICAgIDB4MDZmNCAgLyogVSswNDIyIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1UgICAgICAgICAgICAgICAgICAgIDB4MDZmNSAgLyogVSswNDIzIENZUklMTElDIENBUElUQUwgTEVUVEVSIFUgKi8KKyNkZWZpbmUgWEtfQ3lyaWxsaWNfWkhFICAgICAgICAgICAgICAgICAgMHgwNmY2ICAvKiBVKzA0MTYgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1ZFICAgICAgICAgICAgICAgICAgIDB4MDZmNyAgLyogVSswNDEyIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NPRlRTSUdOICAgICAgICAgICAgIDB4MDZmOCAgLyogVSswNDJDIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTiAqLworI2RlZmluZSBYS19DeXJpbGxpY19ZRVJVICAgICAgICAgICAgICAgICAweDA2ZjkgIC8qIFUrMDQyQiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1pFICAgICAgICAgICAgICAgICAgIDB4MDZmYSAgLyogVSswNDE3IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NIQSAgICAgICAgICAgICAgICAgIDB4MDZmYiAgLyogVSswNDI4IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQSAqLworI2RlZmluZSBYS19DeXJpbGxpY19FICAgICAgICAgICAgICAgICAgICAweDA2ZmMgIC8qIFUrMDQyRCBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFICovCisjZGVmaW5lIFhLX0N5cmlsbGljX1NIQ0hBICAgICAgICAgICAgICAgIDB4MDZmZCAgLyogVSswNDI5IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBICovCisjZGVmaW5lIFhLX0N5cmlsbGljX0NIRSAgICAgICAgICAgICAgICAgIDB4MDZmZSAgLyogVSswNDI3IENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRSAqLworI2RlZmluZSBYS19DeXJpbGxpY19IQVJEU0lHTiAgICAgICAgICAgICAweDA2ZmYgIC8qIFUrMDQyQSBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04gKi8KKyNlbmRpZiAvKiBYS19DWVJJTExJQyAqLworCisvKgorICogR3JlZWsKKyAqIChiYXNlZCBvbiBhbiBlYXJseSBkcmFmdCBvZiwgYW5kIG5vdCBxdWl0ZSBpZGVudGljYWwgdG8sIElTTy9JRUMgODg1OS03KQorICogQnl0ZSAzID0gNworICovCisKKyNpZmRlZiBYS19HUkVFSworI2RlZmluZSBYS19HcmVla19BTFBIQWFjY2VudCAgICAgICAgICAgICAweDA3YTEgIC8qIFUrMDM4NiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX0VQU0lMT05hY2NlbnQgICAgICAgICAgIDB4MDdhMiAgLyogVSswMzg4IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19FVEFhY2NlbnQgICAgICAgICAgICAgICAweDA3YTMgIC8qIFUrMDM4OSBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19JT1RBYWNjZW50ICAgICAgICAgICAgICAweDA3YTQgIC8qIFUrMDM4QSBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfSU9UQWRpZXJlc2lzICAgICAgICAgICAgMHgwN2E1ICAvKiBVKzAzQUEgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSAqLworI2RlZmluZSBYS19HcmVla19JT1RBZGlhZXJlc2lzICAgICAgICAgICAweDA3YTUgIC8qIG9sZCB0eXBvICovCisjZGVmaW5lIFhLX0dyZWVrX09NSUNST05hY2NlbnQgICAgICAgICAgIDB4MDdhNyAgLyogVSswMzhDIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19VUFNJTE9OYWNjZW50ICAgICAgICAgICAweDA3YTggIC8qIFUrMDM4RSBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfVVBTSUxPTmRpZXJlc2lzICAgICAgICAgMHgwN2E5ICAvKiBVKzAzQUIgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSAqLworI2RlZmluZSBYS19HcmVla19PTUVHQWFjY2VudCAgICAgICAgICAgICAweDA3YWIgIC8qIFUrMDM4RiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX2FjY2VudGRpZXJlc2lzICAgICAgICAgIDB4MDdhZSAgLyogVSswMzg1IEdSRUVLIERJQUxZVElLQSBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19ob3JpemJhciAgICAgICAgICAgICAgICAweDA3YWYgIC8qIFUrMjAxNSBIT1JJWk9OVEFMIEJBUiAqLworI2RlZmluZSBYS19HcmVla19hbHBoYWFjY2VudCAgICAgICAgICAgICAweDA3YjEgIC8qIFUrMDNBQyBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19lcHNpbG9uYWNjZW50ICAgICAgICAgICAweDA3YjIgIC8qIFUrMDNBRCBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX2V0YWFjY2VudCAgICAgICAgICAgICAgIDB4MDdiMyAgLyogVSswM0FFIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19pb3RhYWNjZW50ICAgICAgICAgICAgICAweDA3YjQgIC8qIFUrMDNBRiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX2lvdGFkaWVyZXNpcyAgICAgICAgICAgIDB4MDdiNSAgLyogVSswM0NBIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBICovCisjZGVmaW5lIFhLX0dyZWVrX2lvdGFhY2NlbnRkaWVyZXNpcyAgICAgIDB4MDdiNiAgLyogVSswMzkwIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUyAqLworI2RlZmluZSBYS19HcmVla19vbWljcm9uYWNjZW50ICAgICAgICAgICAweDA3YjcgIC8qIFUrMDNDQyBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX3Vwc2lsb25hY2NlbnQgICAgICAgICAgIDB4MDdiOCAgLyogVSswM0NEIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdXBzaWxvbmRpZXJlc2lzICAgICAgICAgMHgwN2I5ICAvKiBVKzAzQ0IgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdXBzaWxvbmFjY2VudGRpZXJlc2lzICAgMHgwN2JhICAvKiBVKzAzQjAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX29tZWdhYWNjZW50ICAgICAgICAgICAgIDB4MDdiYiAgLyogVSswM0NFIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TICovCisjZGVmaW5lIFhLX0dyZWVrX0FMUEhBICAgICAgICAgICAgICAgICAgIDB4MDdjMSAgLyogVSswMzkxIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBICovCisjZGVmaW5lIFhLX0dyZWVrX0JFVEEgICAgICAgICAgICAgICAgICAgIDB4MDdjMiAgLyogVSswMzkyIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfR0FNTUEgICAgICAgICAgICAgICAgICAgMHgwN2MzICAvKiBVKzAzOTMgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfREVMVEEgICAgICAgICAgICAgICAgICAgMHgwN2M0ICAvKiBVKzAzOTQgR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfRVBTSUxPTiAgICAgICAgICAgICAgICAgMHgwN2M1ICAvKiBVKzAzOTUgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiAqLworI2RlZmluZSBYS19HcmVla19aRVRBICAgICAgICAgICAgICAgICAgICAweDA3YzYgIC8qIFUrMDM5NiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX0VUQSAgICAgICAgICAgICAgICAgICAgIDB4MDdjNyAgLyogVSswMzk3IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQSAqLworI2RlZmluZSBYS19HcmVla19USEVUQSAgICAgICAgICAgICAgICAgICAweDA3YzggIC8qIFUrMDM5OCBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQSAqLworI2RlZmluZSBYS19HcmVla19JT1RBICAgICAgICAgICAgICAgICAgICAweDA3YzkgIC8qIFUrMDM5OSBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBICovCisjZGVmaW5lIFhLX0dyZWVrX0tBUFBBICAgICAgICAgICAgICAgICAgIDB4MDdjYSAgLyogVSswMzlBIEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBICovCisjZGVmaW5lIFhLX0dyZWVrX0xBTURBICAgICAgICAgICAgICAgICAgIDB4MDdjYiAgLyogVSswMzlCIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX0xBTUJEQSAgICAgICAgICAgICAgICAgIDB4MDdjYiAgLyogVSswMzlCIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX01VICAgICAgICAgICAgICAgICAgICAgIDB4MDdjYyAgLyogVSswMzlDIEdSRUVLIENBUElUQUwgTEVUVEVSIE1VICovCisjZGVmaW5lIFhLX0dyZWVrX05VICAgICAgICAgICAgICAgICAgICAgIDB4MDdjZCAgLyogVSswMzlEIEdSRUVLIENBUElUQUwgTEVUVEVSIE5VICovCisjZGVmaW5lIFhLX0dyZWVrX1hJICAgICAgICAgICAgICAgICAgICAgIDB4MDdjZSAgLyogVSswMzlFIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJICovCisjZGVmaW5lIFhLX0dyZWVrX09NSUNST04gICAgICAgICAgICAgICAgIDB4MDdjZiAgLyogVSswMzlGIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gKi8KKyNkZWZpbmUgWEtfR3JlZWtfUEkgICAgICAgICAgICAgICAgICAgICAgMHgwN2QwICAvKiBVKzAzQTAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfUkhPICAgICAgICAgICAgICAgICAgICAgMHgwN2QxICAvKiBVKzAzQTEgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPICovCisjZGVmaW5lIFhLX0dyZWVrX1NJR01BICAgICAgICAgICAgICAgICAgIDB4MDdkMiAgLyogVSswM0EzIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BICovCisjZGVmaW5lIFhLX0dyZWVrX1RBVSAgICAgICAgICAgICAgICAgICAgIDB4MDdkNCAgLyogVSswM0E0IEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVSAqLworI2RlZmluZSBYS19HcmVla19VUFNJTE9OICAgICAgICAgICAgICAgICAweDA3ZDUgIC8qIFUrMDNBNSBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OICovCisjZGVmaW5lIFhLX0dyZWVrX1BISSAgICAgICAgICAgICAgICAgICAgIDB4MDdkNiAgLyogVSswM0E2IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISSAqLworI2RlZmluZSBYS19HcmVla19DSEkgICAgICAgICAgICAgICAgICAgICAweDA3ZDcgIC8qIFUrMDNBNyBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfUFNJICAgICAgICAgICAgICAgICAgICAgMHgwN2Q4ICAvKiBVKzAzQTggR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJICovCisjZGVmaW5lIFhLX0dyZWVrX09NRUdBICAgICAgICAgICAgICAgICAgIDB4MDdkOSAgLyogVSswM0E5IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBICovCisjZGVmaW5lIFhLX0dyZWVrX2FscGhhICAgICAgICAgICAgICAgICAgIDB4MDdlMSAgLyogVSswM0IxIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSAqLworI2RlZmluZSBYS19HcmVla19iZXRhICAgICAgICAgICAgICAgICAgICAweDA3ZTIgIC8qIFUrMDNCMiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQSAqLworI2RlZmluZSBYS19HcmVla19nYW1tYSAgICAgICAgICAgICAgICAgICAweDA3ZTMgIC8qIFUrMDNCMyBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfZGVsdGEgICAgICAgICAgICAgICAgICAgMHgwN2U0ICAvKiBVKzAzQjQgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBICovCisjZGVmaW5lIFhLX0dyZWVrX2Vwc2lsb24gICAgICAgICAgICAgICAgIDB4MDdlNSAgLyogVSswM0I1IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OICovCisjZGVmaW5lIFhLX0dyZWVrX3pldGEgICAgICAgICAgICAgICAgICAgIDB4MDdlNiAgLyogVSswM0I2IEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX2V0YSAgICAgICAgICAgICAgICAgICAgIDB4MDdlNyAgLyogVSswM0I3IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdGhldGEgICAgICAgICAgICAgICAgICAgMHgwN2U4ICAvKiBVKzAzQjggR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBICovCisjZGVmaW5lIFhLX0dyZWVrX2lvdGEgICAgICAgICAgICAgICAgICAgIDB4MDdlOSAgLyogVSswM0I5IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBICovCisjZGVmaW5lIFhLX0dyZWVrX2thcHBhICAgICAgICAgICAgICAgICAgIDB4MDdlYSAgLyogVSswM0JBIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQSAqLworI2RlZmluZSBYS19HcmVla19sYW1kYSAgICAgICAgICAgICAgICAgICAweDA3ZWIgIC8qIFUrMDNCQiBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfbGFtYmRhICAgICAgICAgICAgICAgICAgMHgwN2ViICAvKiBVKzAzQkIgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBICovCisjZGVmaW5lIFhLX0dyZWVrX211ICAgICAgICAgICAgICAgICAgICAgIDB4MDdlYyAgLyogVSswM0JDIEdSRUVLIFNNQUxMIExFVFRFUiBNVSAqLworI2RlZmluZSBYS19HcmVla19udSAgICAgICAgICAgICAgICAgICAgICAweDA3ZWQgIC8qIFUrMDNCRCBHUkVFSyBTTUFMTCBMRVRURVIgTlUgKi8KKyNkZWZpbmUgWEtfR3JlZWtfeGkgICAgICAgICAgICAgICAgICAgICAgMHgwN2VlICAvKiBVKzAzQkUgR1JFRUsgU01BTEwgTEVUVEVSIFhJICovCisjZGVmaW5lIFhLX0dyZWVrX29taWNyb24gICAgICAgICAgICAgICAgIDB4MDdlZiAgLyogVSswM0JGIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OICovCisjZGVmaW5lIFhLX0dyZWVrX3BpICAgICAgICAgICAgICAgICAgICAgIDB4MDdmMCAgLyogVSswM0MwIEdSRUVLIFNNQUxMIExFVFRFUiBQSSAqLworI2RlZmluZSBYS19HcmVla19yaG8gICAgICAgICAgICAgICAgICAgICAweDA3ZjEgIC8qIFUrMDNDMSBHUkVFSyBTTUFMTCBMRVRURVIgUkhPICovCisjZGVmaW5lIFhLX0dyZWVrX3NpZ21hICAgICAgICAgICAgICAgICAgIDB4MDdmMiAgLyogVSswM0MzIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQSAqLworI2RlZmluZSBYS19HcmVla19maW5hbHNtYWxsc2lnbWEgICAgICAgICAweDA3ZjMgIC8qIFUrMDNDMiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEgKi8KKyNkZWZpbmUgWEtfR3JlZWtfdGF1ICAgICAgICAgICAgICAgICAgICAgMHgwN2Y0ICAvKiBVKzAzQzQgR1JFRUsgU01BTEwgTEVUVEVSIFRBVSAqLworI2RlZmluZSBYS19HcmVla191cHNpbG9uICAgICAgICAgICAgICAgICAweDA3ZjUgIC8qIFUrMDNDNSBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiAqLworI2RlZmluZSBYS19HcmVla19waGkgICAgICAgICAgICAgICAgICAgICAweDA3ZjYgIC8qIFUrMDNDNiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJICovCisjZGVmaW5lIFhLX0dyZWVrX2NoaSAgICAgICAgICAgICAgICAgICAgIDB4MDdmNyAgLyogVSswM0M3IEdSRUVLIFNNQUxMIExFVFRFUiBDSEkgKi8KKyNkZWZpbmUgWEtfR3JlZWtfcHNpICAgICAgICAgICAgICAgICAgICAgMHgwN2Y4ICAvKiBVKzAzQzggR1JFRUsgU01BTEwgTEVUVEVSIFBTSSAqLworI2RlZmluZSBYS19HcmVla19vbWVnYSAgICAgICAgICAgICAgICAgICAweDA3ZjkgIC8qIFUrMDNDOSBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgKi8KKyNkZWZpbmUgWEtfR3JlZWtfc3dpdGNoICAgICAgICAgICAgICAgICAgMHhmZjdlICAvKiBBbGlhcyBmb3IgbW9kZV9zd2l0Y2ggKi8KKyNlbmRpZiAvKiBYS19HUkVFSyAqLworCisvKgorICogVGVjaG5pY2FsCisgKiAoZnJvbSB0aGUgREVDIFZUMzMwL1ZUNDIwIFRlY2huaWNhbCBDaGFyYWN0ZXIgU2V0LCBodHRwOi8vdnQxMDAubmV0L2NoYXJzZXRzL3RlY2huaWNhbC5odG1sKQorICogQnl0ZSAzID0gOAorICovCisKKyNpZmRlZiBYS19URUNITklDQUwKKyNkZWZpbmUgWEtfbGVmdHJhZGljYWwgICAgICAgICAgICAgICAgICAgMHgwOGExICAvKiBVKzIzQjcgUkFESUNBTCBTWU1CT0wgQk9UVE9NICovCisjZGVmaW5lIFhLX3RvcGxlZnRyYWRpY2FsICAgICAgICAgICAgICAgIDB4MDhhMiAgLyooVSsyNTBDIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVCkqLworI2RlZmluZSBYS19ob3JpemNvbm5lY3RvciAgICAgICAgICAgICAgICAweDA4YTMgIC8qKFUrMjUwMCBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTCkqLworI2RlZmluZSBYS190b3BpbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAweDA4YTQgIC8qIFUrMjMyMCBUT1AgSEFMRiBJTlRFR1JBTCAqLworI2RlZmluZSBYS19ib3RpbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAweDA4YTUgIC8qIFUrMjMyMSBCT1RUT00gSEFMRiBJTlRFR1JBTCAqLworI2RlZmluZSBYS192ZXJ0Y29ubmVjdG9yICAgICAgICAgICAgICAgICAweDA4YTYgIC8qKFUrMjUwMiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwpKi8KKyNkZWZpbmUgWEtfdG9wbGVmdHNxYnJhY2tldCAgICAgICAgICAgICAgMHgwOGE3ICAvKiBVKzIzQTEgTEVGVCBTUVVBUkUgQlJBQ0tFVCBVUFBFUiBDT1JORVIgKi8KKyNkZWZpbmUgWEtfYm90bGVmdHNxYnJhY2tldCAgICAgICAgICAgICAgMHgwOGE4ICAvKiBVKzIzQTMgTEVGVCBTUVVBUkUgQlJBQ0tFVCBMT1dFUiBDT1JORVIgKi8KKyNkZWZpbmUgWEtfdG9wcmlnaHRzcWJyYWNrZXQgICAgICAgICAgICAgMHgwOGE5ICAvKiBVKzIzQTQgUklHSFQgU1FVQVJFIEJSQUNLRVQgVVBQRVIgQ09STkVSICovCisjZGVmaW5lIFhLX2JvdHJpZ2h0c3FicmFja2V0ICAgICAgICAgICAgIDB4MDhhYSAgLyogVSsyM0E2IFJJR0hUIFNRVUFSRSBCUkFDS0VUIExPV0VSIENPUk5FUiAqLworI2RlZmluZSBYS190b3BsZWZ0cGFyZW5zICAgICAgICAgICAgICAgICAweDA4YWIgIC8qIFUrMjM5QiBMRUZUIFBBUkVOVEhFU0lTIFVQUEVSIEhPT0sgKi8KKyNkZWZpbmUgWEtfYm90bGVmdHBhcmVucyAgICAgICAgICAgICAgICAgMHgwOGFjICAvKiBVKzIzOUQgTEVGVCBQQVJFTlRIRVNJUyBMT1dFUiBIT09LICovCisjZGVmaW5lIFhLX3RvcHJpZ2h0cGFyZW5zICAgICAgICAgICAgICAgIDB4MDhhZCAgLyogVSsyMzlFIFJJR0hUIFBBUkVOVEhFU0lTIFVQUEVSIEhPT0sgKi8KKyNkZWZpbmUgWEtfYm90cmlnaHRwYXJlbnMgICAgICAgICAgICAgICAgMHgwOGFlICAvKiBVKzIzQTAgUklHSFQgUEFSRU5USEVTSVMgTE9XRVIgSE9PSyAqLworI2RlZmluZSBYS19sZWZ0bWlkZGxlY3VybHlicmFjZSAgICAgICAgICAweDA4YWYgIC8qIFUrMjNBOCBMRUZUIENVUkxZIEJSQUNLRVQgTUlERExFIFBJRUNFICovCisjZGVmaW5lIFhLX3JpZ2h0bWlkZGxlY3VybHlicmFjZSAgICAgICAgIDB4MDhiMCAgLyogVSsyM0FDIFJJR0hUIENVUkxZIEJSQUNLRVQgTUlERExFIFBJRUNFICovCisjZGVmaW5lIFhLX3RvcGxlZnRzdW1tYXRpb24gICAgICAgICAgICAgIDB4MDhiMQorI2RlZmluZSBYS19ib3RsZWZ0c3VtbWF0aW9uICAgICAgICAgICAgICAweDA4YjIKKyNkZWZpbmUgWEtfdG9wdmVydHN1bW1hdGlvbmNvbm5lY3RvciAgICAgMHgwOGIzCisjZGVmaW5lIFhLX2JvdHZlcnRzdW1tYXRpb25jb25uZWN0b3IgICAgIDB4MDhiNAorI2RlZmluZSBYS190b3ByaWdodHN1bW1hdGlvbiAgICAgICAgICAgICAweDA4YjUKKyNkZWZpbmUgWEtfYm90cmlnaHRzdW1tYXRpb24gICAgICAgICAgICAgMHgwOGI2CisjZGVmaW5lIFhLX3JpZ2h0bWlkZGxlc3VtbWF0aW9uICAgICAgICAgIDB4MDhiNworI2RlZmluZSBYS19sZXNzdGhhbmVxdWFsICAgICAgICAgICAgICAgICAweDA4YmMgIC8qIFUrMjI2NCBMRVNTLVRIQU4gT1IgRVFVQUwgVE8gKi8KKyNkZWZpbmUgWEtfbm90ZXF1YWwgICAgICAgICAgICAgICAgICAgICAgMHgwOGJkICAvKiBVKzIyNjAgTk9UIEVRVUFMIFRPICovCisjZGVmaW5lIFhLX2dyZWF0ZXJ0aGFuZXF1YWwgICAgICAgICAgICAgIDB4MDhiZSAgLyogVSsyMjY1IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTyAqLworI2RlZmluZSBYS19pbnRlZ3JhbCAgICAgICAgICAgICAgICAgICAgICAweDA4YmYgIC8qIFUrMjIyQiBJTlRFR1JBTCAqLworI2RlZmluZSBYS190aGVyZWZvcmUgICAgICAgICAgICAgICAgICAgICAweDA4YzAgIC8qIFUrMjIzNCBUSEVSRUZPUkUgKi8KKyNkZWZpbmUgWEtfdmFyaWF0aW9uICAgICAgICAgICAgICAgICAgICAgMHgwOGMxICAvKiBVKzIyMUQgUFJPUE9SVElPTkFMIFRPICovCisjZGVmaW5lIFhLX2luZmluaXR5ICAgICAgICAgICAgICAgICAgICAgIDB4MDhjMiAgLyogVSsyMjFFIElORklOSVRZICovCisjZGVmaW5lIFhLX25hYmxhICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDhjNSAgLyogVSsyMjA3IE5BQkxBICovCisjZGVmaW5lIFhLX2FwcHJveGltYXRlICAgICAgICAgICAgICAgICAgIDB4MDhjOCAgLyogVSsyMjNDIFRJTERFIE9QRVJBVE9SICovCisjZGVmaW5lIFhLX3NpbWlsYXJlcXVhbCAgICAgICAgICAgICAgICAgIDB4MDhjOSAgLyogVSsyMjQzIEFTWU1QVE9USUNBTExZIEVRVUFMIFRPICovCisjZGVmaW5lIFhLX2lmb25seWlmICAgICAgICAgICAgICAgICAgICAgIDB4MDhjZCAgLyogVSsyMUQ0IExFRlQgUklHSFQgRE9VQkxFIEFSUk9XICovCisjZGVmaW5lIFhLX2ltcGxpZXMgICAgICAgICAgICAgICAgICAgICAgIDB4MDhjZSAgLyogVSsyMUQyIFJJR0hUV0FSRFMgRE9VQkxFIEFSUk9XICovCisjZGVmaW5lIFhLX2lkZW50aWNhbCAgICAgICAgICAgICAgICAgICAgIDB4MDhjZiAgLyogVSsyMjYxIElERU5USUNBTCBUTyAqLworI2RlZmluZSBYS19yYWRpY2FsICAgICAgICAgICAgICAgICAgICAgICAweDA4ZDYgIC8qIFUrMjIxQSBTUVVBUkUgUk9PVCAqLworI2RlZmluZSBYS19pbmNsdWRlZGluICAgICAgICAgICAgICAgICAgICAweDA4ZGEgIC8qIFUrMjI4MiBTVUJTRVQgT0YgKi8KKyNkZWZpbmUgWEtfaW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgMHgwOGRiICAvKiBVKzIyODMgU1VQRVJTRVQgT0YgKi8KKyNkZWZpbmUgWEtfaW50ZXJzZWN0aW9uICAgICAgICAgICAgICAgICAgMHgwOGRjICAvKiBVKzIyMjkgSU5URVJTRUNUSU9OICovCisjZGVmaW5lIFhLX3VuaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDhkZCAgLyogVSsyMjJBIFVOSU9OICovCisjZGVmaW5lIFhLX2xvZ2ljYWxhbmQgICAgICAgICAgICAgICAgICAgIDB4MDhkZSAgLyogVSsyMjI3IExPR0lDQUwgQU5EICovCisjZGVmaW5lIFhLX2xvZ2ljYWxvciAgICAgICAgICAgICAgICAgICAgIDB4MDhkZiAgLyogVSsyMjI4IExPR0lDQUwgT1IgKi8KKyNkZWZpbmUgWEtfcGFydGlhbGRlcml2YXRpdmUgICAgICAgICAgICAgMHgwOGVmICAvKiBVKzIyMDIgUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KKyNkZWZpbmUgWEtfZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgMHgwOGY2ICAvKiBVKzAxOTIgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LICovCisjZGVmaW5lIFhLX2xlZnRhcnJvdyAgICAgICAgICAgICAgICAgICAgIDB4MDhmYiAgLyogVSsyMTkwIExFRlRXQVJEUyBBUlJPVyAqLworI2RlZmluZSBYS191cGFycm93ICAgICAgICAgICAgICAgICAgICAgICAweDA4ZmMgIC8qIFUrMjE5MSBVUFdBUkRTIEFSUk9XICovCisjZGVmaW5lIFhLX3JpZ2h0YXJyb3cgICAgICAgICAgICAgICAgICAgIDB4MDhmZCAgLyogVSsyMTkyIFJJR0hUV0FSRFMgQVJST1cgKi8KKyNkZWZpbmUgWEtfZG93bmFycm93ICAgICAgICAgICAgICAgICAgICAgMHgwOGZlICAvKiBVKzIxOTMgRE9XTldBUkRTIEFSUk9XICovCisjZW5kaWYgLyogWEtfVEVDSE5JQ0FMICovCisKKy8qCisgKiBTcGVjaWFsCisgKiAoZnJvbSB0aGUgREVDIFZUMTAwIFNwZWNpYWwgR3JhcGhpY3MgQ2hhcmFjdGVyIFNldCkKKyAqIEJ5dGUgMyA9IDkKKyAqLworCisjaWZkZWYgWEtfU1BFQ0lBTAorI2RlZmluZSBYS19ibGFuayAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ZGYKKyNkZWZpbmUgWEtfc29saWRkaWFtb25kICAgICAgICAgICAgICAgICAgMHgwOWUwICAvKiBVKzI1QzYgQkxBQ0sgRElBTU9ORCAqLworI2RlZmluZSBYS19jaGVja2VyYm9hcmQgICAgICAgICAgICAgICAgICAweDA5ZTEgIC8qIFUrMjU5MiBNRURJVU0gU0hBREUgKi8KKyNkZWZpbmUgWEtfaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWUyICAvKiBVKzI0MDkgU1lNQk9MIEZPUiBIT1JJWk9OVEFMIFRBQlVMQVRJT04gKi8KKyNkZWZpbmUgWEtfZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWUzICAvKiBVKzI0MEMgU1lNQk9MIEZPUiBGT1JNIEZFRUQgKi8KKyNkZWZpbmUgWEtfY3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWU0ICAvKiBVKzI0MEQgU1lNQk9MIEZPUiBDQVJSSUFHRSBSRVRVUk4gKi8KKyNkZWZpbmUgWEtfbGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWU1ICAvKiBVKzI0MEEgU1lNQk9MIEZPUiBMSU5FIEZFRUQgKi8KKyNkZWZpbmUgWEtfbmwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWU4ICAvKiBVKzI0MjQgU1lNQk9MIEZPUiBORVdMSU5FICovCisjZGVmaW5lIFhLX3Z0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDllOSAgLyogVSsyNDBCIFNZTUJPTCBGT1IgVkVSVElDQUwgVEFCVUxBVElPTiAqLworI2RlZmluZSBYS19sb3dyaWdodGNvcm5lciAgICAgICAgICAgICAgICAweDA5ZWEgIC8qIFUrMjUxOCBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQgKi8KKyNkZWZpbmUgWEtfdXByaWdodGNvcm5lciAgICAgICAgICAgICAgICAgMHgwOWViICAvKiBVKzI1MTAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQgKi8KKyNkZWZpbmUgWEtfdXBsZWZ0Y29ybmVyICAgICAgICAgICAgICAgICAgMHgwOWVjICAvKiBVKzI1MEMgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUICovCisjZGVmaW5lIFhLX2xvd2xlZnRjb3JuZXIgICAgICAgICAgICAgICAgIDB4MDllZCAgLyogVSsyNTE0IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQgKi8KKyNkZWZpbmUgWEtfY3Jvc3NpbmdsaW5lcyAgICAgICAgICAgICAgICAgMHgwOWVlICAvKiBVKzI1M0MgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMICovCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW4xICAgICAgICAgICAgICAgIDB4MDllZiAgLyogVSsyM0JBIEhPUklaT05UQUwgU0NBTiBMSU5FLTEgKi8KKyNkZWZpbmUgWEtfaG9yaXpsaW5lc2NhbjMgICAgICAgICAgICAgICAgMHgwOWYwICAvKiBVKzIzQkIgSE9SSVpPTlRBTCBTQ0FOIExJTkUtMyAqLworI2RlZmluZSBYS19ob3JpemxpbmVzY2FuNSAgICAgICAgICAgICAgICAweDA5ZjEgIC8qIFUrMjUwMCBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTCAqLworI2RlZmluZSBYS19ob3JpemxpbmVzY2FuNyAgICAgICAgICAgICAgICAweDA5ZjIgIC8qIFUrMjNCQyBIT1JJWk9OVEFMIFNDQU4gTElORS03ICovCisjZGVmaW5lIFhLX2hvcml6bGluZXNjYW45ICAgICAgICAgICAgICAgIDB4MDlmMyAgLyogVSsyM0JEIEhPUklaT05UQUwgU0NBTiBMSU5FLTkgKi8KKyNkZWZpbmUgWEtfbGVmdHQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWY0ICAvKiBVKzI1MUMgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVCAqLworI2RlZmluZSBYS19yaWdodHQgICAgICAgICAgICAgICAgICAgICAgICAweDA5ZjUgIC8qIFUrMjUyNCBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQgKi8KKyNkZWZpbmUgWEtfYm90dCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOWY2ICAvKiBVKzI1MzQgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMICovCisjZGVmaW5lIFhLX3RvcHQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDlmNyAgLyogVSsyNTJDIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMICovCisjZGVmaW5lIFhLX3ZlcnRiYXIgICAgICAgICAgICAgICAgICAgICAgIDB4MDlmOCAgLyogVSsyNTAyIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCAqLworI2VuZGlmIC8qIFhLX1NQRUNJQUwgKi8KKworLyoKKyAqIFB1Ymxpc2hpbmcKKyAqICh0aGVzZSBhcmUgcHJvYmFibHkgZnJvbSBhIGxvbmcgZm9yZ290dGVuIERFQyBQdWJsaXNoaW5nCisgKiBmb250IHRoYXQgb25jZSBzaGlwcGVkIHdpdGggREVDd3JpdGUpCisgKiBCeXRlIDMgPSAweDBhCisgKi8KKworI2lmZGVmIFhLX1BVQkxJU0hJTkcKKyNkZWZpbmUgWEtfZW1zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWExICAvKiBVKzIwMDMgRU0gU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZW5zcGFjZSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWEyICAvKiBVKzIwMDIgRU4gU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZW0zc3BhY2UgICAgICAgICAgICAgICAgICAgICAgMHgwYWEzICAvKiBVKzIwMDQgVEhSRUUtUEVSLUVNIFNQQUNFICovCisjZGVmaW5lIFhLX2VtNHNwYWNlICAgICAgICAgICAgICAgICAgICAgIDB4MGFhNCAgLyogVSsyMDA1IEZPVVItUEVSLUVNIFNQQUNFICovCisjZGVmaW5lIFhLX2RpZ2l0c3BhY2UgICAgICAgICAgICAgICAgICAgIDB4MGFhNSAgLyogVSsyMDA3IEZJR1VSRSBTUEFDRSAqLworI2RlZmluZSBYS19wdW5jdHNwYWNlICAgICAgICAgICAgICAgICAgICAweDBhYTYgIC8qIFUrMjAwOCBQVU5DVFVBVElPTiBTUEFDRSAqLworI2RlZmluZSBYS190aGluc3BhY2UgICAgICAgICAgICAgICAgICAgICAweDBhYTcgIC8qIFUrMjAwOSBUSElOIFNQQUNFICovCisjZGVmaW5lIFhLX2hhaXJzcGFjZSAgICAgICAgICAgICAgICAgICAgIDB4MGFhOCAgLyogVSsyMDBBIEhBSVIgU1BBQ0UgKi8KKyNkZWZpbmUgWEtfZW1kYXNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWE5ICAvKiBVKzIwMTQgRU0gREFTSCAqLworI2RlZmluZSBYS19lbmRhc2ggICAgICAgICAgICAgICAgICAgICAgICAweDBhYWEgIC8qIFUrMjAxMyBFTiBEQVNIICovCisjZGVmaW5lIFhLX3NpZ25pZmJsYW5rICAgICAgICAgICAgICAgICAgIDB4MGFhYyAgLyooVSsyNDIzIE9QRU4gQk9YKSovCisjZGVmaW5lIFhLX2VsbGlwc2lzICAgICAgICAgICAgICAgICAgICAgIDB4MGFhZSAgLyogVSsyMDI2IEhPUklaT05UQUwgRUxMSVBTSVMgKi8KKyNkZWZpbmUgWEtfZG91YmJhc2VsaW5lZG90ICAgICAgICAgICAgICAgMHgwYWFmICAvKiBVKzIwMjUgVFdPIERPVCBMRUFERVIgKi8KKyNkZWZpbmUgWEtfb25ldGhpcmQgICAgICAgICAgICAgICAgICAgICAgMHgwYWIwICAvKiBVKzIxNTMgVlVMR0FSIEZSQUNUSU9OIE9ORSBUSElSRCAqLworI2RlZmluZSBYS190d290aGlyZHMgICAgICAgICAgICAgICAgICAgICAweDBhYjEgIC8qIFUrMjE1NCBWVUxHQVIgRlJBQ1RJT04gVFdPIFRISVJEUyAqLworI2RlZmluZSBYS19vbmVmaWZ0aCAgICAgICAgICAgICAgICAgICAgICAweDBhYjIgIC8qIFUrMjE1NSBWVUxHQVIgRlJBQ1RJT04gT05FIEZJRlRIICovCisjZGVmaW5lIFhLX3R3b2ZpZnRocyAgICAgICAgICAgICAgICAgICAgIDB4MGFiMyAgLyogVSsyMTU2IFZVTEdBUiBGUkFDVElPTiBUV08gRklGVEhTICovCisjZGVmaW5lIFhLX3RocmVlZmlmdGhzICAgICAgICAgICAgICAgICAgIDB4MGFiNCAgLyogVSsyMTU3IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBGSUZUSFMgKi8KKyNkZWZpbmUgWEtfZm91cmZpZnRocyAgICAgICAgICAgICAgICAgICAgMHgwYWI1ICAvKiBVKzIxNTggVlVMR0FSIEZSQUNUSU9OIEZPVVIgRklGVEhTICovCisjZGVmaW5lIFhLX29uZXNpeHRoICAgICAgICAgICAgICAgICAgICAgIDB4MGFiNiAgLyogVSsyMTU5IFZVTEdBUiBGUkFDVElPTiBPTkUgU0lYVEggKi8KKyNkZWZpbmUgWEtfZml2ZXNpeHRocyAgICAgICAgICAgICAgICAgICAgMHgwYWI3ICAvKiBVKzIxNUEgVlVMR0FSIEZSQUNUSU9OIEZJVkUgU0lYVEhTICovCisjZGVmaW5lIFhLX2NhcmVvZiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiOCAgLyogVSsyMTA1IENBUkUgT0YgKi8KKyNkZWZpbmUgWEtfZmlnZGFzaCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJiICAvKiBVKzIwMTIgRklHVVJFIERBU0ggKi8KKyNkZWZpbmUgWEtfbGVmdGFuZ2xlYnJhY2tldCAgICAgICAgICAgICAgMHgwYWJjICAvKihVKzI3RTggTUFUSEVNQVRJQ0FMIExFRlQgQU5HTEUgQlJBQ0tFVCkqLworI2RlZmluZSBYS19kZWNpbWFscG9pbnQgICAgICAgICAgICAgICAgICAweDBhYmQgIC8qKFUrMDAyRSBGVUxMIFNUT1ApKi8KKyNkZWZpbmUgWEtfcmlnaHRhbmdsZWJyYWNrZXQgICAgICAgICAgICAgMHgwYWJlICAvKihVKzI3RTkgTUFUSEVNQVRJQ0FMIFJJR0hUIEFOR0xFIEJSQUNLRVQpKi8KKyNkZWZpbmUgWEtfbWFya2VyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJmCisjZGVmaW5lIFhLX29uZWVpZ2h0aCAgICAgICAgICAgICAgICAgICAgIDB4MGFjMyAgLyogVSsyMTVCIFZVTEdBUiBGUkFDVElPTiBPTkUgRUlHSFRIICovCisjZGVmaW5lIFhLX3RocmVlZWlnaHRocyAgICAgICAgICAgICAgICAgIDB4MGFjNCAgLyogVSsyMTVDIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBFSUdIVEhTICovCisjZGVmaW5lIFhLX2ZpdmVlaWdodGhzICAgICAgICAgICAgICAgICAgIDB4MGFjNSAgLyogVSsyMTVEIFZVTEdBUiBGUkFDVElPTiBGSVZFIEVJR0hUSFMgKi8KKyNkZWZpbmUgWEtfc2V2ZW5laWdodGhzICAgICAgICAgICAgICAgICAgMHgwYWM2ICAvKiBVKzIxNUUgVlVMR0FSIEZSQUNUSU9OIFNFVkVOIEVJR0hUSFMgKi8KKyNkZWZpbmUgWEtfdHJhZGVtYXJrICAgICAgICAgICAgICAgICAgICAgMHgwYWM5ICAvKiBVKzIxMjIgVFJBREUgTUFSSyBTSUdOICovCisjZGVmaW5lIFhLX3NpZ25hdHVyZW1hcmsgICAgICAgICAgICAgICAgIDB4MGFjYSAgLyooVSsyNjEzIFNBTFRJUkUpKi8KKyNkZWZpbmUgWEtfdHJhZGVtYXJraW5jaXJjbGUgICAgICAgICAgICAgMHgwYWNiCisjZGVmaW5lIFhLX2xlZnRvcGVudHJpYW5nbGUgICAgICAgICAgICAgIDB4MGFjYyAgLyooVSsyNUMxIFdISVRFIExFRlQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfcmlnaHRvcGVudHJpYW5nbGUgICAgICAgICAgICAgMHgwYWNkICAvKihVKzI1QjcgV0hJVEUgUklHSFQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZW1vcGVuY2lyY2xlICAgICAgICAgICAgICAgICAgMHgwYWNlICAvKihVKzI1Q0IgV0hJVEUgQ0lSQ0xFKSovCisjZGVmaW5lIFhLX2Vtb3BlbnJlY3RhbmdsZSAgICAgICAgICAgICAgIDB4MGFjZiAgLyooVSsyNUFGIFdISVRFIFZFUlRJQ0FMIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19sZWZ0c2luZ2xlcXVvdGVtYXJrICAgICAgICAgICAweDBhZDAgIC8qIFUrMjAxOCBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19yaWdodHNpbmdsZXF1b3RlbWFyayAgICAgICAgICAweDBhZDEgIC8qIFUrMjAxOSBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfbGVmdGRvdWJsZXF1b3RlbWFyayAgICAgICAgICAgMHgwYWQyICAvKiBVKzIwMUMgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfcmlnaHRkb3VibGVxdW90ZW1hcmsgICAgICAgICAgMHgwYWQzICAvKiBVKzIwMUQgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLICovCisjZGVmaW5lIFhLX3ByZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgIDB4MGFkNCAgLyogVSsyMTFFIFBSRVNDUklQVElPTiBUQUtFICovCisjZGVmaW5lIFhLX21pbnV0ZXMgICAgICAgICAgICAgICAgICAgICAgIDB4MGFkNiAgLyogVSsyMDMyIFBSSU1FICovCisjZGVmaW5lIFhLX3NlY29uZHMgICAgICAgICAgICAgICAgICAgICAgIDB4MGFkNyAgLyogVSsyMDMzIERPVUJMRSBQUklNRSAqLworI2RlZmluZSBYS19sYXRpbmNyb3NzICAgICAgICAgICAgICAgICAgICAweDBhZDkgIC8qIFUrMjcxRCBMQVRJTiBDUk9TUyAqLworI2RlZmluZSBYS19oZXhhZ3JhbSAgICAgICAgICAgICAgICAgICAgICAweDBhZGEKKyNkZWZpbmUgWEtfZmlsbGVkcmVjdGJ1bGxldCAgICAgICAgICAgICAgMHgwYWRiICAvKihVKzI1QUMgQkxBQ0sgUkVDVEFOR0xFKSovCisjZGVmaW5lIFhLX2ZpbGxlZGxlZnR0cmlidWxsZXQgICAgICAgICAgIDB4MGFkYyAgLyooVSsyNUMwIEJMQUNLIExFRlQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZmlsbGVkcmlnaHR0cmlidWxsZXQgICAgICAgICAgMHgwYWRkICAvKihVKzI1QjYgQkxBQ0sgUklHSFQtUE9JTlRJTkcgVFJJQU5HTEUpKi8KKyNkZWZpbmUgWEtfZW1maWxsZWRjaXJjbGUgICAgICAgICAgICAgICAgMHgwYWRlICAvKihVKzI1Q0YgQkxBQ0sgQ0lSQ0xFKSovCisjZGVmaW5lIFhLX2VtZmlsbGVkcmVjdCAgICAgICAgICAgICAgICAgIDB4MGFkZiAgLyooVSsyNUFFIEJMQUNLIFZFUlRJQ0FMIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19lbm9wZW5jaXJjYnVsbGV0ICAgICAgICAgICAgICAweDBhZTAgIC8qKFUrMjVFNiBXSElURSBCVUxMRVQpKi8KKyNkZWZpbmUgWEtfZW5vcGVuc3F1YXJlYnVsbGV0ICAgICAgICAgICAgMHgwYWUxICAvKihVKzI1QUIgV0hJVEUgU01BTEwgU1FVQVJFKSovCisjZGVmaW5lIFhLX29wZW5yZWN0YnVsbGV0ICAgICAgICAgICAgICAgIDB4MGFlMiAgLyooVSsyNUFEIFdISVRFIFJFQ1RBTkdMRSkqLworI2RlZmluZSBYS19vcGVudHJpYnVsbGV0dXAgICAgICAgICAgICAgICAweDBhZTMgIC8qKFUrMjVCMyBXSElURSBVUC1QT0lOVElORyBUUklBTkdMRSkqLworI2RlZmluZSBYS19vcGVudHJpYnVsbGV0ZG93biAgICAgICAgICAgICAweDBhZTQgIC8qKFUrMjVCRCBXSElURSBET1dOLVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX29wZW5zdGFyICAgICAgICAgICAgICAgICAgICAgIDB4MGFlNSAgLyooVSsyNjA2IFdISVRFIFNUQVIpKi8KKyNkZWZpbmUgWEtfZW5maWxsZWRjaXJjYnVsbGV0ICAgICAgICAgICAgMHgwYWU2ICAvKihVKzIwMjIgQlVMTEVUKSovCisjZGVmaW5lIFhLX2VuZmlsbGVkc3FidWxsZXQgICAgICAgICAgICAgIDB4MGFlNyAgLyooVSsyNUFBIEJMQUNLIFNNQUxMIFNRVUFSRSkqLworI2RlZmluZSBYS19maWxsZWR0cmlidWxsZXR1cCAgICAgICAgICAgICAweDBhZTggIC8qKFUrMjVCMiBCTEFDSyBVUC1QT0lOVElORyBUUklBTkdMRSkqLworI2RlZmluZSBYS19maWxsZWR0cmlidWxsZXRkb3duICAgICAgICAgICAweDBhZTkgIC8qKFUrMjVCQyBCTEFDSyBET1dOLVBPSU5USU5HIFRSSUFOR0xFKSovCisjZGVmaW5lIFhLX2xlZnRwb2ludGVyICAgICAgICAgICAgICAgICAgIDB4MGFlYSAgLyooVSsyNjFDIFdISVRFIExFRlQgUE9JTlRJTkcgSU5ERVgpKi8KKyNkZWZpbmUgWEtfcmlnaHRwb2ludGVyICAgICAgICAgICAgICAgICAgMHgwYWViICAvKihVKzI2MUUgV0hJVEUgUklHSFQgUE9JTlRJTkcgSU5ERVgpKi8KKyNkZWZpbmUgWEtfY2x1YiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWVjICAvKiBVKzI2NjMgQkxBQ0sgQ0xVQiBTVUlUICovCisjZGVmaW5lIFhLX2RpYW1vbmQgICAgICAgICAgICAgICAgICAgICAgIDB4MGFlZCAgLyogVSsyNjY2IEJMQUNLIERJQU1PTkQgU1VJVCAqLworI2RlZmluZSBYS19oZWFydCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhZWUgIC8qIFUrMjY2NSBCTEFDSyBIRUFSVCBTVUlUICovCisjZGVmaW5lIFhLX21hbHRlc2Vjcm9zcyAgICAgICAgICAgICAgICAgIDB4MGFmMCAgLyogVSsyNzIwIE1BTFRFU0UgQ1JPU1MgKi8KKyNkZWZpbmUgWEtfZGFnZ2VyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWYxICAvKiBVKzIwMjAgREFHR0VSICovCisjZGVmaW5lIFhLX2RvdWJsZWRhZ2dlciAgICAgICAgICAgICAgICAgIDB4MGFmMiAgLyogVSsyMDIxIERPVUJMRSBEQUdHRVIgKi8KKyNkZWZpbmUgWEtfY2hlY2ttYXJrICAgICAgICAgICAgICAgICAgICAgMHgwYWYzICAvKiBVKzI3MTMgQ0hFQ0sgTUFSSyAqLworI2RlZmluZSBYS19iYWxsb3Rjcm9zcyAgICAgICAgICAgICAgICAgICAweDBhZjQgIC8qIFUrMjcxNyBCQUxMT1QgWCAqLworI2RlZmluZSBYS19tdXNpY2Fsc2hhcnAgICAgICAgICAgICAgICAgICAweDBhZjUgIC8qIFUrMjY2RiBNVVNJQyBTSEFSUCBTSUdOICovCisjZGVmaW5lIFhLX211c2ljYWxmbGF0ICAgICAgICAgICAgICAgICAgIDB4MGFmNiAgLyogVSsyNjZEIE1VU0lDIEZMQVQgU0lHTiAqLworI2RlZmluZSBYS19tYWxlc3ltYm9sICAgICAgICAgICAgICAgICAgICAweDBhZjcgIC8qIFUrMjY0MiBNQUxFIFNJR04gKi8KKyNkZWZpbmUgWEtfZmVtYWxlc3ltYm9sICAgICAgICAgICAgICAgICAgMHgwYWY4ICAvKiBVKzI2NDAgRkVNQUxFIFNJR04gKi8KKyNkZWZpbmUgWEtfdGVsZXBob25lICAgICAgICAgICAgICAgICAgICAgMHgwYWY5ICAvKiBVKzI2MEUgQkxBQ0sgVEVMRVBIT05FICovCisjZGVmaW5lIFhLX3RlbGVwaG9uZXJlY29yZGVyICAgICAgICAgICAgIDB4MGFmYSAgLyogVSsyMzE1IFRFTEVQSE9ORSBSRUNPUkRFUiAqLworI2RlZmluZSBYS19waG9ub2dyYXBoY29weXJpZ2h0ICAgICAgICAgICAweDBhZmIgIC8qIFUrMjExNyBTT1VORCBSRUNPUkRJTkcgQ09QWVJJR0hUICovCisjZGVmaW5lIFhLX2NhcmV0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFmYyAgLyogVSsyMDM4IENBUkVUICovCisjZGVmaW5lIFhLX3NpbmdsZWxvd3F1b3RlbWFyayAgICAgICAgICAgIDB4MGFmZCAgLyogVSsyMDFBIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19kb3VibGVsb3dxdW90ZW1hcmsgICAgICAgICAgICAweDBhZmUgIC8qIFUrMjAxRSBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfY3Vyc29yICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWZmCisjZW5kaWYgLyogWEtfUFVCTElTSElORyAqLworCisvKgorICogQVBMCisgKiBCeXRlIDMgPSAweDBiCisgKi8KKworI2lmZGVmIFhLX0FQTAorI2RlZmluZSBYS19sZWZ0Y2FyZXQgICAgICAgICAgICAgICAgICAgICAweDBiYTMgIC8qKFUrMDAzQyBMRVNTLVRIQU4gU0lHTikqLworI2RlZmluZSBYS19yaWdodGNhcmV0ICAgICAgICAgICAgICAgICAgICAweDBiYTYgIC8qKFUrMDAzRSBHUkVBVEVSLVRIQU4gU0lHTikqLworI2RlZmluZSBYS19kb3duY2FyZXQgICAgICAgICAgICAgICAgICAgICAweDBiYTggIC8qKFUrMjIyOCBMT0dJQ0FMIE9SKSovCisjZGVmaW5lIFhLX3VwY2FyZXQgICAgICAgICAgICAgICAgICAgICAgIDB4MGJhOSAgLyooVSsyMjI3IExPR0lDQUwgQU5EKSovCisjZGVmaW5lIFhLX292ZXJiYXIgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjMCAgLyooVSswMEFGIE1BQ1JPTikqLworI2RlZmluZSBYS19kb3dudGFjayAgICAgICAgICAgICAgICAgICAgICAweDBiYzIgIC8qIFUrMjJBNSBVUCBUQUNLICovCisjZGVmaW5lIFhLX3Vwc2hvZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjMyAgLyooVSsyMjI5IElOVEVSU0VDVElPTikqLworI2RlZmluZSBYS19kb3duc3RpbGUgICAgICAgICAgICAgICAgICAgICAweDBiYzQgIC8qIFUrMjMwQSBMRUZUIEZMT09SICovCisjZGVmaW5lIFhLX3VuZGVyYmFyICAgICAgICAgICAgICAgICAgICAgIDB4MGJjNiAgLyooVSswMDVGIExPVyBMSU5FKSovCisjZGVmaW5lIFhLX2pvdCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjYSAgLyogVSsyMjE4IFJJTkcgT1BFUkFUT1IgKi8KKyNkZWZpbmUgWEtfcXVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNjICAvKiBVKzIzOTUgQVBMIEZVTkNUSU9OQUwgU1lNQk9MIFFVQUQgKi8KKyNkZWZpbmUgWEtfdXB0YWNrICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNlICAvKiBVKzIyQTQgRE9XTiBUQUNLICovCisjZGVmaW5lIFhLX2NpcmNsZSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjZiAgLyogVSsyNUNCIFdISVRFIENJUkNMRSAqLworI2RlZmluZSBYS191cHN0aWxlICAgICAgICAgICAgICAgICAgICAgICAweDBiZDMgIC8qIFUrMjMwOCBMRUZUIENFSUxJTkcgKi8KKyNkZWZpbmUgWEtfZG93bnNob2UgICAgICAgICAgICAgICAgICAgICAgMHgwYmQ2ICAvKihVKzIyMkEgVU5JT04pKi8KKyNkZWZpbmUgWEtfcmlnaHRzaG9lICAgICAgICAgICAgICAgICAgICAgMHgwYmQ4ICAvKihVKzIyODMgU1VQRVJTRVQgT0YpKi8KKyNkZWZpbmUgWEtfbGVmdHNob2UgICAgICAgICAgICAgICAgICAgICAgMHgwYmRhICAvKihVKzIyODIgU1VCU0VUIE9GKSovCisjZGVmaW5lIFhLX2xlZnR0YWNrICAgICAgICAgICAgICAgICAgICAgIDB4MGJkYyAgLyogVSsyMkEyIFJJR0hUIFRBQ0sgKi8KKyNkZWZpbmUgWEtfcmlnaHR0YWNrICAgICAgICAgICAgICAgICAgICAgMHgwYmZjICAvKiBVKzIyQTMgTEVGVCBUQUNLICovCisjZW5kaWYgLyogWEtfQVBMICovCisKKy8qCisgKiBIZWJyZXcKKyAqIEJ5dGUgMyA9IDB4MGMKKyAqLworCisjaWZkZWYgWEtfSEVCUkVXCisjZGVmaW5lIFhLX2hlYnJld19kb3VibGVsb3dsaW5lICAgICAgICAgIDB4MGNkZiAgLyogVSsyMDE3IERPVUJMRSBMT1cgTElORSAqLworI2RlZmluZSBYS19oZWJyZXdfYWxlcGggICAgICAgICAgICAgICAgICAweDBjZTAgIC8qIFUrMDVEMCBIRUJSRVcgTEVUVEVSIEFMRUYgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2JldCAgICAgICAgICAgICAgICAgICAgMHgwY2UxICAvKiBVKzA1RDEgSEVCUkVXIExFVFRFUiBCRVQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2JldGggICAgICAgICAgICAgICAgICAgMHgwY2UxICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19naW1lbCAgICAgICAgICAgICAgICAgIDB4MGNlMiAgLyogVSswNUQyIEhFQlJFVyBMRVRURVIgR0lNRUwgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2dpbW1lbCAgICAgICAgICAgICAgICAgMHgwY2UyICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19kYWxldCAgICAgICAgICAgICAgICAgIDB4MGNlMyAgLyogVSswNUQzIEhFQlJFVyBMRVRURVIgREFMRVQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2RhbGV0aCAgICAgICAgICAgICAgICAgMHgwY2UzICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19oZSAgICAgICAgICAgICAgICAgICAgIDB4MGNlNCAgLyogVSswNUQ0IEhFQlJFVyBMRVRURVIgSEUgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3dhdyAgICAgICAgICAgICAgICAgICAgMHgwY2U1ICAvKiBVKzA1RDUgSEVCUkVXIExFVFRFUiBWQVYgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3phaW4gICAgICAgICAgICAgICAgICAgMHgwY2U2ICAvKiBVKzA1RDYgSEVCUkVXIExFVFRFUiBaQVlJTiAqLworI2RlZmluZSBYS19oZWJyZXdfemF5aW4gICAgICAgICAgICAgICAgICAweDBjZTYgIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2NoZXQgICAgICAgICAgICAgICAgICAgMHgwY2U3ICAvKiBVKzA1RDcgSEVCUkVXIExFVFRFUiBIRVQgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2hldCAgICAgICAgICAgICAgICAgICAgMHgwY2U3ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld190ZXQgICAgICAgICAgICAgICAgICAgIDB4MGNlOCAgLyogVSswNUQ4IEhFQlJFVyBMRVRURVIgVEVUICovCisjZGVmaW5lIFhLX2hlYnJld190ZXRoICAgICAgICAgICAgICAgICAgIDB4MGNlOCAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfeW9kICAgICAgICAgICAgICAgICAgICAweDBjZTkgIC8qIFUrMDVEOSBIRUJSRVcgTEVUVEVSIFlPRCAqLworI2RlZmluZSBYS19oZWJyZXdfZmluYWxrYXBoICAgICAgICAgICAgICAweDBjZWEgIC8qIFUrMDVEQSBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRiAqLworI2RlZmluZSBYS19oZWJyZXdfa2FwaCAgICAgICAgICAgICAgICAgICAweDBjZWIgIC8qIFUrMDVEQiBIRUJSRVcgTEVUVEVSIEtBRiAqLworI2RlZmluZSBYS19oZWJyZXdfbGFtZWQgICAgICAgICAgICAgICAgICAweDBjZWMgIC8qIFUrMDVEQyBIRUJSRVcgTEVUVEVSIExBTUVEICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbG1lbSAgICAgICAgICAgICAgIDB4MGNlZCAgLyogVSswNUREIEhFQlJFVyBMRVRURVIgRklOQUwgTUVNICovCisjZGVmaW5lIFhLX2hlYnJld19tZW0gICAgICAgICAgICAgICAgICAgIDB4MGNlZSAgLyogVSswNURFIEhFQlJFVyBMRVRURVIgTUVNICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbG51biAgICAgICAgICAgICAgIDB4MGNlZiAgLyogVSswNURGIEhFQlJFVyBMRVRURVIgRklOQUwgTlVOICovCisjZGVmaW5lIFhLX2hlYnJld19udW4gICAgICAgICAgICAgICAgICAgIDB4MGNmMCAgLyogVSswNUUwIEhFQlJFVyBMRVRURVIgTlVOICovCisjZGVmaW5lIFhLX2hlYnJld19zYW1lY2ggICAgICAgICAgICAgICAgIDB4MGNmMSAgLyogVSswNUUxIEhFQlJFVyBMRVRURVIgU0FNRUtIICovCisjZGVmaW5lIFhLX2hlYnJld19zYW1la2ggICAgICAgICAgICAgICAgIDB4MGNmMSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfYXlpbiAgICAgICAgICAgICAgICAgICAweDBjZjIgIC8qIFUrMDVFMiBIRUJSRVcgTEVUVEVSIEFZSU4gKi8KKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFscGUgICAgICAgICAgICAgICAgMHgwY2YzICAvKiBVKzA1RTMgSEVCUkVXIExFVFRFUiBGSU5BTCBQRSAqLworI2RlZmluZSBYS19oZWJyZXdfcGUgICAgICAgICAgICAgICAgICAgICAweDBjZjQgIC8qIFUrMDVFNCBIRUJSRVcgTEVUVEVSIFBFICovCisjZGVmaW5lIFhLX2hlYnJld19maW5hbHphZGUgICAgICAgICAgICAgIDB4MGNmNSAgLyogVSswNUU1IEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkgKi8KKyNkZWZpbmUgWEtfaGVicmV3X2ZpbmFsemFkaSAgICAgICAgICAgICAgMHgwY2Y1ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld196YWRlICAgICAgICAgICAgICAgICAgIDB4MGNmNiAgLyogVSswNUU2IEhFQlJFVyBMRVRURVIgVFNBREkgKi8KKyNkZWZpbmUgWEtfaGVicmV3X3phZGkgICAgICAgICAgICAgICAgICAgMHgwY2Y2ICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFhLX2hlYnJld19xb3BoICAgICAgICAgICAgICAgICAgIDB4MGNmNyAgLyogVSswNUU3IEhFQlJFVyBMRVRURVIgUU9GICovCisjZGVmaW5lIFhLX2hlYnJld19rdWYgICAgICAgICAgICAgICAgICAgIDB4MGNmNyAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19oZWJyZXdfcmVzaCAgICAgICAgICAgICAgICAgICAweDBjZjggIC8qIFUrMDVFOCBIRUJSRVcgTEVUVEVSIFJFU0ggKi8KKyNkZWZpbmUgWEtfaGVicmV3X3NoaW4gICAgICAgICAgICAgICAgICAgMHgwY2Y5ICAvKiBVKzA1RTkgSEVCUkVXIExFVFRFUiBTSElOICovCisjZGVmaW5lIFhLX2hlYnJld190YXcgICAgICAgICAgICAgICAgICAgIDB4MGNmYSAgLyogVSswNUVBIEhFQlJFVyBMRVRURVIgVEFWICovCisjZGVmaW5lIFhLX2hlYnJld190YWYgICAgICAgICAgICAgICAgICAgIDB4MGNmYSAgLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBYS19IZWJyZXdfc3dpdGNoICAgICAgICAgICAgICAgICAweGZmN2UgIC8qIEFsaWFzIGZvciBtb2RlX3N3aXRjaCAqLworI2VuZGlmIC8qIFhLX0hFQlJFVyAqLworCisvKgorICogVGhhaQorICogQnl0ZSAzID0gMHgwZAorICovCisKKyNpZmRlZiBYS19USEFJCisjZGVmaW5lIFhLX1RoYWlfa29rYWkgICAgICAgICAgICAgICAgICAgIDB4MGRhMSAgLyogVSswRTAxIFRIQUkgQ0hBUkFDVEVSIEtPIEtBSSAqLworI2RlZmluZSBYS19UaGFpX2tob2toYWkgICAgICAgICAgICAgICAgICAweDBkYTIgIC8qIFUrMEUwMiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hBSSAqLworI2RlZmluZSBYS19UaGFpX2tob2todWF0ICAgICAgICAgICAgICAgICAweDBkYTMgIC8qIFUrMEUwMyBUSEFJIENIQVJBQ1RFUiBLSE8gS0hVQVQgKi8KKyNkZWZpbmUgWEtfVGhhaV9raG9raHdhaSAgICAgICAgICAgICAgICAgMHgwZGE0ICAvKiBVKzBFMDQgVEhBSSBDSEFSQUNURVIgS0hPIEtIV0FJICovCisjZGVmaW5lIFhLX1RoYWlfa2hva2hvbiAgICAgICAgICAgICAgICAgIDB4MGRhNSAgLyogVSswRTA1IFRIQUkgQ0hBUkFDVEVSIEtITyBLSE9OICovCisjZGVmaW5lIFhLX1RoYWlfa2hvcmFraGFuZyAgICAgICAgICAgICAgIDB4MGRhNiAgLyogVSswRTA2IFRIQUkgQ0hBUkFDVEVSIEtITyBSQUtIQU5HICovCisjZGVmaW5lIFhLX1RoYWlfbmdvbmd1ICAgICAgICAgICAgICAgICAgIDB4MGRhNyAgLyogVSswRTA3IFRIQUkgQ0hBUkFDVEVSIE5HTyBOR1UgKi8KKyNkZWZpbmUgWEtfVGhhaV9jaG9jaGFuICAgICAgICAgICAgICAgICAgMHgwZGE4ICAvKiBVKzBFMDggVEhBSSBDSEFSQUNURVIgQ0hPIENIQU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9jaG9jaGluZyAgICAgICAgICAgICAgICAgMHgwZGE5ICAvKiBVKzBFMDkgVEhBSSBDSEFSQUNURVIgQ0hPIENISU5HICovCisjZGVmaW5lIFhLX1RoYWlfY2hvY2hhbmcgICAgICAgICAgICAgICAgIDB4MGRhYSAgLyogVSswRTBBIFRIQUkgQ0hBUkFDVEVSIENITyBDSEFORyAqLworI2RlZmluZSBYS19UaGFpX3Nvc28gICAgICAgICAgICAgICAgICAgICAweDBkYWIgIC8qIFUrMEUwQiBUSEFJIENIQVJBQ1RFUiBTTyBTTyAqLworI2RlZmluZSBYS19UaGFpX2Nob2Nob2UgICAgICAgICAgICAgICAgICAweDBkYWMgIC8qIFUrMEUwQyBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hPRSAqLworI2RlZmluZSBYS19UaGFpX3lveWluZyAgICAgICAgICAgICAgICAgICAweDBkYWQgIC8qIFUrMEUwRCBUSEFJIENIQVJBQ1RFUiBZTyBZSU5HICovCisjZGVmaW5lIFhLX1RoYWlfZG9jaGFkYSAgICAgICAgICAgICAgICAgIDB4MGRhZSAgLyogVSswRTBFIFRIQUkgQ0hBUkFDVEVSIERPIENIQURBICovCisjZGVmaW5lIFhLX1RoYWlfdG9wYXRhayAgICAgICAgICAgICAgICAgIDB4MGRhZiAgLyogVSswRTBGIFRIQUkgQ0hBUkFDVEVSIFRPIFBBVEFLICovCisjZGVmaW5lIFhLX1RoYWlfdGhvdGhhbiAgICAgICAgICAgICAgICAgIDB4MGRiMCAgLyogVSswRTEwIFRIQUkgQ0hBUkFDVEVSIFRITyBUSEFOICovCisjZGVmaW5lIFhLX1RoYWlfdGhvbmFuZ21vbnRobyAgICAgICAgICAgIDB4MGRiMSAgLyogVSswRTExIFRIQUkgQ0hBUkFDVEVSIFRITyBOQU5HTU9OVEhPICovCisjZGVmaW5lIFhLX1RoYWlfdGhvcGh1dGhhbyAgICAgICAgICAgICAgIDB4MGRiMiAgLyogVSswRTEyIFRIQUkgQ0hBUkFDVEVSIFRITyBQSFVUSEFPICovCisjZGVmaW5lIFhLX1RoYWlfbm9uZW4gICAgICAgICAgICAgICAgICAgIDB4MGRiMyAgLyogVSswRTEzIFRIQUkgQ0hBUkFDVEVSIE5PIE5FTiAqLworI2RlZmluZSBYS19UaGFpX2RvZGVrICAgICAgICAgICAgICAgICAgICAweDBkYjQgIC8qIFUrMEUxNCBUSEFJIENIQVJBQ1RFUiBETyBERUsgKi8KKyNkZWZpbmUgWEtfVGhhaV90b3RhbyAgICAgICAgICAgICAgICAgICAgMHgwZGI1ICAvKiBVKzBFMTUgVEhBSSBDSEFSQUNURVIgVE8gVEFPICovCisjZGVmaW5lIFhLX1RoYWlfdGhvdGh1bmcgICAgICAgICAgICAgICAgIDB4MGRiNiAgLyogVSswRTE2IFRIQUkgQ0hBUkFDVEVSIFRITyBUSFVORyAqLworI2RlZmluZSBYS19UaGFpX3Rob3RoYWhhbiAgICAgICAgICAgICAgICAweDBkYjcgIC8qIFUrMEUxNyBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBSEFOICovCisjZGVmaW5lIFhLX1RoYWlfdGhvdGhvbmcgICAgICAgICAgICAgICAgIDB4MGRiOCAgLyogVSswRTE4IFRIQUkgQ0hBUkFDVEVSIFRITyBUSE9ORyAqLworI2RlZmluZSBYS19UaGFpX25vbnUgICAgICAgICAgICAgICAgICAgICAweDBkYjkgIC8qIFUrMEUxOSBUSEFJIENIQVJBQ1RFUiBOTyBOVSAqLworI2RlZmluZSBYS19UaGFpX2JvYmFpbWFpICAgICAgICAgICAgICAgICAweDBkYmEgIC8qIFUrMEUxQSBUSEFJIENIQVJBQ1RFUiBCTyBCQUlNQUkgKi8KKyNkZWZpbmUgWEtfVGhhaV9wb3BsYSAgICAgICAgICAgICAgICAgICAgMHgwZGJiICAvKiBVKzBFMUIgVEhBSSBDSEFSQUNURVIgUE8gUExBICovCisjZGVmaW5lIFhLX1RoYWlfcGhvcGh1bmcgICAgICAgICAgICAgICAgIDB4MGRiYyAgLyogVSswRTFDIFRIQUkgQ0hBUkFDVEVSIFBITyBQSFVORyAqLworI2RlZmluZSBYS19UaGFpX2ZvZmEgICAgICAgICAgICAgICAgICAgICAweDBkYmQgIC8qIFUrMEUxRCBUSEFJIENIQVJBQ1RFUiBGTyBGQSAqLworI2RlZmluZSBYS19UaGFpX3Bob3BoYW4gICAgICAgICAgICAgICAgICAweDBkYmUgIC8qIFUrMEUxRSBUSEFJIENIQVJBQ1RFUiBQSE8gUEhBTiAqLworI2RlZmluZSBYS19UaGFpX2ZvZmFuICAgICAgICAgICAgICAgICAgICAweDBkYmYgIC8qIFUrMEUxRiBUSEFJIENIQVJBQ1RFUiBGTyBGQU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9waG9zYW1waGFvICAgICAgICAgICAgICAgMHgwZGMwICAvKiBVKzBFMjAgVEhBSSBDSEFSQUNURVIgUEhPIFNBTVBIQU8gKi8KKyNkZWZpbmUgWEtfVGhhaV9tb21hICAgICAgICAgICAgICAgICAgICAgMHgwZGMxICAvKiBVKzBFMjEgVEhBSSBDSEFSQUNURVIgTU8gTUEgKi8KKyNkZWZpbmUgWEtfVGhhaV95b3lhayAgICAgICAgICAgICAgICAgICAgMHgwZGMyICAvKiBVKzBFMjIgVEhBSSBDSEFSQUNURVIgWU8gWUFLICovCisjZGVmaW5lIFhLX1RoYWlfcm9ydWEgICAgICAgICAgICAgICAgICAgIDB4MGRjMyAgLyogVSswRTIzIFRIQUkgQ0hBUkFDVEVSIFJPIFJVQSAqLworI2RlZmluZSBYS19UaGFpX3J1ICAgICAgICAgICAgICAgICAgICAgICAweDBkYzQgIC8qIFUrMEUyNCBUSEFJIENIQVJBQ1RFUiBSVSAqLworI2RlZmluZSBYS19UaGFpX2xvbGluZyAgICAgICAgICAgICAgICAgICAweDBkYzUgIC8qIFUrMEUyNSBUSEFJIENIQVJBQ1RFUiBMTyBMSU5HICovCisjZGVmaW5lIFhLX1RoYWlfbHUgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjNiAgLyogVSswRTI2IFRIQUkgQ0hBUkFDVEVSIExVICovCisjZGVmaW5lIFhLX1RoYWlfd293YWVuICAgICAgICAgICAgICAgICAgIDB4MGRjNyAgLyogVSswRTI3IFRIQUkgQ0hBUkFDVEVSIFdPIFdBRU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9zb3NhbGEgICAgICAgICAgICAgICAgICAgMHgwZGM4ICAvKiBVKzBFMjggVEhBSSBDSEFSQUNURVIgU08gU0FMQSAqLworI2RlZmluZSBYS19UaGFpX3NvcnVzaSAgICAgICAgICAgICAgICAgICAweDBkYzkgIC8qIFUrMEUyOSBUSEFJIENIQVJBQ1RFUiBTTyBSVVNJICovCisjZGVmaW5lIFhLX1RoYWlfc29zdWEgICAgICAgICAgICAgICAgICAgIDB4MGRjYSAgLyogVSswRTJBIFRIQUkgQ0hBUkFDVEVSIFNPIFNVQSAqLworI2RlZmluZSBYS19UaGFpX2hvaGlwICAgICAgICAgICAgICAgICAgICAweDBkY2IgIC8qIFUrMEUyQiBUSEFJIENIQVJBQ1RFUiBITyBISVAgKi8KKyNkZWZpbmUgWEtfVGhhaV9sb2NodWxhICAgICAgICAgICAgICAgICAgMHgwZGNjICAvKiBVKzBFMkMgVEhBSSBDSEFSQUNURVIgTE8gQ0hVTEEgKi8KKyNkZWZpbmUgWEtfVGhhaV9vYW5nICAgICAgICAgICAgICAgICAgICAgMHgwZGNkICAvKiBVKzBFMkQgVEhBSSBDSEFSQUNURVIgTyBBTkcgKi8KKyNkZWZpbmUgWEtfVGhhaV9ob25va2h1ayAgICAgICAgICAgICAgICAgMHgwZGNlICAvKiBVKzBFMkUgVEhBSSBDSEFSQUNURVIgSE8gTk9LSFVLICovCisjZGVmaW5lIFhLX1RoYWlfcGFpeWFubm9pICAgICAgICAgICAgICAgIDB4MGRjZiAgLyogVSswRTJGIFRIQUkgQ0hBUkFDVEVSIFBBSVlBTk5PSSAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhICAgICAgICAgICAgICAgICAgICAweDBkZDAgIC8qIFUrMEUzMCBUSEFJIENIQVJBQ1RFUiBTQVJBIEEgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWloYW5ha2F0ICAgICAgICAgICAgICAgMHgwZGQxICAvKiBVKzBFMzEgVEhBSSBDSEFSQUNURVIgTUFJIEhBTi1BS0FUICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFhICAgICAgICAgICAgICAgICAgIDB4MGRkMiAgLyogVSswRTMyIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUEgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhYW0gICAgICAgICAgICAgICAgICAgMHgwZGQzICAvKiBVKzBFMzMgVEhBSSBDSEFSQUNURVIgU0FSQSBBTSAqLworI2RlZmluZSBYS19UaGFpX3NhcmFpICAgICAgICAgICAgICAgICAgICAweDBkZDQgIC8qIFUrMEUzNCBUSEFJIENIQVJBQ1RFUiBTQVJBIEkgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhaWkgICAgICAgICAgICAgICAgICAgMHgwZGQ1ICAvKiBVKzBFMzUgVEhBSSBDSEFSQUNURVIgU0FSQSBJSSAqLworI2RlZmluZSBYS19UaGFpX3NhcmF1ZSAgICAgICAgICAgICAgICAgICAweDBkZDYgIC8qIFUrMEUzNiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYXVlZSAgICAgICAgICAgICAgICAgIDB4MGRkNyAgLyogVSswRTM3IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVUVFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYXUgICAgICAgICAgICAgICAgICAgIDB4MGRkOCAgLyogVSswRTM4IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVSAqLworI2RlZmluZSBYS19UaGFpX3NhcmF1dSAgICAgICAgICAgICAgICAgICAweDBkZDkgIC8qIFUrMEUzOSBUSEFJIENIQVJBQ1RFUiBTQVJBIFVVICovCisjZGVmaW5lIFhLX1RoYWlfcGhpbnRodSAgICAgICAgICAgICAgICAgIDB4MGRkYSAgLyogVSswRTNBIFRIQUkgQ0hBUkFDVEVSIFBISU5USFUgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWloYW5ha2F0X21haXRobyAgICAgICAgMHgwZGRlCisjZGVmaW5lIFhLX1RoYWlfYmFodCAgICAgICAgICAgICAgICAgICAgIDB4MGRkZiAgLyogVSswRTNGIFRIQUkgQ1VSUkVOQ1kgU1lNQk9MIEJBSFQgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhZSAgICAgICAgICAgICAgICAgICAgMHgwZGUwICAvKiBVKzBFNDAgVEhBSSBDSEFSQUNURVIgU0FSQSBFICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFlICAgICAgICAgICAgICAgICAgIDB4MGRlMSAgLyogVSswRTQxIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUUgKi8KKyNkZWZpbmUgWEtfVGhhaV9zYXJhbyAgICAgICAgICAgICAgICAgICAgMHgwZGUyICAvKiBVKzBFNDIgVEhBSSBDSEFSQUNURVIgU0FSQSBPICovCisjZGVmaW5lIFhLX1RoYWlfc2FyYWFpbWFpbXVhbiAgICAgICAgICAgIDB4MGRlMyAgLyogVSswRTQzIFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTVVBTiAqLworI2RlZmluZSBYS19UaGFpX3NhcmFhaW1haW1hbGFpICAgICAgICAgICAweDBkZTQgIC8qIFUrMEU0NCBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1BTEFJICovCisjZGVmaW5lIFhLX1RoYWlfbGFra2hhbmd5YW8gICAgICAgICAgICAgIDB4MGRlNSAgLyogVSswRTQ1IFRIQUkgQ0hBUkFDVEVSIExBS0tIQU5HWUFPICovCisjZGVmaW5lIFhLX1RoYWlfbWFpeWFtb2sgICAgICAgICAgICAgICAgIDB4MGRlNiAgLyogVSswRTQ2IFRIQUkgQ0hBUkFDVEVSIE1BSVlBTU9LICovCisjZGVmaW5lIFhLX1RoYWlfbWFpdGFpa2h1ICAgICAgICAgICAgICAgIDB4MGRlNyAgLyogVSswRTQ3IFRIQUkgQ0hBUkFDVEVSIE1BSVRBSUtIVSAqLworI2RlZmluZSBYS19UaGFpX21haWVrICAgICAgICAgICAgICAgICAgICAweDBkZTggIC8qIFUrMEU0OCBUSEFJIENIQVJBQ1RFUiBNQUkgRUsgKi8KKyNkZWZpbmUgWEtfVGhhaV9tYWl0aG8gICAgICAgICAgICAgICAgICAgMHgwZGU5ICAvKiBVKzBFNDkgVEhBSSBDSEFSQUNURVIgTUFJIFRITyAqLworI2RlZmluZSBYS19UaGFpX21haXRyaSAgICAgICAgICAgICAgICAgICAweDBkZWEgIC8qIFUrMEU0QSBUSEFJIENIQVJBQ1RFUiBNQUkgVFJJICovCisjZGVmaW5lIFhLX1RoYWlfbWFpY2hhdHRhd2EgICAgICAgICAgICAgIDB4MGRlYiAgLyogVSswRTRCIFRIQUkgQ0hBUkFDVEVSIE1BSSBDSEFUVEFXQSAqLworI2RlZmluZSBYS19UaGFpX3RoYW50aGFraGF0ICAgICAgICAgICAgICAweDBkZWMgIC8qIFUrMEU0QyBUSEFJIENIQVJBQ1RFUiBUSEFOVEhBS0hBVCAqLworI2RlZmluZSBYS19UaGFpX25pa2hhaGl0ICAgICAgICAgICAgICAgICAweDBkZWQgIC8qIFUrMEU0RCBUSEFJIENIQVJBQ1RFUiBOSUtIQUhJVCAqLworI2RlZmluZSBYS19UaGFpX2xla3N1biAgICAgICAgICAgICAgICAgICAweDBkZjAgIC8qIFUrMEU1MCBUSEFJIERJR0lUIFpFUk8gKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtudW5nICAgICAgICAgICAgICAgICAgMHgwZGYxICAvKiBVKzBFNTEgVEhBSSBESUdJVCBPTkUgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtzb25nICAgICAgICAgICAgICAgICAgMHgwZGYyICAvKiBVKzBFNTIgVEhBSSBESUdJVCBUV08gKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtzYW0gICAgICAgICAgICAgICAgICAgMHgwZGYzICAvKiBVKzBFNTMgVEhBSSBESUdJVCBUSFJFRSAqLworI2RlZmluZSBYS19UaGFpX2xla3NpICAgICAgICAgICAgICAgICAgICAweDBkZjQgIC8qIFUrMEU1NCBUSEFJIERJR0lUIEZPVVIgKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtoYSAgICAgICAgICAgICAgICAgICAgMHgwZGY1ICAvKiBVKzBFNTUgVEhBSSBESUdJVCBGSVZFICovCisjZGVmaW5lIFhLX1RoYWlfbGVraG9rICAgICAgICAgICAgICAgICAgIDB4MGRmNiAgLyogVSswRTU2IFRIQUkgRElHSVQgU0lYICovCisjZGVmaW5lIFhLX1RoYWlfbGVrY2hldCAgICAgICAgICAgICAgICAgIDB4MGRmNyAgLyogVSswRTU3IFRIQUkgRElHSVQgU0VWRU4gKi8KKyNkZWZpbmUgWEtfVGhhaV9sZWtwYWV0ICAgICAgICAgICAgICAgICAgMHgwZGY4ICAvKiBVKzBFNTggVEhBSSBESUdJVCBFSUdIVCAqLworI2RlZmluZSBYS19UaGFpX2xla2thbyAgICAgICAgICAgICAgICAgICAweDBkZjkgIC8qIFUrMEU1OSBUSEFJIERJR0lUIE5JTkUgKi8KKyNlbmRpZiAvKiBYS19USEFJICovCisKKy8qCisgKiBLb3JlYW4KKyAqIEJ5dGUgMyA9IDB4MGUKKyAqLworCisjaWZkZWYgWEtfS09SRUFOCisKKyNkZWZpbmUgWEtfSGFuZ3VsICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjMxICAvKiBIYW5ndWwgc3RhcnQvc3RvcCh0b2dnbGUpICovCisjZGVmaW5lIFhLX0hhbmd1bF9TdGFydCAgICAgICAgICAgICAgICAgIDB4ZmYzMiAgLyogSGFuZ3VsIHN0YXJ0ICovCisjZGVmaW5lIFhLX0hhbmd1bF9FbmQgICAgICAgICAgICAgICAgICAgIDB4ZmYzMyAgLyogSGFuZ3VsIGVuZCwgRW5nbGlzaCBzdGFydCAqLworI2RlZmluZSBYS19IYW5ndWxfSGFuamEgICAgICAgICAgICAgICAgICAweGZmMzQgIC8qIFN0YXJ0IEhhbmd1bC0+SGFuamEgQ29udmVyc2lvbiAqLworI2RlZmluZSBYS19IYW5ndWxfSmFtbyAgICAgICAgICAgICAgICAgICAweGZmMzUgIC8qIEhhbmd1bCBKYW1vIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1JvbWFqYSAgICAgICAgICAgICAgICAgMHhmZjM2ICAvKiBIYW5ndWwgUm9tYWphIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0NvZGVpbnB1dCAgICAgICAgICAgICAgMHhmZjM3ICAvKiBIYW5ndWwgY29kZSBpbnB1dCBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9KZW9uamEgICAgICAgICAgICAgICAgIDB4ZmYzOCAgLyogSmVvbmphIG1vZGUgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0JhbmphICAgICAgICAgICAgICAgICAgMHhmZjM5ICAvKiBCYW5qYSBtb2RlICovCisjZGVmaW5lIFhLX0hhbmd1bF9QcmVIYW5qYSAgICAgICAgICAgICAgIDB4ZmYzYSAgLyogUHJlIEhhbmphIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1Bvc3RIYW5qYSAgICAgICAgICAgICAgMHhmZjNiICAvKiBQb3N0IEhhbmphIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX1NpbmdsZUNhbmRpZGF0ZSAgICAgICAgMHhmZjNjICAvKiBTaW5nbGUgY2FuZGlkYXRlICovCisjZGVmaW5lIFhLX0hhbmd1bF9NdWx0aXBsZUNhbmRpZGF0ZSAgICAgIDB4ZmYzZCAgLyogTXVsdGlwbGUgY2FuZGlkYXRlICovCisjZGVmaW5lIFhLX0hhbmd1bF9QcmV2aW91c0NhbmRpZGF0ZSAgICAgIDB4ZmYzZSAgLyogUHJldmlvdXMgY2FuZGlkYXRlICovCisjZGVmaW5lIFhLX0hhbmd1bF9TcGVjaWFsICAgICAgICAgICAgICAgIDB4ZmYzZiAgLyogU3BlY2lhbCBzeW1ib2xzICovCisjZGVmaW5lIFhLX0hhbmd1bF9zd2l0Y2ggICAgICAgICAgICAgICAgIDB4ZmY3ZSAgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovCisKKy8qIEhhbmd1bCBDb25zb25hbnQgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfS2l5ZW9nICAgICAgICAgICAgICAgICAweDBlYTEKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nS2l5ZW9nICAgICAgICAgICAgMHgwZWEyCisjZGVmaW5lIFhLX0hhbmd1bF9LaXllb2dTaW9zICAgICAgICAgICAgIDB4MGVhMworI2RlZmluZSBYS19IYW5ndWxfTmlldW4gICAgICAgICAgICAgICAgICAweDBlYTQKKyNkZWZpbmUgWEtfSGFuZ3VsX05pZXVuSmlldWogICAgICAgICAgICAgMHgwZWE1CisjZGVmaW5lIFhLX0hhbmd1bF9OaWV1bkhpZXVoICAgICAgICAgICAgIDB4MGVhNgorI2RlZmluZSBYS19IYW5ndWxfRGlrZXVkICAgICAgICAgICAgICAgICAweDBlYTcKKyNkZWZpbmUgWEtfSGFuZ3VsX1NzYW5nRGlrZXVkICAgICAgICAgICAgMHgwZWE4CisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bCAgICAgICAgICAgICAgICAgIDB4MGVhOQorI2RlZmluZSBYS19IYW5ndWxfUmlldWxLaXllb2cgICAgICAgICAgICAweDBlYWEKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsTWlldW0gICAgICAgICAgICAgMHgwZWFiCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFBpZXViICAgICAgICAgICAgIDB4MGVhYworI2RlZmluZSBYS19IYW5ndWxfUmlldWxTaW9zICAgICAgICAgICAgICAweDBlYWQKKyNkZWZpbmUgWEtfSGFuZ3VsX1JpZXVsVGlldXQgICAgICAgICAgICAgMHgwZWFlCisjZGVmaW5lIFhLX0hhbmd1bF9SaWV1bFBoaWV1ZiAgICAgICAgICAgIDB4MGVhZgorI2RlZmluZSBYS19IYW5ndWxfUmlldWxIaWV1aCAgICAgICAgICAgICAweDBlYjAKKyNkZWZpbmUgWEtfSGFuZ3VsX01pZXVtICAgICAgICAgICAgICAgICAgMHgwZWIxCisjZGVmaW5lIFhLX0hhbmd1bF9QaWV1YiAgICAgICAgICAgICAgICAgIDB4MGViMgorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdQaWV1YiAgICAgICAgICAgICAweDBlYjMKKyNkZWZpbmUgWEtfSGFuZ3VsX1BpZXViU2lvcyAgICAgICAgICAgICAgMHgwZWI0CisjZGVmaW5lIFhLX0hhbmd1bF9TaW9zICAgICAgICAgICAgICAgICAgIDB4MGViNQorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdTaW9zICAgICAgICAgICAgICAweDBlYjYKKyNkZWZpbmUgWEtfSGFuZ3VsX0lldW5nICAgICAgICAgICAgICAgICAgMHgwZWI3CisjZGVmaW5lIFhLX0hhbmd1bF9KaWV1aiAgICAgICAgICAgICAgICAgIDB4MGViOAorI2RlZmluZSBYS19IYW5ndWxfU3NhbmdKaWV1aiAgICAgICAgICAgICAweDBlYjkKKyNkZWZpbmUgWEtfSGFuZ3VsX0NpZXVjICAgICAgICAgICAgICAgICAgMHgwZWJhCisjZGVmaW5lIFhLX0hhbmd1bF9LaGlldXEgICAgICAgICAgICAgICAgIDB4MGViYgorI2RlZmluZSBYS19IYW5ndWxfVGlldXQgICAgICAgICAgICAgICAgICAweDBlYmMKKyNkZWZpbmUgWEtfSGFuZ3VsX1BoaWV1ZiAgICAgICAgICAgICAgICAgMHgwZWJkCisjZGVmaW5lIFhLX0hhbmd1bF9IaWV1aCAgICAgICAgICAgICAgICAgIDB4MGViZQorCisvKiBIYW5ndWwgVm93ZWwgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfQSAgICAgICAgICAgICAgICAgICAgICAweDBlYmYKKyNkZWZpbmUgWEtfSGFuZ3VsX0FFICAgICAgICAgICAgICAgICAgICAgMHgwZWMwCisjZGVmaW5lIFhLX0hhbmd1bF9ZQSAgICAgICAgICAgICAgICAgICAgIDB4MGVjMQorI2RlZmluZSBYS19IYW5ndWxfWUFFICAgICAgICAgICAgICAgICAgICAweDBlYzIKKyNkZWZpbmUgWEtfSGFuZ3VsX0VPICAgICAgICAgICAgICAgICAgICAgMHgwZWMzCisjZGVmaW5lIFhLX0hhbmd1bF9FICAgICAgICAgICAgICAgICAgICAgIDB4MGVjNAorI2RlZmluZSBYS19IYW5ndWxfWUVPICAgICAgICAgICAgICAgICAgICAweDBlYzUKKyNkZWZpbmUgWEtfSGFuZ3VsX1lFICAgICAgICAgICAgICAgICAgICAgMHgwZWM2CisjZGVmaW5lIFhLX0hhbmd1bF9PICAgICAgICAgICAgICAgICAgICAgIDB4MGVjNworI2RlZmluZSBYS19IYW5ndWxfV0EgICAgICAgICAgICAgICAgICAgICAweDBlYzgKKyNkZWZpbmUgWEtfSGFuZ3VsX1dBRSAgICAgICAgICAgICAgICAgICAgMHgwZWM5CisjZGVmaW5lIFhLX0hhbmd1bF9PRSAgICAgICAgICAgICAgICAgICAgIDB4MGVjYQorI2RlZmluZSBYS19IYW5ndWxfWU8gICAgICAgICAgICAgICAgICAgICAweDBlY2IKKyNkZWZpbmUgWEtfSGFuZ3VsX1UgICAgICAgICAgICAgICAgICAgICAgMHgwZWNjCisjZGVmaW5lIFhLX0hhbmd1bF9XRU8gICAgICAgICAgICAgICAgICAgIDB4MGVjZAorI2RlZmluZSBYS19IYW5ndWxfV0UgICAgICAgICAgICAgICAgICAgICAweDBlY2UKKyNkZWZpbmUgWEtfSGFuZ3VsX1dJICAgICAgICAgICAgICAgICAgICAgMHgwZWNmCisjZGVmaW5lIFhLX0hhbmd1bF9ZVSAgICAgICAgICAgICAgICAgICAgIDB4MGVkMAorI2RlZmluZSBYS19IYW5ndWxfRVUgICAgICAgICAgICAgICAgICAgICAweDBlZDEKKyNkZWZpbmUgWEtfSGFuZ3VsX1lJICAgICAgICAgICAgICAgICAgICAgMHgwZWQyCisjZGVmaW5lIFhLX0hhbmd1bF9JICAgICAgICAgICAgICAgICAgICAgIDB4MGVkMworCisvKiBIYW5ndWwgc3lsbGFibGUtZmluYWwgKEpvbmdTZW9uZykgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfSl9LaXllb2cgICAgICAgICAgICAgICAweDBlZDQKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfU3NhbmdLaXllb2cgICAgICAgICAgMHgwZWQ1CisjZGVmaW5lIFhLX0hhbmd1bF9KX0tpeWVvZ1Npb3MgICAgICAgICAgIDB4MGVkNgorI2RlZmluZSBYS19IYW5ndWxfSl9OaWV1biAgICAgICAgICAgICAgICAweDBlZDcKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfTmlldW5KaWV1aiAgICAgICAgICAgMHgwZWQ4CisjZGVmaW5lIFhLX0hhbmd1bF9KX05pZXVuSGlldWggICAgICAgICAgIDB4MGVkOQorI2RlZmluZSBYS19IYW5ndWxfSl9EaWtldWQgICAgICAgICAgICAgICAweDBlZGEKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWwgICAgICAgICAgICAgICAgMHgwZWRiCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsS2l5ZW9nICAgICAgICAgIDB4MGVkYworI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bE1pZXVtICAgICAgICAgICAweDBlZGQKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxQaWV1YiAgICAgICAgICAgMHgwZWRlCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsU2lvcyAgICAgICAgICAgIDB4MGVkZgorI2RlZmluZSBYS19IYW5ndWxfSl9SaWV1bFRpZXV0ICAgICAgICAgICAweDBlZTAKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUmlldWxQaGlldWYgICAgICAgICAgMHgwZWUxCisjZGVmaW5lIFhLX0hhbmd1bF9KX1JpZXVsSGlldWggICAgICAgICAgIDB4MGVlMgorI2RlZmluZSBYS19IYW5ndWxfSl9NaWV1bSAgICAgICAgICAgICAgICAweDBlZTMKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUGlldWIgICAgICAgICAgICAgICAgMHgwZWU0CisjZGVmaW5lIFhLX0hhbmd1bF9KX1BpZXViU2lvcyAgICAgICAgICAgIDB4MGVlNQorI2RlZmluZSBYS19IYW5ndWxfSl9TaW9zICAgICAgICAgICAgICAgICAweDBlZTYKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfU3NhbmdTaW9zICAgICAgICAgICAgMHgwZWU3CisjZGVmaW5lIFhLX0hhbmd1bF9KX0lldW5nICAgICAgICAgICAgICAgIDB4MGVlOAorI2RlZmluZSBYS19IYW5ndWxfSl9KaWV1aiAgICAgICAgICAgICAgICAweDBlZTkKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfQ2lldWMgICAgICAgICAgICAgICAgMHgwZWVhCisjZGVmaW5lIFhLX0hhbmd1bF9KX0toaWV1cSAgICAgICAgICAgICAgIDB4MGVlYgorI2RlZmluZSBYS19IYW5ndWxfSl9UaWV1dCAgICAgICAgICAgICAgICAweDBlZWMKKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUGhpZXVmICAgICAgICAgICAgICAgMHgwZWVkCisjZGVmaW5lIFhLX0hhbmd1bF9KX0hpZXVoICAgICAgICAgICAgICAgIDB4MGVlZQorCisvKiBBbmNpZW50IEhhbmd1bCBDb25zb25hbnQgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfUmlldWxZZW9yaW5IaWV1aCAgICAgICAweDBlZWYKKyNkZWZpbmUgWEtfSGFuZ3VsX1N1bmt5ZW9uZ2V1bU1pZXVtICAgICAgMHgwZWYwCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaWV1YiAgICAgIDB4MGVmMQorI2RlZmluZSBYS19IYW5ndWxfUGFuU2lvcyAgICAgICAgICAgICAgICAweDBlZjIKKyNkZWZpbmUgWEtfSGFuZ3VsX0trb2dqaURhbHJpbklldW5nICAgICAgMHgwZWYzCisjZGVmaW5lIFhLX0hhbmd1bF9TdW5reWVvbmdldW1QaGlldWYgICAgIDB4MGVmNAorI2RlZmluZSBYS19IYW5ndWxfWWVvcmluSGlldWggICAgICAgICAgICAweDBlZjUKKworLyogQW5jaWVudCBIYW5ndWwgVm93ZWwgQ2hhcmFjdGVycyAqLworI2RlZmluZSBYS19IYW5ndWxfQXJhZUEgICAgICAgICAgICAgICAgICAweDBlZjYKKyNkZWZpbmUgWEtfSGFuZ3VsX0FyYWVBRSAgICAgICAgICAgICAgICAgMHgwZWY3CisKKy8qIEFuY2llbnQgSGFuZ3VsIHN5bGxhYmxlLWZpbmFsIChKb25nU2VvbmcpIENoYXJhY3RlcnMgKi8KKyNkZWZpbmUgWEtfSGFuZ3VsX0pfUGFuU2lvcyAgICAgICAgICAgICAgMHgwZWY4CisjZGVmaW5lIFhLX0hhbmd1bF9KX0trb2dqaURhbHJpbklldW5nICAgIDB4MGVmOQorI2RlZmluZSBYS19IYW5ndWxfSl9ZZW9yaW5IaWV1aCAgICAgICAgICAweDBlZmEKKworLyogS29yZWFuIGN1cnJlbmN5IHN5bWJvbCAqLworI2RlZmluZSBYS19Lb3JlYW5fV29uICAgICAgICAgICAgICAgICAgICAweDBlZmYgIC8qKFUrMjBBOSBXT04gU0lHTikqLworCisjZW5kaWYgLyogWEtfS09SRUFOICovCisKKy8qCisgKiBBcm1lbmlhbgorICovCisKKyNpZmRlZiBYS19BUk1FTklBTgorI2RlZmluZSBYS19Bcm1lbmlhbl9saWdhdHVyZV9ldyAgICAgICAweDEwMDA1ODcgIC8qIFUrMDU4NyBBUk1FTklBTiBTTUFMTCBMSUdBVFVSRSBFQ0ggWUlXTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9mdWxsX3N0b3AgICAgICAgICAweDEwMDA1ODkgIC8qIFUrMDU4OSBBUk1FTklBTiBGVUxMIFNUT1AgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdmVyamFrZXQgICAgICAgICAgMHgxMDAwNTg5ICAvKiBVKzA1ODkgQVJNRU5JQU4gRlVMTCBTVE9QICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3NlcGFyYXRpb25fbWFyayAgIDB4MTAwMDU1ZCAgLyogVSswNTVEIEFSTUVOSUFOIENPTU1BICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2J1dCAgICAgICAgICAgICAgIDB4MTAwMDU1ZCAgLyogVSswNTVEIEFSTUVOSUFOIENPTU1BICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2h5cGhlbiAgICAgICAgICAgIDB4MTAwMDU4YSAgLyogVSswNThBIEFSTUVOSUFOIEhZUEhFTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl95ZW50YW1uYSAgICAgICAgICAweDEwMDA1OGEgIC8qIFUrMDU4QSBBUk1FTklBTiBIWVBIRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZXhjbGFtICAgICAgICAgICAgMHgxMDAwNTVjICAvKiBVKzA1NUMgQVJNRU5JQU4gRVhDTEFNQVRJT04gTUFSSyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9hbWFuYWsgICAgICAgICAgICAweDEwMDA1NWMgIC8qIFUrMDU1QyBBUk1FTklBTiBFWENMQU1BVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2FjY2VudCAgICAgICAgICAgIDB4MTAwMDU1YiAgLyogVSswNTVCIEFSTUVOSUFOIEVNUEhBU0lTIE1BUksgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fc2hlc2h0ICAgICAgICAgICAgMHgxMDAwNTViICAvKiBVKzA1NUIgQVJNRU5JQU4gRU1QSEFTSVMgTUFSSyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9xdWVzdGlvbiAgICAgICAgICAweDEwMDA1NWUgIC8qIFUrMDU1RSBBUk1FTklBTiBRVUVTVElPTiBNQVJLICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3BhcnV5ayAgICAgICAgICAgIDB4MTAwMDU1ZSAgLyogVSswNTVFIEFSTUVOSUFOIFFVRVNUSU9OIE1BUksgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fQVlCICAgICAgICAgICAgICAgMHgxMDAwNTMxICAvKiBVKzA1MzEgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQVlCICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2F5YiAgICAgICAgICAgICAgIDB4MTAwMDU2MSAgLyogVSswNTYxIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBBWUIgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fQkVOICAgICAgICAgICAgICAgMHgxMDAwNTMyICAvKiBVKzA1MzIgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQkVOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2JlbiAgICAgICAgICAgICAgIDB4MTAwMDU2MiAgLyogVSswNTYyIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBCRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fR0lNICAgICAgICAgICAgICAgMHgxMDAwNTMzICAvKiBVKzA1MzMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgR0lNICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2dpbSAgICAgICAgICAgICAgIDB4MTAwMDU2MyAgLyogVSswNTYzIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBHSU0gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fREEgICAgICAgICAgICAgICAgMHgxMDAwNTM0ICAvKiBVKzA1MzQgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgREEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZGEgICAgICAgICAgICAgICAgMHgxMDAwNTY0ICAvKiBVKzA1NjQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIERBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1lFQ0ggICAgICAgICAgICAgIDB4MTAwMDUzNSAgLyogVSswNTM1IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEVDSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl95ZWNoICAgICAgICAgICAgICAweDEwMDA1NjUgIC8qIFUrMDU2NSBBUk1FTklBTiBTTUFMTCBMRVRURVIgRUNIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1pBICAgICAgICAgICAgICAgIDB4MTAwMDUzNiAgLyogVSswNTM2IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFpBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3phICAgICAgICAgICAgICAgIDB4MTAwMDU2NiAgLyogVSswNTY2IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBaQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9FICAgICAgICAgICAgICAgICAweDEwMDA1MzcgIC8qIFUrMDUzNyBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9lICAgICAgICAgICAgICAgICAweDEwMDA1NjcgIC8qIFUrMDU2NyBBUk1FTklBTiBTTUFMTCBMRVRURVIgRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fQVQgICAgICAgICAgICAgICAgMHgxMDAwNTM4ICAvKiBVKzA1MzggQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgRVQgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fYXQgICAgICAgICAgICAgICAgMHgxMDAwNTY4ICAvKiBVKzA1NjggQVJNRU5JQU4gU01BTEwgTEVUVEVSIEVUICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RPICAgICAgICAgICAgICAgIDB4MTAwMDUzOSAgLyogVSswNTM5IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFRPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3RvICAgICAgICAgICAgICAgIDB4MTAwMDU2OSAgLyogVSswNTY5IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBUTyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9aSEUgICAgICAgICAgICAgICAweDEwMDA1M2EgIC8qIFUrMDUzQSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBaSEUgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5femhlICAgICAgICAgICAgICAgMHgxMDAwNTZhICAvKiBVKzA1NkEgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFpIRSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9JTkkgICAgICAgICAgICAgICAweDEwMDA1M2IgIC8qIFUrMDUzQiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBJTkkgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5faW5pICAgICAgICAgICAgICAgMHgxMDAwNTZiICAvKiBVKzA1NkIgQVJNRU5JQU4gU01BTEwgTEVUVEVSIElOSSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9MWVVOICAgICAgICAgICAgICAweDEwMDA1M2MgIC8qIFUrMDUzQyBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBMSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2x5dW4gICAgICAgICAgICAgIDB4MTAwMDU2YyAgLyogVSswNTZDIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBMSVdOICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0tIRSAgICAgICAgICAgICAgIDB4MTAwMDUzZCAgLyogVSswNTNEIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFhFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9raGUgICAgICAgICAgICAgICAweDEwMDA1NmQgIC8qIFUrMDU2RCBBUk1FTklBTiBTTUFMTCBMRVRURVIgWEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RTQSAgICAgICAgICAgICAgIDB4MTAwMDUzZSAgLyogVSswNTNFIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIENBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3RzYSAgICAgICAgICAgICAgIDB4MTAwMDU2ZSAgLyogVSswNTZFIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBDQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9LRU4gICAgICAgICAgICAgICAweDEwMDA1M2YgIC8qIFUrMDUzRiBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBLRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fa2VuICAgICAgICAgICAgICAgMHgxMDAwNTZmICAvKiBVKzA1NkYgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEtFTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9ITyAgICAgICAgICAgICAgICAweDEwMDA1NDAgIC8qIFUrMDU0MCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBITyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9obyAgICAgICAgICAgICAgICAweDEwMDA1NzAgIC8qIFUrMDU3MCBBUk1FTklBTiBTTUFMTCBMRVRURVIgSE8gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fRFpBICAgICAgICAgICAgICAgMHgxMDAwNTQxICAvKiBVKzA1NDEgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgSkEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZHphICAgICAgICAgICAgICAgMHgxMDAwNTcxICAvKiBVKzA1NzEgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEpBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0dIQVQgICAgICAgICAgICAgIDB4MTAwMDU0MiAgLyogVSswNTQyIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEdIQUQgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fZ2hhdCAgICAgICAgICAgICAgMHgxMDAwNTcyICAvKiBVKzA1NzIgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEdIQUQgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fVENIRSAgICAgICAgICAgICAgMHgxMDAwNTQzICAvKiBVKzA1NDMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQ0hFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl90Y2hlICAgICAgICAgICAgICAweDEwMDA1NzMgIC8qIFUrMDU3MyBBUk1FTklBTiBTTUFMTCBMRVRURVIgQ0hFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9NRU4gICAgICAgICAgICAgICAweDEwMDA1NDQgIC8qIFUrMDU0NCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBNRU4gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fbWVuICAgICAgICAgICAgICAgMHgxMDAwNTc0ICAvKiBVKzA1NzQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIE1FTiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9ISSAgICAgICAgICAgICAgICAweDEwMDA1NDUgIC8qIFUrMDU0NSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBZSSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9oaSAgICAgICAgICAgICAgICAweDEwMDA1NzUgIC8qIFUrMDU3NSBBUk1FTklBTiBTTUFMTCBMRVRURVIgWUkgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fTlUgICAgICAgICAgICAgICAgMHgxMDAwNTQ2ICAvKiBVKzA1NDYgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgTk9XICovCisjZGVmaW5lIFhLX0FybWVuaWFuX251ICAgICAgICAgICAgICAgIDB4MTAwMDU3NiAgLyogVSswNTc2IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBOT1cgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fU0hBICAgICAgICAgICAgICAgMHgxMDAwNTQ3ICAvKiBVKzA1NDcgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgU0hBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3NoYSAgICAgICAgICAgICAgIDB4MTAwMDU3NyAgLyogVSswNTc3IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBTSEEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fVk8gICAgICAgICAgICAgICAgMHgxMDAwNTQ4ICAvKiBVKzA1NDggQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgVk8gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdm8gICAgICAgICAgICAgICAgMHgxMDAwNTc4ICAvKiBVKzA1NzggQVJNRU5JQU4gU01BTEwgTEVUVEVSIFZPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0NIQSAgICAgICAgICAgICAgIDB4MTAwMDU0OSAgLyogVSswNTQ5IEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIENIQSAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9jaGEgICAgICAgICAgICAgICAweDEwMDA1NzkgIC8qIFUrMDU3OSBBUk1FTklBTiBTTUFMTCBMRVRURVIgQ0hBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1BFICAgICAgICAgICAgICAgIDB4MTAwMDU0YSAgLyogVSswNTRBIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFBFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9wZSAgICAgICAgICAgICAgICAweDEwMDA1N2EgIC8qIFUrMDU3QSBBUk1FTklBTiBTTUFMTCBMRVRURVIgUEVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX0pFICAgICAgICAgICAgICAgIDB4MTAwMDU0YiAgLyogVSswNTRCIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIEpIRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5famUgICAgICAgICAgICAgICAgMHgxMDAwNTdiICAvKiBVKzA1N0IgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEpIRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fUkEgICAgICAgICAgICAgICAgMHgxMDAwNTRjICAvKiBVKzA1NEMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgUkEgKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fcmEgICAgICAgICAgICAgICAgMHgxMDAwNTdjICAvKiBVKzA1N0MgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFJBICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1NFICAgICAgICAgICAgICAgIDB4MTAwMDU0ZCAgLyogVSswNTREIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFNFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9zZSAgICAgICAgICAgICAgICAweDEwMDA1N2QgIC8qIFUrMDU3RCBBUk1FTklBTiBTTUFMTCBMRVRURVIgU0VIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1ZFViAgICAgICAgICAgICAgIDB4MTAwMDU0ZSAgLyogVSswNTRFIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFZFVyAqLworI2RlZmluZSBYS19Bcm1lbmlhbl92ZXYgICAgICAgICAgICAgICAweDEwMDA1N2UgIC8qIFUrMDU3RSBBUk1FTklBTiBTTUFMTCBMRVRURVIgVkVXICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1RZVU4gICAgICAgICAgICAgIDB4MTAwMDU0ZiAgLyogVSswNTRGIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFRJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdHl1biAgICAgICAgICAgICAgMHgxMDAwNTdmICAvKiBVKzA1N0YgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFRJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fUkUgICAgICAgICAgICAgICAgMHgxMDAwNTUwICAvKiBVKzA1NTAgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgUkVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX3JlICAgICAgICAgICAgICAgIDB4MTAwMDU4MCAgLyogVSswNTgwIEFSTUVOSUFOIFNNQUxMIExFVFRFUiBSRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fVFNPICAgICAgICAgICAgICAgMHgxMDAwNTUxICAvKiBVKzA1NTEgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgQ08gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdHNvICAgICAgICAgICAgICAgMHgxMDAwNTgxICAvKiBVKzA1ODEgQVJNRU5JQU4gU01BTEwgTEVUVEVSIENPICovCisjZGVmaW5lIFhLX0FybWVuaWFuX1ZZVU4gICAgICAgICAgICAgIDB4MTAwMDU1MiAgLyogVSswNTUyIEFSTUVOSUFOIENBUElUQUwgTEVUVEVSIFlJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fdnl1biAgICAgICAgICAgICAgMHgxMDAwNTgyICAvKiBVKzA1ODIgQVJNRU5JQU4gU01BTEwgTEVUVEVSIFlJV04gKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fUFlVUiAgICAgICAgICAgICAgMHgxMDAwNTUzICAvKiBVKzA1NTMgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgUElXUiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9weXVyICAgICAgICAgICAgICAweDEwMDA1ODMgIC8qIFUrMDU4MyBBUk1FTklBTiBTTUFMTCBMRVRURVIgUElXUiAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9LRSAgICAgICAgICAgICAgICAweDEwMDA1NTQgIC8qIFUrMDU1NCBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBLRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fa2UgICAgICAgICAgICAgICAgMHgxMDAwNTg0ICAvKiBVKzA1ODQgQVJNRU5JQU4gU01BTEwgTEVUVEVSIEtFSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9PICAgICAgICAgICAgICAgICAweDEwMDA1NTUgIC8qIFUrMDU1NSBBUk1FTklBTiBDQVBJVEFMIExFVFRFUiBPSCAqLworI2RlZmluZSBYS19Bcm1lbmlhbl9vICAgICAgICAgICAgICAgICAweDEwMDA1ODUgIC8qIFUrMDU4NSBBUk1FTklBTiBTTUFMTCBMRVRURVIgT0ggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fRkUgICAgICAgICAgICAgICAgMHgxMDAwNTU2ICAvKiBVKzA1NTYgQVJNRU5JQU4gQ0FQSVRBTCBMRVRURVIgRkVIICovCisjZGVmaW5lIFhLX0FybWVuaWFuX2ZlICAgICAgICAgICAgICAgIDB4MTAwMDU4NiAgLyogVSswNTg2IEFSTUVOSUFOIFNNQUxMIExFVFRFUiBGRUggKi8KKyNkZWZpbmUgWEtfQXJtZW5pYW5fYXBvc3Ryb3BoZSAgICAgICAgMHgxMDAwNTVhICAvKiBVKzA1NUEgQVJNRU5JQU4gQVBPU1RST1BIRSAqLworI2VuZGlmIC8qIFhLX0FSTUVOSUFOICovCisKKy8qCisgKiBHZW9yZ2lhbgorICovCisKKyNpZmRlZiBYS19HRU9SR0lBTgorI2RlZmluZSBYS19HZW9yZ2lhbl9hbiAgICAgICAgICAgICAgICAweDEwMDEwZDAgIC8qIFUrMTBEMCBHRU9SR0lBTiBMRVRURVIgQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fYmFuICAgICAgICAgICAgICAgMHgxMDAxMGQxICAvKiBVKzEwRDEgR0VPUkdJQU4gTEVUVEVSIEJBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9nYW4gICAgICAgICAgICAgICAweDEwMDEwZDIgIC8qIFUrMTBEMiBHRU9SR0lBTiBMRVRURVIgR0FOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2RvbiAgICAgICAgICAgICAgIDB4MTAwMTBkMyAgLyogVSsxMEQzIEdFT1JHSUFOIExFVFRFUiBET04gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fZW4gICAgICAgICAgICAgICAgMHgxMDAxMGQ0ICAvKiBVKzEwRDQgR0VPUkdJQU4gTEVUVEVSIEVOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3ZpbiAgICAgICAgICAgICAgIDB4MTAwMTBkNSAgLyogVSsxMEQ1IEdFT1JHSUFOIExFVFRFUiBWSU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5femVuICAgICAgICAgICAgICAgMHgxMDAxMGQ2ICAvKiBVKzEwRDYgR0VPUkdJQU4gTEVUVEVSIFpFTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl90YW4gICAgICAgICAgICAgICAweDEwMDEwZDcgIC8qIFUrMTBENyBHRU9SR0lBTiBMRVRURVIgVEFOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2luICAgICAgICAgICAgICAgIDB4MTAwMTBkOCAgLyogVSsxMEQ4IEdFT1JHSUFOIExFVFRFUiBJTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9rYW4gICAgICAgICAgICAgICAweDEwMDEwZDkgIC8qIFUrMTBEOSBHRU9SR0lBTiBMRVRURVIgS0FOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2xhcyAgICAgICAgICAgICAgIDB4MTAwMTBkYSAgLyogVSsxMERBIEdFT1JHSUFOIExFVFRFUiBMQVMgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fbWFuICAgICAgICAgICAgICAgMHgxMDAxMGRiICAvKiBVKzEwREIgR0VPUkdJQU4gTEVUVEVSIE1BTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9uYXIgICAgICAgICAgICAgICAweDEwMDEwZGMgIC8qIFUrMTBEQyBHRU9SR0lBTiBMRVRURVIgTkFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX29uICAgICAgICAgICAgICAgIDB4MTAwMTBkZCAgLyogVSsxMEREIEdFT1JHSUFOIExFVFRFUiBPTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9wYXIgICAgICAgICAgICAgICAweDEwMDEwZGUgIC8qIFUrMTBERSBHRU9SR0lBTiBMRVRURVIgUEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3poYXIgICAgICAgICAgICAgIDB4MTAwMTBkZiAgLyogVSsxMERGIEdFT1JHSUFOIExFVFRFUiBaSEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3JhZSAgICAgICAgICAgICAgIDB4MTAwMTBlMCAgLyogVSsxMEUwIEdFT1JHSUFOIExFVFRFUiBSQUUgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5fc2FuICAgICAgICAgICAgICAgMHgxMDAxMGUxICAvKiBVKzEwRTEgR0VPUkdJQU4gTEVUVEVSIFNBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl90YXIgICAgICAgICAgICAgICAweDEwMDEwZTIgIC8qIFUrMTBFMiBHRU9SR0lBTiBMRVRURVIgVEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3VuICAgICAgICAgICAgICAgIDB4MTAwMTBlMyAgLyogVSsxMEUzIEdFT1JHSUFOIExFVFRFUiBVTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9waGFyICAgICAgICAgICAgICAweDEwMDEwZTQgIC8qIFUrMTBFNCBHRU9SR0lBTiBMRVRURVIgUEhBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9raGFyICAgICAgICAgICAgICAweDEwMDEwZTUgIC8qIFUrMTBFNSBHRU9SR0lBTiBMRVRURVIgS0hBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9naGFuICAgICAgICAgICAgICAweDEwMDEwZTYgIC8qIFUrMTBFNiBHRU9SR0lBTiBMRVRURVIgR0hBTiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9xYXIgICAgICAgICAgICAgICAweDEwMDEwZTcgIC8qIFUrMTBFNyBHRU9SR0lBTiBMRVRURVIgUUFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3NoaW4gICAgICAgICAgICAgIDB4MTAwMTBlOCAgLyogVSsxMEU4IEdFT1JHSUFOIExFVFRFUiBTSElOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2NoaW4gICAgICAgICAgICAgIDB4MTAwMTBlOSAgLyogVSsxMEU5IEdFT1JHSUFOIExFVFRFUiBDSElOICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2NhbiAgICAgICAgICAgICAgIDB4MTAwMTBlYSAgLyogVSsxMEVBIEdFT1JHSUFOIExFVFRFUiBDQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5famlsICAgICAgICAgICAgICAgMHgxMDAxMGViICAvKiBVKzEwRUIgR0VPUkdJQU4gTEVUVEVSIEpJTCAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9jaWwgICAgICAgICAgICAgICAweDEwMDEwZWMgIC8qIFUrMTBFQyBHRU9SR0lBTiBMRVRURVIgQ0lMICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2NoYXIgICAgICAgICAgICAgIDB4MTAwMTBlZCAgLyogVSsxMEVEIEdFT1JHSUFOIExFVFRFUiBDSEFSICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX3hhbiAgICAgICAgICAgICAgIDB4MTAwMTBlZSAgLyogVSsxMEVFIEdFT1JHSUFOIExFVFRFUiBYQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5famhhbiAgICAgICAgICAgICAgMHgxMDAxMGVmICAvKiBVKzEwRUYgR0VPUkdJQU4gTEVUVEVSIEpIQU4gKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGFlICAgICAgICAgICAgICAgMHgxMDAxMGYwICAvKiBVKzEwRjAgR0VPUkdJQU4gTEVUVEVSIEhBRSAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9oZSAgICAgICAgICAgICAgICAweDEwMDEwZjEgIC8qIFUrMTBGMSBHRU9SR0lBTiBMRVRURVIgSEUgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGllICAgICAgICAgICAgICAgMHgxMDAxMGYyICAvKiBVKzEwRjIgR0VPUkdJQU4gTEVUVEVSIEhJRSAqLworI2RlZmluZSBYS19HZW9yZ2lhbl93ZSAgICAgICAgICAgICAgICAweDEwMDEwZjMgIC8qIFUrMTBGMyBHRU9SR0lBTiBMRVRURVIgV0UgKi8KKyNkZWZpbmUgWEtfR2VvcmdpYW5faGFyICAgICAgICAgICAgICAgMHgxMDAxMGY0ICAvKiBVKzEwRjQgR0VPUkdJQU4gTEVUVEVSIEhBUiAqLworI2RlZmluZSBYS19HZW9yZ2lhbl9ob2UgICAgICAgICAgICAgICAweDEwMDEwZjUgIC8qIFUrMTBGNSBHRU9SR0lBTiBMRVRURVIgSE9FICovCisjZGVmaW5lIFhLX0dlb3JnaWFuX2ZpICAgICAgICAgICAgICAgIDB4MTAwMTBmNiAgLyogVSsxMEY2IEdFT1JHSUFOIExFVFRFUiBGSSAqLworI2VuZGlmIC8qIFhLX0dFT1JHSUFOICovCisKKy8qCisgKiBBemVyaSAoYW5kIG90aGVyIFR1cmtpYyBvciBDYXVjYXNpYW4gbGFuZ3VhZ2VzKQorICovCisKKyNpZmRlZiBYS19DQVVDQVNVUworLyogbGF0aW4gKi8KKyNkZWZpbmUgWEtfWGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZThhICAvKiBVKzFFOEEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCBXSVRIIERPVCBBQk9WRSAqLworI2RlZmluZSBYS19JYnJldmUgICAgICAgICAgICAgICAgICAgICAweDEwMDAxMmMgIC8qIFUrMDEyQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQlJFVkUgKi8KKyNkZWZpbmUgWEtfWnN0cm9rZSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWI1ICAvKiBVKzAxQjUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19HY2Fyb24gICAgICAgICAgICAgICAgICAgICAweDEwMDAxZTYgIC8qIFUrMDFFNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfT2Nhcm9uICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWQxICAvKiBVKzAxRDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX09iYXJyZWQgICAgICAgICAgICAgICAgICAgIDB4MTAwMDE5ZiAgLyogVSswMTlGIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNSURETEUgVElMREUgKi8KKyNkZWZpbmUgWEtfeGFib3ZlZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZThiICAvKiBVKzFFOEIgTEFUSU4gU01BTEwgTEVUVEVSIFggV0lUSCBET1QgQUJPVkUgKi8KKyNkZWZpbmUgWEtfaWJyZXZlICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMTJkICAvKiBVKzAxMkQgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBCUkVWRSAqLworI2RlZmluZSBYS196c3Ryb2tlICAgICAgICAgICAgICAgICAgICAweDEwMDAxYjYgIC8qIFUrMDFCNiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIFNUUk9LRSAqLworI2RlZmluZSBYS19nY2Fyb24gICAgICAgICAgICAgICAgICAgICAweDEwMDAxZTcgIC8qIFUrMDFFNyBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENBUk9OICovCisjZGVmaW5lIFhLX29jYXJvbiAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFkMiAgLyogVSswMUQyIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0FST04gKi8KKyNkZWZpbmUgWEtfb2JhcnJlZCAgICAgICAgICAgICAgICAgICAgMHgxMDAwMjc1ICAvKiBVKzAyNzUgTEFUSU4gU01BTEwgTEVUVEVSIEJBUlJFRCBPICovCisjZGVmaW5lIFhLX1NDSFdBICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDE4ZiAgLyogVSswMThGIExBVElOIENBUElUQUwgTEVUVEVSIFNDSFdBICovCisjZGVmaW5lIFhLX3NjaHdhICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDI1OSAgLyogVSswMjU5IExBVElOIFNNQUxMIExFVFRFUiBTQ0hXQSAqLworLyogdGhvc2UgYXJlIG5vdCByZWFsbHkgQ2F1Y2FzdXMgKi8KKy8qIEZvciBJbnVwaWFrICovCisjZGVmaW5lIFhLX0xiZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWUzNiAgLyogVSsxRTM2IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfbGJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZTM3ICAvKiBVKzFFMzcgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBET1QgQkVMT1cgKi8KKyNlbmRpZiAvKiBYS19DQVVDQVNVUyAqLworCisvKgorICogVmlldG5hbWVzZQorICovCisgCisjaWZkZWYgWEtfVklFVE5BTUVTRQorI2RlZmluZSBYS19BYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlYTAgIC8qIFUrMUVBMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX2FiZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVhMSAgLyogVSsxRUExIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRE9UIEJFTE9XICovCisjZGVmaW5lIFhLX0Fob29rICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVhMiAgLyogVSsxRUEyIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX2Fob29rICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVhMyAgLyogVSsxRUEzIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleGFjdXRlICAgICAgICAgICAweDEwMDFlYTQgIC8qIFUrMUVBNCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfYWNpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWE1ICAvKiBVKzFFQTUgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBBQ1VURSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleGdyYXZlICAgICAgICAgICAweDEwMDFlYTYgIC8qIFUrMUVBNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfYWNpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWE3ICAvKiBVKzFFQTcgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYIEFORCBHUkFWRSAqLworI2RlZmluZSBYS19BY2lyY3VtZmxleGhvb2sgICAgICAgICAgICAweDEwMDFlYTggIC8qIFUrMUVBOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19hY2lyY3VtZmxleGhvb2sgICAgICAgICAgICAweDEwMDFlYTkgIC8qIFUrMUVBOSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXh0aWxkZSAgICAgICAgICAgMHgxMDAxZWFhICAvKiBVKzFFQUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX2FjaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVhYiAgLyogVSsxRUFCIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCBBTkQgVElMREUgKi8KKyNkZWZpbmUgWEtfQWNpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWFjICAvKiBVKzFFQUMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19hY2lyY3VtZmxleGJlbG93ZG90ICAgICAgICAweDEwMDFlYWQgIC8qIFUrMUVBRCBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggQU5EIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19BYnJldmVhY3V0ZSAgICAgICAgICAgICAgICAweDEwMDFlYWUgIC8qIFUrMUVBRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX2FicmV2ZWFjdXRlICAgICAgICAgICAgICAgIDB4MTAwMWVhZiAgLyogVSsxRUFGIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX0FicmV2ZWdyYXZlICAgICAgICAgICAgICAgIDB4MTAwMWViMCAgLyogVSsxRUIwIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfYWJyZXZlZ3JhdmUgICAgICAgICAgICAgICAgMHgxMDAxZWIxICAvKiBVKzFFQjEgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRSBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfQWJyZXZlaG9vayAgICAgICAgICAgICAgICAgMHgxMDAxZWIyICAvKiBVKzFFQjIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX2FicmV2ZWhvb2sgICAgICAgICAgICAgICAgIDB4MTAwMWViMyAgLyogVSsxRUIzIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfQWJyZXZldGlsZGUgICAgICAgICAgICAgICAgMHgxMDAxZWI0ICAvKiBVKzFFQjQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBUSUxERSAqLworI2RlZmluZSBYS19hYnJldmV0aWxkZSAgICAgICAgICAgICAgICAweDEwMDFlYjUgIC8qIFUrMUVCNSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBUSUxERSAqLworI2RlZmluZSBYS19BYnJldmViZWxvd2RvdCAgICAgICAgICAgICAweDEwMDFlYjYgIC8qIFUrMUVCNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUgQU5EIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19hYnJldmViZWxvd2RvdCAgICAgICAgICAgICAweDEwMDFlYjcgIC8qIFUrMUVCNyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfRWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWI4ICAvKiBVKzFFQjggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19lYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlYjkgIC8qIFUrMUVCOSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19FaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYmEgIC8qIFUrMUVCQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19laG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlYmIgIC8qIFUrMUVCQiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfRXRpbGRlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWJjICAvKiBVKzFFQkMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX2V0aWxkZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWViZCAgLyogVSsxRUJEIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWJlICAvKiBVKzFFQkUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX2VjaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWViZiAgLyogVSsxRUJGIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWMwICAvKiBVKzFFQzAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX2VjaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVjMSAgLyogVSsxRUMxIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfRWNpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWMyICAvKiBVKzFFQzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWMzICAvKiBVKzFFQzMgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVjNCAgLyogVSsxRUM0IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19lY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlYzUgIC8qIFUrMUVDNSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX0VjaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVjNiAgLyogVSsxRUM2IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfZWNpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWM3ICAvKiBVKzFFQzcgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfSWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWM4ICAvKiBVKzFFQzggTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfaWhvb2sgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWM5ICAvKiBVKzFFQzkgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX0liZWxvd2RvdCAgICAgICAgICAgICAgICAgIDB4MTAwMWVjYSAgLyogVSsxRUNBIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfaWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWNiICAvKiBVKzFFQ0IgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfT2JlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWNjICAvKiBVKzFFQ0MgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19vYmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlY2QgIC8qIFUrMUVDRCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19PaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlY2UgIC8qIFUrMUVDRSBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS19vaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlY2YgIC8qIFUrMUVDRiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXhhY3V0ZSAgICAgICAgICAgMHgxMDAxZWQwICAvKiBVKzFFRDAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4YWN1dGUgICAgICAgICAgIDB4MTAwMWVkMSAgLyogVSsxRUQxIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXhncmF2ZSAgICAgICAgICAgMHgxMDAxZWQyICAvKiBVKzFFRDIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX29jaXJjdW1mbGV4Z3JhdmUgICAgICAgICAgIDB4MTAwMWVkMyAgLyogVSsxRUQzIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfT2NpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWQ0ICAvKiBVKzFFRDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfb2NpcmN1bWZsZXhob29rICAgICAgICAgICAgMHgxMDAxZWQ1ICAvKiBVKzFFRDUgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4dGlsZGUgICAgICAgICAgIDB4MTAwMWVkNiAgLyogVSsxRUQ2IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBUSUxERSAqLworI2RlZmluZSBYS19vY2lyY3VtZmxleHRpbGRlICAgICAgICAgICAweDEwMDFlZDcgIC8qIFUrMUVENyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggQU5EIFRJTERFICovCisjZGVmaW5lIFhLX09jaXJjdW1mbGV4YmVsb3dkb3QgICAgICAgIDB4MTAwMWVkOCAgLyogVSsxRUQ4IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfb2NpcmN1bWZsZXhiZWxvd2RvdCAgICAgICAgMHgxMDAxZWQ5ICAvKiBVKzFFRDkgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfT2hvcm5hY3V0ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWRhICAvKiBVKzFFREEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX29ob3JuYWN1dGUgICAgICAgICAgICAgICAgIDB4MTAwMWVkYiAgLyogVSsxRURCIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfT2hvcm5ncmF2ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWRjICAvKiBVKzFFREMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX29ob3JuZ3JhdmUgICAgICAgICAgICAgICAgIDB4MTAwMWVkZCAgLyogVSsxRUREIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggSE9STiBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfT2hvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWRlICAvKiBVKzFFREUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfb2hvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWRmICAvKiBVKzFFREYgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX09ob3JudGlsZGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlMCAgLyogVSsxRUUwIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBUSUxERSAqLworI2RlZmluZSBYS19vaG9ybnRpbGRlICAgICAgICAgICAgICAgICAweDEwMDFlZTEgIC8qIFUrMUVFMSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4gQU5EIFRJTERFICovCisjZGVmaW5lIFhLX09ob3JuYmVsb3dkb3QgICAgICAgICAgICAgIDB4MTAwMWVlMiAgLyogVSsxRUUyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfb2hvcm5iZWxvd2RvdCAgICAgICAgICAgICAgMHgxMDAxZWUzICAvKiBVKzFFRTMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfVWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWU0ICAvKiBVKzFFRTQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS191YmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlZTUgIC8qIFUrMUVFNSBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19VaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZTYgIC8qIFUrMUVFNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS191aG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZTcgIC8qIFUrMUVFNyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfVWhvcm5hY3V0ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWU4ICAvKiBVKzFFRTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEFDVVRFICovCisjZGVmaW5lIFhLX3Vob3JuYWN1dGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlOSAgLyogVSsxRUU5IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgQUNVVEUgKi8KKyNkZWZpbmUgWEtfVWhvcm5ncmF2ZSAgICAgICAgICAgICAgICAgMHgxMDAxZWVhICAvKiBVKzFFRUEgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEdSQVZFICovCisjZGVmaW5lIFhLX3Vob3JuZ3JhdmUgICAgICAgICAgICAgICAgIDB4MTAwMWVlYiAgLyogVSsxRUVCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiBBTkQgR1JBVkUgKi8KKyNkZWZpbmUgWEtfVWhvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWVjICAvKiBVKzFFRUMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfdWhvcm5ob29rICAgICAgICAgICAgICAgICAgMHgxMDAxZWVkICAvKiBVKzFFRUQgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBIT09LIEFCT1ZFICovCisjZGVmaW5lIFhLX1Vob3JudGlsZGUgICAgICAgICAgICAgICAgIDB4MTAwMWVlZSAgLyogVSsxRUVFIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBUSUxERSAqLworI2RlZmluZSBYS191aG9ybnRpbGRlICAgICAgICAgICAgICAgICAweDEwMDFlZWYgIC8qIFUrMUVFRiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEhPUk4gQU5EIFRJTERFICovCisjZGVmaW5lIFhLX1Vob3JuYmVsb3dkb3QgICAgICAgICAgICAgIDB4MTAwMWVmMCAgLyogVSsxRUYwIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfdWhvcm5iZWxvd2RvdCAgICAgICAgICAgICAgMHgxMDAxZWYxICAvKiBVKzFFRjEgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOIEFORCBET1QgQkVMT1cgKi8KKyNkZWZpbmUgWEtfWWJlbG93ZG90ICAgICAgICAgICAgICAgICAgMHgxMDAxZWY0ICAvKiBVKzFFRjQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS195YmVsb3dkb3QgICAgICAgICAgICAgICAgICAweDEwMDFlZjUgIC8qIFUrMUVGNSBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERPVCBCRUxPVyAqLworI2RlZmluZSBYS19ZaG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjYgIC8qIFUrMUVGNiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggSE9PSyBBQk9WRSAqLworI2RlZmluZSBYS195aG9vayAgICAgICAgICAgICAgICAgICAgICAweDEwMDFlZjcgIC8qIFUrMUVGNyBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEhPT0sgQUJPVkUgKi8KKyNkZWZpbmUgWEtfWXRpbGRlICAgICAgICAgICAgICAgICAgICAgMHgxMDAxZWY4ICAvKiBVKzFFRjggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIFRJTERFICovCisjZGVmaW5lIFhLX3l0aWxkZSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMWVmOSAgLyogVSsxRUY5IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggVElMREUgKi8KKyNkZWZpbmUgWEtfT2hvcm4gICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWEwICAvKiBVKzAxQTAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEhPUk4gKi8KKyNkZWZpbmUgWEtfb2hvcm4gICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMWExICAvKiBVKzAxQTEgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOICovCisjZGVmaW5lIFhLX1Vob3JuICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFhZiAgLyogVSswMUFGIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOICovCisjZGVmaW5lIFhLX3Vob3JuICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDFiMCAgLyogVSswMUIwIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STiAqLworCisjZW5kaWYgLyogWEtfVklFVE5BTUVTRSAqLworCisjaWZkZWYgWEtfQ1VSUkVOQ1kKKyNkZWZpbmUgWEtfRWN1U2lnbiAgICAgICAgICAgICAgICAgICAgMHgxMDAyMGEwICAvKiBVKzIwQTAgRVVSTy1DVVJSRU5DWSBTSUdOICovCisjZGVmaW5lIFhLX0NvbG9uU2lnbiAgICAgICAgICAgICAgICAgIDB4MTAwMjBhMSAgLyogVSsyMEExIENPTE9OIFNJR04gKi8KKyNkZWZpbmUgWEtfQ3J1emVpcm9TaWduICAgICAgICAgICAgICAgMHgxMDAyMGEyICAvKiBVKzIwQTIgQ1JVWkVJUk8gU0lHTiAqLworI2RlZmluZSBYS19GRnJhbmNTaWduICAgICAgICAgICAgICAgICAweDEwMDIwYTMgIC8qIFUrMjBBMyBGUkVOQ0ggRlJBTkMgU0lHTiAqLworI2RlZmluZSBYS19MaXJhU2lnbiAgICAgICAgICAgICAgICAgICAweDEwMDIwYTQgIC8qIFUrMjBBNCBMSVJBIFNJR04gKi8KKyNkZWZpbmUgWEtfTWlsbFNpZ24gICAgICAgICAgICAgICAgICAgMHgxMDAyMGE1ICAvKiBVKzIwQTUgTUlMTCBTSUdOICovCisjZGVmaW5lIFhLX05haXJhU2lnbiAgICAgICAgICAgICAgICAgIDB4MTAwMjBhNiAgLyogVSsyMEE2IE5BSVJBIFNJR04gKi8KKyNkZWZpbmUgWEtfUGVzZXRhU2lnbiAgICAgICAgICAgICAgICAgMHgxMDAyMGE3ICAvKiBVKzIwQTcgUEVTRVRBIFNJR04gKi8KKyNkZWZpbmUgWEtfUnVwZWVTaWduICAgICAgICAgICAgICAgICAgMHgxMDAyMGE4ICAvKiBVKzIwQTggUlVQRUUgU0lHTiAqLworI2RlZmluZSBYS19Xb25TaWduICAgICAgICAgICAgICAgICAgICAweDEwMDIwYTkgIC8qIFUrMjBBOSBXT04gU0lHTiAqLworI2RlZmluZSBYS19OZXdTaGVxZWxTaWduICAgICAgICAgICAgICAweDEwMDIwYWEgIC8qIFUrMjBBQSBORVcgU0hFUUVMIFNJR04gKi8KKyNkZWZpbmUgWEtfRG9uZ1NpZ24gICAgICAgICAgICAgICAgICAgMHgxMDAyMGFiICAvKiBVKzIwQUIgRE9ORyBTSUdOICovCisjZGVmaW5lIFhLX0V1cm9TaWduICAgICAgICAgICAgICAgICAgICAgIDB4MjBhYyAgLyogVSsyMEFDIEVVUk8gU0lHTiAqLworI2VuZGlmIC8qIFhLX0NVUlJFTkNZICovCisKKyNpZmRlZiBYS19NQVRIRU1BVElDQUwKKy8qIG9uZSwgdHdvIGFuZCB0aHJlZSBhcmUgZGVmaW5lZCBhYm92ZS4gKi8KKyNkZWZpbmUgWEtfemVyb3N1cGVyaW9yICAgICAgICAgICAgICAgMHgxMDAyMDcwICAvKiBVKzIwNzAgU1VQRVJTQ1JJUFQgWkVSTyAqLworI2RlZmluZSBYS19mb3Vyc3VwZXJpb3IgICAgICAgICAgICAgICAweDEwMDIwNzQgIC8qIFUrMjA3NCBTVVBFUlNDUklQVCBGT1VSICovCisjZGVmaW5lIFhLX2ZpdmVzdXBlcmlvciAgICAgICAgICAgICAgIDB4MTAwMjA3NSAgLyogVSsyMDc1IFNVUEVSU0NSSVBUIEZJVkUgKi8KKyNkZWZpbmUgWEtfc2l4c3VwZXJpb3IgICAgICAgICAgICAgICAgMHgxMDAyMDc2ICAvKiBVKzIwNzYgU1VQRVJTQ1JJUFQgU0lYICovCisjZGVmaW5lIFhLX3NldmVuc3VwZXJpb3IgICAgICAgICAgICAgIDB4MTAwMjA3NyAgLyogVSsyMDc3IFNVUEVSU0NSSVBUIFNFVkVOICovCisjZGVmaW5lIFhLX2VpZ2h0c3VwZXJpb3IgICAgICAgICAgICAgIDB4MTAwMjA3OCAgLyogVSsyMDc4IFNVUEVSU0NSSVBUIEVJR0hUICovCisjZGVmaW5lIFhLX25pbmVzdXBlcmlvciAgICAgICAgICAgICAgIDB4MTAwMjA3OSAgLyogVSsyMDc5IFNVUEVSU0NSSVBUIE5JTkUgKi8KKyNkZWZpbmUgWEtfemVyb3N1YnNjcmlwdCAgICAgICAgICAgICAgMHgxMDAyMDgwICAvKiBVKzIwODAgU1VCU0NSSVBUIFpFUk8gKi8KKyNkZWZpbmUgWEtfb25lc3Vic2NyaXB0ICAgICAgICAgICAgICAgMHgxMDAyMDgxICAvKiBVKzIwODEgU1VCU0NSSVBUIE9ORSAqLworI2RlZmluZSBYS190d29zdWJzY3JpcHQgICAgICAgICAgICAgICAweDEwMDIwODIgIC8qIFUrMjA4MiBTVUJTQ1JJUFQgVFdPICovCisjZGVmaW5lIFhLX3RocmVlc3Vic2NyaXB0ICAgICAgICAgICAgIDB4MTAwMjA4MyAgLyogVSsyMDgzIFNVQlNDUklQVCBUSFJFRSAqLworI2RlZmluZSBYS19mb3Vyc3Vic2NyaXB0ICAgICAgICAgICAgICAweDEwMDIwODQgIC8qIFUrMjA4NCBTVUJTQ1JJUFQgRk9VUiAqLworI2RlZmluZSBYS19maXZlc3Vic2NyaXB0ICAgICAgICAgICAgICAweDEwMDIwODUgIC8qIFUrMjA4NSBTVUJTQ1JJUFQgRklWRSAqLworI2RlZmluZSBYS19zaXhzdWJzY3JpcHQgICAgICAgICAgICAgICAweDEwMDIwODYgIC8qIFUrMjA4NiBTVUJTQ1JJUFQgU0lYICovCisjZGVmaW5lIFhLX3NldmVuc3Vic2NyaXB0ICAgICAgICAgICAgIDB4MTAwMjA4NyAgLyogVSsyMDg3IFNVQlNDUklQVCBTRVZFTiAqLworI2RlZmluZSBYS19laWdodHN1YnNjcmlwdCAgICAgICAgICAgICAweDEwMDIwODggIC8qIFUrMjA4OCBTVUJTQ1JJUFQgRUlHSFQgKi8KKyNkZWZpbmUgWEtfbmluZXN1YnNjcmlwdCAgICAgICAgICAgICAgMHgxMDAyMDg5ICAvKiBVKzIwODkgU1VCU0NSSVBUIE5JTkUgKi8KKyNkZWZpbmUgWEtfcGFydGRpZmZlcmVudGlhbCAgICAgICAgICAgMHgxMDAyMjAyICAvKiBVKzIyMDIgUEFSVElBTCBESUZGRVJFTlRJQUwgKi8KKyNkZWZpbmUgWEtfZW1wdHlzZXQgICAgICAgICAgICAgICAgICAgMHgxMDAyMjA1ICAvKiBVKzIyMDUgTlVMTCBTRVQgKi8KKyNkZWZpbmUgWEtfZWxlbWVudG9mICAgICAgICAgICAgICAgICAgMHgxMDAyMjA4ICAvKiBVKzIyMDggRUxFTUVOVCBPRiAqLworI2RlZmluZSBYS19ub3RlbGVtZW50b2YgICAgICAgICAgICAgICAweDEwMDIyMDkgIC8qIFUrMjIwOSBOT1QgQU4gRUxFTUVOVCBPRiAqLworI2RlZmluZSBYS19jb250YWluc2FzICAgICAgICAgICAgICAgICAweDEwMDIyMEIgIC8qIFUrMjIwQiBDT05UQUlOUyBBUyBNRU1CRVIgKi8KKyNkZWZpbmUgWEtfc3F1YXJlcm9vdCAgICAgICAgICAgICAgICAgMHgxMDAyMjFBICAvKiBVKzIyMUEgU1FVQVJFIFJPT1QgKi8KKyNkZWZpbmUgWEtfY3ViZXJvb3QgICAgICAgICAgICAgICAgICAgMHgxMDAyMjFCICAvKiBVKzIyMUIgQ1VCRSBST09UICovCisjZGVmaW5lIFhLX2ZvdXJ0aHJvb3QgICAgICAgICAgICAgICAgIDB4MTAwMjIxQyAgLyogVSsyMjFDIEZPVVJUSCBST09UICovCisjZGVmaW5lIFhLX2RpbnRlZ3JhbCAgICAgICAgICAgICAgICAgIDB4MTAwMjIyQyAgLyogVSsyMjJDIERPVUJMRSBJTlRFR1JBTCAqLworI2RlZmluZSBYS190aW50ZWdyYWwgICAgICAgICAgICAgICAgICAweDEwMDIyMkQgIC8qIFUrMjIyRCBUUklQTEUgSU5URUdSQUwgKi8KKyNkZWZpbmUgWEtfYmVjYXVzZSAgICAgICAgICAgICAgICAgICAgMHgxMDAyMjM1ICAvKiBVKzIyMzUgQkVDQVVTRSAqLworI2RlZmluZSBYS19hcHByb3hlcSAgICAgICAgICAgICAgICAgICAweDEwMDIyNDggIC8qIFUrMjI0NSBBTE1PU1QgRVFVQUwgVE8gKi8KKyNkZWZpbmUgWEtfbm90YXBwcm94ZXEgICAgICAgICAgICAgICAgMHgxMDAyMjQ3ICAvKiBVKzIyNDcgTk9UIEFMTU9TVCBFUVVBTCBUTyAqLworI2RlZmluZSBYS19ub3RpZGVudGljYWwgICAgICAgICAgICAgICAweDEwMDIyNjIgIC8qIFUrMjI2MiBOT1QgSURFTlRJQ0FMIFRPICovCisjZGVmaW5lIFhLX3N0cmljdGVxICAgICAgICAgICAgICAgICAgIDB4MTAwMjI2MyAgLyogVSsyMjYzIFNUUklDVExZIEVRVUlWQUxFTlQgVE8gKi8gICAgICAgICAgCisjZW5kaWYgLyogWEtfTUFUSEVNQVRJQ0FMICovCisKKyNpZmRlZiBYS19CUkFJTExFCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzEgICAgICAgICAgICAgICAgIDB4ZmZmMQorI2RlZmluZSBYS19icmFpbGxlX2RvdF8yICAgICAgICAgICAgICAgICAweGZmZjIKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfMyAgICAgICAgICAgICAgICAgMHhmZmYzCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzQgICAgICAgICAgICAgICAgIDB4ZmZmNAorI2RlZmluZSBYS19icmFpbGxlX2RvdF81ICAgICAgICAgICAgICAgICAweGZmZjUKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfNiAgICAgICAgICAgICAgICAgMHhmZmY2CisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzcgICAgICAgICAgICAgICAgIDB4ZmZmNworI2RlZmluZSBYS19icmFpbGxlX2RvdF84ICAgICAgICAgICAgICAgICAweGZmZjgKKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RfOSAgICAgICAgICAgICAgICAgMHhmZmY5CisjZGVmaW5lIFhLX2JyYWlsbGVfZG90XzEwICAgICAgICAgICAgICAgIDB4ZmZmYQorI2RlZmluZSBYS19icmFpbGxlX2JsYW5rICAgICAgICAgICAgICAweDEwMDI4MDAgIC8qIFUrMjgwMCBCUkFJTExFIFBBVFRFUk4gQkxBTksgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEgICAgICAgICAgICAgMHgxMDAyODAxICAvKiBVKzI4MDEgQlJBSUxMRSBQQVRURVJOIERPVFMtMSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMiAgICAgICAgICAgICAweDEwMDI4MDIgIC8qIFUrMjgwMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMiAgICAgICAgICAgIDB4MTAwMjgwMyAgLyogVSsyODAzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zICAgICAgICAgICAgIDB4MTAwMjgwNCAgLyogVSsyODA0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTMgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzICAgICAgICAgICAgMHgxMDAyODA1ICAvKiBVKzI4MDUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTMgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzICAgICAgICAgICAgMHgxMDAyODA2ICAvKiBVKzI4MDYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjMgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMyAgICAgICAgICAgMHgxMDAyODA3ICAvKiBVKzI4MDcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180ICAgICAgICAgICAgIDB4MTAwMjgwOCAgLyogVSsyODA4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0ICAgICAgICAgICAgMHgxMDAyODA5ICAvKiBVKzI4MDkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0ICAgICAgICAgICAgMHgxMDAyODBhICAvKiBVKzI4MGEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNCAgICAgICAgICAgMHgxMDAyODBiICAvKiBVKzI4MGIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNCAgICAgICAgICAgIDB4MTAwMjgwYyAgLyogVSsyODBjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQgICAgICAgICAgIDB4MTAwMjgwZCAgLyogVSsyODBkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0ICAgICAgICAgICAweDEwMDI4MGUgIC8qIFUrMjgwZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQgICAgICAgICAgMHgxMDAyODBmICAvKiBVKzI4MGYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNSAgICAgICAgICAgICAweDEwMDI4MTAgIC8qIFUrMjgxMCBCUkFJTExFIFBBVFRFUk4gRE9UUy01ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNSAgICAgICAgICAgIDB4MTAwMjgxMSAgLyogVSsyODExIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNSAgICAgICAgICAgIDB4MTAwMjgxMiAgLyogVSsyODEyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjUgICAgICAgICAgIDB4MTAwMjgxMyAgLyogVSsyODEzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzUgICAgICAgICAgICAweDEwMDI4MTQgIC8qIFUrMjgxNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1ICAgICAgICAgICAweDEwMDI4MTUgIC8qIFUrMjgxNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNSAgICAgICAgICAgMHgxMDAyODE2ICAvKiBVKzI4MTYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1ICAgICAgICAgIDB4MTAwMjgxNyAgLyogVSsyODE3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1ICAgICAgICAgICAgMHgxMDAyODE4ICAvKiBVKzI4MTggQlJBSUxMRSBQQVRURVJOIERPVFMtNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NSAgICAgICAgICAgMHgxMDAyODE5ICAvKiBVKzI4MTkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDUgICAgICAgICAgIDB4MTAwMjgxYSAgLyogVSsyODFhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NSAgICAgICAgICAweDEwMDI4MWIgIC8qIFUrMjgxYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDUgICAgICAgICAgIDB4MTAwMjgxYyAgLyogVSsyODFjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NSAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NSAgICAgICAgICAweDEwMDI4MWQgIC8qIFUrMjgxZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1ICAgICAgICAgIDB4MTAwMjgxZSAgLyogVSsyODFlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1ICAgICAgICAgMHgxMDAyODFmICAvKiBVKzI4MWYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDUgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzYgICAgICAgICAgICAgMHgxMDAyODIwICAvKiBVKzI4MjAgQlJBSUxMRSBQQVRURVJOIERPVFMtNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTYgICAgICAgICAgICAweDEwMDI4MjEgIC8qIFUrMjgyMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjYgICAgICAgICAgICAweDEwMDI4MjIgIC8qIFUrMjgyMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2ICAgICAgICAgICAweDEwMDI4MjMgIC8qIFUrMjgyMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM2ICAgICAgICAgICAgMHgxMDAyODI0ICAvKiBVKzI4MjQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNiAgICAgICAgICAgMHgxMDAyODI1ICAvKiBVKzI4MjUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzYgICAgICAgICAgIDB4MTAwMjgyNiAgLyogVSsyODI2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNiAgICAgICAgICAweDEwMDI4MjcgIC8qIFUrMjgyNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NiAgICAgICAgICAgIDB4MTAwMjgyOCAgLyogVSsyODI4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDYgICAgICAgICAgIDB4MTAwMjgyOSAgLyogVSsyODI5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ2ICAgICAgICAgICAweDEwMDI4MmEgIC8qIFUrMjgyYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDYgICAgICAgICAgMHgxMDAyODJiICAvKiBVKzI4MmIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2ICAgICAgICAgICAweDEwMDI4MmMgIC8qIFUrMjgyYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDYgICAgICAgICAgMHgxMDAyODJkICAvKiBVKzI4MmQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NiAgICAgICAgICAweDEwMDI4MmUgIC8qIFUrMjgyZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NiAgICAgICAgIDB4MTAwMjgyZiAgLyogVSsyODJmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NiAgICAgICAgICAgIDB4MTAwMjgzMCAgLyogVSsyODMwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTYgICAgICAgICAgIDB4MTAwMjgzMSAgLyogVSsyODMxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2ICAgICAgICAgICAweDEwMDI4MzIgIC8qIFUrMjgzMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTYgICAgICAgICAgMHgxMDAyODMzICAvKiBVKzI4MzMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU2ICAgICAgICAgICAweDEwMDI4MzQgIC8qIFUrMjgzNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTYgICAgICAgICAgMHgxMDAyODM1ICAvKiBVKzI4MzUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NiAgICAgICAgICAweDEwMDI4MzYgIC8qIFUrMjgzNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NiAgICAgICAgIDB4MTAwMjgzNyAgLyogVSsyODM3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTYgICAgICAgICAgIDB4MTAwMjgzOCAgLyogVSsyODM4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NiAgICAgICAgICAweDEwMDI4MzkgIC8qIFUrMjgzOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU2ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU2ICAgICAgICAgIDB4MTAwMjgzYSAgLyogVSsyODNhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2ICAgICAgICAgMHgxMDAyODNiICAvKiBVKzI4M2IgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTYgICAgICAgICAgMHgxMDAyODNjICAvKiBVKzI4M2MgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTYgICAgICAgICAweDEwMDI4M2QgIC8qIFUrMjgzZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTYgICAgICAgICAweDEwMDI4M2UgIC8qIFUrMjgzZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NiAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU2ICAgICAgICAweDEwMDI4M2YgIC8qIFUrMjgzZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTYgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzcgICAgICAgICAgICAgMHgxMDAyODQwICAvKiBVKzI4NDAgQlJBSUxMRSBQQVRURVJOIERPVFMtNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTcgICAgICAgICAgICAweDEwMDI4NDEgIC8qIFUrMjg0MSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjcgICAgICAgICAgICAweDEwMDI4NDIgIC8qIFUrMjg0MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI3ICAgICAgICAgICAweDEwMDI4NDMgIC8qIFUrMjg0MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM3ICAgICAgICAgICAgMHgxMDAyODQ0ICAvKiBVKzI4NDQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNyAgICAgICAgICAgMHgxMDAyODQ1ICAvKiBVKzI4NDUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzcgICAgICAgICAgIDB4MTAwMjg0NiAgLyogVSsyODQ2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNyAgICAgICAgICAweDEwMDI4NDcgIC8qIFUrMjg0NyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NyAgICAgICAgICAgIDB4MTAwMjg0OCAgLyogVSsyODQ4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDcgICAgICAgICAgIDB4MTAwMjg0OSAgLyogVSsyODQ5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ3ICAgICAgICAgICAweDEwMDI4NGEgIC8qIFUrMjg0YSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDcgICAgICAgICAgMHgxMDAyODRiICAvKiBVKzI4NGIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ3ICAgICAgICAgICAweDEwMDI4NGMgIC8qIFUrMjg0YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDcgICAgICAgICAgMHgxMDAyODRkICAvKiBVKzI4NGQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NyAgICAgICAgICAweDEwMDI4NGUgIC8qIFUrMjg0ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NyAgICAgICAgIDB4MTAwMjg0ZiAgLyogVSsyODRmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NyAgICAgICAgICAgIDB4MTAwMjg1MCAgLyogVSsyODUwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTcgICAgICAgICAgIDB4MTAwMjg1MSAgLyogVSsyODUxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU3ICAgICAgICAgICAweDEwMDI4NTIgIC8qIFUrMjg1MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTcgICAgICAgICAgMHgxMDAyODUzICAvKiBVKzI4NTMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU3ICAgICAgICAgICAweDEwMDI4NTQgIC8qIFUrMjg1NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTcgICAgICAgICAgMHgxMDAyODU1ICAvKiBVKzI4NTUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NyAgICAgICAgICAweDEwMDI4NTYgIC8qIFUrMjg1NiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NyAgICAgICAgIDB4MTAwMjg1NyAgLyogVSsyODU3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTcgICAgICAgICAgIDB4MTAwMjg1OCAgLyogVSsyODU4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NyAgICAgICAgICAweDEwMDI4NTkgIC8qIFUrMjg1OSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU3ICAgICAgICAgIDB4MTAwMjg1YSAgLyogVSsyODVhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU3ICAgICAgICAgMHgxMDAyODViICAvKiBVKzI4NWIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTcgICAgICAgICAgMHgxMDAyODVjICAvKiBVKzI4NWMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTcgICAgICAgICAweDEwMDI4NWQgIC8qIFUrMjg1ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTcgICAgICAgICAweDEwMDI4NWUgIC8qIFUrMjg1ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU3ICAgICAgICAweDEwMDI4NWYgIC8qIFUrMjg1ZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzY3ICAgICAgICAgICAgMHgxMDAyODYwICAvKiBVKzI4NjAgQlJBSUxMRSBQQVRURVJOIERPVFMtNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE2NyAgICAgICAgICAgMHgxMDAyODYxICAvKiBVKzI4NjEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNjcgICAgICAgICAgIDB4MTAwMjg2MiAgLyogVSsyODYyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2NyAgICAgICAgICAweDEwMDI4NjMgIC8qIFUrMjg2MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNjcgICAgICAgICAgIDB4MTAwMjg2NCAgLyogVSsyODY0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM2NyAgICAgICAgICAweDEwMDI4NjUgIC8qIFUrMjg2NSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzY3ICAgICAgICAgIDB4MTAwMjg2NiAgLyogVSsyODY2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzY3ICAgICAgICAgMHgxMDAyODY3ICAvKiBVKzI4NjcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ2NyAgICAgICAgICAgMHgxMDAyODY4ICAvKiBVKzI4NjggQlJBSUxMRSBQQVRURVJOIERPVFMtNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDY3ICAgICAgICAgIDB4MTAwMjg2OSAgLyogVSsyODY5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NjcgICAgICAgICAgMHgxMDAyODZhICAvKiBVKzI4NmEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NjcgICAgICAgICAweDEwMDI4NmIgIC8qIFUrMjg2YiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2NyAgICAgICAgICAweDEwMDI4NmMgIC8qIFUrMjg2YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ2NyAgICAgICAgIDB4MTAwMjg2ZCAgLyogVSsyODZkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ2NyAgICAgICAgIDB4MTAwMjg2ZSAgLyogVSsyODZlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NjcgICAgICAgIDB4MTAwMjg2ZiAgLyogVSsyODZmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNTY3ICAgICAgICAgICAweDEwMDI4NzAgIC8qIFUrMjg3MCBCUkFJTExFIFBBVFRFUk4gRE9UUy01NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE1NjcgICAgICAgICAgMHgxMDAyODcxICAvKiBVKzI4NzEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2NyAgICAgICAgICAweDEwMDI4NzIgIC8qIFUrMjg3MiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjU2NyAgICAgICAgIDB4MTAwMjg3MyAgLyogVSsyODczIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNTY3ICAgICAgICAgIDB4MTAwMjg3NCAgLyogVSsyODc0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTY3ICAgICAgICAgMHgxMDAyODc1ICAvKiBVKzI4NzUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNTY3ICAgICAgICAgMHgxMDAyODc2ICAvKiBVKzI4NzYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzU2NyAgICAgICAgMHgxMDAyODc3ICAvKiBVKzI4NzcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTY3ICAgICAgICAgIDB4MTAwMjg3OCAgLyogVSsyODc4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NTY3ICAgICAgICAgMHgxMDAyODc5ICAvKiBVKzI4NzkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NTY3ICAgICAgICAgMHgxMDAyODdhICAvKiBVKzI4N2EgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2NyAgICAgICAgMHgxMDAyODdiICAvKiBVKzI4N2IgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDU2NyAgICAgICAgIDB4MTAwMjg3YyAgLyogVSsyODdjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NTY3ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ1NjcgICAgICAgIDB4MTAwMjg3ZCAgLyogVSsyODdkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTY3ICAgICAgICAweDEwMDI4N2UgIC8qIFUrMjg3ZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1NjcgKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ1NjcgICAgICAgMHgxMDAyODdmICAvKiBVKzI4N2YgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDU2NyAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfOCAgICAgICAgICAgICAweDEwMDI4ODAgIC8qIFUrMjg4MCBCUkFJTExFIFBBVFRFUk4gRE9UUy04ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xOCAgICAgICAgICAgIDB4MTAwMjg4MSAgLyogVSsyODgxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yOCAgICAgICAgICAgIDB4MTAwMjg4MiAgLyogVSsyODgyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjggICAgICAgICAgIDB4MTAwMjg4MyAgLyogVSsyODgzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzggICAgICAgICAgICAweDEwMDI4ODQgIC8qIFUrMjg4NCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zOCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM4ICAgICAgICAgICAweDEwMDI4ODUgIC8qIFUrMjg4NSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzOCAgICAgICAgICAgMHgxMDAyODg2ICAvKiBVKzI4ODYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM4ICAgICAgICAgIDB4MTAwMjg4NyAgLyogVSsyODg3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ4ICAgICAgICAgICAgMHgxMDAyODg4ICAvKiBVKzI4ODggQlJBSUxMRSBQQVRURVJOIERPVFMtNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0OCAgICAgICAgICAgMHgxMDAyODg5ICAvKiBVKzI4ODkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDggICAgICAgICAgIDB4MTAwMjg4YSAgLyogVSsyODhhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0OCAgICAgICAgICAweDEwMDI4OGIgIC8qIFUrMjg4YiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDggICAgICAgICAgIDB4MTAwMjg4YyAgLyogVSsyODhjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0OCAgICAgICAgICAweDEwMDI4OGQgIC8qIFUrMjg4ZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ4ICAgICAgICAgIDB4MTAwMjg4ZSAgLyogVSsyODhlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ4ICAgICAgICAgMHgxMDAyODhmICAvKiBVKzI4OGYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU4ICAgICAgICAgICAgMHgxMDAyODkwICAvKiBVKzI4OTAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE1OCAgICAgICAgICAgMHgxMDAyODkxICAvKiBVKzI4OTEgQlJBSUxMRSBQQVRURVJOIERPVFMtMTU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNTggICAgICAgICAgIDB4MTAwMjg5MiAgLyogVSsyODkyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1OCAgICAgICAgICAweDEwMDI4OTMgIC8qIFUrMjg5MyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNTggICAgICAgICAgIDB4MTAwMjg5NCAgLyogVSsyODk0IEJSQUlMTEUgUEFUVEVSTiBET1RTLTM1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1OCAgICAgICAgICAweDEwMDI4OTUgIC8qIFUrMjg5NSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU4ICAgICAgICAgIDB4MTAwMjg5NiAgLyogVSsyODk2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzU4ICAgICAgICAgMHgxMDAyODk3ICAvKiBVKzI4OTcgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1OCAgICAgICAgICAgMHgxMDAyODk4ICAvKiBVKzI4OTggQlJBSUxMRSBQQVRURVJOIERPVFMtNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU4ICAgICAgICAgIDB4MTAwMjg5OSAgLyogVSsyODk5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI0NTggICAgICAgICAgMHgxMDAyODlhICAvKiBVKzI4OWEgQlJBSUxMRSBQQVRURVJOIERPVFMtMjQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NTggICAgICAgICAweDEwMDI4OWIgIC8qIFUrMjg5YiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1OCAgICAgICAgICAweDEwMDI4OWMgIC8qIFUrMjg5YyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzQ1OCAgICAgICAgIDB4MTAwMjg5ZCAgLyogVSsyODlkIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1OCAgICAgICAgIDB4MTAwMjg5ZSAgLyogVSsyODllIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDU4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTggICAgICAgIDB4MTAwMjg5ZiAgLyogVSsyODlmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNjggICAgICAgICAgICAweDEwMDI4YTAgIC8qIFUrMjhhMCBCUkFJTExFIFBBVFRFUk4gRE9UUy02OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTY4ICAgICAgICAgICAweDEwMDI4YTEgIC8qIFUrMjhhMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI2OCAgICAgICAgICAgMHgxMDAyOGEyICAvKiBVKzI4YTIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjY4ICAgICAgICAgIDB4MTAwMjhhMyAgLyogVSsyOGEzIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM2OCAgICAgICAgICAgMHgxMDAyOGE0ICAvKiBVKzI4YTQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzY4ICAgICAgICAgIDB4MTAwMjhhNSAgLyogVSsyOGE1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNjggICAgICAgICAgMHgxMDAyOGE2ICAvKiBVKzI4YTYgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNjggICAgICAgICAweDEwMDI4YTcgIC8qIFUrMjhhNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDY4ICAgICAgICAgICAweDEwMDI4YTggIC8qIFUrMjhhOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzE0NjggICAgICAgICAgMHgxMDAyOGE5ICAvKiBVKzI4YTkgQlJBSUxMRSBQQVRURVJOIERPVFMtMTQ2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ2OCAgICAgICAgICAweDEwMDI4YWEgIC8qIFUrMjhhYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ2OCAgICAgICAgIDB4MTAwMjhhYiAgLyogVSsyOGFiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18zNDY4ICAgICAgICAgIDB4MTAwMjhhYyAgLyogVSsyOGFjIEJSQUlMTEUgUEFUVEVSTiBET1RTLTM0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDY4ICAgICAgICAgMHgxMDAyOGFkICAvKiBVKzI4YWQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDY4ICAgICAgICAgMHgxMDAyOGFlICAvKiBVKzI4YWUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyMzQ2OCAgICAgICAgMHgxMDAyOGFmICAvKiBVKzI4YWYgQlJBSUxMRSBQQVRURVJOIERPVFMtMTIzNDY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c181NjggICAgICAgICAgIDB4MTAwMjhiMCAgLyogVSsyOGIwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU2OCAgICAgICAgICAweDEwMDI4YjEgIC8qIFUrMjhiMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNTY4ICAgICAgICAgIDB4MTAwMjhiMiAgLyogVSsyOGIyIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNTY4ICAgICAgICAgMHgxMDAyOGIzICAvKiBVKzI4YjMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1NjggICAgICAgICAgMHgxMDAyOGI0ICAvKiBVKzI4YjQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM1NjggICAgICAgICAweDEwMDI4YjUgIC8qIFUrMjhiNSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM1NjggICAgICAgICAweDEwMDI4YjYgIC8qIFUrMjhiNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTY4ICAgICAgICAweDEwMDI4YjcgIC8qIFUrMjhiNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzQ1NjggICAgICAgICAgMHgxMDAyOGI4ICAvKiBVKzI4YjggQlJBSUxMRSBQQVRURVJOIERPVFMtNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ1NjggICAgICAgICAweDEwMDI4YjkgIC8qIFUrMjhiOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1NjggICAgICAgICAweDEwMDI4YmEgIC8qIFUrMjhiYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI0NTY4ICAgICAgICAweDEwMDI4YmIgIC8qIFUrMjhiYiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NTY4ICAgICAgICAgMHgxMDAyOGJjICAvKiBVKzI4YmMgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ1NjggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU2OCAgICAgICAgMHgxMDAyOGJkICAvKiBVKzI4YmQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzQ1NjggICAgICAgIDB4MTAwMjhiZSAgLyogVSsyOGJlIEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNDU2OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDU2OCAgICAgICAweDEwMDI4YmYgIC8qIFUrMjhiZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NTY4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c183OCAgICAgICAgICAgIDB4MTAwMjhjMCAgLyogVSsyOGMwIEJSQUlMTEUgUEFUVEVSTiBET1RTLTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNzggICAgICAgICAgIDB4MTAwMjhjMSAgLyogVSsyOGMxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjc4ICAgICAgICAgICAweDEwMDI4YzIgIC8qIFUrMjhjMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNzggICAgICAgICAgMHgxMDAyOGMzICAvKiBVKzI4YzMgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzc4ICAgICAgICAgICAweDEwMDI4YzQgIC8qIFUrMjhjNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNzggICAgICAgICAgMHgxMDAyOGM1ICAvKiBVKzI4YzUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM3OCAgICAgICAgICAweDEwMDI4YzYgIC8qIFUrMjhjNiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM3OCAgICAgICAgIDB4MTAwMjhjNyAgLyogVSsyOGM3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NzggICAgICAgICAgIDB4MTAwMjhjOCAgLyogVSsyOGM4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTQ3OCAgICAgICAgICAweDEwMDI4YzkgIC8qIFUrMjhjOSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNDc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDc4ICAgICAgICAgIDB4MTAwMjhjYSAgLyogVSsyOGNhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDc4ICAgICAgICAgMHgxMDAyOGNiICAvKiBVKzI4Y2IgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM0NzggICAgICAgICAgMHgxMDAyOGNjICAvKiBVKzI4Y2MgQlJBSUxMRSBQQVRURVJOIERPVFMtMzQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NzggICAgICAgICAweDEwMDI4Y2QgIC8qIFUrMjhjZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NzggICAgICAgICAweDEwMDI4Y2UgIC8qIFUrMjhjZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNDc4ICAgICAgICAweDEwMDI4Y2YgIC8qIFUrMjhjZiBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM0NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU3OCAgICAgICAgICAgMHgxMDAyOGQwICAvKiBVKzI4ZDAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNTc4ICAgICAgICAgIDB4MTAwMjhkMSAgLyogVSsyOGQxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI1NzggICAgICAgICAgMHgxMDAyOGQyICAvKiBVKzI4ZDIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1NzggICAgICAgICAweDEwMDI4ZDMgIC8qIFUrMjhkMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzU3OCAgICAgICAgICAweDEwMDI4ZDQgIC8qIFUrMjhkNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzU3OCAgICAgICAgIDB4MTAwMjhkNSAgLyogVSsyOGQ1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU3OCAgICAgICAgIDB4MTAwMjhkNiAgLyogVSsyOGQ2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM1NzggICAgICAgIDB4MTAwMjhkNyAgLyogVSsyOGQ3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDU3OCAgICAgICAgICAweDEwMDI4ZDggIC8qIFUrMjhkOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU3OCAgICAgICAgIDB4MTAwMjhkOSAgLyogVSsyOGQ5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDU3OCAgICAgICAgIDB4MTAwMjhkYSAgLyogVSsyOGRhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ1NzggICAgICAgIDB4MTAwMjhkYiAgLyogVSsyOGRiIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1NzggICAgICAgICAweDEwMDI4ZGMgIC8qIFUrMjhkYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0NTc4ICAgICAgICAweDEwMDI4ZGQgIC8qIFUrMjhkZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDU3OCAgICAgICAgMHgxMDAyOGRlICAvKiBVKzI4ZGUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0NTc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTc4ICAgICAgIDB4MTAwMjhkZiAgLyogVSsyOGRmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzY3OCAgICAgICAgICAgMHgxMDAyOGUwICAvKiBVKzI4ZTAgQlJBSUxMRSBQQVRURVJOIERPVFMtNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNjc4ICAgICAgICAgIDB4MTAwMjhlMSAgLyogVSsyOGUxIEJSQUlMTEUgUEFUVEVSTiBET1RTLTE2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzI2NzggICAgICAgICAgMHgxMDAyOGUyICAvKiBVKzI4ZTIgQlJBSUxMRSBQQVRURVJOIERPVFMtMjY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI2NzggICAgICAgICAweDEwMDI4ZTMgIC8qIFUrMjhlMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzY3OCAgICAgICAgICAweDEwMDI4ZTQgIC8qIFUrMjhlNCBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMzY3OCAgICAgICAgIDB4MTAwMjhlNSAgLyogVSsyOGU1IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEzNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzY3OCAgICAgICAgIDB4MTAwMjhlNiAgLyogVSsyOGU2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNjc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM2NzggICAgICAgIDB4MTAwMjhlNyAgLyogVSsyOGU3IEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfNDY3OCAgICAgICAgICAweDEwMDI4ZTggIC8qIFUrMjhlOCBCUkFJTExFIFBBVFRFUk4gRE9UUy00Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDY3OCAgICAgICAgIDB4MTAwMjhlOSAgLyogVSsyOGU5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yNDY3OCAgICAgICAgIDB4MTAwMjhlYSAgLyogVSsyOGVhIEJSQUlMTEUgUEFUVEVSTiBET1RTLTI0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjQ2NzggICAgICAgIDB4MTAwMjhlYiAgLyogVSsyOGViIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ2NzggICAgICAgICAweDEwMDI4ZWMgIC8qIFUrMjhlYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTM0Njc4ICAgICAgICAweDEwMDI4ZWQgIC8qIFUrMjhlZCBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMzQ2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzIzNDY3OCAgICAgICAgMHgxMDAyOGVlICAvKiBVKzI4ZWUgQlJBSUxMRSBQQVRURVJOIERPVFMtMjM0Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0Njc4ICAgICAgIDB4MTAwMjhlZiAgLyogVSsyOGVmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzU2NzggICAgICAgICAgMHgxMDAyOGYwICAvKiBVKzI4ZjAgQlJBSUxMRSBQQVRURVJOIERPVFMtNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTU2NzggICAgICAgICAweDEwMDI4ZjEgIC8qIFUrMjhmMSBCUkFJTExFIFBBVFRFUk4gRE9UUy0xNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjU2NzggICAgICAgICAweDEwMDI4ZjIgIC8qIFUrMjhmMiBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTI1Njc4ICAgICAgICAweDEwMDI4ZjMgIC8qIFUrMjhmMyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzM1Njc4ICAgICAgICAgMHgxMDAyOGY0ICAvKiBVKzI4ZjQgQlJBSUxMRSBQQVRURVJOIERPVFMtMzU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNTY3OCAgICAgICAgMHgxMDAyOGY1ICAvKiBVKzI4ZjUgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18yMzU2NzggICAgICAgIDB4MTAwMjhmNiAgLyogVSsyOGY2IEJSQUlMTEUgUEFUVEVSTiBET1RTLTIzNTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMTIzNTY3OCAgICAgICAweDEwMDI4ZjcgIC8qIFUrMjhmNyBCUkFJTExFIFBBVFRFUk4gRE9UUy0xMjM1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c180NTY3OCAgICAgICAgIDB4MTAwMjhmOCAgLyogVSsyOGY4IEJSQUlMTEUgUEFUVEVSTiBET1RTLTQ1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xNDU2NzggICAgICAgIDB4MTAwMjhmOSAgLyogVSsyOGY5IEJSQUlMTEUgUEFUVEVSTiBET1RTLTE0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjQ1Njc4ICAgICAgICAweDEwMDI4ZmEgIC8qIFUrMjhmYSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEyNDU2NzggICAgICAgMHgxMDAyOGZiICAvKiBVKzI4ZmIgQlJBSUxMRSBQQVRURVJOIERPVFMtMTI0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMzQ1Njc4ICAgICAgICAweDEwMDI4ZmMgIC8qIFUrMjhmYyBCUkFJTExFIFBBVFRFUk4gRE9UUy0zNDU2NzggKi8KKyNkZWZpbmUgWEtfYnJhaWxsZV9kb3RzXzEzNDU2NzggICAgICAgMHgxMDAyOGZkICAvKiBVKzI4ZmQgQlJBSUxMRSBQQVRURVJOIERPVFMtMTM0NTY3OCAqLworI2RlZmluZSBYS19icmFpbGxlX2RvdHNfMjM0NTY3OCAgICAgICAweDEwMDI4ZmUgIC8qIFUrMjhmZSBCUkFJTExFIFBBVFRFUk4gRE9UUy0yMzQ1Njc4ICovCisjZGVmaW5lIFhLX2JyYWlsbGVfZG90c18xMjM0NTY3OCAgICAgIDB4MTAwMjhmZiAgLyogVSsyOGZmIEJSQUlMTEUgUEFUVEVSTiBET1RTLTEyMzQ1Njc4ICovCisjZW5kaWYgLyogWEtfQlJBSUxMRSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9fR19jb25maWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExZDAyMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgbGliaW8gdG8gZGVmaW5lIHZhcmlvdXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorICAgVGhlc2UgYXJlIGFsd2F5cyB0aGUgc2FtZSBpbiB0aGUgR05VIEMgbGlicmFyeS4gICovCisKKyNpZm5kZWYgX0dfY29uZmlnX2gKKyNkZWZpbmUgX0dfY29uZmlnX2ggMQorCisvKiBEZWZpbmUgdHlwZXMgZm9yIGxpYmlvIGluIHRlcm1zIG9mIHRoZSBzdGFuZGFyZCBpbnRlcm5hbCB0eXBlIG5hbWVzLiAgKi8KKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfR0xJQkNQUF9VU0VfV0NIQVJfVAorIyBkZWZpbmUgX19uZWVkX3djaGFyX3QKKyNlbmRpZgorI2RlZmluZSBfX25lZWRfTlVMTAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2RlZmluZSBfX25lZWRfbWJzdGF0ZV90CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisjIGRlZmluZSBfX25lZWRfd2ludF90CisjZW5kaWYKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2RlZmluZSBfR19zaXplX3QJc2l6ZV90Cit0eXBlZGVmIHN0cnVjdAoreworICBfX29mZl90IF9fcG9zOworICBfX21ic3RhdGVfdCBfX3N0YXRlOworfSBfR19mcG9zX3Q7Cit0eXBlZGVmIHN0cnVjdAoreworICBfX29mZjY0X3QgX19wb3M7CisgIF9fbWJzdGF0ZV90IF9fc3RhdGU7Cit9IF9HX2Zwb3M2NF90OworI2RlZmluZSBfR19zc2l6ZV90CV9fc3NpemVfdAorI2RlZmluZSBfR19vZmZfdAlfX29mZl90CisjZGVmaW5lIF9HX29mZjY0X3QJX19vZmY2NF90CisjZGVmaW5lCV9HX3BpZF90CV9fcGlkX3QKKyNkZWZpbmUJX0dfdWlkX3QJX191aWRfdAorI2RlZmluZSBfR193Y2hhcl90CXdjaGFyX3QKKyNkZWZpbmUgX0dfd2ludF90CXdpbnRfdAorI2RlZmluZSBfR19zdGF0NjQJc3RhdDY0CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisjIGluY2x1ZGUgPGdjb252Lmg+Cit0eXBlZGVmIHVuaW9uCit7CisgIHN0cnVjdCBfX2djb252X2luZm8gX19jZDsKKyAgc3RydWN0CisgIHsKKyAgICBzdHJ1Y3QgX19nY29udl9pbmZvIF9fY2Q7CisgICAgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhIF9fZGF0YTsKKyAgfSBfX2NvbWJpbmVkOworfSBfR19pY29udl90OworI2VuZGlmCisKK3R5cGVkZWYgaW50IF9HX2ludDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7Cit0eXBlZGVmIGludCBfR19pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9fKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsKKworI2RlZmluZSBfR19IQVZFX0JPT0wgMQorCisKKy8qIFRoZXNlIGxpYnJhcnkgZmVhdHVyZXMgYXJlIGFsd2F5cyBhdmFpbGFibGUgaW4gdGhlIEdOVSBDIGxpYnJhcnkuICAqLworI2RlZmluZSBfR19IQVZFX0FURVhJVCAxCisjZGVmaW5lIF9HX0hBVkVfU1lTX0NERUZTIDEKKyNkZWZpbmUgX0dfSEFWRV9TWVNfV0FJVCAxCisjZGVmaW5lIF9HX05FRURfU1REQVJHX0ggMQorI2RlZmluZSBfR192YV9saXN0IF9fZ251Y192YV9saXN0CisKKyNkZWZpbmUgX0dfSEFWRV9QUklOVEZfRlAgMQorI2RlZmluZSBfR19IQVZFX01NQVAgMQorI2RlZmluZSBfR19IQVZFX01SRU1BUCAxCisjZGVmaW5lIF9HX0hBVkVfTE9OR19ET1VCTEVfSU8gMQorI2RlZmluZSBfR19IQVZFX0lPX0ZJTEVfT1BFTiAxCisjZGVmaW5lIF9HX0hBVkVfSU9fR0VUTElORV9JTkZPIDEKKworI2RlZmluZSBfR19JT19JT19GSUxFX1ZFUlNJT04gMHgyMDAwMQorCisjZGVmaW5lIF9HX09QRU42NAlfX29wZW42NAorI2RlZmluZSBfR19MU0VFSzY0CV9fbHNlZWs2NAorI2RlZmluZSBfR19NTUFQNjQJX19tbWFwNjQKKyNkZWZpbmUgX0dfRlNUQVQ2NChmZCxidWYpIF9fZnhzdGF0NjQgKF9TVEFUX1ZFUiwgZmQsIGJ1ZikKKworLyogVGhpcyBpcyBkZWZpbmVkIGJ5IDxiaXRzL3N0YXQuaD4gaWYgYHN0X2Jsa3NpemUnIGV4aXN0cy4gICovCisjZGVmaW5lIF9HX0hBVkVfU1RfQkxLU0laRSBkZWZpbmVkIChfU1RBVEJVRl9TVF9CTEtTSVpFKQorCisjZGVmaW5lIF9HX0JVRlNJWiA4MTkyCisKKy8qIFRoZXNlIGFyZSB0aGUgdnRibCBkZXRhaWxzIGZvciBFTEYuICAqLworI2RlZmluZSBfR19OQU1FU19IQVZFX1VOREVSU0NPUkUgMAorI2RlZmluZSBfR19WVEFCTEVfTEFCRUxfSEFTX0xFTkdUSCAxCisjZGVmaW5lIF9HX1VTSU5HX1RIVU5LUwkxCisjZGVmaW5lIF9HX1ZUQUJMRV9MQUJFTF9QUkVGSVggIl9fdnRfIgorI2RlZmluZSBfR19WVEFCTEVfTEFCRUxfUFJFRklYX0lEIF9fdnRfCisKKworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX1NURENfXworIyBkZWZpbmUgX0dfQVJHUyhBUkdMSVNUKSBBUkdMSVNUCisjZWxzZQorIyBkZWZpbmUgX0dfQVJHUyhBUkdMSVNUKSAoKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfR19jb25maWcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTE0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Eub3V0LmgKQEAgLTAsMCArMSwxMzggQEAKKyNpZm5kZWYgX19BX09VVF9HTlVfSF9fCisjZGVmaW5lIF9fQV9PVVRfR05VX0hfXworCisjaW5jbHVkZSA8Yml0cy9hLm91dC5oPgorCisjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KKworc3RydWN0IGV4ZWMKK3sKKyAgdW5zaWduZWQgbG9uZyBhX2luZm87CS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MuICAqLworICB1bnNpZ25lZCBpbnQgYV90ZXh0OwkvKiBMZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9kYXRhOwkvKiBMZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9ic3M7CS8qIExlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9zeW1zOwkvKiBMZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMuICAqLworICB1bnNpZ25lZCBpbnQgYV9lbnRyeTsJLyogU3RhcnQgYWRkcmVzcy4gICovCisgIHVuc2lnbmVkIGludCBhX3Ryc2l6ZTsvKiBMZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcy4gICovCisgIHVuc2lnbmVkIGludCBhX2Ryc2l6ZTsvKiBMZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcy4gICovCit9OworCitlbnVtIG1hY2hpbmVfdHlwZQoreworICBNX09MRFNVTjIgPSAwLAorICBNXzY4MDEwID0gMSwKKyAgTV82ODAyMCA9IDIsCisgIE1fU1BBUkMgPSAzLAorICBNXzM4NiA9IDEwMCwKKyAgTV9NSVBTMSA9IDE1MSwKKyAgTV9NSVBTMiA9IDE1MgorfTsKKworI2RlZmluZSBOX01BR0lDKGV4ZWMpCSgoZXhlYykuYV9pbmZvICYgMHhmZmZmKQorI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQorI2RlZmluZSBOX0ZMQUdTKGV4ZWMpCSgoKGV4ZWMpLmFfaW5mbyA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAorICAoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKQkJCQkJXAorICAgfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpCQkJCQlcCisgICB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKKyNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKKyAgKChleGVjKS5hX2luZm8gPSAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZjAwMDApIHwgKChtYWdpYykgJiAweGZmZmYpKQorI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAorICAoKGV4ZWMpLmFfaW5mbyA9CQkJCQkJCVwKKyAgICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCisjZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCisgICgoZXhlYykuYV9pbmZvID0JCQkJCQkJXAorICAgKChleGVjKS5hX2luZm8mMHgwMGZmZmZmZikgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisKKy8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIE9NQUdJQyAwNDA3CisvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDA0MTAKKy8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIFpNQUdJQyAwNDEzCisvKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gCisgICBUaGUgZmlyc3QgcGFnZSBpcyB1bm1hcHBlZCB0byBoZWxwIHRyYXAgTlVMTCBwb2ludGVyIHJlZmVyZW5jZXMuICAqLworI2RlZmluZSBRTUFHSUMgMDMxNAorLyogQ29kZSBpbmRpY2F0aW5nIGNvcmUgZmlsZS4gICovCisjZGVmaW5lIENNQUdJQyAwNDIxCisKKyNkZWZpbmUgTl9UUlNJWkUoYSkJKChhKS5hX3Ryc2l6ZSkKKyNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKKyNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQorI2RlZmluZSBOX0JBRE1BRyh4KSBcCisgIChOX01BR0lDKHgpICE9IE9NQUdJQwkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJCQlcCisgICAmJiBOX01BR0lDKHgpICE9IFpNQUdJQyAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKKyNkZWZpbmUgX05fSERST0ZGKHgpCSgxMDI0IC0gc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCisjZGVmaW5lIE5fVFhUT0ZGKHgpIFwKKyAgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gX05fSERST0ZGKCh4KSkgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6CVwKKyAgIChOX01BR0lDKHgpID09IFFNQUdJQyA/IDAgOiBzaXplb2YgKHN0cnVjdCBleGVjKSkpCisjZGVmaW5lIE5fREFUT0ZGKHgpCShOX1RYVE9GRih4KSArICh4KS5hX3RleHQpCisjZGVmaW5lIE5fVFJFTE9GRih4KQkoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQorI2RlZmluZSBOX0RSRUxPRkYoeCkJKE5fVFJFTE9GRih4KSArIE5fVFJTSVpFKHgpKQorI2RlZmluZSBOX1NZTU9GRih4KQkoTl9EUkVMT0ZGKHgpICsgTl9EUlNJWkUoeCkpCisjZGVmaW5lIE5fU1RST0ZGKHgpCShOX1NZTU9GRih4KSArIE5fU1lNU0laRSh4KSkKKworLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCisjZGVmaW5lIE5fVFhUQUREUih4KQkoTl9NQUdJQyh4KSA9PSBRTUFHSUMgPyA0MDk2IDogMCkKKworLyogQWRkcmVzcyBvZiBkYXRhIHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCisjZGVmaW5lIFNFR01FTlRfU0laRQkxMDI0CisKKyNkZWZpbmUgX05fU0VHTUVOVF9ST1VORCh4KSAoKCh4KSArIFNFR01FTlRfU0laRSAtIDEpICYgfihTRUdNRU5UX1NJWkUgLSAxKSkKKyNkZWZpbmUgX05fVFhURU5EQUREUih4KSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpCisKKyNkZWZpbmUgTl9EQVRBRERSKHgpIFwKKyAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKF9OX1RYVEVOREFERFIoeCkpCQkJCVwKKyAgIDogKF9OX1NFR01FTlRfUk9VTkQgKF9OX1RYVEVOREFERFIoeCkpKSkKKyNkZWZpbmUgTl9CU1NBRERSKHgpIChOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQorCisjaWYgIWRlZmluZWQgKE5fTkxJU1RfREVDTEFSRUQpCitzdHJ1Y3Qgbmxpc3QKK3sKKyAgdW5pb24KKyAgICB7CisgICAgICBjaGFyICpuX25hbWU7CisgICAgICBzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKKyAgICAgIGxvbmcgbl9zdHJ4OworICAgIH0gbl91bjsKKyAgdW5zaWduZWQgY2hhciBuX3R5cGU7CisgIGNoYXIgbl9vdGhlcjsKKyAgc2hvcnQgbl9kZXNjOworICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Cit9OworI2VuZGlmIC8qIG5vIE5fTkxJU1RfREVDTEFSRUQuICAqLworCisjZGVmaW5lIE5fVU5ERgkwCisjZGVmaW5lIE5fQUJTCTIKKyNkZWZpbmUgTl9URVhUCTQKKyNkZWZpbmUgTl9EQVRBCTYKKyNkZWZpbmUgTl9CU1MJOAorI2RlZmluZSBOX0ZOCTE1CisjZGVmaW5lIE5fRVhUCTEKKyNkZWZpbmUgTl9UWVBFCTAzNgorI2RlZmluZSBOX1NUQUIJMDM0MAorI2RlZmluZSBOX0lORFIJMHhhCisjZGVmaW5lCU5fU0VUQQkweDE0CS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbC4gICovCisjZGVmaW5lCU5fU0VUVAkweDE2CS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sLiAgKi8KKyNkZWZpbmUJTl9TRVRECTB4MTgJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wuICAqLworI2RlZmluZQlOX1NFVEIJMHgxQQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sLiAgKi8KKyNkZWZpbmUgTl9TRVRWCTB4MUMJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCisKKyNpZiAhZGVmaW5lZCAoTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQpCisvKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCisgICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKKyAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgorICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLworCitzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCit7CisgIGludCByX2FkZHJlc3M7CisgIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKKyAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKKyAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7CisgIHVuc2lnbmVkIGludCByX2V4dGVybjoxOworICB1bnNpZ25lZCBpbnQgcl9wYWQ6NDsKK307CisjZW5kaWYgLyogbm8gTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQuICAqLworCisjZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FmX3Zmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hZl92ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjliODI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hZl92ZnMuaApAQCAtMCwwICsxLDU2IEBACisvKgorCUF1ZGlvIEZpbGUgTGlicmFyeQorCUNvcHlyaWdodCAoQykgMTk5OSwgRWxsaW90IExlZSA8c29wd2l0aEByZWRoYXQuY29tPgorCisJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisJdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorCUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZQorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorCUJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4KKyovCisKKy8qCisJYWZfdmZzLmgKKworCVZpcnR1YWwgZmlsZSBvcGVyYXRpb25zIGZvciB0aGUgQXVkaW8gRmlsZSBMaWJyYXJ5LgorKi8KKworI2lmbmRlZiBBVURJT0ZJTEVfVkZTX0gKKyNkZWZpbmUgQVVESU9GSUxFX1ZGU19IIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9maWxlLmg+CisKK3N0cnVjdCBfQUZ2aXJ0dWFsZmlsZQoreworICBzc2l6ZV90ICgqcmVhZCkgKEFGdmlydHVhbGZpbGUgKnZmaWxlLCB2b2lkICpkYXRhLCBzaXplX3QgbmJ5dGVzKTsKKyAgbG9uZyAoKmxlbmd0aCkgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKyAgc3NpemVfdCAoKndyaXRlKSAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBuYnl0ZXMpOworICB2b2lkICgqZGVzdHJveSkoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUpOworICBsb25nICgqc2VlaykgICAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUsIGxvbmcgb2Zmc2V0LCBpbnQgaXNfcmVsYXRpdmUpOworICBsb25nICgqdGVsbCkgICAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUpOworCisgIHZvaWQgKmNsb3N1cmU7Cit9OworCitBRnZpcnR1YWxmaWxlICphZl92aXJ0dWFsX2ZpbGVfbmV3ICh2b2lkKTsKK0FGdmlydHVhbGZpbGUgKmFmX3ZpcnR1YWxfZmlsZV9uZXdfZm9yX2ZpbGUgKEZJTEUgKmZoKTsKK3ZvaWQgYWZfdmlydHVhbF9maWxlX2Rlc3Ryb3kgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKworc2l6ZV90IGFmX2ZyZWFkICh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCBBRnZpcnR1YWxmaWxlICp2ZmlsZSk7CitzaXplX3QgYWZfZndyaXRlIChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCBBRnZpcnR1YWxmaWxlICp2ZmlsZSk7CitpbnQgYWZfZmNsb3NlIChBRnZpcnR1YWxmaWxlICp2ZmlsZSk7Citsb25nIGFmX2ZsZW5ndGggKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKK2ludCBhZl9mc2VlayAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUsIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK2xvbmcgYWZfZnRlbGwgKEFGdmlydHVhbGZpbGUgKnZmaWxlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9haW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZkMGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9haW8uaApAQCAtMCwwICsxLDI0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAsMjAwMywyMDA0LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBJU08vSUVDIDk5NDUtMToxOTk2IDYuNzogQXN5bmNocm9ub3VzIElucHV0IGFuZCBPdXRwdXQKKyAqLworCisjaWZuZGVmIF9BSU9fSAorI2RlZmluZSBfQUlPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBBc3luY2hyb25vdXMgSS9PIGNvbnRyb2wgYmxvY2suICAqLworc3RydWN0IGFpb2NiCit7CisgIGludCBhaW9fZmlsZGVzOwkJLyogRmlsZSBkZXNyaXB0b3IuICAqLworICBpbnQgYWlvX2xpb19vcGNvZGU7CQkvKiBPcGVyYXRpb24gdG8gYmUgcGVyZm9ybWVkLiAgKi8KKyAgaW50IGFpb19yZXFwcmlvOwkJLyogUmVxdWVzdCBwcmlvcml0eSBvZmZzZXQuICAqLworICB2b2xhdGlsZSB2b2lkICphaW9fYnVmOwkvKiBMb2NhdGlvbiBvZiBidWZmZXIuICAqLworICBzaXplX3QgYWlvX25ieXRlczsJCS8qIExlbmd0aCBvZiB0cmFuc2Zlci4gICovCisgIHN0cnVjdCBzaWdldmVudCBhaW9fc2lnZXZlbnQ7CS8qIFNpZ25hbCBudW1iZXIgYW5kIHZhbHVlLiAgKi8KKworICAvKiBJbnRlcm5hbCBtZW1iZXJzLiAgKi8KKyAgc3RydWN0IGFpb2NiICpfX25leHRfcHJpbzsKKyAgaW50IF9fYWJzX3ByaW87CisgIGludCBfX3BvbGljeTsKKyAgaW50IF9fZXJyb3JfY29kZTsKKyAgX19zc2l6ZV90IF9fcmV0dXJuX3ZhbHVlOworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgX19vZmZfdCBhaW9fb2Zmc2V0OwkJLyogRmlsZSBvZmZzZXQuICAqLworICBjaGFyIF9fcGFkW3NpemVvZiAoX19vZmY2NF90KSAtIHNpemVvZiAoX19vZmZfdCldOworI2Vsc2UKKyAgX19vZmY2NF90IGFpb19vZmZzZXQ7CQkvKiBGaWxlIG9mZnNldC4gICovCisjZW5kaWYKKyAgY2hhciBfX3VudXNlZFszMl07Cit9OworCisvKiBUaGUgc2FtZSBmb3IgdGhlIDY0Yml0IG9mZnNldHMuICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBtZW1iZXJzIGFpb19maWxkZXMKKyAgIHRvIF9fcmV0dXJuX3ZhbHVlIGhhdmUgdG8gYmUgdGhlIHNhbWUgaW4gYWlvY2IgYW5kIGFpb2NiNjQuICAqLworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgYWlvY2I2NAoreworICBpbnQgYWlvX2ZpbGRlczsJCS8qIEZpbGUgZGVzcmlwdG9yLiAgKi8KKyAgaW50IGFpb19saW9fb3Bjb2RlOwkJLyogT3BlcmF0aW9uIHRvIGJlIHBlcmZvcm1lZC4gICovCisgIGludCBhaW9fcmVxcHJpbzsJCS8qIFJlcXVlc3QgcHJpb3JpdHkgb2Zmc2V0LiAgKi8KKyAgdm9sYXRpbGUgdm9pZCAqYWlvX2J1ZjsJLyogTG9jYXRpb24gb2YgYnVmZmVyLiAgKi8KKyAgc2l6ZV90IGFpb19uYnl0ZXM7CQkvKiBMZW5ndGggb2YgdHJhbnNmZXIuICAqLworICBzdHJ1Y3Qgc2lnZXZlbnQgYWlvX3NpZ2V2ZW50OwkvKiBTaWduYWwgbnVtYmVyIGFuZCB2YWx1ZS4gICovCisKKyAgLyogSW50ZXJuYWwgbWVtYmVycy4gICovCisgIHN0cnVjdCBhaW9jYiAqX19uZXh0X3ByaW87CisgIGludCBfX2Fic19wcmlvOworICBpbnQgX19wb2xpY3k7CisgIGludCBfX2Vycm9yX2NvZGU7CisgIF9fc3NpemVfdCBfX3JldHVybl92YWx1ZTsKKworICBfX29mZjY0X3QgYWlvX29mZnNldDsJCS8qIEZpbGUgb2Zmc2V0LiAgKi8KKyAgY2hhciBfX3VudXNlZFszMl07Cit9OworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVG8gY3VzdG9taXplIHRoZSBpbXBsZW1lbnRhdGlvbiBvbmUgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHN0cnVjdC4KKyAgIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgb25lIGluIElyaXguICAqLworc3RydWN0IGFpb2luaXQKKyAgeworICAgIGludCBhaW9fdGhyZWFkczsJCS8qIE1heGltYWwgbnVtYmVyIG9mIHRocmVhZHMuICAqLworICAgIGludCBhaW9fbnVtOwkJLyogTnVtYmVyIG9mIGV4cGVjdGVkIHNpbXVsdGFuaW91cyByZXF1ZXN0cy4gKi8KKyAgICBpbnQgYWlvX2xvY2tzOwkJLyogTm90IHVzZWQuICAqLworICAgIGludCBhaW9fdXNlZGJhOwkJLyogTm90IHVzZWQuICAqLworICAgIGludCBhaW9fZGVidWc7CQkvKiBOb3QgdXNlZC4gICovCisgICAgaW50IGFpb19udW11c2VyczsJCS8qIE5vdCB1c2VkLiAgKi8KKyAgICBpbnQgYWlvX2lkbGVfdGltZTsJCS8qIE51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSBpZGxlIHRocmVhZAorCQkJCSAgIHRlcm1pbmF0ZXMuICAqLworICAgIGludCBhaW9fcmVzZXJ2ZWQ7CisgIH07CisjZW5kaWYKKworCisvKiBSZXR1cm4gdmFsdWVzIG9mIGNhbmNlbGF0aW9uIGZ1bmN0aW9uLiAgKi8KK2VudW0KK3sKKyAgQUlPX0NBTkNFTEVELAorI2RlZmluZSBBSU9fQ0FOQ0VMRUQgQUlPX0NBTkNFTEVECisgIEFJT19OT1RDQU5DRUxFRCwKKyNkZWZpbmUgQUlPX05PVENBTkNFTEVEIEFJT19OT1RDQU5DRUxFRAorICBBSU9fQUxMRE9ORQorI2RlZmluZSBBSU9fQUxMRE9ORSBBSU9fQUxMRE9ORQorfTsKKworCisvKiBPcGVyYXRpb24gY29kZXMgZm9yIGBhaW9fbGlvX29wY29kZScuICAqLworZW51bQoreworICBMSU9fUkVBRCwKKyNkZWZpbmUgTElPX1JFQUQgTElPX1JFQUQKKyAgTElPX1dSSVRFLAorI2RlZmluZSBMSU9fV1JJVEUgTElPX1dSSVRFCisgIExJT19OT1AKKyNkZWZpbmUgTElPX05PUCBMSU9fTk9QCit9OworCisKKy8qIFN5bmNocm9uaXphdGlvbiBvcHRpb25zIGZvciBgbGlvX2xpc3RpbycgZnVuY3Rpb24uICAqLworZW51bQoreworICBMSU9fV0FJVCwKKyNkZWZpbmUgTElPX1dBSVQgTElPX1dBSVQKKyAgTElPX05PV0FJVAorI2RlZmluZSBMSU9fTk9XQUlUIExJT19OT1dBSVQKK307CisKKworLyogQWxsb3cgdXNlciB0byBzcGVjaWZ5IG9wdGltaXphdGlvbi4gICovCisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gdm9pZCBhaW9faW5pdCAoX19jb25zdCBzdHJ1Y3QgYWlvaW5pdCAqX19pbml0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorLyogRW5xdWV1ZSByZWFkIHJlcXVlc3QgZm9yIGdpdmVuIG51bWJlciBvZiBieXRlcyBhbmQgdGhlIGdpdmVuIHByaW9yaXR5LiAgKi8KK2V4dGVybiBpbnQgYWlvX3JlYWQgKHN0cnVjdCBhaW9jYiAqX19haW9jYnApIF9fVEhST1cgX19ub25udWxsICgoMSkpOworLyogRW5xdWV1ZSB3cml0ZSByZXF1ZXN0IGZvciBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYW5kIHRoZSBnaXZlbiBwcmlvcml0eS4gICovCitleHRlcm4gaW50IGFpb193cml0ZSAoc3RydWN0IGFpb2NiICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEluaXRpYXRlIGxpc3Qgb2YgSS9PIHJlcXVlc3RzLiAgKi8KK2V4dGVybiBpbnQgbGlvX2xpc3RpbyAoaW50IF9fbW9kZSwKKwkJICAgICAgIHN0cnVjdCBhaW9jYiAqX19jb25zdCBfX2xpc3RbX19yZXN0cmljdF9hcnJdLAorCQkgICAgICAgaW50IF9fbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogUmV0cmlldmUgZXJyb3Igc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCBBSU9DQlAuICAqLworZXh0ZXJuIGludCBhaW9fZXJyb3IgKF9fY29uc3Qgc3RydWN0IGFpb2NiICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisvKiBSZXR1cm4gc3RhdHVzIGFzc29jaWF0ZWQgd2l0aCBBSU9DQlAuICAqLworZXh0ZXJuIF9fc3NpemVfdCBhaW9fcmV0dXJuIChzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IHRvIGNhbmNlbCBhc3luY2hyb25vdXMgSS9PIHJlcXVlc3RzIG91dHN0YW5kaW5nIGFnYWluc3QgZmlsZQorICAgZGVzY3JpcHRvciBGSUxERVMuICAqLworZXh0ZXJuIGludCBhaW9fY2FuY2VsIChpbnQgX19maWxkZXMsIHN0cnVjdCBhaW9jYiAqX19haW9jYnApIF9fVEhST1c7CisKKy8qIFN1c3BlbmQgY2FsbGluZyB0aHJlYWQgdW50aWwgYXQgbGVhc3Qgb25lIG9mIHRoZSBhc3luY2hyb25vdXMgSS9PCisgICBvcGVyYXRpb25zIHJlZmVyZW5jZWQgYnkgTElTVCBoYXMgY29tcGxldGVkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgYWlvX3N1c3BlbmQgKF9fY29uc3Qgc3RydWN0IGFpb2NiICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19uZW50LAorCQkJX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0KQorICBfX25vbm51bGwgKCgxKSk7CisKKy8qIEZvcmNlIGFsbCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBmaWxlIGRlc3JpcHRvciBkZXNjcmliZWQgYnkKKyAgIGBhaW9fZmlsZGVzJyBtZW1iZXIgb2YgQUlPQ0JQLiAgKi8KK2V4dGVybiBpbnQgYWlvX2ZzeW5jIChpbnQgX19vcGVyYXRpb24sIHN0cnVjdCBhaW9jYiAqX19haW9jYnApCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19yZWFkLCAoc3RydWN0IGFpb2NiICpfX2Fpb2NicCksIGFpb19yZWFkNjQpCisgIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb193cml0ZSwgKHN0cnVjdCBhaW9jYiAqX19haW9jYnApLCBhaW9fd3JpdGU2NCkKKyAgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChsaW9fbGlzdGlvLAorCQkJICAgKGludCBfX21vZGUsCisJCQkgICAgc3RydWN0IGFpb2NiICpfX2NvbnN0IF9fbGlzdFtfX3Jlc3RyaWN0X2Fycl0sCisJCQkgICAgaW50IF9fbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKSwKKwkJCSAgIGxpb19saXN0aW82NCkgX19ub25udWxsICgoMikpOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhaW9fZXJyb3IsIChfX2NvbnN0IHN0cnVjdCBhaW9jYiAqX19haW9jYnApLAorCQkJICAgYWlvX2Vycm9yNjQpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBfX3NzaXplX3QgX19SRURJUkVDVF9OVEggKGFpb19yZXR1cm4sIChzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwKKwkJCQkgYWlvX3JldHVybjY0KSBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19jYW5jZWwsCisJCQkgICAoaW50IF9fZmlsZGVzLCBzdHJ1Y3QgYWlvY2IgKl9fYWlvY2JwKSwKKwkJCSAgIGFpb19jYW5jZWw2NCk7CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19zdXNwZW5kLAorCQkJICAgKF9fY29uc3Qgc3RydWN0IGFpb2NiICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19uZW50LAorCQkJICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0IF9fdGltZW91dCksCisJCQkgICBhaW9fc3VzcGVuZDY0KSBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGFpb19mc3luYywKKwkJCSAgIChpbnQgX19vcGVyYXRpb24sIHN0cnVjdCBhaW9jYiAqX19haW9jYnApLAorCQkJICAgYWlvX2ZzeW5jNjQpIF9fbm9ubnVsbCAoKDIpKTsKKworIyBlbHNlCisjICBkZWZpbmUgYWlvX3JlYWQgYWlvX3JlYWQ2NAorIyAgZGVmaW5lIGFpb193cml0ZSBhaW9fd3JpdGU2NAorIyAgZGVmaW5lIGxpb19saXN0aW8gbGlvX2xpc3RpbzY0CisjICBkZWZpbmUgYWlvX2Vycm9yIGFpb19lcnJvcjY0CisjICBkZWZpbmUgYWlvX3JldHVybiBhaW9fcmV0dXJuNjQKKyMgIGRlZmluZSBhaW9fY2FuY2VsIGFpb19jYW5jZWw2NAorIyAgZGVmaW5lIGFpb19zdXNwZW5kIGFpb19zdXNwZW5kNjQKKyMgIGRlZmluZSBhaW9fZnN5bmMgYWlvX2ZzeW5jNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgYWlvX3JlYWQ2NCAoc3RydWN0IGFpb2NiNjQgKl9fYWlvY2JwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgYWlvX3dyaXRlNjQgKHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgbGlvX2xpc3RpbzY0IChpbnQgX19tb2RlLAorCQkJIHN0cnVjdCBhaW9jYjY0ICpfX2NvbnN0IF9fbGlzdFtfX3Jlc3RyaWN0X2Fycl0sCisJCQkgaW50IF9fbmVudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworZXh0ZXJuIGludCBhaW9fZXJyb3I2NCAoX19jb25zdCBzdHJ1Y3QgYWlvY2I2NCAqX19haW9jYnApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIF9fc3NpemVfdCBhaW9fcmV0dXJuNjQgKHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK2V4dGVybiBpbnQgYWlvX2NhbmNlbDY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkgX19USFJPVzsKKworZXh0ZXJuIGludCBhaW9fc3VzcGVuZDY0IChfX2NvbnN0IHN0cnVjdCBhaW9jYjY0ICpfX2NvbnN0IF9fbGlzdFtdLCBpbnQgX19uZW50LAorCQkJICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdCBfX3RpbWVvdXQpCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCitleHRlcm4gaW50IGFpb19mc3luYzY0IChpbnQgX19vcGVyYXRpb24sIHN0cnVjdCBhaW9jYjY0ICpfX2Fpb2NicCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFpby5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FsaWFzZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxpYXNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FsaWFzZXMuaApAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0FMSUFTRVNfSAorI2RlZmluZSBfQUxJQVNFU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0cnVjdHVyZSB0byByZXByZXNlbnQgb25lIGVudHJ5IG9mIHRoZSBhbGlhcyBkYXRhIGJhc2UuICAqLworc3RydWN0IGFsaWFzZW50CisgIHsKKyAgICBjaGFyICphbGlhc19uYW1lOworICAgIHNpemVfdCBhbGlhc19tZW1iZXJzX2xlbjsKKyAgICBjaGFyICoqYWxpYXNfbWVtYmVyczsKKyAgICBpbnQgYWxpYXNfbG9jYWw7CisgIH07CisKKworLyogT3BlbiBhbGlhcyBkYXRhIGJhc2UgZmlsZXMuICAqLworZXh0ZXJuIHZvaWQgc2V0YWxpYXNlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIENsb3NlIGFsaWFzIGRhdGEgYmFzZSBmaWxlcy4gICovCitleHRlcm4gdm9pZCBlbmRhbGlhc2VudCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGFsaWFzIGRhdGEgYmFzZS4gICovCitleHRlcm4gc3RydWN0IGFsaWFzZW50ICpnZXRhbGlhc2VudCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBuZXh0IGVudHJ5IGZyb20gdGhlIGFsaWFzIGRhdGEgYmFzZSBhbmQgcHV0IGl0IGluIFJFU1VMVF9CVUYuICAqLworZXh0ZXJuIGludCBnZXRhbGlhc2VudF9yIChzdHJ1Y3QgYWxpYXNlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQkgIHN0cnVjdCBhbGlhc2VudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1c7CisKKy8qIEdldCBhbGlhcyBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIE5BTUUuICAqLworZXh0ZXJuIHN0cnVjdCBhbGlhc2VudCAqZ2V0YWxpYXNieW5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworCisvKiBHZXQgYWxpYXMgZW50cnkgY29ycmVzcG9uZGluZyB0byBOQU1FIGFuZCBwdXQgaXQgaW4gUkVTVUxUX0JVRi4gICovCitleHRlcm4gaW50IGdldGFsaWFzYnluYW1lX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgIHN0cnVjdCBhbGlhc2VudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgc3RydWN0IGFsaWFzZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFsaWFzZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbGxvY2EuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxsb2NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkMjkxZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxsb2NhLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9BTExPQ0FfSAorI2RlZmluZQlfQUxMT0NBX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmVtb3ZlIGFueSBwcmV2aW91cyBkZWZpbml0aW9ucy4gICovCisjdW5kZWYJYWxsb2NhCisKKy8qIEFsbG9jYXRlIGEgYmxvY2sgdGhhdCB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24gZXhpdHMuICAqLworZXh0ZXJuIHZvaWQgKmFsbG9jYSAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworI2lmZGVmCV9fR05VQ19fCisjIGRlZmluZSBhbGxvY2Eoc2l6ZSkJX19idWlsdGluX2FsbG9jYSAoc2l6ZSkKKyNlbmRpZiAvKiBHQ0MuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogYWxsb2NhLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hbGlzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2FsaXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ZWQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hbGlzcC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAgQUxTQSBsaXNwIGltcGxlbWVudGF0aW9uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCitzdHJ1Y3QgYWxpc3BfY2ZnIHsKKwlpbnQgdmVyYm9zZTogMSwKKwkgICAgd2FybmluZzogMSwKKwkgICAgZGVidWc6IDE7CisJc25kX2lucHV0X3QgKmluOwkvKiBwcm9ncmFtIGNvZGUgKi8KKwlzbmRfb3V0cHV0X3QgKm91dDsJLyogcHJvZ3JhbSBvdXRwdXQgKi8KKwlzbmRfb3V0cHV0X3QgKmVvdXQ7CS8qIGVycm9yIG91dHB1dCAqLworCXNuZF9vdXRwdXRfdCAqdm91dDsJLyogdmVyYm9zZSBvdXRwdXQgKi8KKwlzbmRfb3V0cHV0X3QgKndvdXQ7CS8qIHdhcm5pbmcgb3V0cHV0ICovCisJc25kX291dHB1dF90ICpkb3V0OwkvKiBkZWJ1ZyBvdXRwdXQgKi8KK307CisKK3N0cnVjdCBhbGlzcF9pbnN0YW5jZTsKK3N0cnVjdCBhbGlzcF9vYmplY3Q7CitzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yOworCitzdHJ1Y3QgYWxpc3BfY2ZnICphbHNhX2xpc3BfZGVmYXVsdF9jZmcoc25kX2lucHV0X3QgKmlucHV0KTsKK3ZvaWQgYWxzYV9saXNwX2RlZmF1bHRfY2ZnX2ZyZWUoc3RydWN0IGFsaXNwX2NmZyAqY2ZnKTsKK2ludCBhbHNhX2xpc3Aoc3RydWN0IGFsaXNwX2NmZyAqY2ZnLCBzdHJ1Y3QgYWxpc3BfaW5zdGFuY2UgKippbnN0YW5jZSk7Cit2b2lkIGFsc2FfbGlzcF9mcmVlKHN0cnVjdCBhbGlzcF9pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IGFsc2FfbGlzcF9mdW5jdGlvbihzdHJ1Y3QgYWxpc3BfaW5zdGFuY2UgKmluc3RhbmNlLCBzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICoqcmVzdWx0LAorCQkgICAgICAgY29uc3QgY2hhciAqaWQsIGNvbnN0IGNoYXIgKmFyZ3MsIC4uLikKKyNpZm5kZWYgRE9DX0hJRERFTgorCQkgICAgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpCisjZW5kaWYKKwkJICAgICAgIDsKK3ZvaWQgYWxzYV9saXNwX3Jlc3VsdF9mcmVlKHN0cnVjdCBhbGlzcF9pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgICBzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpyZXN1bHQpOworaW50IGFsc2FfbGlzcF9zZXFfZmlyc3Qoc3RydWN0IGFsaXNwX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqaWQsCisJCQlzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICoqc2VxKTsKK2ludCBhbHNhX2xpc3Bfc2VxX25leHQoc3RydWN0IGFsaXNwX3NlcV9pdGVyYXRvciAqKnNlcSk7CitpbnQgYWxzYV9saXNwX3NlcV9jb3VudChzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpzZXEpOworaW50IGFsc2FfbGlzcF9zZXFfaW50ZWdlcihzdHJ1Y3QgYWxpc3Bfc2VxX2l0ZXJhdG9yICpzZXEsIGxvbmcgKnZhbCk7CitpbnQgYWxzYV9saXNwX3NlcV9wb2ludGVyKHN0cnVjdCBhbGlzcF9zZXFfaXRlcmF0b3IgKnNlcSwgY29uc3QgY2hhciAqcHRyX2lkLCB2b2lkICoqcHRyKTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRlZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Fzb3VuZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1Yjk3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRlZi5oCkBAIC0wLDAgKzEsMjUzIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvYXNvdW5kZWYuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBEZWZpbml0aW9ucyBvZiBjb25zdGFudHMgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0FTT1VOREVGX0gKKyNkZWZpbmUgX19BTFNBX0FTT1VOREVGX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqIFxkZWZncm91cCBEaWdpdGFsX0F1ZGlvX0ludGVyZmFjZSBDb25zdGFudHMgZm9yIERpZ2l0YWwgQXVkaW8gSW50ZXJmYWNlcworICogQUVTL0lFQzk1OCBjaGFubmVsIHN0YXR1cyBiaXRzLgorICogXHsKKyAqLworCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTAkoMTw8MCkJLyoqPCAwID0gY29uc3VtZXIsIDEgPSBwcm9mZXNzaW9uYWwgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfTk9OQVVESU8JCSgxPDwxKQkvKio8IDAgPSBhdWRpbywgMSA9IG5vbi1hdWRpbyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMJKDc8PDIpCS8qKjwgbWFzayAtIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19OT1RJRAkoMDw8MikJLyoqPCBlbXBoYXNpcyBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU19OT05FCSgxPDwyKQkvKio8IG5vIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19FTVBIQVNJU181MDE1CSgzPDwyKQkvKio8IDUwLzE1dXMgZW1waGFzaXMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTX0NDSVRUCSg3PDwyKQkvKio8IENDSVRUIEouMTcgZW1waGFzaXMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfUFJPX0ZSRVFfVU5MT0NLRUQJKDE8PDUpCS8qKjwgc291cmNlIHNhbXBsZSBmcmVxdWVuY3k6IDAgPSBsb2NrZWQsIDEgPSB1bmxvY2tlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlMJCSgzPDw2KQkvKio8IG1hc2sgLSBzYW1wbGUgZnJlcXVlbmN5ICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GU19OT1RJRAkoMDw8NikJLyoqPCBmcyBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GU180NDEwMAkoMTw8NikJLyoqPCA0NC4xa0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMwX1BST19GU180ODAwMAkoMjw8NikJLyoqPCA0OGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTMF9QUk9fRlNfMzIwMDAJKDM8PDYpCS8qKjwgMzJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQJKDE8PDIpCS8qKjwgMCA9IGNvcHlyaWdodCwgMSA9IG5vdCBjb3B5cmlnaHQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTCSg3PDwzKQkvKio8IG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfTk9ORQkoMDw8MykJLyoqPCBubyBlbXBoYXNpcyAqLworI2RlZmluZSBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVNfNTAxNQkoMTw8MykJLyoqPCA1MC8xNXVzIGVtcGhhc2lzICovCisjZGVmaW5lIElFQzk1OF9BRVMwX0NPTl9NT0RFCQkoMzw8NikJLyoqPCBtYXNrIC0gbW9kZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fTU9ERQkJKDE1PDwwKQkvKio8IG1hc2sgLSBjaGFubmVsIG1vZGUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfTk9USUQJKDA8PDApCS8qKjwgbW9kZSBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX1NURVJFT1BIT05JQyAoMjw8MCkgLyoqPCBzdGVyZW9waG9uaWMgLSBjaCBBIGlzIGxlZnQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfU0lOR0xFCSg0PDwwKQkvKio8IHNpbmdsZSBjaGFubmVsICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19NT0RFX1RXTwkoODw8MCkJLyoqPCB0d28gY2hhbm5lbHMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfUFJJTUFSWQkoMTI8PDApCS8qKjwgcHJpbWFyeS9zZWNvbmRhcnkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX01PREVfQllURTMJKDE1PDwwKQkvKio8IHZlY3RvciB0byBieXRlIDMgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfUFJPX1VTRVJCSVRTCSgxNTw8NCkJLyoqPCBtYXNrIC0gdXNlciBiaXRzICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19VU0VSQklUU19OT1RJRAkoMDw8NCkJLyoqPCB1c2VyIGJpdHMgbm90IGluZGljYXRlZCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9QUk9fVVNFUkJJVFNfMTkyCSg4PDw0KQkvKio8IDE5Mi1iaXQgc3RydWN0dXJlICovCisjZGVmaW5lIElFQzk1OF9BRVMxX1BST19VU0VSQklUU19VREVGCSgxMjw8NCkJLyoqPCB1c2VyIGRlZmluZWQgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZCTB4N2YJLyoqPCBjb25zdW1lciBjYXRlZ29yeSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fR0VORVJBTAkJMHgwMAkvKio8IGdlbmVyYWwgY2F0ZWdvcnkgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0VYUEVSSU1FTlRBTAkweDQwCS8qKjwgZXhwZXJpbWVudGFsIGNhdGVnb3J5ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9TT0xJRE1FTV9NQVNLCTB4MGYJLyoqPCA/Pz8gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NPTElETUVNX0lECTB4MDgJLyoqPCA/Pz8gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0JST0FEQ0FTVDFfTUFTSyAweDA3CS8qKjwgPz8/ICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QxX0lECTB4MDQJLyoqPCA/Pz8gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfTUFTSyAweDA3CS8qKjwgZGlnaXRhbDwtPmRpZ2l0YWwgY29udmVydGVyIG1hc2sgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUQJMHgwMgkvKio8IGRpZ2l0YWw8LT5kaWdpdGFsIGNvbnZlcnRlciBpZCAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0NPUFlSSUdIVF9NQVNLIDB4MWYJLyoqPCBBREMgQ29weXJpZ2h0IG1hc2sgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfSUQgMHgwNgkvKio8IEFEQyBDb3B5cmlnaHQgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0FEQ19NQVNLCTB4MWYJLyoqPCBBREMgTWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fQURDX0lECQkweDE2CS8qKjwgQURDIElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QyX01BU0sgMHgwZgkvKio8IEJyb2FkY2FzdCBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9CUk9BRENBU1QyX0lECTB4MGUJLyoqPCBCcm9hZGNhc3QgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX01BU0sJMHgwNwkvKio8IExhc2VyLW9wdGljYWwgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTEFTRVJPUFRfSUQJMHgwMQkvKio8IExhc2VyLW9wdGljYWwgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01VU0lDQUxfTUFTSwkweDA3CS8qKjwgTXVzaWNhbCBkZXZpY2UgbWFzayAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRAkweDA1CS8qKjwgTXVzaWNhbCBkZXZpY2UgSUQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX01BU0sJMHgwNwkvKio8IE1hZ25ldGljIGRldmljZSBtYXNrICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19JRAkweDAzCS8qKjwgTWFnbmV0aWMgZGV2aWNlIElEICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9JRUM5MDhfQ0QJKElFQzk1OF9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDAwKQkvKio8IElFQzk1OCBDRCBjb21wYXRpYmxlIGRldmljZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fTk9OX0lFQzkwOF9DRAkoSUVDOTU4X0FFUzFfQ09OX0xBU0VST1BUX0lEfDB4MDgpCS8qKjwgbm9uLUlFQzk1OCBDRCBjb21wYXRpYmxlIGRldmljZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fUENNX0NPREVSCShJRUM5NThfQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDAwKQkvKio8IFBDTSBjb2RlciAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fU0FNUExFUgkJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MjApCS8qKjwgUENNIHNhbXBsZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX01JWEVSCQkoSUVDOTU4X0FFUzFfQ09OX0RJR0RJR0NPTlZfSUR8MHgxMCkJLyoqPCBNaXhlciAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fUkFURV9DT05WRVJURVIJKElFQzk1OF9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MTgpCS8qKjwgUmF0ZSBjb252ZXJ0ZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX1NZTlRIRVNJWkVSCShJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRHwweDAwKQkvKio8IFN5bnRoZXNpemVyICovCisjZGVmaW5lIElFQzk1OF9BRVMxX0NPTl9NSUNST1BIT05FCShJRUM5NThfQUVTMV9DT05fTVVTSUNBTF9JRHwweDA4KQkvKio8IE1pY3JvcGhvbmUgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX0RBVAkJKElFQzk1OF9BRVMxX0NPTl9NQUdORVRJQ19JRHwweDAwKQkvKio8IERpZ2l0YWwgQXVkaW8gVGFwZSAqLworI2RlZmluZSBJRUM5NThfQUVTMV9DT05fVkNSCQkoSUVDOTU4X0FFUzFfQ09OX01BR05FVElDX0lEfDB4MDgpCS8qKjwgVmlkZW8gcmVjb3JkZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzFfQ09OX09SSUdJTkFMCSgxPDw3KQkvKio8IHRoaXMgYml0cyBkZXBlbmRzIG9uIHRoZSBjYXRlZ29yeSBjb2RlICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19TQklUUwkJKDc8PDApCS8qKjwgbWFzayAtIHNhbXBsZSBiaXRzICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19TQklUU18yMAkoMjw8MCkJLyoqPCAyMC1iaXQgLSBjb29yZGluYXRpb24gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1NCSVRTXzI0CSg0PDwwKQkvKio8IDI0LWJpdCAtIG1haW4gYXVkaW8gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1NCSVRTX1VERUYJKDY8PDApCS8qKjwgdXNlciBkZWZpbmVkIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19XT1JETEVOCQkoNzw8MykJLyoqPCBtYXNrIC0gc291cmNlIHdvcmQgbGVuZ3RoICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19XT1JETEVOX05PVElECSgwPDwzKQkvKio8IHNvdXJjZSB3b3JkIGxlbmd0aCBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19XT1JETEVOXzIyXzE4CSgyPDwzKQkvKio8IDIyLWJpdCBvciAxOC1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfUFJPX1dPUkRMRU5fMjNfMTkJKDQ8PDMpCS8qKjwgMjMtYml0IG9yIDE5LWJpdCAqLworI2RlZmluZSBJRUM5NThfQUVTMl9QUk9fV09SRExFTl8yNF8yMAkoNTw8MykJLyoqPCAyNC1iaXQgb3IgMjAtYml0ICovCisjZGVmaW5lIElFQzk1OF9BRVMyX1BST19XT1JETEVOXzIwXzE2CSg2PDwzKQkvKio8IDIwLWJpdCBvciAxNi1iaXQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfQ09OX1NPVVJDRQkJKDE1PDwwKQkvKio8IG1hc2sgLSBzb3VyY2UgbnVtYmVyICovCisjZGVmaW5lIElFQzk1OF9BRVMyX0NPTl9TT1VSQ0VfVU5TUEVDCSgwPDwwKQkvKio8IHNvdXJjZSBudW1iZXIgdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfQ09OX0NIQU5ORUwJCSgxNTw8NCkJLyoqPCBtYXNrIC0gY2hhbm5lbCBudW1iZXIgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzJfQ09OX0NIQU5ORUxfVU5TUEVDCSgwPDw0KQkvKio8IGNoYW5uZWwgbnVtYmVyIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GUwkJKDE1PDwwKQkvKio8IG1hc2sgLSBzYW1wbGUgZnJlcXVlbmN5ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU180NDEwMAkoMDw8MCkJLyoqPCA0NC4xa0h6ICovCisjZGVmaW5lIElFQzk1OF9BRVMzX0NPTl9GU180ODAwMAkoMjw8MCkJLyoqPCA0OGtIeiAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fRlNfMzIwMDAJKDM8PDApCS8qKjwgMzJrSHogKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLCQkoMzw8NCkJLyoqPCBtYXNrIC0gY2xvY2sgYWNjdXJhY3kgKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLXzEwMDBQUE0JKDA8PDQpCS8qKjwgMTAwMCBwcG0gKi8KKyNkZWZpbmUgSUVDOTU4X0FFUzNfQ09OX0NMT0NLXzUwUFBNCSgxPDw0KQkvKio8IDUwIHBwbSAqLworI2RlZmluZSBJRUM5NThfQUVTM19DT05fQ0xPQ0tfVkFSSUFCTEUJKDI8PDQpCS8qKjwgdmFyaWFibGUgcGl0Y2ggKi8KKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIE1JRElfSW50ZXJmYWNlIENvbnN0YW50cyBmb3IgTUlESSB2MS4wCisgKiBDb25zdGFudHMgZm9yIE1JREkgdjEuMC4KKyAqIFx7CisgKi8KKworI2RlZmluZSBNSURJX0NIQU5ORUxTCQkJMTYJLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgcGVyIHBvcnQvY2FibGUuICovCisjZGVmaW5lIE1JRElfR01fRFJVTV9DSEFOTkVMCQkoMTAtMSkJLyoqPCBDaGFubmVsIG51bWJlciBmb3IgR00gZHJ1bXMuICovCisKKy8qKgorICogXGRlZmdyb3VwIE1JRElfQ29tbWFuZHMgTUlESSBDb21tYW5kcworICogTUlESSBjb21tYW5kIGNvZGVzLgorICogXHsKKyAqLworCisjZGVmaW5lIE1JRElfQ01EX05PVEVfT0ZGCQkweDgwCS8qKjwgbm90ZSBvZmYgKi8KKyNkZWZpbmUgTUlESV9DTURfTk9URV9PTgkJMHg5MAkvKio8IG5vdGUgb24gKi8KKyNkZWZpbmUgTUlESV9DTURfTk9URV9QUkVTU1VSRQkJMHhhMAkvKio8IGtleSBwcmVzc3VyZSAqLworI2RlZmluZSBNSURJX0NNRF9DT05UUk9MCQkweGIwCS8qKjwgY29udHJvbCBjaGFuZ2UgKi8KKyNkZWZpbmUgTUlESV9DTURfUEdNX0NIQU5HRQkJMHhjMAkvKio8IHByb2dyYW0gY2hhbmdlICovCisjZGVmaW5lIE1JRElfQ01EX0NIQU5ORUxfUFJFU1NVUkUJMHhkMAkvKio8IGNoYW5uZWwgcHJlc3N1cmUgKi8KKyNkZWZpbmUgTUlESV9DTURfQkVOREVSCQkJMHhlMAkvKio8IHBpdGNoIGJlbmRlciAqLworCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9TWVNFWAkJMHhmMAkvKio8IHN5c2V4IChzeXN0ZW0gZXhjbHVzaXZlKSBiZWdpbiAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fTVRDX1FVQVJURVIJMHhmMQkvKio8IE1UQyBxdWFydGVyIGZyYW1lICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9TT05HX1BPUwkweGYyCS8qKjwgc29uZyBwb3NpdGlvbiAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU09OR19TRUxFQ1QJMHhmMwkvKio8IHNvbmcgc2VsZWN0ICovCisjZGVmaW5lIE1JRElfQ01EX0NPTU1PTl9UVU5FX1JFUVVFU1QJMHhmNgkvKio8IHR1bmUgcmVxdWVzdCAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU1lTRVhfRU5ECTB4ZjcJLyoqPCBlbmQgb2Ygc3lzZXggKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX0NMT0NLCQkweGY4CS8qKjwgY2xvY2sgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NUQVJUCQkweGZhCS8qKjwgc3RhcnQgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX0NPTlRJTlVFCTB4ZmIJLyoqPCBjb250aW51ZSAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fU1RPUAkJMHhmYwkvKio8IHN0b3AgKi8KKyNkZWZpbmUgTUlESV9DTURfQ09NTU9OX1NFTlNJTkcJCTB4ZmUJLyoqPCBhY3RpdmUgc2Vuc2luZyAqLworI2RlZmluZSBNSURJX0NNRF9DT01NT05fUkVTRVQJCTB4ZmYJLyoqPCByZXNldCAqLworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgTUlESV9Db250cm9sbGVycyBNSURJIENvbnRyb2xsZXJzCisgKiBNSURJIGNvbnRyb2xsZXIgbnVtYmVycy4KKyAqIFx7CisgKi8KKworI2RlZmluZSBNSURJX0NUTF9NU0JfQkFOSwkJMHgwMAkvKio8IEJhbmsgc2VsZWN0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9NT0RXSEVFTCAgICAgICAgIAkweDAxCS8qKjwgTW9kdWxhdGlvbiAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfQlJFQVRIICAgICAgICAgICAJMHgwMgkvKio8IEJyZWF0aCAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfRk9PVCAgICAgICAgICAgICAJMHgwNAkvKio8IEZvb3QgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX1BPUlRBTUVOVE9fVElNRSAJMHgwNQkvKio8IFBvcnRhbWVudG8gdGltZSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfREFUQV9FTlRSWQkJMHgwNgkvKio8IERhdGEgZW50cnkgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX01BSU5fVk9MVU1FICAgICAgCTB4MDcJLyoqPCBNYWluIHZvbHVtZSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfQkFMQU5DRSAgICAgICAgICAJMHgwOAkvKio8IEJhbGFuY2UgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX1BBTiAgICAgICAgICAgICAgCTB4MGEJLyoqPCBQYW5wb3QgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0VYUFJFU1NJT04gICAgICAgCTB4MGIJLyoqPCBFeHByZXNzaW9uICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9FRkZFQ1QxCQkweDBjCS8qKjwgRWZmZWN0MSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfRUZGRUNUMgkJMHgwZAkvKio8IEVmZmVjdDIgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0dFTkVSQUxfUFVSUE9TRTEgCTB4MTAJLyoqPCBHZW5lcmFsIHB1cnBvc2UgMSAqLworI2RlZmluZSBNSURJX0NUTF9NU0JfR0VORVJBTF9QVVJQT1NFMiAJMHgxMQkvKio8IEdlbmVyYWwgcHVycG9zZSAyICovCisjZGVmaW5lIE1JRElfQ1RMX01TQl9HRU5FUkFMX1BVUlBPU0UzIAkweDEyCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDMgKi8KKyNkZWZpbmUgTUlESV9DVExfTVNCX0dFTkVSQUxfUFVSUE9TRTQgCTB4MTMJLyoqPCBHZW5lcmFsIHB1cnBvc2UgNCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfQkFOSwkJMHgyMAkvKio8IEJhbmsgc2VsZWN0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9NT0RXSEVFTCAgICAgICAgCTB4MjEJLyoqPCBNb2R1bGF0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9CUkVBVEggICAgICAgICAgIAkweDIyCS8qKjwgQnJlYXRoICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9GT09UICAgICAgICAgICAgIAkweDI0CS8qKjwgRm9vdCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfUE9SVEFNRU5UT19USU1FIAkweDI1CS8qKjwgUG9ydGFtZW50byB0aW1lICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9EQVRBX0VOVFJZCQkweDI2CS8qKjwgRGF0YSBlbnRyeSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfTUFJTl9WT0xVTUUgICAgICAJMHgyNwkvKio8IE1haW4gdm9sdW1lICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9CQUxBTkNFICAgICAgICAgIAkweDI4CS8qKjwgQmFsYW5jZSAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfUEFOICAgICAgICAgICAgICAJMHgyYQkvKio8IFBhbnBvdCAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfRVhQUkVTU0lPTiAgICAgICAJMHgyYgkvKio8IEV4cHJlc3Npb24gKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0VGRkVDVDEJCTB4MmMJLyoqPCBFZmZlY3QxICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9FRkZFQ1QyCQkweDJkCS8qKjwgRWZmZWN0MiAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfR0VORVJBTF9QVVJQT1NFMSAJMHgzMAkvKio8IEdlbmVyYWwgcHVycG9zZSAxICovCisjZGVmaW5lIE1JRElfQ1RMX0xTQl9HRU5FUkFMX1BVUlBPU0UyIAkweDMxCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDIgKi8KKyNkZWZpbmUgTUlESV9DVExfTFNCX0dFTkVSQUxfUFVSUE9TRTMgCTB4MzIJLyoqPCBHZW5lcmFsIHB1cnBvc2UgMyAqLworI2RlZmluZSBNSURJX0NUTF9MU0JfR0VORVJBTF9QVVJQT1NFNCAJMHgzMwkvKio8IEdlbmVyYWwgcHVycG9zZSA0ICovCisjZGVmaW5lIE1JRElfQ1RMX1NVU1RBSU4gICAgICAgICAgICAgIAkweDQwCS8qKjwgU3VzdGFpbiBwZWRhbCAqLworI2RlZmluZSBNSURJX0NUTF9QT1JUQU1FTlRPICAgICAgICAgICAJMHg0MQkvKio8IFBvcnRhbWVudG8gKi8KKyNkZWZpbmUgTUlESV9DVExfU09TVEVOVVRPICAgICAgICAgICAgCTB4NDIJLyoqPCBTb3N0ZW51dG8gKi8KKyNkZWZpbmUgTUlESV9DVExfU1VTVEVOVVRPICAgICAgICAgICAgCTB4NDIJLyoqPCBTb3N0ZW51dG8gKGEgdHlwbyBpbiB0aGUgb2xkZXIgdmVyc2lvbikgKi8KKyNkZWZpbmUgTUlESV9DVExfU09GVF9QRURBTCAgICAgICAgICAgCTB4NDMJLyoqPCBTb2Z0IHBlZGFsICovCisjZGVmaW5lIE1JRElfQ1RMX0xFR0FUT19GT09UU1dJVENICTB4NDQJLyoqPCBMZWdhdG8gZm9vdCBzd2l0Y2ggKi8KKyNkZWZpbmUgTUlESV9DVExfSE9MRDIgICAgICAgICAgICAgICAgCTB4NDUJLyoqPCBIb2xkMiAqLworI2RlZmluZSBNSURJX0NUTF9TQzFfU09VTkRfVkFSSUFUSU9OCTB4NDYJLyoqPCBTQzEgU291bmQgVmFyaWF0aW9uICovCisjZGVmaW5lIE1JRElfQ1RMX1NDMl9USU1CUkUJCTB4NDcJLyoqPCBTQzIgVGltYnJlICovCisjZGVmaW5lIE1JRElfQ1RMX1NDM19SRUxFQVNFX1RJTUUJMHg0OAkvKio8IFNDMyBSZWxlYXNlIFRpbWUgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M0X0FUVEFDS19USU1FCTB4NDkJLyoqPCBTQzQgQXR0YWNrIFRpbWUgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M1X0JSSUdIVE5FU1MJCTB4NGEJLyoqPCBTQzUgQnJpZ2h0bmVzcyAqLworI2RlZmluZSBNSURJX0NUTF9TQzYJCQkweDRiCS8qKjwgU0M2ICovCisjZGVmaW5lIE1JRElfQ1RMX1NDNwkJCTB4NGMJLyoqPCBTQzcgKi8KKyNkZWZpbmUgTUlESV9DVExfU0M4CQkJMHg0ZAkvKio8IFNDOCAqLworI2RlZmluZSBNSURJX0NUTF9TQzkJCQkweDRlCS8qKjwgU0M5ICovCisjZGVmaW5lIE1JRElfQ1RMX1NDMTAJCQkweDRmCS8qKjwgU0MxMCAqLworI2RlZmluZSBNSURJX0NUTF9HRU5FUkFMX1BVUlBPU0U1ICAgICAJMHg1MAkvKio8IEdlbmVyYWwgcHVycG9zZSA1ICovCisjZGVmaW5lIE1JRElfQ1RMX0dFTkVSQUxfUFVSUE9TRTYgICAgIAkweDUxCS8qKjwgR2VuZXJhbCBwdXJwb3NlIDYgKi8KKyNkZWZpbmUgTUlESV9DVExfR0VORVJBTF9QVVJQT1NFNyAgICAgCTB4NTIJLyoqPCBHZW5lcmFsIHB1cnBvc2UgNyAqLworI2RlZmluZSBNSURJX0NUTF9HRU5FUkFMX1BVUlBPU0U4ICAgICAJMHg1MwkvKio8IEdlbmVyYWwgcHVycG9zZSA4ICovCisjZGVmaW5lIE1JRElfQ1RMX1BPUlRBTUVOVE9fQ09OVFJPTAkweDU0CS8qKjwgUG9ydGFtZW50byBjb250cm9sICovCisjZGVmaW5lIE1JRElfQ1RMX0UxX1JFVkVSQl9ERVBUSAkweDViCS8qKjwgRTEgUmV2ZXJiIERlcHRoICovCisjZGVmaW5lIE1JRElfQ1RMX0UyX1RSRU1PTE9fREVQVEgJMHg1YwkvKio8IEUyIFRyZW1vbG8gRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfRTNfQ0hPUlVTX0RFUFRICTB4NWQJLyoqPCBFMyBDaG9ydXMgRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfRTRfREVUVU5FX0RFUFRICTB4NWUJLyoqPCBFNCBEZXR1bmUgRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfRTVfUEhBU0VSX0RFUFRICTB4NWYJLyoqPCBFNSBQaGFzZXIgRGVwdGggKi8KKyNkZWZpbmUgTUlESV9DVExfREFUQV9JTkNSRU1FTlQgICAgICAgCTB4NjAJLyoqPCBEYXRhIEluY3JlbWVudCAqLworI2RlZmluZSBNSURJX0NUTF9EQVRBX0RFQ1JFTUVOVCAgICAgICAJMHg2MQkvKio8IERhdGEgRGVjcmVtZW50ICovCisjZGVmaW5lIE1JRElfQ1RMX05PTlJFR19QQVJNX05VTV9MU0IgIAkweDYyCS8qKjwgTm9uLXJlZ2lzdGVyZWQgcGFyYW1ldGVyIG51bWJlciAqLworI2RlZmluZSBNSURJX0NUTF9OT05SRUdfUEFSTV9OVU1fTVNCICAJMHg2MwkvKio8IE5vbi1yZWdpc3RlcmVkIHBhcmFtZXRlciBudW1iZXIgKi8KKyNkZWZpbmUgTUlESV9DVExfUkVHSVNUX1BBUk1fTlVNX0xTQiAgCTB4NjQJLyoqPCBSZWdpc3RlcmVkIHBhcmFtZXRlciBudW1iZXIgKi8KKyNkZWZpbmUgTUlESV9DVExfUkVHSVNUX1BBUk1fTlVNX01TQgkweDY1CS8qKjwgUmVnaXN0ZXJlZCBwYXJhbWV0ZXIgbnVtYmVyICovCisjZGVmaW5lIE1JRElfQ1RMX0FMTF9TT1VORFNfT0ZGCQkweDc4CS8qKjwgQWxsIHNvdW5kcyBvZmYgKi8KKyNkZWZpbmUgTUlESV9DVExfUkVTRVRfQ09OVFJPTExFUlMJMHg3OQkvKio8IFJlc2V0IENvbnRyb2xsZXJzICovCisjZGVmaW5lIE1JRElfQ1RMX0xPQ0FMX0NPTlRST0xfU1dJVENICTB4N2EJLyoqPCBMb2NhbCBjb250cm9sIHN3aXRjaCAqLworI2RlZmluZSBNSURJX0NUTF9BTExfTk9URVNfT0ZGCQkweDdiCS8qKjwgQWxsIG5vdGVzIG9mZiAqLworI2RlZmluZSBNSURJX0NUTF9PTU5JX09GRgkJMHg3YwkvKio8IE9tbmkgb2ZmICovCisjZGVmaW5lIE1JRElfQ1RMX09NTklfT04JCTB4N2QJLyoqPCBPbW5pIG9uICovCisjZGVmaW5lIE1JRElfQ1RMX01PTk8xCQkJMHg3ZQkvKio8IE1vbm8xICovCisjZGVmaW5lIE1JRElfQ1RMX01PTk8yCQkJMHg3ZgkvKio8IE1vbm8yICovCisKKy8qKiBcfSAqLworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9BU09VTkRFRl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kbGliLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvYXNvdW5kbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9hc291bmRsaWIuaApAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvYXNvdW5kbGliLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BU09VTkRMSUJfSAorI2RlZmluZSBfX0FTT1VORExJQl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8YWxzYS9hc291bmRlZi5oPgorI2luY2x1ZGUgPGFsc2EvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFsc2EvZ2xvYmFsLmg+CisjaW5jbHVkZSA8YWxzYS9pbnB1dC5oPgorI2luY2x1ZGUgPGFsc2Evb3V0cHV0Lmg+CisjaW5jbHVkZSA8YWxzYS9lcnJvci5oPgorI2luY2x1ZGUgPGFsc2EvY29uZi5oPgorI2luY2x1ZGUgPGFsc2EvcGNtLmg+CisjaW5jbHVkZSA8YWxzYS9yYXdtaWRpLmg+CisjaW5jbHVkZSA8YWxzYS90aW1lci5oPgorI2luY2x1ZGUgPGFsc2EvaHdkZXAuaD4KKyNpbmNsdWRlIDxhbHNhL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxhbHNhL21peGVyLmg+CisjaW5jbHVkZSA8YWxzYS9zZXFfZXZlbnQuaD4KKyNpbmNsdWRlIDxhbHNhL3NlcS5oPgorI2luY2x1ZGUgPGFsc2Evc2VxbWlkLmg+CisjaW5jbHVkZSA8YWxzYS9zZXFfbWlkaV9ldmVudC5oPgorI2luY2x1ZGUgPGFsc2EvY29udi5oPgorI2luY2x1ZGUgPGFsc2EvaW5zdHIuaD4KKworI2VuZGlmIC8qIF9fQVNPVU5ETElCX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb25mLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMGNhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29uZi5oCkBAIC0wLDAgKzEsMTk4IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvY29uZi5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9DT05GX0gKKyNkZWZpbmUgX19BTFNBX0NPTkZfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBDb25maWcgQ29uZmlndXJhdGlvbiBJbnRlcmZhY2UKKyAqICBUaGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgYW5kIHR5cGVzIGFsbG93IHlvdSB0byByZWFkLCBlbnVtZXJhdGUsCisgKiAgbW9kaWZ5IGFuZCB3cml0ZSB0aGUgY29udGVudHMgb2YgQUxTQSBjb25maWd1cmF0aW9uIGZpbGVzLgorICogIFx7CisgKi8KKworLyoqIFxicmllZiBcYyBkbHN5bSB2ZXJzaW9uIGZvciB0aGUgY29uZmlnIGV2YWx1YXRlIGNhbGxiYWNrLiAqLworI2RlZmluZSBTTkRfQ09ORklHX0RMU1lNX1ZFUlNJT05fRVZBTFVBVEUJX2Rsc3ltX2NvbmZpZ19ldmFsdWF0ZV8wMDEKKy8qKiBcYnJpZWYgXGMgZGxzeW0gdmVyc2lvbiBmb3IgdGhlIGNvbmZpZyBob29rIGNhbGxiYWNrLiAqLworI2RlZmluZSBTTkRfQ09ORklHX0RMU1lNX1ZFUlNJT05fSE9PSwkJX2Rsc3ltX2NvbmZpZ19ob29rXzAwMQorCisvKiogQ29uZmlndXJhdGlvbiBub2RlIHR5cGUuICovCit0eXBlZGVmIGVudW0gX3NuZF9jb25maWdfdHlwZSB7CisJLyoqIEludGVnZXIgbnVtYmVyLiAqLworICAgICAgICBTTkRfQ09ORklHX1RZUEVfSU5URUdFUiwKKwkvKiogNjQgYml0IEludGVnZXIgbnVtYmVyLiAqLworICAgICAgICBTTkRfQ09ORklHX1RZUEVfSU5URUdFUjY0LAorCS8qKiBSZWFsIG51bWJlci4gKi8KKyAgICAgICAgU05EX0NPTkZJR19UWVBFX1JFQUwsCisJLyoqIENoYXJhY3RlciBzdHJpbmcuICovCisgICAgICAgIFNORF9DT05GSUdfVFlQRV9TVFJJTkcsCisgICAgICAgIC8qKiBQb2ludGVyIChydW50aW1lIG9ubHksIGNhbm5vdCBiZSBzYXZlZCkuICovCisgICAgICAgIFNORF9DT05GSUdfVFlQRV9QT0lOVEVSLAorCS8qKiBDb21wb3VuZCBub2RlLiAqLworCVNORF9DT05GSUdfVFlQRV9DT01QT1VORCA9IDEwMjQKK30gc25kX2NvbmZpZ190eXBlX3Q7CisKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYSBjb25maWd1cmF0aW9uIG5vZGUgb2JqZWN0LgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgYXMgYSBoYW5kbGUgdG8gYQorICogY29uZmlndXJhdGlvbiBub2RlLiBBcHBsaWNhdGlvbnMgZG9uJ3QgYWNjZXNzIGl0cyBjb250ZW50cyBkaXJlY3RseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jb25maWcgc25kX2NvbmZpZ190OworLyoqCisgKiBcYnJpZWYgVHlwZSBmb3IgYSBjb25maWd1cmF0aW9uIGNvbXBvdW5kIGl0ZXJhdG9yLgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyB0aGlzIHBvaW50ZXIgdHlwZSBhcyBhIGhhbmRsZSB0byBhIGNvbmZpZ3VyYXRpb24KKyAqIGNvbXBvdW5kIGl0ZXJhdG9yLiBBcHBsaWNhdGlvbnMgZG9uJ3QgZGlyZWN0bHkgYWNjZXNzIHRoZSBjb250ZW50cyBvZgorICogdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoaXMgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jb25maWdfaXRlcmF0b3IgKnNuZF9jb25maWdfaXRlcmF0b3JfdDsKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYSBjb25maWd1cmF0aW9uIHByaXZhdGUgdXBkYXRlIG9iamVjdC4KKyAqCisgKiBUaGUgQUxTQSBsaWJyYXJ5IHVzZXMgdGhpcyBzdHJ1Y3R1cmUgdG8gc2F2ZSBwcml2YXRlIHVwZGF0ZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jb25maWdfdXBkYXRlIHNuZF9jb25maWdfdXBkYXRlX3Q7CisKK2V4dGVybiBzbmRfY29uZmlnX3QgKnNuZF9jb25maWc7CisKK2ludCBzbmRfY29uZmlnX3RvcChzbmRfY29uZmlnX3QgKipjb25maWcpOworCitpbnQgc25kX2NvbmZpZ19sb2FkKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfaW5wdXRfdCAqaW4pOworaW50IHNuZF9jb25maWdfbG9hZF9vdmVycmlkZShzbmRfY29uZmlnX3QgKmNvbmZpZywgc25kX2lucHV0X3QgKmluKTsKK2ludCBzbmRfY29uZmlnX3NhdmUoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfY29uZmlnX3VwZGF0ZSh2b2lkKTsKK2ludCBzbmRfY29uZmlnX3VwZGF0ZV9yKHNuZF9jb25maWdfdCAqKnRvcCwgc25kX2NvbmZpZ191cGRhdGVfdCAqKnVwZGF0ZSwgY29uc3QgY2hhciAqcGF0aCk7CitpbnQgc25kX2NvbmZpZ191cGRhdGVfZnJlZShzbmRfY29uZmlnX3VwZGF0ZV90ICp1cGRhdGUpOworaW50IHNuZF9jb25maWdfdXBkYXRlX2ZyZWVfZ2xvYmFsKHZvaWQpOworCitpbnQgc25kX2NvbmZpZ19zZWFyY2goc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKmtleSwKKwkJICAgICAgc25kX2NvbmZpZ190ICoqcmVzdWx0KTsKK2ludCBzbmRfY29uZmlnX3NlYXJjaHYoc25kX2NvbmZpZ190ICpjb25maWcsIAorCQkgICAgICAgc25kX2NvbmZpZ190ICoqcmVzdWx0LCAuLi4pOworaW50IHNuZF9jb25maWdfc2VhcmNoX2RlZmluaXRpb24oc25kX2NvbmZpZ190ICpjb25maWcsCisJCQkJIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgc25kX2NvbmZpZ190ICoqcmVzdWx0KTsKKworaW50IHNuZF9jb25maWdfZXhwYW5kKHNuZF9jb25maWdfdCAqY29uZmlnLCBzbmRfY29uZmlnX3QgKnJvb3QsCisJCSAgICAgIGNvbnN0IGNoYXIgKmFyZ3MsIHNuZF9jb25maWdfdCAqcHJpdmF0ZV9kYXRhLAorCQkgICAgICBzbmRfY29uZmlnX3QgKipyZXN1bHQpOworaW50IHNuZF9jb25maWdfZXZhbHVhdGUoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9jb25maWdfdCAqcm9vdCwKKwkJCXNuZF9jb25maWdfdCAqcHJpdmF0ZV9kYXRhLCBzbmRfY29uZmlnX3QgKipyZXN1bHQpOworCitpbnQgc25kX2NvbmZpZ19hZGQoc25kX2NvbmZpZ190ICpjb25maWcsIHNuZF9jb25maWdfdCAqbGVhZik7CitpbnQgc25kX2NvbmZpZ19kZWxldGUoc25kX2NvbmZpZ190ICpjb25maWcpOworaW50IHNuZF9jb25maWdfZGVsZXRlX2NvbXBvdW5kX21lbWJlcnMoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcpOworaW50IHNuZF9jb25maWdfY29weShzbmRfY29uZmlnX3QgKipkc3QsIHNuZF9jb25maWdfdCAqc3JjKTsKKworaW50IHNuZF9jb25maWdfbWFrZShzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwKKwkJICAgIHNuZF9jb25maWdfdHlwZV90IHR5cGUpOworaW50IHNuZF9jb25maWdfbWFrZV9pbnRlZ2VyKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5KTsKK2ludCBzbmRfY29uZmlnX21ha2VfaW50ZWdlcjY0KHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5KTsKK2ludCBzbmRfY29uZmlnX21ha2VfcmVhbChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgc25kX2NvbmZpZ19tYWtlX3N0cmluZyhzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgc25kX2NvbmZpZ19tYWtlX3BvaW50ZXIoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXkpOworaW50IHNuZF9jb25maWdfbWFrZV9jb21wb3VuZChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwgaW50IGpvaW4pOworCitpbnQgc25kX2NvbmZpZ19pbWFrZV9pbnRlZ2VyKHNuZF9jb25maWdfdCAqKmNvbmZpZywgY29uc3QgY2hhciAqa2V5LCBjb25zdCBsb25nIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2ltYWtlX2ludGVnZXI2NChzbmRfY29uZmlnX3QgKipjb25maWcsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgbG9uZyBsb25nIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2ltYWtlX3JlYWwoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGRvdWJsZSB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19pbWFrZV9zdHJpbmcoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX2ltYWtlX3BvaW50ZXIoc25kX2NvbmZpZ190ICoqY29uZmlnLCBjb25zdCBjaGFyICprZXksIGNvbnN0IHZvaWQgKnB0cik7CisKK3NuZF9jb25maWdfdHlwZV90IHNuZF9jb25maWdfZ2V0X3R5cGUoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcpOworCitpbnQgc25kX2NvbmZpZ19zZXRfaWQoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKmlkKTsKK2ludCBzbmRfY29uZmlnX3NldF9pbnRlZ2VyKHNuZF9jb25maWdfdCAqY29uZmlnLCBsb25nIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3NldF9pbnRlZ2VyNjQoc25kX2NvbmZpZ190ICpjb25maWcsIGxvbmcgbG9uZyB2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19zZXRfcmVhbChzbmRfY29uZmlnX3QgKmNvbmZpZywgZG91YmxlIHZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3NldF9zdHJpbmcoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX3NldF9hc2NpaShzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3QgY2hhciAqYXNjaWkpOworaW50IHNuZF9jb25maWdfc2V0X3BvaW50ZXIoc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IHZvaWQgKnB0cik7CitpbnQgc25kX2NvbmZpZ19nZXRfaWQoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGNvbnN0IGNoYXIgKip2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfaW50ZWdlcihjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgbG9uZyAqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X2ludGVnZXI2NChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgbG9uZyBsb25nICp2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfcmVhbChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgZG91YmxlICp2YWx1ZSk7CitpbnQgc25kX2NvbmZpZ19nZXRfaXJlYWwoY29uc3Qgc25kX2NvbmZpZ190ICpjb25maWcsIGRvdWJsZSAqdmFsdWUpOworaW50IHNuZF9jb25maWdfZ2V0X3N0cmluZyhjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3QgY2hhciAqKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2dldF9hc2NpaShjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY2hhciAqKnZhbHVlKTsKK2ludCBzbmRfY29uZmlnX2dldF9wb2ludGVyKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZmlnLCBjb25zdCB2b2lkICoqdmFsdWUpOworaW50IHNuZF9jb25maWdfdGVzdF9pZChjb25zdCBzbmRfY29uZmlnX3QgKmNvbmZpZywgY29uc3QgY2hhciAqaWQpOworCitzbmRfY29uZmlnX2l0ZXJhdG9yX3Qgc25kX2NvbmZpZ19pdGVyYXRvcl9maXJzdChjb25zdCBzbmRfY29uZmlnX3QgKm5vZGUpOworc25kX2NvbmZpZ19pdGVyYXRvcl90IHNuZF9jb25maWdfaXRlcmF0b3JfbmV4dChjb25zdCBzbmRfY29uZmlnX2l0ZXJhdG9yX3QgaXRlcmF0b3IpOworc25kX2NvbmZpZ19pdGVyYXRvcl90IHNuZF9jb25maWdfaXRlcmF0b3JfZW5kKGNvbnN0IHNuZF9jb25maWdfdCAqbm9kZSk7CitzbmRfY29uZmlnX3QgKnNuZF9jb25maWdfaXRlcmF0b3JfZW50cnkoY29uc3Qgc25kX2NvbmZpZ19pdGVyYXRvcl90IGl0ZXJhdG9yKTsKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIG1hY3JvIHRvIGl0ZXJhdGUgb3ZlciB0aGUgY2hpbGRyZW4gb2YgYSBjb21wb3VuZCBub2RlLgorICogXHBhcmFtIHBvcyBJdGVyYXRvciB2YXJpYWJsZSBmb3IgdGhlIGN1cnJlbnQgbm9kZS4KKyAqIFxwYXJhbSBuZXh0IEl0ZXJhdG9yIHZhcmlhYmxlIGZvciB0aGUgbmV4dCBub2RlLgorICogXHBhcmFtIG5vZGUgSGFuZGxlIHRvIHRoZSBjb21wb3VuZCBjb25maWd1cmF0aW9uIG5vZGUgdG8gaXRlcmF0ZSBvdmVyLgorICoKKyAqIFRoaXMgbWFjcm8gaXMgZGVzaWduZWQgdG8gcGVybWl0IHRoZSByZW1vdmFsIG9mIHRoZSBjdXJyZW50IG5vZGUuCisgKi8KKyNkZWZpbmUgc25kX2NvbmZpZ19mb3JfZWFjaChwb3MsIG5leHQsIG5vZGUpIFwKKwlmb3IgKHBvcyA9IHNuZF9jb25maWdfaXRlcmF0b3JfZmlyc3Qobm9kZSksIG5leHQgPSBzbmRfY29uZmlnX2l0ZXJhdG9yX25leHQocG9zKTsgcG9zICE9IHNuZF9jb25maWdfaXRlcmF0b3JfZW5kKG5vZGUpOyBwb3MgPSBuZXh0LCBuZXh0ID0gc25kX2NvbmZpZ19pdGVyYXRvcl9uZXh0KHBvcykpCisKKy8qIE1pc2MgZnVuY3Rpb25zICovCisKK2ludCBzbmRfY29uZmlnX2dldF9ib29sX2FzY2lpKGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX2dldF9ib29sKGNvbnN0IHNuZF9jb25maWdfdCAqY29uZik7CitpbnQgc25kX2NvbmZpZ19nZXRfY3RsX2lmYWNlX2FzY2lpKGNvbnN0IGNoYXIgKmFzY2lpKTsKK2ludCBzbmRfY29uZmlnX2dldF9jdGxfaWZhY2UoY29uc3Qgc25kX2NvbmZpZ190ICpjb25mKTsKKworLyogTmFtZXMgZnVuY3Rpb25zICovCisKKy8qKgorICogRGV2aWNlLW5hbWUgbGlzdCBlbGVtZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9kZXZuYW1lIHNuZF9kZXZuYW1lX3Q7CisKKy8qKgorICogRGV2aWNlLW5hbWUgbGlzdCBlbGVtZW50IChkZWZpbml0aW9uKQorICovCitzdHJ1Y3Qgc25kX2Rldm5hbWUgeworCWNoYXIgKm5hbWU7CS8qKjwgRGV2aWNlIG5hbWUgc3RyaW5nICovCisJY2hhciAqY29tbWVudDsJLyoqPCBDb21tZW50cyAqLworCXNuZF9kZXZuYW1lX3QgKm5leHQ7CS8qKjwgTmV4dCBwb2ludGVyICovCit9OworCitpbnQgc25kX25hbWVzX2xpc3QoY29uc3QgY2hhciAqaWZhY2UsIHNuZF9kZXZuYW1lX3QgKipsaXN0KTsKK3ZvaWQgc25kX25hbWVzX2xpc3RfZnJlZShzbmRfZGV2bmFtZV90ICpsaXN0KTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfQ09ORl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29udHJvbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2ZhZWEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2wuaApAQCAtMCwwICsxLDU1NSBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2NvbnRyb2wuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfQ09OVFJPTF9ICisjZGVmaW5lIF9fQUxTQV9DT05UUk9MX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgQ29udHJvbCBDb250cm9sIEludGVyZmFjZQorICogIFRoZSBjb250cm9sIGludGVyZmFjZS4KKyAqICBTZWUgXHJlZiBjb250cm9sIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBceworICovCisKKy8qKiBkbHN5bSB2ZXJzaW9uIGZvciBpbnRlcmZhY2UgZW50cnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgU05EX0NPTlRST0xfRExTWU1fVkVSU0lPTglfZGxzeW1fY29udHJvbF8wMDEKKworLyoqIElFQzk1OCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9hZXNfaWVjOTU4IHsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1c1syNF07CS8qKjwgQUVTL0lFQzk1OCBjaGFubmVsIHN0YXR1cyBiaXRzICovCisJdW5zaWduZWQgY2hhciBzdWJjb2RlWzE0N107CS8qKjwgQUVTL0lFQzk1OCBzdWJjb2RlIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZDsJCS8qKjwgbm90aGluZyAqLworCXVuc2lnbmVkIGNoYXIgZGlnX3N1YmZyYW1lWzRdOwkvKio8IEFFUy9JRUM5NTggc3ViZnJhbWUgYml0cyAqLworfSBzbmRfYWVzX2llYzk1OF90OworCisvKiogQ1RMIGNhcmQgaW5mbyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2NhcmRfaW5mbyBzbmRfY3RsX2NhcmRfaW5mb190OworCisvKiogQ1RMIGVsZW1lbnQgaWRlbnRpZmllciBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2VsZW1faWQgc25kX2N0bF9lbGVtX2lkX3Q7CisKKy8qKiBDVEwgZWxlbWVudCBpZGVudGlmaWVyIGxpc3QgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9lbGVtX2xpc3Qgc25kX2N0bF9lbGVtX2xpc3RfdDsKKworLyoqIENUTCBlbGVtZW50IGluZm8gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2N0bF9lbGVtX2luZm8gc25kX2N0bF9lbGVtX2luZm9fdDsKKworLyoqIENUTCBlbGVtZW50IHZhbHVlIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jdGxfZWxlbV92YWx1ZSBzbmRfY3RsX2VsZW1fdmFsdWVfdDsKKworLyoqIENUTCBldmVudCBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfY3RsX2V2ZW50IHNuZF9jdGxfZXZlbnRfdDsKKworLyoqIENUTCBlbGVtZW50IHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX2N0bF9lbGVtX3R5cGUgeworCS8qKiBJbnZhbGlkIHR5cGUgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9OT05FID0gMCwKKwkvKiogQm9vbGVhbiBjb250ZW50cyAqLworCVNORF9DVExfRUxFTV9UWVBFX0JPT0xFQU4sCisJLyoqIEludGVnZXIgY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSLAorCS8qKiBFbnVtZXJhdGVkIGNvbnRlbnRzICovCisJU05EX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCwKKwkvKiogQnl0ZXMgY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9CWVRFUywKKwkvKiogSUVDOTU4IChTL1BESUYpIHNldHRpbmcgY29udGVudCAqLworCVNORF9DVExfRUxFTV9UWVBFX0lFQzk1OCwKKwkvKiogNjQtYml0IGludGVnZXIgY29udGVudHMgKi8KKwlTTkRfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQsCisJU05EX0NUTF9FTEVNX1RZUEVfTEFTVCA9IFNORF9DVExfRUxFTV9UWVBFX0lOVEVHRVI2NAorfSBzbmRfY3RsX2VsZW1fdHlwZV90OworCisvKiogQ1RMIHJlbGF0ZWQgaW50ZXJmYWNlICovCit0eXBlZGVmIGVudW0gX3NuZF9jdGxfZWxlbV9pZmFjZSB7CisJLyoqIENhcmQgbGV2ZWwgKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCA9IDAsCisJLyoqIEhhcmR3YXJlIGRlcGVuZGVudCBkZXZpY2UgKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsCisJLyoqIE1peGVyICovCisJU05EX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS8qKiBQQ00gKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfUENNLAorCS8qKiBSYXdNaWRpICovCisJU05EX0NUTF9FTEVNX0lGQUNFX1JBV01JREksCisJLyoqIFRpbWVyICovCisJU05EX0NUTF9FTEVNX0lGQUNFX1RJTUVSLAorCS8qKiBTZXF1ZW5jZXIgKi8KKwlTTkRfQ1RMX0VMRU1fSUZBQ0VfU0VRVUVOQ0VSLAorCVNORF9DVExfRUxFTV9JRkFDRV9MQVNUID0gU05EX0NUTF9FTEVNX0lGQUNFX1NFUVVFTkNFUgorfSBzbmRfY3RsX2VsZW1faWZhY2VfdDsKKworLyoqIEV2ZW50IGNsYXNzICovCit0eXBlZGVmIGVudW0gX3NuZF9jdGxfZXZlbnRfdHlwZSB7CisJLyoqIEVsZW1lbnRzIHJlbGF0ZWQgZXZlbnQgKi8KKwlTTkRfQ1RMX0VWRU5UX0VMRU0gPSAwLAorCVNORF9DVExfRVZFTlRfTEFTVCA9IFNORF9DVExfRVZFTlRfRUxFTQorfXNuZF9jdGxfZXZlbnRfdHlwZV90OworCisvKiogRWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIChXYXJuaW5nOiB0ZXN0IHRoaXMgZmlyc3QgYW5kIGlmIHNldCBkb24ndAorICAqIHRlc3QgdGhlIG90aGVyIG1hc2tzKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfRVZFTlRfTUFTS19SRU1PVkUgCSh+MFUpCisvKiogRWxlbWVudCB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9FVkVOVF9NQVNLX1ZBTFVFCSgxPDwwKQorLyoqIEVsZW1lbnQgaW5mbyBoYXMgYmVlbiBjaGFuZ2VkIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9FVkVOVF9NQVNLX0lORk8JCSgxPDwxKQorLyoqIEVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX0VWRU5UX01BU0tfQURECQkoMTw8MikKKy8qKiBFbGVtZW50J3MgVExWIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX0VWRU5UX01BU0tfVExWCQkoMTw8MykKKworLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfTk9ORQkJCQkiIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfUExBWUJBQ0sJCQkJIlBsYXliYWNrICIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0NBUFRVUkUJCQkJIkNhcHR1cmUgIgorCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfTk9ORQkJCSIiCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfU1dJVENICQkJIlN3aXRjaCIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0lFQzk1OF9WT0xVTUUJCQkiVm9sdW1lIgorLyoqIENUTCBuYW1lIGhlbHBlciAqLworI2RlZmluZSBTTkRfQ1RMX05BTUVfSUVDOTU4X0RFRkFVTFQJCQkiRGVmYXVsdCIKKy8qKiBDVEwgbmFtZSBoZWxwZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9OQU1FX0lFQzk1OF9NQVNLCQkJIk1hc2siCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfQ09OX01BU0sJCQkiQ29uIE1hc2siCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfUFJPX01BU0sJCQkiUHJvIE1hc2siCisvKiogQ1RMIG5hbWUgaGVscGVyICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NThfUENNX1NUUkVBTQkJCSJQQ00gU3RyZWFtIgorLyoqIEVsZW1lbnQgbmFtZSBmb3IgSUVDOTU4IChTL1BESUYpICovCisjZGVmaW5lIFNORF9DVExfTkFNRV9JRUM5NTgoZXhwbCxkaXJlY3Rpb24sd2hhdCkJIklFQzk1OCAiIGV4cGwgU05EX0NUTF9OQU1FXyMjZGlyZWN0aW9uIFNORF9DVExfTkFNRV9JRUM5NThfIyN3aGF0CisKKy8qKiBNYXNrIGZvciB0aGUgbWFqb3IgUG93ZXIgU3RhdGUgaWRlbnRpZmllciAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX01BU0sJCTB4ZmYwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQwICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDAgICAgICAgICAgCTB4MDAwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQxICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDEgICAgIAkgICAgIAkweDAxMDAKKy8qKiBBQ1BJL1BDSSBQb3dlciBTdGF0ZSBEMiAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QyIAkgICAgICAgIDB4MDIwMAorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQzICovCisjZGVmaW5lIFNORF9DVExfUE9XRVJfRDMgICAgICAgICAJMHgwMzAwCisvKiogQUNQSS9QQ0kgUG93ZXIgU3RhdGUgRDNob3QgKi8KKyNkZWZpbmUgU05EX0NUTF9QT1dFUl9EM2hvdAkJKFNORF9DVExfUE9XRVJfRDN8MHgwMDAwKQorLyoqIEFDUEkvUENJIFBvd2VyIFN0YXRlIEQzY29sZCAqLworI2RlZmluZSBTTkRfQ1RMX1BPV0VSX0QzY29sZAkgICAgICAJKFNORF9DVExfUE9XRVJfRDN8MHgwMDAxKQorCisvKiogVExWIHR5cGUgLSBDb250YWluZXIgKi8KKyNkZWZpbmUgU05EX0NUTF9UTFZUX0NPTlRBSU5FUgkJMHgwMDAwCisvKiogVExWIHR5cGUgLSBiYXNpYyBkQiBzY2FsZSAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfU0NBTEUJCTB4MDAwMQorLyoqIFRMViB0eXBlIC0gbGluZWFyIHZvbHVtZSAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfTElORUFSCQkweDAwMDIKKy8qKiBUTFYgdHlwZSAtIGRCIHJhbmdlIGNvbnRhaW5lciAqLworI2RlZmluZSBTTkRfQ1RMX1RMVlRfREJfUkFOR0UJCTB4MDAwMworCisvKiogTXV0ZSBzdGF0ZSAqLworI2RlZmluZSBTTkRfQ1RMX1RMVl9EQl9HQUlOX01VVEUJLTk5OTk5OTkKKworLyoqIENUTCB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9jdGxfdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBDVEwgKi8KKwlTTkRfQ1RMX1RZUEVfSFcsCisJLyoqIFNoYXJlZCBtZW1vcnkgY2xpZW50IENUTCAqLworCVNORF9DVExfVFlQRV9TSE0sCisJLyoqIElORVQgY2xpZW50IENUTCAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfQ1RMX1RZUEVfSU5FVCwKKwkvKiogRXh0ZXJuYWwgY29udHJvbCBwbHVnaW4gKi8KKwlTTkRfQ1RMX1RZUEVfRVhUCit9IHNuZF9jdGxfdHlwZV90OworCisvKiogTm9uIGJsb2NraW5nIG1vZGUgKGZsYWcgZm9yIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfQ1RMX05PTkJMT0NLCQkweDAwMDEKKworLyoqIEFzeW5jIG5vdGlmaWNhdGlvbiAoZmxhZyBmb3Igb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfQVNZTkMJCQkweDAwMDIKKworLyoqIFJlYWQgb25seSAoZmxhZyBmb3Igb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9DVExfUkVBRE9OTFkJCTB4MDAwNAorCisvKiogQ1RMIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9jdGwgc25kX2N0bF90OworCisvKiogRG9uJ3QgZGVzdHJveSB0aGUgY3RsIGhhbmRsZSB3aGVuIGNsb3NlICovCisjZGVmaW5lIFNORF9TQ1RMX05PRlJFRQkJCTB4MDAwMQorCisvKiogU0NUTCB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NjdGwgc25kX3NjdGxfdDsKKworaW50IHNuZF9jYXJkX2xvYWQoaW50IGNhcmQpOworaW50IHNuZF9jYXJkX25leHQoaW50ICpjYXJkKTsKK2ludCBzbmRfY2FyZF9nZXRfaW5kZXgoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgc25kX2NhcmRfZ2V0X25hbWUoaW50IGNhcmQsIGNoYXIgKipuYW1lKTsKK2ludCBzbmRfY2FyZF9nZXRfbG9uZ25hbWUoaW50IGNhcmQsIGNoYXIgKipuYW1lKTsKKworaW50IHNuZF9kZXZpY2VfbmFtZV9oaW50KGludCBjYXJkLCBjb25zdCBjaGFyICppZmFjZSwgdm9pZCAqKipoaW50cyk7CitpbnQgc25kX2RldmljZV9uYW1lX2ZyZWVfaGludCh2b2lkICoqaGludHMpOworY2hhciAqc25kX2RldmljZV9uYW1lX2dldF9oaW50KGNvbnN0IHZvaWQgKmhpbnQsIGNvbnN0IGNoYXIgKmlkKTsKKworaW50IHNuZF9jdGxfb3BlbihzbmRfY3RsX3QgKipjdGwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlKTsKK2ludCBzbmRfY3RsX29wZW5fbGNvbmYoc25kX2N0bF90ICoqY3RsLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX2N0bF9jbG9zZShzbmRfY3RsX3QgKmN0bCk7CitpbnQgc25kX2N0bF9ub25ibG9jayhzbmRfY3RsX3QgKmN0bCwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfYXN5bmNfYWRkX2N0bF9oYW5kbGVyKHNuZF9hc3luY19oYW5kbGVyX3QgKipoYW5kbGVyLCBzbmRfY3RsX3QgKmN0bCwgCisJCQkgICAgICBzbmRfYXN5bmNfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3NuZF9jdGxfdCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X2N0bChzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfY3RsX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX2N0bF90ICpjdGwpOworaW50IHNuZF9jdGxfcG9sbF9kZXNjcmlwdG9ycyhzbmRfY3RsX3QgKmN0bCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKK2ludCBzbmRfY3RsX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyhzbmRfY3RsX3QgKmN0bCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICpyZXZlbnRzKTsKK2ludCBzbmRfY3RsX3N1YnNjcmliZV9ldmVudHMoc25kX2N0bF90ICpjdGwsIGludCBzdWJzY3JpYmUpOworaW50IHNuZF9jdGxfY2FyZF9pbmZvKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfY3RsX2VsZW1fbGlzdChzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2xpc3RfdCAqbGlzdCk7CitpbnQgc25kX2N0bF9lbGVtX2luZm8oc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZWxlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9jdGxfZWxlbV9yZWFkKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqdmFsdWUpOworaW50IHNuZF9jdGxfZWxlbV93cml0ZShzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKnZhbHVlKTsKK2ludCBzbmRfY3RsX2VsZW1fbG9jayhzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKK2ludCBzbmRfY3RsX2VsZW1fdW5sb2NrKHNuZF9jdGxfdCAqY3RsLCBzbmRfY3RsX2VsZW1faWRfdCAqaWQpOworaW50IHNuZF9jdGxfZWxlbV90bHZfcmVhZChzbmRfY3RsX3QgKmN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkLAorCQkJICB1bnNpZ25lZCBpbnQgKnRsdiwgdW5zaWduZWQgaW50IHRsdl9zaXplKTsKK2ludCBzbmRfY3RsX2VsZW1fdGx2X3dyaXRlKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKnRsdik7CitpbnQgc25kX2N0bF9lbGVtX3Rsdl9jb21tYW5kKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqdGx2KTsKK2ludCBzbmRfY3RsX2h3ZGVwX25leHRfZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgKiBkZXZpY2UpOworaW50IHNuZF9jdGxfaHdkZXBfaW5mbyhzbmRfY3RsX3QgKmN0bCwgc25kX2h3ZGVwX2luZm9fdCAqIGluZm8pOworaW50IHNuZF9jdGxfcGNtX25leHRfZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgKmRldmljZSk7CitpbnQgc25kX2N0bF9wY21faW5mbyhzbmRfY3RsX3QgKmN0bCwgc25kX3BjbV9pbmZvX3QgKiBpbmZvKTsKK2ludCBzbmRfY3RsX3BjbV9wcmVmZXJfc3ViZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgc3ViZGV2KTsKK2ludCBzbmRfY3RsX3Jhd21pZGlfbmV4dF9kZXZpY2Uoc25kX2N0bF90ICpjdGwsIGludCAqIGRldmljZSk7CitpbnQgc25kX2N0bF9yYXdtaWRpX2luZm8oc25kX2N0bF90ICpjdGwsIHNuZF9yYXdtaWRpX2luZm9fdCAqIGluZm8pOworaW50IHNuZF9jdGxfcmF3bWlkaV9wcmVmZXJfc3ViZGV2aWNlKHNuZF9jdGxfdCAqY3RsLCBpbnQgc3ViZGV2KTsKK2ludCBzbmRfY3RsX3NldF9wb3dlcl9zdGF0ZShzbmRfY3RsX3QgKmN0bCwgdW5zaWduZWQgaW50IHN0YXRlKTsKK2ludCBzbmRfY3RsX2dldF9wb3dlcl9zdGF0ZShzbmRfY3RsX3QgKmN0bCwgdW5zaWduZWQgaW50ICpzdGF0ZSk7CisKK2ludCBzbmRfY3RsX3JlYWQoc25kX2N0bF90ICpjdGwsIHNuZF9jdGxfZXZlbnRfdCAqZXZlbnQpOworaW50IHNuZF9jdGxfd2FpdChzbmRfY3RsX3QgKmN0bCwgaW50IHRpbWVvdXQpOworY29uc3QgY2hhciAqc25kX2N0bF9uYW1lKHNuZF9jdGxfdCAqY3RsKTsKK3NuZF9jdGxfdHlwZV90IHNuZF9jdGxfdHlwZShzbmRfY3RsX3QgKmN0bCk7CisKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV90eXBlX25hbWUoc25kX2N0bF9lbGVtX3R5cGVfdCB0eXBlKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV9pZmFjZV9uYW1lKHNuZF9jdGxfZWxlbV9pZmFjZV90IGlmYWNlKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZXZlbnRfdHlwZV9uYW1lKHNuZF9jdGxfZXZlbnRfdHlwZV90IHR5cGUpOworCit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9tYXNrKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X251bWlkKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9pZChjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaiwgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7CitzbmRfY3RsX2VsZW1faWZhY2VfdCBzbmRfY3RsX2V2ZW50X2VsZW1fZ2V0X2ludGVyZmFjZShjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9ldmVudF90ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZXZlbnRfZWxlbV9nZXRfbmFtZShjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9ldmVudF9lbGVtX2dldF9pbmRleChjb25zdCBzbmRfY3RsX2V2ZW50X3QgKm9iaik7CisKK2ludCBzbmRfY3RsX2VsZW1fbGlzdF9hbGxvY19zcGFjZShzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBlbnRyaWVzKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3RfZnJlZV9zcGFjZShzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOworCitzaXplX3Qgc25kX2N0bF9lbGVtX2lkX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9lbGVtX2lkX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfY3RsX2VsZW1faWRfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfY3RsX2VsZW1faWRfdCAqKSBhbGxvY2Eoc25kX2N0bF9lbGVtX2lkX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIHNuZF9jdGxfZWxlbV9pZF9zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX2N0bF9lbGVtX2lkX21hbGxvYyhzbmRfY3RsX2VsZW1faWRfdCAqKnB0cik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9mcmVlKHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faWRfY2xlYXIoc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9jb3B5KHNuZF9jdGxfZWxlbV9pZF90ICpkc3QsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpzcmMpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pZF9nZXRfbnVtaWQoY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKm9iaik7CitzbmRfY3RsX2VsZW1faWZhY2VfdCBzbmRfY3RsX2VsZW1faWRfZ2V0X2ludGVyZmFjZShjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faWRfZ2V0X2RldmljZShjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faWRfZ2V0X3N1YmRldmljZShjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfZWxlbV9pZF9nZXRfbmFtZShjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faWRfZ2V0X2luZGV4KGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faWRfc2V0X251bWlkKHNuZF9jdGxfZWxlbV9pZF90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faWRfc2V0X2ludGVyZmFjZShzbmRfY3RsX2VsZW1faWRfdCAqb2JqLCBzbmRfY3RsX2VsZW1faWZhY2VfdCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faWRfc2V0X2RldmljZShzbmRfY3RsX2VsZW1faWRfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2lkX3NldF9zdWJkZXZpY2Uoc25kX2N0bF9lbGVtX2lkX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pZF9zZXRfbmFtZShzbmRfY3RsX2VsZW1faWRfdCAqb2JqLCBjb25zdCBjaGFyICp2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faWRfc2V0X2luZGV4KHNuZF9jdGxfZWxlbV9pZF90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOworCitzaXplX3Qgc25kX2N0bF9jYXJkX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfY3RsX2NhcmRfaW5mb190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9jYXJkX2luZm9fYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfY3RsX2NhcmRfaW5mb190ICopIGFsbG9jYShzbmRfY3RsX2NhcmRfaW5mb19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfY3RsX2NhcmRfaW5mb19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX2N0bF9jYXJkX2luZm9fbWFsbG9jKHNuZF9jdGxfY2FyZF9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2NhcmRfaW5mb19mcmVlKHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfY2FyZF9pbmZvX2NsZWFyKHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfY2FyZF9pbmZvX2NvcHkoc25kX2N0bF9jYXJkX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfY3RsX2NhcmRfaW5mb190ICpzcmMpOworaW50IHNuZF9jdGxfY2FyZF9pbmZvX2dldF9jYXJkKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2NhcmRfaW5mb19nZXRfaWQoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfY2FyZF9pbmZvX2dldF9kcml2ZXIoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfY2FyZF9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2NhcmRfaW5mb19nZXRfbG9uZ25hbWUoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfY2FyZF9pbmZvX2dldF9taXhlcm5hbWUoY29uc3Qgc25kX2N0bF9jYXJkX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9jdGxfY2FyZF9pbmZvX2dldF9jb21wb25lbnRzKGNvbnN0IHNuZF9jdGxfY2FyZF9pbmZvX3QgKm9iaik7CisKK3NpemVfdCBzbmRfY3RsX2V2ZW50X3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9ldmVudF90IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9ldmVudF9hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9jdGxfZXZlbnRfdCAqKSBhbGxvY2Eoc25kX2N0bF9ldmVudF9zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfY3RsX2V2ZW50X3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfY3RsX2V2ZW50X21hbGxvYyhzbmRfY3RsX2V2ZW50X3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2V2ZW50X2ZyZWUoc25kX2N0bF9ldmVudF90ICpvYmopOwordm9pZCBzbmRfY3RsX2V2ZW50X2NsZWFyKHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9ldmVudF9jb3B5KHNuZF9jdGxfZXZlbnRfdCAqZHN0LCBjb25zdCBzbmRfY3RsX2V2ZW50X3QgKnNyYyk7CitzbmRfY3RsX2V2ZW50X3R5cGVfdCBzbmRfY3RsX2V2ZW50X2dldF90eXBlKGNvbnN0IHNuZF9jdGxfZXZlbnRfdCAqb2JqKTsKKworc2l6ZV90IHNuZF9jdGxfZWxlbV9saXN0X3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX2N0bF9lbGVtX2xpc3RfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9jdGxfZWxlbV9saXN0X2FsbG9jYShwdHIpIGRvIHsgYXNzZXJ0KHB0cik7ICpwdHIgPSAoc25kX2N0bF9lbGVtX2xpc3RfdCAqKSBhbGxvY2Eoc25kX2N0bF9lbGVtX2xpc3Rfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX2N0bF9lbGVtX2xpc3Rfc2l6ZW9mKCkpOyB9IHdoaWxlICgwKQoraW50IHNuZF9jdGxfZWxlbV9saXN0X21hbGxvYyhzbmRfY3RsX2VsZW1fbGlzdF90ICoqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3RfZnJlZShzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fbGlzdF9jbGVhcihzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fbGlzdF9jb3B5KHNuZF9jdGxfZWxlbV9saXN0X3QgKmRzdCwgY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqc3JjKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2xpc3Rfc2V0X29mZnNldChzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF91c2VkKGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2xpc3RfZ2V0X2NvdW50KGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9saXN0X2dldF9pZChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIHNuZF9jdGxfZWxlbV9pZF90ICpwdHIpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9udW1pZChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2N0bF9lbGVtX2xpc3RfZ2V0X2ludGVyZmFjZShjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX2xpc3RfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fbGlzdF9nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9saXN0X3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Citjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1fbGlzdF9nZXRfbmFtZShjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9saXN0X2dldF9pbmRleChjb25zdCBzbmRfY3RsX2VsZW1fbGlzdF90ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOworCitzaXplX3Qgc25kX2N0bF9lbGVtX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfY3RsX2VsZW1faW5mb190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9lbGVtX2luZm9fYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfY3RsX2VsZW1faW5mb190ICopIGFsbG9jYShzbmRfY3RsX2VsZW1faW5mb19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfY3RsX2VsZW1faW5mb19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX2N0bF9lbGVtX2luZm9fbWFsbG9jKHNuZF9jdGxfZWxlbV9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19mcmVlKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX2NsZWFyKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX2NvcHkoc25kX2N0bF9lbGVtX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpzcmMpOworc25kX2N0bF9lbGVtX3R5cGVfdCBzbmRfY3RsX2VsZW1faW5mb19nZXRfdHlwZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX3JlYWRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfd3JpdGFibGUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19pc192b2xhdGlsZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2lzX2luYWN0aXZlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfbG9ja2VkKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X3JlYWRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X3dyaXRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfdGx2X2NvbW1hbmRhYmxlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9faXNfb3duZXIoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfY3RsX2VsZW1faW5mb19pc191c2VyKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitwaWRfdCBzbmRfY3RsX2VsZW1faW5mb19nZXRfb3duZXIoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfY291bnQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK2xvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbihjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworbG9uZyBzbmRfY3RsX2VsZW1faW5mb19nZXRfbWF4KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIHNuZF9jdGxfZWxlbV9pbmZvX2dldF9zdGVwKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21pbjY0KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X21heDY0KGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Citsb25nIGxvbmcgc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N0ZXA2NChjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pdGVtcyhjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfaXRlbShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX2luZm9fZ2V0X2l0ZW1fbmFtZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworaW50IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9kaW1lbnNpb25zKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7CitpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X2RpbWVuc2lvbihjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCBpZHgpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaWQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqLCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfbnVtaWQoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3NuZF9jdGxfZWxlbV9pZmFjZV90IHNuZF9jdGxfZWxlbV9pbmZvX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfZGV2aWNlKGNvbnN0IHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX2luZm9fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfY3RsX2VsZW1faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2N0bF9lbGVtX2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1faW5mb19nZXRfaW5kZXgoY29uc3Qgc25kX2N0bF9lbGVtX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2lkKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKnB0cik7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9udW1pZChzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfaW50ZXJmYWNlKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lmYWNlX3QgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2RldmljZShzbmRfY3RsX2VsZW1faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1faW5mb19zZXRfc3ViZGV2aWNlKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV9pbmZvX3NldF9uYW1lKHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX2luZm9fc2V0X2luZGV4KHNuZF9jdGxfZWxlbV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7CisKK2ludCBzbmRfY3RsX2VsZW1fYWRkX2ludGVnZXIoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwgdW5zaWduZWQgaW50IGNvdW50LCBsb25nIGltaW4sIGxvbmcgaW1heCwgbG9uZyBpc3RlcCk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9pbnRlZ2VyNjQoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCwgdW5zaWduZWQgaW50IGNvdW50LCBsb25nIGxvbmcgaW1pbiwgbG9uZyBsb25nIGltYXgsIGxvbmcgbG9uZyBpc3RlcCk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9ib29sZWFuKHNuZF9jdGxfdCAqY3RsLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqaWQsIHVuc2lnbmVkIGludCBjb3VudCk7CitpbnQgc25kX2N0bF9lbGVtX2FkZF9pZWM5NTgoc25kX2N0bF90ICpjdGwsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCk7CitpbnQgc25kX2N0bF9lbGVtX3JlbW92ZShzbmRfY3RsX3QgKmN0bCwgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKKworc2l6ZV90IHNuZF9jdGxfZWxlbV92YWx1ZV9zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9jdGxfZWxlbV92YWx1ZV90IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX2N0bF9lbGVtX3ZhbHVlX2FsbG9jYShwdHIpIGRvIHsgYXNzZXJ0KHB0cik7ICpwdHIgPSAoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKikgYWxsb2NhKHNuZF9jdGxfZWxlbV92YWx1ZV9zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfY3RsX2VsZW1fdmFsdWVfc2l6ZW9mKCkpOyB9IHdoaWxlICgwKQoraW50IHNuZF9jdGxfZWxlbV92YWx1ZV9tYWxsb2Moc25kX2N0bF9lbGVtX3ZhbHVlX3QgKipwdHIpOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfZnJlZShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2NsZWFyKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfY29weShzbmRfY3RsX2VsZW1fdmFsdWVfdCAqZHN0LCBjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqc3JjKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pZChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X251bWlkKGNvbnN0IHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmopOworc25kX2N0bF9lbGVtX2lmYWNlX3Qgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbnRlcmZhY2UoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9kZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9zdWJkZXZpY2UoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X25hbWUoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pbmRleChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCBjb25zdCBzbmRfY3RsX2VsZW1faWRfdCAqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9udW1pZChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlcmZhY2Uoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgc25kX2N0bF9lbGVtX2lmYWNlX3QgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9kZXZpY2Uoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfc3ViZGV2aWNlKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfY3RsX2VsZW1fdmFsdWVfc2V0X25hbWUoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbmRleChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2Jvb2xlYW4oY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Citsb25nIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfaW50ZWdlcihjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK2xvbmcgbG9uZyBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2ludGVnZXI2NChjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3Vuc2lnbmVkIGludCBzbmRfY3RsX2VsZW1fdmFsdWVfZ2V0X2VudW1lcmF0ZWQoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCk7Cit1bnNpZ25lZCBjaGFyIHNuZF9jdGxfZWxlbV92YWx1ZV9nZXRfYnl0ZShjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9ib29sZWFuKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIGxvbmcgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlZ2VyKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIGxvbmcgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pbnRlZ2VyNjQoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgdW5zaWduZWQgaW50IGlkeCwgbG9uZyBsb25nIHZhbCk7Cit2b2lkIHNuZF9jdGxfZWxlbV92YWx1ZV9zZXRfZW51bWVyYXRlZChzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9ieXRlKHNuZF9jdGxfZWxlbV92YWx1ZV90ICpvYmosIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3NldF9ieXRlcyhzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citjb25zdCB2b2lkICogc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9ieXRlcyhjb25zdCBzbmRfY3RsX2VsZW1fdmFsdWVfdCAqb2JqKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX2dldF9pZWM5NTgoY29uc3Qgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgc25kX2Flc19pZWM5NThfdCAqcHRyKTsKK3ZvaWQgc25kX2N0bF9lbGVtX3ZhbHVlX3NldF9pZWM5NTgoc25kX2N0bF9lbGVtX3ZhbHVlX3QgKm9iaiwgY29uc3Qgc25kX2Flc19pZWM5NThfdCAqcHRyKTsKKworLyoqCisgKiAgXGRlZmdyb3VwIEhDb250cm9sIEhpZ2ggbGV2ZWwgQ29udHJvbCBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBDb250cm9sCisgKiAgVGhlIGhpZ2ggbGV2ZWwgY29udHJvbCBpbnRlcmZhY2UuCisgKiAgU2VlIFxyZWYgaGNvbnRyb2wgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqIEhDVEwgZWxlbWVudCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaGN0bF9lbGVtIHNuZF9oY3RsX2VsZW1fdDsKKworLyoqIEhDVEwgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX2hjdGwgc25kX2hjdGxfdDsKKworLyoqCisgKiBcYnJpZWYgQ29tcGFyZSBmdW5jdGlvbiBmb3Igc29ydGluZyBIQ1RMIGVsZW1lbnRzCisgKiBccGFyYW0gZTEgRmlyc3QgZWxlbWVudAorICogXHBhcmFtIGUyIFNlY29uZCBlbGVtZW50CisgKiBccmV0dXJuIC0xIGlmIGUxIDwgZTIsIDAgaWYgZTEgPT0gZTIsIDEgaWYgZTEgPiBlMgorICovCit0eXBlZGVmIGludCAoKnNuZF9oY3RsX2NvbXBhcmVfdCkoY29uc3Qgc25kX2hjdGxfZWxlbV90ICplMSwKKwkJCQkgIGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqZTIpOworaW50IHNuZF9oY3RsX2NvbXBhcmVfZmFzdChjb25zdCBzbmRfaGN0bF9lbGVtX3QgKmMxLAorCQkJICBjb25zdCBzbmRfaGN0bF9lbGVtX3QgKmMyKTsKKy8qKiAKKyAqIFxicmllZiBIQ1RMIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBccGFyYW0gaGN0bCBIQ1RMIGhhbmRsZQorICogXHBhcmFtIG1hc2sgZXZlbnQgbWFzaworICogXHBhcmFtIGVsZW0gcmVsYXRlZCBIQ1RMIGVsZW1lbnQgKGlmIGFueSkKKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfaGN0bF9jYWxsYmFja190KShzbmRfaGN0bF90ICpoY3RsLAorCQkJCSAgIHVuc2lnbmVkIGludCBtYXNrLAorCQkJCSAgIHNuZF9oY3RsX2VsZW1fdCAqZWxlbSk7CisvKiogCisgKiBcYnJpZWYgSENUTCBlbGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBccGFyYW0gZWxlbSBIQ1RMIGVsZW1lbnQKKyAqIFxwYXJhbSBtYXNrIGV2ZW50IG1hc2sKKyAqIFxyZXR1cm4gMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfaGN0bF9lbGVtX2NhbGxiYWNrX3QpKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwKKwkJCQkJdW5zaWduZWQgaW50IG1hc2spOworCitpbnQgc25kX2hjdGxfb3BlbihzbmRfaGN0bF90ICoqaGN0bCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF9oY3RsX29wZW5fY3RsKHNuZF9oY3RsX3QgKipoY3RscCwgc25kX2N0bF90ICpjdGwpOworaW50IHNuZF9oY3RsX2Nsb3NlKHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX25vbmJsb2NrKHNuZF9oY3RsX3QgKmhjdGwsIGludCBub25ibG9jayk7CitpbnQgc25kX2hjdGxfcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF9wb2xsX2Rlc2NyaXB0b3JzKHNuZF9oY3RsX3QgKmhjdGwsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX2hjdGxfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9oY3RsX3QgKmN0bCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICpyZXZlbnRzKTsKK3Vuc2lnbmVkIGludCBzbmRfaGN0bF9nZXRfY291bnQoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfc2V0X2NvbXBhcmUoc25kX2hjdGxfdCAqaGN0bCwgc25kX2hjdGxfY29tcGFyZV90IGhzb3J0KTsKK3NuZF9oY3RsX2VsZW1fdCAqc25kX2hjdGxfZmlyc3RfZWxlbShzbmRfaGN0bF90ICpoY3RsKTsKK3NuZF9oY3RsX2VsZW1fdCAqc25kX2hjdGxfbGFzdF9lbGVtKHNuZF9oY3RsX3QgKmhjdGwpOworc25kX2hjdGxfZWxlbV90ICpzbmRfaGN0bF9maW5kX2VsZW0oc25kX2hjdGxfdCAqaGN0bCwgY29uc3Qgc25kX2N0bF9lbGVtX2lkX3QgKmlkKTsKK3ZvaWQgc25kX2hjdGxfc2V0X2NhbGxiYWNrKHNuZF9oY3RsX3QgKmhjdGwsIHNuZF9oY3RsX2NhbGxiYWNrX3QgY2FsbGJhY2spOwordm9pZCBzbmRfaGN0bF9zZXRfY2FsbGJhY2tfcHJpdmF0ZShzbmRfaGN0bF90ICpoY3RsLCB2b2lkICpkYXRhKTsKK3ZvaWQgKnNuZF9oY3RsX2dldF9jYWxsYmFja19wcml2YXRlKHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9oY3RsX2xvYWQoc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX2hjdGxfZnJlZShzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF9oYW5kbGVfZXZlbnRzKHNuZF9oY3RsX3QgKmhjdGwpOworY29uc3QgY2hhciAqc25kX2hjdGxfbmFtZShzbmRfaGN0bF90ICpoY3RsKTsKK2ludCBzbmRfaGN0bF93YWl0KHNuZF9oY3RsX3QgKmhjdGwsIGludCB0aW1lb3V0KTsKK3NuZF9jdGxfdCAqc25kX2hjdGxfY3RsKHNuZF9oY3RsX3QgKmhjdGwpOworCitzbmRfaGN0bF9lbGVtX3QgKnNuZF9oY3RsX2VsZW1fbmV4dChzbmRfaGN0bF9lbGVtX3QgKmVsZW0pOworc25kX2hjdGxfZWxlbV90ICpzbmRfaGN0bF9lbGVtX3ByZXYoc25kX2hjdGxfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfaGN0bF9lbGVtX2luZm8oc25kX2hjdGxfZWxlbV90ICplbGVtLCBzbmRfY3RsX2VsZW1faW5mb190ICogaW5mbyk7CitpbnQgc25kX2hjdGxfZWxlbV9yZWFkKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwgc25kX2N0bF9lbGVtX3ZhbHVlX3QgKiB2YWx1ZSk7CitpbnQgc25kX2hjdGxfZWxlbV93cml0ZShzbmRfaGN0bF9lbGVtX3QgKmVsZW0sIHNuZF9jdGxfZWxlbV92YWx1ZV90ICogdmFsdWUpOworaW50IHNuZF9oY3RsX2VsZW1fdGx2X3JlYWQoc25kX2hjdGxfZWxlbV90ICplbGVtLCB1bnNpZ25lZCBpbnQgKnRsdiwgdW5zaWduZWQgaW50IHRsdl9zaXplKTsKK2ludCBzbmRfaGN0bF9lbGVtX3Rsdl93cml0ZShzbmRfaGN0bF9lbGVtX3QgKmVsZW0sIGNvbnN0IHVuc2lnbmVkIGludCAqdGx2KTsKK2ludCBzbmRfaGN0bF9lbGVtX3Rsdl9jb21tYW5kKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSwgY29uc3QgdW5zaWduZWQgaW50ICp0bHYpOworCitzbmRfaGN0bF90ICpzbmRfaGN0bF9lbGVtX2dldF9oY3RsKHNuZF9oY3RsX2VsZW1fdCAqZWxlbSk7CisKK3ZvaWQgc25kX2hjdGxfZWxlbV9nZXRfaWQoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmosIHNuZF9jdGxfZWxlbV9pZF90ICpwdHIpOwordW5zaWduZWQgaW50IHNuZF9oY3RsX2VsZW1fZ2V0X251bWlkKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK3NuZF9jdGxfZWxlbV9pZmFjZV90IHNuZF9oY3RsX2VsZW1fZ2V0X2ludGVyZmFjZShjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2hjdGxfZWxlbV9nZXRfZGV2aWNlKGNvbnN0IHNuZF9oY3RsX2VsZW1fdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfaGN0bF9lbGVtX2dldF9zdWJkZXZpY2UoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOworY29uc3QgY2hhciAqc25kX2hjdGxfZWxlbV9nZXRfbmFtZShjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2hjdGxfZWxlbV9nZXRfaW5kZXgoY29uc3Qgc25kX2hjdGxfZWxlbV90ICpvYmopOwordm9pZCBzbmRfaGN0bF9lbGVtX3NldF9jYWxsYmFjayhzbmRfaGN0bF9lbGVtX3QgKm9iaiwgc25kX2hjdGxfZWxlbV9jYWxsYmFja190IHZhbCk7Cit2b2lkICogc25kX2hjdGxfZWxlbV9nZXRfY2FsbGJhY2tfcHJpdmF0ZShjb25zdCBzbmRfaGN0bF9lbGVtX3QgKm9iaik7Cit2b2lkIHNuZF9oY3RsX2VsZW1fc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX2hjdGxfZWxlbV90ICpvYmosIHZvaWQgKiB2YWwpOworCisvKiogXH0gKi8KKworLyoqIFx9ICovCisKKy8qKgorICogIFxkZWZncm91cCBTQ29udHJvbCBTZXR1cCBDb250cm9sIEludGVyZmFjZQorICogIFxpbmdyb3VwIENvbnRyb2wKKyAqICBUaGUgc2V0dXAgY29udHJvbCBpbnRlcmZhY2UgLSBzZXQgb3IgbW9kaWZ5IGNvbnRyb2wgZWxlbWVudHMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqICBceworICovCisKK2ludCBzbmRfc2N0bF9idWlsZChzbmRfc2N0bF90ICoqY3RsLCBzbmRfY3RsX3QgKmhhbmRsZSwgc25kX2NvbmZpZ190ICpjb25maWcsCisJCSAgIHNuZF9jb25maWdfdCAqcHJpdmF0ZV9kYXRhLCBpbnQgbW9kZSk7CitpbnQgc25kX3NjdGxfZnJlZShzbmRfc2N0bF90ICpoYW5kbGUpOworaW50IHNuZF9zY3RsX2luc3RhbGwoc25kX3NjdGxfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2N0bF9yZW1vdmUoc25kX3NjdGxfdCAqaGFuZGxlKTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfQ09OVFJPTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvY29udHJvbF9leHRlcm5hbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2xfZXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzA2NmNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnRyb2xfZXh0ZXJuYWwuaApAQCAtMCwwICsxLDI2NSBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2NvbnRyb2xfZXh0ZXJuYWwuaAorICogXGJyaWVmIEV4dGVybmFsIGNvbnRyb2wgcGx1Z2luIFNESworICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAyMDA1CisgKgorICogRXh0ZXJuYWwgY29udHJvbCBwbHVnaW4gU0RLLgorICovCisKKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpZm5kZWYgX19BTFNBX0NPTlRST0xfRVhURVJOQUxfSAorI2RlZmluZSBfX0FMU0FfQ09OVFJPTF9FWFRFUk5BTF9ICisKKyNpbmNsdWRlICJjb250cm9sLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIEN0bFBsdWdpbl9TREsgRXh0ZXJuYWwgQ29udHJvbCBQbHVnaW4gU0RLCisgKiAgXHsKKyAqLworCisvKioKKyAqIERlZmluZSB0aGUgb2JqZWN0IGVudHJ5IGZvciBleHRlcm5hbCBjb250cm9sIHBsdWdpbnMKKyAqLworI2RlZmluZSBTTkRfQ1RMX1BMVUdJTl9FTlRSWShuYW1lKSBfc25kX2N0bF8jI25hbWUjI19vcGVuCisKKy8qKgorICogRGVmaW5lIHRoZSBzeW1ib2xzIG9mIHRoZSBnaXZlbiBjb250cm9sIHBsdWdpbiB3aXRoIHZlcnNpb25zCisgKi8KKyNkZWZpbmUgU05EX0NUTF9QTFVHSU5fU1lNQk9MKG5hbWUpIFNORF9ETFNZTV9CVUlMRF9WRVJTSU9OKFNORF9DVExfUExVR0lOX0VOVFJZKG5hbWUpLCBTTkRfQ09OVFJPTF9ETFNZTV9WRVJTSU9OKTsKKworLyoqCisgKiBEZWZpbmUgdGhlIGNvbnRyb2wgcGx1Z2luCisgKi8KKyNkZWZpbmUgU05EX0NUTF9QTFVHSU5fREVGSU5FX0ZVTkMocGx1Z2luKSBcCitpbnQgU05EX0NUTF9QTFVHSU5fRU5UUlkocGx1Z2luKSAoc25kX2N0bF90ICoqaGFuZGxlcCwgY29uc3QgY2hhciAqbmFtZSxcCisJCQkJICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwgaW50IG1vZGUpCisKKy8qKiBFeHRlcm5hbCBjb250cm9sIHBsdWdpbiBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9jdGxfZXh0IHNuZF9jdGxfZXh0X3Q7CisvKiogQ2FsbGJhY2sgdGFibGUgb2YgY29udHJvbCBleHQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9jdGxfZXh0X2NhbGxiYWNrIHNuZF9jdGxfZXh0X2NhbGxiYWNrX3Q7CisvKiogS2V5IHRvIGFjY2VzcyBhIGNvbnRyb2wgcG9pbnRlciAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNuZF9jdGxfZXh0X2tleV90OworCisvKgorICogUHJvdG9jb2wgdmVyc2lvbgorICovCisjZGVmaW5lIFNORF9DVExfRVhUX1ZFUlNJT05fTUFKT1IJMQkvKio8IFByb3RvY29sIG1ham9yIHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0NUTF9FWFRfVkVSU0lPTl9NSU5PUgkwCS8qKjwgUHJvdG9jb2wgbWlub3IgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfQ1RMX0VYVF9WRVJTSU9OX1RJTlkJMAkvKio8IFByb3RvY29sIHRpbnkgdmVyc2lvbiAqLworLyoqCisgKiBleHRlcm5hbCBwbHVnaW4gcHJvdG9jb2wgdmVyc2lvbgorICovCisjZGVmaW5lIFNORF9DVExfRVhUX1ZFUlNJT04JCSgoU05EX0NUTF9FWFRfVkVSU0lPTl9NQUpPUjw8MTYpIHxcCisJCQkJCSAoU05EX0NUTF9FWFRfVkVSU0lPTl9NSU5PUjw8OCkgfFwKKwkJCQkJIChTTkRfQ1RMX0VYVF9WRVJTSU9OX1RJTlkpKQorCisvKiogSGFuZGxlIG9mIGNvbnRyb2wgZXh0ICovCitzdHJ1Y3Qgc25kX2N0bF9leHQgeworCS8qKgorCSAqIHByb3RvY29sIHZlcnNpb247ICNTTkRfQ1RMX0VYVF9WRVJTSU9OIG11c3QgYmUgZmlsbGVkIGhlcmUKKwkgKiBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKKwkvKioKKwkgKiBJbmRleCBvZiB0aGlzIGNhcmQ7IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCWludCBjYXJkX2lkeDsKKwkvKioKKwkgKiBJRCBzdHJpbmcgb2YgdGhpcyBjYXJkOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwljaGFyIGlkWzE2XTsKKwkvKioKKwkgKiBEcml2ZXIgbmFtZSBvZiB0aGlzIGNhcmQ7IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfY3RsX2V4dF9jcmVhdGUoKQorCSAqLworCWNoYXIgZHJpdmVyWzE2XTsKKwkvKioKKwkgKiBzaG9ydCBuYW1lIG9mIHRoaXMgY2FyZDsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJY2hhciBuYW1lWzMyXTsKKwkvKioKKwkgKiBMb25nIG5hbWUgb2YgdGhpcyBjYXJkOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX2N0bF9leHRfY3JlYXRlKCkKKwkgKi8KKwljaGFyIGxvbmduYW1lWzgwXTsKKwkvKioKKwkgKiBNaXhlciBuYW1lIG9mIHRoaXMgY2FyZDsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJY2hhciBtaXhlcm5hbWVbODBdOworCS8qKgorCSAqIHBvbGwgZGVzY3JpcHRvcgorCSAqLworCWludCBwb2xsX2ZkOworCisJLyoqCisJICogY2FsbGJhY2tzIG9mIHRoaXMgcGx1Z2luOyBtdXN0IGJlIGZpbGxlZCBiZWZvcmUgY2FsbGluZyAjc25kX3BjbV9pb3BsdWdfY3JlYXRlKCkKKwkgKi8KKwljb25zdCBzbmRfY3RsX2V4dF9jYWxsYmFja190ICpjYWxsYmFjazsKKwkvKioKKwkgKiBwcml2YXRlIGRhdGEsIHdoaWNoIGNhbiBiZSB1c2VkIGZyZWVseSBpbiB0aGUgZHJpdmVyIGNhbGxiYWNrcworCSAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwkvKioKKwkgKiBjb250cm9sIGhhbmRsZSBmaWxsZWQgYnkgI3NuZF9jdGxfZXh0X2NyZWF0ZSgpCisJICovCisJc25kX2N0bF90ICpoYW5kbGU7CisKKwlpbnQgbm9uYmxvY2s7CQkJLyoqPCBub24tYmxvY2sgbW9kZTsgcmVhZC1vbmx5ICovCisJaW50IHN1YnNjcmliZWQ7CQkJLyoqPCBldmVudHMgc3Vic2NyaWJlZDsgcmVhZC1vbmx5ICovCit9OworCisvKiogQ2FsbGJhY2sgdGFibGUgb2YgZXh0ICovCitzdHJ1Y3Qgc25kX2N0bF9leHRfY2FsbGJhY2sgeworCS8qKgorCSAqIGNsb3NlIHRoZSBjb250cm9sIGhhbmRsZTsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqY2xvc2UpKHNuZF9jdGxfZXh0X3QgKmV4dCk7CisJLyoqCisJICogcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHM7IHJlcXVpcmVkCisJICovCisJaW50ICgqZWxlbV9jb3VudCkoc25kX2N0bF9leHRfdCAqZXh0KTsKKwkvKioKKwkgKiByZXR1cm4gdGhlIGVsZW1lbnQgaWQgb2YgdGhlIGdpdmVuIG9mZnNldCAoYXJyYXkgaW5kZXgpOyByZXF1aXJlZAorCSAqLworCWludCAoKmVsZW1fbGlzdCkoc25kX2N0bF9leHRfdCAqZXh0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzbmRfY3RsX2VsZW1faWRfdCAqaWQpOworCS8qKgorCSAqIGNvbnZlcnQgdGhlIGVsZW1lbnQgaWQgdG8gYSBzZWFyY2gga2V5OyByZXF1aXJlZAorCSAqLworCXNuZF9jdGxfZXh0X2tleV90ICgqZmluZF9lbGVtKShzbmRfY3RsX2V4dF90ICpleHQsIGNvbnN0IHNuZF9jdGxfZWxlbV9pZF90ICppZCk7CisJLyoqCisJICogdGhlIGRlc3RydWN0b3Igb2YgdGhlIGtleTsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqZnJlZV9rZXkpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5KTsKKwkvKioKKwkgKiBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZWxlbWVudDsgcmVxdWlyZWQKKwkgKi8KKwlpbnQgKCpnZXRfYXR0cmlidXRlKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwKKwkJCSAgICAgaW50ICp0eXBlLCB1bnNpZ25lZCBpbnQgKmFjYywgdW5zaWduZWQgaW50ICpjb3VudCk7CisJLyoqCisJICogZ2V0IHRoZSBlbGVtZW50IGluZm9ybWF0aW9uIG9mIGludGVnZXIgdHlwZQorCSAqLworCWludCAoKmdldF9pbnRlZ2VyX2luZm8pKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LAorCQkJCWxvbmcgKmltaW4sIGxvbmcgKmltYXgsIGxvbmcgKmlzdGVwKTsKKwkvKioKKwkgKiBnZXQgdGhlIGVsZW1lbnQgaW5mb3JtYXRpb24gb2YgaW50ZWdlcjY0IHR5cGUKKwkgKi8KKwlpbnQgKCpnZXRfaW50ZWdlcjY0X2luZm8pKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LAorCQkJCSAgaW50NjRfdCAqaW1pbiwgaW50NjRfdCAqaW1heCwgaW50NjRfdCAqaXN0ZXApOworCS8qKgorCSAqIGdldCB0aGUgZWxlbWVudCBpbmZvcm1hdGlvbiBvZiBlbnVtZXJhdGVkIHR5cGUKKwkgKi8KKwlpbnQgKCpnZXRfZW51bWVyYXRlZF9pbmZvKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgdW5zaWduZWQgaW50ICppdGVtcyk7CisJLyoqCisJICogZ2V0IHRoZSBuYW1lIG9mIHRoZSBlbnVtZXJhdGVkIGl0ZW0KKwkgKi8KKwlpbnQgKCpnZXRfZW51bWVyYXRlZF9uYW1lKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgdW5zaWduZWQgaW50IGl0ZW0sCisJCQkJICAgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbWF4X2xlbik7CisJLyoqCisJICogcmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaW50ZWdlciB0eXBlCisJICovCisJaW50ICgqcmVhZF9pbnRlZ2VyKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgbG9uZyAqdmFsdWUpOworCS8qKgorCSAqIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGludGVnZXI2NCB0eXBlCisJICovCisJaW50ICgqcmVhZF9pbnRlZ2VyNjQpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSk7CisJLyoqCisJICogcmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgZW51bWVyYXRlZCB0eXBlCisJICovCisJaW50ICgqcmVhZF9lbnVtZXJhdGVkKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgdW5zaWduZWQgaW50ICppdGVtcyk7CisJLyoqCisJICogcmVhZCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgYnl0ZXMgdHlwZQorCSAqLworCWludCAoKnJlYWRfYnl0ZXMpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICBzaXplX3QgbWF4X2J5dGVzKTsKKwkvKioKKwkgKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpZWM5NTggdHlwZQorCSAqLworCWludCAoKnJlYWRfaWVjOTU4KShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgc25kX2Flc19pZWM5NThfdCAqaWVjOTU4KTsKKwkvKioKKwkgKiB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGludGVnZXIgdHlwZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMKKwkgKi8KKwlpbnQgKCp3cml0ZV9pbnRlZ2VyKShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgbG9uZyAqdmFsdWUpOworCS8qKgorCSAqIHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaW50ZWdlcjY0IHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisJICovCisJaW50ICgqd3JpdGVfaW50ZWdlcjY0KShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZXh0X2tleV90IGtleSwgaW50NjRfdCAqdmFsdWUpOworCS8qKgorCSAqIHVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgZW51bWVyYXRlZCB0eXBlIHdpdGggdGhlIGdpdmVuIHZhbHVlcworCSAqLworCWludCAoKndyaXRlX2VudW1lcmF0ZWQpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCB1bnNpZ25lZCBpbnQgKml0ZW1zKTsKKwkvKioKKwkgKiB1cGRhdGUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGJ5dGVzIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzCisJICovCisJaW50ICgqd3JpdGVfYnl0ZXMpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgc2l6ZV90IG1heF9ieXRlcyk7CisJLyoqCisJICogdXBkYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBpZWM5NTggdHlwZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMKKwkgKi8KKwlpbnQgKCp3cml0ZV9pZWM5NTgpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc25kX2N0bF9leHRfa2V5X3Qga2V5LCBzbmRfYWVzX2llYzk1OF90ICppZWM5NTgpOworCS8qKgorCSAqIHN1YnNjcmliZS91bnN1YnNjcmliZSB0aGUgZXZlbnQgbm90aWZpY2F0aW9uOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpzdWJzY3JpYmVfZXZlbnRzKShzbmRfY3RsX2V4dF90ICpleHQsIGludCBzdWJzY3JpYmUpOworCS8qKgorCSAqIHJlYWQgYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiBldmVudDsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpyZWFkX2V2ZW50KShzbmRfY3RsX2V4dF90ICpleHQsIHNuZF9jdGxfZWxlbV9pZF90ICppZCwgdW5zaWduZWQgaW50ICpldmVudF9tYXNrKTsKKwkvKioKKwkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBwb2xsIGRlc2NyaXB0b3JzOyBvcHRpb25hbAorCSAqLworCWludCAoKnBvbGxfZGVzY3JpcHRvcnNfY291bnQpKHNuZF9jdGxfZXh0X3QgKmV4dCk7CisJLyoqCisJICogZmlsbCB0aGUgcG9sbCBkZXNjcmlwdG9yczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX2Rlc2NyaXB0b3JzKShzbmRfY3RsX2V4dF90ICpleHQsIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CisJLyoqCisJICogbWFuZ2xlIHRoZSByZXZlbnRzIG9mIHBvbGwgZGVzY3JpcHRvcnMKKwkgKi8KKwlpbnQgKCpwb2xsX3JldmVudHMpKHNuZF9jdGxfZXh0X3QgKmV4dCwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICpyZXZlbnRzKTsKK307CisKKy8qKgorICogVGhlIGFjY2VzcyB0eXBlIGJpdHMgc3RvcmVkIGluIGdldF9hdHRyaWJ1dGUgY2FsbGJhY2sKKyAqLwordHlwZWRlZiBlbnVtIHNuZF9jdGxfZXh0X2FjY2VzcyB7CisJU05EX0NUTF9FWFRfQUNDRVNTX1JFQUQgPSAoMTw8MCksCisJU05EX0NUTF9FWFRfQUNDRVNTX1dSSVRFID0gKDE8PDEpLAorCVNORF9DVExfRVhUX0FDQ0VTU19SRUFEV1JJVEUgPSAoMzw8MCksCisJU05EX0NUTF9FWFRfQUNDRVNTX1ZPTEFUSUxFID0gKDE8PDIpLAorCVNORF9DVExfRVhUX0FDQ0VTU19JTkFDVElWRSA9ICgxPDw4KSwKK30gc25kX2N0bF9leHRfYWNjZXNzX3Q7CisKKy8qKgorICogZmluZF9lbGVtIGNhbGxiYWNrIHJldHVybnMgdGhpcyBpZiBubyBtYXRjaGluZyBjb250cm9sIGVsZW1lbnQgaXMgZm91bmQKKyAqLworI2RlZmluZSBTTkRfQ1RMX0VYVF9LRVlfTk9UX0ZPVU5ECShzbmRfY3RsX2V4dF9rZXlfdCkoLTEpCisKK2ludCBzbmRfY3RsX2V4dF9jcmVhdGUoc25kX2N0bF9leHRfdCAqZXh0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX2N0bF9leHRfZGVsZXRlKHNuZF9jdGxfZXh0X3QgKmV4dCk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX0NPTlRST0xfRVhURVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2NvbnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkNjI0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9jb252LmgKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2NvbnYuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfQ09OVl9ICisjZGVmaW5lIF9fQUxTQV9DT05WX0gKKworLyoqCisgKiAgXGRlZmdyb3VwIEJDb252IEJpbmFyeSBWYWx1ZSBDb252ZXJzaW9uCisgKiAgSGVscGVyIG1hY3JvcyB0byBjb252ZXJ0IGJpbmFyeSB2YWx1ZXMgdG8vZnJvbSBhIHNwZWNpZmljIGJ5dGUgb3JkZXIuCisgKiAgXHsKKyAqLworCisvKiogQ29udmVydHMgYSAxNi1iaXQgdmFsdWUgZnJvbSBob3N0IHRvIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlci4gKi8KKyNkZWZpbmUgc25kX2hvc3RfdG9fTEVfMTYodmFsKQlfX2NwdV90b19sZTE2KHZhbCkKKy8qKiBDb252ZXJ0cyBhIDE2LWJpdCB2YWx1ZSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gaG9zdCBieXRlIG9yZGVyLiAqLworI2RlZmluZSBzbmRfTEVfdG9faG9zdF8xNih2YWwpCV9fbGUxNl90b19jcHUodmFsKQorLyoqIENvbnZlcnRzIGEgMzItYml0IHZhbHVlIGZyb20gaG9zdCB0byBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIuICovCisjZGVmaW5lIHNuZF9ob3N0X3RvX0xFXzMyKHZhbCkJX19jcHVfdG9fbGUzMih2YWwpCisvKiogQ29udmVydHMgYSAzMi1iaXQgdmFsdWUgZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4gKi8KKyNkZWZpbmUgc25kX0xFX3RvX2hvc3RfMzIodmFsKQlfX2xlMzJfdG9fY3B1KHZhbCkKKy8qKiBDb252ZXJ0cyBhIDE2LWJpdCB2YWx1ZSBmcm9tIGhvc3QgdG8gYmlnIGVuZGlhbiBieXRlIG9yZGVyLiAqLworI2RlZmluZSBzbmRfaG9zdF90b19CRV8xNih2YWwpCV9fY3B1X3RvX2JlMTYodmFsKQorLyoqIENvbnZlcnRzIGEgMTYtYml0IHZhbHVlIGZyb20gYmlnIGVuZGlhbiB0byBob3N0IGJ5dGUgb3JkZXIuICovCisjZGVmaW5lIHNuZF9CRV90b19ob3N0XzE2KHZhbCkJX19iZTE2X3RvX2NwdSh2YWwpCisvKiogQ29udmVydHMgYSAzMi1iaXQgdmFsdWUgZnJvbSBob3N0IHRvIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4gKi8KKyNkZWZpbmUgc25kX2hvc3RfdG9fQkVfMzIodmFsKQlfX2NwdV90b19iZTMyKHZhbCkKKy8qKiBDb252ZXJ0cyBhIDMyLWJpdCB2YWx1ZSBmcm9tIGJpZyBlbmRpYW4gdG8gaG9zdCBieXRlIG9yZGVyLiAqLworI2RlZmluZSBzbmRfQkVfdG9faG9zdF8zMih2YWwpCV9fYmUzMl90b19jcHUodmFsKQorCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9DT05WX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Vycm9yLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI3MDgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2Vycm9yLmgKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2Vycm9yLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0VSUk9SX0gKKyNkZWZpbmUgX19BTFNBX0VSUk9SX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgRXJyb3IgRXJyb3IgaGFuZGxpbmcKKyAqICBFcnJvciBoYW5kbGluZyBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4KKyAqICBceworICovCisKKyNkZWZpbmUgU05EX0VSUk9SX0JFR0lOCQkJCTUwMDAwMAkJCS8qKjwgTG93ZXIgYm91bmRhcnkgb2Ygc291bmQgZXJyb3IgY29kZXMuICovCisjZGVmaW5lIFNORF9FUlJPUl9JTkNPTVBBVElCTEVfVkVSU0lPTgkJKFNORF9FUlJPUl9CRUdJTiswKQkvKio8IEtlcm5lbC9saWJyYXJ5IHByb3RvY29scyBhcmUgbm90IGNvbXBhdGlibGUuICovCisjZGVmaW5lIFNORF9FUlJPUl9BTElTUF9OSUwJCQkoU05EX0VSUk9SX0JFR0lOKzEpCS8qKjwgTGlzcCBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgYWNhbGwuICovCisKK2NvbnN0IGNoYXIgKnNuZF9zdHJlcnJvcihpbnQgZXJybnVtKTsKKworLyoqCisgKiBcYnJpZWYgRXJyb3IgaGFuZGxlciBjYWxsYmFjay4KKyAqIFxwYXJhbSBmaWxlIFNvdXJjZSBmaWxlIG5hbWUuCisgKiBccGFyYW0gbGluZSBMaW5lIG51bWJlci4KKyAqIFxwYXJhbSBmdW5jdGlvbiBGdW5jdGlvbiBuYW1lLgorICogXHBhcmFtIGVyciBWYWx1ZSBvZiBcYyBlcnJubywgb3IgMCBpZiBub3QgcmVsZXZhbnQuCisgKiBccGFyYW0gZm10IFxjIHByaW50ZigzKSBmb3JtYXQuCisgKiBccGFyYW0gLi4uIFxjIHByaW50ZigzKSBhcmd1bWVudHMuCisgKgorICogQSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUgaXMgY2FsbGVkIGJ5IHRoZSBBTFNBIGxpYnJhcnkgd2hlbiBhbiBlcnJvciBvY2N1cnMuCisgKiBUaGlzIGZ1bmN0aW9uIHVzdWFsbHkgc2hvd3MgdGhlIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbiwgYW5kL29yIGxvZ3MgaXQuCisgKi8KK3R5cGVkZWYgdm9pZCAoKnNuZF9saWJfZXJyb3JfaGFuZGxlcl90KShjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGludCBlcnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSAvKiBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDUsIDYpKSkgKi87CitleHRlcm4gc25kX2xpYl9lcnJvcl9oYW5kbGVyX3Qgc25kX2xpYl9lcnJvcjsKK2V4dGVybiBpbnQgc25kX2xpYl9lcnJvcl9zZXRfaGFuZGxlcihzbmRfbGliX2Vycm9yX2hhbmRsZXJfdCBoYW5kbGVyKTsKKworI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+IDk1KQorI2RlZmluZSBTTkRFUlIoLi4uKSBzbmRfbGliX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fLCAwLCBfX1ZBX0FSR1NfXykgLyoqPCBTaG93cyBhIHNvdW5kIGVycm9yIG1lc3NhZ2UuICovCisjZGVmaW5lIFNZU0VSUiguLi4pIHNuZF9saWJfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIGVycm5vLCBfX1ZBX0FSR1NfXykgLyoqPCBTaG93cyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIChyZWxhdGVkIHRvIFxjIGVycm5vKS4gKi8KKyNlbHNlCisjZGVmaW5lIFNOREVSUihhcmdzLi4uKSBzbmRfbGliX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fLCAwLCAjI2FyZ3MpIC8qKjwgU2hvd3MgYSBzb3VuZCBlcnJvciBtZXNzYWdlLiAqLworI2RlZmluZSBTWVNFUlIoYXJncy4uLikgc25kX2xpYl9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgZXJybm8sICMjYXJncykgLyoqPCBTaG93cyBhIHN5c3RlbSBlcnJvciBtZXNzYWdlIChyZWxhdGVkIHRvIFxjIGVycm5vKS4gKi8KKyNlbmRpZgorCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9FUlJPUl9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9nbG9iYWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9nbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg4ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2dsb2JhbC5oCkBAIC0wLDAgKzEsMTU2IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvZ2xvYmFsLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0dMT0JBTF9IXworI2RlZmluZSBfX0FMU0FfR0xPQkFMX0hfCisKKy8qIGZvciB0aW1ldmFsIGFuZCB0aW1lc3BlYyAqLworI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgR2xvYmFsIEdsb2JhbCBkZWZpbmVzIGFuZCBmdW5jdGlvbnMKKyAqICBHbG9iYWwgZGVmaW5lcyBhbmQgZnVuY3Rpb25zLgorICogIFxwYXIKKyAqICBUaGUgQUxTQSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlc2UgbWFjcm9zIGFuZCBmdW5jdGlvbnMuCisgKiAgTW9zdCBhcHBsaWNhdGlvbnMgcHJvYmFibHkgZG8gbm90IG5lZWQgdGhlbS4KKyAqICBceworICovCisKK2NvbnN0IGNoYXIgKnNuZF9hc291bmRsaWJfdmVyc2lvbih2b2lkKTsKKworI2lmbmRlZiBBVFRSSUJVVEVfVU5VU0VECisvKiogZG8gbm90IHByaW50IHdhcm5pbmcgKGdjYykgd2hlbiBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgKi8KKyNkZWZpbmUgQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjZW5kaWYKKworI2lmZGVmIFBJQyAvKiBkeW5hbWljIGJ1aWxkICovCisKKy8qKiBcaGlkZWluaXRpYWxpemVyIFxicmllZiBIZWxwZXIgbWFjcm8gZm9yICNTTkRfRExTWU1fQlVJTERfVkVSU0lPTi4gKi8KKyNkZWZpbmUgX19TTkRfRExTWU1fVkVSU0lPTihuYW1lLCB2ZXJzaW9uKSBfICMjIG5hbWUgIyMgdmVyc2lvbgorLyoqCisgKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgQXBwZW5kcyB0aGUgYnVpbGQgdmVyc2lvbiB0byB0aGUgbmFtZSBvZiBhIHZlcnNpb25lZCBkeW5hbWljIHN5bWJvbC4KKyAqLworI2RlZmluZSBTTkRfRExTWU1fQlVJTERfVkVSU0lPTihuYW1lLCB2ZXJzaW9uKSBjaGFyIF9fU05EX0RMU1lNX1ZFUlNJT04obmFtZSwgdmVyc2lvbik7CisKKyNlbHNlIC8qIHN0YXRpYyBidWlsZCAqLworCitzdHJ1Y3Qgc25kX2Rsc3ltX2xpbmsgeworCXN0cnVjdCBzbmRfZGxzeW1fbGluayAqbmV4dDsKKwljb25zdCBjaGFyICpkbHN5bV9uYW1lOworCWNvbnN0IHZvaWQgKmRsc3ltX3B0cjsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc25kX2Rsc3ltX2xpbmsgKnNuZF9kbHN5bV9zdGFydDsKKworLyoqIFxoaWRlaW5pdGlhbGl6ZXIgXGJyaWVmIEhlbHBlciBtYWNybyBmb3IgI1NORF9ETFNZTV9CVUlMRF9WRVJTSU9OLiAqLworI2RlZmluZSBfX1NORF9ETFNZTV9WRVJTSU9OKHByZWZpeCwgbmFtZSwgdmVyc2lvbikgXyAjIyBwcmVmaXggIyMgbmFtZSAjIyB2ZXJzaW9uCisvKioKKyAqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBBcHBlbmRzIHRoZSBidWlsZCB2ZXJzaW9uIHRvIHRoZSBuYW1lIG9mIGEgdmVyc2lvbmVkIGR5bmFtaWMgc3ltYm9sLgorICovCisjZGVmaW5lIFNORF9ETFNZTV9CVUlMRF9WRVJTSU9OKG5hbWUsIHZlcnNpb24pIFwKKyAgc3RhdGljIHN0cnVjdCBzbmRfZGxzeW1fbGluayBfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV8sIG5hbWUsIHZlcnNpb24pOyBcCisgIHZvaWQgX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fY29uc3RydWN0b3JfLCBuYW1lLCB2ZXJzaW9uKSAodm9pZCkgX19hdHRyaWJ1dGVfXyAoKGNvbnN0cnVjdG9yKSk7IFwKKyAgdm9pZCBfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV9jb25zdHJ1Y3Rvcl8sIG5hbWUsIHZlcnNpb24pICh2b2lkKSB7IFwKKyAgICBfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV8sIG5hbWUsIHZlcnNpb24pLm5leHQgPSBzbmRfZGxzeW1fc3RhcnQ7IFwKKyAgICBfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV8sIG5hbWUsIHZlcnNpb24pLmRsc3ltX25hbWUgPSAjIG5hbWU7IFwKKyAgICBfX1NORF9ETFNZTV9WRVJTSU9OKHNuZF9kbHN5bV8sIG5hbWUsIHZlcnNpb24pLmRsc3ltX3B0ciA9ICh2b2lkICopJm5hbWU7IFwKKyAgICBzbmRfZGxzeW1fc3RhcnQgPSAmX19TTkRfRExTWU1fVkVSU0lPTihzbmRfZGxzeW1fLCBuYW1lLCB2ZXJzaW9uKTsgXAorICB9CisKKyNlbmRpZgorCisjaWZuZGVmIF9fU1RSSU5HCisvKiogXGJyaWVmIFJldHVybiAneCcgYXJndW1lbnQgYXMgc3RyaW5nICovCisjZGVmaW5lIF9fU1RSSU5HKHgpICAgICAjeAorI2VuZGlmCisKKy8qKiBcYnJpZWYgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiBhIGR5bmFtaWMgc3ltYm9sIGFzIGEgc3RyaW5nLiAqLworI2RlZmluZSBTTkRfRExTWU1fVkVSU0lPTih2ZXJzaW9uKSBfX1NUUklORyh2ZXJzaW9uKQorCit2b2lkICpzbmRfZGxvcGVuKGNvbnN0IGNoYXIgKmZpbGUsIGludCBtb2RlKTsKK3ZvaWQgKnNuZF9kbHN5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZlcnNpb24pOworaW50IHNuZF9kbGNsb3NlKHZvaWQgKmhhbmRsZSk7CisKKworLyoqCisgKiBcYnJpZWYgSW50ZXJuYWwgc3RydWN0dXJlIGZvciBhbiBhc3luYyBub3RpZmljYXRpb24gY2xpZW50IGhhbmRsZXIuCisgKgorICogVGhlIEFMU0EgbGlicmFyeSB1c2VzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBhcyBhIGhhbmRsZSB0byBhbiBhc3luYworICogbm90aWZpY2F0aW9uIG9iamVjdC4gQXBwbGljYXRpb25zIGRvbid0IGFjY2VzcyBpdHMgY29udGVudHMgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfYXN5bmNfaGFuZGxlciBzbmRfYXN5bmNfaGFuZGxlcl90OworCisvKioKKyAqIFxicmllZiBBc3luYyBub3RpZmljYXRpb24gY2FsbGJhY2suCisgKgorICogU2VlIHRoZSAjc25kX2FzeW5jX2FkZF9oYW5kbGVyIGZ1bmN0aW9uIGZvciBkZXRhaWxzLgorICovCit0eXBlZGVmIHZvaWQgKCpzbmRfYXN5bmNfY2FsbGJhY2tfdCkoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CisKK2ludCBzbmRfYXN5bmNfYWRkX2hhbmRsZXIoc25kX2FzeW5jX2hhbmRsZXJfdCAqKmhhbmRsZXIsIGludCBmZCwgCisJCQkgIHNuZF9hc3luY19jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpwcml2YXRlX2RhdGEpOworaW50IHNuZF9hc3luY19kZWxfaGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfYXN5bmNfaGFuZGxlcl9nZXRfZmQoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CitpbnQgc25kX2FzeW5jX2hhbmRsZXJfZ2V0X3NpZ25vKHNuZF9hc3luY19oYW5kbGVyX3QgKmhhbmRsZXIpOwordm9pZCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX2FzeW5jX2hhbmRsZXJfdCAqaGFuZGxlcik7CisKK3N0cnVjdCBzbmRfc2htX2FyZWEgKnNuZF9zaG1fYXJlYV9jcmVhdGUoaW50IHNobWlkLCB2b2lkICpwdHIpOworc3RydWN0IHNuZF9zaG1fYXJlYSAqc25kX3NobV9hcmVhX3NoYXJlKHN0cnVjdCBzbmRfc2htX2FyZWEgKmFyZWEpOworaW50IHNuZF9zaG1fYXJlYV9kZXN0cm95KHN0cnVjdCBzbmRfc2htX2FyZWEgKmFyZWEpOworCitpbnQgc25kX3VzZXJfZmlsZShjb25zdCBjaGFyICpmaWxlLCBjaGFyICoqcmVzdWx0KTsKKworI2lmICFkZWZpbmVkKF9QT1NJWF9DX1NPVVJDRSkgJiYgIWRlZmluZWQoX1BPU0lYX1NPVVJDRSkKK3N0cnVjdCB0aW1ldmFsIHsKKwl0aW1lX3QJCXR2X3NlYzsJCS8qIHNlY29uZHMgKi8KKwlsb25nCQl0dl91c2VjOwkvKiBtaWNyb3NlY29uZHMgKi8KK307CisKK3N0cnVjdCB0aW1lc3BlYyB7CisJdGltZV90CQl0dl9zZWM7CQkvKiBzZWNvbmRzICovCisJbG9uZwkJdHZfbnNlYzsJLyogbmFub3NlY29uZHMgKi8KK307CisjZW5kaWYKKworLyoqIFRpbWVzdGFtcCAqLwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCBzbmRfdGltZXN0YW1wX3Q7CisvKiogSGktcmVzIHRpbWVzdGFtcCAqLwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgc25kX2h0aW1lc3RhbXBfdDsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfR0xPQkFMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9od2RlcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2h3ZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmMWU5MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9od2RlcC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvaHdkZXAuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfSFdERVBfSAorI2RlZmluZSBfX0FMU0FfSFdERVBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBId0RlcCBIYXJkd2FyZSBEZXBlbmRhbnQgSW50ZXJmYWNlCisgKiAgVGhlIEhhcmR3YXJlIERlcGVuZGFudCBJbnRlcmZhY2UuCisgKiAgXHsKKyAqLworCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9IV0RFUF9ETFNZTV9WRVJTSU9OCQlfZGxzeW1faHdkZXBfMDAxCisKKy8qKiBId0RlcCBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaHdkZXBfaW5mbyBzbmRfaHdkZXBfaW5mb190OworCisvKiogSHdEZXAgRFNQIHN0YXR1cyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaHdkZXBfZHNwX3N0YXR1cyBzbmRfaHdkZXBfZHNwX3N0YXR1c190OworCisvKiogSHdEZXAgRFNQIGltYWdlIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9od2RlcF9kc3BfaW1hZ2Ugc25kX2h3ZGVwX2RzcF9pbWFnZV90OworCisvKiogSHdEZXAgaW50ZXJmYWNlICovCit0eXBlZGVmIGVudW0gX3NuZF9od2RlcF9pZmFjZSB7CisJU05EX0hXREVQX0lGQUNFX09QTDIgPSAwLAkvKio8IE9QTDIgcmF3IGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9PUEwzLAkJLyoqPCBPUEwzIHJhdyBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfT1BMNCwJCS8qKjwgT1BMNCByYXcgZHJpdmVyICovCisJU05EX0hXREVQX0lGQUNFX1NCMTZDU1AsCS8qKjwgU0IxNkNTUCBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfRU1VMTBLMSwJLyoqPCBFTVUxMEsxIGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9ZU1MyMjUsCQkvKio8IFlTUzIyNSBkcml2ZXIgKi8KKwlTTkRfSFdERVBfSUZBQ0VfSUNTMjExNSwJLyoqPCBJQ1MyMTE1IGRyaXZlciAqLworCVNORF9IV0RFUF9JRkFDRV9TU0NBUEUsCQkvKio8IEVuc29uaXEgU291bmRTY2FwZSBJU0EgY2FyZCAoTUM2OEVDMDAwKSAqLworCVNORF9IV0RFUF9JRkFDRV9WWCwJCS8qKjwgRGlnaWdyYW0gVlggY2FyZHMgKi8KKwlTTkRfSFdERVBfSUZBQ0VfTUlYQVJULAkJLyoqPCBEaWdpZ3JhbSBtaVhhcnQgY2FyZHMgKi8KKwlTTkRfSFdERVBfSUZBQ0VfVVNYMlksCQkvKio8IFRhc2NhbSBVUzEyMiwgVVMyMjQgJiBVUzQyOCB1c2IgKi8KKwlTTkRfSFdERVBfSUZBQ0VfRU1VWF9XQVZFVEFCTEUsCS8qKjwgRW11WCB3YXZldGFibGUgKi8KKwlTTkRfSFdERVBfSUZBQ0VfQkxVRVRPT1RILAkvKio8IEJsdWV0b290aCBhdWRpbyAqLworCVNORF9IV0RFUF9JRkFDRV9VU1gyWV9QQ00sCS8qKjwgVGFzY2FtIFVTMTIyLCBVUzIyNCAmIFVTNDI4IHJhdyBVU0IgUENNICovCisJU05EX0hXREVQX0lGQUNFX1BDWEhSLAkJLyoqPCBEaWdpZ3JhbSBQQ1hIUiAqLworCVNORF9IV0RFUF9JRkFDRV9TQl9SQywJCS8qKjwgU0IgRXh0aWd5L0F1ZGlneTJOWCByZW1vdGUgY29udHJvbCAqLworICAgICAgICAgICAgICAgIAorCVNORF9IV0RFUF9JRkFDRV9MQVNUID0gU05EX0hXREVQX0lGQUNFX1NCX1JDICAvKio8IGxhc3Qga25vd24gaHdkZXAgaW50ZXJmYWNlICovCit9IHNuZF9od2RlcF9pZmFjZV90OworCisvKiogb3BlbiBmb3IgcmVhZGluZyAqLworI2RlZmluZSBTTkRfSFdERVBfT1BFTl9SRUFECQkoT19SRE9OTFkpCisvKiogb3BlbiBmb3Igd3JpdGluZyAqLworI2RlZmluZSBTTkRfSFdERVBfT1BFTl9XUklURQkJKE9fV1JPTkxZKQorLyoqIG9wZW4gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KKyNkZWZpbmUgU05EX0hXREVQX09QRU5fRFVQTEVYCQkoT19SRFdSKQorLyoqIG9wZW4gbW9kZSBmbGFnOiBvcGVuIGluIG5vbmJsb2NrIG1vZGUgKi8KKyNkZWZpbmUgU05EX0hXREVQX09QRU5fTk9OQkxPQ0sJCShPX05PTkJMT0NLKQorCisvKiogSHdEZXAgaGFuZGxlIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX2h3ZGVwX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgSHdEZXAgKi8KKwlTTkRfSFdERVBfVFlQRV9IVywKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgSHdEZXAgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX0hXREVQX1RZUEVfU0hNLAorCS8qKiBJTkVUIGNsaWVudCBId0RlcCAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfSFdERVBfVFlQRV9JTkVUCit9IHNuZF9od2RlcF90eXBlX3Q7CisKKy8qKiBId0RlcCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaHdkZXAgc25kX2h3ZGVwX3Q7CisKK2ludCBzbmRfaHdkZXBfb3BlbihzbmRfaHdkZXBfdCAqKmh3ZGVwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX2h3ZGVwX2Nsb3NlKHNuZF9od2RlcF90ICpod2RlcCk7CitpbnQgc25kX2h3ZGVwX3BvbGxfZGVzY3JpcHRvcnMoc25kX2h3ZGVwX3QgKmh3ZGVwLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF9od2RlcF9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX2h3ZGVwX3QgKmh3ZGVwLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF9od2RlcF9ub25ibG9jayhzbmRfaHdkZXBfdCAqaHdkZXAsIGludCBub25ibG9jayk7CitpbnQgc25kX2h3ZGVwX2luZm8oc25kX2h3ZGVwX3QgKmh3ZGVwLCBzbmRfaHdkZXBfaW5mb190ICogaW5mbyk7CitpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXMoc25kX2h3ZGVwX3QgKmh3ZGVwLCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpzdGF0dXMpOworaW50IHNuZF9od2RlcF9kc3BfbG9hZChzbmRfaHdkZXBfdCAqaHdkZXAsIHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqYmxvY2spOworaW50IHNuZF9od2RlcF9pb2N0bChzbmRfaHdkZXBfdCAqaHdkZXAsIHVuc2lnbmVkIGludCByZXF1ZXN0LCB2b2lkICogYXJnKTsKK3NzaXplX3Qgc25kX2h3ZGVwX3dyaXRlKHNuZF9od2RlcF90ICpod2RlcCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Citzc2l6ZV90IHNuZF9od2RlcF9yZWFkKHNuZF9od2RlcF90ICpod2RlcCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKK3NpemVfdCBzbmRfaHdkZXBfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF9od2RlcF9pbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9od2RlcF9pbmZvX2FsbG9jYShwdHIpIGRvIHsgYXNzZXJ0KHB0cik7ICpwdHIgPSAoc25kX2h3ZGVwX2luZm9fdCAqKSBhbGxvY2Eoc25kX2h3ZGVwX2luZm9fc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX2h3ZGVwX2luZm9fc2l6ZW9mKCkpOyB9IHdoaWxlICgwKQoraW50IHNuZF9od2RlcF9pbmZvX21hbGxvYyhzbmRfaHdkZXBfaW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX2h3ZGVwX2luZm9fZnJlZShzbmRfaHdkZXBfaW5mb190ICpvYmopOwordm9pZCBzbmRfaHdkZXBfaW5mb19jb3B5KHNuZF9od2RlcF9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX2h3ZGVwX2luZm9fdCAqc3JjKTsKKwordW5zaWduZWQgaW50IHNuZF9od2RlcF9pbmZvX2dldF9kZXZpY2UoY29uc3Qgc25kX2h3ZGVwX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfaHdkZXBfaW5mb19nZXRfY2FyZChjb25zdCBzbmRfaHdkZXBfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX2h3ZGVwX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9od2RlcF9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfaHdkZXBfaW5mb19nZXRfbmFtZShjb25zdCBzbmRfaHdkZXBfaW5mb190ICpvYmopOworc25kX2h3ZGVwX2lmYWNlX3Qgc25kX2h3ZGVwX2luZm9fZ2V0X2lmYWNlKGNvbnN0IHNuZF9od2RlcF9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9od2RlcF9pbmZvX3NldF9kZXZpY2Uoc25kX2h3ZGVwX2luZm9fdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworc2l6ZV90IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX2h3ZGVwX2RzcF9zdGF0dXNfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfaHdkZXBfZHNwX3N0YXR1c190ICopIGFsbG9jYShzbmRfaHdkZXBfZHNwX3N0YXR1c19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfaHdkZXBfZHNwX3N0YXR1c19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfbWFsbG9jKHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfaHdkZXBfZHNwX3N0YXR1c19mcmVlKHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKm9iaik7Cit2b2lkIHNuZF9od2RlcF9kc3Bfc3RhdHVzX2NvcHkoc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpzcmMpOworCit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X3ZlcnNpb24oY29uc3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9od2RlcF9kc3Bfc3RhdHVzX2dldF9pZChjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9od2RlcF9kc3Bfc3RhdHVzX2dldF9udW1fZHNwcyhjb25zdCBzbmRfaHdkZXBfZHNwX3N0YXR1c190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9od2RlcF9kc3Bfc3RhdHVzX2dldF9kc3BfbG9hZGVkKGNvbnN0IHNuZF9od2RlcF9kc3Bfc3RhdHVzX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX2h3ZGVwX2RzcF9zdGF0dXNfZ2V0X2NoaXBfcmVhZHkoY29uc3Qgc25kX2h3ZGVwX2RzcF9zdGF0dXNfdCAqb2JqKTsKKworc2l6ZV90IHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfaHdkZXBfZHNwX2ltYWdlX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9od2RlcF9kc3BfaW1hZ2VfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKikgYWxsb2NhKHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX2h3ZGVwX2RzcF9pbWFnZV9zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX2h3ZGVwX2RzcF9pbWFnZV9tYWxsb2Moc25kX2h3ZGVwX2RzcF9pbWFnZV90ICoqcHRyKTsKK3ZvaWQgc25kX2h3ZGVwX2RzcF9pbWFnZV9mcmVlKHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqKTsKK3ZvaWQgc25kX2h3ZGVwX2RzcF9pbWFnZV9jb3B5KHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqZHN0LCBjb25zdCBzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKnNyYyk7CisKK3Vuc2lnbmVkIGludCBzbmRfaHdkZXBfZHNwX2ltYWdlX2dldF9pbmRleChjb25zdCBzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfaHdkZXBfZHNwX2ltYWdlX2dldF9uYW1lKGNvbnN0IHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqKTsKK2NvbnN0IHZvaWQgKnNuZF9od2RlcF9kc3BfaW1hZ2VfZ2V0X2ltYWdlKGNvbnN0IHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqKTsKK3NpemVfdCBzbmRfaHdkZXBfZHNwX2ltYWdlX2dldF9sZW5ndGgoY29uc3Qgc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmopOworCit2b2lkIHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2V0X2luZGV4KHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqLCB1bnNpZ25lZCBpbnQgX2luZGV4KTsKK3ZvaWQgc25kX2h3ZGVwX2RzcF9pbWFnZV9zZXRfbmFtZShzbmRfaHdkZXBfZHNwX2ltYWdlX3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHNuZF9od2RlcF9kc3BfaW1hZ2Vfc2V0X2ltYWdlKHNuZF9od2RlcF9kc3BfaW1hZ2VfdCAqb2JqLCB2b2lkICpidWZmZXIpOwordm9pZCBzbmRfaHdkZXBfZHNwX2ltYWdlX3NldF9sZW5ndGgoc25kX2h3ZGVwX2RzcF9pbWFnZV90ICpvYmosIHNpemVfdCBsZW5ndGgpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9IV0RFUF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9pYXRvbWljLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaWF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjEyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaWF0b21pYy5oCkBAIC0wLDAgKzEsMTEwNiBAQAorI2lmbmRlZiBfX0FMU0FfSUFUT01JQ19ICisjZGVmaW5lIF9fQUxTQV9JQVRPTUlDX0gKKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworLyoKKyAqIEF0b21pYyBvcGVyYXRpb25zIHRoYXQgQyBjYW4ndCBndWFyYW50ZWUgdXMuICBVc2VmdWwgZm9yCisgKiByZXNvdXJjZSBjb3VudGluZyBldGMuLgorICovCisKKyNkZWZpbmUgQVRPTUlDX1NNUF9MT0NLICJsb2NrIDsgIgorCisvKgorICogTWFrZSBzdXJlIGdjYyBkb2Vzbid0IHRyeSB0byBiZSBjbGV2ZXIgYW5kIG1vdmUgdGhpbmdzIGFyb3VuZAorICogb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcyB0aGUgdXNlciBnYXZlIHVzLAorICogbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKy8qKgorICogYXRvbWljX3JlYWQgLSByZWFkIGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IHJlYWRzIHRoZSB2YWx1ZSBvZiBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLyAKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCisKKy8qKgorICogYXRvbWljX3NldCAtIHNldCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiByZXF1aXJlZCB2YWx1ZQorICogCisgKiBBdG9taWNhbGx5IHNldHMgdGhlIHZhbHVlIG9mIEB2IHRvIEBpLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKworLyoqCisgKiBhdG9taWNfYWRkIC0gYWRkIGludGVnZXIgdG8gYXRvbWljIHZhcmlhYmxlCisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2LiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkIHVzZWZ1bCByYW5nZQorICogb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICp2KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgImFkZGwgJTEsJTAiCisJCToiPW0iICh2LT5jb3VudGVyKQorCQk6ImlyIiAoaSksICJtIiAodi0+Y291bnRlcikpOworfQorCisvKioKKyAqIGF0b21pY19zdWIgLSBzdWJ0cmFjdCB0aGUgYXRvbWljIHZhcmlhYmxlCisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEB2LiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICp2KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgInN1YmwgJTEsJTAiCisJCToiPW0iICh2LT5jb3VudGVyKQorCQk6ImlyIiAoaSksICJtIiAodi0+Y291bnRlcikpOworfQorCisvKioKKyAqIGF0b21pY19zdWJfYW5kX3Rlc3QgLSBzdWJ0cmFjdCB2YWx1ZSBmcm9tIHZhcmlhYmxlIGFuZCB0ZXN0IHJlc3VsdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdiBhbmQgcmV0dXJucworICogdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX3N1Yl9hbmRfdGVzdChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAic3VibCAlMiwlMDsgc2V0ZSAlMSIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpLCAiPXFtIiAoYykKKwkJOiJpciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOworCXJldHVybiBjOworfQorCisvKioKKyAqIGF0b21pY19pbmMgLSBpbmNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfaW5jKGF0b21pY190ICp2KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgImluY2wgJTAiCisJCToiPW0iICh2LT5jb3VudGVyKQorCQk6Im0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qKgorICogYXRvbWljX2RlYyAtIGRlY3JlbWVudCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIAorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19kZWMoYXRvbWljX3QgKnYpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCUFUT01JQ19TTVBfTE9DSyAiZGVjbCAlMCIKKwkJOiI9bSIgKHYtPmNvdW50ZXIpCisJCToibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoqCisgKiBhdG9taWNfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IGFuZCB0ZXN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxIGFuZAorICogcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgMCwgb3IgZmFsc2UgZm9yIGFsbCBvdGhlcgorICogY2FzZXMuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2RlY19hbmRfdGVzdChhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJkZWNsICUwOyBzZXRlICUxIgorCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQorCQk6Im0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gYyAhPSAwOworfQorCisvKioKKyAqIGF0b21pY19pbmNfYW5kX3Rlc3QgLSBpbmNyZW1lbnQgYW5kIHRlc3QgCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxCisgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8gCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2luY19hbmRfdGVzdChhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJQVRPTUlDX1NNUF9MT0NLICJpbmNsICUwOyBzZXRlICUxIgorCQk6Ij1tIiAodi0+Y291bnRlciksICI9cW0iIChjKQorCQk6Im0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gYyAhPSAwOworfQorCisvKioKKyAqIGF0b21pY19hZGRfbmVnYXRpdmUgLSBhZGQgYW5kIHRlc3QgaWYgbmVnYXRpdmUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYgYW5kIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3IgZmFsc2Ugd2hlbgorICogcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovIAorc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19hZGRfbmVnYXRpdmUoaW50IGksIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGNoYXIgYzsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQlBVE9NSUNfU01QX0xPQ0sgImFkZGwgJTIsJTA7IHNldHMgJTEiCisJCToiPW0iICh2LT5jb3VudGVyKSwgIj1xbSIgKGMpCisJCToiaXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gYzsKK30KKworLyogVGhlc2UgYXJlIHg4Ni1zcGVjaWZpYywgdXNlZCBieSBzb21lIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBhdG9taWNfY2xlYXJfbWFzayhtYXNrLCBhZGRyKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyhBVE9NSUNfU01QX0xPQ0sgImFuZGwgJTAsJTEiIFwKKzogOiAiciIgKH4obWFzaykpLCJtIiAoKmFkZHIpIDogIm1lbW9yeSIpCisKKyNkZWZpbmUgYXRvbWljX3NldF9tYXNrKG1hc2ssIGFkZHIpIFwKK19fYXNtX18gX192b2xhdGlsZV9fKEFUT01JQ19TTVBfTE9DSyAib3JsICUwLCUxIiBcCis6IDogInIiIChtYXNrKSwibSIgKCphZGRyKSA6ICJtZW1vcnkiKQorCisvKgorICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KKyAqIEFuZCB5ZXMsIHRoaXMgaXMgcmVxdWlyZWQgb24gVVAgdG9vIHdoZW4gd2UncmUgdGFsa2luZworICogdG8gZGV2aWNlcy4KKyAqCisgKiBGb3Igbm93LCAid21iKCkiIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIGFzIGFsbAorICogSW50ZWwgQ1BVJ3MgZm9sbG93IHdoYXQgSW50ZWwgY2FsbHMgYSAqUHJvY2Vzc29yIE9yZGVyKiwKKyAqIGluIHdoaWNoIGFsbCB3cml0ZXMgYXJlIHNlZW4gaW4gdGhlIHByb2dyYW0gb3JkZXIgZXZlbgorICogb3V0c2lkZSB0aGUgQ1BVLgorICoKKyAqIEkgZXhwZWN0IGZ1dHVyZSBJbnRlbCBDUFUncyB0byBoYXZlIGEgd2Vha2VyIG9yZGVyaW5nLAorICogYnV0IEknZCBhbHNvIGV4cGVjdCB0aGVtIHRvIGZpbmFsbHkgZ2V0IHRoZWlyIGFjdCB0b2dldGhlcgorICogYW5kIGFkZCBzb21lIHJlYWwgbWVtb3J5IGJhcnJpZXJzIGlmIHNvLgorICovCisgCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgbWIoKSAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsb2NrOyBhZGRsICQwLDAoJSVlc3ApIjogOiA6Im1lbW9yeSIpCisjZGVmaW5lIHJtYigpCW1iKCkKKyNkZWZpbmUgd21iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiOiA6IDoibWVtb3J5IikKKyNlbHNlCisjZGVmaW5lIG1iKCkgCWFzbSB2b2xhdGlsZSgibWZlbmNlIjo6OiJtZW1vcnkiKQorI2RlZmluZSBybWIoKQlhc20gdm9sYXRpbGUoImxmZW5jZSI6OjoibWVtb3J5IikKKyNkZWZpbmUgd21iKCkJYXNtIHZvbGF0aWxlKCJzZmVuY2UiOjo6Im1lbW9yeSIpCisjZW5kaWYKKworI3VuZGVmIEFUT01JQ19TTVBfTE9DSworCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19pMzg2X18gKi8KKworI2lmZGVmIF9faWE2NF9fCisKKy8qCisgKiBPbiBJQS02NCwgY291bnRlciBtdXN0IGFsd2F5cyBiZSB2b2xhdGlsZSB0byBlbnN1cmUgdGhhdCB0aGF0IHRoZQorICogbWVtb3J5IGFjY2Vzc2VzIGFyZSBvcmRlcmVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCQkoKGF0b21pY190KSB7IChpKSB9KQorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKworLyogc3RyaXBwZWQgdmVyc2lvbiAtIHdlIG5lZWQgb25seSA0Ynl0ZSB2ZXJzaW9uICovCisjZGVmaW5lIGlhNjRfY21weGNoZyhzZW0scHRyLG9sZCxuZXcsc2l6ZSkgXAorKHsgXAorCV9fdHlwZW9mX18ocHRyKSBfcF8gPSAocHRyKTsgXAorCV9fdHlwZW9mX18obmV3KSBfbl8gPSAobmV3KTsgXAorCXVuc2lnbmVkIGxvbmcgX29fLCBfcl87IFwKKwlfb18gPSAodW5zaWduZWQgaW50KSAobG9uZykgKG9sZCk7IFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdiBhci5jY3Y9JTA7OyIgOjogInJPIihfb18pKTsgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgiY21weGNoZzQuInNlbSIgJTA9WyUxXSwlMixhci5jY3YiIFwKKwkJCSAgICAgIDogIj1yIihfcl8pIDogInIiKF9wXyksICJyIihfbl8pIDogIm1lbW9yeSIpOyBcCisJKF9fdHlwZW9mX18ob2xkKSkgX3JfOyBcCit9KQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2lhNjRfYXRvbWljX2FkZCAoaW50IGksIGF0b21pY190ICp2KQoreworCWludCBvbGQsIG5ldzsKKwkvLyBDTVBYQ0hHX0JVR0NIRUNLX0RFQ0wKKworCWRvIHsKKwkJLy8gQ01QWENIR19CVUdDSEVDSyh2KTsKKwkJb2xkID0gYXRvbWljX3JlYWQodik7CisJCW5ldyA9IG9sZCArIGk7CisJfSB3aGlsZSAoaWE2NF9jbXB4Y2hnKCJhY3EiLCB2LCBvbGQsIG9sZCArIGksIHNpemVvZihhdG9taWNfdCkpICE9IG9sZCk7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50CitpYTY0X2F0b21pY19zdWIgKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgb2xkLCBuZXc7CisJLy8gQ01QWENIR19CVUdDSEVDS19ERUNMCisKKwlkbyB7CisJCS8vIENNUFhDSEdfQlVHQ0hFQ0sodik7CisJCW9sZCA9IGF0b21pY19yZWFkKHYpOworCQluZXcgPSBvbGQgLSBpOworCX0gd2hpbGUgKGlhNjRfY21weGNoZygiYWNxIiwgdiwgb2xkLCBuZXcsIHNpemVvZihhdG9taWNfdCkpICE9IG9sZCk7CisJcmV0dXJuIG5ldzsKK30KKworI2RlZmluZSBJQTY0X0ZFVENIQUREKHRtcCx2LG4sc3opCQkJCQkJXAorKHsJCQkJCQkJCQkJXAorCXN3aXRjaCAoc3opIHsJCQkJCQkJCVwKKwkgICAgICBjYXNlIDQ6CQkJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZmV0Y2hhZGQ0LnJlbCAlMD1bJTFdLCUyIgkJXAorCQkJCSAgICAgIDogIj1yIih0bXApIDogInIiKHYpLCAiaSIobikgOiAibWVtb3J5Iik7CVwKKwkJYnJlYWs7CQkJCQkJCQlcCisJCQkJCQkJCQkJXAorCSAgICAgIGNhc2UgODoJCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJmZXRjaGFkZDgucmVsICUwPVslMV0sJTIiCQlcCisJCQkJICAgICAgOiAiPXIiKHRtcCkgOiAiciIodiksICJpIihuKSA6ICJtZW1vcnkiKTsJXAorCQlicmVhazsJCQkJCQkJCVwKKwl9CQkJCQkJCQkJXAorfSkKKworI2RlZmluZSBpYTY0X2ZldGNoX2FuZF9hZGQoaSx2KQkJCQkJCQlcCisoewkJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQkJCQkJXAorCXZvbGF0aWxlIF9fdHlwZW9mX18oKih2KSkgKl92ID0gKHYpOwkJCQkJXAorCXN3aXRjaCAoaSkgewkJCQkJCQkJXAorCSAgICAgIGNhc2UgLTE2OglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAtMTYsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgLTg6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAtOCwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAtNDoJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgIC00LCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgIC0xOglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgLTEsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgIDE6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAgMSwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwkgICAgICBjYXNlICAgNDoJSUE2NF9GRVRDSEFERChfdG1wLCBfdiwgICA0LCBzaXplb2YoKih2KSkpOyBicmVhazsJXAorCSAgICAgIGNhc2UgICA4OglJQTY0X0ZFVENIQUREKF90bXAsIF92LCAgIDgsIHNpemVvZigqKHYpKSk7IGJyZWFrOwlcCisJICAgICAgY2FzZSAgMTY6CUlBNjRfRkVUQ0hBREQoX3RtcCwgX3YsICAxNiwgc2l6ZW9mKCoodikpKTsgYnJlYWs7CVwKKwl9CQkJCQkJCQkJXAorCShfX3R5cGVvZl9fKCp2KSkgKF90bXAgKyAoaSkpOwkvKiByZXR1cm4gbmV3IHZhbHVlICovCQkJXAorfSkKKworLyoKKyAqIEF0b21pY2FsbHkgYWRkIEkgdG8gViBhbmQgcmV0dXJuIFRSVUUgaWYgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcworICogbmVnYXRpdmUuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludAorYXRvbWljX2FkZF9uZWdhdGl2ZSAoaW50IGksIGF0b21pY190ICp2KQoreworCXJldHVybiBpYTY0X2F0b21pY19hZGQoaSwgdikgPCAwOworfQorCisjZGVmaW5lIGF0b21pY19hZGRfcmV0dXJuKGksdikJCQkJCQlcCisJKChfX2J1aWx0aW5fY29uc3RhbnRfcChpKSAmJgkJCQkJXAorCSAgKCAgIChpID09ICAxKSB8fCAoaSA9PSAgNCkgfHwgKGkgPT0gIDgpIHx8IChpID09ICAxNikJCVwKKwkgICB8fCAoaSA9PSAtMSkgfHwgKGkgPT0gLTQpIHx8IChpID09IC04KSB8fCAoaSA9PSAtMTYpKSkJXAorCSA/IGlhNjRfZmV0Y2hfYW5kX2FkZChpLCAmKHYpLT5jb3VudGVyKQkJCQlcCisJIDogaWE2NF9hdG9taWNfYWRkKGksIHYpKQorCisjZGVmaW5lIGF0b21pY19zdWJfcmV0dXJuKGksdikJCQkJCQlcCisJKChfX2J1aWx0aW5fY29uc3RhbnRfcChpKSAmJgkJCQkJXAorCSAgKCAgIChpID09ICAxKSB8fCAoaSA9PSAgNCkgfHwgKGkgPT0gIDgpIHx8IChpID09ICAxNikJCVwKKwkgICB8fCAoaSA9PSAtMSkgfHwgKGkgPT0gLTQpIHx8IChpID09IC04KSB8fCAoaSA9PSAtMTYpKSkJXAorCSA/IGlhNjRfZmV0Y2hfYW5kX2FkZCgtKGkpLCAmKHYpLT5jb3VudGVyKQkJCVwKKwkgOiBpYTY0X2F0b21pY19zdWIoaSwgdikpCisKKyNkZWZpbmUgYXRvbWljX2RlY19yZXR1cm4odikJCWF0b21pY19zdWJfcmV0dXJuKDEsICh2KSkKKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikJCWF0b21pY19hZGRfcmV0dXJuKDEsICh2KSkKKworI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGksdikJKGF0b21pY19zdWJfcmV0dXJuKChpKSwgKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpCQkoYXRvbWljX3N1Yl9yZXR1cm4oMSwgKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWNfaW5jX2FuZF90ZXN0KHYpCQkoYXRvbWljX2FkZF9yZXR1cm4oMSwgKHYpKSAhPSAwKQorCisjZGVmaW5lIGF0b21pY19hZGQoaSx2KQkJCWF0b21pY19hZGRfcmV0dXJuKChpKSwgKHYpKQorI2RlZmluZSBhdG9taWNfc3ViKGksdikJCQlhdG9taWNfc3ViX3JldHVybigoaSksICh2KSkKKyNkZWZpbmUgYXRvbWljX2luYyh2KQkJCWF0b21pY19hZGQoMSwgKHYpKQorI2RlZmluZSBhdG9taWNfZGVjKHYpCQkJYXRvbWljX3N1YigxLCAodikpCisKKy8qCisgKiBNYWNyb3MgdG8gZm9yY2UgbWVtb3J5IG9yZGVyaW5nLiAgSW4gdGhlc2UgZGVzY3JpcHRpb25zLCAicHJldmlvdXMiCisgKiBhbmQgInN1YnNlcXVlbnQiIHJlZmVyIHRvIHByb2dyYW0gb3JkZXI7ICJ2aXNpYmxlIiBtZWFucyB0aGF0IGFsbAorICogYXJjaGl0ZWN0dXJhbGx5IHZpc2libGUgZWZmZWN0cyBvZiBhIG1lbW9yeSBhY2Nlc3MgaGF2ZSBvY2N1cnJlZAorICogKGF0IGEgbWluaW11bSwgdGhpcyBtZWFucyB0aGUgbWVtb3J5IGhhcyBiZWVuIHJlYWQgb3Igd3JpdHRlbikuCisgKgorICogICB3bWIoKToJR3VhcmFudGVlcyB0aGF0IGFsbCBwcmVjZWRpbmcgc3RvcmVzIHRvIG1lbW9yeS0KKyAqCQlsaWtlIHJlZ2lvbnMgYXJlIHZpc2libGUgYmVmb3JlIGFueSBzdWJzZXF1ZW50CisgKgkJc3RvcmVzIGFuZCB0aGF0IGFsbCBmb2xsb3dpbmcgc3RvcmVzIHdpbGwgYmUKKyAqCQl2aXNpYmxlIG9ubHkgYWZ0ZXIgYWxsIHByZXZpb3VzIHN0b3Jlcy4KKyAqICAgcm1iKCk6CUxpa2Ugd21iKCksIGJ1dCBmb3IgcmVhZHMuCisgKiAgIG1iKCk6CXdtYigpL3JtYigpIGNvbWJvLCBpLmUuLCBhbGwgcHJldmlvdXMgbWVtb3J5CisgKgkJYWNjZXNzZXMgYXJlIHZpc2libGUgYmVmb3JlIGFsbCBzdWJzZXF1ZW50CisgKgkJYWNjZXNzZXMgYW5kIHZpY2UgdmVyc2EuICBUaGlzIGlzIGFsc28ga25vd24gYXMKKyAqCQlhICJmZW5jZS4iCisgKgorICogTm90ZTogIm1iKCkiIGFuZCBpdHMgdmFyaWFudHMgY2Fubm90IGJlIHVzZWQgYXMgYSBmZW5jZSB0byBvcmRlcgorICogYWNjZXNzZXMgdG8gbWVtb3J5IG1hcHBlZCBJL08gcmVnaXN0ZXJzLiAgRm9yIHRoYXQsIG1mLmEgbmVlZHMgdG8KKyAqIGJlIHVzZWQuICBIb3dldmVyLCB3ZSBkb24ndCB3YW50IHRvIGFsd2F5cyB1c2UgbWYuYSBiZWNhdXNlIChhKQorICogaXQncyAocHJlc3VtYWJseSkgbXVjaCBzbG93ZXIgdGhhbiBtZiBhbmQgKGIpIG1mLmEgaXMgc3VwcG9ydGVkIGZvcgorICogc2VxdWVudGlhbCBtZW1vcnkgcGFnZXMgb25seS4KKyAqLworI2RlZmluZSBtYigpCV9fYXNtX18gX192b2xhdGlsZV9fICgibWYiIDo6OiAibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkJbWIoKQorI2RlZmluZSB3bWIoKQltYigpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBfX2lhNjRfXyAqLworCisjaWZkZWYgX19hbHBoYV9fCisKKy8qCisgKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLiAgVXNlZnVsIGZvcgorICogcmVzb3VyY2UgY291bnRpbmcgZXRjLi4uCisgKgorICogQnV0IHVzZSB0aGVzZSBhcyBzZWxkb20gYXMgcG9zc2libGUgc2luY2UgdGhleSBhcmUgbXVjaCBzbG93ZXIKKyAqIHRoYW4gcmVndWxhciBvcGVyYXRpb25zLgorICovCisKKworLyoKKyAqIENvdW50ZXIgaXMgdm9sYXRpbGUgdG8gbWFrZSBzdXJlIGdjYyBkb2Vzbid0IHRyeSB0byBiZSBjbGV2ZXIKKyAqIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQgb24gdXMuIFdlIG5lZWQgdG8gdXNlIF9leGFjdGx5XyB0aGUgYWRkcmVzcworICogdGhlIHVzZXIgZ2F2ZSB1cywgbm90IHNvbWUgYWxpYXMgdGhhdCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQkoIChhdG9taWNfdCkgeyAoaSkgfSApCisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkJKCh2KS0+Y291bnRlciA9IChpKSkKKworLyoKKyAqIFRvIGdldCBwcm9wZXIgYnJhbmNoIHByZWRpY3Rpb24gZm9yIHRoZSBtYWluIGxpbmUsIHdlIG11c3QgYnJhbmNoCisgKiBmb3J3YXJkIHRvIGNvZGUgYXQgdGhlIGVuZCBvZiB0aGlzIG9iamVjdCdzIC50ZXh0IHNlY3Rpb24sIHRoZW4KKyAqIGJyYW5jaCBiYWNrIHRvIHJlc3RhcnQgdGhlIG9wZXJhdGlvbi4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICogdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxkbF9sICUwLCUxXG4iCisJIglhZGRsICUwLCUyLCUwXG4iCisJIglzdGxfYyAlMCwlMVxuIgorCSIJYmVxICUwLDJmXG4iCisJIi5zdWJzZWN0aW9uIDJcbiIKKwkiMjoJYnIgMWJcbiIKKwkiLnByZXZpb3VzIgorCToiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCisJOiJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsZGxfbCAlMCwlMVxuIgorCSIJc3VibCAlMCwlMiwlMFxuIgorCSIJc3RsX2MgJTAsJTFcbiIKKwkiCWJlcSAlMCwyZlxuIgorCSIuc3Vic2VjdGlvbiAyXG4iCisJIjI6CWJyIDFiXG4iCisJIi5wcmV2aW91cyIKKwk6Ij0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQorCToiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSk7Cit9CisKKy8qCisgKiBTYW1lIGFzIGFib3ZlLCBidXQgcmV0dXJuIHRoZSByZXN1bHQgdmFsdWUKKyAqLworc3RhdGljIF9faW5saW5lX18gbG9uZyBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworCWxvbmcgdGVtcCwgcmVzdWx0OworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsZGxfbCAlMCwlMVxuIgorCSIJYWRkbCAlMCwlMywlMlxuIgorCSIJYWRkbCAlMCwlMywlMFxuIgorCSIJc3RsX2MgJTAsJTFcbiIKKwkiCWJlcSAlMCwyZlxuIgorCSIJbWJcbiIKKwkiLnN1YnNlY3Rpb24gMlxuIgorCSIyOgliciAxYlxuIgorCSIucHJldmlvdXMiCisJOiI9JnIiICh0ZW1wKSwgIj1tIiAodi0+Y291bnRlciksICI9JnIiIChyZXN1bHQpCisJOiJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpIDogIm1lbW9yeSIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGxvbmcgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKwlsb25nIHRlbXAsIHJlc3VsdDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGRsX2wgJTAsJTFcbiIKKwkiCXN1YmwgJTAsJTMsJTJcbiIKKwkiCXN1YmwgJTAsJTMsJTBcbiIKKwkiCXN0bF9jICUwLCUxXG4iCisJIgliZXEgJTAsMmZcbiIKKwkiCW1iXG4iCisJIi5zdWJzZWN0aW9uIDJcbiIKKwkiMjoJYnIgMWJcbiIKKwkiLnByZXZpb3VzIgorCToiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpLCAiPSZyIiAocmVzdWx0KQorCToiSXIiIChpKSwgIm0iICh2LT5jb3VudGVyKSA6ICJtZW1vcnkiKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKKworI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGksdikgKGF0b21pY19zdWJfcmV0dXJuKChpKSwgKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpIChhdG9taWNfc3ViX3JldHVybigxLCAodikpID09IDApCisKKyNkZWZpbmUgYXRvbWljX2luYyh2KSBhdG9taWNfYWRkKDEsKHYpKQorI2RlZmluZSBhdG9taWNfZGVjKHYpIGF0b21pY19zdWIoMSwodikpCisKKyNkZWZpbmUgbWIoKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXygibWIiOiA6IDoibWVtb3J5IikKKworI2RlZmluZSBybWIoKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXygibWIiOiA6IDoibWVtb3J5IikKKworI2RlZmluZSB3bWIoKSBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXygid21iIjogOiA6Im1lbW9yeSIpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBfX2FscGhhX18gKi8KKworI2lmZGVmIF9fcG93ZXJwY19fCisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKworZXh0ZXJuIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICphZGRyKTsKK2V4dGVybiB2b2lkIGF0b21pY19zZXRfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHVuc2lnbmVkIGxvbmcgKmFkZHIpOworCisjZGVmaW5lIFNNUF9JU1lOQwkiXG5cdGlzeW5jIgorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19hZGQoaW50IGEsIGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMwkJIyBhdG9taWNfYWRkXG5cCisJYWRkCSUwLCUyLCUwXG5cCisJc3R3Y3guCSUwLDAsJTNcblwKKwlibmUtCTFiIgorCTogIj0mciIgKHQpLCAiPW0iICh2LT5jb3VudGVyKQorCTogInIiIChhKSwgInIiICgmdi0+Y291bnRlciksICJtIiAodi0+Y291bnRlcikKKwk6ICJjYyIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGEsIGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMgkJIyBhdG9taWNfYWRkX3JldHVyblxuXAorCWFkZAklMCwlMSwlMFxuXAorCXN0d2N4LgklMCwwLCUyXG5cCisJYm5lLQkxYiIKKwlTTVBfSVNZTkMKKwk6ICI9JnIiICh0KQorCTogInIiIChhKSwgInIiICgmdi0+Y291bnRlcikKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiB0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19zdWIoaW50IGEsIGF0b21pY190ICp2KQoreworCWludCB0OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisiMToJbHdhcngJJTAsMCwlMwkJIyBhdG9taWNfc3ViXG5cCisJc3ViZgklMCwlMiwlMFxuXAorCXN0d2N4LgklMCwwLCUzXG5cCisJYm5lLQkxYiIKKwk6ICI9JnIiICh0KSwgIj1tIiAodi0+Y291bnRlcikKKwk6ICJyIiAoYSksICJyIiAoJnYtPmNvdW50ZXIpLCAibSIgKHYtPmNvdW50ZXIpCisJOiAiY2MiKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBhLCBhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTIJCSMgYXRvbWljX3N1Yl9yZXR1cm5cblwKKwlzdWJmCSUwLCUxLCUwXG5cCisJc3R3Y3guCSUwLDAsJTJcblwKKwlibmUtCTFiIgorCVNNUF9JU1lOQworCTogIj0mciIgKHQpCisJOiAiciIgKGEpLCAiciIgKCZ2LT5jb3VudGVyKQorCTogImNjIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2luYyhhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTIJCSMgYXRvbWljX2luY1xuXAorCWFkZGljCSUwLCUwLDFcblwKKwlzdHdjeC4JJTAsMCwlMlxuXAorCWJuZS0JMWIiCisJOiAiPSZyIiAodCksICI9bSIgKHYtPmNvdW50ZXIpCisJOiAiciIgKCZ2LT5jb3VudGVyKSwgIm0iICh2LT5jb3VudGVyKQorCTogImNjIik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfaW5jX3JldHVybihhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTEJCSMgYXRvbWljX2luY19yZXR1cm5cblwKKwlhZGRpYwklMCwlMCwxXG5cCisJc3R3Y3guCSUwLDAsJTFcblwKKwlibmUtCTFiIgorCVNNUF9JU1lOQworCTogIj0mciIgKHQpCisJOiAiciIgKCZ2LT5jb3VudGVyKQorCTogImNjIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2RlYyhhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTIJCSMgYXRvbWljX2RlY1xuXAorCWFkZGljCSUwLCUwLC0xXG5cCisJc3R3Y3guCSUwLDAsJTJcblwKKwlibmUtCTFiIgorCTogIj0mciIgKHQpLCAiPW0iICh2LT5jb3VudGVyKQorCTogInIiICgmdi0+Y291bnRlciksICJtIiAodi0+Y291bnRlcikKKwk6ICJjYyIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2RlY19yZXR1cm4oYXRvbWljX3QgKnYpCit7CisJaW50IHQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKyIxOglsd2FyeAklMCwwLCUxCQkjIGF0b21pY19kZWNfcmV0dXJuXG5cCisJYWRkaWMJJTAsJTAsLTFcblwKKwlzdHdjeC4JJTAsMCwlMVxuXAorCWJuZS0JMWIiCisJU01QX0lTWU5DCisJOiAiPSZyIiAodCkKKwk6ICJyIiAoJnYtPmNvdW50ZXIpCisJOiAiY2MiLCAibWVtb3J5Iik7CisKKwlyZXR1cm4gdDsKK30KKworI2RlZmluZSBhdG9taWNfc3ViX2FuZF90ZXN0KGEsIHYpCShhdG9taWNfc3ViX3JldHVybigoYSksICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KQkJKGF0b21pY19kZWNfcmV0dXJuKCh2KSkgPT0gMCkKKworLyoKKyAqIEF0b21pY2FsbHkgdGVzdCAqdiBhbmQgZGVjcmVtZW50IGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiAwLgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiAqdiBtaW51cyAxLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgYXRvbWljX2RlY19pZl9wb3NpdGl2ZShhdG9taWNfdCAqdikKK3sKKwlpbnQgdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorIjE6CWx3YXJ4CSUwLDAsJTEJCSMgYXRvbWljX2RlY19pZl9wb3NpdGl2ZVxuXAorCWFkZGljLgklMCwlMCwtMVxuXAorCWJsdC0JMmZcblwKKwlzdHdjeC4JJTAsMCwlMVxuXAorCWJuZS0JMWIiCisJU01QX0lTWU5DCisJIlxuXAorMjoiCTogIj0mciIgKHQpCisJOiAiciIgKCZ2LT5jb3VudGVyKQorCTogImNjIiwgIm1lbW9yeSIpOworCisJcmV0dXJuIHQ7Cit9CisKKy8qCisgKiBNZW1vcnkgYmFycmllci4KKyAqIFRoZSBzeW5jIGluc3RydWN0aW9uIGd1YXJhbnRlZXMgdGhhdCBhbGwgbWVtb3J5IGFjY2Vzc2VzIGluaXRpYXRlZAorICogYnkgdGhpcyBwcm9jZXNzb3IgaGF2ZSBiZWVuIHBlcmZvcm1lZCAod2l0aCByZXNwZWN0IHRvIGFsbCBvdGhlcgorICogbWVjaGFuaXNtcyB0aGF0IGFjY2VzcyBtZW1vcnkpLiAgVGhlIGVpZWlvIGluc3RydWN0aW9uIGlzIGEgYmFycmllcgorICogcHJvdmlkaW5nIGFuIG9yZGVyaW5nIChzZXBhcmF0ZWx5KSBmb3IgKGEpIGNhY2hlYWJsZSBzdG9yZXMgYW5kIChiKQorICogbG9hZHMgYW5kIHN0b3JlcyB0byBub24tY2FjaGVhYmxlIG1lbW9yeSAoZS5nLiBJL08gZGV2aWNlcykuCisgKgorICogbWIoKSBwcmV2ZW50cyBsb2FkcyBhbmQgc3RvcmVzIGJlaW5nIHJlb3JkZXJlZCBhY3Jvc3MgdGhpcyBwb2ludC4KKyAqIHJtYigpIHByZXZlbnRzIGxvYWRzIGJlaW5nIHJlb3JkZXJlZCBhY3Jvc3MgdGhpcyBwb2ludC4KKyAqIHdtYigpIHByZXZlbnRzIHN0b3JlcyBiZWluZyByZW9yZGVyZWQgYWNyb3NzIHRoaXMgcG9pbnQuCisgKgorICogV2UgY2FuIHVzZSB0aGUgZWllaW8gaW5zdHJ1Y3Rpb24gZm9yIHdtYiwgYnV0IHNpbmNlIGl0IGRvZXNuJ3QKKyAqIGdpdmUgYW55IG9yZGVyaW5nIGd1YXJhbnRlZXMgYWJvdXQgbG9hZHMsIHdlIGhhdmUgdG8gdXNlIHRoZQorICogc3Ryb25nZXIgYnV0IHNsb3dlciBzeW5jIGluc3RydWN0aW9uIGZvciBtYiBhbmQgcm1iLgorICovCisjZGVmaW5lIG1iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSB3bWIoKSAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBfX3Bvd2VycGNfXyAqLworCisjaWZkZWYgX19taXBzX18KKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKSAgICB7IChpKSB9CisKKy8qCisgKiBhdG9taWNfcmVhZCAtIHJlYWQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSByZWFkcyB0aGUgdmFsdWUgb2YgQHYuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX3JlYWQodikJKCh2KS0+Y291bnRlcikKKworLyoKKyAqIGF0b21pY19zZXQgLSBzZXQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAaTogcmVxdWlyZWQgdmFsdWUKKyAqCisgKiBBdG9taWNhbGx5IHNldHMgdGhlIHZhbHVlIG9mIEB2IHRvIEBpLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkoKHYpLT5jb3VudGVyID0gKGkpKQorCisvKgorICogZm9yIE1JUFMgSUkgYW5kIGJldHRlciB3ZSBjYW4gdXNlIGxsL3NjIGluc3RydWN0aW9uLCBhbmQga2VybmVsIDIuNC4zKworICogd2lsbCBlbXVsYXRlIGl0IG9uIE1JUFMgSS4KKyAqLworCisvKgorICogYXRvbWljX2FkZCAtIGFkZCBpbnRlZ2VyIHRvIGF0b21pYyB2YXJpYWJsZQorICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2LiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkIHVzZWZ1bCByYW5nZQorICogb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICogdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIi5zZXQgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgbWlwczIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIjE6ICAgbGwgICAgICAlMCwgJTEgICAgICAjIGF0b21pY19hZGRcbiIKKwkJIiAgICAgYWRkdSAgICAlMCwgJTIgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgc2MgICAgICAlMCwgJTEgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgYmVxeiAgICAlMCwgMWIgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJOiAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCisJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikpOworfQorCisvKgorICogYXRvbWljX3N1YiAtIHN1YnRyYWN0IHRoZSBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIuc2V0IHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IG1pcHMyICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIxOiAgIGxsICAgICAgJTAsICUxICAgICAgIyBhdG9taWNfc3ViXG4iCisJCSIgICAgIHN1YnUgICAgJTAsICUyICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIHNjICAgICAgJTAsICUxICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIGJlcXogICAgJTAsIDFiICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCTogIj0mciIgKHRlbXApLCAiPW0iICh2LT5jb3VudGVyKQorCQk6ICJJciIgKGkpLCAibSIgKHYtPmNvdW50ZXIpKTsKK30KKworLyoKKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCByZXR1cm4gdGhlIHJlc3VsdCB2YWx1ZQorICovCitleHRlcm4gX19pbmxpbmVfXyBpbnQgYXRvbWljX2FkZF9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXAsIHJlc3VsdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBwdXNoICAgICAgICAgICAgICAgIyBhdG9taWNfYWRkX3JldHVyblxuIgorCQkiLnNldCBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBtaXBzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiMTogICBsbCAgICAgICUxLCAlMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBhZGR1ICAgICUwLCAlMSwgJTMgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBzYyAgICAgICUwLCAlMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBiZXF6ICAgICUwLCAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBhZGR1ICAgICUwLCAlMSwgJTMgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiLnNldCBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCisJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKKwkJOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitleHRlcm4gX19pbmxpbmVfXyBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXAsIHJlc3VsdDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIi5zZXQgbWlwczIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IG5vcmVvcmRlciAgICAgICAgICAgIyBhdG9taWNfc3ViX3JldHVyblxuIgorCQkiMTogICBsbCAgICAlMSwgJTIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgc3VidSAgJTAsICUxLCAlMyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIgICAgIHNjICAgICUwLCAlMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQkiICAgICBiZXF6ICAlMCwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgc3VidSAgJTAsICUxLCAlMyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJCSIuc2V0IHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCQk6ICI9JnIiIChyZXN1bHQpLCAiPSZyIiAodGVtcCksICI9bSIgKHYtPmNvdW50ZXIpCisJCTogIklyIiAoaSksICJtIiAodi0+Y291bnRlcikKKwkJOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKKworLyoKKyAqIGF0b21pY19zdWJfYW5kX3Rlc3QgLSBzdWJ0cmFjdCB2YWx1ZSBmcm9tIHZhcmlhYmxlIGFuZCB0ZXN0IHJlc3VsdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEB2IGFuZCByZXR1cm5zCisgKiB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLHYpIChhdG9taWNfc3ViX3JldHVybigoaSksICh2KSkgPT0gMCkKKworLyoKKyAqIGF0b21pY19pbmNfYW5kX3Rlc3QgLSBpbmNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMQorICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikgKGF0b21pY19pbmNfcmV0dXJuKDEsICh2KSkgPT0gMCkKKworLyoKKyAqIGF0b21pY19kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgYnkgMSBhbmQgdGVzdAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxIGFuZAorICogcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgMCwgb3IgZmFsc2UgZm9yIGFsbCBvdGhlcgorICogY2FzZXMuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX2RlY19hbmRfdGVzdCh2KSAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgKHYpKSA9PSAwKQorCisvKgorICogYXRvbWljX2luYyAtIGluY3JlbWVudCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMS4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfaW5jKHYpIGF0b21pY19hZGQoMSwodikpCisKKy8qCisgKiBhdG9taWNfZGVjIC0gZGVjcmVtZW50IGFuZCB0ZXN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEuICBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQKKyAqIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KKyNkZWZpbmUgYXRvbWljX2RlYyh2KSBhdG9taWNfc3ViKDEsKHYpKQorCisvKgorICogYXRvbWljX2FkZF9uZWdhdGl2ZSAtIGFkZCBhbmQgdGVzdCBpZiBuZWdhdGl2ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKgorICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEB2IGFuZCByZXR1cm5zIHRydWUKKyAqIGlmIHRoZSByZXN1bHQgaXMgbmVnYXRpdmUsIG9yIGZhbHNlIHdoZW4KKyAqIHJlc3VsdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVyby4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqCisgKiBDdXJyZW50bHkgbm90IGltcGxlbWVudGVkIGZvciBNSVBTLgorICovCisKKyNkZWZpbmUgbWIoKQkJCQkJCVwKK19fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSIjIHByZXZlbnQgaW5zdHJ1Y3Rpb25zIGJlaW5nIG1vdmVkIGFyb3VuZFxuXHQiCVwKKwkiLnNldFx0bm9yZW9yZGVyXG5cdCIJCQkJXAorCSIjIDggbm9wcyB0byBmb29sIHRoZSBSNDQwMCBwaXBlbGluZVxuXHQiCVwKKwkibm9wO25vcDtub3A7bm9wO25vcDtub3A7bm9wO25vcFxuXHQiCQlcCisJIi5zZXRcdHJlb3JkZXIiCQkJCQlcCisJOiAvKiBubyBvdXRwdXQgKi8JCQkJXAorCTogLyogbm8gaW5wdXQgKi8JCQkJXAorCTogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpIG1iKCkKKyNkZWZpbmUgd21iKCkgbWIoKQorCisjZGVmaW5lIElBVE9NSUNfREVGSU5FRAkJMQorCisjZW5kaWYgLyogX19taXBzX18gKi8KKworI2lmZGVmIF9fYXJtX18KKworLyoKKyAqIEZJWE1FOiBiZWxsb3cgY29kZSBpcyB2YWxpZCBvbmx5IGZvciBTQTExeHgKKyAqLworCisvKgorICogU2F2ZSB0aGUgY3VycmVudCBpbnRlcnJ1cHQgZW5hYmxlIHN0YXRlICYgZGlzYWJsZSBJUlFzCisgKi8KKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmUoeCkJCQkJCVwKKwkoewkJCQkJCQlcCisJCXVuc2lnbmVkIGxvbmcgdGVtcDsJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJXAorCSJtcnMJJTAsIGNwc3IJCUAgbG9jYWxfaXJxX3NhdmVcbiIJXAorIglvcnIJJTEsICUwLCAjMTI4XG4iCQkJCQlcCisiCW1zcgljcHNyX2MsICUxIgkJCQkJXAorCTogIj1yIiAoeCksICI9ciIgKHRlbXApCQkJCQlcCisJOgkJCQkJCQlcCisJOiAibWVtb3J5Iik7CQkJCQkJXAorCX0pCisKKy8qCisgKiByZXN0b3JlIHNhdmVkIElSUSAmIEZJUSBzdGF0ZQorICovCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJIm1zcgljcHNyX2MsICUwCQlAIGxvY2FsX2lycV9yZXN0b3JlXG4iCVwKKwk6CQkJCQkJCVwKKwk6ICJyIiAoeCkJCQkJCQlcCisJOiAibWVtb3J5IikKKworI2RlZmluZSBfX3NhdmVfZmxhZ3NfY2xpKHgpIGxvY2FsX2lycV9zYXZlKHgpCisjZGVmaW5lIF9fcmVzdG9yZV9mbGFncyh4KSBsb2NhbF9pcnFfcmVzdG9yZSh4KQorCit0eXBlZGVmIHN0cnVjdCB7IHZvbGF0aWxlIGludCBjb3VudGVyOyB9IGF0b21pY190OworCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkoKHYpLT5jb3VudGVyKQorI2RlZmluZSBhdG9taWNfc2V0KHYsaSkJKCgodiktPmNvdW50ZXIpID0gKGkpKQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19hZGQoaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwl2LT5jb3VudGVyICs9IGk7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCB2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJdi0+Y291bnRlciAtPSBpOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2luYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJdi0+Y291bnRlciArPSAxOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJdi0+Y291bnRlciAtPSAxOworCV9fcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfZGVjX2FuZF90ZXN0KHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdDsKKworCV9fc2F2ZV9mbGFnc19jbGkoZmxhZ3MpOworCXYtPmNvdW50ZXIgLT0gMTsKKwlyZXN1bHQgPSAodi0+Y291bnRlciA9PSAwKTsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2FkZF9uZWdhdGl2ZShpbnQgaSwgdm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzdWx0OworCisJX19zYXZlX2ZsYWdzX2NsaShmbGFncyk7CisJdi0+Y291bnRlciArPSBpOworCXJlc3VsdCA9ICh2LT5jb3VudGVyIDwgMCk7CisJX19yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlfX3NhdmVfZmxhZ3NfY2xpKGZsYWdzKTsKKwkqYWRkciAmPSB+bWFzazsKKwlfX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisjZGVmaW5lIG1iKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBybWIoKSBtYigpCisjZGVmaW5lIHdtYigpIG1iKCkKKworI2RlZmluZSBJQVRPTUlDX0RFRklORUQJCTEKKworI2VuZGlmIC8qIF9fYXJtX18gKi8KKworI2lmbmRlZiBJQVRPTUlDX0RFRklORUQKKy8qCisgKiBub24gc3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4KKyAqLworI3dhcm5pbmcgIkF0b21pYyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlLiIKKwordHlwZWRlZiBzdHJ1Y3QgeyB2b2xhdGlsZSBpbnQgY291bnRlcjsgfSBhdG9taWNfdDsKKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQl7IChpKSB9CisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCSgoKHYpLT5jb3VudGVyKSA9IChpKSkKKyNkZWZpbmUgYXRvbWljX2FkZChpLHYpICgoKHYpLT5jb3VudGVyKSArPSAoaSkpCisjZGVmaW5lIGF0b21pY19zdWIoaSx2KSAoKCh2KS0+Y291bnRlcikgLT0gKGkpKQorI2RlZmluZSBhdG9taWNfaW5jKHYpICAgKCgodiktPmNvdW50ZXIpKyspCisjZGVmaW5lIGF0b21pY19kZWModikgICAoKCh2KS0+Y291bnRlciktLSkKKworI2RlZmluZSBtYigpCisjZGVmaW5lIHJtYigpCisjZGVmaW5lIHdtYigpCisKKyNkZWZpbmUgSUFUT01JQ19ERUZJTkVECQkxCisKKyNlbmRpZiAvKiBJQVRPTUlDX0RFRklORUQgKi8KKworLyoKKyAqICBBdG9taWMgcmVhZC93cml0ZQorICogIENvcHlyaWdodCAoYykgMjAwMSBieSBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKi8KKworLyogTWF4IG51bWJlciBvZiB0aW1lcyB3ZSBtdXN0IHNwaW4gb24gYSBzcGluLWxvY2sgY2FsbGluZyBzY2hlZF95aWVsZCgpLgorICAgQWZ0ZXIgTUFYX1NQSU5fQ09VTlQgaXRlcmF0aW9ucywgd2UgcHV0IHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcC4gKi8KKworI2lmbmRlZiBNQVhfU1BJTl9DT1VOVAorI2RlZmluZSBNQVhfU1BJTl9DT1VOVCA1MAorI2VuZGlmCisKKy8qIER1cmF0aW9uIG9mIHNsZWVwIChpbiBuYW5vc2Vjb25kcykgd2hlbiB3ZSBjYW4ndCBhY3F1aXJlIGEgc3Bpbi1sb2NrCisgICBhZnRlciBNQVhfU1BJTl9DT1VOVCBpdGVyYXRpb25zIG9mIHNjaGVkX3lpZWxkKCkuCisgICBUaGlzIE1VU1QgQkUgPiAybXMuCisgICAoT3RoZXJ3aXNlIHRoZSBrZXJuZWwgZG9lcyBidXN5LXdhaXRpbmcgZm9yIHJlYWwtdGltZSB0aHJlYWRzLAorICAgIGdpdmluZyBvdGhlciB0aHJlYWRzIG5vIGNoYW5jZSB0byBydW4uKSAqLworCisjaWZuZGVmIFNQSU5fU0xFRVBfRFVSQVRJT04KKyNkZWZpbmUgU1BJTl9TTEVFUF9EVVJBVElPTiAyMDAwMDAxCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBiZWdpbiwgZW5kOworfSBzbmRfYXRvbWljX3dyaXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSBjb25zdCBzbmRfYXRvbWljX3dyaXRlX3QgKndyaXRlOworCXVuc2lnbmVkIGludCBlbmQ7Cit9IHNuZF9hdG9taWNfcmVhZF90OworCit2b2lkIHNuZF9hdG9taWNfcmVhZF93YWl0KHNuZF9hdG9taWNfcmVhZF90ICp0KTsKKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9hdG9taWNfd3JpdGVfaW5pdChzbmRfYXRvbWljX3dyaXRlX3QgKncpCit7CisJdy0+YmVnaW4gPSAwOworCXctPmVuZCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXRvbWljX3dyaXRlX2JlZ2luKHNuZF9hdG9taWNfd3JpdGVfdCAqdykKK3sKKwl3LT5iZWdpbisrOworCXdtYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2F0b21pY193cml0ZV9lbmQoc25kX2F0b21pY193cml0ZV90ICp3KQoreworCXdtYigpOworCXctPmVuZCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2F0b21pY19yZWFkX2luaXQoc25kX2F0b21pY19yZWFkX3QgKnIsIHNuZF9hdG9taWNfd3JpdGVfdCAqdykKK3sKKwlyLT53cml0ZSA9IHc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfYXRvbWljX3JlYWRfYmVnaW4oc25kX2F0b21pY19yZWFkX3QgKnIpCit7CisJci0+ZW5kID0gci0+d3JpdGUtPmVuZDsKKwlybWIoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc25kX2F0b21pY19yZWFkX29rKHNuZF9hdG9taWNfcmVhZF90ICpyKQoreworCXJtYigpOworCXJldHVybiByLT5lbmQgPT0gci0+d3JpdGUtPmJlZ2luOworfQorCisjZW5kaWYgLyogX19BTFNBX0lBVE9NSUNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lucHV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzVkMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL2lucHV0LmgKQEAgLTAsMCArMSw4MyBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2lucHV0LmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0lOUFVUX0gKKyNkZWZpbmUgX19BTFNBX0lOUFVUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgSW5wdXQgSW5wdXQgSW50ZXJmYWNlCisgKgorICogIFRoZSBpbnB1dCBmdW5jdGlvbnMgcHJlc2VudCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGUgc3RkaW8gZnVuY3Rpb25zCisgKiAgb24gdG9wIG9mIGRpZmZlcmVudCB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZXMuCisgKgorICogIFRoZSAjc25kX2NvbmZpZ19sb2FkIGZ1bmN0aW9uIHVzZXMgc3VjaCBhbiBpbnB1dCBoYW5kbGUgdG8gYmUgYWJsZSB0bworICogIGxvYWQgY29uZmlndXJhdGlvbnMgbm90IG9ubHkgZnJvbSBzdGFuZGFyZCBmaWxlcyBidXQgYWxzbyBmcm9tIG90aGVyCisgKiAgc291cmNlcywgZS5nLiBmcm9tIG1lbW9yeSBidWZmZXJzLgorICoKKyAqICBceworICovCisKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYW4gaW5wdXQgb2JqZWN0LgorICoKKyAqIFRoZSBBTFNBIGxpYnJhcnkgdXNlcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUgYXMgYSBoYW5kbGUgdG8gYW4KKyAqIGlucHV0IG9iamVjdC4gQXBwbGljYXRpb25zIGRvbid0IGFjY2VzcyBpdHMgY29udGVudHMgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaW5wdXQgc25kX2lucHV0X3Q7CisKKy8qKiBJbnB1dCB0eXBlLiAqLwordHlwZWRlZiBlbnVtIF9zbmRfaW5wdXRfdHlwZSB7CisJLyoqIElucHV0IGZyb20gYSBzdGRpbyBzdHJlYW0uICovCisJU05EX0lOUFVUX1NURElPLAorCS8qKiBJbnB1dCBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4gKi8KKwlTTkRfSU5QVVRfQlVGRkVSCit9IHNuZF9pbnB1dF90eXBlX3Q7CisKK2ludCBzbmRfaW5wdXRfc3RkaW9fb3BlbihzbmRfaW5wdXRfdCAqKmlucHV0cCwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqbW9kZSk7CitpbnQgc25kX2lucHV0X3N0ZGlvX2F0dGFjaChzbmRfaW5wdXRfdCAqKmlucHV0cCwgRklMRSAqZnAsIGludCBfY2xvc2UpOworaW50IHNuZF9pbnB1dF9idWZmZXJfb3BlbihzbmRfaW5wdXRfdCAqKmlucHV0cCwgY29uc3QgY2hhciAqYnVmZmVyLCBzc2l6ZV90IHNpemUpOworaW50IHNuZF9pbnB1dF9jbG9zZShzbmRfaW5wdXRfdCAqaW5wdXQpOworaW50IHNuZF9pbnB1dF9zY2FuZihzbmRfaW5wdXRfdCAqaW5wdXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmbmRlZiBET0NfSElEREVOCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoc2NhbmYsIDIsIDMpKSkKKyNlbmRpZgorCTsKK2NoYXIgKnNuZF9pbnB1dF9nZXRzKHNuZF9pbnB1dF90ICppbnB1dCwgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSk7CitpbnQgc25kX2lucHV0X2dldGMoc25kX2lucHV0X3QgKmlucHV0KTsKK2ludCBzbmRfaW5wdXRfdW5nZXRjKHNuZF9pbnB1dF90ICppbnB1dCwgaW50IGMpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9JTlBVVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaW5zdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9pbnN0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzZmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvaW5zdHIuaApAQCAtMCwwICsxLDE3NyBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL2luc3RyLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX0lOU1RSX0gKKyNkZWZpbmUgX19BTFNBX0lOU1RSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgSW5zdHJ1bWVudCBJbnN0cnVtZW50IEludGVyZmFjZQorICogIFRoZSBJbnN0cnVtZW50IEludGVyZmFjZS4KKyAqICBceworICovCisKKy8qIGluc3RydW1lbnQgZ2V0L3B1dCAqLworCisvKiogY29udGFpbmVyIGZvciBzZXF1ZW5jZXIgaW5zdHJ1bWVudCBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaW5zdHJfaGVhZGVyIHNuZF9pbnN0cl9oZWFkZXJfdDsKKworc2l6ZV90IHNuZF9pbnN0cl9oZWFkZXJfc2l6ZW9mKHZvaWQpOworI2RlZmluZSBzbmRfaW5zdHJfaGVhZGVyX2FsbG9jYShwdHIpIFwKK2RvIHtcCisJYXNzZXJ0KHB0cik7XAorCSpwdHIgPSAoc25kX2luc3RyX2hlYWRlcl90ICopYWxsb2NhKHNuZF9pbnN0cl9oZWFkZXJfc2l6ZW9mKCkpO1wKKwltZW1zZXQoKnB0ciwgMCwgc25kX2luc3RyX2hlYWRlcl9zaXplb2YoKSk7XAorfSB3aGlsZSAoMCkgLyoqPCBhbGxvY2F0ZSBpbnN0cnVtZW50IGhlYWRlciBvbiBzdGFjayAqLworaW50IHNuZF9pbnN0cl9oZWFkZXJfbWFsbG9jKHNuZF9pbnN0cl9oZWFkZXJfdCAqKnB0ciwgc2l6ZV90IGxlbik7Cit2b2lkIHNuZF9pbnN0cl9oZWFkZXJfZnJlZShzbmRfaW5zdHJfaGVhZGVyX3QgKnB0cik7Cit2b2lkIHNuZF9pbnN0cl9oZWFkZXJfY29weShzbmRfaW5zdHJfaGVhZGVyX3QgKmRzdCwgY29uc3Qgc25kX2luc3RyX2hlYWRlcl90ICpzcmMpOworCitjb25zdCBzbmRfc2VxX2luc3RyX3QgKnNuZF9pbnN0cl9oZWFkZXJfZ2V0X2lkKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7CitzbmRfc2VxX2luc3RyX2NsdXN0ZXJfdCBzbmRfaW5zdHJfaGVhZGVyX2dldF9jbHVzdGVyKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX2luc3RyX2hlYWRlcl9nZXRfY21kKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7CitzaXplX3Qgc25kX2luc3RyX2hlYWRlcl9nZXRfbGVuKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7Citjb25zdCBjaGFyICpzbmRfaW5zdHJfaGVhZGVyX2dldF9uYW1lKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7CitpbnQgc25kX2luc3RyX2hlYWRlcl9nZXRfdHlwZShjb25zdCBzbmRfaW5zdHJfaGVhZGVyX3QgKmluZm8pOworY29uc3QgY2hhciAqc25kX2luc3RyX2hlYWRlcl9nZXRfZm9ybWF0KGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2luc3RyX3QgKnNuZF9pbnN0cl9oZWFkZXJfZ2V0X2FsaWFzKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7Cit2b2lkICpzbmRfaW5zdHJfaGVhZGVyX2dldF9kYXRhKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7CitpbnQgc25kX2luc3RyX2hlYWRlcl9nZXRfZm9sbG93X2FsaWFzKGNvbnN0IHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbyk7CisKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfaWQoc25kX2luc3RyX2hlYWRlcl90ICppbmZvLCBjb25zdCBzbmRfc2VxX2luc3RyX3QgKmlkKTsKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfY2x1c3RlcihzbmRfaW5zdHJfaGVhZGVyX3QgKmluZm8sIHNuZF9zZXFfaW5zdHJfY2x1c3Rlcl90IGNsdXN0ZXIpOwordm9pZCBzbmRfaW5zdHJfaGVhZGVyX3NldF9jbWQoc25kX2luc3RyX2hlYWRlcl90ICppbmZvLCB1bnNpZ25lZCBpbnQgY21kKTsKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfbGVuKHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbywgc2l6ZV90IGxlbik7Cit2b2lkIHNuZF9pbnN0cl9oZWFkZXJfc2V0X25hbWUoc25kX2luc3RyX2hlYWRlcl90ICppbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfdHlwZShzbmRfaW5zdHJfaGVhZGVyX3QgKmluZm8sIGludCB0eXBlKTsKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfZm9ybWF0KHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbywgY29uc3QgY2hhciAqZm9ybWF0KTsKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfYWxpYXMoc25kX2luc3RyX2hlYWRlcl90ICppbmZvLCBjb25zdCBzbmRfc2VxX2luc3RyX3QgKmluc3RyKTsKK3ZvaWQgc25kX2luc3RyX2hlYWRlcl9zZXRfZm9sbG93X2FsaWFzKHNuZF9pbnN0cl9oZWFkZXJfdCAqaW5mbywgaW50IHZhbCk7CisKKy8qKgorICogIEluc3RydW1lbnQgYWJzdHJhY3Rpb24gbGF5ZXIKKyAqICAgICAtIGJhc2VkIG9uIGV2ZW50cworICovCisKKy8qKiBpbnN0cnVtZW50IHR5cGVzICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfQVRZUEVfREFUQQkwCS8qKjwgaW5zdHJ1bWVudCBkYXRhICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfQVRZUEVfQUxJQVMJMQkvKio8IGluc3RydW1lbnQgYWxpYXMgKi8KKworLyoqIGluc3RydW1lbnQgQVNDSUkgaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9JRF9ETFMxCQkiRExTMSIJCS8qKjwgRExTMSAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX0lEX0RMUzIJCSJETFMyIgkJLyoqPCBETFMyICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfSURfU0lNUExFCQkiU2ltcGxlIFdhdmUiCS8qKjwgU2ltcGxlIFdhdmUgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9JRF9TT1VOREZPTlQJIlNvdW5kRm9udCIJLyoqPCBTb3VuZEZvbnQgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9JRF9HVVNfUEFUQ0gJIkdVUyBQYXRjaCIJLyoqPCBHcmF2aXMgUGF0Y2ggKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9JRF9JTlRFUldBVkUJIkludGVyd2F2ZSBGRkZGIiAvKio8IEludGVyV2F2ZSBGRkZGICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfSURfT1BMMl8zCQkiT1BMMi8zIEZNIgkvKio8IE9QTDIvMyBGTSAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX0lEX09QTDQJCSJPUEw0IgkJLyoqPCBPUEw0ICovCisKKy8qKiBpbnN0cnVtZW50IHR5cGVzICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfVFlQRTBfRExTMQkoMTw8MCkJCS8qKjwgTUlESSBETFMgdjEgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9UWVBFMF9ETFMyCSgxPDwxKQkJLyoqPCBNSURJIERMUyB2MiAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX1RZUEUxX1NJTVBMRQkoMTw8MCkJCS8qKjwgU2ltcGxlIFdhdmUgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9UWVBFMV9TT1VOREZPTlQJKDE8PDEpCQkvKio8IEVNVSBTb3VuZEZvbnQgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9UWVBFMV9HVVNfUEFUQ0gJKDE8PDIpCQkvKio8IEdyYXZpcyBVbHRyYVNvdW5kIFBhdGNoICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfVFlQRTFfSU5URVJXQVZFCSgxPDwzKQkJLyoqPCBJbnRlcldhdmUgRkZGRiAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX1RZUEUyX09QTDJfMwkoMTw8MCkJCS8qKjwgWWFtYWhhIE9QTDIvMyBGTSAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX1RZUEUyX09QTDQJKDE8PDEpCQkvKio8IFlhbWFoYSBPUEw0ICovCisKKy8qKiBwdXQgY29tbWFuZHMgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9QVVRfQ01EX0NSRUFURQkwCS8qKjwgY3JlYXRlIGEgbmV3IGxheWVyICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfUFVUX0NNRF9SRVBMQUNFCTEJLyoqPCByZXBsYWNlIHRoZSBvbGQgbGF5ZXIgd2l0aCBuZXcgb25lICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfUFVUX0NNRF9NT0RJRlkJMgkvKio8IG1vZGlmeSB0aGUgZXhpc3RpbmcgbGF5ZXIgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9QVVRfQ01EX0FERAkzCS8qKjwgYWRkIG9uZSB0byB0aGUgZXhpc3RpbmcgbGF5ZXIgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9QVVRfQ01EX1JFTU9WRQk0CS8qKjwgcmVtb3ZlIHRoZSBsYXllciAqLworCisvKiogZ2V0IGNvbW1hbmRzICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfR0VUX0NNRF9GVUxMCTAJLyoqPCBnZXQgdGhlIGZ1bGwgZGF0YSBzdHJlYW0gKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9HRVRfQ01EX1BBUlRJQUwJMQkvKio8IGdldCB0aGUgcGFydGlhbCBkYXRhIHN0cmVhbSAqLworCisvKiBxdWVyeSBmbGFncyAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX1FVRVJZX0ZPTExPV19BTElBUyAoMTw8MCkJLyoqPCBmb2xsb3cgYWxpYXMgdG8gZ2V0IHRoZSBpbnN0cnVtZW50IGRhdGEgKi8KKworLyoqIGZyZWUgY29tbWFuZHMgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9GUkVFX0NNRF9BTEwJMAkvKio8IHJlbW92ZSBhbGwgbWF0Y2hpbmcgaW5zdHJ1bWVudHMgKi8KKyNkZWZpbmUgU05EX1NFUV9JTlNUUl9GUkVFX0NNRF9QUklWQVRFCTEJLyoqPCByZW1vdmUgb25seSBwcml2YXRlIGluc3RydW1lbnRzICovCisjZGVmaW5lIFNORF9TRVFfSU5TVFJfRlJFRV9DTURfQ0xVU1RFUgkyCS8qKjwgcmVtb3ZlIG9ubHkgY2x1c3RlciBpbnN0cnVtZW50cyAqLworI2RlZmluZSBTTkRfU0VRX0lOU1RSX0ZSRUVfQ01EX1NJTkdMRQkzCS8qKjwgcmVtb3ZlIHNpbmdsZSBpbnN0cnVtZW50ICovCisKKworLyoqCisgKiBGTSBpbnN0cnVtZW50IHN1cHBvcnQKKyAqLworCisvKiogRk0gaW5zdHJ1bWVudCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiB2b2lkIHNuZF9pbnN0cl9mbV90OworCitpbnQgc25kX2luc3RyX2ZtX2NvbnZlcnRfdG9fc3RyZWFtKHNuZF9pbnN0cl9mbV90ICpmbSwgY29uc3QgY2hhciAqbmFtZSwgc25kX2luc3RyX2hlYWRlcl90ICoqcHV0LCBzaXplX3QgKnNpemUpOworaW50IHNuZF9pbnN0cl9mbV9jb252ZXJ0X2Zyb21fc3RyZWFtKHNuZF9pbnN0cl9oZWFkZXJfdCAqZGF0YSwgc2l6ZV90IHNpemUsIHNuZF9pbnN0cl9mbV90ICoqZm0pOworaW50IHNuZF9pbnN0cl9mbV9mcmVlKHNuZF9pbnN0cl9mbV90ICpmbSk7CisKKworLyoqCisgKiBTaW1wbGUgV2F2ZSBzdXBwb3J0CisgKi8KKworLyoqIHNpbXBsZSBpbnN0cnVtZW50IGRhdGEgc3RydWN0dXJlICovCit0eXBlZGVmIHZvaWQgc25kX2luc3RyX3NpbXBsZV90OworCitpbnQgc25kX2luc3RyX3NpbXBsZV9jb252ZXJ0X3RvX3N0cmVhbShzbmRfaW5zdHJfc2ltcGxlX3QgKnNpbXBsZSwgY29uc3QgY2hhciAqbmFtZSwgc25kX2luc3RyX2hlYWRlcl90ICoqcHV0LCBzaXplX3QgKnNpemUpOworaW50IHNuZF9pbnN0cl9zaW1wbGVfY29udmVydF9mcm9tX3N0cmVhbShzbmRfaW5zdHJfaGVhZGVyX3QgKmRhdGEsIHNpemVfdCBzaXplLCBzbmRfaW5zdHJfc2ltcGxlX3QgKipzaW1wbGUpOworaW50IHNuZF9pbnN0cl9zaW1wbGVfZnJlZShzbmRfaW5zdHJfc2ltcGxlX3QgKnNpbXBsZSk7CisKKworLyoqCisgKiBJbnRlcldhdmUgRkZGRiBzdXBwb3J0CisgKi8KKworLyoqIElXIEZGRkYgaW5zdHJ1bWVudCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiB2b2lkIHNuZF9pbnN0cl9pd2ZmZmZfdDsKKy8qKiBJVyBGRkZGIGhhbmRsZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfaXdmZmZmX2hhbmRsZSBzbmRfaXdmZmZmX2hhbmRsZV90OworCitpbnQgc25kX2luc3RyX2l3ZmZmZl9vcGVuKHNuZF9pd2ZmZmZfaGFuZGxlX3QgKipoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWVfZmZmLCBjb25zdCBjaGFyICpuYW1lX2R0YSk7CitpbnQgc25kX2luc3RyX2l3ZmZmZl9vcGVuX3JvbShzbmRfaXdmZmZmX2hhbmRsZV90ICoqaGFuZGxlLCBpbnQgY2FyZCwgaW50IGJhbmssIGludCBmaWxlKTsKK2ludCBzbmRfaW5zdHJfaXdmZmZmX29wZW5fcm9tX2ZpbGUoc25kX2l3ZmZmZl9oYW5kbGVfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGJhbmssIGludCBmaWxlKTsKK2ludCBzbmRfaW5zdHJfaXdmZmZmX2Nsb3NlKHNuZF9pd2ZmZmZfaGFuZGxlX3QgKmhhbmRsZSk7CitpbnQgc25kX2luc3RyX2l3ZmZmZl9sb2FkKHNuZF9pd2ZmZmZfaGFuZGxlX3QgKmhhbmRsZSwgaW50IGJhbmssIGludCBwcmcsIHNuZF9pbnN0cl9pd2ZmZmZfdCAqKml3ZmZmZik7CitpbnQgc25kX2luc3RyX2l3ZmZmZl9jb252ZXJ0X3RvX3N0cmVhbShzbmRfaW5zdHJfaXdmZmZmX3QgKml3ZmZmZiwgY29uc3QgY2hhciAqbmFtZSwgc25kX2luc3RyX2hlYWRlcl90ICoqZGF0YSwgc2l6ZV90ICpzaXplKTsKK2ludCBzbmRfaW5zdHJfaXdmZmZmX2NvbnZlcnRfZnJvbV9zdHJlYW0oc25kX2luc3RyX2hlYWRlcl90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgc25kX2luc3RyX2l3ZmZmZl90ICoqaXdmZmZmKTsKK2ludCBzbmRfaW5zdHJfaXdmZmZmX2ZyZWUoc25kX2luc3RyX2l3ZmZmZl90ICppd2ZmZmYpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9JTlNUUl9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL21peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyOTc3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlci5oCkBAIC0wLDAgKzEsMzE1IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvbWl4ZXIuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfTUlYRVJfSAorI2RlZmluZSBfX0FMU0FfTUlYRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBNaXhlciBNaXhlciBJbnRlcmZhY2UKKyAqICBUaGUgbWl4ZXIgaW50ZXJmYWNlLgorICogIFx7CisgKi8KKworLyoqIE1peGVyIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9taXhlciBzbmRfbWl4ZXJfdDsKKy8qKiBNaXhlciBlbGVtZW50cyBjbGFzcyBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfbWl4ZXJfY2xhc3Mgc25kX21peGVyX2NsYXNzX3Q7CisvKiogTWl4ZXIgZWxlbWVudCBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfbWl4ZXJfZWxlbSBzbmRfbWl4ZXJfZWxlbV90OworCisvKiogCisgKiBcYnJpZWYgTWl4ZXIgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIFxwYXJhbSBtaXhlciBNaXhlciBoYW5kbGUKKyAqIFxwYXJhbSBtYXNrIGV2ZW50IG1hc2sKKyAqIFxwYXJhbSBlbGVtIHJlbGF0ZWQgbWl4ZXIgZWxlbWVudCAoaWYgYW55KQorICogXHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCit0eXBlZGVmIGludCAoKnNuZF9taXhlcl9jYWxsYmFja190KShzbmRfbWl4ZXJfdCAqY3RsLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbWFzaywKKwkJCQkgICAgc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CisKKy8qKiAKKyAqIFxicmllZiBNaXhlciBlbGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBccGFyYW0gZWxlbSBNaXhlciBlbGVtZW50CisgKiBccGFyYW0gbWFzayBldmVudCBtYXNrCisgKiBccmV0dXJuIDAgb24gc3VjY2VzcyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3R5cGVkZWYgaW50ICgqc25kX21peGVyX2VsZW1fY2FsbGJhY2tfdCkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwKKwkJCQkJIHVuc2lnbmVkIGludCBtYXNrKTsKKworLyoqCisgKiBcYnJpZWYgQ29tcGFyZSBmdW5jdGlvbiBmb3Igc29ydGluZyBtaXhlciBlbGVtZW50cworICogXHBhcmFtIGUxIEZpcnN0IGVsZW1lbnQKKyAqIFxwYXJhbSBlMiBTZWNvbmQgZWxlbWVudAorICogXHJldHVybiAtMSBpZiBlMSA8IGUyLCAwIGlmIGUxID09IGUyLCAxIGlmIGUxID4gZTIKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfbWl4ZXJfY29tcGFyZV90KShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICplMSwKKwkJCQkgICBjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICplMik7CisKKy8qKgorICogXGJyaWVmIEV2ZW50IGNhbGxiYWNrIGZvciB0aGUgbWl4ZXIgY2xhc3MKKyAqIFxwYXJhbSBjbGFzc18gTWl4ZXIgY2xhc3MKKyAqIFxwYXJhbSBtYXNrIEV2ZW50IG1hc2sgKFNORF9DVExfRVZFTlRfKikKKyAqIFxwYXJhbSBoZWxlbSBIQ1RMIGVsZW1lbnQgd2hpY2ggaW52b2tlZCB0aGUgZXZlbnQKKyAqIFxwYXJhbSBtZWxlbSBNaXhlciBlbGVtZW50IGFzc29jaWF0ZWQgdG8gSENUTCBlbGVtZW50CisgKiBccmV0dXJuIHplcm8gaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUKKyAqLwordHlwZWRlZiBpbnQgKCpzbmRfbWl4ZXJfZXZlbnRfdCkoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXywgdW5zaWduZWQgaW50IG1hc2ssCisJCQkJIHNuZF9oY3RsX2VsZW1fdCAqaGVsZW0sIHNuZF9taXhlcl9lbGVtX3QgKm1lbGVtKTsKKworCisvKiogTWl4ZXIgZWxlbWVudCB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9taXhlcl9lbGVtX3R5cGUgeworCS8qIFNpbXBsZSAobGVnYWN5KSBtaXhlciBlbGVtZW50cyAqLworCVNORF9NSVhFUl9FTEVNX1NJTVBMRSwKKwlTTkRfTUlYRVJfRUxFTV9MQVNUID0gU05EX01JWEVSX0VMRU1fU0lNUExFCit9IHNuZF9taXhlcl9lbGVtX3R5cGVfdDsKKworaW50IHNuZF9taXhlcl9vcGVuKHNuZF9taXhlcl90ICoqbWl4ZXIsIGludCBtb2RlKTsKK2ludCBzbmRfbWl4ZXJfY2xvc2Uoc25kX21peGVyX3QgKm1peGVyKTsKK3NuZF9taXhlcl9lbGVtX3QgKnNuZF9taXhlcl9maXJzdF9lbGVtKHNuZF9taXhlcl90ICptaXhlcik7CitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfbGFzdF9lbGVtKHNuZF9taXhlcl90ICptaXhlcik7CitpbnQgc25kX21peGVyX2hhbmRsZV9ldmVudHMoc25kX21peGVyX3QgKm1peGVyKTsKK2ludCBzbmRfbWl4ZXJfYXR0YWNoKHNuZF9taXhlcl90ICptaXhlciwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgc25kX21peGVyX2F0dGFjaF9oY3RsKHNuZF9taXhlcl90ICptaXhlciwgc25kX2hjdGxfdCAqaGN0bCk7CitpbnQgc25kX21peGVyX2RldGFjaChzbmRfbWl4ZXJfdCAqbWl4ZXIsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9taXhlcl9kZXRhY2hfaGN0bChzbmRfbWl4ZXJfdCAqbWl4ZXIsIHNuZF9oY3RsX3QgKmhjdGwpOworaW50IHNuZF9taXhlcl9nZXRfaGN0bChzbmRfbWl4ZXJfdCAqbWl4ZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHNuZF9oY3RsX3QgKipoY3RsKTsKK2ludCBzbmRfbWl4ZXJfcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfbWl4ZXJfdCAqbWl4ZXIpOworaW50IHNuZF9taXhlcl9wb2xsX2Rlc2NyaXB0b3JzKHNuZF9taXhlcl90ICptaXhlciwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKK2ludCBzbmRfbWl4ZXJfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9taXhlcl90ICptaXhlciwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICpyZXZlbnRzKTsKK2ludCBzbmRfbWl4ZXJfbG9hZChzbmRfbWl4ZXJfdCAqbWl4ZXIpOwordm9pZCBzbmRfbWl4ZXJfZnJlZShzbmRfbWl4ZXJfdCAqbWl4ZXIpOworaW50IHNuZF9taXhlcl93YWl0KHNuZF9taXhlcl90ICptaXhlciwgaW50IHRpbWVvdXQpOworaW50IHNuZF9taXhlcl9zZXRfY29tcGFyZShzbmRfbWl4ZXJfdCAqbWl4ZXIsIHNuZF9taXhlcl9jb21wYXJlX3QgbXNvcnQpOwordm9pZCBzbmRfbWl4ZXJfc2V0X2NhbGxiYWNrKHNuZF9taXhlcl90ICpvYmosIHNuZF9taXhlcl9jYWxsYmFja190IHZhbCk7Cit2b2lkICogc25kX21peGVyX2dldF9jYWxsYmFja19wcml2YXRlKGNvbnN0IHNuZF9taXhlcl90ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX21peGVyX3QgKm9iaiwgdm9pZCAqIHZhbCk7Cit1bnNpZ25lZCBpbnQgc25kX21peGVyX2dldF9jb3VudChjb25zdCBzbmRfbWl4ZXJfdCAqb2JqKTsKK2ludCBzbmRfbWl4ZXJfY2xhc3NfdW5yZWdpc3RlcihzbmRfbWl4ZXJfY2xhc3NfdCAqY2xzcyk7CisKK3NuZF9taXhlcl9lbGVtX3QgKnNuZF9taXhlcl9lbGVtX25leHQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitzbmRfbWl4ZXJfZWxlbV90ICpzbmRfbWl4ZXJfZWxlbV9wcmV2KHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOwordm9pZCBzbmRfbWl4ZXJfZWxlbV9zZXRfY2FsbGJhY2soc25kX21peGVyX2VsZW1fdCAqb2JqLCBzbmRfbWl4ZXJfZWxlbV9jYWxsYmFja190IHZhbCk7Cit2b2lkICogc25kX21peGVyX2VsZW1fZ2V0X2NhbGxiYWNrX3ByaXZhdGUoY29uc3Qgc25kX21peGVyX2VsZW1fdCAqb2JqKTsKK3ZvaWQgc25kX21peGVyX2VsZW1fc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX21peGVyX2VsZW1fdCAqb2JqLCB2b2lkICogdmFsKTsKK3NuZF9taXhlcl9lbGVtX3R5cGVfdCBzbmRfbWl4ZXJfZWxlbV9nZXRfdHlwZShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICpvYmopOworCitpbnQgc25kX21peGVyX2NsYXNzX3JlZ2lzdGVyKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHNuZF9taXhlcl90ICptaXhlcik7CitpbnQgc25kX21peGVyX2FkZF9lbGVtKHNuZF9taXhlcl90ICptaXhlciwgc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3JlbW92ZV9lbGVtKHNuZF9taXhlcl90ICptaXhlciwgc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX2VsZW1fbmV3KHNuZF9taXhlcl9lbGVtX3QgKiplbGVtLAorCQkgICAgICAgc25kX21peGVyX2VsZW1fdHlwZV90IHR5cGUsCisJCSAgICAgICBpbnQgY29tcGFyZV93ZWlnaHQsCisJCSAgICAgICB2b2lkICpwcml2YXRlX2RhdGEsCisJCSAgICAgICB2b2lkICgqcHJpdmF0ZV9mcmVlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKSk7CitpbnQgc25kX21peGVyX2VsZW1fYWRkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pOworaW50IHNuZF9taXhlcl9lbGVtX3JlbW92ZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK3ZvaWQgc25kX21peGVyX2VsZW1fZnJlZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV9pbmZvKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9lbGVtX3ZhbHVlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9lbGVtX2F0dGFjaChzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSwgc25kX2hjdGxfZWxlbV90ICpoZWxlbSk7CitpbnQgc25kX21peGVyX2VsZW1fZGV0YWNoKHNuZF9taXhlcl9lbGVtX3QgKm1lbGVtLCBzbmRfaGN0bF9lbGVtX3QgKmhlbGVtKTsKK2ludCBzbmRfbWl4ZXJfZWxlbV9lbXB0eShzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSk7Cit2b2lkICpzbmRfbWl4ZXJfZWxlbV9nZXRfcHJpdmF0ZShjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICptZWxlbSk7CisKK3NpemVfdCBzbmRfbWl4ZXJfY2xhc3Nfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfbWl4ZXJfY2xhc3NfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9taXhlcl9jbGFzc19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9taXhlcl9jbGFzc190ICopIGFsbG9jYShzbmRfbWl4ZXJfY2xhc3Nfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX21peGVyX2NsYXNzX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfbWl4ZXJfY2xhc3NfbWFsbG9jKHNuZF9taXhlcl9jbGFzc190ICoqcHRyKTsKK3ZvaWQgc25kX21peGVyX2NsYXNzX2ZyZWUoc25kX21peGVyX2NsYXNzX3QgKm9iaik7Cit2b2lkIHNuZF9taXhlcl9jbGFzc19jb3B5KHNuZF9taXhlcl9jbGFzc190ICpkc3QsIGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpzcmMpOworc25kX21peGVyX3QgKnNuZF9taXhlcl9jbGFzc19nZXRfbWl4ZXIoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXyk7CitzbmRfbWl4ZXJfZXZlbnRfdCBzbmRfbWl4ZXJfY2xhc3NfZ2V0X2V2ZW50KGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pOwordm9pZCAqc25kX21peGVyX2NsYXNzX2dldF9wcml2YXRlKGNvbnN0IHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18pOworc25kX21peGVyX2NvbXBhcmVfdCBzbmRfbWl4ZXJfY2xhc3NfZ2V0X2NvbXBhcmUoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXyk7CitpbnQgc25kX21peGVyX2NsYXNzX3NldF9ldmVudChzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfLCBzbmRfbWl4ZXJfZXZlbnRfdCBldmVudCk7CitpbnQgc25kX21peGVyX2NsYXNzX3NldF9wcml2YXRlKHNuZF9taXhlcl9jbGFzc190ICpjbGFzc18sIHZvaWQgKnByaXZhdGVfZGF0YSk7CitpbnQgc25kX21peGVyX2NsYXNzX3NldF9wcml2YXRlX2ZyZWUoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXywgdm9pZCAoKnByaXZhdGVfZnJlZSkoc25kX21peGVyX2NsYXNzX3QgKmNsYXNzXykpOworaW50IHNuZF9taXhlcl9jbGFzc19zZXRfY29tcGFyZShzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3NfLCBzbmRfbWl4ZXJfY29tcGFyZV90IGNvbXBhcmUpOworCisvKioKKyAqICBcZGVmZ3JvdXAgU2ltcGxlTWl4ZXIgU2ltcGxlIE1peGVyIEludGVyZmFjZQorICogIFxpbmdyb3VwIE1peGVyCisgKiAgVGhlIHNpbXBsZSBtaXhlciBpbnRlcmZhY2UuCisgKiAgXHsKKyAqLworCisvKiBTaW1wbGUgKGxlZ2FjeSkgbWl4ZXIgZWxlbWVudHMgQVBJICovCisKKy8qKiBNaXhlciBzaW1wbGUgZWxlbWVudCBjaGFubmVsIGlkZW50aWZpZXIgKi8KK3R5cGVkZWYgZW51bSBfc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWQgeworCS8qKiBVbmtub3duICovCisJU05EX01JWEVSX1NDSE5fVU5LTk9XTiA9IC0xLAorCS8qKiBGcm9udCBsZWZ0ICovCisJU05EX01JWEVSX1NDSE5fRlJPTlRfTEVGVCA9IDAsCisJLyoqIEZyb250IHJpZ2h0ICovCisJU05EX01JWEVSX1NDSE5fRlJPTlRfUklHSFQsCisJLyoqIFJlYXIgbGVmdCAqLworCVNORF9NSVhFUl9TQ0hOX1JFQVJfTEVGVCwKKwkvKiogUmVhciByaWdodCAqLworCVNORF9NSVhFUl9TQ0hOX1JFQVJfUklHSFQsCisJLyoqIEZyb250IGNlbnRlciAqLworCVNORF9NSVhFUl9TQ0hOX0ZST05UX0NFTlRFUiwKKwkvKiogV29vZmVyICovCisJU05EX01JWEVSX1NDSE5fV09PRkVSLAorCS8qKiBTaWRlIExlZnQgKi8KKwlTTkRfTUlYRVJfU0NITl9TSURFX0xFRlQsCisJLyoqIFNpZGUgUmlnaHQgKi8KKwlTTkRfTUlYRVJfU0NITl9TSURFX1JJR0hULAorCS8qKiBSZWFyIENlbnRlciAqLworCVNORF9NSVhFUl9TQ0hOX1JFQVJfQ0VOVEVSLAorCVNORF9NSVhFUl9TQ0hOX0xBU1QgPSAzMSwKKwkvKiogTW9ubyAoRnJvbnQgbGVmdCBhbGlhcykgKi8KKwlTTkRfTUlYRVJfU0NITl9NT05PID0gU05EX01JWEVSX1NDSE5fRlJPTlRfTEVGVAorfSBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90OworCisvKiogTWl4ZXIgc2ltcGxlIGVsZW1lbnQgLSByZWdpc3RlciBvcHRpb25zIC0gYWJzdHJhY3Rpb24gbGV2ZWwgKi8KK2VudW0gc25kX21peGVyX3NlbGVtX3JlZ29wdF9hYnN0cmFjdCB7CisJLyoqIG5vIGFic3RyYWN0aW9uIC0gdHJ5IHVzZSBhbGwgdW5pdmVyc2FsIGNvbnRyb2xzIGZyb20gZHJpdmVyICovCisJU05EX01JWEVSX1NBQlNUUkFDVF9OT05FID0gMCwKKwkvKiogYmFzaWMgYWJzdHJhY3Rpb24gLSBNYXN0ZXIsUENNLENELEF1eCxSZWNvcmQtR2FpbiBldGMuICovCisJU05EX01JWEVSX1NBQlNUUkFDVF9CQVNJQywKK307CisKKy8qKiBNaXhlciBzaW1wbGUgZWxlbWVudCAtIHJlZ2lzdGVyIG9wdGlvbnMgKi8KK3N0cnVjdCBzbmRfbWl4ZXJfc2VsZW1fcmVnb3B0IHsKKwkvKiogc3RydWN0dXJlIHZlcnNpb24gKi8KKwlpbnQgdmVyOworCS8qKiB2MTogYWJzdHJhY3QgbGF5ZXIgc2VsZWN0aW9uICovCisJZW51bSBzbmRfbWl4ZXJfc2VsZW1fcmVnb3B0X2Fic3RyYWN0IGFic3RyYWN0OworCS8qKiB2MTogZGV2aWNlIG5hbWUgKG11c3QgYmUgTlVMTCB3aGVuIHBsYXliYWNrX3BjbSBvciBjYXB0dXJlX3BjbSAhPSBOVUxMKSAqLworCWNvbnN0IGNoYXIgKmRldmljZTsKKwkvKiogdjE6IHBsYXliYWNrIFBDTSBjb25uZWN0ZWQgdG8gbWl4ZXIgZGV2aWNlIChOVUxMID09IG5vbmUpICovCisJc25kX3BjbV90ICpwbGF5YmFja19wY207CisJLyoqIHYxOiBjYXB0dXJlIFBDTSBjb25uZWN0ZWQgdG8gbWl4ZXIgZGV2aWNlIChOVUxMID09IG5vbmUpICovCisJc25kX3BjbV90ICpjYXB0dXJlX3BjbTsKK307CisKKy8qKiBNaXhlciBzaW1wbGUgZWxlbWVudCBpZGVudGlmaWVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX21peGVyX3NlbGVtX2lkIHNuZF9taXhlcl9zZWxlbV9pZF90OworCitjb25zdCBjaGFyICpzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9uYW1lKHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCk7CisKK2ludCBzbmRfbWl4ZXJfc2VsZW1fcmVnaXN0ZXIoc25kX21peGVyX3QgKm1peGVyLAorCQkJICAgICBzdHJ1Y3Qgc25kX21peGVyX3NlbGVtX3JlZ29wdCAqb3B0aW9ucywKKwkJCSAgICAgc25kX21peGVyX2NsYXNzX3QgKipjbGFzc3ApOwordm9pZCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2lkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW1lbnQsCisJCQkgICAgc25kX21peGVyX3NlbGVtX2lkX3QgKmlkKTsKK2NvbnN0IGNoYXIgKnNuZF9taXhlcl9zZWxlbV9nZXRfbmFtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK3Vuc2lnbmVkIGludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2luZGV4KHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworc25kX21peGVyX2VsZW1fdCAqc25kX21peGVyX2ZpbmRfc2VsZW0oc25kX21peGVyX3QgKm1peGVyLAorCQkJCSAgICAgICBjb25zdCBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqaWQpOworCitpbnQgc25kX21peGVyX3NlbGVtX2lzX2FjdGl2ZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faXNfcGxheWJhY2tfbW9ubyhzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX3BsYXliYWNrX2NoYW5uZWwoc25kX21peGVyX2VsZW1fdCAqb2JqLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwpOworaW50IHNuZF9taXhlcl9zZWxlbV9pc19jYXB0dXJlX21vbm8oc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX2NoYW5uZWwoc25kX21peGVyX2VsZW1fdCAqb2JqLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9ncm91cChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NvbW1vbl92b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19wbGF5YmFja192b2x1bWVfam9pbmVkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV92b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jYXB0dXJlX3ZvbHVtZV9qb2luZWQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2hhc19jb21tb25fc3dpdGNoKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfcGxheWJhY2tfc3dpdGNoX2pvaW5lZChzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1faGFzX2NhcHR1cmVfc3dpdGNoKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2hfam9pbmVkKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworaW50IHNuZF9taXhlcl9zZWxlbV9oYXNfY2FwdHVyZV9zd2l0Y2hfZXhjbHVzaXZlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0pOworCitpbnQgc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nICp2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9jYXB0dXJlX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9kQihzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX3N3aXRjaChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGludCAqdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfY2FwdHVyZV9zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgKnZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX3ZvbHVtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV92b2x1bWUoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nIHZhbHVlKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX2RCKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja192b2x1bWVfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV92b2x1bWVfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfZEJfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGxvbmcgdmFsdWUsIGludCBkaXIpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9kQl9hbGwoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgbG9uZyB2YWx1ZSwgaW50IGRpcik7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9wbGF5YmFja19zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2goc25kX21peGVyX2VsZW1fdCAqZWxlbSwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfcGxheWJhY2tfc3dpdGNoX2FsbChzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgdmFsdWUpOworaW50IHNuZF9taXhlcl9zZWxlbV9zZXRfY2FwdHVyZV9zd2l0Y2hfYWxsKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCB2YWx1ZSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9wbGF5YmFja192b2x1bWVfcmFuZ2Uoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgCisJCQkJCSAgICAgIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X3BsYXliYWNrX2RCX3JhbmdlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIAorCQkJCQkgIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X3BsYXliYWNrX3ZvbHVtZV9yYW5nZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCAKKwkJCQkJICAgICAgbG9uZyBtaW4sIGxvbmcgbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfdm9sdW1lX3JhbmdlKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIAorCQkJCQkgICAgIGxvbmcgKm1pbiwgbG9uZyAqbWF4KTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2NhcHR1cmVfZEJfcmFuZ2Uoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgCisJCQkJCSBsb25nICptaW4sIGxvbmcgKm1heCk7CitpbnQgc25kX21peGVyX3NlbGVtX3NldF9jYXB0dXJlX3ZvbHVtZV9yYW5nZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCAKKwkJCQkJICAgICBsb25nIG1pbiwgbG9uZyBtYXgpOworCitpbnQgc25kX21peGVyX3NlbGVtX2lzX2VudW1lcmF0ZWQoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2lzX2VudW1fcGxheWJhY2soc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2lzX2VudW1fY2FwdHVyZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fZ2V0X2VudW1faXRlbXMoc25kX21peGVyX2VsZW1fdCAqZWxlbSk7CitpbnQgc25kX21peGVyX3NlbGVtX2dldF9lbnVtX2l0ZW1fbmFtZShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCB1bnNpZ25lZCBpbnQgaWR4LCBzaXplX3QgbWF4bGVuLCBjaGFyICpzdHIpOworaW50IHNuZF9taXhlcl9zZWxlbV9nZXRfZW51bV9pdGVtKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgdW5zaWduZWQgaW50ICppZHhwKTsKK2ludCBzbmRfbWl4ZXJfc2VsZW1fc2V0X2VudW1faXRlbShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIHVuc2lnbmVkIGludCBpZHgpOworCitzaXplX3Qgc25kX21peGVyX3NlbGVtX2lkX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX21peGVyX3NlbGVtX2lkX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfbWl4ZXJfc2VsZW1faWRfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfbWl4ZXJfc2VsZW1faWRfdCAqKSBhbGxvY2Eoc25kX21peGVyX3NlbGVtX2lkX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIHNuZF9taXhlcl9zZWxlbV9pZF9zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX21peGVyX3NlbGVtX2lkX21hbGxvYyhzbmRfbWl4ZXJfc2VsZW1faWRfdCAqKnB0cik7Cit2b2lkIHNuZF9taXhlcl9zZWxlbV9pZF9mcmVlKHNuZF9taXhlcl9zZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfc2VsZW1faWRfY29weShzbmRfbWl4ZXJfc2VsZW1faWRfdCAqZHN0LCBjb25zdCBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqc3JjKTsKK2NvbnN0IGNoYXIgKnNuZF9taXhlcl9zZWxlbV9pZF9nZXRfbmFtZShjb25zdCBzbmRfbWl4ZXJfc2VsZW1faWRfdCAqb2JqKTsKK3Vuc2lnbmVkIGludCBzbmRfbWl4ZXJfc2VsZW1faWRfZ2V0X2luZGV4KGNvbnN0IHNuZF9taXhlcl9zZWxlbV9pZF90ICpvYmopOwordm9pZCBzbmRfbWl4ZXJfc2VsZW1faWRfc2V0X25hbWUoc25kX21peGVyX3NlbGVtX2lkX3QgKm9iaiwgY29uc3QgY2hhciAqdmFsKTsKK3ZvaWQgc25kX21peGVyX3NlbGVtX2lkX3NldF9pbmRleChzbmRfbWl4ZXJfc2VsZW1faWRfdCAqb2JqLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoqIFx9ICovCisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX01JWEVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL21peGVyX2Fic3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlcl9hYnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ZDgzNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9taXhlcl9hYnN0LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9taXhlcl9hYnN0LmgKKyAqIFxicmllZiBNaXhlciBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgbGlicmFyeQorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGRhdGUgMjAwNQorICoKKyAqIE1peGVyIGFic3RhY3QgaW1wbGVtZW50YXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGxpYnJhcnkKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9NSVhFUl9BQlNUX0gKKyNkZWZpbmUgX19BTFNBX01JWEVSX0FCU1RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBNaXhlcl9BYnN0cmFjdCBNaXhlciBBYnN0YWN0IE1vZHVsZSBJbnRlcmZhY2UKKyAqICBUaGUgbWl4ZXIgYWJzdGFjdCBtb2R1bGUgaW50ZXJmYWNlLgorICogIFx7CisgKi8KKworI2RlZmluZQlTTV9QTEFZCQkJMAorI2RlZmluZSBTTV9DQVBUCQkJMQorCisjZGVmaW5lIFNNX0NBUF9HVk9MVU1FCQkoMTw8MSkKKyNkZWZpbmUgU01fQ0FQX0dTV0lUQ0gJCSgxPDwyKQorI2RlZmluZSBTTV9DQVBfUFZPTFVNRQkJKDE8PDMpCisjZGVmaW5lIFNNX0NBUF9QVk9MVU1FX0pPSU4JKDE8PDQpCisjZGVmaW5lIFNNX0NBUF9QU1dJVENICQkoMTw8NSkgCisjZGVmaW5lIFNNX0NBUF9QU1dJVENIX0pPSU4JKDE8PDYpIAorI2RlZmluZSBTTV9DQVBfQ1ZPTFVNRQkJKDE8PDcpIAorI2RlZmluZSBTTV9DQVBfQ1ZPTFVNRV9KT0lOCSgxPDw4KSAKKyNkZWZpbmUgU01fQ0FQX0NTV0lUQ0gJCSgxPDw5KSAKKyNkZWZpbmUgU01fQ0FQX0NTV0lUQ0hfSk9JTgkoMTw8MTApCisjZGVmaW5lIFNNX0NBUF9DU1dJVENIX0VYQ0wJKDE8PDExKQorI2RlZmluZSBTTV9DQVBfUEVOVU0JCSgxPDwxMikKKyNkZWZpbmUgU01fQ0FQX0NFTlVNCQkoMTw8MTMpCisvKiBTTV9DQVBfKiAyNC0zMSA9PiBwcml2YXRlIGZvciBtb2R1bGUgdXNlICovCisKKyNkZWZpbmUgU01fT1BTX0lTX0FDVElWRQkwCisjZGVmaW5lIFNNX09QU19JU19NT05PCQkxCisjZGVmaW5lIFNNX09QU19JU19DSEFOTkVMCTIKKyNkZWZpbmUgU01fT1BTX0lTX0VOVU1FUkFURUQJMworI2RlZmluZSBTTV9PUFNfSVNfRU5VTUNOVAk0CisKKyNkZWZpbmUgc21fc2VsZW0oeCkJCSgoc21fc2VsZW1fdCAqKSgoeCktPnByaXZhdGVfZGF0YSkpCisjZGVmaW5lIHNtX3NlbGVtX29wcyh4KQkJKChzbV9zZWxlbV90ICopKCh4KS0+cHJpdmF0ZV9kYXRhKSktPm9wcworCit0eXBlZGVmIHN0cnVjdCBfc21fc2VsZW0geworCXNuZF9taXhlcl9zZWxlbV9pZF90ICppZDsKKwlzdHJ1Y3Qgc21fZWxlbV9vcHMgKm9wczsKKwl1bnNpZ25lZCBpbnQgY2FwczsKKwl1bnNpZ25lZCBpbnQgY2FwdHVyZV9ncm91cDsKK30gc21fc2VsZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3NtX2NsYXNzX2Jhc2ljIHsKKwljaGFyICpkZXZpY2U7CisJc25kX2N0bF90ICpjdGw7CisJc25kX2hjdGxfdCAqaGN0bDsKKwlzbmRfY3RsX2NhcmRfaW5mb190ICppbmZvOworfSBzbV9jbGFzc19iYXNpY190OworCitzdHJ1Y3Qgc21fZWxlbV9vcHMgewkKKwlpbnQgKCppcykoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgaW50IGNtZCwgaW50IHZhbCk7CisJaW50ICgqZ2V0X3JhbmdlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBsb25nICptaW4sIGxvbmcgKm1heCk7CisJaW50ICgqc2V0X3JhbmdlKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBpbnQgZGlyLCBsb25nIG1pbiwgbG9uZyBtYXgpOworCWludCAoKmdldF9kQl9yYW5nZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgbG9uZyAqbWluLCBsb25nICptYXgpOworCWludCAoKmdldF92b2x1bWUpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyAqdmFsdWUpOworCWludCAoKmdldF9kQikoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nICp2YWx1ZSk7CisJaW50ICgqc2V0X3ZvbHVtZSkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBsb25nIHZhbHVlKTsKKwlpbnQgKCpzZXRfZEIpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgbG9uZyB2YWx1ZSwgaW50IHhkaXIpOworCWludCAoKmdldF9zd2l0Y2gpKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIGludCBkaXIsIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgaW50ICp2YWx1ZSk7CisJaW50ICgqc2V0X3N3aXRjaCkoc25kX21peGVyX2VsZW1fdCAqZWxlbSwgaW50IGRpciwgc25kX21peGVyX3NlbGVtX2NoYW5uZWxfaWRfdCBjaGFubmVsLCBpbnQgdmFsdWUpOworCWludCAoKmVudW1faXRlbV9uYW1lKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCB1bnNpZ25lZCBpbnQgaXRlbSwgc2l6ZV90IG1heGxlbiwgY2hhciAqYnVmKTsKKwlpbnQgKCpnZXRfZW51bV9pdGVtKShzbmRfbWl4ZXJfZWxlbV90ICplbGVtLCBzbmRfbWl4ZXJfc2VsZW1fY2hhbm5lbF9pZF90IGNoYW5uZWwsIHVuc2lnbmVkIGludCAqaXRlbXApOworCWludCAoKnNldF9lbnVtX2l0ZW0pKHNuZF9taXhlcl9lbGVtX3QgKmVsZW0sIHNuZF9taXhlcl9zZWxlbV9jaGFubmVsX2lkX3QgY2hhbm5lbCwgdW5zaWduZWQgaW50IGl0ZW0pOworfTsKKworaW50IHNuZF9taXhlcl9zZWxlbV9jb21wYXJlKGNvbnN0IHNuZF9taXhlcl9lbGVtX3QgKmMxLCBjb25zdCBzbmRfbWl4ZXJfZWxlbV90ICpjMik7CisKK2ludCBzbmRfbWl4ZXJfc2Jhc2ljX2luZm8oY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzLCBzbV9jbGFzc19iYXNpY190ICppbmZvKTsKK3ZvaWQgKnNuZF9taXhlcl9zYmFzaWNfZ2V0X3ByaXZhdGUoY29uc3Qgc25kX21peGVyX2NsYXNzX3QgKmNsYXNzKTsKK3ZvaWQgc25kX21peGVyX3NiYXNpY19zZXRfcHJpdmF0ZShjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3MsIHZvaWQgKnByaXZhdGVfZGF0YSk7Cit2b2lkIHNuZF9taXhlcl9zYmFzaWNfc2V0X3ByaXZhdGVfZnJlZShjb25zdCBzbmRfbWl4ZXJfY2xhc3NfdCAqY2xhc3MsIHZvaWQgKCpwcml2YXRlX2ZyZWUpKHNuZF9taXhlcl9jbGFzc190ICpjbGFzcykpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9NSVhFUl9BQlNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL291dHB1dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzlhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evb3V0cHV0LmgKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL291dHB1dC5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9PVVRQVVRfSAorI2RlZmluZSBfX0FMU0FfT1VUUFVUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioKKyAqICBcZGVmZ3JvdXAgT3V0cHV0IE91dHB1dCBJbnRlcmZhY2UKKyAqCisgKiAgVGhlIG91dHB1dCBmdW5jdGlvbnMgcHJlc2VudCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGUgc3RkaW8gZnVuY3Rpb25zCisgKiAgb24gdG9wIG9mIGRpZmZlcmVudCB1bmRlcmx5aW5nIG91dHB1dCBkZXN0aW5hdGlvbnMuCisgKgorICogIE1hbnkgUENNIGRlYnVnZ2luZyBmdW5jdGlvbnMgKFxjIHNuZF9wY21feHh4X2R1bXBfeHh4KSB1c2Ugc3VjaCBhbiBvdXRwdXQKKyAqICBoYW5kbGUgdG8gYmUgYWJsZSB0byB3cml0ZSBub3Qgb25seSB0byB0aGUgc2NyZWVuIGJ1dCBhbHNvIHRvIG90aGVyCisgKiAgZGVzdGluYXRpb25zLCBlLmcuIHRvIGZpbGVzIG9yIHRvIG1lbW9yeSBidWZmZXJzLgorICoKKyAqICBceworICovCisKKy8qKgorICogXGJyaWVmIEludGVybmFsIHN0cnVjdHVyZSBmb3IgYW4gb3V0cHV0IG9iamVjdC4KKyAqCisgKiBUaGUgQUxTQSBsaWJyYXJ5IHVzZXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlIGFzIGEgaGFuZGxlIHRvIGFuCisgKiBvdXRwdXQgb2JqZWN0LiBBcHBsaWNhdGlvbnMgZG9uJ3QgYWNjZXNzIGl0cyBjb250ZW50cyBkaXJlY3RseS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9vdXRwdXQgc25kX291dHB1dF90OworCisvKiogT3V0cHV0IHR5cGUuICovCit0eXBlZGVmIGVudW0gX3NuZF9vdXRwdXRfdHlwZSB7CisJLyoqIE91dHB1dCB0byBhIHN0ZGlvIHN0cmVhbS4gKi8KKwlTTkRfT1VUUFVUX1NURElPLAorCS8qKiBPdXRwdXQgdG8gYSBtZW1vcnkgYnVmZmVyLiAqLworCVNORF9PVVRQVVRfQlVGRkVSCit9IHNuZF9vdXRwdXRfdHlwZV90OworCitpbnQgc25kX291dHB1dF9zdGRpb19vcGVuKHNuZF9vdXRwdXRfdCAqKm91dHB1dHAsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUpOworaW50IHNuZF9vdXRwdXRfc3RkaW9fYXR0YWNoKHNuZF9vdXRwdXRfdCAqKm91dHB1dHAsIEZJTEUgKmZwLCBpbnQgX2Nsb3NlKTsKK2ludCBzbmRfb3V0cHV0X2J1ZmZlcl9vcGVuKHNuZF9vdXRwdXRfdCAqKm91dHB1dHApOworc2l6ZV90IHNuZF9vdXRwdXRfYnVmZmVyX3N0cmluZyhzbmRfb3V0cHV0X3QgKm91dHB1dCwgY2hhciAqKmJ1Zik7CitpbnQgc25kX291dHB1dF9jbG9zZShzbmRfb3V0cHV0X3QgKm91dHB1dCk7CitpbnQgc25kX291dHB1dF9wcmludGYoc25kX291dHB1dF90ICpvdXRwdXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmbmRlZiBET0NfSElEREVOCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpCisjZW5kaWYKKwk7CitpbnQgc25kX291dHB1dF92cHJpbnRmKHNuZF9vdXRwdXRfdCAqb3V0cHV0LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CitpbnQgc25kX291dHB1dF9wdXRzKHNuZF9vdXRwdXRfdCAqb3V0cHV0LCBjb25zdCBjaGFyICpzdHIpOworaW50IHNuZF9vdXRwdXRfcHV0YyhzbmRfb3V0cHV0X3QgKm91dHB1dCwgaW50IGMpOworaW50IHNuZF9vdXRwdXRfZmx1c2goc25kX291dHB1dF90ICpvdXRwdXQpOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9PVVRQVVRfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5ZmNhMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY20uaApAQCAtMCwwICsxLDExMTMgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY20uaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyLgorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfUENNX0gKKyNkZWZpbmUgX19BTFNBX1BDTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFBDTSBQQ00gSW50ZXJmYWNlCisgKiAgU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiAgXHsKKyAqLworCisvKiogZGxzeW0gdmVyc2lvbiBmb3IgaW50ZXJmYWNlIGVudHJ5IGNhbGxiYWNrICovCisjZGVmaW5lIFNORF9QQ01fRExTWU1fVkVSU0lPTgkJX2Rsc3ltX3BjbV8wMDEKKworLyoqIFBDTSBnZW5lcmljIGluZm8gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9pbmZvIHNuZF9wY21faW5mb190OworLyoqIFBDTSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIHNwYWNlIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21faHdfcGFyYW1zIHNuZF9wY21faHdfcGFyYW1zX3Q7CisvKiogUENNIHNvZnR3YXJlIGNvbmZpZ3VyYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9zd19wYXJhbXMgc25kX3BjbV9zd19wYXJhbXNfdDsKKy8qKiBQQ00gc3RhdHVzIGNvbnRhaW5lciAqLworIHR5cGVkZWYgc3RydWN0IF9zbmRfcGNtX3N0YXR1cyBzbmRfcGNtX3N0YXR1c190OworLyoqIFBDTSBhY2Nlc3MgdHlwZXMgbWFzayAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fYWNjZXNzX21hc2sgc25kX3BjbV9hY2Nlc3NfbWFza190OworLyoqIFBDTSBmb3JtYXRzIG1hc2sgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2Zvcm1hdF9tYXNrIHNuZF9wY21fZm9ybWF0X21hc2tfdDsKKy8qKiBQQ00gc3ViZm9ybWF0cyBtYXNrICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9zdWJmb3JtYXRfbWFzayBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3Q7CisKKy8qKiBQQ00gY2xhc3MgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9jbGFzcyB7CisJLyoqIHN0YW5kYXJkIGRldmljZSAqLworCisJU05EX1BDTV9DTEFTU19HRU5FUklDID0gMCwKKwkvKiogbXVsdGljaGFubmVsIGRldmljZSAqLworCVNORF9QQ01fQ0xBU1NfTVVMVEksCisJLyoqIHNvZnR3YXJlIG1vZGVtIGRldmljZSAqLworCVNORF9QQ01fQ0xBU1NfTU9ERU0sCisJLyoqIGRpZ2l0aXplciBkZXZpY2UgKi8KKwlTTkRfUENNX0NMQVNTX0RJR0lUSVpFUiwKKwlTTkRfUENNX0NMQVNTX0xBU1QgPSBTTkRfUENNX0NMQVNTX0RJR0lUSVpFUgorfSBzbmRfcGNtX2NsYXNzX3Q7CisKKy8qKiBQQ00gc3ViY2xhc3MgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9zdWJjbGFzcyB7CisJLyoqIHN1YmRldmljZXMgYXJlIG1peGVkIHRvZ2V0aGVyICovCisJU05EX1BDTV9TVUJDTEFTU19HRU5FUklDX01JWCA9IDAsCisJLyoqIG11bHRpY2hhbm5lbCBzdWJkZXZpY2VzIGFyZSBtaXhlZCB0b2dldGhlciAqLworCVNORF9QQ01fU1VCQ0xBU1NfTVVMVElfTUlYLAorCVNORF9QQ01fU1VCQ0xBU1NfTEFTVCA9IFNORF9QQ01fU1VCQ0xBU1NfTVVMVElfTUlYCit9IHNuZF9wY21fc3ViY2xhc3NfdDsKKworLyoqIFBDTSBzdHJlYW0gKGRpcmVjdGlvbikgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9zdHJlYW0geworCS8qKiBQbGF5YmFjayBzdHJlYW0gKi8KKwlTTkRfUENNX1NUUkVBTV9QTEFZQkFDSyA9IDAsCisJLyoqIENhcHR1cmUgc3RyZWFtICovCisJU05EX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwlTTkRfUENNX1NUUkVBTV9MQVNUID0gU05EX1BDTV9TVFJFQU1fQ0FQVFVSRQorfSBzbmRfcGNtX3N0cmVhbV90OworCisvKiogUENNIGFjY2VzcyB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fYWNjZXNzIHsKKwkvKiogbW1hcCBhY2Nlc3Mgd2l0aCBzaW1wbGUgaW50ZXJsZWF2ZWQgY2hhbm5lbHMgKi8KKwlTTkRfUENNX0FDQ0VTU19NTUFQX0lOVEVSTEVBVkVEID0gMCwKKwkvKiogbW1hcCBhY2Nlc3Mgd2l0aCBzaW1wbGUgbm9uIGludGVybGVhdmVkIGNoYW5uZWxzICovCisJU05EX1BDTV9BQ0NFU1NfTU1BUF9OT05JTlRFUkxFQVZFRCwKKwkvKiogbW1hcCBhY2Nlc3Mgd2l0aCBjb21wbGV4IHBsYWNlbWVudCAqLworCVNORF9QQ01fQUNDRVNTX01NQVBfQ09NUExFWCwKKwkvKiogc25kX3BjbV9yZWFkaS9zbmRfcGNtX3dyaXRlaSBhY2Nlc3MgKi8KKwlTTkRfUENNX0FDQ0VTU19SV19JTlRFUkxFQVZFRCwKKwkvKiogc25kX3BjbV9yZWFkbi9zbmRfcGNtX3dyaXRlbiBhY2Nlc3MgKi8KKwlTTkRfUENNX0FDQ0VTU19SV19OT05JTlRFUkxFQVZFRCwKKwlTTkRfUENNX0FDQ0VTU19MQVNUID0gU05EX1BDTV9BQ0NFU1NfUldfTk9OSU5URVJMRUFWRUQKK30gc25kX3BjbV9hY2Nlc3NfdDsKKworLyoqIFBDTSBzYW1wbGUgZm9ybWF0ICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fZm9ybWF0IHsKKwkvKiogVW5rbm93biAqLworCVNORF9QQ01fRk9STUFUX1VOS05PV04gPSAtMSwKKwkvKiogU2lnbmVkIDggYml0ICovCisJU05EX1BDTV9GT1JNQVRfUzggPSAwLAorCS8qKiBVbnNpZ25lZCA4IGJpdCAqLworCVNORF9QQ01fRk9STUFUX1U4LAorCS8qKiBTaWduZWQgMTYgYml0IExpdHRsZSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMTZfTEUsCisJLyoqIFNpZ25lZCAxNiBiaXQgQmlnIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1MxNl9CRSwKKwkvKiogVW5zaWduZWQgMTYgYml0IExpdHRsZSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9VMTZfTEUsCisJLyoqIFVuc2lnbmVkIDE2IGJpdCBCaWcgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTE2X0JFLAorCS8qKiBTaWduZWQgMjQgYml0IExpdHRsZSBFbmRpYW4gdXNpbmcgbG93IHRocmVlIGJ5dGVzIGluIDMyLWJpdCB3b3JkICovCisJU05EX1BDTV9GT1JNQVRfUzI0X0xFLAorCS8qKiBTaWduZWQgMjQgYml0IEJpZyBFbmRpYW4gdXNpbmcgbG93IHRocmVlIGJ5dGVzIGluIDMyLWJpdCB3b3JkICovCisJU05EX1BDTV9GT1JNQVRfUzI0X0JFLAorCS8qKiBVbnNpZ25lZCAyNCBiaXQgTGl0dGxlIEVuZGlhbiB1c2luZyBsb3cgdGhyZWUgYnl0ZXMgaW4gMzItYml0IHdvcmQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjRfTEUsCisJLyoqIFVuc2lnbmVkIDI0IGJpdCBCaWcgRW5kaWFuIHVzaW5nIGxvdyB0aHJlZSBieXRlcyBpbiAzMi1iaXQgd29yZCAqLworCVNORF9QQ01fRk9STUFUX1UyNF9CRSwKKwkvKiogU2lnbmVkIDMyIGJpdCBMaXR0bGUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzMyX0xFLAorCS8qKiBTaWduZWQgMzIgYml0IEJpZyBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9TMzJfQkUsCisJLyoqIFVuc2lnbmVkIDMyIGJpdCBMaXR0bGUgRW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfVTMyX0xFLAorCS8qKiBVbnNpZ25lZCAzMiBiaXQgQmlnIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UzMl9CRSwKKwkvKiogRmxvYXQgMzIgYml0IExpdHRsZSBFbmRpYW4sIFJhbmdlIC0xLjAgdG8gMS4wICovCisJU05EX1BDTV9GT1JNQVRfRkxPQVRfTEUsCisJLyoqIEZsb2F0IDMyIGJpdCBCaWcgRW5kaWFuLCBSYW5nZSAtMS4wIHRvIDEuMCAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUX0JFLAorCS8qKiBGbG9hdCA2NCBiaXQgTGl0dGxlIEVuZGlhbiwgUmFuZ2UgLTEuMCB0byAxLjAgKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVDY0X0xFLAorCS8qKiBGbG9hdCA2NCBiaXQgQmlnIEVuZGlhbiwgUmFuZ2UgLTEuMCB0byAxLjAgKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVDY0X0JFLAorCS8qKiBJRUMtOTU4IExpdHRsZSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfTEUsCisJLyoqIElFQy05NTggQmlnIEVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0lFQzk1OF9TVUJGUkFNRV9CRSwKKwkvKiogTXUtTGF3ICovCisJU05EX1BDTV9GT1JNQVRfTVVfTEFXLAorCS8qKiBBLUxhdyAqLworCVNORF9QQ01fRk9STUFUX0FfTEFXLAorCS8qKiBJbWEtQURQQ00gKi8KKwlTTkRfUENNX0ZPUk1BVF9JTUFfQURQQ00sCisJLyoqIE1QRUcgKi8KKwlTTkRfUENNX0ZPUk1BVF9NUEVHLAorCS8qKiBHU00gKi8KKwlTTkRfUENNX0ZPUk1BVF9HU00sCisJLyoqIFNwZWNpYWwgKi8KKwlTTkRfUENNX0ZPUk1BVF9TUEVDSUFMID0gMzEsCisJLyoqIFNpZ25lZCAyNGJpdCBMaXR0bGUgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjRfM0xFID0gMzIsCisJLyoqIFNpZ25lZCAyNGJpdCBCaWcgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMjRfM0JFLAorCS8qKiBVbnNpZ25lZCAyNGJpdCBMaXR0bGUgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjRfM0xFLAorCS8qKiBVbnNpZ25lZCAyNGJpdCBCaWcgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9VMjRfM0JFLAorCS8qKiBTaWduZWQgMjBiaXQgTGl0dGxlIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfUzIwXzNMRSwKKwkvKiogU2lnbmVkIDIwYml0IEJpZyBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1MyMF8zQkUsCisJLyoqIFVuc2lnbmVkIDIwYml0IExpdHRsZSBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1UyMF8zTEUsCisJLyoqIFVuc2lnbmVkIDIwYml0IEJpZyBFbmRpYW4gaW4gM2J5dGVzIGZvcm1hdCAqLworCVNORF9QQ01fRk9STUFUX1UyMF8zQkUsCisJLyoqIFNpZ25lZCAxOGJpdCBMaXR0bGUgRW5kaWFuIGluIDNieXRlcyBmb3JtYXQgKi8KKwlTTkRfUENNX0ZPUk1BVF9TMThfM0xFLAorCS8qKiBTaWduZWQgMThiaXQgQmlnIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfUzE4XzNCRSwKKwkvKiogVW5zaWduZWQgMThiaXQgTGl0dGxlIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfVTE4XzNMRSwKKwkvKiogVW5zaWduZWQgMThiaXQgQmlnIEVuZGlhbiBpbiAzYnl0ZXMgZm9ybWF0ICovCisJU05EX1BDTV9GT1JNQVRfVTE4XzNCRSwKKwlTTkRfUENNX0ZPUk1BVF9MQVNUID0gU05EX1BDTV9GT1JNQVRfVTE4XzNCRSwKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwkvKiogU2lnbmVkIDE2IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzE2ID0gU05EX1BDTV9GT1JNQVRfUzE2X0xFLAorCS8qKiBVbnNpZ25lZCAxNiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UxNiA9IFNORF9QQ01fRk9STUFUX1UxNl9MRSwKKwkvKiogU2lnbmVkIDI0IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzI0ID0gU05EX1BDTV9GT1JNQVRfUzI0X0xFLAorCS8qKiBVbnNpZ25lZCAyNCBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UyNCA9IFNORF9QQ01fRk9STUFUX1UyNF9MRSwKKwkvKiogU2lnbmVkIDMyIGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzMyID0gU05EX1BDTV9GT1JNQVRfUzMyX0xFLAorCS8qKiBVbnNpZ25lZCAzMiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UzMiA9IFNORF9QQ01fRk9STUFUX1UzMl9MRSwKKwkvKiogRmxvYXQgMzIgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVCA9IFNORF9QQ01fRk9STUFUX0ZMT0FUX0xFLAorCS8qKiBGbG9hdCA2NCBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUNjQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVDY0X0xFLAorCS8qKiBJRUMtOTU4IENQVSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUUgPSBTTkRfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfTEUKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwkvKiogU2lnbmVkIDE2IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzE2ID0gU05EX1BDTV9GT1JNQVRfUzE2X0JFLAorCS8qKiBVbnNpZ25lZCAxNiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UxNiA9IFNORF9QQ01fRk9STUFUX1UxNl9CRSwKKwkvKiogU2lnbmVkIDI0IGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzI0ID0gU05EX1BDTV9GT1JNQVRfUzI0X0JFLAorCS8qKiBVbnNpZ25lZCAyNCBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UyNCA9IFNORF9QQ01fRk9STUFUX1UyNF9CRSwKKwkvKiogU2lnbmVkIDMyIGJpdCBDUFUgZW5kaWFuICovCisJU05EX1BDTV9GT1JNQVRfUzMyID0gU05EX1BDTV9GT1JNQVRfUzMyX0JFLAorCS8qKiBVbnNpZ25lZCAzMiBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX1UzMiA9IFNORF9QQ01fRk9STUFUX1UzMl9CRSwKKwkvKiogRmxvYXQgMzIgYml0IENQVSBlbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9GTE9BVCA9IFNORF9QQ01fRk9STUFUX0ZMT0FUX0JFLAorCS8qKiBGbG9hdCA2NCBiaXQgQ1BVIGVuZGlhbiAqLworCVNORF9QQ01fRk9STUFUX0ZMT0FUNjQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVDY0X0JFLAorCS8qKiBJRUMtOTU4IENQVSBFbmRpYW4gKi8KKwlTTkRfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUUgPSBTTkRfUENNX0ZPUk1BVF9JRUM5NThfU1VCRlJBTUVfQkUKKyNlbHNlCisjZXJyb3IgIlVua25vd24gZW5kaWFuIgorI2VuZGlmCit9IHNuZF9wY21fZm9ybWF0X3Q7CisKKy8qKiBQQ00gc2FtcGxlIHN1YmZvcm1hdCAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3N1YmZvcm1hdCB7CisJLyoqIFN0YW5kYXJkICovCisJU05EX1BDTV9TVUJGT1JNQVRfU1REID0gMCwKKwlTTkRfUENNX1NVQkZPUk1BVF9MQVNUID0gU05EX1BDTV9TVUJGT1JNQVRfU1RECit9IHNuZF9wY21fc3ViZm9ybWF0X3Q7CisKKy8qKiBQQ00gc3RhdGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV9zdGF0ZSB7CisJLyoqIE9wZW4gKi8KKwlTTkRfUENNX1NUQVRFX09QRU4gPSAwLAorCS8qKiBTZXR1cCBpbnN0YWxsZWQgKi8gCisJU05EX1BDTV9TVEFURV9TRVRVUCwKKwkvKiogUmVhZHkgdG8gc3RhcnQgKi8KKwlTTkRfUENNX1NUQVRFX1BSRVBBUkVELAorCS8qKiBSdW5uaW5nICovCisJU05EX1BDTV9TVEFURV9SVU5OSU5HLAorCS8qKiBTdG9wcGVkOiB1bmRlcnJ1biAocGxheWJhY2spIG9yIG92ZXJydW4gKGNhcHR1cmUpIGRldGVjdGVkICovCisJU05EX1BDTV9TVEFURV9YUlVOLAorCS8qKiBEcmFpbmluZzogcnVubmluZyAocGxheWJhY2spIG9yIHN0b3BwZWQgKGNhcHR1cmUpICovCisJU05EX1BDTV9TVEFURV9EUkFJTklORywKKwkvKiogUGF1c2VkICovCisJU05EX1BDTV9TVEFURV9QQVVTRUQsCisJLyoqIEhhcmR3YXJlIGlzIHN1c3BlbmRlZCAqLworCVNORF9QQ01fU1RBVEVfU1VTUEVOREVELAorCS8qKiBIYXJkd2FyZSBpcyBkaXNjb25uZWN0ZWQgKi8KKwlTTkRfUENNX1NUQVRFX0RJU0NPTk5FQ1RFRCwKKwlTTkRfUENNX1NUQVRFX0xBU1QgPSBTTkRfUENNX1NUQVRFX0RJU0NPTk5FQ1RFRAorfSBzbmRfcGNtX3N0YXRlX3Q7CisKKy8qKiBQQ00gc3RhcnQgbW9kZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcGNtX3N0YXJ0IHsKKwkvKiogQXV0b21hdGljIHN0YXJ0IG9uIGRhdGEgcmVhZC93cml0ZSAqLworCVNORF9QQ01fU1RBUlRfREFUQSA9IDAsCisJLyoqIEV4cGxpY2l0IHN0YXJ0ICovCisJU05EX1BDTV9TVEFSVF9FWFBMSUNJVCwKKwlTTkRfUENNX1NUQVJUX0xBU1QgPSBTTkRfUENNX1NUQVJUX0VYUExJQ0lUCit9IHNuZF9wY21fc3RhcnRfdDsKKworLyoqIFBDTSB4cnVuIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV94cnVuIHsKKwkvKiogWHJ1biBkZXRlY3Rpb24gZGlzYWJsZWQgKi8KKwlTTkRfUENNX1hSVU5fTk9ORSA9IDAsCisJLyoqIFN0b3Agb24geHJ1biBkZXRlY3Rpb24gKi8KKwlTTkRfUENNX1hSVU5fU1RPUCwKKwlTTkRfUENNX1hSVU5fTEFTVCA9IFNORF9QQ01fWFJVTl9TVE9QCit9IHNuZF9wY21feHJ1bl90OworCisvKiogUENNIHRpbWVzdGFtcCBtb2RlICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21fdHN0YW1wIHsKKwkvKiogTm8gdGltZXN0YW1wICovCisJU05EX1BDTV9UU1RBTVBfTk9ORSA9IDAsCisJLyoqIFVwZGF0ZSBtbWFwJ2VkIHRpbWVzdGFtcCAqLworCVNORF9QQ01fVFNUQU1QX01NQVAsCisJU05EX1BDTV9UU1RBTVBfTEFTVCA9IFNORF9QQ01fVFNUQU1QX01NQVAKK30gc25kX3BjbV90c3RhbXBfdDsKKworLyoqIFVuc2lnbmVkIGZyYW1lcyBxdWFudGl0eSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNuZF9wY21fdWZyYW1lc190OworLyoqIFNpZ25lZCBmcmFtZXMgcXVhbnRpdHkgKi8KK3R5cGVkZWYgbG9uZyBzbmRfcGNtX3NmcmFtZXNfdDsKKworLyoqIE5vbiBibG9ja2luZyBtb2RlIChmbGFnIGZvciBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX1BDTV9OT05CTE9DSwkJMHgwMDAxCisvKiogQXN5bmMgbm90aWZpY2F0aW9uIChmbGFnIGZvciBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX1BDTV9BU1lOQwkJCTB4MDAwMgorCisvKiogUENNIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY20gc25kX3BjbV90OworCisvKiogUENNIHR5cGUgKi8KK2VudW0gX3NuZF9wY21fdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfSFcgPSAwLAorCS8qKiBIb29rZWQgUENNICovCisJU05EX1BDTV9UWVBFX0hPT0tTLAorCS8qKiBPbmUgb3IgbW9yZSBsaW5rZWQgUENNIHdpdGggZXhjbHVzaXZlIGFjY2VzcyB0byBzZWxlY3RlZAorCSAgICBjaGFubmVscyAqLworCVNORF9QQ01fVFlQRV9NVUxUSSwKKwkvKiogRmlsZSB3cml0aW5nIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9GSUxFLAorCS8qKiBOdWxsIGVuZHBvaW50IFBDTSAqLworCVNORF9QQ01fVFlQRV9OVUxMLAorCS8qKiBTaGFyZWQgbWVtb3J5IGNsaWVudCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfU0hNLAorCS8qKiBJTkVUIGNsaWVudCBQQ00gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1BDTV9UWVBFX0lORVQsCisJLyoqIENvcHlpbmcgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0NPUFksCisJLyoqIExpbmVhciBmb3JtYXQgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfTElORUFSLAorCS8qKiBBLUxhdyBmb3JtYXQgY29udmVyc2lvbiBQQ00gKi8KKwlTTkRfUENNX1RZUEVfQUxBVywKKwkvKiogTXUtTGF3IGZvcm1hdCBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9NVUxBVywKKwkvKiogSU1BLUFEUENNIGZvcm1hdCBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9BRFBDTSwKKwkvKiogUmF0ZSBjb252ZXJzaW9uIFBDTSAqLworCVNORF9QQ01fVFlQRV9SQVRFLAorCS8qKiBBdHRlbnVhdGVkIHN0YXRpYyByb3V0ZSBQQ00gKi8KKwlTTkRfUENNX1RZUEVfUk9VVEUsCisJLyoqIEZvcm1hdCBhZGp1c3RlZCBQQ00gKi8KKwlTTkRfUENNX1RZUEVfUExVRywKKwkvKiogU2hhcmluZyBQQ00gKi8KKwlTTkRfUENNX1RZUEVfU0hBUkUsCisJLyoqIE1ldGVyIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9NRVRFUiwKKwkvKiogTWl4aW5nIFBDTSAqLworCVNORF9QQ01fVFlQRV9NSVgsCisJLyoqIEF0dGVudWF0ZWQgZHluYW1pYyByb3V0ZSBQQ00gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1BDTV9UWVBFX0RST1VURSwKKwkvKiogTG9vcGJhY2sgc2VydmVyIHBsdWdpbiAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfUENNX1RZUEVfTEJTRVJWRVIsCisJLyoqIExpbmVhciBJbnRlZ2VyIDwtPiBMaW5lYXIgRmxvYXQgZm9ybWF0IGNvbnZlcnNpb24gUENNICovCisJU05EX1BDTV9UWVBFX0xJTkVBUl9GTE9BVCwKKwkvKiogTEFEU1BBIGludGVncmF0aW9uIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9MQURTUEEsCisJLyoqIERpcmVjdCBNaXhpbmcgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0RNSVgsCisJLyoqIEphY2sgQXVkaW8gQ29ubmVjdGlvbiBLaXQgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0pBQ0ssCisJLyoqIERpcmVjdCBTbm9vcGluZyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfRFNOT09QLAorCS8qKiBEaXJlY3QgU2hhcmluZyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfRFNIQVJFLAorCS8qKiBJRUM5NTggc3ViZnJhbWUgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0lFQzk1OCwKKwkvKiogU29mdCB2b2x1bWUgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX1NPRlRWT0wsCisJLyoqIEV4dGVybmFsIEkvTyBwbHVnaW4gKi8KKwlTTkRfUENNX1RZUEVfSU9QTFVHLAorCS8qKiBFeHRlcm5hbCBmaWx0ZXIgcGx1Z2luICovCisJU05EX1BDTV9UWVBFX0VYVFBMVUcsCisJLyoqIE1tYXAtZW11bGF0aW9uIHBsdWdpbiAqLworCVNORF9QQ01fVFlQRV9NTUFQX0VNVUwsCisJU05EX1BDTV9UWVBFX0xBU1QgPSBTTkRfUENNX1RZUEVfTU1BUF9FTVVMCit9OworCisvKiogUENNIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3BjbV90eXBlIHNuZF9wY21fdHlwZV90OworCisvKiogUENNIGFyZWEgc3BlY2lmaWNhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fY2hhbm5lbF9hcmVhIHsKKwkvKiogYmFzZSBhZGRyZXNzIG9mIGNoYW5uZWwgc2FtcGxlcyAqLworCXZvaWQgKmFkZHI7CisJLyoqIG9mZnNldCB0byBmaXJzdCBzYW1wbGUgaW4gYml0cyAqLworCXVuc2lnbmVkIGludCBmaXJzdDsKKwkvKiogc2FtcGxlcyBkaXN0YW5jZSBpbiBiaXRzICovCisJdW5zaWduZWQgaW50IHN0ZXA7Cit9IHNuZF9wY21fY2hhbm5lbF9hcmVhX3Q7CisKKy8qKiBQQ00gc3luY2hyb25pemF0aW9uIElEICovCit0eXBlZGVmIHVuaW9uIF9zbmRfcGNtX3N5bmNfaWQgeworCS8qKiA4LWJpdCBJRCAqLworCXVuc2lnbmVkIGNoYXIgaWRbMTZdOworCS8qKiAxNi1iaXQgSUQgKi8KKwl1bnNpZ25lZCBzaG9ydCBpZDE2WzhdOworCS8qKiAzMi1iaXQgSUQgKi8KKwl1bnNpZ25lZCBpbnQgaWQzMls0XTsKK30gc25kX3BjbV9zeW5jX2lkX3Q7CisKKy8qKiAjU05EX1BDTV9UWVBFX01FVEVSIHNjb3BlIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fc2NvcGUgc25kX3BjbV9zY29wZV90OworCitpbnQgc25kX3BjbV9vcGVuKHNuZF9wY21fdCAqKnBjbSwgY29uc3QgY2hhciAqbmFtZSwgCisJCSBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworaW50IHNuZF9wY21fb3Blbl9sY29uZihzbmRfcGNtX3QgKipwY20sIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlLAorCQkgICAgICAgc25kX2NvbmZpZ190ICpsY29uZik7CisKK2ludCBzbmRfcGNtX2Nsb3NlKHNuZF9wY21fdCAqcGNtKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fbmFtZShzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3R5cGVfdCBzbmRfcGNtX3R5cGUoc25kX3BjbV90ICpwY20pOworc25kX3BjbV9zdHJlYW1fdCBzbmRfcGNtX3N0cmVhbShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnMoc25kX3BjbV90ICpwY20sIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX3BjbV90ICpwY20sIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CitpbnQgc25kX3BjbV9ub25ibG9jayhzbmRfcGNtX3QgKnBjbSwgaW50IG5vbmJsb2NrKTsKK2ludCBzbmRfYXN5bmNfYWRkX3BjbV9oYW5kbGVyKHNuZF9hc3luY19oYW5kbGVyX3QgKipoYW5kbGVyLCBzbmRfcGNtX3QgKnBjbSwgCisJCQkgICAgICBzbmRfYXN5bmNfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKK3NuZF9wY21fdCAqc25kX2FzeW5jX2hhbmRsZXJfZ2V0X3BjbShzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfcGNtX2luZm8oc25kX3BjbV90ICpwY20sIHNuZF9wY21faW5mb190ICppbmZvKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jdXJyZW50KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfZnJlZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfY3VycmVudChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3ByZXBhcmUoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fcmVzZXQoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fc3RhdHVzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N0YXR1c190ICpzdGF0dXMpOworaW50IHNuZF9wY21fc3RhcnQoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fZHJvcChzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9kcmFpbihzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9wYXVzZShzbmRfcGNtX3QgKnBjbSwgaW50IGVuYWJsZSk7CitzbmRfcGNtX3N0YXRlX3Qgc25kX3BjbV9zdGF0ZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9od3N5bmMoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fZGVsYXkoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc2ZyYW1lc190ICpkZWxheXApOworaW50IHNuZF9wY21fcmVzdW1lKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fYXZhaWxfdXBkYXRlKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fcmV3aW5kKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9mb3J3YXJkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV93cml0ZWkoc25kX3BjbV90ICpwY20sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3JlYWRpKHNuZF9wY21fdCAqcGNtLCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV93cml0ZW4oc25kX3BjbV90ICpwY20sIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fcmVhZG4oc25kX3BjbV90ICpwY20sIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK2ludCBzbmRfcGNtX3dhaXQoc25kX3BjbV90ICpwY20sIGludCB0aW1lb3V0KTsKKworaW50IHNuZF9wY21fbGluayhzbmRfcGNtX3QgKnBjbTEsIHNuZF9wY21fdCAqcGNtMik7CitpbnQgc25kX3BjbV91bmxpbmsoc25kX3BjbV90ICpwY20pOworCisvKgorICogYXBwbGljYXRpb24gaGVscGVycyAtIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wCisgKiBvZiB0aGUgYmFzaWMgQVBJCisgKi8KKworaW50IHNuZF9wY21fcmVjb3ZlcihzbmRfcGNtX3QgKnBjbSwgaW50IGVyciwgaW50IHNpbGVudCk7CitpbnQgc25kX3BjbV9zZXRfcGFyYW1zKHNuZF9wY21fdCAqcGNtLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9hY2Nlc3NfdCBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzb2Z0X3Jlc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGF0ZW5jeSk7CitpbnQgc25kX3BjbV9nZXRfcGFyYW1zKHNuZF9wY21fdCAqcGNtLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCAqYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNuZF9wY21fdWZyYW1lc190ICpwZXJpb2Rfc2l6ZSk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fSW5mbyBTdHJlYW0gSW5mb3JtYXRpb24KKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcGNtX2luZm9fdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21faW5mb19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9wY21faW5mb190ICopIGFsbG9jYShzbmRfcGNtX2luZm9fc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3BjbV9pbmZvX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfcGNtX2luZm9fbWFsbG9jKHNuZF9wY21faW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9pbmZvX2ZyZWUoc25kX3BjbV9pbmZvX3QgKm9iaik7Cit2b2lkIHNuZF9wY21faW5mb19jb3B5KHNuZF9wY21faW5mb190ICpkc3QsIGNvbnN0IHNuZF9wY21faW5mb190ICpzcmMpOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfZGV2aWNlKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworc25kX3BjbV9zdHJlYW1fdCBzbmRfcGNtX2luZm9fZ2V0X3N0cmVhbShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK2ludCBzbmRfcGNtX2luZm9fZ2V0X2NhcmQoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7Citjb25zdCBjaGFyICpzbmRfcGNtX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3BjbV9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3BjbV9pbmZvX2dldF9zdWJkZXZpY2VfbmFtZShjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3NuZF9wY21fY2xhc3NfdCBzbmRfcGNtX2luZm9fZ2V0X2NsYXNzKGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOworc25kX3BjbV9zdWJjbGFzc190IHNuZF9wY21faW5mb19nZXRfc3ViY2xhc3MoY29uc3Qgc25kX3BjbV9pbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9pbmZvX2dldF9zdWJkZXZpY2VzX2NvdW50KGNvbnN0IHNuZF9wY21faW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9wY21faW5mb19nZXRfc3ViZGV2aWNlc19hdmFpbChjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3NuZF9wY21fc3luY19pZF90IHNuZF9wY21faW5mb19nZXRfc3luYyhjb25zdCBzbmRfcGNtX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9pbmZvX3NldF9kZXZpY2Uoc25kX3BjbV9pbmZvX3QgKm9iaiwgdW5zaWduZWQgaW50IHZhbCk7Cit2b2lkIHNuZF9wY21faW5mb19zZXRfc3ViZGV2aWNlKHNuZF9wY21faW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcGNtX2luZm9fc2V0X3N0cmVhbShzbmRfcGNtX2luZm9fdCAqb2JqLCBzbmRfcGNtX3N0cmVhbV90IHZhbCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fSFdfUGFyYW1zIEhhcmR3YXJlIFBhcmFtZXRlcnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19hbnkoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jYW5fbW1hcF9zYW1wbGVfcmVzb2x1dGlvbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2RvdWJsZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2JhdGNoKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfaXNfYmxvY2tfdHJhbnNmZXIoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jYW5fb3ZlcnJhbmdlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX3BhdXNlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX3Jlc3VtZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2lzX2hhbGZfZHVwbGV4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfaXNfam9pbnRfZHVwbGV4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfY2FuX3N5bmNfc3RhcnQoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9udW1kZW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmF0ZV9udW0sCisJCQkJICAgICAgdW5zaWduZWQgaW50ICpyYXRlX2Rlbik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3NiaXRzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2ZpZm9fc2l6ZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCisjaWYgMAordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21faHdfc3RyYXRlZ3kgc25kX3BjbV9od19zdHJhdGVneV90OworCisvKiBjaG9pY2VzIG5lZWQgdG8gYmUgc29ydGVkIG9uIGFzY2VuZGluZyBiYWRuZXNzICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3BjbV9od19zdHJhdGVneV9zaW1wbGVfY2hvaWNlc19saXN0IHsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdW5zaWduZWQgaW50IGJhZG5lc3M7Cit9IHNuZF9wY21faHdfc3RyYXRlZ3lfc2ltcGxlX2Nob2ljZXNfbGlzdF90OworCitpbnQgc25kX3BjbV9od19wYXJhbXNfc3RyYXRlZ3koc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywKKwkJCSAgICAgICBjb25zdCBzbmRfcGNtX2h3X3N0cmF0ZWd5X3QgKnN0cmF0ZWd5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBiYWRuZXNzX21pbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYmFkbmVzc19tYXgpOworCit2b2lkIHNuZF9wY21faHdfc3RyYXRlZ3lfZnJlZShzbmRfcGNtX2h3X3N0cmF0ZWd5X3QgKnN0cmF0ZWd5KTsKK2ludCBzbmRfcGNtX2h3X3N0cmF0ZWd5X3NpbXBsZShzbmRfcGNtX2h3X3N0cmF0ZWd5X3QgKipzdHJhdGVneXAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhZG5lc3NfbWluLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBiYWRuZXNzX21heCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdHJ5X2V4cGxhaW5fZmFpbHVyZShzbmRfcGNtX3QgKnBjbSwKKwkJCQkJICBzbmRfcGNtX2h3X3BhcmFtc190ICpmYWlsLAorCQkJCQkgIHNuZF9wY21faHdfcGFyYW1zX3QgKnN1Y2Nlc3MsCisJCQkJCSAgdW5zaWduZWQgaW50IGRlcHRoLAorCQkJCQkgIHNuZF9vdXRwdXRfdCAqb3V0KTsKKworI2VuZGlmCisKK3NpemVfdCBzbmRfcGNtX2h3X3BhcmFtc19zaXplb2Yodm9pZCk7CisvKiogXGhpZGVpbml0aWFsaXplcgorICogXGJyaWVmIGFsbG9jYXRlIGFuIGludmFsaWQgI3NuZF9wY21faHdfcGFyYW1zX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcGNtX2h3X3BhcmFtc19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9wY21faHdfcGFyYW1zX3QgKikgYWxsb2NhKHNuZF9wY21faHdfcGFyYW1zX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIHNuZF9wY21faHdfcGFyYW1zX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19tYWxsb2Moc25kX3BjbV9od19wYXJhbXNfdCAqKnB0cik7Cit2b2lkIHNuZF9wY21faHdfcGFyYW1zX2ZyZWUoc25kX3BjbV9od19wYXJhbXNfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9od19wYXJhbXNfY29weShzbmRfcGNtX2h3X3BhcmFtc190ICpkc3QsIGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnNyYyk7CisKKyNpZiAhZGVmaW5lZChBTFNBX0xJQlJBUllfQlVJTEQpICYmICFkZWZpbmVkKEFMU0FfUENNX09MRF9IV19QQVJBTVNfQVBJKQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2FjY2Vzcyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgKl9hY2Nlc3MpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgX2FjY2Vzcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2VzcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCAqX2FjY2Vzcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgKl9hY2Nlc3MpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9hY2Nlc3NfbWFzayhzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X2Zvcm1hdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90ICpmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90ICpmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0X21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3N1YmZvcm1hdChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3QgKnN1YmZvcm1hdCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9zdWJmb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCAqc3ViZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCAqc3ViZm9ybWF0KTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X21hc2soc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrKTsKK3ZvaWQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3N1YmZvcm1hdF9tYXNrKHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICptYXNrKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVscyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9jaGFubmVscyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgdW5zaWduZWQgaW50ICptYXgpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9yYXRlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX3Jlc2FtcGxlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX3Jlc2FtcGxlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZXhwb3J0X2J1ZmZlcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZXhwb3J0X2J1ZmZlcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKmZyYW1lcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqZnJhbWVzLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICpmcmFtZXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBpbnQgKm1pbmRpciwgc25kX3BjbV91ZnJhbWVzX3QgKm1heCwgaW50ICptYXhkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfaW50ZWdlcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9wZXJpb2RzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ludGVnZXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X2J1ZmZlcl9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKm1pbiwgc25kX3BjbV91ZnJhbWVzX3QgKm1heCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3RpY2tfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworCisjZW5kaWYgLyogIUFMU0FfTElCUkFSWV9CVUlMRCAmJiAhQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkgKi8KKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9taW5fYWxpZ24oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9TV19QYXJhbXMgU29mdHdhcmUgUGFyYW1ldGVycworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworc2l6ZV90IHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3BjbV9zd19wYXJhbXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fc3dfcGFyYW1zX2FsbG9jYShwdHIpIGRvIHsgYXNzZXJ0KHB0cik7ICpwdHIgPSAoc25kX3BjbV9zd19wYXJhbXNfdCAqKSBhbGxvY2Eoc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKCkpOyB9IHdoaWxlICgwKQoraW50IHNuZF9wY21fc3dfcGFyYW1zX21hbGxvYyhzbmRfcGNtX3N3X3BhcmFtc190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9zd19wYXJhbXNfZnJlZShzbmRfcGNtX3N3X3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfcGNtX3N3X3BhcmFtc19jb3B5KHNuZF9wY21fc3dfcGFyYW1zX3QgKmRzdCwgY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqc3JjKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYm91bmRhcnkoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKKworI2lmICFkZWZpbmVkKEFMU0FfTElCUkFSWV9CVUlMRCkgJiYgIWRlZmluZWQoQUxTQV9QQ01fT0xEX1NXX1BBUkFNU19BUEkpCisKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfdHN0YW1wX21vZGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV90c3RhbXBfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF90c3RhbXBfbW9kZShjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdHN0YW1wX3QgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3NsZWVwX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2xlZXBfbWluKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9hdmFpbF9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYXZhaWxfbWluKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3hmZXJfYWxpZ24oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfeGZlcl9hbGlnbihjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc3RhcnRfdGhyZXNob2xkKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtc20sIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdG9wX3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zdG9wX3RocmVzaG9sZChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zaWxlbmNlX3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zaWxlbmNlX3RocmVzaG9sZChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zaWxlbmNlX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV9zaXplKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CisKKyNlbmRpZiAvKiAhQUxTQV9MSUJSQVJZX0JVSUxEICYmICFBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSAqLworCisvKiogXH0gKi8KKworLyogaW5jbHVkZSBvbGQgQVBJICovCisjaWZuZGVmIEFMU0FfTElCUkFSWV9CVUlMRAorI2lmIGRlZmluZWQoQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkpIHx8IGRlZmluZWQoQUxTQV9QQ01fT0xEX1NXX1BBUkFNU19BUEkpCisjaW5jbHVkZSAicGNtX29sZC5oIgorI2VuZGlmCisjZW5kaWYKKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0FjY2VzcyBBY2Nlc3MgTWFzayBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX2FjY2Vzc19tYXNrX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gZW1wdHkgI3NuZF9wY21fYWNjZXNzX21hc2tfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fYWNjZXNzX21hc2tfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKikgYWxsb2NhKHNuZF9wY21fYWNjZXNzX21hc2tfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3BjbV9hY2Nlc3NfbWFza19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3BjbV9hY2Nlc3NfbWFza19tYWxsb2Moc25kX3BjbV9hY2Nlc3NfbWFza190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9hY2Nlc3NfbWFza19mcmVlKHNuZF9wY21fYWNjZXNzX21hc2tfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9hY2Nlc3NfbWFza19jb3B5KHNuZF9wY21fYWNjZXNzX21hc2tfdCAqZHN0LCBjb25zdCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKnNyYyk7Cit2b2lkIHNuZF9wY21fYWNjZXNzX21hc2tfbm9uZShzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2FjY2Vzc19tYXNrX2FueShzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOworaW50IHNuZF9wY21fYWNjZXNzX21hc2tfdGVzdChjb25zdCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2ssIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2FjY2Vzc19tYXNrX2VtcHR5KGNvbnN0IHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fYWNjZXNzX21hc2tfc2V0KHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzaywgc25kX3BjbV9hY2Nlc3NfdCB2YWwpOwordm9pZCBzbmRfcGNtX2FjY2Vzc19tYXNrX3Jlc2V0KHNuZF9wY21fYWNjZXNzX21hc2tfdCAqbWFzaywgc25kX3BjbV9hY2Nlc3NfdCB2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0Zvcm1hdCBGb3JtYXQgTWFzayBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gZW1wdHkgI3NuZF9wY21fZm9ybWF0X21hc2tfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fZm9ybWF0X21hc2tfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKikgYWxsb2NhKHNuZF9wY21fZm9ybWF0X21hc2tfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3BjbV9mb3JtYXRfbWFza19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3BjbV9mb3JtYXRfbWFza19tYWxsb2Moc25kX3BjbV9mb3JtYXRfbWFza190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9mb3JtYXRfbWFza19mcmVlKHNuZF9wY21fZm9ybWF0X21hc2tfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9mb3JtYXRfbWFza19jb3B5KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqZHN0LCBjb25zdCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKnNyYyk7Cit2b2lkIHNuZF9wY21fZm9ybWF0X21hc2tfbm9uZShzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2Zvcm1hdF9tYXNrX2FueShzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOworaW50IHNuZF9wY21fZm9ybWF0X21hc2tfdGVzdChjb25zdCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2ssIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9tYXNrX2VtcHR5KGNvbnN0IHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fZm9ybWF0X21hc2tfc2V0KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOwordm9pZCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3Jlc2V0KHNuZF9wY21fZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9mb3JtYXRfdCB2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX1N1YkZvcm1hdCBTdWJmb3JtYXQgTWFzayBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK3NpemVfdCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gZW1wdHkgI3NuZF9wY21fc3ViZm9ybWF0X21hc2tfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKikgYWxsb2NhKHNuZF9wY21fc3ViZm9ybWF0X21hc2tfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3BjbV9zdWJmb3JtYXRfbWFza19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19tYWxsb2Moc25kX3BjbV9zdWJmb3JtYXRfbWFza190ICoqcHRyKTsKK3ZvaWQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19mcmVlKHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqb2JqKTsKK3ZvaWQgc25kX3BjbV9zdWJmb3JtYXRfbWFza19jb3B5KHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqZHN0LCBjb25zdCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKnNyYyk7Cit2b2lkIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfbm9uZShzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX2FueShzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOworaW50IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdGVzdChjb25zdCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2ssIHNuZF9wY21fc3ViZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX2VtcHR5KGNvbnN0IHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzayk7Cit2b2lkIHNuZF9wY21fc3ViZm9ybWF0X21hc2tfc2V0KHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9zdWJmb3JtYXRfdCB2YWwpOwordm9pZCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3Jlc2V0KHNuZF9wY21fc3ViZm9ybWF0X21hc2tfdCAqbWFzaywgc25kX3BjbV9zdWJmb3JtYXRfdCB2YWwpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX1N0YXR1cyBTdGF0dXMgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCitzaXplX3Qgc25kX3BjbV9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcGNtX3N0YXR1c190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3BjbV9zdGF0dXNfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfcGNtX3N0YXR1c190ICopIGFsbG9jYShzbmRfcGNtX3N0YXR1c19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfcGNtX3N0YXR1c19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3BjbV9zdGF0dXNfbWFsbG9jKHNuZF9wY21fc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfcGNtX3N0YXR1c19mcmVlKHNuZF9wY21fc3RhdHVzX3QgKm9iaik7Cit2b2lkIHNuZF9wY21fc3RhdHVzX2NvcHkoc25kX3BjbV9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfcGNtX3N0YXR1c190ICpzcmMpOworc25kX3BjbV9zdGF0ZV90IHNuZF9wY21fc3RhdHVzX2dldF9zdGF0ZShjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmopOwordm9pZCBzbmRfcGNtX3N0YXR1c19nZXRfdHJpZ2dlcl90c3RhbXAoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqLCBzbmRfdGltZXN0YW1wX3QgKnB0cik7Cit2b2lkIHNuZF9wY21fc3RhdHVzX2dldF90cmlnZ2VyX2h0c3RhbXAoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqLCBzbmRfaHRpbWVzdGFtcF90ICpwdHIpOwordm9pZCBzbmRfcGNtX3N0YXR1c19nZXRfdHN0YW1wKGNvbnN0IHNuZF9wY21fc3RhdHVzX3QgKm9iaiwgc25kX3RpbWVzdGFtcF90ICpwdHIpOwordm9pZCBzbmRfcGNtX3N0YXR1c19nZXRfaHRzdGFtcChjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmosIHNuZF9odGltZXN0YW1wX3QgKnB0cik7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3N0YXR1c19nZXRfZGVsYXkoY29uc3Qgc25kX3BjbV9zdGF0dXNfdCAqb2JqKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3RhdHVzX2dldF9hdmFpbChjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmopOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zdGF0dXNfZ2V0X2F2YWlsX21heChjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmopOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zdGF0dXNfZ2V0X292ZXJyYW5nZShjb25zdCBzbmRfcGNtX3N0YXR1c190ICpvYmopOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0Rlc2NyaXB0aW9uIERlc2NyaXB0aW9uIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworY29uc3QgY2hhciAqc25kX3BjbV90eXBlX25hbWUoc25kX3BjbV90eXBlX3QgdHlwZSk7Citjb25zdCBjaGFyICpzbmRfcGNtX3N0cmVhbV9uYW1lKGNvbnN0IHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fYWNjZXNzX25hbWUoY29uc3Qgc25kX3BjbV9hY2Nlc3NfdCBfYWNjZXNzKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21fZm9ybWF0X25hbWUoY29uc3Qgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworY29uc3QgY2hhciAqc25kX3BjbV9mb3JtYXRfZGVzY3JpcHRpb24oY29uc3Qgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworY29uc3QgY2hhciAqc25kX3BjbV9zdWJmb3JtYXRfbmFtZShjb25zdCBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCk7Citjb25zdCBjaGFyICpzbmRfcGNtX3N1YmZvcm1hdF9kZXNjcmlwdGlvbihjb25zdCBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCk7CitzbmRfcGNtX2Zvcm1hdF90IHNuZF9wY21fZm9ybWF0X3ZhbHVlKGNvbnN0IGNoYXIqIG5hbWUpOworY29uc3QgY2hhciAqc25kX3BjbV90c3RhbXBfbW9kZV9uYW1lKGNvbnN0IHNuZF9wY21fdHN0YW1wX3QgbW9kZSk7Citjb25zdCBjaGFyICpzbmRfcGNtX3N0YXRlX25hbWUoY29uc3Qgc25kX3BjbV9zdGF0ZV90IHN0YXRlKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9EdW1wIERlYnVnIEZ1bmN0aW9ucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworaW50IHNuZF9wY21fZHVtcChzbmRfcGNtX3QgKnBjbSwgc25kX291dHB1dF90ICpvdXQpOworaW50IHNuZF9wY21fZHVtcF9od19zZXR1cChzbmRfcGNtX3QgKnBjbSwgc25kX291dHB1dF90ICpvdXQpOworaW50IHNuZF9wY21fZHVtcF9zd19zZXR1cChzbmRfcGNtX3QgKnBjbSwgc25kX291dHB1dF90ICpvdXQpOworaW50IHNuZF9wY21fZHVtcF9zZXR1cChzbmRfcGNtX3QgKnBjbSwgc25kX291dHB1dF90ICpvdXQpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2R1bXAoc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfb3V0cHV0X3QgKm91dCk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfZHVtcChzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9vdXRwdXRfdCAqb3V0KTsKK2ludCBzbmRfcGNtX3N0YXR1c19kdW1wKHNuZF9wY21fc3RhdHVzX3QgKnN0YXR1cywgc25kX291dHB1dF90ICpvdXQpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0RpcmVjdCBEaXJlY3QgQWNjZXNzIChNTUFQKSBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK2ludCBzbmRfcGNtX21tYXBfYmVnaW4oc25kX3BjbV90ICpwY20sCisJCSAgICAgICBjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICoqYXJlYXMsCisJCSAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCAqb2Zmc2V0LAorCQkgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgKmZyYW1lcyk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX21tYXBfY29tbWl0KHNuZF9wY21fdCAqcGNtLAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IG9mZnNldCwKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpOworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9tbWFwX3dyaXRlaShzbmRfcGNtX3QgKnBjbSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fbW1hcF9yZWFkaShzbmRfcGNtX3QgKnBjbSwgdm9pZCAqYnVmZmVyLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fbW1hcF93cml0ZW4oc25kX3BjbV90ICpwY20sIHZvaWQgKipidWZzLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fbW1hcF9yZWFkbihzbmRfcGNtX3QgKnBjbSwgdm9pZCAqKmJ1ZnMsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9IZWxwZXJzIEhlbHBlciBGdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKK2ludCBzbmRfcGNtX2Zvcm1hdF9zaWduZWQoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X3Vuc2lnbmVkKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9saW5lYXIoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fZm9ybWF0X2Zsb2F0KHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9saXR0bGVfZW5kaWFuKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9iaWdfZW5kaWFuKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFuKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsKK2ludCBzbmRfcGNtX2Zvcm1hdF93aWR0aChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CQkJLyogaW4gYml0cyAqLworaW50IHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKHNuZF9wY21fZm9ybWF0X3QgZm9ybWF0KTsJCS8qIGluIGJpdHMgKi8KK3NuZF9wY21fZm9ybWF0X3Qgc25kX3BjbV9idWlsZF9saW5lYXJfZm9ybWF0KGludCB3aWR0aCwgaW50IHB3aWR0aCwgaW50IHVuc2lnbmQsIGludCBiaWdfZW5kaWFuKTsKK3NzaXplX3Qgc25kX3BjbV9mb3JtYXRfc2l6ZShzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IHNhbXBsZXMpOwordV9pbnQ4X3Qgc25kX3BjbV9mb3JtYXRfc2lsZW5jZShzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7Cit1X2ludDE2X3Qgc25kX3BjbV9mb3JtYXRfc2lsZW5jZV8xNihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7Cit1X2ludDMyX3Qgc25kX3BjbV9mb3JtYXRfc2lsZW5jZV8zMihzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7Cit1X2ludDY0X3Qgc25kX3BjbV9mb3JtYXRfc2lsZW5jZV82NChzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2Uoc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNhbXBsZXMpOworCitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX2J5dGVzX3RvX2ZyYW1lcyhzbmRfcGNtX3QgKnBjbSwgc3NpemVfdCBieXRlcyk7Citzc2l6ZV90IHNuZF9wY21fZnJhbWVzX3RvX2J5dGVzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3NmcmFtZXNfdCBmcmFtZXMpOworbG9uZyBzbmRfcGNtX2J5dGVzX3RvX3NhbXBsZXMoc25kX3BjbV90ICpwY20sIHNzaXplX3QgYnl0ZXMpOworc3NpemVfdCBzbmRfcGNtX3NhbXBsZXNfdG9fYnl0ZXMoc25kX3BjbV90ICpwY20sIGxvbmcgc2FtcGxlcyk7CisKK2ludCBzbmRfcGNtX2FyZWFfc2lsZW5jZShjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpkc3RfY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3QgZHN0X29mZnNldCwKKwkJCSB1bnNpZ25lZCBpbnQgc2FtcGxlcywgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fYXJlYXNfc2lsZW5jZShjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpkc3RfY2hhbm5lbHMsIHNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsCisJCQkgIHVuc2lnbmVkIGludCBjaGFubmVscywgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzLCBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCk7CitpbnQgc25kX3BjbV9hcmVhX2NvcHkoY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqZHN0X2NoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsCisJCSAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKnNyY19jaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBzcmNfb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBpbnQgc2FtcGxlcywgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworaW50IHNuZF9wY21fYXJlYXNfY29weShjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpkc3RfY2hhbm5lbHMsIHNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsCisJCSAgICAgICBjb25zdCBzbmRfcGNtX2NoYW5uZWxfYXJlYV90ICpzcmNfY2hhbm5lbHMsIHNuZF9wY21fdWZyYW1lc190IHNyY19vZmZzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcywgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQpOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX0hvb2sgSG9vayBFeHRlbnNpb24KKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qKiB0eXBlIG9mIHBjbSBob29rICovCit0eXBlZGVmIGVudW0gX3NuZF9wY21faG9va190eXBlIHsKKwlTTkRfUENNX0hPT0tfVFlQRV9IV19QQVJBTVMgPSAwLAorCVNORF9QQ01fSE9PS19UWVBFX0hXX0ZSRUUsCisJU05EX1BDTV9IT09LX1RZUEVfQ0xPU0UsCisJU05EX1BDTV9IT09LX1RZUEVfTEFTVCA9IFNORF9QQ01fSE9PS19UWVBFX0NMT1NFCit9IHNuZF9wY21faG9va190eXBlX3Q7CisKKy8qKiBQQ00gaG9vayBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcGNtX2hvb2sgc25kX3BjbV9ob29rX3Q7CisvKiogUENNIGhvb2sgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgaW50ICgqc25kX3BjbV9ob29rX2Z1bmNfdCkoc25kX3BjbV9ob29rX3QgKmhvb2spOworc25kX3BjbV90ICpzbmRfcGNtX2hvb2tfZ2V0X3BjbShzbmRfcGNtX2hvb2tfdCAqaG9vayk7Cit2b2lkICpzbmRfcGNtX2hvb2tfZ2V0X3ByaXZhdGUoc25kX3BjbV9ob29rX3QgKmhvb2spOwordm9pZCBzbmRfcGNtX2hvb2tfc2V0X3ByaXZhdGUoc25kX3BjbV9ob29rX3QgKmhvb2ssIHZvaWQgKnByaXZhdGVfZGF0YSk7CitpbnQgc25kX3BjbV9ob29rX2FkZChzbmRfcGNtX2hvb2tfdCAqKmhvb2twLCBzbmRfcGNtX3QgKnBjbSwKKwkJICAgICBzbmRfcGNtX2hvb2tfdHlwZV90IHR5cGUsCisJCSAgICAgc25kX3BjbV9ob29rX2Z1bmNfdCBmdW5jLCB2b2lkICpwcml2YXRlX2RhdGEpOworaW50IHNuZF9wY21faG9va19yZW1vdmUoc25kX3BjbV9ob29rX3QgKmhvb2spOworCisvKiogXH0gKi8KKworLyoqCisgKiBcZGVmZ3JvdXAgUENNX1Njb3BlIFNjb3BlIFBsdWdpbiBFeHRlbnNpb24KKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qKiAjU05EX1BDTV9UWVBFX01FVEVSIHNjb3BlIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9wY21fc2NvcGVfb3BzIHsKKwkvKiogXGJyaWVmIEVuYWJsZSBhbmQgcHJlcGFyZSBpdCB1c2luZyBjdXJyZW50IHBhcmFtcworCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwlpbnQgKCplbmFibGUpKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworCS8qKiBcYnJpZWYgRGlzYWJsZQorCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwl2b2lkICgqZGlzYWJsZSkoc25kX3BjbV9zY29wZV90ICpzY29wZSk7CisJLyoqIFxicmllZiBQQ00gaGFzIGJlZW4gc3RhcnRlZAorCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwl2b2lkICgqc3RhcnQpKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworCS8qKiBcYnJpZWYgUENNIGhhcyBiZWVuIHN0b3BwZWQKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJdm9pZCAoKnN0b3ApKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworCS8qKiBcYnJpZWYgTmV3IGZyYW1lcyBhcmUgcHJlc2VudAorCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwl2b2lkICgqdXBkYXRlKShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKKwkvKiogXGJyaWVmIFJlc2V0IHN0YXR1cworCSAqIFxwYXJhbSBzY29wZSBzY29wZSBoYW5kbGUKKwkgKi8KKwl2b2lkICgqcmVzZXQpKHNuZF9wY21fc2NvcGVfdCAqc2NvcGUpOworCS8qKiBcYnJpZWYgUENNIGlzIGNsb3NpbmcKKwkgKiBccGFyYW0gc2NvcGUgc2NvcGUgaGFuZGxlCisJICovCisJdm9pZCAoKmNsb3NlKShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKK30gc25kX3BjbV9zY29wZV9vcHNfdDsKKworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9tZXRlcl9nZXRfYnVmc2l6ZShzbmRfcGNtX3QgKnBjbSk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9tZXRlcl9nZXRfY2hhbm5lbHMoc25kX3BjbV90ICpwY20pOwordW5zaWduZWQgaW50IHNuZF9wY21fbWV0ZXJfZ2V0X3JhdGUoc25kX3BjbV90ICpwY20pOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9tZXRlcl9nZXRfbm93KHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fbWV0ZXJfZ2V0X2JvdW5kYXJ5KHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX21ldGVyX2FkZF9zY29wZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zY29wZV90ICpzY29wZSk7CitzbmRfcGNtX3Njb3BlX3QgKnNuZF9wY21fbWV0ZXJfc2VhcmNoX3Njb3BlKHNuZF9wY21fdCAqcGNtLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBzbmRfcGNtX3Njb3BlX21hbGxvYyhzbmRfcGNtX3Njb3BlX3QgKipwdHIpOwordm9pZCBzbmRfcGNtX3Njb3BlX3NldF9vcHMoc25kX3BjbV9zY29wZV90ICpzY29wZSwgc25kX3BjbV9zY29wZV9vcHNfdCAqdmFsKTsKK3ZvaWQgc25kX3BjbV9zY29wZV9zZXRfbmFtZShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlLCBjb25zdCBjaGFyICp2YWwpOworY29uc3QgY2hhciAqc25kX3BjbV9zY29wZV9nZXRfbmFtZShzbmRfcGNtX3Njb3BlX3QgKnNjb3BlKTsKK3ZvaWQgKnNuZF9wY21fc2NvcGVfZ2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX3BjbV9zY29wZV90ICpzY29wZSk7Cit2b2lkIHNuZF9wY21fc2NvcGVfc2V0X2NhbGxiYWNrX3ByaXZhdGUoc25kX3BjbV9zY29wZV90ICpzY29wZSwgdm9pZCAqdmFsKTsKK2ludCBzbmRfcGNtX3Njb3BlX3MxNl9vcGVuKHNuZF9wY21fdCAqcGNtLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgc25kX3BjbV9zY29wZV90ICoqc2NvcGVwKTsKK2ludDE2X3QgKnNuZF9wY21fc2NvcGVfczE2X2dldF9jaGFubmVsX2J1ZmZlcihzbmRfcGNtX3Njb3BlX3QgKnNjb3BlLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CisKKy8qKiBcfSAqLworCisvKioKKyAqIFxkZWZncm91cCBQQ01fU2ltcGxlIFNpbXBsZSBzZXR1cCBmdW5jdGlvbnMKKyAqIFxpbmdyb3VwIFBDTQorICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qKiBTaW1wbGUgUENNIGxhdGVuY3kgdHlwZSAqLwordHlwZWRlZiBlbnVtIF9zbmRfc3BjbV9sYXRlbmN5IHsKKwkvKiogc3RhbmRhcmQgbGF0ZW5jeSAtIGZvciBzdGFuZGFyZCBwbGF5YmFjayBvciBjYXB0dXJlCisgICAgICAgICAgICAoZXN0aW1hdGVkIGxhdGVuY3kgaW4gb25lIGRpcmVjdGlvbiAzNTBtcykgKi8KKwlTTkRfU1BDTV9MQVRFTkNZX1NUQU5EQVJEID0gMCwKKwkvKiogbWVkaXVtIGxhdGVuY3kgLSBzb2Z0d2FyZSBwaG9uZXMgZXRjLgorCSAgICAoZXN0aW1hdGVkIGxhdGVuY3kgaW4gb25lIGRpcmVjdGlvbiBtYXhpbWFsbHkgMjVtcyAqLworCVNORF9TUENNX0xBVEVOQ1lfTUVESVVNLAorCS8qKiByZWFsdGltZSBsYXRlbmN5IC0gcmVhbHRpbWUgYXBwbGljYXRpb25zIChlZmZlY3QgcHJvY2Vzc29ycyBldGMuKQorCSAgICAoZXN0aW1hdGVkIGxhdGVuY3kgaW4gb25lIGRpcmVjdGlvbiA1bXMgYW5kIGJldHRlcikgKi8KKwlTTkRfU1BDTV9MQVRFTkNZX1JFQUxUSU1FCit9IHNuZF9zcGNtX2xhdGVuY3lfdDsKKworLyoqIFNpbXBsZSBQQ00geHJ1biB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zcGNtX3hydW5fdHlwZSB7CisJLyoqIGRyaXZlciAvIGxpYnJhcnkgd2lsbCBpZ25vcmUgYWxsIHhydW5zLCB0aGUgc3RyZWFtIHJ1bnMgZm9yZXZlciAqLworCVNORF9TUENNX1hSVU5fSUdOT1JFID0gMCwKKwkvKiogZHJpdmVyIC8gbGlicmFyeSBzdG9wcyB0aGUgc3RyZWFtIHdoZW4gYW4geHJ1biBvY2N1cnMgKi8KKwlTTkRfU1BDTV9YUlVOX1NUT1AKK30gc25kX3NwY21feHJ1bl90eXBlX3Q7CisKKy8qKiBTaW1wbGUgUENNIGR1cGxleCB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zcGNtX2R1cGxleF90eXBlIHsKKwkvKiogbGliZXJhbCBkdXBsZXggLSB0aGUgYnVmZmVyIGFuZCBwZXJpb2Qgc2l6ZXMgbWlnaHQgbm90IG1hdGNoICovCisJU05EX1NQQ01fRFVQTEVYX0xJQkVSQUwgPSAwLAorCS8qKiBwZWRhbnRpYyBkdXBsZXggLSB0aGUgYnVmZmVyIGFuZCBwZXJpb2Qgc2l6ZXMgTVVTVCBtYXRjaCAqLworCVNORF9TUENNX0RVUExFWF9QRURBTlRJQworfSBzbmRfc3BjbV9kdXBsZXhfdHlwZV90OworCitpbnQgc25kX3NwY21faW5pdChzbmRfcGNtX3QgKnBjbSwKKwkJICB1bnNpZ25lZCBpbnQgcmF0ZSwKKwkJICB1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisJCSAgc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQsCisJCSAgc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQsCisJCSAgc25kX3NwY21fbGF0ZW5jeV90IGxhdGVuY3ksCisJCSAgc25kX3BjbV9hY2Nlc3NfdCBfYWNjZXNzLAorCQkgIHNuZF9zcGNtX3hydW5fdHlwZV90IHhydW5fdHlwZSk7CisKK2ludCBzbmRfc3BjbV9pbml0X2R1cGxleChzbmRfcGNtX3QgKnBsYXliYWNrX3BjbSwKKwkJCSBzbmRfcGNtX3QgKmNhcHR1cmVfcGNtLAorCQkJIHVuc2lnbmVkIGludCByYXRlLAorCQkJIHVuc2lnbmVkIGludCBjaGFubmVscywKKwkJCSBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCwKKwkJCSBzbmRfcGNtX3N1YmZvcm1hdF90IHN1YmZvcm1hdCwKKwkJCSBzbmRfc3BjbV9sYXRlbmN5X3QgbGF0ZW5jeSwKKwkJCSBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MsCisJCQkgc25kX3NwY21feHJ1bl90eXBlX3QgeHJ1bl90eXBlLAorCQkJIHNuZF9zcGNtX2R1cGxleF90eXBlX3QgZHVwbGV4X3R5cGUpOworCitpbnQgc25kX3NwY21faW5pdF9nZXRfcGFyYW1zKHNuZF9wY21fdCAqcGNtLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKnJhdGUsCisJCQkgICAgIHNuZF9wY21fdWZyYW1lc190ICpidWZmZXJfc2l6ZSwKKwkJCSAgICAgc25kX3BjbV91ZnJhbWVzX3QgKnBlcmlvZF9zaXplKTsKKworLyoqIFx9ICovCisKKy8qKgorICogXGRlZmdyb3VwIFBDTV9EZXByZWNhdGVkIERlcHJlY2F0ZWQgRnVuY3Rpb25zCisgKiBcaW5ncm91cCBQQ00KKyAqIFNlZSB0aGUgXHJlZiBwY20gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworCisvKiBEZXByZWNhdGVkIGZ1bmN0aW9ucywgZm9yIGNvbXBhdGliaWxpdHkgKi8KK2NvbnN0IGNoYXIgKnNuZF9wY21fc3RhcnRfbW9kZV9uYW1lKHNuZF9wY21fc3RhcnRfdCBtb2RlKTsKK2NvbnN0IGNoYXIgKnNuZF9wY21feHJ1bl9tb2RlX25hbWUoc25kX3BjbV94cnVuX3QgbW9kZSk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X21vZGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdGFydF90IHZhbCk7CitzbmRfcGNtX3N0YXJ0X3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X21vZGUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfeHJ1bl9tb2RlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21feHJ1bl90IHZhbCk7CitzbmRfcGNtX3hydW5fdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfeHJ1bl9tb2RlKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1BDTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2V4dGVybmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2V4dGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1MDQxOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fZXh0ZXJuYWwuaApAQCAtMCwwICsxLDcwIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcGNtX2V4dGVybmFsLmgKKyAqIFxicmllZiBFeHRlcm5hbCBQQ00gcGx1Z2luIFNESworICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAyMDA1CisgKgorICogRXh0ZXJuIFBDTSBwbHVnaW4gU0RLLgorICovCisKKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpZm5kZWYgX19BTFNBX1BDTV9FWFRFUk5BTF9ICisjZGVmaW5lIF9fQUxTQV9QQ01fRVhURVJOQUxfSAorCisjaW5jbHVkZSAicGNtLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFBsdWdpbl9TREsgRXh0ZXJuYWwgUENNIHBsdWdpbiBTREsKKyAqICBceworICovCisKKy8qKgorICogRGVmaW5lIHRoZSBvYmplY3QgZW50cnkgZm9yIGV4dGVybmFsIFBDTSBwbHVnaW5zCisgKi8KKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fRU5UUlkobmFtZSkgX3NuZF9wY21fIyNuYW1lIyNfb3BlbgorCisvKioKKyAqIERlZmluZSB0aGUgc3ltYm9scyBvZiB0aGUgZ2l2ZW4gcGx1Z2luIHdpdGggdmVyc2lvbnMKKyAqLworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9TWU1CT0wobmFtZSkgU05EX0RMU1lNX0JVSUxEX1ZFUlNJT04oU05EX1BDTV9QTFVHSU5fRU5UUlkobmFtZSksIFNORF9QQ01fRExTWU1fVkVSU0lPTik7CisKKy8qKgorICogRGVmaW5lIHRoZSBwbHVnaW4KKyAqLworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9ERUZJTkVfRlVOQyhwbHVnaW4pIFwKK2ludCBTTkRfUENNX1BMVUdJTl9FTlRSWShwbHVnaW4pIChzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLFwKKwkJCQkgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLCBcCisJCQkJICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpCisKKyNpbmNsdWRlICJwY21faW9wbHVnLmgiCisjaW5jbHVkZSAicGNtX2V4dHBsdWcuaCIKKworaW50IHNuZF9wY21fcGFyc2VfY29udHJvbF9pZChzbmRfY29uZmlnX3QgKmNvbmYsIHNuZF9jdGxfZWxlbV9pZF90ICpjdGxfaWQsIGludCAqY2FyZHAsCisJCQkgICAgIGludCAqY2NoYW5uZWxzcCwgaW50ICpod2N0bHApOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9QQ01fRVhURVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9leHRwbHVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2V4dHBsdWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRjNWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9leHRwbHVnLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY21fZXh0cGx1Zy5oCisgKiBcYnJpZWYgRXh0ZXJuYWwgRmlsdGVyLVBsdWdpbiBTREsKKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMjAwNQorICoKKyAqIEV4dGVybmFsIEZpbHRlci1QbHVnaW4gU0RLCisgKi8KKworLyoKKyAqIEFMU0EgZXh0ZXJuYWwgUENNIHBsdWdpbiBTREsgKGRyYWZ0IHZlcnNpb24pCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfUENNX0VYVFBMVUdfSAorI2RlZmluZSBfX0FMU0FfUENNX0VYVFBMVUdfSAorCisvKioKKyAqIFxkZWZncm91cCBQQ01fRXh0UGx1ZyBFeHRlcm5hbCBGaWx0ZXIgcGx1Z2luIFNESworICogXGluZ3JvdXAgUGx1Z2luX1NESworICogU2VlIHRoZSBccmVmIHBjbSBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisgKiBceworICovCisKKy8qKiBodyBjb25zdHJhaW50cyBmb3IgZXh0cGx1ZyAqLworZW51bSB7CisJU05EX1BDTV9FWFRQTFVHX0hXX0ZPUk1BVCwJLyoqPCBmb3JtYXQgKi8KKwlTTkRfUENNX0VYVFBMVUdfSFdfQ0hBTk5FTFMsCS8qKjwgY2hhbm5lbHMgKi8KKwlTTkRfUENNX0VYVFBMVUdfSFdfUEFSQU1TCS8qKjwgbWF4IG51bWJlciBvZiBodyBjb25zdHJhaW50cyAqLworfTsKKwkKKy8qKiBIYW5kbGUgb2YgZXh0ZXJuYWwgZmlsdGVyIHBsdWdpbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9leHRwbHVnIHNuZF9wY21fZXh0cGx1Z190OworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGV4dHBsdWcgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fZXh0cGx1Z19jYWxsYmFjayBzbmRfcGNtX2V4dHBsdWdfY2FsbGJhY2tfdDsKKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX0VYVFBMVUdfVkVSU0lPTl9NQUpPUgkxCS8qKjwgUHJvdG9jb2wgbWFqb3IgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfUENNX0VYVFBMVUdfVkVSU0lPTl9NSU5PUgkwCS8qKjwgUHJvdG9jb2wgbWlub3IgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfUENNX0VYVFBMVUdfVkVSU0lPTl9USU5ZCTEJLyoqPCBQcm90b2NvbCB0aW55IHZlcnNpb24gKi8KKy8qKgorICogRmlsdGVyLXBsdWdpbiBwcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX1BDTV9FWFRQTFVHX1ZFUlNJT04JCSgoU05EX1BDTV9FWFRQTFVHX1ZFUlNJT05fTUFKT1I8PDE2KSB8XAorCQkJCQkgKFNORF9QQ01fRVhUUExVR19WRVJTSU9OX01JTk9SPDw4KSB8XAorCQkJCQkgKFNORF9QQ01fRVhUUExVR19WRVJTSU9OX1RJTlkpKQorCisvKiogSGFuZGxlIG9mIGV4dHBsdWcgKi8KK3N0cnVjdCBzbmRfcGNtX2V4dHBsdWcgeworCS8qKgorCSAqIHByb3RvY29sIHZlcnNpb247ICNTTkRfUENNX0VYVFBMVUdfVkVSU0lPTiBtdXN0IGJlIGZpbGxlZCBoZXJlCisJICogYmVmb3JlIGNhbGxpbmcgI3NuZF9wY21fZXh0cGx1Z19jcmVhdGUoKQorCSAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCS8qKgorCSAqIG5hbWUgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKCkKKwkgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKgorCSAqIGNhbGxiYWNrcyBvZiB0aGlzIHBsdWdpbjsgbXVzdCBiZSBmaWxsZWQgYmVmb3JlIGNhbGxpbmcgI3NuZF9wY21fZXh0cGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IHNuZF9wY21fZXh0cGx1Z19jYWxsYmFja190ICpjYWxsYmFjazsKKwkvKioKKwkgKiBwcml2YXRlIGRhdGEsIHdoaWNoIGNhbiBiZSB1c2VkIGZyZWVseSBpbiB0aGUgZHJpdmVyIGNhbGxiYWNrcworCSAqLworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwkvKioKKwkgKiBQQ00gaGFuZGxlIGZpbGxlZCBieSAjc25kX3BjbV9leHRwbHVnX2NyZWF0ZSgpCisJICovCisJc25kX3BjbV90ICpwY207CisJLyoqCisJICogc3RyZWFtIGRpcmVjdGlvbjsgcmVhZC1vbmx5IHN0YXR1cworCSAqLworCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtOworCS8qKgorCSAqIGZvcm1hdCBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsKKwkvKioKKwkgKiBzdWJmb3JtYXQgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJc25kX3BjbV9zdWJmb3JtYXRfdCBzdWJmb3JtYXQ7CisJLyoqCisJICogY2hhbm5lbHMgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJdW5zaWduZWQgaW50IGNoYW5uZWxzOworCS8qKgorCSAqIHJhdGUgaHcgcGFyYW1ldGVyOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGVkCisJICovCisJdW5zaWduZWQgaW50IHJhdGU7CisJLyoqCisJICogc2xhdmVfZm9ybWF0IGh3IHBhcmFtZXRlcjsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxlZAorCSAqLworCXNuZF9wY21fZm9ybWF0X3Qgc2xhdmVfZm9ybWF0OworCS8qKgorCSAqIHNsYXZlX3N1YmZvcm1hdCBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwlzbmRfcGNtX3N1YmZvcm1hdF90IHNsYXZlX3N1YmZvcm1hdDsKKwkvKioKKwkgKiBzbGF2ZV9jaGFubmVscyBodyBwYXJhbWV0ZXI7IGZpbGxlZCBhZnRlciBod19wYXJhbXMgaXMgY2FsZWQKKwkgKi8KKwl1bnNpZ25lZCBpbnQgc2xhdmVfY2hhbm5lbHM7Cit9OworCisvKiogQ2FsbGJhY2sgdGFibGUgb2YgZXh0cGx1ZyAqLworc3RydWN0IHNuZF9wY21fZXh0cGx1Z19jYWxsYmFjayB7CisJLyoqCisJICogdHJhbnNmZXIgYmV0d2VlbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGlzIGlzIGEgcmVxdWlyZWQgY2FsbGJhY2sKKwkgKi8KKwlzbmRfcGNtX3NmcmFtZXNfdCAoKnRyYW5zZmVyKShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0LAorCQkJCSAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9hcmVhcywKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBkc3Rfb2Zmc2V0LAorCQkJCSAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKnNyY19hcmVhcywKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBzcmNfb2Zmc2V0LAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworCS8qKgorCSAqIGNsb3NlIHRoZSBQQ007IG9wdGlvbmFsCisJICovCisJaW50ICgqY2xvc2UpKHNuZF9wY21fZXh0cGx1Z190ICpleHQpOworCS8qKgorCSAqIGh3X3BhcmFtczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpod19wYXJhbXMpKHNuZF9wY21fZXh0cGx1Z190ICpleHQsIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisJLyoqCisJICogaHdfZnJlZTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpod19mcmVlKShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0KTsKKwkvKioKKwkgKiBkdW1wOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpkdW1wKShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0LCBzbmRfb3V0cHV0X3QgKm91dCk7CisJLyoqCisJICogaW5pdDsgb3B0aW9uYWwgaW5pdGlhbGl6YXRpb24gY2FsbGVkIGF0IHByZXBhcmUgb3IgcmVzZXQKKwkgKi8KKwlpbnQgKCppbml0KShzbmRfcGNtX2V4dHBsdWdfdCAqZXh0KTsKK307CisKKworaW50IHNuZF9wY21fZXh0cGx1Z19jcmVhdGUoc25kX3BjbV9leHRwbHVnX3QgKmV4dCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpzbGF2ZV9jb25mLAorCQkJICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKK2ludCBzbmRfcGNtX2V4dHBsdWdfZGVsZXRlKHNuZF9wY21fZXh0cGx1Z190ICpleHQpOworCisvKiBjbGVhciBod19wYXJhbWV0ZXIgc2V0dGluZyAqLwordm9pZCBzbmRfcGNtX2V4dHBsdWdfcGFyYW1zX3Jlc2V0KHNuZF9wY21fZXh0cGx1Z190ICpleHQpOworCisvKiBod19wYXJhbWV0ZXIgc2V0dGluZyAqLworaW50IHNuZF9wY21fZXh0cGx1Z19zZXRfcGFyYW1fbGlzdChzbmRfcGNtX2V4dHBsdWdfdCAqZXh0cGx1ZywgaW50IHR5cGUsIHVuc2lnbmVkIGludCBudW1fbGlzdCwgY29uc3QgdW5zaWduZWQgaW50ICpsaXN0KTsKK2ludCBzbmRfcGNtX2V4dHBsdWdfc2V0X3BhcmFtX21pbm1heChzbmRfcGNtX2V4dHBsdWdfdCAqZXh0cGx1ZywgaW50IHR5cGUsIHVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBtYXgpOworaW50IHNuZF9wY21fZXh0cGx1Z19zZXRfc2xhdmVfcGFyYW1fbGlzdChzbmRfcGNtX2V4dHBsdWdfdCAqZXh0cGx1ZywgaW50IHR5cGUsIHVuc2lnbmVkIGludCBudW1fbGlzdCwgY29uc3QgdW5zaWduZWQgaW50ICpsaXN0KTsKK2ludCBzbmRfcGNtX2V4dHBsdWdfc2V0X3NsYXZlX3BhcmFtX21pbm1heChzbmRfcGNtX2V4dHBsdWdfdCAqZXh0cGx1ZywgaW50IHR5cGUsIHVuc2lnbmVkIGludCBtaW4sIHVuc2lnbmVkIGludCBtYXgpOworCisvKioKKyAqIHNldCB0aGUgcGFyYW1ldGVyIGNvbnN0cmFpbnQgd2l0aCBhIHNpbmdsZSB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIGludCBzbmRfcGNtX2V4dHBsdWdfc2V0X3BhcmFtKHNuZF9wY21fZXh0cGx1Z190ICpleHRwbHVnLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlyZXR1cm4gc25kX3BjbV9leHRwbHVnX3NldF9wYXJhbV9saXN0KGV4dHBsdWcsIHR5cGUsIDEsICZ2YWwpOworfQorCisvKioKKyAqIHNldCB0aGUgcGFyYW1ldGVyIGNvbnN0cmFpbnQgZm9yIHNsYXZlIFBDTSB3aXRoIGEgc2luZ2xlIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9wY21fZXh0cGx1Z19zZXRfc2xhdmVfcGFyYW0oc25kX3BjbV9leHRwbHVnX3QgKmV4dHBsdWcsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXJldHVybiBzbmRfcGNtX2V4dHBsdWdfc2V0X3NsYXZlX3BhcmFtX2xpc3QoZXh0cGx1ZywgdHlwZSwgMSwgJnZhbCk7Cit9CisKKy8qKiBcfSAqLworCisjZW5kaWYgLyogX19BTFNBX1BDTV9FWFRQTFVHX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21faW9wbHVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2lvcGx1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YTIzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX2lvcGx1Zy5oCkBAIC0wLDAgKzEsMjEzIEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcGNtX2lvcGx1Zy5oCisgKiBcYnJpZWYgRXh0ZXJuYWwgSS9PLVBsdWdpbiBTREsKKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMjAwNQorICoKKyAqIEV4dGVybmFsIEkvTy1QbHVnaW4gU0RLCisgKi8KKworLyoKKyAqIEFMU0EgZXh0ZXJuYWwgUENNIHBsdWdpbiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9QQ01fSU9QTFVHX0gKKyNkZWZpbmUgX19BTFNBX1BDTV9JT1BMVUdfSAorCisvKioKKyAqIFxkZWZncm91cCBQQ01fSU9QbHVnIEV4dGVybmFsIEkvTyBwbHVnaW4gU0RLCisgKiBcaW5ncm91cCBQbHVnaW5fU0RLCisgKiBTZWUgdGhlIFxyZWYgcGNtIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIFx7CisgKi8KKworLyoqIGh3IGNvbnN0cmFpbnRzIGZvciBpb3BsdWcgKi8KK2VudW0geworCVNORF9QQ01fSU9QTFVHX0hXX0FDQ0VTUyA9IDAsCS8qKjwgYWNjZXNzIHR5cGUgKi8KKwlTTkRfUENNX0lPUExVR19IV19GT1JNQVQsCS8qKjwgZm9ybWF0ICovCisJU05EX1BDTV9JT1BMVUdfSFdfQ0hBTk5FTFMsCS8qKjwgY2hhbm5lbHMgKi8KKwlTTkRfUENNX0lPUExVR19IV19SQVRFLAkJLyoqPCByYXRlICovCisJU05EX1BDTV9JT1BMVUdfSFdfUEVSSU9EX0JZVEVTLAkvKio8IHBlcmlvZCBieXRlcyAqLworCVNORF9QQ01fSU9QTFVHX0hXX0JVRkZFUl9CWVRFUywJLyoqPCBidWZmZXIgYnl0ZXMgKi8KKwlTTkRfUENNX0lPUExVR19IV19QRVJJT0RTLAkvKio8IG51bWJlciBvZiBwZXJpb2RzICovCisJU05EX1BDTV9JT1BMVUdfSFdfUEFSQU1TCS8qKjwgbWF4IG51bWJlciBvZiBodyBjb25zdHJhaW50cyAqLworfTsKKwkKKy8qKiBJL08gcGx1Z2luIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3BjbV9pb3BsdWcgc25kX3BjbV9pb3BsdWdfdDsKKy8qKiBDYWxsYmFjayB0YWJsZSBvZiBpb3BsdWcgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21faW9wbHVnX2NhbGxiYWNrIHNuZF9wY21faW9wbHVnX2NhbGxiYWNrX3Q7CisKKy8qKgorICogYml0IGZsYWdzIGZvciBhZGRpdGlvbmFsIGNvbmRpdGlvbnMKKyAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19GTEFHX0xJU1RFRAkoMTw8MCkJCS8qIGxpc3QgdXAgdGhpcyBQQ00gKi8KKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19WRVJTSU9OX01BSk9SCTEJLyoqPCBQcm90b2NvbCBtYWpvciB2ZXJzaW9uICovCisjZGVmaW5lIFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fTUlOT1IJMAkvKio8IFByb3RvY29sIG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9JT1BMVUdfVkVSU0lPTl9USU5ZCTEJLyoqPCBQcm90b2NvbCB0aW55IHZlcnNpb24gKi8KKy8qKgorICogSU8tcGx1Z2luIHByb3RvY29sIHZlcnNpb24KKyAqLworI2RlZmluZSBTTkRfUENNX0lPUExVR19WRVJTSU9OCQkoKFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fTUFKT1I8PDE2KSB8XAorCQkJCQkgKFNORF9QQ01fSU9QTFVHX1ZFUlNJT05fTUlOT1I8PDgpIHxcCisJCQkJCSAoU05EX1BDTV9JT1BMVUdfVkVSU0lPTl9USU5ZKSkKKworLyoqIEhhbmRsZSBvZiBpb3BsdWcgKi8KK3N0cnVjdCBzbmRfcGNtX2lvcGx1ZyB7CisJLyoqCisJICogcHJvdG9jb2wgdmVyc2lvbjsgI1NORF9QQ01fSU9QTFVHX1ZFUlNJT04gbXVzdCBiZSBmaWxsZWQgaGVyZQorCSAqIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCS8qKgorCSAqIG5hbWUgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKio8IFNORF9QQ01fSU9QTFVHX0ZMQUdfWFhYICovCisJaW50IHBvbGxfZmQ7CQkvKio8IHBvbGwgZmlsZSBkZXNjcmlwdG9yICovCisJdW5zaWduZWQgaW50IHBvbGxfZXZlbnRzOwkvKio8IHBvbGwgZXZlbnRzICovCisJdW5zaWduZWQgaW50IG1tYXBfcnc7CQkvKio8IHBzZXVkbyBtbWFwIG1vZGUgKi8KKwkvKioKKwkgKiBjYWxsYmFja3Mgb2YgdGhpcyBwbHVnaW47IG11c3QgYmUgZmlsbGVkIGJlZm9yZSBjYWxsaW5nICNzbmRfcGNtX2lvcGx1Z19jcmVhdGUoKQorCSAqLworCWNvbnN0IHNuZF9wY21faW9wbHVnX2NhbGxiYWNrX3QgKmNhbGxiYWNrOworCS8qKgorCSAqIHByaXZhdGUgZGF0YSwgd2hpY2ggY2FuIGJlIHVzZWQgZnJlZWx5IGluIHRoZSBkcml2ZXIgY2FsbGJhY2tzCisJICovCisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCS8qKgorCSAqIFBDTSBoYW5kbGUgZmlsbGVkIGJ5ICNzbmRfcGNtX2V4dHBsdWdfY3JlYXRlKCkKKwkgKi8KKwlzbmRfcGNtX3QgKnBjbTsKKworCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtOwkvKio8IHN0cmVhbSBkaXJlY2lvbjsgcmVhZC1vbmx5ICovCQorCXNuZF9wY21fc3RhdGVfdCBzdGF0ZTsJCS8qKjwgY3VycmVudCBQQ00gc3RhdGU7IHJlYWQtb25seSAqLworCXZvbGF0aWxlIHNuZF9wY21fdWZyYW1lc190IGFwcGxfcHRyOwkvKio8IGFwcGxpY2F0aW9uIHBvaW50ZXI7IHJlYWQtb25seSAqLworCXZvbGF0aWxlIHNuZF9wY21fdWZyYW1lc190IGh3X3B0cjsJLyoqPCBodyBwb2ludGVyOyByZWFkLW9ubHkgKi8KKwlpbnQgbm9uYmxvY2s7CQkJLyoqPCBub24tYmxvY2sgbW9kZTsgcmVhZC1vbmx5ICovCisKKwlzbmRfcGNtX2FjY2Vzc190IGFjY2VzczsJLyoqPCBhY2Nlc3MgdHlwZTsgZmlsbGVkIGFmdGVyIGh3X3BhcmFtcyBpcyBjYWxsZWQgKi8KKwlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsJLyoqPCBQQ00gZm9ybWF0OyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXVuc2lnbmVkIGludCBjaGFubmVsczsJCS8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXVuc2lnbmVkIGludCByYXRlOwkJLyoqPCByYXRlOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXNuZF9wY21fdWZyYW1lc190IHBlcmlvZF9zaXplOwkvKio8IHBlcmlvZCBzaXplOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworCXNuZF9wY21fdWZyYW1lc190IGJ1ZmZlcl9zaXplOwkvKio8IGJ1ZmZlciBzaXplOyBmaWxsZWQgYWZ0ZXIgaHdfcGFyYW1zIGlzIGNhbGxlZCAqLworfTsKKworLyoqIENhbGxiYWNrIHRhYmxlIG9mIGlvcGx1ZyAqLworc3RydWN0IHNuZF9wY21faW9wbHVnX2NhbGxiYWNrIHsKKwkvKioKKwkgKiBzdGFydCB0aGUgUENNOyByZXF1aXJlZAorCSAqLworCWludCAoKnN0YXJ0KShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogc3RvcCB0aGUgUENNOyByZXF1aXJlZAorCSAqLworCWludCAoKnN0b3ApKHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKwkvKioKKwkgKiBnZXQgdGhlIGN1cnJlbnQgRE1BIHBvc2l0aW9uOyByZXF1aXJlZAorCSAqLworCXNuZF9wY21fc2ZyYW1lc190ICgqcG9pbnRlcikoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCS8qKgorCSAqIHRyYW5zZmVyIHRoZSBkYXRhOyBvcHRpb25hbAorCSAqLworCXNuZF9wY21fc2ZyYW1lc190ICgqdHJhbnNmZXIpKHNuZF9wY21faW9wbHVnX3QgKmlvLAorCQkJCSAgICAgIGNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmFyZWFzLAorCQkJCSAgICAgIHNuZF9wY21fdWZyYW1lc190IG9mZnNldCwKKwkJCQkgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKKwkvKioKKwkgKiBjbG9zZSB0aGUgUENNOyBvcHRpb25hbAorCSAqLworCWludCAoKmNsb3NlKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogaHdfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKmh3X3BhcmFtcykoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisJLyoqCisJICogaHdfZnJlZTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpod19mcmVlKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogc3dfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKnN3X3BhcmFtcykoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CisJLyoqCisJICogcHJlcGFyZTsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwcmVwYXJlKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogZHJhaW47IG9wdGlvbmFsCisJICovCisJaW50ICgqZHJhaW4pKHNuZF9wY21faW9wbHVnX3QgKmlvKTsKKwkvKioKKwkgKiB0b2dnbGUgcGF1c2U7IG9wdGlvbmFsCisJICovCisJaW50ICgqcGF1c2UpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBpbnQgZW5hYmxlKTsKKwkvKioKKwkgKiByZXN1bWU7IG9wdGlvbmFsCisJICovCisJaW50ICgqcmVzdW1lKShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogcG9sbCBkZXNjcmlwdG9ycyBjb3VudDsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX2Rlc2NyaXB0b3JzX2NvdW50KShzbmRfcGNtX2lvcGx1Z190ICppbyk7CisJLyoqCisJICogcG9sbCBkZXNjcmlwdG9yczsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX2Rlc2NyaXB0b3JzKShzbmRfcGNtX2lvcGx1Z190ICppbywgc3RydWN0IHBvbGxmZCAqcGZkLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworCS8qKgorCSAqIG1hbmdsZSBwb2xsIGV2ZW50czsgb3B0aW9uYWwKKwkgKi8KKwlpbnQgKCpwb2xsX3JldmVudHMpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzdHJ1Y3QgcG9sbGZkICpwZmQsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50cyk7CisJLyoqCisJICogZHVtcDsgb3B0aW9uYWwKKwkgKi8KKwl2b2lkICgqZHVtcCkoc25kX3BjbV9pb3BsdWdfdCAqaW8sIHNuZF9vdXRwdXRfdCAqb3V0KTsKKwkvKioKKwkgKiBnZXQgdGhlIGRlbGF5IGZvciB0aGUgcnVubmluZyBQQ007IG9wdGlvbmFsCisJICovCisJaW50ICgqZGVsYXkpKHNuZF9wY21faW9wbHVnX3QgKmlvLCBzbmRfcGNtX3NmcmFtZXNfdCAqZGVsYXlwKTsKK307CisKKworaW50IHNuZF9wY21faW9wbHVnX2NyZWF0ZShzbmRfcGNtX2lvcGx1Z190ICppbywgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKK2ludCBzbmRfcGNtX2lvcGx1Z19kZWxldGUoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCisvKiB1cGRhdGUgcG9sbF9mZCBhbmQgbW1hcF9ydyAqLworaW50IHNuZF9wY21faW9wbHVnX3JlaW5pdF9zdGF0dXMoc25kX3BjbV9pb3BsdWdfdCAqaW9wbHVnKTsKKworLyogZ2V0IGEgbW1hcCBhcmVhIChmb3IgbW1hcF9ydyBvbmx5KSAqLworY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc25kX3BjbV9pb3BsdWdfbW1hcF9hcmVhcyhzbmRfcGNtX2lvcGx1Z190ICppb3BsdWcpOworCisvKiBjbGVhciBod19wYXJhbWV0ZXIgc2V0dGluZyAqLwordm9pZCBzbmRfcGNtX2lvcGx1Z19wYXJhbXNfcmVzZXQoc25kX3BjbV9pb3BsdWdfdCAqaW8pOworCisvKiBod19wYXJhbWV0ZXIgc2V0dGluZyAqLworaW50IHNuZF9wY21faW9wbHVnX3NldF9wYXJhbV9taW5tYXgoc25kX3BjbV9pb3BsdWdfdCAqaW8sIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KTsKK2ludCBzbmRfcGNtX2lvcGx1Z19zZXRfcGFyYW1fbGlzdChzbmRfcGNtX2lvcGx1Z190ICppbywgaW50IHR5cGUsIHVuc2lnbmVkIGludCBudW1fbGlzdCwgY29uc3QgdW5zaWduZWQgaW50ICpsaXN0KTsKKworLyoqIFx9ICovCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX0lPUExVR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvcGNtX29sZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9vbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlNGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9vbGQuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIE9sZCBBTFNBIDAuOS54IEFQSQorICovCisKKyNpZmRlZiBBTFNBX1BDTV9PTERfSFdfUEFSQU1TX0FQSQorCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2FjY2VzcyxzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2FjY2Vzcyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgdmFsKTsKK3NuZF9wY21fYWNjZXNzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fYWNjZXNzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3NfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYWNjZXNzX21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc19tYXNrX3QgKm1hc2spOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0X2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKTsKK3NuZF9wY21fZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdF9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXRfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0X21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF9tYXNrX3QgKm1hc2spOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3N1YmZvcm1hdCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0X2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9zdWJmb3JtYXQoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9zdWJmb3JtYXRfdCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9zdWJmb3JtYXQoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfc3ViZm9ybWF0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fc3ViZm9ybWF0X3QgdmFsKTsKK3NuZF9wY21fc3ViZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3NuZF9wY21fc3ViZm9ybWF0X3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3N1YmZvcm1hdF9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9zdWJmb3JtYXRfbWFzayhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOwordm9pZCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfc3ViZm9ybWF0X21hc2soc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3N1YmZvcm1hdF9tYXNrX3QgKm1hc2spOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzLHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc0BBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVsc19tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHMoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfY2hhbm5lbHNfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfY2hhbm5lbHMoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIHVuc2lnbmVkIGludCAqbWF4KTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CisKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21pbixzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3JhdGVfbWF4QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3Qsc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2xhc3RAQUxTQV8wLjkiKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0ZV9tYXgoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfdGVzdF9yYXRlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX3Jlc2FtcGxlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9yYXRlX3Jlc2FtcGxlKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3RpbWVfbWF4LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbmVhckBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbGFzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RfdGltZV9taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF90aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZF90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIGludCAqbWluZGlyLCB1bnNpZ25lZCBpbnQgKm1heCwgaW50ICptYXhkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3RpbWVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZSxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWF4LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcixzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhckBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfZmlyc3RAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbGFzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbGFzdEBBTFNBXzAuOSIpOworCitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZF9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBpbnQgKm1pbmRpciwgc25kX3BjbV91ZnJhbWVzX3QgKm1heCwgaW50ICptYXhkaXIpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgKmRpcik7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9pbnRlZ2VyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHMsc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWF4LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2RzX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbmVhckBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZHNfbGFzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kcyhjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kc19taW4oY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3BlcmlvZHNfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfcGVyaW9kcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19taW5tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICptaW4sIGludCAqbWluZGlyLCB1bnNpZ25lZCBpbnQgKm1heCwgaW50ICptYXhkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19sYXN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kc19pbnRlZ2VyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lLHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfdGltZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9sYXN0QEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl90aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3RpbWVfbWF4KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3RpbWUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9taW4oc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbWF4KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50IHZhbCwgaW50ICpkaXIpOwordW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9maXJzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBpbnQgKmRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworCithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplLHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9taW4sc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyLHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX2ZpcnN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9maXJzdEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9sYXN0QEFMU0FfMC45Iik7CisKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfYnVmZmVyX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemUoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICp2YWwpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWluLCBzbmRfcGNtX3VmcmFtZXNfdCAqbWF4KTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfZmlyc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcyk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3NpemVfbGFzdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKKworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWUsc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZUBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWluLHNuZF9wY21faHdfcGFyYW1zX2dldF90aWNrX3RpbWVfbWluQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9tYXgsc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZV9tYXhAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX25lYXIsc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9uZWFyQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9maXJzdCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2ZpcnN0QEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9sYXN0LHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbGFzdEBBTFNBXzAuOSIpOworCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X3RpY2tfdGltZShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21pbihjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfdGlja190aW1lX21heChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc190ZXN0X3RpY2tfdGltZShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF90aWNrX3RpbWVfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9tYXgoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX21pbm1heChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKm1pbiwgaW50ICptaW5kaXIsIHVuc2lnbmVkIGludCAqbWF4LCBpbnQgKm1heGRpcik7Cit1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3RpY2tfdGltZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2ZpcnN0KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIGludCAqZGlyKTsKK3Vuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfdGlja190aW1lX2xhc3Qoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgaW50ICpkaXIpOworCisjZW5kaWYgLyogQUxTQV9QQ01fT0xEX0hXX1BBUkFNU19BUEkgKi8KKworCisjaWZkZWYgQUxTQV9QQ01fT0xEX1NXX1BBUkFNU19BUEkKKworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF90c3RhbXBfbW9kZSxzbmRfcGNtX3N3X3BhcmFtc19nZXRfdHN0YW1wX21vZGVAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2xlZXBfbWluLHNuZF9wY21fc3dfcGFyYW1zX2dldF9zbGVlcF9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYXZhaWxfbWluLHNuZF9wY21fc3dfcGFyYW1zX2dldF9hdmFpbF9taW5AQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfeGZlcl9hbGlnbixzbmRfcGNtX3N3X3BhcmFtc19nZXRfeGZlcl9hbGlnbkBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9zdGFydF90aHJlc2hvbGQsc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X3RocmVzaG9sZEBBTFNBXzAuOSIpOworYXNtKCIuc3ltdmVyIHNuZF9wY21fc3dfcGFyYW1zX2dldF9zdG9wX3RocmVzaG9sZCxzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RvcF90aHJlc2hvbGRAQUxTQV8wLjkiKTsKK2FzbSgiLnN5bXZlciBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV90aHJlc2hvbGQsc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NpbGVuY2VfdGhyZXNob2xkQEFMU0FfMC45Iik7Cithc20oIi5zeW12ZXIgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3NpbGVuY2Vfc2l6ZSxzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV9zaXplQEFMU0FfMC45Iik7CisKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfdHN0YW1wX21vZGUoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV90c3RhbXBfdCB2YWwpOworc25kX3BjbV90c3RhbXBfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfdHN0YW1wX21vZGUoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2xlZXBfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCB2YWwpOwordW5zaWduZWQgaW50IHNuZF9wY21fc3dfcGFyYW1zX2dldF9zbGVlcF9taW4oY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfYXZhaWxfbWluKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfYXZhaWxfbWluKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3hmZXJfYWxpZ24oc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NuZF9wY21fdWZyYW1lc190IHNuZF9wY21fc3dfcGFyYW1zX2dldF94ZmVyX2FsaWduKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0YXJ0X3RocmVzaG9sZChjb25zdCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdG9wX3RocmVzaG9sZChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOworc25kX3BjbV91ZnJhbWVzX3Qgc25kX3BjbV9zd19wYXJhbXNfZ2V0X3N0b3BfdGhyZXNob2xkKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CitpbnQgc25kX3BjbV9zd19wYXJhbXNfc2V0X3NpbGVuY2VfdGhyZXNob2xkKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV90aHJlc2hvbGQoY29uc3Qgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc2lsZW5jZV9zaXplKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCk7CitzbmRfcGNtX3VmcmFtZXNfdCBzbmRfcGNtX3N3X3BhcmFtc19nZXRfc2lsZW5jZV9zaXplKGNvbnN0IHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcyk7CisKKyNlbmRpZiAvKiBBTFNBX1BDTV9PTERfU1dfUEFSQU1TX0FQSSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9wbHVnaW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcGx1Z2luLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9wY21fcGx1Z2luLmgKKyAqIFxicmllZiBDb21tb24gUENNIHBsdWdpbiBjb2RlCisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxkYXRlIDIwMDAtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIuCisgKiBTZWUgdGhlIFxyZWYgcGNtX3BsdWdpbnMgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFx3YXJuaW5nIFVzaW5nIG9mIGNvbnRlbnRzIG9mIHRoaXMgaGVhZGVyIGZpbGUgbWlnaHQgYmUgZGFuZ2Vyb3VzCisgKgkgICAgaW4gdGhlIHNlbnNlIG9mIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gVGhlIGNvbnRlbnRzIG1pZ2h0IGJlCisgKgkgICAgZnJlZWx5IGNoYW5nZWQgaW4gZnV0dXJlLgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1BDTV9QTFVHSU5fSAorCisvKioKKyAqIFxkZWZncm91cCBQQ01fUGx1Z2lucyBQQ00gUGx1Z2lucworICogXGluZ3JvdXAgUENNCisgKiBTZWUgdGhlIFxyZWYgcGNtX3BsdWdpbnMgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogXHsKKyAqLworICAKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUkFURV9NSU4gNDAwMAkvKio8IG1pbmltYWwgcmF0ZSBmb3IgdGhlIHJhdGUgcGx1Z2luICovCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JBVEVfTUFYIDE5MjAwMAkvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIHJhdGUgcGx1Z2luICovCisKKy8qIFJPVVRFX0ZMT0FUIHNob3VsZCBiZSBzZXQgdG8gMCBmb3IgbWFjaGluZXMgd2l0aG91dCBGUCB1bml0IC0gbGlrZSBpUEFRICovCisjaWZkZWYgSEFWRV9TT0ZUX0ZMT0FUCisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0ZMT0FUIDAJICAgLyoqPCB1c2UgaW50ZWdlcnMgZm9yIHJvdXRlIHBsdWdpbiAqLworI2Vsc2UKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfRkxPQVQgMQkgICAvKio8IHVzZSBmbG9hdHMgZm9yIHJvdXRlIHBsdWdpbiAqLworI2VuZGlmCisKKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfUkVTT0xVVElPTiAxNiAvKio8IGludGVnZXIgcmVzb2x1dGlvbiBmb3Igcm91dGUgcGx1Z2luICovCisKKyNpZiBTTkRfUENNX1BMVUdJTl9ST1VURV9GTE9BVAorLyoqIHJvdXRlIHR0YWJsZSBlbnRyeSB0eXBlICovCit0eXBlZGVmIGZsb2F0IHNuZF9wY21fcm91dGVfdHRhYmxlX2VudHJ5X3Q7CisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0hBTEYgMC41CS8qKjwgaGFsZiB2YWx1ZSAqLworI2RlZmluZSBTTkRfUENNX1BMVUdJTl9ST1VURV9GVUxMIDEuMAkvKio8IGZ1bGwgdmFsdWUgKi8KKyNlbHNlCisvKiogcm91dGUgdHRhYmxlIGVudHJ5IHR5cGUgKi8KK3R5cGVkZWYgaW50IHNuZF9wY21fcm91dGVfdHRhYmxlX2VudHJ5X3Q7CisjZGVmaW5lIFNORF9QQ01fUExVR0lOX1JPVVRFX0hBTEYgKFNORF9QQ01fUExVR0lOX1JPVVRFX1JFU09MVVRJT04gLyAyKQkvKio8IGhhbGYgdmFsdWUgKi8KKyNkZWZpbmUgU05EX1BDTV9QTFVHSU5fUk9VVEVfRlVMTCBTTkRfUENNX1BMVUdJTl9ST1VURV9SRVNPTFVUSU9OCS8qKjwgZnVsbCB2YWx1ZSAqLworI2VuZGlmCisKKy8qCisgKiAgSGFyZHdhcmUgcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2h3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIGludCBjYXJkLCBpbnQgZGV2aWNlLCBpbnQgc3ViZGV2aWNlLAorCQkgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlLAorCQkgICAgaW50IG1tYXBfZW11bGF0aW9uLCBpbnQgc3luY19wdHJfaW9jdGwpOworaW50IF9zbmRfcGNtX2h3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICBzbmRfY29uZmlnX3QgKnJvb3QgQVRUUklCVVRFX1VOVVNFRCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgQ29weSBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fY29weV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIHNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fY29weV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qCisgKiAgTGluZWFyIGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2xpbmVhcl9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHNuZF9wY21fdCAqc2xhdmUsCisJCQlpbnQgY2xvc2Vfc2xhdmUpOworaW50IF9zbmRfcGNtX2xpbmVhcl9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQkgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworLyoKKyAqICBMaW5lYXI8LT5GbG9hdCBjb252ZXJzaW9uIHBsdWdpbgorICovCitpbnQgc25kX3BjbV9sZmxvYXRfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX3BjbV9mb3JtYXRfdCBzZm9ybWF0LCBzbmRfcGNtX3QgKnNsYXZlLAorCQkJaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9sZmxvYXRfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIHNuZF9jb25maWdfdCAqcm9vdCwgc25kX2NvbmZpZ190ICpjb25mLAorCQkJIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgTGluZWFyPC0+bXUtTGF3IGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX211bGF3X29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgc25kX3BjbV90ICpzbGF2ZSwKKwkJICAgICAgIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fbXVsYXdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIExpbmVhcjwtPmEtTGF3IGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2FsYXdfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHNuZF9wY21fdCAqc2xhdmUsCisJCSAgICAgIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fYWxhd19vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJICAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgTGluZWFyPC0+SW1hLUFEUENNIGNvbnZlcnNpb24gcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2FkcGNtX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgc25kX3BjbV90ICpzbGF2ZSwKKwkJICAgICAgIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fYWRwY21fb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQlzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIFJvdXRlIHBsdWdpbiBmb3IgbGluZWFyIGZvcm1hdHMKKyAqLworaW50IHNuZF9wY21fcm91dGVfbG9hZF90dGFibGUoc25kX2NvbmZpZ190ICp0dCwgc25kX3BjbV9yb3V0ZV90dGFibGVfZW50cnlfdCAqdHRhYmxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IHR0X2NzaXplLCB1bnNpZ25lZCBpbnQgdHRfc3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKnR0X2N1c2VkLCB1bnNpZ25lZCBpbnQgKnR0X3N1c2VkLAorCQkJICAgICAgaW50IHNjaGFubmVscyk7CitpbnQgc25kX3BjbV9yb3V0ZV9kZXRlcm1pbmVfdHRhYmxlKHNuZF9jb25maWdfdCAqdHQsCisJCQkJICAgdW5zaWduZWQgaW50ICp0dF9jc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnR0X3NzaXplKTsKK2ludCBzbmRfcGNtX3JvdXRlX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fZm9ybWF0X3Qgc2Zvcm1hdCwgaW50IHNjaGFubmVscywKKwkJICAgICAgIHNuZF9wY21fcm91dGVfdHRhYmxlX2VudHJ5X3QgKnR0YWJsZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCB0dF9zc2l6ZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCB0dF9jdXNlZCwgdW5zaWduZWQgaW50IHR0X3N1c2VkLAorCQkgICAgICAgc25kX3BjbV90ICpzbGF2ZSwgaW50IGNsb3NlX3NsYXZlKTsKK2ludCBfc25kX3BjbV9yb3V0ZV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCXNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgUmF0ZSBwbHVnaW4gZm9yIGxpbmVhciBmb3JtYXRzCisgKi8KK2ludCBzbmRfcGNtX3JhdGVfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICBzbmRfcGNtX2Zvcm1hdF90IHNmb3JtYXQsIHVuc2lnbmVkIGludCBzcmF0ZSwKKwkJICAgICAgY29uc3Qgc25kX2NvbmZpZ190ICpjb252ZXJ0ZXIsCisJCSAgICAgIHNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fcmF0ZV9vcGVuKHNuZF9wY21fdCAqKnBjbXAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJICAgICAgIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSk7CisKKy8qCisgKiAgSG9va3MgcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2hvb2tzX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21faG9va3Nfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJc25kX2NvbmZpZ190ICpyb290LCBzbmRfY29uZmlnX3QgKmNvbmYsCisJCQlzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIExBRFNQQSBwbHVnaW4KKyAqLworaW50IHNuZF9wY21fbGFkc3BhX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbnN0IGNoYXIgKmxhZHNwYV9wYXRoLAorCQkJdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkJc25kX2NvbmZpZ190ICpsYWRzcGFfcHBsdWdpbnMsCisJCQlzbmRfY29uZmlnX3QgKmxhZHNwYV9jcGx1Z2lucywKKwkJCXNuZF9wY21fdCAqc2xhdmUsIGludCBjbG9zZV9zbGF2ZSk7CitpbnQgX3NuZF9wY21fbGFkc3BhX29wZW4oc25kX3BjbV90ICoqcGNtcCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKwkJCSBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworCisvKgorICogIEphY2sgcGx1Z2luCisgKi8KK2ludCBzbmRfcGNtX2phY2tfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQlzbmRfY29uZmlnX3QgKnBsYXliYWNrX2NvbmYsCisJCQkJCXNuZF9jb25maWdfdCAqY2FwdHVyZV9jb25mLAorCQkgICAgICBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworaW50IF9zbmRfcGNtX2phY2tfb3BlbihzbmRfcGNtX3QgKipwY21wLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzbmRfY29uZmlnX3QgKnJvb3QsIHNuZF9jb25maWdfdCAqY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKTsKKworCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9QQ01fUExVR0lOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcmF0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3BjbV9yYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxMWUwOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9wY21fcmF0ZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvcGNtX3JhdGUuaAorICogXGJyaWVmIEV4dGVybmFsIFJhdGUtQ29udmVydGVyLVBsdWdpbiBTREsKKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMjAwNgorICoKKyAqIEV4dGVybmFsIFJhdGUtQ29udmVydGVyLVBsdWdpbiBTREsKKyAqLworCisvKgorICogQUxTQSBleHRlcm5hbCBQQ00gcmF0ZS1jb252ZXJ0ZXIgcGx1Z2luIFNESyAoZHJhZnQgdmVyc2lvbikKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9QQ01fUkFURV9ICisjZGVmaW5lIF9fQUxTQV9QQ01fUkFURV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBQcm90b2NvbCB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgU05EX1BDTV9SQVRFX1BMVUdJTl9WRVJTSU9OCTB4MDEwMDAxCisKKy8qKiBod19wYXJhbXMgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIHNpZGUgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9zaWRlX2luZm8geworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0OworCXVuc2lnbmVkIGludCByYXRlOworCXNuZF9wY21fdWZyYW1lc190IGJ1ZmZlcl9zaXplOworCXNuZF9wY21fdWZyYW1lc190IHBlcmlvZF9zaXplOworfSBzbmRfcGNtX3JhdGVfc2lkZV9pbmZvX3Q7CisKKy8qKiBod19wYXJhbXMgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9pbmZvIHsKKwlzdHJ1Y3Qgc25kX3BjbV9yYXRlX3NpZGVfaW5mbyBpbjsKKwlzdHJ1Y3Qgc25kX3BjbV9yYXRlX3NpZGVfaW5mbyBvdXQ7CisJdW5zaWduZWQgaW50IGNoYW5uZWxzOworfSBzbmRfcGNtX3JhdGVfaW5mb190OworCisvKiogQ2FsbGJhY2sgdGFibGUgb2YgcmF0ZS1jb252ZXJ0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9wY21fcmF0ZV9vcHMgeworCS8qKgorCSAqIGNsb3NlIHRoZSBjb252ZXJ0ZXI7IG9wdGlvbmFsCisJICovCisJdm9pZCAoKmNsb3NlKSh2b2lkICpvYmopOworCS8qKgorCSAqIGluaXRpYWxpemUgdGhlIGNvbnZlcnRlciwgY2FsbGVkIGF0IGh3X3BhcmFtcworCSAqLworCWludCAoKmluaXQpKHZvaWQgKm9iaiwgc25kX3BjbV9yYXRlX2luZm9fdCAqaW5mbyk7CisJLyoqCisJICogZnJlZSB0aGUgY29udmVydGVyOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpmcmVlKSh2b2lkICpvYmopOworCS8qKgorCSAqIHJlc2V0IHRoZSBjb252ZXJ0ZXIsIGNhbGxlZCBhdCBwcmVwYXJlOyBvcHRpb25hbAorCSAqLworCXZvaWQgKCpyZXNldCkodm9pZCAqb2JqKTsKKwkvKioKKwkgKiBhZGp1c3QgdGhlIHBpdGNoLCBjYWxsZWQgYXQgc3dfcGFyYW1zOyBvcHRpb25hbAorCSAqLworCWludCAoKmFkanVzdF9waXRjaCkodm9pZCAqb2JqLCBzbmRfcGNtX3JhdGVfaW5mb190ICppbmZvKTsKKwkvKioKKwkgKiBjb252ZXJ0IHRoZSBkYXRhCisJICovCisJdm9pZCAoKmNvbnZlcnQpKHZvaWQgKm9iaiwKKwkJCWNvbnN0IHNuZF9wY21fY2hhbm5lbF9hcmVhX3QgKmRzdF9hcmVhcywKKwkJCXNuZF9wY21fdWZyYW1lc190IGRzdF9vZmZzZXQsIHVuc2lnbmVkIGludCBkc3RfZnJhbWVzLAorCQkJY29uc3Qgc25kX3BjbV9jaGFubmVsX2FyZWFfdCAqc3JjX2FyZWFzLAorCQkJc25kX3BjbV91ZnJhbWVzX3Qgc3JjX29mZnNldCwgdW5zaWduZWQgaW50IHNyY19mcmFtZXMpOworCS8qKgorCSAqIGNvbnZlcnQgYW4gczE2IGludGVybGVhdmVkLWRhdGEgYXJyYXk7IGV4Y2x1c2l2ZSB3aXRoIGNvbnZlcnQKKwkgKi8KKwl2b2lkICgqY29udmVydF9zMTYpKHZvaWQgKm9iaiwgaW50MTZfdCAqZHN0LCB1bnNpZ25lZCBpbnQgZHN0X2ZyYW1lcywKKwkJCSAgICBjb25zdCBpbnQxNl90ICpzcmMsIHVuc2lnbmVkIGludCBzcmNfZnJhbWVzKTsKKwkvKioKKwkgKiBjb21wdXRlIHRoZSBmcmFtZSBzaXplIGZvciBpbnB1dAorCSAqLworCXNuZF9wY21fdWZyYW1lc190ICgqaW5wdXRfZnJhbWVzKSh2b2lkICpvYmosIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcyk7CisJLyoqCisJICogY29tcHV0ZSB0aGUgZnJhbWUgc2l6ZSBmb3Igb3V0cHV0CisJICovCisJc25kX3BjbV91ZnJhbWVzX3QgKCpvdXRwdXRfZnJhbWVzKSh2b2lkICpvYmosIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcyk7Cit9IHNuZF9wY21fcmF0ZV9vcHNfdDsKKworLyoqIG9wZW4gZnVuY3Rpb24gdHlwZSAqLwordHlwZWRlZiBpbnQgKCpzbmRfcGNtX3JhdGVfb3Blbl9mdW5jX3QpKHVuc2lnbmVkIGludCB2ZXJzaW9uLCB2b2lkICoqb2JqcCwKKwkJCQkJc25kX3BjbV9yYXRlX29wc190ICpvcHNwKTsKKworLyoqCisgKiBEZWZpbmUgdGhlIG9iamVjdCBlbnRyeSBmb3IgZXh0ZXJuYWwgUENNIHJhdGUtY29udmVydGVyIHBsdWdpbnMKKyAqLworI2RlZmluZSBTTkRfUENNX1JBVEVfUExVR0lOX0VOVFJZKG5hbWUpIF9zbmRfcGNtX3JhdGVfIyNuYW1lIyNfb3BlbgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FMU0FfUENNX1JBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3Jhd21pZGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9yYXdtaWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1MTdhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9yYXdtaWRpLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9yYXdtaWRpLmgKKyAqIFxicmllZiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKiBcYXV0aG9yIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKiBcYXV0aG9yIEFicmFtbyBCYWduYXJhIDxhYnJhbW9AYWxzYS1wcm9qZWN0Lm9yZz4KKyAqIFxhdXRob3IgVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgorICogXGRhdGUgMTk5OC0yMDAxCisgKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICovCisvKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mCisgKiAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19BTFNBX1JBV01JRElfSAorI2RlZmluZSBfX0FMU0FfUkFXTUlESV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFJhd01pZGkgUmF3TWlkaSBJbnRlcmZhY2UKKyAqICBUaGUgUmF3TWlkaSBJbnRlcmZhY2UuIFNlZSBccmVmIHJhd21pZGkgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqIGRsc3ltIHZlcnNpb24gZm9yIGludGVyZmFjZSBlbnRyeSBjYWxsYmFjayAqLworI2RlZmluZSBTTkRfUkFXTUlESV9ETFNZTV9WRVJTSU9OCV9kbHN5bV9yYXdtaWRpXzAwMQorCisvKiogUmF3TWlkaSBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcmF3bWlkaV9pbmZvIHNuZF9yYXdtaWRpX2luZm9fdDsKKy8qKiBSYXdNaWRpIHNldHRpbmdzIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9yYXdtaWRpX3BhcmFtcyBzbmRfcmF3bWlkaV9wYXJhbXNfdDsKKy8qKiBSYXdNaWRpIHN0YXR1cyBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfcmF3bWlkaV9zdGF0dXMgc25kX3Jhd21pZGlfc3RhdHVzX3Q7CisKKy8qKiBSYXdNaWRpIHN0cmVhbSAoZGlyZWN0aW9uKSAqLwordHlwZWRlZiBlbnVtIF9zbmRfcmF3bWlkaV9zdHJlYW0geworCS8qKiBPdXRwdXQgc3RyZWFtICovCisJU05EX1JBV01JRElfU1RSRUFNX09VVFBVVCA9IDAsCisJLyoqIElucHV0IHN0cmVhbSAqLworCVNORF9SQVdNSURJX1NUUkVBTV9JTlBVVCwKKwlTTkRfUkFXTUlESV9TVFJFQU1fTEFTVCA9IFNORF9SQVdNSURJX1NUUkVBTV9JTlBVVAorfSBzbmRfcmF3bWlkaV9zdHJlYW1fdDsKKworLyoqIEFwcGVuZCAoZmxhZyB0byBvcGVuIG1vZGUpIFxoaWRlaW5pdGlhbGl6ZXIgKi8KKyNkZWZpbmUgU05EX1JBV01JRElfQVBQRU5ECTB4MDAwMQorLyoqIE5vbiBibG9ja2luZyBtb2RlIChmbGFnIHRvIG9wZW4gbW9kZSkgXGhpZGVpbml0aWFsaXplciAqLworI2RlZmluZSBTTkRfUkFXTUlESV9OT05CTE9DSwkweDAwMDIKKy8qKiBXcml0ZSBzeW5jIG1vZGUgKEZsYWcgdG8gb3BlbiBtb2RlKSBcaGlkZWluaXRpYWxpemVyICovCisjZGVmaW5lIFNORF9SQVdNSURJX1NZTkMJMHgwMDA0CisKKy8qKiBSYXdNaWRpIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9yYXdtaWRpIHNuZF9yYXdtaWRpX3Q7CisKKy8qKiBSYXdNaWRpIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3Jhd21pZGlfdHlwZSB7CisJLyoqIEtlcm5lbCBsZXZlbCBSYXdNaWRpICovCisJU05EX1JBV01JRElfVFlQRV9IVywKKwkvKiogU2hhcmVkIG1lbW9yeSBjbGllbnQgUmF3TWlkaSAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfUkFXTUlESV9UWVBFX1NITSwKKwkvKiogSU5FVCBjbGllbnQgUmF3TWlkaSAobm90IHlldCBpbXBsZW1lbnRlZCkgKi8KKwlTTkRfUkFXTUlESV9UWVBFX0lORVQsCisJLyoqIFZpcnR1YWwgKHNlcXVlbmNlcikgUmF3TWlkaSAqLworCVNORF9SQVdNSURJX1RZUEVfVklSVFVBTAorfSBzbmRfcmF3bWlkaV90eXBlX3Q7CisKK2ludCBzbmRfcmF3bWlkaV9vcGVuKHNuZF9yYXdtaWRpX3QgKippbl9ybWlkaSwgc25kX3Jhd21pZGlfdCAqKm91dF9ybWlkaSwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSk7CitpbnQgc25kX3Jhd21pZGlfb3Blbl9sY29uZihzbmRfcmF3bWlkaV90ICoqaW5fcm1pZGksIHNuZF9yYXdtaWRpX3QgKipvdXRfcm1pZGksCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX3Jhd21pZGlfY2xvc2Uoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworaW50IHNuZF9yYXdtaWRpX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX3Jhd21pZGlfdCAqcm1pZGkpOworaW50IHNuZF9yYXdtaWRpX3BvbGxfZGVzY3JpcHRvcnMoc25kX3Jhd21pZGlfdCAqcm1pZGksIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSk7CitpbnQgc25kX3Jhd21pZGlfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9yYXdtaWRpX3QgKnJhd21pZGksIHN0cnVjdCBwb2xsZmQgKnBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqcmV2ZW50KTsKK2ludCBzbmRfcmF3bWlkaV9ub25ibG9jayhzbmRfcmF3bWlkaV90ICpybWlkaSwgaW50IG5vbmJsb2NrKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3Jhd21pZGlfaW5mb190IHVzaW5nIHN0YW5kYXJkIGFsbG9jYQorICogXHBhcmFtIHB0ciByZXR1cm5lZCBwb2ludGVyCisgKi8KKyNkZWZpbmUgc25kX3Jhd21pZGlfaW5mb19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9yYXdtaWRpX2luZm9fdCAqKSBhbGxvY2Eoc25kX3Jhd21pZGlfaW5mb19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfcmF3bWlkaV9pbmZvX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfcmF3bWlkaV9pbmZvX21hbGxvYyhzbmRfcmF3bWlkaV9pbmZvX3QgKipwdHIpOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX2ZyZWUoc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX2NvcHkoc25kX3Jhd21pZGlfaW5mb190ICpkc3QsIGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqc3JjKTsKK3Vuc2lnbmVkIGludCBzbmRfcmF3bWlkaV9pbmZvX2dldF9kZXZpY2UoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N1YmRldmljZShjb25zdCBzbmRfcmF3bWlkaV9pbmZvX3QgKm9iaik7CitzbmRfcmF3bWlkaV9zdHJlYW1fdCBzbmRfcmF3bWlkaV9pbmZvX2dldF9zdHJlYW0oY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOworaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X2NhcmQoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X2ZsYWdzKGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9yYXdtaWRpX2luZm9fZ2V0X2lkKGNvbnN0IHNuZF9yYXdtaWRpX2luZm9fdCAqb2JqKTsKK2NvbnN0IGNoYXIgKnNuZF9yYXdtaWRpX2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOworY29uc3QgY2hhciAqc25kX3Jhd21pZGlfaW5mb19nZXRfc3ViZGV2aWNlX25hbWUoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N1YmRldmljZXNfY291bnQoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordW5zaWduZWQgaW50IHNuZF9yYXdtaWRpX2luZm9fZ2V0X3N1YmRldmljZXNfYXZhaWwoY29uc3Qgc25kX3Jhd21pZGlfaW5mb190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX3NldF9kZXZpY2Uoc25kX3Jhd21pZGlfaW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX3NldF9zdWJkZXZpY2Uoc25kX3Jhd21pZGlfaW5mb190ICpvYmosIHVuc2lnbmVkIGludCB2YWwpOwordm9pZCBzbmRfcmF3bWlkaV9pbmZvX3NldF9zdHJlYW0oc25kX3Jhd21pZGlfaW5mb190ICpvYmosIHNuZF9yYXdtaWRpX3N0cmVhbV90IHZhbCk7CitpbnQgc25kX3Jhd21pZGlfaW5mbyhzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfaW5mb190ICogaW5mbyk7CitzaXplX3Qgc25kX3Jhd21pZGlfcGFyYW1zX3NpemVvZih2b2lkKTsKKy8qKiBcaGlkZWluaXRpYWxpemVyCisgKiBcYnJpZWYgYWxsb2NhdGUgYW4gaW52YWxpZCAjc25kX3Jhd21pZGlfcGFyYW1zX3QgdXNpbmcgc3RhbmRhcmQgYWxsb2NhCisgKiBccGFyYW0gcHRyIHJldHVybmVkIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfcmF3bWlkaV9wYXJhbXNfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfcmF3bWlkaV9wYXJhbXNfdCAqKSBhbGxvY2Eoc25kX3Jhd21pZGlfcGFyYW1zX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIHNuZF9yYXdtaWRpX3BhcmFtc19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3Jhd21pZGlfcGFyYW1zX21hbGxvYyhzbmRfcmF3bWlkaV9wYXJhbXNfdCAqKnB0cik7Cit2b2lkIHNuZF9yYXdtaWRpX3BhcmFtc19mcmVlKHNuZF9yYXdtaWRpX3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfcmF3bWlkaV9wYXJhbXNfY29weShzbmRfcmF3bWlkaV9wYXJhbXNfdCAqZHN0LCBjb25zdCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqc3JjKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfc2V0X2J1ZmZlcl9zaXplKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zLCBzaXplX3QgdmFsKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHNuZF9yYXdtaWRpX3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9yYXdtaWRpX3BhcmFtc19zZXRfYXZhaWxfbWluKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zLCBzaXplX3QgdmFsKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9wYXJhbXNfZ2V0X2F2YWlsX21pbihjb25zdCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfc2V0X25vX2FjdGl2ZV9zZW5zaW5nKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zLCBpbnQgdmFsKTsKK2ludCBzbmRfcmF3bWlkaV9wYXJhbXNfZ2V0X25vX2FjdGl2ZV9zZW5zaW5nKGNvbnN0IHNuZF9yYXdtaWRpX3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9yYXdtaWRpX3BhcmFtcyhzbmRfcmF3bWlkaV90ICpybWlkaSwgc25kX3Jhd21pZGlfcGFyYW1zX3QgKiBwYXJhbXMpOworaW50IHNuZF9yYXdtaWRpX3BhcmFtc19jdXJyZW50KHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBzbmRfcmF3bWlkaV9wYXJhbXNfdCAqcGFyYW1zKTsKK3NpemVfdCBzbmRfcmF3bWlkaV9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIFxoaWRlaW5pdGlhbGl6ZXIKKyAqIFxicmllZiBhbGxvY2F0ZSBhbiBpbnZhbGlkICNzbmRfcmF3bWlkaV9zdGF0dXNfdCB1c2luZyBzdGFuZGFyZCBhbGxvY2EKKyAqIFxwYXJhbSBwdHIgcmV0dXJuZWQgcG9pbnRlcgorICovCisjZGVmaW5lIHNuZF9yYXdtaWRpX3N0YXR1c19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9yYXdtaWRpX3N0YXR1c190ICopIGFsbG9jYShzbmRfcmF3bWlkaV9zdGF0dXNfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3Jhd21pZGlfc3RhdHVzX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfcmF3bWlkaV9zdGF0dXNfbWFsbG9jKHNuZF9yYXdtaWRpX3N0YXR1c190ICoqcHRyKTsKK3ZvaWQgc25kX3Jhd21pZGlfc3RhdHVzX2ZyZWUoc25kX3Jhd21pZGlfc3RhdHVzX3QgKm9iaik7Cit2b2lkIHNuZF9yYXdtaWRpX3N0YXR1c19jb3B5KHNuZF9yYXdtaWRpX3N0YXR1c190ICpkc3QsIGNvbnN0IHNuZF9yYXdtaWRpX3N0YXR1c190ICpzcmMpOwordm9pZCBzbmRfcmF3bWlkaV9zdGF0dXNfZ2V0X3RzdGFtcChjb25zdCBzbmRfcmF3bWlkaV9zdGF0dXNfdCAqb2JqLCBzbmRfaHRpbWVzdGFtcF90ICpwdHIpOworc2l6ZV90IHNuZF9yYXdtaWRpX3N0YXR1c19nZXRfYXZhaWwoY29uc3Qgc25kX3Jhd21pZGlfc3RhdHVzX3QgKm9iaik7CitzaXplX3Qgc25kX3Jhd21pZGlfc3RhdHVzX2dldF94cnVucyhjb25zdCBzbmRfcmF3bWlkaV9zdGF0dXNfdCAqb2JqKTsKK2ludCBzbmRfcmF3bWlkaV9zdGF0dXMoc25kX3Jhd21pZGlfdCAqcm1pZGksIHNuZF9yYXdtaWRpX3N0YXR1c190ICogc3RhdHVzKTsKK2ludCBzbmRfcmF3bWlkaV9kcmFpbihzbmRfcmF3bWlkaV90ICpybWlkaSk7CitpbnQgc25kX3Jhd21pZGlfZHJvcChzbmRfcmF3bWlkaV90ICpybWlkaSk7Citzc2l6ZV90IHNuZF9yYXdtaWRpX3dyaXRlKHNuZF9yYXdtaWRpX3QgKnJtaWRpLCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK3NzaXplX3Qgc25kX3Jhd21pZGlfcmVhZChzbmRfcmF3bWlkaV90ICpybWlkaSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Citjb25zdCBjaGFyICpzbmRfcmF3bWlkaV9uYW1lKHNuZF9yYXdtaWRpX3QgKnJtaWRpKTsKK3NuZF9yYXdtaWRpX3R5cGVfdCBzbmRfcmF3bWlkaV90eXBlKHNuZF9yYXdtaWRpX3QgKnJtaWRpKTsKK3NuZF9yYXdtaWRpX3N0cmVhbV90IHNuZF9yYXdtaWRpX3N0cmVhbShzbmRfcmF3bWlkaV90ICpyYXdtaWRpKTsKKworLyoqIFx9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1JBV01JRElfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlYTcxMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXEuaApAQCAtMCwwICsxLDc0MCBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3NlcS5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICovCisvKgorICogQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICoKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfU0VRX0gKKyNkZWZpbmUgX19BTFNBX1NFUV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcXVlbmNlciBNSURJIFNlcXVlbmNlcgorICogIE1JREkgU2VxdWVuY2VyIEludGVyZmFjZS4KKyAqICBTZWUgXHJlZiBzZXEgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqIGRsc3ltIHZlcnNpb24gZm9yIGludGVyZmFjZSBlbnRyeSBjYWxsYmFjayAqLworI2RlZmluZSBTTkRfU0VRX0RMU1lNX1ZFUlNJT04JCV9kbHN5bV9zZXFfMDAxCisKKy8qKiBTZXF1ZW5jZXIgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcSBzbmRfc2VxX3Q7CisKKyNpZm5kZWYgRE9DX0hJRERFTgorI2RlZmluZSBTTkRfQUxMT0NBKHR5cGUscHRyKSBcCitkbyB7XAorCWFzc2VydChwdHIpO1wKKwkqcHRyID0gKHR5cGUjI190ICopYWxsb2NhKHR5cGUjI19zaXplb2YoKSk7XAorCW1lbXNldCgqcHRyLCAwLCB0eXBlIyNfc2l6ZW9mKCkpO1wKK30gd2hpbGUgKDApCisjZW5kaWYKKworLyoqCisgKiBzZXF1ZW5jZXIgb3BlbmluZyBzdHJlYW0gdHlwZXMKKyAqLworI2RlZmluZSBTTkRfU0VRX09QRU5fT1VUUFVUCTEJLyoqPCBvcGVuIGZvciBvdXRwdXQgKHdyaXRlKSAqLworI2RlZmluZSBTTkRfU0VRX09QRU5fSU5QVVQJMgkvKio8IG9wZW4gZm9yIGlucHV0IChyZWFkKSAqLworI2RlZmluZSBTTkRfU0VRX09QRU5fRFVQTEVYCShTTkRfU0VRX09QRU5fT1VUUFVUfFNORF9TRVFfT1BFTl9JTlBVVCkJLyoqPCBvcGVuIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgKHJlYWQvd3JpdGUpICovCisKKy8qKgorICogc2VxdWVuY2VyIG9wZW5pbmcgbW9kZQorICovCisjZGVmaW5lIFNORF9TRVFfTk9OQkxPQ0sJMHgwMDAxCS8qKjwgbm9uLWJsb2NraW5nIG1vZGUgKGZsYWcgdG8gb3BlbiBtb2RlKSAqLworCisvKiogc2VxdWVuY2VyIGhhbmRsZSB0eXBlICovCit0eXBlZGVmIGVudW0gX3NuZF9zZXFfdHlwZSB7CisJU05EX1NFUV9UWVBFX0hXLAkJLyoqPCBoYXJkd2FyZSAqLworCVNORF9TRVFfVFlQRV9TSE0sCQkvKio8IHNoYXJlZCBtZW1vcnkgKE5ZSSkgKi8KKwlTTkRfU0VRX1RZUEVfSU5FVAkJLyoqPCBuZXR3b3JrIChOWUkpICovCit9IHNuZF9zZXFfdHlwZV90OworCisvKiogc3BlY2lhbCBjbGllbnQgKHBvcnQpIGlkcyAqLworI2RlZmluZSBTTkRfU0VRX0FERFJFU1NfVU5LTk9XTgkJMjUzCS8qKjwgdW5rbm93biBzb3VyY2UgKi8KKyNkZWZpbmUgU05EX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTCTI1NAkvKio8IHNlbmQgZXZlbnQgdG8gYWxsIHN1YnNjcmliZWQgcG9ydHMgKi8KKyNkZWZpbmUgU05EX1NFUV9BRERSRVNTX0JST0FEQ0FTVAkyNTUJLyoqPCBzZW5kIGV2ZW50IHRvIGFsbCBxdWV1ZXMvY2xpZW50cy9wb3J0cy9jaGFubmVscyAqLworCisvKioga25vd24gY2xpZW50IG51bWJlcnMgKi8KKyNkZWZpbmUgU05EX1NFUV9DTElFTlRfU1lTVEVNCQkwCS8qKjwgc3lzdGVtIGNsaWVudCAqLworCisvKgorICovCitpbnQgc25kX3NlcV9vcGVuKHNuZF9zZXFfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHN0cmVhbXMsIGludCBtb2RlKTsKK2ludCBzbmRfc2VxX29wZW5fbGNvbmYoc25kX3NlcV90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RyZWFtcywgaW50IG1vZGUsIHNuZF9jb25maWdfdCAqbGNvbmYpOworY29uc3QgY2hhciAqc25kX3NlcV9uYW1lKHNuZF9zZXFfdCAqc2VxKTsKK3NuZF9zZXFfdHlwZV90IHNuZF9zZXFfdHlwZShzbmRfc2VxX3QgKnNlcSk7CitpbnQgc25kX3NlcV9jbG9zZShzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9wb2xsX2Rlc2NyaXB0b3JzX2NvdW50KHNuZF9zZXFfdCAqaGFuZGxlLCBzaG9ydCBldmVudHMpOworaW50IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9ycyhzbmRfc2VxX3QgKmhhbmRsZSwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlLCBzaG9ydCBldmVudHMpOworaW50IHNuZF9zZXFfcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9zZXFfdCAqc2VxLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF9zZXFfbm9uYmxvY2soc25kX3NlcV90ICpoYW5kbGUsIGludCBub25ibG9jayk7CitpbnQgc25kX3NlcV9jbGllbnRfaWQoc25kX3NlcV90ICpoYW5kbGUpOworCitzaXplX3Qgc25kX3NlcV9nZXRfb3V0cHV0X2J1ZmZlcl9zaXplKHNuZF9zZXFfdCAqaGFuZGxlKTsKK3NpemVfdCBzbmRfc2VxX2dldF9pbnB1dF9idWZmZXJfc2l6ZShzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9zZXRfb3V0cHV0X2J1ZmZlcl9zaXplKHNuZF9zZXFfdCAqaGFuZGxlLCBzaXplX3Qgc2l6ZSk7CitpbnQgc25kX3NlcV9zZXRfaW5wdXRfYnVmZmVyX3NpemUoc25kX3NlcV90ICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKworLyoqIHN5c3RlbSBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3N5c3RlbV9pbmZvIHNuZF9zZXFfc3lzdGVtX2luZm9fdDsKKworc2l6ZV90IHNuZF9zZXFfc3lzdGVtX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfc3lzdGVtX2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9zeXN0ZW1faW5mb19hbGxvY2EocHRyKSBcCisJU05EX0FMTE9DQShzbmRfc2VxX3N5c3RlbV9pbmZvLCBwdHIpCitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19tYWxsb2Moc25kX3NlcV9zeXN0ZW1faW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9zeXN0ZW1faW5mb19mcmVlKHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9zeXN0ZW1faW5mb19jb3B5KHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKnNyYyk7CisKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX2dldF9xdWV1ZXMoY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX2dldF9jbGllbnRzKGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19nZXRfcG9ydHMoY29uc3Qgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3N5c3RlbV9pbmZvX2dldF9jaGFubmVscyhjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc3lzdGVtX2luZm9fZ2V0X2N1cl9jbGllbnRzKGNvbnN0IHNuZF9zZXFfc3lzdGVtX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9zeXN0ZW1faW5mb19nZXRfY3VyX3F1ZXVlcyhjb25zdCBzbmRfc2VxX3N5c3RlbV9pbmZvX3QgKmluZm8pOworCitpbnQgc25kX3NlcV9zeXN0ZW1faW5mbyhzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9zeXN0ZW1faW5mb190ICppbmZvKTsKKworLyoqIFx9ICovCisKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcUNsaWVudCBTZXF1ZW5jZXIgQ2xpZW50IEludGVyZmFjZQorICogIFNlcXVlbmNlciBDbGllbnQgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKiogY2xpZW50IGluZm9ybWF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfY2xpZW50X2luZm8gc25kX3NlcV9jbGllbnRfaW5mb190OworCisvKiogY2xpZW50IHR5cGVzICovCit0eXBlZGVmIGVudW0gc25kX3NlcV9jbGllbnRfdHlwZSB7CisJU05EX1NFUV9VU0VSX0NMSUVOVCAgICAgPSAxLAkvKio8IHVzZXIgY2xpZW50ICovCisJU05EX1NFUV9LRVJORUxfQ0xJRU5UICAgPSAyCS8qKjwga2VybmVsIGNsaWVudCAqLworfSBzbmRfc2VxX2NsaWVudF90eXBlX3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAKK3NpemVfdCBzbmRfc2VxX2NsaWVudF9pbmZvX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX2NsaWVudF9pbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9zZXFfY2xpZW50X2luZm9fYWxsb2NhKHB0cikgXAorCVNORF9BTExPQ0Eoc25kX3NlcV9jbGllbnRfaW5mbywgcHRyKQoraW50IHNuZF9zZXFfY2xpZW50X2luZm9fbWFsbG9jKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fZnJlZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fY29weShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICpzcmMpOworCitpbnQgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfY2xpZW50KGNvbnN0IHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CitzbmRfc2VxX2NsaWVudF90eXBlX3Qgc25kX3NlcV9jbGllbnRfaW5mb19nZXRfdHlwZShjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworY29uc3QgY2hhciAqc25kX3NlcV9jbGllbnRfaW5mb19nZXRfbmFtZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2Jyb2FkY2FzdF9maWx0ZXIoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2NsaWVudF9pbmZvX2dldF9lcnJvcl9ib3VuY2UoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKnNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2V2ZW50X2ZpbHRlcihjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X251bV9wb3J0cyhjb25zdCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfY2xpZW50X2luZm9fZ2V0X2V2ZW50X2xvc3QoY29uc3Qgc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9jbGllbnQoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCBpbnQgY2xpZW50KTsKK3ZvaWQgc25kX3NlcV9jbGllbnRfaW5mb19zZXRfbmFtZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9icm9hZGNhc3RfZmlsdGVyKHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbywgaW50IHZhbCk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X2luZm9fc2V0X2Vycm9yX2JvdW5jZShzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX2NsaWVudF9pbmZvX3NldF9ldmVudF9maWx0ZXIoc25kX3NlcV9jbGllbnRfaW5mb190ICppbmZvLCB1bnNpZ25lZCBjaGFyICpmaWx0ZXIpOworCitpbnQgc25kX3NlcV9nZXRfY2xpZW50X2luZm8oc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9nZXRfYW55X2NsaWVudF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgY2xpZW50LCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfbmV4dF9jbGllbnQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfY2xpZW50X2luZm9fdCAqaW5mbyk7CisKKy8qCisgKi8KKworLyoqIGNsaWVudCBwb29sIGluZm9ybWF0aW9uIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfY2xpZW50X3Bvb2wgc25kX3NlcV9jbGllbnRfcG9vbF90OworCitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9jbGllbnRfcG9vbF90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX2NsaWVudF9wb29sX2FsbG9jYShwdHIpIFwKKwlTTkRfQUxMT0NBKHNuZF9zZXFfY2xpZW50X3Bvb2wsIHB0cikKK2ludCBzbmRfc2VxX2NsaWVudF9wb29sX21hbGxvYyhzbmRfc2VxX2NsaWVudF9wb29sX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX2ZyZWUoc25kX3NlcV9jbGllbnRfcG9vbF90ICpwdHIpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX2NvcHkoc25kX3NlcV9jbGllbnRfcG9vbF90ICpkc3QsIGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqc3JjKTsKKworaW50IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X2NsaWVudChjb25zdCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworc2l6ZV90IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X291dHB1dF9wb29sKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfaW5wdXRfcG9vbChjb25zdCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworc2l6ZV90IHNuZF9zZXFfY2xpZW50X3Bvb2xfZ2V0X291dHB1dF9yb29tKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7CitzaXplX3Qgc25kX3NlcV9jbGllbnRfcG9vbF9nZXRfb3V0cHV0X2ZyZWUoY29uc3Qgc25kX3NlcV9jbGllbnRfcG9vbF90ICppbmZvKTsKK3NpemVfdCBzbmRfc2VxX2NsaWVudF9wb29sX2dldF9pbnB1dF9mcmVlKGNvbnN0IHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbyk7Cit2b2lkIHNuZF9zZXFfY2xpZW50X3Bvb2xfc2V0X291dHB1dF9wb29sKHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbywgc2l6ZV90IHNpemUpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX3NldF9pbnB1dF9wb29sKHNuZF9zZXFfY2xpZW50X3Bvb2xfdCAqaW5mbywgc2l6ZV90IHNpemUpOwordm9pZCBzbmRfc2VxX2NsaWVudF9wb29sX3NldF9vdXRwdXRfcm9vbShzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8sIHNpemVfdCBzaXplKTsKKworaW50IHNuZF9zZXFfZ2V0X2NsaWVudF9wb29sKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9wb29sKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2NsaWVudF9wb29sX3QgKmluZm8pOworCisKKy8qKiBcfSAqLworCisKKy8qKgorICogIFxkZWZncm91cCBTZXFQb3J0IFNlcXVlbmNlciBQb3J0IEludGVyZmFjZQorICogIFNlcXVlbmNlciBQb3J0IEludGVyZmFjZQorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyoqIHBvcnQgaW5mb3JtYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9wb3J0X2luZm8gc25kX3NlcV9wb3J0X2luZm9fdDsKKworLyoqIGtub3duIHBvcnQgbnVtYmVycyAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSCTAJLyoqPCBzeXN0ZW0gdGltZXIgcG9ydCAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfU1lTVEVNX0FOTk9VTkNFCTEJLyoqPCBzeXN0ZW0gYW5ub3VuY2UgcG9ydCAqLworCisvKiogcG9ydCBjYXBhYmlsaXRpZXMgKDMyIGJpdHMpICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9DQVBfUkVBRAkJKDE8PDApCS8qKjwgcmVhZGFibGUgZnJvbSB0aGlzIHBvcnQgKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9XUklURQkJKDE8PDEpCS8qKjwgd3JpdGFibGUgdG8gdGhpcyBwb3J0ICovCisKKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TWU5DX1JFQUQJKDE8PDIpCS8qKjwgYWxsb3cgcmVhZCBzdWJzY3JpcHRpb25zICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9DQVBfU1lOQ19XUklURQkoMTw8MykJLyoqPCBhbGxvdyB3cml0ZSBzdWJzY3JpcHRpb25zICovCisKKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9EVVBMRVgJCSgxPDw0KQkvKio8IGFsbG93IHJlYWQvd3JpdGUgZHVwbGV4ICovCisKKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1JFQUQJKDE8PDUpCS8qKjwgYWxsb3cgcmVhZCBzdWJzY3JpcHRpb24gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFCSgxPDw2KQkvKio8IGFsbG93IHdyaXRlIHN1YnNjcmlwdGlvbiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfQ0FQX05PX0VYUE9SVAkoMTw8NykJLyoqPCByb3V0aW5nIG5vdCBhbGxvd2VkICovCisKKy8qIHBvcnQgdHlwZSAqLworLyoqIE1lc3NhZ2VzIHNlbnQgZnJvbS90byB0aGlzIHBvcnQgaGF2ZSBkZXZpY2Utc3BlY2lmaWMgc2VtYW50aWNzLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9TUEVDSUZJQwkoMTw8MCkKKy8qKiBUaGlzIHBvcnQgdW5kZXJzdGFuZHMgTUlESSBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDCSgxPDwxKQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEdlbmVyYWwgTUlESSBzcGVjaWZpY2F0aW9uLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dNCSgxPDwyKQorLyoqIFRoaXMgcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFJvbGFuZCBHUyBzdGFuZGFyZC4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9HUwkoMTw8MykKKy8qKiBUaGlzIHBvcnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBZYW1haGEgWEcgc3BlY2lmaWNhdGlvbi4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfTUlESV9YRwkoMTw8NCkKKy8qKiBUaGlzIHBvcnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBSb2xhbmQgTVQtMzIuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX01JRElfTVQzMgkoMTw8NSkKKy8qKiBUaGlzIHBvcnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBHZW5lcmFsIE1JREkgMiBzcGVjaWZpY2F0aW9uLiAqLworI2RlZmluZSBTTkRfU0VRX1BPUlRfVFlQRV9NSURJX0dNMgkoMTw8NikKKy8qKiBUaGlzIHBvcnQgdW5kZXJzdGFuZHMgU05EX1NFUV9FVkVOVF9TQU1QTEVfeHh4IG1lc3NhZ2VzCisgICAgKHRoZXNlIGFyZSBub3QgTUlESSBtZXNzYWdlcykuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX1NZTlRICQkoMTw8MTApCisvKiogSW5zdHJ1bWVudHMgY2FuIGJlIGRvd25sb2FkZWQgdG8gdGhpcyBwb3J0CisgICAgKHdpdGggU05EX1NFUV9FVkVOVF9JTlNUUl94eHggbWVzc2FnZXMgc2VudCBkaXJlY3RseSkuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX0RJUkVDVF9TQU1QTEUgKDE8PDExKQorLyoqIEluc3RydW1lbnRzIGNhbiBiZSBkb3dubG9hZGVkIHRvIHRoaXMgcG9ydAorICAgICh3aXRoIFNORF9TRVFfRVZFTlRfSU5TVFJfeHh4IG1lc3NhZ2VzIHNlbnQgZGlyZWN0bHkgb3IgdGhyb3VnaCBhIHF1ZXVlKS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfU0FNUExFCSgxPDwxMikKKy8qKiBUaGlzIHBvcnQgaXMgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX0hBUkRXQVJFCSgxPDwxNikKKy8qKiBUaGlzIHBvcnQgaXMgaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUuICovCisjZGVmaW5lIFNORF9TRVFfUE9SVF9UWVBFX1NPRlRXQVJFCSgxPDwxNykKKy8qKiBNZXNzYWdlcyBzZW50IHRvIHRoaXMgcG9ydCB3aWxsIGdlbmVyYXRlIHNvdW5kcy4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfU1lOVEhFU0laRVIJKDE8PDE4KQorLyoqIFRoaXMgcG9ydCBtYXkgY29ubmVjdCB0byBvdGhlciBkZXZpY2VzCisgICAgKHdob3NlIGNoYXJhY3RlcmlzdGljcyBhcmUgbm90IGtub3duKS4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfUE9SVAkJKDE8PDE5KQorLyoqIFRoaXMgcG9ydCBiZWxvbmdzIHRvIGFuIGFwcGxpY2F0aW9uLCBzdWNoIGFzIGEgc2VxdWVuY2VyIG9yIGVkaXRvci4gKi8KKyNkZWZpbmUgU05EX1NFUV9QT1JUX1RZUEVfQVBQTElDQVRJT04JKDE8PDIwKQorCisKK3NpemVfdCBzbmRfc2VxX3BvcnRfaW5mb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9wb3J0X2luZm9fdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9wb3J0X2luZm9fYWxsb2NhKHB0cikgXAorCVNORF9BTExPQ0Eoc25kX3NlcV9wb3J0X2luZm8sIHB0cikKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19tYWxsb2Moc25kX3NlcV9wb3J0X2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX2ZyZWUoc25kX3NlcV9wb3J0X2luZm9fdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fY29weShzbmRfc2VxX3BvcnRfaW5mb190ICpkc3QsIGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKnNyYyk7CisKK2ludCBzbmRfc2VxX3BvcnRfaW5mb19nZXRfY2xpZW50KGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9wb3J0KGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworY29uc3Qgc25kX3NlcV9hZGRyX3QgKnNuZF9zZXFfcG9ydF9pbmZvX2dldF9hZGRyKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworY29uc3QgY2hhciAqc25kX3NlcV9wb3J0X2luZm9fZ2V0X25hbWUoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X2NhcGFiaWxpdHkoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3R5cGUoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X21pZGlfY2hhbm5lbHMoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X21pZGlfdm9pY2VzKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF9zeW50aF92b2ljZXMoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3JlYWRfdXNlKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF93cml0ZV91c2UoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3BvcnRfc3BlY2lmaWVkKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF90aW1lc3RhbXBpbmcoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X2luZm9fZ2V0X3RpbWVzdGFtcF9yZWFsKGNvbnN0IHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9pbmZvX2dldF90aW1lc3RhbXBfcXVldWUoY29uc3Qgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X2NsaWVudChzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgY2xpZW50KTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X3BvcnQoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IHBvcnQpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfYWRkcihzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF9uYW1lKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfY2FwYWJpbGl0eShzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCB1bnNpZ25lZCBpbnQgY2FwYWJpbGl0eSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF90eXBlKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIHVuc2lnbmVkIGludCB0eXBlKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X21pZGlfY2hhbm5lbHMoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IGNoYW5uZWxzKTsKK3ZvaWQgc25kX3NlcV9wb3J0X2luZm9fc2V0X21pZGlfdm9pY2VzKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCB2b2ljZXMpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfc3ludGhfdm9pY2VzKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCB2b2ljZXMpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfcG9ydF9zcGVjaWZpZWQoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IHZhbCk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF90aW1lc3RhbXBpbmcoc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbywgaW50IGVuYWJsZSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9pbmZvX3NldF90aW1lc3RhbXBfcmVhbChzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvLCBpbnQgcmVhbHRpbWUpOwordm9pZCBzbmRfc2VxX3BvcnRfaW5mb19zZXRfdGltZXN0YW1wX3F1ZXVlKHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8sIGludCBxdWV1ZSk7CisKK2ludCBzbmRfc2VxX2NyZWF0ZV9wb3J0KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2RlbGV0ZV9wb3J0KHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcG9ydCk7CitpbnQgc25kX3NlcV9nZXRfcG9ydF9pbmZvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcG9ydCwgc25kX3NlcV9wb3J0X2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9nZXRfYW55X3BvcnRfaW5mbyhzbmRfc2VxX3QgKmhhbmRsZSwgaW50IGNsaWVudCwgaW50IHBvcnQsIHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc2V0X3BvcnRfaW5mbyhzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHBvcnQsIHNuZF9zZXFfcG9ydF9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfbmV4dF9wb3J0KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3BvcnRfaW5mb190ICppbmZvKTsKKworLyoqIFx9ICovCisKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcVN1YnNjcmliZSBTZXF1ZW5jZXIgUG9ydCBTdWJzY3JpcHRpb24KKyAqICBTZXF1ZW5jZXIgUG9ydCBTdWJzY3JpcHRpb24KKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qKiBwb3J0IHN1YnNjcmlwdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3BvcnRfc3Vic2NyaWJlIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdDsKKworc2l6ZV90IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9hbGxvY2EocHRyKSBcCisJU05EX0FMTE9DQShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlLCBwdHIpCitpbnQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9tYWxsb2Moc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9mcmVlKHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9jb3B5KHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqZHN0LCBjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKnNyYyk7CisKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF9zZW5kZXIoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2NvbnN0IHNuZF9zZXFfYWRkcl90ICpzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF9kZXN0KGNvbnN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF9leGNsdXNpdmUoY29uc3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX2dldF90aW1lX3VwZGF0ZShjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfZ2V0X3RpbWVfcmVhbChjb25zdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8pOworCit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X3NlbmRlcihzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfZGVzdChzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGNvbnN0IHNuZF9zZXFfYWRkcl90ICphZGRyKTsKK3ZvaWQgc25kX3NlcV9wb3J0X3N1YnNjcmliZV9zZXRfcXVldWUoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBpbnQgcSk7Cit2b2lkIHNuZF9zZXFfcG9ydF9zdWJzY3JpYmVfc2V0X2V4Y2x1c2l2ZShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF90aW1lX3VwZGF0ZShzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKmluZm8sIGludCB2YWwpOwordm9pZCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3NldF90aW1lX3JlYWwoc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICppbmZvLCBpbnQgdmFsKTsKKworaW50IHNuZF9zZXFfZ2V0X3BvcnRfc3Vic2NyaXB0aW9uKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlX3QgKnN1Yik7CitpbnQgc25kX3NlcV9zdWJzY3JpYmVfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICpzdWIpOworaW50IHNuZF9zZXFfdW5zdWJzY3JpYmVfcG9ydChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9wb3J0X3N1YnNjcmliZV90ICpzdWIpOworCisvKgorICovCisKKy8qKiBzdWJzY3JpcHRpb24gcXVlcnkgY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWVyeV9zdWJzY3JpYmUgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdDsKKworLyoqIHR5cGUgb2YgcXVlcnkgc3Vic2NyaXB0aW9uICovCit0eXBlZGVmIGVudW0geworCVNORF9TRVFfUVVFUllfU1VCU19SRUFELAkvKio8IHF1ZXJ5IHJlYWQgc3Vic2NyaXB0aW9ucyAqLworCVNORF9TRVFfUVVFUllfU1VCU19XUklURQkvKio8IHF1ZXJ5IHdyaXRlIHN1YnNjcmlwdGlvbnMgKi8KK30gc25kX3NlcV9xdWVyeV9zdWJzX3R5cGVfdDsKKworc2l6ZV90IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9hbGxvY2EocHRyKSBcCisJU05EX0FMTE9DQShzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZSwgcHRyKQoraW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX21hbGxvYyhzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICoqcHRyKTsKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZnJlZShzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9jb3B5KHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9jbGllbnQoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3BvcnQoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3Jvb3QoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitzbmRfc2VxX3F1ZXJ5X3N1YnNfdHlwZV90IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF90eXBlKGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9pbmRleChjb25zdCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9nZXRfbnVtX3N1YnMoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX2FkZHJfdCAqc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X2FkZHIoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF9leGNsdXNpdmUoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfZ2V0X3RpbWVfdXBkYXRlKGNvbnN0IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX2dldF90aW1lX3JlYWwoY29uc3Qgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X2NsaWVudChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBpbnQgY2xpZW50KTsKK3ZvaWQgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfc2V0X3BvcnQoc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqaW5mbywgaW50IHBvcnQpOwordm9pZCBzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV9zZXRfcm9vdChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF90eXBlKHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3QgKmluZm8sIHNuZF9zZXFfcXVlcnlfc3Vic190eXBlX3QgdHlwZSk7Cit2b2lkIHNuZF9zZXFfcXVlcnlfc3Vic2NyaWJlX3NldF9pbmRleChzbmRfc2VxX3F1ZXJ5X3N1YnNjcmliZV90ICppbmZvLCBpbnQgX2luZGV4KTsKKworaW50IHNuZF9zZXFfcXVlcnlfcG9ydF9zdWJzY3JpYmVycyhzbmRfc2VxX3QgKnNlcSwgc25kX3NlcV9xdWVyeV9zdWJzY3JpYmVfdCAqIHN1YnMpOworCisvKiogXH0gKi8KKworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxUXVldWUgU2VxdWVuY2VyIFF1ZXVlIEludGVyZmFjZQorICogIFNlcXVlbmNlciBRdWV1ZSBJbnRlcmZhY2UKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qKiBxdWV1ZSBpbmZvcm1hdGlvbiBjb250YWluZXIgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfc2VxX3F1ZXVlX2luZm8gc25kX3NlcV9xdWV1ZV9pbmZvX3Q7CisvKiogcXVldWUgc3RhdHVzIGNvbnRhaW5lciAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9zZXFfcXVldWVfc3RhdHVzIHNuZF9zZXFfcXVldWVfc3RhdHVzX3Q7CisvKiogcXVldWUgdGVtcG8gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWV1ZV90ZW1wbyBzbmRfc2VxX3F1ZXVlX3RlbXBvX3Q7CisvKiogcXVldWUgdGltZXIgaW5mb3JtYXRpb24gY29udGFpbmVyICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9xdWV1ZV90aW1lciBzbmRfc2VxX3F1ZXVlX3RpbWVyX3Q7CisKKy8qKiBzcGVjaWFsIHF1ZXVlIGlkcyAqLworI2RlZmluZSBTTkRfU0VRX1FVRVVFX0RJUkVDVAkJMjUzCS8qKjwgZGlyZWN0IGRpc3BhdGNoICovCisKK3NpemVfdCBzbmRfc2VxX3F1ZXVlX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfcXVldWVfaW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX2luZm9fYWxsb2NhKHB0cikgXAorCVNORF9BTExPQ0Eoc25kX3NlcV9xdWV1ZV9pbmZvLCBwdHIpCitpbnQgc25kX3NlcV9xdWV1ZV9pbmZvX21hbGxvYyhzbmRfc2VxX3F1ZXVlX2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfaW5mb19mcmVlKHNuZF9zZXFfcXVldWVfaW5mb190ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX2luZm9fY29weShzbmRfc2VxX3F1ZXVlX2luZm9fdCAqZHN0LCBjb25zdCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVldWVfaW5mb19nZXRfcXVldWUoY29uc3Qgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworY29uc3QgY2hhciAqc25kX3NlcV9xdWV1ZV9pbmZvX2dldF9uYW1lKGNvbnN0IHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXVlX2luZm9fZ2V0X293bmVyKGNvbnN0IHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXVlX2luZm9fZ2V0X2xvY2tlZChjb25zdCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9xdWV1ZV9pbmZvX2dldF9mbGFncyhjb25zdCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9xdWV1ZV9pbmZvX3NldF9uYW1lKHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV9pbmZvX3NldF9vd25lcihzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbywgaW50IG93bmVyKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV9pbmZvX3NldF9sb2NrZWQoc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8sIGludCBsb2NrZWQpOwordm9pZCBzbmRfc2VxX3F1ZXVlX2luZm9fc2V0X2ZsYWdzKHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCitpbnQgc25kX3NlcV9jcmVhdGVfcXVldWUoc25kX3NlcV90ICpzZXEsIHNuZF9zZXFfcXVldWVfaW5mb190ICppbmZvKTsKK2ludCBzbmRfc2VxX2FsbG9jX25hbWVkX3F1ZXVlKHNuZF9zZXFfdCAqc2VxLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBzbmRfc2VxX2FsbG9jX3F1ZXVlKHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX2ZyZWVfcXVldWUoc25kX3NlcV90ICpoYW5kbGUsIGludCBxKTsKK2ludCBzbmRfc2VxX2dldF9xdWV1ZV9pbmZvKHNuZF9zZXFfdCAqc2VxLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV9pbmZvX3QgKmluZm8pOworaW50IHNuZF9zZXFfc2V0X3F1ZXVlX2luZm8oc25kX3NlcV90ICpzZXEsIGludCBxLCBzbmRfc2VxX3F1ZXVlX2luZm9fdCAqaW5mbyk7CitpbnQgc25kX3NlcV9xdWVyeV9uYW1lZF9xdWV1ZShzbmRfc2VxX3QgKnNlcSwgY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBzbmRfc2VxX2dldF9xdWV1ZV91c2FnZShzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHEpOworaW50IHNuZF9zZXFfc2V0X3F1ZXVlX3VzYWdlKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSwgaW50IHVzZWQpOworCisvKgorICovCitzaXplX3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlIGEgI3NuZF9zZXFfcXVldWVfc3RhdHVzX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF9zZXFfcXVldWVfc3RhdHVzX2FsbG9jYShwdHIpIFwKKwlTTkRfQUxMT0NBKHNuZF9zZXFfcXVldWVfc3RhdHVzLCBwdHIpCitpbnQgc25kX3NlcV9xdWV1ZV9zdGF0dXNfbWFsbG9jKHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3N0YXR1c19mcmVlKHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKnB0cik7Cit2b2lkIHNuZF9zZXFfcXVldWVfc3RhdHVzX2NvcHkoc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICpzcmMpOworCitpbnQgc25kX3NlcV9xdWV1ZV9zdGF0dXNfZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOworaW50IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF9ldmVudHMoY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqaW5mbyk7CitzbmRfc2VxX3RpY2tfdGltZV90IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF90aWNrX3RpbWUoY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX3JlYWxfdGltZV90ICpzbmRfc2VxX3F1ZXVlX3N0YXR1c19nZXRfcmVhbF90aW1lKGNvbnN0IHNuZF9zZXFfcXVldWVfc3RhdHVzX3QgKmluZm8pOwordW5zaWduZWQgaW50IHNuZF9zZXFfcXVldWVfc3RhdHVzX2dldF9zdGF0dXMoY29uc3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXNfdCAqaW5mbyk7CisKK2ludCBzbmRfc2VxX2dldF9xdWV1ZV9zdGF0dXMoc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3N0YXR1c190ICpzdGF0dXMpOworCisvKgorICovCitzaXplX3Qgc25kX3NlcV9xdWV1ZV90ZW1wb19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWV1ZV90ZW1wb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX3RlbXBvX2FsbG9jYShwdHIpIFwKKwlTTkRfQUxMT0NBKHNuZF9zZXFfcXVldWVfdGVtcG8sIHB0cikKK2ludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX21hbGxvYyhzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2ZyZWUoc25kX3NlcV9xdWV1ZV90ZW1wb190ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2NvcHkoc25kX3NlcV9xdWV1ZV90ZW1wb190ICpkc3QsIGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVldWVfdGVtcG9fZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9xdWV1ZV90ZW1wb19nZXRfdGVtcG8oY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK2ludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF9wcHEoY29uc3Qgc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX3RlbXBvX2dldF9za2V3KGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbyk7Cit1bnNpZ25lZCBpbnQgc25kX3NlcV9xdWV1ZV90ZW1wb19nZXRfc2tld19iYXNlKGNvbnN0IHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbyk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3RlbXBvKHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbywgdW5zaWduZWQgaW50IHRlbXBvKTsKK3ZvaWQgc25kX3NlcV9xdWV1ZV90ZW1wb19zZXRfcHBxKHNuZF9zZXFfcXVldWVfdGVtcG9fdCAqaW5mbywgaW50IHBwcSk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3NrZXcoc25kX3NlcV9xdWV1ZV90ZW1wb190ICppbmZvLCB1bnNpZ25lZCBpbnQgc2tldyk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGVtcG9fc2V0X3NrZXdfYmFzZShzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKmluZm8sIHVuc2lnbmVkIGludCBiYXNlKTsKKworaW50IHNuZF9zZXFfZ2V0X3F1ZXVlX3RlbXBvKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV90ZW1wb190ICp0ZW1wbyk7CitpbnQgc25kX3NlcV9zZXRfcXVldWVfdGVtcG8oc25kX3NlcV90ICpoYW5kbGUsIGludCBxLCBzbmRfc2VxX3F1ZXVlX3RlbXBvX3QgKnRlbXBvKTsKKworLyoKKyAqLworCisvKiogc2VxdWVuY2VyIHRpbWVyIHNvdXJjZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJU05EX1NFUV9USU1FUl9BTFNBID0gMCwJCS8qIEFMU0EgdGltZXIgKi8KKwlTTkRfU0VRX1RJTUVSX01JRElfQ0xPQ0sgPSAxLAkvKiBNaWRpIENsb2NrIChDTE9DSyBldmVudCkgKi8KKwlTTkRfU0VRX1RJTUVSX01JRElfVElDSyA9IDIJLyogTWlkaSBUaW1lciBUaWNrIChUSUNLIGV2ZW50ICovCit9IHNuZF9zZXFfcXVldWVfdGltZXJfdHlwZV90OworCitzaXplX3Qgc25kX3NlcV9xdWV1ZV90aW1lcl9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgYSAjc25kX3NlcV9xdWV1ZV90aW1lcl90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfc2VxX3F1ZXVlX3RpbWVyX2FsbG9jYShwdHIpIFwKKwlTTkRfQUxMT0NBKHNuZF9zZXFfcXVldWVfdGltZXIsIHB0cikKK2ludCBzbmRfc2VxX3F1ZXVlX3RpbWVyX21hbGxvYyhzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RpbWVyX2ZyZWUoc25kX3NlcV9xdWV1ZV90aW1lcl90ICpwdHIpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RpbWVyX2NvcHkoc25kX3NlcV9xdWV1ZV90aW1lcl90ICpkc3QsIGNvbnN0IHNuZF9zZXFfcXVldWVfdGltZXJfdCAqc3JjKTsKKworaW50IHNuZF9zZXFfcXVldWVfdGltZXJfZ2V0X3F1ZXVlKGNvbnN0IHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbyk7CitzbmRfc2VxX3F1ZXVlX3RpbWVyX3R5cGVfdCBzbmRfc2VxX3F1ZXVlX3RpbWVyX2dldF90eXBlKGNvbnN0IHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbyk7Citjb25zdCBzbmRfdGltZXJfaWRfdCAqc25kX3NlcV9xdWV1ZV90aW1lcl9nZXRfaWQoY29uc3Qgc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvKTsKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3F1ZXVlX3RpbWVyX2dldF9yZXNvbHV0aW9uKGNvbnN0IHNuZF9zZXFfcXVldWVfdGltZXJfdCAqaW5mbyk7CisKK3ZvaWQgc25kX3NlcV9xdWV1ZV90aW1lcl9zZXRfdHlwZShzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8sIHNuZF9zZXFfcXVldWVfdGltZXJfdHlwZV90IHR5cGUpOwordm9pZCBzbmRfc2VxX3F1ZXVlX3RpbWVyX3NldF9pZChzbmRfc2VxX3F1ZXVlX3RpbWVyX3QgKmluZm8sIGNvbnN0IHNuZF90aW1lcl9pZF90ICppZCk7Cit2b2lkIHNuZF9zZXFfcXVldWVfdGltZXJfc2V0X3Jlc29sdXRpb24oc25kX3NlcV9xdWV1ZV90aW1lcl90ICppbmZvLCB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbik7CisKK2ludCBzbmRfc2VxX2dldF9xdWV1ZV90aW1lcihzbmRfc2VxX3QgKmhhbmRsZSwgaW50IHEsIHNuZF9zZXFfcXVldWVfdGltZXJfdCAqdGltZXIpOworaW50IHNuZF9zZXFfc2V0X3F1ZXVlX3RpbWVyKHNuZF9zZXFfdCAqaGFuZGxlLCBpbnQgcSwgc25kX3NlcV9xdWV1ZV90aW1lcl90ICp0aW1lcik7CisKKy8qKiBcfSAqLworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxRXZlbnQgU2VxdWVuY2VyIEV2ZW50IEFQSQorICogIFNlcXVlbmNlciBFdmVudCBBUEkKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKK2ludCBzbmRfc2VxX2ZyZWVfZXZlbnQoc25kX3NlcV9ldmVudF90ICpldik7Citzc2l6ZV90IHNuZF9zZXFfZXZlbnRfbGVuZ3RoKHNuZF9zZXFfZXZlbnRfdCAqZXYpOworaW50IHNuZF9zZXFfZXZlbnRfb3V0cHV0KHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKK2ludCBzbmRfc2VxX2V2ZW50X291dHB1dF9idWZmZXIoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfZXZlbnRfdCAqZXYpOworaW50IHNuZF9zZXFfZXZlbnRfb3V0cHV0X2RpcmVjdChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9ldmVudF90ICpldik7CitpbnQgc25kX3NlcV9ldmVudF9pbnB1dChzbmRfc2VxX3QgKmhhbmRsZSwgc25kX3NlcV9ldmVudF90ICoqZXYpOworaW50IHNuZF9zZXFfZXZlbnRfaW5wdXRfcGVuZGluZyhzbmRfc2VxX3QgKnNlcSwgaW50IGZldGNoX3NlcXVlbmNlcik7CitpbnQgc25kX3NlcV9kcmFpbl9vdXRwdXQoc25kX3NlcV90ICpoYW5kbGUpOworaW50IHNuZF9zZXFfZXZlbnRfb3V0cHV0X3BlbmRpbmcoc25kX3NlcV90ICpzZXEpOworaW50IHNuZF9zZXFfZXh0cmFjdF9vdXRwdXQoc25kX3NlcV90ICpoYW5kbGUsIHNuZF9zZXFfZXZlbnRfdCAqKmV2KTsKK2ludCBzbmRfc2VxX2Ryb3Bfb3V0cHV0KHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX2Ryb3Bfb3V0cHV0X2J1ZmZlcihzbmRfc2VxX3QgKmhhbmRsZSk7CitpbnQgc25kX3NlcV9kcm9wX2lucHV0KHNuZF9zZXFfdCAqaGFuZGxlKTsKK2ludCBzbmRfc2VxX2Ryb3BfaW5wdXRfYnVmZmVyKHNuZF9zZXFfdCAqaGFuZGxlKTsKKworLyoqIGV2ZW50IHJlbW92YWwgY29uZGl0aW9uYWxzICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3NlcV9yZW1vdmVfZXZlbnRzIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190OworCisvKiogUmVtb3ZlIGNvbmRpdGlvbmFsIGZsYWdzICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX0lOUFVUCQkoMTw8MCkJLyoqPCBGbHVzaCBpbnB1dCBxdWV1ZXMgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfT1VUUFVUCQkoMTw8MSkJLyoqPCBGbHVzaCBvdXRwdXQgcXVldWVzICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX0RFU1QJCSgxPDwyKQkvKio8IFJlc3RyaWN0IGJ5IGRlc3RpbmF0aW9uIHE6Y2xpZW50OnBvcnQgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfREVTVF9DSEFOTkVMCSgxPDwzKQkvKio8IFJlc3RyaWN0IGJ5IGNoYW5uZWwgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfVElNRV9CRUZPUkUJKDE8PDQpCS8qKjwgUmVzdHJpY3QgdG8gYmVmb3JlIHRpbWUgKi8KKyNkZWZpbmUgU05EX1NFUV9SRU1PVkVfVElNRV9BRlRFUgkoMTw8NSkJLyoqPCBSZXN0cmljdCB0byB0aW1lIG9yIGFmdGVyICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX1RJTUVfVElDSwkoMTw8NikJLyoqPCBUaW1lIGlzIGluIHRpY2tzICovCisjZGVmaW5lIFNORF9TRVFfUkVNT1ZFX0VWRU5UX1RZUEUJKDE8PDcpCS8qKjwgUmVzdHJpY3QgdG8gZXZlbnQgdHlwZSAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9JR05PUkVfT0ZGIAkoMTw8OCkJLyoqPCBEbyBub3QgZmx1c2ggb2ZmIGV2ZW50cyAqLworI2RlZmluZSBTTkRfU0VRX1JFTU9WRV9UQUdfTUFUQ0ggCSgxPDw5KQkvKio8IFJlc3RyaWN0IHRvIGV2ZW50cyB3aXRoIGdpdmVuIHRhZyAqLworCitzaXplX3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSBhICNzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2FsbG9jYShwdHIpIFwKKwlTTkRfQUxMT0NBKHNuZF9zZXFfcmVtb3ZlX2V2ZW50cywgcHRyKQoraW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19tYWxsb2Moc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKipwdHIpOwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZnJlZShzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqcHRyKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2NvcHkoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmRzdCwgY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKnNyYyk7CisKK3Vuc2lnbmVkIGludCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X2NvbmRpdGlvbihjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF9xdWV1ZShjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7Citjb25zdCBzbmRfc2VxX3RpbWVzdGFtcF90ICpzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X3RpbWUoY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworY29uc3Qgc25kX3NlcV9hZGRyX3QgKnNuZF9zZXFfcmVtb3ZlX2V2ZW50c19nZXRfZGVzdChjb25zdCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX2dldF9jaGFubmVsKGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvKTsKK2ludCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfZ2V0X2V2ZW50X3R5cGUoY29uc3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8pOworaW50IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19nZXRfdGFnKGNvbnN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvKTsKKwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfc2V0X2NvbmRpdGlvbihzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgdW5zaWduZWQgaW50IGZsYWdzKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF9xdWV1ZShzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgaW50IHF1ZXVlKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF90aW1lKHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvLCBjb25zdCBzbmRfc2VxX3RpbWVzdGFtcF90ICp0aW1lKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF9kZXN0KHNuZF9zZXFfcmVtb3ZlX2V2ZW50c190ICppbmZvLCBjb25zdCBzbmRfc2VxX2FkZHJfdCAqYWRkcik7Cit2b2lkIHNuZF9zZXFfcmVtb3ZlX2V2ZW50c19zZXRfY2hhbm5lbChzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbywgaW50IGNoYW5uZWwpOwordm9pZCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfc2V0X2V2ZW50X3R5cGUoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIGludCB0eXBlKTsKK3ZvaWQgc25kX3NlcV9yZW1vdmVfZXZlbnRzX3NldF90YWcoc25kX3NlcV9yZW1vdmVfZXZlbnRzX3QgKmluZm8sIGludCB0YWcpOworCitpbnQgc25kX3NlcV9yZW1vdmVfZXZlbnRzKHNuZF9zZXFfdCAqaGFuZGxlLCBzbmRfc2VxX3JlbW92ZV9ldmVudHNfdCAqaW5mbyk7CisKKy8qKiBcfSAqLworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxTWlzYyBTZXF1ZW5jZXIgTWlzY2VsbGFuZW91cworICogIFNlcXVlbmNlciBNaXNjZWxsYW5lb3VzCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCit2b2lkIHNuZF9zZXFfc2V0X2JpdChpbnQgbnIsIHZvaWQgKmFycmF5KTsKK2ludCBzbmRfc2VxX2NoYW5nZV9iaXQoaW50IG5yLCB2b2lkICphcnJheSk7CitpbnQgc25kX3NlcV9nZXRfYml0KGludCBuciwgdm9pZCAqYXJyYXkpOworCisvKiogXH0gKi8KKworCisvKioKKyAqICBcZGVmZ3JvdXAgU2VxRXZUeXBlIFNlcXVlbmNlciBFdmVudCBUeXBlIENoZWNrcworICogIFNlcXVlbmNlciBFdmVudCBUeXBlIENoZWNrcworICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFx7CisgKi8KKworLyogZXZlbnQgdHlwZSBtYWNyb3MgKi8KK2VudW0geworCVNORF9TRVFfRVZGTEdfUkVTVUxULAorCVNORF9TRVFfRVZGTEdfTk9URSwKKwlTTkRfU0VRX0VWRkxHX0NPTlRST0wsCisJU05EX1NFUV9FVkZMR19RVUVVRSwKKwlTTkRfU0VRX0VWRkxHX1NZU1RFTSwKKwlTTkRfU0VRX0VWRkxHX01FU1NBR0UsCisJU05EX1NFUV9FVkZMR19DT05ORUNUSU9OLAorCVNORF9TRVFfRVZGTEdfU0FNUExFLAorCVNORF9TRVFfRVZGTEdfVVNFUlMsCisJU05EX1NFUV9FVkZMR19JTlNUUiwKKwlTTkRfU0VRX0VWRkxHX1FVT1RFLAorCVNORF9TRVFfRVZGTEdfTk9ORSwKKwlTTkRfU0VRX0VWRkxHX1JBVywKKwlTTkRfU0VRX0VWRkxHX0ZJWEVELAorCVNORF9TRVFfRVZGTEdfVkFSSUFCTEUsCisJU05EX1NFUV9FVkZMR19WQVJVU1IKK307CisKK2VudW0geworCVNORF9TRVFfRVZGTEdfTk9URV9PTkVBUkcsCisJU05EX1NFUV9FVkZMR19OT1RFX1RXT0FSRworfTsKKworZW51bSB7CisJU05EX1NFUV9FVkZMR19RVUVVRV9OT0FSRywKKwlTTkRfU0VRX0VWRkxHX1FVRVVFX1RJQ0ssCisJU05EX1NFUV9FVkZMR19RVUVVRV9USU1FLAorCVNORF9TRVFfRVZGTEdfUVVFVUVfVkFMVUUKK307CisKKy8qKgorICogRXhwb3J0ZWQgZXZlbnQgdHlwZSB0YWJsZQorICoKKyAqIFRoaXMgdGFibGUgaXMgcmVmZXJyZWQgYnkgc25kX3NlcV9ldl9pc194eHguCisgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgc25kX3NlcV9ldmVudF90eXBlc1tdOworCisjZGVmaW5lIF9TTkRfU0VRX1RZUEUoeCkJKDE8PCh4KSkJLyoqPCBtYXN0ZXIgdHlwZSAtIDI0Yml0ICovCisjZGVmaW5lIF9TTkRfU0VRX1RZUEVfT1BUKHgpCSgoeCk8PDI0KQkvKio8IG9wdGlvbmFsIHR5cGUgLSA4Yml0ICovCisKKy8qKiBjaGVjayB0aGUgZXZlbnQgdHlwZSAqLworI2RlZmluZSBzbmRfc2VxX3R5cGVfY2hlY2soZXYseCkgKHNuZF9zZXFfZXZlbnRfdHlwZXNbKGV2KS0+dHlwZV0gJiBfU05EX1NFUV9UWVBFKHgpKQorCisvKiogZXZlbnQgdHlwZSBjaGVjazogcmVzdWx0IGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3Jlc3VsdF90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX1JFU1VMVCkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBub3RlIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX25vdGVfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19OT1RFKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IGNvbnRyb2wgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfY29udHJvbF90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX0NPTlRST0wpCisvKiogZXZlbnQgdHlwZSBjaGVjazogY2hhbm5lbCBzcGVjaWZpYyBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19jaGFubmVsX3R5cGUoZXYpIFwKKwkoc25kX3NlcV9ldmVudF90eXBlc1soZXYpLT50eXBlXSAmIChfU05EX1NFUV9UWVBFKFNORF9TRVFfRVZGTEdfTk9URSkgfCBfU05EX1NFUV9UWVBFKFNORF9TRVFfRVZGTEdfQ09OVFJPTCkpKQorCisvKiogZXZlbnQgdHlwZSBjaGVjazogcXVldWUgY29udHJvbCBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19xdWV1ZV90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX1FVRVVFKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHN5c3RlbSBzdGF0dXMgbWVzc2FnZXMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19tZXNzYWdlX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfTUVTU0FHRSkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBzeXN0ZW0gc3RhdHVzIG1lc3NhZ2VzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfc3Vic2NyaWJlX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfQ09OTkVDVElPTikKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBzYW1wbGUgbWVzc2FnZXMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19zYW1wbGVfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19TQU1QTEUpCisvKiogZXZlbnQgdHlwZSBjaGVjazogdXNlci1kZWZpbmVkIG1lc3NhZ2VzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfdXNlcl90eXBlKGV2KSBcCisJc25kX3NlcV90eXBlX2NoZWNrKGV2LCBTTkRfU0VRX0VWRkxHX1VTRVJTKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IGluc3RydW1lbnQgbGF5ZXIgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfaW5zdHJfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19JTlNUUikKKy8qKiBldmVudCB0eXBlIGNoZWNrOiBmaXhlZCBsZW5ndGggZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfZml4ZWRfdHlwZShldikgXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19GSVhFRCkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiB2YXJpYWJsZSBsZW5ndGggZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfdmFyaWFibGVfdHlwZShldikJXAorCXNuZF9zZXFfdHlwZV9jaGVjayhldiwgU05EX1NFUV9FVkZMR19WQVJJQUJMRSkKKy8qKiBldmVudCB0eXBlIGNoZWNrOiB1c2VyIHBvaW50ZXIgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfdmFydXNyX3R5cGUoZXYpIFwKKwlzbmRfc2VxX3R5cGVfY2hlY2soZXYsIFNORF9TRVFfRVZGTEdfVkFSVVNSKQorLyoqIGV2ZW50IHR5cGUgY2hlY2s6IHJlc2VydmVkIGZvciBrZXJuZWwgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19yZXNlcnZlZChldikgXAorCSghIHNuZF9zZXFfZXZlbnRfdHlwZXNbKGV2KS0+dHlwZV0pCisKKy8qKgorICogbWFjcm9zIHRvIGNoZWNrIGV2ZW50IGZsYWdzCisgKi8KKy8qKiBwcmlvciBldmVudHMgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19wcmlvcihldikJXAorCSgoKGV2KS0+ZmxhZ3MgJiBTTkRfU0VRX1BSSU9SSVRZX01BU0spID09IFNORF9TRVFfUFJJT1JJVFlfSElHSCkKKworLyoqIGdldCB0aGUgZGF0YSBsZW5ndGggdHlwZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X2xlbmd0aF90eXBlKGV2KSBcCisJKChldiktPmZsYWdzICYgU05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSykKKy8qKiBmaXhlZCBsZW5ndGggZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfZml4ZWQoZXYpCVwKKwkoc25kX3NlcV9ldl9sZW5ndGhfdHlwZShldikgPT0gU05EX1NFUV9FVkVOVF9MRU5HVEhfRklYRUQpCisvKiogdmFyaWFibGUgbGVuZ3RoIGV2ZW50cyAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX3ZhcmlhYmxlKGV2KSBcCisJKHNuZF9zZXFfZXZfbGVuZ3RoX3R5cGUoZXYpID09IFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUklBQkxFKQorLyoqIHZhcmlhYmxlIGxlbmd0aCBvbiB1c2VyLXNwYWNlICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfdmFydXNyKGV2KSBcCisJKHNuZF9zZXFfZXZfbGVuZ3RoX3R5cGUoZXYpID09IFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUlVTUikKKworLyoqIHRpbWUtc3RhbXAgdHlwZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X3RpbWVzdGFtcF90eXBlKGV2KSBcCisJKChldiktPmZsYWdzICYgU05EX1NFUV9USU1FX1NUQU1QX01BU0spCisvKiogZXZlbnQgaXMgaW4gdGljayB0aW1lICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfdGljayhldikgXAorCShzbmRfc2VxX2V2X3RpbWVzdGFtcF90eXBlKGV2KSA9PSBTTkRfU0VRX1RJTUVfU1RBTVBfVElDSykKKy8qKiBldmVudCBpcyBpbiByZWFsLXRpbWUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19yZWFsKGV2KSBcCisJKHNuZF9zZXFfZXZfdGltZXN0YW1wX3R5cGUoZXYpID09IFNORF9TRVFfVElNRV9TVEFNUF9SRUFMKQorCisvKiogdGltZS1tb2RlIHR5cGUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl90aW1lbW9kZV90eXBlKGV2KSBcCisJKChldiktPmZsYWdzICYgU05EX1NFUV9USU1FX01PREVfTUFTSykKKy8qKiBzY2hlZHVsZWQgaW4gYWJzb2x1dGUgdGltZSAqLworI2RlZmluZSBzbmRfc2VxX2V2X2lzX2Fic3RpbWUoZXYpIFwKKwkoc25kX3NlcV9ldl90aW1lbW9kZV90eXBlKGV2KSA9PSBTTkRfU0VRX1RJTUVfTU9ERV9BQlMpCisvKiogc2NoZWR1bGVkIGluIHJlbGF0aXZlIHRpbWUgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9pc19yZWx0aW1lKGV2KSBcCisJKHNuZF9zZXFfZXZfdGltZW1vZGVfdHlwZShldikgPT0gU05EX1NFUV9USU1FX01PREVfUkVMKQorCisvKiogZGlyZWN0IGRpc3BhdGNoZWQgZXZlbnRzICovCisjZGVmaW5lIHNuZF9zZXFfZXZfaXNfZGlyZWN0KGV2KSBcCisJKChldiktPnF1ZXVlID09IFNORF9TRVFfUVVFVUVfRElSRUNUKQorCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQUxTQV9TRVFfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX2V2ZW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlZTQxNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfZXZlbnQuaApAQCAtMCwwICsxLDQ1MiBAQAorLyoqCisgKiBcZmlsZSBpbmNsdWRlL3NlcV9ldmVudC5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9TRVFfRVZFTlRfSAorI2RlZmluZSBfX0FMU0FfU0VRX0VWRU5UX0gKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcUV2ZW50cyBTZXF1ZW5jZXIgRXZlbnQgRGVmaW5pdGlvbnMKKyAqICBTZXF1ZW5jZXIgRXZlbnQgRGVmaW5pdGlvbnMKKyAqICBcaW5ncm91cCBTZXF1ZW5jZXIKKyAqICBceworICovCisKKy8qKgorICogU2VxdWVuY2VyIGV2ZW50IGRhdGEgdHlwZQorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc25kX3NlcV9ldmVudF90eXBlX3Q7CisKKy8qKiBTZXF1ZW5jZXIgZXZlbnQgdHlwZSAqLworZW51bSBzbmRfc2VxX2V2ZW50X3R5cGUgeworCS8qKiBzeXN0ZW0gc3RhdHVzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9yZXN1bHRfdCAqLworCVNORF9TRVFfRVZFTlRfU1lTVEVNID0gMCwKKwkvKiogcmV0dXJuZWQgcmVzdWx0IHN0YXR1czsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfcmVzdWx0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1JFU1VMVCwKKworCS8qKiBub3RlIG9uIGFuZCBvZmYgd2l0aCBkdXJhdGlvbjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfbm90ZV90ICovCisJU05EX1NFUV9FVkVOVF9OT1RFID0gNSwKKwkvKiogbm90ZSBvbjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfbm90ZV90ICovCisJU05EX1NFUV9FVkVOVF9OT1RFT04sCisJLyoqIG5vdGUgb2ZmOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9ub3RlX3QgKi8KKwlTTkRfU0VRX0VWRU5UX05PVEVPRkYsCisJLyoqIGtleSBwcmVzc3VyZSBjaGFuZ2UgKGFmdGVydG91Y2gpOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9ub3RlX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0tFWVBSRVNTLAorCQorCS8qKiBjb250cm9sbGVyOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NPTlRST0xMRVIgPSAxMCwKKwkvKiogcHJvZ3JhbSBjaGFuZ2U7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfUEdNQ0hBTkdFLAorCS8qKiBjaGFubmVsIHByZXNzdXJlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NIQU5QUkVTUywKKwkvKiogcGl0Y2h3aGVlbDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90OyBkYXRhIGlzIGZyb20gLTgxOTIgdG8gODE5MSkgKi8KKwlTTkRfU0VRX0VWRU5UX1BJVENIQkVORCwKKwkvKiogMTQgYml0IGNvbnRyb2xsZXIgdmFsdWU7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfQ09OVFJPTDE0LAorCS8qKiAxNCBiaXQgTlJQTjsgIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfTk9OUkVHUEFSQU0sCisJLyoqIDE0IGJpdCBSUE47IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2N0cmxfdCAqLworCVNORF9TRVFfRVZFTlRfUkVHUEFSQU0sCisKKwkvKiogU1BQIHdpdGggTFNCIGFuZCBNU0IgdmFsdWVzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NPTkdQT1MgPSAyMCwKKwkvKiogU29uZyBTZWxlY3Qgd2l0aCBzb25nIElEIG51bWJlcjsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9TT05HU0VMLAorCS8qKiBtaWRpIHRpbWUgY29kZSBxdWFydGVyIGZyYW1lOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1FGUkFNRSwKKwkvKiogU01GIFRpbWUgU2lnbmF0dXJlIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9jdHJsX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1RJTUVTSUdOLAorCS8qKiBTTUYgS2V5IFNpZ25hdHVyZSBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfY3RybF90ICovCisJU05EX1NFUV9FVkVOVF9LRVlTSUdOLAorCSAgICAgICAgCisJLyoqIE1JREkgUmVhbCBUaW1lIFN0YXJ0IG1lc3NhZ2U7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfU1RBUlQgPSAzMCwKKwkvKiogTUlESSBSZWFsIFRpbWUgQ29udGludWUgbWVzc2FnZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9DT05USU5VRSwKKwkvKiogTUlESSBSZWFsIFRpbWUgU3RvcCBtZXNzYWdlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NUT1AsCisJLyoqIFNldCB0aWNrIHF1ZXVlIHBvc2l0aW9uOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NFVFBPU19USUNLLAorCS8qKiBTZXQgcmVhbC10aW1lIHF1ZXVlIHBvc2l0aW9uOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NFVFBPU19USU1FLAorCS8qKiAoU01GKSBUZW1wbyBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9URU1QTywKKwkvKiogTUlESSBSZWFsIFRpbWUgQ2xvY2sgbWVzc2FnZTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfcXVldWVfY29udHJvbF90ICovCisJU05EX1NFUV9FVkVOVF9DTE9DSywKKwkvKiogTUlESSBSZWFsIFRpbWUgVGljayBtZXNzYWdlOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1RJQ0ssCisJLyoqIFF1ZXVlIHRpbWVyIHNrZXc7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3F1ZXVlX2NvbnRyb2xfdCAqLworCVNORF9TRVFfRVZFTlRfUVVFVUVfU0tFVywKKwkvKiogU3luYyBwb3NpdGlvbiBjaGFuZ2VkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NZTkNfUE9TLAorCisJLyoqIFR1bmUgcmVxdWVzdDsgZXZlbnQgZGF0YSB0eXBlID0gbm9uZSAqLworCVNORF9TRVFfRVZFTlRfVFVORV9SRVFVRVNUID0gNDAsCisJLyoqIFJlc2V0IHRvIHBvd2VyLW9uIHN0YXRlOyBldmVudCBkYXRhIHR5cGUgPSBub25lICovCisJU05EX1NFUV9FVkVOVF9SRVNFVCwKKwkvKiogQWN0aXZlIHNlbnNpbmcgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IG5vbmUgKi8KKwlTTkRfU0VRX0VWRU5UX1NFTlNJTkcsCisKKwkvKiogRWNoby1iYWNrIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgdHlwZSAqLworCVNORF9TRVFfRVZFTlRfRUNITyA9IDUwLAorCS8qKiBPU1MgZW11bGF0aW9uIHJhdyBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IHR5cGUgKi8KKwlTTkRfU0VRX0VWRU5UX09TUywKKworCS8qKiBOZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2FkZHJfdCAqLworCVNORF9TRVFfRVZFTlRfQ0xJRU5UX1NUQVJUID0gNjAsCisJLyoqIENsaWVudCBoYXMgbGVmdCB0aGUgc3lzdGVtOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9hZGRyX3QgKi8KKwlTTkRfU0VRX0VWRU5UX0NMSUVOVF9FWElULAorCS8qKiBDbGllbnQgc3RhdHVzL2luZm8gaGFzIGNoYW5nZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2FkZHJfdCAqLworCVNORF9TRVFfRVZFTlRfQ0xJRU5UX0NIQU5HRSwKKwkvKiogTmV3IHBvcnQgd2FzIGNyZWF0ZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2FkZHJfdCAqLworCVNORF9TRVFfRVZFTlRfUE9SVF9TVEFSVCwKKwkvKiogUG9ydCB3YXMgZGVsZXRlZCBmcm9tIHN5c3RlbTsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfYWRkcl90ICovCisJU05EX1NFUV9FVkVOVF9QT1JUX0VYSVQsCisJLyoqIFBvcnQgc3RhdHVzL2luZm8gaGFzIGNoYW5nZWQ7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2FkZHJfdCAqLworCVNORF9TRVFfRVZFTlRfUE9SVF9DSEFOR0UsCisKKwkvKiogUG9ydHMgY29ubmVjdGVkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9jb25uZWN0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1BPUlRfU1VCU0NSSUJFRCwKKwkvKiogUG9ydHMgZGlzY29ubmVjdGVkOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9jb25uZWN0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1BPUlRfVU5TVUJTQ1JJQkVELAorCisJLyoqIFNhbXBsZSBzZWxlY3Q7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3NhbXBsZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NBTVBMRSA9IDcwLAorCS8qKiBTYW1wbGUgY2x1c3RlciBzZWxlY3Q7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X3NhbXBsZV9jb250cm9sX3QgKi8KKwlTTkRfU0VRX0VWRU5UX1NBTVBMRV9DTFVTVEVSLAorCS8qKiB2b2ljZSBzdGFydCAqLworCVNORF9TRVFfRVZFTlRfU0FNUExFX1NUQVJULAorCS8qKiB2b2ljZSBzdG9wICovCisJU05EX1NFUV9FVkVOVF9TQU1QTEVfU1RPUCwKKwkvKiogcGxheWJhY2sgZnJlcXVlbmN5ICovCisJU05EX1NFUV9FVkVOVF9TQU1QTEVfRlJFUSwKKwkvKiogdm9sdW1lIGFuZCBiYWxhbmNlICovCisJU05EX1NFUV9FVkVOVF9TQU1QTEVfVk9MVU1FLAorCS8qKiBzYW1wbGUgbG9vcCAqLworCVNORF9TRVFfRVZFTlRfU0FNUExFX0xPT1AsCisJLyoqIHNhbXBsZSBwb3NpdGlvbiAqLworCVNORF9TRVFfRVZFTlRfU0FNUExFX1BPU0lUSU9OLAorCS8qKiBwcml2YXRlIChoYXJkd2FyZSBkZXBlbmRlbnQpIGV2ZW50ICovCisJU05EX1NFUV9FVkVOVF9TQU1QTEVfUFJJVkFURTEsCisKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1IwID0gOTAsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSMSwKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1IyLAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjMsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSNCwKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1I1LAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjYsCisJLyoqIHVzZXItZGVmaW5lZCBldmVudDsgZXZlbnQgZGF0YSB0eXBlID0gYW55IChmaXhlZCBzaXplKSAqLworCVNORF9TRVFfRVZFTlRfVVNSNywKKwkvKiogdXNlci1kZWZpbmVkIGV2ZW50OyBldmVudCBkYXRhIHR5cGUgPSBhbnkgKGZpeGVkIHNpemUpICovCisJU05EX1NFUV9FVkVOVF9VU1I4LAorCS8qKiB1c2VyLWRlZmluZWQgZXZlbnQ7IGV2ZW50IGRhdGEgdHlwZSA9IGFueSAoZml4ZWQgc2l6ZSkgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUjksCisKKwkvKiogYmVnaW4gb2YgaW5zdHJ1bWVudCBtYW5hZ2VtZW50ICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9CRUdJTiA9IDEwMCwKKwkvKiogZW5kIG9mIGluc3RydW1lbnQgbWFuYWdlbWVudCAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfRU5ELAorCS8qKiBxdWVyeSBpbnN0cnVtZW50IGludGVyZmFjZSBpbmZvICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9JTkZPLAorCS8qKiByZXN1bHQgb2YgaW5zdHJ1bWVudCBpbnRlcmZhY2UgaW5mbyAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfSU5GT19SRVNVTFQsCisJLyoqIHF1ZXJ5IGluc3RydW1lbnQgZm9ybWF0IGluZm8gKi8KKwlTTkRfU0VRX0VWRU5UX0lOU1RSX0ZJTkZPLAorCS8qKiByZXN1bHQgb2YgaW5zdHJ1bWVudCBmb3JtYXQgaW5mbyAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfRklORk9fUkVTVUxULAorCS8qKiByZXNldCBpbnN0cnVtZW50IGluc3RydW1lbnQgbWVtb3J5ICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9SRVNFVCwKKwkvKiogZ2V0IGluc3RydW1lbnQgaW50ZXJmYWNlIHN0YXR1cyAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfU1RBVFVTLAorCS8qKiByZXN1bHQgb2YgaW5zdHJ1bWVudCBpbnRlcmZhY2Ugc3RhdHVzICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9TVEFUVVNfUkVTVUxULAorCS8qKiBwdXQgYW4gaW5zdHJ1bWVudCB0byBwb3J0ICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9QVVQsCisJLyoqIGdldCBhbiBpbnN0cnVtZW50IGZyb20gcG9ydCAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfR0VULAorCS8qKiByZXN1bHQgb2YgaW5zdHJ1bWVudCBxdWVyeSAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfR0VUX1JFU1VMVCwKKwkvKiogZnJlZSBpbnN0cnVtZW50KHMpICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9GUkVFLAorCS8qKiBnZXQgaW5zdHJ1bWVudCBsaXN0ICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9MSVNULAorCS8qKiByZXN1bHQgb2YgaW5zdHJ1bWVudCBsaXN0ICovCisJU05EX1NFUV9FVkVOVF9JTlNUUl9MSVNUX1JFU1VMVCwKKwkvKiogc2V0IGNsdXN0ZXIgcGFyYW1ldGVycyAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfQ0xVU1RFUiwKKwkvKiogZ2V0IGNsdXN0ZXIgcGFyYW1ldGVycyAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfQ0xVU1RFUl9HRVQsCisJLyoqIHJlc3VsdCBvZiBjbHVzdGVyIHBhcmFtZXRlcnMgKi8KKwlTTkRfU0VRX0VWRU5UX0lOU1RSX0NMVVNURVJfUkVTVUxULAorCS8qKiBpbnN0cnVtZW50IGNoYW5nZSAqLworCVNORF9TRVFfRVZFTlRfSU5TVFJfQ0hBTkdFLAorCisJLyoqIHN5c3RlbSBleGNsdXNpdmUgZGF0YSAodmFyaWFibGUgbGVuZ3RoKTsgIGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9TWVNFWCA9IDEzMCwKKwkvKiogZXJyb3IgZXZlbnQ7ICBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfQk9VTkNFLAorCS8qKiByZXNlcnZlZCBmb3IgdXNlciBhcHBzOyAgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUl9WQVIwID0gMTM1LAorCS8qKiByZXNlcnZlZCBmb3IgdXNlciBhcHBzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfVVNSX1ZBUjEsCisJLyoqIHJlc2VydmVkIGZvciB1c2VyIGFwcHM7IGV2ZW50IGRhdGEgdHlwZSA9ICNzbmRfc2VxX2V2X2V4dF90ICovCisJU05EX1NFUV9FVkVOVF9VU1JfVkFSMiwKKwkvKiogcmVzZXJ2ZWQgZm9yIHVzZXIgYXBwczsgZXZlbnQgZGF0YSB0eXBlID0gI3NuZF9zZXFfZXZfZXh0X3QgKi8KKwlTTkRfU0VRX0VWRU5UX1VTUl9WQVIzLAorCS8qKiByZXNlcnZlZCBmb3IgdXNlciBhcHBzOyBldmVudCBkYXRhIHR5cGUgPSAjc25kX3NlcV9ldl9leHRfdCAqLworCVNORF9TRVFfRVZFTlRfVVNSX1ZBUjQsCisKKwkvKiogTk9QOyBpZ25vcmVkIGluIGFueSBjYXNlICovCisJU05EX1NFUV9FVkVOVF9OT05FID0gMjU1Cit9OworCisKKy8qKiBTZXF1ZW5jZXIgZXZlbnQgYWRkcmVzcyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9hZGRyIHsKKwl1bnNpZ25lZCBjaGFyIGNsaWVudDsJLyoqPCBDbGllbnQgaWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnQ7CS8qKjwgUG9ydCBpZCAqLworfSBzbmRfc2VxX2FkZHJfdDsKKworLyoqIENvbm5lY3Rpb24gKHN1YnNjcmlwdGlvbikgYmV0d2VlbiBwb3J0cyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9jb25uZWN0IHsKKwlzbmRfc2VxX2FkZHJfdCBzZW5kZXI7CS8qKjwgc2VuZGVyIGFkZHJlc3MgKi8KKwlzbmRfc2VxX2FkZHJfdCBkZXN0OwkvKio8IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KK30gc25kX3NlcV9jb25uZWN0X3Q7CisKKworLyoqIFJlYWwtdGltZSBkYXRhIHJlY29yZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9yZWFsX3RpbWUgeworCXVuc2lnbmVkIGludCB0dl9zZWM7CQkvKio8IHNlY29uZHMgKi8KKwl1bnNpZ25lZCBpbnQgdHZfbnNlYzsJCS8qKjwgbmFub3NlY29uZHMgKi8KK30gc25kX3NlcV9yZWFsX3RpbWVfdDsKKworLyoqIChNSURJKSBUaWNrLXRpbWUgZGF0YSByZWNvcmQgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHNuZF9zZXFfdGlja190aW1lX3Q7CisKKy8qKiB1bmlvbmVkIHRpbWUgc3RhbXAgKi8KK3R5cGVkZWYgdW5pb24gc25kX3NlcV90aW1lc3RhbXAgeworCXNuZF9zZXFfdGlja190aW1lX3QgdGljazsJLyoqPCB0aWNrLXRpbWUgKi8KKwlzdHJ1Y3Qgc25kX3NlcV9yZWFsX3RpbWUgdGltZTsJLyoqPCByZWFsLXRpbWUgKi8KK30gc25kX3NlcV90aW1lc3RhbXBfdDsKKworCisvKioKKyAqIEV2ZW50IG1vZGUgZmxhZ3MKKyAqCisgKiBOT1RFOiBvbmx5IDggYml0cyBhdmFpbGFibGUhCisgKi8KKyNkZWZpbmUgU05EX1NFUV9USU1FX1NUQU1QX1RJQ0sJCSgwPDwwKQkvKio8IHRpbWVzdGFtcCBpbiBjbG9jayB0aWNrcyAqLworI2RlZmluZSBTTkRfU0VRX1RJTUVfU1RBTVBfUkVBTAkJKDE8PDApCS8qKjwgdGltZXN0YW1wIGluIHJlYWwgdGltZSAqLworI2RlZmluZSBTTkRfU0VRX1RJTUVfU1RBTVBfTUFTSwkJKDE8PDApCS8qKjwgbWFzayBmb3IgdGltZXN0YW1wIGJpdHMgKi8KKworI2RlZmluZSBTTkRfU0VRX1RJTUVfTU9ERV9BQlMJCSgwPDwxKQkvKio8IGFic29sdXRlIHRpbWVzdGFtcCAqLworI2RlZmluZSBTTkRfU0VRX1RJTUVfTU9ERV9SRUwJCSgxPDwxKQkvKio8IHJlbGF0aXZlIHRvIGN1cnJlbnQgdGltZSAqLworI2RlZmluZSBTTkRfU0VRX1RJTUVfTU9ERV9NQVNLCQkoMTw8MSkJLyoqPCBtYXNrIGZvciB0aW1lIG1vZGUgYml0cyAqLworCisjZGVmaW5lIFNORF9TRVFfRVZFTlRfTEVOR1RIX0ZJWEVECSgwPDwyKQkvKio8IGZpeGVkIGV2ZW50IHNpemUgKi8KKyNkZWZpbmUgU05EX1NFUV9FVkVOVF9MRU5HVEhfVkFSSUFCTEUJKDE8PDIpCS8qKjwgdmFyaWFibGUgZXZlbnQgc2l6ZSAqLworI2RlZmluZSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9WQVJVU1IJKDI8PDIpCS8qKjwgdmFyaWFibGUgZXZlbnQgc2l6ZSAtIHVzZXIgbWVtb3J5IHNwYWNlICovCisjZGVmaW5lIFNORF9TRVFfRVZFTlRfTEVOR1RIX01BU0sJKDM8PDIpCS8qKjwgbWFzayBmb3IgZXZlbnQgbGVuZ3RoIGJpdHMgKi8KKworI2RlZmluZSBTTkRfU0VRX1BSSU9SSVRZX05PUk1BTAkJKDA8PDQpCS8qKjwgbm9ybWFsIHByaW9yaXR5ICovCisjZGVmaW5lIFNORF9TRVFfUFJJT1JJVFlfSElHSAkJKDE8PDQpCS8qKjwgZXZlbnQgc2hvdWxkIGJlIHByb2Nlc3NlZCBiZWZvcmUgb3RoZXJzICovCisjZGVmaW5lIFNORF9TRVFfUFJJT1JJVFlfTUFTSwkJKDE8PDQpCS8qKjwgbWFzayBmb3IgcHJpb3JpdHkgYml0cyAqLworCisKKy8qKiBOb3RlIGV2ZW50ICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X25vdGUgeworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsJCS8qKjwgY2hhbm5lbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIG5vdGU7CQkvKio8IG5vdGUgKi8KKwl1bnNpZ25lZCBjaGFyIHZlbG9jaXR5OwkJLyoqPCB2ZWxvY2l0eSAqLworCXVuc2lnbmVkIGNoYXIgb2ZmX3ZlbG9jaXR5OwkvKio8IG5vdGUtb2ZmIHZlbG9jaXR5OyBvbmx5IGZvciAjU05EX1NFUV9FVkVOVF9OT1RFICovCisJdW5zaWduZWQgaW50IGR1cmF0aW9uOwkJLyoqPCBkdXJhdGlvbiB1bnRpbCBub3RlLW9mZjsgb25seSBmb3IgI1NORF9TRVFfRVZFTlRfTk9URSAqLworfSBzbmRfc2VxX2V2X25vdGVfdDsKKworLyoqIENvbnRyb2xsZXIgZXZlbnQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfY3RybCB7CisJdW5zaWduZWQgY2hhciBjaGFubmVsOwkJLyoqPCBjaGFubmVsIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgdW51c2VkWzNdOwkvKio8IHJlc2VydmVkICovCisJdW5zaWduZWQgaW50IHBhcmFtOwkJLyoqPCBjb250cm9sIHBhcmFtZXRlciAqLworCXNpZ25lZCBpbnQgdmFsdWU7CQkvKio8IGNvbnRyb2wgdmFsdWUgKi8KK30gc25kX3NlcV9ldl9jdHJsX3Q7CisKKy8qKiBnZW5lcmljIHNldCBvZiBieXRlcyAoMTJ4OCBiaXQpICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2V2X3JhdzggeworCXVuc2lnbmVkIGNoYXIgZFsxMl07CQkvKio8IDggYml0IHZhbHVlICovCit9IHNuZF9zZXFfZXZfcmF3OF90OworCisvKiogZ2VuZXJpYyBzZXQgb2YgaW50ZWdlcnMgKDN4MzIgYml0KSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9yYXczMiB7CisJdW5zaWduZWQgaW50IGRbM107CQkvKio8IDMyIGJpdCB2YWx1ZSAqLworfSBzbmRfc2VxX2V2X3JhdzMyX3Q7CisKKy8qKiBleHRlcm5hbCBzdG9yZWQgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9leHQgeworCXVuc2lnbmVkIGludCBsZW47CQkvKio8IGxlbmd0aCBvZiBkYXRhICovCisJdm9pZCAqcHRyOwkJCS8qKjwgcG9pbnRlciB0byBkYXRhIChub3RlOiBjYW4gYmUgNjQtYml0KSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzbmRfc2VxX2V2X2V4dF90OworCisvKiogSW5zdHJ1bWVudCBjbHVzdGVyIHR5cGUgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHNuZF9zZXFfaW5zdHJfY2x1c3Rlcl90OworCisvKiogSW5zdHJ1bWVudCB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX2luc3RyIHsKKwlzbmRfc2VxX2luc3RyX2NsdXN0ZXJfdCBjbHVzdGVyOwkvKio8IGNsdXN0ZXIgaWQgKi8KKwl1bnNpZ25lZCBpbnQgc3RkOwkvKio8IGluc3RydW1lbnQgc3RhbmRhcmQgaWQ7IHRoZSB1cHBlciBieXRlIG1lYW5zIGEgcHJpdmF0ZSBpbnN0cnVtZW50IChvd25lciAtIGNsaWVudCBpZCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBiYW5rOwkvKio8IGluc3RydW1lbnQgYmFuayBpZCAqLworCXVuc2lnbmVkIHNob3J0IHByZzsJLyoqPCBpbnN0cnVtZW50IHByb2dyYW0gaWQgKi8KK30gc25kX3NlcV9pbnN0cl90OworCisvKiogc2FtcGxlIG51bWJlciAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9zYW1wbGUgeworCXVuc2lnbmVkIGludCBzdGQ7CS8qKjwgc2FtcGxlIHN0YW5kYXJkIGlkICovCisJdW5zaWduZWQgc2hvcnQgYmFuazsJLyoqPCBzYW1wbGUgYmFuayBpZCAqLworCXVuc2lnbmVkIHNob3J0IHByZzsJLyoqPCBzYW1wbGUgcHJvZ3JhbSBpZCAqLworfSBzbmRfc2VxX2V2X3NhbXBsZV90OworCisvKiogc2FtcGxlIGNsdXN0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfY2x1c3RlciB7CisJc25kX3NlcV9pbnN0cl9jbHVzdGVyX3QgY2x1c3RlcjsJLyoqPCBjbHVzdGVyIGlkICovCit9IHNuZF9zZXFfZXZfY2x1c3Rlcl90OworCisvKiogc2FtcGxlIHBvc2l0aW9uICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBzbmRfc2VxX3Bvc2l0aW9uX3Q7IC8qKjwgcGxheWJhY2sgcG9zaXRpb24gKGluIHNhbXBsZXMpICogMTYgKi8KKworLyoqIHNhbXBsZSBzdG9wIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBzbmRfc2VxX3N0b3BfbW9kZSB7CisJU05EX1NFUV9TQU1QTEVfU1RPUF9JTU1FRElBVEVMWSA9IDAsCS8qKjwgdGVybWluYXRlIHBsYXlpbmcgaW1tZWRpYXRlbHkgKi8KKwlTTkRfU0VRX1NBTVBMRV9TVE9QX1ZFTlZFTE9QRSA9IDEsCS8qKjwgZmluaXNoIHZvbHVtZSBlbnZlbG9wZSAqLworCVNORF9TRVFfU0FNUExFX1NUT1BfTE9PUCA9IDIJCS8qKjwgdGVybWluYXRlIGxvb3AgYW5kIGZpbmlzaCB3YXZlICovCit9IHNuZF9zZXFfc3RvcF9tb2RlX3Q7CisKKy8qKiBzYW1wbGUgZnJlcXVlbmN5ICovCit0eXBlZGVmIGludCBzbmRfc2VxX2ZyZXF1ZW5jeV90OyAvKio8IHBsYXliYWNrIGZyZXF1ZW5jeSBpbiBIWiAqIDE2ICovCisKKy8qKiBzYW1wbGUgdm9sdW1lIGNvbnRyb2w7IGlmIGFueSB2YWx1ZSBpcyBzZXQgdG8gLTEgPT0gZG8gbm90IGNoYW5nZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl92b2x1bWUgeworCXNpZ25lZCBzaG9ydCB2b2x1bWU7CS8qKjwgcmFuZ2U6IDAtMTYzODMgKi8KKwlzaWduZWQgc2hvcnQgbHI7CS8qKjwgbGVmdC1yaWdodCBiYWxhbmNlOyByYW5nZTogMC0xNjM4MyAqLworCXNpZ25lZCBzaG9ydCBmcjsJLyoqPCBmcm9udC1yZWFyIGJhbGFuY2U7IHJhbmdlOiAwLTE2MzgzICovCisJc2lnbmVkIHNob3J0IGR1OwkvKio8IGRvd24tdXAgYmFsYW5jZTsgcmFuZ2U6IDAtMTYzODMgKi8KK30gc25kX3NlcV9ldl92b2x1bWVfdDsKKworLyoqIHNpbXBsZSBsb29wIHJlZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9sb29wIHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CS8qKjwgbG9vcCBzdGFydCAoaW4gc2FtcGxlcykgKiAxNiAqLworCXVuc2lnbmVkIGludCBlbmQ7CS8qKjwgbG9vcCBlbmQgKGluIHNhbXBsZXMpICogMTYgKi8KK30gc25kX3NlcV9ldl9sb29wX3Q7CisKKy8qKiBTYW1wbGUgY29udHJvbCBldmVudHMgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfc2FtcGxlX2NvbnRyb2wgeworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsJCS8qKjwgY2hhbm5lbCAqLworCXVuc2lnbmVkIGNoYXIgdW51c2VkWzNdOwkvKio8IHJlc2VydmVkICovCisJdW5pb24geworCQlzbmRfc2VxX2V2X3NhbXBsZV90IHNhbXBsZTsJLyoqPCBzYW1wbGUgbnVtYmVyICovCisJCXNuZF9zZXFfZXZfY2x1c3Rlcl90IGNsdXN0ZXI7CS8qKjwgY2x1c3RlciBudW1iZXIgKi8KKwkJc25kX3NlcV9wb3NpdGlvbl90IHBvc2l0aW9uOwkvKio8IHBvc2l0aW9uICovCisJCXNuZF9zZXFfc3RvcF9tb2RlX3Qgc3RvcF9tb2RlOwkvKio8IHN0b3AgbW9kZSAqLworCQlzbmRfc2VxX2ZyZXF1ZW5jeV90IGZyZXF1ZW5jeTsJLyoqPCBmcmVxdWVuY3kgKi8KKwkJc25kX3NlcV9ldl92b2x1bWVfdCB2b2x1bWU7CS8qKjwgdm9sdW1lICovCisJCXNuZF9zZXFfZXZfbG9vcF90IGxvb3A7CQkvKio8IGxvb3AgY29udHJvbCAqLworCQl1bnNpZ25lZCBjaGFyIHJhdzhbOF07CQkvKio8IHJhdyA4LWJpdCAqLworCX0gcGFyYW07CQkvKio8IGNvbnRyb2wgcGFyYW1ldGVycyAqLworfSBzbmRfc2VxX2V2X3NhbXBsZV9jb250cm9sX3Q7CisKKworCisvKiogSU5TVFJfQkVHSU4gZXZlbnQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZfaW5zdHJfYmVnaW4geworCWludCB0aW1lb3V0OwkJLyoqPCB6ZXJvID0gZm9yZXZlciwgb3RoZXJ3aXNlIHRpbWVvdXQgaW4gbXMgKi8KK30gc25kX3NlcV9ldl9pbnN0cl9iZWdpbl90OworCisvKiogUmVzdWx0IGV2ZW50cyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9yZXN1bHQgeworCWludCBldmVudDsJCS8qKjwgcHJvY2Vzc2VkIGV2ZW50IHR5cGUgKi8KKwlpbnQgcmVzdWx0OwkJLyoqPCBzdGF0dXMgKi8KK30gc25kX3NlcV9yZXN1bHRfdDsKKworLyoqIFF1ZXVlIHNrZXcgdmFsdWVzICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2VxX3F1ZXVlX3NrZXcgeworCXVuc2lnbmVkIGludCB2YWx1ZTsJLyoqPCBza2V3IHZhbHVlICovCisJdW5zaWduZWQgaW50IGJhc2U7CS8qKjwgc2tldyBiYXNlICovCit9IHNuZF9zZXFfcXVldWVfc2tld190OworCisvKiogcXVldWUgdGltZXIgY29udHJvbCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NlcV9ldl9xdWV1ZV9jb250cm9sIHsKKwl1bnNpZ25lZCBjaGFyIHF1ZXVlOwkJCS8qKjwgYWZmZWN0ZWQgcXVldWUgKi8KKwl1bnNpZ25lZCBjaGFyIHVudXNlZFszXTsJCS8qKjwgcmVzZXJ2ZWQgKi8KKwl1bmlvbiB7CisJCXNpZ25lZCBpbnQgdmFsdWU7CQkvKio8IGFmZmVjdGVkIHZhbHVlIChlLmcuIHRlbXBvKSAqLworCQlzbmRfc2VxX3RpbWVzdGFtcF90IHRpbWU7CS8qKjwgdGltZSAqLworCQl1bnNpZ25lZCBpbnQgcG9zaXRpb247CQkvKio8IHN5bmMgcG9zaXRpb24gKi8KKwkJc25kX3NlcV9xdWV1ZV9za2V3X3Qgc2tldzsJLyoqPCBxdWV1ZSBza2V3ICovCisJCXVuc2lnbmVkIGludCBkMzJbMl07CQkvKio8IGFueSBkYXRhICovCisJCXVuc2lnbmVkIGNoYXIgZDhbOF07CQkvKio8IGFueSBkYXRhICovCisJfSBwYXJhbTsJCQkJLyoqPCBkYXRhIHZhbHVlIHVuaW9uICovCit9IHNuZF9zZXFfZXZfcXVldWVfY29udHJvbF90OworCisKKy8qKiBTZXF1ZW5jZXIgZXZlbnQgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zZXFfZXZlbnQgeworCXNuZF9zZXFfZXZlbnRfdHlwZV90IHR5cGU7CS8qKjwgZXZlbnQgdHlwZSAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CQkvKio8IGV2ZW50IGZsYWdzICovCisJdW5zaWduZWQgY2hhciB0YWc7CQkvKio8IHRhZyAqLworCQorCXVuc2lnbmVkIGNoYXIgcXVldWU7CQkvKio8IHNjaGVkdWxlIHF1ZXVlICovCisJc25kX3NlcV90aW1lc3RhbXBfdCB0aW1lOwkvKio8IHNjaGVkdWxlIHRpbWUgKi8KKworCXNuZF9zZXFfYWRkcl90IHNvdXJjZTsJCS8qKjwgc291cmNlIGFkZHJlc3MgKi8KKwlzbmRfc2VxX2FkZHJfdCBkZXN0OwkJLyoqPCBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisKKwl1bmlvbiB7CisJCXNuZF9zZXFfZXZfbm90ZV90IG5vdGU7CQkvKio8IG5vdGUgaW5mb3JtYXRpb24gKi8KKwkJc25kX3NlcV9ldl9jdHJsX3QgY29udHJvbDsJLyoqPCBNSURJIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KKwkJc25kX3NlcV9ldl9yYXc4X3QgcmF3ODsJCS8qKjwgcmF3OCBkYXRhICovCisJCXNuZF9zZXFfZXZfcmF3MzJfdCByYXczMjsJLyoqPCByYXczMiBkYXRhICovCisJCXNuZF9zZXFfZXZfZXh0X3QgZXh0OwkJLyoqPCBleHRlcm5hbCBkYXRhICovCisJCXNuZF9zZXFfZXZfcXVldWVfY29udHJvbF90IHF1ZXVlOyAvKio8IHF1ZXVlIGNvbnRyb2wgKi8KKwkJc25kX3NlcV90aW1lc3RhbXBfdCB0aW1lOwkvKio8IHRpbWVzdGFtcCAqLworCQlzbmRfc2VxX2FkZHJfdCBhZGRyOwkJLyoqPCBhZGRyZXNzICovCisJCXNuZF9zZXFfY29ubmVjdF90IGNvbm5lY3Q7CS8qKjwgY29ubmVjdCBpbmZvcm1hdGlvbiAqLworCQlzbmRfc2VxX3Jlc3VsdF90IHJlc3VsdDsJLyoqPCBvcGVyYXRpb24gcmVzdWx0IGNvZGUgKi8KKwkJc25kX3NlcV9ldl9pbnN0cl9iZWdpbl90IGluc3RyX2JlZ2luOyAvKio8IGluc3RydW1lbnQgKi8KKwkJc25kX3NlcV9ldl9zYW1wbGVfY29udHJvbF90IHNhbXBsZTsgLyoqPCBzYW1wbGUgY29udHJvbCAqLworCX0gZGF0YTsJCQkJLyoqPCBldmVudCBkYXRhLi4uICovCit9IHNuZF9zZXFfZXZlbnRfdDsKKworCisvKiogXH0gKi8KKworI2VuZGlmIC8qIF9fQUxTQV9TRVFfRVZFTlRfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX21pZGlfZXZlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zZXFfbWlkaV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGVlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxX21pZGlfZXZlbnQuaApAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIFxmaWxlIGluY2x1ZGUvc2VxX21pZGlfZXZlbnQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfU0VRX01JRElfRVZFTlRfSAorI2RlZmluZSBfX0FMU0FfU0VRX01JRElfRVZFTlRfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogIFxkZWZncm91cCBNSURJX0V2ZW50IFNlcXVlbmNlciBldmVudCA8LT4gTUlESSBieXRlIHN0cmVhbSBjb2RlcgorICogIFxpbmdyb3VwIFNlcXVlbmNlcgorICogIFNlcXVlbmNlciBldmVudCA8LT4gTUlESSBieXRlIHN0cmVhbSBjb2RlcgorICogIFx7CisgKi8KKworLyoqIGNvbnRhaW5lciBmb3Igc2VxdWVuY2VyIG1pZGkgZXZlbnQgcGFyc2VycyAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX21pZGlfZXZlbnQgc25kX21pZGlfZXZlbnRfdDsKKworaW50IHNuZF9taWRpX2V2ZW50X25ldyhzaXplX3QgYnVmc2l6ZSwgc25kX21pZGlfZXZlbnRfdCAqKnJkZXYpOworaW50IHNuZF9taWRpX2V2ZW50X3Jlc2l6ZV9idWZmZXIoc25kX21pZGlfZXZlbnRfdCAqZGV2LCBzaXplX3QgYnVmc2l6ZSk7Cit2b2lkIHNuZF9taWRpX2V2ZW50X2ZyZWUoc25kX21pZGlfZXZlbnRfdCAqZGV2KTsKK3ZvaWQgc25kX21pZGlfZXZlbnRfaW5pdChzbmRfbWlkaV9ldmVudF90ICpkZXYpOwordm9pZCBzbmRfbWlkaV9ldmVudF9yZXNldF9lbmNvZGUoc25kX21pZGlfZXZlbnRfdCAqZGV2KTsKK3ZvaWQgc25kX21pZGlfZXZlbnRfcmVzZXRfZGVjb2RlKHNuZF9taWRpX2V2ZW50X3QgKmRldik7Cit2b2lkIHNuZF9taWRpX2V2ZW50X25vX3N0YXR1cyhzbmRfbWlkaV9ldmVudF90ICpkZXYsIGludCBvbik7CisvKiBlbmNvZGUgZnJvbSBieXRlIHN0cmVhbSAtIHJldHVybiBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcyBpZiBzdWNjZXNzICovCitsb25nIHNuZF9taWRpX2V2ZW50X2VuY29kZShzbmRfbWlkaV9ldmVudF90ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBjb3VudCwgc25kX3NlcV9ldmVudF90ICpldik7CitpbnQgc25kX21pZGlfZXZlbnRfZW5jb2RlX2J5dGUoc25kX21pZGlfZXZlbnRfdCAqZGV2LCBpbnQgYywgc25kX3NlcV9ldmVudF90ICpldik7CisvKiBkZWNvZGUgZnJvbSBldmVudCB0byBieXRlcyAtIHJldHVybiBudW1iZXIgb2Ygd3JpdHRlbiBieXRlcyBpZiBzdWNjZXNzICovCitsb25nIHNuZF9taWRpX2V2ZW50X2RlY29kZShzbmRfbWlkaV9ldmVudF90ICpkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBjb3VudCwgY29uc3Qgc25kX3NlcV9ldmVudF90ICpldik7CisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1NFUV9NSURJX0VWRU5UX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcW1pZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NlcW1pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDY5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc2VxbWlkLmgKQEAgLTAsMCArMSw0OTAgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS9zZXFtaWQuaAorICogXGJyaWVmIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqIFxhdXRob3IgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4KKyAqIFxhdXRob3IgQWJyYW1vIEJhZ25hcmEgPGFicmFtb0BhbHNhLXByb2plY3Qub3JnPgorICogXGF1dGhvciBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKiBcZGF0ZSAxOTk4LTIwMDEKKyAqCisgKiBBcHBsaWNhdGlvbiBpbnRlcmZhY2UgbGlicmFyeSBmb3IgdGhlIEFMU0EgZHJpdmVyCisgKi8KKy8qCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YKKyAqICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FMU0FfU0VRTUlEX0gKKyNkZWZpbmUgX19BTFNBX1NFUU1JRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFNlcU1pZGRsZSBTZXF1ZW5jZXIgTWlkZGxlIExldmVsIEludGVyZmFjZQorICogIFNlcXVlbmNlciBNaWRkbGUgTGV2ZWwgSW50ZXJmYWNlCisgKiAgXGluZ3JvdXAgU2VxdWVuY2VyCisgKiAgXHsKKyAqLworCisvKioKKyAqIFxicmllZiBpbml0aWFsaXplIGV2ZW50IHJlY29yZAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZCBwb2ludGVyCisgKiAKKyAqIFRoaXMgbWFjcm8gY2xlYXJzIHRoZSBnaXZlbiBldmVudCByZWNvcmQgcG9pbnRlciB0byB0aGUgZGVmYXVsdCBzdGF0dXMuCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9jbGVhcihldikgXAorCW1lbXNldChldiwgMCwgc2l6ZW9mKHNuZF9zZXFfZXZlbnRfdCkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgdGFnIGZvciBnaXZlbiBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHQgZXZlbnQgdGFnCisgKgorICogVGhpcyBtYWNybyBzZXRzIHRoZSB0YWcgdG8gdGhlIGdpdmVuIGV2ZW50IHJlY29yZC4KKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF90YWcoZXYsdCkgXAorCSgoZXYpLT50YWcgPSAodCkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgZXhwbGljaXQgZGVzdGluYXRpb24KKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjIGRlc3RpbmF0aW9uIGNsaWVudCBpZAorICogXHBhcmFtIHAgZGVzdGluYXRpb24gcG9ydCBpZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgY2xpZW50IGFuZCBwb3J0IGlkIG51bWJlcnMgdG8gdGhlIGdpdmVuIGV2ZW50IHJlY29yZC4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfc3VicygpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfZGVzdChldixjLHApIFwKKwkoKGV2KS0+ZGVzdC5jbGllbnQgPSAoYyksIChldiktPmRlc3QucG9ydCA9IChwKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IGJyb2FkY2FzdGluZyB0byBzdWJzY3JpYmVycworICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgZGVzdGluYXRpb24gYXMgdGhlIHN1YnNjcmliZXJzLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NldF9kZXN0KCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9zdWJzKGV2KSBcCisJKChldiktPmRlc3QuY2xpZW50ID0gU05EX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTLFwKKwkgKGV2KS0+ZGVzdC5wb3J0ID0gU05EX1NFUV9BRERSRVNTX1VOS05PV04pCisKKy8qKgorICogXGJyaWVmIHNldCBicm9hZGNhc3RpbmcgdG8gYWxsIGNsaWVudHMvcG9ydHMKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqCisgKiBUaGlzIG1hY3JvIHNldHMgdGhlIGRlc3RpbmF0aW9uIGFzIHRoZSBicm9hZGNhc3RpbmcuCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X2Rlc3QoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2Jyb2FkY2FzdChldikgXAorCSgoZXYpLT5kZXN0LmNsaWVudCA9IFNORF9TRVFfQUREUkVTU19CUk9BRENBU1QsXAorCSAoZXYpLT5kZXN0LnBvcnQgPSBTTkRfU0VRX0FERFJFU1NfQlJPQURDQVNUKQorCisvKioKKyAqIFxicmllZiBzZXQgdGhlIHNvdXJjZSBwb3J0CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gcCBzb3VyY2UgcG9ydCBpZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgc291cmNlIHBvcnQgaWQgbnVtYmVyLgorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3NvdXJjZShldixwKSBcCisJKChldiktPnNvdXJjZS5wb3J0ID0gKHApKQorCisvKioKKyAqIFxicmllZiBzZXQgZGlyZWN0IHBhc3NpbmcgbW9kZSAod2l0aG91dCBxdWV1ZWQpCisgKiBccGFyYW0gZXYgZXZlbnQgaW5zdGFuY2UKKyAqCisgKiBUaGlzIG1hY3JvIHNldHMgdGhlIGV2ZW50IHRvIHRoZSBkaXJlY3QgcGFzc2luZyBtb2RlCisgKiB0byBiZSBkZWxpdmVyZWQgaW1tZWRpYXRlbHkgd2l0aG91dCBxdWV1ZWluZy4KKyAqIAorICogXHNhIHNuZF9zZXFfZXZfc2NoZWR1bGVfdGljaygpLCBzbmRfc2VxX2V2X3NjaGVkdWxlX3JlYWwoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2RpcmVjdChldikgXAorCSgoZXYpLT5xdWV1ZSA9IFNORF9TRVFfUVVFVUVfRElSRUNUKQorCisvKioKKyAqIFxicmllZiBzZXQgdGljay1zY2hlZHVsaW5nIG1vZGUgb24gcXVldWUKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gc2NoZWR1bGUKKyAqIFxwYXJhbSByZWxhdGl2ZSByZWxhdGl2ZSB0aW1lLXN0YW1wIGlmIG5vbi16ZXJvCisgKiBccGFyYW0gdHRpY2sgdGljayB0aW1lLXN0YW1wIHRvIGJlIGRlbGl2ZXJlZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgc2NoZWR1bGluZyBvZiB0aGUgZXZlbnQgaW4gdGhlCisgKiBNSURJIHRpY2sgbW9kZS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zY2hlZHVsZV9yZWFsKCksIHNuZF9zZXFfZXZfc2V0X2RpcmVjdCgpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zY2hlZHVsZV90aWNrKGV2LCBxLCByZWxhdGl2ZSwgdHRpY2spIFwKKwkoKGV2KS0+ZmxhZ3MgJj0gfihTTkRfU0VRX1RJTUVfU1RBTVBfTUFTSyB8IFNORF9TRVFfVElNRV9NT0RFX01BU0spLFwKKwkgKGV2KS0+ZmxhZ3MgfD0gU05EX1NFUV9USU1FX1NUQU1QX1RJQ0ssXAorCSAoZXYpLT5mbGFncyB8PSAocmVsYXRpdmUpID8gU05EX1NFUV9USU1FX01PREVfUkVMIDogU05EX1NFUV9USU1FX01PREVfQUJTLFwKKwkgKGV2KS0+dGltZS50aWNrID0gKHR0aWNrKSxcCisJIChldiktPnF1ZXVlID0gKHEpKQorCisvKioKKyAqIFxicmllZiBzZXQgcmVhbC10aW1lLXNjaGVkdWxpbmcgbW9kZSBvbiBxdWV1ZQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzY2hlZHVsZQorICogXHBhcmFtIHJlbGF0aXZlIHJlbGF0aXZlIHRpbWUtc3RhbXAgaWYgbm9uLXplcm8KKyAqIFxwYXJhbSBydGltZSB0aW1lLXN0YW1wIHRvIGJlIGRlbGl2ZXJlZAorICoKKyAqIFRoaXMgbWFjcm8gc2V0cyB0aGUgc2NoZWR1bGluZyBvZiB0aGUgZXZlbnQgaW4gdGhlCisgKiByZWFsdGltZSBtb2RlLgorICoKKyAqIFxzYSBzbmRfc2VxX2V2X3NjaGVkdWxlX3RpY2soKSwgc25kX3NlcV9ldl9zZXRfZGlyZWN0KCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NjaGVkdWxlX3JlYWwoZXYsIHEsIHJlbGF0aXZlLCBydGltZSkgXAorCSgoZXYpLT5mbGFncyAmPSB+KFNORF9TRVFfVElNRV9TVEFNUF9NQVNLIHwgU05EX1NFUV9USU1FX01PREVfTUFTSyksXAorCSAoZXYpLT5mbGFncyB8PSBTTkRfU0VRX1RJTUVfU1RBTVBfUkVBTCxcCisJIChldiktPmZsYWdzIHw9IChyZWxhdGl2ZSkgPyBTTkRfU0VRX1RJTUVfTU9ERV9SRUwgOiBTTkRfU0VRX1RJTUVfTU9ERV9BQlMsXAorCSAoZXYpLT50aW1lLnRpbWUgPSAqKHJ0aW1lKSxcCisJIChldiktPnF1ZXVlID0gKHEpKQorCisvKioKKyAqIFxicmllZiBzZXQgZXZlbnQgcHJpb3JpdHkKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICogXHBhcmFtIGhpZ2hfcHJpb3IgMSBmb3IgaGlnaCBwcmlvcml0eSBtb2RlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcHJpb3JpdHkoZXYsIGhpZ2hfcHJpb3IpIFwKKwkoKGV2KS0+ZmxhZ3MgJj0gflNORF9TRVFfUFJJT1JJVFlfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IChoaWdoX3ByaW9yKSA/IFNORF9TRVFfUFJJT1JJVFlfSElHSCA6IFNORF9TRVFfUFJJT1JJVFlfTk9STUFMKQorCisvKioKKyAqIFxicmllZiBzZXQgZml4ZWQgZGF0YQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKgorICogU2V0cyB0aGUgZXZlbnQgbGVuZ3RoIG1vZGUgYXMgZml4ZWQgc2l6ZS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfdmFyaWFibGUoKSwgc25kX3NlcV9ldl9zZXRfdmFydXNyKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9maXhlZChldikgXAorCSgoZXYpLT5mbGFncyAmPSB+U05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IFNORF9TRVFfRVZFTlRfTEVOR1RIX0ZJWEVEKQorCisvKioKKyAqIFxicmllZiBzZXQgdmFyaWFibGUgZGF0YQorICogXHBhcmFtIGV2IGV2ZW50IGluc3RhbmNlCisgKiBccGFyYW0gZGF0YWxlbiBsZW5ndGggb2YgdGhlIGV4dGVybmFsIGRhdGEKKyAqIFxwYXJhbSBkYXRhcHRyIHBvaW50ZXIgb2YgdGhlIGV4dGVybmFsIGRhdGEKKyAqCisgKiBTZXRzIHRoZSBldmVudCBsZW5ndGggbW9kZSBhcyB2YXJpYWJsZSBsZW5ndGggYW5kIHN0b3JlcyB0aGUgZGF0YS4KKyAqCisgKiBcc2Egc25kX3NlcV9ldl9zZXRfZml4ZWQoKSwgc25kX3NlcV9ldl9zZXRfdmFydXNyKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF92YXJpYWJsZShldiwgZGF0YWxlbiwgZGF0YXB0cikgXAorCSgoZXYpLT5mbGFncyAmPSB+U05EX1NFUV9FVkVOVF9MRU5HVEhfTUFTSyxcCisJIChldiktPmZsYWdzIHw9IFNORF9TRVFfRVZFTlRfTEVOR1RIX1ZBUklBQkxFLFwKKwkgKGV2KS0+ZGF0YS5leHQubGVuID0gKGRhdGFsZW4pLFwKKwkgKGV2KS0+ZGF0YS5leHQucHRyID0gKGRhdGFwdHIpKQorCisvKioKKyAqIFxicmllZiBzZXQgdmFydXNyIGRhdGEKKyAqIFxwYXJhbSBldiBldmVudCBpbnN0YW5jZQorICogXHBhcmFtIGRhdGFsZW4gbGVuZ3RoIG9mIHRoZSBleHRlcm5hbCBkYXRhCisgKiBccGFyYW0gZGF0YXB0ciBwb2ludGVyIG9mIHRoZSBleHRlcm5hbCBkYXRhCisgKgorICogU2V0cyB0aGUgZXZlbnQgbGVuZ3RoIG1vZGUgYXMgdmFyaWFibGUgdXNlci1zcGFjZSBkYXRhIGFuZCBzdG9yZXMgdGhlIGRhdGEuCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKCksIHNuZF9zZXFfZXZfc2V0X3ZhcmlhYmxlKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF92YXJ1c3IoZXYsIGRhdGFsZW4sIGRhdGFwdHIpIFwKKwkoKGV2KS0+ZmxhZ3MgJj0gflNORF9TRVFfRVZFTlRfTEVOR1RIX01BU0ssXAorCSAoZXYpLT5mbGFncyB8PSBTTkRfU0VRX0VWRU5UX0xFTkdUSF9WQVJVU1IsXAorCSAoZXYpLT5kYXRhLmV4dC5sZW4gPSAoZGF0YWxlbiksXAorCSAoZXYpLT5kYXRhLmV4dC5wdHIgPSAoZGF0YXB0cikpCisKKy8qKgorICogXGJyaWVmIHNldCBxdWV1ZSBjb250cm9scworICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIHR5cCBldmVudCB0eXBlCisgKiBccGFyYW0gcSBxdWV1ZSBpZAorICogXHBhcmFtIHZhbCBjb250cm9sIHZhbHVlCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgdHlwLCBxLCB2YWwpIFwKKwkoKGV2KS0+dHlwZSA9ICh0eXApLFwKKwkgc25kX3NlcV9ldl9zZXRfZGVzdChldiwgU05EX1NFUV9DTElFTlRfU1lTVEVNLCBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSKSxcCisJIChldiktPmRhdGEucXVldWUucXVldWUgPSAocSksXAorCSAoZXYpLT5kYXRhLnF1ZXVlLnBhcmFtLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgc3RhcnQgcXVldWUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIHN0YXJ0CisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0b3AoKSwgc25kX3NlcV9ldl9zZXRfcXVldWVfY29udGludWUoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0YXJ0KGV2LCBxKSBcCisJc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgU05EX1NFUV9FVkVOVF9TVEFSVCwgcSwgMCkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSBzdG9wIHF1ZXVlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzdG9wCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0YXJ0KCksIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX2NvbnRpbnVlKCkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9xdWV1ZV9zdG9wKGV2LCBxKSBcCisJc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgU05EX1NFUV9FVkVOVF9TVE9QLCBxLCAwKQorCisvKioKKyAqIFxicmllZiBzZXQgdGhlIHN0b3AgcXVldWUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNvbnRpbnVlCisgKgorICogXHNhIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0YXJ0KCksIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3N0b3AoKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX2NvbnRpbnVlKGV2LCBxKSBcCisJc25kX3NlcV9ldl9zZXRfcXVldWVfY29udHJvbChldiwgU05EX1NFUV9FVkVOVF9DT05USU5VRSwgcSwgMCkKKworLyoqCisgKiBcYnJpZWYgc2V0IHRoZSBzdG9wIHF1ZXVlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBjaGFuZ2UgdGVtcG8KKyAqIFxwYXJhbSB2YWwgdGhlIG5ldyB0ZW1wbyB2YWx1ZQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3F1ZXVlX3RlbXBvKGV2LCBxLCB2YWwpIFwKKwlzbmRfc2VxX2V2X3NldF9xdWV1ZV9jb250cm9sKGV2LCBTTkRfU0VRX0VWRU5UX1RFTVBPLCBxLCB2YWwpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgcmVhbC10aW1lIHBvc2l0aW9uIG9mIGEgcXVldWUKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNoYW5nZSB0ZW1wbworICogXHBhcmFtIHJ0aW1lIHRoZSBuZXcgcmVhbC10aW1lIHBvaW50ZXIKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9xdWV1ZV9wb3NfcmVhbChldiwgcSwgcnRpbWUpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfU0VUUE9TX1RJTUUsXAorCSBzbmRfc2VxX2V2X3NldF9kZXN0KGV2LCBTTkRfU0VRX0NMSUVOVF9TWVNURU0sIFNORF9TRVFfUE9SVF9TWVNURU1fVElNRVIpLFwKKwkgKGV2KS0+ZGF0YS5xdWV1ZS5xdWV1ZSA9IChxKSxcCisJIChldiktPmRhdGEucXVldWUucGFyYW0udGltZS50aW1lID0gKihydGltZSkpCisKKy8qKgorICogXGJyaWVmIHNldCB0aGUgdGljay10aW1lIHBvc2l0aW9uIG9mIGEgcXVldWUKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBxIHF1ZXVlIGlkIHRvIGNoYW5nZSB0ZW1wbworICogXHBhcmFtIHR0aW1lIHRoZSBuZXcgdGljay10aW1lCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcXVldWVfcG9zX3RpY2soZXYsIHEsIHR0aW1lKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX1NFVFBPU19USUNLLFwKKwkgc25kX3NlcV9ldl9zZXRfZGVzdChldiwgU05EX1NFUV9DTElFTlRfU1lTVEVNLCBTTkRfU0VRX1BPUlRfU1lTVEVNX1RJTUVSKSxcCisJIChldiktPmRhdGEucXVldWUucXVldWUgPSAocSksXAorCSAoZXYpLT5kYXRhLnF1ZXVlLnBhcmFtLnRpbWUudGljayA9ICh0dGltZSkpCisKKy8qIHNldCBhbmQgc2VuZCBhIHF1ZXVlIGNvbnRyb2wgZXZlbnQgKi8KK2ludCBzbmRfc2VxX2NvbnRyb2xfcXVldWUoc25kX3NlcV90ICpzZXEsIGludCBxLCBpbnQgdHlwZSwgaW50IHZhbHVlLCBzbmRfc2VxX2V2ZW50X3QgKmV2KTsKKworLyoqCisgKiBcYnJpZWYgc3RhcnQgdGhlIHNwZWNpZmllZCBxdWV1ZQorICogXHBhcmFtIHNlcSBzZXF1ZW5jZXIgaGFuZGxlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzdGFydAorICogXHBhcmFtIGV2IG9wdGlvbmFsIGV2ZW50IHJlY29yZCAoc2VlICNzbmRfc2VxX2NvbnRyb2xfcXVldWUpCisgKi8KKyNkZWZpbmUgc25kX3NlcV9zdGFydF9xdWV1ZShzZXEsIHEsIGV2KSBcCisJc25kX3NlcV9jb250cm9sX3F1ZXVlKHNlcSwgcSwgU05EX1NFUV9FVkVOVF9TVEFSVCwgMCwgZXYpCisKKy8qKgorICogXGJyaWVmIHN0b3AgdGhlIHNwZWNpZmllZCBxdWV1ZQorICogXHBhcmFtIHNlcSBzZXF1ZW5jZXIgaGFuZGxlCisgKiBccGFyYW0gcSBxdWV1ZSBpZCB0byBzdG9wCisgKiBccGFyYW0gZXYgb3B0aW9uYWwgZXZlbnQgcmVjb3JkIChzZWUgI3NuZF9zZXFfY29udHJvbF9xdWV1ZSkKKyAqLworI2RlZmluZSBzbmRfc2VxX3N0b3BfcXVldWUoc2VxLCBxLCBldikgXAorCXNuZF9zZXFfY29udHJvbF9xdWV1ZShzZXEsIHEsIFNORF9TRVFfRVZFTlRfU1RPUCwgMCwgZXYpCisKKy8qKgorICogXGJyaWVmIGNvbnRpbnVlIHRoZSBzcGVjaWZpZWQgcXVldWUKKyAqIFxwYXJhbSBzZXEgc2VxdWVuY2VyIGhhbmRsZQorICogXHBhcmFtIHEgcXVldWUgaWQgdG8gY29udGludWUKKyAqIFxwYXJhbSBldiBvcHRpb25hbCBldmVudCByZWNvcmQgKHNlZSAjc25kX3NlcV9jb250cm9sX3F1ZXVlKQorICovCisjZGVmaW5lIHNuZF9zZXFfY29udGludWVfcXVldWUoc2VxLCBxLCBldikgXAorCXNuZF9zZXFfY29udHJvbF9xdWV1ZShzZXEsIHEsIFNORF9TRVFfRVZFTlRfQ09OVElOVUUsIDAsIGV2KQorCisvKioKKyAqIFxicmllZiBjaGFuZ2UgdGhlIHRlbXBvIG9mIHRoZSBzcGVjaWZpZWQgcXVldWUKKyAqIFxwYXJhbSBzZXEgc2VxdWVuY2VyIGhhbmRsZQorICogXHBhcmFtIHEgcXVldWUgaWQKKyAqIFxwYXJhbSB0ZW1wbyB0aGUgbmV3IHRlbXBvIHZhbHVlCisgKiBccGFyYW0gZXYgb3B0aW9uYWwgZXZlbnQgcmVjb3JkIChzZWUgI3NuZF9zZXFfY29udHJvbF9xdWV1ZSkKKyAqLworI2RlZmluZSBzbmRfc2VxX2NoYW5nZV9xdWV1ZV90ZW1wbyhzZXEsIHEsIHRlbXBvLCBldikgXAorCXNuZF9zZXFfY29udHJvbF9xdWV1ZShzZXEsIHEsIFNORF9TRVFfRVZFTlRfVEVNUE8sIHRlbXBvLCBldikKKworLyogY3JlYXRlIGEgcG9ydCAtIHNpbXBsZSB2ZXJzaW9uIC0gcmV0dXJuIHRoZSBwb3J0IG51bWJlciAqLworaW50IHNuZF9zZXFfY3JlYXRlX3NpbXBsZV9wb3J0KHNuZF9zZXFfdCAqc2VxLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjYXBzLCB1bnNpZ25lZCBpbnQgdHlwZSk7CisvKiBkZWxldGUgdGhlIHBvcnQgKi8KK2ludCBzbmRfc2VxX2RlbGV0ZV9zaW1wbGVfcG9ydChzbmRfc2VxX3QgKnNlcSwgaW50IHBvcnQpOworCisvKiBzaW1wbGUgc3Vic2NyaXB0aW9uIGJldHdlZW4gdGhpcyBwb3J0IGFuZCBhbm90aGVyIHBvcnQKKyAgICh3L28gZXhjbHVzaXZlICYgdGltZSBjb252ZXJzaW9uKQorICAgKi8KK2ludCBzbmRfc2VxX2Nvbm5lY3RfZnJvbShzbmRfc2VxX3QgKnNlcSwgaW50IG15X3BvcnQsIGludCBzcmNfY2xpZW50LCBpbnQgc3JjX3BvcnQpOworaW50IHNuZF9zZXFfY29ubmVjdF90byhzbmRfc2VxX3QgKnNlcSwgaW50IG15X3BvcnQsIGludCBkZXN0X2NsaWVudCwgaW50IGRlc3RfcG9ydCk7CitpbnQgc25kX3NlcV9kaXNjb25uZWN0X2Zyb20oc25kX3NlcV90ICpzZXEsIGludCBteV9wb3J0LCBpbnQgc3JjX2NsaWVudCwgaW50IHNyY19wb3J0KTsKK2ludCBzbmRfc2VxX2Rpc2Nvbm5lY3RfdG8oc25kX3NlcV90ICpzZXEsIGludCBteV9wb3J0LCBpbnQgZGVzdF9jbGllbnQsIGludCBkZXN0X3BvcnQpOworCisvKgorICogc2V0IGNsaWVudCBpbmZvcm1hdGlvbgorICovCitpbnQgc25kX3NlcV9zZXRfY2xpZW50X25hbWUoc25kX3NlcV90ICpzZXEsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9ldmVudF9maWx0ZXIoc25kX3NlcV90ICpzZXEsIGludCBldmVudF90eXBlKTsKK2ludCBzbmRfc2VxX3NldF9jbGllbnRfcG9vbF9vdXRwdXQoc25kX3NlcV90ICpzZXEsIHNpemVfdCBzaXplKTsKK2ludCBzbmRfc2VxX3NldF9jbGllbnRfcG9vbF9vdXRwdXRfcm9vbShzbmRfc2VxX3QgKnNlcSwgc2l6ZV90IHNpemUpOworaW50IHNuZF9zZXFfc2V0X2NsaWVudF9wb29sX2lucHV0KHNuZF9zZXFfdCAqc2VxLCBzaXplX3Qgc2l6ZSk7CisvKiBzeW5jIG91dHB1dCBxdWV1ZSAqLworaW50IHNuZF9zZXFfc3luY19vdXRwdXRfcXVldWUoc25kX3NlcV90ICpzZXEpOworCisvKgorICogcGFyc2UgdGhlIGdpdmVuIHN0cmluZyBhbmQgZ2V0IHRoZSBzZXF1ZW5jZXIgYWRkcmVzcworICovCitpbnQgc25kX3NlcV9wYXJzZV9hZGRyZXNzKHNuZF9zZXFfdCAqc2VxLCBzbmRfc2VxX2FkZHJfdCAqYWRkciwgY29uc3QgY2hhciAqc3RyKTsKKworLyoKKyAqIHJlc2V0IGNsaWVudCBpbnB1dC9vdXRwdXQgcG9vbAorICovCitpbnQgc25kX3NlcV9yZXNldF9wb29sX291dHB1dChzbmRfc2VxX3QgKnNlcSk7CitpbnQgc25kX3NlcV9yZXNldF9wb29sX2lucHV0KHNuZF9zZXFfdCAqc2VxKTsKKworLyoqCisgKiBcYnJpZWYgc2V0IG5vdGUgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIGtleSBub3RlIGtleQorICogXHBhcmFtIHZlbCB2ZWxvY2l0eQorICogXHBhcmFtIGR1ciBkdXJhdGlvbiAoaW4gdGljayBvciBtc2VjKQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X25vdGUoZXYsIGNoLCBrZXksIHZlbCwgZHVyKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX05PVEUsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLm5vdGUuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLm5vdGUubm90ZSA9IChrZXkpLFwKKwkgKGV2KS0+ZGF0YS5ub3RlLnZlbG9jaXR5ID0gKHZlbCksXAorCSAoZXYpLT5kYXRhLm5vdGUuZHVyYXRpb24gPSAoZHVyKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IG5vdGUtb24gZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIGtleSBub3RlIGtleQorICogXHBhcmFtIHZlbCB2ZWxvY2l0eQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X25vdGVvbihldiwgY2gsIGtleSwgdmVsKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX05PVEVPTixcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IG5vdGUtb2ZmIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSBrZXkgbm90ZSBrZXkKKyAqIFxwYXJhbSB2ZWwgdmVsb2NpdHkKKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9ub3Rlb2ZmKGV2LCBjaCwga2V5LCB2ZWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfTk9URU9GRixcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IGtleS1wcmVzc3VyZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0ga2V5IG5vdGUga2V5CisgKiBccGFyYW0gdmVsIHZlbG9jaXR5CisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfa2V5cHJlc3MoZXYsY2gsa2V5LHZlbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9LRVlQUkVTUyxcCisJIHNuZF9zZXFfZXZfc2V0X2ZpeGVkKGV2KSxcCisJIChldiktPmRhdGEubm90ZS5jaGFubmVsID0gKGNoKSxcCisJIChldiktPmRhdGEubm90ZS5ub3RlID0gKGtleSksXAorCSAoZXYpLT5kYXRhLm5vdGUudmVsb2NpdHkgPSAodmVsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IE1JREkgY29udHJvbGxlciBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0gY2MgY29udHJvbGxlciBudW1iZXIKKyAqIFxwYXJhbSB2YWwgY29udHJvbCB2YWx1ZQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2NvbnRyb2xsZXIoZXYsY2gsY2MsdmFsKSBcCisJKChldiktPnR5cGUgPSBTTkRfU0VRX0VWRU5UX0NPTlRST0xMRVIsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wucGFyYW0gPSAoY2MpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCBwcm9ncmFtIGNoYW5nZSBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGNoIGNoYW5uZWwgbnVtYmVyCisgKiBccGFyYW0gdmFsIHByb2dyYW0gbnVtYmVyCisgKi8KKyNkZWZpbmUgc25kX3NlcV9ldl9zZXRfcGdtY2hhbmdlKGV2LGNoLHZhbCkgXAorCSgoZXYpLT50eXBlID0gU05EX1NFUV9FVkVOVF9QR01DSEFOR0UsXAorCSBzbmRfc2VxX2V2X3NldF9maXhlZChldiksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wuY2hhbm5lbCA9IChjaCksXAorCSAoZXYpLT5kYXRhLmNvbnRyb2wudmFsdWUgPSAodmFsKSkKKworLyoqCisgKiBcYnJpZWYgc2V0IHBpdGNoLWJlbmQgZXZlbnQKKyAqIFxwYXJhbSBldiBldmVudCByZWNvcmQKKyAqIFxwYXJhbSBjaCBjaGFubmVsIG51bWJlcgorICogXHBhcmFtIHZhbCBwaXRjaCBiZW5kOyB6ZXJvIGNlbnRlcmVkIGZyb20gLTgxOTIgdG8gODE5MQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X3BpdGNoYmVuZChldixjaCx2YWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfUElUQ0hCRU5ELFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCBjaGFubmVsIHByZXNzdXJlIGV2ZW50CisgKiBccGFyYW0gZXYgZXZlbnQgcmVjb3JkCisgKiBccGFyYW0gY2ggY2hhbm5lbCBudW1iZXIKKyAqIFxwYXJhbSB2YWwgY2hhbm5lbCBwcmVzc3VyZSB2YWx1ZQorICovCisjZGVmaW5lIHNuZF9zZXFfZXZfc2V0X2NoYW5wcmVzcyhldixjaCx2YWwpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfQ0hBTlBSRVNTLFwKKwkgc25kX3NlcV9ldl9zZXRfZml4ZWQoZXYpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLmNoYW5uZWwgPSAoY2gpLFwKKwkgKGV2KS0+ZGF0YS5jb250cm9sLnZhbHVlID0gKHZhbCkpCisKKy8qKgorICogXGJyaWVmIHNldCBzeXNleCBldmVudAorICogXHBhcmFtIGV2IGV2ZW50IHJlY29yZAorICogXHBhcmFtIGRhdGFsZW4gbGVuZ3RoIG9mIHN5c2V4IGRhdGEKKyAqIFxwYXJhbSBkYXRhcHRyIHN5c2V4IGRhdGEgcG9pbnRlcgorICoKKyAqIHRoZSBzeXNleCBkYXRhIG11c3QgY29udGFpbiB0aGUgc3RhcnQgYnl0ZSAweGYwIGFuZCB0aGUgZW5kIGJ5dGUgMHhmNy4KKyAqLworI2RlZmluZSBzbmRfc2VxX2V2X3NldF9zeXNleChldixkYXRhbGVuLGRhdGFwdHIpIFwKKwkoKGV2KS0+dHlwZSA9IFNORF9TRVFfRVZFTlRfU1lTRVgsXAorCSBzbmRfc2VxX2V2X3NldF92YXJpYWJsZShldiwgZGF0YWxlbiwgZGF0YXB0cikpCisKKy8qKiBcfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19BTFNBX1NFUU1JRF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9haW5zdHJfZm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9haW5zdHJfZm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ExMGEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2FpbnN0cl9mbS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorICoKKyAqICBGTSAoT1BMMi8zKSBJbnN0cnVtZW50IEZvcm1hdAorICogIENvcHlyaWdodCAoYykgMjAwMCBVcm9zIEJpemphayA8dXJvc0Brc3MtbG9rYS5zaT4KKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fU09VTkRfQUlOU1RSX0ZNX0gKKyNkZWZpbmUgX19TT1VORF9BSU5TVFJfRk1fSAorCisjaW5jbHVkZSAidHlwZV9jb21wYXQuaCIKKworLyoKKyAqICBzaGFyZSB0eXBlcyAoc2hhcmUgSUQgMSkKKyAqLworCisjZGVmaW5lIEZNX1NIQVJFX0ZJTEUJCTAKKworLyoKKyAqIEZNIG9wZXJhdG9yCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZm1fb3BlcmF0b3IgeworCXVuc2lnbmVkIGNoYXIgYW1fdmliOworCXVuc2lnbmVkIGNoYXIga3NsX2xldmVsOworCXVuc2lnbmVkIGNoYXIgYXR0YWNrX2RlY2F5OworCXVuc2lnbmVkIGNoYXIgc3VzdGFpbl9yZWxlYXNlOworCXVuc2lnbmVkIGNoYXIgd2F2ZV9zZWxlY3Q7Cit9IGZtX29wZXJhdG9yX3Q7CisKKy8qCisgKiAgSW5zdHJ1bWVudAorICovCisKKyNkZWZpbmUgRk1fUEFUQ0hfT1BMMgkweDAxCQkvKiBPUEwyIDIgb3BlcmF0b3JzIEZNIGluc3RydW1lbnQgKi8KKyNkZWZpbmUgRk1fUEFUQ0hfT1BMMwkweDAyCQkvKiBPUEwzIDQgb3BlcmF0b3JzIEZNIGluc3RydW1lbnQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzaGFyZV9pZFs0XTsJLyogc2hhcmUgaWQgLSB6ZXJvID0gbm8gc2hhcmluZyAqLworCXVuc2lnbmVkIGNoYXIgdHlwZTsJCS8qIGluc3RydW1lbnQgdHlwZSAqLworCisJZm1fb3BlcmF0b3JfdCBvcFs0XTsKKwl1bnNpZ25lZCBjaGFyIGZlZWRiYWNrX2Nvbm5lY3Rpb25bMl07CisKKwl1bnNpZ25lZCBjaGFyIGVjaG9fZGVsYXk7CisJdW5zaWduZWQgY2hhciBlY2hvX2F0dGVuOworCXVuc2lnbmVkIGNoYXIgY2hvcnVzX3NwcmVhZDsKKwl1bnNpZ25lZCBjaGFyIHRybnNwczsKKwl1bnNpZ25lZCBjaGFyIGZpeF9kdXI7CisJdW5zaWduZWQgY2hhciBtb2RlczsKKwl1bnNpZ25lZCBjaGFyIGZpeF9rZXk7Cit9IGZtX2luc3RydW1lbnRfdDsKKworLyoKKyAqCisgKiAgICBLZXJuZWwgPC0+IHVzZXIgc3BhY2UKKyAqICAgIEhhcmR3YXJlIChDUFUpIGluZGVwZW5kZW50IHNlY3Rpb24KKyAqCisgKiAgICAqID0gemVybyBvciBtb3JlCisgKiAgICArID0gb25lIG9yIG1vcmUKKyAqCisgKiAgICBmbV94aW5zdHJ1bWVudAlGTV9TVFJVX0lOU1RSCisgKgorICovCisKKyNkZWZpbmUgRk1fU1RSVV9JTlNUUglfX2NwdV90b19iZTMyKCgnSSc8PDI0KXwoJ04nPDwxNil8KCdTJzw8OCl8J1QnKQorCisvKgorICogRk0gb3BlcmF0b3IKKyAqLworCit0eXBlZGVmIHN0cnVjdCBmbV94b3BlcmF0b3IgeworCV9fdTggYW1fdmliOworCV9fdTgga3NsX2xldmVsOworCV9fdTggYXR0YWNrX2RlY2F5OworCV9fdTggc3VzdGFpbl9yZWxlYXNlOworCV9fdTggd2F2ZV9zZWxlY3Q7Cit9IGZtX3hvcGVyYXRvcl90OworCisvKgorICogIEluc3RydW1lbnQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBmbV94aW5zdHJ1bWVudCB7CisJX191MzIgc3R5cGU7CQkJLyogc3RydWN0dXJlIHR5cGUgKi8KKworCV9fdTMyIHNoYXJlX2lkWzRdOwkJLyogc2hhcmUgaWQgLSB6ZXJvID0gbm8gc2hhcmluZyAqLworCV9fdTggdHlwZTsJCQkvKiBpbnN0cnVtZW50IHR5cGUgKi8KKworCWZtX3hvcGVyYXRvcl90IG9wWzRdOwkJLyogZm0gb3BlcmF0b3JzICovCisJX191OCBmZWVkYmFja19jb25uZWN0aW9uWzJdOworCisJX191OCBlY2hvX2RlbGF5OworCV9fdTggZWNob19hdHRlbjsKKwlfX3U4IGNob3J1c19zcHJlYWQ7CisJX191OCB0cm5zcHM7CisJX191OCBmaXhfZHVyOworCV9fdTggbW9kZXM7CisJX191OCBmaXhfa2V5OworfSBmbV94aW5zdHJ1bWVudF90OworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSAic2VxX2luc3RyLmgiCisKK2V4dGVybiBjaGFyICpzbmRfc2VxX2ZtX2lkOworCitpbnQgc25kX3NlcV9mbV9pbml0KHNuZF9zZXFfa2luc3RyX29wc190ICogb3BzLAorCQkgICAgc25kX3NlcV9raW5zdHJfb3BzX3QgKiBuZXh0KTsKKworI2VuZGlmCisKKyNlbmRpZgkvKiBfX1NPVU5EX0FJTlNUUl9GTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvYWluc3RyX2dmMS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2FpbnN0cl9nZjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQ4OTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2FpbnN0cl9nZjEuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqICBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyAqCisgKiAgR0YxIChHVVMpIFBhdGNoIEluc3RydW1lbnQgRm9ybWF0CisgKiAgQ29weXJpZ2h0IChjKSAxOTk0LTk5IGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0FJTlNUUl9HRjFfSAorI2RlZmluZSBfX1NPVU5EX0FJTlNUUl9HRjFfSAorCisjaW5jbHVkZSAidHlwZV9jb21wYXQuaCIKKworLyoKKyAqICBzaGFyZSB0eXBlcyAoc2hhcmUgSUQgMSkKKyAqLworCisjZGVmaW5lIEdGMV9TSEFSRV9GSUxFCQkJMAorCisvKgorICogIHdhdmUgZm9ybWF0cworICovCisKKyNkZWZpbmUgR0YxX1dBVkVfMTZCSVQJCQkweDAwMDEgIC8qIDE2LWJpdCB3YXZlICovCisjZGVmaW5lIEdGMV9XQVZFX1VOU0lHTkVECQkweDAwMDIgIC8qIHVuc2lnbmVkIHdhdmUgKi8KKyNkZWZpbmUgR0YxX1dBVkVfSU5WRVJUCQkJMHgwMDAyICAvKiBzYW1lIGFzIHVuc2lnbmVkIHdhdmUgKi8KKyNkZWZpbmUgR0YxX1dBVkVfQkFDS1dBUkQJCTB4MDAwNCAgLyogYmFja3dhcmQgbW9kZSAobWF5YmUgdXNlZCBmb3IgcmV2ZXJiIG9yIHBpbmctcGluZyBsb29wKSAqLworI2RlZmluZSBHRjFfV0FWRV9MT09QCQkJMHgwMDA4ICAvKiBsb29wIG1vZGUgKi8KKyNkZWZpbmUgR0YxX1dBVkVfQklESVIJCQkweDAwMTAgIC8qIGJpZGlyZWN0aW9uYWwgbW9kZSAqLworI2RlZmluZSBHRjFfV0FWRV9TVEVSRU8JCQkweDAxMDAJLyogc3RlcmVvIG1vZGUgKi8KKyNkZWZpbmUgR0YxX1dBVkVfVUxBVwkJCTB4MDIwMAkvKiB1TGF3IGNvbXByZXNzaW9uIG1vZGUgKi8KKworLyoKKyAqICBXYXZldGFibGUgZGVmaW5pdGlvbnMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBnZjFfd2F2ZSB7CisJdW5zaWduZWQgaW50IHNoYXJlX2lkWzRdOwkvKiBzaGFyZSBpZCAtIHplcm8gPSBubyBzaGFyaW5nICovCisJdW5zaWduZWQgaW50IGZvcm1hdDsJCS8qIHdhdmUgZm9ybWF0ICovCisKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgbnVtYmVyOwkvKiBzb21lIG90aGVyIElEIGZvciB0aGlzIGluc3RydW1lbnQgKi8KKwkJdW5zaWduZWQgaW50IG1lbW9yeTsJLyogYmVnaW4gb2Ygd2F2ZWZvcm0gaW4gb25ib2FyZCBtZW1vcnkgKi8KKwkJdW5zaWduZWQgY2hhciAqcHRyOwkvKiBwb2ludGVyIHRvIHdhdmVmb3JtIGluIHN5c3RlbSBtZW1vcnkgKi8KKwl9IGFkZHJlc3M7CisKKwl1bnNpZ25lZCBpbnQgc2l6ZTsJCS8qIHNpemUgb2Ygd2F2ZWZvcm0gaW4gc2FtcGxlcyAqLworCXVuc2lnbmVkIGludCBzdGFydDsJCS8qIHN0YXJ0IG9mZnNldCBpbiBzYW1wbGVzICogMTYgKGxvd2VzdCA0IGJpdHMgLSBmcmFjdGlvbikgKi8KKwl1bnNpZ25lZCBpbnQgbG9vcF9zdGFydDsJLyogYml0cyBsb29wIHN0YXJ0IG9mZnNldCBpbiBzYW1wbGVzICogMTYgKGxvd2VzdCA0IGJpdHMgLSBmcmFjdGlvbikgKi8KKwl1bnNpZ25lZCBpbnQgbG9vcF9lbmQ7CQkvKiBsb29wIHN0YXJ0IG9mZnNldCBpbiBzYW1wbGVzICogMTYgKGxvd2VzdCA0IGJpdHMgLSBmcmFjdGlvbikgKi8KKwl1bnNpZ25lZCBzaG9ydCBsb29wX3JlcGVhdDsJLyogbG9vcCByZXBlYXQgLSAwID0gZm9yZXZlciAqLworCisJdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIEdGMSBwYXRjaCBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgcGFkOworCXVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZTsJLyogc2FtcGxlIHJhdGUgaW4gSHogKi8KKwl1bnNpZ25lZCBpbnQgbG93X2ZyZXF1ZW5jeTsJLyogbG93IGZyZXF1ZW5jeSByYW5nZSAqLworCXVuc2lnbmVkIGludCBoaWdoX2ZyZXF1ZW5jeTsJLyogaGlnaCBmcmVxdWVuY3kgcmFuZ2UgKi8KKwl1bnNpZ25lZCBpbnQgcm9vdF9mcmVxdWVuY3k7CS8qIHJvb3QgZnJlcXVlbmN5IHJhbmdlICovCisJc2lnbmVkIHNob3J0IHR1bmU7CisJdW5zaWduZWQgY2hhciBiYWxhbmNlOworCXVuc2lnbmVkIGNoYXIgZW52ZWxvcGVfcmF0ZVs2XTsKKwl1bnNpZ25lZCBjaGFyIGVudmVsb3BlX29mZnNldFs2XTsKKwl1bnNpZ25lZCBjaGFyIHRyZW1vbG9fc3dlZXA7CisJdW5zaWduZWQgY2hhciB0cmVtb2xvX3JhdGU7CisJdW5zaWduZWQgY2hhciB0cmVtb2xvX2RlcHRoOworCXVuc2lnbmVkIGNoYXIgdmlicmF0b19zd2VlcDsKKwl1bnNpZ25lZCBjaGFyIHZpYnJhdG9fcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIHZpYnJhdG9fZGVwdGg7CisJdW5zaWduZWQgc2hvcnQgc2NhbGVfZnJlcXVlbmN5OworCXVuc2lnbmVkIHNob3J0IHNjYWxlX2ZhY3RvcjsJLyogMC0yMDQ4IG9yIDAtMiAqLworICAKKwlzdHJ1Y3QgZ2YxX3dhdmUgKm5leHQ7Cit9IGdmMV93YXZlX3Q7CisKKy8qCisgKiAgSW5zdHJ1bWVudAorICovCisKKyNkZWZpbmUgSVdGRkZGX0VYQ0xVREVfTk9ORQkJMHgwMDAwCS8qIGV4Y2x1c2lvbiBtb2RlIC0gbm9uZSAqLworI2RlZmluZSBJV0ZGRkZfRVhDTFVERV9TSU5HTEUJCTB4MDAwMQkvKiBleGNsdWRlIHNpbmdsZSAtIHNpbmdsZSBub3RlIGZyb20gdGhlIGluc3RydW1lbnQgZ3JvdXAgKi8KKyNkZWZpbmUgSVdGRkZGX0VYQ0xVREVfTVVMVElQTEUJCTB4MDAwMgkvKiBleGNsdWRlIG11bHRpcGxlIC0gc3RvcCBvbmx5IHNhbWUgbm90ZSBmcm9tIHRoaXMgaW5zdHJ1bWVudCAqLworCisjZGVmaW5lIElXRkZGRl9FRkZFQ1RfTk9ORQkJMAorI2RlZmluZSBJV0ZGRkZfRUZGRUNUX1JFVkVSQgkJMQorI2RlZmluZSBJV0ZGRkZfRUZGRUNUX0NIT1JVUwkJMgorI2RlZmluZSBJV0ZGRkZfRUZGRUNUX0VDSE8JCTMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGV4Y2x1c2lvbjsKKwl1bnNpZ25lZCBzaG9ydCBleGNsdXNpb25fZ3JvdXA7CS8qIDAgLSBub25lLCAxLTY1NTM1ICovCisKKwl1bnNpZ25lZCBjaGFyIGVmZmVjdDE7CQkvKiBlZmZlY3QgMSAqLworCXVuc2lnbmVkIGNoYXIgZWZmZWN0MV9kZXB0aDsJLyogMC0xMjcgKi8KKwl1bnNpZ25lZCBjaGFyIGVmZmVjdDI7CQkvKiBlZmZlY3QgMiAqLworCXVuc2lnbmVkIGNoYXIgZWZmZWN0Ml9kZXB0aDsJLyogMC0xMjcgKi8KKworCWdmMV93YXZlX3QgKndhdmU7CQkvKiBmaXJzdCB3YXZlZm9ybSAqLworfSBnZjFfaW5zdHJ1bWVudF90OworCisvKgorICoKKyAqICAgIEtlcm5lbCA8LT4gdXNlciBzcGFjZQorICogICAgSGFyZHdhcmUgKENQVSkgaW5kZXBlbmRlbnQgc2VjdGlvbgorICoKKyAqICAgICogPSB6ZXJvIG9yIG1vcmUKKyAqICAgICsgPSBvbmUgb3IgbW9yZQorICoKKyAqICAgIGdmMV94aW5zdHJ1bWVudAkJSVdGRkZGX1NUUlVfSU5TVFIKKyAqICAgICAgK2dmMV94d2F2ZQkJSVdGRkZGX1NUUlVfV0FWRQorICoKKyAqLworCisjZGVmaW5lIEdGMV9TVFJVX1dBVkUJCV9fY3B1X3RvX2JlMzIoKCdXJzw8MjQpfCgnQSc8PDE2KXwoJ1YnPDw4KXwnRScpCisjZGVmaW5lIEdGMV9TVFJVX0lOU1RSCQlfX2NwdV90b19iZTMyKCgnSSc8PDI0KXwoJ04nPDwxNil8KCdTJzw8OCl8J1QnKQorCisvKgorICogIFdhdmV0YWJsZSBkZWZpbml0aW9ucworICovCisKK3R5cGVkZWYgc3RydWN0IGdmMV94d2F2ZSB7CisJX191MzIgc3R5cGU7CQkJLyogc3RydWN0dXJlIHR5cGUgKi8KKworCV9fdTMyIHNoYXJlX2lkWzRdOwkJLyogc2hhcmUgaWQgLSB6ZXJvID0gbm8gc2hhcmluZyAqLworCV9fdTMyIGZvcm1hdDsJCQkvKiB3YXZlIGZvcm1hdCAqLworCisJX191MzIgc2l6ZTsJCQkvKiBzaXplIG9mIHdhdmVmb3JtIGluIHNhbXBsZXMgKi8KKwlfX3UzMiBzdGFydDsJCQkvKiBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJX191MzIgbG9vcF9zdGFydDsJCS8qIGJpdHMgbG9vcCBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJX191MzIgbG9vcF9lbmQ7CQkJLyogbG9vcCBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJX191MTYgbG9vcF9yZXBlYXQ7CQkvKiBsb29wIHJlcGVhdCAtIDAgPSBmb3JldmVyICovCisKKwlfX3U4IGZsYWdzOwkJCS8qIEdGMSBwYXRjaCBmbGFncyAqLworCV9fdTggcGFkOworCV9fdTMyIHNhbXBsZV9yYXRlOwkJLyogc2FtcGxlIHJhdGUgaW4gSHogKi8KKwlfX3UzMiBsb3dfZnJlcXVlbmN5OwkJLyogbG93IGZyZXF1ZW5jeSByYW5nZSAqLworCV9fdTMyIGhpZ2hfZnJlcXVlbmN5OwkJLyogaGlnaCBmcmVxdWVuY3kgcmFuZ2UgKi8KKwlfX3UzMiByb290X2ZyZXF1ZW5jeTsJCS8qIHJvb3QgZnJlcXVlbmN5IHJhbmdlICovCisJX19zMTYgdHVuZTsKKwlfX3U4IGJhbGFuY2U7CisJX191OCBlbnZlbG9wZV9yYXRlWzZdOworCV9fdTggZW52ZWxvcGVfb2Zmc2V0WzZdOworCV9fdTggdHJlbW9sb19zd2VlcDsKKwlfX3U4IHRyZW1vbG9fcmF0ZTsKKwlfX3U4IHRyZW1vbG9fZGVwdGg7CisJX191OCB2aWJyYXRvX3N3ZWVwOworCV9fdTggdmlicmF0b19yYXRlOworCV9fdTggdmlicmF0b19kZXB0aDsKKwlfX3UxNiBzY2FsZV9mcmVxdWVuY3k7CisJX191MTYgc2NhbGVfZmFjdG9yOwkJLyogMC0yMDQ4IG9yIDAtMiAqLyAgCit9IGdmMV94d2F2ZV90OworCisvKgorICogIEluc3RydW1lbnQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBnZjFfeGluc3RydW1lbnQgeworCV9fdTMyIHN0eXBlOworCQorCV9fdTE2IGV4Y2x1c2lvbjsKKwlfX3UxNiBleGNsdXNpb25fZ3JvdXA7CQkvKiAwIC0gbm9uZSwgMS02NTUzNSAqLworCisJX191OCBlZmZlY3QxOwkJCS8qIGVmZmVjdCAxICovCisJX191OCBlZmZlY3QxX2RlcHRoOwkJLyogMC0xMjcgKi8KKwlfX3U4IGVmZmVjdDI7CQkJLyogZWZmZWN0IDIgKi8KKwlfX3U4IGVmZmVjdDJfZGVwdGg7CQkvKiAwLTEyNyAqLworfSBnZjFfeGluc3RydW1lbnRfdDsKKworLyoKKyAqICBJbnN0cnVtZW50IGluZm8KKyAqLworCisjZGVmaW5lIEdGMV9JTkZPX0VOVkVMT1BFCQkoMTw8MCkKKyNkZWZpbmUgR0YxX0lORk9fVFJFTU9MTwkJKDE8PDEpCisjZGVmaW5lIEdGMV9JTkZPX1ZJQlJBVE8JCSgxPDwyKQorCit0eXBlZGVmIHN0cnVjdCBnZjFfaW5mbyB7CisJdW5zaWduZWQgY2hhciBmbGFnczsJCS8qIHN1cHBvcnRlZCB3YXZlIGZsYWdzICovCisJdW5zaWduZWQgY2hhciBwYWRbM107CisJdW5zaWduZWQgaW50IGZlYXR1cmVzOwkJLyogc3VwcG9ydGVkIGZlYXR1cmVzICovCisJdW5zaWduZWQgaW50IG1heDhfbGVuOwkJLyogbWF4aW11bSA4LWJpdCB3YXZlIGxlbmd0aCAqLworCXVuc2lnbmVkIGludCBtYXgxNl9sZW47CQkvKiBtYXhpbXVtIDE2LWJpdCB3YXZlIGxlbmd0aCAqLworfSBnZjFfaW5mb190OworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSAic2VxX2luc3RyLmgiCisKK2V4dGVybiBjaGFyICpzbmRfc2VxX2dmMV9pZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwlpbnQgKCppbmZvKSh2b2lkICpwcml2YXRlX2RhdGEsIGdmMV9pbmZvX3QgKmluZm8pOworCWludCAoKnB1dF9zYW1wbGUpKHZvaWQgKnByaXZhdGVfZGF0YSwgZ2YxX3dhdmVfdCAqd2F2ZSwKKwkgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBsb25nIGxlbiwgaW50IGF0b21pYyk7CisJaW50ICgqZ2V0X3NhbXBsZSkodm9pZCAqcHJpdmF0ZV9kYXRhLCBnZjFfd2F2ZV90ICp3YXZlLAorCQkJICBjaGFyICpkYXRhLCBsb25nIGxlbiwgaW50IGF0b21pYyk7CisJaW50ICgqcmVtb3ZlX3NhbXBsZSkodm9pZCAqcHJpdmF0ZV9kYXRhLCBnZjFfd2F2ZV90ICp3YXZlLAorCQkJICAgICBpbnQgYXRvbWljKTsKKwl2b2lkICgqbm90aWZ5KSh2b2lkICpwcml2YXRlX2RhdGEsIHNuZF9zZXFfa2luc3RyX3QgKmluc3RyLCBpbnQgd2hhdCk7CisJc25kX3NlcV9raW5zdHJfb3BzX3Qga29wczsKK30gc25kX2dmMV9vcHNfdDsKKworaW50IHNuZF9zZXFfZ2YxX2luaXQoc25kX2dmMV9vcHNfdCAqb3BzLAorCQkgICAgIHZvaWQgKnByaXZhdGVfZGF0YSwKKwkJICAgICBzbmRfc2VxX2tpbnN0cl9vcHNfdCAqbmV4dCk7CisKKyNlbmRpZgorCisjZW5kaWYgLyogX19TT1VORF9BSU5TVFJfR0YxX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9haW5zdHJfaXcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9haW5zdHJfaXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmI5ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2FpbnN0cl9pdy5oCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorICoKKyAqICBJbnRlcldhdmUgRkZGRiBJbnN0cnVtZW50IEZvcm1hdAorICogIENvcHlyaWdodCAoYykgMTk5NC05OSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX19TT1VORF9BSU5TVFJfSVdfSAorI2RlZmluZSBfX1NPVU5EX0FJTlNUUl9JV19ICisKKyNpbmNsdWRlICJ0eXBlX2NvbXBhdC5oIgorCisvKgorICogIHNoYXJlIHR5cGVzIChzaGFyZSBJRCAxKQorICovCisKKyNkZWZpbmUgSVdGRkZGX1NIQVJFX0ZJTEUJCTAKKworLyoKKyAqICB3YXZlIGZvcm1hdHMKKyAqLworCisjZGVmaW5lIElXRkZGRl9XQVZFXzE2QklUCQkweDAwMDEgIC8qIDE2LWJpdCB3YXZlICovCisjZGVmaW5lIElXRkZGRl9XQVZFX1VOU0lHTkVECQkweDAwMDIgIC8qIHVuc2lnbmVkIHdhdmUgKi8KKyNkZWZpbmUgSVdGRkZGX1dBVkVfSU5WRVJUCQkweDAwMDIgIC8qIHNhbWUgYXMgdW5zaWduZWQgd2F2ZSAqLworI2RlZmluZSBJV0ZGRkZfV0FWRV9CQUNLV0FSRAkJMHgwMDA0ICAvKiBiYWNrd2FyZCBtb2RlIChtYXliZSB1c2VkIGZvciByZXZlcmIgb3IgcGluZy1waW5nIGxvb3ApICovCisjZGVmaW5lIElXRkZGRl9XQVZFX0xPT1AJCTB4MDAwOCAgLyogbG9vcCBtb2RlICovCisjZGVmaW5lIElXRkZGRl9XQVZFX0JJRElSCQkweDAwMTAgIC8qIGJpZGlyZWN0aW9uYWwgbW9kZSAqLworI2RlZmluZSBJV0ZGRkZfV0FWRV9VTEFXCQkweDAwMjAgIC8qIHVMYXcgY29tcHJlc3NlZCB3YXZlICovCisjZGVmaW5lIElXRkZGRl9XQVZFX1JBTQkJCTB4MDA0MCAgLyogd2F2ZSBpcyBfcHJlbG9hZGVkXyBpbiBSQU0gKGl0IGlzIHVzZWQgZm9yIFJPTSBzaW11bGF0aW9uKSAqLworI2RlZmluZSBJV0ZGRkZfV0FWRV9ST00JCQkweDAwODAgIC8qIHdhdmUgaXMgaW4gUk9NICovCisjZGVmaW5lIElXRkZGRl9XQVZFX1NURVJFTwkJMHgwMTAwCS8qIHdhdmUgaXMgc3RlcmVvICovCisKKy8qCisgKiAgV2F2ZXRhYmxlIGRlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX3dhdmUgeworCXVuc2lnbmVkIGludCBzaGFyZV9pZFs0XTsJLyogc2hhcmUgaWQgLSB6ZXJvID0gbm8gc2hhcmluZyAqLworCXVuc2lnbmVkIGludCBmb3JtYXQ7CQkvKiB3YXZlIGZvcm1hdCAqLworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IG51bWJlcjsJLyogc29tZSBvdGhlciBJRCBmb3IgdGhpcyB3YXZlICovCisJCXVuc2lnbmVkIGludCBtZW1vcnk7CS8qIGJlZ2luIG9mIHdhdmVmb3JtIGluIG9uYm9hcmQgbWVtb3J5ICovCisJCXVuc2lnbmVkIGNoYXIgKnB0cjsJLyogcG9pbnRlciB0byB3YXZlZm9ybSBpbiBzeXN0ZW0gbWVtb3J5ICovCisJfSBhZGRyZXNzOworCisJdW5zaWduZWQgaW50IHNpemU7CQkvKiBzaXplIG9mIHdhdmVmb3JtIGluIHNhbXBsZXMgKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CQkvKiBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJdW5zaWduZWQgaW50IGxvb3Bfc3RhcnQ7CS8qIGJpdHMgbG9vcCBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJdW5zaWduZWQgaW50IGxvb3BfZW5kOwkJLyogbG9vcCBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJdW5zaWduZWQgc2hvcnQgbG9vcF9yZXBlYXQ7CS8qIGxvb3AgcmVwZWF0IC0gMCA9IGZvcmV2ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGlvOwkvKiBzYW1wbGUgcmF0aW8gKDQ0MTAwICogMTAyNCAvIHJhdGUpICovCisJdW5zaWduZWQgY2hhciBhdHRlbnVhdGlvbjsJLyogMCAtIDEyNyAobm8gY29ycmVzcG9uZGluZyBtaWRpIGNvbnRyb2xsZXIpICovCisJdW5zaWduZWQgY2hhciBsb3dfbm90ZTsJCS8qIGxvd2VyIGZyZXF1ZW5jeSByYW5nZSBmb3IgdGhpcyB3YXZlZm9ybSAqLworCXVuc2lnbmVkIGNoYXIgaGlnaF9ub3RlOwkvKiBoaWdoZXIgZnJlcXVlbmN5IHJhbmdlIGZvciB0aGlzIHdhdmVmb3JtICovCisJdW5zaWduZWQgY2hhciBwYWQ7CisgIAorCXN0cnVjdCBpd2ZmZmZfd2F2ZSAqbmV4dDsKK30gaXdmZmZmX3dhdmVfdDsKKworLyoKKyAqICBMYXllcgorICovCisKKyNkZWZpbmUgSVdGRkZGX0xGT19TSEFQRV9UUklBTkdMRQkwCisjZGVmaW5lIElXRkZGRl9MRk9fU0hBUEVfUE9TVFJJQU5HTEUJMQorCit0eXBlZGVmIHN0cnVjdCBpd2ZmZmZfbGZvIHsKKwl1bnNpZ25lZCBzaG9ydCBmcmVxOwkJLyogKDAtMjA0NykgMC4wMUh6IC0gMjEuNUh6ICovCisJc2lnbmVkIHNob3J0IGRlcHRoOwkJLyogdm9sdW1lICstICgwLTI1NSkgMC40ODY3NWRCL3N0ZXAgKi8KKwlzaWduZWQgc2hvcnQgc3dlZXA7CQkvKiAwIC0gOTUwIGRlY2lzZWNvbmRzICovCisJdW5zaWduZWQgY2hhciBzaGFwZTsJCS8qIHNlZSB0byBJV0ZGRkZfTEZPX1NIQVBFX1hYWFggKi8KKwl1bnNpZ25lZCBjaGFyIGRlbGF5OwkJLyogMCAtIDI1NSBkZWNpc2Vjb25kcyAqLworfSBpd2ZmZmZfbGZvX3Q7CisKKyNkZWZpbmUgSVdGRkZGX0VOVl9GTEFHX1JFVFJJR0dFUgkweDAwMDEJLyogZmxhZyAtIHJldHJpZ2dlciAqLworCisjZGVmaW5lIElXRkZGRl9FTlZfTU9ERV9PTkVfU0hPVAkweDAwMDEJLyogbW9kZSAtIG9uZSBzaG90ICovCisjZGVmaW5lIElXRkZGRl9FTlZfTU9ERV9TVVNUQUlOCQkweDAwMDIJLyogbW9kZSAtIHN1c3RhaW4gKi8KKyNkZWZpbmUgSVdGRkZGX0VOVl9NT0RFX05PX1NVU1RBSU4JMHgwMDAzCS8qIG1vZGUgLSBubyBzdXN0YWluICovCisKKyNkZWZpbmUgSVdGRkZGX0VOVl9JTkRFWF9WRUxPQ0lUWQkweDAwMDEJLyogaW5kZXggLSB2ZWxvY2l0eSAqLworI2RlZmluZSBJV0ZGRkZfRU5WX0lOREVYX0ZSRVFVRU5DWQkweDAwMDIJLyogaW5kZXggLSBmcmVxdWVuY3kgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX2Vudl9wb2ludCB7CisJdW5zaWduZWQgc2hvcnQgb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0IHJhdGU7Cit9IGl3ZmZmZl9lbnZfcG9pbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX2Vudl9yZWNvcmQgeworCXVuc2lnbmVkIHNob3J0IG5hdHRhY2s7CisJdW5zaWduZWQgc2hvcnQgbnJlbGVhc2U7CisJdW5zaWduZWQgc2hvcnQgc3VzdGFpbl9vZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgc3VzdGFpbl9yYXRlOworCXVuc2lnbmVkIHNob3J0IHJlbGVhc2VfcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIGhpcmFuZ2U7CisJdW5zaWduZWQgY2hhciBwYWQ7CisJc3RydWN0IGl3ZmZmZl9lbnZfcmVjb3JkICpuZXh0OworCS8qIHBvaW50cyBhcmUgc3RvcmVkIGhlcmUgKi8KKwkvKiBjb3VudCBvZiBwb2ludHMgPSBuYXR0YWNrICsgbnJlbGVhc2UgKi8KK30gaXdmZmZmX2Vudl9yZWNvcmRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX2VudiB7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKyAgCXVuc2lnbmVkIGNoYXIgbW9kZTsKKyAgCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJdW5zaWduZWQgY2hhciBwYWQ7CisJc3RydWN0IGl3ZmZmZl9lbnZfcmVjb3JkICpyZWNvcmQ7Cit9IGl3ZmZmZl9lbnZfdDsKKworI2RlZmluZSBJV0ZGRkZfTEFZRVJfRkxBR19SRVRSSUdHRVIJMHgwMDAxCS8qIHJldHJpZ2dlciAqLworCisjZGVmaW5lIElXRkZGRl9MQVlFUl9WRUxPQ0lUWV9USU1FCTB4MDAwMAkvKiB2ZWxvY2l0eSBtb2RlID0gdGltZSAqLworI2RlZmluZSBJV0ZGRkZfTEFZRVJfVkVMT0NJVFlfUkFURQkweDAwMDEJLyogdmVsb2NpdHkgbW9kZSA9IHJhdGUgKi8KKworI2RlZmluZSBJV0ZGRkZfTEFZRVJfRVZFTlRfS1VQCQkweDAwMDAJLyogbGF5ZXIgZXZlbnQgLSBrZXkgdXAgKi8KKyNkZWZpbmUgSVdGRkZGX0xBWUVSX0VWRU5UX0tET1dOCTB4MDAwMQkvKiBsYXllciBldmVudCAtIGtleSBkb3duICovCisjZGVmaW5lIElXRkZGRl9MQVlFUl9FVkVOVF9SRVRSSUcJMHgwMDAyCS8qIGxheWVyIGV2ZW50IC0gcmV0cmlnZ2VyICovCisjZGVmaW5lIElXRkZGRl9MQVlFUl9FVkVOVF9MRUdBVE8JMHgwMDAzCS8qIGxheWVyIGV2ZW50IC0gbGVnYXRvICovCisKK3R5cGVkZWYgc3RydWN0IGl3ZmZmZl9sYXllciB7CisJdW5zaWduZWQgY2hhciBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHZlbG9jaXR5X21vZGU7CisgICAgICAJdW5zaWduZWQgY2hhciBsYXllcl9ldmVudDsKKwl1bnNpZ25lZCBjaGFyIGxvd19yYW5nZTsJLyogcmFuZ2UgZm9yIGxheWVyIGJhc2VkICovCisJdW5zaWduZWQgY2hhciBoaWdoX3JhbmdlOwkvKiBvbiBlaXRoZXIgdmVsb2NpdHkgb3IgZnJlcXVlbmN5ICovCisJdW5zaWduZWQgY2hhciBwYW47CQkvKiBwYW4gb2Zmc2V0IGZyb20gQ0MxICgwIGxlZnQgLSAxMjcgcmlnaHQpICovCisJdW5zaWduZWQgY2hhciBwYW5fZnJlcV9zY2FsZTsJLyogcG9zaXRpb24gYmFzZWQgb24gZnJlcXVlbmN5ICgwLTEyNykgKi8KKwl1bnNpZ25lZCBjaGFyIGF0dGVudWF0aW9uOwkvKiAwLTEyNyAobm8gY29ycmVzcG9uZGluZyBtaWRpIGNvbnRyb2xsZXIpICovCisJaXdmZmZmX2xmb190IHRyZW1vbG87CQkvKiB0cmVtb2xvIGVmZmVjdCAqLworCWl3ZmZmZl9sZm9fdCB2aWJyYXRvOwkJLyogdmlicmF0byBlZmZlY3QgKi8KKwl1bnNpZ25lZCBzaG9ydCBmcmVxX3NjYWxlOwkvKiAwLTIwNDgsIDEwMjQgaXMgZXF1YWwgdG8gc2VtaXRvbmUgc2NhbGluZyAqLworCXVuc2lnbmVkIGNoYXIgZnJlcV9jZW50ZXI7CS8qIGNlbnRlciBmb3Iga2V5Ym9hcmQgZnJlcXVlbmN5IHNjYWxpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIHBhZDsKKwlpd2ZmZmZfZW52X3QgcGVudjsJCS8qIHBpdGNoIGVudmVsb3BlICovCisJaXdmZmZmX2Vudl90IHZlbnY7CQkvKiB2b2x1bWUgZW52ZWxvcGUgKi8KKworCWl3ZmZmZl93YXZlX3QgKndhdmU7CisJc3RydWN0IGl3ZmZmZl9sYXllciAqbmV4dDsKK30gaXdmZmZmX2xheWVyX3Q7CisKKy8qCisgKiAgSW5zdHJ1bWVudAorICovCisKKyNkZWZpbmUgSVdGRkZGX0VYQ0xVREVfTk9ORQkJMHgwMDAwCS8qIGV4Y2x1c2lvbiBtb2RlIC0gbm9uZSAqLworI2RlZmluZSBJV0ZGRkZfRVhDTFVERV9TSU5HTEUJCTB4MDAwMQkvKiBleGNsdWRlIHNpbmdsZSAtIHNpbmdsZSBub3RlIGZyb20gdGhlIGluc3RydW1lbnQgZ3JvdXAgKi8KKyNkZWZpbmUgSVdGRkZGX0VYQ0xVREVfTVVMVElQTEUJCTB4MDAwMgkvKiBleGNsdWRlIG11bHRpcGxlIC0gc3RvcCBvbmx5IHNhbWUgbm90ZSBmcm9tIHRoaXMgaW5zdHJ1bWVudCAqLworCisjZGVmaW5lIElXRkZGRl9MQVlFUl9OT05FCQkweDAwMDAJLyogbm90IGxheWVyZWQgKi8KKyNkZWZpbmUgSVdGRkZGX0xBWUVSX09OCQkJMHgwMDAxCS8qIGxheWVyZWQgKi8KKyNkZWZpbmUgSVdGRkZGX0xBWUVSX1ZFTE9DSVRZCQkweDAwMDIJLyogbGF5ZXJlZCBieSB2ZWxvY2l0eSAqLworI2RlZmluZSBJV0ZGRkZfTEFZRVJfRlJFUVVFTkNZCQkweDAwMDMJLyogbGF5ZXJlZCBieSBmcmVxdWVuY3kgKi8KKworI2RlZmluZSBJV0ZGRkZfRUZGRUNUX05PTkUJCTAKKyNkZWZpbmUgSVdGRkZGX0VGRkVDVF9SRVZFUkIJCTEKKyNkZWZpbmUgSVdGRkZGX0VGRkVDVF9DSE9SVVMJCTIKKyNkZWZpbmUgSVdGRkZGX0VGRkVDVF9FQ0hPCQkzCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBleGNsdXNpb247CisJdW5zaWduZWQgc2hvcnQgbGF5ZXJfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBleGNsdXNpb25fZ3JvdXA7CS8qIDAgLSBub25lLCAxLTY1NTM1ICovCisKKwl1bnNpZ25lZCBjaGFyIGVmZmVjdDE7CQkvKiBlZmZlY3QgMSAqLworCXVuc2lnbmVkIGNoYXIgZWZmZWN0MV9kZXB0aDsJLyogMC0xMjcgKi8KKwl1bnNpZ25lZCBjaGFyIGVmZmVjdDI7CQkvKiBlZmZlY3QgMiAqLworCXVuc2lnbmVkIGNoYXIgZWZmZWN0Ml9kZXB0aDsJLyogMC0xMjcgKi8KKworCWl3ZmZmZl9sYXllcl90ICpsYXllcjsJCS8qIGZpcnN0IGxheWVyICovCit9IGl3ZmZmZl9pbnN0cnVtZW50X3Q7CisKKy8qCisgKgorICogICAgS2VybmVsIDwtPiB1c2VyIHNwYWNlCisgKiAgICBIYXJkd2FyZSAoQ1BVKSBpbmRlcGVuZGVudCBzZWN0aW9uCisgKgorICogICAgKiA9IHplcm8gb3IgbW9yZQorICogICAgKyA9IG9uZSBvciBtb3JlCisgKgorICogICAgaXdmZmZmX3hpbnN0cnVtZW50CQlJV0ZGRkZfU1RSVV9JTlNUUgorICogICAgICAraXdmZmZmX3hsYXllcgkJCUlXRkZGRl9TVFJVX0xBWUVSCisgKiAgICAgICAgKml3ZmZmZl94ZW52X3JlY29yZAkJSVdGRkZGX1NUUlVfRU5WX1JFQ1QgKHRyZW1vbG8pCisgKiAgICAgICAgKml3ZmZmZl94ZW52X3JlY29yZAkJSVdGRkZGX1NUUlVfRVZOX1JFQ1QgKHZpYnJhdG8pCisgKiAgICAgICAgICAraXdmZmZmX3h3YXZlCQlJV0ZGRkZfU1RSVV9XQVZFCisgKgorICovCisKKyNkZWZpbmUgSVdGRkZGX1NUUlVfV0FWRQlfX2NwdV90b19iZTMyKCgnVyc8PDI0KXwoJ0EnPDwxNil8KCdWJzw8OCl8J0UnKQorI2RlZmluZSBJV0ZGRkZfU1RSVV9FTlZfUkVDUAlfX2NwdV90b19iZTMyKCgnRSc8PDI0KXwoJ04nPDwxNil8KCdSJzw8OCl8J1AnKQorI2RlZmluZSBJV0ZGRkZfU1RSVV9FTlZfUkVDVglfX2NwdV90b19iZTMyKCgnRSc8PDI0KXwoJ04nPDwxNil8KCdSJzw8OCl8J1YnKQorI2RlZmluZSBJV0ZGRkZfU1RSVV9MQVlFUiAJX19jcHVfdG9fYmUzMigoJ0wnPDwyNCl8KCdBJzw8MTYpfCgnWSc8PDgpfCdSJykKKyNkZWZpbmUgSVdGRkZGX1NUUlVfSU5TVFIgCV9fY3B1X3RvX2JlMzIoKCdJJzw8MjQpfCgnTic8PDE2KXwoJ1MnPDw4KXwnVCcpCisKKy8qCisgKiAgV2F2ZXRhYmxlIGRlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX3h3YXZlIHsKKwlfX3UzMiBzdHlwZTsJCQkvKiBzdHJ1Y3R1cmUgdHlwZSAqLworCisJX191MzIgc2hhcmVfaWRbNF07CQkvKiBzaGFyZSBpZCAtIHplcm8gPSBubyBzaGFyaW5nICovCisKKwlfX3UzMiBmb3JtYXQ7CQkJLyogd2F2ZSBmb3JtYXQgKi8KKwlfX3UzMiBvZmZzZXQ7CQkJLyogb2Zmc2V0IHRvIFJPTSAoYWRkcmVzcykgKi8KKworCV9fdTMyIHNpemU7CQkJLyogc2l6ZSBvZiB3YXZlZm9ybSBpbiBzYW1wbGVzICovCisJX191MzIgc3RhcnQ7CQkJLyogc3RhcnQgb2Zmc2V0IGluIHNhbXBsZXMgKiAxNiAobG93ZXN0IDQgYml0cyAtIGZyYWN0aW9uKSAqLworCV9fdTMyIGxvb3Bfc3RhcnQ7CQkvKiBiaXRzIGxvb3Agc3RhcnQgb2Zmc2V0IGluIHNhbXBsZXMgKiAxNiAobG93ZXN0IDQgYml0cyAtIGZyYWN0aW9uKSAqLworCV9fdTMyIGxvb3BfZW5kOwkJCS8qIGxvb3Agc3RhcnQgb2Zmc2V0IGluIHNhbXBsZXMgKiAxNiAobG93ZXN0IDQgYml0cyAtIGZyYWN0aW9uKSAqLworCV9fdTE2IGxvb3BfcmVwZWF0OwkJLyogbG9vcCByZXBlYXQgLSAwID0gZm9yZXZlciAqLworCV9fdTMyIHNhbXBsZV9yYXRpbzsJCS8qIHNhbXBsZSByYXRpbyAoNDQxMDAgKiAxMDI0IC8gcmF0ZSkgKi8KKwlfX3U4IGF0dGVudWF0aW9uOwkJLyogMCAtIDEyNyAobm8gY29ycmVzcG9uZGluZyBtaWRpIGNvbnRyb2xsZXIpICovCisJX191OCBsb3dfbm90ZTsJCQkvKiBsb3dlciBmcmVxdWVuY3kgcmFuZ2UgZm9yIHRoaXMgd2F2ZWZvcm0gKi8KKwlfX3U4IGhpZ2hfbm90ZTsJCQkvKiBoaWdoZXIgZnJlcXVlbmN5IHJhbmdlIGZvciB0aGlzIHdhdmVmb3JtICovCisJX191OCBwYWQ7Cit9IGl3ZmZmZl94d2F2ZV90OworCisvKgorICogIExheWVyCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX3hsZm8geworCV9fdTE2IGZyZXE7CQkJLyogKDAtMjA0NykgMC4wMUh6IC0gMjEuNUh6ICovCisJX19zMTYgZGVwdGg7CQkJLyogdm9sdW1lICstICgwLTI1NSkgMC40ODY3NWRCL3N0ZXAgKi8KKwlfX3MxNiBzd2VlcDsJCQkvKiAwIC0gOTUwIGRlY2lzZWNvbmRzICovCisJX191OCBzaGFwZTsJCQkvKiBzZWUgdG8gVUxUUkFfSVdfTEZPX1NIQVBFX1hYWFggKi8KKwlfX3U4IGRlbGF5OwkJCS8qIDAgLSAyNTUgZGVjaXNlY29uZHMgKi8KK30gaXdmZmZmX3hsZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX3hlbnZfcG9pbnQgeworCV9fdTE2IG9mZnNldDsKKwlfX3UxNiByYXRlOworfSBpd2ZmZmZfeGVudl9wb2ludF90OworCit0eXBlZGVmIHN0cnVjdCBpd2ZmZmZfeGVudl9yZWNvcmQgeworCV9fdTMyIHN0eXBlOworCV9fdTE2IG5hdHRhY2s7CisJX191MTYgbnJlbGVhc2U7CisJX191MTYgc3VzdGFpbl9vZmZzZXQ7CisJX191MTYgc3VzdGFpbl9yYXRlOworCV9fdTE2IHJlbGVhc2VfcmF0ZTsKKwlfX3U4IGhpcmFuZ2U7CisJX191OCBwYWQ7CisJLyogcG9pbnRzIGFyZSBzdG9yZWQgaGVyZS4uICovCisJLyogY291bnQgb2YgcG9pbnRzID0gbmF0dGFjayArIG5yZWxlYXNlICovCit9IGl3ZmZmZl94ZW52X3JlY29yZF90OworCit0eXBlZGVmIHN0cnVjdCBpd2ZmZmZfeGVudiB7CisJX191OCBmbGFnczsKKyAgCV9fdTggbW9kZTsKKyAgCV9fdTggaW5kZXg7CisJX191OCBwYWQ7Cit9IGl3ZmZmZl94ZW52X3Q7CisKK3R5cGVkZWYgc3RydWN0IGl3ZmZmZl94bGF5ZXIgeworCV9fdTMyIHN0eXBlOworCV9fdTggZmxhZ3M7CisJX191OCB2ZWxvY2l0eV9tb2RlOworICAgICAgCV9fdTggbGF5ZXJfZXZlbnQ7CisJX191OCBsb3dfcmFuZ2U7CQkJLyogcmFuZ2UgZm9yIGxheWVyIGJhc2VkICovCisJX191OCBoaWdoX3JhbmdlOwkJLyogb24gZWl0aGVyIHZlbG9jaXR5IG9yIGZyZXF1ZW5jeSAqLworCV9fdTggcGFuOwkJCS8qIHBhbiBvZmZzZXQgZnJvbSBDQzEgKDAgbGVmdCAtIDEyNyByaWdodCkgKi8KKwlfX3U4IHBhbl9mcmVxX3NjYWxlOwkJLyogcG9zaXRpb24gYmFzZWQgb24gZnJlcXVlbmN5ICgwLTEyNykgKi8KKwlfX3U4IGF0dGVudWF0aW9uOwkJLyogMC0xMjcgKG5vIGNvcnJlc3BvbmRpbmcgbWlkaSBjb250cm9sbGVyKSAqLworCWl3ZmZmZl94bGZvX3QgdHJlbW9sbzsJCS8qIHRyZW1vbG8gZWZmZWN0ICovCisJaXdmZmZmX3hsZm9fdCB2aWJyYXRvOwkJLyogdmlicmF0byBlZmZlY3QgKi8KKwlfX3UxNiBmcmVxX3NjYWxlOwkJLyogMC0yMDQ4LCAxMDI0IGlzIGVxdWFsIHRvIHNlbWl0b25lIHNjYWxpbmcgKi8KKwlfX3U4IGZyZXFfY2VudGVyOwkJLyogY2VudGVyIGZvciBrZXlib2FyZCBmcmVxdWVuY3kgc2NhbGluZyAqLworCV9fdTggcGFkOworCWl3ZmZmZl94ZW52X3QgcGVudjsJCS8qIHBpdGNoIGVudmVsb3BlICovCisJaXdmZmZmX3hlbnZfdCB2ZW52OwkJLyogdm9sdW1lIGVudmVsb3BlICovCit9IGl3ZmZmZl94bGF5ZXJfdDsKKworLyoKKyAqICBJbnN0cnVtZW50CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaXdmZmZmX3hpbnN0cnVtZW50IHsKKwlfX3UzMiBzdHlwZTsKKwkKKwlfX3UxNiBleGNsdXNpb247CisJX191MTYgbGF5ZXJfdHlwZTsKKwlfX3UxNiBleGNsdXNpb25fZ3JvdXA7CQkvKiAwIC0gbm9uZSwgMS02NTUzNSAqLworCisJX191OCBlZmZlY3QxOwkJCS8qIGVmZmVjdCAxICovCisJX191OCBlZmZlY3QxX2RlcHRoOwkJLyogMC0xMjcgKi8KKwlfX3U4IGVmZmVjdDI7CQkJLyogZWZmZWN0IDIgKi8KKwlfX3U4IGVmZmVjdDJfZGVwdGg7CQkvKiAwLTEyNyAqLworfSBpd2ZmZmZfeGluc3RydW1lbnRfdDsKKworLyoKKyAqICBST00gc3VwcG9ydAorICogICAgSW50ZXJXYXZlIFJPTXMgYXJlIExpdHRsZS1FbmRpYW4gKHg4NikKKyAqLworCisjZGVmaW5lIElXRkZGRl9ST01fSERSX1NJWkUJNTEyCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3U4IGl3YXZlWzhdOworCV9fdTggcmV2aXNpb247CisJX191OCBzZXJpZXNfbnVtYmVyOworCV9fdTggc2VyaWVzX25hbWVbMTZdOworCV9fdTggZGF0ZVsxMF07CisJX191MTYgdmVuZG9yX3JldmlzaW9uX21ham9yOworCV9fdTE2IHZlbmRvcl9yZXZpc2lvbl9taW5vcjsKKwlfX3UzMiByb21fc2l6ZTsKKwlfX3U4IGNvcHlyaWdodFsxMjhdOworCV9fdTggdmVuZG9yX25hbWVbNjRdOworCV9fdTggZGVzY3JpcHRpb25bMTI4XTsKK30gaXdmZmZmX3JvbV9oZWFkZXJfdDsKKworLyoKKyAqICBJbnN0cnVtZW50IGluZm8KKyAqLworCisjZGVmaW5lIElXRkZGRl9JTkZPX0xGT19WSUJSQVRPCQkoMTw8MCkKKyNkZWZpbmUgSVdGRkZGX0lORk9fTEZPX1ZJQlJBVE9fU0hBUEUJKDE8PDEpCisjZGVmaW5lIElXRkZGRl9JTkZPX0xGT19UUkVNT0xPCQkoMTw8MikKKyNkZWZpbmUgSVdGRkZGX0lORk9fTEZPX1RSRU1PTE9fU0hBUEUJKDE8PDMpCisKK3R5cGVkZWYgc3RydWN0IGl3ZmZmZl9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgZm9ybWF0OwkJLyogc3VwcG9ydGVkIGZvcm1hdCBiaXRzICovCisJdW5zaWduZWQgaW50IGVmZmVjdHM7CQkvKiBzdXBwb3J0ZWQgZWZmZWN0cyAoMSA8PCBJV0ZGRkZfRUZGRUNUKikgKi8KKwl1bnNpZ25lZCBpbnQgbGZvczsJCS8qIExGTyBlZmZlY3RzICovCisJdW5zaWduZWQgaW50IG1heDhfbGVuOwkJLyogbWF4aW11bSA4LWJpdCB3YXZlIGxlbmd0aCAqLworCXVuc2lnbmVkIGludCBtYXgxNl9sZW47CQkvKiBtYXhpbXVtIDE2LWJpdCB3YXZlIGxlbmd0aCAqLworfSBpd2ZmZmZfaW5mb190OworCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSAic2VxX2luc3RyLmgiCisKK2V4dGVybiBjaGFyICpzbmRfc2VxX2l3ZmZmZl9pZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKnByaXZhdGVfZGF0YTsKKwlpbnQgKCppbmZvKSh2b2lkICpwcml2YXRlX2RhdGEsIGl3ZmZmZl9pbmZvX3QgKmluZm8pOworCWludCAoKnB1dF9zYW1wbGUpKHZvaWQgKnByaXZhdGVfZGF0YSwgaXdmZmZmX3dhdmVfdCAqd2F2ZSwKKwkgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBsb25nIGxlbiwgaW50IGF0b21pYyk7CisJaW50ICgqZ2V0X3NhbXBsZSkodm9pZCAqcHJpdmF0ZV9kYXRhLCBpd2ZmZmZfd2F2ZV90ICp3YXZlLAorCQkJICBjaGFyICpkYXRhLCBsb25nIGxlbiwgaW50IGF0b21pYyk7CisJaW50ICgqcmVtb3ZlX3NhbXBsZSkodm9pZCAqcHJpdmF0ZV9kYXRhLCBpd2ZmZmZfd2F2ZV90ICp3YXZlLAorCQkJICAgICBpbnQgYXRvbWljKTsKKwl2b2lkICgqbm90aWZ5KSh2b2lkICpwcml2YXRlX2RhdGEsIHNuZF9zZXFfa2luc3RyX3QgKmluc3RyLCBpbnQgd2hhdCk7CisJc25kX3NlcV9raW5zdHJfb3BzX3Qga29wczsKK30gc25kX2l3ZmZmZl9vcHNfdDsKKworaW50IHNuZF9zZXFfaXdmZmZmX2luaXQoc25kX2l3ZmZmZl9vcHNfdCAqb3BzLAorCQkJdm9pZCAqcHJpdmF0ZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgc25kX3NlcV9raW5zdHJfb3BzX3QgKm5leHQpOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fU09VTkRfQUlOU1RSX0lXX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9haW5zdHJfc2ltcGxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvYWluc3RyX3NpbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjZjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvYWluc3RyX3NpbXBsZS5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorICoKKyAqICBTaW1wbGUgKE1PRCBwbGF5ZXIpIEluc3RydW1lbnQgRm9ybWF0CisgKiAgQ29weXJpZ2h0IChjKSAxOTk0LTk5IGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+CisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX0FJTlNUUl9TSU1QTEVfSAorI2RlZmluZSBfX1NPVU5EX0FJTlNUUl9TSU1QTEVfSAorCisjaW5jbHVkZSAidHlwZV9jb21wYXQuaCIKKworLyoKKyAqICBzaGFyZSB0eXBlcyAoc2hhcmUgSUQgMSkKKyAqLworCisjZGVmaW5lIFNJTVBMRV9TSEFSRV9GSUxFCQkwCisKKy8qCisgKiAgd2F2ZSBmb3JtYXRzCisgKi8KKworI2RlZmluZSBTSU1QTEVfV0FWRV8xNkJJVAkJMHgwMDAxICAvKiAxNi1iaXQgd2F2ZSAqLworI2RlZmluZSBTSU1QTEVfV0FWRV9VTlNJR05FRAkJMHgwMDAyICAvKiB1bnNpZ25lZCB3YXZlICovCisjZGVmaW5lIFNJTVBMRV9XQVZFX0lOVkVSVAkJMHgwMDAyICAvKiBzYW1lIGFzIHVuc2lnbmVkIHdhdmUgKi8KKyNkZWZpbmUgU0lNUExFX1dBVkVfQkFDS1dBUkQJCTB4MDAwNCAgLyogYmFja3dhcmQgbW9kZSAobWF5YmUgdXNlZCBmb3IgcmV2ZXJiIG9yIHBpbmctcGluZyBsb29wKSAqLworI2RlZmluZSBTSU1QTEVfV0FWRV9MT09QCQkweDAwMDggIC8qIGxvb3AgbW9kZSAqLworI2RlZmluZSBTSU1QTEVfV0FWRV9CSURJUgkJMHgwMDEwICAvKiBiaWRpcmVjdGlvbmFsIG1vZGUgKi8KKyNkZWZpbmUgU0lNUExFX1dBVkVfU1RFUkVPCQkweDAxMDAJLyogc3RlcmVvIHdhdmUgKi8KKyNkZWZpbmUgU0lNUExFX1dBVkVfVUxBVwkJMHgwMjAwCS8qIHVMYXcgY29tcHJlc3Npb24gbW9kZSAqLworCisvKgorICogIGluc3RydW1lbnQgZWZmZWN0cworICovCisKKyNkZWZpbmUgU0lNUExFX0VGRkVDVF9OT05FCQkwCisjZGVmaW5lIFNJTVBMRV9FRkZFQ1RfUkVWRVJCCQkxCisjZGVmaW5lIFNJTVBMRV9FRkZFQ1RfQ0hPUlVTCQkyCisjZGVmaW5lIFNJTVBMRV9FRkZFQ1RfRUNITwkJMworCisvKgorICogIGluc3RydW1lbnQgaW5mbworICovCisKK3R5cGVkZWYgc3RydWN0IHNpbXBsZV9pbnN0cnVtZW50X2luZm8geworCXVuc2lnbmVkIGludCBmb3JtYXQ7CQkvKiBzdXBwb3J0ZWQgZm9ybWF0IGJpdHMgKi8KKwl1bnNpZ25lZCBpbnQgZWZmZWN0czsJCS8qIHN1cHBvcnRlZCBlZmZlY3RzICgxIDw8IFNJTVBMRV9FRkZFQ1RfKikgKi8KKwl1bnNpZ25lZCBpbnQgbWF4OF9sZW47CQkvKiBtYXhpbXVtIDgtYml0IHdhdmUgbGVuZ3RoICovCisJdW5zaWduZWQgaW50IG1heDE2X2xlbjsJCS8qIG1heGltdW0gMTYtYml0IHdhdmUgbGVuZ3RoICovCit9IHNpbXBsZV9pbnN0cnVtZW50X2luZm9fdDsKKworLyoKKyAqICBJbnN0cnVtZW50CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzaGFyZV9pZFs0XTsJLyogc2hhcmUgaWQgLSB6ZXJvID0gbm8gc2hhcmluZyAqLworCXVuc2lnbmVkIGludCBmb3JtYXQ7CQkvKiB3YXZlIGZvcm1hdCAqLworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IG51bWJlcjsJLyogc29tZSBvdGhlciBJRCBmb3IgdGhpcyBpbnN0cnVtZW50ICovCisJCXVuc2lnbmVkIGludCBtZW1vcnk7CS8qIGJlZ2luIG9mIHdhdmVmb3JtIGluIG9uYm9hcmQgbWVtb3J5ICovCisJCXVuc2lnbmVkIGNoYXIgKnB0cjsJLyogcG9pbnRlciB0byB3YXZlZm9ybSBpbiBzeXN0ZW0gbWVtb3J5ICovCisJfSBhZGRyZXNzOworCisJdW5zaWduZWQgaW50IHNpemU7CQkvKiBzaXplIG9mIHdhdmVmb3JtIGluIHNhbXBsZXMgKi8KKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CQkvKiBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJdW5zaWduZWQgaW50IGxvb3Bfc3RhcnQ7CS8qIGxvb3Agc3RhcnQgb2Zmc2V0IGluIHNhbXBsZXMgKiAxNiAobG93ZXN0IDQgYml0cyAtIGZyYWN0aW9uKSAqLworCXVuc2lnbmVkIGludCBsb29wX2VuZDsJCS8qIGxvb3AgZW5kIG9mZnNldCBpbiBzYW1wbGVzICogMTYgKGxvd2VzdCA0IGJpdHMgLSBmcmFjdGlvbikgKi8KKwl1bnNpZ25lZCBzaG9ydCBsb29wX3JlcGVhdDsJLyogbG9vcCByZXBlYXQgLSAwID0gZm9yZXZlciAqLworCisJdW5zaWduZWQgY2hhciBlZmZlY3QxOwkJLyogZWZmZWN0IDEgKi8KKwl1bnNpZ25lZCBjaGFyIGVmZmVjdDFfZGVwdGg7CS8qIDAtMTI3ICovCisJdW5zaWduZWQgY2hhciBlZmZlY3QyOwkJLyogZWZmZWN0IDIgKi8KKwl1bnNpZ25lZCBjaGFyIGVmZmVjdDJfZGVwdGg7CS8qIDAtMTI3ICovCit9IHNpbXBsZV9pbnN0cnVtZW50X3Q7CisKKy8qCisgKgorICogICAgS2VybmVsIDwtPiB1c2VyIHNwYWNlCisgKiAgICBIYXJkd2FyZSAoQ1BVKSBpbmRlcGVuZGVudCBzZWN0aW9uCisgKgorICogICAgKiA9IHplcm8gb3IgbW9yZQorICogICAgKyA9IG9uZSBvciBtb3JlCisgKgorICogICAgc2ltcGxlX3hpbnN0cnVtZW50CVNJTVBMRV9TVFJVX0lOU1RSCisgKgorICovCisKKyNkZWZpbmUgU0lNUExFX1NUUlVfSU5TVFIJX19jcHVfdG9fYmUzMigoJ0knPDwyNCl8KCdOJzw8MTYpfCgnUyc8PDgpfCdUJykKKworLyoKKyAqICBJbnN0cnVtZW50CisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2ltcGxlX3hpbnN0cnVtZW50IHsKKwlfX3UzMiBzdHlwZTsKKworCV9fdTMyIHNoYXJlX2lkWzRdOwkJLyogc2hhcmUgaWQgLSB6ZXJvID0gbm8gc2hhcmluZyAqLworCV9fdTMyIGZvcm1hdDsJCQkvKiB3YXZlIGZvcm1hdCAqLworCisJX191MzIgc2l6ZTsJCQkvKiBzaXplIG9mIHdhdmVmb3JtIGluIHNhbXBsZXMgKi8KKwlfX3UzMiBzdGFydDsJCQkvKiBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJX191MzIgbG9vcF9zdGFydDsJCS8qIGJpdHMgbG9vcCBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJX191MzIgbG9vcF9lbmQ7CQkJLyogbG9vcCBzdGFydCBvZmZzZXQgaW4gc2FtcGxlcyAqIDE2IChsb3dlc3QgNCBiaXRzIC0gZnJhY3Rpb24pICovCisJX191MTYgbG9vcF9yZXBlYXQ7CQkvKiBsb29wIHJlcGVhdCAtIDAgPSBmb3JldmVyICovCisJCisJX191OCBlZmZlY3QxOwkJCS8qIGVmZmVjdCAxICovCisJX191OCBlZmZlY3QxX2RlcHRoOwkJLyogMC0xMjcgKi8KKwlfX3U4IGVmZmVjdDI7CQkJLyogZWZmZWN0IDIgKi8KKwlfX3U4IGVmZmVjdDJfZGVwdGg7CQkvKiAwLTEyNyAqLworfSBzaW1wbGVfeGluc3RydW1lbnRfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgInNlcV9pbnN0ci5oIgorCitleHRlcm4gY2hhciAqc25kX3NlcV9zaW1wbGVfaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICpwcml2YXRlX2RhdGE7CisJaW50ICgqaW5mbykodm9pZCAqcHJpdmF0ZV9kYXRhLCBzaW1wbGVfaW5zdHJ1bWVudF9pbmZvX3QgKmluZm8pOworCWludCAoKnB1dF9zYW1wbGUpKHZvaWQgKnByaXZhdGVfZGF0YSwgc2ltcGxlX2luc3RydW1lbnRfdCAqaW5zdHIsCisJICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgbG9uZyBsZW4sIGludCBhdG9taWMpOworCWludCAoKmdldF9zYW1wbGUpKHZvaWQgKnByaXZhdGVfZGF0YSwgc2ltcGxlX2luc3RydW1lbnRfdCAqaW5zdHIsCisJCQkgIGNoYXIgKmRhdGEsIGxvbmcgbGVuLCBpbnQgYXRvbWljKTsKKwlpbnQgKCpyZW1vdmVfc2FtcGxlKSh2b2lkICpwcml2YXRlX2RhdGEsIHNpbXBsZV9pbnN0cnVtZW50X3QgKmluc3RyLAorCQkJICAgICBpbnQgYXRvbWljKTsKKwl2b2lkICgqbm90aWZ5KSh2b2lkICpwcml2YXRlX2RhdGEsIHNuZF9zZXFfa2luc3RyX3QgKmluc3RyLCBpbnQgd2hhdCk7CisJc25kX3NlcV9raW5zdHJfb3BzX3Qga29wczsKK30gc25kX3NpbXBsZV9vcHNfdDsKKworaW50IHNuZF9zZXFfc2ltcGxlX2luaXQoc25kX3NpbXBsZV9vcHNfdCAqb3BzLAorCQkJdm9pZCAqcHJpdmF0ZV9kYXRhLAorCQkJc25kX3NlcV9raW5zdHJfb3BzX3QgKm5leHQpOworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fU09VTkRfQUlOU1RSX1NJTVBMRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvYXNvdW5kX2ZtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvYXNvdW5kX2ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwZWE0MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9hc291bmRfZm0uaApAQCAtMCwwICsxLDExNSBAQAorI2lmbmRlZiBfX1NPVU5EX0FTT1VORF9GTV9ICisjZGVmaW5lIF9fU09VTkRfQVNPVU5EX0ZNX0gKKworLyoKKyAqICBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgLSBBTFNBCisgKgorICogIEludGVyZmFjZSBmaWxlIGJldHdlZW4gQUxTQSBkcml2ZXIgJiB1c2VyIHNwYWNlCisgKiAgQ29weXJpZ2h0IChjKSAxOTk0LTk4IGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+LAorICogICAgICAgICAgICAgICAgICAgICAgICAgICA0RnJvbnQgVGVjaG5vbG9naWVzCisgKgorICogIERpcmVjdCBGTSBjb250cm9sCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjZGVmaW5lIFNORFJWX0RNX0ZNX01PREVfT1BMMgkweDAwCisjZGVmaW5lIFNORFJWX0RNX0ZNX01PREVfT1BMMwkweDAxCisKK3R5cGVkZWYgc3RydWN0IHNuZF9kbV9mbV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIGZtX21vZGU7CQkvKiBPUEwgbW9kZSwgc2VlIFNORFJWX0RNX0ZNX01PREVfWFhYICovCisJdW5zaWduZWQgY2hhciByaHl0aG07CQkvKiBwZXJjdXNzaW9uIG1vZGUgZmxhZyAqLworfSBzbmRfZG1fZm1faW5mb190OworCisvKgorICogIERhdGEgc3RydWN0dXJlIGNvbXBvc2luZyBhbiBGTSAibm90ZSIgb3Igc291bmQgZXZlbnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc25kX2RtX2ZtX3ZvaWNlIHsKKwl1bnNpZ25lZCBjaGFyIG9wOwkJLyogb3BlcmF0b3IgY2VsbCAoMCBvciAxKSAqLworCXVuc2lnbmVkIGNoYXIgdm9pY2U7CQkvKiBGTSB2b2ljZSAoMCB0byAxNykgKi8KKworCXVuc2lnbmVkIGNoYXIgYW07CQkvKiBhbXBsaXR1ZGUgbW9kdWxhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIgdmlicmF0bzsJCS8qIHZpYnJhdG8gZWZmZWN0ICovCisJdW5zaWduZWQgY2hhciBkb19zdXN0YWluOwkvKiBzdXN0YWluIHBoYXNlICovCisJdW5zaWduZWQgY2hhciBrYmRfc2NhbGU7CS8qIGtleWJvYXJkIHNjYWxpbmcgKi8KKwl1bnNpZ25lZCBjaGFyIGhhcm1vbmljOwkJLyogNCBiaXRzOiBoYXJtb25pYyBhbmQgbXVsdGlwbGllciAqLworCXVuc2lnbmVkIGNoYXIgc2NhbGVfbGV2ZWw7CS8qIDIgYml0czogZGVjcmVhc2Ugb3V0cHV0IGZyZXEgcmlzZXMgKi8KKwl1bnNpZ25lZCBjaGFyIHZvbHVtZTsJCS8qIDYgYml0czogdm9sdW1lICovCisKKwl1bnNpZ25lZCBjaGFyIGF0dGFjazsJCS8qIDQgYml0czogYXR0YWNrIHJhdGUgKi8KKwl1bnNpZ25lZCBjaGFyIGRlY2F5OwkJLyogNCBiaXRzOiBkZWNheSByYXRlICovCisJdW5zaWduZWQgY2hhciBzdXN0YWluOwkJLyogNCBiaXRzOiBzdXN0YWluIGxldmVsICovCisJdW5zaWduZWQgY2hhciByZWxlYXNlOwkJLyogNCBiaXRzOiByZWxlYXNlIHJhdGUgKi8KKworCXVuc2lnbmVkIGNoYXIgZmVlZGJhY2s7CQkvKiAzIGJpdHM6IGZlZWRiYWNrIGZvciBvcDAgKi8KKwl1bnNpZ25lZCBjaGFyIGNvbm5lY3Rpb247CS8qIDAgZm9yIHNlcmlhbCwgMSBmb3IgcGFyYWxsZWwgKi8KKwl1bnNpZ25lZCBjaGFyIGxlZnQ7CQkvKiBzdGVyZW8gbGVmdCAqLworCXVuc2lnbmVkIGNoYXIgcmlnaHQ7CQkvKiBzdGVyZW8gcmlnaHQgKi8KKwl1bnNpZ25lZCBjaGFyIHdhdmVmb3JtOwkJLyogMyBiaXRzOiB3YXZlZm9ybSBzaGFwZSAqLworfSBzbmRfZG1fZm1fdm9pY2VfdDsKKworLyoKKyAqICBUaGlzIGRlc2NyaWJlcyBhbiBGTSBub3RlIGJ5IGl0cyB2b2ljZSwgb2N0YXZlLCBmcmVxdWVuY3kgbnVtYmVyICgxMGJpdCkKKyAqICBhbmQga2V5IG9uL29mZi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBzbmRfZG1fZm1fbm90ZSB7CisJdW5zaWduZWQgY2hhciB2b2ljZTsJLyogMC0xNyB2b2ljZSBjaGFubmVsICovCisJdW5zaWduZWQgY2hhciBvY3RhdmU7CS8qIDMgYml0czogd2hhdCBvY3RhdmUgdG8gcGxheSAqLworCXVuc2lnbmVkIGludCBmbnVtOwkvKiAxMCBiaXRzOiBmcmVxdWVuY3kgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBrZXlfb247CS8qIHNldCBmb3IgYWN0aXZlLCBjbGVhciBmb3Igc2lsZW50ICovCit9IHNuZF9kbV9mbV9ub3RlX3Q7CisKKy8qCisgKiAgRk0gcGFyYW1ldGVycyB0aGF0IGFwcGx5IGdsb2JhbGx5IHRvIGFsbCB2b2ljZXMsIGFuZCB0aHVzIGFyZSBub3QgIm5vdGVzIgorICovCisKK3R5cGVkZWYgc3RydWN0IHNuZF9kbV9mbV9wYXJhbXMgeworCXVuc2lnbmVkIGNoYXIgYW1fZGVwdGg7CQkvKiBhbXBsaXR1ZGUgbW9kdWxhdGlvbiBkZXB0aCAoMT1oaSkgKi8KKwl1bnNpZ25lZCBjaGFyIHZpYl9kZXB0aDsJLyogdmlicmF0byBkZXB0aCAoMT1oaSkgKi8KKwl1bnNpZ25lZCBjaGFyIGtiZF9zcGxpdDsJLyoga2V5Ym9hcmQgc3BsaXQgKi8KKwl1bnNpZ25lZCBjaGFyIHJoeXRobTsJCS8qIHBlcmN1c3Npb24gbW9kZSBzZWxlY3QgKi8KKworCS8qIFRoaXMgYmxvY2sgaXMgdGhlIHBlcmN1c3Npb24gaW5zdHJ1bWVudCBkYXRhICovCisJdW5zaWduZWQgY2hhciBiYXNzOworCXVuc2lnbmVkIGNoYXIgc25hcmU7CisJdW5zaWduZWQgY2hhciB0b210b207CisJdW5zaWduZWQgY2hhciBjeW1iYWw7CisJdW5zaWduZWQgY2hhciBoaWhhdDsKK30gc25kX2RtX2ZtX3BhcmFtc190OworCisvKgorICogIEZNIG1vZGUgaW9jdGwgc2V0dGluZ3MKKyAqLworCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX0lORk8JCV9JT1IoJ0gnLCAweDIwLCBzbmRfZG1fZm1faW5mb190KQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9SRVNFVAkJX0lPICgnSCcsIDB4MjEpCisjZGVmaW5lIFNORFJWX0RNX0ZNX0lPQ1RMX1BMQVlfTk9URQlfSU9XKCdIJywgMHgyMiwgc25kX2RtX2ZtX25vdGVfdCkKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfU0VUX1ZPSUNFCV9JT1coJ0gnLCAweDIzLCBzbmRfZG1fZm1fdm9pY2VfdCkKKyNkZWZpbmUgU05EUlZfRE1fRk1fSU9DVExfU0VUX1BBUkFNUwlfSU9XKCdIJywgMHgyNCwgc25kX2RtX2ZtX3BhcmFtc190KQorI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfTU9ERQlfSU9XKCdIJywgMHgyNSwgaW50KQorLyogZm9yIE9QTDMgb25seSAqLworI2RlZmluZSBTTkRSVl9ETV9GTV9JT0NUTF9TRVRfQ09OTkVDVElPTglfSU9XKCdIJywgMHgyNiwgaW50KQorCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9SRVNFVAkJMHgyMAorI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfUExBWV9OT1RFCQkweDIxCisjZGVmaW5lIFNORFJWX0RNX0ZNX09TU19JT0NUTF9TRVRfVk9JQ0UJCTB4MjIKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9QQVJBTVMJMHgyMworI2RlZmluZSBTTkRSVl9ETV9GTV9PU1NfSU9DVExfU0VUX01PREUJCTB4MjQKKyNkZWZpbmUgU05EUlZfRE1fRk1fT1NTX0lPQ1RMX1NFVF9PUEwJCTB4MjUKKworI2VuZGlmIC8qIF9fU09VTkRfQVNPVU5EX0ZNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9lbXUxMGsxLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvZW11MTBrMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MDE4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvZW11MTBrMS5oCkBAIC0wLDAgKzEsMzQ5IEBACisjaWZuZGVmIF9fU09VTkRfRU1VMTBLMV9ICisjZGVmaW5lIF9fU09VTkRfRU1VMTBLMV9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiwKKyAqCQkgICAgIENyZWF0aXZlIExhYnMsIEluYy4KKyAqICBEZWZpbml0aW9ucyBmb3IgRU1VMTBLMSAoU0IgTGl2ZSEpIGNoaXBzCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKgorICogLS0tLSBGWDgwMTAgLS0tLQorICovCisKKyNkZWZpbmUgRU1VMTBLMV9DQVJEX0NSRUFUSVZFCQkJMHgwMDAwMDAwMAorI2RlZmluZSBFTVUxMEsxX0NBUkRfRU1VQVBTCQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEVNVTEwSzFfRlg4MDEwX1BDTV9DT1VOVAkJOAorCisvKiBpbnN0cnVjdGlvbiBzZXQgKi8KKyNkZWZpbmUgaU1BQzAJIDB4MDAJLyogUiA9IEEgKyAoWCAqIFkgPj4gMzEpICAgOyBzYXR1cmF0aW9uICovCisjZGVmaW5lIGlNQUMxCSAweDAxCS8qIFIgPSBBICsgKC1YICogWSA+PiAzMSkgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDMgkgMHgwMgkvKiBSID0gQSArIChYICogWSA+PiAzMSkgICA7IHdyYXBhcm91bmQgKi8KKyNkZWZpbmUgaU1BQzMJIDB4MDMJLyogUiA9IEEgKyAoLVggKiBZID4+IDMxKSAgOyB3cmFwYXJvdW5kICovCisjZGVmaW5lIGlNQUNJTlQwIDB4MDQJLyogUiA9IEEgKyBYICogWQkgICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaU1BQ0lOVDEgMHgwNQkvKiBSID0gQSArIFggKiBZCSAgIDsgd3JhcGFyb3VuZCAoMzEtYml0KSAqLworI2RlZmluZSBpQUNDMwkgMHgwNgkvKiBSID0gQSArIFggKyBZCSAgIDsgc2F0dXJhdGlvbiAqLworI2RlZmluZSBpTUFDTVYgICAweDA3CS8qIFIgPSBBLCBhY2MgKz0gWCAqIFkgPj4gMzEgKi8KKyNkZWZpbmUgaUFORFhPUiAgMHgwOAkvKiBSID0gKEEgJiBYKSBeIFkgKi8KKyNkZWZpbmUgaVRTVE5FRyAgMHgwOQkvKiBSID0gKEEgPj0gWSkgPyBYIDogflggKi8KKyNkZWZpbmUgaUxJTUlUR0UgMHgwYQkvKiBSID0gKEEgPj0gWSkgPyBYIDogWSAqLworI2RlZmluZSBpTElNSVRMVCAweDBiCS8qIFIgPSAoQSA8IFkpID8gWCA6IFkgKi8KKyNkZWZpbmUgaUxPRwkgMHgwYwkvKiBSID0gbGluZWFyX2RhdGEsIEEgKGxvZ19kYXRhKSwgWCAobWF4X2V4cCksIFkgKGZvcm1hdF93b3JkKSAqLworI2RlZmluZSBpRVhQCSAweDBkCS8qIFIgPSBsb2dfZGF0YSwgQSAobGluZWFyX2RhdGEpLCBYIChtYXhfZXhwKSwgWSAoZm9ybWF0X3dvcmQpICovCisjZGVmaW5lIGlJTlRFUlAgIDB4MGUJLyogUiA9IEEgKyAoWCAqIChZIC0gQSkgPj4gMzEpICA7IHNhdHVyYXRpb24gKi8KKyNkZWZpbmUgaVNLSVAgICAgMHgwZgkvKiBSID0gQSAoY2NfcmVnKSwgWCAoY291bnQpLCBZIChjY190ZXN0KSAqLworCisvKiBHUFJzICovCisjZGVmaW5lIEZYQlVTKHgpCSgweDAwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MGYgKi8KKyNkZWZpbmUgRVhUSU4oeCkJKDB4MTAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAqLworI2RlZmluZSBFWFRPVVQoeCkJKDB4MjAgKyAoeCkpCS8qIHggPSAweDAwIC0gMHgwZiAqLworI2RlZmluZSBDXzAwMDAwMDAwCTB4NDAKKyNkZWZpbmUgQ18wMDAwMDAwMQkweDQxCisjZGVmaW5lIENfMDAwMDAwMDIJMHg0MgorI2RlZmluZSBDXzAwMDAwMDAzCTB4NDMKKyNkZWZpbmUgQ18wMDAwMDAwNAkweDQ0CisjZGVmaW5lIENfMDAwMDAwMDgJMHg0NQorI2RlZmluZSBDXzAwMDAwMDEwCTB4NDYKKyNkZWZpbmUgQ18wMDAwMDAyMAkweDQ3CisjZGVmaW5lIENfMDAwMDAxMDAJMHg0OAorI2RlZmluZSBDXzAwMDEwMDAwCTB4NDkKKyNkZWZpbmUgQ18wMDA4MDAwMAkweDRhCisjZGVmaW5lIENfMTAwMDAwMDAJMHg0YgorI2RlZmluZSBDXzIwMDAwMDAwCTB4NGMKKyNkZWZpbmUgQ180MDAwMDAwMAkweDRkCisjZGVmaW5lIENfODAwMDAwMDAJMHg0ZQorI2RlZmluZSBDXzdmZmZmZmZmCTB4NGYKKyNkZWZpbmUgQ19mZmZmZmZmZgkweDUwCisjZGVmaW5lIENfZmZmZmZmZmUJMHg1MQorI2RlZmluZSBDX2MwMDAwMDAwCTB4NTIKKyNkZWZpbmUgQ180ZjFiYmNkYwkweDUzCisjZGVmaW5lIENfNWE3ZWY5ZGIJMHg1NAorI2RlZmluZSBDXzAwMTAwMDAwCTB4NTUJCS8qID8/ICovCisjZGVmaW5lIEdQUl9BQ0NVCTB4NTYJCS8qIEFDQ1VNLCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBHUFJfQ09ORAkweDU3CQkvKiBDQ1IsIGNvbmRpdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBHUFJfTk9JU0UwCTB4NTgJCS8qIG5vaXNlIHNvdXJjZSAqLworI2RlZmluZSBHUFJfTk9JU0UxCTB4NTkJCS8qIG5vaXNlIHNvdXJjZSAqLworI2RlZmluZSBHUFJfSVJRCQkweDVhCQkvKiBJUlEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1BSX0RCQUMJMHg1YgkJLyogVFJBTSBEZWxheSBCYXNlIEFkZHJlc3MgQ291bnRlciAqLworI2RlZmluZSBHUFIoeCkJCShGWEdQUkVHQkFTRSArICh4KSkgLyogZnJlZSBHUFJzOiB4ID0gMHgwMCAtIDB4ZmYgKi8KKyNkZWZpbmUgSVRSQU1fREFUQSh4KQkoVEFOS01FTURBVEFSRUdCQVNFICsgMHgwMCArICh4KSkgLyogeCA9IDB4MDAgLSAweDdmICovCisjZGVmaW5lIEVUUkFNX0RBVEEoeCkJKFRBTktNRU1EQVRBUkVHQkFTRSArIDB4ODAgKyAoeCkpIC8qIHggPSAweDAwIC0gMHgxZiAqLworI2RlZmluZSBJVFJBTV9BRERSKHgpCShUQU5LTUVNQUREUlJFR0JBU0UgKyAweDAwICsgKHgpKSAvKiB4ID0gMHgwMCAtIDB4N2YgKi8KKyNkZWZpbmUgRVRSQU1fQUREUih4KQkoVEFOS01FTUFERFJSRUdCQVNFICsgMHg4MCArICh4KSkgLyogeCA9IDB4MDAgLSAweDFmICovCisKKyNkZWZpbmUgQV9GWEJVUyh4KQkoMHgwMCArICh4KSkJLyogeCA9IDB4MDAgLSAweDNmPyAqLworI2RlZmluZSBBX0VYVElOKHgpCSgweDQwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MWY/ICovCisjZGVmaW5lIEFfRVhUT1VUKHgpCSgweDYwICsgKHgpKQkvKiB4ID0gMHgwMCAtIDB4MWY/ICovCisjZGVmaW5lIEFfR1BSKHgpCShBX0ZYR1BSRUdCQVNFICsgKHgpKQorCisvKiBjY19yZWcgY29uc3RhbnRzICovCisjZGVmaW5lIENDX1JFR19OT1JNQUxJWkVEIENfMDAwMDAwMDEKKyNkZWZpbmUgQ0NfUkVHX0JPUlJPVwlDXzAwMDAwMDAyCisjZGVmaW5lIENDX1JFR19NSU5VUwlDXzAwMDAwMDA0CisjZGVmaW5lIENDX1JFR19aRVJPCUNfMDAwMDAwMDgKKyNkZWZpbmUgQ0NfUkVHX1NBVFVSQVRFCUNfMDAwMDAwMTAKKyNkZWZpbmUgQ0NfUkVHX05PTlpFUk8JQ18wMDAwMDEwMAorCisvKiBGWCBidXNlcyAqLworI2RlZmluZSBGWEJVU19QQ01fTEVGVAkJMHgwMAorI2RlZmluZSBGWEJVU19QQ01fUklHSFQJCTB4MDEKKyNkZWZpbmUgRlhCVVNfUENNX0xFRlRfUkVBUgkweDAyCisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVF9SRUFSCTB4MDMKKyNkZWZpbmUgRlhCVVNfTUlESV9MRUZUCQkweDA0CisjZGVmaW5lIEZYQlVTX01JRElfUklHSFQJMHgwNQorI2RlZmluZSBGWEJVU19QQ01fQ0VOVEVSCTB4MDYKKyNkZWZpbmUgRlhCVVNfUENNX0xGRQkJMHgwNworI2RlZmluZSBGWEJVU19QQ01fTEVGVF9GUk9OVAkweDA4CisjZGVmaW5lIEZYQlVTX1BDTV9SSUdIVF9GUk9OVAkweDA5CisjZGVmaW5lIEZYQlVTX01JRElfUkVWRVJCCTB4MGMKKyNkZWZpbmUgRlhCVVNfTUlESV9DSE9SVVMJMHgwZAorI2RlZmluZSBGWEJVU19QQ01fTEVGVF9TSURFCTB4MGUKKyNkZWZpbmUgRlhCVVNfUENNX1JJR0hUX1NJREUJMHgwZgorI2RlZmluZSBGWEJVU19QVF9MRUZUCQkweDE0CisjZGVmaW5lIEZYQlVTX1BUX1JJR0hUCQkweDE1CisKKy8qIElucHV0cyAqLworI2RlZmluZSBFWFRJTl9BQzk3X0wJICAgMHgwMAkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX0FDOTdfUgkgICAweDAxCS8qIEFDJzk3IGNhcHR1cmUgY2hhbm5lbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX1NQRElGX0NEX0wgICAweDAyCS8qIGludGVybmFsIFMvUERJRiBDRCAtIG9uYm9hcmQgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX1NQRElGX0NEX1IgICAweDAzCS8qIGludGVybmFsIFMvUERJRiBDRCAtIG9uYm9hcmQgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9aT09NX0wJICAgMHgwNAkvKiBab29tIFZpZGVvIEkyUyAtIGxlZnQgKi8KKyNkZWZpbmUgRVhUSU5fWk9PTV9SCSAgIDB4MDUJLyogWm9vbSBWaWRlbyBJMlMgLSByaWdodCAqLworI2RlZmluZSBFWFRJTl9UT1NMSU5LX0wJICAgMHgwNgkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVElOX1RPU0xJTktfUiAgICAweDA3CS8qIExpdmVEcml2ZSAtIFRPU0xpbmsgT3B0aWNhbCAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX0xJTkUxX0wJICAgMHgwOAkvKiBMaXZlRHJpdmUgLSBMaW5lL01pYyAxIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9MSU5FMV9SCSAgIDB4MDkJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMSAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX0NPQVhfU1BESUZfTCAweDBhCS8qIExpdmVEcml2ZSAtIENvYXhpYWwgUy9QRElGIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9DT0FYX1NQRElGX1IgMHgwYiAvKiBMaXZlRHJpdmUgLSBDb2F4aWFsIFMvUERJRiAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVElOX0xJTkUyX0wJICAgMHgwYwkvKiBMaXZlRHJpdmUgLSBMaW5lL01pYyAyIC0gbGVmdCAqLworI2RlZmluZSBFWFRJTl9MSU5FMl9SCSAgIDB4MGQJLyogTGl2ZURyaXZlIC0gTGluZS9NaWMgMiAtIHJpZ2h0ICovCisKKy8qIE91dHB1dHMgKi8KKyNkZWZpbmUgRVhUT1VUX0FDOTdfTAkgICAweDAwCS8qIEFDJzk3IHBsYXliYWNrIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X1IJICAgMHgwMQkvKiBBQyc5NyBwbGF5YmFjayBjaGFubmVsIC0gcmlnaHQgKi8KKyNkZWZpbmUgRVhUT1VUX1RPU0xJTktfTCAgIDB4MDIJLyogTGl2ZURyaXZlIC0gVE9TTGluayBPcHRpY2FsIC0gbGVmdCAqLworI2RlZmluZSBFWFRPVVRfVE9TTElOS19SICAgMHgwMwkvKiBMaXZlRHJpdmUgLSBUT1NMaW5rIE9wdGljYWwgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfQUM5N19DRU5URVIgMHgwNAkvKiBTQiBMaXZlIDUuMSAtIGNlbnRlciAqLworI2RlZmluZSBFWFRPVVRfQUM5N19MRkUJICAgMHgwNSAvKiBTQiBMaXZlIDUuMSAtIExGRSAqLworI2RlZmluZSBFWFRPVVRfSEVBRFBIT05FX0wgMHgwNgkvKiBMaXZlRHJpdmUgLSBIZWFkcGhvbmUgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9IRUFEUEhPTkVfUiAweDA3CS8qIExpdmVEcml2ZSAtIEhlYWRwaG9uZSAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9SRUFSX0wJICAgMHgwOAkvKiBSZWFyIGNoYW5uZWwgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9SRUFSX1IJICAgMHgwOQkvKiBSZWFyIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBFWFRPVVRfQURDX0NBUF9MICAgMHgwYQkvKiBBREMgQ2FwdHVyZSBidWZmZXIgLSBsZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9BRENfQ0FQX1IgICAweDBiCS8qIEFEQyBDYXB0dXJlIGJ1ZmZlciAtIHJpZ2h0ICovCisjZGVmaW5lIEVYVE9VVF9NSUNfQ0FQCSAgIDB4MGMJLyogTUlDIENhcHR1cmUgYnVmZmVyICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X1JFQVJfTCAweDBkCS8qIFNCIExpdmUgNS4xIChjKSAyMDAzIC0gUmVhciBMZWZ0ICovCisjZGVmaW5lIEVYVE9VVF9BQzk3X1JFQVJfUiAweDBlCS8qIFNCIExpdmUgNS4xIChjKSAyMDAzIC0gUmVhciBSaWdodCAqLworI2RlZmluZSBFWFRPVVRfQUNFTlRFUgkgICAweDExIC8qIEFuYWxvZyBDZW50ZXIgKi8KKyNkZWZpbmUgRVhUT1VUX0FMRkUJICAgMHgxMiAvKiBBbmFsb2cgTEZFICovCisKKy8qIEF1ZGlneSBJbnB1dHMgKi8KKyNkZWZpbmUgQV9FWFRJTl9BQzk3X0wJCTB4MDAJLyogQUMnOTcgY2FwdHVyZSBjaGFubmVsIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0FDOTdfUgkJMHgwMQkvKiBBQyc5NyBjYXB0dXJlIGNoYW5uZWwgLSByaWdodCAqLworI2RlZmluZSBBX0VYVElOX1NQRElGX0NEX0wJMHgwMgkvKiBkaWdpdGFsIENEIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRJTl9TUERJRl9DRF9SCTB4MDMJLyogZGlnaXRhbCBDRCBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fT1BUX1NQRElGX0wgICAgIDB4MDQgICAgLyogYXVkaWd5IGRyaXZlIE9wdGljYWwgU1BESUYgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fT1BUX1NQRElGX1IgICAgIDB4MDUgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAqLyAKKyNkZWZpbmUgQV9FWFRJTl9MSU5FMl9MCQkweDA4CS8qIGF1ZGlneSBkcml2ZSBsaW5lMi9taWMyIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0xJTkUyX1IJCTB4MDkJLyogICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVElOX0FEQ19MCQkweDBhICAgIC8qIFBoaWxpcHMgQURDIC0gbGVmdCAqLworI2RlZmluZSBBX0VYVElOX0FEQ19SCQkweDBiICAgIC8qICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRJTl9BVVgyX0wJCTB4MGMJLyogYXVkaWd5IGRyaXZlIGF1eDIgLSBsZWZ0ICovCisjZGVmaW5lIEFfRVhUSU5fQVVYMl9SCQkweDBkCS8qICAgICAgICAgICAgICAgICAgIC0gcmlnaHQgKi8KKworLyogQXVkaWdpeSBPdXRwdXRzICovCisjZGVmaW5lIEFfRVhUT1VUX0ZST05UX0wJMHgwMAkvKiBkaWdpdGFsIGZyb250IGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfRlJPTlRfUgkweDAxCS8qICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQ0VOVEVSCQkweDAyCS8qIGRpZ2l0YWwgZnJvbnQgY2VudGVyICovCisjZGVmaW5lIEFfRVhUT1VUX0xGRQkJMHgwMwkvKiBkaWdpdGFsIGZyb250IGxmZSAqLworI2RlZmluZSBBX0VYVE9VVF9IRUFEUEhPTkVfTAkweDA0CS8qIGhlYWRwaG9uZSBhdWRpZ3kgZHJpdmUgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9IRUFEUEhPTkVfUgkweDA1CS8qICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfUkVBUl9MCQkweDA2CS8qIGRpZ2l0YWwgcmVhciBsZWZ0ICovCisjZGVmaW5lIEFfRVhUT1VUX1JFQVJfUgkJMHgwNwkvKiAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQUZST05UX0wJMHgwOAkvKiBhbmFsb2cgZnJvbnQgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9BRlJPTlRfUgkweDA5CS8qICAgICAgICAgICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BQ0VOVEVSCTB4MGEJLyogYW5hbG9nIGNlbnRlciAqLworI2RlZmluZSBBX0VYVE9VVF9BTEZFCQkweDBiCS8qIGFuYWxvZyBMRkUgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVNJREVfTAkweDBjCS8qIGFuYWxvZyBzaWRlIGxlZnQgIC0gQXVkaWd5IDIgWlMgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVNJREVfUgkweDBkCS8qICAgICAgICAgICAgIHJpZ2h0IC0gQXVkaWd5IDIgWlMgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVJFQVJfTAkweDBlCS8qIGFuYWxvZyByZWFyIGxlZnQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfQVJFQVJfUgkweDBmCS8qICAgICAgICAgICAgIHJpZ2h0ICovCisjZGVmaW5lIEFfRVhUT1VUX0FDOTdfTAkJMHgxMAkvKiBBQzk3IGxlZnQgKGZyb250KSAqLworI2RlZmluZSBBX0VYVE9VVF9BQzk3X1IJCTB4MTEJLyogICAgICByaWdodCAqLworI2RlZmluZSBBX0VYVE9VVF9BRENfQ0FQX0wJMHgxNgkvKiBBREMgY2FwdHVyZSBidWZmZXIgbGVmdCAqLworI2RlZmluZSBBX0VYVE9VVF9BRENfQ0FQX1IJMHgxNwkvKiAgICAgICAgICAgICAgICAgICAgcmlnaHQgKi8KKyNkZWZpbmUgQV9FWFRPVVRfTUlDX0NBUAkweDE4CS8qIE1pYyBjYXB0dXJlIGJ1ZmZlciAqLworCisvKiBBdWRpZ3kgY29uc3RhbnRzICovCisjZGVmaW5lIEFfQ18wMDAwMDAwMAkweGMwCisjZGVmaW5lIEFfQ18wMDAwMDAwMQkweGMxCisjZGVmaW5lIEFfQ18wMDAwMDAwMgkweGMyCisjZGVmaW5lIEFfQ18wMDAwMDAwMwkweGMzCisjZGVmaW5lIEFfQ18wMDAwMDAwNAkweGM0CisjZGVmaW5lIEFfQ18wMDAwMDAwOAkweGM1CisjZGVmaW5lIEFfQ18wMDAwMDAxMAkweGM2CisjZGVmaW5lIEFfQ18wMDAwMDAyMAkweGM3CisjZGVmaW5lIEFfQ18wMDAwMDEwMAkweGM4CisjZGVmaW5lIEFfQ18wMDAxMDAwMAkweGM5CisjZGVmaW5lIEFfQ18wMDAwMDgwMAkweGNhCisjZGVmaW5lIEFfQ18xMDAwMDAwMAkweGNiCisjZGVmaW5lIEFfQ18yMDAwMDAwMAkweGNjCisjZGVmaW5lIEFfQ180MDAwMDAwMAkweGNkCisjZGVmaW5lIEFfQ184MDAwMDAwMAkweGNlCisjZGVmaW5lIEFfQ183ZmZmZmZmZgkweGNmCisjZGVmaW5lIEFfQ19mZmZmZmZmZgkweGQwCisjZGVmaW5lIEFfQ19mZmZmZmZmZQkweGQxCisjZGVmaW5lIEFfQ19jMDAwMDAwMAkweGQyCisjZGVmaW5lIEFfQ180ZjFiYmNkYwkweGQzCisjZGVmaW5lIEFfQ181YTdlZjlkYgkweGQ0CisjZGVmaW5lIEFfQ18wMDEwMDAwMAkweGQ1CisjZGVmaW5lIEFfR1BSX0FDQ1UJMHhkNgkJLyogQUNDVU0sIGFjY3VtdWxhdG9yICovCisjZGVmaW5lIEFfR1BSX0NPTkQJMHhkNwkJLyogQ0NSLCBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQV9HUFJfTk9JU0UwCTB4ZDgJCS8qIG5vaXNlIHNvdXJjZSAqLworI2RlZmluZSBBX0dQUl9OT0lTRTEJMHhkOQkJLyogbm9pc2Ugc291cmNlICovCisjZGVmaW5lIEFfR1BSX0lSUQkweGRhCQkvKiBJUlEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQV9HUFJfREJBQwkweGRiCQkvKiBUUkFNIERlbGF5IEJhc2UgQWRkcmVzcyBDb3VudGVyIC0gaW50ZXJuYWwgKi8KKyNkZWZpbmUgQV9HUFJfREJBQ0UJMHhkZQkJLyogVFJBTSBEZWxheSBCYXNlIEFkZHJlc3MgQ291bnRlciAtIGV4dGVybmFsICovCisKKy8qIGRlZmluaXRpb25zIGZvciBkZWJ1ZyByZWdpc3RlciAqLworI2RlZmluZSBFTVUxMEsxX0RCR19aQwkJCTB4ODAwMDAwMDAJLyogemVybyB0cmFtIGNvdW50ZXIgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfU0FUVVJBVElPTl9PQ0NVUkVECTB4MDIwMDAwMDAJLyogc2F0dXJhdGlvbiBjb250cm9sICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NBVFVSQVRJT05fQUREUgkweDAxZmYwMDAwCS8qIHNhdHVyYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TSU5HTEVfU1RFUAkJMHgwMDAwODAwMAkvKiBzaW5nbGUgc3RlcCBtb2RlICovCisjZGVmaW5lIEVNVTEwSzFfREJHX1NURVAJCTB4MDAwMDQwMDAJLyogc3RhcnQgc2luZ2xlIHN0ZXAgKi8KKyNkZWZpbmUgRU1VMTBLMV9EQkdfQ09ORElUSU9OX0NPREUJMHgwMDAwM2UwMAkvKiBjb25kaXRpb24gY29kZSAqLworI2RlZmluZSBFTVUxMEsxX0RCR19TSU5HTEVfU1RFUF9BRERSCTB4MDAwMDAxZmYJLyogc2luZ2xlIHN0ZXAgYWRkcmVzcyAqLworCisvKiB0YW5rIG1lbW9yeSBhZGRyZXNzIGxpbmUgKi8KKyNpZm5kZWYgX19LRVJORUxfXworI2RlZmluZSBUQU5LTUVNQUREUlJFR19BRERSX01BU0sgMHgwMDBmZmZmZgkvKiAyMCBiaXQgdGFuayBhZGRyZXNzIGZpZWxkCQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfQ0xFQVIJIDB4MDA4MDAwMDAJLyogQ2xlYXIgdGFuayBtZW1vcnkJCQkJKi8KKyNkZWZpbmUgVEFOS01FTUFERFJSRUdfQUxJR04JIDB4MDA0MDAwMDAJLyogQWxpZ24gcmVhZCBvciB3cml0ZSByZWxhdGl2ZSB0byB0YW5rIGFjY2VzcwkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19XUklURQkgMHgwMDIwMDAwMAkvKiBXcml0ZSB0byB0YW5rIG1lbW9yeQkJCQkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19SRUFECSAweDAwMTAwMDAwCS8qIFJlYWQgZnJvbSB0YW5rIG1lbW9yeQkJCSovCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBpbnRlcm5hbF90cmFtX3NpemU7CS8qIGluIHNhbXBsZXMgKi8KKwl1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfdHJhbV9zaXplOwkvKiBpbiBzYW1wbGVzICovCisJY2hhciBmeGJ1c19uYW1lc1sxNl1bMzJdOwkJLyogbmFtZXMgb2YgRlhCVVNlcyAqLworCWNoYXIgZXh0aW5fbmFtZXNbMTZdWzMyXTsJCS8qIG5hbWVzIG9mIGV4dGVybmFsIGlucHV0cyAqLworCWNoYXIgZXh0b3V0X25hbWVzWzMyXVszMl07CQkvKiBuYW1lcyBvZiBleHRlcm5hbCBvdXRwdXRzICovCisJdW5zaWduZWQgaW50IGdwcl9jb250cm9sczsJCS8qIGNvdW50IG9mIEdQUiBjb250cm9scyAqLworfSBlbXUxMGsxX2Z4ODAxMF9pbmZvX3Q7CisKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fTk9ORQkJMAorI2RlZmluZSBFTVUxMEsxX0dQUl9UUkFOU0xBVElPTl9UQUJMRTEwMAkxCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX0JBU1MJCTIKKyNkZWZpbmUgRU1VMTBLMV9HUFJfVFJBTlNMQVRJT05fVFJFQkxFCQkzCisjZGVmaW5lIEVNVTEwSzFfR1BSX1RSQU5TTEFUSU9OX09OT0ZGCQk0CisKK2VudW0gZW11MTBrMV9jdGxfZWxlbV9pZmFjZSB7CisJRU1VMTBLMV9DVExfRUxFTV9JRkFDRV9NSVhFUiA9IDIsCS8qIHZpcnR1YWwgbWl4ZXIgZGV2aWNlICovCisJRU1VMTBLMV9DVExfRUxFTV9JRkFDRV9QQ00gPSAzLAkJLyogUENNIGRldmljZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwYWQ7CQkvKiBkb24ndCB1c2UgKi8KKwlpbnQgaWZhY2U7CQkJLyogaW50ZXJmYWNlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBpbnQgZGV2aWNlOwkJLyogZGV2aWNlL2NsaWVudCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgc3ViZGV2aWNlOwkJLyogc3ViZGV2aWNlIChzdWJzdHJlYW0pIG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgbmFtZVs0NF07CQkvKiBBU0NJSSBuYW1lIG9mIGl0ZW0gKi8gCisJdW5zaWduZWQgaW50IGluZGV4OwkJLyogaW5kZXggb2YgaXRlbSAqLworfSBlbXUxMGsxX2N0bF9lbGVtX2lkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwllbXUxMGsxX2N0bF9lbGVtX2lkX3QgaWQ7CS8qIGZ1bGwgY29udHJvbCBJRCBkZWZpbml0aW9uICovCisJdW5zaWduZWQgaW50IHZjb3VudDsJCS8qIHZpc2libGUgY291bnQgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CQkvKiBjb3VudCBvZiBHUFIgKDEuLjE2KSAqLworCXVuc2lnbmVkIHNob3J0IGdwclszMl07CQkvKiBHUFIgbnVtYmVyKHMpICovCisJdW5zaWduZWQgaW50IHZhbHVlWzMyXTsJCS8qIGluaXRpYWwgdmFsdWVzICovCisJdW5zaWduZWQgaW50IG1pbjsJCS8qIG1pbmltdW0gcmFuZ2UgKi8KKwl1bnNpZ25lZCBpbnQgbWF4OwkJLyogbWF4aW11bSByYW5nZSAqLworCXVuc2lnbmVkIGludCB0cmFuc2xhdGlvbjsJLyogdHJhbnNsYXRpb24gdHlwZSAoRU1VMTBLMV9HUFJfVFJBTlNMQVRJT04qKSAqLworCXVuc2lnbmVkIGludCAqdGx2OworfSBlbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBuYW1lWzEyOF07CisKKwl1bnNpZ25lZCBsb25nIGdwcl92YWxpZFsweDIwMC8oc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjgpXTsgLyogYml0bWFzayBvZiB2YWxpZCBpbml0aWFsaXplcnMgKi8KKwl1aW50MzJfdCAqZ3ByX21hcDsJCSAgLyogaW5pdGlhbGl6ZXJzICovCisKKwl1bnNpZ25lZCBpbnQgZ3ByX2FkZF9jb250cm9sX2NvdW50OyAvKiBjb3VudCBvZiBHUFIgY29udHJvbHMgdG8gYWRkL3JlcGxhY2UgKi8KKwllbXUxMGsxX2Z4ODAxMF9jb250cm9sX2dwcl90ICpncHJfYWRkX2NvbnRyb2xzOyAvKiBHUFIgY29udHJvbHMgdG8gYWRkL3JlcGxhY2UgKi8KKworCXVuc2lnbmVkIGludCBncHJfZGVsX2NvbnRyb2xfY291bnQ7IC8qIGNvdW50IG9mIEdQUiBjb250cm9scyB0byByZW1vdmUgKi8KKwllbXUxMGsxX2N0bF9lbGVtX2lkX3QgKmdwcl9kZWxfY29udHJvbHM7IC8qIElEcyBvZiBHUFIgY29udHJvbHMgdG8gcmVtb3ZlICovCisKKwl1bnNpZ25lZCBpbnQgZ3ByX2xpc3RfY29udHJvbF9jb3VudDsgLyogY291bnQgb2YgR1BSIGNvbnRyb2xzIHRvIGxpc3QgKi8KKwl1bnNpZ25lZCBpbnQgZ3ByX2xpc3RfY29udHJvbF90b3RhbDsgLyogdG90YWwgY291bnQgb2YgR1BSIGNvbnRyb2xzICovCisJZW11MTBrMV9meDgwMTBfY29udHJvbF9ncHJfdCAqZ3ByX2xpc3RfY29udHJvbHM7IC8qIGxpc3RlZCBHUFIgY29udHJvbHMgKi8KKworCXVuc2lnbmVkIGxvbmcgdHJhbV92YWxpZFsweDEwMC8oc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjgpXTsgLyogYml0bWFzayBvZiB2YWxpZCBpbml0aWFsaXplcnMgKi8KKwl1aW50MzJfdCAqdHJhbV9kYXRhX21hcDsJLyogZGF0YSBpbml0aWFsaXplcnMgKi8KKwl1aW50MzJfdCAqdHJhbV9hZGRyX21hcDsJLyogbWFwIGluaXRpYWxpemVycyAqLworCisJdW5zaWduZWQgbG9uZyBjb2RlX3ZhbGlkWzEwMjQvKHNpemVvZih1bnNpZ25lZCBsb25nKSo4KV07ICAvKiBiaXRtYXNrIG9mIHZhbGlkIGluc3RydWN0aW9ucyAqLworCXVpbnQzMl90ICpjb2RlOwkJCS8qIG9uZSBpbnN0cnVjdGlvbiAtIDY0IGJpdHMgKi8KK30gZW11MTBrMV9meDgwMTBfY29kZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CQkvKiAzMS5iaXQgPT0gMSAtPiBleHRlcm5hbCBUUkFNICovCisJdW5zaWduZWQgaW50IHNpemU7CQkvKiBzaXplIGluIHNhbXBsZXMgKDQgYnl0ZXMpICovCisJdW5zaWduZWQgaW50ICpzYW1wbGVzOwkJLyogcG9pbnRlciB0byBzYW1wbGVzICgyMC1iaXQpICovCisJCQkJCS8qIE5VTEwtPmNsZWFyIG1lbW9yeSAqLworfSBlbXUxMGsxX2Z4ODAxMF90cmFtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgc3Vic3RyZWFtOwkJLyogc3Vic3RyZWFtIG51bWJlciAqLworCXVuc2lnbmVkIGludCByZXMxOwkJLyogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CQkvKiAxNi1iaXQgY2hhbm5lbHMgY291bnQsIHplcm8gPSByZW1vdmUgdGhpcyBzdWJzdHJlYW0gKi8KKwl1bnNpZ25lZCBpbnQgdHJhbV9zdGFydDsJLyogcmluZyBidWZmZXIgcG9zaXRpb24gaW4gVFJBTSAoaW4gc2FtcGxlcykgKi8KKwl1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7CS8qIGNvdW50IG9mIGJ1ZmZlcmVkIHNhbXBsZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfc2l6ZTsJCS8qIEdQUiBjb250YWluaW5nIHNpemUgb2YgcmluZ2J1ZmZlciBpbiBzYW1wbGVzIChob3N0KSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl9wdHI7CQkvKiBHUFIgY29udGFpbmluZyBjdXJyZW50IHBvaW50ZXIgaW4gdGhlIHJpbmcgYnVmZmVyIChob3N0ID0gcmVzZXQsIEZYODAxMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfY291bnQ7CS8qIEdQUiBjb250YWluaW5nIGNvdW50IG9mIHNhbXBsZXMgYmV0d2VlbiB0d28gaW50ZXJydXB0cyAoaG9zdCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfdG1wY291bnQ7CS8qIEdQUiBjb250YWluaW5nIGN1cnJlbnQgY291bnQgb2Ygc2FtcGxlcyB0byBpbnRlcnJ1cHQgKGhvc3QgPSBzZXQsIEZYODAxMCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBncHJfdHJpZ2dlcjsJLyogR1BSIGNvbnRhaW5pbmcgdHJpZ2dlciAoYWN0aXZhdGUpIGluZm9ybWF0aW9uIChob3N0KSAqLworCXVuc2lnbmVkIHNob3J0IGdwcl9ydW5uaW5nOwkvKiBHUFIgY29udGFpbmluZyBpbmZvIGlmIFBDTSBpcyBydW5uaW5nIChGWDgwMTApICovCisJdW5zaWduZWQgY2hhciBwYWQ7CQkvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIGNoYXIgZXRyYW1bMzJdOwkvKiBleHRlcm5hbCBUUkFNIGFkZHJlc3MgJiBkYXRhIChvbmUgcGVyIGNoYW5uZWwpICovCisJdW5zaWduZWQgaW50IHJlczI7CQkvKiByZXNlcnZlZCAqLworfSBlbXUxMGsxX2Z4ODAxMF9wY21fdDsKKworI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0lORk8JX0lPUiAoJ0gnLCAweDEwLCBlbXUxMGsxX2Z4ODAxMF9pbmZvX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfQ09ERV9QT0tFCV9JT1cgKCdIJywgMHgxMSwgZW11MTBrMV9meDgwMTBfY29kZV90KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPREVfUEVFSwlfSU9XUignSCcsIDB4MTIsIGVtdTEwazFfZng4MDEwX2NvZGVfdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1NFVFVQCV9JT1cgKCdIJywgMHgyMCwgaW50KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1RSQU1fUE9LRQlfSU9XICgnSCcsIDB4MjEsIGVtdTEwazFfZng4MDEwX3RyYW1fdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9UUkFNX1BFRUsJX0lPV1IoJ0gnLCAweDIyLCBlbXUxMGsxX2Z4ODAxMF90cmFtX3QpCisjZGVmaW5lIFNORFJWX0VNVTEwSzFfSU9DVExfUENNX1BPS0UJX0lPVyAoJ0gnLCAweDMwLCBlbXUxMGsxX2Z4ODAxMF9wY21fdCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9QQ01fUEVFSwlfSU9XUignSCcsIDB4MzEsIGVtdTEwazFfZng4MDEwX3BjbV90KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1BWRVJTSU9OCV9JT1IgKCdIJywgMHg0MCwgaW50KQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX1NUT1AJX0lPICAoJ0gnLCAweDgwKQorI2RlZmluZSBTTkRSVl9FTVUxMEsxX0lPQ1RMX0NPTlRJTlVFCV9JTyAgKCdIJywgMHg4MSkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9aRVJPX1RSQU1fQ09VTlRFUiBfSU8gKCdIJywgMHg4MikKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9TSU5HTEVfU1RFUAlfSU9XICgnSCcsIDB4ODMsIGludCkKKyNkZWZpbmUgU05EUlZfRU1VMTBLMV9JT0NUTF9EQkdfUkVBRAlfSU9SICgnSCcsIDB4ODQsIGludCkKKworI2VuZGlmCS8qIF9fU09VTkRfRU1VMTBLMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvaGRzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2hkc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmM5ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL2hkc3AuaApAQCAtMCwwICsxLDExMiBAQAorI2lmbmRlZiBfX1NPVU5EX0hEU1BfSAorI2RlZmluZSBfX1NPVU5EX0hEU1BfSAorCisvKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDMgVGhvbWFzIENoYXJib25uZWwgKHRob21hc0B1bmRhdGEub3JnKQorICogICAgCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEhEU1BfTUFUUklYX01JWEVSX1NJWkUgMjA0OAorCit0eXBlZGVmIGVudW0geworCURpZ2lmYWNlLAorCU11bHRpZmFjZSwKKwlIOTY1MiwKKwlIOTYzMiwKKwlVbmRlZmluZWQsCit9IEhEU1BfSU9fVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oZHNwX3BlYWtfcm1zIGhkc3BfcGVha19ybXNfdDsKKworc3RydWN0IF9zbmRfaGRzcF9wZWFrX3JtcyB7CisJdWludDMyX3QgaW5wdXRfcGVha3NbMjZdOworCXVpbnQzMl90IHBsYXliYWNrX3BlYWtzWzI2XTsKKwl1aW50MzJfdCBvdXRwdXRfcGVha3NbMjhdOworCXVpbnQ2NF90IGlucHV0X3Jtc1syNl07CisJdWludDY0X3QgcGxheWJhY2tfcm1zWzI2XTsKKwkvKiBUaGVzZSBhcmUgb25seSB1c2VkIGZvciBIOTZ4eCBjYXJkcyAqLworCXVpbnQ2NF90IG91dHB1dF9ybXNbMjZdOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9QRUFLX1JNUyBfSU9SKCdIJywgMHg0MCwgaGRzcF9wZWFrX3Jtc190KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfY29uZmlnX2luZm8gaGRzcF9jb25maWdfaW5mb190OworCitzdHJ1Y3QgX3NuZF9oZHNwX2NvbmZpZ19pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIHByZWZfc3luY19yZWY7CisJdW5zaWduZWQgY2hhciB3b3JkY2xvY2tfc3luY19jaGVjazsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX3N5bmNfY2hlY2s7CisJdW5zaWduZWQgY2hhciBhZGF0c3luY19zeW5jX2NoZWNrOworCXVuc2lnbmVkIGNoYXIgYWRhdF9zeW5jX2NoZWNrWzNdOworCXVuc2lnbmVkIGNoYXIgc3BkaWZfaW47CisJdW5zaWduZWQgY2hhciBzcGRpZl9vdXQ7CisJdW5zaWduZWQgY2hhciBzcGRpZl9wcm9mZXNzaW9uYWw7CisJdW5zaWduZWQgY2hhciBzcGRpZl9lbXBoYXNpczsKKwl1bnNpZ25lZCBjaGFyIHNwZGlmX25vbmF1ZGlvOworCXVuc2lnbmVkIGludCBzcGRpZl9zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3lzdGVtX3NhbXBsZV9yYXRlOworCXVuc2lnbmVkIGludCBhdXRvc3luY19zYW1wbGVfcmF0ZTsKKwl1bnNpZ25lZCBjaGFyIHN5c3RlbV9jbG9ja19tb2RlOworCXVuc2lnbmVkIGNoYXIgY2xvY2tfc291cmNlOworCXVuc2lnbmVkIGNoYXIgYXV0b3N5bmNfcmVmOworCXVuc2lnbmVkIGNoYXIgbGluZV9vdXQ7CisJdW5zaWduZWQgY2hhciBwYXNzdGhydTsgCisJdW5zaWduZWQgY2hhciBkYV9nYWluOworCXVuc2lnbmVkIGNoYXIgYWRfZ2FpbjsKKwl1bnNpZ25lZCBjaGFyIHBob25lX2dhaW47CisJdW5zaWduZWQgY2hhciB4bHJfYnJlYWtvdXRfY2FibGU7CisJdW5zaWduZWQgY2hhciBhbmFsb2dfZXh0ZW5zaW9uX2JvYXJkOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9DT05GSUdfSU5GTyBfSU9SKCdIJywgMHg0MSwgaGRzcF9jb25maWdfaW5mb190KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfZmlybXdhcmUgaGRzcF9maXJtd2FyZV90OworCitzdHJ1Y3QgX3NuZF9oZHNwX2Zpcm13YXJlIHsKKwl2b2lkICpmaXJtd2FyZV9kYXRhOwkvKiAyNDQxMyB4IDQgYnl0ZXMgKi8KK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9VUExPQURfRklSTVdBUkUgX0lPVygnSCcsIDB4NDIsIGhkc3BfZmlybXdhcmVfdCkKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oZHNwX3ZlcnNpb24gaGRzcF92ZXJzaW9uX3Q7CisKK3N0cnVjdCBfc25kX2hkc3BfdmVyc2lvbiB7CisJSERTUF9JT19UeXBlIGlvX3R5cGU7CisJdW5zaWduZWQgc2hvcnQgZmlybXdhcmVfcmV2OworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9WRVJTSU9OIF9JT1IoJ0gnLCAweDQzLCBoZHNwX3ZlcnNpb25fdCkKKwordHlwZWRlZiBzdHJ1Y3QgX3NuZF9oZHNwX21peGVyIGhkc3BfbWl4ZXJfdDsKKworc3RydWN0IF9zbmRfaGRzcF9taXhlciB7CisJdW5zaWduZWQgc2hvcnQgbWF0cml4W0hEU1BfTUFUUklYX01JWEVSX1NJWkVdOworfTsKKworI2RlZmluZSBTTkRSVl9IRFNQX0lPQ1RMX0dFVF9NSVhFUiBfSU9SKCdIJywgMHg0NCwgaGRzcF9taXhlcl90KQorCit0eXBlZGVmIHN0cnVjdCBfc25kX2hkc3BfOTYzMl9hZWIgaGRzcF85NjMyX2FlYl90OworCitzdHJ1Y3QgX3NuZF9oZHNwXzk2MzJfYWViIHsKKwlpbnQgYWViaTsKKwlpbnQgYWVibzsKK307CisKKyNkZWZpbmUgU05EUlZfSERTUF9JT0NUTF9HRVRfOTYzMl9BRUIgX0lPUignSCcsIDB4NDUsIGhkc3BfOTYzMl9hZWJfdCkKKworI2VuZGlmIC8qIF9fU09VTkRfSERTUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvc2IxNl9jc3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9zYjE2X2NzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODE3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvc2IxNl9jc3AuaApAQCAtMCwwICsxLDExNSBAQAorI2lmbmRlZiBfX1NPVU5EX1NCMTZfQ1NQX0gKKyNkZWZpbmUgX19TT1VORF9TQjE2X0NTUF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IFVyb3MgQml6amFrIDx1cm9zQGtzcy1sb2thLnNpPgorICogICAgICAgICAgICAgICAgICAgICAgICBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CisgKgorICogIFNCMTZBU1AvQVdFMzIgQ1NQIGNvbnRyb2wKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IAorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvKiBDU1AgbW9kZXMgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PREVfTk9ORQkJMHgwMAorI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfUkVBRAkweDAxCS8qIFJlY29yZCBmcm9tIERTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9EU1BfV1JJVEUJMHgwMgkvKiBQbGF5IHRvIERTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTU9ERV9RU09VTkQJCTB4MDQJLyogUVNvdW5kICovCisKKy8qIENTUCBsb2FkIGZsYWdzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9MT0FEX0ZST01VU0VSCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0xPQURfSU5JVEJMT0NLCTB4MDIKKworLyogQ1NQIHNhbXBsZSB3aWR0aCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfU0FNUExFXzhCSVQJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NBTVBMRV8xNkJJVAkJMHgwMgorCisvKiBDU1AgY2hhbm5lbHMgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX01PTk8JCQkweDAxCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVEVSRU8JCTB4MDIKKworLyogQ1NQIHJhdGVzICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9SQVRFXzgwMDAJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfMTEwMjUJCTB4MDIKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfMjIwNTAJCTB4MDQKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfNDQxMDAJCTB4MDgKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1JBVEVfQUxMCQkweDBmCisKKy8qIENTUCBydW5uaW5nIHN0YXRlICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9JRExFCQkweDAwCisjZGVmaW5lIFNORFJWX1NCX0NTUF9TVF9MT0FERUQJCTB4MDEKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX1JVTk5JTkcJCTB4MDIKKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1NUX1BBVVNFRAkJMHgwNAorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfQVVUTwkJMHgwOAorI2RlZmluZSBTTkRSVl9TQl9DU1BfU1RfUVNPVU5ECQkweDEwCisKKy8qIG1heGltdW0gUVNvdW5kIHZhbHVlICgxODAgZGVncmVlcyByaWdodCkgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX1FTT1VORF9NQVhfUklHSFQJMHgyMAorCisvKiBtYXhpbXVtIG1pY3JvY29kZSBSSUZGIGZpbGUgc2l6ZSAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfTUFYX01JQ1JPQ09ERV9GSUxFX1NJWkUJMHgzMDAwCisKKy8qIG1pY3JvY29kZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNuZF9zYl9jc3BfbWNfaGVhZGVyIHsKKwljaGFyIGNvZGVjX25hbWVbMTZdOwkJLyogaWQgbmFtZSBvZiBjb2RlYyAqLworCXVuc2lnbmVkIHNob3J0IGZ1bmNfcmVxOwkvKiByZXF1ZXN0ZWQgZnVuY3Rpb24gKi8KK30gc25kX3NiX2NzcF9tY19oZWFkZXJfdDsKKworLyogbWljcm9jb2RlIHRvIGJlIGxvYWRlZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NiX2NzcF9taWNyb2NvZGUgeworCXNuZF9zYl9jc3BfbWNfaGVhZGVyX3QgaW5mbzsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbU05EUlZfU0JfQ1NQX01BWF9NSUNST0NPREVfRklMRV9TSVpFXTsKK30gc25kX3NiX2NzcF9taWNyb2NvZGVfdDsKKworLyogc3RhcnQgQ1NQIHdpdGggc2FtcGxlX3dpZHRoIGluIG1vbm8vc3RlcmVvICovCit0eXBlZGVmIHN0cnVjdCBzbmRfc2JfY3NwX3N0YXJ0IHsKKwlpbnQgc2FtcGxlX3dpZHRoOwkvKiBzYW1wbGUgd2lkdGgsIGxvb2sgYWJvdmUgKi8KKwlpbnQgY2hhbm5lbHM7CQkvKiBjaGFubmVscywgbG9vayBhYm92ZSAqLworfSBzbmRfc2JfY3NwX3N0YXJ0X3Q7CisKKy8qIENTUCBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3Qgc25kX3NiX2NzcF9pbmZvIHsKKwljaGFyIGNvZGVjX25hbWVbMTZdOwkJLyogaWQgbmFtZSBvZiBjb2RlYyAqLworCXVuc2lnbmVkIHNob3J0IGZ1bmNfbnI7CQkvKiBmdW5jdGlvbiBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgYWNjX2Zvcm1hdDsJLyogYWNjZXB0ZWQgUENNIGZvcm1hdHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBhY2NfY2hhbm5lbHM7CS8qIGFjY2VwdGVkIGNoYW5uZWxzICovCisJdW5zaWduZWQgc2hvcnQgYWNjX3dpZHRoOwkvKiBhY2NlcHRlZCBzYW1wbGUgd2lkdGggKi8KKwl1bnNpZ25lZCBzaG9ydCBhY2NfcmF0ZXM7CS8qIGFjY2VwdGVkIHNhbXBsZSByYXRlcyAqLworCXVuc2lnbmVkIHNob3J0IGNzcF9tb2RlOwkvKiBDU1AgbW9kZSwgc2VlIGFib3ZlICovCisJdW5zaWduZWQgc2hvcnQgcnVuX2NoYW5uZWxzOwkvKiBjdXJyZW50IGNoYW5uZWxzICAqLworCXVuc2lnbmVkIHNob3J0IHJ1bl93aWR0aDsJLyogY3VycmVudCBzYW1wbGUgd2lkdGggKi8KKwl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwkJLyogdmVyc2lvbiBpZDogMHgxMCAtIDB4MWYgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGF0ZTsJCS8qIHN0YXRlIGJpdHMgKi8KK30gc25kX3NiX2NzcF9pbmZvX3Q7CisKKy8qIEhXREVQIGNvbnRyb2xzICovCisvKiBnZXQgQ1NQIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9JTkZPCQlfSU9SKCdIJywgMHgxMCwgc25kX3NiX2NzcF9pbmZvX3QpCisvKiBsb2FkIG1pY3JvY29kZSB0byBDU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX0xPQURfQ09ERQlfSU9XKCdIJywgMHgxMSwgc25kX3NiX2NzcF9taWNyb2NvZGVfdCkKKy8qIHVubG9hZCBtaWNyb2NvZGUgZnJvbSBDU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1VOTE9BRF9DT0RFCV9JTygnSCcsIDB4MTIpCisvKiBzdGFydCBDU1AgKi8KKyNkZWZpbmUgU05EUlZfU0JfQ1NQX0lPQ1RMX1NUQVJUCV9JT1coJ0gnLCAweDEzLCBzbmRfc2JfY3NwX3N0YXJ0X3QpCisvKiBzdG9wIENTUCAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfU1RPUAkJX0lPKCdIJywgMHgxNCkKKy8qIHBhdXNlIENTUCBhbmQgRE1BIHRyYW5zZmVyICovCisjZGVmaW5lIFNORFJWX1NCX0NTUF9JT0NUTF9QQVVTRQlfSU8oJ0gnLCAweDE1KQorLyogcmVzdGFydCBDU1AgYW5kIERNQSB0cmFuc2ZlciAqLworI2RlZmluZSBTTkRSVl9TQl9DU1BfSU9DVExfUkVTVEFSVAlfSU8oJ0gnLCAweDE2KQorCisKKyNlbmRpZiAvKiBfX1NPVU5EX1NCMTZfQ1NQICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvc3NjYXBlX2lvY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2Evc291bmQvc3NjYXBlX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2NTNlYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC9zc2NhcGVfaW9jdGwuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIFNTQ0FQRV9JT0NUTF9ICisjZGVmaW5lIFNTQ0FQRV9JT0NUTF9ICisKKworc3RydWN0IHNzY2FwZV9ib290YmxvY2sKK3sKKyAgdW5zaWduZWQgY2hhciBjb2RlWzI1Nl07CisgIHVuc2lnbmVkIHZlcnNpb247Cit9OworCisjZGVmaW5lIFNTQ0FQRV9NSUNST0NPREVfU0laRSAgNjU1MzYKKworc3RydWN0IHNzY2FwZV9taWNyb2NvZGUKK3sKKyAgdW5zaWduZWQgY2hhciAqY29kZTsKK307CisKKyNkZWZpbmUgU05EX1NTQ0FQRV9MT0FEX0JPT1RCICBfSU9XUignUCcsIDEwMCwgc3RydWN0IHNzY2FwZV9ib290YmxvY2spCisjZGVmaW5lIFNORF9TU0NBUEVfTE9BRF9NQ09ERSAgX0lPVyAoJ1AnLCAxMDEsIHN0cnVjdCBzc2NhcGVfbWljcm9jb2RlKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC90eXBlX2NvbXBhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3NvdW5kL3R5cGVfY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjODZlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYWxzYS9zb3VuZC90eXBlX2NvbXBhdC5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX19UWVBFX0NPTVBBVF9ICisjZGVmaW5lIF9fVFlQRV9DT01QQVRfSAorCisjaWZuZGVmIERPQ19ISURERU4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgdWludDhfdCBfX3U4OwordHlwZWRlZiB1aW50MTZfdCBfX3UxNjsKK3R5cGVkZWYgdWludDMyX3QgX191MzI7Cit0eXBlZGVmIGludDhfdCBfX3M4OwordHlwZWRlZiBpbnQxNl90IF9fczE2OwordHlwZWRlZiBpbnQzMl90IF9fczMyOworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgKHgpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgYnN3YXBfMzIoeCkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoeCkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSBic3dhcF8xNih4KQorI2Vsc2UKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSBic3dhcF8zMih4KQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpICh4KQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpIGJzd2FwXzE2KHgpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKHgpCisjZW5kaWYKKworI2RlZmluZSBfX2xlMzJfdG9fY3B1IF9fY3B1X3RvX2xlMzIKKyNkZWZpbmUgX19iZTMyX3RvX2NwdSBfX2NwdV90b19iZTMyCisjZGVmaW5lIF9fbGUxNl90b19jcHUgX19jcHVfdG9fbGUxNgorI2RlZmluZSBfX2JlMTZfdG9fY3B1IF9fY3B1X3RvX2JlMTYKKworI2RlZmluZSBfX2xlNjQgX191NjQKKyNkZWZpbmUgX19sZTMyIF9fdTMyCisjZGVmaW5lIF9fbGUxNiBfX3UxNgorI2RlZmluZSBfX2JlNjQgX191NjQKKyNkZWZpbmUgX19iZTMyIF9fdTMyCisjZGVmaW5lIF9fYmUxNiBfX3UxNgorI2VuZGlmIC8qIERPQ19ISURERU4gKi8KKworI2VuZGlmIC8qIF9fVFlQRV9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3RpbWVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjZhMThkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3RpbWVyLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8qKgorICogXGZpbGUgaW5jbHVkZS90aW1lci5oCisgKiBcYnJpZWYgQXBwbGljYXRpb24gaW50ZXJmYWNlIGxpYnJhcnkgZm9yIHRoZSBBTFNBIGRyaXZlcgorICogXGF1dGhvciBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PgorICogXGF1dGhvciBBYnJhbW8gQmFnbmFyYSA8YWJyYW1vQGFsc2EtcHJvamVjdC5vcmc+CisgKiBcYXV0aG9yIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqIFxkYXRlIDE5OTgtMjAwMQorICoKKyAqIEFwcGxpY2F0aW9uIGludGVyZmFjZSBsaWJyYXJ5IGZvciB0aGUgQUxTQSBkcml2ZXIKKyAqLworLyoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fQUxTQV9USU1FUl9ICisjZGVmaW5lIF9fQUxTQV9USU1FUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiAgXGRlZmdyb3VwIFRpbWVyIFRpbWVyIEludGVyZmFjZQorICogIFRpbWVyIEludGVyZmFjZS4gU2VlIFxyZWYgdGltZXIgcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFx7CisgKi8KKworLyoqIGRsc3ltIHZlcnNpb24gZm9yIGludGVyZmFjZSBlbnRyeSBjYWxsYmFjayAqLworI2RlZmluZSBTTkRfVElNRVJfRExTWU1fVkVSU0lPTgkJX2Rsc3ltX3RpbWVyXzAwMQorLyoqIGRsc3ltIHZlcnNpb24gZm9yIGludGVyZmFjZSBlbnRyeSBjYWxsYmFjayAqLworI2RlZmluZSBTTkRfVElNRVJfUVVFUllfRExTWU1fVkVSU0lPTglfZGxzeW1fdGltZXJfcXVlcnlfMDAxCisKKy8qKiB0aW1lciBpZGVudGlmaWNhdGlvbiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfaWQgc25kX3RpbWVyX2lkX3Q7CisvKiogdGltZXIgZ2xvYmFsIGluZm8gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX2dpbmZvIHNuZF90aW1lcl9naW5mb190OworLyoqIHRpbWVyIGdsb2JhbCBwYXJhbXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX2dwYXJhbXMgc25kX3RpbWVyX2dwYXJhbXNfdDsKKy8qKiB0aW1lciBnbG9iYWwgc3RhdHVzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9nc3RhdHVzIHNuZF90aW1lcl9nc3RhdHVzX3Q7CisvKiogdGltZXIgaW5mbyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfaW5mbyBzbmRfdGltZXJfaW5mb190OworLyoqIHRpbWVyIHBhcmFtcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfcGFyYW1zIHNuZF90aW1lcl9wYXJhbXNfdDsKKy8qKiB0aW1lciBzdGF0dXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX3N0YXR1cyBzbmRfdGltZXJfc3RhdHVzX3Q7CisvKiogdGltZXIgbWFzdGVyIGNsYXNzICovCit0eXBlZGVmIGVudW0gX3NuZF90aW1lcl9jbGFzcyB7CisJU05EX1RJTUVSX0NMQVNTX05PTkUgPSAtMSwJLyoqPCBpbnZhbGlkICovCisJU05EX1RJTUVSX0NMQVNTX1NMQVZFID0gMCwJLyoqPCBzbGF2ZSB0aW1lciAqLworCVNORF9USU1FUl9DTEFTU19HTE9CQUwsCQkvKio8IGdsb2JhbCB0aW1lciAqLworCVNORF9USU1FUl9DTEFTU19DQVJELAkJLyoqPCBjYXJkIHRpbWVyICovCisJU05EX1RJTUVSX0NMQVNTX1BDTSwJCS8qKjwgUENNIHRpbWVyICovCisJU05EX1RJTUVSX0NMQVNTX0xBU1QgPSBTTkRfVElNRVJfQ0xBU1NfUENNCS8qKjwgbGFzdCB0aW1lciAqLworfSBzbmRfdGltZXJfY2xhc3NfdDsKKworLyoqIHRpbWVyIHNsYXZlIGNsYXNzICovCit0eXBlZGVmIGVudW0gX3NuZF90aW1lcl9zbGF2ZV9jbGFzcyB7CisJU05EX1RJTUVSX1NDTEFTU19OT05FID0gMCwJCS8qKjwgbm9uZSAqLworCVNORF9USU1FUl9TQ0xBU1NfQVBQTElDQVRJT04sCQkvKio8IGZvciBpbnRlcm5hbCB1c2UgKi8KKwlTTkRfVElNRVJfU0NMQVNTX1NFUVVFTkNFUiwJCS8qKjwgc2VxdWVuY2VyIHRpbWVyICovCisJU05EX1RJTUVSX1NDTEFTU19PU1NfU0VRVUVOQ0VSLAkJLyoqPCBPU1Mgc2VxdWVuY2VyIHRpbWVyICovCisJU05EX1RJTUVSX1NDTEFTU19MQVNUID0gU05EX1RJTUVSX1NDTEFTU19PU1NfU0VRVUVOQ0VSCS8qKjwgbGFzdCBzbGF2ZSB0aW1lciAqLworfSBzbmRfdGltZXJfc2xhdmVfY2xhc3NfdDsKKworLyoqIHRpbWVyIHJlYWQgZXZlbnQgaWRlbnRpZmljYXRpb24gKi8KK3R5cGVkZWYgZW51bSBfc25kX3RpbWVyX2V2ZW50IHsKKwlTTkRfVElNRVJfRVZFTlRfUkVTT0xVVElPTiA9IDAsCS8qIHZhbCA9IHJlc29sdXRpb24gaW4gbnMgKi8KKwlTTkRfVElNRVJfRVZFTlRfVElDSywJCS8qIHZhbCA9IHRpY2tzICovCisJU05EX1RJTUVSX0VWRU5UX1NUQVJULAkJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCVNORF9USU1FUl9FVkVOVF9TVE9QLAkJLyogdmFsID0gMCAqLworCVNORF9USU1FUl9FVkVOVF9DT05USU5VRSwJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCVNORF9USU1FUl9FVkVOVF9QQVVTRSwJCS8qIHZhbCA9IDAgKi8KKwlTTkRfVElNRVJfRVZFTlRfRUFSTFksCQkvKiB2YWwgPSAwICovCisJU05EX1RJTUVSX0VWRU5UX1NVU1BFTkQsCS8qIHZhbCA9IDAgKi8KKwlTTkRfVElNRVJfRVZFTlRfUkVTVU1FLAkJLyogdmFsID0gcmVzb2x1dGlvbiBpbiBucyAqLworCS8qIG1hc3RlciB0aW1lciBldmVudHMgZm9yIHNsYXZlIHRpbWVyIGluc3RhbmNlcyAqLworCVNORF9USU1FUl9FVkVOVF9NU1RBUlQgPSBTTkRfVElNRVJfRVZFTlRfU1RBUlQgKyAxMCwKKwlTTkRfVElNRVJfRVZFTlRfTVNUT1AgPSBTTkRfVElNRVJfRVZFTlRfU1RPUCArIDEwLAorCVNORF9USU1FUl9FVkVOVF9NQ09OVElOVUUgPSBTTkRfVElNRVJfRVZFTlRfQ09OVElOVUUgKyAxMCwKKwlTTkRfVElNRVJfRVZFTlRfTVBBVVNFID0gU05EX1RJTUVSX0VWRU5UX1BBVVNFICsgMTAsCisJU05EX1RJTUVSX0VWRU5UX01TVVNQRU5EID0gU05EX1RJTUVSX0VWRU5UX1NVU1BFTkQgKyAxMCwKKwlTTkRfVElNRVJfRVZFTlRfTVJFU1VNRSA9IFNORF9USU1FUl9FVkVOVF9SRVNVTUUgKyAxMAkKK30gc25kX3RpbWVyX2V2ZW50X3Q7CisKKy8qKiB0aW1lciByZWFkIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lcl9yZWFkIHsKKwl1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbjsJLyoqPCB0aWNrIHJlc29sdXRpb24gaW4gbmFub3NlY29uZHMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHRpY2tzOwkJLyoqPCBjb3VudCBvZiBoYXBwZW5lZCB0aWNrcyAqLworfSBzbmRfdGltZXJfcmVhZF90OworCisvKiogdGltZXIgdHN0YW1wICsgZXZlbnQgcmVhZCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9zbmRfdGltZXJfdHJlYWQgeworCXNuZF90aW1lcl9ldmVudF90IGV2ZW50OwkvKio8IFRpbWVyIGV2ZW50ICovCisJc25kX2h0aW1lc3RhbXBfdCB0c3RhbXA7CS8qKjwgVGltZSBzdGFtcCBvZiBlYWNoIGV2ZW50ICovCisJdW5zaWduZWQgaW50IHZhbDsJCS8qKjwgRXZlbnQgdmFsdWUgKi8KK30gc25kX3RpbWVyX3RyZWFkX3Q7CisKKy8qKiBnbG9iYWwgdGltZXIgLSBzeXN0ZW0gKi8KKyNkZWZpbmUgU05EX1RJTUVSX0dMT0JBTF9TWVNURU0gMAorLyoqIGdsb2JhbCB0aW1lciAtIFJUQyAqLworI2RlZmluZSBTTkRfVElNRVJfR0xPQkFMX1JUQyAJMQorLyoqIGdsb2JhbCB0aW1lciAtIEhQRVQgKi8KKyNkZWZpbmUgU05EX1RJTUVSX0dMT0JBTF9IUEVUCTIKKworLyoqIHRpbWVyIG9wZW4gbW9kZSBmbGFnIC0gbm9uLWJsb2NraW5nIGJlaGF2aW91ciAqLworI2RlZmluZSBTTkRfVElNRVJfT1BFTl9OT05CTE9DSwkJKDE8PDApCisvKiogdXNlIHRpbWVzdGFtcHMgYW5kIGV2ZW50IG5vdGlmaWNhdGlvbiAtIGVuaGFuY2VkIHJlYWQgKi8KKyNkZWZpbmUgU05EX1RJTUVSX09QRU5fVFJFQUQJCSgxPDwxKQorCisvKiogdGltZXIgaGFuZGxlIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBfc25kX3RpbWVyX3R5cGUgeworCS8qKiBLZXJuZWwgbGV2ZWwgSHdEZXAgKi8KKwlTTkRfVElNRVJfVFlQRV9IVyA9IDAsCisJLyoqIFNoYXJlZCBtZW1vcnkgY2xpZW50IHRpbWVyIChub3QgeWV0IGltcGxlbWVudGVkKSAqLworCVNORF9USU1FUl9UWVBFX1NITSwKKwkvKiogSU5FVCBjbGllbnQgdGltZXIgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpICovCisJU05EX1RJTUVSX1RZUEVfSU5FVAorfSBzbmRfdGltZXJfdHlwZV90OworCisvKiogdGltZXIgcXVlcnkgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBfc25kX3RpbWVyX3F1ZXJ5IHNuZF90aW1lcl9xdWVyeV90OworLyoqIHRpbWVyIGhhbmRsZSAqLwordHlwZWRlZiBzdHJ1Y3QgX3NuZF90aW1lciBzbmRfdGltZXJfdDsKKworCitpbnQgc25kX3RpbWVyX3F1ZXJ5X29wZW4oc25kX3RpbWVyX3F1ZXJ5X3QgKipoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfb3Blbl9sY29uZihzbmRfdGltZXJfcXVlcnlfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUsIHNuZF9jb25maWdfdCAqbGNvbmYpOworaW50IHNuZF90aW1lcl9xdWVyeV9jbG9zZShzbmRfdGltZXJfcXVlcnlfdCAqaGFuZGxlKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfbmV4dF9kZXZpY2Uoc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2lkX3QgKnRpZCk7CitpbnQgc25kX3RpbWVyX3F1ZXJ5X2luZm8oc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2dpbmZvX3QgKmluZm8pOworaW50IHNuZF90aW1lcl9xdWVyeV9wYXJhbXMoc25kX3RpbWVyX3F1ZXJ5X3QgKmhhbmRsZSwgc25kX3RpbWVyX2dwYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfdGltZXJfcXVlcnlfc3RhdHVzKHNuZF90aW1lcl9xdWVyeV90ICpoYW5kbGUsIHNuZF90aW1lcl9nc3RhdHVzX3QgKnN0YXR1cyk7CisKK2ludCBzbmRfdGltZXJfb3BlbihzbmRfdGltZXJfdCAqKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUpOworaW50IHNuZF90aW1lcl9vcGVuX2xjb25mKHNuZF90aW1lcl90ICoqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgc25kX2NvbmZpZ190ICpsY29uZik7CitpbnQgc25kX3RpbWVyX2Nsb3NlKHNuZF90aW1lcl90ICpoYW5kbGUpOworaW50IHNuZF9hc3luY19hZGRfdGltZXJfaGFuZGxlcihzbmRfYXN5bmNfaGFuZGxlcl90ICoqaGFuZGxlciwgc25kX3RpbWVyX3QgKnRpbWVyLAorCQkJCXNuZF9hc3luY19jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICpwcml2YXRlX2RhdGEpOworc25kX3RpbWVyX3QgKnNuZF9hc3luY19oYW5kbGVyX2dldF90aW1lcihzbmRfYXN5bmNfaGFuZGxlcl90ICpoYW5kbGVyKTsKK2ludCBzbmRfdGltZXJfcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfdGltZXJfdCAqaGFuZGxlKTsKK2ludCBzbmRfdGltZXJfcG9sbF9kZXNjcmlwdG9ycyhzbmRfdGltZXJfdCAqaGFuZGxlLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpOworaW50IHNuZF90aW1lcl9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX3RpbWVyX3QgKnRpbWVyLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF90aW1lcl9pbmZvKHNuZF90aW1lcl90ICpoYW5kbGUsIHNuZF90aW1lcl9pbmZvX3QgKnRpbWVyKTsKK2ludCBzbmRfdGltZXJfcGFyYW1zKHNuZF90aW1lcl90ICpoYW5kbGUsIHNuZF90aW1lcl9wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfdGltZXJfc3RhdHVzKHNuZF90aW1lcl90ICpoYW5kbGUsIHNuZF90aW1lcl9zdGF0dXNfdCAqc3RhdHVzKTsKK2ludCBzbmRfdGltZXJfc3RhcnQoc25kX3RpbWVyX3QgKmhhbmRsZSk7CitpbnQgc25kX3RpbWVyX3N0b3Aoc25kX3RpbWVyX3QgKmhhbmRsZSk7CitpbnQgc25kX3RpbWVyX2NvbnRpbnVlKHNuZF90aW1lcl90ICpoYW5kbGUpOworc3NpemVfdCBzbmRfdGltZXJfcmVhZChzbmRfdGltZXJfdCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKKworc2l6ZV90IHNuZF90aW1lcl9pZF9zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF90aW1lcl9pZF90IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfdGltZXJfaWRfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfdGltZXJfaWRfdCAqKSBhbGxvY2Eoc25kX3RpbWVyX2lkX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIHNuZF90aW1lcl9pZF9zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3RpbWVyX2lkX21hbGxvYyhzbmRfdGltZXJfaWRfdCAqKnB0cik7Cit2b2lkIHNuZF90aW1lcl9pZF9mcmVlKHNuZF90aW1lcl9pZF90ICpvYmopOwordm9pZCBzbmRfdGltZXJfaWRfY29weShzbmRfdGltZXJfaWRfdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfaWRfdCAqc3JjKTsKKwordm9pZCBzbmRfdGltZXJfaWRfc2V0X2NsYXNzKHNuZF90aW1lcl9pZF90ICppZCwgaW50IGRldl9jbGFzcyk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9jbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQpOwordm9pZCBzbmRfdGltZXJfaWRfc2V0X3NjbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQsIGludCBkZXZfc2NsYXNzKTsKK2ludCBzbmRfdGltZXJfaWRfZ2V0X3NjbGFzcyhzbmRfdGltZXJfaWRfdCAqaWQpOwordm9pZCBzbmRfdGltZXJfaWRfc2V0X2NhcmQoc25kX3RpbWVyX2lkX3QgKmlkLCBpbnQgY2FyZCk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9jYXJkKHNuZF90aW1lcl9pZF90ICppZCk7Cit2b2lkIHNuZF90aW1lcl9pZF9zZXRfZGV2aWNlKHNuZF90aW1lcl9pZF90ICppZCwgaW50IGRldmljZSk7CitpbnQgc25kX3RpbWVyX2lkX2dldF9kZXZpY2Uoc25kX3RpbWVyX2lkX3QgKmlkKTsKK3ZvaWQgc25kX3RpbWVyX2lkX3NldF9zdWJkZXZpY2Uoc25kX3RpbWVyX2lkX3QgKmlkLCBpbnQgc3ViZGV2aWNlKTsKK2ludCBzbmRfdGltZXJfaWRfZ2V0X3N1YmRldmljZShzbmRfdGltZXJfaWRfdCAqaWQpOworCitzaXplX3Qgc25kX3RpbWVyX2dpbmZvX3NpemVvZih2b2lkKTsKKy8qKiBhbGxvY2F0ZSAjc25kX3RpbWVyX2dpbmZvX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9naW5mb19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF90aW1lcl9naW5mb190ICopIGFsbG9jYShzbmRfdGltZXJfZ2luZm9fc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3RpbWVyX2dpbmZvX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfdGltZXJfZ2luZm9fbWFsbG9jKHNuZF90aW1lcl9naW5mb190ICoqcHRyKTsKK3ZvaWQgc25kX3RpbWVyX2dpbmZvX2ZyZWUoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7Cit2b2lkIHNuZF90aW1lcl9naW5mb19jb3B5KHNuZF90aW1lcl9naW5mb190ICpkc3QsIGNvbnN0IHNuZF90aW1lcl9naW5mb190ICpzcmMpOworCitpbnQgc25kX3RpbWVyX2dpbmZvX3NldF90aWQoc25kX3RpbWVyX2dpbmZvX3QgKm9iaiwgc25kX3RpbWVyX2lkX3QgKnRpZCk7CitzbmRfdGltZXJfaWRfdCAqc25kX3RpbWVyX2dpbmZvX2dldF90aWQoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3RpbWVyX2dpbmZvX2dldF9mbGFncyhzbmRfdGltZXJfZ2luZm9fdCAqb2JqKTsKK2ludCBzbmRfdGltZXJfZ2luZm9fZ2V0X2NhcmQoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7CitjaGFyICpzbmRfdGltZXJfZ2luZm9fZ2V0X2lkKHNuZF90aW1lcl9naW5mb190ICpvYmopOworY2hhciAqc25kX3RpbWVyX2dpbmZvX2dldF9uYW1lKHNuZF90aW1lcl9naW5mb190ICpvYmopOwordW5zaWduZWQgbG9uZyBzbmRfdGltZXJfZ2luZm9fZ2V0X3Jlc29sdXRpb24oc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBsb25nIHNuZF90aW1lcl9naW5mb19nZXRfcmVzb2x1dGlvbl9taW4oc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBsb25nIHNuZF90aW1lcl9naW5mb19nZXRfcmVzb2x1dGlvbl9tYXgoc25kX3RpbWVyX2dpbmZvX3QgKm9iaik7Cit1bnNpZ25lZCBpbnQgc25kX3RpbWVyX2dpbmZvX2dldF9jbGllbnRzKHNuZF90aW1lcl9naW5mb190ICpvYmopOworCitzaXplX3Qgc25kX3RpbWVyX2luZm9fc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfdGltZXJfaW5mb190IGNvbnRhaW5lciBvbiBzdGFjayAqLworI2RlZmluZSBzbmRfdGltZXJfaW5mb19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF90aW1lcl9pbmZvX3QgKikgYWxsb2NhKHNuZF90aW1lcl9pbmZvX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIHNuZF90aW1lcl9pbmZvX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfdGltZXJfaW5mb19tYWxsb2Moc25kX3RpbWVyX2luZm9fdCAqKnB0cik7Cit2b2lkIHNuZF90aW1lcl9pbmZvX2ZyZWUoc25kX3RpbWVyX2luZm9fdCAqb2JqKTsKK3ZvaWQgc25kX3RpbWVyX2luZm9fY29weShzbmRfdGltZXJfaW5mb190ICpkc3QsIGNvbnN0IHNuZF90aW1lcl9pbmZvX3QgKnNyYyk7CisKK2ludCBzbmRfdGltZXJfaW5mb19pc19zbGF2ZShzbmRfdGltZXJfaW5mb190ICogaW5mbyk7CitpbnQgc25kX3RpbWVyX2luZm9fZ2V0X2NhcmQoc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworY29uc3QgY2hhciAqc25kX3RpbWVyX2luZm9fZ2V0X2lkKHNuZF90aW1lcl9pbmZvX3QgKiBpbmZvKTsKK2NvbnN0IGNoYXIgKnNuZF90aW1lcl9pbmZvX2dldF9uYW1lKHNuZF90aW1lcl9pbmZvX3QgKiBpbmZvKTsKK2xvbmcgc25kX3RpbWVyX2luZm9fZ2V0X3Jlc29sdXRpb24oc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworCitzaXplX3Qgc25kX3RpbWVyX3BhcmFtc19zaXplb2Yodm9pZCk7CisvKiogYWxsb2NhdGUgI3NuZF90aW1lcl9wYXJhbXNfdCBjb250YWluZXIgb24gc3RhY2sgKi8KKyNkZWZpbmUgc25kX3RpbWVyX3BhcmFtc19hbGxvY2EocHRyKSBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF90aW1lcl9wYXJhbXNfdCAqKSBhbGxvY2Eoc25kX3RpbWVyX3BhcmFtc19zaXplb2YoKSk7IG1lbXNldCgqcHRyLCAwLCBzbmRfdGltZXJfcGFyYW1zX3NpemVvZigpKTsgfSB3aGlsZSAoMCkKK2ludCBzbmRfdGltZXJfcGFyYW1zX21hbGxvYyhzbmRfdGltZXJfcGFyYW1zX3QgKipwdHIpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX2ZyZWUoc25kX3RpbWVyX3BhcmFtc190ICpvYmopOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX2NvcHkoc25kX3RpbWVyX3BhcmFtc190ICpkc3QsIGNvbnN0IHNuZF90aW1lcl9wYXJhbXNfdCAqc3JjKTsKKworaW50IHNuZF90aW1lcl9wYXJhbXNfc2V0X2F1dG9fc3RhcnQoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zLCBpbnQgYXV0b19zdGFydCk7CitpbnQgc25kX3RpbWVyX3BhcmFtc19nZXRfYXV0b19zdGFydChzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOworaW50IHNuZF90aW1lcl9wYXJhbXNfc2V0X2V4Y2x1c2l2ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMsIGludCBleGNsdXNpdmUpOworaW50IHNuZF90aW1lcl9wYXJhbXNfZ2V0X2V4Y2x1c2l2ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOworaW50IHNuZF90aW1lcl9wYXJhbXNfc2V0X2Vhcmx5X2V2ZW50KHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcywgaW50IGVhcmx5X2V2ZW50KTsKK2ludCBzbmRfdGltZXJfcGFyYW1zX2dldF9lYXJseV9ldmVudChzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX3NldF90aWNrcyhzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMsIGxvbmcgdGlja3MpOworbG9uZyBzbmRfdGltZXJfcGFyYW1zX2dldF90aWNrcyhzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX3NldF9xdWV1ZV9zaXplKHNuZF90aW1lcl9wYXJhbXNfdCAqIHBhcmFtcywgbG9uZyBxdWV1ZV9zaXplKTsKK2xvbmcgc25kX3RpbWVyX3BhcmFtc19nZXRfcXVldWVfc2l6ZShzbmRfdGltZXJfcGFyYW1zX3QgKiBwYXJhbXMpOwordm9pZCBzbmRfdGltZXJfcGFyYW1zX3NldF9maWx0ZXIoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgZmlsdGVyKTsKK3Vuc2lnbmVkIGludCBzbmRfdGltZXJfcGFyYW1zX2dldF9maWx0ZXIoc25kX3RpbWVyX3BhcmFtc190ICogcGFyYW1zKTsKKworc2l6ZV90IHNuZF90aW1lcl9zdGF0dXNfc2l6ZW9mKHZvaWQpOworLyoqIGFsbG9jYXRlICNzbmRfdGltZXJfc3RhdHVzX3QgY29udGFpbmVyIG9uIHN0YWNrICovCisjZGVmaW5lIHNuZF90aW1lcl9zdGF0dXNfYWxsb2NhKHB0cikgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfdGltZXJfc3RhdHVzX3QgKikgYWxsb2NhKHNuZF90aW1lcl9zdGF0dXNfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgc25kX3RpbWVyX3N0YXR1c19zaXplb2YoKSk7IH0gd2hpbGUgKDApCitpbnQgc25kX3RpbWVyX3N0YXR1c19tYWxsb2Moc25kX3RpbWVyX3N0YXR1c190ICoqcHRyKTsKK3ZvaWQgc25kX3RpbWVyX3N0YXR1c19mcmVlKHNuZF90aW1lcl9zdGF0dXNfdCAqb2JqKTsKK3ZvaWQgc25kX3RpbWVyX3N0YXR1c19jb3B5KHNuZF90aW1lcl9zdGF0dXNfdCAqZHN0LCBjb25zdCBzbmRfdGltZXJfc3RhdHVzX3QgKnNyYyk7CisKK3NuZF9odGltZXN0YW1wX3Qgc25kX3RpbWVyX3N0YXR1c19nZXRfdGltZXN0YW1wKHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7Citsb25nIHNuZF90aW1lcl9zdGF0dXNfZ2V0X3Jlc29sdXRpb24oc25kX3RpbWVyX3N0YXR1c190ICogc3RhdHVzKTsKK2xvbmcgc25kX3RpbWVyX3N0YXR1c19nZXRfbG9zdChzbmRfdGltZXJfc3RhdHVzX3QgKiBzdGF0dXMpOworbG9uZyBzbmRfdGltZXJfc3RhdHVzX2dldF9vdmVycnVuKHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7Citsb25nIHNuZF90aW1lcl9zdGF0dXNfZ2V0X3F1ZXVlKHNuZF90aW1lcl9zdGF0dXNfdCAqIHN0YXR1cyk7CisKKy8qIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLCBmb3IgY29tcGF0aWJpbGl0eSAqLworbG9uZyBzbmRfdGltZXJfaW5mb19nZXRfdGlja3Moc25kX3RpbWVyX2luZm9fdCAqIGluZm8pOworCisvKiogXH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qKiBfX0FMU0FfVElNRVJfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fsc2EvdmVyc2lvbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODIzNWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hbHNhL3ZlcnNpb24uaApAQCAtMCwwICsxLDE1IEBACisvKgorICogIHZlcnNpb24uaAorICovCisKKyNkZWZpbmUgU05EX0xJQl9NQUpPUgkJMSAvKio8IG1ham9yIG51bWJlciBvZiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9NSU5PUgkJMCAvKio8IG1pbm9yIG51bWJlciBvZiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9TVUJNSU5PUgkxNSAvKio8IHN1Ym1pbm9yIG51bWJlciBvZiBsaWJyYXJ5IHZlcnNpb24gKi8KKyNkZWZpbmUgU05EX0xJQl9FWFRSQVZFUgkxMDAwMDAwIC8qKjwgZXh0cmEgdmVyc2lvbiBudW1iZXIsIHVzZWQgbWFpbmx5IGZvciBiZXRhcyAqLworLyoqIGxpYnJhcnkgdmVyc2lvbiAqLworI2RlZmluZSBTTkRfTElCX1ZFUlNJT04JCSgoU05EX0xJQl9NQUpPUjw8MTYpfFwKKwkJCQkgKFNORF9MSUJfTUlOT1I8PDgpfFwKKwkJCQkgIFNORF9MSUJfU1VCTUlOT1IpCisvKiogbGlicmFyeSB2ZXJzaW9uIChzdHJpbmcpICovCisjZGVmaW5lIFNORF9MSUJfVkVSU0lPTl9TVFIJIjEuMC4xNSIKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTU3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FyLmgKQEAgLTAsMCArMSw0OCBAQAorLyogSGVhZGVyIGRlc2NyaWJpbmcgYGFyJyBhcmNoaXZlIGZpbGUgZm9ybWF0LgorICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUl9ICisjZGVmaW5lIF9BUl9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisvKiBBcmNoaXZlIGZpbGVzIHN0YXJ0IHdpdGggdGhlIEFSTUFHIGlkZW50aWZ5aW5nIHN0cmluZy4gIFRoZW4gZm9sbG93cyBhCisgICBgc3RydWN0IGFyX2hkcicsIGFuZCBhcyBtYW55IGJ5dGVzIG9mIG1lbWJlciBmaWxlIGRhdGEgYXMgaXRzIGBhcl9zaXplJworICAgbWVtYmVyIGluZGljYXRlcywgZm9yIGVhY2ggbWVtYmVyIGZpbGUuICAqLworCisjZGVmaW5lIEFSTUFHCSIhPGFyY2g+XG4iCS8qIFN0cmluZyB0aGF0IGJlZ2lucyBhbiBhcmNoaXZlIGZpbGUuICAqLworI2RlZmluZSBTQVJNQUcJOAkJLyogU2l6ZSBvZiB0aGF0IHN0cmluZy4gICovCisKKyNkZWZpbmUgQVJGTUFHCSJgXG4iCQkvKiBTdHJpbmcgaW4gYXJfZm1hZyBhdCBlbmQgb2YgZWFjaCBoZWFkZXIuICAqLworCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCBhcl9oZHIKKyAgeworICAgIGNoYXIgYXJfbmFtZVsxNl07CQkvKiBNZW1iZXIgZmlsZSBuYW1lLCBzb21ldGltZXMgLyB0ZXJtaW5hdGVkLiAqLworICAgIGNoYXIgYXJfZGF0ZVsxMl07CQkvKiBGaWxlIGRhdGUsIGRlY2ltYWwgc2Vjb25kcyBzaW5jZSBFcG9jaC4gICovCisgICAgY2hhciBhcl91aWRbNl0sIGFyX2dpZFs2XTsJLyogVXNlciBhbmQgZ3JvdXAgSURzLCBpbiBBU0NJSSBkZWNpbWFsLiAgKi8KKyAgICBjaGFyIGFyX21vZGVbOF07CQkvKiBGaWxlIG1vZGUsIGluIEFTQ0lJIG9jdGFsLiAgKi8KKyAgICBjaGFyIGFyX3NpemVbMTBdOwkJLyogRmlsZSBzaXplLCBpbiBBU0NJSSBkZWNpbWFsLiAgKi8KKyAgICBjaGFyIGFyX2ZtYWdbMl07CQkvKiBBbHdheXMgY29udGFpbnMgQVJGTUFHLiAgKi8KKyAgfTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFyLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJncC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcmdwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmM2FmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJncC5oCkBAIC0wLDAgKzEsNjAxIEBACisvKiBIaWVyYXJjaGlhbCBhcmd1bWVudCBwYXJzaW5nLCBsYXllcmVkIG92ZXIgZ2V0b3B0LgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBXcml0dGVuIGJ5IE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUkdQX0gKKyNkZWZpbmUgX0FSR1BfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIF9fbmVlZF9lcnJvcl90CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBfX2NvbnN0CisjIGRlZmluZSBfX2NvbnN0IGNvbnN0CisjZW5kaWYKKworI2lmbmRlZiBfX1RIUk9XCisjIGRlZmluZSBfX1RIUk9XCisjZW5kaWYKKyNpZm5kZWYgX19OVEgKKyMgZGVmaW5lIF9fTlRIKGZjdCkgZmN0IF9fVEhST1cKKyNlbmRpZgorCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKy8qIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gZ2NjIHZlcnNpb25zIDIuNSBhbmQgbGF0ZXIuICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA1KSB8fCBfX1NUUklDVF9BTlNJX18KKyMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKFNwZWMpIC8qIGVtcHR5ICovCisjIGVuZGlmCisvKiBUaGUgX18tcHJvdGVjdGVkIHZhcmlhbnRzIG9mIGBmb3JtYXQnIGFuZCBgcHJpbnRmJyBhdHRyaWJ1dGVzCisgICBhcmUgYWNjZXB0ZWQgYnkgZ2NjIHZlcnNpb25zIDIuNi40IChlZmZlY3RpdmVseSAyLjcpIGFuZCBsYXRlci4gICovCisjIGlmIF9fR05VQ19fIDwgMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDcpIHx8IF9fU1RSSUNUX0FOU0lfXworIyAgZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0CisjICBkZWZpbmUgX19wcmludGZfXyBwcmludGYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHQ0MgMi45NSBhbmQgbGF0ZXIgaGF2ZSAiX19yZXN0cmljdCI7IEM5OSBjb21waWxlcnMgaGF2ZQorICAgInJlc3RyaWN0IiwgYW5kICJjb25maWd1cmUiIG1heSBoYXZlIGRlZmluZWQgInJlc3RyaWN0Ii4gICovCisjaWZuZGVmIF9fcmVzdHJpY3QKKyMgaWYgISAoMiA8IF9fR05VQ19fIHx8ICgyID09IF9fR05VQ19fICYmIDk1IDw9IF9fR05VQ19NSU5PUl9fKSkKKyMgIGlmIGRlZmluZWQgcmVzdHJpY3QgfHwgMTk5OTAxTCA8PSBfX1NURENfVkVSU0lPTl9fCisjICAgZGVmaW5lIF9fcmVzdHJpY3QgcmVzdHJpY3QKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19yZXN0cmljdAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fZXJyb3JfdF9kZWZpbmVkCit0eXBlZGVmIGludCBlcnJvcl90OworIyBkZWZpbmUgX19lcnJvcl90X2RlZmluZWQKKyNlbmRpZgorDAorI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQSBkZXNjcmlwdGlvbiBvZiBhIHBhcnRpY3VsYXIgb3B0aW9uLiAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCisgICB0aGVzZSBpcyBwYXNzZWQgaW4gdGhlIE9QVElPTlMgZmllbGQgb2YgYW4gYXJncCBzdHJ1Y3R1cmUuICBFYWNoIG9wdGlvbgorICAgZW50cnkgY2FuIGNvcnJlc3BvbmQgdG8gb25lIGxvbmcgb3B0aW9uIGFuZC9vciBvbmUgc2hvcnQgb3B0aW9uOyBtb3JlCisgICBuYW1lcyBmb3IgdGhlIHNhbWUgb3B0aW9uIGNhbiBiZSBhZGRlZCBieSBmb2xsb3dpbmcgYW4gZW50cnkgaW4gYW4gb3B0aW9uCisgICBhcnJheSB3aXRoIG9wdGlvbnMgaGF2aW5nIHRoZSBPUFRJT05fQUxJQVMgZmxhZyBzZXQuICAqLworc3RydWN0IGFyZ3Bfb3B0aW9uCit7CisgIC8qIFRoZSBsb25nIG9wdGlvbiBuYW1lLiAgRm9yIG1vcmUgdGhhbiBvbmUgbmFtZSBmb3IgdGhlIHNhbWUgb3B0aW9uLCB5b3UKKyAgICAgY2FuIHVzZSBmb2xsb3dpbmcgb3B0aW9ucyB3aXRoIHRoZSBPUFRJT05fQUxJQVMgZmxhZyBzZXQuICAqLworICBfX2NvbnN0IGNoYXIgKm5hbWU7CisKKyAgLyogV2hhdCBrZXkgaXMgcmV0dXJuZWQgZm9yIHRoaXMgb3B0aW9uLiAgSWYgPiAwIGFuZCBwcmludGFibGUsIHRoZW4gaXQncworICAgICBhbHNvIGFjY2VwdGVkIGFzIGEgc2hvcnQgb3B0aW9uLiAgKi8KKyAgaW50IGtleTsKKworICAvKiBJZiBub24tTlVMTCwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgb3B0aW9uLCB3aGljaCBpcyByZXF1aXJlZCB1bmxlc3MgdGhlIE9QVElPTl9BUkdfT1BUSU9OQUwgZmxhZyBpcyBzZXQuICovCisgIF9fY29uc3QgY2hhciAqYXJnOworCisgIC8qIE9QVElPTl8gZmxhZ3MuICAqLworICBpbnQgZmxhZ3M7CisKKyAgLyogVGhlIGRvYyBzdHJpbmcgZm9yIHRoaXMgb3B0aW9uLiAgSWYgYm90aCBOQU1FIGFuZCBLRVkgYXJlIDAsIFRoaXMgc3RyaW5nCisgICAgIHdpbGwgYmUgcHJpbnRlZCBvdXRkZW50ZWQgZnJvbSB0aGUgbm9ybWFsIG9wdGlvbiBjb2x1bW4sIG1ha2luZyBpdAorICAgICB1c2VmdWwgYXMgYSBncm91cCBoZWFkZXIgKGl0IHdpbGwgYmUgdGhlIGZpcnN0IHRoaW5nIHByaW50ZWQgaW4gaXRzCisgICAgIGdyb3VwKTsgaW4gdGhpcyB1c2FnZSwgaXQncyBjb252ZW50aW9uYWwgdG8gZW5kIHRoZSBzdHJpbmcgd2l0aCBhIGA6Jy4gICovCisgIF9fY29uc3QgY2hhciAqZG9jOworCisgIC8qIFRoZSBncm91cCB0aGlzIG9wdGlvbiBpcyBpbi4gIEluIGEgbG9uZyBoZWxwIG1lc3NhZ2UsIG9wdGlvbnMgYXJlIHNvcnRlZAorICAgICBhbHBoYWJldGljYWxseSB3aXRoaW4gZWFjaCBncm91cCwgYW5kIHRoZSBncm91cHMgcHJlc2VudGVkIGluIHRoZSBvcmRlcgorICAgICAwLCAxLCAyLCAuLi4sIG4sIC1tLCAuLi4sIC0yLCAtMS4gIEV2ZXJ5IGVudHJ5IGluIGFuIG9wdGlvbnMgYXJyYXkgd2l0aAorICAgICBpZiB0aGlzIGZpZWxkIDAgd2lsbCBpbmhlcml0IHRoZSBncm91cCBudW1iZXIgb2YgdGhlIHByZXZpb3VzIGVudHJ5LCBvcgorICAgICB6ZXJvIGlmIGl0J3MgdGhlIGZpcnN0IG9uZSwgdW5sZXNzIGl0cyBhIGdyb3VwIGhlYWRlciAoTkFNRSBhbmQgS0VZIGJvdGgKKyAgICAgMCksIGluIHdoaWNoIGNhc2UsIHRoZSBwcmV2aW91cyBlbnRyeSArIDEgaXMgdGhlIGRlZmF1bHQuICBBdXRvbWFnaWMKKyAgICAgb3B0aW9ucyBzdWNoIGFzIC0taGVscCBhcmUgcHV0IGludG8gZ3JvdXAgLTEuICAqLworICBpbnQgZ3JvdXA7Cit9OworCisvKiBUaGUgYXJndW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3B0aW9uIGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0FSR19PUFRJT05BTAkweDEKKworLyogVGhpcyBvcHRpb24gaXNuJ3QgZGlzcGxheWVkIGluIGFueSBoZWxwIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0hJRERFTgkgICAgICAgCTB4MgorCisvKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyBmb3IgdGhlIGNsb3Nlc3QgcHJldmlvdXMgbm9uLWFsaWFzIG9wdGlvbi4gIFRoaXMKKyAgIG1lYW5zIHRoYXQgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgaGVscCBlbnRyeSwgYW5kIHdpbGwgaW5oZXJpdAorICAgZmllbGRzIG90aGVyIHRoYW4gTkFNRSBhbmQgS0VZIGZyb20gdGhlIGFsaWFzZWQgb3B0aW9uLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0FMSUFTCQkweDQKKworLyogVGhpcyBvcHRpb24gaXNuJ3QgYWN0dWFsbHkgYW4gb3B0aW9uIChhbmQgc28gc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCisgICBhY3R1YWwgb3B0aW9uIHBhcnNlciksIGJ1dCByYXRoZXIgYW4gYXJiaXRyYXJ5IHBpZWNlIG9mIGRvY3VtZW50YXRpb24gdGhhdAorICAgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBtdWNoIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgb3B0aW9ucy4gIElmIHRoaXMgZmxhZworICAgaXMgc2V0LCB0aGVuIHRoZSBvcHRpb24gTkFNRSBmaWVsZCBpcyBkaXNwbGF5ZWQgdW5tb2RpZmllZCAoZS5nLiwgbm8gYC0tJworICAgcHJlZml4IGlzIGFkZGVkKSBhdCB0aGUgbGVmdC1tYXJnaW4gKHdoZXJlIGEgKnNob3J0KiBvcHRpb24gd291bGQgbm9ybWFsbHkKKyAgIGJlIGRpc3BsYXllZCksIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgaW4gdGhlIG5vcm1hbCBwbGFjZS4gIEZvcgorICAgcHVycG9zZXMgb2Ygc29ydGluZywgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgcHVuY3R1YXRpb24gaXMgaWdub3JlZCwKKyAgIGV4Y2VwdCB0aGF0IGlmIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgbm90IGAtJywgdGhpcyBlbnRyeQorICAgaXMgZGlzcGxheWVkIGFmdGVyIGFsbCBvcHRpb25zIChhbmQgT1BUSU9OX0RPQyBlbnRyaWVzIHdpdGggYSBsZWFkaW5nIGAtJykKKyAgIGluIHRoZSBzYW1lIGdyb3VwLiAgKi8KKyNkZWZpbmUgT1BUSU9OX0RPQwkJMHg4CisKKy8qIFRoaXMgb3B0aW9uIHNob3VsZG4ndCBiZSBpbmNsdWRlZCBpbiBgbG9uZycgdXNhZ2UgbWVzc2FnZXMgKGJ1dCBpcyBzdGlsbAorICAgaW5jbHVkZWQgaW4gaGVscCBtZXNzYWdlcykuICBUaGlzIGlzIG1haW5seSBpbnRlbmRlZCBmb3Igb3B0aW9ucyB0aGF0IGFyZQorICAgY29tcGxldGVseSBkb2N1bWVudGVkIGluIGFuIGFyZ3AncyBBUkdTX0RPQyBmaWVsZCwgaW4gd2hpY2ggY2FzZSBpbmNsdWRpbmcKKyAgIHRoZSBvcHRpb24gaW4gdGhlIGdlbmVyaWMgdXNhZ2UgbGlzdCB3b3VsZCBiZSByZWR1bmRhbnQuICBGb3IgaW5zdGFuY2UsCisgICBpZiBBUkdTX0RPQyBpcyAiRk9PIEJBUlxuLXggQkxBSCIsIGFuZCB0aGUgYC14JyBvcHRpb24ncyBwdXJwb3NlIGlzIHRvCisgICBkaXN0aW5ndWlzaCB0aGVzZSB0d28gY2FzZXMsIC14IHNob3VsZCBwcm9iYWJseSBiZSBtYXJrZWQKKyAgIE9QVElPTl9OT19VU0FHRS4gICovCisjZGVmaW5lIE9QVElPTl9OT19VU0FHRQkJMHgxMAorDAorc3RydWN0IGFyZ3A7CQkJLyogZndkIGRlY2xhcmUgdGhpcyB0eXBlICovCitzdHJ1Y3QgYXJncF9zdGF0ZTsJCS8qICIgKi8KK3N0cnVjdCBhcmdwX2NoaWxkOwkJLyogIiAqLworCisvKiBUaGUgdHlwZSBvZiBhIHBvaW50ZXIgdG8gYW4gYXJncCBwYXJzaW5nIGZ1bmN0aW9uLiAgKi8KK3R5cGVkZWYgZXJyb3JfdCAoKmFyZ3BfcGFyc2VyX3QpIChpbnQga2V5LCBjaGFyICphcmcsCisJCQkJICBzdHJ1Y3QgYXJncF9zdGF0ZSAqc3RhdGUpOworCisvKiBXaGF0IHRvIHJldHVybiBmb3IgdW5yZWNvZ25pemVkIGtleXMuICBGb3Igc3BlY2lhbCBBUkdQX0tFWV8ga2V5cywgc3VjaAorICAgcmV0dXJucyB3aWxsIHNpbXBseSBiZSBpZ25vcmVkLiAgRm9yIHVzZXIga2V5cywgdGhpcyBlcnJvciB3aWxsIGJlIHR1cm5lZAorICAgaW50byBFSU5WQUwgKGlmIHRoZSBjYWxsIHRvIGFyZ3BfcGFyc2UgaXMgc3VjaCB0aGF0IGVycm9ycyBhcmUgcHJvcGFnYXRlZAorICAgYmFjayB0byB0aGUgdXNlciBpbnN0ZWFkIG9mIGV4aXRpbmcpOyByZXR1cm5pbmcgRUlOVkFMIGl0c2VsZiB3b3VsZCByZXN1bHQKKyAgIGluIGFuIGltbWVkaWF0ZSBzdG9wIHRvIHBhcnNpbmcgaW4gKmFsbCogY2FzZXMuICAqLworI2RlZmluZSBBUkdQX0VSUl9VTktOT1dOCUUyQklHIC8qIEh1cmQgc2hvdWxkIG5ldmVyIG5lZWQgRTJCSUcuICBYWFggKi8KKworLyogU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBLRVkgYXJndW1lbnQgdG8gYW4gYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbi4KKyAgIEFSR1BfRVJSX1VOS05PV04gc2hvdWxkIGJlIHJldHVybmVkIGlmIHRoZXkgYXJlbid0IHVuZGVyc3Rvb2QuCisKKyAgIFRoZSBzZXF1ZW5jZSBvZiBrZXlzIHRvIGEgcGFyc2luZyBmdW5jdGlvbiBpcyBlaXRoZXIgKHdoZXJlIGVhY2gKKyAgIHVwcGVyY2FzZWQgd29yZCBzaG91bGQgYmUgcHJlZml4ZWQgYnkgYEFSR1BfS0VZXycgYW5kIG9wdCBpcyBhIHVzZXIga2V5KToKKworICAgICAgIElOSVQgb3B0Li4uIE5PX0FSR1MgRU5EIFNVQ0NFU1MgIC0tIE5vIG5vbi1vcHRpb24gYXJndW1lbnRzIGF0IGFsbAorICAgb3IgIElOSVQgKG9wdCB8IEFSRykuLi4gRU5EIFNVQ0NFU1MgIC0tIEFsbCBub24tb3B0aW9uIGFyZ3MgcGFyc2VkCisgICBvciAgSU5JVCAob3B0IHwgQVJHKS4uLiBTVUNDRVNTICAgICAgLS0gU29tZSBub24tb3B0aW9uIGFyZyB1bnJlY29nbml6ZWQKKworICAgVGhlIHRoaXJkIGNhc2UgaXMgd2hlcmUgZXZlcnkgcGFyc2VyIHJldHVybmVkIEFSR1BfS0VZX1VOS05PV04gZm9yIGFuCisgICBhcmd1bWVudCwgaW4gd2hpY2ggY2FzZSBwYXJzaW5nIHN0b3BzIGF0IHRoYXQgYXJndW1lbnQgKHJldHVybmluZyB0aGUKKyAgIHVucGFyc2VkIGFyZ3VtZW50cyB0byB0aGUgY2FsbGVyIG9mIGFyZ3BfcGFyc2UgaWYgcmVxdWVzdGVkLCBvciBzdG9wcGluZworICAgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG5vdCkuCisKKyAgIElmIGFuIGVycm9yIG9jY3VycyAoZWl0aGVyIGRldGVjdGVkIGJ5IGFyZ3AsIG9yIGJlY2F1c2UgdGhlIHBhcnNpbmcKKyAgIGZ1bmN0aW9uIHJldHVybmVkIGFuIGVycm9yIHZhbHVlKSwgdGhlbiB0aGUgcGFyc2VyIGlzIGNhbGxlZCB3aXRoCisgICBBUkdQX0tFWV9FUlJPUiwgYW5kIG5vIGZ1cnRoZXIgY2FsbHMgYXJlIG1hZGUuICAqLworCisvKiBUaGlzIGlzIG5vdCBhbiBvcHRpb24gYXQgYWxsLCBidXQgcmF0aGVyIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAgSWYgYQorICAgcGFyc2VyIHJlY2VpdmluZyB0aGlzIGtleSByZXR1cm5zIHN1Y2Nlc3MsIHRoZSBmYWN0IGlzIHJlY29yZGVkLCBhbmQgdGhlCisgICBBUkdQX0tFWV9OT19BUkdTIGNhc2Ugd29uJ3QgYmUgdXNlZC4gIEhPV0VWRVIsIGlmIHdoaWxlIHByb2Nlc3NpbmcgdGhlCisgICBhcmd1bWVudCwgYSBwYXJzZXIgZnVuY3Rpb24gZGVjcmVtZW50cyB0aGUgTkVYVCBmaWVsZCBvZiB0aGUgc3RhdGUgaXQncworICAgcGFzc2VkLCB0aGUgb3B0aW9uIHdvbid0IGJlIGNvbnNpZGVyZWQgcHJvY2Vzc2VkOyB0aGlzIGlzIHRvIGFsbG93IHlvdSB0bworICAgYWN0dWFsbHkgbW9kaWZ5IHRoZSBhcmd1bWVudCAocGVyaGFwcyBpbnRvIGFuIG9wdGlvbiksIGFuZCBoYXZlIGl0CisgICBwcm9jZXNzZWQgYWdhaW4uICAqLworI2RlZmluZSBBUkdQX0tFWV9BUkcJCTAKKy8qIFRoZXJlIGFyZSByZW1haW5pbmcgYXJndW1lbnRzIG5vdCBwYXJzZWQgYnkgYW55IHBhcnNlciwgd2hpY2ggbWF5IGJlIGZvdW5kCisgICBzdGFydGluZyBhdCAoU1RBVEUtPmFyZ3YgKyBTVEFURS0+bmV4dCkuICBJZiBzdWNjZXNzIGlzIHJldHVybmVkLCBidXQKKyAgIFNUQVRFLT5uZXh0IGxlZnQgdW50b3VjaGVkLCBpdCdzIGFzc3VtZWQgdGhhdCBhbGwgYXJndW1lbnRzIHdlcmUgY29uc3VtZSwKKyAgIG90aGVyd2lzZSwgdGhlIHBhcnNlciBzaG91bGQgYWRqdXN0IFNUQVRFLT5uZXh0IHRvIHJlZmxlY3QgYW55IGFyZ3VtZW50cworICAgY29uc3VtZWQuICAqLworI2RlZmluZSBBUkdQX0tFWV9BUkdTCQkweDEwMDAwMDYKKy8qIFRoZXJlIGFyZSBubyBtb3JlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXQgYWxsLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfRU5ECQkweDEwMDAwMDEKKy8qIEJlY2F1c2UgaXQncyBjb21tb24gdG8gd2FudCB0byBkbyBzb21lIHNwZWNpYWwgcHJvY2Vzc2luZyBpZiB0aGVyZSBhcmVuJ3QKKyAgIGFueSBub24tb3B0aW9uIGFyZ3MsIHVzZXIgcGFyc2VycyBhcmUgY2FsbGVkIHdpdGggdGhpcyBrZXkgaWYgdGhleSBkaWRuJ3QKKyAgIHN1Y2Nlc3NmdWxseSBwcm9jZXNzIGFueSBub24tb3B0aW9uIGFyZ3VtZW50cy4gIENhbGxlZCBqdXN0IGJlZm9yZQorICAgQVJHUF9LRVlfRU5EICh3aGVyZSBtb3JlIGdlbmVyYWwgdmFsaWRpdHkgY2hlY2tzIG9uIHByZXZpb3VzbHkgcGFyc2VkCisgICBhcmd1bWVudHMgY2FuIHRha2UgcGxhY2UpLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfTk9fQVJHUwkweDEwMDAwMDIKKy8qIFBhc3NlZCBpbiBiZWZvcmUgYW55IHBhcnNpbmcgaXMgZG9uZS4gIEFmdGVyd2FyZHMsIHRoZSB2YWx1ZXMgb2YgZWFjaAorICAgZWxlbWVudCBvZiB0aGUgQ0hJTERfSU5QVVQgZmllbGQsIGlmIGFueSwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBpcworICAgY29waWVkIHRvIGVhY2ggY2hpbGQncyBzdGF0ZSB0byBiZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgSU5QVVQgZmllbGQuICAqLworI2RlZmluZSBBUkdQX0tFWV9JTklUCQkweDEwMDAwMDMKKy8qIFVzZSBhZnRlciBhbGwgb3RoZXIga2V5cywgaW5jbHVkaW5nIFNVQ0NFU1MgJiBFTkQuICAqLworI2RlZmluZSBBUkdQX0tFWV9GSU5JCQkweDEwMDAwMDcKKy8qIFBhc3NlZCBpbiB3aGVuIHBhcnNpbmcgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGNvbXBsZXRlZCAoZXZlbiBpZiB0aGVyZSBhcmUKKyAgIHN0aWxsIGFyZ3VtZW50cyByZW1haW5pbmcpLiAgKi8KKyNkZWZpbmUgQVJHUF9LRVlfU1VDQ0VTUwkweDEwMDAwMDQKKy8qIFBhc3NlZCBpbiBpZiBhbiBlcnJvciBvY2N1cnMuICAqLworI2RlZmluZSBBUkdQX0tFWV9FUlJPUgkJMHgxMDAwMDA1CisKKy8qIEFuIGFyZ3Agc3RydWN0dXJlIGNvbnRhaW5zIGEgc2V0IG9mIG9wdGlvbnMgZGVjbGFyYXRpb25zLCBhIGZ1bmN0aW9uIHRvCisgICBkZWFsIHdpdGggcGFyc2luZyBvbmUsIGRvY3VtZW50YXRpb24gc3RyaW5nLCBhIHBvc3NpYmxlIHZlY3RvciBvZiBjaGlsZAorICAgYXJncCdzLCBhbmQgcGVyaGFwcyBhIGZ1bmN0aW9uIHRvIGZpbHRlciBoZWxwIG91dHB1dC4gIFdoZW4gYWN0dWFsbHkKKyAgIHBhcnNpbmcgb3B0aW9ucywgZ2V0b3B0IGlzIGNhbGxlZCB3aXRoIHRoZSB1bmlvbiBvZiBhbGwgdGhlIGFyZ3AKKyAgIHN0cnVjdHVyZXMgY2hhaW5lZCB0b2dldGhlciB0aHJvdWdoIHRoZWlyIENISUxEIHBvaW50ZXJzLCB3aXRoIGNvbmZsaWN0cworICAgYmVpbmcgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gdGhlIGNoYWluLiAgKi8KK3N0cnVjdCBhcmdwCit7CisgIC8qIEFuIGFycmF5IG9mIGFyZ3Bfb3B0aW9uIHN0cnVjdHVyZXMsIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgd2l0aCBib3RoCisgICAgIE5BTUUgYW5kIEtFWSBoYXZpbmcgYSB2YWx1ZSBvZiAwLiAgKi8KKyAgX19jb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gKm9wdGlvbnM7CisKKyAgLyogV2hhdCB0byBkbyB3aXRoIGFuIG9wdGlvbiBmcm9tIHRoaXMgc3RydWN0dXJlLiAgS0VZIGlzIHRoZSBrZXkKKyAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb24sIGFuZCBBUkcgaXMgYW55IGFzc29jaWF0ZWQgYXJndW1lbnQgKE5VTEwgaWYKKyAgICAgbm9uZSB3YXMgc3VwcGxpZWQpLiAgSWYgS0VZIGlzbid0IHVuZGVyc3Rvb2QsIEFSR1BfRVJSX1VOS05PV04gc2hvdWxkIGJlCisgICAgIHJldHVybmVkLiAgSWYgYSBub24temVybywgbm9uLUFSR1BfRVJSX1VOS05PV04gdmFsdWUgaXMgcmV0dXJuZWQsIHRoZW4KKyAgICAgcGFyc2luZyBpcyBzdG9wcGVkIGltbWVkaWF0ZWx5LCBhbmQgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tCisgICAgIGFyZ3BfcGFyc2UoKS4gIEZvciBzcGVjaWFsIChub24tdXNlci1zdXBwbGllZCkgdmFsdWVzIG9mIEtFWSwgc2VlIHRoZQorICAgICBBUkdQX0tFWV8gZGVmaW5pdGlvbnMgYmVsb3cuICAqLworICBhcmdwX3BhcnNlcl90IHBhcnNlcjsKKworICAvKiBBIHN0cmluZyBkZXNjcmliaW5nIHdoYXQgb3RoZXIgYXJndW1lbnRzIGFyZSB3YW50ZWQgYnkgdGhpcyBwcm9ncmFtLiAgSXQKKyAgICAgaXMgb25seSB1c2VkIGJ5IGFyZ3BfdXNhZ2UgdG8gcHJpbnQgdGhlIGBVc2FnZTonIG1lc3NhZ2UuICBJZiBpdAorICAgICBjb250YWlucyBuZXdsaW5lcywgdGhlIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IHRoZW0gYXJlIGNvbnNpZGVyZWQKKyAgICAgYWx0ZXJuYXRpdmUgdXNhZ2UgcGF0dGVybnMsIGFuZCBwcmludGVkIG9uIHNlcGFyYXRlIGxpbmVzIChsaW5lcyBhZnRlcgorICAgICB0aGUgZmlyc3QgYXJlIHByZWZpeCBieSBgICBvcjogJyBpbnN0ZWFkIG9mIGBVc2FnZTonKS4gICovCisgIF9fY29uc3QgY2hhciAqYXJnc19kb2M7CisKKyAgLyogSWYgbm9uLU5VTEwsIGEgc3RyaW5nIGNvbnRhaW5pbmcgZXh0cmEgdGV4dCB0byBiZSBwcmludGVkIGJlZm9yZSBhbmQKKyAgICAgYWZ0ZXIgdGhlIG9wdGlvbnMgaW4gYSBsb25nIGhlbHAgbWVzc2FnZSAoc2VwYXJhdGVkIGJ5IGEgdmVydGljYWwgdGFiCisgICAgIGBcdicgY2hhcmFjdGVyKS4gICovCisgIF9fY29uc3QgY2hhciAqZG9jOworCisgIC8qIEEgdmVjdG9yIG9mIGFyZ3BfY2hpbGRyZW4gc3RydWN0dXJlcywgdGVybWluYXRlZCBieSBhIG1lbWJlciB3aXRoIGEgMAorICAgICBhcmdwIGZpZWxkLCBwb2ludGluZyB0byBjaGlsZCBhcmdwcyBzaG91bGQgYmUgcGFyc2VkIHdpdGggdGhpcyBvbmUuICBBbnkKKyAgICAgY29uZmxpY3RzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiB0aGlzIGFyZ3AsIG9yIGVhcmx5IGFyZ3BzIGluIHRoZQorICAgICBDSElMRFJFTiBsaXN0LiAgVGhpcyBmaWVsZCBpcyB1c2VmdWwgaWYgeW91IHVzZSBsaWJyYXJpZXMgdGhhdCBzdXBwbHkKKyAgICAgdGhlaXIgb3duIGFyZ3Agc3RydWN0dXJlLCB3aGljaCB5b3Ugd2FudCB0byB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB5b3VyCisgICAgIG93bi4gICovCisgIF9fY29uc3Qgc3RydWN0IGFyZ3BfY2hpbGQgKmNoaWxkcmVuOworCisgIC8qIElmIG5vbi16ZXJvLCB0aGlzIHNob3VsZCBiZSBhIGZ1bmN0aW9uIHRvIGZpbHRlciB0aGUgb3V0cHV0IG9mIGhlbHAKKyAgICAgbWVzc2FnZXMuICBLRVkgaXMgZWl0aGVyIGEga2V5IGZyb20gYW4gb3B0aW9uLCBpbiB3aGljaCBjYXNlIFRFWFQgaXMKKyAgICAgdGhhdCBvcHRpb24ncyBoZWxwIHRleHQsIG9yIGEgc3BlY2lhbCBrZXkgZnJvbSB0aGUgQVJHUF9LRVlfSEVMUF8KKyAgICAgZGVmaW5lcywgYmVsb3csIGRlc2NyaWJpbmcgd2hpY2ggb3RoZXIgaGVscCB0ZXh0IFRFWFQgaXMuICBUaGUgZnVuY3Rpb24KKyAgICAgc2hvdWxkIHJldHVybiBlaXRoZXIgVEVYVCwgaWYgaXQgc2hvdWxkIGJlIHVzZWQgYXMtaXMsIGEgcmVwbGFjZW1lbnQKKyAgICAgc3RyaW5nLCB3aGljaCBzaG91bGQgYmUgbWFsbG9jZWQsIGFuZCB3aWxsIGJlIGZyZWVkIGJ5IGFyZ3AsIG9yIE5VTEwsCisgICAgIG1lYW5pbmcgYHByaW50IG5vdGhpbmcnLiAgVGhlIHZhbHVlIGZvciBURVhUIGlzICphZnRlciogYW55IHRyYW5zbGF0aW9uCisgICAgIGhhcyBiZWVuIGRvbmUsIHNvIGlmIGFueSBvZiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBhbHNvIG5lZWRzIHRyYW5zbGF0aW9uLAorICAgICB0aGF0IHNob3VsZCBiZSBkb25lIGJ5IHRoZSBmaWx0ZXIgZnVuY3Rpb24uICBJTlBVVCBpcyBlaXRoZXIgdGhlIGlucHV0CisgICAgIHN1cHBsaWVkIHRvIGFyZ3BfcGFyc2UsIG9yIE5VTEwsIGlmIGFyZ3BfaGVscCB3YXMgY2FsbGVkIGRpcmVjdGx5LiAgKi8KKyAgY2hhciAqKCpoZWxwX2ZpbHRlcikgKGludCBfX2tleSwgX19jb25zdCBjaGFyICpfX3RleHQsIHZvaWQgKl9faW5wdXQpOworCisgIC8qIElmIG5vbi16ZXJvIHRoZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGFyZ3AgbGlicmFyeSBhcmUgdHJhbnNsYXRlZCB1c2luZworICAgICB0aGUgZG9tYWluIGRlc2NyaWJlZCBieSB0aGlzIHN0cmluZy4gIE90aGVyd2lzZSB0aGUgY3VycmVudGx5IGluc3RhbGxlZAorICAgICBkZWZhdWx0IGRvbWFpbiBpcyB1c2VkLiAgKi8KKyAgY29uc3QgY2hhciAqYXJncF9kb21haW47Cit9OworCisvKiBQb3NzaWJsZSBLRVkgYXJndW1lbnRzIHRvIGEgaGVscCBmaWx0ZXIgZnVuY3Rpb24uICAqLworI2RlZmluZSBBUkdQX0tFWV9IRUxQX1BSRV9ET0MJMHgyMDAwMDAxIC8qIEhlbHAgdGV4dCBwcmVjZWVkaW5nIG9wdGlvbnMuICovCisjZGVmaW5lIEFSR1BfS0VZX0hFTFBfUE9TVF9ET0MJMHgyMDAwMDAyIC8qIEhlbHAgdGV4dCBmb2xsb3dpbmcgb3B0aW9ucy4gKi8KKyNkZWZpbmUgQVJHUF9LRVlfSEVMUF9IRUFERVIJMHgyMDAwMDAzIC8qIE9wdGlvbiBoZWFkZXIgc3RyaW5nLiAqLworI2RlZmluZSBBUkdQX0tFWV9IRUxQX0VYVFJBCTB4MjAwMDAwNCAvKiBBZnRlciBhbGwgb3RoZXIgZG9jdW1lbnRhdGlvbjsKKwkJCQkJICAgICBURVhUIGlzIE5VTEwgZm9yIHRoaXMga2V5LiAgKi8KKy8qIEV4cGxhbmF0b3J5IG5vdGUgZW1pdHRlZCB3aGVuIGR1cGxpY2F0ZSBvcHRpb24gYXJndW1lbnRzIGhhdmUgYmVlbgorICAgc3VwcHJlc3NlZC4gICovCisjZGVmaW5lIEFSR1BfS0VZX0hFTFBfRFVQX0FSR1NfTk9URSAweDIwMDAwMDUKKyNkZWZpbmUgQVJHUF9LRVlfSEVMUF9BUkdTX0RPQwkweDIwMDAwMDYgLyogQXJndW1lbnQgZG9jIHN0cmluZy4gICovCisMCisvKiBXaGVuIGFuIGFyZ3AgaGFzIGEgbm9uLXplcm8gQ0hJTERSRU4gZmllbGQsIGl0IHNob3VsZCBwb2ludCB0byBhIHZlY3RvciBvZgorICAgYXJncF9jaGlsZCBzdHJ1Y3R1cmVzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHN1YnNpZGlhcnkgYXJncC4gICovCitzdHJ1Y3QgYXJncF9jaGlsZAoreworICAvKiBUaGUgY2hpbGQgcGFyc2VyLiAgKi8KKyAgX19jb25zdCBzdHJ1Y3QgYXJncCAqYXJncDsKKworICAvKiBGbGFncyBmb3IgdGhpcyBjaGlsZC4gICovCisgIGludCBmbGFnczsKKworICAvKiBJZiBub24temVybywgYW4gb3B0aW9uYWwgaGVhZGVyIHRvIGJlIHByaW50ZWQgaW4gaGVscCBvdXRwdXQgYmVmb3JlIHRoZQorICAgICBjaGlsZCBvcHRpb25zLiAgQXMgYSBzaWRlLWVmZmVjdCwgYSBub24temVybyB2YWx1ZSBmb3JjZXMgdGhlIGNoaWxkCisgICAgIG9wdGlvbnMgdG8gYmUgZ3JvdXBlZCB0b2dldGhlcjsgdG8gYWNoaWV2ZSB0aGlzIGVmZmVjdCB3aXRob3V0IGFjdHVhbGx5CisgICAgIHByaW50aW5nIGEgaGVhZGVyIHN0cmluZywgdXNlIGEgdmFsdWUgb2YgIiIuICAqLworICBfX2NvbnN0IGNoYXIgKmhlYWRlcjsKKworICAvKiBXaGVyZSB0byBncm91cCB0aGUgY2hpbGQgb3B0aW9ucyByZWxhdGl2ZSB0byB0aGUgb3RoZXIgKGBjb25zb2xpZGF0ZWQnKQorICAgICBvcHRpb25zIGluIHRoZSBwYXJlbnQgYXJncDsgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdGhlIEdST1VQIGZpZWxkCisgICAgIGluIGFyZ3Bfb3B0aW9uIHN0cnVjdHMsIGJ1dCBhbGwgY2hpbGQtZ3JvdXBpbmdzIGZvbGxvdyBwYXJlbnQgb3B0aW9ucyBhdAorICAgICBhIHBhcnRpY3VsYXIgZ3JvdXAgbGV2ZWwuICBJZiBib3RoIHRoaXMgZmllbGQgYW5kIEhFQURFUiBhcmUgemVybywgdGhlbgorICAgICB0aGV5IGFyZW4ndCBncm91cGVkIGF0IGFsbCwgYnV0IHJhdGhlciBtZXJnZWQgd2l0aCB0aGUgcGFyZW50IG9wdGlvbnMKKyAgICAgKG1lcmdpbmcgdGhlIGNoaWxkJ3MgZ3JvdXBpbmcgbGV2ZWxzIHdpdGggdGhlIHBhcmVudHMpLiAgKi8KKyAgaW50IGdyb3VwOworfTsKKwwKKy8qIFBhcnNpbmcgc3RhdGUuICBUaGlzIGlzIHByb3ZpZGVkIHRvIHBhcnNpbmcgZnVuY3Rpb25zIGNhbGxlZCBieSBhcmdwLAorICAgd2hpY2ggbWF5IGV4YW1pbmUgYW5kLCBhcyBub3RlZCwgbW9kaWZ5IGZpZWxkcy4gICovCitzdHJ1Y3QgYXJncF9zdGF0ZQoreworICAvKiBUaGUgdG9wIGxldmVsIEFSR1AgYmVpbmcgcGFyc2VkLiAgKi8KKyAgX19jb25zdCBzdHJ1Y3QgYXJncCAqcm9vdF9hcmdwOworCisgIC8qIFRoZSBhcmd1bWVudCB2ZWN0b3IgYmVpbmcgcGFyc2VkLiAgTWF5IGJlIG1vZGlmaWVkLiAgKi8KKyAgaW50IGFyZ2M7CisgIGNoYXIgKiphcmd2OworCisgIC8qIFRoZSBpbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGFyZyB0aGF0IHRvIGJlIHBhcnNlZC4gIE1heSBiZSBtb2RpZmllZC4gKi8KKyAgaW50IG5leHQ7CisKKyAgLyogVGhlIGZsYWdzIHN1cHBsaWVkIHRvIGFyZ3BfcGFyc2UuICBNYXkgYmUgbW9kaWZpZWQuICAqLworICB1bnNpZ25lZCBmbGFnczsKKworICAvKiBXaGlsZSBjYWxsaW5nIGEgcGFyc2luZyBmdW5jdGlvbiB3aXRoIGEga2V5IG9mIEFSR1BfS0VZX0FSRywgdGhpcyBpcyB0aGUKKyAgICAgbnVtYmVyIG9mIHRoZSBjdXJyZW50IGFyZywgc3RhcnRpbmcgYXQgemVybywgYW5kIGluY3JlbWVudGVkIGFmdGVyIGVhY2gKKyAgICAgc3VjaCBjYWxsIHJldHVybnMuICBBdCBhbGwgb3RoZXIgdGltZXMsIHRoaXMgaXMgdGhlIG51bWJlciBvZiBzdWNoCisgICAgIGFyZ3VtZW50cyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQuICAqLworICB1bnNpZ25lZCBhcmdfbnVtOworCisgIC8qIElmIG5vbi16ZXJvLCB0aGUgaW5kZXggaW4gQVJHViBvZiB0aGUgZmlyc3QgYXJndW1lbnQgZm9sbG93aW5nIGEgc3BlY2lhbAorICAgICBgLS0nIGFyZ3VtZW50ICh3aGljaCBwcmV2ZW50cyBhbnl0aGluZyBmb2xsb3dpbmcgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgYW4KKyAgICAgb3B0aW9uKS4gIE9ubHkgc2V0IG9uY2UgYXJndW1lbnQgcGFyc2luZyBoYXMgcHJvY2VlZGVkIHBhc3QgdGhpcyBwb2ludC4gKi8KKyAgaW50IHF1b3RlZDsKKworICAvKiBBbiBhcmJpdHJhcnkgcG9pbnRlciBwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4gICovCisgIHZvaWQgKmlucHV0OworICAvKiBWYWx1ZXMgdG8gcGFzcyB0byBjaGlsZCBwYXJzZXJzLiAgVGhpcyB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBsZW5ndGggYXMKKyAgICAgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgdGhlIGN1cnJlbnQgcGFyc2VyLiAgKi8KKyAgdm9pZCAqKmNoaWxkX2lucHV0czsKKworICAvKiBGb3IgdGhlIHBhcnNlcidzIHVzZS4gIEluaXRpYWxpemVkIHRvIDAuICAqLworICB2b2lkICpob29rOworCisgIC8qIFRoZSBuYW1lIHVzZWQgd2hlbiBwcmludGluZyBtZXNzYWdlcy4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gQVJHVlswXSwKKyAgICAgb3IgUFJPR1JBTV9JTlZPQ0FUSU9OX05BTUUgaWYgdGhhdCBpcyB1bmF2YWlsYWJsZS4gICovCisgIGNoYXIgKm5hbWU7CisKKyAgLyogU3RyZWFtcyB1c2VkIHdoZW4gYXJncCBwcmludHMgc29tZXRoaW5nLiAgKi8KKyAgRklMRSAqZXJyX3N0cmVhbTsJCS8qIEZvciBlcnJvcnM7IGluaXRpYWxpemVkIHRvIHN0ZGVyci4gKi8KKyAgRklMRSAqb3V0X3N0cmVhbTsJCS8qIEZvciBpbmZvcm1hdGlvbjsgaW5pdGlhbGl6ZWQgdG8gc3Rkb3V0LiAqLworCisgIHZvaWQgKnBzdGF0ZTsJCQkvKiBQcml2YXRlLCBmb3IgdXNlIGJ5IGFyZ3AuICAqLworfTsKKwwKKy8qIEZsYWdzIGZvciBhcmdwX3BhcnNlIChub3RlIHRoYXQgdGhlIGRlZmF1bHRzIGFyZSB0aG9zZSB0aGF0IGFyZQorICAgY29udmVuaWVudCBmb3IgcHJvZ3JhbSBjb21tYW5kIGxpbmUgcGFyc2luZyk6ICovCisKKy8qIERvbid0IGlnbm9yZSB0aGUgZmlyc3QgZWxlbWVudCBvZiBBUkdWLiAgTm9ybWFsbHkgKGFuZCBhbHdheXMgdW5sZXNzCisgICBBUkdQX05PX0VSUlMgaXMgc2V0KSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJndW1lbnQgdmVjdG9yIGlzCisgICBza2lwcGVkIGZvciBvcHRpb24gcGFyc2luZyBwdXJwb3NlcywgYXMgaXQgY29ycmVzcG9uZHMgdG8gdGhlIHByb2dyYW0gbmFtZQorICAgaW4gYSBjb21tYW5kIGxpbmUuICAqLworI2RlZmluZSBBUkdQX1BBUlNFX0FSR1YwICAweDAxCisKKy8qIERvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGZvciB1bmtub3duIG9wdGlvbnMgdG8gc3RkZXJyOyB1bmxlc3MgdGhpcyBmbGFnCisgICBpcyBzZXQsIEFSR1BfUEFSU0VfQVJHVjAgaXMgaWdub3JlZCwgYXMgQVJHVlswXSBpcyB1c2VkIGFzIHRoZSBwcm9ncmFtCisgICBuYW1lIGluIHRoZSBlcnJvciBtZXNzYWdlcy4gIFRoaXMgZmxhZyBpbXBsaWVzIEFSR1BfTk9fRVhJVCAob24gdGhlCisgICBhc3N1bXB0aW9uIHRoYXQgc2lsZW50IGV4aXRpbmcgdXBvbiBlcnJvcnMgaXMgYmFkIGJlaGF2aW91cikuICAqLworI2RlZmluZSBBUkdQX05PX0VSUlMJMHgwMgorCisvKiBEb24ndCBwYXJzZSBhbnkgbm9uLW9wdGlvbiBhcmdzLiAgTm9ybWFsbHkgbm9uLW9wdGlvbiBhcmdzIGFyZSBwYXJzZWQgYnkKKyAgIGNhbGxpbmcgdGhlIHBhcnNlIGZ1bmN0aW9ucyB3aXRoIGEga2V5IG9mIEFSR1BfS0VZX0FSRywgYW5kIHRoZSBhY3R1YWwgYXJnCisgICBhcyB0aGUgdmFsdWUuICBTaW5jZSBpdCdzIGltcG9zc2libGUgdG8ga25vdyB3aGljaCBwYXJzZSBmdW5jdGlvbiB3YW50cyB0bworICAgaGFuZGxlIGl0LCBlYWNoIG9uZSBpcyBjYWxsZWQgaW4gdHVybiwgdW50aWwgb25lIHJldHVybnMgMCBvciBhbiBlcnJvcgorICAgb3RoZXIgdGhhbiBBUkdQX0VSUl9VTktOT1dOOyBpZiBhbiBhcmd1bWVudCBpcyBoYW5kbGVkIGJ5IG5vIG9uZSwgdGhlCisgICBhcmdwX3BhcnNlIHJldHVybnMgcHJlbWF0dXJlbHkgKGJ1dCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mIDApLiAgSWYgYWxsCisgICBhcmdzIGhhdmUgYmVlbiBwYXJzZWQgd2l0aG91dCBlcnJvciwgYWxsIHBhcnNpbmcgZnVuY3Rpb25zIGFyZSBjYWxsZWQgb25lCisgICBsYXN0IHRpbWUgd2l0aCBhIGtleSBvZiBBUkdQX0tFWV9FTkQuICBUaGlzIGZsYWcgbmVlZG4ndCBub3JtYWxseSBiZSBzZXQsCisgICBhcyB0aGUgbm9ybWFsIGJlaGF2aW9yIGlzIHRvIHN0b3AgcGFyc2luZyBhcyBzb29uIGFzIHNvbWUgYXJndW1lbnQgY2FuJ3QKKyAgIGJlIGhhbmRsZWQuICAqLworI2RlZmluZSBBUkdQX05PX0FSR1MJMHgwNAorCisvKiBQYXJzZSBvcHRpb25zIGFuZCBhcmd1bWVudHMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSBvY2N1ciBvbiB0aGUgY29tbWFuZAorICAgbGluZSAtLSBub3JtYWxseSB0aGV5J3JlIHJlYXJyYW5nZWQgc28gdGhhdCBhbGwgb3B0aW9ucyBjb21lIGZpcnN0LiAqLworI2RlZmluZSBBUkdQX0lOX09SREVSCTB4MDgKKworLyogRG9uJ3QgcHJvdmlkZSB0aGUgc3RhbmRhcmQgbG9uZyBvcHRpb24gLS1oZWxwLCB3aGljaCBjYXVzZXMgdXNhZ2UgYW5kCisgICAgICBvcHRpb24gaGVscCBpbmZvcm1hdGlvbiB0byBiZSBvdXRwdXQgdG8gc3Rkb3V0LCBhbmQgZXhpdCAoMCkgY2FsbGVkLiAqLworI2RlZmluZSBBUkdQX05PX0hFTFAJMHgxMAorCisvKiBEb24ndCBleGl0IG9uIGVycm9ycyAodGhleSBtYXkgc3RpbGwgcmVzdWx0IGluIGVycm9yIG1lc3NhZ2VzKS4gICovCisjZGVmaW5lIEFSR1BfTk9fRVhJVAkweDIwCisKKy8qIFVzZSB0aGUgZ251IGdldG9wdCBgbG9uZy1vbmx5JyBydWxlcyBmb3IgcGFyc2luZyBhcmd1bWVudHMuICAqLworI2RlZmluZSBBUkdQX0xPTkdfT05MWQkweDQwCisKKy8qIFR1cm5zIG9mZiBhbnkgbWVzc2FnZS1wcmludGluZy9leGl0aW5nIG9wdGlvbnMuICAqLworI2RlZmluZSBBUkdQX1NJTEVOVCAgICAoQVJHUF9OT19FWElUIHwgQVJHUF9OT19FUlJTIHwgQVJHUF9OT19IRUxQKQorCisvKiBQYXJzZSB0aGUgb3B0aW9ucyBzdHJpbmdzIGluIEFSR0MgJiBBUkdWIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucyBpbiBBUkdQLgorICAgRkxBR1MgaXMgb25lIG9mIHRoZSBBUkdQXyBmbGFncyBhYm92ZS4gIElmIEFSR19JTkRFWCBpcyBub24tTlVMTCwgdGhlCisgICBpbmRleCBpbiBBUkdWIG9mIHRoZSBmaXJzdCB1bnBhcnNlZCBvcHRpb24gaXMgcmV0dXJuZWQgaW4gaXQuICBJZiBhbgorICAgdW5rbm93biBvcHRpb24gaXMgcHJlc2VudCwgQVJHUF9FUlJfVU5LTk9XTiBpcyByZXR1cm5lZDsgaWYgc29tZSBwYXJzZXIKKyAgIHJvdXRpbmUgcmV0dXJuZWQgYSBub24temVybyB2YWx1ZSwgaXQgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSAwIGlzCisgICByZXR1cm5lZC4gIFRoaXMgZnVuY3Rpb24gbWF5IGFsc28gY2FsbCBleGl0IHVubGVzcyB0aGUgQVJHUF9OT19IRUxQIGZsYWcKKyAgIGlzIHNldC4gIElOUFVUIGlzIGEgcG9pbnRlciB0byBhIHZhbHVlIHRvIGJlIHBhc3NlZCBpbiB0byB0aGUgcGFyc2VyLiAgKi8KK2V4dGVybiBlcnJvcl90IGFyZ3BfcGFyc2UgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJICAgaW50IF9fYXJnYywgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd2LAorCQkJICAgdW5zaWduZWQgX19mbGFncywgaW50ICpfX3Jlc3RyaWN0IF9fYXJnX2luZGV4LAorCQkJICAgdm9pZCAqX19yZXN0cmljdCBfX2lucHV0KTsKK2V4dGVybiBlcnJvcl90IF9fYXJncF9wYXJzZSAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCQkgICAgIGludCBfX2FyZ2MsIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJndiwKKwkJCSAgICAgdW5zaWduZWQgX19mbGFncywgaW50ICpfX3Jlc3RyaWN0IF9fYXJnX2luZGV4LAorCQkJICAgICB2b2lkICpfX3Jlc3RyaWN0IF9faW5wdXQpOworDAorLyogR2xvYmFsIHZhcmlhYmxlcy4gICovCisKKy8qIElmIGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0gdG8gYSBub24temVybyB2YWx1ZSwgdGhlbiBhIGRlZmF1bHQKKyAgIG9wdGlvbiAtLXZlcnNpb24gaXMgYWRkZWQgKHVubGVzcyB0aGUgQVJHUF9OT19IRUxQIGZsYWcgaXMgdXNlZCksIHdoaWNoCisgICB3aWxsIHByaW50IHRoaXMgc3RyaW5nIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBhbmQgZXhpdCAodW5sZXNzIHRoZQorICAgQVJHUF9OT19FWElUIGZsYWcgaXMgdXNlZCkuICBPdmVycmlkZGVuIGJ5IEFSR1BfUFJPR1JBTV9WRVJTSU9OX0hPT0suICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX3ZlcnNpb247CisKKy8qIElmIGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0gdG8gYSBub24temVybyB2YWx1ZSwgdGhlbiBhIGRlZmF1bHQKKyAgIG9wdGlvbiAtLXZlcnNpb24gaXMgYWRkZWQgKHVubGVzcyB0aGUgQVJHUF9OT19IRUxQIGZsYWcgaXMgdXNlZCksIHdoaWNoCisgICBjYWxscyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBzdHJlYW0gdG8gcHJpbnQgdGhlIHZlcnNpb24gdG8gYW5kIGEgcG9pbnRlciB0bworICAgdGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgYW5kIHRoZW4gZXhpdHMgKHVubGVzcyB0aGUgQVJHUF9OT19FWElUIGZsYWcgaXMKKyAgIHVzZWQpLiAgVGhpcyB2YXJpYWJsZSB0YWtlcyBwcmVjZWRlbnQgb3ZlciBBUkdQX1BST0dSQU1fVkVSU0lPTi4gICovCitleHRlcm4gdm9pZCAoKmFyZ3BfcHJvZ3JhbV92ZXJzaW9uX2hvb2spIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJCQkgIHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0CisJCQkJCSAgX19zdGF0ZSk7CisKKy8qIElmIGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0sIGl0IHNob3VsZCBwb2ludCB0byBzdHJpbmcgdGhhdCBpcworICAgdGhlIGJ1Zy1yZXBvcnRpbmcgYWRkcmVzcyBmb3IgdGhlIHByb2dyYW0uICBJdCB3aWxsIGJlIHByaW50ZWQgYnkKKyAgIGFyZ3BfaGVscCBpZiB0aGUgQVJHUF9IRUxQX0JVR19BRERSIGZsYWcgaXMgc2V0IChhcyBpdCBpcyBieSB2YXJpb3VzCisgICBzdGFuZGFyZCBoZWxwIG1lc3NhZ2VzKSwgZW1iZWRkZWQgaW4gYSBzZW50ZW5jZSB0aGF0IHNheXMgc29tZXRoaW5nIGxpa2UKKyAgIGBSZXBvcnQgYnVncyB0byBBRERSLicuICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqYXJncF9wcm9ncmFtX2J1Z19hZGRyZXNzOworCisvKiBUaGUgZXhpdCBzdGF0dXMgdGhhdCBhcmdwIHdpbGwgdXNlIHdoZW4gZXhpdGluZyBkdWUgdG8gYSBwYXJzaW5nIGVycm9yLgorICAgSWYgbm90IGRlZmluZWQgb3Igc2V0IGJ5IHRoZSB1c2VyIHByb2dyYW0sIHRoaXMgZGVmYXVsdHMgdG8gRVhfVVNBR0UgZnJvbQorICAgPHN5c2V4aXRzLmg+LiAgKi8KK2V4dGVybiBlcnJvcl90IGFyZ3BfZXJyX2V4aXRfc3RhdHVzOworDAorLyogRmxhZ3MgZm9yIGFyZ3BfaGVscC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9VU0FHRQkJMHgwMSAvKiBhIFVzYWdlOiBtZXNzYWdlLiAqLworI2RlZmluZSBBUkdQX0hFTFBfU0hPUlRfVVNBR0UJMHgwMiAvKiAgIiBidXQgZG9uJ3QgYWN0dWFsbHkgcHJpbnQgb3B0aW9ucy4gKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1NFRQkJMHgwNCAvKiBhIGBUcnkgLi4uIGZvciBtb3JlIGhlbHAnIG1lc3NhZ2UuICovCisjZGVmaW5lIEFSR1BfSEVMUF9MT05HCQkweDA4IC8qIGEgbG9uZyBoZWxwIG1lc3NhZ2UuICovCisjZGVmaW5lIEFSR1BfSEVMUF9QUkVfRE9DCTB4MTAgLyogZG9jIHN0cmluZyBwcmVjZWRpbmcgbG9uZyBoZWxwLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1BPU1RfRE9DCTB4MjAgLyogZG9jIHN0cmluZyBmb2xsb3dpbmcgbG9uZyBoZWxwLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0RPQwkJKEFSR1BfSEVMUF9QUkVfRE9DIHwgQVJHUF9IRUxQX1BPU1RfRE9DKQorI2RlZmluZSBBUkdQX0hFTFBfQlVHX0FERFIJMHg0MCAvKiBidWcgcmVwb3J0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0xPTkdfT05MWQkweDgwIC8qIG1vZGlmeSBvdXRwdXQgYXBwcm9wcmlhdGVseSB0bworCQkJCQlyZWZsZWN0IEFSR1BfTE9OR19PTkxZIG1vZGUuICAqLworCisvKiBUaGVzZSBBUkdQX0hFTFAgZmxhZ3MgYXJlIG9ubHkgdW5kZXJzdG9vZCBieSBhcmdwX3N0YXRlX2hlbHAuICAqLworI2RlZmluZSBBUkdQX0hFTFBfRVhJVF9FUlIJMHgxMDAgLyogQ2FsbCBleGl0KDEpIGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX0VYSVRfT0sJMHgyMDAgLyogQ2FsbCBleGl0KDApIGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKi8KKworLyogVGhlIHN0YW5kYXJkIHRoaW5nIHRvIGRvIGFmdGVyIGEgcHJvZ3JhbSBjb21tYW5kIGxpbmUgcGFyc2luZyBlcnJvciwgaWYgYW4KKyAgIGVycm9yIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkLiAgKi8KKyNkZWZpbmUgQVJHUF9IRUxQX1NURF9FUlIgXAorICAoQVJHUF9IRUxQX1NFRSB8IEFSR1BfSEVMUF9FWElUX0VSUikKKy8qIFRoZSBzdGFuZGFyZCB0aGluZyB0byBkbyBhZnRlciBhIHByb2dyYW0gY29tbWFuZCBsaW5lIHBhcnNpbmcgZXJyb3IsIGlmIG5vCisgICBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgaGFzIGJlZW4gcHJpbnRlZC4gICovCisjZGVmaW5lIEFSR1BfSEVMUF9TVERfVVNBR0UgXAorICAoQVJHUF9IRUxQX1NIT1JUX1VTQUdFIHwgQVJHUF9IRUxQX1NFRSB8IEFSR1BfSEVMUF9FWElUX0VSUikKKy8qIFRoZSBzdGFuZGFyZCB0aGluZyB0byBkbyBpbiByZXNwb25zZSB0byBhIC0taGVscCBvcHRpb24uICAqLworI2RlZmluZSBBUkdQX0hFTFBfU1REX0hFTFAgXAorICAoQVJHUF9IRUxQX1NIT1JUX1VTQUdFIHwgQVJHUF9IRUxQX0xPTkcgfCBBUkdQX0hFTFBfRVhJVF9PSyBcCisgICB8IEFSR1BfSEVMUF9ET0MgfCBBUkdQX0hFTFBfQlVHX0FERFIpCisKKy8qIE91dHB1dCBhIHVzYWdlIG1lc3NhZ2UgZm9yIEFSR1AgdG8gU1RSRUFNLiAgRkxBR1MgYXJlIGZyb20gdGhlIHNldAorICAgQVJHUF9IRUxQXyouICAqLworZXh0ZXJuIHZvaWQgYXJncF9oZWxwIChfX2NvbnN0IHN0cnVjdCBhcmdwICpfX3Jlc3RyaWN0IF9fYXJncCwKKwkJICAgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICAgICB1bnNpZ25lZCBfX2ZsYWdzLCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSk7CitleHRlcm4gdm9pZCBfX2FyZ3BfaGVscCAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCQkgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgdW5zaWduZWQgX19mbGFncywKKwkJCSBjaGFyICpfX25hbWUpOworDAorLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIGFuIGFyZ3AKKyAgIHBhcnNpbmcgcm91dGluZSAodGh1cyB0YWtpbmcgYW4gYXJncF9zdGF0ZSBzdHJ1Y3R1cmUgYXMgdGhlIGZpcnN0CisgICBhcmd1bWVudCkuICBUaGV5IG1heSBvciBtYXkgbm90IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQsIGRlcGVuZGluZworICAgb24gdGhlIGZsYWdzIGluIFNUQVRFIC0tIGluIGFueSBjYXNlLCB0aGUgY2FsbGVyIHNob3VsZCBiZSBwcmVwYXJlZCBmb3IKKyAgIHRoZW0gKm5vdCogdG8gZXhpdCwgYW5kIHNob3VsZCByZXR1cm4gYW4gYXBwcm9waWF0ZSBlcnJvciBhZnRlciBjYWxsaW5nCisgICB0aGVtLiAgW2FyZ3BfdXNhZ2UgJiBhcmdwX2Vycm9yIHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgYXJncF9zdGF0ZV8uLi4sCisgICBidXQgdGhleSdyZSB1c2VkIG9mdGVuIGVub3VnaCB0aGF0IHRoZXkgc2hvdWxkIGJlIHNob3J0XSAgKi8KKworLyogT3V0cHV0LCBpZiBhcHByb3ByaWF0ZSwgYSB1c2FnZSBtZXNzYWdlIGZvciBTVEFURSB0byBTVFJFQU0uICBGTEFHUyBhcmUKKyAgIGZyb20gdGhlIHNldCBBUkdQX0hFTFBfKi4gICovCitleHRlcm4gdm9pZCBhcmdwX3N0YXRlX2hlbHAgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworZXh0ZXJuIHZvaWQgX19hcmdwX3N0YXRlX2hlbHAgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworLyogUG9zc2libHkgb3V0cHV0IHRoZSBzdGFuZGFyZCB1c2FnZSBtZXNzYWdlIGZvciBBUkdQIHRvIHN0ZGVyciBhbmQgZXhpdC4gICovCitleHRlcm4gdm9pZCBhcmdwX3VzYWdlIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3N0YXRlKTsKK2V4dGVybiB2b2lkIF9fYXJncF91c2FnZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19zdGF0ZSk7CisKKy8qIElmIGFwcHJvcHJpYXRlLCBwcmludCB0aGUgcHJpbnRmIHN0cmluZyBGTVQgYW5kIGZvbGxvd2luZyBhcmdzLCBwcmVjZWRlZAorICAgYnkgdGhlIHByb2dyYW0gbmFtZSBhbmQgYDonLCB0byBzdGRlcnIsIGFuZCBmb2xsb3dlZCBieSBhIGBUcnkgLi4uIC0taGVscCcKKyAgIG1lc3NhZ2UsIHRoZW4gZXhpdCAoMSkuICAqLworZXh0ZXJuIHZvaWQgYXJncF9lcnJvciAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpOworZXh0ZXJuIHZvaWQgX19hcmdwX2Vycm9yIChfX2NvbnN0IHN0cnVjdCBhcmdwX3N0YXRlICpfX3Jlc3RyaWN0IF9fc3RhdGUsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKKworLyogU2ltaWxhciB0byB0aGUgc3RhbmRhcmQgZ251IGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbiBlcnJvcigpLCBidXQgd2lsbAorICAgcmVzcGVjdCB0aGUgQVJHUF9OT19FWElUIGFuZCBBUkdQX05PX0VSUlMgZmxhZ3MgaW4gU1RBVEUsIGFuZCB3aWxsIHByaW50CisgICB0byBTVEFURS0+ZXJyX3N0cmVhbS4gIFRoaXMgaXMgdXNlZnVsIGZvciBhcmd1bWVudCBwYXJzaW5nIGNvZGUgdGhhdCBpcworICAgc2hhcmVkIGJldHdlZW4gcHJvZ3JhbSBzdGFydHVwICh3aGVuIGV4aXRpbmcgaXMgZGVzaXJlZCkgYW5kIHJ1bnRpbWUKKyAgIG9wdGlvbiBwYXJzaW5nICh3aGVuIHR5cGljYWxseSBhbiBlcnJvciBjb2RlIGlzIHJldHVybmVkIGluc3RlYWQpLiAgVGhlCisgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBmdW5jdGlvbiBhbmQgYXJncF9lcnJvciBpcyB0aGF0IHRoZSBsYXR0ZXIgaXMgZm9yCisgICAqcGFyc2luZyBlcnJvcnMqLCBhbmQgdGhlIGZvcm1lciBpcyBmb3Igb3RoZXIgcHJvYmxlbXMgdGhhdCBvY2N1ciBkdXJpbmcKKyAgIHBhcnNpbmcgYnV0IGRvbid0IHJlZmxlY3QgYSAoc3ludGFjdGljKSBwcm9ibGVtIHdpdGggdGhlIGlucHV0LiAgKi8KK2V4dGVybiB2b2lkIGFyZ3BfZmFpbHVyZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlLAorCQkJICBpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA0LCA1KSkpOworZXh0ZXJuIHZvaWQgX19hcmdwX2ZhaWx1cmUgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSwKKwkJCSAgICBpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDQsIDUpKSk7CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3B0aW9uIE9QVCBpcyBhIHZhbGlkIHNob3J0IG9wdGlvbi4gICovCitleHRlcm4gaW50IF9vcHRpb25faXNfc2hvcnQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKK2V4dGVybiBpbnQgX19vcHRpb25faXNfc2hvcnQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKKworLyogUmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb24gT1BUIGlzIGluIGZhY3QgdGhlIGxhc3QgKHVudXNlZCkgZW50cnkgaW4gYW4KKyAgIG9wdGlvbnMgYXJyYXkuICAqLworZXh0ZXJuIGludCBfb3B0aW9uX2lzX2VuZCAoX19jb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gKl9fb3B0KSBfX1RIUk9XOworZXh0ZXJuIGludCBfX29wdGlvbl9pc19lbmQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBpbnB1dCBmaWVsZCBmb3IgQVJHUCBpbiB0aGUgcGFyc2VyIGNvcnJlc3BvbmRpbmcgdG8gU1RBVEU7IHVzZWQKKyAgIGJ5IHRoZSBoZWxwIHJvdXRpbmVzLiAgKi8KK2V4dGVybiB2b2lkICpfYXJncF9pbnB1dCAoX19jb25zdCBzdHJ1Y3QgYXJncCAqX19yZXN0cmljdCBfX2FyZ3AsCisJCQkgIF9fY29uc3Qgc3RydWN0IGFyZ3Bfc3RhdGUgKl9fcmVzdHJpY3QgX19zdGF0ZSkKKyAgICAgX19USFJPVzsKK2V4dGVybiB2b2lkICpfX2FyZ3BfaW5wdXQgKF9fY29uc3Qgc3RydWN0IGFyZ3AgKl9fcmVzdHJpY3QgX19hcmdwLAorCQkJICAgX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19yZXN0cmljdCBfX3N0YXRlKQorICAgICBfX1RIUk9XOworDAorI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisKKyMgaWYgIV9MSUJDCisjICBkZWZpbmUgX19hcmdwX3VzYWdlIGFyZ3BfdXNhZ2UKKyMgIGRlZmluZSBfX2FyZ3Bfc3RhdGVfaGVscCBhcmdwX3N0YXRlX2hlbHAKKyMgIGRlZmluZSBfX29wdGlvbl9pc19zaG9ydCBfb3B0aW9uX2lzX3Nob3J0CisjICBkZWZpbmUgX19vcHRpb25faXNfZW5kIF9vcHRpb25faXNfZW5kCisjIGVuZGlmCisKKyMgaWZuZGVmIEFSR1BfRUkKKyMgIGRlZmluZSBBUkdQX0VJIF9fZXh0ZXJuX2lubGluZQorIyBlbmRpZgorCitBUkdQX0VJIHZvaWQKK19fYXJncF91c2FnZSAoX19jb25zdCBzdHJ1Y3QgYXJncF9zdGF0ZSAqX19zdGF0ZSkKK3sKKyAgX19hcmdwX3N0YXRlX2hlbHAgKF9fc3RhdGUsIHN0ZGVyciwgQVJHUF9IRUxQX1NURF9VU0FHRSk7Cit9CisKK0FSR1BfRUkgaW50CitfX05USCAoX19vcHRpb25faXNfc2hvcnQgKF9fY29uc3Qgc3RydWN0IGFyZ3Bfb3B0aW9uICpfX29wdCkpCit7CisgIGlmIChfX29wdC0+ZmxhZ3MgJiBPUFRJT05fRE9DKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgeworICAgICAgaW50IF9fa2V5ID0gX19vcHQtPmtleTsKKyAgICAgIHJldHVybiBfX2tleSA+IDAgJiYgX19rZXkgPD0gVUNIQVJfTUFYICYmIGlzcHJpbnQgKF9fa2V5KTsKKyAgICB9Cit9CisKK0FSR1BfRUkgaW50CitfX05USCAoX19vcHRpb25faXNfZW5kIChfX2NvbnN0IHN0cnVjdCBhcmdwX29wdGlvbiAqX19vcHQpKQoreworICByZXR1cm4gIV9fb3B0LT5rZXkgJiYgIV9fb3B0LT5uYW1lICYmICFfX29wdC0+ZG9jICYmICFfX29wdC0+Z3JvdXA7Cit9CisKKyMgaWYgIV9MSUJDCisjICB1bmRlZiBfX2FyZ3BfdXNhZ2UKKyMgIHVuZGVmIF9fYXJncF9zdGF0ZV9oZWxwCisjICB1bmRlZiBfX29wdGlvbl9pc19zaG9ydAorIyAgdW5kZWYgX19vcHRpb25faXNfZW5kCisjIGVuZGlmCisjZW5kaWYgLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBhcmdwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJnei5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcmd6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJnei5oCkBAIC0wLDAgKzEsMTg3IEBACisvKiBSb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3JzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDk2LDk3LDk4LDk5LDIwMDAsMjAwNCwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9BUkdaX0gKKyNkZWZpbmUgX0FSR1pfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9lcnJvcl90CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4JCS8qIE5lZWQgc2l6ZV90LCBhbmQgc3RyY2hyIGlzIGNhbGxlZCBiZWxvdy4gICovCisKKyNpZm5kZWYgX19jb25zdAorIyBkZWZpbmUgX19jb25zdCBjb25zdAorI2VuZGlmCisKKyNpZm5kZWYgX19lcnJvcl90X2RlZmluZWQKK3R5cGVkZWYgaW50IGVycm9yX3Q7CisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIE1ha2UgYSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIGZyb20gYSB1bml4IGFyZ3YgdmVjdG9yLCByZXR1cm5pbmcgaXQgaW4KKyAgIEFSR1osIGFuZCB0aGUgdG90YWwgbGVuZ3RoIGluIExFTi4gIElmIGEgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3Igb2NjdXJzLAorICAgRU5PTUVNIGlzIHJldHVybmVkLCBvdGhlcndpc2UgMC4gIFRoZSByZXN1bHQgY2FuIGJlIGRlc3Ryb3llZCB1c2luZyBmcmVlLiAqLworZXh0ZXJuIGVycm9yX3QgX19hcmd6X2NyZWF0ZSAoY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fbGVuKSBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9jcmVhdGUgKGNoYXIgKl9fY29uc3QgX19hcmd2W10sIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKy8qIE1ha2UgYSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIGZyb20gYSBTRVAgc2VwYXJhdGVkIGxpc3QgaW4KKyAgIFNUUklORywgcmV0dXJuaW5nIGl0IGluIEFSR1osIGFuZCB0aGUgdG90YWwgbGVuZ3RoIGluIExFTi4gIElmIGEKKyAgIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIG9jY3VycywgRU5PTUVNIGlzIHJldHVybmVkLCBvdGhlcndpc2UgMC4KKyAgIFRoZSByZXN1bHQgY2FuIGJlIGRlc3Ryb3llZCB1c2luZyBmcmVlLiAgKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9jcmVhdGVfc2VwIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsCisJCQkJICBpbnQgX19zZXAsIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCQkgIHNpemVfdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfY3JlYXRlX3NlcCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyaW5nLAorCQkJCWludCBfX3NlcCwgY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJCXNpemVfdCAqX19yZXN0cmljdCBfX2xlbikgX19USFJPVzsKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gQVJHWi4gICovCitleHRlcm4gc2l6ZV90IF9fYXJnel9jb3VudCAoX19jb25zdCBjaGFyICpfX2FyZ3osIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CitleHRlcm4gc2l6ZV90IGFyZ3pfY291bnQgKF9fY29uc3QgY2hhciAqX19hcmd6LCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBQdXRzIHBvaW50ZXJzIHRvIGVhY2ggc3RyaW5nIGluIEFSR1ogaW50byBBUkdWLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaAorICAgdG8gaG9sZCB0aGVtIGFsbC4gICovCitleHRlcm4gdm9pZCBfX2FyZ3pfZXh0cmFjdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fYXJneiwgc2l6ZV90IF9fbGVuLAorCQkJICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJndikgX19USFJPVzsKK2V4dGVybiB2b2lkIGFyZ3pfZXh0cmFjdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fYXJneiwgc2l6ZV90IF9fbGVuLAorCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2FyZ3YpIF9fVEhST1c7CisKKy8qIE1ha2UgJ1wwJyBzZXBhcmF0ZWQgYXJnIHZlY3RvciBBUkdaIHByaW50YWJsZSBieSBjb252ZXJ0aW5nIGFsbCB0aGUgJ1wwJ3MKKyAgIGV4Y2VwdCB0aGUgbGFzdCBpbnRvIHRoZSBjaGFyYWN0ZXIgU0VQLiAgKi8KK2V4dGVybiB2b2lkIF9fYXJnel9zdHJpbmdpZnkgKGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fbGVuLCBpbnQgX19zZXApIF9fVEhST1c7CitleHRlcm4gdm9pZCBhcmd6X3N0cmluZ2lmeSAoY2hhciAqX19hcmd6LCBzaXplX3QgX19sZW4sIGludCBfX3NlcCkgX19USFJPVzsKKworLyogQXBwZW5kIEJVRiwgb2YgbGVuZ3RoIEJVRl9MRU4gdG8gdGhlIGFyZ3ogdmVjdG9yIGluIEFSR1ogJiBBUkdaX0xFTi4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfYXBwZW5kIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9idWZfbGVuKQorICAgICBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9hcHBlbmQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1Zl9sZW4pCisgICAgIF9fVEhST1c7CisKKy8qIEFwcGVuZCBTVFIgdG8gdGhlIGFyZ3ogdmVjdG9yIGluIEFSR1ogJiBBUkdaX0xFTi4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfYWRkIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cikgX19USFJPVzsKK2V4dGVybiBlcnJvcl90IGFyZ3pfYWRkIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyKSBfX1RIUk9XOworCisvKiBBcHBlbmQgU0VQIHNlcGFyYXRlZCBsaXN0IGluIFNUUklORyB0byB0aGUgYXJneiB2ZWN0b3IgaW4gQVJHWiAmCisgICBBUkdaX0xFTi4gICovCitleHRlcm4gZXJyb3JfdCBfX2FyZ3pfYWRkX3NlcCAoY2hhciAqKl9fcmVzdHJpY3QgX19hcmd6LAorCQkJICAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgaW50IF9fZGVsaW0pCisgICAgIF9fVEhST1c7CitleHRlcm4gZXJyb3JfdCBhcmd6X2FkZF9zZXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgaW50IF9fZGVsaW0pCisgICAgIF9fVEhST1c7CisKKy8qIERlbGV0ZSBFTlRSWSBmcm9tIEFSR1ogJiBBUkdaX0xFTiwgaWYgaXQgYXBwZWFycyB0aGVyZS4gICovCitleHRlcm4gdm9pZCBfX2FyZ3pfZGVsZXRlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKK2V4dGVybiB2b2lkIGFyZ3pfZGVsZXRlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworCisvKiBJbnNlcnQgRU5UUlkgaW50byBBUkdaICYgQVJHWl9MRU4gYmVmb3JlIEJFRk9SRSwgd2hpY2ggc2hvdWxkIGJlIGFuCisgICBleGlzdGluZyBlbnRyeSBpbiBBUkdaOyBpZiBCRUZPUkUgaXMgTlVMTCwgRU5UUlkgaXMgYXBwZW5kZWQgdG8gdGhlIGVuZC4KKyAgIFNpbmNlIEFSR1oncyBmaXJzdCBlbnRyeSBpcyB0aGUgc2FtZSBhcyBBUkdaLCBhcmd6X2luc2VydCAoQVJHWiwgQVJHWl9MRU4sCisgICBBUkdaLCBFTlRSWSkgd2lsbCBpbnNlcnQgRU5UUlkgYXQgdGhlIGJlZ2lubmluZyBvZiBBUkdaLiAgSWYgQkVGT1JFIGlzIG5vdAorICAgaW4gQVJHWiwgRUlOVkFMIGlzIHJldHVybmVkLCBlbHNlIGlmIG1lbW9yeSBjYW4ndCBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBuZXcKKyAgIEFSR1osIEVOT01FTSBpcyByZXR1cm5lZCwgZWxzZSAwLiAgKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9pbnNlcnQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2FyZ3pfbGVuLAorCQkJICAgICAgY2hhciAqX19yZXN0cmljdCBfX2JlZm9yZSwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworZXh0ZXJuIGVycm9yX3QgYXJnel9pbnNlcnQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19hcmd6X2xlbiwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYmVmb3JlLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2VudHJ5KSBfX1RIUk9XOworCisvKiBSZXBsYWNlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIFNUUiBpbiBBUkdaIHdpdGggV0lUSCwgcmVhbGxvY2F0aW5nCisgICBBUkdaIGFzIG5lY2Vzc2FyeS4gIElmIFJFUExBQ0VfQ09VTlQgaXMgbm9uLXplcm8sICpSRVBMQUNFX0NPVU5UIHdpbGwgYmUKKyAgIGluY3JlbWVudGVkIGJ5IG51bWJlciBvZiByZXBsYWNlbWVudHMgcGVyZm9ybWVkLiAgKi8KK2V4dGVybiBlcnJvcl90IF9fYXJnel9yZXBsYWNlIChjaGFyICoqX19yZXN0cmljdCBfX2FyZ3osCisJCQkgICAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3RyLAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3dpdGgsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpfX3Jlc3RyaWN0IF9fcmVwbGFjZV9jb3VudCk7CitleHRlcm4gZXJyb3JfdCBhcmd6X3JlcGxhY2UgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYXJneiwKKwkJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fYXJnel9sZW4sCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0ciwKKwkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fd2l0aCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpfX3Jlc3RyaWN0IF9fcmVwbGFjZV9jb3VudCk7CisMCisvKiBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGluIEFSR1ogJiBBUkdaX0xFTiBhZnRlciBFTlRSWSwgb3IgTlVMTCBpZiB0aGVyZQorICAgYXJlIG5vIG1vcmUuICBJZiBlbnRyeSBpcyBOVUxMLCB0aGVuIHRoZSBmaXJzdCBlbnRyeSBpcyByZXR1cm5lZC4gIFRoaXMKKyAgIGJlaGF2aW9yIGFsbG93cyB0d28gY29udmVuaWVudCBpdGVyYXRpb24gc3R5bGVzOgorCisgICAgY2hhciAqZW50cnkgPSAwOworICAgIHdoaWxlICgoZW50cnkgPSBhcmd6X25leHQgKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkpKQorICAgICAgLi4uOworCisgICBvcgorCisgICAgY2hhciAqZW50cnk7CisgICAgZm9yIChlbnRyeSA9IGFyZ3o7IGVudHJ5OyBlbnRyeSA9IGFyZ3pfbmV4dCAoYXJneiwgYXJnel9sZW4sIGVudHJ5KSkKKyAgICAgIC4uLjsKKyovCitleHRlcm4gY2hhciAqX19hcmd6X25leHQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2FyZ3osIHNpemVfdCBfX2FyZ3pfbGVuLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnRyeSkgX19USFJPVzsKK2V4dGVybiBjaGFyICphcmd6X25leHQgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2FyZ3osIHNpemVfdCBfX2FyZ3pfbGVuLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZW50cnkpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworX19leHRlcm5faW5saW5lIGNoYXIgKgorX19OVEggKF9fYXJnel9uZXh0IChfX2NvbnN0IGNoYXIgKl9fYXJneiwgc2l6ZV90IF9fYXJnel9sZW4sCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fZW50cnkpKQoreworICBpZiAoX19lbnRyeSkKKyAgICB7CisgICAgICBpZiAoX19lbnRyeSA8IF9fYXJneiArIF9fYXJnel9sZW4pCisJX19lbnRyeSA9IHN0cmNociAoX19lbnRyeSwgJ1wwJykgKyAxOworCisgICAgICByZXR1cm4gX19lbnRyeSA+PSBfX2FyZ3ogKyBfX2FyZ3pfbGVuID8gKGNoYXIgKikgTlVMTCA6IChjaGFyICopIF9fZW50cnk7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIF9fYXJnel9sZW4gPiAwID8gKGNoYXIgKikgX19hcmd6IDogMDsKK30KK19fZXh0ZXJuX2lubGluZSBjaGFyICoKK19fTlRIIChhcmd6X25leHQgKF9fY29uc3QgY2hhciAqX19hcmd6LCBzaXplX3QgX19hcmd6X2xlbiwKKwkJICBfX2NvbnN0IGNoYXIgKl9fZW50cnkpKQoreworICByZXR1cm4gX19hcmd6X25leHQgKF9fYXJneiwgX19hcmd6X2xlbiwgX19lbnRyeSk7Cit9CisjZW5kaWYgLyogVXNlIGV4dGVybiBpbmxpbmVzLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGFyZ3ouaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2Z0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL2Z0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvZnRwLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpZnRwLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfQVJQQV9GVFBfSAorI2RlZmluZQlfQVJQQV9GVFBfSCAxCisKKy8qIERlZmluaXRpb25zIGZvciBGVFA7IHNlZSBSRkMtNzY1LiAqLworCisvKgorICogUmVwbHkgY29kZXMuCisgKi8KKyNkZWZpbmUgUFJFTElNCQkxCS8qIHBvc2l0aXZlIHByZWxpbWluYXJ5ICovCisjZGVmaW5lIENPTVBMRVRFCTIJLyogcG9zaXRpdmUgY29tcGxldGlvbiAqLworI2RlZmluZSBDT05USU5VRQkzCS8qIHBvc2l0aXZlIGludGVybWVkaWF0ZSAqLworI2RlZmluZSBUUkFOU0lFTlQJNAkvKiB0cmFuc2llbnQgbmVnYXRpdmUgY29tcGxldGlvbiAqLworI2RlZmluZSBFUlJPUgkJNQkvKiBwZXJtYW5lbnQgbmVnYXRpdmUgY29tcGxldGlvbiAqLworCisvKgorICogVHlwZSBjb2RlcworICovCisjZGVmaW5lCVRZUEVfQQkJMQkvKiBBU0NJSSAqLworI2RlZmluZQlUWVBFX0UJCTIJLyogRUJDRElDICovCisjZGVmaW5lCVRZUEVfSQkJMwkvKiBpbWFnZSAqLworI2RlZmluZQlUWVBFX0wJCTQJLyogbG9jYWwgYnl0ZSBzaXplICovCisKKyNpZmRlZiBGVFBfTkFNRVMKK2NoYXIgKnR5cGVuYW1lc1tdID0gIHsiMCIsICJBU0NJSSIsICJFQkNESUMiLCAiSW1hZ2UiLCAiTG9jYWwiIH07CisjZW5kaWYKKworLyoKKyAqIEZvcm0gY29kZXMKKyAqLworI2RlZmluZQlGT1JNX04JCTEJLyogbm9uLXByaW50ICovCisjZGVmaW5lCUZPUk1fVAkJMgkvKiB0ZWxuZXQgZm9ybWF0IGVmZmVjdG9ycyAqLworI2RlZmluZQlGT1JNX0MJCTMJLyogY2FycmlhZ2UgY29udHJvbCAoQVNBKSAqLworI2lmZGVmIEZUUF9OQU1FUworY2hhciAqZm9ybW5hbWVzW10gPSAgeyIwIiwgIk5vbnByaW50IiwgIlRlbG5ldCIsICJDYXJyaWFnZS1jb250cm9sIiB9OworI2VuZGlmCisKKy8qCisgKiBTdHJ1Y3R1cmUgY29kZXMKKyAqLworI2RlZmluZQlTVFJVX0YJCTEJLyogZmlsZSAobm8gcmVjb3JkIHN0cnVjdHVyZSkgKi8KKyNkZWZpbmUJU1RSVV9SCQkyCS8qIHJlY29yZCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJU1RSVV9QCQkzCS8qIHBhZ2Ugc3RydWN0dXJlICovCisjaWZkZWYgRlRQX05BTUVTCitjaGFyICpzdHJ1bmFtZXNbXSA9ICB7IjAiLCAiRmlsZSIsICJSZWNvcmQiLCAiUGFnZSIgfTsKKyNlbmRpZgorCisvKgorICogTW9kZSB0eXBlcworICovCisjZGVmaW5lCU1PREVfUwkJMQkvKiBzdHJlYW0gKi8KKyNkZWZpbmUJTU9ERV9CCQkyCS8qIGJsb2NrICovCisjZGVmaW5lCU1PREVfQwkJMwkvKiBjb21wcmVzc2VkICovCisjaWZkZWYgRlRQX05BTUVTCitjaGFyICptb2RlbmFtZXNbXSA9ICB7IjAiLCAiU3RyZWFtIiwgIkJsb2NrIiwgIkNvbXByZXNzZWQiIH07CisjZW5kaWYKKworLyoKKyAqIFJlY29yZCBUb2tlbnMKKyAqLworI2RlZmluZQlSRUNfRVNDCQknXDM3NycJLyogUmVjb3JkLW1vZGUgRXNjYXBlICovCisjZGVmaW5lCVJFQ19FT1IJCSdcMDAxJwkvKiBSZWNvcmQtbW9kZSBFbmQtb2YtUmVjb3JkICovCisjZGVmaW5lIFJFQ19FT0YJCSdcMDAyJwkvKiBSZWNvcmQtbW9kZSBFbmQtb2YtRmlsZSAqLworCisvKgorICogQmxvY2sgSGVhZGVyCisgKi8KKyNkZWZpbmUJQkxLX0VPUgkJMHg4MAkvKiBCbG9jayBpcyBFbmQtb2YtUmVjb3JkICovCisjZGVmaW5lCUJMS19FT0YJCTB4NDAJLyogQmxvY2sgaXMgRW5kLW9mLUZpbGUgKi8KKyNkZWZpbmUgQkxLX0VSUk9SUwkweDIwCS8qIEJsb2NrIGlzIHN1c3BlY3RlZCBvZiBjb250YWluaW5nIGVycm9ycyAqLworI2RlZmluZQlCTEtfUkVTVEFSVAkweDEwCS8qIEJsb2NrIGlzIFJlc3RhcnQgTWFya2VyICovCisKKyNkZWZpbmUJQkxLX0JZVEVDT1VOVAkyCS8qIEJ5dGVzIGluIHRoaXMgYmxvY2sgKi8KKworI2VuZGlmIC8qIGFycGEvZnRwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9pbmV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvaW5ldC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0FSUEFfSU5FVF9ICisjZGVmaW5lCV9BUlBBX0lORVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4JCS8qIFRvIGRlZmluZSBgc3RydWN0IGluX2FkZHInLiAgKi8KKworLyogVHlwZSBmb3IgbGVuZ3RoIGFyZ3VtZW50cyBpbiBzb2NrZXQgY2FsbHMuICAqLworI2lmbmRlZiBfX3NvY2tsZW5fdF9kZWZpbmVkCit0eXBlZGVmIF9fc29ja2xlbl90IHNvY2tsZW5fdDsKKyMgZGVmaW5lIF9fc29ja2xlbl90X2RlZmluZWQKKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnZlcnQgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGZyb20gbnVtYmVycy1hbmQtZG90cyBub3RhdGlvbiBpbiBDUAorICAgaW50byBiaW5hcnkgZGF0YSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICAqLworZXh0ZXJuIGluX2FkZHJfdCBpbmV0X2FkZHIgKF9fY29uc3QgY2hhciAqX19jcCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBsb2NhbCBob3N0IGFkZHJlc3MgcGFydCBvZiB0aGUgSW50ZXJuZXQgYWRkcmVzcyBpbiBJTi4gICovCitleHRlcm4gaW5fYWRkcl90IGluZXRfbG5hb2YgKHN0cnVjdCBpbl9hZGRyIF9faW4pIF9fVEhST1c7CisKKy8qIE1ha2UgSW50ZXJuZXQgaG9zdCBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciBieSBjb21iaW5pbmcgdGhlCisgICBuZXR3b3JrIG51bWJlciBORVQgd2l0aCB0aGUgbG9jYWwgYWRkcmVzcyBIT1NULiAgKi8KK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciBpbmV0X21ha2VhZGRyIChpbl9hZGRyX3QgX19uZXQsIGluX2FkZHJfdCBfX2hvc3QpCisgICAgIF9fVEhST1c7CisKKy8qIFJldHVybiBuZXR3b3JrIG51bWJlciBwYXJ0IG9mIHRoZSBJbnRlcm5ldCBhZGRyZXNzIElOLiAgKi8KK2V4dGVybiBpbl9hZGRyX3QgaW5ldF9uZXRvZiAoc3RydWN0IGluX2FkZHIgX19pbikgX19USFJPVzsKKworLyogRXh0cmFjdCB0aGUgbmV0d29yayBudW1iZXIgaW4gbmV0d29yayBieXRlIG9yZGVyIGZyb20gdGhlIGFkZHJlc3MKKyAgIGluIG51bWJlcnMtYW5kLWRvdHMgbmF0YXRpb24gc3RhcnRpbmcgYXQgQ1AuICAqLworZXh0ZXJuIGluX2FkZHJfdCBpbmV0X25ldHdvcmsgKF9fY29uc3QgY2hhciAqX19jcCkgX19USFJPVzsKKworLyogQ29udmVydCBJbnRlcm5ldCBudW1iZXIgaW4gSU4gdG8gQVNDSUkgcmVwcmVzZW50YXRpb24uICBUaGUgcmV0dXJuIHZhbHVlCisgICBpcyBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgYXJyYXkgY29udGFpbmluZyB0aGUgc3RyaW5nLiAgKi8KK2V4dGVybiBjaGFyICppbmV0X250b2EgKHN0cnVjdCBpbl9hZGRyIF9faW4pIF9fVEhST1c7CisKKy8qIENvbnZlcnQgZnJvbSBwcmVzZW50YXRpb24gZm9ybWF0IG9mIGFuIEludGVybmV0IG51bWJlciBpbiBidWZmZXIKKyAgIHN0YXJ0aW5nIGF0IENQIHRvIHRoZSBiaW5hcnkgbmV0d29yayBmb3JtYXQgYW5kIHN0b3JlIHJlc3VsdCBmb3IKKyAgIGludGVyZmFjZSB0eXBlIEFGIGluIGJ1ZmZlciBzdGFydGluZyBhdCBCVUYuICAqLworZXh0ZXJuIGludCBpbmV0X3B0b24gKGludCBfX2FmLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jcCwKKwkJICAgICAgdm9pZCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVzsKKworLyogQ29udmVydCBhIEludGVybmV0IGFkZHJlc3MgaW4gYmluYXJ5IG5ldHdvcmsgZm9ybWF0IGZvciBpbnRlcmZhY2UKKyAgIHR5cGUgQUYgaW4gYnVmZmVyIHN0YXJ0aW5nIGF0IENQIHRvIHByZXNlbnRhdGlvbiBmb3JtIGFuZCBwbGFjZQorICAgcmVzdWx0IGluIGJ1ZmZlciBvZiBsZW5ndGggTEVOIGFzdGFydGluZyBhdCBCVUYuICAqLworZXh0ZXJuIF9fY29uc3QgY2hhciAqaW5ldF9udG9wIChpbnQgX19hZiwgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fY3AsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc29ja2xlbl90IF9fbGVuKQorICAgICBfX1RIUk9XOworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBYTlMgNS4yLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBDb252ZXJ0IEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIG51bWJlcnMtYW5kLWRvdHMgbm90YXRpb24gaW4gQ1AKKyAgIGludG8gYmluYXJ5IGRhdGEgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlIHN0cnVjdHVyZSBJTlAuICAqLworZXh0ZXJuIGludCBpbmV0X2F0b24gKF9fY29uc3QgY2hhciAqX19jcCwgc3RydWN0IGluX2FkZHIgKl9faW5wKSBfX1RIUk9XOworCisvKiBGb3JtYXQgYSBuZXR3b3JrIG51bWJlciBORVQgaW50byBwcmVzZW50YXRpb24gZm9ybWF0IGFuZCBwbGFjZSByZXN1bHQKKyAgIGluIGJ1ZmZlciBzdGFydGluZyBhdCBCVUYgd2l0aCBsZW5ndGggb2YgTEVOIGJ5dGVzLiAgKi8KK2V4dGVybiBjaGFyICppbmV0X25ldGEgKGluX2FkZHJfdCBfX25ldCwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ29udmVydCBuZXR3b3JrIG51bWJlciBmb3IgaW50ZXJmYWNlIHR5cGUgQUYgaW4gYnVmZmVyIHN0YXJ0aW5nIGF0CisgICBDUCB0byBwcmVzZW50YXRpb24gZm9ybWF0LiAgVGhlIHJlc3VsdCB3aWxsIHNwZWNpZml5IEJJVFMgYml0cyBvZgorICAgdGhlIG51bWJlci4gICovCitleHRlcm4gY2hhciAqaW5ldF9uZXRfbnRvcCAoaW50IF9fYWYsIF9fY29uc3Qgdm9pZCAqX19jcCwgaW50IF9fYml0cywKKwkJCSAgICBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IG5ldHdvcmsgbnVtYmVyIGZvciBpbnRlcmZhY2UgdHlwZSBBRiBmcm9tIHByZXNlbnRhdGlvbiBpbgorICAgYnVmZmVyIHN0YXJ0aW5nIGF0IENQIHRvIG5ldHdvcmsgZm9ybWF0IGFuZCBzdG9yZSByZXN1bHQgaW50CisgICBidWZmZXIgc3RhcnRpbmcgYXQgQlVGIG9mIHNpemUgTEVOLiAgKi8KK2V4dGVybiBpbnQgaW5ldF9uZXRfcHRvbiAoaW50IF9fYWYsIF9fY29uc3QgY2hhciAqX19jcCwKKwkJCSAgdm9pZCAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogQ29udmVydCBBU0NJSSByZXByZXNlbnRhdGlvbiBpbiBoZXhhZGVjaW1hbCBmb3JtIG9mIHRoZSBJbnRlcm5ldAorICAgYWRkcmVzcyB0byBiaW5hcnkgZm9ybSBhbmQgcGxhY2UgcmVzdWx0IGluIGJ1ZmZlciBvZiBsZW5ndGggTEVOCisgICBzdGFydGluZyBhdCBCVUYuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpbmV0X25zYXBfYWRkciAoX19jb25zdCBjaGFyICpfX2NwLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyICpfX2J1ZiwgaW50IF9fbGVuKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IGludGVybmV0IGFkZHJlc3MgaW4gYmluYXJ5IGZvcm0gaW4gTEVOIGJ5dGVzIHN0YXJ0aW5nIGF0IENQCisgICBhIHByZXNlbnRhdGlvbiBmb3JtIGFuZCBwbGFjZSByZXN1bHQgaW4gQlVGLiAgKi8KK2V4dGVybiBjaGFyICppbmV0X25zYXBfbnRvYSAoaW50IF9fbGVuLCBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fY3AsCisJCQkgICAgIGNoYXIgKl9fYnVmKSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBhcnBhL2luZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL25hbWVzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NDIyMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyLmgKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCisgKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCisgKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKi8KKworLyoKKyAqCSRCSU5ESWQ6IG5hbWVzZXIuaCx2IDguMzcgMjAwMC8wMy8zMCAyMToxNjo0OSB2aXhpZSBFeHAgJAorICovCisKKyNpZm5kZWYgX0FSUEFfTkFNRVNFUl9IXworI2RlZmluZSBfQVJQQV9OQU1FU0VSX0hfCisKKyNkZWZpbmUgQklORF80X0NPTVBBVAorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWYgKCFkZWZpbmVkKEJTRCkpIHx8IChCU0QgPCAxOTkzMDYpCisjIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisvKgorICogUmV2aXNpb24gaW5mb3JtYXRpb24uICBUaGlzIGlzIHRoZSByZWxlYXNlIGRhdGUgaW4gWVlZWU1NREQgZm9ybWF0LgorICogSXQgY2FuIGNoYW5nZSBldmVyeSBkYXkgc28gdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIHdpdGggaXQgaXMgdXNlIGl0CisgKiBpbiBwcmVwcm9jZXNzb3IgY29tbWFuZHMgc3VjaCBhcyAiI2lmIChfX05BTUVTRVIgPiAxOTkzMTEwNCkiLiAgRG8gbm90CisgKiBjb21wYXJlIGZvciBlcXVhbGl0eTsgcmF0aGVyLCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciBsaWJiaW5kLmEKKyAqIGNvbnRhaW5zIGEgbmV3IGVub3VnaCBsaWIvbmFtZXNlci8gdG8gc3VwcG9ydCB0aGUgZmVhdHVyZSB5b3UgbmVlZC4KKyAqLworCisjZGVmaW5lIF9fTkFNRVNFUgkxOTk5MTAwNgkvKiBOZXcgaW50ZXJmYWNlIHZlcnNpb24gc3RhbXAuICovCisKKy8qCisgKiBEZWZpbmUgY29uc3RhbnRzIGJhc2VkIG9uIFJGQyA4ODMsIFJGQyAxMDM0LCBSRkMgMTAzNQorICovCisjZGVmaW5lIE5TX1BBQ0tFVFNaCTUxMgkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisjZGVmaW5lIE5TX01BWEROQU1FCTEwMjUJLyogbWF4aW11bSBkb21haW4gbmFtZSAqLworI2RlZmluZSBOU19NQVhDRE5BTUUJMjU1CS8qIG1heGltdW0gY29tcHJlc3NlZCBkb21haW4gbmFtZSAqLworI2RlZmluZSBOU19NQVhMQUJFTAk2MwkvKiBtYXhpbXVtIGxlbmd0aCBvZiBkb21haW4gbGFiZWwgKi8KKyNkZWZpbmUgTlNfSEZJWEVEU1oJMTIJLyogIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIGhlYWRlciAqLworI2RlZmluZSBOU19RRklYRURTWgk0CS8qICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiBxdWVyeSAqLworI2RlZmluZSBOU19SUkZJWEVEU1oJMTAJLyogIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIHIgcmVjb3JkICovCisjZGVmaW5lIE5TX0lOVDMyU1oJNAkvKiAjL2J5dGVzIG9mIGRhdGEgaW4gYSB1X2ludDMyX3QgKi8KKyNkZWZpbmUgTlNfSU5UMTZTWgkyCS8qICMvYnl0ZXMgb2YgZGF0YSBpbiBhIHVfaW50MTZfdCAqLworI2RlZmluZSBOU19JTlQ4U1oJMQkvKiAjL2J5dGVzIG9mIGRhdGEgaW4gYSB1X2ludDhfdCAqLworI2RlZmluZSBOU19JTkFERFJTWgk0CS8qIElQdjQgVF9BICovCisjZGVmaW5lIE5TX0lONkFERFJTWgkxNgkvKiBJUHY2IFRfQUFBQSAqLworI2RlZmluZSBOU19DTVBSU0ZMR1MJMHhjMAkvKiBGbGFnIGJpdHMgaW5kaWNhdGluZyBuYW1lIGNvbXByZXNzaW9uLiAqLworI2RlZmluZSBOU19ERUZBVUxUUE9SVAk1MwkvKiBGb3IgYm90aCBUQ1AgYW5kIFVEUC4gKi8KKworLyoKKyAqIFRoZXNlIGNhbiBiZSBleHBhbmRlZCB3aXRoIHN5bm9ueW1zLCBqdXN0IGtlZXAgbnNfcGFyc2UuYzpuc19wYXJzZXJlY29yZCgpCisgKiBpbiBzeW5jaCB3aXRoIGl0LgorICovCit0eXBlZGVmIGVudW0gX19uc19zZWN0IHsKKwluc19zX3FkID0gMCwJCS8qIFF1ZXJ5OiBRdWVzdGlvbi4gKi8KKwluc19zX3puID0gMCwJCS8qIFVwZGF0ZTogWm9uZS4gKi8KKwluc19zX2FuID0gMSwJCS8qIFF1ZXJ5OiBBbnN3ZXIuICovCisJbnNfc19wciA9IDEsCQkvKiBVcGRhdGU6IFByZXJlcXVpc2l0ZXMuICovCisJbnNfc19ucyA9IDIsCQkvKiBRdWVyeTogTmFtZSBzZXJ2ZXJzLiAqLworCW5zX3NfdWQgPSAyLAkJLyogVXBkYXRlOiBVcGRhdGUuICovCisJbnNfc19hciA9IDMsCQkvKiBRdWVyeXxVcGRhdGU6IEFkZGl0aW9uYWwgcmVjb3Jkcy4gKi8KKwluc19zX21heCA9IDQKK30gbnNfc2VjdDsKKworLyoKKyAqIFRoaXMgaXMgYSBtZXNzYWdlIGhhbmRsZS4gIEl0IGlzIGNhbGxlciBhbGxvY2F0ZWQgYW5kIGhhcyBubyBkeW5hbWljIGRhdGEuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBpbnRlbmRlZCB0byBiZSBvcGFxdWUgdG8gYWxsIGJ1dCBuc19wYXJzZS5jLCB0aHVzIHRoZQorICogbGVhZGluZyBfJ3Mgb24gdGhlIG1lbWJlciBuYW1lcy4gIFVzZSB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zLCBub3QgdGhlIF8ncy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19uc19tc2cgeworCWNvbnN0IHVfY2hhcgkqX21zZywgKl9lb207CisJdV9pbnQxNl90CV9pZCwgX2ZsYWdzLCBfY291bnRzW25zX3NfbWF4XTsKKwljb25zdCB1X2NoYXIJKl9zZWN0aW9uc1tuc19zX21heF07CisJbnNfc2VjdAkJX3NlY3Q7CisJaW50CQlfcnJudW07CisJY29uc3QgdV9jaGFyCSpfcHRyOworfSBuc19tc2c7CisKKy8qIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgLSBkbyBub3QgdXNlIGZyb20gb3V0c2lkZSBsaWJyYXJ5LiAqLworc3RydWN0IF9uc19mbGFnZGF0YSB7ICBpbnQgbWFzaywgc2hpZnQ7ICB9OworZXh0ZXJuIHN0cnVjdCBfbnNfZmxhZ2RhdGEgX25zX2ZsYWdkYXRhW107CisKKy8qIEFjY2Vzc29yIG1hY3JvcyAtIHRoaXMgaXMgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgbnNfbXNnX2dldGZsYWcoaGFuZGxlLCBmbGFnKSAoIFwKKwkJCSgoaGFuZGxlKS5fZmxhZ3MgJiBfbnNfZmxhZ2RhdGFbZmxhZ10ubWFzaykgXAorCQkJID4+IF9uc19mbGFnZGF0YVtmbGFnXS5zaGlmdCBcCisJCQkpCisjZGVmaW5lIG5zX21zZ19pZChoYW5kbGUpICgoaGFuZGxlKS5faWQgKyAwKQorI2RlZmluZSBuc19tc2dfYmFzZShoYW5kbGUpICgoaGFuZGxlKS5fbXNnICsgMCkKKyNkZWZpbmUgbnNfbXNnX2VuZChoYW5kbGUpICgoaGFuZGxlKS5fZW9tICsgMCkKKyNkZWZpbmUgbnNfbXNnX3NpemUoaGFuZGxlKSAoKGhhbmRsZSkuX2VvbSAtIChoYW5kbGUpLl9tc2cpCisjZGVmaW5lIG5zX21zZ19jb3VudChoYW5kbGUsIHNlY3Rpb24pICgoaGFuZGxlKS5fY291bnRzW3NlY3Rpb25dICsgMCkKKworLyoKKyAqIFRoaXMgaXMgYSBwYXJzZWQgcmVjb3JkLiAgSXQgaXMgY2FsbGVyIGFsbG9jYXRlZCBhbmQgaGFzIG5vIGR5bmFtaWMgZGF0YS4KKyAqLwordHlwZWRlZglzdHJ1Y3QgX19uc19yciB7CisJY2hhcgkJbmFtZVtOU19NQVhETkFNRV07CisJdV9pbnQxNl90CXR5cGU7CisJdV9pbnQxNl90CXJyX2NsYXNzOworCXVfaW50MzJfdAl0dGw7CisJdV9pbnQxNl90CXJkbGVuZ3RoOworCWNvbnN0IHVfY2hhciAqCXJkYXRhOworfSBuc19ycjsKKworLyogQWNjZXNzb3IgbWFjcm9zIC0gdGhpcyBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiAqLworI2RlZmluZSBuc19ycl9uYW1lKHJyKQkoKChycikubmFtZVswXSAhPSAnXDAnKSA/IChycikubmFtZSA6ICIuIikKKyNkZWZpbmUgbnNfcnJfdHlwZShycikJKChuc190eXBlKSgocnIpLnR5cGUgKyAwKSkKKyNkZWZpbmUgbnNfcnJfY2xhc3MocnIpCSgobnNfY2xhc3MpKChycikucnJfY2xhc3MgKyAwKSkKKyNkZWZpbmUgbnNfcnJfdHRsKHJyKQkoKHJyKS50dGwgKyAwKQorI2RlZmluZSBuc19ycl9yZGxlbihycikJKChycikucmRsZW5ndGggKyAwKQorI2RlZmluZSBuc19ycl9yZGF0YShycikJKChycikucmRhdGEgKyAwKQorCisvKgorICogVGhlc2UgZG9uJ3QgaGF2ZSB0byBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbiB0aGUgcGFja2V0IGZsYWdzIHdvcmQsCisgKiBhbmQgdGhleSBjYW4gZXZlbiBvdmVybGFwIGluIHNvbWUgY2FzZXMsIGJ1dCB0aGV5IHdpbGwgbmVlZCB0byBiZSBrZXB0CisgKiBpbiBzeW5jaCB3aXRoIG5zX3BhcnNlLmM6bnNfZmxhZ2RhdGFbXS4KKyAqLwordHlwZWRlZiBlbnVtIF9fbnNfZmxhZyB7CisJbnNfZl9xciwJCS8qIFF1ZXN0aW9uL1Jlc3BvbnNlLiAqLworCW5zX2Zfb3Bjb2RlLAkJLyogT3BlcmF0aW9uIGNvZGUuICovCisJbnNfZl9hYSwJCS8qIEF1dGhvcml0YXRpdmUgQW5zd2VyLiAqLworCW5zX2ZfdGMsCQkvKiBUcnVuY2F0aW9uIG9jY3VycmVkLiAqLworCW5zX2ZfcmQsCQkvKiBSZWN1cnNpb24gRGVzaXJlZC4gKi8KKwluc19mX3JhLAkJLyogUmVjdXJzaW9uIEF2YWlsYWJsZS4gKi8KKwluc19mX3osCQkJLyogTUJaLiAqLworCW5zX2ZfYWQsCQkvKiBBdXRoZW50aWMgRGF0YSAoRE5TU0VDKS4gKi8KKwluc19mX2NkLAkJLyogQ2hlY2tpbmcgRGlzYWJsZWQgKEROU1NFQykuICovCisJbnNfZl9yY29kZSwJCS8qIFJlc3BvbnNlIGNvZGUuICovCisJbnNfZl9tYXgKK30gbnNfZmxhZzsKKworLyoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIG9wY29kZXMuCisgKi8KK3R5cGVkZWYgZW51bSBfX25zX29wY29kZSB7CisJbnNfb19xdWVyeSA9IDAsCQkvKiBTdGFuZGFyZCBxdWVyeS4gKi8KKwluc19vX2lxdWVyeSA9IDEsCS8qIEludmVyc2UgcXVlcnkgKGRlcHJlY2F0ZWQvdW5zdXBwb3J0ZWQpLiAqLworCW5zX29fc3RhdHVzID0gMiwJLyogTmFtZSBzZXJ2ZXIgc3RhdHVzIHF1ZXJ5ICh1bnN1cHBvcnRlZCkuICovCisJCQkJLyogT3Bjb2RlIDMgaXMgdW5kZWZpbmVkL3Jlc2VydmVkLiAqLworCW5zX29fbm90aWZ5ID0gNCwJLyogWm9uZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLiAqLworCW5zX29fdXBkYXRlID0gNSwJLyogWm9uZSB1cGRhdGUgbWVzc2FnZS4gKi8KKwluc19vX21heCA9IDYKK30gbnNfb3Bjb2RlOworCisvKgorICogQ3VycmVudGx5IGRlZmluZWQgcmVzcG9uc2UgY29kZXMuCisgKi8KK3R5cGVkZWYJZW51bSBfX25zX3Jjb2RlIHsKKwluc19yX25vZXJyb3IgPSAwLAkvKiBObyBlcnJvciBvY2N1cnJlZC4gKi8KKwluc19yX2Zvcm1lcnIgPSAxLAkvKiBGb3JtYXQgZXJyb3IuICovCisJbnNfcl9zZXJ2ZmFpbCA9IDIsCS8qIFNlcnZlciBmYWlsdXJlLiAqLworCW5zX3Jfbnhkb21haW4gPSAzLAkvKiBOYW1lIGVycm9yLiAqLworCW5zX3Jfbm90aW1wbCA9IDQsCS8qIFVuaW1wbGVtZW50ZWQuICovCisJbnNfcl9yZWZ1c2VkID0gNSwJLyogT3BlcmF0aW9uIHJlZnVzZWQuICovCisJLyogdGhlc2UgYXJlIGZvciBCSU5EX1VQREFURSAqLworCW5zX3JfeXhkb21haW4gPSA2LAkvKiBOYW1lIGV4aXN0cyAqLworCW5zX3JfeXhycnNldCA9IDcsCS8qIFJSc2V0IGV4aXN0cyAqLworCW5zX3JfbnhycnNldCA9IDgsCS8qIFJSc2V0IGRvZXMgbm90IGV4aXN0ICovCisJbnNfcl9ub3RhdXRoID0gOSwJLyogTm90IGF1dGhvcml0YXRpdmUgZm9yIHpvbmUgKi8KKwluc19yX25vdHpvbmUgPSAxMCwJLyogWm9uZSBvZiByZWNvcmQgZGlmZmVyZW50IGZyb20gem9uZSBzZWN0aW9uICovCisJbnNfcl9tYXggPSAxMSwKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSBUU0lHIGV4dGVuZGVkIGVycm9ycyAqLworCW5zX3JfYmFkc2lnID0gMTYsCisJbnNfcl9iYWRrZXkgPSAxNywKKwluc19yX2JhZHRpbWUgPSAxOAorfSBuc19yY29kZTsKKworLyogQklORF9VUERBVEUgKi8KK3R5cGVkZWYgZW51bSBfX25zX3VwZGF0ZV9vcGVyYXRpb24geworCW5zX3VvcF9kZWxldGUgPSAwLAorCW5zX3VvcF9hZGQgPSAxLAorCW5zX3VvcF9tYXggPSAyCit9IG5zX3VwZGF0ZV9vcGVyYXRpb247CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBUU0lHIGF1dGhlbnRpY2F0ZWQgbWVzc2FnZXMKKyAqLworc3RydWN0IG5zX3RzaWdfa2V5IHsKKyAgICAgICAgY2hhciBuYW1lW05TX01BWEROQU1FXSwgYWxnW05TX01BWEROQU1FXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICAgICAgaW50IGxlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBuc190c2lnX2tleSBuc190c2lnX2tleTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIFRTSUcgYXV0aGVudGljYXRlZCBUQ1AgbWVzc2FnZXMKKyAqLworc3RydWN0IG5zX3RjcF90c2lnX3N0YXRlIHsKKwlpbnQgY291bnRlcjsKKwlzdHJ1Y3QgZHN0X2tleSAqa2V5OworCXZvaWQgKmN0eDsKKwl1bnNpZ25lZCBjaGFyIHNpZ1tOU19QQUNLRVRTWl07CisJaW50IHNpZ2xlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBuc190Y3BfdHNpZ19zdGF0ZSBuc190Y3BfdHNpZ19zdGF0ZTsKKworI2RlZmluZSBOU19UU0lHX0ZVREdFIDMwMAorI2RlZmluZSBOU19UU0lHX1RDUF9DT1VOVCAxMDAKKyNkZWZpbmUgTlNfVFNJR19BTEdfSE1BQ19NRDUgIkhNQUMtTUQ1LlNJRy1BTEcuUkVHLklOVCIKKworI2RlZmluZSBOU19UU0lHX0VSUk9SX05PX1RTSUcgLTEwCisjZGVmaW5lIE5TX1RTSUdfRVJST1JfTk9fU1BBQ0UgLTExCisjZGVmaW5lIE5TX1RTSUdfRVJST1JfRk9STUVSUiAtMTIKKworLyoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIHR5cGUgdmFsdWVzIGZvciByZXNvdXJjZXMgYW5kIHF1ZXJpZXMuCisgKi8KK3R5cGVkZWYgZW51bSBfX25zX3R5cGUgeworCW5zX3RfaW52YWxpZCA9IDAsCS8qIENvb2tpZS4gKi8KKwluc190X2EgPSAxLAkJLyogSG9zdCBhZGRyZXNzLiAqLworCW5zX3RfbnMgPSAyLAkJLyogQXV0aG9yaXRhdGl2ZSBzZXJ2ZXIuICovCisJbnNfdF9tZCA9IDMsCQkvKiBNYWlsIGRlc3RpbmF0aW9uLiAqLworCW5zX3RfbWYgPSA0LAkJLyogTWFpbCBmb3J3YXJkZXIuICovCisJbnNfdF9jbmFtZSA9IDUsCQkvKiBDYW5vbmljYWwgbmFtZS4gKi8KKwluc190X3NvYSA9IDYsCQkvKiBTdGFydCBvZiBhdXRob3JpdHkgem9uZS4gKi8KKwluc190X21iID0gNywJCS8qIE1haWxib3ggZG9tYWluIG5hbWUuICovCisJbnNfdF9tZyA9IDgsCQkvKiBNYWlsIGdyb3VwIG1lbWJlci4gKi8KKwluc190X21yID0gOSwJCS8qIE1haWwgcmVuYW1lIG5hbWUuICovCisJbnNfdF9udWxsID0gMTAsCQkvKiBOdWxsIHJlc291cmNlIHJlY29yZC4gKi8KKwluc190X3drcyA9IDExLAkJLyogV2VsbCBrbm93biBzZXJ2aWNlLiAqLworCW5zX3RfcHRyID0gMTIsCQkvKiBEb21haW4gbmFtZSBwb2ludGVyLiAqLworCW5zX3RfaGluZm8gPSAxMywJLyogSG9zdCBpbmZvcm1hdGlvbi4gKi8KKwluc190X21pbmZvID0gMTQsCS8qIE1haWxib3ggaW5mb3JtYXRpb24uICovCisJbnNfdF9teCA9IDE1LAkJLyogTWFpbCByb3V0aW5nIGluZm9ybWF0aW9uLiAqLworCW5zX3RfdHh0ID0gMTYsCQkvKiBUZXh0IHN0cmluZ3MuICovCisJbnNfdF9ycCA9IDE3LAkJLyogUmVzcG9uc2libGUgcGVyc29uLiAqLworCW5zX3RfYWZzZGIgPSAxOCwJLyogQUZTIGNlbGwgZGF0YWJhc2UuICovCisJbnNfdF94MjUgPSAxOSwJCS8qIFhfMjUgY2FsbGluZyBhZGRyZXNzLiAqLworCW5zX3RfaXNkbiA9IDIwLAkJLyogSVNETiBjYWxsaW5nIGFkZHJlc3MuICovCisJbnNfdF9ydCA9IDIxLAkJLyogUm91dGVyLiAqLworCW5zX3RfbnNhcCA9IDIyLAkJLyogTlNBUCBhZGRyZXNzLiAqLworCW5zX3RfbnNhcF9wdHIgPSAyMywJLyogUmV2ZXJzZSBOU0FQIGxvb2t1cCAoZGVwcmVjYXRlZCkuICovCisJbnNfdF9zaWcgPSAyNCwJCS8qIFNlY3VyaXR5IHNpZ25hdHVyZS4gKi8KKwluc190X2tleSA9IDI1LAkJLyogU2VjdXJpdHkga2V5LiAqLworCW5zX3RfcHggPSAyNiwJCS8qIFguNDAwIG1haWwgbWFwcGluZy4gKi8KKwluc190X2dwb3MgPSAyNywJCS8qIEdlb2dyYXBoaWNhbCBwb3NpdGlvbiAod2l0aGRyYXduKS4gKi8KKwluc190X2FhYWEgPSAyOCwJCS8qIElwNiBBZGRyZXNzLiAqLworCW5zX3RfbG9jID0gMjksCQkvKiBMb2NhdGlvbiBJbmZvcm1hdGlvbi4gKi8KKwluc190X254dCA9IDMwLAkJLyogTmV4dCBkb21haW4gKHNlY3VyaXR5KS4gKi8KKwluc190X2VpZCA9IDMxLAkJLyogRW5kcG9pbnQgaWRlbnRpZmllci4gKi8KKwluc190X25pbWxvYyA9IDMyLAkvKiBOaW1yb2QgTG9jYXRvci4gKi8KKwluc190X3NydiA9IDMzLAkJLyogU2VydmVyIFNlbGVjdGlvbi4gKi8KKwluc190X2F0bWEgPSAzNCwJCS8qIEFUTSBBZGRyZXNzICovCisJbnNfdF9uYXB0ciA9IDM1LAkvKiBOYW1pbmcgQXV0aG9yaXR5IFBvaW5UZVIgKi8KKwluc190X2t4ID0gMzYsCQkvKiBLZXkgRXhjaGFuZ2UgKi8KKwluc190X2NlcnQgPSAzNywJCS8qIENlcnRpZmljYXRpb24gcmVjb3JkICovCisJbnNfdF9hNiA9IDM4LAkJLyogSVB2NiBhZGRyZXNzIChkZXByZWNhdGVkLCB1c2UgbnNfdF9hYWFhKSAqLworCW5zX3RfZG5hbWUgPSAzOSwJLyogTm9uLXRlcm1pbmFsIEROQU1FIChmb3IgSVB2NikgKi8KKwluc190X3NpbmsgPSA0MCwJCS8qIEtpdGNoZW4gc2luayAoZXhwZXJpbWVudGF0bCkgKi8KKwluc190X29wdCA9IDQxLAkJLyogRUROUzAgb3B0aW9uIChtZXRhLVJSKSAqLworCW5zX3RfdHNpZyA9IDI1MCwJLyogVHJhbnNhY3Rpb24gc2lnbmF0dXJlLiAqLworCW5zX3RfaXhmciA9IDI1MSwJLyogSW5jcmVtZW50YWwgem9uZSB0cmFuc2Zlci4gKi8KKwluc190X2F4ZnIgPSAyNTIsCS8qIFRyYW5zZmVyIHpvbmUgb2YgYXV0aG9yaXR5LiAqLworCW5zX3RfbWFpbGIgPSAyNTMsCS8qIFRyYW5zZmVyIG1haWxib3ggcmVjb3Jkcy4gKi8KKwluc190X21haWxhID0gMjU0LAkvKiBUcmFuc2ZlciBtYWlsIGFnZW50IHJlY29yZHMuICovCisJbnNfdF9hbnkgPSAyNTUsCQkvKiBXaWxkY2FyZCBtYXRjaC4gKi8KKwluc190X3p4ZnIgPSAyNTYsCS8qIEJJTkQtc3BlY2lmaWMsIG5vbnN0YW5kYXJkLiAqLworCW5zX3RfbWF4ID0gNjU1MzYKK30gbnNfdHlwZTsKKworLyogRXhjbHVzaXZlbHkgYSBRVFlQRT8gKG5vdCBhbHNvIGFuIFJUWVBFKSAqLworI2RlZmluZQluc190X3F0X3AodCkgKG5zX3RfeGZyX3AodCkgfHwgKHQpID09IG5zX3RfYW55IHx8IFwKKwkJICAgICAgKHQpID09IG5zX3RfbWFpbGIgfHwgKHQpID09IG5zX3RfbWFpbGEpCisvKiBTb21lIGtpbmQgb2YgbWV0YS1SUj8gKG5vdCBhIFFUWVBFLCBidXQgYWxzbyBub3QgYW4gUlRZUEUpICovCisjZGVmaW5lCW5zX3RfbXJyX3AodCkgKCh0KSA9PSBuc190X3RzaWcgfHwgKHQpID09IG5zX3Rfb3B0KQorLyogRXhjbHVzaXZlbHkgYW4gUlRZUEU/IChub3QgYWxzbyBhIFFUWVBFIG9yIGEgbWV0YS1SUikgKi8KKyNkZWZpbmUgbnNfdF9ycl9wKHQpICghbnNfdF9xdF9wKHQpICYmICFuc190X21ycl9wKHQpKQorI2RlZmluZSBuc190X3VkcF9wKHQpICgodCkgIT0gbnNfdF9heGZyICYmICh0KSAhPSBuc190X3p4ZnIpCisjZGVmaW5lIG5zX3RfeGZyX3AodCkgKCh0KSA9PSBuc190X2F4ZnIgfHwgKHQpID09IG5zX3RfaXhmciB8fCBcCisJCSAgICAgICAodCkgPT0gbnNfdF96eGZyKQorCisvKgorICogVmFsdWVzIGZvciBjbGFzcyBmaWVsZAorICovCit0eXBlZGVmIGVudW0gX19uc19jbGFzcyB7CisJbnNfY19pbnZhbGlkID0gMCwJLyogQ29va2llLiAqLworCW5zX2NfaW4gPSAxLAkJLyogSW50ZXJuZXQuICovCisJbnNfY18yID0gMiwJCS8qIHVuYWxsb2NhdGVkL3Vuc3VwcG9ydGVkLiAqLworCW5zX2NfY2hhb3MgPSAzLAkJLyogTUlUIENoYW9zLW5ldC4gKi8KKwluc19jX2hzID0gNCwJCS8qIE1JVCBIZXNpb2QuICovCisJLyogUXVlcnkgY2xhc3MgdmFsdWVzIHdoaWNoIGRvIG5vdCBhcHBlYXIgaW4gcmVzb3VyY2UgcmVjb3JkcyAqLworCW5zX2Nfbm9uZSA9IDI1NCwJLyogZm9yIHByZXJlcS4gc2VjdGlvbnMgaW4gdXBkYXRlIHJlcXVlc3RzICovCisJbnNfY19hbnkgPSAyNTUsCQkvKiBXaWxkY2FyZCBtYXRjaC4gKi8KKwluc19jX21heCA9IDY1NTM2Cit9IG5zX2NsYXNzOworCisvKiBETlNTRUMgY29uc3RhbnRzLiAqLworCit0eXBlZGVmIGVudW0gX19uc19rZXlfdHlwZXMgeworCW5zX2t0X3JzYSA9IDEsCQkvKiBrZXkgdHlwZSBSU0EvTUQ1ICovCisJbnNfa3RfZGggID0gMiwJCS8qIERpZmZpZSBIZWxsbWFuICovCisJbnNfa3RfZHNhID0gMywJCS8qIERpZ2l0YWwgU2lnbmF0dXJlIFN0YW5kYXJkIChNQU5EQVRPUlkpICovCisJbnNfa3RfcHJpdmF0ZSA9IDI1NAkvKiBQcml2YXRlIGtleSB0eXBlIHN0YXJ0cyB3aXRoIE9JRCAqLworfSBuc19rZXlfdHlwZXM7CisKK3R5cGVkZWYgZW51bSBfX25zX2NlcnRfdHlwZXMgeworCWNlcnRfdF9wa2l4ID0gMSwJLyogUEtJWCAoWC41MDl2MykgKi8KKwljZXJ0X3Rfc3BraSA9IDIsCS8qIFNQS0kgKi8KKwljZXJ0X3RfcGdwICA9IDMsCS8qIFBHUCAqLworCWNlcnRfdF91cmwgID0gMjUzLAkvKiBVUkwgcHJpdmF0ZSB0eXBlICovCisJY2VydF90X29pZCAgPSAyNTQJLyogT0lEIHByaXZhdGUgdHlwZSAqLworfSBuc19jZXJ0X3R5cGVzOworCisvKiBGbGFncyBmaWVsZCBvZiB0aGUgS0VZIFJSIHJkYXRhLiAqLworI2RlZmluZQlOU19LRVlfVFlQRU1BU0sJCTB4QzAwMAkvKiBNYXNrIGZvciAidHlwZSIgYml0cyAqLworI2RlZmluZQlOU19LRVlfVFlQRV9BVVRIX0NPTkYJMHgwMDAwCS8qIEtleSB1c2FibGUgZm9yIGJvdGggKi8KKyNkZWZpbmUJTlNfS0VZX1RZUEVfQ09ORl9PTkxZCTB4ODAwMAkvKiBLZXkgdXNhYmxlIGZvciBjb25maWRlbnRpYWxpdHkgKi8KKyNkZWZpbmUJTlNfS0VZX1RZUEVfQVVUSF9PTkxZCTB4NDAwMAkvKiBLZXkgdXNhYmxlIGZvciBhdXRoZW50aWNhdGlvbiAqLworI2RlZmluZQlOU19LRVlfVFlQRV9OT19LRVkJMHhDMDAwCS8qIE5vIGtleSB1c2FibGUgZm9yIGVpdGhlcjsgbm8ga2V5ICovCisvKiBUaGUgdHlwZSBiaXRzIGNhbiBhbHNvIGJlIGludGVycHJldGVkIGluZGVwZW5kZW50bHksIGFzIHNpbmdsZSBiaXRzOiAqLworI2RlZmluZQlOU19LRVlfTk9fQVVUSAkJMHg4MDAwCS8qIEtleSB1bnVzYWJsZSBmb3IgYXV0aGVudGljYXRpb24gKi8KKyNkZWZpbmUJTlNfS0VZX05PX0NPTkYJCTB4NDAwMAkvKiBLZXkgdW51c2FibGUgZm9yIGNvbmZpZGVudGlhbGl0eSAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQyCTB4MjAwMAkvKiBTZWN1cml0eSBpcyAqbWFuZGF0b3J5KiBpZiBiaXQ9MCAqLworI2RlZmluZQlOU19LRVlfRVhURU5ERURfRkxBR1MJMHgxMDAwCS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRDQJMHgwODAwICAvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQ1CTB4MDQwMCAgLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfVFlQRQkweDAzMDAJLyogdGhlc2UgYml0cyBkZXRlcm1pbmUgdGhlIHR5cGUgKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfVVNFUgkweDAwMDAJLyoga2V5IGlzIGFzc29jLiB3aXRoIHVzZXIgKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfRU5USVRZCTB4MDIwMAkvKiBrZXkgaXMgYXNzb2MuIHdpdGggZW50aXR5IGVnIGhvc3QgKi8KKyNkZWZpbmUJTlNfS0VZX05BTUVfWk9ORQkweDAxMDAJLyoga2V5IGlzIHpvbmUga2V5ICovCisjZGVmaW5lCU5TX0tFWV9OQU1FX1JFU0VSVkVECTB4MDMwMAkvKiByZXNlcnZlZCBtZWFuaW5nICovCisjZGVmaW5lCU5TX0tFWV9SRVNFUlZFRDgJMHgwMDgwICAvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQ5CTB4MDA0MCAgLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUJTlNfS0VZX1JFU0VSVkVEMTAJMHgwMDIwICAvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworI2RlZmluZQlOU19LRVlfUkVTRVJWRUQxMQkweDAwMTAgIC8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lCU5TX0tFWV9TSUdOQVRPUllNQVNLCTB4MDAwRgkvKiBrZXkgY2FuIHNpZ24gUlIncyBvZiBzYW1lIG5hbWUgKi8KKyNkZWZpbmUJTlNfS0VZX1JFU0VSVkVEX0JJVE1BU0sgKCBOU19LRVlfUkVTRVJWRUQyIHwgXAorCQkJCSAgTlNfS0VZX1JFU0VSVkVENCB8IFwKKwkJCQkgIE5TX0tFWV9SRVNFUlZFRDUgfCBcCisJCQkJICBOU19LRVlfUkVTRVJWRUQ4IHwgXAorCQkJCSAgTlNfS0VZX1JFU0VSVkVEOSB8IFwKKwkJCQkgIE5TX0tFWV9SRVNFUlZFRDEwIHwgXAorCQkJCSAgTlNfS0VZX1JFU0VSVkVEMTEgKQorI2RlZmluZSBOU19LRVlfUkVTRVJWRURfQklUTUFTSzIgMHhGRkZGIC8qIG5vIGJpdHMgZGVmaW5lZCBoZXJlICovCisKKy8qIFRoZSBBbGdvcml0aG0gZmllbGQgb2YgdGhlIEtFWSBhbmQgU0lHIFJSJ3MgaXMgYW4gaW50ZWdlciwgezEuLjI1NH0gKi8KKyNkZWZpbmUJTlNfQUxHX01ENVJTQQkJMQkvKiBNRDUgd2l0aCBSU0EgKi8KKyNkZWZpbmUJTlNfQUxHX0RIICAgICAgICAgICAgICAgMgkvKiBEaWZmaWUgSGVsbG1hbiBLRVkgKi8KKyNkZWZpbmUJTlNfQUxHX0RTQSAgICAgICAgICAgICAgMwkvKiBEU0EgS0VZICovCisjZGVmaW5lCU5TX0FMR19EU1MgICAgICAgICAgICAgIE5TX0FMR19EU0EKKyNkZWZpbmUJTlNfQUxHX0VYUElSRV9PTkxZCTI1MwkvKiBObyBhbGcsIG5vIHNlY3VyaXR5ICovCisjZGVmaW5lCU5TX0FMR19QUklWQVRFX09JRAkyNTQJLyogS2V5IGJlZ2lucyB3aXRoIE9JRCBnaXZpbmcgYWxnICovCisKKy8qIFByb3RvY29sIHZhbHVlcyAgKi8KKy8qIHZhbHVlIDAgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTlNfS0VZX1BST1RfVExTICAgICAgICAgMQorI2RlZmluZSBOU19LRVlfUFJPVF9FTUFJTCAgICAgICAyCisjZGVmaW5lIE5TX0tFWV9QUk9UX0ROU1NFQyAgICAgIDMKKyNkZWZpbmUgTlNfS0VZX1BST1RfSVBTRUMgICAgICAgNAorI2RlZmluZSBOU19LRVlfUFJPVF9BTlkJCTI1NQorCisvKiBTaWduYXR1cmVzICovCisjZGVmaW5lCU5TX01ENVJTQV9NSU5fQklUUwkgNTEyCS8qIFNpemUgb2YgYSBtb2Qgb3IgZXhwIGluIGJpdHMgKi8KKyNkZWZpbmUJTlNfTUQ1UlNBX01BWF9CSVRTCTI1NTIKKwkvKiBUb3RhbCBvZiBiaW5hcnkgbW9kIGFuZCBleHAgKi8KKyNkZWZpbmUJTlNfTUQ1UlNBX01BWF9CWVRFUwkoKE5TX01ENVJTQV9NQVhfQklUUys3LzgpKjIrMykKKwkvKiBNYXggbGVuZ3RoIG9mIHRleHQgc2lnIGJsb2NrICovCisjZGVmaW5lCU5TX01ENVJTQV9NQVhfQkFTRTY0CSgoKE5TX01ENVJTQV9NQVhfQllURVMrMikvMykqNCkKKyNkZWZpbmUgTlNfTUQ1UlNBX01JTl9TSVpFCSgoTlNfTUQ1UlNBX01JTl9CSVRTKzcpLzgpCisjZGVmaW5lIE5TX01ENVJTQV9NQVhfU0laRQkoKE5TX01ENVJTQV9NQVhfQklUUys3KS84KQorCisjZGVmaW5lIE5TX0RTQV9TSUdfU0laRSAgICAgICAgIDQxCisjZGVmaW5lIE5TX0RTQV9NSU5fU0laRSAgICAgICAgIDIxMworI2RlZmluZSBOU19EU0FfTUFYX0JZVEVTICAgICAgICA0MDUKKworLyogT2Zmc2V0cyBpbnRvIFNJRyByZWNvcmQgcmRhdGEgdG8gZmluZCB2YXJpb3VzIHZhbHVlcyAqLworI2RlZmluZQlOU19TSUdfVFlQRQkwCS8qIFR5cGUgZmxhZ3MgKi8KKyNkZWZpbmUJTlNfU0lHX0FMRwkyCS8qIEFsZ29yaXRobSAqLworI2RlZmluZQlOU19TSUdfTEFCRUxTCTMJLyogSG93IG1hbnkgbGFiZWxzIGluIG5hbWUgKi8KKyNkZWZpbmUJTlNfU0lHX09UVEwJNAkvKiBPcmlnaW5hbCBUVEwgKi8KKyNkZWZpbmUJTlNfU0lHX0VYUElSCTgJLyogRXhwaXJhdGlvbiB0aW1lICovCisjZGVmaW5lCU5TX1NJR19TSUdORUQJMTIJLyogU2lnbmF0dXJlIHRpbWUgKi8KKyNkZWZpbmUJTlNfU0lHX0ZPT1QJMTYJLyogS2V5IGZvb3RwcmludCAqLworI2RlZmluZQlOU19TSUdfU0lHTkVSCTE4CS8qIERvbWFpbiBuYW1lIG9mIHdobyBzaWduZWQgaXQgKi8KKworLyogSG93IFJSIHR5cGVzIGFyZSByZXByZXNlbnRlZCBhcyBiaXQtZmxhZ3MgaW4gTlhUIHJlY29yZHMgKi8KKyNkZWZpbmUJTlNfTlhUX0JJVFMgOAorI2RlZmluZQlOU19OWFRfQklUX1NFVCggIG4scCkgKHBbKG4pL05TX05YVF9CSVRTXSB8PSAgKDB4ODA+PigobiklTlNfTlhUX0JJVFMpKSkKKyNkZWZpbmUJTlNfTlhUX0JJVF9DTEVBUihuLHApIChwWyhuKS9OU19OWFRfQklUU10gJj0gfigweDgwPj4oKG4pJU5TX05YVF9CSVRTKSkpCisjZGVmaW5lCU5TX05YVF9CSVRfSVNTRVQobixwKSAocFsobikvTlNfTlhUX0JJVFNdICYgICAoMHg4MD4+KChuKSVOU19OWFRfQklUUykpKQorI2RlZmluZSBOU19OWFRfTUFYIDEyNworCisvKgorICogRUROUzAgZXh0ZW5kZWQgZmxhZ3MsIGhvc3Qgb3JkZXIuCisgKi8KKyNkZWZpbmUgTlNfT1BUX0ROU1NFQ19PSyAgICAgICAgMHg4MDAwVQorCisvKgorICogSW5saW5lIHZlcnNpb25zIG9mIGdldC9wdXQgc2hvcnQvbG9uZy4gIFBvaW50ZXIgaXMgYWR2YW5jZWQuCisgKi8KKyNkZWZpbmUgTlNfR0VUMTYocywgY3ApIGRvIHsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKHMpID0gKCh1X2ludDE2X3QpdF9jcFswXSA8PCA4KSBcCisJICAgIHwgKCh1X2ludDE2X3QpdF9jcFsxXSkgXAorCSAgICA7IFwKKwkoY3ApICs9IE5TX0lOVDE2U1o7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTlNfR0VUMzIobCwgY3ApIGRvIHsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKGwpID0gKCh1X2ludDMyX3QpdF9jcFswXSA8PCAyNCkgXAorCSAgICB8ICgodV9pbnQzMl90KXRfY3BbMV0gPDwgMTYpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzJdIDw8IDgpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzNdKSBcCisJICAgIDsgXAorCShjcCkgKz0gTlNfSU5UMzJTWjsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBOU19QVVQxNihzLCBjcCkgZG8geyBcCisJcmVnaXN0ZXIgdV9pbnQxNl90IHRfcyA9ICh1X2ludDE2X3QpKHMpOyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkqdF9jcCsrID0gdF9zID4+IDg7IFwKKwkqdF9jcCAgID0gdF9zOyBcCisJKGNwKSArPSBOU19JTlQxNlNaOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE5TX1BVVDMyKGwsIGNwKSBkbyB7IFwKKwlyZWdpc3RlciB1X2ludDMyX3QgdF9sID0gKHVfaW50MzJfdCkobCk7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCSp0X2NwKysgPSB0X2wgPj4gMjQ7IFwKKwkqdF9jcCsrID0gdF9sID4+IDE2OyBcCisJKnRfY3ArKyA9IHRfbCA+PiA4OyBcCisJKnRfY3AgICA9IHRfbDsgXAorCShjcCkgKz0gTlNfSU5UMzJTWjsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEFOU0kgQyBpZGVudGlmaWVyIGhpZGluZyBmb3IgYmluZCdzIGxpYi9uYW1lc2VyLgorICovCisjZGVmaW5lIG5zX2dldDE2CQlfX25zX2dldDE2CisjZGVmaW5lIG5zX2dldDMyCQlfX25zX2dldDMyCisjZGVmaW5lIG5zX3B1dDE2CQlfX25zX3B1dDE2CisjZGVmaW5lIG5zX3B1dDMyCQlfX25zX3B1dDMyCisjZGVmaW5lIG5zX2luaXRwYXJzZQkJX19uc19pbml0cGFyc2UKKyNkZWZpbmUgbnNfc2tpcHJyCQlfX25zX3NraXBycgorI2RlZmluZSBuc19wYXJzZXJyCQlfX25zX3BhcnNlcnIKKyNkZWZpbmUJbnNfc3ByaW50cnIJCV9fbnNfc3ByaW50cnIKKyNkZWZpbmUJbnNfc3ByaW50cnJmCQlfX25zX3NwcmludHJyZgorI2RlZmluZQluc19mb3JtYXRfdHRsCQlfX25zX2Zvcm1hdF90dGwKKyNkZWZpbmUJbnNfcGFyc2VfdHRsCQlfX25zX3BhcnNlX3R0bAorI2RlZmluZSBuc19kYXRldG9zZWNzCQlfX25zX2RhdGV0b3NlY3MKKyNkZWZpbmUJbnNfbmFtZV9udG9sCQlfX25zX25hbWVfbnRvbAorI2RlZmluZQluc19uYW1lX250b3AJCV9fbnNfbmFtZV9udG9wCisjZGVmaW5lCW5zX25hbWVfcHRvbgkJX19uc19uYW1lX3B0b24KKyNkZWZpbmUJbnNfbmFtZV91bnBhY2sJCV9fbnNfbmFtZV91bnBhY2sKKyNkZWZpbmUJbnNfbmFtZV9wYWNrCQlfX25zX25hbWVfcGFjaworI2RlZmluZQluc19uYW1lX2NvbXByZXNzCV9fbnNfbmFtZV9jb21wcmVzcworI2RlZmluZQluc19uYW1lX3VuY29tcHJlc3MJX19uc19uYW1lX3VuY29tcHJlc3MKKyNkZWZpbmUJbnNfbmFtZV9za2lwCQlfX25zX25hbWVfc2tpcAorI2RlZmluZQluc19uYW1lX3JvbGxiYWNrCV9fbnNfbmFtZV9yb2xsYmFjaworI2RlZmluZQluc19zaWduCQkJX19uc19zaWduCisjZGVmaW5lCW5zX3NpZ25fdGNwCQlfX25zX3NpZ25fdGNwCisjZGVmaW5lCW5zX3NpZ25fdGNwX2luaXQJX19uc19zaWduX3RjcF9pbml0CisjZGVmaW5lIG5zX2ZpbmRfdHNpZwkJX19uc19maW5kX3RzaWcKKyNkZWZpbmUJbnNfdmVyaWZ5CQlfX25zX3ZlcmlmeQorI2RlZmluZQluc192ZXJpZnlfdGNwCQlfX25zX3ZlcmlmeV90Y3AKKyNkZWZpbmUJbnNfdmVyaWZ5X3RjcF9pbml0CV9fbnNfdmVyaWZ5X3RjcF9pbml0CisjZGVmaW5lCW5zX3NhbWVkb21haW4JCV9fbnNfc2FtZWRvbWFpbgorI2RlZmluZQluc19zdWJkb21haW4JCV9fbnNfc3ViZG9tYWluCisjZGVmaW5lCW5zX21ha2VjYW5vbgkJX19uc19tYWtlY2Fub24KKyNkZWZpbmUJbnNfc2FtZW5hbWUJCV9fbnNfc2FtZW5hbWUKKworX19CRUdJTl9ERUNMUwordV9pbnQJCW5zX2dldDE2IChjb25zdCB1X2NoYXIgKikgX19USFJPVzsKK3VfbG9uZwkJbnNfZ2V0MzIgKGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOwordm9pZAkJbnNfcHV0MTYgKHVfaW50LCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCW5zX3B1dDMyICh1X2xvbmcsIHVfY2hhciAqKSBfX1RIUk9XOworaW50CQluc19pbml0cGFyc2UgKGNvbnN0IHVfY2hhciAqLCBpbnQsIG5zX21zZyAqKSBfX1RIUk9XOworaW50CQluc19za2lwcnIgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgbnNfc2VjdCwgaW50KQorICAgICBfX1RIUk9XOworaW50CQluc19wYXJzZXJyIChuc19tc2cgKiwgbnNfc2VjdCwgaW50LCBuc19yciAqKSBfX1RIUk9XOworaW50CQluc19zcHJpbnRyciAoY29uc3QgbnNfbXNnICosIGNvbnN0IG5zX3JyICosCisJCQkgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjaGFyICosIHNpemVfdCkKKyAgICAgX19USFJPVzsKK2ludAkJbnNfc3ByaW50cnJmIChjb25zdCB1X2NoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosCisJCQkgICAgICBuc19jbGFzcywgbnNfdHlwZSwgdV9sb25nLCBjb25zdCB1X2NoYXIgKiwKKwkJCSAgICAgIHNpemVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisJCQkgICAgICBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfZm9ybWF0X3R0bCAodV9sb25nLCBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfcGFyc2VfdHRsIChjb25zdCBjaGFyICosIHVfbG9uZyAqKSBfX1RIUk9XOwordV9pbnQzMl90CW5zX2RhdGV0b3NlY3MgKGNvbnN0IGNoYXIgKmNwLCBpbnQgKmVycnApIF9fVEhST1c7CitpbnQJCW5zX25hbWVfbnRvbCAoY29uc3QgdV9jaGFyICosIHVfY2hhciAqLCBzaXplX3QpIF9fVEhST1c7CitpbnQJCW5zX25hbWVfbnRvcCAoY29uc3QgdV9jaGFyICosIGNoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19uYW1lX3B0b24gKGNvbnN0IGNoYXIgKiwgdV9jaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfbmFtZV91bnBhY2sgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwKKwkJCQljb25zdCB1X2NoYXIgKiwgdV9jaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfbmFtZV9wYWNrIChjb25zdCB1X2NoYXIgKiwgdV9jaGFyICosIGludCwKKwkJCSAgICAgIGNvbnN0IHVfY2hhciAqKiwgY29uc3QgdV9jaGFyICoqKSBfX1RIUk9XOworaW50CQluc19uYW1lX3VuY29tcHJlc3MgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwKKwkJCQkgICAgY29uc3QgdV9jaGFyICosIGNoYXIgKiwgc2l6ZV90KSBfX1RIUk9XOworaW50CQluc19uYW1lX2NvbXByZXNzIChjb25zdCBjaGFyICosIHVfY2hhciAqLCBzaXplX3QsCisJCQkJICBjb25zdCB1X2NoYXIgKiosIGNvbnN0IHVfY2hhciAqKikgX19USFJPVzsKK2ludAkJbnNfbmFtZV9za2lwIChjb25zdCB1X2NoYXIgKiosIGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOwordm9pZAkJbnNfbmFtZV9yb2xsYmFjayAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKiwKKwkJCQkgIGNvbnN0IHVfY2hhciAqKikgX19USFJPVzsKK2ludAkJbnNfc2lnbiAodV9jaGFyICosIGludCAqLCBpbnQsIGludCwgdm9pZCAqLAorCQkJIGNvbnN0IHVfY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQgKiwgdGltZV90KSBfX1RIUk9XOworaW50CQluc19zaWduX3RjcCAodV9jaGFyICosIGludCAqLCBpbnQsIGludCwKKwkJCSAgICAgbnNfdGNwX3RzaWdfc3RhdGUgKiwgaW50KSBfX1RIUk9XOworaW50CQluc19zaWduX3RjcF9pbml0ICh2b2lkICosIGNvbnN0IHVfY2hhciAqLCBpbnQsCisJCQkJICBuc190Y3BfdHNpZ19zdGF0ZSAqKSBfX1RIUk9XOwordV9jaGFyCQkqbnNfZmluZF90c2lnICh1X2NoYXIgKiwgdV9jaGFyICopIF9fVEhST1c7CitpbnQJCW5zX3ZlcmlmeSAodV9jaGFyICosIGludCAqLCB2b2lkICosIGNvbnN0IHVfY2hhciAqLCBpbnQsCisJCQkgICB1X2NoYXIgKiwgaW50ICosIHRpbWVfdCAqLCBpbnQpIF9fVEhST1c7CitpbnQJCW5zX3ZlcmlmeV90Y3AgKHVfY2hhciAqLCBpbnQgKiwgbnNfdGNwX3RzaWdfc3RhdGUgKiwgaW50KQorICAgICBfX1RIUk9XOworaW50CQluc192ZXJpZnlfdGNwX2luaXQgKHZvaWQgKiwgY29uc3QgdV9jaGFyICosIGludCwKKwkJCQkgICAgbnNfdGNwX3RzaWdfc3RhdGUgKikgX19USFJPVzsKK2ludAkJbnNfc2FtZWRvbWFpbiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCW5zX3N1YmRvbWFpbiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCW5zX21ha2VjYW5vbiAoY29uc3QgY2hhciAqLCBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbnNfc2FtZW5hbWUgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBfX1RIUk9XOworX19FTkRfREVDTFMKKworI2lmZGVmIEJJTkRfNF9DT01QQVQKKyNpbmNsdWRlIDxhcnBhL25hbWVzZXJfY29tcGF0Lmg+CisjZW5kaWYKKworI2VuZGlmIC8qICFfQVJQQV9OQU1FU0VSX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlcl9jb21wYXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS9uYW1lc2VyX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmNkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FycGEvbmFtZXNlcl9jb21wYXQuaApAQCAtMCwwICsxLDE4MyBAQAorLyogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5CisgKiAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogICAgICBmcm9tIG5hbWVzZXIuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqCSRCSU5ESWQ6IG5hbWVzZXJfY29tcGF0LmgsdiA4LjExIDE5OTkvMDEvMDIgMDg6MDA6NTggdml4aWUgRXhwICQKKyAqLworCisjaWZuZGVmIF9BUlBBX05BTUVTRVJfQ09NUEFUXworI2RlZmluZQlfQVJQQV9OQU1FU0VSX0NPTVBBVF8KKworI2RlZmluZQlfX0JJTkQJCTE5OTUwNjIxCS8qIChERUFEKSBpbnRlcmZhY2UgdmVyc2lvbiBzdGFtcC4gKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorCisvKgorICogU3RydWN0dXJlIGZvciBxdWVyeSBoZWFkZXIuICBUaGUgb3JkZXIgb2YgdGhlIGZpZWxkcyBpcyBtYWNoaW5lLSBhbmQKKyAqIGNvbXBpbGVyLWRlcGVuZGVudCwgZGVwZW5kaW5nIG9uIHRoZSBieXRlL2JpdCBvcmRlciBhbmQgdGhlIGxheW91dAorICogb2YgYml0IGZpZWxkcy4gIFdlIHVzZSBiaXQgZmllbGRzIG9ubHkgaW4gaW50IHZhcmlhYmxlcywgYXMgdGhpcworICogaXMgYWxsIEFOU0kgcmVxdWlyZXMuICBUaGlzIHJlcXVpcmVzIGEgc29tZXdoYXQgY29uZnVzaW5nIHJlYXJyYW5nZW1lbnQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkCWlkIDoxNjsJCS8qIHF1ZXJ5IGlkZW50aWZpY2F0aW9uIG51bWJlciAqLworI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgorCQkJLyogZmllbGRzIGluIHRoaXJkIGJ5dGUgKi8KKwl1bnNpZ25lZAlxcjogMTsJCS8qIHJlc3BvbnNlIGZsYWcgKi8KKwl1bnNpZ25lZAlvcGNvZGU6IDQ7CS8qIHB1cnBvc2Ugb2YgbWVzc2FnZSAqLworCXVuc2lnbmVkCWFhOiAxOwkJLyogYXV0aG9yaXRpdmUgYW5zd2VyICovCisJdW5zaWduZWQJdGM6IDE7CQkvKiB0cnVuY2F0ZWQgbWVzc2FnZSAqLworCXVuc2lnbmVkCXJkOiAxOwkJLyogcmVjdXJzaW9uIGRlc2lyZWQgKi8KKwkJCS8qIGZpZWxkcyBpbiBmb3VydGggYnl0ZSAqLworCXVuc2lnbmVkCXJhOiAxOwkJLyogcmVjdXJzaW9uIGF2YWlsYWJsZSAqLworCXVuc2lnbmVkCXVudXNlZCA6MTsJLyogdW51c2VkIGJpdHMgKE1CWiBhcyBvZiA0LjkuM2EzKSAqLworCXVuc2lnbmVkCWFkOiAxOwkJLyogYXV0aGVudGljIGRhdGEgZnJvbSBuYW1lZCAqLworCXVuc2lnbmVkCWNkOiAxOwkJLyogY2hlY2tpbmcgZGlzYWJsZWQgYnkgcmVzb2x2ZXIgKi8KKwl1bnNpZ25lZAlyY29kZSA6NDsJLyogcmVzcG9uc2UgY29kZSAqLworI2VuZGlmCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOIHx8IEJZVEVfT1JERVIgPT0gUERQX0VORElBTgorCQkJLyogZmllbGRzIGluIHRoaXJkIGJ5dGUgKi8KKwl1bnNpZ25lZAlyZCA6MTsJCS8qIHJlY3Vyc2lvbiBkZXNpcmVkICovCisJdW5zaWduZWQJdGMgOjE7CQkvKiB0cnVuY2F0ZWQgbWVzc2FnZSAqLworCXVuc2lnbmVkCWFhIDoxOwkJLyogYXV0aG9yaXRpdmUgYW5zd2VyICovCisJdW5zaWduZWQJb3Bjb2RlIDo0OwkvKiBwdXJwb3NlIG9mIG1lc3NhZ2UgKi8KKwl1bnNpZ25lZAlxciA6MTsJCS8qIHJlc3BvbnNlIGZsYWcgKi8KKwkJCS8qIGZpZWxkcyBpbiBmb3VydGggYnl0ZSAqLworCXVuc2lnbmVkCXJjb2RlIDo0OwkvKiByZXNwb25zZSBjb2RlICovCisJdW5zaWduZWQJY2Q6IDE7CQkvKiBjaGVja2luZyBkaXNhYmxlZCBieSByZXNvbHZlciAqLworCXVuc2lnbmVkCWFkOiAxOwkJLyogYXV0aGVudGljIGRhdGEgZnJvbSBuYW1lZCAqLworCXVuc2lnbmVkCXVudXNlZCA6MTsJLyogdW51c2VkIGJpdHMgKE1CWiBhcyBvZiA0LjkuM2EzKSAqLworCXVuc2lnbmVkCXJhIDoxOwkJLyogcmVjdXJzaW9uIGF2YWlsYWJsZSAqLworI2VuZGlmCisJCQkvKiByZW1haW5pbmcgYnl0ZXMgKi8KKwl1bnNpZ25lZAlxZGNvdW50IDoxNjsJLyogbnVtYmVyIG9mIHF1ZXN0aW9uIGVudHJpZXMgKi8KKwl1bnNpZ25lZAlhbmNvdW50IDoxNjsJLyogbnVtYmVyIG9mIGFuc3dlciBlbnRyaWVzICovCisJdW5zaWduZWQJbnNjb3VudCA6MTY7CS8qIG51bWJlciBvZiBhdXRob3JpdHkgZW50cmllcyAqLworCXVuc2lnbmVkCWFyY291bnQgOjE2OwkvKiBudW1iZXIgb2YgcmVzb3VyY2UgZW50cmllcyAqLworfSBIRUFERVI7CisKKyNkZWZpbmUgUEFDS0VUU1oJTlNfUEFDS0VUU1oKKyNkZWZpbmUgTUFYRE5BTUUJTlNfTUFYRE5BTUUKKyNkZWZpbmUgTUFYQ0ROQU1FCU5TX01BWENETkFNRQorI2RlZmluZSBNQVhMQUJFTAlOU19NQVhMQUJFTAorI2RlZmluZQlIRklYRURTWglOU19IRklYRURTWgorI2RlZmluZSBRRklYRURTWglOU19RRklYRURTWgorI2RlZmluZSBSUkZJWEVEU1oJTlNfUlJGSVhFRFNaCisjZGVmaW5lCUlOVDMyU1oJCU5TX0lOVDMyU1oKKyNkZWZpbmUJSU5UMTZTWgkJTlNfSU5UMTZTWgorI2RlZmluZQlJTkFERFJTWglOU19JTkFERFJTWgorI2RlZmluZQlJTjZBRERSU1oJTlNfSU42QUREUlNaCisjZGVmaW5lCUlORElSX01BU0sJTlNfQ01QUlNGTEdTCisjZGVmaW5lIE5BTUVTRVJWRVJfUE9SVAlOU19ERUZBVUxUUE9SVAorCisjZGVmaW5lIFNfWk9ORQkJbnNfc196bgorI2RlZmluZSBTX1BSRVJFUQluc19zX3ByCisjZGVmaW5lIFNfVVBEQVRFCW5zX3NfdWQKKyNkZWZpbmUgU19BRERUCQluc19zX2FyCisKKyNkZWZpbmUgUVVFUlkJCW5zX29fcXVlcnkKKyNkZWZpbmUgSVFVRVJZCQluc19vX2lxdWVyeQorI2RlZmluZSBTVEFUVVMJCW5zX29fc3RhdHVzCisjZGVmaW5lCU5TX05PVElGWV9PUAluc19vX25vdGlmeQorI2RlZmluZQlOU19VUERBVEVfT1AJbnNfb191cGRhdGUKKworI2RlZmluZSBOT0VSUk9SCQluc19yX25vZXJyb3IKKyNkZWZpbmUgRk9STUVSUgkJbnNfcl9mb3JtZXJyCisjZGVmaW5lIFNFUlZGQUlMCW5zX3Jfc2VydmZhaWwKKyNkZWZpbmUgTlhET01BSU4JbnNfcl9ueGRvbWFpbgorI2RlZmluZSBOT1RJTVAJCW5zX3Jfbm90aW1wbAorI2RlZmluZSBSRUZVU0VECQluc19yX3JlZnVzZWQKKyNkZWZpbmUgWVhET01BSU4JbnNfcl95eGRvbWFpbgorI2RlZmluZSBZWFJSU0VUCQluc19yX3l4cnJzZXQKKyNkZWZpbmUgTlhSUlNFVAkJbnNfcl9ueHJyc2V0CisjZGVmaW5lIE5PVEFVVEgJCW5zX3Jfbm90YXV0aAorI2RlZmluZSBOT1RaT05FCQluc19yX25vdHpvbmUKKy8qI2RlZmluZSBCQURTSUcJCW5zX3JfYmFkc2lnKi8KKy8qI2RlZmluZSBCQURLRVkJCW5zX3JfYmFka2V5Ki8KKy8qI2RlZmluZSBCQURUSU1FCQluc19yX2JhZHRpbWUqLworCisKKyNkZWZpbmUgREVMRVRFCQluc191b3BfZGVsZXRlCisjZGVmaW5lIEFERAkJbnNfdW9wX2FkZAorCisjZGVmaW5lIFRfQQkJbnNfdF9hCisjZGVmaW5lIFRfTlMJCW5zX3RfbnMKKyNkZWZpbmUgVF9NRAkJbnNfdF9tZAorI2RlZmluZSBUX01GCQluc190X21mCisjZGVmaW5lIFRfQ05BTUUJCW5zX3RfY25hbWUKKyNkZWZpbmUgVF9TT0EJCW5zX3Rfc29hCisjZGVmaW5lIFRfTUIJCW5zX3RfbWIKKyNkZWZpbmUgVF9NRwkJbnNfdF9tZworI2RlZmluZSBUX01SCQluc190X21yCisjZGVmaW5lIFRfTlVMTAkJbnNfdF9udWxsCisjZGVmaW5lIFRfV0tTCQluc190X3drcworI2RlZmluZSBUX1BUUgkJbnNfdF9wdHIKKyNkZWZpbmUgVF9ISU5GTwkJbnNfdF9oaW5mbworI2RlZmluZSBUX01JTkZPCQluc190X21pbmZvCisjZGVmaW5lIFRfTVgJCW5zX3RfbXgKKyNkZWZpbmUgVF9UWFQJCW5zX3RfdHh0CisjZGVmaW5lCVRfUlAJCW5zX3RfcnAKKyNkZWZpbmUgVF9BRlNEQgkJbnNfdF9hZnNkYgorI2RlZmluZSBUX1gyNQkJbnNfdF94MjUKKyNkZWZpbmUgVF9JU0ROCQluc190X2lzZG4KKyNkZWZpbmUgVF9SVAkJbnNfdF9ydAorI2RlZmluZSBUX05TQVAJCW5zX3RfbnNhcAorI2RlZmluZSBUX05TQVBfUFRSCW5zX3RfbnNhcF9wdHIKKyNkZWZpbmUJVF9TSUcJCW5zX3Rfc2lnCisjZGVmaW5lCVRfS0VZCQluc190X2tleQorI2RlZmluZQlUX1BYCQluc190X3B4CisjZGVmaW5lCVRfR1BPUwkJbnNfdF9ncG9zCisjZGVmaW5lCVRfQUFBQQkJbnNfdF9hYWFhCisjZGVmaW5lCVRfTE9DCQluc190X2xvYworI2RlZmluZQlUX05YVAkJbnNfdF9ueHQKKyNkZWZpbmUJVF9FSUQJCW5zX3RfZWlkCisjZGVmaW5lCVRfTklNTE9DCW5zX3RfbmltbG9jCisjZGVmaW5lCVRfU1JWCQluc190X3NydgorI2RlZmluZSBUX0FUTUEJCW5zX3RfYXRtYQorI2RlZmluZSBUX05BUFRSCQluc190X25hcHRyCisjZGVmaW5lCVRfVFNJRwkJbnNfdF90c2lnCisjZGVmaW5lCVRfSVhGUgkJbnNfdF9peGZyCisjZGVmaW5lIFRfQVhGUgkJbnNfdF9heGZyCisjZGVmaW5lIFRfTUFJTEIJCW5zX3RfbWFpbGIKKyNkZWZpbmUgVF9NQUlMQQkJbnNfdF9tYWlsYQorI2RlZmluZSBUX0FOWQkJbnNfdF9hbnkKKworI2RlZmluZSBDX0lOCQluc19jX2luCisjZGVmaW5lIENfQ0hBT1MJCW5zX2NfY2hhb3MKKyNkZWZpbmUgQ19IUwkJbnNfY19ocworLyogQklORF9VUERBVEUgKi8KKyNkZWZpbmUgQ19OT05FCQluc19jX25vbmUKKyNkZWZpbmUgQ19BTlkJCW5zX2NfYW55CisKKyNkZWZpbmUJR0VUU0hPUlQJCU5TX0dFVDE2CisjZGVmaW5lCUdFVExPTkcJCQlOU19HRVQzMgorI2RlZmluZQlQVVRTSE9SVAkJTlNfUFVUMTYKKyNkZWZpbmUJUFVUTE9ORwkJCU5TX1BVVDMyCisKKyNlbmRpZiAvKiBfQVJQQV9OQU1FU0VSX0NPTVBBVF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS90ZWxuZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS90ZWxuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc0Yzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL3RlbG5ldC5oCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRlbG5ldC5oCTguMiAoQmVya2VsZXkpIDEyLzE1LzkzCisgKi8KKworI2lmbmRlZiBfQVJQQV9URUxORVRfSAorI2RlZmluZQlfQVJQQV9URUxORVRfSCAxCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFRFTE5FVCBwcm90b2NvbC4KKyAqLworI2RlZmluZQlJQUMJMjU1CQkvKiBpbnRlcnByZXQgYXMgY29tbWFuZDogKi8KKyNkZWZpbmUJRE9OVAkyNTQJCS8qIHlvdSBhcmUgbm90IHRvIHVzZSBvcHRpb24gKi8KKyNkZWZpbmUJRE8JMjUzCQkvKiBwbGVhc2UsIHlvdSB1c2Ugb3B0aW9uICovCisjZGVmaW5lCVdPTlQJMjUyCQkvKiBJIHdvbid0IHVzZSBvcHRpb24gKi8KKyNkZWZpbmUJV0lMTAkyNTEJCS8qIEkgd2lsbCB1c2Ugb3B0aW9uICovCisjZGVmaW5lCVNCCTI1MAkJLyogaW50ZXJwcmV0IGFzIHN1Ym5lZ290aWF0aW9uICovCisjZGVmaW5lCUdBCTI0OQkJLyogeW91IG1heSByZXZlcnNlIHRoZSBsaW5lICovCisjZGVmaW5lCUVMCTI0OAkJLyogZXJhc2UgdGhlIGN1cnJlbnQgbGluZSAqLworI2RlZmluZQlFQwkyNDcJCS8qIGVyYXNlIHRoZSBjdXJyZW50IGNoYXJhY3RlciAqLworI2RlZmluZQlBWVQJMjQ2CQkvKiBhcmUgeW91IHRoZXJlICovCisjZGVmaW5lCUFPCTI0NQkJLyogYWJvcnQgb3V0cHV0LS1idXQgbGV0IHByb2cgZmluaXNoICovCisjZGVmaW5lCUlQCTI0NAkJLyogaW50ZXJydXB0IHByb2Nlc3MtLXBlcm1hbmVudGx5ICovCisjZGVmaW5lCUJSRUFLCTI0MwkJLyogYnJlYWsgKi8KKyNkZWZpbmUJRE0JMjQyCQkvKiBkYXRhIG1hcmstLWZvciBjb25uZWN0LiBjbGVhbmluZyAqLworI2RlZmluZQlOT1AJMjQxCQkvKiBub3AgKi8KKyNkZWZpbmUJU0UJMjQwCQkvKiBlbmQgc3ViIG5lZ290aWF0aW9uICovCisjZGVmaW5lIEVPUiAgICAgMjM5ICAgICAgICAgICAgIC8qIGVuZCBvZiByZWNvcmQgKHRyYW5zcGFyZW50IG1vZGUpICovCisjZGVmaW5lCUFCT1JUCTIzOAkJLyogQWJvcnQgcHJvY2VzcyAqLworI2RlZmluZQlTVVNQCTIzNwkJLyogU3VzcGVuZCBwcm9jZXNzICovCisjZGVmaW5lCXhFT0YJMjM2CQkvKiBFbmQgb2YgZmlsZTogRU9GIGlzIGFscmVhZHkgdXNlZC4uLiAqLworCisjZGVmaW5lIFNZTkNICTI0MgkJLyogZm9yIHRlbGZ1bmMgY2FsbHMgKi8KKworI2lmZGVmIFRFTENNRFMKK2NoYXIgKnRlbGNtZHNbXSA9IHsKKwkiRU9GIiwgIlNVU1AiLCAiQUJPUlQiLCAiRU9SIiwKKwkiU0UiLCAiTk9QIiwgIkRNQVJLIiwgIkJSSyIsICJJUCIsICJBTyIsICJBWVQiLCAiRUMiLAorCSJFTCIsICJHQSIsICJTQiIsICJXSUxMIiwgIldPTlQiLCAiRE8iLCAiRE9OVCIsICJJQUMiLCAwLAorfTsKKyNlbHNlCitleHRlcm4gY2hhciAqdGVsY21kc1tdOworI2VuZGlmCisKKyNkZWZpbmUJVEVMQ01EX0ZJUlNUCXhFT0YKKyNkZWZpbmUJVEVMQ01EX0xBU1QJSUFDCisjZGVmaW5lCVRFTENNRF9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPD0gVEVMQ01EX0xBU1QgJiYgXAorCQkJICh1bnNpZ25lZCBpbnQpKHgpID49IFRFTENNRF9GSVJTVCkKKyNkZWZpbmUJVEVMQ01EKHgpCXRlbGNtZHNbKHgpLVRFTENNRF9GSVJTVF0KKworLyogdGVsbmV0IG9wdGlvbnMgKi8KKyNkZWZpbmUgVEVMT1BUX0JJTkFSWQkwCS8qIDgtYml0IGRhdGEgcGF0aCAqLworI2RlZmluZSBURUxPUFRfRUNITwkxCS8qIGVjaG8gKi8KKyNkZWZpbmUJVEVMT1BUX1JDUAkyCS8qIHByZXBhcmUgdG8gcmVjb25uZWN0ICovCisjZGVmaW5lCVRFTE9QVF9TR0EJMwkvKiBzdXBwcmVzcyBnbyBhaGVhZCAqLworI2RlZmluZQlURUxPUFRfTkFNUwk0CS8qIGFwcHJveGltYXRlIG1lc3NhZ2Ugc2l6ZSAqLworI2RlZmluZQlURUxPUFRfU1RBVFVTCTUJLyogZ2l2ZSBzdGF0dXMgKi8KKyNkZWZpbmUJVEVMT1BUX1RNCTYJLyogdGltaW5nIG1hcmsgKi8KKyNkZWZpbmUJVEVMT1BUX1JDVEUJNwkvKiByZW1vdGUgY29udHJvbGxlZCB0cmFuc21pc3Npb24gYW5kIGVjaG8gKi8KKyNkZWZpbmUgVEVMT1BUX05BT0wgCTgJLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBsaW5lIHdpZHRoICovCisjZGVmaW5lIFRFTE9QVF9OQU9QIAk5CS8qIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgcGFnZSBzaXplICovCisjZGVmaW5lIFRFTE9QVF9OQU9DUkQJMTAJLyogbmVnb3RpYXRlIGFib3V0IENSIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lIFRFTE9QVF9OQU9IVFMJMTEJLyogbmVnb3RpYXRlIGFib3V0IGhvcml6b250YWwgdGFic3RvcHMgKi8KKyNkZWZpbmUgVEVMT1BUX05BT0hURAkxMgkvKiBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWIgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05BT0ZGRAkxMwkvKiBuZWdvdGlhdGUgYWJvdXQgZm9ybWZlZWQgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05BT1ZUUwkxNAkvKiBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIHN0b3BzICovCisjZGVmaW5lIFRFTE9QVF9OQU9WVEQJMTUJLyogbmVnb3RpYXRlIGFib3V0IHZlcnRpY2FsIHRhYiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSBURUxPUFRfTkFPTEZECTE2CS8qIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgTEYgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX1hBU0NJSQkxNwkvKiBleHRlbmRlZCBhc2NpaSBjaGFyYWN0ZXIgc2V0ICovCisjZGVmaW5lCVRFTE9QVF9MT0dPVVQJMTgJLyogZm9yY2UgbG9nb3V0ICovCisjZGVmaW5lCVRFTE9QVF9CTQkxOQkvKiBieXRlIG1hY3JvICovCisjZGVmaW5lCVRFTE9QVF9ERVQJMjAJLyogZGF0YSBlbnRyeSB0ZXJtaW5hbCAqLworI2RlZmluZQlURUxPUFRfU1VQRFVQCTIxCS8qIHN1cGR1cCBwcm90b2NvbCAqLworI2RlZmluZQlURUxPUFRfU1VQRFVQT1VUUFVUIDIyCS8qIHN1cGR1cCBvdXRwdXQgKi8KKyNkZWZpbmUJVEVMT1BUX1NORExPQwkyMwkvKiBzZW5kIGxvY2F0aW9uICovCisjZGVmaW5lCVRFTE9QVF9UVFlQRQkyNAkvKiB0ZXJtaW5hbCB0eXBlICovCisjZGVmaW5lCVRFTE9QVF9FT1IJMjUJLyogZW5kIG9yIHJlY29yZCAqLworI2RlZmluZQlURUxPUFRfVFVJRAkyNgkvKiBUQUNBQ1MgdXNlciBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZQlURUxPUFRfT1VUTVJLCTI3CS8qIG91dHB1dCBtYXJraW5nICovCisjZGVmaW5lCVRFTE9QVF9UVFlMT0MJMjgJLyogdGVybWluYWwgbG9jYXRpb24gbnVtYmVyICovCisjZGVmaW5lCVRFTE9QVF8zMjcwUkVHSU1FIDI5CS8qIDMyNzAgcmVnaW1lICovCisjZGVmaW5lCVRFTE9QVF9YM1BBRAkzMAkvKiBYLjMgUEFEICovCisjZGVmaW5lCVRFTE9QVF9OQVdTCTMxCS8qIHdpbmRvdyBzaXplICovCisjZGVmaW5lCVRFTE9QVF9UU1BFRUQJMzIJLyogdGVybWluYWwgc3BlZWQgKi8KKyNkZWZpbmUJVEVMT1BUX0xGTE9XCTMzCS8qIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVEVMT1BUX0xJTkVNT0RFCTM0CS8qIExpbmVtb2RlIG9wdGlvbiAqLworI2RlZmluZSBURUxPUFRfWERJU1BMT0MJMzUJLyogWCBEaXNwbGF5IExvY2F0aW9uICovCisjZGVmaW5lIFRFTE9QVF9PTERfRU5WSVJPTiAzNgkvKiBPbGQgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyNkZWZpbmUJVEVMT1BUX0FVVEhFTlRJQ0FUSU9OIDM3LyogQXV0aGVudGljYXRlICovCisjZGVmaW5lCVRFTE9QVF9FTkNSWVBUCTM4CS8qIEVuY3J5cHRpb24gb3B0aW9uICovCisjZGVmaW5lIFRFTE9QVF9ORVdfRU5WSVJPTiAzOQkvKiBOZXcgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyNkZWZpbmUJVEVMT1BUX0VYT1BMCTI1NQkvKiBleHRlbmRlZC1vcHRpb25zLWxpc3QgKi8KKworCisjZGVmaW5lCU5URUxPUFRTCSgxK1RFTE9QVF9ORVdfRU5WSVJPTikKKyNpZmRlZiBURUxPUFRTCitjaGFyICp0ZWxvcHRzW05URUxPUFRTKzFdID0geworCSJCSU5BUlkiLCAiRUNITyIsICJSQ1AiLCAiU1VQUFJFU1MgR08gQUhFQUQiLCAiTkFNRSIsCisJIlNUQVRVUyIsICJUSU1JTkcgTUFSSyIsICJSQ1RFIiwgIk5BT0wiLCAiTkFPUCIsCisJIk5BT0NSRCIsICJOQU9IVFMiLCAiTkFPSFREIiwgIk5BT0ZGRCIsICJOQU9WVFMiLAorCSJOQU9WVEQiLCAiTkFPTEZEIiwgIkVYVEVORCBBU0NJSSIsICJMT0dPVVQiLCAiQllURSBNQUNSTyIsCisJIkRBVEEgRU5UUlkgVEVSTUlOQUwiLCAiU1VQRFVQIiwgIlNVUERVUCBPVVRQVVQiLAorCSJTRU5EIExPQ0FUSU9OIiwgIlRFUk1JTkFMIFRZUEUiLCAiRU5EIE9GIFJFQ09SRCIsCisJIlRBQ0FDUyBVSUQiLCAiT1VUUFVUIE1BUktJTkciLCAiVFRZTE9DIiwKKwkiMzI3MCBSRUdJTUUiLCAiWC4zIFBBRCIsICJOQVdTIiwgIlRTUEVFRCIsICJMRkxPVyIsCisJIkxJTkVNT0RFIiwgIlhESVNQTE9DIiwgIk9MRC1FTlZJUk9OIiwgIkFVVEhFTlRJQ0FUSU9OIiwKKwkiRU5DUllQVCIsICJORVctRU5WSVJPTiIsCisJMCwKK307CisjZGVmaW5lCVRFTE9QVF9GSVJTVAlURUxPUFRfQklOQVJZCisjZGVmaW5lCVRFTE9QVF9MQVNUCVRFTE9QVF9ORVdfRU5WSVJPTgorI2RlZmluZQlURUxPUFRfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDw9IFRFTE9QVF9MQVNUKQorI2RlZmluZQlURUxPUFQoeCkJdGVsb3B0c1soeCktVEVMT1BUX0ZJUlNUXQorI2VuZGlmCisKKy8qIHN1Yi1vcHRpb24gcXVhbGlmaWVycyAqLworI2RlZmluZQlURUxRVUFMX0lTCTAJLyogb3B0aW9uIGlzLi4uICovCisjZGVmaW5lCVRFTFFVQUxfU0VORAkxCS8qIHNlbmQgb3B0aW9uICovCisjZGVmaW5lCVRFTFFVQUxfSU5GTwkyCS8qIEVOVklST046IGluZm9ybWF0aW9uYWwgdmVyc2lvbiBvZiBJUyAqLworI2RlZmluZQlURUxRVUFMX1JFUExZCTIJLyogQVVUSEVOVElDQVRJT046IGNsaWVudCB2ZXJzaW9uIG9mIElTICovCisjZGVmaW5lCVRFTFFVQUxfTkFNRQkzCS8qIEFVVEhFTlRJQ0FUSU9OOiBjbGllbnQgdmVyc2lvbiBvZiBJUyAqLworCisjZGVmaW5lCUxGTE9XX09GRgkJMAkvKiBEaXNhYmxlIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJTEZMT1dfT04JCTEJLyogRW5hYmxlIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJTEZMT1dfUkVTVEFSVF9BTlkJMgkvKiBSZXN0YXJ0IG91dHB1dCBvbiBhbnkgY2hhciAqLworI2RlZmluZQlMRkxPV19SRVNUQVJUX1hPTgkzCS8qIFJlc3RhcnQgb3V0cHV0IG9ubHkgb24gWE9OICovCisKKy8qCisgKiBMSU5FTU9ERSBzdWJvcHRpb25zCisgKi8KKworI2RlZmluZQlMTV9NT0RFCQkxCisjZGVmaW5lCUxNX0ZPUldBUkRNQVNLCTIKKyNkZWZpbmUJTE1fU0xDCQkzCisKKyNkZWZpbmUJTU9ERV9FRElUCTB4MDEKKyNkZWZpbmUJTU9ERV9UUkFQU0lHCTB4MDIKKyNkZWZpbmUJTU9ERV9BQ0sJMHgwNAorI2RlZmluZSBNT0RFX1NPRlRfVEFCCTB4MDgKKyNkZWZpbmUgTU9ERV9MSVRfRUNITwkweDEwCisKKyNkZWZpbmUJTU9ERV9NQVNLCTB4MWYKKworLyogTm90IHBhcnQgb2YgcHJvdG9jb2wsIGJ1dCBuZWVkZWQgdG8gc2ltcGxpZnkgdGhpbmdzLi4uICovCisjZGVmaW5lIE1PREVfRkxPVwkJMHgwMTAwCisjZGVmaW5lIE1PREVfRUNITwkJMHgwMjAwCisjZGVmaW5lIE1PREVfSU5CSU4JCTB4MDQwMAorI2RlZmluZSBNT0RFX09VVEJJTgkJMHgwODAwCisjZGVmaW5lIE1PREVfRk9SQ0UJCTB4MTAwMAorCisjZGVmaW5lCVNMQ19TWU5DSAkxCisjZGVmaW5lCVNMQ19CUksJCTIKKyNkZWZpbmUJU0xDX0lQCQkzCisjZGVmaW5lCVNMQ19BTwkJNAorI2RlZmluZQlTTENfQVlUCQk1CisjZGVmaW5lCVNMQ19FT1IJCTYKKyNkZWZpbmUJU0xDX0FCT1JUCTcKKyNkZWZpbmUJU0xDX0VPRgkJOAorI2RlZmluZQlTTENfU1VTUAk5CisjZGVmaW5lCVNMQ19FQwkJMTAKKyNkZWZpbmUJU0xDX0VMCQkxMQorI2RlZmluZQlTTENfRVcJCTEyCisjZGVmaW5lCVNMQ19SUAkJMTMKKyNkZWZpbmUJU0xDX0xORVhUCTE0CisjZGVmaW5lCVNMQ19YT04JCTE1CisjZGVmaW5lCVNMQ19YT0ZGCTE2CisjZGVmaW5lCVNMQ19GT1JXMQkxNworI2RlZmluZQlTTENfRk9SVzIJMTgKKworI2RlZmluZQlOU0xDCQkxOAorCisvKgorICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBkZWZpbmUgU0xDX05BTUVTIHRvIGJlIHRoZQorICogbGlzdCBvZiBuYW1lcyBpZiBTTENfTkFNRVMgaXMgbm90IGRlZmluZWQuCisgKi8KKyNkZWZpbmUJU0xDX05BTUVMSVNUCSIwIiwgIlNZTkNIIiwgIkJSSyIsICJJUCIsICJBTyIsICJBWVQiLCAiRU9SIiwgXAorCQkJIkFCT1JUIiwgIkVPRiIsICJTVVNQIiwgIkVDIiwgIkVMIiwgIkVXIiwgIlJQIiwgXAorCQkJIkxORVhUIiwgIlhPTiIsICJYT0ZGIiwgIkZPUlcxIiwgIkZPUlcyIiwgMCwKKyNpZmRlZglTTENfTkFNRVMKK2NoYXIgKnNsY19uYW1lc1tdID0geworCVNMQ19OQU1FTElTVAorfTsKKyNlbHNlCitleHRlcm4gY2hhciAqc2xjX25hbWVzW107CisjZGVmaW5lCVNMQ19OQU1FUyBTTENfTkFNRUxJU1QKKyNlbmRpZgorCisjZGVmaW5lCVNMQ19OQU1FX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8PSBOU0xDKQorI2RlZmluZSBTTENfTkFNRSh4KQlzbGNfbmFtZXNbeF0KKworI2RlZmluZQlTTENfTk9TVVBQT1JUCTAKKyNkZWZpbmUJU0xDX0NBTlRDSEFOR0UJMQorI2RlZmluZQlTTENfVkFSSUFCTEUJMgorI2RlZmluZQlTTENfREVGQVVMVAkzCisjZGVmaW5lCVNMQ19MRVZFTEJJVFMJMHgwMworCisjZGVmaW5lCVNMQ19GVU5DCTAKKyNkZWZpbmUJU0xDX0ZMQUdTCTEKKyNkZWZpbmUJU0xDX1ZBTFVFCTIKKworI2RlZmluZQlTTENfQUNLCQkweDgwCisjZGVmaW5lCVNMQ19GTFVTSElOCTB4NDAKKyNkZWZpbmUJU0xDX0ZMVVNIT1VUCTB4MjAKKworI2RlZmluZQlPTERfRU5WX1ZBUgkxCisjZGVmaW5lCU9MRF9FTlZfVkFMVUUJMAorI2RlZmluZQlORVdfRU5WX1ZBUgkwCisjZGVmaW5lCU5FV19FTlZfVkFMVUUJMQorI2RlZmluZQlFTlZfRVNDCQkyCisjZGVmaW5lIEVOVl9VU0VSVkFSCTMKKworLyoKKyAqIEFVVEhFTlRJQ0FUSU9OIHN1Ym9wdGlvbnMKKyAqLworCisvKgorICogV2hvIGlzIGF1dGhlbnRpY2F0aW5nIHdobyAuLi4KKyAqLworI2RlZmluZQlBVVRIX1dIT19DTElFTlQJCTAJLyogQ2xpZW50IGF1dGhlbnRpY2F0aW5nIHNlcnZlciAqLworI2RlZmluZQlBVVRIX1dIT19TRVJWRVIJCTEJLyogU2VydmVyIGF1dGhlbnRpY2F0aW5nIGNsaWVudCAqLworI2RlZmluZQlBVVRIX1dIT19NQVNLCQkxCisKKy8qCisgKiBhbW91bnQgb2YgYXV0aGVudGljYXRpb24gZG9uZQorICovCisjZGVmaW5lCUFVVEhfSE9XX09ORV9XQVkJMAorI2RlZmluZQlBVVRIX0hPV19NVVRVQUwJCTIKKyNkZWZpbmUJQVVUSF9IT1dfTUFTSwkJMgorCisjZGVmaW5lCUFVVEhUWVBFX05VTEwJCTAKKyNkZWZpbmUJQVVUSFRZUEVfS0VSQkVST1NfVjQJMQorI2RlZmluZQlBVVRIVFlQRV9LRVJCRVJPU19WNQkyCisjZGVmaW5lCUFVVEhUWVBFX1NQWAkJMworI2RlZmluZQlBVVRIVFlQRV9NSU5LCQk0CisjZGVmaW5lCUFVVEhUWVBFX0NOVAkJNQorCisjZGVmaW5lCUFVVEhUWVBFX1RFU1QJCTk5CisKKyNpZmRlZglBVVRIX05BTUVTCitjaGFyICphdXRodHlwZV9uYW1lc1tdID0geworCSJOVUxMIiwgIktFUkJFUk9TX1Y0IiwgIktFUkJFUk9TX1Y1IiwgIlNQWCIsICJNSU5LIiwgMCwKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKmF1dGh0eXBlX25hbWVzW107CisjZW5kaWYKKworI2RlZmluZQlBVVRIVFlQRV9OQU1FX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8IEFVVEhUWVBFX0NOVCkKKyNkZWZpbmUJQVVUSFRZUEVfTkFNRSh4KQlhdXRodHlwZV9uYW1lc1t4XQorCisvKgorICogRU5DUllQVGlvbiBzdWJvcHRpb25zCisgKi8KKyNkZWZpbmUJRU5DUllQVF9JUwkJMAkvKiBJIHBpY2sgZW5jcnlwdGlvbiB0eXBlIC4uLiAqLworI2RlZmluZQlFTkNSWVBUX1NVUFBPUlQJCTEJLyogSSBzdXBwb3J0IGVuY3J5cHRpb24gdHlwZXMgLi4uICovCisjZGVmaW5lCUVOQ1JZUFRfUkVQTFkJCTIJLyogSW5pdGlhbCBzZXR1cCByZXNwb25zZSAqLworI2RlZmluZQlFTkNSWVBUX1NUQVJUCQkzCS8qIEFtIHN0YXJ0aW5nIHRvIHNlbmQgZW5jcnlwdGVkICovCisjZGVmaW5lCUVOQ1JZUFRfRU5ECQk0CS8qIEFtIGVuZGluZyBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUJRU5DUllQVF9SRVFTVEFSVAk1CS8qIFJlcXVlc3QgeW91IHN0YXJ0IGVuY3J5cHRpbmcgKi8KKyNkZWZpbmUJRU5DUllQVF9SRVFFTkQJCTYJLyogUmVxdWVzdCB5b3Ugc2VuZCBlbmNyeXB0aW5nICovCisjZGVmaW5lCUVOQ1JZUFRfRU5DX0tFWUlECTcKKyNkZWZpbmUJRU5DUllQVF9ERUNfS0VZSUQJOAorI2RlZmluZQlFTkNSWVBUX0NOVAkJOQorCisjZGVmaW5lCUVOQ1RZUEVfQU5ZCQkwCisjZGVmaW5lCUVOQ1RZUEVfREVTX0NGQjY0CTEKKyNkZWZpbmUJRU5DVFlQRV9ERVNfT0ZCNjQJMgorI2RlZmluZQlFTkNUWVBFX0NOVAkJMworCisjaWZkZWYJRU5DUllQVF9OQU1FUworY2hhciAqZW5jcnlwdF9uYW1lc1tdID0geworCSJJUyIsICJTVVBQT1JUIiwgIlJFUExZIiwgIlNUQVJUIiwgIkVORCIsCisJIlJFUVVFU1QtU1RBUlQiLCAiUkVRVUVTVC1FTkQiLCAiRU5DLUtFWUlEIiwgIkRFQy1LRVlJRCIsCisJMCwKK307CitjaGFyICplbmN0eXBlX25hbWVzW10gPSB7CisJIkFOWSIsICJERVNfQ0ZCNjQiLCAgIkRFU19PRkI2NCIsICAwLAorfTsKKyNlbHNlCitleHRlcm4gY2hhciAqZW5jcnlwdF9uYW1lc1tdOworZXh0ZXJuIGNoYXIgKmVuY3R5cGVfbmFtZXNbXTsKKyNlbmRpZgorCisKKyNkZWZpbmUJRU5DUllQVF9OQU1FX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8IEVOQ1JZUFRfQ05UKQorI2RlZmluZQlFTkNSWVBUX05BTUUoeCkJCWVuY3J5cHRfbmFtZXNbeF0KKworI2RlZmluZQlFTkNUWVBFX05BTUVfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDwgRU5DVFlQRV9DTlQpCisjZGVmaW5lCUVOQ1RZUEVfTkFNRSh4KQkJZW5jdHlwZV9uYW1lc1t4XQorCisjZW5kaWYgLyogYXJwYS90ZWxuZXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hcnBhL3RmdHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS90ZnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiMDU1OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXJwYS90ZnRwLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0ZnRwLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfQVJQQV9URlRQX0gKKyNkZWZpbmUJX0FSUEFfVEZUUF9IIDEKKworLyoKKyAqIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCAoSUVOLTEzMykKKyAqLworI2RlZmluZQlTRUdTSVpFCQk1MTIJCS8qIGRhdGEgc2VnbWVudCBzaXplICovCisKKy8qCisgKiBQYWNrZXQgdHlwZXMuCisgKi8KKyNkZWZpbmUJUlJRCTAxCQkJCS8qIHJlYWQgcmVxdWVzdCAqLworI2RlZmluZQlXUlEJMDIJCQkJLyogd3JpdGUgcmVxdWVzdCAqLworI2RlZmluZQlEQVRBCTAzCQkJCS8qIGRhdGEgcGFja2V0ICovCisjZGVmaW5lCUFDSwkwNAkJCQkvKiBhY2tub3dsZWRnZW1lbnQgKi8KKyNkZWZpbmUJRVJST1IJMDUJCQkJLyogZXJyb3IgY29kZSAqLworCitzdHJ1Y3QJdGZ0cGhkciB7CisJc2hvcnQJdGhfb3Bjb2RlOwkJCS8qIHBhY2tldCB0eXBlICovCisJdW5pb24geworCQl1bnNpZ25lZCBzaG9ydAl0dV9ibG9jazsJLyogYmxvY2sgIyAqLworCQlzaG9ydAl0dV9jb2RlOwkJLyogZXJyb3IgY29kZSAqLworCQljaGFyCXR1X3N0dWZmWzFdOwkJLyogcmVxdWVzdCBwYWNrZXQgc3R1ZmYgKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdGhfdTsKKwljaGFyCXRoX2RhdGFbMV07CQkJLyogZGF0YSBvciBlcnJvciBzdHJpbmcgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZQl0aF9ibG9jawl0aF91LnR1X2Jsb2NrCisjZGVmaW5lCXRoX2NvZGUJCXRoX3UudHVfY29kZQorI2RlZmluZQl0aF9zdHVmZgl0aF91LnR1X3N0dWZmCisjZGVmaW5lCXRoX21zZwkJdGhfZGF0YQorCisvKgorICogRXJyb3IgY29kZXMuCisgKi8KKyNkZWZpbmUJRVVOREVGCQkwCQkvKiBub3QgZGVmaW5lZCAqLworI2RlZmluZQlFTk9URk9VTkQJMQkJLyogZmlsZSBub3QgZm91bmQgKi8KKyNkZWZpbmUJRUFDQ0VTUwkJMgkJLyogYWNjZXNzIHZpb2xhdGlvbiAqLworI2RlZmluZQlFTk9TUEFDRQkzCQkvKiBkaXNrIGZ1bGwgb3IgYWxsb2NhdGlvbiBleGNlZWRlZCAqLworI2RlZmluZQlFQkFET1AJCTQJCS8qIGlsbGVnYWwgVEZUUCBvcGVyYXRpb24gKi8KKyNkZWZpbmUJRUJBRElECQk1CQkvKiB1bmtub3duIHRyYW5zZmVyIElEICovCisjZGVmaW5lCUVFWElTVFMJCTYJCS8qIGZpbGUgYWxyZWFkeSBleGlzdHMgKi8KKyNkZWZpbmUJRU5PVVNFUgkJNwkJLyogbm8gc3VjaCB1c2VyICovCisKKyNlbmRpZiAvKiBhcnBhL3RmdHAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9lcnJuby1iYXNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2Vycm5vLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTExNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9lcnJuby1iYXNlLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfRVJSTk9fQkFTRV9ICisjZGVmaW5lIF9BU01fR0VORVJJQ19FUlJOT19CQVNFX0gKKworI2RlZmluZQlFUEVSTQkJIDEJLyogT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgKi8KKyNkZWZpbmUJRU5PRU5UCQkgMgkvKiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVTUkNICQkgMwkvKiBObyBzdWNoIHByb2Nlc3MgKi8KKyNkZWZpbmUJRUlOVFIJCSA0CS8qIEludGVycnVwdGVkIHN5c3RlbSBjYWxsICovCisjZGVmaW5lCUVJTwkJIDUJLyogSS9PIGVycm9yICovCisjZGVmaW5lCUVOWElPCQkgNgkvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCisjZGVmaW5lCUUyQklHCQkgNwkvKiBBcmd1bWVudCBsaXN0IHRvbyBsb25nICovCisjZGVmaW5lCUVOT0VYRUMJCSA4CS8qIEV4ZWMgZm9ybWF0IGVycm9yICovCisjZGVmaW5lCUVCQURGCQkgOQkvKiBCYWQgZmlsZSBudW1iZXIgKi8KKyNkZWZpbmUJRUNISUxECQkxMAkvKiBObyBjaGlsZCBwcm9jZXNzZXMgKi8KKyNkZWZpbmUJRUFHQUlOCQkxMQkvKiBUcnkgYWdhaW4gKi8KKyNkZWZpbmUJRU5PTUVNCQkxMgkvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lCUVBQ0NFUwkJMTMJLyogUGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUJRUZBVUxUCQkxNAkvKiBCYWQgYWRkcmVzcyAqLworI2RlZmluZQlFTk9UQkxLCQkxNQkvKiBCbG9jayBkZXZpY2UgcmVxdWlyZWQgKi8KKyNkZWZpbmUJRUJVU1kJCTE2CS8qIERldmljZSBvciByZXNvdXJjZSBidXN5ICovCisjZGVmaW5lCUVFWElTVAkJMTcJLyogRmlsZSBleGlzdHMgKi8KKyNkZWZpbmUJRVhERVYJCTE4CS8qIENyb3NzLWRldmljZSBsaW5rICovCisjZGVmaW5lCUVOT0RFVgkJMTkJLyogTm8gc3VjaCBkZXZpY2UgKi8KKyNkZWZpbmUJRU5PVERJUgkJMjAJLyogTm90IGEgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVJU0RJUgkJMjEJLyogSXMgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRUlOVkFMCQkyMgkvKiBJbnZhbGlkIGFyZ3VtZW50ICovCisjZGVmaW5lCUVORklMRQkJMjMJLyogRmlsZSB0YWJsZSBvdmVyZmxvdyAqLworI2RlZmluZQlFTUZJTEUJCTI0CS8qIFRvbyBtYW55IG9wZW4gZmlsZXMgKi8KKyNkZWZpbmUJRU5PVFRZCQkyNQkvKiBOb3QgYSB0eXBld3JpdGVyICovCisjZGVmaW5lCUVUWFRCU1kJCTI2CS8qIFRleHQgZmlsZSBidXN5ICovCisjZGVmaW5lCUVGQklHCQkyNwkvKiBGaWxlIHRvbyBsYXJnZSAqLworI2RlZmluZQlFTk9TUEMJCTI4CS8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCisjZGVmaW5lCUVTUElQRQkJMjkJLyogSWxsZWdhbCBzZWVrICovCisjZGVmaW5lCUVST0ZTCQkzMAkvKiBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUJRU1MSU5LCQkzMQkvKiBUb28gbWFueSBsaW5rcyAqLworI2RlZmluZQlFUElQRQkJMzIJLyogQnJva2VuIHBpcGUgKi8KKyNkZWZpbmUJRURPTQkJMzMJLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMgKi8KKyNkZWZpbmUJRVJBTkdFCQkzNAkvKiBNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZXJybm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg1MmMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9lcnJuby5oCkBAIC0wLDAgKzEsMTA5IEBACisjaWZuZGVmIF9BU01fR0VORVJJQ19FUlJOT19ICisjZGVmaW5lIF9BU01fR0VORVJJQ19FUlJOT19ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby1iYXNlLmg+CisKKyNkZWZpbmUJRURFQURMSwkJMzUJLyogUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIgKi8KKyNkZWZpbmUJRU5BTUVUT09MT05HCTM2CS8qIEZpbGUgbmFtZSB0b28gbG9uZyAqLworI2RlZmluZQlFTk9MQ0sJCTM3CS8qIE5vIHJlY29yZCBsb2NrcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRU5PU1lTCQkzOAkvKiBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUJRU5PVEVNUFRZCTM5CS8qIERpcmVjdG9yeSBub3QgZW1wdHkgKi8KKyNkZWZpbmUJRUxPT1AJCTQwCS8qIFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkICovCisjZGVmaW5lCUVXT1VMREJMT0NLCUVBR0FJTgkvKiBPcGVyYXRpb24gd291bGQgYmxvY2sgKi8KKyNkZWZpbmUJRU5PTVNHCQk0MgkvKiBObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZSAqLworI2RlZmluZQlFSURSTQkJNDMJLyogSWRlbnRpZmllciByZW1vdmVkICovCisjZGVmaW5lCUVDSFJORwkJNDQJLyogQ2hhbm5lbCBudW1iZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lCUVMMk5TWU5DCTQ1CS8qIExldmVsIDIgbm90IHN5bmNocm9uaXplZCAqLworI2RlZmluZQlFTDNITFQJCTQ2CS8qIExldmVsIDMgaGFsdGVkICovCisjZGVmaW5lCUVMM1JTVAkJNDcJLyogTGV2ZWwgMyByZXNldCAqLworI2RlZmluZQlFTE5STkcJCTQ4CS8qIExpbmsgbnVtYmVyIG91dCBvZiByYW5nZSAqLworI2RlZmluZQlFVU5BVENICQk0OQkvKiBQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkICovCisjZGVmaW5lCUVOT0NTSQkJNTAJLyogTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRUwySExUCQk1MQkvKiBMZXZlbCAyIGhhbHRlZCAqLworI2RlZmluZQlFQkFERQkJNTIJLyogSW52YWxpZCBleGNoYW5nZSAqLworI2RlZmluZQlFQkFEUgkJNTMJLyogSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUJRVhGVUxMCQk1NAkvKiBFeGNoYW5nZSBmdWxsICovCisjZGVmaW5lCUVOT0FOTwkJNTUJLyogTm8gYW5vZGUgKi8KKyNkZWZpbmUJRUJBRFJRQwkJNTYJLyogSW52YWxpZCByZXF1ZXN0IGNvZGUgKi8KKyNkZWZpbmUJRUJBRFNMVAkJNTcJLyogSW52YWxpZCBzbG90ICovCisKKyNkZWZpbmUJRURFQURMT0NLCUVERUFETEsKKworI2RlZmluZQlFQkZPTlQJCTU5CS8qIEJhZCBmb250IGZpbGUgZm9ybWF0ICovCisjZGVmaW5lCUVOT1NUUgkJNjAJLyogRGV2aWNlIG5vdCBhIHN0cmVhbSAqLworI2RlZmluZQlFTk9EQVRBCQk2MQkvKiBObyBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZQlFVElNRQkJNjIJLyogVGltZXIgZXhwaXJlZCAqLworI2RlZmluZQlFTk9TUgkJNjMJLyogT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzICovCisjZGVmaW5lCUVOT05FVAkJNjQJLyogTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsgKi8KKyNkZWZpbmUJRU5PUEtHCQk2NQkvKiBQYWNrYWdlIG5vdCBpbnN0YWxsZWQgKi8KKyNkZWZpbmUJRVJFTU9URQkJNjYJLyogT2JqZWN0IGlzIHJlbW90ZSAqLworI2RlZmluZQlFTk9MSU5LCQk2NwkvKiBMaW5rIGhhcyBiZWVuIHNldmVyZWQgKi8KKyNkZWZpbmUJRUFEVgkJNjgJLyogQWR2ZXJ0aXNlIGVycm9yICovCisjZGVmaW5lCUVTUk1OVAkJNjkJLyogU3Jtb3VudCBlcnJvciAqLworI2RlZmluZQlFQ09NTQkJNzAJLyogQ29tbXVuaWNhdGlvbiBlcnJvciBvbiBzZW5kICovCisjZGVmaW5lCUVQUk9UTwkJNzEJLyogUHJvdG9jb2wgZXJyb3IgKi8KKyNkZWZpbmUJRU1VTFRJSE9QCTcyCS8qIE11bHRpaG9wIGF0dGVtcHRlZCAqLworI2RlZmluZQlFRE9URE9UCQk3MwkvKiBSRlMgc3BlY2lmaWMgZXJyb3IgKi8KKyNkZWZpbmUJRUJBRE1TRwkJNzQJLyogTm90IGEgZGF0YSBtZXNzYWdlICovCisjZGVmaW5lCUVPVkVSRkxPVwk3NQkvKiBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlICovCisjZGVmaW5lCUVOT1RVTklRCTc2CS8qIE5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrICovCisjZGVmaW5lCUVCQURGRAkJNzcJLyogRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSAqLworI2RlZmluZQlFUkVNQ0hHCQk3OAkvKiBSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkICovCisjZGVmaW5lCUVMSUJBQ0MJCTc5CS8qIENhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5ICovCisjZGVmaW5lCUVMSUJCQUQJCTgwCS8qIEFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeSAqLworI2RlZmluZQlFTElCU0NOCQk4MQkvKiAubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkICovCisjZGVmaW5lCUVMSUJNQVgJCTgyCS8qIEF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBzaGFyZWQgbGlicmFyaWVzICovCisjZGVmaW5lCUVMSUJFWEVDCTgzCS8qIENhbm5vdCBleGVjIGEgc2hhcmVkIGxpYnJhcnkgZGlyZWN0bHkgKi8KKyNkZWZpbmUJRUlMU0VRCQk4NAkvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUJRVJFU1RBUlQJODUJLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCAqLworI2RlZmluZQlFU1RSUElQRQk4NgkvKiBTdHJlYW1zIHBpcGUgZXJyb3IgKi8KKyNkZWZpbmUJRVVTRVJTCQk4NwkvKiBUb28gbWFueSB1c2VycyAqLworI2RlZmluZQlFTk9UU09DSwk4OAkvKiBTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQgKi8KKyNkZWZpbmUJRURFU1RBRERSUkVRCTg5CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQgKi8KKyNkZWZpbmUJRU1TR1NJWkUJOTAJLyogTWVzc2FnZSB0b28gbG9uZyAqLworI2RlZmluZQlFUFJPVE9UWVBFCTkxCS8qIFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCAqLworI2RlZmluZQlFTk9QUk9UT09QVAk5MgkvKiBQcm90b2NvbCBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lCUVQUk9UT05PU1VQUE9SVAk5MwkvKiBQcm90b2NvbCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVTT0NLVE5PU1VQUE9SVAk5NAkvKiBTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVPUE5PVFNVUFAJOTUJLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50ICovCisjZGVmaW5lCUVQRk5PU1VQUE9SVAk5NgkvKiBQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUZOT1NVUFBPUlQJOTcJLyogQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCAqLworI2RlZmluZQlFQUREUklOVVNFCTk4CS8qIEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UgKi8KKyNkZWZpbmUJRUFERFJOT1RBVkFJTAk5OQkvKiBDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzICovCisjZGVmaW5lCUVORVRET1dOCTEwMAkvKiBOZXR3b3JrIGlzIGRvd24gKi8KKyNkZWZpbmUJRU5FVFVOUkVBQ0gJMTAxCS8qIE5ldHdvcmsgaXMgdW5yZWFjaGFibGUgKi8KKyNkZWZpbmUJRU5FVFJFU0VUCTEwMgkvKiBOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0ICovCisjZGVmaW5lCUVDT05OQUJPUlRFRAkxMDMJLyogU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQgKi8KKyNkZWZpbmUJRUNPTk5SRVNFVAkxMDQJLyogQ29ubmVjdGlvbiByZXNldCBieSBwZWVyICovCisjZGVmaW5lCUVOT0JVRlMJCTEwNQkvKiBObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlICovCisjZGVmaW5lCUVJU0NPTk4JCTEwNgkvKiBUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJRU5PVENPTk4JMTA3CS8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkICovCisjZGVmaW5lCUVTSFVURE9XTgkxMDgJLyogQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duICovCisjZGVmaW5lCUVUT09NQU5ZUkVGUwkxMDkJLyogVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSAqLworI2RlZmluZQlFVElNRURPVVQJMTEwCS8qIENvbm5lY3Rpb24gdGltZWQgb3V0ICovCisjZGVmaW5lCUVDT05OUkVGVVNFRAkxMTEJLyogQ29ubmVjdGlvbiByZWZ1c2VkICovCisjZGVmaW5lCUVIT1NURE9XTgkxMTIJLyogSG9zdCBpcyBkb3duICovCisjZGVmaW5lCUVIT1NUVU5SRUFDSAkxMTMJLyogTm8gcm91dGUgdG8gaG9zdCAqLworI2RlZmluZQlFQUxSRUFEWQkxMTQJLyogT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJRUlOUFJPR1JFU1MJMTE1CS8qIE9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJRVNUQUxFCQkxMTYJLyogU3RhbGUgTkZTIGZpbGUgaGFuZGxlICovCisjZGVmaW5lCUVVQ0xFQU4JCTExNwkvKiBTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmcgKi8KKyNkZWZpbmUJRU5PVE5BTQkJMTE4CS8qIE5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSAqLworI2RlZmluZQlFTkFWQUlMCQkxMTkJLyogTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRUlTTkFNCQkxMjAJLyogSXMgYSBuYW1lZCB0eXBlIGZpbGUgKi8KKyNkZWZpbmUJRVJFTU9URUlPCTEyMQkvKiBSZW1vdGUgSS9PIGVycm9yICovCisjZGVmaW5lCUVEUVVPVAkJMTIyCS8qIFF1b3RhIGV4Y2VlZGVkICovCisKKyNkZWZpbmUJRU5PTUVESVVNCTEyMwkvKiBObyBtZWRpdW0gZm91bmQgKi8KKyNkZWZpbmUJRU1FRElVTVRZUEUJMTI0CS8qIFdyb25nIG1lZGl1bSB0eXBlICovCisjZGVmaW5lCUVDQU5DRUxFRAkxMjUJLyogT3BlcmF0aW9uIENhbmNlbGVkICovCisjZGVmaW5lCUVOT0tFWQkJMTI2CS8qIFJlcXVpcmVkIGtleSBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lCUVLRVlFWFBJUkVECTEyNwkvKiBLZXkgaGFzIGV4cGlyZWQgKi8KKyNkZWZpbmUJRUtFWVJFVk9LRUQJMTI4CS8qIEtleSBoYXMgYmVlbiByZXZva2VkICovCisjZGVmaW5lCUVLRVlSRUpFQ1RFRAkxMjkJLyogS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlICovCisKKy8qIGZvciByb2J1c3QgbXV0ZXhlcyAqLworI2RlZmluZQlFT1dORVJERUFECTEzMAkvKiBPd25lciBkaWVkICovCisjZGVmaW5lCUVOT1RSRUNPVkVSQUJMRQkxMzEJLyogU3RhdGUgbm90IHJlY292ZXJhYmxlICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDc3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX0ZDTlRMX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX0ZDTlRMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKKyAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBPX0FDQ01PREUJMDAwMDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJMDAwMDAwMDAKKyNkZWZpbmUgT19XUk9OTFkJMDAwMDAwMDEKKyNkZWZpbmUgT19SRFdSCQkwMDAwMDAwMgorI2lmbmRlZiBPX0NSRUFUCisjZGVmaW5lIE9fQ1JFQVQJCTAwMDAwMTAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fRVhDTAorI2RlZmluZSBPX0VYQ0wJCTAwMDAwMjAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9DVFRZCisjZGVmaW5lIE9fTk9DVFRZCTAwMDAwNDAwCS8qIG5vdCBmY250bCAqLworI2VuZGlmCisjaWZuZGVmIE9fVFJVTkMKKyNkZWZpbmUgT19UUlVOQwkJMDAwMDEwMDAJLyogbm90IGZjbnRsICovCisjZW5kaWYKKyNpZm5kZWYgT19BUFBFTkQKKyNkZWZpbmUgT19BUFBFTkQJMDAwMDIwMDAKKyNlbmRpZgorI2lmbmRlZiBPX05PTkJMT0NLCisjZGVmaW5lIE9fTk9OQkxPQ0sJMDAwMDQwMDAKKyNlbmRpZgorI2lmbmRlZiBPX1NZTkMKKyNkZWZpbmUgT19TWU5DCQkwMDAxMDAwMAorI2VuZGlmCisjaWZuZGVmIEZBU1lOQworI2RlZmluZSBGQVNZTkMJCTAwMDIwMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNlbmRpZgorI2lmbmRlZiBPX0RJUkVDVAorI2RlZmluZSBPX0RJUkVDVAkwMDA0MDAwMAkvKiBkaXJlY3QgZGlzayBhY2Nlc3MgaGludCAqLworI2VuZGlmCisjaWZuZGVmIE9fTEFSR0VGSUxFCisjZGVmaW5lIE9fTEFSR0VGSUxFCTAwMTAwMDAwCisjZW5kaWYKKyNpZm5kZWYgT19ESVJFQ1RPUlkKKyNkZWZpbmUgT19ESVJFQ1RPUlkJMDAyMDAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworI2VuZGlmCisjaWZuZGVmIE9fTk9GT0xMT1cKKyNkZWZpbmUgT19OT0ZPTExPVwkwMDQwMDAwMAkvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KKyNlbmRpZgorI2lmbmRlZiBPX05PQVRJTUUKKyNkZWZpbmUgT19OT0FUSU1FCTAxMDAwMDAwCisjZW5kaWYKKyNpZm5kZWYgT19DTE9FWEVDCisjZGVmaW5lIE9fQ0xPRVhFQwkwMjAwMDAwMAkvKiBzZXQgY2xvc2Vfb25fZXhlYyAqLworI2VuZGlmCisjaWZuZGVmIE9fTkRFTEFZCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKyNlbmRpZgorCisjZGVmaW5lIEZfRFVQRkQJCTAJLyogZHVwICovCisjZGVmaW5lIEZfR0VURkQJCTEJLyogZ2V0IGNsb3NlX29uX2V4ZWMgKi8KKyNkZWZpbmUgRl9TRVRGRAkJMgkvKiBzZXQvY2xlYXIgY2xvc2Vfb25fZXhlYyAqLworI2RlZmluZSBGX0dFVEZMCQkzCS8qIGdldCBmaWxlLT5mX2ZsYWdzICovCisjZGVmaW5lIEZfU0VURkwJCTQJLyogc2V0IGZpbGUtPmZfZmxhZ3MgKi8KKyNpZm5kZWYgRl9HRVRMSworI2RlZmluZSBGX0dFVExLCQk1CisjZGVmaW5lIEZfU0VUTEsJCTYKKyNkZWZpbmUgRl9TRVRMS1cJNworI2VuZGlmCisjaWZuZGVmIEZfU0VUT1dOCisjZGVmaW5lIEZfU0VUT1dOCTgJLyogZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfR0VUT1dOCTkJLyogZm9yIHNvY2tldHMuICovCisjZW5kaWYKKyNpZm5kZWYgRl9TRVRTSUcKKyNkZWZpbmUgRl9TRVRTSUcJMTAJLyogZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfR0VUU0lHCTExCS8qIGZvciBzb2NrZXRzLiAqLworI2VuZGlmCisKKy8qIGZvciBGX1tHRVR8U0VUXUZMICovCisjZGVmaW5lIEZEX0NMT0VYRUMJMQkvKiBhY3R1YWxseSBhbnl0aGluZyB3aXRoIGxvdyBiaXQgc2V0IGdvZXMgKi8KKworLyogZm9yIHBvc2l4IGZjbnRsKCkgYW5kIGxvY2tmKCkgKi8KKyNpZm5kZWYgRl9SRExDSworI2RlZmluZSBGX1JETENLCQkwCisjZGVmaW5lIEZfV1JMQ0sJCTEKKyNkZWZpbmUgRl9VTkxDSwkJMgorI2VuZGlmCisKKy8qIGZvciBvbGQgaW1wbGVtZW50YXRpb24gb2YgYnNkIGZsb2NrICgpICovCisjaWZuZGVmIEZfRVhMQ0sKKyNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCisjZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLworI2VuZGlmCisKKy8qIGZvciBsZWFzZXMgKi8KKyNpZm5kZWYgRl9JTlBST0dSRVNTCisjZGVmaW5lIEZfSU5QUk9HUkVTUwkxNgorI2VuZGlmCisKKy8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCisjZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50CisJCQkJICAgYmxvY2tpbmcgKi8KKyNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLworCisjZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrIC4uLiAqLworI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zICovCisjZGVmaW5lIExPQ0tfV1JJVEUJMTI4CS8qIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTE9DS19SVwkJMTkyCS8qIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KKworI2RlZmluZSBGX0xJTlVYX1NQRUNJRklDX0JBU0UJMTAyNAorCisjaWZuZGVmIEhBVkVfQVJDSF9TVFJVQ1RfRkxPQ0sKKyNpZm5kZWYgX19BUkNIX0ZMT0NLX1BBRAorI2RlZmluZSBfX0FSQ0hfRkxPQ0tfUEFECisjZW5kaWYKKworc3RydWN0IGZsb2NrIHsKKwlzaG9ydAlsX3R5cGU7CisJc2hvcnQJbF93aGVuY2U7CisJb2ZmX3QJbF9zdGFydDsKKwlvZmZfdAlsX2xlbjsKKwlwaWRfdAlsX3BpZDsKKwlfX0FSQ0hfRkxPQ0tfUEFECit9OworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHXzY0QklUCisKKyNpZm5kZWYgRl9HRVRMSzY0CisjZGVmaW5lIEZfR0VUTEs2NAkxMgkvKiAgdXNpbmcgJ3N0cnVjdCBmbG9jazY0JyAqLworI2RlZmluZSBGX1NFVExLNjQJMTMKKyNkZWZpbmUgRl9TRVRMS1c2NAkxNAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9BUkNIX1NUUlVDVF9GTE9DSzY0CisjaWZuZGVmIF9fQVJDSF9GTE9DSzY0X1BBRAorI2RlZmluZSBfX0FSQ0hfRkxPQ0s2NF9QQUQKKyNlbmRpZgorCitzdHJ1Y3QgZmxvY2s2NCB7CisJc2hvcnQgIGxfdHlwZTsKKwlzaG9ydCAgbF93aGVuY2U7CisJbG9mZl90IGxfc3RhcnQ7CisJbG9mZl90IGxfbGVuOworCXBpZF90ICBsX3BpZDsKKwlfX0FSQ0hfRkxPQ0s2NF9QQUQKK307CisjZW5kaWYKKyNlbmRpZiAvKiAhQ09ORklHXzY0QklUICovCisKKyNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfRkNOVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDI3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL2lvY3RsLmgKQEAgLTAsMCArMSw4MCBAQAorI2lmbmRlZiBfQVNNX0dFTkVSSUNfSU9DVExfSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfSU9DVExfSAorCisvKiBpb2N0bCBjb21tYW5kIGVuY29kaW5nOiAzMiBiaXRzIHRvdGFsLCBjb21tYW5kIGluIGxvd2VyIDE2IGJpdHMsCisgKiBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBsb3dlciAxNCBiaXRzIG9mIHRoZQorICogdXBwZXIgMTYgYml0cy4KKyAqIEVuY29kaW5nIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGluIHRoZSBpb2N0bCByZXF1ZXN0CisgKiBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIHByb2dyYW1zIGNvbXBpbGVkIHdpdGggb2xkIHZlcnNpb25zCisgKiBhbmQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgdXNlciBzcGFjZSBvdXRzaWRlIHRoZSB1c2VyIGJ1ZmZlciBhcmVhLgorICogVGhlIGhpZ2hlc3QgMiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgaW5kaWNhdGluZyB0aGUgYGBhY2Nlc3MgbW9kZScnLgorICogTk9URTogVGhpcyBsaW1pdHMgdGhlIG1heCBwYXJhbWV0ZXIgc2l6ZSB0byAxNmtCIC0xICEKKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBmb3IgY29tcGF0aWJpbGl0eSBhY3Jvc3MgdGhlIHZhcmlvdXMgTGludXgKKyAqIHBsYXRmb3Jtcy4gIFRoZSBnZW5lcmljIGlvY3RsIG51bWJlcmluZyBzY2hlbWUgZG9lc24ndCByZWFsbHkgZW5mb3JjZQorICogYSB0eXBlIGZpZWxkLiAgRGUgZmFjdG8sIGhvd2V2ZXIsIHRoZSB0b3AgOCBiaXRzIG9mIHRoZSBsb3dlciAxNgorICogYml0cyBhcmUgaW5kZWVkIHVzZWQgYXMgYSB0eXBlIGZpZWxkLCBzbyB3ZSBtaWdodCBqdXN0IGFzIHdlbGwgbWFrZQorICogdGhpcyBleHBsaWNpdCBoZXJlLiAgUGxlYXNlIGJlIHN1cmUgdG8gdXNlIHRoZSBkZWNvZGluZyBtYWNyb3MKKyAqIGJlbG93IGZyb20gbm93IG9uLgorICovCisjZGVmaW5lIF9JT0NfTlJCSVRTCTgKKyNkZWZpbmUgX0lPQ19UWVBFQklUUwk4CisjZGVmaW5lIF9JT0NfU0laRUJJVFMJMTQKKyNkZWZpbmUgX0lPQ19ESVJCSVRTCTIKKworI2RlZmluZSBfSU9DX05STUFTSwkoKDEgPDwgX0lPQ19OUkJJVFMpLTEpCisjZGVmaW5lIF9JT0NfVFlQRU1BU0sJKCgxIDw8IF9JT0NfVFlQRUJJVFMpLTEpCisjZGVmaW5lIF9JT0NfU0laRU1BU0sJKCgxIDw8IF9JT0NfU0laRUJJVFMpLTEpCisjZGVmaW5lIF9JT0NfRElSTUFTSwkoKDEgPDwgX0lPQ19ESVJCSVRTKS0xKQorCisjZGVmaW5lIF9JT0NfTlJTSElGVAkwCisjZGVmaW5lIF9JT0NfVFlQRVNISUZUCShfSU9DX05SU0hJRlQrX0lPQ19OUkJJVFMpCisjZGVmaW5lIF9JT0NfU0laRVNISUZUCShfSU9DX1RZUEVTSElGVCtfSU9DX1RZUEVCSVRTKQorI2RlZmluZSBfSU9DX0RJUlNISUZUCShfSU9DX1NJWkVTSElGVCtfSU9DX1NJWkVCSVRTKQorCisvKgorICogRGlyZWN0aW9uIGJpdHMuCisgKi8KKyNkZWZpbmUgX0lPQ19OT05FCTBVCisjZGVmaW5lIF9JT0NfV1JJVEUJMVUKKyNkZWZpbmUgX0lPQ19SRUFECTJVCisKKyNkZWZpbmUgX0lPQyhkaXIsdHlwZSxucixzaXplKSBcCisJKCgoZGlyKSAgPDwgX0lPQ19ESVJTSElGVCkgfCBcCisJICgodHlwZSkgPDwgX0lPQ19UWVBFU0hJRlQpIHwgXAorCSAoKG5yKSAgIDw8IF9JT0NfTlJTSElGVCkgfCBcCisJICgoc2l6ZSkgPDwgX0lPQ19TSVpFU0hJRlQpKQorCisvKiBwcm92b2tlIGNvbXBpbGUgZXJyb3IgZm9yIGludmFsaWQgdXNlcyBvZiBzaXplIGFyZ3VtZW50ICovCitleHRlcm4gdW5zaWduZWQgaW50IF9faW52YWxpZF9zaXplX2FyZ3VtZW50X2Zvcl9JT0M7CisjZGVmaW5lIF9JT0NfVFlQRUNIRUNLKHQpIFwKKwkoKHNpemVvZih0KSA9PSBzaXplb2YodFsxXSkgJiYgXAorCSAgc2l6ZW9mKHQpIDwgKDEgPDwgX0lPQ19TSVpFQklUUykpID8gXAorCSAgc2l6ZW9mKHQpIDogX19pbnZhbGlkX3NpemVfYXJndW1lbnRfZm9yX0lPQykKKworLyogdXNlZCB0byBjcmVhdGUgbnVtYmVycyAqLworI2RlZmluZSBfSU8odHlwZSxucikJCV9JT0MoX0lPQ19OT05FLCh0eXBlKSwobnIpLDApCisjZGVmaW5lIF9JT1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRCwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQorI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLChfSU9DX1RZUEVDSEVDSyhzaXplKSkpCisjZGVmaW5lIF9JT1dSKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUR8X0lPQ19XUklURSwodHlwZSksKG5yKSwoX0lPQ19UWVBFQ0hFQ0soc2l6ZSkpKQorI2RlZmluZSBfSU9SX0JBRCh0eXBlLG5yLHNpemUpCV9JT0MoX0lPQ19SRUFELCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKyNkZWZpbmUgX0lPV19CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfV1JJVEUsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQorI2RlZmluZSBfSU9XUl9CQUQodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKworLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCisjZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQorI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKKyNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCisjZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQorCisvKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCisKKyNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCisjZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCisjZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQorCisjZW5kaWYgLyogX0FTTV9HRU5FUklDX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzZGRlMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi5oCkBAIC0wLDAgKzEsNDEgQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX01NQU5fSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfTU1BTl9ICisKKy8qCisgQXV0aG9yOiBNaWNoYWVsIFMuIFRzaXJraW4gPG1zdEBtZWxsYW5veC5jby5pbD4sIE1lbGxhbm94IFRlY2hub2xvZ2llcyBMdGQuCisgQmFzZWQgb246IGFzbS14eHgvbW1hbi5oCisqLworCisjZGVmaW5lIFBST1RfUkVBRAkweDEJCS8qIHBhZ2UgY2FuIGJlIHJlYWQgKi8KKyNkZWZpbmUgUFJPVF9XUklURQkweDIJCS8qIHBhZ2UgY2FuIGJlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgUFJPVF9FWEVDCTB4NAkJLyogcGFnZSBjYW4gYmUgZXhlY3V0ZWQgKi8KKyNkZWZpbmUgUFJPVF9TRU0JMHg4CQkvKiBwYWdlIG1heSBiZSB1c2VkIGZvciBhdG9taWMgb3BzICovCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIHBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZCAqLworI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YgZ3Jvd3Nkb3duIHZtYSAqLworI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAkvKiBtcHJvdGVjdCBmbGFnOiBleHRlbmQgY2hhbmdlIHRvIGVuZCBvZiBncm93c3VwIHZtYSAqLworCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQkJLyogU2hhcmUgY2hhbmdlcyAqLworI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlICovCisjZGVmaW5lIE1BUF9UWVBFCTB4MGYJCS8qIE1hc2sgZm9yIHR5cGUgb2YgbWFwcGluZyAqLworI2RlZmluZSBNQVBfRklYRUQJMHgxMAkJLyogSW50ZXJwcmV0IGFkZHIgZXhhY3RseSAqLworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MjAJCS8qIGRvbid0IHVzZSBhIGZpbGUgKi8KKworI2RlZmluZSBNU19BU1lOQwkxCQkvKiBzeW5jIG1lbW9yeSBhc3luY2hyb25vdXNseSAqLworI2RlZmluZSBNU19JTlZBTElEQVRFCTIJCS8qIGludmFsaWRhdGUgdGhlIGNhY2hlcyAqLworI2RlZmluZSBNU19TWU5DCQk0CQkvKiBzeW5jaHJvbm91cyBtZW1vcnkgc3luYyAqLworCisjZGVmaW5lIE1BRFZfTk9STUFMCTAJCS8qIG5vIGZ1cnRoZXIgc3BlY2lhbCB0cmVhdG1lbnQgKi8KKyNkZWZpbmUgTUFEVl9SQU5ET00JMQkJLyogZXhwZWN0IHJhbmRvbSBwYWdlIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgTUFEVl9TRVFVRU5USUFMCTIJCS8qIGV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcyAqLworI2RlZmluZSBNQURWX1dJTExORUVECTMJCS8qIHdpbGwgbmVlZCB0aGVzZSBwYWdlcyAqLworI2RlZmluZSBNQURWX0RPTlRORUVECTQJCS8qIGRvbid0IG5lZWQgdGhlc2UgcGFnZXMgKi8KKworLyogY29tbW9uIHBhcmFtZXRlcnM6IHRyeSB0byBrZWVwIHRoZXNlIGNvbnNpc3RlbnQgYWNyb3NzIGFyY2hpdGVjdHVyZXMgKi8KKyNkZWZpbmUgTUFEVl9SRU1PVkUJOQkJLyogcmVtb3ZlIHRoZXNlIHBhZ2VzICYgcmVzb3VyY2VzICovCisjZGVmaW5lIE1BRFZfRE9OVEZPUksJMTAJCS8qIGRvbid0IGluaGVyaXQgYWNyb3NzIGZvcmsgKi8KKyNkZWZpbmUgTUFEVl9ET0ZPUksJMTEJCS8qIGRvIGluaGVyaXQgYWNyb3NzIGZvcmsgKi8KKworLyogY29tcGF0aWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBNQVBfRklMRQkwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGJjZTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9wb2xsLmgKQEAgLTAsMCArMSwzNyBAQAorI2lmbmRlZiBfX0FTTV9HRU5FUklDX1BPTExfSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX1BPTExfSAorCisvKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCisjZGVmaW5lIFBPTExJTgkJMHgwMDAxCisjZGVmaW5lIFBPTExQUkkJCTB4MDAwMgorI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKKyNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4CisjZGVmaW5lIFBPTExIVVAJCTB4MDAxMAorI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKKworLyogVGhlIHJlc3Qgc2VlbSB0byBiZSBtb3JlLW9yLWxlc3Mgbm9uc3RhbmRhcmQuIENoZWNrIHRoZW0hICovCisjZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCisjZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCisjaWZuZGVmIFBPTExXUk5PUk0KKyNkZWZpbmUgUE9MTFdSTk9STQkweDAxMDAKKyNlbmRpZgorI2lmbmRlZiBQT0xMV1JCQU5ECisjZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCisjZW5kaWYKKyNpZm5kZWYgUE9MTE1TRworI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKKyNlbmRpZgorI2lmbmRlZiBQT0xMUkVNT1ZFCisjZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCisjZW5kaWYKKyNpZm5kZWYgUE9MTFJESFVQCisjZGVmaW5lIFBPTExSREhVUCAgICAgICAweDIwMDAKKyNlbmRpZgorCitzdHJ1Y3QgcG9sbGZkIHsKKwlpbnQgZmQ7CisJc2hvcnQgZXZlbnRzOworCXNob3J0IHJldmVudHM7Cit9OworCisjZW5kaWYJLyogX19BU01fR0VORVJJQ19QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcmVzb3VyY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY5NWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1JFU09VUkNFX0gKKyNkZWZpbmUgX0FTTV9HRU5FUklDX1JFU09VUkNFX0gKKworLyoKKyAqIFJlc291cmNlIGxpbWl0IElEcworICoKKyAqICggQ29tcGF0aWJpbGl0eSBkZXRhaWw6IHRoZXJlIGFyZSBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZQorICogICBhIGRpZmZlcmVudCBybGltaXQgSUQgb3JkZXIgaW4gdGhlIDUtOSByYW5nZSBhbmQgd2FudAorICogICB0byBrZWVwIHRoYXQgb3JkZXIgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5LiBUaGUgcmVhc29ucworICogICBhcmUgaGlzdG9yaWMgYW5kIGFsbCBuZXcgcmxpbWl0cyBhcmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKKyAqICAgYXJjaGVzLiBJZiBhbiBhcmNoIGhhcyBzdWNoIHNwZWNpYWwgb3JkZXIgZm9yIHNvbWUgcmxpbWl0cworICogICB0aGVuIGl0IGRlZmluZXMgdGhlbSBwcmlvciBpbmNsdWRpbmcgYXNtLWdlbmVyaWMvcmVzb3VyY2UuaC4gKQorICovCisKKyNkZWZpbmUgUkxJTUlUX0NQVQkJMAkvKiBDUFUgdGltZSBpbiBzZWMgKi8KKyNkZWZpbmUgUkxJTUlUX0ZTSVpFCQkxCS8qIE1heGltdW0gZmlsZXNpemUgKi8KKyNkZWZpbmUgUkxJTUlUX0RBVEEJCTIJLyogbWF4IGRhdGEgc2l6ZSAqLworI2RlZmluZSBSTElNSVRfU1RBQ0sJCTMJLyogbWF4IHN0YWNrIHNpemUgKi8KKyNkZWZpbmUgUkxJTUlUX0NPUkUJCTQJLyogbWF4IGNvcmUgZmlsZSBzaXplICovCisKKyNpZm5kZWYgUkxJTUlUX1JTUworIyBkZWZpbmUgUkxJTUlUX1JTUwkJNQkvKiBtYXggcmVzaWRlbnQgc2V0IHNpemUgKi8KKyNlbmRpZgorCisjaWZuZGVmIFJMSU1JVF9OUFJPQworIyBkZWZpbmUgUkxJTUlUX05QUk9DCQk2CS8qIG1heCBudW1iZXIgb2YgcHJvY2Vzc2VzICovCisjZW5kaWYKKworI2lmbmRlZiBSTElNSVRfTk9GSUxFCisjIGRlZmluZSBSTElNSVRfTk9GSUxFCQk3CS8qIG1heCBudW1iZXIgb2Ygb3BlbiBmaWxlcyAqLworI2VuZGlmCisKKyNpZm5kZWYgUkxJTUlUX01FTUxPQ0sKKyMgZGVmaW5lIFJMSU1JVF9NRU1MT0NLCQk4CS8qIG1heCBsb2NrZWQtaW4tbWVtb3J5IGFkZHJlc3Mgc3BhY2UgKi8KKyNlbmRpZgorCisjaWZuZGVmIFJMSU1JVF9BUworIyBkZWZpbmUgUkxJTUlUX0FTCQk5CS8qIGFkZHJlc3Mgc3BhY2UgbGltaXQgKi8KKyNlbmRpZgorCisjZGVmaW5lIFJMSU1JVF9MT0NLUwkJMTAJLyogbWF4aW11bSBmaWxlIGxvY2tzIGhlbGQgKi8KKyNkZWZpbmUgUkxJTUlUX1NJR1BFTkRJTkcJMTEJLyogbWF4IG51bWJlciBvZiBwZW5kaW5nIHNpZ25hbHMgKi8KKyNkZWZpbmUgUkxJTUlUX01TR1FVRVVFCQkxMgkvKiBtYXhpbXVtIGJ5dGVzIGluIFBPU0lYIG1xdWV1ZXMgKi8KKyNkZWZpbmUgUkxJTUlUX05JQ0UJCTEzCS8qIG1heCBuaWNlIHByaW8gYWxsb3dlZCB0byByYWlzZSB0bworCQkJCQkgICAwLTM5IGZvciBuaWNlIGxldmVsIDE5IC4uIC0yMCAqLworI2RlZmluZSBSTElNSVRfUlRQUklPCQkxNAkvKiBtYXhpbXVtIHJlYWx0aW1lIHByaW9yaXR5ICovCisKKyNkZWZpbmUgUkxJTV9OTElNSVRTCQkxNQorCisvKgorICogU3VTIHNheXMgbGltaXRzIGhhdmUgdG8gYmUgdW5zaWduZWQuCisgKiBXaGljaCBtYWtlcyBhIHRvbiBtb3JlIHNlbnNlIGFueXdheS4KKyAqCisgKiBTb21lIGFyY2hpdGVjdHVyZXMgb3ZlcnJpZGUgdGhpcyAoZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyk6CisgKi8KKyNpZm5kZWYgUkxJTV9JTkZJTklUWQorIyBkZWZpbmUgUkxJTV9JTkZJTklUWQkJKH4wVUwpCisjZW5kaWYKKworLyoKKyAqIFJMSU1JVF9TVEFDSyBkZWZhdWx0IG1heGltdW0gLSBzb21lIGFyY2hpdGVjdHVyZXMgb3ZlcnJpZGUgaXQ6CisgKi8KKyNpZm5kZWYgX1NUS19MSU1fTUFYCisjIGRlZmluZSBfU1RLX0xJTV9NQVgJCVJMSU1fSU5GSU5JVFkKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I1MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmgKQEAgLTAsMCArMSwyNTggQEAKKyNpZm5kZWYgX0FTTV9HRU5FUklDX1NJR0lORk9fSAorI2RlZmluZSBfQVNNX0dFTkVSSUNfU0lHSU5GT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIHVuaW9uIHNpZ3ZhbCB7CisJaW50IHNpdmFsX2ludDsKKwl2b2lkICpzaXZhbF9wdHI7Cit9IHNpZ3ZhbF90OworCisvKgorICogVGhpcyBpcyB0aGUgc2l6ZSAoaW5jbHVkaW5nIHBhZGRpbmcpIG9mIHRoZSBwYXJ0IG9mIHRoZQorICogc3RydWN0IHNpZ2luZm8gdGhhdCBpcyBiZWZvcmUgdGhlIHVuaW9uLgorICovCisjaWZuZGVmIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCisjZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSgzICogc2l6ZW9mKGludCkpCisjZW5kaWYKKworI2RlZmluZSBTSV9NQVhfU0laRQkxMjgKKyNpZm5kZWYgU0lfUEFEX1NJWkUKKyNkZWZpbmUgU0lfUEFEX1NJWkUJKChTSV9NQVhfU0laRSAtIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFKSAvIHNpemVvZihpbnQpKQorI2VuZGlmCisKKyNpZm5kZWYgX19BUkNIX1NJX1VJRF9UCisjZGVmaW5lIF9fQVJDSF9TSV9VSURfVAl1aWRfdAorI2VuZGlmCisKKy8qCisgKiBUaGUgZGVmYXVsdCAic2lfYmFuZCIgdHlwZSBpcyAibG9uZyIsIGFzIHNwZWNpZmllZCBieSBQT1NJWC4KKyAqIEhvd2V2ZXIsIHNvbWUgYXJjaGl0ZWN0dXJlcyB3YW50IHRvIG92ZXJyaWRlIHRoaXMgdG8gImludCIKKyAqIGZvciBoaXN0b3JpY2FsIGNvbXBhdGliaWxpdHkgcmVhc29ucywgc28gd2UgYWxsb3cgdGhhdC4KKyAqLworI2lmbmRlZiBfX0FSQ0hfU0lfQkFORF9UCisjZGVmaW5lIF9fQVJDSF9TSV9CQU5EX1QgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9BUkNIX1NJR0lORk9fVAorCit0eXBlZGVmIHN0cnVjdCBzaWdpbmZvIHsKKwlpbnQgc2lfc2lnbm87CisJaW50IHNpX2Vycm5vOworCWludCBzaV9jb2RlOworCisJdW5pb24geworCQlpbnQgX3BhZFtTSV9QQURfU0laRV07CisKKwkJLyoga2lsbCgpICovCisJCXN0cnVjdCB7CisJCQlwaWRfdCBfcGlkOwkJLyogc2VuZGVyJ3MgcGlkICovCisJCQlfX0FSQ0hfU0lfVUlEX1QgX3VpZDsJLyogc2VuZGVyJ3MgdWlkICovCisJCX0gX2tpbGw7CisKKwkJLyogUE9TSVguMWIgdGltZXJzICovCisJCXN0cnVjdCB7CisJCQl0aW1lcl90IF90aWQ7CQkvKiB0aW1lciBpZCAqLworCQkJaW50IF9vdmVycnVuOwkJLyogb3ZlcnJ1biBjb3VudCAqLworCQkJY2hhciBfcGFkW3NpemVvZiggX19BUkNIX1NJX1VJRF9UKSAtIHNpemVvZihpbnQpXTsKKwkJCXNpZ3ZhbF90IF9zaWd2YWw7CS8qIHNhbWUgYXMgYmVsb3cgKi8KKwkJCWludCBfc3lzX3ByaXZhdGU7ICAgICAgIC8qIG5vdCB0byBiZSBwYXNzZWQgdG8gdXNlciAqLworCQl9IF90aW1lcjsKKworCQkvKiBQT1NJWC4xYiBzaWduYWxzICovCisJCXN0cnVjdCB7CisJCQlwaWRfdCBfcGlkOwkJLyogc2VuZGVyJ3MgcGlkICovCisJCQlfX0FSQ0hfU0lfVUlEX1QgX3VpZDsJLyogc2VuZGVyJ3MgdWlkICovCisJCQlzaWd2YWxfdCBfc2lndmFsOworCQl9IF9ydDsKKworCQkvKiBTSUdDSExEICovCisJCXN0cnVjdCB7CisJCQlwaWRfdCBfcGlkOwkJLyogd2hpY2ggY2hpbGQgKi8KKwkJCV9fQVJDSF9TSV9VSURfVCBfdWlkOwkvKiBzZW5kZXIncyB1aWQgKi8KKwkJCWludCBfc3RhdHVzOwkJLyogZXhpdCBjb2RlICovCisJCQljbG9ja190IF91dGltZTsKKwkJCWNsb2NrX3QgX3N0aW1lOworCQl9IF9zaWdjaGxkOworCisJCS8qIFNJR0lMTCwgU0lHRlBFLCBTSUdTRUdWLCBTSUdCVVMgKi8KKwkJc3RydWN0IHsKKwkJCXZvaWQgKl9hZGRyOyAvKiBmYXVsdGluZyBpbnNuL21lbW9yeSByZWYuICovCisjaWZkZWYgX19BUkNIX1NJX1RSQVBOTworCQkJaW50IF90cmFwbm87CS8qIFRSQVAgIyB3aGljaCBjYXVzZWQgdGhlIHNpZ25hbCAqLworI2VuZGlmCisJCX0gX3NpZ2ZhdWx0OworCisJCS8qIFNJR1BPTEwgKi8KKwkJc3RydWN0IHsKKwkJCV9fQVJDSF9TSV9CQU5EX1QgX2JhbmQ7CS8qIFBPTExfSU4sIFBPTExfT1VULCBQT0xMX01TRyAqLworCQkJaW50IF9mZDsKKwkJfSBfc2lncG9sbDsKKwl9IF9zaWZpZWxkczsKK30gc2lnaW5mb190OworCisjZW5kaWYKKworLyoKKyAqIEhvdyB0aGVzZSBmaWVsZHMgYXJlIHRvIGJlIGFjY2Vzc2VkLgorICovCisjZGVmaW5lIHNpX3BpZAkJX3NpZmllbGRzLl9raWxsLl9waWQKKyNkZWZpbmUgc2lfdWlkCQlfc2lmaWVsZHMuX2tpbGwuX3VpZAorI2RlZmluZSBzaV90aWQJCV9zaWZpZWxkcy5fdGltZXIuX3RpZAorI2RlZmluZSBzaV9vdmVycnVuCV9zaWZpZWxkcy5fdGltZXIuX292ZXJydW4KKyNkZWZpbmUgc2lfc3lzX3ByaXZhdGUgIF9zaWZpZWxkcy5fdGltZXIuX3N5c19wcml2YXRlCisjZGVmaW5lIHNpX3N0YXR1cwlfc2lmaWVsZHMuX3NpZ2NobGQuX3N0YXR1cworI2RlZmluZSBzaV91dGltZQlfc2lmaWVsZHMuX3NpZ2NobGQuX3V0aW1lCisjZGVmaW5lIHNpX3N0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5fc3RpbWUKKyNkZWZpbmUgc2lfdmFsdWUJX3NpZmllbGRzLl9ydC5fc2lndmFsCisjZGVmaW5lIHNpX2ludAkJX3NpZmllbGRzLl9ydC5fc2lndmFsLnNpdmFsX2ludAorI2RlZmluZSBzaV9wdHIJCV9zaWZpZWxkcy5fcnQuX3NpZ3ZhbC5zaXZhbF9wdHIKKyNkZWZpbmUgc2lfYWRkcgkJX3NpZmllbGRzLl9zaWdmYXVsdC5fYWRkcgorI2lmZGVmIF9fQVJDSF9TSV9UUkFQTk8KKyNkZWZpbmUgc2lfdHJhcG5vCV9zaWZpZWxkcy5fc2lnZmF1bHQuX3RyYXBubworI2VuZGlmCisjZGVmaW5lIHNpX2JhbmQJCV9zaWZpZWxkcy5fc2lncG9sbC5fYmFuZAorI2RlZmluZSBzaV9mZAkJX3NpZmllbGRzLl9zaWdwb2xsLl9mZAorCisjZGVmaW5lIF9fU0lfS0lMTAkwCisjZGVmaW5lIF9fU0lfVElNRVIJMAorI2RlZmluZSBfX1NJX1BPTEwJMAorI2RlZmluZSBfX1NJX0ZBVUxUCTAKKyNkZWZpbmUgX19TSV9DSExECTAKKyNkZWZpbmUgX19TSV9SVAkJMAorI2RlZmluZSBfX1NJX01FU0dRCTAKKyNkZWZpbmUgX19TSV9DT0RFKFQsTikJKE4pCisKKy8qCisgKiBzaV9jb2RlIHZhbHVlcworICogRGlnaXRhbCByZXNlcnZlcyBwb3NpdGl2ZSB2YWx1ZXMgZm9yIGtlcm5lbC1nZW5lcmF0ZWQgc2lnbmFscy4KKyAqLworI2RlZmluZSBTSV9VU0VSCQkwCQkvKiBzZW50IGJ5IGtpbGwsIHNpZ3NlbmQsIHJhaXNlICovCisjZGVmaW5lIFNJX0tFUk5FTAkweDgwCQkvKiBzZW50IGJ5IHRoZSBrZXJuZWwgZnJvbSBzb21ld2hlcmUgKi8KKyNkZWZpbmUgU0lfUVVFVUUJLTEJCS8qIHNlbnQgYnkgc2lncXVldWUgKi8KKyNkZWZpbmUgU0lfVElNRVIgX19TSV9DT0RFKF9fU0lfVElNRVIsLTIpIC8qIHNlbnQgYnkgdGltZXIgZXhwaXJhdGlvbiAqLworI2RlZmluZSBTSV9NRVNHUSBfX1NJX0NPREUoX19TSV9NRVNHUSwtMykgLyogc2VudCBieSByZWFsIHRpbWUgbWVzcSBzdGF0ZSBjaGFuZ2UgKi8KKyNkZWZpbmUgU0lfQVNZTkNJTwktNAkJLyogc2VudCBieSBBSU8gY29tcGxldGlvbiAqLworI2RlZmluZSBTSV9TSUdJTwktNQkJLyogc2VudCBieSBxdWV1ZWQgU0lHSU8gKi8KKyNkZWZpbmUgU0lfVEtJTEwJLTYJCS8qIHNlbnQgYnkgdGtpbGwgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUgU0lfREVUSFJFQUQJLTcJCS8qIHNlbnQgYnkgZXhlY3ZlKCkga2lsbGluZyBzdWJzaWRpYXJ5IHRocmVhZHMgKi8KKworI2RlZmluZSBTSV9GUk9NVVNFUihzaXB0cikJKChzaXB0ciktPnNpX2NvZGUgPD0gMCkKKyNkZWZpbmUgU0lfRlJPTUtFUk5FTChzaXB0cikJKChzaXB0ciktPnNpX2NvZGUgPiAwKQorCisvKgorICogU0lHSUxMIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgSUxMX0lMTE9QQwkoX19TSV9GQVVMVHwxKQkvKiBpbGxlZ2FsIG9wY29kZSAqLworI2RlZmluZSBJTExfSUxMT1BOCShfX1NJX0ZBVUxUfDIpCS8qIGlsbGVnYWwgb3BlcmFuZCAqLworI2RlZmluZSBJTExfSUxMQURSCShfX1NJX0ZBVUxUfDMpCS8qIGlsbGVnYWwgYWRkcmVzc2luZyBtb2RlICovCisjZGVmaW5lIElMTF9JTExUUlAJKF9fU0lfRkFVTFR8NCkJLyogaWxsZWdhbCB0cmFwICovCisjZGVmaW5lIElMTF9QUlZPUEMJKF9fU0lfRkFVTFR8NSkJLyogcHJpdmlsZWdlZCBvcGNvZGUgKi8KKyNkZWZpbmUgSUxMX1BSVlJFRwkoX19TSV9GQVVMVHw2KQkvKiBwcml2aWxlZ2VkIHJlZ2lzdGVyICovCisjZGVmaW5lIElMTF9DT1BST0MJKF9fU0lfRkFVTFR8NykJLyogY29wcm9jZXNzb3IgZXJyb3IgKi8KKyNkZWZpbmUgSUxMX0JBRFNUSwkoX19TSV9GQVVMVHw4KQkvKiBpbnRlcm5hbCBzdGFjayBlcnJvciAqLworI2RlZmluZSBOU0lHSUxMCQk4CisKKy8qCisgKiBTSUdGUEUgc2lfY29kZXMKKyAqLworI2RlZmluZSBGUEVfSU5URElWCShfX1NJX0ZBVUxUfDEpCS8qIGludGVnZXIgZGl2aWRlIGJ5IHplcm8gKi8KKyNkZWZpbmUgRlBFX0lOVE9WRgkoX19TSV9GQVVMVHwyKQkvKiBpbnRlZ2VyIG92ZXJmbG93ICovCisjZGVmaW5lIEZQRV9GTFRESVYJKF9fU0lfRkFVTFR8MykJLyogZmxvYXRpbmcgcG9pbnQgZGl2aWRlIGJ5IHplcm8gKi8KKyNkZWZpbmUgRlBFX0ZMVE9WRgkoX19TSV9GQVVMVHw0KQkvKiBmbG9hdGluZyBwb2ludCBvdmVyZmxvdyAqLworI2RlZmluZSBGUEVfRkxUVU5ECShfX1NJX0ZBVUxUfDUpCS8qIGZsb2F0aW5nIHBvaW50IHVuZGVyZmxvdyAqLworI2RlZmluZSBGUEVfRkxUUkVTCShfX1NJX0ZBVUxUfDYpCS8qIGZsb2F0aW5nIHBvaW50IGluZXhhY3QgcmVzdWx0ICovCisjZGVmaW5lIEZQRV9GTFRJTlYJKF9fU0lfRkFVTFR8NykJLyogZmxvYXRpbmcgcG9pbnQgaW52YWxpZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRlBFX0ZMVFNVQgkoX19TSV9GQVVMVHw4KQkvKiBzdWJzY3JpcHQgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lIE5TSUdGUEUJCTgKKworLyoKKyAqIFNJR1NFR1Ygc2lfY29kZXMKKyAqLworI2RlZmluZSBTRUdWX01BUEVSUgkoX19TSV9GQVVMVHwxKQkvKiBhZGRyZXNzIG5vdCBtYXBwZWQgdG8gb2JqZWN0ICovCisjZGVmaW5lIFNFR1ZfQUNDRVJSCShfX1NJX0ZBVUxUfDIpCS8qIGludmFsaWQgcGVybWlzc2lvbnMgZm9yIG1hcHBlZCBvYmplY3QgKi8KKyNkZWZpbmUgTlNJR1NFR1YJMgorCisvKgorICogU0lHQlVTIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgQlVTX0FEUkFMTgkoX19TSV9GQVVMVHwxKQkvKiBpbnZhbGlkIGFkZHJlc3MgYWxpZ25tZW50ICovCisjZGVmaW5lIEJVU19BRFJFUlIJKF9fU0lfRkFVTFR8MikJLyogbm9uLWV4aXN0YW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgQlVTX09CSkVSUgkoX19TSV9GQVVMVHwzKQkvKiBvYmplY3Qgc3BlY2lmaWMgaGFyZHdhcmUgZXJyb3IgKi8KKyNkZWZpbmUgTlNJR0JVUwkJMworCisvKgorICogU0lHVFJBUCBzaV9jb2RlcworICovCisjZGVmaW5lIFRSQVBfQlJLUFQJKF9fU0lfRkFVTFR8MSkJLyogcHJvY2VzcyBicmVha3BvaW50ICovCisjZGVmaW5lIFRSQVBfVFJBQ0UJKF9fU0lfRkFVTFR8MikJLyogcHJvY2VzcyB0cmFjZSB0cmFwICovCisjZGVmaW5lIE5TSUdUUkFQCTIKKworLyoKKyAqIFNJR0NITEQgc2lfY29kZXMKKyAqLworI2RlZmluZSBDTERfRVhJVEVECShfX1NJX0NITER8MSkJLyogY2hpbGQgaGFzIGV4aXRlZCAqLworI2RlZmluZSBDTERfS0lMTEVECShfX1NJX0NITER8MikJLyogY2hpbGQgd2FzIGtpbGxlZCAqLworI2RlZmluZSBDTERfRFVNUEVECShfX1NJX0NITER8MykJLyogY2hpbGQgdGVybWluYXRlZCBhYm5vcm1hbGx5ICovCisjZGVmaW5lIENMRF9UUkFQUEVECShfX1NJX0NITER8NCkJLyogdHJhY2VkIGNoaWxkIGhhcyB0cmFwcGVkICovCisjZGVmaW5lIENMRF9TVE9QUEVECShfX1NJX0NITER8NSkJLyogY2hpbGQgaGFzIHN0b3BwZWQgKi8KKyNkZWZpbmUgQ0xEX0NPTlRJTlVFRAkoX19TSV9DSExEfDYpCS8qIHN0b3BwZWQgY2hpbGQgaGFzIGNvbnRpbnVlZCAqLworI2RlZmluZSBOU0lHQ0hMRAk2CisKKy8qCisgKiBTSUdQT0xMIHNpX2NvZGVzCisgKi8KKyNkZWZpbmUgUE9MTF9JTgkJKF9fU0lfUE9MTHwxKQkvKiBkYXRhIGlucHV0IGF2YWlsYWJsZSAqLworI2RlZmluZSBQT0xMX09VVAkoX19TSV9QT0xMfDIpCS8qIG91dHB1dCBidWZmZXJzIGF2YWlsYWJsZSAqLworI2RlZmluZSBQT0xMX01TRwkoX19TSV9QT0xMfDMpCS8qIGlucHV0IG1lc3NhZ2UgYXZhaWxhYmxlICovCisjZGVmaW5lIFBPTExfRVJSCShfX1NJX1BPTEx8NCkJLyogaS9vIGVycm9yICovCisjZGVmaW5lIFBPTExfUFJJCShfX1NJX1BPTEx8NSkJLyogaGlnaCBwcmlvcml0eSBpbnB1dCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgUE9MTF9IVVAJKF9fU0lfUE9MTHw2KQkvKiBkZXZpY2UgZGlzY29ubmVjdGVkICovCisjZGVmaW5lIE5TSUdQT0xMCTYKKworLyoKKyAqIHNpZ2V2ZW50IGRlZmluaXRpb25zCisgKiAKKyAqIEl0IHNlZW1zIGxpa2VseSB0aGF0IFNJR0VWX1RIUkVBRCB3aWxsIGhhdmUgdG8gYmUgaGFuZGxlZCBmcm9tIAorICogdXNlcnNwYWNlLCBsaWJwdGhyZWFkIHRyYW5zbXV0aW5nIGl0IHRvIFNJR0VWX1NJR05BTCwgd2hpY2ggdGhlCisgKiB0aHJlYWQgbWFuYWdlciB0aGVuIGNhdGNoZXMgYW5kIGRvZXMgdGhlIGFwcHJvcHJpYXRlIG5vbnNlbnNlLgorICogSG93ZXZlciwgZXZlcnl0aGluZyBpcyB3cml0dGVuIG91dCBoZXJlIHNvIGFzIHRvIG5vdCBnZXQgbG9zdC4KKyAqLworI2RlZmluZSBTSUdFVl9TSUdOQUwJMAkvKiBub3RpZnkgdmlhIHNpZ25hbCAqLworI2RlZmluZSBTSUdFVl9OT05FCTEJLyogb3RoZXIgbm90aWZpY2F0aW9uOiBtZWFuaW5nbGVzcyAqLworI2RlZmluZSBTSUdFVl9USFJFQUQJMgkvKiBkZWxpdmVyIHZpYSB0aHJlYWQgY3JlYXRpb24gKi8KKyNkZWZpbmUgU0lHRVZfVEhSRUFEX0lEIDQJLyogZGVsaXZlciB0byB0aHJlYWQgKi8KKworLyoKKyAqIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYWxpZ25tZW50IGlzIG9rIG9uIGFsbCBjdXJyZW50IGFyY2hpdGVjdHVyZXMKKyAqIGJ1dCB3ZSBsZWF2ZSBvcGVuIHRoaXMgYmVpbmcgb3ZlcnJpZGRlbiBpbiB0aGUgZnV0dXJlCisgKi8KKyNpZm5kZWYgX19BUkNIX1NJR0VWX1BSRUFNQkxFX1NJWkUKKyNkZWZpbmUgX19BUkNIX1NJR0VWX1BSRUFNQkxFX1NJWkUJKHNpemVvZihpbnQpICogMiArIHNpemVvZihzaWd2YWxfdCkpCisjZW5kaWYKKworI2RlZmluZSBTSUdFVl9NQVhfU0laRQk2NAorI2RlZmluZSBTSUdFVl9QQURfU0laRQkoKFNJR0VWX01BWF9TSVpFIC0gX19BUkNIX1NJR0VWX1BSRUFNQkxFX1NJWkUpIFwKKwkJLyBzaXplb2YoaW50KSkKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnZXZlbnQgeworCXNpZ3ZhbF90IHNpZ2V2X3ZhbHVlOworCWludCBzaWdldl9zaWdubzsKKwlpbnQgc2lnZXZfbm90aWZ5OworCXVuaW9uIHsKKwkJaW50IF9wYWRbU0lHRVZfUEFEX1NJWkVdOworCQkgaW50IF90aWQ7CisKKwkJc3RydWN0IHsKKwkJCXZvaWQgKCpfZnVuY3Rpb24pKHNpZ3ZhbF90KTsKKwkJCXZvaWQgKl9hdHRyaWJ1dGU7CS8qIHJlYWxseSBwdGhyZWFkX2F0dHJfdCAqLworCQl9IF9zaWdldl90aHJlYWQ7CisJfSBfc2lnZXZfdW47Cit9IHNpZ2V2ZW50X3Q7CisKKyNkZWZpbmUgc2lnZXZfbm90aWZ5X2Z1bmN0aW9uCV9zaWdldl91bi5fc2lnZXZfdGhyZWFkLl9mdW5jdGlvbgorI2RlZmluZSBzaWdldl9ub3RpZnlfYXR0cmlidXRlcwlfc2lnZXZfdW4uX3NpZ2V2X3RocmVhZC5fYXR0cmlidXRlCisjZGVmaW5lIHNpZ2V2X25vdGlmeV90aHJlYWRfaWQJIF9zaWdldl91bi5fdGlkCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljL3NpZ25hbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2QwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWduYWwuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfU0lHTkFMX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19TSUdOQUxfSAorCisKKyNpZm5kZWYgU0lHX0JMT0NLCisjZGVmaW5lIFNJR19CTE9DSyAgICAgICAgICAwCS8qIGZvciBibG9ja2luZyBzaWduYWxzICovCisjZW5kaWYKKyNpZm5kZWYgU0lHX1VOQkxPQ0sKKyNkZWZpbmUgU0lHX1VOQkxPQ0sgICAgICAgIDEJLyogZm9yIHVuYmxvY2tpbmcgc2lnbmFscyAqLworI2VuZGlmCisjaWZuZGVmIFNJR19TRVRNQVNLCisjZGVmaW5lIFNJR19TRVRNQVNLICAgICAgICAyCS8qIGZvciBzZXR0aW5nIHRoZSBzaWduYWwgbWFzayAqLworI2VuZGlmCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHZvaWQgX19zaWduYWxmbl90KGludCk7Cit0eXBlZGVmIF9fc2lnbmFsZm5fdCAqX19zaWdoYW5kbGVyX3Q7CisKK3R5cGVkZWYgdm9pZCBfX3Jlc3RvcmVmbl90KHZvaWQpOwordHlwZWRlZiBfX3Jlc3RvcmVmbl90ICpfX3NpZ3Jlc3RvcmVfdDsKKworI2RlZmluZSBTSUdfREZMCSggKF9fc2lnaGFuZGxlcl90KTApCS8qIGRlZmF1bHQgc2lnbmFsIGhhbmRsaW5nICovCisjZGVmaW5lIFNJR19JR04JKCAoX19zaWdoYW5kbGVyX3QpMSkJLyogaWdub3JlIHNpZ25hbCAqLworI2RlZmluZSBTSUdfRVJSCSggKF9fc2lnaGFuZGxlcl90KS0xKQkvKiBlcnJvciByZXR1cm4gZnJvbSBzaWduYWwgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19TSUdOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20tZ2VuZXJpYy9zdGF0ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwMTA0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtLWdlbmVyaWMvc3RhdGZzLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfR0VORVJJQ19TVEFURlNfSAorI2RlZmluZSBfR0VORVJJQ19TVEFURlNfSAorCisjaWZuZGVmIF9fS0VSTkVMX1NUUklDVF9OQU1FUworIyBpbmNsdWRlIDxsaW51eC90eXBlcy5oPgordHlwZWRlZiBfX2tlcm5lbF9mc2lkX3QJZnNpZF90OworI2VuZGlmCisKK3N0cnVjdCBzdGF0ZnMgeworCV9fdTMyIGZfdHlwZTsKKwlfX3UzMiBmX2JzaXplOworCV9fdTMyIGZfYmxvY2tzOworCV9fdTMyIGZfYmZyZWU7CisJX191MzIgZl9iYXZhaWw7CisJX191MzIgZl9maWxlczsKKwlfX3UzMiBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJX191MzIgZl9uYW1lbGVuOworCV9fdTMyIGZfZnJzaXplOworCV9fdTMyIGZfc3BhcmVbNV07Cit9OworCitzdHJ1Y3Qgc3RhdGZzNjQgeworCV9fdTMyIGZfdHlwZTsKKwlfX3UzMiBmX2JzaXplOworCV9fdTY0IGZfYmxvY2tzOworCV9fdTY0IGZfYmZyZWU7CisJX191NjQgZl9iYXZhaWw7CisJX191NjQgZl9maWxlczsKKwlfX3U2NCBmX2ZmcmVlOworCV9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQ7CisJX191MzIgZl9uYW1lbGVuOworCV9fdTMyIGZfZnJzaXplOworCV9fdTMyIGZfc3BhcmVbNV07Cit9OworCitzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IHsKKwlfX3UzMiBmX3R5cGU7CisJX191MzIgZl9ic2l6ZTsKKwlfX3U2NCBmX2Jsb2NrczsKKwlfX3U2NCBmX2JmcmVlOworCV9fdTY0IGZfYmF2YWlsOworCV9fdTY0IGZfZmlsZXM7CisJX191NjQgZl9mZnJlZTsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCV9fdTMyIGZfbmFtZWxlbjsKKwlfX3UzMiBmX2Zyc2l6ZTsKKwlfX3UzMiBmX3NwYXJlWzVdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vYS5vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y3NWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vYS5vdXQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9BU01fWDg2X0FfT1VUX0gKKyNkZWZpbmUgX0FTTV9YODZfQV9PVVRfSAorCitzdHJ1Y3QgZXhlYworeworCXVuc2lnbmVkIGludCBhX2luZm87CS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KKwl1bnNpZ25lZCBhX3RleHQ7CS8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGFfZGF0YTsJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9zeW1zOwkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBhX2VudHJ5OwkvKiBzdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCisJdW5zaWduZWQgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCit9OworCisjZGVmaW5lIE5fVFJTSVpFKGEpCSgoYSkuYV90cnNpemUpCisjZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCisjZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKKworCisjZW5kaWYgLyogX0FTTV9YODZfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vYXV4dmVjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Y1ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vYXV4dmVjLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9BVVhWRUNfSAorI2RlZmluZSBfQVNNX1g4Nl9BVVhWRUNfSAorLyoKKyAqIEFyY2hpdGVjdHVyZS1uZXV0cmFsIEFUXyB2YWx1ZXMgaW4gMC0xNywgbGVhdmUgc29tZSByb29tCisgKiBmb3IgbW9yZSBvZiB0aGVtLCBzdGFydCB0aGUgeDg2LXNwZWNpZmljIG9uZXMgYXQgMzIuCisgKi8KKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBBVF9TWVNJTkZPCQkzMgorI2VuZGlmCisjZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkJMzMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9ib290LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YWZmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2Jvb3QuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9BU01fQk9PVF9ICisjZGVmaW5lIF9BU01fQk9PVF9ICisKKy8qIERvbid0IHRvdWNoIHRoZXNlLCB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiAqLworI2RlZmluZSBERUZfSU5JVFNFRwkweDkwMDAKKyNkZWZpbmUgREVGX1NZU1NFRwkweDEwMDAKKyNkZWZpbmUgREVGX1NFVFVQU0VHCTB4OTAyMAorI2RlZmluZSBERUZfU1lTU0laRQkweDdGMDAKKworLyogSW50ZXJuYWwgc3ZnYSBzdGFydHVwIGNvbnN0YW50cyAqLworI2RlZmluZSBOT1JNQUxfVkdBCTB4ZmZmZgkJLyogODB4MjUgbW9kZSAqLworI2RlZmluZSBFWFRFTkRFRF9WR0EJMHhmZmZlCQkvKiA4MHg1MCBtb2RlICovCisjZGVmaW5lIEFTS19WR0EJCTB4ZmZmZAkJLyogYXNrIGZvciBpdCBhdCBib290dXAgKi8KKworLyogUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSBrZXJuZWwgc2hvdWxkIGJlIGxvYWRlZC4gKi8KKyNkZWZpbmUgTE9BRF9QSFlTSUNBTF9BRERSICgoQ09ORklHX1BIWVNJQ0FMX1NUQVJUIFwKKwkJCQkrIChDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSkgXAorCQkJCSYgfihDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSkKKworI2VuZGlmIC8qIF9BU01fQk9PVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9ib290cGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2Jvb3RwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjNkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9ib290cGFyYW0uaApAQCAtMCwwICsxLDk0IEBACisjaWZuZGVmIF9BU01fQk9PVFBBUkFNX0gKKyNkZWZpbmUgX0FTTV9CT09UUEFSQU1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CisjaW5jbHVkZSA8bGludXgvZWRkLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vaXN0Lmg+CisjaW5jbHVkZSA8dmlkZW8vZWRpZC5oPgorCitzdHJ1Y3Qgc2V0dXBfaGVhZGVyIHsKKwlfX3U4CXNldHVwX3NlY3RzOworCV9fdTE2CXJvb3RfZmxhZ3M7CisJX191MzIJc3lzc2l6ZTsKKwlfX3UxNglyYW1fc2l6ZTsKKyNkZWZpbmUgUkFNRElTS19JTUFHRV9TVEFSVF9NQVNLCTB4MDdGRgorI2RlZmluZSBSQU1ESVNLX1BST01QVF9GTEFHCQkweDgwMDAKKyNkZWZpbmUgUkFNRElTS19MT0FEX0ZMQUcJCTB4NDAwMAorCV9fdTE2CXZpZF9tb2RlOworCV9fdTE2CXJvb3RfZGV2OworCV9fdTE2CWJvb3RfZmxhZzsKKwlfX3UxNglqdW1wOworCV9fdTMyCWhlYWRlcjsKKwlfX3UxNgl2ZXJzaW9uOworCV9fdTMyCXJlYWxtb2RlX3N3dGNoOworCV9fdTE2CXN0YXJ0X3N5czsKKwlfX3UxNglrZXJuZWxfdmVyc2lvbjsKKwlfX3U4CXR5cGVfb2ZfbG9hZGVyOworCV9fdTgJbG9hZGZsYWdzOworI2RlZmluZSBMT0FERURfSElHSAkoMTw8MCkKKyNkZWZpbmUgS0VFUF9TRUdNRU5UUwkoMTw8NikKKyNkZWZpbmUgQ0FOX1VTRV9IRUFQCSgxPDw3KQorCV9fdTE2CXNldHVwX21vdmVfc2l6ZTsKKwlfX3UzMgljb2RlMzJfc3RhcnQ7CisJX191MzIJcmFtZGlza19pbWFnZTsKKwlfX3UzMglyYW1kaXNrX3NpemU7CisJX191MzIJYm9vdHNlY3Rfa2x1ZGdlOworCV9fdTE2CWhlYXBfZW5kX3B0cjsKKwlfX3UxNglfcGFkMTsKKwlfX3UzMgljbWRfbGluZV9wdHI7CisJX191MzIJaW5pdHJkX2FkZHJfbWF4OworCV9fdTMyCWtlcm5lbF9hbGlnbm1lbnQ7CisJX191OAlyZWxvY2F0YWJsZV9rZXJuZWw7CisJX191OAlfcGFkMlszXTsKKwlfX3UzMgljbWRsaW5lX3NpemU7CisJX191MzIJaGFyZHdhcmVfc3ViYXJjaDsKKwlfX3U2NAloYXJkd2FyZV9zdWJhcmNoX2RhdGE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3lzX2Rlc2NfdGFibGUgeworCV9fdTE2IGxlbmd0aDsKKwlfX3U4ICB0YWJsZVsxNF07Cit9OworCitzdHJ1Y3QgZWZpX2luZm8geworCV9fdTMyIF9wYWQxOworCV9fdTMyIGVmaV9zeXN0YWI7CisJX191MzIgZWZpX21lbWRlc2Nfc2l6ZTsKKwlfX3UzMiBlZmlfbWVtZGVzY192ZXJzaW9uOworCV9fdTMyIGVmaV9tZW1tYXA7CisJX191MzIgZWZpX21lbW1hcF9zaXplOworCV9fdTMyIF9wYWQyWzJdOworfTsKKworLyogVGhlIHNvLWNhbGxlZCAiemVyb3BhZ2UiICovCitzdHJ1Y3QgYm9vdF9wYXJhbXMgeworCXN0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbzsJCQkvKiAweDAwMCAqLworCXN0cnVjdCBhcG1fYmlvc19pbmZvIGFwbV9iaW9zX2luZm87CQkvKiAweDA0MCAqLworCV9fdTggIF9wYWQyWzEyXTsJCQkJLyogMHgwNTQgKi8KKwlzdHJ1Y3QgaXN0X2luZm8gaXN0X2luZm87CQkJLyogMHgwNjAgKi8KKwlfX3U4ICBfcGFkM1sxNl07CQkJCS8qIDB4MDcwICovCisJX191OCAgaGQwX2luZm9bMTZdOwkvKiBvYnNvbGV0ZSEgKi8JCS8qIDB4MDgwICovCisJX191OCAgaGQxX2luZm9bMTZdOwkvKiBvYnNvbGV0ZSEgKi8JCS8qIDB4MDkwICovCisJc3RydWN0IHN5c19kZXNjX3RhYmxlIHN5c19kZXNjX3RhYmxlOwkJLyogMHgwYTAgKi8KKwlfX3U4ICBfcGFkNFsxNDRdOwkJCQkvKiAweDBiMCAqLworCXN0cnVjdCBlZGlkX2luZm8gZWRpZF9pbmZvOwkJCS8qIDB4MTQwICovCisJc3RydWN0IGVmaV9pbmZvIGVmaV9pbmZvOwkJCS8qIDB4MWMwICovCisJX191MzIgYWx0X21lbV9rOwkJCQkvKiAweDFlMCAqLworCV9fdTMyIHNjcmF0Y2g7CQkvKiBTY3JhdGNoIGZpZWxkISAqLwkvKiAweDFlNCAqLworCV9fdTggIGU4MjBfZW50cmllczsJCQkJLyogMHgxZTggKi8KKwlfX3U4ICBlZGRidWZfZW50cmllczsJCQkJLyogMHgxZTkgKi8KKwlfX3U4ICBlZGRfbWJyX3NpZ19idWZfZW50cmllczsJCQkvKiAweDFlYSAqLworCV9fdTggIF9wYWQ2WzZdOwkJCQkJLyogMHgxZWIgKi8KKwlzdHJ1Y3Qgc2V0dXBfaGVhZGVyIGhkcjsgICAgLyogc2V0dXAgaGVhZGVyICovCS8qIDB4MWYxICovCisJX191OCAgX3BhZDdbMHgyOTAtMHgxZjEtc2l6ZW9mKHN0cnVjdCBzZXR1cF9oZWFkZXIpXTsKKwlfX3UzMiBlZGRfbWJyX3NpZ19idWZmZXJbRUREX01CUl9TSUdfTUFYXTsJLyogMHgyOTAgKi8KKwlzdHJ1Y3QgZTgyMGVudHJ5IGU4MjBfbWFwW0U4MjBNQVhdOwkJLyogMHgyZDAgKi8KKwlfX3U4ICBfcGFkOFs0OF07CQkJCS8qIDB4Y2QwICovCisJc3RydWN0IGVkZF9pbmZvIGVkZGJ1ZltFRERNQVhOUl07CQkvKiAweGQwMCAqLworCV9fdTggIF9wYWQ5WzI3Nl07CQkJCS8qIDB4ZWVjICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYgLyogX0FTTV9CT09UUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE0OTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9CWVRFT1JERVJfSAorI2RlZmluZSBfQVNNX1g4Nl9CWVRFT1JERVJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX0dOVUNfXworCisjaWZkZWYgX19pMzg2X18KKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCV9fYXNtX18oImJzd2FwICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7CisjZWxzZQorCV9fYXNtX18oInhjaGdiICViMCwlaDBcblx0IgkvKiBzd2FwIGxvd2VyIGJ5dGVzCSovCisJCSJyb3JsICQxNiwlMFxuXHQiCS8qIHN3YXAgd29yZHMJCSovCisJCSJ4Y2hnYiAlYjAsJWgwIgkJLyogc3dhcCBoaWdoZXIgYnl0ZXMJKi8KKwkJOiI9cSIgKHgpCisJCTogIjAiICh4KSk7CisjZW5kaWYKKwlyZXR1cm4geDsKK30KKworc3RhdGljIF9faW5saW5lX18gX191NjQgX19fYXJjaF9fc3dhYjY0KF9fdTY0IHZhbCkKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCB7IF9fdTMyIGEsYjsgfSBzOworCQlfX3U2NCB1OworCX0gdjsKKwl2LnUgPSB2YWw7CisjaWZkZWYgQ09ORklHX1g4Nl9CU1dBUAorCV9fYXNtX18oImJzd2FwbCAlMCA7IGJzd2FwbCAlMSA7IHhjaGdsICUwLCUxIgorCSAgICA6ICI9ciIgKHYucy5hKSwgIj1yIiAodi5zLmIpCisJICAgIDogIjAiICh2LnMuYSksICIxIiAodi5zLmIpKTsKKyNlbHNlCisJdi5zLmEgPSBfX19hcmNoX19zd2FiMzIodi5zLmEpOworCXYucy5iID0gX19fYXJjaF9fc3dhYjMyKHYucy5iKTsKKwlfX2FzbV9fKCJ4Y2hnbCAlMCwlMSIgOiAiPXIiICh2LnMuYSksICI9ciIgKHYucy5iKSA6ICIwIiAodi5zLmEpLCAiMSIgKHYucy5iKSk7CisjZW5kaWYKKwlyZXR1cm4gdi51OworfQorCisjZWxzZSAvKiBfX2kzODZfXyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX19hcmNoX19zd2FiNjQoX191NjQgeCkKK3sKKwlfX2FzbV9fKCJic3dhcHEgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCit7CisJX19hc21fXygiYnN3YXBsICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisKKyNlbmRpZgorCisvKiBEbyBub3QgZGVmaW5lIHN3YWIxNi4gIEdjYyBpcyBzbWFydCBlbm91Z2ggdG8gcmVjb2duaXplICJDIiB2ZXJzaW9uIGFuZAorICAgY29udmVydCBpdCBpbnRvIHJvdGF0aW9uIG9yIGV4aGFuZ2UuICAqLworCisjZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9fX2FyY2hfX3N3YWI2NCh4KQorI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FiMzIoeCkKKworI2RlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KKworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgorCisjZW5kaWYgLyogX0FTTV9YODZfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2RlYnVncmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9kZWJ1Z3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzQ0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9kZWJ1Z3JlZy5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgX0FTTV9YODZfREVCVUdSRUdfSAorI2RlZmluZSBfQVNNX1g4Nl9ERUJVR1JFR19ICisKKworLyogSW5kaWNhdGUgdGhlIHJlZ2lzdGVyIG51bWJlcnMgZm9yIGEgbnVtYmVyIG9mIHRoZSBzcGVjaWZpYworICAgZGVidWcgcmVnaXN0ZXJzLiAgUmVnaXN0ZXJzIDAtMyBjb250YWluIHRoZSBhZGRyZXNzZXMgd2Ugd2lzaCB0byB0cmFwIG9uICovCisjZGVmaW5lIERSX0ZJUlNUQUREUiAwICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0ZJUlNUQUREUl0gKi8KKyNkZWZpbmUgRFJfTEFTVEFERFIgMyAgICAgICAgIC8qIHVfZGVidWdyZWdbRFJfTEFTVEFERFJdICAqLworCisjZGVmaW5lIERSX1NUQVRVUyA2ICAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX1NUQVRVU10gICAgICovCisjZGVmaW5lIERSX0NPTlRST0wgNyAgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0NPTlRST0xdICovCisKKy8qIERlZmluZSBhIGZldyB0aGluZ3MgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIuICBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkZWJ1Z2dpbmcgcmVnaXN0ZXIgd2FzIHJlc3BvbnNpYmxlIGZvciB0aGUgdHJhcC4gIFRoZSBvdGhlciBiaXRzCisgICBhcmUgZWl0aGVyIHJlc2VydmVkIG9yIG5vdCBvZiBpbnRlcmVzdCB0byB1cy4gKi8KKworI2RlZmluZSBEUl9UUkFQMAkoMHgxKQkJLyogZGIwICovCisjZGVmaW5lIERSX1RSQVAxCSgweDIpCQkvKiBkYjEgKi8KKyNkZWZpbmUgRFJfVFJBUDIJKDB4NCkJCS8qIGRiMiAqLworI2RlZmluZSBEUl9UUkFQMwkoMHg4KQkJLyogZGIzICovCisKKyNkZWZpbmUgRFJfU1RFUAkJKDB4NDAwMCkJLyogc2luZ2xlLXN0ZXAgKi8KKyNkZWZpbmUgRFJfU1dJVENICSgweDgwMDApCS8qIHRhc2sgc3dpdGNoICovCisKKy8qIE5vdyBkZWZpbmUgYSBidW5jaCBvZiB0aGluZ3MgZm9yIG1hbmlwdWxhdGluZyB0aGUgY29udHJvbCByZWdpc3Rlci4KKyAgIFRoZSB0b3AgdHdvIGJ5dGVzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyIGNvbnNpc3Qgb2YgNCBmaWVsZHMgb2YgNAorICAgYml0cyAtIGVhY2ggZmllbGQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBmb3VyIGRlYnVnIHJlZ2lzdGVycywKKyAgIGFuZCBpbmRpY2F0ZXMgd2hhdCB0eXBlcyBvZiBhY2Nlc3Mgd2UgdHJhcCBvbiwgYW5kIGhvdyBsYXJnZSB0aGUgZGF0YQorICAgZmllbGQgaXMgdGhhdCB3ZSBhcmUgbG9va2luZyBhdCAqLworCisjZGVmaW5lIERSX0NPTlRST0xfU0hJRlQgMTYgLyogU2tpcCB0aGlzIG1hbnkgYml0cyBpbiBjdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTF9TSVpFIDQgICAvKiA0IGNvbnRyb2wgYml0cyBwZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBEUl9SV19FWEVDVVRFICgweDApICAgLyogU2V0dGluZ3MgZm9yIHRoZSBhY2Nlc3MgdHlwZXMgdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9SV19XUklURSAoMHgxKQorI2RlZmluZSBEUl9SV19SRUFEICgweDMpCisKKyNkZWZpbmUgRFJfTEVOXzEgKDB4MCkgLyogU2V0dGluZ3MgZm9yIGRhdGEgbGVuZ3RoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfTEVOXzIgKDB4NCkKKyNkZWZpbmUgRFJfTEVOXzQgKDB4QykKKyNkZWZpbmUgRFJfTEVOXzggKDB4OCkKKworLyogVGhlIGxvdyBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlCisgICBlbmFibGVkLiAgVGhlcmUgYXJlIDQgZmllbGRzIG9mIHR3byBiaXRzLiAgT25lIGJpdCBpcyAibG9jYWwiLCBtZWFuaW5nCisgICB0aGF0IHRoZSBwcm9jZXNzb3Igd2lsbCByZXNldCB0aGUgYml0IGFmdGVyIGEgdGFzayBzd2l0Y2ggYW5kIHRoZSBvdGhlcgorICAgaXMgZ2xvYmFsIG1lYW5pbmcgdGhhdCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgcmVzZXQgdGhlIGJpdC4gIFdpdGggbGludXgsCisgICB5b3UgY2FuIHVzZSBlaXRoZXIgb25lLCBzaW5jZSB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIHJlZ2lzdGVyIHdoZW4gd2UgZW50ZXIKKyAgIGtlcm5lbCBtb2RlLiAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9TSElGVCAwICAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBsb2NhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfU0hJRlQgMSAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBnbG9iYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9FTkFCTEVfU0laRSAyICAgICAgICAgICAvKiAyIGVuYWJsZSBiaXRzIHBlciByZWdpc3RlciAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9NQVNLICgweDU1KSAgLyogU2V0ICBsb2NhbCBiaXRzIGZvciBhbGwgNCByZWdzICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfTUFTSyAoMHhBQSkgLyogU2V0IGdsb2JhbCBiaXRzIGZvciBhbGwgNCByZWdzICovCisKKy8qIFRoZSBzZWNvbmQgYnl0ZSB0byB0aGUgY29udHJvbCByZWdpc3RlciBoYXMgYSBmZXcgc3BlY2lhbCB0aGluZ3MuCisgICBXZSBjYW4gc2xvdyB0aGUgaW5zdHJ1Y3Rpb24gcGlwZWxpbmUgZm9yIGluc3RydWN0aW9ucyBjb21pbmcgdmlhIHRoZQorICAgZ2R0IG9yIHRoZSBsZHQgaWYgd2Ugd2FudCB0by4gIEkgYW0gbm90IHN1cmUgd2h5IHRoaXMgaXMgYW4gYWR2YW50YWdlICovCisKKyNpZmRlZiBfX2kzODZfXworI2RlZmluZSBEUl9DT05UUk9MX1JFU0VSVkVEICgweEZDMDApIC8qIFJlc2VydmVkIGJ5IEludGVsICovCisjZWxzZQorI2RlZmluZSBEUl9DT05UUk9MX1JFU0VSVkVEICgweEZGRkZGRkZGMDAwMEZDMDBVTCkgLyogUmVzZXJ2ZWQgKi8KKyNlbmRpZgorCisjZGVmaW5lIERSX0xPQ0FMX1NMT1dET1dOICgweDEwMCkgICAvKiBMb2NhbCBzbG93IHRoZSBwaXBlbGluZSAqLworI2RlZmluZSBEUl9HTE9CQUxfU0xPV0RPV04gKDB4MjAwKSAgLyogR2xvYmFsIHNsb3cgdGhlIHBpcGVsaW5lICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vZTgyMC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vZTgyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGE0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9lODIwLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmbmRlZiBfX0FTTV9FODIwX0gKKyNkZWZpbmUgX19BU01fRTgyMF9ICisjZGVmaW5lIEU4MjBNQVAJMHgyZDAJCS8qIG91ciBtYXAgKi8KKyNkZWZpbmUgRTgyME1BWAkxMjgJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIEU4MjBNQVAgKi8KKyNkZWZpbmUgRTgyME5SCTB4MWU4CQkvKiAjIGVudHJpZXMgaW4gRTgyME1BUCAqLworCisjZGVmaW5lIEU4MjBfUkFNCTEKKyNkZWZpbmUgRTgyMF9SRVNFUlZFRAkyCisjZGVmaW5lIEU4MjBfQUNQSQkzCisjZGVmaW5lIEU4MjBfTlZTCTQKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3N0cnVjdCBlODIwZW50cnkgeworCV9fdTY0IGFkZHI7CS8qIHN0YXJ0IG9mIG1lbW9yeSBzZWdtZW50ICovCisJX191NjQgc2l6ZTsJLyogc2l6ZSBvZiBtZW1vcnkgc2VnbWVudCAqLworCV9fdTMyIHR5cGU7CS8qIHR5cGUgb2YgbWVtb3J5IHNlZ21lbnQgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBlODIwbWFwIHsKKwlfX3UzMiBucl9tYXA7CisJc3RydWN0IGU4MjBlbnRyeSBtYXBbRTgyME1BWF07Cit9OworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZGVmaW5lIEJJT1NfQkVHSU4gICAgICAgICAgICAgMHgwMDBhMDAwMAorI2RlZmluZSBCSU9TX0VORCAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKworCisjZW5kaWYgIC8qIF9fQVNNX0U4MjBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vZWxmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M4ZTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9FTEZfSAorI2RlZmluZSBfQVNNX1g4Nl9FTEZfSAorCisvKgorICogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4KKyAqLworCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS91c2VyLmg+CisjaW5jbHVkZSA8YXNtL2F1eHZlYy5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKKworI2RlZmluZSBFTEZfTkdSRUcgKHNpemVvZiAoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKQordHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKKwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBlbGZfZnByZWdzZXRfdDsKKworI2lmZGVmIF9faTM4Nl9fCisKK3R5cGVkZWYgc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZWxmX2ZweHJlZ3NldF90OworCisjZGVmaW5lIFJfMzg2X05PTkUJMAorI2RlZmluZSBSXzM4Nl8zMgkxCisjZGVmaW5lIFJfMzg2X1BDMzIJMgorI2RlZmluZSBSXzM4Nl9HT1QzMgkzCisjZGVmaW5lIFJfMzg2X1BMVDMyCTQKKyNkZWZpbmUgUl8zODZfQ09QWQk1CisjZGVmaW5lIFJfMzg2X0dMT0JfREFUCTYKKyNkZWZpbmUgUl8zODZfSk1QX1NMT1QJNworI2RlZmluZSBSXzM4Nl9SRUxBVElWRQk4CisjZGVmaW5lIFJfMzg2X0dPVE9GRgk5CisjZGVmaW5lIFJfMzg2X0dPVFBDCTEwCisjZGVmaW5lIFJfMzg2X05VTQkxMQorCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCisgKi8KKyNkZWZpbmUgRUxGX0NMQVNTCUVMRkNMQVNTMzIKKyNkZWZpbmUgRUxGX0RBVEEJRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0gJRU1fMzg2CisKKyNlbHNlCisKKy8qIHg4Ni02NCByZWxvY2F0aW9uIHR5cGVzICovCisjZGVmaW5lIFJfWDg2XzY0X05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9YODZfNjRfNjQJCTEJLyogRGlyZWN0IDY0IGJpdCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEMzMgkJMgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2lnbmVkICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVDMyCQkzCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUExUMzIJCTQJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfWDg2XzY0X0NPUFkJCTUJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX1g4Nl82NF9HTE9CX0RBVAk2CS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfSlVNUF9TTE9UCTcJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9SRUxBVElWRQk4CS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UUENSRUwJOQkvKiAzMiBiaXQgc2lnbmVkIHBjIHJlbGF0aXZlCisJCQkJCSAgIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzIJCTEwCS8qIERpcmVjdCAzMiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF8zMlMJCTExCS8qIERpcmVjdCAzMiBiaXQgc2lnbiBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF8xNgkJMTIJLyogRGlyZWN0IDE2IGJpdCB6ZXJvIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMTYJCTEzCS8qIDE2IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisjZGVmaW5lIFJfWDg2XzY0XzgJCTE0CS8qIERpcmVjdCA4IGJpdCBzaWduIGV4dGVuZGVkICAqLworI2RlZmluZSBSX1g4Nl82NF9QQzgJCTE1CS8qIDggYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KKworI2RlZmluZSBSX1g4Nl82NF9OVU0JCTE2CisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KKyAqLworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1M2NAorI2RlZmluZSBFTEZfREFUQQlFTEZEQVRBMkxTQgorI2RlZmluZSBFTEZfQVJDSAlFTV9YODZfNjQKKworI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9lcnJuby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgyYjUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vZXJybm8uaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZXJybm8uaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWIxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9mY250bC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vaW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3OWZlMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2lvY3RsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvY3RsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9pb2N0bHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2lvY3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzQ5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9pb2N0bHMuaApAQCAtMCwwICsxLDg3IEBACisjaWZuZGVmIF9BU01fWDg2X0lPQ1RMU19ICisjZGVmaW5lIF9BU01fWDg2X0lPQ1RMU19ICisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKworLyogMHg1NCBpcyBqdXN0IGEgbWFnaWMgbnVtYmVyIHRvIG1ha2UgdGhlc2UgcmVsYXRpdmVseSB1bmlxdWUgKCdUJykgKi8KKworI2RlZmluZSBUQ0dFVFMJCTB4NTQwMQorI2RlZmluZSBUQ1NFVFMJCTB4NTQwMiAvKiBDbGFzaGVzIHdpdGggU05EQ1RMX1RNUl9TVEFSVCBzb3VuZCBpb2N0bCAqLworI2RlZmluZSBUQ1NFVFNXCQkweDU0MDMKKyNkZWZpbmUgVENTRVRTRgkJMHg1NDA0CisjZGVmaW5lIFRDR0VUQQkJMHg1NDA1CisjZGVmaW5lIFRDU0VUQQkJMHg1NDA2CisjZGVmaW5lIFRDU0VUQVcJCTB4NTQwNworI2RlZmluZSBUQ1NFVEFGCQkweDU0MDgKKyNkZWZpbmUgVENTQlJLCQkweDU0MDkKKyNkZWZpbmUgVENYT05DCQkweDU0MEEKKyNkZWZpbmUgVENGTFNICQkweDU0MEIKKyNkZWZpbmUgVElPQ0VYQ0wJMHg1NDBDCisjZGVmaW5lIFRJT0NOWENMCTB4NTQwRAorI2RlZmluZSBUSU9DU0NUVFkJMHg1NDBFCisjZGVmaW5lIFRJT0NHUEdSUAkweDU0MEYKKyNkZWZpbmUgVElPQ1NQR1JQCTB4NTQxMAorI2RlZmluZSBUSU9DT1VUUQkweDU0MTEKKyNkZWZpbmUgVElPQ1NUSQkJMHg1NDEyCisjZGVmaW5lIFRJT0NHV0lOU1oJMHg1NDEzCisjZGVmaW5lIFRJT0NTV0lOU1oJMHg1NDE0CisjZGVmaW5lIFRJT0NNR0VUCTB4NTQxNQorI2RlZmluZSBUSU9DTUJJUwkweDU0MTYKKyNkZWZpbmUgVElPQ01CSUMJMHg1NDE3CisjZGVmaW5lIFRJT0NNU0VUCTB4NTQxOAorI2RlZmluZSBUSU9DR1NPRlRDQVIJMHg1NDE5CisjZGVmaW5lIFRJT0NTU09GVENBUgkweDU0MUEKKyNkZWZpbmUgRklPTlJFQUQJMHg1NDFCCisjZGVmaW5lIFRJT0NJTlEJCUZJT05SRUFECisjZGVmaW5lIFRJT0NMSU5VWAkweDU0MUMKKyNkZWZpbmUgVElPQ0NPTlMJMHg1NDFECisjZGVmaW5lIFRJT0NHU0VSSUFMCTB4NTQxRQorI2RlZmluZSBUSU9DU1NFUklBTAkweDU0MUYKKyNkZWZpbmUgVElPQ1BLVAkJMHg1NDIwCisjZGVmaW5lIEZJT05CSU8JCTB4NTQyMQorI2RlZmluZSBUSU9DTk9UVFkJMHg1NDIyCisjZGVmaW5lIFRJT0NTRVRECTB4NTQyMworI2RlZmluZSBUSU9DR0VURAkweDU0MjQKKyNkZWZpbmUgVENTQlJLUAkJMHg1NDI1CS8qIE5lZWRlZCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworLyogI2RlZmluZSBUSU9DVFRZR1NUUlVDVCAweDU0MjYgLSBGb3JtZXIgZGVidWdnaW5nLW9ubHkgaW9jdGwgKi8KKyNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLDB4MkEsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTMgkJX0lPVygnVCcsMHgyQiwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNXMglfSU9XKCdUJywweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLDB4MkQsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVElPQ0dQVE4JX0lPUignVCcsMHgzMCwgdW5zaWduZWQgaW50KSAvKiBHZXQgUHR5IE51bWJlciAob2YgcHR5LW11eCBkZXZpY2UpICovCisjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsMHgzMSwgaW50KSAgLyogTG9jay91bmxvY2sgUHR5ICovCisKKyNkZWZpbmUgRklPTkNMRVgJMHg1NDUwCisjZGVmaW5lIEZJT0NMRVgJCTB4NTQ1MQorI2RlZmluZSBGSU9BU1lOQwkweDU0NTIKKyNkZWZpbmUgVElPQ1NFUkNPTkZJRwkweDU0NTMKKyNkZWZpbmUgVElPQ1NFUkdXSUxECTB4NTQ1NAorI2RlZmluZSBUSU9DU0VSU1dJTEQJMHg1NDU1CisjZGVmaW5lIFRJT0NHTENLVFJNSU9TCTB4NTQ1NgorI2RlZmluZSBUSU9DU0xDS1RSTUlPUwkweDU0NTcKKyNkZWZpbmUgVElPQ1NFUkdTVFJVQ1QJMHg1NDU4IC8qIEZvciBkZWJ1Z2dpbmcgb25seSAqLworI2RlZmluZSBUSU9DU0VSR0VUTFNSICAgMHg1NDU5IC8qIEdldCBsaW5lIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBUSU9DU0VSR0VUTVVMVEkgMHg1NDVBIC8qIEdldCBtdWx0aXBvcnQgY29uZmlnICAqLworI2RlZmluZSBUSU9DU0VSU0VUTVVMVEkgMHg1NDVCIC8qIFNldCBtdWx0aXBvcnQgY29uZmlnICovCisKKyNkZWZpbmUgVElPQ01JV0FJVAkweDU0NUMJLyogd2FpdCBmb3IgYSBjaGFuZ2Ugb24gc2VyaWFsIGlucHV0IGxpbmUocykgKi8KKyNkZWZpbmUgVElPQ0dJQ09VTlQJMHg1NDVECS8qIHJlYWQgc2VyaWFsIHBvcnQgX19pbmxpbmVfXyBpbnRlcnJ1cHQgY291bnRzICovCisjZGVmaW5lIFRJT0NHSEFZRVNFU1AgICAweDU0NUUgIC8qIEdldCBIYXllcyBFU1AgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUSU9DU0hBWUVTRVNQICAgMHg1NDVGICAvKiBTZXQgSGF5ZXMgRVNQIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgRklPUVNJWkUJMHg1NDYwCisKKy8qIFVzZWQgZm9yIHBhY2tldCBtb2RlICovCisjZGVmaW5lIFRJT0NQS1RfREFUQQkJIDAKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFJFQUQJIDEKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFdSSVRFCSAyCisjZGVmaW5lIFRJT0NQS1RfU1RPUAkJIDQKKyNkZWZpbmUgVElPQ1BLVF9TVEFSVAkJIDgKKyNkZWZpbmUgVElPQ1BLVF9OT1NUT1AJCTE2CisjZGVmaW5lIFRJT0NQS1RfRE9TVE9QCQkzMgorCisjZGVmaW5lIFRJT0NTRVJfVEVNVCAgICAweDAxCS8qIFRyYW5zbWl0dGVyIHBoeXNpY2FsbHkgZW1wdHkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9pcGNidWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGY4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9pcGNidWYuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9BU01fWDg2X0lQQ0JVRl9ICisjZGVmaW5lIF9BU01fWDg2X0lQQ0JVRl9ICisKKy8qCisgKiBUaGUgaXBjNjRfcGVybSBzdHJ1Y3R1cmUgZm9yIHg4NiBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gMzItYml0IG1vZGVfdCBhbmQgc2VxCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KKworc3RydWN0IGlwYzY0X3Blcm0KK3sKKwlfX2tlcm5lbF9rZXlfdAkJa2V5OworCV9fa2VybmVsX3VpZDMyX3QJdWlkOworCV9fa2VybmVsX2dpZDMyX3QJZ2lkOworCV9fa2VybmVsX3VpZDMyX3QJY3VpZDsKKwlfX2tlcm5lbF9naWQzMl90CWNnaWQ7CisJX19rZXJuZWxfbW9kZV90CQltb2RlOworCXVuc2lnbmVkIHNob3J0CQlfX3BhZDE7CisJdW5zaWduZWQgc2hvcnQJCXNlcTsKKwl1bnNpZ25lZCBzaG9ydAkJX19wYWQyOworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfSVBDQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2lzdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyNjUyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2lzdC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX0FTTV9JU1RfSAorI2RlZmluZSBfQVNNX0lTVF9ICisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIHRoZSBpbnRlcmZhY2UgdG8gSVNUIEJJT1MKKyAqIENvcHlyaWdodCAyMDAyIEFuZHkgR3JvdmVyIDxhbmRyZXcuZ3JvdmVyQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGlzdF9pbmZvIHsKKwlfX3UzMiBzaWduYXR1cmU7CisJX191MzIgY29tbWFuZDsKKwlfX3UzMiBldmVudDsKKwlfX3UzMiBwZXJmX2xldmVsOworfTsKKworI2VuZGlmCS8qIF9BU01fSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2t2bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20va3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3MTEyMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL2t2bS5oCkBAIC0wLDAgKzEsMTkxIEBACisjaWZuZGVmIF9fTElOVVhfS1ZNX1g4Nl9ICisjZGVmaW5lIF9fTElOVVhfS1ZNX1g4Nl9ICisKKy8qCisgKiBLVk0geDg2IHNwZWNpZmljIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiBBcmNoaXRlY3R1cmFsIGludGVycnVwdCBsaW5lIGNvdW50LiAqLworI2RlZmluZSBLVk1fTlJfSU5URVJSVVBUUyAyNTYKKworc3RydWN0IGt2bV9tZW1vcnlfYWxpYXMgeworCV9fdTMyIHNsb3Q7ICAvKiB0aGlzIGhhcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBtZW1vcnkgc2xvdHMgKi8KKwlfX3UzMiBmbGFnczsKKwlfX3U2NCBndWVzdF9waHlzX2FkZHI7CisJX191NjQgbWVtb3J5X3NpemU7CisJX191NjQgdGFyZ2V0X3BoeXNfYWRkcjsKK307CisKKy8qIGZvciBLVk1fR0VUX0lSUUNISVAgYW5kIEtWTV9TRVRfSVJRQ0hJUCAqLworc3RydWN0IGt2bV9waWNfc3RhdGUgeworCV9fdTggbGFzdF9pcnI7CS8qIGVkZ2UgZGV0ZWN0aW9uICovCisJX191OCBpcnI7CQkvKiBpbnRlcnJ1cHQgcmVxdWVzdCByZWdpc3RlciAqLworCV9fdTggaW1yOwkJLyogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKwlfX3U4IGlzcjsJCS8qIGludGVycnVwdCBzZXJ2aWNlIHJlZ2lzdGVyICovCisJX191OCBwcmlvcml0eV9hZGQ7CS8qIGhpZ2hlc3QgaXJxIHByaW9yaXR5ICovCisJX191OCBpcnFfYmFzZTsKKwlfX3U4IHJlYWRfcmVnX3NlbGVjdDsKKwlfX3U4IHBvbGw7CisJX191OCBzcGVjaWFsX21hc2s7CisJX191OCBpbml0X3N0YXRlOworCV9fdTggYXV0b19lb2k7CisJX191OCByb3RhdGVfb25fYXV0b19lb2k7CisJX191OCBzcGVjaWFsX2Z1bGx5X25lc3RlZF9tb2RlOworCV9fdTggaW5pdDQ7CQkvKiB0cnVlIGlmIDQgYnl0ZSBpbml0ICovCisJX191OCBlbGNyOwkJLyogUElJWCBlZGdlL3RyaWdnZXIgc2VsZWN0aW9uICovCisJX191OCBlbGNyX21hc2s7Cit9OworCisjZGVmaW5lIEtWTV9JT0FQSUNfTlVNX1BJTlMgIDI0CitzdHJ1Y3Qga3ZtX2lvYXBpY19zdGF0ZSB7CisJX191NjQgYmFzZV9hZGRyZXNzOworCV9fdTMyIGlvcmVnc2VsOworCV9fdTMyIGlkOworCV9fdTMyIGlycjsKKwlfX3UzMiBwYWQ7CisJdW5pb24geworCQlfX3U2NCBiaXRzOworCQlzdHJ1Y3QgeworCQkJX191OCB2ZWN0b3I7CisJCQlfX3U4IGRlbGl2ZXJ5X21vZGU6MzsKKwkJCV9fdTggZGVzdF9tb2RlOjE7CisJCQlfX3U4IGRlbGl2ZXJ5X3N0YXR1czoxOworCQkJX191OCBwb2xhcml0eToxOworCQkJX191OCByZW1vdGVfaXJyOjE7CisJCQlfX3U4IHRyaWdfbW9kZToxOworCQkJX191OCBtYXNrOjE7CisJCQlfX3U4IHJlc2VydmU6NzsKKwkJCV9fdTggcmVzZXJ2ZWRbNF07CisJCQlfX3U4IGRlc3RfaWQ7CisJCX0gZmllbGRzOworCX0gcmVkaXJ0YmxbS1ZNX0lPQVBJQ19OVU1fUElOU107Cit9OworCisjZGVmaW5lIEtWTV9JUlFDSElQX1BJQ19NQVNURVIgICAwCisjZGVmaW5lIEtWTV9JUlFDSElQX1BJQ19TTEFWRSAgICAxCisjZGVmaW5lIEtWTV9JUlFDSElQX0lPQVBJQyAgICAgICAyCisKKy8qIGZvciBLVk1fR0VUX1JFR1MgYW5kIEtWTV9TRVRfUkVHUyAqLworc3RydWN0IGt2bV9yZWdzIHsKKwkvKiBvdXQgKEtWTV9HRVRfUkVHUykgLyBpbiAoS1ZNX1NFVF9SRUdTKSAqLworCV9fdTY0IHJheCwgcmJ4LCByY3gsIHJkeDsKKwlfX3U2NCByc2ksIHJkaSwgcnNwLCByYnA7CisJX191NjQgcjgsICByOSwgIHIxMCwgcjExOworCV9fdTY0IHIxMiwgcjEzLCByMTQsIHIxNTsKKwlfX3U2NCByaXAsIHJmbGFnczsKK307CisKKy8qIGZvciBLVk1fR0VUX0xBUElDIGFuZCBLVk1fU0VUX0xBUElDICovCisjZGVmaW5lIEtWTV9BUElDX1JFR19TSVpFIDB4NDAwCitzdHJ1Y3Qga3ZtX2xhcGljX3N0YXRlIHsKKwljaGFyIHJlZ3NbS1ZNX0FQSUNfUkVHX1NJWkVdOworfTsKKworc3RydWN0IGt2bV9zZWdtZW50IHsKKwlfX3U2NCBiYXNlOworCV9fdTMyIGxpbWl0OworCV9fdTE2IHNlbGVjdG9yOworCV9fdTggIHR5cGU7CisJX191OCAgcHJlc2VudCwgZHBsLCBkYiwgcywgbCwgZywgYXZsOworCV9fdTggIHVudXNhYmxlOworCV9fdTggIHBhZGRpbmc7Cit9OworCitzdHJ1Y3Qga3ZtX2R0YWJsZSB7CisJX191NjQgYmFzZTsKKwlfX3UxNiBsaW1pdDsKKwlfX3UxNiBwYWRkaW5nWzNdOworfTsKKworCisvKiBmb3IgS1ZNX0dFVF9TUkVHUyBhbmQgS1ZNX1NFVF9TUkVHUyAqLworc3RydWN0IGt2bV9zcmVncyB7CisJLyogb3V0IChLVk1fR0VUX1NSRUdTKSAvIGluIChLVk1fU0VUX1NSRUdTKSAqLworCXN0cnVjdCBrdm1fc2VnbWVudCBjcywgZHMsIGVzLCBmcywgZ3MsIHNzOworCXN0cnVjdCBrdm1fc2VnbWVudCB0ciwgbGR0OworCXN0cnVjdCBrdm1fZHRhYmxlIGdkdCwgaWR0OworCV9fdTY0IGNyMCwgY3IyLCBjcjMsIGNyNCwgY3I4OworCV9fdTY0IGVmZXI7CisJX191NjQgYXBpY19iYXNlOworCV9fdTY0IGludGVycnVwdF9iaXRtYXBbKEtWTV9OUl9JTlRFUlJVUFRTICsgNjMpIC8gNjRdOworfTsKKworLyogZm9yIEtWTV9HRVRfRlBVIGFuZCBLVk1fU0VUX0ZQVSAqLworc3RydWN0IGt2bV9mcHUgeworCV9fdTggIGZwcls4XVsxNl07CisJX191MTYgZmN3OworCV9fdTE2IGZzdzsKKwlfX3U4ICBmdHd4OyAgLyogaW4gZnhzYXZlIGZvcm1hdCAqLworCV9fdTggIHBhZDE7CisJX191MTYgbGFzdF9vcGNvZGU7CisJX191NjQgbGFzdF9pcDsKKwlfX3U2NCBsYXN0X2RwOworCV9fdTggIHhtbVsxNl1bMTZdOworCV9fdTMyIG14Y3NyOworCV9fdTMyIHBhZDI7Cit9OworCitzdHJ1Y3Qga3ZtX21zcl9lbnRyeSB7CisJX191MzIgaW5kZXg7CisJX191MzIgcmVzZXJ2ZWQ7CisJX191NjQgZGF0YTsKK307CisKKy8qIGZvciBLVk1fR0VUX01TUlMgYW5kIEtWTV9TRVRfTVNSUyAqLworc3RydWN0IGt2bV9tc3JzIHsKKwlfX3UzMiBubXNyczsgLyogbnVtYmVyIG9mIG1zcnMgaW4gZW50cmllcyAqLworCV9fdTMyIHBhZDsKKworCXN0cnVjdCBrdm1fbXNyX2VudHJ5IGVudHJpZXNbMF07Cit9OworCisvKiBmb3IgS1ZNX0dFVF9NU1JfSU5ERVhfTElTVCAqLworc3RydWN0IGt2bV9tc3JfbGlzdCB7CisJX191MzIgbm1zcnM7IC8qIG51bWJlciBvZiBtc3JzIGluIGVudHJpZXMgKi8KKwlfX3UzMiBpbmRpY2VzWzBdOworfTsKKworCitzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5IHsKKwlfX3UzMiBmdW5jdGlvbjsKKwlfX3UzMiBlYXg7CisJX191MzIgZWJ4OworCV9fdTMyIGVjeDsKKwlfX3UzMiBlZHg7CisJX191MzIgcGFkZGluZzsKK307CisKKy8qIGZvciBLVk1fU0VUX0NQVUlEICovCitzdHJ1Y3Qga3ZtX2NwdWlkIHsKKwlfX3UzMiBuZW50OworCV9fdTMyIHBhZGRpbmc7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgeworCV9fdTMyIGZ1bmN0aW9uOworCV9fdTMyIGluZGV4OworCV9fdTMyIGZsYWdzOworCV9fdTMyIGVheDsKKwlfX3UzMiBlYng7CisJX191MzIgZWN4OworCV9fdTMyIGVkeDsKKwlfX3UzMiBwYWRkaW5nWzNdOworfTsKKworI2RlZmluZSBLVk1fQ1BVSURfRkxBR19TSUdOSUZDQU5UX0lOREVYIDEKKyNkZWZpbmUgS1ZNX0NQVUlEX0ZMQUdfU1RBVEVGVUxfRlVOQyAgICAyCisjZGVmaW5lIEtWTV9DUFVJRF9GTEFHX1NUQVRFX1JFQURfTkVYVCAgNAorCisvKiBmb3IgS1ZNX1NFVF9DUFVJRDIgKi8KK3N0cnVjdCBrdm1fY3B1aWQyIHsKKwlfX3UzMiBuZW50OworCV9fdTMyIHBhZGRpbmc7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgZW50cmllc1swXTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vbGR0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9sZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM1OTcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vbGR0LmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIGxkdC5oCisgKgorICogRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIHdpdGggdGhlIG1vZGlmeV9sZHQgc3lzdGVtIGNhbGwuCisgKi8KKyNpZm5kZWYgX0FTTV9YODZfTERUX0gKKyNkZWZpbmUgX0FTTV9YODZfTERUX0gKKworLyogTWF4aW11bSBudW1iZXIgb2YgTERUIGVudHJpZXMgc3VwcG9ydGVkLiAqLworI2RlZmluZSBMRFRfRU5UUklFUwk4MTkyCisvKiBUaGUgc2l6ZSBvZiBlYWNoIExEVCBlbnRyeS4gKi8KKyNkZWZpbmUgTERUX0VOVFJZX1NJWkUJOAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyoKKyAqIE5vdGUgb24gNjRiaXQgYmFzZSBhbmQgbGltaXQgaXMgaWdub3JlZCBhbmQgeW91IGNhbm5vdCBzZXQgRFMvRVMvQ1MKKyAqIG5vdCB0byB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgeW91IHN0aWxsIHdhbnQgdG8gZG8gc3lzY2FsbHMuIFRoaXMKKyAqIGNhbGwgaXMgbW9yZSBmb3IgMzJiaXQgbW9kZSB0aGVyZWZvcmUuCisgKi8KK3N0cnVjdCB1c2VyX2Rlc2MgeworCXVuc2lnbmVkIGludCAgZW50cnlfbnVtYmVyOworCXVuc2lnbmVkIGludCAgYmFzZV9hZGRyOworCXVuc2lnbmVkIGludCAgbGltaXQ7CisJdW5zaWduZWQgaW50ICBzZWdfMzJiaXQ6MTsKKwl1bnNpZ25lZCBpbnQgIGNvbnRlbnRzOjI7CisJdW5zaWduZWQgaW50ICByZWFkX2V4ZWNfb25seToxOworCXVuc2lnbmVkIGludCAgbGltaXRfaW5fcGFnZXM6MTsKKwl1bnNpZ25lZCBpbnQgIHNlZ19ub3RfcHJlc2VudDoxOworCXVuc2lnbmVkIGludCAgdXNlYWJsZToxOworI2lmZGVmIF9feDg2XzY0X18KKwl1bnNpZ25lZCBpbnQgIGxtOjE7CisjZW5kaWYKK307CisKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19EQVRBCTAKKyNkZWZpbmUgTU9ESUZZX0xEVF9DT05URU5UU19TVEFDSwkxCisjZGVmaW5lIE1PRElGWV9MRFRfQ09OVEVOVFNfQ09ERQkyCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21jZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vbWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNzM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21jZS5oCkBAIC0wLDAgKzEsODYgQEAKKyNpZm5kZWYgX0FTTV9YODZfTUNFX0gKKyNkZWZpbmUgX0FTTV9YODZfTUNFX0gKKworI2lmZGVmIF9feDg2XzY0X18KKworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworLyoKKyAqIE1hY2hpbmUgQ2hlY2sgc3VwcG9ydCBmb3IgeDg2CisgKi8KKworI2RlZmluZSBNQ0dfQ1RMX1AJICgxVUw8PDgpICAgLyogTUNHX0NBUCByZWdpc3RlciBhdmFpbGFibGUgKi8KKworI2RlZmluZSBNQ0dfU1RBVFVTX1JJUFYgICgxVUw8PDApICAgLyogcmVzdGFydCBpcCB2YWxpZCAqLworI2RlZmluZSBNQ0dfU1RBVFVTX0VJUFYgICgxVUw8PDEpICAgLyogZWlwIHBvaW50cyB0byBjb3JyZWN0IGluc3RydWN0aW9uICovCisjZGVmaW5lIE1DR19TVEFUVVNfTUNJUCAgKDFVTDw8MikgICAvKiBtYWNoaW5lIGNoZWNrIGluIHByb2dyZXNzICovCisKKyNkZWZpbmUgTUNJX1NUQVRVU19WQUwgICAoMVVMPDw2MykgIC8qIHZhbGlkIGVycm9yICovCisjZGVmaW5lIE1DSV9TVEFUVVNfT1ZFUiAgKDFVTDw8NjIpICAvKiBwcmV2aW91cyBlcnJvcnMgbG9zdCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1VDICAgICgxVUw8PDYxKSAgLyogdW5jb3JyZWN0ZWQgZXJyb3IgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19FTiAgICAoMVVMPDw2MCkgIC8qIGVycm9yIGVuYWJsZWQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19NSVNDViAoMVVMPDw1OSkgIC8qIG1pc2MgZXJyb3IgcmVnLiB2YWxpZCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX0FERFJWICgxVUw8PDU4KSAgLyogYWRkciByZWcuIHZhbGlkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfUENDICAgKDFVTDw8NTcpICAvKiBwcm9jZXNzb3IgY29udGV4dCBjb3JydXB0ICovCisKKy8qIEZpZWxkcyBhcmUgemVybyB3aGVuIG5vdCBhdmFpbGFibGUgKi8KK3N0cnVjdCBtY2UgeworCV9fdTY0IHN0YXR1czsKKwlfX3U2NCBtaXNjOworCV9fdTY0IGFkZHI7CisJX191NjQgbWNnc3RhdHVzOworCV9fdTY0IHJpcDsKKwlfX3U2NCB0c2M7CS8qIGNwdSB0aW1lIHN0YW1wIGNvdW50ZXIgKi8KKwlfX3U2NCByZXMxOwkvKiBmb3IgZnV0dXJlIGV4dGVuc2lvbiAqLworCV9fdTY0IHJlczI7CS8qIGRpdG8uICovCisJX191OCAgY3M7CQkvKiBjb2RlIHNlZ21lbnQgKi8KKwlfX3U4ICBiYW5rOwkvKiBtYWNoaW5lIGNoZWNrIGJhbmsgKi8KKwlfX3U4ICBjcHU7CS8qIGNwdSB0aGF0IHJhaXNlZCB0aGUgZXJyb3IgKi8KKwlfX3U4ICBmaW5pc2hlZDsgICAvKiBlbnRyeSBpcyB2YWxpZCAqLworCV9fdTMyIHBhZDsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgZGF0YSByZWxhdGVkIHRvIHRoZSBNQ0UgbG9nLiAgQWxzbworICogY2FycmllcyBhIHNpZ25hdHVyZSB0byBtYWtlIGl0IGVhc2llciB0byBmaW5kIGZyb20gZXh0ZXJuYWwKKyAqIGRlYnVnZ2luZyB0b29scy4gIEVhY2ggZW50cnkgaXMgb25seSB2YWxpZCB3aGVuIGl0cyBmaW5pc2hlZCBmbGFnCisgKiBpcyBzZXQuCisgKi8KKworI2RlZmluZSBNQ0VfTE9HX0xFTiAzMgorCitzdHJ1Y3QgbWNlX2xvZyB7CisJY2hhciBzaWduYXR1cmVbMTJdOyAvKiAiTUFDSElORUNIRUNLIiAqLworCXVuc2lnbmVkIGxlbjsJICAgIC8qID0gTUNFX0xPR19MRU4gKi8KKwl1bnNpZ25lZCBuZXh0OworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIHBhZDA7CisJc3RydWN0IG1jZSBlbnRyeVtNQ0VfTE9HX0xFTl07Cit9OworCisjZGVmaW5lIE1DRV9PVkVSRkxPVyAwCQkvKiBiaXQgMCBpbiBmbGFncyBtZWFucyBvdmVyZmxvdyAqLworCisjZGVmaW5lIE1DRV9MT0dfU0lHTkFUVVJFCSJNQUNISU5FQ0hFQ0siCisKKyNkZWZpbmUgTUNFX0dFVF9SRUNPUkRfTEVOICAgX0lPUignTScsIDEsIGludCkKKyNkZWZpbmUgTUNFX0dFVF9MT0dfTEVOICAgICAgX0lPUignTScsIDIsIGludCkKKyNkZWZpbmUgTUNFX0dFVENMRUFSX0ZMQUdTICAgX0lPUignTScsIDMsIGludCkKKworLyogU29mdHdhcmUgZGVmaW5lZCBiYW5rcyAqLworI2RlZmluZSBNQ0VfRVhURU5ERURfQkFOSwkxMjgKKyNkZWZpbmUgTUNFX1RIRVJNQUxfQkFOSwlNQ0VfRVhURU5ERURfQkFOSyArIDAKKworI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBU0UgICAgICAoTUNFX0VYVEVOREVEX0JBTksgKyAxKSAgICAgIC8qIE1DRV9BTUQgKi8KKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzAgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDAgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfMSAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgMSAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS18yICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyAyICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9CQU5LXzMgICAgKE1DRV9USFJFU0hPTERfQkFTRSArIDMgKiA5KQorI2RlZmluZSBLOF9NQ0VfVEhSRVNIT0xEX0JBTktfNCAgICAoTUNFX1RIUkVTSE9MRF9CQVNFICsgNCAqIDkpCisjZGVmaW5lIEs4X01DRV9USFJFU0hPTERfQkFOS181ICAgIChNQ0VfVEhSRVNIT0xEX0JBU0UgKyA1ICogOSkKKyNkZWZpbmUgSzhfTUNFX1RIUkVTSE9MRF9EUkFNX0VDQyAgKE1DRV9USFJFU0hPTERfQkFOS180ICsgMCkKKworI2VuZGlmIC8qIF9feDg2XzY0X18gKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21tYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY4MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9YODZfTU1BTl9ICisjZGVmaW5lIF9BU01fWDg2X01NQU5fSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1hbi5oPgorCisjZGVmaW5lIE1BUF8zMkJJVAkweDQwCQkvKiBvbmx5IGdpdmUgb3V0IDMyYml0IGFkZHJlc3NlcyAqLworCisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMTAwCQkvKiBzdGFjay1saWtlIHNlZ21lbnQgKi8KKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAJCS8qIEVUWFRCU1kgKi8KKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCQkvKiBtYXJrIGl0IGFzIGFuIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDIwMDAJCS8qIHBhZ2VzIGFyZSBsb2NrZWQgKi8KKyNkZWZpbmUgTUFQX05PUkVTRVJWRQkweDQwMDAJCS8qIGRvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMgKi8KKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAkJLyogcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdldGFibGVzICovCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDEwMDAwCQkvKiBkbyBub3QgYmxvY2sgb24gSU8gKi8KKworI2RlZmluZSBNQ0xfQ1VSUkVOVAkxCQkvKiBsb2NrIGFsbCBjdXJyZW50IG1hcHBpbmdzICovCisjZGVmaW5lIE1DTF9GVVRVUkUJMgkJLyogbG9jayBhbGwgZnV0dXJlIG1hcHBpbmdzICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9NTUFOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21zZ2J1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vbXNnYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0ZTk0OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX0FTTV9YODZfTVNHQlVGX0gKKyNkZWZpbmUgX0FTTV9YODZfTVNHQlVGX0gKKworLyoKKyAqIFRoZSBtc3FpZDY0X2RzIHN0cnVjdHVyZSBmb3IgaTM4NiBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBvbiBpMzg2IGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqCisgKiBQYWQgc3BhY2Ugb24geDg2NjQgaXMgbGVmdCBmb3I6CisgKiAtIDIgbWlzY2VsbGFuZW91cyA2NC1iaXQgdmFsdWVzCisgKi8KK3N0cnVjdCBtc3FpZDY0X2RzIHsKKwlzdHJ1Y3QgaXBjNjRfcGVybSBtc2dfcGVybTsKKwlfX2tlcm5lbF90aW1lX3QgbXNnX3N0aW1lOwkvKiBsYXN0IG1zZ3NuZCB0aW1lICovCisjaWZkZWYgX19pMzg2X18KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKKyNlbmRpZgorCV9fa2VybmVsX3RpbWVfdCBtc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KKyNpZmRlZiBfX2kzODZfXworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQyOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90IG1zZ19jdGltZTsJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworI2lmZGVmIF9faTM4Nl9fCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nICBtc2dfY2J5dGVzOwkvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcgIG1zZ19xbnVtOwkvKiBudW1iZXIgb2YgbWVzc2FnZXMgaW4gcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nICBtc2dfcWJ5dGVzOwkvKiBtYXggbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisJX19rZXJuZWxfcGlkX3QgbXNnX2xzcGlkOwkvKiBwaWQgb2YgbGFzdCBtc2dzbmQgKi8KKwlfX2tlcm5lbF9waWRfdCBtc2dfbHJwaWQ7CS8qIGxhc3QgcmVjZWl2ZSBwaWQgKi8KKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ1OworfTsKKworI2VuZGlmIC8qIF9BU01fWDg2X01TR0JVRl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21zci1pbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTQ0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaApAQCAtMCwwICsxLDI5MiBAQAorI2lmbmRlZiBfX0FTTV9NU1JfSU5ERVhfSAorI2RlZmluZSBfX0FTTV9NU1JfSU5ERVhfSAorCisvKiBDUFUgbW9kZWwgc3BlY2lmaWMgcmVnaXN0ZXIgKE1TUikgbnVtYmVycyAqLworCisvKiB4ODYtNjQgc3BlY2lmaWMgTVNScyAqLworI2RlZmluZSBNU1JfRUZFUgkJMHhjMDAwMDA4MCAvKiBleHRlbmRlZCBmZWF0dXJlIHJlZ2lzdGVyICovCisjZGVmaW5lIE1TUl9TVEFSCQkweGMwMDAwMDgxIC8qIGxlZ2FjeSBtb2RlIFNZU0NBTEwgdGFyZ2V0ICovCisjZGVmaW5lIE1TUl9MU1RBUgkJMHhjMDAwMDA4MiAvKiBsb25nIG1vZGUgU1lTQ0FMTCB0YXJnZXQgKi8KKyNkZWZpbmUgTVNSX0NTVEFSCQkweGMwMDAwMDgzIC8qIGNvbXBhdCBtb2RlIFNZU0NBTEwgdGFyZ2V0ICovCisjZGVmaW5lIE1TUl9TWVNDQUxMX01BU0sJMHhjMDAwMDA4NCAvKiBFRkxBR1MgbWFzayBmb3Igc3lzY2FsbCAqLworI2RlZmluZSBNU1JfRlNfQkFTRQkJMHhjMDAwMDEwMCAvKiA2NGJpdCBGUyBiYXNlICovCisjZGVmaW5lIE1TUl9HU19CQVNFCQkweGMwMDAwMTAxIC8qIDY0Yml0IEdTIGJhc2UgKi8KKyNkZWZpbmUgTVNSX0tFUk5FTF9HU19CQVNFCTB4YzAwMDAxMDIgLyogU3dhcEdTIEdTIHNoYWRvdyAqLworCisvKiBFRkVSIGJpdHM6ICovCisjZGVmaW5lIF9FRkVSX1NDRQkJMCAgLyogU1lTQ0FMTC9TWVNSRVQgKi8KKyNkZWZpbmUgX0VGRVJfTE1FCQk4ICAvKiBMb25nIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIF9FRkVSX0xNQQkJMTAgLyogTG9uZyBtb2RlIGFjdGl2ZSAocmVhZC1vbmx5KSAqLworI2RlZmluZSBfRUZFUl9OWAkJMTEgLyogTm8gZXhlY3V0ZSBlbmFibGUgKi8KKworI2RlZmluZSBFRkVSX1NDRQkJKDE8PF9FRkVSX1NDRSkKKyNkZWZpbmUgRUZFUl9MTUUJCSgxPDxfRUZFUl9MTUUpCisjZGVmaW5lIEVGRVJfTE1BCQkoMTw8X0VGRVJfTE1BKQorI2RlZmluZSBFRkVSX05YCQkJKDE8PF9FRkVSX05YKQorCisvKiBJbnRlbCBNU1JzLiBTb21lIGFsc28gYXZhaWxhYmxlIG9uIG90aGVyIENQVXMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfUEVSRkNUUjAJCTB4MDAwMDAwYzEKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRkNUUjEJCTB4MDAwMDAwYzIKKyNkZWZpbmUgTVNSX0ZTQl9GUkVRCQkJMHgwMDAwMDBjZAorCisjZGVmaW5lIE1TUl9NVFJSY2FwCQkJMHgwMDAwMDBmZQorI2RlZmluZSBNU1JfSUEzMl9CQkxfQ1JfQ1RMCQkweDAwMDAwMTE5CisKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfQ1MJCTB4MDAwMDAxNzQKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfRVNQCQkweDAwMDAwMTc1CisjZGVmaW5lIE1TUl9JQTMyX1NZU0VOVEVSX0VJUAkJMHgwMDAwMDE3NgorCisjZGVmaW5lIE1TUl9JQTMyX01DR19DQVAJCTB4MDAwMDAxNzkKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX1NUQVRVUwkJMHgwMDAwMDE3YQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfQ1RMCQkweDAwMDAwMTdiCisKKyNkZWZpbmUgTVNSX0lBMzJfUEVCU19FTkFCTEUJCTB4MDAwMDAzZjEKKyNkZWZpbmUgTVNSX0lBMzJfRFNfQVJFQQkJMHgwMDAwMDYwMAorI2RlZmluZSBNU1JfSUEzMl9QRVJGX0NBUEFCSUxJVElFUwkweDAwMDAwMzQ1CisKKyNkZWZpbmUgTVNSX01UUlJmaXg2NEtfMDAwMDAJCTB4MDAwMDAyNTAKKyNkZWZpbmUgTVNSX01UUlJmaXgxNktfODAwMDAJCTB4MDAwMDAyNTgKKyNkZWZpbmUgTVNSX01UUlJmaXgxNktfQTAwMDAJCTB4MDAwMDAyNTkKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19DMDAwMAkJMHgwMDAwMDI2OAorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0M4MDAwCQkweDAwMDAwMjY5CisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRDAwMDAJCTB4MDAwMDAyNmEKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19EODAwMAkJMHgwMDAwMDI2YgorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0UwMDAwCQkweDAwMDAwMjZjCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRTgwMDAJCTB4MDAwMDAyNmQKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19GMDAwMAkJMHgwMDAwMDI2ZQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0Y4MDAwCQkweDAwMDAwMjZmCisjZGVmaW5lIE1TUl9NVFJSZGVmVHlwZQkJCTB4MDAwMDAyZmYKKworI2RlZmluZSBNU1JfSUEzMl9ERUJVR0NUTE1TUgkJMHgwMDAwMDFkOQorI2RlZmluZSBNU1JfSUEzMl9MQVNUQlJBTkNIRlJPTUlQCTB4MDAwMDAxZGIKKyNkZWZpbmUgTVNSX0lBMzJfTEFTVEJSQU5DSFRPSVAJCTB4MDAwMDAxZGMKKyNkZWZpbmUgTVNSX0lBMzJfTEFTVElOVEZST01JUAkJMHgwMDAwMDFkZAorI2RlZmluZSBNU1JfSUEzMl9MQVNUSU5UVE9JUAkJMHgwMDAwMDFkZQorCisjZGVmaW5lIE1TUl9JQTMyX01DMF9DVEwJCTB4MDAwMDA0MDAKKyNkZWZpbmUgTVNSX0lBMzJfTUMwX1NUQVRVUwkJMHgwMDAwMDQwMQorI2RlZmluZSBNU1JfSUEzMl9NQzBfQUREUgkJMHgwMDAwMDQwMgorI2RlZmluZSBNU1JfSUEzMl9NQzBfTUlTQwkJMHgwMDAwMDQwMworCisjZGVmaW5lIE1TUl9QNl9QRVJGQ1RSMAkJCTB4MDAwMDAwYzEKKyNkZWZpbmUgTVNSX1A2X1BFUkZDVFIxCQkJMHgwMDAwMDBjMgorI2RlZmluZSBNU1JfUDZfRVZOVFNFTDAJCQkweDAwMDAwMTg2CisjZGVmaW5lIE1TUl9QNl9FVk5UU0VMMQkJCTB4MDAwMDAxODcKKworLyogQU1ENjQgTVNScy4gTm90IGNvbXBsZXRlLiBTZWUgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgZm9yIGEgbW9yZQorICAgY29tcGxldGUgbGlzdC4gKi8KKworI2RlZmluZSBNU1JfQU1ENjRfSUJTRkVUQ0hDVEwJCTB4YzAwMTEwMzAKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENITElOQUQJCTB4YzAwMTEwMzEKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU0ZFVENIUEhZU0FECTB4YzAwMTEwMzIKKyNkZWZpbmUgTVNSX0FNRDY0X0lCU09QQ1RMCQkweGMwMDExMDMzCisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUFJJUAkJMHhjMDAxMTAzNAorI2RlZmluZSBNU1JfQU1ENjRfSUJTT1BEQVRBCQkweGMwMDExMDM1CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEyCQkweGMwMDExMDM2CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNPUERBVEEzCQkweGMwMDExMDM3CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNEQ0xJTkFECQkweGMwMDExMDM4CisjZGVmaW5lIE1TUl9BTUQ2NF9JQlNEQ1BIWVNBRAkJMHhjMDAxMTAzOQorI2RlZmluZSBNU1JfQU1ENjRfSUJTQ1RMCQkweGMwMDExMDNhCisKKy8qIEs4IE1TUnMgKi8KKyNkZWZpbmUgTVNSX0s4X1RPUF9NRU0xCQkJMHhjMDAxMDAxYQorI2RlZmluZSBNU1JfSzhfVE9QX01FTTIJCQkweGMwMDEwMDFkCisjZGVmaW5lIE1TUl9LOF9TWVNDRkcJCQkweGMwMDEwMDEwCisjZGVmaW5lIE1TUl9LOF9IV0NSCQkJMHhjMDAxMDAxNQorI2RlZmluZSBNU1JfSzhfRU5BQkxFX0MxRQkJMHhjMDAxMDA1NQorI2RlZmluZSBLOF9NVFJSRklYUkFOR0VfRFJBTV9FTkFCTEUJMHgwMDA0MDAwMCAvKiBNdHJyRml4RHJhbUVuIGJpdCAgICAqLworI2RlZmluZSBLOF9NVFJSRklYUkFOR0VfRFJBTV9NT0RJRlkJMHgwMDA4MDAwMCAvKiBNdHJyRml4RHJhbU1vZEVuIGJpdCAqLworI2RlZmluZSBLOF9NVFJSX1JETUVNX1dSTUVNX01BU0sJMHgxODE4MTgxOCAvKiBNYXNrOiBSZE1lbXxXck1lbSAgICAqLworCisvKiBLNyBNU1JzICovCisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMAkJCTB4YzAwMTAwMDAKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIwCQkJMHhjMDAxMDAwNAorI2RlZmluZSBNU1JfSzdfRVZOVFNFTDEJCQkweGMwMDEwMDAxCisjZGVmaW5lIE1TUl9LN19QRVJGQ1RSMQkJCTB4YzAwMTAwMDUKKyNkZWZpbmUgTVNSX0s3X0VWTlRTRUwyCQkJMHhjMDAxMDAwMgorI2RlZmluZSBNU1JfSzdfUEVSRkNUUjIJCQkweGMwMDEwMDA2CisjZGVmaW5lIE1TUl9LN19FVk5UU0VMMwkJCTB4YzAwMTAwMDMKKyNkZWZpbmUgTVNSX0s3X1BFUkZDVFIzCQkJMHhjMDAxMDAwNworI2RlZmluZSBNU1JfSzdfQ0xLX0NUTAkJCTB4YzAwMTAwMWIKKyNkZWZpbmUgTVNSX0s3X0hXQ1IJCQkweGMwMDEwMDE1CisjZGVmaW5lIE1TUl9LN19GSURfVklEX0NUTAkJMHhjMDAxMDA0MQorI2RlZmluZSBNU1JfSzdfRklEX1ZJRF9TVEFUVVMJCTB4YzAwMTAwNDIKKworLyogSzYgTVNScyAqLworI2RlZmluZSBNU1JfSzZfRUZFUgkJCTB4YzAwMDAwODAKKyNkZWZpbmUgTVNSX0s2X1NUQVIJCQkweGMwMDAwMDgxCisjZGVmaW5lIE1TUl9LNl9XSENSCQkJMHhjMDAwMDA4MgorI2RlZmluZSBNU1JfSzZfVVdDQ1IJCQkweGMwMDAwMDg1CisjZGVmaW5lIE1TUl9LNl9FUE1SCQkJMHhjMDAwMDA4NgorI2RlZmluZSBNU1JfSzZfUFNPUgkJCTB4YzAwMDAwODcKKyNkZWZpbmUgTVNSX0s2X1BGSVIJCQkweGMwMDAwMDg4CisKKy8qIENlbnRhdXItSGF1bHMvSURUIGRlZmluZWQgTVNScy4gKi8KKyNkZWZpbmUgTVNSX0lEVF9GQ1IxCQkJMHgwMDAwMDEwNworI2RlZmluZSBNU1JfSURUX0ZDUjIJCQkweDAwMDAwMTA4CisjZGVmaW5lIE1TUl9JRFRfRkNSMwkJCTB4MDAwMDAxMDkKKyNkZWZpbmUgTVNSX0lEVF9GQ1I0CQkJMHgwMDAwMDEwYQorCisjZGVmaW5lIE1TUl9JRFRfTUNSMAkJCTB4MDAwMDAxMTAKKyNkZWZpbmUgTVNSX0lEVF9NQ1IxCQkJMHgwMDAwMDExMQorI2RlZmluZSBNU1JfSURUX01DUjIJCQkweDAwMDAwMTEyCisjZGVmaW5lIE1TUl9JRFRfTUNSMwkJCTB4MDAwMDAxMTMKKyNkZWZpbmUgTVNSX0lEVF9NQ1I0CQkJMHgwMDAwMDExNAorI2RlZmluZSBNU1JfSURUX01DUjUJCQkweDAwMDAwMTE1CisjZGVmaW5lIE1TUl9JRFRfTUNSNgkJCTB4MDAwMDAxMTYKKyNkZWZpbmUgTVNSX0lEVF9NQ1I3CQkJMHgwMDAwMDExNworI2RlZmluZSBNU1JfSURUX01DUl9DVFJMCQkweDAwMDAwMTIwCisKKy8qIFZJQSBDeXJpeCBkZWZpbmVkIE1TUnMqLworI2RlZmluZSBNU1JfVklBX0ZDUgkJCTB4MDAwMDExMDcKKyNkZWZpbmUgTVNSX1ZJQV9MT05HSEFVTAkJMHgwMDAwMTEwYQorI2RlZmluZSBNU1JfVklBX1JORwkJCTB4MDAwMDExMGIKKyNkZWZpbmUgTVNSX1ZJQV9CQ1IyCQkJMHgwMDAwMTE0NworCisvKiBUcmFuc21ldGEgZGVmaW5lZCBNU1JzICovCisjZGVmaW5lIE1TUl9UTVRBX0xPTkdSVU5fQ1RSTAkJMHg4MDg2ODAxMAorI2RlZmluZSBNU1JfVE1UQV9MT05HUlVOX0ZMQUdTCQkweDgwODY4MDExCisjZGVmaW5lIE1TUl9UTVRBX0xSVElfUkVBRE9VVAkJMHg4MDg2ODAxOAorI2RlZmluZSBNU1JfVE1UQV9MUlRJX1ZPTFRfTUhaCQkweDgwODY4MDFhCisKKy8qIEludGVsIGRlZmluZWQgTVNScy4gKi8KKyNkZWZpbmUgTVNSX0lBMzJfUDVfTUNfQUREUgkJMHgwMDAwMDAwMAorI2RlZmluZSBNU1JfSUEzMl9QNV9NQ19UWVBFCQkweDAwMDAwMDAxCisjZGVmaW5lIE1TUl9JQTMyX1RTQwkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTVNSX0lBMzJfUExBVEZPUk1fSUQJCTB4MDAwMDAwMTcKKyNkZWZpbmUgTVNSX0lBMzJfRUJMX0NSX1BPV0VST04JCTB4MDAwMDAwMmEKKworI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRQkJMHgwMDAwMDAxYgorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9CU1AJCSgxPDw4KQorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUJKDE8PDExKQorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRV9CQVNFCQkoMHhmZmZmZjw8MTIpCisKKyNkZWZpbmUgTVNSX0lBMzJfVUNPREVfV1JJVEUJCTB4MDAwMDAwNzkKKyNkZWZpbmUgTVNSX0lBMzJfVUNPREVfUkVWCQkweDAwMDAwMDhiCisKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9TVEFUVVMJCTB4MDAwMDAxOTgKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9DVEwJCTB4MDAwMDAxOTkKKworI2RlZmluZSBNU1JfSUEzMl9NUEVSRgkJCTB4MDAwMDAwZTcKKyNkZWZpbmUgTVNSX0lBMzJfQVBFUkYJCQkweDAwMDAwMGU4CisKKyNkZWZpbmUgTVNSX0lBMzJfVEhFUk1fQ09OVFJPTAkJMHgwMDAwMDE5YQorI2RlZmluZSBNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQJMHgwMDAwMDE5YgorI2RlZmluZSBNU1JfSUEzMl9USEVSTV9TVEFUVVMJCTB4MDAwMDAxOWMKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEUJCTB4MDAwMDAxYTAKKworLyogSW50ZWwgTW9kZWwgNiAqLworI2RlZmluZSBNU1JfUDZfRVZOVFNFTDAJCQkweDAwMDAwMTg2CisjZGVmaW5lIE1TUl9QNl9FVk5UU0VMMQkJCTB4MDAwMDAxODcKKworLyogUDQvWGVvbisgc3BlY2lmaWMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VBWAkJMHgwMDAwMDE4MAorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRUJYCQkweDAwMDAwMTgxCisjZGVmaW5lIE1TUl9JQTMyX01DR19FQ1gJCTB4MDAwMDAxODIKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VEWAkJMHgwMDAwMDE4MworI2RlZmluZSBNU1JfSUEzMl9NQ0dfRVNJCQkweDAwMDAwMTg0CisjZGVmaW5lIE1TUl9JQTMyX01DR19FREkJCTB4MDAwMDAxODUKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VCUAkJMHgwMDAwMDE4NgorI2RlZmluZSBNU1JfSUEzMl9NQ0dfRVNQCQkweDAwMDAwMTg3CisjZGVmaW5lIE1TUl9JQTMyX01DR19FRkxBR1MJCTB4MDAwMDAxODgKKyNkZWZpbmUgTVNSX0lBMzJfTUNHX0VJUAkJMHgwMDAwMDE4OQorI2RlZmluZSBNU1JfSUEzMl9NQ0dfUkVTRVJWRUQJCTB4MDAwMDAxOGEKKworLyogUGVudGl1bSBJViBwZXJmb3JtYW5jZSBjb3VudGVyIE1TUnMgKi8KKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMAkJMHgwMDAwMDMwMAorI2RlZmluZSBNU1JfUDRfQlBVX1BFUkZDVFIxCQkweDAwMDAwMzAxCisjZGVmaW5lIE1TUl9QNF9CUFVfUEVSRkNUUjIJCTB4MDAwMDAzMDIKKyNkZWZpbmUgTVNSX1A0X0JQVV9QRVJGQ1RSMwkJMHgwMDAwMDMwMworI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjAJCTB4MDAwMDAzMDQKKyNkZWZpbmUgTVNSX1A0X01TX1BFUkZDVFIxCQkweDAwMDAwMzA1CisjZGVmaW5lIE1TUl9QNF9NU19QRVJGQ1RSMgkJMHgwMDAwMDMwNgorI2RlZmluZSBNU1JfUDRfTVNfUEVSRkNUUjMJCTB4MDAwMDAzMDcKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIwCQkweDAwMDAwMzA4CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9QRVJGQ1RSMQkJMHgwMDAwMDMwOQorI2RlZmluZSBNU1JfUDRfRkxBTUVfUEVSRkNUUjIJCTB4MDAwMDAzMGEKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX1BFUkZDVFIzCQkweDAwMDAwMzBiCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMAkJMHgwMDAwMDMwYworI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjEJCTB4MDAwMDAzMGQKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFIyCQkweDAwMDAwMzBlCisjZGVmaW5lIE1TUl9QNF9JUV9QRVJGQ1RSMwkJMHgwMDAwMDMwZgorI2RlZmluZSBNU1JfUDRfSVFfUEVSRkNUUjQJCTB4MDAwMDAzMTAKKyNkZWZpbmUgTVNSX1A0X0lRX1BFUkZDVFI1CQkweDAwMDAwMzExCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjAJCTB4MDAwMDAzNjAKKyNkZWZpbmUgTVNSX1A0X0JQVV9DQ0NSMQkJMHgwMDAwMDM2MQorI2RlZmluZSBNU1JfUDRfQlBVX0NDQ1IyCQkweDAwMDAwMzYyCisjZGVmaW5lIE1TUl9QNF9CUFVfQ0NDUjMJCTB4MDAwMDAzNjMKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IwCQkJMHgwMDAwMDM2NAorI2RlZmluZSBNU1JfUDRfTVNfQ0NDUjEJCQkweDAwMDAwMzY1CisjZGVmaW5lIE1TUl9QNF9NU19DQ0NSMgkJCTB4MDAwMDAzNjYKKyNkZWZpbmUgTVNSX1A0X01TX0NDQ1IzCQkJMHgwMDAwMDM2NworI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjAJCTB4MDAwMDAzNjgKKyNkZWZpbmUgTVNSX1A0X0ZMQU1FX0NDQ1IxCQkweDAwMDAwMzY5CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9DQ0NSMgkJMHgwMDAwMDM2YQorI2RlZmluZSBNU1JfUDRfRkxBTUVfQ0NDUjMJCTB4MDAwMDAzNmIKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IwCQkJMHgwMDAwMDM2YworI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjEJCQkweDAwMDAwMzZkCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSMgkJCTB4MDAwMDAzNmUKKyNkZWZpbmUgTVNSX1A0X0lRX0NDQ1IzCQkJMHgwMDAwMDM2ZgorI2RlZmluZSBNU1JfUDRfSVFfQ0NDUjQJCQkweDAwMDAwMzcwCisjZGVmaW5lIE1TUl9QNF9JUV9DQ0NSNQkJCTB4MDAwMDAzNzEKKyNkZWZpbmUgTVNSX1A0X0FMRl9FU0NSMAkJMHgwMDAwMDNjYQorI2RlZmluZSBNU1JfUDRfQUxGX0VTQ1IxCQkweDAwMDAwM2NiCisjZGVmaW5lIE1TUl9QNF9CUFVfRVNDUjAJCTB4MDAwMDAzYjIKKyNkZWZpbmUgTVNSX1A0X0JQVV9FU0NSMQkJMHgwMDAwMDNiMworI2RlZmluZSBNU1JfUDRfQlNVX0VTQ1IwCQkweDAwMDAwM2EwCisjZGVmaW5lIE1TUl9QNF9CU1VfRVNDUjEJCTB4MDAwMDAzYTEKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMAkJMHgwMDAwMDNiOAorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1IxCQkweDAwMDAwM2I5CisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjIJCTB4MDAwMDAzY2MKKyNkZWZpbmUgTVNSX1A0X0NSVV9FU0NSMwkJMHgwMDAwMDNjZAorI2RlZmluZSBNU1JfUDRfQ1JVX0VTQ1I0CQkweDAwMDAwM2UwCisjZGVmaW5lIE1TUl9QNF9DUlVfRVNDUjUJCTB4MDAwMDAzZTEKKyNkZWZpbmUgTVNSX1A0X0RBQ19FU0NSMAkJMHgwMDAwMDNhOAorI2RlZmluZSBNU1JfUDRfREFDX0VTQ1IxCQkweDAwMDAwM2E5CisjZGVmaW5lIE1TUl9QNF9GSVJNX0VTQ1IwCQkweDAwMDAwM2E0CisjZGVmaW5lIE1TUl9QNF9GSVJNX0VTQ1IxCQkweDAwMDAwM2E1CisjZGVmaW5lIE1TUl9QNF9GTEFNRV9FU0NSMAkJMHgwMDAwMDNhNgorI2RlZmluZSBNU1JfUDRfRkxBTUVfRVNDUjEJCTB4MDAwMDAzYTcKKyNkZWZpbmUgTVNSX1A0X0ZTQl9FU0NSMAkJMHgwMDAwMDNhMgorI2RlZmluZSBNU1JfUDRfRlNCX0VTQ1IxCQkweDAwMDAwM2EzCisjZGVmaW5lIE1TUl9QNF9JUV9FU0NSMAkJCTB4MDAwMDAzYmEKKyNkZWZpbmUgTVNSX1A0X0lRX0VTQ1IxCQkJMHgwMDAwMDNiYgorI2RlZmluZSBNU1JfUDRfSVNfRVNDUjAJCQkweDAwMDAwM2I0CisjZGVmaW5lIE1TUl9QNF9JU19FU0NSMQkJCTB4MDAwMDAzYjUKKyNkZWZpbmUgTVNSX1A0X0lUTEJfRVNDUjAJCTB4MDAwMDAzYjYKKyNkZWZpbmUgTVNSX1A0X0lUTEJfRVNDUjEJCTB4MDAwMDAzYjcKKyNkZWZpbmUgTVNSX1A0X0lYX0VTQ1IwCQkJMHgwMDAwMDNjOAorI2RlZmluZSBNU1JfUDRfSVhfRVNDUjEJCQkweDAwMDAwM2M5CisjZGVmaW5lIE1TUl9QNF9NT0JfRVNDUjAJCTB4MDAwMDAzYWEKKyNkZWZpbmUgTVNSX1A0X01PQl9FU0NSMQkJMHgwMDAwMDNhYgorI2RlZmluZSBNU1JfUDRfTVNfRVNDUjAJCQkweDAwMDAwM2MwCisjZGVmaW5lIE1TUl9QNF9NU19FU0NSMQkJCTB4MDAwMDAzYzEKKyNkZWZpbmUgTVNSX1A0X1BNSF9FU0NSMAkJMHgwMDAwMDNhYworI2RlZmluZSBNU1JfUDRfUE1IX0VTQ1IxCQkweDAwMDAwM2FkCisjZGVmaW5lIE1TUl9QNF9SQVRfRVNDUjAJCTB4MDAwMDAzYmMKKyNkZWZpbmUgTVNSX1A0X1JBVF9FU0NSMQkJMHgwMDAwMDNiZAorI2RlZmluZSBNU1JfUDRfU0FBVF9FU0NSMAkJMHgwMDAwMDNhZQorI2RlZmluZSBNU1JfUDRfU0FBVF9FU0NSMQkJMHgwMDAwMDNhZgorI2RlZmluZSBNU1JfUDRfU1NVX0VTQ1IwCQkweDAwMDAwM2JlCisjZGVmaW5lIE1TUl9QNF9TU1VfRVNDUjEJCTB4MDAwMDAzYmYgLyogZ3Vlc3M6IG5vdCBpbiBtYW51YWwgKi8KKworI2RlZmluZSBNU1JfUDRfVEJQVV9FU0NSMAkJMHgwMDAwMDNjMgorI2RlZmluZSBNU1JfUDRfVEJQVV9FU0NSMQkJMHgwMDAwMDNjMworI2RlZmluZSBNU1JfUDRfVENfRVNDUjAJCQkweDAwMDAwM2M0CisjZGVmaW5lIE1TUl9QNF9UQ19FU0NSMQkJCTB4MDAwMDAzYzUKKyNkZWZpbmUgTVNSX1A0X1UyTF9FU0NSMAkJMHgwMDAwMDNiMAorI2RlZmluZSBNU1JfUDRfVTJMX0VTQ1IxCQkweDAwMDAwM2IxCisKKy8qIEludGVsIENvcmUtYmFzZWQgQ1BVIHBlcmZvcm1hbmNlIGNvdW50ZXJzICovCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMAkweDAwMDAwMzA5CisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMQkweDAwMDAwMzBhCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMgkweDAwMDAwMzBiCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSX0NUUkwJMHgwMDAwMDM4ZAorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMJMHgwMDAwMDM4ZQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMCTB4MDAwMDAzOGYKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwJMHgwMDAwMDM5MAorCisvKiBHZW9kZSBkZWZpbmVkIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0dFT0RFX0JVU0NPTlRfQ09ORjAJCTB4MDAwMDE5MDAKKworI2VuZGlmIC8qIF9fQVNNX01TUl9JTkRFWF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9tc3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL21zci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjExZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9tc3IuaApAQCAtMCwwICsxLDE0NSBAQAorI2lmbmRlZiBfX0FTTV9YODZfTVNSX0hfCisjZGVmaW5lIF9fQVNNX1g4Nl9NU1JfSF8KKworI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyMgaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KKworCisjZWxzZSAgIC8qIF9faTM4Nl9fICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKy8qCisgKiBBY2Nlc3MgdG8gbWFjaGluZS1zcGVjaWZpYyByZWdpc3RlcnMgKGF2YWlsYWJsZSBvbiA1ODYgYW5kIGJldHRlciBvbmx5KQorICogTm90ZTogdGhlIHJkKiBvcGVyYXRpb25zIG1vZGlmeSB0aGUgcGFyYW1ldGVycyBkaXJlY3RseSAod2l0aG91dCB1c2luZworICogcG9pbnRlciBpbmRpcmVjdGlvbiksIHRoaXMgYWxsb3dzIGdjYyB0byBvcHRpbWl6ZSBiZXR0ZXIKKyAqLworCisjZGVmaW5lIHJkbXNyKG1zcix2YWwxLHZhbDIpIFwKKyAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRtc3IiIFwKKwkJCSAgICA6ICI9YSIgKHZhbDEpLCAiPWQiICh2YWwyKSBcCisJCQkgICAgOiAiYyIgKG1zcikpCisKKworI2RlZmluZSByZG1zcmwobXNyLHZhbCkgZG8geyB1bnNpZ25lZCBsb25nIGFfXyxiX187IFwKKyAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicmRtc3IiIFwKKwkJCSAgICA6ICI9YSIgKGFfXyksICI9ZCIgKGJfXykgXAorCQkJICAgIDogImMiIChtc3IpKTsgXAorICAgICAgIHZhbCA9IGFfXyB8IChiX188PDMyKTsgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIHdybXNyKG1zcix2YWwxLHZhbDIpIFwKKyAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIndybXNyIiBcCisJCQkgIDogLyogbm8gb3V0cHV0cyAqLyBcCisJCQkgIDogImMiIChtc3IpLCAiYSIgKHZhbDEpLCAiZCIgKHZhbDIpKQorCisjZGVmaW5lIHdybXNybChtc3IsdmFsKSB3cm1zcihtc3IsKF9fdTMyKSgoX191NjQpKHZhbCkpLCgoX191NjQpKHZhbCkpPj4zMikKKworI2RlZmluZSByZHRzYyhsb3csaGlnaCkgXAorICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicmR0c2MiIDogIj1hIiAobG93KSwgIj1kIiAoaGlnaCkpCisKKyNkZWZpbmUgcmR0c2NsKGxvdykgXAorICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJkdHNjIiA6ICI9YSIgKGxvdykgOiA6ICJlZHgiKQorCisjZGVmaW5lIHJkdHNjcChsb3csaGlnaCxhdXgpIFwKKyAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIuYnl0ZSAweDBmLDB4MDEsMHhmOSIgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSwgIj1jIiAoYXV4KSkKKworI2RlZmluZSByZHRzY2xsKHZhbCkgZG8geyBcCisgICAgIHVuc2lnbmVkIGludCBfX2EsX19kOyBcCisgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHRzYyIgOiAiPWEiIChfX2EpLCAiPWQiIChfX2QpKTsgXAorICAgICAodmFsKSA9ICgodW5zaWduZWQgbG9uZylfX2EpIHwgKCgodW5zaWduZWQgbG9uZylfX2QpPDwzMik7IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSByZHRzY3BsbCh2YWwsIGF1eCkgZG8geyBcCisgICAgIHVuc2lnbmVkIGxvbmcgX19hLCBfX2Q7IFwKKyAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIuYnl0ZSAweDBmLDB4MDEsMHhmOSIgOiAiPWEiIChfX2EpLCAiPWQiIChfX2QpLCAiPWMiIChhdXgpKTsgXAorICAgICAodmFsKSA9IChfX2QgPDwgMzIpIHwgX19hOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHdyaXRlX3RzYyh2YWwxLHZhbDIpIHdybXNyKDB4MTAsIHZhbDEsIHZhbDIpCisKKyNkZWZpbmUgd3JpdGVfcmR0c2NwX2F1eCh2YWwpIHdybXNyKDB4YzAwMDAxMDMsIHZhbCwgMCkKKworI2RlZmluZSByZHBtYyhjb3VudGVyLGxvdyxoaWdoKSBcCisgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHBtYyIgXAorCQkJICA6ICI9YSIgKGxvdyksICI9ZCIgKGhpZ2gpIFwKKwkJCSAgOiAiYyIgKGNvdW50ZXIpKQorCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY3B1aWQoaW50IG9wLCB1bnNpZ25lZCBpbnQgKmVheCwgdW5zaWduZWQgaW50ICplYngsCisJCQkgdW5zaWduZWQgaW50ICplY3gsIHVuc2lnbmVkIGludCAqZWR4KQoreworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKCplYXgpLAorCQkgICI9YiIgKCplYngpLAorCQkgICI9YyIgKCplY3gpLAorCQkgICI9ZCIgKCplZHgpCisJCTogIjAiIChvcCkpOworfQorCisvKiBTb21lIENQVUlEIGNhbGxzIHdhbnQgJ2NvdW50JyB0byBiZSBwbGFjZWQgaW4gZWN4ICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNwdWlkX2NvdW50KGludCBvcCwgaW50IGNvdW50LCBpbnQgKmVheCwgaW50ICplYngsIGludCAqZWN4LAorCQkJICAgICAgIGludCAqZWR4KQoreworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKCplYXgpLAorCQkgICI9YiIgKCplYngpLAorCQkgICI9YyIgKCplY3gpLAorCQkgICI9ZCIgKCplZHgpCisJCTogIjAiIChvcCksICJjIiAoY291bnQpKTsKK30KKworLyoKKyAqIENQVUlEIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBzaW5nbGUgZGF0dW0KKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNwdWlkX2VheCh1bnNpZ25lZCBpbnQgb3ApCit7CisJdW5zaWduZWQgaW50IGVheDsKKworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKGVheCkKKwkJOiAiMCIgKG9wKQorCQk6ICJieCIsICJjeCIsICJkeCIpOworCXJldHVybiBlYXg7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgY3B1aWRfZWJ4KHVuc2lnbmVkIGludCBvcCkKK3sKKwl1bnNpZ25lZCBpbnQgZWF4LCBlYng7CisKKwlfX2FzbV9fKCJjcHVpZCIKKwkJOiAiPWEiIChlYXgpLCAiPWIiIChlYngpCisJCTogIjAiIChvcCkKKwkJOiAiY3giLCAiZHgiICk7CisJcmV0dXJuIGVieDsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjcHVpZF9lY3godW5zaWduZWQgaW50IG9wKQoreworCXVuc2lnbmVkIGludCBlYXgsIGVjeDsKKworCV9fYXNtX18oImNwdWlkIgorCQk6ICI9YSIgKGVheCksICI9YyIgKGVjeCkKKwkJOiAiMCIgKG9wKQorCQk6ICJieCIsICJkeCIgKTsKKwlyZXR1cm4gZWN4OworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNwdWlkX2VkeCh1bnNpZ25lZCBpbnQgb3ApCit7CisJdW5zaWduZWQgaW50IGVheCwgZWR4OworCisJX19hc21fXygiY3B1aWQiCisJCTogIj1hIiAoZWF4KSwgIj1kIiAoZWR4KQorCQk6ICIwIiAob3ApCisJCTogImJ4IiwgImN4Iik7CisJcmV0dXJuIGVkeDsKK30KKworI2VuZGlmICAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmICAvKiAhX19pMzg2X18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9tdHJyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9tdHJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzOGFjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL210cnIuaApAQCAtMCwwICsxLDg2IEBACisvKiAgR2VuZXJpYyBNVFJSIChNZW1vcnkgVHlwZSBSYW5nZSBSZWdpc3RlcikgaW9jdGxzLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgIFJpY2hhcmQgR29vY2gKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisgICAgUmljaGFyZCBHb29jaCBtYXkgYmUgcmVhY2hlZCBieSBlbWFpbCBhdCAgcmdvb2NoQGF0bmYuY3Npcm8uYXUKKyAgICBUaGUgcG9zdGFsIGFkZHJlc3MgaXM6CisgICAgICBSaWNoYXJkIEdvb2NoLCBjL28gQVRORiwgUC4gTy4gQm94IDc2LCBFcHBpbmcsIE4uUy5XLiwgMjEyMSwgQXVzdHJhbGlhLgorKi8KKyNpZm5kZWYgX0FTTV9YODZfTVRSUl9ICisjZGVmaW5lIF9BU01fWDg2X01UUlJfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjZGVmaW5lCU1UUlJfSU9DVExfQkFTRQknTScKKworc3RydWN0IG10cnJfc2VudHJ5Cit7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAvKiAgQmFzZSBhZGRyZXNzICAgICAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAvKiAgU2l6ZSBvZiByZWdpb24gICAqLworICAgIHVuc2lnbmVkIGludCB0eXBlOyAgICAgLyogIFR5cGUgb2YgcmVnaW9uICAgKi8KK307CisKKy8qIFdhcm5pbmc6IHRoaXMgc3RydWN0dXJlIGhhcyBhIGRpZmZlcmVudCBvcmRlciBmcm9tIGkzODYKKyAgIG9uIHg4Ni02NC4gVGhlIDMyYml0IGVtdWxhdGlvbiBjb2RlIHRha2VzIGNhcmUgb2YgdGhhdC4KKyAgIEJ1dCB5b3UgbmVlZCB0byB1c2UgdGhpcyBmb3IgNjRiaXQsIG90aGVyd2lzZSB5b3VyIFggc2VydmVyCisgICB3aWxsIGJyZWFrLiAqLworCisjaWZkZWYgX19pMzg2X18KK3N0cnVjdCBtdHJyX2dlbnRyeQoreworICAgIHVuc2lnbmVkIGludCByZWdudW07ICAgLyogIFJlZ2lzdGVyIG51bWJlciAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJhc2U7ICAgIC8qICBCYXNlIGFkZHJlc3MgICAgICovCisgICAgdW5zaWduZWQgaW50IHNpemU7ICAgIC8qICBTaXplIG9mIHJlZ2lvbiAgICovCisgICAgdW5zaWduZWQgaW50IHR5cGU7ICAgICAvKiAgVHlwZSBvZiByZWdpb24gICAqLworfTsKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworc3RydWN0IG10cnJfZ2VudHJ5Cit7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlOyAgICAvKiAgQmFzZSBhZGRyZXNzICAgICAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAgICAvKiAgU2l6ZSBvZiByZWdpb24gICAqLworICAgIHVuc2lnbmVkIGludCByZWdudW07ICAgLyogIFJlZ2lzdGVyIG51bWJlciAgKi8KKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsgICAgIC8qICBUeXBlIG9mIHJlZ2lvbiAgICovCit9OworI2VuZGlmIC8qICFfX2kzODZfXyAqLworCisvKiAgVGhlc2UgYXJlIHRoZSB2YXJpb3VzIGlvY3RscyAgKi8KKyNkZWZpbmUgTVRSUklPQ19BRERfRU5UUlkgICAgICAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgMCwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX1NFVF9FTlRSWSAgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICAxLCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfREVMX0VOVFJZICAgICAgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDIsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19HRVRfRU5UUlkgICAgICAgIF9JT1dSKE1UUlJfSU9DVExfQkFTRSwgMywgc3RydWN0IG10cnJfZ2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0tJTExfRU5UUlkgICAgICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA0LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfQUREX1BBR0VfRU5UUlkgICBfSU9XKE1UUlJfSU9DVExfQkFTRSwgIDUsIHN0cnVjdCBtdHJyX3NlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19TRVRfUEFHRV9FTlRSWSAgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgNiwgc3RydWN0IG10cnJfc2VudHJ5KQorI2RlZmluZSBNVFJSSU9DX0RFTF9QQUdFX0VOVFJZICAgX0lPVyhNVFJSX0lPQ1RMX0JBU0UsICA3LCBzdHJ1Y3QgbXRycl9zZW50cnkpCisjZGVmaW5lIE1UUlJJT0NfR0VUX1BBR0VfRU5UUlkgICBfSU9XUihNVFJSX0lPQ1RMX0JBU0UsIDgsIHN0cnVjdCBtdHJyX2dlbnRyeSkKKyNkZWZpbmUgTVRSUklPQ19LSUxMX1BBR0VfRU5UUlkgIF9JT1coTVRSUl9JT0NUTF9CQVNFLCAgOSwgc3RydWN0IG10cnJfc2VudHJ5KQorCisvKiAgVGhlc2UgYXJlIHRoZSByZWdpb24gdHlwZXMgICovCisjZGVmaW5lIE1UUlJfVFlQRV9VTkNBQ0hBQkxFIDAKKyNkZWZpbmUgTVRSUl9UWVBFX1dSQ09NQiAgICAgMQorLyojZGVmaW5lIE1UUlJfVFlQRV8gICAgICAgICAyKi8KKy8qI2RlZmluZSBNVFJSX1RZUEVfICAgICAgICAgMyovCisjZGVmaW5lIE1UUlJfVFlQRV9XUlRIUk9VR0ggIDQKKyNkZWZpbmUgTVRSUl9UWVBFX1dSUFJPVCAgICAgNQorI2RlZmluZSBNVFJSX1RZUEVfV1JCQUNLICAgICA2CisjZGVmaW5lIE1UUlJfTlVNX1RZUEVTICAgICAgIDcKKworCisjZW5kaWYgIC8qICBfQVNNX1g4Nl9NVFJSX0ggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wYWdlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNGFhYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMCwwICsxLDUgQEAKKyMgaWZkZWYgX19pMzg2X18KKyMgIGluY2x1ZGUgInBhZ2VfMzIuaCIKKyMgZWxzZQorIyAgaW5jbHVkZSAicGFnZV82NC5oIgorIyBlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcGFnZV8zMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcGFnZV8zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmQzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wYWdlXzMyLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfSTM4Nl9QQUdFX0gKKyNkZWZpbmUgX0kzODZfUEFHRV9ICisKKy8qIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFBBR0VfU0hJRlQJMTIKKyNkZWZpbmUgUEFHRV9TSVpFCSgxVUwgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgUEFHRV9NQVNLCSh+KFBBR0VfU0laRS0xKSkKKworI2RlZmluZSBMQVJHRV9QQUdFX01BU0sgKH4oTEFSR0VfUEFHRV9TSVpFLTEpKQorI2RlZmluZSBMQVJHRV9QQUdFX1NJWkUgKDFVTCA8PCBQTURfU0hJRlQpCisKKworI2VuZGlmIC8qIF9JMzg2X1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcGFnZV82NC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcGFnZV82NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTNjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBfWDg2XzY0X1BBR0VfSAorI2RlZmluZSBfWDg2XzY0X1BBR0VfSAorCisjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKworLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgUEFHRV9TSElGVAkxMgorI2RlZmluZSBQQUdFX1NJWkUJKF9BQygxLFVMKSA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX01BU0sJKH4oUEFHRV9TSVpFLTEpKQorI2RlZmluZSBQSFlTSUNBTF9QQUdFX01BU0sJKH4oUEFHRV9TSVpFLTEpICYgX19QSFlTSUNBTF9NQVNLKQorCisjZGVmaW5lIFRIUkVBRF9PUkRFUiAxIAorI2RlZmluZSBUSFJFQURfU0laRSAgKFBBR0VfU0laRSA8PCBUSFJFQURfT1JERVIpCisjZGVmaW5lIENVUlJFTlRfTUFTSyAofihUSFJFQURfU0laRS0xKSkKKworI2RlZmluZSBFWENFUFRJT05fU1RBQ0tfT1JERVIgMAorI2RlZmluZSBFWENFUFRJT05fU1RLU1ogKFBBR0VfU0laRSA8PCBFWENFUFRJT05fU1RBQ0tfT1JERVIpCisKKyNkZWZpbmUgREVCVUdfU1RBQ0tfT1JERVIgKEVYQ0VQVElPTl9TVEFDS19PUkRFUiArIDEpCisjZGVmaW5lIERFQlVHX1NUS1NaIChQQUdFX1NJWkUgPDwgREVCVUdfU1RBQ0tfT1JERVIpCisKKyNkZWZpbmUgSVJRU1RBQ0tfT1JERVIgMgorI2RlZmluZSBJUlFTVEFDS1NJWkUgKFBBR0VfU0laRSA8PCBJUlFTVEFDS19PUkRFUikKKworI2RlZmluZSBTVEFDS0ZBVUxUX1NUQUNLIDEKKyNkZWZpbmUgRE9VQkxFRkFVTFRfU1RBQ0sgMgorI2RlZmluZSBOTUlfU1RBQ0sgMworI2RlZmluZSBERUJVR19TVEFDSyA0CisjZGVmaW5lIE1DRV9TVEFDSyA1CisjZGVmaW5lIE5fRVhDRVBUSU9OX1NUQUNLUyA1ICAvKiBodyBsaW1pdDogNyAqLworCisjZGVmaW5lIExBUkdFX1BBR0VfTUFTSyAofihMQVJHRV9QQUdFX1NJWkUtMSkpCisjZGVmaW5lIExBUkdFX1BBR0VfU0laRSAoX0FDKDEsVUwpIDw8IFBNRF9TSElGVCkKKworI2RlZmluZSBIUEFHRV9TSElGVCBQTURfU0hJRlQKKyNkZWZpbmUgSFBBR0VfU0laRQkoX0FDKDEsVUwpIDw8IEhQQUdFX1NISUZUKQorI2RlZmluZSBIUEFHRV9NQVNLCSh+KEhQQUdFX1NJWkUgLSAxKSkKKyNkZWZpbmUgSFVHRVRMQl9QQUdFX09SREVSCShIUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpCisKKworI2VuZGlmIC8qIF9YODZfNjRfUEFHRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wYXJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGZlZjBiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcGFyYW0uaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9BU01fWDg2X1BBUkFNX0gKKyNkZWZpbmUgX0FTTV9YODZfUEFSQU1fSAorCisKKyNpZm5kZWYgSFoKKyNkZWZpbmUgSFogMTAwCisjZW5kaWYKKworI2RlZmluZSBFWEVDX1BBR0VTSVpFCTQwOTYKKworI2lmbmRlZiBOT0dST1VQCisjZGVmaW5lIE5PR1JPVVAJCSgtMSkKKyNlbmRpZgorCisjZGVmaW5lIE1BWEhPU1ROQU1FTEVOCTY0CS8qIG1heCBsZW5ndGggb2YgaG9zdG5hbWUgKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3BvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg1MDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcG9sbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDIxNjAwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDUgQEAKKyMgaWZkZWYgX19pMzg2X18KKyMgIGluY2x1ZGUgInBvc2l4X3R5cGVzXzMyLmgiCisjIGVsc2UKKyMgIGluY2x1ZGUgInBvc2l4X3R5cGVzXzY0LmgiCisjIGVuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wb3NpeF90eXBlc18zMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNlMzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfMzIuaApAQCAtMCwwICsxLDgyIEBACisjaWZuZGVmIF9fQVJDSF9JMzg2X1BPU0lYX1RZUEVTX0gKKyNkZWZpbmUgX19BUkNIX0kzODZfUE9TSVhfVFlQRVNfSAorCisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90CisgKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3B0cmRpZmZfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfdGltZV90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9zdXNlY29uZHNfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfY2xvY2tfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF90aW1lcl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2Nsb2NraWRfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9kYWRkcl90OwordHlwZWRlZiBjaGFyICoJCV9fa2VybmVsX2NhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2dpZDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX2Rldl90OworCisjaWZkZWYgX19HTlVDX18KK3R5cGVkZWYgbG9uZyBsb25nCV9fa2VybmVsX2xvZmZfdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fVVNFX0FMTCkKKwlpbnQJdmFsWzJdOworI2Vsc2UgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLworCWludAlfX3ZhbFsyXTsKKyNlbmRpZiAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCit9IF9fa2VybmVsX2ZzaWRfdDsKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKKworI3VuZGVmCV9fRkRfU0VUCisjZGVmaW5lIF9fRkRfU0VUKGZkLGZkc2V0cCkgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiYnRzbCAlMSwlMCI6IFwKKwkJCSIrbSIgKCooX19rZXJuZWxfZmRfc2V0ICopIChmZHNldHApKToiciIgKChpbnQpIChmZCkpKQorCisjdW5kZWYJX19GRF9DTFIKKyNkZWZpbmUgX19GRF9DTFIoZmQsZmRzZXRwKSBcCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJidHJsICUxLCUwIjogXAorCQkJIittIiAoKihfX2tlcm5lbF9mZF9zZXQgKikgKGZkc2V0cCkpOiJyIiAoKGludCkgKGZkKSkpCisKKyN1bmRlZglfX0ZEX0lTU0VUCisjZGVmaW5lIF9fRkRfSVNTRVQoZmQsZmRzZXRwKSAoX19leHRlbnNpb25fXyAoeyBcCisJCXVuc2lnbmVkIGNoYXIgX19yZXN1bHQ7IFwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oImJ0bCAlMSwlMiA7IHNldGIgJTAiIFwKKwkJCToiPXEiIChfX3Jlc3VsdCkgOiJyIiAoKGludCkgKGZkKSksIFwKKwkJCSJtIiAoKihfX2tlcm5lbF9mZF9zZXQgKikgKGZkc2V0cCkpKTsgXAorCQlfX3Jlc3VsdDsgfSkpCisKKyN1bmRlZglfX0ZEX1pFUk8KKyNkZWZpbmUgX19GRF9aRVJPKGZkc2V0cCkgXAorZG8geyBcCisJaW50IF9fZDAsIF9fZDE7IFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2xkIDsgcmVwIDsgc3Rvc2wiIFwKKwkJCToiPW0iICgqKF9fa2VybmVsX2ZkX3NldCAqKSAoZmRzZXRwKSksIFwKKwkJCSAgIj0mYyIgKF9fZDApLCAiPSZEIiAoX19kMSkgXAorCQkJOiJhIiAoMCksICIxIiAoX19GRFNFVF9MT05HUyksIFwKKwkJCSIyIiAoKF9fa2VybmVsX2ZkX3NldCAqKSAoZmRzZXRwKSkgOiAibWVtb3J5Iik7IFwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXNfNjQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNjkxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzXzY0LmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfQVNNX1g4Nl82NF9QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9BU01fWDg2XzY0X1BPU0lYX1RZUEVTX0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9ubGlua190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9vZmZfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgaW50CQlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3RpbWVyX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwlfX2tlcm5lbF9sb2ZmX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAl2YWxbMl07Cit9IF9fa2VybmVsX2ZzaWRfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX2tlcm5lbF9vbGRfdWlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fa2VybmVsX29sZF9naWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QgX19rZXJuZWxfdWlkMzJfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QgX19rZXJuZWxfZ2lkMzJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX29sZF9kZXZfdDsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3ByY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wcmN0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTUyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wcmN0bC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgWDg2XzY0X1BSQ1RMX0gKKyNkZWZpbmUgWDg2XzY0X1BSQ1RMX0ggMQorCisjZGVmaW5lIEFSQ0hfU0VUX0dTIDB4MTAwMQorI2RlZmluZSBBUkNIX1NFVF9GUyAweDEwMDIKKyNkZWZpbmUgQVJDSF9HRVRfRlMgMHgxMDAzCisjZGVmaW5lIEFSQ0hfR0VUX0dTIDB4MTAwNAorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcHRyYWNlLWFiaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vcHRyYWNlLWFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjRlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wdHJhY2UtYWJpLmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9QVFJBQ0VfQUJJX0gKKyNkZWZpbmUgX0FTTV9YODZfUFRSQUNFX0FCSV9ICisKKyNpZmRlZiBfX2kzODZfXworCisjZGVmaW5lIEVCWCAwCisjZGVmaW5lIEVDWCAxCisjZGVmaW5lIEVEWCAyCisjZGVmaW5lIEVTSSAzCisjZGVmaW5lIEVESSA0CisjZGVmaW5lIEVCUCA1CisjZGVmaW5lIEVBWCA2CisjZGVmaW5lIERTIDcKKyNkZWZpbmUgRVMgOAorI2RlZmluZSBGUyA5CisjZGVmaW5lIEdTIDEwCisjZGVmaW5lIE9SSUdfRUFYIDExCisjZGVmaW5lIEVJUCAxMgorI2RlZmluZSBDUyAgMTMKKyNkZWZpbmUgRUZMIDE0CisjZGVmaW5lIFVFU1AgMTUKKyNkZWZpbmUgU1MgICAxNgorI2RlZmluZSBGUkFNRV9TSVpFIDE3CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKKyNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykgfHwgZGVmaW5lZChfX0ZSQU1FX09GRlNFVFMpCisjZGVmaW5lIFIxNSAwCisjZGVmaW5lIFIxNCA4CisjZGVmaW5lIFIxMyAxNgorI2RlZmluZSBSMTIgMjQKKyNkZWZpbmUgUkJQIDMyCisjZGVmaW5lIFJCWCA0MAorLyogYXJndW1lbnRzOiBpbnRlcnJ1cHRzL25vbiB0cmFjaW5nIHN5c2NhbGxzIG9ubHkgc2F2ZSB1cHRvIGhlcmUqLworI2RlZmluZSBSMTEgNDgKKyNkZWZpbmUgUjEwIDU2CisjZGVmaW5lIFI5IDY0CisjZGVmaW5lIFI4IDcyCisjZGVmaW5lIFJBWCA4MAorI2RlZmluZSBSQ1ggODgKKyNkZWZpbmUgUkRYIDk2CisjZGVmaW5lIFJTSSAxMDQKKyNkZWZpbmUgUkRJIDExMgorI2RlZmluZSBPUklHX1JBWCAxMjAgICAgICAgLyogPSBFUlJPUiAqLworLyogZW5kIG9mIGFyZ3VtZW50cyAqLworLyogY3B1IGV4Y2VwdGlvbiBmcmFtZSBvciB1bmRlZmluZWQgaW4gY2FzZSBvZiBmYXN0IHN5c2NhbGwuICovCisjZGVmaW5lIFJJUCAxMjgKKyNkZWZpbmUgQ1MgMTM2CisjZGVmaW5lIEVGTEFHUyAxNDQKKyNkZWZpbmUgUlNQIDE1MgorI2RlZmluZSBTUyAxNjAKKyNkZWZpbmUgQVJHT0ZGU0VUIFIxMQorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKiB0b3Agb2Ygc3RhY2sgcGFnZSAqLworI2RlZmluZSBGUkFNRV9TSVpFIDE2OAorCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKKy8qIEFyYml0cmFyaWx5IGNob29zZSB0aGUgc2FtZSBwdHJhY2UgbnVtYmVycyBhcyB1c2VkIGJ5IHRoZSBTcGFyYyBjb2RlLiAqLworI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKKyNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNAorI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTICAgICAgICAgIDE1CisjZGVmaW5lIFBUUkFDRV9HRVRGUFhSRUdTICAgICAgICAgMTgKKyNkZWZpbmUgUFRSQUNFX1NFVEZQWFJFR1MgICAgICAgICAxOQorCisjZGVmaW5lIFBUUkFDRV9PTERTRVRPUFRJT05TICAgICAgMjEKKworLyogb25seSB1c2VmdWwgZm9yIGFjY2VzcyAzMmJpdCBwcm9ncmFtcyAvIGtlcm5lbHMgKi8KKyNkZWZpbmUgUFRSQUNFX0dFVF9USFJFQURfQVJFQSAgICAyNQorI2RlZmluZSBQVFJBQ0VfU0VUX1RIUkVBRF9BUkVBICAgIDI2CisKKyNpZmRlZiBfX3g4Nl82NF9fCisjIGRlZmluZSBQVFJBQ0VfQVJDSF9QUkNUTAkgIDMwCisjZWxzZQorIyBkZWZpbmUgUFRSQUNFX1NZU0VNVQkJICAzMQorIyBkZWZpbmUgUFRSQUNFX1NZU0VNVV9TSU5HTEVTVEVQIDMyCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWI1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9BU01fWDg2X1BUUkFDRV9ICisjZGVmaW5lIF9BU01fWDg2X1BUUkFDRV9ICisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLWFiaS5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgX19pMzg2X18KKy8qIHRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCisgICBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbC4gKi8KKworc3RydWN0IHB0X3JlZ3MgeworCWxvbmcgZWJ4OworCWxvbmcgZWN4OworCWxvbmcgZWR4OworCWxvbmcgZXNpOworCWxvbmcgZWRpOworCWxvbmcgZWJwOworCWxvbmcgZWF4OworCWludCAgeGRzOworCWludCAgeGVzOworCWludCAgeGZzOworCS8qIGludCAgeGdzOyAqLworCWxvbmcgb3JpZ19lYXg7CisJbG9uZyBlaXA7CisJaW50ICB4Y3M7CisJbG9uZyBlZmxhZ3M7CisJbG9uZyBlc3A7CisJaW50ICB4c3M7Cit9OworCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBwdF9yZWdzIHsKKwl1bnNpZ25lZCBsb25nIHIxNTsKKwl1bnNpZ25lZCBsb25nIHIxNDsKKwl1bnNpZ25lZCBsb25nIHIxMzsKKwl1bnNpZ25lZCBsb25nIHIxMjsKKwl1bnNpZ25lZCBsb25nIHJicDsKKwl1bnNpZ25lZCBsb25nIHJieDsKKy8qIGFyZ3VtZW50czogbm9uIGludGVycnVwdHMvbm9uIHRyYWNpbmcgc3lzY2FsbHMgb25seSBzYXZlIHVwdG8gaGVyZSovCisJdW5zaWduZWQgbG9uZyByMTE7CisJdW5zaWduZWQgbG9uZyByMTA7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHI4OworCXVuc2lnbmVkIGxvbmcgcmF4OworCXVuc2lnbmVkIGxvbmcgcmN4OworCXVuc2lnbmVkIGxvbmcgcmR4OworCXVuc2lnbmVkIGxvbmcgcnNpOworCXVuc2lnbmVkIGxvbmcgcmRpOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yYXg7CisvKiBlbmQgb2YgYXJndW1lbnRzICovCisvKiBjcHUgZXhjZXB0aW9uIGZyYW1lIG9yIHVuZGVmaW5lZCAqLworCXVuc2lnbmVkIGxvbmcgcmlwOworCXVuc2lnbmVkIGxvbmcgY3M7CisJdW5zaWduZWQgbG9uZyBlZmxhZ3M7CisJdW5zaWduZWQgbG9uZyByc3A7CisJdW5zaWduZWQgbG9uZyBzczsKKy8qIHRvcCBvZiBzdGFjayBwYWdlICovCit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3Jlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmM0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9yZXNvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc2VtYnVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zZW1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTUwYzgwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc2VtYnVmLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TRU1CVUZfSAorI2RlZmluZSBfQVNNX1g4Nl9TRU1CVUZfSAorCisvKgorICogVGhlIHNlbWlkNjRfZHMgc3RydWN0dXJlIGZvciB4ODYgYXJjaGl0ZWN0dXJlLgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDY0LWJpdCB0aW1lX3QgdG8gc29sdmUgeTIwMzggcHJvYmxlbQorICogLSAyIG1pc2NlbGxhbmVvdXMgMzItYml0IHZhbHVlcworICovCitzdHJ1Y3Qgc2VtaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0gc2VtX3Blcm07CS8qIHBlcm1pc3Npb25zIC4uIHNlZSBpcGMuaCAqLworCV9fa2VybmVsX3RpbWVfdAlzZW1fb3RpbWU7CS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nCXNlbV9uc2VtczsJLyogbm8uIG9mIHNlbWFwaG9yZXMgaW4gYXJyYXkgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc2V0dXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NldHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMzZjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9BU01fWDg2X1NFVFVQX0gKKyNkZWZpbmUgX0FTTV9YODZfU0VUVVBfSAorCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDIwNDgKKworCisjZW5kaWYgLyogX0FTTV9YODZfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc2htYnVmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaG1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE0MTNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc2htYnVmLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSE1CVUZfSAorI2RlZmluZSBfQVNNX1g4Nl9TSE1CVUZfSAorCisvKgorICogVGhlIHNobWlkNjRfZHMgc3RydWN0dXJlIGZvciB4ODYgYXJjaGl0ZWN0dXJlLgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBQYWQgc3BhY2Ugb24gMzIgYml0IGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqCisgKiBQYWQgc3BhY2Ugb24gNjQgYml0IGlzIGxlZnQgZm9yOgorICogLSAyIG1pc2NlbGxhbmVvdXMgNjQtYml0IHZhbHVlcworICovCisKK3N0cnVjdCBzaG1pZDY0X2RzIHsKKwlzdHJ1Y3QgaXBjNjRfcGVybQlzaG1fcGVybTsJLyogb3BlcmF0aW9uIHBlcm1zICovCisJc2l6ZV90CQkJc2htX3NlZ3N6OwkvKiBzaXplIG9mIHNlZ21lbnQgKGJ5dGVzKSAqLworCV9fa2VybmVsX3RpbWVfdAkJc2htX2F0aW1lOwkvKiBsYXN0IGF0dGFjaCB0aW1lICovCisjaWZkZWYgX19pMzg2X18KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDE7CisjZW5kaWYKKwlfX2tlcm5lbF90aW1lX3QJCXNobV9kdGltZTsJLyogbGFzdCBkZXRhY2ggdGltZSAqLworI2lmZGVmIF9faTM4Nl9fCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQyOworI2VuZGlmCisJX19rZXJuZWxfdGltZV90CQlzaG1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKyNpZmRlZiBfX2kzODZfXworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMzsKKyNlbmRpZgorCV9fa2VybmVsX3BpZF90CQlzaG1fY3BpZDsJLyogcGlkIG9mIGNyZWF0b3IgKi8KKwlfX2tlcm5lbF9waWRfdAkJc2htX2xwaWQ7CS8qIHBpZCBvZiBsYXN0IG9wZXJhdG9yICovCisJdW5zaWduZWQgbG9uZwkJc2htX25hdHRjaDsJLyogbm8uIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ1OworfTsKKworc3RydWN0IHNobWluZm82NCB7CisJdW5zaWduZWQgbG9uZwlzaG1tYXg7CisJdW5zaWduZWQgbG9uZwlzaG1taW47CisJdW5zaWduZWQgbG9uZwlzaG1tbmk7CisJdW5zaWduZWQgbG9uZwlzaG1zZWc7CisJdW5zaWduZWQgbG9uZwlzaG1hbGw7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7Cit9OworCisjZW5kaWYgLyogX0FTTV9YODZfU0hNQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTJkMzEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCkBAIC0wLDAgKzEsMTM3IEBACisjaWZuZGVmIF9BU01fWDg2X1NJR0NPTlRFWFRfSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdDT05URVhUX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19pMzg2X18KKy8qCisgKiBBcyBkb2N1bWVudGVkIGluIHRoZSBpQkNTMiBzdGFuZGFyZC4uCisgKgorICogVGhlIGZpcnN0IHBhcnQgb2YgInN0cnVjdCBfZnBzdGF0ZSIgaXMganVzdCB0aGUgbm9ybWFsIGkzODcKKyAqIGhhcmR3YXJlIHNldHVwLCB0aGUgZXh0cmEgInN0YXR1cyIgd29yZCBpcyB1c2VkIHRvIHNhdmUgdGhlCisgKiBjb3Byb2Nlc3NvciBzdGF0dXMgd29yZCBiZWZvcmUgZW50ZXJpbmcgdGhlIGhhbmRsZXIuCisgKgorICogUGVudGl1bSBJSUkgRlhTUiwgU1NFIHN1cHBvcnQKKyAqCUdhcmV0aCBIdWdoZXMgPGdhcmV0aEB2YWxpbnV4LmNvbT4sIE1heSAyMDAwCisgKgorICogVGhlIEZQVSBzdGF0ZSBkYXRhIHN0cnVjdHVyZSBoYXMgaGFkIHRvIGdyb3cgdG8gYWNjb21tb2RhdGUgdGhlCisgKiBleHRlbmRlZCBGUFUgc3RhdGUgcmVxdWlyZWQgYnkgdGhlIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMuCisgKiBUaGVyZSBpcyBubyBkb2N1bWVudGVkIHN0YW5kYXJkIHRvIGFjY29tcGxpc2ggdGhpcyBhdCB0aGUgbW9tZW50LgorICovCitzdHJ1Y3QgX2ZwcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfZnB4cmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF94bW1yZWcgeworCXVuc2lnbmVkIGxvbmcgZWxlbWVudFs0XTsKK307CisKK3N0cnVjdCBfZnBzdGF0ZSB7CisJLyogUmVndWxhciBGUFUgZW52aXJvbm1lbnQgKi8KKwl1bnNpZ25lZCBsb25nCWN3OworCXVuc2lnbmVkIGxvbmcJc3c7CisJdW5zaWduZWQgbG9uZwl0YWc7CisJdW5zaWduZWQgbG9uZwlpcG9mZjsKKwl1bnNpZ25lZCBsb25nCWNzc2VsOworCXVuc2lnbmVkIGxvbmcJZGF0YW9mZjsKKwl1bnNpZ25lZCBsb25nCWRhdGFzZWw7CisJc3RydWN0IF9mcHJlZwlfc3RbOF07CisJdW5zaWduZWQgc2hvcnQJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljOwkJLyogMHhmZmZmID0gcmVndWxhciBGUFUgZGF0YSBvbmx5ICovCisKKwkvKiBGWFNSIEZQVSBlbnZpcm9ubWVudCAqLworCXVuc2lnbmVkIGxvbmcJX2Z4c3JfZW52WzZdOwkvKiBGWFNSIEZQVSBlbnYgaXMgaWdub3JlZCAqLworCXVuc2lnbmVkIGxvbmcJbXhjc3I7CisJdW5zaWduZWQgbG9uZwlyZXNlcnZlZDsKKwlzdHJ1Y3QgX2ZweHJlZwlfZnhzcl9zdFs4XTsJLyogRlhTUiBGUFUgcmVnIGRhdGEgaXMgaWdub3JlZCAqLworCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07CisJdW5zaWduZWQgbG9uZwlwYWRkaW5nWzU2XTsKK307CisKKyNkZWZpbmUgWDg2X0ZYU1JfTUFHSUMJCTB4MDAwMAorCitzdHJ1Y3Qgc2lnY29udGV4dCB7CisJdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworCXVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKKwl1bnNpZ25lZCBzaG9ydCBlcywgX19lc2g7CisJdW5zaWduZWQgc2hvcnQgZHMsIF9fZHNoOworCXVuc2lnbmVkIGxvbmcgZWRpOworCXVuc2lnbmVkIGxvbmcgZXNpOworCXVuc2lnbmVkIGxvbmcgZWJwOworCXVuc2lnbmVkIGxvbmcgZXNwOworCXVuc2lnbmVkIGxvbmcgZWJ4OworCXVuc2lnbmVkIGxvbmcgZWR4OworCXVuc2lnbmVkIGxvbmcgZWN4OworCXVuc2lnbmVkIGxvbmcgZWF4OworCXVuc2lnbmVkIGxvbmcgdHJhcG5vOworCXVuc2lnbmVkIGxvbmcgZXJyOworCXVuc2lnbmVkIGxvbmcgZWlwOworCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKwl1bnNpZ25lZCBsb25nIGVmbGFnczsKKwl1bnNpZ25lZCBsb25nIGVzcF9hdF9zaWduYWw7CisJdW5zaWduZWQgc2hvcnQgc3MsIF9fc3NoOworCXN0cnVjdCBfZnBzdGF0ZSAqIGZwc3RhdGU7CisJdW5zaWduZWQgbG9uZyBvbGRtYXNrOworCXVuc2lnbmVkIGxvbmcgY3IyOworfTsKKworI2Vsc2UgLyogX19pMzg2X18gKi8KKworLyogRlhTQVZFIGZyYW1lICovCisvKiBOb3RlOiByZXNlcnZlZDEvMiBtYXkgc29tZWRheSBjb250YWluIHZhbHVhYmxlIGRhdGEuIEFsd2F5cyBzYXZlL3Jlc3RvcmUKKyAgIHRoZW0gd2hlbiB5b3UgY2hhbmdlIHNpZ25hbCBmcmFtZXMuICovCitzdHJ1Y3QgX2Zwc3RhdGUgeworCV9fdTE2CWN3ZDsKKwlfX3UxNglzd2Q7CisJX191MTYJdHdkOwkvKiBOb3RlIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSAzMmJpdC94ODcvRlNBVkUgdHdkICovCisJX191MTYJZm9wOworCV9fdTY0CXJpcDsKKwlfX3U2NAlyZHA7CisJX191MzIJbXhjc3I7CisJX191MzIJbXhjc3JfbWFzazsKKwlfX3UzMglzdF9zcGFjZVszMl07CS8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnICovCisJX191MzIJeG1tX3NwYWNlWzY0XTsJLyogMTYqMTYgYnl0ZXMgZm9yIGVhY2ggWE1NLXJlZyAgKi8KKwlfX3UzMglyZXNlcnZlZDJbMjRdOworfTsKKworc3RydWN0IHNpZ2NvbnRleHQgeworCXVuc2lnbmVkIGxvbmcgcjg7CisJdW5zaWduZWQgbG9uZyByOTsKKwl1bnNpZ25lZCBsb25nIHIxMDsKKwl1bnNpZ25lZCBsb25nIHIxMTsKKwl1bnNpZ25lZCBsb25nIHIxMjsKKwl1bnNpZ25lZCBsb25nIHIxMzsKKwl1bnNpZ25lZCBsb25nIHIxNDsKKwl1bnNpZ25lZCBsb25nIHIxNTsKKwl1bnNpZ25lZCBsb25nIHJkaTsKKwl1bnNpZ25lZCBsb25nIHJzaTsKKwl1bnNpZ25lZCBsb25nIHJicDsKKwl1bnNpZ25lZCBsb25nIHJieDsKKwl1bnNpZ25lZCBsb25nIHJkeDsKKwl1bnNpZ25lZCBsb25nIHJheDsKKwl1bnNpZ25lZCBsb25nIHJjeDsKKwl1bnNpZ25lZCBsb25nIHJzcDsKKwl1bnNpZ25lZCBsb25nIHJpcDsKKwl1bnNpZ25lZCBsb25nIGVmbGFnczsJCS8qIFJGTEFHUyAqLworCXVuc2lnbmVkIHNob3J0IGNzOworCXVuc2lnbmVkIHNob3J0IGdzOworCXVuc2lnbmVkIHNob3J0IGZzOworCXVuc2lnbmVkIHNob3J0IF9fcGFkMDsKKwl1bnNpZ25lZCBsb25nIGVycjsKKwl1bnNpZ25lZCBsb25nIHRyYXBubzsKKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CisJdW5zaWduZWQgbG9uZyBjcjI7CisJc3RydWN0IF9mcHN0YXRlICpmcHN0YXRlOwkvKiB6ZXJvIHdoZW4gbm8gRlBVIGNvbnRleHQgKi8KKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkMVs4XTsKK307CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaWdjb250ZXh0MzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNjU3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaWdjb250ZXh0MzIuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9TSUdDT05URVhUMzJfSAorI2RlZmluZSBfU0lHQ09OVEVYVDMyX0ggMQorCisvKiBzaWduYWwgY29udGV4dCBmb3IgMzJiaXQgcHJvZ3JhbXMuICovCisKKyNkZWZpbmUgWDg2X0ZYU1JfTUFHSUMJCTB4MDAwMAorCitzdHJ1Y3QgX2ZwcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKK307CisKK3N0cnVjdCBfZnB4cmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKwl1bnNpZ25lZCBzaG9ydCBleHBvbmVudDsKKwl1bnNpZ25lZCBzaG9ydCBwYWRkaW5nWzNdOworfTsKKworc3RydWN0IF94bW1yZWcgeworCV9fdTMyCWVsZW1lbnRbNF07Cit9OworCisvKiBGU0FWRSBmcmFtZSB3aXRoIGV4dGVuc2lvbnMgKi8KK3N0cnVjdCBfZnBzdGF0ZV9pYTMyIHsKKwkvKiBSZWd1bGFyIEZQVSBlbnZpcm9ubWVudCAqLworCV9fdTMyIAljdzsKKwlfX3UzMglzdzsKKwlfX3UzMgl0YWc7CS8qIG5vdCBjb21wYXRpYmxlIHRvIDY0Yml0IHR3ZCAqLworCV9fdTMyCWlwb2ZmOwkJCQorCV9fdTMyCWNzc2VsOworCV9fdTMyCWRhdGFvZmY7CisJX191MzIJZGF0YXNlbDsKKwlzdHJ1Y3QgX2ZwcmVnCV9zdFs4XTsKKwl1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJbWFnaWM7CQkvKiAweGZmZmYgPSByZWd1bGFyIEZQVSBkYXRhIG9ubHkgKi8KKworCS8qIEZYU1IgRlBVIGVudmlyb25tZW50ICovCisJX191MzIJX2Z4c3JfZW52WzZdOworCV9fdTMyCW14Y3NyOworCV9fdTMyCXJlc2VydmVkOworCXN0cnVjdCBfZnB4cmVnCV9meHNyX3N0WzhdOworCXN0cnVjdCBfeG1tcmVnCV94bW1bOF07CS8qIEl0J3MgYWN0dWFsbHkgMTYgKi8gCisJX191MzIJcGFkZGluZ1s1Nl07Cit9OworCitzdHJ1Y3Qgc2lnY29udGV4dF9pYTMyIHsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBncywgX19nc2g7CisgICAgICAgdW5zaWduZWQgc2hvcnQgZnMsIF9fZnNoOworICAgICAgIHVuc2lnbmVkIHNob3J0IGVzLCBfX2VzaDsKKyAgICAgICB1bnNpZ25lZCBzaG9ydCBkcywgX19kc2g7CisgICAgICAgdW5zaWduZWQgaW50IGVkaTsKKyAgICAgICB1bnNpZ25lZCBpbnQgZXNpOworICAgICAgIHVuc2lnbmVkIGludCBlYnA7CisgICAgICAgdW5zaWduZWQgaW50IGVzcDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZWJ4OworICAgICAgIHVuc2lnbmVkIGludCBlZHg7CisgICAgICAgdW5zaWduZWQgaW50IGVjeDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZWF4OworICAgICAgIHVuc2lnbmVkIGludCB0cmFwbm87CisgICAgICAgdW5zaWduZWQgaW50IGVycjsKKyAgICAgICB1bnNpZ25lZCBpbnQgZWlwOworICAgICAgIHVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZWZsYWdzOworICAgICAgIHVuc2lnbmVkIGludCBlc3BfYXRfc2lnbmFsOworICAgICAgIHVuc2lnbmVkIHNob3J0IHNzLCBfX3NzaDsKKyAgICAgICB1bnNpZ25lZCBpbnQgZnBzdGF0ZTsJCS8qIHJlYWxseSAoc3RydWN0IF9mcHN0YXRlX2lhMzIgKikgKi8KKyAgICAgICB1bnNpZ25lZCBpbnQgb2xkbWFzazsKKyAgICAgICB1bnNpZ25lZCBpbnQgY3IyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaWdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3N2JlYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NpZ2luZm8uaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9BU01fWDg2X1NJR0lORk9fSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdJTkZPX0gKKworI2lmZGVmIF9feDg2XzY0X18KKyMgZGVmaW5lIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFCSg0ICogc2l6ZW9mKGludCkpCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaWduYWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTY5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfQVNNX1g4Nl9TSUdOQUxfSAorI2RlZmluZSBfQVNNX1g4Nl9TSUdOQUxfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisvKiBBdm9pZCB0b28gbWFueSBoZWFkZXIgb3JkZXJpbmcgcHJvYmxlbXMuICAqLworc3RydWN0IHNpZ2luZm87CisKKy8qIEhlcmUgd2UgbXVzdCBjYXRlciB0byBsaWJjcyB0aGF0IHBva2UgYWJvdXQgaW4ga2VybmVsIGhlYWRlcnMuICAqLworCisjZGVmaW5lIE5TSUcJCTMyCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2lnc2V0X3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2RlZmluZSBTSUdIVVAJCSAxCisjZGVmaW5lIFNJR0lOVAkJIDIKKyNkZWZpbmUgU0lHUVVJVAkJIDMKKyNkZWZpbmUgU0lHSUxMCQkgNAorI2RlZmluZSBTSUdUUkFQCQkgNQorI2RlZmluZSBTSUdBQlJUCQkgNgorI2RlZmluZSBTSUdJT1QJCSA2CisjZGVmaW5lIFNJR0JVUwkJIDcKKyNkZWZpbmUgU0lHRlBFCQkgOAorI2RlZmluZSBTSUdLSUxMCQkgOQorI2RlZmluZSBTSUdVU1IxCQkxMAorI2RlZmluZSBTSUdTRUdWCQkxMQorI2RlZmluZSBTSUdVU1IyCQkxMgorI2RlZmluZSBTSUdQSVBFCQkxMworI2RlZmluZSBTSUdBTFJNCQkxNAorI2RlZmluZSBTSUdURVJNCQkxNQorI2RlZmluZSBTSUdTVEtGTFQJMTYKKyNkZWZpbmUgU0lHQ0hMRAkJMTcKKyNkZWZpbmUgU0lHQ09OVAkJMTgKKyNkZWZpbmUgU0lHU1RPUAkJMTkKKyNkZWZpbmUgU0lHVFNUUAkJMjAKKyNkZWZpbmUgU0lHVFRJTgkJMjEKKyNkZWZpbmUgU0lHVFRPVQkJMjIKKyNkZWZpbmUgU0lHVVJHCQkyMworI2RlZmluZSBTSUdYQ1BVCQkyNAorI2RlZmluZSBTSUdYRlNaCQkyNQorI2RlZmluZSBTSUdWVEFMUk0JMjYKKyNkZWZpbmUgU0lHUFJPRgkJMjcKKyNkZWZpbmUgU0lHV0lOQ0gJMjgKKyNkZWZpbmUgU0lHSU8JCTI5CisjZGVmaW5lIFNJR1BPTEwJCVNJR0lPCisvKgorI2RlZmluZSBTSUdMT1NUCQkyOQorKi8KKyNkZWZpbmUgU0lHUFdSCQkzMAorI2RlZmluZSBTSUdTWVMJCTMxCisjZGVmaW5lCVNJR1VOVVNFRAkzMQorCisvKiBUaGVzZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY29uc3RhbnRzIGZyb20gdXNlcmxhbmQuICAqLworI2RlZmluZSBTSUdSVE1JTgkzMgorI2RlZmluZSBTSUdSVE1BWAlfTlNJRworCisvKgorICogU0FfRkxBR1MgdmFsdWVzOgorICoKKyAqIFNBX09OU1RBQ0sgaW5kaWNhdGVzIHRoYXQgYSByZWdpc3RlcmVkIHN0YWNrX3Qgd2lsbCBiZSB1c2VkLgorICogU0FfUkVTVEFSVCBmbGFnIHRvIGdldCByZXN0YXJ0aW5nIHNpZ25hbHMgKHdoaWNoIHdlcmUgdGhlIGRlZmF1bHQgbG9uZyBhZ28pCisgKiBTQV9OT0NMRFNUT1AgZmxhZyB0byB0dXJuIG9mZiBTSUdDSExEIHdoZW4gY2hpbGRyZW4gc3RvcC4KKyAqIFNBX1JFU0VUSEFORCBjbGVhcnMgdGhlIGhhbmRsZXIgd2hlbiB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZC4KKyAqIFNBX05PQ0xEV0FJVCBmbGFnIG9uIFNJR0NITEQgdG8gaW5oaWJpdCB6b21iaWVzLgorICogU0FfTk9ERUZFUiBwcmV2ZW50cyB0aGUgY3VycmVudCBzaWduYWwgZnJvbSBiZWluZyBtYXNrZWQgaW4gdGhlIGhhbmRsZXIuCisgKgorICogU0FfT05FU0hPVCBhbmQgU0FfTk9NQVNLIGFyZSB0aGUgaGlzdG9yaWNhbCBMaW51eCBuYW1lcyBmb3IgdGhlIFNpbmdsZQorICogVW5peCBuYW1lcyBSRVNFVEhBTkQgYW5kIE5PREVGRVIgcmVzcGVjdGl2ZWx5LgorICovCisjZGVmaW5lIFNBX05PQ0xEU1RPUAkweDAwMDAwMDAxdQorI2RlZmluZSBTQV9OT0NMRFdBSVQJMHgwMDAwMDAwMnUKKyNkZWZpbmUgU0FfU0lHSU5GTwkweDAwMDAwMDA0dQorI2RlZmluZSBTQV9PTlNUQUNLCTB4MDgwMDAwMDB1CisjZGVmaW5lIFNBX1JFU1RBUlQJMHgxMDAwMDAwMHUKKyNkZWZpbmUgU0FfTk9ERUZFUgkweDQwMDAwMDAwdQorI2RlZmluZSBTQV9SRVNFVEhBTkQJMHg4MDAwMDAwMHUKKworI2RlZmluZSBTQV9OT01BU0sJU0FfTk9ERUZFUgorI2RlZmluZSBTQV9PTkVTSE9UCVNBX1JFU0VUSEFORAorCisjZGVmaW5lIFNBX1JFU1RPUkVSCTB4MDQwMDAwMDAKKworLyoKKyAqIHNpZ2FsdHN0YWNrIGNvbnRyb2xzCisgKi8KKyNkZWZpbmUgU1NfT05TVEFDSwkxCisjZGVmaW5lIFNTX0RJU0FCTEUJMgorCisjZGVmaW5lIE1JTlNJR1NUS1NaCTIwNDgKKyNkZWZpbmUgU0lHU1RLU1oJODE5MgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnbmFsLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBfX2kzODZfXworLyogSGVyZSB3ZSBtdXN0IGNhdGVyIHRvIGxpYmNzIHRoYXQgcG9rZSBhYm91dCBpbiBrZXJuZWwgaGVhZGVycy4gICovCisKK3N0cnVjdCBzaWdhY3Rpb24geworCXVuaW9uIHsKKwkgIF9fc2lnaGFuZGxlcl90IF9zYV9oYW5kbGVyOworCSAgdm9pZCAoKl9zYV9zaWdhY3Rpb24pKGludCwgc3RydWN0IHNpZ2luZm8gKiwgdm9pZCAqKTsKKwl9IF91OworCXNpZ3NldF90IHNhX21hc2s7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwl2b2lkICgqc2FfcmVzdG9yZXIpKHZvaWQpOworfTsKKworI2RlZmluZSBzYV9oYW5kbGVyCV91Ll9zYV9oYW5kbGVyCisjZGVmaW5lIHNhX3NpZ2FjdGlvbglfdS5fc2Ffc2lnYWN0aW9uCisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBzaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwlfX3NpZ3Jlc3RvcmVfdCBzYV9yZXN0b3JlcjsKKwlzaWdzZXRfdCBzYV9tYXNrOwkJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCit9OworCitzdHJ1Y3Qga19zaWdhY3Rpb24geworCXN0cnVjdCBzaWdhY3Rpb24gc2E7Cit9OworCisjZW5kaWYgLyogIV9faTM4Nl9fICovCisKK3R5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrIHsKKwl2b2lkICpzc19zcDsKKwlpbnQgc3NfZmxhZ3M7CisJc2l6ZV90IHNzX3NpemU7Cit9IHN0YWNrX3Q7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Y2E2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtMCwwICsxLDU1IEBACisjaWZuZGVmIF9BU01fU09DS0VUX0gKKyNkZWZpbmUgX0FTTV9TT0NLRVRfSAorCisjaW5jbHVkZSA8YXNtL3NvY2tpb3MuaD4KKworLyogRm9yIHNldHNvY2tvcHQoMikgKi8KKyNkZWZpbmUgU09MX1NPQ0tFVAkxCisKKyNkZWZpbmUgU09fREVCVUcJMQorI2RlZmluZSBTT19SRVVTRUFERFIJMgorI2RlZmluZSBTT19UWVBFCQkzCisjZGVmaW5lIFNPX0VSUk9SCTQKKyNkZWZpbmUgU09fRE9OVFJPVVRFCTUKKyNkZWZpbmUgU09fQlJPQURDQVNUCTYKKyNkZWZpbmUgU09fU05EQlVGCTcKKyNkZWZpbmUgU09fUkNWQlVGCTgKKyNkZWZpbmUgU09fU05EQlVGRk9SQ0UJMzIKKyNkZWZpbmUgU09fUkNWQlVGRk9SQ0UJMzMKKyNkZWZpbmUgU09fS0VFUEFMSVZFCTkKKyNkZWZpbmUgU09fT09CSU5MSU5FCTEwCisjZGVmaW5lIFNPX05PX0NIRUNLCTExCisjZGVmaW5lIFNPX1BSSU9SSVRZCTEyCisjZGVmaW5lIFNPX0xJTkdFUgkxMworI2RlZmluZSBTT19CU0RDT01QQVQJMTQKKy8qIFRvIGFkZCA6I2RlZmluZSBTT19SRVVTRVBPUlQgMTUgKi8KKyNkZWZpbmUgU09fUEFTU0NSRUQJMTYKKyNkZWZpbmUgU09fUEVFUkNSRUQJMTcKKyNkZWZpbmUgU09fUkNWTE9XQVQJMTgKKyNkZWZpbmUgU09fU05ETE9XQVQJMTkKKyNkZWZpbmUgU09fUkNWVElNRU8JMjAKKyNkZWZpbmUgU09fU05EVElNRU8JMjEKKworLyogU2VjdXJpdHkgbGV2ZWxzIC0gYXMgcGVyIE5STCBJUHY2IC0gZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKi8KKyNkZWZpbmUgU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04JCTIyCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0VOQ1JZUFRJT05fVFJBTlNQT1JUCTIzCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0VOQ1JZUFRJT05fTkVUV09SSwkJMjQKKworI2RlZmluZSBTT19CSU5EVE9ERVZJQ0UJMjUKKworLyogU29ja2V0IGZpbHRlcmluZyAqLworI2RlZmluZSBTT19BVFRBQ0hfRklMVEVSICAgICAgICAyNgorI2RlZmluZSBTT19ERVRBQ0hfRklMVEVSICAgICAgICAyNworCisjZGVmaW5lIFNPX1BFRVJOQU1FCQkyOAorI2RlZmluZSBTT19USU1FU1RBTVAJCTI5CisjZGVmaW5lIFNDTV9USU1FU1RBTVAJCVNPX1RJTUVTVEFNUAorCisjZGVmaW5lIFNPX0FDQ0VQVENPTk4JCTMwCisKKyNkZWZpbmUgU09fUEVFUlNFQwkJMzEKKyNkZWZpbmUgU09fUEFTU1NFQwkJMzQKKyNkZWZpbmUgU09fVElNRVNUQU1QTlMJCTM1CisjZGVmaW5lIFNDTV9USU1FU1RBTVBOUwkJU09fVElNRVNUQU1QTlMKKworI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NvY2tpb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3NvY2tpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWNjNzJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc29ja2lvcy5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX0FTTV9YODZfU09DS0lPU19ICisjZGVmaW5lIF9BU01fWDg2X1NPQ0tJT1NfSAorCisvKiBTb2NrZXQtbGV2ZWwgSS9PIGNvbnRyb2wgY2FsbHMuICovCisjZGVmaW5lIEZJT1NFVE9XTgkweDg5MDEKKyNkZWZpbmUgU0lPQ1NQR1JQCTB4ODkwMgorI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCisjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKKyNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAodGltZXZhbCkgKi8KKyNkZWZpbmUgU0lPQ0dTVEFNUE5TCTB4ODkwNwkJLyogR2V0IHN0YW1wICh0aW1lc3BlYykgKi8KKworI2VuZGlmIC8qIF9BU01fWDg2X1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc3RhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjJkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zdGF0LmgKQEAgLTAsMCArMSwxMTQgQEAKKyNpZm5kZWYgX0FTTV9YODZfU1RBVF9ICisjZGVmaW5lIF9BU01fWDg2X1NUQVRfSAorCisjZGVmaW5lIFNUQVRfSEFWRV9OU0VDIDEKKworI2lmZGVmIF9faTM4Nl9fCitzdHJ1Y3Qgc3RhdCB7CisJdW5zaWduZWQgbG9uZyAgc3RfZGV2OworCXVuc2lnbmVkIGxvbmcgIHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgbG9uZyAgc3RfcmRldjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTwkxCisKKy8qIFRoaXMgbWF0Y2hlcyBzdHJ1Y3Qgc3RhdDY0IGluIGdsaWJjMi4xLCBoZW5jZSB0aGUgYWJzb2x1dGVseQorICogaW5zYW5lIGFtb3VudHMgb2YgcGFkZGluZyBhcm91bmQgZGV2X3Qncy4KKyAqLworc3RydWN0IHN0YXQ2NCB7CisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMFs0XTsKKworCXVuc2lnbmVkIGxvbmcJX19zdF9pbm87CisKKwl1bnNpZ25lZCBpbnQJc3RfbW9kZTsKKwl1bnNpZ25lZCBpbnQJc3Rfbmxpbms7CisKKwl1bnNpZ25lZCBsb25nCXN0X3VpZDsKKwl1bnNpZ25lZCBsb25nCXN0X2dpZDsKKworCXVuc2lnbmVkIGxvbmcgbG9uZwlzdF9yZGV2OworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzRdOworCisJbG9uZyBsb25nCXN0X3NpemU7CisJdW5zaWduZWQgbG9uZwlzdF9ibGtzaXplOworCisJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2Jsb2NrczsKKworCXVuc2lnbmVkIGxvbmcJc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9hdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBpbnQJc3RfbXRpbWVfbnNlYzsKKworCXVuc2lnbmVkIGxvbmcJc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X2lubzsKK307CisKKyNlbHNlIC8qIF9faTM4Nl9fICovCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBsb25nCXN0X2RldjsKKwl1bnNpZ25lZCBsb25nCXN0X2lubzsKKwl1bnNpZ25lZCBsb25nCXN0X25saW5rOworCisJdW5zaWduZWQgaW50CXN0X21vZGU7CisJdW5zaWduZWQgaW50CXN0X3VpZDsKKwl1bnNpZ25lZCBpbnQJc3RfZ2lkOworCXVuc2lnbmVkIGludAlfX3BhZDA7CisJdW5zaWduZWQgbG9uZwlzdF9yZGV2OworCWxvbmcJCXN0X3NpemU7CisJbG9uZwkJc3RfYmxrc2l6ZTsKKwlsb25nCQlzdF9ibG9ja3M7CS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICAgc3RfY3RpbWVfbnNlYzsKKwlsb25nCQlfX3VudXNlZFszXTsKK307CisjZW5kaWYKKworLyogZm9yIDMyYml0IGVtdWxhdGlvbiBhbmQgMzIgYml0IGtlcm5lbHMgKi8KK3N0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgc3RfZGV2OworCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKKyNpZmRlZiBfX2kzODZfXworCXVuc2lnbmVkIGxvbmcgIHN0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisjZWxzZQorCXVuc2lnbmVkIGludCAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgIHN0X2F0aW1lOworCXVuc2lnbmVkIGludCAgc3RfbXRpbWU7CisJdW5zaWduZWQgaW50ICBzdF9jdGltZTsKKyNlbmRpZgorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zdGF0ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3N0YXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS9zdGF0ZnMuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIF9BU01fWDg2X1NUQVRGU19ICisjZGVmaW5lIF9BU01fWDg2X1NUQVRGU19ICisKKyNpZmRlZiBfX2kzODZfXworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgorI2Vsc2UKKworI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgX19rZXJuZWxfZnNpZF90CWZzaWRfdDsKKworI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIHVnbHkgLS0gd2UncmUgYWxyZWFkeSA2NC1iaXQgY2xlYW4sIHNvIGp1c3QgZHVwbGljYXRlIHRoZQorICogZGVmaW5pdGlvbnMuCisgKi8KK3N0cnVjdCBzdGF0ZnMgeworCWxvbmcgZl90eXBlOworCWxvbmcgZl9ic2l6ZTsKKwlsb25nIGZfYmxvY2tzOworCWxvbmcgZl9iZnJlZTsKKwlsb25nIGZfYmF2YWlsOworCWxvbmcgZl9maWxlczsKKwlsb25nIGZfZmZyZWU7CisJX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKKwlsb25nIGZfbmFtZWxlbjsKKwlsb25nIGZfZnJzaXplOworCWxvbmcgZl9zcGFyZVs1XTsKK307CisKK3N0cnVjdCBzdGF0ZnM2NCB7CisJbG9uZyBmX3R5cGU7CisJbG9uZyBmX2JzaXplOworCWxvbmcgZl9ibG9ja3M7CisJbG9uZyBmX2JmcmVlOworCWxvbmcgZl9iYXZhaWw7CisJbG9uZyBmX2ZpbGVzOworCWxvbmcgZl9mZnJlZTsKKwlfX2tlcm5lbF9mc2lkX3QgZl9mc2lkOworCWxvbmcgZl9uYW1lbGVuOworCWxvbmcgZl9mcnNpemU7CisJbG9uZyBmX3NwYXJlWzVdOworfTsKKworc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCB7CisJX191MzIgZl90eXBlOworCV9fdTMyIGZfYnNpemU7CisJX191NjQgZl9ibG9ja3M7CisJX191NjQgZl9iZnJlZTsKKwlfX3U2NCBmX2JhdmFpbDsKKwlfX3U2NCBmX2ZpbGVzOworCV9fdTY0IGZfZmZyZWU7CisJX19rZXJuZWxfZnNpZF90IGZfZnNpZDsKKwlfX3UzMiBmX25hbWVsZW47CisJX191MzIgZl9mcnNpemU7CisJX191MzIgZl9zcGFyZVs1XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZiAvKiAhX19pMzg2X18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdGVybWJpdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYjcwZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgKQEAgLTAsMCArMSwxOTggQEAKKyNpZm5kZWYgX0FTTV9YODZfVEVSTUJJVFNfSAorI2RlZmluZSBfQVNNX1g4Nl9URVJNQklUU19ICisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJY2NfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXNwZWVkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAl0Y2ZsYWdfdDsKKworI2RlZmluZSBOQ0NTIDE5CitzdHJ1Y3QgdGVybWlvcyB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KK307CisKK3N0cnVjdCB0ZXJtaW9zMiB7CisJdGNmbGFnX3QgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwljY190IGNfbGluZTsJCQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwljY190IGNfY2NbTkNDU107CQkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KKwlzcGVlZF90IGNfaXNwZWVkOwkJLyogaW5wdXQgc3BlZWQgKi8KKwlzcGVlZF90IGNfb3NwZWVkOwkJLyogb3V0cHV0IHNwZWVkICovCit9OworCitzdHJ1Y3Qga3Rlcm1pb3MgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKworLyogY19jYyBjaGFyYWN0ZXJzICovCisjZGVmaW5lIFZJTlRSIDAKKyNkZWZpbmUgVlFVSVQgMQorI2RlZmluZSBWRVJBU0UgMgorI2RlZmluZSBWS0lMTCAzCisjZGVmaW5lIFZFT0YgNAorI2RlZmluZSBWVElNRSA1CisjZGVmaW5lIFZNSU4gNgorI2RlZmluZSBWU1dUQyA3CisjZGVmaW5lIFZTVEFSVCA4CisjZGVmaW5lIFZTVE9QIDkKKyNkZWZpbmUgVlNVU1AgMTAKKyNkZWZpbmUgVkVPTCAxMQorI2RlZmluZSBWUkVQUklOVCAxMgorI2RlZmluZSBWRElTQ0FSRCAxMworI2RlZmluZSBWV0VSQVNFIDE0CisjZGVmaW5lIFZMTkVYVCAxNQorI2RlZmluZSBWRU9MMiAxNgorCisvKiBjX2lmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSUdOQlJLCTAwMDAwMDEKKyNkZWZpbmUgQlJLSU5UCTAwMDAwMDIKKyNkZWZpbmUgSUdOUEFSCTAwMDAwMDQKKyNkZWZpbmUgUEFSTVJLCTAwMDAwMTAKKyNkZWZpbmUgSU5QQ0sJMDAwMDAyMAorI2RlZmluZSBJU1RSSVAJMDAwMDA0MAorI2RlZmluZSBJTkxDUgkwMDAwMTAwCisjZGVmaW5lIElHTkNSCTAwMDAyMDAKKyNkZWZpbmUgSUNSTkwJMDAwMDQwMAorI2RlZmluZSBJVUNMQwkwMDAxMDAwCisjZGVmaW5lIElYT04JMDAwMjAwMAorI2RlZmluZSBJWEFOWQkwMDA0MDAwCisjZGVmaW5lIElYT0ZGCTAwMTAwMDAKKyNkZWZpbmUgSU1BWEJFTAkwMDIwMDAwCisjZGVmaW5lIElVVEY4CTAwNDAwMDAKKworLyogY19vZmxhZyBiaXRzICovCisjZGVmaW5lIE9QT1NUCTAwMDAwMDEKKyNkZWZpbmUgT0xDVUMJMDAwMDAwMgorI2RlZmluZSBPTkxDUgkwMDAwMDA0CisjZGVmaW5lIE9DUk5MCTAwMDAwMTAKKyNkZWZpbmUgT05PQ1IJMDAwMDAyMAorI2RlZmluZSBPTkxSRVQJMDAwMDA0MAorI2RlZmluZSBPRklMTAkwMDAwMTAwCisjZGVmaW5lIE9GREVMCTAwMDAyMDAKKyNkZWZpbmUgTkxETFkJMDAwMDQwMAorI2RlZmluZSAgIE5MMAkwMDAwMDAwCisjZGVmaW5lICAgTkwxCTAwMDA0MDAKKyNkZWZpbmUgQ1JETFkJMDAwMzAwMAorI2RlZmluZSAgIENSMAkwMDAwMDAwCisjZGVmaW5lICAgQ1IxCTAwMDEwMDAKKyNkZWZpbmUgICBDUjIJMDAwMjAwMAorI2RlZmluZSAgIENSMwkwMDAzMDAwCisjZGVmaW5lIFRBQkRMWQkwMDE0MDAwCisjZGVmaW5lICAgVEFCMAkwMDAwMDAwCisjZGVmaW5lICAgVEFCMQkwMDA0MDAwCisjZGVmaW5lICAgVEFCMgkwMDEwMDAwCisjZGVmaW5lICAgVEFCMwkwMDE0MDAwCisjZGVmaW5lICAgWFRBQlMJMDAxNDAwMAorI2RlZmluZSBCU0RMWQkwMDIwMDAwCisjZGVmaW5lICAgQlMwCTAwMDAwMDAKKyNkZWZpbmUgICBCUzEJMDAyMDAwMAorI2RlZmluZSBWVERMWQkwMDQwMDAwCisjZGVmaW5lICAgVlQwCTAwMDAwMDAKKyNkZWZpbmUgICBWVDEJMDA0MDAwMAorI2RlZmluZSBGRkRMWQkwMTAwMDAwCisjZGVmaW5lICAgRkYwCTAwMDAwMDAKKyNkZWZpbmUgICBGRjEJMDEwMDAwMAorCisvKiBjX2NmbGFnIGJpdCBtZWFuaW5nICovCisjZGVmaW5lIENCQVVECTAwMTAwMTcKKyNkZWZpbmUgIEIwCTAwMDAwMDAJCS8qIGhhbmcgdXAgKi8KKyNkZWZpbmUgIEI1MAkwMDAwMDAxCisjZGVmaW5lICBCNzUJMDAwMDAwMgorI2RlZmluZSAgQjExMAkwMDAwMDAzCisjZGVmaW5lICBCMTM0CTAwMDAwMDQKKyNkZWZpbmUgIEIxNTAJMDAwMDAwNQorI2RlZmluZSAgQjIwMAkwMDAwMDA2CisjZGVmaW5lICBCMzAwCTAwMDAwMDcKKyNkZWZpbmUgIEI2MDAJMDAwMDAxMAorI2RlZmluZSAgQjEyMDAJMDAwMDAxMQorI2RlZmluZSAgQjE4MDAJMDAwMDAxMgorI2RlZmluZSAgQjI0MDAJMDAwMDAxMworI2RlZmluZSAgQjQ4MDAJMDAwMDAxNAorI2RlZmluZSAgQjk2MDAJMDAwMDAxNQorI2RlZmluZSAgQjE5MjAwCTAwMDAwMTYKKyNkZWZpbmUgIEIzODQwMAkwMDAwMDE3CisjZGVmaW5lIEVYVEEgQjE5MjAwCisjZGVmaW5lIEVYVEIgQjM4NDAwCisjZGVmaW5lIENTSVpFCTAwMDAwNjAKKyNkZWZpbmUgICBDUzUJMDAwMDAwMAorI2RlZmluZSAgIENTNgkwMDAwMDIwCisjZGVmaW5lICAgQ1M3CTAwMDAwNDAKKyNkZWZpbmUgICBDUzgJMDAwMDA2MAorI2RlZmluZSBDU1RPUEIJMDAwMDEwMAorI2RlZmluZSBDUkVBRAkwMDAwMjAwCisjZGVmaW5lIFBBUkVOQgkwMDAwNDAwCisjZGVmaW5lIFBBUk9ERAkwMDAxMDAwCisjZGVmaW5lIEhVUENMCTAwMDIwMDAKKyNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKKyNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lCSAgIEJPVEhFUiAwMDEwMDAwCQkvKiBub24gc3RhbmRhcmQgcmF0ZSAqLworI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQorI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgorI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMworI2RlZmluZSAgIEI0NjA4MDAgMDAxMDAwNAorI2RlZmluZSAgIEI1MDAwMDAgMDAxMDAwNQorI2RlZmluZSAgIEI1NzYwMDAgMDAxMDAwNgorI2RlZmluZSAgIEI5MjE2MDAgMDAxMDAwNworI2RlZmluZSAgQjEwMDAwMDAgMDAxMDAxMAorI2RlZmluZSAgQjExNTIwMDAgMDAxMDAxMQorI2RlZmluZSAgQjE1MDAwMDAgMDAxMDAxMgorI2RlZmluZSAgQjIwMDAwMDAgMDAxMDAxMworI2RlZmluZSAgQjI1MDAwMDAgMDAxMDAxNAorI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQorI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgorI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlICovCisjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCisjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJLyogZmxvdyBjb250cm9sICovCisKKyNkZWZpbmUgSUJTSElGVAkgIDE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCisvKiBjX2xmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSVNJRwkwMDAwMDAxCisjZGVmaW5lIElDQU5PTgkwMDAwMDAyCisjZGVmaW5lIFhDQVNFCTAwMDAwMDQKKyNkZWZpbmUgRUNITwkwMDAwMDEwCisjZGVmaW5lIEVDSE9FCTAwMDAwMjAKKyNkZWZpbmUgRUNIT0sJMDAwMDA0MAorI2RlZmluZSBFQ0hPTkwJMDAwMDEwMAorI2RlZmluZSBOT0ZMU0gJMDAwMDIwMAorI2RlZmluZSBUT1NUT1AJMDAwMDQwMAorI2RlZmluZSBFQ0hPQ1RMCTAwMDEwMDAKKyNkZWZpbmUgRUNIT1BSVAkwMDAyMDAwCisjZGVmaW5lIEVDSE9LRQkwMDA0MDAwCisjZGVmaW5lIEZMVVNITwkwMDEwMDAwCisjZGVmaW5lIFBFTkRJTgkwMDQwMDAwCisjZGVmaW5lIElFWFRFTgkwMTAwMDAwCisKKy8qIHRjZmxvdygpIGFuZCBUQ1hPTkMgdXNlIHRoZXNlICovCisjZGVmaW5lCVRDT09GRgkJMAorI2RlZmluZQlUQ09PTgkJMQorI2RlZmluZQlUQ0lPRkYJCTIKKyNkZWZpbmUJVENJT04JCTMKKworLyogdGNmbHVzaCgpIGFuZCBUQ0ZMU0ggdXNlIHRoZXNlICovCisjZGVmaW5lCVRDSUZMVVNICTAKKyNkZWZpbmUJVENPRkxVU0gJMQorI2RlZmluZQlUQ0lPRkxVU0gJMgorCisvKiB0Y3NldGF0dHIgdXNlcyB0aGVzZSAqLworI2RlZmluZQlUQ1NBTk9XCQkwCisjZGVmaW5lCVRDU0FEUkFJTgkxCisjZGVmaW5lCVRDU0FGTFVTSAkyCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9URVJNQklUU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS90ZXJtaW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1ZTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIF9BU01fWDg2X1RFUk1JT1NfSAorI2RlZmluZSBfQVNNX1g4Nl9URVJNSU9TX0gKKworI2luY2x1ZGUgPGFzbS90ZXJtYml0cy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworc3RydWN0IHdpbnNpemUgeworCXVuc2lnbmVkIHNob3J0IHdzX3JvdzsKKwl1bnNpZ25lZCBzaG9ydCB3c19jb2w7CisJdW5zaWduZWQgc2hvcnQgd3NfeHBpeGVsOworCXVuc2lnbmVkIHNob3J0IHdzX3lwaXhlbDsKK307CisKKyNkZWZpbmUgTkNDIDgKK3N0cnVjdCB0ZXJtaW8geworCXVuc2lnbmVkIHNob3J0IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdW5zaWduZWQgc2hvcnQgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdW5zaWduZWQgc2hvcnQgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJdW5zaWduZWQgY2hhciBjX2xpbmU7CQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKwl1bnNpZ25lZCBjaGFyIGNfY2NbTkNDXTsJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCit9OworCisvKiBtb2RlbSBsaW5lcyAqLworI2RlZmluZSBUSU9DTV9MRQkweDAwMQorI2RlZmluZSBUSU9DTV9EVFIJMHgwMDIKKyNkZWZpbmUgVElPQ01fUlRTCTB4MDA0CisjZGVmaW5lIFRJT0NNX1NUCTB4MDA4CisjZGVmaW5lIFRJT0NNX1NSCTB4MDEwCisjZGVmaW5lIFRJT0NNX0NUUwkweDAyMAorI2RlZmluZSBUSU9DTV9DQVIJMHgwNDAKKyNkZWZpbmUgVElPQ01fUk5HCTB4MDgwCisjZGVmaW5lIFRJT0NNX0RTUgkweDEwMAorI2RlZmluZSBUSU9DTV9DRAlUSU9DTV9DQVIKKyNkZWZpbmUgVElPQ01fUkkJVElPQ01fUk5HCisjZGVmaW5lIFRJT0NNX09VVDEJMHgyMDAwCisjZGVmaW5lIFRJT0NNX09VVDIJMHg0MDAwCisjZGVmaW5lIFRJT0NNX0xPT1AJMHg4MDAwCisKKy8qIGlvY3RsIChmZCwgVElPQ1NFUkdFVExTUiwgJnJlc3VsdCkgd2hlcmUgcmVzdWx0IG1heSBiZSBhcyBiZWxvdyAqLworCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9URVJNSU9TX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODM1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS90eXBlcy5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0FTTV9YODZfVFlQRVNfSAorI2RlZmluZSBfQVNNX1g4Nl9UWVBFU19ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdW1vZGVfdDsKKworLyoKKyAqIF9feHggaXMgb2s6IGl0IGRvZXNuJ3QgcG9sbHV0ZSB0aGUgUE9TSVggbmFtZXNwYWNlLiBVc2UgdGhlc2UgaW4gdGhlCisgKiBoZWFkZXIgZmlsZXMgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZQorICovCisKK3R5cGVkZWYgX19zaWduZWRfXyBjaGFyIF9fczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191ODsKKwordHlwZWRlZiBfX3NpZ25lZF9fIHNob3J0IF9fczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKKwordHlwZWRlZiBfX3NpZ25lZF9fIGludCBfX3MzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdTMyOworCisjaWZkZWYgX19pMzg2X18KKyMgaWZkZWYgX19HTlVDX18KK19fZXh0ZW5zaW9uX18gdHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyBfX3M2NDsKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CisjIGVuZGlmCisjZWxzZQordHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyBfX3M2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdTY0OworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIFRoZXNlIGFyZW4ndCBleHBvcnRlZCBvdXRzaWRlIHRoZSBrZXJuZWwgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzCisgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91Y29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE3OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdWNvbnRleHQuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fWDg2X1VDT05URVhUX0gKKyNkZWZpbmUgX0FTTV9YODZfVUNPTlRFWFRfSAorCitzdHJ1Y3QgdWNvbnRleHQgeworCXVuc2lnbmVkIGxvbmcJICB1Y19mbGFnczsKKwlzdHJ1Y3QgdWNvbnRleHQgICp1Y19saW5rOworCXN0YWNrX3QJCSAgdWNfc3RhY2s7CisJc3RydWN0IHNpZ2NvbnRleHQgdWNfbWNvbnRleHQ7CisJc2lnc2V0X3QJICB1Y19zaWdtYXNrOwkvKiBtYXNrIGxhc3QgZm9yIGV4dGVuc2liaWxpdHkgKi8KK307CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9VQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZGUwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMCwwICsxLDUgQEAKKyMgaWZkZWYgX19pMzg2X18KKyMgIGluY2x1ZGUgInVuaXN0ZF8zMi5oIgorIyBlbHNlCisjICBpbmNsdWRlICJ1bmlzdGRfNjQuaCIKKyMgZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2M2U0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oCkBAIC0wLDAgKzEsMzM0IEBACisjaWZuZGVmIF9BU01fSTM4Nl9VTklTVERfSF8KKyNkZWZpbmUgX0FTTV9JMzg2X1VOSVNURF9IXworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzeXN0ZW0gY2FsbCBudW1iZXJzLgorICovCisKKyNkZWZpbmUgX19OUl9yZXN0YXJ0X3N5c2NhbGwgICAgICAwCisjZGVmaW5lIF9fTlJfZXhpdAkJICAxCisjZGVmaW5lIF9fTlJfZm9yawkJICAyCisjZGVmaW5lIF9fTlJfcmVhZAkJICAzCisjZGVmaW5lIF9fTlJfd3JpdGUJCSAgNAorI2RlZmluZSBfX05SX29wZW4JCSAgNQorI2RlZmluZSBfX05SX2Nsb3NlCQkgIDYKKyNkZWZpbmUgX19OUl93YWl0cGlkCQkgIDcKKyNkZWZpbmUgX19OUl9jcmVhdAkJICA4CisjZGVmaW5lIF9fTlJfbGluawkJICA5CisjZGVmaW5lIF9fTlJfdW5saW5rCQkgMTAKKyNkZWZpbmUgX19OUl9leGVjdmUJCSAxMQorI2RlZmluZSBfX05SX2NoZGlyCQkgMTIKKyNkZWZpbmUgX19OUl90aW1lCQkgMTMKKyNkZWZpbmUgX19OUl9ta25vZAkJIDE0CisjZGVmaW5lIF9fTlJfY2htb2QJCSAxNQorI2RlZmluZSBfX05SX2xjaG93bgkJIDE2CisjZGVmaW5lIF9fTlJfYnJlYWsJCSAxNworI2RlZmluZSBfX05SX29sZHN0YXQJCSAxOAorI2RlZmluZSBfX05SX2xzZWVrCQkgMTkKKyNkZWZpbmUgX19OUl9nZXRwaWQJCSAyMAorI2RlZmluZSBfX05SX21vdW50CQkgMjEKKyNkZWZpbmUgX19OUl91bW91bnQJCSAyMgorI2RlZmluZSBfX05SX3NldHVpZAkJIDIzCisjZGVmaW5lIF9fTlJfZ2V0dWlkCQkgMjQKKyNkZWZpbmUgX19OUl9zdGltZQkJIDI1CisjZGVmaW5lIF9fTlJfcHRyYWNlCQkgMjYKKyNkZWZpbmUgX19OUl9hbGFybQkJIDI3CisjZGVmaW5lIF9fTlJfb2xkZnN0YXQJCSAyOAorI2RlZmluZSBfX05SX3BhdXNlCQkgMjkKKyNkZWZpbmUgX19OUl91dGltZQkJIDMwCisjZGVmaW5lIF9fTlJfc3R0eQkJIDMxCisjZGVmaW5lIF9fTlJfZ3R0eQkJIDMyCisjZGVmaW5lIF9fTlJfYWNjZXNzCQkgMzMKKyNkZWZpbmUgX19OUl9uaWNlCQkgMzQKKyNkZWZpbmUgX19OUl9mdGltZQkJIDM1CisjZGVmaW5lIF9fTlJfc3luYwkJIDM2CisjZGVmaW5lIF9fTlJfa2lsbAkJIDM3CisjZGVmaW5lIF9fTlJfcmVuYW1lCQkgMzgKKyNkZWZpbmUgX19OUl9ta2RpcgkJIDM5CisjZGVmaW5lIF9fTlJfcm1kaXIJCSA0MAorI2RlZmluZSBfX05SX2R1cAkJIDQxCisjZGVmaW5lIF9fTlJfcGlwZQkJIDQyCisjZGVmaW5lIF9fTlJfdGltZXMJCSA0MworI2RlZmluZSBfX05SX3Byb2YJCSA0NAorI2RlZmluZSBfX05SX2JyawkJIDQ1CisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkgNDYKKyNkZWZpbmUgX19OUl9nZXRnaWQJCSA0NworI2RlZmluZSBfX05SX3NpZ25hbAkJIDQ4CisjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJIDQ5CisjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJIDUwCisjZGVmaW5lIF9fTlJfYWNjdAkJIDUxCisjZGVmaW5lIF9fTlJfdW1vdW50MgkJIDUyCisjZGVmaW5lIF9fTlJfbG9jawkJIDUzCisjZGVmaW5lIF9fTlJfaW9jdGwJCSA1NAorI2RlZmluZSBfX05SX2ZjbnRsCQkgNTUKKyNkZWZpbmUgX19OUl9tcHgJCSA1NgorI2RlZmluZSBfX05SX3NldHBnaWQJCSA1NworI2RlZmluZSBfX05SX3VsaW1pdAkJIDU4CisjZGVmaW5lIF9fTlJfb2xkb2xkdW5hbWUJIDU5CisjZGVmaW5lIF9fTlJfdW1hc2sJCSA2MAorI2RlZmluZSBfX05SX2Nocm9vdAkJIDYxCisjZGVmaW5lIF9fTlJfdXN0YXQJCSA2MgorI2RlZmluZSBfX05SX2R1cDIJCSA2MworI2RlZmluZSBfX05SX2dldHBwaWQJCSA2NAorI2RlZmluZSBfX05SX2dldHBncnAJCSA2NQorI2RlZmluZSBfX05SX3NldHNpZAkJIDY2CisjZGVmaW5lIF9fTlJfc2lnYWN0aW9uCQkgNjcKKyNkZWZpbmUgX19OUl9zZ2V0bWFzawkJIDY4CisjZGVmaW5lIF9fTlJfc3NldG1hc2sJCSA2OQorI2RlZmluZSBfX05SX3NldHJldWlkCQkgNzAKKyNkZWZpbmUgX19OUl9zZXRyZWdpZAkJIDcxCisjZGVmaW5lIF9fTlJfc2lnc3VzcGVuZAkJIDcyCisjZGVmaW5lIF9fTlJfc2lncGVuZGluZwkJIDczCisjZGVmaW5lIF9fTlJfc2V0aG9zdG5hbWUJIDc0CisjZGVmaW5lIF9fTlJfc2V0cmxpbWl0CQkgNzUKKyNkZWZpbmUgX19OUl9nZXRybGltaXQJCSA3NgkvKiBCYWNrIGNvbXBhdGlibGUgMkdpZyBsaW1pdGVkIHJsaW1pdCAqLworI2RlZmluZSBfX05SX2dldHJ1c2FnZQkJIDc3CisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5CSA3OAorI2RlZmluZSBfX05SX3NldHRpbWVvZmRheQkgNzkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMJCSA4MAorI2RlZmluZSBfX05SX3NldGdyb3VwcwkJIDgxCisjZGVmaW5lIF9fTlJfc2VsZWN0CQkgODIKKyNkZWZpbmUgX19OUl9zeW1saW5rCQkgODMKKyNkZWZpbmUgX19OUl9vbGRsc3RhdAkJIDg0CisjZGVmaW5lIF9fTlJfcmVhZGxpbmsJCSA4NQorI2RlZmluZSBfX05SX3VzZWxpYgkJIDg2CisjZGVmaW5lIF9fTlJfc3dhcG9uCQkgODcKKyNkZWZpbmUgX19OUl9yZWJvb3QJCSA4OAorI2RlZmluZSBfX05SX3JlYWRkaXIJCSA4OQorI2RlZmluZSBfX05SX21tYXAJCSA5MAorI2RlZmluZSBfX05SX211bm1hcAkJIDkxCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCSA5MgorI2RlZmluZSBfX05SX2Z0cnVuY2F0ZQkJIDkzCisjZGVmaW5lIF9fTlJfZmNobW9kCQkgOTQKKyNkZWZpbmUgX19OUl9mY2hvd24JCSA5NQorI2RlZmluZSBfX05SX2dldHByaW9yaXR5CSA5NgorI2RlZmluZSBfX05SX3NldHByaW9yaXR5CSA5NworI2RlZmluZSBfX05SX3Byb2ZpbAkJIDk4CisjZGVmaW5lIF9fTlJfc3RhdGZzCQkgOTkKKyNkZWZpbmUgX19OUl9mc3RhdGZzCQkxMDAKKyNkZWZpbmUgX19OUl9pb3Blcm0JCTEwMQorI2RlZmluZSBfX05SX3NvY2tldGNhbGwJCTEwMgorI2RlZmluZSBfX05SX3N5c2xvZwkJMTAzCisjZGVmaW5lIF9fTlJfc2V0aXRpbWVyCQkxMDQKKyNkZWZpbmUgX19OUl9nZXRpdGltZXIJCTEwNQorI2RlZmluZSBfX05SX3N0YXQJCTEwNgorI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKKyNkZWZpbmUgX19OUl9mc3RhdAkJMTA4CisjZGVmaW5lIF9fTlJfb2xkdW5hbWUJCTEwOQorI2RlZmluZSBfX05SX2lvcGwJCTExMAorI2RlZmluZSBfX05SX3ZoYW5ndXAJCTExMQorI2RlZmluZSBfX05SX2lkbGUJCTExMgorI2RlZmluZSBfX05SX3ZtODZvbGQJCTExMworI2RlZmluZSBfX05SX3dhaXQ0CQkxMTQKKyNkZWZpbmUgX19OUl9zd2Fwb2ZmCQkxMTUKKyNkZWZpbmUgX19OUl9zeXNpbmZvCQkxMTYKKyNkZWZpbmUgX19OUl9pcGMJCTExNworI2RlZmluZSBfX05SX2ZzeW5jCQkxMTgKKyNkZWZpbmUgX19OUl9zaWdyZXR1cm4JCTExOQorI2RlZmluZSBfX05SX2Nsb25lCQkxMjAKKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lCTEyMQorI2RlZmluZSBfX05SX3VuYW1lCQkxMjIKKyNkZWZpbmUgX19OUl9tb2RpZnlfbGR0CQkxMjMKKyNkZWZpbmUgX19OUl9hZGp0aW1leAkJMTI0CisjZGVmaW5lIF9fTlJfbXByb3RlY3QJCTEyNQorI2RlZmluZSBfX05SX3NpZ3Byb2NtYXNrCTEyNgorI2RlZmluZSBfX05SX2NyZWF0ZV9tb2R1bGUJMTI3CisjZGVmaW5lIF9fTlJfaW5pdF9tb2R1bGUJMTI4CisjZGVmaW5lIF9fTlJfZGVsZXRlX21vZHVsZQkxMjkKKyNkZWZpbmUgX19OUl9nZXRfa2VybmVsX3N5bXMJMTMwCisjZGVmaW5lIF9fTlJfcXVvdGFjdGwJCTEzMQorI2RlZmluZSBfX05SX2dldHBnaWQJCTEzMgorI2RlZmluZSBfX05SX2ZjaGRpcgkJMTMzCisjZGVmaW5lIF9fTlJfYmRmbHVzaAkJMTM0CisjZGVmaW5lIF9fTlJfc3lzZnMJCTEzNQorI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5CTEzNgorI2RlZmluZSBfX05SX2Fmc19zeXNjYWxsCTEzNyAvKiBTeXNjYWxsIGZvciBBbmRyZXcgRmlsZSBTeXN0ZW0gKi8KKyNkZWZpbmUgX19OUl9zZXRmc3VpZAkJMTM4CisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCTEzOQorI2RlZmluZSBfX05SX19sbHNlZWsJCTE0MAorI2RlZmluZSBfX05SX2dldGRlbnRzCQkxNDEKKyNkZWZpbmUgX19OUl9fbmV3c2VsZWN0CQkxNDIKKyNkZWZpbmUgX19OUl9mbG9jawkJMTQzCisjZGVmaW5lIF9fTlJfbXN5bmMJCTE0NAorI2RlZmluZSBfX05SX3JlYWR2CQkxNDUKKyNkZWZpbmUgX19OUl93cml0ZXYJCTE0NgorI2RlZmluZSBfX05SX2dldHNpZAkJMTQ3CisjZGVmaW5lIF9fTlJfZmRhdGFzeW5jCQkxNDgKKyNkZWZpbmUgX19OUl9fc3lzY3RsCQkxNDkKKyNkZWZpbmUgX19OUl9tbG9jawkJMTUwCisjZGVmaW5lIF9fTlJfbXVubG9jawkJMTUxCisjZGVmaW5lIF9fTlJfbWxvY2thbGwJCTE1MgorI2RlZmluZSBfX05SX211bmxvY2thbGwJCTE1MworI2RlZmluZSBfX05SX3NjaGVkX3NldHBhcmFtCQkxNTQKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRwYXJhbQkJMTU1CisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyCQkxNTYKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIJCTE1NworI2RlZmluZSBfX05SX3NjaGVkX3lpZWxkCQkxNTgKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CTE1OQorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4JMTYwCisjZGVmaW5lIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCTE2MQorI2RlZmluZSBfX05SX25hbm9zbGVlcAkJMTYyCisjZGVmaW5lIF9fTlJfbXJlbWFwCQkxNjMKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQJCTE2NAorI2RlZmluZSBfX05SX2dldHJlc3VpZAkJMTY1CisjZGVmaW5lIF9fTlJfdm04NgkJMTY2CisjZGVmaW5lIF9fTlJfcXVlcnlfbW9kdWxlCTE2NworI2RlZmluZSBfX05SX3BvbGwJCTE2OAorI2RlZmluZSBfX05SX25mc3NlcnZjdGwJCTE2OQorI2RlZmluZSBfX05SX3NldHJlc2dpZAkJMTcwCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkCQkxNzEKKyNkZWZpbmUgX19OUl9wcmN0bCAgICAgICAgICAgICAgMTcyCisjZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuCTE3MworI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbgkxNzQKKyNkZWZpbmUgX19OUl9ydF9zaWdwcm9jbWFzawkxNzUKKyNkZWZpbmUgX19OUl9ydF9zaWdwZW5kaW5nCTE3NgorI2RlZmluZSBfX05SX3J0X3NpZ3RpbWVkd2FpdAkxNzcKKyNkZWZpbmUgX19OUl9ydF9zaWdxdWV1ZWluZm8JMTc4CisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZAkxNzkKKyNkZWZpbmUgX19OUl9wcmVhZDY0CQkxODAKKyNkZWZpbmUgX19OUl9wd3JpdGU2NAkJMTgxCisjZGVmaW5lIF9fTlJfY2hvd24JCTE4MgorI2RlZmluZSBfX05SX2dldGN3ZAkJMTgzCisjZGVmaW5lIF9fTlJfY2FwZ2V0CQkxODQKKyNkZWZpbmUgX19OUl9jYXBzZXQJCTE4NQorI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCTE4NgorI2RlZmluZSBfX05SX3NlbmRmaWxlCQkxODcKKyNkZWZpbmUgX19OUl9nZXRwbXNnCQkxODgJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCisjZGVmaW5lIF9fTlJfcHV0cG1zZwkJMTg5CS8qIHNvbWUgcGVvcGxlIGFjdHVhbGx5IHdhbnQgc3RyZWFtcyAqLworI2RlZmluZSBfX05SX3Zmb3JrCQkxOTAKKyNkZWZpbmUgX19OUl91Z2V0cmxpbWl0CQkxOTEJLyogU3VTIGNvbXBsaWFudCBnZXRybGltaXQgKi8KKyNkZWZpbmUgX19OUl9tbWFwMgkJMTkyCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGU2NAkJMTkzCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlNjQJMTk0CisjZGVmaW5lIF9fTlJfc3RhdDY0CQkxOTUKKyNkZWZpbmUgX19OUl9sc3RhdDY0CQkxOTYKKyNkZWZpbmUgX19OUl9mc3RhdDY0CQkxOTcKKyNkZWZpbmUgX19OUl9sY2hvd24zMgkJMTk4CisjZGVmaW5lIF9fTlJfZ2V0dWlkMzIJCTE5OQorI2RlZmluZSBfX05SX2dldGdpZDMyCQkyMDAKKyNkZWZpbmUgX19OUl9nZXRldWlkMzIJCTIwMQorI2RlZmluZSBfX05SX2dldGVnaWQzMgkJMjAyCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQzMgkJMjAzCisjZGVmaW5lIF9fTlJfc2V0cmVnaWQzMgkJMjA0CisjZGVmaW5lIF9fTlJfZ2V0Z3JvdXBzMzIJMjA1CisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzMzIJMjA2CisjZGVmaW5lIF9fTlJfZmNob3duMzIJCTIwNworI2RlZmluZSBfX05SX3NldHJlc3VpZDMyCTIwOAorI2RlZmluZSBfX05SX2dldHJlc3VpZDMyCTIwOQorI2RlZmluZSBfX05SX3NldHJlc2dpZDMyCTIxMAorI2RlZmluZSBfX05SX2dldHJlc2dpZDMyCTIxMQorI2RlZmluZSBfX05SX2Nob3duMzIJCTIxMgorI2RlZmluZSBfX05SX3NldHVpZDMyCQkyMTMKKyNkZWZpbmUgX19OUl9zZXRnaWQzMgkJMjE0CisjZGVmaW5lIF9fTlJfc2V0ZnN1aWQzMgkJMjE1CisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQzMgkJMjE2CisjZGVmaW5lIF9fTlJfcGl2b3Rfcm9vdAkJMjE3CisjZGVmaW5lIF9fTlJfbWluY29yZQkJMjE4CisjZGVmaW5lIF9fTlJfbWFkdmlzZQkJMjE5CisjZGVmaW5lIF9fTlJfbWFkdmlzZTEJCTIxOQkvKiBkZWxldGUgd2hlbiBDIGxpYiBzdHViIGlzIHJlbW92ZWQgKi8KKyNkZWZpbmUgX19OUl9nZXRkZW50czY0CQkyMjAKKyNkZWZpbmUgX19OUl9mY250bDY0CQkyMjEKKy8qIDIyMyBpcyB1bnVzZWQgKi8KKyNkZWZpbmUgX19OUl9nZXR0aWQJCTIyNAorI2RlZmluZSBfX05SX3JlYWRhaGVhZAkJMjI1CisjZGVmaW5lIF9fTlJfc2V0eGF0dHIJCTIyNgorI2RlZmluZSBfX05SX2xzZXR4YXR0cgkJMjI3CisjZGVmaW5lIF9fTlJfZnNldHhhdHRyCQkyMjgKKyNkZWZpbmUgX19OUl9nZXR4YXR0cgkJMjI5CisjZGVmaW5lIF9fTlJfbGdldHhhdHRyCQkyMzAKKyNkZWZpbmUgX19OUl9mZ2V0eGF0dHIJCTIzMQorI2RlZmluZSBfX05SX2xpc3R4YXR0cgkJMjMyCisjZGVmaW5lIF9fTlJfbGxpc3R4YXR0cgkJMjMzCisjZGVmaW5lIF9fTlJfZmxpc3R4YXR0cgkJMjM0CisjZGVmaW5lIF9fTlJfcmVtb3ZleGF0dHIJMjM1CisjZGVmaW5lIF9fTlJfbHJlbW92ZXhhdHRyCTIzNgorI2RlZmluZSBfX05SX2ZyZW1vdmV4YXR0cgkyMzcKKyNkZWZpbmUgX19OUl90a2lsbAkJMjM4CisjZGVmaW5lIF9fTlJfc2VuZGZpbGU2NAkJMjM5CisjZGVmaW5lIF9fTlJfZnV0ZXgJCTI0MAorI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5CTI0MQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5CTI0MgorI2RlZmluZSBfX05SX3NldF90aHJlYWRfYXJlYQkyNDMKKyNkZWZpbmUgX19OUl9nZXRfdGhyZWFkX2FyZWEJMjQ0CisjZGVmaW5lIF9fTlJfaW9fc2V0dXAJCTI0NQorI2RlZmluZSBfX05SX2lvX2Rlc3Ryb3kJCTI0NgorI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkyNDcKKyNkZWZpbmUgX19OUl9pb19zdWJtaXQJCTI0OAorI2RlZmluZSBfX05SX2lvX2NhbmNlbAkJMjQ5CisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0CQkyNTAKKy8qIDI1MSBpcyBhdmFpbGFibGUgZm9yIHJldXNlICh3YXMgYnJpZWZseSBzeXNfc2V0X3pvbmVfcmVjbGFpbSkgKi8KKyNkZWZpbmUgX19OUl9leGl0X2dyb3VwCQkyNTIKKyNkZWZpbmUgX19OUl9sb29rdXBfZGNvb2tpZQkyNTMKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUJMjU0CisjZGVmaW5lIF9fTlJfZXBvbGxfY3RsCQkyNTUKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0CQkyNTYKKyNkZWZpbmUgX19OUl9yZW1hcF9maWxlX3BhZ2VzCTI1NworI2RlZmluZSBfX05SX3NldF90aWRfYWRkcmVzcwkyNTgKKyNkZWZpbmUgX19OUl90aW1lcl9jcmVhdGUJMjU5CisjZGVmaW5lIF9fTlJfdGltZXJfc2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrMSkKKyNkZWZpbmUgX19OUl90aW1lcl9nZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSsyKQorI2RlZmluZSBfX05SX3RpbWVyX2dldG92ZXJydW4JKF9fTlJfdGltZXJfY3JlYXRlKzMpCisjZGVmaW5lIF9fTlJfdGltZXJfZGVsZXRlCShfX05SX3RpbWVyX2NyZWF0ZSs0KQorI2RlZmluZSBfX05SX2Nsb2NrX3NldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzUpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrNikKKyNkZWZpbmUgX19OUl9jbG9ja19nZXRyZXMJKF9fTlJfdGltZXJfY3JlYXRlKzcpCisjZGVmaW5lIF9fTlJfY2xvY2tfbmFub3NsZWVwCShfX05SX3RpbWVyX2NyZWF0ZSs4KQorI2RlZmluZSBfX05SX3N0YXRmczY0CQkyNjgKKyNkZWZpbmUgX19OUl9mc3RhdGZzNjQJCTI2OQorI2RlZmluZSBfX05SX3Rna2lsbAkJMjcwCisjZGVmaW5lIF9fTlJfdXRpbWVzCQkyNzEKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjRfNjQJMjcyCisjZGVmaW5lIF9fTlJfdnNlcnZlcgkJMjczCisjZGVmaW5lIF9fTlJfbWJpbmQJCTI3NAorI2RlZmluZSBfX05SX2dldF9tZW1wb2xpY3kJMjc1CisjZGVmaW5lIF9fTlJfc2V0X21lbXBvbGljeQkyNzYKKyNkZWZpbmUgX19OUl9tcV9vcGVuIAkJMjc3CisjZGVmaW5lIF9fTlJfbXFfdW5saW5rCQkoX19OUl9tcV9vcGVuKzEpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRzZW5kCShfX05SX21xX29wZW4rMikKKyNkZWZpbmUgX19OUl9tcV90aW1lZHJlY2VpdmUJKF9fTlJfbXFfb3BlbiszKQorI2RlZmluZSBfX05SX21xX25vdGlmeQkJKF9fTlJfbXFfb3Blbis0KQorI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIJKF9fTlJfbXFfb3Blbis1KQorI2RlZmluZSBfX05SX2tleGVjX2xvYWQJCTI4MworI2RlZmluZSBfX05SX3dhaXRpZAkJMjg0CisvKiAjZGVmaW5lIF9fTlJfc3lzX3NldGFsdHJvb3QJMjg1ICovCisjZGVmaW5lIF9fTlJfYWRkX2tleQkJMjg2CisjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjg3CisjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODgKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyOTAKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJMjkxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJMjkyCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyOTMKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI5NAorI2RlZmluZSBfX05SX29wZW5hdAkJMjk1CisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjk2CisjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjk3CisjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5OAorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjk5CisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkzMDAKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMzAxCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTMwMgorI2RlZmluZSBfX05SX2xpbmthdAkJMzAzCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkzMDQKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkzMDUKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMzA2CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkzMDcKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMzA4CisjZGVmaW5lIF9fTlJfcHBvbGwJCTMwOQorI2RlZmluZSBfX05SX3Vuc2hhcmUJCTMxMAorI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMTEKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzEyCisjZGVmaW5lIF9fTlJfc3BsaWNlCQkzMTMKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMzE0CisjZGVmaW5lIF9fTlJfdGVlCQkzMTUKKyNkZWZpbmUgX19OUl92bXNwbGljZQkJMzE2CisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMyMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMjEKKyNkZWZpbmUgX19OUl90aW1lcmZkCQkzMjIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMjMKKyNkZWZpbmUgX19OUl9mYWxsb2NhdGUJCTMyNAorCisjZW5kaWYgLyogX0FTTV9JMzg2X1VOSVNURF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU2MjBhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKQEAgLTAsMCArMSw2NjUgQEAKKyNpZm5kZWYgX0FTTV9YODZfNjRfVU5JU1REX0hfCisjZGVmaW5lIF9BU01fWDg2XzY0X1VOSVNURF9IXworCisjaWZuZGVmIF9fU1lTQ0FMTAorI2RlZmluZSBfX1NZU0NBTEwoYSxiKQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN5c3RlbSBjYWxsIG51bWJlcnMuCisgKgorICogTm90ZTogaG9sZXMgYXJlIG5vdCBhbGxvd2VkLgorICovCisKKy8qIGF0IGxlYXN0IDggc3lzY2FsbCBwZXIgY2FjaGVsaW5lICovCisjZGVmaW5lIF9fTlJfcmVhZAkJCQkwCitfX1NZU0NBTEwoX19OUl9yZWFkLCBzeXNfcmVhZCkKKyNkZWZpbmUgX19OUl93cml0ZQkJCQkxCitfX1NZU0NBTEwoX19OUl93cml0ZSwgc3lzX3dyaXRlKQorI2RlZmluZSBfX05SX29wZW4JCQkJMgorX19TWVNDQUxMKF9fTlJfb3Blbiwgc3lzX29wZW4pCisjZGVmaW5lIF9fTlJfY2xvc2UJCQkJMworX19TWVNDQUxMKF9fTlJfY2xvc2UsIHN5c19jbG9zZSkKKyNkZWZpbmUgX19OUl9zdGF0CQkJCTQKK19fU1lTQ0FMTChfX05SX3N0YXQsIHN5c19uZXdzdGF0KQorI2RlZmluZSBfX05SX2ZzdGF0CQkJCTUKK19fU1lTQ0FMTChfX05SX2ZzdGF0LCBzeXNfbmV3ZnN0YXQpCisjZGVmaW5lIF9fTlJfbHN0YXQJCQkJNgorX19TWVNDQUxMKF9fTlJfbHN0YXQsIHN5c19uZXdsc3RhdCkKKyNkZWZpbmUgX19OUl9wb2xsCQkJCTcKK19fU1lTQ0FMTChfX05SX3BvbGwsIHN5c19wb2xsKQorCisjZGVmaW5lIF9fTlJfbHNlZWsJCQkJOAorX19TWVNDQUxMKF9fTlJfbHNlZWssIHN5c19sc2VlaykKKyNkZWZpbmUgX19OUl9tbWFwCQkJCTkKK19fU1lTQ0FMTChfX05SX21tYXAsIHN5c19tbWFwKQorI2RlZmluZSBfX05SX21wcm90ZWN0CQkJCTEwCitfX1NZU0NBTEwoX19OUl9tcHJvdGVjdCwgc3lzX21wcm90ZWN0KQorI2RlZmluZSBfX05SX211bm1hcAkJCQkxMQorX19TWVNDQUxMKF9fTlJfbXVubWFwLCBzeXNfbXVubWFwKQorI2RlZmluZSBfX05SX2JyawkJCQkxMgorX19TWVNDQUxMKF9fTlJfYnJrLCBzeXNfYnJrKQorI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbgkJCTEzCitfX1NZU0NBTEwoX19OUl9ydF9zaWdhY3Rpb24sIHN5c19ydF9zaWdhY3Rpb24pCisjZGVmaW5lIF9fTlJfcnRfc2lncHJvY21hc2sJCQkxNAorX19TWVNDQUxMKF9fTlJfcnRfc2lncHJvY21hc2ssIHN5c19ydF9zaWdwcm9jbWFzaykKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4JCQkxNQorX19TWVNDQUxMKF9fTlJfcnRfc2lncmV0dXJuLCBzdHViX3J0X3NpZ3JldHVybikKKworI2RlZmluZSBfX05SX2lvY3RsCQkJCTE2CitfX1NZU0NBTEwoX19OUl9pb2N0bCwgc3lzX2lvY3RsKQorI2RlZmluZSBfX05SX3ByZWFkNjQJCQkJMTcKK19fU1lTQ0FMTChfX05SX3ByZWFkNjQsIHN5c19wcmVhZDY0KQorI2RlZmluZSBfX05SX3B3cml0ZTY0CQkJCTE4CitfX1NZU0NBTEwoX19OUl9wd3JpdGU2NCwgc3lzX3B3cml0ZTY0KQorI2RlZmluZSBfX05SX3JlYWR2CQkJCTE5CitfX1NZU0NBTEwoX19OUl9yZWFkdiwgc3lzX3JlYWR2KQorI2RlZmluZSBfX05SX3dyaXRldgkJCQkyMAorX19TWVNDQUxMKF9fTlJfd3JpdGV2LCBzeXNfd3JpdGV2KQorI2RlZmluZSBfX05SX2FjY2VzcwkJCQkyMQorX19TWVNDQUxMKF9fTlJfYWNjZXNzLCBzeXNfYWNjZXNzKQorI2RlZmluZSBfX05SX3BpcGUJCQkJMjIKK19fU1lTQ0FMTChfX05SX3BpcGUsIHN5c19waXBlKQorI2RlZmluZSBfX05SX3NlbGVjdAkJCQkyMworX19TWVNDQUxMKF9fTlJfc2VsZWN0LCBzeXNfc2VsZWN0KQorCisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCQkyNAorX19TWVNDQUxMKF9fTlJfc2NoZWRfeWllbGQsIHN5c19zY2hlZF95aWVsZCkKKyNkZWZpbmUgX19OUl9tcmVtYXAJCQkJMjUKK19fU1lTQ0FMTChfX05SX21yZW1hcCwgc3lzX21yZW1hcCkKKyNkZWZpbmUgX19OUl9tc3luYwkJCQkyNgorX19TWVNDQUxMKF9fTlJfbXN5bmMsIHN5c19tc3luYykKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkJCTI3CitfX1NZU0NBTEwoX19OUl9taW5jb3JlLCBzeXNfbWluY29yZSkKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkJCTI4CitfX1NZU0NBTEwoX19OUl9tYWR2aXNlLCBzeXNfbWFkdmlzZSkKKyNkZWZpbmUgX19OUl9zaG1nZXQJCQkJMjkKK19fU1lTQ0FMTChfX05SX3NobWdldCwgc3lzX3NobWdldCkKKyNkZWZpbmUgX19OUl9zaG1hdAkJCQkzMAorX19TWVNDQUxMKF9fTlJfc2htYXQsIHN5c19zaG1hdCkKKyNkZWZpbmUgX19OUl9zaG1jdGwJCQkJMzEKK19fU1lTQ0FMTChfX05SX3NobWN0bCwgc3lzX3NobWN0bCkKKworI2RlZmluZSBfX05SX2R1cAkJCQkzMgorX19TWVNDQUxMKF9fTlJfZHVwLCBzeXNfZHVwKQorI2RlZmluZSBfX05SX2R1cDIJCQkJMzMKK19fU1lTQ0FMTChfX05SX2R1cDIsIHN5c19kdXAyKQorI2RlZmluZSBfX05SX3BhdXNlCQkJCTM0CitfX1NZU0NBTEwoX19OUl9wYXVzZSwgc3lzX3BhdXNlKQorI2RlZmluZSBfX05SX25hbm9zbGVlcAkJCQkzNQorX19TWVNDQUxMKF9fTlJfbmFub3NsZWVwLCBzeXNfbmFub3NsZWVwKQorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJCQkzNgorX19TWVNDQUxMKF9fTlJfZ2V0aXRpbWVyLCBzeXNfZ2V0aXRpbWVyKQorI2RlZmluZSBfX05SX2FsYXJtCQkJCTM3CitfX1NZU0NBTEwoX19OUl9hbGFybSwgc3lzX2FsYXJtKQorI2RlZmluZSBfX05SX3NldGl0aW1lcgkJCQkzOAorX19TWVNDQUxMKF9fTlJfc2V0aXRpbWVyLCBzeXNfc2V0aXRpbWVyKQorI2RlZmluZSBfX05SX2dldHBpZAkJCQkzOQorX19TWVNDQUxMKF9fTlJfZ2V0cGlkLCBzeXNfZ2V0cGlkKQorCisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCQkJNDAKK19fU1lTQ0FMTChfX05SX3NlbmRmaWxlLCBzeXNfc2VuZGZpbGU2NCkKKyNkZWZpbmUgX19OUl9zb2NrZXQJCQkJNDEKK19fU1lTQ0FMTChfX05SX3NvY2tldCwgc3lzX3NvY2tldCkKKyNkZWZpbmUgX19OUl9jb25uZWN0CQkJCTQyCitfX1NZU0NBTEwoX19OUl9jb25uZWN0LCBzeXNfY29ubmVjdCkKKyNkZWZpbmUgX19OUl9hY2NlcHQJCQkJNDMKK19fU1lTQ0FMTChfX05SX2FjY2VwdCwgc3lzX2FjY2VwdCkKKyNkZWZpbmUgX19OUl9zZW5kdG8JCQkJNDQKK19fU1lTQ0FMTChfX05SX3NlbmR0bywgc3lzX3NlbmR0bykKKyNkZWZpbmUgX19OUl9yZWN2ZnJvbQkJCQk0NQorX19TWVNDQUxMKF9fTlJfcmVjdmZyb20sIHN5c19yZWN2ZnJvbSkKKyNkZWZpbmUgX19OUl9zZW5kbXNnCQkJCTQ2CitfX1NZU0NBTEwoX19OUl9zZW5kbXNnLCBzeXNfc2VuZG1zZykKKyNkZWZpbmUgX19OUl9yZWN2bXNnCQkJCTQ3CitfX1NZU0NBTEwoX19OUl9yZWN2bXNnLCBzeXNfcmVjdm1zZykKKworI2RlZmluZSBfX05SX3NodXRkb3duCQkJCTQ4CitfX1NZU0NBTEwoX19OUl9zaHV0ZG93biwgc3lzX3NodXRkb3duKQorI2RlZmluZSBfX05SX2JpbmQJCQkJNDkKK19fU1lTQ0FMTChfX05SX2JpbmQsIHN5c19iaW5kKQorI2RlZmluZSBfX05SX2xpc3RlbgkJCQk1MAorX19TWVNDQUxMKF9fTlJfbGlzdGVuLCBzeXNfbGlzdGVuKQorI2RlZmluZSBfX05SX2dldHNvY2tuYW1lCQkJNTEKK19fU1lTQ0FMTChfX05SX2dldHNvY2tuYW1lLCBzeXNfZ2V0c29ja25hbWUpCisjZGVmaW5lIF9fTlJfZ2V0cGVlcm5hbWUJCQk1MgorX19TWVNDQUxMKF9fTlJfZ2V0cGVlcm5hbWUsIHN5c19nZXRwZWVybmFtZSkKKyNkZWZpbmUgX19OUl9zb2NrZXRwYWlyCQkJCTUzCitfX1NZU0NBTEwoX19OUl9zb2NrZXRwYWlyLCBzeXNfc29ja2V0cGFpcikKKyNkZWZpbmUgX19OUl9zZXRzb2Nrb3B0CQkJCTU0CitfX1NZU0NBTEwoX19OUl9zZXRzb2Nrb3B0LCBzeXNfc2V0c29ja29wdCkKKyNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0CQkJCTU1CitfX1NZU0NBTEwoX19OUl9nZXRzb2Nrb3B0LCBzeXNfZ2V0c29ja29wdCkKKworI2RlZmluZSBfX05SX2Nsb25lCQkJCTU2CitfX1NZU0NBTEwoX19OUl9jbG9uZSwgc3R1Yl9jbG9uZSkKKyNkZWZpbmUgX19OUl9mb3JrCQkJCTU3CitfX1NZU0NBTEwoX19OUl9mb3JrLCBzdHViX2ZvcmspCisjZGVmaW5lIF9fTlJfdmZvcmsJCQkJNTgKK19fU1lTQ0FMTChfX05SX3Zmb3JrLCBzdHViX3Zmb3JrKQorI2RlZmluZSBfX05SX2V4ZWN2ZQkJCQk1OQorX19TWVNDQUxMKF9fTlJfZXhlY3ZlLCBzdHViX2V4ZWN2ZSkKKyNkZWZpbmUgX19OUl9leGl0CQkJCTYwCitfX1NZU0NBTEwoX19OUl9leGl0LCBzeXNfZXhpdCkKKyNkZWZpbmUgX19OUl93YWl0NAkJCQk2MQorX19TWVNDQUxMKF9fTlJfd2FpdDQsIHN5c193YWl0NCkKKyNkZWZpbmUgX19OUl9raWxsCQkJCTYyCitfX1NZU0NBTEwoX19OUl9raWxsLCBzeXNfa2lsbCkKKyNkZWZpbmUgX19OUl91bmFtZQkJCQk2MworX19TWVNDQUxMKF9fTlJfdW5hbWUsIHN5c191bmFtZSkKKworI2RlZmluZSBfX05SX3NlbWdldAkJCQk2NAorX19TWVNDQUxMKF9fTlJfc2VtZ2V0LCBzeXNfc2VtZ2V0KQorI2RlZmluZSBfX05SX3NlbW9wCQkJCTY1CitfX1NZU0NBTEwoX19OUl9zZW1vcCwgc3lzX3NlbW9wKQorI2RlZmluZSBfX05SX3NlbWN0bAkJCQk2NgorX19TWVNDQUxMKF9fTlJfc2VtY3RsLCBzeXNfc2VtY3RsKQorI2RlZmluZSBfX05SX3NobWR0CQkJCTY3CitfX1NZU0NBTEwoX19OUl9zaG1kdCwgc3lzX3NobWR0KQorI2RlZmluZSBfX05SX21zZ2dldAkJCQk2OAorX19TWVNDQUxMKF9fTlJfbXNnZ2V0LCBzeXNfbXNnZ2V0KQorI2RlZmluZSBfX05SX21zZ3NuZAkJCQk2OQorX19TWVNDQUxMKF9fTlJfbXNnc25kLCBzeXNfbXNnc25kKQorI2RlZmluZSBfX05SX21zZ3JjdgkJCQk3MAorX19TWVNDQUxMKF9fTlJfbXNncmN2LCBzeXNfbXNncmN2KQorI2RlZmluZSBfX05SX21zZ2N0bAkJCQk3MQorX19TWVNDQUxMKF9fTlJfbXNnY3RsLCBzeXNfbXNnY3RsKQorCisjZGVmaW5lIF9fTlJfZmNudGwJCQkJNzIKK19fU1lTQ0FMTChfX05SX2ZjbnRsLCBzeXNfZmNudGwpCisjZGVmaW5lIF9fTlJfZmxvY2sJCQkJNzMKK19fU1lTQ0FMTChfX05SX2Zsb2NrLCBzeXNfZmxvY2spCisjZGVmaW5lIF9fTlJfZnN5bmMJCQkJNzQKK19fU1lTQ0FMTChfX05SX2ZzeW5jLCBzeXNfZnN5bmMpCisjZGVmaW5lIF9fTlJfZmRhdGFzeW5jCQkJCTc1CitfX1NZU0NBTEwoX19OUl9mZGF0YXN5bmMsIHN5c19mZGF0YXN5bmMpCisjZGVmaW5lIF9fTlJfdHJ1bmNhdGUJCQkJNzYKK19fU1lTQ0FMTChfX05SX3RydW5jYXRlLCBzeXNfdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkJCTc3CitfX1NZU0NBTEwoX19OUl9mdHJ1bmNhdGUsIHN5c19mdHJ1bmNhdGUpCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMJCQkJNzgKK19fU1lTQ0FMTChfX05SX2dldGRlbnRzLCBzeXNfZ2V0ZGVudHMpCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkJCTc5CitfX1NZU0NBTEwoX19OUl9nZXRjd2QsIHN5c19nZXRjd2QpCisKKyNkZWZpbmUgX19OUl9jaGRpcgkJCQk4MAorX19TWVNDQUxMKF9fTlJfY2hkaXIsIHN5c19jaGRpcikKKyNkZWZpbmUgX19OUl9mY2hkaXIJCQkJODEKK19fU1lTQ0FMTChfX05SX2ZjaGRpciwgc3lzX2ZjaGRpcikKKyNkZWZpbmUgX19OUl9yZW5hbWUJCQkJODIKK19fU1lTQ0FMTChfX05SX3JlbmFtZSwgc3lzX3JlbmFtZSkKKyNkZWZpbmUgX19OUl9ta2RpcgkJCQk4MworX19TWVNDQUxMKF9fTlJfbWtkaXIsIHN5c19ta2RpcikKKyNkZWZpbmUgX19OUl9ybWRpcgkJCQk4NAorX19TWVNDQUxMKF9fTlJfcm1kaXIsIHN5c19ybWRpcikKKyNkZWZpbmUgX19OUl9jcmVhdAkJCQk4NQorX19TWVNDQUxMKF9fTlJfY3JlYXQsIHN5c19jcmVhdCkKKyNkZWZpbmUgX19OUl9saW5rCQkJCTg2CitfX1NZU0NBTEwoX19OUl9saW5rLCBzeXNfbGluaykKKyNkZWZpbmUgX19OUl91bmxpbmsJCQkJODcKK19fU1lTQ0FMTChfX05SX3VubGluaywgc3lzX3VubGluaykKKworI2RlZmluZSBfX05SX3N5bWxpbmsJCQkJODgKK19fU1lTQ0FMTChfX05SX3N5bWxpbmssIHN5c19zeW1saW5rKQorI2RlZmluZSBfX05SX3JlYWRsaW5rCQkJCTg5CitfX1NZU0NBTEwoX19OUl9yZWFkbGluaywgc3lzX3JlYWRsaW5rKQorI2RlZmluZSBfX05SX2NobW9kCQkJCTkwCitfX1NZU0NBTEwoX19OUl9jaG1vZCwgc3lzX2NobW9kKQorI2RlZmluZSBfX05SX2ZjaG1vZAkJCQk5MQorX19TWVNDQUxMKF9fTlJfZmNobW9kLCBzeXNfZmNobW9kKQorI2RlZmluZSBfX05SX2Nob3duCQkJCTkyCitfX1NZU0NBTEwoX19OUl9jaG93biwgc3lzX2Nob3duKQorI2RlZmluZSBfX05SX2ZjaG93bgkJCQk5MworX19TWVNDQUxMKF9fTlJfZmNob3duLCBzeXNfZmNob3duKQorI2RlZmluZSBfX05SX2xjaG93bgkJCQk5NAorX19TWVNDQUxMKF9fTlJfbGNob3duLCBzeXNfbGNob3duKQorI2RlZmluZSBfX05SX3VtYXNrCQkJCTk1CitfX1NZU0NBTEwoX19OUl91bWFzaywgc3lzX3VtYXNrKQorCisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5CQkJOTYKK19fU1lTQ0FMTChfX05SX2dldHRpbWVvZmRheSwgc3lzX2dldHRpbWVvZmRheSkKKyNkZWZpbmUgX19OUl9nZXRybGltaXQJCQkJOTcKK19fU1lTQ0FMTChfX05SX2dldHJsaW1pdCwgc3lzX2dldHJsaW1pdCkKKyNkZWZpbmUgX19OUl9nZXRydXNhZ2UJCQkJOTgKK19fU1lTQ0FMTChfX05SX2dldHJ1c2FnZSwgc3lzX2dldHJ1c2FnZSkKKyNkZWZpbmUgX19OUl9zeXNpbmZvCQkJCTk5CitfX1NZU0NBTEwoX19OUl9zeXNpbmZvLCBzeXNfc3lzaW5mbykKKyNkZWZpbmUgX19OUl90aW1lcwkJCQkxMDAKK19fU1lTQ0FMTChfX05SX3RpbWVzLCBzeXNfdGltZXMpCisjZGVmaW5lIF9fTlJfcHRyYWNlCQkJCTEwMQorX19TWVNDQUxMKF9fTlJfcHRyYWNlLCBzeXNfcHRyYWNlKQorI2RlZmluZSBfX05SX2dldHVpZAkJCQkxMDIKK19fU1lTQ0FMTChfX05SX2dldHVpZCwgc3lzX2dldHVpZCkKKyNkZWZpbmUgX19OUl9zeXNsb2cJCQkJMTAzCitfX1NZU0NBTEwoX19OUl9zeXNsb2csIHN5c19zeXNsb2cpCisKKy8qIGF0IHRoZSB2ZXJ5IGVuZCB0aGUgc3R1ZmYgdGhhdCBuZXZlciBydW5zIGR1cmluZyB0aGUgYmVuY2htYXJrcyAqLworI2RlZmluZSBfX05SX2dldGdpZAkJCQkxMDQKK19fU1lTQ0FMTChfX05SX2dldGdpZCwgc3lzX2dldGdpZCkKKyNkZWZpbmUgX19OUl9zZXR1aWQJCQkJMTA1CitfX1NZU0NBTEwoX19OUl9zZXR1aWQsIHN5c19zZXR1aWQpCisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkJCTEwNgorX19TWVNDQUxMKF9fTlJfc2V0Z2lkLCBzeXNfc2V0Z2lkKQorI2RlZmluZSBfX05SX2dldGV1aWQJCQkJMTA3CitfX1NZU0NBTEwoX19OUl9nZXRldWlkLCBzeXNfZ2V0ZXVpZCkKKyNkZWZpbmUgX19OUl9nZXRlZ2lkCQkJCTEwOAorX19TWVNDQUxMKF9fTlJfZ2V0ZWdpZCwgc3lzX2dldGVnaWQpCisjZGVmaW5lIF9fTlJfc2V0cGdpZAkJCQkxMDkKK19fU1lTQ0FMTChfX05SX3NldHBnaWQsIHN5c19zZXRwZ2lkKQorI2RlZmluZSBfX05SX2dldHBwaWQJCQkJMTEwCitfX1NZU0NBTEwoX19OUl9nZXRwcGlkLCBzeXNfZ2V0cHBpZCkKKyNkZWZpbmUgX19OUl9nZXRwZ3JwCQkJCTExMQorX19TWVNDQUxMKF9fTlJfZ2V0cGdycCwgc3lzX2dldHBncnApCisKKyNkZWZpbmUgX19OUl9zZXRzaWQJCQkJMTEyCitfX1NZU0NBTEwoX19OUl9zZXRzaWQsIHN5c19zZXRzaWQpCisjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCQkJMTEzCitfX1NZU0NBTEwoX19OUl9zZXRyZXVpZCwgc3lzX3NldHJldWlkKQorI2RlZmluZSBfX05SX3NldHJlZ2lkCQkJCTExNAorX19TWVNDQUxMKF9fTlJfc2V0cmVnaWQsIHN5c19zZXRyZWdpZCkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMJCQkJMTE1CitfX1NZU0NBTEwoX19OUl9nZXRncm91cHMsIHN5c19nZXRncm91cHMpCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzCQkJCTExNgorX19TWVNDQUxMKF9fTlJfc2V0Z3JvdXBzLCBzeXNfc2V0Z3JvdXBzKQorI2RlZmluZSBfX05SX3NldHJlc3VpZAkJCQkxMTcKK19fU1lTQ0FMTChfX05SX3NldHJlc3VpZCwgc3lzX3NldHJlc3VpZCkKKyNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCQkJMTE4CitfX1NZU0NBTEwoX19OUl9nZXRyZXN1aWQsIHN5c19nZXRyZXN1aWQpCisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkCQkJCTExOQorX19TWVNDQUxMKF9fTlJfc2V0cmVzZ2lkLCBzeXNfc2V0cmVzZ2lkKQorCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkCQkJCTEyMAorX19TWVNDQUxMKF9fTlJfZ2V0cmVzZ2lkLCBzeXNfZ2V0cmVzZ2lkKQorI2RlZmluZSBfX05SX2dldHBnaWQJCQkJMTIxCitfX1NZU0NBTEwoX19OUl9nZXRwZ2lkLCBzeXNfZ2V0cGdpZCkKKyNkZWZpbmUgX19OUl9zZXRmc3VpZAkJCQkxMjIKK19fU1lTQ0FMTChfX05SX3NldGZzdWlkLCBzeXNfc2V0ZnN1aWQpCisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCQkJMTIzCitfX1NZU0NBTEwoX19OUl9zZXRmc2dpZCwgc3lzX3NldGZzZ2lkKQorI2RlZmluZSBfX05SX2dldHNpZAkJCQkxMjQKK19fU1lTQ0FMTChfX05SX2dldHNpZCwgc3lzX2dldHNpZCkKKyNkZWZpbmUgX19OUl9jYXBnZXQJCQkJMTI1CitfX1NZU0NBTEwoX19OUl9jYXBnZXQsIHN5c19jYXBnZXQpCisjZGVmaW5lIF9fTlJfY2Fwc2V0CQkJCTEyNgorX19TWVNDQUxMKF9fTlJfY2Fwc2V0LCBzeXNfY2Fwc2V0KQorCisjZGVmaW5lIF9fTlJfcnRfc2lncGVuZGluZwkJCTEyNworX19TWVNDQUxMKF9fTlJfcnRfc2lncGVuZGluZywgc3lzX3J0X3NpZ3BlbmRpbmcpCisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0CQkJMTI4CitfX1NZU0NBTEwoX19OUl9ydF9zaWd0aW1lZHdhaXQsIHN5c19ydF9zaWd0aW1lZHdhaXQpCisjZGVmaW5lIF9fTlJfcnRfc2lncXVldWVpbmZvCQkJMTI5CitfX1NZU0NBTEwoX19OUl9ydF9zaWdxdWV1ZWluZm8sIHN5c19ydF9zaWdxdWV1ZWluZm8pCisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZAkJCTEzMAorX19TWVNDQUxMKF9fTlJfcnRfc2lnc3VzcGVuZCwgc3R1Yl9ydF9zaWdzdXNwZW5kKQorI2RlZmluZSBfX05SX3NpZ2FsdHN0YWNrCQkJMTMxCitfX1NZU0NBTEwoX19OUl9zaWdhbHRzdGFjaywgc3R1Yl9zaWdhbHRzdGFjaykKKyNkZWZpbmUgX19OUl91dGltZQkJCQkxMzIKK19fU1lTQ0FMTChfX05SX3V0aW1lLCBzeXNfdXRpbWUpCisjZGVmaW5lIF9fTlJfbWtub2QJCQkJMTMzCitfX1NZU0NBTEwoX19OUl9ta25vZCwgc3lzX21rbm9kKQorCisvKiBPbmx5IG5lZWRlZCBmb3IgYS5vdXQgKi8KKyNkZWZpbmUgX19OUl91c2VsaWIJCQkJMTM0CitfX1NZU0NBTEwoX19OUl91c2VsaWIsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3BlcnNvbmFsaXR5CQkJMTM1CitfX1NZU0NBTEwoX19OUl9wZXJzb25hbGl0eSwgc3lzX3BlcnNvbmFsaXR5KQorCisjZGVmaW5lIF9fTlJfdXN0YXQJCQkJMTM2CitfX1NZU0NBTEwoX19OUl91c3RhdCwgc3lzX3VzdGF0KQorI2RlZmluZSBfX05SX3N0YXRmcwkJCQkxMzcKK19fU1lTQ0FMTChfX05SX3N0YXRmcywgc3lzX3N0YXRmcykKKyNkZWZpbmUgX19OUl9mc3RhdGZzCQkJCTEzOAorX19TWVNDQUxMKF9fTlJfZnN0YXRmcywgc3lzX2ZzdGF0ZnMpCisjZGVmaW5lIF9fTlJfc3lzZnMJCQkJMTM5CitfX1NZU0NBTEwoX19OUl9zeXNmcywgc3lzX3N5c2ZzKQorCisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkJCQkxNDAKK19fU1lTQ0FMTChfX05SX2dldHByaW9yaXR5LCBzeXNfZ2V0cHJpb3JpdHkpCisjZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkJCQkxNDEKK19fU1lTQ0FMTChfX05SX3NldHByaW9yaXR5LCBzeXNfc2V0cHJpb3JpdHkpCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0JCQkxNDIKK19fU1lTQ0FMTChfX05SX3NjaGVkX3NldHBhcmFtLCBzeXNfc2NoZWRfc2V0cGFyYW0pCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0cGFyYW0JCQkxNDMKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldHBhcmFtLCBzeXNfc2NoZWRfZ2V0cGFyYW0pCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0c2NoZWR1bGVyCQkJMTQ0CitfX1NZU0NBTEwoX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIsIHN5c19zY2hlZF9zZXRzY2hlZHVsZXIpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyCQkJMTQ1CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRzY2hlZHVsZXIsIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIpCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAkJMTQ2CitfX1NZU0NBTEwoX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWF4LCBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluCQkxNDcKK19fU1lTQ0FMTChfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4sIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluKQorI2RlZmluZSBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbAkJMTQ4CitfX1NZU0NBTEwoX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwsIHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCisKKyNkZWZpbmUgX19OUl9tbG9jawkJCQkxNDkKK19fU1lTQ0FMTChfX05SX21sb2NrLCBzeXNfbWxvY2spCisjZGVmaW5lIF9fTlJfbXVubG9jawkJCQkxNTAKK19fU1lTQ0FMTChfX05SX211bmxvY2ssIHN5c19tdW5sb2NrKQorI2RlZmluZSBfX05SX21sb2NrYWxsCQkJCTE1MQorX19TWVNDQUxMKF9fTlJfbWxvY2thbGwsIHN5c19tbG9ja2FsbCkKKyNkZWZpbmUgX19OUl9tdW5sb2NrYWxsCQkJCTE1MgorX19TWVNDQUxMKF9fTlJfbXVubG9ja2FsbCwgc3lzX211bmxvY2thbGwpCisKKyNkZWZpbmUgX19OUl92aGFuZ3VwCQkJCTE1MworX19TWVNDQUxMKF9fTlJfdmhhbmd1cCwgc3lzX3ZoYW5ndXApCisKKyNkZWZpbmUgX19OUl9tb2RpZnlfbGR0CQkJCTE1NAorX19TWVNDQUxMKF9fTlJfbW9kaWZ5X2xkdCwgc3lzX21vZGlmeV9sZHQpCisKKyNkZWZpbmUgX19OUl9waXZvdF9yb290CQkJCTE1NQorX19TWVNDQUxMKF9fTlJfcGl2b3Rfcm9vdCwgc3lzX3Bpdm90X3Jvb3QpCisKKyNkZWZpbmUgX19OUl9fc3lzY3RsCQkJCTE1NgorX19TWVNDQUxMKF9fTlJfX3N5c2N0bCwgc3lzX3N5c2N0bCkKKworI2RlZmluZSBfX05SX3ByY3RsCQkJCTE1NworX19TWVNDQUxMKF9fTlJfcHJjdGwsIHN5c19wcmN0bCkKKyNkZWZpbmUgX19OUl9hcmNoX3ByY3RsCQkJCTE1OAorX19TWVNDQUxMKF9fTlJfYXJjaF9wcmN0bCwgc3lzX2FyY2hfcHJjdGwpCisKKyNkZWZpbmUgX19OUl9hZGp0aW1leAkJCQkxNTkKK19fU1lTQ0FMTChfX05SX2FkanRpbWV4LCBzeXNfYWRqdGltZXgpCisKKyNkZWZpbmUgX19OUl9zZXRybGltaXQJCQkJMTYwCitfX1NZU0NBTEwoX19OUl9zZXRybGltaXQsIHN5c19zZXRybGltaXQpCisKKyNkZWZpbmUgX19OUl9jaHJvb3QJCQkJMTYxCitfX1NZU0NBTEwoX19OUl9jaHJvb3QsIHN5c19jaHJvb3QpCisKKyNkZWZpbmUgX19OUl9zeW5jCQkJCTE2MgorX19TWVNDQUxMKF9fTlJfc3luYywgc3lzX3N5bmMpCisKKyNkZWZpbmUgX19OUl9hY2N0CQkJCTE2MworX19TWVNDQUxMKF9fTlJfYWNjdCwgc3lzX2FjY3QpCisKKyNkZWZpbmUgX19OUl9zZXR0aW1lb2ZkYXkJCQkxNjQKK19fU1lTQ0FMTChfX05SX3NldHRpbWVvZmRheSwgc3lzX3NldHRpbWVvZmRheSkKKworI2RlZmluZSBfX05SX21vdW50CQkJCTE2NQorX19TWVNDQUxMKF9fTlJfbW91bnQsIHN5c19tb3VudCkKKyNkZWZpbmUgX19OUl91bW91bnQyCQkJCTE2NgorX19TWVNDQUxMKF9fTlJfdW1vdW50Miwgc3lzX3Vtb3VudCkKKworI2RlZmluZSBfX05SX3N3YXBvbgkJCQkxNjcKK19fU1lTQ0FMTChfX05SX3N3YXBvbiwgc3lzX3N3YXBvbikKKyNkZWZpbmUgX19OUl9zd2Fwb2ZmCQkJCTE2OAorX19TWVNDQUxMKF9fTlJfc3dhcG9mZiwgc3lzX3N3YXBvZmYpCisKKyNkZWZpbmUgX19OUl9yZWJvb3QJCQkJMTY5CitfX1NZU0NBTEwoX19OUl9yZWJvb3QsIHN5c19yZWJvb3QpCisKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZQkJCTE3MAorX19TWVNDQUxMKF9fTlJfc2V0aG9zdG5hbWUsIHN5c19zZXRob3N0bmFtZSkKKyNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lCQkJMTcxCitfX1NZU0NBTEwoX19OUl9zZXRkb21haW5uYW1lLCBzeXNfc2V0ZG9tYWlubmFtZSkKKworI2RlZmluZSBfX05SX2lvcGwJCQkJMTcyCitfX1NZU0NBTEwoX19OUl9pb3BsLCBzdHViX2lvcGwpCisjZGVmaW5lIF9fTlJfaW9wZXJtCQkJCTE3MworX19TWVNDQUxMKF9fTlJfaW9wZXJtLCBzeXNfaW9wZXJtKQorCisjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkJCTE3NAorX19TWVNDQUxMKF9fTlJfY3JlYXRlX21vZHVsZSwgc3lzX25pX3N5c2NhbGwpCisjZGVmaW5lIF9fTlJfaW5pdF9tb2R1bGUJCQkxNzUKK19fU1lTQ0FMTChfX05SX2luaXRfbW9kdWxlLCBzeXNfaW5pdF9tb2R1bGUpCisjZGVmaW5lIF9fTlJfZGVsZXRlX21vZHVsZQkJCTE3NgorX19TWVNDQUxMKF9fTlJfZGVsZXRlX21vZHVsZSwgc3lzX2RlbGV0ZV9tb2R1bGUpCisjZGVmaW5lIF9fTlJfZ2V0X2tlcm5lbF9zeW1zCQkJMTc3CitfX1NZU0NBTEwoX19OUl9nZXRfa2VybmVsX3N5bXMsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkJCTE3OAorX19TWVNDQUxMKF9fTlJfcXVlcnlfbW9kdWxlLCBzeXNfbmlfc3lzY2FsbCkKKworI2RlZmluZSBfX05SX3F1b3RhY3RsCQkJCTE3OQorX19TWVNDQUxMKF9fTlJfcXVvdGFjdGwsIHN5c19xdW90YWN0bCkKKworI2RlZmluZSBfX05SX25mc3NlcnZjdGwJCQkJMTgwCitfX1NZU0NBTEwoX19OUl9uZnNzZXJ2Y3RsLCBzeXNfbmZzc2VydmN0bCkKKworLyogcmVzZXJ2ZWQgZm9yIExpUy9TVFJFQU1TICovCisjZGVmaW5lIF9fTlJfZ2V0cG1zZwkJCQkxODEKK19fU1lTQ0FMTChfX05SX2dldHBtc2csIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3B1dHBtc2cJCQkJMTgyCitfX1NZU0NBTEwoX19OUl9wdXRwbXNnLCBzeXNfbmlfc3lzY2FsbCkKKworLyogcmVzZXJ2ZWQgZm9yIEFGUyAqLworI2RlZmluZSBfX05SX2Fmc19zeXNjYWxsCQkJMTgzCitfX1NZU0NBTEwoX19OUl9hZnNfc3lzY2FsbCwgc3lzX25pX3N5c2NhbGwpCisKKy8qIHJlc2VydmVkIGZvciB0dXggKi8KKyNkZWZpbmUgX19OUl90dXhjYWxsCQkJCTE4NAorX19TWVNDQUxMKF9fTlJfdHV4Y2FsbCwgc3lzX25pX3N5c2NhbGwpCisKKyNkZWZpbmUgX19OUl9zZWN1cml0eQkJCQkxODUKK19fU1lTQ0FMTChfX05SX3NlY3VyaXR5LCBzeXNfbmlfc3lzY2FsbCkKKworI2RlZmluZSBfX05SX2dldHRpZAkJCQkxODYKK19fU1lTQ0FMTChfX05SX2dldHRpZCwgc3lzX2dldHRpZCkKKworI2RlZmluZSBfX05SX3JlYWRhaGVhZAkJCQkxODcKK19fU1lTQ0FMTChfX05SX3JlYWRhaGVhZCwgc3lzX3JlYWRhaGVhZCkKKyNkZWZpbmUgX19OUl9zZXR4YXR0cgkJCQkxODgKK19fU1lTQ0FMTChfX05SX3NldHhhdHRyLCBzeXNfc2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfbHNldHhhdHRyCQkJCTE4OQorX19TWVNDQUxMKF9fTlJfbHNldHhhdHRyLCBzeXNfbHNldHhhdHRyKQorI2RlZmluZSBfX05SX2ZzZXR4YXR0cgkJCQkxOTAKK19fU1lTQ0FMTChfX05SX2ZzZXR4YXR0ciwgc3lzX2ZzZXR4YXR0cikKKyNkZWZpbmUgX19OUl9nZXR4YXR0cgkJCQkxOTEKK19fU1lTQ0FMTChfX05SX2dldHhhdHRyLCBzeXNfZ2V0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGdldHhhdHRyCQkJCTE5MgorX19TWVNDQUxMKF9fTlJfbGdldHhhdHRyLCBzeXNfbGdldHhhdHRyKQorI2RlZmluZSBfX05SX2ZnZXR4YXR0cgkJCQkxOTMKK19fU1lTQ0FMTChfX05SX2ZnZXR4YXR0ciwgc3lzX2ZnZXR4YXR0cikKKyNkZWZpbmUgX19OUl9saXN0eGF0dHIJCQkJMTk0CitfX1NZU0NBTEwoX19OUl9saXN0eGF0dHIsIHN5c19saXN0eGF0dHIpCisjZGVmaW5lIF9fTlJfbGxpc3R4YXR0cgkJCQkxOTUKK19fU1lTQ0FMTChfX05SX2xsaXN0eGF0dHIsIHN5c19sbGlzdHhhdHRyKQorI2RlZmluZSBfX05SX2ZsaXN0eGF0dHIJCQkJMTk2CitfX1NZU0NBTEwoX19OUl9mbGlzdHhhdHRyLCBzeXNfZmxpc3R4YXR0cikKKyNkZWZpbmUgX19OUl9yZW1vdmV4YXR0cgkJCTE5NworX19TWVNDQUxMKF9fTlJfcmVtb3ZleGF0dHIsIHN5c19yZW1vdmV4YXR0cikKKyNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIJCQkxOTgKK19fU1lTQ0FMTChfX05SX2xyZW1vdmV4YXR0ciwgc3lzX2xyZW1vdmV4YXR0cikKKyNkZWZpbmUgX19OUl9mcmVtb3ZleGF0dHIJCQkxOTkKK19fU1lTQ0FMTChfX05SX2ZyZW1vdmV4YXR0ciwgc3lzX2ZyZW1vdmV4YXR0cikKKyNkZWZpbmUgX19OUl90a2lsbAkJCQkyMDAKK19fU1lTQ0FMTChfX05SX3RraWxsLCBzeXNfdGtpbGwpCisjZGVmaW5lIF9fTlJfdGltZQkJCQkyMDEKK19fU1lTQ0FMTChfX05SX3RpbWUsIHN5c190aW1lKQorI2RlZmluZSBfX05SX2Z1dGV4CQkJCTIwMgorX19TWVNDQUxMKF9fTlJfZnV0ZXgsIHN5c19mdXRleCkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eQkJCTIwMworX19TWVNDQUxMKF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIHN5c19zY2hlZF9zZXRhZmZpbml0eSkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eQkJCTIwNAorX19TWVNDQUxMKF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHksIHN5c19zY2hlZF9nZXRhZmZpbml0eSkKKyNkZWZpbmUgX19OUl9zZXRfdGhyZWFkX2FyZWEJCQkyMDUKK19fU1lTQ0FMTChfX05SX3NldF90aHJlYWRfYXJlYSwgc3lzX25pX3N5c2NhbGwpCS8qIHVzZSBhcmNoX3ByY3RsICovCisjZGVmaW5lIF9fTlJfaW9fc2V0dXAJCQkJMjA2CitfX1NZU0NBTEwoX19OUl9pb19zZXR1cCwgc3lzX2lvX3NldHVwKQorI2RlZmluZSBfX05SX2lvX2Rlc3Ryb3kJCQkJMjA3CitfX1NZU0NBTEwoX19OUl9pb19kZXN0cm95LCBzeXNfaW9fZGVzdHJveSkKKyNkZWZpbmUgX19OUl9pb19nZXRldmVudHMJCQkyMDgKK19fU1lTQ0FMTChfX05SX2lvX2dldGV2ZW50cywgc3lzX2lvX2dldGV2ZW50cykKKyNkZWZpbmUgX19OUl9pb19zdWJtaXQJCQkJMjA5CitfX1NZU0NBTEwoX19OUl9pb19zdWJtaXQsIHN5c19pb19zdWJtaXQpCisjZGVmaW5lIF9fTlJfaW9fY2FuY2VsCQkJCTIxMAorX19TWVNDQUxMKF9fTlJfaW9fY2FuY2VsLCBzeXNfaW9fY2FuY2VsKQorI2RlZmluZSBfX05SX2dldF90aHJlYWRfYXJlYQkJCTIxMQorX19TWVNDQUxMKF9fTlJfZ2V0X3RocmVhZF9hcmVhLCBzeXNfbmlfc3lzY2FsbCkJLyogdXNlIGFyY2hfcHJjdGwgKi8KKyNkZWZpbmUgX19OUl9sb29rdXBfZGNvb2tpZQkJCTIxMgorX19TWVNDQUxMKF9fTlJfbG9va3VwX2Rjb29raWUsIHN5c19sb29rdXBfZGNvb2tpZSkKKyNkZWZpbmUgX19OUl9lcG9sbF9jcmVhdGUJCQkyMTMKK19fU1lTQ0FMTChfX05SX2Vwb2xsX2NyZWF0ZSwgc3lzX2Vwb2xsX2NyZWF0ZSkKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGxfb2xkCQkJMjE0CitfX1NZU0NBTEwoX19OUl9lcG9sbF9jdGxfb2xkLCBzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0X29sZAkJCTIxNQorX19TWVNDQUxMKF9fTlJfZXBvbGxfd2FpdF9vbGQsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMJCQkyMTYKK19fU1lTQ0FMTChfX05SX3JlbWFwX2ZpbGVfcGFnZXMsIHN5c19yZW1hcF9maWxlX3BhZ2VzKQorI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCQkJMjE3CitfX1NZU0NBTEwoX19OUl9nZXRkZW50czY0LCBzeXNfZ2V0ZGVudHM2NCkKKyNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MJCQkyMTgKK19fU1lTQ0FMTChfX05SX3NldF90aWRfYWRkcmVzcywgc3lzX3NldF90aWRfYWRkcmVzcykKKyNkZWZpbmUgX19OUl9yZXN0YXJ0X3N5c2NhbGwJCQkyMTkKK19fU1lTQ0FMTChfX05SX3Jlc3RhcnRfc3lzY2FsbCwgc3lzX3Jlc3RhcnRfc3lzY2FsbCkKKyNkZWZpbmUgX19OUl9zZW10aW1lZG9wCQkJCTIyMAorX19TWVNDQUxMKF9fTlJfc2VtdGltZWRvcCwgc3lzX3NlbXRpbWVkb3ApCisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0CQkJCTIyMQorX19TWVNDQUxMKF9fTlJfZmFkdmlzZTY0LCBzeXNfZmFkdmlzZTY0KQorI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZQkJCTIyMgorX19TWVNDQUxMKF9fTlJfdGltZXJfY3JlYXRlLCBzeXNfdGltZXJfY3JlYXRlKQorI2RlZmluZSBfX05SX3RpbWVyX3NldHRpbWUJCQkyMjMKK19fU1lTQ0FMTChfX05SX3RpbWVyX3NldHRpbWUsIHN5c190aW1lcl9zZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyX2dldHRpbWUJCQkyMjQKK19fU1lTQ0FMTChfX05SX3RpbWVyX2dldHRpbWUsIHN5c190aW1lcl9nZXR0aW1lKQorI2RlZmluZSBfX05SX3RpbWVyX2dldG92ZXJydW4JCQkyMjUKK19fU1lTQ0FMTChfX05SX3RpbWVyX2dldG92ZXJydW4sIHN5c190aW1lcl9nZXRvdmVycnVuKQorI2RlZmluZSBfX05SX3RpbWVyX2RlbGV0ZQkJCTIyNgorX19TWVNDQUxMKF9fTlJfdGltZXJfZGVsZXRlLCBzeXNfdGltZXJfZGVsZXRlKQorI2RlZmluZSBfX05SX2Nsb2NrX3NldHRpbWUJCQkyMjcKK19fU1lTQ0FMTChfX05SX2Nsb2NrX3NldHRpbWUsIHN5c19jbG9ja19zZXR0aW1lKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHRpbWUJCQkyMjgKK19fU1lTQ0FMTChfX05SX2Nsb2NrX2dldHRpbWUsIHN5c19jbG9ja19nZXR0aW1lKQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHJlcwkJCTIyOQorX19TWVNDQUxMKF9fTlJfY2xvY2tfZ2V0cmVzLCBzeXNfY2xvY2tfZ2V0cmVzKQorI2RlZmluZSBfX05SX2Nsb2NrX25hbm9zbGVlcAkJCTIzMAorX19TWVNDQUxMKF9fTlJfY2xvY2tfbmFub3NsZWVwLCBzeXNfY2xvY2tfbmFub3NsZWVwKQorI2RlZmluZSBfX05SX2V4aXRfZ3JvdXAJCQkJMjMxCitfX1NZU0NBTEwoX19OUl9leGl0X2dyb3VwLCBzeXNfZXhpdF9ncm91cCkKKyNkZWZpbmUgX19OUl9lcG9sbF93YWl0CQkJCTIzMgorX19TWVNDQUxMKF9fTlJfZXBvbGxfd2FpdCwgc3lzX2Vwb2xsX3dhaXQpCisjZGVmaW5lIF9fTlJfZXBvbGxfY3RsCQkJCTIzMworX19TWVNDQUxMKF9fTlJfZXBvbGxfY3RsLCBzeXNfZXBvbGxfY3RsKQorI2RlZmluZSBfX05SX3Rna2lsbAkJCQkyMzQKK19fU1lTQ0FMTChfX05SX3Rna2lsbCwgc3lzX3Rna2lsbCkKKyNkZWZpbmUgX19OUl91dGltZXMJCQkJMjM1CitfX1NZU0NBTEwoX19OUl91dGltZXMsIHN5c191dGltZXMpCisjZGVmaW5lIF9fTlJfdnNlcnZlcgkJCQkyMzYKK19fU1lTQ0FMTChfX05SX3ZzZXJ2ZXIsIHN5c19uaV9zeXNjYWxsKQorI2RlZmluZSBfX05SX21iaW5kCQkJCTIzNworX19TWVNDQUxMKF9fTlJfbWJpbmQsIHN5c19tYmluZCkKKyNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CQkJMjM4CitfX1NZU0NBTEwoX19OUl9zZXRfbWVtcG9saWN5LCBzeXNfc2V0X21lbXBvbGljeSkKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CQkJMjM5CitfX1NZU0NBTEwoX19OUl9nZXRfbWVtcG9saWN5LCBzeXNfZ2V0X21lbXBvbGljeSkKKyNkZWZpbmUgX19OUl9tcV9vcGVuCQkJCTI0MAorX19TWVNDQUxMKF9fTlJfbXFfb3Blbiwgc3lzX21xX29wZW4pCisjZGVmaW5lIF9fTlJfbXFfdW5saW5rCQkJCTI0MQorX19TWVNDQUxMKF9fTlJfbXFfdW5saW5rLCBzeXNfbXFfdW5saW5rKQorI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZAkJCTI0MgorX19TWVNDQUxMKF9fTlJfbXFfdGltZWRzZW5kLCBzeXNfbXFfdGltZWRzZW5kKQorI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZQkJCTI0MworX19TWVNDQUxMKF9fTlJfbXFfdGltZWRyZWNlaXZlLCBzeXNfbXFfdGltZWRyZWNlaXZlKQorI2RlZmluZSBfX05SX21xX25vdGlmeQkJCQkyNDQKK19fU1lTQ0FMTChfX05SX21xX25vdGlmeSwgc3lzX21xX25vdGlmeSkKKyNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyCQkJMjQ1CitfX1NZU0NBTEwoX19OUl9tcV9nZXRzZXRhdHRyLCBzeXNfbXFfZ2V0c2V0YXR0cikKKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkJCTI0NgorX19TWVNDQUxMKF9fTlJfa2V4ZWNfbG9hZCwgc3lzX2tleGVjX2xvYWQpCisjZGVmaW5lIF9fTlJfd2FpdGlkCQkJCTI0NworX19TWVNDQUxMKF9fTlJfd2FpdGlkLCBzeXNfd2FpdGlkKQorI2RlZmluZSBfX05SX2FkZF9rZXkJCQkJMjQ4CitfX1NZU0NBTEwoX19OUl9hZGRfa2V5LCBzeXNfYWRkX2tleSkKKyNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkJCTI0OQorX19TWVNDQUxMKF9fTlJfcmVxdWVzdF9rZXksIHN5c19yZXF1ZXN0X2tleSkKKyNkZWZpbmUgX19OUl9rZXljdGwJCQkJMjUwCitfX1NZU0NBTEwoX19OUl9rZXljdGwsIHN5c19rZXljdGwpCisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJCQkyNTEKK19fU1lTQ0FMTChfX05SX2lvcHJpb19zZXQsIHN5c19pb3ByaW9fc2V0KQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCQkJMjUyCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fZ2V0LCBzeXNfaW9wcmlvX2dldCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJCQkyNTMKK19fU1lTQ0FMTChfX05SX2lub3RpZnlfaW5pdCwgc3lzX2lub3RpZnlfaW5pdCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkJCTI1NAorX19TWVNDQUxMKF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gsIHN5c19pbm90aWZ5X2FkZF93YXRjaCkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCQkJMjU1CitfX1NZU0NBTEwoX19OUl9pbm90aWZ5X3JtX3dhdGNoLCBzeXNfaW5vdGlmeV9ybV93YXRjaCkKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCQkJMjU2CitfX1NZU0NBTEwoX19OUl9taWdyYXRlX3BhZ2VzLCBzeXNfbWlncmF0ZV9wYWdlcykKKyNkZWZpbmUgX19OUl9vcGVuYXQJCQkJMjU3CitfX1NZU0NBTEwoX19OUl9vcGVuYXQsIHN5c19vcGVuYXQpCisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJCQkyNTgKK19fU1lTQ0FMTChfX05SX21rZGlyYXQsIHN5c19ta2RpcmF0KQorI2RlZmluZSBfX05SX21rbm9kYXQJCQkJMjU5CitfX1NZU0NBTEwoX19OUl9ta25vZGF0LCBzeXNfbWtub2RhdCkKKyNkZWZpbmUgX19OUl9mY2hvd25hdAkJCQkyNjAKK19fU1lTQ0FMTChfX05SX2ZjaG93bmF0LCBzeXNfZmNob3duYXQpCisjZGVmaW5lIF9fTlJfZnV0aW1lc2F0CQkJCTI2MQorX19TWVNDQUxMKF9fTlJfZnV0aW1lc2F0LCBzeXNfZnV0aW1lc2F0KQorI2RlZmluZSBfX05SX25ld2ZzdGF0YXQJCQkJMjYyCitfX1NZU0NBTEwoX19OUl9uZXdmc3RhdGF0LCBzeXNfbmV3ZnN0YXRhdCkKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJCQkyNjMKK19fU1lTQ0FMTChfX05SX3VubGlua2F0LCBzeXNfdW5saW5rYXQpCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCQkJMjY0CitfX1NZU0NBTEwoX19OUl9yZW5hbWVhdCwgc3lzX3JlbmFtZWF0KQorI2RlZmluZSBfX05SX2xpbmthdAkJCQkyNjUKK19fU1lTQ0FMTChfX05SX2xpbmthdCwgc3lzX2xpbmthdCkKKyNkZWZpbmUgX19OUl9zeW1saW5rYXQJCQkJMjY2CitfX1NZU0NBTEwoX19OUl9zeW1saW5rYXQsIHN5c19zeW1saW5rYXQpCisjZGVmaW5lIF9fTlJfcmVhZGxpbmthdAkJCQkyNjcKK19fU1lTQ0FMTChfX05SX3JlYWRsaW5rYXQsIHN5c19yZWFkbGlua2F0KQorI2RlZmluZSBfX05SX2ZjaG1vZGF0CQkJCTI2OAorX19TWVNDQUxMKF9fTlJfZmNobW9kYXQsIHN5c19mY2htb2RhdCkKKyNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCQkJMjY5CitfX1NZU0NBTEwoX19OUl9mYWNjZXNzYXQsIHN5c19mYWNjZXNzYXQpCisjZGVmaW5lIF9fTlJfcHNlbGVjdDYJCQkJMjcwCitfX1NZU0NBTEwoX19OUl9wc2VsZWN0Niwgc3lzX3BzZWxlY3Q2KQorI2RlZmluZSBfX05SX3Bwb2xsCQkJCTI3MQorX19TWVNDQUxMKF9fTlJfcHBvbGwsCXN5c19wcG9sbCkKKyNkZWZpbmUgX19OUl91bnNoYXJlCQkJCTI3MgorX19TWVNDQUxMKF9fTlJfdW5zaGFyZSwJc3lzX3Vuc2hhcmUpCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkJMjczCitfX1NZU0NBTEwoX19OUl9zZXRfcm9idXN0X2xpc3QsIHN5c19zZXRfcm9idXN0X2xpc3QpCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CQkJMjc0CitfX1NZU0NBTEwoX19OUl9nZXRfcm9idXN0X2xpc3QsIHN5c19nZXRfcm9idXN0X2xpc3QpCisjZGVmaW5lIF9fTlJfc3BsaWNlCQkJCTI3NQorX19TWVNDQUxMKF9fTlJfc3BsaWNlLCBzeXNfc3BsaWNlKQorI2RlZmluZSBfX05SX3RlZQkJCQkyNzYKK19fU1lTQ0FMTChfX05SX3RlZSwgc3lzX3RlZSkKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJCQkyNzcKK19fU1lTQ0FMTChfX05SX3N5bmNfZmlsZV9yYW5nZSwgc3lzX3N5bmNfZmlsZV9yYW5nZSkKKyNkZWZpbmUgX19OUl92bXNwbGljZQkJCQkyNzgKK19fU1lTQ0FMTChfX05SX3Ztc3BsaWNlLCBzeXNfdm1zcGxpY2UpCisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJCQkyNzkKK19fU1lTQ0FMTChfX05SX21vdmVfcGFnZXMsIHN5c19tb3ZlX3BhZ2VzKQorI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJCQkyODAKK19fU1lTQ0FMTChfX05SX3V0aW1lbnNhdCwgc3lzX3V0aW1lbnNhdCkKKyNkZWZpbmUgX19JR05PUkVfZ2V0Y3B1CQkvKiBpbXBsZW1lbnRlZCBhcyBhIHZzeXNjYWxsICovCisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJCQkyODEKK19fU1lTQ0FMTChfX05SX2Vwb2xsX3B3YWl0LCBzeXNfZXBvbGxfcHdhaXQpCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCQkJMjgyCitfX1NZU0NBTEwoX19OUl9zaWduYWxmZCwgc3lzX3NpZ25hbGZkKQorI2RlZmluZSBfX05SX3RpbWVyZmQJCQkJMjgzCitfX1NZU0NBTEwoX19OUl90aW1lcmZkLCBzeXNfdGltZXJmZCkKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkJCTI4NAorX19TWVNDQUxMKF9fTlJfZXZlbnRmZCwgc3lzX2V2ZW50ZmQpCisjZGVmaW5lIF9fTlJfZmFsbG9jYXRlCQkJCTI4NQorX19TWVNDQUxMKF9fTlJfZmFsbG9jYXRlLCBzeXNfZmFsbG9jYXRlKQorCisjaWZuZGVmIF9fTk9fU1RVQlMKKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1NUQVQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0FMQVJNCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRIT1NUTkFNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUEFVU0UKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NHRVRNQVNLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdOQUwKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1VUSU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19XQUlUUElECisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TT0NLRVRDQUxMCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19GQURWSVNFNjQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0dFVFBHUlAKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX0xMU0VFSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTklDRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEX0dFVFJMSU1JVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEVU1PVU5UCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQorI2VuZGlmCS8qIF9fTk9fU1RVQlMgKi8KKworCisjZW5kaWYgLyogX0FTTV9YODZfNjRfVU5JU1REX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91c2VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjOTU5YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3VzZXIuaApAQCAtMCwwICsxLDUgQEAKKyMgaWZkZWYgX19pMzg2X18KKyMgIGluY2x1ZGUgInVzZXJfMzIuaCIKKyMgZWxzZQorIyAgaW5jbHVkZSAidXNlcl82NC5oIgorIyBlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdXNlcl8zMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdXNlcl8zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODVkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS91c2VyXzMyLmgKQEAgLTAsMCArMSwxMjEgQEAKKyNpZm5kZWYgX0kzODZfVVNFUl9ICisjZGVmaW5lIF9JMzg2X1VTRVJfSAorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKy8qIENvcmUgZmlsZSBmb3JtYXQ6IFRoZSBjb3JlIGZpbGUgaXMgd3JpdHRlbiBpbiBzdWNoIGEgd2F5IHRoYXQgZ2RiCisgICBjYW4gdW5kZXJzdGFuZCBpdCBhbmQgcHJvdmlkZSB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgKHVuZGVyCisgICBsaW51eCB3ZSB1c2UgdGhlICd0cmFkLWNvcmUnIGJmZCkuICBUaGVyZSBhcmUgcXVpdGUgYSBudW1iZXIgb2YKKyAgIG9ic3RhY2xlcyB0byBiZWluZyBhYmxlIHRvIHZpZXcgdGhlIGNvbnRlbnRzIG9mIHRoZSBmbG9hdGluZyBwb2ludAorICAgcmVnaXN0ZXJzLCBhbmQgdW50aWwgdGhlc2UgYXJlIHNvbHZlZCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byB2aWV3IHRoZQorICAgY29udGVudHMgb2YgdGhlbS4gIEFjdHVhbGx5LCB5b3UgY2FuIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSBhbmQgbG9vayBhdAorICAgdGhlIGNvbnRlbnRzIG9mIHRoZSB1c2VyIHN0cnVjdCB0byBmaW5kIG91dCB3aGF0IHRoZSBmbG9hdGluZyBwb2ludAorICAgcmVnaXN0ZXJzIGNvbnRhaW4uCisgICBUaGUgYWN0dWFsIGZpbGUgY29udGVudHMgYXJlIGFzIGZvbGxvd3M6CisgICBVUEFHRTogMSBwYWdlIGNvbnNpc3Rpbmcgb2YgYSB1c2VyIHN0cnVjdCB0aGF0IHRlbGxzIGdkYiB3aGF0IGlzIHByZXNlbnQKKyAgIGluIHRoZSBmaWxlLiAgRGlyZWN0bHkgYWZ0ZXIgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIHRhc2tfc3RydWN0LCB3aGljaAorICAgaXMgY3VycmVudGx5IG5vdCB1c2VkIGJ5IGdkYiwgYnV0IGl0IG1heSBjb21lIGluIHVzZWZ1bCBhdCBzb21lIHBvaW50LgorICAgQWxsIG9mIHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBhcyBwYXJ0IG9mIHRoZSB1cGFnZS4gIFRoZSB1cGFnZSBzaG91bGQKKyAgIGFsd2F5cyBiZSBvbmx5IG9uZSBwYWdlLgorICAgREFUQTogVGhlIGRhdGEgYXJlYSBpcyBzdG9yZWQuICBXZSB1c2UgY3VycmVudC0+ZW5kX3RleHQgdG8KKyAgIGN1cnJlbnQtPmJyayB0byBwaWNrIHVwIGFsbCBvZiB0aGUgdXNlciB2YXJpYWJsZXMsIHBsdXMgYW55IG1lbW9yeQorICAgdGhhdCBtYXkgaGF2ZSBiZWVuIG1hbGxvY2VkLiAgTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGRldGVybWluZSBpZiBhIHBhZ2UKKyAgIGlzIGRlbWFuZC16ZXJvIG9yIGlmIGEgcGFnZSBpcyB0b3RhbGx5IHVudXNlZCwgd2UganVzdCBjb3ZlciB0aGUgZW50aXJlCisgICByYW5nZS4gIEFsbCBvZiB0aGUgYWRkcmVzc2VzIGFyZSByb3VuZGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBhbiBpbnRlZ3JhbAorICAgbnVtYmVyIG9mIHBhZ2VzIGlzIHdyaXR0ZW4uCisgICBTVEFDSzogV2UgbmVlZCB0aGUgc3RhY2sgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZ2V0IGEgbWVhbmluZ2Z1bAorICAgYmFja3RyYWNlLiAgV2UgbmVlZCB0byB3cml0ZSB0aGUgZGF0YSBmcm9tIChlc3ApIHRvCisgICBjdXJyZW50LT5zdGFydF9zdGFjaywgc28gd2Ugcm91bmQgZWFjaCBvZiB0aGVzZSBvZmYgaW4gb3JkZXIgdG8gYmUgYWJsZQorICAgdG8gd3JpdGUgYW4gaW50ZWdlciBudW1iZXIgb2YgcGFnZXMuCisgICBUaGUgbWluaW11bSBjb3JlIGZpbGUgc2l6ZSBpcyAzIHBhZ2VzLCBvciAxMjI4OCBieXRlcy4KKyovCisKKy8qCisgKiBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAorICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKKyAqCisgKiBQcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHREIgNS4wKyBQVFJBQ0Vfe0dFVHxTRVR9RlBYUkVHUyByZXF1ZXN0cyBmb3IKKyAqIGludGVyYWN0aW5nIHdpdGggdGhlIEZYU1ItZm9ybWF0IGZsb2F0aW5nIHBvaW50IGVudmlyb25tZW50LiAgRmxvYXRpbmcKKyAqIHBvaW50IGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSByZWd1bGFyIGZvcm1hdCBpbiB0aGUgdXN1YWwgbWFubmVyLAorICogYW5kIGJvdGggdGhlIHN0YW5kYXJkIGFuZCBTSU1EIGZsb2F0aW5nIHBvaW50IGRhdGEgY2FuIGJlIGFjY2Vzc2VkIHZpYQorICogdGhlIG5ldyBwdHJhY2UgcmVxdWVzdHMuICBJbiBlaXRoZXIgY2FzZSwgY2hhbmdlcyB0byB0aGUgRlBVIGVudmlyb25tZW50CisgKiB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgdGFzaydzIHN0YXRlIGFzIGV4cGVjdGVkLgorICovCisKK3N0cnVjdCB1c2VyX2kzODdfc3RydWN0IHsKKwlsb25nCWN3ZDsKKwlsb25nCXN3ZDsKKwlsb25nCXR3ZDsKKwlsb25nCWZpcDsKKwlsb25nCWZjczsKKwlsb25nCWZvbzsKKwlsb25nCWZvczsKKwlsb25nCXN0X3NwYWNlWzIwXTsJLyogOCoxMCBieXRlcyBmb3IgZWFjaCBGUC1yZWcgPSA4MCBieXRlcyAqLworfTsKKworc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0CWN3ZDsKKwl1bnNpZ25lZCBzaG9ydAlzd2Q7CisJdW5zaWduZWQgc2hvcnQJdHdkOworCXVuc2lnbmVkIHNob3J0CWZvcDsKKwlsb25nCWZpcDsKKwlsb25nCWZjczsKKwlsb25nCWZvbzsKKwlsb25nCWZvczsKKwlsb25nCW14Y3NyOworCWxvbmcJcmVzZXJ2ZWQ7CisJbG9uZwlzdF9zcGFjZVszMl07CS8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnID0gMTI4IGJ5dGVzICovCisJbG9uZwl4bW1fc3BhY2VbMzJdOwkvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAxMjggYnl0ZXMgKi8KKwlsb25nCXBhZGRpbmdbNTZdOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG9sZCBsYXlvdXQgb2YgInN0cnVjdCBwdF9yZWdzIiwgYW5kCisgKiBpcyBzdGlsbCB0aGUgbGF5b3V0IHVzZWQgYnkgdXNlciBtb2RlICh0aGUgbmV3CisgKiBwdF9yZWdzIGRvZXNuJ3QgaGF2ZSBhbGwgcmVnaXN0ZXJzIGFzIHRoZSBrZXJuZWwKKyAqIGRvZXNuJ3QgdXNlIHRoZSBleHRyYSBzZWdtZW50IHJlZ2lzdGVycykKKyAqLworc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgeworCWxvbmcgZWJ4LCBlY3gsIGVkeCwgZXNpLCBlZGksIGVicCwgZWF4OworCXVuc2lnbmVkIHNob3J0IGRzLCBfX2RzLCBlcywgX19lczsKKwl1bnNpZ25lZCBzaG9ydCBmcywgX19mcywgZ3MsIF9fZ3M7CisJbG9uZyBvcmlnX2VheCwgZWlwOworCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzOworCWxvbmcgZWZsYWdzLCBlc3A7CisJdW5zaWduZWQgc2hvcnQgc3MsIF9fc3M7Cit9OworCisvKiBXaGVuIHRoZSBrZXJuZWwgZHVtcHMgY29yZSwgaXQgc3RhcnRzIGJ5IGR1bXBpbmcgdGhlIHVzZXIgc3RydWN0IC0KKyAgIHRoaXMgd2lsbCBiZSB1c2VkIGJ5IGdkYiB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZSBkYXRhIGFuZCBzdGFjayBzZWdtZW50cworICAgYXJlIHdpdGhpbiB0aGUgZmlsZSwgYW5kIHdoYXQgdmlydHVhbCBhZGRyZXNzZXMgdG8gdXNlLiAqLworc3RydWN0IHVzZXJ7CisvKiBXZSBzdGFydCB3aXRoIHRoZSByZWdpc3RlcnMsIHRvIG1pbWljIHRoZSB3YXkgdGhhdCAibWVtb3J5IiBpcyByZXR1cm5lZAorICAgZnJvbSB0aGUgcHRyYWNlKDMsLi4uKSBmdW5jdGlvbi4gICovCisgIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHJlZ3M7CQkvKiBXaGVyZSB0aGUgcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSBzdG9yZWQgKi8KKy8qIHB0cmFjZSBkb2VzIG5vdCB5ZXQgc3VwcGx5IHRoZXNlLiAgU29tZWRheS4uLi4gKi8KKyAgaW50IHVfZnB2YWxpZDsJCS8qIFRydWUgaWYgbWF0aCBjby1wcm9jZXNzb3IgYmVpbmcgdXNlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIHRoaXMgbWVzcy4gTm90IHlldCB1c2VkLiAqLworICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBpMzg3OwkvKiBNYXRoIENvLXByb2Nlc3NvciByZWdpc3RlcnMuICovCisvKiBUaGUgcmVzdCBvZiB0aGlzIGp1bmsgaXMgdG8gaGVscCBnZGIgZmlndXJlIG91dCB3aGF0IGdvZXMgd2hlcmUgKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgdV90c2l6ZTsJLyogVGV4dCBzZWdtZW50IHNpemUgKHBhZ2VzKS4gKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgdV9kc2l6ZTsJLyogRGF0YSBzZWdtZW50IHNpemUgKHBhZ2VzKS4gKi8KKyAgdW5zaWduZWQgbG9uZyBpbnQgdV9zc2l6ZTsJLyogU3RhY2sgc2VnbWVudCBzaXplIChwYWdlcykuICovCisgIHVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsgICAgIC8qIFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0ZXh0LiAqLworICB1bnNpZ25lZCBsb25nIHN0YXJ0X3N0YWNrOwkvKiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2Ygc3RhY2sgYXJlYS4KKwkJCQkgICBUaGlzIGlzIGFjdHVhbGx5IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLAorCQkJCSAgIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIGFsd2F5cyBmb3VuZCBpbiB0aGUKKwkJCQkgICBlc3AgcmVnaXN0ZXIuICAqLworICBsb25nIGludCBzaWduYWw7ICAgICAJCS8qIFNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZSBkdW1wLiAqLworICBpbnQgcmVzZXJ2ZWQ7CQkJLyogTm8gbG9uZ2VyIHVzZWQgKi8KKyAgc3RydWN0IHVzZXJfcHRfcmVncyAqIHVfYXIwOwkvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KKwkJCQkvKiB0aGUgcmVnaXN0ZXJzLiAqLworICBzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCogdV9mcHN0YXRlOwkvKiBNYXRoIENvLXByb2Nlc3NvciBwb2ludGVyLiAqLworICB1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogVG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjb3JlIGZpbGUgKi8KKyAgY2hhciB1X2NvbW1bMzJdOwkJLyogVXNlciBjb21tYW5kIHRoYXQgd2FzIHJlc3BvbnNpYmxlICovCisgIGludCB1X2RlYnVncmVnWzhdOworfTsKKyNkZWZpbmUgTkJQRyBQQUdFX1NJWkUKKyNkZWZpbmUgVVBBR0VTIDEKKyNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgKHUuc3RhcnRfY29kZSkKKyNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCisKKyNlbmRpZiAvKiBfSTM4Nl9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3VzZXJfNjQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3VzZXJfNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc4NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdXNlcl82NC5oCkBAIC0wLDAgKzEsMTE0IEBACisjaWZuZGVmIF9YODZfNjRfVVNFUl9ICisjZGVmaW5lIF9YODZfNjRfVVNFUl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorLyogQ29yZSBmaWxlIGZvcm1hdDogVGhlIGNvcmUgZmlsZSBpcyB3cml0dGVuIGluIHN1Y2ggYSB3YXkgdGhhdCBnZGIKKyAgIGNhbiB1bmRlcnN0YW5kIGl0IGFuZCBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci4KKyAgIFRoZXJlIGFyZSBxdWl0ZSBhIG51bWJlciBvZiBvYnN0YWNsZXMgdG8gYmVpbmcgYWJsZSB0byB2aWV3IHRoZQorICAgY29udGVudHMgb2YgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycywgYW5kIHVudGlsIHRoZXNlIGFyZQorICAgc29sdmVkIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZpZXcgdGhlIGNvbnRlbnRzIG9mIHRoZW0uCisgICBBY3R1YWxseSwgeW91IGNhbiByZWFkIGluIHRoZSBjb3JlIGZpbGUgYW5kIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mCisgICB0aGUgdXNlciBzdHJ1Y3QgdG8gZmluZCBvdXQgd2hhdCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzCisgICBjb250YWluLgorCisgICBUaGUgYWN0dWFsIGZpbGUgY29udGVudHMgYXJlIGFzIGZvbGxvd3M6CisgICBVUEFHRTogMSBwYWdlIGNvbnNpc3Rpbmcgb2YgYSB1c2VyIHN0cnVjdCB0aGF0IHRlbGxzIGdkYiB3aGF0IGlzIHByZXNlbnQKKyAgIGluIHRoZSBmaWxlLiAgRGlyZWN0bHkgYWZ0ZXIgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIHRhc2tfc3RydWN0LCB3aGljaAorICAgaXMgY3VycmVudGx5IG5vdCB1c2VkIGJ5IGdkYiwgYnV0IGl0IG1heSBjb21lIGluIHVzZWZ1bCBhdCBzb21lIHBvaW50LgorICAgQWxsIG9mIHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBhcyBwYXJ0IG9mIHRoZSB1cGFnZS4gIFRoZSB1cGFnZSBzaG91bGQKKyAgIGFsd2F5cyBiZSBvbmx5IG9uZSBwYWdlLgorICAgREFUQTogVGhlIGRhdGEgYXJlYSBpcyBzdG9yZWQuICBXZSB1c2UgY3VycmVudC0+ZW5kX3RleHQgdG8KKyAgIGN1cnJlbnQtPmJyayB0byBwaWNrIHVwIGFsbCBvZiB0aGUgdXNlciB2YXJpYWJsZXMsIHBsdXMgYW55IG1lbW9yeQorICAgdGhhdCBtYXkgaGF2ZSBiZWVuIG1hbGxvY2VkLiAgTm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGRldGVybWluZSBpZiBhIHBhZ2UKKyAgIGlzIGRlbWFuZC16ZXJvIG9yIGlmIGEgcGFnZSBpcyB0b3RhbGx5IHVudXNlZCwgd2UganVzdCBjb3ZlciB0aGUgZW50aXJlCisgICByYW5nZS4gIEFsbCBvZiB0aGUgYWRkcmVzc2VzIGFyZSByb3VuZGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBhbiBpbnRlZ3JhbAorICAgbnVtYmVyIG9mIHBhZ2VzIGlzIHdyaXR0ZW4uCisgICBTVEFDSzogV2UgbmVlZCB0aGUgc3RhY2sgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZ2V0IGEgbWVhbmluZ2Z1bAorICAgYmFja3RyYWNlLiAgV2UgbmVlZCB0byB3cml0ZSB0aGUgZGF0YSBmcm9tIChlc3ApIHRvCisgICBjdXJyZW50LT5zdGFydF9zdGFjaywgc28gd2Ugcm91bmQgZWFjaCBvZiB0aGVzZSBvZmYgaW4gb3JkZXIgdG8gYmUgYWJsZQorICAgdG8gd3JpdGUgYW4gaW50ZWdlciBudW1iZXIgb2YgcGFnZXMuCisgICBUaGUgbWluaW11bSBjb3JlIGZpbGUgc2l6ZSBpcyAzIHBhZ2VzLCBvciAxMjI4OCBieXRlcy4gICovCisKKy8qCisgKiBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydAorICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPiwgTWF5IDIwMDAKKyAqCisgKiBQcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHREIgNS4wKyBQVFJBQ0Vfe0dFVHxTRVR9RlBYUkVHUyByZXF1ZXN0cyBmb3IKKyAqIGludGVyYWN0aW5nIHdpdGggdGhlIEZYU1ItZm9ybWF0IGZsb2F0aW5nIHBvaW50IGVudmlyb25tZW50LiAgRmxvYXRpbmcKKyAqIHBvaW50IGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSByZWd1bGFyIGZvcm1hdCBpbiB0aGUgdXN1YWwgbWFubmVyLAorICogYW5kIGJvdGggdGhlIHN0YW5kYXJkIGFuZCBTSU1EIGZsb2F0aW5nIHBvaW50IGRhdGEgY2FuIGJlIGFjY2Vzc2VkIHZpYQorICogdGhlIG5ldyBwdHJhY2UgcmVxdWVzdHMuICBJbiBlaXRoZXIgY2FzZSwgY2hhbmdlcyB0byB0aGUgRlBVIGVudmlyb25tZW50CisgKiB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgdGFzaydzIHN0YXRlIGFzIGV4cGVjdGVkLgorICogCisgKiB4ODYtNjQgc3VwcG9ydCBieSBBbmRpIEtsZWVuLgorICovCisKKy8qIFRoaXMgbWF0Y2hlcyB0aGUgNjRiaXQgRlhTQVZFIGZvcm1hdCBhcyBkZWZpbmVkIGJ5IEFNRC4gSXQgaXMgdGhlIHNhbWUKKyAgIGFzIHRoZSAzMmJpdCBmb3JtYXQgZGVmaW5lZCBieSBJbnRlbCwgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdG9yOm9mZnNldCBwYWlycyBmb3IKKyAgIGRhdGEgYW5kIGVpcCBhcmUgcmVwbGFjZWQgd2l0aCBmbGF0IDY0Yml0IHBvaW50ZXJzLiAqLyAKK3N0cnVjdCB1c2VyX2kzODdfc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydAljd2Q7CisJdW5zaWduZWQgc2hvcnQJc3dkOworCXVuc2lnbmVkIHNob3J0CXR3ZDsgLyogTm90ZSB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgMzJiaXQveDg3L0ZTQVZFIHR3ZCAqLworCXVuc2lnbmVkIHNob3J0CWZvcDsKKwlfX3U2NAlyaXA7CisJX191NjQJcmRwOworCV9fdTMyCW14Y3NyOworCV9fdTMyCW14Y3NyX21hc2s7CisJX191MzIJc3Rfc3BhY2VbMzJdOwkvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIEZQLXJlZyA9IDEyOCBieXRlcyAqLworCV9fdTMyCXhtbV9zcGFjZVs2NF07CS8qIDE2KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAyNTYgYnl0ZXMgKi8KKwlfX3UzMglwYWRkaW5nWzI0XTsKK307CisKKy8qCisgKiBTZWdtZW50IHJlZ2lzdGVyIGxheW91dCBpbiBjb3JlZHVtcHMuCisgKi8KK3N0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHIxNSxyMTQscjEzLHIxMixyYnAscmJ4LHIxMSxyMTA7CisJdW5zaWduZWQgbG9uZyByOSxyOCxyYXgscmN4LHJkeCxyc2kscmRpLG9yaWdfcmF4OworCXVuc2lnbmVkIGxvbmcgcmlwLGNzLGVmbGFnczsKKwl1bnNpZ25lZCBsb25nIHJzcCxzczsKKyAgCXVuc2lnbmVkIGxvbmcgZnNfYmFzZSwgZ3NfYmFzZTsKKwl1bnNpZ25lZCBsb25nIGRzLGVzLGZzLGdzOyAKK307IAorCisvKiBXaGVuIHRoZSBrZXJuZWwgZHVtcHMgY29yZSwgaXQgc3RhcnRzIGJ5IGR1bXBpbmcgdGhlIHVzZXIgc3RydWN0IC0KKyAgIHRoaXMgd2lsbCBiZSB1c2VkIGJ5IGdkYiB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZSBkYXRhIGFuZCBzdGFjayBzZWdtZW50cworICAgYXJlIHdpdGhpbiB0aGUgZmlsZSwgYW5kIHdoYXQgdmlydHVhbCBhZGRyZXNzZXMgdG8gdXNlLiAqLworc3RydWN0IHVzZXJ7CisvKiBXZSBzdGFydCB3aXRoIHRoZSByZWdpc3RlcnMsIHRvIG1pbWljIHRoZSB3YXkgdGhhdCAibWVtb3J5IiBpcyByZXR1cm5lZAorICAgZnJvbSB0aGUgcHRyYWNlKDMsLi4uKSBmdW5jdGlvbi4gICovCisgIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IHJlZ3M7CQkvKiBXaGVyZSB0aGUgcmVnaXN0ZXJzIGFyZSBhY3R1YWxseSBzdG9yZWQgKi8KKy8qIHB0cmFjZSBkb2VzIG5vdCB5ZXQgc3VwcGx5IHRoZXNlLiAgU29tZWRheS4uLi4gKi8KKyAgaW50IHVfZnB2YWxpZDsJCS8qIFRydWUgaWYgbWF0aCBjby1wcm9jZXNzb3IgYmVpbmcgdXNlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIHRoaXMgbWVzcy4gTm90IHlldCB1c2VkLiAqLworICBpbnQgcGFkMDsKKyAgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgaTM4NzsJLyogTWF0aCBDby1wcm9jZXNzb3IgcmVnaXN0ZXJzLiAqLworLyogVGhlIHJlc3Qgb2YgdGhpcyBqdW5rIGlzIHRvIGhlbHAgZ2RiIGZpZ3VyZSBvdXQgd2hhdCBnb2VzIHdoZXJlICovCisgIHVuc2lnbmVkIGxvbmcgaW50IHVfdHNpemU7CS8qIFRleHQgc2VnbWVudCBzaXplIChwYWdlcykuICovCisgIHVuc2lnbmVkIGxvbmcgaW50IHVfZHNpemU7CS8qIERhdGEgc2VnbWVudCBzaXplIChwYWdlcykuICovCisgIHVuc2lnbmVkIGxvbmcgaW50IHVfc3NpemU7CS8qIFN0YWNrIHNlZ21lbnQgc2l6ZSAocGFnZXMpLiAqLworICB1bnNpZ25lZCBsb25nIHN0YXJ0X2NvZGU7ICAgICAvKiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGV4dC4gKi8KKyAgdW5zaWduZWQgbG9uZyBzdGFydF9zdGFjazsJLyogU3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHN0YWNrIGFyZWEuCisJCQkJICAgVGhpcyBpcyBhY3R1YWxseSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaywKKwkJCQkgICB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyBhbHdheXMgZm91bmQgaW4gdGhlCisJCQkJICAgZXNwIHJlZ2lzdGVyLiAgKi8KKyAgbG9uZyBpbnQgc2lnbmFsOyAgICAgCQkvKiBTaWduYWwgdGhhdCBjYXVzZWQgdGhlIGNvcmUgZHVtcC4gKi8KKyAgaW50IHJlc2VydmVkOwkJCS8qIE5vIGxvbmdlciB1c2VkICovCisgIGludCBwYWQxOworICBzdHJ1Y3QgdXNlcl9wdF9yZWdzICogdV9hcjA7CS8qIFVzZWQgYnkgZ2RiIHRvIGhlbHAgZmluZCB0aGUgdmFsdWVzIGZvciAqLworCQkJCS8qIHRoZSByZWdpc3RlcnMuICovCisgIHN0cnVjdCB1c2VyX2kzODdfc3RydWN0KiB1X2Zwc3RhdGU7CS8qIE1hdGggQ28tcHJvY2Vzc29yIHBvaW50ZXIuICovCisgIHVuc2lnbmVkIGxvbmcgbWFnaWM7CQkvKiBUbyB1bmlxdWVseSBpZGVudGlmeSBhIGNvcmUgZmlsZSAqLworICBjaGFyIHVfY29tbVszMl07CQkvKiBVc2VyIGNvbW1hbmQgdGhhdCB3YXMgcmVzcG9uc2libGUgKi8KKyAgdW5zaWduZWQgbG9uZyB1X2RlYnVncmVnWzhdOworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7IC8qIENQVSBlcnJvciBjb2RlIG9yIDAgKi8KKyAgdW5zaWduZWQgbG9uZyBmYXVsdF9hZGRyZXNzOyAvKiBDUjMgb3IgMCAqLworfTsKKyNkZWZpbmUgTkJQRyBQQUdFX1NJWkUKKyNkZWZpbmUgVVBBR0VTIDEKKyNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgKHUuc3RhcnRfY29kZSkKKyNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCisKKyNlbmRpZiAvKiBfWDg2XzY0X1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdm04Ni5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdm04Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGNmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS92bTg2LmgKQEAgLTAsMCArMSwxNDAgQEAKKyNpZm5kZWYgX0xJTlVYX1ZNODZfSAorI2RlZmluZSBfTElOVVhfVk04Nl9ICisKKy8qCisgKiBJJ20gZ3Vlc3NpbmcgYXQgdGhlIFZJRi9WSVAgZmxhZyB1c2FnZSwgYnV0IGhvcGUgdGhhdCB0aGlzIGlzIGhvdworICogdGhlIFBlbnRpdW0gdXNlcyB0aGVtLiBMaW51eCB3aWxsIHJldHVybiBmcm9tIHZtODYgbW9kZSB3aGVuIGJvdGgKKyAqIFZJRiBhbmQgVklQIGlzIHNldC4KKyAqCisgKiBPbiBhIFBlbnRpdW0sIHdlIGNvdWxkIHByb2JhYmx5IG9wdGltaXplIHRoZSB2aXJ0dWFsIGZsYWdzIGRpcmVjdGx5CisgKiBpbiB0aGUgZWZsYWdzIHJlZ2lzdGVyIGluc3RlYWQgb2YgZG9pbmcgaXQgImJ5IGhhbmQiIGluIHZmbGFncy4uLgorICoKKyAqIExpbnVzCisgKi8KKworI2RlZmluZSBURl9NQVNLCQkweDAwMDAwMTAwCisjZGVmaW5lIElGX01BU0sJCTB4MDAwMDAyMDAKKyNkZWZpbmUgSU9QTF9NQVNLCTB4MDAwMDMwMDAKKyNkZWZpbmUgTlRfTUFTSwkJMHgwMDAwNDAwMAorI2lmZGVmIENPTkZJR19WTTg2CisjZGVmaW5lIFZNX01BU0sJCTB4MDAwMjAwMDAKKyNlbHNlCisjZGVmaW5lIFZNX01BU0sJCTAgLyogaWdub3JlZCAqLworI2VuZGlmCisjZGVmaW5lIEFDX01BU0sJCTB4MDAwNDAwMDAKKyNkZWZpbmUgVklGX01BU0sJMHgwMDA4MDAwMAkvKiB2aXJ0dWFsIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFZJUF9NQVNLCTB4MDAxMDAwMDAJLyogdmlydHVhbCBpbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSBJRF9NQVNLCQkweDAwMjAwMDAwCisKKyNkZWZpbmUgQklPU1NFRwkJMHgwZjAwMAorCisjZGVmaW5lIENQVV8wODYJCTAKKyNkZWZpbmUgQ1BVXzE4NgkJMQorI2RlZmluZSBDUFVfMjg2CQkyCisjZGVmaW5lIENQVV8zODYJCTMKKyNkZWZpbmUgQ1BVXzQ4NgkJNAorI2RlZmluZSBDUFVfNTg2CQk1CisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIGZvciB0aGUgJ3ZtODYoKScgc3lzdGVtIGNhbGwKKyAqLworI2RlZmluZSBWTTg2X1RZUEUocmV0dmFsKQkoKHJldHZhbCkgJiAweGZmKQorI2RlZmluZSBWTTg2X0FSRyhyZXR2YWwpCSgocmV0dmFsKSA+PiA4KQorCisjZGVmaW5lIFZNODZfU0lHTkFMCTAJLyogcmV0dXJuIGR1ZSB0byBzaWduYWwgKi8KKyNkZWZpbmUgVk04Nl9VTktOT1dOCTEJLyogdW5oYW5kbGVkIEdQIGZhdWx0IC0gSU8taW5zdHJ1Y3Rpb24gb3Igc2ltaWxhciAqLworI2RlZmluZSBWTTg2X0lOVHgJMgkvKiBpbnQzL2ludCB4IGluc3RydWN0aW9uIChBUkcgPSB4KSAqLworI2RlZmluZSBWTTg2X1NUSQkzCS8qIHN0aS9wb3BmL2lyZXQgaW5zdHJ1Y3Rpb24gZW5hYmxlZCB2aXJ0dWFsIGludGVycnVwdHMgKi8KKworLyoKKyAqIEFkZGl0aW9uYWwgcmV0dXJuIHZhbHVlcyB3aGVuIGludm9raW5nIG5ldyB2bTg2KCkKKyAqLworI2RlZmluZSBWTTg2X1BJQ1JFVFVSTgk0CS8qIHJldHVybiBkdWUgdG8gcGVuZGluZyBQSUMgcmVxdWVzdCAqLworI2RlZmluZSBWTTg2X1RSQVAJNgkvKiByZXR1cm4gZHVlIHRvIERPUy1kZWJ1Z2dlciByZXF1ZXN0ICovCisKKy8qCisgKiBmdW5jdGlvbiBjb2RlcyB3aGVuIGludm9raW5nIG5ldyB2bTg2KCkKKyAqLworI2RlZmluZSBWTTg2X1BMVVNfSU5TVEFMTF9DSEVDSwkwCisjZGVmaW5lIFZNODZfRU5URVIJCTEKKyNkZWZpbmUgVk04Nl9FTlRFUl9OT19CWVBBU1MJMgorI2RlZmluZQlWTTg2X1JFUVVFU1RfSVJRCTMKKyNkZWZpbmUgVk04Nl9GUkVFX0lSUQkJNAorI2RlZmluZSBWTTg2X0dFVF9JUlFfQklUUwk1CisjZGVmaW5lIFZNODZfR0VUX0FORF9SRVNFVF9JUlEJNgorCisvKgorICogVGhpcyBpcyB0aGUgc3RhY2stbGF5b3V0IHNlZW4gYnkgdGhlIHVzZXIgc3BhY2UgcHJvZ3JhbSB3aGVuIHdlIGhhdmUKKyAqIGRvbmUgYSB0cmFuc2xhdGlvbiBvZiAiU0FWRV9BTEwiIGZyb20gdm04NiBtb2RlLiBUaGUgcmVhbCBrZXJuZWwgbGF5b3V0CisgKiBpcyAna2VybmVsX3ZtODZfcmVncycgKHNlZSBiZWxvdykuCisgKi8KKworc3RydWN0IHZtODZfcmVncyB7CisvKgorICogbm9ybWFsIHJlZ3MsIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciB0aGUgc2VnbWVudCBkZXNjcmlwdG9ycy4uCisgKi8KKwlsb25nIGVieDsKKwlsb25nIGVjeDsKKwlsb25nIGVkeDsKKwlsb25nIGVzaTsKKwlsb25nIGVkaTsKKwlsb25nIGVicDsKKwlsb25nIGVheDsKKwlsb25nIF9fbnVsbF9kczsKKwlsb25nIF9fbnVsbF9lczsKKwlsb25nIF9fbnVsbF9mczsKKwlsb25nIF9fbnVsbF9nczsKKwlsb25nIG9yaWdfZWF4OworCWxvbmcgZWlwOworCXVuc2lnbmVkIHNob3J0IGNzLCBfX2NzaDsKKwlsb25nIGVmbGFnczsKKwlsb25nIGVzcDsKKwl1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisvKgorICogdGhlc2UgYXJlIHNwZWNpZmljIHRvIHY4NiBtb2RlOgorICovCisJdW5zaWduZWQgc2hvcnQgZXMsIF9fZXNoOworCXVuc2lnbmVkIHNob3J0IGRzLCBfX2RzaDsKKwl1bnNpZ25lZCBzaG9ydCBmcywgX19mc2g7CisJdW5zaWduZWQgc2hvcnQgZ3MsIF9fZ3NoOworfTsKKworc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIF9fbWFwWzhdOwkJCS8qIDI1NiBiaXRzICovCit9OworCitzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgeworCXN0cnVjdCB2bTg2X3JlZ3MgcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2NyZWVuX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIGNwdV90eXBlOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnRfcmV2ZWN0b3JlZDsKKwlzdHJ1Y3QgcmV2ZWN0b3JlZF9zdHJ1Y3QgaW50MjFfcmV2ZWN0b3JlZDsKK307CisKKy8qCisgKiBmbGFncyBtYXNrcworICovCisjZGVmaW5lIFZNODZfU0NSRUVOX0JJVE1BUAkweDAwMDEKKworc3RydWN0IHZtODZwbHVzX2luZm9fc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZvcmNlX3JldHVybl9mb3JfcGljOjE7CisJdW5zaWduZWQgbG9uZyB2bTg2ZGJnX2FjdGl2ZToxOyAgICAgICAvKiBmb3IgZGVidWdnZXIgKi8KKwl1bnNpZ25lZCBsb25nIHZtODZkYmdfVEZwZW5kaWc6MTsgICAgIC8qIGZvciBkZWJ1Z2dlciAqLworCXVuc2lnbmVkIGxvbmcgdW51c2VkOjI4OworCXVuc2lnbmVkIGxvbmcgaXNfdm04NnB1czoxOwkgICAgICAvKiBmb3Igdm04NiBpbnRlcm5hbCB1c2UgKi8KKwl1bnNpZ25lZCBjaGFyIHZtODZkYmdfaW50eHh0YWJbMzJdOyAgIC8qIGZvciBkZWJ1Z2dlciAqLworfTsKKworc3RydWN0IHZtODZwbHVzX3N0cnVjdCB7CisJc3RydWN0IHZtODZfcmVncyByZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzY3JlZW5fYml0bWFwOworCXVuc2lnbmVkIGxvbmcgY3B1X3R5cGU7CisJc3RydWN0IHJldmVjdG9yZWRfc3RydWN0IGludF9yZXZlY3RvcmVkOworCXN0cnVjdCByZXZlY3RvcmVkX3N0cnVjdCBpbnQyMV9yZXZlY3RvcmVkOworCXN0cnVjdCB2bTg2cGx1c19pbmZvX3N0cnVjdCB2bTg2cGx1czsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2FzbS92c3lzY2FsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdnN5c2NhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDE4YjZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdnN5c2NhbGwuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9BU01fWDg2XzY0X1ZTWVNDQUxMX0hfCisjZGVmaW5lIF9BU01fWDg2XzY0X1ZTWVNDQUxMX0hfCisKK2VudW0gdnN5c2NhbGxfbnVtIHsKKwlfX05SX3ZnZXR0aW1lb2ZkYXksCisJX19OUl92dGltZSwKKwlfX05SX3ZnZXRjcHUsCit9OworCisjZGVmaW5lIFZTWVNDQUxMX1NUQVJUICgtMTBVTCA8PCAyMCkKKyNkZWZpbmUgVlNZU0NBTExfU0laRSAxMDI0CisjZGVmaW5lIFZTWVNDQUxMX0VORCAoLTJVTCA8PCAyMCkKKyNkZWZpbmUgVlNZU0NBTExfTUFQUEVEX1BBR0VTIDEKKyNkZWZpbmUgVlNZU0NBTExfQUREUih2c3lzY2FsbF9ucikgKFZTWVNDQUxMX1NUQVJUK1ZTWVNDQUxMX1NJWkUqKHZzeXNjYWxsX25yKSkKKworCisjZW5kaWYgLyogX0FTTV9YODZfNjRfVlNZU0NBTExfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3ZzeXNjYWxsMzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXNtL3ZzeXNjYWxsMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDRhNDlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc20vdnN5c2NhbGwzMi5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0FTTV9WU1lTQ0FMTDMyX0gKKyNkZWZpbmUgX0FTTV9WU1lTQ0FMTDMyX0ggMQorCisvKiBWYWx1ZXMgbmVlZCB0byBtYXRjaCBhcmNoL3g4Nl82NC9pYTMyL3ZzeXNjYWxsLmxkcyAqLworCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lIFZTWVNDQUxMMzJfQkFTRSAweGZmZmZlMDAwCisjZGVmaW5lIFZTWVNDQUxMMzJfU1lTRVhJVCAoVlNZU0NBTEwzMl9CQVNFICsgMHg0MTApCisjZWxzZQorI2RlZmluZSBWU1lTQ0FMTDMyX0JBU0UgMHhmZmZmZTAwMFVMCisjZGVmaW5lIFZTWVNDQUxMMzJfRU5EIChWU1lTQ0FMTDMyX0JBU0UgKyBQQUdFX1NJWkUpCisjZGVmaW5lIFZTWVNDQUxMMzJfRUhEUiAoKGNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKikgVlNZU0NBTEwzMl9CQVNFKQorCisjZGVmaW5lIFZTWVNDQUxMMzJfVlNZU0NBTEwgKCh2b2lkICopVlNZU0NBTEwzMl9CQVNFICsgMHg0MDApIAorI2RlZmluZSBWU1lTQ0FMTDMyX1NZU0VYSVQgKCh2b2lkICopVlNZU0NBTEwzMl9CQVNFICsgMHg0MTApCisjZGVmaW5lIFZTWVNDQUxMMzJfU0lHUkVUVVJOICgodm9pZCAqKVZTWVNDQUxMMzJfQkFTRSArIDB4NTAwKSAKKyNkZWZpbmUgVlNZU0NBTEwzMl9SVFNJR1JFVFVSTiAoKHZvaWQgKilWU1lTQ0FMTDMyX0JBU0UgKyAweDYwMCkgCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Fzc2VydC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc3NlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg5NzEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hc3NlcnQuaApAQCAtMCwwICsxLDExOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NC0yMDAxLDIwMDMsMjAwNCwyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMiBEaWFnbm9zdGljcwk8YXNzZXJ0Lmg+CisgKi8KKworI2lmZGVmCV9BU1NFUlRfSAorCisjIHVuZGVmCV9BU1NFUlRfSAorIyB1bmRlZglhc3NlcnQKKyMgdW5kZWYgX19BU1NFUlRfVk9JRF9DQVNUCisKKyMgaWZkZWYJX19VU0VfR05VCisjICB1bmRlZiBhc3NlcnRfcGVycm9yCisjIGVuZGlmCisKKyNlbmRpZiAvKiBhc3NlcnQuaAkqLworCisjZGVmaW5lCV9BU1NFUlRfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoMiw5NSkKKyMgZGVmaW5lIF9fQVNTRVJUX1ZPSURfQ0FTVCBzdGF0aWNfY2FzdDx2b2lkPgorI2Vsc2UKKyMgZGVmaW5lIF9fQVNTRVJUX1ZPSURfQ0FTVCAodm9pZCkKKyNlbmRpZgorCisvKiB2b2lkIGFzc2VydCAoaW50IGV4cHJlc3Npb24pOworCisgICBJZiBOREVCVUcgaXMgZGVmaW5lZCwgZG8gbm90aGluZy4KKyAgIElmIG5vdCwgYW5kIEVYUFJFU1NJT04gaXMgemVybywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgYWJvcnQuICAqLworCisjaWZkZWYJTkRFQlVHCisKKyMgZGVmaW5lIGFzc2VydChleHByKQkJKF9fQVNTRVJUX1ZPSURfQ0FTVCAoMCkpCisKKy8qIHZvaWQgYXNzZXJ0X3BlcnJvciAoaW50IGVycm51bSk7CisKKyAgIElmIE5ERUJVRyBpcyBkZWZpbmVkLCBkbyBub3RoaW5nLiAgSWYgbm90LCBhbmQgRVJSTlVNIGlzIG5vdCB6ZXJvLCBwcmludCBhbgorICAgZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBlcnJvciB0ZXh0IGZvciBFUlJOVU0gYW5kIGFib3J0LgorICAgKFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLikgKi8KKworIyBpZmRlZglfX1VTRV9HTlUKKyMgIGRlZmluZSBhc3NlcnRfcGVycm9yKGVycm51bSkJKF9fQVNTRVJUX1ZPSURfQ0FTVCAoMCkpCisjIGVuZGlmCisKKyNlbHNlIC8qIE5vdCBOREVCVUcuICAqLworCisjaWZuZGVmIF9BU1NFUlRfSF9ERUNMUworI2RlZmluZSBfQVNTRVJUX0hfREVDTFMKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBwcmludHMgYW4gIkFzc2VydGlvbiBmYWlsZWQiIG1lc3NhZ2UgYW5kIGFib3J0cy4gICovCitleHRlcm4gdm9pZCBfX2Fzc2VydF9mYWlsIChfX2NvbnN0IGNoYXIgKl9fYXNzZXJ0aW9uLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmUsIF9fY29uc3QgY2hhciAqX19mdW5jdGlvbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKy8qIExpa2V3aXNlLCBidXQgcHJpbnRzIHRoZSBlcnJvciB0ZXh0IGZvciBFUlJOVU0uICAqLworZXh0ZXJuIHZvaWQgX19hc3NlcnRfcGVycm9yX2ZhaWwgKGludCBfX2Vycm51bSwgX19jb25zdCBjaGFyICpfX2ZpbGUsCisJCQkJICB1bnNpZ25lZCBpbnQgX19saW5lLAorCQkJCSAgX19jb25zdCBjaGFyICpfX2Z1bmN0aW9uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworCisvKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhdCBhbGwgdXNlZCBoZXJlIGJ1dCBuZWVkZWQgZm9yIHN0YW5kYXJkCisgICBjb21wbGlhbmNlLiAgKi8KK2V4dGVybiB2b2lkIF9fYXNzZXJ0IChjb25zdCBjaGFyICpfX2Fzc2VydGlvbiwgY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19saW5lKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworCitfX0VORF9ERUNMUworI2VuZGlmIC8qIE5vdCBfQVNTRVJUX0hfREVDTFMgKi8KKworIyBkZWZpbmUgYXNzZXJ0KGV4cHIpCQkJCQkJCVwKKyAgKChleHByKQkJCQkJCQkJXAorICAgPyBfX0FTU0VSVF9WT0lEX0NBU1QgKDApCQkJCQkJXAorICAgOiBfX2Fzc2VydF9mYWlsIChfX1NUUklORyhleHByKSwgX19GSUxFX18sIF9fTElORV9fLCBfX0FTU0VSVF9GVU5DVElPTikpCisKKyMgaWZkZWYJX19VU0VfR05VCisjICBkZWZpbmUgYXNzZXJ0X3BlcnJvcihlcnJudW0pCQkJCQkJXAorICAoIShlcnJudW0pCQkJCQkJCQlcCisgICA/IF9fQVNTRVJUX1ZPSURfQ0FTVCAoMCkJCQkJCQlcCisgICA6IF9fYXNzZXJ0X3BlcnJvcl9mYWlsICgoZXJybnVtKSwgX19GSUxFX18sIF9fTElORV9fLCBfX0FTU0VSVF9GVU5DVElPTikpCisjIGVuZGlmCisKKy8qIFZlcnNpb24gMi40IGFuZCBsYXRlciBvZiBHQ0MgZGVmaW5lIGEgbWFnaWNhbCB2YXJpYWJsZSBgX19QUkVUVFlfRlVOQ1RJT05fXycKKyAgIHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgYmVpbmcgZGVmaW5lZC4KKyAgIFRoaXMgaXMgYnJva2VuIGluIEcrKyBiZWZvcmUgdmVyc2lvbiAyLjYuCisgICBDOXggaGFzIGEgc2ltaWxhciB2YXJpYWJsZSBjYWxsZWQgX19mdW5jX18sIGJ1dCBwcmVmZXIgdGhlIEdDQyBvbmUgc2luY2UKKyAgIGl0IGRlbWFuZ2xlcyBDKysgZnVuY3Rpb24gbmFtZXMuICAqLworIyBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzID8gX19HTlVDX1BSRVJFUSAoMiwgNikgOiBfX0dOVUNfUFJFUkVRICgyLCA0KQorIyAgIGRlZmluZSBfX0FTU0VSVF9GVU5DVElPTglfX1BSRVRUWV9GVU5DVElPTl9fCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICBkZWZpbmUgX19BU1NFUlRfRlVOQ1RJT04JX19mdW5jX18KKyMgIGVsc2UKKyMgICBkZWZpbmUgX19BU1NFUlRfRlVOQ1RJT04JKChfX2NvbnN0IGNoYXIgKikgMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiBOREVCVUcuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hdWRpb2ZpbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVkaW9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5YzBiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYXVkaW9maWxlLmgKQEAgLTAsMCArMSw2MDEgQEAKKy8qCisJQXVkaW8gRmlsZSBMaWJyYXJ5CisJQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAsIE1pY2hhZWwgUHJ1ZXR0IDxtaWNoYWVsQDY4ay5vcmc+CisKKwlUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKwlMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKwl2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKwlUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKwlidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisJTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKwlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisJQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBLgorKi8KKworLyoKKwlhdWRpb2ZpbGUuaAorCisJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwdWJsaWMgaW50ZXJmYWNlcyB0byB0aGUgQXVkaW8gRmlsZSBMaWJyYXJ5LgorKi8KKworI2lmbmRlZiBBVURJT0ZJTEVfSAorI2RlZmluZSBBVURJT0ZJTEVfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YXVwdmxpc3QuaD4KKworI2RlZmluZSBMSUJBVURJT0ZJTEVfTUFKT1JfVkVSU0lPTiAwCisjZGVmaW5lIExJQkFVRElPRklMRV9NSU5PUl9WRVJTSU9OIDIKKyNkZWZpbmUgTElCQVVESU9GSUxFX01JQ1JPX1ZFUlNJT04gNAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCit0eXBlZGVmIHN0cnVjdCBfQUZ2aXJ0dWFsZmlsZSBBRnZpcnR1YWxmaWxlOworCit0eXBlZGVmIHN0cnVjdCBfQUZmaWxlc2V0dXAgKkFGZmlsZXNldHVwOwordHlwZWRlZiBzdHJ1Y3QgX0FGZmlsZWhhbmRsZSAqQUZmaWxlaGFuZGxlOwordHlwZWRlZiB2b2lkICgqQUZlcnJmdW5jKShsb25nLCBjb25zdCBjaGFyICopOworCit0eXBlZGVmIG9mZl90IEFGZnJhbWVjb3VudDsKK3R5cGVkZWYgb2ZmX3QgQUZmaWxlb2Zmc2V0OworCisjZGVmaW5lIEFGX05VTExfRklMRVNFVFVQCSgoc3RydWN0IF9BRmZpbGVzZXR1cCAqKSAwKQorI2RlZmluZSBBRl9OVUxMX0ZJTEVIQU5ETEUJKChzdHJ1Y3QgX0FGZmlsZWhhbmRsZSAqKSAwKQorCisjZGVmaW5lIEFGX0VSUl9CQVNFIDMwMDAKKworZW51bQoreworCUFGX0RFRkFVTFRfVFJBQ0sgPSAxMDAxCit9OworCitlbnVtCit7CisJQUZfREVGQVVMVF9JTlNUID0gMjAwMQorfTsKKworZW51bQoreworCUFGX05VTV9VTkxJTUlURUQgPSA5OTk5OQorfTsKKworZW51bQoreworCUFGX0JZVEVPUkRFUl9CSUdFTkRJQU4gPSA1MDEsCisJQUZfQllURU9SREVSX0xJVFRMRUVORElBTiA9IDUwMgorfTsKKworZW51bQoreworCUFGX0ZJTEVfVU5LTk9XTiA9IC0xLAorCUFGX0ZJTEVfUkFXREFUQSA9IDAsCisJQUZfRklMRV9BSUZGQyA9IDEsCisJQUZfRklMRV9BSUZGID0gMiwKKwlBRl9GSUxFX05FWFRTTkQgPSAzLAorCUFGX0ZJTEVfV0FWRSA9IDQsCisJQUZfRklMRV9CSUNTRiA9IDUsCisJQUZfRklMRV9JUkNBTSA9IEFGX0ZJTEVfQklDU0YsCisJQUZfRklMRV9NUEVHMUJJVFNUUkVBTSA9IDYsCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUFGX0ZJTEVfU09VTkRERVNJR05FUjEgPSA3LAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlBRl9GSUxFX1NPVU5EREVTSUdORVIyID0gOCwJLyogbm90IGltcGxlbWVudGVkICovCisJQUZfRklMRV9BVlIgPSA5LAorCUFGX0ZJTEVfSUZGXzhTVlggPSAxMCwKKwlBRl9GSUxFX1NBTVBMRVZJU0lPTiA9IDExLAkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwlBRl9GSUxFX1ZPQyA9IDEyLAkJLyogbm90IGltcGxlbWVudGVkICovCisJQUZfRklMRV9OSVNUX1NQSEVSRSA9IDEzLAorCUFGX0ZJTEVfU09VTkRGT05UMiA9IDE0CQkvKiBub3QgaW1wbGVtZW50ZWQgKi8KK307CisKK2VudW0KK3sKKwlBRl9MT09QX01PREVfTk9MT09QID0gMCwKKwlBRl9MT09QX01PREVfRk9SVyA9IDEsCisJQUZfTE9PUF9NT0RFX0ZPUldCQUtXID0gMgorfTsKKworZW51bQoreworCUFGX1NBTVBGTVRfVFdPU0NPTVAgPSA0MDEsIC8qIGxpbmVhciB0d28ncyBjb21wbGVtZW50ICovCisJQUZfU0FNUEZNVF9VTlNJR05FRCA9IDQwMiwgLyogdW5zaWduZWQgaW50ZWdlciAqLworCUFGX1NBTVBGTVRfRkxPQVQgPSA0MDMsIC8qIDMyLWJpdCBJRUVFIGZsb2F0aW5nLXBvaW50ICovCisJQUZfU0FNUEZNVF9ET1VCTEUgPSA0MDQgLyogNjQtYml0IElFRUUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCAqLworfTsKKworZW51bQoreworCUFGX0lOU1RfTE9PUF9PRkYgPSAwLAkJCS8qIG5vIGxvb3BpbmcgKi8KKwlBRl9JTlNUX0xPT1BfQ09OVElOVU9VUyA9IDEsCS8qIGxvb3AgY29udGludW91c2x5IHRocm91Z2ggZGVjYXkgKi8KKwlBRl9JTlNUX0xPT1BfU1VTVEFJTiA9IDMJCS8qIGxvb3AgZHVyaW5nIHN1c3RhaW4sIHRoZW4gY29udGludWUgKi8KK307CisKK2VudW0KK3sKKwlBRl9JTlNUX01JRElfQkFTRU5PVEUgPSAzMDEsCisJQUZfSU5TVF9OVU1DRU5UU19ERVRVTkUgPSAzMDIsCisJQUZfSU5TVF9NSURJX0xPTk9URSA9IDMwMywKKwlBRl9JTlNUX01JRElfSElOT1RFID0gMzA0LAorCUFGX0lOU1RfTUlESV9MT1ZFTE9DSVRZID0gMzA1LAorCUFGX0lOU1RfTUlESV9ISVZFTE9DSVRZID0gMzA2LAorCUFGX0lOU1RfTlVNREJTX0dBSU4gPSAzMDcsCisJQUZfSU5TVF9TVVNMT09QSUQgPSAzMDgsCQkvKiBsb29wIGlkIGZvciBBSUZGIHN1c3RhaW4gbG9vcCAqLworCUFGX0lOU1RfUkVMTE9PUElEID0gMzA5LAkJLyogbG9vcCBpZCBmb3IgQUlGRiByZWxlYXNlIGxvb3AgKi8KKwlBRl9JTlNUX1NBTVBfU1RBUlRGUkFNRSA9IDMxMCwJLyogc3RhcnQgc2FtcGxlIGZvciB0aGlzIGluc3QgKi8KKwlBRl9JTlNUX1NBTVBfRU5ERlJBTUUgPSAzMTEsCS8qIGVuZCBzYW1wbGUgZm9yIHRoaXMgaW5zdCAqLworCUFGX0lOU1RfU0FNUF9NT0RFID0gMzEyLAkJLyogbG9vcGluZyBtb2RlIGZvciB0aGlzIGluc3QgKi8KKwlBRl9JTlNUX1RSQUNLSUQgPSAzMTMsCisJQUZfSU5TVF9OQU1FID0gMzE0LAkJCQkvKiBuYW1lIG9mIHRoaXMgaW5zdCAqLworCUFGX0lOU1RfU0FNUF9SQVRFID0gMzE1LAkJLyogc2FtcGxlIHJhdGUgb2YgdGhpcyBpbnN0J3Mgc2FtcGxlICovCisJQUZfSU5TVF9QUkVTRVRJRCA9IDMxNiwJCQkvKiBJRCBvZiBwcmVzZXQgY29udGFpbmluZyB0aGlzIGluc3QgKi8KKwlBRl9JTlNUX1BSRVNFVF9OQU1FID0gMzE3CQkvKiBuYW1lIG9mIHByZXNldCBjb250YWluaW5nIHRoaXMgaW5zdCAqLworfTsKKworZW51bQoreworCUFGX01JU0NfVU5SRUNPR05JWkVEID0gMCwJLyogdW5yZWNvZ25pemVkIGRhdGEgY2h1bmsgKi8KKwlBRl9NSVNDX0NPUFkgPSAyMDEsCS8qIGNvcHlyaWdodCBzdHJpbmcgKi8KKwlBRl9NSVNDX0FVVEggPSAyMDIsCS8qIGF1dGhvciBzdHJpbmcgKi8KKwlBRl9NSVNDX05BTUUgPSAyMDMsCS8qIG5hbWUgc3RyaW5nICovCisJQUZfTUlTQ19BTk5PID0gMjA0LAkvKiBhbm5vdGF0aW9uIHN0cmluZyAqLworCUFGX01JU0NfQVBQTCA9IDIwNSwJLyogYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YSAqLworCUFGX01JU0NfTUlESSA9IDIwNiwJLyogTUlESSBleGNsdXNpdmUgZGF0YSAqLworCUFGX01JU0NfUENNTUFQID0gMjA3LAkvKiBQQ00gbWFwcGluZyBpbmZvcm1hdGlvbiAoZnV0dXJlIHVzZSkgKi8KKwlBRl9NSVNDX05lWFQgPSAyMDgsCS8qIG1pc2MgYmluYXJ5IGRhdGEgYXBwZW5kZWQgdG8gTmVYVCBoZWFkZXIgKi8KKwlBRl9NSVNDX0lSQ0FNX1BFQUtBTVAgPSAyMDksCS8qIHBlYWsgYW1wbGl0dWRlIGluZm9ybWF0aW9uICovCisJQUZfTUlTQ19JUkNBTV9DT01NRU5UID0gMjEwLAkvKiBCSUNTRiB0ZXh0IGNvbW1lbnQgKi8KKwlBRl9NSVNDX0NPTU1FTlQgPSAyMTAsCS8qIGdlbmVyYWwgdGV4dCBjb21tZW50ICovCisKKwlBRl9NSVNDX0lDTVQgPSBBRl9NSVNDX0NPTU1FTlQsCS8qIGNvbW1lbnRzIGNodW5rIChXQVZFIGZvcm1hdCkgKi8KKwlBRl9NSVNDX0lDUkQgPSAyMTEsICAvKiBjcmVhdGlvbiBkYXRlIChXQVZFIGZvcm1hdCkgKi8KKwlBRl9NSVNDX0lTRlQgPSAyMTIgIC8qIHNvZnR3YXJlIG5hbWUgKFdBVkUgZm9ybWF0KSAqLworfTsKKworZW51bQoreworCS8qIHN1cHBvcnRlZCBjb21wcmVzc2lvbiBzY2hlbWVzICovCisJQUZfQ09NUFJFU1NJT05fVU5LTk9XTiA9IC0xLAorCUFGX0NPTVBSRVNTSU9OX05PTkUgPSAwLAorCUFGX0NPTVBSRVNTSU9OX0c3MjIgPSA1MDEsCisJQUZfQ09NUFJFU1NJT05fRzcxMV9VTEFXID0gNTAyLAorCUFGX0NPTVBSRVNTSU9OX0c3MTFfQUxBVyA9IDUwMywKKworCS8qIEFwcGxlIHByb3ByaWV0YXJ5IEFJRkYtQyBjb21wcmVzc2lvbiBzY2hlbWVzIChub3Qgc3VwcG9ydGVkKSAqLworCUFGX0NPTVBSRVNTSU9OX0FQUExFX0FDRTIgPSA1MDQsCisJQUZfQ09NUFJFU1NJT05fQVBQTEVfQUNFOCA9IDUwNSwKKwlBRl9DT01QUkVTU0lPTl9BUFBMRV9NQUMzID0gNTA2LAorCUFGX0NPTVBSRVNTSU9OX0FQUExFX01BQzYgPSA1MDcsCisKKwlBRl9DT01QUkVTU0lPTl9HNzI2ID0gNTE3LAorCUFGX0NPTVBSRVNTSU9OX0c3MjggPSA1MTgsCisJQUZfQ09NUFJFU1NJT05fRFZJX0FVRElPID0gNTE5LAorCUFGX0NPTVBSRVNTSU9OX0lNQSA9IEFGX0NPTVBSRVNTSU9OX0RWSV9BVURJTywKKwlBRl9DT01QUkVTU0lPTl9HU00gPSA1MjAsCisJQUZfQ09NUFJFU1NJT05fRlMxMDE2ID0gNTIxLAorCUFGX0NPTVBSRVNTSU9OX0RWID0gNTIyLAorCUFGX0NPTVBSRVNTSU9OX01TX0FEUENNID0gNTIzCit9OworCisvKiB0b2tlbnMgZm9yIGFmUXVlcnkoKSAtLSBzZWUgdGhlIG1hbiBwYWdlIGZvciBpbnN0cnVjdGlvbnMgKi8KKy8qIGxldmVsIDEgc2VsZWN0b3JzICovCitlbnVtCit7CisJQUZfUVVFUllUWVBFX0lOU1RQQVJBTSA9IDUwMCwKKwlBRl9RVUVSWVRZUEVfRklMRUZNVCA9IDUwMSwKKwlBRl9RVUVSWVRZUEVfQ09NUFJFU1NJT04gPSA1MDIsCisJQUZfUVVFUllUWVBFX0NPTVBSRVNTSU9OUEFSQU0gPSA1MDMsCisJQUZfUVVFUllUWVBFX01JU0MgPSA1MDQsCisJQUZfUVVFUllUWVBFX0lOU1QgPSA1MDUsCisJQUZfUVVFUllUWVBFX01BUksgPSA1MDYsCisJQUZfUVVFUllUWVBFX0xPT1AgPSA1MDcKK307CisKKy8qIGxldmVsIDIgc2VsZWN0b3JzICovCitlbnVtCit7CisJQUZfUVVFUllfTkFNRSA9IDYwMCwJLyogZ2V0IG5hbWUgKDEtMyB3b3JkcykgKi8KKwlBRl9RVUVSWV9ERVNDID0gNjAxLAkvKiBnZXQgZGVzY3JpcHRpb24gKi8KKwlBRl9RVUVSWV9MQUJFTCA9IDYwMiwJLyogZ2V0IDQtIG9yIDUtY2hhciBsYWJlbCAqLworCUFGX1FVRVJZX1RZUEUgPSA2MDMsCS8qIGdldCB0eXBlIHRva2VuICovCisJQUZfUVVFUllfREVGQVVMVCA9IDYwNCwJLyogZGZsdC4gdmFsdWUgZm9yIHBhcmFtICovCisJQUZfUVVFUllfSURfQ09VTlQgPSA2MDUsCS8qIGdldCBudW1iZXIgb2YgaWRzIGF2YWlsLiAqLworCUFGX1FVRVJZX0lEUyA9IDYwNiwJLyogZ2V0IGFycmF5IG9mIGlkIHRva2VucyAqLworCUFGX1FVRVJZX0lNUExFTUVOVEVEID0gNjEzLAkvKiBib29sZWFuICovCisJQUZfUVVFUllfVFlQRV9DT1VOVCA9IDYwNywJLyogZ2V0IG51bWJlciBvZiB0eXBlcyBhdi4gKi8KKwlBRl9RVUVSWV9UWVBFUyA9IDYwOCwJLyogZ2V0IGFycmF5IG9mIHR5cGVzICovCisJQUZfUVVFUllfTkFUSVZFX1NBTVBGTVQgPSA2MDksCS8qIGZvciBjb21wcmVzc2lvbiAqLworCUFGX1FVRVJZX05BVElWRV9TQU1QV0lEVEggPSA2MTAsCisJQUZfUVVFUllfU1FVSVNIRkFDID0gNjExLAkvKiAxLjAgbWVhbnMgdmFyaWFibGUgKi8KKwlBRl9RVUVSWV9NQVhfTlVNQkVSID0gNjEyLAkvKiBtYXggYWxsb3dlZCBpbiBmaWxlICovCisJQUZfUVVFUllfU1VQUE9SVEVEID0gNjEzCS8qIGluc3RzLCBsb29wcywgZXRjLiwgc3VwcG9ydGVkPyAqLworfTsKKworLyogbGV2ZWwgMiBzZWxlY3RvcnMgd2hpY2ggaGF2ZSBzdWItc2VsZWN0b3JzICovCitlbnVtCit7CisJQUZfUVVFUllfVFJBQ0tTID0gNjIwLAorCUFGX1FVRVJZX0NIQU5ORUxTID0gNjIxLAorCUFGX1FVRVJZX1NBTVBMRV9TSVpFUyA9IDYyMiwKKwlBRl9RVUVSWV9TQU1QTEVfRk9STUFUUyA9IDYyMywKKwlBRl9RVUVSWV9DT01QUkVTU0lPTl9UWVBFUyA9IDYyNAorfTsKKworLyogbGV2ZWwgMyBzdWItc2VsZWN0b3JzICovCitlbnVtCit7CisJQUZfUVVFUllfVkFMVUVfQ09VTlQgPSA2NTAsCS8qIG51bWJlciBvZiB2YWx1ZXMgb2YgdGhlIGFib3ZlICovCisJQUZfUVVFUllfVkFMVUVTID0gNjUxCS8qIGFycmF5IG9mIHRob3NlIHZhbHVlcyAqLworfTsKKworCisvKgorCU9sZCBBdWRpbyBGaWxlIExpYnJhcnkgZXJyb3IgY29kZXMuIFRoZXNlIGFyZSBzdGlsbCByZXR1cm5lZCBieSB0aGUKKwlBRmVycm9yaGFuZGxlciBjYWxscywgYnV0IGFyZSBub3QgdXNlZCBieSB0aGUgbmV3IGRpZ2l0YWwgbWVkaWEgbGlicmFyeQorCWVycm9yIHJlcG9ydGluZyByb3V0aW5lcy4gU2VlIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIGZvciB0aGUgbmV3IGVycm9yCisJdG9rZW5zLgorKi8KKworZW51bQoreworCUFGX0JBRF9OT1RfSU1QTEVNRU5URUQgPSAwLAkvKiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisJQUZfQkFEX0ZJTEVIQU5ETEUgPSAxLAkvKiB0cmllZCB0byB1c2UgaW52YWxpZCBmaWxlaGFuZGxlICovCisJQUZfQkFEX09QRU4gPSAzLAkvKiB1bml4IG9wZW4gZmFpbGVkICovCisJQUZfQkFEX0NMT1NFID0gNCwJLyogdW5peCBjbG9zZSBmYWlsZWQgKi8KKwlBRl9CQURfUkVBRCA9IDUsCS8qIHVuaXggcmVhZCBmYWlsZWQgKi8KKwlBRl9CQURfV1JJVEUgPSA2LAkvKiB1bml4IHdyaXRlIGZhaWxlZCAqLworCUFGX0JBRF9MU0VFSyA9IDcsCS8qIHVuaXggbHNlZWsgZmFpbGVkICovCisJQUZfQkFEX05PX0ZJTEVIQU5ETEUgPSA4LAkvKiBmYWlsZWQgdG8gYWxsb2NhdGUgYSBmaWxlaGFuZGxlIHN0cnVjdCAqLworCUFGX0JBRF9BQ0NNT0RFID0gMTAsCS8qIHVucmVjb2duaXplZCBhdWRpbyBmaWxlIGFjY2VzcyBtb2RlICovCisJQUZfQkFEX05PV1JJVEVBQ0MgPSAxMSwJLyogZmlsZSBub3Qgb3BlbiBmb3Igd3JpdGluZyAqLworCUFGX0JBRF9OT1JFQURBQ0MgPSAxMiwJLyogZmlsZSBub3Qgb3BlbiBmb3IgcmVhZGluZyAqLworCUFGX0JBRF9GSUxFRk1UID0gMTMsCS8qIHVucmVjb2duaXplZCBhdWRpbyBmaWxlIGZvcm1hdCAqLworCUFGX0JBRF9SQVRFID0gMTQsCS8qIGludmFsaWQgc2FtcGxlIHJhdGUgKi8KKwlBRl9CQURfQ0hBTk5FTFMgPSAxNSwJLyogaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMqLworCUFGX0JBRF9TQU1QQ05UID0gMTYsCS8qIGludmFsaWQgc2FtcGxlIGNvdW50ICovCisJQUZfQkFEX1dJRFRIID0gMTcsCS8qIGludmFsaWQgc2FtcGxlIHdpZHRoICovCisJQUZfQkFEX1NFRUtNT0RFID0gMTgsCS8qIGludmFsaWQgc2VlayBtb2RlICovCisJQUZfQkFEX05PX0xPT1BEQVRBID0gMTksCS8qIGZhaWxlZCB0byBhbGxvY2F0ZSBsb29wIHN0cnVjdCAqLworCUFGX0JBRF9NQUxMT0MgPSAyMCwJLyogbWFsbG9jIGZhaWxlZCBzb21ld2hlcmUgKi8KKwlBRl9CQURfTE9PUElEID0gMjEsCisJQUZfQkFEX1NBTVBGTVQgPSAyMiwJLyogYmFkIHNhbXBsZSBmb3JtYXQgKi8KKwlBRl9CQURfRklMRVNFVFVQID0gMjMsCS8qIGJhZCBmaWxlIHNldHVwIHN0cnVjdHVyZSovCisJQUZfQkFEX1RSQUNLSUQgPSAyNCwJLyogbm8gdHJhY2sgY29ycmVzcG9uZGluZyB0byBpZCAqLworCUFGX0JBRF9OVU1UUkFDS1MgPSAyNSwJLyogd3JvbmcgbnVtYmVyIG9mIHRyYWNrcyBmb3IgZmlsZSBmb3JtYXQgKi8KKwlBRl9CQURfTk9fRklMRVNFVFVQID0gMjYsCS8qIGZhaWxlZCB0byBhbGxvY2F0ZSBhIGZpbGVzZXR1cCBzdHJ1Y3QqLworCUFGX0JBRF9MT09QTU9ERSA9IDI3LAkvKiB1bnJlY29nbml6ZWQgbG9vcCBtb2RlIHZhbHVlICovCisJQUZfQkFEX0lOU1RJRCA9IDI4LAkvKiBpbnZhbGlkIGluc3RydW1lbnQgaWQgKi8KKwlBRl9CQURfTlVNTE9PUFMgPSAyOSwJLyogYmFkIG51bWJlciBvZiBsb29wcyAqLworCUFGX0JBRF9OVU1NQVJLUyA9IDMwLAkvKiBiYWQgbnVtYmVyIG9mIG1hcmtlcnMgKi8KKwlBRl9CQURfTUFSS0lEID0gMzEsCS8qIGJhZCBtYXJrZXIgaWQgKi8KKwlBRl9CQURfTUFSS1BPUyA9IDMyLAkvKiBpbnZhbGlkIG1hcmtlciBwb3NpdGlvbiB2YWx1ZSAqLworCUFGX0JBRF9OVU1JTlNUUyA9IDMzLAkvKiBpbnZhbGlkIG51bWJlciBvZiBpbnN0cnVtZW50cyAqLworCUFGX0JBRF9OT0FFU0RBVEEgPSAzNCwKKwlBRl9CQURfTUlTQ0lEID0gMzUsCisJQUZfQkFEX05VTU1JU0MgPSAzNiwKKwlBRl9CQURfTUlTQ1NJWkUgPSAzNywKKwlBRl9CQURfTUlTQ1RZUEUgPSAzOCwKKwlBRl9CQURfTUlTQ1NFRUsgPSAzOSwKKwlBRl9CQURfU1RSTEVOID0gNDAsCS8qIGludmFsaWQgc3RyaW5nIGxlbmd0aCAqLworCUFGX0JBRF9SQVRFQ09OViA9IDQ1LAorCUFGX0JBRF9TWU5DRklMRSA9IDQ2LAorCUFGX0JBRF9DT0RFQ19DT05GSUcgPSA0NywJLyogaW1wcm9wZXJseSBjb25maWd1cmVkIGNvZGVjICovCisJQUZfQkFEX0NPREVDX1NUQVRFID0gNDgsCS8qIGludmFsaWQgY29kZWMgc3RhdGU6IGNhbid0IHJlY292ZXIgKi8KKwlBRl9CQURfQ09ERUNfTElDRU5TRSA9IDQ5LAkvKiBubyBsaWNlbnNlIGF2YWlsYWJsZSBmb3IgY29kZWMgKi8KKwlBRl9CQURfQ09ERUNfVFlQRSA9IDUwLAkvKiB1bnN1cHBvcnRlZCBjb2RlYyB0eXBlICovCisJQUZfQkFEX0NPTVBSRVNTSU9OID0gQUZfQkFEX0NPREVDX0NPTkZJRywJLyogZm9yIGJhY2sgY29tcGF0ICovCisJQUZfQkFEX0NPTVBUWVBFID0gQUZfQkFEX0NPREVDX1RZUEUsCS8qIGZvciBiYWNrIGNvbXBhdCAqLworCisJQUZfQkFEX0lOU1RQVFlQRSA9IDUxLAkvKiBpbnZhbGlkIGluc3RydW1lbnQgcGFyYW1ldGVyIHR5cGUgKi8KKwlBRl9CQURfSU5TVFBJRCA9IDUyLAkvKiBpbnZhbGlkIGluc3RydW1lbnQgcGFyYW1ldGVyIGlkICovCisJQUZfQkFEX0JZVEVPUkRFUiA9IDUzLAorCUFGX0JBRF9GSUxFRk1UX1BBUkFNID0gNTQsCS8qIHVucmVjb2duaXplZCBmaWxlIGZvcm1hdCBwYXJhbWV0ZXIgKi8KKwlBRl9CQURfQ09NUF9QQVJBTSA9IDU1LAkvKiB1bnJlY29nbml6ZWQgY29tcHJlc3Npb24gcGFyYW1ldGVyICovCisJQUZfQkFEX0RBVEFPRkZTRVQgPSA1NiwJLyogYmFkIGRhdGEgb2Zmc2V0ICovCisJQUZfQkFEX0ZSQU1FQ05UID0gNTcsCS8qIGJhZCBmcmFtZSBjb3VudCAqLworCUFGX0JBRF9RVUVSWVRZUEUgPSA1OCwJLyogYmFkIHF1ZXJ5IHR5cGUgKi8KKwlBRl9CQURfUVVFUlkgPSA1OSwJLyogYmFkIGFyZ3VtZW50IHRvIGFmUXVlcnkoKSAqLworCUFGX1dBUk5JTkdfQ09ERUNfUkFURSA9IDYwLAkvKiB1c2luZyA4ayBpbnN0ZWFkIG9mIGNvZGVjIHJhdGUgODAxMiAqLworCUFGX1dBUk5JTkdfUkFURUNWVCA9IDYxLAkvKiB3YXJuaW5nIGFib3V0IHJhdGUgY29udmVyc2lvbiB1c2VkICovCisKKwlBRl9CQURfSEVBREVSID0gNjIsCS8qIGZhaWxlZCB0byBwYXJzZSBoZWFkZXIgKi8KKwlBRl9CQURfRlJBTUUgPSA2MywJLyogYmFkIGZyYW1lIG51bWJlciAqLworCUFGX0JBRF9MT09QQ09VTlQgPSA2NCwJLyogYmFkIGxvb3AgY291bnQgKi8KKwlBRl9CQURfRE1FRElBX0NBTEwgPSA2NSwJLyogZXJyb3IgaW4gZG1lZGlhIHN1YnN5c3RlbSBjYWxsICovCisKKwkvKiBBSUZGL0FJRkYtQyBzcGVjaWZpYyBlcnJvcnMgd2hlbiBwYXJzaW5nIGZpbGUgaGVhZGVyICovCisJQUZfQkFEX0FJRkZfSEVBREVSID0gMTA4LAkvKiBmYWlsZWQgdG8gcGFyc2UgY2h1bmsgaGVhZGVyICovCisJQUZfQkFEX0FJRkZfRk9STSA9IDEwOSwJLyogZmFpbGVkIHRvIHBhcnNlIEZPUk0gY2h1bmsgKi8KKwlBRl9CQURfQUlGRl9TU05EID0gMTEwLAkvKiBmYWlsZWQgdG8gcGFyc2UgU1NORCBjaHVuayAqLworCUFGX0JBRF9BSUZGX0NIVU5LSUQgPSAxMTEsCS8qIHVucmVjb2duaXplZCBBSUZGL0FJRkYtQyBjaHVuayBpZCAqLworCUFGX0JBRF9BSUZGX0NPTU0gPSAxMTIsCS8qIGZhaWxlZCB0byBwYXJzZSBDT01NIGNodW5rICovCisJQUZfQkFEX0FJRkZfSU5TVCA9IDExMywJLyogZmFpbGVkIHRvIHBhcnNlIElOU1QgY2h1bmsgKi8KKwlBRl9CQURfQUlGRl9NQVJLID0gMTE0LAkvKiBmYWlsZWQgdG8gcGFyc2UgTUFSSyBjaHVuayAqLworCUFGX0JBRF9BSUZGX1NLSVAgPSAxMTUsCS8qIGZhaWxlZCB0byBza2lwIHVuc3VwcG9ydGVkIGNodW5rICovCisJQUZfQkFEX0FJRkZfTE9PUE1PREUgPSAxMTYJLyogdW5yZWNvZ25pemVkIGxvb3AgbW9kZSAoZm9ydywgZXRjKSovCit9OworCisvKiBuZXcgZXJyb3IgY29kZXMgd2hpY2ggbWF5IGJlIHJldHJpZXZlZCB2aWEgZG1HZXRFcnJvcigpICovCisvKiBUaGUgb2xkIGVycm9yIHRva2VucyBjb250aW51ZSB0byBiZSByZXRyaWV2YWJsZSB2aWEgdGhlIEFGZXJyb3JoYW5kbGVyICovCisvKiBBRl9FUlJfQkFTRSBpcyAjZGVmaW5lZCBpbiBkbWVkaWEvZG1lZGlhLmggKi8KKworZW51bQoreworCUFGX0VSUl9OT1RfSU1QTEVNRU5URUQgPSAwK0FGX0VSUl9CQVNFLAkvKiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisJQUZfRVJSX0JBRF9GSUxFSEFORExFID0gMStBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBmaWxlaGFuZGxlICovCisJQUZfRVJSX0JBRF9SRUFEID0gNStBRl9FUlJfQkFTRSwJLyogdW5peCByZWFkIGZhaWxlZCAqLworCUFGX0VSUl9CQURfV1JJVEUgPSA2K0FGX0VSUl9CQVNFLAkvKiB1bml4IHdyaXRlIGZhaWxlZCAqLworCUFGX0VSUl9CQURfTFNFRUsgPSA3K0FGX0VSUl9CQVNFLAkvKiB1bml4IGxzZWVrIGZhaWxlZCAqLworCUFGX0VSUl9CQURfQUNDTU9ERSA9IDEwK0FGX0VSUl9CQVNFLAkvKiB1bnJlY29nbml6ZWQgYXVkaW8gZmlsZSBhY2Nlc3MgbW9kZSAqLworCUFGX0VSUl9OT19XUklURUFDQyA9IDExK0FGX0VSUl9CQVNFLAkvKiBmaWxlIG5vdCBvcGVuIGZvciB3cml0aW5nICovCisJQUZfRVJSX05PX1JFQURBQ0MgPSAxMitBRl9FUlJfQkFTRSwJLyogZmlsZSBub3Qgb3BlbiBmb3IgcmVhZGluZyAqLworCUFGX0VSUl9CQURfRklMRUZNVCA9IDEzK0FGX0VSUl9CQVNFLAkvKiB1bnJlY29nbml6ZWQgYXVkaW8gZmlsZSBmb3JtYXQgKi8KKwlBRl9FUlJfQkFEX1JBVEUgPSAxNCtBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBzYW1wbGUgcmF0ZSAqLworCUFGX0VSUl9CQURfQ0hBTk5FTFMgPSAxNStBRl9FUlJfQkFTRSwJLyogaW52YWxpZCAjIGNoYW5uZWxzKi8KKwlBRl9FUlJfQkFEX1NBTVBDTlQgPSAxNitBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBzYW1wbGUgY291bnQgKi8KKwlBRl9FUlJfQkFEX1dJRFRIID0gMTcrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgc2FtcGxlIHdpZHRoICovCisJQUZfRVJSX0JBRF9TRUVLTU9ERSA9IDE4K0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIHNlZWsgbW9kZSAqLworCUFGX0VSUl9CQURfTE9PUElEID0gMjErQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgbG9vcCBpZCAqLworCUFGX0VSUl9CQURfU0FNUEZNVCA9IDIyK0FGX0VSUl9CQVNFLAkvKiBiYWQgc2FtcGxlIGZvcm1hdCAqLworCUFGX0VSUl9CQURfRklMRVNFVFVQID0gMjMrQUZfRVJSX0JBU0UsCS8qIGJhZCBmaWxlIHNldHVwIHN0cnVjdHVyZSovCisJQUZfRVJSX0JBRF9UUkFDS0lEID0gMjQrQUZfRVJSX0JBU0UsCS8qIG5vIHRyYWNrIGNvcnJlc3BvbmRpbmcgdG8gaWQgKi8KKwlBRl9FUlJfQkFEX05VTVRSQUNLUyA9IDI1K0FGX0VSUl9CQVNFLAkvKiB3cm9uZyBudW1iZXIgb2YgdHJhY2tzIGZvciBmaWxlIGZvcm1hdCAqLworCUFGX0VSUl9CQURfTE9PUE1PREUgPSAyNytBRl9FUlJfQkFTRSwJLyogdW5yZWNvZ25pemVkIGxvb3AgbW9kZSBzeW1ib2wgKi8KKwlBRl9FUlJfQkFEX0lOU1RJRCA9IDI4K0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIGluc3RydW1lbnQgaWQgKi8KKwlBRl9FUlJfQkFEX05VTUxPT1BTID0gMjkrQUZfRVJSX0JBU0UsCS8qIGJhZCBudW1iZXIgb2YgbG9vcHMgKi8KKwlBRl9FUlJfQkFEX05VTU1BUktTID0gMzArQUZfRVJSX0JBU0UsCS8qIGJhZCBudW1iZXIgb2YgbWFya2VycyAqLworCUFGX0VSUl9CQURfTUFSS0lEID0gMzErQUZfRVJSX0JBU0UsCS8qIGJhZCBtYXJrZXIgaWQgKi8KKwlBRl9FUlJfQkFEX01BUktQT1MgPSAzMitBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBtYXJrZXIgcG9zaXRpb24gdmFsdWUgKi8KKwlBRl9FUlJfQkFEX05VTUlOU1RTID0gMzMrQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgbnVtYmVyIG9mIGluc3RydW1lbnRzICovCisJQUZfRVJSX0JBRF9OT0FFU0RBVEEgPSAzNCtBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX01JU0NJRCA9IDM1K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfTlVNTUlTQyA9IDM2K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfTUlTQ1NJWkUgPSAzNytBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX01JU0NUWVBFID0gMzgrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9NSVNDU0VFSyA9IDM5K0FGX0VSUl9CQVNFLAorCUFGX0VSUl9CQURfU1RSTEVOID0gNDArQUZfRVJSX0JBU0UsCS8qIGludmFsaWQgc3RyaW5nIGxlbmd0aCAqLworCUFGX0VSUl9CQURfUkFURUNPTlYgPSA0NStBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX1NZTkNGSUxFID0gNDYrQUZfRVJSX0JBU0UsCisJQUZfRVJSX0JBRF9DT0RFQ19DT05GSUcgPSA0NytBRl9FUlJfQkFTRSwJLyogaW1wcm9wZXJseSBjb25maWd1cmVkIGNvZGVjICovCisJQUZfRVJSX0JBRF9DT0RFQ19UWVBFID0gNTArQUZfRVJSX0JBU0UsCS8qIHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgKi8KKwlBRl9FUlJfQkFEX0lOU1RQVFlQRSA9IDUxK0FGX0VSUl9CQVNFLAkvKiBpbnZhbGlkIGluc3RydW1lbnQgcGFyYW1ldGVyIHR5cGUgKi8KKwlBRl9FUlJfQkFEX0lOU1RQSUQgPSA1MitBRl9FUlJfQkFTRSwJLyogaW52YWxpZCBpbnN0cnVtZW50IHBhcmFtZXRlciBpZCAqLworCisJQUZfRVJSX0JBRF9CWVRFT1JERVIgPSA1MytBRl9FUlJfQkFTRSwKKwlBRl9FUlJfQkFEX0ZJTEVGTVRfUEFSQU0gPSA1NCtBRl9FUlJfQkFTRSwJLyogdW5yZWNvZ25pemVkIGZpbGUgZm9ybWF0IHBhcmFtZXRlciAqLworCUFGX0VSUl9CQURfQ09NUF9QQVJBTSA9IDU1K0FGX0VSUl9CQVNFLAkvKiB1bnJlY29nbml6ZWQgY29tcHJlc3Npb24gcGFyYW1ldGVyICovCisJQUZfRVJSX0JBRF9EQVRBT0ZGU0VUID0gNTYrQUZfRVJSX0JBU0UsCS8qIGJhZCBkYXRhIG9mZnNldCAqLworCUFGX0VSUl9CQURfRlJBTUVDTlQgPSA1NytBRl9FUlJfQkFTRSwJLyogYmFkIGZyYW1lIGNvdW50ICovCisKKwlBRl9FUlJfQkFEX1FVRVJZVFlQRSA9IDU4K0FGX0VSUl9CQVNFLAkvKiBiYWQgcXVlcnkgdHlwZSAqLworCUFGX0VSUl9CQURfUVVFUlkgPSA1OStBRl9FUlJfQkFTRSwJLyogYmFkIGFyZ3VtZW50IHRvIGFmUXVlcnkoKSAqLworCUFGX0VSUl9CQURfSEVBREVSID0gNjIrQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBoZWFkZXIgKi8KKwlBRl9FUlJfQkFEX0ZSQU1FID0gNjMrQUZfRVJSX0JBU0UsCS8qIGJhZCBmcmFtZSBudW1iZXIgKi8KKwlBRl9FUlJfQkFEX0xPT1BDT1VOVCA9IDY0K0FGX0VSUl9CQVNFLAkvKiBiYWQgbG9vcCBjb3VudCAqLworCisJLyogQUlGRi9BSUZGLUMgc3BlY2lmaWMgZXJyb3JzIHdoZW4gcGFyc2luZyBmaWxlIGhlYWRlciAqLworCisJQUZfRVJSX0JBRF9BSUZGX0hFQURFUiA9IDY2K0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgY2h1bmsgaGVhZGVyICovCisJQUZfRVJSX0JBRF9BSUZGX0ZPUk0gPSA2NytBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIEZPUk0gY2h1bmsgKi8KKwlBRl9FUlJfQkFEX0FJRkZfU1NORCA9IDY4K0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgU1NORCBjaHVuayAqLworCUFGX0VSUl9CQURfQUlGRl9DSFVOS0lEID0gNjkrQUZfRVJSX0JBU0UsCS8qIHVucmVjb2duaXplZCBBSUZGL0FJRkYtQyBjaHVuayBpZCAqLworCUFGX0VSUl9CQURfQUlGRl9DT01NID0gNzArQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBwYXJzZSBDT01NIGNodW5rICovCisJQUZfRVJSX0JBRF9BSUZGX0lOU1QgPSA3MStBRl9FUlJfQkFTRSwJLyogZmFpbGVkIHRvIHBhcnNlIElOU1QgY2h1bmsgKi8KKwlBRl9FUlJfQkFEX0FJRkZfTUFSSyA9IDcyK0FGX0VSUl9CQVNFLAkvKiBmYWlsZWQgdG8gcGFyc2UgTUFSSyBjaHVuayAqLworCUFGX0VSUl9CQURfQUlGRl9TS0lQID0gNzMrQUZfRVJSX0JBU0UsCS8qIGZhaWxlZCB0byBza2lwIHVuc3VwcG9ydGVkIGNodW5rICovCisJQUZfRVJSX0JBRF9BSUZGX0xPT1BNT0RFID0gNzQrQUZfRVJSX0JBU0UJLyogdW5yZWNvZ25pemVkIGxvb3AgbW9kZSAoZm9ydywgZXRjKSAqLworfTsKKworCisvKiBnbG9iYWwgcm91dGluZXMgKi8KK0FGZXJyZnVuYyBhZlNldEVycm9ySGFuZGxlciAoQUZlcnJmdW5jIGVmdW5jKTsKKworLyogcXVlcnkgcm91dGluZXMgKi8KK0FVcHZsaXN0IGFmUXVlcnkgKGludCBxdWVyeXR5cGUsIGludCBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMsIGludCBhcmc0KTsKK2xvbmcgYWZRdWVyeUxvbmcgKGludCBxdWVyeXR5cGUsIGludCBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMsIGludCBhcmc0KTsKK2RvdWJsZSBhZlF1ZXJ5RG91YmxlIChpbnQgcXVlcnl0eXBlLCBpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCk7Cit2b2lkICphZlF1ZXJ5UG9pbnRlciAoaW50IHF1ZXJ5dHlwZSwgaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQpOworCisvKiBiYXNpYyBvcGVyYXRpb25zIG9uIGZpbGUgaGFuZGxlcyBhbmQgZmlsZSBzZXR1cHMgKi8KK0FGZmlsZXNldHVwIGFmTmV3RmlsZVNldHVwICh2b2lkKTsKK3ZvaWQgYWZGcmVlRmlsZVNldHVwIChBRmZpbGVzZXR1cCk7CitpbnQgYWZJZGVudGlmeUZEIChpbnQpOworaW50IGFmSWRlbnRpZnlOYW1lZEZEIChpbnQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgKmltcGxlbWVudGVkKTsKKworQUZmaWxlaGFuZGxlIGFmT3BlbkZpbGUgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlLAorCUFGZmlsZXNldHVwIHNldHVwKTsKK0FGZmlsZWhhbmRsZSBhZk9wZW5WaXJ0dWFsRmlsZSAoQUZ2aXJ0dWFsZmlsZSAqdmZpbGUsIGNvbnN0IGNoYXIgKm1vZGUsCisJQUZmaWxlc2V0dXAgc2V0dXApOworQUZmaWxlaGFuZGxlIGFmT3BlbkZEIChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUsIEFGZmlsZXNldHVwIHNldHVwKTsKK0FGZmlsZWhhbmRsZSBhZk9wZW5OYW1lZEZEIChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUsIEFGZmlsZXNldHVwIHNldHVwLAorCWNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKwordm9pZCBhZlNhdmVGaWxlUG9zaXRpb24gKEFGZmlsZWhhbmRsZSBmaWxlKTsKK3ZvaWQgYWZSZXN0b3JlRmlsZVBvc2l0aW9uIChBRmZpbGVoYW5kbGUgZmlsZSk7CitpbnQgYWZTeW5jRmlsZSAoQUZmaWxlaGFuZGxlIGZpbGUpOworaW50IGFmQ2xvc2VGaWxlIChBRmZpbGVoYW5kbGUgZmlsZSk7CisKK3ZvaWQgYWZJbml0RmlsZUZvcm1hdCAoQUZmaWxlc2V0dXAsIGludCBmb3JtYXQpOworaW50IGFmR2V0RmlsZUZvcm1hdCAoQUZmaWxlaGFuZGxlLCBpbnQgKnZlcnNpb24pOworCisvKiB0cmFjayAqLwordm9pZCBhZkluaXRUcmFja0lEcyAoQUZmaWxlc2V0dXAsIGludCAqdHJhY2tpZHMsIGludCB0cmFja0NvdW50KTsKK2ludCBhZkdldFRyYWNrSURzIChBRmZpbGVoYW5kbGUsIGludCAqdHJhY2tpZHMpOworCisvKiB0cmFjayBkYXRhOiByZWFkaW5nLCB3cml0bmcsIHNlZWtpbmcsIHNpemluZyBmcmFtZXMgKi8KK2ludCBhZlJlYWRGcmFtZXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCB2b2lkICpidWZmZXIsIGludCBmcmFtZUNvdW50KTsKK2ludCBhZldyaXRlRnJhbWVzIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQgZnJhbWVDb3VudCk7CitBRmZyYW1lY291bnQgYWZTZWVrRnJhbWUgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBBRmZyYW1lY291bnQgZnJhbWVvZmZzZXQpOworQUZmcmFtZWNvdW50IGFmVGVsbEZyYW1lIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CitBRmZpbGVvZmZzZXQgYWZHZXRUcmFja0J5dGVzIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CitmbG9hdCBhZkdldEZyYW1lU2l6ZSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGludCBleHBhbmQzdG80KTsKK2Zsb2F0IGFmR2V0VmlydHVhbEZyYW1lU2l6ZSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGludCBleHBhbmQzdG80KTsKKworLyogdHJhY2sgZGF0YTogQUVTIGRhdGEgKi8KKy8qIGFmSW5pdEFFU0NoYW5uZWxEYXRhIGlzIG9ic29sZXRlIC0tIHVzZSBhZkluaXRBRVNDaGFubmVsRGF0YVRvKCkgKi8KK3ZvaWQgYWZJbml0QUVTQ2hhbm5lbERhdGEgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2spOyAvKiBvYnNvbGV0ZSAqLwordm9pZCBhZkluaXRBRVNDaGFubmVsRGF0YVRvIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBpbnQgd2lsbEJlRGF0YSk7CitpbnQgYWZHZXRBRVNDaGFubmVsRGF0YSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIHVuc2lnbmVkIGNoYXIgYnVmWzI0XSk7Cit2b2lkIGFmU2V0QUVTQ2hhbm5lbERhdGEgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCB1bnNpZ25lZCBjaGFyIGJ1ZlsyNF0pOworCisjaWYgMAorLyogdHJhY2sgc2V0dXAgZm9ybWF0IGluaXRpYWxpemVkIHZpYSBETXBhcmFtcyAqLworLyogdHJhY2sgZm9ybWF0IHJldHJpZXZlZCB2aWEgRE1wYXJhbXMgKi8KK0RNc3RhdHVzIGFmSW5pdEZvcm1hdFBhcmFtcyAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgRE1wYXJhbXMgKnBhcmFtcyk7CisvKiB2aXJ0dWFsIGZvcm1hdCBzZXQgdmlhIERNcGFyYW1zICovCitETXN0YXR1cyBhZkdldEZvcm1hdFBhcmFtcyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIERNcGFyYW1zICpwYXJhbXMpOworLyogdmlydHVhbCBmb3JtYXQgcmV0cmlldmVkIHZpYSBETXBhcmFtcyAqLworRE1zdGF0dXMgYWZTZXRWaXJ0dWFsRm9ybWF0UGFyYW1zIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgRE1wYXJhbXMgKnBhcmFtcyk7CitETXN0YXR1cyBhZkdldFZpcnR1YWxGb3JtYXRQYXJhbXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBETXBhcmFtcyAqcGFyYW1zKTsKKy8qIGNvbnZlcnNpb24vY29tcHJlc3Npb24gcGFyYW1zIHNldCB2aWEgRE1wYXJhbXMgKi8KK0RNc3RhdHVzIGFmU2V0Q29udmVyc2lvblBhcmFtcyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIERNcGFyYW1zICpwYXJhbXMpOworLyogY29udmVyc2lvbi9jb21wcmVzc2lvbiBwYXJhbXMgcmV0cmlldmVkIHZpYSBETXBhcmFtcyAqLworRE1zdGF0dXMgYWZHZXRDb252ZXJzaW9uUGFyYW1zIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgRE1wYXJhbXMgKnBhcmFtcyk7CisjZW5kaWYKKworLyogdHJhY2sgZGF0YTogYnl0ZSBvcmRlciAqLwordm9pZCBhZkluaXRCeXRlT3JkZXIgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBieXRlT3JkZXIpOworaW50IGFmR2V0Qnl0ZU9yZGVyIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CitpbnQgYWZTZXRWaXJ0dWFsQnl0ZU9yZGVyIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50IGJ5dGVPcmRlcik7CitpbnQgYWZHZXRWaXJ0dWFsQnl0ZU9yZGVyIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisKKy8qIHRyYWNrIGRhdGE6IG51bWJlciBvZiBjaGFubmVscyAqLwordm9pZCBhZkluaXRDaGFubmVscyAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IG5jaGFubmVscyk7CitpbnQgYWZHZXRDaGFubmVscyAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2spOworaW50IGFmU2V0VmlydHVhbENoYW5uZWxzIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50IGNoYW5uZWxDb3VudCk7CitpbnQgYWZHZXRWaXJ0dWFsQ2hhbm5lbHMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrKTsKK3ZvaWQgYWZTZXRDaGFubmVsTWF0cml4IChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgZG91YmxlICptYXRyaXgpOworCisvKiB0cmFjayBkYXRhOiBzYW1wbGUgZm9ybWF0IGFuZCBzYW1wbGUgd2lkdGggKi8KK3ZvaWQgYWZJbml0U2FtcGxlRm9ybWF0IChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBpbnQgc2FtcGxlRm9ybWF0LAorCWludCBzYW1wbGVXaWR0aCk7Cit2b2lkIGFmR2V0U2FtcGxlRm9ybWF0IChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNrLCBpbnQgKnNhbXBmbXQsCisJaW50ICpzYW1wd2lkdGgpOwordm9pZCBhZkdldFZpcnR1YWxTYW1wbGVGb3JtYXQgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2ssIGludCAqc2FtcGZtdCwKKwlpbnQgKnNhbXB3aWR0aCk7CitpbnQgYWZTZXRWaXJ0dWFsU2FtcGxlRm9ybWF0IChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywKKwlpbnQgc2FtcGxlRm9ybWF0LCBpbnQgc2FtcGxlV2lkdGgpOwordm9pZCBhZkdldFZpcnR1YWxTYW1wbGVGb3JtYXQgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLAorCWludCAqc2FtcGxlRm9ybWF0LCBpbnQgKnNhbXBsZVdpZHRoKTsKKworLyogdHJhY2sgZGF0YTogc2FtcGxpbmcgcmF0ZSAqLwordm9pZCBhZkluaXRSYXRlIChBRmZpbGVzZXR1cCwgaW50IHRyYWNrLCBkb3VibGUgcmF0ZSk7Citkb3VibGUgYWZHZXRSYXRlIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisKKyNpZiAwCitpbnQgYWZTZXRWaXJ0dWFsUmF0ZSAoQUZmaWxlaGFuZGxlLCBpbnQgdHJhY2ssIGRvdWJsZSByYXRlKTsKK2RvdWJsZSBhZkdldFZpcnR1YWxSYXRlIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisjZW5kaWYKKworLyogdHJhY2sgZGF0YTogY29tcHJlc3Npb24gKi8KK3ZvaWQgYWZJbml0Q29tcHJlc3Npb24gKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBjb21wcmVzc2lvbik7CisjaWYgMAordm9pZCBhZkluaXRDb21wcmVzc2lvblBhcmFtcyAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IGNvbXByZXNzaW9uCisJQVVwdmxpc3QgcGFyYW1zLCBpbnQgcGFyYW1ldGVyQ291bnQpOworI2VuZGlmCisKK2ludCBhZkdldENvbXByZXNzaW9uIChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisjaWYgMAordm9pZCBhZkdldENvbXByZXNzaW9uUGFyYW1zIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50ICpjb21wcmVzc2lvbiwKKwlBVXB2bGlzdCBwYXJhbXMsIGludCBwYXJhbWV0ZXJDb3VudCk7CisKK2ludCBhZlNldFZpcnR1YWxDb21wcmVzc2lvbiAoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgaW50IGNvbXByZXNzaW9uKTsKK3ZvaWQgYWZTZXRWaXJ0dWFsQ29tcHJlc3Npb25QYXJhbXMgKEFGZmlsZWhhbmRsZSwgaW50IHRyYWNrLCBpbnQgY29tcHJlc3Npb24sCisJQVVwdmxpc3QgcGFyYW1zLCBpbnQgcGFyYW1ldGVyQ291bnQpOworCitpbnQgYWZHZXRWaXJ0dWFsQ29tcHJlc3Npb24gKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIGludCBjb21wcmVzc2lvbik7Cit2b2lkIGFmR2V0VmlydHVhbENvbXByZXNzaW9uUGFyYW1zIChBRmZpbGVoYW5kbGUsIGludCB0cmFjaywgaW50ICpjb21wcmVzc2lvbiwKKwlBVXB2bGlzdCBwYXJhbXMsIGludCBwYXJhbWV0ZXJDb3VudCk7CisjZW5kaWYKKworLyogdHJhY2sgZGF0YTogcGNtIG1hcHBpbmcgKi8KK3ZvaWQgYWZJbml0UENNTWFwcGluZyAoQUZmaWxlc2V0dXAgZmlsZXNldHVwLCBpbnQgdHJhY2ssCisJZG91YmxlIHNsb3BlLCBkb3VibGUgaW50ZXJjZXB0LCBkb3VibGUgbWluQ2xpcCwgZG91YmxlIG1heENsaXApOwordm9pZCBhZkdldFBDTU1hcHBpbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2ssCisJZG91YmxlICpzbG9wZSwgZG91YmxlICppbnRlcmNlcHQsIGRvdWJsZSAqbWluQ2xpcCwgZG91YmxlICptYXhDbGlwKTsKKy8qIE5PVEU6IGFmU2V0VHJhY2tQQ01NYXBwaW5nKCkgaXMgc3BlY2lhbC0taXQgZG9lcyBub3Qgc2V0IHRoZSB2aXJ0dWFsICAqLworLyogZm9ybWF0OyBpdCBjaGFuZ2VzIHdoYXQgdGhlIEFGIHRoaW5rcyB0aGUgdHJhY2sgZm9ybWF0IGlzISBCZSBjYXJlZnVsLiAqLworaW50IGFmU2V0VHJhY2tQQ01NYXBwaW5nIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNrLAorCWRvdWJsZSBzbG9wZSwgZG91YmxlIGludGVyY2VwdCwgZG91YmxlIG1pbkNsaXAsIGRvdWJsZSBtYXhDbGlwKTsKKy8qIE5PVEU6IGFmU2V0VmlydHVhbFBDTU1hcHBpbmcoKSBpcyBkaWZmZXJlbnQgZnJvbSBhZlNldFRyYWNrUENNTWFwcGluZygpOiAqLworLyogc2VlIGNvbW1lbnQgZm9yIGFmU2V0VHJhY2tQQ01NYXBwaW5nKCkuICovCitpbnQgYWZTZXRWaXJ0dWFsUENNTWFwcGluZyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFjaywKKwlkb3VibGUgc2xvcGUsIGRvdWJsZSBpbnRlcmNlcHQsIGRvdWJsZSBtaW5DbGlwLCBkb3VibGUgbWF4Q2xpcCk7Cit2b2lkIGFmR2V0VmlydHVhbFBDTU1hcHBpbmcgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2ssCisJZG91YmxlICpzbG9wZSwgZG91YmxlICppbnRlcmNlcHQsIGRvdWJsZSAqbWluQ2xpcCwgZG91YmxlICptYXhDbGlwKTsKKworLyogdHJhY2sgZGF0YTogZGF0YSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlICovCisvKiBpbml0aWFsaXplIGZvciByYXcgcmVhZGluZyBvbmx5ICovCit2b2lkIGFmSW5pdERhdGFPZmZzZXQoQUZmaWxlc2V0dXAsIGludCB0cmFjaywgQUZmaWxlb2Zmc2V0IG9mZnNldCk7CitBRmZpbGVvZmZzZXQgYWZHZXREYXRhT2Zmc2V0IChBRmZpbGVoYW5kbGUsIGludCB0cmFjayk7CisKKy8qIHRyYWNrIGRhdGE6IGNvdW50IG9mIGZyYW1lcyBpbiBmaWxlICovCit2b2lkIGFmSW5pdEZyYW1lQ291bnQgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2ssIEFGZnJhbWVjb3VudCBmcmFtZUNvdW50KTsKK0FGZnJhbWVjb3VudCBhZkdldEZyYW1lQ291bnQgKEFGZmlsZWhhbmRsZSBmaWxlLCBpbnQgdHJhY2spOworCisvKiBsb29wIG9wZXJhdGlvbnMgKi8KK3ZvaWQgYWZJbml0TG9vcElEcyAoQUZmaWxlc2V0dXAsIGludCBpbnN0aWQsIGludCBpZHNbXSwgaW50IG5pZHMpOworaW50IGFmR2V0TG9vcElEcyAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkc1tdKTsKK3ZvaWQgYWZTZXRMb29wTW9kZSAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcCwgaW50IG1vZGUpOworaW50IGFmR2V0TG9vcE1vZGUgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCk7CitpbnQgYWZTZXRMb29wQ291bnQgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3AsIGludCBjb3VudCk7CitpbnQgYWZHZXRMb29wQ291bnQgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCk7Cit2b2lkIGFmU2V0TG9vcFN0YXJ0IChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQsIGludCBtYXJrZXJpZCk7CitpbnQgYWZHZXRMb29wU3RhcnQgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCk7Cit2b2lkIGFmU2V0TG9vcEVuZCAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkLCBpbnQgbWFya2VyaWQpOworaW50IGFmR2V0TG9vcEVuZCAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcGlkKTsKKworaW50IGFmU2V0TG9vcFN0YXJ0RnJhbWUgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3AsCisJQUZmcmFtZWNvdW50IHN0YXJ0RnJhbWUpOworQUZmcmFtZWNvdW50IGFmR2V0TG9vcFN0YXJ0RnJhbWUgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3ApOworaW50IGFmU2V0TG9vcEVuZEZyYW1lIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29wLAorCUFGZnJhbWVjb3VudCBzdGFydEZyYW1lKTsKK0FGZnJhbWVjb3VudCBhZkdldExvb3BFbmRGcmFtZSAoQUZmaWxlaGFuZGxlLCBpbnQgaW5zdGlkLCBpbnQgbG9vcCk7CisKK3ZvaWQgYWZTZXRMb29wVHJhY2sgKEFGZmlsZWhhbmRsZSwgaW50IGluc3RpZCwgaW50IGxvb3BpZCwgaW50IHRyYWNraWQpOworaW50IGFmR2V0TG9vcFRyYWNrIChBRmZpbGVoYW5kbGUsIGludCBpbnN0aWQsIGludCBsb29waWQpOworCisvKiBtYXJrZXIgb3BlcmF0aW9ucyAqLwordm9pZCBhZkluaXRNYXJrSURzIChBRmZpbGVzZXR1cCwgaW50IHRyYWNraWQsIGludCAqaWRzLCBpbnQgbmlkcyk7CitpbnQgYWZHZXRNYXJrSURzIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNraWQsIGludCBtYXJraWRzW10pOwordm9pZCBhZlNldE1hcmtQb3NpdGlvbiAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFja2lkLCBpbnQgbWFya2lkLAorCUFGZnJhbWVjb3VudCBtYXJrcG9zKTsKK0FGZnJhbWVjb3VudCBhZkdldE1hcmtQb3NpdGlvbiAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFja2lkLCBpbnQgbWFya2lkKTsKK3ZvaWQgYWZJbml0TWFya05hbWUgKEFGZmlsZXNldHVwLCBpbnQgdHJhY2tpZCwgaW50IG1hcmtlciwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGFmSW5pdE1hcmtDb21tZW50IChBRmZpbGVzZXR1cCwgaW50IHRyYWNraWQsIGludCBtYXJrZXIsCisJY29uc3QgY2hhciAqY29tbWVudCk7CitjaGFyICphZkdldE1hcmtOYW1lIChBRmZpbGVoYW5kbGUgZmlsZSwgaW50IHRyYWNraWQsIGludCBtYXJraWQpOworY2hhciAqYWZHZXRNYXJrQ29tbWVudCAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCB0cmFja2lkLCBpbnQgbWFya2lkKTsKKworLyogaW5zdHJ1bWVudCBvcGVyYXRpb25zICovCit2b2lkIGFmSW5pdEluc3RJRHMgKEFGZmlsZXNldHVwLCBpbnQgKmlkcywgaW50IG5pZHMpOworaW50IGFmR2V0SW5zdElEcyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCAqaW5zdGlkcyk7Cit2b2lkIGFmR2V0SW5zdFBhcmFtcyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCBpbnN0aWQsIEFVcHZsaXN0IHB2bGlzdCwKKwlpbnQgbnBhcmFtcyk7Cit2b2lkIGFmU2V0SW5zdFBhcmFtcyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCBpbnN0aWQsIEFVcHZsaXN0IHB2bGlzdCwKKwlpbnQgbnBhcmFtcyk7Citsb25nIGFmR2V0SW5zdFBhcmFtTG9uZyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCBpbnN0aWQsIGludCBwYXJhbSk7Cit2b2lkIGFmU2V0SW5zdFBhcmFtTG9uZyAoQUZmaWxlaGFuZGxlIGZpbGUsIGludCBpbnN0aWQsIGludCBwYXJhbSwgbG9uZyB2YWx1ZSk7CisKKy8qIG1pc2NlbGxhbmVvdXMgZGF0YSBvcGVyYXRpb25zICovCit2b2lkIGFmSW5pdE1pc2NJRHMgKEFGZmlsZXNldHVwLCBpbnQgKmlkcywgaW50IG5pZHMpOworaW50IGFmR2V0TWlzY0lEcyAoQUZmaWxlaGFuZGxlLCBpbnQgKmlkcyk7Cit2b2lkIGFmSW5pdE1pc2NUeXBlIChBRmZpbGVzZXR1cCwgaW50IG1pc2NlbGxhbmVvdXNpZCwgaW50IHR5cGUpOworaW50IGFmR2V0TWlzY1R5cGUgKEFGZmlsZWhhbmRsZSwgaW50IG1pc2NlbGxhbmVvdXNpZCk7Cit2b2lkIGFmSW5pdE1pc2NTaXplIChBRmZpbGVzZXR1cCwgaW50IG1pc2NlbGxhbmVvdXNpZCwgaW50IHNpemUpOworaW50IGFmR2V0TWlzY1NpemUgKEFGZmlsZWhhbmRsZSwgaW50IG1pc2NlbGxhbmVvdXNpZCk7CitpbnQgYWZXcml0ZU1pc2MgKEFGZmlsZWhhbmRsZSwgaW50IG1pc2NlbGxhbmVvdXNpZCwgdm9pZCAqYnVmLCBpbnQgYnl0ZXMpOworaW50IGFmUmVhZE1pc2MgKEFGZmlsZWhhbmRsZSwgaW50IG1pc2NlbGxhbmVvdXNpZCwgdm9pZCAqYnVmLCBpbnQgYnl0ZXMpOworaW50IGFmU2Vla01pc2MgKEFGZmlsZWhhbmRsZSwgaW50IG1pc2NlbGxhbmVvdXNpZCwgaW50IG9mZnNldCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBBVURJT0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9hdXB2bGlzdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9hdXB2bGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODZmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2F1cHZsaXN0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKwlBdWRpbyBGaWxlIExpYnJhcnkKKwlDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMCwgTWljaGFlbCBQcnVldHQgPG1pY2hhZWxANjhrLm9yZz4KKworCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKwltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorCXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKwlMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKwlCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EuCisqLworCisvKgorCWF1cHZsaXN0LmgKKworCVRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwYXJhbWV0ZXIgdmFsdWUgbGlzdCBkYXRhCisJc3RydWN0dXJlcyBhbmQgcm91dGluZXMuCisqLworCisjaWZuZGVmIEFVUFZMSVNUX0gKKyNkZWZpbmUgQVVQVkxJU1RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCitlbnVtCit7CisJQVVfUFZUWVBFX0xPTkcgPSAxLAorCUFVX1BWVFlQRV9ET1VCTEUgPSAyLAorCUFVX1BWVFlQRV9QVFIgPSAzCit9OworCit0eXBlZGVmIHN0cnVjdCBfQVVwdmxpc3QgKkFVcHZsaXN0OworCisjZGVmaW5lIEFVX05VTExfUFZMSVNUICgoc3RydWN0IF9BVXB2bGlzdCAqKSAwKQorCitBVXB2bGlzdCBBVXB2bmV3IChpbnQgbWF4SXRlbXMpOworaW50IEFVcHZnZXRtYXhpdGVtcyAoQVVwdmxpc3QpOworaW50IEFVcHZmcmVlIChBVXB2bGlzdCk7CitpbnQgQVVwdnNldHBhcmFtIChBVXB2bGlzdCwgaW50IGl0ZW0sIGludCBwYXJhbSk7CitpbnQgQVVwdnNldHZhbHR5cGUgKEFVcHZsaXN0LCBpbnQgaXRlbSwgaW50IHR5cGUpOworaW50IEFVcHZzZXR2YWwgKEFVcHZsaXN0LCBpbnQgaXRlbSwgdm9pZCAqdmFsKTsKK2ludCBBVXB2Z2V0cGFyYW0gKEFVcHZsaXN0LCBpbnQgaXRlbSwgaW50ICpwYXJhbSk7CitpbnQgQVVwdmdldHZhbHR5cGUgKEFVcHZsaXN0LCBpbnQgaXRlbSwgaW50ICp0eXBlKTsKK2ludCBBVXB2Z2V0dmFsIChBVXB2bGlzdCwgaW50IGl0ZW0sIHZvaWQgKnZhbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBBVVBWTElTVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvYS5vdXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOGE4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvYS5vdXQuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fQV9PVVRfR05VX0hfXworIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2Eub3V0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxhLm91dC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorCisvKiBTaWduYWwgdG8gdXNlcnMgb2YgdGhpcyBoZWFkZXIgdGhhdCB0aGlzIGFyY2hpdGVjdHVyZSByZWFsbHkgZG9lc24ndAorICAgc3VwcG9ydCBhLm91dCBiaW5hcnkgZm9ybWF0LiAgKi8KKyNkZWZpbmUgX19OT19BX09VVF9TVVBQT1JUIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvYnl0ZXN3YXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9ieXRlc3dhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMmIxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvYnl0ZXN3YXAuaApAQCAtMCwwICsxLDEzNiBAQAorLyogTWFjcm9zIHRvIHN3YXAgdGhlIG9yZGVyIG9mIGJ5dGVzIGluIGludGVnZXIgdmFsdWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9CWVRFU1dBUF9IICYmICFkZWZpbmVkIF9ORVRJTkVUX0lOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9ieXRlc3dhcC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19CWVRFU1dBUF9ICisjZGVmaW5lIF9CSVRTX0JZVEVTV0FQX0ggMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBTd2FwIGJ5dGVzIGluIDE2IGJpdCB2YWx1ZS4gICovCisjZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfMTYoeCkgXAorICAgICAoKCgoeCkgPj4gOCkgJiAweGZmKSB8ICgoKHgpICYgMHhmZikgPDwgOCkpCisKKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgZGVmaW5lIF9fYnN3YXBfMTYoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCBpbnQgX192LCBfX3ggPSAoeCk7CQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzE2IChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgicm9ydyAkOCwgJXcwIgkJCQkJICAgICAgXAorCQkgICAgOiAiPXIiIChfX3YpCQkJCQkgICAgICBcCisJCSAgICA6ICIwIiAoX194KQkJCQkJCSAgICAgIFwKKwkJICAgIDogImNjIik7CQkJCQkJICAgICAgXAorCSBfX3Y7IH0pKQorI2Vsc2UKKy8qIFRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gICovCisjIGRlZmluZSBfX2Jzd2FwXzE2KHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgc2hvcnQgaW50IF9feCA9ICh4KTsgX19ic3dhcF9jb25zdGFudF8xNiAoX194KTsgfSkpCisjZW5kaWYKKworCisvKiBTd2FwIGJ5dGVzIGluIDMyIGJpdCB2YWx1ZS4gICovCisjZGVmaW5lIF9fYnN3YXBfY29uc3RhbnRfMzIoeCkgXAorICAgICAoKCgoeCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKCh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSB8CQkgICAgICBcCisgICAgICAoKCh4KSAmIDB4MDAwMGZmMDApIDw8ICA4KSB8ICgoKHgpICYgMHgwMDAwMDBmZikgPDwgMjQpKQorCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjIGlmIF9fV09SRFNJWkUgPT0gNjQgfHwgKGRlZmluZWQgX19pNDg2X18gfHwgZGVmaW5lZCBfX3BlbnRpdW1fXwkgICAgICBcCisJCQkgIHx8IGRlZmluZWQgX19wZW50aXVtcHJvX18gfHwgZGVmaW5lZCBfX3BlbnRpdW00X18gICBcCisJCQkgIHx8IGRlZmluZWQgX19rOF9fIHx8IGRlZmluZWQgX19hdGhsb25fXwkgICAgICBcCisJCQkgIHx8IGRlZmluZWQgX19rNl9fIHx8IGRlZmluZWQgX19ub2NvbmFfXwkgICAgICBcCisJCQkgIHx8IGRlZmluZWQgX19jb3JlMl9fIHx8IGRlZmluZWQgX19nZW9kZV9fCSAgICAgIFwKKwkJCSAgfHwgZGVmaW5lZCBfX2FtZGZhbTEwX18pCisvKiBUbyBzd2FwIHRoZSBieXRlcyBpbiBhIHdvcmQgdGhlIGk0ODYgcHJvY2Vzc29ycyBhbmQgdXAgcHJvdmlkZSB0aGUKKyAgIGBic3dhcCcgb3Bjb2RlLiAgT24gaTM4NiB3ZSBoYXZlIHRvIHVzZSB0aHJlZSBpbnN0cnVjdGlvbnMuICAqLworIyAgZGVmaW5lIF9fYnN3YXBfMzIoeCkgXAorICAgICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX192LCBfX3ggPSAoeCk7CQkJCSAgICAgIFwKKwkgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3gpKQkJCQkgICAgICBcCisJICAgX192ID0gX19ic3dhcF9jb25zdGFudF8zMiAoX194KTsJCQkJICAgICAgXAorCSBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgX19hc21fXyAoImJzd2FwICUwIiA6ICI9ciIgKF9fdikgOiAiMCIgKF9feCkpOwkJICAgICAgXAorCSBfX3Y7IH0pKQorIyBlbHNlCisjICBkZWZpbmUgX19ic3dhcF8zMih4KQkJCQkJCQkgICAgICBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCBfX3YsIF9feCA9ICh4KTsJCQkJICAgICAgXAorCSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9feCkpCQkJCSAgICAgIFwKKwkgICBfX3YgPSBfX2Jzd2FwX2NvbnN0YW50XzMyIChfX3gpOwkJCQkgICAgICBcCisJIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICBfX2FzbV9fICgicm9ydyAkOCwgJXcwOyIJCQkJCSAgICAgIFwKKwkJICAgICJyb3JsICQxNiwgJTA7IgkJCQkJICAgICAgXAorCQkgICAgInJvcncgJDgsICV3MCIJCQkJCSAgICAgIFwKKwkJICAgIDogIj1yIiAoX192KQkJCQkJICAgICAgXAorCQkgICAgOiAiMCIgKF9feCkJCQkJCQkgICAgICBcCisJCSAgICA6ICJjYyIpOwkJCQkJCSAgICAgIFwKKwkgX192OyB9KSkKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX2Jzd2FwXzMyKHgpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICAgKHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IF9feCA9ICh4KTsgX19ic3dhcF9jb25zdGFudF8zMiAoX194KTsgfSkpCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisvKiBTd2FwIGJ5dGVzIGluIDY0IGJpdCB2YWx1ZS4gICovCisjIGRlZmluZSBfX2Jzd2FwX2NvbnN0YW50XzY0KHgpIFwKKyAgICAgKCgoKHgpICYgMHhmZjAwMDAwMDAwMDAwMDAwdWxsKSA+PiA1NikJCQkJICAgICAgXAorICAgICAgfCAoKCh4KSAmIDB4MDBmZjAwMDAwMDAwMDAwMHVsbCkgPj4gNDApCQkJCSAgICAgIFwKKyAgICAgIHwgKCgoeCkgJiAweDAwMDBmZjAwMDAwMDAwMDB1bGwpID4+IDI0KQkJCQkgICAgICBcCisgICAgICB8ICgoKHgpICYgMHgwMDAwMDBmZjAwMDAwMDAwdWxsKSA+PiA4KQkJCQkgICAgICBcCisgICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMGZmMDAwMDAwdWxsKSA8PCA4KQkJCQkgICAgICBcCisgICAgICB8ICgoKHgpICYgMHgwMDAwMDAwMDAwZmYwMDAwdWxsKSA8PCAyNCkJCQkJICAgICAgXAorICAgICAgfCAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwZmYwMHVsbCkgPDwgNDApCQkJCSAgICAgIFwKKyAgICAgIHwgKCgoeCkgJiAweDAwMDAwMDAwMDAwMDAwZmZ1bGwpIDw8IDU2KSkKKworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgX19ic3dhcF82NCh4KSBcCisgICAgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICAgICh7IHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX192LCBfX3ggPSAoeCk7CQkJCSAgICAgIFwKKwkgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3gpKQkJCQkgICAgICBcCisJICAgX192ID0gX19ic3dhcF9jb25zdGFudF82NCAoX194KTsJCQkJICAgICAgXAorCSBlbHNlCQkJCQkJCQkgICAgICBcCisJICAgX19hc21fXyAoImJzd2FwICVxMCIgOiAiPXIiIChfX3YpIDogIjAiIChfX3gpKTsJCSAgICAgIFwKKwkgX192OyB9KSkKKyMgZWxzZQorIyAgZGVmaW5lIF9fYnN3YXBfNjQoeCkgXAorICAgICAoX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHsgdW5pb24geyBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19sbDsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19sWzJdOyB9IF9fdywgX19yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wICh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBfX3IuX19sbCA9IF9fYnN3YXBfY29uc3RhbnRfNjQgKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIF9fdy5fX2xsID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIF9fci5fX2xbMF0gPSBfX2Jzd2FwXzMyIChfX3cuX19sWzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIF9fci5fX2xbMV0gPSBfX2Jzd2FwXzMyIChfX3cuX19sWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgX19yLl9fbGw7IH0pKQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfQklUU19CWVRFU1dBUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvY21hdGhjYWxscy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2NtYXRoY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdmZGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2NtYXRoY2FsbHMuaApAQCAtMCwwICsxLDE1OSBAQAorLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgY29tcGxleCBtYXRoIGZ1bmN0aW9uczsKKyAgIGhlbHBlciBmaWxlIGZvciA8Y29tcGxleC5oPi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwMSwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTk9URTogQmVjYXVzZSBvZiB0aGUgc3BlY2lhbCB3YXkgdGhpcyBmaWxlIGlzIHVzZWQgYnkgPGNvbXBsZXguaD4sIHRoaXMKKyAgIGZpbGUgbXVzdCBOT1QgYmUgcHJvdGVjdGVkIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uIGFzIGhlYWRlciBmaWxlcworICAgdXN1YWxseSBhcmUuCisKKyAgIFRoaXMgZmlsZSBwcm92aWRlcyBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbWF0aCBmdW5jdGlvbnMuCisgICBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhDQUxMIChOQU1FLCAoQVJHUy4uLikpOworCisgICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEgZnVuY3Rpb24gYE5BTUUnIHJldHVybmluZyBgZG91YmxlJyBhbmQgYSBmdW5jdGlvbgorICAgYE5BTUVmJyByZXR1cm5pbmcgYGZsb2F0Jy4gIEVhY2ggcGxhY2UgYF9NZG91YmxlXycgYXBwZWFycyBpbiB0aGUKKyAgIHByb3RvdHlwZSwgdGhhdCBpcyBhY3R1YWxseSBgZG91YmxlJyBpbiB0aGUgcHJvdG90eXBlIGZvciBgTkFNRScgYW5kCisgICBgZmxvYXQnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FZicuICBSZWVudHJhbnQgdmFyaWFudCBmdW5jdGlvbnMgYXJlCisgICBjYWxsZWQgYE5BTUVfcicgYW5kIGBOQU1FZl9yJy4KKworICAgRnVuY3Rpb25zIHJldHVybmluZyBvdGhlciB0eXBlcyBsaWtlIGBpbnQnIGFyZSBkZWNsYXJlZCB1c2luZyB0aGUgbWFjcm86CisKKyAgIF9fTUFUSERFQ0wgKFRZUEUsIE5BTUUsIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgaXMganVzdCBsaWtlIF9fTUFUSENBTEwgYnV0IGZvciBhIGZ1bmN0aW9uIHJldHVybmluZyBgVFlQRScKKyAgIGluc3RlYWQgb2YgYF9NZG91YmxlXycuICBJbiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZXJlIGlzIHN0aWxsCisgICBib3RoIGEgYE5BTUUnIGFuZCBhIGBOQU1FZicgdGhhdCB0YWtlcyBgZmxvYXQnIGFyZ3VtZW50cy4gICovCisKKyNpZm5kZWYgX0NPTVBMRVhfSAorI2Vycm9yICJOZXZlciB1c2UgPGJpdHMvY21hdGhjYWxscy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8Y29tcGxleC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjZGVmaW5lIF9NZG91YmxlX2NvbXBsZXhfIF9NZG91YmxlXyBfQ29tcGxleAorCisKKy8qIFRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zLiAgKi8KKworLyogQXJjIGNvc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhY29zLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBBcmMgc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhc2luLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNhdGFuLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIENvc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNjb3MsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIFNpbmUgb2YgWi4gICovCitfX01BVEhDQUxMIChjc2luLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBUYW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY3RhbiwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEh5cGVyYm9saWMgZnVuY3Rpb25zLiAgKi8KKworLyogSHlwZXJib2xpYyBhcmMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Fjb3NoLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIGFyYyBzaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2FzaW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFouICAqLworX19NQVRIQ0FMTCAoY2F0YW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIEh5cGVyYm9saWMgY29zaW5lIG9mIFouICAqLworX19NQVRIQ0FMTCAoY2Nvc2gsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKy8qIEh5cGVyYm9saWMgc2luZSBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNzaW5oLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWi4gICovCitfX01BVEhDQUxMIChjdGFuaCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIEV4cG9uZW50aWFsIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnMuICAqLworCisvKiBFeHBvbmVudGlhbCBmdW5jdGlvbiBvZiBaLiAgKi8KK19fTUFUSENBTEwgKGNleHAsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogTmF0dXJhbCBsb2dhcml0aG0gb2YgWi4gICovCitfX01BVEhDQUxMIChjbG9nLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBiYXNlIDEwIGxvZ2FyaXRobSBpcyBub3QgZGVmaW5lZCBieSB0aGUgc3RhbmRhcmQgYnV0IHRvIGltcGxlbWVudAorICAgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IGl0IGlzIGhhbmR5LiAgKi8KK19fTUFUSENBTEwgKGNsb2cxMCwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworI2VuZGlmCisKKy8qIFBvd2VyIGZ1bmN0aW9ucy4gICovCisKKy8qIFJldHVybiBYIHRvIHRoZSBZIHBvd2VyLiAgKi8KK19fTUFUSENBTEwgKGNwb3csIChfTWRvdWJsZV9jb21wbGV4XyBfX3gsIF9NZG91YmxlX2NvbXBsZXhfIF9feSkpOworCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFouICAqLworX19NQVRIQ0FMTCAoY3NxcnQsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworCisvKiBBYnNvbHV0ZSB2YWx1ZSwgY29uanVnYXRlcywgYW5kIHByb2plY3Rpb24uICAqLworCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBaLiAgKi8KK19fTUFUSERFQ0wgKF9NZG91YmxlXyxjYWJzLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIEFyZ3VtZW50IHZhbHVlIG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNhcmcsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogQ29tcGxleCBjb25qdWdhdGUgb2YgWi4gICovCitfX01BVEhDQUxMIChjb25qLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKy8qIFByb2plY3Rpb24gb2YgWiBvbnRvIHRoZSBSaWVtYW5uIHNwaGVyZS4gICovCitfX01BVEhDQUxMIChjcHJvaiwgKF9NZG91YmxlX2NvbXBsZXhfIF9feikpOworCisKKy8qIERlY29tcG9zaW5nIGNvbXBsZXggdmFsdWVzLiAgKi8KKworLyogSW1hZ2luYXJ5IHBhcnQgb2YgWi4gICovCitfX01BVEhERUNMIChfTWRvdWJsZV8sY2ltYWcsIChfTWRvdWJsZV9jb21wbGV4XyBfX3opKTsKKworLyogUmVhbCBwYXJ0IG9mIFouICAqLworX19NQVRIREVDTCAoX01kb3VibGVfLGNyZWFsLCAoX01kb3VibGVfY29tcGxleF8gX196KSk7CisKKworLyogTm93IHNvbWUgb3B0aW1pemVkIHZlcnNpb25zLiAgR0NDIGhhcyBoYW5keSBub3RhdGlvbnMgZm9yIHRoZXNlCisgICBmdW5jdGlvbnMuICBSZWNlbnQgR0NDIGhhbmRsZXMgdGhlc2UgYXMgYnVpbHRpbiBmdW5jdGlvbnMgc28gZG9lcworICAgbm90IG5lZWQgaW5saW5lcy4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhX19HTlVDX1BSRVJFUSAoMiwgOTcpICYmIGRlZmluZWQgX19PUFRJTUlaRV9fIFwKKyAgICAmJiBkZWZpbmVkIF9fZXh0ZXJuX2lubGluZQorCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KK19fZXh0ZXJuX2lubGluZSBfTWRvdWJsZV8KK19fTUFUSF9QUkVDTkFNRShjaW1hZykgKF9NZG91YmxlX2NvbXBsZXhfIF9feikgX19USFJPVworeworICByZXR1cm4gX19pbWFnX18gX196OworfQorCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCitfX2V4dGVybl9pbmxpbmUgX01kb3VibGVfCitfX01BVEhfUFJFQ05BTUUoY3JlYWwpIChfTWRvdWJsZV9jb21wbGV4XyBfX3opIF9fVEhST1cKK3sKKyAgcmV0dXJuIF9fcmVhbF9fIF9fejsKK30KKworLyogQ29tcGxleCBjb25qdWdhdGUgb2YgWi4gICovCitfX2V4dGVybl9pbmxpbmUgX01kb3VibGVfY29tcGxleF8KK19fTUFUSF9QUkVDTkFNRShjb25qKSAoX01kb3VibGVfY29tcGxleF8gX196KSBfX1RIUk9XCit7CisgIHJldHVybiBfX2V4dGVuc2lvbl9fIH5fX3o7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2NvbmZuYW1lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvY29uZm5hbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI1MWFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2NvbmZuYW1lLmgKQEAgLTAsMCArMSw2MDIgQEAKKy8qIGBzeXNjb25mJywgYHBhdGhjb25mJywgYW5kIGBjb25mc3RyJyBOQU1FIHZhbHVlcy4gIEdlbmVyaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk1LTE5OTgsMjAwMCwyMDAxLDIwMDMsMjAwNCwyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9jb25mbmFtZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8dW5pc3RkLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIE5BTUUgYXJndW1lbnQgdG8gYHBhdGhjb25mJyBhbmQgYGZwYXRoY29uZicuICAqLworZW51bQorICB7CisgICAgX1BDX0xJTktfTUFYLAorI2RlZmluZQlfUENfTElOS19NQVgJCQlfUENfTElOS19NQVgKKyAgICBfUENfTUFYX0NBTk9OLAorI2RlZmluZQlfUENfTUFYX0NBTk9OCQkJX1BDX01BWF9DQU5PTgorICAgIF9QQ19NQVhfSU5QVVQsCisjZGVmaW5lCV9QQ19NQVhfSU5QVVQJCQlfUENfTUFYX0lOUFVUCisgICAgX1BDX05BTUVfTUFYLAorI2RlZmluZQlfUENfTkFNRV9NQVgJCQlfUENfTkFNRV9NQVgKKyAgICBfUENfUEFUSF9NQVgsCisjZGVmaW5lCV9QQ19QQVRIX01BWAkJCV9QQ19QQVRIX01BWAorICAgIF9QQ19QSVBFX0JVRiwKKyNkZWZpbmUJX1BDX1BJUEVfQlVGCQkJX1BDX1BJUEVfQlVGCisgICAgX1BDX0NIT1dOX1JFU1RSSUNURUQsCisjZGVmaW5lCV9QQ19DSE9XTl9SRVNUUklDVEVECQlfUENfQ0hPV05fUkVTVFJJQ1RFRAorICAgIF9QQ19OT19UUlVOQywKKyNkZWZpbmUJX1BDX05PX1RSVU5DCQkJX1BDX05PX1RSVU5DCisgICAgX1BDX1ZESVNBQkxFLAorI2RlZmluZSBfUENfVkRJU0FCTEUJCQlfUENfVkRJU0FCTEUKKyAgICBfUENfU1lOQ19JTywKKyNkZWZpbmUJX1BDX1NZTkNfSU8JCQlfUENfU1lOQ19JTworICAgIF9QQ19BU1lOQ19JTywKKyNkZWZpbmUJX1BDX0FTWU5DX0lPCQkJX1BDX0FTWU5DX0lPCisgICAgX1BDX1BSSU9fSU8sCisjZGVmaW5lCV9QQ19QUklPX0lPCQkJX1BDX1BSSU9fSU8KKyAgICBfUENfU09DS19NQVhCVUYsCisjZGVmaW5lCV9QQ19TT0NLX01BWEJVRgkJCV9QQ19TT0NLX01BWEJVRgorICAgIF9QQ19GSUxFU0laRUJJVFMsCisjZGVmaW5lIF9QQ19GSUxFU0laRUJJVFMJCV9QQ19GSUxFU0laRUJJVFMKKyAgICBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFLAorI2RlZmluZSBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFCQlfUENfUkVDX0lOQ1JfWEZFUl9TSVpFCisgICAgX1BDX1JFQ19NQVhfWEZFUl9TSVpFLAorI2RlZmluZSBfUENfUkVDX01BWF9YRkVSX1NJWkUJCV9QQ19SRUNfTUFYX1hGRVJfU0laRQorICAgIF9QQ19SRUNfTUlOX1hGRVJfU0laRSwKKyNkZWZpbmUgX1BDX1JFQ19NSU5fWEZFUl9TSVpFCQlfUENfUkVDX01JTl9YRkVSX1NJWkUKKyAgICBfUENfUkVDX1hGRVJfQUxJR04sCisjZGVmaW5lIF9QQ19SRUNfWEZFUl9BTElHTgkJX1BDX1JFQ19YRkVSX0FMSUdOCisgICAgX1BDX0FMTE9DX1NJWkVfTUlOLAorI2RlZmluZSBfUENfQUxMT0NfU0laRV9NSU4JCV9QQ19BTExPQ19TSVpFX01JTgorICAgIF9QQ19TWU1MSU5LX01BWCwKKyNkZWZpbmUgX1BDX1NZTUxJTktfTUFYCQkJX1BDX1NZTUxJTktfTUFYCisgICAgX1BDXzJfU1lNTElOS1MKKyNkZWZpbmUgX1BDXzJfU1lNTElOS1MJCQlfUENfMl9TWU1MSU5LUworICB9OworCisvKiBWYWx1ZXMgZm9yIHRoZSBhcmd1bWVudCB0byBgc3lzY29uZicuICAqLworZW51bQorICB7CisgICAgX1NDX0FSR19NQVgsCisjZGVmaW5lCV9TQ19BUkdfTUFYCQkJX1NDX0FSR19NQVgKKyAgICBfU0NfQ0hJTERfTUFYLAorI2RlZmluZQlfU0NfQ0hJTERfTUFYCQkJX1NDX0NISUxEX01BWAorICAgIF9TQ19DTEtfVENLLAorI2RlZmluZQlfU0NfQ0xLX1RDSwkJCV9TQ19DTEtfVENLCisgICAgX1NDX05HUk9VUFNfTUFYLAorI2RlZmluZQlfU0NfTkdST1VQU19NQVgJCQlfU0NfTkdST1VQU19NQVgKKyAgICBfU0NfT1BFTl9NQVgsCisjZGVmaW5lCV9TQ19PUEVOX01BWAkJCV9TQ19PUEVOX01BWAorICAgIF9TQ19TVFJFQU1fTUFYLAorI2RlZmluZQlfU0NfU1RSRUFNX01BWAkJCV9TQ19TVFJFQU1fTUFYCisgICAgX1NDX1RaTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19UWk5BTUVfTUFYCQkJX1NDX1RaTkFNRV9NQVgKKyAgICBfU0NfSk9CX0NPTlRST0wsCisjZGVmaW5lCV9TQ19KT0JfQ09OVFJPTAkJCV9TQ19KT0JfQ09OVFJPTAorICAgIF9TQ19TQVZFRF9JRFMsCisjZGVmaW5lCV9TQ19TQVZFRF9JRFMJCQlfU0NfU0FWRURfSURTCisgICAgX1NDX1JFQUxUSU1FX1NJR05BTFMsCisjZGVmaW5lCV9TQ19SRUFMVElNRV9TSUdOQUxTCQlfU0NfUkVBTFRJTUVfU0lHTkFMUworICAgIF9TQ19QUklPUklUWV9TQ0hFRFVMSU5HLAorI2RlZmluZQlfU0NfUFJJT1JJVFlfU0NIRURVTElORwkJX1NDX1BSSU9SSVRZX1NDSEVEVUxJTkcKKyAgICBfU0NfVElNRVJTLAorI2RlZmluZQlfU0NfVElNRVJTCQkJX1NDX1RJTUVSUworICAgIF9TQ19BU1lOQ0hST05PVVNfSU8sCisjZGVmaW5lCV9TQ19BU1lOQ0hST05PVVNfSU8JCV9TQ19BU1lOQ0hST05PVVNfSU8KKyAgICBfU0NfUFJJT1JJVElaRURfSU8sCisjZGVmaW5lCV9TQ19QUklPUklUSVpFRF9JTwkJX1NDX1BSSU9SSVRJWkVEX0lPCisgICAgX1NDX1NZTkNIUk9OSVpFRF9JTywKKyNkZWZpbmUJX1NDX1NZTkNIUk9OSVpFRF9JTwkJX1NDX1NZTkNIUk9OSVpFRF9JTworICAgIF9TQ19GU1lOQywKKyNkZWZpbmUJX1NDX0ZTWU5DCQkJX1NDX0ZTWU5DCisgICAgX1NDX01BUFBFRF9GSUxFUywKKyNkZWZpbmUJX1NDX01BUFBFRF9GSUxFUwkJX1NDX01BUFBFRF9GSUxFUworICAgIF9TQ19NRU1MT0NLLAorI2RlZmluZQlfU0NfTUVNTE9DSwkJCV9TQ19NRU1MT0NLCisgICAgX1NDX01FTUxPQ0tfUkFOR0UsCisjZGVmaW5lCV9TQ19NRU1MT0NLX1JBTkdFCQlfU0NfTUVNTE9DS19SQU5HRQorICAgIF9TQ19NRU1PUllfUFJPVEVDVElPTiwKKyNkZWZpbmUJX1NDX01FTU9SWV9QUk9URUNUSU9OCQlfU0NfTUVNT1JZX1BST1RFQ1RJT04KKyAgICBfU0NfTUVTU0FHRV9QQVNTSU5HLAorI2RlZmluZQlfU0NfTUVTU0FHRV9QQVNTSU5HCQlfU0NfTUVTU0FHRV9QQVNTSU5HCisgICAgX1NDX1NFTUFQSE9SRVMsCisjZGVmaW5lCV9TQ19TRU1BUEhPUkVTCQkJX1NDX1NFTUFQSE9SRVMKKyAgICBfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTLAorI2RlZmluZQlfU0NfU0hBUkVEX01FTU9SWV9PQkpFQ1RTCV9TQ19TSEFSRURfTUVNT1JZX09CSkVDVFMKKyAgICBfU0NfQUlPX0xJU1RJT19NQVgsCisjZGVmaW5lCV9TQ19BSU9fTElTVElPX01BWAkJX1NDX0FJT19MSVNUSU9fTUFYCisgICAgX1NDX0FJT19NQVgsCisjZGVmaW5lCV9TQ19BSU9fTUFYCQkJX1NDX0FJT19NQVgKKyAgICBfU0NfQUlPX1BSSU9fREVMVEFfTUFYLAorI2RlZmluZQlfU0NfQUlPX1BSSU9fREVMVEFfTUFYCQlfU0NfQUlPX1BSSU9fREVMVEFfTUFYCisgICAgX1NDX0RFTEFZVElNRVJfTUFYLAorI2RlZmluZQlfU0NfREVMQVlUSU1FUl9NQVgJCV9TQ19ERUxBWVRJTUVSX01BWAorICAgIF9TQ19NUV9PUEVOX01BWCwKKyNkZWZpbmUJX1NDX01RX09QRU5fTUFYCQkJX1NDX01RX09QRU5fTUFYCisgICAgX1NDX01RX1BSSU9fTUFYLAorI2RlZmluZQlfU0NfTVFfUFJJT19NQVgJCQlfU0NfTVFfUFJJT19NQVgKKyAgICBfU0NfVkVSU0lPTiwKKyNkZWZpbmUJX1NDX1ZFUlNJT04JCQlfU0NfVkVSU0lPTgorICAgIF9TQ19QQUdFU0laRSwKKyNkZWZpbmUJX1NDX1BBR0VTSVpFCQkJX1NDX1BBR0VTSVpFCisjZGVmaW5lCV9TQ19QQUdFX1NJWkUJCQlfU0NfUEFHRVNJWkUKKyAgICBfU0NfUlRTSUdfTUFYLAorI2RlZmluZQlfU0NfUlRTSUdfTUFYCQkJX1NDX1JUU0lHX01BWAorICAgIF9TQ19TRU1fTlNFTVNfTUFYLAorI2RlZmluZQlfU0NfU0VNX05TRU1TX01BWAkJX1NDX1NFTV9OU0VNU19NQVgKKyAgICBfU0NfU0VNX1ZBTFVFX01BWCwKKyNkZWZpbmUJX1NDX1NFTV9WQUxVRV9NQVgJCV9TQ19TRU1fVkFMVUVfTUFYCisgICAgX1NDX1NJR1FVRVVFX01BWCwKKyNkZWZpbmUJX1NDX1NJR1FVRVVFX01BWAkJX1NDX1NJR1FVRVVFX01BWAorICAgIF9TQ19USU1FUl9NQVgsCisjZGVmaW5lCV9TQ19USU1FUl9NQVgJCQlfU0NfVElNRVJfTUFYCisKKyAgICAvKiBWYWx1ZXMgZm9yIHRoZSBhcmd1bWVudCB0byBgc3lzY29uZicKKyAgICAgICBjb3JyZXNwb25kaW5nIHRvIF9QT1NJWDJfKiBzeW1ib2xzLiAgKi8KKyAgICBfU0NfQkNfQkFTRV9NQVgsCisjZGVmaW5lCV9TQ19CQ19CQVNFX01BWAkJCV9TQ19CQ19CQVNFX01BWAorICAgIF9TQ19CQ19ESU1fTUFYLAorI2RlZmluZQlfU0NfQkNfRElNX01BWAkJCV9TQ19CQ19ESU1fTUFYCisgICAgX1NDX0JDX1NDQUxFX01BWCwKKyNkZWZpbmUJX1NDX0JDX1NDQUxFX01BWAkJX1NDX0JDX1NDQUxFX01BWAorICAgIF9TQ19CQ19TVFJJTkdfTUFYLAorI2RlZmluZQlfU0NfQkNfU1RSSU5HX01BWAkJX1NDX0JDX1NUUklOR19NQVgKKyAgICBfU0NfQ09MTF9XRUlHSFRTX01BWCwKKyNkZWZpbmUJX1NDX0NPTExfV0VJR0hUU19NQVgJCV9TQ19DT0xMX1dFSUdIVFNfTUFYCisgICAgX1NDX0VRVUlWX0NMQVNTX01BWCwKKyNkZWZpbmUJX1NDX0VRVUlWX0NMQVNTX01BWAkJX1NDX0VRVUlWX0NMQVNTX01BWAorICAgIF9TQ19FWFBSX05FU1RfTUFYLAorI2RlZmluZQlfU0NfRVhQUl9ORVNUX01BWAkJX1NDX0VYUFJfTkVTVF9NQVgKKyAgICBfU0NfTElORV9NQVgsCisjZGVmaW5lCV9TQ19MSU5FX01BWAkJCV9TQ19MSU5FX01BWAorICAgIF9TQ19SRV9EVVBfTUFYLAorI2RlZmluZQlfU0NfUkVfRFVQX01BWAkJCV9TQ19SRV9EVVBfTUFYCisgICAgX1NDX0NIQVJDTEFTU19OQU1FX01BWCwKKyNkZWZpbmUJX1NDX0NIQVJDTEFTU19OQU1FX01BWAkJX1NDX0NIQVJDTEFTU19OQU1FX01BWAorCisgICAgX1NDXzJfVkVSU0lPTiwKKyNkZWZpbmUJX1NDXzJfVkVSU0lPTgkJCV9TQ18yX1ZFUlNJT04KKyAgICBfU0NfMl9DX0JJTkQsCisjZGVmaW5lCV9TQ18yX0NfQklORAkJCV9TQ18yX0NfQklORAorICAgIF9TQ18yX0NfREVWLAorI2RlZmluZQlfU0NfMl9DX0RFVgkJCV9TQ18yX0NfREVWCisgICAgX1NDXzJfRk9SVF9ERVYsCisjZGVmaW5lCV9TQ18yX0ZPUlRfREVWCQkJX1NDXzJfRk9SVF9ERVYKKyAgICBfU0NfMl9GT1JUX1JVTiwKKyNkZWZpbmUJX1NDXzJfRk9SVF9SVU4JCQlfU0NfMl9GT1JUX1JVTgorICAgIF9TQ18yX1NXX0RFViwKKyNkZWZpbmUJX1NDXzJfU1dfREVWCQkJX1NDXzJfU1dfREVWCisgICAgX1NDXzJfTE9DQUxFREVGLAorI2RlZmluZQlfU0NfMl9MT0NBTEVERUYJCQlfU0NfMl9MT0NBTEVERUYKKworICAgIF9TQ19QSUksCisjZGVmaW5lCV9TQ19QSUkJCQkJX1NDX1BJSQorICAgIF9TQ19QSUlfWFRJLAorI2RlZmluZQlfU0NfUElJX1hUSQkJCV9TQ19QSUlfWFRJCisgICAgX1NDX1BJSV9TT0NLRVQsCisjZGVmaW5lCV9TQ19QSUlfU09DS0VUCQkJX1NDX1BJSV9TT0NLRVQKKyAgICBfU0NfUElJX0lOVEVSTkVULAorI2RlZmluZQlfU0NfUElJX0lOVEVSTkVUCQlfU0NfUElJX0lOVEVSTkVUCisgICAgX1NDX1BJSV9PU0ksCisjZGVmaW5lCV9TQ19QSUlfT1NJCQkJX1NDX1BJSV9PU0kKKyAgICBfU0NfUE9MTCwKKyNkZWZpbmUJX1NDX1BPTEwJCQlfU0NfUE9MTAorICAgIF9TQ19TRUxFQ1QsCisjZGVmaW5lCV9TQ19TRUxFQ1QJCQlfU0NfU0VMRUNUCisgICAgX1NDX1VJT19NQVhJT1YsCisjZGVmaW5lCV9TQ19VSU9fTUFYSU9WCQkJX1NDX1VJT19NQVhJT1YKKyAgICBfU0NfSU9WX01BWCA9IF9TQ19VSU9fTUFYSU9WLAorI2RlZmluZSBfU0NfSU9WX01BWAkJCV9TQ19JT1ZfTUFYCisgICAgX1NDX1BJSV9JTlRFUk5FVF9TVFJFQU0sCisjZGVmaW5lCV9TQ19QSUlfSU5URVJORVRfU1RSRUFNCQlfU0NfUElJX0lOVEVSTkVUX1NUUkVBTQorICAgIF9TQ19QSUlfSU5URVJORVRfREdSQU0sCisjZGVmaW5lCV9TQ19QSUlfSU5URVJORVRfREdSQU0JCV9TQ19QSUlfSU5URVJORVRfREdSQU0KKyAgICBfU0NfUElJX09TSV9DT1RTLAorI2RlZmluZQlfU0NfUElJX09TSV9DT1RTCQlfU0NfUElJX09TSV9DT1RTCisgICAgX1NDX1BJSV9PU0lfQ0xUUywKKyNkZWZpbmUJX1NDX1BJSV9PU0lfQ0xUUwkJX1NDX1BJSV9PU0lfQ0xUUworICAgIF9TQ19QSUlfT1NJX00sCisjZGVmaW5lCV9TQ19QSUlfT1NJX00JCQlfU0NfUElJX09TSV9NCisgICAgX1NDX1RfSU9WX01BWCwKKyNkZWZpbmUJX1NDX1RfSU9WX01BWAkJCV9TQ19UX0lPVl9NQVgKKworICAgIC8qIFZhbHVlcyBhY2NvcmRpbmcgdG8gUE9TSVggMTAwMy4xYyAoUE9TSVggdGhyZWFkcykuICAqLworICAgIF9TQ19USFJFQURTLAorI2RlZmluZQlfU0NfVEhSRUFEUwkJCV9TQ19USFJFQURTCisgICAgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUywKKyNkZWZpbmUgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwlfU0NfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCisgICAgX1NDX0dFVEdSX1JfU0laRV9NQVgsCisjZGVmaW5lCV9TQ19HRVRHUl9SX1NJWkVfTUFYCQlfU0NfR0VUR1JfUl9TSVpFX01BWAorICAgIF9TQ19HRVRQV19SX1NJWkVfTUFYLAorI2RlZmluZQlfU0NfR0VUUFdfUl9TSVpFX01BWAkJX1NDX0dFVFBXX1JfU0laRV9NQVgKKyAgICBfU0NfTE9HSU5fTkFNRV9NQVgsCisjZGVmaW5lCV9TQ19MT0dJTl9OQU1FX01BWAkJX1NDX0xPR0lOX05BTUVfTUFYCisgICAgX1NDX1RUWV9OQU1FX01BWCwKKyNkZWZpbmUJX1NDX1RUWV9OQU1FX01BWAkJX1NDX1RUWV9OQU1FX01BWAorICAgIF9TQ19USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TLAorI2RlZmluZQlfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUyBfU0NfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUworICAgIF9TQ19USFJFQURfS0VZU19NQVgsCisjZGVmaW5lCV9TQ19USFJFQURfS0VZU19NQVgJCV9TQ19USFJFQURfS0VZU19NQVgKKyAgICBfU0NfVEhSRUFEX1NUQUNLX01JTiwKKyNkZWZpbmUJX1NDX1RIUkVBRF9TVEFDS19NSU4JCV9TQ19USFJFQURfU1RBQ0tfTUlOCisgICAgX1NDX1RIUkVBRF9USFJFQURTX01BWCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9USFJFQURTX01BWAkJX1NDX1RIUkVBRF9USFJFQURTX01BWAorICAgIF9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIsCisjZGVmaW5lCV9TQ19USFJFQURfQVRUUl9TVEFDS0FERFIJX1NDX1RIUkVBRF9BVFRSX1NUQUNLQUREUgorICAgIF9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUsCisjZGVmaW5lCV9TQ19USFJFQURfQVRUUl9TVEFDS1NJWkUJX1NDX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgIF9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORywKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCV9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgIF9TQ19USFJFQURfUFJJT19JTkhFUklULAorI2RlZmluZQlfU0NfVEhSRUFEX1BSSU9fSU5IRVJJVAkJX1NDX1RIUkVBRF9QUklPX0lOSEVSSVQKKyAgICBfU0NfVEhSRUFEX1BSSU9fUFJPVEVDVCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUklPX1BST1RFQ1QJCV9TQ19USFJFQURfUFJJT19QUk9URUNUCisgICAgX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRCwKKyNkZWZpbmUJX1NDX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAlfU0NfVEhSRUFEX1BST0NFU1NfU0hBUkVECisKKyAgICBfU0NfTlBST0NFU1NPUlNfQ09ORiwKKyNkZWZpbmUgX1NDX05QUk9DRVNTT1JTX0NPTkYJCV9TQ19OUFJPQ0VTU09SU19DT05GCisgICAgX1NDX05QUk9DRVNTT1JTX09OTE4sCisjZGVmaW5lIF9TQ19OUFJPQ0VTU09SU19PTkxOCQlfU0NfTlBST0NFU1NPUlNfT05MTgorICAgIF9TQ19QSFlTX1BBR0VTLAorI2RlZmluZSBfU0NfUEhZU19QQUdFUwkJCV9TQ19QSFlTX1BBR0VTCisgICAgX1NDX0FWUEhZU19QQUdFUywKKyNkZWZpbmUgX1NDX0FWUEhZU19QQUdFUwkJX1NDX0FWUEhZU19QQUdFUworICAgIF9TQ19BVEVYSVRfTUFYLAorI2RlZmluZSBfU0NfQVRFWElUX01BWAkJCV9TQ19BVEVYSVRfTUFYCisgICAgX1NDX1BBU1NfTUFYLAorI2RlZmluZSBfU0NfUEFTU19NQVgJCQlfU0NfUEFTU19NQVgKKworICAgIF9TQ19YT1BFTl9WRVJTSU9OLAorI2RlZmluZSBfU0NfWE9QRU5fVkVSU0lPTgkJX1NDX1hPUEVOX1ZFUlNJT04KKyAgICBfU0NfWE9QRU5fWENVX1ZFUlNJT04sCisjZGVmaW5lIF9TQ19YT1BFTl9YQ1VfVkVSU0lPTgkJX1NDX1hPUEVOX1hDVV9WRVJTSU9OCisgICAgX1NDX1hPUEVOX1VOSVgsCisjZGVmaW5lIF9TQ19YT1BFTl9VTklYCQkJX1NDX1hPUEVOX1VOSVgKKyAgICBfU0NfWE9QRU5fQ1JZUFQsCisjZGVmaW5lIF9TQ19YT1BFTl9DUllQVAkJCV9TQ19YT1BFTl9DUllQVAorICAgIF9TQ19YT1BFTl9FTkhfSTE4TiwKKyNkZWZpbmUgX1NDX1hPUEVOX0VOSF9JMThOCQlfU0NfWE9QRU5fRU5IX0kxOE4KKyAgICBfU0NfWE9QRU5fU0hNLAorI2RlZmluZSBfU0NfWE9QRU5fU0hNCQkJX1NDX1hPUEVOX1NITQorCisgICAgX1NDXzJfQ0hBUl9URVJNLAorI2RlZmluZSBfU0NfMl9DSEFSX1RFUk0JCQlfU0NfMl9DSEFSX1RFUk0KKyAgICBfU0NfMl9DX1ZFUlNJT04sCisjZGVmaW5lIF9TQ18yX0NfVkVSU0lPTgkJCV9TQ18yX0NfVkVSU0lPTgorICAgIF9TQ18yX1VQRSwKKyNkZWZpbmUgX1NDXzJfVVBFCQkJX1NDXzJfVVBFCisKKyAgICBfU0NfWE9QRU5fWFBHMiwKKyNkZWZpbmUgX1NDX1hPUEVOX1hQRzIJCQlfU0NfWE9QRU5fWFBHMgorICAgIF9TQ19YT1BFTl9YUEczLAorI2RlZmluZSBfU0NfWE9QRU5fWFBHMwkJCV9TQ19YT1BFTl9YUEczCisgICAgX1NDX1hPUEVOX1hQRzQsCisjZGVmaW5lIF9TQ19YT1BFTl9YUEc0CQkJX1NDX1hPUEVOX1hQRzQKKworICAgIF9TQ19DSEFSX0JJVCwKKyNkZWZpbmUJX1NDX0NIQVJfQklUCQkJX1NDX0NIQVJfQklUCisgICAgX1NDX0NIQVJfTUFYLAorI2RlZmluZQlfU0NfQ0hBUl9NQVgJCQlfU0NfQ0hBUl9NQVgKKyAgICBfU0NfQ0hBUl9NSU4sCisjZGVmaW5lCV9TQ19DSEFSX01JTgkJCV9TQ19DSEFSX01JTgorICAgIF9TQ19JTlRfTUFYLAorI2RlZmluZQlfU0NfSU5UX01BWAkJCV9TQ19JTlRfTUFYCisgICAgX1NDX0lOVF9NSU4sCisjZGVmaW5lCV9TQ19JTlRfTUlOCQkJX1NDX0lOVF9NSU4KKyAgICBfU0NfTE9OR19CSVQsCisjZGVmaW5lCV9TQ19MT05HX0JJVAkJCV9TQ19MT05HX0JJVAorICAgIF9TQ19XT1JEX0JJVCwKKyNkZWZpbmUJX1NDX1dPUkRfQklUCQkJX1NDX1dPUkRfQklUCisgICAgX1NDX01CX0xFTl9NQVgsCisjZGVmaW5lCV9TQ19NQl9MRU5fTUFYCQkJX1NDX01CX0xFTl9NQVgKKyAgICBfU0NfTlpFUk8sCisjZGVmaW5lCV9TQ19OWkVSTwkJCV9TQ19OWkVSTworICAgIF9TQ19TU0laRV9NQVgsCisjZGVmaW5lCV9TQ19TU0laRV9NQVgJCQlfU0NfU1NJWkVfTUFYCisgICAgX1NDX1NDSEFSX01BWCwKKyNkZWZpbmUJX1NDX1NDSEFSX01BWAkJCV9TQ19TQ0hBUl9NQVgKKyAgICBfU0NfU0NIQVJfTUlOLAorI2RlZmluZQlfU0NfU0NIQVJfTUlOCQkJX1NDX1NDSEFSX01JTgorICAgIF9TQ19TSFJUX01BWCwKKyNkZWZpbmUJX1NDX1NIUlRfTUFYCQkJX1NDX1NIUlRfTUFYCisgICAgX1NDX1NIUlRfTUlOLAorI2RlZmluZQlfU0NfU0hSVF9NSU4JCQlfU0NfU0hSVF9NSU4KKyAgICBfU0NfVUNIQVJfTUFYLAorI2RlZmluZQlfU0NfVUNIQVJfTUFYCQkJX1NDX1VDSEFSX01BWAorICAgIF9TQ19VSU5UX01BWCwKKyNkZWZpbmUJX1NDX1VJTlRfTUFYCQkJX1NDX1VJTlRfTUFYCisgICAgX1NDX1VMT05HX01BWCwKKyNkZWZpbmUJX1NDX1VMT05HX01BWAkJCV9TQ19VTE9OR19NQVgKKyAgICBfU0NfVVNIUlRfTUFYLAorI2RlZmluZQlfU0NfVVNIUlRfTUFYCQkJX1NDX1VTSFJUX01BWAorCisgICAgX1NDX05MX0FSR01BWCwKKyNkZWZpbmUJX1NDX05MX0FSR01BWAkJCV9TQ19OTF9BUkdNQVgKKyAgICBfU0NfTkxfTEFOR01BWCwKKyNkZWZpbmUJX1NDX05MX0xBTkdNQVgJCQlfU0NfTkxfTEFOR01BWAorICAgIF9TQ19OTF9NU0dNQVgsCisjZGVmaW5lCV9TQ19OTF9NU0dNQVgJCQlfU0NfTkxfTVNHTUFYCisgICAgX1NDX05MX05NQVgsCisjZGVmaW5lCV9TQ19OTF9OTUFYCQkJX1NDX05MX05NQVgKKyAgICBfU0NfTkxfU0VUTUFYLAorI2RlZmluZQlfU0NfTkxfU0VUTUFYCQkJX1NDX05MX1NFVE1BWAorICAgIF9TQ19OTF9URVhUTUFYLAorI2RlZmluZQlfU0NfTkxfVEVYVE1BWAkJCV9TQ19OTF9URVhUTUFYCisKKyAgICBfU0NfWEJTNV9JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1hCUzVfSUxQMzJfT0ZGMzIJCV9TQ19YQlM1X0lMUDMyX09GRjMyCisgICAgX1NDX1hCUzVfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfWEJTNV9JTFAzMl9PRkZCSUcJCV9TQ19YQlM1X0lMUDMyX09GRkJJRworICAgIF9TQ19YQlM1X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19YQlM1X0xQNjRfT0ZGNjQJCV9TQ19YQlM1X0xQNjRfT0ZGNjQKKyAgICBfU0NfWEJTNV9MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19YQlM1X0xQQklHX09GRkJJRwkJX1NDX1hCUzVfTFBCSUdfT0ZGQklHCisKKyAgICBfU0NfWE9QRU5fTEVHQUNZLAorI2RlZmluZSBfU0NfWE9QRU5fTEVHQUNZCQlfU0NfWE9QRU5fTEVHQUNZCisgICAgX1NDX1hPUEVOX1JFQUxUSU1FLAorI2RlZmluZSBfU0NfWE9QRU5fUkVBTFRJTUUJCV9TQ19YT1BFTl9SRUFMVElNRQorICAgIF9TQ19YT1BFTl9SRUFMVElNRV9USFJFQURTLAorI2RlZmluZSBfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUwlfU0NfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUworCisgICAgX1NDX0FEVklTT1JZX0lORk8sCisjZGVmaW5lIF9TQ19BRFZJU09SWV9JTkZPCQlfU0NfQURWSVNPUllfSU5GTworICAgIF9TQ19CQVJSSUVSUywKKyNkZWZpbmUgX1NDX0JBUlJJRVJTCQkJX1NDX0JBUlJJRVJTCisgICAgX1NDX0JBU0UsCisjZGVmaW5lIF9TQ19CQVNFCQkJX1NDX0JBU0UKKyAgICBfU0NfQ19MQU5HX1NVUFBPUlQsCisjZGVmaW5lIF9TQ19DX0xBTkdfU1VQUE9SVAkJX1NDX0NfTEFOR19TVVBQT1JUCisgICAgX1NDX0NfTEFOR19TVVBQT1JUX1IsCisjZGVmaW5lIF9TQ19DX0xBTkdfU1VQUE9SVF9SCQlfU0NfQ19MQU5HX1NVUFBPUlRfUgorICAgIF9TQ19DTE9DS19TRUxFQ1RJT04sCisjZGVmaW5lIF9TQ19DTE9DS19TRUxFQ1RJT04JCV9TQ19DTE9DS19TRUxFQ1RJT04KKyAgICBfU0NfQ1BVVElNRSwKKyNkZWZpbmUgX1NDX0NQVVRJTUUJCQlfU0NfQ1BVVElNRQorICAgIF9TQ19USFJFQURfQ1BVVElNRSwKKyNkZWZpbmUgX1NDX1RIUkVBRF9DUFVUSU1FCQlfU0NfVEhSRUFEX0NQVVRJTUUKKyAgICBfU0NfREVWSUNFX0lPLAorI2RlZmluZSBfU0NfREVWSUNFX0lPCQkJX1NDX0RFVklDRV9JTworICAgIF9TQ19ERVZJQ0VfU1BFQ0lGSUMsCisjZGVmaW5lIF9TQ19ERVZJQ0VfU1BFQ0lGSUMJCV9TQ19ERVZJQ0VfU1BFQ0lGSUMKKyAgICBfU0NfREVWSUNFX1NQRUNJRklDX1IsCisjZGVmaW5lIF9TQ19ERVZJQ0VfU1BFQ0lGSUNfUgkJX1NDX0RFVklDRV9TUEVDSUZJQ19SCisgICAgX1NDX0ZEX01HTVQsCisjZGVmaW5lIF9TQ19GRF9NR01UCQkJX1NDX0ZEX01HTVQKKyAgICBfU0NfRklGTywKKyNkZWZpbmUgX1NDX0ZJRk8JCQlfU0NfRklGTworICAgIF9TQ19QSVBFLAorI2RlZmluZSBfU0NfUElQRQkJCV9TQ19QSVBFCisgICAgX1NDX0ZJTEVfQVRUUklCVVRFUywKKyNkZWZpbmUgX1NDX0ZJTEVfQVRUUklCVVRFUwkJX1NDX0ZJTEVfQVRUUklCVVRFUworICAgIF9TQ19GSUxFX0xPQ0tJTkcsCisjZGVmaW5lIF9TQ19GSUxFX0xPQ0tJTkcJCV9TQ19GSUxFX0xPQ0tJTkcKKyAgICBfU0NfRklMRV9TWVNURU0sCisjZGVmaW5lIF9TQ19GSUxFX1NZU1RFTQkJCV9TQ19GSUxFX1NZU1RFTQorICAgIF9TQ19NT05PVE9OSUNfQ0xPQ0ssCisjZGVmaW5lIF9TQ19NT05PVE9OSUNfQ0xPQ0sJCV9TQ19NT05PVE9OSUNfQ0xPQ0sKKyAgICBfU0NfTVVMVElfUFJPQ0VTUywKKyNkZWZpbmUgX1NDX01VTFRJX1BST0NFU1MJCV9TQ19NVUxUSV9QUk9DRVNTCisgICAgX1NDX1NJTkdMRV9QUk9DRVNTLAorI2RlZmluZSBfU0NfU0lOR0xFX1BST0NFU1MJCV9TQ19TSU5HTEVfUFJPQ0VTUworICAgIF9TQ19ORVRXT1JLSU5HLAorI2RlZmluZSBfU0NfTkVUV09SS0lORwkJCV9TQ19ORVRXT1JLSU5HCisgICAgX1NDX1JFQURFUl9XUklURVJfTE9DS1MsCisjZGVmaW5lIF9TQ19SRUFERVJfV1JJVEVSX0xPQ0tTCQlfU0NfUkVBREVSX1dSSVRFUl9MT0NLUworICAgIF9TQ19TUElOX0xPQ0tTLAorI2RlZmluZSBfU0NfU1BJTl9MT0NLUwkJCV9TQ19TUElOX0xPQ0tTCisgICAgX1NDX1JFR0VYUCwKKyNkZWZpbmUgX1NDX1JFR0VYUAkJCV9TQ19SRUdFWFAKKyAgICBfU0NfUkVHRVhfVkVSU0lPTiwKKyNkZWZpbmUgX1NDX1JFR0VYX1ZFUlNJT04JCV9TQ19SRUdFWF9WRVJTSU9OCisgICAgX1NDX1NIRUxMLAorI2RlZmluZSBfU0NfU0hFTEwJCQlfU0NfU0hFTEwKKyAgICBfU0NfU0lHTkFMUywKKyNkZWZpbmUgX1NDX1NJR05BTFMJCQlfU0NfU0lHTkFMUworICAgIF9TQ19TUEFXTiwKKyNkZWZpbmUgX1NDX1NQQVdOCQkJX1NDX1NQQVdOCisgICAgX1NDX1NQT1JBRElDX1NFUlZFUiwKKyNkZWZpbmUgX1NDX1NQT1JBRElDX1NFUlZFUgkJX1NDX1NQT1JBRElDX1NFUlZFUgorICAgIF9TQ19USFJFQURfU1BPUkFESUNfU0VSVkVSLAorI2RlZmluZSBfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUglfU0NfVEhSRUFEX1NQT1JBRElDX1NFUlZFUgorICAgIF9TQ19TWVNURU1fREFUQUJBU0UsCisjZGVmaW5lIF9TQ19TWVNURU1fREFUQUJBU0UJCV9TQ19TWVNURU1fREFUQUJBU0UKKyAgICBfU0NfU1lTVEVNX0RBVEFCQVNFX1IsCisjZGVmaW5lIF9TQ19TWVNURU1fREFUQUJBU0VfUgkJX1NDX1NZU1RFTV9EQVRBQkFTRV9SCisgICAgX1NDX1RJTUVPVVRTLAorI2RlZmluZSBfU0NfVElNRU9VVFMJCQlfU0NfVElNRU9VVFMKKyAgICBfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMsCisjZGVmaW5lIF9TQ19UWVBFRF9NRU1PUllfT0JKRUNUUwlfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMKKyAgICBfU0NfVVNFUl9HUk9VUFMsCisjZGVmaW5lIF9TQ19VU0VSX0dST1VQUwkJCV9TQ19VU0VSX0dST1VQUworICAgIF9TQ19VU0VSX0dST1VQU19SLAorI2RlZmluZSBfU0NfVVNFUl9HUk9VUFNfUgkJX1NDX1VTRVJfR1JPVVBTX1IKKyAgICBfU0NfMl9QQlMsCisjZGVmaW5lIF9TQ18yX1BCUwkJCV9TQ18yX1BCUworICAgIF9TQ18yX1BCU19BQ0NPVU5USU5HLAorI2RlZmluZSBfU0NfMl9QQlNfQUNDT1VOVElORwkJX1NDXzJfUEJTX0FDQ09VTlRJTkcKKyAgICBfU0NfMl9QQlNfTE9DQVRFLAorI2RlZmluZSBfU0NfMl9QQlNfTE9DQVRFCQlfU0NfMl9QQlNfTE9DQVRFCisgICAgX1NDXzJfUEJTX01FU1NBR0UsCisjZGVmaW5lIF9TQ18yX1BCU19NRVNTQUdFCQlfU0NfMl9QQlNfTUVTU0FHRQorICAgIF9TQ18yX1BCU19UUkFDSywKKyNkZWZpbmUgX1NDXzJfUEJTX1RSQUNLCQkJX1NDXzJfUEJTX1RSQUNLCisgICAgX1NDX1NZTUxPT1BfTUFYLAorI2RlZmluZSBfU0NfU1lNTE9PUF9NQVgJCQlfU0NfU1lNTE9PUF9NQVgKKyAgICBfU0NfU1RSRUFNUywKKyNkZWZpbmUgX1NDX1NUUkVBTVMJCQlfU0NfU1RSRUFNUworICAgIF9TQ18yX1BCU19DSEVDS1BPSU5ULAorI2RlZmluZSBfU0NfMl9QQlNfQ0hFQ0tQT0lOVAkJX1NDXzJfUEJTX0NIRUNLUE9JTlQKKworICAgIF9TQ19WNl9JTFAzMl9PRkYzMiwKKyNkZWZpbmUgX1NDX1Y2X0lMUDMyX09GRjMyCQlfU0NfVjZfSUxQMzJfT0ZGMzIKKyAgICBfU0NfVjZfSUxQMzJfT0ZGQklHLAorI2RlZmluZSBfU0NfVjZfSUxQMzJfT0ZGQklHCQlfU0NfVjZfSUxQMzJfT0ZGQklHCisgICAgX1NDX1Y2X0xQNjRfT0ZGNjQsCisjZGVmaW5lIF9TQ19WNl9MUDY0X09GRjY0CQlfU0NfVjZfTFA2NF9PRkY2NAorICAgIF9TQ19WNl9MUEJJR19PRkZCSUcsCisjZGVmaW5lIF9TQ19WNl9MUEJJR19PRkZCSUcJCV9TQ19WNl9MUEJJR19PRkZCSUcKKworICAgIF9TQ19IT1NUX05BTUVfTUFYLAorI2RlZmluZSBfU0NfSE9TVF9OQU1FX01BWAkJX1NDX0hPU1RfTkFNRV9NQVgKKyAgICBfU0NfVFJBQ0UsCisjZGVmaW5lIF9TQ19UUkFDRQkJCV9TQ19UUkFDRQorICAgIF9TQ19UUkFDRV9FVkVOVF9GSUxURVIsCisjZGVmaW5lIF9TQ19UUkFDRV9FVkVOVF9GSUxURVIJCV9TQ19UUkFDRV9FVkVOVF9GSUxURVIKKyAgICBfU0NfVFJBQ0VfSU5IRVJJVCwKKyNkZWZpbmUgX1NDX1RSQUNFX0lOSEVSSVQJCV9TQ19UUkFDRV9JTkhFUklUCisgICAgX1NDX1RSQUNFX0xPRywKKyNkZWZpbmUgX1NDX1RSQUNFX0xPRwkJCV9TQ19UUkFDRV9MT0cKKworICAgIF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUJCV9TQ19MRVZFTDFfSUNBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwxX0lDQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMV9JQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDFfSUNBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMMV9JQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDFfSUNBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfU0laRQkJX1NDX0xFVkVMMV9EQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDFfRENBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUwxX0RDQUNIRV9BU1NPQwkJX1NDX0xFVkVMMV9EQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUwxX0RDQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMMV9EQ0FDSEVfTElORVNJWkUKKyAgICBfU0NfTEVWRUwyX0NBQ0hFX1NJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfU0laRQkJX1NDX0xFVkVMMl9DQUNIRV9TSVpFCisgICAgX1NDX0xFVkVMMl9DQUNIRV9BU1NPQywKKyNkZWZpbmUgX1NDX0xFVkVMMl9DQUNIRV9BU1NPQwkJX1NDX0xFVkVMMl9DQUNIRV9BU1NPQworICAgIF9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUsCisjZGVmaW5lIF9TQ19MRVZFTDJfQ0FDSEVfTElORVNJWkUJX1NDX0xFVkVMMl9DQUNIRV9MSU5FU0laRQorICAgIF9TQ19MRVZFTDNfQ0FDSEVfU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9TSVpFCQlfU0NfTEVWRUwzX0NBQ0hFX1NJWkUKKyAgICBfU0NfTEVWRUwzX0NBQ0hFX0FTU09DLAorI2RlZmluZSBfU0NfTEVWRUwzX0NBQ0hFX0FTU09DCQlfU0NfTEVWRUwzX0NBQ0hFX0FTU09DCisgICAgX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRSwKKyNkZWZpbmUgX1NDX0xFVkVMM19DQUNIRV9MSU5FU0laRQlfU0NfTEVWRUwzX0NBQ0hFX0xJTkVTSVpFCisgICAgX1NDX0xFVkVMNF9DQUNIRV9TSVpFLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX1NJWkUJCV9TQ19MRVZFTDRfQ0FDSEVfU0laRQorICAgIF9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MsCisjZGVmaW5lIF9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MJCV9TQ19MRVZFTDRfQ0FDSEVfQVNTT0MKKyAgICBfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFLAorI2RlZmluZSBfU0NfTEVWRUw0X0NBQ0hFX0xJTkVTSVpFCV9TQ19MRVZFTDRfQ0FDSEVfTElORVNJWkUKKyAgICAvKiBMZWF2ZSByb29tIGhlcmUsIG1heWJlIHdlIG5lZWQgYSBmZXcgbW9yZSBjYWNoZSBsZXZlbHMgc29tZSBkYXkuICAqLworCisgICAgX1NDX0lQVjYgPSBfU0NfTEVWRUwxX0lDQUNIRV9TSVpFICsgNTAsCisjZGVmaW5lIF9TQ19JUFY2CQkJX1NDX0lQVjYKKyAgICBfU0NfUkFXX1NPQ0tFVFMKKyNkZWZpbmUgX1NDX1JBV19TT0NLRVRTCQkJX1NDX1JBV19TT0NLRVRTCisgIH07CisKKy8qIFZhbHVlcyBmb3IgdGhlIE5BTUUgYXJndW1lbnQgdG8gYGNvbmZzdHInLiAgKi8KK2VudW0KKyAgeworICAgIF9DU19QQVRILAkJCS8qIFRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoLiAgKi8KKyNkZWZpbmUgX0NTX1BBVEgJCV9DU19QQVRICisKKyAgICBfQ1NfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTLAorI2RlZmluZSBfQ1NfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCV9DU19WNl9XSURUSF9SRVNUUklDVEVEX0VOVlMKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X1dJRFRIX1JFU1RSSUNURURfRU5WUwlfQ1NfVjZfV0lEVEhfUkVTVFJJQ1RFRF9FTlZTCisKKyAgICBfQ1NfR05VX0xJQkNfVkVSU0lPTiwKKyNkZWZpbmUgX0NTX0dOVV9MSUJDX1ZFUlNJT04JX0NTX0dOVV9MSUJDX1ZFUlNJT04KKyAgICBfQ1NfR05VX0xJQlBUSFJFQURfVkVSU0lPTiwKKyNkZWZpbmUgX0NTX0dOVV9MSUJQVEhSRUFEX1ZFUlNJT04JX0NTX0dOVV9MSUJQVEhSRUFEX1ZFUlNJT04KKworICAgIF9DU19MRlNfQ0ZMQUdTID0gMTAwMCwKKyNkZWZpbmUgX0NTX0xGU19DRkxBR1MJX0NTX0xGU19DRkxBR1MKKyAgICBfQ1NfTEZTX0xERkxBR1MsCisjZGVmaW5lIF9DU19MRlNfTERGTEFHUwlfQ1NfTEZTX0xERkxBR1MKKyAgICBfQ1NfTEZTX0xJQlMsCisjZGVmaW5lIF9DU19MRlNfTElCUwkJX0NTX0xGU19MSUJTCisgICAgX0NTX0xGU19MSU5URkxBR1MsCisjZGVmaW5lIF9DU19MRlNfTElOVEZMQUdTCV9DU19MRlNfTElOVEZMQUdTCisgICAgX0NTX0xGUzY0X0NGTEFHUywKKyNkZWZpbmUgX0NTX0xGUzY0X0NGTEFHUwlfQ1NfTEZTNjRfQ0ZMQUdTCisgICAgX0NTX0xGUzY0X0xERkxBR1MsCisjZGVmaW5lIF9DU19MRlM2NF9MREZMQUdTCV9DU19MRlM2NF9MREZMQUdTCisgICAgX0NTX0xGUzY0X0xJQlMsCisjZGVmaW5lIF9DU19MRlM2NF9MSUJTCV9DU19MRlM2NF9MSUJTCisgICAgX0NTX0xGUzY0X0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX0xGUzY0X0xJTlRGTEFHUwlfQ1NfTEZTNjRfTElOVEZMQUdTCisKKyAgICBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9DRkxBR1MgPSAxMTAwLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9DRkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfQ0ZMQUdTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTERGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTERGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MREZMQUdTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElCUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElCUyBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSUJTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9JTFAzMl9PRkYzMl9MSU5URkxBR1MgX0NTX1hCUzVfSUxQMzJfT0ZGMzJfTElOVEZMQUdTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0NGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRkJJR19MREZMQUdTIF9DU19YQlM1X0lMUDMyX09GRkJJR19MREZMQUdTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSUJTIF9DU19YQlM1X0lMUDMyX09GRkJJR19MSUJTCisgICAgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfWEJTNV9JTFAzMl9PRkZCSUdfTElOVEZMQUdTCisgICAgX0NTX1hCUzVfTFA2NF9PRkY2NF9DRkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQNjRfT0ZGNjRfQ0ZMQUdTIF9DU19YQlM1X0xQNjRfT0ZGNjRfQ0ZMQUdTCisgICAgX0NTX1hCUzVfTFA2NF9PRkY2NF9MREZMQUdTLAorI2RlZmluZSBfQ1NfWEJTNV9MUDY0X09GRjY0X0xERkxBR1MgX0NTX1hCUzVfTFA2NF9PRkY2NF9MREZMQUdTCisgICAgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSUJTLAorI2RlZmluZSBfQ1NfWEJTNV9MUDY0X09GRjY0X0xJQlMgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSUJTCisgICAgX0NTX1hCUzVfTFA2NF9PRkY2NF9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElOVEZMQUdTIF9DU19YQlM1X0xQNjRfT0ZGNjRfTElOVEZMQUdTCisgICAgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0NGTEFHUyBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfQ0ZMQUdTCisgICAgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19YQlM1X0xQQklHX09GRkJJR19MREZMQUdTIF9DU19YQlM1X0xQQklHX09GRkJJR19MREZMQUdTCisgICAgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19YQlM1X0xQQklHX09GRkJJR19MSUJTIF9DU19YQlM1X0xQQklHX09GRkJJR19MSUJTCisgICAgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1hCUzVfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfWEJTNV9MUEJJR19PRkZCSUdfTElOVEZMQUdTCisKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfQ0ZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfQ0ZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTERGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xERkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElCUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJQlMgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRjMyX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElOVEZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGMzJfTElOVEZMQUdTIF9DU19QT1NJWF9WNl9JTFAzMl9PRkYzMl9MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19DRkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTERGTEFHUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9JTFAzMl9PRkZCSUdfTElCUyBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjZfSUxQMzJfT0ZGQklHX0xJTlRGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSU5URkxBR1MgX0NTX1BPU0lYX1Y2X0lMUDMyX09GRkJJR19MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9DRkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0NGTEFHUyBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MREZMQUdTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MREZMQUdTIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSUJTLAorI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSUJTIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJQlMKKyAgICBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSU5URkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUDY0X09GRjY0X0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfTFA2NF9PRkY2NF9MSU5URkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0NGTEFHUywKKyNkZWZpbmUgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19DRkxBR1MgX0NTX1BPU0lYX1Y2X0xQQklHX09GRkJJR19DRkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xERkxBR1MsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTERGTEFHUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xERkxBR1MKKyAgICBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJQlMsCisjZGVmaW5lIF9DU19QT1NJWF9WNl9MUEJJR19PRkZCSUdfTElCUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJQlMKKyAgICBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUworI2RlZmluZSBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUyBfQ1NfUE9TSVhfVjZfTFBCSUdfT0ZGQklHX0xJTlRGTEFHUworICB9OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2RpcmVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2RpcmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Nzk0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZGlyZW50LmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ESVJFTlRfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2RpcmVudC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZGlyZW50Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKK3N0cnVjdCBkaXJlbnQKKyAgeworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19pbm9fdCBkX2lubzsKKyAgICBfX29mZl90IGRfb2ZmOworI2Vsc2UKKyAgICBfX2lubzY0X3QgZF9pbm87CisgICAgX19vZmY2NF90IGRfb2ZmOworI2VuZGlmCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGRfcmVjbGVuOworICAgIHVuc2lnbmVkIGNoYXIgZF90eXBlOworICAgIGNoYXIgZF9uYW1lWzI1Nl07CQkvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxpbWl0cy5oISAqLworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBkaXJlbnQ2NAorICB7CisgICAgX19pbm82NF90IGRfaW5vOworICAgIF9fb2ZmNjRfdCBkX29mZjsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgZF9yZWNsZW47CisgICAgdW5zaWduZWQgY2hhciBkX3R5cGU7CisgICAgY2hhciBkX25hbWVbMjU2XTsJCS8qIFdlIG11c3Qgbm90IGluY2x1ZGUgbGltaXRzLmghICovCisgIH07CisjZW5kaWYKKworI2RlZmluZSBkX2ZpbGVubwlkX2lubwkvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gICovCisKKyN1bmRlZiAgX0RJUkVOVF9IQVZFX0RfTkFNTEVOCisjZGVmaW5lIF9ESVJFTlRfSEFWRV9EX1JFQ0xFTgorI2RlZmluZSBfRElSRU5UX0hBVkVfRF9PRkYKKyNkZWZpbmUgX0RJUkVOVF9IQVZFX0RfVFlQRQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2RsZmNuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZGxmY24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZkOTZhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2RsZmNuLmgKQEAgLTAsMCArMSw2NSBAQAorLyogU3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9ucyBmb3IgcnVuLXRpbWUgZHluYW1pYyBsb2FkaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0RMRkNOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9kbGZjbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8ZGxmY24uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIE1PREUgYXJndW1lbnQgdG8gYGRsb3BlbicgY29udGFpbnMgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCisjZGVmaW5lIFJUTERfTEFaWQkweDAwMDAxCS8qIExhenkgZnVuY3Rpb24gY2FsbCBiaW5kaW5nLiAgKi8KKyNkZWZpbmUgUlRMRF9OT1cJMHgwMDAwMgkvKiBJbW1lZGlhdGUgZnVuY3Rpb24gY2FsbCBiaW5kaW5nLiAgKi8KKyNkZWZpbmUJUlRMRF9CSU5ESU5HX01BU0sgICAweDMJLyogTWFzayBvZiBiaW5kaW5nIHRpbWUgdmFsdWUuICAqLworI2RlZmluZSBSVExEX05PTE9BRAkweDAwMDA0CS8qIERvIG5vdCBsb2FkIHRoZSBvYmplY3QuICAqLworI2RlZmluZSBSVExEX0RFRVBCSU5ECTB4MDAwMDgJLyogVXNlIGRlZXAgYmluZGluZy4gICovCisKKy8qIElmIHRoZSBmb2xsb3dpbmcgYml0IGlzIHNldCBpbiB0aGUgTU9ERSBhcmd1bWVudCB0byBgZGxvcGVuJywKKyAgIHRoZSBzeW1ib2xzIG9mIHRoZSBsb2FkZWQgb2JqZWN0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIGFyZSBtYWRlCisgICB2aXNpYmxlIGFzIGlmIHRoZSBvYmplY3Qgd2VyZSBsaW5rZWQgZGlyZWN0bHkgaW50byB0aGUgcHJvZ3JhbS4gICovCisjZGVmaW5lIFJUTERfR0xPQkFMCTB4MDAxMDAKKworLyogVW5peDk4IGRlbWFuZHMgdGhlIGZvbGxvd2luZyBmbGFnIHdoaWNoIGlzIHRoZSBpbnZlcnNlIHRvIFJUTERfR0xPQkFMLgorICAgVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgdGhpcyBieSBkZWZhdWx0IGFuZCBzbyB3ZSBjYW4gZGVmaW5lIHRoZQorICAgdmFsdWUgdG8gemVyby4gICovCisjZGVmaW5lIFJUTERfTE9DQUwJMAorCisvKiBEbyBub3QgZGVsZXRlIG9iamVjdCB3aGVuIGNsb3NlZC4gICovCisjZGVmaW5lIFJUTERfTk9ERUxFVEUJMHgwMTAwMAorCisjaWZkZWYgX19VU0VfR05VCisvKiBUbyBzdXBwb3J0IHByb2ZpbGluZyBvZiBzaGFyZWQgb2JqZWN0cyBpdCBpcyBhIGdvb2QgaWRlYSB0byBjYWxsCisgICB0aGUgZnVuY3Rpb24gZm91bmQgdXNpbmcgYGRsc3ltJyB1c2luZyB0aGUgZm9sbG93aW5nIG1hY3JvIHNpbmNlCisgICB0aGVzZSBjYWxscyBkbyBub3QgdXNlIHRoZSBQTFQuICBCdXQgdGhpcyB3b3VsZCBtZWFuIHRoZSBkeW5hbWljCisgICBsb2FkZXIgaGFzIG5vIGNoYW5jZSB0byBmaW5kIG91dCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuICBUaGUKKyAgIG1hY3JvIGFwcGxpZXMgdGhlIG5lY2Vzc2FyeSBtYWdpYyBzbyB0aGF0IHByb2ZpbGluZyBpcyBwb3NzaWJsZS4KKyAgIFJld3JpdGUKKwlmb28gPSAoKmZjdHApIChhcmcxLCBhcmcyKTsKKyAgIGludG8KKyAgICAgICAgZm9vID0gRExfQ0FMTF9GQ1QgKGZjdHAsIChhcmcxLCBhcmcyKSk7CisqLworIyBkZWZpbmUgRExfQ0FMTF9GQ1QoZmN0cCwgYXJncykgXAorICAoX2RsX21jb3VudF93cmFwcGVyX2NoZWNrICgodm9pZCAqKSAoZmN0cCkpLCAoKihmY3RwKSkgYXJncykKKworX19CRUdJTl9ERUNMUworCisvKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBwcm9maWxpbmcgZnVuY3Rpb25zLiAgKi8KK2V4dGVybiB2b2lkIF9kbF9tY291bnRfd3JhcHBlcl9jaGVjayAodm9pZCAqX19zZWxmcGMpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2VsZmNsYXNzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZWxmY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAyMjdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2VsZmNsYXNzLmgKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgbmF0aXZlIHdvcmQgc2l6ZSBvZiB0aGUgbWFjaGluZSwgd2hpY2ggaW5kaWNhdGVzCisgICB0aGUgRUxGIGZpbGUgY2xhc3MgdXNlZCBmb3IgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBvYmplY3RzIG9uIHRoaXMKKyAgIG1hY2hpbmUuICAqLworCisjaWZuZGVmIF9MSU5LX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9lbGZjbGFzcy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bGluay5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjZGVmaW5lIF9fRUxGX05BVElWRV9DTEFTUyBfX1dPUkRTSVpFCisKKy8qIFRoZSBlbnRyaWVzIGluIHRoZSAuaGFzaCB0YWJsZSBhbHdheXMgaGF2ZSBhIHNpemUgb2YgMzIgYml0cy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZl9TeW1uZHg7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZW5kaWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1OWVhZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9lbmRpYW4uaApAQCAtMCwwICsxLDcgQEAKKy8qIHg4Nl82NCBpcyBsaXR0bGUtZW5kaWFuLiAgKi8KKworI2lmbmRlZiBfRU5ESUFOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9lbmRpYW4uaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGVuZGlhbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9lbnZpcm9ubWVudHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9lbnZpcm9ubWVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTFhNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2Vudmlyb25tZW50cy5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVU5JU1REX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDx1bmlzdGQuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBUaGlzIGhlYWRlciBzaG91bGQgZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3ltYm9scyB1bmRlciB0aGUgZGVzY3JpYmVkCisgICBzaXR1YXRpb25zLiAgQSB2YWx1ZSBgMScgbWVhbnMgdGhhdCB0aGUgbW9kZWwgaXMgYWx3YXlzIHN1cHBvcnRlZCwKKyAgIGAtMScgbWVhbnMgaXQgaXMgbmV2ZXIgc3VwcG9ydGVkLiAgVW5kZWZpbmVkIG1lYW5zIGl0IGNhbm5vdCBiZQorICAgc3RhdGljYWxseSBkZWNpZGVkLgorCisgICBfUE9TSVhfVjZfSUxQMzJfT0ZGMzIgICAzMmJpdCBpbnQsIGxvbmcsIHBvaW50ZXJzLCBhbmQgb2ZmX3QgdHlwZQorICAgX1BPU0lYX1Y2X0lMUDMyX09GRkJJRyAgMzJiaXQgaW50LCBsb25nLCBhbmQgcG9pbnRlcnMgYW5kIGxhcmdlciBvZmZfdCB0eXBlCisKKyAgIF9QT1NJWF9WNl9MUDY0X09GRjMyCSAgIDY0Yml0IGxvbmcgYW5kIHBvaW50ZXJzIGFuZCAzMmJpdCBvZmZfdCB0eXBlCisgICBfUE9TSVhfVjZfTFBCSUdfT0ZGQklHICA2NGJpdCBsb25nIGFuZCBwb2ludGVycyBhbmQgbGFyZ2Ugb2ZmX3QgdHlwZQorCisgICBUaGUgbWFjcm9zIF9YQlM1X0lMUDMyX09GRjMyLCBfWEJTNV9JTFAzMl9PRkZCSUcsIF9YQlM1X0xQNjRfT0ZGMzIsIGFuZAorICAgX1hCUzVfTFBCSUdfT0ZGQklHIHdlcmUgdXNlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgVW5peCBzdGFuZGFyZAorICAgYW5kIGFyZSBhdmFpbGFibGUgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KKyovCisKKyNpZiBfX1dPUkRTSVpFID09IDY0CisKKy8qIEVudmlyb25tZW50cyB3aXRoIDMyLWJpdCB3aWRlIHBvaW50ZXJzIGFyZSBvcHRpb25hbGx5IHByb3ZpZGVkLgorICAgVGhlcmVmb3JlIGZvbGxvd2luZyBtYWNyb3MgYXJlbid0IGRlZmluZWQ6CisgICAjIHVuZGVmIF9QT1NJWF9WNl9JTFAzMl9PRkYzMgorICAgIyB1bmRlZiBfUE9TSVhfVjZfSUxQMzJfT0ZGQklHCisgICAjIHVuZGVmIF9YQlM1X0lMUDMyX09GRjMyCisgICAjIHVuZGVmIF9YQlM1X0lMUDMyX09GRkJJRworICAgYW5kIHVzZXJzIG5lZWQgdG8gY2hlY2sgYXQgcnVudGltZS4gICovCisKKy8qIFdlIGFsc28gaGF2ZSBubyB1c2UgKGZvciBub3cpIGZvciBhbiBlbnZpcm9ubWVudCB3aXRoIGJpZ2dlciBwb2ludGVycworICAgYW5kIG9mZnNldHMuICAqLworIyBkZWZpbmUgX1BPU0lYX1Y2X0xQQklHX09GRkJJRwktMQorIyBkZWZpbmUgX1hCUzVfTFBCSUdfT0ZGQklHCS0xCisKKy8qIEJ5IGRlZmF1bHQgd2UgaGF2ZSA2NC1iaXQgd2lkZSBgbG9uZyBpbnQnLCBwb2ludGVycyBhbmQgYG9mZl90Jy4gICovCisjIGRlZmluZSBfUE9TSVhfVjZfTFA2NF9PRkY2NAkxCisjIGRlZmluZSBfWEJTNV9MUDY0X09GRjY0CTEKKworI2Vsc2UgLyogX19XT1JEU0laRSA9PSAzMiAqLworCisvKiBCeSBkZWZhdWx0IHdlIGhhdmUgMzItYml0IHdpZGUgYGludCcsIGBsb25nIGludCcsIHBvaW50ZXJzIGFuZCBgb2ZmX3QnCisgICBhbmQgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IExGUy4gICovCisjIGRlZmluZSBfUE9TSVhfVjZfSUxQMzJfT0ZGMzIJMQorIyBkZWZpbmUgX1BPU0lYX1Y2X0lMUDMyX09GRkJJRwkxCisjIGRlZmluZSBfWEJTNV9JTFAzMl9PRkYzMgkxCisjIGRlZmluZSBfWEJTNV9JTFAzMl9PRkZCSUcJMQorCisvKiBXZSBvcHRpb25hbGx5IHByb3ZpZGUgYW4gZW52aXJvbm1lbnQgd2l0aCB0aGUgYWJvdmUgc2l6ZSBidXQgYW4gNjQtYml0CisgICBzaWRlIGBvZmZfdCcuICBUaGVyZWZvcmUgd2UgZG9uJ3QgZGVmaW5lIF9YQlM1X0lMUDMyX09GRkJJRy4gICovCisKKy8qIEVudmlyb25tZW50cyB3aXRoIDY0LWJpdCB3aWRlIHBvaW50ZXJzIGNhbiBiZSBwcm92aWRlZCwKKyAgIHNvIHRoZXNlIG1hY3JvcyBhcmVuJ3QgZGVmaW5lZDoKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0xQNjRfT0ZGNjQKKyAgICMgdW5kZWYgX1BPU0lYX1Y2X0xQQklHX09GRkJJRworICAgIyB1bmRlZiBfWEJTNV9MUDY0X09GRjY0CisgICAjIHVuZGVmIF9YQlM1X0xQQklHX09GRkJJRworICAgYW5kIHN5c2NvbmYgdGVzdHMgZm9yIGl0IGF0IHJ1bnRpbWUuICAqLworCisjZW5kaWYgLyogX19XT1JEU0laRSA9PSAzMiAqLworCisjZGVmaW5lIF9fSUxQMzJfT0ZGMzJfQ0ZMQUdTCSItbTMyIgorI2RlZmluZSBfX0lMUDMyX09GRkJJR19DRkxBR1MJIi1tMzIgLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IgorI2RlZmluZSBfX0lMUDMyX09GRjMyX0xERkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fSUxQMzJfT0ZGQklHX0xERkxBR1MJIi1tMzIiCisjZGVmaW5lIF9fTFA2NF9PRkY2NF9DRkxBR1MJIi1tNjQiCisjZGVmaW5lIF9fTFA2NF9PRkY2NF9MREZMQUdTCSItbTY0IgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2Vycm5vLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU4Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2Vycm5vLmgKQEAgLTAsMCArMSw1OSBAQAorLyogRXJyb3IgY29uc3RhbnRzLiAgTGludXggc3BlY2lmaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmZGVmIF9FUlJOT19ICisKKyMgdW5kZWYgRURPTQorIyB1bmRlZiBFSUxTRVEKKyMgdW5kZWYgRVJBTkdFCisjIGluY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKy8qIExpbnV4IGhhcyBubyBFTk9UU1VQIGVycm9yIGNvZGUuICAqLworIyBkZWZpbmUgRU5PVFNVUCBFT1BOT1RTVVBQCisKKy8qIE9sZGVyIExpbnV4IHZlcnNpb25zIGFsc28gaGFkIG5vIEVDQU5DRUxFRCBlcnJvciBjb2RlLiAgKi8KKyMgaWZuZGVmIEVDQU5DRUxFRAorIyAgZGVmaW5lIEVDQU5DRUxFRAkxMjUKKyMgZW5kaWYKKworLyogU3VwcG9ydCBmb3IgZXJyb3IgY29kZXMgdG8gc3VwcG9ydCByb2J1c3QgbXV0ZXhlcyB3YXMgYWRkZWQgbGF0ZXIsIHRvby4gICovCisjIGlmbmRlZiBFT1dORVJERUFECisjICBkZWZpbmUgRU9XTkVSREVBRAkJMTMwCisjICBkZWZpbmUgRU5PVFJFQ09WRVJBQkxFCTEzMQorIyBlbmRpZgorCisjIGlmbmRlZiBfX0FTU0VNQkxFUl9fCisvKiBGdW5jdGlvbiB0byBnZXQgYWRkcmVzcyBvZiBnbG9iYWwgYGVycm5vJyB2YXJpYWJsZS4gICovCitleHRlcm4gaW50ICpfX2Vycm5vX2xvY2F0aW9uICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworIyAgaWYgIWRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQKKy8qIFdoZW4gdXNpbmcgdGhyZWFkcywgZXJybm8gaXMgYSBwZXItdGhyZWFkIHZhbHVlLiAgKi8KKyMgICBkZWZpbmUgZXJybm8gKCpfX2Vycm5vX2xvY2F0aW9uICgpKQorIyAgZW5kaWYKKyMgZW5kaWYgLyogIV9fQVNTRU1CTEVSX18gKi8KKyNlbmRpZiAvKiBfRVJSTk9fSCAqLworCisjaWYgIWRlZmluZWQgX0VSUk5PX0ggJiYgZGVmaW5lZCBfX25lZWRfRW1hdGgKKy8qIFRoaXMgaXMgdWdseSBidXQgdGhlIGtlcm5lbCBoZWFkZXIgaXMgbm90IGNsZWFuIGVub3VnaC4gIFdlIG11c3QKKyAgIGRlZmluZSBvbmx5IHRoZSB2YWx1ZXMgRURPTSwgRUlMU0VRIGFuZCBFUkFOR0UgaW4gY2FzZSBfX25lZWRfRW1hdGggaXMKKyAgIGRlZmluZWQuICAqLworIyBkZWZpbmUgRURPTQkzMwkvKiBNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuY3Rpb24uICAqLworIyBkZWZpbmUgRUlMU0VRCTg0CS8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZS4gICovCisjIGRlZmluZSBFUkFOR0UJMzQJLyogTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUuICAqLworI2VuZGlmIC8qICFfRVJSTk9fSCAmJiBfX25lZWRfRW1hdGggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9lcnJvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YTNmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9lcnJvci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIFNwZWNpYWxpemF0aW9ucyBmb3IgZXJyb3IgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9FUlJPUl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2Vycm9yLmg+IGRpcmVjdGx5OyB1c2UgPGVycm9yLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9hbGlhcywgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLAorCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3IpCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgX19SRURJUkVDVCAoX19lcnJvcl9ub3JldHVybiwgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLAorCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3IpCisgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7CisKKworLyogSWYgd2Uga25vdyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gbWFrZSBzdXJlIHRoZSBjb21waWxlcgorICAgcmVhbGl6ZXMgdGhhdCwgdG9vLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorZXJyb3IgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zdGF0dXMpICYmIF9fc3RhdHVzICE9IDApCisgICAgX19lcnJvcl9ub3JldHVybiAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7CisgIGVsc2UKKyAgICBfX2Vycm9yX2FsaWFzIChfX3N0YXR1cywgX19lcnJudW0sIF9fZm9ybWF0LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworCitleHRlcm4gdm9pZCBfX1JFRElSRUNUIChfX2Vycm9yX2F0X2xpbmVfYWxpYXMsIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJCV9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCQkJCXVuc2lnbmVkIGludCBfX2xpbmUsCisJCQkJCQlfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pLAorCQkJZXJyb3JfYXRfbGluZSkKKyAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CitleHRlcm4gdm9pZCBfX1JFRElSRUNUIChfX2Vycm9yX2F0X2xpbmVfbm9yZXR1cm4sIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwKKwkJCQkJCSAgIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBfX2xpbmUsCisJCQkJCQkgICBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LAorCQkJCQkJICAgLi4uKSwKKwkJCWVycm9yX2F0X2xpbmUpCisgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDUsIDYpKSk7CisKKworLyogSWYgd2Uga25vdyB0aGUgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gbWFrZSBzdXJlIHRoZSBjb21waWxlcgorICAgcmVhbGl6ZXMgdGhhdCwgdG9vLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorZXJyb3JfYXRfbGluZSAoaW50IF9fc3RhdHVzLCBpbnQgX19lcnJudW0sIF9fY29uc3QgY2hhciAqX19mbmFtZSwKKwkgICAgICAgdW5zaWduZWQgaW50IF9fbGluZSxfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCit7CisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zdGF0dXMpICYmIF9fc3RhdHVzICE9IDApCisgICAgX19lcnJvcl9hdF9saW5lX25vcmV0dXJuIChfX3N0YXR1cywgX19lcnJudW0sIF9fZm5hbWUsIF9fbGluZSwgX19mb3JtYXQsCisJCQkgICAgICBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgZWxzZQorICAgIF9fZXJyb3JfYXRfbGluZV9hbGlhcyAoX19zdGF0dXMsIF9fZXJybnVtLCBfX2ZuYW1lLCBfX2xpbmUsCisJCQkgICBfX2Zvcm1hdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmNudGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOTZhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmNudGwuaApAQCAtMCwwICsxLDI1NCBAQAorLyogT18qLCBGXyosIEZEXyogYml0IHZhbHVlcyBmb3IgTGludXgveDg2LTY0LgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0LCAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvZmNudGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPGZjbnRsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisjaWZkZWYgX19VU0VfR05VCisjIGluY2x1ZGUgPGJpdHMvdWlvLmg+CisjZW5kaWYKKworCisvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCisgICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgT19BQ0NNT0RFCSAgIDAwMDMKKyNkZWZpbmUgT19SRE9OTFkJICAgICAwMAorI2RlZmluZSBPX1dST05MWQkgICAgIDAxCisjZGVmaW5lIE9fUkRXUgkJICAgICAwMgorI2RlZmluZSBPX0NSRUFUCQkgICAwMTAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0VYQ0wJCSAgIDAyMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fTk9DVFRZCSAgIDA0MDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fVFJVTkMJCSAgMDEwMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fQVBQRU5ECSAgMDIwMDAKKyNkZWZpbmUgT19OT05CTE9DSwkgIDA0MDAwCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKyNkZWZpbmUgT19TWU5DCQkgMDEwMDAwCisjZGVmaW5lIE9fRlNZTkMJCSBPX1NZTkMKKyNkZWZpbmUgT19BU1lOQwkJIDAyMDAwMAorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBPX0RJUkVDVAkgMDQwMDAwCS8qIERpcmVjdCBkaXNrIGFjY2Vzcy4JKi8KKyMgZGVmaW5lIE9fRElSRUNUT1JZCTAyMDAwMDAJLyogTXVzdCBiZSBhIGRpcmVjdG9yeS4JICovCisjIGRlZmluZSBPX05PRk9MTE9XCTA0MDAwMDAJLyogRG8gbm90IGZvbGxvdyBsaW5rcy4JICovCisjIGRlZmluZSBPX05PQVRJTUUgICAgIDAxMDAwMDAwIC8qIERvIG5vdCBzZXQgYXRpbWUuICAqLworIyBkZWZpbmUgT19DTE9FWEVDICAgICAwMjAwMDAwMCAvKiBTZXQgY2xvc2Vfb25fZXhlYy4gICovCisjZW5kaWYKKworLyogRm9yIG5vdyBMaW51eCBoYXMgc3luY2hyb25pc2l0eSBvcHRpb25zIGZvciBkYXRhIGFuZCByZWFkIG9wZXJhdGlvbnMuCisgICBXZSBkZWZpbmUgdGhlIHN5bWJvbHMgaGVyZSBidXQgbGV0IHRoZW0gZG8gdGhlIHNhbWUgYXMgT19TWU5DIHNpbmNlCisgICB0aGlzIGlzIGEgc3VwZXJzZXQuCSovCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorIyBkZWZpbmUgT19EU1lOQwlPX1NZTkMJLyogU3luY2hyb25pemUgZGF0YS4gICovCisjIGRlZmluZSBPX1JTWU5DCU9fU1lOQwkvKiBTeW5jaHJvbml6ZSByZWFkIG9wZXJhdGlvbnMuCSAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgT19MQVJHRUZJTEUJMAorIyBlbHNlCisjICBkZWZpbmUgT19MQVJHRUZJTEUJMDEwMDAwMAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZmNudGwnLiAgKi8KKyNkZWZpbmUgRl9EVVBGRAkJMAkvKiBEdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgRl9HRVRGRAkJMQkvKiBHZXQgZmlsZSBkZXNjcmlwdG9yIGZsYWdzLiAgKi8KKyNkZWZpbmUgRl9TRVRGRAkJMgkvKiBTZXQgZmlsZSBkZXNjcmlwdG9yIGZsYWdzLiAgKi8KKyNkZWZpbmUgRl9HRVRGTAkJMwkvKiBHZXQgZmlsZSBzdGF0dXMgZmxhZ3MuICAqLworI2RlZmluZSBGX1NFVEZMCQk0CS8qIFNldCBmaWxlIHN0YXR1cyBmbGFncy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgRl9HRVRMSwk1CS8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEsJNgkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4gICovCisjIGRlZmluZSBGX1NFVExLVwk3CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuCSovCisvKiBOb3QgbmVjZXNzYXJ5LCB3ZSBhbHdheXMgaGF2ZSA2NC1iaXQgb2Zmc2V0cy4gICovCisjIGRlZmluZSBGX0dFVExLNjQJNQkvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4gICovCisjIGRlZmluZSBGX1NFVExLNjQJNgkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4gICovCisjIGRlZmluZSBGX1NFVExLVzY0CTcJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKGJsb2NraW5nKS4JKi8KKyNlbHNlCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjICBkZWZpbmUgRl9HRVRMSwk1CS8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLiAgKi8KKyMgIGRlZmluZSBGX1NFVExLCTYJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuICAqLworIyAgZGVmaW5lIEZfU0VUTEtXCTcJLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKGJsb2NraW5nKS4JKi8KKyMgZWxzZQorIyAgZGVmaW5lIEZfR0VUTEsJRl9HRVRMSzY0ICAvKiBHZXQgcmVjb3JkIGxvY2tpbmcgaW5mby4JKi8KKyMgIGRlZmluZSBGX1NFVExLCUZfU0VUTEs2NCAgLyogU2V0IHJlY29yZCBsb2NraW5nIGluZm8gKG5vbi1ibG9ja2luZykuKi8KKyMgIGRlZmluZSBGX1NFVExLVwlGX1NFVExLVzY0IC8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuICAqLworIyBlbmRpZgorIyBkZWZpbmUgRl9HRVRMSzY0CTEyCS8qIEdldCByZWNvcmQgbG9ja2luZyBpbmZvLiAgKi8KKyMgZGVmaW5lIEZfU0VUTEs2NAkxMwkvKiBTZXQgcmVjb3JkIGxvY2tpbmcgaW5mbyAobm9uLWJsb2NraW5nKS4gICovCisjIGRlZmluZSBGX1NFVExLVzY0CTE0CS8qIFNldCByZWNvcmQgbG9ja2luZyBpbmZvIChibG9ja2luZykuCSovCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisjIGRlZmluZSBGX1NFVE9XTgk4CS8qIEdldCBvd25lciBvZiBzb2NrZXQgKHJlY2VpdmVyIG9mIFNJR0lPKS4gICovCisjIGRlZmluZSBGX0dFVE9XTgk5CS8qIFNldCBvd25lciBvZiBzb2NrZXQgKHJlY2VpdmVyIG9mIFNJR0lPKS4gICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgRl9TRVRTSUcJMTAJLyogU2V0IG51bWJlciBvZiBzaWduYWwgdG8gYmUgc2VudC4gICovCisjIGRlZmluZSBGX0dFVFNJRwkxMQkvKiBHZXQgbnVtYmVyIG9mIHNpZ25hbCB0byBiZSBzZW50LiAgKi8KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBGX1NFVExFQVNFCTEwMjQJLyogU2V0IGEgbGVhc2UuCSAqLworIyBkZWZpbmUgRl9HRVRMRUFTRQkxMDI1CS8qIEVucXVpcmUgd2hhdCBsZWFzZSBpcyBhY3RpdmUuICAqLworIyBkZWZpbmUgRl9OT1RJRlkJMTAyNgkvKiBSZXF1ZXN0IG5vdGZpY2F0aW9ucyBvbiBhIGRpcmVjdG9yeS4JICovCisjIGRlZmluZSBGX0RVUEZEX0NMT0VYRUMgMTAzMAkvKiBEdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9yIHdpdGgKKwkJCQkgICBjbG9zZS1vbi1leGl0IHNldC4gICovCisjZW5kaWYKKworLyogRm9yIEZfW0dFVHxTRVRdRkQuICAqLworI2RlZmluZSBGRF9DTE9FWEVDCTEJLyogYWN0dWFsbHkgYW55dGhpbmcgd2l0aCBsb3cgYml0IHNldCBnb2VzICovCisKKy8qIEZvciBwb3NpeCBmY250bCgpIGFuZCBgbF90eXBlJyBmaWVsZCBvZiBhIGBzdHJ1Y3QgZmxvY2snIGZvciBsb2NrZigpLiAgKi8KKyNkZWZpbmUgRl9SRExDSwkJMAkvKiBSZWFkIGxvY2suICAqLworI2RlZmluZSBGX1dSTENLCQkxCS8qIFdyaXRlIGxvY2suCSovCisjZGVmaW5lIEZfVU5MQ0sJCTIJLyogUmVtb3ZlIGxvY2suCSAqLworCisvKiBGb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jaygpLiAgKi8KKyNkZWZpbmUgRl9FWExDSwkJNAkvKiBvciAzICovCisjZGVmaW5lIEZfU0hMQ0sJCTgJLyogb3IgNCAqLworCisjaWZkZWYgX19VU0VfQlNECisvKiBPcGVyYXRpb25zIGZvciBic2QgZmxvY2soKSwgYWxzbyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW1wbGVtZW50YXRpb24uCSovCisjIGRlZmluZSBMT0NLX1NICTEJLyogc2hhcmVkIGxvY2sgKi8KKyMgZGVmaW5lIExPQ0tfRVgJMgkvKiBleGNsdXNpdmUgbG9jayAqLworIyBkZWZpbmUgTE9DS19OQgk0CS8qIG9yJ2Qgd2l0aCBvbmUgb2YgdGhlIGFib3ZlIHRvIHByZXZlbnQKKwkJCQkgICBibG9ja2luZyAqLworIyBkZWZpbmUgTE9DS19VTgk4CS8qIHJlbW92ZSBsb2NrICovCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTE9DS19NQU5ECTMyCS8qIFRoaXMgaXMgYSBtYW5kYXRvcnkgZmxvY2s6CSovCisjIGRlZmluZSBMT0NLX1JFQUQJNjQJLyogLi4uIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucy4JICovCisjIGRlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAuLi4gd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucy4gICovCisjIGRlZmluZSBMT0NLX1JXCTE5MgkvKiAuLi4gV2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgcmVhZCAmIHdyaXRlIG9wZXJhdGlvbnMuCSAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFR5cGVzIG9mIGRpcmVjdG9yeSBub3RpZmljYXRpb25zIHRoYXQgbWF5IGJlIHJlcXVlc3RlZCB3aXRoIEZfTk9USUZZLiAgKi8KKyMgZGVmaW5lIEROX0FDQ0VTUwkweDAwMDAwMDAxCS8qIEZpbGUgYWNjZXNzZWQuICAqLworIyBkZWZpbmUgRE5fTU9ESUZZCTB4MDAwMDAwMDIJLyogRmlsZSBtb2RpZmllZC4gICovCisjIGRlZmluZSBETl9DUkVBVEUJMHgwMDAwMDAwNAkvKiBGaWxlIGNyZWF0ZWQuICAqLworIyBkZWZpbmUgRE5fREVMRVRFCTB4MDAwMDAwMDgJLyogRmlsZSByZW1vdmVkLiAgKi8KKyMgZGVmaW5lIEROX1JFTkFNRQkweDAwMDAwMDEwCS8qIEZpbGUgcmVuYW1lZC4gICovCisjIGRlZmluZSBETl9BVFRSSUIJMHgwMDAwMDAyMAkvKiBGaWxlIGNoYW5nZWQgYXR0aWJ1dGVzLiAgKi8KKyMgZGVmaW5lIEROX01VTFRJU0hPVAkweDgwMDAwMDAwCS8qIERvbid0IHJlbW92ZSBub3RpZmllci4gICovCisjZW5kaWYKKworc3RydWN0IGZsb2NrCisgIHsKKyAgICBzaG9ydCBpbnQgbF90eXBlOwkvKiBUeXBlIG9mIGxvY2s6IEZfUkRMQ0ssIEZfV1JMQ0ssIG9yIEZfVU5MQ0suCSovCisgICAgc2hvcnQgaW50IGxfd2hlbmNlOwkvKiBXaGVyZSBgbF9zdGFydCcgaXMgcmVsYXRpdmUgdG8gKGxpa2UgYGxzZWVrJykuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19vZmZfdCBsX3N0YXJ0OwkvKiBPZmZzZXQgd2hlcmUgdGhlIGxvY2sgYmVnaW5zLiAgKi8KKyAgICBfX29mZl90IGxfbGVuOwkvKiBTaXplIG9mIHRoZSBsb2NrZWQgYXJlYTsgemVybyBtZWFucyB1bnRpbCBFT0YuICAqLworI2Vsc2UKKyAgICBfX29mZjY0X3QgbF9zdGFydDsJLyogT2Zmc2V0IHdoZXJlIHRoZSBsb2NrIGJlZ2lucy4gICovCisgICAgX19vZmY2NF90IGxfbGVuOwkvKiBTaXplIG9mIHRoZSBsb2NrZWQgYXJlYTsgemVybyBtZWFucyB1bnRpbCBFT0YuICAqLworI2VuZGlmCisgICAgX19waWRfdCBsX3BpZDsJLyogUHJvY2VzcyBob2xkaW5nIHRoZSBsb2NrLiAgKi8KKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3QgZmxvY2s2NAorICB7CisgICAgc2hvcnQgaW50IGxfdHlwZTsJLyogVHlwZSBvZiBsb2NrOiBGX1JETENLLCBGX1dSTENLLCBvciBGX1VOTENLLgkqLworICAgIHNob3J0IGludCBsX3doZW5jZTsJLyogV2hlcmUgYGxfc3RhcnQnIGlzIHJlbGF0aXZlIHRvIChsaWtlIGBsc2VlaycpLiAgKi8KKyAgICBfX29mZjY0X3QgbF9zdGFydDsJLyogT2Zmc2V0IHdoZXJlIHRoZSBsb2NrIGJlZ2lucy4gICovCisgICAgX19vZmY2NF90IGxfbGVuOwkvKiBTaXplIG9mIHRoZSBsb2NrZWQgYXJlYTsgemVybyBtZWFucyB1bnRpbCBFT0YuICAqLworICAgIF9fcGlkX3QgbF9waWQ7CS8qIFByb2Nlc3MgaG9sZGluZyB0aGUgbG9jay4gICovCisgIH07CisjZW5kaWYKKworLyogRGVmaW5lIHNvbWUgbW9yZSBjb21wYXRpYmlsaXR5IG1hY3JvcyB0byBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGgKKyAgIEJTRCBzeXN0ZW1zIHdoaWNoIGRpZCBub3QgbWFuYWdlZCB0byBoaWRlIHRoZXNlIGtlcm5lbCBtYWNyb3MuICAqLworI2lmZGVmCV9fVVNFX0JTRAorIyBkZWZpbmUgRkFQUEVORAlPX0FQUEVORAorIyBkZWZpbmUgRkZTWU5DCQlPX0ZTWU5DCisjIGRlZmluZSBGQVNZTkMJCU9fQVNZTkMKKyMgZGVmaW5lIEZOT05CTE9DSwlPX05PTkJMT0NLCisjIGRlZmluZSBGTkRFTEFZCU9fTkRFTEFZCisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIEFkdmlzZSB0byBgcG9zaXhfZmFkdmlzZScuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIFBPU0lYX0ZBRFZfTk9STUFMCTAgLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBQT1NJWF9GQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfU0VRVUVOVElBTAkyIC8qIEV4cGVjdCBzZXF1ZW50aWFsIHBhZ2UgcmVmZXJlbmNlcy4JICovCisjIGRlZmluZSBQT1NJWF9GQURWX1dJTExORUVECTMgLyogV2lsbCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIFBPU0lYX0ZBRFZfTk9SRVVTRQk1IC8qIERhdGEgd2lsbCBiZSBhY2Nlc3NlZCBvbmNlLiAgKi8KKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEZsYWdzIGZvciBTWU5DX0ZJTEVfUkFOR0UuICAqLworIyBkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFCTEgLyogV2FpdCB1cG9uIHdyaXRlb3V0IG9mIGFsbCBwYWdlcworCQkJCQkgICAgIGluIHRoZSByYW5nZSBiZWZvcmUgcGVyZm9ybWluZyB0aGUKKwkJCQkJICAgICB3cml0ZS4gICovCisjIGRlZmluZSBTWU5DX0ZJTEVfUkFOR0VfV1JJVEUJCTIgLyogSW5pdGlhdGUgd3JpdGVvdXQgb2YgYWxsIHRob3NlCisJCQkJCSAgICAgZGlydHkgcGFnZXMgaW4gdGhlIHJhbmdlIHdoaWNoIGFyZQorCQkJCQkgICAgIG5vdCBwcmVzZW50bHkgdW5kZXIgd3JpdGViYWNrLiAgKi8KKyMgZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSCTQgLyogV2FpdCB1cG9uIHdyaXRlb3V0IG9mIGFsbCBwYWdlcyBpbgorCQkJCQkgICAgIHRoZSByYW5nZSBhZnRlciBwZXJmb3JtaW5nIHRoZQorCQkJCQkgICAgIHdyaXRlLiAgKi8KKworLyogRmxhZ3MgZm9yIFNQTElDRSBhbmQgVk1TUExJQ0UuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTU9WRQkJMQkvKiBNb3ZlIHBhZ2VzIGluc3RlYWQgb2YgY29weWluZy4gICovCisjIGRlZmluZSBTUExJQ0VfRl9OT05CTE9DSwkyCS8qIERvbid0IGJsb2NrIG9uIHRoZSBwaXBlIHNwbGljaW5nCisJCQkJCSAgIChidXQgd2UgbWF5IHN0aWxsIGJsb2NrIG9uIHRoZSBmZAorCQkJCQkgICB3ZSBzcGxpY2UgZnJvbS90bykuICAqLworIyBkZWZpbmUgU1BMSUNFX0ZfTU9SRQkJNAkvKiBFeHBlY3QgbW9yZSBkYXRhLiAgKi8KKyMgZGVmaW5lIFNQTElDRV9GX0dJRlQJCTgJLyogUGFnZXMgcGFzc2VkIGluIGFyZSBhIGdpZnQuICAqLworI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX0dOVQorCisvKiBQcm92aWRlIGtlcm5lbCBoaW50IHRvIHJlYWQgYWhlYWQuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZGFoZWFkIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBzaXplX3QgX19jb3VudCkKKyAgICBfX1RIUk9XOworCisKKy8qIFNlbGVjdGl2ZSBmaWxlIGNvbnRlbnQgc3luY2gnaW5nLiAgKi8KK2V4dGVybiBpbnQgc3luY19maWxlX3JhbmdlIChpbnQgX19mZCwgX19vZmY2NF90IF9fZnJvbSwgX19vZmY2NF90IF9fdG8sCisJCQkgICAgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisKKy8qIFNwbGljZSBhZGRyZXNzIHJhbmdlIGludG8gYSBwaXBlLiAgKi8KK2V4dGVybiBzc2l6ZV90IHZtc3BsaWNlIChpbnQgX19mZG91dCwgY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdiwKKwkJCSBzaXplX3QgX19jb3VudCwgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworCisvKiBTcGxpY2UgdHdvIGZpbGVzIHRvZ2V0aGVyLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNwbGljZSAoaW50IF9fZmRpbiwgX19vZmY2NF90ICpfX29mZmluLCBpbnQgX19mZG91dCwKKwkJICAgICAgIF9fb2ZmNjRfdCAqX19vZmZvdXQsIHNpemVfdCBfX2xlbiwKKwkJICAgICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworLyogSW4ta2VybmVsIGltcGxlbWVudGF0aW9uIG9mIHRlZSBmb3IgcGlwZSBidWZmZXJzLiAgKi8KK2V4dGVybiBzc2l6ZV90IHRlZSAoaW50IF9fZmRpbiwgaW50IF9fZmRvdXQsIHNpemVfdCBfX2xlbiwKKwkJICAgIHVuc2lnbmVkIGludCBfX2ZsYWdzKTsKKworI2VuZGlmCisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmNudGwyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmNudGwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlODU4NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9mY250bDIuaApAQCAtMCwwICsxLDE3MyBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBmY250bCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvZmNudGwyLmg+IGRpcmVjdGx5OyB1c2UgPGZjbnRsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIENoZWNrIHRoYXQgY2FsbHMgdG8gb3BlbiBhbmQgb3BlbmF0IHdpdGggT19DUkVBVCBzZXQgaGF2ZSBhbgorICAgYXBwcm9wcmlhdGUgdGhpcmQvZm91cnRoIHBhcmFtZXRlci4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgX19vcGVuXzIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZykgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5fYWxpYXMsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLiksCisJCSAgICAgICBvcGVuKSBfX25vbm51bGwgKCgxKSk7CisjZWxzZQorZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5fMiwgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZyksCisJCSAgICAgICBfX29wZW42NF8yKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKF9fb3Blbl9hbGlhcywgKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKSwKKwkJICAgICAgIG9wZW42NCkgX19ub25udWxsICgoMSkpOworI2VuZGlmCitfX2Vycm9yZGVjbCAoX19vcGVuX3Rvb19tYW55X2FyZ3MsCisJICAgICAib3BlbiBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDIgb3IgMyBhcmd1bWVudHMsIG5vdCBtb3JlIik7CitfX2Vycm9yZGVjbCAoX19vcGVuX21pc3NpbmdfbW9kZSwKKwkgICAgICJvcGVuIHdpdGggT19DUkVBVCBpbiBzZWNvbmQgYXJndW1lbnQgbmVlZHMgMyBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK29wZW4gKF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPiAxKQorICAgIF9fb3Blbl90b29fbWFueV9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisJeworCSAgX19vcGVuX21pc3NpbmdfbW9kZSAoKTsKKwkgIHJldHVybiBfX29wZW5fMiAoX19wYXRoLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19vcGVuX2FsaWFzIChfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorICAgIHJldHVybiBfX29wZW5fMiAoX19wYXRoLCBfX29mbGFnKTsKKworICByZXR1cm4gX19vcGVuX2FsaWFzIChfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBfX29wZW42NF8yIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuNjRfYWxpYXMsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsCisJCQkJCS4uLiksIG9wZW42NCkgX19ub25udWxsICgoMSkpOworX19lcnJvcmRlY2wgKF9fb3BlbjY0X3Rvb19tYW55X2FyZ3MsCisJICAgICAib3BlbjY0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIHdpdGggMiBvciAzIGFyZ3VtZW50cywgbm90IG1vcmUiKTsKK19fZXJyb3JkZWNsIChfX29wZW42NF9taXNzaW5nX21vZGUsCisJICAgICAib3BlbjY0IHdpdGggT19DUkVBVCBpbiBzZWNvbmQgYXJndW1lbnQgbmVlZHMgMyBhcmd1bWVudHMiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK29wZW42NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX29mbGFnLCAuLi4pCit7CisgIGlmIChfX3ZhX2FyZ19wYWNrX2xlbiAoKSA+IDEpCisgICAgX19vcGVuNjRfdG9vX21hbnlfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorCXsKKwkgIF9fb3BlbjY0X21pc3NpbmdfbW9kZSAoKTsKKwkgIHJldHVybiBfX29wZW42NF8yIChfX3BhdGgsIF9fb2ZsYWcpOworCX0KKyAgICAgIHJldHVybiBfX29wZW42NF9hbGlhcyAoX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKyAgICByZXR1cm4gX19vcGVuNjRfMiAoX19wYXRoLCBfX29mbGFnKTsKKworICByZXR1cm4gX19vcGVuNjRfYWxpYXMgKF9fcGF0aCwgX19vZmxhZywgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfQVRGSUxFCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IF9fb3BlbmF0XzIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19vcGVuYXRfYWxpYXMsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCQkJCWludCBfX29mbGFnLCAuLi4pLCBvcGVuYXQpCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyMgZWxzZQorZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5hdF8yLCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkJCSAgICBpbnQgX19vZmxhZyksIF9fb3BlbmF0NjRfMikKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5hdF9hbGlhcywgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJCQkJaW50IF9fb2ZsYWcsIC4uLiksIG9wZW5hdDY0KQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVuZGlmCitfX2Vycm9yZGVjbCAoX19vcGVuYXRfdG9vX21hbnlfYXJncywKKwkgICAgICJvcGVuYXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCAzIG9yIDQgYXJndW1lbnRzLCBub3QgbW9yZSIpOworX19lcnJvcmRlY2wgKF9fb3BlbmF0X21pc3NpbmdfbW9kZSwKKwkgICAgICJvcGVuYXQgd2l0aCBPX0NSRUFUIGluIHRoaXJkIGFyZ3VtZW50IG5lZWRzIDQgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitvcGVuYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpID4gMSkKKyAgICBfX29wZW5hdF90b29fbWFueV9hcmdzICgpOworCisgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19vZmxhZykpCisgICAgeworICAgICAgaWYgKChfX29mbGFnICYgT19DUkVBVCkgIT0gMCAmJiBfX3ZhX2FyZ19wYWNrX2xlbiAoKSA8IDEpCisJeworCSAgX19vcGVuYXRfbWlzc2luZ19tb2RlICgpOworCSAgcmV0dXJuIF9fb3BlbmF0XzIgKF9fZmQsIF9fcGF0aCwgX19vZmxhZyk7CisJfQorICAgICAgcmV0dXJuIF9fb3BlbmF0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorICAgIHJldHVybiBfX29wZW5hdF8yIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX29wZW5hdF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKworCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IF9fb3BlbmF0NjRfMiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZykKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX29wZW5hdDY0X2FsaWFzLCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLAorCQkJCQkgIGludCBfX29mbGFnLCAuLi4pLCBvcGVuYXQ2NCkKKyAgICAgX19ub25udWxsICgoMikpOworX19lcnJvcmRlY2wgKF9fb3BlbmF0NjRfdG9vX21hbnlfYXJncywKKwkgICAgICJvcGVuYXQ2NCBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDMgb3IgNCBhcmd1bWVudHMsIG5vdCBtb3JlIik7CitfX2Vycm9yZGVjbCAoX19vcGVuYXQ2NF9taXNzaW5nX21vZGUsCisJICAgICAib3BlbmF0NjQgd2l0aCBPX0NSRUFUIGluIHRoaXJkIGFyZ3VtZW50IG5lZWRzIDQgYXJndW1lbnRzIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitvcGVuYXQ2NCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBpbnQgX19vZmxhZywgLi4uKQoreworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPiAxKQorICAgIF9fb3BlbmF0NjRfdG9vX21hbnlfYXJncyAoKTsKKworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fb2ZsYWcpKQorICAgIHsKKyAgICAgIGlmICgoX19vZmxhZyAmIE9fQ1JFQVQpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgPCAxKQorCXsKKwkgIF9fb3BlbmF0NjRfbWlzc2luZ19tb2RlICgpOworCSAgcmV0dXJuIF9fb3BlbmF0NjRfMiAoX19mZCwgX19wYXRoLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19vcGVuYXQ2NF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgICB9CisKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpIDwgMSkKKyAgICByZXR1cm4gX19vcGVuYXQ2NF8yIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcpOworCisgIHJldHVybiBfX29wZW5hdDY0X2FsaWFzIChfX2ZkLCBfX3BhdGgsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmVudi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg1OWYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2ZlbnYuaApAQCAtMCwwICsxLDk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9GRU5WX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9mZW52Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxmZW52Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworLyogRGVmaW5lIGJpdHMgcmVwcmVzZW50aW5nIHRoZSBleGNlcHRpb24uICBXZSB1c2UgdGhlIGJpdCBwb3NpdGlvbnMKKyAgIG9mIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGluIHRoZSBGUFUgY29udHJvbCB3b3JkLiAgKi8KK2VudW0KKyAgeworICAgIEZFX0lOVkFMSUQgPSAweDAxLAorI2RlZmluZSBGRV9JTlZBTElECUZFX0lOVkFMSUQKKyAgICBfX0ZFX0RFTk9STSA9IDB4MDIsCisgICAgRkVfRElWQllaRVJPID0gMHgwNCwKKyNkZWZpbmUgRkVfRElWQllaRVJPCUZFX0RJVkJZWkVSTworICAgIEZFX09WRVJGTE9XID0gMHgwOCwKKyNkZWZpbmUgRkVfT1ZFUkZMT1cJRkVfT1ZFUkZMT1cKKyAgICBGRV9VTkRFUkZMT1cgPSAweDEwLAorI2RlZmluZSBGRV9VTkRFUkZMT1cJRkVfVU5ERVJGTE9XCisgICAgRkVfSU5FWEFDVCA9IDB4MjAKKyNkZWZpbmUgRkVfSU5FWEFDVAlGRV9JTkVYQUNUCisgIH07CisKKyNkZWZpbmUgRkVfQUxMX0VYQ0VQVCBcCisJKEZFX0lORVhBQ1QgfCBGRV9ESVZCWVpFUk8gfCBGRV9VTkRFUkZMT1cgfCBGRV9PVkVSRkxPVyB8IEZFX0lOVkFMSUQpCisKKy8qIFRoZSBpeDg3IEZQVSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvdXIgZGVmaW5lZCByb3VuZGluZyBtb2Rlcy4gIFdlCisgICB1c2UgYWdhaW4gdGhlIGJpdCBwb3NpdGlvbnMgaW4gdGhlIEZQVSBjb250cm9sIHdvcmQgYXMgdGhlIHZhbHVlcworICAgZm9yIHRoZSBhcHByb3ByaWF0ZSBtYWNyb3MuICAqLworZW51bQorICB7CisgICAgRkVfVE9ORUFSRVNUID0gMCwKKyNkZWZpbmUgRkVfVE9ORUFSRVNUCUZFX1RPTkVBUkVTVAorICAgIEZFX0RPV05XQVJEID0gMHg0MDAsCisjZGVmaW5lIEZFX0RPV05XQVJECUZFX0RPV05XQVJECisgICAgRkVfVVBXQVJEID0gMHg4MDAsCisjZGVmaW5lIEZFX1VQV0FSRAlGRV9VUFdBUkQKKyAgICBGRV9UT1dBUkRaRVJPID0gMHhjMDAKKyNkZWZpbmUgRkVfVE9XQVJEWkVSTwlGRV9UT1dBUkRaRVJPCisgIH07CisKKworLyogVHlwZSByZXByZXNlbnRpbmcgZXhjZXB0aW9uIGZsYWdzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGZleGNlcHRfdDsKKworCisvKiBUeXBlIHJlcHJlc2VudGluZyBmbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudC4gIFRoaXMgc3RydWN0dXJlCisgICBjb3JyZXNwb25kcyB0byB0aGUgbGF5b3V0IG9mIHRoZSBibG9jayB3cml0dGVuIGJ5IHRoZSBgZnN0ZW52JworICAgaW5zdHJ1Y3Rpb24gYW5kIGhhcyBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBNWENTUgorICAgcmVnaXN0ZXIgYXMgd3JpdHRlbiBieSB0aGUgYHN0bXhjc3InIGluc3RydWN0aW9uLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jb250cm9sX3dvcmQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdW51c2VkMTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19zdGF0dXNfd29yZDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX191bnVzZWQyOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3RhZ3M7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdW51c2VkMzsKKyAgICB1bnNpZ25lZCBpbnQgX19laXA7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fY3Nfc2VsZWN0b3I7CisgICAgdW5zaWduZWQgaW50IF9fb3Bjb2RlOjExOworICAgIHVuc2lnbmVkIGludCBfX3VudXNlZDQ6NTsKKyAgICB1bnNpZ25lZCBpbnQgX19kYXRhX29mZnNldDsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19kYXRhX3NlbGVjdG9yOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VudXNlZDU7CisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIHVuc2lnbmVkIGludCBfX214Y3NyOworI2VuZGlmCisgIH0KK2ZlbnZfdDsKKworLyogSWYgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgdXNlZCB3ZSB1c2UgdGhpcyB2YWx1ZS4gICovCisjZGVmaW5lIEZFX0RGTF9FTlYJKChfX2NvbnN0IGZlbnZfdCAqKSAtMSkKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgd2hlcmUgbm9uZSBvZiB0aGUgZXhjZXB0aW9uIGlzIG1hc2tlZC4gICovCisjIGRlZmluZSBGRV9OT01BU0tfRU5WCSgoX19jb25zdCBmZW52X3QgKikgLTIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9mZW52aW5saW5lLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmVudmlubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjc3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvZmVudmlubGluZS5oCkBAIC0wLDAgKzEsOCBAQAorLyogVGhpcyBmaWxlIHByb3ZpZGVzIGlubGluZSB2ZXJzaW9ucyBvZiBmbG9hdGluZy1waW50IGVudmlyb25tZW50CisgICBoYW5kbGluZyBmdW5jdGlvbnMuICBJZiB0aGVyZSB3ZXJlIGFueS4gICovCisKKyNpZm5kZWYgX19OT19NQVRIX0lOTElORVMKKworLyogSGVyZSBpcyB3aGVyZSB0aGUgY29kZSB3b3VsZCBnby4gICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2h1Z2VfdmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaHVnZV92YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNhMTFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2h1Z2VfdmFsLmgKQEAgLTAsMCArMSw1NSBAQAorLyogYEhVR0VfVkFMJyBjb25zdGFudCBmb3IgSUVFRSA3NTQgbWFjaGluZXMgKHdoZXJlIGl0IGlzIGluZmluaXR5KS4KKyAgIFVzZWQgYnkgPHN0ZGxpYi5oPiBhbmQgPG1hdGguaD4gZnVuY3Rpb25zIGZvciBvdmVyZmxvdy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSwgMjAwMCwgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2h1Z2VfdmFsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIElFRUUgcG9zaXRpdmUgaW5maW5pdHkgKC1IVUdFX1ZBTCBpcyBuZWdhdGl2ZSBpbmZpbml0eSkuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBIVUdFX1ZBTAkoX19idWlsdGluX2h1Z2VfdmFsKCkpCisjZWxpZiBfX0dOVUNfUFJFUkVRKDIsOTYpCisjIGRlZmluZSBIVUdFX1ZBTAkoX19leHRlbnNpb25fXyAweDEuMHAyMDQ3KQorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworCisjIGRlZmluZSBIVUdFX1ZBTCBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICgodW5pb24geyB1bnNpZ25lZCBfX2wgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOyBkb3VibGUgX19kOyB9KSAgIFwKKyAgICB7IF9fbDogMHg3ZmYwMDAwMDAwMDAwMDAwVUxMIH0pLl9fZCkKKworI2Vsc2UgLyogbm90IEdDQyAqLworCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBfX2NbOF07IGRvdWJsZSBfX2Q7IH0gX19odWdlX3ZhbF90OworCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMX2J5dGVzCXsgMHg3ZiwgMHhmMCwgMCwgMCwgMCwgMCwgMCwgMCB9CisjIGVuZGlmCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMX2J5dGVzCXsgMCwgMCwgMCwgMCwgMCwgMCwgMHhmMCwgMHg3ZiB9CisjIGVuZGlmCisKK3N0YXRpYyBfX2h1Z2VfdmFsX3QgX19odWdlX3ZhbCA9IHsgX19IVUdFX1ZBTF9ieXRlcyB9OworIyBkZWZpbmUgSFVHRV9WQUwJKF9faHVnZV92YWwuX19kKQorCisjZW5kaWYJLyogR0NDLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9odWdlX3ZhbGYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9odWdlX3ZhbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg1MzQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2h1Z2VfdmFsZi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGBIVUdFX1ZBTEYnIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcyAod2hlcmUgaXQgaXMgaW5maW5pdHkpLgorICAgVXNlZCBieSA8c3RkbGliLmg+IGFuZCA8bWF0aC5oPiBmdW5jdGlvbnMgZm9yIG92ZXJmbG93LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwLCAyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaHVnZV92YWxmLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIElFRUUgcG9zaXRpdmUgaW5maW5pdHkgKC1IVUdFX1ZBTCBpcyBuZWdhdGl2ZSBpbmZpbml0eSkuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBIVUdFX1ZBTEYJKF9fYnVpbHRpbl9odWdlX3ZhbGYoKSkKKyNlbGlmIF9fR05VQ19QUkVSRVEoMiw5NikKKyMgZGVmaW5lIEhVR0VfVkFMRgkoX19leHRlbnNpb25fXyAweDEuMHAyNTVmKQorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworCisjICAgZGVmaW5lIEhVR0VfVkFMRiBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICgodW5pb24geyB1bnNpZ25lZCBfX2wgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19TSV9fKSkpOyBmbG9hdCBfX2Q7IH0pICAgIFwKKyAgICB7IF9fbDogMHg3ZjgwMDAwMFVMIH0pLl9fZCkKKworI2Vsc2UgLyogbm90IEdDQyAqLworCit0eXBlZGVmIHVuaW9uIHsgdW5zaWduZWQgY2hhciBfX2NbNF07IGZsb2F0IF9fZjsgfSBfX2h1Z2VfdmFsZl90OworCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfX0hVR0VfVkFMRl9ieXRlcwl7IDB4N2YsIDB4ODAsIDAsIDAgfQorIyBlbmRpZgorIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19IVUdFX1ZBTEZfYnl0ZXMJeyAwLCAwLCAweDgwLCAweDdmIH0KKyMgZW5kaWYKKworc3RhdGljIF9faHVnZV92YWxmX3QgX19odWdlX3ZhbGYgPSB7IF9fSFVHRV9WQUxGX2J5dGVzIH07CisjIGRlZmluZSBIVUdFX1ZBTEYJKF9faHVnZV92YWxmLl9fZikKKworI2VuZGlmCS8qIEdDQy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaHVnZV92YWxsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaHVnZV92YWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlOGUyMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9odWdlX3ZhbGwuaApAQCAtMCwwICsxLDI5IEBACisvKiBEZWZhdWx0IGBIVUdFX1ZBTEwnIGNvbnN0YW50LgorICAgVXNlZCBieSA8c3RkbGliLmg+IGFuZCA8bWF0aC5oPiBmdW5jdGlvbnMgZm9yIG92ZXJmbG93LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2LCAxOTk3LCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NQVRIX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9odWdlX3ZhbGwuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorIyBkZWZpbmUgSFVHRV9WQUxMCShfX2J1aWx0aW5faHVnZV92YWxsKCkpCisjZWxzZQorIyBkZWZpbmUgSFVHRV9WQUxMCSgobG9uZyBkb3VibGUpIEhVR0VfVkFMKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODBhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW4uaApAQCAtMCwwICsxLDE3MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTksIDIwMDAsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIExpbnV4IHZlcnNpb24uICAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lOX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBPcHRpb25zIGZvciB1c2Ugd2l0aCBgZ2V0c29ja29wdCcgYW5kIGBzZXRzb2Nrb3B0JyBhdCB0aGUgSVAgbGV2ZWwuCisgICBUaGUgZmlyc3Qgd29yZCBpbiB0aGUgY29tbWVudCBhdCB0aGUgcmlnaHQgaXMgdGhlIGRhdGEgdHlwZSB1c2VkOworICAgImJvb2wiIG1lYW5zIGEgYm9vbGVhbiB2YWx1ZSBzdG9yZWQgaW4gYW4gYGludCcuICAqLworI2RlZmluZSAgICAgICAgSVBfT1BUSU9OUyAgICAgIDQgICAgICAgLyogaXBfb3B0czsgSVAgcGVyLXBhY2tldCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgICAgICAgIElQX0hEUklOQ0wgICAgICAzICAgICAgIC8qIGludDsgSGVhZGVyIGlzIGluY2x1ZGVkIHdpdGggZGF0YS4gICovCisjZGVmaW5lICAgICAgICBJUF9UT1MgICAgICAgICAgMSAgICAgICAvKiBpbnQ7IElQIHR5cGUgb2Ygc2VydmljZSBhbmQgcHJlY2VkZW5jZS4gICovCisjZGVmaW5lICAgICAgICBJUF9UVEwgICAgICAgICAgMiAgICAgICAvKiBpbnQ7IElQIHRpbWUgdG8gbGl2ZS4gICovCisjZGVmaW5lICAgICAgICBJUF9SRUNWT1BUUyAgICAgNiAgICAgICAvKiBib29sOyBSZWNlaXZlIGFsbCBJUCBvcHRpb25zIHcvZGF0YWdyYW0uICAqLworLyogRm9yIEJTRCBjb21wYXRpYmlsaXR5LiAgKi8KKyNkZWZpbmUgICAgICAgIElQX1JFQ1ZSRVRPUFRTICBJUF9SRVRPUFRTICAgICAgIC8qIGJvb2w7IFJlY2VpdmUgSVAgb3B0aW9ucyBmb3IgcmVzcG9uc2UuICAqLworI2RlZmluZSAgICAgICAgSVBfUkVUT1BUUyAgICAgIDcgICAgICAgLyogaXBfb3B0czsgU2V0L2dldCBJUCBwZXItcGFja2V0IG9wdGlvbnMuICAqLworI2RlZmluZSBJUF9NVUxUSUNBU1RfSUYgMzIJLyogaW5fYWRkcjsgc2V0L2dldCBJUCBtdWx0aWNhc3QgaS9mICovCisjZGVmaW5lIElQX01VTFRJQ0FTVF9UVEwgMzMJLyogdV9jaGFyOyBzZXQvZ2V0IElQIG11bHRpY2FzdCB0dGwgKi8KKyNkZWZpbmUgSVBfTVVMVElDQVNUX0xPT1AgMzQJLyogaV9jaGFyOyBzZXQvZ2V0IElQIG11bHRpY2FzdCBsb29wYmFjayAqLworI2RlZmluZSBJUF9BRERfTUVNQkVSU0hJUCAzNQkvKiBpcF9tcmVxOyBhZGQgYW4gSVAgZ3JvdXAgbWVtYmVyc2hpcCAqLworI2RlZmluZSBJUF9EUk9QX01FTUJFUlNISVAgMzYJLyogaXBfbXJlcTsgZHJvcCBhbiBJUCBncm91cCBtZW1iZXJzaGlwICovCisjZGVmaW5lIElQX1VOQkxPQ0tfU09VUkNFIDM3CS8qIGlwX21yZXFfc291cmNlOiB1bmJsb2NrIGRhdGEgZnJvbSBzb3VyY2UgKi8KKyNkZWZpbmUgSVBfQkxPQ0tfU09VUkNFIDM4CS8qIGlwX21yZXFfc291cmNlOiBibG9jayBkYXRhIGZyb20gc291cmNlICovCisjZGVmaW5lIElQX0FERF9TT1VSQ0VfTUVNQkVSU0hJUCAzOSAvKiBpcF9tcmVxX3NvdXJjZTogam9pbiBzb3VyY2UgZ3JvdXAgKi8KKyNkZWZpbmUgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCA0MCAvKiBpcF9tcmVxX3NvdXJjZTogbGVhdmUgc291cmNlIGdyb3VwICovCisjZGVmaW5lIElQX01TRklMVEVSIDQxCisjZGVmaW5lIE1DQVNUX0pPSU5fR1JPVVAgNDIJLyogZ3JvdXBfcmVxOiBqb2luIGFueS1zb3VyY2UgZ3JvdXAgKi8KKyNkZWZpbmUgTUNBU1RfQkxPQ0tfU09VUkNFIDQzCS8qIGdyb3VwX3NvdXJjZV9yZXE6IGJsb2NrIGZyb20gZ2l2ZW4gZ3JvdXAgKi8KKyNkZWZpbmUgTUNBU1RfVU5CTE9DS19TT1VSQ0UgNDQJLyogZ3JvdXBfc291cmNlX3JlcTogdW5ibG9jayBmcm9tIGdpdmVuIGdyb3VwKi8KKyNkZWZpbmUgTUNBU1RfTEVBVkVfR1JPVVAgNDUJLyogZ3JvdXBfcmVxOiBsZWF2ZSBhbnktc291cmNlIGdyb3VwICovCisjZGVmaW5lIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQIDQ2IC8qIGdyb3VwX3NvdXJjZV9yZXE6IGpvaW4gc291cmNlLXNwZWMgZ3IgKi8KKyNkZWZpbmUgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQIDQ3IC8qIGdyb3VwX3NvdXJjZV9yZXE6IGxlYXZlIHNvdXJjZS1zcGVjIGdyKi8KKyNkZWZpbmUgTUNBU1RfTVNGSUxURVIgNDgKKworI2RlZmluZSBNQ0FTVF9FWENMVURFICAgMAorI2RlZmluZSBNQ0FTVF9JTkNMVURFICAgMQorCisjZGVmaW5lIElQX1JPVVRFUl9BTEVSVCAgICA1CS8qIGJvb2wgKi8KKyNkZWZpbmUgSVBfUEtUSU5GTyAgICAgICAgIDgJLyogYm9vbCAqLworI2RlZmluZSBJUF9QS1RPUFRJT05TICAgICAgOQorI2RlZmluZSBJUF9QTVRVRElTQyAgICAgICAgMTAJLyogb2Jzb2xldGUgbmFtZT8gKi8KKyNkZWZpbmUgSVBfTVRVX0RJU0NPVkVSICAgIDEwCS8qIGludDsgc2VlIGJlbG93ICovCisjZGVmaW5lIElQX1JFQ1ZFUlIgICAgICAgICAxMQkvKiBib29sICovCisjZGVmaW5lIElQX1JFQ1ZUVEwgICAgICAgICAxMgkvKiBib29sICovCisjZGVmaW5lIElQX1JFQ1ZUT1MgICAgICAgICAxMwkvKiBib29sICovCisKKworLyogSVBfTVRVX0RJU0NPVkVSIGFyZ3VtZW50cy4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPTlQgICAwCS8qIE5ldmVyIHNlbmQgREYgZnJhbWVzLiAgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfV0FOVCAgIDEJLyogVXNlIHBlciByb3V0ZSBoaW50cy4gICovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPICAgICAyCS8qIEFsd2F5cyBERi4gICovCisKKy8qIFRvIHNlbGVjdCB0aGUgSVAgbGV2ZWwuICAqLworI2RlZmluZSBTT0xfSVAJMAorCisjZGVmaW5lIElQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCAgICAgICAgMQorI2RlZmluZSBJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QICAgICAgIDEKKyNkZWZpbmUgSVBfTUFYX01FTUJFUlNISVBTICAgICAgICAgICAgICAyMAorCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBJUCBvcHRpb25zIGZvciBJUF9PUFRJT05TIGFuZCBJUF9SRVRPUFRTLgorICAgVGhlIGBpcF9kc3QnIGZpZWxkIGlzIHVzZWQgZm9yIHRoZSBmaXJzdC1ob3AgZ2F0ZXdheSB3aGVuIHVzaW5nIGEKKyAgIHNvdXJjZSByb3V0ZSAodGhpcyBnZXRzIHB1dCBpbnRvIHRoZSBoZWFkZXIgcHJvcGVyKS4gICovCitzdHJ1Y3QgaXBfb3B0cworICB7CisgICAgc3RydWN0IGluX2FkZHIgaXBfZHN0OwkvKiBGaXJzdCBob3A7IHplcm8gd2l0aG91dCBzb3VyY2Ugcm91dGUuICAqLworICAgIGNoYXIgaXBfb3B0c1s0MF07CQkvKiBBY3R1YWxseSB2YXJpYWJsZSBpbiBzaXplLiAgKi8KKyAgfTsKKworLyogTGlrZSBgc3RydWN0IGlwX21yZXEnIGJ1dCBpbmNsdWRpbmcgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gYnkgaW5kZXguICAqLworc3RydWN0IGlwX21yZXFuCisgIHsKKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOwkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9hZGRyZXNzOwkJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKyAgICBpbnQJaW1yX2lmaW5kZXg7CQkJLyogSW50ZXJmYWNlIGluZGV4ICovCisgIH07CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBJUF9QS1RJTkZPLiAgKi8KK3N0cnVjdCBpbl9wa3RpbmZvCisgIHsKKyAgICBpbnQgaXBpX2lmaW5kZXg7CQkJLyogSW50ZXJmYWNlIGluZGV4ICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGlwaV9zcGVjX2RzdDsJLyogUm91dGluZyBkZXN0aW5hdGlvbiBhZGRyZXNzICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGlwaV9hZGRyOwkJLyogSGVhZGVyIGRlc3RpbmF0aW9uIGFkZHJlc3MgICovCisgIH07CisKKy8qIE9wdGlvbnMgZm9yIHVzZSB3aXRoIGBnZXRzb2Nrb3B0JyBhbmQgYHNldHNvY2tvcHQnIGF0IHRoZSBJUHY2IGxldmVsLgorICAgVGhlIGZpcnN0IHdvcmQgaW4gdGhlIGNvbW1lbnQgYXQgdGhlIHJpZ2h0IGlzIHRoZSBkYXRhIHR5cGUgdXNlZDsKKyAgICJib29sIiBtZWFucyBhIGJvb2xlYW4gdmFsdWUgc3RvcmVkIGluIGFuIGBpbnQnLiAgKi8KKyNkZWZpbmUgSVBWNl9BRERSRk9STQkJMQorI2RlZmluZSBJUFY2XzIyOTJQS1RJTkZPCTIKKyNkZWZpbmUgSVBWNl8yMjkySE9QT1BUUwkzCisjZGVmaW5lIElQVjZfMjI5MkRTVE9QVFMJNAorI2RlZmluZSBJUFY2XzIyOTJSVEhEUgkJNQorI2RlZmluZSBJUFY2XzIyOTJQS1RPUFRJT05TCTYKKyNkZWZpbmUgSVBWNl9DSEVDS1NVTQkJNworI2RlZmluZSBJUFY2XzIyOTJIT1BMSU1JVAk4CisKKyNkZWZpbmUgU0NNX1NSQ1JUCQlJUFY2X1JYU1JDUlQKKworI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKKyNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAorI2RlZmluZSBJUFY2X1VOSUNBU1RfSE9QUwkxNgorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9JRgkxNworI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9IT1BTCTE4CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AJMTkKKyNkZWZpbmUgSVBWNl9KT0lOX0dST1VQCQkyMAorI2RlZmluZSBJUFY2X0xFQVZFX0dST1VQCTIxCisjZGVmaW5lIElQVjZfUk9VVEVSX0FMRVJUCTIyCisjZGVmaW5lIElQVjZfTVRVX0RJU0NPVkVSCTIzCisjZGVmaW5lIElQVjZfTVRVCQkyNAorI2RlZmluZSBJUFY2X1JFQ1ZFUlIJCTI1CisjZGVmaW5lIElQVjZfVjZPTkxZCQkyNgorI2RlZmluZSBJUFY2X0pPSU5fQU5ZQ0FTVAkyNworI2RlZmluZSBJUFY2X0xFQVZFX0FOWUNBU1QJMjgKKyNkZWZpbmUgSVBWNl9JUFNFQ19QT0xJQ1kJMzQKKyNkZWZpbmUgSVBWNl9YRlJNX1BPTElDWQkzNQorCisjZGVmaW5lIElQVjZfUkVDVlBLVElORk8JNDkKKyNkZWZpbmUgSVBWNl9QS1RJTkZPCQk1MAorI2RlZmluZSBJUFY2X1JFQ1ZIT1BMSU1JVAk1MQorI2RlZmluZSBJUFY2X0hPUExJTUlUCQk1MgorI2RlZmluZSBJUFY2X1JFQ1ZIT1BPUFRTCTUzCisjZGVmaW5lIElQVjZfSE9QT1BUUwkJNTQKKyNkZWZpbmUgSVBWNl9SVEhEUkRTVE9QVFMJNTUKKyNkZWZpbmUgSVBWNl9SRUNWUlRIRFIJCTU2CisjZGVmaW5lIElQVjZfUlRIRFIJCTU3CisjZGVmaW5lIElQVjZfUkVDVkRTVE9QVFMJNTgKKyNkZWZpbmUgSVBWNl9EU1RPUFRTCQk1OQorCisjZGVmaW5lIElQVjZfUkVDVlRDTEFTUwkJNjYKKyNkZWZpbmUgSVBWNl9UQ0xBU1MJCTY3CisKKy8qIE9ic29sZXRlIHN5bm9ueW1zIGZvciB0aGUgYWJvdmUuICAqLworI2RlZmluZSBJUFY2X0FERF9NRU1CRVJTSElQCUlQVjZfSk9JTl9HUk9VUAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUAlJUFY2X0xFQVZFX0dST1VQCisjZGVmaW5lIElQVjZfUlhIT1BPUFRTCQlJUFY2X0hPUE9QVFMKKyNkZWZpbmUgSVBWNl9SWERTVE9QVFMJCUlQVjZfRFNUT1BUUworCisvKiBJUFY2X01UVV9ESVNDT1ZFUiB2YWx1ZXMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJMAkvKiBOZXZlciBzZW5kIERGIGZyYW1lcy4gICovCisjZGVmaW5lIElQVjZfUE1UVURJU0NfV0FOVAkxCS8qIFVzZSBwZXIgcm91dGUgaGludHMuICAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPCTIJLyogQWx3YXlzIERGLiAgKi8KKworLyogU29ja2V0IGxldmVsIHZhbHVlcyBmb3IgSVB2Ni4gICovCisjZGVmaW5lIFNPTF9JUFY2ICAgICAgICA0MQorI2RlZmluZSBTT0xfSUNNUFY2ICAgICAgNTgKKworLyogUm91dGluZyBoZWFkZXIgb3B0aW9ucyBmb3IgSVB2Ni4gICovCisjZGVmaW5lIElQVjZfUlRIRFJfTE9PU0UJMAkvKiBIb3AgZG9lc24ndCBuZWVkIHRvIGJlIG5laWdoYm91ci4gKi8KKyNkZWZpbmUgSVBWNl9SVEhEUl9TVFJJQ1QJMQkvKiBIb3AgbXVzdCBiZSBhIG5laWdoYm91ci4gICovCisKKyNkZWZpbmUgSVBWNl9SVEhEUl9UWVBFXzAJMAkvKiBJUHY2IFJvdXRpbmcgaGVhZGVyIHR5cGUgMC4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW5mLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW5mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxOWY3NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9pbmYuaApAQCAtMCwwICsxLDMwIEBACisvKiBgSU5GSU5JVFknIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcy4KKyAgIENvcHlyaWdodCAoQykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTUFUSF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW5mLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIElFRUUgcG9zaXRpdmUgaW5maW5pdHkuICAqLworCisjaWYgX19HTlVDX1BSRVJFUSgzLDMpCisjIGRlZmluZSBJTkZJTklUWQkoX19idWlsdGluX2luZmYoKSkKKyNlbHNlCisjIGRlZmluZSBJTkZJTklUWQlIVUdFX1ZBTEYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2luaXRzcGluLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW5pdHNwaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzZmMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2luaXRzcGluLmgKQEAgLTAsMCArMSBAQAorLyogTm8gdGhyZWFkIHN1cHBvcnQuICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW9jdGwtdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9pb2N0bC10eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTZhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW9jdGwtdHlwZXMuaApAQCAtMCwwICsxLDc4IEBACisvKiBTdHJ1Y3R1cmUgdHlwZXMgZm9yIHByZS10ZXJtaW9zIHRlcm1pbmFsIGlvY3Rscy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JT0NUTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvaW9jdGwtdHlwZXMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9pb2N0bC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiBjb25zdGFudHMgZm9yIHVzZSB3aXRoIGBpb2N0bCcuICAqLworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworCitzdHJ1Y3Qgd2luc2l6ZQorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX3JvdzsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgd3NfY29sOworICAgIHVuc2lnbmVkIHNob3J0IGludCB3c194cGl4ZWw7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHdzX3lwaXhlbDsKKyAgfTsKKworI2RlZmluZSBOQ0MgOAorc3RydWN0IHRlcm1pbworICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisgICAgdW5zaWduZWQgY2hhciBjX2xpbmU7CQkvKiBsaW5lIGRpc2NpcGxpbmUgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGNfY2NbTkNDXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworfTsKKworLyogbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgVElPQ01fTEUJMHgwMDEKKyNkZWZpbmUgVElPQ01fRFRSCTB4MDAyCisjZGVmaW5lIFRJT0NNX1JUUwkweDAwNAorI2RlZmluZSBUSU9DTV9TVAkweDAwOAorI2RlZmluZSBUSU9DTV9TUgkweDAxMAorI2RlZmluZSBUSU9DTV9DVFMJMHgwMjAKKyNkZWZpbmUgVElPQ01fQ0FSCTB4MDQwCisjZGVmaW5lIFRJT0NNX1JORwkweDA4MAorI2RlZmluZSBUSU9DTV9EU1IJMHgxMDAKKyNkZWZpbmUgVElPQ01fQ0QJVElPQ01fQ0FSCisjZGVmaW5lIFRJT0NNX1JJCVRJT0NNX1JORworCisvKiBpb2N0bCAoZmQsIFRJT0NTRVJHRVRMU1IsICZyZXN1bHQpIHdoZXJlIHJlc3VsdCBtYXkgYmUgYXMgYmVsb3cgKi8KKworLyogbGluZSBkaXNjaXBsaW5lcyAqLworI2RlZmluZSBOX1RUWQkJMAorI2RlZmluZSBOX1NMSVAJCTEKKyNkZWZpbmUgTl9NT1VTRQkJMgorI2RlZmluZSBOX1BQUAkJMworI2RlZmluZSBOX1NUUklQCQk0CisjZGVmaW5lIE5fQVgyNQkJNQorI2RlZmluZSBOX1gyNQkJNgkvKiBYLjI1IGFzeW5jICAqLworI2RlZmluZSBOXzZQQUNLCQk3CisjZGVmaW5lIE5fTUFTQwkJOAkvKiBNb2JpdGV4IG1vZHVsZSAgKi8KKyNkZWZpbmUgTl9SMzk2NAkJOQkvKiBTaW1hdGljIFIzOTY0IG1vZHVsZSAgKi8KKyNkZWZpbmUgTl9QUk9GSUJVU19GREwJMTAJLyogUHJvZmlidXMgICovCisjZGVmaW5lIE5fSVJEQQkJMTEJLyogTGludXggSVIgICovCisjZGVmaW5lIE5fU01TQkxPQ0sJMTIJLyogU01TIGJsb2NrIG1vZGUgICovCisjZGVmaW5lIE5fSERMQwkJMTMJLyogc3luY2hyb25vdXMgSERMQyAgKi8KKyNkZWZpbmUgTl9TWU5DX1BQUAkxNAkvKiBzeW5jaHJvbm91cyBQUFAgICovCisjZGVmaW5lCU5fSENJCQkxNQkvKiBCbHVldG9vdGggSENJIFVBUlQgICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW9jdGxzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaW9jdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiYjRjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9pb2N0bHMuaApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSU9DVExfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2lvY3Rscy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL2lvY3RsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFVzZSB0aGUgZGVmaW5pdGlvbnMgZnJvbSB0aGUga2VybmVsIGhlYWRlciBmaWxlcy4gICovCisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKiBSb3V0aW5nIHRhYmxlIGNhbGxzLiAgKi8KKyNkZWZpbmUgU0lPQ0FERFJUCTB4ODkwQgkJLyogYWRkIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0RFTFJUCTB4ODkwQwkJLyogZGVsZXRlIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ1JUTVNHCTB4ODkwRAkJLyogY2FsbCB0byByb3V0aW5nIHN5c3RlbQkqLworCisvKiBTb2NrZXQgY29uZmlndXJhdGlvbiBjb250cm9scy4gKi8KKyNkZWZpbmUgU0lPQ0dJRk5BTUUJMHg4OTEwCQkvKiBnZXQgaWZhY2UgbmFtZQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkxJTksJMHg4OTExCQkvKiBzZXQgaWZhY2UgY2hhbm5lbAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPTkYJMHg4OTEyCQkvKiBnZXQgaWZhY2UgbGlzdAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkZMQUdTCTB4ODkxMwkJLyogZ2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkZMQUdTCTB4ODkxNAkJLyogc2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRkFERFIJMHg4OTE1CQkvKiBnZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ1NJRkFERFIJMHg4OTE2CQkvKiBzZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRkRTVEFERFIJMHg4OTE3CQkvKiBnZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkRTVEFERFIJMHg4OTE4CQkvKiBzZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRkJSREFERFIJMHg4OTE5CQkvKiBnZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSREFERFIJMHg4OTFhCQkvKiBzZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRk5FVE1BU0sJMHg4OTFiCQkvKiBnZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DU0lGTkVUTUFTSwkweDg5MWMJCS8qIHNldCBuZXR3b3JrIFBBIG1hc2sJCSovCisjZGVmaW5lIFNJT0NHSUZNRVRSSUMJMHg4OTFkCQkvKiBnZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk1FVFJJQwkweDg5MWUJCS8qIHNldCBtZXRyaWMJCQkqLworI2RlZmluZSBTSU9DR0lGTUVNCTB4ODkxZgkJLyogZ2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NTSUZNRU0JMHg4OTIwCQkvKiBzZXQgbWVtb3J5IGFkZHJlc3MgKEJTRCkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1UVQkweDg5MjEJCS8qIGdldCBNVFUgc2l6ZQkJCSovCisjZGVmaW5lIFNJT0NTSUZNVFUJMHg4OTIyCQkvKiBzZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTkFNRQkweDg5MjMJCS8qIHNldCBpbnRlcmZhY2UgbmFtZQkJKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQUREUgkweDg5MjQJCS8qIHNldCBoYXJkd2FyZSBhZGRyZXNzIAkqLworI2RlZmluZSBTSU9DR0lGRU5DQVAJMHg4OTI1CQkvKiBnZXQvc2V0IGVuY2Fwc3VsYXRpb25zICAgICAgICovCisjZGVmaW5lIFNJT0NTSUZFTkNBUAkweDg5MjYKKyNkZWZpbmUgU0lPQ0dJRkhXQUREUgkweDg5MjcJCS8qIEdldCBoYXJkd2FyZSBhZGRyZXNzCQkqLworI2RlZmluZSBTSU9DR0lGU0xBVkUJMHg4OTI5CQkvKiBEcml2ZXIgc2xhdmluZyBzdXBwb3J0CSovCisjZGVmaW5lIFNJT0NTSUZTTEFWRQkweDg5MzAKKyNkZWZpbmUgU0lPQ0FERE1VTFRJCTB4ODkzMQkJLyogTXVsdGljYXN0IGFkZHJlc3MgbGlzdHMJKi8KKyNkZWZpbmUgU0lPQ0RFTE1VTFRJCTB4ODkzMgorI2RlZmluZSBTSU9DR0lGSU5ERVgJMHg4OTMzCQkvKiBuYW1lIC0+IGlmX2luZGV4IG1hcHBpbmcJKi8KKyNkZWZpbmUgU0lPR0lGSU5ERVgJU0lPQ0dJRklOREVYCS8qIG1pc3ByaW50IGNvbXBhdGliaWxpdHkgOi0pCSovCisjZGVmaW5lIFNJT0NTSUZQRkxBR1MJMHg4OTM0CQkvKiBzZXQvZ2V0IGV4dGVuZGVkIGZsYWdzIHNldAkqLworI2RlZmluZSBTSU9DR0lGUEZMQUdTCTB4ODkzNQorI2RlZmluZSBTSU9DRElGQUREUgkweDg5MzYJCS8qIGRlbGV0ZSBQQSBhZGRyZXNzCQkqLworI2RlZmluZQlTSU9DU0lGSFdCUk9BRENBU1QJMHg4OTM3CS8qIHNldCBoYXJkd2FyZSBicm9hZGNhc3QgYWRkcgkqLworI2RlZmluZSBTSU9DR0lGQ09VTlQJMHg4OTM4CQkvKiBnZXQgbnVtYmVyIG9mIGRldmljZXMgKi8KKworI2RlZmluZSBTSU9DR0lGQlIJMHg4OTQwCQkvKiBCcmlkZ2luZyBzdXBwb3J0CQkqLworI2RlZmluZSBTSU9DU0lGQlIJMHg4OTQxCQkvKiBTZXQgYnJpZGdpbmcgb3B0aW9ucyAJKi8KKworI2RlZmluZSBTSU9DR0lGVFhRTEVOCTB4ODk0MgkJLyogR2V0IHRoZSB0eCBxdWV1ZSBsZW5ndGgJKi8KKyNkZWZpbmUgU0lPQ1NJRlRYUUxFTgkweDg5NDMJCS8qIFNldCB0aGUgdHggcXVldWUgbGVuZ3RoIAkqLworCisKKy8qIEFSUCBjYWNoZSBjb250cm9sIGNhbGxzLiAqLworCQkgICAgLyogIDB4ODk1MCAtIDB4ODk1MiAgKiBvYnNvbGV0ZSBjYWxscywgZG9uJ3QgcmUtdXNlICovCisjZGVmaW5lIFNJT0NEQVJQCTB4ODk1MwkJLyogZGVsZXRlIEFSUCB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DR0FSUAkweDg5NTQJCS8qIGdldCBBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTQVJQCTB4ODk1NQkJLyogc2V0IEFSUCB0YWJsZSBlbnRyeQkJKi8KKworLyogUkFSUCBjYWNoZSBjb250cm9sIGNhbGxzLiAqLworI2RlZmluZSBTSU9DRFJBUlAJMHg4OTYwCQkvKiBkZWxldGUgUkFSUCB0YWJsZSBlbnRyeQkqLworI2RlZmluZSBTSU9DR1JBUlAJMHg4OTYxCQkvKiBnZXQgUkFSUCB0YWJsZSBlbnRyeQkJKi8KKyNkZWZpbmUgU0lPQ1NSQVJQCTB4ODk2MgkJLyogc2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIERyaXZlciBjb25maWd1cmF0aW9uIGNhbGxzICovCisKKyNkZWZpbmUgU0lPQ0dJRk1BUAkweDg5NzAJCS8qIEdldCBkZXZpY2UgcGFyYW1ldGVycwkqLworI2RlZmluZSBTSU9DU0lGTUFQCTB4ODk3MQkJLyogU2V0IGRldmljZSBwYXJhbWV0ZXJzCSovCisKKy8qIERMQ0kgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NBRERETENJCTB4ODk4MAkJLyogQ3JlYXRlIG5ldyBETENJIGRldmljZQkqLworI2RlZmluZSBTSU9DREVMRExDSQkweDg5ODEJCS8qIERlbGV0ZSBETENJIGRldmljZQkJKi8KKworLyogRGV2aWNlIHByaXZhdGUgaW9jdGwgY2FsbHMuICAqLworCisvKiBUaGVzZSAxNiBpb2N0bHMgYXJlIGF2YWlsYWJsZSB0byBkZXZpY2VzIHZpYSB0aGUgZG9faW9jdGwoKSBkZXZpY2UKKyAgIHZlY3Rvci4gIEVhY2ggZGV2aWNlIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgcmVkZWZpbmUgdGhlc2UKKyAgIG5hbWVzIGFzIHRoZWlyIG93bi4gQmVjYXVzZSB0aGVzZSBhcmUgZGV2aWNlIGRlcGVuZGVudCBpdCBpcyBhIGdvb2QKKyAgIGlkZWEgX05PVF8gdG8gaXNzdWUgdGhlbSB0byByYW5kb20gb2JqZWN0cyBhbmQgaG9wZS4gICovCisKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgCQkweDg5RjAJLyogdG8gODlGRiAqLworCisvKgorICoJVGhlc2UgMTYgaW9jdGwgY2FsbHMgYXJlIHByb3RvY29sIHByaXZhdGUKKyAqLworCisjZGVmaW5lIFNJT0NQUk9UT1BSSVZBVEUgMHg4OUUwIC8qIHRvIDg5RUYgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9pcGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWEwNDNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2lwYy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfSVBDX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9pcGMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9pcGMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogTW9kZSBiaXRzIGZvciBgbXNnZ2V0JywgYHNlbWdldCcsIGFuZCBgc2htZ2V0Jy4gICovCisjZGVmaW5lIElQQ19DUkVBVAkwMTAwMAkJLyogQ3JlYXRlIGtleSBpZiBrZXkgZG9lcyBub3QgZXhpc3QuICovCisjZGVmaW5lIElQQ19FWENMCTAyMDAwCQkvKiBGYWlsIGlmIGtleSBleGlzdHMuICAqLworI2RlZmluZSBJUENfTk9XQUlUCTA0MDAwCQkvKiBSZXR1cm4gZXJyb3Igb24gd2FpdC4gICovCisKKy8qIENvbnRyb2wgY29tbWFuZHMgZm9yIGBtc2djdGwnLCBgc2VtY3RsJywgYW5kIGBzaG1jdGwnLiAgKi8KKyNkZWZpbmUgSVBDX1JNSUQJMAkJLyogUmVtb3ZlIGlkZW50aWZpZXIuICAqLworI2RlZmluZSBJUENfU0VUCQkxCQkvKiBTZXQgYGlwY19wZXJtJyBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBDX1NUQVQJMgkJLyogR2V0IGBpcGNfcGVybScgb3B0aW9ucy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJUENfSU5GTwkzCQkvKiBTZWUgaXBjcy4gICovCisjZW5kaWYKKworLyogU3BlY2lhbCBrZXkgdmFsdWVzLiAgKi8KKyNkZWZpbmUgSVBDX1BSSVZBVEUJKChfX2tleV90KSAwKQkvKiBQcml2YXRlIGtleS4gICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIHBlcm1pc3Npb24gaW5mb3JtYXRpb24gdG8gSVBDIG9wZXJhdGlvbnMuICAqLworc3RydWN0IGlwY19wZXJtCisgIHsKKyAgICBfX2tleV90IF9fa2V5OwkJCS8qIEtleS4gICovCisgICAgX191aWRfdCB1aWQ7CQkJLyogT3duZXIncyB1c2VyIElELiAgKi8KKyAgICBfX2dpZF90IGdpZDsJCQkvKiBPd25lcidzIGdyb3VwIElELiAgKi8KKyAgICBfX3VpZF90IGN1aWQ7CQkJLyogQ3JlYXRvcidzIHVzZXIgSUQuICAqLworICAgIF9fZ2lkX3QgY2dpZDsJCQkvKiBDcmVhdG9yJ3MgZ3JvdXAgSUQuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBtb2RlOwkJLyogUmVhZC93cml0ZSBwZXJtaXNzaW9uLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQxOworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3NlcTsJCS8qIFNlcXVlbmNlIG51bWJlci4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICB9OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2lwY3R5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvaXBjdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhjYTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2lwY3R5cGVzLmgKQEAgLTAsMCArMSwzNyBAQAorLyogYml0cy9pcGN0eXBlcy5oIC0tIERlZmluZSBzb21lIHR5cGVzIHVzZWQgYnkgU3lzViBJUEMvTVNHL1NITS4gIEdlbmVyaWMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIDxiaXRzL2lwY3R5cGVzLmg+IGRpcmVjdGx5LgorICovCisKKyNpZm5kZWYgX0JJVFNfSVBDVFlQRVNfSAorI2RlZmluZSBfQklUU19JUENUWVBFU19ICTEKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVXNlZCBpbiBgc3RydWN0IHNobWlkX2RzJy4gICovCisjIGlmIF9fV09SRFNJWkUgPT0gMzIKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IF9faXBjX3BpZF90OworIyBlbHNlCit0eXBlZGVmIGludCBfX2lwY19waWRfdDsKKyMgZW5kaWYKKworCisjZW5kaWYgLyogYml0cy9pcGN0eXBlcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbGliYy1sb2NrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbGliYy1sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5N2YzYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9saWJjLWxvY2suaApAQCAtMCwwICsxLDU4NSBAQAorLyogbGliYy1pbnRlcm5hbCBpbnRlcmZhY2UgZm9yIG11dGV4IGxvY2tzLiAgTlBUTCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDMsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19MSUJDX0xPQ0tfSAorI2RlZmluZSBfQklUU19MSUJDX0xPQ0tfSCAxCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZGVmaW5lIF9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworLyogRm9ydHVuYXRlbHkgTGludXggbm93IGhhcyBhIG1lYW4gdG8gZG8gbG9ja2luZyB3aGljaCBpcyByZWFsdGltZQorICAgc2FmZSB3aXRob3V0IHRoZSBhaWQgb2YgdGhlIHRocmVhZCBsaWJyYXJ5LiAgV2UgYWxzbyBuZWVkIG5vIGZhbmN5CisgICBvcHRpb25zIGxpa2UgZXJyb3IgY2hlY2tpbmcgbXV0ZXhlcyBldGMuICBXZSBvbmx5IG5lZWQgc2ltcGxlCisgICBsb2NrcywgbWF5YmUgcmVjdXJzaXZlLiAgVGhpcyBjYW4gYmUgZWFzaWx5IGFuZCBjaGVhcGx5IGltcGxlbWVudGVkCisgICB1c2luZyBmdXRleGVzLiAgV2Ugd2lsbCB1c2UgdGhlbSBldmVyeXdoZXJlIGV4Y2VwdCBpbiBsZC5zbyBzaW5jZQorICAgbGQuc28gbWlnaHQgYmUgdXNlZCBvbiBvbGQga2VybmVscyB3aXRoIGEgZGlmZmVyZW50IGxpYmMuc28uICAqLworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxvd2xldmVsbG9jay5oPgorIyBpbmNsdWRlIDx0bHMuaD4KKyMgaW5jbHVkZSA8cHRocmVhZC1mdW5jdGlvbnMuaD4KKyNlbmRpZgorCisvKiBNdXRleCB0eXBlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0lPX01UU0FGRV9JTworIyBpZiAoZGVmaW5lZCBOT1RfSU5fbGliYyAmJiAhZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKSB8fCAhZGVmaW5lZCBfTElCQwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19saWJjX2xvY2tfdDsKK3R5cGVkZWYgc3RydWN0IHsgcHRocmVhZF9tdXRleF90IG11dGV4OyB9IF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90OworIyBlbHNlCit0eXBlZGVmIGludCBfX2xpYmNfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgbG9jazsgaW50IGNudDsgdm9pZCAqb3duZXI7IH0gX19saWJjX2xvY2tfcmVjdXJzaXZlX3Q7CisjIGVuZGlmCit0eXBlZGVmIHN0cnVjdCB7IHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsgfSBfX3J0bGRfbG9ja19yZWN1cnNpdmVfdDsKKyMgaWZkZWYgX19VU0VfVU5JWDk4Cit0eXBlZGVmIHB0aHJlYWRfcndsb2NrX3QgX19saWJjX3J3bG9ja190OworIyBlbHNlCit0eXBlZGVmIHN0cnVjdCBfX2xpYmNfcndsb2NrX29wYXF1ZV9fIF9fbGliY19yd2xvY2tfdDsKKyMgZW5kaWYKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBfX2xpYmNfbG9ja19vcGFxdWVfXyBfX2xpYmNfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgX19saWJjX2xvY2tfcmVjdXJzaXZlX29wYXF1ZV9fIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90OwordHlwZWRlZiBzdHJ1Y3QgX19saWJjX3J3bG9ja19vcGFxdWVfXyBfX2xpYmNfcndsb2NrX3Q7CisjZW5kaWYKKworLyogVHlwZSBmb3Iga2V5IHRvIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBfX2xpYmNfa2V5X3Q7CisKKy8qIERlZmluZSBhIGxvY2sgdmFyaWFibGUgTkFNRSB3aXRoIHN0b3JhZ2UgY2xhc3MgQ0xBU1MuICBUaGUgbG9jayBtdXN0IGJlCisgICBpbml0aWFsaXplZCB3aXRoIF9fbGliY19sb2NrX2luaXQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkIChvciBkZWZpbmUgaXQKKyAgIHdpdGggX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkLCBiZWxvdykuICBVc2UgYGV4dGVybicgZm9yIENMQVNTIHRvCisgICBkZWNsYXJlIGEgbG9jayBkZWZpbmVkIGluIGFub3RoZXIgbW9kdWxlLiAgSW4gcHVibGljIHN0cnVjdHVyZQorICAgZGVmaW5pdGlvbnMgeW91IG11c3QgdXNlIGEgcG9pbnRlciB0byB0aGUgbG9jayBzdHJ1Y3R1cmUgKGkuZS4sIE5BTUUKKyAgIGJlZ2lucyB3aXRoIGEgYConKSwgYmVjYXVzZSBpdHMgc3RvcmFnZSBzaXplIHdpbGwgbm90IGJlIGtub3duIG91dHNpZGUKKyAgIG9mIGxpYmMuICAqLworI2RlZmluZSBfX2xpYmNfbG9ja19kZWZpbmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUU7CisjZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX3J3bG9ja190IE5BTUU7CisjZGVmaW5lIF9fbGliY19sb2NrX2RlZmluZV9yZWN1cnNpdmUoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCBOQU1FOworI2RlZmluZSBfX3J0bGRfbG9ja19kZWZpbmVfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19ydGxkX2xvY2tfcmVjdXJzaXZlX3QgTkFNRTsKKworLyogRGVmaW5lIGFuIGluaXRpYWxpemVkIGxvY2sgdmFyaWFibGUgTkFNRSB3aXRoIHN0b3JhZ2UgY2xhc3MgQ0xBU1MuCisKKyAgIEZvciB0aGUgQyBsaWJyYXJ5IHdlIHRha2UgYSBkZWVwZXIgbG9vayBhdCB0aGUgaW5pdGlhbGl6ZXIuICBGb3IKKyAgIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4gIFRoZXJlZm9yZQorICAgd2UgZG9uJ3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUgd2hpY2ggYWxsb3dzIHB1dHRpbmcgaXQgaW50byB0aGUKKyAgIEJTUyBzZWN0aW9uLiAgKEV4Y2VwdCBvbiBQQS1SSVNDIGFuZCBvdGhlciBvZGQgYXJjaGl0ZWN0dXJlcywgd2hlcmUKKyAgIGluaXRpYWxpemVkIGxvY2tzIG11c3QgYmUgc2V0IHRvIG9uZSBkdWUgdG8gdGhlIGxhY2sgb2Ygbm9ybWFsCisgICBhdG9taWMgb3BlcmF0aW9ucy4pICovCisKKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGlmIExMTF9MT0NLX0lOSVRJQUxJWkVSID09IDAKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUU7CisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsTkFNRSkgXAorICBDTEFTUyBfX2xpYmNfbG9ja190IE5BTUUgPSBMTExfTE9DS19JTklUSUFMSVpFUjsKKyMgZW5kaWYKKyNlbHNlCisjIGlmIF9fTFRfU1BJTkxPQ0tfSU5JVCA9PSAwCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FOworIyBlbHNlCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfdCBOQU1FID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX3J3bG9ja190IE5BTUUgPSBQVEhSRUFEX1JXTE9DS19JTklUSUFMSVpFUjsKKworLyogRGVmaW5lIGFuIGluaXRpYWxpemVkIHJlY3Vyc2l2ZSBsb2NrIHZhcmlhYmxlIE5BTUUgd2l0aCBzdG9yYWdlCisgICBjbGFzcyBDTEFTUy4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBpZiBMTExfTE9DS19JTklUSUFMSVpFUiA9PSAwCisjICBkZWZpbmUgX19saWJjX2xvY2tfZGVmaW5lX2luaXRpYWxpemVkX3JlY3Vyc2l2ZShDTEFTUyxOQU1FKSBcCisgIENMQVNTIF9fbGliY19sb2NrX3JlY3Vyc2l2ZV90IE5BTUU7CisjIGVsc2UKKyMgIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRSA9IF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSOworIyBlbmRpZgorIyBkZWZpbmUgX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIgXAorICB7IExMTF9MT0NLX0lOSVRJQUxJWkVSLCAwLCBOVUxMIH0KKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19saWJjX2xvY2tfcmVjdXJzaXZlX3QgTkFNRSA9IF9MSUJDX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSOworIyBkZWZpbmUgX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIgXAorICB7UFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlB9CisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWRfcmVjdXJzaXZlKENMQVNTLE5BTUUpIFwKKyAgQ0xBU1MgX19ydGxkX2xvY2tfcmVjdXJzaXZlX3QgTkFNRSA9IF9SVExEX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSOworI2RlZmluZSBfUlRMRF9MT0NLX1JFQ1VSU0lWRV9JTklUSUFMSVpFUiBcCisgIHtQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUH0KKworI2RlZmluZSBfX3J0bGRfbG9ja19pbml0aWFsaXplKE5BTUUpIFwKKyAgKHZvaWQpICgoTkFNRSkgPSAoX19ydGxkX2xvY2tfcmVjdXJzaXZlX3QpIF9SVExEX0xPQ0tfUkVDVVJTSVZFX0lOSVRJQUxJWkVSKQorCisvKiBJZiB3ZSBjaGVjayBmb3IgYSB3ZWFrbHkgcmVmZXJlbmNlZCBzeW1ib2wgYW5kIHRoZW4gcGVyZm9ybSBhCisgICBub3JtYWwganVtcCB0byBpdCB0ZSBjb2RlIGdlbmVyYXRlZCBmb3Igc29tZSBwbGF0Zm9ybXMgaW4gY2FzZSBvZgorICAgUElDIGlzIHVubmVjZXNzYXJpbHkgc2xvdy4gIFdoYXQgd291bGQgaGFwcGVuIGlzIHRoYXQgdGhlIGZ1bmN0aW9uCisgICBpcyBmaXJzdCByZWZlcmVuY2VkIGFzIGRhdGEgYW5kIHRoZW4gaXQgaXMgY2FsbGVkIGluZGlyZWN0bHkKKyAgIHRocm91Z2ggdGhlIFBMVC4gIFdlIGNhbiBtYWtlIHRoaXMgYSBkaXJlY3QganVtcC4gICovCisjaWZkZWYgX19QSUNfXworIyBkZWZpbmUgX19saWJjX21heWJlX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICAoX19leHRlbnNpb25fXyAoeyBfX3R5cGVvZiAoRlVOQykgKl9mbiA9IChGVU5DKTsgXAorICAgICAgICAgICAgICAgICAgICBfZm4gIT0gTlVMTCA/ICgqX2ZuKSBBUkdTIDogRUxTRTsgfSkpCisjZWxzZQorIyBkZWZpbmUgX19saWJjX21heWJlX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICAoRlVOQyAhPSBOVUxMID8gRlVOQyBBUkdTIDogRUxTRSkKKyNlbmRpZgorCisvKiBDYWxsIHRocmVhZCBmdW5jdGlvbnMgdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0YWJsZS4gICovCisjaWYgZGVmaW5lZCBTSEFSRUQgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKyMgZGVmaW5lIFBURkFWQUlMKE5BTUUpIF9fbGliY19wdGhyZWFkX2Z1bmN0aW9uc19pbml0CisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICAoX19saWJjX3B0aHJlYWRfZnVuY3Rpb25zX2luaXQgPyBQVEhGQ1RfQ0FMTCAocHRyXyMjRlVOQywgQVJHUykgOiBFTFNFKQorIyBkZWZpbmUgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyhGVU5DLCBBUkdTKSBcCisgIFBUSEZDVF9DQUxMIChwdHJfIyNGVU5DLCBBUkdTKQorI2Vsc2UKKyMgZGVmaW5lIFBURkFWQUlMKE5BTUUpIChOQU1FICE9IE5VTEwpCisjIGRlZmluZSBfX2xpYmNfcHRmX2NhbGwoRlVOQywgQVJHUywgRUxTRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoRlVOQywgQVJHUywgRUxTRSkKKyMgZGVmaW5lIF9fbGliY19wdGZfY2FsbF9hbHdheXMoRlVOQywgQVJHUykgXAorICBGVU5DIEFSR1MKKyNlbmRpZgorCisKKy8qIEluaXRpYWxpemUgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUsIGxlYXZpbmcgaXQgaW4gYSBjb25zaXN0ZW50LCB1bmxvY2tlZAorICAgc3RhdGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXQoTkFNRSkgKChOQU1FKSA9IExMTF9MT0NLX0lOSVRJQUxJWkVSLCAwKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXQoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2luaXQsICgmKE5BTUUpLCBOVUxMKSwgMCkKKyNlbmRpZgorI2lmIGRlZmluZWQgU0hBUkVEICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisvKiAoKE5BTUUpID0gKF9fbGliY19yd2xvY2tfdCkgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIsIDApIGlzCisgICBpbmVmZmljaWVudC4gICovCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2luaXQoTkFNRSkgXAorICAoX19idWlsdGluX21lbXNldCAoJihOQU1FKSwgJ1wwJywgc2l6ZW9mIChOQU1FKSksIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19pbml0KE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfaW5pdCwgKCYoTkFNRSksIE5VTEwpLCAwKQorI2VuZGlmCisKKy8qIFNhbWUgYXMgbGFzdCBidXQgdGhpcyB0aW1lIHdlIGluaXRpYWxpemUgYSByZWN1cnNpdmUgbXV0ZXguICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX2luaXRfcmVjdXJzaXZlKE5BTUUpIFwKKyAgKChOQU1FKSA9IChfX2xpYmNfbG9ja19yZWN1cnNpdmVfdCkgX0xJQkNfTE9DS19SRUNVUlNJVkVfSU5JVElBTElaRVIsIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfaW5pdF9yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGlmIChfX3B0aHJlYWRfbXV0ZXhfaW5pdCAhPSBOVUxMKQkJCQkJICAgICAgXAorICAgICAgewkJCQkJCQkJCSAgICAgIFwKKwlwdGhyZWFkX211dGV4YXR0cl90IF9fYXR0cjsJCQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQgKCZfX2F0dHIpOwkJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlICgmX19hdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7ICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhfaW5pdCAoJihOQU1FKS5tdXRleCwgJl9fYXR0cik7CQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAoJl9fYXR0cik7CQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja19pbml0X3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKF9fcHRocmVhZF9tdXRleF9pbml0ICE9IE5VTEwpCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCXB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOwkJCQkJICAgICAgXAorCV9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAoJl9fYXR0cik7CQkJCSAgICAgIFwKKwlfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKCZfX2F0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsgICAgXAorCV9fcHRocmVhZF9tdXRleF9pbml0ICgmKE5BTUUpLm11dGV4LCAmX19hdHRyKTsJCQkgICAgICBcCisJX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICgmX19hdHRyKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLyogRmluYWxpemUgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUsIHdoaWNoIG11c3QgYmUgbG9ja2VkLiAgSXQgY2Fubm90IGJlCisgICB1c2VkIGFnYWluIHVudGlsIF9fbGliY19sb2NrX2luaXQgaXMgY2FsbGVkIGFnYWluIG9uIGl0LiAgVGhpcyBtdXN0IGJlCisgICBjYWxsZWQgb24gYSBsb2NrIHZhcmlhYmxlIGJlZm9yZSB0aGUgY29udGFpbmluZyBzdG9yYWdlIGlzIHJldXNlZC4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaShOQU1FKSAoKHZvaWQpIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisjaWYgZGVmaW5lZCBTSEFSRUQgJiYgIWRlZmluZWQgTk9UX0lOX2xpYmMKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZmluaShOQU1FKSAoKHZvaWQpIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19maW5pKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgKCYoTkFNRSkpLCAwKQorI2VuZGlmCisKKy8qIEZpbmFsaXplIHJlY3Vyc2l2ZSBuYW1lZCBsb2NrLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19maW5pX3JlY3Vyc2l2ZShOQU1FKSAoKHZvaWQpIDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfZmluaV9yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisvKiBMb2NrIHRoZSBuYW1lZCBsb2NrIHZhcmlhYmxlLiAgKi8KKyNpZiBkZWZpbmVkIF9MSUJDICYmICghZGVmaW5lZCBOT1RfSU5fbGliYyB8fCBkZWZpbmVkIElTX0lOX2xpYnB0aHJlYWQpCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpIFwKKyAgKHsgbGxsX2xvY2sgKE5BTUUsIExMTF9QUklWQVRFKTsgMDsgfSkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF9sb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNkZWZpbmUgX19saWJjX3J3bG9ja19yZGxvY2soTkFNRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrLCAoJihOQU1FKSksIDApCisjZGVmaW5lIF9fbGliY19yd2xvY2tfd3Jsb2NrKE5BTUUpIFwKKyAgX19saWJjX3B0Zl9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgKCYoTkFNRSkpLCAwKQorCisvKiBMb2NrIHRoZSByZWN1cnNpdmUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIHZvaWQgKnNlbGYgPSBUSFJFQURfU0VMRjsJCQkJCQkgICAgICBcCisgICAgaWYgKChOQU1FKS5vd25lciAhPSBzZWxmKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJbGxsX2xvY2sgKChOQU1FKS5sb2NrLCBMTExfUFJJVkFURSk7CQkJCSAgICAgIFwKKwkoTkFNRSkub3duZXIgPSBzZWxmOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgKysoTkFNRSkuY250OwkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgX19saWJjX2xvY2tfbG9ja19yZWN1cnNpdmUoTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X2xvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKyNlbmRpZgorCisvKiBUcnkgdG8gbG9jayB0aGUgbmFtZWQgbG9jayB2YXJpYWJsZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyAmJiAoIWRlZmluZWQgTk9UX0lOX2xpYmMgfHwgZGVmaW5lZCBJU19JTl9saWJwdGhyZWFkKQorIyBkZWZpbmUgX19saWJjX2xvY2tfdHJ5bG9jayhOQU1FKSBcCisgIGxsbF90cnlsb2NrIChOQU1FKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2soTkFNRSkgXAorICBfX2xpYmNfbWF5YmVfY2FsbCAoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorI2RlZmluZSBfX2xpYmNfcndsb2NrX3RyeXJkbG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgKCYoTkFNRSkpLCAwKQorI2RlZmluZSBfX2xpYmNfcndsb2NrX3RyeXdybG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgKCYoTkFNRSkpLCAwKQorCisvKiBUcnkgdG8gbG9jayB0aGUgcmVjdXJzaXZlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgaW50IHJlc3VsdCA9IDA7CQkJCQkJCSAgICAgIFwKKyAgICB2b2lkICpzZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoTkFNRSkub3duZXIgIT0gc2VsZikJCQkJCQkgICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICAgXAorCWlmIChsbGxfdHJ5bG9jayAoKE5BTUUpLmxvY2spID09IDApCQkJCSAgICAgIFwKKwkgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgKE5BTUUpLm93bmVyID0gc2VsZjsJCQkJCSAgICAgIFwKKwkgICAgKE5BTUUpLmNudCA9IDE7CQkJCQkJICAgICAgXAorCSAgfQkJCQkJCQkJICAgICAgXAorCWVsc2UJCQkJCQkJCSAgICAgIFwKKwkgIHJlc3VsdCA9IEVCVVNZOwkJCQkJCSAgICAgIFwKKyAgICAgIH0JCQkJCQkJCQkgICAgICBcCisgICAgZWxzZQkJCQkJCQkJICAgICAgXAorICAgICAgKysoTkFNRSkuY250OwkJCQkJCQkgICAgICBcCisgICAgcmVzdWx0OwkJCQkJCQkJICAgICAgXAorICB9KQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3RyeWxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKworI2RlZmluZSBfX3J0bGRfbG9ja190cnlsb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorCisvKiBVbmxvY2sgdGhlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKSBcCisgIGxsbF91bmxvY2sgKE5BTUUsIExMTF9QUklWQVRFKQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19sb2NrX3VubG9jayhOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAoJihOQU1FKSksIDApCisjZW5kaWYKKyNkZWZpbmUgX19saWJjX3J3bG9ja191bmxvY2soTkFNRSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrLCAoJihOQU1FKSksIDApCisKKy8qIFVubG9jayB0aGUgcmVjdXJzaXZlIG5hbWVkIGxvY2sgdmFyaWFibGUuICAqLworI2lmIGRlZmluZWQgX0xJQkMgJiYgKCFkZWZpbmVkIE5PVF9JTl9saWJjIHx8IGRlZmluZWQgSVNfSU5fbGlicHRocmVhZCkKKy8qIFdlIGRvIG5vIGVycm9yIGNoZWNraW5nIGhlcmUuICAqLworIyBkZWZpbmUgX19saWJjX2xvY2tfdW5sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKC0tKE5BTUUpLmNudCA9PSAwKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKE5BTUUpLm93bmVyID0gTlVMTDsJCQkJCQkgICAgICBcCisJbGxsX3VubG9jayAoKE5BTUUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF91bmxvY2ssICgmKE5BTUUpKSwgMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIFNIQVJFRAorIyBkZWZpbmUgX19ydGxkX2xvY2tfZGVmYXVsdF9sb2NrX3JlY3Vyc2l2ZShsb2NrKSBcCisgICsrKChwdGhyZWFkX211dGV4X3QgKikobG9jaykpLT5fX2RhdGEuX19jb3VudDsKKworIyBkZWZpbmUgX19ydGxkX2xvY2tfZGVmYXVsdF91bmxvY2tfcmVjdXJzaXZlKGxvY2spIFwKKyAgLS0oKHB0aHJlYWRfbXV0ZXhfdCAqKShsb2NrKSktPl9fZGF0YS5fX2NvdW50OworCisjIGRlZmluZSBfX3J0bGRfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIEdMKGRsX3J0bGRfbG9ja19yZWN1cnNpdmUpICgmKE5BTUUpLm11dGV4KQorCisjIGRlZmluZSBfX3J0bGRfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgR0woZGxfcnRsZF91bmxvY2tfcmVjdXJzaXZlKSAoJihOQU1FKS5tdXRleCkKKyNlbHNlCisjIGRlZmluZSBfX3J0bGRfbG9ja19sb2NrX3JlY3Vyc2l2ZShOQU1FKSBcCisgIF9fbGliY19tYXliZV9jYWxsIChfX3B0aHJlYWRfbXV0ZXhfbG9jaywgKCYoTkFNRSkubXV0ZXgpLCAwKQorCisjIGRlZmluZSBfX3J0bGRfbG9ja191bmxvY2tfcmVjdXJzaXZlKE5BTUUpIFwKKyAgX19saWJjX21heWJlX2NhbGwgKF9fcHRocmVhZF9tdXRleF91bmxvY2ssICgmKE5BTUUpLm11dGV4KSwgMCkKKyNlbmRpZgorCisvKiBEZWZpbmUgb25jZSBjb250cm9sIHZhcmlhYmxlLiAgKi8KKyNpZiBQVEhSRUFEX09OQ0VfSU5JVCA9PSAwCisvKiBTcGVjaWFsIGNhc2UgZm9yIHN0YXRpYyB2YXJpYWJsZXMgd2hlcmUgd2UgY2FuIGF2b2lkIHRoZSBpbml0aWFsaXphdGlvbgorICAgaWYgaXQgaXMgemVyby4gICovCisjIGRlZmluZSBfX2xpYmNfb25jZV9kZWZpbmUoQ0xBU1MsIE5BTUUpIFwKKyAgQ0xBU1MgcHRocmVhZF9vbmNlX3QgTkFNRQorI2Vsc2UKKyMgZGVmaW5lIF9fbGliY19vbmNlX2RlZmluZShDTEFTUywgTkFNRSkgXAorICBDTEFTUyBwdGhyZWFkX29uY2VfdCBOQU1FID0gUFRIUkVBRF9PTkNFX0lOSVQKKyNlbmRpZgorCisvKiBDYWxsIGhhbmRsZXIgaWZmIHRoZSBmaXJzdCBjYWxsLiAgKi8KKyNkZWZpbmUgX19saWJjX29uY2UoT05DRV9DT05UUk9MLCBJTklUX0ZVTkNUSU9OKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgaWYgKFBURkFWQUlMIChfX3B0aHJlYWRfb25jZSkpCQkJCQkgICAgICBcCisgICAgICBfX2xpYmNfcHRmX2NhbGxfYWx3YXlzIChfX3B0aHJlYWRfb25jZSwgKCYoT05DRV9DT05UUk9MKSwJCSAgICAgIFwKKwkJCQkJICAgICAgIElOSVRfRlVOQ1RJT04pKTsJCSAgICAgIFwKKyAgICBlbHNlIGlmICgoT05DRV9DT05UUk9MKSA9PSBQVEhSRUFEX09OQ0VfSU5JVCkgewkJCSAgICAgIFwKKyAgICAgIElOSVRfRlVOQ1RJT04gKCk7CQkJCQkJCSAgICAgIFwKKyAgICAgIChPTkNFX0NPTlRST0wpIHw9IDI7CQkJCQkJICAgICAgXAorICAgIH0JCQkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKworLyogTm90ZSB0aGF0IGZvciBJL08gY2xlYW51cCBoYW5kbGluZyB3ZSBhcmUgdXNpbmcgdGhlIG9sZC1zdHlsZQorICAgY2FuY2VsIGhhbmRsaW5nLiAgSXQgZG9lcyBub3QgaGF2ZSB0byBiZSBpbnRlZ3JhdGVkIHdpdGggQysrIHNuY2UKKyAgIG5vIEMrKyBjb2RlIGlzIGNhbGxlZCBpbiB0aGUgbWlkZGxlLiAgVGhlIG9sZC1zdHlsZSBoYW5kbGluZyBpcworICAgZmFzdGVyIGFuZCB0aGUgc3VwcG9ydCBpcyBub3QgZ29pbmcgYXdheS4gICovCitleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2ggKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcm91dGluZSkgKHZvaWQgKiksIHZvaWQgKmFyZyk7CitleHRlcm4gdm9pZCBfcHRocmVhZF9jbGVhbnVwX3BvcCAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4ZWN1dGUpOworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJvdXRpbmUpICh2b2lkICopLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZSAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhlY3V0ZSk7CisKKy8qIFN0YXJ0IGNyaXRpY2FsIHJlZ2lvbiB3aXRoIGNsZWFudXAuICAqLworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9yZWdpb25fc3RhcnQoRE9JVCwgRkNULCBBUkcpIFwKKyAgeyBzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgX2J1ZmZlcjsJCQkJICAgICAgXAorICAgIGludCBfYXZhaWw7CQkJCQkJCQkgICAgICBcCisgICAgaWYgKERPSVQpIHsJCQkJCQkJCSAgICAgIFwKKyAgICAgIF9hdmFpbCA9IFBURkFWQUlMIChfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIpOwkJCSAgICAgIFwKKyAgICAgIGlmIChfYXZhaWwpIHsJCQkJCQkJICAgICAgXAorCV9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlciwgKCZfYnVmZmVyLCBGQ1QsICBcCisJCQkJCQkJICAgICAgQVJHKSk7CSAgICAgIFwKKyAgICAgIH0gZWxzZSB7CQkJCQkJCQkgICAgICBcCisJX2J1ZmZlci5fX3JvdXRpbmUgPSAoRkNUKTsJCQkJCSAgICAgIFwKKwlfYnVmZmVyLl9fYXJnID0gKEFSRyk7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICB9IGVsc2UgewkJCQkJCQkJICAgICAgXAorICAgICAgX2F2YWlsID0gMDsJCQkJCQkJICAgICAgXAorICAgIH0KKworLyogRW5kIGNyaXRpY2FsIHJlZ2lvbiB3aXRoIGNsZWFudXAuICAqLworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9yZWdpb25fZW5kKERPSVQpIFwKKyAgICBpZiAoX2F2YWlsKSB7CQkJCQkJCSAgICAgIFwKKyAgICAgIF9fbGliY19wdGZfY2FsbF9hbHdheXMgKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUsICgmX2J1ZmZlciwgRE9JVCkpO1wKKyAgICB9IGVsc2UgaWYgKERPSVQpCQkJCQkJCSAgICAgIFwKKyAgICAgIF9idWZmZXIuX19yb3V0aW5lIChfYnVmZmVyLl9fYXJnKTsJCQkJICAgICAgXAorICB9CisKKy8qIFNvbWV0aW1lcyB3ZSBoYXZlIHRvIGV4aXQgdGhlIGJsb2NrIGluIHRoZSBtaWRkbGUuICAqLworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9lbmQoRE9JVCkgXAorICAgIGlmIChfYXZhaWwpIHsJCQkJCQkJICAgICAgXAorICAgICAgX19saWJjX3B0Zl9jYWxsX2Fsd2F5cyAoX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZSwgKCZfYnVmZmVyLCBET0lUKSk7XAorICAgIH0gZWxzZSBpZiAoRE9JVCkJCQkJCQkJICAgICAgXAorICAgICAgX2J1ZmZlci5fX3JvdXRpbmUgKF9idWZmZXIuX19hcmcpCisKKworLyogTm9ybWFsIGNsZWFudXAgaGFuZGxpbmcsIGJhc2VkIG9uIEMgY2xlYW51cCBhdHRyaWJ1dGUuICAqLworX19leHRlcm5faW5saW5lIHZvaWQKK19fbGliY19jbGVhbnVwX3JvdXRpbmUgKHN0cnVjdCBfX3B0aHJlYWRfY2xlYW51cF9mcmFtZSAqZikKK3sKKyAgaWYgKGYtPl9fZG9faXQpCisgICAgZi0+X19jYW5jZWxfcm91dGluZSAoZi0+X19jYW5jZWxfYXJnKTsKK30KKworI2RlZmluZSBfX2xpYmNfY2xlYW51cF9wdXNoKGZjdCwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lIF9fY2xmcmFtZQkJCQkgICAgICBcCisgICAgICBfX2F0dHJpYnV0ZV9fICgoX19jbGVhbnVwX18gKF9fbGliY19jbGVhbnVwX3JvdXRpbmUpKSkJCSAgICAgIFwKKyAgICAgID0geyAuX19jYW5jZWxfcm91dGluZSA9IChmY3QpLCAuX19jYW5jZWxfYXJnID0gKGFyZyksCQkgICAgICBcCisgICAgICAgICAgLl9fZG9faXQgPSAxIH07CisKKyNkZWZpbmUgX19saWJjX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19kb19pdCA9IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisvKiBDcmVhdGUgdGhyZWFkLXNwZWNpZmljIGtleS4gICovCisjZGVmaW5lIF9fbGliY19rZXlfY3JlYXRlKEtFWSwgREVTVFJVQ1RPUikgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9rZXlfY3JlYXRlLCAoS0VZLCBERVNUUlVDVE9SKSwgMSkKKworLyogR2V0IHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKyNkZWZpbmUgX19saWJjX2dldHNwZWNpZmljKEtFWSkgXAorICBfX2xpYmNfcHRmX2NhbGwgKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgKEtFWSksIE5VTEwpCisKKy8qIFNldCB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisjZGVmaW5lIF9fbGliY19zZXRzcGVjaWZpYyhLRVksIFZBTFVFKSBcCisgIF9fbGliY19wdGZfY2FsbCAoX19wdGhyZWFkX3NldHNwZWNpZmljLCAoS0VZLCBWQUxVRSksIDApCisKKworLyogUmVnaXN0ZXIgaGFuZGxlcnMgdG8gZXhlY3V0ZSBiZWZvcmUgYW5kIGFmdGVyIGBmb3JrJy4gIE5vdGUgdGhhdCB0aGUKKyAgIGxhc3QgcGFyYW1ldGVyIGlzIE5VTEwuICBUaGUgaGFuZGxlcnMgcmVnaXN0ZXJlZCBieSB0aGUgbGliYyBhcmUKKyAgIG5ldmVyIHJlbW92ZWQgc28gdGhpcyBpcyBPSy4gICovCisjZGVmaW5lIF9fbGliY19hdGZvcmsoUFJFUEFSRSwgUEFSRU5ULCBDSElMRCkgXAorICBfX3JlZ2lzdGVyX2F0Zm9yayAoUFJFUEFSRSwgUEFSRU5ULCBDSElMRCwgTlVMTCkKK2V4dGVybiBpbnQgX19yZWdpc3Rlcl9hdGZvcmsgKHZvaWQgKCpfX3ByZXBhcmUpICh2b2lkKSwKKwkJCSAgICAgIHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLAorCQkJICAgICAgdm9pZCAoKl9fY2hpbGQpICh2b2lkKSwKKwkJCSAgICAgIHZvaWQgKl9fZHNvX2hhbmRsZSk7CisKKy8qIEZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgZmlsZSBhbmQgYXJlIGludGVybmFsIHRvIHRoZSBHTlUgQworICAgbGlicmFyeS4gICovCisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2luaXQgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwKKwkJCQkJaW50IF9fa2luZCk7CisKKyNpZmRlZiBfX1VTRV9VTklYOTgKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja19pbml0IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaywKKwkJCQkgIF9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9fYXR0cik7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworCitleHRlcm4gaW50IF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jayk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spOworI2VuZGlmCisKK2V4dGVybiBpbnQgX19wdGhyZWFkX2tleV9jcmVhdGUgKHB0aHJlYWRfa2V5X3QgKl9fa2V5LAorCQkJCSB2b2lkICgqX19kZXN0cl9mdW5jdGlvbikgKHZvaWQgKikpOworCitleHRlcm4gaW50IF9fcHRocmVhZF9zZXRzcGVjaWZpYyAocHRocmVhZF9rZXlfdCBfX2tleSwKKwkJCQkgIF9fY29uc3Qgdm9pZCAqX19wb2ludGVyKTsKKworZXh0ZXJuIHZvaWQgKl9fcHRocmVhZF9nZXRzcGVjaWZpYyAocHRocmVhZF9rZXlfdCBfX2tleSk7CisKK2V4dGVybiBpbnQgX19wdGhyZWFkX29uY2UgKHB0aHJlYWRfb25jZV90ICpfX29uY2VfY29udHJvbCwKKwkJCSAgIHZvaWQgKCpfX2luaXRfcm91dGluZSkgKHZvaWQpKTsKKworZXh0ZXJuIGludCBfX3B0aHJlYWRfYXRmb3JrICh2b2lkICgqX19wcmVwYXJlKSAodm9pZCksCisJCQkgICAgIHZvaWQgKCpfX3BhcmVudCkgKHZvaWQpLAorCQkJICAgICB2b2lkICgqX19jaGlsZCkgKHZvaWQpKTsKKworCisKKy8qIE1ha2UgdGhlIHB0aHJlYWQgZnVuY3Rpb25zIHdlYWsgc28gdGhhdCB3ZSBjYW4gZWxpZGUgdGhlbSBmcm9tCisgICBzaW5nbGUtdGhyZWFkZWQgcHJvY2Vzc2VzLiAgKi8KKyNpZm5kZWYgX19OT19XRUFLX1BUSFJFQURfQUxJQVNFUworIyBpZmRlZiB3ZWFrX2V4dGVybgorIyAgaWYgX0xJQkMKKyMgICBpbmNsdWRlIDxicC1zeW0uaD4KKyMgIGVsc2UKKyMgICBkZWZpbmUgQlBfU1lNIChzeW0pIHN5bQorIyAgZW5kaWYKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9kZXN0cm95KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF9sb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF90cnlsb2NrKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleF91bmxvY2spKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX211dGV4YXR0cl9pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX3J3bG9ja19pbml0KSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3JkbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3dybG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfcndsb2NrX3VubG9jaykpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfa2V5X2NyZWF0ZSkpCit3ZWFrX2V4dGVybiAoQlBfU1lNIChfX3B0aHJlYWRfc2V0c3BlY2lmaWMpKQord2Vha19leHRlcm4gKEJQX1NZTSAoX19wdGhyZWFkX2dldHNwZWNpZmljKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9fcHRocmVhZF9vbmNlKSkKK3dlYWtfZXh0ZXJuIChfX3B0aHJlYWRfaW5pdGlhbGl6ZSkKK3dlYWtfZXh0ZXJuIChfX3B0aHJlYWRfYXRmb3JrKQord2Vha19leHRlcm4gKEJQX1NZTSAoX3B0aHJlYWRfY2xlYW51cF9wdXNoX2RlZmVyKSkKK3dlYWtfZXh0ZXJuIChCUF9TWU0gKF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUpKQord2Vha19leHRlcm4gKEJQX1NZTSAocHRocmVhZF9zZXRjYW5jZWxzdGF0ZSkpCisjIGVsc2UKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF9pbml0CisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4X2xvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleF90cnlsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX3J3bG9ja193cmxvY2sKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfcndsb2NrX3VubG9jaworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2tleV9jcmVhdGUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9zZXRzcGVjaWZpYworIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2dldHNwZWNpZmljCisjICBwcmFnbWEgd2VhayBfX3B0aHJlYWRfb25jZQorIyAgcHJhZ21hIHdlYWsgX19wdGhyZWFkX2luaXRpYWxpemUKKyMgIHByYWdtYSB3ZWFrIF9fcHRocmVhZF9hdGZvcmsKKyMgIHByYWdtYSB3ZWFrIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcgorIyAgcHJhZ21hIHdlYWsgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZQorIyAgcHJhZ21hIHdlYWsgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL2xpYmMtbG9jay5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbGliaW8tbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2xpYmlvLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc0YmNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2xpYmlvLWxkYmwuaApAQCAtMCwwICsxLDI1IEBACisvKiAtbWxvbmctZG91YmxlLTY0IGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgbGliaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9JT19TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL2xpYmlvLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8bGliaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworX19MREJMX1JFRElSX0RFQ0wgKF9JT192ZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKF9JT192ZnByaW50ZikKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9saW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTBjMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbGluay5oCkBAIC0wLDAgKzEsMTE3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0xJTktfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9saW5rLmg+IGRpcmVjdGx5OyB1c2UgPGxpbmsuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisjaWYgX19FTEZfTkFUSVZFX0NMQVNTID09IDMyCisvKiBSZWdpc3RlcnMgZm9yIGVudHJ5IGludG8gUExUIG9uIElBLTMyLiAgKi8KK3R5cGVkZWYgc3RydWN0IExhX2k4Nl9yZWdzCit7CisgIHVpbnQzMl90IGxyX2VkeDsKKyAgdWludDMyX3QgbHJfZWN4OworICB1aW50MzJfdCBscl9lYXg7CisgIHVpbnQzMl90IGxyX2VicDsKKyAgdWludDMyX3QgbHJfZXNwOworfSBMYV9pODZfcmVnczsKKworLyogUmV0dXJuIHZhbHVlcyBmb3IgY2FsbHMgZnJvbSBQTFQgb24gSUEtMzIuICAqLwordHlwZWRlZiBzdHJ1Y3QgTGFfaTg2X3JldHZhbAoreworICB1aW50MzJfdCBscnZfZWF4OworICB1aW50MzJfdCBscnZfZWR4OworICBsb25nIGRvdWJsZSBscnZfc3QwOworICBsb25nIGRvdWJsZSBscnZfc3QxOworfSBMYV9pODZfcmV0dmFsOworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIEVsZjMyX0FkZHIgbGFfaTg2X2dudV9wbHRlbnRlciAoRWxmMzJfU3ltICpfX3N5bSwgdW5zaWduZWQgaW50IF9fbmR4LAorCQkJCSAgICAgICB1aW50cHRyX3QgKl9fcmVmY29vaywKKwkJCQkgICAgICAgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkJICAgICAgIExhX2k4Nl9yZWdzICpfX3JlZ3MsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywKKwkJCQkgICAgICAgY29uc3QgY2hhciAqX19zeW1uYW1lLAorCQkJCSAgICAgICBsb25nIGludCAqX19mcmFtZXNpemVwKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfaTg2X2dudV9wbHRleGl0IChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJCXVpbnRwdHJfdCAqX19yZWZjb29rLAorCQkJCQl1aW50cHRyX3QgKl9fZGVmY29vaywKKwkJCQkJY29uc3QgTGFfaTg2X3JlZ3MgKl9faW5yZWdzLAorCQkJCQlMYV9pODZfcmV0dmFsICpfX291dHJlZ3MsCisJCQkJCWNvbnN0IGNoYXIgKnN5bW5hbWUpOworCitfX0VORF9ERUNMUworCisjZWxzZQorCisvKiBSZWdpc3RlcnMgZm9yIGVudHJ5IGludG8gUExUIG9uIHg4Ni02NC4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDQsMCkKK3R5cGVkZWYgZmxvYXQgTGFfeDg2XzY0X3htbSBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKKyMgZWxzZQordHlwZWRlZiBmbG9hdCBMYV94ODZfNjRfeG1tIF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19WNFNGX18pKSk7CisjIGVuZGlmCisKK3R5cGVkZWYgc3RydWN0IExhX3g4Nl82NF9yZWdzCit7CisgIHVpbnQ2NF90IGxyX3JkeDsKKyAgdWludDY0X3QgbHJfcjg7CisgIHVpbnQ2NF90IGxyX3I5OworICB1aW50NjRfdCBscl9yY3g7CisgIHVpbnQ2NF90IGxyX3JzaTsKKyAgdWludDY0X3QgbHJfcmRpOworICB1aW50NjRfdCBscl9yYnA7CisgIHVpbnQ2NF90IGxyX3JzcDsKKyAgTGFfeDg2XzY0X3htbSBscl94bW1bOF07Cit9IExhX3g4Nl82NF9yZWdzOworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBjYWxscyBmcm9tIFBMVCBvbiB4ODYtNjQuICAqLwordHlwZWRlZiBzdHJ1Y3QgTGFfeDg2XzY0X3JldHZhbAoreworICB1aW50NjRfdCBscnZfcmF4OworICB1aW50NjRfdCBscnZfcmR4OworICBMYV94ODZfNjRfeG1tIGxydl94bW0wOworICBMYV94ODZfNjRfeG1tIGxydl94bW0xOworICBsb25nIGRvdWJsZSBscnZfc3QwOworICBsb25nIGRvdWJsZSBscnZfc3QxOworfSBMYV94ODZfNjRfcmV0dmFsOworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIEVsZjY0X0FkZHIgbGFfeDg2XzY0X2dudV9wbHRlbnRlciAoRWxmNjRfU3ltICpfX3N5bSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkJCSAgdWludHB0cl90ICpfX3JlZmNvb2ssCisJCQkJCSAgdWludHB0cl90ICpfX2RlZmNvb2ssCisJCQkJCSAgTGFfeDg2XzY0X3JlZ3MgKl9fcmVncywKKwkJCQkJICB1bnNpZ25lZCBpbnQgKl9fZmxhZ3MsCisJCQkJCSAgY29uc3QgY2hhciAqX19zeW1uYW1lLAorCQkJCQkgIGxvbmcgaW50ICpfX2ZyYW1lc2l6ZXApOworZXh0ZXJuIHVuc2lnbmVkIGludCBsYV94ODZfNjRfZ251X3BsdGV4aXQgKEVsZjY0X1N5bSAqX19zeW0sCisJCQkJCSAgIHVuc2lnbmVkIGludCBfX25keCwKKwkJCQkJICAgdWludHB0cl90ICpfX3JlZmNvb2ssCisJCQkJCSAgIHVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJCQkgICBjb25zdCBMYV94ODZfNjRfcmVncyAqX19pbnJlZ3MsCisJCQkJCSAgIExhX3g4Nl82NF9yZXR2YWwgKl9fb3V0cmVncywKKwkJCQkJICAgY29uc3QgY2hhciAqc3ltbmFtZSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2xvY2FsX2xpbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2xvY2FsX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2IyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbG9jYWxfbGltLmgKQEAgLTAsMCArMSw5MiBAQAorLyogTWluaW11bSBndWFyYW50ZWVkIG1heGltdW0gdmFsdWVzIGZvciBzeXN0ZW0gbGltaXRzLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5My0xOTk4LDIwMDAsMjAwMiwyMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogVGhlIGtlcm5lbCBoZWFkZXIgcG9sbHV0ZXMgdGhlIG5hbWVzcGFjZSB3aXRoIHRoZSBOUl9PUEVOIHN5bWJvbAorICAgYW5kIGRlZmluZXMgTElOS19NQVggYWx0aG91Z2ggZmlsZXN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgbWF4aW1hLiAgQQorICAgc2ltaWxhciB0aGluZyBpcyB0cnVlIGZvciBPUEVOX01BWDogdGhlIGxpbWl0IGNhbiBiZSBjaGFuZ2VkIGF0CisgICBydW50aW1lIGFuZCB0aGVyZWZvcmUgdGhlIG1hY3JvIG11c3Qgbm90IGJlIGRlZmluZWQuICBSZW1vdmUgdGhpcworICAgYWZ0ZXIgaW5jbHVkaW5nIHRoZSBoZWFkZXIgaWYgbmVjZXNzYXJ5LiAgKi8KKyNpZm5kZWYgTlJfT1BFTgorIyBkZWZpbmUgX191bmRlZl9OUl9PUEVOCisjZW5kaWYKKyNpZm5kZWYgTElOS19NQVgKKyMgZGVmaW5lIF9fdW5kZWZfTElOS19NQVgKKyNlbmRpZgorI2lmbmRlZiBPUEVOX01BWAorIyBkZWZpbmUgX191bmRlZl9PUEVOX01BWAorI2VuZGlmCisKKy8qIFRoZSBrZXJuZWwgc291cmNlcyBjb250YWluIGEgZmlsZSB3aXRoIGFsbCB0aGUgbmVlZGVkIGluZm9ybWF0aW9uLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworLyogSGF2ZSB0byByZW1vdmUgTlJfT1BFTj8gICovCisjaWZkZWYgX191bmRlZl9OUl9PUEVOCisjIHVuZGVmIE5SX09QRU4KKyMgdW5kZWYgX191bmRlZl9OUl9PUEVOCisjZW5kaWYKKy8qIEhhdmUgdG8gcmVtb3ZlIExJTktfTUFYPyAgKi8KKyNpZmRlZiBfX3VuZGVmX0xJTktfTUFYCisjIHVuZGVmIExJTktfTUFYCisjIHVuZGVmIF9fdW5kZWZfTElOS19NQVgKKyNlbmRpZgorLyogSGF2ZSB0byByZW1vdmUgT1BFTl9NQVg/ICAqLworI2lmZGVmIF9fdW5kZWZfT1BFTl9NQVgKKyMgdW5kZWYgT1BFTl9NQVgKKyMgdW5kZWYgX191bmRlZl9PUEVOX01BWAorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgZGF0YSBrZXlzIHBlciBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9LRVlTX01BWAkxMjgKKy8qIFRoaXMgaXMgdGhlIHZhbHVlIHRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMuICAqLworI2RlZmluZSBQVEhSRUFEX0tFWVNfTUFYCTEwMjQKKworLyogQ29udHJvbGxpbmcgdGhlIGl0ZXJhdGlvbnMgb2YgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZC1zcGVjaWZpYyBkYXRhLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMJNAorLyogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzLiAgKi8KKyNkZWZpbmUgUFRIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMJX1BPU0lYX1RIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMKKworLyogVGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9USFJFQURTX01BWAk2NAorLyogV2UgaGF2ZSBubyBwcmVkZWZpbmVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4gICovCisjdW5kZWYgUFRIUkVBRF9USFJFQURTX01BWAorCisvKiBNYXhpbXVtIGFtb3VudCBieSB3aGljaCBhIHByb2Nlc3MgY2FuIGRlc2NyZWFzZSBpdHMgYXN5bmNocm9ub3VzIEkvTworICAgcHJpb3JpdHkgbGV2ZWwuICAqLworI2RlZmluZSBBSU9fUFJJT19ERUxUQV9NQVgJMjAKKworLyogTWluaW11bSBzaXplIGZvciBhIHRocmVhZC4gIFdlIGFyZSBmcmVlIHRvIGNob29zZSBhIHJlYXNvbmFibGUgdmFsdWUuICAqLworI2RlZmluZSBQVEhSRUFEX1NUQUNLX01JTgkxNjM4NAorCisvKiBNYXhpbXVtIG51bWJlciBvZiB0aW1lciBleHBpcmF0aW9uIG92ZXJydW5zLiAgKi8KKyNkZWZpbmUgREVMQVlUSU1FUl9NQVgJMjE0NzQ4MzY0NworCisvKiBNYXhpbXVtIHR0eSBuYW1lIGxlbmd0aC4gICovCisjZGVmaW5lIFRUWV9OQU1FX01BWAkJMzIKKworLyogTWF4aW11bSBsb2dpbiBuYW1lIGxlbmd0aC4gIFRoaXMgaXMgYXJiaXRyYXJ5LiAgKi8KKyNkZWZpbmUgTE9HSU5fTkFNRV9NQVgJCTI1NgorCisvKiBNYXhpbXVtIGhvc3QgbmFtZSBsZW5ndGguICAqLworI2RlZmluZSBIT1NUX05BTUVfTUFYCQk2NAorCisvKiBNYXhpbXVtIG1lc3NhZ2UgcXVldWUgcHJpb3JpdHkgbGV2ZWwuICAqLworI2RlZmluZSBNUV9QUklPX01BWAkJMzI3NjgKKworLyogTWF4aW11bSB2YWx1ZSB0aGUgc2VtYXBob3JlIGNhbiBoYXZlLiAgKi8KKyNkZWZpbmUgU0VNX1ZBTFVFX01BWCAgICgyMTQ3NDgzNjQ3KQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2xvY2FsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDY0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbG9jYWxlLmgKQEAgLTAsMCArMSw0NCBAQAorLyogRGVmaW5pdGlvbiBvZiBsb2NhbGUgY2F0ZWdvcnkgc3ltYm9sIHZhbHVlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9MT0NBTEVfSCAmJiAhZGVmaW5lZCBfTEFOR0lORk9fSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL2xvY2FsZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bG9jYWxlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfTE9DQUxFX0gKKyNkZWZpbmUgX0JJVFNfTE9DQUxFX0gJMQorCitlbnVtCit7CisgIF9fTENfQ1RZUEUgPSAwLAorICBfX0xDX05VTUVSSUMgPSAxLAorICBfX0xDX1RJTUUgPSAyLAorICBfX0xDX0NPTExBVEUgPSAzLAorICBfX0xDX01PTkVUQVJZID0gNCwKKyAgX19MQ19NRVNTQUdFUyA9IDUsCisgIF9fTENfQUxMID0gNiwKKyAgX19MQ19QQVBFUiA9IDcsCisgIF9fTENfTkFNRSA9IDgsCisgIF9fTENfQUREUkVTUyA9IDksCisgIF9fTENfVEVMRVBIT05FID0gMTAsCisgIF9fTENfTUVBU1VSRU1FTlQgPSAxMSwKKyAgX19MQ19JREVOVElGSUNBVElPTiA9IDEyCit9OworCisjZW5kaWYJLyogYml0cy9sb2NhbGUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21hdGhjYWxscy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21hdGhjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZGE2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbWF0aGNhbGxzLmgKQEAgLTAsMCArMSwzNjUgQEAKKy8qIFByb3RvdHlwZSBkZWNsYXJhdGlvbnMgZm9yIG1hdGggZnVuY3Rpb25zOyBoZWxwZXIgZmlsZSBmb3IgPG1hdGguaD4uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMiwgMjAwMywgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogTk9URTogQmVjYXVzZSBvZiB0aGUgc3BlY2lhbCB3YXkgdGhpcyBmaWxlIGlzIHVzZWQgYnkgPG1hdGguaD4sIHRoaXMKKyAgIGZpbGUgbXVzdCBOT1QgYmUgcHJvdGVjdGVkIGZyb20gbXVsdGlwbGUgaW5jbHVzaW9uIGFzIGhlYWRlciBmaWxlcworICAgdXN1YWxseSBhcmUuCisKKyAgIFRoaXMgZmlsZSBwcm92aWRlcyBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciB0aGUgbWF0aCBmdW5jdGlvbnMuCisgICBNb3N0IGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIG1hY3JvOgorCisgICBfX01BVEhDQUxMIChOQU1FLFtfcl0sIChBUkdTLi4uKSk7CisKKyAgIFRoaXMgbWVhbnMgdGhlcmUgaXMgYSBmdW5jdGlvbiBgTkFNRScgcmV0dXJuaW5nIGBkb3VibGUnIGFuZCBhIGZ1bmN0aW9uCisgICBgTkFNRWYnIHJldHVybmluZyBgZmxvYXQnLiAgRWFjaCBwbGFjZSBgX01kb3VibGVfJyBhcHBlYXJzIGluIHRoZQorICAgcHJvdG90eXBlLCB0aGF0IGlzIGFjdHVhbGx5IGBkb3VibGUnIGluIHRoZSBwcm90b3R5cGUgZm9yIGBOQU1FJyBhbmQKKyAgIGBmbG9hdCcgaW4gdGhlIHByb3RvdHlwZSBmb3IgYE5BTUVmJy4gIFJlZW50cmFudCB2YXJpYW50IGZ1bmN0aW9ucyBhcmUKKyAgIGNhbGxlZCBgTkFNRV9yJyBhbmQgYE5BTUVmX3InLgorCisgICBGdW5jdGlvbnMgcmV0dXJuaW5nIG90aGVyIHR5cGVzIGxpa2UgYGludCcgYXJlIGRlY2xhcmVkIHVzaW5nIHRoZSBtYWNybzoKKworICAgX19NQVRIREVDTCAoVFlQRSwgTkFNRSxbX3JdLCAoQVJHUy4uLikpOworCisgICBUaGlzIGlzIGp1c3QgbGlrZSBfX01BVEhDQUxMIGJ1dCBmb3IgYSBmdW5jdGlvbiByZXR1cm5pbmcgYFRZUEUnCisgICBpbnN0ZWFkIG9mIGBfTWRvdWJsZV8nLiAgSW4gYWxsIG9mIHRoZXNlIGNhc2VzLCB0aGVyZSBpcyBzdGlsbAorICAgYm90aCBhIGBOQU1FJyBhbmQgYSBgTkFNRWYnIHRoYXQgdGFrZXMgYGZsb2F0JyBhcmd1bWVudHMuCisKKyAgIE5vdGUgdGhhdCB0aGVyZSBtdXN0IGJlIG5vIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBhcmd1bWVudCBwYXNzZWQgZm9yCisgICBOQU1FLCB0byBtYWtlIHRva2VuIHBhc3Rpbmcgd29yayB3aXRoIC10cmFkaXRpb25hbC4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9tYXRoY2FsbHMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBUcmlnb25vbWV0cmljIGZ1bmN0aW9ucy4gICovCisKK19NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorLyogQXJjIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFjb3MsLCAoX01kb3VibGVfIF9feCkpOworLyogQXJjIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhc2luLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFyYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAoYXRhbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBBcmMgdGFuZ2VudCBvZiBZL1guICAqLworX19NQVRIQ0FMTCAoYXRhbjIsLCAoX01kb3VibGVfIF9feSwgX01kb3VibGVfIF9feCkpOworCisvKiBDb3NpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChjb3MsLCAoX01kb3VibGVfIF9feCkpOworLyogU2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKHNpbiwsIChfTWRvdWJsZV8gX194KSk7CisvKiBUYW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAodGFuLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogSHlwZXJib2xpYyBmdW5jdGlvbnMuICAqLworCisvKiBIeXBlcmJvbGljIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGNvc2gsLCAoX01kb3VibGVfIF9feCkpOworLyogSHlwZXJib2xpYyBzaW5lIG9mIFguICAqLworX19NQVRIQ0FMTCAoc2luaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIHRhbmdlbnQgb2YgWC4gICovCitfX01BVEhDQUxMICh0YW5oLCwgKF9NZG91YmxlXyBfX3gpKTsKK19NZG91YmxlX0VORF9OQU1FU1BBQ0UKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ29zaW5lIGFuZCBzaW5lIG9mIFguICAqLworX19NQVRIREVDTCAodm9pZCxzaW5jb3MsLAorCSAgICAoX01kb3VibGVfIF9feCwgX01kb3VibGVfICpfX3NpbngsIF9NZG91YmxlXyAqX19jb3N4KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIEh5cGVyYm9saWMgYXJjIGNvc2luZSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGFjb3NoLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWC4gICovCitfX01BVEhDQUxMIChhc2luaCwsIChfTWRvdWJsZV8gX194KSk7CisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFguICAqLworX19NQVRIQ0FMTCAoYXRhbmgsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKy8qIEV4cG9uZW50aWFsIGFuZCBsb2dhcml0aG1pYyBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIEV4cG9uZW50aWFsIGZ1bmN0aW9uIG9mIFguICAqLworX19NQVRIQ0FMTCAoZXhwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQnJlYWsgVkFMVUUgaW50byBhIG5vcm1hbGl6ZWQgZnJhY3Rpb24gYW5kIGFuIGludGVncmFsIHBvd2VyIG9mIDIuICAqLworX19NQVRIQ0FMTCAoZnJleHAsLCAoX01kb3VibGVfIF9feCwgaW50ICpfX2V4cG9uZW50KSk7CisKKy8qIFggdGltZXMgKHR3byB0byB0aGUgRVhQIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChsZGV4cCwsIChfTWRvdWJsZV8gX194LCBpbnQgX19leHBvbmVudCkpOworCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZywsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIEJhc2UtdGVuIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZzEwLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogQnJlYWsgVkFMVUUgaW50byBpbnRlZ3JhbCBhbmQgZnJhY3Rpb25hbCBwYXJ0cy4gICovCitfX01BVEhDQUxMIChtb2RmLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyAqX19pcHRyKSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEEgZnVuY3Rpb24gbWlzc2luZyBpbiBhbGwgc3RhbmRhcmRzOiBjb21wdXRlIGV4cG9uZW50IHRvIGJhc2UgdGVuLiAgKi8KK19fTUFUSENBTEwgKGV4cDEwLCwgKF9NZG91YmxlXyBfX3gpKTsKKy8qIEFub3RoZXIgbmFtZSBvY2Nhc2lvbmFsbHkgdXNlZC4gICovCitfX01BVEhDQUxMIChwb3cxMCwsIChfTWRvdWJsZV8gX194KSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiBleHAoWCkgLSAxLiAgKi8KK19fTUFUSENBTEwgKGV4cG0xLCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUmV0dXJuIGxvZygxICsgWCkuICAqLworX19NQVRIQ0FMTCAobG9nMXAsLCAoX01kb3VibGVfIF9feCkpOworCisvKiBSZXR1cm4gdGhlIGJhc2UgMiBzaWduZWQgaW50ZWdyYWwgZXhwb25lbnQgb2YgWC4gICovCitfX01BVEhDQUxMIChsb2diLCwgKF9NZG91YmxlXyBfX3gpKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbXB1dGUgYmFzZS0yIGV4cG9uZW50aWFsIG9mIFguICAqLworX19NQVRIQ0FMTCAoZXhwMiwsIChfTWRvdWJsZV8gX194KSk7CisKKy8qIENvbXB1dGUgYmFzZS0yIGxvZ2FyaXRobSBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGxvZzIsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogUG93ZXIgZnVuY3Rpb25zLiAgKi8KKworX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisvKiBSZXR1cm4gWCB0byB0aGUgWSBwb3dlci4gICovCitfX01BVEhDQUxMIChwb3csLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisvKiBSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIFguICAqLworX19NQVRIQ0FMTCAoc3FydCwsIChfTWRvdWJsZV8gX194KSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gYHNxcnQoWCpYICsgWSpZKScuICAqLworX19NQVRIQ0FMTCAoaHlwb3QsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZXR1cm4gdGhlIGN1YmUgcm9vdCBvZiBYLiAgKi8KK19fTUFUSENBTEwgKGNicnQsLCAoX01kb3VibGVfIF9feCkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogTmVhcmVzdCBpbnRlZ2VyLCBhYnNvbHV0ZSB2YWx1ZSwgYW5kIHJlbWFpbmRlciBmdW5jdGlvbnMuICAqLworCitfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKy8qIFNtYWxsZXN0IGludGVncmFsIHZhbHVlIG5vdCBsZXNzIHRoYW4gWC4gICovCitfX01BVEhDQUxMWCAoY2VpbCwsIChfTWRvdWJsZV8gX194KSwgKF9fY29uc3RfXykpOworCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBYLiAgKi8KK19fTUFUSENBTExYIChmYWJzLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIExhcmdlc3QgaW50ZWdlciBub3QgZ3JlYXRlciB0aGFuIFguICAqLworX19NQVRIQ0FMTFggKGZsb29yLCwgKF9NZG91YmxlXyBfX3gpLCAoX19jb25zdF9fKSk7CisKKy8qIEZsb2F0aW5nLXBvaW50IG1vZHVsbyByZW1haW5kZXIgb2YgWC9ZLiAgKi8KK19fTUFUSENBTEwgKGZtb2QsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisKKy8qIFJldHVybiAwIGlmIFZBTFVFIGlzIGZpbml0ZSBvciBOYU4sICsxIGlmIGl0CisgICBpcyArSW5maW5pdHksIC0xIGlmIGl0IGlzIC1JbmZpbml0eS4gICovCitfX01BVEhERUNMXzEgKGludCxfX2lzaW5mLCwgKF9NZG91YmxlXyBfX3ZhbHVlKSkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBmaW5pdGUgYW5kIG5vdCBOYU4uICAqLworX19NQVRIREVDTF8xIChpbnQsX19maW5pdGUsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZXR1cm4gMCBpZiBWQUxVRSBpcyBmaW5pdGUgb3IgTmFOLCArMSBpZiBpdAorICAgaXMgK0luZmluaXR5LCAtMSBpZiBpdCBpcyAtSW5maW5pdHkuICAqLworX19NQVRIREVDTF8xIChpbnQsaXNpbmYsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiBub256ZXJvIGlmIFZBTFVFIGlzIGZpbml0ZSBhbmQgbm90IE5hTi4gICovCitfX01BVEhERUNMXzEgKGludCxmaW5pdGUsLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiB0aGUgcmVtYWluZGVyIG9mIFgvWS4gICovCitfX01BVEhDQUxMIChkcmVtLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworCisvKiBSZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBYIGFmdGVyIGRpdmlkaW5nIG91dCBgaWxvZ2IgKFgpJy4gICovCitfX01BVEhDQUxMIChzaWduaWZpY2FuZCwsIChfTWRvdWJsZV8gX194KSk7CisjZW5kaWYgLyogVXNlIG1pc2MuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiBYIHdpdGggaXRzIHNpZ25lZCBjaGFuZ2VkIHRvIFkncy4gICovCitfX01BVEhDQUxMWCAoY29weXNpZ24sLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSksIChfX2NvbnN0X18pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiByZXByZXNlbnRhdGlvbiBvZiBOYU4gZm9yIGRvdWJsZSB0eXBlLiAgKi8KK19fTUFUSENBTExYIChuYW4sLCAoX19jb25zdCBjaGFyICpfX3RhZ2IpLCAoX19jb25zdF9fKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBub3QgYSBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsX19pc25hbiwsIChfTWRvdWJsZV8gX192YWx1ZSkpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBSZXR1cm4gbm9uemVybyBpZiBWQUxVRSBpcyBub3QgYSBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsaXNuYW4sLCAoX01kb3VibGVfIF9fdmFsdWUpKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIEJlc3NlbCBmdW5jdGlvbnMuICAqLworX19NQVRIQ0FMTCAoajAsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChqMSwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKGpuLCwgKGludCwgX01kb3VibGVfKSk7CitfX01BVEhDQUxMICh5MCwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKHkxLCwgKF9NZG91YmxlXykpOworX19NQVRIQ0FMTCAoeW4sLCAoaW50LCBfTWRvdWJsZV8pKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBFcnJvciBhbmQgZ2FtbWEgZnVuY3Rpb25zLiAgKi8KK19fTUFUSENBTEwgKGVyZiwsIChfTWRvdWJsZV8pKTsKK19fTUFUSENBTEwgKGVyZmMsLCAoX01kb3VibGVfKSk7CitfX01BVEhDQUxMIChsZ2FtbWEsLCAoX01kb3VibGVfKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBUcnVlIGdhbW1hIGZ1bmN0aW9uLiAgKi8KK19fTUFUSENBTEwgKHRnYW1tYSwsIChfTWRvdWJsZV8pKTsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIE9ic29sZXRlIGFsaWFzIGZvciBgbGdhbW1hJy4gICovCitfX01BVEhDQUxMIChnYW1tYSwsIChfTWRvdWJsZV8pKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgbGdhbW1hLiAgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAgIGBzaWduZ2FtJy4gIFRoZSByZWVudHJhbnQgdmVyc2lvbiBpbnN0ZWFkIHRha2VzIGEgcG9pbnRlciBhbmQgc3RvcmVzCisgICB0aGUgdmFsdWUgdGhyb3VnaCBpdC4gICovCitfX01BVEhDQUxMIChsZ2FtbWEsX3IsIChfTWRvdWJsZV8sIGludCAqX19zaWduZ2FtcCkpOworI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybiB0aGUgaW50ZWdlciBuZWFyZXN0IFggaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUKKyAgIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZS4gICovCitfX01BVEhDQUxMIChyaW50LCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUmV0dXJuIFggKyBlcHNpbG9uIGlmIFggPCBZLCBYIC0gZXBzaWxvbiBpZiBYID4gWS4gICovCitfX01BVEhDQUxMWCAobmV4dGFmdGVyLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpLCAoX19jb25zdF9fKSk7CisjIGlmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fTERCTF9DT01QQVQKK19fTUFUSENBTExYIChuZXh0dG93YXJkLCwgKF9NZG91YmxlXyBfX3gsIGxvbmcgZG91YmxlIF9feSksIChfX2NvbnN0X18pKTsKKyMgZW5kaWYKKworLyogUmV0dXJuIHRoZSByZW1haW5kZXIgb2YgaW50ZWdlciBkaXZpc29uIFggLyBZIHdpdGggaW5maW5pdGUgcHJlY2lzaW9uLiAgKi8KK19fTUFUSENBTEwgKHJlbWFpbmRlciwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChzY2FsYm4sLCAoX01kb3VibGVfIF9feCwgaW50IF9fbikpOworIyBlbmRpZgorCisvKiBSZXR1cm4gdGhlIGJpbmFyeSBleHBvbmVudCBvZiBYLCB3aGljaCBtdXN0IGJlIG5vbnplcm8uICAqLworX19NQVRIREVDTCAoaW50LGlsb2diLCwgKF9NZG91YmxlXyBfX3gpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCitfX01BVEhDQUxMIChzY2FsYmxuLCwgKF9NZG91YmxlXyBfX3gsIGxvbmcgaW50IF9fbikpOworCisvKiBSb3VuZCBYIHRvIGludGVncmFsIHZhbHVlIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCB1c2luZyBjdXJyZW50CisgICByb3VuZGluZyBkaXJlY3Rpb24sIGJ1dCBkbyBub3QgcmFpc2UgaW5leGFjdCBleGNlcHRpb24uICAqLworX19NQVRIQ0FMTCAobmVhcmJ5aW50LCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbQorICAgemVyby4gICovCitfX01BVEhDQUxMWCAocm91bmQsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogUm91bmQgWCB0byB0aGUgaW50ZWdyYWwgdmFsdWUgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IG5lYXJlc3QgYnV0CisgICBub3QgbGFyZ2VyIGluIG1hZ25pdHVkZS4gICovCitfX01BVEhDQUxMWCAodHJ1bmMsLCAoX01kb3VibGVfIF9feCksIChfX2NvbnN0X18pKTsKKworLyogQ29tcHV0ZSByZW1haW5kZXIgb2YgWCBhbmQgWSBhbmQgcHV0IGluICpRVU8gYSB2YWx1ZSB3aXRoIHNpZ24gb2YgeC95CisgICBhbmQgbWFnbml0dWRlIGNvbmdydWVudCBgbW9kIDJebicgdG8gdGhlIG1hZ25pdHVkZSBvZiB0aGUgaW50ZWdyYWwKKyAgIHF1b3RpZW50IHgveSwgd2l0aCBuID49IDMuICAqLworX19NQVRIQ0FMTCAocmVtcXVvLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3ksIGludCAqX19xdW8pKTsKKworCisvKiBDb252ZXJzaW9uIGZ1bmN0aW9ucy4gICovCisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSBhY2NvcmRpbmcgdG8gY3VycmVudCByb3VuZGluZworICAgZGlyZWN0aW9uLiAgKi8KK19fTUFUSERFQ0wgKGxvbmcgaW50LGxyaW50LCwgKF9NZG91YmxlXyBfX3gpKTsKK19fTUFUSERFQ0wgKGxvbmcgbG9uZyBpbnQsbGxyaW50LCwgKF9NZG91YmxlXyBfX3gpKTsKKworLyogUm91bmQgWCB0byBuZWFyZXN0IGludGVncmFsIHZhbHVlLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbQorICAgemVyby4gICovCitfX01BVEhERUNMIChsb25nIGludCxscm91bmQsLCAoX01kb3VibGVfIF9feCkpOworX19NQVRIREVDTCAobG9uZyBsb25nIGludCxsbHJvdW5kLCwgKF9NZG91YmxlXyBfX3gpKTsKKworCisvKiBSZXR1cm4gcG9zaXRpdmUgZGlmZmVyZW5jZSBiZXR3ZWVuIFggYW5kIFkuICAqLworX19NQVRIQ0FMTCAoZmRpbSwsIChfTWRvdWJsZV8gX194LCBfTWRvdWJsZV8gX195KSk7CisKKy8qIFJldHVybiBtYXhpbXVtIG51bWVyaWMgdmFsdWUgZnJvbSBYIGFuZCBZLiAgKi8KK19fTUFUSENBTEwgKGZtYXgsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9feSkpOworCisvKiBSZXR1cm4gbWluaW11bSBudW1lcmljIHZhbHVlIGZyb20gWCBhbmQgWS4gICovCitfX01BVEhDQUxMIChmbWluLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3kpKTsKKworCisvKiBDbGFzc2lmeSBnaXZlbiBudW1iZXIuICAqLworX19NQVRIREVDTF8xIChpbnQsIF9fZnBjbGFzc2lmeSwsIChfTWRvdWJsZV8gX192YWx1ZSkpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogVGVzdCBmb3IgbmVnYXRpdmUgbnVtYmVyLiAgKi8KK19fTUFUSERFQ0xfMSAoaW50LCBfX3NpZ25iaXQsLCAoX01kb3VibGVfIF9fdmFsdWUpKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKworLyogTXVsdGlwbHktYWRkIGZ1bmN0aW9uIGNvbXB1dGVkIGFzIGEgdGVybmFyeSBvcGVyYXRpb24uICAqLworX19NQVRIQ0FMTCAoZm1hLCwgKF9NZG91YmxlXyBfX3gsIF9NZG91YmxlXyBfX3ksIF9NZG91YmxlXyBfX3opKTsKKyNlbmRpZiAvKiBVc2UgSVNPIEM5OS4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OQorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworX19NQVRIQ0FMTCAoc2NhbGIsLCAoX01kb3VibGVfIF9feCwgX01kb3VibGVfIF9fbikpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbWF0aGRlZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21hdGhkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE2MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21hdGhkZWYuaApAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfTUFUSF9IICYmICFkZWZpbmVkIF9DT01QTEVYX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9tYXRoZGVmLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxtYXRoLmg+IGluc3RlYWQiCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmIGRlZmluZWQgX01BVEhfSCAmJiAhZGVmaW5lZCBfTUFUSF9IX01BVEhERUYKKyMgZGVmaW5lIF9NQVRIX0hfTUFUSERFRgkxCisKKyMgaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjIGlmIF9fV09SRFNJWkUgPT0gNjQgfHwgKGRlZmluZWQgX19GTFRfRVZBTF9NRVRIT0RfXyAmJiBfX0ZMVF9FVkFMX01FVEhPRF9fID09IDApCisvKiBUaGUgeDg2LTY0IGFyY2hpdGVjdHVyZSBjb21wdXRlcyB2YWx1ZXMgd2l0aCB0aGUgcHJlY2lzc2lvbiBvZiB0aGUKKyAgIHVzZWQgdHlwZS4gIFNpbWlsYXJseSBmb3IgLW0zMiAtbWZwbWF0aD1zc2UuICAqLwordHlwZWRlZiBmbG9hdCBmbG9hdF90OwkJLyogYGZsb2F0JyBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGBmbG9hdCcuICAqLwordHlwZWRlZiBkb3VibGUgZG91YmxlX3Q7CS8qIGBkb3VibGUnIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQKKwkJCQkgICBhcyBgZG91YmxlJy4gICovCisjIGVsc2UKKy8qIFRoZSBpeDg3IEZQVXMgZXZhbHVhdGUgYWxsIHZhbHVlcyBpbiB0aGUgODAgYml0IGZsb2F0aW5nLXBvaW50IGZvcm1hdAorICAgd2hpY2ggaXMgYWxzbyBhdmFpbGFibGUgZm9yIHRoZSB1c2VyIGFzIGBsb25nIGRvdWJsZScuICBUaGVyZWZvcmUgd2UKKyAgIGRlZmluZTogICovCit0eXBlZGVmIGxvbmcgZG91YmxlIGZsb2F0X3Q7CS8qIGBmbG9hdCcgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcworCQkJCSAgIGBsb25nIGRvdWJsZScuICAqLwordHlwZWRlZiBsb25nIGRvdWJsZSBkb3VibGVfdDsJLyogYGRvdWJsZScgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBhcworCQkJCSAgIGBsb25nIGRvdWJsZScuICAqLworIyBlbmRpZgorCisvKiBUaGUgdmFsdWVzIHJldHVybmVkIGJ5IGBpbG9nYicgZm9yIDAgYW5kIE5hTiByZXNwZWN0aXZlbHkuICAqLworIyBkZWZpbmUgRlBfSUxPR0IwCSgtMjE0NzQ4MzY0NyAtIDEpCisjIGRlZmluZSBGUF9JTE9HQk5BTgkoLTIxNDc0ODM2NDcgLSAxKQorCisjZW5kaWYJLyogSVNPIEM5OSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21hdGhpbmxpbmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tYXRoaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhOTE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tYXRoaW5saW5lLmgKQEAgLTAsMCArMSw1MyBAQAorLyogSW5saW5lIG1hdGggZnVuY3Rpb25zIGZvciB4ODYtNjQuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IEFuZHJlYXMgSmFlZ2VyIDxhakBzdXNlLmRlPiwgMjAwMi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21hdGhpbmxpbmUuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPG1hdGguaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfX2V4dGVybl9pbmxpbmUKKyMgZGVmaW5lIF9fTUFUSF9JTkxJTkUgX19pbmxpbmUKKyNlbHNlCisjIGRlZmluZSBfX01BVEhfSU5MSU5FIF9fZXh0ZXJuX2lubGluZQorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCisvKiBUZXN0IGZvciBuZWdhdGl2ZSBudW1iZXIuICBVc2VkIGluIHRoZSBzaWduYml0KCkgbWFjcm8uICAqLworX19NQVRIX0lOTElORSBpbnQKK19fTlRIIChfX3NpZ25iaXRmIChmbG9hdCBfX3gpKQoreworICBfX2V4dGVuc2lvbl9fIHVuaW9uIHsgZmxvYXQgX19mOyBpbnQgX19pOyB9IF9fdSA9IHsgX19mOiBfX3ggfTsKKyAgcmV0dXJuIF9fdS5fX2kgPCAwOworfQorX19NQVRIX0lOTElORSBpbnQKK19fTlRIIChfX3NpZ25iaXQgKGRvdWJsZSBfX3gpKQoreworICBfX2V4dGVuc2lvbl9fIHVuaW9uIHsgZG91YmxlIF9fZDsgaW50IF9faVsyXTsgfSBfX3UgPSB7IF9fZDogX194IH07CisgIHJldHVybiBfX3UuX19pWzFdIDwgMDsKK30KK19fTUFUSF9JTkxJTkUgaW50CitfX05USCAoX19zaWduYml0bCAobG9uZyBkb3VibGUgX194KSkKK3sKKyAgX19leHRlbnNpb25fXyB1bmlvbiB7IGxvbmcgZG91YmxlIF9fbDsgaW50IF9faVszXTsgfSBfX3UgPSB7IF9fbDogX194IH07CisgIHJldHVybiAoX191Ll9faVsyXSAmIDB4ODAwMCkgIT0gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21tYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1YzllZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tbWFuLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIERlZmluaXRpb25zIGZvciBQT1NJWCBtZW1vcnkgbWFwIGludGVyZmFjZS4gIExpbnV4L3g4Nl82NCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfTU1BTl9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbW1hbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL21tYW4uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBiYXNpY2FsbHkgY29tZSBmcm9tIHRoZSBrZXJuZWwgaGVhZGVycy4KKyAgIEJ1dCB0aGUga2VybmVsIGhlYWRlciBpcyBub3QgbmFtZXNwYWNlIGNsZWFuLiAgKi8KKworCisvKiBQcm90ZWN0aW9ucyBhcmUgY2hvc2VuIGZyb20gdGhlc2UgYml0cywgT1InZCB0b2dldGhlci4gIFRoZQorICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBQUk9UX0VYRUMgb3IgUFJPVF9XUklURQorICAgd2l0aG91dCBQUk9UX1JFQUQuICBUaGUgb25seSBndWFyYW50ZWVzIGFyZSB0aGF0IG5vIHdyaXRpbmcgd2lsbCBiZQorICAgYWxsb3dlZCB3aXRob3V0IFBST1RfV1JJVEUgYW5kIG5vIGFjY2VzcyB3aWxsIGJlIGFsbG93ZWQgZm9yIFBST1RfTk9ORS4gKi8KKworI2RlZmluZSBQUk9UX1JFQUQJMHgxCQkvKiBQYWdlIGNhbiBiZSByZWFkLiAgKi8KKyNkZWZpbmUgUFJPVF9XUklURQkweDIJCS8qIFBhZ2UgY2FuIGJlIHdyaXR0ZW4uICAqLworI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBQYWdlIGNhbiBiZSBleGVjdXRlZC4gICovCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIFBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZC4gICovCisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogRXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZgorCQkJCQkgICBncm93c2Rvd24gdm1hIChtcHJvdGVjdCBvbmx5KS4gICovCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIEV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YKKwkJCQkJICAgZ3Jvd3N1cCB2bWEgKG1wcm90ZWN0IG9ubHkpLiAgKi8KKworLyogU2hhcmluZyB0eXBlcyAobXVzdCBjaG9vc2Ugb25lIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSkuICAqLworI2RlZmluZSBNQVBfU0hBUkVECTB4MDEJCS8qIFNoYXJlIGNoYW5nZXMuICAqLworI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBNQVBfVFlQRQkweDBmCQkvKiBNYXNrIGZvciB0eXBlIG9mIG1hcHBpbmcuICAqLworI2VuZGlmCisKKy8qIE90aGVyIGZsYWdzLiAgKi8KKyNkZWZpbmUgTUFQX0ZJWEVECTB4MTAJCS8qIEludGVycHJldCBhZGRyIGV4YWN0bHkuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9GSUxFCTAKKyMgZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogRG9uJ3QgdXNlIGEgZmlsZS4gICovCisjIGRlZmluZSBNQVBfQU5PTglNQVBfQU5PTllNT1VTCisjIGRlZmluZSBNQVBfMzJCSVQJMHg0MAkJLyogT25seSBnaXZlIG91dCAzMi1iaXQgYWRkcmVzc2VzLiAgKi8KKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgTGludXgtc3BlY2lmaWMuICAqLworI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMDEwMAkJLyogU3RhY2stbGlrZSBzZWdtZW50LiAgKi8KKyMgZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwMDgwMAkJLyogRVRYVEJTWSAqLworIyBkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgwMTAwMAkJLyogTWFyayBpdCBhcyBhbiBleGVjdXRhYmxlLiAgKi8KKyMgZGVmaW5lIE1BUF9MT0NLRUQJMHgwMjAwMAkJLyogTG9jayB0aGUgbWFwcGluZy4gICovCisjIGRlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMDAJCS8qIERvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMuICAqLworIyBkZWZpbmUgTUFQX1BPUFVMQVRFCTB4MDgwMDAJCS8qIFBvcHVsYXRlIChwcmVmYXVsdCkgcGFnZXRhYmxlcy4gICovCisjIGRlZmluZSBNQVBfTk9OQkxPQ0sJMHgxMDAwMAkJLyogRG8gbm90IGJsb2NrIG9uIElPLiAgKi8KKyNlbmRpZgorCisvKiBGbGFncyB0byBgbXN5bmMnLiAgKi8KKyNkZWZpbmUgTVNfQVNZTkMJMQkJLyogU3luYyBtZW1vcnkgYXN5bmNocm9ub3VzbHkuICAqLworI2RlZmluZSBNU19TWU5DCQk0CQkvKiBTeW5jaHJvbm91cyBtZW1vcnkgc3luYy4gICovCisjZGVmaW5lIE1TX0lOVkFMSURBVEUJMgkJLyogSW52YWxpZGF0ZSB0aGUgY2FjaGVzLiAgKi8KKworLyogRmxhZ3MgZm9yIGBtbG9ja2FsbCcuICAqLworI2RlZmluZSBNQ0xfQ1VSUkVOVAkxCQkvKiBMb2NrIGFsbCBjdXJyZW50bHkgbWFwcGVkIHBhZ2VzLiAgKi8KKyNkZWZpbmUgTUNMX0ZVVFVSRQkyCQkvKiBMb2NrIGFsbCBhZGRpdGlvbnMgdG8gYWRkcmVzcworCQkJCQkgICBzcGFjZS4gICovCisKKy8qIEZsYWdzIGZvciBgbXJlbWFwJy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNUkVNQVBfTUFZTU9WRQkxCisjIGRlZmluZSBNUkVNQVBfRklYRUQJMgorI2VuZGlmCisKKy8qIEFkdmljZSB0byBgbWFkdmlzZScuICAqLworI2lmZGVmIF9fVVNFX0JTRAorIyBkZWZpbmUgTUFEVl9OT1JNQUwJIDAJLyogTm8gZnVydGhlciBzcGVjaWFsIHRyZWF0bWVudC4gICovCisjIGRlZmluZSBNQURWX1JBTkRPTQkgMQkvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBNQURWX1NFUVVFTlRJQUwgMgkvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgTUFEVl9XSUxMTkVFRAkgMwkvKiBXaWxsIG5lZWQgdGhlc2UgcGFnZXMuICAqLworIyBkZWZpbmUgTUFEVl9ET05UTkVFRAkgNAkvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfUkVNT1ZFCSA5CS8qIFJlbW92ZSB0aGVzZSBwYWdlcyBhbmQgcmVzb3VyY2VzLiAgKi8KKyMgZGVmaW5lIE1BRFZfRE9OVEZPUksJIDEwCS8qIERvIG5vdCBpbmhlcml0IGFjcm9zcyBmb3JrLiAgKi8KKyMgZGVmaW5lIE1BRFZfRE9GT1JLCSAxMQkvKiBEbyBpbmhlcml0IGFjcm9zcyBmb3JrLiAgKi8KKyNlbmRpZgorCisvKiBUaGUgUE9TSVggcGVvcGxlIGhhZCB0byBpbnZlbnQgc2ltaWxhciBuYW1lcyBmb3IgdGhlIHNhbWUgdGhpbmdzLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBQT1NJWF9NQURWX05PUk1BTAkwIC8qIE5vIGZ1cnRoZXIgc3BlY2lhbCB0cmVhdG1lbnQuICAqLworIyBkZWZpbmUgUE9TSVhfTUFEVl9SQU5ET00JMSAvKiBFeHBlY3QgcmFuZG9tIHBhZ2UgcmVmZXJlbmNlcy4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX1NFUVVFTlRJQUwJMiAvKiBFeHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMuICAqLworIyBkZWZpbmUgUE9TSVhfTUFEVl9XSUxMTkVFRAkzIC8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjIGRlZmluZSBQT1NJWF9NQURWX0RPTlRORUVECTQgLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tb25ldGFyeS1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbW9uZXRhcnktbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDgwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbW9uZXRhcnktbGRibC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBtb25ldGFyeSBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01PTkVUQVJZX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbW9uZXRhcnktbGRibC5oPiBkaXJlY3RseTsgdXNlIDxtb25ldGFyeS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0xEQkxfUkVESVJfREVDTCAoc3RyZm1vbikKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKHN0cmZtb25fbCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21xdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTI4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbXF1ZXVlLmgKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9NUVVFVUVfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL21xdWV1ZS5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bXF1ZXVlLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK3R5cGVkZWYgaW50IG1xZF90OworCitzdHJ1Y3QgbXFfYXR0cgoreworICBsb25nIGludCBtcV9mbGFnczsJLyogTWVzc2FnZSBxdWV1ZSBmbGFncy4gICovCisgIGxvbmcgaW50IG1xX21heG1zZzsJLyogTWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMuICAqLworICBsb25nIGludCBtcV9tc2dzaXplOwkvKiBNYXhpbXVtIG1lc3NhZ2Ugc2l6ZS4gICovCisgIGxvbmcgaW50IG1xX2N1cm1zZ3M7CS8qIE51bWJlciBvZiBtZXNzYWdlcyBjdXJyZW50bHkgcXVldWVkLiAgKi8KKyAgbG9uZyBpbnQgX19wYWRbNF07Cit9OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21xdWV1ZTIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tcXVldWUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5MDYwOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tcXVldWUyLmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBtcSBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0ZDTlRMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvbXF1ZXVlMi5oPiBkaXJlY3RseTsgdXNlIDxtcXVldWUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogQ2hlY2sgdGhhdCBjYWxscyB0byBtcV9vcGVuIHdpdGggT19DUkVBVCBzZXQgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0aGlyZCBhbmQgZm91cnRoCisgICBwYXJhbWV0ZXIuICAqLworZXh0ZXJuIG1xZF90IG1xX29wZW4gKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19vZmxhZywgLi4uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBtcWRfdCBfX21xX29wZW5fMiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnKSBfX25vbm51bGwgKCgxKSk7CitleHRlcm4gbXFkX3QgX19SRURJUkVDVCAoX19tcV9vcGVuX2FsaWFzLCAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pLAorCQkJIG1xX29wZW4pIF9fbm9ubnVsbCAoKDEpKTsKK19fZXJyb3JkZWNsIChfX21xX29wZW5fd3JvbmdfbnVtYmVyX29mX2FyZ3MsCisJICAgICAibXFfb3BlbiBjYW4gYmUgY2FsbGVkIGVpdGhlciB3aXRoIDIgb3IgNCBhcmd1bWVudHMiKTsKK19fZXJyb3JkZWNsIChfX21xX29wZW5fbWlzc2luZ19tb2RlX2FuZF9hdHRyLAorCSAgICAgIm1xX29wZW4gd2l0aCBPX0NSRUFUIGluIHNlY29uZCBhcmd1bWVudCBuZWVkcyA0IGFyZ3VtZW50cyIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIG1xZF90CittcV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIC4uLikKK3sKKyAgaWYgKF9fdmFfYXJnX3BhY2tfbGVuICgpICE9IDAgJiYgX192YV9hcmdfcGFja19sZW4gKCkgIT0gMikKKyAgICBfX21xX29wZW5fd3JvbmdfbnVtYmVyX29mX2FyZ3MgKCk7CisKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX29mbGFnKSkKKyAgICB7CisgICAgICBpZiAoKF9fb2ZsYWcgJiBPX0NSRUFUKSAhPSAwICYmIF9fdmFfYXJnX3BhY2tfbGVuICgpID09IDApCisJeworCSAgX19tcV9vcGVuX21pc3NpbmdfbW9kZV9hbmRfYXR0ciAoKTsKKwkgIHJldHVybiBfX21xX29wZW5fMiAoX19uYW1lLCBfX29mbGFnKTsKKwl9CisgICAgICByZXR1cm4gX19tcV9vcGVuX2FsaWFzIChfX25hbWUsIF9fb2ZsYWcsIF9fdmFfYXJnX3BhY2sgKCkpOworICAgIH0KKworICBpZiAoX192YV9hcmdfcGFja19sZW4gKCkgPT0gMCkKKyAgICByZXR1cm4gX19tcV9vcGVuXzIgKF9fbmFtZSwgX19vZmxhZyk7CisKKyAgcmV0dXJuIF9fbXFfb3Blbl9hbGlhcyAoX19uYW1lLCBfX29mbGFnLCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tc3EuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9tc3EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIyMThhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL21zcS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX01TR19ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvbXNxLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvbXNnLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBEZWZpbmUgb3B0aW9ucyBmb3IgbWVzc2FnZSBxdWV1ZSBmdW5jdGlvbnMuICAqLworI2RlZmluZSBNU0dfTk9FUlJPUgkwMTAwMDAJLyogbm8gZXJyb3IgaWYgbWVzc2FnZSBpcyB0b28gYmlnICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNU0dfRVhDRVBUCTAyMDAwMAkvKiByZWN2IGFueSBtc2cgZXhjZXB0IG9mIHNwZWNpZmllZCB0eXBlICovCisjZW5kaWYKKworLyogVHlwZXMgdXNlZCBpbiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBtc2dxbnVtX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG1zZ2xlbl90OworCisvKiBTdHJ1Y3R1cmUgb2YgcmVjb3JkIGZvciBvbmUgbWVzc2FnZSBpbnNpZGUgdGhlIGtlcm5lbC4KKyAgIFRoZSB0eXBlIGBzdHJ1Y3QgbXNnJyBpcyBvcGFxdWUuICAqLworc3RydWN0IG1zcWlkX2RzCit7CisgIHN0cnVjdCBpcGNfcGVybSBtc2dfcGVybTsJLyogc3RydWN0dXJlIGRlc2NyaWJpbmcgb3BlcmF0aW9uIHBlcm1pc3Npb24gKi8KKyAgX190aW1lX3QgbXNnX3N0aW1lOwkJLyogdGltZSBvZiBsYXN0IG1zZ3NuZCBjb21tYW5kICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisjZW5kaWYKKyAgX190aW1lX3QgbXNnX3J0aW1lOwkJLyogdGltZSBvZiBsYXN0IG1zZ3JjdiBjb21tYW5kICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisjZW5kaWYKKyAgX190aW1lX3QgbXNnX2N0aW1lOwkJLyogdGltZSBvZiBsYXN0IGNoYW5nZSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQzOworI2VuZGlmCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fbXNnX2NieXRlczsgLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKyAgbXNncW51bV90IG1zZ19xbnVtOwkJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBvbiBxdWV1ZSAqLworICBtc2dsZW5fdCBtc2dfcWJ5dGVzOwkJLyogbWF4IG51bWJlciBvZiBieXRlcyBhbGxvd2VkIG9uIHF1ZXVlICovCisgIF9fcGlkX3QgbXNnX2xzcGlkOwkJLyogcGlkIG9mIGxhc3QgbXNnc25kKCkgKi8KKyAgX19waWRfdCBtc2dfbHJwaWQ7CQkvKiBwaWQgb2YgbGFzdCBtc2dyY3YoKSAqLworICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNTsKK307CisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKyMgZGVmaW5lIG1zZ19jYnl0ZXMJX19tc2dfY2J5dGVzCisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjIGRlZmluZSBNU0dfU1RBVCAxMQorIyBkZWZpbmUgTVNHX0lORk8gMTIKKworLyogYnVmZmVyIGZvciBtc2djdGwgY2FsbHMgSVBDX0lORk8sIE1TR19JTkZPICovCitzdHJ1Y3QgbXNnaW5mbworICB7CisgICAgaW50IG1zZ3Bvb2w7CisgICAgaW50IG1zZ21hcDsKKyAgICBpbnQgbXNnbWF4OworICAgIGludCBtc2dtbmI7CisgICAgaW50IG1zZ21uaTsKKyAgICBpbnQgbXNnc3N6OworICAgIGludCBtc2d0cWw7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IG1zZ3NlZzsKKyAgfTsKKworI2VuZGlmIC8qIF9fVVNFX01JU0MgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9uYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9uYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU5N2YyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL25hbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIGBOQU4nIGNvbnN0YW50IGZvciBJRUVFIDc1NCBtYWNoaW5lcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwxOTk2LDE5OTcsMTk5OSwyMDA0LDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BVEhfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL25hbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8bWF0aC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIElFRUUgTm90IEEgTnVtYmVyLiAgKi8KKworI2lmIF9fR05VQ19QUkVSRVEoMywzKQorCisjIGRlZmluZSBOQU4JKF9fYnVpbHRpbl9uYW5mICgiIikpCisKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKworIyBkZWZpbmUgTkFOIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKCh1bmlvbiB7IHVuc2lnbmVkIF9fbCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fU0lfXykpKTsgZmxvYXQgX19kOyB9KSAgXAorICAgIHsgX19sOiAweDdmYzAwMDAwVUwgfSkuX19kKQorCisjZWxzZQorCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfX25hbl9ieXRlcwkJeyAweDdmLCAweGMwLCAwLCAwIH0KKyMgZW5kaWYKKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIF9fbmFuX2J5dGVzCQl7IDAsIDAsIDB4YzAsIDB4N2YgfQorIyBlbmRpZgorCitzdGF0aWMgdW5pb24geyB1bnNpZ25lZCBjaGFyIF9fY1s0XTsgZmxvYXQgX19kOyB9IF9fbmFuX3VuaW9uCisgICAgX19hdHRyaWJ1dGVfdXNlZF9fID0geyBfX25hbl9ieXRlcyB9OworIyBkZWZpbmUgTkFOCShfX25hbl91bmlvbi5fX2QpCisKKyNlbmRpZgkvKiBHQ0MuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL25ldGRiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvbmV0ZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWRjNzMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL25ldGRiLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVREQl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL25ldGRiLmg+IGRpcmVjdGx5OyB1c2UgPG5ldGRiLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKworLyogRGVzY3JpcHRpb24gb2YgZGF0YSBiYXNlIGVudHJ5IGZvciBhIHNpbmdsZSBuZXR3b3JrLiAgTk9URTogaGVyZSBhCisgICBwb29yIGFzc3VtcHRpb24gaXMgbWFkZS4gIFRoZSBuZXR3b3JrIG51bWJlciBpcyBleHBlY3RlZCB0byBmaXQKKyAgIGludG8gYW4gdW5zaWduZWQgbG9uZyBpbnQgdmFyaWFibGUuICAqLworc3RydWN0IG5ldGVudAoreworICBjaGFyICpuX25hbWU7CQkJLyogT2ZmaWNpYWwgbmFtZSBvZiBuZXR3b3JrLiAgKi8KKyAgY2hhciAqKm5fYWxpYXNlczsJCS8qIEFsaWFzIGxpc3QuICAqLworICBpbnQgbl9hZGRydHlwZTsJCS8qIE5ldCBhZGRyZXNzIHR5cGUuICAqLworICB1aW50MzJfdCBuX25ldDsJCS8qIE5ldHdvcmsgbnVtYmVyLiAgKi8KK307CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzk5NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3BvbGwuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDEsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QT0xMX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9wb2xsLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvcG9sbC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisvKiBFdmVudCB0eXBlcyB0aGF0IGNhbiBiZSBwb2xsZWQgZm9yLiAgVGhlc2UgYml0cyBtYXkgYmUgc2V0IGluIGBldmVudHMnCisgICB0byBpbmRpY2F0ZSB0aGUgaW50ZXJlc3RpbmcgZXZlbnQgdHlwZXM7IHRoZXkgd2lsbCBhcHBlYXIgaW4gYHJldmVudHMnCisgICB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLworI2RlZmluZSBQT0xMSU4JCTB4MDAxCQkvKiBUaGVyZSBpcyBkYXRhIHRvIHJlYWQuICAqLworI2RlZmluZSBQT0xMUFJJCQkweDAwMgkJLyogVGhlcmUgaXMgdXJnZW50IGRhdGEgdG8gcmVhZC4gICovCisjZGVmaW5lIFBPTExPVVQJCTB4MDA0CQkvKiBXcml0aW5nIG5vdyB3aWxsIG5vdCBibG9jay4gICovCisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogVGhlc2UgdmFsdWVzIGFyZSBkZWZpbmVkIGluIFhQRzQuMi4gICovCisjIGRlZmluZSBQT0xMUkROT1JNCTB4MDQwCQkvKiBOb3JtYWwgZGF0YSBtYXkgYmUgcmVhZC4gICovCisjIGRlZmluZSBQT0xMUkRCQU5ECTB4MDgwCQkvKiBQcmlvcml0eSBkYXRhIG1heSBiZSByZWFkLiAgKi8KKyMgZGVmaW5lIFBPTExXUk5PUk0JMHgxMDAJCS8qIFdyaXRpbmcgbm93IHdpbGwgbm90IGJsb2NrLiAgKi8KKyMgZGVmaW5lIFBPTExXUkJBTkQJMHgyMDAJCS8qIFByaW9yaXR5IGRhdGEgbWF5IGJlIHdyaXR0ZW4uICAqLworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZXNlIGFyZSBleHRlbnNpb25zIGZvciBMaW51eC4gICovCisjIGRlZmluZSBQT0xMTVNHCTB4NDAwCisjIGRlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAorIyBkZWZpbmUgUE9MTFJESFVQCTB4MjAwMAorI2VuZGlmCisKKy8qIEV2ZW50IHR5cGVzIGFsd2F5cyBpbXBsaWNpdGx5IHBvbGxlZCBmb3IuICBUaGVzZSBiaXRzIG5lZWQgbm90IGJlIHNldCBpbgorICAgYGV2ZW50cycsIGJ1dCB0aGV5IHdpbGwgYXBwZWFyIGluIGByZXZlbnRzJyB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mCisgICB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgKi8KKyNkZWZpbmUgUE9MTEVSUgkJMHgwMDgJCS8qIEVycm9yIGNvbmRpdGlvbi4gICovCisjZGVmaW5lIFBPTExIVVAJCTB4MDEwCQkvKiBIdW5nIHVwLiAgKi8KKyNkZWZpbmUgUE9MTE5WQUwJMHgwMjAJCS8qIEludmFsaWQgcG9sbGluZyByZXF1ZXN0LiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wb3NpeDFfbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9zaXgxX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzU4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9zaXgxX2xpbS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5Myw5Niw5OCwyMDAwLTIwMDMsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiAyLjkuMiBNaW5pbXVtIFZhbHVlcwlBZGRlZCB0byA8bGltaXRzLmg+CisgKgorICoJTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZglfQklUU19QT1NJWDFfTElNX0gKKyNkZWZpbmUJX0JJVFNfUE9TSVgxX0xJTV9ICTEKKworCisvKiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkLW1hbmRhdGVkIG1pbmltdW0gdmFsdWVzLiAgKi8KKworLyogTWluaW11bSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBpbiBvbmUgbGlzdCBJL08gY2FsbC4gICovCisjZGVmaW5lIF9QT1NJWF9BSU9fTElTVElPX01BWAkyCisKKy8qIE1pbmltYWwgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9ucy4gICovCisjZGVmaW5lIF9QT1NJWF9BSU9fTUFYCQkxCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGFyZ3VtZW50cyB0byBgZXhlY3ZlJywgaW5jbHVkaW5nIGVudmlyb25tZW50LiAgKi8KKyNkZWZpbmUJX1BPU0lYX0FSR19NQVgJCTQwOTYKKworLyogTWF4aW11bSBzaW11bHRhbmVvdXMgcHJvY2Vzc2VzIHBlciByZWFsIHVzZXIgSUQuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9DSElMRF9NQVgJMjUKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfQ0hJTERfTUFYCTYKKyNlbmRpZgorCisvKiBNaW5pbWFsIG51bWJlciBvZiB0aW1lciBleHBpcmF0aW9uIG92ZXJydW5zLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0RFTEFZVElNRVJfTUFYCTMyCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgaG9zdCBuYW1lIChub3QgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsKQorICAgYXMgcmV0dXJuZWQgZnJvbSB0aGUgR0VUSE9TVE5BTUUgZnVuY3Rpb24uICAqLworI2RlZmluZSBfUE9TSVhfSE9TVF9OQU1FX01BWAkyNTUKKworLyogTWF4aW11bSBsaW5rIGNvdW50IG9mIGEgZmlsZS4gICovCisjZGVmaW5lCV9QT1NJWF9MSU5LX01BWAkJOAorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBsb2dpbiBuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0xPR0lOX05BTUVfTUFYCTkKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgdGVybWluYWwgY2Fub25pY2FsIGlucHV0IHF1ZXVlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01BWF9DQU5PTgkyNTUKKworLyogTnVtYmVyIG9mIGJ5dGVzIGZvciB3aGljaCBzcGFjZSB3aWxsIGJlCisgICBhdmFpbGFibGUgaW4gYSB0ZXJtaW5hbCBpbnB1dCBxdWV1ZS4gICovCisjZGVmaW5lCV9QT1NJWF9NQVhfSU5QVVQJMjU1CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2UgcXVldWVzIG9wZW4gZm9yIGEgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9NUV9PUEVOX01BWAk4CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBtZXNzYWdlIHByaW9yaXRpZXMuICAqLworI2RlZmluZSBfUE9TSVhfTVFfUFJJT19NQVgJMzIKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIGEgZmlsZW5hbWUuICAqLworI2RlZmluZQlfUE9TSVhfTkFNRV9NQVgJCTE0CisKKy8qIE51bWJlciBvZiBzaW11bHRhbmVvdXMgc3VwcGxlbWVudGFyeSBncm91cCBJRHMgcGVyIHByb2Nlc3MuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9QT1NJWF9OR1JPVVBTX01BWAk4CisjZWxzZQorIyBkZWZpbmUgX1BPU0lYX05HUk9VUFNfTUFYCTAKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZmlsZXMgb25lIHByb2Nlc3MgY2FuIGhhdmUgb3BlbiBhdCBvbmNlLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGRlZmluZSBfUE9TSVhfT1BFTl9NQVgJMjAKKyNlbHNlCisjIGRlZmluZSBfUE9TSVhfT1BFTl9NQVgJMTYKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgdGhhdCBhIHByb2Nlc3MgbWF5IGV4YW1pbmUgd2l0aCBgcHNlbGVjdCcgb3IKKyAgIGBzZWxlY3QnLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0ZEX1NFVFNJWkUJX1BPU0lYX09QRU5fTUFYCisKKy8qIE51bWJlciBvZiBieXRlcyBpbiBhIHBhdGhuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1BBVEhfTUFYCQkyNTYKKworLyogTnVtYmVyIG9mIGJ5dGVzIHRoYW4gY2FuIGJlIHdyaXR0ZW4gYXRvbWljYWxseSB0byBhIHBpcGUuICAqLworI2RlZmluZQlfUE9TSVhfUElQRV9CVUYJCTUxMgorCisvKiBUaGUgbnVtYmVyIG9mIHJlcGVhdGVkIG9jY3VycmVuY2VzIG9mIGEgQlJFIHBlcm1pdHRlZCBieSB0aGUKKyAgIFJFR0VYRUMgYW5kIFJFR0NPTVAgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGludGVydmFsIG5vdGF0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFX0RVUF9NQVgJMjU1CisKKy8qIE1pbmltYWwgbnVtYmVyIG9mIHJlYWx0aW1lIHNpZ25hbHMgcmVzZXJ2ZWQgZm9yIHRoZSBhcHBsaWNhdGlvbi4gICovCisjZGVmaW5lIF9QT1NJWF9SVFNJR19NQVgJOAorCisvKiBOdW1iZXIgb2Ygc2VtYXBob3JlcyBhIHByb2Nlc3MgY2FuIGhhdmUuICAqLworI2RlZmluZSBfUE9TSVhfU0VNX05TRU1TX01BWAkyNTYKKworLyogTWF4aW1hbCB2YWx1ZSBvZiBhIHNlbWFwaG9yZS4gICovCisjZGVmaW5lIF9QT1NJWF9TRU1fVkFMVUVfTUFYCTMyNzY3CisKKy8qIE51bWJlciBvZiBwZW5kaW5nIHJlYWx0aW1lIHNpZ25hbHMuICAqLworI2RlZmluZSBfUE9TSVhfU0lHUVVFVUVfTUFYCTMyCisKKy8qIExhcmdlc3QgdmFsdWUgb2YgYSBgc3NpemVfdCcuICAqLworI2RlZmluZQlfUE9TSVhfU1NJWkVfTUFYCTMyNzY3CisKKy8qIE51bWJlciBvZiBzdHJlYW1zIGEgcHJvY2VzcyBjYW4gaGF2ZSBvcGVuIGF0IG9uY2UuICAqLworI2RlZmluZQlfUE9TSVhfU1RSRUFNX01BWAk4CisKKy8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzeW1ib2xpYyBsaW5rLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NZTUxJTktfTUFYCTI1NQorCisvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbGljIGxpbmtzIHRoYXQgY2FuIGJlIHRyYXZlcnNlZCBpbiB0aGUKKyAgIHJlc29sdXRpb24gb2YgYSBwYXRobmFtZSBpbiB0aGUgYWJzZW5jZSBvZiBhIGxvb3AuICAqLworI2RlZmluZSBfUE9TSVhfU1lNTE9PUF9NQVgJOAorCisvKiBOdW1iZXIgb2YgdGltZXIgZm9yIGEgcHJvY2Vzcy4gICovCisjZGVmaW5lIF9QT1NJWF9USU1FUl9NQVgJMzIKKworLyogTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHR0eSBuYW1lLiAgKi8KKyNkZWZpbmUJX1BPU0lYX1RUWV9OQU1FX01BWAk5CisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgdGltZXpvbmUgbmFtZSAoZWxlbWVudCBvZiBgdHpuYW1lJykuICAqLworI2RlZmluZQlfUE9TSVhfVFpOQU1FX01BWAk2CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgY2FuIGJlIHF1ZXVlZCBvbiBhIHNvY2tldC4gICovCisjZGVmaW5lCV9QT1NJWF9RTElNSVQJCTEKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgYnVmZmVyZWQgb24gYSBzb2NrZXQgZm9yIHNlbmQKKyAgIG9yIHJlY2VpdmUuICAqLworI2RlZmluZQlfUE9TSVhfSElXQVQJCV9QT1NJWF9QSVBFX0JVRgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBgaW92ZWMnIGFycmF5LiAgKi8KKyNkZWZpbmUJX1BPU0lYX1VJT19NQVhJT1YJMTYKKworLyogTWF4aW11bSBjbG9jayByZXNvbHV0aW9uIGluIG5hbm9zZWNvbmRzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0NMT0NLUkVTX01JTgkyMDAwMDAwMAorCisKKy8qIEdldCB0aGUgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgYWJvdmUuICAqLworI2luY2x1ZGUgPGJpdHMvbG9jYWxfbGltLmg+CisKKworI2lmbmRlZglTU0laRV9NQVgKKyMgZGVmaW5lIFNTSVpFX01BWAlMT05HX01BWAorI2VuZGlmCisKKworLyogVGhpcyB2YWx1ZSBpcyBhIGd1YXJhbnRlZWQgbWluaW11bSBtYXhpbXVtLgorICAgVGhlIGN1cnJlbnQgbWF4aW11bSBjYW4gYmUgZ290IGZyb20gYHN5c2NvbmYnLiAgKi8KKworI2lmbmRlZglOR1JPVVBTX01BWAorIyBkZWZpbmUgTkdST1VQU19NQVgJOAorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3Bvc2l4MV9saW0uaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wb3NpeDJfbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9zaXgyX2xpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDgzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9zaXgyX2xpbS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NiwgMTk5OSwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIE5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5OyBpbmNsdWRlIDxsaW1pdHMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmCV9CSVRTX1BPU0lYMl9MSU1fSAorI2RlZmluZQlfQklUU19QT1NJWDJfTElNX0gJMQorCisKKy8qIFRoZSBtYXhpbXVtIGBpYmFzZScgYW5kIGBvYmFzZScgdmFsdWVzIGFsbG93ZWQgYnkgdGhlIGBiYycgdXRpbGl0eS4gICovCisjZGVmaW5lCV9QT1NJWDJfQkNfQkFTRV9NQVgJCTk5CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBhbGxvd2VkIGluIGFuIGFycmF5IGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX0RJTV9NQVgJCTIwNDgKKworLyogVGhlIG1heGltdW0gYHNjYWxlJyB2YWx1ZSBhbGxvd2VkIGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX1NDQUxFX01BWAkJOTkKKworLyogVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3RyaW5nIGNvbnN0YW50IGFjY2VwdGVkIGJ5IHRoZSBgYmMnIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0JDX1NUUklOR19NQVgJCTEwMDAKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHdlaWdodHMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gYW4gZW50cnkgb2YKKyAgIHRoZSBMQ19DT0xMQVRFIGBvcmRlcicga2V5d29yZCBpbiB0aGUgbG9jYWxlIGRlZmluaXRpb24gZmlsZS4gICovCisjZGVmaW5lCV9QT1NJWDJfQ09MTF9XRUlHSFRTX01BWAkyCisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBleHByZXNzaW9ucyB0aGF0IGNhbiBiZSBuZXN0ZWQKKyAgIHdpdGhpbiBwYXJlbnRoZXNlcyBieSB0aGUgYGV4cHInIHV0aWxpdHkuICAqLworI2RlZmluZQlfUE9TSVgyX0VYUFJfTkVTVF9NQVgJCTMyCisKKy8qIFRoZSBtYXhpbXVtIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIGFuIGlucHV0IGxpbmUuICAqLworI2RlZmluZQlfUE9TSVgyX0xJTkVfTUFYCQkyMDQ4CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXBlYXRlZCBvY2N1cnJlbmNlcyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgcGVybWl0dGVkIHdoZW4gdXNpbmcgdGhlIGludGVydmFsIG5vdGF0aW9uIGBce00sTlx9Jy4gICovCisjZGVmaW5lCV9QT1NJWDJfUkVfRFVQX01BWAkJMjU1CisKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBhIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAgV2UgaGF2ZSBubworICAgZml4ZWQgbGltaXQsIDIwNDggaXMgYSBoaWdoIG51bWJlci4gICovCisjZGVmaW5lCV9QT1NJWDJfQ0hBUkNMQVNTX05BTUVfTUFYCTE0CisKKworLyogVGhlc2UgdmFsdWVzIGFyZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYywKKyAgIGFuZCBtYXkgdmFyeSB3aXRoaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICAgVGhlaXIgcHJlY2lzZSB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gc3lzY29uZi4gICovCisKKyNpZm5kZWYJQkNfQkFTRV9NQVgKKyNkZWZpbmUJQkNfQkFTRV9NQVgJCV9QT1NJWDJfQkNfQkFTRV9NQVgKKyNlbmRpZgorI2lmbmRlZglCQ19ESU1fTUFYCisjZGVmaW5lCUJDX0RJTV9NQVgJCV9QT1NJWDJfQkNfRElNX01BWAorI2VuZGlmCisjaWZuZGVmCUJDX1NDQUxFX01BWAorI2RlZmluZQlCQ19TQ0FMRV9NQVgJCV9QT1NJWDJfQkNfU0NBTEVfTUFYCisjZW5kaWYKKyNpZm5kZWYJQkNfU1RSSU5HX01BWAorI2RlZmluZQlCQ19TVFJJTkdfTUFYCQlfUE9TSVgyX0JDX1NUUklOR19NQVgKKyNlbmRpZgorI2lmbmRlZglDT0xMX1dFSUdIVFNfTUFYCisjZGVmaW5lCUNPTExfV0VJR0hUU19NQVgJMjU1CisjZW5kaWYKKyNpZm5kZWYJRVhQUl9ORVNUX01BWAorI2RlZmluZQlFWFBSX05FU1RfTUFYCQlfUE9TSVgyX0VYUFJfTkVTVF9NQVgKKyNlbmRpZgorI2lmbmRlZglMSU5FX01BWAorI2RlZmluZQlMSU5FX01BWAkJX1BPU0lYMl9MSU5FX01BWAorI2VuZGlmCisjaWZuZGVmCUNIQVJDTEFTU19OQU1FX01BWAorI2RlZmluZQlDSEFSQ0xBU1NfTkFNRV9NQVgJMjA0OAorI2VuZGlmCisKKy8qIFRoaXMgdmFsdWUgaXMgZGVmaW5lZCBsaWtlIHRoaXMgaW4gcmVnZXguaC4gICovCisjZGVmaW5lCVJFX0RVUF9NQVggKDB4N2ZmZikKKworI2VuZGlmCS8qIGJpdHMvcG9zaXgyX2xpbS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9zaXhfb3B0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcG9zaXhfb3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwNzk4YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wb3NpeF9vcHQuaApAQCAtMCwwICsxLDE4NCBAQAorLyogRGVmaW5lIFBPU0lYIG9wdGlvbnMgZm9yIExpbnV4LgorICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDQsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZglfUE9TSVhfT1BUX0gKKyNkZWZpbmUJX1BPU0lYX09QVF9ICTEKKworLyogSm9iIGNvbnRyb2wgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0pPQl9DT05UUk9MCTEKKworLyogUHJvY2Vzc2VzIGhhdmUgYSBzYXZlZCBzZXQtdXNlci1JRCBhbmQgYSBzYXZlZCBzZXQtZ3JvdXAtSUQuICAqLworI2RlZmluZQlfUE9TSVhfU0FWRURfSURTCTEKKworLyogUHJpb3JpdHkgc2NoZWR1bGluZyBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORwkyMDAxMTJMCisKKy8qIFN5bmNocm9uaXppbmcgZmlsZSBkYXRhIGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9TWU5DSFJPTklaRURfSU8JMjAwMTEyTAorCisvKiBUaGUgZnN5bmMgZnVuY3Rpb24gaXMgcHJlc2VudC4gICovCisjZGVmaW5lCV9QT1NJWF9GU1lOQwkyMDAxMTJMCisKKy8qIE1hcHBpbmcgb2YgZmlsZXMgdG8gbWVtb3J5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9NQVBQRURfRklMRVMJMjAwMTEyTAorCisvKiBMb2NraW5nIG9mIGFsbCBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01FTUxPQ0sJMjAwMTEyTAorCisvKiBMb2NraW5nIG9mIHJhbmdlcyBvZiBtZW1vcnkgaXMgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUJX1BPU0lYX01FTUxPQ0tfUkFOR0UJMjAwMTEyTAorCisvKiBTZXR0aW5nIG9mIG1lbW9yeSBwcm90ZWN0aW9ucyBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZQlfUE9TSVhfTUVNT1JZX1BST1RFQ1RJT04JMjAwMTEyTAorCisvKiBPbmx5IHJvb3QgY2FuIGNoYW5nZSBvd25lciBvZiBmaWxlLiAgKi8KKyNkZWZpbmUJX1BPU0lYX0NIT1dOX1JFU1RSSUNURUQJMQorCisvKiBgY19jYycgbWVtYmVyIG9mICdzdHJ1Y3QgdGVybWlvcycgc3RydWN0dXJlIGNhbiBiZSBkaXNhYmxlZCBieQorICAgdXNpbmcgdGhlIHZhbHVlIF9QT1NJWF9WRElTQUJMRS4gICovCisjZGVmaW5lCV9QT1NJWF9WRElTQUJMRQknXDAnCisKKy8qIEZpbGVuYW1lcyBhcmUgbm90IHNpbGVudGx5IHRydW5jYXRlZC4gICovCisjZGVmaW5lCV9QT1NJWF9OT19UUlVOQwkxCisKKy8qIFgvT3BlbiByZWFsdGltZSBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9YT1BFTl9SRUFMVElNRQkxCisKKy8qIFgvT3BlbiB0aHJlYWQgcmVhbHRpbWUgc3VwcG9ydCBpcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfWE9QRU5fUkVBTFRJTUVfVEhSRUFEUwkxCisKKy8qIFhQRzQuMiBzaGFyZWQgbWVtb3J5IGlzIHN1cHBvcnRlZC4gICovCisjZGVmaW5lCV9YT1BFTl9TSE0JMQorCisvKiBUZWxsIHdlIGhhdmUgUE9TSVggdGhyZWFkcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURTCTIwMDExMkwKKworLyogV2UgaGF2ZSB0aGUgcmVlbnRyYW50IGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gUE9TSVguICAqLworI2RlZmluZSBfUE9TSVhfUkVFTlRSQU5UX0ZVTkNUSU9OUyAgICAgIDEKKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUwkyMDAxMTJMCisKKy8qIFdlIHByb3ZpZGUgcHJpb3JpdHkgc2NoZWR1bGluZyBmb3IgdGhyZWFkcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORwkyMDAxMTJMCisKKy8qIFdlIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN0YWNrIHNpemVzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQkyMDAxMTJMCisKKy8qIFdlIHN1cHBvcnQgdXNlci1kZWZpbmVkIHN0YWNrcy4gICovCisjZGVmaW5lIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS0FERFIJMjAwMTEyTAorCisvKiBXZSBzdXBwb3J0IHByaW9yaXR5IGluaGVyaXRlbmNlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9QUklPX0lOSEVSSVQJMjAwMTEyTAorCisvKiBXZSBzdXBwb3J0IHByaW9yaXR5IHByb3RlY3Rpb24sIHRob3VnaCBvbmx5IGZvciBub24tcm9idXN0CisgICBtdXRleGVzLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9QUklPX1BST1RFQ1QJMjAwMTEyTAorCisvKiBXZSBzdXBwb3J0IFBPU0lYLjFiIHNlbWFwaG9yZXMuICAqLworI2RlZmluZSBfUE9TSVhfU0VNQVBIT1JFUwkyMDAxMTJMCisKKy8qIFJlYWwtdGltZSBzaWduYWxzIGFyZSBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfUkVBTFRJTUVfU0lHTkFMUwkyMDAxMTJMCisKKy8qIFdlIHN1cHBvcnQgYXN5bmNocm9ub3VzIEkvTy4gICovCisjZGVmaW5lIF9QT1NJWF9BU1lOQ0hST05PVVNfSU8JMjAwMTEyTAorI2RlZmluZSBfUE9TSVhfQVNZTkNfSU8JCTEKKy8qIEFsdGVybmF0aXZlIG5hbWUgZm9yIFVuaXg5OC4gICovCisjZGVmaW5lIF9MRlNfQVNZTkNIUk9OT1VTX0lPCTEKKy8qIFN1cHBvcnQgZm9yIHByaW9yaXRpemF0aW9uIGlzIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1BSSU9SSVRJWkVEX0lPCTIwMDExMkwKKworLyogVGhlIExGUyBzdXBwb3J0IGluIGFzeW5jaHJvbm91cyBJL08gaXMgYWxzbyBhdmFpbGFibGUuICAqLworI2RlZmluZSBfTEZTNjRfQVNZTkNIUk9OT1VTX0lPCTEKKworLyogVGhlIHJlc3Qgb2YgdGhlIExGUyBpcyBhbHNvIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9MRlNfTEFSR0VGSUxFCQkxCisjZGVmaW5lIF9MRlM2NF9MQVJHRUZJTEUJMQorI2RlZmluZSBfTEZTNjRfU1RESU8JCTEKKworLyogUE9TSVggc2hhcmVkIG1lbW9yeSBvYmplY3RzIGFyZSBpbXBsZW1lbnRlZC4gICovCisjZGVmaW5lIF9QT1NJWF9TSEFSRURfTUVNT1JZX09CSkVDVFMJMjAwMTEyTAorCisvKiBDUFUtdGltZSBjbG9ja3Mgc3VwcG9ydCBuZWVkcyB0byBiZSBjaGVja2VkIGF0IHJ1bnRpbWUuICAqLworI2RlZmluZSBfUE9TSVhfQ1BVVElNRQkwCisKKy8qIENsb2NrIHN1cHBvcnQgaW4gdGhyZWFkcyBtdXN0IGJlIGFsc28gY2hlY2tlZCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9DUFVUSU1FCTAKKworLyogR05VIGxpYmMgcHJvdmlkZXMgcmVndWxhciBleHByZXNzaW9uIGhhbmRsaW5nLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JFR0VYUAkxCisKKy8qIFJlYWRlci9Xcml0ZXIgbG9ja3MgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9SRUFERVJfV1JJVEVSX0xPQ0tTCTIwMDExMkwKKworLyogV2UgaGF2ZSBhIFBPU0lYIHNoZWxsLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1NIRUxMCTEKKworLyogV2Ugc3VwcG9ydCB0aGUgVGltZW91dHMgb3B0aW9uLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RJTUVPVVRTCTIwMDExMkwKKworLyogV2Ugc3VwcG9ydCBzcGlubG9ja3MuICAqLworI2RlZmluZSBfUE9TSVhfU1BJTl9MT0NLUwkyMDAxMTJMCisKKy8qIFRoZSBgc3Bhd24nIGZ1bmN0aW9uIGZhbWlseSBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfU1BBV04JMjAwMTEyTAorCisvKiBXZSBoYXZlIFBPU0lYIHRpbWVycy4gICovCisjZGVmaW5lIF9QT1NJWF9USU1FUlMJMjAwMTEyTAorCisvKiBUaGUgYmFycmllciBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9CQVJSSUVSUwkyMDAxMTJMCisKKy8qIFBPU0lYIG1lc3NhZ2UgcXVldWVzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZQlfUE9TSVhfTUVTU0FHRV9QQVNTSU5HCTIwMDExMkwKKworLyogVGhyZWFkIHByb2Nlc3Mtc2hhcmVkIHN5bmNocm9uaXphdGlvbiBpcyBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBfUE9TSVhfVEhSRUFEX1BST0NFU1NfU0hBUkVECTIwMDExMkwKKworLyogVGhlIG1vbm90b25pYyBjbG9jayBtaWdodCBiZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfTU9OT1RPTklDX0NMT0NLCTAKKworLyogVGhlIGNsb2NrIHNlbGVjdGlvbiBpbnRlcmZhY2VzIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfUE9TSVhfQ0xPQ0tfU0VMRUNUSU9OCTIwMDExMkwKKworLyogQWR2aXNvcnkgaW5mb3JtYXRpb24gaW50ZXJmYWNlcyBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0FEVklTT1JZX0lORk8JMjAwMTEyTAorCisvKiBJUHY2IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX0lQVjYJMjAwMTEyTAorCisvKiBSYXcgc29ja2V0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1JBV19TT0NLRVRTCTIwMDExMkwKKworLyogV2UgaGF2ZSBhdCBsZWFzdCBvbmUgdGVybWluYWwuICAqLworI2RlZmluZSBfUE9TSVgyX0NIQVJfVEVSTQkyMDAxMTJMCisKKy8qIE5laXRoZXIgcHJvY2VzcyBub3IgdGhyZWFkIHNwb3JhZGljIHNlcnZlciBpbnRlcmZhY2VzIGlzIGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9TUE9SQURJQ19TRVJWRVIJLTEKKyNkZWZpbmUgX1BPU0lYX1RIUkVBRF9TUE9SQURJQ19TRVJWRVIJLTEKKworLyogdHJhY2UuaCBpcyBub3QgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1BPU0lYX1RSQUNFCS0xCisjZGVmaW5lIF9QT1NJWF9UUkFDRV9FVkVOVF9GSUxURVIJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0lOSEVSSVQJLTEKKyNkZWZpbmUgX1BPU0lYX1RSQUNFX0xPRwktMQorCisvKiBUeXBlZCBtZW1vcnkgb2JqZWN0cyBhcmUgbm90IGF2YWlsYWJsZS4gICovCisjZGVmaW5lIF9QT1NJWF9UWVBFRF9NRU1PUllfT0JKRUNUUwktMQorCisjZW5kaWYgLyogcG9zaXhfb3B0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wcmludGYtbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3ByaW50Zi1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkYzNmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wcmludGYtbGRibC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8cHJpbnRmLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFJJTlRGX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvcHJpbnRmLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8cHJpbnRmLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChwcmludGZfc2l6ZSkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTA5YzgxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oCkBAIC0wLDAgKzEsMjI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMywyMDA0LDIwMDUsMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfUFRIUkVBRFRZUEVTX0gKKyNkZWZpbmUgX0JJVFNfUFRIUkVBRFRZUEVTX0gJMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9BVFRSX1QgNTYKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfTVVURVhfVCA0MAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9NVVRFWEFUVFJfVCA0CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0NPTkRfVCA0OAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EQVRUUl9UIDQKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfUldMT0NLX1QgNTYKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfUldMT0NLQVRUUl9UIDgKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQkFSUklFUl9UIDMyCisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJBVFRSX1QgNAorI2Vsc2UKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQVRUUl9UIDM2CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX01VVEVYX1QgMjQKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfTVVURVhBVFRSX1QgNAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9DT05EX1QgNDgKKyMgZGVmaW5lIF9fU0laRU9GX1BUSFJFQURfQ09OREFUVFJfVCA0CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS19UIDMyCisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX1JXTE9DS0FUVFJfVCA4CisjIGRlZmluZSBfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVCAyMAorIyBkZWZpbmUgX19TSVpFT0ZfUFRIUkVBRF9CQVJSSUVSQVRUUl9UIDQKKyNlbmRpZgorCisKKy8qIFRocmVhZCBpZGVudGlmaWVycy4gIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdAorICAgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcHRocmVhZF90OworCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9BVFRSX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2F0dHJfdDsKKworCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBzdHJ1Y3QgX19wdGhyZWFkX2ludGVybmFsX2xpc3QKK3sKKyAgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9saXN0ICpfX3ByZXY7CisgIHN0cnVjdCBfX3B0aHJlYWRfaW50ZXJuYWxfbGlzdCAqX19uZXh0OworfSBfX3B0aHJlYWRfbGlzdF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IF9fcHRocmVhZF9pbnRlcm5hbF9zbGlzdAoreworICBzdHJ1Y3QgX19wdGhyZWFkX2ludGVybmFsX3NsaXN0ICpfX25leHQ7Cit9IF9fcHRocmVhZF9zbGlzdF90OworI2VuZGlmCisKKworLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBtdXRleCBoYW5kbGluZy4gIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGF0dHJpYnV0ZQorICAgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0IF9fcHRocmVhZF9tdXRleF9zCisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX2NvdW50OworICAgIGludCBfX293bmVyOworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgICB1bnNpZ25lZCBpbnQgX19udXNlcnM7CisjZW5kaWYKKyAgICAvKiBLSU5EIG11c3Qgc3RheSBhdCB0aGlzIHBvc2l0aW9uIGluIHRoZSBzdHJ1Y3R1cmUgdG8gbWFpbnRhaW4KKyAgICAgICBiaW5hcnkgY29tcGF0aWJpbGl0eS4gICovCisgICAgaW50IF9fa2luZDsKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgaW50IF9fc3BpbnM7CisgICAgX19wdGhyZWFkX2xpc3RfdCBfX2xpc3Q7CisjIGRlZmluZSBfX1BUSFJFQURfTVVURVhfSEFWRV9QUkVWCTEKKyNlbHNlCisgICAgdW5zaWduZWQgaW50IF9fbnVzZXJzOworICAgIF9fZXh0ZW5zaW9uX18gdW5pb24KKyAgICB7CisgICAgICBpbnQgX19zcGluczsKKyAgICAgIF9fcHRocmVhZF9zbGlzdF90IF9fbGlzdDsKKyAgICB9OworI2VuZGlmCisgIH0gX19kYXRhOworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX01VVEVYX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX211dGV4X3Q7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgY2hhciBfX3NpemVbX19TSVpFT0ZfUFRIUkVBRF9NVVRFWEFUVFJfVF07CisgIGludCBfX2FsaWduOworfSBwdGhyZWFkX211dGV4YXR0cl90OworCisKKy8qIERhdGEgc3RydWN0dXJlIGZvciBjb25kaXRpb25hbCB2YXJpYWJsZSBoYW5kbGluZy4gIFRoZSBzdHJ1Y3R1cmUgb2YKKyAgIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBub3QgZXhwb3NlZCBvbiBwdXJwb3NlLiAgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX2Z1dGV4OworICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3RvdGFsX3NlcTsKKyAgICBfX2V4dGVuc2lvbl9fIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX193YWtldXBfc2VxOworICAgIF9fZXh0ZW5zaW9uX18gdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3dva2VuX3NlcTsKKyAgICB2b2lkICpfX211dGV4OworICAgIHVuc2lnbmVkIGludCBfX253YWl0ZXJzOworICAgIHVuc2lnbmVkIGludCBfX2Jyb2FkY2FzdF9zZXE7CisgIH0gX19kYXRhOworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0NPTkRfVF07CisgIF9fZXh0ZW5zaW9uX18gbG9uZyBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX2NvbmRfdDsKKwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0NPTkRBVFRSX1RdOworICBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9jb25kYXR0cl90OworCisKKy8qIEtleXMgZm9yIHRocmVhZC1zcGVjaWZpYyBkYXRhICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBwdGhyZWFkX2tleV90OworCisKKy8qIE9uY2Utb25seSBleGVjdXRpb24gKi8KK3R5cGVkZWYgaW50IHB0aHJlYWRfb25jZV90OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIERhdGEgc3RydWN0dXJlIGZvciByZWFkLXdyaXRlIGxvY2sgdmFyaWFibGUgaGFuZGxpbmcuICBUaGUKKyAgIHN0cnVjdHVyZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUgaXMgbm90IGV4cG9zZWQgb24gcHVycG9zZS4gICovCit0eXBlZGVmIHVuaW9uCit7CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX25yX3JlYWRlcnM7CisgICAgdW5zaWduZWQgaW50IF9fcmVhZGVyc193YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fd3JpdGVyX3dha2V1cDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzX3F1ZXVlZDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl93cml0ZXJzX3F1ZXVlZDsKKyAgICBpbnQgX193cml0ZXI7CisgICAgaW50IF9fc2hhcmVkOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fcGFkMTsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3BhZDI7CisgICAgLyogRkxBR1MgbXVzdCBzdGF5IGF0IHRoaXMgcG9zaXRpb24gaW4gdGhlIHN0cnVjdHVyZSB0byBtYWludGFpbgorICAgICAgIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgX19mbGFnczsKKyAgfSBfX2RhdGE7CisjIGVsc2UKKyAgc3RydWN0CisgIHsKKyAgICBpbnQgX19sb2NrOworICAgIHVuc2lnbmVkIGludCBfX25yX3JlYWRlcnM7CisgICAgdW5zaWduZWQgaW50IF9fcmVhZGVyc193YWtldXA7CisgICAgdW5zaWduZWQgaW50IF9fd3JpdGVyX3dha2V1cDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl9yZWFkZXJzX3F1ZXVlZDsKKyAgICB1bnNpZ25lZCBpbnQgX19ucl93cml0ZXJzX3F1ZXVlZDsKKyAgICAvKiBGTEFHUyBtdXN0IHN0YXkgYXQgdGhpcyBwb3NpdGlvbiBpbiB0aGUgc3RydWN0dXJlIHRvIG1haW50YWluCisgICAgICAgYmluYXJ5IGNvbXBhdGliaWxpdHkuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX19mbGFnczsKKyAgICB1bnNpZ25lZCBjaGFyIF9fc2hhcmVkOworICAgIHVuc2lnbmVkIGNoYXIgX19wYWQxOworICAgIHVuc2lnbmVkIGNoYXIgX19wYWQyOworICAgIGludCBfX3dyaXRlcjsKKyAgfSBfX2RhdGE7CisjIGVuZGlmCisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfUldMT0NLX1RdOworICBsb25nIGludCBfX2FsaWduOworfSBwdGhyZWFkX3J3bG9ja190OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfUldMT0NLQVRUUl9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gcHRocmVhZF9yd2xvY2thdHRyX3Q7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUE9TSVggc3BpbmxvY2sgZGF0YSB0eXBlLiAgKi8KK3R5cGVkZWYgdm9sYXRpbGUgaW50IHB0aHJlYWRfc3BpbmxvY2tfdDsKKworCisvKiBQT1NJWCBiYXJyaWVycyBkYXRhIHR5cGUuICBUaGUgc3RydWN0dXJlIG9mIHRoZSB0eXBlIGlzCisgICBkZWxpYmVyYXRlbHkgbm90IGV4cG9zZWQuICAqLwordHlwZWRlZiB1bmlvbgoreworICBjaGFyIF9fc2l6ZVtfX1NJWkVPRl9QVEhSRUFEX0JBUlJJRVJfVF07CisgIGxvbmcgaW50IF9fYWxpZ247Cit9IHB0aHJlYWRfYmFycmllcl90OworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1BUSFJFQURfQkFSUklFUkFUVFJfVF07CisgIGludCBfX2FsaWduOworfSBwdGhyZWFkX2JhcnJpZXJhdHRyX3Q7CisjZW5kaWYKKworCisjaWYgX19XT1JEU0laRSA9PSAzMgorLyogRXh0cmEgYXR0cmlidXRlcyBmb3IgdGhlIGNsZWFudXAgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlIF9fYXR0cmlidXRlX18gKChfX3JlZ3Bhcm1fXyAoMSkpKQorI2VuZGlmCisKKyNlbmRpZgkvKiBiaXRzL3B0aHJlYWR0eXBlcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcmVzb3VyY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNmNkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvcmVzb3VyY2UuaApAQCAtMCwwICsxLDIyNSBAQAorLyogQml0IHZhbHVlcyAmIHN0cnVjdHVyZXMgZm9yIHJlc291cmNlIGxpbWl0cy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDQsIDIwMDUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUkVTT1VSQ0VfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3Jlc291cmNlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogVHJhbnNtdXRlIGRlZmluZXMgdG8gZW51bWVyYXRpb25zLiAgVGhlIG1hY3JvIHJlLWRlZmluaXRpb25zIGFyZQorICAgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBwcm9ncmFtcyB3YW50IHRvIHRlc3QgZm9yIG9wZXJhdGluZyBzeXN0ZW0KKyAgIGZlYXR1cmVzIHdpdGggI2lmZGVmIFJVU0FHRV9TRUxGLiAgSW4gSVNPIEMgdGhlIHJlZmxleGl2ZQorICAgZGVmaW5pdGlvbiBpcyBhIG5vLW9wLiAgKi8KKworLyogS2luZHMgb2YgcmVzb3VyY2UgbGltaXQuICAqLworZW51bSBfX3JsaW1pdF9yZXNvdXJjZQoreworICAvKiBQZXItcHJvY2VzcyBDUFUgbGltaXQsIGluIHNlY29uZHMuICAqLworICBSTElNSVRfQ1BVID0gMCwKKyNkZWZpbmUgUkxJTUlUX0NQVSBSTElNSVRfQ1BVCisKKyAgLyogTGFyZ2VzdCBmaWxlIHRoYXQgY2FuIGJlIGNyZWF0ZWQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX0ZTSVpFID0gMSwKKyNkZWZpbmUJUkxJTUlUX0ZTSVpFIFJMSU1JVF9GU0laRQorCisgIC8qIE1heGltdW0gc2l6ZSBvZiBkYXRhIHNlZ21lbnQsIGluIGJ5dGVzLiAgKi8KKyAgUkxJTUlUX0RBVEEgPSAyLAorI2RlZmluZQlSTElNSVRfREFUQSBSTElNSVRfREFUQQorCisgIC8qIE1heGltdW0gc2l6ZSBvZiBzdGFjayBzZWdtZW50LCBpbiBieXRlcy4gICovCisgIFJMSU1JVF9TVEFDSyA9IDMsCisjZGVmaW5lCVJMSU1JVF9TVEFDSyBSTElNSVRfU1RBQ0sKKworICAvKiBMYXJnZXN0IGNvcmUgZmlsZSB0aGF0IGNhbiBiZSBjcmVhdGVkLCBpbiBieXRlcy4gICovCisgIFJMSU1JVF9DT1JFID0gNCwKKyNkZWZpbmUJUkxJTUlUX0NPUkUgUkxJTUlUX0NPUkUKKworICAvKiBMYXJnZXN0IHJlc2lkZW50IHNldCBzaXplLCBpbiBieXRlcy4KKyAgICAgVGhpcyBhZmZlY3RzIHN3YXBwaW5nOyBwcm9jZXNzZXMgdGhhdCBhcmUgZXhjZWVkaW5nIHRoZWlyCisgICAgIHJlc2lkZW50IHNldCBzaXplIHdpbGwgYmUgbW9yZSBsaWtlbHkgdG8gaGF2ZSBwaHlzaWNhbCBtZW1vcnkKKyAgICAgdGFrZW4gZnJvbSB0aGVtLiAgKi8KKyAgX19STElNSVRfUlNTID0gNSwKKyNkZWZpbmUJUkxJTUlUX1JTUyBfX1JMSU1JVF9SU1MKKworICAvKiBOdW1iZXIgb2Ygb3BlbiBmaWxlcy4gICovCisgIFJMSU1JVF9OT0ZJTEUgPSA3LAorICBfX1JMSU1JVF9PRklMRSA9IFJMSU1JVF9OT0ZJTEUsIC8qIEJTRCBuYW1lIGZvciBzYW1lLiAgKi8KKyNkZWZpbmUgUkxJTUlUX05PRklMRSBSTElNSVRfTk9GSUxFCisjZGVmaW5lIFJMSU1JVF9PRklMRSBfX1JMSU1JVF9PRklMRQorCisgIC8qIEFkZHJlc3Mgc3BhY2UgbGltaXQuICAqLworICBSTElNSVRfQVMgPSA5LAorI2RlZmluZSBSTElNSVRfQVMgUkxJTUlUX0FTCisKKyAgLyogTnVtYmVyIG9mIHByb2Nlc3Nlcy4gICovCisgIF9fUkxJTUlUX05QUk9DID0gNiwKKyNkZWZpbmUgUkxJTUlUX05QUk9DIF9fUkxJTUlUX05QUk9DCisKKyAgLyogTG9ja2VkLWluLW1lbW9yeSBhZGRyZXNzIHNwYWNlLiAgKi8KKyAgX19STElNSVRfTUVNTE9DSyA9IDgsCisjZGVmaW5lIFJMSU1JVF9NRU1MT0NLIF9fUkxJTUlUX01FTUxPQ0sKKworICAvKiBNYXhpbXVtIG51bWJlciBvZiBmaWxlIGxvY2tzLiAgKi8KKyAgX19STElNSVRfTE9DS1MgPSAxMCwKKyNkZWZpbmUgUkxJTUlUX0xPQ0tTIF9fUkxJTUlUX0xPQ0tTCisKKyAgLyogTWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgX19STElNSVRfU0lHUEVORElORyA9IDExLAorI2RlZmluZSBSTElNSVRfU0lHUEVORElORyBfX1JMSU1JVF9TSUdQRU5ESU5HCisKKyAgLyogTWF4aW11bSBieXRlcyBpbiBQT1NJWCBtZXNzYWdlIHF1ZXVlcy4gICovCisgIF9fUkxJTUlUX01TR1FVRVVFID0gMTIsCisjZGVmaW5lIFJMSU1JVF9NU0dRVUVVRSBfX1JMSU1JVF9NU0dRVUVVRQorCisgIC8qIE1heGltdW0gbmljZSBwcmlvcml0eSBhbGxvd2VkIHRvIHJhaXNlIHRvLgorICAgICBOaWNlIGxldmVscyAxOSAuLiAtMjAgY29ycmVzcG9uZCB0byAwIC4uIDM5CisgICAgIHZhbHVlcyBvZiB0aGlzIHJlc291cmNlIGxpbWl0LiAgKi8KKyAgX19STElNSVRfTklDRSA9IDEzLAorI2RlZmluZSBSTElNSVRfTklDRSBfX1JMSU1JVF9OSUNFCisKKyAgLyogTWF4aW11bSByZWFsdGltZSBwcmlvcml0eSBhbGxvd2VkIGZvciBub24tcHJpdmlsZWRnZWQKKyAgICAgcHJvY2Vzc2VzLiAgKi8KKyAgX19STElNSVRfUlRQUklPID0gMTQsCisjZGVmaW5lIFJMSU1JVF9SVFBSSU8gX19STElNSVRfUlRQUklPCisKKyAgX19STElNSVRfTkxJTUlUUyA9IDE1LAorICBfX1JMSU1fTkxJTUlUUyA9IF9fUkxJTUlUX05MSU1JVFMKKyNkZWZpbmUgUkxJTUlUX05MSU1JVFMgX19STElNSVRfTkxJTUlUUworI2RlZmluZSBSTElNX05MSU1JVFMgX19STElNX05MSU1JVFMKK307CisKKy8qIFZhbHVlIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gbGltaXQuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjIGRlZmluZSBSTElNX0lORklOSVRZICgodW5zaWduZWQgbG9uZyBpbnQpKH4wVUwpKQorI2Vsc2UKKyMgZGVmaW5lIFJMSU1fSU5GSU5JVFkgMHhmZmZmZmZmZmZmZmZmZmZmdUxMCisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisjIGRlZmluZSBSTElNNjRfSU5GSU5JVFkgMHhmZmZmZmZmZmZmZmZmZmZmdUxMCisjZW5kaWYKKworLyogV2UgY2FuIHJlcHJlc2VudCBhbGwgbGltaXRzLiAgKi8KKyNkZWZpbmUgUkxJTV9TQVZFRF9NQVgJUkxJTV9JTkZJTklUWQorI2RlZmluZSBSTElNX1NBVkVEX0NVUglSTElNX0lORklOSVRZCisKKworLyogVHlwZSBmb3IgcmVzb3VyY2UgcXVhbnRpdHkgbWVhc3VyZW1lbnQuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fcmxpbV90IHJsaW1fdDsKKyNlbHNlCit0eXBlZGVmIF9fcmxpbTY0X3QgcmxpbV90OworI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgX19ybGltNjRfdCBybGltNjRfdDsKKyNlbmRpZgorCitzdHJ1Y3QgcmxpbWl0CisgIHsKKyAgICAvKiBUaGUgY3VycmVudCAoc29mdCkgbGltaXQuICAqLworICAgIHJsaW1fdCBybGltX2N1cjsKKyAgICAvKiBUaGUgaGFyZCBsaW1pdC4gICovCisgICAgcmxpbV90IHJsaW1fbWF4OworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBybGltaXQ2NAorICB7CisgICAgLyogVGhlIGN1cnJlbnQgKHNvZnQpIGxpbWl0LiAgKi8KKyAgICBybGltNjRfdCBybGltX2N1cjsKKyAgICAvKiBUaGUgaGFyZCBsaW1pdC4gICovCisgICAgcmxpbTY0X3QgcmxpbV9tYXg7CisgfTsKKyNlbmRpZgorCisvKiBXaG9zZSB1c2FnZSBzdGF0aXN0aWNzIGRvIHlvdSB3YW50PyAgKi8KK2VudW0gX19ydXNhZ2Vfd2hvCit7CisgIC8qIFRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworICBSVVNBR0VfU0VMRiA9IDAsCisjZGVmaW5lIFJVU0FHRV9TRUxGIFJVU0FHRV9TRUxGCisKKyAgLyogQWxsIG9mIGl0cyB0ZXJtaW5hdGVkIGNoaWxkIHByb2Nlc3Nlcy4gICovCisgIFJVU0FHRV9DSElMRFJFTiA9IC0xCisjZGVmaW5lIFJVU0FHRV9DSElMRFJFTiBSVVNBR0VfQ0hJTERSRU4KK307CisKKyNkZWZpbmUgX19uZWVkX3RpbWV2YWwKKyNpbmNsdWRlIDxiaXRzL3RpbWUuaD4JCS8qIEZvciBgc3RydWN0IHRpbWV2YWwnLiAgKi8KKworLyogU3RydWN0dXJlIHdoaWNoIHNheXMgaG93IG11Y2ggb2YgZWFjaCByZXNvdXJjZSBoYXMgYmVlbiB1c2VkLiAgKi8KK3N0cnVjdCBydXNhZ2UKKyAgeworICAgIC8qIFRvdGFsIGFtb3VudCBvZiB1c2VyIHRpbWUgdXNlZC4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7CisgICAgLyogVG90YWwgYW1vdW50IG9mIHN5c3RlbSB0aW1lIHVzZWQuICAqLworICAgIHN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOworICAgIC8qIE1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgKGluIGtpbG9ieXRlcykuICAqLworICAgIGxvbmcgaW50IHJ1X21heHJzczsKKyAgICAvKiBBbW91bnQgb2Ygc2hhcmluZyBvZiB0ZXh0IHNlZ21lbnQgbWVtb3J5CisgICAgICAgd2l0aCBvdGhlciBwcm9jZXNzZXMgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgICBsb25nIGludCBydV9peHJzczsKKyAgICAvKiBBbW91bnQgb2YgZGF0YSBzZWdtZW50IG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaWRyc3M7CisgICAgLyogQW1vdW50IG9mIHN0YWNrIG1lbW9yeSB1c2VkIChraWxvYnl0ZS1zZWNvbmRzKS4gICovCisgICAgbG9uZyBpbnQgcnVfaXNyc3M7CisgICAgLyogTnVtYmVyIG9mIHNvZnQgcGFnZSBmYXVsdHMgKGkuZS4gdGhvc2Ugc2VydmljZWQgYnkgcmVjbGFpbWluZworICAgICAgIGEgcGFnZSBmcm9tIHRoZSBsaXN0IG9mIHBhZ2VzIGF3YWl0aW5nIHJlYWxsb2NhdGlvbi4gICovCisgICAgbG9uZyBpbnQgcnVfbWluZmx0OworICAgIC8qIE51bWJlciBvZiBoYXJkIHBhZ2UgZmF1bHRzIChpLmUuIHRob3NlIHRoYXQgcmVxdWlyZWQgSS9PKS4gICovCisgICAgbG9uZyBpbnQgcnVfbWFqZmx0OworICAgIC8qIE51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzIHN3YXBwZWQgb3V0IG9mIHBoeXNpY2FsIG1lbW9yeS4gICovCisgICAgbG9uZyBpbnQgcnVfbnN3YXA7CisgICAgLyogTnVtYmVyIG9mIGlucHV0IG9wZXJhdGlvbnMgdmlhIHRoZSBmaWxlIHN5c3RlbS4gIE5vdGU6IFRoaXMKKyAgICAgICBhbmQgYHJ1X291YmxvY2snIGRvIG5vdCBpbmNsdWRlIG9wZXJhdGlvbnMgd2l0aCB0aGUgY2FjaGUuICAqLworICAgIGxvbmcgaW50IHJ1X2luYmxvY2s7CisgICAgLyogTnVtYmVyIG9mIG91dHB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICAqLworICAgIGxvbmcgaW50IHJ1X291YmxvY2s7CisgICAgLyogTnVtYmVyIG9mIElQQyBtZXNzYWdlcyBzZW50LiAgKi8KKyAgICBsb25nIGludCBydV9tc2dzbmQ7CisgICAgLyogTnVtYmVyIG9mIElQQyBtZXNzYWdlcyByZWNlaXZlZC4gICovCisgICAgbG9uZyBpbnQgcnVfbXNncmN2OworICAgIC8qIE51bWJlciBvZiBzaWduYWxzIGRlbGl2ZXJlZC4gICovCisgICAgbG9uZyBpbnQgcnVfbnNpZ25hbHM7CisgICAgLyogTnVtYmVyIG9mIHZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLCBpLmUuIGJlY2F1c2UgdGhlIHByb2Nlc3MKKyAgICAgICBnYXZlIHVwIHRoZSBwcm9jZXNzIGJlZm9yZSBpdCBoYWQgdG8gKHVzdWFsbHkgdG8gd2FpdCBmb3Igc29tZQorICAgICAgIHJlc291cmNlIHRvIGJlIGF2YWlsYWJsZSkuICAqLworICAgIGxvbmcgaW50IHJ1X252Y3N3OworICAgIC8qIE51bWJlciBvZiBpbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLCBpLmUuIGEgaGlnaGVyIHByaW9yaXR5IHByb2Nlc3MKKyAgICAgICBiZWNhbWUgcnVubmFibGUgb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyB1c2VkIHVwIGl0cyB0aW1lIHNsaWNlLiAgKi8KKyAgICBsb25nIGludCBydV9uaXZjc3c7CisgIH07CisKKy8qIFByaW9yaXR5IGxpbWl0cy4gICovCisjZGVmaW5lIFBSSU9fTUlOCS0yMAkvKiBNaW5pbXVtIHByaW9yaXR5IGEgcHJvY2VzcyBjYW4gaGF2ZS4gICovCisjZGVmaW5lIFBSSU9fTUFYCTIwCS8qIE1heGltdW0gcHJpb3JpdHkgYSBwcm9jZXNzIGNhbiBoYXZlLiAgKi8KKworLyogVGhlIHR5cGUgb2YgdGhlIFdISUNIIGFyZ3VtZW50IHRvIGBnZXRwcmlvcml0eScgYW5kIGBzZXRwcmlvcml0eScsCisgICBpbmRpY2F0aW5nIHdoYXQgZmxhdm9yIG9mIGVudGl0eSB0aGUgV0hPIGFyZ3VtZW50IHNwZWNpZmllcy4gICovCitlbnVtIF9fcHJpb3JpdHlfd2hpY2gKK3sKKyAgUFJJT19QUk9DRVNTID0gMCwJCS8qIFdITyBpcyBhIHByb2Nlc3MgSUQuICAqLworI2RlZmluZSBQUklPX1BST0NFU1MgUFJJT19QUk9DRVNTCisgIFBSSU9fUEdSUCA9IDEsCQkvKiBXSE8gaXMgYSBwcm9jZXNzIGdyb3VwIElELiAgKi8KKyNkZWZpbmUgUFJJT19QR1JQIFBSSU9fUEdSUAorICBQUklPX1VTRVIgPSAyCQkJLyogV0hPIGlzIGEgdXNlciBJRC4gICovCisjZGVmaW5lIFBSSU9fVVNFUiBQUklPX1VTRVIKK307CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODdiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaApAQCAtMCwwICsxLDE5NSBAQAorLyogRGVmaW5pdGlvbnMgb2YgY29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZSBmb3IgUE9TSVggMTAwMy4xYi0xOTkzCisgICBzY2hlZHVsaW5nIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5LDIwMDEtMjAwMywyMDA1LDIwMDYsMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19uZWVkX3NjaGVkcGFyYW0KKworI2lmbmRlZiBfU0NIRURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zY2hlZC5oPiBkaXJlY3RseTsgdXNlIDxzY2hlZC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIFNjaGVkdWxpbmcgYWxnb3JpdGhtcy4gICovCisjZGVmaW5lIFNDSEVEX09USEVSCTAKKyNkZWZpbmUgU0NIRURfRklGTwkxCisjZGVmaW5lIFNDSEVEX1JSCTIKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFNDSEVEX0JBVENICTMKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTUlTQworLyogQ2xvbmluZyBmbGFncy4gICovCisjIGRlZmluZSBDU0lHTkFMICAgICAgIDB4MDAwMDAwZmYgLyogU2lnbmFsIG1hc2sgdG8gYmUgc2VudCBhdCBleGl0LiAgKi8KKyMgZGVmaW5lIENMT05FX1ZNICAgICAgMHgwMDAwMDEwMCAvKiBTZXQgaWYgVk0gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzLiAgKi8KKyMgZGVmaW5lIENMT05FX0ZTICAgICAgMHgwMDAwMDIwMCAvKiBTZXQgaWYgZnMgaW5mbyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuICAqLworIyBkZWZpbmUgQ0xPTkVfRklMRVMgICAweDAwMDAwNDAwIC8qIFNldCBpZiBvcGVuIGZpbGVzIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4gICovCisjIGRlZmluZSBDTE9ORV9TSUdIQU5EIDB4MDAwMDA4MDAgLyogU2V0IGlmIHNpZ25hbCBoYW5kbGVycyBzaGFyZWQuICAqLworIyBkZWZpbmUgQ0xPTkVfUFRSQUNFICAweDAwMDAyMDAwIC8qIFNldCBpZiB0cmFjaW5nIGNvbnRpbnVlcyBvbiB0aGUgY2hpbGQuICAqLworIyBkZWZpbmUgQ0xPTkVfVkZPUksgICAweDAwMDA0MDAwIC8qIFNldCBpZiB0aGUgcGFyZW50IHdhbnRzIHRoZSBjaGlsZCB0bworCQkJCSAgICAgd2FrZSBpdCB1cCBvbiBtbV9yZWxlYXNlLiAgKi8KKyMgZGVmaW5lIENMT05FX1BBUkVOVCAgMHgwMDAwODAwMCAvKiBTZXQgaWYgd2Ugd2FudCB0byBoYXZlIHRoZSBzYW1lCisJCQkJICAgICBwYXJlbnQgYXMgdGhlIGNsb25lci4gICovCisjIGRlZmluZSBDTE9ORV9USFJFQUQgIDB4MDAwMTAwMDAgLyogU2V0IHRvIGFkZCB0byBzYW1lIHRocmVhZCBncm91cC4gICovCisjIGRlZmluZSBDTE9ORV9ORVdOUyAgIDB4MDAwMjAwMDAgLyogU2V0IHRvIGNyZWF0ZSBuZXcgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIENMT05FX1NZU1ZTRU0gMHgwMDA0MDAwMCAvKiBTZXQgdG8gc2hhcmVkIFNWSUQgU0VNX1VORE8gc2VtYW50aWNzLiAgKi8KKyMgZGVmaW5lIENMT05FX1NFVFRMUyAgMHgwMDA4MDAwMCAvKiBTZXQgVExTIGluZm8uICAqLworIyBkZWZpbmUgQ0xPTkVfUEFSRU5UX1NFVFRJRCAweDAwMTAwMDAwIC8qIFN0b3JlIFRJRCBpbiB1c2VybGV2ZWwgYnVmZmVyCisJCQkJCSAgIGJlZm9yZSBNTSBjb3B5LiAgKi8KKyMgZGVmaW5lIENMT05FX0NISUxEX0NMRUFSVElEIDB4MDAyMDAwMDAgLyogUmVnaXN0ZXIgZXhpdCBmdXRleCBhbmQgbWVtb3J5CisJCQkJCSAgICBsb2NhdGlvbiB0byBjbGVhci4gICovCisjIGRlZmluZSBDTE9ORV9ERVRBQ0hFRCAweDAwNDAwMDAwIC8qIENyZWF0ZSBjbG9uZSBkZXRhY2hlZC4gICovCisjIGRlZmluZSBDTE9ORV9VTlRSQUNFRCAweDAwODAwMDAwIC8qIFNldCBpZiB0aGUgdHJhY2luZyBwcm9jZXNzIGNhbid0CisJCQkJICAgICAgZm9yY2UgQ0xPTkVfUFRSQUNFIG9uIHRoaXMgY2xvbmUuICAqLworIyBkZWZpbmUgQ0xPTkVfQ0hJTERfU0VUVElEIDB4MDEwMDAwMDAgLyogU3RvcmUgVElEIGluIHVzZXJsZXZlbCBidWZmZXIgaW4KKwkJCQkJICB0aGUgY2hpbGQuICAqLworIyBkZWZpbmUgQ0xPTkVfU1RPUFBFRAkweDAyMDAwMDAwIC8qIFN0YXJ0IGluIHN0b3BwZWQgc3RhdGUuICAqLworI2VuZGlmCisKKy8qIFRoZSBvZmZpY2lhbCBkZWZpbml0aW9uLiAgKi8KK3N0cnVjdCBzY2hlZF9wYXJhbQorICB7CisgICAgaW50IF9fc2NoZWRfcHJpb3JpdHk7CisgIH07CisKK19fQkVHSU5fREVDTFMKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIENsb25lIGN1cnJlbnQgcHJvY2Vzcy4gICovCitleHRlcm4gaW50IGNsb25lIChpbnQgKCpfX2ZuKSAodm9pZCAqX19hcmcpLCB2b2lkICpfX2NoaWxkX3N0YWNrLAorCQkgIGludCBfX2ZsYWdzLCB2b2lkICpfX2FyZywgLi4uKSBfX1RIUk9XOworCisvKiBVbnNoYXJlIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzLiAgKi8KK2V4dGVybiBpbnQgdW5zaGFyZSAoaW50IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIEdldCBpbmRleCBvZiBjdXJyZW50bHkgdXNlZCBDUFUuICAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRjcHUgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5lZWQgc2NoZWRwYXJhbSAqLworCisjaWYgIWRlZmluZWQgX19kZWZpbmVkX3NjaGVkcGFyYW0gXAorICAgICYmIChkZWZpbmVkIF9fbmVlZF9zY2hlZHBhcmFtIHx8IGRlZmluZWQgX1NDSEVEX0gpCisjIGRlZmluZSBfX2RlZmluZWRfc2NoZWRwYXJhbQkxCisvKiBEYXRhIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHByb2Nlc3MnIHNjaGVkdWxhYmlsaXR5LiAgKi8KK3N0cnVjdCBfX3NjaGVkX3BhcmFtCisgIHsKKyAgICBpbnQgX19zY2hlZF9wcmlvcml0eTsKKyAgfTsKKyMgdW5kZWYgX19uZWVkX3NjaGVkcGFyYW0KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9TQ0hFRF9IICYmICFkZWZpbmVkIF9fY3B1X3NldF90X2RlZmluZWQKKyMgZGVmaW5lIF9fY3B1X3NldF90X2RlZmluZWQKKy8qIFNpemUgZGVmaW5pdGlvbiBmb3IgQ1BVIHNldHMuICAqLworIyBkZWZpbmUgX19DUFVfU0VUU0laRQkxMDI0CisjIGRlZmluZSBfX05DUFVCSVRTCSg4ICogc2l6ZW9mIChfX2NwdV9tYXNrKSkKKworLyogVHlwZSBmb3IgYXJyYXkgZWxlbWVudHMgaW4gJ2NwdV9zZXRfdCcuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2NwdV9tYXNrOworCisvKiBCYXNpYyBhY2Nlc3MgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fQ1BVRUxUKGNwdSkJKChjcHUpIC8gX19OQ1BVQklUUykKKyMgZGVmaW5lIF9fQ1BVTUFTSyhjcHUpCSgoX19jcHVfbWFzaykgMSA8PCAoKGNwdSkgJSBfX05DUFVCSVRTKSkKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgQ1BVIG1hc2suICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX19jcHVfbWFzayBfX2JpdHNbX19DUFVfU0VUU0laRSAvIF9fTkNQVUJJVFNdOworfSBjcHVfc2V0X3Q7CisKKy8qIEFjY2VzcyBmdW5jdGlvbnMgZm9yIENQVSBtYXNrcy4gICovCisjIGlmIF9fR05VQ19QUkVSRVEgKDIsIDkxKQorIyAgZGVmaW5lIF9fQ1BVX1pFUk9fUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIGRvIF9fYnVpbHRpbl9tZW1zZXQgKGNwdXNldHAsICdcMCcsIHNldHNpemUpOyB3aGlsZSAoMCkKKyMgZWxzZQorIyAgZGVmaW5lIF9fQ1BVX1pFUk9fUyhzZXRzaXplLCBjcHVzZXRwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc2l6ZV90IF9faTsJCQkJCQkJCSAgICAgIFwKKyAgICBzaXplX3QgX19pbWF4ID0gKHNldHNpemUpIC8gc2l6ZW9mIChfX2NwdV9tYXNrKTsJCQkgICAgICBcCisgICAgY3B1X3NldF90ICpfX2FyciA9IChjcHVzZXRwKTsJCQkJCSAgICAgIFwKKyAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9faW1heDsgKytfX2kpCQkJCQkgICAgICBcCisgICAgICBfX2Fyci0+X19iaXRzW19faV0gPSAwOwkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZW5kaWYKKyMgZGVmaW5lIF9fQ1BVX1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoY3B1c2V0cCktPl9fYml0c1tfX0NQVUVMVCAoX19jcHUpXSB8PSBfX0NQVU1BU0sgKF9fY3B1KSkgOiAwOyB9KSkKKyMgZGVmaW5lIF9fQ1BVX0NMUl9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoY3B1c2V0cCktPl9fYml0c1tfX0NQVUVMVCAoX19jcHUpXSAmPSB+X19DUFVNQVNLIChfX2NwdSkpIDogMDsgfSkpCisjIGRlZmluZSBfX0NQVV9JU1NFVF9TKGNwdSwgc2V0c2l6ZSwgY3B1c2V0cCkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBzaXplX3QgX19jcHUgPSAoY3B1KTsJCQkJCQkgICAgICBcCisgICAgICBfX2NwdSA8IDggKiAoc2V0c2l6ZSkJCQkJCQkgICAgICBcCisgICAgICA/ICgoKGNwdXNldHApLT5fX2JpdHNbX19DUFVFTFQgKF9fY3B1KV0gJiBfX0NQVU1BU0sgKF9fY3B1KSkpICE9IDAgICAgICBcCisgICAgICA6IDA7IH0pKQorCisjIGRlZmluZSBfX0NQVV9DT1VOVF9TKHNldHNpemUsIGNwdXNldHApIFwKKyAgX19zY2hlZF9jcHVjb3VudCAoc2V0c2l6ZSwgY3B1c2V0cCkKKworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA5MSkKKyMgIGRlZmluZSBfX0NQVV9FUVVBTF9TKHNldHNpemUsIGNwdXNldHAxLCBjcHVzZXRwMikgXAorICAoX19idWlsdGluX21lbWNtcCAoY3B1c2V0cDEsIGNwdXNldHAyLCBzZXRzaXplKSA9PSAwKQorIyBlbHNlCisjICBkZWZpbmUgX19DUFVfRVFVQUxfUyhzZXRzaXplLCBjcHVzZXRwMSwgY3B1c2V0cDIpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgY3B1X3NldF90ICpfX2FycjEgPSAoY3B1c2V0cDEpOwkJCQkJICAgICAgXAorICAgICAgY3B1X3NldF90ICpfX2FycjIgPSAoY3B1c2V0cDIpOwkJCQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faW1heCA9IChzZXRzaXplKSAvIHNpemVvZiAoX19jcHVfbWFzayk7CQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faTsJCQkJCQkJICAgICAgXAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ltYXg7ICsrX19pKQkJCQkgICAgICBcCisJaWYgKF9fYXJyMS0+X19iaXRzW19faV0gIT0gX19hcnIyLT5fX2JpdHNbX19pXSkJCQkgICAgICBcCisJICBicmVhazsJCQkJCQkJICAgICAgXAorICAgICAgX19pID09IF9faW1heDsgfSkpCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fQ1BVX09QX1Moc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0Miwgb3ApIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgY3B1X3NldF90ICpfX2Rlc3QgPSAoZGVzdHNldCk7CQkJCQkgICAgICBcCisgICAgICBjcHVfc2V0X3QgKl9fYXJyMSA9IChzcmNzZXQxKTsJCQkJCSAgICAgIFwKKyAgICAgIGNwdV9zZXRfdCAqX19hcnIyID0gKHNyY3NldDIpOwkJCQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faW1heCA9IChzZXRzaXplKSAvIHNpemVvZiAoX19jcHVfbWFzayk7CQkJICAgICAgXAorICAgICAgc2l6ZV90IF9faTsJCQkJCQkJICAgICAgXAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ltYXg7ICsrX19pKQkJCQkgICAgICBcCisJX19kZXN0LT5fX2JpdHNbX19pXSA9IF9fYXJyMS0+X19iaXRzW19faV0gb3AgX19hcnIyLT5fX2JpdHNbX19pXTsgICAgIFwKKyAgICAgIF9fZGVzdDsgfSkpCisKKyMgZGVmaW5lIF9fQ1BVX0FMTE9DX1NJWkUoY291bnQpIFwKKyAgKCgoKGNvdW50KSArIF9fTkNQVUJJVFMgLSAxKSAvIF9fTkNQVUJJVFMpICogOCkKKyMgZGVmaW5lIF9fQ1BVX0FMTE9DKGNvdW50KSBfX3NjaGVkX2NwdWFsbG9jIChjb3VudCkKKyMgZGVmaW5lIF9fQ1BVX0ZSRUUoY3B1c2V0KSBfX3NjaGVkX2NwdWZyZWUgKGNwdXNldCkKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IF9fc2NoZWRfY3B1Y291bnQgKHNpemVfdCBfX3NldHNpemUsIGNvbnN0IGNwdV9zZXRfdCAqX19zZXRwKQorICBfX1RIUk9XOworZXh0ZXJuIGNwdV9zZXRfdCAqX19zY2hlZF9jcHVhbGxvYyAoc2l6ZV90IF9fY291bnQpIF9fVEhST1cgX193dXI7CitleHRlcm4gdm9pZCBfX3NjaGVkX2NwdWZyZWUgKGNwdV9zZXRfdCAqX19zZXQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NlbGVjdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZTdkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2VsZWN0LmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VMRUNUX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zZWxlY3QuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBXZSBkb24ndCB1c2UgYG1lbXNldCcgYmVjYXVzZSB0aGlzIHdvdWxkIHJlcXVpcmUgYSBwcm90b3R5cGUgYW5kCisgICB0aGUgYXJyYXkgaXNuJ3QgdG9vIGJpZy4gICovCisjZGVmaW5lIF9fRkRfWkVSTyhzKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdW5zaWduZWQgaW50IF9faTsJCQkJCQkJICAgICAgXAorICAgIGZkX3NldCAqX19hcnIgPSAocyk7CQkJCQkJICAgICAgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgc2l6ZW9mIChmZF9zZXQpIC8gc2l6ZW9mIChfX2ZkX21hc2spOyArK19faSkJICAgICAgXAorICAgICAgX19GRFNfQklUUyAoX19hcnIpW19faV0gPSAwOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2RlZmluZSBfX0ZEX1NFVChkLCBzKSAgICAgKF9fRkRTX0JJVFMgKHMpW19fRkRFTFQoZCldIHw9IF9fRkRNQVNLKGQpKQorI2RlZmluZSBfX0ZEX0NMUihkLCBzKSAgICAgKF9fRkRTX0JJVFMgKHMpW19fRkRFTFQoZCldICY9IH5fX0ZETUFTSyhkKSkKKyNkZWZpbmUgX19GRF9JU1NFVChkLCBzKSAgICgoX19GRFNfQklUUyAocylbX19GREVMVChkKV0gJiBfX0ZETUFTSyhkKSkgIT0gMCkKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zZW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjFkOTkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NlbS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NFTV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NlbS5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc2VtLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogRmxhZ3MgZm9yIGBzZW1vcCcuICAqLworI2RlZmluZSBTRU1fVU5ETwkweDEwMDAJCS8qIHVuZG8gdGhlIG9wZXJhdGlvbiBvbiBleGl0ICovCisKKy8qIENvbW1hbmRzIGZvciBgc2VtY3RsJy4gICovCisjZGVmaW5lIEdFVFBJRAkJMTEJCS8qIGdldCBzZW1waWQgKi8KKyNkZWZpbmUgR0VUVkFMCQkxMgkJLyogZ2V0IHNlbXZhbCAqLworI2RlZmluZSBHRVRBTEwJCTEzCQkvKiBnZXQgYWxsIHNlbXZhbCdzICovCisjZGVmaW5lIEdFVE5DTlQJCTE0CQkvKiBnZXQgc2VtbmNudCAqLworI2RlZmluZSBHRVRaQ05UCQkxNQkJLyogZ2V0IHNlbXpjbnQgKi8KKyNkZWZpbmUgU0VUVkFMCQkxNgkJLyogc2V0IHNlbXZhbCAqLworI2RlZmluZSBTRVRBTEwJCTE3CQkvKiBzZXQgYWxsIHNlbXZhbCdzICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNldCBvZiBzZW1hcGhvcmVzLiAgKi8KK3N0cnVjdCBzZW1pZF9kcworeworICBzdHJ1Y3QgaXBjX3Blcm0gc2VtX3Blcm07CQkvKiBvcGVyYXRpb24gcGVybWlzc2lvbiBzdHJ1Y3QgKi8KKyAgX190aW1lX3Qgc2VtX290aW1lOwkJCS8qIGxhc3Qgc2Vtb3AoKSB0aW1lICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyAgX190aW1lX3Qgc2VtX2N0aW1lOwkJCS8qIGxhc3QgdGltZSBjaGFuZ2VkIGJ5IHNlbWN0bCgpICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc2VtX25zZW1zOwkJLyogbnVtYmVyIG9mIHNlbWFwaG9yZXMgaW4gc2V0ICovCisgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKKyAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ0OworfTsKKworLyogVGhlIHVzZXIgc2hvdWxkIGRlZmluZSBhIHVuaW9uIGxpa2UgdGhlIGZvbGxvd2luZyB0byB1c2UgaXQgZm9yIGFyZ3VtZW50cworICAgZm9yIGBzZW1jdGwnLgorCisgICB1bmlvbiBzZW11bgorICAgeworICAgICBpbnQgdmFsOwkJCQk8PSB2YWx1ZSBmb3IgU0VUVkFMCisgICAgIHN0cnVjdCBzZW1pZF9kcyAqYnVmOwkJPD0gYnVmZmVyIGZvciBJUENfU1RBVCAmIElQQ19TRVQKKyAgICAgdW5zaWduZWQgc2hvcnQgaW50ICphcnJheTsJCTw9IGFycmF5IGZvciBHRVRBTEwgJiBTRVRBTEwKKyAgICAgc3RydWN0IHNlbWluZm8gKl9fYnVmOwkJPD0gYnVmZmVyIGZvciBJUENfSU5GTworICAgfTsKKworICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIHVzZWQgdG8gZGVmaW5lIHRoaXMgdW5pb24gYnV0IHRoaXMgaXMKKyAgIGluY29ycmVjdC4gIE9uZSBjYW4gdGVzdCB0aGUgbWFjcm8gX1NFTV9TRU1VTl9VTkRFRklORUQgdG8gc2VlIHdoZXRoZXIKKyAgIG9uZSBtdXN0IGRlZmluZSB0aGUgdW5pb24gb3Igbm90LiAgKi8KKyNkZWZpbmUgX1NFTV9TRU1VTl9VTkRFRklORUQJMQorCisjaWZkZWYgX19VU0VfTUlTQworCisvKiBpcGNzIGN0bCBjbWRzICovCisjIGRlZmluZSBTRU1fU1RBVCAxOAorIyBkZWZpbmUgU0VNX0lORk8gMTkKKworc3RydWN0ICBzZW1pbmZvCit7CisgIGludCBzZW1tYXA7CisgIGludCBzZW1tbmk7CisgIGludCBzZW1tbnM7CisgIGludCBzZW1tbnU7CisgIGludCBzZW1tc2w7CisgIGludCBzZW1vcG07CisgIGludCBzZW11bWU7CisgIGludCBzZW11c3o7CisgIGludCBzZW12bXg7CisgIGludCBzZW1hZW07Cit9OworCisjZW5kaWYgLyogX19VU0VfTUlTQyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NlbWFwaG9yZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NzNiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2VtYXBob3JlLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPiwgMjAwMi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NFTUFQSE9SRV9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc2VtYXBob3JlLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzZW1hcGhvcmUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIF9fU0laRU9GX1NFTV9UCTMyCisjZWxzZQorIyBkZWZpbmUgX19TSVpFT0ZfU0VNX1QJMTYKKyNlbmRpZgorCisKKy8qIFZhbHVlIHJldHVybmVkIGlmIGBzZW1fb3BlbicgZmFpbGVkLiAgKi8KKyNkZWZpbmUgU0VNX0ZBSUxFRCAgICAgICgoc2VtX3QgKikgMCkKKworCit0eXBlZGVmIHVuaW9uCit7CisgIGNoYXIgX19zaXplW19fU0laRU9GX1NFTV9UXTsKKyAgbG9uZyBpbnQgX19hbGlnbjsKK30gc2VtX3Q7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2V0am1wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliOThiMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zZXRqbXAuaApAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiwyMDAzLDIwMDUsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogRGVmaW5lIHRoZSBtYWNoaW5lLWRlcGVuZGVudCB0eXBlIGBqbXBfYnVmJy4gIHg4Ni02NCB2ZXJzaW9uLiAgKi8KKyNpZm5kZWYgX0JJVFNfU0VUSk1QX0gKKyNkZWZpbmUgX0JJVFNfU0VUSk1QX0ggIDEKKworI2lmICFkZWZpbmVkIF9TRVRKTVBfSCAmJiAhZGVmaW5lZCBfUFRIUkVBRF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3NldGptcC5oPiBkaXJlY3RseTsgdXNlIDxzZXRqbXAuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmbmRlZiBfQVNNCisKKyMgaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBfX2ptcF9idWZbOF07CisjIGVsc2UKK3R5cGVkZWYgaW50IF9fam1wX2J1Zls2XTsKKyMgZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAgLyogYml0cy9zZXRqbXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NobS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOGMwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2htLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMjAwMCwgMjAwMiwgMjAwNAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TSE1fSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zaG0uaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3NobS5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBQZXJtaXNzaW9uIGZsYWcgZm9yIHNobWdldC4gICovCisjZGVmaW5lIFNITV9SCQkwNDAwCQkvKiBvciBTX0lSVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKyNkZWZpbmUgU0hNX1cJCTAyMDAJCS8qIG9yIFNfSVdVR08gZnJvbSA8bGludXgvc3RhdC5oPiAqLworCisvKiBGbGFncyBmb3IgYHNobWF0Jy4gICovCisjZGVmaW5lIFNITV9SRE9OTFkJMDEwMDAwCQkvKiBhdHRhY2ggcmVhZC1vbmx5IGVsc2UgcmVhZC13cml0ZSAqLworI2RlZmluZSBTSE1fUk5ECQkwMjAwMDAJCS8qIHJvdW5kIGF0dGFjaCBhZGRyZXNzIHRvIFNITUxCQSAqLworI2RlZmluZSBTSE1fUkVNQVAJMDQwMDAwCQkvKiB0YWtlLW92ZXIgcmVnaW9uIG9uIGF0dGFjaCAqLworCisvKiBDb21tYW5kcyBmb3IgYHNobWN0bCcuICAqLworI2RlZmluZSBTSE1fTE9DSwkxMQkJLyogbG9jayBzZWdtZW50IChyb290IG9ubHkpICovCisjZGVmaW5lIFNITV9VTkxPQ0sJMTIJCS8qIHVubG9jayBzZWdtZW50IChyb290IG9ubHkpICovCisKK19fQkVHSU5fREVDTFMKKworLyogU2VnbWVudCBsb3cgYm91bmRhcnkgYWRkcmVzcyBtdWx0aXBsZS4gICovCisjZGVmaW5lIFNITUxCQQkJKF9fZ2V0cGFnZXNpemUgKCkpCitleHRlcm4gaW50IF9fZ2V0cGFnZXNpemUgKHZvaWQpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisKKy8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGF0dGFjaGVzLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgc2htYXR0X3Q7CisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzZXQgb2Ygc2VtYXBob3Jlcy4gICovCitzdHJ1Y3Qgc2htaWRfZHMKKyAgeworICAgIHN0cnVjdCBpcGNfcGVybSBzaG1fcGVybTsJCS8qIG9wZXJhdGlvbiBwZXJtaXNzaW9uIHN0cnVjdCAqLworICAgIHNpemVfdCBzaG1fc2Vnc3o7CQkJLyogc2l6ZSBvZiBzZWdtZW50IGluIGJ5dGVzICovCisgICAgX190aW1lX3Qgc2htX2F0aW1lOwkJCS8qIHRpbWUgb2YgbGFzdCBzaG1hdCgpICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKKyNlbmRpZgorICAgIF9fdGltZV90IHNobV9kdGltZTsJCQkvKiB0aW1lIG9mIGxhc3Qgc2htZHQoKSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDI7CisjZW5kaWYKKyAgICBfX3RpbWVfdCBzaG1fY3RpbWU7CQkJLyogdGltZSBvZiBsYXN0IGNoYW5nZSBieSBzaG1jdGwoKSAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDM7CisjZW5kaWYKKyAgICBfX3BpZF90IHNobV9jcGlkOwkJCS8qIHBpZCBvZiBjcmVhdG9yICovCisgICAgX19waWRfdCBzaG1fbHBpZDsJCQkvKiBwaWQgb2YgbGFzdCBzaG1vcCAqLworICAgIHNobWF0dF90IHNobV9uYXR0Y2g7CQkvKiBudW1iZXIgb2YgY3VycmVudCBhdHRhY2hlcyAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkNDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDU7CisgIH07CisKKyNpZmRlZiBfX1VTRV9NSVNDCisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjIGRlZmluZSBTSE1fU1RBVCAJMTMKKyMgZGVmaW5lIFNITV9JTkZPIAkxNAorCisvKiBzaG1fbW9kZSB1cHBlciBieXRlIGZsYWdzICovCisjIGRlZmluZSBTSE1fREVTVAkwMTAwMAkvKiBzZWdtZW50IHdpbGwgYmUgZGVzdHJveWVkIG9uIGxhc3QgZGV0YWNoICovCisjIGRlZmluZSBTSE1fTE9DS0VECTAyMDAwICAgLyogc2VnbWVudCB3aWxsIG5vdCBiZSBzd2FwcGVkICovCisjIGRlZmluZSBTSE1fSFVHRVRMQgkwNDAwMAkvKiBzZWdtZW50IGlzIG1hcHBlZCB2aWEgaHVnZXRsYiAqLworIyBkZWZpbmUgU0hNX05PUkVTRVJWRQkwMTAwMDAJLyogZG9uJ3QgY2hlY2sgZm9yIHJlc2VydmF0aW9ucyAqLworCitzdHJ1Y3QJc2htaW5mbworICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htbWF4OworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobW1pbjsKKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1tbmk7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc2htc2VnOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobWFsbDsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDE7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQyOworICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgIH07CisKK3N0cnVjdCBzaG1faW5mbworICB7CisgICAgaW50IHVzZWRfaWRzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHNobV90b3Q7CS8qIHRvdGFsIGFsbG9jYXRlZCBzaG0gKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1fcnNzOwkvKiB0b3RhbCByZXNpZGVudCBzaG0gKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzaG1fc3dwOwkvKiB0b3RhbCBzd2FwcGVkIHNobSAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN3YXBfYXR0ZW1wdHM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3dhcF9zdWNjZXNzZXM7CisgIH07CisKKyNlbmRpZiAvKiBfX1VTRV9NSVNDICovCisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2lnYWN0aW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2lnYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYzUzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdhY3Rpb24uaApAQCAtMCwwICsxLDc3IEBACisvKiBUaGUgcHJvcGVyIGRlZmluaXRpb25zIGZvciBMaW51eCdzIHNpZ2FjdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5My0xOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TSUdOQUxfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zaWdhY3Rpb24uaD4gZGlyZWN0bHk7IHVzZSA8c2lnbmFsLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4gd2hlbiBhIHNpZ25hbCBhcnJpdmVzLiAgKi8KK3N0cnVjdCBzaWdhY3Rpb24KKyAgeworICAgIC8qIFNpZ25hbCBoYW5kbGVyLiAgKi8KKyNpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorICAgIHVuaW9uCisgICAgICB7CisJLyogVXNlZCBpZiBTQV9TSUdJTkZPIGlzIG5vdCBzZXQuICAqLworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJLyogVXNlZCBpZiBTQV9TSUdJTkZPIGlzIHNldC4gICovCisJdm9pZCAoKnNhX3NpZ2FjdGlvbikgKGludCwgc2lnaW5mb190ICosIHZvaWQgKik7CisgICAgICB9CisgICAgX19zaWdhY3Rpb25faGFuZGxlcjsKKyMgZGVmaW5lIHNhX2hhbmRsZXIJX19zaWdhY3Rpb25faGFuZGxlci5zYV9oYW5kbGVyCisjIGRlZmluZSBzYV9zaWdhY3Rpb24JX19zaWdhY3Rpb25faGFuZGxlci5zYV9zaWdhY3Rpb24KKyNlbHNlCisgICAgX19zaWdoYW5kbGVyX3Qgc2FfaGFuZGxlcjsKKyNlbmRpZgorCisgICAgLyogQWRkaXRpb25hbCBzZXQgb2Ygc2lnbmFscyB0byBiZSBibG9ja2VkLiAgKi8KKyAgICBfX3NpZ3NldF90IHNhX21hc2s7CisKKyAgICAvKiBTcGVjaWFsIGZsYWdzLiAgKi8KKyAgICBpbnQgc2FfZmxhZ3M7CisKKyAgICAvKiBSZXN0b3JlIGhhbmRsZXIuICAqLworICAgIHZvaWQgKCpzYV9yZXN0b3JlcikgKHZvaWQpOworICB9OworCisvKiBCaXRzIGluIGBzYV9mbGFncycuICAqLworI2RlZmluZQlTQV9OT0NMRFNUT1AgIDEJCSAvKiBEb24ndCBzZW5kIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLiAgKi8KKyNkZWZpbmUgU0FfTk9DTERXQUlUICAyCQkgLyogRG9uJ3QgY3JlYXRlIHpvbWJpZSBvbiBjaGlsZCBkZWF0aC4gICovCisjZGVmaW5lIFNBX1NJR0lORk8gICAgNAkJIC8qIEludm9rZSBzaWduYWwtY2F0Y2hpbmcgZnVuY3Rpb24gd2l0aAorCQkJCSAgICB0aHJlZSBhcmd1bWVudHMgaW5zdGVhZCBvZiBvbmUuICAqLworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfTUlTQworIyBkZWZpbmUgU0FfT05TVEFDSyAgIDB4MDgwMDAwMDAgLyogVXNlIHNpZ25hbCBzdGFjayBieSB1c2luZyBgc2FfcmVzdG9yZXInLiAqLworIyBkZWZpbmUgU0FfUkVTVEFSVCAgIDB4MTAwMDAwMDAgLyogUmVzdGFydCBzeXNjYWxsIG9uIHNpZ25hbCByZXR1cm4uICAqLworIyBkZWZpbmUgU0FfTk9ERUZFUiAgIDB4NDAwMDAwMDAgLyogRG9uJ3QgYXV0b21hdGljYWxseSBibG9jayB0aGUgc2lnbmFsIHdoZW4KKwkJCQkgICAgaXRzIGhhbmRsZXIgaXMgYmVpbmcgZXhlY3V0ZWQuICAqLworIyBkZWZpbmUgU0FfUkVTRVRIQU5EIDB4ODAwMDAwMDAgLyogUmVzZXQgdG8gU0lHX0RGTCBvbiBlbnRyeSB0byBoYW5kbGVyLiAgKi8KKyNlbmRpZgorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIFNBX0lOVEVSUlVQVCAweDIwMDAwMDAwIC8qIEhpc3RvcmljYWwgbm8tb3AuICAqLworCisvKiBTb21lIGFsaWFzZXMgZm9yIHRoZSBTQV8gY29uc3RhbnRzLiAgKi8KKyMgZGVmaW5lIFNBX05PTUFTSyAgICBTQV9OT0RFRkVSCisjIGRlZmluZSBTQV9PTkVTSE9UICAgU0FfUkVTRVRIQU5ECisjIGRlZmluZSBTQV9TVEFDSyAgICAgU0FfT05TVEFDSworI2VuZGlmCisKKy8qIFZhbHVlcyBmb3IgdGhlIEhPVyBhcmd1bWVudCB0byBgc2lncHJvY21hc2snLiAgKi8KKyNkZWZpbmUJU0lHX0JMT0NLICAgICAwCQkgLyogQmxvY2sgc2lnbmFscy4gICovCisjZGVmaW5lCVNJR19VTkJMT0NLICAgMQkJIC8qIFVuYmxvY2sgc2lnbmFscy4gICovCisjZGVmaW5lCVNJR19TRVRNQVNLICAgMgkJIC8qIFNldCB0aGUgc2V0IG9mIGJsb2NrZWQgc2lnbmFscy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc2lnY29udGV4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ1ZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ2NvbnRleHQuaApAQCAtMCwwICsxLDE1OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1NJR0NPTlRFWFRfSAorI2RlZmluZSBfQklUU19TSUdDT05URVhUX0ggIDEKKworI2lmICFkZWZpbmVkIF9TSUdOQUxfSCAmJiAhZGVmaW5lZCBfU1lTX1VDT05URVhUX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zaWdjb250ZXh0Lmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzaWduYWwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworc3RydWN0IF9mcHJlZworeworICB1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKyAgdW5zaWduZWQgc2hvcnQgZXhwb25lbnQ7Cit9OworCitzdHJ1Y3QgX2ZweHJlZworeworICB1bnNpZ25lZCBzaG9ydCBzaWduaWZpY2FuZFs0XTsKKyAgdW5zaWduZWQgc2hvcnQgZXhwb25lbnQ7CisgIHVuc2lnbmVkIHNob3J0IHBhZGRpbmdbM107Cit9OworCitzdHJ1Y3QgX3htbXJlZworeworICBfX3VpbnQzMl90CWVsZW1lbnRbNF07Cit9OworCisKKworI2lmIF9fV09SRFNJWkUgPT0gMzIKKworc3RydWN0IF9mcHN0YXRlCit7CisgIC8qIFJlZ3VsYXIgRlBVIGVudmlyb25tZW50LiAgKi8KKyAgX191aW50MzJfdAljdzsKKyAgX191aW50MzJfdAkJc3c7CisgIF9fdWludDMyX3QJCXRhZzsKKyAgX191aW50MzJfdAkJaXBvZmY7CisgIF9fdWludDMyX3QJCWNzc2VsOworICBfX3VpbnQzMl90CQlkYXRhb2ZmOworICBfX3VpbnQzMl90CQlkYXRhc2VsOworICBzdHJ1Y3QgX2ZwcmVnCV9zdFs4XTsKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBtYWdpYzsKKworICAvKiBGWFNSIEZQVSBlbnZpcm9ubWVudC4gICovCisgIF9fdWludDMyX3QJCV9meHNyX2Vudls2XTsKKyAgX191aW50MzJfdAkJbXhjc3I7CisgIF9fdWludDMyX3QJCXJlc2VydmVkOworICBzdHJ1Y3QgX2ZweHJlZwlfZnhzcl9zdFs4XTsKKyAgc3RydWN0IF94bW1yZWcJX3htbVs4XTsKKyAgX191aW50MzJfdAkJcGFkZGluZ1s1Nl07Cit9OworCisjaWZuZGVmIHNpZ2NvbnRleHRfc3RydWN0CisvKiBLZXJuZWwgaGVhZGVycyBiZWZvcmUgMi4xLjEgZGVmaW5lIGEgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0LCBidXQKKyAgIHdlIG5lZWQgc2lnY29udGV4dC4gIFNvbWUgcGFja2FnZXMgaGF2ZSBjb21lIHRvIHJlbHkgb24KKyAgIHNpZ2NvbnRleHRfc3RydWN0IGJlaW5nIGRlZmluZWQgb24gMzItYml0IHg4Niwgc28gZGVmaW5lIHRoaXMgZm9yCisgICB0aGVpciBiZW5lZml0LiAgKi8KKyMgZGVmaW5lIHNpZ2NvbnRleHRfc3RydWN0IHNpZ2NvbnRleHQKKyNlbmRpZgorCitzdHJ1Y3Qgc2lnY29udGV4dAoreworICB1bnNpZ25lZCBzaG9ydCBncywgX19nc2g7CisgIHVuc2lnbmVkIHNob3J0IGZzLCBfX2ZzaDsKKyAgdW5zaWduZWQgc2hvcnQgZXMsIF9fZXNoOworICB1bnNpZ25lZCBzaG9ydCBkcywgX19kc2g7CisgIHVuc2lnbmVkIGxvbmcgZWRpOworICB1bnNpZ25lZCBsb25nIGVzaTsKKyAgdW5zaWduZWQgbG9uZyBlYnA7CisgIHVuc2lnbmVkIGxvbmcgZXNwOworICB1bnNpZ25lZCBsb25nIGVieDsKKyAgdW5zaWduZWQgbG9uZyBlZHg7CisgIHVuc2lnbmVkIGxvbmcgZWN4OworICB1bnNpZ25lZCBsb25nIGVheDsKKyAgdW5zaWduZWQgbG9uZyB0cmFwbm87CisgIHVuc2lnbmVkIGxvbmcgZXJyOworICB1bnNpZ25lZCBsb25nIGVpcDsKKyAgdW5zaWduZWQgc2hvcnQgY3MsIF9fY3NoOworICB1bnNpZ25lZCBsb25nIGVmbGFnczsKKyAgdW5zaWduZWQgbG9uZyBlc3BfYXRfc2lnbmFsOworICB1bnNpZ25lZCBzaG9ydCBzcywgX19zc2g7CisgIHN0cnVjdCBfZnBzdGF0ZSAqIGZwc3RhdGU7CisgIHVuc2lnbmVkIGxvbmcgb2xkbWFzazsKKyAgdW5zaWduZWQgbG9uZyBjcjI7Cit9OworCisjZWxzZSAvKiBfX1dPUkRTSVpFID09IDY0ICovCisKK3N0cnVjdCBfZnBzdGF0ZQoreworICAvKiBGUFUgZW52aXJvbm1lbnQgbWF0Y2hpbmcgdGhlIDY0LWJpdCBGWFNBVkUgbGF5b3V0LiAgKi8KKyAgX191aW50MTZfdAkJY3dkOworICBfX3VpbnQxNl90CQlzd2Q7CisgIF9fdWludDE2X3QJCWZ0dzsKKyAgX191aW50MTZfdAkJZm9wOworICBfX3VpbnQ2NF90CQlyaXA7CisgIF9fdWludDY0X3QJCXJkcDsKKyAgX191aW50MzJfdAkJbXhjc3I7CisgIF9fdWludDMyX3QJCW14Y3JfbWFzazsKKyAgc3RydWN0IF9mcHhyZWcJX3N0WzhdOworICBzdHJ1Y3QgX3htbXJlZwlfeG1tWzE2XTsKKyAgX191aW50MzJfdAkJcGFkZGluZ1syNF07Cit9OworCitzdHJ1Y3Qgc2lnY29udGV4dAoreworICB1bnNpZ25lZCBsb25nIHI4OworICB1bnNpZ25lZCBsb25nIHI5OworICB1bnNpZ25lZCBsb25nIHIxMDsKKyAgdW5zaWduZWQgbG9uZyByMTE7CisgIHVuc2lnbmVkIGxvbmcgcjEyOworICB1bnNpZ25lZCBsb25nIHIxMzsKKyAgdW5zaWduZWQgbG9uZyByMTQ7CisgIHVuc2lnbmVkIGxvbmcgcjE1OworICB1bnNpZ25lZCBsb25nIHJkaTsKKyAgdW5zaWduZWQgbG9uZyByc2k7CisgIHVuc2lnbmVkIGxvbmcgcmJwOworICB1bnNpZ25lZCBsb25nIHJieDsKKyAgdW5zaWduZWQgbG9uZyByZHg7CisgIHVuc2lnbmVkIGxvbmcgcmF4OworICB1bnNpZ25lZCBsb25nIHJjeDsKKyAgdW5zaWduZWQgbG9uZyByc3A7CisgIHVuc2lnbmVkIGxvbmcgcmlwOworICB1bnNpZ25lZCBsb25nIGVmbGFnczsKKyAgdW5zaWduZWQgc2hvcnQgY3M7CisgIHVuc2lnbmVkIHNob3J0IGdzOworICB1bnNpZ25lZCBzaG9ydCBmczsKKyAgdW5zaWduZWQgc2hvcnQgX19wYWQwOworICB1bnNpZ25lZCBsb25nIGVycjsKKyAgdW5zaWduZWQgbG9uZyB0cmFwbm87CisgIHVuc2lnbmVkIGxvbmcgb2xkbWFzazsKKyAgdW5zaWduZWQgbG9uZyBjcjI7CisgIHN0cnVjdCBfZnBzdGF0ZSAqIGZwc3RhdGU7CisgIHVuc2lnbmVkIGxvbmcgX19yZXNlcnZlZDEgWzhdOworfTsKKworI2VuZGlmIC8qIF9fV09SRFNJWkUgPT0gNjQgKi8KKworI2VuZGlmIC8qIF9CSVRTX1NJR0NPTlRFWFRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ2luZm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlMzE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdpbmZvLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qIHNpZ2luZm9fdCwgc2lnZXZlbnQgYW5kIGNvbnN0YW50cy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TSUdOQUxfSCAmJiAhZGVmaW5lZCBfX25lZWRfc2lnaW5mb190IFwKKyAgICAmJiAhZGVmaW5lZCBfX25lZWRfc2lnZXZlbnRfdAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHNpZ25hbC5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiAoIWRlZmluZWQgX19oYXZlX3NpZ3ZhbF90IFwKKyAgICAgJiYgKGRlZmluZWQgX1NJR05BTF9IIHx8IGRlZmluZWQgX19uZWVkX3NpZ2luZm9fdCBcCisJIHx8IGRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QpKQorIyBkZWZpbmUgX19oYXZlX3NpZ3ZhbF90CTEKKworLyogVHlwZSBmb3IgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBzaWduYWwuICAqLwordHlwZWRlZiB1bmlvbiBzaWd2YWwKKyAgeworICAgIGludCBzaXZhbF9pbnQ7CisgICAgdm9pZCAqc2l2YWxfcHRyOworICB9IHNpZ3ZhbF90OworI2VuZGlmCisKKyNpZiAoIWRlZmluZWQgX19oYXZlX3NpZ2luZm9fdCBcCisgICAgICYmIChkZWZpbmVkIF9TSUdOQUxfSCB8fCBkZWZpbmVkIF9fbmVlZF9zaWdpbmZvX3QpKQorIyBkZWZpbmUgX19oYXZlX3NpZ2luZm9fdAkxCisKKyMgZGVmaW5lIF9fU0lfTUFYX1NJWkUgICAgIDEyOAorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgX19TSV9QQURfU0laRSAgICAgKChfX1NJX01BWF9TSVpFIC8gc2l6ZW9mIChpbnQpKSAtIDQpCisjIGVsc2UKKyMgIGRlZmluZSBfX1NJX1BBRF9TSVpFICAgICAoKF9fU0lfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gMykKKyMgZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnaW5mbworICB7CisgICAgaW50IHNpX3NpZ25vOwkJLyogU2lnbmFsIG51bWJlci4gICovCisgICAgaW50IHNpX2Vycm5vOwkJLyogSWYgbm9uLXplcm8sIGFuIGVycm5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAorCQkJCSAgIHRoaXMgc2lnbmFsLCBhcyBkZWZpbmVkIGluIDxlcnJuby5oPi4gICovCisgICAgaW50IHNpX2NvZGU7CQkvKiBTaWduYWwgY29kZS4gICovCisKKyAgICB1bmlvbgorICAgICAgeworCWludCBfcGFkW19fU0lfUEFEX1NJWkVdOworCisJIC8qIGtpbGwoKS4gICovCisJc3RydWN0CisJICB7CisJICAgIF9fcGlkX3Qgc2lfcGlkOwkvKiBTZW5kaW5nIHByb2Nlc3MgSUQuICAqLworCSAgICBfX3VpZF90IHNpX3VpZDsJLyogUmVhbCB1c2VyIElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisJICB9IF9raWxsOworCisJLyogUE9TSVguMWIgdGltZXJzLiAgKi8KKwlzdHJ1Y3QKKwkgIHsKKwkgICAgaW50IHNpX3RpZDsJCS8qIFRpbWVyIElELiAgKi8KKwkgICAgaW50IHNpX292ZXJydW47CS8qIE92ZXJydW4gY291bnQuICAqLworCSAgICBzaWd2YWxfdCBzaV9zaWd2YWw7CS8qIFNpZ25hbCB2YWx1ZS4gICovCisJICB9IF90aW1lcjsKKworCS8qIFBPU0lYLjFiIHNpZ25hbHMuICAqLworCXN0cnVjdAorCSAgeworCSAgICBfX3BpZF90IHNpX3BpZDsJLyogU2VuZGluZyBwcm9jZXNzIElELiAgKi8KKwkgICAgX191aWRfdCBzaV91aWQ7CS8qIFJlYWwgdXNlciBJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworCSAgICBzaWd2YWxfdCBzaV9zaWd2YWw7CS8qIFNpZ25hbCB2YWx1ZS4gICovCisJICB9IF9ydDsKKworCS8qIFNJR0NITEQuICAqLworCXN0cnVjdAorCSAgeworCSAgICBfX3BpZF90IHNpX3BpZDsJLyogV2hpY2ggY2hpbGQuICAqLworCSAgICBfX3VpZF90IHNpX3VpZDsJLyogUmVhbCB1c2VyIElEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCisJICAgIGludCBzaV9zdGF0dXM7CS8qIEV4aXQgdmFsdWUgb3Igc2lnbmFsLiAgKi8KKwkgICAgX19jbG9ja190IHNpX3V0aW1lOworCSAgICBfX2Nsb2NrX3Qgc2lfc3RpbWU7CisJICB9IF9zaWdjaGxkOworCisJLyogU0lHSUxMLCBTSUdGUEUsIFNJR1NFR1YsIFNJR0JVUy4gICovCisJc3RydWN0CisJICB7CisJICAgIHZvaWQgKnNpX2FkZHI7CS8qIEZhdWx0aW5nIGluc24vbWVtb3J5IHJlZi4gICovCisJICB9IF9zaWdmYXVsdDsKKworCS8qIFNJR1BPTEwuICAqLworCXN0cnVjdAorCSAgeworCSAgICBsb25nIGludCBzaV9iYW5kOwkvKiBCYW5kIGV2ZW50IGZvciBTSUdQT0xMLiAgKi8KKwkgICAgaW50IHNpX2ZkOworCSAgfSBfc2lncG9sbDsKKyAgICAgIH0gX3NpZmllbGRzOworICB9IHNpZ2luZm9fdDsKKworCisvKiBYL09wZW4gcmVxdWlyZXMgc29tZSBtb3JlIGZpZWxkcyB3aXRoIGZpeGVkIG5hbWVzLiAgKi8KKyMgZGVmaW5lIHNpX3BpZAkJX3NpZmllbGRzLl9raWxsLnNpX3BpZAorIyBkZWZpbmUgc2lfdWlkCQlfc2lmaWVsZHMuX2tpbGwuc2lfdWlkCisjIGRlZmluZSBzaV90aW1lcmlkCV9zaWZpZWxkcy5fdGltZXIuc2lfdGlkCisjIGRlZmluZSBzaV9vdmVycnVuCV9zaWZpZWxkcy5fdGltZXIuc2lfb3ZlcnJ1bgorIyBkZWZpbmUgc2lfc3RhdHVzCV9zaWZpZWxkcy5fc2lnY2hsZC5zaV9zdGF0dXMKKyMgZGVmaW5lIHNpX3V0aW1lCV9zaWZpZWxkcy5fc2lnY2hsZC5zaV91dGltZQorIyBkZWZpbmUgc2lfc3RpbWUJX3NpZmllbGRzLl9zaWdjaGxkLnNpX3N0aW1lCisjIGRlZmluZSBzaV92YWx1ZQlfc2lmaWVsZHMuX3J0LnNpX3NpZ3ZhbAorIyBkZWZpbmUgc2lfaW50CQlfc2lmaWVsZHMuX3J0LnNpX3NpZ3ZhbC5zaXZhbF9pbnQKKyMgZGVmaW5lIHNpX3B0cgkJX3NpZmllbGRzLl9ydC5zaV9zaWd2YWwuc2l2YWxfcHRyCisjIGRlZmluZSBzaV9hZGRyCV9zaWZpZWxkcy5fc2lnZmF1bHQuc2lfYWRkcgorIyBkZWZpbmUgc2lfYmFuZAlfc2lmaWVsZHMuX3NpZ3BvbGwuc2lfYmFuZAorIyBkZWZpbmUgc2lfZmQJCV9zaWZpZWxkcy5fc2lncG9sbC5zaV9mZAorCisKKy8qIFZhbHVlcyBmb3IgYHNpX2NvZGUnLiAgUG9zaXRpdmUgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Iga2VybmVsLWdlbmVyYXRlZAorICAgc2lnbmFscy4gICovCitlbnVtCit7CisgIFNJX0FTWU5DTkwgPSAtNjAsCQkvKiBTZW50IGJ5IGFzeW5jaCBuYW1lIGxvb2t1cCBjb21wbGV0aW9uLiAgKi8KKyMgZGVmaW5lIFNJX0FTWU5DTkwJU0lfQVNZTkNOTAorICBTSV9US0lMTCA9IC02LAkJLyogU2VudCBieSB0a2lsbC4gICovCisjIGRlZmluZSBTSV9US0lMTAlTSV9US0lMTAorICBTSV9TSUdJTywJCQkvKiBTZW50IGJ5IHF1ZXVlZCBTSUdJTy4gKi8KKyMgZGVmaW5lIFNJX1NJR0lPCVNJX1NJR0lPCisgIFNJX0FTWU5DSU8sCQkJLyogU2VudCBieSBBSU8gY29tcGxldGlvbi4gICovCisjIGRlZmluZSBTSV9BU1lOQ0lPCVNJX0FTWU5DSU8KKyAgU0lfTUVTR1EsCQkJLyogU2VudCBieSByZWFsIHRpbWUgbWVzcSBzdGF0ZSBjaGFuZ2UuICAqLworIyBkZWZpbmUgU0lfTUVTR1EJU0lfTUVTR1EKKyAgU0lfVElNRVIsCQkJLyogU2VudCBieSB0aW1lciBleHBpcmF0aW9uLiAgKi8KKyMgZGVmaW5lIFNJX1RJTUVSCVNJX1RJTUVSCisgIFNJX1FVRVVFLAkJCS8qIFNlbnQgYnkgc2lncXVldWUuICAqLworIyBkZWZpbmUgU0lfUVVFVUUJU0lfUVVFVUUKKyAgU0lfVVNFUiwJCQkvKiBTZW50IGJ5IGtpbGwsIHNpZ3NlbmQsIHJhaXNlLiAgKi8KKyMgZGVmaW5lIFNJX1VTRVIJU0lfVVNFUgorICBTSV9LRVJORUwgPSAweDgwCQkvKiBTZW5kIGJ5IGtlcm5lbC4gICovCisjZGVmaW5lIFNJX0tFUk5FTAlTSV9LRVJORUwKK307CisKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHSUxMIHNpZ25hbC4gICovCitlbnVtCit7CisgIElMTF9JTExPUEMgPSAxLAkJLyogSWxsZWdhbCBvcGNvZGUuICAqLworIyBkZWZpbmUgSUxMX0lMTE9QQwlJTExfSUxMT1BDCisgIElMTF9JTExPUE4sCQkJLyogSWxsZWdhbCBvcGVyYW5kLiAgKi8KKyMgZGVmaW5lIElMTF9JTExPUE4JSUxMX0lMTE9QTgorICBJTExfSUxMQURSLAkJCS8qIElsbGVnYWwgYWRkcmVzc2luZyBtb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9JTExBRFIJSUxMX0lMTEFEUgorICBJTExfSUxMVFJQLAkJCS8qIElsbGVnYWwgdHJhcC4gKi8KKyMgZGVmaW5lIElMTF9JTExUUlAJSUxMX0lMTFRSUAorICBJTExfUFJWT1BDLAkJCS8qIFByaXZpbGVnZWQgb3Bjb2RlLiAgKi8KKyMgZGVmaW5lIElMTF9QUlZPUEMJSUxMX1BSVk9QQworICBJTExfUFJWUkVHLAkJCS8qIFByaXZpbGVnZWQgcmVnaXN0ZXIuICAqLworIyBkZWZpbmUgSUxMX1BSVlJFRwlJTExfUFJWUkVHCisgIElMTF9DT1BST0MsCQkJLyogQ29wcm9jZXNzb3IgZXJyb3IuICAqLworIyBkZWZpbmUgSUxMX0NPUFJPQwlJTExfQ09QUk9DCisgIElMTF9CQURTVEsJCQkvKiBJbnRlcm5hbCBzdGFjayBlcnJvci4gICovCisjIGRlZmluZSBJTExfQkFEU1RLCUlMTF9CQURTVEsKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR0ZQRSBzaWduYWwuICAqLworZW51bQoreworICBGUEVfSU5URElWID0gMSwJCS8qIEludGVnZXIgZGl2aWRlIGJ5IHplcm8uICAqLworIyBkZWZpbmUgRlBFX0lOVERJVglGUEVfSU5URElWCisgIEZQRV9JTlRPVkYsCQkJLyogSW50ZWdlciBvdmVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfSU5UT1ZGCUZQRV9JTlRPVkYKKyAgRlBFX0ZMVERJViwJCQkvKiBGbG9hdGluZyBwb2ludCBkaXZpZGUgYnkgemVyby4gICovCisjIGRlZmluZSBGUEVfRkxURElWCUZQRV9GTFRESVYKKyAgRlBFX0ZMVE9WRiwJCQkvKiBGbG9hdGluZyBwb2ludCBvdmVyZmxvdy4gICovCisjIGRlZmluZSBGUEVfRkxUT1ZGCUZQRV9GTFRPVkYKKyAgRlBFX0ZMVFVORCwJCQkvKiBGbG9hdGluZyBwb2ludCB1bmRlcmZsb3cuICAqLworIyBkZWZpbmUgRlBFX0ZMVFVORAlGUEVfRkxUVU5ECisgIEZQRV9GTFRSRVMsCQkJLyogRmxvYXRpbmcgcG9pbnQgaW5leGFjdCByZXN1bHQuICAqLworIyBkZWZpbmUgRlBFX0ZMVFJFUwlGUEVfRkxUUkVTCisgIEZQRV9GTFRJTlYsCQkJLyogRmxvYXRpbmcgcG9pbnQgaW52YWxpZCBvcGVyYXRpb24uICAqLworIyBkZWZpbmUgRlBFX0ZMVElOVglGUEVfRkxUSU5WCisgIEZQRV9GTFRTVUIJCQkvKiBTdWJzY3JpcHQgb3V0IG9mIHJhbmdlLiAgKi8KKyMgZGVmaW5lIEZQRV9GTFRTVUIJRlBFX0ZMVFNVQgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHU0VHViBzaWduYWwuICAqLworZW51bQoreworICBTRUdWX01BUEVSUiA9IDEsCQkvKiBBZGRyZXNzIG5vdCBtYXBwZWQgdG8gb2JqZWN0LiAgKi8KKyMgZGVmaW5lIFNFR1ZfTUFQRVJSCVNFR1ZfTUFQRVJSCisgIFNFR1ZfQUNDRVJSCQkJLyogSW52YWxpZCBwZXJtaXNzaW9ucyBmb3IgbWFwcGVkIG9iamVjdC4gICovCisjIGRlZmluZSBTRUdWX0FDQ0VSUglTRUdWX0FDQ0VSUgorfTsKKworLyogYHNpX2NvZGUnIHZhbHVlcyBmb3IgU0lHQlVTIHNpZ25hbC4gICovCitlbnVtCit7CisgIEJVU19BRFJBTE4gPSAxLAkJLyogSW52YWxpZCBhZGRyZXNzIGFsaWdubWVudC4gICovCisjIGRlZmluZSBCVVNfQURSQUxOCUJVU19BRFJBTE4KKyAgQlVTX0FEUkVSUiwJCQkvKiBOb24tZXhpc3RhbnQgcGh5c2ljYWwgYWRkcmVzcy4gICovCisjIGRlZmluZSBCVVNfQURSRVJSCUJVU19BRFJFUlIKKyAgQlVTX09CSkVSUgkJCS8qIE9iamVjdCBzcGVjaWZpYyBoYXJkd2FyZSBlcnJvci4gICovCisjIGRlZmluZSBCVVNfT0JKRVJSCUJVU19PQkpFUlIKK307CisKKy8qIGBzaV9jb2RlJyB2YWx1ZXMgZm9yIFNJR1RSQVAgc2lnbmFsLiAgKi8KK2VudW0KK3sKKyAgVFJBUF9CUktQVCA9IDEsCQkvKiBQcm9jZXNzIGJyZWFrcG9pbnQuICAqLworIyBkZWZpbmUgVFJBUF9CUktQVAlUUkFQX0JSS1BUCisgIFRSQVBfVFJBQ0UJCQkvKiBQcm9jZXNzIHRyYWNlIHRyYXAuICAqLworIyBkZWZpbmUgVFJBUF9UUkFDRQlUUkFQX1RSQUNFCit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdDSExEIHNpZ25hbC4gICovCitlbnVtCit7CisgIENMRF9FWElURUQgPSAxLAkJLyogQ2hpbGQgaGFzIGV4aXRlZC4gICovCisjIGRlZmluZSBDTERfRVhJVEVECUNMRF9FWElURUQKKyAgQ0xEX0tJTExFRCwJCQkvKiBDaGlsZCB3YXMga2lsbGVkLiAgKi8KKyMgZGVmaW5lIENMRF9LSUxMRUQJQ0xEX0tJTExFRAorICBDTERfRFVNUEVELAkJCS8qIENoaWxkIHRlcm1pbmF0ZWQgYWJub3JtYWxseS4gICovCisjIGRlZmluZSBDTERfRFVNUEVECUNMRF9EVU1QRUQKKyAgQ0xEX1RSQVBQRUQsCQkJLyogVHJhY2VkIGNoaWxkIGhhcyB0cmFwcGVkLiAgKi8KKyMgZGVmaW5lIENMRF9UUkFQUEVECUNMRF9UUkFQUEVECisgIENMRF9TVE9QUEVELAkJCS8qIENoaWxkIGhhcyBzdG9wcGVkLiAgKi8KKyMgZGVmaW5lIENMRF9TVE9QUEVECUNMRF9TVE9QUEVECisgIENMRF9DT05USU5VRUQJCQkvKiBTdG9wcGVkIGNoaWxkIGhhcyBjb250aW51ZWQuICAqLworIyBkZWZpbmUgQ0xEX0NPTlRJTlVFRAlDTERfQ09OVElOVUVECit9OworCisvKiBgc2lfY29kZScgdmFsdWVzIGZvciBTSUdQT0xMIHNpZ25hbC4gICovCitlbnVtCit7CisgIFBPTExfSU4gPSAxLAkJCS8qIERhdGEgaW5wdXQgYXZhaWxhYmxlLiAgKi8KKyMgZGVmaW5lIFBPTExfSU4JUE9MTF9JTgorICBQT0xMX09VVCwJCQkvKiBPdXRwdXQgYnVmZmVycyBhdmFpbGFibGUuICAqLworIyBkZWZpbmUgUE9MTF9PVVQJUE9MTF9PVVQKKyAgUE9MTF9NU0csCQkJLyogSW5wdXQgbWVzc2FnZSBhdmFpbGFibGUuICAgKi8KKyMgZGVmaW5lIFBPTExfTVNHCVBPTExfTVNHCisgIFBPTExfRVJSLAkJCS8qIEkvTyBlcnJvci4gICovCisjIGRlZmluZSBQT0xMX0VSUglQT0xMX0VSUgorICBQT0xMX1BSSSwJCQkvKiBIaWdoIHByaW9yaXR5IGlucHV0IGF2YWlsYWJsZS4gICovCisjIGRlZmluZSBQT0xMX1BSSQlQT0xMX1BSSQorICBQT0xMX0hVUAkJCS8qIERldmljZSBkaXNjb25uZWN0ZWQuICAqLworIyBkZWZpbmUgUE9MTF9IVVAJUE9MTF9IVVAKK307CisKKyMgdW5kZWYgX19uZWVkX3NpZ2luZm9fdAorI2VuZGlmCS8qICFoYXZlIHNpZ2luZm9fdCAmJiAoaGF2ZSBfU0lHTkFMX0ggfHwgbmVlZCBzaWdpbmZvX3QpLiAgKi8KKworCisjaWYgKGRlZmluZWQgX1NJR05BTF9IIHx8IGRlZmluZWQgX19uZWVkX3NpZ2V2ZW50X3QpIFwKKyAgICAmJiAhZGVmaW5lZCBfX2hhdmVfc2lnZXZlbnRfdAorIyBkZWZpbmUgX19oYXZlX3NpZ2V2ZW50X3QJMQorCisvKiBTdHJ1Y3R1cmUgdG8gdHJhbnNwb3J0IGFwcGxpY2F0aW9uLWRlZmluZWQgdmFsdWVzIHdpdGggc2lnbmFscy4gICovCisjIGRlZmluZSBfX1NJR0VWX01BWF9TSVpFCTY0CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX1NJR0VWX1BBRF9TSVpFCSgoX19TSUdFVl9NQVhfU0laRSAvIHNpemVvZiAoaW50KSkgLSA0KQorIyBlbHNlCisjICBkZWZpbmUgX19TSUdFVl9QQURfU0laRQkoKF9fU0lHRVZfTUFYX1NJWkUgLyBzaXplb2YgKGludCkpIC0gMykKKyMgZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc2lnZXZlbnQKKyAgeworICAgIHNpZ3ZhbF90IHNpZ2V2X3ZhbHVlOworICAgIGludCBzaWdldl9zaWdubzsKKyAgICBpbnQgc2lnZXZfbm90aWZ5OworCisgICAgdW5pb24KKyAgICAgIHsKKwlpbnQgX3BhZFtfX1NJR0VWX1BBRF9TSVpFXTsKKworCS8qIFdoZW4gU0lHRVZfU0lHTkFMIGFuZCBTSUdFVl9USFJFQURfSUQgc2V0LCBMV1AgSUQgb2YgdGhlCisJICAgdGhyZWFkIHRvIHJlY2VpdmUgdGhlIHNpZ25hbC4gICovCisJX19waWRfdCBfdGlkOworCisJc3RydWN0CisJICB7CisJICAgIHZvaWQgKCpfZnVuY3Rpb24pIChzaWd2YWxfdCk7CS8qIEZ1bmN0aW9uIHRvIHN0YXJ0LiAgKi8KKwkgICAgdm9pZCAqX2F0dHJpYnV0ZTsJCQkvKiBSZWFsbHkgcHRocmVhZF9hdHRyX3QuICAqLworCSAgfSBfc2lnZXZfdGhyZWFkOworICAgICAgfSBfc2lnZXZfdW47CisgIH0gc2lnZXZlbnRfdDsKKworLyogUE9TSVggbmFtZXMgdG8gYWNjZXNzIHNvbWUgb2YgdGhlIG1lbWJlcnMuICAqLworIyBkZWZpbmUgc2lnZXZfbm90aWZ5X2Z1bmN0aW9uICAgX3NpZ2V2X3VuLl9zaWdldl90aHJlYWQuX2Z1bmN0aW9uCisjIGRlZmluZSBzaWdldl9ub3RpZnlfYXR0cmlidXRlcyBfc2lnZXZfdW4uX3NpZ2V2X3RocmVhZC5fYXR0cmlidXRlCisKKy8qIGBzaWdldl9ub3RpZnknIHZhbHVlcy4gICovCitlbnVtCit7CisgIFNJR0VWX1NJR05BTCA9IDAsCQkvKiBOb3RpZnkgdmlhIHNpZ25hbC4gICovCisjIGRlZmluZSBTSUdFVl9TSUdOQUwJU0lHRVZfU0lHTkFMCisgIFNJR0VWX05PTkUsCQkJLyogT3RoZXIgbm90aWZpY2F0aW9uOiBtZWFuaW5nbGVzcy4gICovCisjIGRlZmluZSBTSUdFVl9OT05FCVNJR0VWX05PTkUKKyAgU0lHRVZfVEhSRUFELAkJCS8qIERlbGl2ZXIgdmlhIHRocmVhZCBjcmVhdGlvbi4gICovCisjIGRlZmluZSBTSUdFVl9USFJFQUQJU0lHRVZfVEhSRUFECisKKyAgU0lHRVZfVEhSRUFEX0lEID0gNAkJLyogU2VuZCBzaWduYWwgdG8gc3BlY2lmaWMgdGhyZWFkLiAgKi8KKyNkZWZpbmUgU0lHRVZfVEhSRUFEX0lECVNJR0VWX1RIUkVBRF9JRAorfTsKKworI2VuZGlmCS8qIGhhdmUgX1NJR05BTF9ILiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdudW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThhYzExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ251bS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIFNpZ25hbCBudW1iZXIgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmZGVmCV9TSUdOQUxfSAorCisvKiBGYWtlIHNpZ25hbCBmdW5jdGlvbnMuICAqLworI2RlZmluZSBTSUdfRVJSCSgoX19zaWdoYW5kbGVyX3QpIC0xKQkJLyogRXJyb3IgcmV0dXJuLiAgKi8KKyNkZWZpbmUgU0lHX0RGTAkoKF9fc2lnaGFuZGxlcl90KSAwKQkJLyogRGVmYXVsdCBhY3Rpb24uICAqLworI2RlZmluZSBTSUdfSUdOCSgoX19zaWdoYW5kbGVyX3QpIDEpCQkvKiBJZ25vcmUgc2lnbmFsLiAgKi8KKworI2lmZGVmIF9fVVNFX1VOSVg5OAorIyBkZWZpbmUgU0lHX0hPTEQJKChfX3NpZ2hhbmRsZXJfdCkgMikJLyogQWRkIHNpZ25hbCB0byBob2xkIG1hc2suICAqLworI2VuZGlmCisKKworLyogU2lnbmFscy4gICovCisjZGVmaW5lCVNJR0hVUAkJMQkvKiBIYW5ndXAgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0lOVAkJMgkvKiBJbnRlcnJ1cHQgKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHUVVJVAkJMwkvKiBRdWl0IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdJTEwJCTQJLyogSWxsZWdhbCBpbnN0cnVjdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdUUkFQCQk1CS8qIFRyYWNlIHRyYXAgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR0FCUlQJCTYJLyogQWJvcnQgKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHSU9UCQk2CS8qIElPVCB0cmFwICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR0JVUwkJNwkvKiBCVVMgZXJyb3IgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHRlBFCQk4CS8qIEZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiAoQU5TSSkuICAqLworI2RlZmluZQlTSUdLSUxMCQk5CS8qIEtpbGwsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdVU1IxCQkxMAkvKiBVc2VyLWRlZmluZWQgc2lnbmFsIDEgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1NFR1YJCTExCS8qIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KKyNkZWZpbmUJU0lHVVNSMgkJMTIJLyogVXNlci1kZWZpbmVkIHNpZ25hbCAyIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdQSVBFCQkxMwkvKiBCcm9rZW4gcGlwZSAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQUxSTQkJMTQJLyogQWxhcm0gY2xvY2sgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RFUk0JCTE1CS8qIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCisjZGVmaW5lCVNJR1NUS0ZMVAkxNgkvKiBTdGFjayBmYXVsdC4gICovCisjZGVmaW5lCVNJR0NMRAkJU0lHQ0hMRAkvKiBTYW1lIGFzIFNJR0NITEQgKFN5c3RlbSBWKS4gICovCisjZGVmaW5lCVNJR0NITEQJCTE3CS8qIENoaWxkIHN0YXR1cyBoYXMgY2hhbmdlZCAoUE9TSVgpLiAgKi8KKyNkZWZpbmUJU0lHQ09OVAkJMTgJLyogQ29udGludWUgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1NUT1AJCTE5CS8qIFN0b3AsIHVuYmxvY2thYmxlIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUU1RQCQkyMAkvKiBLZXlib2FyZCBzdG9wIChQT1NJWCkuICAqLworI2RlZmluZQlTSUdUVElOCQkyMQkvKiBCYWNrZ3JvdW5kIHJlYWQgZnJvbSB0dHkgKFBPU0lYKS4gICovCisjZGVmaW5lCVNJR1RUT1UJCTIyCS8qIEJhY2tncm91bmQgd3JpdGUgdG8gdHR5IChQT1NJWCkuICAqLworI2RlZmluZQlTSUdVUkcJCTIzCS8qIFVyZ2VudCBjb25kaXRpb24gb24gc29ja2V0ICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1hDUFUJCTI0CS8qIENQVSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdYRlNaCQkyNQkvKiBGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHVlRBTFJNCTI2CS8qIFZpcnR1YWwgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyNkZWZpbmUJU0lHUFJPRgkJMjcJLyogUHJvZmlsaW5nIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisjZGVmaW5lCVNJR1dJTkNICTI4CS8qIFdpbmRvdyBzaXplIGNoYW5nZSAoNC4zIEJTRCwgU3VuKS4gICovCisjZGVmaW5lCVNJR1BPTEwJCVNJR0lPCS8qIFBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIChTeXN0ZW0gVikuICAqLworI2RlZmluZQlTSUdJTwkJMjkJLyogSS9PIG5vdyBwb3NzaWJsZSAoNC4yIEJTRCkuICAqLworI2RlZmluZQlTSUdQV1IJCTMwCS8qIFBvd2VyIGZhaWx1cmUgcmVzdGFydCAoU3lzdGVtIFYpLiAgKi8KKyNkZWZpbmUgU0lHU1lTCQkzMQkvKiBCYWQgc3lzdGVtIGNhbGwuICAqLworI2RlZmluZSBTSUdVTlVTRUQJMzEKKworI2RlZmluZQlfTlNJRwkJNjUJLyogQmlnZ2VzdCBzaWduYWwgbnVtYmVyICsgMQorCQkJCSAgIChpbmNsdWRpbmcgcmVhbC10aW1lIHNpZ25hbHMpLiAgKi8KKworI2RlZmluZSBTSUdSVE1JTiAgICAgICAgKF9fbGliY19jdXJyZW50X3NpZ3J0bWluICgpKQorI2RlZmluZSBTSUdSVE1BWCAgICAgICAgKF9fbGliY19jdXJyZW50X3NpZ3J0bWF4ICgpKQorCisvKiBUaGVzZSBhcmUgdGhlIGhhcmQgbGltaXRzIG9mIHRoZSBrZXJuZWwuICBUaGVzZSB2YWx1ZXMgc2hvdWxkIG5vdCBiZQorICAgdXNlZCBkaXJlY3RseSBhdCB1c2VyIGxldmVsLiAgKi8KKyNkZWZpbmUgX19TSUdSVE1JTgkzMgorI2RlZmluZSBfX1NJR1JUTUFYCShfTlNJRyAtIDEpCisKKyNlbmRpZgkvKiA8c2lnbmFsLmg+IGluY2x1ZGVkLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdzZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVjOGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ3NldC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKiBfX3NpZ19hdG9taWNfdCwgX19zaWdzZXRfdCwgYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk0LCAxOTk2LCAxOTk3LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU0lHU0VUX0hfdHlwZXMKKyMgZGVmaW5lIF9TSUdTRVRfSF90eXBlcwkxCisKK3R5cGVkZWYgaW50IF9fc2lnX2F0b21pY190OworCisvKiBBIGBzaWdzZXRfdCcgaGFzIGEgYml0IGZvciBlYWNoIHNpZ25hbC4gICovCisKKyMgZGVmaW5lIF9TSUdTRVRfTldPUkRTCSgxMDI0IC8gKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX192YWxbX1NJR1NFVF9OV09SRFNdOworICB9IF9fc2lnc2V0X3Q7CisKKyNlbmRpZgorCisKKy8qIFdlIG9ubHkgd2FudCB0byBkZWZpbmUgdGhlc2UgZnVuY3Rpb25zIGlmIDxzaWduYWwuaD4gd2FzIGFjdHVhbGx5CisgICBpbmNsdWRlZDsgb3RoZXJ3aXNlIHdlIHdlcmUgaW5jbHVkZWQganVzdCB0byBkZWZpbmUgdGhlIHR5cGVzLiAgU2luY2Ugd2UKKyAgIGFyZSBuYW1lc3BhY2UtY2xlYW4sIGl0IHdvdWxkbid0IGh1cnQgdG8gZGVmaW5lIGV4dHJhIG1hY3Jvcy4gIEJ1dAorICAgdHJvdWJsZSBjYW4gYmUgY2F1c2VkIGJ5IGZ1bmN0aW9ucyBiZWluZyBkZWZpbmVkIChlLmcuLCBhbnkgZ2xvYmFsCisgICByZWdpc3RlciB2YXJzIGRlY2xhcmVkIGxhdGVyIHdpbGwgY2F1c2UgY29tcGlsYXRpb24gZXJyb3JzKS4gICovCisKKyNpZiAhZGVmaW5lZCBfU0lHU0VUX0hfZm5zICYmIGRlZmluZWQgX1NJR05BTF9ICisjIGRlZmluZSBfU0lHU0VUX0hfZm5zIDEKKworIyBpZm5kZWYgX0VYVEVSTl9JTkxJTkUKKyMgIGRlZmluZSBfRVhURVJOX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyMgZW5kaWYKKworLyogUmV0dXJuIGEgbWFzayB0aGF0IGluY2x1ZGVzIHRoZSBiaXQgZm9yIFNJRyBvbmx5LiAgKi8KKyMgZGVmaW5lIF9fc2lnbWFzayhzaWcpIFwKKyAgKCgodW5zaWduZWQgbG9uZyBpbnQpIDEpIDw8ICgoKHNpZykgLSAxKSAlICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpKSkKKworLyogUmV0dXJuIHRoZSB3b3JkIGluZGV4IGZvciBTSUcuICAqLworIyBkZWZpbmUgX19zaWd3b3JkKHNpZykJKCgoc2lnKSAtIDEpIC8gKDggKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSkpCisKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjICBkZWZpbmUgX19zaWdlbXB0eXNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKSBfX3NldC0+X192YWxbX19jbnRdID0gMDsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICBkZWZpbmUgX19zaWdmaWxsc2V0KHNldCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fc2V0ID0gKHNldCk7CQkJCSAgICAgIFwKKwkJICAgIHdoaWxlICgtLV9fY250ID49IDApIF9fc2V0LT5fX3ZhbFtfX2NudF0gPSB+MFVMOwkgICAgICBcCisJCSAgICAwOyB9KSkKKworIyAgaWZkZWYgX19VU0VfR05VCisvKiBUaGUgUE9TSVggZG9lcyBub3Qgc3BlY2lmeSBmb3IgaGFuZGxpbmcgdGhlIHdob2xlIHNpZ25hbCBzZXQgaW4gb25lCisgICBjb21tYW5kLiAgVGhpcyBpcyBvZnRlbiB3YW50ZWQgYW5kIHNvIHdlIGRlZmluZSB0aHJlZSBtb3JlIGZ1bmN0aW9ucworICAgaGVyZS4gICovCisjICAgZGVmaW5lIF9fc2lnaXNlbXB0eXNldChzZXQpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgaW50IF9fY250ID0gX1NJR1NFVF9OV09SRFM7CQkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3NldCA9IChzZXQpOwkJCSAgICAgIFwKKwkJICAgIGludCBfX3JldCA9IF9fc2V0LT5fX3ZhbFstLV9fY250XTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoIV9fcmV0ICYmIC0tX19jbnQgPj0gMCkJCQkgICAgICBcCisJCQlfX3JldCA9IF9fc2V0LT5fX3ZhbFtfX2NudF07CQkJICAgICAgXAorCQkgICAgX19yZXQgPT0gMDsgfSkpCisjICAgZGVmaW5lIF9fc2lnYW5kc2V0KGRlc3QsIGxlZnQsIHJpZ2h0KSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGludCBfX2NudCA9IF9TSUdTRVRfTldPUkRTOwkJCQkgICAgICBcCisJCSAgICBzaWdzZXRfdCAqX19kZXN0ID0gKGRlc3QpOwkJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19sZWZ0ID0gKGxlZnQpOwkJCSAgICAgIFwKKwkJICAgIGNvbnN0IHNpZ3NldF90ICpfX3JpZ2h0ID0gKHJpZ2h0KTsJCQkgICAgICBcCisJCSAgICB3aGlsZSAoLS1fX2NudCA+PSAwKQkJCQkgICAgICBcCisJCSAgICAgIF9fZGVzdC0+X192YWxbX19jbnRdID0gKF9fbGVmdC0+X192YWxbX19jbnRdCSAgICAgIFwKKwkJCQkJICAgICAgJiBfX3JpZ2h0LT5fX3ZhbFtfX2NudF0pOwkgICAgICBcCisJCSAgICAwOyB9KSkKKyMgICBkZWZpbmUgX19zaWdvcnNldChkZXN0LCBsZWZ0LCByaWdodCkgXAorICAoX19leHRlbnNpb25fXyAoeyBpbnQgX19jbnQgPSBfU0lHU0VUX05XT1JEUzsJCQkJICAgICAgXAorCQkgICAgc2lnc2V0X3QgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgY29uc3Qgc2lnc2V0X3QgKl9fbGVmdCA9IChsZWZ0KTsJCQkgICAgICBcCisJCSAgICBjb25zdCBzaWdzZXRfdCAqX19yaWdodCA9IChyaWdodCk7CQkJICAgICAgXAorCQkgICAgd2hpbGUgKC0tX19jbnQgPj0gMCkJCQkJICAgICAgXAorCQkgICAgICBfX2Rlc3QtPl9fdmFsW19fY250XSA9IChfX2xlZnQtPl9fdmFsW19fY250XQkgICAgICBcCisJCQkJCSAgICAgIHwgX19yaWdodC0+X192YWxbX19jbnRdKTsJICAgICAgXAorCQkgICAgMDsgfSkpCisjICBlbmRpZgorIyBlbmRpZgorCisvKiBUaGVzZSBmdW5jdGlvbnMgbmVlZG4ndCBjaGVjayBmb3IgYSBib2d1cyBzaWduYWwgbnVtYmVyIC0tIGVycm9yCisgICBjaGVja2luZyBpcyBkb25lIGluIHRoZSBub24gX18gdmVyc2lvbnMuICAqLworCitleHRlcm4gaW50IF9fc2lnaXNtZW1iZXIgKF9fY29uc3QgX19zaWdzZXRfdCAqLCBpbnQpOworZXh0ZXJuIGludCBfX3NpZ2FkZHNldCAoX19zaWdzZXRfdCAqLCBpbnQpOworZXh0ZXJuIGludCBfX3NpZ2RlbHNldCAoX19zaWdzZXRfdCAqLCBpbnQpOworCisjIGlmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjICBkZWZpbmUgX19TSUdTRVRGTihOQU1FLCBCT0RZLCBDT05TVCkJCQkJCSAgICAgIFwKKyAgX0VYVEVSTl9JTkxJTkUgaW50CQkJCQkJCSAgICAgIFwKKyAgTkFNRSAoQ09OU1QgX19zaWdzZXRfdCAqX19zZXQsIGludCBfX3NpZykJCQkJICAgICAgXAorICB7CQkJCQkJCQkJICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fbWFzayA9IF9fc2lnbWFzayAoX19zaWcpOwkJCSAgICAgIFwKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3dvcmQgPSBfX3NpZ3dvcmQgKF9fc2lnKTsJCQkgICAgICBcCisgICAgcmV0dXJuIEJPRFk7CQkJCQkJCSAgICAgIFwKKyAgfQorCitfX1NJR1NFVEZOIChfX3NpZ2lzbWVtYmVyLCAoX19zZXQtPl9fdmFsW19fd29yZF0gJiBfX21hc2spID8gMSA6IDAsIF9fY29uc3QpCitfX1NJR1NFVEZOIChfX3NpZ2FkZHNldCwgKChfX3NldC0+X192YWxbX193b3JkXSB8PSBfX21hc2spLCAwKSwgKQorX19TSUdTRVRGTiAoX19zaWdkZWxzZXQsICgoX19zZXQtPl9fdmFsW19fd29yZF0gJj0gfl9fbWFzayksIDApLCApCisKKyMgIHVuZGVmIF9fU0lHU0VURk4KKyMgZW5kaWYKKworCisjZW5kaWYgLyogISBfU0lHU0VUX0hfZm5zLiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdzdGFjay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNjAzNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWdzdGFjay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHNpZ3N0YWNrLCBzaWdhbHRzdGFjayBkZWZpbml0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0lHTkFMX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiAgVXNlIDxzaWduYWwuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc2lnbmFsIHN0YWNrIChvYnNvbGV0ZSkuICAqLworc3RydWN0IHNpZ3N0YWNrCisgIHsKKyAgICB2b2lkICpzc19zcDsJCS8qIFNpZ25hbCBzdGFjayBwb2ludGVyLiAgKi8KKyAgICBpbnQgc3Nfb25zdGFjazsJCS8qIE5vbnplcm8gaWYgZXhlY3V0aW5nIG9uIHRoaXMgc3RhY2suICAqLworICB9OworCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgYHNzX2ZsYWdzLicuICAqLworZW51bQoreworICBTU19PTlNUQUNLID0gMSwKKyNkZWZpbmUgU1NfT05TVEFDSwlTU19PTlNUQUNLCisgIFNTX0RJU0FCTEUKKyNkZWZpbmUgU1NfRElTQUJMRQlTU19ESVNBQkxFCit9OworCisvKiBNaW5pbXVtIHN0YWNrIHNpemUgZm9yIGEgc2lnbmFsIGhhbmRsZXIuICAqLworI2RlZmluZSBNSU5TSUdTVEtTWgkyMDQ4CisKKy8qIFN5c3RlbSBkZWZhdWx0IHN0YWNrIHNpemUuICAqLworI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKworLyogQWx0ZXJuYXRlLCBwcmVmZXJyZWQgaW50ZXJmYWNlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHNpZ2FsdHN0YWNrCisgIHsKKyAgICB2b2lkICpzc19zcDsKKyAgICBpbnQgc3NfZmxhZ3M7CisgICAgc2l6ZV90IHNzX3NpemU7CisgIH0gc3RhY2tfdDsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWd0aHJlYWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zaWd0aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBiZGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NpZ3RocmVhZC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIFNpZ25hbCBoYW5kbGluZyBmdW5jdGlvbiBmb3IgdGhyZWFkZWQgcHJvZ3JhbXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKKyAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19TSUdUSFJFQURfSAorI2RlZmluZSBfQklUU19TSUdUSFJFQURfSAkxCisKKyNpZiAhZGVmaW5lZCBfU0lHTkFMX0ggJiYgIWRlZmluZWQgX1BUSFJFQURfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBVc2UgPHB0aHJlYWQuaD4gaW5zdGVhZCIKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHNpZ25hbHMuICovCisKKy8qIE1vZGlmeSB0aGUgc2lnbmFsIG1hc2sgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4gIFRoZSBhcmd1bWVudHMgaGF2ZQorICAgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3Igc2lncHJvY21hc2soMikuICovCitleHRlcm4gaW50IHB0aHJlYWRfc2lnbWFzayAoaW50IF9faG93LAorCQkJICAgIF9fY29uc3QgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX25ld21hc2ssCisJCQkgICAgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX29sZG1hc2spX19USFJPVzsKKworLyogU2VuZCBzaWduYWwgU0lHTk8gdG8gdGhlIGdpdmVuIHRocmVhZC4gKi8KK2V4dGVybiBpbnQgcHRocmVhZF9raWxsIChwdGhyZWFkX3QgX190aHJlYWRpZCwgaW50IF9fc2lnbm8pIF9fVEhST1c7CisKKyNlbmRpZgkvKiBiaXRzL3NpZ3RocmVhZC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc29ja2FkZHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zb2NrYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMWQxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc29ja2FkZHIuaApAQCAtMCwwICsxLDQwIEBACisvKiBEZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc29ja2FkZHJfKicgY29tbW9uIG1lbWJlcnMuICBHZW5lcmljLzQuMiBCU0QgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMTk5OCwyMDAwLDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxzeXMvc29ja2V0Lmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZiBfQklUU19TT0NLQUREUl9ICisjZGVmaW5lIF9CSVRTX1NPQ0tBRERSX0gJMQorCisKKy8qIFBPU0lYLjFnIHNwZWNpZmllcyB0aGlzIHR5cGUgbmFtZSBmb3IgdGhlIGBzYV9mYW1pbHknIG1lbWJlci4gICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBzYV9mYW1pbHlfdDsKKworLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlY2xhcmUgdGhlIGluaXRpYWwgY29tbW9uIG1lbWJlcnMKKyAgIG9mIHRoZSBkYXRhIHR5cGVzIHVzZWQgZm9yIHNvY2tldCBhZGRyZXNzZXMsIGBzdHJ1Y3Qgc29ja2FkZHInLAorICAgYHN0cnVjdCBzb2NrYWRkcl9pbicsIGBzdHJ1Y3Qgc29ja2FkZHJfdW4nLCBldGMuICAqLworCisjZGVmaW5lCV9fU09DS0FERFJfQ09NTU9OKHNhX3ByZWZpeCkgXAorICBzYV9mYW1pbHlfdCBzYV9wcmVmaXgjI2ZhbWlseQorCisjZGVmaW5lIF9fU09DS0FERFJfQ09NTU9OX1NJWkUJKHNpemVvZiAodW5zaWduZWQgc2hvcnQgaW50KSkKKworI2VuZGlmCS8qIGJpdHMvc29ja2FkZHIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NvY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmI2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc29ja2V0LmgKQEAgLTAsMCArMSwzMzAgQEAKKy8qIFN5c3RlbS1zcGVjaWZpYyBzb2NrZXQgY29uc3RhbnRzIGFuZCB0eXBlcy4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTQtMjAwMSwgMjAwNCwgMjAwNiwgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19CSVRTX1NPQ0tFVF9ICisjZGVmaW5lIF9fQklUU19TT0NLRVRfSAorCisjaWZuZGVmIF9TWVNfU09DS0VUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc29ja2V0Lmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjZGVmaW5lIF9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVHlwZSBmb3IgbGVuZ3RoIGFyZ3VtZW50cyBpbiBzb2NrZXQgY2FsbHMuICAqLworI2lmbmRlZiBfX3NvY2tsZW5fdF9kZWZpbmVkCit0eXBlZGVmIF9fc29ja2xlbl90IHNvY2tsZW5fdDsKKyMgZGVmaW5lIF9fc29ja2xlbl90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUeXBlcyBvZiBzb2NrZXRzLiAgKi8KK2VudW0gX19zb2NrZXRfdHlwZQoreworICBTT0NLX1NUUkVBTSA9IDEsCQkvKiBTZXF1ZW5jZWQsIHJlbGlhYmxlLCBjb25uZWN0aW9uLWJhc2VkCisJCQkJICAgYnl0ZSBzdHJlYW1zLiAgKi8KKyNkZWZpbmUgU09DS19TVFJFQU0gU09DS19TVFJFQU0KKyAgU09DS19ER1JBTSA9IDIsCQkvKiBDb25uZWN0aW9ubGVzcywgdW5yZWxpYWJsZSBkYXRhZ3JhbXMKKwkJCQkgICBvZiBmaXhlZCBtYXhpbXVtIGxlbmd0aC4gICovCisjZGVmaW5lIFNPQ0tfREdSQU0gU09DS19ER1JBTQorICBTT0NLX1JBVyA9IDMsCQkJLyogUmF3IHByb3RvY29sIGludGVyZmFjZS4gICovCisjZGVmaW5lIFNPQ0tfUkFXIFNPQ0tfUkFXCisgIFNPQ0tfUkRNID0gNCwJCQkvKiBSZWxpYWJseS1kZWxpdmVyZWQgbWVzc2FnZXMuICAqLworI2RlZmluZSBTT0NLX1JETSBTT0NLX1JETQorICBTT0NLX1NFUVBBQ0tFVCA9IDUsCQkvKiBTZXF1ZW5jZWQsIHJlbGlhYmxlLCBjb25uZWN0aW9uLWJhc2VkLAorCQkJCSAgIGRhdGFncmFtcyBvZiBmaXhlZCBtYXhpbXVtIGxlbmd0aC4gICovCisjZGVmaW5lIFNPQ0tfU0VRUEFDS0VUIFNPQ0tfU0VRUEFDS0VUCisgIFNPQ0tfUEFDS0VUID0gMTAJCS8qIExpbnV4IHNwZWNpZmljIHdheSBvZiBnZXR0aW5nIHBhY2tldHMKKwkJCQkgICBhdCB0aGUgZGV2IGxldmVsLiAgRm9yIHdyaXRpbmcgcmFycCBhbmQKKwkJCQkgICBvdGhlciBzaW1pbGFyIHRoaW5ncyBvbiB0aGUgdXNlciBsZXZlbC4gKi8KKyNkZWZpbmUgU09DS19QQUNLRVQgU09DS19QQUNLRVQKK307CisKKy8qIFByb3RvY29sIGZhbWlsaWVzLiAgKi8KKyNkZWZpbmUJUEZfVU5TUEVDCTAJLyogVW5zcGVjaWZpZWQuICAqLworI2RlZmluZQlQRl9MT0NBTAkxCS8qIExvY2FsIHRvIGhvc3QgKHBpcGVzIGFuZCBmaWxlLWRvbWFpbikuICAqLworI2RlZmluZQlQRl9VTklYCQlQRl9MT0NBTCAvKiBQT1NJWCBuYW1lIGZvciBQRl9MT0NBTC4gICovCisjZGVmaW5lCVBGX0ZJTEUJCVBGX0xPQ0FMIC8qIEFub3RoZXIgbm9uLXN0YW5kYXJkIG5hbWUgZm9yIFBGX0xPQ0FMLiAgKi8KKyNkZWZpbmUJUEZfSU5FVAkJMgkvKiBJUCBwcm90b2NvbCBmYW1pbHkuICAqLworI2RlZmluZQlQRl9BWDI1CQkzCS8qIEFtYXRldXIgUmFkaW8gQVguMjUuICAqLworI2RlZmluZQlQRl9JUFgJCTQJLyogTm92ZWxsIEludGVybmV0IFByb3RvY29sLiAgKi8KKyNkZWZpbmUJUEZfQVBQTEVUQUxLCTUJLyogQXBwbGV0YWxrIEREUC4gICovCisjZGVmaW5lCVBGX05FVFJPTQk2CS8qIEFtYXRldXIgcmFkaW8gTmV0Uk9NLiAgKi8KKyNkZWZpbmUJUEZfQlJJREdFCTcJLyogTXVsdGlwcm90b2NvbCBicmlkZ2UuICAqLworI2RlZmluZQlQRl9BVE1QVkMJOAkvKiBBVE0gUFZDcy4gICovCisjZGVmaW5lCVBGX1gyNQkJOQkvKiBSZXNlcnZlZCBmb3IgWC4yNSBwcm9qZWN0LiAgKi8KKyNkZWZpbmUJUEZfSU5FVDYJMTAJLyogSVAgdmVyc2lvbiA2LiAgKi8KKyNkZWZpbmUJUEZfUk9TRQkJMTEJLyogQW1hdGV1ciBSYWRpbyBYLjI1IFBMUC4gICovCisjZGVmaW5lCVBGX0RFQ25ldAkxMgkvKiBSZXNlcnZlZCBmb3IgREVDbmV0IHByb2plY3QuICAqLworI2RlZmluZQlQRl9ORVRCRVVJCTEzCS8qIFJlc2VydmVkIGZvciA4MDIuMkxMQyBwcm9qZWN0LiAgKi8KKyNkZWZpbmUJUEZfU0VDVVJJVFkJMTQJLyogU2VjdXJpdHkgY2FsbGJhY2sgcHNldWRvIEFGLiAgKi8KKyNkZWZpbmUJUEZfS0VZCQkxNQkvKiBQRl9LRVkga2V5IG1hbmFnZW1lbnQgQVBJLiAgKi8KKyNkZWZpbmUJUEZfTkVUTElOSwkxNgorI2RlZmluZQlQRl9ST1VURQlQRl9ORVRMSU5LIC8qIEFsaWFzIHRvIGVtdWxhdGUgNC40QlNELiAgKi8KKyNkZWZpbmUJUEZfUEFDS0VUCTE3CS8qIFBhY2tldCBmYW1pbHkuICAqLworI2RlZmluZQlQRl9BU0gJCTE4CS8qIEFzaC4gICovCisjZGVmaW5lCVBGX0VDT05FVAkxOQkvKiBBY29ybiBFY29uZXQuICAqLworI2RlZmluZQlQRl9BVE1TVkMJMjAJLyogQVRNIFNWQ3MuICAqLworI2RlZmluZQlQRl9TTkEJCTIyCS8qIExpbnV4IFNOQSBQcm9qZWN0ICovCisjZGVmaW5lCVBGX0lSREEJCTIzCS8qIElSREEgc29ja2V0cy4gICovCisjZGVmaW5lCVBGX1BQUE9YCTI0CS8qIFBQUG9YIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9XQU5QSVBFCTI1CS8qIFdhbnBpcGUgQVBJIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9CTFVFVE9PVEgJMzEJLyogQmx1ZXRvb3RoIHNvY2tldHMuICAqLworI2RlZmluZQlQRl9JVUNWCQkzMgkvKiBJVUNWIHNvY2tldHMuICAqLworI2RlZmluZSBQRl9SWFJQQwkzMwkvKiBSeFJQQyBzb2NrZXRzLiAgKi8KKyNkZWZpbmUJUEZfTUFYCQkzNAkvKiBGb3Igbm93Li4gICovCisKKy8qIEFkZHJlc3MgZmFtaWxpZXMuICAqLworI2RlZmluZQlBRl9VTlNQRUMJUEZfVU5TUEVDCisjZGVmaW5lCUFGX0xPQ0FMCVBGX0xPQ0FMCisjZGVmaW5lCUFGX1VOSVgJCVBGX1VOSVgKKyNkZWZpbmUJQUZfRklMRQkJUEZfRklMRQorI2RlZmluZQlBRl9JTkVUCQlQRl9JTkVUCisjZGVmaW5lCUFGX0FYMjUJCVBGX0FYMjUKKyNkZWZpbmUJQUZfSVBYCQlQRl9JUFgKKyNkZWZpbmUJQUZfQVBQTEVUQUxLCVBGX0FQUExFVEFMSworI2RlZmluZQlBRl9ORVRST00JUEZfTkVUUk9NCisjZGVmaW5lCUFGX0JSSURHRQlQRl9CUklER0UKKyNkZWZpbmUJQUZfQVRNUFZDCVBGX0FUTVBWQworI2RlZmluZQlBRl9YMjUJCVBGX1gyNQorI2RlZmluZQlBRl9JTkVUNglQRl9JTkVUNgorI2RlZmluZQlBRl9ST1NFCQlQRl9ST1NFCisjZGVmaW5lCUFGX0RFQ25ldAlQRl9ERUNuZXQKKyNkZWZpbmUJQUZfTkVUQkVVSQlQRl9ORVRCRVVJCisjZGVmaW5lCUFGX1NFQ1VSSVRZCVBGX1NFQ1VSSVRZCisjZGVmaW5lCUFGX0tFWQkJUEZfS0VZCisjZGVmaW5lCUFGX05FVExJTksJUEZfTkVUTElOSworI2RlZmluZQlBRl9ST1VURQlQRl9ST1VURQorI2RlZmluZQlBRl9QQUNLRVQJUEZfUEFDS0VUCisjZGVmaW5lCUFGX0FTSAkJUEZfQVNICisjZGVmaW5lCUFGX0VDT05FVAlQRl9FQ09ORVQKKyNkZWZpbmUJQUZfQVRNU1ZDCVBGX0FUTVNWQworI2RlZmluZQlBRl9TTkEJCVBGX1NOQQorI2RlZmluZQlBRl9JUkRBCQlQRl9JUkRBCisjZGVmaW5lCUFGX1BQUE9YCVBGX1BQUE9YCisjZGVmaW5lCUFGX1dBTlBJUEUJUEZfV0FOUElQRQorI2RlZmluZQlBRl9CTFVFVE9PVEgJUEZfQkxVRVRPT1RICisjZGVmaW5lCUFGX0lVQ1YJCVBGX0lVQ1YKKyNkZWZpbmUgQUZfUlhSUEMJUEZfUlhSUEMKKyNkZWZpbmUJQUZfTUFYCQlQRl9NQVgKKworLyogU29ja2V0IGxldmVsIHZhbHVlcy4gIE90aGVycyBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwcm9wcmlhdGUgaGVhZGVycy4KKworICAgWFhYIFRoZXNlIGRlZmluaXRpb25zIGFsc28gc2hvdWxkIGdvIGludG8gdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMgYXMKKyAgIGZhciBhcyB0aGV5IGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBTT0xfUkFXCQkyNTUKKyNkZWZpbmUgU09MX0RFQ05FVCAgICAgIDI2MQorI2RlZmluZSBTT0xfWDI1ICAgICAgICAgMjYyCisjZGVmaW5lIFNPTF9QQUNLRVQJMjYzCisjZGVmaW5lIFNPTF9BVE0JCTI2NAkvKiBBVE0gbGF5ZXIgKGNlbGwgbGV2ZWwpLiAgKi8KKyNkZWZpbmUgU09MX0FBTAkJMjY1CS8qIEFUTSBBZGFwdGlvbiBMYXllciAocGFja2V0IGxldmVsKS4gICovCisjZGVmaW5lIFNPTF9JUkRBCTI2NgorCisvKiBNYXhpbXVtIHF1ZXVlIGxlbmd0aCBzcGVjaWZpYWJsZSBieSBsaXN0ZW4uICAqLworI2RlZmluZSBTT01BWENPTk4JMTI4CisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gdG8gZGVmaW5lIHRoZSBjb21tb24gc29ja2FkZHIgbWVtYmVycy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIGdlbmVyaWMgc29ja2V0IGFkZHJlc3MuICAqLworc3RydWN0IHNvY2thZGRyCisgIHsKKyAgICBfX1NPQ0tBRERSX0NPTU1PTiAoc2FfKTsJLyogQ29tbW9uIGRhdGE6IGFkZHJlc3MgZmFtaWx5IGFuZCBsZW5ndGguICAqLworICAgIGNoYXIgc2FfZGF0YVsxNF07CQkvKiBBZGRyZXNzIGRhdGEuICAqLworICB9OworCisKKy8qIFN0cnVjdHVyZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgc29ja2V0IGFkZHJlc3MgKHdpdGggdGhlIGhpc3RvcmljYWwKKyAgIGV4Y2VwdGlvbiBvZiBBRl9VTklYKS4gIFdlIHJlc2VydmUgMTI4IGJ5dGVzLiAgKi8KKyNpZiBVTE9OR19NQVggPiAweGZmZmZmZmZmCisjIGRlZmluZSBfX3NzX2FsaWdudHlwZQlfX3VpbnQ2NF90CisjZWxzZQorIyBkZWZpbmUgX19zc19hbGlnbnR5cGUJX191aW50MzJfdAorI2VuZGlmCisjZGVmaW5lIF9TU19TSVpFCTEyOAorI2RlZmluZSBfU1NfUEFEU0laRQkoX1NTX1NJWkUgLSAoMiAqIHNpemVvZiAoX19zc19hbGlnbnR5cGUpKSkKKworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UKKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzc18pOwkvKiBBZGRyZXNzIGZhbWlseSwgZXRjLiAgKi8KKyAgICBfX3NzX2FsaWdudHlwZSBfX3NzX2FsaWduOwkvKiBGb3JjZSBkZXNpcmVkIGFsaWdubWVudC4gICovCisgICAgY2hhciBfX3NzX3BhZGRpbmdbX1NTX1BBRFNJWkVdOworICB9OworCisKKy8qIEJpdHMgaW4gdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBzZW5kJywgYHJlY3YnLCBldCBhbC4gICovCitlbnVtCisgIHsKKyAgICBNU0dfT09CCQk9IDB4MDEsCS8qIFByb2Nlc3Mgb3V0LW9mLWJhbmQgZGF0YS4gICovCisjZGVmaW5lIE1TR19PT0IJCU1TR19PT0IKKyAgICBNU0dfUEVFSwkJPSAweDAyLAkvKiBQZWVrIGF0IGluY29taW5nIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUgTVNHX1BFRUsJTVNHX1BFRUsKKyAgICBNU0dfRE9OVFJPVVRFCT0gMHgwNCwJLyogRG9uJ3QgdXNlIGxvY2FsIHJvdXRpbmcuICAqLworI2RlZmluZSBNU0dfRE9OVFJPVVRFCU1TR19ET05UUk9VVEUKKyNpZmRlZiBfX1VTRV9HTlUKKyAgICAvKiBERUNuZXQgdXNlcyBhIGRpZmZlcmVudCBuYW1lLiAgKi8KKyAgICBNU0dfVFJZSEFSRAkJPSBNU0dfRE9OVFJPVVRFLAorIyBkZWZpbmUgTVNHX1RSWUhBUkQJTVNHX0RPTlRST1VURQorI2VuZGlmCisgICAgTVNHX0NUUlVOQwkJPSAweDA4LAkvKiBDb250cm9sIGRhdGEgbG9zdCBiZWZvcmUgZGVsaXZlcnkuICAqLworI2RlZmluZSBNU0dfQ1RSVU5DCU1TR19DVFJVTkMKKyAgICBNU0dfUFJPWFkJCT0gMHgxMCwJLyogU3VwcGx5IG9yIGFzayBzZWNvbmQgYWRkcmVzcy4gICovCisjZGVmaW5lIE1TR19QUk9YWQlNU0dfUFJPWFkKKyAgICBNU0dfVFJVTkMJCT0gMHgyMCwKKyNkZWZpbmUJTVNHX1RSVU5DCU1TR19UUlVOQworICAgIE1TR19ET05UV0FJVAk9IDB4NDAsIC8qIE5vbmJsb2NraW5nIElPLiAgKi8KKyNkZWZpbmUJTVNHX0RPTlRXQUlUCU1TR19ET05UV0FJVAorICAgIE1TR19FT1IJCT0gMHg4MCwgLyogRW5kIG9mIHJlY29yZC4gICovCisjZGVmaW5lCU1TR19FT1IJCU1TR19FT1IKKyAgICBNU0dfV0FJVEFMTAkJPSAweDEwMCwgLyogV2FpdCBmb3IgYSBmdWxsIHJlcXVlc3QuICAqLworI2RlZmluZQlNU0dfV0FJVEFMTAlNU0dfV0FJVEFMTAorICAgIE1TR19GSU4JCT0gMHgyMDAsCisjZGVmaW5lCU1TR19GSU4JCU1TR19GSU4KKyAgICBNU0dfU1lOCQk9IDB4NDAwLAorI2RlZmluZQlNU0dfU1lOCQlNU0dfU1lOCisgICAgTVNHX0NPTkZJUk0JCT0gMHg4MDAsIC8qIENvbmZpcm0gcGF0aCB2YWxpZGl0eS4gICovCisjZGVmaW5lCU1TR19DT05GSVJNCU1TR19DT05GSVJNCisgICAgTVNHX1JTVAkJPSAweDEwMDAsCisjZGVmaW5lCU1TR19SU1QJCU1TR19SU1QKKyAgICBNU0dfRVJSUVVFVUUJPSAweDIwMDAsIC8qIEZldGNoIG1lc3NhZ2UgZnJvbSBlcnJvciBxdWV1ZS4gICovCisjZGVmaW5lCU1TR19FUlJRVUVVRQlNU0dfRVJSUVVFVUUKKyAgICBNU0dfTk9TSUdOQUwJPSAweDQwMDAsIC8qIERvIG5vdCBnZW5lcmF0ZSBTSUdQSVBFLiAgKi8KKyNkZWZpbmUJTVNHX05PU0lHTkFMCU1TR19OT1NJR05BTAorICAgIE1TR19NT1JFCQk9IDB4ODAwMCwgIC8qIFNlbmRlciB3aWxsIHNlbmQgbW9yZS4gICovCisjZGVmaW5lCU1TR19NT1JFCU1TR19NT1JFCisKKyAgICBNU0dfQ01TR19DTE9FWEVDCT0gMHg0MDAwMDAwMAkvKiBTZXQgY2xvc2Vfb25fZXhpdCBmb3IgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgcmVjZWl2ZWQgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDTV9SSUdIVFMuICAqLworI2RlZmluZSBNU0dfQ01TR19DTE9FWEVDIE1TR19DTVNHX0NMT0VYRUMKKyAgfTsKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBtZXNzYWdlcyBzZW50IGJ5CisgICBgc2VuZG1zZycgYW5kIHJlY2VpdmVkIGJ5IGByZWN2bXNnJy4gICovCitzdHJ1Y3QgbXNnaGRyCisgIHsKKyAgICB2b2lkICptc2dfbmFtZTsJCS8qIEFkZHJlc3MgdG8gc2VuZCB0by9yZWNlaXZlIGZyb20uICAqLworICAgIHNvY2tsZW5fdCBtc2dfbmFtZWxlbjsJLyogTGVuZ3RoIG9mIGFkZHJlc3MgZGF0YS4gICovCisKKyAgICBzdHJ1Y3QgaW92ZWMgKm1zZ19pb3Y7CS8qIFZlY3RvciBvZiBkYXRhIHRvIHNlbmQvcmVjZWl2ZSBpbnRvLiAgKi8KKyAgICBzaXplX3QgbXNnX2lvdmxlbjsJCS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLiAgKi8KKworICAgIHZvaWQgKm1zZ19jb250cm9sOwkJLyogQW5jaWxsYXJ5IGRhdGEgKGVnIEJTRCBmaWxlZGVzYyBwYXNzaW5nKS4gKi8KKyAgICBzaXplX3QgbXNnX2NvbnRyb2xsZW47CS8qIEFuY2lsbGFyeSBkYXRhIGJ1ZmZlciBsZW5ndGguCisJCQkJICAgISEgVGhlIHR5cGUgc2hvdWxkIGJlIHNvY2tsZW5fdCBidXQgdGhlCisJCQkJICAgZGVmaW5pdGlvbiBvZiB0aGUga2VybmVsIGlzIGluY29tcGF0aWJsZQorCQkJCSAgIHdpdGggdGhpcy4gICovCisKKyAgICBpbnQgbXNnX2ZsYWdzOwkJLyogRmxhZ3Mgb24gcmVjZWl2ZWQgbWVzc2FnZS4gICovCisgIH07CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBzdG9yYWdlIG9mIGFuY2lsbGFyeSBkYXRhIG9iamVjdCBpbmZvcm1hdGlvbi4gICovCitzdHJ1Y3QgY21zZ2hkcgorICB7CisgICAgc2l6ZV90IGNtc2dfbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEgaW4gY21zZ19kYXRhIHBsdXMgbGVuZ3RoCisJCQkJICAgb2YgY21zZ2hkciBzdHJ1Y3R1cmUuCisJCQkJICAgISEgVGhlIHR5cGUgc2hvdWxkIGJlIHNvY2tsZW5fdCBidXQgdGhlCisJCQkJICAgZGVmaW5pdGlvbiBvZiB0aGUga2VybmVsIGlzIGluY29tcGF0aWJsZQorCQkJCSAgIHdpdGggdGhpcy4gICovCisgICAgaW50IGNtc2dfbGV2ZWw7CQkvKiBPcmlnaW5hdGluZyBwcm90b2NvbC4gICovCisgICAgaW50IGNtc2dfdHlwZTsJCS8qIFByb3RvY29sIHNwZWNpZmljIHR5cGUuICAqLworI2lmICghZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgX19HTlVDX18gPj0gMikgfHwgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisgICAgX19leHRlbnNpb25fXyB1bnNpZ25lZCBjaGFyIF9fY21zZ19kYXRhIF9fZmxleGFycjsgLyogQW5jaWxsYXJ5IGRhdGEuICAqLworI2VuZGlmCisgIH07CisKKy8qIEFuY2lsbGFyeSBkYXRhIG9iamVjdCBtYW5pcHVsYXRpb24gbWFjcm9zLiAgKi8KKyNpZiAoIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmIF9fR05VQ19fID49IDIpIHx8IF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyBkZWZpbmUgQ01TR19EQVRBKGNtc2cpICgoY21zZyktPl9fY21zZ19kYXRhKQorI2Vsc2UKKyMgZGVmaW5lIENNU0dfREFUQShjbXNnKSAoKHVuc2lnbmVkIGNoYXIgKikgKChzdHJ1Y3QgY21zZ2hkciAqKSAoY21zZykgKyAxKSkKKyNlbmRpZgorI2RlZmluZSBDTVNHX05YVEhEUihtaGRyLCBjbXNnKSBfX2Ntc2dfbnh0aGRyIChtaGRyLCBjbXNnKQorI2RlZmluZSBDTVNHX0ZJUlNUSERSKG1oZHIpIFwKKyAgKChzaXplX3QpIChtaGRyKS0+bXNnX2NvbnRyb2xsZW4gPj0gc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikJCSAgICAgIFwKKyAgID8gKHN0cnVjdCBjbXNnaGRyICopIChtaGRyKS0+bXNnX2NvbnRyb2wgOiAoc3RydWN0IGNtc2doZHIgKikgTlVMTCkKKyNkZWZpbmUgQ01TR19BTElHTihsZW4pICgoKGxlbikgKyBzaXplb2YgKHNpemVfdCkgLSAxKSBcCisJCQkgJiAoc2l6ZV90KSB+KHNpemVvZiAoc2l6ZV90KSAtIDEpKQorI2RlZmluZSBDTVNHX1NQQUNFKGxlbikgKENNU0dfQUxJR04gKGxlbikgXAorCQkJICsgQ01TR19BTElHTiAoc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpKQorI2RlZmluZSBDTVNHX0xFTihsZW4pICAgKENNU0dfQUxJR04gKHNpemVvZiAoc3RydWN0IGNtc2doZHIpKSArIChsZW4pKQorCitleHRlcm4gc3RydWN0IGNtc2doZHIgKl9fY21zZ19ueHRoZHIgKHN0cnVjdCBtc2doZHIgKl9fbWhkciwKKwkJCQkgICAgICBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnKSBfX1RIUk9XOworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisjIGlmbmRlZiBfRVhURVJOX0lOTElORQorIyAgZGVmaW5lIF9FWFRFUk5fSU5MSU5FIF9fZXh0ZXJuX2lubGluZQorIyBlbmRpZgorX0VYVEVSTl9JTkxJTkUgc3RydWN0IGNtc2doZHIgKgorX19OVEggKF9fY21zZ19ueHRoZHIgKHN0cnVjdCBtc2doZHIgKl9fbWhkciwgc3RydWN0IGNtc2doZHIgKl9fY21zZykpCit7CisgIGlmICgoc2l6ZV90KSBfX2Ntc2ctPmNtc2dfbGVuIDwgc2l6ZW9mIChzdHJ1Y3QgY21zZ2hkcikpCisgICAgLyogVGhlIGtlcm5lbCBoZWFkZXIgZG9lcyB0aGlzIHNvIHRoZXJlIG1heSBiZSBhIHJlYXNvbi4gICovCisgICAgcmV0dXJuIDA7CisKKyAgX19jbXNnID0gKHN0cnVjdCBjbXNnaGRyICopICgodW5zaWduZWQgY2hhciAqKSBfX2Ntc2cKKwkJCSAgICAgICArIENNU0dfQUxJR04gKF9fY21zZy0+Y21zZ19sZW4pKTsKKyAgaWYgKCh1bnNpZ25lZCBjaGFyICopIChfX2Ntc2cgKyAxKSA+ICgodW5zaWduZWQgY2hhciAqKSBfX21oZHItPm1zZ19jb250cm9sCisJCQkJCSsgX19taGRyLT5tc2dfY29udHJvbGxlbikKKyAgICAgIHx8ICgodW5zaWduZWQgY2hhciAqKSBfX2Ntc2cgKyBDTVNHX0FMSUdOIChfX2Ntc2ctPmNtc2dfbGVuKQorCSAgPiAoKHVuc2lnbmVkIGNoYXIgKikgX19taGRyLT5tc2dfY29udHJvbCArIF9fbWhkci0+bXNnX2NvbnRyb2xsZW4pKSkKKyAgICAvKiBObyBtb3JlIGVudHJpZXMuICAqLworICAgIHJldHVybiAwOworICByZXR1cm4gX19jbXNnOworfQorI2VuZGlmCS8qIFVzZSBgZXh0ZXJuIGlubGluZScuICAqLworCisvKiBTb2NrZXQgbGV2ZWwgbWVzc2FnZSB0eXBlcy4gIFRoaXMgbXVzdCBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4KKyAgIDxsaW51eC9zb2NrZXQuaD4uICAqLworZW51bQorICB7CisgICAgU0NNX1JJR0hUUyA9IDB4MDEJCS8qIFRyYW5zZmVyIGZpbGUgZGVzY3JpcHRvcnMuICAqLworI2RlZmluZSBTQ01fUklHSFRTIFNDTV9SSUdIVFMKKyNpZmRlZiBfX1VTRV9CU0QKKyAgICAsIFNDTV9DUkVERU5USUFMUyA9IDB4MDIJLyogQ3JlZGVudGlhbHMgcGFzc2luZy4gICovCisjIGRlZmluZSBTQ01fQ1JFREVOVElBTFMgU0NNX0NSRURFTlRJQUxTCisjZW5kaWYKKyAgfTsKKworLyogVXNlciB2aXNpYmxlIHN0cnVjdHVyZSBmb3IgU0NNX0NSRURFTlRJQUxTIG1lc3NhZ2UgKi8KKworc3RydWN0IHVjcmVkCit7CisgIHBpZF90IHBpZDsJCQkvKiBQSUQgb2Ygc2VuZGluZyBwcm9jZXNzLiAgKi8KKyAgdWlkX3QgdWlkOwkJCS8qIFVJRCBvZiBzZW5kaW5nIHByb2Nlc3MuICAqLworICBnaWRfdCBnaWQ7CQkJLyogR0lEIG9mIHNlbmRpbmcgcHJvY2Vzcy4gICovCit9OworCisvKiBHZXQgc29ja2V0IG1hbmlwdWxhdGlvbiByZWxhdGVkIGluZm9ybWF0aW9ucyBmcm9tIGtlcm5lbCBoZWFkZXJzLiAgKi8KKyNpbmNsdWRlIDxhc20vc29ja2V0Lmg+CisKKworLyogU3RydWN0dXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU09fTElOR0VSIG9wdGlvbi4gICovCitzdHJ1Y3QgbGluZ2VyCisgIHsKKyAgICBpbnQgbF9vbm9mZjsJCS8qIE5vbnplcm8gdG8gbGluZ2VyIG9uIGNsb3NlLiAgKi8KKyAgICBpbnQgbF9saW5nZXI7CQkvKiBUaW1lIHRvIGxpbmdlci4gICovCisgIH07CisKKyNlbmRpZgkvKiBiaXRzL3NvY2tldC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc29ja2V0Mi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NvY2tldDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRjYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3NvY2tldDIuaApAQCAtMCwwICsxLDc4IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHNvY2tldCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TT0NLRVRfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zb2NrZXQyLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zb2NrZXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIHNzaXplX3QgX19yZWN2X2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLCBzaXplX3QgX19idWZsZW4sCisJCQkgICBpbnQgX19mbGFncyk7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3ZfYWxpYXMsIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCQkJCSAgaW50IF9fZmxhZ3MpLCByZWN2KTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcmVjdl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBpbnQgX19mbGFncyksIF9fcmVjdl9jaGspCisgICAgIF9fd2FybmF0dHIgKCJyZWN2IGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzc2l6ZV90CityZWN2IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX19yZWN2X2NoayAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MpOworCisgICAgICBpZiAoX19uID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcmVjdl9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIF9fcmVjdl9hbGlhcyAoX19mZCwgX19idWYsIF9fbiwgX19mbGFncyk7Cit9CisKK2V4dGVybiBzc2l6ZV90IF9fcmVjdmZyb21fY2hrIChpbnQgX19mZCwgdm9pZCAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4sIGludCBfX2ZsYWdzLAorCQkJICAgICAgIF9fU09DS0FERFJfQVJHIF9fYWRkciwKKwkJCSAgICAgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3Zmcm9tX2FsaWFzLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgIGludCBfX2ZsYWdzLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pLCByZWN2ZnJvbSk7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUIChfX3JlY3Zmcm9tX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJICAgIHNpemVfdCBfX2J1ZmxlbiwgaW50IF9fZmxhZ3MsCisJCQkgICAgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJICAgIHNvY2tsZW5fdCAqX19yZXN0cmljdCBfX2FkZHJfbGVuKSwgX19yZWN2ZnJvbV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJyZWN2ZnJvbSBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiAiCisJCSAiZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc3NpemVfdAorcmVjdmZyb20gKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLCBpbnQgX19mbGFncywKKwkgIF9fU09DS0FERFJfQVJHIF9fYWRkciwgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3JlY3Zmcm9tX2NoayAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MsCisJCQkgICAgICAgX19hZGRyLCBfX2FkZHJfbGVuKTsKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWN2ZnJvbV9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbiwgX19ib3MwIChfX2J1ZiksIF9fZmxhZ3MsCisJCQkJICAgIF9fYWRkciwgX19hZGRyX2xlbik7CisgICAgfQorICByZXR1cm4gX19yZWN2ZnJvbV9hbGlhcyAoX19mZCwgX19idWYsIF9fbiwgX19mbGFncywgX19hZGRyLCBfX2FkZHJfbGVuKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGFiLmRlZiBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGFiLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU0Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0YWIuZGVmCkBAIC0wLDAgKzEsMjM0IEBACisvKiBUYWJsZSBvZiBEQlggc3ltYm9sIGNvZGVzIGZvciB0aGUgR05VIHN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBjb250YWlucyBjb250cmlidXRpb24gZnJvbSBDeWdudXMgU3VwcG9ydC4gICovCisMCisvKiBHbG9iYWwgdmFyaWFibGUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLworX19kZWZpbmVfc3RhYiAoTl9HU1lNLCAweDIwLCAiR1NZTSIpCisKKy8qIEZ1bmN0aW9uIG5hbWUgZm9yIEJTRCBGb3J0cmFuLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRk5BTUUsIDB4MjIsICJGTkFNRSIpCisKKy8qIEZ1bmN0aW9uIG5hbWUgb3IgdGV4dC1zZWdtZW50IHZhcmlhYmxlIGZvciBDLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCisgICBEZXNjIGlzIHN1cHBvc2VkbHkgc3RhcnRpbmcgbGluZSBudW1iZXIsIGJ1dCBHQ0MgZG9lc24ndCBzZXQgaXQKKyAgIGFuZCBEQlggc2VlbXMgbm90IHRvIG1pc3MgaXQuICAqLworX19kZWZpbmVfc3RhYiAoTl9GVU4sIDB4MjQsICJGVU4iKQorCisvKiBEYXRhLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCisgICAiU3RhdGljIFN5bSIuICAqLworX19kZWZpbmVfc3RhYiAoTl9TVFNZTSwgMHgyNiwgIlNUU1lNIikKKworLyogQlNTLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9MQ1NZTSwgMHgyOCwgIkxDU1lNIikKKworLyogTmFtZSBvZiBtYWluIHJvdXRpbmUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgorICAgVGhpcyBpcyBub3QgdXNlZCBpbiBDLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTUFJTiwgMHgyYSwgIk1BSU4iKQorCisvKiBHbG9iYWwgc3ltYm9sIGluIFBhc2NhbC4KKyAgIFN1cHBvc2VkbHkgdGhlIHZhbHVlIGlzIGl0cyBsaW5lIG51bWJlcjsgSSdtIHNrZXB0aWNhbC4gICovCitfX2RlZmluZV9zdGFiIChOX1BDLCAweDMwLCAiUEMiKQorCisvKiBOdW1iZXIgb2Ygc3ltYm9sczogIDAsIGZpbGVzLCxmdW5jcyxsaW5lcyBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCitfX2RlZmluZV9zdGFiIChOX05TWU1TLCAweDMyLCAiTlNZTVMiKQorCisvKiAiTm8gRFNUIG1hcCBmb3Igc3ltOiBuYW1lLCAsMCx0eXBlLGlnbm9yZWQiICBhY2NvcmRpbmcgdG8gVWx0cml4IFY0LjAuICovCitfX2RlZmluZV9zdGFiIChOX05PTUFQLCAweDM0LCAiTk9NQVAiKQorCisvKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMuICBJIGRvbid0IGtub3cgd2hhdCBpdCBtZWFucywgYnV0IGl0CisgICBkb24ndCBzZWVtIHRvIGNvbnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fT0JKLCAweDM4LCAiT0JKIikKKworLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzLiAgSSBkb24ndCBrbm93IHdoYXQgaXQgbWVhbnMsIGJ1dCBpdAorICAgZG9uJ3Qgc2VlbSB0byBjb250YWluIHVzZWZ1bCBpbmZvcm1hdGlvbi4gIFBvc3NpYmx5IHJlbGF0ZWQgdG8gdGhlCisgICBvcHRpbWl6YXRpb24gZmxhZ3MgdXNlZCBpbiB0aGlzIG1vZHVsZS4gICovCitfX2RlZmluZV9zdGFiIChOX09QVCwgMHgzYywgIk9QVCIpCisKKy8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgbnVtYmVyIG9mIHJlZ2lzdGVyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUlNZTSwgMHg0MCwgIlJTWU0iKQorCisvKiBNb2R1bGEtMiBjb21waWxhdGlvbiB1bml0LiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCitfX2RlZmluZV9zdGFiIChOX00yQywgMHg0MiwgIk0yQyIpCisKKy8qIExpbmUgbnVtYmVyIGluIHRleHQgc2VnbWVudC4gIERlc2MgaXMgdGhlIGxpbmUgbnVtYmVyOworICAgdmFsdWUgaXMgY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU0xJTkUsIDB4NDQsICJTTElORSIpCisKKy8qIFNpbWlsYXIsIGZvciBkYXRhIHNlZ21lbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9EU0xJTkUsIDB4NDYsICJEU0xJTkUiKQorCisvKiBTaW1pbGFyLCBmb3IgYnNzIHNlZ21lbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9CU0xJTkUsIDB4NDgsICJCU0xJTkUiKQorCisvKiBTdW4ncyBzb3VyY2UtY29kZSBicm93c2VyIHN0YWJzLiAgPz8gRG9uJ3Qga25vdyB3aGF0IHRoZSBmaWVsZHMgYXJlLgorICAgU3VwcG9zZWRseSB0aGUgZmllbGQgaXMgInBhdGggdG8gYXNzb2NpYXRlZCAuY2IgZmlsZSIuICBUSElTIFZBTFVFCisgICBPVkVSTEFQUyBXSVRIIE5fQlNMSU5FISAgKi8KK19fZGVmaW5lX3N0YWIgKE5fQlJPV1MsIDB4NDgsICJCUk9XUyIpCisKKy8qIEdOVSBNb2R1bGEtMiBkZWZpbml0aW9uIG1vZHVsZSBkZXBlbmRlbmN5LiAgVmFsdWUgaXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCisgICBvZiB0aGUgZGVmaW5pdGlvbiBmaWxlLiAgT3RoZXIgaXMgbm9uLXplcm8gaWYgaXQgaXMgaW1wb3J0ZWQgd2l0aCB0aGUKKyAgIEdOVSBNMiBrZXl3b3JkICVJTklUSUFMSVpFLiAgUGVyaGFwcyBOX00yQyBjYW4gYmUgdXNlZCBpZiB0aGVyZQorICAgYXJlIGVub3VnaCBlbXB0eSBmaWVsZHM/ICovCitfX2RlZmluZV9zdGFiKE5fREVGRCwgMHg0YSwgIkRFRkQiKQorCisvKiBUSEUgRk9MTE9XSU5HIFRXTyBTVEFCIFZBTFVFUyBDT05GTElDVC4gIEhhcHBpbHksIG9uZSBpcyBmb3IgTW9kdWxhLTIKKyAgIGFuZCBvbmUgaXMgZm9yIEMrKy4gICBTdGlsbCwuLi4gKi8KKy8qIEdOVSBDKysgZXhjZXB0aW9uIHZhcmlhYmxlLiAgTmFtZSBpcyB2YXJpYWJsZSBuYW1lLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUhERUNMLCAweDUwLCAiRUhERUNMIikKKy8qIE1vZHVsYTIgaW5mbyAiZm9yIGltYyI6ICBuYW1lLCwwLDAsMCAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTU9EMiwgMHg1MCwgIk1PRDIiKQorCisvKiBHTlUgQysrIGBjYXRjaCcgY2xhdXNlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICBEZXNjIGlzIG5vbnplcm8gaWYKKyAgIHRoaXMgZW50cnkgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBDQVVHSFQgc3RhYiBzYXlpbmcgd2hhdCBleGNlcHRpb24KKyAgIHdhcyBjYXVnaHQuICBNdWx0aXBsZSBDQVVHSFQgc3RhYnMgbWVhbnMgdGhhdCBtdWx0aXBsZSBleGNlcHRpb25zCisgICBjYW4gYmUgY2F1Z2h0IGhlcmUuICBJZiBEZXNjIGlzIDAsIGl0IG1lYW5zIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQKKyAgIGhlcmUuICAqLworX19kZWZpbmVfc3RhYiAoTl9DQVRDSCwgMHg1NCwgIkNBVENIIikKKworLyogU3RydWN0dXJlIG9yIHVuaW9uIGVsZW1lbnQuICBWYWx1ZSBpcyBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZS4gICovCitfX2RlZmluZV9zdGFiIChOX1NTWU0sIDB4NjAsICJTU1lNIikKKworLyogTmFtZSBvZiBtYWluIHNvdXJjZSBmaWxlLgorICAgVmFsdWUgaXMgc3RhcnRpbmcgdGV4dCBhZGRyZXNzIG9mIHRoZSBjb21waWxhdGlvbi4gICovCitfX2RlZmluZV9zdGFiIChOX1NPLCAweDY0LCAiU08iKQorCisvKiBBdXRvbWF0aWMgdmFyaWFibGUgaW4gdGhlIHN0YWNrLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlci4KKyAgIEFsc28gdXNlZCBmb3IgdHlwZSBkZXNjcmlwdGlvbnMuICAqLworX19kZWZpbmVfc3RhYiAoTl9MU1lNLCAweDgwLCAiTFNZTSIpCisKKy8qIEJlZ2lubmluZyBvZiBhbiBpbmNsdWRlIGZpbGUuICBPbmx5IFN1biB1c2VzIHRoaXMuCisgICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KKyAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIG90aGVyIGZpZWxkcy4gICovCitfX2RlZmluZV9zdGFiIChOX0JJTkNMLCAweDgyLCAiQklOQ0wiKQorCisvKiBOYW1lIG9mIHN1Yi1zb3VyY2UgZmlsZSAoI2luY2x1ZGUgZmlsZSkuCisgICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fU09MLCAweDg0LCAiU09MIikKKworLyogUGFyYW1ldGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gYXJndW1lbnQgcG9pbnRlci4KKyAgIChPbiBtb3N0IG1hY2hpbmVzIHRoZSBhcmd1bWVudCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUFNZTSwgMHhhMCwgIlBTWU0iKQorCisvKiBFbmQgb2YgYW4gaW5jbHVkZSBmaWxlLiAgTm8gbmFtZS4KKyAgIFRoaXMgYW5kIE5fQklOQ0wgYWN0IGFzIGJyYWNrZXRzIGFyb3VuZCB0aGUgZmlsZSdzIG91dHB1dC4KKyAgIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkYXRhIGluIHRoaXMgZW50cnkuCisgICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBmaWVsZHMuICAqLworX19kZWZpbmVfc3RhYiAoTl9FSU5DTCwgMHhhMiwgIkVJTkNMIikKKworLyogQWx0ZXJuYXRlIGVudHJ5IHBvaW50LiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLworX19kZWZpbmVfc3RhYiAoTl9FTlRSWSwgMHhhNCwgIkVOVFJZIikKKworLyogQmVnaW5uaW5nIG9mIGxleGljYWwgYmxvY2suCisgICBUaGUgZGVzYyBpcyB0aGUgbmVzdGluZyBsZXZlbCBpbiBsZXhpY2FsIGJsb2Nrcy4KKyAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KKyAgIFRoZSB2YXJpYWJsZXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jayAqcHJlY2VkZSogdGhlIE5fTEJSQUMgc3ltYm9sLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fTEJSQUMsIDB4YzAsICJMQlJBQyIpCisKKy8qIFBsYWNlIGhvbGRlciBmb3IgZGVsZXRlZCBpbmNsdWRlIGZpbGUuICBSZXBsYWNlcyBhIE5fQklOQ0wgYW5kIGV2ZXJ5dGhpbmcKKyAgIHVwIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5fRUlOQ0wuICBUaGUgU3VuIGxpbmtlciBnZW5lcmF0ZXMgdGhlc2Ugd2hlbgorICAgaXQgZmluZHMgbXVsdGlwbGUgaWRlbnRpY2FsIGNvcGllcyBvZiB0aGUgc3ltYm9scyBmcm9tIGFuIGluY2x1ZGUgZmlsZS4KKyAgIFRoaXMgYXBwZWFycyBvbmx5IGluIG91dHB1dCBmcm9tIHRoZSBTdW4gbGlua2VyLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRVhDTCwgMHhjMiwgIkVYQ0wiKQorCisvKiBNb2R1bGEtMiBzY29wZSBpbmZvcm1hdGlvbi4gIENhbiBzb21lb25lIHNheSB3aGF0IGluZm8gaXQgY29udGFpbnM/ICAqLworX19kZWZpbmVfc3RhYiAoTl9TQ09QRSwgMHhjNCwgIlNDT1BFIikKKworLyogRW5kIG9mIGEgbGV4aWNhbCBibG9jay4gIERlc2MgbWF0Y2hlcyB0aGUgTl9MQlJBQydzIGRlc2MuCisgICBUaGUgdmFsdWUgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCBmb3IgdGhlIGJsb2NrLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fUkJSQUMsIDB4ZTAsICJSQlJBQyIpCisKKy8qIEJlZ2luIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQuICAqLworX19kZWZpbmVfc3RhYiAoTl9CQ09NTSwgMHhlMiwgIkJDT01NIikKKworLyogRW5kIG5hbWVkIGNvbW1vbiBibG9jay4gIE9ubHkgdGhlIG5hbWUgaXMgc2lnbmlmaWNhbnQKKyAgIChhbmQgaXQgc2hvdWxkIG1hdGNoIHRoZSBOX0JDT01NKS4gICovCitfX2RlZmluZV9zdGFiIChOX0VDT01NLCAweGU0LCAiRUNPTU0iKQorCisvKiBFbmQgY29tbW9uIChsb2NhbCBuYW1lKTogdmFsdWUgaXMgYWRkcmVzcy4KKyAgIEknbSBub3Qgc3VyZSBob3cgdGhpcyBpcyB1c2VkLiAgKi8KK19fZGVmaW5lX3N0YWIgKE5fRUNPTUwsIDB4ZTgsICJFQ09NTCIpCisKKy8qIFRoZXNlIFNUQUIncyBhcmUgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zIGZvciBOb24tQmFzZSByZWdpc3RlciBzeW1ib2xzCisgICBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiAgRklYTUUuICBJIGhhdmUgYXNzaWduZWQgdGhlIHZhbHVlcyBhdCByYW5kb20KKyAgIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIEdvdWxkIGhlcmUuICBGaXh1cHMgZnJvbSBHb3VsZCBmb2xrIHdlbGNvbWUuLi4gKi8KK19fZGVmaW5lX3N0YWIgKE5fTkJURVhULCAweEYwLCAiTkJURVhUIikKK19fZGVmaW5lX3N0YWIgKE5fTkJEQVRBLCAweEYyLCAiTkJEQVRBIikKK19fZGVmaW5lX3N0YWIgKE5fTkJCU1MsICAweEY0LCAiTkJCU1MiKQorX19kZWZpbmVfc3RhYiAoTl9OQlNUUywgIDB4RjYsICJOQlNUUyIpCitfX2RlZmluZV9zdGFiIChOX05CTENTLCAgMHhGOCwgIk5CTENTIikKKworLyogU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgorICAgVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguICAqLworX19kZWZpbmVfc3RhYiAoTl9MRU5HLCAweGZlLCAiTEVORyIpCisMCisvKiBUaGUgYWJvdmUgaW5mb3JtYXRpb24sIGluIG1hdHJpeCBmb3JtYXQuCisKKwkJCVNUQUIgTUFUUklYCisJX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCXwgMDAgLSAxRiBhcmUgbm90IGRieCBzdGFiIHN5bWJvbHMJCXwKKwl8IEluIG1vc3QgY2FzZXMsIHRoZSBsb3cgYml0IGlzIHRoZSBFWFRlcm5hbCBiaXR8CisKKwl8IDAwIFVOREVGICB8IDAyIEFCUwl8IDA0IFRFWFQgICB8IDA2IERBVEEJfAorCXwgMDEgIHxFWFQgIHwgMDMgIHxFWFQJfCAwNSAgfEVYVCAgfCAwNyAgfEVYVAl8CisKKwl8IDA4IEJTUyAgICB8IDBBIElORFIJfCAwQyBGTl9TRVEgfCAwRSAgIAl8CisJfCAwOSAgfEVYVCAgfCAwQiAJfCAwRAkgICAgfCAwRgl8CisKKwl8IDEwIAkgICAgfCAxMiBDT01NCXwgMTQgU0VUQSAgIHwgMTYgU0VUVAl8CisJfCAxMQkgICAgfCAxMwl8IDE1IAkgICAgfCAxNwl8CisKKwl8IDE4IFNFVEQgICB8IDFBIFNFVEIJfCAxQyBTRVRWICAgfCAxRSBXQVJOSU5HfAorCXwgMTkJICAgIHwgMUIJfCAxRCAJICAgIHwgMUYgRk4JfAorCisJfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCXwgRGVidWcgZW50cmllcyB3aXRoIGJpdCAwMSBzZXQgYXJlIHVudXNlZC4JfAorCXwgMjAgR1NZTSAgIHwgMjIgRk5BTUUJfCAyNCBGVU4gICAgfCAyNiBTVFNZTQl8CisJfCAyOCBMQ1NZTSAgfCAyQSBNQUlOCXwgMkMJICAgIHwgMkUJfAorCXwgMzAgUEMJICAgIHwgMzIgTlNZTVMJfCAzNCBOT01BUCAgfCAzNgl8CisJfCAzOCBPQkogICAgfCAzQQl8IDNDIE9QVCAgICB8IDNFCXwKKwl8IDQwIFJTWU0gICB8IDQyIE0yQwl8IDQ0IFNMSU5FICB8IDQ2IERTTElORSB8CisJfCA0OCBCU0xJTkUqfCA0QSBERUZECXwgNEMgICAgICAgIHwgNEUJfAorCXwgNTAgRUhERUNMKnwgNTIJfCA1NCBDQVRDSCAgfCA1NiAgICAgICAgfAorCXwgNTggICAgICAgIHwgNUEgICAgICAgIHwgNUMgICAgICAgIHwgNUUJfAorCXwgNjAgU1NZTSAgIHwgNjIJfCA2NCBTTwkgICAgfCA2NiAJfAorCXwgNjggCSAgICB8IDZBCXwgNkMJICAgIHwgNkUJfAorCXwgNzAJICAgIHwgNzIJfCA3NAkgICAgfCA3Ngl8CisJfCA3OAkgICAgfCA3QQl8IDdDCSAgICB8IDdFCXwKKwl8IDgwIExTWU0gICB8IDgyIEJJTkNMCXwgODQgU09MICAgIHwgODYJfAorCXwgODgJICAgIHwgOEEJfCA4QwkgICAgfCA4RQl8CisJfCA5MAkgICAgfCA5Mgl8IDk0CSAgICB8IDk2CXwKKwl8IDk4CSAgICB8IDlBCXwgOUMJICAgIHwgOUUJfAorCXwgQTAgUFNZTSAgIHwgQTIgRUlOQ0wJfCBBNCBFTlRSWSAgfCBBNgl8CisJfCBBOAkgICAgfCBBQQl8IEFDCSAgICB8IEFFCXwKKwl8IEIwCSAgICB8IEIyCXwgQjQJICAgIHwgQjYJfAorCXwgQjgJICAgIHwgQkEJfCBCQwkgICAgfCBCRQl8CisJfCBDMCBMQlJBQyAgfCBDMiBFWENMCXwgQzQgU0NPUEUgIHwgQzYJfAorCXwgQzgJICAgIHwgQ0EJfCBDQwkgICAgfCBDRQl8CisJfCBEMAkgICAgfCBEMgl8IEQ0CSAgICB8IEQ2CXwKKwl8IEQ4CSAgICB8IERBCXwgREMJICAgIHwgREUJfAorCXwgRTAgUkJSQUMgIHwgRTIgQkNPTU0JfCBFNCBFQ09NTSAgfCBFNgl8CisJfCBFOCBFQ09NTCAgfCBFQQl8IEVDCSAgICB8IEVFCXwKKwl8IEYwCSAgICB8IEYyCXwgRjQJICAgIHwgRjYJfAorCXwgRjgJICAgIHwgRkEJfCBGQwkgICAgfCBGRSBMRU5HCXwKKwkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiA1MCBFSERFQ0wgaXMgYWxzbyBNT0QyLgorICogNDggQlNMSU5FIGlzIGFsc28gQlJPV1MuCisgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDJjOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RhdC5oCkBAIC0wLDAgKzEsMjA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxLDIwMDIsMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NUQVRfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGF0Lmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIFZlcnNpb25zIG9mIHRoZSBgc3RydWN0IHN0YXQnIGRhdGEgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgX1NUQVRfVkVSX0tFUk5FTAkwCisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGRlZmluZSBfU1RBVF9WRVJfU1ZSNAkJMgorIyBkZWZpbmUgX1NUQVRfVkVSX0xJTlVYCTMKKworLyogaTM4NiB2ZXJzaW9ucyBvZiB0aGUgYHhta25vZCcgaW50ZXJmYWNlLiAgKi8KKyMgZGVmaW5lIF9NS05PRF9WRVJfTElOVVgJMQorIyBkZWZpbmUgX01LTk9EX1ZFUl9TVlI0CTIKKyMgZGVmaW5lIF9NS05PRF9WRVIJCV9NS05PRF9WRVJfTElOVVggLyogVGhlIGJpdHMgZGVmaW5lZCBiZWxvdy4gICovCisjZWxzZQorIyBkZWZpbmUgX1NUQVRfVkVSX0xJTlVYCTEKKworLyogeDg2LTY0IHZlcnNpb25zIG9mIHRoZSBgeG1rbm9kJyBpbnRlcmZhY2UuICAqLworIyBkZWZpbmUgX01LTk9EX1ZFUl9MSU5VWAkwCisjZW5kaWYKKworI2RlZmluZSBfU1RBVF9WRVIJCV9TVEFUX1ZFUl9MSU5VWAorCitzdHJ1Y3Qgc3RhdAorICB7CisgICAgX19kZXZfdCBzdF9kZXY7CQkvKiBEZXZpY2UuICAqLworI2lmIF9fV09SRFNJWkUgPT0gMzIKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQxOworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSA2NCB8fCAhZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19pbm9fdCBzdF9pbm87CQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCSovCisjZWxzZQorICAgIF9faW5vX3QgX19zdF9pbm87CQkJLyogMzJiaXQgZmlsZSBzZXJpYWwgbnVtYmVyLgkqLworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSAzMgorICAgIF9fbW9kZV90IHN0X21vZGU7CQkJLyogRmlsZSBtb2RlLiAgKi8KKyAgICBfX25saW5rX3Qgc3Rfbmxpbms7CQkJLyogTGluayBjb3VudC4gICovCisjZWxzZQorICAgIF9fbmxpbmtfdCBzdF9ubGluazsJCS8qIExpbmsgY291bnQuICAqLworICAgIF9fbW9kZV90IHN0X21vZGU7CQkvKiBGaWxlIG1vZGUuICAqLworI2VuZGlmCisgICAgX191aWRfdCBzdF91aWQ7CQkvKiBVc2VyIElEIG9mIHRoZSBmaWxlJ3Mgb3duZXIuCSovCisgICAgX19naWRfdCBzdF9naWQ7CQkvKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwLiovCisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGludCBwYWQwOworI2VuZGlmCisgICAgX19kZXZfdCBzdF9yZGV2OwkJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDMyCisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fcGFkMjsKKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQgfHwgIWRlZmluZWQgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fb2ZmX3Qgc3Rfc2l6ZTsJCQkvKiBTaXplIG9mIGZpbGUsIGluIGJ5dGVzLiAgKi8KKyNlbHNlCisgICAgX19vZmY2NF90IHN0X3NpemU7CQkJLyogU2l6ZSBvZiBmaWxlLCBpbiBieXRlcy4gICovCisjZW5kaWYKKyAgICBfX2Jsa3NpemVfdCBzdF9ibGtzaXplOwkvKiBPcHRpbWFsIGJsb2NrIHNpemUgZm9yIEkvTy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NCB8fCAhZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0CisgICAgX19ibGtjbnRfdCBzdF9ibG9ja3M7CQkvKiBOdW1iZXIgNTEyLWJ5dGUgYmxvY2tzIGFsbG9jYXRlZC4gKi8KKyNlbHNlCisgICAgX19ibGtjbnQ2NF90IHN0X2Jsb2NrczsJCS8qIE51bWJlciA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAqLworI2VuZGlmCisjaWZkZWYgX19VU0VfTUlTQworICAgIC8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4gYSBmb3JtYXQKKyAgICAgICBlcXVpdmFsZW50IHRvICdzdHJ1Y3QgdGltZXNwZWMnLiAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkCisgICAgICAgd2hlbmV2ZXIgcG9zc2libGUgYnV0IHRoZSBVbml4IG5hbWVzcGFjZSBydWxlcyBkbyBub3QgYWxsb3cgdGhlCisgICAgICAgaWRlbnRpZmllciAndGltZXNwZWMnIHRvIGFwcGVhciBpbiB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlci4KKyAgICAgICBUaGVyZWZvcmUgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIHVzZSBvZiB0aGlzIGhlYWRlciBpbiBzdHJpY3RseQorICAgICAgIHN0YW5kYXJkLWNvbXBsaWFudCBzb3VyY2VzIHNwZWNpYWwuICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9hdGltOwkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X210aW07CQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfY3RpbTsJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyMgZGVmaW5lIHN0X2F0aW1lIHN0X2F0aW0udHZfc2VjCS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICAqLworIyBkZWZpbmUgc3RfbXRpbWUgc3RfbXRpbS50dl9zZWMKKyMgZGVmaW5lIHN0X2N0aW1lIHN0X2N0aW0udHZfc2VjCisjZWxzZQorICAgIF9fdGltZV90IHN0X2F0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X2F0aW1lbnNlYzsJLyogTnNjZWNzIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9tdGltZTsJCQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9tdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAgKi8KKyAgICBfX3RpbWVfdCBzdF9jdGltZTsJCQkvKiBUaW1lIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfY3RpbWVuc2VjOwkvKiBOc2VjcyBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworI2VuZGlmCisjaWYgX19XT1JEU0laRSA9PSA2NAorICAgIGxvbmcgaW50IF9fdW51c2VkWzNdOworI2Vsc2UKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgX191bnVzZWQ1OworIyBlbHNlCisgICAgX19pbm82NF90IHN0X2lubzsJCQkvKiBGaWxlIHNlcmlhbCBudW1iZXIuCSovCisjIGVuZGlmCisjZW5kaWYKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisvKiBOb3RlIHN0YXQ2NCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgc3RhdCBmb3IgeDg2LTY0LiAgKi8KK3N0cnVjdCBzdGF0NjQKKyAgeworICAgIF9fZGV2X3Qgc3RfZGV2OwkJLyogRGV2aWNlLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgX19pbm82NF90IHN0X2lubzsJCS8qIEZpbGUgc2VyaWFsIG51bWJlci4gICovCisgICAgX19ubGlua190IHN0X25saW5rOwkJLyogTGluayBjb3VudC4gICovCisgICAgX19tb2RlX3Qgc3RfbW9kZTsJCS8qIEZpbGUgbW9kZS4gICovCisjZWxzZQorICAgIHVuc2lnbmVkIGludCBfX3BhZDE7CisgICAgX19pbm9fdCBfX3N0X2lubzsJCQkvKiAzMmJpdCBmaWxlIHNlcmlhbCBudW1iZXIuCSovCisgICAgX19tb2RlX3Qgc3RfbW9kZTsJCQkvKiBGaWxlIG1vZGUuICAqLworICAgIF9fbmxpbmtfdCBzdF9ubGluazsJCQkvKiBMaW5rIGNvdW50LiAgKi8KKyNlbmRpZgorICAgIF9fdWlkX3Qgc3RfdWlkOwkJLyogVXNlciBJRCBvZiB0aGUgZmlsZSdzIG93bmVyLgkqLworICAgIF9fZ2lkX3Qgc3RfZ2lkOwkJLyogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cC4qLworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyAgICBpbnQgcGFkMDsKKyAgICBfX2Rldl90IHN0X3JkZXY7CQkvKiBEZXZpY2UgbnVtYmVyLCBpZiBkZXZpY2UuICAqLworICAgIF9fb2ZmX3Qgc3Rfc2l6ZTsJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworI2Vsc2UKKyAgICBfX2Rldl90IHN0X3JkZXY7CQkJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgX19wYWQyOworICAgIF9fb2ZmNjRfdCBzdF9zaXplOwkJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICAqLworI2VuZGlmCisgICAgX19ibGtzaXplX3Qgc3RfYmxrc2l6ZTsJLyogT3B0aW1hbCBibG9jayBzaXplIGZvciBJL08uICAqLworICAgIF9fYmxrY250NjRfdCBzdF9ibG9ja3M7CS8qIE5yLiA1MTItYnl0ZSBibG9ja3MgYWxsb2NhdGVkLiAgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisgICAgLyogTmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWVzdGFtcHMgYXJlIHN0b3JlZCBpbiBhIGZvcm1hdAorICAgICAgIGVxdWl2YWxlbnQgdG8gJ3N0cnVjdCB0aW1lc3BlYycuICBUaGlzIGlzIHRoZSB0eXBlIHVzZWQKKyAgICAgICB3aGVuZXZlciBwb3NzaWJsZSBidXQgdGhlIFVuaXggbmFtZXNwYWNlIHJ1bGVzIGRvIG5vdCBhbGxvdyB0aGUKKyAgICAgICBpZGVudGlmaWVyICd0aW1lc3BlYycgdG8gYXBwZWFyIGluIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyLgorICAgICAgIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIGhhbmRsZSB0aGUgdXNlIG9mIHRoaXMgaGVhZGVyIGluIHN0cmljdGx5CisgICAgICAgc3RhbmRhcmQtY29tcGxpYW50IHNvdXJjZXMgc3BlY2lhbC4gICovCisgICAgc3RydWN0IHRpbWVzcGVjIHN0X2F0aW07CQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXNwZWMgc3RfbXRpbTsJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIHN0cnVjdCB0aW1lc3BlYyBzdF9jdGltOwkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICAqLworIyBkZWZpbmUgc3RfYXRpbWUgc3RfYXRpbS50dl9zZWMJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eS4gICovCisjIGRlZmluZSBzdF9tdGltZSBzdF9tdGltLnR2X3NlYworIyBkZWZpbmUgc3RfY3RpbWUgc3RfY3RpbS50dl9zZWMKKyNlbHNlCisgICAgX190aW1lX3Qgc3RfYXRpbWU7CQkJLyogVGltZSBvZiBsYXN0IGFjY2Vzcy4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgc3RfYXRpbWVuc2VjOwkvKiBOc2NlY3Mgb2YgbGFzdCBhY2Nlc3MuICAqLworICAgIF9fdGltZV90IHN0X210aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0X210aW1lbnNlYzsJLyogTnNlY3Mgb2YgbGFzdCBtb2RpZmljYXRpb24uICAqLworICAgIF9fdGltZV90IHN0X2N0aW1lOwkJCS8qIFRpbWUgb2YgbGFzdCBzdGF0dXMgY2hhbmdlLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzdF9jdGltZW5zZWM7CS8qIE5zZWNzIG9mIGxhc3Qgc3RhdHVzIGNoYW5nZS4gICovCisjZW5kaWYKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgbG9uZyBpbnQgX191bnVzZWRbM107CisjZWxzZQorICAgIF9faW5vNjRfdCBzdF9pbm87CQkJLyogRmlsZSBzZXJpYWwgbnVtYmVyLgkJKi8KKyNlbmRpZgorICB9OworI2VuZGlmCisKKy8qIFRlbGwgY29kZSB3ZSBoYXZlIHRoZXNlIG1lbWJlcnMuICAqLworI2RlZmluZQlfU1RBVEJVRl9TVF9CTEtTSVpFCisjZGVmaW5lIF9TVEFUQlVGX1NUX1JERVYKKy8qIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lIHZhbHVlcyBhcmUgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgX1NUQVRCVUZfU1RfTlNFQworCisvKiBFbmNvZGluZyBvZiB0aGUgZmlsZSBtb2RlLiAgKi8KKworI2RlZmluZQlfX1NfSUZNVAkwMTcwMDAwCS8qIFRoZXNlIGJpdHMgZGV0ZXJtaW5lIGZpbGUgdHlwZS4gICovCisKKy8qIEZpbGUgdHlwZXMuICAqLworI2RlZmluZQlfX1NfSUZESVIJMDA0MDAwMAkvKiBEaXJlY3RvcnkuICAqLworI2RlZmluZQlfX1NfSUZDSFIJMDAyMDAwMAkvKiBDaGFyYWN0ZXIgZGV2aWNlLiAgKi8KKyNkZWZpbmUJX19TX0lGQkxLCTAwNjAwMDAJLyogQmxvY2sgZGV2aWNlLiAgKi8KKyNkZWZpbmUJX19TX0lGUkVHCTAxMDAwMDAJLyogUmVndWxhciBmaWxlLiAgKi8KKyNkZWZpbmUJX19TX0lGSUZPCTAwMTAwMDAJLyogRklGTy4gICovCisjZGVmaW5lCV9fU19JRkxOSwkwMTIwMDAwCS8qIFN5bWJvbGljIGxpbmsuICAqLworI2RlZmluZQlfX1NfSUZTT0NLCTAxNDAwMDAJLyogU29ja2V0LiAgKi8KKworLyogUE9TSVguMWIgb2JqZWN0cy4gIE5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgYWx3YXlzIGV2YWx1YXRlIHRvIHplcm8uICBCdXQKKyAgIHRoZXkgZG8gaXQgYnkgZW5mb3JjaW5nIHRoZSBjb3JyZWN0IHVzZSBvZiB0aGUgbWFjcm9zLiAgKi8KKyNkZWZpbmUgX19TX1RZUEVJU01RKGJ1ZikgICgoYnVmKS0+c3RfbW9kZSAtIChidWYpLT5zdF9tb2RlKQorI2RlZmluZSBfX1NfVFlQRUlTU0VNKGJ1ZikgKChidWYpLT5zdF9tb2RlIC0gKGJ1ZiktPnN0X21vZGUpCisjZGVmaW5lIF9fU19UWVBFSVNTSE0oYnVmKSAoKGJ1ZiktPnN0X21vZGUgLSAoYnVmKS0+c3RfbW9kZSkKKworLyogUHJvdGVjdGlvbiBiaXRzLiAgKi8KKworI2RlZmluZQlfX1NfSVNVSUQJMDQwMDAJLyogU2V0IHVzZXIgSUQgb24gZXhlY3V0aW9uLiAgKi8KKyNkZWZpbmUJX19TX0lTR0lECTAyMDAwCS8qIFNldCBncm91cCBJRCBvbiBleGVjdXRpb24uICAqLworI2RlZmluZQlfX1NfSVNWVFgJMDEwMDAJLyogU2F2ZSBzd2FwcGVkIHRleHQgYWZ0ZXIgdXNlIChzdGlja3kpLiAgKi8KKyNkZWZpbmUJX19TX0lSRUFECTA0MDAJLyogUmVhZCBieSBvd25lci4gICovCisjZGVmaW5lCV9fU19JV1JJVEUJMDIwMAkvKiBXcml0ZSBieSBvd25lci4gICovCisjZGVmaW5lCV9fU19JRVhFQwkwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9BVEZJTEUgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIFhYWCBUaGlzIHdpbGwgY2hhbmdlIHRvIHRoZSBtYWNybyBmb3IgdGhlIG5leHQgMjAwOCBQT1NJWCByZXZpc2lvbi4gICovCisjIGRlZmluZSBVVElNRV9OT1cJKCgxbCA8PCAzMCkgLSAxbCkKKyMgZGVmaW5lIFVUSU1FX09NSVQJKCgxbCA8PCAzMCkgLSAybCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0YXRmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0YXRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjc4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RhdGZzLmgKQEAgLTAsMCArMSw2NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAwLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1RBVEZTX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RhdGZzLmg+IGRpcmVjdGx5OyB1c2UgPHN5cy9zdGF0ZnMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworc3RydWN0IHN0YXRmcworICB7CisgICAgX19TV09SRF9UWVBFIGZfdHlwZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9ic2l6ZTsKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgIF9fZnNibGtjbnRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudF90IGZfZmZyZWU7CisjZWxzZQorICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworI2VuZGlmCisgICAgX19mc2lkX3QgZl9mc2lkOworICAgIF9fU1dPUkRfVFlQRSBmX25hbWVsZW47CisgICAgX19TV09SRF9UWVBFIGZfZnJzaXplOworICAgIF9fU1dPUkRfVFlQRSBmX3NwYXJlWzVdOworICB9OworCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3N0cnVjdCBzdGF0ZnM2NAorICB7CisgICAgX19TV09SRF9UWVBFIGZfdHlwZTsKKyAgICBfX1NXT1JEX1RZUEUgZl9ic2l6ZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2Jsb2NrczsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JmcmVlOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmlsZXM7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mZnJlZTsKKyAgICBfX2ZzaWRfdCBmX2ZzaWQ7CisgICAgX19TV09SRF9UWVBFIGZfbmFtZWxlbjsKKyAgICBfX1NXT1JEX1RZUEUgZl9mcnNpemU7CisgICAgX19TV09SRF9UWVBFIGZfc3BhcmVbNV07CisgIH07CisjZW5kaWYKKworLyogVGVsbCBjb2RlIHdlIGhhdmUgdGhlc2UgbWVtYmVycy4gICovCisjZGVmaW5lIF9TVEFURlNfRl9OQU1FTEVOCisjZGVmaW5lIF9TVEFURlNfRl9GUlNJWkUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGF0dmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RhdHZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzE3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RhdHZmcy5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCwyMDAwLDIwMDEsMjAwMiwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU1RBVFZGU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0YXR2ZnMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N0YXR2ZnMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4gIC8qIEZvciBfX2ZzYmxrY250X3QgYW5kIF9fZnNmaWxjbnRfdC4gICovCisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjZGVmaW5lIF9TVEFUVkZTQlVGX0ZfVU5VU0VECisjZW5kaWYKKworc3RydWN0IHN0YXR2ZnMKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfYnNpemU7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mcnNpemU7CisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICBfX2ZzYmxrY250X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudF90IGZfYmF2YWlsOworICAgIF9fZnNmaWxjbnRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnRfdCBmX2ZhdmFpbDsKKyNlbHNlCisgICAgX19mc2Jsa2NudDY0X3QgZl9ibG9ja3M7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iZnJlZTsKKyAgICBfX2ZzYmxrY250NjRfdCBmX2JhdmFpbDsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZpbGVzOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmZyZWU7CisgICAgX19mc2ZpbGNudDY0X3QgZl9mYXZhaWw7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2ZzaWQ7CisjaWZkZWYgX1NUQVRWRlNCVUZfRl9VTlVTRUQKKyAgICBpbnQgX19mX3VudXNlZDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZmxhZzsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX25hbWVtYXg7CisgICAgaW50IF9fZl9zcGFyZVs2XTsKKyAgfTsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitzdHJ1Y3Qgc3RhdHZmczY0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCBmX2JzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnJzaXplOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmxvY2tzOworICAgIF9fZnNibGtjbnQ2NF90IGZfYmZyZWU7CisgICAgX19mc2Jsa2NudDY0X3QgZl9iYXZhaWw7CisgICAgX19mc2ZpbGNudDY0X3QgZl9maWxlczsKKyAgICBfX2ZzZmlsY250NjRfdCBmX2ZmcmVlOworICAgIF9fZnNmaWxjbnQ2NF90IGZfZmF2YWlsOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfZnNpZDsKKyNpZmRlZiBfU1RBVFZGU0JVRl9GX1VOVVNFRAorICAgIGludCBfX2ZfdW51c2VkOworI2VuZGlmCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZl9mbGFnOworICAgIHVuc2lnbmVkIGxvbmcgaW50IGZfbmFtZW1heDsKKyAgICBpbnQgX19mX3NwYXJlWzZdOworICB9OworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgZmxhZyBpbiBgZl9mbGFnJy4gIFRoZXNlIGRlZmluaXRpb25zIHNob3VsZCBiZQorICAga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRlZmluaXRpb25zIGluIDxzeXMvbW91bnQuaD4uICAqLworZW51bQoreworICBTVF9SRE9OTFkgPSAxLAkJLyogTW91bnQgcmVhZC1vbmx5LiAgKi8KKyNkZWZpbmUgU1RfUkRPTkxZCVNUX1JET05MWQorICBTVF9OT1NVSUQgPSAyCQkJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cy4gICovCisjZGVmaW5lIFNUX05PU1VJRAlTVF9OT1NVSUQKKyNpZmRlZiBfX1VTRV9HTlUKKyAgLAorICBTVF9OT0RFViA9IDQsCQkJLyogRGlzYWxsb3cgYWNjZXNzIHRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiAgKi8KKyMgZGVmaW5lIFNUX05PREVWCVNUX05PREVWCisgIFNUX05PRVhFQyA9IDgsCQkvKiBEaXNhbGxvdyBwcm9ncmFtIGV4ZWN1dGlvbi4gICovCisjIGRlZmluZSBTVF9OT0VYRUMJU1RfTk9FWEVDCisgIFNUX1NZTkNIUk9OT1VTID0gMTYsCQkvKiBXcml0ZXMgYXJlIHN5bmNlZCBhdCBvbmNlLiAgKi8KKyMgZGVmaW5lIFNUX1NZTkNIUk9OT1VTCVNUX1NZTkNIUk9OT1VTCisgIFNUX01BTkRMT0NLID0gNjQsCQkvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMuICAqLworIyBkZWZpbmUgU1RfTUFORExPQ0sJU1RfTUFORExPQ0sKKyAgU1RfV1JJVEUgPSAxMjgsCQkvKiBXcml0ZSBvbiBmaWxlL2RpcmVjdG9yeS9zeW1saW5rLiAgKi8KKyMgZGVmaW5lIFNUX1dSSVRFCVNUX1dSSVRFCisgIFNUX0FQUEVORCA9IDI1NiwJCS8qIEFwcGVuZC1vbmx5IGZpbGUuICAqLworIyBkZWZpbmUgU1RfQVBQRU5ECVNUX0FQUEVORAorICBTVF9JTU1VVEFCTEUgPSA1MTIsCQkvKiBJbW11dGFibGUgZmlsZS4gICovCisjIGRlZmluZSBTVF9JTU1VVEFCTEUJU1RfSU1NVVRBQkxFCisgIFNUX05PQVRJTUUgPSAxMDI0LAkJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICAqLworIyBkZWZpbmUgU1RfTk9BVElNRQlTVF9OT0FUSU1FCisgIFNUX05PRElSQVRJTUUgPSAyMDQ4LAkJLyogRG8gbm90IHVwZGF0ZSBkaXJlY3RvcnkgYWNjZXNzIHRpbWVzLiAgKi8KKyMgZGVmaW5lIFNUX05PRElSQVRJTUUJU1RfTk9ESVJBVElNRQorICBTVF9SRUxBVElNRSA9IDQwOTYJCS8qIFVwZGF0ZSBhdGltZSByZWxhdGl2ZSB0byBtdGltZS9jdGltZS4gICovCisjIGRlZmluZSBTVF9SRUxBVElNRQlTVF9SRUxBVElNRQorI2VuZGlmCS8qIFVzZSBHTlUuICAqLworfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRpby1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8tbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2U2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8tbGRibC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBzdGRpbyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkaW8tbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKK19fTERCTF9SRURJUl9ERUNMIChmcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHByaW50ZikKK19fTERCTF9SRURJUl9ERUNMIChzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZmcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAodnNwcmludGYpCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAmJiAhZGVmaW5lZCBfX1JFRElSRUNUIFwKKyAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMIChmc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfZnNjYW5mKQorX19MREJMX1JFRElSMV9ERUNMIChzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAoc3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3NzY2FuZikKKyNlbHNlCitfX0xEQkxfUkVESVJfREVDTCAoZnNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHNjYW5mKQorX19MREJMX1JFRElSX0RFQ0wgKHNzY2FuZikKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSX0RFQ0wgKHNucHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKHZzbnByaW50ZikKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMICh2ZnNjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zmc2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzc2NhbmYsIF9fbmxkYmxfX19pc29jOTlfdnNzY2FuZikKKyMgZWxzZQorX19MREJMX1JFRElSX0RFQ0wgKHZmc2NhbmYpCitfX0xEQkxfUkVESVJfREVDTCAodnNzY2FuZikKK19fTERCTF9SRURJUl9ERUNMICh2c2NhbmYpCisjIGVuZGlmCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSX0RFQ0wgKHZkcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKGRwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAodmFzcHJpbnRmKQorX19MREJMX1JFRElSX0RFQ0wgKF9fYXNwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAoYXNwcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAob2JzdGFja19wcmludGYpCitfX0xEQkxfUkVESVJfREVDTCAob2JzdGFja192cHJpbnRmKQorI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3NwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnNwcmludGZfY2hrKQorIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorX19MREJMX1JFRElSX0RFQ0wgKF9fc25wcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fdnNucHJpbnRmX2NoaykKKyMgZW5kaWYKKyMgaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKK19fTERCTF9SRURJUl9ERUNMIChfX2ZwcmludGZfY2hrKQorX19MREJMX1JFRElSX0RFQ0wgKF9fcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZmcHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3ZwcmludGZfY2hrKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8tbG9jay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvLWxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVmZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvLWxvY2suaApAQCAtMCwwICsxLDExMSBAQAorLyogVGhyZWFkIHBhY2thZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMgb2Ygc3RyZWFtIGxvY2sgdHlwZS4gIE5QVEwgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfQklUU19TVERJT19MT0NLX0gKKyNkZWZpbmUgX0JJVFNfU1RESU9fTE9DS19IIDEKKworI2luY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CisjaW5jbHVkZSA8bG93bGV2ZWxsb2NrLmg+CisKKworLyogVGhlIGxvY2tpbmcgaGVyZSBpcyB2ZXJ5IGluZXhwZW5zaXZlLCBldmVuIGZvciBpbmxpbmluZy4gICovCisjZGVmaW5lIF9JT19sb2NrX2luZXhwZW5zaXZlCTEKKwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgbG9jazsgaW50IGNudDsgdm9pZCAqb3duZXI7IH0gX0lPX2xvY2tfdDsKKworI2RlZmluZSBfSU9fbG9ja19pbml0aWFsaXplciB7IExMTF9MT0NLX0lOSVRJQUxJWkVSLCAwLCBOVUxMIH0KKworI2RlZmluZSBfSU9fbG9ja19pbml0KF9uYW1lKSBcCisgICgoX25hbWUpID0gKF9JT19sb2NrX3QpIF9JT19sb2NrX2luaXRpYWxpemVyICwgMCkKKworI2RlZmluZSBfSU9fbG9ja19maW5pKF9uYW1lKSBcCisgICgodm9pZCkgMCkKKworI2RlZmluZSBfSU9fbG9ja19sb2NrKF9uYW1lKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgdm9pZCAqX19zZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoX25hbWUpLm93bmVyICE9IF9fc2VsZikJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJbGxsX2xvY2sgKChfbmFtZSkubG9jaywgTExMX1BSSVZBVEUpOwkJCQkgICAgICBcCisgICAgICAgIChfbmFtZSkub3duZXIgPSBfX3NlbGY7CQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgICArKyhfbmFtZSkuY250OwkJCQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX0lPX2xvY2tfdHJ5bG9jayhfbmFtZSkgXAorICAoewkJCQkJCQkJCSAgICAgIFwKKyAgICBpbnQgX19yZXN1bHQgPSAwOwkJCQkJCQkgICAgICBcCisgICAgdm9pZCAqX19zZWxmID0gVEhSRUFEX1NFTEY7CQkJCQkJICAgICAgXAorICAgIGlmICgoX25hbWUpLm93bmVyICE9IF9fc2VsZikJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICAgIGlmIChsbGxfdHJ5bG9jayAoKF9uYW1lKS5sb2NrKSA9PSAwKQkJCQkgICAgICBcCisgICAgICAgICAgewkJCQkJCQkJICAgICAgXAorICAgICAgICAgICAgKF9uYW1lKS5vd25lciA9IF9fc2VsZjsJCQkJCSAgICAgIFwKKyAgICAgICAgICAgIChfbmFtZSkuY250ID0gMTsJCQkJCQkgICAgICBcCisgICAgICAgICAgfQkJCQkJCQkJICAgICAgXAorICAgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICAgICAgX19yZXN1bHQgPSBFQlVTWTsJCQkJCQkgICAgICBcCisgICAgICB9CQkJCQkJCQkJICAgICAgXAorICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKyAgICAgICsrKF9uYW1lKS5jbnQ7CQkJCQkJCSAgICAgIFwKKyAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKKyAgfSkKKworI2RlZmluZSBfSU9fbG9ja191bmxvY2soX25hbWUpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBpZiAoLS0oX25hbWUpLmNudCA9PSAwKQkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisgICAgICAgIChfbmFtZSkub3duZXIgPSBOVUxMOwkJCQkJCSAgICAgIFwKKwlsbGxfdW5sb2NrICgoX25hbWUpLmxvY2ssIExMTF9QUklWQVRFKTsJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworCisKKyNkZWZpbmUgX0lPX2NsZWFudXBfcmVnaW9uX3N0YXJ0KF9mY3QsIF9mcCkgXAorICBfX2xpYmNfY2xlYW51cF9yZWdpb25fc3RhcnQgKCgoX2ZwKS0+X2ZsYWdzICYgX0lPX1VTRVJfTE9DSykgPT0gMCwgX2ZjdCwgX2ZwKQorI2RlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fc3RhcnRfbm9hcmcoX2ZjdCkgXAorICBfX2xpYmNfY2xlYW51cF9yZWdpb25fc3RhcnQgKDEsIF9mY3QsIE5VTEwpCisjZGVmaW5lIF9JT19jbGVhbnVwX3JlZ2lvbl9lbmQoX2RvaXQpIFwKKyAgX19saWJjX2NsZWFudXBfcmVnaW9uX2VuZCAoX2RvaXQpCisKKyNpZiBkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIE5PVF9JTl9saWJjCisKKyMgaWZkZWYgX19FWENFUFRJT05TCisjICBkZWZpbmUgX0lPX2FjcXVpcmVfbG9jayhfZnApIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfSU9fRklMRSAqX0lPX2FjcXVpcmVfbG9ja19maWxlCQkJCQkgICAgICBcCisJX19hdHRyaWJ1dGVfXygoY2xlYW51cCAoX0lPX2FjcXVpcmVfbG9ja19mY3QpKSkJCQkgICAgICBcCisJPSAoX2ZwKTsJCQkJCQkJICAgICAgXAorICAgIF9JT19mbG9ja2ZpbGUgKF9JT19hY3F1aXJlX2xvY2tfZmlsZSk7CisjICBkZWZpbmUgX0lPX2FjcXVpcmVfbG9ja19jbGVhcl9mbGFnczIoX2ZwKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX0lPX0ZJTEUgKl9JT19hY3F1aXJlX2xvY2tfZmlsZQkJCQkJICAgICAgXAorCV9fYXR0cmlidXRlX18oKGNsZWFudXAgKF9JT19hY3F1aXJlX2xvY2tfY2xlYXJfZmxhZ3MyX2ZjdCkpKQkgICAgICBcCisJPSAoX2ZwKTsJCQkJCQkJICAgICAgXAorICAgIF9JT19mbG9ja2ZpbGUgKF9JT19hY3F1aXJlX2xvY2tfZmlsZSk7CisjIGVsc2UKKyMgIGRlZmluZSBfSU9fYWNxdWlyZV9sb2NrKF9mcCkgX0lPX2FjcXVpcmVfbG9ja19uZWVkc19leGNlcHRpb25zX2VuYWJsZWQKKyMgIGRlZmluZSBfSU9fYWNxdWlyZV9sb2NrX2NsZWFyX2ZsYWdzMihfZnApIF9JT19hY3F1aXJlX2xvY2sgKF9mcCkKKyMgZW5kaWYKKyMgZGVmaW5lIF9JT19yZWxlYXNlX2xvY2soX2ZwKSA7IH0gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZW5kaWYgLyogYml0cy9zdGRpby1sb2NrLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzMDNjNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRpby5oCkBAIC0wLDAgKzEsMTkxIEBACisvKiBPcHRpbWl6aW5nIG1hY3JvcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyBmb3Igc3RkaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwLCAyMDAxLCAyMDA0LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvLmg+IGRpcmVjdGx5OyB1c2UgPHN0ZGlvLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19leHRlcm5faW5saW5lCisjIGRlZmluZSBfX1NURElPX0lOTElORSBpbmxpbmUKKyNlbHNlCisjIGRlZmluZSBfX1NURElPX0lOTElORSBfX2V4dGVybl9pbmxpbmUKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworLyogRm9yIC1EX0ZPUlRJRllfU09VUkNFeyw9Mn0gYml0cy9zdGRpbzIuaCB3aWxsIGRlZmluZSBhIGRpZmZlcmVudAorICAgaW5saW5lLiAgKi8KKyMgaWYgIShfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUpCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dCBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLiAgKi8KK19fU1RESU9fSU5MSU5FIGludAordnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXJnKQoreworICByZXR1cm4gdmZwcmludGYgKHN0ZG91dCwgX19mbXQsIF9fYXJnKTsKK30KKyMgZW5kaWYKKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHN0ZGluLiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorZ2V0Y2hhciAodm9pZCkKK3sKKyAgcmV0dXJuIF9JT19nZXRjIChzdGRpbik7Cit9CisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeS4gICovCitfX1NURElPX0lOTElORSBpbnQKK2ZnZXRjX3VubG9ja2VkIChGSUxFICpfX2ZwKQoreworICByZXR1cm4gX0lPX2dldGNfdW5sb2NrZWQgKF9fZnApOworfQorIyBlbmRpZiAvKiBtaXNjICovCisKKworIyBpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhpcyBpcyBkZWZpbmVkIGluIFBPU0lYLjE6MTk5Ni4gICovCitfX1NURElPX0lOTElORSBpbnQKK2dldGNfdW5sb2NrZWQgKEZJTEUgKl9fZnApCit7CisgIHJldHVybiBfSU9fZ2V0Y191bmxvY2tlZCAoX19mcCk7Cit9CisKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworX19TVERJT19JTkxJTkUgaW50CitnZXRjaGFyX3VubG9ja2VkICh2b2lkKQoreworICByZXR1cm4gX0lPX2dldGNfdW5sb2NrZWQgKHN0ZGluKTsKK30KKyMgZW5kaWYJLyogUE9TSVggfHwgbWlzYyAqLworCisKKy8qIFdyaXRlIGEgY2hhcmFjdGVyIHRvIHN0ZG91dC4gICovCitfX1NURElPX0lOTElORSBpbnQKK3B1dGNoYXIgKGludCBfX2MpCit7CisgIHJldHVybiBfSU9fcHV0YyAoX19jLCBzdGRvdXQpOworfQorCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuICAqLworX19TVERJT19JTkxJTkUgaW50CitmcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pCit7CisgIHJldHVybiBfSU9fcHV0Y191bmxvY2tlZCAoX19jLCBfX3N0cmVhbSk7Cit9CisjIGVuZGlmIC8qIG1pc2MgKi8KKworCisjIGlmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGlzIGlzIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KK19fU1RESU9fSU5MSU5FIGludAorcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pCit7CisgIHJldHVybiBfSU9fcHV0Y191bmxvY2tlZCAoX19jLCBfX3N0cmVhbSk7Cit9CisKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuICAqLworX19TVERJT19JTkxJTkUgaW50CitwdXRjaGFyX3VubG9ja2VkIChpbnQgX19jKQoreworICByZXR1cm4gX0lPX3B1dGNfdW5sb2NrZWQgKF9fYywgc3Rkb3V0KTsKK30KKyMgZW5kaWYJLyogUE9TSVggfHwgbWlzYyAqLworCisKKyMgaWZkZWYJX19VU0VfR05VCisvKiBMaWtlIGBnZXRkZWxpbScsIGJ1dCByZWFkcyB1cCB0byBhIG5ld2xpbmUuICAqLworX19TVERJT19JTkxJTkUgX0lPX3NzaXplX3QKK2dldGxpbmUgKGNoYXIgKipfX2xpbmVwdHIsIHNpemVfdCAqX19uLCBGSUxFICpfX3N0cmVhbSkKK3sKKyAgcmV0dXJuIF9fZ2V0ZGVsaW0gKF9fbGluZXB0ciwgX19uLCAnXG4nLCBfX3N0cmVhbSk7Cit9CisjIGVuZGlmIC8qIEdOVSAqLworCisKKyMgaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb25zIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuICAqLworX19TVERJT19JTkxJTkUgaW50CitfX05USCAoZmVvZl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pKQoreworICByZXR1cm4gX0lPX2Zlb2ZfdW5sb2NrZWQgKF9fc3RyZWFtKTsKK30KKworLyogRmFzdGVyIHZlcnNpb25zIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuICAqLworX19TVERJT19JTkxJTkUgaW50CitfX05USCAoZmVycm9yX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkpCit7CisgIHJldHVybiBfSU9fZmVycm9yX3VubG9ja2VkIChfX3N0cmVhbSk7Cit9CisjIGVuZGlmIC8qIG1pc2MgKi8KKworI2VuZGlmIC8qIFVzZSBleHRlcm4gaW5saW5lcy4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyAmJiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19PUFRJTUlaRV9fIFwKKyAgICAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogUGVyZm9ybSBzb21lIHNpbXBsZSBvcHRpbWl6YXRpb25zLiAgKi8KKyMgZGVmaW5lIGZyZWFkX3VubG9ja2VkKHB0ciwgc2l6ZSwgbiwgc3RyZWFtKSBcCisgIChfX2V4dGVuc2lvbl9fICgoX19idWlsdGluX2NvbnN0YW50X3AgKHNpemUpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICBcCisJCSAgICYmIChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKSA8PSA4CQkgICAgICBcCisJCSAgICYmIChzaXplX3QpIChzaXplKSAhPSAwKQkJCQkgICAgICBcCisJCSAgPyAoeyBjaGFyICpfX3B0ciA9IChjaGFyICopIChwdHIpOwkJCSAgICAgIFwKKwkJICAgICAgIEZJTEUgKl9fc3RyZWFtID0gKHN0cmVhbSk7CQkJICAgICAgXAorCQkgICAgICAgc2l6ZV90IF9fY250OwkJCQkJICAgICAgXAorCQkgICAgICAgZm9yIChfX2NudCA9IChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKTsJICAgICAgXAorCQkJICAgIF9fY250ID4gMDsgLS1fX2NudCkJCQkJICAgICAgXAorCQkJIHsJCQkJCQkgICAgICBcCisJCQkgICBpbnQgX19jID0gX0lPX2dldGNfdW5sb2NrZWQgKF9fc3RyZWFtKTsJICAgICAgXAorCQkJICAgaWYgKF9fYyA9PSBFT0YpCQkJCSAgICAgIFwKKwkJCSAgICAgYnJlYWs7CQkJCQkgICAgICBcCisJCQkgICAqX19wdHIrKyA9IF9fYzsJCQkJICAgICAgXAorCQkJIH0JCQkJCQkgICAgICBcCisJCSAgICAgICAoKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pIC0gX19jbnQpCQkgICAgICBcCisJCQkvIChzaXplX3QpIChzaXplKTsgfSkJCQkJICAgICAgXAorCQkgIDogKCgoX19idWlsdGluX2NvbnN0YW50X3AgKHNpemUpICYmIChzaXplX3QpIChzaXplKSA9PSAwKSAgIFwKKwkJICAgICAgfHwgKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAmJiAoc2l6ZV90KSAobikgPT0gMCkpICAgICBcCisJCQkvKiBFdmFsdWF0ZSBhbGwgcGFyYW1ldGVycyBvbmNlLiAgKi8JCSAgICAgIFwKKwkJICAgICA/ICgodm9pZCkgKHB0ciksICh2b2lkKSAoc3RyZWFtKSwgKHZvaWQpIChzaXplKSwJICAgICAgXAorCQkJKHZvaWQpIChuKSwgKHNpemVfdCkgMCkJCQkJICAgICAgXAorCQkgICAgIDogZnJlYWRfdW5sb2NrZWQgKHB0ciwgc2l6ZSwgbiwgc3RyZWFtKSkpKQorCisjIGRlZmluZSBmd3JpdGVfdW5sb2NrZWQocHRyLCBzaXplLCBuLCBzdHJlYW0pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2l6ZSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgJiYgKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pIDw9IDgJCSAgICAgIFwKKwkJICAgJiYgKHNpemVfdCkgKHNpemUpICE9IDApCQkJCSAgICAgIFwKKwkJICA/ICh7IGNvbnN0IGNoYXIgKl9fcHRyID0gKGNvbnN0IGNoYXIgKikgKHB0cik7CSAgICAgIFwKKwkJICAgICAgIEZJTEUgKl9fc3RyZWFtID0gKHN0cmVhbSk7CQkJICAgICAgXAorCQkgICAgICAgc2l6ZV90IF9fY250OwkJCQkJICAgICAgXAorCQkgICAgICAgZm9yIChfX2NudCA9IChzaXplX3QpIChzaXplKSAqIChzaXplX3QpIChuKTsJICAgICAgXAorCQkJICAgIF9fY250ID4gMDsgLS1fX2NudCkJCQkJICAgICAgXAorCQkJIGlmIChfSU9fcHV0Y191bmxvY2tlZCAoKl9fcHRyKyssIF9fc3RyZWFtKSA9PSBFT0YpICAgXAorCQkJICAgYnJlYWs7CQkJCQkgICAgICBcCisJCSAgICAgICAoKHNpemVfdCkgKHNpemUpICogKHNpemVfdCkgKG4pIC0gX19jbnQpCQkgICAgICBcCisJCQkvIChzaXplX3QpIChzaXplKTsgfSkJCQkJICAgICAgXAorCQkgIDogKCgoX19idWlsdGluX2NvbnN0YW50X3AgKHNpemUpICYmIChzaXplX3QpIChzaXplKSA9PSAwKSAgIFwKKwkJICAgICAgfHwgKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAmJiAoc2l6ZV90KSAobikgPT0gMCkpICAgICBcCisJCQkvKiBFdmFsdWF0ZSBhbGwgcGFyYW1ldGVycyBvbmNlLiAgKi8JCSAgICAgIFwKKwkJICAgICA/ICgodm9pZCkgKHB0ciksICh2b2lkKSAoc3RyZWFtKSwgKHZvaWQpIChzaXplKSwJICAgICAgXAorCQkJKHZvaWQpIChuKSwgKHNpemVfdCkgMCkJCQkJICAgICAgXAorCQkgICAgIDogZndyaXRlX3VubG9ja2VkIChwdHIsIHNpemUsIG4sIHN0cmVhbSkpKSkKKyNlbmRpZgorCisvKiBEZWZpbmUgaGVscGVyIG1hY3JvLiAgKi8KKyN1bmRlZiBfX1NURElPX0lOTElORQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODk1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8yLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qIENoZWNraW5nIG1hY3JvcyBmb3Igc3RkaW8gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERJT19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvMi5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitleHRlcm4gaW50IF9fc3ByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19mbGFnLCBzaXplX3QgX19zbGVuLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX19USFJPVzsKK2V4dGVybiBpbnQgX192c3ByaW50Zl9jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19mbGFnLCBzaXplX3QgX19zbGVuLAorCQkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgX0dfdmFfbGlzdCBfX2FwKSBfX1RIUk9XOworCisjaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pKQoreworICByZXR1cm4gX19idWlsdGluX19fc3ByaW50Zl9jaGsgKF9fcywgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkJICBfX2JvcyAoX19zKSwgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorI2VsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgZGVmaW5lIHNwcmludGYoc3RyLCAuLi4pIFwKKyAgX19idWlsdGluX19fc3ByaW50Zl9jaGsgKHN0ciwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fYm9zIChzdHIpLCBcCisJCQkgICBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LAorCQkgX0dfdmFfbGlzdCBfX2FwKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3ZzcHJpbnRmX2NoayAoX19zLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCQkgICBfX2JvcyAoX19zKSwgX19mbXQsIF9fYXApOworfQorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKKworZXh0ZXJuIGludCBfX3NucHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sIGludCBfX2ZsYWcsCisJCQkgICBzaXplX3QgX19zbGVuLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAuLi4pIF9fVEhST1c7CitleHRlcm4gaW50IF9fdnNucHJpbnRmX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sIGludCBfX2ZsYWcsCisJCQkgICAgc2l6ZV90IF9fc2xlbiwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9HX3ZhX2xpc3QgX19hcCkgX19USFJPVzsKKworIyBpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3NucHJpbnRmX2NoayAoX19zLCBfX24sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJCSAgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjIGVsaWYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBzbnByaW50ZihzdHIsIGxlbiwgLi4uKSBcCisgIF9fYnVpbHRpbl9fX3NucHJpbnRmX2NoayAoc3RyLCBsZW4sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2JvcyAoc3RyKSwgXAorCQkJICAgIF9fVkFfQVJHU19fKQorIyBlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZzbnByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXApKQoreworICByZXR1cm4gX19idWlsdGluX19fdnNucHJpbnRmX2NoayAoX19zLCBfX24sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLAorCQkJCSAgICBfX2JvcyAoX19zKSwgX19mbXQsIF9fYXApOworfQorCisjZW5kaWYKKworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxCisKK2V4dGVybiBpbnQgX19mcHJpbnRmX2NoayAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgaW50IF9fZmxhZywKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX3ByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKTsKK2V4dGVybiBpbnQgX192ZnByaW50Zl9jaGsgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGludCBfX2ZsYWcsCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9HX3ZhX2xpc3QgX19hcCk7CitleHRlcm4gaW50IF9fdnByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgX0dfdmFfbGlzdCBfX2FwKTsKKworIyBpZmRlZiBfX3ZhX2FyZ19wYWNrCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCit7CisgIHJldHVybiBfX2ZwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19wcmludGZfY2hrIChfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwgX19mbXQsIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgcHJpbnRmKC4uLikgXAorICBfX3ByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgIGRlZmluZSBmcHJpbnRmKHN0cmVhbSwgLi4uKSBcCisgIF9fZnByaW50Zl9jaGsgKHN0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyBlbmRpZgorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAordnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBfR192YV9saXN0IF9fYXApCit7CisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyAgcmV0dXJuIF9fdmZwcmludGZfY2hrIChzdGRvdXQsIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7CisjZWxzZQorICByZXR1cm4gX192cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKKyNlbmRpZgorfQorCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAordmZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9HX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdmZwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX2dldHNfY2hrIChjaGFyICpfX3N0ciwgc2l6ZV90KSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2dldHNfd2FybiwgKGNoYXIgKl9fc3RyKSwgZ2V0cykKKyAgICAgX193dXIgX193YXJuYXR0ciAoInBsZWFzZSB1c2UgZmdldHMgb3IgZ2V0bGluZSBpbnN0ZWFkLCBnZXRzIGNhbid0ICIKKwkJICAgICAgICJzcGVjaWZ5IGJ1ZmZlciBzaXplIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitnZXRzIChjaGFyICpfX3N0cikKK3sKKyAgaWYgKF9fYm9zIChfX3N0cikgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fZ2V0c19jaGsgKF9fc3RyLCBfX2JvcyAoX19zdHIpKTsKKyAgcmV0dXJuIF9fZ2V0c193YXJuIChfX3N0cik7Cit9CisKK2V4dGVybiBjaGFyICpfX2ZnZXRzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsIGludCBfX24sCisJCQkgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1QgKF9fZmdldHNfYWxpYXMsCisJCQkgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgZmdldHMpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1QgKF9fZmdldHNfY2hrX3dhcm4sCisJCQkgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19zaXplLCBpbnQgX19uLAorCQkJICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgX19mZ2V0c19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0cyBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgY2hhciAqCitmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pIHx8IF9fbiA8PSAwKQorCXJldHVybiBfX2ZnZXRzX2NoayAoX19zLCBfX2JvcyAoX19zKSwgX19uLCBfX3N0cmVhbSk7CisKKyAgICAgIGlmICgoc2l6ZV90KSBfX24gPiBfX2JvcyAoX19zKSkKKwlyZXR1cm4gX19mZ2V0c19jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSwgX19uLCBfX3N0cmVhbSk7CisgICAgfQorICByZXR1cm4gX19mZ2V0c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworZXh0ZXJuIHNpemVfdCBfX2ZyZWFkX2NoayAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fcHRybGVuLAorCQkJICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUIChfX2ZyZWFkX2FsaWFzLAorCQkJICAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLAorCQkJICBmcmVhZCkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfY2hrX3dhcm4sCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19wdHJsZW4sCisJCQkgICBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQkJICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIF9fZnJlYWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZnJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgKiBubWVtYiB0aGFuIGxlbmd0aCAiCisJCSAgICAgICAib2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc2l6ZV90CitmcmVhZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKyAgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MwIChfX3B0cikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorCSAgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pCisJICB8fCAoX19zaXplIHwgX19uKSA+PSAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpKQorCXJldHVybiBfX2ZyZWFkX2NoayAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoX19zaXplICogX19uID4gX19ib3MwIChfX3B0cikpCisJcmV0dXJuIF9fZnJlYWRfY2hrX3dhcm4gKF9fcHRyLCBfX2JvczAgKF9fcHRyKSwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZyZWFkX2FsaWFzIChfX3B0ciwgX19zaXplLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIGNoYXIgKl9fZmdldHNfdW5sb2NrZWRfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwKKwkJCQkgICBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX3VubG9ja2VkX2FsaWFzLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIGZnZXRzX3VubG9ja2VkKSBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUIChfX2ZnZXRzX3VubG9ja2VkX2Noa193YXJuLAorCQkJIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksIF9fZmdldHNfdW5sb2NrZWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHNfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorZmdldHNfdW5sb2NrZWQgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0c191bmxvY2tlZF9jaGsgKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykpCisJcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcyksIF9fbiwgX19zdHJlYW0pOworICAgIH0KKyAgcmV0dXJuIF9fZmdldHNfdW5sb2NrZWRfYWxpYXMgKF9fcywgX19uLCBfX3N0cmVhbSk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgdW5kZWYgZnJlYWRfdW5sb2NrZWQKK2V4dGVybiBzaXplX3QgX19mcmVhZF91bmxvY2tlZF9jaGsgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCQkgICAgc2l6ZV90IF9fc2l6ZSwgc2l6ZV90IF9fbiwKKwkJCQkgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1QgKF9fZnJlYWRfdW5sb2NrZWRfYWxpYXMsCisJCQkgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAorCQkJICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSksCisJCQkgIGZyZWFkX3VubG9ja2VkKSBfX3d1cjsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVCAoX19mcmVhZF91bmxvY2tlZF9jaGtfd2FybiwKKwkJCSAgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3B0cmxlbiwKKwkJCSAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCisJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgX19mcmVhZF91bmxvY2tlZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmcmVhZF91bmxvY2tlZCBjYWxsZWQgd2l0aCBiaWdnZXIgc2l6ZSAqIG5tZW1iIHRoYW4gIgorCQkgICAgICAgImxlbmd0aCBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzaXplX3QKK2ZyZWFkX3VubG9ja2VkICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19uLAorCQlGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MwIChfX3B0cikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19zaXplKQorCSAgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pCisJICB8fCAoX19zaXplIHwgX19uKSA+PSAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpKQorCXJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2NoayAoX19wdHIsIF9fYm9zMCAoX19wdHIpLCBfX3NpemUsIF9fbiwKKwkJCQkgICAgIF9fc3RyZWFtKTsKKworICAgICAgaWYgKF9fc2l6ZSAqIF9fbiA+IF9fYm9zMCAoX19wdHIpKQorCXJldHVybiBfX2ZyZWFkX3VubG9ja2VkX2Noa193YXJuIChfX3B0ciwgX19ib3MwIChfX3B0ciksIF9fc2l6ZSwgX19uLAorCQkJCQkgIF9fc3RyZWFtKTsKKyAgICB9CisKKyMgaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyAgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpCisgICAgICAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKQorICAgICAgJiYgKF9fc2l6ZSB8IF9fbikgPCAoKChzaXplX3QpIDEpIDw8ICg4ICogc2l6ZW9mIChzaXplX3QpIC8gMikpCisgICAgICAmJiBfX3NpemUgKiBfX24gPD0gOCkKKyAgICB7CisgICAgICBzaXplX3QgX19jbnQgPSBfX3NpemUgKiBfX247CisgICAgICBjaGFyICpfX2NwdHIgPSAoY2hhciAqKSBfX3B0cjsKKyAgICAgIGlmIChfX2NudCA9PSAwKQorCXJldHVybiAwOworCisgICAgICBmb3IgKDsgX19jbnQgPiAwOyAtLV9fY250KQorCXsKKwkgIGludCBfX2MgPSBfSU9fZ2V0Y191bmxvY2tlZCAoX19zdHJlYW0pOworCSAgaWYgKF9fYyA9PSBFT0YpCisJICAgIGJyZWFrOworCSAgKl9fY3B0cisrID0gX19jOworCX0KKyAgICAgIHJldHVybiAoX19jcHRyIC0gKGNoYXIgKikgX19wdHIpIC8gX19zaXplOworICAgIH0KKyMgZW5kaWYKKyAgcmV0dXJuIF9fZnJlYWRfdW5sb2NrZWRfYWxpYXMgKF9fcHRyLCBfX3NpemUsIF9fbiwgX19zdHJlYW0pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkaW9fbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkaW9fbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5ZjlkMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRpb19saW0uaApAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1RESU9fSCAmJiAhZGVmaW5lZCBfX25lZWRfRk9QRU5fTUFYICYmICFkZWZpbmVkIF9fbmVlZF9JT1ZfTUFYCisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3N0ZGlvX2xpbS5oPiBkaXJlY3RseTsgdXNlIDxzdGRpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZkZWYgX1NURElPX0gKKyMgZGVmaW5lIExfdG1wbmFtIDIwCisjIGRlZmluZSBUTVBfTUFYIDIzODMyOAorIyBkZWZpbmUgRklMRU5BTUVfTUFYIDQwOTYKKworIyBpZmRlZiBfX1VTRV9QT1NJWAorIyAgZGVmaW5lIExfY3Rlcm1pZCA5CisjICBkZWZpbmUgTF9jdXNlcmlkIDkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX25lZWRfRk9QRU5fTUFYIHx8IGRlZmluZWQgX1NURElPX0gKKyMgdW5kZWYgIEZPUEVOX01BWAorIyBkZWZpbmUgRk9QRU5fTUFYIDE2CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19uZWVkX0lPVl9NQVggJiYgIWRlZmluZWQgSU9WX01BWAorIyBkZWZpbmUgSU9WX01BWCAxMDI0CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRsaWItbGRibC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0ZGxpYi1sZGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4ZTFmNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRsaWItbGRibC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8c3RkbGliLmg+IGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3RkbGliLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8c3RkbGliLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorX19MREJMX1JFRElSMV9ERUNMIChzdHJ0b2xkLCBzdHJ0b2QpCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorX19MREJMX1JFRElSMV9ERUNMIChzdHJ0b2xkX2wsIHN0cnRvZF9sKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyBpZmRlZiBfX1VTRV9NSVNDCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFlY3Z0LCBlY3Z0KQorX19MREJMX1JFRElSMV9ERUNMIChxZmN2dCwgZmN2dCkKK19fTERCTF9SRURJUjFfREVDTCAocWdjdnQsIGdjdnQpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHFlY3Z0X3IsIGVjdnRfcikKK19fTERCTF9SRURJUjFfREVDTCAocWZjdnRfciwgZmN2dF9yKQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkbGliLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RkbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdGRsaWIuaApAQCAtMCwwICsxLDE1NiBAQAorLyogQ2hlY2tpbmcgbWFjcm9zIGZvciBzdGRsaWIgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdGRsaWIuaD4gZGlyZWN0bHk7IHVzZSA8c3RkbGliLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX3JlYWxwYXRoX2NoayAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICAgY2hhciAqX19yZXN0cmljdCBfX3Jlc29sdmVkLAorCQkJICAgICBzaXplX3QgX19yZXNvbHZlZGxlbikgX19USFJPVyBfX3d1cjsKK2V4dGVybiBjaGFyICpfX1JFRElSRUNUX05USCAoX19yZWFscGF0aF9hbGlhcywKKwkJCSAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCQkgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpLCByZWFscGF0aCkgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fcmVhbHBhdGhfY2hrX3dhcm4sCisJCQkgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICAgY2hhciAqX19yZXN0cmljdCBfX3Jlc29sdmVkLAorCQkJICAgICAgc2l6ZV90IF9fcmVzb2x2ZWRsZW4pLCBfX3JlYWxwYXRoX2NoaykgX193dXIKKyAgICAgX193YXJuYXR0ciAoInNlY29uZCBhcmd1bWVudCBvZiByZWFscGF0aCBtdXN0IGJlIGVpdGhlciBOVUxMIG9yIGF0ICIKKwkJICJsZWFzdCBQQVRIX01BWCBieXRlcyBsb25nIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorX19OVEggKHJlYWxwYXRoIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLCBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpKQoreworICBpZiAoX19ib3MgKF9fcmVzb2x2ZWQpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDX0xJTUlUU19IXyAmJiBkZWZpbmVkIFBBVEhfTUFYCisgICAgICBpZiAoX19ib3MgKF9fcmVzb2x2ZWQpIDwgUEFUSF9NQVgpCisJcmV0dXJuIF9fcmVhbHBhdGhfY2hrX3dhcm4gKF9fbmFtZSwgX19yZXNvbHZlZCwgX19ib3MgKF9fcmVzb2x2ZWQpKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIF9fcmVhbHBhdGhfY2hrIChfX25hbWUsIF9fcmVzb2x2ZWQsIF9fYm9zIChfX3Jlc29sdmVkKSk7CisgICAgfQorCisgIHJldHVybiBfX3JlYWxwYXRoX2FsaWFzIChfX25hbWUsIF9fcmVzb2x2ZWQpOworfQorCisKK2V4dGVybiBpbnQgX19wdHNuYW1lX3JfY2hrIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCkgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3B0c25hbWVfcl9hbGlhcywgKGludCBfX2ZkLCBjaGFyICpfX2J1ZiwKKwkJCQkJICAgICAgIHNpemVfdCBfX2J1ZmxlbiksIHB0c25hbWVfcikKKyAgICAgX19ub25udWxsICgoMikpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19wdHNuYW1lX3JfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc2l6ZV90IF9fbnJlYWwpLCBfX3B0c25hbWVfcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDIpKSBfX3dhcm5hdHRyICgicHRzbmFtZV9yIGNhbGxlZCB3aXRoIGJ1ZmxlbiBiaWdnZXIgdGhhbiAiCisJCQkJICJzaXplIG9mIGJ1ZiIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHB0c25hbWVfciAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fcHRzbmFtZV9yX2NoayAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fcHRzbmFtZV9yX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcHRzbmFtZV9yX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4pOworfQorCisKK2V4dGVybiBpbnQgX193Y3RvbWJfY2hrIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhciwgc2l6ZV90IF9fYnVmbGVuKQorICBfX1RIUk9XIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX193Y3RvbWJfYWxpYXMsIChjaGFyICpfX3MsIHdjaGFyX3QgX193Y2hhciksCisJCQkgICB3Y3RvbWIpIF9fd3VyOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGludAorX19OVEggKHdjdG9tYiAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIpKQoreworICAvKiBXZSB3b3VsZCBoYXZlIHRvIGluY2x1ZGUgPGxpbWl0cy5oPiB0byBnZXQgYSBkZWZpbml0aW9uIG9mIE1CX0xFTl9NQVguCisgICAgIEJ1dCB0aGlzIHdvdWxkIG9ubHkgZGlzdHVyYiB0aGUgbmFtZXNwYWNlLiAgU28gd2UgZGVmaW5lIG91ciBvd24KKyAgICAgdmVyc2lvbiBoZXJlLiAgKi8KKyNkZWZpbmUgX19TVERMSUJfTUJfTEVOX01BWAkxNgorI2lmIGRlZmluZWQgTUJfTEVOX01BWCAmJiBNQl9MRU5fTUFYICE9IF9fU1RETElCX01CX0xFTl9NQVgKKyMgZXJyb3IgIkFzc3VtZWQgdmFsdWUgb2YgTUJfTEVOX01BWCB3cm9uZyIKKyNlbmRpZgorICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEgJiYgX19TVERMSUJfTUJfTEVOX01BWCA+IF9fYm9zIChfX3MpKQorICAgIHJldHVybiBfX3djdG9tYl9jaGsgKF9fcywgX193Y2hhciwgX19ib3MgKF9fcykpOworICByZXR1cm4gX193Y3RvbWJfYWxpYXMgKF9fcywgX193Y2hhcik7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX21ic3Rvd2NzX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnN0b3djc19hbGlhcywKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4pLCBtYnN0b3djcyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX21ic3Rvd2NzX2Noa193YXJuLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSwgX19tYnN0b3djc19jaGspCisgICAgIF9fd2FybmF0dHIgKCJtYnN0b3djcyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4gIgorCQkgIiogc2l6ZW9mICh3Y2hhcl90KSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKG1ic3Rvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fbWJzdG93Y3NfY2hrIChfX2RzdCwgX19zcmMsIF9fbGVuLAorCQkJICAgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fbWJzdG93Y3NfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sCisJCQkJICAgICBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX19tYnN0b3djc19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX2xlbik7Cit9CisKKworZXh0ZXJuIHNpemVfdCBfX3djc3RvbWJzX2NoayAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3N0b21ic19hbGlhcywKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4pLCB3Y3N0b21icyk7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3RvbWJzX2Noa193YXJuLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fZHN0bGVuKSwgX193Y3N0b21ic19jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3N0b21icyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4iKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIICh3Y3N0b21icyAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkgc2l6ZV90IF9fbGVuKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX3djc3RvbWJzX2NoayAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MgKF9fZHN0KSk7CisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpKQorCXJldHVybiBfX3djc3RvbWJzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kc3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc3RvbWJzX2FsaWFzIChfX2RzdCwgX19zcmMsIF9fbGVuKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdHJpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDhjZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0cmluZy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIE9wdGltaXplZCwgaW5saW5lZCBzdHJpbmcgZnVuY3Rpb25zLiAgQU1EIHg4Ni02NCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZy5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3RyaW5nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKy8qIEN1cnJlbnRseSB0aGUgb25seSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byB0ZWxsIHRoZSBnZW5lcmljIGlubGluZQorICAgbWFjcm9zIHRoYXQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgaXMgcG9zc2libGUgZm9yIHg4Ni02NC4gICovCisjZGVmaW5lIF9TVFJJTkdfQVJDSF91bmFsaWduZWQJMQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0cmluZzIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdHJpbmcyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExOGExYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdHJpbmcyLmgKQEAgLTAsMCArMSwxMzU1IEBACisvKiBNYWNoaW5lLWluZGVwZW5kYW50IHN0cmluZyBmdW5jdGlvbiBvcHRpbWl6YXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDMsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RSSU5HX0gKKyMgZXJyb3IgIk5ldmVyIHVzZSA8Yml0cy9zdHJpbmcyLmg+IGRpcmVjdGx5OyBpbmNsdWRlIDxzdHJpbmcuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmICFkZWZpbmVkIF9fTk9fU1RSSU5HX0lOTElORVMgJiYgIWRlZmluZWQgX19CT1VOREVEX1BPSU5URVJTX18KKworLyogVW5saWtlIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgaGVhZGVyIDxiaXRzL3N0cmluZy5oPiB0aGUKKyAgIGRlZmluaXRpb25zIGNvbnRhaW5lZCBoZXJlIGFyZSBub3Qgb3B0aW1pemVkIGRvd24gdG8gYXNzZW1ibGVyCisgICBsZXZlbC4gIFRob3NlIG9wdGltaXphdGlvbnMgYXJlIG5vdCBhbHdheXMgYSBnb29kIGlkZWEgc2luY2UgdGhpcworICAgbWVhbnMgdGhlIGNvZGUgc2l6ZSBpbmNyZWFzZXMgYSBsb3QuICBJbnN0ZWFkIHRoZSBkZWZpbml0aW9ucyBoZXJlCisgICBvcHRpbWl6ZSBzb21lIGZ1bmN0aW9ucyBpbiBhIHdheSB3aGljaCBkbyBub3QgZHJhbWF0aWNhbGx5CisgICBpbmNyZWFzZSB0aGUgY29kZSBzaXplIGFuZCB3aGljaCBkbyBub3QgdXNlIGFzc2VtYmxlci4gIFRoZSBtYWluCisgICB0cmljayBpcyB0byB1c2UgR0NDJ3MgYF9fYnVpbHRpbl9jb25zdGFudF9wJyBmdW5jdGlvbi4KKworICAgRXZlcnkgZnVuY3Rpb24gWFhYIHdoaWNoIGhhcyBhIGRlZmluZWQgdmVyc2lvbiBpbgorICAgPGJpdHMvc3RyaW5nLmg+IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBzeW1ib2wgX0hBVkVfU1RSSU5HX0FSQ0hfWFhYCisgICB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IHJlZGVmaW5pdGlvbnMuCisKKyAgIFdlIG11c3QgdXNlIGhlcmUgbWFjcm9zIGluc3RlYWQgb2YgaW5saW5lIGZ1bmN0aW9ucyBzaW5jZSB0aGUKKyAgIHRyaWNrIHdvbid0IHdvcmsgd2l0aCB0aGUgbGF0dGVyLiAgKi8KKworI2lmbmRlZiBfX1NUUklOR19JTkxJTkUKKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgIGRlZmluZSBfX1NUUklOR19JTkxJTkUgX19leHRlcm5faW5saW5lCisjIGVuZGlmCisjZW5kaWYKKworI2lmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKy8qIElmIHdlIGNhbiBkbyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIHdlIG11c3Qga25vdyB0aGUgZW5kaWFuZXNzLiAgKi8KKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworIyBpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjICBkZWZpbmUgX19TVFJJTkcyX1NNQUxMX0dFVDE2KHNyYywgaWR4KSBcCisgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSA8PCA4CSAgICAgIFwKKyAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4XSkKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMzIoc3JjLCBpZHgpIFwKKyAgICAgKCgoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgM10gPDwgOCAgICAgIFwKKwl8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDJdKSA8PCA4ICAgXAorICAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMV0pIDw8IDggICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdKQorIyBlbHNlCisjICBkZWZpbmUgX19TVFJJTkcyX1NNQUxMX0dFVDE2KHNyYywgaWR4KSBcCisgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHhdIDw8IDgJICAgICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAxXSkKKyMgIGRlZmluZSBfX1NUUklORzJfU01BTExfR0VUMzIoc3JjLCBpZHgpIFwKKyAgICAgKCgoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4XSA8PCA4CSAgICAgIFwKKwl8ICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHNyYykpW2lkeCArIDFdKSA8PCA4ICAgXAorICAgICAgIHwgKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbaWR4ICsgMl0pIDw8IDggICAgXAorICAgICAgfCAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzcmMpKVtpZHggKyAzXSkKKyMgZW5kaWYKKyNlbHNlCisvKiBUaGVzZSBhcmUgYSBmZXcgdHlwZXMgd2UgbmVlZCBmb3IgdGhlIG9wdGltaXphdGlvbnMgaWYgd2UgY2Fubm90CisgICB1c2UgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3Nlcy4gICovCisjIGRlZmluZSBfX1NUUklORzJfQ09QWV9UWVBFKE4pIFwKKyAgdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIF9fYXJyW05dOyB9CQkJCSAgICAgIFwKKyAgICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIF9fU1RSSU5HMl9DT1BZX0FSUiMjTgorX19TVFJJTkcyX0NPUFlfVFlQRSAoMik7CitfX1NUUklORzJfQ09QWV9UWVBFICgzKTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDQpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoNSk7CitfX1NUUklORzJfQ09QWV9UWVBFICg2KTsKK19fU1RSSU5HMl9DT1BZX1RZUEUgKDcpOworX19TVFJJTkcyX0NPUFlfVFlQRSAoOCk7CisjIHVuZGVmIF9fU1RSSU5HMl9DT1BZX1RZUEUKKyNlbmRpZgorCisvKiBEZXJlZmVyZW5jaW5nIGEgcG9pbnRlciBhcmcgdG8gcnVuIHNpemVvZiBvbiBpdCBmYWlscyBmb3IgdGhlIHZvaWQKKyAgIHBvaW50ZXIgY2FzZSwgc28gd2UgdXNlIHRoaXMgaW5zdGVhZC4KKyAgIE5vdGUgdGhhdCBfX3ggaXMgZXZhbHVhdGVkIHR3aWNlLiAqLworI2RlZmluZSBfX3N0cmluZzJfMWJwdHJfcChfX3gpIFwKKyAgKChzaXplX3QpKGNvbnN0IHZvaWQgKikoKF9feCkgKyAxKSAtIChzaXplX3QpKGNvbnN0IHZvaWQgKikoX194KSA9PSAxKQorCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIEMuICAqLworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX21lbXNldAorIyBpZiAhX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgICBkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAmJiAobikgPD0gMTYJCQkgICAgICBcCisJCSAgPyAoKG4pID09IDEJCQkJCQkgICAgICBcCisJCSAgICAgPyBfX21lbXNldF8xIChzLCBjKQkJCQkgICAgICBcCisJCSAgICAgOiBfX21lbXNldF9nYyAocywgYywgbikpCQkJCSAgICAgIFwKKwkJICA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykgJiYgKGMpID09ICdcMCcJCSAgICAgIFwKKwkJICAgICA/ICh7IHZvaWQgKl9fcyA9IChzKTsgX19iemVybyAoX19zLCBuKTsgX19zOyB9KQkgICAgICBcCisJCSAgICAgOiBtZW1zZXQgKHMsIGMsIG4pKSkpCisKKyMgICBkZWZpbmUgX19tZW1zZXRfMShzLCBjKSAoeyB2b2lkICpfX3MgPSAocyk7CQkJCSAgICAgIFwKKwkJCSAgICAqKChfX3VpbnQ4X3QgKikgX19zKSA9IChfX3VpbnQ4X3QpIGM7IF9fczsgfSkKKworIyAgIGRlZmluZSBfX21lbXNldF9nYyhzLCBjLCBuKSBcCisgICh7IHZvaWQgKl9fcyA9IChzKTsJCQkJCQkJICAgICAgXAorICAgICB1bmlvbiB7CQkJCQkJCQkgICAgICBcCisgICAgICAgdW5zaWduZWQgaW50IF9fdWk7CQkJCQkJICAgICAgXAorICAgICAgIHVuc2lnbmVkIHNob3J0IGludCBfX3VzaTsJCQkJCSAgICAgIFwKKyAgICAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CQkJCQkJICAgICAgXAorICAgICB9ICpfX3UgPSBfX3M7CQkJCQkJCSAgICAgIFwKKyAgICAgX191aW50OF90IF9fYyA9IChfX3VpbnQ4X3QpIChjKTsJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICAgLyogVGhpcyBgc3dpdGNoJyBzdGF0ZW1lbnQgd2lsbCBiZSByZW1vdmVkIGF0IGNvbXBpbGUtdGltZS4gICovCSAgICAgIFwKKyAgICAgc3dpdGNoICgodW5zaWduZWQgaW50KSAobikpCQkJCQkgICAgICBcCisgICAgICAgewkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDExOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSA3OgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdWkgPSBfX2MgKiAweDAxMDEwMTAxOwkJCQkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsJCQkgICAgICBcCisgICAgICAgY2FzZSAzOgkJCQkJCQkJICAgICAgXAorCSBfX3UtPl9fdXNpID0gKHVuc2lnbmVkIHNob3J0IGludCkgX19jICogMHgwMTAxOwkJICAgICAgXAorCSBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNDoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTA6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDY6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191c2kgPSAodW5zaWduZWQgc2hvcnQgaW50KSBfX2MgKiAweDAxMDE7CQkgICAgICBcCisJIGJyZWFrOwkJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorICAgICAgIGNhc2UgMTM6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDk6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDU6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDE6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191YyA9ICh1bnNpZ25lZCBjaGFyKSBfX2M7CQkJCSAgICAgIFwKKwkgYnJlYWs7CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgICAgY2FzZSAxNjoJCQkJCQkJCSAgICAgIFwKKwkgX191LT5fX3VpID0gX19jICogMHgwMTAxMDEwMTsJCQkJCSAgICAgIFwKKwkgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CQkJICAgICAgXAorICAgICAgIGNhc2UgMTI6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDg6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisJIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOwkJCSAgICAgIFwKKyAgICAgICBjYXNlIDQ6CQkJCQkJCQkgICAgICBcCisJIF9fdS0+X191aSA9IF9fYyAqIDB4MDEwMTAxMDE7CQkJCQkgICAgICBcCisgICAgICAgY2FzZSAwOgkJCQkJCQkJICAgICAgXAorCSBicmVhazsJCQkJCQkJCSAgICAgIFwKKyAgICAgICB9CQkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisgICAgIF9fczsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAoYykgPT0gJ1wwJwkJICAgICAgXAorCQkgID8gKHsgdm9pZCAqX19zID0gKHMpOyBfX2J6ZXJvIChfX3MsIG4pOyBfX3M7IH0pCSAgICAgIFwKKwkJICA6IG1lbXNldCAocywgYywgbikpKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogR0NDIDwgMy4wIG9wdGltaXplcyBtZW1zZXQocywgMCwgbikgYnV0IG5vdCBiemVybyhzLCBuKS4KKyAgIFRoZSBvcHRpbWl6YXRpb24gaXMgYnJva2VuIGJlZm9yZSBFR0NTIDEuMS4KKyAgIEdDQyAzLjArIGhhcyBfX2J1aWx0aW5fYnplcm8gYXMgd2VsbCwgYnV0IGF0IGxlYXN0IHRpbGwgR0NDIDMuNAorICAgaWYgaXQgZGVjaWRlcyB0byBjYWxsIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLCBpdCBjYWxscyBtZW1zZXQKKyAgIGFuZCBub3QgYnplcm8uICAqLworIyBpZiBfX0dOVUNfUFJFUkVRICgyLCA5MSkKKyMgIGRlZmluZSBfX2J6ZXJvKHMsIG4pIF9fYnVpbHRpbl9tZW1zZXQgKHMsICdcMCcsIG4pCisjIGVuZGlmCisKKyNlbmRpZgorCisKKy8qIENvcHkgTiBieXRlcyBmcm9tIFNSQyB0byBERVNULCByZXR1cm5pbmcgcG9pbnRlciB0byBieXRlIGZvbGxvd2luZyB0aGUKKyAgIGxhc3QgY29waWVkLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcGNweSB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjICBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfbWVtcGNweQorIyAgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDQpCisjICAgIGRlZmluZSBfX21lbXBjcHkoZGVzdCwgc3JjLCBuKSBfX2J1aWx0aW5fbWVtcGNweSAoZGVzdCwgc3JjLCBuKQorIyAgIGVsaWYgX19HTlVDX1BSRVJFUSAoMywgMCkKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBuIDw9IDgJCQkgICAgICBcCisJCSAgPyBfX2J1aWx0aW5fbWVtY3B5IChkZXN0LCBzcmMsIG4pICsgKG4pCQkgICAgICBcCisJCSAgOiBfX21lbXBjcHkgKGRlc3QsIHNyYywgbikpKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIF9fbWVtcGNweShkZXN0LCBzcmMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzcmMpICYmIF9fYnVpbHRpbl9jb25zdGFudF9wIChuKSAgICAgIFwKKwkJICAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc3JjKSAmJiBuIDw9IDgJCQkgICAgICBcCisJCSAgPyBfX21lbXBjcHlfc21hbGwgKGRlc3QsIF9fbWVtcGNweV9hcmdzIChzcmMpLCBuKQkgICAgICBcCisJCSAgOiBfX21lbXBjcHkgKGRlc3QsIHNyYywgbikpKQorIyAgIGVuZGlmCisvKiBJbiBnbGliYyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiBmcmVxdWVudGx5IGJ1dCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMKKyAgIHdlIGhhdmUgdG8gdXNlIHRoZSBuYW1lIGBfX21lbXBjcHknLiAgKi8KKyMgICBkZWZpbmUgbWVtcGNweShkZXN0LCBzcmMsIG4pIF9fbWVtcGNweSAoZGVzdCwgc3JjLCBuKQorIyAgZW5kaWYKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDApIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgICBpZiBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fbWVtcGNweV9hcmdzKHNyYykgXAorICAgICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwJCSAgICAgIFwKKyAgICAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1wY3B5X3NtYWxsICh2b2lkICosIGNoYXIsIGNoYXIsIGNoYXIsIGNoYXIsCisJCQkJICAgICAgIF9fdWludDE2X3QsIF9fdWludDE2X3QsIF9fdWludDMyX3QsCisJCQkJICAgICAgIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXBjcHlfc21hbGwgKHZvaWQgKl9fZGVzdDEsCisJCSBjaGFyIF9fc3JjMF8xLCBjaGFyIF9fc3JjMl8xLCBjaGFyIF9fc3JjNF8xLCBjaGFyIF9fc3JjNl8xLAorCQkgX191aW50MTZfdCBfX3NyYzBfMiwgX191aW50MTZfdCBfX3NyYzRfMiwKKwkJIF9fdWludDMyX3QgX19zcmMwXzQsIF9fdWludDMyX3QgX19zcmM0XzQsCisJCSBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBfX3VpbnQzMl90IF9fdWk7CisgICAgX191aW50MTZfdCBfX3VzaTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CisgICAgdW5zaWduZWQgY2hhciBfX2M7CisgIH0gKl9fdSA9IF9fZGVzdDE7CisgIHN3aXRjaCAoKHVuc2lnbmVkIGludCkgX19zcmNsZW4pCisgICAgeworICAgIGNhc2UgMToKKyAgICAgIF9fdS0+X19jID0gX19zcmMwXzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fYyA9IF9fc3JjMl8xOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X19jID0gX19zcmM0XzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdXNpID0gX19zcmM0XzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X19jID0gX19zcmM2XzE7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzRfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gKHZvaWQgKikgX191OworfQorIyAgIGVsc2UKKyMgICAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgICBkZWZpbmUgX19tZW1wY3B5X2FyZ3Moc3JjKSBcCisgICAgICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjIpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSB9IH0pLCAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjMpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdIH0gfSksCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10gfSB9KSwgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI1KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0gfSB9KSwJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0gfSB9KSwgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdIH0gfSksCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjgpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs0XSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzVdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs3XSB9IH0pCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgdm9pZCAqX19tZW1wY3B5X3NtYWxsICh2b2lkICosIGNoYXIsIF9fU1RSSU5HMl9DT1BZX0FSUjIsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjMsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjUsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjYsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjgsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgdm9pZCAqCitfX21lbXBjcHlfc21hbGwgKHZvaWQgKl9fZGVzdCwgY2hhciBfX3NyYzEsCisJCSBfX1NUUklORzJfQ09QWV9BUlIyIF9fc3JjMiwgX19TVFJJTkcyX0NPUFlfQVJSMyBfX3NyYzMsCisJCSBfX1NUUklORzJfQ09QWV9BUlI0IF9fc3JjNCwgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NyYzUsCisJCSBfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCSBfX1NUUklORzJfQ09QWV9BUlI4IF9fc3JjOCwgc2l6ZV90IF9fc3JjbGVuKQoreworICB1bmlvbiB7CisgICAgY2hhciBfX2M7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSMiBfX3NjYTI7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSMyBfX3NjYTM7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NjYTQ7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNSBfX3NjYTU7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNiBfX3NjYTY7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NjYTc7CisgICAgX19TVFJJTkcyX0NPUFlfQVJSOCBfX3NjYTg7CisgIH0gKl9fdSA9IF9fZGVzdDsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX2MgPSBfX3NyYzE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgX19zcmNsZW4pOworfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogUmV0dXJuIHBvaW50ZXIgdG8gQyBpbiBTLiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY2hyCitleHRlcm4gdm9pZCAqX19yYXdtZW1jaHIgKGNvbnN0IHZvaWQgKl9fcywgaW50IF9fYyk7CisjIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RyY2hyKHMsIGMpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChjKSAmJiAhX19idWlsdGluX2NvbnN0YW50X3AgKHMpCSAgICAgIFwKKwkJICAmJiAoYykgPT0gJ1wwJwkJCQkJICAgICAgXAorCQkgID8gKGNoYXIgKikgX19yYXdtZW1jaHIgKHMsIGMpCQkJCSAgICAgIFwKKwkJICA6IF9fYnVpbHRpbl9zdHJjaHIgKHMsIGMpKSkKKyMgZWxzZQorIyAgZGVmaW5lIHN0cmNocihzLCBjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykgJiYgKGMpID09ICdcMCcJCSAgICAgIFwKKwkJICA/IChjaGFyICopIF9fcmF3bWVtY2hyIChzLCBjKQkJCQkgICAgICBcCisJCSAgOiBzdHJjaHIgKHMsIGMpKSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworI2lmICghZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjcHkgJiYgIV9fR05VQ19QUkVSRVEgKDMsIDApKSBcCisgICAgfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJjcHkgJiYgIV9fR05VQ19QUkVSRVEgKDMsIDApCisjICBkZWZpbmUgc3RyY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cmNweV9zbWFsbCAoZGVzdCwgX19zdHJjcHlfYXJncyAoc3JjKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHNyYykgKyAxKQkJICAgICAgXAorCQkgICAgIDogKGNoYXIgKikgbWVtY3B5IChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpKQkgICAgICBcCisJCSAgOiBzdHJjcHkgKGRlc3QsIHNyYykpKQorIyBlbmRpZgorCisjIGlmIF9TVFJJTkdfQVJDSF91bmFsaWduZWQKKyMgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgIGRlZmluZSBfX3N0cmNweV9hcmdzKHNyYykgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQxNiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDQpLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMzIgKHNyYywgMCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCA0KQorIyAgZW5kaWYKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cmNweV9zbWFsbCAoY2hhciAqLCBfX3VpbnQxNl90LCBfX3VpbnQxNl90LAorCQkJCSAgICAgIF9fdWludDMyX3QsIF9fdWludDMyX3QsIHNpemVfdCk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cmNweV9zbWFsbCAoY2hhciAqX19kZXN0LAorCQlfX3VpbnQxNl90IF9fc3JjMF8yLCBfX3VpbnQxNl90IF9fc3JjNF8yLAorCQlfX3VpbnQzMl90IF9fc3JjMF80LCBfX3VpbnQzMl90IF9fc3JjNF80LAorCQlzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBfX3VpbnQzMl90IF9fdWk7CisgICAgX191aW50MTZfdCBfX3VzaTsKKyAgICB1bnNpZ25lZCBjaGFyIF9fdWM7CisgIH0gKl9fdSA9ICh2b2lkICopIF9fZGVzdDsKKyAgc3dpdGNoICgodW5zaWduZWQgaW50KSBfX3NyY2xlbikKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzBfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191c2kgPSBfX3NyYzRfMjsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDIpOworICAgICAgX191LT5fX3VjID0gJ1wwJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjMF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgNCk7CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzRfNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIF9fZGVzdDsKK30KKyMgZWxzZQorIyAgaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjICAgZGVmaW5lIF9fc3RyY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlIyKQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAnXDAnIH0gfSksCQkJCQkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjQpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNSkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI2KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICdcMCcgfSB9KSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI3KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI4KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzNdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVs1XSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzZdLCAnXDAnIH0gfSkKKyMgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHJjcHlfc21hbGwgKGNoYXIgKiwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlIzLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI2LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RyY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NyYzQsIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zcmM1LAorCQlfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fZGVzdDsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgU1JDIHRvIERFU1QsIHJldHVybmluZyBwb2ludGVyIHRvIGZpbmFsIE5VTCBieXRlLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgaWYgIWRlZmluZWQgX0hBVkVfU1RSSU5HX0FSQ0hfc3RwY3B5IHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHBjcHkKKyMgICBpZiBfX0dOVUNfUFJFUkVRICgzLCA0KQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBfX2J1aWx0aW5fc3RwY3B5IChkZXN0LCBzcmMpCisjICAgZWxpZiBfX0dOVUNfUFJFUkVRICgzLCAwKQorIyAgICBkZWZpbmUgX19zdHBjcHkoZGVzdCwgc3JjKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKQkJCQkgICAgICBcCisJCSAgPyAoX19zdHJpbmcyXzFicHRyX3AgKHNyYykgJiYgc3RybGVuIChzcmMpICsgMSA8PSA4CSAgICAgIFwKKwkJICAgICA/IF9fYnVpbHRpbl9zdHJjcHkgKGRlc3QsIHNyYykgKyBzdHJsZW4gKHNyYykJICAgICAgXAorCQkgICAgIDogKChjaGFyICopIChfX21lbXBjcHkpIChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpICAgIFwKKwkJCS0gMSkpCQkJCQkJICAgICAgXAorCQkgIDogX19zdHBjcHkgKGRlc3QsIHNyYykpKQorIyAgIGVsc2UKKyMgICAgZGVmaW5lIF9fc3RwY3B5KGRlc3QsIHNyYykgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykJCQkJICAgICAgXAorCQkgID8gKF9fc3RyaW5nMl8xYnB0cl9wIChzcmMpICYmIHN0cmxlbiAoc3JjKSArIDEgPD0gOAkgICAgICBcCisJCSAgICAgPyBfX3N0cGNweV9zbWFsbCAoZGVzdCwgX19zdHBjcHlfYXJncyAoc3JjKSwJICAgICAgXAorCQkJCSAgICAgICBzdHJsZW4gKHNyYykgKyAxKQkJICAgICAgXAorCQkgICAgIDogKChjaGFyICopIChfX21lbXBjcHkpIChkZXN0LCBzcmMsIHN0cmxlbiAoc3JjKSArIDEpICAgIFwKKwkJCS0gMSkpCQkJCQkJICAgICAgXAorCQkgIDogX19zdHBjcHkgKGRlc3QsIHNyYykpKQorIyAgIGVuZGlmCisvKiBJbiBnbGliYyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiBmcmVxdWVudGx5IGJ1dCBmb3IgbmFtZXNwYWNlIHJlYXNvbnMKKyAgIHdlIGhhdmUgdG8gdXNlIHRoZSBuYW1lIGBfX3N0cGNweScuICAqLworIyAgIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweSAoZGVzdCwgc3JjKQorIyAgZW5kaWYKKworIyAgaWYgIV9fR05VQ19QUkVSRVEgKDMsIDApIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgICBpZiBfU1RSSU5HX0FSQ0hfdW5hbGlnbmVkCisjICAgIGlmbmRlZiBfRk9SQ0VfSU5MSU5FUworIyAgICAgZGVmaW5lIF9fc3RwY3B5X2FyZ3Moc3JjKSBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDE2IChzcmMsIDApLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyBfX1NUUklORzJfU01BTExfR0VUMTYgKHNyYywgNCksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fIF9fU1RSSU5HMl9TTUFMTF9HRVQzMiAoc3JjLCAwKSwJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gX19TVFJJTkcyX1NNQUxMX0dFVDMyIChzcmMsIDQpCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfc21hbGwgKGNoYXIgKiwgX191aW50MTZfdCwgX191aW50MTZfdCwKKwkJCQkgICAgICBfX3VpbnQzMl90LCBfX3VpbnQzMl90LCBzaXplX3QpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHBjcHlfc21hbGwgKGNoYXIgKl9fZGVzdCwKKwkJX191aW50MTZfdCBfX3NyYzBfMiwgX191aW50MTZfdCBfX3NyYzRfMiwKKwkJX191aW50MzJfdCBfX3NyYzBfNCwgX191aW50MzJfdCBfX3NyYzRfNCwKKwkJc2l6ZV90IF9fc3JjbGVuKQoreworICB1bmlvbiB7CisgICAgdW5zaWduZWQgaW50IF9fdWk7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IF9fdXNpOworICAgIHVuc2lnbmVkIGNoYXIgX191YzsKKyAgICBjaGFyIF9fYzsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgX191LT5fX3VzaSA9IF9fc3JjMF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBfX3UtPl9fdXNpID0gX19zcmMwXzI7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyAyKTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191YyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBfX3UtPl9fdWkgPSBfX3NyYzBfNDsKKyAgICAgIF9fdSA9IF9fZXh0ZW5zaW9uX18gKCh2b2lkICopIF9fdSArIDQpOworICAgICAgX191LT5fX3VzaSA9IF9fc3JjNF8yOworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMik7CisgICAgICBfX3UtPl9fdWMgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgX191LT5fX3VpID0gX19zcmMwXzQ7CisgICAgICBfX3UgPSBfX2V4dGVuc2lvbl9fICgodm9pZCAqKSBfX3UgKyA0KTsKKyAgICAgIF9fdS0+X191aSA9IF9fc3JjNF80OworICAgICAgX191ID0gX19leHRlbnNpb25fXyAoKHZvaWQgKikgX191ICsgMyk7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAmX191LT5fX2M7Cit9CisjICAgZWxzZQorIyAgICBpZm5kZWYgX0ZPUkNFX0lOTElORVMKKyMgICAgIGRlZmluZSBfX3N0cGNweV9hcmdzKHNyYykgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSMikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjMpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgJ1wwJyB9IH0pLAkJCQkJCQkgICAgICBcCisgICAgIF9fZXh0ZW5zaW9uX18gKChfX1NUUklORzJfQ09QWV9BUlI0KQkJCQkgICAgICBcCisgICAgICB7IHsgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzBdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVsyXSwgJ1wwJyB9IH0pLAkJCSAgICAgIFwKKyAgICAgX19leHRlbnNpb25fXyAoKF9fU1RSSU5HMl9DT1BZX0FSUjUpCQkJCSAgICAgIFwKKyAgICAgIHsgeyAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMF0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVsxXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzJdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbM10sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNikJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAnXDAnIH0gfSksCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSNykJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICdcMCcgfSB9KSwJCQkJCQkJICAgICAgXAorICAgICBfX2V4dGVuc2lvbl9fICgoX19TVFJJTkcyX0NPUFlfQVJSOCkJCQkJICAgICAgXAorICAgICAgeyB7ICgoX19jb25zdCBjaGFyICopIChzcmMpKVswXSwgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzFdLAkgICAgICBcCisJICAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbMl0sICgoX19jb25zdCBjaGFyICopIChzcmMpKVszXSwJICAgICAgXAorCSAgKChfX2NvbnN0IGNoYXIgKikgKHNyYykpWzRdLCAoKF9fY29uc3QgY2hhciAqKSAoc3JjKSlbNV0sCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChzcmMpKVs2XSwgJ1wwJyB9IH0pCisjICAgIGVuZGlmCitfX1NUUklOR19JTkxJTkUgY2hhciAqX19zdHBjcHlfc21hbGwgKGNoYXIgKiwgX19TVFJJTkcyX0NPUFlfQVJSMiwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlIzLAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjQsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSNSwKKwkJCQkgICAgICBfX1NUUklORzJfQ09QWV9BUlI2LAorCQkJCSAgICAgIF9fU1RSSU5HMl9DT1BZX0FSUjcsCisJCQkJICAgICAgX19TVFJJTkcyX0NPUFlfQVJSOCwgc2l6ZV90KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3RwY3B5X3NtYWxsIChjaGFyICpfX2Rlc3QsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjIgX19zcmMyLCBfX1NUUklORzJfQ09QWV9BUlIzIF9fc3JjMywKKwkJX19TVFJJTkcyX0NPUFlfQVJSNCBfX3NyYzQsIF9fU1RSSU5HMl9DT1BZX0FSUjUgX19zcmM1LAorCQlfX1NUUklORzJfQ09QWV9BUlI2IF9fc3JjNiwgX19TVFJJTkcyX0NPUFlfQVJSNyBfX3NyYzcsCisJCV9fU1RSSU5HMl9DT1BZX0FSUjggX19zcmM4LCBzaXplX3QgX19zcmNsZW4pCit7CisgIHVuaW9uIHsKKyAgICBjaGFyIF9fYzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIyIF9fc2NhMjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlIzIF9fc2NhMzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI0IF9fc2NhNDsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI1IF9fc2NhNTsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI2IF9fc2NhNjsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI3IF9fc2NhNzsKKyAgICBfX1NUUklORzJfQ09QWV9BUlI4IF9fc2NhODsKKyAgfSAqX191ID0gKHZvaWQgKikgX19kZXN0OworICBzd2l0Y2ggKCh1bnNpZ25lZCBpbnQpIF9fc3JjbGVuKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICBfX3UtPl9fYyA9ICdcMCc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2EyID0gX19zcmMyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhMyA9IF9fc3JjMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTQgPSBfX3NyYzQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E1ID0gX19zcmM1OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgX19leHRlbnNpb25fXyBfX3UtPl9fc2NhNiA9IF9fc3JjNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgIF9fZXh0ZW5zaW9uX18gX191LT5fX3NjYTcgPSBfX3NyYzc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICBfX2V4dGVuc2lvbl9fIF9fdS0+X19zY2E4ID0gX19zcmM4OworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIF9fZGVzdCArIF9fc3JjbGVuIC0gMTsKK30KKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIENvcHkgbm8gbW9yZSB0aGFuIE4gY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVC4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jcHkKKyMgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgIGRlZmluZSBzdHJuY3B5KGRlc3QsIHNyYywgbikgX19idWlsdGluX3N0cm5jcHkgKGRlc3QsIHNyYywgbikKKyMgZWxzZQorIyAgZGVmaW5lIHN0cm5jcHkoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc3JjKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAobikgICAgICBcCisJCSAgPyAoc3RybGVuIChzcmMpICsgMSA+PSAoKHNpemVfdCkgKG4pKQkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIG1lbWNweSAoZGVzdCwgc3JjLCBuKQkJCSAgICAgIFwKKwkJICAgICA6IHN0cm5jcHkgKGRlc3QsIHNyYywgbikpCQkJCSAgICAgIFwKKwkJICA6IHN0cm5jcHkgKGRlc3QsIHNyYywgbikpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQXBwZW5kIG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgZnJvbSBTUkMgb250byBERVNULiAgKi8KKyNpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RybmNhdAorIyBpZmRlZiBfVVNFX1NUUklOR19BUkNIX3N0cmNocgorIyAgZGVmaW5lIHN0cm5jYXQoZGVzdCwgc3JjLCBuKSBcCisgIChfX2V4dGVuc2lvbl9fICh7IGNoYXIgKl9fZGVzdCA9IChkZXN0KTsJCQkJICAgICAgXAorCQkgICAgX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgIFwKKwkJICAgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgICAgPyBzdHJjYXQgKF9fZGVzdCwgc3JjKQkJCQkgICAgICBcCisJCSAgICAgICA6ICgqKChjaGFyICopIF9fbWVtcGNweSAoc3RyY2hyIChfX2Rlc3QsICdcMCcpLAkgICAgICBcCisJCQkJCQlzcmMsIG4pKSA9ICdcMCcsIF9fZGVzdCkpICAgICBcCisJCSAgICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbik7IH0pKQorIyBlbGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICBkZWZpbmUgc3RybmNhdChkZXN0LCBzcmMsIG4pIF9fYnVpbHRpbl9zdHJuY2F0IChkZXN0LCBzcmMsIG4pCisjIGVsc2UKKyMgIGRlZmluZSBzdHJuY2F0KGRlc3QsIHNyYywgbikgXAorICAoX19leHRlbnNpb25fXyAoX19idWlsdGluX2NvbnN0YW50X3AgKHNyYykgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKG4pICAgICAgXAorCQkgID8gKHN0cmxlbiAoc3JjKSA8ICgoc2l6ZV90KSAobikpCQkJICAgICAgXAorCQkgICAgID8gc3RyY2F0IChkZXN0LCBzcmMpCQkJCSAgICAgIFwKKwkJICAgICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbikpCQkJCSAgICAgIFwKKwkJICA6IHN0cm5jYXQgKGRlc3QsIHNyYywgbikpKQorIyBlbmRpZgorI2VuZGlmCisKKworLyogQ29tcGFyZSBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cmNtcAorIyBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgZGVmaW5lIHN0cmNtcChzMSwgczIpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBzaXplX3QgX19zMV9sZW4sIF9fczJfbGVuOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19idWlsdGluX2NvbnN0YW50X3AgKHMyKQkJICAgICAgXAorICAgICAgJiYgKF9fczFfbGVuID0gc3RybGVuIChzMSksIF9fczJfbGVuID0gc3RybGVuIChzMiksCQkgICAgICBcCisJICAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMSkgfHwgX19zMV9sZW4gPj0gNCkJCQkgICAgICBcCisJICAmJiAoIV9fc3RyaW5nMl8xYnB0cl9wIChzMikgfHwgX19zMl9sZW4gPj0gNCkpCQkgICAgICBcCisgICAgICA/IF9fYnVpbHRpbl9zdHJjbXAgKHMxLCBzMikJCQkJCSAgICAgIFwKKyAgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkJICAgICAgXAorCSAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMV9sZW4gPCA0KQkJCSAgICAgIFwKKwkgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgID8gX19idWlsdGluX3N0cmNtcCAoczEsIHMyKQkJCQkJICAgICAgXAorCSAgICA6IF9fc3RyY21wX2NnIChzMSwgczIsIF9fczFfbGVuKSkJCQkJICAgICAgXAorCSA6IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMikJCSAgICAgIFwKKwkgICAgJiYgKF9fczJfbGVuID0gc3RybGVuIChzMiksIF9fczJfbGVuIDwgNCkJCQkgICAgICBcCisJICAgID8gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkgICAgICBcCisJICAgICAgID8gX19idWlsdGluX3N0cmNtcCAoczEsIHMyKQkJCQkgICAgICBcCisJICAgICAgIDogX19zdHJjbXBfZ2MgKHMxLCBzMiwgX19zMl9sZW4pKQkJCSAgICAgIFwKKwkgICAgOiBfX2J1aWx0aW5fc3RyY21wIChzMSwgczIpKSkpOyB9KQorIyBlbHNlCisjICBkZWZpbmUgc3RyY21wKHMxLCBzMikgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IHNpemVfdCBfX3MxX2xlbiwgX19zMl9sZW47CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHMxKSAmJiBfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkgICAgICBcCisgICAgICAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMl9sZW4gPSBzdHJsZW4gKHMyKSwJCSAgICAgIFwKKwkgICghX19zdHJpbmcyXzFicHRyX3AgKHMxKSB8fCBfX3MxX2xlbiA+PSA0KQkJCSAgICAgIFwKKwkgICYmICghX19zdHJpbmcyXzFicHRyX3AgKHMyKSB8fCBfX3MyX2xlbiA+PSA0KSkJCSAgICAgIFwKKyAgICAgID8gbWVtY21wICgoX19jb25zdCBjaGFyICopIChzMSksIChfX2NvbnN0IGNoYXIgKikgKHMyKSwJCSAgICAgIFwKKwkJKF9fczFfbGVuIDwgX19zMl9sZW4gPyBfX3MxX2xlbiA6IF9fczJfbGVuKSArIDEpCSAgICAgIFwKKyAgICAgIDogKF9fYnVpbHRpbl9jb25zdGFudF9wIChzMSkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMxKQkJICAgICAgXAorCSAmJiAoX19zMV9sZW4gPSBzdHJsZW4gKHMxKSwgX19zMV9sZW4gPCA0KQkJCSAgICAgIFwKKwkgPyAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgID8gX19zdHJjbXBfY2MgKHMxLCBzMiwgX19zMV9sZW4pCQkJCSAgICAgIFwKKwkgICAgOiBfX3N0cmNtcF9jZyAoczEsIHMyLCBfX3MxX2xlbikpCQkJCSAgICAgIFwKKwkgOiAoX19idWlsdGluX2NvbnN0YW50X3AgKHMyKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoczIpCQkgICAgICBcCisJICAgICYmIChfX3MyX2xlbiA9IHN0cmxlbiAoczIpLCBfX3MyX2xlbiA8IDQpCQkJICAgICAgXAorCSAgICA/IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChzMSkJICAgICAgXAorCSAgICAgICA/IF9fc3RyY21wX2NjIChzMSwgczIsIF9fczJfbGVuKQkJCQkgICAgICBcCisJICAgICAgIDogX19zdHJjbXBfZ2MgKHMxLCBzMiwgX19zMl9sZW4pKQkJCSAgICAgIFwKKwkgICAgOiBzdHJjbXAgKHMxLCBzMikpKSk7IH0pCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fc3RyY21wX2NjKHMxLCBzMiwgbCkgXAorICAoX19leHRlbnNpb25fXyAoeyByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMSkpWzBdICAgXAorCQkgICAgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopKHMyKSlbMF0pO1wKKwkJICAgIGlmIChsID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCQkgICAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgICAgXAorCQkJX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgICAgIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMV0JCSAgICAgIFwKKwkJCQkgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMV0pOwkgICAgICBcCisJCQlpZiAobCA+IDEgJiYgX19yZXN1bHQgPT0gMCkJCQkgICAgICBcCisJCQkgIHsJCQkJCQkgICAgICBcCisJCQkgICAgX19yZXN1bHQgPQkJCQkJICAgICAgXAorCQkJICAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJKF9fY29uc3QgY2hhciAqKSAoczEpKVsyXQkJICAgICAgXAorCQkJICAgICAgIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJCSAgICAgIFwKKwkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMl0pOwkJICAgICAgXAorCQkJICAgIGlmIChsID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJCSAgICAgIF9fcmVzdWx0ID0JCQkJICAgICAgXAorCQkJCSgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgKF9fY29uc3QgY2hhciAqKSAoczEpKVszXQkJICAgICAgXAorCQkJCSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbM10pOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKworIyBkZWZpbmUgX19zdHJjbXBfY2coczEsIHMyLCBsMSkgXAorICAoX19leHRlbnNpb25fXyAoeyBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKl9fczIgPQkJCSAgICAgIFwKKwkJICAgICAgKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKSAoX19jb25zdCBjaGFyICopIChzMik7CSAgICAgIFwKKwkJICAgIHJlZ2lzdGVyIGludCBfX3Jlc3VsdCA9CQkJCSAgICAgIFwKKwkJICAgICAgKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMF0gICBcCisJCSAgICAgICAtIF9fczJbMF0pOwkJCQkJICAgICAgXAorCQkgICAgaWYgKGwxID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9ICgoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAgICAgKF9fY29uc3QgY2hhciAqKSAoczEpKVsxXSAtIF9fczJbMV0pOyAgICBcCisJCQlpZiAobDEgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0gKCgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCSAgICAgIFwKKwkJCQkJIChfX2NvbnN0IGNoYXIgKikgKHMxKSlbMl0gLSBfX3MyWzJdKTtcCisJCQkgICAgaWYgKGwxID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPSAoKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCQkgIChfX2NvbnN0IGNoYXIgKikgIChzMSkpWzNdCSAgICAgIFwKKwkJCQkJICAtIF9fczJbM10pOwkJCSAgICAgIFwKKwkJCSAgfQkJCQkJCSAgICAgIFwKKwkJICAgICAgfQkJCQkJCQkgICAgICBcCisJCSAgICBfX3Jlc3VsdDsgfSkpCisKKyMgZGVmaW5lIF9fc3RyY21wX2djKHMxLCBzMiwgbDIpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKHsgX19jb25zdCB1bnNpZ25lZCBjaGFyICpfX3MxID0JCQkgICAgICBcCisJCSAgICAgIChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikgKF9fY29uc3QgY2hhciAqKSAoczEpOwkgICAgICBcCisJCSAgICByZWdpc3RlciBpbnQgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCSAgICAgIF9fczFbMF0gLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkJICAgICAgXAorCQkJCSAoX19jb25zdCBjaGFyICopIChzMikpWzBdOwkJICAgICAgXAorCQkgICAgaWYgKGwyID4gMCAmJiBfX3Jlc3VsdCA9PSAwKQkJCSAgICAgIFwKKwkJICAgICAgewkJCQkJCQkgICAgICBcCisJCQlfX3Jlc3VsdCA9IChfX3MxWzFdCQkJCSAgICAgIFwKKwkJCQkgICAgLSAoKF9fY29uc3QgdW5zaWduZWQgY2hhciAqKQkgICAgICBcCisJCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMV0pOwkgICAgICBcCisJCQlpZiAobDIgPiAxICYmIF9fcmVzdWx0ID09IDApCQkJICAgICAgXAorCQkJICB7CQkJCQkJICAgICAgXAorCQkJICAgIF9fcmVzdWx0ID0JCQkJCSAgICAgIFwKKwkJCSAgICAgIChfX3MxWzJdIC0gKChfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKikJICAgICAgXAorCQkJCQkgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbMl0pOwkgICAgICBcCisJCQkgICAgaWYgKGwyID4gMiAmJiBfX3Jlc3VsdCA9PSAwKQkJICAgICAgXAorCQkJICAgICAgX19yZXN1bHQgPQkJCQkgICAgICBcCisJCQkJKF9fczFbM10JCQkJICAgICAgXAorCQkJCSAtICgoX19jb25zdCB1bnNpZ25lZCBjaGFyICopCQkgICAgICBcCisJCQkJICAgIChfX2NvbnN0IGNoYXIgKikgKHMyKSlbM10pOwkJICAgICAgXAorCQkJICB9CQkJCQkJICAgICAgXAorCQkgICAgICB9CQkJCQkJCSAgICAgIFwKKwkJICAgIF9fcmVzdWx0OyB9KSkKKyNlbmRpZgorCisKKy8qIENvbXBhcmUgTiBjaGFyYWN0ZXJzIG9mIFMxIGFuZCBTMi4gICovCisjaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cm5jbXAKKyMgZGVmaW5lIHN0cm5jbXAoczEsIHMyLCBuKQkJCQkJCSAgICAgIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuKQkJCQkgICAgICBcCisJCSAgJiYgKChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczEpCQkJICAgICAgXAorCQkgICAgICAgJiYgc3RybGVuIChzMSkgPCAoKHNpemVfdCkgKG4pKSkJCQkgICAgICBcCisJCSAgICAgIHx8IChfX2J1aWx0aW5fY29uc3RhbnRfcCAoczIpCQkJICAgICAgXAorCQkJICAmJiBzdHJsZW4gKHMyKSA8ICgoc2l6ZV90KSAobikpKSkJCSAgICAgIFwKKwkJICA/IHN0cmNtcCAoczEsIHMyKSA6IHN0cm5jbXAgKHMxLCBzMiwgbikpKQorI2VuZGlmCisKKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBTIHdoaWNoCisgICBjb25zaXN0cyBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIG5vdCBpbiBSRUpFQ1QuICAqLworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmNzcG4gfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyY3NwbgorIyAgaWYgX19HTlVDX1BSRVJFUSAoMywgMikKKyMgICBkZWZpbmUgc3RyY3NwbihzLCByZWplY3QpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fcjAsIF9fcjEsIF9fcjI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKHJlamVjdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKHJlamVjdCkJICAgICAgXAorICAgICAgPyAoKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykpCQkgICAgICBcCisJID8gX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkJCQkJICAgICAgXAorCSA6ICgoX19yMCA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSwgX19yMCA9PSAnXDAnKQkgICAgICBcCisJICAgID8gc3RybGVuIChzKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fcjEgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMV0sIF9fcjEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3RyY3Nwbl9jMSAocywgX19yMCkJCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKF9fcjIgPSAoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbMl0sIF9fcjIgPT0gJ1wwJykJICAgICAgXAorCQkgID8gX19zdHJjc3BuX2MyIChzLCBfX3IwLCBfX3IxKQkJCSAgICAgIFwKKwkJICA6ICgoKF9fY29uc3QgY2hhciAqKSAocmVqZWN0KSlbM10gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJjc3BuX2MzIChzLCBfX3IwLCBfX3IxLCBfX3IyKQkJICAgICAgXAorCQkgICAgIDogX19idWlsdGluX3N0cmNzcG4gKHMsIHJlamVjdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3RyY3NwbiAocywgcmVqZWN0KSk7IH0pCisjICBlbHNlCisjICAgZGVmaW5lIHN0cmNzcG4ocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgID8gKChfX3IwID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdLCBfX3IwID09ICdcMCcpCQkgICAgICBcCisJID8gc3RybGVuIChzKQkJCQkJCQkgICAgICBcCisJIDogKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLCBfX3IxID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBfX3N0cmNzcG5fYzEgKHMsIF9fcjApCQkJCQkgICAgICBcCisJICAgIDogKChfX3IyID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzJdLCBfX3IyID09ICdcMCcpCSAgICAgIFwKKwkgICAgICAgPyBfX3N0cmNzcG5fYzIgKHMsIF9fcjAsIF9fcjEpCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3RyY3Nwbl9jMyAocywgX19yMCwgX19yMSwgX19yMikJCQkgICAgICBcCisJCSAgOiBzdHJjc3BuIChzLCByZWplY3QpKSkpKQkJCQkgICAgICBcCisgICAgICA6IHN0cmNzcG4gKHMsIHJlamVjdCkpOyB9KQorIyAgZW5kaWYKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cmNzcG5fYzEgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19yZWplY3QpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJjc3BuX2MxIChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fcmVqZWN0KQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICB3aGlsZSAoX19zW19fcmVzdWx0XSAhPSAnXDAnICYmIF9fc1tfX3Jlc3VsdF0gIT0gX19yZWplY3QpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsCisJCQkJICAgICBpbnQgX19yZWplY3QyKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIpCit7CisgIHJlZ2lzdGVyIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgIHdoaWxlIChfX3NbX19yZXN1bHRdICE9ICdcMCcgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDEKKwkgJiYgX19zW19fcmVzdWx0XSAhPSBfX3JlamVjdDIpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorCitfX1NUUklOR19JTkxJTkUgc2l6ZV90IF9fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsCisJCQkJICAgICBpbnQgX19yZWplY3QyLCBpbnQgX19yZWplY3QzKTsKK19fU1RSSU5HX0lOTElORSBzaXplX3QKK19fc3RyY3Nwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX3JlamVjdDEsIGludCBfX3JlamVjdDIsCisJICAgICAgaW50IF9fcmVqZWN0MykKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gIT0gJ1wwJyAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MQorCSAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MiAmJiBfX3NbX19yZXN1bHRdICE9IF9fcmVqZWN0MykKKyAgICArK19fcmVzdWx0OworICByZXR1cm4gX19yZXN1bHQ7Cit9CisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgaW4gQUNDRVBULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzcG4gfHwgZGVmaW5lZCBfRk9SQ0VfSU5MSU5FUworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3Ryc3BuCisjICBpZiBfX0dOVUNfUFJFUkVRICgzLCAyKQorIyAgIGRlZmluZSBzdHJzcG4ocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJzcG4gKHMsIGFjY2VwdCkJCQkJCSAgICAgIFwKKwkgOiAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMF0sIF9fYTAgPT0gJ1wwJykJICAgICAgXAorCSAgICA/ICgodm9pZCkgKHMpLCAwKQkJCQkJCSAgICAgIFwKKwkgICAgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICAgICA/IF9fc3Ryc3BuX2MxIChzLCBfX2EwKQkJCQkJICAgICAgXAorCSAgICAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJCSAgPyBfX3N0cnNwbl9jMiAocywgX19hMCwgX19hMSkJCQkJICAgICAgXAorCQkgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgICAgPyBfX3N0cnNwbl9jMyAocywgX19hMCwgX19hMSwgX19hMikJCSAgICAgIFwKKwkJICAgICA6IF9fYnVpbHRpbl9zdHJzcG4gKHMsIGFjY2VwdCkpKSkpKQkJICAgICAgXAorICAgICAgOiBfX2J1aWx0aW5fc3Ryc3BuIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgc3Ryc3BuKHMsIGFjY2VwdCkgXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQkgICAgICBcCisgICh7IGNoYXIgX19hMCwgX19hMSwgX19hMjsJCQkJCQkgICAgICBcCisgICAgIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYWNjZXB0KSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoYWNjZXB0KQkgICAgICBcCisgICAgICA/ICgoX19hMCA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVswXSwgX19hMCA9PSAnXDAnKQkJICAgICAgXAorCSA/ICgodm9pZCkgKHMpLCAwKQkJCQkJCSAgICAgIFwKKwkgOiAoKF9fYTEgPSAoKF9fY29uc3QgY2hhciAqKSAoYWNjZXB0KSlbMV0sIF9fYTEgPT0gJ1wwJykJICAgICAgXAorCSAgICA/IF9fc3Ryc3BuX2MxIChzLCBfX2EwKQkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJzcG5fYzIgKHMsIF9fYTAsIF9fYTEpCQkJCSAgICAgIFwKKwkgICAgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzNdID09ICdcMCcJCSAgICAgIFwKKwkJICA/IF9fc3Ryc3BuX2MzIChzLCBfX2EwLCBfX2ExLCBfX2EyKQkJCSAgICAgIFwKKwkJICA6IHN0cnNwbiAocywgYWNjZXB0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJzcG4gKHMsIGFjY2VwdCkpOyB9KQorIyAgZW5kaWYKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCk7CitfX1NUUklOR19JTkxJTkUgc2l6ZV90CitfX3N0cnNwbl9jMSAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdCkKK3sKKyAgcmVnaXN0ZXIgc2l6ZV90IF9fcmVzdWx0ID0gMDsKKyAgLyogUGxlYXNlIG5vdGUgdGhhdCBfX2FjY2VwdCBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlIChfX3NbX19yZXN1bHRdID09IF9fYWNjZXB0KQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMiAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdDEsCisJCQkJICAgIGludCBfX2FjY2VwdDIpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSBhbmQgX19hY2NlcHQyIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQxIHx8IF9fc1tfX3Jlc3VsdF0gPT0gX19hY2NlcHQyKQorICAgICsrX19yZXN1bHQ7CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKworX19TVFJJTkdfSU5MSU5FIHNpemVfdCBfX3N0cnNwbl9jMyAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2FjY2VwdDEsCisJCQkJICAgIGludCBfX2FjY2VwdDIsIGludCBfX2FjY2VwdDMpOworX19TVFJJTkdfSU5MSU5FIHNpemVfdAorX19zdHJzcG5fYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyLCBpbnQgX19hY2NlcHQzKQoreworICByZWdpc3RlciBzaXplX3QgX19yZXN1bHQgPSAwOworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSB0byBfX2FjY2VwdDMgbmV2ZXIgY2FuIGJlICdcMCcuICAqLworICB3aGlsZSAoX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDEgfHwgX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDIKKwkgfHwgX19zW19fcmVzdWx0XSA9PSBfX2FjY2VwdDMpCisgICAgKytfX3Jlc3VsdDsKKyAgcmV0dXJuIF9fcmVzdWx0OworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJwYnJrIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnBicmsKKyMgIGlmIF9fR05VQ19QUkVSRVEgKDMsIDIpCisjICAgZGVmaW5lIHN0cnBicmsocywgYWNjZXB0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX2EwLCBfX2ExLCBfX2EyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChhY2NlcHQpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChhY2NlcHQpCSAgICAgIFwKKyAgICAgID8gKChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpKQkJICAgICAgXAorCSA/IF9fYnVpbHRpbl9zdHJwYnJrIChzLCBhY2NlcHQpCQkJCSAgICAgIFwKKwkgOiAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyAoKHZvaWQpIChzKSwgKGNoYXIgKikgTlVMTCkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMSA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsxXSwgX19hMSA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19idWlsdGluX3N0cmNociAocywgX19hMCkJCQkJICAgICAgXAorCSAgICAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJCSAgPyBfX3N0cnBicmtfYzIgKHMsIF9fYTAsIF9fYTEpCQkJICAgICAgXAorCQkgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgICAgPyBfX3N0cnBicmtfYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkgICAgICBcCisJCSAgICAgOiBfX2J1aWx0aW5fc3RycGJyayAocywgYWNjZXB0KSkpKSkpCQkgICAgICBcCisgICAgICA6IF9fYnVpbHRpbl9zdHJwYnJrIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgc3RycGJyayhzLCBhY2NlcHQpIFwKKyAgX19leHRlbnNpb25fXwkJCQkJCQkJICAgICAgXAorICAoeyBjaGFyIF9fYTAsIF9fYTEsIF9fYTI7CQkJCQkJICAgICAgXAorICAgICAoX19idWlsdGluX2NvbnN0YW50X3AgKGFjY2VwdCkgJiYgX19zdHJpbmcyXzFicHRyX3AgKGFjY2VwdCkJICAgICAgXAorICAgICAgPyAoKF9fYTAgPSAoKF9fY29uc3QgY2hhciAgKikgKGFjY2VwdCkpWzBdLCBfX2EwID09ICdcMCcpCQkgICAgICBcCisJID8gKCh2b2lkKSAocyksIChjaGFyICopIE5VTEwpCQkJCQkgICAgICBcCisJIDogKChfX2ExID0gKChfX2NvbnN0IGNoYXIgKikgKGFjY2VwdCkpWzFdLCBfX2ExID09ICdcMCcpCSAgICAgIFwKKwkgICAgPyBzdHJjaHIgKHMsIF9fYTApCQkJCQkJICAgICAgXAorCSAgICA6ICgoX19hMiA9ICgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVsyXSwgX19hMiA9PSAnXDAnKQkgICAgICBcCisJICAgICAgID8gX19zdHJwYnJrX2MyIChzLCBfX2EwLCBfX2ExKQkJCQkgICAgICBcCisJICAgICAgIDogKCgoX19jb25zdCBjaGFyICopIChhY2NlcHQpKVszXSA9PSAnXDAnCQkgICAgICBcCisJCSAgPyBfX3N0cnBicmtfYzMgKHMsIF9fYTAsIF9fYTEsIF9fYTIpCQkJICAgICAgXAorCQkgIDogc3RycGJyayAocywgYWNjZXB0KSkpKSkJCQkJICAgICAgXAorICAgICAgOiBzdHJwYnJrIChzLCBhY2NlcHQpKTsgfSkKKyMgIGVuZGlmCisjIGVuZGlmCisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICAgaW50IF9fYWNjZXB0Mik7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfYzIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyKQoreworICAvKiBQbGVhc2Ugbm90ZSB0aGF0IF9fYWNjZXB0MSBhbmQgX19hY2NlcHQyIG5ldmVyIGNhbiBiZSAnXDAnLiAgKi8KKyAgd2hpbGUgKCpfX3MgIT0gJ1wwJyAmJiAqX19zICE9IF9fYWNjZXB0MSAmJiAqX19zICE9IF9fYWNjZXB0MikKKyAgICArK19fczsKKyAgcmV0dXJuICpfX3MgPT0gJ1wwJyA/IE5VTEwgOiAoY2hhciAqKSAoc2l6ZV90KSBfX3M7Cit9CisKK19fU1RSSU5HX0lOTElORSBjaGFyICpfX3N0cnBicmtfYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLAorCQkJCSAgICAgaW50IF9fYWNjZXB0MiwgaW50IF9fYWNjZXB0Myk7CitfX1NUUklOR19JTkxJTkUgY2hhciAqCitfX3N0cnBicmtfYzMgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19hY2NlcHQxLCBpbnQgX19hY2NlcHQyLAorCSAgICAgIGludCBfX2FjY2VwdDMpCit7CisgIC8qIFBsZWFzZSBub3RlIHRoYXQgX19hY2NlcHQxIHRvIF9fYWNjZXB0MyBuZXZlciBjYW4gYmUgJ1wwJy4gICovCisgIHdoaWxlICgqX19zICE9ICdcMCcgJiYgKl9fcyAhPSBfX2FjY2VwdDEgJiYgKl9fcyAhPSBfX2FjY2VwdDIKKwkgJiYgKl9fcyAhPSBfX2FjY2VwdDMpCisgICAgKytfX3M7CisgIHJldHVybiAqX19zID09ICdcMCcgPyBOVUxMIDogKGNoYXIgKikgKHNpemVfdCkgX19zOworfQorI2VuZGlmCisKKworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suICBOZXdlciBnY2MgdmVyc2lvbnMKKyAgIGRvIHRoaXMgaXRzZWxmLiAgKi8KKyNpZiAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzdHIgJiYgIV9fR05VQ19QUkVSRVEgKDIsIDk3KQorIyBkZWZpbmUgc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChuZWVkbGUpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChuZWVkbGUpIFwKKwkJICA/ICgoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMF0gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gKGNoYXIgKikgKHNpemVfdCkgKGhheXN0YWNrKQkJCSAgICAgIFwKKwkJICAgICA6ICgoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMV0gPT0gJ1wwJwkJICAgICAgXAorCQkJPyBzdHJjaHIgKGhheXN0YWNrLAkJCQkgICAgICBcCisJCQkJICAoKF9fY29uc3QgY2hhciAqKSAobmVlZGxlKSlbMF0pIAkgICAgICBcCisJCQk6IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSkpKQkJCSAgICAgIFwKKwkJICA6IHN0cnN0ciAoaGF5c3RhY2ssIG5lZWRsZSkpKQorI2VuZGlmCisKKworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cnRva19yIHx8IGRlZmluZWQgX0ZPUkNFX0lOTElORVMKKyMgaWZuZGVmIF9IQVZFX1NUUklOR19BUkNIX3N0cnRva19yCisjICBkZWZpbmUgX19zdHJ0b2tfcihzLCBzZXAsIG5leHRwKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoc2VwKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAoc2VwKQkgICAgICBcCisJCSAgPyAoKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzBdICE9ICdcMCcJCSAgICAgIFwKKwkJICAgICAmJiAoKF9fY29uc3QgY2hhciAqKSAoc2VwKSlbMV0gPT0gJ1wwJwkJICAgICAgXAorCQkgICAgID8gX19zdHJ0b2tfcl8xYyAocywgKChfX2NvbnN0IGNoYXIgKikgKHNlcCkpWzBdLCBuZXh0cCkgIFwKKwkJICAgICA6IF9fc3RydG9rX3IgKHMsIHNlcCwgbmV4dHApKQkJCSAgICAgIFwKKwkJICA6IF9fc3RydG9rX3IgKHMsIHNlcCwgbmV4dHApKSkKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3RydG9rX3JfMWMgKGNoYXIgKl9fcywgY2hhciBfX3NlcCwgY2hhciAqKl9fbmV4dHApOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJ0b2tfcl8xYyAoY2hhciAqX19zLCBjaGFyIF9fc2VwLCBjaGFyICoqX19uZXh0cCkKK3sKKyAgY2hhciAqX19yZXN1bHQ7CisgIGlmIChfX3MgPT0gTlVMTCkKKyAgICBfX3MgPSAqX19uZXh0cDsKKyAgd2hpbGUgKCpfX3MgPT0gX19zZXApCisgICAgKytfX3M7CisgIF9fcmVzdWx0ID0gTlVMTDsKKyAgaWYgKCpfX3MgIT0gJ1wwJykKKyAgICB7CisgICAgICBfX3Jlc3VsdCA9IF9fcysrOworICAgICAgd2hpbGUgKCpfX3MgIT0gJ1wwJykKKwlpZiAoKl9fcysrID09IF9fc2VwKQorCSAgeworCSAgICBfX3NbLTFdID0gJ1wwJzsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICAqX19uZXh0cCA9IF9fczsKKyAgICB9CisgIHJldHVybiBfX3Jlc3VsdDsKK30KKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgIGRlZmluZSBzdHJ0b2tfcihzLCBzZXAsIG5leHRwKSBfX3N0cnRva19yIChzLCBzZXAsIG5leHRwKQorIyBlbmRpZgorI2VuZGlmCisKKworI2lmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cnNlcCB8fCBkZWZpbmVkIF9GT1JDRV9JTkxJTkVTCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJzZXAKKworZXh0ZXJuIGNoYXIgKl9fc3Ryc2VwX2cgKGNoYXIgKipfX3N0cmluZ3AsIF9fY29uc3QgY2hhciAqX19kZWxpbSk7CisjICBkZWZpbmUgX19zdHJzZXAocywgcmVqZWN0KSBcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCSAgICAgIFwKKyAgKHsgY2hhciBfX3IwLCBfX3IxLCBfX3IyOwkJCQkJCSAgICAgIFwKKyAgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wIChyZWplY3QpICYmIF9fc3RyaW5nMl8xYnB0cl9wIChyZWplY3QpCSAgICAgIFwKKyAgICAgICYmIChfX3IwID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzBdLAkJCSAgICAgIFwKKwkgICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVswXSAhPSAnXDAnKQkJCSAgICAgIFwKKyAgICAgID8gKChfX3IxID0gKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdLAkJCSAgICAgIFwKKwkgKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzFdID09ICdcMCcpCQkJICAgICAgXAorCSA/IF9fc3Ryc2VwXzFjIChzLCBfX3IwKQkJCQkJICAgICAgXAorCSA6ICgoX19yMiA9ICgoX19jb25zdCBjaGFyICopIChyZWplY3QpKVsyXSwgX19yMiA9PSAnXDAnKQkgICAgICBcCisJICAgID8gX19zdHJzZXBfMmMgKHMsIF9fcjAsIF9fcjEpCQkJCSAgICAgIFwKKwkgICAgOiAoKChfX2NvbnN0IGNoYXIgKikgKHJlamVjdCkpWzNdID09ICdcMCcJCQkgICAgICBcCisJICAgICAgID8gX19zdHJzZXBfM2MgKHMsIF9fcjAsIF9fcjEsIF9fcjIpCQkJICAgICAgXAorCSAgICAgICA6IF9fc3Ryc2VwX2cgKHMsIHJlamVjdCkpKSkJCQkJICAgICAgXAorICAgICAgOiBfX3N0cnNlcF9nIChzLCByZWplY3QpKTsgfSkKKyMgZW5kaWYKKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzFjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0KTsKK19fU1RSSU5HX0lOTElORSBjaGFyICoKK19fc3Ryc2VwXzFjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0KQoreworICByZWdpc3RlciBjaGFyICpfX3JldHZhbCA9ICpfX3M7CisgIGlmIChfX3JldHZhbCAhPSBOVUxMICYmICgqX19zID0gc3RyY2hyIChfX3JldHZhbCwgX19yZWplY3QpKSAhPSBOVUxMKQorICAgICooKl9fcykrKyA9ICdcMCc7CisgIHJldHVybiBfX3JldHZhbDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzJjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0MSwgY2hhciBfX3JlamVjdDIpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfMmMgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MikKK3sKKyAgcmVnaXN0ZXIgY2hhciAqX19yZXR2YWwgPSAqX19zOworICBpZiAoX19yZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICByZWdpc3RlciBjaGFyICpfX2NwID0gX19yZXR2YWw7CisgICAgICB3aGlsZSAoMSkKKwl7CisJICBpZiAoKl9fY3AgPT0gJ1wwJykKKwkgICAgeworCSAgICAgIF9fY3AgPSBOVUxMOworCSAgYnJlYWs7CisJICAgIH0KKwkgIGlmICgqX19jcCA9PSBfX3JlamVjdDEgfHwgKl9fY3AgPT0gX19yZWplY3QyKQorCSAgICB7CisJICAgICAgKl9fY3ArKyA9ICdcMCc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrX19jcDsKKwl9CisgICAgICAqX19zID0gX19jcDsKKyAgICB9CisgIHJldHVybiBfX3JldHZhbDsKK30KKworX19TVFJJTkdfSU5MSU5FIGNoYXIgKl9fc3Ryc2VwXzNjIChjaGFyICoqX19zLCBjaGFyIF9fcmVqZWN0MSwgY2hhciBfX3JlamVjdDIsCisJCQkJICAgY2hhciBfX3JlamVjdDMpOworX19TVFJJTkdfSU5MSU5FIGNoYXIgKgorX19zdHJzZXBfM2MgKGNoYXIgKipfX3MsIGNoYXIgX19yZWplY3QxLCBjaGFyIF9fcmVqZWN0MiwgY2hhciBfX3JlamVjdDMpCit7CisgIHJlZ2lzdGVyIGNoYXIgKl9fcmV0dmFsID0gKl9fczsKKyAgaWYgKF9fcmV0dmFsICE9IE5VTEwpCisgICAgeworICAgICAgcmVnaXN0ZXIgY2hhciAqX19jcCA9IF9fcmV0dmFsOworICAgICAgd2hpbGUgKDEpCisJeworCSAgaWYgKCpfX2NwID09ICdcMCcpCisJICAgIHsKKwkgICAgICBfX2NwID0gTlVMTDsKKwkgIGJyZWFrOworCSAgICB9CisJICBpZiAoKl9fY3AgPT0gX19yZWplY3QxIHx8ICpfX2NwID09IF9fcmVqZWN0MiB8fCAqX19jcCA9PSBfX3JlamVjdDMpCisJICAgIHsKKwkgICAgICAqX19jcCsrID0gJ1wwJzsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgKytfX2NwOworCX0KKyAgICAgICpfX3MgPSBfX2NwOworICAgIH0KKyAgcmV0dXJuIF9fcmV0dmFsOworfQorIyBpZmRlZiBfX1VTRV9CU0QKKyMgIGRlZmluZSBzdHJzZXAocywgcmVqZWN0KSBfX3N0cnNlcCAocywgcmVqZWN0KQorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG5lZWQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBmb3IgaW5saW5lIHN0cmR1cCgpLgorICAgUmVmZXJyaW5nIHRvIHN0ZGxpYi5oIChldmVuIG1pbmltYWxseSkgaXMgbm90IGFsbG93ZWQKKyAgIGluIGFueSBvZiB0aGUgdGlnaHQgc3RhbmRhcmRzIGNvbXBsaWFudCBtb2Rlcy4gICovCisjaWZkZWYgX19VU0VfTUlTQworCisjIGlmICFkZWZpbmVkIF9IQVZFX1NUUklOR19BUkNIX3N0cmR1cCB8fCAhZGVmaW5lZCBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuZHVwCisjICBkZWZpbmUgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKworIyBpZm5kZWYgX0hBVkVfU1RSSU5HX0FSQ0hfc3RyZHVwCisKK2V4dGVybiBjaGFyICpfX3N0cmR1cCAoX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXzsKKyMgIGRlZmluZSBfX3N0cmR1cChzKSBcCisgIChfX2V4dGVuc2lvbl9fIChfX2J1aWx0aW5fY29uc3RhbnRfcCAocykgJiYgX19zdHJpbmcyXzFicHRyX3AgKHMpCSAgICAgIFwKKwkJICA/ICgoKF9fY29uc3QgY2hhciAqKSAocykpWzBdID09ICdcMCcJCQkgICAgICBcCisJCSAgICAgPyAoY2hhciAqKSBjYWxsb2MgKChzaXplX3QpIDEsIChzaXplX3QpIDEpCQkgICAgICBcCisJCSAgICAgOiAoeyBzaXplX3QgX19sZW4gPSBzdHJsZW4gKHMpICsgMTsJCSAgICAgIFwKKwkJCSAgY2hhciAqX19yZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKF9fbGVuKTsJICAgICAgXAorCQkJICBpZiAoX19yZXR2YWwgIT0gTlVMTCkJCQkJICAgICAgXAorCQkJICAgIF9fcmV0dmFsID0gKGNoYXIgKikgbWVtY3B5IChfX3JldHZhbCwgcywgX19sZW4pOyAgXAorCQkJICBfX3JldHZhbDsgfSkpCQkJCQkgICAgICBcCisJCSAgOiBfX3N0cmR1cCAocykpKQorCisjICBpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyAgIGRlZmluZSBzdHJkdXAocykgX19zdHJkdXAgKHMpCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiBfSEFWRV9TVFJJTkdfQVJDSF9zdHJuZHVwCisKK2V4dGVybiBjaGFyICpfX3N0cm5kdXAgKF9fY29uc3QgY2hhciAqX19zdHJpbmcsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX187CisjICBkZWZpbmUgX19zdHJuZHVwKHMsIG4pIFwKKyAgKF9fZXh0ZW5zaW9uX18gKF9fYnVpbHRpbl9jb25zdGFudF9wIChzKSAmJiBfX3N0cmluZzJfMWJwdHJfcCAocykJICAgICAgXAorCQkgID8gKCgoX19jb25zdCBjaGFyICopIChzKSlbMF0gPT0gJ1wwJwkJCSAgICAgIFwKKwkJICAgICA/IChjaGFyICopIGNhbGxvYyAoKHNpemVfdCkgMSwgKHNpemVfdCkgMSkJCSAgICAgIFwKKwkJICAgICA6ICh7IHNpemVfdCBfX2xlbiA9IHN0cmxlbiAocykgKyAxOwkJICAgICAgXAorCQkJICBzaXplX3QgX19uID0gKG4pOwkJCQkgICAgICBcCisJCQkgIGNoYXIgKl9fcmV0dmFsOwkJCQkgICAgICBcCisJCQkgIGlmIChfX24gPCBfX2xlbikJCQkJICAgICAgXAorCQkJICAgIF9fbGVuID0gX19uICsgMTsJCQkJICAgICAgXAorCQkJICBfX3JldHZhbCA9IChjaGFyICopIG1hbGxvYyAoX19sZW4pOwkJICAgICAgXAorCQkJICBpZiAoX19yZXR2YWwgIT0gTlVMTCkJCQkJICAgICAgXAorCQkJICAgIHsJCQkJCQkgICAgICBcCisJCQkgICAgICBfX3JldHZhbFtfX2xlbiAtIDFdID0gJ1wwJzsJCSAgICAgIFwKKwkJCSAgICAgIF9fcmV0dmFsID0gKGNoYXIgKikgbWVtY3B5IChfX3JldHZhbCwgcywJICAgICAgXAorCQkJCQkJCSAgX19sZW4gLSAxKTsJICAgICAgXAorCQkJICAgIH0JCQkJCQkgICAgICBcCisJCQkgIF9fcmV0dmFsOyB9KSkJCQkJCSAgICAgIFwKKwkJICA6IF9fc3RybmR1cCAocywgbikpKQorCisjICBpZmRlZiBfX1VTRV9HTlUKKyMgICBkZWZpbmUgc3RybmR1cChzLCBuKSBfX3N0cm5kdXAgKHMsIG4pCisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogVXNlIG1pc2MuIG9yIHVzZSBHTlUuICAqLworCisjaWZuZGVmIF9GT1JDRV9JTkxJTkVTCisjIHVuZGVmIF9fU1RSSU5HX0lOTElORQorI2VuZGlmCisKKyNlbmRpZiAvKiBObyBzdHJpbmcgaW5saW5lcy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3RyaW5nMy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0cmluZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTU5M2UzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N0cmluZzMuaApAQCAtMCwwICsxLDE1NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TVFJJTkdfSAorIyBlcnJvciAiTmV2ZXIgdXNlIDxiaXRzL3N0cmluZzMuaD4gZGlyZWN0bHk7IGluY2x1ZGUgPHN0cmluZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCitfX3dhcm5kZWNsIChfX3dhcm5fbWVtc2V0X3plcm9fbGVuLAorCSAgICAibWVtc2V0IHVzZWQgd2l0aCBjb25zdGFudCB6ZXJvIGxlbmd0aCBwYXJhbWV0ZXI7IHRoaXMgY291bGQgYmUgZHVlIHRvIHRyYW5zcG9zZWQgcGFyYW1ldGVycyIpOworCisjaWZuZGVmIF9fY3BsdXNwbHVzCisvKiBYWFggVGhpcyBpcyB0ZW1wb3JhcmlseS4gIFdlIHNob3VsZCBub3QgcmVkZWZpbmUgYW55IG9mIHRoZSBzeW1ib2xzCisgICBhbmQgaW5zdGVhZCBpbnRlZ3JhdGUgdGhlIGVycm9yIGNoZWNraW5nIGludG8gdGhlIG9yaWdpbmFsCisgICBkZWZpbml0aW9ucy4gICovCisjIHVuZGVmIG1lbWNweQorIyB1bmRlZiBtZW1tb3ZlCisjIHVuZGVmIG1lbXNldAorIyB1bmRlZiBzdHJjYXQKKyMgdW5kZWYgc3RyY3B5CisjIHVuZGVmIHN0cm5jYXQKKyMgdW5kZWYgc3RybmNweQorIyBpZmRlZiBfX1VTRV9HTlUKKyMgIHVuZGVmIG1lbXBjcHkKKyMgIHVuZGVmIHN0cGNweQorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9CU0QKKyMgIHVuZGVmIGJjb3B5CisjICB1bmRlZiBiemVybworIyBlbmRpZgorI2VuZGlmCisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1jcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsCisJICAgICAgIHNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1jcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2xlbiwgX19ib3MwIChfX2Rlc3QpKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkICoKK19fTlRIIChtZW1tb3ZlICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19sZW4pKQoreworICByZXR1cm4gX19idWlsdGluX19fbWVtbW92ZV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorCisjaWZkZWYgX19VU0VfR05VCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQgKgorX19OVEggKG1lbXBjcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19tZW1wY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisjZW5kaWYKKworCisvKiBUaGUgZmlyc3QgdHdvIHRlc3RzIGhlcmUgaGVscCB0byBjYXRjaCBhIHNvbWV3aGF0IGNvbW1vbiBwcm9ibGVtCisgICB3aGVyZSB0aGUgc2Vjb25kIGFuZCB0aGlyZCBwYXJhbWV0ZXIgYXJlIHRyYW5zcG9zZWQuICBUaGlzIGlzCisgICBlc3BlY2lhbGx5IHByb2JsZW1hdGljIGlmIHRoZSBpbnRlbmRlZCBmaWxsIHZhbHVlIGlzIHplcm8uICBJbiB0aGlzCisgICBjYXNlIG5vIHdvcmsgaXMgZG9uZSBhdCBhbGwuICBXZSBkZXRlY3QgdGhlc2UgcHJvYmxlbXMgYnkgcmVmZXJyaW5nCisgICBub24tZXhpc3RpbmcgZnVuY3Rpb25zLiAgKi8KK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitfX05USCAobWVtc2V0ICh2b2lkICpfX2Rlc3QsIGludCBfX2NoLCBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSAmJiBfX2xlbiA9PSAwKQorICAgIHsKKyAgICAgIF9fd2Fybl9tZW1zZXRfemVyb19sZW4gKCk7CisgICAgICByZXR1cm4gX19kZXN0OworICAgIH0KKyAgcmV0dXJuIF9fYnVpbHRpbl9fX21lbXNldF9jaGsgKF9fZGVzdCwgX19jaCwgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisKKyNpZmRlZiBfX1VTRV9CU0QKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorX19OVEggKGJjb3B5IChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsIHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LAorCSAgICAgIHNpemVfdCBfX2xlbikpCit7CisgICh2b2lkKSBfX2J1aWx0aW5fX19tZW1tb3ZlX2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zMCAoX19kZXN0KSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgdm9pZAorX19OVEggKGJ6ZXJvICh2b2lkICpfX2Rlc3QsIHNpemVfdCBfX2xlbikpCit7CisgICh2b2lkKSBfX2J1aWx0aW5fX19tZW1zZXRfY2hrIChfX2Rlc3QsICdcMCcsIF9fbGVuLCBfX2JvczAgKF9fZGVzdCkpOworfQorI2VuZGlmCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RyY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHBjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RwY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19ib3MgKF9fZGVzdCkpOworfQorI2VuZGlmCisKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBjaGFyICoKK19fTlRIIChzdHJuY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLAorCQlzaXplX3QgX19sZW4pKQoreworICByZXR1cm4gX19idWlsdGluX19fc3RybmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbGVuLCBfX2JvcyAoX19kZXN0KSk7Cit9CisKKy8vIFhYWCBXZSBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgYnVpbHRpbiB5ZXQuCitleHRlcm4gY2hhciAqX19zdHBuY3B5X2NoayAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uLAorCQkJICAgIHNpemVfdCBfX2Rlc3RsZW4pIF9fVEhST1c7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fc3RwbmNweV9hbGlhcywgKGNoYXIgKl9fZGVzdCwKKwkJCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19zcmMsCisJCQkJCSAgICAgICBzaXplX3QgX19uKSwgc3RwbmNweSk7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RwbmNweSAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xCisgICAgICAmJiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pIHx8IF9fbiA8PSBfX2JvcyAoX19kZXN0KSkpCisgICAgcmV0dXJuIF9fc3RwbmNweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbiwgX19ib3MgKF9fZGVzdCkpOworICByZXR1cm4gX19zdHBuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgY2hhciAqCitfX05USCAoc3RyY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKSkKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9fX3N0cmNhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpKTsKK30KKworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGNoYXIgKgorX19OVEggKHN0cm5jYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsCisJCXNpemVfdCBfX2xlbikpCit7CisgIHJldHVybiBfX2J1aWx0aW5fX19zdHJuY2F0X2NoayAoX19kZXN0LCBfX3NyYywgX19sZW4sIF9fYm9zIChfX2Rlc3QpKTsKK30KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zdHJvcHRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTJjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3Ryb3B0cy5oCkBAIC0wLDAgKzEsMjMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUk9QVFNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zdHJvcHRzLmg+IGRpcmVjdGx5OyB1c2UgPHN0cm9wdHMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19TVFJPUFRTX0gKKyNkZWZpbmUgX0JJVFNfU1RST1BUU19ICTEKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogTWFjcm9zIHVzZWQgYXMgYHJlcXVlc3QnIGFyZ3VtZW50IHRvIGBpb2N0bCcuICAqLworI2RlZmluZSBfX1NJRAkJKCdTJyA8PCA4KQorCisjZGVmaW5lIElfTlJFQUQJICAgIChfX1NJRCB8IDEpCS8qIENvdW50cyB0aGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhlIGRhdGEKKwkJCQkgICBibG9jayBpbiB0aGUgZmlyc3QgbWVzc2FnZS4gICovCisjZGVmaW5lIElfUFVTSAkgICAgKF9fU0lEIHwgMikJLyogUHVzaCBTVFJFQU1TIG1vZHVsZSBvbnRvIHRvcCBvZiB0aGUgY3VycmVudAorCQkJCSAgIFNUUkVBTSwganVzdCBiZWxvdyB0aGUgU1RSRUFNIGhlYWQuICAqLworI2RlZmluZSBJX1BPUAkgICAgKF9fU0lEIHwgMykJLyogUmVtb3ZlIFNUUkVBTVMgbW9kdWxlIGZyb20ganVzdCBiZWxvdyB0aGUKKwkJCQkgICBTVFJFQU0gaGVhZC4gICovCisjZGVmaW5lIElfTE9PSwkgICAgKF9fU0lEIHwgNCkJLyogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBqdXN0IGJlbG93CisJCQkJICAgdGhlIFNUUkVBTSBoZWFkIGFuZCBwbGFjZSBpdCBpbiBhIGNoYXJhY3RlcgorCQkJCSAgIHN0cmluZy4gICovCisjZGVmaW5lIElfRkxVU0gJICAgIChfX1NJRCB8IDUpCS8qIEZsdXNoIGFsbCBpbnB1dCBhbmQvb3Igb3V0cHV0LiAgKi8KKyNkZWZpbmUgSV9TUkRPUFQgICAgKF9fU0lEIHwgNikJLyogU2V0cyB0aGUgcmVhZCBtb2RlLiAgKi8KKyNkZWZpbmUgSV9HUkRPUFQgICAgKF9fU0lEIHwgNykJLyogUmV0dXJucyB0aGUgY3VycmVudCByZWFkIG1vZGUgc2V0dGluZy4gICovCisjZGVmaW5lIElfU1RSCSAgICAoX19TSUQgfCA4KQkvKiBDb25zdHJ1Y3QgYW4gaW50ZXJuYWwgU1RSRUFNUyBgaW9jdGwnCisJCQkJICAgbWVzc2FnZSBhbmQgc2VuZCB0aGF0IG1lc3NhZ2UgZG93bnN0cmVhbS4gKi8KKyNkZWZpbmUgSV9TRVRTSUcgICAgKF9fU0lEIHwgOSkJLyogSW5mb3JtIHRoZSBTVFJFQU0gaGVhZCB0aGF0IHRoZSBwcm9jZXNzCisJCQkJICAgd2FudHMgdGhlIFNJR1BPTEwgc2lnbmFsIGlzc3VlZC4gICovCisjZGVmaW5lIElfR0VUU0lHICAgIChfX1NJRCB8MTApIC8qIFJldHVybiB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgY2FsbGluZworCQkJCSAgIHByb2Nlc3MgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgdG8gYmUgc2VudAorCQkJCSAgIGEgU0lHUE9MTCBzaWduYWwuICAqLworI2RlZmluZSBJX0ZJTkQJICAgIChfX1NJRCB8MTEpIC8qIENvbXBhcmVzIHRoZSBuYW1lcyBvZiBhbGwgbW9kdWxlcyBjdXJyZW50bHkKKwkJCQkgICBwcmVzZW50IGluIHRoZSBTVFJFQU0gdG8gdGhlIG5hbWUgcG9pbnRlZCB0bworCQkJCSAgIGJ5IGBhcmcnLiAgKi8KKyNkZWZpbmUgSV9MSU5LCSAgICAoX19TSUQgfDEyKSAvKiBDb25uZWN0IHR3byBTVFJFQU1zLiAgKi8KKyNkZWZpbmUgSV9VTkxJTksgICAgKF9fU0lEIHwxMykgLyogRGlzY29ubmVjdHMgdGhlIHR3byBTVFJFQU1zLiAgKi8KKyNkZWZpbmUgSV9QRUVLCSAgICAoX19TSUQgfDE1KSAvKiBBbGxvd3MgYSBwcm9jZXNzIHRvIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbgorCQkJCSAgIGluIHRoZSBmaXJzdCBtZXNzYWdlIG9uIHRoZSBTVFJFQU0gaGVhZCByZWFkCisJCQkJICAgcXVldWUgd2l0aG91dCB0YWtpbmcgdGhlIG1lc3NhZ2Ugb2ZmIHRoZQorCQkJCSAgIHF1ZXVlLiAgKi8KKyNkZWZpbmUgSV9GRElOU0VSVCAgKF9fU0lEIHwxNikgLyogQ3JlYXRlIGEgbWVzc2FnZSBmcm9tIHRoZSBzcGVjaWZpZWQKKwkJCQkgICBidWZmZXIocyksIGFkZHMgaW5mb3JtYXRpb24gYWJvdXQgYW5vdGhlcgorCQkJCSAgIFNUUkVBTSwgYW5kIHNlbmQgdGhlIG1lc3NhZ2UgZG93bnN0cmVhbS4gICovCisjZGVmaW5lIElfU0VOREZEICAgIChfX1NJRCB8MTcpIC8qIFJlcXVlc3RzIHRoZSBTVFJFQU0gYXNzb2NpYXRlZCB3aXRoIGBmaWxkZXMnCisJCQkJICAgdG8gc2VuZCBhIG1lc3NhZ2UsIGNvbnRhaW5pbmcgYSBmaWxlCisJCQkJICAgcG9pbnRlciwgdG8gdGhlIFNUUkVBTSBoZWFkIGF0IHRoZSBvdGhlciBlbmQKKwkJCQkgICBvZiBhIFNUUkVBTVMgcGlwZS4gICovCisjZGVmaW5lIElfUkVDVkZEICAgIChfX1NJRCB8MTQpIC8qIE5vbi1FRlQgZGVmaW5pdGlvbi4gICovCisjZGVmaW5lIElfU1dST1BUICAgIChfX1NJRCB8MTkpIC8qIFNldCB0aGUgd3JpdGUgbW9kZS4gICovCisjZGVmaW5lIElfR1dST1BUICAgIChfX1NJRCB8MjApIC8qIFJldHVybiB0aGUgY3VycmVudCB3cml0ZSBtb2RlIHNldHRpbmcuICAqLworI2RlZmluZSBJX0xJU1QJICAgIChfX1NJRCB8MjEpIC8qIExpc3QgYWxsIHRoZSBtb2R1bGUgbmFtZXMgb24gdGhlIFNUUkVBTSwgdXAKKwkJCQkgICB0byBhbmQgaW5jbHVkaW5nIHRoZSB0b3Btb3N0IGRyaXZlciBuYW1lLiAqLworI2RlZmluZSBJX1BMSU5LCSAgICAoX19TSUQgfDIyKSAvKiBDb25uZWN0IHR3byBTVFJFQU1zIHdpdGggYSBwZXJzaXN0ZW50CisJCQkJICAgbGluay4gICovCisjZGVmaW5lIElfUFVOTElOSyAgIChfX1NJRCB8MjMpIC8qIERpc2Nvbm5lY3QgdGhlIHR3byBTVFJFQU1zIHRoYXQgd2VyZQorCQkJCSAgIGNvbm5lY3RlZCB3aXRoIGEgcGVyc2lzdGVudCBsaW5rLiAgKi8KKyNkZWZpbmUgSV9GTFVTSEJBTkQgKF9fU0lEIHwyOCkgLyogRmx1c2ggb25seSBiYW5kIHNwZWNpZmllZC4gICovCisjZGVmaW5lIElfQ0tCQU5EICAgIChfX1NJRCB8MjkpIC8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIG9mIGEgZ2l2ZW4gcHJpb3JpdHkKKwkJCQkgICBiYW5kIGV4aXN0cyBvbiB0aGUgU1RSRUFNIGhlYWQgcmVhZAorCQkJCSAgIHF1ZXVlLiAgKi8KKyNkZWZpbmUgSV9HRVRCQU5EICAgKF9fU0lEIHwzMCkgLyogUmV0dXJuIHRoZSBwcmlvcml0eSBiYW5kIG9mIHRoZSBmaXJzdAorCQkJCSAgIG1lc3NhZ2Ugb24gdGhlIFNUUkVBTSBoZWFkIHJlYWQgcXVldWUuICAqLworI2RlZmluZSBJX0FUTUFSSyAgICAoX19TSUQgfDMxKSAvKiBTZWUgaWYgdGhlIGN1cnJlbnQgbWVzc2FnZSBvbiB0aGUgU1RSRUFNCisJCQkJICAgaGVhZCByZWFkIHF1ZXVlIGlzICJtYXJrZWQiIGJ5IHNvbWUgbW9kdWxlCisJCQkJICAgZG93bnN0cmVhbS4gICovCisjZGVmaW5lIElfU0VUQ0xUSU1FIChfX1NJRCB8MzIpIC8qIFNldCB0aGUgdGltZSB0aGUgU1RSRUFNIGhlYWQgd2lsbCBkZWxheSB3aGVuCisJCQkJICAgYSBTVFJFQU0gaXMgY2xvc2luZyBhbmQgdGhlcmUgaXMgZGF0YSBvbgorCQkJCSAgIHRoZSB3cml0ZSBxdWV1ZXMuICAqLworI2RlZmluZSBJX0dFVENMVElNRSAoX19TSUQgfDMzKSAvKiBHZXQgY3VycmVudCB2YWx1ZSBmb3IgY2xvc2luZyB0aW1lb3V0LiAgKi8KKyNkZWZpbmUgSV9DQU5QVVQgICAgKF9fU0lEIHwzNCkgLyogQ2hlY2sgaWYgYSBjZXJ0YWluIGJhbmQgaXMgd3JpdGFibGUuICAqLworCisKKy8qIFVzZWQgaW4gYElfTE9PSycgcmVxdWVzdC4gICovCisjZGVmaW5lIEZNTkFNRVNaCTgJLyogY29tcGF0aWJpbGl0eSB3L1VuaXhXYXJlL1NvbGFyaXMuICAqLworCisvKiBGbHVzaCBvcHRpb25zLiAgKi8KKyNkZWZpbmUgRkxVU0hSCQkweDAxCS8qIEZsdXNoIHJlYWQgcXVldWVzLiAgKi8KKyNkZWZpbmUgRkxVU0hXCQkweDAyCS8qIEZsdXNoIHdyaXRlIHF1ZXVlcy4gICovCisjZGVmaW5lIEZMVVNIUlcJCTB4MDMJLyogRmx1c2ggcmVhZCBhbmQgd3JpdGUgcXVldWVzLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEZMVVNIQkFORAkweDA0CS8qIEZsdXNoIG9ubHkgc3BlY2lmaWVkIGJhbmQuICAqLworI2VuZGlmCisKKy8qIFBvc3NpYmxlIGFyZ3VtZW50cyBmb3IgYElfU0VUU0lHJy4gICovCisjZGVmaW5lIFNfSU5QVVQJCTB4MDAwMQkvKiBBIG1lc3NhZ2UsIG90aGVyIHRoYW4gYSBoaWdoLXByaW9yaXR5CisJCQkJICAgbWVzc2FnZSwgaGFzIGFycml2ZWQuICAqLworI2RlZmluZSBTX0hJUFJJCQkweDAwMDIJLyogQSBoaWdoLXByaW9yaXR5IG1lc3NhZ2UgaXMgcHJlc2VudC4gICovCisjZGVmaW5lIFNfT1VUUFVUCTB4MDAwNAkvKiBUaGUgd3JpdGUgcXVldWUgZm9yIG5vcm1hbCBkYXRhIGlzIG5vIGxvbmdlcgorCQkJCSAgIGZ1bGwuICAqLworI2RlZmluZSBTX01TRwkJMHgwMDA4CS8qIEEgU1RSRUFNUyBzaWduYWwgbWVzc2FnZSB0aGF0IGNvbnRhaW5zIHRoZQorCQkJCSAgIFNJR1BPTEwgc2lnbmFsIHJlYWNoZXMgdGhlIGZyb250IG9mIHRoZQorCQkJCSAgIFNUUkVBTSBoZWFkIHJlYWQgcXVldWUuICAqLworI2RlZmluZSBTX0VSUk9SCQkweDAwMTAJLyogTm90aWZpY2F0aW9uIG9mIGFuIGVycm9yIGNvbmRpdGlvbi4gICovCisjZGVmaW5lIFNfSEFOR1VQCTB4MDAyMAkvKiBOb3RpZmljYXRpb24gb2YgYSBoYW5ndXAuICAqLworI2RlZmluZSBTX1JETk9STQkweDAwNDAJLyogQSBub3JtYWwgbWVzc2FnZSBoYXMgYXJyaXZlZC4gICovCisjZGVmaW5lIFNfV1JOT1JNCVNfT1VUUFVUCisjZGVmaW5lIFNfUkRCQU5ECTB4MDA4MAkvKiBBIG1lc3NhZ2Ugd2l0aCBhIG5vbi16ZXJvIHByaW9yaXR5IGhhcworCQkJCSAgIGFycml2ZWQuICAqLworI2RlZmluZSBTX1dSQkFORAkweDAxMDAJLyogVGhlIHdyaXRlIHF1ZXVlIGZvciBhIG5vbi16ZXJvIHByaW9yaXR5CisJCQkJICAgYmFuZCBpcyBubyBsb25nZXIgZnVsbC4gICovCisjZGVmaW5lIFNfQkFORFVSRwkweDAyMDAJLyogV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU19SREJBTkQsCisJCQkJICAgU0lHVVJHIGlzIGdlbmVyYXRlZCBpbnN0ZWFkIG9mIFNJR1BPTEwgd2hlbgorCQkJCSAgIGEgcHJpb3JpdHkgbWVzc2FnZSByZWFjaGVzIHRoZSBmcm9udCBvZiB0aGUKKwkJCQkgICBTVFJFQU0gaGVhZCByZWFkIHF1ZXVlLiAgKi8KKworLyogT3B0aW9uIGZvciBgSV9QRUVLJy4gICovCisjZGVmaW5lIFJTX0hJUFJJCTB4MDEJLyogT25seSBsb29rIGZvciBoaWdoLXByaW9yaXR5IG1lc3NhZ2VzLiAgKi8KKworLyogT3B0aW9ucyBmb3IgYElfU1JET1BUJy4gICovCisjZGVmaW5lIFJOT1JNCQkweDAwMDAJLyogQnl0ZS1TVFJFQU0gbW9kZSwgdGhlIGRlZmF1bHQuICAqLworI2RlZmluZSBSTVNHRAkJMHgwMDAxCS8qIE1lc3NhZ2UtZGlzY2FyZCBtb2RlLiAgICovCisjZGVmaW5lIFJNU0dOCQkweDAwMDIJLyogTWVzc2FnZS1ub25kaXNjYXJkIG1vZGUuICAgKi8KKyNkZWZpbmUgUlBST1REQVQJMHgwMDA0CS8qIERlbGl2ZXIgdGhlIGNvbnRyb2wgcGFydCBvZiBhIG1lc3NhZ2UgYXMKKwkJCQkgICBkYXRhLiAgKi8KKyNkZWZpbmUgUlBST1RESVMJMHgwMDA4CS8qIERpc2NhcmQgdGhlIGNvbnRyb2wgcGFydCBvZiBhIG1lc3NhZ2UsCisJCQkJICAgZGVsaXZlcmluZyBhbnkgZGF0YSBwYXJ0LiAgKi8KKyNkZWZpbmUgUlBST1ROT1JNCTB4MDAxMAkvKiBGYWlsIGByZWFkJyB3aXRoIEVCQURNU0cgaWYgYSBtZXNzYWdlCisJCQkJICAgY29udGFpbmluZyBhIGNvbnRyb2wgcGFydCBpcyBhdCB0aGUgZnJvbnQKKwkJCQkgICBvZiB0aGUgU1RSRUFNIGhlYWQgcmVhZCBxdWV1ZS4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBSUFJPVE1BU0sJMHgwMDFDCS8qIFRoZSBSUFJPVCBiaXRzICovCisjZW5kaWYKKworLyogUG9zc2libGUgbW9kZSBmb3IgYElfU1dST1BUJy4gICovCisjZGVmaW5lIFNORFpFUk8JCTB4MDAxCS8qIFNlbmQgYSB6ZXJvLWxlbmd0aCBtZXNzYWdlIGRvd25zdHJlYW0gd2hlbiBhCisJCQkJICAgYHdyaXRlJyBvZiAwIGJ5dGVzIG9jY3Vycy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBTTkRQSVBFCTB4MDAyCS8qIFNlbmQgU0lHUElQRSBvbiB3cml0ZSBhbmQgcHV0bXNnIGlmCisJCQkJICAgc2Rfd2Vycm9yIGlzIHNldC4gICovCisjZW5kaWYKKworLyogQXJndW1lbnRzIGZvciBgSV9BVE1BUksnLiAgKi8KKyNkZWZpbmUgQU5ZTUFSSwkJMHgwMQkvKiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBtYXJrZWQuICAqLworI2RlZmluZSBMQVNUTUFSSwkweDAyCS8qIENoZWNrIGlmIHRoZSBtZXNzYWdlIGlzIHRoZSBsYXN0IG9uZSBtYXJrZWQKKwkJCQkgICBvbiB0aGUgcXVldWUuICAqLworCisvKiBBcmd1bWVudCBmb3IgYElfVU5MSU5LJy4gICovCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNVVhJRF9BTEwJKC0xKQkvKiBVbmxpbmsgYWxsIFNUUkVBTXMgbGlua2VkIHRvIHRoZSBTVFJFQU0KKwkJCQkgICBhc3NvY2lhdGVkIHdpdGggYGZpbGRlcycuICAqLworI2VuZGlmCisKKworLyogTWFjcm9zIGZvciBgZ2V0bXNnJywgYGdldHBtc2cnLCBgcHV0bXNnJyBhbmQgYHB1dHBtc2cnLiAgKi8KKyNkZWZpbmUgTVNHX0hJUFJJCTB4MDEJLyogU2VuZC9yZWNlaXZlIGhpZ2ggcHJpb3JpdHkgbWVzc2FnZS4gICovCisjZGVmaW5lIE1TR19BTlkJCTB4MDIJLyogUmVjZWl2ZSBhbnkgbWVzc2FnZS4gICovCisjZGVmaW5lIE1TR19CQU5ECTB4MDQJLyogUmVjZWl2ZSBtZXNzYWdlIGZyb20gc3BlY2lmaWVkIGJhbmQuICAqLworCisvKiBWYWx1ZXMgcmV0dXJuZWQgYnkgZ2V0bXNnIGFuZCBnZXRwbXNnICovCisjZGVmaW5lIE1PUkVDVEwJCTEJLyogTW9yZSBjb250cm9sIGluZm9ybWF0aW9uIGlzIGxlZnQgaW4KKwkJCQkgICBtZXNzYWdlLiAgKi8KKyNkZWZpbmUgTU9SRURBVEEJMgkvKiBNb3JlIGRhdGEgaXMgbGVmdCBpbiBtZXNzYWdlLiAgKi8KKworCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIElfRkxVU0hCQU5EIGlvY3RsIG9uIHN0cmVhbXMuICAqLworc3RydWN0IGJhbmRpbmZvCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGJpX3ByaTsKKyAgICBpbnQgYmlfZmxhZzsKKyAgfTsKKworc3RydWN0IHN0cmJ1ZgorICB7CisgICAgaW50IG1heGxlbjsJCS8qIE1heGltdW0gYnVmZmVyIGxlbmd0aC4gICovCisgICAgaW50IGxlbjsJCS8qIExlbmd0aCBvZiBkYXRhLiAgKi8KKyAgICBjaGFyICpidWY7CQkvKiBQb2ludGVyIHRvIGJ1ZmZlci4gICovCisgIH07CisKK3N0cnVjdCBzdHJwZWVrCisgIHsKKyAgICBzdHJ1Y3Qgc3RyYnVmIGN0bGJ1ZjsKKyAgICBzdHJ1Y3Qgc3RyYnVmIGRhdGFidWY7CisgICAgdF91c2NhbGFyX3QgZmxhZ3M7CQkJLyogVW5peFdhcmUvU29sYXJpcyBjb21wYXRpYmlsaXR5LiAgKi8KKyAgfTsKKworc3RydWN0IHN0cmZkaW5zZXJ0CisgIHsKKyAgICBzdHJ1Y3Qgc3RyYnVmIGN0bGJ1ZjsKKyAgICBzdHJ1Y3Qgc3RyYnVmIGRhdGFidWY7CisgICAgdF91c2NhbGFyX3QgZmxhZ3M7CQkJLyogVW5peFdhcmUvU29sYXJpcyBjb21wYXRpYmlsaXR5LiAgKi8KKyAgICBpbnQgZmlsZGVzOworICAgIGludCBvZmZzZXQ7CisgIH07CisKK3N0cnVjdCBzdHJpb2N0bAorICB7CisgICAgaW50IGljX2NtZDsKKyAgICBpbnQgaWNfdGltb3V0OworICAgIGludCBpY19sZW47CisgICAgY2hhciAqaWNfZHA7CisgIH07CisKK3N0cnVjdCBzdHJyZWN2ZmQKKyAgeworICAgIGludCBmZDsKKyAgICB1aWRfdCB1aWQ7CisgICAgZ2lkX3QgZ2lkOworICAgIGNoYXIgX19maWxsWzhdOwkJCS8qIFVuaXhXYXJlL1NvbGFyaXMgY29tcGF0aWJpbGl0eSAqLworICB9OworCisKK3N0cnVjdCBzdHJfbWxpc3QKKyAgeworICAgIGNoYXIgbF9uYW1lW0ZNTkFNRVNaICsgMV07CisgIH07CisKK3N0cnVjdCBzdHJfbGlzdAorICB7CisgICAgaW50IHNsX25tb2RzOworICAgIHN0cnVjdCBzdHJfbWxpc3QgKnNsX21vZGxpc3Q7CisgIH07CisKKyNlbmRpZiAvKiBiaXRzL3N0cm9wdHMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c19lcnJsaXN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3lzX2Vycmxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTU1NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c19lcnJsaXN0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogRGVjbGFyZSBzeXNfZXJybGlzdCBhbmQgc3lzX25lcnIsIG9yIGRvbid0LiAgQ29tcGF0aWJpbGl0eSAoZG8pIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NURElPX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvc3lzX2Vycmxpc3QuaD4gZGlyZWN0bHk7IHVzZSA8c3RkaW8uaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogc3lzX2Vycmxpc3QgYW5kIHN5c19uZXJyIGFyZSBkZXByZWNhdGVkLiAgVXNlIHN0cmVycm9yIGluc3RlYWQuICAqLworCisjaWZkZWYgIF9fVVNFX0JTRAorZXh0ZXJuIGludCBzeXNfbmVycjsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKl9fY29uc3Qgc3lzX2Vycmxpc3RbXTsKKyNlbmRpZgorI2lmZGVmICBfX1VTRV9HTlUKK2V4dGVybiBpbnQgX3N5c19uZXJyOworZXh0ZXJuIF9fY29uc3QgY2hhciAqX19jb25zdCBfc3lzX2Vycmxpc3RbXTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c2NhbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zeXNjYWxsLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8qIEdlbmVyYXRlZCBhdCBsaWJjIGJ1aWxkIHRpbWUgZnJvbSBrZXJuZWwgc3lzY2FsbCBsaXN0LiAgKi8KKworI2lmbmRlZiBfU1lTQ0FMTF9ICisjIGVycm9yICJOZXZlciB1c2UgPGJpdHMvc3lzY2FsbC5oPiBkaXJlY3RseTsgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2RlZmluZSBTWVNfX3N5c2N0bCBfX05SX19zeXNjdGwKKyNkZWZpbmUgU1lTX2FjY2VzcyBfX05SX2FjY2VzcworI2RlZmluZSBTWVNfYWNjdCBfX05SX2FjY3QKKyNkZWZpbmUgU1lTX2FkZF9rZXkgX19OUl9hZGRfa2V5CisjZGVmaW5lIFNZU19hZGp0aW1leCBfX05SX2FkanRpbWV4CisjZGVmaW5lIFNZU19hZnNfc3lzY2FsbCBfX05SX2Fmc19zeXNjYWxsCisjZGVmaW5lIFNZU19hbGFybSBfX05SX2FsYXJtCisjZGVmaW5lIFNZU19icmsgX19OUl9icmsKKyNkZWZpbmUgU1lTX2NhcGdldCBfX05SX2NhcGdldAorI2RlZmluZSBTWVNfY2Fwc2V0IF9fTlJfY2Fwc2V0CisjZGVmaW5lIFNZU19jaGRpciBfX05SX2NoZGlyCisjZGVmaW5lIFNZU19jaG1vZCBfX05SX2NobW9kCisjZGVmaW5lIFNZU19jaG93biBfX05SX2Nob3duCisjZGVmaW5lIFNZU19jaHJvb3QgX19OUl9jaHJvb3QKKyNkZWZpbmUgU1lTX2Nsb2NrX2dldHJlcyBfX05SX2Nsb2NrX2dldHJlcworI2RlZmluZSBTWVNfY2xvY2tfZ2V0dGltZSBfX05SX2Nsb2NrX2dldHRpbWUKKyNkZWZpbmUgU1lTX2Nsb2NrX25hbm9zbGVlcCBfX05SX2Nsb2NrX25hbm9zbGVlcAorI2RlZmluZSBTWVNfY2xvY2tfc2V0dGltZSBfX05SX2Nsb2NrX3NldHRpbWUKKyNkZWZpbmUgU1lTX2Nsb25lIF9fTlJfY2xvbmUKKyNkZWZpbmUgU1lTX2Nsb3NlIF9fTlJfY2xvc2UKKyNkZWZpbmUgU1lTX2NyZWF0IF9fTlJfY3JlYXQKKyNkZWZpbmUgU1lTX2NyZWF0ZV9tb2R1bGUgX19OUl9jcmVhdGVfbW9kdWxlCisjZGVmaW5lIFNZU19kZWxldGVfbW9kdWxlIF9fTlJfZGVsZXRlX21vZHVsZQorI2RlZmluZSBTWVNfZHVwIF9fTlJfZHVwCisjZGVmaW5lIFNZU19kdXAyIF9fTlJfZHVwMgorI2RlZmluZSBTWVNfZXBvbGxfY3JlYXRlIF9fTlJfZXBvbGxfY3JlYXRlCisjZGVmaW5lIFNZU19lcG9sbF9jdGwgX19OUl9lcG9sbF9jdGwKKyNkZWZpbmUgU1lTX2Vwb2xsX3B3YWl0IF9fTlJfZXBvbGxfcHdhaXQKKyNkZWZpbmUgU1lTX2Vwb2xsX3dhaXQgX19OUl9lcG9sbF93YWl0CisjZGVmaW5lIFNZU19ldmVudGZkIF9fTlJfZXZlbnRmZAorI2RlZmluZSBTWVNfZXhlY3ZlIF9fTlJfZXhlY3ZlCisjZGVmaW5lIFNZU19leGl0IF9fTlJfZXhpdAorI2RlZmluZSBTWVNfZXhpdF9ncm91cCBfX05SX2V4aXRfZ3JvdXAKKyNkZWZpbmUgU1lTX2ZhY2Nlc3NhdCBfX05SX2ZhY2Nlc3NhdAorI2RlZmluZSBTWVNfZmFkdmlzZTY0IF9fTlJfZmFkdmlzZTY0CisjZGVmaW5lIFNZU19mYWxsb2NhdGUgX19OUl9mYWxsb2NhdGUKKyNkZWZpbmUgU1lTX2ZjaGRpciBfX05SX2ZjaGRpcgorI2RlZmluZSBTWVNfZmNobW9kIF9fTlJfZmNobW9kCisjZGVmaW5lIFNZU19mY2htb2RhdCBfX05SX2ZjaG1vZGF0CisjZGVmaW5lIFNZU19mY2hvd24gX19OUl9mY2hvd24KKyNkZWZpbmUgU1lTX2ZjaG93bmF0IF9fTlJfZmNob3duYXQKKyNkZWZpbmUgU1lTX2ZjbnRsIF9fTlJfZmNudGwKKyNkZWZpbmUgU1lTX2ZkYXRhc3luYyBfX05SX2ZkYXRhc3luYworI2RlZmluZSBTWVNfZmdldHhhdHRyIF9fTlJfZmdldHhhdHRyCisjZGVmaW5lIFNZU19mbGlzdHhhdHRyIF9fTlJfZmxpc3R4YXR0cgorI2RlZmluZSBTWVNfZmxvY2sgX19OUl9mbG9jaworI2RlZmluZSBTWVNfZm9yayBfX05SX2ZvcmsKKyNkZWZpbmUgU1lTX2ZyZW1vdmV4YXR0ciBfX05SX2ZyZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfZnNldHhhdHRyIF9fTlJfZnNldHhhdHRyCisjZGVmaW5lIFNZU19mc3RhdCBfX05SX2ZzdGF0CisjZGVmaW5lIFNZU19mc3RhdGZzIF9fTlJfZnN0YXRmcworI2RlZmluZSBTWVNfZnN5bmMgX19OUl9mc3luYworI2RlZmluZSBTWVNfZnRydW5jYXRlIF9fTlJfZnRydW5jYXRlCisjZGVmaW5lIFNZU19mdXRleCBfX05SX2Z1dGV4CisjZGVmaW5lIFNZU19mdXRpbWVzYXQgX19OUl9mdXRpbWVzYXQKKyNkZWZpbmUgU1lTX2dldF9rZXJuZWxfc3ltcyBfX05SX2dldF9rZXJuZWxfc3ltcworI2RlZmluZSBTWVNfZ2V0X21lbXBvbGljeSBfX05SX2dldF9tZW1wb2xpY3kKKyNkZWZpbmUgU1lTX2dldF9yb2J1c3RfbGlzdCBfX05SX2dldF9yb2J1c3RfbGlzdAorI2RlZmluZSBTWVNfZ2V0X3RocmVhZF9hcmVhIF9fTlJfZ2V0X3RocmVhZF9hcmVhCisjZGVmaW5lIFNZU19nZXRjd2QgX19OUl9nZXRjd2QKKyNkZWZpbmUgU1lTX2dldGRlbnRzIF9fTlJfZ2V0ZGVudHMKKyNkZWZpbmUgU1lTX2dldGRlbnRzNjQgX19OUl9nZXRkZW50czY0CisjZGVmaW5lIFNZU19nZXRlZ2lkIF9fTlJfZ2V0ZWdpZAorI2RlZmluZSBTWVNfZ2V0ZXVpZCBfX05SX2dldGV1aWQKKyNkZWZpbmUgU1lTX2dldGdpZCBfX05SX2dldGdpZAorI2RlZmluZSBTWVNfZ2V0Z3JvdXBzIF9fTlJfZ2V0Z3JvdXBzCisjZGVmaW5lIFNZU19nZXRpdGltZXIgX19OUl9nZXRpdGltZXIKKyNkZWZpbmUgU1lTX2dldHBnaWQgX19OUl9nZXRwZ2lkCisjZGVmaW5lIFNZU19nZXRwZ3JwIF9fTlJfZ2V0cGdycAorI2RlZmluZSBTWVNfZ2V0cGlkIF9fTlJfZ2V0cGlkCisjZGVmaW5lIFNZU19nZXRwbXNnIF9fTlJfZ2V0cG1zZworI2RlZmluZSBTWVNfZ2V0cHBpZCBfX05SX2dldHBwaWQKKyNkZWZpbmUgU1lTX2dldHByaW9yaXR5IF9fTlJfZ2V0cHJpb3JpdHkKKyNkZWZpbmUgU1lTX2dldHJlc2dpZCBfX05SX2dldHJlc2dpZAorI2RlZmluZSBTWVNfZ2V0cmVzdWlkIF9fTlJfZ2V0cmVzdWlkCisjZGVmaW5lIFNZU19nZXRybGltaXQgX19OUl9nZXRybGltaXQKKyNkZWZpbmUgU1lTX2dldHJ1c2FnZSBfX05SX2dldHJ1c2FnZQorI2RlZmluZSBTWVNfZ2V0c2lkIF9fTlJfZ2V0c2lkCisjZGVmaW5lIFNZU19nZXR0aWQgX19OUl9nZXR0aWQKKyNkZWZpbmUgU1lTX2dldHRpbWVvZmRheSBfX05SX2dldHRpbWVvZmRheQorI2RlZmluZSBTWVNfZ2V0dWlkIF9fTlJfZ2V0dWlkCisjZGVmaW5lIFNZU19nZXR4YXR0ciBfX05SX2dldHhhdHRyCisjZGVmaW5lIFNZU19pbml0X21vZHVsZSBfX05SX2luaXRfbW9kdWxlCisjZGVmaW5lIFNZU19pbm90aWZ5X2FkZF93YXRjaCBfX05SX2lub3RpZnlfYWRkX3dhdGNoCisjZGVmaW5lIFNZU19pbm90aWZ5X2luaXQgX19OUl9pbm90aWZ5X2luaXQKKyNkZWZpbmUgU1lTX2lub3RpZnlfcm1fd2F0Y2ggX19OUl9pbm90aWZ5X3JtX3dhdGNoCisjZGVmaW5lIFNZU19pb19jYW5jZWwgX19OUl9pb19jYW5jZWwKKyNkZWZpbmUgU1lTX2lvX2Rlc3Ryb3kgX19OUl9pb19kZXN0cm95CisjZGVmaW5lIFNZU19pb19nZXRldmVudHMgX19OUl9pb19nZXRldmVudHMKKyNkZWZpbmUgU1lTX2lvX3NldHVwIF9fTlJfaW9fc2V0dXAKKyNkZWZpbmUgU1lTX2lvX3N1Ym1pdCBfX05SX2lvX3N1Ym1pdAorI2RlZmluZSBTWVNfaW9jdGwgX19OUl9pb2N0bAorI2RlZmluZSBTWVNfaW9wZXJtIF9fTlJfaW9wZXJtCisjZGVmaW5lIFNZU19pb3BsIF9fTlJfaW9wbAorI2RlZmluZSBTWVNfaW9wcmlvX2dldCBfX05SX2lvcHJpb19nZXQKKyNkZWZpbmUgU1lTX2lvcHJpb19zZXQgX19OUl9pb3ByaW9fc2V0CisjZGVmaW5lIFNZU19rZXhlY19sb2FkIF9fTlJfa2V4ZWNfbG9hZAorI2RlZmluZSBTWVNfa2V5Y3RsIF9fTlJfa2V5Y3RsCisjZGVmaW5lIFNZU19raWxsIF9fTlJfa2lsbAorI2RlZmluZSBTWVNfbGNob3duIF9fTlJfbGNob3duCisjZGVmaW5lIFNZU19sZ2V0eGF0dHIgX19OUl9sZ2V0eGF0dHIKKyNkZWZpbmUgU1lTX2xpbmsgX19OUl9saW5rCisjZGVmaW5lIFNZU19saW5rYXQgX19OUl9saW5rYXQKKyNkZWZpbmUgU1lTX2xpc3R4YXR0ciBfX05SX2xpc3R4YXR0cgorI2RlZmluZSBTWVNfbGxpc3R4YXR0ciBfX05SX2xsaXN0eGF0dHIKKyNkZWZpbmUgU1lTX2xvb2t1cF9kY29va2llIF9fTlJfbG9va3VwX2Rjb29raWUKKyNkZWZpbmUgU1lTX2xyZW1vdmV4YXR0ciBfX05SX2xyZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfbHNlZWsgX19OUl9sc2VlaworI2RlZmluZSBTWVNfbHNldHhhdHRyIF9fTlJfbHNldHhhdHRyCisjZGVmaW5lIFNZU19sc3RhdCBfX05SX2xzdGF0CisjZGVmaW5lIFNZU19tYWR2aXNlIF9fTlJfbWFkdmlzZQorI2RlZmluZSBTWVNfbWJpbmQgX19OUl9tYmluZAorI2RlZmluZSBTWVNfbWlncmF0ZV9wYWdlcyBfX05SX21pZ3JhdGVfcGFnZXMKKyNkZWZpbmUgU1lTX21pbmNvcmUgX19OUl9taW5jb3JlCisjZGVmaW5lIFNZU19ta2RpciBfX05SX21rZGlyCisjZGVmaW5lIFNZU19ta2RpcmF0IF9fTlJfbWtkaXJhdAorI2RlZmluZSBTWVNfbWtub2QgX19OUl9ta25vZAorI2RlZmluZSBTWVNfbWtub2RhdCBfX05SX21rbm9kYXQKKyNkZWZpbmUgU1lTX21sb2NrIF9fTlJfbWxvY2sKKyNkZWZpbmUgU1lTX21sb2NrYWxsIF9fTlJfbWxvY2thbGwKKyNkZWZpbmUgU1lTX21tYXAgX19OUl9tbWFwCisjZGVmaW5lIFNZU19tb2RpZnlfbGR0IF9fTlJfbW9kaWZ5X2xkdAorI2RlZmluZSBTWVNfbW91bnQgX19OUl9tb3VudAorI2RlZmluZSBTWVNfbW92ZV9wYWdlcyBfX05SX21vdmVfcGFnZXMKKyNkZWZpbmUgU1lTX21wcm90ZWN0IF9fTlJfbXByb3RlY3QKKyNkZWZpbmUgU1lTX21xX2dldHNldGF0dHIgX19OUl9tcV9nZXRzZXRhdHRyCisjZGVmaW5lIFNZU19tcV9ub3RpZnkgX19OUl9tcV9ub3RpZnkKKyNkZWZpbmUgU1lTX21xX29wZW4gX19OUl9tcV9vcGVuCisjZGVmaW5lIFNZU19tcV90aW1lZHJlY2VpdmUgX19OUl9tcV90aW1lZHJlY2VpdmUKKyNkZWZpbmUgU1lTX21xX3RpbWVkc2VuZCBfX05SX21xX3RpbWVkc2VuZAorI2RlZmluZSBTWVNfbXFfdW5saW5rIF9fTlJfbXFfdW5saW5rCisjZGVmaW5lIFNZU19tcmVtYXAgX19OUl9tcmVtYXAKKyNkZWZpbmUgU1lTX21zeW5jIF9fTlJfbXN5bmMKKyNkZWZpbmUgU1lTX211bmxvY2sgX19OUl9tdW5sb2NrCisjZGVmaW5lIFNZU19tdW5sb2NrYWxsIF9fTlJfbXVubG9ja2FsbAorI2RlZmluZSBTWVNfbXVubWFwIF9fTlJfbXVubWFwCisjZGVmaW5lIFNZU19uYW5vc2xlZXAgX19OUl9uYW5vc2xlZXAKKyNkZWZpbmUgU1lTX25mc3NlcnZjdGwgX19OUl9uZnNzZXJ2Y3RsCisjZGVmaW5lIFNZU19vcGVuIF9fTlJfb3BlbgorI2RlZmluZSBTWVNfb3BlbmF0IF9fTlJfb3BlbmF0CisjZGVmaW5lIFNZU19wYXVzZSBfX05SX3BhdXNlCisjZGVmaW5lIFNZU19wZXJzb25hbGl0eSBfX05SX3BlcnNvbmFsaXR5CisjZGVmaW5lIFNZU19waXBlIF9fTlJfcGlwZQorI2RlZmluZSBTWVNfcGl2b3Rfcm9vdCBfX05SX3Bpdm90X3Jvb3QKKyNkZWZpbmUgU1lTX3BvbGwgX19OUl9wb2xsCisjZGVmaW5lIFNZU19wcG9sbCBfX05SX3Bwb2xsCisjZGVmaW5lIFNZU19wcmN0bCBfX05SX3ByY3RsCisjZGVmaW5lIFNZU19wcmVhZDY0IF9fTlJfcHJlYWQ2NAorI2RlZmluZSBTWVNfcHNlbGVjdDYgX19OUl9wc2VsZWN0NgorI2RlZmluZSBTWVNfcHRyYWNlIF9fTlJfcHRyYWNlCisjZGVmaW5lIFNZU19wdXRwbXNnIF9fTlJfcHV0cG1zZworI2RlZmluZSBTWVNfcHdyaXRlNjQgX19OUl9wd3JpdGU2NAorI2RlZmluZSBTWVNfcXVlcnlfbW9kdWxlIF9fTlJfcXVlcnlfbW9kdWxlCisjZGVmaW5lIFNZU19xdW90YWN0bCBfX05SX3F1b3RhY3RsCisjZGVmaW5lIFNZU19yZWFkIF9fTlJfcmVhZAorI2RlZmluZSBTWVNfcmVhZGFoZWFkIF9fTlJfcmVhZGFoZWFkCisjZGVmaW5lIFNZU19yZWFkbGluayBfX05SX3JlYWRsaW5rCisjZGVmaW5lIFNZU19yZWFkbGlua2F0IF9fTlJfcmVhZGxpbmthdAorI2RlZmluZSBTWVNfcmVhZHYgX19OUl9yZWFkdgorI2RlZmluZSBTWVNfcmVib290IF9fTlJfcmVib290CisjZGVmaW5lIFNZU19yZW1hcF9maWxlX3BhZ2VzIF9fTlJfcmVtYXBfZmlsZV9wYWdlcworI2RlZmluZSBTWVNfcmVtb3ZleGF0dHIgX19OUl9yZW1vdmV4YXR0cgorI2RlZmluZSBTWVNfcmVuYW1lIF9fTlJfcmVuYW1lCisjZGVmaW5lIFNZU19yZW5hbWVhdCBfX05SX3JlbmFtZWF0CisjZGVmaW5lIFNZU19yZXF1ZXN0X2tleSBfX05SX3JlcXVlc3Rfa2V5CisjZGVmaW5lIFNZU19yZXN0YXJ0X3N5c2NhbGwgX19OUl9yZXN0YXJ0X3N5c2NhbGwKKyNkZWZpbmUgU1lTX3JtZGlyIF9fTlJfcm1kaXIKKyNkZWZpbmUgU1lTX3J0X3NpZ2FjdGlvbiBfX05SX3J0X3NpZ2FjdGlvbgorI2RlZmluZSBTWVNfcnRfc2lncGVuZGluZyBfX05SX3J0X3NpZ3BlbmRpbmcKKyNkZWZpbmUgU1lTX3J0X3NpZ3Byb2NtYXNrIF9fTlJfcnRfc2lncHJvY21hc2sKKyNkZWZpbmUgU1lTX3J0X3NpZ3F1ZXVlaW5mbyBfX05SX3J0X3NpZ3F1ZXVlaW5mbworI2RlZmluZSBTWVNfcnRfc2lncmV0dXJuIF9fTlJfcnRfc2lncmV0dXJuCisjZGVmaW5lIFNZU19ydF9zaWdzdXNwZW5kIF9fTlJfcnRfc2lnc3VzcGVuZAorI2RlZmluZSBTWVNfcnRfc2lndGltZWR3YWl0IF9fTlJfcnRfc2lndGltZWR3YWl0CisjZGVmaW5lIFNZU19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4IF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAorI2RlZmluZSBTWVNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9taW4KKyNkZWZpbmUgU1lTX3NjaGVkX2dldGFmZmluaXR5IF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyNkZWZpbmUgU1lTX3NjaGVkX2dldHBhcmFtIF9fTlJfc2NoZWRfZ2V0cGFyYW0KKyNkZWZpbmUgU1lTX3NjaGVkX2dldHNjaGVkdWxlciBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgorI2RlZmluZSBTWVNfc2NoZWRfcnJfZ2V0X2ludGVydmFsIF9fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsCisjZGVmaW5lIFNZU19zY2hlZF9zZXRhZmZpbml0eSBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjZGVmaW5lIFNZU19zY2hlZF9zZXRwYXJhbSBfX05SX3NjaGVkX3NldHBhcmFtCisjZGVmaW5lIFNZU19zY2hlZF9zZXRzY2hlZHVsZXIgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIKKyNkZWZpbmUgU1lTX3NjaGVkX3lpZWxkIF9fTlJfc2NoZWRfeWllbGQKKyNkZWZpbmUgU1lTX3NlbGVjdCBfX05SX3NlbGVjdAorI2RlZmluZSBTWVNfc2VuZGZpbGUgX19OUl9zZW5kZmlsZQorI2RlZmluZSBTWVNfc2V0X21lbXBvbGljeSBfX05SX3NldF9tZW1wb2xpY3kKKyNkZWZpbmUgU1lTX3NldF9yb2J1c3RfbGlzdCBfX05SX3NldF9yb2J1c3RfbGlzdAorI2RlZmluZSBTWVNfc2V0X3RocmVhZF9hcmVhIF9fTlJfc2V0X3RocmVhZF9hcmVhCisjZGVmaW5lIFNZU19zZXRfdGlkX2FkZHJlc3MgX19OUl9zZXRfdGlkX2FkZHJlc3MKKyNkZWZpbmUgU1lTX3NldGRvbWFpbm5hbWUgX19OUl9zZXRkb21haW5uYW1lCisjZGVmaW5lIFNZU19zZXRmc2dpZCBfX05SX3NldGZzZ2lkCisjZGVmaW5lIFNZU19zZXRmc3VpZCBfX05SX3NldGZzdWlkCisjZGVmaW5lIFNZU19zZXRnaWQgX19OUl9zZXRnaWQKKyNkZWZpbmUgU1lTX3NldGdyb3VwcyBfX05SX3NldGdyb3VwcworI2RlZmluZSBTWVNfc2V0aG9zdG5hbWUgX19OUl9zZXRob3N0bmFtZQorI2RlZmluZSBTWVNfc2V0aXRpbWVyIF9fTlJfc2V0aXRpbWVyCisjZGVmaW5lIFNZU19zZXRwZ2lkIF9fTlJfc2V0cGdpZAorI2RlZmluZSBTWVNfc2V0cHJpb3JpdHkgX19OUl9zZXRwcmlvcml0eQorI2RlZmluZSBTWVNfc2V0cmVnaWQgX19OUl9zZXRyZWdpZAorI2RlZmluZSBTWVNfc2V0cmVzZ2lkIF9fTlJfc2V0cmVzZ2lkCisjZGVmaW5lIFNZU19zZXRyZXN1aWQgX19OUl9zZXRyZXN1aWQKKyNkZWZpbmUgU1lTX3NldHJldWlkIF9fTlJfc2V0cmV1aWQKKyNkZWZpbmUgU1lTX3NldHJsaW1pdCBfX05SX3NldHJsaW1pdAorI2RlZmluZSBTWVNfc2V0c2lkIF9fTlJfc2V0c2lkCisjZGVmaW5lIFNZU19zZXR0aW1lb2ZkYXkgX19OUl9zZXR0aW1lb2ZkYXkKKyNkZWZpbmUgU1lTX3NldHVpZCBfX05SX3NldHVpZAorI2RlZmluZSBTWVNfc2V0eGF0dHIgX19OUl9zZXR4YXR0cgorI2RlZmluZSBTWVNfc2lnYWx0c3RhY2sgX19OUl9zaWdhbHRzdGFjaworI2RlZmluZSBTWVNfc2lnbmFsZmQgX19OUl9zaWduYWxmZAorI2RlZmluZSBTWVNfc3BsaWNlIF9fTlJfc3BsaWNlCisjZGVmaW5lIFNZU19zdGF0IF9fTlJfc3RhdAorI2RlZmluZSBTWVNfc3RhdGZzIF9fTlJfc3RhdGZzCisjZGVmaW5lIFNZU19zd2Fwb2ZmIF9fTlJfc3dhcG9mZgorI2RlZmluZSBTWVNfc3dhcG9uIF9fTlJfc3dhcG9uCisjZGVmaW5lIFNZU19zeW1saW5rIF9fTlJfc3ltbGluaworI2RlZmluZSBTWVNfc3ltbGlua2F0IF9fTlJfc3ltbGlua2F0CisjZGVmaW5lIFNZU19zeW5jIF9fTlJfc3luYworI2RlZmluZSBTWVNfc3luY19maWxlX3JhbmdlIF9fTlJfc3luY19maWxlX3JhbmdlCisjZGVmaW5lIFNZU19zeXNmcyBfX05SX3N5c2ZzCisjZGVmaW5lIFNZU19zeXNpbmZvIF9fTlJfc3lzaW5mbworI2RlZmluZSBTWVNfc3lzbG9nIF9fTlJfc3lzbG9nCisjZGVmaW5lIFNZU190ZWUgX19OUl90ZWUKKyNkZWZpbmUgU1lTX3Rna2lsbCBfX05SX3Rna2lsbAorI2RlZmluZSBTWVNfdGltZSBfX05SX3RpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX2NyZWF0ZSBfX05SX3RpbWVyX2NyZWF0ZQorI2RlZmluZSBTWVNfdGltZXJfZGVsZXRlIF9fTlJfdGltZXJfZGVsZXRlCisjZGVmaW5lIFNZU190aW1lcl9nZXRvdmVycnVuIF9fTlJfdGltZXJfZ2V0b3ZlcnJ1bgorI2RlZmluZSBTWVNfdGltZXJfZ2V0dGltZSBfX05SX3RpbWVyX2dldHRpbWUKKyNkZWZpbmUgU1lTX3RpbWVyX3NldHRpbWUgX19OUl90aW1lcl9zZXR0aW1lCisjZGVmaW5lIFNZU190aW1lcmZkIF9fTlJfdGltZXJmZAorI2RlZmluZSBTWVNfdGltZXMgX19OUl90aW1lcworI2RlZmluZSBTWVNfdGtpbGwgX19OUl90a2lsbAorI2RlZmluZSBTWVNfdHJ1bmNhdGUgX19OUl90cnVuY2F0ZQorI2RlZmluZSBTWVNfdW1hc2sgX19OUl91bWFzaworI2RlZmluZSBTWVNfdW1vdW50MiBfX05SX3Vtb3VudDIKKyNkZWZpbmUgU1lTX3VuYW1lIF9fTlJfdW5hbWUKKyNkZWZpbmUgU1lTX3VubGluayBfX05SX3VubGluaworI2RlZmluZSBTWVNfdW5saW5rYXQgX19OUl91bmxpbmthdAorI2RlZmluZSBTWVNfdW5zaGFyZSBfX05SX3Vuc2hhcmUKKyNkZWZpbmUgU1lTX3VzZWxpYiBfX05SX3VzZWxpYgorI2RlZmluZSBTWVNfdXN0YXQgX19OUl91c3RhdAorI2RlZmluZSBTWVNfdXRpbWUgX19OUl91dGltZQorI2RlZmluZSBTWVNfdXRpbWVuc2F0IF9fTlJfdXRpbWVuc2F0CisjZGVmaW5lIFNZU191dGltZXMgX19OUl91dGltZXMKKyNkZWZpbmUgU1lTX3Zmb3JrIF9fTlJfdmZvcmsKKyNkZWZpbmUgU1lTX3ZoYW5ndXAgX19OUl92aGFuZ3VwCisjZGVmaW5lIFNZU192bXNwbGljZSBfX05SX3Ztc3BsaWNlCisjZGVmaW5lIFNZU192c2VydmVyIF9fTlJfdnNlcnZlcgorI2RlZmluZSBTWVNfd2FpdDQgX19OUl93YWl0NAorI2RlZmluZSBTWVNfd2FpdGlkIF9fTlJfd2FpdGlkCisjZGVmaW5lIFNZU193cml0ZSBfX05SX3dyaXRlCisjZGVmaW5lIFNZU193cml0ZXYgX19OUl93cml0ZXYKKyNpZiBfX1dPUkRTSVpFID09IDY0CisjZGVmaW5lIFNZU19hY2NlcHQgX19OUl9hY2NlcHQKKyNkZWZpbmUgU1lTX2FyY2hfcHJjdGwgX19OUl9hcmNoX3ByY3RsCisjZGVmaW5lIFNZU19iaW5kIF9fTlJfYmluZAorI2RlZmluZSBTWVNfY29ubmVjdCBfX05SX2Nvbm5lY3QKKyNkZWZpbmUgU1lTX2Vwb2xsX2N0bF9vbGQgX19OUl9lcG9sbF9jdGxfb2xkCisjZGVmaW5lIFNZU19lcG9sbF93YWl0X29sZCBfX05SX2Vwb2xsX3dhaXRfb2xkCisjZGVmaW5lIFNZU19nZXRwZWVybmFtZSBfX05SX2dldHBlZXJuYW1lCisjZGVmaW5lIFNZU19nZXRzb2NrbmFtZSBfX05SX2dldHNvY2tuYW1lCisjZGVmaW5lIFNZU19nZXRzb2Nrb3B0IF9fTlJfZ2V0c29ja29wdAorI2RlZmluZSBTWVNfbGlzdGVuIF9fTlJfbGlzdGVuCisjZGVmaW5lIFNZU19tc2djdGwgX19OUl9tc2djdGwKKyNkZWZpbmUgU1lTX21zZ2dldCBfX05SX21zZ2dldAorI2RlZmluZSBTWVNfbXNncmN2IF9fTlJfbXNncmN2CisjZGVmaW5lIFNZU19tc2dzbmQgX19OUl9tc2dzbmQKKyNkZWZpbmUgU1lTX25ld2ZzdGF0YXQgX19OUl9uZXdmc3RhdGF0CisjZGVmaW5lIFNZU19yZWN2ZnJvbSBfX05SX3JlY3Zmcm9tCisjZGVmaW5lIFNZU19yZWN2bXNnIF9fTlJfcmVjdm1zZworI2RlZmluZSBTWVNfc2VjdXJpdHkgX19OUl9zZWN1cml0eQorI2RlZmluZSBTWVNfc2VtY3RsIF9fTlJfc2VtY3RsCisjZGVmaW5lIFNZU19zZW1nZXQgX19OUl9zZW1nZXQKKyNkZWZpbmUgU1lTX3NlbW9wIF9fTlJfc2Vtb3AKKyNkZWZpbmUgU1lTX3NlbXRpbWVkb3AgX19OUl9zZW10aW1lZG9wCisjZGVmaW5lIFNZU19zZW5kbXNnIF9fTlJfc2VuZG1zZworI2RlZmluZSBTWVNfc2VuZHRvIF9fTlJfc2VuZHRvCisjZGVmaW5lIFNZU19zZXRzb2Nrb3B0IF9fTlJfc2V0c29ja29wdAorI2RlZmluZSBTWVNfc2htYXQgX19OUl9zaG1hdAorI2RlZmluZSBTWVNfc2htY3RsIF9fTlJfc2htY3RsCisjZGVmaW5lIFNZU19zaG1kdCBfX05SX3NobWR0CisjZGVmaW5lIFNZU19zaG1nZXQgX19OUl9zaG1nZXQKKyNkZWZpbmUgU1lTX3NodXRkb3duIF9fTlJfc2h1dGRvd24KKyNkZWZpbmUgU1lTX3NvY2tldCBfX05SX3NvY2tldAorI2RlZmluZSBTWVNfc29ja2V0cGFpciBfX05SX3NvY2tldHBhaXIKKyNkZWZpbmUgU1lTX3R1eGNhbGwgX19OUl90dXhjYWxsCisjZWxzZQorI2RlZmluZSBTWVNfX2xsc2VlayBfX05SX19sbHNlZWsKKyNkZWZpbmUgU1lTX19uZXdzZWxlY3QgX19OUl9fbmV3c2VsZWN0CisjZGVmaW5lIFNZU19iZGZsdXNoIF9fTlJfYmRmbHVzaAorI2RlZmluZSBTWVNfYnJlYWsgX19OUl9icmVhaworI2RlZmluZSBTWVNfY2hvd24zMiBfX05SX2Nob3duMzIKKyNkZWZpbmUgU1lTX2ZhZHZpc2U2NF82NCBfX05SX2ZhZHZpc2U2NF82NAorI2RlZmluZSBTWVNfZmNob3duMzIgX19OUl9mY2hvd24zMgorI2RlZmluZSBTWVNfZmNudGw2NCBfX05SX2ZjbnRsNjQKKyNkZWZpbmUgU1lTX2ZzdGF0NjQgX19OUl9mc3RhdDY0CisjZGVmaW5lIFNZU19mc3RhdGF0NjQgX19OUl9mc3RhdGF0NjQKKyNkZWZpbmUgU1lTX2ZzdGF0ZnM2NCBfX05SX2ZzdGF0ZnM2NAorI2RlZmluZSBTWVNfZnRpbWUgX19OUl9mdGltZQorI2RlZmluZSBTWVNfZnRydW5jYXRlNjQgX19OUl9mdHJ1bmNhdGU2NAorI2RlZmluZSBTWVNfZ2V0Y3B1IF9fTlJfZ2V0Y3B1CisjZGVmaW5lIFNZU19nZXRlZ2lkMzIgX19OUl9nZXRlZ2lkMzIKKyNkZWZpbmUgU1lTX2dldGV1aWQzMiBfX05SX2dldGV1aWQzMgorI2RlZmluZSBTWVNfZ2V0Z2lkMzIgX19OUl9nZXRnaWQzMgorI2RlZmluZSBTWVNfZ2V0Z3JvdXBzMzIgX19OUl9nZXRncm91cHMzMgorI2RlZmluZSBTWVNfZ2V0cmVzZ2lkMzIgX19OUl9nZXRyZXNnaWQzMgorI2RlZmluZSBTWVNfZ2V0cmVzdWlkMzIgX19OUl9nZXRyZXN1aWQzMgorI2RlZmluZSBTWVNfZ2V0dWlkMzIgX19OUl9nZXR1aWQzMgorI2RlZmluZSBTWVNfZ3R0eSBfX05SX2d0dHkKKyNkZWZpbmUgU1lTX2lkbGUgX19OUl9pZGxlCisjZGVmaW5lIFNZU19pcGMgX19OUl9pcGMKKyNkZWZpbmUgU1lTX2xjaG93bjMyIF9fTlJfbGNob3duMzIKKyNkZWZpbmUgU1lTX2xvY2sgX19OUl9sb2NrCisjZGVmaW5lIFNZU19sc3RhdDY0IF9fTlJfbHN0YXQ2NAorI2RlZmluZSBTWVNfbWFkdmlzZTEgX19OUl9tYWR2aXNlMQorI2RlZmluZSBTWVNfbW1hcDIgX19OUl9tbWFwMgorI2RlZmluZSBTWVNfbXB4IF9fTlJfbXB4CisjZGVmaW5lIFNZU19uaWNlIF9fTlJfbmljZQorI2RlZmluZSBTWVNfb2xkZnN0YXQgX19OUl9vbGRmc3RhdAorI2RlZmluZSBTWVNfb2xkbHN0YXQgX19OUl9vbGRsc3RhdAorI2RlZmluZSBTWVNfb2xkb2xkdW5hbWUgX19OUl9vbGRvbGR1bmFtZQorI2RlZmluZSBTWVNfb2xkc3RhdCBfX05SX29sZHN0YXQKKyNkZWZpbmUgU1lTX29sZHVuYW1lIF9fTlJfb2xkdW5hbWUKKyNkZWZpbmUgU1lTX3Byb2YgX19OUl9wcm9mCisjZGVmaW5lIFNZU19wcm9maWwgX19OUl9wcm9maWwKKyNkZWZpbmUgU1lTX3JlYWRkaXIgX19OUl9yZWFkZGlyCisjZGVmaW5lIFNZU19zZW5kZmlsZTY0IF9fTlJfc2VuZGZpbGU2NAorI2RlZmluZSBTWVNfc2V0ZnNnaWQzMiBfX05SX3NldGZzZ2lkMzIKKyNkZWZpbmUgU1lTX3NldGZzdWlkMzIgX19OUl9zZXRmc3VpZDMyCisjZGVmaW5lIFNZU19zZXRnaWQzMiBfX05SX3NldGdpZDMyCisjZGVmaW5lIFNZU19zZXRncm91cHMzMiBfX05SX3NldGdyb3VwczMyCisjZGVmaW5lIFNZU19zZXRyZWdpZDMyIF9fTlJfc2V0cmVnaWQzMgorI2RlZmluZSBTWVNfc2V0cmVzZ2lkMzIgX19OUl9zZXRyZXNnaWQzMgorI2RlZmluZSBTWVNfc2V0cmVzdWlkMzIgX19OUl9zZXRyZXN1aWQzMgorI2RlZmluZSBTWVNfc2V0cmV1aWQzMiBfX05SX3NldHJldWlkMzIKKyNkZWZpbmUgU1lTX3NldHVpZDMyIF9fTlJfc2V0dWlkMzIKKyNkZWZpbmUgU1lTX3NnZXRtYXNrIF9fTlJfc2dldG1hc2sKKyNkZWZpbmUgU1lTX3NpZ2FjdGlvbiBfX05SX3NpZ2FjdGlvbgorI2RlZmluZSBTWVNfc2lnbmFsIF9fTlJfc2lnbmFsCisjZGVmaW5lIFNZU19zaWdwZW5kaW5nIF9fTlJfc2lncGVuZGluZworI2RlZmluZSBTWVNfc2lncHJvY21hc2sgX19OUl9zaWdwcm9jbWFzaworI2RlZmluZSBTWVNfc2lncmV0dXJuIF9fTlJfc2lncmV0dXJuCisjZGVmaW5lIFNZU19zaWdzdXNwZW5kIF9fTlJfc2lnc3VzcGVuZAorI2RlZmluZSBTWVNfc29ja2V0Y2FsbCBfX05SX3NvY2tldGNhbGwKKyNkZWZpbmUgU1lTX3NzZXRtYXNrIF9fTlJfc3NldG1hc2sKKyNkZWZpbmUgU1lTX3N0YXQ2NCBfX05SX3N0YXQ2NAorI2RlZmluZSBTWVNfc3RhdGZzNjQgX19OUl9zdGF0ZnM2NAorI2RlZmluZSBTWVNfc3RpbWUgX19OUl9zdGltZQorI2RlZmluZSBTWVNfc3R0eSBfX05SX3N0dHkKKyNkZWZpbmUgU1lTX3RydW5jYXRlNjQgX19OUl90cnVuY2F0ZTY0CisjZGVmaW5lIFNZU191Z2V0cmxpbWl0IF9fTlJfdWdldHJsaW1pdAorI2RlZmluZSBTWVNfdWxpbWl0IF9fTlJfdWxpbWl0CisjZGVmaW5lIFNZU191bW91bnQgX19OUl91bW91bnQKKyNkZWZpbmUgU1lTX3ZtODYgX19OUl92bTg2CisjZGVmaW5lIFNZU192bTg2b2xkIF9fTlJfdm04Nm9sZAorI2RlZmluZSBTWVNfd2FpdHBpZCBfX05SX3dhaXRwaWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c2xvZy1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3lzbG9nLWxkYmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTRlNzBjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c2xvZy1sZGJsLmgKQEAgLTAsMCArMSwzNiBAQAorLyogLW1sb25nLWRvdWJsZS02NCBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIHN5c2xvZyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zeXNsb2ctbGRibC5oPiBkaXJlY3RseTsgdXNlIDxzeXMvc3lzbG9nLmg+IGluc3RlYWQuIgorI2VuZGlmCisKK19fTERCTF9SRURJUl9ERUNMIChzeXNsb2cpCisKKyNpZmRlZiBfX1VTRV9CU0QKK19fTERCTF9SRURJUl9ERUNMICh2c3lzbG9nKQorI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3N5c2xvZ19jaGspCisKKyMgaWZkZWYgX19VU0VfQlNECitfX0xEQkxfUkVESVJfREVDTCAoX192c3lzbG9nX2NoaykKKyMgZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c2xvZy1wYXRoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3lzbG9nLXBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJiZDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3N5c2xvZy1wYXRoLmgKQEAgLTAsMCArMSwyOSBAQAorLyogPGJpdHMvc3lzbG9nLXBhdGguaD4gLS0gX1BBVEhfTE9HIGRlZmluaXRpb24KKyAgIENvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NZU0xPR19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gIFVzZSA8c3lzL3N5c2xvZy5oPiBpbnN0ZWFkIgorI2VuZGlmCisKKyNpZm5kZWYgX0JJVFNfU1lTTE9HX1BBVEhfSAorI2RlZmluZSBfQklUU19TWVNMT0dfUEFUSF9IIDEKKworI2RlZmluZQlfUEFUSF9MT0cJIi9kZXYvbG9nIgorCisjZW5kaWYgLyogYml0cy9zeXNsb2ctcGF0aC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3lzbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvc3lzbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzYjMwYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy9zeXNsb2cuaApAQCAtMCwwICsxLDUwIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHN5c2xvZyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TWVNMT0dfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy9zeXNsb2cuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3N5c2xvZy5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKK2V4dGVybiB2b2lkIF9fc3lzbG9nX2NoayAoaW50IF9fcHJpLCBpbnQgX19mbGFnLCBfX2NvbnN0IGNoYXIgKl9fZm10LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworCisjaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSB2b2lkCitzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgLi4uKQoreworICByZXR1cm4gX19zeXNsb2dfY2hrIChfX3ByaSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKK30KKyNlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjIGRlZmluZSBzeXNsb2cocHJpLCAuLi4pIFwKKyAgX19zeXNsb2dfY2hrIChwcmksIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKK2V4dGVybiB2b2lkIF9fdnN5c2xvZ19jaGsgKGludCBfX3ByaSwgaW50IF9fZmxhZywgX19jb25zdCBjaGFyICpfX2ZtdCwKKwkJCSAgIF9fZ251Y192YV9saXN0IF9fYXApCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHZvaWQKK3ZzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdnN5c2xvZ19jaGsgKF9fcHJpLCAgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3Rlcm1pb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxZTRhZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy90ZXJtaW9zLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qIHRlcm1pb3MgdHlwZSBhbmQgbWFjcm8gZGVmaW5pdGlvbnMuICBMaW51eCB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAzLCAyMDA1CisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1RFUk1JT1NfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy90ZXJtaW9zLmg+IGRpcmVjdGx5OyB1c2UgPHRlcm1pb3MuaD4gaW5zdGVhZC4iCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCWNjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlzcGVlZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJdGNmbGFnX3Q7CisKKyNkZWZpbmUgTkNDUyAzMgorc3RydWN0IHRlcm1pb3MKKyAgeworICAgIHRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisgICAgdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisgICAgdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworICAgIHRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisgICAgY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisgICAgY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisgICAgc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisgICAgc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworI2RlZmluZSBfSEFWRV9TVFJVQ1RfVEVSTUlPU19DX0lTUEVFRCAxCisjZGVmaW5lIF9IQVZFX1NUUlVDVF9URVJNSU9TX0NfT1NQRUVEIDEKKyAgfTsKKworLyogY19jYyBjaGFyYWN0ZXJzICovCisjZGVmaW5lIFZJTlRSIDAKKyNkZWZpbmUgVlFVSVQgMQorI2RlZmluZSBWRVJBU0UgMgorI2RlZmluZSBWS0lMTCAzCisjZGVmaW5lIFZFT0YgNAorI2RlZmluZSBWVElNRSA1CisjZGVmaW5lIFZNSU4gNgorI2RlZmluZSBWU1dUQyA3CisjZGVmaW5lIFZTVEFSVCA4CisjZGVmaW5lIFZTVE9QIDkKKyNkZWZpbmUgVlNVU1AgMTAKKyNkZWZpbmUgVkVPTCAxMQorI2RlZmluZSBWUkVQUklOVCAxMgorI2RlZmluZSBWRElTQ0FSRCAxMworI2RlZmluZSBWV0VSQVNFIDE0CisjZGVmaW5lIFZMTkVYVCAxNQorI2RlZmluZSBWRU9MMiAxNgorCisvKiBjX2lmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSUdOQlJLCTAwMDAwMDEKKyNkZWZpbmUgQlJLSU5UCTAwMDAwMDIKKyNkZWZpbmUgSUdOUEFSCTAwMDAwMDQKKyNkZWZpbmUgUEFSTVJLCTAwMDAwMTAKKyNkZWZpbmUgSU5QQ0sJMDAwMDAyMAorI2RlZmluZSBJU1RSSVAJMDAwMDA0MAorI2RlZmluZSBJTkxDUgkwMDAwMTAwCisjZGVmaW5lIElHTkNSCTAwMDAyMDAKKyNkZWZpbmUgSUNSTkwJMDAwMDQwMAorI2RlZmluZSBJVUNMQwkwMDAxMDAwCisjZGVmaW5lIElYT04JMDAwMjAwMAorI2RlZmluZSBJWEFOWQkwMDA0MDAwCisjZGVmaW5lIElYT0ZGCTAwMTAwMDAKKyNkZWZpbmUgSU1BWEJFTAkwMDIwMDAwCisjZGVmaW5lIElVVEY4CTAwNDAwMDAKKworLyogY19vZmxhZyBiaXRzICovCisjZGVmaW5lIE9QT1NUCTAwMDAwMDEKKyNkZWZpbmUgT0xDVUMJMDAwMDAwMgorI2RlZmluZSBPTkxDUgkwMDAwMDA0CisjZGVmaW5lIE9DUk5MCTAwMDAwMTAKKyNkZWZpbmUgT05PQ1IJMDAwMDAyMAorI2RlZmluZSBPTkxSRVQJMDAwMDA0MAorI2RlZmluZSBPRklMTAkwMDAwMTAwCisjZGVmaW5lIE9GREVMCTAwMDAyMDAKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgTkxETFkJMDAwMDQwMAorIyBkZWZpbmUgICBOTDAJMDAwMDAwMAorIyBkZWZpbmUgICBOTDEJMDAwMDQwMAorIyBkZWZpbmUgQ1JETFkJMDAwMzAwMAorIyBkZWZpbmUgICBDUjAJMDAwMDAwMAorIyBkZWZpbmUgICBDUjEJMDAwMTAwMAorIyBkZWZpbmUgICBDUjIJMDAwMjAwMAorIyBkZWZpbmUgICBDUjMJMDAwMzAwMAorIyBkZWZpbmUgVEFCRExZCTAwMTQwMDAKKyMgZGVmaW5lICAgVEFCMAkwMDAwMDAwCisjIGRlZmluZSAgIFRBQjEJMDAwNDAwMAorIyBkZWZpbmUgICBUQUIyCTAwMTAwMDAKKyMgZGVmaW5lICAgVEFCMwkwMDE0MDAwCisjIGRlZmluZSBCU0RMWQkwMDIwMDAwCisjIGRlZmluZSAgIEJTMAkwMDAwMDAwCisjIGRlZmluZSAgIEJTMQkwMDIwMDAwCisjIGRlZmluZSBGRkRMWQkwMTAwMDAwCisjIGRlZmluZSAgIEZGMAkwMDAwMDAwCisjIGRlZmluZSAgIEZGMQkwMTAwMDAwCisjZW5kaWYKKworI2RlZmluZSBWVERMWQkwMDQwMDAwCisjZGVmaW5lICAgVlQwCTAwMDAwMDAKKyNkZWZpbmUgICBWVDEJMDA0MDAwMAorCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgWFRBQlMJMDAxNDAwMAorI2VuZGlmCisKKy8qIGNfY2ZsYWcgYml0IG1lYW5pbmcgKi8KKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBDQkFVRAkwMDEwMDE3CisjZW5kaWYKKyNkZWZpbmUgIEIwCTAwMDAwMDAJCS8qIGhhbmcgdXAgKi8KKyNkZWZpbmUgIEI1MAkwMDAwMDAxCisjZGVmaW5lICBCNzUJMDAwMDAwMgorI2RlZmluZSAgQjExMAkwMDAwMDAzCisjZGVmaW5lICBCMTM0CTAwMDAwMDQKKyNkZWZpbmUgIEIxNTAJMDAwMDAwNQorI2RlZmluZSAgQjIwMAkwMDAwMDA2CisjZGVmaW5lICBCMzAwCTAwMDAwMDcKKyNkZWZpbmUgIEI2MDAJMDAwMDAxMAorI2RlZmluZSAgQjEyMDAJMDAwMDAxMQorI2RlZmluZSAgQjE4MDAJMDAwMDAxMgorI2RlZmluZSAgQjI0MDAJMDAwMDAxMworI2RlZmluZSAgQjQ4MDAJMDAwMDAxNAorI2RlZmluZSAgQjk2MDAJMDAwMDAxNQorI2RlZmluZSAgQjE5MjAwCTAwMDAwMTYKKyNkZWZpbmUgIEIzODQwMAkwMDAwMDE3CisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgRVhUQSBCMTkyMDAKKyMgZGVmaW5lIEVYVEIgQjM4NDAwCisjZW5kaWYKKyNkZWZpbmUgQ1NJWkUJMDAwMDA2MAorI2RlZmluZSAgIENTNQkwMDAwMDAwCisjZGVmaW5lICAgQ1M2CTAwMDAwMjAKKyNkZWZpbmUgICBDUzcJMDAwMDA0MAorI2RlZmluZSAgIENTOAkwMDAwMDYwCisjZGVmaW5lIENTVE9QQgkwMDAwMTAwCisjZGVmaW5lIENSRUFECTAwMDAyMDAKKyNkZWZpbmUgUEFSRU5CCTAwMDA0MDAKKyNkZWZpbmUgUEFST0RECTAwMDEwMDAKKyNkZWZpbmUgSFVQQ0wJMDAwMjAwMAorI2RlZmluZSBDTE9DQUwJMDAwNDAwMAorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2VuZGlmCisjZGVmaW5lICBCNTc2MDAgICAwMDEwMDAxCisjZGVmaW5lICBCMTE1MjAwICAwMDEwMDAyCisjZGVmaW5lICBCMjMwNDAwICAwMDEwMDAzCisjZGVmaW5lICBCNDYwODAwICAwMDEwMDA0CisjZGVmaW5lICBCNTAwMDAwICAwMDEwMDA1CisjZGVmaW5lICBCNTc2MDAwICAwMDEwMDA2CisjZGVmaW5lICBCOTIxNjAwICAwMDEwMDA3CisjZGVmaW5lICBCMTAwMDAwMCAwMDEwMDEwCisjZGVmaW5lICBCMTE1MjAwMCAwMDEwMDExCisjZGVmaW5lICBCMTUwMDAwMCAwMDEwMDEyCisjZGVmaW5lICBCMjAwMDAwMCAwMDEwMDEzCisjZGVmaW5lICBCMjUwMDAwMCAwMDEwMDE0CisjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CisjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CisjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3CisjZGVmaW5lIF9fTUFYX0JBVUQgQjQwMDAwMDAKKyNpZmRlZiBfX1VTRV9NSVNDCisjIGRlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjIGRlZmluZSBDTVNQQVIgICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KKyMgZGVmaW5lIENSVFNDVFMgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCisjZW5kaWYKKworLyogY19sZmxhZyBiaXRzICovCisjZGVmaW5lIElTSUcJMDAwMDAwMQorI2RlZmluZSBJQ0FOT04JMDAwMDAwMgorI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjIGRlZmluZSBYQ0FTRQkwMDAwMDA0CisjZW5kaWYKKyNkZWZpbmUgRUNITwkwMDAwMDEwCisjZGVmaW5lIEVDSE9FCTAwMDAwMjAKKyNkZWZpbmUgRUNIT0sJMDAwMDA0MAorI2RlZmluZSBFQ0hPTkwJMDAwMDEwMAorI2RlZmluZSBOT0ZMU0gJMDAwMDIwMAorI2RlZmluZSBUT1NUT1AJMDAwMDQwMAorI2lmZGVmIF9fVVNFX01JU0MKKyMgZGVmaW5lIEVDSE9DVEwgMDAwMTAwMAorIyBkZWZpbmUgRUNIT1BSVCAwMDAyMDAwCisjIGRlZmluZSBFQ0hPS0UJIDAwMDQwMDAKKyMgZGVmaW5lIEZMVVNITwkgMDAxMDAwMAorIyBkZWZpbmUgUEVORElOCSAwMDQwMDAwCisjZW5kaWYKKyNkZWZpbmUgSUVYVEVOCTAxMDAwMDAKKworLyogdGNmbG93KCkgYW5kIFRDWE9OQyB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENPT0ZGCQkwCisjZGVmaW5lCVRDT09OCQkxCisjZGVmaW5lCVRDSU9GRgkJMgorI2RlZmluZQlUQ0lPTgkJMworCisvKiB0Y2ZsdXNoKCkgYW5kIFRDRkxTSCB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENJRkxVU0gJMAorI2RlZmluZQlUQ09GTFVTSAkxCisjZGVmaW5lCVRDSU9GTFVTSAkyCisKKy8qIHRjc2V0YXR0ciB1c2VzIHRoZXNlICovCisjZGVmaW5lCVRDU0FOT1cJCTAKKyNkZWZpbmUJVENTQURSQUlOCTEKKyNkZWZpbmUJVENTQUZMVVNICTIKKworCisjZGVmaW5lIF9JT1RfdGVybWlvcyAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChjZmxhZ190KSwgNCwgX0lPVFMgKGNjX3QpLCBOQ0NTLCBfSU9UUyAoc3BlZWRfdCksIDIpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvdGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE4NGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3RpbWUuaApAQCAtMCwwICsxLDc1IEBACisvKiBTeXN0ZW0tZGVwZW5kZW50IHRpbWluZyBkZWZpbml0aW9ucy4gIEdlbmVyaWMgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwxOTk3LDE5OTktMjAwMiwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8dGltZS5oPiBpbnN0ZWFkLgorICovCisKKyNpZm5kZWYgX19uZWVkX3RpbWV2YWwKKyMgaWZuZGVmIF9CSVRTX1RJTUVfSAorIyAgZGVmaW5lIF9CSVRTX1RJTUVfSAkxCisKKy8qIElTTy9JRUMgOTg5OToxOTkwIDcuMTIuMTogPHRpbWUuaD4KKyAgIFRoZSBtYWNybyBgQ0xPQ0tTX1BFUl9TRUMnIGlzIHRoZSBudW1iZXIgcGVyIHNlY29uZCBvZiB0aGUgdmFsdWUKKyAgIHJldHVybmVkIGJ5IHRoZSBgY2xvY2snIGZ1bmN0aW9uLiAqLworLyogQ0FFIFhTSCwgSXNzdWUgNCwgVmVyc2lvbiAyOiA8dGltZS5oPgorICAgVGhlIHZhbHVlIG9mIENMT0NLU19QRVJfU0VDIGlzIHJlcXVpcmVkIHRvIGJlIDEgbWlsbGlvbiBvbiBhbGwKKyAgIFhTSS1jb25mb3JtYW50IHN5c3RlbXMuICovCisjICBkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgIDEwMDAwMDBsCisKKyMgIGlmICFkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBFdmVuIHRob3VnaCBDTE9DS1NfUEVSX1NFQyBoYXMgc3VjaCBhIHN0cmFuZ2UgdmFsdWUgQ0xLX1RDSworICAgcHJlc2VudHMgdGhlIHJlYWwgdmFsdWUgZm9yIGNsb2NrIHRpY2tzIHBlciBzZWNvbmQgZm9yIHRoZSBzeXN0ZW0uICAqLworIyAgIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KK2V4dGVybiBsb25nIGludCBfX3N5c2NvbmYgKGludCk7CisjICAgZGVmaW5lIENMS19UQ0sgKChfX2Nsb2NrX3QpIF9fc3lzY29uZiAoMikpCS8qIDIgaXMgX1NDX0NMS19UQ0sgKi8KKyMgIGVuZGlmCisKKyMgIGlmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisvKiBJZGVudGlmaWVyIGZvciBzeXN0ZW0td2lkZSByZWFsdGltZSBjbG9jay4gICovCisjICAgZGVmaW5lIENMT0NLX1JFQUxUSU1FCQkwCisvKiBNb25vdG9uaWMgc3lzdGVtLXdpZGUgY2xvY2suICAqLworIyAgIGRlZmluZSBDTE9DS19NT05PVE9OSUMJCTEKKy8qIEhpZ2gtcmVzb2x1dGlvbiB0aW1lciBmcm9tIHRoZSBDUFUuICAqLworIyAgIGRlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorLyogVGhyZWFkLXNwZWNpZmljIENQVS10aW1lIGNsb2NrLiAgKi8KKyMgICBkZWZpbmUgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQJMworCisvKiBGbGFnIHRvIGluZGljYXRlIHRpbWUgaXMgYWJzb2x1dGUuICAqLworIyAgIGRlZmluZSBUSU1FUl9BQlNUSU1FCQkxCisjICBlbmRpZgorCisjIGVuZGlmCS8qIGJpdHMvdGltZS5oICovCisjZW5kaWYKKworI2lmZGVmIF9fbmVlZF90aW1ldmFsCisjIHVuZGVmIF9fbmVlZF90aW1ldmFsCisjIGlmbmRlZiBfU1RSVUNUX1RJTUVWQUwKKyMgIGRlZmluZSBfU1RSVUNUX1RJTUVWQUwJMQorIyAgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBBIHRpbWUgdmFsdWUgdGhhdCBpcyBhY2N1cmF0ZSB0byB0aGUgbmVhcmVzdAorICAgbWljcm9zZWNvbmQgYnV0IGFsc28gaGFzIGEgcmFuZ2Ugb2YgeWVhcnMuICAqLworc3RydWN0IHRpbWV2YWwKKyAgeworICAgIF9fdGltZV90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIF9fc3VzZWNvbmRzX3QgdHZfdXNlYzsJLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfTsKKyMgZW5kaWYJLyogc3RydWN0IHRpbWV2YWwgKi8KKyNlbmRpZgkvKiBuZWVkIHRpbWV2YWwgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViZTgyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKiBiaXRzL3R5cGVzLmggLS0gZGVmaW5pdGlvbnMgb2YgX18qX3QgdHlwZXMgdW5kZXJseWluZyAqX3QgdHlwZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBOZXZlciBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseTsgdXNlIDxzeXMvdHlwZXMuaD4gaW5zdGVhZC4KKyAqLworCisjaWZuZGVmCV9CSVRTX1RZUEVTX0gKKyNkZWZpbmUJX0JJVFNfVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogQ29udmVuaWVuY2UgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191X3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191X2ludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191X2xvbmc7CisKKy8qIEZpeGVkLXNpemUgdHlwZXMsIHVuZGVybHlpbmcgdHlwZXMgZGVwZW5kIG9uIHdvcmQgc2l6ZSBhbmQgY29tcGlsZXIuICAqLwordHlwZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VpbnQ4X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgX19pbnQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191aW50MTZfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBfX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VpbnQzMl90OworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgc2lnbmVkIGxvbmcgaW50IF9faW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191aW50NjRfdDsKKyNlbGlmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19leHRlbnNpb25fXyB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IF9faW50NjRfdDsKK19fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdWludDY0X3Q7CisjZW5kaWYKKworLyogcXVhZF90IGlzIGFsc28gNjQgYml0cy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBfX3F1YWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgX191X3F1YWRfdDsKKyNlbGlmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORworX19leHRlbnNpb25fXyB0eXBlZGVmIGxvbmcgbG9uZyBpbnQgX19xdWFkX3Q7CitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3VfcXVhZF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0Cit7CisgIGxvbmcgX192YWxbMl07Cit9IF9fcXVhZF90OwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgX191X2xvbmcgX192YWxbMl07Cit9IF9fdV9xdWFkX3Q7CisjZW5kaWYKKworCisvKiBUaGUgbWFjaGluZS1kZXBlbmRlbnQgZmlsZSA8Yml0cy90eXBlc2l6ZXMuaD4gZGVmaW5lcyBfXypfVF9UWVBFCisgICBtYWNyb3MgZm9yIGVhY2ggb2YgdGhlIE9TIHR5cGVzIHdlIGRlZmluZSBiZWxvdy4gIFRoZSBkZWZpbml0aW9ucworICAgb2YgdGhvc2UgbWFjcm9zIG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGZvciB1bmRlcmx5aW5nIHR5cGVzLgorICAgV2UgZGVmaW5lIF9fUzxTSVpFPl9UWVBFIGFuZCBfX1U8U0laRT5fVFlQRSBmb3IgdGhlIHNpZ25lZCBhbmQgdW5zaWduZWQKKyAgIHZhcmlhbnRzIG9mIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBpbnRlZ2VyIHR5cGVzIG9uIHRoaXMgbWFjaGluZS4KKworCTE2CQktLSAibmF0dXJhbCIgMTYtYml0IHR5cGUgKGFsd2F5cyBzaG9ydCkKKwkzMgkJLS0gIm5hdHVyYWwiIDMyLWJpdCB0eXBlIChhbHdheXMgaW50KQorCTY0CQktLSAibmF0dXJhbCIgNjQtYml0IHR5cGUgKGxvbmcgb3IgbG9uZyBsb25nKQorCUxPTkczMgkJLS0gMzItYml0IHR5cGUsIHRyYWRpdGlvbmFsbHkgbG9uZworCVFVQUQJCS0tIDY0LWJpdCB0eXBlLCBhbHdheXMgbG9uZyBsb25nCisJV09SRAkJLS0gbmF0dXJhbCB0eXBlIG9mIF9fV09SRFNJWkUgYml0cyAoaW50IG9yIGxvbmcpCisJTE9OR1dPUkQJLS0gdHlwZSBvZiBfX1dPUkRTSVpFIGJpdHMsIHRyYWRpdGlvbmFsbHkgbG9uZworCisgICBXZSBkaXN0aW5ndWlzaCBXT1JEL0xPTkdXT1JELCAzMi9MT05HMzIsIGFuZCA2NC9RVUFEIHNvIHRoYXQgdGhlCisgICBjb252ZW50aW9uYWwgdXNlcyBvZiBgbG9uZycgb3IgYGxvbmcgbG9uZycgdHlwZSBtb2RpZmllcnMgbWF0Y2ggdGhlCisgICB0eXBlcyB3ZSBkZWZpbmUsIGV2ZW4gd2hlbiBhIGxlc3MtYWRvcm5lZCB0eXBlIHdvdWxkIGJlIHRoZSBzYW1lIHNpemUuCisgICBUaGlzIG1hdHRlcnMgZm9yIChzb21ld2hhdCkgcG9ydGFibHkgd3JpdGluZyBwcmludGYvc2NhbmYgZm9ybWF0cyBmb3IKKyAgIHRoZXNlIHR5cGVzLCB3aGVyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbCBvciBsbCBmb3JtYXQgbW9kaWZpZXJzIGNhbgorICAgbWFrZSB0aGUgdHlwZWRlZnMgYW5kIHRoZSBmb3JtYXRzIG1hdGNoIHVwIGFjcm9zcyBhbGwgR05VIHBsYXRmb3Jtcy4gIElmCisgICB3ZSB1c2VkIGBsb25nJyB3aGVuIGl0J3MgNjQgYml0cyB3aGVyZSBgbG9uZyBsb25nJyBpcyBleHBlY3RlZCwgdGhlbiB0aGUKKyAgIGNvbXBpbGVyIHdvdWxkIHdhcm4gYWJvdXQgdGhlIGZvcm1hdHMgbm90IG1hdGNoaW5nIHRoZSBhcmd1bWVudCB0eXBlcywKKyAgIGFuZCB0aGUgcHJvZ3JhbW1lciBjaGFuZ2luZyB0aGVtIHRvIHNodXQgdXAgdGhlIGNvbXBpbGVyIHdvdWxkIGJyZWFrIHRoZQorICAgcHJvZ3JhbSdzIHBvcnRhYmlsaXR5LgorCisgICBIZXJlIHdlIGFzc3VtZSB3aGF0IGlzIHByZXNlbnRseSB0aGUgY2FzZSBpbiBhbGwgdGhlIEdDQyBjb25maWd1cmF0aW9ucworICAgd2Ugc3VwcG9ydDogbG9uZyBsb25nIGlzIGFsd2F5cyA2NCBiaXRzLCBsb25nIGlzIGFsd2F5cyB3b3JkL2FkZHJlc3Mgc2l6ZSwKKyAgIGFuZCBpbnQgaXMgYWx3YXlzIDMyIGJpdHMuICAqLworCisjZGVmaW5lCV9fUzE2X1RZUEUJCXNob3J0IGludAorI2RlZmluZSBfX1UxNl9UWVBFCQl1bnNpZ25lZCBzaG9ydCBpbnQKKyNkZWZpbmUJX19TMzJfVFlQRQkJaW50CisjZGVmaW5lIF9fVTMyX1RZUEUJCXVuc2lnbmVkIGludAorI2RlZmluZSBfX1NMT05HV09SRF9UWVBFCWxvbmcgaW50CisjZGVmaW5lIF9fVUxPTkdXT1JEX1RZUEUJdW5zaWduZWQgbG9uZyBpbnQKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGRlZmluZSBfX1NRVUFEX1RZUEUJCV9fcXVhZF90CisjIGRlZmluZSBfX1VRVUFEX1RZUEUJCV9fdV9xdWFkX3QKKyMgZGVmaW5lIF9fU1dPUkRfVFlQRQkJaW50CisjIGRlZmluZSBfX1VXT1JEX1RZUEUJCXVuc2lnbmVkIGludAorIyBkZWZpbmUgX19TTE9ORzMyX1RZUEUJCWxvbmcgaW50CisjIGRlZmluZSBfX1VMT05HMzJfVFlQRQkJdW5zaWduZWQgbG9uZyBpbnQKKyMgZGVmaW5lIF9fUzY0X1RZUEUJCV9fcXVhZF90CisjIGRlZmluZSBfX1U2NF9UWVBFCQlfX3VfcXVhZF90CisvKiBXZSB3YW50IF9fZXh0ZW5zaW9uX18gYmVmb3JlIHR5cGVkZWYncyB0aGF0IHVzZSBub25zdGFuZGFyZCBiYXNlIHR5cGVzCisgICBzdWNoIGFzIGBsb25nIGxvbmcnIGluIEM4OSBtb2RlLiAgKi8KKyMgZGVmaW5lIF9fU1REX1RZUEUJCV9fZXh0ZW5zaW9uX18gdHlwZWRlZgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgX19TUVVBRF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VUVVBRF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TV09SRF9UWVBFCQlsb25nIGludAorIyBkZWZpbmUgX19VV09SRF9UWVBFCQl1bnNpZ25lZCBsb25nIGludAorIyBkZWZpbmUgX19TTE9ORzMyX1RZUEUJCWludAorIyBkZWZpbmUgX19VTE9ORzMyX1RZUEUJCXVuc2lnbmVkIGludAorIyBkZWZpbmUgX19TNjRfVFlQRQkJbG9uZyBpbnQKKyMgZGVmaW5lIF9fVTY0X1RZUEUJCXVuc2lnbmVkIGxvbmcgaW50CisvKiBObyBuZWVkIHRvIG1hcmsgdGhlIHR5cGVkZWYgd2l0aCBfX2V4dGVuc2lvbl9fLiAgICovCisjIGRlZmluZSBfX1NURF9UWVBFCQl0eXBlZGVmCisjZWxzZQorIyBlcnJvcgorI2VuZGlmCisjaW5jbHVkZSA8Yml0cy90eXBlc2l6ZXMuaD4JLyogRGVmaW5lcyBfXypfVF9UWVBFIG1hY3Jvcy4gICovCisKKworX19TVERfVFlQRSBfX0RFVl9UX1RZUEUgX19kZXZfdDsJLyogVHlwZSBvZiBkZXZpY2UgbnVtYmVycy4gICovCitfX1NURF9UWVBFIF9fVUlEX1RfVFlQRSBfX3VpZF90OwkvKiBUeXBlIG9mIHVzZXIgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19HSURfVF9UWVBFIF9fZ2lkX3Q7CS8qIFR5cGUgb2YgZ3JvdXAgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19JTk9fVF9UWVBFIF9faW5vX3Q7CS8qIFR5cGUgb2YgZmlsZSBzZXJpYWwgbnVtYmVycy4gICovCitfX1NURF9UWVBFIF9fSU5PNjRfVF9UWVBFIF9faW5vNjRfdDsJLyogVHlwZSBvZiBmaWxlIHNlcmlhbCBudW1iZXJzIChMRlMpLiovCitfX1NURF9UWVBFIF9fTU9ERV9UX1RZUEUgX19tb2RlX3Q7CS8qIFR5cGUgb2YgZmlsZSBhdHRyaWJ1dGUgYml0bWFza3MuICAqLworX19TVERfVFlQRSBfX05MSU5LX1RfVFlQRSBfX25saW5rX3Q7CS8qIFR5cGUgb2YgZmlsZSBsaW5rIGNvdW50cy4gICovCitfX1NURF9UWVBFIF9fT0ZGX1RfVFlQRSBfX29mZl90OwkvKiBUeXBlIG9mIGZpbGUgc2l6ZXMgYW5kIG9mZnNldHMuICAqLworX19TVERfVFlQRSBfX09GRjY0X1RfVFlQRSBfX29mZjY0X3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cyAoTEZTKS4gICovCitfX1NURF9UWVBFIF9fUElEX1RfVFlQRSBfX3BpZF90OwkvKiBUeXBlIG9mIHByb2Nlc3MgaWRlbnRpZmljYXRpb25zLiAgKi8KK19fU1REX1RZUEUgX19GU0lEX1RfVFlQRSBfX2ZzaWRfdDsJLyogVHlwZSBvZiBmaWxlIHN5c3RlbSBJRHMuICAqLworX19TVERfVFlQRSBfX0NMT0NLX1RfVFlQRSBfX2Nsb2NrX3Q7CS8qIFR5cGUgb2YgQ1BVIHVzYWdlIGNvdW50cy4gICovCitfX1NURF9UWVBFIF9fUkxJTV9UX1RZUEUgX19ybGltX3Q7CS8qIFR5cGUgZm9yIHJlc291cmNlIG1lYXN1cmVtZW50LiAgKi8KK19fU1REX1RZUEUgX19STElNNjRfVF9UWVBFIF9fcmxpbTY0X3Q7CS8qIFR5cGUgZm9yIHJlc291cmNlIG1lYXN1cmVtZW50IChMRlMpLiAgKi8KK19fU1REX1RZUEUgX19JRF9UX1RZUEUgX19pZF90OwkJLyogR2VuZXJhbCB0eXBlIGZvciBJRHMuICAqLworX19TVERfVFlQRSBfX1RJTUVfVF9UWVBFIF9fdGltZV90OwkvKiBTZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4gICovCitfX1NURF9UWVBFIF9fVVNFQ09ORFNfVF9UWVBFIF9fdXNlY29uZHNfdDsgLyogQ291bnQgb2YgbWljcm9zZWNvbmRzLiAgKi8KK19fU1REX1RZUEUgX19TVVNFQ09ORFNfVF9UWVBFIF9fc3VzZWNvbmRzX3Q7IC8qIFNpZ25lZCBjb3VudCBvZiBtaWNyb3NlY29uZHMuICAqLworCitfX1NURF9UWVBFIF9fREFERFJfVF9UWVBFIF9fZGFkZHJfdDsJLyogVGhlIHR5cGUgb2YgYSBkaXNrIGFkZHJlc3MuICAqLworX19TVERfVFlQRSBfX1NXQkxLX1RfVFlQRSBfX3N3YmxrX3Q7CS8qIFR5cGUgb2YgYSBzd2FwIGJsb2NrIG1heWJlPyAgKi8KK19fU1REX1RZUEUgX19LRVlfVF9UWVBFIF9fa2V5X3Q7CS8qIFR5cGUgb2YgYW4gSVBDIGtleS4gICovCisKKy8qIENsb2NrIElEIHVzZWQgaW4gY2xvY2sgYW5kIHRpbWVyIGZ1bmN0aW9ucy4gICovCitfX1NURF9UWVBFIF9fQ0xPQ0tJRF9UX1RZUEUgX19jbG9ja2lkX3Q7CisKKy8qIFRpbWVyIElEIHJldHVybmVkIGJ5IGB0aW1lcl9jcmVhdGUnLiAgKi8KK19fU1REX1RZUEUgX19USU1FUl9UX1RZUEUgX190aW1lcl90OworCisvKiBUeXBlIHRvIHJlcHJlc2VudCBibG9jayBzaXplLiAgKi8KK19fU1REX1RZUEUgX19CTEtTSVpFX1RfVFlQRSBfX2Jsa3NpemVfdDsKKworLyogVHlwZXMgZnJvbSB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IGludGVyZmFjZS4gICovCisKKy8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAgKi8KK19fU1REX1RZUEUgX19CTEtDTlRfVF9UWVBFIF9fYmxrY250X3Q7CitfX1NURF9UWVBFIF9fQkxLQ05UNjRfVF9UWVBFIF9fYmxrY250NjRfdDsKKworLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBibG9ja3MuICAqLworX19TVERfVFlQRSBfX0ZTQkxLQ05UX1RfVFlQRSBfX2ZzYmxrY250X3Q7CitfX1NURF9UWVBFIF9fRlNCTEtDTlQ2NF9UX1RZUEUgX19mc2Jsa2NudDY0X3Q7CisKKy8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gbm9kZXMuICAqLworX19TVERfVFlQRSBfX0ZTRklMQ05UX1RfVFlQRSBfX2ZzZmlsY250X3Q7CitfX1NURF9UWVBFIF9fRlNGSUxDTlQ2NF9UX1RZUEUgX19mc2ZpbGNudDY0X3Q7CisKK19fU1REX1RZUEUgX19TU0laRV9UX1RZUEUgX19zc2l6ZV90OyAvKiBUeXBlIG9mIGEgYnl0ZSBjb3VudCwgb3IgZXJyb3IuICAqLworCisvKiBUaGVzZSBmZXcgZG9uJ3QgcmVhbGx5IHZhcnkgYnkgc3lzdGVtLCB0aGV5IGFsd2F5cyBjb3JyZXNwb25kCisgICB0byBvbmUgb2YgdGhlIG90aGVyIGRlZmluZWQgdHlwZXMuICAqLwordHlwZWRlZiBfX29mZjY0X3QgX19sb2ZmX3Q7CS8qIFR5cGUgb2YgZmlsZSBzaXplcyBhbmQgb2Zmc2V0cyAoTEZTKS4gICovCit0eXBlZGVmIF9fcXVhZF90ICpfX3FhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKKworLyogRHVwbGljYXRlcyBpbmZvIGZyb20gc3RkaW50LmggYnV0IHRoaXMgaXMgdXNlZCBpbiB1bmlzdGQuaC4gICovCitfX1NURF9UWVBFIF9fU1dPUkRfVFlQRSBfX2ludHB0cl90OworCisvKiBEdXBsaWNhdGUgaW5mbyBmcm9tIHN5cy9zb2NrZXQuaC4gICovCitfX1NURF9UWVBFIF9fVTMyX1RZUEUgX19zb2NrbGVuX3Q7CisKKworI3VuZGVmIF9fU1REX1RZUEUKKworI2VuZGlmIC8qIGJpdHMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3R5cGVzaXplcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3R5cGVzaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MjI2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvdHlwZXNpemVzLmgKQEAgLTAsMCArMSw2NiBAQAorLyogYml0cy90eXBlc2l6ZXMuaCAtLSB1bmRlcmx5aW5nIHR5cGVzIGZvciAqX3QuICBHZW5lcmljIHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JJVFNfVFlQRVNfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy90eXBlc2l6ZXMuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3R5cGVzLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYJX0JJVFNfVFlQRVNJWkVTX0gKKyNkZWZpbmUJX0JJVFNfVFlQRVNJWkVTX0gJMQorCisvKiBTZWUgPGJpdHMvdHlwZXMuaD4gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIG1hY3Jvcy4gIFRoaXMgZmlsZSBleGlzdHMgc28KKyAgIHRoYXQgPGJpdHMvdHlwZXMuaD4gbmVlZCBub3QgdmFyeSBhY3Jvc3MgZGlmZmVyZW50IEdOVSBwbGF0Zm9ybXMuICAqLworCisjZGVmaW5lIF9fREVWX1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lIF9fVUlEX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX0dJRF9UX1RZUEUJCV9fVTMyX1RZUEUKKyNkZWZpbmUgX19JTk9fVF9UWVBFCQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fSU5PNjRfVF9UWVBFCQlfX1VRVUFEX1RZUEUKKyNkZWZpbmUgX19NT0RFX1RfVFlQRQkJX19VMzJfVFlQRQorI2RlZmluZSBfX05MSU5LX1RfVFlQRQkJX19VV09SRF9UWVBFCisjZGVmaW5lIF9fT0ZGX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX09GRjY0X1RfVFlQRQkJX19TUVVBRF9UWVBFCisjZGVmaW5lIF9fUElEX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX1JMSU1fVF9UWVBFCQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fUkxJTTY0X1RfVFlQRQkJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fQkxLQ05UX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0JMS0NOVDY0X1RfVFlQRQlfX1NRVUFEX1RZUEUKKyNkZWZpbmUJX19GU0JMS0NOVF9UX1RZUEUJX19VTE9OR1dPUkRfVFlQRQorI2RlZmluZQlfX0ZTQkxLQ05UNjRfVF9UWVBFCV9fVVFVQURfVFlQRQorI2RlZmluZQlfX0ZTRklMQ05UX1RfVFlQRQlfX1VMT05HV09SRF9UWVBFCisjZGVmaW5lCV9fRlNGSUxDTlQ2NF9UX1RZUEUJX19VUVVBRF9UWVBFCisjZGVmaW5lCV9fSURfVF9UWVBFCQlfX1UzMl9UWVBFCisjZGVmaW5lIF9fQ0xPQ0tfVF9UWVBFCQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fVElNRV9UX1RZUEUJCV9fU0xPTkdXT1JEX1RZUEUKKyNkZWZpbmUgX19VU0VDT05EU19UX1RZUEUJX19VMzJfVFlQRQorI2RlZmluZSBfX1NVU0VDT05EU19UX1RZUEUJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0RBRERSX1RfVFlQRQkJX19TMzJfVFlQRQorI2RlZmluZSBfX1NXQkxLX1RfVFlQRQkJX19TTE9OR1dPUkRfVFlQRQorI2RlZmluZSBfX0tFWV9UX1RZUEUJCV9fUzMyX1RZUEUKKyNkZWZpbmUgX19DTE9DS0lEX1RfVFlQRQlfX1MzMl9UWVBFCisjZGVmaW5lIF9fVElNRVJfVF9UWVBFCQl2b2lkICoKKyNkZWZpbmUgX19CTEtTSVpFX1RfVFlQRQlfX1NMT05HV09SRF9UWVBFCisjZGVmaW5lIF9fRlNJRF9UX1RZUEUJCXN0cnVjdCB7IGludCBfX3ZhbFsyXTsgfQorI2RlZmluZSBfX1NTSVpFX1RfVFlQRQkJX19TV09SRF9UWVBFCisKKy8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyB0aGF0IGNhbiBmaXQgaW4gYW4gYGZkX3NldCcuICAqLworI2RlZmluZQlfX0ZEX1NFVFNJWkUJCTEwMjQKKworCisjZW5kaWYgLyogYml0cy90eXBlc2l6ZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3Vpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjgzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvdWlvLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWYgIWRlZmluZWQgX1NZU19VSU9fSCAmJiAhZGVmaW5lZCBfRkNOVExfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy91aW8uaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3Vpby5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaWZuZGVmIF9CSVRTX1VJT19ICisjZGVmaW5lIF9CSVRTX1VJT19ICTEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKKy8qIFdlIHNob3VsZCBub3JtYWxseSB1c2UgdGhlIExpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZSB0byBkZWZpbmUgdGhpcworICAgdHlwZSBhbmQgbWFjcm9zIGJ1dCB0aGlzIGNhbGxzIGZvciB0cm91YmxlIGJlY2F1c2Ugb2YgdGhlIGhlYWRlcgorICAgaW5jbHVkZXMgb3RoZXIga2VybmVsIGhlYWRlcnMuICAqLworCisvKiBTaXplIG9mIG9iamVjdCB3aGljaCBjYW4gYmUgd3JpdHRlbiBhdG9taWNhbGx5LgorCisgICBUaGlzIG1hY3JvIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGluIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMuICBUaGUKKyAgIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUga2VybmVsIHVzZSAxMDI0IGFuZCB0aGlzIGlzIGdvb2QgY2hvaWNlLiAgU2luY2UKKyAgIHRoZSBDIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gb2YgcmVhZHYvd3JpdGV2IGlzIGFibGUgdG8gZW11bGF0ZSB0aGUKKyAgIGZ1bmN0aW9uYWxpdHkgZXZlbiBpZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcga2VybmVsIGRvZXMgbm90IHN1cHBvcnQKKyAgIHRoaXMgbGFyZ2UgdmFsdWUgdGhlIHJlYWR2L3dyaXRldiBjYWxsIHdpbGwgbm90IGZhaWwgYmVjYXVzZSBvZiB0aGlzLiAgKi8KKyNkZWZpbmUgVUlPX01BWElPVgkxMDI0CisKKworLyogU3RydWN0dXJlIGZvciBzY2F0dGVyL2dhdGhlciBJL08uICAqLworc3RydWN0IGlvdmVjCisgIHsKKyAgICB2b2lkICppb3ZfYmFzZTsJLyogUG9pbnRlciB0byBkYXRhLiAgKi8KKyAgICBzaXplX3QgaW92X2xlbjsJLyogTGVuZ3RoIG9mIGRhdGEuICAqLworICB9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ3Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3VuaXN0ZC5oCkBAIC0wLDAgKzEsMzg2IEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHVuaXN0ZCBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1VOSVNURF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3VuaXN0ZC5oPiBkaXJlY3RseTsgdXNlIDx1bmlzdGQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworZXh0ZXJuIHNzaXplX3QgX19yZWFkX2NoayAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICBzaXplX3QgX19idWZsZW4pIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWFkX2FsaWFzLCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLAorCQkJCQkgIHNpemVfdCBfX25ieXRlcyksIHJlYWQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAoX19yZWFkX2Noa193YXJuLAorCQkJICAgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgIHNpemVfdCBfX2J1ZmxlbiksIF9fcmVhZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJyZWFkIGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICAgICAgICJ0aGUgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcmVhZF9jaGsgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoX19uYnl0ZXMgPiBfX2JvczAgKF9fYnVmKSkKKwlyZXR1cm4gX19yZWFkX2Noa193YXJuIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3JlYWRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcyk7Cit9CisKKyNpZmRlZiBfX1VTRV9VTklYOTgKK2V4dGVybiBzc2l6ZV90IF9fcHJlYWRfY2hrIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZl90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fcHJlYWQ2NF9jaGsgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJICAgICAgX19vZmY2NF90IF9fb2Zmc2V0LCBzaXplX3QgX19idWZzaXplKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWRfYWxpYXMsCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmZfdCBfX29mZnNldCksIHByZWFkKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWQ2NF9hbGlhcywKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZjY0X3QgX19vZmZzZXQpLCBwcmVhZDY0KSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWRfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkgICAgX19vZmZfdCBfX29mZnNldCwgc2l6ZV90IF9fYnVmc2l6ZSksIF9fcHJlYWRfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgicHJlYWQgY2FsbGVkIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgInRoZSBkZXN0aW5hdGlvbiBidWZmZXIiKTsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKF9fcHJlYWQ2NF9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX25ieXRlcywKKwkJCSAgICBfX29mZjY0X3QgX19vZmZzZXQsIHNpemVfdCBfX2J1ZnNpemUpLAorCQkJICAgIF9fcHJlYWQ2NF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJwcmVhZDY0IGNhbGxlZCB3aXRoIGJpZ2dlciBsZW5ndGggdGhhbiBzaXplIG9mICIKKwkJICAgICAgICJ0aGUgZGVzdGluYXRpb24gYnVmZmVyIik7CisKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgX193dXIgc3NpemVfdAorcHJlYWQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLCBfX29mZl90IF9fb2Zmc2V0KQoreworICBpZiAoX19ib3MwIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uYnl0ZXMpKQorCXJldHVybiBfX3ByZWFkX2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcHJlYWRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsCisJCQkJIF9fYm9zMCAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3ByZWFkX2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0KTsKK30KKyMgZWxzZQorX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciBzc2l6ZV90CitwcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsIF9fb2ZmNjRfdCBfX29mZnNldCkKK3sKKyAgaWYgKF9fYm9zMCAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbmJ5dGVzKSkKKwlyZXR1cm4gX19wcmVhZDY0X2NoayAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwgX19ib3MwIChfX2J1ZikpOworCisgICAgICBpZiAoIF9fbmJ5dGVzID4gX19ib3MwIChfX2J1ZikpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fbmJ5dGVzLCBfX29mZnNldCwKKwkJCQkgICBfX2JvczAgKF9fYnVmKSk7CisgICAgfQorCisgIHJldHVybiBfX3ByZWFkNjRfYWxpYXMgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQpOworfQorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNzaXplX3QKK3ByZWFkNjQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLCBfX29mZjY0X3QgX19vZmZzZXQpCit7CisgIGlmIChfX2JvczAgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX25ieXRlcykpCisJcmV0dXJuIF9fcHJlYWQ2NF9jaGsgKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsIF9fYm9zMCAoX19idWYpKTsKKworICAgICAgaWYgKCBfX25ieXRlcyA+IF9fYm9zMCAoX19idWYpKQorCXJldHVybiBfX3ByZWFkNjRfY2hrX3dhcm4gKF9fZmQsIF9fYnVmLCBfX25ieXRlcywgX19vZmZzZXQsCisJCQkJICAgX19ib3MwIChfX2J1ZikpOworICAgIH0KKworICByZXR1cm4gX19wcmVhZDY0X2FsaWFzIChfX2ZkLCBfX2J1ZiwgX19uYnl0ZXMsIF9fb2Zmc2V0KTsKK30KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKK2V4dGVybiBzc2l6ZV90IF9fcmVhZGxpbmtfY2hrIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKF9fcmVhZGxpbmtfYWxpYXMsCisJCQkgICAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSwgcmVhZGxpbmspCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rX2Noa193YXJuLAorCQkJICAgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCQlzaXplX3QgX19idWZsZW4pLCBfX3JlYWRsaW5rX2NoaykKKyAgICAgX19ub25udWxsICgoMSwgMikpIF9fd3VyIF9fd2FybmF0dHIgKCJyZWFkbGluayBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoICIKKwkJCQkJICAidGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1ciBzc2l6ZV90CitfX05USCAocmVhZGxpbmsgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCSBzaXplX3QgX19sZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fcmVhZGxpbmtfY2hrIChfX3BhdGgsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmICggX19sZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX3JlYWRsaW5rX2Noa193YXJuIChfX3BhdGgsIF9fYnVmLCBfX2xlbiwgX19ib3MgKF9fYnVmKSk7CisgICAgfQorICByZXR1cm4gX19yZWFkbGlua19hbGlhcyAoX19wYXRoLCBfX2J1ZiwgX19sZW4pOworfQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKK2V4dGVybiBzc2l6ZV90IF9fcmVhZGxpbmthdF9jaGsgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCSBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkJIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSkgX193dXI7CitleHRlcm4gc3NpemVfdCBfX1JFRElSRUNUX05USCAoX19yZWFkbGlua2F0X2FsaWFzLAorCQkJICAgICAgIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQljaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pLAorCQkJICAgICAgIHJlYWRsaW5rYXQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1cjsKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3JlYWRsaW5rYXRfY2hrX3dhcm4sCisJCQkgICAgICAgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLAorCQkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCQlzaXplX3QgX19idWZsZW4pLCBfX3JlYWRsaW5rYXRfY2hrKQorICAgICBfX25vbm51bGwgKCgyLCAzKSkgX193dXIgX193YXJuYXR0ciAoInJlYWRsaW5rYXQgY2FsbGVkIHdpdGggYmlnZ2VyICIKKwkJCQkJICAibGVuZ3RoIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCQkJCSAgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fbm9ubnVsbCAoKDIsIDMpKSBfX3d1ciBzc2l6ZV90CitfX05USCAocmVhZGxpbmthdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19yZWFkbGlua2F0X2NoayAoX19mZCwgX19wYXRoLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX3JlYWRsaW5rYXRfY2hrX3dhcm4gKF9fZmQsIF9fcGF0aCwgX19idWYsIF9fbGVuLAorCQkJCSAgICAgIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fcmVhZGxpbmthdF9hbGlhcyAoX19mZCwgX19wYXRoLCBfX2J1ZiwgX19sZW4pOworfQorI2VuZGlmCisKK2V4dGVybiBjaGFyICpfX2dldGN3ZF9jaGsgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX193dXI7CitleHRlcm4gY2hhciAqX19SRURJUkVDVF9OVEggKF9fZ2V0Y3dkX2FsaWFzLAorCQkJICAgICAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpLCBnZXRjd2QpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX2dldGN3ZF9jaGtfd2FybiwKKwkJCSAgICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19zaXplLCBzaXplX3QgX19idWZsZW4pLAorCQkJICAgICBfX2dldGN3ZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJnZXRjd2QgY2FsbGVyIHdpdGggYmlnZ2VyIGxlbmd0aCB0aGFuIHNpemUgb2YgIgorCQkgICAgICAgImRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIGNoYXIgKgorX19OVEggKGdldGN3ZCAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpKQorCXJldHVybiBfX2dldGN3ZF9jaGsgKF9fYnVmLCBfX3NpemUsIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19zaXplID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRjd2RfY2hrX3dhcm4gKF9fYnVmLCBfX3NpemUsIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0Y3dkX2FsaWFzIChfX2J1ZiwgX19zaXplKTsKK30KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK2V4dGVybiBjaGFyICpfX2dldHdkX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBidWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworZXh0ZXJuIGNoYXIgKl9fUkVESVJFQ1RfTlRIIChfX2dldHdkX3dhcm4sIChjaGFyICpfX2J1ZiksIGdldHdkKQorICAgICBfX25vbm51bGwgKCgxKSkgX193dXIgX193YXJuYXR0ciAoInBsZWFzZSB1c2UgZ2V0Y3dkIGluc3RlYWQsIGFzIGdldHdkICIKKwkJCQkgICAgICAgImRvZXNuJ3Qgc3BlY2lmeSBidWZmZXIgc2l6ZSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fbm9ubnVsbCAoKDEpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX18gX193dXIgY2hhciAqCitfX05USCAoZ2V0d2QgKGNoYXIgKl9fYnVmKSkKK3sKKyAgaWYgKF9fYm9zIChfX2J1ZikgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fZ2V0d2RfY2hrIChfX2J1ZiwgX19ib3MgKF9fYnVmKSk7CisgIHJldHVybiBfX2dldHdkX3dhcm4gKF9fYnVmKTsKK30KKyNlbmRpZgorCitleHRlcm4gc2l6ZV90IF9fY29uZnN0cl9jaGsgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19sZW4sCisJCQkgICAgIHNpemVfdCBfX2J1ZmxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fY29uZnN0cl9hbGlhcywgKGludCBfX25hbWUsIGNoYXIgKl9fYnVmLAorCQkJCQkJc2l6ZV90IF9fbGVuKSwgY29uZnN0cik7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX2NvbmZzdHJfY2hrX3dhcm4sCisJCQkgICAgICAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgICBzaXplX3QgX19idWZsZW4pLCBfX2NvbmZzdHJfY2hrKQorICAgICBfX3dhcm5hdHRyICgiY29uZnN0ciBjYWxsZWQgd2l0aCBiaWdnZXIgbGVuZ3RoIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAoY29uZnN0ciAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbGVuKSkKKwlyZXR1cm4gX19jb25mc3RyX2NoayAoX19uYW1lLCBfX2J1ZiwgX19sZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19ib3MgKF9fYnVmKSA8IF9fbGVuKQorCXJldHVybiBfX2NvbmZzdHJfY2hrX3dhcm4gKF9fbmFtZSwgX19idWYsIF9fbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2NvbmZzdHJfYWxpYXMgKF9fbmFtZSwgX19idWYsIF9fbGVuKTsKK30KKworCitleHRlcm4gaW50IF9fZ2V0Z3JvdXBzX2NoayAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSwgc2l6ZV90IF9fbGlzdGxlbikKKyAgICAgX19USFJPVyBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0Z3JvdXBzX2FsaWFzLCAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSksCisJCQkgICBnZXRncm91cHMpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRncm91cHNfY2hrX3dhcm4sCisJCQkgICAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSwgc2l6ZV90IF9fbGlzdGxlbiksCisJCQkgICBfX2dldGdyb3Vwc19jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJnZXRncm91cHMgY2FsbGVkIHdpdGggYmlnZ2VyIGdyb3VwIGNvdW50IHRoYW4gd2hhdCAiCisJCSAgICAgICAiY2FuIGZpdCBpbnRvIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGdldGdyb3VwcyAoaW50IF9fc2l6ZSwgX19naWRfdCBfX2xpc3RbXSkpCit7CisgIGlmIChfX2JvcyAoX19saXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX3NpemUpKQorCXJldHVybiBfX2dldGdyb3Vwc19jaGsgKF9fc2l6ZSwgX19saXN0LCBfX2JvcyAoX19saXN0KSk7CisKKyAgICAgIGlmIChfX3NpemUgKiBzaXplb2YgKF9fZ2lkX3QpID4gX19ib3MgKF9fbGlzdCkpCisJcmV0dXJuIF9fZ2V0Z3JvdXBzX2Noa193YXJuIChfX3NpemUsIF9fbGlzdCwgX19ib3MgKF9fbGlzdCkpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0Z3JvdXBzX2FsaWFzIChfX3NpemUsIF9fbGlzdCk7Cit9CisKKworZXh0ZXJuIGludCBfX3R0eW5hbWVfcl9jaGsgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHNpemVfdCBfX25yZWFsKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fdHR5bmFtZV9yX2FsaWFzLCAoaW50IF9fZmQsIGNoYXIgKl9fYnVmLAorCQkJCQkgICAgICAgc2l6ZV90IF9fYnVmbGVuKSwgdHR5bmFtZV9yKQorICAgICBfX25vbm51bGwgKCgyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3R0eW5hbWVfcl9jaGtfd2FybiwKKwkJCSAgIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzaXplX3QgX19ucmVhbCksIF9fdHR5bmFtZV9yX2NoaykKKyAgICAgX19ub25udWxsICgoMikpIF9fd2FybmF0dHIgKCJ0dHluYW1lX3IgY2FsbGVkIHdpdGggYmlnZ2VyIGJ1ZmxlbiB0aGFuICIKKwkJCQkgInNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAodHR5bmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikpCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX190dHluYW1lX3JfY2hrIChfX2ZkLCBfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX3R0eW5hbWVfcl9jaGtfd2FybiAoX19mZCwgX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX3R0eW5hbWVfcl9hbGlhcyAoX19mZCwgX19idWYsIF9fYnVmbGVuKTsKK30KKworCisjaWYgZGVmaW5lZCBfX1VTRV9SRUVOVFJBTlQgfHwgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTUwNgorZXh0ZXJuIGludCBfX2dldGxvZ2luX3JfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCkKKyAgICAgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChfX2dldGxvZ2luX3JfYWxpYXMsIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJICAgICAgIGdldGxvZ2luX3IpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoX19nZXRsb2dpbl9yX2Noa193YXJuLAorCQkgICAgICAgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4sIHNpemVfdCBfX25yZWFsKSwKKwkJICAgICAgIF9fZ2V0bG9naW5fcl9jaGspCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3dhcm5hdHRyICgiZ2V0bG9naW5fciBjYWxsZWQgd2l0aCBiaWdnZXIgYnVmbGVuIHRoYW4gIgorCQkJCSAic2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK2dldGxvZ2luX3IgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pCit7CisgIGlmIChfX2JvcyAoX19idWYpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fYnVmbGVuKSkKKwlyZXR1cm4gX19nZXRsb2dpbl9yX2NoayAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKworICAgICAgaWYgKF9fYnVmbGVuID4gX19ib3MgKF9fYnVmKSkKKwlyZXR1cm4gX19nZXRsb2dpbl9yX2Noa193YXJuIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0bG9naW5fcl9hbGlhcyAoX19idWYsIF9fYnVmbGVuKTsKK30KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorZXh0ZXJuIGludCBfX2dldGhvc3RuYW1lX2NoayAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19nZXRob3N0bmFtZV9hbGlhcywgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pLAorCQkJICAgZ2V0aG9zdG5hbWUpIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZ2V0aG9zdG5hbWVfY2hrX3dhcm4sCisJCQkgICAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpLAorCQkJICAgX19nZXRob3N0bmFtZV9jaGspCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3dhcm5hdHRyICgiZ2V0aG9zdG5hbWUgY2FsbGVkIHdpdGggYmlnZ2VyIGJ1ZmxlbiB0aGFuICIKKwkJCQkgInNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50CitfX05USCAoZ2V0aG9zdG5hbWUgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fZ2V0aG9zdG5hbWVfY2hrIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworCisgICAgICBpZiAoX19idWZsZW4gPiBfX2JvcyAoX19idWYpKQorCXJldHVybiBfX2dldGhvc3RuYW1lX2Noa193YXJuIChfX2J1ZiwgX19idWZsZW4sIF9fYm9zIChfX2J1ZikpOworICAgIH0KKyAgcmV0dXJuIF9fZ2V0aG9zdG5hbWVfYWxpYXMgKF9fYnVmLCBfX2J1Zmxlbik7Cit9CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgKGRlZmluZWQgX19VU0VfWE9QRU4gJiYgIWRlZmluZWQgX19VU0VfVU5JWDk4KQorZXh0ZXJuIGludCBfX2dldGRvbWFpbm5hbWVfY2hrIChjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLCBzaXplX3QgX19ucmVhbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGRvbWFpbm5hbWVfYWxpYXMsIChjaGFyICpfX2J1ZiwKKwkJCQkJCSAgIHNpemVfdCBfX2J1ZmxlbiksCisJCQkgICBnZXRkb21haW5uYW1lKSBfX25vbm51bGwgKCgxKSkgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX2dldGRvbWFpbm5hbWVfY2hrX3dhcm4sCisJCQkgICAoY2hhciAqX19idWYsIHNpemVfdCBfX2J1Zmxlbiwgc2l6ZV90IF9fbnJlYWwpLAorCQkJICAgX19nZXRkb21haW5uYW1lX2NoaykKKyAgICAgX19ub25udWxsICgoMSkpIF9fd3VyIF9fd2FybmF0dHIgKCJnZXRkb21haW5uYW1lIGNhbGxlZCB3aXRoIGJpZ2dlciAiCisJCQkJICAgICAgICJidWZsZW4gdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJCQkgICAgICAgImJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKGdldGRvbWFpbm5hbWUgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pKQoreworICBpZiAoX19ib3MgKF9fYnVmKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2J1ZmxlbikpCisJcmV0dXJuIF9fZ2V0ZG9tYWlubmFtZV9jaGsgKF9fYnVmLCBfX2J1ZmxlbiwgX19ib3MgKF9fYnVmKSk7CisKKyAgICAgIGlmIChfX2J1ZmxlbiA+IF9fYm9zIChfX2J1ZikpCisJcmV0dXJuIF9fZ2V0ZG9tYWlubmFtZV9jaGtfd2FybiAoX19idWYsIF9fYnVmbGVuLCBfX2JvcyAoX19idWYpKTsKKyAgICB9CisgIHJldHVybiBfX2dldGRvbWFpbm5hbWVfYWxpYXMgKF9fYnVmLCBfX2J1Zmxlbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91c3RhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3VzdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljNmI3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91c3RhdC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VTVEFUX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvdXN0YXQuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3VzdGF0Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworc3RydWN0IHVzdGF0CisgIHsKKyAgICBfX2RhZGRyX3QgZl90ZnJlZTsJCS8qIE51bWJlciBvZiBmcmVlIGJsb2Nrcy4gICovCisgICAgX19pbm9fdCBmX3Rpbm9kZTsJCS8qIE51bWJlciBvZiBmcmVlIGlub2Rlcy4gICovCisgICAgY2hhciBmX2ZuYW1lWzZdOworICAgIGNoYXIgZl9mcGFja1s2XTsKKyAgfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91dG1wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvdXRtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvdXRtcC5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiBUaGUgYHN0cnVjdCB1dG1wJyB0eXBlLCBkZXNjcmliaW5nIGVudHJpZXMgaW4gdGhlIHV0bXAgZmlsZS4gIEdOVSB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAyCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfVVRNUF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3V0bXAuaD4gZGlyZWN0bHk7IHVzZSA8dXRtcC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworCisjZGVmaW5lIFVUX0xJTkVTSVpFCTMyCisjZGVmaW5lIFVUX05BTUVTSVpFCTMyCisjZGVmaW5lIFVUX0hPU1RTSVpFCTI1NgorCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBlbnRyeSBpbiB0aGUgZGF0YWJhc2Ugb2YKKyAgIHByZXZpb3VzIGxvZ2lucy4gICovCitzdHJ1Y3QgbGFzdGxvZworICB7CisjaWYgX19XT1JEU0laRSA9PSA2NCAmJiBkZWZpbmVkIF9fV09SRFNJWkVfQ09NUEFUMzIKKyAgICBpbnQzMl90IGxsX3RpbWU7CisjZWxzZQorICAgIF9fdGltZV90IGxsX3RpbWU7CisjZW5kaWYKKyAgICBjaGFyIGxsX2xpbmVbVVRfTElORVNJWkVdOworICAgIGNoYXIgbGxfaG9zdFtVVF9IT1NUU0laRV07CisgIH07CisKKworLyogVGhlIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBzdGF0dXMgb2YgYSB0ZXJtaW5hdGVkIHByb2Nlc3MuICBUaGlzCisgICB0eXBlIGlzIHVzZWQgaW4gYHN0cnVjdCB1dG1wJyBiZWxvdy4gICovCitzdHJ1Y3QgZXhpdF9zdGF0dXMKKyAgeworICAgIHNob3J0IGludCBlX3Rlcm1pbmF0aW9uOwkvKiBQcm9jZXNzIHRlcm1pbmF0aW9uIHN0YXR1cy4gICovCisgICAgc2hvcnQgaW50IGVfZXhpdDsJCS8qIFByb2Nlc3MgZXhpdCBzdGF0dXMuICAqLworICB9OworCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBlbnRyeSBpbiB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLiAgKi8KK3N0cnVjdCB1dG1wCit7CisgIHNob3J0IGludCB1dF90eXBlOwkJLyogVHlwZSBvZiBsb2dpbi4gICovCisgIHBpZF90IHV0X3BpZDsJCQkvKiBQcm9jZXNzIElEIG9mIGxvZ2luIHByb2Nlc3MuICAqLworICBjaGFyIHV0X2xpbmVbVVRfTElORVNJWkVdOwkvKiBEZXZpY2VuYW1lLiAgKi8KKyAgY2hhciB1dF9pZFs0XTsJCS8qIEluaXR0YWIgSUQuICAqLworICBjaGFyIHV0X3VzZXJbVVRfTkFNRVNJWkVdOwkvKiBVc2VybmFtZS4gICovCisgIGNoYXIgdXRfaG9zdFtVVF9IT1NUU0laRV07CS8qIEhvc3RuYW1lIGZvciByZW1vdGUgbG9naW4uICAqLworICBzdHJ1Y3QgZXhpdF9zdGF0dXMgdXRfZXhpdDsJLyogRXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIG1hcmtlZAorCQkJCSAgIGFzIERFQURfUFJPQ0VTUy4gICovCisvKiBUaGUgdXRfc2Vzc2lvbiBhbmQgdXRfdHYgZmllbGRzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSB3aGVuIGNvbXBpbGVkCisgICAzMi0gYW5kIDY0LWJpdC4gIFRoaXMgYWxsb3dzIGRhdGEgZmlsZXMgYW5kIHNoYXJlZCBtZW1vcnkgdG8gYmUKKyAgIHNoYXJlZCBiZXR3ZWVuIDMyLSBhbmQgNjQtYml0IGFwcGxpY2F0aW9ucy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NCAmJiBkZWZpbmVkIF9fV09SRFNJWkVfQ09NUEFUMzIKKyAgaW50MzJfdCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0CisgIHsKKyAgICBpbnQzMl90IHR2X3NlYzsJCS8qIFNlY29uZHMuICAqLworICAgIGludDMyX3QgdHZfdXNlYzsJCS8qIE1pY3Jvc2Vjb25kcy4gICovCisgIH0gdXRfdHY7CQkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZWxzZQorICBsb25nIGludCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0IHRpbWV2YWwgdXRfdHY7CQkvKiBUaW1lIGVudHJ5IHdhcyBtYWRlLiAgKi8KKyNlbmRpZgorCisgIGludDMyX3QgdXRfYWRkcl92Nls0XTsJLyogSW50ZXJuZXQgYWRkcmVzcyBvZiByZW1vdGUgaG9zdC4gICovCisgIGNoYXIgX191bnVzZWRbMjBdOwkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLworfTsKKworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaGFja3MuICAqLworI2RlZmluZSB1dF9uYW1lCQl1dF91c2VyCisjaWZuZGVmIF9OT19VVF9USU1FCisvKiBXZSBoYXZlIGEgcHJvYmxlbSBoZXJlOiBgdXRfdGltZScgaXMgYWxzbyB1c2VkIG90aGVyd2lzZS4gIERlZmluZQorICAgX05PX1VUX1RJTUUgaWYgdGhlIGNvbXBpbGVyIGNvbXBsYWlucy4gICovCisjIGRlZmluZSB1dF90aW1lCXV0X3R2LnR2X3NlYworI2VuZGlmCisjZGVmaW5lIHV0X3h0aW1lCXV0X3R2LnR2X3NlYworI2RlZmluZSB1dF9hZGRyCQl1dF9hZGRyX3Y2WzBdCisKKworLyogVmFsdWVzIGZvciB0aGUgYHV0X3R5cGUnIGZpZWxkIG9mIGEgYHN0cnVjdCB1dG1wJy4gICovCisjZGVmaW5lIEVNUFRZCQkwCS8qIE5vIHZhbGlkIHVzZXIgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gICovCisKKyNkZWZpbmUgUlVOX0xWTAkJMQkvKiBUaGUgc3lzdGVtJ3MgcnVubGV2ZWwuICAqLworI2RlZmluZSBCT09UX1RJTUUJMgkvKiBUaW1lIG9mIHN5c3RlbSBib290LiAgKi8KKyNkZWZpbmUgTkVXX1RJTUUJMwkvKiBUaW1lIGFmdGVyIHN5c3RlbSBjbG9jayBjaGFuZ2VkLiAgKi8KKyNkZWZpbmUgT0xEX1RJTUUJNAkvKiBUaW1lIHdoZW4gc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworCisjZGVmaW5lIElOSVRfUFJPQ0VTUwk1CS8qIFByb2Nlc3Mgc3Bhd25lZCBieSB0aGUgaW5pdCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgTE9HSU5fUFJPQ0VTUwk2CS8qIFNlc3Npb24gbGVhZGVyIG9mIGEgbG9nZ2VkIGluIHVzZXIuICAqLworI2RlZmluZSBVU0VSX1BST0NFU1MJNwkvKiBOb3JtYWwgcHJvY2Vzcy4gICovCisjZGVmaW5lIERFQURfUFJPQ0VTUwk4CS8qIFRlcm1pbmF0ZWQgcHJvY2Vzcy4gICovCisKKyNkZWZpbmUgQUNDT1VOVElORwk5CisKKy8qIE9sZCBMaW51eCBuYW1lIGZvciB0aGUgRU1QVFkgdHlwZS4gICovCisjZGVmaW5lIFVUX1VOS05PV04JRU1QVFkKKworCisvKiBUZWxsIHRoZSB1c2VyIHRoYXQgd2UgaGF2ZSBhIG1vZGVybiBzeXN0ZW0gd2l0aCBVVF9IT1NULCBVVF9QSUQsCisgICBVVF9UWVBFLCBVVF9JRCBhbmQgVVRfVFYgZmllbGRzLiAgKi8KKyNkZWZpbmUgX0hBVkVfVVRfVFlQRQkxCisjZGVmaW5lIF9IQVZFX1VUX1BJRAkxCisjZGVmaW5lIF9IQVZFX1VUX0lECTEKKyNkZWZpbmUgX0hBVkVfVVRfVFYJMQorI2RlZmluZSBfSEFWRV9VVF9IT1NUCTEKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91dG1weC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3V0bXB4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0Y2RhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91dG1weC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBTdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZS4gIEdOVSB2ZXJzaW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VVE1QWF9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3V0bXB4Lmg+IGRpcmVjdGx5OyB1c2UgPHV0bXB4Lmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2lmZGVmIF9fVVNFX0dOVQorIyBpbmNsdWRlIDxwYXRocy5oPgorIyBkZWZpbmUgX1BBVEhfVVRNUFgJX1BBVEhfVVRNUAorIyBkZWZpbmUgX1BBVEhfV1RNUFgJX1BBVEhfV1RNUAorI2VuZGlmCisKKworI2RlZmluZSBfX1VUX0xJTkVTSVpFCTMyCisjZGVmaW5lIF9fVVRfTkFNRVNJWkUJMzIKKyNkZWZpbmUgX19VVF9IT1NUU0laRQkyNTYKKworCisvKiBUaGUgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBvZiBhIHRlcm1pbmF0ZWQgcHJvY2Vzcy4gIFRoaXMKKyAgIHR5cGUgaXMgdXNlZCBpbiBgc3RydWN0IHV0bXB4JyBiZWxvdy4gICovCitzdHJ1Y3QgX19leGl0X3N0YXR1cworICB7CisjaWZkZWYgX19VU0VfR05VCisgICAgc2hvcnQgaW50IGVfdGVybWluYXRpb247CS8qIFByb2Nlc3MgdGVybWluYXRpb24gc3RhdHVzLiAgKi8KKyAgICBzaG9ydCBpbnQgZV9leGl0OwkJLyogUHJvY2VzcyBleGl0IHN0YXR1cy4gICovCisjZWxzZQorICAgIHNob3J0IGludCBfX2VfdGVybWluYXRpb247CS8qIFByb2Nlc3MgdGVybWluYXRpb24gc3RhdHVzLiAgKi8KKyAgICBzaG9ydCBpbnQgX19lX2V4aXQ7CQkvKiBQcm9jZXNzIGV4aXQgc3RhdHVzLiAgKi8KKyNlbmRpZgorICB9OworCisKKy8qIFRoZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBlbnRyeSBpbiB0aGUgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLiAgKi8KK3N0cnVjdCB1dG1weAoreworICBzaG9ydCBpbnQgdXRfdHlwZTsJCS8qIFR5cGUgb2YgbG9naW4uICAqLworICBfX3BpZF90IHV0X3BpZDsJCS8qIFByb2Nlc3MgSUQgb2YgbG9naW4gcHJvY2Vzcy4gICovCisgIGNoYXIgdXRfbGluZVtfX1VUX0xJTkVTSVpFXTsJLyogRGV2aWNlbmFtZS4gICovCisgIGNoYXIgdXRfaWRbNF07CQkvKiBJbml0dGFiIElELiAqLworICBjaGFyIHV0X3VzZXJbX19VVF9OQU1FU0laRV07CS8qIFVzZXJuYW1lLiAgKi8KKyAgY2hhciB1dF9ob3N0W19fVVRfSE9TVFNJWkVdOwkvKiBIb3N0bmFtZSBmb3IgcmVtb3RlIGxvZ2luLiAgKi8KKyAgc3RydWN0IF9fZXhpdF9zdGF0dXMgdXRfZXhpdDsJLyogRXhpdCBzdGF0dXMgb2YgYSBwcm9jZXNzIG1hcmtlZAorCQkJCSAgIGFzIERFQURfUFJPQ0VTUy4gICovCisKKy8qIFRoZSBmaWVsZHMgdXRfc2Vzc2lvbiBhbmQgdXRfdHYgbXVzdCBiZSB0aGUgc2FtZSBzaXplIHdoZW4gY29tcGlsZWQKKyAgIDMyLSBhbmQgNjQtYml0LiAgVGhpcyBhbGxvd3MgZmlsZXMgYW5kIHNoYXJlZCBtZW1vcnkgdG8gYmUgc2hhcmVkCisgICBiZXR3ZWVuIDMyLSBhbmQgNjQtYml0IGFwcGxpY2F0aW9ucy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NCAmJiBkZWZpbmVkIF9fV09SRFNJWkVfQ09NUEFUMzIKKyAgX19pbnQzMl90IHV0X3Nlc3Npb247CQkvKiBTZXNzaW9uIElELCB1c2VkIGZvciB3aW5kb3dpbmcuICAqLworICBzdHJ1Y3QKKyAgeworICAgIF9faW50MzJfdCB0dl9zZWM7CQkvKiBTZWNvbmRzLiAgKi8KKyAgICBfX2ludDMyX3QgdHZfdXNlYzsJCS8qIE1pY3Jvc2Vjb25kcy4gICovCisgIH0gdXRfdHY7CQkJLyogVGltZSBlbnRyeSB3YXMgbWFkZS4gICovCisjZWxzZQorICBsb25nIGludCB1dF9zZXNzaW9uOwkJLyogU2Vzc2lvbiBJRCwgdXNlZCBmb3Igd2luZG93aW5nLiAgKi8KKyAgc3RydWN0IHRpbWV2YWwgdXRfdHY7CQkvKiBUaW1lIGVudHJ5IHdhcyBtYWRlLiAgKi8KKyNlbmRpZgorICBfX2ludDMyX3QgdXRfYWRkcl92Nls0XTsJLyogSW50ZXJuZXQgYWRkcmVzcyBvZiByZW1vdGUgaG9zdC4gICovCisgIGNoYXIgX191bnVzZWRbMjBdOwkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLworfTsKKworCisvKiBWYWx1ZXMgZm9yIHRoZSBgdXRfdHlwZScgZmllbGQgb2YgYSBgc3RydWN0IHV0bXB4Jy4gICovCisjZGVmaW5lIEVNUFRZCQkwCS8qIE5vIHZhbGlkIHVzZXIgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFJVTl9MVkwJMQkvKiBUaGUgc3lzdGVtJ3MgcnVubGV2ZWwuICAqLworI2VuZGlmCisjZGVmaW5lIEJPT1RfVElNRQkyCS8qIFRpbWUgb2Ygc3lzdGVtIGJvb3QuICAqLworI2RlZmluZSBORVdfVElNRQkzCS8qIFRpbWUgYWZ0ZXIgc3lzdGVtIGNsb2NrIGNoYW5nZWQuICAqLworI2RlZmluZSBPTERfVElNRQk0CS8qIFRpbWUgd2hlbiBzeXN0ZW0gY2xvY2sgY2hhbmdlZC4gICovCisKKyNkZWZpbmUgSU5JVF9QUk9DRVNTCTUJLyogUHJvY2VzcyBzcGF3bmVkIGJ5IHRoZSBpbml0IHByb2Nlc3MuICAqLworI2RlZmluZSBMT0dJTl9QUk9DRVNTCTYJLyogU2Vzc2lvbiBsZWFkZXIgb2YgYSBsb2dnZWQgaW4gdXNlci4gICovCisjZGVmaW5lIFVTRVJfUFJPQ0VTUwk3CS8qIE5vcm1hbCBwcm9jZXNzLiAgKi8KKyNkZWZpbmUgREVBRF9QUk9DRVNTCTgJLyogVGVybWluYXRlZCBwcm9jZXNzLiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgQUNDT1VOVElORwk5CS8qIFN5c3RlbSBhY2NvdW50aW5nLiAgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3V0c25hbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91dHNuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlNzFlMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy91dHNuYW1lLmgKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVVRTTkFNRV9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3V0c25hbWUuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3V0c25hbWUuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworLyogTGVuZ3RoIG9mIHRoZSBlbnRyaWVzIGluIGBzdHJ1Y3QgdXRzbmFtZScgaXMgNjUuICAqLworI2RlZmluZSBfVVRTTkFNRV9MRU5HVEggNjUKKworLyogTGludXggcHJvdmlkZXMgYXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgYHN0cnVjdCB1dHNuYW1lJworICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZG9tYWluLiAgRGVmaW5lIF9VVFNOQU1FX0RPTUFJTl9MRU5HVEgKKyAgIHRvIGEgdmFsdWUgIT0gMCB0byBhY3RpdmF0ZSB0aGlzIGVudHJ5LiAgKi8KKyNkZWZpbmUgX1VUU05BTUVfRE9NQUlOX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93YWl0ZmxhZ3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93YWl0ZmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjRjZWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3dhaXRmbGFncy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIERlZmluaXRpb25zIG9mIGZsYWcgYml0cyBmb3IgYHdhaXRwaWQnIGV0IGFsLgorICAgQ29weXJpZ2h0IChDKSAxOTkyLDE5OTYsMTk5NywyMDAwLDIwMDQsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmICFkZWZpbmVkIF9TWVNfV0FJVF9IICYmICFkZWZpbmVkIF9TVERMSUJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93YWl0ZmxhZ3MuaD4gZGlyZWN0bHk7IHVzZSA8c3lzL3dhaXQuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCisvKiBCaXRzIGluIHRoZSB0aGlyZCBhcmd1bWVudCB0byBgd2FpdHBpZCcuICAqLworI2RlZmluZQlXTk9IQU5HCQkxCS8qIERvbid0IGJsb2NrIHdhaXRpbmcuICAqLworI2RlZmluZQlXVU5UUkFDRUQJMgkvKiBSZXBvcnQgc3RhdHVzIG9mIHN0b3BwZWQgY2hpbGRyZW4uICAqLworCisvKiBCaXRzIGluIHRoZSBmb3VydGggYXJndW1lbnQgdG8gYHdhaXRpZCcuICAqLworI2RlZmluZSBXU1RPUFBFRAkyCS8qIFJlcG9ydCBzdG9wcGVkIGNoaWxkIChzYW1lIGFzIFdVTlRSQUNFRCkuICovCisjZGVmaW5lIFdFWElURUQJCTQJLyogUmVwb3J0IGRlYWQgY2hpbGQuICAqLworI2RlZmluZSBXQ09OVElOVUVECTgJLyogUmVwb3J0IGNvbnRpbnVlZCBjaGlsZC4gICovCisjZGVmaW5lIFdOT1dBSVQJCTB4MDEwMDAwMDAgLyogRG9uJ3QgcmVhcCwganVzdCBwb2xsIHN0YXR1cy4gICovCisKKyNkZWZpbmUgX19XTk9USFJFQUQgICAgIDB4MjAwMDAwMDAgLyogRG9uJ3Qgd2FpdCBvbiBjaGlsZHJlbiBvZiBvdGhlciB0aHJlYWRzCisJCQkJICAgICAgaW4gdGhpcyBncm91cCAqLworI2RlZmluZSBfX1dBTEwJCTB4NDAwMDAwMDAgLyogV2FpdCBmb3IgYW55IGNoaWxkLiAgKi8KKyNkZWZpbmUgX19XQ0xPTkUJMHg4MDAwMDAwMCAvKiBXYWl0IGZvciBjbG9uZWQgcHJvY2Vzcy4gICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvd2FpdHN0YXR1cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3dhaXRzdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTljMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3dhaXRzdGF0dXMuaApAQCAtMCwwICsxLDEwNiBAQAorLyogRGVmaW5pdGlvbnMgb2Ygc3RhdHVzIGJpdHMgZm9yIGB3YWl0JyBldCBhbC4KKyAgIENvcHlyaWdodCAoQykgMTk5MiwxOTk0LDE5OTYsMTk5NywyMDAwLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZiAhZGVmaW5lZCBfU1lTX1dBSVRfSCAmJiAhZGVmaW5lZCBfU1RETElCX0gKKyMgZXJyb3IgIk5ldmVyIGluY2x1ZGUgPGJpdHMvd2FpdHN0YXR1cy5oPiBkaXJlY3RseTsgdXNlIDxzeXMvd2FpdC5oPiBpbnN0ZWFkLiIKKyNlbmRpZgorCisKKy8qIEV2ZXJ5dGhpbmcgZXh0YW50IHNvIGZhciB1c2VzIHRoZXNlIHNhbWUgYml0cy4gICovCisKKworLyogSWYgV0lGRVhJVEVEKFNUQVRVUyksIHRoZSBsb3ctb3JkZXIgOCBiaXRzIG9mIHRoZSBzdGF0dXMuICAqLworI2RlZmluZQlfX1dFWElUU1RBVFVTKHN0YXR1cykJKCgoc3RhdHVzKSAmIDB4ZmYwMCkgPj4gOCkKKworLyogSWYgV0lGU0lHTkFMRUQoU1RBVFVTKSwgdGhlIHRlcm1pbmF0aW5nIHNpZ25hbC4gICovCisjZGVmaW5lCV9fV1RFUk1TSUcoc3RhdHVzKQkoKHN0YXR1cykgJiAweDdmKQorCisvKiBJZiBXSUZTVE9QUEVEKFNUQVRVUyksIHRoZSBzaWduYWwgdGhhdCBzdG9wcGVkIHRoZSBjaGlsZC4gICovCisjZGVmaW5lCV9fV1NUT1BTSUcoc3RhdHVzKQlfX1dFWElUU1RBVFVTKHN0YXR1cykKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIG5vcm1hbCB0ZXJtaW5hdGlvbi4gICovCisjZGVmaW5lCV9fV0lGRVhJVEVEKHN0YXR1cykJKF9fV1RFUk1TSUcoc3RhdHVzKSA9PSAwKQorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGVybWluYXRpb24gYnkgYSBzaWduYWwuICAqLworI2RlZmluZSBfX1dJRlNJR05BTEVEKHN0YXR1cykgXAorICAoKChzaWduZWQgY2hhcikgKCgoc3RhdHVzKSAmIDB4N2YpICsgMSkgPj4gMSkgPiAwKQorCisvKiBOb256ZXJvIGlmIFNUQVRVUyBpbmRpY2F0ZXMgdGhlIGNoaWxkIGlzIHN0b3BwZWQuICAqLworI2RlZmluZQlfX1dJRlNUT1BQRUQoc3RhdHVzKQkoKChzdGF0dXMpICYgMHhmZikgPT0gMHg3ZikKKworLyogTm9uemVybyBpZiBTVEFUVVMgaW5kaWNhdGVzIHRoZSBjaGlsZCBjb250aW51ZWQgYWZ0ZXIgYSBzdG9wLiAgV2Ugb25seQorICAgZGVmaW5lIHRoaXMgaWYgPGJpdHMvd2FpdGZsYWdzLmg+IHByb3ZpZGVzIHRoZSBXQ09OVElOVUVEIGZsYWcgYml0LiAgKi8KKyNpZmRlZiBXQ09OVElOVUVECisjIGRlZmluZSBfX1dJRkNPTlRJTlVFRChzdGF0dXMpCSgoc3RhdHVzKSA9PSBfX1dfQ09OVElOVUVEKQorI2VuZGlmCisKKy8qIE5vbnplcm8gaWYgU1RBVFVTIGluZGljYXRlcyB0aGUgY2hpbGQgZHVtcGVkIGNvcmUuICAqLworI2RlZmluZQlfX1dDT1JFRFVNUChzdGF0dXMpCSgoc3RhdHVzKSAmIF9fV0NPUkVGTEFHKQorCisvKiBNYWNyb3MgZm9yIGNvbnN0cnVjdGluZyBzdGF0dXMgdmFsdWVzLiAgKi8KKyNkZWZpbmUJX19XX0VYSVRDT0RFKHJldCwgc2lnKQkoKHJldCkgPDwgOCB8IChzaWcpKQorI2RlZmluZQlfX1dfU1RPUENPREUoc2lnKQkoKHNpZykgPDwgOCB8IDB4N2YpCisjZGVmaW5lIF9fV19DT05USU5VRUQJCTB4ZmZmZgorI2RlZmluZQlfX1dDT1JFRkxBRwkJMHg4MAorCisKKyNpZmRlZglfX1VTRV9CU0QKKworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKwordW5pb24gd2FpdAorICB7CisgICAgaW50IHdfc3RhdHVzOworICAgIHN0cnVjdAorICAgICAgeworIyBpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdW5zaWduZWQgaW50IF9fd190ZXJtc2lnOjc7IC8qIFRlcm1pbmF0aW5nIHNpZ25hbC4gICovCisJdW5zaWduZWQgaW50IF9fd19jb3JlZHVtcDoxOyAvKiBTZXQgaWYgZHVtcGVkIGNvcmUuICAqLworCXVuc2lnbmVkIGludCBfX3dfcmV0Y29kZTo4OyAvKiBSZXR1cm4gY29kZSBpZiBleGl0ZWQgbm9ybWFsbHkuICAqLworCXVuc2lnbmVkIGludDoxNjsKKyMgZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQ6MTY7CisJdW5zaWduZWQgaW50IF9fd19yZXRjb2RlOjg7CisJdW5zaWduZWQgaW50IF9fd19jb3JlZHVtcDoxOworCXVuc2lnbmVkIGludCBfX3dfdGVybXNpZzo3OworIyBlbmRpZgkJCQkvKiBCaWcgZW5kaWFuLiAgKi8KKyAgICAgIH0gX193YWl0X3Rlcm1pbmF0ZWQ7CisgICAgc3RydWN0CisgICAgICB7CisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZCBpbnQgX193X3N0b3B2YWw6ODsgLyogV19TVE9QUEVEIGlmIHN0b3BwZWQuICAqLworCXVuc2lnbmVkIGludCBfX3dfc3RvcHNpZzo4OyAvKiBTdG9wcGluZyBzaWduYWwuICAqLworCXVuc2lnbmVkIGludDoxNjsKKyMgZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisjIGlmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQ6MTY7CisJdW5zaWduZWQgaW50IF9fd19zdG9wc2lnOjg7IC8qIFN0b3BwaW5nIHNpZ25hbC4gICovCisJdW5zaWduZWQgaW50IF9fd19zdG9wdmFsOjg7IC8qIFdfU1RPUFBFRCBpZiBzdG9wcGVkLiAgKi8KKyMgZW5kaWYJCQkJLyogQmlnIGVuZGlhbi4gICovCisgICAgICB9IF9fd2FpdF9zdG9wcGVkOworICB9OworCisjIGRlZmluZSB3X3Rlcm1zaWcJX193YWl0X3Rlcm1pbmF0ZWQuX193X3Rlcm1zaWcKKyMgZGVmaW5lIHdfY29yZWR1bXAJX193YWl0X3Rlcm1pbmF0ZWQuX193X2NvcmVkdW1wCisjIGRlZmluZSB3X3JldGNvZGUJX193YWl0X3Rlcm1pbmF0ZWQuX193X3JldGNvZGUKKyMgZGVmaW5lIHdfc3RvcHNpZwlfX3dhaXRfc3RvcHBlZC5fX3dfc3RvcHNpZworIyBkZWZpbmUgd19zdG9wdmFsCV9fd2FpdF9zdG9wcGVkLl9fd19zdG9wdmFsCisKKyNlbmRpZgkvKiBVc2UgQlNELiAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93Y2hhci1sZGJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvd2NoYXItbGRibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTZhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvd2NoYXItbGRibC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIC1tbG9uZy1kb3VibGUtNjQgY29tcGF0aWJpbGl0eSBtb2RlIGZvciA8d2NoYXIuaD4gZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9XQ0hBUl9ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3djaGFyLWxkYmwuaD4gZGlyZWN0bHk7IHVzZSA8d2NoYXIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk1IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTERCTF9SRURJUl9ERUNMIChmd3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAod3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAoc3dwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHZmd3ByaW50Zik7CitfX0xEQkxfUkVESVJfREVDTCAodndwcmludGYpOworX19MREJMX1JFRElSX0RFQ0wgKHZzd3ByaW50Zik7CisjIGlmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMIChmd3NjYW5mLCBfX25sZGJsX19faXNvYzk5X2Z3c2NhbmYpCitfX0xEQkxfUkVESVIxX0RFQ0wgKHdzY2FuZiwgX19ubGRibF9fX2lzb2M5OV93c2NhbmYpICAKK19fTERCTF9SRURJUjFfREVDTCAoc3dzY2FuZiwgX19ubGRibF9fX2lzb2M5OV9zd3NjYW5mKQorIyBlbHNlCitfX0xEQkxfUkVESVJfREVDTCAoZndzY2FuZik7CitfX0xEQkxfUkVESVJfREVDTCAod3NjYW5mKTsKK19fTERCTF9SRURJUl9ERUNMIChzd3NjYW5mKTsKKyMgZW5kaWYKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fTERCTF9SRURJUjFfREVDTCAod2NzdG9sZCwgd2NzdG9kKTsKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VICYmICFkZWZpbmVkIF9fUkVESVJFQ1QgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorX19MREJMX1JFRElSMV9ERUNMICh2ZndzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92ZndzY2FuZikKK19fTERCTF9SRURJUjFfREVDTCAodndzY2FuZiwgX19ubGRibF9fX2lzb2M5OV92d3NjYW5mKSAgCitfX0xEQkxfUkVESVIxX0RFQ0wgKHZzd3NjYW5mLCBfX25sZGJsX19faXNvYzk5X3Zzd3NjYW5mKQorIyBlbHNlCitfX0xEQkxfUkVESVJfREVDTCAodmZ3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHZ3c2NhbmYpOworX19MREJMX1JFRElSX0RFQ0wgKHZzd3NjYW5mKTsKKyMgZW5kaWYKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCitfX0xEQkxfUkVESVIxX0RFQ0wgKHdjc3RvbGRfbCwgd2NzdG9kX2wpOworI2VuZGlmCisKKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKK19fTERCTF9SRURJUl9ERUNMIChfX3N3cHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3Zzd3ByaW50Zl9jaGspCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxCitfX0xEQkxfUkVESVJfREVDTCAoX19md3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX193cHJpbnRmX2NoaykKK19fTERCTF9SRURJUl9ERUNMIChfX3Zmd3ByaW50Zl9jaGspCitfX0xEQkxfUkVESVJfREVDTCAoX192d3ByaW50Zl9jaGspCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93Y2hhci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3djaGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxZjU2MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93Y2hhci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIHdjaGFyX3QgdHlwZSByZWxhdGVkIGRlZmluaXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9CSVRTX1dDSEFSX0gKKyNkZWZpbmUgX0JJVFNfV0NIQVJfSAkxCisKKyNkZWZpbmUgX19XQ0hBUl9NSU4JKC0yMTQ3NDgzNjQ3IC0gMSkKKyNkZWZpbmUgX19XQ0hBUl9NQVgJKDIxNDc0ODM2NDcpCisKKyNlbmRpZgkvKiBiaXRzL3djaGFyLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93Y2hhcjIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy93Y2hhcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM0Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3djaGFyMi5oCkBAIC0wLDAgKzEsNTkwIEBACisvKiBDaGVja2luZyBtYWNyb3MgZm9yIHdjaGFyIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfV0NIQVJfSAorIyBlcnJvciAiTmV2ZXIgaW5jbHVkZSA8Yml0cy93Y2hhcjIuaD4gZGlyZWN0bHk7IHVzZSA8d2NoYXIuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworCitleHRlcm4gd2NoYXJfdCAqX193bWVtY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKSwKKwkJCQl3bWVtY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtY3B5X2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCSBzaXplX3QgX19uczEpLCBfX3dtZW1jcHlfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbWNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbWNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJc2l6ZV90IF9fbikpCit7CisgIGlmIChfX2JvczAgKF9fczEpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikpCisJcmV0dXJuIF9fd21lbWNweV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1jcHlfY2hrX3dhcm4gKF9fczEsIF9fczIsIF9fbiwKKwkJCQkgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtY3B5X2FsaWFzIChfX3MxLCBfX3MyLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1tb3ZlX2NoayAod2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJCXNpemVfdCBfX24sIHNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtbW92ZV9hbGlhcywgKHdjaGFyX3QgKl9fczEsCisJCQkJCQkgICBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkJCQkgICBzaXplX3QgX19uKSwgd21lbW1vdmUpOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1tb3ZlX2Noa193YXJuLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCSBzaXplX3QgX19uczEpLCBfX3dtZW1tb3ZlX2NoaykKKyAgICAgX193YXJuYXR0ciAoIndtZW1tb3ZlIGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3bWVtbW92ZSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MwIChfX3MxKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3dtZW1tb3ZlX2NoayAoX19zMSwgX19zMiwgX19uLAorCQkJICAgICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX3dtZW1tb3ZlX2Noa193YXJuIChfX3MxLCBfX3MyLCBfX24sCisJCQkJICAgIF9fYm9zMCAoX19zMSkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX3dtZW1tb3ZlX2FsaWFzIChfX3MxLCBfX3MyLCBfX24pOworfQorCisKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1wY3B5X2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uLAorCQkJCXNpemVfdCBfX25zMSkgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtcGNweV9hbGlhcywKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwKKwkJCQkgc2l6ZV90IF9fbiksIHdtZW1wY3B5KTsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193bWVtcGNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMxKSwgX193bWVtcGNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3bWVtcGNweSBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbXBjcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsCisJCSBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zMCAoX19zMSkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193bWVtcGNweV9jaGsgKF9fczEsIF9fczIsIF9fbiwKKwkJCSAgICAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX24gPiBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX193bWVtcGNweV9jaGtfd2FybiAoX19zMSwgX19zMiwgX19uLAorCQkJCSAgICBfX2JvczAgKF9fczEpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193bWVtcGNweV9hbGlhcyAoX19zMSwgX19zMiwgX19uKTsKK30KKyNlbmRpZgorCisKK2V4dGVybiB3Y2hhcl90ICpfX3dtZW1zZXRfY2hrICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX25zKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3dtZW1zZXRfYWxpYXMsICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLAorCQkJCQkJICBzaXplX3QgX19uKSwgd21lbXNldCk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd21lbXNldF9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbiwKKwkJCQkgc2l6ZV90IF9fbnMpLCBfX3dtZW1zZXRfY2hrKQorICAgICBfX3dhcm5hdHRyICgid21lbXNldCBjYWxsZWQgd2l0aCBsZW5ndGggYmlnZ2VyIHRoYW4gc2l6ZSBvZiBkZXN0aW5hdGlvbiAiCisJCSAiYnVmZmVyIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgd2NoYXJfdCAqCitfX05USCAod21lbXNldCAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKSkKK3sKKyAgaWYgKF9fYm9zMCAoX19zKSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX24pKQorCXJldHVybiBfX3dtZW1zZXRfY2hrIChfX3MsIF9fYywgX19uLCBfX2JvczAgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKTsKKworICAgICAgaWYgKF9fbiA+IF9fYm9zMCAoX19zKSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd21lbXNldF9jaGtfd2FybiAoX19zLCBfX2MsIF9fbiwKKwkJCQkgICBfX2JvczAgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX3dtZW1zZXRfYWxpYXMgKF9fcywgX19jLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc2NweV9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NjcHlfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpLCB3Y3NjcHkpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc2NweSAod2NoYXJfdCAqX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fc3JjKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX3djc2NweV9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgIHJldHVybiBfX3djc2NweV9hbGlhcyAoX19kZXN0LCBfX3NyYyk7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NwY3B5X2NoayAod2NoYXJfdCAqX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3BjcHlfYWxpYXMsICh3Y2hhcl90ICpfX2Rlc3QsCisJCQkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3NyYyksCisJCQkJd2NwY3B5KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3BjcHkgKHdjaGFyX3QgKl9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3NyYykpCit7CisgIGlmIChfX2JvcyAoX19kZXN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICByZXR1cm4gX193Y3BjcHlfY2hrIChfX2Rlc3QsIF9fc3JjLCBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworICByZXR1cm4gX193Y3BjcHlfYWxpYXMgKF9fZGVzdCwgX19zcmMpOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc25jcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24sCisJCQkgICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NuY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uKSwgd2NzbmNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NzbmNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiwgc2l6ZV90IF9fZGVzdGxlbiksIF9fd2NzbmNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3NuY3B5IGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3NuY3B5ICh3Y2hhcl90ICpfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19zcmMsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193Y3NuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICAgICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICAgIGlmIChfX24gPiBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd2NzbmNweV9jaGtfd2FybiAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJCSAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193Y3NuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djcG5jcHlfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24sCisJCQkgICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3BuY3B5X2FsaWFzLAorCQkJCSh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJCSBzaXplX3QgX19uKSwgd2NwbmNweSk7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVF9OVEggKF9fd2NwbmNweV9jaGtfd2FybiwKKwkJCQkod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCQkgc2l6ZV90IF9fbiwgc2l6ZV90IF9fZGVzdGxlbiksIF9fd2NwbmNweV9jaGspCisgICAgIF9fd2FybmF0dHIgKCJ3Y3BuY3B5IGNhbGxlZCB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiBzaXplIG9mIGRlc3RpbmF0aW9uICIKKwkJICJidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3BuY3B5ICh3Y2hhcl90ICpfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19zcmMsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSkKKwlyZXR1cm4gX193Y3BuY3B5X2NoayAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJICAgICAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICAgIGlmIChfX24gPiBfX2JvcyAoX19kZXN0KSAvIHNpemVvZiAod2NoYXJfdCkpCisJcmV0dXJuIF9fd2NwbmNweV9jaGtfd2FybiAoX19kZXN0LCBfX3NyYywgX19uLAorCQkJCSAgIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX193Y3BuY3B5X2FsaWFzIChfX2Rlc3QsIF9fc3JjLCBfX24pOworfQorCisKK2V4dGVybiB3Y2hhcl90ICpfX3djc2NhdF9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgc2l6ZV90IF9fZGVzdGxlbikgX19USFJPVzsKK2V4dGVybiB3Y2hhcl90ICpfX1JFRElSRUNUX05USCAoX193Y3NjYXRfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpLCB3Y3NjYXQpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHdjaGFyX3QgKgorX19OVEggKHdjc2NhdCAod2NoYXJfdCAqX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fc3JjKSkKK3sKKyAgaWYgKF9fYm9zIChfX2Rlc3QpICE9IChzaXplX3QpIC0xKQorICAgIHJldHVybiBfX3djc2NhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fYm9zIChfX2Rlc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgIHJldHVybiBfX3djc2NhdF9hbGlhcyAoX19kZXN0LCBfX3NyYyk7Cit9CisKKworZXh0ZXJuIHdjaGFyX3QgKl9fd2NzbmNhdF9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19uLCBzaXplX3QgX19kZXN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1RfTlRIIChfX3djc25jYXRfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMsCisJCQkJIHNpemVfdCBfX24pLCB3Y3NuY2F0KTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSB3Y2hhcl90ICoKK19fTlRIICh3Y3NuY2F0ICh3Y2hhcl90ICpfX2Rlc3QsIF9fY29uc3Qgd2NoYXJfdCAqX19zcmMsIHNpemVfdCBfX24pKQoreworICBpZiAoX19ib3MgKF9fZGVzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgcmV0dXJuIF9fd2NzbmNhdF9jaGsgKF9fZGVzdCwgX19zcmMsIF9fbiwKKwkJCSAgX19ib3MgKF9fZGVzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgcmV0dXJuIF9fd2NzbmNhdF9hbGlhcyAoX19kZXN0LCBfX3NyYywgX19uKTsKK30KKworCitleHRlcm4gaW50IF9fc3dwcmludGZfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJCSAgIGludCBfX2ZsYWcsIHNpemVfdCBfX3NfbGVuLAorCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCA1LCA2KSkpICovOworCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIX0xEQkwgKF9fc3dwcmludGZfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLiksCisJCQkJc3dwcmludGYpOworCisjaWZkZWYgX192YV9hcmdfcGFjaworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK19fTlRIIChzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikpCit7CisgIGlmIChfX2JvcyAoX19zKSAhPSAoc2l6ZV90KSAtMSB8fCBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMSkKKyAgICByZXR1cm4gX19zd3ByaW50Zl9jaGsgKF9fcywgX19uLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwKKwkJCSAgIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCSAgIF9fZm10LCBfX3ZhX2FyZ19wYWNrICgpKTsKKyAgcmV0dXJuIF9fc3dwcmludGZfYWxpYXMgKF9fcywgX19uLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisjZWxpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogWFhYIFdlIG1pZ2h0IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGluIGdjYyBmb3Igc3dwcmludGYuICAqLworIyBkZWZpbmUgc3dwcmludGYocywgbiwgLi4uKSBcCisgIChfX2JvcyAocykgIT0gKHNpemVfdCkgLTEgfHwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEJCQkgICAgICBcCisgICA/IF9fc3dwcmludGZfY2hrIChzLCBuLCBfX1VTRV9GT1JUSUZZX0xFVkVMIC0gMSwJCQkgICAgICBcCisJCSAgICAgX19ib3MgKHMpIC8gc2l6ZW9mICh3Y2hhcl90KSwgX19WQV9BUkdTX18pCQkgICAgICBcCisgICA6IHN3cHJpbnRmIChzLCBuLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworZXh0ZXJuIGludCBfX3Zzd3ByaW50Zl9jaGsgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJICAgIGludCBfX2ZsYWcsIHNpemVfdCBfX3NfbGVuLAorCQkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDUsIDApKSkgKi87CisKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEhfTERCTCAoX192c3dwcmludGZfYWxpYXMsCisJCQkJKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJCSBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsCisJCQkJIF9fZ251Y192YV9saXN0IF9fYXApLCB2c3dwcmludGYpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIGludAorX19OVEggKHZzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm10LCBfX2dudWNfdmFfbGlzdCBfX2FwKSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xIHx8IF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAxKQorICAgIHJldHVybiBfX3Zzd3ByaW50Zl9jaGsgKF9fcywgX19uLCAgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsCisJCQkgICAgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLCBfX2ZtdCwgX19hcCk7CisgIHJldHVybiBfX3Zzd3ByaW50Zl9hbGlhcyAoX19zLCBfX24sIF9fZm10LCBfX2FwKTsKK30KKworCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEKKworZXh0ZXJuIGludCBfX2Z3cHJpbnRmX2NoayAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX3dwcmludGZfY2hrIChpbnQgX19mbGFnLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIC4uLik7CitleHRlcm4gaW50IF9fdmZ3cHJpbnRmX2NoayAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBpbnQgX19mbGFnLAorCQkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICBfX2dudWNfdmFfbGlzdCBfX2FwKTsKK2V4dGVybiBpbnQgX192d3ByaW50Zl9jaGsgKGludCBfX2ZsYWcsIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgIF9fZ251Y192YV9saXN0IF9fYXApOworCisjIGlmZGVmIF9fdmFfYXJnX3BhY2sKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Cit3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fd3ByaW50Zl9jaGsgKF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7Cit9CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgaW50Citmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIC4uLikKK3sKKyAgcmV0dXJuIF9fZndwcmludGZfY2hrIChfX3N0cmVhbSwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LAorCQkJIF9fdmFfYXJnX3BhY2sgKCkpOworfQorIyBlbGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgd3ByaW50ZiguLi4pIFwKKyAgX193cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIGZ3cHJpbnRmKHN0cmVhbSwgLi4uKSBcCisgIF9fZndwcmludGZfY2hrIChzdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX1ZBX0FSR1NfXykKKyMgZW5kaWYKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3Z3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApCit7CisgIHJldHVybiBfX3Z3cHJpbnRmX2NoayAoX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsIF9fZm10LCBfX2FwKTsKK30KKworX19leHRlcm5fYWx3YXlzX2lubGluZSBpbnQKK3Zmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCSAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVjX3ZhX2xpc3QgX19hcCkKK3sKKyAgcmV0dXJuIF9fdmZ3cHJpbnRmX2NoayAoX19zdHJlYW0sIF9fVVNFX0ZPUlRJRllfTEVWRUwgLSAxLCBfX2ZtdCwgX19hcCk7Cit9CisKKyNlbmRpZgorCitleHRlcm4gd2NoYXJfdCAqX19mZ2V0d3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfYWxpYXMsCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0d3MpIF9fd3VyOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1QgKF9fZmdldHdzX2Noa193YXJuLAorCQkJICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgX19mZ2V0d3NfY2hrKQorICAgICBfX3d1ciBfX3dhcm5hdHRyICgiZmdldHdzIGNhbGxlZCB3aXRoIGJpZ2dlciBzaXplIHRoYW4gbGVuZ3RoICIKKwkJICAgICAgICJvZiBkZXN0aW5hdGlvbiBidWZmZXIiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBfX3d1ciB3Y2hhcl90ICoKK2ZnZXR3cyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKK3sKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xKQorICAgIHsKKyAgICAgIGlmICghX19idWlsdGluX2NvbnN0YW50X3AgKF9fbikgfHwgX19uIDw9IDApCisJcmV0dXJuIF9fZmdldHdzX2NoayAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkgICAgIF9fbiwgX19zdHJlYW0pOworCisgICAgICBpZiAoKHNpemVfdCkgX19uID4gX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX2ZnZXR3c19jaGtfd2FybiAoX19zLCBfX2JvcyAoX19zKSAvIHNpemVvZiAod2NoYXJfdCksCisJCQkJICBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXR3c19hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIHdjaGFyX3QgKl9fZmdldHdzX3VubG9ja2VkX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX3NpemUsCisJCQkJICAgICAgIGludCBfX24sIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKKyAgX193dXI7CitleHRlcm4gd2NoYXJfdCAqX19SRURJUkVDVCAoX19mZ2V0d3NfdW5sb2NrZWRfYWxpYXMsCisJCQkgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLAorCQkJICAgICBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pLCBmZ2V0d3NfdW5sb2NrZWQpCisgIF9fd3VyOworZXh0ZXJuIHdjaGFyX3QgKl9fUkVESVJFQ1QgKF9fZmdldHdzX3VubG9ja2VkX2Noa193YXJuLAorCQkJICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fc2l6ZSwgaW50IF9fbiwKKwkJCSAgICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwKKwkJCSAgICBfX2ZnZXR3c191bmxvY2tlZF9jaGspCisgICAgIF9fd3VyIF9fd2FybmF0dHIgKCJmZ2V0d3NfdW5sb2NrZWQgY2FsbGVkIHdpdGggYmlnZ2VyIHNpemUgdGhhbiBsZW5ndGggIgorCQkgICAgICAgIm9mIGRlc3RpbmF0aW9uIGJ1ZmZlciIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHdjaGFyX3QgKgorZmdldHdzX3VubG9ja2VkICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKQoreworICBpZiAoX19ib3MgKF9fcykgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19uKSB8fCBfX24gPD0gMCkKKwlyZXR1cm4gX19mZ2V0d3NfdW5sb2NrZWRfY2hrIChfX3MsIF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSwKKwkJCQkgICAgICBfX24sIF9fc3RyZWFtKTsKKworICAgICAgaWYgKChzaXplX3QpIF9fbiA+IF9fYm9zIChfX3MpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19mZ2V0d3NfdW5sb2NrZWRfY2hrX3dhcm4gKF9fcywgX19ib3MgKF9fcykgLyBzaXplb2YgKHdjaGFyX3QpLAorCQkJCQkgICBfX24sIF9fc3RyZWFtKTsKKyAgICB9CisgIHJldHVybiBfX2ZnZXR3c191bmxvY2tlZF9hbGlhcyAoX19zLCBfX24sIF9fc3RyZWFtKTsKK30KKyNlbmRpZgorCisKK2V4dGVybiBzaXplX3QgX193Y3J0b21iX2NoayAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIsIG1ic3RhdGVfdCAqX19wLAorCQkJICBzaXplX3QgX19idWZsZW4pIF9fVEhST1cgX193dXI7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djcnRvbWJfYWxpYXMsCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193Y2hhciwKKwkJCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksIHdjcnRvbWIpIF9fd3VyOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIF9fd3VyIHNpemVfdAorX19OVEggKHdjcnRvbWIgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyLCBtYnN0YXRlX3QgKl9fcHMpKQoreworICAvKiBXZSB3b3VsZCBoYXZlIHRvIGluY2x1ZGUgPGxpbWl0cy5oPiB0byBnZXQgYSBkZWZpbml0aW9uIG9mIE1CX0xFTl9NQVguCisgICAgIEJ1dCB0aGlzIHdvdWxkIG9ubHkgZGlzdHVyYiB0aGUgbmFtZXNwYWNlLiAgU28gd2UgZGVmaW5lIG91ciBvd24KKyAgICAgdmVyc2lvbiBoZXJlLiAgKi8KKyNkZWZpbmUgX19XQ0hBUl9NQl9MRU5fTUFYCTE2CisjaWYgZGVmaW5lZCBNQl9MRU5fTUFYICYmIE1CX0xFTl9NQVggIT0gX19XQ0hBUl9NQl9MRU5fTUFYCisjIGVycm9yICJBc3N1bWVkIHZhbHVlIG9mIE1CX0xFTl9NQVggd3JvbmciCisjZW5kaWYKKyAgaWYgKF9fYm9zIChfX3MpICE9IChzaXplX3QpIC0xICYmIF9fV0NIQVJfTUJfTEVOX01BWCA+IF9fYm9zIChfX3MpKQorICAgIHJldHVybiBfX3djcnRvbWJfY2hrIChfX3MsIF9fd2NoYXIsIF9fcHMsIF9fYm9zIChfX3MpKTsKKyAgcmV0dXJuIF9fd2NydG9tYl9hbGlhcyAoX19zLCBfX3djaGFyLCBfX3BzKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fbWJzcnRvd2NzX2NoayAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnNydG93Y3NfYWxpYXMsCisJCQkgICAgICAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpLAorCQkJICAgICAgbWJzcnRvd2NzKTsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzcnRvd2NzX2Noa193YXJuLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJICAgICAgIHNpemVfdCBfX2RzdGxlbiksIF9fbWJzcnRvd2NzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIm1ic3J0b3djcyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4gIgorCQkgIiogc2l6ZW9mICh3Y2hhcl90KSIpOworCitfX2V4dGVybl9hbHdheXNfaW5saW5lIHNpemVfdAorX19OVEggKG1ic3J0b3djcyAod2NoYXJfdCAqX19yZXN0cmljdCBfX2RzdCwgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywKKwkJICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sKKyAgaWYgKF9fYm9zIChfX2RzdCkgIT0gKHNpemVfdCkgLTEpCisgICAgeworICAgICAgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19sZW4pKQorCXJldHVybiBfX21ic3J0b3djc19jaGsgKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMsCisJCQkJX19ib3MgKF9fZHN0KSAvIHNpemVvZiAod2NoYXJfdCkpOworCisgICAgICBpZiAoX19sZW4gPiBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSkKKwlyZXR1cm4gX19tYnNydG93Y3NfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMsCisJCQkJICAgICBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisgICAgfQorICByZXR1cm4gX19tYnNydG93Y3NfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19sZW4sIF9fcHMpOworfQorCisKK2V4dGVybiBzaXplX3QgX193Y3NydG9tYnNfY2hrIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IF9fUkVESVJFQ1RfTlRIIChfX3djc3J0b21ic19hbGlhcywKKwkJCSAgICAgIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgICAgICAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksCisJCQkgICAgICB3Y3NydG9tYnMpOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3NydG9tYnNfY2hrX3dhcm4sCisJCQkgICAgICAoY2hhciAqX19yZXN0cmljdCBfX2RzdCwKKwkJCSAgICAgICBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSwgX193Y3NydG9tYnNfY2hrKQorICAgIF9fd2FybmF0dHIgKCJ3Y3NydG9tYnMgY2FsbGVkIHdpdGggZHN0IGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGVuIik7CisKK19fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgc2l6ZV90CitfX05USCAod2NzcnRvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fd2NzcnRvbWJzX2NoayAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcywgX19ib3MgKF9fZHN0KSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkpCisJcmV0dXJuIF9fd2NzcnRvbWJzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbGVuLCBfX3BzLCBfX2JvcyAoX19kc3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc3J0b21ic19hbGlhcyAoX19kc3QsIF9fc3JjLCBfX2xlbiwgX19wcyk7Cit9CisKKworI2lmZGVmIF9fVVNFX0dOVQorZXh0ZXJuIHNpemVfdCBfX21ic25ydG93Y3NfY2hrICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJCV9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX25tYywKKwkJCQlzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzLAorCQkJCXNpemVfdCBfX2RzdGxlbikgX19USFJPVzsKK2V4dGVybiBzaXplX3QgX19SRURJUkVDVF9OVEggKF9fbWJzbnJ0b3djc19hbGlhcywKKwkJCSAgICAgICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJICAgICAgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX25tYywKKwkJCSAgICAgICBzaXplX3QgX19sZW4sIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSwKKwkJCSAgICAgIG1ic25ydG93Y3MpOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX19tYnNucnRvd2NzX2Noa193YXJuLAorCQkJICAgICAgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCBjaGFyICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbm1jLAorCQkJICAgICAgIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMsCisJCQkgICAgICAgc2l6ZV90IF9fZHN0bGVuKSwgX19tYnNucnRvd2NzX2NoaykKKyAgICAgX193YXJuYXR0ciAoIm1ic25ydG93Y3MgY2FsbGVkIHdpdGggZHN0IGJ1ZmZlciBzbWFsbGVyIHRoYW4gbGVuICIKKwkJICIqIHNpemVvZiAod2NoYXJfdCkiKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIIChtYnNucnRvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkgICBzaXplX3QgX19ubWMsIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fbWJzbnJ0b3djc19jaGsgKF9fZHN0LCBfX3NyYywgX19ubWMsIF9fbGVuLCBfX3BzLAorCQkJCSBfX2JvcyAoX19kc3QpIC8gc2l6ZW9mICh3Y2hhcl90KSk7CisKKyAgICAgIGlmIChfX2xlbiA+IF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKQorCXJldHVybiBfX21ic25ydG93Y3NfY2hrX3dhcm4gKF9fZHN0LCBfX3NyYywgX19ubWMsIF9fbGVuLCBfX3BzLAorCQkJCSAgICAgIF9fYm9zIChfX2RzdCkgLyBzaXplb2YgKHdjaGFyX3QpKTsKKyAgICB9CisgIHJldHVybiBfX21ic25ydG93Y3NfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19ubWMsIF9fbGVuLCBfX3BzKTsKK30KKworCitleHRlcm4gc2l6ZV90IF9fd2NzbnJ0b21ic19jaGsgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkJX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCQlzaXplX3QgX19ud2MsIHNpemVfdCBfX2xlbiwKKwkJCQltYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywgc2l6ZV90IF9fZHN0bGVuKQorICAgICBfX1RIUk9XOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3NucnRvbWJzX2FsaWFzLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19ud2MsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcyksIHdjc25ydG9tYnMpOworZXh0ZXJuIHNpemVfdCBfX1JFRElSRUNUX05USCAoX193Y3NucnRvbWJzX2Noa193YXJuLAorCQkJICAgICAgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywKKwkJCSAgICAgICBzaXplX3QgX19ud2MsIHNpemVfdCBfX2xlbiwKKwkJCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcywKKwkJCSAgICAgICBzaXplX3QgX19kc3RsZW4pLCBfX3djc25ydG9tYnNfY2hrKQorICAgICBfX3dhcm5hdHRyICgid2NzbnJ0b21icyBjYWxsZWQgd2l0aCBkc3QgYnVmZmVyIHNtYWxsZXIgdGhhbiBsZW4iKTsKKworX19leHRlcm5fYWx3YXlzX2lubGluZSBzaXplX3QKK19fTlRIICh3Y3NucnRvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fZHN0LCBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLAorCQkgICBzaXplX3QgX19ud2MsIHNpemVfdCBfX2xlbiwgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpKQoreworICBpZiAoX19ib3MgKF9fZHN0KSAhPSAoc2l6ZV90KSAtMSkKKyAgICB7CisgICAgICBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wIChfX2xlbikpCisJcmV0dXJuIF9fd2NzbnJ0b21ic19jaGsgKF9fZHN0LCBfX3NyYywgX19ud2MsIF9fbGVuLCBfX3BzLAorCQkJCSBfX2JvcyAoX19kc3QpKTsKKworICAgICAgaWYgKF9fbGVuID4gX19ib3MgKF9fZHN0KSkKKwlyZXR1cm4gX193Y3NucnRvbWJzX2Noa193YXJuIChfX2RzdCwgX19zcmMsIF9fbndjLCBfX2xlbiwgX19wcywKKwkJCQkgICAgICBfX2JvcyAoX19kc3QpKTsKKyAgICB9CisgIHJldHVybiBfX3djc25ydG9tYnNfYWxpYXMgKF9fZHN0LCBfX3NyYywgX19ud2MsIF9fbGVuLCBfX3BzKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3dvcmRzaXplLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMvd29yZHNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDBhMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3dvcmRzaXplLmgKQEAgLTAsMCArMSw4IEBACisvKiBEZXRlcm1pbmUgdGhlIHdvcmRzaXplIGZyb20gdGhlIHByZXByb2Nlc3NvciBkZWZpbmVzLiAgKi8KKworI2lmIGRlZmluZWQgX194ODZfNjRfXworIyBkZWZpbmUgX19XT1JEU0laRQk2NAorIyBkZWZpbmUgX19XT1JEU0laRV9DT01QQVQzMgkxCisjZWxzZQorIyBkZWZpbmUgX19XT1JEU0laRQkzMgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMveG9wZW5fbGltLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMveG9wZW5fbGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNjExOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYml0cy94b3Blbl9saW0uaApAQCAtMCwwICsxLDE0NCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogTmV2ZXIgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHk7IHVzZSA8bGltaXRzLmg+IGluc3RlYWQuCisgKi8KKworLyogQWRkaXRpb25hbCBkZWZpbml0aW9ucyBmcm9tIFgvT3BlbiBQb3J0YWJpbGl0eSBHdWlkZSwgSXNzdWUgNCwgVmVyc2lvbiAyCisgICBTeXN0ZW0gSW50ZXJmYWNlcyBhbmQgSGVhZGVycywgNC4xNiA8bGltaXRzLmg+CisKKyAgIFBsZWFzZSBub3RlIG9ubHkgdGhlIHZhbHVlcyB3aGljaCBhcmUgbm90IGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bQorICAgc3RhdGVkIGluIHRoZSBzdGFuZGFyZCBkb2N1bWVudCBhcmUgbGlzdGVkLiAgVGhlIGBzeXNjb25mJyBmdW5jdGlvbnMKKyAgIHNob3VsZCBiZSB1c2VkIHRvIG9idGFpbiB0aGUgYWN0dWFsIHZhbHVlLiAgKi8KKworI2lmbmRlZiBfWE9QRU5fTElNX0gKKyNkZWZpbmUgX1hPUEVOX0xJTV9ICTEKKworI2RlZmluZSBfX25lZWRfSU9WX01BWAorI2luY2x1ZGUgPGJpdHMvc3RkaW9fbGltLmg+CisKKy8qIFdlIGRvIG5vdCBwcm92aWRlIGZpeGVkIHZhbHVlcyBmb3IKKworICAgQVJHX01BWAlNYXhpbXVtIGxlbmd0aCBvZiBhcmd1bWVudCB0byB0aGUgYGV4ZWMnIGZ1bmN0aW9uCisJCWluY2x1ZGluZyBlbnZpcm9ubWVudCBkYXRhLgorCisgICBBVEVYSVRfTUFYCU1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSByZWdpc3RlcmVkCisJCXdpdGggYGF0ZXhpdCcuCisKKyAgIENISUxEX01BWAlNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgcHJvY2Vzc2VzIHBlciByZWFsCisJCXVzZXIgSUQuCisKKyAgIE9QRU5fTUFYCU1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHRoYXQgb25lIHByb2Nlc3MgY2FuIGhhdmUgb3BlbgorCQlhdCBhbnlvbmUgdGltZS4KKworICAgUEFHRVNJWkUKKyAgIFBBR0VfU0laRQlTaXplIG9mIGJ5dGVzIG9mIGEgcGFnZS4KKworICAgUEFTU19NQVgJTWF4aW11bSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gYSBwYXNzd29yZC4KKworICAgV2Ugb25seSBwcm92aWRlIGEgZml4ZWQgbGltaXQgZm9yCisKKyAgIElPVl9NQVgJTWF4aW11bSBudW1iZXIgb2YgYGlvdmVjJyBzdHJ1Y3R1cmVzIHRoYXQgb25lIHByb2Nlc3MgaGFzCisJCWF2YWlsYWJsZSBmb3IgdXNlIHdpdGggYHJlYWR2JyBvciB3cml0ZXYnLgorCisgICBpZiB0aGlzIGlzIGluZGVlZCBmaXhlZCBieSB0aGUgdW5kZXJseWluZyBzeXN0ZW0uCisqLworCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGBpb3ZlYycgc3RydWN0dXJlcyB0aGF0IG9uZSBwcm9jZXNzIGhhcyBhdmFpbGFibGUKKyAgIGZvciB1c2Ugd2l0aCBgcmVhZHYnIG9yIHdyaXRldicuICAqLworI2RlZmluZQlfWE9QRU5fSU9WX01BWAlfUE9TSVhfVUlPX01BWElPVgorCisKKy8qIE1heGltdW0gdmFsdWUgb2YgYGRpZ2l0JyBpbiBjYWxscyB0byB0aGUgYHByaW50ZicgYW5kIGBzY2FuZicKKyAgIGZ1bmN0aW9ucy4gIFdlIGhhdmUgbm8gbGltaXQsIHNvIHJldHVybiBhIHJlYXNvbmFibGUgdmFsdWUuICAqLworI2RlZmluZSBOTF9BUkdNQVgJX1BPU0lYX0FSR19NQVgKKworLyogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBgTEFORycgbmFtZS4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9MQU5HTUFYCV9QT1NJWDJfTElORV9NQVgKKworLyogTWF4aW11bSBtZXNzYWdlIG51bWJlci4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9NU0dNQVgJSU5UX01BWAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBOLXRvLTEgY29sbGF0aW9uIG1hcHBpbmcuICBXZSBoYXZlIG5vCisgICBsaW1pdC4gICovCisjZGVmaW5lIE5MX05NQVgJCUlOVF9NQVgKKworLyogTWF4aW11bSBzZXQgbnVtYmVyLiAgV2UgaGF2ZSBubyBsaW1pdC4gICovCisjZGVmaW5lIE5MX1NFVE1BWAlJTlRfTUFYCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGEgbWVzc2FnZS4gIFdlIGhhdmUgbm8gbGltaXQuICAqLworI2RlZmluZSBOTF9URVhUTUFYCUlOVF9NQVgKKworLyogRGVmYXVsdCBwcm9jZXNzIHByaW9yaXR5LiAgKi8KKyNkZWZpbmUgTlpFUk8JCTIwCisKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSB3b3JkIG9mIHR5cGUgYGludCcuICAqLworI2lmZGVmIElOVF9NQVgKKyMgaWYgSU5UX01BWCA9PSAzMjc2NworIyAgZGVmaW5lIFdPUkRfQklUCTE2CisjIGVsc2UKKyMgIGlmIElOVF9NQVggPT0gMjE0NzQ4MzY0NworIyAgIGRlZmluZSBXT1JEX0JJVAkzMgorIyAgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgICBkZWZpbmUgV09SRF9CSVQJNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fSU5UX01BWF9fCisjIGlmIF9fSU5UX01BWF9fID09IDMyNzY3CisjICBkZWZpbmUgV09SRF9CSVQJMTYKKyMgZWxzZQorIyAgaWYgX19JTlRfTUFYX18gPT0gMjE0NzQ4MzY0NworIyAgIGRlZmluZSBXT1JEX0JJVAkzMgorIyAgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgICBkZWZpbmUgV09SRF9CSVQJNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgV09SRF9CSVQJMzIKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIHdvcmQgb2YgdHlwZSBgbG9uZyBpbnQnLiAgKi8KKyNpZmRlZiBMT05HX01BWAorIyBpZiBMT05HX01BWCA9PSAyMTQ3NDgzNjQ3CisjICBkZWZpbmUgTE9OR19CSVQJMzIKKyMgZWxzZQorLyogU2FmZSBhc3N1bXB0aW9uLiAgKi8KKyMgIGRlZmluZSBMT05HX0JJVAk2NAorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0xPTkdfTUFYX18KKyMgaWYgX19MT05HX01BWF9fID09IDIxNDc0ODM2NDcKKyMgIGRlZmluZSBMT05HX0JJVAkzMgorIyBlbHNlCisvKiBTYWZlIGFzc3VtcHRpb24uICAqLworIyAgZGVmaW5lIExPTkdfQklUCTY0CisjIGVuZGlmCisjZWxzZQorIyBpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBMT05HX0JJVAk2NAorIyBlbHNlCisjICBkZWZpbmUgTE9OR19CSVQJMzIKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogYml0cy94b3Blbl9saW0uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3h0aXR5cGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2JpdHMveHRpdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjhiNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9iaXRzL3h0aXR5cGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLyogYml0cy94dGl0eXBlcy5oIC0tIERlZmluZSBzb21lIHR5cGVzIHVzZWQgYnkgPGJpdHMvc3Ryb3B0cy5oPi4gIHg4Ni02NC4KKyAgIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1RST1BUU19ICisjIGVycm9yICJOZXZlciBpbmNsdWRlIDxiaXRzL3h0aXR5cGVzLmg+IGRpcmVjdGx5OyB1c2UgPHN0cm9wdHMuaD4gaW5zdGVhZC4iCisjZW5kaWYKKworI2lmbmRlZiBfQklUU19YVElUWVBFU19ICisjZGVmaW5lIF9CSVRTX1hUSVRZUEVTX0gJMQorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBUaGlzIHR5cGUgaXMgdXNlZCBieSBzb21lIHN0cnVjdHMgaW4gPGJpdHMvc3Ryb3B0cy5oPi4gICovCit0eXBlZGVmIF9fU0xPTkczMl9UWVBFIF9fdF9zY2FsYXJfdDsKK3R5cGVkZWYgX19VTE9ORzMyX1RZUEUgX190X3VzY2FsYXJfdDsKKworCisjZW5kaWYgLyogYml0cy94dGl0eXBlcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2J5dGVzd2FwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2J5dGVzd2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxZDRkZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvYnl0ZXN3YXAuaApAQCAtMCwwICsxLDQwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0JZVEVTV0FQX0gKKyNkZWZpbmUgX0JZVEVTV0FQX0gJMQorCisvKiBHZXQgdGhlIG1hY2hpbmUgc3BlY2lmaWMsIG9wdGltaXplZCBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9ieXRlc3dhcC5oPgorCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgbXVzdCBhbGwgYmUgbWFjcm9zIHNpbmNlIG90aGVyd2lzZSBzb21lCisgICBvZiB0aGUgcG9zc2libGUgb3B0aW1pemF0aW9ucyBhcmUgbm90IHBvc3NpYmxlLiAgKi8KKworLyogUmV0dXJuIGEgdmFsdWUgd2l0aCBhbGwgYnl0ZXMgaW4gdGhlIDE2IGJpdCBhcmd1bWVudCBzd2FwcGVkLiAgKi8KKyNkZWZpbmUgYnN3YXBfMTYoeCkgX19ic3dhcF8xNiAoeCkKKworLyogUmV0dXJuIGEgdmFsdWUgd2l0aCBhbGwgYnl0ZXMgaW4gdGhlIDMyIGJpdCBhcmd1bWVudCBzd2FwcGVkLiAgKi8KKyNkZWZpbmUgYnN3YXBfMzIoeCkgX19ic3dhcF8zMiAoeCkKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorLyogUmV0dXJuIGEgdmFsdWUgd2l0aCBhbGwgYnl0ZXMgaW4gdGhlIDY0IGJpdCBhcmd1bWVudCBzd2FwcGVkLiAgKi8KKyMgZGVmaW5lIGJzd2FwXzY0KHgpIF9fYnN3YXBfNjQgKHgpCisjZW5kaWYKKworI2VuZGlmIC8qIGJ5dGVzd2FwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY29tcGxleC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jb21wbGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxYWFmNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY29tcGxleC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5OiAgNy4zIENvbXBsZXggYXJpdGhtZXRpYwk8Y29tcGxleC5oPgorICovCisKKyNpZm5kZWYgX0NPTVBMRVhfSAorI2RlZmluZSBfQ09NUExFWF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBnZW5lcmFsIGFuZCBJU08gQzk5IHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KKyNpbmNsdWRlIDxiaXRzL21hdGhkZWYuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBXZSBtaWdodCBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBtb3JlIGNvbXBpbGVycyBoZXJlLiAgQnV0IHNpbmNlIElTTworICAgQzk5IGlzIG91dCBob3BlZnVsbHkgYWxsIG1haW50YWluZWQgY29tcGlsZXJzIHdpbGwgc29vbiBwcm92aWRlIHRoZSBkYXRhCisgICB0eXBlcyBgZmxvYXQgY29tcGxleCcgYW5kIGBkb3VibGUgY29tcGxleCcuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsIDcpICYmICFfX0dOVUNfUFJFUkVRICgyLCA5NykKKyMgZGVmaW5lIF9Db21wbGV4IF9fY29tcGxleF9fCisjZW5kaWYKKworI2RlZmluZSBjb21wbGV4CQlfQ29tcGxleAorCisvKiBOYXJyb3dlc3QgaW1hZ2luYXJ5IHVuaXQuICBUaGlzIGRlcGVuZHMgb24gdGhlIGZsb2F0aW5nLXBvaW50CisgICBldmFsdWF0aW9uIG1ldGhvZC4KKyAgIFhYWCBUaGlzIHByb2JhYmx5IGhhcyB0byBnbyBpbnRvIGEgZ2NjIHJlbGF0ZWQgZmlsZS4gICovCisjZGVmaW5lIF9Db21wbGV4X0kJKF9fZXh0ZW5zaW9uX18gMS4waUYpCisKKy8qIEFub3RoZXIgbW9yZSBkZXNjcmlwdGl2ZSBuYW1lIGlzIGBJJy4KKyAgIFhYWCBPbmNlIHdlIGhhdmUgdGhlIGltYWdpbmFyeSBzdXBwb3J0IHN3aXRjaCB0aGlzIHRvIF9JbWFnaW5hcnlfSS4gICovCisjdW5kZWYgSQorI2RlZmluZSBJIF9Db21wbGV4X0kKKworLyogVGhlIGZpbGUgPGJpdHMvY21hdGhjYWxscy5oPiBjb250YWlucyB0aGUgcHJvdG90eXBlcyBmb3IgYWxsIHRoZQorICAgYWN0dWFsIG1hdGggZnVuY3Rpb25zLiAgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciB0aG9zZSBwcm90b3R5cGVzLAorICAgc28gd2UgY2FuIGVhc2lseSBkZWNsYXJlIGVhY2ggZnVuY3Rpb24gYXMgYm90aCBgbmFtZScgYW5kIGBfX25hbWUnLAorICAgYW5kIGNhbiBkZWNsYXJlIHRoZSBmbG9hdCB2ZXJzaW9ucyBgbmFtZWYnIGFuZCBgX19uYW1lZicuICAqLworCisjZGVmaW5lIF9fTUFUSENBTEwoZnVuY3Rpb24sIGFyZ3MpCVwKKyAgX19NQVRIREVDTCAoX01kb3VibGVfY29tcGxleF8sZnVuY3Rpb24sIGFyZ3MpCisjZGVmaW5lIF9fTUFUSERFQ0wodHlwZSwgZnVuY3Rpb24sIGFyZ3MpIFwKKyAgX19NQVRIREVDTF8xKHR5cGUsIGZ1bmN0aW9uLCBhcmdzKTsgXAorICBfX01BVEhERUNMXzEodHlwZSwgX19DT05DQVQoX18sZnVuY3Rpb24pLCBhcmdzKQorI2RlZmluZSBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sIGFyZ3MpIFwKKyAgZXh0ZXJuIHR5cGUgX19NQVRIX1BSRUNOQU1FKGZ1bmN0aW9uKSBhcmdzIF9fVEhST1cKKworI2RlZmluZSBfTWRvdWJsZV8gCQlkb3VibGUKKyNkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUpCW5hbWUKKyNpbmNsdWRlIDxiaXRzL2NtYXRoY2FsbHMuaD4KKyN1bmRlZglfTWRvdWJsZV8KKyN1bmRlZglfX01BVEhfUFJFQ05BTUUKKworLyogTm93IHRoZSBmbG9hdCB2ZXJzaW9ucy4gICovCisjaWZuZGVmIF9NZmxvYXRfCisjIGRlZmluZSBfTWZsb2F0XwkJZmxvYXQKKyNlbmRpZgorI2RlZmluZSBfTWRvdWJsZV8gCQlfTWZsb2F0XworI2lmZGVmIF9fU1REQ19fCisjIGRlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSkJbmFtZSMjZgorI2Vsc2UKKyMgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lKQluYW1lLyoqL2YKKyNlbmRpZgorI2luY2x1ZGUgPGJpdHMvY21hdGhjYWxscy5oPgorI3VuZGVmCV9NZG91YmxlXworI3VuZGVmCV9fTUFUSF9QUkVDTkFNRQorCisvKiBBbmQgdGhlIGxvbmcgZG91YmxlIHZlcnNpb25zLiAgSXQgaXMgbm9uLWNyaXRpY2FsIHRvIGRlZmluZSB0aGVtCisgICBoZXJlIHVuY29uZGl0aW9uYWxseSBzaW5jZSBgbG9uZyBkb3VibGUnIGlzIHJlcXVpcmVkIGluIElTTyBDOTkuICAqLworI2lmIChfX1NURENfXyAtIDAgfHwgX19HTlVDX18gLSAwKSBcCisgICAgJiYgKCFkZWZpbmVkIF9fTk9fTE9OR19ET1VCTEVfTUFUSCB8fCBkZWZpbmVkIF9fTERCTF9DT01QQVQpCisjIGlmZGVmIF9fTERCTF9DT01QQVQKKyMgIHVuZGVmIF9fTUFUSERFQ0xfMQorIyAgZGVmaW5lIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbiwgYXJncykgXAorICBleHRlcm4gdHlwZSBfX1JFRElSRUNUX05USChfX01BVEhfUFJFQ05BTUUoZnVuY3Rpb24pLCBhcmdzLCBmdW5jdGlvbikKKyMgZW5kaWYKKworIyBpZm5kZWYgX01sb25nX2RvdWJsZV8KKyMgIGRlZmluZSBfTWxvbmdfZG91YmxlXwlsb25nIGRvdWJsZQorIyBlbmRpZgorIyBkZWZpbmUgX01kb3VibGVfIAkJX01sb25nX2RvdWJsZV8KKyMgaWZkZWYgX19TVERDX18KKyMgIGRlZmluZSBfX01BVEhfUFJFQ05BTUUobmFtZSkJbmFtZSMjbAorIyBlbHNlCisjICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUpCW5hbWUvKiovbAorIyBlbmRpZgorIyBpbmNsdWRlIDxiaXRzL2NtYXRoY2FsbHMuaD4KKyNlbmRpZgorI3VuZGVmCV9NZG91YmxlXworI3VuZGVmCV9fTUFUSF9QUkVDTkFNRQorI3VuZGVmCV9fTUFUSERFQ0xfMQorI3VuZGVmCV9fTUFUSERFQ0wKKyN1bmRlZglfX01BVEhDQUxMCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBjb21wbGV4LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Bpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jcGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlMzI3NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Bpby5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEV4dGVuZGVkIGNwaW8gZm9ybWF0IGZyb20gUE9TSVguMS4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgTk9URTogVGhlIGNhbm9uaWNhbCBzb3VyY2Ugb2YgdGhpcyBmaWxlIGlzIG1haW50YWluZWQgd2l0aCB0aGUgR05VIGNwaW8uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9DUElPX0gKKyNkZWZpbmUgX0NQSU9fSCAxCisKKy8qIEEgY3BpbyBhcmNoaXZlIGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgZmlsZXMuCisgICBFYWNoIGZpbGUgaGFzIGEgNzYgYnl0ZSBoZWFkZXIsCisgICBhIHZhcmlhYmxlIGxlbmd0aCwgTlVMIHRlcm1pbmF0ZWQgZmlsZW5hbWUsCisgICBhbmQgdmFyaWFibGUgbGVuZ3RoIGZpbGUgZGF0YS4KKyAgIEEgaGVhZGVyIGZvciBhIGZpbGVuYW1lICJUUkFJTEVSISEhIiBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gICovCisKKy8qIEFsbCB0aGUgZmllbGRzIGluIHRoZSBoZWFkZXIgYXJlIElTTyA2NDYgKGFwcHJveGltYXRlbHkgQVNDSUkpIHN0cmluZ3MKKyAgIG9mIG9jdGFsIG51bWJlcnMsIGxlZnQgcGFkZGVkLCBub3QgTlVMIHRlcm1pbmF0ZWQuCisKKyAgIEZpZWxkIE5hbWUJTGVuZ3RoIGluIEJ5dGVzCU5vdGVzCisgICBjX21hZ2ljCTYJCW11c3QgYmUgIjA3MDcwNyIKKyAgIGNfZGV2CTYKKyAgIGNfaW5vCTYKKyAgIGNfbW9kZQk2CQlzZWUgYmVsb3cgZm9yIHZhbHVlCisgICBjX3VpZAk2CisgICBjX2dpZAk2CisgICBjX25saW5rCTYKKyAgIGNfcmRldgk2CQlvbmx5IHZhbGlkIGZvciBjaHIgYW5kIGJsayBzcGVjaWFsIGZpbGVzCisgICBjX210aW1lCTExCisgICBjX25hbWVzaXplCTYJCWNvdW50IGluY2x1ZGVzIHRlcm1pbmF0aW5nIE5VTCBpbiBwYXRobmFtZQorICAgY19maWxlc2l6ZQkxMQkJbXVzdCBiZSAwIGZvciBGSUZPcyBhbmQgZGlyZWN0b3JpZXMgICovCisKKy8qIFZhbHVlIGZvciB0aGUgZmllbGQgYGNfbWFnaWMnLiAgKi8KKyNkZWZpbmUgTUFHSUMJIjA3MDcwNyIKKworLyogVmFsdWVzIGZvciBjX21vZGUsIE9SJ2QgdG9nZXRoZXI6ICovCisKKyNkZWZpbmUgQ19JUlVTUgkJMDAwNDAwCisjZGVmaW5lIENfSVdVU1IJCTAwMDIwMAorI2RlZmluZSBDX0lYVVNSCQkwMDAxMDAKKyNkZWZpbmUgQ19JUkdSUAkJMDAwMDQwCisjZGVmaW5lIENfSVdHUlAJCTAwMDAyMAorI2RlZmluZSBDX0lYR1JQCQkwMDAwMTAKKyNkZWZpbmUgQ19JUk9USAkJMDAwMDA0CisjZGVmaW5lIENfSVdPVEgJCTAwMDAwMgorI2RlZmluZSBDX0lYT1RICQkwMDAwMDEKKworI2RlZmluZSBDX0lTVUlECQkwMDQwMDAKKyNkZWZpbmUgQ19JU0dJRAkJMDAyMDAwCisjZGVmaW5lIENfSVNWVFgJCTAwMTAwMAorCisjZGVmaW5lIENfSVNCTEsJCTA2MDAwMAorI2RlZmluZSBDX0lTQ0hSCQkwMjAwMDAKKyNkZWZpbmUgQ19JU0RJUgkJMDQwMDAwCisjZGVmaW5lIENfSVNGSUZPCTAxMDAwMAorI2RlZmluZSBDX0lTU09DSwkwMTQwMDAwCisjZGVmaW5lIENfSVNMTksJCTAxMjAwMDAKKyNkZWZpbmUgQ19JU0NURwkJMDExMDAwMAorI2RlZmluZSBDX0lTUkVHCQkwMTAwMDAwCisKKyNlbmRpZiAvKiBjcGlvLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3J5cHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I4OWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jcnlwdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBVRkMtY3J5cHQ6IHVsdHJhIGZhc3QgY3J5cHQoMykgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTMsOTYsOTcsOTgsMjAwMCwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAqIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIEAoIyljcnlwdC5oCTEuNSAxMi8yMC85NgorICoKKyAqLworCisjaWZuZGVmIF9DUllQVF9ICisjZGVmaW5lIF9DUllQVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogRW5jcnlwdCBhdCBtb3N0IDggY2hhcmFjdGVycyBmcm9tIEtFWSB1c2luZyBzYWx0IHRvIHBlcnR1cmIgREVTLiAgKi8KK2V4dGVybiBjaGFyICpjcnlwdCAoX19jb25zdCBjaGFyICpfX2tleSwgX19jb25zdCBjaGFyICpfX3NhbHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXR1cCBERVMgdGFibGVzIGFjY29yZGluZyBLRVkuICAqLworZXh0ZXJuIHZvaWQgc2V0a2V5IChfX2NvbnN0IGNoYXIgKl9fa2V5KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRW5jcnlwdCBkYXRhIGluIEJMT0NLIGluIHBsYWNlIGlmIEVERkxBRyBpcyB6ZXJvOyBvdGhlcndpc2UgZGVjcnlwdAorICAgYmxvY2sgaW4gcGxhY2UuICAqLworZXh0ZXJuIHZvaWQgZW5jcnlwdCAoY2hhciAqX19ibG9jaywgaW50IF9fZWRmbGFnKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmVlbnRyYW50IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICBUaGUgYWRkaXRpb25hbCBhcmd1bWVudAorICAgcG9pbnRzIHRvIGEgc3RydWN0dXJlIHdoZXJlIHRoZSByZXN1bHRzIGFyZSBwbGFjZWQgaW4uICAqLworc3RydWN0IGNyeXB0X2RhdGEKKyAgeworICAgIGNoYXIga2V5c2NoZWRbMTYgKiA4XTsKKyAgICBjaGFyIHNiMFszMjc2OF07CisgICAgY2hhciBzYjFbMzI3NjhdOworICAgIGNoYXIgc2IyWzMyNzY4XTsKKyAgICBjaGFyIHNiM1szMjc2OF07CisgICAgLyogZW5kLW9mLWFsaWdtZW50LWNyaXRpY2FsLWRhdGEgKi8KKyAgICBjaGFyIGNyeXB0XzNfYnVmWzE0XTsKKyAgICBjaGFyIGN1cnJlbnRfc2FsdFsyXTsKKyAgICBsb25nIGludCBjdXJyZW50X3NhbHRiaXRzOworICAgIGludCAgZGlyZWN0aW9uLCBpbml0aWFsaXplZDsKKyAgfTsKKworZXh0ZXJuIGNoYXIgKmNyeXB0X3IgKF9fY29uc3QgY2hhciAqX19rZXksIF9fY29uc3QgY2hhciAqX19zYWx0LAorCQkgICAgICBzdHJ1Y3QgY3J5cHRfZGF0YSAqIF9fcmVzdHJpY3QgX19kYXRhKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKworZXh0ZXJuIHZvaWQgc2V0a2V5X3IgKF9fY29uc3QgY2hhciAqX19rZXksCisJCSAgICAgIHN0cnVjdCBjcnlwdF9kYXRhICogX19yZXN0cmljdCBfX2RhdGEpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCitleHRlcm4gdm9pZCBlbmNyeXB0X3IgKGNoYXIgKl9fYmxvY2ssIGludCBfX2VkZmxhZywKKwkJICAgICAgIHN0cnVjdCBjcnlwdF9kYXRhICogX19yZXN0cmljdCBfX2RhdGEpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMykpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBjcnlwdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2N0eXBlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlN2ZiNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3R5cGUuaApAQCAtMCwwICsxLDMyNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDkzLDk1LDk2LDk3LDk4LDk5LDIwMDEsMjAwMiwyMDA0LDIwMDcKKyAgIAlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQgNy40OiBDaGFyYWN0ZXIgaGFuZGxpbmcJPGN0eXBlLmg+CisgKi8KKworI2lmbmRlZglfQ1RZUEVfSAorI2RlZmluZQlfQ1RZUEVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaWZuZGVmIF9JU2JpdAorLyogVGhlc2UgYXJlIGFsbCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGNoYXJhY3RlcnMuCisgICBJZiB0aGVyZSBnZXQgdG8gYmUgbW9yZSB0aGFuIDE2IGRpc3RpbmN0IGNoYXJhY3RlcmlzdGljcywKKyAgIG1hbnkgdGhpbmdzIG11c3QgYmUgY2hhbmdlZCB0aGF0IHVzZSBgdW5zaWduZWQgc2hvcnQgaW50J3MuCisKKyAgIFRoZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIHN0b3JlZCBhbHdheXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWcKKyAgIGVuZGlhbikuICBXZSBkZWZpbmUgdGhlIGJpdCB2YWx1ZSBpbnRlcnByZXRhdGlvbnMgaGVyZSBkZXBlbmRlbnQgb24gdGhlCisgICBtYWNoaW5lJ3MgYnl0ZSBvcmRlci4gICovCisKKyMgaW5jbHVkZSA8ZW5kaWFuLmg+CisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgIGRlZmluZSBfSVNiaXQoYml0KQkoMSA8PCAoYml0KSkKKyMgZWxzZSAvKiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOICovCisjICBkZWZpbmUgX0lTYml0KGJpdCkJKChiaXQpIDwgOCA/ICgoMSA8PCAoYml0KSkgPDwgOCkgOiAoKDEgPDwgKGJpdCkpID4+IDgpKQorIyBlbmRpZgorCitlbnVtCit7CisgIF9JU3VwcGVyID0gX0lTYml0ICgwKSwJLyogVVBQRVJDQVNFLiAgKi8KKyAgX0lTbG93ZXIgPSBfSVNiaXQgKDEpLAkvKiBsb3dlcmNhc2UuICAqLworICBfSVNhbHBoYSA9IF9JU2JpdCAoMiksCS8qIEFscGhhYmV0aWMuICAqLworICBfSVNkaWdpdCA9IF9JU2JpdCAoMyksCS8qIE51bWVyaWMuICAqLworICBfSVN4ZGlnaXQgPSBfSVNiaXQgKDQpLAkvKiBIZXhhZGVjaW1hbCBudW1lcmljLiAgKi8KKyAgX0lTc3BhY2UgPSBfSVNiaXQgKDUpLAkvKiBXaGl0ZXNwYWNlLiAgKi8KKyAgX0lTcHJpbnQgPSBfSVNiaXQgKDYpLAkvKiBQcmludGluZy4gICovCisgIF9JU2dyYXBoID0gX0lTYml0ICg3KSwJLyogR3JhcGhpY2FsLiAgKi8KKyAgX0lTYmxhbmsgPSBfSVNiaXQgKDgpLAkvKiBCbGFuayAodXN1YWxseSBTUEMgYW5kIFRBQikuICAqLworICBfSVNjbnRybCA9IF9JU2JpdCAoOSksCS8qIENvbnRyb2wgY2hhcmFjdGVyLiAgKi8KKyAgX0lTcHVuY3QgPSBfSVNiaXQgKDEwKSwJLyogUHVuY3R1YXRpb24uICAqLworICBfSVNhbG51bSA9IF9JU2JpdCAoMTEpCS8qIEFscGhhbnVtZXJpYy4gICovCit9OworI2VuZGlmIC8qICEgX0lTYml0ICAqLworCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBjdHlwZS1pbmZvLmMuCisgICBUaGUgZGVjbGFyYXRpb25zIGhlcmUgbXVzdCBtYXRjaCB0aG9zZSBpbiBsb2NhbGVpbmZvLmguCisKKyAgIEluIHRoZSB0aHJlYWQtc3BlY2lmaWMgbG9jYWxlIG1vZGVsIChzZWUgYHVzZWxvY2FsZScgaW4gPGxvY2FsZS5oPikKKyAgIHdlIGNhbm5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgdGhlc2UgYXMgd2FzIGRvbmUgaW4gdGhlIHBhc3QuCisgICBJbnN0ZWFkLCB0aGUgZm9sbG93aW5nIGFjY2Vzc29yIGZ1bmN0aW9ucyByZXR1cm4gdGhlIGFkZHJlc3Mgb2YKKyAgIGVhY2ggdmFyaWFibGUsIHdoaWNoIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IHRocmVhZCBpZiBtdWx0aXRocmVhZGVkLgorCisgICBUaGVzZSBwb2ludCBpbnRvIGFycmF5cyBvZiAzODQsIHNvIHRoZXkgY2FuIGJlIGluZGV4ZWQgYnkgYW55IGB1bnNpZ25lZAorICAgY2hhcicgdmFsdWUgWzAsMjU1XTsgYnkgRU9GICgtMSk7IG9yIGJ5IGFueSBgc2lnbmVkIGNoYXInIHZhbHVlCisgICBbLTEyOCwtMSkuICBJU08gQyByZXF1aXJlcyB0aGF0IHRoZSBjdHlwZSBmdW5jdGlvbnMgd29yayBmb3IgYHVuc2lnbmVkCisgICBjaGFyJyB2YWx1ZXMgYW5kIGZvciBFT0Y7IHdlIGFsc28gc3VwcG9ydCBuZWdhdGl2ZSBgc2lnbmVkIGNoYXInIHZhbHVlcworICAgZm9yIGJyb2tlbiBvbGQgcHJvZ3JhbXMuICBUaGUgY2FzZSBjb252ZXJzaW9uIGFycmF5cyBhcmUgb2YgYGludCdzCisgICByYXRoZXIgdGhhbiBgdW5zaWduZWQgY2hhcidzIGJlY2F1c2UgdG9sb3dlciAoRU9GKSBtdXN0IGJlIEVPRiwgd2hpY2gKKyAgIGRvZXNuJ3QgZml0IGludG8gYW4gYHVuc2lnbmVkIGNoYXInLiAgQnV0IHRvZGF5IG1vcmUgaW1wb3J0YW50IGlzIHRoYXQKKyAgIHRoZSBhcnJheXMgYXJlIGFsc28gdXNlZCBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgc2V0cy4gICovCitleHRlcm4gX19jb25zdCB1bnNpZ25lZCBzaG9ydCBpbnQgKipfX2N0eXBlX2JfbG9jICh2b2lkKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdCkpOworZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90ICoqX19jdHlwZV90b2xvd2VyX2xvYyAodm9pZCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3QpKTsKK2V4dGVybiBfX2NvbnN0IF9faW50MzJfdCAqKl9fY3R5cGVfdG91cHBlcl9sb2MgKHZvaWQpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0KSk7CisKKyNkZWZpbmUgX19pc2N0eXBlKGMsIHR5cGUpIFwKKyAgKCgqX19jdHlwZV9iX2xvYyAoKSlbKGludCkgKGMpXSAmICh1bnNpZ25lZCBzaG9ydCBpbnQpIHR5cGUpCisKKyNkZWZpbmUJX19pc2FzY2lpKGMpCSgoKGMpICYgfjB4N2YpID09IDApCS8qIElmIEMgaXMgYSA3IGJpdCB2YWx1ZS4gICovCisjZGVmaW5lCV9fdG9hc2NpaShjKQkoKGMpICYgMHg3ZikJCS8qIE1hc2sgb2ZmIGhpZ2ggYml0cy4gICovCisKKyNkZWZpbmUJX19leGN0eXBlKG5hbWUpCWV4dGVybiBpbnQgbmFtZSAoaW50KSBfX1RIUk9XCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCisvKiBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSBhbGwgZnVuY3Rpb25zOgorICAgICBpbnQgaXNDSEFSQUNURVJJU1RJQyhpbnQgYyk7CisgICB3aGljaCByZXR1cm4gbm9uemVybyBpZmYgQyBoYXMgQ0hBUkFDVEVSSVNUSUMuCisgICBGb3IgdGhlIG1lYW5pbmcgb2YgdGhlIGNoYXJhY3RlcmlzdGljIG5hbWVzLCBzZWUgdGhlIGBlbnVtJyBhYm92ZS4gICovCitfX2V4Y3R5cGUgKGlzYWxudW0pOworX19leGN0eXBlIChpc2FscGhhKTsKK19fZXhjdHlwZSAoaXNjbnRybCk7CitfX2V4Y3R5cGUgKGlzZGlnaXQpOworX19leGN0eXBlIChpc2xvd2VyKTsKK19fZXhjdHlwZSAoaXNncmFwaCk7CitfX2V4Y3R5cGUgKGlzcHJpbnQpOworX19leGN0eXBlIChpc3B1bmN0KTsKK19fZXhjdHlwZSAoaXNzcGFjZSk7CitfX2V4Y3R5cGUgKGlzdXBwZXIpOworX19leGN0eXBlIChpc3hkaWdpdCk7CisKKworLyogUmV0dXJuIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiBDLiAgKi8KK2V4dGVybiBpbnQgdG9sb3dlciAoaW50IF9fYykgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSB1cHBlcmNhc2UgdmVyc2lvbiBvZiBDLiAgKi8KK2V4dGVybiBpbnQgdG91cHBlciAoaW50IF9fYykgX19USFJPVzsKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisKKy8qIElTTyBDOTkgaW50cm9kdWNlZCBvbmUgbmV3IGZ1bmN0aW9uLiAgKi8KKyNpZmRlZglfX1VTRV9JU09DOTkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorCitfX2V4Y3R5cGUgKGlzYmxhbmspOworCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGVzdCBDIGZvciBhIHNldCBvZiBjaGFyYWN0ZXIgY2xhc3NlcyBhY2NvcmRpbmcgdG8gTUFTSy4gICovCitleHRlcm4gaW50IGlzY3R5cGUgKGludCBfX2MsIGludCBfX21hc2spIF9fVEhST1c7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorCisvKiBSZXR1cm4gbm9uemVybyBpZmYgQyBpcyBpbiB0aGUgQVNDSUkgc2V0CisgICAoaS5lLiwgaXMgbm8gbW9yZSB0aGFuIDcgYml0cyB3aWRlKS4gICovCitleHRlcm4gaW50IGlzYXNjaWkgKGludCBfX2MpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgcGFydCBvZiBDIHRoYXQgaXMgaW4gdGhlIEFTQ0lJIHNldAorICAgKGkuZS4sIHRoZSBsb3ctb3JkZXIgNyBiaXRzIG9mIEMpLiAgKi8KK2V4dGVybiBpbnQgdG9hc2NpaSAoaW50IF9fYykgX19USFJPVzsKKworLyogVGhlc2UgYXJlIHRoZSBzYW1lIGFzIGB0b3VwcGVyJyBhbmQgYHRvbG93ZXInIGV4Y2VwdCB0aGF0IHRoZXkgZG8gbm90CisgICBjaGVjayB0aGUgYXJndW1lbnQgZm9yIGJlaW5nIGluIHRoZSByYW5nZSBvZiBhIGBjaGFyJy4gICovCitfX2V4Y3R5cGUgKF90b3VwcGVyKTsKK19fZXhjdHlwZSAoX3RvbG93ZXIpOworI2VuZGlmIC8qIFVzZSBTVklEIG9yIHVzZSBtaXNjLiAgKi8KKworLyogVGhpcyBjb2RlIGlzIG5lZWRlZCBmb3IgdGhlIG9wdGltaXplZCBtYXBwaW5nIGZ1bmN0aW9ucy4gICovCisjZGVmaW5lIF9fdG9ib2R5KGMsIGYsIGEsIGFyZ3MpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgaW50IF9fcmVzOwkJCQkJCQkgICAgICBcCisgICAgICBpZiAoc2l6ZW9mIChjKSA+IDEpCQkJCQkJICAgICAgXAorCXsJCQkJCQkJCSAgICAgIFwKKwkgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoYykpCQkJCQkgICAgICBcCisJICAgIHsJCQkJCQkJCSAgICAgIFwKKwkgICAgICBpbnQgX19jID0gKGMpOwkJCQkJCSAgICAgIFwKKwkgICAgICBfX3JlcyA9IF9fYyA8IC0xMjggfHwgX19jID4gMjU1ID8gX19jIDogKGEpW19fY107CQkgICAgICBcCisJICAgIH0JCQkJCQkJCSAgICAgIFwKKwkgIGVsc2UJCQkJCQkJCSAgICAgIFwKKwkgICAgX19yZXMgPSBmIGFyZ3M7CQkJCQkJICAgICAgXAorCX0JCQkJCQkJCSAgICAgIFwKKyAgICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKKwlfX3JlcyA9IChhKVsoaW50KSAoYyldOwkJCQkJCSAgICAgIFwKKyAgICAgIF9fcmVzOyB9KSkKKworI2lmICFkZWZpbmVkIF9fTk9fQ1RZUEUgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKyMgZGVmaW5lIGlzYWxudW0oYykJX19pc2N0eXBlKChjKSwgX0lTYWxudW0pCisjIGRlZmluZSBpc2FscGhhKGMpCV9faXNjdHlwZSgoYyksIF9JU2FscGhhKQorIyBkZWZpbmUgaXNjbnRybChjKQlfX2lzY3R5cGUoKGMpLCBfSVNjbnRybCkKKyMgZGVmaW5lIGlzZGlnaXQoYykJX19pc2N0eXBlKChjKSwgX0lTZGlnaXQpCisjIGRlZmluZSBpc2xvd2VyKGMpCV9faXNjdHlwZSgoYyksIF9JU2xvd2VyKQorIyBkZWZpbmUgaXNncmFwaChjKQlfX2lzY3R5cGUoKGMpLCBfSVNncmFwaCkKKyMgZGVmaW5lIGlzcHJpbnQoYykJX19pc2N0eXBlKChjKSwgX0lTcHJpbnQpCisjIGRlZmluZSBpc3B1bmN0KGMpCV9faXNjdHlwZSgoYyksIF9JU3B1bmN0KQorIyBkZWZpbmUgaXNzcGFjZShjKQlfX2lzY3R5cGUoKGMpLCBfSVNzcGFjZSkKKyMgZGVmaW5lIGlzdXBwZXIoYykJX19pc2N0eXBlKChjKSwgX0lTdXBwZXIpCisjIGRlZmluZSBpc3hkaWdpdChjKQlfX2lzY3R5cGUoKGMpLCBfSVN4ZGlnaXQpCisKKyMgaWZkZWYgX19VU0VfSVNPQzk5CisjICBkZWZpbmUgaXNibGFuayhjKQlfX2lzY3R5cGUoKGMpLCBfSVNibGFuaykKKyMgZW5kaWYKKworIyBpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworX19leHRlcm5faW5saW5lIGludAorX19OVEggKHRvbG93ZXIgKGludCBfX2MpKQoreworICByZXR1cm4gX19jID49IC0xMjggJiYgX19jIDwgMjU2ID8gKCpfX2N0eXBlX3RvbG93ZXJfbG9jICgpKVtfX2NdIDogX19jOworfQorCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAodG91cHBlciAoaW50IF9fYykpCit7CisgIHJldHVybiBfX2MgPj0gLTEyOCAmJiBfX2MgPCAyNTYgPyAoKl9fY3R5cGVfdG91cHBlcl9sb2MgKCkpW19fY10gOiBfX2M7Cit9CisjIGVuZGlmCisKKyMgaWYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgZGVmaW5lIHRvbG93ZXIoYykJX190b2JvZHkgKGMsIHRvbG93ZXIsICpfX2N0eXBlX3RvbG93ZXJfbG9jICgpLCAoYykpCisjICBkZWZpbmUgdG91cHBlcihjKQlfX3RvYm9keSAoYywgdG91cHBlciwgKl9fY3R5cGVfdG91cHBlcl9sb2MgKCksIChjKSkKKyMgZW5kaWYgLyogT3B0aW1pemluZyBnY2MgKi8KKworIyBpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgIGRlZmluZSBpc2FzY2lpKGMpCV9faXNhc2NpaSAoYykKKyMgIGRlZmluZSB0b2FzY2lpKGMpCV9fdG9hc2NpaSAoYykKKworIyAgZGVmaW5lIF90b2xvd2VyKGMpCSgoaW50KSAoKl9fY3R5cGVfdG9sb3dlcl9sb2MgKCkpWyhpbnQpIChjKV0pCisjICBkZWZpbmUgX3RvdXBwZXIoYykJKChpbnQpICgqX19jdHlwZV90b3VwcGVyX2xvYyAoKSlbKGludCkgKGMpXSkKKyMgZW5kaWYKKworI2VuZGlmIC8qIE5vdCBfX05PX0NUWVBFLiAgKi8KKworCisjaWZkZWYgX19VU0VfR05VCisvKiBUaGUgY29uY2VwdCBvZiBvbmUgc3RhdGljIGxvY2FsZSBwZXIgY2F0ZWdvcnkgaXMgbm90IHZlcnkgd2VsbAorICAgdGhvdWdodCBvdXQuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gcHJvY2VzcyBpdHMgZGF0YSB1c2luZworICAgaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBsb2NhbGVzLiAgQW5vdGhlciBhcHBsaWNhdGlvbiBpcworICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBoYW5kbGluZyBpbiB0aGUKKyAgIHVwY29taW5nIElTTyBDKysgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHN1cHBvcnQgdGhpcyBhbm90aGVyIHNldCBvZgorICAgdGhlIGZ1bmN0aW9ucyB1c2luZyBsb2NhbGUgZGF0YSBleGlzdCB3aGljaCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50LgorCisgICBBdHRlbnRpb246IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlICpub3QqIHN0YW5kYXJkaXplZCBpbiBhbnkgZm9ybS4KKyAgIFRoaXMgaXMgYSBwcm9vZi1vZi1jb25jZXB0IGltcGxlbWVudGF0aW9uLiAgKi8KKworLyogU3RydWN0dXJlIGZvciByZWVudHJhbnQgbG9jYWxlIHVzaW5nIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYW4KKyAgIChhbG1vc3QpIG9wYXF1ZSB0eXBlIGZvciB0aGUgdXNlciBsZXZlbCBwcm9ncmFtcy4gICovCisjIGluY2x1ZGUgPHhsb2NhbGUuaD4KKworLyogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIHNpbWlsYXIgdG8gdGhlIG9uZXMgYWJvdmUgYnV0IGFsbCBmdW5jdGlvbnMKKyAgIHRha2UgYXMgYW4gYXJndW1lbnQgYSBoYW5kbGUgZm9yIHRoZSBsb2NhbGUgd2hpY2ggc2hhbGwgYmUgdXNlZC4gICovCisjICBkZWZpbmUgX19pc2N0eXBlX2woYywgdHlwZSwgbG9jYWxlKSBcCisgICgobG9jYWxlKS0+X19jdHlwZV9iWyhpbnQpIChjKV0gJiAodW5zaWduZWQgc2hvcnQgaW50KSB0eXBlKQorCisjIGRlZmluZSBfX2V4Y3R5cGVfbChuYW1lKSAJCQkJCQkgICAgICBcCisgIGV4dGVybiBpbnQgbmFtZSAoaW50LCBfX2xvY2FsZV90KSBfX1RIUk9XCisKKy8qIFRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGFsbCBmdW5jdGlvbnM6CisgICAgIGludCBpc0NIQVJBQ1RFUklTVElDKGludCBjLCBsb2NhbGVfdCAqbG9jYWxlKTsKKyAgIHdoaWNoIHJldHVybiBub256ZXJvIGlmZiBDIGhhcyBDSEFSQUNURVJJU1RJQy4KKyAgIEZvciB0aGUgbWVhbmluZyBvZiB0aGUgY2hhcmFjdGVyaXN0aWMgbmFtZXMsIHNlZSB0aGUgYGVudW0nIGFib3ZlLiAgKi8KK19fZXhjdHlwZV9sIChpc2FsbnVtX2wpOworX19leGN0eXBlX2wgKGlzYWxwaGFfbCk7CitfX2V4Y3R5cGVfbCAoaXNjbnRybF9sKTsKK19fZXhjdHlwZV9sIChpc2RpZ2l0X2wpOworX19leGN0eXBlX2wgKGlzbG93ZXJfbCk7CitfX2V4Y3R5cGVfbCAoaXNncmFwaF9sKTsKK19fZXhjdHlwZV9sIChpc3ByaW50X2wpOworX19leGN0eXBlX2wgKGlzcHVuY3RfbCk7CitfX2V4Y3R5cGVfbCAoaXNzcGFjZV9sKTsKK19fZXhjdHlwZV9sIChpc3VwcGVyX2wpOworX19leGN0eXBlX2wgKGlzeGRpZ2l0X2wpOworCitfX2V4Y3R5cGVfbCAoaXNibGFua19sKTsKKworCisvKiBSZXR1cm4gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIEMgaW4gbG9jYWxlIEwuICAqLworZXh0ZXJuIGludCBfX3RvbG93ZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CitleHRlcm4gaW50IHRvbG93ZXJfbCAoaW50IF9fYywgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgdXBwZXJjYXNlIHZlcnNpb24gb2YgQy4gICovCitleHRlcm4gaW50IF9fdG91cHBlcl9sIChpbnQgX19jLCBfX2xvY2FsZV90IF9fbCkgX19USFJPVzsKK2V4dGVybiBpbnQgdG91cHBlcl9sIChpbnQgX19jLCBfX2xvY2FsZV90IF9fbCkgX19USFJPVzsKKworIyBpZiBfX0dOVUNfXyA+PSAyICYmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX190b2xvd2VyX2woYywgbG9jYWxlKSBcCisgIF9fdG9ib2R5IChjLCBfX3RvbG93ZXJfbCwgKGxvY2FsZSktPl9fY3R5cGVfdG9sb3dlciwgKGMsIGxvY2FsZSkpCisjICBkZWZpbmUgX190b3VwcGVyX2woYywgbG9jYWxlKSBcCisgIF9fdG9ib2R5IChjLCBfX3RvdXBwZXJfbCwgKGxvY2FsZSktPl9fY3R5cGVfdG91cHBlciwgKGMsIGxvY2FsZSkpCisjICBkZWZpbmUgdG9sb3dlcl9sKGMsIGxvY2FsZSkJX190b2xvd2VyX2wgKChjKSwgKGxvY2FsZSkpCisjICBkZWZpbmUgdG91cHBlcl9sKGMsIGxvY2FsZSkJX190b3VwcGVyX2wgKChjKSwgKGxvY2FsZSkpCisjIGVuZGlmCS8qIE9wdGltaXppbmcgZ2NjICovCisKKworIyBpZm5kZWYgX19OT19DVFlQRQorIyAgZGVmaW5lIF9faXNhbG51bV9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNhbG51bSwgKGwpKQorIyAgZGVmaW5lIF9faXNhbHBoYV9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNhbHBoYSwgKGwpKQorIyAgZGVmaW5lIF9faXNjbnRybF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNjbnRybCwgKGwpKQorIyAgZGVmaW5lIF9faXNkaWdpdF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNkaWdpdCwgKGwpKQorIyAgZGVmaW5lIF9faXNsb3dlcl9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNsb3dlciwgKGwpKQorIyAgZGVmaW5lIF9faXNncmFwaF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNncmFwaCwgKGwpKQorIyAgZGVmaW5lIF9faXNwcmludF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNwcmludCwgKGwpKQorIyAgZGVmaW5lIF9faXNwdW5jdF9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNwdW5jdCwgKGwpKQorIyAgZGVmaW5lIF9faXNzcGFjZV9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVNzcGFjZSwgKGwpKQorIyAgZGVmaW5lIF9faXN1cHBlcl9sKGMsbCkJX19pc2N0eXBlX2woKGMpLCBfSVN1cHBlciwgKGwpKQorIyAgZGVmaW5lIF9faXN4ZGlnaXRfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTeGRpZ2l0LCAobCkpCisKKyMgIGRlZmluZSBfX2lzYmxhbmtfbChjLGwpCV9faXNjdHlwZV9sKChjKSwgX0lTYmxhbmssIChsKSkKKworIyAgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjICAgZGVmaW5lIF9faXNhc2NpaV9sKGMsbCkJKChsKSwgX19pc2FzY2lpIChjKSkKKyMgICBkZWZpbmUgX190b2FzY2lpX2woYyxsKQkoKGwpLCBfX3RvYXNjaWkgKGMpKQorIyAgZW5kaWYKKworIyAgZGVmaW5lIGlzYWxudW1fbChjLGwpCV9faXNhbG51bV9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc2FscGhhX2woYyxsKQlfX2lzYWxwaGFfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNjbnRybF9sKGMsbCkJX19pc2NudHJsX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzZGlnaXRfbChjLGwpCV9faXNkaWdpdF9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc2xvd2VyX2woYyxsKQlfX2lzbG93ZXJfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNncmFwaF9sKGMsbCkJX19pc2dyYXBoX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzcHJpbnRfbChjLGwpCV9faXNwcmludF9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc3B1bmN0X2woYyxsKQlfX2lzcHVuY3RfbCAoKGMpLCAobCkpCisjICBkZWZpbmUgaXNzcGFjZV9sKGMsbCkJX19pc3NwYWNlX2wgKChjKSwgKGwpKQorIyAgZGVmaW5lIGlzdXBwZXJfbChjLGwpCV9faXN1cHBlcl9sICgoYyksIChsKSkKKyMgIGRlZmluZSBpc3hkaWdpdF9sKGMsbCkJX19pc3hkaWdpdF9sICgoYyksIChsKSkKKworIyAgZGVmaW5lIGlzYmxhbmtfbChjLGwpCV9faXNibGFua19sICgoYyksIChsKSkKKworIyAgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisjICAgZGVmaW5lIGlzYXNjaWlfbChjLGwpCV9faXNhc2NpaV9sICgoYyksIChsKSkKKyMgICBkZWZpbmUgdG9hc2NpaV9sKGMsbCkJX190b2FzY2lpX2wgKChjKSwgKGwpKQorIyAgZW5kaWYKKworIyBlbmRpZiAvKiBOb3QgX19OT19DVFlQRS4gICovCisKKyNlbmRpZiAvKiBVc2UgR05VLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGN0eXBlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgwZGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXMuaApAQCAtMCwwICsxLDE0OTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IFRob21hcyBFLiBEaWNrZXkgICAgICAgICAgICAgICAgICAgICAgICAxOTk2LW9uICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBjdXJzZXMuaC5pbix2IDEuMTgxIDIwMDcvMTEvMTggMDA6MzI6MDMgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgX19OQ1VSU0VTX0gKKyNkZWZpbmUgX19OQ1VSU0VTX0gKKworI2RlZmluZSBDVVJTRVMgMQorI2RlZmluZSBDVVJTRVNfSCAxCisKKy8qIFRoaXMgc2hvdWxkIGJlIGRlZmluZWQgZm9yIHRoZSBlbmhhbmNlZCBmdW5jdGlvbmFsaXR5IHRvIGJlIHZpc2libGUuCisgKiBIb3dldmVyLCBzb21lIG9mIHRoZSB3aWRlLWNoYXJhY3RlciAoZW5oYW5jZWQpIGZ1bmN0aW9uYWxpdHkgaXMgbWlzc2luZy4KKyAqIFNvIHdlIGRvIG5vdCBkZWZpbmUgaXQgKHlldCkuCisjZGVmaW5lIF9YT1BFTl9DVVJTRVMgMQorICovCisKKy8qIFRoZXNlIGFyZSBkZWZpbmVkIG9ubHkgaW4gY3Vyc2VzLmgsIGFuZCBhcmUgdXNlZCBmb3IgY29uZGl0aW9uYWwgY29tcGlsZXMgKi8KKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OX01BSk9SIDUKKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OX01JTk9SIDYKKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OX1BBVENIIDIwMDcxMTI0CisKKy8qIFRoaXMgaXMgZGVmaW5lZCBpbiBtb3JlIHRoYW4gb25lIG5jdXJzZXMgaGVhZGVyLCBmb3IgaWRlbnRpZmljYXRpb24gKi8KKyN1bmRlZiAgTkNVUlNFU19WRVJTSU9OCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTiAiNS42IgorCisvKgorICogSWRlbnRpZnkgdGhlIG1vdXNlIGVuY29kaW5nIHZlcnNpb24uCisgKi8KKyNkZWZpbmUgTkNVUlNFU19NT1VTRV9WRVJTSU9OIDEKKworLyoKKyAqIERlZmluaXRpb25zIHRvIGZhY2lsaXRhdGUgRExMJ3MuCisgKi8KKyNpbmNsdWRlIDxuY3Vyc2VzX2RsbC5oPgorCisvKgorICogVXNlci1kZWZpbmFibGUgdHdlYWsgdG8gZGlzYWJsZSB0aGUgaW5jbHVkZSBvZiA8c3RkYm9vbC5oPi4KKyAqLworI2lmbmRlZiBOQ1VSU0VTX0VOQUJMRV9TVERCT09MX0gKKyNkZWZpbmUgTkNVUlNFU19FTkFCTEVfU1REQk9PTF9IIDEKKyNlbmRpZgorCisvKgorICogTkNVUlNFU19BVFRSX1QgaXMgdXNlZCB0byBxdWlldCBjb21waWxlciB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIG5jdXJzZXMKKyAqIGNvbmZpZ3VyZWQgdXNpbmcgLS1kaXNhYmxlLW1hY3Jvcy4KKyAqLworI2lmZGVmIE5DVVJTRVNfTk9NQUNST1MKKyNpZm5kZWYgTkNVUlNFU19BVFRSX1QKKyNkZWZpbmUgTkNVUlNFU19BVFRSX1QgYXR0cl90CisjZW5kaWYKKyNlbmRpZiAvKiBOQ1VSU0VTX05PTUFDUk9TICovCisKKyNpZm5kZWYgTkNVUlNFU19BVFRSX1QKKyNkZWZpbmUgTkNVUlNFU19BVFRSX1QgaW50CisjZW5kaWYKKworLyoKKyAqIEV4cGFuZHMgdG8gJ2NvbnN0JyBpZiBuY3Vyc2VzIGlzIGNvbmZpZ3VyZWQgdXNpbmcgLS1lbmFibGUtY29uc3QuICBOb3RlIHRoYXQKKyAqIGRvaW5nIHNvIG1ha2VzIGl0IGluY29tcGF0aWJsZSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucyBvZiBYL09wZW4gQ3Vyc2VzLgorICovCisjdW5kZWYgIE5DVVJTRVNfQ09OU1QKKyNkZWZpbmUgTkNVUlNFU19DT05TVCBjb25zdAorCisjdW5kZWYgTkNVUlNFU19JTkxJTkUKKyNkZWZpbmUgTkNVUlNFU19JTkxJTkUgaW5saW5lCisKKy8qCisgKiBUaGUgaW50ZXJuYWwgdHlwZSB1c2VkIGZvciBjb2xvciB2YWx1ZXMKKyAqLworI3VuZGVmCU5DVVJTRVNfQ09MT1JfVAorI2RlZmluZQlOQ1VSU0VTX0NPTE9SX1Qgc2hvcnQKKworLyoKKyAqIERlZmluaXRpb24gdXNlZCB0byBtYWtlIFdJTkRPVyBhbmQgc2ltaWxhciBzdHJ1Y3RzIG9wYXF1ZS4KKyAqLworI2lmbmRlZiBOQ1VSU0VTX09QQVFVRQorI2RlZmluZSBOQ1VSU0VTX09QQVFVRSAwCisjZW5kaWYKKworLyoKKyAqIFRoZSBpbnRlcm5hbCB0eXBlIHVzZWQgZm9yIHdpbmRvdyBkaW1lbnNpb25zLgorICovCisjdW5kZWYJTkNVUlNFU19TSVpFX1QKKyNkZWZpbmUJTkNVUlNFU19TSVpFX1Qgc2hvcnQKKworLyoKKyAqIENvbnRyb2wgd2hldGhlciB0cGFybSgpIHN1cHBvcnRzIHZhcmFyZ3Mgb3IgZml4ZWQtcGFyYW1ldGVyIGxpc3QuCisgKi8KKyN1bmRlZiBOQ1VSU0VTX1RQQVJNX1ZBUkFSR1MKKyNkZWZpbmUgTkNVUlNFU19UUEFSTV9WQVJBUkdTIDEKKworLyoKKyAqIE5DVVJTRVNfQ0hfVCBpcyB1c2VkIGluIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LCBidXQgbm90IHVzZWQgb3RoZXJ3aXNlIGluCisgKiB0aGlzIGhlYWRlciBmaWxlLCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UgdGhlIG5vcm1hbC93aWRlLWNoYXJhY3RlciB2ZXJzaW9ucworICogb2YgdGhlIGhlYWRlciBpbmNvbXBhdGlibGUuCisgKi8KKyN1bmRlZglOQ1VSU0VTX0NIX1QKKyNkZWZpbmUgTkNVUlNFU19DSF9UIGNodHlwZQorCisjaWYgMCAmJiBkZWZpbmVkKF9MUDY0KQordHlwZWRlZiB1bnNpZ25lZCBjaHR5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIG1tYXNrX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNodHlwZTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtbWFza190OworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuY3RybC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgkvKiB3ZSBuZWVkIHZhX2xpc3QgKi8KKyNpZmRlZiBfWE9QRU5fU09VUkNFX0VYVEVOREVECisjaW5jbHVkZSA8c3RkZGVmLmg+CS8qIHdlIHdhbnQgd2NoYXJfdCAqLworI2VuZGlmIC8qIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgKi8KKworLyogWC9PcGVuIGFuZCBTVnI0IHNwZWNpZnkgdGhhdCBjdXJzZXMgaW1wbGVtZW50cyAnYm9vbCcuICBIb3dldmVyLCBDKysgbWF5IGFsc28KKyAqIGltcGxlbWVudCBpdC4gIElmIHNvLCB3ZSBtdXN0IHVzZSB0aGUgQysrIGNvbXBpbGVyJ3MgdHlwZSB0byBhdm9pZCBjb25mbGljdAorICogd2l0aCBvdGhlciBpbnRlcmZhY2VzLgorICoKKyAqIEEgZnVydGhlciBjb21wbGljYXRpb24gaXMgdGhhdCA8c3RkYm9vbC5oPiBtYXkgZGVjbGFyZSAnYm9vbCcgdG8gYmUgYQorICogZGlmZmVyZW50IHR5cGUsIHN1Y2ggYXMgYW4gZW51bSB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgY29tcGF0aWJsZSB3aXRoCisgKiBDKysuICBJZiB3ZSBoYXZlIDxzdGRib29sLmg+LCBtYWtlICdib29sJyBhIG1hY3JvLCBzbyB1c2VycyBtYXkgI3VuZGVmIGl0LgorICogT3RoZXJ3aXNlLCBsZXQgaXQgcmVtYWluIGEgdHlwZWRlZiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciAjZGVmaW5lJ3MuCisgKiBJbiBlaXRoZXIgY2FzZSwgbWFrZSBhIHR5cGVkZWYgZm9yIE5DVVJTRVNfQk9PTCB3aGljaCBjYW4gYmUgdXNlZCBpZiBuZWVkZWQKKyAqIGZyb20gZWl0aGVyIEMgb3IgQysrLgorICovCisKKyN1bmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgMQorCisjdW5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgICAwCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBOQ1VSU0VTX0JPT0w7CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQkvKiBfX2NwbHVzcGx1cywgZXRjLiAqLworCisvKiB1c2UgdGhlIEMrKyBjb21waWxlcidzIGJvb2wgdHlwZSAqLworI2RlZmluZSBOQ1VSU0VTX0JPT0wgYm9vbAorCisjZWxzZQkJCS8qIGM4OSwgYzk5LCBldGMuICovCisKKyNpZiBOQ1VSU0VTX0VOQUJMRV9TVERCT09MX0gKKyNpbmNsdWRlIDxzdGRib29sLmg+CisvKiB1c2Ugd2hhdGV2ZXIgdGhlIEMgY29tcGlsZXIgZGVjaWRlcyBib29sIHJlYWxseSBpcyAqLworI2RlZmluZSBOQ1VSU0VTX0JPT0wgYm9vbAorI2Vsc2UKKy8qIHRoZXJlIGlzIG5vIHByZWRlZmluZWQgYm9vbCAtIHVzZSBvdXIgb3duICovCisjdW5kZWYgYm9vbAorI2RlZmluZSBib29sIE5DVVJTRVNfQk9PTAorI2VuZGlmCisKKyNlbmRpZiAvKiAhX19jcGx1c3BsdXMsIGV0Yy4gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNkZWZpbmUgTkNVUlNFU19DQVNUKHR5cGUsdmFsdWUpIHN0YXRpY19jYXN0PHR5cGU+KHZhbHVlKQorI2Vsc2UKKyNkZWZpbmUgTkNVUlNFU19DQVNUKHR5cGUsdmFsdWUpICh0eXBlKSh2YWx1ZSkKKyNlbmRpZgorCisvKgorICogWC9PcGVuIGF0dHJpYnV0ZXMuICBJbiB0aGUgbmN1cnNlcyBpbXBsZW1lbnRhdGlvbiwgdGhleSBhcmUgaWRlbnRpY2FsIHRvIHRoZQorICogQV8gYXR0cmlidXRlcy4KKyAqLworI2RlZmluZSBXQV9BVFRSSUJVVEVTCUFfQVRUUklCVVRFUworI2RlZmluZSBXQV9OT1JNQUwJQV9OT1JNQUwKKyNkZWZpbmUgV0FfU1RBTkRPVVQJQV9TVEFORE9VVAorI2RlZmluZSBXQV9VTkRFUkxJTkUJQV9VTkRFUkxJTkUKKyNkZWZpbmUgV0FfUkVWRVJTRQlBX1JFVkVSU0UKKyNkZWZpbmUgV0FfQkxJTksJQV9CTElOSworI2RlZmluZSBXQV9ESU0JCUFfRElNCisjZGVmaW5lIFdBX0JPTEQJCUFfQk9MRAorI2RlZmluZSBXQV9BTFRDSEFSU0VUCUFfQUxUQ0hBUlNFVAorI2RlZmluZSBXQV9JTlZJUwlBX0lOVklTCisjZGVmaW5lIFdBX1BST1RFQ1QJQV9QUk9URUNUCisjZGVmaW5lIFdBX0hPUklaT05UQUwJQV9IT1JJWk9OVEFMCisjZGVmaW5lIFdBX0xFRlQJCUFfTEVGVAorI2RlZmluZSBXQV9MT1cJCUFfTE9XCisjZGVmaW5lIFdBX1JJR0hUCUFfUklHSFQKKyNkZWZpbmUgV0FfVE9QCQlBX1RPUAorI2RlZmluZSBXQV9WRVJUSUNBTAlBX1ZFUlRJQ0FMCisKKy8qIGNvbG9ycyAqLworI2RlZmluZSBDT0xPUl9CTEFDSwkwCisjZGVmaW5lIENPTE9SX1JFRAkxCisjZGVmaW5lIENPTE9SX0dSRUVOCTIKKyNkZWZpbmUgQ09MT1JfWUVMTE9XCTMKKyNkZWZpbmUgQ09MT1JfQkxVRQk0CisjZGVmaW5lIENPTE9SX01BR0VOVEEJNQorI2RlZmluZSBDT0xPUl9DWUFOCTYKKyNkZWZpbmUgQ09MT1JfV0hJVEUJNworCisvKiBsaW5lIGdyYXBoaWNzICovCisKKyNpZiAwIHx8IDAKK05DVVJTRVNfV1JBUFBFRF9WQVIoY2h0eXBlKiwgYWNzX21hcCk7CisjZGVmaW5lIGFjc19tYXAgKF9uY19hY3NfbWFwKCkpCisjZWxzZQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjaHR5cGUpIGFjc19tYXBbXTsKKyNlbmRpZgorCisjZGVmaW5lIE5DVVJTRVNfQUNTKGMpCShhY3NfbWFwW05DVVJTRVNfQ0FTVCh1bnNpZ25lZCBjaGFyLGMpXSkKKworLyogVlQxMDAgc3ltYm9scyBiZWdpbiBoZXJlICovCisjZGVmaW5lIEFDU19VTENPUk5FUglOQ1VSU0VTX0FDUygnbCcpIC8qIHVwcGVyIGxlZnQgY29ybmVyICovCisjZGVmaW5lIEFDU19MTENPUk5FUglOQ1VSU0VTX0FDUygnbScpIC8qIGxvd2VyIGxlZnQgY29ybmVyICovCisjZGVmaW5lIEFDU19VUkNPUk5FUglOQ1VSU0VTX0FDUygnaycpIC8qIHVwcGVyIHJpZ2h0IGNvcm5lciAqLworI2RlZmluZSBBQ1NfTFJDT1JORVIJTkNVUlNFU19BQ1MoJ2onKSAvKiBsb3dlciByaWdodCBjb3JuZXIgKi8KKyNkZWZpbmUgQUNTX0xURUUJTkNVUlNFU19BQ1MoJ3QnKSAvKiB0ZWUgcG9pbnRpbmcgcmlnaHQgKi8KKyNkZWZpbmUgQUNTX1JURUUJTkNVUlNFU19BQ1MoJ3UnKSAvKiB0ZWUgcG9pbnRpbmcgbGVmdCAqLworI2RlZmluZSBBQ1NfQlRFRQlOQ1VSU0VTX0FDUygndicpIC8qIHRlZSBwb2ludGluZyB1cCAqLworI2RlZmluZSBBQ1NfVFRFRQlOQ1VSU0VTX0FDUygndycpIC8qIHRlZSBwb2ludGluZyBkb3duICovCisjZGVmaW5lIEFDU19ITElORQlOQ1VSU0VTX0FDUygncScpIC8qIGhvcml6b250YWwgbGluZSAqLworI2RlZmluZSBBQ1NfVkxJTkUJTkNVUlNFU19BQ1MoJ3gnKSAvKiB2ZXJ0aWNhbCBsaW5lICovCisjZGVmaW5lIEFDU19QTFVTCU5DVVJTRVNfQUNTKCduJykgLyogbGFyZ2UgcGx1cyBvciBjcm9zc292ZXIgKi8KKyNkZWZpbmUgQUNTX1MxCQlOQ1VSU0VTX0FDUygnbycpIC8qIHNjYW4gbGluZSAxICovCisjZGVmaW5lIEFDU19TOQkJTkNVUlNFU19BQ1MoJ3MnKSAvKiBzY2FuIGxpbmUgOSAqLworI2RlZmluZSBBQ1NfRElBTU9ORAlOQ1VSU0VTX0FDUygnYCcpIC8qIGRpYW1vbmQgKi8KKyNkZWZpbmUgQUNTX0NLQk9BUkQJTkNVUlNFU19BQ1MoJ2EnKSAvKiBjaGVja2VyIGJvYXJkIChzdGlwcGxlKSAqLworI2RlZmluZSBBQ1NfREVHUkVFCU5DVVJTRVNfQUNTKCdmJykgLyogZGVncmVlIHN5bWJvbCAqLworI2RlZmluZSBBQ1NfUExNSU5VUwlOQ1VSU0VTX0FDUygnZycpIC8qIHBsdXMvbWludXMgKi8KKyNkZWZpbmUgQUNTX0JVTExFVAlOQ1VSU0VTX0FDUygnficpIC8qIGJ1bGxldCAqLworLyogVGVsZXR5cGUgNTQxMHYxIHN5bWJvbHMgYmVnaW4gaGVyZSAqLworI2RlZmluZSBBQ1NfTEFSUk9XCU5DVVJTRVNfQUNTKCcsJykgLyogYXJyb3cgcG9pbnRpbmcgbGVmdCAqLworI2RlZmluZSBBQ1NfUkFSUk9XCU5DVVJTRVNfQUNTKCcrJykgLyogYXJyb3cgcG9pbnRpbmcgcmlnaHQgKi8KKyNkZWZpbmUgQUNTX0RBUlJPVwlOQ1VSU0VTX0FDUygnLicpIC8qIGFycm93IHBvaW50aW5nIGRvd24gKi8KKyNkZWZpbmUgQUNTX1VBUlJPVwlOQ1VSU0VTX0FDUygnLScpIC8qIGFycm93IHBvaW50aW5nIHVwICovCisjZGVmaW5lIEFDU19CT0FSRAlOQ1VSU0VTX0FDUygnaCcpIC8qIGJvYXJkIG9mIHNxdWFyZXMgKi8KKyNkZWZpbmUgQUNTX0xBTlRFUk4JTkNVUlNFU19BQ1MoJ2knKSAvKiBsYW50ZXJuIHN5bWJvbCAqLworI2RlZmluZSBBQ1NfQkxPQ0sJTkNVUlNFU19BQ1MoJzAnKSAvKiBzb2xpZCBzcXVhcmUgYmxvY2sgKi8KKy8qCisgKiBUaGVzZSBhcmVuJ3QgZG9jdW1lbnRlZCwgYnV0IGEgbG90IG9mIFN5c3RlbSBWcyBoYXZlIHRoZW0gYW55d2F5CisgKiAoeW91IGNhbiBzcG90IHBwcnJ5eXp6e3t8fH19IGluIGEgbG90IG9mIEFUJlQgdGVybWluZm8gc3RyaW5ncykuCisgKiBUaGUgQUNTX25hbWVzIG1heSBub3QgbWF0Y2ggQVQmVCdzLCBvdXIgc291cmNlIGRpZG4ndCBrbm93IHRoZW0uCisgKi8KKyNkZWZpbmUgQUNTX1MzCQlOQ1VSU0VTX0FDUygncCcpIC8qIHNjYW4gbGluZSAzICovCisjZGVmaW5lIEFDU19TNwkJTkNVUlNFU19BQ1MoJ3InKSAvKiBzY2FuIGxpbmUgNyAqLworI2RlZmluZSBBQ1NfTEVRVUFMCU5DVVJTRVNfQUNTKCd5JykgLyogbGVzcy9lcXVhbCAqLworI2RlZmluZSBBQ1NfR0VRVUFMCU5DVVJTRVNfQUNTKCd6JykgLyogZ3JlYXRlci9lcXVhbCAqLworI2RlZmluZSBBQ1NfUEkJCU5DVVJTRVNfQUNTKCd7JykgLyogUGkgKi8KKyNkZWZpbmUgQUNTX05FUVVBTAlOQ1VSU0VTX0FDUygnfCcpIC8qIG5vdCBlcXVhbCAqLworI2RlZmluZSBBQ1NfU1RFUkxJTkcJTkNVUlNFU19BQ1MoJ30nKSAvKiBVSyBwb3VuZCBzaWduICovCisKKy8qCisgKiBMaW5lIGRyYXdpbmcgQUNTIG5hbWVzIGFyZSBvZiB0aGUgZm9ybSBBQ1NfdHJibCwgd2hlcmUgdCBpcyB0aGUgdG9wLCByCisgKiBpcyB0aGUgcmlnaHQsIGIgaXMgdGhlIGJvdHRvbSwgYW5kIGwgaXMgdGhlIGxlZnQuICB0LCByLCBiLCBhbmQgbCBtaWdodAorICogYmUgQiAoYmxhbmspLCBTIChzaW5nbGUpLCBEIChkb3VibGUpLCBvciBUICh0aGljaykuICBUaGUgc3Vic2V0IGRlZmluZWQKKyAqIGhlcmUgb25seSB1c2VzIEIgYW5kIFMuCisgKi8KKyNkZWZpbmUgQUNTX0JTU0IJQUNTX1VMQ09STkVSCisjZGVmaW5lIEFDU19TU0JCCUFDU19MTENPUk5FUgorI2RlZmluZSBBQ1NfQkJTUwlBQ1NfVVJDT1JORVIKKyNkZWZpbmUgQUNTX1NCQlMJQUNTX0xSQ09STkVSCisjZGVmaW5lIEFDU19TQlNTCUFDU19SVEVFCisjZGVmaW5lIEFDU19TU1NCCUFDU19MVEVFCisjZGVmaW5lIEFDU19TU0JTCUFDU19CVEVFCisjZGVmaW5lIEFDU19CU1NTCUFDU19UVEVFCisjZGVmaW5lIEFDU19CU0JTCUFDU19ITElORQorI2RlZmluZSBBQ1NfU0JTQglBQ1NfVkxJTkUKKyNkZWZpbmUgQUNTX1NTU1MJQUNTX1BMVVMKKworI3VuZGVmCUVSUgorI2RlZmluZSBFUlIgICAgICgtMSkKKworI3VuZGVmCU9LCisjZGVmaW5lIE9LICAgICAgKDApCisKKy8qIHZhbHVlcyBmb3IgdGhlIF9mbGFncyBtZW1iZXIgKi8KKyNkZWZpbmUgX1NVQldJTiAgICAgICAgIDB4MDEJLyogaXMgdGhpcyBhIHN1Yi13aW5kb3c/ICovCisjZGVmaW5lIF9FTkRMSU5FICAgICAgICAweDAyCS8qIGlzIHRoZSB3aW5kb3cgZmx1c2ggcmlnaHQ/ICovCisjZGVmaW5lIF9GVUxMV0lOICAgICAgICAweDA0CS8qIGlzIHRoZSB3aW5kb3cgZnVsbC1zY3JlZW4/ICovCisjZGVmaW5lIF9TQ1JPTExXSU4gICAgICAweDA4CS8qIGJvdHRvbSBlZGdlIGlzIGF0IHNjcmVlbiBib3R0b20/ICovCisjZGVmaW5lIF9JU1BBRAkgICAgICAgIDB4MTAJLyogaXMgdGhpcyB3aW5kb3cgYSBwYWQ/ICovCisjZGVmaW5lIF9IQVNNT1ZFRCAgICAgICAweDIwCS8qIGhhcyBjdXJzb3IgbW92ZWQgc2luY2UgbGFzdCByZWZyZXNoPyAqLworI2RlZmluZSBfV1JBUFBFRCAgICAgICAgMHg0MAkvKiBjdXJzb3Igd2FzIGp1c3Qgd3JhcHBwZWQgKi8KKworLyoKKyAqIHRoaXMgdmFsdWUgaXMgdXNlZCBpbiB0aGUgZmlyc3RjaGFyIGFuZCBsYXN0Y2hhciBmaWVsZHMgdG8gbWFyaworICogdW5jaGFuZ2VkIGxpbmVzCisgKi8KKyNkZWZpbmUgX05PQ0hBTkdFICAgICAgIC0xCisKKy8qCisgKiB0aGlzIHZhbHVlIGlzIHVzZWQgaW4gdGhlIG9sZGluZGV4IGZpZWxkIHRvIG1hcmsgbGluZXMgY3JlYXRlZCBieSBpbnNlcnRpb25zCisgKiBhbmQgc2Nyb2xscy4KKyAqLworI2RlZmluZSBfTkVXSU5ERVgJLTEKKwordHlwZWRlZiBzdHJ1Y3Qgc2NyZWVuICBTQ1JFRU47Cit0eXBlZGVmIHN0cnVjdCBfd2luX3N0IFdJTkRPVzsKKwordHlwZWRlZgljaHR5cGUJYXR0cl90OwkJLyogLi4ubXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIGNodHlwZSAqLworCisjaWZkZWYgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAorCisjaWYgMAorI2lmZGVmIG1ibGVuCQkJLyogbGlidXRmOC5oIGRlZmluZXMgaXQgdy9vIHVuZGVmaW5pbmcgZmlyc3QgKi8KKyN1bmRlZiBtYmxlbgorI2VuZGlmCisjaW5jbHVkZSA8bGlidXRmOC5oPgorI2VuZGlmCisKKyNpZiAwCisjaW5jbHVkZSA8d2NoYXIuaD4JCS8qIC4uLnRvIGdldCBtYnN0YXRlX3QsIGV0Yy4gKi8KKyNlbmRpZgorCisjaWYgMAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB3Y2hhcl90OworI2VuZGlmCisKKyNpZiAwCit0eXBlZGVmIHVuc2lnbmVkIGludCB3aW50X3Q7CisjZW5kaWYKKworI2RlZmluZSBDQ0hBUldfTUFYCTUKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYXR0cl90CWF0dHI7CisgICAgd2NoYXJfdAljaGFyc1tDQ0hBUldfTUFYXTsKKyNpZiAwCisjdW5kZWYgTkNVUlNFU19FWFRfQ09MT1JTCisjZGVmaW5lIE5DVVJTRVNfRVhUX0NPTE9SUyAyMDA3MTEyNAorICAgIGludAkJZXh0X2NvbG9yOwkvKiBjb2xvciBwYWlyLCBtdXN0IGJlIG1vcmUgdGhhbiAxNi1iaXRzICovCisjZW5kaWYKK30KK2NjaGFyX3Q7CisKKyNlbmRpZiAvKiBfWE9QRU5fU09VUkNFX0VYVEVOREVEICovCisKKyNpZiAhTkNVUlNFU19PUEFRVUUKK3N0cnVjdCBsZGF0OworCitzdHJ1Y3QgX3dpbl9zdAoreworCU5DVVJTRVNfU0laRV9UIF9jdXJ5LCBfY3VyeDsgLyogY3VycmVudCBjdXJzb3IgcG9zaXRpb24gKi8KKworCS8qIHdpbmRvdyBsb2NhdGlvbiBhbmQgc2l6ZSAqLworCU5DVVJTRVNfU0laRV9UIF9tYXh5LCBfbWF4eDsgLyogbWF4aW11bXMgb2YgeCBhbmQgeSwgTk9UIHdpbmRvdyBzaXplICovCisJTkNVUlNFU19TSVpFX1QgX2JlZ3ksIF9iZWd4OyAvKiBzY3JlZW4gY29vcmRzIG9mIHVwcGVyLWxlZnQtaGFuZCBjb3JuZXIgKi8KKworCXNob3J0ICAgX2ZsYWdzOwkJLyogd2luZG93IHN0YXRlIGZsYWdzICovCisKKwkvKiBhdHRyaWJ1dGUgdHJhY2tpbmcgKi8KKwlhdHRyX3QgIF9hdHRyczsJCS8qIGN1cnJlbnQgYXR0cmlidXRlIGZvciBub24tc3BhY2UgY2hhcmFjdGVyICovCisJY2h0eXBlICBfYmtnZDsJCS8qIGN1cnJlbnQgYmFja2dyb3VuZCBjaGFyL2F0dHJpYnV0ZSBwYWlyICovCisKKwkvKiBvcHRpb24gdmFsdWVzIHNldCBieSB1c2VyICovCisJYm9vbAlfbm90aW1lb3V0OwkvKiBubyB0aW1lIG91dCBvbiBmdW5jdGlvbi1rZXkgZW50cnk/ICovCisJYm9vbAlfY2xlYXI7CQkvKiBjb25zaWRlciBhbGwgZGF0YSBpbiB0aGUgd2luZG93IGludmFsaWQ/ICovCisJYm9vbAlfbGVhdmVvazsJLyogT0sgdG8gbm90IHJlc2V0IGN1cnNvciBvbiBleGl0PyAqLworCWJvb2wJX3Njcm9sbDsJLyogT0sgdG8gc2Nyb2xsIHRoaXMgd2luZG93PyAqLworCWJvb2wJX2lkbG9rOwkJLyogT0sgdG8gdXNlIGluc2VydC9kZWxldGUgbGluZT8gKi8KKwlib29sCV9pZGNvazsJCS8qIE9LIHRvIHVzZSBpbnNlcnQvZGVsZXRlIGNoYXI/ICovCisJYm9vbAlfaW1tZWQ7CQkvKiB3aW5kb3cgaW4gaW1tZWQgbW9kZT8gKG5vdCB5ZXQgdXNlZCkgKi8KKwlib29sCV9zeW5jOwkJLyogd2luZG93IGluIHN5bmMgbW9kZT8gKi8KKwlib29sCV91c2Vfa2V5cGFkOwkvKiBwcm9jZXNzIGZ1bmN0aW9uIGtleXMgaW50byBLRVlfIHN5bWJvbHM/ICovCisJaW50CV9kZWxheTsJCS8qIDAgPSBub2RlbGF5LCA8MCA9IGJsb2NraW5nLCA+MCA9IGRlbGF5ICovCisKKwlzdHJ1Y3QgbGRhdCAqX2xpbmU7CS8qIHRoZSBhY3R1YWwgbGluZSBkYXRhICovCisKKwkvKiBnbG9iYWwgc2NyZWVuIHN0YXRlICovCisJTkNVUlNFU19TSVpFX1QgX3JlZ3RvcDsJLyogdG9wIGxpbmUgb2Ygc2Nyb2xsaW5nIHJlZ2lvbiAqLworCU5DVVJTRVNfU0laRV9UIF9yZWdib3R0b207IC8qIGJvdHRvbSBsaW5lIG9mIHNjcm9sbGluZyByZWdpb24gKi8KKworCS8qIHRoZXNlIGFyZSB1c2VkIG9ubHkgaWYgdGhpcyBpcyBhIHN1Yi13aW5kb3cgKi8KKwlpbnQJX3Bhcng7CQkvKiB4IGNvb3JkaW5hdGUgb2YgdGhpcyB3aW5kb3cgaW4gcGFyZW50ICovCisJaW50CV9wYXJ5OwkJLyogeSBjb29yZGluYXRlIG9mIHRoaXMgd2luZG93IGluIHBhcmVudCAqLworCVdJTkRPVwkqX3BhcmVudDsJLyogcG9pbnRlciB0byBwYXJlbnQgaWYgYSBzdWItd2luZG93ICovCisKKwkvKiB0aGVzZSBhcmUgdXNlZCBvbmx5IGlmIHRoaXMgaXMgYSBwYWQgKi8KKwlzdHJ1Y3QgcGRhdAorCXsKKwkgICAgTkNVUlNFU19TSVpFX1QgX3BhZF95LCAgICAgIF9wYWRfeDsKKwkgICAgTkNVUlNFU19TSVpFX1QgX3BhZF90b3AsICAgIF9wYWRfbGVmdDsKKwkgICAgTkNVUlNFU19TSVpFX1QgX3BhZF9ib3R0b20sIF9wYWRfcmlnaHQ7CisJfSBfcGFkOworCisJTkNVUlNFU19TSVpFX1QgX3lvZmZzZXQ7IC8qIHJlYWwgYmVneSBpcyBfYmVneSArIF95b2Zmc2V0ICovCisKKyNpZmRlZiBfWE9QRU5fU09VUkNFX0VYVEVOREVECisJY2NoYXJfdCAgX2JrZ3JuZDsJLyogY3VycmVudCBiYWNrZ3JvdW5kIGNoYXIvYXR0cmlidXRlIHBhaXIgKi8KKyNpZiAwCisJaW50CV9jb2xvcjsJCS8qIGN1cnJlbnQgY29sb3ItcGFpciBmb3Igbm9uLXNwYWNlIGNoYXJhY3RlciAqLworI2VuZGlmCisjZW5kaWYKK307CisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworLyoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN1cHBvcnQgZXZlbnRzLi4uCisgKi8KKyNpZiAxCisjaWZkZWYgTkNVUlNFU19XR0VUQ0hfRVZFTlRTCisjaWYgIWRlZmluZWQoX19CRU9TX18pCQkvKiBGaXggX25jX3RpbWVkX3dhaXQoKSBvbiBCRU9TLi4uICovCisjICBkZWZpbmUgTkNVUlNFU19FVkVOVF9WRVJTSU9OCTEKKyNlbmRpZgkvKiAhZGVmaW5lZChfX0JFT1NfXykgKi8KKworLyoKKyAqIEJpdHMgdG8gc2V0IGluIF9uY19ldmVudC5kYXRhLmZsYWdzCisgKi8KKyMgIGRlZmluZSBfTkNfRVZFTlRfVElNRU9VVF9NU0VDCTEKKyMgIGRlZmluZSBfTkNfRVZFTlRfRklMRQkJMgorIyAgZGVmaW5lIF9OQ19FVkVOVF9GSUxFX1JFQURBQkxFCTIKKyMgIGlmIDAJCQkJCS8qIE5vdCBzdXBwb3J0ZWQgeWV0Li4uICovCisjICAgIGRlZmluZSBfTkNfRVZFTlRfRklMRV9XUklUQUJMRQk0CisjICAgIGRlZmluZSBfTkNfRVZFTlRfRklMRV9FWENFUFRJT04JOAorIyAgZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgdHlwZTsKKyAgICB1bmlvbgorICAgIHsKKwlsb25nIHRpbWVvdXRfbXNlYzsJLyogX05DX0VWRU5UX1RJTUVPVVRfTVNFQyAqLworCXN0cnVjdAorCXsKKwkgICAgdW5zaWduZWQgaW50IGZsYWdzOworCSAgICBpbnQgZmQ7CisJICAgIHVuc2lnbmVkIGludCByZXN1bHQ7CisJfSBmZXY7CQkJCS8qIF9OQ19FVkVOVF9GSUxFICovCisgICAgfSBkYXRhOworfSBfbmNfZXZlbnQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGNvdW50OworICAgIGludCByZXN1bHRfZmxhZ3M7CS8qIF9OQ19FVkVOVF9USU1FT1VUX01TRUMgb3IgX05DX0VWRU5UX0ZJTEVfUkVBREFCTEUgKi8KKyAgICBfbmNfZXZlbnQgKmV2ZW50c1sxXTsKK30gX25jX2V2ZW50bGlzdDsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2dldGNoX2V2ZW50cyhXSU5ET1cgKiwgX25jX2V2ZW50bGlzdCAqKTsJLyogZXhwZXJpbWVudGFsICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Z2V0bnN0cl9ldmVudHMoV0lORE9XICosY2hhciAqLGludCxfbmNfZXZlbnRsaXN0ICopOy8qIGV4cGVyaW1lbnRhbCAqLworCisjZW5kaWYgLyogTkNVUlNFU19XR0VUQ0hfRVZFTlRTICovCisjZW5kaWYgLyogTkNVUlNFU19FWFRfRlVOQ1MgKi8KKworLyoKKyAqIEdDQyAoYW5kIHNvbWUgb3RoZXIgY29tcGlsZXJzKSBkZWZpbmUgJ19fYXR0cmlidXRlX18nOyB3ZSdyZSB1c2luZyB0aGlzCisgKiBtYWNybyB0byBhbGVydCB0aGUgY29tcGlsZXIgdG8gZmxhZyBpbmNvbnNpc3RlbmNpZXMgaW4gcHJpbnRmL3NjYW5mLWxpa2UKKyAqIGZ1bmN0aW9uIGNhbGxzLiAgSnVzdCBpbiBjYXNlICdfX2F0dHJpYnV0ZV9fJyBpc24ndCBkZWZpbmVkLCBtYWtlIGEgZHVtbXkuCisgKiBPbGQgdmVyc2lvbnMgb2YgRysrIGRvIG5vdCBhY2NlcHQgaXQgYW55d2F5LCBhdCBsZWFzdCBub3QgY29uc2lzdGVudGx5IHdpdGgKKyAqIEdDQy4KKyAqLworI2lmICEoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0dOVUdfXykgfHwgZGVmaW5lZChfX2F0dHJpYnV0ZV9fKSkKKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyhwKSAvKiBub3RoaW5nICovCisjZW5kaWYKKworLyoKKyAqIFdlIGNhbm5vdCBkZWZpbmUgdGhlc2UgaW4gbmN1cnNlc19jZmcuaCwgc2luY2UgdGhleSByZXF1aXJlIHBhcmFtZXRlcnMgdG8gYmUKKyAqIHBhc3NlZCAodGhhdCBpcyBub24tcG9ydGFibGUpLiAgSWYgeW91IGhhcHBlbiB0byBiZSB1c2luZyBnY2Mgd2l0aCB3YXJuaW5ncworICogZW5hYmxlZCwgZGVmaW5lCisgKglHQ0NfUFJJTlRGCisgKglHQ0NfU0NBTkYKKyAqIHRvIGltcHJvdmUgY2hlY2tpbmcgb2YgY2FsbHMgdG8gcHJpbnR3KCksIGV0Yy4KKyAqLworI2lmbmRlZiBHQ0NfUFJJTlRGTElLRQorI2lmIGRlZmluZWQoR0NDX1BSSU5URikgJiYgIWRlZmluZWQocHJpbnRmKQorI2RlZmluZSBHQ0NfUFJJTlRGTElLRShmbXQsdmFyKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLGZtdCx2YXIpKSkKKyNlbHNlCisjZGVmaW5lIEdDQ19QUklOVEZMSUtFKGZtdCx2YXIpIC8qbm90aGluZyovCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEdDQ19TQ0FORkxJS0UKKyNpZiBkZWZpbmVkKEdDQ19TQ0FORikgJiYgIWRlZmluZWQoc2NhbmYpCisjZGVmaW5lIEdDQ19TQ0FORkxJS0UoZm10LHZhcikgIF9fYXR0cmlidXRlX18oKGZvcm1hdChzY2FuZixmbXQsdmFyKSkpCisjZWxzZQorI2RlZmluZSBHQ0NfU0NBTkZMSUtFKGZtdCx2YXIpICAvKm5vdGhpbmcqLworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZglHQ0NfTk9SRVRVUk4KKyNkZWZpbmUJR0NDX05PUkVUVVJOIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZuZGVmCUdDQ19VTlVTRUQKKyNkZWZpbmUJR0NDX1VOVVNFRCAvKiBub3RoaW5nICovCisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMuICBUaGlzIGlzIHRoZSBjb21wbGV0ZSBYL09wZW4gQ3Vyc2VzIGxpc3Qgb2YgcmVxdWlyZWQKKyAqIGZ1bmN0aW9ucy4gIFRob3NlIG1hcmtlZCBgZ2VuZXJhdGVkJyB3aWxsIGhhdmUgc291cmNlcyBnZW5lcmF0ZWQgZnJvbSB0aGUKKyAqIG1hY3JvIGRlZmluaXRpb25zIGxhdGVyIGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gc2F0aXNmeSBYUEc0LjIKKyAqIHJlcXVpcmVtZW50cy4KKyAqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRjaCAoY29uc3QgY2h0eXBlKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGFkZGNobnN0ciAoY29uc3QgY2h0eXBlICosIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGFkZGNoc3RyIChjb25zdCBjaHR5cGUgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRuc3RyIChjb25zdCBjaGFyICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhZGRzdHIgKGNvbnN0IGNoYXIgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyb2ZmIChOQ1VSU0VTX0FUVFJfVCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyb24gKE5DVVJTRVNfQVRUUl9UKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGF0dHJzZXQgKE5DVVJTRVNfQVRUUl9UKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGF0dHJfZ2V0IChhdHRyX3QgKiwgc2hvcnQgKiwgdm9pZCAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBhdHRyX29mZiAoYXR0cl90LCB2b2lkICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cl9vbiAoYXR0cl90LCB2b2lkICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXR0cl9zZXQgKGF0dHJfdCwgc2hvcnQsIHZvaWQgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJhdWRyYXRlICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJlZXAgICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGJrZ2QgKGNodHlwZSk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIGJrZ2RzZXQgKGNodHlwZSk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYm9yZGVyIChjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBib3ggKFdJTkRPVyAqLCBjaHR5cGUsIGNodHlwZSk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBjYW5fY2hhbmdlX2NvbG9yICh2b2lkKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2JyZWFrICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNoZ2F0IChpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2xlYXIgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNsZWFyb2sgKFdJTkRPVyAqLGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjbHJ0b2JvdCAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgY2xydG9lb2wgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNvbG9yX2NvbnRlbnQgKHNob3J0LHNob3J0KixzaG9ydCosc2hvcnQqKTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGNvbG9yX3NldCAoc2hvcnQsdm9pZCopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgQ09MT1JfUEFJUiAoaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBjb3B5d2luIChjb25zdCBXSU5ET1cqLFdJTkRPVyosaW50LGludCxpbnQsaW50LGludCxpbnQsaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGN1cnNfc2V0IChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVmX3Byb2dfbW9kZSAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlZl9zaGVsbF9tb2RlICh2b2lkKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsYXlfb3V0cHV0IChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsY2ggKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBkZWxzY3JlZW4gKFNDUkVFTiAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZGVsd2luIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkZWxldGVsbiAodm9pZCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBkZXJ3aW4gKFdJTkRPVyAqLGludCxpbnQsaW50LGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkb3VwZGF0ZSAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIGR1cHdpbiAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlY2hvICh2b2lkKTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlY2hvY2hhciAoY29uc3QgY2h0eXBlKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGVyYXNlICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBlbmR3aW4gKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIpIGVyYXNlY2hhciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgZmlsdGVyICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGZsYXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGZsdXNoaW5wICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIGdldGJrZ2QgKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGdldGNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRuc3RyIChjaGFyICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRzdHIgKGNoYXIgKik7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBnZXR3aW4gKEZJTEUgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGhhbGZkZWxheSAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBoYXNfY29sb3JzICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBoYXNfaWMgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGhhc19pbCAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBobGluZSAoY2h0eXBlLCBpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBpZGNvayAoV0lORE9XICosIGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpZGxvayAoV0lORE9XICosIGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgaW1tZWRvayAoV0lORE9XICosIGJvb2wpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSBpbmNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbmNobnN0ciAoY2h0eXBlICosIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBpbmNoc3RyIChjaHR5cGUgKik7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBpbml0c2NyICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluaXRfY29sb3IgKHNob3J0LHNob3J0LHNob3J0LHNob3J0KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluaXRfcGFpciAoc2hvcnQsc2hvcnQsc2hvcnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGlubnN0ciAoY2hhciAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5zY2ggKGNodHlwZSk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5zZGVsbG4gKGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgaW5zZXJ0bG4gKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc25zdHIgKGNvbnN0IGNoYXIgKiwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc3N0ciAoY29uc3QgY2hhciAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGluc3RyIChjaGFyICopOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGludHJmbHVzaCAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc2VuZHdpbiAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfbGluZXRvdWNoZWQgKFdJTkRPVyAqLGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX3dpbnRvdWNoZWQgKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE5DVVJTRVNfQ09OU1QgY2hhciAqKSBrZXluYW1lIChpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGtleXBhZCAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyKSBraWxsY2hhciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBsZWF2ZW9rIChXSU5ET1cgKixib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgbG9uZ25hbWUgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbWV0YSAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG1vdmUgKGludCwgaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZGNoIChpbnQsIGludCwgY29uc3QgY2h0eXBlKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZhZGRjaG5zdHIgKGludCwgaW50LCBjb25zdCBjaHR5cGUgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZGNoc3RyIChpbnQsIGludCwgY29uc3QgY2h0eXBlICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12YWRkbnN0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmFkZHN0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12Y2hnYXQgKGludCwgaW50LCBpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZjdXIgKGludCxpbnQsaW50LGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12ZGVsY2ggKGludCwgaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmRlcndpbiAoV0lORE9XICosIGludCwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmdldGNoIChpbnQsIGludCk7CQkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZnZXRuc3RyIChpbnQsIGludCwgY2hhciAqLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmdldHN0ciAoaW50LCBpbnQsIGNoYXIgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmhsaW5lIChpbnQsIGludCwgY2h0eXBlLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKSBtdmluY2ggKGludCwgaW50KTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5jaG5zdHIgKGludCwgaW50LCBjaHR5cGUgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluY2hzdHIgKGludCwgaW50LCBjaHR5cGUgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5uc3RyIChpbnQsIGludCwgY2hhciAqLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluc2NoIChpbnQsIGludCwgY2h0eXBlKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5zbnN0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdmluc3N0ciAoaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12aW5zdHIgKGludCwgaW50LCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZwcmludHcgKGludCxpbnQsIGNvbnN0IGNoYXIgKiwuLi4pCQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSgzLDQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZzY2FudyAoaW50LGludCwgTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfU0NBTkZMSUtFKDMsNCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdnZsaW5lIChpbnQsIGludCwgY2h0eXBlLCBpbnQpOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRjaCAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaHR5cGUpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2FkZGNobnN0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaHR5cGUgKiwgaW50KTsvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2FkZGNoc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNodHlwZSAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRuc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndhZGRzdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY29uc3QgY2hhciAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndjaGdhdCAoV0lORE9XICosIGludCwgaW50LCBpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7LyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndkZWxjaCAoV0lORE9XICosIGludCwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3Z2V0Y2ggKFdJTkRPVyAqLCBpbnQsIGludCk7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2dldG5zdHIgKFdJTkRPVyAqLCBpbnQsIGludCwgY2hhciAqLCBpbnQpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2dldHN0ciAoV0lORE9XICosIGludCwgaW50LCBjaGFyICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2hsaW5lIChXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndpbiAoV0lORE9XICosaW50LGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIG12d2luY2ggKFdJTkRPVyAqLCBpbnQsIGludCk7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndpbmNobnN0ciAoV0lORE9XICosIGludCwgaW50LCBjaHR5cGUgKiwgaW50KTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtdndpbmNoc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNodHlwZSAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5uc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKiwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zY2ggKFdJTkRPVyAqLCBpbnQsIGludCwgY2h0eXBlKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zbnN0ciAoV0lORE9XICosIGludCwgaW50LCBjb25zdCBjaGFyICosIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3aW5zc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d2luc3RyIChXSU5ET1cgKiwgaW50LCBpbnQsIGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG12d3ByaW50dyAoV0lORE9XKixpbnQsaW50LCBjb25zdCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSg0LDUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3c2NhbncgKFdJTkRPVyAqLGludCxpbnQsIE5DVVJTRVNfQ09OU1QgY2hhciAqLC4uLikJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1NDQU5GTElLRSg0LDUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbXZ3dmxpbmUgKFdJTkRPVyAqLGludCwgaW50LCBjaHR5cGUsIGludCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbmFwbXMgKGludCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKSBuZXdwYWQgKGludCxpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFNDUkVFTiAqKSBuZXd0ZXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKixGSUxFICosRklMRSAqKTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgbmV3d2luIChpbnQsaW50LGludCxpbnQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBubCAodm9pZCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm9jYnJlYWsgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgbm9kZWxheSAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vZWNobyAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBub25sICh2b2lkKTsJCQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgbm9xaWZsdXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vcmF3ICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG5vdGltZW91dCAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG92ZXJsYXkgKGNvbnN0IFdJTkRPVyosV0lORE9XICopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIG92ZXJ3cml0ZSAoY29uc3QgV0lORE9XKixXSU5ET1cgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcGFpcl9jb250ZW50IChzaG9ydCxzaG9ydCosc2hvcnQqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBQQUlSX05VTUJFUiAoaW50KTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBwZWNob2NoYXIgKFdJTkRPVyAqLCBjb25zdCBjaHR5cGUpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHBub3V0cmVmcmVzaCAoV0lORE9XKixpbnQsaW50LGludCxpbnQsaW50LGludCk7LyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHByZWZyZXNoIChXSU5ET1cgKixpbnQsaW50LGludCxpbnQsaW50LGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBwcmludHcgKGNvbnN0IGNoYXIgKiwuLi4pCQkJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1BSSU5URkxJS0UoMSwyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHB1dHdpbiAoV0lORE9XICosIEZJTEUgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBxaWZsdXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJhdyAodm9pZCk7CQkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVkcmF3d2luIChXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZWZyZXNoICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByZXNldHR5ICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2V0X3Byb2dfbW9kZSAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2V0X3NoZWxsX21vZGUgKHZvaWQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSByaXBvZmZsaW5lIChpbnQsIGludCAoKikoV0lORE9XICosIGludCkpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2F2ZXR0eSAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY2FudyAoTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkJLyogaW1wbGVtZW50ZWQgKi8KKwkJR0NDX1NDQU5GTElLRSgxLDIpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2NyX2R1bXAgKGNvbnN0IGNoYXIgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcl9pbml0IChjb25zdCBjaGFyICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JsIChpbnQpOwkJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JvbGwgKFdJTkRPVyAqKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3JvbGxvayAoV0lORE9XICosYm9vbCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNjcl9yZXN0b3JlIChjb25zdCBjaGFyICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzY3Jfc2V0IChjb25zdCBjaGFyICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzZXRzY3JyZWcgKGludCxpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChTQ1JFRU4gKikgc2V0X3Rlcm0gKFNDUkVFTiAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX2F0dHJvZmYgKGNvbnN0IGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyX29mZiAoY29uc3QgYXR0cl90LCB2b2lkICopOwkJLyogZ2VuZXJhdGVkOldJREVDICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cm9uIChjb25zdCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cl9vbiAoYXR0cl90LHZvaWQqKTsJCQkvKiBnZW5lcmF0ZWQ6V0lERUMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19hdHRyc2V0IChjb25zdCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYXR0cl90KSBzbGtfYXR0ciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfYXR0cl9zZXQgKGNvbnN0IGF0dHJfdCxzaG9ydCx2b2lkKik7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfY2xlYXIgKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc2xrX2NvbG9yIChzaG9ydCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfaW5pdCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHNsa19sYWJlbCAoaW50KTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19ub3V0cmVmcmVzaCAodm9pZCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19yZWZyZXNoICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19yZXN0b3JlICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHNsa19zZXQgKGludCxjb25zdCBjaGFyICosaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzbGtfdG91Y2ggKHZvaWQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgc3RhbmRvdXQgKHZvaWQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHN0YW5kZW5kICh2b2lkKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzdGFydF9jb2xvciAodm9pZCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIHN1YnBhZCAoV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopIHN1YndpbiAoV0lORE9XICosIGludCwgaW50LCBpbnQsIGludCk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzeW5jb2sgKFdJTkRPVyAqLCBib29sKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkgdGVybWF0dHJzICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRlcm1uYW1lICh2b2lkKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB0aW1lb3V0IChpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRvdWNobGluZSAoV0lORE9XICosIGludCwgaW50KTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdG91Y2h3aW4gKFdJTkRPVyAqKTsJCQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0eXBlYWhlYWQgKGludCk7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB1bmdldGNoIChpbnQpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdW50b3VjaHdpbiAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHVzZV9lbnYgKGJvb2wpOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdmlkYXR0ciAoY2h0eXBlKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZpZHB1dHMgKGNodHlwZSwgaW50ICgqKShpbnQpKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB2bGluZSAoY2h0eXBlLCBpbnQpOwkJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3cHJpbnR3IChXSU5ET1cgKiwgY29uc3QgY2hhciAqLHZhX2xpc3QpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdndfcHJpbnR3IChXSU5ET1cgKiwgY29uc3QgY2hhciAqLHZhX2xpc3QpOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3c2NhbncgKFdJTkRPVyAqLCBOQ1VSU0VTX0NPTlNUIGNoYXIgKix2YV9saXN0KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHZ3X3NjYW53IChXSU5ET1cgKiwgTkNVUlNFU19DT05TVCBjaGFyICosdmFfbGlzdCk7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2FkZGNoIChXSU5ET1cgKiwgY29uc3QgY2h0eXBlKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YWRkY2huc3RyIChXSU5ET1cgKixjb25zdCBjaHR5cGUgKixpbnQpOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2FkZGNoc3RyIChXSU5ET1cgKixjb25zdCBjaHR5cGUgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhZGRuc3RyIChXSU5ET1cgKixjb25zdCBjaGFyICosaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhZGRzdHIgKFdJTkRPVyAqLGNvbnN0IGNoYXIgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdhdHRyb24gKFdJTkRPVyAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJvZmYgKFdJTkRPVyAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJzZXQgKFdJTkRPVyAqLCBpbnQpOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfZ2V0IChXSU5ET1cgKiwgYXR0cl90ICosIHNob3J0ICosIHZvaWQgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfb24gKFdJTkRPVyAqLCBhdHRyX3QsIHZvaWQgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfb2ZmIChXSU5ET1cgKiwgYXR0cl90LCB2b2lkICopOwkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2F0dHJfc2V0IChXSU5ET1cgKiwgYXR0cl90LCBzaG9ydCwgdm9pZCAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3YmtnZCAoV0lORE9XICosIGNodHlwZSk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3YmtnZHNldCAoV0lORE9XICosY2h0eXBlKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2JvcmRlciAoV0lORE9XICosY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSxjaHR5cGUsY2h0eXBlLGNodHlwZSk7CS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Y2hnYXQgKFdJTkRPVyAqLCBpbnQsIGF0dHJfdCwgc2hvcnQsIGNvbnN0IHZvaWQgKik7LyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdjbGVhciAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2NscnRvYm90IChXSU5ET1cgKik7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdjbHJ0b2VvbCAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3Y29sb3Jfc2V0IChXSU5ET1cqLHNob3J0LHZvaWQqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgd2N1cnN5bmN1cCAoV0lORE9XICopOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3ZGVsY2ggKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdkZWxldGVsbiAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2VjaG9jaGFyIChXSU5ET1cgKiwgY29uc3QgY2h0eXBlKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3ZXJhc2UgKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRjaCAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2dldG5zdHIgKFdJTkRPVyAqLGNoYXIgKixpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRzdHIgKFdJTkRPVyAqLCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2hsaW5lIChXSU5ET1cgKiwgY2h0eXBlLCBpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaHR5cGUpIHdpbmNoIChXSU5ET1cgKik7CQkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5jaG5zdHIgKFdJTkRPVyAqLCBjaHR5cGUgKiwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5jaHN0ciAoV0lORE9XICosIGNodHlwZSAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2lubnN0ciAoV0lORE9XICosIGNoYXIgKiwgaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zY2ggKFdJTkRPVyAqLCBjaHR5cGUpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zZGVsbG4gKFdJTkRPVyAqLGludCk7CQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdpbnNlcnRsbiAoV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd2luc25zdHIgKFdJTkRPVyAqLCBjb25zdCBjaGFyICosaW50KTsJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdpbnNzdHIgKFdJTkRPVyAqLCBjb25zdCBjaGFyICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3aW5zdHIgKFdJTkRPVyAqLCBjaGFyICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd21vdmUgKFdJTkRPVyAqLGludCxpbnQpOwkJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3bm91dHJlZnJlc2ggKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3ByaW50dyAoV0lORE9XICosIGNvbnN0IGNoYXIgKiwuLi4pCQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfUFJJTlRGTElLRSgyLDMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3JlZHJhd2xuIChXSU5ET1cgKixpbnQsaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3cmVmcmVzaCAoV0lORE9XICopOwkJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3NjYW53IChXSU5ET1cgKiwgTkNVUlNFU19DT05TVCBjaGFyICosLi4uKQkvKiBpbXBsZW1lbnRlZCAqLworCQlHQ0NfU0NBTkZMSUtFKDIsMyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3c2NybCAoV0lORE9XICosaW50KTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3NldHNjcnJlZyAoV0lORE9XICosaW50LGludCk7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3N0YW5kb3V0IChXSU5ET1cgKik7CQkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3c3RhbmRlbmQgKFdJTkRPVyAqKTsJCQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3c3luY2Rvd24gKFdJTkRPVyAqKTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIHdzeW5jdXAgKFdJTkRPVyAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB3dGltZW91dCAoV0lORE9XICosaW50KTsJCQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3RvdWNobG4gKFdJTkRPVyAqLGludCxpbnQsaW50KTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB3dmxpbmUgKFdJTkRPVyAqLGNodHlwZSxpbnQpOwkJLyogaW1wbGVtZW50ZWQgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBhbHNvIGRlY2xhcmVkIGluIDx0ZXJtLmg+OgorICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0aWdldGZsYWcgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsJCS8qIGltcGxlbWVudGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0aWdldG51bSAoTkNVUlNFU19DT05TVCBjaGFyICopOwkJLyogaW1wbGVtZW50ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRpZ2V0c3RyIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CQkvKiBpbXBsZW1lbnRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcHV0cCAoY29uc3QgY2hhciAqKTsJCQkJLyogaW1wbGVtZW50ZWQgKi8KKworI2lmIE5DVVJTRVNfVFBBUk1fVkFSQVJHUworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZWxzZQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLCBsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyk7CS8qIHNwZWNpYWwgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRwYXJtX3ZhcmFyZ3MgKE5DVVJTRVNfQ09OU1QgY2hhciAqLCAuLi4pOwkvKiBzcGVjaWFsICovCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGluIFgvT3BlbiwgYnV0IHdlIHVzZSB0aGVtIGluIG1hY3JvIGRlZmluaXRpb25zOgorICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBnZXRhdHRycyAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0Y3VyeCAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0Y3VyeSAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0YmVneCAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0YmVneSAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0bWF4eCAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0bWF4eSAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0cGFyeCAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0cGFyeSAoY29uc3QgV0lORE9XICopOwkJCS8qIGdlbmVyYXRlZCAqLworCisvKgorICogdmlkX2F0dHIoKSB3YXMgaW1wbGVtZW50ZWQgb3JpZ2luYWxseSBiYXNlZCBvbiBhIGRyYWZ0IG9mIFgvT3BlbiBjdXJzZXMuCisgKi8KKyNpZm5kZWYgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAorI2RlZmluZSB2aWRfYXR0cihhLHBhaXIsb3B0cykgdmlkYXR0cihhKQorI2VuZGlmCisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGV4dGVuc2lvbnMgLSBub3QgaW4gWC9PcGVuIEN1cnNlcy4KKyAqLworI3VuZGVmICBOQ1VSU0VTX0VYVF9GVU5DUworI2lmIDEKKyN1bmRlZiAgTkNVUlNFU19FWFRfRlVOQ1MKKyNkZWZpbmUgTkNVUlNFU19FWFRfRlVOQ1MgMjAwNzExMjQKK3R5cGVkZWYgaW50ICgqTkNVUlNFU19DQUxMQkFDSykoV0lORE9XICosIHZvaWQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfdGVybV9yZXNpemVkIChpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBrZXlib3VuZCAoaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikgY3Vyc2VzX3ZlcnNpb24gKHZvaWQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgYXNzdW1lX2RlZmF1bHRfY29sb3JzIChpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBkZWZpbmVfa2V5IChjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBrZXlfZGVmaW5lZCAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGtleW9rIChpbnQsIGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcmVzaXplX3Rlcm0gKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc2l6ZXRlcm0gKGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVzZV9kZWZhdWx0X2NvbG9ycyAodm9pZCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB1c2VfZXh0ZW5kZWRfbmFtZXMgKGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdXNlX2xlZ2FjeV9jb2RpbmcgKGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB1c2Vfc2NyZWVuIChTQ1JFRU4gKiwgTkNVUlNFU19DQUxMQkFDSywgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVzZV93aW5kb3cgKFdJTkRPVyAqLCBOQ1VSU0VTX0NBTExCQUNLLCB2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgd3Jlc2l6ZSAoV0lORE9XICosIGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBub2ZpbHRlcih2b2lkKTsKKworLyoKKyAqIFRoZXNlIGV4dGVuc2lvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBXSU5ET1cgZXZlbgorICogd2hlbiBOQ1VSU0VTX09QQVFVRSBpcyBzZXQ6CisgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikgd2dldHBhcmVudCAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19jbGVhcmVkIChjb25zdCBXSU5ET1cgKik7CS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX2lkY29rIChjb25zdCBXSU5ET1cgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19pZGxvayAoY29uc3QgV0lORE9XICopOwkJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfaW1tZWRvayAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19rZXlwYWQgKGNvbnN0IFdJTkRPVyAqKTsJCS8qIGdlbmVyYXRlZCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIGlzX2xlYXZlb2sgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfbm9kZWxheSAoY29uc3QgV0lORE9XICopOwkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBpc19ub3RpbWVvdXQgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfc2Nyb2xsb2sgKGNvbnN0IFdJTkRPVyAqKTsJLyogZ2VuZXJhdGVkICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgaXNfc3luY29rIChjb25zdCBXSU5ET1cgKik7CQkvKiBnZW5lcmF0ZWQgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHdnZXRzY3JyZWcgKGNvbnN0IFdJTkRPVyAqLCBpbnQgKiwgaW50ICopOyAvKiBnZW5lcmF0ZWQgKi8KKworI2Vsc2UKKyNkZWZpbmUgY3Vyc2VzX3ZlcnNpb24oKSBOQ1VSU0VTX1ZFUlNJT04KKyNlbmRpZgorCisvKiBhdHRyaWJ1dGVzICovCisKKyNkZWZpbmUgTkNVUlNFU19BVFRSX1NISUZUICAgICAgIDgKKyNkZWZpbmUgTkNVUlNFU19CSVRTKG1hc2ssc2hpZnQpICgobWFzaykgPDwgKChzaGlmdCkgKyBOQ1VSU0VTX0FUVFJfU0hJRlQpKQorCisjZGVmaW5lIEFfTk9STUFMCSgxVUwgLSAxVUwpCisjZGVmaW5lIEFfQVRUUklCVVRFUwlOQ1VSU0VTX0JJVFMofigxVUwgLSAxVUwpLDApCisjZGVmaW5lIEFfQ0hBUlRFWFQJKE5DVVJTRVNfQklUUygxVUwsMCkgLSAxVUwpCisjZGVmaW5lIEFfQ09MT1IJCU5DVVJTRVNfQklUUygoKDFVTCkgPDwgOCkgLSAxVUwsMCkKKyNkZWZpbmUgQV9TVEFORE9VVAlOQ1VSU0VTX0JJVFMoMVVMLDgpCisjZGVmaW5lIEFfVU5ERVJMSU5FCU5DVVJTRVNfQklUUygxVUwsOSkKKyNkZWZpbmUgQV9SRVZFUlNFCU5DVVJTRVNfQklUUygxVUwsMTApCisjZGVmaW5lIEFfQkxJTksJCU5DVVJTRVNfQklUUygxVUwsMTEpCisjZGVmaW5lIEFfRElNCQlOQ1VSU0VTX0JJVFMoMVVMLDEyKQorI2RlZmluZSBBX0JPTEQJCU5DVVJTRVNfQklUUygxVUwsMTMpCisjZGVmaW5lIEFfQUxUQ0hBUlNFVAlOQ1VSU0VTX0JJVFMoMVVMLDE0KQorI2RlZmluZSBBX0lOVklTCQlOQ1VSU0VTX0JJVFMoMVVMLDE1KQorI2RlZmluZSBBX1BST1RFQ1QJTkNVUlNFU19CSVRTKDFVTCwxNikKKyNkZWZpbmUgQV9IT1JJWk9OVEFMCU5DVVJTRVNfQklUUygxVUwsMTcpCisjZGVmaW5lIEFfTEVGVAkJTkNVUlNFU19CSVRTKDFVTCwxOCkKKyNkZWZpbmUgQV9MT1cJCU5DVVJTRVNfQklUUygxVUwsMTkpCisjZGVmaW5lIEFfUklHSFQJCU5DVVJTRVNfQklUUygxVUwsMjApCisjZGVmaW5lIEFfVE9QCQlOQ1VSU0VTX0JJVFMoMVVMLDIxKQorI2RlZmluZSBBX1ZFUlRJQ0FMCU5DVVJTRVNfQklUUygxVUwsMjIpCisKKy8qCisgKiBNb3N0IG9mIHRoZSBwc2V1ZG8gZnVuY3Rpb25zIGFyZSBtYWNyb3MgdGhhdCBlaXRoZXIgcHJvdmlkZSBjb21wYXRpYmlsaXR5CisgKiB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGN1cnNlcywgb3IgcHJvdmlkZSBpbmxpbmUgZnVuY3Rpb25hbGl0eSB0byBpbXByb3ZlCisgKiBwZXJmb3JtYW5jZS4KKyAqLworCisvKgorICogVGhlc2UgcHNldWRvIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGltcGxlbWVudGVkIGFzIG1hY3JvczoKKyAqLworCisjZGVmaW5lIGdldHl4KHdpbix5LHgpICAgCSh5ID0gZ2V0Y3VyeSh3aW4pLCB4ID0gZ2V0Y3VyeCh3aW4pKQorI2RlZmluZSBnZXRiZWd5eCh3aW4seSx4KQkoeSA9IGdldGJlZ3kod2luKSwgeCA9IGdldGJlZ3god2luKSkKKyNkZWZpbmUgZ2V0bWF4eXgod2luLHkseCkJKHkgPSBnZXRtYXh5KHdpbiksIHggPSBnZXRtYXh4KHdpbikpCisjZGVmaW5lIGdldHBhcnl4KHdpbix5LHgpCSh5ID0gZ2V0cGFyeSh3aW4pLCB4ID0gZ2V0cGFyeCh3aW4pKQorCisjZGVmaW5lIGdldHN5eCh5LHgpIGRvIHsgaWYgKGlzX2xlYXZlb2sobmV3c2NyKSkgXAorCQkJICAgICh5KSA9ICh4KSA9IC0xOyBcCisJCQkgZWxzZSBcCisJCQkgICAgIGdldHl4KG5ld3NjciwoeSksICh4KSk7IFwKKwkJICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBzZXRzeXgoeSx4KSBkbyB7IGlmICgoeSkgPT0gLTEgJiYgKHgpID09IC0xKSBcCisJCQkgICAgbGVhdmVvayhuZXdzY3IsIFRSVUUpOyBcCisJCQkgZWxzZSB7IFwKKwkJCSAgICBsZWF2ZW9rKG5ld3NjciwgRkFMU0UpOyBcCisJCQkgICAgd21vdmUobmV3c2NyLCAoeSksICh4KSk7IFwKKwkJCX0gXAorCQkgICAgfSB3aGlsZSgwKQorCisjaWZuZGVmIE5DVVJTRVNfTk9NQUNST1MKKworLyoKKyAqIFRoZXNlIG1pc2NlbGxhbmVvdXMgcHNldWRvIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHk6CisgKi8KKworI2RlZmluZSB3Z2V0c3RyKHcsIHMpCQl3Z2V0bnN0cih3LCBzLCAtMSkKKyNkZWZpbmUgZ2V0bnN0cihzLCBuKQkJd2dldG5zdHIoc3Rkc2NyLCBzLCBuKQorCisjZGVmaW5lIHNldHRlcm0odGVybSkJCXNldHVwdGVybSh0ZXJtLCAxLCAoaW50ICopMCkKKworI2RlZmluZSBmaXh0ZXJtKCkJCXJlc2V0X3Byb2dfbW9kZSgpCisjZGVmaW5lIHJlc2V0dGVybSgpCQlyZXNldF9zaGVsbF9tb2RlKCkKKyNkZWZpbmUgc2F2ZXRlcm0oKQkJZGVmX3Byb2dfbW9kZSgpCisjZGVmaW5lIGNybW9kZSgpCQljYnJlYWsoKQorI2RlZmluZSBub2NybW9kZSgpCQlub2NicmVhaygpCisjZGVmaW5lIGdldHRtb2RlKCkKKworLyogSXQgc2VlbXMgb2xkZXIgU1lTViBjdXJzZXMgdmVyc2lvbnMgZGVmaW5lIHRoZXNlICovCisjaWYgIU5DVVJTRVNfT1BBUVVFCisjZGVmaW5lIGdldGF0dHJzKHdpbikJCSgod2luKSA/ICh3aW4pLT5fYXR0cnMgOiBBX05PUk1BTCkKKyNkZWZpbmUgZ2V0Y3VyeCh3aW4pCQkoKHdpbikgPyAod2luKS0+X2N1cnggOiBFUlIpCisjZGVmaW5lIGdldGN1cnkod2luKQkJKCh3aW4pID8gKHdpbiktPl9jdXJ5IDogRVJSKQorI2RlZmluZSBnZXRiZWd4KHdpbikJCSgod2luKSA/ICh3aW4pLT5fYmVneCA6IEVSUikKKyNkZWZpbmUgZ2V0YmVneSh3aW4pCQkoKHdpbikgPyAod2luKS0+X2JlZ3kgOiBFUlIpCisjZGVmaW5lIGdldG1heHgod2luKQkJKCh3aW4pID8gKCh3aW4pLT5fbWF4eCArIDEpIDogRVJSKQorI2RlZmluZSBnZXRtYXh5KHdpbikJCSgod2luKSA/ICgod2luKS0+X21heHkgKyAxKSA6IEVSUikKKyNkZWZpbmUgZ2V0cGFyeCh3aW4pCQkoKHdpbikgPyAod2luKS0+X3BhcnggOiBFUlIpCisjZGVmaW5lIGdldHBhcnkod2luKQkJKCh3aW4pID8gKHdpbiktPl9wYXJ5IDogRVJSKQorI2VuZGlmIC8qIE5DVVJTRVNfT1BBUVVFICovCisKKyNkZWZpbmUgd3N0YW5kb3V0KHdpbikgICAgICAJKHdhdHRyc2V0KHdpbixBX1NUQU5ET1VUKSkKKyNkZWZpbmUgd3N0YW5kZW5kKHdpbikgICAgICAJKHdhdHRyc2V0KHdpbixBX05PUk1BTCkpCisKKyNkZWZpbmUgd2F0dHJvbih3aW4sYXQpCQl3YXR0cl9vbih3aW4sIE5DVVJTRVNfQ0FTVChhdHRyX3QsIGF0KSwgTlVMTCkKKyNkZWZpbmUgd2F0dHJvZmYod2luLGF0KQl3YXR0cl9vZmYod2luLCBOQ1VSU0VTX0NBU1QoYXR0cl90LCBhdCksIE5VTEwpCisKKyNpZiAhTkNVUlNFU19PUEFRVUUKKyNpZiBkZWZpbmVkKF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQpICYmIDAKKyNkZWZpbmUgd2F0dHJzZXQod2luLGF0KQkoKHdpbiktPl9jb2xvciA9IFBBSVJfTlVNQkVSKGF0KSwgXAorCQkJCSAod2luKS0+X2F0dHJzID0gKGF0KSkKKyNlbHNlCisjZGVmaW5lIHdhdHRyc2V0KHdpbixhdCkJKCh3aW4pLT5fYXR0cnMgPSAoYXQpKQorI2VuZGlmCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworI2RlZmluZSBzY3JvbGwod2luKQkJd3Njcmwod2luLDEpCisKKyNkZWZpbmUgdG91Y2h3aW4od2luKQkJd3RvdWNobG4oKHdpbiksIDAsIGdldG1heHkod2luKSwgMSkKKyNkZWZpbmUgdG91Y2hsaW5lKHdpbiwgcywgYykJd3RvdWNobG4oKHdpbiksIHMsIGMsIDEpCisjZGVmaW5lIHVudG91Y2h3aW4od2luKQkJd3RvdWNobG4oKHdpbiksIDAsIGdldG1heHkod2luKSwgMCkKKworI2RlZmluZSBib3god2luLCB2LCBoKQkJd2JvcmRlcih3aW4sIHYsIHYsIGgsIGgsIDAsIDAsIDAsIDApCisjZGVmaW5lIGJvcmRlcihscywgcnMsIHRzLCBicywgdGwsIHRyLCBibCwgYnIpCXdib3JkZXIoc3Rkc2NyLCBscywgcnMsIHRzLCBicywgdGwsIHRyLCBibCwgYnIpCisjZGVmaW5lIGhsaW5lKGNoLCBuKQkJd2hsaW5lKHN0ZHNjciwgY2gsIG4pCisjZGVmaW5lIHZsaW5lKGNoLCBuKQkJd3ZsaW5lKHN0ZHNjciwgY2gsIG4pCisKKyNkZWZpbmUgd2luc3RyKHcsIHMpCQl3aW5uc3RyKHcsIHMsIC0xKQorI2RlZmluZSB3aW5jaHN0cih3LCBzKQkJd2luY2huc3RyKHcsIHMsIC0xKQorI2RlZmluZSB3aW5zc3RyKHcsIHMpCQl3aW5zbnN0cih3LCBzLCAtMSkKKworI2lmICFOQ1VSU0VTX09QQVFVRQorI2RlZmluZSByZWRyYXd3aW4od2luKQkJd3JlZHJhd2xuKHdpbiwgMCwgKHdpbiktPl9tYXh5KzEpCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworI2RlZmluZSB3YWRkc3RyKHdpbixzdHIpCXdhZGRuc3RyKHdpbixzdHIsLTEpCisjZGVmaW5lIHdhZGRjaHN0cih3aW4sc3RyKQl3YWRkY2huc3RyKHdpbixzdHIsLTEpCisKKy8qCisgKiBUaGVzZSBhcHBseSB0byB0aGUgZmlyc3QgMjU2IGNvbG9yIHBhaXJzLgorICovCisjZGVmaW5lIENPTE9SX1BBSVIobikJTkNVUlNFU19CSVRTKG4sIDApCisjZGVmaW5lIFBBSVJfTlVNQkVSKGEpCShOQ1VSU0VTX0NBU1QoaW50LCgoKGEpICYgQV9DT0xPUikgPj4gTkNVUlNFU19BVFRSX1NISUZUKSkpCisKKy8qCisgKiBwc2V1ZG8gZnVuY3Rpb25zIGZvciBzdGFuZGFyZCBzY3JlZW4KKyAqLworCisjZGVmaW5lIGFkZGNoKGNoKQkJd2FkZGNoKHN0ZHNjcixjaCkKKyNkZWZpbmUgYWRkY2huc3RyKHN0cixuKQl3YWRkY2huc3RyKHN0ZHNjcixzdHIsbikKKyNkZWZpbmUgYWRkY2hzdHIoc3RyKQkJd2FkZGNoc3RyKHN0ZHNjcixzdHIpCisjZGVmaW5lIGFkZG5zdHIoc3RyLG4pCQl3YWRkbnN0cihzdGRzY3Isc3RyLG4pCisjZGVmaW5lIGFkZHN0cihzdHIpCQl3YWRkbnN0cihzdGRzY3Isc3RyLC0xKQorI2RlZmluZSBhdHRyb2ZmKGF0KQkJd2F0dHJvZmYoc3Rkc2NyLGF0KQorI2RlZmluZSBhdHRyb24oYXQpCQl3YXR0cm9uKHN0ZHNjcixhdCkKKyNkZWZpbmUgYXR0cnNldChhdCkJCXdhdHRyc2V0KHN0ZHNjcixhdCkKKyNkZWZpbmUgYXR0cl9nZXQoYXAsY3AsbykJd2F0dHJfZ2V0KHN0ZHNjcixhcCxjcCxvKQorI2RlZmluZSBhdHRyX29mZihhLG8pCQl3YXR0cl9vZmYoc3Rkc2NyLGEsbykKKyNkZWZpbmUgYXR0cl9vbihhLG8pCQl3YXR0cl9vbihzdGRzY3IsYSxvKQorI2RlZmluZSBhdHRyX3NldChhLGMsbykJCXdhdHRyX3NldChzdGRzY3IsYSxjLG8pCisjZGVmaW5lIGJrZ2QoY2gpCQl3YmtnZChzdGRzY3IsY2gpCisjZGVmaW5lIGJrZ2RzZXQoY2gpCQl3YmtnZHNldChzdGRzY3IsY2gpCisjZGVmaW5lIGNoZ2F0KG4sYSxjLG8pCQl3Y2hnYXQoc3Rkc2NyLG4sYSxjLG8pCisjZGVmaW5lIGNsZWFyKCkJCQl3Y2xlYXIoc3Rkc2NyKQorI2RlZmluZSBjbHJ0b2JvdCgpCQl3Y2xydG9ib3Qoc3Rkc2NyKQorI2RlZmluZSBjbHJ0b2VvbCgpCQl3Y2xydG9lb2woc3Rkc2NyKQorI2RlZmluZSBjb2xvcl9zZXQoYyxvKQkJd2NvbG9yX3NldChzdGRzY3IsYyxvKQorI2RlZmluZSBkZWxjaCgpCQkJd2RlbGNoKHN0ZHNjcikKKyNkZWZpbmUgZGVsZXRlbG4oKQkJd2luc2RlbGxuKHN0ZHNjciwtMSkKKyNkZWZpbmUgZWNob2NoYXIoYykJCXdlY2hvY2hhcihzdGRzY3IsYykKKyNkZWZpbmUgZXJhc2UoKQkJCXdlcmFzZShzdGRzY3IpCisjZGVmaW5lIGdldGNoKCkJCQl3Z2V0Y2goc3Rkc2NyKQorI2RlZmluZSBnZXRzdHIoc3RyKQkJd2dldHN0cihzdGRzY3Isc3RyKQorI2RlZmluZSBpbmNoKCkJCQl3aW5jaChzdGRzY3IpCisjZGVmaW5lIGluY2huc3RyKHMsbikJCXdpbmNobnN0cihzdGRzY3IscyxuKQorI2RlZmluZSBpbmNoc3RyKHMpCQl3aW5jaHN0cihzdGRzY3IscykKKyNkZWZpbmUgaW5uc3RyKHMsbikJCXdpbm5zdHIoc3Rkc2NyLHMsbikKKyNkZWZpbmUgaW5zY2goYykJCXdpbnNjaChzdGRzY3IsYykKKyNkZWZpbmUgaW5zZGVsbG4obikJCXdpbnNkZWxsbihzdGRzY3IsbikKKyNkZWZpbmUgaW5zZXJ0bG4oKQkJd2luc2RlbGxuKHN0ZHNjciwxKQorI2RlZmluZSBpbnNuc3RyKHMsbikJCXdpbnNuc3RyKHN0ZHNjcixzLG4pCisjZGVmaW5lIGluc3N0cihzKQkJd2luc3N0cihzdGRzY3IscykKKyNkZWZpbmUgaW5zdHIocykJCXdpbnN0cihzdGRzY3IscykKKyNkZWZpbmUgbW92ZSh5LHgpCQl3bW92ZShzdGRzY3IseSx4KQorI2RlZmluZSByZWZyZXNoKCkJCXdyZWZyZXNoKHN0ZHNjcikKKyNkZWZpbmUgc2NybChuKQkJCXdzY3JsKHN0ZHNjcixuKQorI2RlZmluZSBzZXRzY3JyZWcodCxiKQkJd3NldHNjcnJlZyhzdGRzY3IsdCxiKQorI2RlZmluZSBzdGFuZGVuZCgpCQl3c3RhbmRlbmQoc3Rkc2NyKQorI2RlZmluZSBzdGFuZG91dCgpCQl3c3RhbmRvdXQoc3Rkc2NyKQorI2RlZmluZSB0aW1lb3V0KGRlbGF5KQkJd3RpbWVvdXQoc3Rkc2NyLGRlbGF5KQorI2RlZmluZSB3ZGVsZXRlbG4od2luKQkJd2luc2RlbGxuKHdpbiwtMSkKKyNkZWZpbmUgd2luc2VydGxuKHdpbikJCXdpbnNkZWxsbih3aW4sMSkKKworLyoKKyAqIG12IGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgbXZ3YWRkY2god2luLHkseCxjaCkJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3YWRkY2god2luLGNoKSkKKyNkZWZpbmUgbXZ3YWRkY2huc3RyKHdpbix5LHgsc3RyLG4pCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3YWRkY2huc3RyKHdpbixzdHIsbikpCisjZGVmaW5lIG12d2FkZGNoc3RyKHdpbix5LHgsc3RyKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2FkZGNobnN0cih3aW4sc3RyLC0xKSkKKyNkZWZpbmUgbXZ3YWRkbnN0cih3aW4seSx4LHN0cixuKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2FkZG5zdHIod2luLHN0cixuKSkKKyNkZWZpbmUgbXZ3YWRkc3RyKHdpbix5LHgsc3RyKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdhZGRuc3RyKHdpbixzdHIsLTEpKQorI2RlZmluZSBtdndkZWxjaCh3aW4seSx4KQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdkZWxjaCh3aW4pKQorI2RlZmluZSBtdndjaGdhdCh3aW4seSx4LG4sYSxjLG8pCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3Y2hnYXQod2luLG4sYSxjLG8pKQorI2RlZmluZSBtdndnZXRjaCh3aW4seSx4KQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdnZXRjaCh3aW4pKQorI2RlZmluZSBtdndnZXRuc3RyKHdpbix5LHgsc3RyLG4pCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3Z2V0bnN0cih3aW4sc3RyLG4pKQorI2RlZmluZSBtdndnZXRzdHIod2luLHkseCxzdHIpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2dldHN0cih3aW4sc3RyKSkKKyNkZWZpbmUgbXZ3aGxpbmUod2luLHkseCxjLG4pCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2hsaW5lKHdpbixjLG4pKQorI2RlZmluZSBtdndpbmNoKHdpbix5LHgpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gTkNVUlNFU19DQVNUKGNodHlwZSwgRVJSKSA6IHdpbmNoKHdpbikpCisjZGVmaW5lIG12d2luY2huc3RyKHdpbix5LHgscyxuKQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luY2huc3RyKHdpbixzLG4pKQorI2RlZmluZSBtdndpbmNoc3RyKHdpbix5LHgscykJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5jaHN0cih3aW4scykpCisjZGVmaW5lIG12d2lubnN0cih3aW4seSx4LHMsbikJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5uc3RyKHdpbixzLG4pKQorI2RlZmluZSBtdndpbnNjaCh3aW4seSx4LGMpCQkod21vdmUod2luLHkseCkgPT0gRVJSID8gRVJSIDogd2luc2NoKHdpbixjKSkKKyNkZWZpbmUgbXZ3aW5zbnN0cih3aW4seSx4LHMsbikJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5zbnN0cih3aW4scyxuKSkKKyNkZWZpbmUgbXZ3aW5zc3RyKHdpbix5LHgscykJCSh3bW92ZSh3aW4seSx4KSA9PSBFUlIgPyBFUlIgOiB3aW5zc3RyKHdpbixzKSkKKyNkZWZpbmUgbXZ3aW5zdHIod2luLHkseCxzKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHdpbnN0cih3aW4scykpCisjZGVmaW5lIG12d3ZsaW5lKHdpbix5LHgsYyxuKQkJKHdtb3ZlKHdpbix5LHgpID09IEVSUiA/IEVSUiA6IHd2bGluZSh3aW4sYyxuKSkKKworI2RlZmluZSBtdmFkZGNoKHkseCxjaCkJCQltdndhZGRjaChzdGRzY3IseSx4LGNoKQorI2RlZmluZSBtdmFkZGNobnN0cih5LHgsc3RyLG4pCQltdndhZGRjaG5zdHIoc3Rkc2NyLHkseCxzdHIsbikKKyNkZWZpbmUgbXZhZGRjaHN0cih5LHgsc3RyKQkJbXZ3YWRkY2hzdHIoc3Rkc2NyLHkseCxzdHIpCisjZGVmaW5lIG12YWRkbnN0cih5LHgsc3RyLG4pCQltdndhZGRuc3RyKHN0ZHNjcix5LHgsc3RyLG4pCisjZGVmaW5lIG12YWRkc3RyKHkseCxzdHIpCQltdndhZGRzdHIoc3Rkc2NyLHkseCxzdHIpCisjZGVmaW5lIG12Y2hnYXQoeSx4LG4sYSxjLG8pCQltdndjaGdhdChzdGRzY3IseSx4LG4sYSxjLG8pCisjZGVmaW5lIG12ZGVsY2goeSx4KQkJCW12d2RlbGNoKHN0ZHNjcix5LHgpCisjZGVmaW5lIG12Z2V0Y2goeSx4KQkJCW12d2dldGNoKHN0ZHNjcix5LHgpCisjZGVmaW5lIG12Z2V0bnN0cih5LHgsc3RyLG4pCQltdndnZXRuc3RyKHN0ZHNjcix5LHgsc3RyLG4pCisjZGVmaW5lIG12Z2V0c3RyKHkseCxzdHIpCQltdndnZXRzdHIoc3Rkc2NyLHkseCxzdHIpCisjZGVmaW5lIG12aGxpbmUoeSx4LGMsbikJCW12d2hsaW5lKHN0ZHNjcix5LHgsYyxuKQorI2RlZmluZSBtdmluY2goeSx4KQkJCW12d2luY2goc3Rkc2NyLHkseCkKKyNkZWZpbmUgbXZpbmNobnN0cih5LHgscyxuKQkJbXZ3aW5jaG5zdHIoc3Rkc2NyLHkseCxzLG4pCisjZGVmaW5lIG12aW5jaHN0cih5LHgscykJCW12d2luY2hzdHIoc3Rkc2NyLHkseCxzKQorI2RlZmluZSBtdmlubnN0cih5LHgscyxuKQkJbXZ3aW5uc3RyKHN0ZHNjcix5LHgscyxuKQorI2RlZmluZSBtdmluc2NoKHkseCxjKQkJCW12d2luc2NoKHN0ZHNjcix5LHgsYykKKyNkZWZpbmUgbXZpbnNuc3RyKHkseCxzLG4pCQltdndpbnNuc3RyKHN0ZHNjcix5LHgscyxuKQorI2RlZmluZSBtdmluc3N0cih5LHgscykJCQltdndpbnNzdHIoc3Rkc2NyLHkseCxzKQorI2RlZmluZSBtdmluc3RyKHkseCxzKQkJCW12d2luc3RyKHN0ZHNjcix5LHgscykKKyNkZWZpbmUgbXZ2bGluZSh5LHgsYyxuKQkJbXZ3dmxpbmUoc3Rkc2NyLHkseCxjLG4pCisKKy8qCisgKiBTb21lIHdpZGUtY2hhcmFjdGVyIGZ1bmN0aW9ucyBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aG91dCB0aGUgZXh0ZW5zaW9ucy4KKyAqLworI2lmICFOQ1VSU0VTX09QQVFVRQorI2RlZmluZSBnZXRia2dkKHdpbikgICAgICAgICAgICAgICAgICAgICgod2luKS0+X2JrZ2QpCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworI2RlZmluZSBzbGtfYXR0cl9vZmYoYSx2KQkJKCh2KSA/IEVSUiA6IHNsa19hdHRyb2ZmKGEpKQorI2RlZmluZSBzbGtfYXR0cl9vbihhLHYpCQkoKHYpID8gRVJSIDogc2xrX2F0dHJvbihhKSkKKworI2lmICFOQ1VSU0VTX09QQVFVRQorI2lmIGRlZmluZWQoX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCkgJiYgMAorI2RlZmluZSB3YXR0cl9zZXQod2luLGEscCxvcHRzKQkJKCh3aW4pLT5fYXR0cnMgPSAoKGEpICYgfkFfQ09MT1IpLCBcCisJCQkJCSAod2luKS0+X2NvbG9yID0gKHApLCBcCisJCQkJCSBPSykKKyNkZWZpbmUgd2F0dHJfZ2V0KHdpbixhLHAsb3B0cykJCSgodm9pZCkoKGEpICE9IDAgJiYgKCooYSkgPSAod2luKS0+X2F0dHJzKSksIFwKKwkJCQkJICh2b2lkKSgocCkgIT0gMCAmJiAoKihwKSA9ICh3aW4pLT5fY29sb3IpKSwgXAorCQkJCQkgT0spCisjZWxzZQorI2RlZmluZSB3YXR0cl9zZXQod2luLGEscCxvcHRzKQkJKCh3aW4pLT5fYXR0cnMgPSAoKChhKSAmIH5BX0NPTE9SKSB8IENPTE9SX1BBSVIocCkpLCBPSykKKyNkZWZpbmUgd2F0dHJfZ2V0KHdpbixhLHAsb3B0cykJCSgodm9pZCkoKGEpICE9IDAgJiYgKCooYSkgPSAod2luKS0+X2F0dHJzKSksIFwKKwkJCQkJICh2b2lkKSgocCkgIT0gMCAmJiAoKihwKSA9IFBBSVJfTlVNQkVSKCh3aW4pLT5fYXR0cnMpKSksIFwKKwkJCQkJIE9LKQorI2VuZGlmCisjZW5kaWYgLyogTkNVUlNFU19PUEFRVUUgKi8KKworLyoKKyAqIFgvT3BlbiBjdXJzZXMgZGVwcmVjYXRlcyBTVnI0IHZ3cHJpbnR3L3Z3c2NhbncsIHdoaWNoIGFyZSBzdXBwb3NlZCB0byB1c2UKKyAqIHZhcmFyZ3MuaC4gIEl0IGFkZHMgbmV3IGNhbGxzIHZ3X3ByaW50dy92d19zY2Fudywgd2hpY2ggYXJlIHN1cHBvc2VkIHRvCisgKiB1c2UgUE9TSVggc3RkYXJnLmguICBUaGUgbmN1cnNlcyB2ZXJzaW9ucyBvZiB2d3ByaW50dy92d3NjYW53IGFscmVhZHkKKyAqIHVzZSBzdGRhcmcuaCwgc28uLi4KKyAqLworI2RlZmluZSB2d19wcmludHcJCXZ3cHJpbnR3CisjZGVmaW5lIHZ3X3NjYW53CQl2d3NjYW53CisKKy8qCisgKiBFeHBvcnQgZmFsbGJhY2sgZnVuY3Rpb24gZm9yIHVzZSBpbiBDKysgYmluZGluZy4KKyAqLworI2lmICExCisjZGVmaW5lIHZzc2NhbmYoYSxiLGMpIF9uY192c3NjYW5mKGEsYixjKQorTkNVUlNFU19FWFBPUlQoaW50KSB2c3NjYW5mKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSBleHRlbnNpb25zIC0gbm90IGluIFgvT3BlbiBDdXJzZXMuCisgKi8KKyNpZiAxCisjaWYgIU5DVVJTRVNfT1BBUVVFCisjZGVmaW5lIGlzX2NsZWFyZWQod2luKQkJKCh3aW4pLT5fY2xlYXIpCisjZGVmaW5lIGlzX2lkY29rKHdpbikJCSgod2luKS0+X2lkY29rKQorI2RlZmluZSBpc19pZGxvayh3aW4pCQkoKHdpbiktPl9pZGxvaykKKyNkZWZpbmUgaXNfaW1tZWRvayh3aW4pCQkoKHdpbiktPl9pbW1lZCkKKyNkZWZpbmUgaXNfa2V5cGFkKHdpbikJCSgod2luKS0+X3VzZV9rZXlwYWQpCisjZGVmaW5lIGlzX2xlYXZlb2sod2luKQkJKCh3aW4pLT5fbGVhdmVvaykKKyNkZWZpbmUgaXNfbm9kZWxheSh3aW4pCQkoKHdpbiktPl9kZWxheSA9PSAwKQorI2RlZmluZSBpc19ub3RpbWVvdXQod2luKQkoKHdpbiktPl9ub3RpbWVvdXQpCisjZGVmaW5lIGlzX3Njcm9sbG9rKHdpbikJKCh3aW4pLT5fc2Nyb2xsKQorI2RlZmluZSBpc19zeW5jb2sod2luKQkJKCh3aW4pLT5fc3luYykKKyNkZWZpbmUgd2dldHBhcmVudCh3aW4pCQkoKHdpbikgPyAod2luKS0+X3BhcmVudCA6IDApCisjZGVmaW5lIHdnZXRzY3JyZWcod2luLHQsYikJKCh3aW4pID8gKCoodCkgPSAod2luKS0+X3JlZ3RvcCwgKihiKSA9ICh3aW4pLT5fcmVnYm90dG9tLCBPSykgOiBFUlIpCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogTkNVUlNFU19OT01BQ1JPUyAqLworCisvKgorICogUHVibGljIHZhcmlhYmxlcy4KKyAqCisgKiBOb3RlczoKKyAqCWEuIEVTQ0RFTEFZIHdhcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSB1bmRlciBBSVggY3Vyc2VzLgorICoJICAgSXQgZ2l2ZXMgdGhlIEVTQyBleHBpcmUgdGltZSBpbiBtaWxsaXNlY29uZHMuCisgKgliLiB0dHl0eXBlIGlzIG5lZWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICovCisjaWYgMAorCitOQ1VSU0VTX1dSQVBQRURfVkFSKFdJTkRPVyAqLCBjdXJzY3IpOworTkNVUlNFU19XUkFQUEVEX1ZBUihXSU5ET1cgKiwgbmV3c2NyKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoV0lORE9XICosIHN0ZHNjcik7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGNoYXIgKiwgdHR5dHlwZSk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGludCwgQ09MT1JTKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoaW50LCBDT0xPUl9QQUlSUyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGludCwgQ09MUyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKGludCwgRVNDREVMQVkpOworTkNVUlNFU19XUkFQUEVEX1ZBUihpbnQsIExJTkVTKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoaW50LCBUQUJTSVpFKTsKKworI2RlZmluZSBjdXJzY3IgICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoY3Vyc2NyKCkpCisjZGVmaW5lIG5ld3NjciAgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihuZXdzY3IoKSkKKyNkZWZpbmUgc3Rkc2NyICAgICAgTkNVUlNFU19QVUJMSUNfVkFSKHN0ZHNjcigpKQorI2RlZmluZSB0dHl0eXBlICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIodHR5dHlwZSgpKQorI2RlZmluZSBDT0xPUlMgICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoQ09MT1JTKCkpCisjZGVmaW5lIENPTE9SX1BBSVJTIE5DVVJTRVNfUFVCTElDX1ZBUihDT0xPUl9QQUlSUygpKQorI2RlZmluZSBDT0xTICAgICAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoQ09MUygpKQorI2RlZmluZSBFU0NERUxBWSAgICBOQ1VSU0VTX1BVQkxJQ19WQVIoRVNDREVMQVkoKSkKKyNkZWZpbmUgTElORVMgICAgICAgTkNVUlNFU19QVUJMSUNfVkFSKExJTkVTKCkpCisjZGVmaW5lIFRBQlNJWkUgICAgIE5DVVJTRVNfUFVCTElDX1ZBUihUQUJTSVpFKCkpCisKKyNlbHNlCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoV0lORE9XICopIGN1cnNjcjsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoV0lORE9XICopIG5ld3NjcjsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoV0lORE9XICopIHN0ZHNjcjsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY2hhcikgdHR5dHlwZVtdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIENPTE9SUzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBDT0xPUl9QQUlSUzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBDT0xTOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIEVTQ0RFTEFZOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIExJTkVTOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIFRBQlNJWkU7CisKKyNlbmRpZgorCisvKgorICogUHNldWRvLWNoYXJhY3RlciB0b2tlbnMgb3V0c2lkZSBBU0NJSSByYW5nZS4gIFRoZSBjdXJzZXMgd2dldGNoKCkgZnVuY3Rpb24KKyAqIHdpbGwgcmV0dXJuIGFueSBnaXZlbiBvbmUgb2YgdGhlc2Ugb25seSBpZiB0aGUgY29ycmVzcG9uZGluZyBrLSBjYXBhYmlsaXR5CisgKiBpcyBkZWZpbmVkIGluIHlvdXIgdGVybWluYWwncyB0ZXJtaW5mbyBlbnRyeS4KKyAqCisgKiBTb21lIGtleXMgKEtFWV9BMSwgZXRjKSBhcmUgYXJyYW5nZWQgbGlrZSB0aGlzOgorICoJYTEgICAgIHVwICAgIGEzCisgKglsZWZ0ICAgYjIgICAgcmlnaHQKKyAqCWMxICAgICBkb3duICBjMworICoKKyAqIEEgZmV3IGtleSBjb2RlcyBkbyBub3QgZGVwZW5kIHVwb24gdGhlIHRlcm1pbmZvIGVudHJ5LgorICovCisjZGVmaW5lIEtFWV9DT0RFX1lFUwkwNDAwCQkvKiBBIHdjaGFyX3QgY29udGFpbnMgYSBrZXkgY29kZSAqLworI2RlZmluZSBLRVlfTUlOCQkwNDAxCQkvKiBNaW5pbXVtIGN1cnNlcyBrZXkgKi8KKyNkZWZpbmUgS0VZX0JSRUFLCTA0MDEJCS8qIEJyZWFrIGtleSAodW5yZWxpYWJsZSkgKi8KKyNkZWZpbmUgS0VZX1NSRVNFVAkwNTMwCQkvKiBTb2Z0IChwYXJ0aWFsKSByZXNldCAodW5yZWxpYWJsZSkgKi8KKyNkZWZpbmUgS0VZX1JFU0VUCTA1MzEJCS8qIFJlc2V0IG9yIGhhcmQgcmVzZXQgKHVucmVsaWFibGUpICovCisvKgorICogVGhlc2UgZGVmaW5pdGlvbnMgd2VyZSBnZW5lcmF0ZWQgYnkgL2J1aWxkL2J1aWxkZC9uY3Vyc2VzLTUuNisyMDA3MTEyNC9pbmNsdWRlL01La2V5X2RlZnMuc2ggL2J1aWxkL2J1aWxkZC9uY3Vyc2VzLTUuNisyMDA3MTEyNC9pbmNsdWRlL0NhcHMKKyAqLworI2RlZmluZSBLRVlfRE9XTgkwNDAyCQkvKiBkb3duLWFycm93IGtleSAqLworI2RlZmluZSBLRVlfVVAJCTA0MDMJCS8qIHVwLWFycm93IGtleSAqLworI2RlZmluZSBLRVlfTEVGVAkwNDA0CQkvKiBsZWZ0LWFycm93IGtleSAqLworI2RlZmluZSBLRVlfUklHSFQJMDQwNQkJLyogcmlnaHQtYXJyb3cga2V5ICovCisjZGVmaW5lIEtFWV9IT01FCTA0MDYJCS8qIGhvbWUga2V5ICovCisjZGVmaW5lIEtFWV9CQUNLU1BBQ0UJMDQwNwkJLyogYmFja3NwYWNlIGtleSAqLworI2RlZmluZSBLRVlfRjAJCTA0MTAJCS8qIEZ1bmN0aW9uIGtleXMuICBTcGFjZSBmb3IgNjQgKi8KKyNkZWZpbmUgS0VZX0YobikJKEtFWV9GMCsobikpCS8qIFZhbHVlIG9mIGZ1bmN0aW9uIGtleSBuICovCisjZGVmaW5lIEtFWV9ETAkJMDUxMAkJLyogZGVsZXRlLWxpbmUga2V5ICovCisjZGVmaW5lIEtFWV9JTAkJMDUxMQkJLyogaW5zZXJ0LWxpbmUga2V5ICovCisjZGVmaW5lIEtFWV9EQwkJMDUxMgkJLyogZGVsZXRlLWNoYXJhY3RlciBrZXkgKi8KKyNkZWZpbmUgS0VZX0lDCQkwNTEzCQkvKiBpbnNlcnQtY2hhcmFjdGVyIGtleSAqLworI2RlZmluZSBLRVlfRUlDCQkwNTE0CQkvKiBzZW50IGJ5IHJtaXIgb3Igc21pciBpbiBpbnNlcnQgbW9kZSAqLworI2RlZmluZSBLRVlfQ0xFQVIJMDUxNQkJLyogY2xlYXItc2NyZWVuIG9yIGVyYXNlIGtleSAqLworI2RlZmluZSBLRVlfRU9TCQkwNTE2CQkvKiBjbGVhci10by1lbmQtb2Ytc2NyZWVuIGtleSAqLworI2RlZmluZSBLRVlfRU9MCQkwNTE3CQkvKiBjbGVhci10by1lbmQtb2YtbGluZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NGCQkwNTIwCQkvKiBzY3JvbGwtZm9yd2FyZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NSCQkwNTIxCQkvKiBzY3JvbGwtYmFja3dhcmQga2V5ICovCisjZGVmaW5lIEtFWV9OUEFHRQkwNTIyCQkvKiBuZXh0LXBhZ2Uga2V5ICovCisjZGVmaW5lIEtFWV9QUEFHRQkwNTIzCQkvKiBwcmV2aW91cy1wYWdlIGtleSAqLworI2RlZmluZSBLRVlfU1RBQgkwNTI0CQkvKiBzZXQtdGFiIGtleSAqLworI2RlZmluZSBLRVlfQ1RBQgkwNTI1CQkvKiBjbGVhci10YWIga2V5ICovCisjZGVmaW5lIEtFWV9DQVRBQgkwNTI2CQkvKiBjbGVhci1hbGwtdGFicyBrZXkgKi8KKyNkZWZpbmUgS0VZX0VOVEVSCTA1MjcJCS8qIGVudGVyL3NlbmQga2V5ICovCisjZGVmaW5lIEtFWV9QUklOVAkwNTMyCQkvKiBwcmludCBrZXkgKi8KKyNkZWZpbmUgS0VZX0xMCQkwNTMzCQkvKiBsb3dlci1sZWZ0IGtleSAoaG9tZSBkb3duKSAqLworI2RlZmluZSBLRVlfQTEJCTA1MzQJCS8qIHVwcGVyIGxlZnQgb2Yga2V5cGFkICovCisjZGVmaW5lIEtFWV9BMwkJMDUzNQkJLyogdXBwZXIgcmlnaHQgb2Yga2V5cGFkICovCisjZGVmaW5lIEtFWV9CMgkJMDUzNgkJLyogY2VudGVyIG9mIGtleXBhZCAqLworI2RlZmluZSBLRVlfQzEJCTA1MzcJCS8qIGxvd2VyIGxlZnQgb2Yga2V5cGFkICovCisjZGVmaW5lIEtFWV9DMwkJMDU0MAkJLyogbG93ZXIgcmlnaHQgb2Yga2V5cGFkICovCisjZGVmaW5lIEtFWV9CVEFCCTA1NDEJCS8qIGJhY2stdGFiIGtleSAqLworI2RlZmluZSBLRVlfQkVHCQkwNTQyCQkvKiBiZWdpbiBrZXkgKi8KKyNkZWZpbmUgS0VZX0NBTkNFTAkwNTQzCQkvKiBjYW5jZWwga2V5ICovCisjZGVmaW5lIEtFWV9DTE9TRQkwNTQ0CQkvKiBjbG9zZSBrZXkgKi8KKyNkZWZpbmUgS0VZX0NPTU1BTkQJMDU0NQkJLyogY29tbWFuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX0NPUFkJMDU0NgkJLyogY29weSBrZXkgKi8KKyNkZWZpbmUgS0VZX0NSRUFURQkwNTQ3CQkvKiBjcmVhdGUga2V5ICovCisjZGVmaW5lIEtFWV9FTkQJCTA1NTAJCS8qIGVuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX0VYSVQJMDU1MQkJLyogZXhpdCBrZXkgKi8KKyNkZWZpbmUgS0VZX0ZJTkQJMDU1MgkJLyogZmluZCBrZXkgKi8KKyNkZWZpbmUgS0VZX0hFTFAJMDU1MwkJLyogaGVscCBrZXkgKi8KKyNkZWZpbmUgS0VZX01BUksJMDU1NAkJLyogbWFyayBrZXkgKi8KKyNkZWZpbmUgS0VZX01FU1NBR0UJMDU1NQkJLyogbWVzc2FnZSBrZXkgKi8KKyNkZWZpbmUgS0VZX01PVkUJMDU1NgkJLyogbW92ZSBrZXkgKi8KKyNkZWZpbmUgS0VZX05FWFQJMDU1NwkJLyogbmV4dCBrZXkgKi8KKyNkZWZpbmUgS0VZX09QRU4JMDU2MAkJLyogb3BlbiBrZXkgKi8KKyNkZWZpbmUgS0VZX09QVElPTlMJMDU2MQkJLyogb3B0aW9ucyBrZXkgKi8KKyNkZWZpbmUgS0VZX1BSRVZJT1VTCTA1NjIJCS8qIHByZXZpb3VzIGtleSAqLworI2RlZmluZSBLRVlfUkVETwkwNTYzCQkvKiByZWRvIGtleSAqLworI2RlZmluZSBLRVlfUkVGRVJFTkNFCTA1NjQJCS8qIHJlZmVyZW5jZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1JFRlJFU0gJMDU2NQkJLyogcmVmcmVzaCBrZXkgKi8KKyNkZWZpbmUgS0VZX1JFUExBQ0UJMDU2NgkJLyogcmVwbGFjZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1JFU1RBUlQJMDU2NwkJLyogcmVzdGFydCBrZXkgKi8KKyNkZWZpbmUgS0VZX1JFU1VNRQkwNTcwCQkvKiByZXN1bWUga2V5ICovCisjZGVmaW5lIEtFWV9TQVZFCTA1NzEJCS8qIHNhdmUga2V5ICovCisjZGVmaW5lIEtFWV9TQkVHCTA1NzIJCS8qIHNoaWZ0ZWQgYmVnaW4ga2V5ICovCisjZGVmaW5lIEtFWV9TQ0FOQ0VMCTA1NzMJCS8qIHNoaWZ0ZWQgY2FuY2VsIGtleSAqLworI2RlZmluZSBLRVlfU0NPTU1BTkQJMDU3NAkJLyogc2hpZnRlZCBjb21tYW5kIGtleSAqLworI2RlZmluZSBLRVlfU0NPUFkJMDU3NQkJLyogc2hpZnRlZCBjb3B5IGtleSAqLworI2RlZmluZSBLRVlfU0NSRUFURQkwNTc2CQkvKiBzaGlmdGVkIGNyZWF0ZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NEQwkJMDU3NwkJLyogc2hpZnRlZCBkZWxldGUtY2hhcmFjdGVyIGtleSAqLworI2RlZmluZSBLRVlfU0RMCQkwNjAwCQkvKiBzaGlmdGVkIGRlbGV0ZS1saW5lIGtleSAqLworI2RlZmluZSBLRVlfU0VMRUNUCTA2MDEJCS8qIHNlbGVjdCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NFTkQJMDYwMgkJLyogc2hpZnRlZCBlbmQga2V5ICovCisjZGVmaW5lIEtFWV9TRU9MCTA2MDMJCS8qIHNoaWZ0ZWQgY2xlYXItdG8tZW5kLW9mLWxpbmUga2V5ICovCisjZGVmaW5lIEtFWV9TRVhJVAkwNjA0CQkvKiBzaGlmdGVkIGV4aXQga2V5ICovCisjZGVmaW5lIEtFWV9TRklORAkwNjA1CQkvKiBzaGlmdGVkIGZpbmQga2V5ICovCisjZGVmaW5lIEtFWV9TSEVMUAkwNjA2CQkvKiBzaGlmdGVkIGhlbHAga2V5ICovCisjZGVmaW5lIEtFWV9TSE9NRQkwNjA3CQkvKiBzaGlmdGVkIGhvbWUga2V5ICovCisjZGVmaW5lIEtFWV9TSUMJCTA2MTAJCS8qIHNoaWZ0ZWQgaW5zZXJ0LWNoYXJhY3RlciBrZXkgKi8KKyNkZWZpbmUgS0VZX1NMRUZUCTA2MTEJCS8qIHNoaWZ0ZWQgbGVmdC1hcnJvdyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NNRVNTQUdFCTA2MTIJCS8qIHNoaWZ0ZWQgbWVzc2FnZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NNT1ZFCTA2MTMJCS8qIHNoaWZ0ZWQgbW92ZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NORVhUCTA2MTQJCS8qIHNoaWZ0ZWQgbmV4dCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NPUFRJT05TCTA2MTUJCS8qIHNoaWZ0ZWQgb3B0aW9ucyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NQUkVWSU9VUwkwNjE2CQkvKiBzaGlmdGVkIHByZXZpb3VzIGtleSAqLworI2RlZmluZSBLRVlfU1BSSU5UCTA2MTcJCS8qIHNoaWZ0ZWQgcHJpbnQga2V5ICovCisjZGVmaW5lIEtFWV9TUkVETwkwNjIwCQkvKiBzaGlmdGVkIHJlZG8ga2V5ICovCisjZGVmaW5lIEtFWV9TUkVQTEFDRQkwNjIxCQkvKiBzaGlmdGVkIHJlcGxhY2Uga2V5ICovCisjZGVmaW5lIEtFWV9TUklHSFQJMDYyMgkJLyogc2hpZnRlZCByaWdodC1hcnJvdyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NSU1VNRQkwNjIzCQkvKiBzaGlmdGVkIHJlc3VtZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NTQVZFCTA2MjQJCS8qIHNoaWZ0ZWQgc2F2ZSBrZXkgKi8KKyNkZWZpbmUgS0VZX1NTVVNQRU5ECTA2MjUJCS8qIHNoaWZ0ZWQgc3VzcGVuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1NVTkRPCTA2MjYJCS8qIHNoaWZ0ZWQgdW5kbyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NVU1BFTkQJMDYyNwkJLyogc3VzcGVuZCBrZXkgKi8KKyNkZWZpbmUgS0VZX1VORE8JMDYzMAkJLyogdW5kbyBrZXkgKi8KKyNkZWZpbmUgS0VZX01PVVNFCTA2MzEJCS8qIE1vdXNlIGV2ZW50IGhhcyBvY2N1cnJlZCAqLworI2RlZmluZSBLRVlfUkVTSVpFCTA2MzIJCS8qIFRlcm1pbmFsIHJlc2l6ZSBldmVudCAqLworI2RlZmluZSBLRVlfRVZFTlQJMDYzMwkJLyogV2Ugd2VyZSBpbnRlcnJ1cHRlZCBieSBhbiBldmVudCAqLworCisjZGVmaW5lIEtFWV9NQVgJCTA3NzcJCS8qIE1heGltdW0ga2V5IHZhbHVlIGlzIDA2MzMgKi8KKy8qICRJZDogY3Vyc2VzLnRhaWwsdiAxLjE1IDIwMDcvMDMvMTAgMTc6NTE6MjQgdG9tIEV4cCAkICovCisvKgorICogdmlsZTpjbW9kZToKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5jdXJzZXMsIGRlc2lnbmVkIHRvIGJlIGFwcGVuZGVkIGFmdGVyIGN1cnNlcy5oLmluCisgKiAoc2VlIHRoYXQgZmlsZSBmb3IgdGhlIHJlbGV2YW50IGNvcHlyaWdodCkuCisgKi8KKworLyogbW91c2UgaW50ZXJmYWNlICovCisKKyNpZiBOQ1VSU0VTX01PVVNFX1ZFUlNJT04gPiAxCisjZGVmaW5lIE5DVVJTRVNfTU9VU0VfTUFTSyhiLG0pICgobSkgPDwgKCgoYikgLSAxKSAqIDUpKQorI2Vsc2UKKyNkZWZpbmUgTkNVUlNFU19NT1VTRV9NQVNLKGIsbSkgKChtKSA8PCAoKChiKSAtIDEpICogNikpCisjZW5kaWYKKworI2RlZmluZQlOQ1VSU0VTX0JVVFRPTl9SRUxFQVNFRAkwMDFMCisjZGVmaW5lCU5DVVJTRVNfQlVUVE9OX1BSRVNTRUQJMDAyTAorI2RlZmluZQlOQ1VSU0VTX0JVVFRPTl9DTElDS0VECTAwNEwKKyNkZWZpbmUJTkNVUlNFU19ET1VCTEVfQ0xJQ0tFRAkwMTBMCisjZGVmaW5lCU5DVVJTRVNfVFJJUExFX0NMSUNLRUQJMDIwTAorI2RlZmluZQlOQ1VSU0VTX1JFU0VSVkVEX0VWRU5UCTA0MEwKKworLyogZXZlbnQgbWFza3MgKi8KKyNkZWZpbmUJQlVUVE9OMV9SRUxFQVNFRAlOQ1VSU0VTX01PVVNFX01BU0soMSwgTkNVUlNFU19CVVRUT05fUkVMRUFTRUQpCisjZGVmaW5lCUJVVFRPTjFfUFJFU1NFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDEsIE5DVVJTRVNfQlVUVE9OX1BSRVNTRUQpCisjZGVmaW5lCUJVVFRPTjFfQ0xJQ0tFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDEsIE5DVVJTRVNfQlVUVE9OX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjFfRE9VQkxFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDEsIE5DVVJTRVNfRE9VQkxFX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjFfVFJJUExFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDEsIE5DVVJTRVNfVFJJUExFX0NMSUNLRUQpCisKKyNkZWZpbmUJQlVUVE9OMl9SRUxFQVNFRAlOQ1VSU0VTX01PVVNFX01BU0soMiwgTkNVUlNFU19CVVRUT05fUkVMRUFTRUQpCisjZGVmaW5lCUJVVFRPTjJfUFJFU1NFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDIsIE5DVVJTRVNfQlVUVE9OX1BSRVNTRUQpCisjZGVmaW5lCUJVVFRPTjJfQ0xJQ0tFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDIsIE5DVVJTRVNfQlVUVE9OX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjJfRE9VQkxFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDIsIE5DVVJTRVNfRE9VQkxFX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjJfVFJJUExFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDIsIE5DVVJTRVNfVFJJUExFX0NMSUNLRUQpCisKKyNkZWZpbmUJQlVUVE9OM19SRUxFQVNFRAlOQ1VSU0VTX01PVVNFX01BU0soMywgTkNVUlNFU19CVVRUT05fUkVMRUFTRUQpCisjZGVmaW5lCUJVVFRPTjNfUFJFU1NFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDMsIE5DVVJTRVNfQlVUVE9OX1BSRVNTRUQpCisjZGVmaW5lCUJVVFRPTjNfQ0xJQ0tFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDMsIE5DVVJTRVNfQlVUVE9OX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjNfRE9VQkxFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDMsIE5DVVJTRVNfRE9VQkxFX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjNfVFJJUExFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDMsIE5DVVJTRVNfVFJJUExFX0NMSUNLRUQpCisKKyNkZWZpbmUJQlVUVE9ONF9SRUxFQVNFRAlOQ1VSU0VTX01PVVNFX01BU0soNCwgTkNVUlNFU19CVVRUT05fUkVMRUFTRUQpCisjZGVmaW5lCUJVVFRPTjRfUFJFU1NFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDQsIE5DVVJTRVNfQlVUVE9OX1BSRVNTRUQpCisjZGVmaW5lCUJVVFRPTjRfQ0xJQ0tFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDQsIE5DVVJTRVNfQlVUVE9OX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjRfRE9VQkxFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDQsIE5DVVJTRVNfRE9VQkxFX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjRfVFJJUExFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDQsIE5DVVJTRVNfVFJJUExFX0NMSUNLRUQpCisKKy8qCisgKiBJbiAzMiBiaXRzIHRoZSB2ZXJzaW9uLTEgc2NoZW1lIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIHNwYWNlIGZvciBhIDV0aAorICogYnV0dG9uLCB1bmxlc3Mgd2UgY2hvb3NlIHRvIGNoYW5nZSB0aGUgQUJJIGJ5IG9taXR0aW5nIHRoZSByZXNlcnZlZC1ldmVudHMuCisgKi8KKyNpZiBOQ1VSU0VTX01PVVNFX1ZFUlNJT04gPiAxCisKKyNkZWZpbmUJQlVUVE9ONV9SRUxFQVNFRAlOQ1VSU0VTX01PVVNFX01BU0soNSwgTkNVUlNFU19CVVRUT05fUkVMRUFTRUQpCisjZGVmaW5lCUJVVFRPTjVfUFJFU1NFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDUsIE5DVVJTRVNfQlVUVE9OX1BSRVNTRUQpCisjZGVmaW5lCUJVVFRPTjVfQ0xJQ0tFRAkJTkNVUlNFU19NT1VTRV9NQVNLKDUsIE5DVVJTRVNfQlVUVE9OX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjVfRE9VQkxFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDUsIE5DVVJTRVNfRE9VQkxFX0NMSUNLRUQpCisjZGVmaW5lCUJVVFRPTjVfVFJJUExFX0NMSUNLRUQJTkNVUlNFU19NT1VTRV9NQVNLKDUsIE5DVVJTRVNfVFJJUExFX0NMSUNLRUQpCisKKyNkZWZpbmUJQlVUVE9OX0NUUkwJCU5DVVJTRVNfTU9VU0VfTUFTSyg2LCAwMDAxTCkKKyNkZWZpbmUJQlVUVE9OX1NISUZUCQlOQ1VSU0VTX01PVVNFX01BU0soNiwgMDAwMkwpCisjZGVmaW5lCUJVVFRPTl9BTFQJCU5DVVJTRVNfTU9VU0VfTUFTSyg2LCAwMDA0TCkKKyNkZWZpbmUJUkVQT1JUX01PVVNFX1BPU0lUSU9OCU5DVVJTRVNfTU9VU0VfTUFTSyg2LCAwMDEwTCkKKworI2Vsc2UKKworI2RlZmluZQlCVVRUT04xX1JFU0VSVkVEX0VWRU5UCU5DVVJTRVNfTU9VU0VfTUFTSygxLCBOQ1VSU0VTX1JFU0VSVkVEX0VWRU5UKQorI2RlZmluZQlCVVRUT04yX1JFU0VSVkVEX0VWRU5UCU5DVVJTRVNfTU9VU0VfTUFTSygyLCBOQ1VSU0VTX1JFU0VSVkVEX0VWRU5UKQorI2RlZmluZQlCVVRUT04zX1JFU0VSVkVEX0VWRU5UCU5DVVJTRVNfTU9VU0VfTUFTSygzLCBOQ1VSU0VTX1JFU0VSVkVEX0VWRU5UKQorI2RlZmluZQlCVVRUT040X1JFU0VSVkVEX0VWRU5UCU5DVVJTRVNfTU9VU0VfTUFTSyg0LCBOQ1VSU0VTX1JFU0VSVkVEX0VWRU5UKQorCisjZGVmaW5lCUJVVFRPTl9DVFJMCQlOQ1VSU0VTX01PVVNFX01BU0soNSwgMDAwMUwpCisjZGVmaW5lCUJVVFRPTl9TSElGVAkJTkNVUlNFU19NT1VTRV9NQVNLKDUsIDAwMDJMKQorI2RlZmluZQlCVVRUT05fQUxUCQlOQ1VSU0VTX01PVVNFX01BU0soNSwgMDAwNEwpCisjZGVmaW5lCVJFUE9SVF9NT1VTRV9QT1NJVElPTglOQ1VSU0VTX01PVVNFX01BU0soNSwgMDAxMEwpCisKKyNlbmRpZgorCisjZGVmaW5lCUFMTF9NT1VTRV9FVkVOVFMJKFJFUE9SVF9NT1VTRV9QT1NJVElPTiAtIDEpCisKKy8qIG1hY3JvcyB0byBleHRyYWN0IHNpbmdsZSBldmVudC1iaXRzIGZyb20gbWFza3MgKi8KKyNkZWZpbmUJQlVUVE9OX1JFTEVBU0UoZSwgeCkJCSgoZSkgJiAoMDAxIDw8ICg2ICogKCh4KSAtIDEpKSkpCisjZGVmaW5lCUJVVFRPTl9QUkVTUyhlLCB4KQkJKChlKSAmICgwMDIgPDwgKDYgKiAoKHgpIC0gMSkpKSkKKyNkZWZpbmUJQlVUVE9OX0NMSUNLKGUsIHgpCQkoKGUpICYgKDAwNCA8PCAoNiAqICgoeCkgLSAxKSkpKQorI2RlZmluZQlCVVRUT05fRE9VQkxFX0NMSUNLKGUsIHgpCSgoZSkgJiAoMDEwIDw8ICg2ICogKCh4KSAtIDEpKSkpCisjZGVmaW5lCUJVVFRPTl9UUklQTEVfQ0xJQ0soZSwgeCkJKChlKSAmICgwMjAgPDwgKDYgKiAoKHgpIC0gMSkpKSkKKyNkZWZpbmUJQlVUVE9OX1JFU0VSVkVEX0VWRU5UKGUsIHgpCSgoZSkgJiAoMDQwIDw8ICg2ICogKCh4KSAtIDEpKSkpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgc2hvcnQgaWQ7CQkvKiBJRCB0byBkaXN0aW5ndWlzaCBtdWx0aXBsZSBkZXZpY2VzICovCisgICAgaW50IHgsIHksIHo7CS8qIGV2ZW50IGNvb3JkaW5hdGVzIChjaGFyYWN0ZXItY2VsbCkgKi8KKyAgICBtbWFza190IGJzdGF0ZTsJLyogYnV0dG9uIHN0YXRlIGJpdHMgKi8KK30KK01FVkVOVDsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgZ2V0bW91c2UgKE1FVkVOVCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHVuZ2V0bW91c2UgKE1FVkVOVCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChtbWFza190KSBtb3VzZW1hc2sgKG1tYXNrX3QsIG1tYXNrX3QgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgd2VuY2xvc2UgKGNvbnN0IFdJTkRPVyAqLCBpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtb3VzZWludGVydmFsIChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIHdtb3VzZV90cmFmbyAoY29uc3QgV0lORE9XKiwgaW50KiwgaW50KiwgYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgbW91c2VfdHJhZm8gKGludCosIGludCosIGJvb2wpOyAgICAgICAgICAgICAgLyogZ2VuZXJhdGVkICovCisKKyNkZWZpbmUgbW91c2VfdHJhZm8oeSx4LHRvX3NjcmVlbikgd21vdXNlX3RyYWZvKHN0ZHNjcix5LHgsdG9fc2NyZWVuKQorCisvKiBvdGhlciBub24tWFNJIGZ1bmN0aW9ucyAqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBtY3ByaW50IChjaGFyICosIGludCk7CS8qIGRpcmVjdCBkYXRhIHRvIHByaW50ZXIgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGhhc19rZXkgKGludCk7CQkvKiBkbyB3ZSBoYXZlIGdpdmVuIGtleT8gKi8KKworLyogRGVidWdnaW5nIDogdXNlIHdpdGggbGlibmN1cnNlc19nLmEgKi8KKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF90cmFjZWYgKGNvbnN0IGNoYXIgKiwgLi4uKSBHQ0NfUFJJTlRGTElLRSgxLDIpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF90cmFjZWR1bXAgKGNvbnN0IGNoYXIgKiwgV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlYXR0ciAoYXR0cl90KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWF0dHIyIChpbnQsIGNodHlwZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfdHJhY2ViaXRzICh2b2lkKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWNoYXIgKGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VjaHR5cGUgKGNodHlwZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VjaHR5cGUyIChpbnQsIGNodHlwZSk7CisjaWZkZWYgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAorI2RlZmluZSBfdHJhY2VjaF90CQlfdHJhY2VjY2hhcl90CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfdHJhY2VjY2hhcl90IChjb25zdCBjY2hhcl90ICopOworI2RlZmluZSBfdHJhY2VjaF90MgkJX3RyYWNlY2NoYXJfdDIKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF90cmFjZWNjaGFyX3QyIChpbnQsIGNvbnN0IGNjaGFyX3QgKik7CisjZWxzZQorI2RlZmluZSBfdHJhY2VjaF90CQlfdHJhY2VjaHR5cGUKKyNkZWZpbmUgX3RyYWNlY2hfdDIJCV90cmFjZWNodHlwZTIKKyNlbmRpZgorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX3RyYWNlbW91c2UgKGNvbnN0IE1FVkVOVCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSB0cmFjZSAoY29uc3QgdW5zaWduZWQgaW50KTsKKworLyogdHJhY2UgbWFza3MgKi8KKyNkZWZpbmUgVFJBQ0VfRElTQUJMRQkweDAwMDAJLyogdHVybiBvZmYgdHJhY2luZyAqLworI2RlZmluZSBUUkFDRV9USU1FUwkweDAwMDEJLyogdHJhY2UgdXNlciBhbmQgc3lzdGVtIHRpbWVzIG9mIHVwZGF0ZXMgKi8KKyNkZWZpbmUgVFJBQ0VfVFBVVFMJMHgwMDAyCS8qIHRyYWNlIHRwdXRzIGNhbGxzICovCisjZGVmaW5lIFRSQUNFX1VQREFURQkweDAwMDQJLyogdHJhY2UgdXBkYXRlIGFjdGlvbnMsIG9sZCAmIG5ldyBzY3JlZW5zICovCisjZGVmaW5lIFRSQUNFX01PVkUJMHgwMDA4CS8qIHRyYWNlIGN1cnNvciBtb3ZlcyBhbmQgc2Nyb2xscyAqLworI2RlZmluZSBUUkFDRV9DSEFSUFVUCTB4MDAxMAkvKiB0cmFjZSBhbGwgY2hhcmFjdGVyIG91dHB1dHMgKi8KKyNkZWZpbmUgVFJBQ0VfT1JESU5BUlkJMHgwMDFGCS8qIHRyYWNlIGFsbCB1cGRhdGUgYWN0aW9ucyAqLworI2RlZmluZSBUUkFDRV9DQUxMUwkweDAwMjAJLyogdHJhY2UgYWxsIGN1cnNlcyBjYWxscyAqLworI2RlZmluZSBUUkFDRV9WSVJUUFVUCTB4MDA0MAkvKiB0cmFjZSB2aXJ0dWFsIGNoYXJhY3RlciBwdXRzICovCisjZGVmaW5lIFRSQUNFX0lFVkVOVAkweDAwODAJLyogdHJhY2UgbG93LWxldmVsIGlucHV0IHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgVFJBQ0VfQklUUwkweDAxMDAJLyogdHJhY2Ugc3RhdGUgb2YgVFRZIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBUUkFDRV9JQ0FMTFMJMHgwMjAwCS8qIHRyYWNlIGludGVybmFsL25lc3RlZCBjYWxscyAqLworI2RlZmluZSBUUkFDRV9DQ0FMTFMJMHgwNDAwCS8qIHRyYWNlIHBlci1jaGFyYWN0ZXIgY2FsbHMgKi8KKyNkZWZpbmUgVFJBQ0VfREFUQUJBU0UJMHgwODAwCS8qIHRyYWNlIHJlYWQvd3JpdGUgb2YgdGVybWluZm8vdGVybWNhcCBkYXRhICovCisjZGVmaW5lIFRSQUNFX0FUVFJTCTB4MTAwMAkvKiB0cmFjZSBhdHRyaWJ1dGUgdXBkYXRlcyAqLworCisjZGVmaW5lIFRSQUNFX1NISUZUCTEzCS8qIG51bWJlciBvZiBiaXRzIGluIHRoZSB0cmFjZSBtYXNrcyAqLworI2RlZmluZSBUUkFDRV9NQVhJTVVNCSgoMSA8PCBUUkFDRV9TSElGVCkgLSAxKSAvKiBtYXhpbXVtIHRyYWNlIGxldmVsICovCisKKyNpZiBkZWZpbmVkKFRSQUNFKSB8fCBkZWZpbmVkKE5DVVJTRVNfVEVTVCkKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBfbmNfb3B0aW1pemVfZW5hYmxlOwkJLyogZW5hYmxlIG9wdGltaXphdGlvbnMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIF9uY192aXNidWYgKGNvbnN0IGNoYXIgKik7CisjZGVmaW5lIE9QVElNSVpFX01WQ1VSCQkweDAxCS8qIGN1cnNvciBtb3ZlbWVudCBvcHRpbWl6YXRpb24gKi8KKyNkZWZpbmUgT1BUSU1JWkVfSEFTSE1BUAkweDAyCS8qIGRpZmYgaGFzaGluZyB0byBkZXRlY3Qgc2Nyb2xscyAqLworI2RlZmluZSBPUFRJTUlaRV9TQ1JPTEwJCTB4MDQJLyogc2Nyb2xsIG9wdGltaXphdGlvbiAqLworI2RlZmluZSBPUFRJTUlaRV9BTEwJCTB4ZmYJLyogZW5hYmxlIGFsbCBvcHRpbWl6YXRpb25zIChkZmx0KSAqLworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaWZuZGVmIE5DVVJTRVNfTk9NQUNST1MKKworLyogdGhlc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBTVEwgKi8KKyN1bmRlZiBib3gKKyN1bmRlZiBjbGVhcgorI3VuZGVmIGVyYXNlCisjdW5kZWYgbW92ZQorI3VuZGVmIHJlZnJlc2gKKworI2VuZGlmIC8qIE5DVVJTRVNfTk9NQUNST1MgKi8KKworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX05DVVJTRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNhcHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5OTVkMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzYXBwLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGN1cnNlc2FwcC5oLHYgMS4xMSAyMDA1LzA1LzI4IDIxOjU3OjQ0IHRvbSBFeHAgJAorCisjaWZuZGVmIE5DVVJTRVNfQ1VSU0VTQVBQX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNFU0FQUF9IX2luY2wKKworI2luY2x1ZGUgPGN1cnNzbGsuaD4KKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc0FwcGxpY2F0aW9uIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdHJ1Y3QgX3Nsa19saW5rIHsgICAgICAgICAgLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWludGFpbgorICAgIHN0cnVjdCBfc2xrX2xpbmsqIHByZXY7ICAgICAgICAgICAvLyBhIHN0YWNrIG9mIFNMS3MKKyAgICBTb2Z0X0xhYmVsX0tleV9TZXQqIFNMS3M7CisgIH0gU0xLX0xpbms7Citwcml2YXRlOgorICBzdGF0aWMgaW50IHJpbml0KE5DdXJzZXNXaW5kb3cmIHcpOyAvLyBJbnRlcm5hbCBJbml0IGZ1bmN0aW9uIGZvciB0aXRsZQorICBzdGF0aWMgTkN1cnNlc0FwcGxpY2F0aW9uKiB0aGVBcHA7ICAvLyBHbG9iYWwgcmVmLiB0byB0aGUgYXBwbGljYXRpb24KKworICBzdGF0aWMgU0xLX0xpbmsqIHNsa19zdGFjazsKKworcHJvdGVjdGVkOgorICBzdGF0aWMgTkN1cnNlc1dpbmRvdyogdGl0bGVXaW5kb3c7ICAvLyBUaGUgVGl0bGUgV2luZG93IChpZiBhbnkpCisKKyAgYm9vbCBiX0NvbG9yczsgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhIGNvbG9yIGFwcGxpY2F0aW9uPworICBOQ3Vyc2VzV2luZG93KiBSb290X1dpbmRvdzsgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzdGRzY3IgZXF1aXYuCisKKyAgLy8gSW5pdGlhbGl6YXRpb24gb2YgYXR0cmlidXRlczsKKyAgLy8gUmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcyBpZiB5b3UgcHJlZmVyIG90aGVyIHNldHRpbmdzCisgIHZpcnR1YWwgdm9pZCBpbml0KGJvb2wgYkNvbG9ycyk7CisKKyAgLy8gVGhlIG51bWJlciBvZiBsaW5lcyBmb3IgdGhlIHRpdGxlIHdpbmRvdy4gRGVmYXVsdCBpcyBubyB0aXRsZSB3aW5kb3cKKyAgLy8gWW91IG1heSByZXdyaXRlIHRoaXMgaW4geW91ciBkZXJpdmVkIGNsYXNzCisgIHZpcnR1YWwgaW50IHRpdGxlc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwdXQgc29tZXRoaW5nIGludG8gdGhlIHRpdGxlIHdpbmRvdyBpbml0aWFsbHkKKyAgLy8gWW91IG1heSByZXdyaXRlIHRoaXMgaW4geW91ciBkZXJpdmVkIGNsYXNzCisgIHZpcnR1YWwgdm9pZCB0aXRsZSgpIHsKKyAgfQorCisgIC8vIFRoZSBsYXlvdXQgdXNlZCBmb3IgdGhlIFNvZnQgTGFiZWwgS2V5cy4gRGVmYXVsdCBpcyB0byBoYXZlIG5vIFNMS3MuCisgIC8vIFlvdSBtYXkgcmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcworICB2aXJ0dWFsIFNvZnRfTGFiZWxfS2V5X1NldDo6TGFiZWxfTGF5b3V0IHVzZVNMS3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFNvZnRfTGFiZWxfS2V5X1NldDo6Tm9uZTsKKyAgfQorCisgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBTTEtzLiBEZWZhdWx0IGlzIG5vdGhpbmcuCisgIC8vIFlvdSBtYXkgcmV3cml0ZSB0aGlzIGluIHlvdXIgZGVyaXZlZCBjbGFzcworICB2aXJ0dWFsIHZvaWQgaW5pdF9sYWJlbHMoU29mdF9MYWJlbF9LZXlfU2V0JiBTKSBjb25zdCB7CisgIH0KKworICAvLyBZb3VyIGRlcml2ZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuIFRoZSByZXR1cm4gdmFsdWUgbXVzdAorICAvLyBiZSB0aGUgZXhpdCB2YWx1ZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgorICB2aXJ0dWFsIGludCBydW4oKSA9IDA7CisKKyAgLy8gVGhlIGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCwgc28geW91IG1heSB1c2UgaXQgaW4geW91ciBkZXJpdmVkCisgIC8vIGNsYXNzIGNvbnN0cnVjdG9yLiBUaGUgYXJndW1lbnQgdGVsbHMgd2hldGhlciBvciBub3QgeW91IHdhbnQgY29sb3JzLgorICBOQ3Vyc2VzQXBwbGljYXRpb24oYm9vbCB3YW50Q29sb3JzID0gRkFMU0UpOworCisgIE5DdXJzZXNBcHBsaWNhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNBcHBsaWNhdGlvbiYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNBcHBsaWNhdGlvbihjb25zdCBOQ3Vyc2VzQXBwbGljYXRpb24mIHJocykKKyAgICA6IGJfQ29sb3JzKHJocy5iX0NvbG9ycyksCisgICAgICBSb290X1dpbmRvdyhyaHMuUm9vdF9XaW5kb3cpCisgIHsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgfk5DdXJzZXNBcHBsaWNhdGlvbigpOworCisgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gb2JqZWN0CisgIHN0YXRpYyBOQ3Vyc2VzQXBwbGljYXRpb24qIGdldEFwcGxpY2F0aW9uKCkgeworICAgIHJldHVybiB0aGVBcHA7CisgIH0KKworICAvLyBUaGlzIG1ldGhvZCBydW5zIHRoZSBhcHBsaWNhdGlvbiBhbmQgcmV0dXJucyBpdHMgZXhpdCB2YWx1ZQorICBpbnQgb3BlcmF0b3IoKSh2b2lkKTsKKworICAvLyBQcm9jZXNzIHRoZSBjb21tYW5kbGluZSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseQorICAvLyBpZ25vcmVzIHRoZW0uIFlvdXIgZGVyaXZlZCBjbGFzcyBtYXkgcmV3cml0ZSB0aGlzLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIH0KKworICAvLyBEb2VzIHRoaXMgYXBwbGljYXRpb24gdXNlIGNvbG9ycz8KKyAgaW5saW5lIGJvb2wgdXNlQ29sb3JzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9yczsKKyAgfQorCisgIC8vIFB1c2ggdGhlIEtleSBTZXQgUyBvbnRvIHRoZSBTTEsgU3RhY2suIFMgdGhlbiBiZWNvbWVzIHRoZSBjdXJyZW50IHNldAorICAvLyBvZiBTb2Z0IExhYmVsbGVkIEtleXMuCisgIHZvaWQgcHVzaChTb2Z0X0xhYmVsX0tleV9TZXQmIFMpOworCisgIC8vIFRocm93IGF3YXkgdGhlIGN1cnJlbnQgc2V0IG9mIFNMS3MgYW5kIG1ha2UgdGhlIHByZXZpb3VzIG9uZSB0aGUKKyAgLy8gbmV3IGN1cnJlbnQgc2V0LgorICBib29sIHBvcCgpOworCisgIC8vIFJldHJpZXZlIHRoZSBjdXJyZW50IHNldCBvZiBTb2Z0IExhYmVsbGVkIEtleXMuCisgIFNvZnRfTGFiZWxfS2V5X1NldCogdG9wKCkgY29uc3Q7CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIG1lbnUgYW5kIGZvcm1zIGZvcmVncm91bmRzCisgIHZpcnR1YWwgY2h0eXBlIGZvcmVncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoMSkgOiBBX0JPTEQ7CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIHRvIHVzZSBmb3IgbWVudSBhbmQgZm9ybXMgYmFja2dyb3VuZHMKKyAgdmlydHVhbCBjaHR5cGUgYmFja2dyb3VuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gQ09MT1JfUEFJUigyKSA6IEFfTk9STUFMOworICB9CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIGluYWN0aXZlIChtZW51KSBlbGVtZW50cworICB2aXJ0dWFsIGNodHlwZSBpbmFjdGl2ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gKENPTE9SX1BBSVIoMyl8QV9ESU0pIDogQV9ESU07CisgIH0KKworICAvLyBBdHRyaWJ1dGVzIHRvIHVzZSBmb3IgKGZvcm0pIGxhYmVscyBhbmQgU0xLcworICB2aXJ0dWFsIGNodHlwZSBsYWJlbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gQ09MT1JfUEFJUig0KSA6IEFfTk9STUFMOworICB9CisKKyAgLy8gQXR0cmlidXRlcyB0byB1c2UgZm9yIGZvcm0gYmFja2dyb3VuZHMKKyAgdmlydHVhbCBjaHR5cGUgZGlhbG9nX2JhY2tncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoNCkgOiBBX05PUk1BTDsKKyAgfQorCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGFzIGRlZmF1bHQgZm9yIChmb3JtKSB3aW5kb3cgYmFja2dyb3VuZHMKKyAgdmlydHVhbCBjaHR5cGUgd2luZG93X2JhY2tncm91bmRzKCkgY29uc3QgeworICAgIHJldHVybiBiX0NvbG9ycyA/IENPTE9SX1BBSVIoNSkgOiBBX05PUk1BTDsKKyAgfQorCisgIC8vIEF0dHJpYnV0ZXMgdG8gdXNlIGZvciB0aGUgdGl0bGUgd2luZG93CisgIHZpcnR1YWwgY2h0eXBlIHNjcmVlbl90aXRsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJfQ29sb3JzID8gQ09MT1JfUEFJUig2KSA6IEFfQk9MRDsKKyAgfQorCit9OworIAorI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTQVBQX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGEzMGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNmLmgKQEAgLTAsMCArMSw5NjcgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDQsMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGN1cnNlc2YuaCx2IDEuMjggMjAwNS8wOC8xMyAxODowODoyNCB0b20gRXhwICQKKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU0ZfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU0VTRl9IX2luY2wgMQorCisjaW5jbHVkZSA8Y3Vyc2VzcC5oPgorCisjaWZuZGVmIF9fRVhUX1FOWAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSA8Zm9ybS5oPgorfQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBidWl0aW4gYW5kIHVzZXIgZGVmaW5lZCBGaWVsZHR5cGVzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGb3JtRmllbGQ7IC8vIGZvcndhcmQgZGVjbGFyYXRpb24KKworLy8gQ2xhc3MgdG8gcmVwcmVzZW50IGJ1aWx0aW4gZmllbGQgdHlwZXMgYXMgd2VsbCBhcyBDKysgd3JpdHRlbiBuZXcKKy8vIGZpZWxkdHlwZXMgKHNlZSBjbGFzc2VzIFVzZXJEZWZpbmVGaWVsZFR5cGUuLi4KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGaWVsZFR5cGUKK3sKKyAgZnJpZW5kIGNsYXNzIE5DdXJzZXNGb3JtRmllbGQ7CisKK3Byb3RlY3RlZDoKKyAgRklFTERUWVBFKiBmaWVsZHR5cGU7CisKKyAgaW5saW5lIHZvaWQgT25FcnJvcihpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc0Zvcm1FeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyIT1FX09LKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNGb3JtRXhjZXB0aW9uIChlcnIpKTsKKyAgfQorCisgIE5DdXJzZXNGaWVsZFR5cGUoRklFTERUWVBFICpmKSA6IGZpZWxkdHlwZShmKSB7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzRmllbGRUeXBlKCkge30KKworICAvLyBTZXQgdGhlIGZpZWxkcyBmIGZpZWxkdHlwZSB0byB0aGlzIG9uZS4KKyAgdmlydHVhbCB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSA9IDA7CisKK3B1YmxpYzoKKyAgTkN1cnNlc0ZpZWxkVHlwZSgpCisgICAgOiBmaWVsZHR5cGUoU1RBVElDX0NBU1QoRklFTERUWVBFKikoMCkpCisgIHsKKyAgfQorCisgIE5DdXJzZXNGaWVsZFR5cGUmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRmllbGRUeXBlJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0ZpZWxkVHlwZShjb25zdCBOQ3Vyc2VzRmllbGRUeXBlJiByaHMpCisgICAgOiBmaWVsZHR5cGUocmhzLmZpZWxkdHlwZSkKKyAgeworICB9CisKK307CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIGEgZm9ybXMgZmllbGQsIHdyYXBwaW5nIHRoZSBsb3dsZXZlbCBGSUVMRCBzdHJ1Y3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybUZpZWxkCit7CisgIGZyaWVuZCBjbGFzcyBOQ3Vyc2VzRm9ybTsKKworcHJvdGVjdGVkOgorICBGSUVMRCAqZmllbGQ7CQkgICAgIC8vIGxvd2xldmVsIHN0cnVjdHVyZQorICBOQ3Vyc2VzRmllbGRUeXBlKiBmdHlwZTsgICAvLyBBc3NvY2lhdGVkIGZpZWxkIHR5cGUKKworICAvLyBFcnJvciBoYW5kbGVyCisgIGlubGluZSB2b2lkIE9uRXJyb3IgKGludCBlcnIpIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzRm9ybUV4Y2VwdGlvbikgeworICAgIGlmIChlcnIgIT0gRV9PSykKKyAgICAgIFRIUk9XKG5ldyBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoZXJyKSk7CisgIH0KKworcHVibGljOgorICAvLyBDcmVhdGUgYSAnTnVsbCcgZmllbGQuIENhbiBiZSB1c2VkIHRvIGRlbGltaXQgYSBmaWVsZCBsaXN0CisgIE5DdXJzZXNGb3JtRmllbGQoKQorICAgIDogZmllbGQoU1RBVElDX0NBU1QoRklFTEQqKSgwKSksCisgICAgICBmdHlwZShTVEFUSUNfQ0FTVChOQ3Vyc2VzRmllbGRUeXBlKikoMCkpCisgIHsKKyAgfQorCisgIC8vIENyZWF0ZSBhIG5ldyBmaWVsZAorICBOQ3Vyc2VzRm9ybUZpZWxkIChpbnQgcm93cywKKwkJICAgIGludCBuY29scywKKwkJICAgIGludCBmaXJzdF9yb3cgPSAwLAorCQkgICAgaW50IGZpcnN0X2NvbCA9IDAsCisJCSAgICBpbnQgb2Zmc2NyZWVuX3Jvd3MgPSAwLAorCQkgICAgaW50IGFkZGl0aW9uYWxfYnVmZmVycyA9IDApCisgICAgOiBmaWVsZCgwKSwKKyAgICAgIGZ0eXBlKFNUQVRJQ19DQVNUKE5DdXJzZXNGaWVsZFR5cGUqKSgwKSkKKyAgeworICAgICAgZmllbGQgPSA6Om5ld19maWVsZChyb3dzLCBuY29scywgZmlyc3Rfcm93LCBmaXJzdF9jb2wsCisJCQkgIG9mZnNjcmVlbl9yb3dzLCBhZGRpdGlvbmFsX2J1ZmZlcnMpOworICAgICAgaWYgKCFmaWVsZCkKKwlPbkVycm9yKGVycm5vKTsKKyAgfQorCisgIE5DdXJzZXNGb3JtRmllbGQmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRm9ybUZpZWxkJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc0Zvcm1GaWVsZChjb25zdCBOQ3Vyc2VzRm9ybUZpZWxkJiByaHMpCisgICAgOiBmaWVsZChyaHMuZmllbGQpLCBmdHlwZShyaHMuZnR5cGUpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNGb3JtRmllbGQgKCk7CisKKyAgLy8gRHVwbGljYXRlIHRoZSBmaWVsZCBhdCBhIG5ldyBwb3NpdGlvbgorICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogZHVwKGludCBmaXJzdF9yb3csIGludCBmaXJzdF9jb2wpCisgIHsKKyAgICBOQ3Vyc2VzRm9ybUZpZWxkKiBmID0gbmV3IE5DdXJzZXNGb3JtRmllbGQoKTsKKyAgICBpZiAoIWYpCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgICBlbHNlIHsKKyAgICAgIGYtPmZ0eXBlID0gZnR5cGU7CisgICAgICBmLT5maWVsZCA9IDo6ZHVwX2ZpZWxkKGZpZWxkLGZpcnN0X3JvdyxmaXJzdF9jb2wpOworICAgICAgaWYgKCFmLT5maWVsZCkKKwlPbkVycm9yKGVycm5vKTsKKyAgICB9CisgICAgcmV0dXJuIGY7CisgIH0KKworICAvLyBMaW5rIHRoZSBmaWVsZCB0byBhIG5ldyBsb2NhdGlvbgorICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogbGluayhpbnQgZmlyc3Rfcm93LCBpbnQgZmlyc3RfY29sKSB7CisgICAgTkN1cnNlc0Zvcm1GaWVsZCogZiA9IG5ldyBOQ3Vyc2VzRm9ybUZpZWxkKCk7CisgICAgaWYgKCFmKQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgICAgZWxzZSB7CisgICAgICBmLT5mdHlwZSA9IGZ0eXBlOworICAgICAgZi0+ZmllbGQgPSA6OmxpbmtfZmllbGQoZmllbGQsZmlyc3Rfcm93LGZpcnN0X2NvbCk7CisgICAgICBpZiAoIWYtPmZpZWxkKQorCU9uRXJyb3IoZXJybm8pOworICAgIH0KKyAgICByZXR1cm4gZjsKKyAgfQorCisgIC8vIEdldCB0aGUgbG93bGV2ZWwgZmllbGQgcmVwcmVzZW50YXRpb24KKyAgaW5saW5lIEZJRUxEKiBnZXRfZmllbGQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZpZWxkOworICB9CisKKyAgLy8gUmV0cmlldmUgaW5mbyBhYm91dCB0aGUgZmllbGQKKyAgaW5saW5lIHZvaWQgaW5mbyhpbnQmIHJvd3MsIGludCYgbmNvbHMsCisJCSAgIGludCYgZmlyc3Rfcm93LCBpbnQmIGZpcnN0X2NvbCwKKwkJICAgaW50JiBvZmZzY3JlZW5fcm93cywgaW50JiBhZGRpdGlvbmFsX2J1ZmZlcnMpIGNvbnN0IHsKKyAgICBPbkVycm9yKDo6ZmllbGRfaW5mbyhmaWVsZCwgJnJvd3MsICZuY29scywKKwkJCSAmZmlyc3Rfcm93LCAmZmlyc3RfY29sLAorCQkJICZvZmZzY3JlZW5fcm93cywgJmFkZGl0aW9uYWxfYnVmZmVycykpOworICB9CisKKyAgLy8gUmV0cmlldmUgaW5mbyBhYm91dCB0aGUgZmllbGRzIGR5bmFtaWMgcHJvcGVydGllcy4KKyAgaW5saW5lIHZvaWQgZHluYW1pY19pbmZvKGludCYgZHluYW1pY19yb3dzLCBpbnQmIGR5bmFtaWNfY29scywKKwkJCSAgIGludCYgbWF4X2dyb3d0aCkgY29uc3QgeworICAgIE9uRXJyb3IoOjpkeW5hbWljX2ZpZWxkX2luZm8oZmllbGQsICZkeW5hbWljX3Jvd3MsICZkeW5hbWljX2NvbHMsCisJCQkJICZtYXhfZ3Jvd3RoKSk7CisgIH0KKworICAvLyBGb3IgYSBkeW5hbWljIGZpZWxkIHlvdSBtYXkgc2V0IHRoZSBtYXhpbXVtIGdyb3d0aCBsaW1pdC4KKyAgLy8gQSB6ZXJvIG1lYW5zIHVubGltaXRlZCBncm93dGguCisgIGlubGluZSB2b2lkIHNldF9tYXhpbXVtX2dyb3d0aChpbnQgZ3Jvd3RoID0gMCkgeworICAgIE9uRXJyb3IoOjpzZXRfbWF4X2ZpZWxkKGZpZWxkLGdyb3d0aCkpOworICB9CisKKyAgLy8gTW92ZSB0aGUgZmllbGQgdG8gYSBuZXcgcG9zaXRpb24KKyAgaW5saW5lIHZvaWQgbW92ZShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgT25FcnJvcig6Om1vdmVfZmllbGQoZmllbGQscm93LGNvbCkpOworICB9CisKKyAgLy8gTWFyayB0aGUgZmllbGQgdG8gc3RhcnQgYSBuZXcgcGFnZQorICBpbmxpbmUgdm9pZCBuZXdfcGFnZShib29sIHBhZ2VGbGFnID0gRkFMU0UpIHsKKyAgICBPbkVycm9yKDo6c2V0X25ld19wYWdlKGZpZWxkLHBhZ2VGbGFnKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB3aGV0aGVyIG9yIG5vdCB0aGUgZmllbGQgc3RhcnRzIGEgbmV3IHBhZ2UuCisgIGlubGluZSBib29sIGlzX25ld19wYWdlKCkgY29uc3QgeworICAgIHJldHVybiA6Om5ld19wYWdlKGZpZWxkKTsKKyAgfQorCisgIC8vIFNldCB0aGUganVzdGlmaWNhdGlvbiBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9qdXN0aWZpY2F0aW9uKGludCBqdXN0KSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9qdXN0KGZpZWxkLGp1c3QpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMganVzdGlmaWNhdGlvbgorICBpbmxpbmUgaW50IGp1c3RpZmljYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfanVzdChmaWVsZCk7CisgIH0KKyAgLy8gU2V0IHRoZSBmb3JlZ3JvdW5kIGF0dHJpYnV0ZSBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9mb3JlZ3JvdW5kKGNodHlwZSBmb3JlZ3JvdW5kKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9mb3JlKGZpZWxkLGZvcmVncm91bmQpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMgZm9yZWdyb3VuZCBhdHRyaWJ1dGUKKyAgaW5saW5lIGNodHlwZSBmb3JlKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX2ZvcmUoZmllbGQpOworICB9CisKKyAgLy8gU2V0IHRoZSBiYWNrZ3JvdW5kIGF0dHJpYnV0ZSBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9iYWNrZ3JvdW5kKGNodHlwZSBiYWNrZ3JvdW5kKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9iYWNrKGZpZWxkLGJhY2tncm91bmQpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMgYmFja2dyb3VuZCBhdHRyaWJ1dGUKKyAgaW5saW5lIGNodHlwZSBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiA6OmZpZWxkX2JhY2soZmllbGQpOworICB9CisKKyAgLy8gU2V0IHRoZSBwYWRkaW5nIGNoYXJhY3RlciBmb3IgdGhlIGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9wYWRfY2hhcmFjdGVyKGludCBwYWRkaW5nKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF9wYWQoZmllbGQsIHBhZGRpbmcpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSBmaWVsZHMgcGFkZGluZyBjaGFyYWN0ZXIKKyAgaW5saW5lIGludCBwYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfcGFkKGZpZWxkKTsKKyAgfQorCisgIC8vIFN3aXRjaCBvbiB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vbiAoRmllbGRfT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpmaWVsZF9vcHRzX29uIChmaWVsZCwgb3B0cykpOworICB9CisKKyAgLy8gU3dpdGNoIG9mZiB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vZmYgKEZpZWxkX09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6ZmllbGRfb3B0c19vZmYgKGZpZWxkLCBvcHRzKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZmllbGRzIG9wdGlvbnMKKyAgaW5saW5lIEZpZWxkX09wdGlvbnMgb3B0aW9ucyAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfb3B0cyAoZmllbGQpOworICB9CisKKyAgLy8gU2V0IHRoZSBmaWVsZHMgb3B0aW9ucworICBpbmxpbmUgdm9pZCBzZXRfb3B0aW9ucyAoRmllbGRfT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfZmllbGRfb3B0cyAoZmllbGQsIG9wdHMpKTsKKyAgfQorCisgIC8vIE1hcmsgdGhlIGZpZWxkIGFzIGNoYW5nZWQKKyAgaW5saW5lIHZvaWQgc2V0X2NoYW5nZWQoYm9vbCBjaGFuZ2VGbGFnID0gVFJVRSkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfc3RhdHVzKGZpZWxkLGNoYW5nZUZsYWcpKTsKKyAgfQorCisgIC8vIFRlc3Qgd2hldGhlciBvciBub3QgdGhlIGZpZWxkIGlzIG1hcmtlZCBhcyBjaGFuZ2VkCisgIGlubGluZSBib29sIGNoYW5nZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfc3RhdHVzKGZpZWxkKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpZWxkIGluIHRoZSBmaWVsZCBhcnJheSBvZiBhIGZvcm0KKyAgLy8gb3IgLTEgaWYgdGhlIGZpZWxkIGlzIG5vdCBhc3NvY2lhdGVkIHRvIGEgZm9ybQorICBpbmxpbmUgaW50IChpbmRleCkoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZmllbGRfaW5kZXgoZmllbGQpOworICB9CisKKyAgLy8gU3RvcmUgYSB2YWx1ZSBpbiBhIGZpZWxkcyBidWZmZXIuIFRoZSBkZWZhdWx0IGJ1ZmZlciBpcyBuci4gMAorICBpbmxpbmUgdm9pZCBzZXRfdmFsdWUoY29uc3QgY2hhciAqdmFsLCBpbnQgYnVmZmVyID0gMCkgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfYnVmZmVyKGZpZWxkLGJ1ZmZlcix2YWwpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIGZpZWxkcyBidWZmZXIuIFRoZSBkZWZhdWx0IGJ1ZmZlciBpcyBuci4gMAorICBpbmxpbmUgY2hhciogdmFsdWUoaW50IGJ1ZmZlciA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmaWVsZF9idWZmZXIoZmllbGQsYnVmZmVyKTsKKyAgfQorCisgIC8vIFNldCB0aGUgdmFsaWRhdGlvbiB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgaW5saW5lIHZvaWQgc2V0X2ZpZWxkdHlwZShOQ3Vyc2VzRmllbGRUeXBlJiBmKSB7CisgICAgZnR5cGUgPSAmZjsKKyAgICBmLnNldCgqdGhpcyk7IC8vIEEgZ29vZCBmcmllbmQgbWF5IGRvIHRoYXQuLi4KKyAgfQorCisgIC8vIFJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIHR5cGUgb2YgdGhlIGZpZWxkLgorICBpbmxpbmUgTkN1cnNlc0ZpZWxkVHlwZSogZmllbGR0eXBlKCkgY29uc3QgeworICAgIHJldHVybiBmdHlwZTsKKyAgfQorCit9OworCisgIC8vIFRoaXMgYXJlIHRoZSBidWlsdC1pbiBob29rIGZ1bmN0aW9ucyBpbiB0aGlzIEMrKyBiaW5kaW5nLiBJbiBDKysgd2UgdXNlCisgIC8vIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucyAoc2VlIGJlbG93IE9uXy4uLl9Jbml0IGFuZCBPbl8uLi5fVGVybWluYXRpb24pCisgIC8vIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGFuIG9iamVjdCBvcmllbnRlZCBtYW5uZXIuCitleHRlcm4gIkMiIHsKKyAgdm9pZCBfbmNfeHhfZnJtX2luaXQoRk9STSAqKTsKKyAgdm9pZCBfbmNfeHhfZnJtX3Rlcm0oRk9STSAqKTsKKyAgdm9pZCBfbmNfeHhfZmxkX2luaXQoRk9STSAqKTsKKyAgdm9pZCBfbmNfeHhfZmxkX3Rlcm0oRk9STSAqKTsKK30KKworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBmb3JtLCB3cmFwcGluZyB0aGUgbG93bGV2ZWwgRk9STSBzdHJ1Y3QKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybSA6IHB1YmxpYyBOQ3Vyc2VzUGFuZWwKK3sKK3Byb3RlY3RlZDoKKyAgRk9STSogZm9ybTsgIC8vIHRoZSBsb3dsZXZlbCBzdHJ1Y3R1cmUKKworcHJpdmF0ZToKKyAgTkN1cnNlc1dpbmRvdyogc3ViOyAgIC8vIHRoZSBzdWJ3aW5kb3cgb2JqZWN0CisgIGJvb2wgYl9zdWJfb3duZXI7ICAgICAvLyBpcyB0aGlzIG91ciBvd24gc3Vid2luZG93PworICBib29sIGJfZnJhbWVkOwkvLyBoYXMgdGhlIGZvcm0gYSBib3JkZXI/CisgIGJvb2wgYl9hdXRvRGVsZXRlOyAgICAvLyBEZWxldGUgZmllbGRzIHdoZW4gZGVsZXRpbmcgZm9ybT8KKworICBOQ3Vyc2VzRm9ybUZpZWxkKiogbXlfZmllbGRzOyAvLyBUaGUgYXJyYXkgb2YgZmllbGRzIGZvciB0aGlzIGZvcm0KKworICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgZm9ybSdzIHVzZXIgZGF0YSBmaWVsZCB0byBsaW5rIHRoZQorICAvLyBGT1JNKiB0byB0aGUgQysrIG9iamVjdCBhbmQgdG8gcHJvdmlkZSBleHRyYSBzcGFjZSBmb3IgYSB1c2VyIHBvaW50ZXIuCisgIHR5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKgkgICAgICAgbV91c2VyOwkgICAgLy8gdGhlIHBvaW50ZXIgZm9yIHRoZSB1c2VyJ3MgZGF0YQorICAgIGNvbnN0IE5DdXJzZXNGb3JtKiBtX2JhY2s7ICAgICAgLy8gYmFja3dhcmQgcG9pbnRlciB0byBDKysgb2JqZWN0CisgICAgY29uc3QgRk9STSoJICAgICAgIG1fb3duZXI7CisgIH0gVXNlckhvb2s7CisKKyAgLy8gR2V0IHRoZSBiYWNrd2FyZCBwb2ludGVyIHRvIHRoZSBDKysgb2JqZWN0IGZyb20gYSBGT1JNCisgIHN0YXRpYyBpbmxpbmUgTkN1cnNlc0Zvcm0qIGdldEhvb2soY29uc3QgRk9STSAqZikgeworICAgIFVzZXJIb29rKiBob29rID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KDo6Zm9ybV91c2VycHRyKGYpKTsKKyAgICBhc3NlcnQoaG9vayAhPSAwICYmIGhvb2stPm1fb3duZXI9PWYpOworICAgIHJldHVybiBjb25zdF9jYXN0PE5DdXJzZXNGb3JtKj4oaG9vay0+bV9iYWNrKTsKKyAgfQorCisgIGZyaWVuZCB2b2lkIF9uY194eF9mcm1faW5pdChGT1JNICopOworICBmcmllbmQgdm9pZCBfbmNfeHhfZnJtX3Rlcm0oRk9STSAqKTsKKyAgZnJpZW5kIHZvaWQgX25jX3h4X2ZsZF9pbml0KEZPUk0gKik7CisgIGZyaWVuZCB2b2lkIF9uY194eF9mbGRfdGVybShGT1JNICopOworCisgIC8vIENhbGN1bGF0ZSBGSUVMRCogYXJyYXkgZm9yIHRoZSBtZW51CisgIEZJRUxEKiogbWFwRmllbGRzKE5DdXJzZXNGb3JtRmllbGQqIG5maWVsZHNbXSk7CisKK3Byb3RlY3RlZDoKKyAgLy8gaW50ZXJuYWwgcm91dGluZXMKKyAgaW5saW5lIHZvaWQgc2V0X3VzZXIodm9pZCAqdXNlcikgeworICAgIFVzZXJIb29rKiB1cHRyID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KDo6Zm9ybV91c2VycHRyIChmb3JtKSk7CisgICAgYXNzZXJ0ICh1cHRyICE9IDAgJiYgdXB0ci0+bV9iYWNrPT10aGlzICYmIHVwdHItPm1fb3duZXI9PWZvcm0pOworICAgIHVwdHItPm1fdXNlciA9IHVzZXI7CisgIH0KKworICBpbmxpbmUgdm9pZCAqZ2V0X3VzZXIoKSB7CisgICAgVXNlckhvb2sqIHVwdHIgPSByZWludGVycHJldF9jYXN0PFVzZXJIb29rKj4oOjpmb3JtX3VzZXJwdHIgKGZvcm0pKTsKKyAgICBhc3NlcnQgKHVwdHIgIT0gMCAmJiB1cHRyLT5tX2JhY2s9PXRoaXMgJiYgdXB0ci0+bV9vd25lcj09Zm9ybSk7CisgICAgcmV0dXJuIHVwdHItPm1fdXNlcjsKKyAgfQorCisgIHZvaWQgSW5pdEZvcm0gKE5DdXJzZXNGb3JtRmllbGQqIEZpZWxkc1tdLAorCQkgYm9vbCB3aXRoX2ZyYW1lLAorCQkgYm9vbCBhdXRvRGVsZXRlRmllbGRzKTsKKworICBpbmxpbmUgdm9pZCBPbkVycm9yIChpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc0Zvcm1FeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyICE9IEVfT0spCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc0Zvcm1FeGNlcHRpb24gKGVycikpOworICB9CisKKyAgLy8gdGhpcyB3cmFwcyB0aGUgZm9ybV9kcml2ZXIgY2FsbC4KKyAgdmlydHVhbCBpbnQgZHJpdmVyIChpbnQgYykgOworCisgIC8vICdJbnRlcm5hbCcgY29uc3RydWN0b3IsIGJ1aWxkcyBhbiBvYmplY3Qgd2l0aG91dCBhc3NvY2lhdGlvbiB0byBhCisgIC8vIGZpZWxkIGFycmF5LgorICBOQ3Vyc2VzRm9ybSggaW50ICBubGluZXMsCisJICAgICAgIGludCAgbmNvbHMsCisJICAgICAgIGludCAgYmVnaW5feSA9IDAsCisJICAgICAgIGludCAgYmVnaW5feCA9IDApCisgICAgOiBOQ3Vyc2VzUGFuZWwobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCksCisgICAgICBmb3JtIChTVEFUSUNfQ0FTVChGT1JNKikoMCkpLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2ZpZWxkcygwKQorICB7CisgIH0KKworcHVibGljOgorICAvLyBDcmVhdGUgZm9ybSBmb3IgdGhlIGRlZmF1bHQgcGFuZWwuCisgIE5DdXJzZXNGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkKiBGaWVsZHNbXSwKKwkgICAgICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLAkgICAgICAvLyByZXNlcnZlIHNwYWNlIGZvciBhIGZyYW1lPworCSAgICAgICBib29sIGF1dG9EZWxldGVfRmllbGRzPUZBTFNFKSAgLy8gZG8gYXV0b21hdGljIGNsZWFudXA/CisgICAgOiBOQ3Vyc2VzUGFuZWwoKSwKKyAgICAgIGZvcm0oMCksCisgICAgICBzdWIoMCksCisgICAgICBiX3N1Yl9vd25lcigwKSwKKyAgICAgIGJfZnJhbWVkKDApLAorICAgICAgYl9hdXRvRGVsZXRlKDApLAorICAgICAgbXlfZmllbGRzKDApCisgIHsKKyAgICBJbml0Rm9ybShGaWVsZHMsIHdpdGhfZnJhbWUsIGF1dG9EZWxldGVfRmllbGRzKTsKKyAgfQorCisgIC8vIENyZWF0ZSBhIGZvcm0gaW4gYSBwYW5lbCB3aXRoIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgc2l6ZS4KKyAgTkN1cnNlc0Zvcm0gKE5DdXJzZXNGb3JtRmllbGQqIEZpZWxkc1tdLAorCSAgICAgICBpbnQgIG5saW5lcywKKwkgICAgICAgaW50ICBuY29scywKKwkgICAgICAgaW50ICBiZWdpbl95LAorCSAgICAgICBpbnQgIGJlZ2luX3gsCisJICAgICAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSwJICAgICAvLyByZXNlcnZlIHNwYWNlIGZvciBhIGZyYW1lPworCSAgICAgICBib29sIGF1dG9EZWxldGVfRmllbGRzPUZBTFNFKSAvLyBkbyBhdXRvbWF0aWMgY2xlYW51cD8KKyAgICA6IE5DdXJzZXNQYW5lbChubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KSwKKyAgICAgIGZvcm0oMCksCisgICAgICBzdWIoMCksCisgICAgICBiX3N1Yl9vd25lcigwKSwKKyAgICAgIGJfZnJhbWVkKDApLAorICAgICAgYl9hdXRvRGVsZXRlKDApLAorICAgICAgbXlfZmllbGRzKDApCisgIHsKKyAgICAgIEluaXRGb3JtKEZpZWxkcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9GaWVsZHMpOworICB9CisKKyAgTkN1cnNlc0Zvcm0mIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzRm9ybSYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBOQ3Vyc2VzUGFuZWw6Om9wZXJhdG9yPShyaHMpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzRm9ybShjb25zdCBOQ3Vyc2VzRm9ybSYgcmhzKQorICAgIDogTkN1cnNlc1BhbmVsKHJocyksCisgICAgICBmb3JtKHJocy5mb3JtKSwKKyAgICAgIHN1YihyaHMuc3ViKSwKKyAgICAgIGJfc3ViX293bmVyKHJocy5iX3N1Yl9vd25lciksCisgICAgICBiX2ZyYW1lZChyaHMuYl9mcmFtZWQpLAorICAgICAgYl9hdXRvRGVsZXRlKHJocy5iX2F1dG9EZWxldGUpLAorICAgICAgbXlfZmllbGRzKHJocy5teV9maWVsZHMpCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNGb3JtKCk7CisKKyAgLy8gU2V0IHRoZSBkZWZhdWx0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmb3JtCisgIHZpcnR1YWwgdm9pZCBzZXREZWZhdWx0QXR0cmlidXRlcygpOworCisgIC8vIFJldHJpZXZlIGN1cnJlbnQgZmllbGQgb2YgdGhlIGZvcm0uCisgIGlubGluZSBOQ3Vyc2VzRm9ybUZpZWxkKiBjdXJyZW50X2ZpZWxkKCkgY29uc3QgeworICAgIHJldHVybiBteV9maWVsZHNbOjpmaWVsZF9pbmRleCg6OmN1cnJlbnRfZmllbGQoZm9ybSkpXTsKKyAgfQorCisgIC8vIFNldCB0aGUgZm9ybXMgc3Vid2luZG93CisgIHZvaWQgc2V0U3ViV2luZG93KE5DdXJzZXNXaW5kb3cmIHN1Yik7CisKKyAgLy8gU2V0IHRoZXNlIGZpZWxkcyBmb3IgdGhlIGZvcm0KKyAgaW5saW5lIHZvaWQgc2V0RmllbGRzKE5DdXJzZXNGb3JtRmllbGQqIEZpZWxkc1tdKSB7CisgICAgT25FcnJvcig6OnNldF9mb3JtX2ZpZWxkcyhmb3JtLG1hcEZpZWxkcyhGaWVsZHMpKSk7CisgIH0KKworICAvLyBSZW1vdmUgdGhlIGZvcm0gZnJvbSB0aGUgc2NyZWVuCisgIGlubGluZSB2b2lkIHVucG9zdCAodm9pZCkgeworICAgIE9uRXJyb3IgKDo6dW5wb3N0X2Zvcm0gKGZvcm0pKTsKKyAgfQorCisgIC8vIFBvc3QgdGhlIGZvcm0gdG8gdGhlIHNjcmVlbiBpZiBmbGFnIGlzIHRydWUsIHVucG9zdCBpdCBvdGhlcndpc2UKKyAgaW5saW5lIHZvaWQgcG9zdChib29sIGZsYWcgPSBUUlVFKSB7CisgICAgT25FcnJvciAoZmxhZyA/IDo6cG9zdF9mb3JtKGZvcm0pIDogOjp1bnBvc3RfZm9ybSAoZm9ybSkpOworICB9CisKKyAgLy8gRGVjb3JhdGlvbnMKKyAgaW5saW5lIHZvaWQgZnJhbWUoY29uc3QgY2hhciAqdGl0bGU9TlVMTCwgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpIHsKKyAgICBpZiAoYl9mcmFtZWQpCisgICAgICBOQ3Vyc2VzUGFuZWw6OmZyYW1lKHRpdGxlLGJ0aXRsZSk7CisgICAgZWxzZQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgIH0KKworICBpbmxpbmUgdm9pZCBib2xkZnJhbWUoY29uc3QgY2hhciAqdGl0bGU9TlVMTCwgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpIHsKKyAgICBpZiAoYl9mcmFtZWQpCisgICAgICBOQ3Vyc2VzUGFuZWw6OmJvbGRmcmFtZSh0aXRsZSxidGl0bGUpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgaW5saW5lIHZvaWQgbGFiZWwoY29uc3QgY2hhciAqdG9wTGFiZWwsIGNvbnN0IGNoYXIgKmJvdHRvbUxhYmVsKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpsYWJlbCh0b3BMYWJlbCxib3R0b21MYWJlbCk7CisgICAgZWxzZQorICAgICAgT25FcnJvcihFX1NZU1RFTV9FUlJPUik7CisgIH0KKworICAvLyAtLS0tLQorICAvLyBIb29rcworICAvLyAtLS0tLQorCisgIC8vIENhbGxlZCBhZnRlciB0aGUgZm9ybSBnZXRzIHJlcG9zaXRpb25lZCBpbiBpdHMgd2luZG93LgorICAvLyBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBpZiB0aGUgZm9ybSBpcyBwb3N0ZWQuCisgIHZpcnR1YWwgdm9pZCBPbl9Gb3JtX0luaXQoKTsKKworICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBmb3JtIGdldHMgcmVwb3NpdGlvbmVkIGluIGl0cyB3aW5kb3cuCisgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGlmIHRoZSBmb3JtIGlzIHVucG9zdGVkLgorICB2aXJ0dWFsIHZvaWQgT25fRm9ybV9UZXJtaW5hdGlvbigpOworCisgIC8vIENhbGxlZCBhZnRlciB0aGUgZmllbGQgYmVjYW1lIHRoZSBjdXJyZW50IGZpZWxkCisgIHZpcnR1YWwgdm9pZCBPbl9GaWVsZF9Jbml0KE5DdXJzZXNGb3JtRmllbGQmIGZpZWxkKTsKKworICAvLyBDYWxsZWQgYmVmb3JlIHRoaXMgZmllbGQgaXMgbGVmdCBhcyBjdXJyZW50IGZpZWxkLgorICB2aXJ0dWFsIHZvaWQgT25fRmllbGRfVGVybWluYXRpb24oTkN1cnNlc0Zvcm1GaWVsZCYgZmllbGQpOworCisgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCB3aW5kb3cgc2l6ZSBmb3IgdGhlIGZvcm0uCisgIHZvaWQgc2NhbGUoaW50JiByb3dzLCBpbnQmIG5jb2xzKSBjb25zdCB7CisgICAgT25FcnJvcig6OnNjYWxlX2Zvcm0oZm9ybSwmcm93cywmbmNvbHMpKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIG51bWJlciBvZiBmaWVsZHMgaW4gdGhlIGZvcm0uCisgIGludCBjb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpmaWVsZF9jb3VudChmb3JtKTsKKyAgfQorCisgIC8vIE1ha2UgdGhlIHBhZ2UgdGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgZm9ybS4KKyAgdm9pZCBzZXRfcGFnZShpbnQgcGFnZU51bSkgeworICAgIE9uRXJyb3IoOjpzZXRfZm9ybV9wYWdlKGZvcm0sIHBhZ2VOdW0pKTsKKyAgfQorCisgIC8vIFJldHJpZXZlIGN1cnJlbnQgcGFnZSBudW1iZXIKKyAgaW50IHBhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6Zm9ybV9wYWdlKGZvcm0pOworICB9CisKKyAgLy8gU3dpdGNoIG9uIHRoZSBmb3JtcyBvcHRpb25zCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb24gKEZvcm1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpmb3JtX29wdHNfb24gKGZvcm0sIG9wdHMpKTsKKyAgfQorCisgIC8vIFN3aXRjaCBvZmYgdGhlIGZvcm1zIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vZmYgKEZvcm1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpmb3JtX29wdHNfb2ZmIChmb3JtLCBvcHRzKSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgZm9ybXMgb3B0aW9ucworICBpbmxpbmUgRm9ybV9PcHRpb25zIG9wdGlvbnMgKCkgY29uc3QgeworICAgIHJldHVybiA6OmZvcm1fb3B0cyAoZm9ybSk7CisgIH0KKworICAvLyBTZXQgdGhlIGZvcm1zIG9wdGlvbnMKKyAgaW5saW5lIHZvaWQgc2V0X29wdGlvbnMgKEZvcm1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfZm9ybV9vcHRzIChmb3JtLCBvcHRzKSk7CisgIH0KKworICAvLyBBcmUgdGhlcmUgbW9yZSBkYXRhIGluIHRoZSBjdXJyZW50IGZpZWxkIGFmdGVyIHRoZSBkYXRhIHNob3duCisgIGlubGluZSBib29sIGRhdGFfYWhlYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6ZGF0YV9haGVhZChmb3JtKTsKKyAgfQorCisgIC8vIEFyZSB0aGVyZSBtb3JlIGRhdGEgaW4gdGhlIGN1cnJlbnQgZmllbGQgYmVmb3JlIHRoZSBkYXRhIHNob3duCisgIGlubGluZSBib29sIGRhdGFfYmVoaW5kKCkgY29uc3QgeworICAgIHJldHVybiA6OmRhdGFfYmVoaW5kKGZvcm0pOworICB9CisKKyAgLy8gUG9zaXRpb24gdGhlIGN1cnNvciB0byB0aGUgY3VycmVudCBmaWVsZAorICBpbmxpbmUgdm9pZCBwb3NpdGlvbl9jdXJzb3IgKCkgeworICAgIE9uRXJyb3IgKDo6cG9zX2Zvcm1fY3Vyc29yIChmb3JtKSk7CisgIH0KKyAgLy8gU2V0IHRoZSBjdXJyZW50IGZpZWxkCisgIGlubGluZSB2b2lkIHNldF9jdXJyZW50KE5DdXJzZXNGb3JtRmllbGQmIEYpIHsKKyAgICBPbkVycm9yICg6OnNldF9jdXJyZW50X2ZpZWxkKGZvcm0sIEYuZmllbGQpKTsKKyAgfQorCisgIC8vIFByb3ZpZGUgYSBkZWZhdWx0IGtleSB2aXJ0dWFsaXphdGlvbi4gVHJhbnNsYXRlIHRoZSBrZXlib2FyZAorICAvLyBjb2RlIGMgaW50byBhIGZvcm0gcmVxdWVzdCBjb2RlLgorICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGhvcGVmdWxseSBzdHJhaWdodGZvcndhcmQKKyAgLy8gbWFwcGluZyBmb3IgdGhlIG1vc3QgY29tbW9uIGtleXN0cm9rZXMgYW5kIGZvcm0gcmVxdWVzdHMuCisgIHZpcnR1YWwgaW50IHZpcnR1YWxpemUoaW50IGMpOworCisgIC8vIE9wZXJhdG9ycworICBpbmxpbmUgTkN1cnNlc0Zvcm1GaWVsZCogb3BlcmF0b3JbXShpbnQgaSkgY29uc3QgeworICAgIGlmICggKGkgPCAwKSB8fCAoaSA+PSA6OmZpZWxkX2NvdW50IChmb3JtKSkgKQorICAgICAgT25FcnJvciAoRV9CQURfQVJHVU1FTlQpOworICAgIHJldHVybiBteV9maWVsZHNbaV07CisgIH0KKworICAvLyBQZXJmb3JtIHRoZSBtZW51J3Mgb3BlcmF0aW9uCisgIC8vIFJldHVybiB0aGUgZmllbGQgd2hlcmUgeW91IGxlZnQgdGhlIGZvcm0uCisgIHZpcnR1YWwgTkN1cnNlc0Zvcm1GaWVsZCogb3BlcmF0b3IoKSh2b2lkKTsKKworICAvLyBFeGNlcHRpb24gaGFuZGxlcnMuIFRoZSBkZWZhdWx0IGlzIGEgQmVlcC4KKyAgdmlydHVhbCB2b2lkIE9uX1JlcXVlc3RfRGVuaWVkKGludCBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIE9uX0ludmFsaWRfRmllbGQoaW50IGMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgT25fVW5rbm93bl9Db21tYW5kKGludCBjKSBjb25zdDsKKworfTsKKworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgaXMgdGhlIHR5cGljYWwgQysrIHR5cGVzYWZlIHdheSB0byBhbGxvdyB0byBhdHRhY2gKKy8vIHVzZXIgZGF0YSB0byBhIGZpZWxkIG9mIGEgZm9ybS4gSXRzIGFzc3VtZWQgdGhhdCB0aGUgdXNlcgorLy8gZGF0YSBiZWxvbmdzIHRvIHNvbWUgY2xhc3MgVC4gVXNlIFQgYXMgdGVtcGxhdGUgYXJndW1lbnQKKy8vIHRvIGNyZWF0ZSBhIFVzZXJGaWVsZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VyRmllbGQgOiBwdWJsaWMgTkN1cnNlc0Zvcm1GaWVsZAoreworcHVibGljOgorICBOQ3Vyc2VzVXNlckZpZWxkIChpbnQgcm93cywKKwkJICAgIGludCBuY29scywKKwkJICAgIGludCBmaXJzdF9yb3cgPSAwLAorCQkgICAgaW50IGZpcnN0X2NvbCA9IDAsCisJCSAgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICAgaW50IG9mZnNjcmVlbl9yb3dzID0gMCwKKwkJICAgIGludCBhZGRpdGlvbmFsX2J1ZmZlcnMgPSAwKQorICAgIDogTkN1cnNlc0Zvcm1GaWVsZCAocm93cywgbmNvbHMsCisJCQlmaXJzdF9yb3csIGZpcnN0X2NvbCwKKwkJCW9mZnNjcmVlbl9yb3dzLCBhZGRpdGlvbmFsX2J1ZmZlcnMpIHsKKyAgICAgIGlmIChmaWVsZCkKKwlPbkVycm9yKDo6c2V0X2ZpZWxkX3VzZXJwdHIoZmllbGQsIFNUQVRJQ19DQVNUKHZvaWQgKikocF9Vc2VyRGF0YSkpKTsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNVc2VyRmllbGQoKSB7fTsKKworICBpbmxpbmUgY29uc3QgVCogVXNlckRhdGEgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oOjpmaWVsZF91c2VycHRyIChmaWVsZCkpOworICB9CisKKyAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRVc2VyRGF0YShjb25zdCBUKiBwX1VzZXJEYXRhKSB7CisgICAgaWYgKGZpZWxkKQorICAgICAgT25FcnJvciAoOjpzZXRfZmllbGRfdXNlcnB0ciAoZmllbGQsIFNUQVRJQ19DQVNUKHZvaWQgKikocF9Vc2VyRGF0YSkpKTsKKyAgfQorfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgc2FtZSBtZWNoYW5pc20gaXMgdXNlZCB0byBhdHRhY2ggdXNlciBkYXRhIHRvIGEgZm9ybQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VyRm9ybSA6IHB1YmxpYyBOQ3Vyc2VzRm9ybQoreworcHJvdGVjdGVkOgorICAvLyAnSW50ZXJuYWwnIGNvbnN0cnVjdG9yLCBidWlsZHMgYW4gb2JqZWN0IHdpdGhvdXQgYXNzb2NpYXRpb24gdG8gYQorICAvLyBmaWVsZCBhcnJheS4KKyAgTkN1cnNlc1VzZXJGb3JtKCBpbnQgIG5saW5lcywKKwkJICAgaW50ICBuY29scywKKwkJICAgaW50ICBiZWdpbl95ID0gMCwKKwkJICAgaW50ICBiZWdpbl94ID0gMCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSkKKyAgICA6IE5DdXJzZXNGb3JtKG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpIHsKKyAgICAgIGlmIChmb3JtKQorCXNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9CisKK3B1YmxpYzoKKyAgTkN1cnNlc1VzZXJGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkIEZpZWxkc1tdLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCisJCSAgIGJvb2wgYXV0b0RlbGV0ZV9GaWVsZHM9RkFMU0UpCisgICAgOiBOQ3Vyc2VzRm9ybSAoRmllbGRzLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0ZpZWxkcykgeworICAgICAgaWYgKGZvcm0pCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgTkN1cnNlc1VzZXJGb3JtIChOQ3Vyc2VzRm9ybUZpZWxkIEZpZWxkc1tdLAorCQkgICBpbnQgbmxpbmVzLAorCQkgICBpbnQgbmNvbHMsCisJCSAgIGludCBiZWdpbl95ID0gMCwKKwkJICAgaW50IGJlZ2luX3ggPSAwLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCisJCSAgIGJvb2wgYXV0b0RlbGV0ZV9GaWVsZHM9RkFMU0UpCisgICAgOiBOQ3Vyc2VzRm9ybSAoRmllbGRzLCBubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94LAorCQkgICB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0ZpZWxkcykgeworICAgICAgaWYgKGZvcm0pCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgdmlydHVhbCB+TkN1cnNlc1VzZXJGb3JtKCkgeworICB9OworCisgIGlubGluZSBUKiBVc2VyRGF0YSAodm9pZCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnZXRfdXNlciAoKSk7CisgIH07CisKKyAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRVc2VyRGF0YSAoY29uc3QgVCogcF9Vc2VyRGF0YSkgeworICAgIGlmIChmb3JtKQorICAgICAgc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH0KKworfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCdWlsdGluIEZpZWxkdHlwZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBBbHBoYV9GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBpbnQgbWluX2ZpZWxkX3dpZHRoOworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsbWluX2ZpZWxkX3dpZHRoKSk7CisgIH0KKworcHVibGljOgorICBBbHBoYV9GaWVsZChpbnQgd2lkdGgpCisgICAgOiBOQ3Vyc2VzRmllbGRUeXBlKFRZUEVfQUxQSEEpLAorICAgICAgbWluX2ZpZWxkX3dpZHRoKHdpZHRoKSB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIEFscGhhbnVtZXJpY19GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBpbnQgbWluX2ZpZWxkX3dpZHRoOworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsbWluX2ZpZWxkX3dpZHRoKSk7CisgIH0KKworcHVibGljOgorICBBbHBoYW51bWVyaWNfRmllbGQoaW50IHdpZHRoKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX0FMTlVNKSwKKyAgICAgIG1pbl9maWVsZF93aWR0aCh3aWR0aCkgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBJbnRlZ2VyX0ZpZWxkIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKK3ByaXZhdGU6CisgIGludCBwcmVjaXNpb247CisgIGxvbmcgbG93ZXJfbGltaXQsIHVwcGVyX2xpbWl0OworCisgIHZvaWQgc2V0KE5DdXJzZXNGb3JtRmllbGQmIGYpIHsKKyAgICBPbkVycm9yKDo6c2V0X2ZpZWxkX3R5cGUoZi5nZXRfZmllbGQoKSxmaWVsZHR5cGUsCisJCQkgICAgIHByZWNpc2lvbixsb3dlcl9saW1pdCx1cHBlcl9saW1pdCkpOworICB9CisKK3B1YmxpYzoKKyAgSW50ZWdlcl9GaWVsZChpbnQgcHJlYywgbG9uZyBsb3c9MEwsIGxvbmcgaGlnaD0wTCkKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9JTlRFR0VSKSwKKyAgICAgIHByZWNpc2lvbihwcmVjKSwgbG93ZXJfbGltaXQobG93KSwgdXBwZXJfbGltaXQoaGlnaCkgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOdW1lcmljX0ZpZWxkIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKK3ByaXZhdGU6CisgIGludCBwcmVjaXNpb247CisgIGRvdWJsZSBsb3dlcl9saW1pdCwgdXBwZXJfbGltaXQ7CisKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSwKKwkJCSAgICAgcHJlY2lzaW9uLGxvd2VyX2xpbWl0LHVwcGVyX2xpbWl0KSk7CisgIH0KKworcHVibGljOgorICBOdW1lcmljX0ZpZWxkKGludCBwcmVjLCBkb3VibGUgbG93PTAuMCwgZG91YmxlIGhpZ2g9MC4wKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX05VTUVSSUMpLAorICAgICAgcHJlY2lzaW9uKHByZWMpLCBsb3dlcl9saW1pdChsb3cpLCB1cHBlcl9saW1pdChoaWdoKSB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICBjaGFyKiByZWdleDsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLHJlZ2V4KSk7CisgIH0KKworICB2b2lkIGNvcHlfcmVnZXgoY29uc3QgY2hhciAqc291cmNlKQorICB7CisgICAgcmVnZXggPSBuZXcgY2hhclsxICsgOjpzdHJsZW4oc291cmNlKV07CisgICAgKDo6c3RyY3B5KShyZWdleCwgc291cmNlKTsKKyAgfQorCitwdWJsaWM6CisgIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZChjb25zdCBjaGFyICpleHByKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShUWVBFX1JFR0VYUCksCisgICAgICByZWdleChOVUxMKQorICB7CisgICAgY29weV9yZWdleChleHByKTsKKyAgfQorCisgIFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBjb3B5X3JlZ2V4KHJocy5yZWdleCk7CisgICAgICBOQ3Vyc2VzRmllbGRUeXBlOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgUmVndWxhcl9FeHByZXNzaW9uX0ZpZWxkKGNvbnN0IFJlZ3VsYXJfRXhwcmVzc2lvbl9GaWVsZCYgcmhzKQorICAgIDogTkN1cnNlc0ZpZWxkVHlwZShyaHMpLAorICAgICAgcmVnZXgoTlVMTCkKKyAgeworICAgIGNvcHlfcmVnZXgocmhzLnJlZ2V4KTsKKyAgfQorCisgIH5SZWd1bGFyX0V4cHJlc3Npb25fRmllbGQoKSB7CisgICAgZGVsZXRlW10gcmVnZXg7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIEVudW1lcmF0aW9uX0ZpZWxkIDogcHVibGljIE5DdXJzZXNGaWVsZFR5cGUKK3sKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIqKiBsaXN0OworICBpbnQgY2FzZV9zZW5zaXRpdmU7CisgIGludCBub25fdW5pcXVlX21hdGNoZXM7CisKKyAgdm9pZCBzZXQoTkN1cnNlc0Zvcm1GaWVsZCYgZikgeworICAgIE9uRXJyb3IoOjpzZXRfZmllbGRfdHlwZShmLmdldF9maWVsZCgpLGZpZWxkdHlwZSwKKwkJCSAgICAgbGlzdCxjYXNlX3NlbnNpdGl2ZSxub25fdW5pcXVlX21hdGNoZXMpKTsKKyAgfQorcHVibGljOgorICBFbnVtZXJhdGlvbl9GaWVsZChjb25zdCBjaGFyKiBlbnVtc1tdLAorCQkgICAgYm9vbCBjYXNlX3NlbnM9RkFMU0UsCisJCSAgICBib29sIG5vbl91bmlxdWU9RkFMU0UpCisgICAgOiBOQ3Vyc2VzRmllbGRUeXBlKFRZUEVfRU5VTSksCisgICAgICBsaXN0KGVudW1zKSwKKyAgICAgIGNhc2Vfc2Vuc2l0aXZlKGNhc2Vfc2VucyA/IC0xIDogMCksCisgICAgICBub25fdW5pcXVlX21hdGNoZXMobm9uX3VuaXF1ZSA/IC0xIDogMCkgeworICB9CisKKyAgRW51bWVyYXRpb25fRmllbGQmIG9wZXJhdG9yPShjb25zdCBFbnVtZXJhdGlvbl9GaWVsZCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBOQ3Vyc2VzRmllbGRUeXBlOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRW51bWVyYXRpb25fRmllbGQoY29uc3QgRW51bWVyYXRpb25fRmllbGQmIHJocykKKyAgICA6IE5DdXJzZXNGaWVsZFR5cGUocmhzKSwKKyAgICAgIGxpc3QocmhzLmxpc3QpLAorICAgICAgY2FzZV9zZW5zaXRpdmUocmhzLmNhc2Vfc2Vuc2l0aXZlKSwKKyAgICAgIG5vbl91bmlxdWVfbWF0Y2hlcyhyaHMubm9uX3VuaXF1ZV9tYXRjaGVzKQorICB7CisgIH0KK307CisKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIElQVjRfQWRkcmVzc19GaWVsZCA6IHB1YmxpYyBOQ3Vyc2VzRmllbGRUeXBlCit7Citwcml2YXRlOgorICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlKSk7CisgIH0KKworcHVibGljOgorICBJUFY0X0FkZHJlc3NfRmllbGQoKSA6IE5DdXJzZXNGaWVsZFR5cGUoVFlQRV9JUFY0KSB7CisgIH0KK307CisKK2V4dGVybiAiQyIgeworICBib29sIF9uY194eF9mbGRfZmNoZWNrKEZJRUxEICosIGNvbnN0IHZvaWQqKTsKKyAgYm9vbCBfbmNfeHhfZmxkX2NjaGVjayhpbnQgYywgY29uc3Qgdm9pZCAqKTsKKyAgdm9pZCogX25jX3h4X2ZsZF9tYWtlYXJnKHZhX2xpc3QqKTsKK30KKworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFVzZXItRGVmaW5lZCBGaWVsZHR5cGVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworY2xhc3MgTkNVUlNFU19JTVBFWFAgVXNlckRlZmluZWRGaWVsZFR5cGUgOiBwdWJsaWMgTkN1cnNlc0ZpZWxkVHlwZQoreworICBmcmllbmQgY2xhc3MgVURGX0luaXQ7IC8vIEludGVybmFsIGhlbHBlciB0byBzZXQgdXAgc3RhdGljcworcHJpdmF0ZToKKyAgLy8gRm9yIGFsbCBDKysgZGVmaW5lZCBmaWVsZHR5cGVzIHdlIG5lZWQgb25seSBvbmUgZ2VuZXJpYyBsb3dsZXZlbAorICAvLyBGSUVMRFRZUEUqIGVsZW1lbnQuCisgIHN0YXRpYyBGSUVMRFRZUEUqIGdlbmVyaWNfZmllbGR0eXBlOworCitwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgYXJlIHRoZSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGxvdyBsZXZlbCBsaWJmb3JtcyBmdW5jdGlvbnMKKyAgLy8gdG8gY29uc3RydWN0IGEgZmllbGR0eXBlLgorICBmcmllbmQgYm9vbCBfbmNfeHhfZmxkX2ZjaGVjayhGSUVMRCAqLCBjb25zdCB2b2lkKik7CisgIGZyaWVuZCBib29sIF9uY194eF9mbGRfY2NoZWNrKGludCBjLCBjb25zdCB2b2lkICopOworICBmcmllbmQgdm9pZCogX25jX3h4X2ZsZF9tYWtlYXJnKHZhX2xpc3QqKTsKKworICB2b2lkIHNldChOQ3Vyc2VzRm9ybUZpZWxkJiBmKSB7CisgICAgT25FcnJvcig6OnNldF9maWVsZF90eXBlKGYuZ2V0X2ZpZWxkKCksZmllbGR0eXBlLCZmKSk7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBSZWRlZmluZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGEgZmllbGQgdmFsaWRhdGlvbi4gVGhlIGFyZ3VtZW50CisgIC8vIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB5b3Ugc2hvdWxkIHZhbGlkYXRlLgorICB2aXJ0dWFsIGJvb2wgZmllbGRfY2hlY2soTkN1cnNlc0Zvcm1GaWVsZCYgZikgPSAwOworCisgIC8vIFJlZGVmaW5lIHRoaXMgZnVuY3Rpb24gdG8gZG8gYSBjaGFyYWN0ZXIgdmFsaWRhdGlvbi4gVGhlIGFyZ3VtZW50CisgIC8vIGlzIHRoZSBjaGFyYWN0ZXIgdG8gYmUgdmFsaWRhdGVkLgorICB2aXJ0dWFsIGJvb2wgY2hhcl9jaGVjayAoaW50IGMpID0gMDsKKworcHVibGljOgorICBVc2VyRGVmaW5lZEZpZWxkVHlwZSgpIDogTkN1cnNlc0ZpZWxkVHlwZShnZW5lcmljX2ZpZWxkdHlwZSkgeworICB9Cit9OworCitleHRlcm4gIkMiIHsKKyAgYm9vbCBfbmNfeHhfbmV4dF9jaG9pY2UoRklFTEQqLCBjb25zdCB2b2lkICopOworICBib29sIF9uY194eF9wcmV2X2Nob2ljZShGSUVMRCosIGNvbnN0IHZvaWQgKik7Cit9CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBVc2VyLURlZmluZWQgRmllbGR0eXBlcyB3aXRoIENob2ljZSBmdW5jdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBVc2VyRGVmaW5lZEZpZWxkVHlwZV9XaXRoX0Nob2ljZSA6IHB1YmxpYyBVc2VyRGVmaW5lZEZpZWxkVHlwZQoreworICBmcmllbmQgY2xhc3MgVURGX0luaXQ7IC8vIEludGVybmFsIGhlbHBlciB0byBzZXQgdXAgc3RhdGljcworcHJpdmF0ZToKKyAgLy8gRm9yIGFsbCBDKysgZGVmaW5lZCBmaWVsZHR5cGVzIHdpdGggY2hvaWNlIGZ1bmN0aW9ucyB3ZSBuZWVkIG9ubHkgb25lCisgIC8vIGdlbmVyaWMgbG93bGV2ZWwgRklFTERUWVBFKiBlbGVtZW50LgorICBzdGF0aWMgRklFTERUWVBFKiBnZW5lcmljX2ZpZWxkdHlwZV93aXRoX2Nob2ljZTsKKworICAvLyBUaGlzIGFyZSB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBsb3cgbGV2ZWwgbGliZm9ybXMgZnVuY3Rpb25zCisgIC8vIHRvIGNvbnN0cnVjdCBhIGZpZWxkdHlwZSB3aXRoIGNob2ljZSBmdW5jdGlvbnMuCisgIGZyaWVuZCBib29sIF9uY194eF9uZXh0X2Nob2ljZShGSUVMRCosIGNvbnN0IHZvaWQgKik7CisgIGZyaWVuZCBib29sIF9uY194eF9wcmV2X2Nob2ljZShGSUVMRCosIGNvbnN0IHZvaWQgKik7CisKK3Byb3RlY3RlZDoKKyAgLy8gUmVkZWZpbmUgdGhpcyBmdW5jdGlvbiB0byBkbyB0aGUgcmV0cmlldmFsIG9mIHRoZSBuZXh0IGNob2ljZSB2YWx1ZS4KKyAgLy8gVGhlIGFyZ3VtZW50IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0b2JlIGV4YW1pbmVkLgorICB2aXJ0dWFsIGJvb2wgbmV4dCAgICAoTkN1cnNlc0Zvcm1GaWVsZCYgZikgPSAwOworCisgIC8vIFJlZGVmaW5lIHRoaXMgZnVuY3Rpb24gdG8gZG8gdGhlIHJldHJpZXZhbCBvZiB0aGUgcHJldmlvdXMgY2hvaWNlIHZhbHVlLgorICAvLyBUaGUgYXJndW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRvYmUgZXhhbWluZWQuCisgIHZpcnR1YWwgYm9vbCBwcmV2aW91cyhOQ3Vyc2VzRm9ybUZpZWxkJiBmKSA9IDA7CisKK3B1YmxpYzoKKyAgVXNlckRlZmluZWRGaWVsZFR5cGVfV2l0aF9DaG9pY2UoKSB7CisgICAgZmllbGR0eXBlID0gZ2VuZXJpY19maWVsZHR5cGVfd2l0aF9jaG9pY2U7CisgIH0KK307CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNFU0ZfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzIyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNlc20uaApAQCAtMCwwICsxLDY3MiBAQAorLy8gKiBUaGlzIG1ha2VzIGVtYWNzIGhhcHB5IC0qLU1vZGU6IEMrKzstKi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMywyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogSnVlcmdlbiBQZmVpZmVyLCAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vICRJZDogY3Vyc2VzbS5oLHYgMS4yNSAyMDA1LzA4LzEzIDE4OjEwOjM2IHRvbSBFeHAgJAorCisjaWZuZGVmIE5DVVJTRVNfQ1VSU0VTTV9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19DVVJTRVNNX0hfaW5jbCAxCisKKyNpbmNsdWRlIDxjdXJzZXNwLmg+CisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSA8bWVudS5oPgorfQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgd3JhcHMgdGhlIElURU0gdHlwZSBvZiA8bWVudS5oPgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNNZW51SXRlbQoreworICBmcmllbmQgY2xhc3MgTkN1cnNlc01lbnU7CisKK3Byb3RlY3RlZDoKKyAgSVRFTSAqaXRlbTsKKworICBpbmxpbmUgdm9pZCBPbkVycm9yIChpbnQgZXJyKSBjb25zdCBUSFJPV1MoTkN1cnNlc01lbnVFeGNlcHRpb24pIHsKKyAgICBpZiAoZXJyICE9IEVfT0spCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc01lbnVFeGNlcHRpb24gKGVycikpOworICB9CisKK3B1YmxpYzoKKyAgTkN1cnNlc01lbnVJdGVtIChjb25zdCBjaGFyKiBwX25hbWUgICAgID0gTlVMTCwKKwkJICAgY29uc3QgY2hhciogcF9kZXNjcmlwdCA9IE5VTEwpCisgICAgOiBpdGVtKDApCisgIHsKKyAgICBpdGVtID0gcF9uYW1lID8gOjpuZXdfaXRlbSAocF9uYW1lLCBwX2Rlc2NyaXB0KSA6IFNUQVRJQ19DQVNUKElURU0qKSgwKTsKKyAgICBpZiAocF9uYW1lICYmICFpdGVtKQorICAgICAgT25FcnJvciAoRV9TWVNURU1fRVJST1IpOworICB9CisgIC8vIENyZWF0ZSBhbiBpdGVtLiBJZiB5b3UgcGFzcyBib3RoIHBhcmFtZXRlcnMgYXMgTlVMTCwgYSBkZWxpbWl0aW5nCisgIC8vIGl0ZW0gaXMgY29uc3RydWN0ZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdGVybWluYXRlIGEgbGlzdCBvZgorICAvLyBOQ3Vyc2VzTWVudSBvYmplY3RzLgorCisgIE5DdXJzZXNNZW51SXRlbSYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNNZW51SXRlbSYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNNZW51SXRlbShjb25zdCBOQ3Vyc2VzTWVudUl0ZW0mIHJocykKKyAgICA6IGl0ZW0oMCkKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc01lbnVJdGVtICgpOworICAvLyBSZWxlYXNlIHRoZSBpdGVtcyBtZW1vcnkKKworICBpbmxpbmUgY29uc3QgY2hhciogbmFtZSAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV9uYW1lIChpdGVtKTsKKyAgfQorICAvLyBOYW1lIG9mIHRoZSBpdGVtCisKKyAgaW5saW5lIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX2Rlc2NyaXB0aW9uIChpdGVtKTsKKyAgfQorICAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgaXRlbQorCisgIGlubGluZSBpbnQgKGluZGV4KSAodm9pZCkgY29uc3QgeworICAgIHJldHVybiA6Oml0ZW1faW5kZXggKGl0ZW0pOworICB9CisgIC8vIEluZGV4IG9mIHRoZSBpdGVtIGluIGFuIGl0ZW0gYXJyYXkgKG9yIC0xKQorCisgIGlubGluZSB2b2lkIG9wdGlvbnNfb24gKEl0ZW1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjppdGVtX29wdHNfb24gKGl0ZW0sIG9wdHMpKTsKKyAgfQorICAvLyBTd2l0Y2ggb24gdGhlIGl0ZW1zIG9wdGlvbnMKKworICBpbmxpbmUgdm9pZCBvcHRpb25zX29mZiAoSXRlbV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6Oml0ZW1fb3B0c19vZmYgKGl0ZW0sIG9wdHMpKTsKKyAgfQorICAvLyBTd2l0Y2ggb2ZmIHRoZSBpdGVtJ3Mgb3B0aW9uCisKKyAgaW5saW5lIEl0ZW1fT3B0aW9ucyBvcHRpb25zICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX29wdHMgKGl0ZW0pOworICB9CisgIC8vIFJldHJpZXZlIHRoZSBpdGVtcyBvcHRpb25zCisKKyAgaW5saW5lIHZvaWQgc2V0X29wdGlvbnMgKEl0ZW1fT3B0aW9ucyBvcHRzKSB7CisgICAgT25FcnJvciAoOjpzZXRfaXRlbV9vcHRzIChpdGVtLCBvcHRzKSk7CisgIH0KKyAgLy8gU2V0IHRoZSBpdGVtcyBvcHRpb25zCisKKyAgaW5saW5lIHZvaWQgc2V0X3ZhbHVlIChib29sIGYpIHsKKyAgICBPbkVycm9yICg6OnNldF9pdGVtX3ZhbHVlIChpdGVtLGYpKTsKKyAgfQorICAvLyBTZXQvUmVzZXQgdGhlIGl0ZW1zIHNlbGVjdGlvbiBzdGF0ZQorCisgIGlubGluZSBib29sIHZhbHVlICgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjppdGVtX3ZhbHVlIChpdGVtKTsKKyAgfQorICAvLyBSZXRyaWV2ZSB0aGUgaXRlbXMgc2VsZWN0aW9uIHN0YXRlCisKKyAgaW5saW5lIGJvb2wgdmlzaWJsZSAoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV92aXNpYmxlIChpdGVtKTsKKyAgfQorICAvLyBSZXRyaWV2ZSB2aXNpYmlsaXR5IG9mIHRoZSBpdGVtCisKKyAgdmlydHVhbCBib29sIGFjdGlvbigpOworICAvLyBQZXJmb3JtIGFuIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtOyB5b3UgbWF5IHVzZSB0aGlzIGluIGFuCisgIC8vIHVzZXIgc3VwcGxpZWQgZHJpdmVyIGZvciBhIG1lbnU7IHlvdSBtYXkgZGVyaXZlIGZyb20gdGhpcyBjbGFzcyBhbmQKKyAgLy8gb3ZlcmxvYWQgYWN0aW9uKCkgdG8gc3VwcGx5IGl0ZW1zIHdpdGggZGlmZmVyZW50IGFjdGlvbnMuCisgIC8vIElmIGFuIGFjdGlvbiByZXR1cm5zIHRydWUsIHRoZSBtZW51IHdpbGwgYmUgZXhpdGVkLiBUaGUgZGVmYXVsdCBhY3Rpb24KKyAgLy8gaXMgdG8gZG8gbm90aGluZy4KK307CisKKy8vIFByb3RvdHlwZSBmb3IgYW4gaXRlbXMgY2FsbGJhY2sgZnVuY3Rpb24uCit0eXBlZGVmIGJvb2wgSVRFTUNBTExCQUNLKE5DdXJzZXNNZW51SXRlbSYpOworCisvLyBJZiB5b3UgZG9uJ3QgbGlrZSB0byBjcmVhdGUgYSBjaGlsZCBjbGFzcyBmb3IgaW5kaXZpZHVhbCBpdGVtcyB0bworLy8gb3ZlcmxvYWQgYWN0aW9uKCksIHlvdSBtYXkgdXNlIHRoaXMgY2xhc3MgYW5kIHByb3ZpZGUgYSBjYWxsYmFjaworLy8gZnVuY3Rpb24gcG9pbnRlciBmb3IgaXRlbXMuCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudUNhbGxiYWNrSXRlbSA6IHB1YmxpYyBOQ3Vyc2VzTWVudUl0ZW0KK3sKK3ByaXZhdGU6CisgIElURU1DQUxMQkFDSyogcF9mY3Q7CisKK3B1YmxpYzoKKyAgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0oSVRFTUNBTExCQUNLKiBmY3QgICAgICAgPSBOVUxMLAorCQkJICBjb25zdCBjaGFyKiBwX25hbWUgICAgICA9IE5VTEwsCisJCQkgIGNvbnN0IGNoYXIqIHBfZGVzY3JpcHQgID0gTlVMTCApCisgICAgOiBOQ3Vyc2VzTWVudUl0ZW0gKHBfbmFtZSwgcF9kZXNjcmlwdCksCisgICAgICBwX2ZjdCAoZmN0KSB7CisgIH0KKworICBOQ3Vyc2VzTWVudUNhbGxiYWNrSXRlbSYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNNZW51Q2FsbGJhY2tJdGVtJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0oY29uc3QgTkN1cnNlc01lbnVDYWxsYmFja0l0ZW0mIHJocykKKyAgICA6IE5DdXJzZXNNZW51SXRlbShyaHMpLAorICAgICAgcF9mY3QoMCkKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc01lbnVDYWxsYmFja0l0ZW0oKTsKKworICBib29sIGFjdGlvbigpOworfTsKKworICAvLyBUaGlzIGFyZSB0aGUgYnVpbHQtaW4gaG9vayBmdW5jdGlvbnMgaW4gdGhpcyBDKysgYmluZGluZy4gSW4gQysrIHdlIHVzZQorICAvLyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMgKHNlZSBiZWxvdyBPbl8uLi5fSW5pdCBhbmQgT25fLi4uX1Rlcm1pbmF0aW9uKQorICAvLyB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhbiBvYmplY3Qgb3JpZW50ZWQgbWFubmVyLgorZXh0ZXJuICJDIiB7CisgIHZvaWQgX25jX3h4X21udV9pbml0KE1FTlUgKik7CisgIHZvaWQgX25jX3h4X21udV90ZXJtKE1FTlUgKik7CisgIHZvaWQgX25jX3h4X2l0bV9pbml0KE1FTlUgKik7CisgIHZvaWQgX25jX3h4X2l0bV90ZXJtKE1FTlUgKik7Cit9CisKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIHdyYXBzIHRoZSBNRU5VIHR5cGUgb2YgPG1lbnUuaD4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudSA6IHB1YmxpYyBOQ3Vyc2VzUGFuZWwKK3sKK3Byb3RlY3RlZDoKKyAgTUVOVSAqbWVudTsKKworcHJpdmF0ZToKKyAgTkN1cnNlc1dpbmRvdyogc3ViOyAgIC8vIHRoZSBzdWJ3aW5kb3cgb2JqZWN0CisgIGJvb2wgYl9zdWJfb3duZXI7ICAgICAvLyBpcyB0aGlzIG91ciBvd24gc3Vid2luZG93PworICBib29sIGJfZnJhbWVkOyAgICAgICAgLy8gaGFzIHRoZSBtZW51IGEgYm9yZGVyPworICBib29sIGJfYXV0b0RlbGV0ZTsgICAgLy8gRGVsZXRlIGl0ZW1zIHdoZW4gZGVsZXRpbmcgbWVudT8KKworICBOQ3Vyc2VzTWVudUl0ZW0qKiBteV9pdGVtczsgLy8gVGhlIGFycmF5IG9mIGl0ZW1zIGZvciB0aGlzIG1lbnUKKworICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciB0aGUgbWVudSdzIHVzZXIgZGF0YSBmaWVsZCB0byBsaW5rIHRoZQorICAvLyBNRU5VKiB0byB0aGUgQysrIG9iamVjdCBhbmQgdG8gcHJvdmlkZSBleHRyYSBzcGFjZSBmb3IgYSB1c2VyIHBvaW50ZXIuCisgIHR5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiAgICAgICAgICAgICAgbV91c2VyOyAgICAgIC8vIHRoZSBwb2ludGVyIGZvciB0aGUgdXNlcidzIGRhdGEKKyAgICBjb25zdCBOQ3Vyc2VzTWVudSogbV9iYWNrOyAgICAgIC8vIGJhY2t3YXJkIHBvaW50ZXIgdG8gQysrIG9iamVjdAorICAgIGNvbnN0IE1FTlUqICAgICAgICBtX293bmVyOworICB9IFVzZXJIb29rOworCisgIC8vIEdldCB0aGUgYmFja3dhcmQgcG9pbnRlciB0byB0aGUgQysrIG9iamVjdCBmcm9tIGEgTUVOVQorICBzdGF0aWMgaW5saW5lIE5DdXJzZXNNZW51KiBnZXRIb29rKGNvbnN0IE1FTlUgKm0pIHsKKyAgICBVc2VySG9vayogaG9vayA9IFNUQVRJQ19DQVNUKFVzZXJIb29rKikoOjptZW51X3VzZXJwdHIobSkpOworICAgIGFzc2VydChob29rICE9IDAgJiYgaG9vay0+bV9vd25lcj09bSk7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TkN1cnNlc01lbnUqPihob29rLT5tX2JhY2spOworICB9CisKKyAgZnJpZW5kIHZvaWQgX25jX3h4X21udV9pbml0KE1FTlUgKik7CisgIGZyaWVuZCB2b2lkIF9uY194eF9tbnVfdGVybShNRU5VICopOworICBmcmllbmQgdm9pZCBfbmNfeHhfaXRtX2luaXQoTUVOVSAqKTsKKyAgZnJpZW5kIHZvaWQgX25jX3h4X2l0bV90ZXJtKE1FTlUgKik7CisKKyAgLy8gQ2FsY3VsYXRlIElURU0qIGFycmF5IGZvciB0aGUgbWVudQorICBJVEVNKiogbWFwSXRlbXMoTkN1cnNlc01lbnVJdGVtKiBuaXRlbXNbXSk7CisKK3Byb3RlY3RlZDoKKyAgLy8gaW50ZXJuYWwgcm91dGluZXMKKyAgaW5saW5lIHZvaWQgc2V0X3VzZXIodm9pZCAqdXNlcikgeworICAgIFVzZXJIb29rKiB1cHRyID0gU1RBVElDX0NBU1QoVXNlckhvb2sqKSg6Om1lbnVfdXNlcnB0ciAobWVudSkpOworICAgIGFzc2VydCAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1tZW51KTsKKyAgICB1cHRyLT5tX3VzZXIgPSB1c2VyOworICB9CisKKyAgaW5saW5lIHZvaWQgKmdldF91c2VyKCkgeworICAgIFVzZXJIb29rKiB1cHRyID0gU1RBVElDX0NBU1QoVXNlckhvb2sqKSg6Om1lbnVfdXNlcnB0ciAobWVudSkpOworICAgIGFzc2VydCAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1tZW51KTsKKyAgICByZXR1cm4gdXB0ci0+bV91c2VyOworICB9CisKKyAgdm9pZCBJbml0TWVudSAoTkN1cnNlc01lbnVJdGVtKiBtZW51W10sCisJCSBib29sIHdpdGhfZnJhbWUsCisJCSBib29sIGF1dG9EZWxldGVJdGVtcyk7CisKKyAgaW5saW5lIHZvaWQgT25FcnJvciAoaW50IGVycikgY29uc3QgVEhST1dTKE5DdXJzZXNNZW51RXhjZXB0aW9uKSB7CisgICAgaWYgKGVyciAhPSBFX09LKQorICAgICAgVEhST1cobmV3IE5DdXJzZXNNZW51RXhjZXB0aW9uICh0aGlzLCBlcnIpKTsKKyAgfQorCisgIC8vIHRoaXMgd3JhcHMgdGhlIG1lbnVfZHJpdmVyIGNhbGwuCisgIHZpcnR1YWwgaW50IGRyaXZlciAoaW50IGMpIDsKKworICAvLyAnSW50ZXJuYWwnIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG1lbnUgd2l0aG91dCBhc3NvY2lhdGlvbiB0bworICAvLyBhbiBhcnJheSBvZiBpdGVtcy4KKyAgTkN1cnNlc01lbnUoIGludCAgbmxpbmVzLAorCSAgICAgICBpbnQgIG5jb2xzLAorCSAgICAgICBpbnQgIGJlZ2luX3kgPSAwLAorCSAgICAgICBpbnQgIGJlZ2luX3ggPSAwKQorICAgIDogTkN1cnNlc1BhbmVsKG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpLAorICAgICAgbWVudSAoU1RBVElDX0NBU1QoTUVOVSopKDApKSwKKyAgICAgIHN1YigwKSwKKyAgICAgIGJfc3ViX293bmVyKDApLAorICAgICAgYl9mcmFtZWQoMCksCisgICAgICBiX2F1dG9EZWxldGUoMCksCisgICAgICBteV9pdGVtcygwKQorICB7CisgIH0KKworcHVibGljOgorICAvLyBNYWtlIGEgZnVsbCB3aW5kb3cgc2l6ZSBtZW51CisgIE5DdXJzZXNNZW51IChOQ3Vyc2VzTWVudUl0ZW0qIEl0ZW1zW10sCisJICAgICAgIGJvb2wgd2l0aF9mcmFtZT1GQUxTRSwgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIGEgZnJhbWU/CisJICAgICAgIGJvb2wgYXV0b0RlbGV0ZV9JdGVtcz1GQUxTRSkgIC8vIEF1dG9jbGVhbnVwIG9mIEl0ZW1zPworICAgIDogTkN1cnNlc1BhbmVsKCksCisgICAgICBtZW51KDApLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2l0ZW1zKDApCisgIHsKKyAgICAgIEluaXRNZW51KEl0ZW1zLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0l0ZW1zKTsKKyAgfQorCisgIC8vIE1ha2UgYSBtZW51IHdpdGggYSB3aW5kb3cgb2YgdGhpcyBzaXplLgorICBOQ3Vyc2VzTWVudSAoTkN1cnNlc01lbnVJdGVtKiBJdGVtc1tdLAorCSAgICAgICBpbnQgIG5saW5lcywKKwkgICAgICAgaW50ICBuY29scywKKwkgICAgICAgaW50ICBiZWdpbl95ID0gMCwKKwkgICAgICAgaW50ICBiZWdpbl94ID0gMCwKKwkgICAgICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFLCAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgYSBmcmFtZT8KKwkgICAgICAgYm9vbCBhdXRvRGVsZXRlX0l0ZW1zPUZBTFNFKSAgLy8gQXV0b2NsZWFudXAgb2YgSXRlbXM/CisgICAgOiBOQ3Vyc2VzUGFuZWwobmxpbmVzLCBuY29scywgYmVnaW5feSwgYmVnaW5feCksCisgICAgICBtZW51KDApLAorICAgICAgc3ViKDApLAorICAgICAgYl9zdWJfb3duZXIoMCksCisgICAgICBiX2ZyYW1lZCgwKSwKKyAgICAgIGJfYXV0b0RlbGV0ZSgwKSwKKyAgICAgIG15X2l0ZW1zKDApCisgIHsKKyAgICAgIEluaXRNZW51KEl0ZW1zLCB3aXRoX2ZyYW1lLCBhdXRvRGVsZXRlX0l0ZW1zKTsKKyAgfQorCisgIE5DdXJzZXNNZW51JiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc01lbnUmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc1BhbmVsOjpvcGVyYXRvcj0ocmhzKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTkN1cnNlc01lbnUoY29uc3QgTkN1cnNlc01lbnUmIHJocykKKyAgICA6IE5DdXJzZXNQYW5lbChyaHMpLAorICAgICAgbWVudShyaHMubWVudSksCisgICAgICBzdWIocmhzLnN1YiksCisgICAgICBiX3N1Yl9vd25lcihyaHMuYl9zdWJfb3duZXIpLAorICAgICAgYl9mcmFtZWQocmhzLmJfZnJhbWVkKSwKKyAgICAgIGJfYXV0b0RlbGV0ZShyaHMuYl9hdXRvRGVsZXRlKSwKKyAgICAgIG15X2l0ZW1zKHJocy5teV9pdGVtcykKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc01lbnUgKCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIG1lbnVzIHN1YndpbmRvdworICBpbmxpbmUgTkN1cnNlc1dpbmRvdyYgc3ViV2luZG93KCkgY29uc3QgeworICAgIGFzc2VydChzdWIhPU5VTEwpOworICAgIHJldHVybiAqc3ViOworICB9CisKKyAgLy8gU2V0IHRoZSBtZW51cyBzdWJ3aW5kb3cKKyAgdm9pZCBzZXRTdWJXaW5kb3coTkN1cnNlc1dpbmRvdyYgc3ViKTsKKworICAvLyBTZXQgdGhlc2UgaXRlbXMgZm9yIHRoZSBtZW51CisgIGlubGluZSB2b2lkIHNldEl0ZW1zKE5DdXJzZXNNZW51SXRlbSogSXRlbXNbXSkgeworICAgIE9uRXJyb3IoOjpzZXRfbWVudV9pdGVtcyhtZW51LG1hcEl0ZW1zKEl0ZW1zKSkpOworICB9CisKKyAgLy8gUmVtb3ZlIHRoZSBtZW51IGZyb20gdGhlIHNjcmVlbgorICBpbmxpbmUgdm9pZCB1bnBvc3QgKHZvaWQpIHsKKyAgICBPbkVycm9yICg6OnVucG9zdF9tZW51IChtZW51KSk7CisgIH0KKworICAvLyBQb3N0IHRoZSBtZW51IHRvIHRoZSBzY3JlZW4gaWYgZmxhZyBpcyB0cnVlLCB1bnBvc3QgaXQgb3RoZXJ3aXNlCisgIGlubGluZSB2b2lkIHBvc3QoYm9vbCBmbGFnID0gVFJVRSkgeworICAgIGZsYWcgPyBPbkVycm9yICg6OnBvc3RfbWVudShtZW51KSkgOiBPbkVycm9yICg6OnVucG9zdF9tZW51IChtZW51KSk7CisgIH0KKworICAvLyBHZXQgdGhlIG51bWVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgZm9yIHRoaXMgbWVudQorICBpbmxpbmUgdm9pZCBzY2FsZSAoaW50JiBtcm93cywgaW50JiBtY29scykgY29uc3QgIHsKKyAgICBPbkVycm9yICg6OnNjYWxlX21lbnUgKG1lbnUsICZtcm93cywgJm1jb2xzKSk7CisgIH0KKworICAvLyBTZXQgdGhlIGZvcm1hdCBvZiB0aGlzIG1lbnUKKyAgaW5saW5lIHZvaWQgc2V0X2Zvcm1hdChpbnQgbXJvd3MsIGludCBtY29scykgeworICAgIE9uRXJyb3IgKDo6c2V0X21lbnVfZm9ybWF0KG1lbnUsIG1yb3dzLCBtY29scykpOworICB9CisKKyAgLy8gR2V0IHRoZSBmb3JtYXQgb2YgdGhpcyBtZW51CisgIGlubGluZSB2b2lkIG1lbnVfZm9ybWF0KGludCYgcm93cyxpbnQmIG5jb2xzKSB7CisgICAgOjptZW51X2Zvcm1hdChtZW51LCZyb3dzLCZuY29scyk7CisgIH0KKworICAvLyBJdGVtcyBvZiB0aGUgbWVudQorICBpbmxpbmUgTkN1cnNlc01lbnVJdGVtKiBpdGVtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKm15X2l0ZW1zOworICB9CisKKyAgLy8gR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcyBtZW51CisgIGlubGluZSBpbnQgY291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6aXRlbV9jb3VudChtZW51KTsKKyAgfQorCisgIC8vIEdldCB0aGUgY3VycmVudCBpdGVtIChpLmUuIHRoZSBvbmUgdGhlIGN1cnNvciBpcyBsb2NhdGVkKQorICBpbmxpbmUgTkN1cnNlc01lbnVJdGVtKiBjdXJyZW50X2l0ZW0oKSBjb25zdCB7CisgICAgcmV0dXJuIG15X2l0ZW1zWzo6aXRlbV9pbmRleCg6OmN1cnJlbnRfaXRlbShtZW51KSldOworICB9CisKKyAgLy8gR2V0IHRoZSBtYXJrZXIgc3RyaW5nCisgIGlubGluZSBjb25zdCBjaGFyKiBtYXJrKCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfbWFyayhtZW51KTsKKyAgfQorCisgIC8vIFNldCB0aGUgbWFya2VyIHN0cmluZworICBpbmxpbmUgdm9pZCBzZXRfbWFyayhjb25zdCBjaGFyICptYXJrZXIpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X21hcmsgKG1lbnUsIG1hcmtlcikpOworICB9CisKKyAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0IGNvZGUgYworICBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIqIHJlcXVlc3RfbmFtZShpbnQgYykgeworICAgIHJldHVybiA6Om1lbnVfcmVxdWVzdF9uYW1lKGMpOworICB9CisKKyAgLy8gR2V0IHRoZSBjdXJyZW50IHBhdHRlcm4KKyAgaW5saW5lIGNoYXIqIHBhdHRlcm4oKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9wYXR0ZXJuKG1lbnUpOworICB9CisKKyAgLy8gdHJ1ZSBpZiB0aGVyZSBpcyBhIHBhdHRlcm4gbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBzZXRfcGF0dGVybiAoY29uc3QgY2hhciAqcGF0KTsKKworICAvLyBzZXQgdGhlIGRlZmF1bHQgYXR0cmlidXRlcyBmb3IgdGhlIG1lbnUKKyAgLy8gaS5lLiBzZXQgZm9yZSwgYmFjayBhbmQgZ3JleSBhdHRyaWJ1dGUKKyAgdmlydHVhbCB2b2lkIHNldERlZmF1bHRBdHRyaWJ1dGVzKCk7CisKKyAgLy8gR2V0IHRoZSBtZW51cyBiYWNrZ3JvdW5kIGF0dHJpYnV0ZXMKKyAgaW5saW5lIGNodHlwZSBiYWNrKCkgY29uc3QgeworICAgIHJldHVybiA6Om1lbnVfYmFjayhtZW51KTsKKyAgfQorCisgIC8vIEdldCB0aGUgbWVudXMgZm9yZWdyb3VuZCBhdHRyaWJ1dGVzCisgIGlubGluZSBjaHR5cGUgZm9yZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptZW51X2ZvcmUobWVudSk7CisgIH0KKworICAvLyBHZXQgdGhlIG1lbnVzIGdyZXkgYXR0cmlidXRlcyAodXNlZCBmb3IgdW5zZWxlY3RhYmxlIGl0ZW1zKQorICBpbmxpbmUgY2h0eXBlIGdyZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9ncmV5KG1lbnUpOworICB9CisKKyAgLy8gU2V0IHRoZSBtZW51cyBiYWNrZ3JvdW5kIGF0dHJpYnV0ZXMKKyAgaW5saW5lIGNodHlwZSBzZXRfYmFja2dyb3VuZChjaHR5cGUgYSkgeworICAgIHJldHVybiA6OnNldF9tZW51X2JhY2sobWVudSxhKTsKKyAgfQorCisgIC8vIFNldCB0aGUgbWVudXMgZm9yZWdyb3VuZCBhdHRyaWJ1dGVzCisgIGlubGluZSBjaHR5cGUgc2V0X2ZvcmVncm91bmQoY2h0eXBlIGEpIHsKKyAgICByZXR1cm4gOjpzZXRfbWVudV9mb3JlKG1lbnUsYSk7CisgIH0KKworICAvLyBTZXQgdGhlIG1lbnVzIGdyZXkgYXR0cmlidXRlcyAodXNlZCBmb3IgdW5zZWxlY3RhYmxlIGl0ZW1zKQorICBpbmxpbmUgY2h0eXBlIHNldF9ncmV5KGNodHlwZSBhKSB7CisgICAgcmV0dXJuIDo6c2V0X21lbnVfZ3JleShtZW51LGEpOworICB9CisKKyAgaW5saW5lIHZvaWQgb3B0aW9uc19vbiAoTWVudV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6Om1lbnVfb3B0c19vbiAobWVudSxvcHRzKSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBvcHRpb25zX29mZihNZW51X09wdGlvbnMgb3B0cykgeworICAgIE9uRXJyb3IgKDo6bWVudV9vcHRzX29mZihtZW51LG9wdHMpKTsKKyAgfQorCisgIGlubGluZSBNZW51X09wdGlvbnMgb3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gOjptZW51X29wdHMobWVudSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBzZXRfb3B0aW9ucyAoTWVudV9PcHRpb25zIG9wdHMpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X29wdHMgKG1lbnUsb3B0cykpOworICB9CisKKyAgaW5saW5lIGludCBwYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6bWVudV9wYWQobWVudSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBzZXRfcGFkIChpbnQgcGFkY2gpIHsKKyAgICBPbkVycm9yICg6OnNldF9tZW51X3BhZCAobWVudSwgcGFkY2gpKTsKKyAgfQorCisgIC8vIFBvc2l0aW9uIHRoZSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgaXRlbQorICBpbmxpbmUgdm9pZCBwb3NpdGlvbl9jdXJzb3IgKCkgY29uc3QgeworICAgIE9uRXJyb3IgKDo6cG9zX21lbnVfY3Vyc29yIChtZW51KSk7CisgIH0KKworICAvLyBTZXQgdGhlIGN1cnJlbnQgaXRlbQorICBpbmxpbmUgdm9pZCBzZXRfY3VycmVudChOQ3Vyc2VzTWVudUl0ZW0mIEkpIHsKKyAgICBPbkVycm9yICg6OnNldF9jdXJyZW50X2l0ZW0obWVudSwgSS5pdGVtKSk7CisgIH0KKworICAvLyBHZXQgdGhlIGN1cnJlbnQgdG9wIHJvdyBvZiB0aGUgbWVudQorICBpbmxpbmUgaW50IHRvcF9yb3cgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gOjp0b3Bfcm93IChtZW51KTsKKyAgfQorCisgIC8vIFNldCB0aGUgY3VycmVudCB0b3Agcm93IG9mIHRoZSBtZW51CisgIGlubGluZSB2b2lkIHNldF90b3Bfcm93IChpbnQgcm93KSB7CisgICAgT25FcnJvciAoOjpzZXRfdG9wX3JvdyAobWVudSwgcm93KSk7CisgIH0KKworICAvLyBzcGFjaW5nIGNvbnRyb2wKKyAgLy8gU2V0IHRoZSBzcGFjaW5nIGZvciB0aGUgbWVudQorICBpbmxpbmUgdm9pZCBzZXRTcGFjaW5nKGludCBzcGNfZGVzY3JpcHRpb24sCisJCQkgaW50IHNwY19yb3dzLAorCQkJIGludCBzcGNfY29sdW1ucykgeworICAgIE9uRXJyb3IoOjpzZXRfbWVudV9zcGFjaW5nKG1lbnUsCisJCQkgICAgICAgc3BjX2Rlc2NyaXB0aW9uLAorCQkJICAgICAgIHNwY19yb3dzLAorCQkJICAgICAgIHNwY19jb2x1bW5zKSk7CisgIH0KKworICAvLyBHZXQgdGhlIHNwYWNpbmcgaW5mbyBmb3IgdGhlIG1lbnUKKyAgaW5saW5lIHZvaWQgU3BhY2luZyhpbnQmIHNwY19kZXNjcmlwdGlvbiwKKwkJICAgICAgaW50JiBzcGNfcm93cywKKwkJICAgICAgaW50JiBzcGNfY29sdW1ucykgY29uc3QgeworICAgIE9uRXJyb3IoOjptZW51X3NwYWNpbmcobWVudSwKKwkJCSAgICZzcGNfZGVzY3JpcHRpb24sCisJCQkgICAmc3BjX3Jvd3MsCisJCQkgICAmc3BjX2NvbHVtbnMpKTsKKyAgfQorCisgIC8vIERlY29yYXRpb25zCisgIGlubGluZSB2b2lkIGZyYW1lKGNvbnN0IGNoYXIgKnRpdGxlPU5VTEwsIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpmcmFtZSh0aXRsZSxidGl0bGUpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgaW5saW5lIHZvaWQgYm9sZGZyYW1lKGNvbnN0IGNoYXIgKnRpdGxlPU5VTEwsIGNvbnN0IGNoYXIqIGJ0aXRsZT1OVUxMKSB7CisgICAgaWYgKGJfZnJhbWVkKQorICAgICAgTkN1cnNlc1BhbmVsOjpib2xkZnJhbWUodGl0bGUsYnRpdGxlKTsKKyAgICBlbHNlCisgICAgICBPbkVycm9yKEVfU1lTVEVNX0VSUk9SKTsKKyAgfQorCisgIGlubGluZSB2b2lkIGxhYmVsKGNvbnN0IGNoYXIgKnRvcExhYmVsLCBjb25zdCBjaGFyICpib3R0b21MYWJlbCkgeworICAgIGlmIChiX2ZyYW1lZCkKKyAgICAgIE5DdXJzZXNQYW5lbDo6bGFiZWwodG9wTGFiZWwsYm90dG9tTGFiZWwpOworICAgIGVsc2UKKyAgICAgIE9uRXJyb3IoRV9TWVNURU1fRVJST1IpOworICB9CisKKyAgLy8gLS0tLS0KKyAgLy8gSG9va3MKKyAgLy8gLS0tLS0KKworICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIG1lbnUgZ2V0cyByZXBvc2l0aW9uZWQgaW4gaXRzIHdpbmRvdy4KKyAgLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIG1lbnUgaXMgcG9zdGVkLgorICB2aXJ0dWFsIHZvaWQgT25fTWVudV9Jbml0KCk7CisKKyAgLy8gQ2FsbGVkIGJlZm9yZSB0aGUgbWVudSBnZXRzIHJlcG9zaXRpb25lZCBpbiBpdHMgd2luZG93LgorICAvLyBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBpZiB0aGUgbWVudSBpcyB1bnBvc3RlZC4KKyAgdmlydHVhbCB2b2lkIE9uX01lbnVfVGVybWluYXRpb24oKTsKKworICAvLyBDYWxsZWQgYWZ0ZXIgdGhlIGl0ZW0gYmVjYW1lIHRoZSBjdXJyZW50IGl0ZW0KKyAgdmlydHVhbCB2b2lkIE9uX0l0ZW1fSW5pdChOQ3Vyc2VzTWVudUl0ZW0mIGl0ZW0pOworCisgIC8vIENhbGxlZCBiZWZvcmUgdGhpcyBpdGVtIGlzIGxlZnQgYXMgY3VycmVudCBpdGVtLgorICB2aXJ0dWFsIHZvaWQgT25fSXRlbV9UZXJtaW5hdGlvbihOQ3Vyc2VzTWVudUl0ZW0mIGl0ZW0pOworCisgIC8vIFByb3ZpZGUgYSBkZWZhdWx0IGtleSB2aXJ0dWFsaXphdGlvbi4gVHJhbnNsYXRlIHRoZSBrZXlib2FyZAorICAvLyBjb2RlIGMgaW50byBhIG1lbnUgcmVxdWVzdCBjb2RlLgorICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGhvcGVmdWxseSBzdHJhaWdodGZvcndhcmQKKyAgLy8gbWFwcGluZyBmb3IgdGhlIG1vc3QgY29tbW9uIGtleXN0cm9rZXMgYW5kIG1lbnUgcmVxdWVzdHMuCisgIHZpcnR1YWwgaW50IHZpcnR1YWxpemUoaW50IGMpOworCisKKyAgLy8gT3BlcmF0b3JzCisgIGlubGluZSBOQ3Vyc2VzTWVudUl0ZW0qIG9wZXJhdG9yW10oaW50IGkpIGNvbnN0IHsKKyAgICBpZiAoIChpIDwgMCkgfHwgKGkgPj0gOjppdGVtX2NvdW50IChtZW51KSkgKQorICAgICAgT25FcnJvciAoRV9CQURfQVJHVU1FTlQpOworICAgIHJldHVybiAobXlfaXRlbXNbaV0pOworICB9CisKKyAgLy8gUGVyZm9ybSB0aGUgbWVudSdzIG9wZXJhdGlvbgorICAvLyBSZXR1cm4gdGhlIGl0ZW0gd2hlcmUgeW91IGxlZnQgdGhlIHNlbGVjdGlvbiBtYXJrIGZvciBhIHNpbmdsZQorICAvLyBzZWxlY3Rpb24gbWVudSwgb3IgTlVMTCBmb3IgYSBtdWx0aXZhbHVlZCBtZW51LgorICB2aXJ0dWFsIE5DdXJzZXNNZW51SXRlbSogb3BlcmF0b3IoKSh2b2lkKTsKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFeGNlcHRpb24gaGFuZGxlcnMKKyAgLy8gQ2FsbGVkIGJ5IG9wZXJhdG9yKCkKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBDYWxsZWQgaWYgdGhlIHJlcXVlc3QgaXMgZGVuaWVkCisgIHZpcnR1YWwgdm9pZCBPbl9SZXF1ZXN0X0RlbmllZChpbnQgYykgY29uc3Q7CisKKyAgLy8gQ2FsbGVkIGlmIHRoZSBpdGVtIGlzIG5vdCBzZWxlY3RhYmxlCisgIHZpcnR1YWwgdm9pZCBPbl9Ob3RfU2VsZWN0YWJsZShpbnQgYykgY29uc3Q7CisKKyAgLy8gQ2FsbGVkIGlmIHBhdHRlcm4gZG9lc24ndCBtYXRjaAorICB2aXJ0dWFsIHZvaWQgT25fTm9fTWF0Y2goaW50IGMpIGNvbnN0OworCisgIC8vIENhbGxlZCBpZiB0aGUgY29tbWFuZCBpcyB1bmtub3duCisgIHZpcnR1YWwgdm9pZCBPbl9Vbmtub3duX0NvbW1hbmQoaW50IGMpIGNvbnN0OworCit9OworLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgaXMgdGhlIHR5cGljYWwgQysrIHR5cGVzYWZlIHdheSB0byBhbGxvdyB0byBhdHRhY2gKKy8vIHVzZXIgZGF0YSB0byBhbiBpdGVtIG9mIGEgbWVudS4gSXRzIGFzc3VtZWQgdGhhdCB0aGUgdXNlcgorLy8gZGF0YSBiZWxvbmdzIHRvIHNvbWUgY2xhc3MgVC4gVXNlIFQgYXMgdGVtcGxhdGUgYXJndW1lbnQKKy8vIHRvIGNyZWF0ZSBhIFVzZXJJdGVtLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VySXRlbSA6IHB1YmxpYyBOQ3Vyc2VzTWVudUl0ZW0KK3sKK3B1YmxpYzoKKyAgTkN1cnNlc1VzZXJJdGVtIChjb25zdCBjaGFyKiBwX25hbWUsCisJCSAgIGNvbnN0IGNoYXIqIHBfZGVzY3JpcHQgPSBOVUxMLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhICAgID0gU1RBVElDX0NBU1QoVCopKDApKQorICAgIDogTkN1cnNlc01lbnVJdGVtIChwX25hbWUsIHBfZGVzY3JpcHQpIHsKKyAgICAgIGlmIChpdGVtKQorCU9uRXJyb3IgKDo6c2V0X2l0ZW1fdXNlcnB0ciAoaXRlbSwgY29uc3RfY2FzdDx2b2lkICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KHBfVXNlckRhdGEpKSkpOworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1VzZXJJdGVtKCkge30KKworICBpbmxpbmUgY29uc3QgVCogVXNlckRhdGEgKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oOjppdGVtX3VzZXJwdHIgKGl0ZW0pKTsKKyAgfTsKKworICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFVzZXJEYXRhKGNvbnN0IFQqIHBfVXNlckRhdGEpIHsKKyAgICBpZiAoaXRlbSkKKyAgICAgIE9uRXJyb3IgKDo6c2V0X2l0ZW1fdXNlcnB0ciAoaXRlbSwgY29uc3RfY2FzdDx2b2lkICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCAqPihwX1VzZXJEYXRhKSkpKTsKKyAgfQorfTsKKy8vCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgc2FtZSBtZWNoYW5pc20gaXMgdXNlZCB0byBhdHRhY2ggdXNlciBkYXRhIHRvIGEgbWVudQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNVc2VyTWVudSA6IHB1YmxpYyBOQ3Vyc2VzTWVudQoreworcHJvdGVjdGVkOgorICBOQ3Vyc2VzVXNlck1lbnUoIGludCAgbmxpbmVzLAorCQkgICBpbnQgIG5jb2xzLAorCQkgICBpbnQgIGJlZ2luX3kgPSAwLAorCQkgICBpbnQgIGJlZ2luX3ggPSAwLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApKQorICAgIDogTkN1cnNlc01lbnUobmxpbmVzLG5jb2xzLGJlZ2luX3ksYmVnaW5feCkgeworICAgICAgaWYgKG1lbnUpCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH0KKworcHVibGljOgorICBOQ3Vyc2VzVXNlck1lbnUgKE5DdXJzZXNNZW51SXRlbSBJdGVtc1tdLAorCQkgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApLAorCQkgICBib29sIHdpdGhfZnJhbWU9RkFMU0UsCisJCSAgIGJvb2wgYXV0b0RlbGV0ZV9JdGVtcz1GQUxTRSkKKyAgICA6IE5DdXJzZXNNZW51IChJdGVtcywgd2l0aF9mcmFtZSwgYXV0b0RlbGV0ZV9JdGVtcykgeworICAgICAgaWYgKG1lbnUpCisJc2V0X3VzZXIgKGNvbnN0X2Nhc3Q8dm9pZCAqPihwX1VzZXJEYXRhKSk7CisgIH07CisKKyAgTkN1cnNlc1VzZXJNZW51IChOQ3Vyc2VzTWVudUl0ZW0gSXRlbXNbXSwKKwkJICAgaW50IG5saW5lcywKKwkJICAgaW50IG5jb2xzLAorCQkgICBpbnQgYmVnaW5feSA9IDAsCisJCSAgIGludCBiZWdpbl94ID0gMCwKKwkJICAgY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSwKKwkJICAgYm9vbCB3aXRoX2ZyYW1lPUZBTFNFKQorICAgIDogTkN1cnNlc01lbnUgKEl0ZW1zLCBubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94LCB3aXRoX2ZyYW1lKSB7CisgICAgICBpZiAobWVudSkKKwlzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfTsKKworICB2aXJ0dWFsIH5OQ3Vyc2VzVXNlck1lbnUoKSB7CisgIH07CisKKyAgaW5saW5lIFQqIFVzZXJEYXRhICh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGdldF91c2VyICgpKTsKKyAgfTsKKworICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFVzZXJEYXRhIChjb25zdCBUKiBwX1VzZXJEYXRhKSB7CisgICAgaWYgKG1lbnUpCisgICAgICBzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfQorfTsKKworI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTTV9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4ODI4YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2VzcC5oCkBAIC0wLDAgKzEsMjY1IEBACisvLyAqIFRoaXMgbWFrZXMgZW1hY3MgaGFwcHkgLSotTW9kZTogQysrOy0qLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiBKdWVyZ2VuIFBmZWlmZXIsIDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOQ1VSU0VTX0NVUlNFU1BfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfQ1VSU0VTUF9IX2luY2wgMQorCisvLyAkSWQ6IGN1cnNlc3AuaCx2IDEuMjcgMjAwNy8wNC8wNyAxNzoxMjo1NCB0b20gRXhwICQKKworI2luY2x1ZGUgPGN1cnNlc3cuaD4KKworZXh0ZXJuICJDIiB7CisjICBpbmNsdWRlIDxwYW5lbC5oPgorfQorCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzUGFuZWwKKyAgOiBwdWJsaWMgTkN1cnNlc1dpbmRvdworeworcHJvdGVjdGVkOgorICBQQU5FTCAqcDsKKyAgc3RhdGljIE5DdXJzZXNQYW5lbCAqZHVtbXk7CisKK3ByaXZhdGU6CisgIC8vIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHRoZSBwYW5lbCdzIHVzZXIgZGF0YSBmaWVsZCB0byBsaW5rIHRoZQorICAvLyBQQU5FTCogdG8gdGhlIEMrKyBvYmplY3QgYW5kIHRvIHByb3ZpZGUgZXh0cmEgc3BhY2UgZm9yIGEgdXNlciBwb2ludGVyLgorICB0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCogICAgICAgICAgICAgICBtX3VzZXI7ICAgICAgLy8gdGhlIHBvaW50ZXIgZm9yIHRoZSB1c2VyJ3MgZGF0YQorICAgIGNvbnN0IE5DdXJzZXNQYW5lbCogbV9iYWNrOyAgICAgIC8vIGJhY2t3YXJkIHBvaW50ZXIgdG8gQysrIG9iamVjdAorICAgIGNvbnN0IFBBTkVMKiAgICAgICAgbV9vd25lcjsgICAgIC8vIHRoZSBwYW5lbCBpdHNlbGYKKyAgfSBVc2VySG9vazsKKworICBpbmxpbmUgVXNlckhvb2sgKlVzZXJQb2ludGVyKCkKKyAgeworICAgIFVzZXJIb29rKiB1cHRyID0gcmVpbnRlcnByZXRfY2FzdDxVc2VySG9vayo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkICo+KDo6cGFuZWxfdXNlcnB0ciAocCkpKTsKKyAgICByZXR1cm4gdXB0cjsKKyAgfQorCisgIHZvaWQgaW5pdCgpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGFuZWwgb2JqZWN0CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRfdXNlcih2b2lkICp1c2VyKQorICB7CisgICAgVXNlckhvb2sqIHVwdHIgPSBVc2VyUG9pbnRlcigpOworICAgIGFzc2VydCAodXB0ciAhPSAwICYmIHVwdHItPm1fYmFjaz09dGhpcyAmJiB1cHRyLT5tX293bmVyPT1wKTsKKyAgICB1cHRyLT5tX3VzZXIgPSB1c2VyOworICB9CisgIC8vIFNldCB0aGUgdXNlciBwb2ludGVyIG9mIHRoZSBwYW5lbC4KKworICB2b2lkICpnZXRfdXNlcigpCisgIHsKKyAgICBVc2VySG9vayogdXB0ciA9IFVzZXJQb2ludGVyKCk7CisgICAgYXNzZXJ0ICh1cHRyICE9IDAgJiYgdXB0ci0+bV9iYWNrPT10aGlzICYmIHVwdHItPm1fb3duZXI9PXApOworICAgIHJldHVybiB1cHRyLT5tX3VzZXI7CisgIH0KKworICB2b2lkIE9uRXJyb3IgKGludCBlcnIpIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzUGFuZWxFeGNlcHRpb24pCisgIHsKKyAgICBpZiAoZXJyPT1FUlIpCisgICAgICBUSFJPVyhuZXcgTkN1cnNlc1BhbmVsRXhjZXB0aW9uICh0aGlzLCBlcnIpKTsKKyAgfQorICAvLyBJZiBlcnIgaXMgZXF1YWwgdG8gdGhlIGN1cnNlcyBlcnJvciBpbmRpY2F0b3IgRVJSLCBhbiBlcnJvciBoYW5kbGVyCisgIC8vIGlzIGNhbGxlZC4KKworICAvLyBHZXQgYSBrZXlzdHJva2UuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgZ2V0Y2goKQorICB2aXJ0dWFsIGludCBnZXRLZXkodm9pZCk7CisKK3B1YmxpYzoKKyAgTkN1cnNlc1BhbmVsKGludCBubGluZXMsCisJICAgICAgIGludCBuY29scywKKwkgICAgICAgaW50IGJlZ2luX3kgPSAwLAorCSAgICAgICBpbnQgYmVnaW5feCA9IDApCisgICAgOiBOQ3Vyc2VzV2luZG93KG5saW5lcyxuY29scyxiZWdpbl95LGJlZ2luX3gpLCBwKDApCisgIHsKKyAgICBpbml0KCk7CisgIH0KKyAgLy8gQ3JlYXRlIGEgcGFuZWwgd2l0aCB0aGlzIHNpemUgc3RhcnRpbmcgYXQgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbi4KKworICBOQ3Vyc2VzUGFuZWwoKQorICAgIDogTkN1cnNlc1dpbmRvdyg6OnN0ZHNjciksIHAoMCkKKyAgeworICAgIGluaXQoKTsKKyAgfQorICAvLyBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgdGhlIGRlZmF1bHQgUGFuZWwgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAvLyA6OnN0ZHNjciB3aW5kb3cKKworICBOQ3Vyc2VzUGFuZWwmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzUGFuZWwmIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgICp0aGlzID0gcmhzOworICAgICAgTkN1cnNlc1dpbmRvdzo6b3BlcmF0b3I9KHJocyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNQYW5lbChjb25zdCBOQ3Vyc2VzUGFuZWwmIHJocykKKyAgICA6IE5DdXJzZXNXaW5kb3cocmhzKSwKKyAgICAgIHAocmhzLnApCisgIHsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNQYW5lbCgpOworCisgIC8vIGJhc2ljIG1hbmlwdWxhdGlvbgorICBpbmxpbmUgdm9pZCBoaWRlKCkKKyAgeworICAgIE9uRXJyb3IgKDo6aGlkZV9wYW5lbChwKSk7CisgIH0KKyAgLy8gSGlkZSB0aGUgcGFuZWwuIEl0IHN0YXlzIGluIHRoZSBzdGFjayBidXQgYmVjb21lcyBpbnZpc2libGUuCisKKyAgaW5saW5lIHZvaWQgc2hvdygpCisgIHsKKyAgICBPbkVycm9yICg6OnNob3dfcGFuZWwocCkpOworICB9CisgIC8vIFNob3cgdGhlIHBhbmVsLCBpLmUuIG1ha2UgaXQgdmlzaWJsZS4KKworICBpbmxpbmUgdm9pZCB0b3AoKQorICB7CisgICAgT25FcnJvciAoOjp0b3BfcGFuZWwocCkpOworICB9CisgIC8vIE1ha2UgdGhpcyBwYW5lbCB0aGUgdG9wIHBhbmVsIGluIHRoZSBzdGFjay4KKworICBpbmxpbmUgdm9pZCBib3R0b20oKQorICB7CisgICAgT25FcnJvciAoOjpib3R0b21fcGFuZWwocCkpOworICB9CisgIC8vIE1ha2UgdGhpcyBwYW5lbCB0aGUgYm90dG9tIHBhbmVsIGluIHRoZSBzdGFjay4KKyAgLy8gTi5CLjogVGhlIHBhbmVsIGFzc29jaWF0ZWQgd2l0aCA6OnN0ZHNjciBpcyBhbHdheXMgb24gdGhlIGJvdHRvbS4gU28KKyAgLy8gYWN0dWFsbHkgYm90dG9tKCkgbWFrZXMgdGhlIHBhbmVsIHRoZSBmaXJzdCBhYm92ZSA6OnN0ZHNjci4KKworICB2aXJ0dWFsIGludCBtdndpbihpbnQgeSwgaW50IHgpCisgIHsKKyAgICBPbkVycm9yKDo6bW92ZV9wYW5lbChwLCB5LCB4KSk7CisgICAgcmV0dXJuIE9LOworICB9CisKKyAgaW5saW5lIGJvb2wgaGlkZGVuKCkgY29uc3QKKyAgeworICAgIHJldHVybiAoOjpwYW5lbF9oaWRkZW4gKHApID8gVFJVRSA6IEZBTFNFKTsKKyAgfQorICAvLyBSZXR1cm4gVFJVRSBpZiB0aGUgcGFuZWwgaXMgaGlkZGVuLCBGQUxTRSBvdGhlcndpc2UuCisKKy8qIFRoZSBmdW5jdGlvbnMgcGFuZWxfYWJvdmUoKSBhbmQgcGFuZWxfYmVsb3coKSBhcmUgbm90IHJlZmxlY3RlZCBpbgorICAgdGhlIE5DdXJzZXNQYW5lbCBjbGFzcy4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcywgdGhhdCB3ZSBjYW5ub3QKKyAgIGFzc3VtZSB0aGF0IGEgcGFuZWwgcmV0cmlldmVkIGJ5IHRob3NlIG9wZXJhdGlvbnMgaXMgb25lIHdyYXBwZWQKKyAgIGJ5IGEgQysrIGNsYXNzLiBBbHRob3VnaCB0aGlzIHNpdHVhdGlvbiBtaWdodCBiZSBoYW5kbGVkLCB3ZSBhbHNvCisgICBuZWVkIGEgcmV2ZXJzZSBtYXBwaW5nIGZyb20gUEFORUwgdG8gTkN1cnNlc1BhbmVsIHdoaWNoIG5lZWRzIHNvbWUKKyAgIHJlZGVzaWduIG9mIHRoZSBsb3cgbGV2ZWwgc3R1ZmYuIEF0IHRoZSBtb21lbnQsIHdlIGRlZmluZSB0aGVtIGluIHRoZQorICAgaW50ZXJmYWNlIGJ1dCB0aGV5IHdpbGwgYWx3YXlzIHByb2R1Y2UgYW4gZXJyb3IuICovCisgIGlubGluZSBOQ3Vyc2VzUGFuZWwmIGFib3ZlKCkgY29uc3QKKyAgeworICAgIE9uRXJyb3IoRVJSKTsKKyAgICByZXR1cm4gKmR1bW15OworICB9CisKKyAgaW5saW5lIE5DdXJzZXNQYW5lbCYgYmVsb3coKSBjb25zdAorICB7CisgICAgT25FcnJvcihFUlIpOworICAgIHJldHVybiAqZHVtbXk7CisgIH0KKworICAvLyBUaG9zZSB0d28gYXJlIHJld3JpdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZpcnR1YWwgbWVtYmVycyBvZgorICAvLyBOQ3Vyc2VzV2luZG93CisgIHZpcnR1YWwgaW50IHJlZnJlc2goKTsKKyAgLy8gUHJvcGFnYXRlIGFsbCBwYW5lbCBjaGFuZ2VzIHRvIHRoZSB2aXJ0dWFsIHNjcmVlbiBhbmQgdXBkYXRlIHRoZQorICAvLyBwaHlzaWNhbCBzY3JlZW4uCisKKyAgdmlydHVhbCBpbnQgbm91dHJlZnJlc2goKTsKKyAgLy8gUHJvcGFnYXRlIGFsbCBwYW5lbCBjaGFuZ2VzIHRvIHRoZSB2aXJ0dWFsIHNjcmVlbi4KKworICBzdGF0aWMgdm9pZCByZWRyYXcoKTsKKyAgLy8gUmVkcmF3IGFsbCBwYW5lbHMuCisKKyAgLy8gZGVjb3JhdGlvbnMKKyAgdmlydHVhbCB2b2lkIGZyYW1lKGNvbnN0IGNoYXIqIHRpdGxlPU5VTEwsCisJCSAgICAgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpOworICAvLyBQdXQgYSBmcmFtZSBhcm91bmQgdGhlIHBhbmVsIGFuZCBwdXQgdGhlIHRpdGxlIGNlbnRlcmVkIGluIHRoZSB0b3AgbGluZQorICAvLyBhbmQgYnRpdGxlIGluIHRoZSBib3R0b20gbGluZS4KKworICB2aXJ0dWFsIHZvaWQgYm9sZGZyYW1lKGNvbnN0IGNoYXIqIHRpdGxlPU5VTEwsCisJCQkgY29uc3QgY2hhciogYnRpdGxlPU5VTEwpOworICAvLyBTYW1lIGFzIGZyYW1lKCksIGJ1dCB1c2UgaGlnaGxpZ2h0ZWQgYXR0cmlidXRlcy4KKworICB2aXJ0dWFsIHZvaWQgbGFiZWwoY29uc3QgY2hhciogdG9wTGFiZWwsCisJCSAgICAgY29uc3QgY2hhciogYm90dG9tTGFiZWwpOworICAvLyBQdXQgdGhlIHRpdGxlIGNlbnRlcmVkIGluIHRoZSB0b3AgbGluZSBhbmQgYnRpdGxlIGluIHRoZSBib3R0b20gbGluZS4KKworICB2aXJ0dWFsIHZvaWQgY2VudGVydGV4dChpbnQgcm93LGNvbnN0IGNoYXIqIGxhYmVsKTsKKyAgLy8gUHV0IHRoZSBsYWJlbCB0ZXh0IGNlbnRlcmVkIGluIHRoZSBzcGVjaWZpZWQgcm93LgorfTsKKworLyogV2UgdXNlIHRlbXBsYXRlcyB0byBwcm92aWRlIGEgdHlwZXNhZmUgbWVjaGFuaXNtIHRvIGFzc29jaWF0ZQorICogdXNlciBkYXRhIHdpdGggYSBwYW5lbC4gQSBOQ3Vyc2VzVXNlclBhbmVsPFQ+IGlzIGEgcGFuZWwKKyAqIGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgZGF0YSBvZiB0eXBlIFQuCisgKi8KK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIE5DdXJzZXNVc2VyUGFuZWwgOiBwdWJsaWMgTkN1cnNlc1BhbmVsCit7CitwdWJsaWM6CisgIE5DdXJzZXNVc2VyUGFuZWwgKGludCBubGluZXMsCisJCSAgICBpbnQgbmNvbHMsCisJCSAgICBpbnQgYmVnaW5feSA9IDAsCisJCSAgICBpbnQgYmVnaW5feCA9IDAsCisJCSAgICBjb25zdCBUKiBwX1VzZXJEYXRhID0gU1RBVElDX0NBU1QoVCopKDApKQorICAgIDogTkN1cnNlc1BhbmVsIChubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KQorICB7CisgICAgICBpZiAocCkKKwlzZXRfdXNlciAoY29uc3RfY2FzdDx2b2lkICo+KHBfVXNlckRhdGEpKTsKKyAgfTsKKyAgLy8gVGhpcyBjcmVhdGVzIGFuIHVzZXIgcGFuZWwgb2YgdGhlIHJlcXVlc3RlZCBzaXplIHdpdGggYXNzb2NpYXRlZAorICAvLyB1c2VyIGRhdGEgcG9pbnRlZCB0byBieSBwX1VzZXJEYXRhLgorCisgIE5DdXJzZXNVc2VyUGFuZWwoY29uc3QgVCogcF9Vc2VyRGF0YSA9IFNUQVRJQ19DQVNUKFQqKSgwKSkgOiBOQ3Vyc2VzUGFuZWwoKQorICB7CisgICAgaWYgKHApCisgICAgICBzZXRfdXNlcihjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9OworICAvLyBUaGlzIGNyZWF0ZXMgYW4gdXNlciBwYW5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIDo6c3Rkc2NyIGFuZCB1c2VyIGRhdGEKKyAgLy8gcG9pbnRlZCB0byBieSBwX1VzZXJEYXRhLgorCisgIHZpcnR1YWwgfk5DdXJzZXNVc2VyUGFuZWwoKSB7fTsKKworICBUKiBVc2VyRGF0YSAodm9pZCkgY29uc3QKKyAgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnZXRfdXNlciAoKSk7CisgIH07CisgIC8vIFJldHJpZXZlIHRoZSB1c2VyIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYW5lbC4KKworICB2aXJ0dWFsIHZvaWQgc2V0VXNlckRhdGEgKGNvbnN0IFQqIHBfVXNlckRhdGEpCisgIHsKKyAgICBpZiAocCkKKyAgICAgIHNldF91c2VyIChjb25zdF9jYXN0PHZvaWQgKj4ocF9Vc2VyRGF0YSkpOworICB9CisgIC8vIEFzc29jaWF0ZSB0aGUgdXNlciBwYW5lbCB3aXRoIHRoZSB1c2VyIGRhdGEgcG9pbnRlZCB0byBieSBwX1VzZXJEYXRhLgorfTsKKworI2VuZGlmIC8qIE5DVVJTRVNfQ1VSU0VTUF9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2Vzdy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9jdXJzZXN3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjNzFlYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc2Vzdy5oCkBAIC0wLDAgKzEsMTQzOSBAQAorLy8gKiBUaGlzIG1ha2VzIGVtYWNzIGhhcHB5IC0qLU1vZGU6IEMrKzstKi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTkNVUlNFU19DVVJTRVNXX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0NVUlNFU1dfSF9pbmNsIDEKKworLy8gJElkOiBjdXJzZXN3LmgsdiAxLjQ2IDIwMDcvMTEvMjQgMTk6MDk6MDkgdG9tIEV4cCAkCisKKyNpbmNsdWRlIDxldGlwLmg+CisKK2V4dGVybiAiQyIgeworIyAgaW5jbHVkZSAgIDxjdXJzZXMuaD4KK30KKworLyogU0NPIDMuMnY0IGN1cnNlcy5oIGluY2x1ZGVzIHRlcm0uaCwgd2hpY2ggZGVmaW5lcyBsaW5lcyBhcyBhIG1hY3JvLgorICAgVW5kZWZpbmUgaXQgaGVyZSwgYmVjYXVzZSBOQ3Vyc2VzV2luZG93IHVzZXMgbGluZXMgYXMgYSBtZXRob2QuICAqLworI3VuZGVmIGxpbmVzCisKKy8qICJDb252ZXJ0IiBtYWNyb3MgdG8gaW5saW5lcy4gV2UnbGwgZGVmaW5lIGl0IGFzIGFub3RoZXIgc3ltYm9sIHRvIGF2b2lkCisgKiBjb25mbGljdCB3aXRoIGxpYnJhcnkgc3ltYm9scy4KKyAqLworI3VuZGVmIFVOREVGCisjZGVmaW5lIFVOREVGKG5hbWUpIENVUl8gIyNuYW1lCisKKyNpZmRlZiBhZGRjaAoraW5saW5lIGludCBVTkRFRihhZGRjaCkoY2h0eXBlIGNoKSAgeyByZXR1cm4gYWRkY2goY2gpOyB9CisjdW5kZWYgYWRkY2gKKyNkZWZpbmUgYWRkY2ggVU5ERUYoYWRkY2gpCisjZW5kaWYKKworI2lmZGVmIGVjaG9jaGFyCitpbmxpbmUgaW50IFVOREVGKGVjaG9jaGFyKShjaHR5cGUgY2gpICB7IHJldHVybiBlY2hvY2hhcihjaCk7IH0KKyN1bmRlZiBlY2hvY2hhcgorI2RlZmluZSBlY2hvY2hhciBVTkRFRihlY2hvY2hhcikKKyNlbmRpZgorCisjaWZkZWYgaW5zZGVsbG4KK2lubGluZSBpbnQgVU5ERUYoaW5zZGVsbG4pKGludCBuKSAgeyByZXR1cm4gaW5zZGVsbG4obik7IH0KKyN1bmRlZiBpbnNkZWxsbgorI2RlZmluZSBpbnNkZWxsbiBVTkRFRihpbnNkZWxsbikKKyNlbmRpZgorCisjaWZkZWYgYWRkc3RyCitpbmxpbmUgaW50IFVOREVGKGFkZHN0cikoY29uc3QgY2hhciAqIHN0cikgIHsgcmV0dXJuIGFkZHN0cihzdHIpOyB9CisjdW5kZWYgYWRkc3RyCisjZGVmaW5lIGFkZHN0ciBVTkRFRihhZGRzdHIpCisjZW5kaWYKKworI2lmZGVmIGF0dHJvbgoraW5saW5lIGludCBVTkRFRihhdHRyb24pKGNodHlwZSBhdCkgeyByZXR1cm4gYXR0cm9uKGF0KTsgfQorI3VuZGVmIGF0dHJvbgorI2RlZmluZSBhdHRyb24gVU5ERUYoYXR0cm9uKQorI2VuZGlmCisKKyNpZmRlZiBhdHRyb2ZmCitpbmxpbmUgaW50IFVOREVGKGF0dHJvZmYpKGNodHlwZSBhdCkgeyByZXR1cm4gYXR0cm9mZihhdCk7IH0KKyN1bmRlZiBhdHRyb2ZmCisjZGVmaW5lIGF0dHJvZmYgVU5ERUYoYXR0cm9mZikKKyNlbmRpZgorCisjaWZkZWYgYXR0cnNldAoraW5saW5lIGNodHlwZSBVTkRFRihhdHRyc2V0KShjaHR5cGUgYXQpIHsgcmV0dXJuIGF0dHJzZXQoYXQpOyB9CisjdW5kZWYgYXR0cnNldAorI2RlZmluZSBhdHRyc2V0IFVOREVGKGF0dHJzZXQpCisjZW5kaWYKKworI2lmZGVmIGNvbG9yX3NldAoraW5saW5lIGNodHlwZSBVTkRFRihjb2xvcl9zZXQpKHNob3J0IHAsIHZvaWQqIG9wdHMpIHsgcmV0dXJuIGNvbG9yX3NldChwLCBvcHRzKTsgfQorI3VuZGVmIGNvbG9yX3NldAorI2RlZmluZSBjb2xvcl9zZXQgVU5ERUYoY29sb3Jfc2V0KQorI2VuZGlmCisKKyNpZmRlZiBib3JkZXIKK2lubGluZSBpbnQgVU5ERUYoYm9yZGVyKShjaHR5cGUgbHMsIGNodHlwZSBycywgY2h0eXBlIHRzLCBjaHR5cGUgYnMsIGNodHlwZSB0bCwgY2h0eXBlIHRyLCBjaHR5cGUgYmwsIGNodHlwZSBicikKK3sgcmV0dXJuIGJvcmRlcihscywgcnMsIHRzLCBicywgdGwsIHRyLCBibCwgYnIpOyB9CisjdW5kZWYgYm9yZGVyCisjZGVmaW5lIGJvcmRlciBVTkRFRihib3JkZXIpCisjZW5kaWYKKworI2lmZGVmIGJveAoraW5saW5lIGludCBVTkRFRihib3gpKFdJTkRPVyAqd2luLCBpbnQgdiwgaW50IGgpIHsgcmV0dXJuIGJveCh3aW4sIHYsIGgpOyB9CisjdW5kZWYgYm94CisjZGVmaW5lIGJveCBVTkRFRihib3gpCisjZW5kaWYKKworI2lmZGVmIG12d2hsaW5lCitpbmxpbmUgaW50IFVOREVGKG12d2hsaW5lKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgYywgaW50IG4pIHsKKyAgcmV0dXJuIG12d2hsaW5lKHdpbiwgeSwgeCwgYywgbik7IH0KKyN1bmRlZiBtdndobGluZQorI2RlZmluZSBtdndobGluZSBVTkRFRihtdndobGluZSkKKyNlbmRpZgorCisjaWZkZWYgbXZ3dmxpbmUKK2lubGluZSBpbnQgVU5ERUYobXZ3dmxpbmUpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNodHlwZSBjLCBpbnQgbikgeworICByZXR1cm4gbXZ3dmxpbmUod2luLCB5LCB4LCBjLCBuKTsgfQorI3VuZGVmIG12d3ZsaW5lCisjZGVmaW5lIG12d3ZsaW5lIFVOREVGKG12d3ZsaW5lKQorI2VuZGlmCisKKyNpZmRlZiBjbGVhcgoraW5saW5lIGludCBVTkRFRihjbGVhcikoKSAgeyByZXR1cm4gY2xlYXIoKTsgfQorI3VuZGVmIGNsZWFyCisjZGVmaW5lIGNsZWFyIFVOREVGKGNsZWFyKQorI2VuZGlmCisKKyNpZmRlZiBjbGVhcm9rCitpbmxpbmUgaW50IFVOREVGKGNsZWFyb2spKFdJTkRPVyogd2luLCBib29sIGJmKSAgeyByZXR1cm4gY2xlYXJvayh3aW4sIGJmKTsgfQorI3VuZGVmIGNsZWFyb2sKKyNkZWZpbmUgY2xlYXJvayBVTkRFRihjbGVhcm9rKQorI2Vsc2UKK2V4dGVybiAiQyIgTkNVUlNFU19JTVBFWFAgaW50IE5DVVJTRVNfQVBJIGNsZWFyb2soV0lORE9XKiwgYm9vbCk7CisjZW5kaWYKKworI2lmZGVmIGNscnRvYm90CitpbmxpbmUgaW50IFVOREVGKGNscnRvYm90KSgpICB7IHJldHVybiBjbHJ0b2JvdCgpOyB9CisjdW5kZWYgY2xydG9ib3QKKyNkZWZpbmUgY2xydG9ib3QgVU5ERUYoY2xydG9ib3QpCisjZW5kaWYKKworI2lmZGVmIGNscnRvZW9sCitpbmxpbmUgaW50IFVOREVGKGNscnRvZW9sKSgpICB7IHJldHVybiBjbHJ0b2VvbCgpOyB9CisjdW5kZWYgY2xydG9lb2wKKyNkZWZpbmUgY2xydG9lb2wgVU5ERUYoY2xydG9lb2wpCisjZW5kaWYKKworI2lmZGVmIGRlbGNoCitpbmxpbmUgaW50IFVOREVGKGRlbGNoKSgpICB7IHJldHVybiBkZWxjaCgpOyB9CisjdW5kZWYgZGVsY2gKKyNkZWZpbmUgZGVsY2ggVU5ERUYoZGVsY2gpCisjZW5kaWYKKworI2lmZGVmIGRlbGV0ZWxuCitpbmxpbmUgaW50IFVOREVGKGRlbGV0ZWxuKSgpICB7IHJldHVybiBkZWxldGVsbigpOyB9CisjdW5kZWYgZGVsZXRlbG4KKyNkZWZpbmUgZGVsZXRlbG4gVU5ERUYoZGVsZXRlbG4pCisjZW5kaWYKKworI2lmZGVmIGVyYXNlCitpbmxpbmUgaW50IFVOREVGKGVyYXNlKSgpICB7IHJldHVybiBlcmFzZSgpOyB9CisjdW5kZWYgZXJhc2UKKyNkZWZpbmUgZXJhc2UgVU5ERUYoZXJhc2UpCisjZW5kaWYKKworI2lmZGVmIGZsdXNob2sKK2lubGluZSBpbnQgVU5ERUYoZmx1c2hvaykoV0lORE9XKiBfd2luLCBib29sIF9iZikgIHsKKyAgcmV0dXJuIGZsdXNob2soX3dpbiwgX2JmKTsgfQorI3VuZGVmIGZsdXNob2sKKyNkZWZpbmUgZmx1c2hvayBVTkRFRihmbHVzaG9rKQorI2Vsc2UKKyNkZWZpbmUgX25vX2ZsdXNob2sKKyNlbmRpZgorCisjaWZkZWYgZ2V0Y2gKK2lubGluZSBpbnQgVU5ERUYoZ2V0Y2gpKCkgIHsgcmV0dXJuIGdldGNoKCk7IH0KKyN1bmRlZiBnZXRjaAorI2RlZmluZSBnZXRjaCBVTkRFRihnZXRjaCkKKyNlbmRpZgorCisjaWZkZWYgZ2V0c3RyCitpbmxpbmUgaW50IFVOREVGKGdldHN0cikoY2hhciAqX3N0cikgIHsgcmV0dXJuIGdldHN0cihfc3RyKTsgfQorI3VuZGVmIGdldHN0cgorI2RlZmluZSBnZXRzdHIgVU5ERUYoZ2V0c3RyKQorI2VuZGlmCisKKyNpZmRlZiBpbnN0cgoraW5saW5lIGludCBVTkRFRihpbnN0cikoY2hhciAqX3N0cikgIHsgcmV0dXJuIGluc3RyKF9zdHIpOyB9CisjdW5kZWYgaW5zdHIKKyNkZWZpbmUgaW5zdHIgVU5ERUYoaW5zdHIpCisjZW5kaWYKKworI2lmZGVmIGlubnN0cgoraW5saW5lIGludCBVTkRFRihpbm5zdHIpKGNoYXIgKl9zdHIsIGludCBuKSAgeyByZXR1cm4gaW5uc3RyKF9zdHIsIG4pOyB9CisjdW5kZWYgaW5uc3RyCisjZGVmaW5lIGlubnN0ciBVTkRFRihpbm5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2lubnN0cgoraW5saW5lIGludCBVTkRFRihtdndpbm5zdHIpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNoYXIgKl9zdHIsIGludCBuKSB7CisgIHJldHVybiBtdndpbm5zdHIod2luLCB5LCB4LCBfc3RyLCBuKTsgfQorI3VuZGVmIG12d2lubnN0cgorI2RlZmluZSBtdndpbm5zdHIgVU5ERUYobXZ3aW5uc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdmlubnN0cgoraW5saW5lIGludCBVTkRFRihtdmlubnN0cikoaW50IHksIGludCB4LCBjaGFyICpfc3RyLCBpbnQgbikgeworICByZXR1cm4gbXZpbm5zdHIoeSwgeCwgX3N0ciwgbik7IH0KKyN1bmRlZiBtdmlubnN0cgorI2RlZmluZSBtdmlubnN0ciBVTkRFRihtdmlubnN0cikKKyNlbmRpZgorCisjaWZkZWYgd2luc3N0cgoraW5saW5lIGludCBVTkRFRih3aW5zc3RyKShXSU5ET1cgKncsIGNvbnN0IGNoYXIgKl9zdHIpICB7CisgIHJldHVybiB3aW5zc3RyKHcsIF9zdHIpOyB9CisjdW5kZWYgd2luc3N0cgorI2RlZmluZSB3aW5zc3RyIFVOREVGKHdpbnNzdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2luc3N0cgoraW5saW5lIGludCBVTkRFRihtdndpbnNzdHIpKFdJTkRPVyAqdywgaW50IHksIGludCB4LCAgY29uc3QgY2hhciAqX3N0cikgIHsKKyAgcmV0dXJuIG12d2luc3N0cih3LCB5LCB4LCBfc3RyKTsgfQorI3VuZGVmIG12d2luc3N0cgorI2RlZmluZSBtdndpbnNzdHIgVU5ERUYobXZ3aW5zc3RyKQorI2VuZGlmCisKKyNpZmRlZiBpbnNzdHIKK2lubGluZSBpbnQgVU5ERUYoaW5zc3RyKShjb25zdCBjaGFyICpfc3RyKSAgeworICByZXR1cm4gaW5zc3RyKF9zdHIpOyB9CisjdW5kZWYgaW5zc3RyCisjZGVmaW5lIGluc3N0ciBVTkRFRihpbnNzdHIpCisjZW5kaWYKKworI2lmZGVmIG12aW5zc3RyCitpbmxpbmUgaW50IFVOREVGKG12aW5zc3RyKShpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKl9zdHIpICB7CisgIHJldHVybiBtdmluc3N0cih5LCB4LCBfc3RyKTsgfQorI3VuZGVmIG12aW5zc3RyCisjZGVmaW5lIG12aW5zc3RyIFVOREVGKG12aW5zc3RyKQorI2VuZGlmCisKKyNpZmRlZiBpbnNuc3RyCitpbmxpbmUgaW50IFVOREVGKGluc25zdHIpKGNvbnN0IGNoYXIgKl9zdHIsIGludCBuKSAgeworICByZXR1cm4gaW5zbnN0cihfc3RyLCBuKTsgfQorI3VuZGVmIGluc25zdHIKKyNkZWZpbmUgaW5zbnN0ciBVTkRFRihpbnNuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdndpbnNuc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2luc25zdHIpKFdJTkRPVyAqdywgaW50IHksIGludCB4LCBjb25zdCBjaGFyICpfc3RyLCBpbnQgbikgeworICByZXR1cm4gbXZ3aW5zbnN0cih3LCB5LCB4LCBfc3RyLCBuKTsgfQorI3VuZGVmIG12d2luc25zdHIKKyNkZWZpbmUgbXZ3aW5zbnN0ciBVTkRFRihtdndpbnNuc3RyKQorI2VuZGlmCisKKyNpZmRlZiBtdmluc25zdHIKK2lubGluZSBpbnQgVU5ERUYobXZpbnNuc3RyKShpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKl9zdHIsIGludCBuKSB7CisgIHJldHVybiBtdmluc25zdHIoeSwgeCwgX3N0ciwgbik7IH0KKyN1bmRlZiBtdmluc25zdHIKKyNkZWZpbmUgbXZpbnNuc3RyIFVOREVGKG12aW5zbnN0cikKKyNlbmRpZgorCisjaWZkZWYgZ2V0bnN0cgoraW5saW5lIGludCBVTkRFRihnZXRuc3RyKShjaGFyICpfc3RyLCBpbnQgbikgIHsgcmV0dXJuIGdldG5zdHIoX3N0ciwgbik7IH0KKyN1bmRlZiBnZXRuc3RyCisjZGVmaW5lIGdldG5zdHIgVU5ERUYoZ2V0bnN0cikKKyNlbmRpZgorCisjaWZkZWYgZ2V0eXgKK2lubGluZSB2b2lkIFVOREVGKGdldHl4KShjb25zdCBXSU5ET1cqIHdpbiwgaW50JiB5LCBpbnQmIHgpIHsKKyAgZ2V0eXgod2luLCB5LCB4KTsgfQorI3VuZGVmIGdldHl4CisjZGVmaW5lIGdldHl4IFVOREVGKGdldHl4KQorI2VuZGlmCisKKyNpZmRlZiBnZXRiZWd5eAoraW5saW5lIHZvaWQgVU5ERUYoZ2V0YmVneXgpKFdJTkRPVyogd2luLCBpbnQmIHksIGludCYgeCkgeyBnZXRiZWd5eCh3aW4sIHksIHgpOyB9CisjdW5kZWYgZ2V0YmVneXgKKyNkZWZpbmUgZ2V0YmVneXggVU5ERUYoZ2V0YmVneXgpCisjZW5kaWYKKworI2lmZGVmIGdldG1heHl4CitpbmxpbmUgdm9pZCBVTkRFRihnZXRtYXh5eCkoV0lORE9XKiB3aW4sIGludCYgeSwgaW50JiB4KSB7IGdldG1heHl4KHdpbiwgeSwgeCk7IH0KKyN1bmRlZiBnZXRtYXh5eAorI2RlZmluZSBnZXRtYXh5eCBVTkRFRihnZXRtYXh5eCkKKyNlbmRpZgorCisjaWZkZWYgaGxpbmUKK2lubGluZSBpbnQgVU5ERUYoaGxpbmUpKGNodHlwZSBjaCwgaW50IG4pIHsgcmV0dXJuIGhsaW5lKGNoLCBuKTsgfQorI3VuZGVmIGhsaW5lCisjZGVmaW5lIGhsaW5lIFVOREVGKGhsaW5lKQorI2VuZGlmCisKKyNpZmRlZiBpbmNoCitpbmxpbmUgY2h0eXBlIFVOREVGKGluY2gpKCkgIHsgcmV0dXJuIGluY2goKTsgfQorI3VuZGVmIGluY2gKKyNkZWZpbmUgaW5jaCBVTkRFRihpbmNoKQorI2VuZGlmCisKKyNpZmRlZiBpbnNjaAoraW5saW5lIGludCBVTkRFRihpbnNjaCkoY2h0eXBlIGMpICB7IHJldHVybiBpbnNjaChjKTsgfQorI3VuZGVmIGluc2NoCisjZGVmaW5lIGluc2NoIFVOREVGKGluc2NoKQorI2VuZGlmCisKKyNpZmRlZiBpbnNlcnRsbgoraW5saW5lIGludCBVTkRFRihpbnNlcnRsbikoKSAgeyByZXR1cm4gaW5zZXJ0bG4oKTsgfQorI3VuZGVmIGluc2VydGxuCisjZGVmaW5lIGluc2VydGxuIFVOREVGKGluc2VydGxuKQorI2VuZGlmCisKKyNpZmRlZiBsZWF2ZW9rCitpbmxpbmUgaW50IFVOREVGKGxlYXZlb2spKFdJTkRPVyogd2luLCBib29sIGJmKSAgeyByZXR1cm4gbGVhdmVvayh3aW4sIGJmKTsgfQorI3VuZGVmIGxlYXZlb2sKKyNkZWZpbmUgbGVhdmVvayBVTkRFRihsZWF2ZW9rKQorI2Vsc2UKK2V4dGVybiAiQyIgTkNVUlNFU19JTVBFWFAgaW50IE5DVVJTRVNfQVBJIGxlYXZlb2soV0lORE9XKiB3aW4sIGJvb2wgYmYpOworI2VuZGlmCisKKyNpZmRlZiBtb3ZlCitpbmxpbmUgaW50IFVOREVGKG1vdmUpKGludCB4LCBpbnQgeSkgIHsgcmV0dXJuIG1vdmUoeCwgeSk7IH0KKyN1bmRlZiBtb3ZlCisjZGVmaW5lIG1vdmUgVU5ERUYobW92ZSkKKyNlbmRpZgorCisjaWZkZWYgcmVmcmVzaAoraW5saW5lIGludCBVTkRFRihyZWZyZXNoKSgpICB7IHJldHVybiByZWZyZXNoKCk7IH0KKyN1bmRlZiByZWZyZXNoCisjZGVmaW5lIHJlZnJlc2ggVU5ERUYocmVmcmVzaCkKKyNlbmRpZgorCisjaWZkZWYgcmVkcmF3d2luCitpbmxpbmUgaW50IFVOREVGKHJlZHJhd3dpbikoV0lORE9XICp3aW4pICB7IHJldHVybiByZWRyYXd3aW4od2luKTsgfQorI3VuZGVmIHJlZHJhd3dpbgorI2RlZmluZSByZWRyYXd3aW4gVU5ERUYocmVkcmF3d2luKQorI2VuZGlmCisKKyNpZmRlZiBzY3JsCitpbmxpbmUgaW50IFVOREVGKHNjcmwpKGludCBsKSB7IHJldHVybiBzY3JsKGwpOyB9CisjdW5kZWYgc2NybAorI2RlZmluZSBzY3JsIFVOREVGKHNjcmwpCisjZW5kaWYKKworI2lmZGVmIHNjcm9sbAoraW5saW5lIGludCBVTkRFRihzY3JvbGwpKFdJTkRPVyAqd2luKSB7IHJldHVybiBzY3JvbGwod2luKTsgfQorI3VuZGVmIHNjcm9sbAorI2RlZmluZSBzY3JvbGwgVU5ERUYoc2Nyb2xsKQorI2VuZGlmCisKKyNpZmRlZiBzY3JvbGxvaworaW5saW5lIGludCBVTkRFRihzY3JvbGxvaykoV0lORE9XKiB3aW4sIGJvb2wgYmYpICB7IHJldHVybiBzY3JvbGxvayh3aW4sIGJmKTsgfQorI3VuZGVmIHNjcm9sbG9rCisjZGVmaW5lIHNjcm9sbG9rIFVOREVGKHNjcm9sbG9rKQorI2Vsc2UKKyNpZglkZWZpbmVkKF9fTkNVUlNFU19IKQorZXh0ZXJuICJDIiBOQ1VSU0VTX0lNUEVYUCBpbnQgTkNVUlNFU19BUEkgc2Nyb2xsb2soV0lORE9XKiwgYm9vbCk7CisjZWxzZQorZXh0ZXJuICJDIiBOQ1VSU0VTX0lNUEVYUCBpbnQgTkNVUlNFU19BUEkgc2Nyb2xsb2soV0lORE9XKiwgY2hhcik7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgc2V0c2NycmVnCitpbmxpbmUgaW50IFVOREVGKHNldHNjcnJlZykoaW50IHQsIGludCBiKSB7IHJldHVybiBzZXRzY3JyZWcodCwgYik7IH0KKyN1bmRlZiBzZXRzY3JyZWcKKyNkZWZpbmUgc2V0c2NycmVnIFVOREVGKHNldHNjcnJlZykKKyNlbmRpZgorCisjaWZkZWYgc3RhbmRlbmQKK2lubGluZSBpbnQgVU5ERUYoc3RhbmRlbmQpKCkgIHsgcmV0dXJuIHN0YW5kZW5kKCk7IH0KKyN1bmRlZiBzdGFuZGVuZAorI2RlZmluZSBzdGFuZGVuZCBVTkRFRihzdGFuZGVuZCkKKyNlbmRpZgorCisjaWZkZWYgc3RhbmRvdXQKK2lubGluZSBpbnQgVU5ERUYoc3RhbmRvdXQpKCkgIHsgcmV0dXJuIHN0YW5kb3V0KCk7IH0KKyN1bmRlZiBzdGFuZG91dAorI2RlZmluZSBzdGFuZG91dCBVTkRFRihzdGFuZG91dCkKKyNlbmRpZgorCisjaWZkZWYgc3VicGFkCitpbmxpbmUgV0lORE9XICpVTkRFRihzdWJwYWQpKFdJTkRPVyAqcCwgaW50IGwsIGludCBjLCBpbnQgeSwgaW50IHgpCit7IHJldHVybiBkZXJ3aW4ocCwgbCwgYywgeSwgeCk7IH0KKyN1bmRlZiBzdWJwYWQKKyNkZWZpbmUgc3VicGFkIFVOREVGKHN1YnBhZCkKKyNlbmRpZgorCisjaWZkZWYgdGltZW91dAoraW5saW5lIHZvaWQgVU5ERUYodGltZW91dCkoaW50IGRlbGF5KSB7IHRpbWVvdXQoZGVsYXkpOyB9CisjdW5kZWYgdGltZW91dAorI2RlZmluZSB0aW1lb3V0IFVOREVGKHRpbWVvdXQpCisjZW5kaWYKKworI2lmZGVmIHRvdWNobGluZQoraW5saW5lIGludCBVTkRFRih0b3VjaGxpbmUpKFdJTkRPVyAqd2luLCBpbnQgcywgaW50IGMpCit7IHJldHVybiB0b3VjaGxpbmUod2luLCBzLCBjKTsgfQorI3VuZGVmIHRvdWNobGluZQorI2RlZmluZSB0b3VjaGxpbmUgVU5ERUYodG91Y2hsaW5lKQorI2VuZGlmCisKKyNpZmRlZiB0b3VjaHdpbgoraW5saW5lIGludCBVTkRFRih0b3VjaHdpbikoV0lORE9XICp3aW4pIHsgcmV0dXJuIHRvdWNod2luKHdpbik7IH0KKyN1bmRlZiB0b3VjaHdpbgorI2RlZmluZSB0b3VjaHdpbiBVTkRFRih0b3VjaHdpbikKKyNlbmRpZgorCisjaWZkZWYgdW50b3VjaHdpbgoraW5saW5lIGludCBVTkRFRih1bnRvdWNod2luKShXSU5ET1cgKndpbikgeyByZXR1cm4gdW50b3VjaHdpbih3aW4pOyB9CisjdW5kZWYgdW50b3VjaHdpbgorI2RlZmluZSB1bnRvdWNod2luIFVOREVGKHVudG91Y2h3aW4pCisjZW5kaWYKKworI2lmZGVmIHZsaW5lCitpbmxpbmUgaW50IFVOREVGKHZsaW5lKShjaHR5cGUgY2gsIGludCBuKSB7IHJldHVybiB2bGluZShjaCwgbik7IH0KKyN1bmRlZiB2bGluZQorI2RlZmluZSB2bGluZSBVTkRFRih2bGluZSkKKyNlbmRpZgorCisjaWZkZWYgd2FkZHN0cgoraW5saW5lIGludCBVTkRFRih3YWRkc3RyKShXSU5ET1cgKndpbiwgY2hhciAqc3RyKSB7IHJldHVybiB3YWRkc3RyKHdpbiwgc3RyKTsgfQorI3VuZGVmIHdhZGRzdHIKKyNkZWZpbmUgd2FkZHN0ciBVTkRFRih3YWRkc3RyKQorI2VuZGlmCisKKyNpZmRlZiB3YWRkY2hzdHIKK2lubGluZSBpbnQgVU5ERUYod2FkZGNoc3RyKShXSU5ET1cgKndpbiwgY2h0eXBlICphdCkgeyByZXR1cm4gd2FkZGNoc3RyKHdpbiwgYXQpOyB9CisjdW5kZWYgd2FkZGNoc3RyCisjZGVmaW5lIHdhZGRjaHN0ciBVTkRFRih3YWRkY2hzdHIpCisjZW5kaWYKKworI2lmZGVmIHdzdGFuZGVuZAoraW5saW5lIGludCBVTkRFRih3c3RhbmRlbmQpKFdJTkRPVyAqd2luKSAgeyByZXR1cm4gd3N0YW5kZW5kKHdpbik7IH0KKyN1bmRlZiB3c3RhbmRlbmQKKyNkZWZpbmUgd3N0YW5kZW5kIFVOREVGKHdzdGFuZGVuZCkKKyNlbmRpZgorCisjaWZkZWYgd3N0YW5kb3V0CitpbmxpbmUgaW50IFVOREVGKHdzdGFuZG91dCkoV0lORE9XICp3aW4pICB7IHJldHVybiB3c3RhbmRvdXQod2luKTsgfQorI3VuZGVmIHdzdGFuZG91dAorI2RlZmluZSB3c3RhbmRvdXQgVU5ERUYod3N0YW5kb3V0KQorI2VuZGlmCisKKworI2lmZGVmIHdhdHRyb2ZmCitpbmxpbmUgaW50IFVOREVGKHdhdHRyb2ZmKShXSU5ET1cgKndpbiwgaW50IGF0dCkgeyByZXR1cm4gd2F0dHJvZmYod2luLCBhdHQpOyB9CisjdW5kZWYgd2F0dHJvZmYKKyNkZWZpbmUgd2F0dHJvZmYgVU5ERUYod2F0dHJvZmYpCisjZW5kaWYKKworI2lmZGVmIGNoZ2F0CitpbmxpbmUgaW50IFVOREVGKGNoZ2F0KShpbnQgbiwgYXR0cl90IGF0dHIsIHNob3J0IGNvbG9yLCBjb25zdCB2b2lkICpvcHRzKSB7CisgIHJldHVybiBjaGdhdChuLCBhdHRyLCBjb2xvciwgb3B0cyk7IH0KKyN1bmRlZiBjaGdhdAorI2RlZmluZSBjaGdhdCBVTkRFRihjaGdhdCkKKyNlbmRpZgorCisjaWZkZWYgbXZjaGdhdAoraW5saW5lIGludCBVTkRFRihtdmNoZ2F0KShpbnQgeSwgaW50IHgsIGludCBuLAorCQkJICBhdHRyX3QgYXR0ciwgc2hvcnQgY29sb3IsIGNvbnN0IHZvaWQgKm9wdHMpIHsKKyAgcmV0dXJuIG12Y2hnYXQoeSwgeCwgbiwgYXR0ciwgY29sb3IsIG9wdHMpOyB9CisjdW5kZWYgbXZjaGdhdAorI2RlZmluZSBtdmNoZ2F0IFVOREVGKG12Y2hnYXQpCisjZW5kaWYKKworI2lmZGVmIG12d2NoZ2F0CitpbmxpbmUgaW50IFVOREVGKG12d2NoZ2F0KShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBpbnQgbiwKKwkJCSAgIGF0dHJfdCBhdHRyLCBzaG9ydCBjb2xvciwgY29uc3Qgdm9pZCAqb3B0cykgeworICByZXR1cm4gbXZ3Y2hnYXQod2luLCB5LCB4LCBuLCBhdHRyLCBjb2xvciwgb3B0cyk7IH0KKyN1bmRlZiBtdndjaGdhdAorI2RlZmluZSBtdndjaGdhdCBVTkRFRihtdndjaGdhdCkKKyNlbmRpZgorCisjaWZkZWYgd2F0dHJzZXQKK2lubGluZSBpbnQgVU5ERUYod2F0dHJzZXQpKFdJTkRPVyAqd2luLCBpbnQgYXR0KSB7IHJldHVybiB3YXR0cnNldCh3aW4sIGF0dCk7IH0KKyN1bmRlZiB3YXR0cnNldAorI2RlZmluZSB3YXR0cnNldCBVTkRFRih3YXR0cnNldCkKKyNlbmRpZgorCisjaWZkZWYgd2luY2gKK2lubGluZSBjaHR5cGUgVU5ERUYod2luY2gpKGNvbnN0IFdJTkRPVyogd2luKSB7IHJldHVybiB3aW5jaCh3aW4pOyB9CisjdW5kZWYgd2luY2gKKyNkZWZpbmUgd2luY2ggVU5ERUYod2luY2gpCisjZW5kaWYKKworI2lmZGVmIG12d2FkZGNoCitpbmxpbmUgaW50IFVOREVGKG12d2FkZGNoKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaHR5cGUgY2gpCit7IHJldHVybiBtdndhZGRjaCh3aW4sIHksIHgsIGNoKTsgfQorI3VuZGVmIG12d2FkZGNoCisjZGVmaW5lIG12d2FkZGNoIFVOREVGKG12d2FkZGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdndhZGRjaG5zdHIKK2lubGluZSBpbnQgVU5ERUYobXZ3YWRkY2huc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgKnN0ciwgaW50IG4pCit7IHJldHVybiBtdndhZGRjaG5zdHIod2luLCB5LCB4LCBzdHIsIG4pOyB9CisjdW5kZWYgbXZ3YWRkY2huc3RyCisjZGVmaW5lIG12d2FkZGNobnN0ciBVTkRFRihtdndhZGRjaG5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2FkZGNoc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2FkZGNoc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaHR5cGUgKnN0cikKK3sgcmV0dXJuIG12d2FkZGNoc3RyKHdpbiwgeSwgeCwgc3RyKTsgfQorI3VuZGVmIG12d2FkZGNoc3RyCisjZGVmaW5lIG12d2FkZGNoc3RyIFVOREVGKG12d2FkZGNoc3RyKQorI2VuZGlmCisKKyNpZmRlZiBhZGRuc3RyCitpbmxpbmUgaW50IFVOREVGKGFkZG5zdHIpKGNvbnN0IGNoYXIgKnN0ciwgaW50IG4pCit7IHJldHVybiBhZGRuc3RyKHN0ciwgbik7IH0KKyN1bmRlZiBhZGRuc3RyCisjZGVmaW5lIGFkZG5zdHIgVU5ERUYoYWRkbnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3YWRkbnN0cgoraW5saW5lIGludCBVTkRFRihtdndhZGRuc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjb25zdCBjaGFyICpzdHIsIGludCBuKQoreyByZXR1cm4gbXZ3YWRkbnN0cih3aW4sIHksIHgsIHN0ciwgbik7IH0KKyN1bmRlZiBtdndhZGRuc3RyCisjZGVmaW5lIG12d2FkZG5zdHIgVU5ERUYobXZ3YWRkbnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3YWRkc3RyCitpbmxpbmUgaW50IFVOREVGKG12d2FkZHN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqIHN0cikKK3sgcmV0dXJuIG12d2FkZHN0cih3aW4sIHksIHgsIHN0cik7IH0KKyN1bmRlZiBtdndhZGRzdHIKKyNkZWZpbmUgbXZ3YWRkc3RyIFVOREVGKG12d2FkZHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3ZGVsY2gKK2lubGluZSBpbnQgVU5ERUYobXZ3ZGVsY2gpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgpCit7IHJldHVybiBtdndkZWxjaCh3aW4sIHksIHgpOyB9CisjdW5kZWYgbXZ3ZGVsY2gKKyNkZWZpbmUgbXZ3ZGVsY2ggVU5ERUYobXZ3ZGVsY2gpCisjZW5kaWYKKworI2lmZGVmIG12d2dldGNoCitpbmxpbmUgaW50IFVOREVGKG12d2dldGNoKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4KSB7IHJldHVybiBtdndnZXRjaCh3aW4sIHksIHgpO30KKyN1bmRlZiBtdndnZXRjaAorI2RlZmluZSBtdndnZXRjaCBVTkRFRihtdndnZXRjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZ3Z2V0c3RyCitpbmxpbmUgaW50IFVOREVGKG12d2dldHN0cikoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCwgY2hhciAqc3RyKQore3JldHVybiBtdndnZXRzdHIod2luLCB5LCB4LCBzdHIpO30KKyN1bmRlZiBtdndnZXRzdHIKKyNkZWZpbmUgbXZ3Z2V0c3RyIFVOREVGKG12d2dldHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZ3Z2V0bnN0cgoraW5saW5lIGludCBVTkRFRihtdndnZXRuc3RyKShXSU5ET1cgKndpbiwgaW50IHksIGludCB4LCBjaGFyICpzdHIsIGludCBuKQore3JldHVybiBtdndnZXRuc3RyKHdpbiwgeSwgeCwgc3RyLCBuKTt9CisjdW5kZWYgbXZ3Z2V0bnN0cgorI2RlZmluZSBtdndnZXRuc3RyIFVOREVGKG12d2dldG5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12d2luY2gKK2lubGluZSBjaHR5cGUgVU5ERUYobXZ3aW5jaCkoV0lORE9XICp3aW4sIGludCB5LCBpbnQgeCkgeworICByZXR1cm4gbXZ3aW5jaCh3aW4sIHksIHgpO30KKyN1bmRlZiBtdndpbmNoCisjZGVmaW5lIG12d2luY2ggVU5ERUYobXZ3aW5jaCkKKyNlbmRpZgorCisjaWZkZWYgbXZ3aW5zY2gKK2lubGluZSBpbnQgVU5ERUYobXZ3aW5zY2gpKFdJTkRPVyAqd2luLCBpbnQgeSwgaW50IHgsIGNodHlwZSBjKQoreyByZXR1cm4gbXZ3aW5zY2god2luLCB5LCB4LCBjKTsgfQorI3VuZGVmIG12d2luc2NoCisjZGVmaW5lIG12d2luc2NoIFVOREVGKG12d2luc2NoKQorI2VuZGlmCisKKyNpZmRlZiBtdmFkZGNoCitpbmxpbmUgaW50IFVOREVGKG12YWRkY2gpKGludCB5LCBpbnQgeCwgY2h0eXBlIGNoKQoreyByZXR1cm4gbXZhZGRjaCh5LCB4LCBjaCk7IH0KKyN1bmRlZiBtdmFkZGNoCisjZGVmaW5lIG12YWRkY2ggVU5ERUYobXZhZGRjaCkKKyNlbmRpZgorCisjaWZkZWYgbXZhZGRuc3RyCitpbmxpbmUgaW50IFVOREVGKG12YWRkbnN0cikoaW50IHksIGludCB4LCBjb25zdCBjaGFyICpzdHIsIGludCBuKQoreyByZXR1cm4gbXZhZGRuc3RyKHksIHgsIHN0ciwgbik7IH0KKyN1bmRlZiBtdmFkZG5zdHIKKyNkZWZpbmUgbXZhZGRuc3RyIFVOREVGKG12YWRkbnN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZhZGRzdHIKK2lubGluZSBpbnQgVU5ERUYobXZhZGRzdHIpKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqIHN0cikKK3sgcmV0dXJuIG12YWRkc3RyKHksIHgsIHN0cik7IH0KKyN1bmRlZiBtdmFkZHN0cgorI2RlZmluZSBtdmFkZHN0ciBVTkRFRihtdmFkZHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZkZWxjaAoraW5saW5lIGludCBVTkRFRihtdmRlbGNoKShpbnQgeSwgaW50IHgpIHsgcmV0dXJuIG12ZGVsY2goeSwgeCk7fQorI3VuZGVmIG12ZGVsY2gKKyNkZWZpbmUgbXZkZWxjaCBVTkRFRihtdmRlbGNoKQorI2VuZGlmCisKKyNpZmRlZiBtdmdldGNoCitpbmxpbmUgaW50IFVOREVGKG12Z2V0Y2gpKGludCB5LCBpbnQgeCkgeyByZXR1cm4gbXZnZXRjaCh5LCB4KTt9CisjdW5kZWYgbXZnZXRjaAorI2RlZmluZSBtdmdldGNoIFVOREVGKG12Z2V0Y2gpCisjZW5kaWYKKworI2lmZGVmIG12Z2V0c3RyCitpbmxpbmUgaW50IFVOREVGKG12Z2V0c3RyKShpbnQgeSwgaW50IHgsIGNoYXIgKnN0cikge3JldHVybiBtdmdldHN0cih5LCB4LCBzdHIpO30KKyN1bmRlZiBtdmdldHN0cgorI2RlZmluZSBtdmdldHN0ciBVTkRFRihtdmdldHN0cikKKyNlbmRpZgorCisjaWZkZWYgbXZnZXRuc3RyCitpbmxpbmUgaW50IFVOREVGKG12Z2V0bnN0cikoaW50IHksIGludCB4LCBjaGFyICpzdHIsIGludCBuKSB7CisgIHJldHVybiBtdmdldG5zdHIoeSwgeCwgc3RyLCBuKTt9CisjdW5kZWYgbXZnZXRuc3RyCisjZGVmaW5lIG12Z2V0bnN0ciBVTkRFRihtdmdldG5zdHIpCisjZW5kaWYKKworI2lmZGVmIG12aW5jaAoraW5saW5lIGNodHlwZSBVTkRFRihtdmluY2gpKGludCB5LCBpbnQgeCkgeyByZXR1cm4gbXZpbmNoKHksIHgpO30KKyN1bmRlZiBtdmluY2gKKyNkZWZpbmUgbXZpbmNoIFVOREVGKG12aW5jaCkKKyNlbmRpZgorCisjaWZkZWYgbXZpbnNjaAoraW5saW5lIGludCBVTkRFRihtdmluc2NoKShpbnQgeSwgaW50IHgsIGNodHlwZSBjKQoreyByZXR1cm4gbXZpbnNjaCh5LCB4LCBjKTsgfQorI3VuZGVmIG12aW5zY2gKKyNkZWZpbmUgbXZpbnNjaCBVTkRFRihtdmluc2NoKQorI2VuZGlmCisKKyNpZmRlZiBuYXBtcworaW5saW5lIHZvaWQgVU5ERUYobmFwbXMpKHVuc2lnbmVkIGxvbmcgeCkgeyBuYXBtcyh4KTsgfQorI3VuZGVmIG5hcG1zCisjZGVmaW5lIG5hcG1zIFVOREVGKG5hcG1zKQorI2VuZGlmCisKKyNpZmRlZiBmaXh0ZXJtCitpbmxpbmUgaW50IFVOREVGKGZpeHRlcm0pKHZvaWQpIHsgcmV0dXJuIGZpeHRlcm0oKTsgfQorI3VuZGVmIGZpeHRlcm0KKyNkZWZpbmUgZml4dGVybSBVTkRFRihmaXh0ZXJtKQorI2VuZGlmCisKKyNpZmRlZiByZXNldHRlcm0KK2lubGluZSBpbnQgVU5ERUYocmVzZXR0ZXJtKSh2b2lkKSB7IHJldHVybiByZXNldHRlcm0oKTsgfQorI3VuZGVmIHJlc2V0dGVybQorI2RlZmluZSByZXNldHRlcm0gVU5ERUYocmVzZXR0ZXJtKQorI2VuZGlmCisKKyNpZmRlZiBzYXZldGVybQoraW5saW5lIGludCBVTkRFRihzYXZldGVybSkodm9pZCkgeyByZXR1cm4gc2F2ZXRlcm0oKTsgfQorI3VuZGVmIHNhdmV0ZXJtCisjZGVmaW5lIHNhdmV0ZXJtIFVOREVGKHNhdmV0ZXJtKQorI2VuZGlmCisKKyNpZmRlZiBjcm1vZGUKK2lubGluZSBpbnQgVU5ERUYoY3Jtb2RlKSh2b2lkKSB7IHJldHVybiBjcm1vZGUoKTsgfQorI3VuZGVmIGNybW9kZQorI2RlZmluZSBjcm1vZGUgVU5ERUYoY3Jtb2RlKQorI2VuZGlmCisKKyNpZmRlZiBub2NybW9kZQoraW5saW5lIGludCBVTkRFRihub2NybW9kZSkodm9pZCkgeyByZXR1cm4gbm9jcm1vZGUoKTsgfQorI3VuZGVmIG5vY3Jtb2RlCisjZGVmaW5lIG5vY3Jtb2RlIFVOREVGKG5vY3Jtb2RlKQorI2VuZGlmCisKKyNpZmRlZiBnZXRia2dkCitpbmxpbmUgY2h0eXBlIFVOREVGKGdldGJrZ2QpKGNvbnN0IFdJTkRPVyAqd2luKSB7IHJldHVybiBnZXRia2dkKHdpbik7IH0KKyN1bmRlZiBnZXRia2dkCisjZGVmaW5lIGdldGJrZ2QgVU5ERUYoZ2V0YmtnZCkKKyNlbmRpZgorCisjaWZkZWYgYmtnZAoraW5saW5lIGludCBVTkRFRihia2dkKShjaHR5cGUgY2gpIHsgcmV0dXJuIGJrZ2QoY2gpOyB9CisjdW5kZWYgYmtnZAorI2RlZmluZSBia2dkIFVOREVGKGJrZ2QpCisjZW5kaWYKKworI2lmZGVmIGJrZ2RzZXQKK2lubGluZSB2b2lkIFVOREVGKGJrZ2RzZXQpKGNodHlwZSBjaCkgeyBia2dkc2V0KGNoKTsgfQorI3VuZGVmIGJrZ2RzZXQKKyNkZWZpbmUgYmtnZHNldCBVTkRFRihia2dkc2V0KQorI2VuZGlmCisKKy8qCisgKgorICogQysrIGNsYXNzIGZvciB3aW5kb3dzLgorICoKKyAqLworCitleHRlcm4gIkMiIGludCAgICAgX25jX3JpcG9mZmxpbmUoaW50LCBpbnQgKCppbml0KShXSU5ET1cqLCBpbnQpKTsKK2V4dGVybiAiQyIgaW50ICAgICBfbmNfeHhfcmlwb2ZmX2luaXQoV0lORE9XICosIGludCk7CitleHRlcm4gIkMiIGludCAgICAgX25jX2hhc19tb3VzZSh2b2lkKTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1dpbmRvdworeworICBmcmllbmQgY2xhc3MgTkN1cnNlc01lbnU7CisgIGZyaWVuZCBjbGFzcyBOQ3Vyc2VzRm9ybTsKKworcHJpdmF0ZToKKyAgc3RhdGljIGJvb2wgICAgYl9pbml0aWFsaXplZDsKKyAgc3RhdGljIHZvaWQgICAgaW5pdGlhbGl6ZSgpOworICB2b2lkICAgICAgICAgICBjb25zdHJ1Y3RpbmcoKTsKKyAgZnJpZW5kIGludCAgICAgX25jX3h4X3JpcG9mZl9pbml0KFdJTkRPVyAqLCBpbnQpOworCisgIHZvaWQgICAgICAgICAgIHNldF9rZXlib2FyZCgpOworCisgIHNob3J0ICAgICAgICAgIGdldGNvbG9yKGludCBnZXRiYWNrKSBjb25zdDsKKyAgc2hvcnQgICAgICAgICAgZ2V0UGFpcigpIGNvbnN0OworCisgIHN0YXRpYyBpbnQgICAgIHNldHBhbGV0dGUoc2hvcnQgZm9yZSwgc2hvcnQgYmFjaywgc2hvcnQgcGFpcik7CisgIHN0YXRpYyBpbnQgICAgIGNvbG9ySW5pdGlhbGl6ZWQ7CisKKyAgLy8gVGhpcyBwcml2YXRlIGNvbnN0cnVjdG9yIGlzIG9ubHkgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uCisgIC8vIG9mIHdpbmRvd3MgZ2VuZXJhdGVkIGJ5IHJpcG9mZmxpbmUoKSBjYWxscy4KKyAgTkN1cnNlc1dpbmRvdyhXSU5ET1cqIHdpbiwgaW50IG5jb2xzKTsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgICBlcnJfaGFuZGxlcihjb25zdCBjaGFyICopIGNvbnN0IFRIUk9XUyhOQ3Vyc2VzRXhjZXB0aW9uKTsKKyAgLy8gU2lnbmFsIGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgdGV4dC4KKworICBzdGF0aWMgbG9uZyBjb3VudDsgICAgICAgIC8vIGNvdW50IG9mIGFsbCBhY3RpdmUgd2luZG93czoKKyAgLy8gICBXZSByZWx5IG9uIHRoZSBjKysgcHJvbWlzZSB0aGF0CisgIC8vICAgYWxsIG90aGVyd2lzZSB1bmluaXRpYWxpemVkCisgIC8vICAgc3RhdGljIGNsYXNzIHZhcnMgYXJlIHNldCB0byAwCisKKyAgV0lORE9XKiAgICAgICAgdzsgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnNlcyBXSU5ET1cKKworICBib29sICAgICAgICAgICBhbGxvY2VkOyAgICAgICAgICAvLyBUUlVFIGlmIHdlIG93biB0aGUgV0lORE9XCisKKyAgTkN1cnNlc1dpbmRvdyogcGFyOyAgICAgICAgICAgICAgLy8gcGFyZW50LCBpZiBzdWJ3aW5kb3cKKyAgTkN1cnNlc1dpbmRvdyogc3Vid2luczsgICAgICAgICAgLy8gaGVhZCBvZiBzdWJ3aW5kb3dzIGxpc3QKKyAgTkN1cnNlc1dpbmRvdyogc2liOyAgICAgICAgICAgICAgLy8gbmV4dCBzdWJ3aW5kb3cgb2YgcGFyZW50CisKKyAgdm9pZCAgICAgICAgICAga2lsbF9zdWJ3aW5kb3dzKCk7IC8vIGRpc2FibGUgYWxsIHN1YndpbmRvd3MKKyAgLy8gRGVzdHJveSBhbGwgc3Vid2luZG93cy4KKworICAvKiBPbmx5IGZvciB1c2UgYnkgZGVyaXZlZCBjbGFzc2VzLiBUaGV5IGFyZSB0aGVuIGluIGNoYXJnZSB0bworICAgICBmaWxsIHRoZSBtZW1iZXIgdmFyaWFibGVzIGNvcnJlY3RseS4gKi8KKyAgTkN1cnNlc1dpbmRvdygpOworCitwdWJsaWM6CisgIE5DdXJzZXNXaW5kb3coV0lORE9XKiB3aW5kb3cpOyAgIC8vIHVzZWZ1bCBvbmx5IGZvciBzdGRzY3IKKworICBOQ3Vyc2VzV2luZG93KGludCBubGluZXMsICAgICAgICAvLyBudW1iZXIgb2YgbGluZXMKKwkJaW50IG5jb2xzLCAgICAgICAgIC8vIG51bWJlciBvZiBjb2x1bW5zCisJCWludCBiZWdpbl95LCAgICAgICAvLyBsaW5lIG9yaWdpbgorCQlpbnQgYmVnaW5feCk7ICAgICAgLy8gY29sIG9yaWdpbgorCisgIE5DdXJzZXNXaW5kb3coTkN1cnNlc1dpbmRvdyYgcGFyLC8vIHBhcmVudCB3aW5kb3cKKwkJaW50IG5saW5lcywgICAgICAgIC8vIG51bWJlciBvZiBsaW5lcworCQlpbnQgbmNvbHMsICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMKKwkJaW50IGJlZ2luX3ksICAgICAgIC8vIGFic29sdXRlIG9yIHJlbGF0aXZlCisJCWludCBiZWdpbl94LCAgICAgICAvLyAgIG9yaWdpbnM6CisJCWNoYXIgYWJzcmVsID0gJ2EnKTsvLyBpZiBgYScsIGJlZ2luX3kgJiBiZWdpbl94IGFyZQorICAvLyBhYnNvbHV0ZSBzY3JlZW4gcG9zLCBlbHNlIGlmIGByJywgdGhleSBhcmUgcmVsYXRpdmUgdG8gcGFyIG9yaWdpbgorCisgIE5DdXJzZXNXaW5kb3coTkN1cnNlc1dpbmRvdyYgcGFyLC8vIHBhcmVudCB3aW5kb3cKKwkJYm9vbCBkb19ib3ggPSBUUlVFKTsKKyAgLy8gdGhpcyBpcyB0aGUgdmVyeSBjb21tb24gY2FzZSB0aGF0IHdlIHdhbnQgdG8gY3JlYXRlIHRoZSBzdWJ3aW5kb3cgdGhhdAorICAvLyBpcyB0d28gbGluZXMgYW5kIHR3byBjb2x1bW5zIHNtYWxsZXIgYW5kIGJlZ2lucyBhdCAoMSwxKS4KKyAgLy8gV2UgbWF5IGF1dG9tYXRpY2FsbHkgcmVxdWVzdCB0aGUgYm94IGFyb3VuZCBpdC4KKworICBOQ3Vyc2VzV2luZG93JiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc1dpbmRvdyYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykKKyAgICAgICp0aGlzID0gcmhzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNXaW5kb3coY29uc3QgTkN1cnNlc1dpbmRvdyYgcmhzKQorICAgIDogdyhyaHMudyksIGFsbG9jZWQocmhzLmFsbG9jZWQpLCBwYXIocmhzLnBhciksIHN1YndpbnMocmhzLnN1YndpbnMpLCBzaWIocmhzLnNpYikKKyAgeworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1dpbmRvdygpOworCisgIE5DdXJzZXNXaW5kb3cgQ2xvbmUoKTsKKyAgLy8gTWFrZSBhbiBleGFjdCBjb3B5IG9mIHRoZSB3aW5kb3cuCisKKyAgLy8gSW5pdGlhbGl6YXRpb24uCisgIHN0YXRpYyB2b2lkICAgIHVzZUNvbG9ycyh2b2lkKTsKKyAgLy8gQ2FsbCB0aGlzIHJvdXRpbmUgdmVyeSBlYXJseSBpZiB5b3Ugd2FudCB0byBoYXZlIGNvbG9ycy4KKworICBzdGF0aWMgaW50IHJpcG9mZmxpbmUoaW50IHJpcG9mZl9saW5lcywKKwkJCWludCAoKmluaXQpKE5DdXJzZXNXaW5kb3cmIHdpbikpOworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB3aW5kb3cgb2YgcmlwcGVkLW9mIGxpbmVzLgorICAvLyBJZiB0aGUgYXJndW1lbnQgaXMgcG9zaXRpdmUsIGxpbmVzIGFyZSByZW1vdmVkIGZyb20gdGhlIHRvcCwgaWYgaXQKKyAgLy8gaXMgbmVnYXRpdmUgbGluZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgYm90dG9tLiBUaGlzIGVuaGFuY2VzIHRoZQorICAvLyBsb3dsZXZlbCByaXBvZmZsaW5lKCkgZnVuY3Rpb24gYmVjYXVzZSBpdCB1c2VzIHRoZSBpbnRlcm5hbAorICAvLyBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyB0byByZW1vdmUgbW9yZSB0aGFuIGp1c3QgYSBzaW5nbGUgbGluZS4KKyAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG5jdXJzZXMgZnVuY3Rpb24uIFRoZQorICAvLyBjcmVhdGlvbiBvZiB0aGUgd2luZG93IGlzIGRlZmVycmVkIHVudGlsIG5jdXJzZXMgZ2V0cyBpbml0aWFsaXplZC4KKyAgLy8gVGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIHRoZW4gY2FsbGVkLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gdGVybWluYWwgc3RhdHVzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgbGluZXMoKSBjb25zdCB7IGluaXRpYWxpemUoKTsgcmV0dXJuIExJTkVTOyB9CisgIC8vIE51bWJlciBvZiBsaW5lcyBvbiB0ZXJtaW5hbCwgKm5vdCogd2luZG93CisKKyAgaW50ICAgICAgICAgICAgY29scygpIGNvbnN0IHsgaW5pdGlhbGl6ZSgpOyByZXR1cm4gQ09MUzsgfQorICAvLyBOdW1iZXIgb2YgY29scyAgb24gdGVybWluYWwsICpub3QqIHdpbmRvdworCisgIGludCAgICAgICAgICAgIHRhYnNpemUoKSBjb25zdCB7IGluaXRpYWxpemUoKTsgcmV0dXJuIFRBQlNJWkU7IH0KKyAgLy8gU2l6ZSBvZiBhIHRhYiBvbiB0ZXJtaW5hbCwgKm5vdCogd2luZG93CisKKyAgc3RhdGljIGludCAgICAgTnVtYmVyT2ZDb2xvcnMoKTsKKyAgLy8gTnVtYmVyIG9mIGF2YWlsYWJsZSBjb2xvcnMKKworICBpbnQgICAgICAgICAgICBjb2xvcnMoKSBjb25zdCB7IHJldHVybiBOdW1iZXJPZkNvbG9ycygpOyB9CisgIC8vIE51bWJlciBvZiBhdmFpbGFibGUgY29sb3JzCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyB3aW5kb3cgc3RhdHVzCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbWF4eSgpICsgMTsgfQorICAvLyBOdW1iZXIgb2YgbGluZXMgaW4gdGhpcyB3aW5kb3cKKworICBpbnQgICAgICAgICAgICB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1heHgoKSArIDE7IH0KKyAgLy8gTnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhpcyB3aW5kb3cKKworICBpbnQgICAgICAgICAgICBiZWd4KCkgY29uc3QgeyByZXR1cm4gZ2V0YmVneCh3KTsgfQorICAvLyBDb2x1bW4gb2YgdG9wIGxlZnQgY29ybmVyIHJlbGF0aXZlIHRvIHN0ZHNjcgorCisgIGludCAgICAgICAgICAgIGJlZ3koKSBjb25zdCB7IHJldHVybiBnZXRiZWd5KHcpOyB9CisgIC8vIExpbmUgb2YgdG9wIGxlZnQgY29ybmVyIHJlbGF0aXZlIHRvIHN0ZHNjcgorCisgIGludCAgICAgICAgICAgIG1heHgoKSBjb25zdCB7IHJldHVybiBnZXRtYXh4KHcpID09IEVSUiA/IEVSUiA6IGdldG1heHgodyktMTsgfQorICAvLyBMYXJnZXN0IHggY29vcmQgaW4gd2luZG93CisKKyAgaW50ICAgICAgICAgICAgbWF4eSgpIGNvbnN0IHsgcmV0dXJuIGdldG1heHkodykgPT0gRVJSID8gRVJSIDogZ2V0bWF4eSh3KS0xOyB9CisgIC8vIExhcmdlc3QgeSBjb29yZCBpbiB3aW5kb3cKKworICBzaG9ydCAgICAgICAgICBnZXRjb2xvcigpIGNvbnN0OworICAvLyBBY3R1YWwgY29sb3IgcGFpcgorCisgIHNob3J0ICAgICAgICAgIGZvcmVncm91bmQoKSBjb25zdCB7IHJldHVybiBnZXRjb2xvcigwKTsgfQorICAvLyBBY3R1YWwgZm9yZWdyb3VuZCBjb2xvcgorCisgIHNob3J0ICAgICAgICAgIGJhY2tncm91bmQoKSBjb25zdCB7IHJldHVybiBnZXRjb2xvcigxKTsgfQorICAvLyBBY3R1YWwgYmFja2dyb3VuZCBjb2xvcgorCisgIGludCAgICAgICAgICAgIHNldHBhbGV0dGUoc2hvcnQgZm9yZSwgc2hvcnQgYmFjayk7CisgIC8vIFNldCBjb2xvciBwYWxldHRlIGVudHJ5CisKKyAgaW50ICAgICAgICAgICAgc2V0Y29sb3Ioc2hvcnQgcGFpcik7CisgIC8vIFNldCBhY3R1YWxseSB1c2VkIHBhbGV0dGUgZW50cnkKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHdpbmRvdyBwb3NpdGlvbmluZworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgaW50ICAgIG12d2luKGludCBiZWdpbl95LCBpbnQgYmVnaW5feCkgeworICAgIHJldHVybiA6Om12d2luKHcsIGJlZ2luX3ksIGJlZ2luX3gpOyB9CisgIC8vIE1vdmUgd2luZG93IHRvIG5ldyBwb3NpdGlvbiB3aXRoIHRoZSBuZXcgcG9zaXRpb24gYXMgdG9wIGxlZnQgY29ybmVyLgorICAvLyBUaGlzIGlzIHZpcnR1YWwgYmVjYXVzZSBpdCBpcyByZWRlZmluZWQgaW4gTkN1cnNlc1BhbmVsLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gY29vcmRpbmF0ZSBwb3NpdGlvbmluZworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIG1vdmUoaW50IHksIGludCB4KSB7IHJldHVybiA6Ondtb3ZlKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRoZSB0aGlzIHBvc2l0aW9uCisKKyAgdm9pZCAgICAgICAgICAgZ2V0eXgoaW50JiB5LCBpbnQmIHgpIGNvbnN0IHsgOjpnZXR5eCh3LCB5LCB4KTsgfQorICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yCisKKyAgaW50ICAgICAgICAgICAgbXZjdXIoaW50IG9sZHJvdywgaW50IG9sZGNvbCwgaW50IG5ld3JvdywgaW50IG5ld2NvbCkgY29uc3QgeworICAgIHJldHVybiA6Om12Y3VyKG9sZHJvdywgb2xkY29sLCBuZXdyb3csIG5ld2NvbCk7IH0KKyAgLy8gUGVyZm9ybSBsb3dsZXZlbCBjdXJzb3IgbW90aW9uIHRoYXQgdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gaW5wdXQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgICAgICAgICAgICBnZXRjaCgpIHsgcmV0dXJuIDo6d2dldGNoKHcpOyB9CisgIC8vIEdldCBhIGtleXN0cm9rZSBmcm9tIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgZ2V0Y2goaW50IHksIGludCB4KSB7IHJldHVybiA6Om12d2dldGNoKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHBvc2l0aW9uIGFuZCBnZXQgYSBrZXlzdHJva2UgZnJvbSB0aGUgd2luZG93CisKKyAgaW50ICAgICAgICAgICAgZ2V0c3RyKGNoYXIqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjp3Z2V0bnN0cih3LCBzdHIsIG4pOyB9CisgIC8vIFJlYWQgYSBzZXJpZXMgb2YgY2hhcmFjdGVycyBpbnRvIHN0ciB1bnRpbCBhIG5ld2xpbmUgb3IgY2FycmlhZ2UgcmV0dXJuCisgIC8vIGlzIHJlY2VpdmVkLiBSZWFkIGF0IG1vc3QgbiBjaGFyYWN0ZXJzLiBJZiBuIGlzIG5lZ2F0aXZlLCB0aGUgbGltaXQgaXMKKyAgLy8gaWdub3JlZC4KKworICBpbnQgICAgICAgICAgICBnZXRzdHIoaW50IHksIGludCB4LCBjaGFyKiBzdHIsIGludCBuPS0xKSB7CisgICAgcmV0dXJuIDo6bXZ3Z2V0bnN0cih3LCB5LCB4LCBzdHIsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGdldHN0cigpCisgIC8vIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICBpbnQgICAgICAgICAgICBpbnN0cihjaGFyICpzLCBpbnQgbj0tMSkgeyByZXR1cm4gOjp3aW5uc3RyKHcsIHMsIG4pOyB9CisgIC8vIEdldCBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHdpbmRvdyBpbnRvIHRoZSBidWZmZXIgcy4gUmV0cmlldmUKKyAgLy8gYXQgbW9zdCBuIGNoYXJhY3RlcnMsIGlmIG4gaXMgbmVnYXRpdmUgcmV0cmlldmUgYWxsIGNoYXJhY3RlcnMgdXAgdG8gdGhlCisgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLiBBdHRyaWJ1dGVzIGFyZSBzdHJpcHBlZCBmcm9tIHRoZSBjaGFyYWN0ZXJzLgorCisgIGludCAgICAgICAgICAgIGluc3RyKGludCB5LCBpbnQgeCwgY2hhciAqcywgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndpbm5zdHIodywgeSwgeCwgcywgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgaW5zdHIoKQorICAvLyBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgaW50ICAgICAgICAgICAgc2NhbncoY29uc3QgY2hhciogZm10LCAuLi4pCisgICAgLy8gUGVyZm9ybSBhIHNjYW53IGZ1bmN0aW9uIGZyb20gdGhlIHdpbmRvdy4KKyNpZiBfX0dOVUdfXyA+PSAyCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoc2NhbmYsIDIsIDMpKSk7CisjZWxzZQorICA7CisjZW5kaWYKKworICBpbnQgICAgICAgICAgICBzY2FudyhpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQorICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gYSBzY2FudworICAgIC8vIGZyb20gdGhlIHdpbmRvdy4KKyNpZiBfX0dOVUdfXyA+PSAyCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAoc2NhbmYsIDQsIDUpKSk7CisjZWxzZQorICA7CisjZW5kaWYKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIG91dHB1dAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGFkZGNoKGNvbnN0IGNodHlwZSBjaCkgeyByZXR1cm4gOjp3YWRkY2godywgY2gpOyB9CisgIC8vIFB1dCBhdHRyaWJ1dGVkIGNoYXJhY3RlciB0byB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIGFkZGNoKGludCB5LCBpbnQgeCwgY29uc3QgY2h0eXBlIGNoKSB7CisgICAgcmV0dXJuIDo6bXZ3YWRkY2godywgeSwgeCwgY2gpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcHV0IGF0dHJpYnV0ZWQgY2hhcmFjdGVyCisgIC8vIHRvIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgZWNob2NoYXIoY29uc3QgY2h0eXBlIGNoKSB7IHJldHVybiA6OndlY2hvY2hhcih3LCBjaCk7IH0KKyAgLy8gUHV0IGF0dHJpYnV0ZWQgY2hhcmFjdGVyIHRvIHRoZSB3aW5kb3cgYW5kIHJlZnJlc2ggaXQgaW1tZWRpYXRlbHkuCisKKyAgaW50ICAgICAgICAgICAgYWRkc3RyKGNvbnN0IGNoYXIqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjp3YWRkbnN0cih3LCBzdHIsIG4pOyB9CisgIC8vIFdyaXRlIHRoZSBzdHJpbmcgc3RyIHRvIHRoZSB3aW5kb3csIHN0b3Agd3JpdGluZyBpZiB0aGUgdGVybWluYXRpbmcKKyAgLy8gTlVMIG9yIHRoZSBsaW1pdCBuIGlzIHJlYWNoZWQuIElmIG4gaXMgbmVnYXRpdmUsIGl0IGlzIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgYWRkc3RyKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqIHN0ciwgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndhZGRuc3RyKHcsIHksIHgsIHN0ciwgbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gcGVyZm9ybSB0aGUgYWRkc3RyCisgIC8vIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICBpbnQgICAgICAgICAgICBwcmludHcoY29uc3QgY2hhciogZm10LCAuLi4pCisgICAgLy8gRG8gYSBmb3JtYXR0ZWQgcHJpbnQgdG8gdGhlIHdpbmRvdy4KKyNpZiAoX19HTlVHX18gPj0gMikgJiYgIWRlZmluZWQocHJpbnRmKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKyNlbHNlCisgIDsKKyNlbmRpZgorCisgIGludCAgICAgICAgICAgIHByaW50dyhpbnQgeSwgaW50IHgsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKKyAgICAvLyBNb3ZlIHRoZSBjdXJzb3IgYW5kIHRoZW4gZG8gYSBmb3JtYXR0ZWQgcHJpbnQgdG8gdGhlIHdpbmRvdy4KKyNpZiAoX19HTlVHX18gPj0gMikgJiYgIWRlZmluZWQocHJpbnRmKQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKKyNlbHNlCisgIDsKKyNlbmRpZgorCisgIGNodHlwZSAgICAgICAgIGluY2goKSBjb25zdCB7IHJldHVybiA6OndpbmNoKHcpOyB9CisgIC8vIFJldHJpZXZlIGF0dHJpYnV0ZWQgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KKworICBjaHR5cGUgICAgICAgICBpbmNoKGludCB5LCBpbnQgeCkgeyByZXR1cm4gOjptdndpbmNoKHcsIHksIHgpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiByZXRyaWV2ZSBhdHRyaWJ1dGVkIGNoYXJhY3RlcgorICAvLyBhdCB0aGlzIHBvc2l0aW9uLgorCisgIGludCAgICAgICAgICAgIGluc2NoKGNodHlwZSBjaCkgeyByZXR1cm4gOjp3aW5zY2godywgY2gpOyB9CisgIC8vIEluc2VydCBhdHRyaWJ1dGVkIGNoYXJhY3RlciBpbnRvIHRoZSB3aW5kb3cgYmVmb3JlIGN1cnJlbnQgY3Vyc29yCisgIC8vIHBvc2l0aW9uLgorCisgIGludCAgICAgICAgICAgIGluc2NoKGludCB5LCBpbnQgeCwgY2h0eXBlIGNoKSB7CisgICAgcmV0dXJuIDo6bXZ3aW5zY2godywgeSwgeCwgY2gpOyB9CisgIC8vIE1vdmUgY3Vyc29yIHRvIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBpbnNlcnQgdGhlIGF0dHJpYnV0ZWQKKyAgLy8gY2hhcmFjdGVyIGJlZm9yZSB0aGF0IHBvc2l0aW9uLgorCisgIGludCAgICAgICAgICAgIGluc2VydGxuKCkgeyByZXR1cm4gOjp3aW5zZGVsbG4odywgMSk7IH0KKyAgLy8gSW5zZXJ0IGFuIGVtcHR5IGxpbmUgYWJvdmUgdGhlIGN1cnJlbnQgbGluZS4KKworICBpbnQgICAgICAgICAgICBpbnNkZWxsbihpbnQgbj0xKSB7IHJldHVybiA6OndpbnNkZWxsbih3LCBuKTsgfQorICAvLyBJZiBuPjAgaW5zZXJ0IHRoYXQgbWFueSBsaW5lcyBhYm92ZSB0aGUgY3VycmVudCBsaW5lLiBJZiBuPDAgZGVsZXRlCisgIC8vIHRoYXQgbWFueSBsaW5lcyBiZWdpbm5pbmcgd2l0aCB0aGUgY3VycmVudCBsaW5lLgorCisgIGludCAgICAgICAgICAgIGluc3N0cihjb25zdCBjaGFyICpzLCBpbnQgbj0tMSkgeworICAgIHJldHVybiA6OndpbnNuc3RyKHcsIHMsIG4pOyB9CisgIC8vIEluc2VydCB0aGUgc3RyaW5nIGludG8gdGhlIHdpbmRvdyBiZWZvcmUgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLgorICAvLyBJbnNlcnQgc3RvcHMgYXQgZW5kIG9mIHN0cmluZyBvciB3aGVuIHRoZSBsaW1pdCBuIGlzIHJlYWNoZWQuIElmIG4gaXMKKyAgLy8gbmVnYXRpdmUsIGl0IGlzIGlnbm9yZWQuCisKKyAgaW50ICAgICAgICAgICAgaW5zc3RyKGludCB5LCBpbnQgeCwgY29uc3QgY2hhciAqcywgaW50IG49LTEpIHsKKyAgICByZXR1cm4gOjptdndpbnNuc3RyKHcsIHksIHgsIHMsIG4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGluc3N0cigpCisgIC8vIGFzIGRlc2NyaWJlZCBhYm92ZS4KKworICBpbnQgICAgICAgICAgICBhdHRyb24gKGNodHlwZSBhdCkgeyByZXR1cm4gOjp3YXR0cm9uICh3LCBhdCk7IH0KKyAgLy8gU3dpdGNoIG9uIHRoZSB3aW5kb3cgYXR0cmlidXRlczsKKworICBpbnQgICAgICAgICAgICBhdHRyb2ZmKGNodHlwZSBhdCkgeyByZXR1cm4gOjp3YXR0cm9mZih3LCBzdGF0aWNfY2FzdDxpbnQ+KGF0KSk7IH0KKyAgLy8gU3dpdGNoIG9mZiB0aGUgd2luZG93IGF0dHJpYnV0ZXM7CisKKyAgaW50ICAgICAgICAgICAgYXR0cnNldChjaHR5cGUgYXQpIHsgcmV0dXJuIDo6d2F0dHJzZXQodywgc3RhdGljX2Nhc3Q8aW50PihhdCkpOyB9CisgIC8vIFNldCB0aGUgd2luZG93IGF0dHJpYnV0ZXM7CisKKyAgaW50ICAgICAgICAgICAgY29sb3Jfc2V0KHNob3J0IGNvbG9yX3BhaXJfbnVtYmVyLCB2b2lkKiBvcHRzPU5VTEwpIHsKKyAgICByZXR1cm4gOjp3Y29sb3Jfc2V0KHcsIGNvbG9yX3BhaXJfbnVtYmVyLCBvcHRzKTsgfQorICAvLyBTZXQgdGhlIHdpbmRvdyBjb2xvciBhdHRyaWJ1dGU7CisKKyAgaW50ICAgICAgICAgICAgY2hnYXQoaW50IG4sIGF0dHJfdCBhdHRyLCBzaG9ydCBjb2xvciwgY29uc3Qgdm9pZCAqb3B0cz1OVUxMKSB7CisgICAgcmV0dXJuIDo6d2NoZ2F0KHcsIG4sIGF0dHIsIGNvbG9yLCBvcHRzKTsgfQorICAvLyBDaGFuZ2UgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5leHQgbiBjaGFyYWN0ZXJzIGluIHRoZSBjdXJyZW50IGxpbmUuIElmCisgIC8vIG4gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGNoYXJhY3RlcnMgaW4gdGhlCisgIC8vIGxpbmUsIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgY2hhbmdlZCB1cCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCisgIGludCAgICAgICAgICAgIGNoZ2F0KGludCB5LCBpbnQgeCwKKwkJICAgICAgIGludCBuLCBhdHRyX3QgYXR0ciwgc2hvcnQgY29sb3IsIGNvbnN0IHZvaWQgKm9wdHM9TlVMTCkgeworICAgIHJldHVybiA6Om12d2NoZ2F0KHcsIHksIHgsIG4sIGF0dHIsIGNvbG9yLCBvcHRzKTsgfQorICAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBhbmQgdGhlbiBwZXJmb3JtIGNoZ2F0KCkgYXMKKyAgLy8gZGVzY3JpYmVkIGFib3ZlLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gYmFja2dyb3VuZAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGNodHlwZSAgICAgICAgIGdldGJrZ2QoKSBjb25zdCB7IHJldHVybiA6OmdldGJrZ2Qodyk7IH0KKyAgLy8gR2V0IGN1cnJlbnQgYmFja2dyb3VuZCBzZXR0aW5nLgorCisgIGludCAgICAgICAgICAgIGJrZ2QoY29uc3QgY2h0eXBlIGNoKSB7IHJldHVybiA6Ondia2dkKHcsIGNoKTsgfQorICAvLyBTZXQgdGhlIGJhY2tncm91bmQgcHJvcGVydHkgYW5kIGFwcGx5IGl0IHRvIHRoZSB3aW5kb3cuCisKKyAgdm9pZCAgICAgICAgICAgYmtnZHNldChjaHR5cGUgY2gpIHsgOjp3YmtnZHNldCh3LCBjaCk7IH0KKyAgLy8gU2V0IHRoZSBiYWNrZ3JvdW5kIHByb3BlcnR5LgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gYm9yZGVycworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGJveChjaHR5cGUgdmVydD0wLCBjaHR5cGUgIGhvcj0wKSB7CisgICAgcmV0dXJuIDo6d2JvcmRlcih3LCB2ZXJ0LCB2ZXJ0LCBob3IsIGhvciwgMCwgMCwgMCwgMCk7IH0KKyAgLy8gRHJhdyBhIGJveCBhcm91bmQgdGhlIHdpbmRvdyB3aXRoIHRoZSBnaXZlbiB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbAorICAvLyBkcmF3aW5nIGNoYXJhY3RlcnMuIElmIHlvdSBzcGVjaWZ5IGEgemVybyBhcyBjaGFyYWN0ZXIsIGN1cnNlcyB3aWxsIHRyeQorICAvLyB0byBmaW5kIGEgIm5pY2UiIGNoYXJhY3Rlci4KKworICBpbnQgICAgICAgICAgICBib3JkZXIoY2h0eXBlIGxlZnQ9MCwgY2h0eXBlIHJpZ2h0PTAsCisJCQljaHR5cGUgdG9wID0wLCBjaHR5cGUgYm90dG9tPTAsCisJCQljaHR5cGUgdG9wX2xlZnQgPTAsIGNodHlwZSB0b3BfcmlnaHQ9MCwKKwkJCWNodHlwZSBib3R0b21fbGVmdCA9MCwgY2h0eXBlIGJvdHRvbV9yaWdodD0wKSB7CisgICAgcmV0dXJuIDo6d2JvcmRlcih3LCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRvcF9sZWZ0LCB0b3BfcmlnaHQsCisJCSAgICAgYm90dG9tX2xlZnQsIGJvdHRvbV9yaWdodCk7IH0KKyAgLy8gRHJhdyBhIGJvcmRlciBhcm91bmQgdGhlIHdpbmRvdyB3aXRoIHRoZSBnaXZlbiBjaGFyYWN0ZXJzIGZvciB0aGUKKyAgLy8gdmFyaW91cyBwYXJ0cyBvZiB0aGUgYm9yZGVyLiBJZiB5b3UgcGFzcyB6ZXJvIGZvciBhIGNoYXJhY3RlciwgY3Vyc2VzCisgIC8vIHdpbGwgdHJ5IHRvIGZpbmQgIm5pY2UiIGNoYXJhY3RlcnMuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBsaW5lcyBhbmQgYm94ZXMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgICAgICAgICAgICBobGluZShpbnQgbGVuLCBjaHR5cGUgY2g9MCkgeyByZXR1cm4gOjp3aGxpbmUodywgY2gsIGxlbik7IH0KKyAgLy8gRHJhdyBhIGhvcml6b250YWwgbGluZSBvZiBsZW4gY2hhcmFjdGVycyB3aXRoIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIElmCisgIC8vIHlvdSBwYXNzIHplcm8gZm9yIHRoZSBjaGFyYWN0ZXIsIGN1cnNlcyB3aWxsIHRyeSB0byBmaW5kIGEgIm5pY2UiIG9uZS4KKworICBpbnQgICAgICAgICAgICBobGluZShpbnQgeSwgaW50IHgsIGludCBsZW4sIGNodHlwZSBjaD0wKSB7CisgICAgcmV0dXJuIDo6bXZ3aGxpbmUodywgeSwgeCwgY2gsIGxlbik7IH0KKyAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gYW5kIHRoZW4gZHJhdyBhIGhvcml6b250YWwgbGluZS4KKworICBpbnQgICAgICAgICAgICB2bGluZShpbnQgbGVuLCBjaHR5cGUgY2g9MCkgeyByZXR1cm4gOjp3dmxpbmUodywgY2gsIGxlbik7IH0KKyAgLy8gRHJhdyBhIHZlcnRpY2FsIGxpbmUgb2YgbGVuIGNoYXJhY3RlcnMgd2l0aCB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiBJZgorICAvLyB5b3UgcGFzcyB6ZXJvIGZvciB0aGUgY2hhcmFjdGVyLCBjdXJzZXMgd2lsbCB0cnkgdG8gZmluZCBhICJuaWNlIiBvbmUuCisKKyAgaW50ICAgICAgICAgICAgdmxpbmUoaW50IHksIGludCB4LCBpbnQgbGVuLCBjaHR5cGUgY2g9MCkgeworICAgIHJldHVybiA6Om12d3ZsaW5lKHcsIHksIHgsIGNoLCBsZW4pOyB9CisgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCB0aGVuIGRyYXcgYSB2ZXJ0aWNhbCBsaW5lLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gZXJhc3VyZQorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGludCAgICAgICAgICAgIGVyYXNlKCkgeyByZXR1cm4gOjp3ZXJhc2Uodyk7IH0KKyAgLy8gRXJhc2UgdGhlIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBjbGVhcigpIHsgcmV0dXJuIDo6d2NsZWFyKHcpOyB9CisgIC8vIENsZWFyIHRoZSB3aW5kb3cuCisKKyAgaW50ICAgICAgICAgICAgY2xlYXJvayhib29sIGJmKSB7IHJldHVybiA6OmNsZWFyb2sodywgYmYpOyB9CisgIC8vIFNldC9SZXNldCB0aGUgY2xlYXIgZmxhZy4gSWYgc2V0LCB0aGUgbmV4dCByZWZyZXNoKCkgd2lsbCBjbGVhciB0aGUKKyAgLy8gc2NyZWVuLgorCisgIGludCAgICAgICAgICAgIGNscnRvYm90KCkgeyByZXR1cm4gOjp3Y2xydG9ib3Qodyk7IH0KKyAgLy8gQ2xlYXIgdG8gdGhlIGVuZCBvZiB0aGUgd2luZG93LgorCisgIGludCAgICAgICAgICAgIGNscnRvZW9sKCkgeyByZXR1cm4gOjp3Y2xydG9lb2wodyk7IH0KKyAgLy8gQ2xlYXIgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKworICBpbnQgICAgICAgICAgICBkZWxjaCgpIHsgcmV0dXJuIDo6d2RlbGNoKHcpOyB9CisgIC8vIERlbGV0ZSBjaGFyYWN0ZXIgdW5kZXIgdGhlIGN1cnNvci4KKworICBpbnQgICAgICAgICAgICBkZWxjaChpbnQgeSwgaW50IHgpIHsgcmV0dXJuIDo6bXZ3ZGVsY2godywgeSwgeCk7IH0KKyAgLy8gTW92ZSBjdXJzb3IgdG8gcmVxdWVzdGVkIHBvc2l0aW9uIGFuZCBkZWxldGUgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUKKyAgLy8gY3Vyc29yLgorCisgIGludCAgICAgICAgICAgIGRlbGV0ZWxuKCkgeyByZXR1cm4gOjp3aW5zZGVsbG4odywgLTEpOyB9CisgIC8vIERlbGV0ZSB0aGUgY3VycmVudCBsaW5lLgorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gc2NyZWVuIGNvbnRyb2wKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBpbnQgICAgICAgICAgICBzY3JvbGwoaW50IGFtb3VudD0xKSB7IHJldHVybiA6OndzY3JsKHcsIGFtb3VudCk7IH0KKyAgLy8gU2Nyb2xsIGFtb3VudCBsaW5lcy4gSWYgYW1vdW50IGlzIHBvc2l0aXZlLCBzY3JvbGwgdXAsIG90aGVyd2lzZQorICAvLyBzY3JvbGwgZG93bi4KKworICBpbnQgICAgICAgICAgICBzY3JvbGxvayhib29sIGJmKSB7IHJldHVybiA6OnNjcm9sbG9rKHcsIGJmKTsgfQorICAvLyBJZiBiZiBpcyBUUlVFLCB3aW5kb3cgc2Nyb2xscyBpZiBjdXJzb3IgaXMgbW92ZWQgb2ZmIHRoZSBib3R0b20KKyAgLy8gZWRnZSBvZiB0aGUgd2luZG93IG9yIGEgc2Nyb2xsaW5nIHJlZ2lvbiwgb3RoZXJ3aXNlIHRoZSBjdXJzb3IgaXMgbGVmdAorICAvLyBhdCB0aGUgYm90dG9tIGxpbmUuCisKKyAgaW50ICAgICAgICAgICAgc2V0c2NycmVnKGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICByZXR1cm4gOjp3c2V0c2NycmVnKHcsIGZyb20sIHRvKTsgfQorICAvLyBEZWZpbmUgYSBzb2Z0IHNjcm9sbGluZyByZWdpb24uCisKKyAgaW50ICAgICAgICAgICAgaWRsb2soYm9vbCBiZikgeyByZXR1cm4gOjppZGxvayh3LCBiZik7IH0KKyAgLy8gSWYgYmYgaXMgVFJVRSwgdXNlIGluc2VydC9kZWxldGUgbGluZSBoYXJkd2FyZSBzdXBwb3J0IGlmIHBvc3NpYmxlLgorICAvLyBPdGhlcndpc2UgZG8gaXQgaW4gc29mdHdhcmUuCisKKworICB2b2lkICAgICAgICAgICBpZGNvayhib29sIGJmKSB7IDo6aWRjb2sodywgYmYpOyB9CisgIC8vIElmIGJmIGlzIFRSVUUsIHVzZSBpbnNlcnQvZGVsZXRlIGNoYXJhY3RlciBoYXJkd2FyZSBzdXBwb3J0IGlmIHBvc3NpYmxlLgorICAvLyBPdGhlcndpc2UgZG8gaXQgaW4gc29mdHdhcmUuCisKKyAgaW50ICAgICAgICAgICAgdG91Y2h3aW4oKSAgIHsgcmV0dXJuIDo6d3RvdWNobG4odywgMCwgaGVpZ2h0KCksIDEpOyB9CisgIC8vIE1hcmsgdGhlIHdob2xlIHdpbmRvdyBhcyBtb2RpZmllZC4KKworICBpbnQgICAgICAgICAgICB1bnRvdWNod2luKCkgeyByZXR1cm4gOjp3dG91Y2hsbih3LCAwLCBoZWlnaHQoKSwgMCk7IH0KKyAgLy8gTWFyayB0aGUgd2hvbGUgd2luZG93IGFzIHVubW9kaWZpZWQuCisKKyAgaW50ICAgICAgICAgICAgdG91Y2hsbihpbnQgcywgaW50IGNudCwgYm9vbCBjaGFuZ2VkPVRSVUUpIHsKKyAgICByZXR1cm4gOjp3dG91Y2hsbih3LCBzLCBjbnQsIHN0YXRpY19jYXN0PGludD4oY2hhbmdlZCA/IDEgOiAwKSk7IH0KKyAgLy8gTWFyayBjbnQgbGluZXMgYmVnaW5uaW5nIGZyb20gbGluZSBzIGFzIGNoYW5nZWQgb3IgdW5jaGFuZ2VkLCBkZXBlbmRpbmcKKyAgLy8gb24gdGhlIHZhbHVlIG9mIHRoZSBjaGFuZ2VkIGZsYWcuCisKKyAgYm9vbCAgICAgICAgICAgaXNfbGluZXRvdWNoZWQoaW50IGxpbmUpIGNvbnN0IHsKKyAgICByZXR1cm4gKDo6aXNfbGluZXRvdWNoZWQodywgbGluZSkgPyBUUlVFOkZBTFNFKTsgfQorICAvLyBSZXR1cm4gVFJVRSBpZiBsaW5lIGlzIG1hcmtlZCBhcyBjaGFuZ2VkLCBGQUxTRSBvdGhlcndpc2UKKworICBib29sICAgICAgICAgICBpc193aW50b3VjaGVkKCkgY29uc3QgeworICAgIHJldHVybiAoOjppc193aW50b3VjaGVkKHcpID8gVFJVRTpGQUxTRSk7IH0KKyAgLy8gUmV0dXJuIFRSVUUgaWYgd2luZG93IGlzIG1hcmtlZCBhcyBjaGFuZ2VkLCBGQUxTRSBvdGhlcndpc2UKKworICBpbnQgICAgICAgICAgICBsZWF2ZW9rKGJvb2wgYmYpIHsgcmV0dXJuIDo6bGVhdmVvayh3LCBiZik7IH0KKyAgLy8gSWYgYmYgaXMgVFJVRSwgY3Vyc2VzIHdpbGwgbGVhdmUgdGhlIGN1cnNvciBhZnRlciBhbiB1cGRhdGUgd2hlcmVldmVyCisgIC8vIGl0IGlzIGFmdGVyIHRoZSB1cGRhdGUuCisKKyAgaW50ICAgICAgICAgICAgcmVkcmF3bG4oaW50IGZyb20sIGludCBuKSB7IHJldHVybiA6OndyZWRyYXdsbih3LCBmcm9tLCBuKTsgfQorICAvLyBSZWRyYXcgbiBsaW5lcyBzdGFydGluZyBmcm9tIHRoZSByZXF1ZXN0ZWQgbGluZQorCisgIGludCAgICAgICAgICAgIHJlZHJhd3dpbigpIHsgcmV0dXJuIDo6d3JlZHJhd2xuKHcsIDAsIGhlaWdodCgpKTsgfQorICAvLyBSZWRyYXcgdGhlIHdob2xlIHdpbmRvdworCisgIGludCAgICAgICAgICAgIGRvdXBkYXRlKCkgIHsgcmV0dXJuIDo6ZG91cGRhdGUoKTsgfQorICAvLyBEbyBhbGwgb3V0cHV0cyB0byBtYWtlIHRoZSBwaHlzaWNhbCBzY3JlZW4gbG9va2luZyBsaWtlIHRoZSB2aXJ0dWFsIG9uZQorCisgIHZvaWQgICAgICAgICAgIHN5bmNkb3duKCkgIHsgOjp3c3luY2Rvd24odyk7IH0KKyAgLy8gUHJvcGFnYXRlIHRoZSBjaGFuZ2VzIGRvd24gdG8gYWxsIGRlc2NlbmRhbnQgd2luZG93cworCisgIHZvaWQgICAgICAgICAgIHN5bmN1cCgpICAgIHsgOjp3c3luY3VwKHcpOyB9CisgIC8vIFByb3BhZ2F0ZSB0aGUgY2hhbmdlcyB1cCBpbiB0aGUgaGllcmFyY2h5CisKKyAgdm9pZCAgICAgICAgICAgY3Vyc3luY3VwKCkgeyA6OndjdXJzeW5jdXAodyk7IH0KKyAgLy8gUG9zaXRpb24gdGhlIGN1cnNvciBpbiBhbGwgYW5jZXN0b3Igd2luZG93cyBjb3JyZXNwb25kaW5nIHRvIG91ciBzZXR0aW5nCisKKyAgaW50ICAgICAgICAgICAgc3luY29rKGJvb2wgYmYpIHsgcmV0dXJuIDo6c3luY29rKHcsIGJmKTsgfQorICAvLyBJZiBjYWxsZWQgd2l0aCBiZj1UUlVFLCBzeW5jdXAoKSBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHdpbmRvdyBpcyBjaGFuZ2VkCisKKyNpZm5kZWYgX25vX2ZsdXNob2sKKyAgaW50ICAgICAgICAgICAgZmx1c2hvayhib29sIGJmKSB7IHJldHVybiA6OmZsdXNob2sodywgYmYpOyB9CisjZW5kaWYKKworICB2b2lkICAgICAgICAgICBpbW1lZG9rKGJvb2wgYmYpIHsgOjppbW1lZG9rKHcsIGJmKTsgfQorICAvLyBJZiBjYWxsZWQgd2l0aCBiZj1UUlVFLCBhbnkgY2hhbmdlIGluIHRoZSB3aW5kb3cgd2lsbCBjYXVzZSBhbgorICAvLyBhdXRvbWF0aWMgaW1tZWRpYXRlIHJlZnJlc2goKQorCisgIGludCAgICAgICAgICAgIGtleXBhZChib29sIGJmKSB7IHJldHVybiA6OmtleXBhZCh3LCBiZik7IH0KKyAgLy8gSWYgY2FsbGVkIHdpdGggYmY9VFJVRSwgdGhlIGFwcGxpY2F0aW9uIHdpbGwgaW50ZXJwcmV0IGZ1bmN0aW9uIGtleXMuCisKKyAgaW50ICAgICAgICAgICAgbWV0YShib29sIGJmKSB7IHJldHVybiA6Om1ldGEodywgYmYpOyB9CisgIC8vIElmIGNhbGxlZCB3aXRoIGJmPVRSVUUsIGtleXMgbWF5IGdlbmVyYXRlIDgtQml0IGNoYXJhY3RlcnMuIE90aGVyd2lzZQorICAvLyA3LUJpdCBjaGFyYWN0ZXJzIGFyZSBnZW5lcmF0ZWQuCisKKyAgaW50ICAgICAgICAgICAgc3RhbmRvdXQoKSB7IHJldHVybiA6OndzdGFuZG91dCh3KTsgfQorICAvLyBFbmFibGUgInN0YW5kb3V0IiBhdHRyaWJ1dGVzCisKKyAgaW50ICAgICAgICAgICAgc3RhbmRlbmQoKSB7IHJldHVybiA6OndzdGFuZGVuZCh3KTsgfQorICAvLyBEaXNhYmxlICJzdGFuZG91dCIgYXR0cmlidXRlcworCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlIG5leHQgdHdvIGFyZSB2aXJ0dWFsLCBiZWNhdXNlIHdlIHJlZGVmaW5lIHRoZW0gaW4gdGhlCisgIC8vIE5DdXJzZXNQYW5lbCBjbGFzcy4KKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2aXJ0dWFsIGludCAgICByZWZyZXNoKCkgeyByZXR1cm4gOjp3cmVmcmVzaCh3KTsgfQorICAvLyBQcm9wYWdhdGUgdGhlIGNoYW5nZXMgaW4gdGhpcyB3aW5kb3cgdG8gdGhlIHZpcnR1YWwgc2NyZWVuIGFuZCBjYWxsCisgIC8vIGRvdXBkYXRlKCkuIFRoaXMgaXMgcmVkZWZpbmVkIGluIE5DdXJzZXNQYW5lbC4KKworICB2aXJ0dWFsIGludCAgICBub3V0cmVmcmVzaCgpIHsgcmV0dXJuIDo6d25vdXRyZWZyZXNoKHcpOyB9CisgIC8vIFByb3BhZ2F0ZSB0aGUgY2hhbmdlcyBpbiB0aGlzIHdpbmRvdyB0byB0aGUgdmlydHVhbCBzY3JlZW4uIFRoaXMgaXMKKyAgLy8gcmVkZWZpbmVkIGluIE5DdXJzZXNQYW5lbC4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIG11bHRpcGxlIHdpbmRvdyBjb250cm9sCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaW50ICAgICAgICAgICAgb3ZlcmxheShOQ3Vyc2VzV2luZG93JiB3aW4pIHsKKyAgICByZXR1cm4gOjpvdmVybGF5KHcsIHdpbi53KTsgfQorICAvLyBPdmVybGF5IHRoaXMgd2luZG93IG92ZXIgd2luLgorCisgIGludCAgICAgICAgICAgIG92ZXJ3cml0ZShOQ3Vyc2VzV2luZG93JiB3aW4pIHsKKyAgICByZXR1cm4gOjpvdmVyd3JpdGUodywgd2luLncpOyB9CisgIC8vIE92ZXJ3cml0ZSB3aW4gd2l0aCB0aGlzIHdpbmRvdy4KKworICBpbnQgICAgICAgICAgICBjb3B5d2luKE5DdXJzZXNXaW5kb3cmIHdpbiwKKwkJCSBpbnQgc21pbnJvdywgaW50IHNtaW5jb2wsCisJCQkgaW50IGRtaW5yb3csIGludCBkbWluY29sLAorCQkJIGludCBkbWF4cm93LCBpbnQgZG1heGNvbCwgYm9vbCBvdmVybGF5d2luPVRSVUUpIHsKKyAgICByZXR1cm4gOjpjb3B5d2luKHcsIHdpbi53LCBzbWlucm93LCBzbWluY29sLCBkbWlucm93LCBkbWluY29sLAorCQkgICAgIGRtYXhyb3csIGRtYXhjb2wsIHN0YXRpY19jYXN0PGludD4ob3ZlcmxheXdpbiA/IDEgOiAwKSk7IH0KKyAgLy8gT3ZlcmxheSBvciBvdmVyd3JpdGUgdGhlIHJlY3RhbmdsZSBpbiB3aW4gZ2l2ZW4gYnkgZG1pbnJvdyxkbWluY29sLAorICAvLyBkbWF4cm93LGRtYXhjb2wgd2l0aCB0aGUgcmVjdGFuZ2xlIGluIHRoaXMgd2luZG93IGJlZ2lubmluZyBhdAorICAvLyBzbWlucm93LHNtaW5jb2wuCisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFeHRlbmRlZCBmdW5jdGlvbnMKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIE5DVVJTRVNfRVhUX0ZVTkNTCisgIGludCAgICAgICAgICAgIHdyZXNpemUoaW50IG5ld0xpbmVzLCBpbnQgbmV3Q29sdW1ucykgeworICAgIHJldHVybiA6OndyZXNpemUodywgbmV3TGluZXMsIG5ld0NvbHVtbnMpOyB9CisjZW5kaWYKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1vdXNlIHJlbGF0ZWQKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBib29sIGhhc19tb3VzZSgpIGNvbnN0OworICAvLyBSZXR1cm4gVFJVRSBpZiB0ZXJtaW5hbCBzdXBwb3J0cyBhIG1vdXNlLCBGQUxTRSBvdGhlcndpc2UKKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIHRyYXZlcnNhbCBzdXBwb3J0CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTkN1cnNlc1dpbmRvdyogIGNoaWxkKCkgeyByZXR1cm4gc3Vid2luczsgfQorICAvLyBHZXQgdGhlIGZpcnN0IGNoaWxkIHdpbmRvdy4KKworICBOQ3Vyc2VzV2luZG93KiAgc2libGluZygpIHsgcmV0dXJuIHNpYjsgfQorICAvLyBHZXQgdGhlIG5leHQgY2hpbGQgb2YgbXkgcGFyZW50LgorCisgIE5DdXJzZXNXaW5kb3cqICBwYXJlbnQoKSB7IHJldHVybiBwYXI7IH0KKyAgLy8gR2V0IG15IHBhcmVudC4KKworICBib29sIGlzRGVzY2VuZGFudChOQ3Vyc2VzV2luZG93JiB3aW4pOworICAvLyBSZXR1cm4gVFJVRSBpZiB3aW4gaXMgYSBkZXNjZW5kYW50IG9mIHRoaXMuCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZSBsZWF2ZSB0aGlzIGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNDb2xvcldpbmRvdyA6IHB1YmxpYyBOQ3Vyc2VzV2luZG93Cit7CitwdWJsaWM6CisgIE5DdXJzZXNDb2xvcldpbmRvdyhXSU5ET1cqICZ3aW5kb3cpICAgLy8gdXNlZnVsIG9ubHkgZm9yIHN0ZHNjcgorICAgIDogTkN1cnNlc1dpbmRvdyh3aW5kb3cpIHsKKyAgICAgIHVzZUNvbG9ycygpOyB9CisKKyAgTkN1cnNlc0NvbG9yV2luZG93KGludCBubGluZXMsICAgICAgICAvLyBudW1iZXIgb2YgbGluZXMKKwkJICAgICBpbnQgbmNvbHMsICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMKKwkJICAgICBpbnQgYmVnaW5feSwgICAgICAgLy8gbGluZSBvcmlnaW4KKwkJICAgICBpbnQgYmVnaW5feCkgICAgICAgLy8gY29sIG9yaWdpbgorICAgIDogTkN1cnNlc1dpbmRvdyhubGluZXMsIG5jb2xzLCBiZWdpbl95LCBiZWdpbl94KSB7CisgICAgICB1c2VDb2xvcnMoKTsgfQorCisgIE5DdXJzZXNDb2xvcldpbmRvdyhOQ3Vyc2VzV2luZG93JiBwYXJlbnRXaW4sLy8gcGFyZW50IHdpbmRvdworCQkgICAgIGludCBubGluZXMsICAgICAgICAvLyBudW1iZXIgb2YgbGluZXMKKwkJICAgICBpbnQgbmNvbHMsICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMKKwkJICAgICBpbnQgYmVnaW5feSwgICAgICAgLy8gYWJzb2x1dGUgb3IgcmVsYXRpdmUKKwkJICAgICBpbnQgYmVnaW5feCwgICAgICAgLy8gICBvcmlnaW5zOgorCQkgICAgIGNoYXIgYWJzcmVsID0gJ2EnKSAvLyBpZiBgYScsIGJ5ICYgYnggYXJlCisgICAgOiBOQ3Vyc2VzV2luZG93KHBhcmVudFdpbiwKKwkJICAgIG5saW5lcywgbmNvbHMsCS8vIGFic29sdXRlIHNjcmVlbiBwb3MsCisJCSAgICBiZWdpbl95LCBiZWdpbl94LCAgIC8vIGVsc2UgaWYgYHInLCB0aGV5IGFyZQorCQkgICAgYWJzcmVsICkgeyAgICAgICAgICAvLyByZWxhdGl2ZSB0byBwYXIgb3JpZ2luCisgICAgICB1c2VDb2xvcnMoKTsgfQorfTsKKworLy8gVGhlc2UgZW51bSBkZWZpbml0aW9ucyByZWFsbHkgYmVsb25nIGluc2lkZSB0aGUgTkN1cnNlc1BhZCBjbGFzcywgYnV0IG9ubHkKKy8vIHJlY2VudCBjb21waWxlcnMgc3VwcG9ydCB0aGF0IGZlYXR1cmUuCisKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBSRVFfUEFEX1JFRlJFU0ggPSBLRVlfTUFYICsgMSwKKyAgICBSRVFfUEFEX1VQLAorICAgIFJFUV9QQURfRE9XTiwKKyAgICBSRVFfUEFEX0xFRlQsCisgICAgUkVRX1BBRF9SSUdIVCwKKyAgICBSRVFfUEFEX0VYSVQKKyAgfSBQYWRfUmVxdWVzdDsKKworICBjb25zdCBQYWRfUmVxdWVzdCBQQURfTE9XICA9IFJFUV9QQURfUkVGUkVTSDsgICAvLyBsb3dlc3QgIG9wLWNvZGUKKyAgY29uc3QgUGFkX1JlcXVlc3QgUEFEX0hJR0ggPSBSRVFfUEFEX0VYSVQ7ICAgICAgLy8gaGlnaGVzdCBvcC1jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhZCBTdXBwb3J0LiBXZSBhbGxvdyBhbiBhc3NvY2lhdGlvbiBvZiBhIHBhZCB3aXRoIGEgInJlYWwiIHdpbmRvdworLy8gdGhyb3VnaCB3aGljaCB0aGUgcGFkIG1heSBiZSB2aWV3ZWQuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzUGFkIDogcHVibGljIE5DdXJzZXNXaW5kb3cKK3sKK3ByaXZhdGU6CisgIE5DdXJzZXNXaW5kb3cqIHZpZXdXaW47ICAgICAgIC8vIHRoZSAidmlld3BvcnQiIHdpbmRvdworICBOQ3Vyc2VzV2luZG93KiB2aWV3U3ViOyAgICAgICAvLyB0aGUgInZpZXdwb3J0IiBzdWJ3aW5kb3cKKworICBpbnQgaF9ncmlkc2l6ZSwgdl9ncmlkc2l6ZTsKKworcHJvdGVjdGVkOgorICBpbnQgbWluX3JvdywgbWluX2NvbDsgICAgICAgICAvLyB0b3AgbGVmdCByb3cvY29sIG9mIHRoZSBwYWRzIGRpc3BsYXkgYXJlYQorCisgIE5DdXJzZXNXaW5kb3cqIFdpbih2b2lkKSBjb25zdCB7CisgICAgLy8gR2V0IHRoZSB3aW5kb3cgaW50byB3aGljaCB0aGUgcGFkIHNob3VsZCBiZSBjb3BpZWQgKGlmIGFueSkKKyAgICByZXR1cm4gKHZpZXdTdWI/dmlld1N1Yjoodmlld1dpbj92aWV3V2luOjApKTsKKyAgfQorCisgIE5DdXJzZXNXaW5kb3cqIGdldFdpbmRvdyh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIHZpZXdXaW47CisgIH0KKworICBOQ3Vyc2VzV2luZG93KiBnZXRTdWJXaW5kb3codm9pZCkgY29uc3QgeworICAgIHJldHVybiB2aWV3U3ViOworICB9CisKKyAgdmlydHVhbCBpbnQgZHJpdmVyIChpbnQga2V5KTsgICAgICAvLyBWaXJ0dWFsaXplIGtleXN0cm9rZSBrZXkKKyAgLy8gVGhlIGRyaXZlciB0cmFuc2xhdGVzIHRoZSBrZXlzdHJva2UgYyBpbnRvIGFuIFBhZF9SZXF1ZXN0CisKKyAgdmlydHVhbCB2b2lkIE9uVW5rbm93bk9wZXJhdGlvbihpbnQgcGFkX3JlcSkgeworICAgIDo6YmVlcCgpOworICB9CisgIC8vIFRoaXMgaXMgY2FsbGVkIGlmIHRoZSBkcml2ZXIgcmV0dXJucyBhbiB1bmtub3duIG9wLWNvZGUKKworICB2aXJ0dWFsIHZvaWQgT25OYXZpZ2F0aW9uRXJyb3IoaW50IHBhZF9yZXEpIHsKKyAgICA6OmJlZXAoKTsKKyAgfQorICAvLyBUaGlzIGlzIGNhbGxlZCBpZiBhIG5hdmlnYXRpb24gcmVxdWVzdCBjb3VsZG4ndCBiZSBzYXRpc2ZpZWQKKworICB2aXJ0dWFsIHZvaWQgT25PcGVyYXRpb24oaW50IHBhZF9yZXEpIHsKKyAgfTsKKyAgLy8gT25PcGVyYXRpb24gaXMgY2FsbGVkIGlmIGEgUGFkX09wZXJhdGlvbiB3YXMgZXhlY3V0ZWQgYW5kIGp1c3QgYmVmb3JlCisgIC8vIHRoZSByZWZyZXNoKCkgb3BlcmF0aW9uIGlzIGRvbmUuCisKK3B1YmxpYzoKKyAgTkN1cnNlc1BhZChpbnQgbmxpbmVzLCBpbnQgbmNvbHMpOworICAvLyBjcmVhdGUgYSBwYWQgd2l0aCB0aGUgZ2l2ZW4gc2l6ZQorCisgIE5DdXJzZXNQYWQmIG9wZXJhdG9yPShjb25zdCBOQ3Vyc2VzUGFkJiByaHMpCisgIHsKKyAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAqdGhpcyA9IHJoczsKKyAgICAgIE5DdXJzZXNXaW5kb3c6Om9wZXJhdG9yPShyaHMpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzUGFkKGNvbnN0IE5DdXJzZXNQYWQmIHJocykKKyAgICA6IE5DdXJzZXNXaW5kb3cocmhzKSwKKyAgICAgIHZpZXdXaW4ocmhzLnZpZXdXaW4pLAorICAgICAgdmlld1N1YihyaHMudmlld1N1YiksCisgICAgICBoX2dyaWRzaXplKHJocy5oX2dyaWRzaXplKSwKKyAgICAgIHZfZ3JpZHNpemUocmhzLnZfZ3JpZHNpemUpLAorICAgICAgbWluX3JvdyhyaHMubWluX3JvdyksCisgICAgICBtaW5fY29sKHJocy5taW5fY29sKQorICB7CisgIH0KKworICB2aXJ0dWFsIH5OQ3Vyc2VzUGFkKCkge30KKworICBpbnQgZWNob2NoYXIoY29uc3QgY2h0eXBlIGNoKSB7IHJldHVybiA6OnBlY2hvY2hhcih3LCBjaCk7IH0KKyAgLy8gUHV0IHRoZSBhdHRyaWJ1dGVkIGNoYXJhY3RlciBvbnRvIHRoZSBwYWQgYW5kIGltbWVkaWF0ZWx5IGRvIGEKKyAgLy8gcHJlZnJlc2goKS4KKworICBpbnQgcmVmcmVzaCgpOworICAvLyBJZiBhIHZpZXdwb3J0IGlzIGRlZmluZWQgdGhlIHBhZCBpcyBkaXNwbGF5ZWQgaW4gdGhpcyB3aW5kb3csIG90aGVyd2lzZQorICAvLyB0aGlzIGlzIGEgbm9vcC4KKworICBpbnQgcmVmcmVzaChpbnQgcG1pbnJvdywgaW50IHBtaW5jb2wsCisJICAgICAgaW50IHNtaW5yb3csIGludCBzbWluY29sLAorCSAgICAgIGludCBzbWF4cm93LCBpbnQgc21heGNvbCkgeworICAgIHJldHVybiA6OnByZWZyZXNoKHcsIHBtaW5yb3csIHBtaW5jb2wsCisJCSAgICAgIHNtaW5yb3csIHNtaW5jb2wsIHNtYXhyb3csIHNtYXhjb2wpOworICB9CisgIC8vIFRoZSBjb29yZGluYXRlcyBzbWlucm93LHNtaW5jb2wsc21heHJvdyxzbWF4Y29sIGRlc2NyaWJlIGEgcmVjdGFuZ2xlCisgIC8vIG9uIHRoZSBzY3JlZW4uIDxiPnJlZnJlc2g8L2I+IGNvcGllcyBhIHJlY3RhbmdsZSBvZiB0aGlzIHNpemUgYmVnaW5uaW5nCisgIC8vIHdpdGggdG9wIGxlZnQgY29ybmVyIHBtaW5yb3cscG1pbmNvbCBvbnRvIHRoZSBzY3JlZW4gYW5kIGNhbGxzIGRvdXBkYXRlKCkuCisKKyAgaW50IG5vdXRyZWZyZXNoKCk7CisgIC8vIElmIGEgdmlld3BvcnQgaXMgZGVmaW5lZCB0aGUgcGFkIGlzIGRpc3BsYXllZCBpbiB0aGlzIHdpbmRvdywgb3RoZXJ3aXNlCisgIC8vIHRoaXMgaXMgYSBub29wLgorCisgIGludCBub3V0cmVmcmVzaChpbnQgcG1pbnJvdywgaW50IHBtaW5jb2wsCisJCSAgaW50IHNtaW5yb3csIGludCBzbWluY29sLAorCQkgIGludCBzbWF4cm93LCBpbnQgc21heGNvbCkgeworICAgIHJldHVybiA6OnBub3V0cmVmcmVzaCh3LCBwbWlucm93LCBwbWluY29sLAorCQkJICBzbWlucm93LCBzbWluY29sLCBzbWF4cm93LCBzbWF4Y29sKTsKKyAgfQorICAvLyBEb2VzIHRoZSBzYW1lIGFzIHJlZnJlc2goKSBidXQgd2l0aG91dCBjYWxsaW5nIGRvdXBkYXRlKCkuCisKKyAgdmlydHVhbCB2b2lkIHNldFdpbmRvdyhOQ3Vyc2VzV2luZG93JiB2aWV3LCBpbnQgdl9ncmlkID0gMSwgaW50IGhfZ3JpZCA9IDEpOworICAvLyBBZGQgdGhlIHdpbmRvdyAidmlldyIgYXMgdmlld2luZyB3aW5kb3cgdG8gdGhlIHBhZC4KKworICB2aXJ0dWFsIHZvaWQgc2V0U3ViV2luZG93KE5DdXJzZXNXaW5kb3cmIHN1Yik7CisgIC8vIFVzZSB0aGUgc3Vid2luZG93ICJzdWIiIG9mIHRoZSB2aWV3cG9ydCB3aW5kb3cgZm9yIHRoZSBhY3R1YWwgdmlld2luZy4KKyAgLy8gVGhlIGZ1bGwgdmlld3BvcnQgd2luZG93IGlzIHVzdWFsbHkgdXNlZCB0byBwcm92aWRlIHNvbWUgZGVjb3JhdGlvbnMKKyAgLy8gbGlrZSBmcmFtZXMsIHRpdGxlcyBldGMuCisKKyAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkgKHZvaWQpOworICAvLyBQZXJmb3JtIFBhZCdzIG9wZXJhdGlvbgorfTsKKworLy8gQSBGcmFtZWRQYWQgaXMgY29uc3RydWN0ZWQgYWx3YXlzIHdpdGggYSB2aWV3cG9ydCB3aW5kb3cuIFRoaXMgdmlld3BvcnQKKy8vIHdpbGwgYmUgZnJhbWVkIChieSBhIGJveCgpIGNvbW1hbmQpIGFuZCB0aGUgaW50ZXJpb3Igb2YgdGhlIGJveCBpcyB0aGUKKy8vIHZpZXdwb3J0IHN1YndpbmRvdy4gT24gdGhlIGZyYW1lIHdlIGRpc3BsYXkgc2Nyb2xsYmFyIHNsaWRlcnMuCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRnJhbWVkUGFkIDogcHVibGljIE5DdXJzZXNQYWQKK3sKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIE9uT3BlcmF0aW9uKGludCBwYWRfcmVxKTsKKworcHVibGljOgorICBOQ3Vyc2VzRnJhbWVkUGFkKE5DdXJzZXNXaW5kb3cmIHdpbiwgaW50IG5saW5lcywgaW50IG5jb2xzLAorCQkgICBpbnQgdl9ncmlkID0gMSwgaW50IGhfZ3JpZCA9IDEpCisgICAgOiBOQ3Vyc2VzUGFkKG5saW5lcywgbmNvbHMpIHsKKyAgICBOQ3Vyc2VzUGFkOjpzZXRXaW5kb3cod2luLCB2X2dyaWQsIGhfZ3JpZCk7CisgICAgTkN1cnNlc1BhZDo6c2V0U3ViV2luZG93KCoobmV3IE5DdXJzZXNXaW5kb3cod2luKSkpOworICB9CisgIC8vIENvbnN0cnVjdCB0aGUgRnJhbWVkUGFkIHdpdGggdGhlIGdpdmVuIFdpbmRvdyB3aW4gYXMgdmlld3BvcnQuCisKKyAgdmlydHVhbCB+TkN1cnNlc0ZyYW1lZFBhZCgpIHsKKyAgICBkZWxldGUgZ2V0U3ViV2luZG93KCk7CisgIH0KKworICB2b2lkIHNldFdpbmRvdyhOQ3Vyc2VzV2luZG93JiB2aWV3LCBpbnQgdl9ncmlkID0gMSwgaW50IGhfZ3JpZCA9IDEpIHsKKyAgICBlcnJfaGFuZGxlcigiT3BlcmF0aW9uIG5vdCBhbGxvd2VkIik7CisgIH0KKyAgLy8gRGlzYWJsZSB0aGlzIGNhbGw7IHRoZSB2aWV3cG9ydCBpcyBhbHJlYWR5IGRlZmluZWQKKworICB2b2lkIHNldFN1YldpbmRvdyhOQ3Vyc2VzV2luZG93JiBzdWIpIHsKKyAgICBlcnJfaGFuZGxlcigiT3BlcmF0aW9uIG5vdCBhbGxvd2VkIik7CisgIH0KKyAgLy8gRGlzYWJsZSB0aGlzIGNhbGw7IHRoZSB2aWV3cG9ydCBzdWJ3aW5kb3cgaXMgYWxyZWFkeSBkZWZpbmVkCisKK307CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0NVUlNFU1dfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNzbGsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvY3Vyc3Nsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTY5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2N1cnNzbGsuaApAQCAtMCwwICsxLDIzOCBAQAorLy8gKiB0aGlzIGlzIGZvciBtYWtpbmcgZW1hY3MgaGFwcHk6IC0qLU1vZGU6IEMrKzstKi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMywyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogSnVlcmdlbiBQZmVpZmVyLCAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vICRJZDogY3Vyc3Nsay5oLHYgMS4xMyAyMDA1LzA1LzI4IDIxOjU4OjE4IHRvbSBFeHAgJAorCisjaWZuZGVmIE5DVVJTRVNfQ1VSU1NMS19IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19DVVJTU0xLX0hfaW5jbAorCisjaW5jbHVkZSA8Y3Vyc2Vzdy5oPgorCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBTb2Z0X0xhYmVsX0tleV9TZXQgeworcHVibGljOgorICAvLyBUaGlzIGlubmVyIGNsYXNzIHJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBTb2Z0IExhYmVsIEtleSAoU0xLKQorICBjbGFzcyBOQ1VSU0VTX0lNUEVYUCBTb2Z0X0xhYmVsX0tleSB7CisgICAgZnJpZW5kIGNsYXNzIFNvZnRfTGFiZWxfS2V5X1NldDsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7IExlZnQ9MCwgQ2VudGVyPTEsIFJpZ2h0PTIgfSBKdXN0aWZpY2F0aW9uOworCisgIHByaXZhdGU6CisgICAgY2hhciAqbGFiZWw7ICAgICAgICAgICAvLyBUaGUgVGV4dCBvZiB0aGUgTGFiZWwKKyAgICBKdXN0aWZpY2F0aW9uIGZvcm1hdDsgIC8vIFRoZSBKdXN0aWZpY2F0aW9uCisgICAgaW50IG51bTsgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHRoZSBMYWJlbAorCisgICAgU29mdF9MYWJlbF9LZXkoKSA6IGxhYmVsKE5VTEwpLCBmb3JtYXQoTGVmdCksIG51bSgtMSkgeworICAgIH0KKworICAgIHZpcnR1YWwgflNvZnRfTGFiZWxfS2V5KCkgeworICAgICAgZGVsZXRlW10gbGFiZWw7CisgICAgfTsKKworICBwdWJsaWM6CisgICAgLy8gU2V0IHRoZSB0ZXh0IG9mIHRoZSBMYWJlbAorICAgIFNvZnRfTGFiZWxfS2V5JiBvcGVyYXRvcj0oY2hhciAqdGV4dCk7CisKKyAgICAvLyBTZXQgdGhlIEp1c3RpZmljYXRpb24gb2YgdGhlIExhYmVsCisgICAgU29mdF9MYWJlbF9LZXkmIG9wZXJhdG9yPShKdXN0aWZpY2F0aW9uIGp1c3QpIHsKKyAgICAgIGZvcm1hdCA9IGp1c3Q7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gUmV0cmlldmUgdGhlIHRleHQgb2YgdGhlIGxhYmVsCisgICAgaW5saW5lIGNoYXIqIG9wZXJhdG9yKCkodm9pZCkgY29uc3QgeworICAgICAgcmV0dXJuIGxhYmVsOworICAgIH0KKworICAgIFNvZnRfTGFiZWxfS2V5JiBvcGVyYXRvcj0oY29uc3QgU29mdF9MYWJlbF9LZXkmIHJocykKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmcmhzKSB7CisgICAgICAgICp0aGlzID0gcmhzOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFNvZnRfTGFiZWxfS2V5KGNvbnN0IFNvZnRfTGFiZWxfS2V5JiByaHMpCisgICAgICA6IGxhYmVsKE5VTEwpLAorICAgICAgICBmb3JtYXQocmhzLmZvcm1hdCksCisgICAgICAgIG51bShyaHMubnVtKQorICAgIHsKKyAgICAgICp0aGlzID0gcmhzLmxhYmVsOworICAgIH0KKyAgfTsKKworcHVibGljOgorICB0eXBlZGVmIGVudW0geworICAgIE5vbmUgICAgICAgICAgICAgICAgPSAtMSwKKyAgICBUaHJlZV9Ud29fVGhyZWUgICAgID0gMCwKKyAgICBGb3VyX0ZvdXIgICAgICAgICAgID0gMSwKKyAgICBQQ19TdHlsZSAgICAgICAgICAgID0gMiwKKyAgICBQQ19TdHlsZV9XaXRoX0luZGV4ID0gMworICB9IExhYmVsX0xheW91dDsKKworcHJpdmF0ZToKKyAgc3RhdGljIGxvbmcgTkNVUlNFU19JTVBFWFAgY291bnQ7ICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIEtleSBTZXRzCisgIHN0YXRpYyBMYWJlbF9MYXlvdXQgTkNVUlNFU19JTVBFWFAgIGZvcm1hdDsgICAgIC8vIExheW91dCBvZiB0aGUgS2V5IFNldHMKKyAgc3RhdGljIGludCAgTkNVUlNFU19JTVBFWFAgbnVtX2xhYmVsczsgICAgICAgICAgLy8gTnVtYmVyIE9mIExhYmVscyBpbiBLZXkgU2V0cworICBib29sIE5DVVJTRVNfSU1QRVhQIGJfYXR0ckluaXQ7ICAgICAgICAgICAgICAgICAvLyBBcmUgYXR0cmlidXRlcyBpbml0aWFsaXplZAorCisgIFNvZnRfTGFiZWxfS2V5ICpzbGtfYXJyYXk7ICAgICAgIC8vIFRoZSBhcnJheSBvZiBTTEsncworCisgIC8vIEluaXQgdGhlIEtleSBTZXQKKyAgdm9pZCBpbml0KCk7CisKKyAgLy8gQWN0aXZhdGUgb3IgRGVhY3RpdmF0ZSBMYWJlbCMgaSwgTGFiZWwgY291bnRpbmcgc3RhcnRzIHdpdGggMSEKKyAgdm9pZCBhY3RpdmF0ZV9sYWJlbChpbnQgaSwgYm9vbCBiZj1UUlVFKTsKKworICAvLyBBY3RpdmF0ZSBvZiBEZWFjdGl2YXRlIGFsbCBMYWJlbHMKKyAgdm9pZCBhY3RpdmF0ZV9sYWJlbHMoYm9vbCBiZik7CisKK3Byb3RlY3RlZDoKKyAgaW5saW5lIHZvaWQgRXJyb3IgKGNvbnN0IGNoYXIqIG1zZykgY29uc3QgVEhST1dTKE5DdXJzZXNFeGNlcHRpb24pIHsKKyAgICBUSFJPVyhuZXcgTkN1cnNlc0V4Y2VwdGlvbiAobXNnKSk7CisgIH0KKworICAvLyBSZW1vdmUgU0xLJ3MgZnJvbSBzY3JlZW4KKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpZiAoRVJSPT06OnNsa19jbGVhcigpKQorICAgICAgRXJyb3IoInNsa19jbGVhciIpOworICB9CisKKyAgLy8gUmVzdG9yZSB0aGVtCisgIHZvaWQgcmVzdG9yZSgpIHsKKyAgICBpZiAoRVJSPT06OnNsa19yZXN0b3JlKCkpCisgICAgICBFcnJvcigic2xrX3Jlc3RvcmUiKTsKKyAgfQorCitwdWJsaWM6CisKKyAgLy8gQ29uc3RydWN0IGEgS2V5IFNldCwgdXNlIHRoZSBtb3N0IGNvbWZvcnRhYmxlIGxheW91dCBhcyBkZWZhdWx0LgorICAvLyBZb3UgbXVzdCBjcmVhdGUgYSBTb2Z0X0xhYmVsX0tleV9TZXQgYmVmb3JlIHlvdSBjcmVhdGUgYW55IG9iamVjdCBvZgorICAvLyB0aGUgTkN1cnNlc1dpbmRvdywgTkN1cnNlc1BhbmVsIG9yIGRlcml2ZWQgY2xhc3Nlcy4gKEFjdHVhbGx5IGJlZm9yZQorICAvLyA6OmluaXRzY3IoKSBpcyBjYWxsZWQpLgorICBTb2Z0X0xhYmVsX0tleV9TZXQoTGFiZWxfTGF5b3V0IGZtdCk7CisKKyAgLy8gVGhpcyBjb25zdHJ1Y3RvciBhc3N1bWVzLCB0aGF0IHlvdSBhbHJlYWR5IGNvbnN0cnVjdGVkIGEgS2V5IFNldAorICAvLyB3aXRoIGEgbGF5b3V0IGJ5IHRoZSBjb25zdHJ1Y3RvciBhYm92ZS4gVGhpcyBsYXlvdXQgd2lsbCBiZSByZXVzZWQuCisgIE5DVVJTRVNfSU1QRVhQIFNvZnRfTGFiZWxfS2V5X1NldCgpOworCisgIFNvZnRfTGFiZWxfS2V5X1NldCYgb3BlcmF0b3I9KGNvbnN0IFNvZnRfTGFiZWxfS2V5X1NldCYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgKnRoaXMgPSByaHM7CisgICAgICBpbml0KCk7CQkvLyBhbGxvY2F0ZSBhIG5ldyBzbGtfYXJyYXlbXQorICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTb2Z0X0xhYmVsX0tleV9TZXQoY29uc3QgU29mdF9MYWJlbF9LZXlfU2V0JiByaHMpCisgICAgOiBiX2F0dHJJbml0KHJocy5iX2F0dHJJbml0KSwKKyAgICAgIHNsa19hcnJheShOVUxMKQorICB7CisgICAgaW5pdCgpOwkJLy8gYWxsb2NhdGUgYSBuZXcgc2xrX2FycmF5W10KKyAgfQorCisgIHZpcnR1YWwgflNvZnRfTGFiZWxfS2V5X1NldCgpOworCisgIC8vIEdldCBMYWJlbCMgaS4gTGFiZWwgY291bnRpbmcgc3RhcnRzIHdpdGggMSEKKyAgTkNVUlNFU19JTVBFWFAgU29mdF9MYWJlbF9LZXkmIG9wZXJhdG9yW10oaW50IGkpOworCisgIC8vIFJldHJpZXZlIG51bWJlciBvZiBMYWJlbHMKKyAgaW5saW5lIGludCBsYWJlbHMoKSBjb25zdCB7IHJldHVybiBudW1fbGFiZWxzOyB9CisKKyAgLy8gUmVmcmVzaCB0aGUgU0xLIHBvcnRpb24gb2YgdGhlIHNjcmVlbgorICBpbmxpbmUgdm9pZCByZWZyZXNoKCkgeworICAgIGlmIChFUlI9PTo6c2xrX3JlZnJlc2goKSkKKyAgICAgIEVycm9yKCJzbGtfcmVmcmVzaCIpOworICB9CisKKyAgLy8gTWFyayB0aGUgU0xLIHBvcnRpb24gb2YgdGhlIHNjcmVlbiBmb3IgcmVmcmVzaCwgZGVmZXIgYWN0dWFsIHJlZnJlc2gKKyAgLy8gdW50aWwgbmV4dCB1cGRhdGUgY2FsbC4KKyAgaW5saW5lIHZvaWQgbm91dHJlZnJlc2goKSB7CisgICAgaWYgKEVSUj09OjpzbGtfbm91dHJlZnJlc2goKSkKKyAgICAgIEVycm9yKCJzbGtfbm91dHJlZnJlc2giKTsKKyAgfQorCisgIC8vIE1hcmsgdGhlIHdob2xlIFNMSyBwb3J0aW9uIG9mIHRoZSBzY3JlZW4gYXMgbW9kaWZpZWQKKyAgaW5saW5lIHZvaWQgdG91Y2goKSB7CisgICAgaWYgKEVSUj09OjpzbGtfdG91Y2goKSkKKyAgICAgIEVycm9yKCJzbGtfdG91Y2giKTsKKyAgfQorCisgIC8vIEFjdGl2YXRlIExhYmVsIyBpCisgIGlubGluZSB2b2lkIHNob3coaW50IGkpIHsKKyAgICBhY3RpdmF0ZV9sYWJlbChpLEZBTFNFKTsKKyAgICBhY3RpdmF0ZV9sYWJlbChpLFRSVUUpOworICB9CisKKyAgLy8gSGlkZSBMYWJlbCMgaQorICBpbmxpbmUgdm9pZCBoaWRlKGludCBpKSB7CisgICAgYWN0aXZhdGVfbGFiZWwoaSxGQUxTRSk7CisgIH0KKworICAvLyBTaG93IGFsbCBMYWJlbHMKKyAgaW5saW5lIHZvaWQgc2hvdygpIHsKKyAgICBhY3RpdmF0ZV9sYWJlbHMoRkFMU0UpOworICAgIGFjdGl2YXRlX2xhYmVscyhUUlVFKTsKKyAgfQorCisgIC8vIEhpZGUgYWxsIExhYmVscworICBpbmxpbmUgdm9pZCBoaWRlKCkgeworICAgIGFjdGl2YXRlX2xhYmVscyhGQUxTRSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBhdHRyb24oYXR0cl90IGF0dHJzKSB7CisgICAgaWYgKEVSUj09OjpzbGtfYXR0cm9uKGF0dHJzKSkKKyAgICAgIEVycm9yKCJzbGtfYXR0cm9uIik7CisgIH0KKworICBpbmxpbmUgdm9pZCBhdHRyb2ZmKGF0dHJfdCBhdHRycykgeworICAgIGlmIChFUlI9PTo6c2xrX2F0dHJvZmYoYXR0cnMpKQorICAgICAgRXJyb3IoInNsa19hdHRyb2ZmIik7CisgIH0KKworICBpbmxpbmUgdm9pZCBhdHRyc2V0KGF0dHJfdCBhdHRycykgeworICAgIGlmIChFUlI9PTo6c2xrX2F0dHJzZXQoYXR0cnMpKQorICAgICAgRXJyb3IoInNsa19hdHRyc2V0Iik7CisgIH0KKworICBpbmxpbmUgdm9pZCBjb2xvcihzaG9ydCBjb2xvcl9wYWlyX251bWJlcikgeworICAgIGlmIChFUlI9PTo6c2xrX2NvbG9yKGNvbG9yX3BhaXJfbnVtYmVyKSkKKyAgICAgIEVycm9yKCJzbGtfY29sb3IiKTsKKyAgfQorCisgIGlubGluZSBhdHRyX3QgYXR0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gOjpzbGtfYXR0cigpOworICB9Cit9OworCisjZW5kaWYgLyogTkNVUlNFU19DVVJTU0xLX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9kaXJlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZGlyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0MTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZGlyZW50LmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0yMDAwLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDUuMS4yIERpcmVjdG9yeSBPcGVyYXRpb25zCTxkaXJlbnQuaD4KKyAqLworCisjaWZuZGVmCV9ESVJFTlRfSAorI2RlZmluZQlfRElSRU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgaWZuZGVmIF9faW5vX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2lub190X2RlZmluZWQKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCAmJiAhZGVmaW5lZCBfX2lubzY0X3RfZGVmaW5lZAordHlwZWRlZiBfX2lubzY0X3QgaW5vNjRfdDsKKyMgIGRlZmluZSBfX2lubzY0X3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGBzdHJ1Y3QgZGlyZW50Jy4KKworICAgSXQgZGVmaW5lcyB0aGUgbWFjcm8gYF9ESVJFTlRfSEFWRV9EX05BTUxFTicgaWZmIHRoZXJlIGlzIGEgYGRfbmFtbGVuJworICAgbWVtYmVyIHRoYXQgZ2l2ZXMgdGhlIGxlbmd0aCBvZiBgZF9uYW1lJy4KKworICAgSXQgZGVmaW5lcyB0aGUgbWFjcm8gYF9ESVJFTlRfSEFWRV9EX1JFQ0xFTicgaWZmIHRoZXJlIGlzIGEgYGRfcmVjbGVuJworICAgbWVtYmVyIHRoYXQgZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBkaXJlY3RvcnkgZW50cnkuCisKKyAgIEl0IGRlZmluZXMgdGhlIG1hY3JvIGBfRElSRU5UX0hBVkVfRF9PRkYnIGlmZiB0aGVyZSBpcyBhIGBkX29mZicKKyAgIG1lbWJlciB0aGF0IGdpdmVzIHRoZSBmaWxlIG9mZnNldCBvZiB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkuCisKKyAgIEl0IGRlZmluZXMgdGhlIG1hY3JvIGBfRElSRU5UX0hBVkVfRF9UWVBFJyBpZmYgdGhlcmUgaXMgYSBgZF90eXBlJworICAgbWVtYmVyIHRoYXQgZ2l2ZXMgdGhlIHR5cGUgb2YgdGhlIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvZGlyZW50Lmg+CisKKyNpZiAoZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDKSAmJiAhZGVmaW5lZCBkX2ZpbGVubworIyBkZWZpbmUgZF9pbm8JZF9maWxlbm8JCSAvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgKi8KKyNlbmRpZgorCisvKiBUaGVzZSBtYWNyb3MgZXh0cmFjdCBzaXplIGluZm9ybWF0aW9uIGZyb20gYSBgc3RydWN0IGRpcmVudCAqJy4KKyAgIFRoZXkgbWF5IGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLCBzbyBpdCBtdXN0IG5vdAorICAgaGF2ZSBzaWRlIGVmZmVjdHMuICBFYWNoIG9mIHRoZXNlIG1heSBpbnZvbHZlIGEgcmVsYXRpdmVseSBjb3N0bHkKKyAgIGNhbGwgdG8gYHN0cmxlbicgb24gc29tZSBzeXN0ZW1zLCBzbyB0aGVzZSB2YWx1ZXMgc2hvdWxkIGJlIGNhY2hlZC4KKworICAgX0RfRVhBQ1RfTkFNTEVOIChEUCkJcmV0dXJucyB0aGUgbGVuZ3RoIG9mIERQLT5kX25hbWUsIG5vdCBpbmNsdWRpbmcKKyAgIGl0cyB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3Rlci4KKworICAgX0RfQUxMT0NfTkFNTEVOIChEUCkJcmV0dXJucyBhIHNpemUgYXQgbGVhc3QgKF9EX0VYQUNUX05BTUxFTiAoRFApICsgMSk7CisgICB0aGF0IGlzLCB0aGUgYWxsb2NhdGlvbiBzaXplIG5lZWRlZCB0byBob2xkIHRoZSBEUC0+ZF9uYW1lIHN0cmluZy4KKyAgIFVzZSB0aGlzIG1hY3JvIHdoZW4geW91IGRvbid0IG5lZWQgdGhlIGV4YWN0IGxlbmd0aCwganVzdCBhbiB1cHBlciBib3VuZC4KKyAgIFRoaXMgbWFjcm8gaXMgbGVzcyBsaWtlbHkgdG8gcmVxdWlyZSBjYWxsaW5nIGBzdHJsZW4nIHRoYW4gX0RfRVhBQ1RfTkFNTEVOLgorICAgKi8KKworI2lmZGVmIF9ESVJFTlRfSEFWRV9EX05BTUxFTgorIyBkZWZpbmUgX0RfRVhBQ1RfTkFNTEVOKGQpICgoZCktPmRfbmFtbGVuKQorIyBkZWZpbmUgX0RfQUxMT0NfTkFNTEVOKGQpIChfRF9FWEFDVF9OQU1MRU4gKGQpICsgMSkKKyNlbHNlCisjIGRlZmluZSBfRF9FWEFDVF9OQU1MRU4oZCkgKHN0cmxlbiAoKGQpLT5kX25hbWUpKQorIyBpZmRlZiBfRElSRU5UX0hBVkVfRF9SRUNMRU4KKyMgIGRlZmluZSBfRF9BTExPQ19OQU1MRU4oZCkgKCgoY2hhciAqKSAoZCkgKyAoZCktPmRfcmVjbGVuKSAtICYoZCktPmRfbmFtZVswXSkKKyMgZWxzZQorIyAgZGVmaW5lIF9EX0FMTE9DX05BTUxFTihkKSAoc2l6ZW9mIChkKS0+ZF9uYW1lID4gMSA/IHNpemVvZiAoZCktPmRfbmFtZSA6IFwKKwkJCSAgICAgIF9EX0VYQUNUX05BTUxFTiAoZCkgKyAxKQorIyBlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogRmlsZSB0eXBlcyBmb3IgYGRfdHlwZScuICAqLworZW51bQorICB7CisgICAgRFRfVU5LTk9XTiA9IDAsCisjIGRlZmluZSBEVF9VTktOT1dOCURUX1VOS05PV04KKyAgICBEVF9GSUZPID0gMSwKKyMgZGVmaW5lIERUX0ZJRk8JRFRfRklGTworICAgIERUX0NIUiA9IDIsCisjIGRlZmluZSBEVF9DSFIJCURUX0NIUgorICAgIERUX0RJUiA9IDQsCisjIGRlZmluZSBEVF9ESVIJCURUX0RJUgorICAgIERUX0JMSyA9IDYsCisjIGRlZmluZSBEVF9CTEsJCURUX0JMSworICAgIERUX1JFRyA9IDgsCisjIGRlZmluZSBEVF9SRUcJCURUX1JFRworICAgIERUX0xOSyA9IDEwLAorIyBkZWZpbmUgRFRfTE5LCQlEVF9MTksKKyAgICBEVF9TT0NLID0gMTIsCisjIGRlZmluZSBEVF9TT0NLCURUX1NPQ0sKKyAgICBEVF9XSFQgPSAxNAorIyBkZWZpbmUgRFRfV0hUCQlEVF9XSFQKKyAgfTsKKworLyogQ29udmVydCBiZXR3ZWVuIHN0YXQgc3RydWN0dXJlIHR5cGVzIGFuZCBkaXJlY3RvcnkgdHlwZXMuICAqLworIyBkZWZpbmUgSUZUT0RUKG1vZGUpCSgoKG1vZGUpICYgMDE3MDAwMCkgPj4gMTIpCisjIGRlZmluZSBEVFRPSUYoZGlydHlwZSkJKChkaXJ0eXBlKSA8PCAxMikKKyNlbmRpZgorCisKKy8qIFRoaXMgaXMgdGhlIGRhdGEgdHlwZSBvZiBkaXJlY3Rvcnkgc3RyZWFtIG9iamVjdHMuCisgICBUaGUgYWN0dWFsIHN0cnVjdHVyZSBpcyBvcGFxdWUgdG8gdXNlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgX19kaXJzdHJlYW0gRElSOworCisvKiBPcGVuIGEgZGlyZWN0b3J5IHN0cmVhbSBvbiBOQU1FLgorICAgUmV0dXJuIGEgRElSIHN0cmVhbSBvbiB0aGUgZGlyZWN0b3J5LCBvciBOVUxMIGlmIGl0IGNvdWxkIG5vdCBiZSBvcGVuZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIERJUiAqb3BlbmRpciAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2FtZSBhcyBvcGVuZGlyLCBidXQgb3BlbiB0aGUgc3RyZWFtIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIERJUiAqZmRvcGVuZGlyIChpbnQgX19mZCk7CisjZW5kaWYKKworLyogQ2xvc2UgdGhlIGRpcmVjdG9yeSBzdHJlYW0gRElSUC4KKyAgIFJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIC0xIGlmIG5vdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGNsb3NlZGlyIChESVIgKl9fZGlycCkgX19ub25udWxsICgoMSkpOworCisvKiBSZWFkIGEgZGlyZWN0b3J5IGVudHJ5IGZyb20gRElSUC4gIFJldHVybiBhIHBvaW50ZXIgdG8gYSBgc3RydWN0CisgICBkaXJlbnQnIGRlc2NyaWJpbmcgdGhlIGVudHJ5LCBvciBOVUxMIGZvciBFT0Ygb3IgZXJyb3IuICBUaGUKKyAgIHN0b3JhZ2UgcmV0dXJuZWQgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IGEgbGF0ZXIgcmVhZGRpciBjYWxsIG9uIHRoZQorICAgc2FtZSBESVIgc3RyZWFtLgorCisgICBJZiB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IEFQSSBpcyBzZWxlY3RlZCB3ZSBoYXZlIHRvIHVzZSB0aGUKKyAgIGFwcHJvcHJpYXRlIGludGVyZmFjZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBzdHJ1Y3QgZGlyZW50ICpyZWFkZGlyIChESVIgKl9fZGlycCkgX19ub25udWxsICgoMSkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKl9fUkVESVJFQ1QgKHJlYWRkaXIsIChESVIgKl9fZGlycCksIHJlYWRkaXI2NCkKKyAgICAgX19ub25udWxsICgoMSkpOworIyBlbHNlCisjICBkZWZpbmUgcmVhZGRpciByZWFkZGlyNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBzdHJ1Y3QgZGlyZW50NjQgKnJlYWRkaXI2NCAoRElSICpfX2RpcnApIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9uIG9mIGByZWFkZGlyJy4gIFJldHVybiBpbiBSRVNVTFQgYSBwb2ludGVyIHRvIHRoZQorICAgbmV4dCBlbnRyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHJlYWRkaXJfciAoRElSICpfX3Jlc3RyaWN0IF9fZGlycCwKKwkJICAgICAgc3RydWN0IGRpcmVudCAqX19yZXN0cmljdCBfX2VudHJ5LAorCQkgICAgICBzdHJ1Y3QgZGlyZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCkKKyAgICAgX19ub25udWxsICgoMSwgMiwgMykpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHJlYWRkaXJfciwKKwkJICAgICAgIChESVIgKl9fcmVzdHJpY3QgX19kaXJwLAorCQkJc3RydWN0IGRpcmVudCAqX19yZXN0cmljdCBfX2VudHJ5LAorCQkJc3RydWN0IGRpcmVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpLAorCQkgICAgICAgcmVhZGRpcjY0X3IpIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcmVhZGRpcl9yIHJlYWRkaXI2NF9yCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHJlYWRkaXI2NF9yIChESVIgKl9fcmVzdHJpY3QgX19kaXJwLAorCQkJc3RydWN0IGRpcmVudDY0ICpfX3Jlc3RyaWN0IF9fZW50cnksCisJCQlzdHJ1Y3QgZGlyZW50NjQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KQorICAgICBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisjIGVuZGlmCisjZW5kaWYJLyogUE9TSVggb3IgbWlzYyAqLworCisvKiBSZXdpbmQgRElSUCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkaXJlY3RvcnkuICAqLworZXh0ZXJuIHZvaWQgcmV3aW5kZGlyIChESVIgKl9fZGlycCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKy8qIFNlZWsgdG8gcG9zaXRpb24gUE9TIG9uIERJUlAuICAqLworZXh0ZXJuIHZvaWQgc2Vla2RpciAoRElSICpfX2RpcnAsIGxvbmcgaW50IF9fcG9zKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIERJUlAuICAqLworZXh0ZXJuIGxvbmcgaW50IHRlbGxkaXIgKERJUiAqX19kaXJwKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisKKy8qIFJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIHVzZWQgYnkgRElSUC4gICovCitleHRlcm4gaW50IGRpcmZkIChESVIgKl9fZGlycCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyMgaWYgZGVmaW5lZCBfX09QVElNSVpFX18gJiYgZGVmaW5lZCBfRElSX2RpcmZkCisjICBkZWZpbmUgZGlyZmQoZGlycCkJX0RJUl9kaXJmZCAoZGlycCkKKyMgZW5kaWYKKworIyBpZm5kZWYgTUFYTkFNTEVOCisvKiBHZXQgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBQT1NJWC4xIGxpbWl0cy4gICovCisjICBpbmNsdWRlIDxiaXRzL3Bvc2l4MV9saW0uaD4KKworLyogYE1BWE5BTUxFTicgaXMgdGhlIEJTRCBuYW1lIGZvciB3aGF0IFBPU0lYIGNhbGxzIGBOQU1FX01BWCcuICAqLworIyAgaWZkZWYgTkFNRV9NQVgKKyMgICBkZWZpbmUgTUFYTkFNTEVOCU5BTUVfTUFYCisjICBlbHNlCisjICAgZGVmaW5lIE1BWE5BTUxFTgkyNTUKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFNjYW4gdGhlIGRpcmVjdG9yeSBESVIsIGNhbGxpbmcgU0VMRUNUT1Igb24gZWFjaCBkaXJlY3RvcnkgZW50cnkuCisgICBFbnRyaWVzIGZvciB3aGljaCBTRUxFQ1QgcmV0dXJucyBub256ZXJvIGFyZSBpbmRpdmlkdWFsbHkgbWFsbG9jJ2QsCisgICBzb3J0ZWQgdXNpbmcgcXNvcnQgd2l0aCBDTVAsIGFuZCBjb2xsZWN0ZWQgaW4gYSBtYWxsb2MnZCBhcnJheSBpbgorICAgKk5BTUVMSVNULiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgc2VsZWN0ZWQsIG9yIC0xIG9uIGVycm9yLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc2NhbmRpciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkgICAgc3RydWN0IGRpcmVudCAqKipfX3Jlc3RyaWN0IF9fbmFtZWxpc3QsCisJCSAgICBpbnQgKCpfX3NlbGVjdG9yKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50ICopLAorCQkgICAgaW50ICgqX19jbXApIChfX2NvbnN0IHZvaWQgKiwgX19jb25zdCB2b2lkICopKQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoc2NhbmRpciwKKwkJICAgICAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kaXIsCisJCQlzdHJ1Y3QgZGlyZW50ICoqKl9fcmVzdHJpY3QgX19uYW1lbGlzdCwKKwkJCWludCAoKl9fc2VsZWN0b3IpIChfX2NvbnN0IHN0cnVjdCBkaXJlbnQgKiksCisJCQlpbnQgKCpfX2NtcCkgKF9fY29uc3Qgdm9pZCAqLCBfX2NvbnN0IHZvaWQgKikpLAorCQkgICAgICAgc2NhbmRpcjY0KSBfX25vbm51bGwgKCgxLCAyKSk7CisjICBlbHNlCisjICAgZGVmaW5lIHNjYW5kaXIgc2NhbmRpcjY0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfR05VICYmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQKKy8qIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgc2NhbmRpcicgYnV0IGl0IHVzZXMgdGhlIDY0Yml0IGRpcmVudCBzdHJ1Y3R1cmUuCisgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBDTVAgZnVuY3Rpb24gbXVzdCBub3cgd29yayB3aXRoIHN0cnVjdCBkaXJlbnQ2NCAqKi4gICovCitleHRlcm4gaW50IHNjYW5kaXI2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGlyLAorCQkgICAgICBzdHJ1Y3QgZGlyZW50NjQgKioqX19yZXN0cmljdCBfX25hbWVsaXN0LAorCQkgICAgICBpbnQgKCpfX3NlbGVjdG9yKSAoX19jb25zdCBzdHJ1Y3QgZGlyZW50NjQgKiksCisJCSAgICAgIGludCAoKl9fY21wKSAoX19jb25zdCB2b2lkICosIF9fY29uc3Qgdm9pZCAqKSkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorCisvKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBgc3RydWN0IGRpcmVudCdzIGFscGhhYmV0aWNhbGx5LiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgYWxwaGFzb3J0IChfX2NvbnN0IHZvaWQgKl9fZTEsIF9fY29uc3Qgdm9pZCAqX19lMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChhbHBoYXNvcnQsCisJCQkgICAoX19jb25zdCB2b2lkICpfX2UxLCBfX2NvbnN0IHZvaWQgKl9fZTIpLAorCQkJICAgYWxwaGFzb3J0NjQpIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisjICBlbHNlCisjICAgZGVmaW5lIGFscGhhc29ydCBhbHBoYXNvcnQ2NAorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGFscGhhc29ydDY0IChfX2NvbnN0IHZvaWQgKl9fZTEsIF9fY29uc3Qgdm9pZCAqX19lMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0dOVQorLyogRnVuY3Rpb24gdG8gY29tcGFyZSB0d28gYHN0cnVjdCBkaXJlbnQncyBieSBuYW1lICYgdmVyc2lvbi4gICovCisjICBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCB2ZXJzaW9uc29ydCAoX19jb25zdCB2b2lkICpfX2UxLCBfX2NvbnN0IHZvaWQgKl9fZTIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVsc2UKKyMgICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIICh2ZXJzaW9uc29ydCwKKwkJCSAgIChfX2NvbnN0IHZvaWQgKl9fZTEsIF9fY29uc3Qgdm9pZCAqX19lMiksCisJCQkgICB2ZXJzaW9uc29ydDY0KQorICAgICBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworIyAgIGVsc2UKKyMgICAgZGVmaW5lIHZlcnNpb25zb3J0IHZlcnNpb25zb3J0NjQKKyMgICBlbmRpZgorIyAgZW5kaWYKKworIyAgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgdmVyc2lvbnNvcnQ2NCAoX19jb25zdCB2b2lkICpfX2UxLCBfX2NvbnN0IHZvaWQgKl9fZTIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFJlYWQgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBGRCBpbnRvIEJVRiwgcmVhZGluZyBhdCBtb3N0IE5CWVRFUy4KKyAgIFJlYWRpbmcgc3RhcnRzIGF0IG9mZnNldCAqQkFTRVAsIGFuZCAqQkFTRVAgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcKKyAgIHBvc2l0aW9uIGFmdGVyIHJlYWRpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZDsgemVybyB3aGVuIGF0CisgICBlbmQgb2YgZGlyZWN0b3J5OyBvciAtMSBmb3IgZXJyb3JzLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBfX3NzaXplX3QgZ2V0ZGlyZW50cmllcyAoaW50IF9fZmQsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJc2l6ZV90IF9fbmJ5dGVzLAorCQkJCV9fb2ZmX3QgKl9fcmVzdHJpY3QgX19iYXNlcCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBfX3NzaXplX3QgX19SRURJUkVDVF9OVEggKGdldGRpcmVudHJpZXMsCisJCQkJIChpbnQgX19mZCwgY2hhciAqX19yZXN0cmljdCBfX2J1ZiwKKwkJCQkgIHNpemVfdCBfX25ieXRlcywKKwkJCQkgIF9fb2ZmNjRfdCAqX19yZXN0cmljdCBfX2Jhc2VwKSwKKwkJCQkgZ2V0ZGlyZW50cmllczY0KSBfX25vbm51bGwgKCgyLCA0KSk7CisjICBlbHNlCisjICAgZGVmaW5lIGdldGRpcmVudHJpZXMgZ2V0ZGlyZW50cmllczY0CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gX19zc2l6ZV90IGdldGRpcmVudHJpZXM2NCAoaW50IF9fZmQsIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCQkJICBzaXplX3QgX19uYnl0ZXMsCisJCQkJICBfX29mZjY0X3QgKl9fcmVzdHJpY3QgX19iYXNlcCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgQlNEIG9yIG1pc2MuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZGlyZW50LmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2RsZmNuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2RsZmNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzNzNlZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZGxmY24uaApAQCAtMCwwICsxLDE5MiBAQAorLyogVXNlciBmdW5jdGlvbnMgZm9yIHJ1bi10aW1lIGR5bmFtaWMgbG9hZGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LDIwMDAsMjAwMSwyMDAzLDIwMDQsMjAwNgorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9ETEZDTl9ICisjZGVmaW5lCV9ETEZDTl9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogQ29sbGVjdCB2YXJpb3VzIHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9kbGZjbi5oPgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIElmIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBgZGxzeW0nIG9yIGBkbHZzeW0nIGlzIHNldCB0byBSVExEX05FWFQKKyAgIHRoZSBydW4tdGltZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgY2FsbGVkIE5BTUUgaW4gdGhlIG5leHQgc2hhcmVkCisgICBvYmplY3QgaXMgcmV0dXJuZWQuICBUaGUgIm5leHQiIHJlbGF0aW9uIGlzIGRlZmluZWQgYnkgdGhlIG9yZGVyCisgICB0aGUgc2hhcmVkIG9iamVjdHMgd2VyZSBsb2FkZWQuICAqLworIyBkZWZpbmUgUlRMRF9ORVhUCSgodm9pZCAqKSAtMWwpCisKKy8qIElmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgZGxzeW0nIG9yIGBkbHZzeW0nIGlzIHNldCB0byBSVExEX0RFRkFVTFQKKyAgIHRoZSBydW4tdGltZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgY2FsbGVkIE5BTUUgaW4gdGhlIGdsb2JhbCBzY29wZQorICAgaXMgcmV0dXJuZWQuICAqLworIyBkZWZpbmUgUlRMRF9ERUZBVUxUCSgodm9pZCAqKSAwKQorCisKKy8qIFR5cGUgZm9yIG5hbWVzcGFjZSBpbmRlY2VzLiAgKi8KK3R5cGVkZWYgbG9uZyBpbnQgTG1pZF90OworCisvKiBTcGVjaWFsIG5hbWVzcGFjZSBJRCB2YWx1ZXMuICAqLworIyBkZWZpbmUgTE1fSURfQkFTRQkwCS8qIEluaXRpYWwgbmFtZXNwYWNlLiAgKi8KKyMgZGVmaW5lIExNX0lEX05FV0xNCS0xCS8qIEZvciBkbG1vcGVuOiByZXF1ZXN0IG5ldyBuYW1lc3BhY2UuICAqLworI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBPcGVuIHRoZSBzaGFyZWQgb2JqZWN0IEZJTEUgYW5kIG1hcCBpdCBpbjsgcmV0dXJuIGEgaGFuZGxlIHRoYXQgY2FuIGJlCisgICBwYXNzZWQgdG8gYGRsc3ltJyB0byBnZXQgc3ltYm9sIHZhbHVlcyBmcm9tIGl0LiAgKi8KK2V4dGVybiB2b2lkICpkbG9wZW4gKF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19tb2RlKSBfX1RIUk9XOworCisvKiBVbm1hcCBhbmQgY2xvc2UgYSBzaGFyZWQgb2JqZWN0IG9wZW5lZCBieSBgZGxvcGVuJy4KKyAgIFRoZSBoYW5kbGUgY2Fubm90IGJlIHVzZWQgYWdhaW4gYWZ0ZXIgY2FsbGluZyBgZGxjbG9zZScuICAqLworZXh0ZXJuIGludCBkbGNsb3NlICh2b2lkICpfX2hhbmRsZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEZpbmQgdGhlIHJ1bi10aW1lIGFkZHJlc3MgaW4gdGhlIHNoYXJlZCBvYmplY3QgSEFORExFIHJlZmVycyB0bworICAgb2YgdGhlIHN5bWJvbCBjYWxsZWQgTkFNRS4gICovCitleHRlcm4gdm9pZCAqZGxzeW0gKHZvaWQgKl9fcmVzdHJpY3QgX19oYW5kbGUsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogTGlrZSBgZGxvcGVuJywgYnV0IHJlcXVlc3Qgb2JqZWN0IHRvIGJlIGFsbG9jYXRlZCBpbiBhIG5ldyBuYW1lc3BhY2UuICAqLworZXh0ZXJuIHZvaWQgKmRsbW9wZW4gKExtaWRfdCBfX25zaWQsIF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19tb2RlKSBfX1RIUk9XOworCisvKiBGaW5kIHRoZSBydW4tdGltZSBhZGRyZXNzIGluIHRoZSBzaGFyZWQgb2JqZWN0IEhBTkRMRSByZWZlcnMgdG8KKyAgIG9mIHRoZSBzeW1ib2wgY2FsbGVkIE5BTUUgd2l0aCBWRVJTSU9OLiAgKi8KK2V4dGVybiB2b2lkICpkbHZzeW0gKHZvaWQgKl9fcmVzdHJpY3QgX19oYW5kbGUsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX192ZXJzaW9uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyNlbmRpZgorCisvKiBXaGVuIGFueSBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIGZhaWxzLCBjYWxsIHRoaXMgZnVuY3Rpb24KKyAgIHRvIHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvci4gIEVhY2ggY2FsbCByZXNldHMKKyAgIHRoZSBlcnJvciBzdHJpbmcgc28gdGhhdCBhIGZvbGxvd2luZyBjYWxsIHJldHVybnMgbnVsbC4gICovCitleHRlcm4gY2hhciAqZGxlcnJvciAodm9pZCkgX19USFJPVzsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3Qgc2VhcmNoZWQgdXNpbmcKKyAgIGBkbGFkZHInLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIF9fY29uc3QgY2hhciAqZGxpX2ZuYW1lOwkvKiBGaWxlIG5hbWUgb2YgZGVmaW5pbmcgb2JqZWN0LiAgKi8KKyAgdm9pZCAqZGxpX2ZiYXNlOwkJLyogTG9hZCBhZGRyZXNzIG9mIHRoYXQgb2JqZWN0LiAgKi8KKyAgX19jb25zdCBjaGFyICpkbGlfc25hbWU7CS8qIE5hbWUgb2YgbmVhcmVzdCBzeW1ib2wuICAqLworICB2b2lkICpkbGlfc2FkZHI7CQkvKiBFeGFjdCB2YWx1ZSBvZiBuZWFyZXN0IHN5bWJvbC4gICovCit9IERsX2luZm87CisKKy8qIEZpbGwgaW4gKklORk8gd2l0aCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IEFERFJFU1MuCisgICBSZXR1cm5zIDAgaWZmIG5vIHNoYXJlZCBvYmplY3QncyBzZWdtZW50cyBjb250YWluIHRoYXQgYWRkcmVzcy4gICovCitleHRlcm4gaW50IGRsYWRkciAoX19jb25zdCB2b2lkICpfX2FkZHJlc3MsIERsX2luZm8gKl9faW5mbykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIFNhbWUgYXMgYGRsYWRkcicsIGJ1dCBhZGRpdGlvbmFsbHkgc2V0cyAqRVhUUkFfSU5GTyBhY2NvcmRpbmcgdG8gRkxBR1MuICAqLworZXh0ZXJuIGludCBkbGFkZHIxIChfX2NvbnN0IHZvaWQgKl9fYWRkcmVzcywgRGxfaW5mbyAqX19pbmZvLAorCQkgICAgdm9pZCAqKl9fZXh0cmFfaW5mbywgaW50IF9fZmxhZ3MpIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIEZMQUdTIGFyZ3VtZW50IHRvIGBkbGFkZHIxJy4KKyAgIFRoaXMgaW5kaWNhdGVzIHdoYXQgZXh0cmEgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGF0ICpFWFRSQV9JTkZPLgorICAgSXQgbWF5IGFsc28gYmUgemVybywgaW4gd2hpY2ggY2FzZSB0aGUgRVhUUkFfSU5GTyBhcmd1bWVudCBpcyBub3QgdXNlZC4gICovCitlbnVtCisgIHsKKyAgICAvKiBNYXRjaGluZyBzeW1ib2wgdGFibGUgZW50cnkgKGNvbnN0IEVsZk5OX1N5bSAqKS4gICovCisgICAgUlRMRF9ETF9TWU1FTlQgPSAxLAorCisgICAgLyogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBhZGRyZXNzIChzdHJ1Y3QgbGlua19tYXAgKikuICAqLworICAgIFJUTERfRExfTElOS01BUCA9IDIKKyAgfTsKKworCisvKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNoYXJlZCBvYmplY3QgSEFORExFIHJlZmVycyB0by4KKyAgIFJFUVVFU1QgaXMgZnJvbSBhbW9uZyB0aGUgdmFsdWVzIGJlbG93LCBhbmQgZGV0ZXJtaW5lcyB0aGUgdXNlIG9mIEFSRy4KKworICAgT24gc3VjY2VzcywgcmV0dXJucyB6ZXJvLiAgT24gZmFpbHVyZSwgcmV0dXJucyAtMSBhbmQgcmVjb3JkcyBhbiBlcnJvcgorICAgbWVzc2FnZSB0byBiZSBmZXRjaGVkIHdpdGggYGRsZXJyb3InLiAgKi8KK2V4dGVybiBpbnQgZGxpbmZvICh2b2lkICpfX3Jlc3RyaWN0IF9faGFuZGxlLAorCQkgICBpbnQgX19yZXF1ZXN0LCB2b2lkICpfX3Jlc3RyaWN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBSRVFVRVNUIGFyZ3VtZW50IHRvIGBkbGluZm8nLiAgKi8KK2VudW0KKyAgeworICAgIC8qIFRyZWF0IEFSRyBhcyBgbG1pZF90IConOyBzdG9yZSBuYW1lc3BhY2UgSUQgZm9yIEhBTkRMRSB0aGVyZS4gICovCisgICAgUlRMRF9ESV9MTUlEID0gMSwKKworICAgIC8qIFRyZWF0IEFSRyBhcyBgc3RydWN0IGxpbmtfbWFwICoqJzsKKyAgICAgICBzdG9yZSB0aGUgYHN0cnVjdCBsaW5rX21hcCAqJyBmb3IgSEFORExFIHRoZXJlLiAgKi8KKyAgICBSVExEX0RJX0xJTktNQVAgPSAyLAorCisgICAgUlRMRF9ESV9DT05GSUdBRERSID0gMywJLyogVW5zdXBwb3J0ZWQsIGRlZmluZWQgYnkgU29sYXJpcy4gICovCisKKyAgICAvKiBUcmVhdCBBUkcgYXMgYERsX3NlcmluZm8gKicgKHNlZSBiZWxvdyksIGFuZCBmaWxsIGluIHRvIGRlc2NyaWJlIHRoZQorICAgICAgIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgZGVwZW5kZW5jaWVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAgIFJUTERfRElfU0VSSU5GT1NJWkUgZmlsbHMgaW4ganVzdCB0aGUgYGRsc19jbnQnIGFuZCBgZGxzX3NpemUnCisgICAgICAgZW50cmllcyB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQgbXVzdCBiZSBwYXNzZWQgdG8KKyAgICAgICBSVExEX0RJX1NFUklORk8gdG8gZmlsbCBpbiB0aGUgZnVsbCBpbmZvcm1hdGlvbi4gICovCisgICAgUlRMRF9ESV9TRVJJTkZPID0gNCwKKyAgICBSVExEX0RJX1NFUklORk9TSVpFID0gNSwKKworICAgIC8qIFRyZWF0IEFSRyBhcyBgY2hhciAqJywgYW5kIHN0b3JlIHRoZXJlIHRoZSBkaXJlY3RvcnkgbmFtZSB1c2VkIHRvCisgICAgICAgZXhwYW5kICRPUklHSU4gaW4gdGhpcyBzaGFyZWQgb2JqZWN0J3MgZGVwZW5kZW5jeSBmaWxlIG5hbWVzLiAgKi8KKyAgICBSVExEX0RJX09SSUdJTiA9IDYsCisKKyAgICBSVExEX0RJX1BST0ZJTEVOQU1FID0gNywJLyogVW5zdXBwb3J0ZWQsIGRlZmluZWQgYnkgU29sYXJpcy4gICovCisgICAgUlRMRF9ESV9QUk9GSUxFT1VUID0gOCwJLyogVW5zdXBwb3J0ZWQsIGRlZmluZWQgYnkgU29sYXJpcy4gICovCisKKyAgICAvKiBUcmVhdCBBUkcgYXMgYHNpemVfdCAqJywgYW5kIHN0b3JlIHRoZXJlIHRoZSBUTFMgbW9kdWxlIElECisgICAgICAgb2YgdGhpcyBvYmplY3QncyBQVF9UTFMgc2VnbWVudCwgYXMgdXNlZCBpbiBUTFMgcmVsb2NhdGlvbnM7CisgICAgICAgc3RvcmUgemVybyBpZiB0aGlzIG9iamVjdCBkb2VzIG5vdCBkZWZpbmUgYSBQVF9UTFMgc2VnbWVudC4gICovCisgICAgUlRMRF9ESV9UTFNfTU9ESUQgPSA5LAorCisgICAgLyogVHJlYXQgQVJHIGFzIGB2b2lkICoqJywgYW5kIHN0b3JlIHRoZXJlIGEgcG9pbnRlciB0byB0aGUgY2FsbGluZworICAgICAgIHRocmVhZCdzIFRMUyBibG9jayBjb3JyZXNwb25kaW5nIHRvIHRoaXMgb2JqZWN0J3MgUFRfVExTIHNlZ21lbnQuCisgICAgICAgU3RvcmUgYSBudWxsIHBvaW50ZXIgaWYgdGhpcyBvYmplY3QgZG9lcyBub3QgZGVmaW5lIGEgUFRfVExTCisgICAgICAgc2VnbWVudCwgb3IgaWYgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWxsb2NhdGVkIGEgYmxvY2sgZm9yIGl0LiAgKi8KKyAgICBSVExEX0RJX1RMU19EQVRBID0gMTAsCisKKyAgICBSVExEX0RJX01BWCA9IDEwLAorICB9OworCisKKy8qIFRoaXMgaXMgdGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gYERsX3NlcmluZm8nLCBiZWxvdy4KKyAgIFRoZSBgZGxzX25hbWUnIG1lbWJlciBwb2ludHMgdG8gc3BhY2UgaW4gdGhlIGJ1ZmZlciBwYXNzZWQgdG8gYGRsaW5mbycuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciAqZGxzX25hbWU7CQkvKiBOYW1lIG9mIGxpYnJhcnkgc2VhcmNoIHBhdGggZGlyZWN0b3J5LiAgKi8KKyAgdW5zaWduZWQgaW50IGRsc19mbGFnczsJLyogSW5kaWNhdGVzIHdoZXJlIHRoaXMgZGlyZWN0b3J5IGNhbWUgZnJvbS4gKi8KK30gRGxfc2VycGF0aDsKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHRoYXQgbXVzdCBiZSBwYXNzZWQgKGJ5IHJlZmVyZW5jZSkgdG8gYGRsaW5mbycgZm9yCisgICB0aGUgUlRMRF9ESV9TRVJJTkZPIGFuZCBSVExEX0RJX1NFUklORk9TSVpFIHJlcXVlc3RzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHNpemVfdCBkbHNfc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHdob2xlIGJ1ZmZlci4gICovCisgIHVuc2lnbmVkIGludCBkbHNfY250OwkJLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGBkbHNfc2VycGF0aCcuICAqLworICBEbF9zZXJwYXRoIGRsc19zZXJwYXRoWzFdOwkvKiBBY3R1YWxseSBsb25nZXIsIGRsc19jbnQgZWxlbWVudHMuICAqLworfSBEbF9zZXJpbmZvOworI2VuZGlmIC8qIF9fVVNFX0dOVSAqLworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBkbGZjbi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2VsZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI2MzZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lbGYuaApAQCAtMCwwICsxLDI2NDYgQEAKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIHN0YW5kYXJkIEVMRiB0eXBlcywgc3RydWN0dXJlcywgYW5kIG1hY3Jvcy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAzLDIwMDQsMjAwNSwyMDA2LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0VMRl9ICisjZGVmaW5lCV9FTEZfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0YW5kYXJkIEVMRiB0eXBlcy4gICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogVHlwZSBmb3IgYSAxNi1iaXQgcXVhbnRpdHkuICAqLwordHlwZWRlZiB1aW50MTZfdCBFbGYzMl9IYWxmOwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOworCisvKiBUeXBlcyBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCAzMi1iaXQgcXVhbnRpdGllcy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX1dvcmQ7Cit0eXBlZGVmCWludDMyX3QgIEVsZjMyX1N3b3JkOwordHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwordHlwZWRlZglpbnQzMl90ICBFbGY2NF9Td29yZDsKKworLyogVHlwZXMgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgNjQtYml0IHF1YW50aXRpZXMuICAqLwordHlwZWRlZiB1aW50NjRfdCBFbGYzMl9Yd29yZDsKK3R5cGVkZWYJaW50NjRfdCAgRWxmMzJfU3h3b3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9Yd29yZDsKK3R5cGVkZWYJaW50NjRfdCAgRWxmNjRfU3h3b3JkOworCisvKiBUeXBlIG9mIGFkZHJlc3Nlcy4gICovCit0eXBlZGVmIHVpbnQzMl90IEVsZjMyX0FkZHI7Cit0eXBlZGVmIHVpbnQ2NF90IEVsZjY0X0FkZHI7CisKKy8qIFR5cGUgb2YgZmlsZSBvZmZzZXRzLiAgKi8KK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfT2ZmOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9PZmY7CisKKy8qIFR5cGUgZm9yIHNlY3Rpb24gaW5kaWNlcywgd2hpY2ggYXJlIDE2LWJpdCBxdWFudGl0aWVzLiAgKi8KK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfU2VjdGlvbjsKK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfU2VjdGlvbjsKKworLyogVHlwZSBmb3IgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBFbGYzMl9IYWxmIEVsZjMyX1ZlcnN5bTsKK3R5cGVkZWYgRWxmNjRfSGFsZiBFbGY2NF9WZXJzeW07CisKKworLyogVGhlIEVMRiBmaWxlIGhlYWRlci4gIFRoaXMgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgRUxGIGZpbGUuICAqLworCisjZGVmaW5lIEVJX05JREVOVCAoMTYpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBNYWdpYyBudW1iZXIgYW5kIG90aGVyIGluZm8gKi8KKyAgRWxmMzJfSGFsZgllX3R5cGU7CQkJLyogT2JqZWN0IGZpbGUgdHlwZSAqLworICBFbGYzMl9IYWxmCWVfbWFjaGluZTsJCS8qIEFyY2hpdGVjdHVyZSAqLworICBFbGYzMl9Xb3JkCWVfdmVyc2lvbjsJCS8qIE9iamVjdCBmaWxlIHZlcnNpb24gKi8KKyAgRWxmMzJfQWRkcgllX2VudHJ5OwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCisgIEVsZjMyX09mZgllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfT2ZmCWVfc2hvZmY7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGYzMl9Xb3JkCWVfZmxhZ3M7CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KKyAgRWxmMzJfSGFsZgllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLworICBFbGYzMl9IYWxmCWVfcGhlbnRzaXplOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICBFbGYzMl9IYWxmCWVfcGhudW07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICBFbGYzMl9IYWxmCWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICBFbGYzMl9IYWxmCWVfc2hudW07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLworICBFbGYzMl9IYWxmCWVfc2hzdHJuZHg7CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KK30gRWxmMzJfRWhkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CS8qIE1hZ2ljIG51bWJlciBhbmQgb3RoZXIgaW5mbyAqLworICBFbGY2NF9IYWxmCWVfdHlwZTsJCQkvKiBPYmplY3QgZmlsZSB0eXBlICovCisgIEVsZjY0X0hhbGYJZV9tYWNoaW5lOwkJLyogQXJjaGl0ZWN0dXJlICovCisgIEVsZjY0X1dvcmQJZV92ZXJzaW9uOwkJLyogT2JqZWN0IGZpbGUgdmVyc2lvbiAqLworICBFbGY2NF9BZGRyCWVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfT2ZmCWVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGY2NF9PZmYJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1dvcmQJZV9mbGFnczsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLworICBFbGY2NF9IYWxmCWVfZWhzaXplOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCisgIEVsZjY0X0hhbGYJZV9waGVudHNpemU7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIEVsZjY0X0hhbGYJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIEVsZjY0X0hhbGYJZV9zaGVudHNpemU7CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgIEVsZjY0X0hhbGYJZV9zaG51bTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgIEVsZjY0X0hhbGYJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLworfSBFbGY2NF9FaGRyOworCisvKiBGaWVsZHMgaW4gdGhlIGVfaWRlbnQgYXJyYXkuICBUaGUgRUlfKiBtYWNyb3MgYXJlIGluZGljZXMgaW50byB0aGUKKyAgIGFycmF5LiAgVGhlIG1hY3JvcyB1bmRlciBlYWNoIEVJXyogbWFjcm8gYXJlIHRoZSB2YWx1ZXMgdGhlIGJ5dGUKKyAgIG1heSBoYXZlLiAgKi8KKworI2RlZmluZSBFSV9NQUcwCQkwCQkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMCBpbmRleCAqLworI2RlZmluZSBFTEZNQUcwCQkweDdmCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAwICovCisKKyNkZWZpbmUgRUlfTUFHMQkJMQkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDEgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMQkJJ0UnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAxICovCisKKyNkZWZpbmUgRUlfTUFHMgkJMgkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDIgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMgkJJ0wnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAyICovCisKKyNkZWZpbmUgRUlfTUFHMwkJMwkJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDMgaW5kZXggKi8KKyNkZWZpbmUgRUxGTUFHMwkJJ0YnCQkvKiBNYWdpYyBudW1iZXIgYnl0ZSAzICovCisKKy8qIENvbmdsb21lcmF0aW9uIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBieXRlcywgZm9yIGVhc3kgdGVzdGluZyBhcyBhIHdvcmQuICAqLworI2RlZmluZQlFTEZNQUcJCSJcMTc3RUxGIgorI2RlZmluZQlTRUxGTUFHCQk0CisKKyNkZWZpbmUgRUlfQ0xBU1MJNAkJLyogRmlsZSBjbGFzcyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkNMQVNTTk9ORQkwCQkvKiBJbnZhbGlkIGNsYXNzICovCisjZGVmaW5lIEVMRkNMQVNTMzIJMQkJLyogMzItYml0IG9iamVjdHMgKi8KKyNkZWZpbmUgRUxGQ0xBU1M2NAkyCQkvKiA2NC1iaXQgb2JqZWN0cyAqLworI2RlZmluZSBFTEZDTEFTU05VTQkzCisKKyNkZWZpbmUgRUlfREFUQQkJNQkJLyogRGF0YSBlbmNvZGluZyBieXRlIGluZGV4ICovCisjZGVmaW5lIEVMRkRBVEFOT05FCTAJCS8qIEludmFsaWQgZGF0YSBlbmNvZGluZyAqLworI2RlZmluZSBFTEZEQVRBMkxTQgkxCQkvKiAyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiAqLworI2RlZmluZSBFTEZEQVRBMk1TQgkyCQkvKiAyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiAqLworI2RlZmluZSBFTEZEQVRBTlVNCTMKKworI2RlZmluZSBFSV9WRVJTSU9OCTYJCS8qIEZpbGUgdmVyc2lvbiBieXRlIGluZGV4ICovCisJCQkJCS8qIFZhbHVlIG11c3QgYmUgRVZfQ1VSUkVOVCAqLworCisjZGVmaW5lIEVJX09TQUJJCTcJCS8qIE9TIEFCSSBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBFTEZPU0FCSV9OT05FCQkwCS8qIFVOSVggU3lzdGVtIFYgQUJJICovCisjZGVmaW5lIEVMRk9TQUJJX1NZU1YJCTAJLyogQWxpYXMuICAqLworI2RlZmluZSBFTEZPU0FCSV9IUFVYCQkxCS8qIEhQLVVYICovCisjZGVmaW5lIEVMRk9TQUJJX05FVEJTRAkJMgkvKiBOZXRCU0QuICAqLworI2RlZmluZSBFTEZPU0FCSV9MSU5VWAkJMwkvKiBMaW51eC4gICovCisjZGVmaW5lIEVMRk9TQUJJX1NPTEFSSVMJNgkvKiBTdW4gU29sYXJpcy4gICovCisjZGVmaW5lIEVMRk9TQUJJX0FJWAkJNwkvKiBJQk0gQUlYLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfSVJJWAkJOAkvKiBTR0kgSXJpeC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0ZSRUVCU0QJOQkvKiBGcmVlQlNELiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfVFJVNjQJCTEwCS8qIENvbXBhcSBUUlU2NCBVTklYLiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfTU9ERVNUTwkxMQkvKiBOb3ZlbGwgTW9kZXN0by4gICovCisjZGVmaW5lIEVMRk9TQUJJX09QRU5CU0QJMTIJLyogT3BlbkJTRC4gICovCisjZGVmaW5lIEVMRk9TQUJJX0FSTQkJOTcJLyogQVJNICovCisjZGVmaW5lIEVMRk9TQUJJX1NUQU5EQUxPTkUJMjU1CS8qIFN0YW5kYWxvbmUgKGVtYmVkZGVkKSBhcHBsaWNhdGlvbiAqLworCisjZGVmaW5lIEVJX0FCSVZFUlNJT04JOAkJLyogQUJJIHZlcnNpb24gKi8KKworI2RlZmluZSBFSV9QQUQJCTkJCS8qIEJ5dGUgaW5kZXggb2YgcGFkZGluZyBieXRlcyAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfdHlwZSAob2JqZWN0IGZpbGUgdHlwZSkuICAqLworCisjZGVmaW5lIEVUX05PTkUJCTAJCS8qIE5vIGZpbGUgdHlwZSAqLworI2RlZmluZSBFVF9SRUwJCTEJCS8qIFJlbG9jYXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVRfRVhFQwkJMgkJLyogRXhlY3V0YWJsZSBmaWxlICovCisjZGVmaW5lIEVUX0RZTgkJMwkJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCisjZGVmaW5lIEVUX0NPUkUJCTQJCS8qIENvcmUgZmlsZSAqLworI2RlZmluZQlFVF9OVU0JCTUJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzICovCisjZGVmaW5lIEVUX0xPT1MJCTB4ZmUwMAkJLyogT1Mtc3BlY2lmaWMgcmFuZ2Ugc3RhcnQgKi8KKyNkZWZpbmUgRVRfSElPUwkJMHhmZWZmCQkvKiBPUy1zcGVjaWZpYyByYW5nZSBlbmQgKi8KKyNkZWZpbmUgRVRfTE9QUk9DCTB4ZmYwMAkJLyogUHJvY2Vzc29yLXNwZWNpZmljIHJhbmdlIHN0YXJ0ICovCisjZGVmaW5lIEVUX0hJUFJPQwkweGZmZmYJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByYW5nZSBlbmQgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX21hY2hpbmUgKGFyY2hpdGVjdHVyZSkuICAqLworCisjZGVmaW5lIEVNX05PTkUJCSAwCQkvKiBObyBtYWNoaW5lICovCisjZGVmaW5lIEVNX00zMgkJIDEJCS8qIEFUJlQgV0UgMzIxMDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMJIDIJCS8qIFNVTiBTUEFSQyAqLworI2RlZmluZSBFTV8zODYJCSAzCQkvKiBJbnRlbCA4MDM4NiAqLworI2RlZmluZSBFTV82OEsJCSA0CQkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLworI2RlZmluZSBFTV84OEsJCSA1CQkvKiBNb3Rvcm9sYSBtODhrIGZhbWlseSAqLworI2RlZmluZSBFTV84NjAJCSA3CQkvKiBJbnRlbCA4MDg2MCAqLworI2RlZmluZSBFTV9NSVBTCQkgOAkJLyogTUlQUyBSMzAwMCBiaWctZW5kaWFuICovCisjZGVmaW5lIEVNX1MzNzAJCSA5CQkvKiBJQk0gU3lzdGVtLzM3MCAqLworI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAkJLyogTUlQUyBSMzAwMCBsaXR0bGUtZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDCTE1CQkvKiBIUFBBICovCisjZGVmaW5lIEVNX1ZQUDUwMAkxNwkJLyogRnVqaXRzdSBWUFA1MDAgKi8KKyNkZWZpbmUgRU1fU1BBUkMzMlBMVVMJMTgJCS8qIFN1bidzICJ2OHBsdXMiICovCisjZGVmaW5lIEVNXzk2MAkJMTkJCS8qIEludGVsIDgwOTYwICovCisjZGVmaW5lIEVNX1BQQwkJMjAJCS8qIFBvd2VyUEMgKi8KKyNkZWZpbmUgRU1fUFBDNjQJMjEJCS8qIFBvd2VyUEMgNjQtYml0ICovCisjZGVmaW5lIEVNX1MzOTAJCTIyCQkvKiBJQk0gUzM5MCAqLworCisjZGVmaW5lIEVNX1Y4MDAJCTM2CQkvKiBORUMgVjgwMCBzZXJpZXMgKi8KKyNkZWZpbmUgRU1fRlIyMAkJMzcJCS8qIEZ1aml0c3UgRlIyMCAqLworI2RlZmluZSBFTV9SSDMyCQkzOAkJLyogVFJXIFJILTMyICovCisjZGVmaW5lIEVNX1JDRQkJMzkJCS8qIE1vdG9yb2xhIFJDRSAqLworI2RlZmluZSBFTV9BUk0JCTQwCQkvKiBBUk0gKi8KKyNkZWZpbmUgRU1fRkFLRV9BTFBIQQk0MQkJLyogRGlnaXRhbCBBbHBoYSAqLworI2RlZmluZSBFTV9TSAkJNDIJCS8qIEhpdGFjaGkgU0ggKi8KKyNkZWZpbmUgRU1fU1BBUkNWOQk0MwkJLyogU1BBUkMgdjkgNjQtYml0ICovCisjZGVmaW5lIEVNX1RSSUNPUkUJNDQJCS8qIFNpZW1lbnMgVHJpY29yZSAqLworI2RlZmluZSBFTV9BUkMJCTQ1CQkvKiBBcmdvbmF1dCBSSVNDIENvcmUgKi8KKyNkZWZpbmUgRU1fSDhfMzAwCTQ2CQkvKiBIaXRhY2hpIEg4LzMwMCAqLworI2RlZmluZSBFTV9IOF8zMDBICTQ3CQkvKiBIaXRhY2hpIEg4LzMwMEggKi8KKyNkZWZpbmUgRU1fSDhTCQk0OAkJLyogSGl0YWNoaSBIOFMgKi8KKyNkZWZpbmUgRU1fSDhfNTAwCTQ5CQkvKiBIaXRhY2hpIEg4LzUwMCAqLworI2RlZmluZSBFTV9JQV82NAk1MAkJLyogSW50ZWwgTWVyY2VkICovCisjZGVmaW5lIEVNX01JUFNfWAk1MQkJLyogU3RhbmZvcmQgTUlQUy1YICovCisjZGVmaW5lIEVNX0NPTERGSVJFCTUyCQkvKiBNb3Rvcm9sYSBDb2xkZmlyZSAqLworI2RlZmluZSBFTV82OEhDMTIJNTMJCS8qIE1vdG9yb2xhIE02OEhDMTIgKi8KKyNkZWZpbmUgRU1fTU1BCQk1NAkJLyogRnVqaXRzdSBNTUEgTXVsdGltZWRpYSBBY2NlbGVyYXRvciovCisjZGVmaW5lIEVNX1BDUAkJNTUJCS8qIFNpZW1lbnMgUENQICovCisjZGVmaW5lIEVNX05DUFUJCTU2CQkvKiBTb255IG5DUFUgZW1iZWVkZWQgUklTQyAqLworI2RlZmluZSBFTV9ORFIxCQk1NwkJLyogRGVuc28gTkRSMSBtaWNyb3Byb2Nlc3NvciAqLworI2RlZmluZSBFTV9TVEFSQ09SRQk1OAkJLyogTW90b3JvbGEgU3RhcnQqQ29yZSBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fTUUxNgkJNTkJCS8qIFRveW90YSBNRTE2IHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9TVDEwMAk2MAkJLyogU1RNaWNyb2VsZWN0cm9uaWMgU1QxMDAgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1RJTllKCTYxCQkvKiBBZHZhbmNlZCBMb2dpYyBDb3JwLiBUaW55aiBlbWIuZmFtKi8KKyNkZWZpbmUgRU1fWDg2XzY0CTYyCQkvKiBBTUQgeDg2LTY0IGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBFTV9QRFNQCQk2MwkJLyogU29ueSBEU1AgUHJvY2Vzc29yICovCisKKyNkZWZpbmUgRU1fRlg2NgkJNjYJCS8qIFNpZW1lbnMgRlg2NiBtaWNyb2NvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRU1fU1Q5UExVUwk2NwkJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUOSsgOC8xNiBtYyAqLworI2RlZmluZSBFTV9TVDcJCTY4CQkvKiBTVG1pY3JvZWxlY3Ryb25pY3MgU1Q3IDggYml0IG1jICovCisjZGVmaW5lIEVNXzY4SEMxNgk2OQkJLyogTW90b3JvbGEgTUM2OEhDMTYgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMxMQk3MAkJLyogTW90b3JvbGEgTUM2OEhDMTEgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMwOAk3MQkJLyogTW90b3JvbGEgTUM2OEhDMDggbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNXzY4SEMwNQk3MgkJLyogTW90b3JvbGEgTUM2OEhDMDUgbWljcm9jb250cm9sbGVyICovCisjZGVmaW5lIEVNX1NWWAkJNzMJCS8qIFNpbGljb24gR3JhcGhpY3MgU1Z4ICovCisjZGVmaW5lIEVNX1NUMTkJCTc0CQkvKiBTVE1pY3JvZWxlY3Ryb25pY3MgU1QxOSA4IGJpdCBtYyAqLworI2RlZmluZSBFTV9WQVgJCTc1CQkvKiBEaWdpdGFsIFZBWCAqLworI2RlZmluZSBFTV9DUklTCQk3NgkJLyogQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0pBVkVMSU4JNzcJCS8qIEluZmluZW9uIFRlY2hub2xvZ2llcyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0ZJUkVQQVRICTc4CQkvKiBFbGVtZW50IDE0IDY0LWJpdCBEU1AgUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX1pTUAkJNzkJCS8qIExTSSBMb2dpYyAxNi1iaXQgRFNQIFByb2Nlc3NvciAqLworI2RlZmluZSBFTV9NTUlYCQk4MAkJLyogRG9uYWxkIEtudXRoJ3MgZWR1Y2F0aW9uYWwgNjQtYml0IHByb2Nlc3NvciAqLworI2RlZmluZSBFTV9IVUFOWQk4MQkJLyogSGFydmFyZCBVbml2ZXJzaXR5IG1hY2hpbmUtaW5kZXBlbmRlbnQgb2JqZWN0IGZpbGVzICovCisjZGVmaW5lIEVNX1BSSVNNCTgyCQkvKiBTaVRlcmEgUHJpc20gKi8KKyNkZWZpbmUgRU1fQVZSCQk4MwkJLyogQXRtZWwgQVZSIDgtYml0IG1pY3JvY29udHJvbGxlciAqLworI2RlZmluZSBFTV9GUjMwCQk4NAkJLyogRnVqaXRzdSBGUjMwICovCisjZGVmaW5lIEVNX0QxMFYJCTg1CQkvKiBNaXRzdWJpc2hpIEQxMFYgKi8KKyNkZWZpbmUgRU1fRDMwVgkJODYJCS8qIE1pdHN1YmlzaGkgRDMwViAqLworI2RlZmluZSBFTV9WODUwCQk4NwkJLyogTkVDIHY4NTAgKi8KKyNkZWZpbmUgRU1fTTMyUgkJODgJCS8qIE1pdHN1YmlzaGkgTTMyUiAqLworI2RlZmluZSBFTV9NTjEwMzAwCTg5CQkvKiBNYXRzdXNoaXRhIE1OMTAzMDAgKi8KKyNkZWZpbmUgRU1fTU4xMDIwMAk5MAkJLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCisjZGVmaW5lIEVNX1BKCQk5MQkJLyogcGljb0phdmEgKi8KKyNkZWZpbmUgRU1fT1BFTlJJU0MJOTIJCS8qIE9wZW5SSVNDIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fQVJDX0E1CTkzCQkvKiBBUkMgQ29yZXMgVGFuZ2VudC1BNSAqLworI2RlZmluZSBFTV9YVEVOU0EJOTQJCS8qIFRlbnNpbGljYSBYdGVuc2EgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX05VTQkJOTUKKworLyogSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFzc2lnbiBuZXcgdW5vZmZpY2lhbCBFTV8qIHZhbHVlcywgcGxlYXNlCisgICBwaWNrIGxhcmdlIHJhbmRvbSBudW1iZXJzICgweDg1MjMsIDB4YTdmMiwgZXRjLikgdG8gbWluaW1pemUgdGhlCisgICBjaGFuY2VzIG9mIGNvbGxpc2lvbiB3aXRoIG9mZmljaWFsIG9yIG5vbi1HTlUgdW5vZmZpY2lhbCB2YWx1ZXMuICAqLworCisjZGVmaW5lIEVNX0FMUEhBCTB4OTAyNgorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfdmVyc2lvbiAodmVyc2lvbikuICAqLworCisjZGVmaW5lIEVWX05PTkUJCTAJCS8qIEludmFsaWQgRUxGIHZlcnNpb24gKi8KKyNkZWZpbmUgRVZfQ1VSUkVOVAkxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgRVZfTlVNCQkyCisKKy8qIFNlY3Rpb24gaGVhZGVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLworICBFbGYzMl9Xb3JkCXNoX3R5cGU7CQkvKiBTZWN0aW9uIHR5cGUgKi8KKyAgRWxmMzJfV29yZAlzaF9mbGFnczsJCS8qIFNlY3Rpb24gZmxhZ3MgKi8KKyAgRWxmMzJfQWRkcglzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCisgIEVsZjMyX09mZglzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIEVsZjMyX1dvcmQJc2hfc2l6ZTsJCS8qIFNlY3Rpb24gc2l6ZSBpbiBieXRlcyAqLworICBFbGYzMl9Xb3JkCXNoX2xpbms7CQkvKiBMaW5rIHRvIGFub3RoZXIgc2VjdGlvbiAqLworICBFbGYzMl9Xb3JkCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfV29yZAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICBFbGYzMl9Xb3JkCXNoX2VudHNpemU7CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KK30gRWxmMzJfU2hkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAlzaF9uYW1lOwkJLyogU2VjdGlvbiBuYW1lIChzdHJpbmcgdGJsIGluZGV4KSAqLworICBFbGY2NF9Xb3JkCXNoX3R5cGU7CQkvKiBTZWN0aW9uIHR5cGUgKi8KKyAgRWxmNjRfWHdvcmQJc2hfZmxhZ3M7CQkvKiBTZWN0aW9uIGZsYWdzICovCisgIEVsZjY0X0FkZHIJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLworICBFbGY2NF9PZmYJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLworICBFbGY2NF9Yd29yZAlzaF9zaXplOwkJLyogU2VjdGlvbiBzaXplIGluIGJ5dGVzICovCisgIEVsZjY0X1dvcmQJc2hfbGluazsJCS8qIExpbmsgdG8gYW5vdGhlciBzZWN0aW9uICovCisgIEVsZjY0X1dvcmQJc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLworICBFbGY2NF9Yd29yZAlzaF9hZGRyYWxpZ247CQkvKiBTZWN0aW9uIGFsaWdubWVudCAqLworICBFbGY2NF9Yd29yZAlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCit9IEVsZjY0X1NoZHI7CisKKy8qIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLiAgKi8KKworI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gKi8KKyNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweGZmMDAJCS8qIFN0YXJ0IG9mIHJlc2VydmVkIGluZGljZXMgKi8KKyNkZWZpbmUgU0hOX0xPUFJPQwkweGZmMDAJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fQkVGT1JFCTB4ZmYwMAkJLyogT3JkZXIgc2VjdGlvbiBiZWZvcmUgYWxsIG90aGVycworCQkJCQkgICAoU29sYXJpcykuICAqLworI2RlZmluZSBTSE5fQUZURVIJMHhmZjAxCQkvKiBPcmRlciBzZWN0aW9uIGFmdGVyIGFsbCBvdGhlcnMKKwkJCQkJICAgKFNvbGFyaXMpLiAgKi8KKyNkZWZpbmUgU0hOX0hJUFJPQwkweGZmMWYJCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hOX0xPT1MJMHhmZjIwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fSElPUwkweGZmM2YJCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTSE5fQUJTCQkweGZmZjEJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIGlzIGFic29sdXRlICovCisjZGVmaW5lIFNITl9DT01NT04JMHhmZmYyCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBjb21tb24gKi8KKyNkZWZpbmUgU0hOX1hJTkRFWAkweGZmZmYJCS8qIEluZGV4IGlzIGluIGV4dHJhIHRhYmxlLiAgKi8KKyNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweGZmZmYJCS8qIEVuZCBvZiByZXNlcnZlZCBpbmRpY2VzICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSAoc2VjdGlvbiB0eXBlKS4gICovCisKKyNkZWZpbmUgU0hUX05VTEwJICAwCQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KKyNkZWZpbmUgU0hUX1BST0dCSVRTCSAgMQkJLyogUHJvZ3JhbSBkYXRhICovCisjZGVmaW5lIFNIVF9TWU1UQUIJICAyCQkvKiBTeW1ib2wgdGFibGUgKi8KKyNkZWZpbmUgU0hUX1NUUlRBQgkgIDMJCS8qIFN0cmluZyB0YWJsZSAqLworI2RlZmluZSBTSFRfUkVMQQkgIDQJCS8qIFJlbG9jYXRpb24gZW50cmllcyB3aXRoIGFkZGVuZHMgKi8KKyNkZWZpbmUgU0hUX0hBU0gJICA1CQkvKiBTeW1ib2wgaGFzaCB0YWJsZSAqLworI2RlZmluZSBTSFRfRFlOQU1JQwkgIDYJCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBTSFRfTk9URQkgIDcJCS8qIE5vdGVzICovCisjZGVmaW5lIFNIVF9OT0JJVFMJICA4CQkvKiBQcm9ncmFtIHNwYWNlIHdpdGggbm8gZGF0YSAoYnNzKSAqLworI2RlZmluZSBTSFRfUkVMCQkgIDkJCS8qIFJlbG9jYXRpb24gZW50cmllcywgbm8gYWRkZW5kcyAqLworI2RlZmluZSBTSFRfU0hMSUIJICAxMAkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgU0hUX0RZTlNZTQkgIDExCQkvKiBEeW5hbWljIGxpbmtlciBzeW1ib2wgdGFibGUgKi8KKyNkZWZpbmUgU0hUX0lOSVRfQVJSQVkJICAxNAkJLyogQXJyYXkgb2YgY29uc3RydWN0b3JzICovCisjZGVmaW5lIFNIVF9GSU5JX0FSUkFZCSAgMTUJCS8qIEFycmF5IG9mIGRlc3RydWN0b3JzICovCisjZGVmaW5lIFNIVF9QUkVJTklUX0FSUkFZIDE2CQkvKiBBcnJheSBvZiBwcmUtY29uc3RydWN0b3JzICovCisjZGVmaW5lIFNIVF9HUk9VUAkgIDE3CQkvKiBTZWN0aW9uIGdyb3VwICovCisjZGVmaW5lIFNIVF9TWU1UQUJfU0hORFggIDE4CQkvKiBFeHRlbmRlZCBzZWN0aW9uIGluZGVjZXMgKi8KKyNkZWZpbmUJU0hUX05VTQkJICAxOQkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMuICAqLworI2RlZmluZSBTSFRfTE9PUwkgIDB4NjAwMDAwMDAJLyogU3RhcnQgT1Mtc3BlY2lmaWMuICAqLworI2RlZmluZSBTSFRfR05VX0hBU0gJICAweDZmZmZmZmY2CS8qIEdOVS1zdHlsZSBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV9MSUJMSVNUCSAgMHg2ZmZmZmZmNwkvKiBQcmVsaW5rIGxpYnJhcnkgbGlzdCAqLworI2RlZmluZSBTSFRfQ0hFQ0tTVU0JICAweDZmZmZmZmY4CS8qIENoZWNrc3VtIGZvciBEU08gY29udGVudC4gICovCisjZGVmaW5lIFNIVF9MT1NVTlcJICAweDZmZmZmZmZhCS8qIFN1bi1zcGVjaWZpYyBsb3cgYm91bmQuICAqLworI2RlZmluZSBTSFRfU1VOV19tb3ZlCSAgMHg2ZmZmZmZmYQorI2RlZmluZSBTSFRfU1VOV19DT01EQVQgICAweDZmZmZmZmZiCisjZGVmaW5lIFNIVF9TVU5XX3N5bWluZm8gIDB4NmZmZmZmZmMKKyNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJICAweDZmZmZmZmZkCS8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX0dOVV92ZXJuZWVkCSAgMHg2ZmZmZmZmZQkvKiBWZXJzaW9uIG5lZWRzIHNlY3Rpb24uICAqLworI2RlZmluZSBTSFRfR05VX3ZlcnN5bQkgIDB4NmZmZmZmZmYJLyogVmVyc2lvbiBzeW1ib2wgdGFibGUuICAqLworI2RlZmluZSBTSFRfSElTVU5XCSAgMHg2ZmZmZmZmZgkvKiBTdW4tc3BlY2lmaWMgaGlnaCBib3VuZC4gICovCisjZGVmaW5lIFNIVF9ISU9TCSAgMHg2ZmZmZmZmZgkvKiBFbmQgT1Mtc3BlY2lmaWMgdHlwZSAqLworI2RlZmluZSBTSFRfTE9QUk9DCSAgMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU0hUX0hJUFJPQwkgIDB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTSFRfTE9VU0VSCSAgMHg4MDAwMDAwMAkvKiBTdGFydCBvZiBhcHBsaWNhdGlvbi1zcGVjaWZpYyAqLworI2RlZmluZSBTSFRfSElVU0VSCSAgMHg4ZmZmZmZmZgkvKiBFbmQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyAoc2VjdGlvbiBmbGFncykuICAqLworCisjZGVmaW5lIFNIRl9XUklURQkgICAgICgxIDw8IDApCS8qIFdyaXRhYmxlICovCisjZGVmaW5lIFNIRl9BTExPQwkgICAgICgxIDw8IDEpCS8qIE9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgZXhlY3V0aW9uICovCisjZGVmaW5lIFNIRl9FWEVDSU5TVFIJICAgICAoMSA8PCAyKQkvKiBFeGVjdXRhYmxlICovCisjZGVmaW5lIFNIRl9NRVJHRQkgICAgICgxIDw8IDQpCS8qIE1pZ2h0IGJlIG1lcmdlZCAqLworI2RlZmluZSBTSEZfU1RSSU5HUwkgICAgICgxIDw8IDUpCS8qIENvbnRhaW5zIG51bC10ZXJtaW5hdGVkIHN0cmluZ3MgKi8KKyNkZWZpbmUgU0hGX0lORk9fTElOSwkgICAgICgxIDw8IDYpCS8qIGBzaF9pbmZvJyBjb250YWlucyBTSFQgaW5kZXggKi8KKyNkZWZpbmUgU0hGX0xJTktfT1JERVIJICAgICAoMSA8PCA3KQkvKiBQcmVzZXJ2ZSBvcmRlciBhZnRlciBjb21iaW5pbmcgKi8KKyNkZWZpbmUgU0hGX09TX05PTkNPTkZPUk1JTkcgKDEgPDwgOCkJLyogTm9uLXN0YW5kYXJkIE9TIHNwZWNpZmljIGhhbmRsaW5nCisJCQkJCSAgIHJlcXVpcmVkICovCisjZGVmaW5lIFNIRl9HUk9VUAkgICAgICgxIDw8IDkpCS8qIFNlY3Rpb24gaXMgbWVtYmVyIG9mIGEgZ3JvdXAuICAqLworI2RlZmluZSBTSEZfVExTCQkgICAgICgxIDw8IDEwKQkvKiBTZWN0aW9uIGhvbGQgdGhyZWFkLWxvY2FsIGRhdGEuICAqLworI2RlZmluZSBTSEZfTUFTS09TCSAgICAgMHgwZmYwMDAwMAkvKiBPUy1zcGVjaWZpYy4gICovCisjZGVmaW5lIFNIRl9NQVNLUFJPQwkgICAgIDB4ZjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIFNIRl9PUkRFUkVECSAgICAgKDEgPDwgMzApCS8qIFNwZWNpYWwgb3JkZXJpbmcgcmVxdWlyZW1lbnQKKwkJCQkJICAgKFNvbGFyaXMpLiAgKi8KKyNkZWZpbmUgU0hGX0VYQ0xVREUJICAgICAoMSA8PCAzMSkJLyogU2VjdGlvbiBpcyBleGNsdWRlZCB1bmxlc3MKKwkJCQkJICAgcmVmZXJlbmNlZCBvciBhbGxvY2F0ZWQgKFNvbGFyaXMpLiovCisKKy8qIFNlY3Rpb24gZ3JvdXAgaGFuZGxpbmcuICAqLworI2RlZmluZSBHUlBfQ09NREFUCTB4MQkJLyogTWFyayBncm91cCBhcyBDT01EQVQuICAqLworCisvKiBTeW1ib2wgdGFibGUgZW50cnkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgRWxmMzJfQWRkcglzdF92YWx1ZTsJCS8qIFN5bWJvbCB2YWx1ZSAqLworICBFbGYzMl9Xb3JkCXN0X3NpemU7CQkvKiBTeW1ib2wgc2l6ZSAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CQkvKiBTeW1ib2wgdHlwZSBhbmQgYmluZGluZyAqLworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogU3ltYm9sIHZpc2liaWxpdHkgKi8KKyAgRWxmMzJfU2VjdGlvbglzdF9zaG5keDsJCS8qIFNlY3Rpb24gaW5kZXggKi8KK30gRWxmMzJfU3ltOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSAoc3RyaW5nIHRibCBpbmRleCkgKi8KKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOwkJLyogU3ltYm9sIHR5cGUgYW5kIGJpbmRpbmcgKi8KKyAgdW5zaWduZWQgY2hhciBzdF9vdGhlcjsJCS8qIFN5bWJvbCB2aXNpYmlsaXR5ICovCisgIEVsZjY0X1NlY3Rpb24Jc3Rfc2huZHg7CQkvKiBTZWN0aW9uIGluZGV4ICovCisgIEVsZjY0X0FkZHIJc3RfdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUgKi8KKyAgRWxmNjRfWHdvcmQJc3Rfc2l6ZTsJCS8qIFN5bWJvbCBzaXplICovCit9IEVsZjY0X1N5bTsKKworLyogVGhlIHN5bWluZm8gc2VjdGlvbiBpZiBhdmFpbGFibGUgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAorICAgZXZlcnkgZHluYW1pYyBzeW1ib2wuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9IYWxmIHNpX2JvdW5kdG87CQkvKiBEaXJlY3QgYmluZGluZ3MsIHN5bWJvbCBib3VuZCB0byAqLworICBFbGYzMl9IYWxmIHNpX2ZsYWdzOwkJCS8qIFBlciBzeW1ib2wgZmxhZ3MgKi8KK30gRWxmMzJfU3ltaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfSGFsZiBzaV9ib3VuZHRvOwkJLyogRGlyZWN0IGJpbmRpbmdzLCBzeW1ib2wgYm91bmQgdG8gKi8KKyAgRWxmNjRfSGFsZiBzaV9mbGFnczsJCQkvKiBQZXIgc3ltYm9sIGZsYWdzICovCit9IEVsZjY0X1N5bWluZm87CisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lfYm91bmR0by4gICovCisjZGVmaW5lIFNZTUlORk9fQlRfU0VMRgkJMHhmZmZmCS8qIFN5bWJvbCBib3VuZCB0byBzZWxmICovCisjZGVmaW5lIFNZTUlORk9fQlRfUEFSRU5UCTB4ZmZmZQkvKiBTeW1ib2wgYm91bmQgdG8gcGFyZW50ICovCisjZGVmaW5lIFNZTUlORk9fQlRfTE9XUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMgKi8KKworLyogUG9zc2libGUgYml0bWFza3MgZm9yIHNpX2ZsYWdzLiAgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfRElSRUNUCTB4MDAwMQkvKiBEaXJlY3QgYm91bmQgc3ltYm9sICovCisjZGVmaW5lIFNZTUlORk9fRkxHX1BBU1NUSFJVCTB4MDAwMgkvKiBQYXNzLXRocnUgc3ltYm9sIGZvciB0cmFuc2xhdG9yICovCisjZGVmaW5lIFNZTUlORk9fRkxHX0NPUFkJMHgwMDA0CS8qIFN5bWJvbCBpcyBhIGNvcHktcmVsb2MgKi8KKyNkZWZpbmUgU1lNSU5GT19GTEdfTEFaWUxPQUQJMHgwMDA4CS8qIFN5bWJvbCBib3VuZCB0byBvYmplY3QgdG8gYmUgbGF6eQorCQkJCQkgICBsb2FkZWQgKi8KKy8qIFN5bWluZm8gdmVyc2lvbiB2YWx1ZXMuICAqLworI2RlZmluZSBTWU1JTkZPX05PTkUJCTAKKyNkZWZpbmUgU1lNSU5GT19DVVJSRU5UCQkxCisjZGVmaW5lIFNZTUlORk9fTlVNCQkyCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9pbmZvIGZpZWxkLiAgKi8KKworI2RlZmluZSBFTEYzMl9TVF9CSU5EKHZhbCkJCSgoKHVuc2lnbmVkIGNoYXIpICh2YWwpKSA+PiA0KQorI2RlZmluZSBFTEYzMl9TVF9UWVBFKHZhbCkJCSgodmFsKSAmIDB4ZikKKyNkZWZpbmUgRUxGMzJfU1RfSU5GTyhiaW5kLCB0eXBlKQkoKChiaW5kKSA8PCA0KSArICgodHlwZSkgJiAweGYpKQorCisvKiBCb3RoIEVsZjMyX1N5bSBhbmQgRWxmNjRfU3ltIHVzZSB0aGUgc2FtZSBvbmUtYnl0ZSBzdF9pbmZvIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUxGNjRfU1RfQklORCh2YWwpCQlFTEYzMl9TVF9CSU5EICh2YWwpCisjZGVmaW5lIEVMRjY0X1NUX1RZUEUodmFsKQkJRUxGMzJfU1RfVFlQRSAodmFsKQorI2RlZmluZSBFTEY2NF9TVF9JTkZPKGJpbmQsIHR5cGUpCUVMRjMyX1NUX0lORk8gKChiaW5kKSwgKHR5cGUpKQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX0JJTkQgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIGJpbmRpbmcpLiAgKi8KKworI2RlZmluZSBTVEJfTE9DQUwJMAkJLyogTG9jYWwgc3ltYm9sICovCisjZGVmaW5lIFNUQl9HTE9CQUwJMQkJLyogR2xvYmFsIHN5bWJvbCAqLworI2RlZmluZSBTVEJfV0VBSwkyCQkvKiBXZWFrIHN5bWJvbCAqLworI2RlZmluZQlTVEJfTlVNCQkzCQkvKiBOdW1iZXIgb2YgZGVmaW5lZCB0eXBlcy4gICovCisjZGVmaW5lIFNUQl9MT09TCTEwCQkvKiBTdGFydCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVEJfSElPUwkxMgkJLyogRW5kIG9mIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFNUQl9MT1BST0MJMTMJCS8qIFN0YXJ0IG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworI2RlZmluZSBTVEJfSElQUk9DCTE1CQkvKiBFbmQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfVFlQRSBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgdHlwZSkuICAqLworCisjZGVmaW5lIFNUVF9OT1RZUEUJMAkJLyogU3ltYm9sIHR5cGUgaXMgdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgU1RUX09CSkVDVAkxCQkvKiBTeW1ib2wgaXMgYSBkYXRhIG9iamVjdCAqLworI2RlZmluZSBTVFRfRlVOQwkyCQkvKiBTeW1ib2wgaXMgYSBjb2RlIG9iamVjdCAqLworI2RlZmluZSBTVFRfU0VDVElPTgkzCQkvKiBTeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiAqLworI2RlZmluZSBTVFRfRklMRQk0CQkvKiBTeW1ib2wncyBuYW1lIGlzIGZpbGUgbmFtZSAqLworI2RlZmluZSBTVFRfQ09NTU9OCTUJCS8qIFN5bWJvbCBpcyBhIGNvbW1vbiBkYXRhIG9iamVjdCAqLworI2RlZmluZSBTVFRfVExTCQk2CQkvKiBTeW1ib2wgaXMgdGhyZWFkLWxvY2FsIGRhdGEgb2JqZWN0Ki8KKyNkZWZpbmUJU1RUX05VTQkJNwkJLyogTnVtYmVyIG9mIGRlZmluZWQgdHlwZXMuICAqLworI2RlZmluZSBTVFRfTE9PUwkxMAkJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0hJT1MJMTIJCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBTVFRfTE9QUk9DCTEzCQkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgU1RUX0hJUFJPQwkxNQkJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworCisKKy8qIFN5bWJvbCB0YWJsZSBpbmRpY2VzIGFyZSBmb3VuZCBpbiB0aGUgaGFzaCBidWNrZXRzIGFuZCBjaGFpbiB0YWJsZQorICAgb2YgYSBzeW1ib2wgaGFzaCB0YWJsZSBzZWN0aW9uLiAgVGhpcyBzcGVjaWFsIGluZGV4IHZhbHVlIGluZGljYXRlcworICAgdGhlIGVuZCBvZiBhIGNoYWluLCBtZWFuaW5nIG5vIGZ1cnRoZXIgc3ltYm9scyBhcmUgZm91bmQgaW4gdGhhdCBidWNrZXQuICAqLworCisjZGVmaW5lIFNUTl9VTkRFRgkwCQkvKiBFbmQgb2YgYSBjaGFpbi4gICovCisKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSBzdF9vdGhlciBmaWVsZC4gICovCisKKyNkZWZpbmUgRUxGMzJfU1RfVklTSUJJTElUWShvKQkoKG8pICYgMHgwMykKKworLyogRm9yIEVMRjY0IHRoZSBkZWZpbml0aW9ucyBhcmUgdGhlIHNhbWUuICAqLworI2RlZmluZSBFTEY2NF9TVF9WSVNJQklMSVRZKG8pCUVMRjMyX1NUX1ZJU0lCSUxJVFkgKG8pCisKKy8qIFN5bWJvbCB2aXNpYmlsaXR5IHNwZWNpZmljYXRpb24gZW5jb2RlZCBpbiB0aGUgc3Rfb3RoZXIgZmllbGQuICAqLworI2RlZmluZSBTVFZfREVGQVVMVAkwCQkvKiBEZWZhdWx0IHN5bWJvbCB2aXNpYmlsaXR5IHJ1bGVzICovCisjZGVmaW5lIFNUVl9JTlRFUk5BTAkxCQkvKiBQcm9jZXNzb3Igc3BlY2lmaWMgaGlkZGVuIGNsYXNzICovCisjZGVmaW5lIFNUVl9ISURERU4JMgkJLyogU3ltIHVuYXZhaWxhYmxlIGluIG90aGVyIG1vZHVsZXMgKi8KKyNkZWZpbmUgU1RWX1BST1RFQ1RFRAkzCQkvKiBOb3QgcHJlZW1wdGlibGUsIG5vdCBleHBvcnRlZCAqLworCisKKy8qIFJlbG9jYXRpb24gdGFibGUgZW50cnkgd2l0aG91dCBhZGRlbmQgKGluIHNlY3Rpb24gb2YgdHlwZSBTSFRfUkVMKS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCit9IEVsZjMyX1JlbDsKKworLyogSSBoYXZlIHNlZW4gdHdvIGRpZmZlcmVudCBkZWZpbml0aW9ucyBvZiB0aGUgRWxmNjRfUmVsIGFuZAorICAgRWxmNjRfUmVsYSBzdHJ1Y3R1cmVzLCBzbyB3ZSdsbCBsZWF2ZSB0aGVtIG91dCB1bnRpbCBOb3ZlbGwgKG9yCisgICB3aG9ldmVyKSBnZXRzIHRoZWlyIGFjdCB0b2dldGhlci4gICovCisvKiBUaGUgZm9sbG93aW5nLCBhdCBsZWFzdCwgaXMgdXNlZCBvbiBTcGFyYyB2OSwgTUlQUywgYW5kIEFscGhhLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfQWRkcglyX29mZnNldDsJCS8qIEFkZHJlc3MgKi8KKyAgRWxmNjRfWHdvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCit9IEVsZjY0X1JlbDsKKworLyogUmVsb2NhdGlvbiB0YWJsZSBlbnRyeSB3aXRoIGFkZGVuZCAoaW4gc2VjdGlvbiBvZiB0eXBlIFNIVF9SRUxBKS4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcl9pbmZvOwkJCS8qIFJlbG9jYXRpb24gdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCisgIEVsZjMyX1N3b3JkCXJfYWRkZW5kOwkJLyogQWRkZW5kICovCit9IEVsZjMyX1JlbGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X0FkZHIJcl9vZmZzZXQ7CQkvKiBBZGRyZXNzICovCisgIEVsZjY0X1h3b3JkCXJfaW5mbzsJCQkvKiBSZWxvY2F0aW9uIHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworICBFbGY2NF9TeHdvcmQJcl9hZGRlbmQ7CQkvKiBBZGRlbmQgKi8KK30gRWxmNjRfUmVsYTsKKworLyogSG93IHRvIGV4dHJhY3QgYW5kIGluc2VydCBpbmZvcm1hdGlvbiBoZWxkIGluIHRoZSByX2luZm8gZmllbGQuICAqLworCisjZGVmaW5lIEVMRjMyX1JfU1lNKHZhbCkJCSgodmFsKSA+PiA4KQorI2RlZmluZSBFTEYzMl9SX1RZUEUodmFsKQkJKCh2YWwpICYgMHhmZikKKyNkZWZpbmUgRUxGMzJfUl9JTkZPKHN5bSwgdHlwZSkJCSgoKHN5bSkgPDwgOCkgKyAoKHR5cGUpICYgMHhmZikpCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCQkoKGkpID4+IDMyKQorI2RlZmluZSBFTEY2NF9SX1RZUEUoaSkJCQkoKGkpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgRUxGNjRfUl9JTkZPKHN5bSx0eXBlKQkJKCgoKEVsZjY0X1h3b3JkKSAoc3ltKSkgPDwgMzIpICsgKHR5cGUpKQorCisvKiBQcm9ncmFtIHNlZ21lbnQgaGVhZGVyLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZAlwX3R5cGU7CQkJLyogU2VnbWVudCB0eXBlICovCisgIEVsZjMyX09mZglwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgRWxmMzJfQWRkcglwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmMzJfQWRkcglwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIEVsZjMyX1dvcmQJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICBFbGYzMl9Xb3JkCXBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCisgIEVsZjMyX1dvcmQJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgRWxmMzJfV29yZAlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQgKi8KK30gRWxmMzJfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAlwX3R5cGU7CQkJLyogU2VnbWVudCB0eXBlICovCisgIEVsZjY0X1dvcmQJcF9mbGFnczsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgRWxmNjRfT2ZmCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLworICBFbGY2NF9BZGRyCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGY2NF9BZGRyCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgRWxmNjRfWHdvcmQJcF9maWxlc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLworICBFbGY2NF9Yd29yZAlwX21lbXN6OwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLworICBFbGY2NF9Yd29yZAlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQgKi8KK30gRWxmNjRfUGhkcjsKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgKHNlZ21lbnQgdHlwZSkuICAqLworCisjZGVmaW5lCVBUX05VTEwJCTAJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHVudXNlZCAqLworI2RlZmluZSBQVF9MT0FECQkxCQkvKiBMb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfRFlOQU1JQwkyCQkvKiBEeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfSU5URVJQCTMJCS8qIFByb2dyYW0gaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgUFRfTk9URQkJNAkJLyogQXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBUX1NITElCCTUJCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFBUX1BIRFIJCTYJCS8qIEVudHJ5IGZvciBoZWFkZXIgdGFibGUgaXRzZWxmICovCisjZGVmaW5lIFBUX1RMUwkJNwkJLyogVGhyZWFkLWxvY2FsIHN0b3JhZ2Ugc2VnbWVudCAqLworI2RlZmluZQlQVF9OVU0JCTgJCS8qIE51bWJlciBvZiBkZWZpbmVkIHR5cGVzICovCisjZGVmaW5lIFBUX0xPT1MJCTB4NjAwMDAwMDAJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfR05VX0VIX0ZSQU1FCTB4NjQ3NGU1NTAJLyogR0NDIC5laF9mcmFtZV9oZHIgc2VnbWVudCAqLworI2RlZmluZSBQVF9HTlVfU1RBQ0sJMHg2NDc0ZTU1MQkvKiBJbmRpY2F0ZXMgc3RhY2sgZXhlY3V0YWJpbGl0eSAqLworI2RlZmluZSBQVF9HTlVfUkVMUk8JMHg2NDc0ZTU1MgkvKiBSZWFkLW9ubHkgYWZ0ZXIgcmVsb2NhdGlvbiAqLworI2RlZmluZSBQVF9MT1NVTlcJMHg2ZmZmZmZmYQorI2RlZmluZSBQVF9TVU5XQlNTCTB4NmZmZmZmZmEJLyogU3VuIFNwZWNpZmljIHNlZ21lbnQgKi8KKyNkZWZpbmUgUFRfU1VOV1NUQUNLCTB4NmZmZmZmZmIJLyogU3RhY2sgc2VnbWVudCAqLworI2RlZmluZSBQVF9ISVNVTlcJMHg2ZmZmZmZmZgorI2RlZmluZSBQVF9ISU9TCQkweDZmZmZmZmZmCS8qIEVuZCBvZiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUgUFRfSElQUk9DCTB4N2ZmZmZmZmYJLyogRW5kIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfZmxhZ3MgKHNlZ21lbnQgZmxhZ3MpLiAgKi8KKworI2RlZmluZSBQRl9YCQkoMSA8PCAwKQkvKiBTZWdtZW50IGlzIGV4ZWN1dGFibGUgKi8KKyNkZWZpbmUgUEZfVwkJKDEgPDwgMSkJLyogU2VnbWVudCBpcyB3cml0YWJsZSAqLworI2RlZmluZSBQRl9SCQkoMSA8PCAyKQkvKiBTZWdtZW50IGlzIHJlYWRhYmxlICovCisjZGVmaW5lIFBGX01BU0tPUwkweDBmZjAwMDAwCS8qIE9TLXNwZWNpZmljICovCisjZGVmaW5lIFBGX01BU0tQUk9DCTB4ZjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIGNvcmUgZmlsZXMuICovCisKKyNkZWZpbmUgTlRfUFJTVEFUVVMJMQkJLyogQ29udGFpbnMgY29weSBvZiBwcnN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfRlBSRUdTRVQJMgkJLyogQ29udGFpbnMgY29weSBvZiBmcHJlZ3NldCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJQU0lORk8JMwkJLyogQ29udGFpbnMgY29weSBvZiBwcnBzaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJYUkVHCTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgcHJ4cmVnc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9UQVNLU1RSVUNUCTQJCS8qIENvbnRhaW5zIGNvcHkgb2YgdGFzayBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTlRfUExBVEZPUk0JNQkJLyogU3RyaW5nIGZyb20gc3lzaW5mbyhTSV9QTEFURk9STSkgKi8KKyNkZWZpbmUgTlRfQVVYVgkJNgkJLyogQ29udGFpbnMgY29weSBvZiBhdXh2IGFycmF5ICovCisjZGVmaW5lIE5UX0dXSU5ET1dTCTcJCS8qIENvbnRhaW5zIGNvcHkgb2YgZ3dpbmRvd3Mgc3RydWN0ICovCisjZGVmaW5lIE5UX0FTUlMJCTgJCS8qIENvbnRhaW5zIGNvcHkgb2YgYXNyc2V0IHN0cnVjdCAqLworI2RlZmluZSBOVF9QU1RBVFVTCTEwCQkvKiBDb250YWlucyBjb3B5IG9mIHBzdGF0dXMgc3RydWN0ICovCisjZGVmaW5lIE5UX1BTSU5GTwkxMwkJLyogQ29udGFpbnMgY29weSBvZiBwc2luZm8gc3RydWN0ICovCisjZGVmaW5lIE5UX1BSQ1JFRAkxNAkJLyogQ29udGFpbnMgY29weSBvZiBwcmNyZWQgc3RydWN0ICovCisjZGVmaW5lIE5UX1VUU05BTUUJMTUJCS8qIENvbnRhaW5zIGNvcHkgb2YgdXRzbmFtZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfTFdQU1RBVFVTCTE2CQkvKiBDb250YWlucyBjb3B5IG9mIGx3cHN0YXR1cyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfTFdQU0lORk8JMTcJCS8qIENvbnRhaW5zIGNvcHkgb2YgbHdwaW5mbyBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJGUFhSRUcJMjAJCS8qIENvbnRhaW5zIGNvcHkgb2YgZnByeHJlZ3NldCBzdHJ1Y3QgKi8KKyNkZWZpbmUgTlRfUFJYRlBSRUcJMHg0NmU2MmI3ZgkvKiBDb250YWlucyBjb3B5IG9mIHVzZXJfZnhzcl9zdHJ1Y3QgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciB0aGUgbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCisKKyNkZWZpbmUgTlRfVkVSU0lPTgkxCQkvKiBDb250YWlucyBhIHZlcnNpb24gc3RyaW5nLiAgKi8KKworCisvKiBEeW5hbWljIHNlY3Rpb24gZW50cnkuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Td29yZAlkX3RhZzsJCQkvKiBEeW5hbWljIGVudHJ5IHR5cGUgKi8KKyAgdW5pb24KKyAgICB7CisgICAgICBFbGYzMl9Xb3JkIGRfdmFsOwkJCS8qIEludGVnZXIgdmFsdWUgKi8KKyAgICAgIEVsZjMyX0FkZHIgZF9wdHI7CQkJLyogQWRkcmVzcyB2YWx1ZSAqLworICAgIH0gZF91bjsKK30gRWxmMzJfRHluOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9TeHdvcmQJZF90YWc7CQkJLyogRHluYW1pYyBlbnRyeSB0eXBlICovCisgIHVuaW9uCisgICAgeworICAgICAgRWxmNjRfWHdvcmQgZF92YWw7CQkvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgICBFbGY2NF9BZGRyIGRfcHRyOwkJCS8qIEFkZHJlc3MgdmFsdWUgKi8KKyAgICB9IGRfdW47Cit9IEVsZjY0X0R5bjsKKworLyogTGVnYWwgdmFsdWVzIGZvciBkX3RhZyAoZHluYW1pYyBlbnRyeSB0eXBlKS4gICovCisKKyNkZWZpbmUgRFRfTlVMTAkJMAkJLyogTWFya3MgZW5kIG9mIGR5bmFtaWMgc2VjdGlvbiAqLworI2RlZmluZSBEVF9ORUVERUQJMQkJLyogTmFtZSBvZiBuZWVkZWQgbGlicmFyeSAqLworI2RlZmluZSBEVF9QTFRSRUxTWgkyCQkvKiBTaXplIGluIGJ5dGVzIG9mIFBMVCByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUExUR09UCTMJCS8qIFByb2Nlc3NvciBkZWZpbmVkIHZhbHVlICovCisjZGVmaW5lIERUX0hBU0gJCTQJCS8qIEFkZHJlc3Mgb2Ygc3ltYm9sIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgRFRfU1RSVEFCCTUJCS8qIEFkZHJlc3Mgb2Ygc3RyaW5nIHRhYmxlICovCisjZGVmaW5lIERUX1NZTVRBQgk2CQkvKiBBZGRyZXNzIG9mIHN5bWJvbCB0YWJsZSAqLworI2RlZmluZSBEVF9SRUxBCQk3CQkvKiBBZGRyZXNzIG9mIFJlbGEgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEFTWgk4CQkvKiBUb3RhbCBzaXplIG9mIFJlbGEgcmVsb2NzICovCisjZGVmaW5lIERUX1JFTEFFTlQJOQkJLyogU2l6ZSBvZiBvbmUgUmVsYSByZWxvYyAqLworI2RlZmluZSBEVF9TVFJTWgkxMAkJLyogU2l6ZSBvZiBzdHJpbmcgdGFibGUgKi8KKyNkZWZpbmUgRFRfU1lNRU5UCTExCQkvKiBTaXplIG9mIG9uZSBzeW1ib2wgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgRFRfSU5JVAkJMTIJCS8qIEFkZHJlc3Mgb2YgaW5pdCBmdW5jdGlvbiAqLworI2RlZmluZSBEVF9GSU5JCQkxMwkJLyogQWRkcmVzcyBvZiB0ZXJtaW5hdGlvbiBmdW5jdGlvbiAqLworI2RlZmluZSBEVF9TT05BTUUJMTQJCS8qIE5hbWUgb2Ygc2hhcmVkIG9iamVjdCAqLworI2RlZmluZSBEVF9SUEFUSAkxNQkJLyogTGlicmFyeSBzZWFyY2ggcGF0aCAoZGVwcmVjYXRlZCkgKi8KKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYJCS8qIFN0YXJ0IHN5bWJvbCBzZWFyY2ggaGVyZSAqLworI2RlZmluZSBEVF9SRUwJCTE3CQkvKiBBZGRyZXNzIG9mIFJlbCByZWxvY3MgKi8KKyNkZWZpbmUgRFRfUkVMU1oJMTgJCS8qIFRvdGFsIHNpemUgb2YgUmVsIHJlbG9jcyAqLworI2RlZmluZSBEVF9SRUxFTlQJMTkJCS8qIFNpemUgb2Ygb25lIFJlbCByZWxvYyAqLworI2RlZmluZSBEVF9QTFRSRUwJMjAJCS8qIFR5cGUgb2YgcmVsb2MgaW4gUExUICovCisjZGVmaW5lIERUX0RFQlVHCTIxCQkvKiBGb3IgZGVidWdnaW5nOyB1bnNwZWNpZmllZCAqLworI2RlZmluZSBEVF9URVhUUkVMCTIyCQkvKiBSZWxvYyBtaWdodCBtb2RpZnkgLnRleHQgKi8KKyNkZWZpbmUgRFRfSk1QUkVMCTIzCQkvKiBBZGRyZXNzIG9mIFBMVCByZWxvY3MgKi8KKyNkZWZpbmUJRFRfQklORF9OT1cJMjQJCS8qIFByb2Nlc3MgcmVsb2NhdGlvbnMgb2Ygb2JqZWN0ICovCisjZGVmaW5lCURUX0lOSVRfQVJSQVkJMjUJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIGluaXQgZmN0ICovCisjZGVmaW5lCURUX0ZJTklfQVJSQVkJMjYJCS8qIEFycmF5IHdpdGggYWRkcmVzc2VzIG9mIGZpbmkgZmN0ICovCisjZGVmaW5lCURUX0lOSVRfQVJSQVlTWgkyNwkJLyogU2l6ZSBpbiBieXRlcyBvZiBEVF9JTklUX0FSUkFZICovCisjZGVmaW5lCURUX0ZJTklfQVJSQVlTWgkyOAkJLyogU2l6ZSBpbiBieXRlcyBvZiBEVF9GSU5JX0FSUkFZICovCisjZGVmaW5lIERUX1JVTlBBVEgJMjkJCS8qIExpYnJhcnkgc2VhcmNoIHBhdGggKi8KKyNkZWZpbmUgRFRfRkxBR1MJMzAJCS8qIEZsYWdzIGZvciB0aGUgb2JqZWN0IGJlaW5nIGxvYWRlZCAqLworI2RlZmluZSBEVF9FTkNPRElORwkzMgkJLyogU3RhcnQgb2YgZW5jb2RlZCByYW5nZSAqLworI2RlZmluZSBEVF9QUkVJTklUX0FSUkFZIDMyCQkvKiBBcnJheSB3aXRoIGFkZHJlc3NlcyBvZiBwcmVpbml0IGZjdCovCisjZGVmaW5lIERUX1BSRUlOSVRfQVJSQVlTWiAzMwkJLyogc2l6ZSBpbiBieXRlcyBvZiBEVF9QUkVJTklUX0FSUkFZICovCisjZGVmaW5lCURUX05VTQkJMzQJCS8qIE51bWJlciB1c2VkICovCisjZGVmaW5lIERUX0xPT1MJCTB4NjAwMDAwMGQJLyogU3RhcnQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfSElPUwkJMHg2ZmZmZjAwMAkvKiBFbmQgb2YgT1Mtc3BlY2lmaWMgKi8KKyNkZWZpbmUgRFRfTE9QUk9DCTB4NzAwMDAwMDAJLyogU3RhcnQgb2YgcHJvY2Vzc29yLXNwZWNpZmljICovCisjZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCS8qIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMgKi8KKyNkZWZpbmUJRFRfUFJPQ05VTQlEVF9NSVBTX05VTQkvKiBNb3N0IHVzZWQgYnkgYW55IHByb2Nlc3NvciAqLworCisvKiBEVF8qIGVudHJpZXMgd2hpY2ggZmFsbCBiZXR3ZWVuIERUX1ZBTFJOR0hJICYgRFRfVkFMUk5HTE8gdXNlIHRoZQorICAgRHluLmRfdW4uZF92YWwgZmllbGQgb2YgdGhlIEVsZipfRHluIHN0cnVjdHVyZS4gIFRoaXMgZm9sbG93cyBTdW4ncworICAgYXBwcm9hY2guICAqLworI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCisjZGVmaW5lIERUX0dOVV9QUkVMSU5LRUQgMHg2ZmZmZmRmNQkvKiBQcmVsaW5raW5nIHRpbWVzdGFtcCAqLworI2RlZmluZSBEVF9HTlVfQ09ORkxJQ1RTWiAweDZmZmZmZGY2CS8qIFNpemUgb2YgY29uZmxpY3Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9HTlVfTElCTElTVFNaIDB4NmZmZmZkZjcJLyogU2l6ZSBvZiBsaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ0hFQ0tTVU0JMHg2ZmZmZmRmOAorI2RlZmluZSBEVF9QTFRQQURTWgkweDZmZmZmZGY5CisjZGVmaW5lIERUX01PVkVFTlQJMHg2ZmZmZmRmYQorI2RlZmluZSBEVF9NT1ZFU1oJMHg2ZmZmZmRmYgorI2RlZmluZSBEVF9GRUFUVVJFXzEJMHg2ZmZmZmRmYwkvKiBGZWF0dXJlIHNlbGVjdGlvbiAoRFRGXyopLiAgKi8KKyNkZWZpbmUgRFRfUE9TRkxBR18xCTB4NmZmZmZkZmQJLyogRmxhZ3MgZm9yIERUXyogZW50cmllcywgZWZmZWN0aW5nCisJCQkJCSAgIHRoZSBmb2xsb3dpbmcgRFRfKiBlbnRyeS4gICovCisjZGVmaW5lIERUX1NZTUlOU1oJMHg2ZmZmZmRmZQkvKiBTaXplIG9mIHN5bWluZm8gdGFibGUgKGluIGJ5dGVzKSAqLworI2RlZmluZSBEVF9TWU1JTkVOVAkweDZmZmZmZGZmCS8qIEVudHJ5IHNpemUgb2Ygc3ltaW5mbyAqLworI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCisjZGVmaW5lIERUX1ZBTFRBR0lEWCh0YWcpCShEVF9WQUxSTkdISSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WQUxOVU0gMTIKKworLyogRFRfKiBlbnRyaWVzIHdoaWNoIGZhbGwgYmV0d2VlbiBEVF9BRERSUk5HSEkgJiBEVF9BRERSUk5HTE8gdXNlIHRoZQorICAgRHluLmRfdW4uZF9wdHIgZmllbGQgb2YgdGhlIEVsZipfRHluIHN0cnVjdHVyZS4KKworICAgSWYgYW55IGFkanVzdG1lbnQgaXMgbWFkZSB0byB0aGUgRUxGIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbgorICAgYnVpbHQgdGhlc2UgZW50cmllcyB3aWxsIG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLworI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAorI2RlZmluZSBEVF9HTlVfSEFTSAkweDZmZmZmZWY1CS8qIEdOVS1zdHlsZSBoYXNoIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfVExTREVTQ19QTFQJMHg2ZmZmZmVmNgorI2RlZmluZSBEVF9UTFNERVNDX0dPVAkweDZmZmZmZWY3CisjZGVmaW5lIERUX0dOVV9DT05GTElDVAkweDZmZmZmZWY4CS8qIFN0YXJ0IG9mIGNvbmZsaWN0IHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfR05VX0xJQkxJU1QJMHg2ZmZmZmVmOQkvKiBMaWJyYXJ5IGxpc3QgKi8KKyNkZWZpbmUgRFRfQ09ORklHCTB4NmZmZmZlZmEJLyogQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gICovCisjZGVmaW5lIERUX0RFUEFVRElUCTB4NmZmZmZlZmIJLyogRGVwZW5kZW5jeSBhdWRpdGluZy4gICovCisjZGVmaW5lIERUX0FVRElUCTB4NmZmZmZlZmMJLyogT2JqZWN0IGF1ZGl0aW5nLiAgKi8KKyNkZWZpbmUJRFRfUExUUEFECTB4NmZmZmZlZmQJLyogUExUIHBhZGRpbmcuICAqLworI2RlZmluZQlEVF9NT1ZFVEFCCTB4NmZmZmZlZmUJLyogTW92ZSB0YWJsZS4gICovCisjZGVmaW5lIERUX1NZTUlORk8JMHg2ZmZmZmVmZgkvKiBTeW1pbmZvIHRhYmxlLiAgKi8KKyNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKKyNkZWZpbmUgRFRfQUREUlRBR0lEWCh0YWcpCShEVF9BRERSUk5HSEkgLSAodGFnKSkJLyogUmV2ZXJzZSBvcmRlciEgKi8KKyNkZWZpbmUgRFRfQUREUk5VTSAxMQorCisvKiBUaGUgdmVyc2lvbmluZyBlbnRyeSB0eXBlcy4gIFRoZSBuZXh0IGFyZSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlCisgICBHTlUgZXh0ZW5zaW9uLiAgKi8KKyNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKKworI2RlZmluZSBEVF9SRUxBQ09VTlQJMHg2ZmZmZmZmOQorI2RlZmluZSBEVF9SRUxDT1VOVAkweDZmZmZmZmZhCisKKy8qIFRoZXNlIHdlcmUgY2hvc2VuIGJ5IFN1bi4gICovCisjZGVmaW5lIERUX0ZMQUdTXzEJMHg2ZmZmZmZmYgkvKiBTdGF0ZSBmbGFncywgc2VlIERGXzFfKiBiZWxvdy4gICovCisjZGVmaW5lCURUX1ZFUkRFRgkweDZmZmZmZmZjCS8qIEFkZHJlc3Mgb2YgdmVyc2lvbiBkZWZpbml0aW9uCisJCQkJCSAgIHRhYmxlICovCisjZGVmaW5lCURUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCS8qIE51bWJlciBvZiB2ZXJzaW9uIGRlZmluaXRpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUQJMHg2ZmZmZmZmZQkvKiBBZGRyZXNzIG9mIHRhYmxlIHdpdGggbmVlZGVkCisJCQkJCSAgIHZlcnNpb25zICovCisjZGVmaW5lCURUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgkvKiBOdW1iZXIgb2YgbmVlZGVkIHZlcnNpb25zICovCisjZGVmaW5lIERUX1ZFUlNJT05UQUdJRFgodGFnKQkoRFRfVkVSTkVFRE5VTSAtICh0YWcpKQkvKiBSZXZlcnNlIG9yZGVyISAqLworI2RlZmluZSBEVF9WRVJTSU9OVEFHTlVNIDE2CisKKy8qIFN1biBhZGRlZCB0aGVzZSBtYWNoaW5lLWluZGVwZW5kZW50IGV4dGVuc2lvbnMgaW4gdGhlICJwcm9jZXNzb3Itc3BlY2lmaWMiCisgICByYW5nZS4gIEJlIGNvbXBhdGlibGUuICAqLworI2RlZmluZSBEVF9BVVhJTElBUlkgICAgMHg3ZmZmZmZmZCAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gbG9hZCBiZWZvcmUgc2VsZiAqLworI2RlZmluZSBEVF9GSUxURVIgICAgICAgMHg3ZmZmZmZmZiAgICAgIC8qIFNoYXJlZCBvYmplY3QgdG8gZ2V0IHZhbHVlcyBmcm9tICovCisjZGVmaW5lIERUX0VYVFJBVEFHSURYKHRhZykJKChFbGYzMl9Xb3JkKS0oKEVsZjMyX1N3b3JkKSAodGFnKSA8PDE+PjEpLTEpCisjZGVmaW5lIERUX0VYVFJBTlVNCTMKKworLyogVmFsdWVzIG9mIGBkX3VuLmRfdmFsJyBpbiB0aGUgRFRfRkxBR1MgZW50cnkuICAqLworI2RlZmluZSBERl9PUklHSU4JMHgwMDAwMDAwMQkvKiBPYmplY3QgbWF5IHVzZSBERl9PUklHSU4gKi8KKyNkZWZpbmUgREZfU1lNQk9MSUMJMHgwMDAwMDAwMgkvKiBTeW1ib2wgcmVzb2x1dGlvbnMgc3RhcnRzIGhlcmUgKi8KKyNkZWZpbmUgREZfVEVYVFJFTAkweDAwMDAwMDA0CS8qIE9iamVjdCBjb250YWlucyB0ZXh0IHJlbG9jYXRpb25zICovCisjZGVmaW5lIERGX0JJTkRfTk9XCTB4MDAwMDAwMDgJLyogTm8gbGF6eSBiaW5kaW5nIGZvciB0aGlzIG9iamVjdCAqLworI2RlZmluZSBERl9TVEFUSUNfVExTCTB4MDAwMDAwMTAJLyogTW9kdWxlIHVzZXMgdGhlIHN0YXRpYyBUTFMgbW9kZWwgKi8KKworLyogU3RhdGUgZmxhZ3Mgc2VsZWN0YWJsZSBpbiB0aGUgYGRfdW4uZF92YWwnIGVsZW1lbnQgb2YgdGhlIERUX0ZMQUdTXzEKKyAgIGVudHJ5IGluIHRoZSBkeW5hbWljIHNlY3Rpb24uICAqLworI2RlZmluZSBERl8xX05PVwkweDAwMDAwMDAxCS8qIFNldCBSVExEX05PVyBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX0dMT0JBTAkweDAwMDAwMDAyCS8qIFNldCBSVExEX0dMT0JBTCBmb3IgdGhpcyBvYmplY3QuICAqLworI2RlZmluZSBERl8xX0dST1VQCTB4MDAwMDAwMDQJLyogU2V0IFJUTERfR1JPVVAgZm9yIHRoaXMgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfMV9OT0RFTEVURQkweDAwMDAwMDA4CS8qIFNldCBSVExEX05PREVMRVRFIGZvciB0aGlzIG9iamVjdC4qLworI2RlZmluZSBERl8xX0xPQURGTFRSCTB4MDAwMDAwMTAJLyogVHJpZ2dlciBmaWx0ZWUgbG9hZGluZyBhdCBydW50aW1lLiovCisjZGVmaW5lIERGXzFfSU5JVEZJUlNUCTB4MDAwMDAwMjAJLyogU2V0IFJUTERfSU5JVEZJUlNUIGZvciB0aGlzIG9iamVjdCovCisjZGVmaW5lIERGXzFfTk9PUEVOCTB4MDAwMDAwNDAJLyogU2V0IFJUTERfTk9PUEVOIGZvciB0aGlzIG9iamVjdC4gICovCisjZGVmaW5lIERGXzFfT1JJR0lOCTB4MDAwMDAwODAJLyogJE9SSUdJTiBtdXN0IGJlIGhhbmRsZWQuICAqLworI2RlZmluZSBERl8xX0RJUkVDVAkweDAwMDAwMTAwCS8qIERpcmVjdCBiaW5kaW5nIGVuYWJsZWQuICAqLworI2RlZmluZSBERl8xX1RSQU5TCTB4MDAwMDAyMDAKKyNkZWZpbmUgREZfMV9JTlRFUlBPU0UJMHgwMDAwMDQwMAkvKiBPYmplY3QgaXMgdXNlZCB0byBpbnRlcnBvc2UuICAqLworI2RlZmluZSBERl8xX05PREVGTElCCTB4MDAwMDA4MDAJLyogSWdub3JlIGRlZmF1bHQgbGliIHNlYXJjaCBwYXRoLiAgKi8KKyNkZWZpbmUgREZfMV9OT0RVTVAJMHgwMDAwMTAwMAkvKiBPYmplY3QgY2FuJ3QgYmUgZGxkdW1wJ2VkLiAgKi8KKyNkZWZpbmUgREZfMV9DT05GQUxUCTB4MDAwMDIwMDAJLyogQ29uZmlndXJhdGlvbiBhbHRlcm5hdGl2ZSBjcmVhdGVkLiovCisjZGVmaW5lIERGXzFfRU5ERklMVEVFCTB4MDAwMDQwMDAJLyogRmlsdGVlIHRlcm1pbmF0ZXMgZmlsdGVycyBzZWFyY2guICovCisjZGVmaW5lCURGXzFfRElTUFJFTERORQkweDAwMDA4MDAwCS8qIERpc3AgcmVsb2MgYXBwbGllZCBhdCBidWlsZCB0aW1lLiAqLworI2RlZmluZQlERl8xX0RJU1BSRUxQTkQJMHgwMDAxMDAwMAkvKiBEaXNwIHJlbG9jIGFwcGxpZWQgYXQgcnVuLXRpbWUuICAqLworCisvKiBGbGFncyBmb3IgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIGluIERUX0ZFQVRVUkVfMS4gICovCisjZGVmaW5lIERURl8xX1BBUklOSVQJMHgwMDAwMDAwMQorI2RlZmluZSBEVEZfMV9DT05GRVhQCTB4MDAwMDAwMDIKKworLyogRmxhZ3MgaW4gdGhlIERUX1BPU0ZMQUdfMSBlbnRyeSBlZmZlY3Rpbmcgb25seSB0aGUgbmV4dCBEVF8qIGVudHJ5LiAgKi8KKyNkZWZpbmUgREZfUDFfTEFaWUxPQUQJMHgwMDAwMDAwMQkvKiBMYXp5bG9hZCBmb2xsb3dpbmcgb2JqZWN0LiAgKi8KKyNkZWZpbmUgREZfUDFfR1JPVVBQRVJNCTB4MDAwMDAwMDIJLyogU3ltYm9scyBmcm9tIG5leHQgb2JqZWN0IGFyZSBub3QKKwkJCQkJICAgZ2VuZXJhbGx5IGF2YWlsYWJsZS4gICovCisKKy8qIFZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9ucy4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX0hhbGYJdmRfdmVyc2lvbjsJCS8qIFZlcnNpb24gcmV2aXNpb24gKi8KKyAgRWxmMzJfSGFsZgl2ZF9mbGFnczsJCS8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgRWxmMzJfSGFsZgl2ZF9uZHg7CQkJLyogVmVyc2lvbiBJbmRleCAqLworICBFbGYzMl9IYWxmCXZkX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGYzMl9Xb3JkCXZkX2hhc2g7CQkvKiBWZXJzaW9uIG5hbWUgaGFzaCB2YWx1ZSAqLworICBFbGYzMl9Xb3JkCXZkX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVyZGF1eCBhcnJheSAqLworICBFbGYzMl9Xb3JkCXZkX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJkZWYKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmMzJfVmVyZGVmOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9IYWxmCXZkX3ZlcnNpb247CQkvKiBWZXJzaW9uIHJldmlzaW9uICovCisgIEVsZjY0X0hhbGYJdmRfZmxhZ3M7CQkvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisgIEVsZjY0X0hhbGYJdmRfbmR4OwkJCS8qIFZlcnNpb24gSW5kZXggKi8KKyAgRWxmNjRfSGFsZgl2ZF9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KKyAgRWxmNjRfV29yZAl2ZF9oYXNoOwkJLyogVmVyc2lvbiBuYW1lIGhhc2ggdmFsdWUgKi8KKyAgRWxmNjRfV29yZAl2ZF9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcmRhdXggYXJyYXkgKi8KKyAgRWxmNjRfV29yZAl2ZF9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGVmCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1ZlcmRlZjsKKworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZkX3ZlcnNpb24gKHZlcnNpb24gcmV2aXNpb24pLiAgKi8KKyNkZWZpbmUgVkVSX0RFRl9OT05FCTAJCS8qIE5vIHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX0RFRl9DVVJSRU5UCTEJCS8qIEN1cnJlbnQgdmVyc2lvbiAqLworI2RlZmluZSBWRVJfREVGX05VTQkyCQkvKiBHaXZlbiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHZkX2ZsYWdzICh2ZXJzaW9uIGluZm9ybWF0aW9uIGZsYWdzKS4gICovCisjZGVmaW5lIFZFUl9GTEdfQkFTRQkweDEJCS8qIFZlcnNpb24gZGVmaW5pdGlvbiBvZiBmaWxlIGl0c2VsZiAqLworI2RlZmluZSBWRVJfRkxHX1dFQUsJMHgyCQkvKiBXZWFrIHZlcnNpb24gaWRlbnRpZmllciAqLworCisvKiBWZXJzeW0gc3ltYm9sIGluZGV4IHZhbHVlcy4gICovCisjZGVmaW5lCVZFUl9ORFhfTE9DQUwJCTAJLyogU3ltYm9sIGlzIGxvY2FsLiAgKi8KKyNkZWZpbmUJVkVSX05EWF9HTE9CQUwJCTEJLyogU3ltYm9sIGlzIGdsb2JhbC4gICovCisjZGVmaW5lCVZFUl9ORFhfTE9SRVNFUlZFCTB4ZmYwMAkvKiBCZWdpbm5pbmcgb2YgcmVzZXJ2ZWQgZW50cmllcy4gICovCisjZGVmaW5lCVZFUl9ORFhfRUxJTUlOQVRFCTB4ZmYwMQkvKiBTeW1ib2wgaXMgdG8gYmUgZWxpbWluYXRlZC4gICovCisKKy8qIEF1eGlhbGlhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQJdmRhX25hbWU7CQkvKiBWZXJzaW9uIG9yIGRlcGVuZGVuY3kgbmFtZXMgKi8KKyAgRWxmMzJfV29yZAl2ZGFfbmV4dDsJCS8qIE9mZnNldCBpbiBieXRlcyB0byBuZXh0IHZlcmRhdXgKKwkJCQkJICAgZW50cnkgKi8KK30gRWxmMzJfVmVyZGF1eDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZAl2ZGFfbmFtZTsJCS8qIFZlcnNpb24gb3IgZGVwZW5kZW5jeSBuYW1lcyAqLworICBFbGY2NF9Xb3JkCXZkYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVyZGF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGY2NF9WZXJkYXV4OworCisKKy8qIFZlcnNpb24gZGVwZW5kZW5jeSBzZWN0aW9uLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfSGFsZgl2bl92ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiBzdHJ1Y3R1cmUgKi8KKyAgRWxmMzJfSGFsZgl2bl9jbnQ7CQkJLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgYXV4IGVudHJpZXMgKi8KKyAgRWxmMzJfV29yZAl2bl9maWxlOwkJLyogT2Zmc2V0IG9mIGZpbGVuYW1lIGZvciB0aGlzCisJCQkJCSAgIGRlcGVuZGVuY3kgKi8KKyAgRWxmMzJfV29yZAl2bl9hdXg7CQkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIHZlcm5hdXggYXJyYXkgKi8KKyAgRWxmMzJfV29yZAl2bl9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmVlZAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJuZWVkOworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9IYWxmCXZuX3ZlcnNpb247CQkvKiBWZXJzaW9uIG9mIHN0cnVjdHVyZSAqLworICBFbGY2NF9IYWxmCXZuX2NudDsJCQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBhdXggZW50cmllcyAqLworICBFbGY2NF9Xb3JkCXZuX2ZpbGU7CQkvKiBPZmZzZXQgb2YgZmlsZW5hbWUgZm9yIHRoaXMKKwkJCQkJICAgZGVwZW5kZW5jeSAqLworICBFbGY2NF9Xb3JkCXZuX2F1eDsJCQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gdmVybmF1eCBhcnJheSAqLworICBFbGY2NF9Xb3JkCXZuX25leHQ7CQkvKiBPZmZzZXQgaW4gYnl0ZXMgdG8gbmV4dCB2ZXJuZWVkCisJCQkJCSAgIGVudHJ5ICovCit9IEVsZjY0X1Zlcm5lZWQ7CisKKworLyogTGVnYWwgdmFsdWVzIGZvciB2bl92ZXJzaW9uICh2ZXJzaW9uIHJldmlzaW9uKS4gICovCisjZGVmaW5lIFZFUl9ORUVEX05PTkUJIDAJCS8qIE5vIHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX05FRURfQ1VSUkVOVCAxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KKyNkZWZpbmUgVkVSX05FRURfTlVNCSAyCQkvKiBHaXZlbiB2ZXJzaW9uIG51bWJlciAqLworCisvKiBBdXhpbGlhcnkgbmVlZGVkIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXZuYV9oYXNoOwkJLyogSGFzaCB2YWx1ZSBvZiBkZXBlbmRlbmN5IG5hbWUgKi8KKyAgRWxmMzJfSGFsZgl2bmFfZmxhZ3M7CQkvKiBEZXBlbmRlbmN5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisgIEVsZjMyX0hhbGYJdm5hX290aGVyOwkJLyogVW51c2VkICovCisgIEVsZjMyX1dvcmQJdm5hX25hbWU7CQkvKiBEZXBlbmRlbmN5IG5hbWUgc3RyaW5nIG9mZnNldCAqLworICBFbGYzMl9Xb3JkCXZuYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGYzMl9WZXJuYXV4OworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGY2NF9Xb3JkCXZuYV9oYXNoOwkJLyogSGFzaCB2YWx1ZSBvZiBkZXBlbmRlbmN5IG5hbWUgKi8KKyAgRWxmNjRfSGFsZgl2bmFfZmxhZ3M7CQkvKiBEZXBlbmRlbmN5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCisgIEVsZjY0X0hhbGYJdm5hX290aGVyOwkJLyogVW51c2VkICovCisgIEVsZjY0X1dvcmQJdm5hX25hbWU7CQkvKiBEZXBlbmRlbmN5IG5hbWUgc3RyaW5nIG9mZnNldCAqLworICBFbGY2NF9Xb3JkCXZuYV9uZXh0OwkJLyogT2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgdmVybmF1eAorCQkJCQkgICBlbnRyeSAqLworfSBFbGY2NF9WZXJuYXV4OworCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igdm5hX2ZsYWdzLiAgKi8KKyNkZWZpbmUgVkVSX0ZMR19XRUFLCTB4MgkJLyogV2VhayB2ZXJzaW9uIGlkZW50aWZpZXIgKi8KKworCisvKiBBdXhpbGlhcnkgdmVjdG9yLiAgKi8KKworLyogVGhpcyB2ZWN0b3IgaXMgbm9ybWFsbHkgb25seSB1c2VkIGJ5IHRoZSBwcm9ncmFtIGludGVycHJldGVyLiAgVGhlCisgICB1c3VhbCBkZWZpbml0aW9uIGluIGFuIEFCSSBzdXBwbGVtZW50IHVzZXMgdGhlIG5hbWUgYXV4dl90LiAgVGhlCisgICB2ZWN0b3IgaXMgbm90IHVzdWFsbHkgZGVmaW5lZCBpbiBhIHN0YW5kYXJkIDxlbGYuaD4gZmlsZSwgYnV0IGl0CisgICBjYW4ndCBodXJ0LiAgV2UgcmVuYW1lIGl0IHRvIGF2b2lkIGNvbmZsaWN0cy4gIFRoZSBzaXplcyBvZiB0aGVzZQorICAgdHlwZXMgYXJlIGFuIGFycmFuZ2VtZW50IGJldHdlZW4gdGhlIGV4ZWMgc2VydmVyIGFuZCB0aGUgcHJvZ3JhbQorICAgaW50ZXJwcmV0ZXIsIHNvIHdlIGRvbid0IGZ1bGx5IHNwZWNpZnkgdGhlbSBoZXJlLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDMyX3QgYV90eXBlOwkJLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQzMl90IGFfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgLyogV2UgdXNlIHRvIGhhdmUgcG9pbnRlciBlbGVtZW50cyBhZGRlZCBoZXJlLiAgV2UgY2Fubm90IGRvIHRoYXQsCisJIHRob3VnaCwgc2luY2UgaXQgZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIDMyLWJpdCBkZWZpbml0aW9ucworCSBvbiA2NC1iaXQgcGxhdGZvcm1zIGFuZCB2aWNlIHZlcnNhLiAgKi8KKyAgICB9IGFfdW47Cit9IEVsZjMyX2F1eHZfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdWludDY0X3QgYV90eXBlOwkJLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQ2NF90IGFfdmFsOwkJLyogSW50ZWdlciB2YWx1ZSAqLworICAgICAgLyogV2UgdXNlIHRvIGhhdmUgcG9pbnRlciBlbGVtZW50cyBhZGRlZCBoZXJlLiAgV2UgY2Fubm90IGRvIHRoYXQsCisJIHRob3VnaCwgc2luY2UgaXQgZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIDMyLWJpdCBkZWZpbml0aW9ucworCSBvbiA2NC1iaXQgcGxhdGZvcm1zIGFuZCB2aWNlIHZlcnNhLiAgKi8KKyAgICB9IGFfdW47Cit9IEVsZjY0X2F1eHZfdDsKKworLyogTGVnYWwgdmFsdWVzIGZvciBhX3R5cGUgKGVudHJ5IHR5cGUpLiAgKi8KKworI2RlZmluZSBBVF9OVUxMCQkwCQkvKiBFbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRQkxCQkvKiBFbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLworI2RlZmluZSBBVF9FWEVDRkQJMgkJLyogRmlsZSBkZXNjcmlwdG9yIG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhEUgkJMwkJLyogUHJvZ3JhbSBoZWFkZXJzIGZvciBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRU5UCTQJCS8qIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXIgZW50cnkgKi8KKyNkZWZpbmUgQVRfUEhOVU0JNQkJLyogTnVtYmVyIG9mIHByb2dyYW0gaGVhZGVycyAqLworI2RlZmluZSBBVF9QQUdFU1oJNgkJLyogU3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFCQk3CQkvKiBCYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MJOAkJLyogRmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkJOQkJLyogRW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYJMTAJCS8qIFByb2dyYW0gaXMgbm90IEVMRiAqLworI2RlZmluZSBBVF9VSUQJCTExCQkvKiBSZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlECQkxMgkJLyogRWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQJCTEzCQkvKiBSZWFsIGdpZCAqLworI2RlZmluZSBBVF9FR0lECQkxNAkJLyogRWZmZWN0aXZlIGdpZCAqLworI2RlZmluZSBBVF9DTEtUQ0sJMTcJCS8qIEZyZXF1ZW5jeSBvZiB0aW1lcygpICovCisKKy8qIFNvbWUgbW9yZSBzcGVjaWFsIGFfdHlwZSB2YWx1ZXMgZGVzY3JpYmluZyB0aGUgaGFyZHdhcmUuICAqLworI2RlZmluZSBBVF9QTEFURk9STQkxNQkJLyogU3RyaW5nIGlkZW50aWZ5aW5nIHBsYXRmb3JtLiAgKi8KKyNkZWZpbmUgQVRfSFdDQVAJMTYJCS8qIE1hY2hpbmUgZGVwZW5kZW50IGhpbnRzIGFib3V0CisJCQkJCSAgIHByb2Nlc3NvciBjYXBhYmlsaXRpZXMuICAqLworCisvKiBUaGlzIGVudHJ5IGdpdmVzIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEZQVSBpbml0aWFsaXphdGlvbgorICAgcGVyZm9ybWVkIGJ5IHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBBVF9GUFVDVwkxOAkJLyogVXNlZCBGUFUgY29udHJvbCB3b3JkLiAgKi8KKworLyogQ2FjaGUgYmxvY2sgc2l6ZXMuICAqLworI2RlZmluZSBBVF9EQ0FDSEVCU0laRQkxOQkJLyogRGF0YSBjYWNoZSBibG9jayBzaXplLiAgKi8KKyNkZWZpbmUgQVRfSUNBQ0hFQlNJWkUJMjAJCS8qIEluc3RydWN0aW9uIGNhY2hlIGJsb2NrIHNpemUuICAqLworI2RlZmluZSBBVF9VQ0FDSEVCU0laRQkyMQkJLyogVW5pZmllZCBjYWNoZSBibG9jayBzaXplLiAgKi8KKworLyogQSBzcGVjaWFsIGlnbm9yZWQgdmFsdWUgZm9yIFBQQywgdXNlZCBieSB0aGUga2VybmVsIHRvIGNvbnRyb2wgdGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiB0aGUgQVVYVi4gTXVzdCBiZSA+IDE2LiAgKi8KKyNkZWZpbmUgQVRfSUdOT1JFUFBDCTIyCQkvKiBFbnRyeSBzaG91bGQgYmUgaWdub3JlZC4gICovCisKKyNkZWZpbmUJQVRfU0VDVVJFCTIzCQkvKiBCb29sZWFuLCB3YXMgZXhlYyBzZXR1aWQtbGlrZT8gICovCisKKy8qIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBzeXN0ZW0gcGFnZSB1c2VkIGZvciBzeXN0ZW0gY2FsbHMgYW5kIG90aGVyCisgICBuaWNlIHRoaW5ncy4gICovCisjZGVmaW5lIEFUX1NZU0lORk8JMzIKKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCTMzCisKKy8qIFNoYXBlcyBvZiB0aGUgY2FjaGVzLiAgQml0cyAwLTMgY29udGFpbnMgYXNzb2NpYXRpdml0eTsgYml0cyA0LTcgY29udGFpbnMKKyAgIGxvZzIgb2YgbGluZSBzaXplOyBtYXNrIHRob3NlIHRvIGdldCBjYWNoZSBzaXplLiAgKi8KKyNkZWZpbmUgQVRfTDFJX0NBQ0hFU0hBUEUJMzQKKyNkZWZpbmUgQVRfTDFEX0NBQ0hFU0hBUEUJMzUKKyNkZWZpbmUgQVRfTDJfQ0FDSEVTSEFQRQkzNgorI2RlZmluZSBBVF9MM19DQUNIRVNIQVBFCTM3CisKKy8qIE5vdGUgc2VjdGlvbiBjb250ZW50cy4gIEVhY2ggZW50cnkgaW4gdGhlIG5vdGUgc2VjdGlvbiBiZWdpbnMgd2l0aAorICAgYSBoZWFkZXIgb2YgYSBmaXhlZCBmb3JtLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZCBuX25hbWVzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBuYW1lLiAgKi8KKyAgRWxmMzJfV29yZCBuX2Rlc2NzejsJCQkvKiBMZW5ndGggb2YgdGhlIG5vdGUncyBkZXNjcmlwdG9yLiAgKi8KKyAgRWxmMzJfV29yZCBuX3R5cGU7CQkJLyogVHlwZSBvZiB0aGUgbm90ZS4gICovCit9IEVsZjMyX05oZHI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1dvcmQgbl9uYW1lc3o7CQkJLyogTGVuZ3RoIG9mIHRoZSBub3RlJ3MgbmFtZS4gICovCisgIEVsZjY0X1dvcmQgbl9kZXNjc3o7CQkJLyogTGVuZ3RoIG9mIHRoZSBub3RlJ3MgZGVzY3JpcHRvci4gICovCisgIEVsZjY0X1dvcmQgbl90eXBlOwkJCS8qIFR5cGUgb2YgdGhlIG5vdGUuICAqLworfSBFbGY2NF9OaGRyOworCisvKiBLbm93biBuYW1lcyBvZiBub3Rlcy4gICovCisKKy8qIFNvbGFyaXMgZW50cmllcyBpbiB0aGUgbm90ZSBzZWN0aW9uIGhhdmUgdGhpcyBuYW1lLiAgKi8KKyNkZWZpbmUgRUxGX05PVEVfU09MQVJJUwkiU1VOVyBTb2xhcmlzIgorCisvKiBOb3RlIGVudHJpZXMgZm9yIEdOVSBzeXN0ZW1zIGhhdmUgdGhpcyBuYW1lLiAgKi8KKyNkZWZpbmUgRUxGX05PVEVfR05VCQkiR05VIgorCisKKy8qIERlZmluZWQgdHlwZXMgb2Ygbm90ZXMgZm9yIFNvbGFyaXMuICAqLworCisvKiBWYWx1ZSBvZiBkZXNjcmlwdG9yIChvbmUgd29yZCkgaXMgZGVzaXJlZCBwYWdlc2l6ZSBmb3IgdGhlIGJpbmFyeS4gICovCisjZGVmaW5lIEVMRl9OT1RFX1BBR0VTSVpFX0hJTlQJMQorCisKKy8qIERlZmluZWQgbm90ZSB0eXBlcyBmb3IgR05VIHN5c3RlbXMuICAqLworCisvKiBBQkkgaW5mb3JtYXRpb24uICBUaGUgZGVzY3JpcHRvciBjb25zaXN0cyBvZiB3b3JkczoKKyAgIHdvcmQgMDogT1MgZGVzY3JpcHRvcgorICAgd29yZCAxOiBtYWpvciB2ZXJzaW9uIG9mIHRoZSBBQkkKKyAgIHdvcmQgMjogbWlub3IgdmVyc2lvbiBvZiB0aGUgQUJJCisgICB3b3JkIDM6IHN1Ym1pbm9yIHZlcnNpb24gb2YgdGhlIEFCSQorKi8KKyNkZWZpbmUgTlRfR05VX0FCSV9UQUcJMQorI2RlZmluZSBFTEZfTk9URV9BQkkJTlRfR05VX0FCSV9UQUcgLyogT2xkIG5hbWUuICAqLworCisvKiBLbm93biBPU2VzLiAgVGhlc2UgdmFsdWVzIGNhbiBhcHBlYXIgaW4gd29yZCAwIG9mIGFuCisgICBOVF9HTlVfQUJJX1RBRyBub3RlIHNlY3Rpb24gZW50cnkuICAqLworI2RlZmluZSBFTEZfTk9URV9PU19MSU5VWAkwCisjZGVmaW5lIEVMRl9OT1RFX09TX0dOVQkJMQorI2RlZmluZSBFTEZfTk9URV9PU19TT0xBUklTMgkyCisjZGVmaW5lIEVMRl9OT1RFX09TX0ZSRUVCU0QJMworCisvKiBTeW50aGV0aWMgaHdjYXAgaW5mb3JtYXRpb24uICBUaGUgZGVzY3JpcHRvciBiZWdpbnMgd2l0aCB0d28gd29yZHM6CisgICB3b3JkIDA6IG51bWJlciBvZiBlbnRyaWVzCisgICB3b3JkIDE6IGJpdG1hc2sgb2YgZW5hYmxlZCBlbnRyaWVzCisgICBUaGVuIGZvbGxvdyB2YXJpYWJsZS1sZW5ndGggZW50cmllcywgb25lIGJ5dGUgZm9sbG93ZWQgYnkgYQorICAgJ1wwJy10ZXJtaW5hdGVkIGh3Y2FwIG5hbWUgc3RyaW5nLiAgVGhlIGJ5dGUgZ2l2ZXMgdGhlIGJpdAorICAgbnVtYmVyIHRvIHRlc3QgaWYgZW5hYmxlZCwgKDFVIDw8IGJpdCkgJiBiaXRtYXNrLiAgKi8KKyNkZWZpbmUgTlRfR05VX0hXQ0FQCTIKKworLyogQnVpbGQgSUQgYml0cyBhcyBnZW5lcmF0ZWQgYnkgbGQgLS1idWlsZC1pZC4KKyAgIFRoZSBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mIGFueSBub256ZXJvIG51bWJlciBvZiBieXRlcy4gICovCisjZGVmaW5lIE5UX0dOVV9CVUlMRF9JRAkzCisKKworLyogTW92ZSByZWNvcmRzLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1h3b3JkIG1fdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUuICAqLworICBFbGYzMl9Xb3JkIG1faW5mbzsJCS8qIFNpemUgYW5kIGluZGV4LiAgKi8KKyAgRWxmMzJfV29yZCBtX3BvZmZzZXQ7CQkvKiBTeW1ib2wgb2Zmc2V0LiAgKi8KKyAgRWxmMzJfSGFsZiBtX3JlcGVhdDsJCS8qIFJlcGVhdCBjb3VudC4gICovCisgIEVsZjMyX0hhbGYgbV9zdHJpZGU7CQkvKiBTdHJpZGUgaW5mby4gICovCit9IEVsZjMyX01vdmU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjY0X1h3b3JkIG1fdmFsdWU7CQkvKiBTeW1ib2wgdmFsdWUuICAqLworICBFbGY2NF9Yd29yZCBtX2luZm87CQkvKiBTaXplIGFuZCBpbmRleC4gICovCisgIEVsZjY0X1h3b3JkIG1fcG9mZnNldDsJLyogU3ltYm9sIG9mZnNldC4gICovCisgIEVsZjY0X0hhbGYgbV9yZXBlYXQ7CQkvKiBSZXBlYXQgY291bnQuICAqLworICBFbGY2NF9IYWxmIG1fc3RyaWRlOwkJLyogU3RyaWRlIGluZm8uICAqLworfSBFbGY2NF9Nb3ZlOworCisvKiBNYWNybyB0byBjb25zdHJ1Y3QgbW92ZSByZWNvcmRzLiAgKi8KKyNkZWZpbmUgRUxGMzJfTV9TWU0oaW5mbykJKChpbmZvKSA+PiA4KQorI2RlZmluZSBFTEYzMl9NX1NJWkUoaW5mbykJKCh1bnNpZ25lZCBjaGFyKSAoaW5mbykpCisjZGVmaW5lIEVMRjMyX01fSU5GTyhzeW0sIHNpemUpCSgoKHN5bSkgPDwgOCkgKyAodW5zaWduZWQgY2hhcikgKHNpemUpKQorCisjZGVmaW5lIEVMRjY0X01fU1lNKGluZm8pCUVMRjMyX01fU1lNIChpbmZvKQorI2RlZmluZSBFTEY2NF9NX1NJWkUoaW5mbykJRUxGMzJfTV9TSVpFIChpbmZvKQorI2RlZmluZSBFTEY2NF9NX0lORk8oc3ltLCBzaXplKQlFTEYzMl9NX0lORk8gKHN5bSwgc2l6ZSkKKworCisvKiBNb3Rvcm9sYSA2OGsgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBWYWx1ZXMgZm9yIEVsZjMyX0VoZHIuZV9mbGFncy4gICovCisjZGVmaW5lIEVGX0NQVTMyCTB4MDA4MTAwMDAKKworLyogbTY4ayByZWxvY3MuICAqLworCisjZGVmaW5lIFJfNjhLX05PTkUJMAkJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl82OEtfMzIJMQkJLyogRGlyZWN0IDMyIGJpdCAgKi8KKyNkZWZpbmUgUl82OEtfMTYJMgkJLyogRGlyZWN0IDE2IGJpdCAgKi8KKyNkZWZpbmUgUl82OEtfOAkJMwkJLyogRGlyZWN0IDggYml0ICAqLworI2RlZmluZSBSXzY4S19QQzMyCTQJCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSXzY4S19QQzE2CTUJCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSXzY4S19QQzgJNgkJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KKyNkZWZpbmUgUl82OEtfR09UMzIJNwkJLyogMzIgYml0IFBDIHJlbGF0aXZlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSXzY4S19HT1QxNgk4CQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX0dPVDgJOQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfNjhLX0dPVDMyTwkxMAkJLyogMzIgYml0IEdPVCBvZmZzZXQgKi8KKyNkZWZpbmUgUl82OEtfR09UMTZPCTExCQkvKiAxNiBiaXQgR09UIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19HT1Q4TwkxMgkJLyogOCBiaXQgR09UIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19QTFQzMgkxMwkJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfNjhLX1BMVDE2CTE0CQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl82OEtfUExUOAkxNQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl82OEtfUExUMzJPCTE2CQkvKiAzMiBiaXQgUExUIG9mZnNldCAqLworI2RlZmluZSBSXzY4S19QTFQxNk8JMTcJCS8qIDE2IGJpdCBQTFQgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX1BMVDhPCTE4CQkvKiA4IGJpdCBQTFQgb2Zmc2V0ICovCisjZGVmaW5lIFJfNjhLX0NPUFkJMTkJCS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl82OEtfR0xPQl9EQVQJMjAJCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfSk1QX1NMT1QJMjEJCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl82OEtfUkVMQVRJVkUJMjIJCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfNjhLX05VTQkyMworCisvKiBJbnRlbCA4MDM4NiBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIGkzODYgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSXzM4Nl9OT05FCSAgIDAJCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfMzg2XzMyCSAgIDEJCS8qIERpcmVjdCAzMiBiaXQgICovCisjZGVmaW5lIFJfMzg2X1BDMzIJICAgMgkJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfMzg2X0dPVDMyCSAgIDMJCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl8zODZfUExUMzIJICAgNAkJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfMzg2X0NPUFkJICAgNQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSXzM4Nl9HTE9CX0RBVAkgICA2CQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfMzg2X0pNUF9TTE9UCSAgIDcJCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl8zODZfUkVMQVRJVkUJICAgOAkJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSXzM4Nl9HT1RPRkYJICAgOQkJLyogMzIgYml0IG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl8zODZfR09UUEMJICAgMTAJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfMzg2XzMyUExUCSAgIDExCisjZGVmaW5lIFJfMzg2X1RMU19UUE9GRgkgICAxNAkJLyogT2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0lFCSAgIDE1CQkvKiBBZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dPVElFCSAgIDE2CQkvKiBHT1QgZW50cnkgZm9yIHN0YXRpYyBUTFMgYmxvY2sKKwkJCQkJICAgb2Zmc2V0ICovCisjZGVmaW5lIFJfMzg2X1RMU19MRQkgICAxNwkJLyogT2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0dECSAgIDE4CQkvKiBEaXJlY3QgMzIgYml0IGZvciBHTlUgdmVyc2lvbiBvZgorCQkJCQkgICBnZW5lcmFsIGR5bmFtaWMgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xETQkgICAxOQkJLyogRGlyZWN0IDMyIGJpdCBmb3IgR05VIHZlcnNpb24gb2YKKwkJCQkJICAgbG9jYWwgZHluYW1pYyB0aHJlYWQgbG9jYWwgZGF0YQorCQkJCQkgICBpbiBMRSBjb2RlICovCisjZGVmaW5lIFJfMzg2XzE2CSAgIDIwCisjZGVmaW5lIFJfMzg2X1BDMTYJICAgMjEKKyNkZWZpbmUgUl8zODZfOAkJICAgMjIKKyNkZWZpbmUgUl8zODZfUEM4CSAgIDIzCisjZGVmaW5lIFJfMzg2X1RMU19HRF8zMgkgICAyNAkJLyogRGlyZWN0IDMyIGJpdCBmb3IgZ2VuZXJhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhICovCisjZGVmaW5lIFJfMzg2X1RMU19HRF9QVVNIICAyNQkJLyogVGFnIGZvciBwdXNobCBpbiBHRCBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0RfQ0FMTCAgMjYJCS8qIFJlbG9jYXRpb24gZm9yIGNhbGwgdG8KKwkJCQkJICAgX190bHNfZ2V0X2FkZHIoKSAqLworI2RlZmluZSBSXzM4Nl9UTFNfR0RfUE9QICAgMjcJCS8qIFRhZyBmb3IgcG9wbCBpbiBHRCBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNXzMyICAgMjgJCS8qIERpcmVjdCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgaW4gTEUgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERNX1BVU0ggMjkJCS8qIFRhZyBmb3IgcHVzaGwgaW4gTERNIFRMUyBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fQ0FMTCAzMAkJLyogUmVsb2NhdGlvbiBmb3IgY2FsbCB0bworCQkJCQkgICBfX3Rsc19nZXRfYWRkcigpIGluIExETSBjb2RlICovCisjZGVmaW5lIFJfMzg2X1RMU19MRE1fUE9QICAzMQkJLyogVGFnIGZvciBwb3BsIGluIExETSBUTFMgY29kZSAqLworI2RlZmluZSBSXzM4Nl9UTFNfTERPXzMyICAgMzIJCS8qIE9mZnNldCByZWxhdGl2ZSB0byBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl8zODZfVExTX0lFXzMyCSAgIDMzCQkvKiBHT1QgZW50cnkgZm9yIG5lZ2F0ZWQgc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQgKi8KKyNkZWZpbmUgUl8zODZfVExTX0xFXzMyCSAgIDM0CQkvKiBOZWdhdGVkIG9mZnNldCByZWxhdGl2ZSB0byBzdGF0aWMKKwkJCQkJICAgVExTIGJsb2NrICovCisjZGVmaW5lIFJfMzg2X1RMU19EVFBNT0QzMiAzNQkJLyogSUQgb2YgbW9kdWxlIGNvbnRhaW5pbmcgc3ltYm9sICovCisjZGVmaW5lIFJfMzg2X1RMU19EVFBPRkYzMiAzNgkJLyogT2Zmc2V0IGluIFRMUyBibG9jayAqLworI2RlZmluZSBSXzM4Nl9UTFNfVFBPRkYzMiAgMzcJCS8qIE5lZ2F0ZWQgb2Zmc2V0IGluIHN0YXRpYyBUTFMgYmxvY2sgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzg2X05VTQkgICAzOAorCisvKiBTVU4gU1BBUkMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KKworI2RlZmluZSBTVFRfU1BBUkNfUkVHSVNURVIJMTMJLyogR2xvYmFsIHJlZ2lzdGVyIHJlc2VydmVkIHRvIGFwcC4gKi8KKworLyogVmFsdWVzIGZvciBFbGY2NF9FaGRyLmVfZmxhZ3MuICAqLworCisjZGVmaW5lIEVGX1NQQVJDVjlfTU0JCTMKKyNkZWZpbmUgRUZfU1BBUkNWOV9UU08JCTAKKyNkZWZpbmUgRUZfU1BBUkNWOV9QU08JCTEKKyNkZWZpbmUgRUZfU1BBUkNWOV9STU8JCTIKKyNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBCQkweDgwMDAwMCAvKiBsaXR0bGUgZW5kaWFuIGRhdGEgKi8KKyNkZWZpbmUgRUZfU1BBUkNfRVhUX01BU0sJMHhGRkZGMDAKKyNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTCQkweDAwMDEwMCAvKiBnZW5lcmljIFY4KyBmZWF0dXJlcyAqLworI2RlZmluZSBFRl9TUEFSQ19TVU5fVVMxCTB4MDAwMjAwIC8qIFN1biBVbHRyYVNQQVJDMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX0hBTF9SMQkJMHgwMDA0MDAgLyogSEFMIFIxIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMwkweDAwMDgwMCAvKiBTdW4gVWx0cmFTUEFSQ0lJSSBleHRlbnNpb25zICovCisKKy8qIFNQQVJDIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9TUEFSQ19OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfU1BBUkNfOAkJMQkvKiBEaXJlY3QgOCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xNgkJMgkvKiBEaXJlY3QgMTYgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfMzIJCTMJLyogRGlyZWN0IDMyIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1A4CQk0CS8qIFBDIHJlbGF0aXZlIDggYml0ICovCisjZGVmaW5lIFJfU1BBUkNfRElTUDE2CQk1CS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0RJU1AzMgkJNgkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDMwCQk3CS8qIFBDIHJlbGF0aXZlIDMwIGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfU1BBUkNfV0RJU1AyMgkJOAkvKiBQQyByZWxhdGl2ZSAyMiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0hJMjIJCTkJLyogSGlnaCAyMiBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18yMgkJMTAJLyogRGlyZWN0IDIyIGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzEzCQkxMQkvKiBEaXJlY3QgMTMgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfTE8xMAkJMTIJLyogVHJ1bmNhdGVkIDEwIGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0dPVDEwCQkxMwkvKiBUcnVuY2F0ZWQgMTAgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0dPVDEzCQkxNAkvKiAxMyBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfR09UMjIJCTE1CS8qIDIyIGJpdCBHT1QgZW50cnkgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1BDMTAJCTE2CS8qIFBDIHJlbGF0aXZlIDEwIGJpdCB0cnVuY2F0ZWQgKi8KKyNkZWZpbmUgUl9TUEFSQ19QQzIyCQkxNwkvKiBQQyByZWxhdGl2ZSAyMiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dQTFQzMAkJMTgJLyogMzAgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfU1BBUkNfQ09QWQkJMTkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX1NQQVJDX0dMT0JfREFUCTIwCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9TUEFSQ19KTVBfU0xPVAkyMQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUkVMQVRJVkUJMjIJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX1NQQVJDX1VBMzIJCTIzCS8qIERpcmVjdCAzMiBiaXQgdW5hbGlnbmVkICovCisKKy8qIEFkZGl0aW9uYWwgU3BhcmM2NCByZWxvY3MuICAqLworCisjZGVmaW5lIFJfU1BBUkNfUExUMzIJCTI0CS8qIERpcmVjdCAzMiBiaXQgcmVmIHRvIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0hJUExUMjIJCTI1CS8qIEhpZ2ggMjIgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX0xPUExUMTAJCTI2CS8qIFRydW5jYXRlZCAxMCBiaXQgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUENQTFQzMgkJMjcJLyogUEMgcmVsIDMyIGJpdCByZWYgdG8gUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfUENQTFQyMgkJMjgJLyogUEMgcmVsIGhpZ2ggMjIgYml0IFBMVCBlbnRyeSAqLworI2RlZmluZSBSX1NQQVJDX1BDUExUMTAJCTI5CS8qIFBDIHJlbCB0cnVuYyAxMCBiaXQgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfMTAJCTMwCS8qIERpcmVjdCAxMCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ18xMQkJMzEJLyogRGlyZWN0IDExIGJpdCAqLworI2RlZmluZSBSX1NQQVJDXzY0CQkzMgkvKiBEaXJlY3QgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfT0xPMTAJCTMzCS8qIDEwYml0IHdpdGggc2Vjb25kYXJ5IDEzYml0IGFkZGVuZCAqLworI2RlZmluZSBSX1NQQVJDX0hIMjIJCTM0CS8qIFRvcCAyMiBiaXRzIG9mIGRpcmVjdCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19ITTEwCQkzNQkvKiBIaWdoIG1pZGRsZSAxMCBiaXRzIG9mIC4uLiAqLworI2RlZmluZSBSX1NQQVJDX0xNMjIJCTM2CS8qIExvdyBtaWRkbGUgMjIgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19QQ19ISDIyCQkzNwkvKiBUb3AgMjIgYml0cyBvZiBwYyByZWwgNjQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfUENfSE0xMAkJMzgJLyogSGlnaCBtaWRkbGUgMTAgYml0IG9mIC4uLiAqLworI2RlZmluZSBSX1NQQVJDX1BDX0xNMjIJCTM5CS8qIExvdyBtaWdnbGUgMjIgYml0cyBvZiAuLi4gKi8KKyNkZWZpbmUgUl9TUEFSQ19XRElTUDE2CQk0MAkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX1NQQVJDX1dESVNQMTkJCTQxCS8qIFBDIHJlbGF0aXZlIDE5IGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfU1BBUkNfNwkJNDMJLyogRGlyZWN0IDcgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfNQkJNDQJLyogRGlyZWN0IDUgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfNgkJNDUJLyogRGlyZWN0IDYgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfRElTUDY0CQk0NgkvKiBQQyByZWxhdGl2ZSA2NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19QTFQ2NAkJNDcJLyogRGlyZWN0IDY0IGJpdCByZWYgdG8gUExUIGVudHJ5ICovCisjZGVmaW5lIFJfU1BBUkNfSElYMjIJCTQ4CS8qIEhpZ2ggMjIgYml0IGNvbXBsZW1lbnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0xPWDEwCQk0OQkvKiBUcnVuY2F0ZWQgMTEgYml0IGNvbXBsZW1lbnRlZCAqLworI2RlZmluZSBSX1NQQVJDX0g0NAkJNTAJLyogRGlyZWN0IGhpZ2ggMTIgb2YgNDQgYml0ICovCisjZGVmaW5lIFJfU1BBUkNfTTQ0CQk1MQkvKiBEaXJlY3QgbWlkIDIyIG9mIDQ0IGJpdCAqLworI2RlZmluZSBSX1NQQVJDX0w0NAkJNTIJLyogRGlyZWN0IGxvdyAxMCBvZiA0NCBiaXQgKi8KKyNkZWZpbmUgUl9TUEFSQ19SRUdJU1RFUgk1MwkvKiBHbG9iYWwgcmVnaXN0ZXIgdXNhZ2UgKi8KKyNkZWZpbmUgUl9TUEFSQ19VQTY0CQk1NAkvKiBEaXJlY3QgNjQgYml0IHVuYWxpZ25lZCAqLworI2RlZmluZSBSX1NQQVJDX1VBMTYJCTU1CS8qIERpcmVjdCAxNiBiaXQgdW5hbGlnbmVkICovCisjZGVmaW5lIFJfU1BBUkNfVExTX0dEX0hJMjIJNTYKKyNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfTE8xMAk1NworI2RlZmluZSBSX1NQQVJDX1RMU19HRF9BREQJNTgKKyNkZWZpbmUgUl9TUEFSQ19UTFNfR0RfQ0FMTAk1OQorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fSEkyMgk2MAorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fTE8xMAk2MQorI2RlZmluZSBSX1NQQVJDX1RMU19MRE1fQURECTYyCisjZGVmaW5lIFJfU1BBUkNfVExTX0xETV9DQUxMCTYzCisjZGVmaW5lIFJfU1BBUkNfVExTX0xET19ISVgyMgk2NAorI2RlZmluZSBSX1NQQVJDX1RMU19MRE9fTE9YMTAJNjUKKyNkZWZpbmUgUl9TUEFSQ19UTFNfTERPX0FERAk2NgorI2RlZmluZSBSX1NQQVJDX1RMU19JRV9ISTIyCTY3CisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0xPMTAJNjgKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTEQJNjkKKyNkZWZpbmUgUl9TUEFSQ19UTFNfSUVfTERYCTcwCisjZGVmaW5lIFJfU1BBUkNfVExTX0lFX0FERAk3MQorI2RlZmluZSBSX1NQQVJDX1RMU19MRV9ISVgyMgk3MgorI2RlZmluZSBSX1NQQVJDX1RMU19MRV9MT1gxMAk3MworI2RlZmluZSBSX1NQQVJDX1RMU19EVFBNT0QzMgk3NAorI2RlZmluZSBSX1NQQVJDX1RMU19EVFBNT0Q2NAk3NQorI2RlZmluZSBSX1NQQVJDX1RMU19EVFBPRkYzMgk3NgorI2RlZmluZSBSX1NQQVJDX1RMU19EVFBPRkY2NAk3NworI2RlZmluZSBSX1NQQVJDX1RMU19UUE9GRjMyCTc4CisjZGVmaW5lIFJfU1BBUkNfVExTX1RQT0ZGNjQJNzkKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfU1BBUkNfTlVNCQk4MAorCisvKiBGb3IgU3BhcmM2NCwgbGVnYWwgdmFsdWVzIGZvciBkX3RhZyBvZiBFbGY2NF9EeW4uICAqLworCisjZGVmaW5lIERUX1NQQVJDX1JFR0lTVEVSIDB4NzAwMDAwMDEKKyNkZWZpbmUgRFRfU1BBUkNfTlVNCTIKKworLyogQml0cyBwcmVzZW50IGluIEFUX0hXQ0FQIG9uIFNQQVJDLiAgKi8KKworI2RlZmluZSBIV0NBUF9TUEFSQ19GTFVTSAkxCS8qIFRoZSBDUFUgc3VwcG9ydHMgZmx1c2ggaW5zbi4gICovCisjZGVmaW5lIEhXQ0FQX1NQQVJDX1NUQkFSCTIKKyNkZWZpbmUgSFdDQVBfU1BBUkNfU1dBUAk0CisjZGVmaW5lIEhXQ0FQX1NQQVJDX01VTERJVgk4CisjZGVmaW5lIEhXQ0FQX1NQQVJDX1Y5CQkxNgkvKiBUaGUgQ1BVIGlzIHY5LCBzbyB2OHBsdXMgaXMgb2suICAqLworI2RlZmluZSBIV0NBUF9TUEFSQ19VTFRSQTMJMzIKKyNkZWZpbmUgSFdDQVBfU1BBUkNfQkxLSU5JVAk2NAkvKiBTdW40diB3aXRoIGJsb2NrLWluaXQvbG9hZC10d2luLiAgKi8KKyNkZWZpbmUgSFdDQVBfU1BBUkNfTjIJCTEyOAorCisvKiBNSVBTIFIzMDAwIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX0VoZHIuICAqLworCisjZGVmaW5lIEVGX01JUFNfTk9SRU9SREVSICAgMQkJLyogQSAubm9yZW9yZGVyIGRpcmVjdGl2ZSB3YXMgdXNlZCAqLworI2RlZmluZSBFRl9NSVBTX1BJQwkgICAgMgkJLyogQ29udGFpbnMgUElDIGNvZGUgKi8KKyNkZWZpbmUgRUZfTUlQU19DUElDCSAgICA0CQkvKiBVc2VzIFBJQyBjYWxsaW5nIHNlcXVlbmNlICovCisjZGVmaW5lIEVGX01JUFNfWEdPVAkgICAgOAorI2RlZmluZSBFRl9NSVBTXzY0QklUX1dISVJMIDE2CisjZGVmaW5lIEVGX01JUFNfQUJJMgkgICAgMzIKKyNkZWZpbmUgRUZfTUlQU19BQklfT04zMiAgICA2NAorI2RlZmluZSBFRl9NSVBTX0FSQ0gJICAgIDB4ZjAwMDAwMDAJLyogTUlQUyBhcmNoaXRlY3R1cmUgbGV2ZWwgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBNSVBTIGFyY2hpdGVjdHVyZSBsZXZlbC4gICovCisKKyNkZWZpbmUgRUZfTUlQU19BUkNIXzEJICAgIDB4MDAwMDAwMDAJLyogLW1pcHMxIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMgkgICAgMHgxMDAwMDAwMAkvKiAtbWlwczIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8zCSAgICAweDIwMDAwMDAwCS8qIC1taXBzMyBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzQJICAgIDB4MzAwMDAwMDAJLyogLW1pcHM0IGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfNQkgICAgMHg0MDAwMDAwMAkvKiAtbWlwczUgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8zMgkgICAgMHg2MDAwMDAwMAkvKiBNSVBTMzIgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF82NAkgICAgMHg3MDAwMDAwMAkvKiBNSVBTNjQgY29kZS4gICovCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vbi1vZmZpY2lhbCBuYW1lcyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgKi8KKworI2RlZmluZSBFX01JUFNfQVJDSF8xCSAgMHgwMDAwMDAwMAkvKiAtbWlwczEgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzIJICAweDEwMDAwMDAwCS8qIC1taXBzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMwkgIDB4MjAwMDAwMDAJLyogLW1pcHMzIGNvZGUuICAqLworI2RlZmluZSBFX01JUFNfQVJDSF80CSAgMHgzMDAwMDAwMAkvKiAtbWlwczQgY29kZS4gICovCisjZGVmaW5lIEVfTUlQU19BUkNIXzUJICAweDQwMDAwMDAwCS8qIC1taXBzNSBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfMzIJICAweDYwMDAwMDAwCS8qIE1JUFMzMiBjb2RlLiAgKi8KKyNkZWZpbmUgRV9NSVBTX0FSQ0hfNjQJICAweDcwMDAwMDAwCS8qIE1JUFM2NCBjb2RlLiAgKi8KKworLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMuICAqLworCisjZGVmaW5lIFNITl9NSVBTX0FDT01NT04gICAgMHhmZjAwCS8qIEFsbG9jYXRlZCBjb21tb24gc3ltYm9scyAqLworI2RlZmluZSBTSE5fTUlQU19URVhUCSAgICAweGZmMDEJLyogQWxsb2NhdGVkIHRlc3Qgc3ltYm9scy4gICovCisjZGVmaW5lIFNITl9NSVBTX0RBVEEJICAgIDB4ZmYwMgkvKiBBbGxvY2F0ZWQgZGF0YSBzeW1ib2xzLiAgKi8KKyNkZWZpbmUgU0hOX01JUFNfU0NPTU1PTiAgICAweGZmMDMJLyogU21hbGwgY29tbW9uIHN5bWJvbHMgKi8KKyNkZWZpbmUgU0hOX01JUFNfU1VOREVGSU5FRCAweGZmMDQJLyogU21hbGwgdW5kZWZpbmVkIHN5bWJvbHMgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIGZpZWxkIG9mIEVsZjMyX1NoZHIuICAqLworCisjZGVmaW5lIFNIVF9NSVBTX0xJQkxJU1QgICAgICAgMHg3MDAwMDAwMCAvKiBTaGFyZWQgb2JqZWN0cyB1c2VkIGluIGxpbmsgKi8KKyNkZWZpbmUgU0hUX01JUFNfTVNZTQkgICAgICAgMHg3MDAwMDAwMQorI2RlZmluZSBTSFRfTUlQU19DT05GTElDVCAgICAgIDB4NzAwMDAwMDIgLyogQ29uZmxpY3Rpbmcgc3ltYm9scyAqLworI2RlZmluZSBTSFRfTUlQU19HUFRBQgkgICAgICAgMHg3MDAwMDAwMyAvKiBHbG9iYWwgZGF0YSBhcmVhIHNpemVzICovCisjZGVmaW5lIFNIVF9NSVBTX1VDT0RFCSAgICAgICAweDcwMDAwMDA0IC8qIFJlc2VydmVkIGZvciBTR0kvTUlQUyBjb21waWxlcnMgKi8KKyNkZWZpbmUgU0hUX01JUFNfREVCVUcJICAgICAgIDB4NzAwMDAwMDUgLyogTUlQUyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24qLworI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPICAgICAgIDB4NzAwMDAwMDYgLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgU0hUX01JUFNfUEFDS0FHRSAgICAgICAweDcwMDAwMDA3CisjZGVmaW5lIFNIVF9NSVBTX1BBQ0tTWU0gICAgICAgMHg3MDAwMDAwOAorI2RlZmluZSBTSFRfTUlQU19SRUxECSAgICAgICAweDcwMDAwMDA5CisjZGVmaW5lIFNIVF9NSVBTX0lGQUNFICAgICAgICAgMHg3MDAwMDAwYgorI2RlZmluZSBTSFRfTUlQU19DT05URU5UICAgICAgIDB4NzAwMDAwMGMKKyNkZWZpbmUgU0hUX01JUFNfT1BUSU9OUyAgICAgICAweDcwMDAwMDBkIC8qIE1pc2NlbGxhbmVvdXMgb3B0aW9ucy4gICovCisjZGVmaW5lIFNIVF9NSVBTX1NIRFIJICAgICAgIDB4NzAwMDAwMTAKKyNkZWZpbmUgU0hUX01JUFNfRkRFU0MJICAgICAgIDB4NzAwMDAwMTEKKyNkZWZpbmUgU0hUX01JUFNfRVhUU1lNCSAgICAgICAweDcwMDAwMDEyCisjZGVmaW5lIFNIVF9NSVBTX0RFTlNFCSAgICAgICAweDcwMDAwMDEzCisjZGVmaW5lIFNIVF9NSVBTX1BERVNDCSAgICAgICAweDcwMDAwMDE0CisjZGVmaW5lIFNIVF9NSVBTX0xPQ1NZTQkgICAgICAgMHg3MDAwMDAxNQorI2RlZmluZSBTSFRfTUlQU19BVVhTWU0JICAgICAgIDB4NzAwMDAwMTYKKyNkZWZpbmUgU0hUX01JUFNfT1BUU1lNCSAgICAgICAweDcwMDAwMDE3CisjZGVmaW5lIFNIVF9NSVBTX0xPQ1NUUgkgICAgICAgMHg3MDAwMDAxOAorI2RlZmluZSBTSFRfTUlQU19MSU5FCSAgICAgICAweDcwMDAwMDE5CisjZGVmaW5lIFNIVF9NSVBTX1JGREVTQwkgICAgICAgMHg3MDAwMDAxYQorI2RlZmluZSBTSFRfTUlQU19ERUxUQVNZTSAgICAgIDB4NzAwMDAwMWIKKyNkZWZpbmUgU0hUX01JUFNfREVMVEFJTlNUICAgICAweDcwMDAwMDFjCisjZGVmaW5lIFNIVF9NSVBTX0RFTFRBQ0xBU1MgICAgMHg3MDAwMDAxZAorI2RlZmluZSBTSFRfTUlQU19EV0FSRiAgICAgICAgIDB4NzAwMDAwMWUgLyogRFdBUkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX01JUFNfREVMVEFERUNMICAgICAweDcwMDAwMDFmCisjZGVmaW5lIFNIVF9NSVBTX1NZTUJPTF9MSUIgICAgMHg3MDAwMDAyMAorI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJICAgICAgIDB4NzAwMDAwMjEgLyogRXZlbnQgc2VjdGlvbi4gICovCisjZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURSAgICAgMHg3MDAwMDAyMgorI2RlZmluZSBTSFRfTUlQU19QSVhJRQkgICAgICAgMHg3MDAwMDAyMworI2RlZmluZSBTSFRfTUlQU19YTEFURQkgICAgICAgMHg3MDAwMDAyNAorI2RlZmluZSBTSFRfTUlQU19YTEFURV9ERUJVRyAgIDB4NzAwMDAwMjUKKyNkZWZpbmUgU0hUX01JUFNfV0hJUkwJICAgICAgIDB4NzAwMDAwMjYKKyNkZWZpbmUgU0hUX01JUFNfRUhfUkVHSU9OICAgICAweDcwMDAwMDI3CisjZGVmaW5lIFNIVF9NSVBTX1hMQVRFX09MRCAgICAgMHg3MDAwMDAyOAorI2RlZmluZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OIDB4NzAwMDAwMjkKKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KKworI2RlZmluZSBTSEZfTUlQU19HUFJFTAkgMHgxMDAwMDAwMAkvKiBNdXN0IGJlIHBhcnQgb2YgZ2xvYmFsIGRhdGEgYXJlYSAqLworI2RlZmluZSBTSEZfTUlQU19NRVJHRQkgMHgyMDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19BRERSCSAweDQwMDAwMDAwCisjZGVmaW5lIFNIRl9NSVBTX1NUUklOR1MgMHg4MDAwMDAwMAorI2RlZmluZSBTSEZfTUlQU19OT1NUUklQIDB4MDgwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTE9DQUwJIDB4MDQwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTkFNRVMJIDB4MDIwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfTk9EVVBFCSAweDAxMDAwMDAwCisKKworLyogU3ltYm9sIHRhYmxlcy4gICovCisKKy8qIE1JUFMgc3BlY2lmaWMgdmFsdWVzIGZvciBgc3Rfb3RoZXInLiAgKi8KKyNkZWZpbmUgU1RPX01JUFNfREVGQVVMVAkJMHgwCisjZGVmaW5lIFNUT19NSVBTX0lOVEVSTkFMCQkweDEKKyNkZWZpbmUgU1RPX01JUFNfSElEREVOCQkJMHgyCisjZGVmaW5lIFNUT19NSVBTX1BST1RFQ1RFRAkJMHgzCisjZGVmaW5lIFNUT19NSVBTX1NDX0FMSUdOX1VOVVNFRAkweGZmCisKKy8qIE1JUFMgc3BlY2lmaWMgdmFsdWVzIGZvciBgc3RfaW5mbycuICAqLworI2RlZmluZSBTVEJfTUlQU19TUExJVF9DT01NT04JCTEzCisKKy8qIEVudHJpZXMgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19HUFRBQi4gICovCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgc3RydWN0CisgICAgeworICAgICAgRWxmMzJfV29yZCBndF9jdXJyZW50X2dfdmFsdWU7CS8qIC1HIHZhbHVlIHVzZWQgZm9yIGNvbXBpbGF0aW9uICovCisgICAgICBFbGYzMl9Xb3JkIGd0X3VudXNlZDsJCS8qIE5vdCB1c2VkICovCisgICAgfSBndF9oZWFkZXI7CQkJLyogRmlyc3QgZW50cnkgaW4gc2VjdGlvbiAqLworICBzdHJ1Y3QKKyAgICB7CisgICAgICBFbGYzMl9Xb3JkIGd0X2dfdmFsdWU7CQkvKiBJZiB0aGlzIHZhbHVlIHdlcmUgdXNlZCBmb3IgLUcgKi8KKyAgICAgIEVsZjMyX1dvcmQgZ3RfYnl0ZXM7CQkvKiBUaGlzIG1hbnkgYnl0ZXMgd291bGQgYmUgdXNlZCAqLworICAgIH0gZ3RfZW50cnk7CQkJCS8qIFN1YnNlcXVlbnQgZW50cmllcyBpbiBzZWN0aW9uICovCit9IEVsZjMyX2dwdGFiOworCisvKiBFbnRyeSBmb3VuZCBpbiBzZWN0aW9ucyBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8uICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICBFbGYzMl9Xb3JkCXJpX2dwcm1hc2s7CQkvKiBHZW5lcmFsIHJlZ2lzdGVycyB1c2VkICovCisgIEVsZjMyX1dvcmQJcmlfY3BybWFza1s0XTsJCS8qIENvcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkICovCisgIEVsZjMyX1N3b3JkCXJpX2dwX3ZhbHVlOwkJLyogJGdwIHJlZ2lzdGVyIHZhbHVlICovCit9IEVsZjMyX1JlZ0luZm87CisKKy8qIEVudHJpZXMgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19PUFRJT05TLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciBraW5kOwkJLyogRGV0ZXJtaW5lcyBpbnRlcnByZXRhdGlvbiBvZiB0aGUKKwkJCQkgICB2YXJpYWJsZSBwYXJ0IG9mIGRlc2NyaXB0b3IuICAqLworICB1bnNpZ25lZCBjaGFyIHNpemU7CQkvKiBTaXplIG9mIGRlc2NyaXB0b3IsIGluY2x1ZGluZyBoZWFkZXIuICAqLworICBFbGYzMl9TZWN0aW9uIHNlY3Rpb247CS8qIFNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHNlY3Rpb24gYWZmZWN0ZWQsCisJCQkJICAgMCBmb3IgZ2xvYmFsIG9wdGlvbnMuICAqLworICBFbGYzMl9Xb3JkIGluZm87CQkvKiBLaW5kLXNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KK30gRWxmX09wdGlvbnM7CisKKy8qIFZhbHVlcyBmb3IgYGtpbmQnIGZpZWxkIGluIEVsZl9PcHRpb25zLiAgKi8KKworI2RlZmluZSBPREtfTlVMTAkwCS8qIFVuZGVmaW5lZC4gICovCisjZGVmaW5lIE9ES19SRUdJTkZPCTEJLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLworI2RlZmluZSBPREtfRVhDRVBUSU9OUwkyCS8qIEV4Y2VwdGlvbiBwcm9jZXNzaW5nIG9wdGlvbnMuICAqLworI2RlZmluZSBPREtfUEFECQkzCS8qIFNlY3Rpb24gcGFkZGluZyBvcHRpb25zLiAgKi8KKyNkZWZpbmUgT0RLX0hXUEFUQ0gJNAkvKiBIYXJkd2FyZSB3b3JrYXJvdW5kcyBwZXJmb3JtZWQgKi8KKyNkZWZpbmUgT0RLX0ZJTEwJNQkvKiByZWNvcmQgdGhlIGZpbGwgdmFsdWUgdXNlZCBieSB0aGUgbGlua2VyLiAqLworI2RlZmluZSBPREtfVEFHUwk2CS8qIHJlc2VydmUgc3BhY2UgZm9yIGRlc2t0b3AgdG9vbHMgdG8gd3JpdGUuICovCisjZGVmaW5lIE9ES19IV0FORAk3CS8qIEhXIHdvcmthcm91bmRzLiAgJ0FORCcgYml0cyB3aGVuIG1lcmdpbmcuICovCisjZGVmaW5lIE9ES19IV09SCTgJLyogSFcgd29ya2Fyb3VuZHMuICAnT1InIGJpdHMgd2hlbiBtZXJnaW5nLiAgKi8KKworLyogVmFsdWVzIGZvciBgaW5mbycgaW4gRWxmX09wdGlvbnMgZm9yIE9ES19FWENFUFRJT05TIGVudHJpZXMuICAqLworCisjZGVmaW5lIE9FWF9GUFVfTUlOCTB4MWYJLyogRlBFJ3Mgd2hpY2ggTVVTVCBiZSBlbmFibGVkLiAgKi8KKyNkZWZpbmUgT0VYX0ZQVV9NQVgJMHgxZjAwCS8qIEZQRSdzIHdoaWNoIE1BWSBiZSBlbmFibGVkLiAgKi8KKyNkZWZpbmUgT0VYX1BBR0UwCTB4MTAwMDAJLyogcGFnZSB6ZXJvIG11c3QgYmUgbWFwcGVkLiAgKi8KKyNkZWZpbmUgT0VYX1NNTQkJMHgyMDAwMAkvKiBGb3JjZSBzZXF1ZW50aWFsIG1lbW9yeSBtb2RlPyAgKi8KKyNkZWZpbmUgT0VYX0ZQREJVRwkweDQwMDAwCS8qIEZvcmNlIGZsb2F0aW5nIHBvaW50IGRlYnVnIG1vZGU/ICAqLworI2RlZmluZSBPRVhfUFJFQ0lTRUZQCU9FWF9GUERCVUcKKyNkZWZpbmUgT0VYX0RJU01JU1MJMHg4MDAwMAkvKiBEaXNtaXNzIGludmFsaWQgYWRkcmVzcyBmYXVsdHM/ICAqLworCisjZGVmaW5lIE9FWF9GUFVfSU5WQUwJMHgxMAorI2RlZmluZSBPRVhfRlBVX0RJVjAJMHgwOAorI2RlZmluZSBPRVhfRlBVX09GTE8JMHgwNAorI2RlZmluZSBPRVhfRlBVX1VGTE8JMHgwMgorI2RlZmluZSBPRVhfRlBVX0lORVgJMHgwMQorCisvKiBNYXNrcyBmb3IgYGluZm8nIGluIEVsZl9PcHRpb25zIGZvciBhbiBPREtfSFdQQVRDSCBlbnRyeS4gICovCisKKyNkZWZpbmUgT0hXX1I0S0VPUAkweDEJLyogUjQwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLworI2RlZmluZSBPSFdfUjhLUEZFVENICTB4MgkvKiBtYXkgbmVlZCBSODAwMCBwcmVmZXRjaCBwYXRjaC4gICovCisjZGVmaW5lIE9IV19SNUtFT1AJMHg0CS8qIFI1MDAwIGVuZC1vZi1wYWdlIHBhdGNoLiAgKi8KKyNkZWZpbmUgT0hXX1I1S0NWVEwJMHg4CS8qIFI1MDAwIGN2dC5bZHNdLmwgYnVnLiAgY2xlYW49MS4gICovCisKKyNkZWZpbmUgT1BBRF9QUkVGSVgJMHgxCisjZGVmaW5lIE9QQURfUE9TVEZJWAkweDIKKyNkZWZpbmUgT1BBRF9TWU1CT0wJMHg0CisKKy8qIEVudHJ5IGZvdW5kIGluIGAub3B0aW9ucycgc2VjdGlvbi4gICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEVsZjMyX1dvcmQgaHdwX2ZsYWdzMTsJLyogRXh0cmEgZmxhZ3MuICAqLworICBFbGYzMl9Xb3JkIGh3cF9mbGFnczI7CS8qIEV4dHJhIGZsYWdzLiAgKi8KK30gRWxmX09wdGlvbnNfSHc7CisKKy8qIE1hc2tzIGZvciBgaW5mbycgaW4gRWxmT3B0aW9ucyBmb3IgT0RLX0hXQU5EIGFuZCBPREtfSFdPUiBlbnRyaWVzLiAgKi8KKworI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0hFQ0tFRAkweDAwMDAwMDAxCisjZGVmaW5lIE9IV0ExX1I0S0VPUF9DTEVBTgkweDAwMDAwMDAyCisKKy8qIE1JUFMgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSX01JUFNfTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX01JUFNfMTYJCTEJLyogRGlyZWN0IDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfMzIJCTIJLyogRGlyZWN0IDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfUkVMMzIJCTMJLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU18yNgkJNAkvKiBEaXJlY3QgMjYgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9NSVBTX0hJMTYJCTUJLyogSGlnaCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX0xPMTYJCTYJLyogTG93IDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfR1BSRUwxNgkJNwkvKiBHUCByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX0xJVEVSQUwJCTgJLyogMTYgYml0IGxpdGVyYWwgZW50cnkgKi8KKyNkZWZpbmUgUl9NSVBTX0dPVDE2CQk5CS8qIDE2IGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9NSVBTX1BDMTYJCTEwCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX01JUFNfQ0FMTDE2CQkxMQkvKiAxNiBiaXQgR09UIGVudHJ5IGZvciBmdW5jdGlvbiAqLworI2RlZmluZSBSX01JUFNfR1BSRUwzMgkJMTIJLyogR1AgcmVsYXRpdmUgMzIgYml0ICovCisKKyNkZWZpbmUgUl9NSVBTX1NISUZUNQkJMTYKKyNkZWZpbmUgUl9NSVBTX1NISUZUNgkJMTcKKyNkZWZpbmUgUl9NSVBTXzY0CQkxOAorI2RlZmluZSBSX01JUFNfR09UX0RJU1AJCTE5CisjZGVmaW5lIFJfTUlQU19HT1RfUEFHRQkJMjAKKyNkZWZpbmUgUl9NSVBTX0dPVF9PRlNUCQkyMQorI2RlZmluZSBSX01JUFNfR09UX0hJMTYJCTIyCisjZGVmaW5lIFJfTUlQU19HT1RfTE8xNgkJMjMKKyNkZWZpbmUgUl9NSVBTX1NVQgkJMjQKKyNkZWZpbmUgUl9NSVBTX0lOU0VSVF9BCQkyNQorI2RlZmluZSBSX01JUFNfSU5TRVJUX0IJCTI2CisjZGVmaW5lIFJfTUlQU19ERUxFVEUJCTI3CisjZGVmaW5lIFJfTUlQU19ISUdIRVIJCTI4CisjZGVmaW5lIFJfTUlQU19ISUdIRVNUCQkyOQorI2RlZmluZSBSX01JUFNfQ0FMTF9ISTE2CTMwCisjZGVmaW5lIFJfTUlQU19DQUxMX0xPMTYJMzEKKyNkZWZpbmUgUl9NSVBTX1NDTl9ESVNQCQkzMgorI2RlZmluZSBSX01JUFNfUkVMMTYJCTMzCisjZGVmaW5lIFJfTUlQU19BRERfSU1NRURJQVRFCTM0CisjZGVmaW5lIFJfTUlQU19QSlVNUAkJMzUKKyNkZWZpbmUgUl9NSVBTX1JFTEdPVAkJMzYKKyNkZWZpbmUgUl9NSVBTX0pBTFIJCTM3CisjZGVmaW5lIFJfTUlQU19UTFNfRFRQTU9EMzIJMzgJLyogTW9kdWxlIG51bWJlciAzMiBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19EVFBSRUwzMgkzOQkvKiBNb2R1bGUtcmVsYXRpdmUgb2Zmc2V0IDMyIGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX0RUUE1PRDY0CTQwCS8qIE1vZHVsZSBudW1iZXIgNjQgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMNjQJNDEJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19HRAkJNDIJLyogMTYgYml0IEdPVCBvZmZzZXQgZm9yIEdEICovCisjZGVmaW5lIFJfTUlQU19UTFNfTERNCQk0MwkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgTERNICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMX0hJMTYJNDQJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCwgaGlnaCAxNiBiaXRzICovCisjZGVmaW5lIFJfTUlQU19UTFNfRFRQUkVMX0xPMTYJNDUJLyogTW9kdWxlLXJlbGF0aXZlIG9mZnNldCwgbG93IDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19HT1RUUFJFTAk0NgkvKiAxNiBiaXQgR09UIG9mZnNldCBmb3IgSUUgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTDMyCTQ3CS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgMzIgYml0ICovCisjZGVmaW5lIFJfTUlQU19UTFNfVFBSRUw2NAk0OAkvKiBUUC1yZWxhdGl2ZSBvZmZzZXQsIDY0IGJpdCAqLworI2RlZmluZSBSX01JUFNfVExTX1RQUkVMX0hJMTYJNDkJLyogVFAtcmVsYXRpdmUgb2Zmc2V0LCBoaWdoIDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9NSVBTX1RMU19UUFJFTF9MTzE2CTUwCS8qIFRQLXJlbGF0aXZlIG9mZnNldCwgbG93IDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9NSVBTX0dMT0JfREFUCQk1MQorLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NSVBTX05VTQkJNTIKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX3R5cGUgZmllbGQgb2YgRWxmMzJfUGhkci4gICovCisKKyNkZWZpbmUgUFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDAJLyogUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFRfTUlQU19SVFBST0MgIDB4NzAwMDAwMDEJLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUuICovCisjZGVmaW5lIFBUX01JUFNfT1BUSU9OUyAweDcwMDAwMDAyCisKKy8qIFNwZWNpYWwgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuICAqLworCisjZGVmaW5lIFBGX01JUFNfTE9DQUwJMHgxMDAwMDAwMAorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIGZpZWxkIG9mIEVsZjMyX0R5bi4gICovCisKKyNkZWZpbmUgRFRfTUlQU19STERfVkVSU0lPTiAgMHg3MDAwMDAwMQkvKiBSdW50aW1lIGxpbmtlciBpbnRlcmZhY2UgdmVyc2lvbiAqLworI2RlZmluZSBEVF9NSVBTX1RJTUVfU1RBTVAgICAweDcwMDAwMDAyCS8qIFRpbWVzdGFtcCAqLworI2RlZmluZSBEVF9NSVBTX0lDSEVDS1NVTSAgICAweDcwMDAwMDAzCS8qIENoZWNrc3VtICovCisjZGVmaW5lIERUX01JUFNfSVZFUlNJT04gICAgIDB4NzAwMDAwMDQJLyogVmVyc2lvbiBzdHJpbmcgKHN0cmluZyB0YmwgaW5kZXgpICovCisjZGVmaW5lIERUX01JUFNfRkxBR1MJICAgICAweDcwMDAwMDA1CS8qIEZsYWdzICovCisjZGVmaW5lIERUX01JUFNfQkFTRV9BRERSRVNTIDB4NzAwMDAwMDYJLyogQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIERUX01JUFNfTVNZTQkgICAgIDB4NzAwMDAwMDcKKyNkZWZpbmUgRFRfTUlQU19DT05GTElDVCAgICAgMHg3MDAwMDAwOAkvKiBBZGRyZXNzIG9mIENPTkZMSUNUIHNlY3Rpb24gKi8KKyNkZWZpbmUgRFRfTUlQU19MSUJMSVNUCSAgICAgMHg3MDAwMDAwOQkvKiBBZGRyZXNzIG9mIExJQkxJU1Qgc2VjdGlvbiAqLworI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVE5PICAweDcwMDAwMDBhCS8qIE51bWJlciBvZiBsb2NhbCBHT1QgZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX0NPTkZMSUNUTk8gICAweDcwMDAwMDBiCS8qIE51bWJlciBvZiBDT05GTElDVCBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfTElCTElTVE5PICAgIDB4NzAwMDAwMTAJLyogTnVtYmVyIG9mIExJQkxJU1QgZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX1NZTVRBQk5PICAgICAweDcwMDAwMDExCS8qIE51bWJlciBvZiBEWU5TWU0gZW50cmllcyAqLworI2RlZmluZSBEVF9NSVBTX1VOUkVGRVhUTk8gICAweDcwMDAwMDEyCS8qIEZpcnN0IGV4dGVybmFsIERZTlNZTSAqLworI2RlZmluZSBEVF9NSVBTX0dPVFNZTQkgICAgIDB4NzAwMDAwMTMJLyogRmlyc3QgR09UIGVudHJ5IGluIERZTlNZTSAqLworI2RlZmluZSBEVF9NSVBTX0hJUEFHRU5PICAgICAweDcwMDAwMDE0CS8qIE51bWJlciBvZiBHT1QgcGFnZSB0YWJsZSBlbnRyaWVzICovCisjZGVmaW5lIERUX01JUFNfUkxEX01BUAkgICAgIDB4NzAwMDAwMTYJLyogQWRkcmVzcyBvZiBydW4gdGltZSBsb2FkZXIgbWFwLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTUyAgMHg3MDAwMDAxNwkvKiBEZWx0YSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfQ0xBU1NfTk8gICAgMHg3MDAwMDAxOCAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkJRFRfTUlQU19ERUxUQV9DTEFTUy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0UgICAgMHg3MDAwMDAxOSAvKiBEZWx0YSBDKysgY2xhc3MgaW5zdGFuY2VzLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTyAweDcwMDAwMDFhIC8qIE51bWJlciBvZiBlbnRyaWVzIGluCisJCQkJCQlEVF9NSVBTX0RFTFRBX0lOU1RBTkNFLiAgKi8KKyNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQyAgMHg3MDAwMDAxYiAvKiBEZWx0YSByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfUkVMT0NfTk8gMHg3MDAwMDAxYyAvKiBOdW1iZXIgb2YgZW50cmllcyBpbgorCQkJCQkgICAgIERUX01JUFNfREVMVEFfUkVMT0MuICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX1NZTSAgICAweDcwMDAwMDFkIC8qIERlbHRhIHN5bWJvbHMgdGhhdCBEZWx0YQorCQkJCQkgICByZWxvY2F0aW9ucyByZWZlciB0by4gICovCisjZGVmaW5lIERUX01JUFNfREVMVEFfU1lNX05PIDB4NzAwMDAwMWUgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJICAgRFRfTUlQU19ERUxUQV9TWU0uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNIDB4NzAwMDAwMjAgLyogRGVsdGEgc3ltYm9scyB0aGF0IGhvbGQgdGhlCisJCQkJCSAgICAgY2xhc3MgZGVjbGFyYXRpb24uICAqLworI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05PIDB4NzAwMDAwMjEgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4KKwkJCQkJCURUX01JUFNfREVMVEFfQ0xBU1NTWU0uICAqLworI2RlZmluZSBEVF9NSVBTX0NYWF9GTEFHUyAgICAweDcwMDAwMDIyIC8qIEZsYWdzIGluZGljYXRpbmcgZm9yIEMrKyBmbGF2b3IuICAqLworI2RlZmluZSBEVF9NSVBTX1BJWElFX0lOSVQgICAweDcwMDAwMDIzCisjZGVmaW5lIERUX01JUFNfU1lNQk9MX0xJQiAgIDB4NzAwMDAwMjQKKyNkZWZpbmUgRFRfTUlQU19MT0NBTFBBR0VfR09USURYIDB4NzAwMDAwMjUKKyNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1RJRFggMHg3MDAwMDAyNgorI2RlZmluZSBEVF9NSVBTX0hJRERFTl9HT1RJRFggMHg3MDAwMDAyNworI2RlZmluZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFggMHg3MDAwMDAyOAorI2RlZmluZSBEVF9NSVBTX09QVElPTlMJICAgICAweDcwMDAwMDI5IC8qIEFkZHJlc3Mgb2YgLm9wdGlvbnMuICAqLworI2RlZmluZSBEVF9NSVBTX0lOVEVSRkFDRSAgICAweDcwMDAwMDJhIC8qIEFkZHJlc3Mgb2YgLmludGVyZmFjZS4gICovCisjZGVmaW5lIERUX01JUFNfRFlOU1RSX0FMSUdOIDB4NzAwMDAwMmIKKyNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0VfU0laRSAweDcwMDAwMDJjIC8qIFNpemUgb2YgdGhlIC5pbnRlcmZhY2Ugc2VjdGlvbi4gKi8KKyNkZWZpbmUgRFRfTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIgMHg3MDAwMDAyZCAvKiBBZGRyZXNzIG9mIHJsZF90ZXh0X3Jzb2x2ZQorCQkJCQkJICAgIGZ1bmN0aW9uIHN0b3JlZCBpbiBHT1QuICAqLworI2RlZmluZSBEVF9NSVBTX1BFUkZfU1VGRklYICAweDcwMDAwMDJlIC8qIERlZmF1bHQgc3VmZml4IG9mIGRzbyB0byBiZSBhZGRlZAorCQkJCQkgICBieSBybGQgb24gZGxvcGVuKCkgY2FsbHMuICAqLworI2RlZmluZSBEVF9NSVBTX0NPTVBBQ1RfU0laRSAweDcwMDAwMDJmIC8qIChPMzIpU2l6ZSBvZiBjb21wYWN0IHJlbCBzZWN0aW9uLiAqLworI2RlZmluZSBEVF9NSVBTX0dQX1ZBTFVFICAgICAweDcwMDAwMDMwIC8qIEdQIHZhbHVlIGZvciBhdXggR09Ucy4gICovCisjZGVmaW5lIERUX01JUFNfQVVYX0RZTkFNSUMgIDB4NzAwMDAwMzEgLyogQWRkcmVzcyBvZiBhdXggLmR5bmFtaWMuICAqLworI2RlZmluZSBEVF9NSVBTX05VTQkgICAgIDB4MzIKKworLyogTGVnYWwgdmFsdWVzIGZvciBEVF9NSVBTX0ZMQUdTIEVsZjMyX0R5biBlbnRyeS4gICovCisKKyNkZWZpbmUgUkhGX05PTkUJCSAgIDAJCS8qIE5vIGZsYWdzICovCisjZGVmaW5lIFJIRl9RVUlDS1NUQVJUCQkgICAoMSA8PCAwKQkvKiBVc2UgcXVpY2tzdGFydCAqLworI2RlZmluZSBSSEZfTk9UUE9UCQkgICAoMSA8PCAxKQkvKiBIYXNoIHNpemUgbm90IHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgUkhGX05PX0xJQlJBUllfUkVQTEFDRU1FTlQgKDEgPDwgMikJLyogSWdub3JlIExEX0xJQlJBUllfUEFUSCAqLworI2RlZmluZSBSSEZfTk9fTU9WRQkJICAgKDEgPDwgMykKKyNkZWZpbmUgUkhGX1NHSV9PTkxZCQkgICAoMSA8PCA0KQorI2RlZmluZSBSSEZfR1VBUkFOVEVFX0lOSVQJICAgKDEgPDwgNSkKKyNkZWZpbmUgUkhGX0RFTFRBX0NfUExVU19QTFVTCSAgICgxIDw8IDYpCisjZGVmaW5lIFJIRl9HVUFSQU5URUVfU1RBUlRfSU5JVCAgICgxIDw8IDcpCisjZGVmaW5lIFJIRl9QSVhJRQkJICAgKDEgPDwgOCkKKyNkZWZpbmUgUkhGX0RFRkFVTFRfREVMQVlfTE9BRAkgICAoMSA8PCA5KQorI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJUCSAgICgxIDw8IDEwKQorI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJURUQJICAgKDEgPDwgMTEpCisjZGVmaW5lIFJIRl9DT1JECQkgICAoMSA8PCAxMikKKyNkZWZpbmUgUkhGX05PX1VOUkVTX1VOREVGCSAgICgxIDw8IDEzKQorI2RlZmluZSBSSEZfUkxEX09SREVSX1NBRkUJICAgKDEgPDwgMTQpCisKKy8qIEVudHJpZXMgZm91bmQgaW4gc2VjdGlvbnMgb2YgdHlwZSBTSFRfTUlQU19MSUJMSVNULiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmMzJfV29yZCBsX25hbWU7CQkvKiBOYW1lIChzdHJpbmcgdGFibGUgaW5kZXgpICovCisgIEVsZjMyX1dvcmQgbF90aW1lX3N0YW1wOwkvKiBUaW1lc3RhbXAgKi8KKyAgRWxmMzJfV29yZCBsX2NoZWNrc3VtOwkvKiBDaGVja3N1bSAqLworICBFbGYzMl9Xb3JkIGxfdmVyc2lvbjsJCS8qIEludGVyZmFjZSB2ZXJzaW9uICovCisgIEVsZjMyX1dvcmQgbF9mbGFnczsJCS8qIEZsYWdzICovCit9IEVsZjMyX0xpYjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgRWxmNjRfV29yZCBsX25hbWU7CQkvKiBOYW1lIChzdHJpbmcgdGFibGUgaW5kZXgpICovCisgIEVsZjY0X1dvcmQgbF90aW1lX3N0YW1wOwkvKiBUaW1lc3RhbXAgKi8KKyAgRWxmNjRfV29yZCBsX2NoZWNrc3VtOwkvKiBDaGVja3N1bSAqLworICBFbGY2NF9Xb3JkIGxfdmVyc2lvbjsJCS8qIEludGVyZmFjZSB2ZXJzaW9uICovCisgIEVsZjY0X1dvcmQgbF9mbGFnczsJCS8qIEZsYWdzICovCit9IEVsZjY0X0xpYjsKKworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGxfZmxhZ3MuICAqLworCisjZGVmaW5lIExMX05PTkUJCSAgMAorI2RlZmluZSBMTF9FWEFDVF9NQVRDSAkgICgxIDw8IDApCS8qIFJlcXVpcmUgZXhhY3QgbWF0Y2ggKi8KKyNkZWZpbmUgTExfSUdOT1JFX0lOVF9WRVIgKDEgPDwgMSkJLyogSWdub3JlIGludGVyZmFjZSB2ZXJzaW9uICovCisjZGVmaW5lIExMX1JFUVVJUkVfTUlOT1IgICgxIDw8IDIpCisjZGVmaW5lIExMX0VYUE9SVFMJICAoMSA8PCAzKQorI2RlZmluZSBMTF9ERUxBWV9MT0FECSAgKDEgPDwgNCkKKyNkZWZpbmUgTExfREVMVEEJICAoMSA8PCA1KQorCisvKiBFbnRyaWVzIGZvdW5kIGluIHNlY3Rpb25zIG9mIHR5cGUgU0hUX01JUFNfQ09ORkxJQ1QuICAqLworCit0eXBlZGVmIEVsZjMyX0FkZHIgRWxmMzJfQ29uZmxpY3Q7CisKKworLyogSFBQQSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgZV9mbGFncyBmaWVsZCBvZiBFbGYzMl9FaGRyLiAgKi8KKworI2RlZmluZSBFRl9QQVJJU0NfVFJBUE5JTAkweDAwMDEwMDAwIC8qIFRyYXAgbmlsIHBvaW50ZXIgZGVyZWZlcmVuY2UuICAqLworI2RlZmluZSBFRl9QQVJJU0NfRVhUCQkweDAwMDIwMDAwIC8qIFByb2dyYW0gdXNlcyBhcmNoLiBleHRlbnNpb25zLiAqLworI2RlZmluZSBFRl9QQVJJU0NfTFNCCQkweDAwMDQwMDAwIC8qIFByb2dyYW0gZXhwZWN0cyBsaXR0bGUgZW5kaWFuLiAqLworI2RlZmluZSBFRl9QQVJJU0NfV0lERQkJMHgwMDA4MDAwMCAvKiBQcm9ncmFtIGV4cGVjdHMgd2lkZSBtb2RlLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX05PX0tBQlAJMHgwMDEwMDAwMCAvKiBObyBrZXJuZWwgYXNzaXN0ZWQgYnJhbmNoCisJCQkJCSAgICAgIHByZWRpY3Rpb24uICAqLworI2RlZmluZSBFRl9QQVJJU0NfTEFaWVNXQVAJMHgwMDQwMDAwMCAvKiBBbGxvdyBsYXp5IHN3YXBwaW5nLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0FSQ0gJCTB4MDAwMGZmZmYgLyogQXJjaGl0ZWN0dXJlIHZlcnNpb24uICAqLworCisvKiBEZWZpbmVkIHZhbHVlcyBmb3IgYGVfZmxhZ3MgJiBFRl9QQVJJU0NfQVJDSCcgYXJlOiAgKi8KKworI2RlZmluZSBFRkFfUEFSSVNDXzFfMAkJICAgIDB4MDIwYiAvKiBQQS1SSVNDIDEuMCBiaWctZW5kaWFuLiAgKi8KKyNkZWZpbmUgRUZBX1BBUklTQ18xXzEJCSAgICAweDAyMTAgLyogUEEtUklTQyAxLjEgYmlnLWVuZGlhbi4gICovCisjZGVmaW5lIEVGQV9QQVJJU0NfMl8wCQkgICAgMHgwMjE0IC8qIFBBLVJJU0MgMi4wIGJpZy1lbmRpYW4uICAqLworCisvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5kZWNlcy4gICovCisKKyNkZWZpbmUgU0hOX1BBUklTQ19BTlNJX0NPTU1PTgkweGZmMDAJICAgLyogU2VjdGlvbiBmb3IgdGVuYXRpdmVseSBkZWNsYXJlZAorCQkJCQkgICAgICBzeW1ib2xzIGluIEFOU0kgQy4gICovCisjZGVmaW5lIFNITl9QQVJJU0NfSFVHRV9DT01NT04JMHhmZjAxCSAgIC8qIENvbW1vbiBibG9ja3MgaW4gaHVnZSBtb2RlbC4gICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfdHlwZSBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KKworI2RlZmluZSBTSFRfUEFSSVNDX0VYVAkJMHg3MDAwMDAwMCAvKiBDb250YWlucyBwcm9kdWN0IHNwZWNpZmljIGV4dC4gKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19VTldJTkQJMHg3MDAwMDAwMSAvKiBVbndpbmQgaW5mb3JtYXRpb24uICAqLworI2RlZmluZSBTSFRfUEFSSVNDX0RPQwkJMHg3MDAwMDAwMiAvKiBEZWJ1ZyBpbmZvIGZvciBvcHRpbWl6ZWQgY29kZS4gKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF9mbGFncyBmaWVsZCBvZiBFbGYzMl9TaGRyLiAgKi8KKworI2RlZmluZSBTSEZfUEFSSVNDX1NIT1JUCTB4MjAwMDAwMDAgLyogU2VjdGlvbiB3aXRoIHNob3J0IGFkZHJlc3NpbmcuICovCisjZGVmaW5lIFNIRl9QQVJJU0NfSFVHRQkJMHg0MDAwMDAwMCAvKiBTZWN0aW9uIGZhciBmcm9tIGdwLiAgKi8KKyNkZWZpbmUgU0hGX1BBUklTQ19TQlAJCTB4ODAwMDAwMDAgLyogU3RhdGljIGJyYW5jaCBwcmVkaWN0aW9uIGNvZGUuICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgU1RfVFlQRSBzdWJmaWVsZCBvZiBzdF9pbmZvIChzeW1ib2wgdHlwZSkuICAqLworCisjZGVmaW5lIFNUVF9QQVJJU0NfTUlMTElDT0RFCTEzCS8qIE1pbGxpY29kZSBmdW5jdGlvbiBlbnRyeSBwb2ludC4gICovCisKKyNkZWZpbmUgU1RUX0hQX09QQVFVRQkJKFNUVF9MT09TICsgMHgxKQorI2RlZmluZSBTVFRfSFBfU1RVQgkJKFNUVF9MT09TICsgMHgyKQorCisvKiBIUFBBIHJlbG9jcy4gICovCisKKyNkZWZpbmUgUl9QQVJJU0NfTk9ORQkJMAkvKiBObyByZWxvYy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjMyCQkxCS8qIERpcmVjdCAzMi1iaXQgcmVmZXJlbmNlLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMjFMCQkyCS8qIExlZnQgMjEgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxN1IJCTMJLyogUmlnaHQgMTcgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxN0YJCTQJLyogMTcgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNFIJCTYJLyogUmlnaHQgMTQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDMyCTkJLyogMzItYml0IHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMjFMCTEwCS8qIExlZnQgMjEgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE3UgkxMQkvKiBSaWdodCAxNyBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTdGCTEyCS8qIDE3IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNFIJMTQJLyogUmlnaHQgMTQgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19EUFJFTDIxTAkxOAkvKiBMZWZ0IDIxIGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRFBSRUwxNFIJMjIJLyogUmlnaHQgMTQgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDIxTAkyNgkvKiBHUC1yZWxhdGl2ZSwgbGVmdCAyMSBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNFIJMzAJLyogR1AtcmVsYXRpdmUsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjIxTAkzNAkvKiBMVC1yZWxhdGl2ZSwgbGVmdCAyMSBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYxNFIJMzgJLyogTFQtcmVsYXRpdmUsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUNSRUwzMgk0MQkvKiAzMiBiaXRzIHNlY3Rpb24gcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VHQkFTRQk0OAkvKiBObyByZWxvY2F0aW9uLCBzZXQgc2VnbWVudCBiYXNlLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VHUkVMMzIJNDkJLyogMzIgYml0cyBzZWdtZW50IHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjIxTAk1MAkvKiBQTFQgcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNFIJNTQJLyogUExUIHJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIzMgk1NwkvKiAzMiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcG9pbnRlci4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjIxTAk1OAkvKiBMVC1yZWwuIGZjdCBwdHIsIGxlZnQgMjEgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0Ugk2MgkvKiBMVC1yZWwuIGZjdCBwdHIsIHJpZ2h0IDE0IGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0ZQVFI2NAkJNjQJLyogNjQgYml0cyBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExBQkVMMzIJNjUJLyogMzIgYml0cyBmdW5jdGlvbiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExBQkVMMjFMCTY2CS8qIExlZnQgMjEgYml0cyBvZiBmZGVzYyBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExBQkVMMTRSCTcwCS8qIFJpZ2h0IDE0IGJpdHMgb2YgZmRlc2MgYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMNjQJNzIJLyogNjQgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIyRgk3NAkvKiAyMiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRXUgk3NQkvKiBQQy1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE0RFIJNzYJLyogUEMgcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNkYJNzcJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2V0YJNzgJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2REYJNzkJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVI2NAkJODAJLyogNjQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNFdSCTgzCS8qIDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTREUgk4NAkvKiAxNCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE2RgkJODUJLyogMTYgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNldGCTg2CS8qIDE2IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTZERgk4NwkvKiAxNiBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMNjQJODgJLyogNjQgYml0cyBvZiBHUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE0V1IJOTEJLyogR1AtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNERSCTkyCS8qIEdQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTZGCTkzCS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNldGCTk0CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNkRGCTk1CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkY2NAk5NgkvKiA2NCBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRXUgk5OQkvKiBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE0RFIJMTAwCS8qIExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZGCTEwMQkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZXRgkxMDIJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE2REYJMTAzCS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMNjQJMTA0CS8qIDY0IGJpdHMgc2VjdGlvbiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUdSRUw2NAkxMTIJLyogNjQgYml0cyBzZWdtZW50IHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE0V1IJMTE1CS8qIFBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNERSCTExNgkvKiBQTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTZGCTExNwkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2V0YJMTE4CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2REYJMTE5CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NAkxMjAJLyogNjQgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFdSCTEyMwkvKiBMVC1yZWwuIGZjdC4gcHRyLiwgcmlnaHQgMTQgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIJMTI0CS8qIExULXJlbC4gZmN0LiBwdHIuLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCTEyNQkvKiAxNiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YJMTI2CS8qIDE2IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgkxMjcJLyogMTYgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xPUkVTRVJWRQkxMjgKKyNkZWZpbmUgUl9QQVJJU0NfQ09QWQkJMTI4CS8qIENvcHkgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIFJfUEFSSVNDX0lQTFQJCTEyOQkvKiBEeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRVBMVAkJMTMwCS8qIER5bmFtaWMgcmVsb2MsIGV4cG9ydGVkIFBMVCAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDMyCTE1MwkvKiAzMiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMjFMCTE1NAkvKiBUUC1yZWwuIGFkZHJlc3MsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTRSCTE1OAkvKiBUUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDIxTAkxNjIJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRSCTE2NgkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNEYJMTY3CS8qIDE0IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUw2NAkyMTYJLyogNjQgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE0V1IJMjE5CS8qIFRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTREUgkyMjAJLyogVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNkYJMjIxCS8qIDE2IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNldGCTIyMgkvKiAxNiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTZERgkyMjMJLyogMTYgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDY0CTIyNAkvKiA2NCBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUgkyMjcJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTREUgkyMjgJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZGCTIyOQkvKiAxNiBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRgkyMzAJLyogMTYgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE2REYJMjMxCS8qIDE2IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR05VX1ZURU5UUlkJMjMyCisjZGVmaW5lIFJfUEFSSVNDX0dOVV9WVElOSEVSSVQJMjMzCisjZGVmaW5lIFJfUEFSSVNDX1RMU19HRDIxTAkyMzQJLyogR0QgMjEtYml0IGxlZnQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfR0QxNFIJMjM1CS8qIEdEIDE0LWJpdCByaWdodC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19HRENBTEwJMjM2CS8qIEdEIGNhbGwgdG8gX190X2dfYS4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRE0yMUwJMjM3CS8qIExEIG1vZHVsZSAyMS1iaXQgbGVmdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRE0xNFIJMjM4CS8qIExEIG1vZHVsZSAxNC1iaXQgcmlnaHQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfTERNQ0FMTAkyMzkJLyogTEQgbW9kdWxlIGNhbGwgdG8gX190X2dfYS4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRE8yMUwJMjQwCS8qIExEIG9mZnNldCAyMS1iaXQgbGVmdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRE8xNFIJMjQxCS8qIExEIG9mZnNldCAxNC1iaXQgcmlnaHQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfRFRQTU9EMzIJMjQyCS8qIERUUCBtb2R1bGUgMzItYml0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0RUUE1PRDY0CTI0MwkvKiBEVFAgbW9kdWxlIDY0LWJpdC4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RMU19EVFBPRkYzMgkyNDQJLyogRFRQIG9mZnNldCAzMi1iaXQuICAqLworI2RlZmluZSBSX1BBUklTQ19UTFNfRFRQT0ZGNjQJMjQ1CS8qIERUUCBvZmZzZXQgMzItYml0LiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVExTX0xFMjFMCVJfUEFSSVNDX1RQUkVMMjFMCisjZGVmaW5lIFJfUEFSSVNDX1RMU19MRTE0UglSX1BBUklTQ19UUFJFTDE0UgorI2RlZmluZSBSX1BBUklTQ19UTFNfSUUyMUwJUl9QQVJJU0NfTFRPRkZfVFAyMUwKKyNkZWZpbmUgUl9QQVJJU0NfVExTX0lFMTRSCVJfUEFSSVNDX0xUT0ZGX1RQMTRSCisjZGVmaW5lIFJfUEFSSVNDX1RMU19UUFJFTDMyCVJfUEFSSVNDX1RQUkVMMzIKKyNkZWZpbmUgUl9QQVJJU0NfVExTX1RQUkVMNjQJUl9QQVJJU0NfVFBSRUw2NAorI2RlZmluZSBSX1BBUklTQ19ISVJFU0VSVkUJMjU1CisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgcF90eXBlIGZpZWxkIG9mIEVsZjMyX1BoZHIvRWxmNjRfUGhkci4gICovCisKKyNkZWZpbmUgUFRfSFBfVExTCQkoUFRfTE9PUyArIDB4MCkKKyNkZWZpbmUgUFRfSFBfQ09SRV9OT05FCQkoUFRfTE9PUyArIDB4MSkKKyNkZWZpbmUgUFRfSFBfQ09SRV9WRVJTSU9OCShQVF9MT09TICsgMHgyKQorI2RlZmluZSBQVF9IUF9DT1JFX0tFUk5FTAkoUFRfTE9PUyArIDB4MykKKyNkZWZpbmUgUFRfSFBfQ09SRV9DT01NCQkoUFRfTE9PUyArIDB4NCkKKyNkZWZpbmUgUFRfSFBfQ09SRV9QUk9DCQkoUFRfTE9PUyArIDB4NSkKKyNkZWZpbmUgUFRfSFBfQ09SRV9MT0FEQUJMRQkoUFRfTE9PUyArIDB4NikKKyNkZWZpbmUgUFRfSFBfQ09SRV9TVEFDSwkoUFRfTE9PUyArIDB4NykKKyNkZWZpbmUgUFRfSFBfQ09SRV9TSE0JCShQVF9MT09TICsgMHg4KQorI2RlZmluZSBQVF9IUF9DT1JFX01NRgkJKFBUX0xPT1MgKyAweDkpCisjZGVmaW5lIFBUX0hQX1BBUkFMTEVMCQkoUFRfTE9PUyArIDB4MTApCisjZGVmaW5lIFBUX0hQX0ZBU1RCSU5ECQkoUFRfTE9PUyArIDB4MTEpCisjZGVmaW5lIFBUX0hQX09QVF9BTk5PVAkJKFBUX0xPT1MgKyAweDEyKQorI2RlZmluZSBQVF9IUF9IU0xfQU5OT1QJCShQVF9MT09TICsgMHgxMykKKyNkZWZpbmUgUFRfSFBfU1RBQ0sJCShQVF9MT09TICsgMHgxNCkKKworI2RlZmluZSBQVF9QQVJJU0NfQVJDSEVYVAkweDcwMDAwMDAwCisjZGVmaW5lIFBUX1BBUklTQ19VTldJTkQJMHg3MDAwMDAwMQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfZmxhZ3MgZmllbGQgb2YgRWxmMzJfUGhkci9FbGY2NF9QaGRyLiAgKi8KKworI2RlZmluZSBQRl9QQVJJU0NfU0JQCQkweDA4MDAwMDAwCisKKyNkZWZpbmUgUEZfSFBfUEFHRV9TSVpFCQkweDAwMTAwMDAwCisjZGVmaW5lIFBGX0hQX0ZBUl9TSEFSRUQJMHgwMDIwMDAwMAorI2RlZmluZSBQRl9IUF9ORUFSX1NIQVJFRAkweDAwNDAwMDAwCisjZGVmaW5lIFBGX0hQX0NPREUJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUEZfSFBfTU9ESUZZCQkweDAyMDAwMDAwCisjZGVmaW5lIFBGX0hQX0xBWllTV0FQCQkweDA0MDAwMDAwCisjZGVmaW5lIFBGX0hQX1NCUAkJMHgwODAwMDAwMAorCisKKy8qIEFscGhhIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBlX2ZsYWdzIGZpZWxkIG9mIEVsZjY0X0VoZHIuICAqLworCisjZGVmaW5lIEVGX0FMUEhBXzMyQklUCQkxCS8qIEFsbCBhZGRyZXNzZXMgbXVzdCBiZSA8IDJHQi4gICovCisjZGVmaW5lIEVGX0FMUEhBX0NBTlJFTEFYCTIJLyogUmVsb2NhdGlvbnMgZm9yIHJlbGF4aW5nIGV4aXN0LiAgKi8KKworLyogTGVnYWwgdmFsdWVzIGZvciBzaF90eXBlIGZpZWxkIG9mIEVsZjY0X1NoZHIuICAqLworCisvKiBUaGVzZSB0d28gYXJlIHByaW1lcmlseSBjb25jZXJuZWQgd2l0aCBFQ09GRiBkZWJ1Z2dpbmcgaW5mby4gICovCisjZGVmaW5lIFNIVF9BTFBIQV9ERUJVRwkJMHg3MDAwMDAwMQorI2RlZmluZSBTSFRfQUxQSEFfUkVHSU5GTwkweDcwMDAwMDAyCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmNjRfU2hkci4gICovCisKKyNkZWZpbmUgU0hGX0FMUEhBX0dQUkVMCQkweDEwMDAwMDAwCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc3Rfb3RoZXIgZmllbGQgb2YgRWxmNjRfU3ltLiAgKi8KKyNkZWZpbmUgU1RPX0FMUEhBX05PUFYJCTB4ODAJLyogTm8gUFYgcmVxdWlyZWQuICAqLworI2RlZmluZSBTVE9fQUxQSEFfU1REX0dQTE9BRAkweDg4CS8qIFBWIG9ubHkgdXNlZCBmb3IgaW5pdGlhbCBsZGdwLiAgKi8KKworLyogQWxwaGEgcmVsb2NzLiAgKi8KKworI2RlZmluZSBSX0FMUEhBX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9BTFBIQV9SRUZMT05HCQkxCS8qIERpcmVjdCAzMiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9SRUZRVUFECQkyCS8qIERpcmVjdCA2NCBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUFJFTDMyCQkzCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0xJVEVSQUwJCTQJLyogR1AgcmVsYXRpdmUgMTYgYml0IHcvb3B0aW1pemF0aW9uICovCisjZGVmaW5lIFJfQUxQSEFfTElUVVNFCQk1CS8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCisjZGVmaW5lIFJfQUxQSEFfR1BESVNQCQk2CS8qIEFkZCBkaXNwbGFjZW1lbnQgdG8gR1AgKi8KKyNkZWZpbmUgUl9BTFBIQV9CUkFERFIJCTcJLyogUEMrNCByZWxhdGl2ZSAyMyBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX0FMUEhBX0hJTlQJCTgJLyogUEMrNCByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLworI2RlZmluZSBSX0FMUEhBX1NSRUwxNgkJOQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KKyNkZWZpbmUgUl9BTFBIQV9TUkVMMzIJCTEwCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX0FMUEhBX1NSRUw2NAkJMTEJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUxISUdICTE3CS8qIEdQIHJlbGF0aXZlIDMyIGJpdCwgaGlnaCAxNiBiaXRzICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUxMT1cJMTgJLyogR1AgcmVsYXRpdmUgMzIgYml0LCBsb3cgMTYgYml0cyAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMMTYJCTE5CS8qIEdQIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0NPUFkJCTI0CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9BTFBIQV9HTE9CX0RBVAkyNQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfQUxQSEFfSk1QX1NMT1QJMjYJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX0FMUEhBX1JFTEFUSVZFCTI3CS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9BTFBIQV9UTFNfR0RfSEkJMjgKKyNkZWZpbmUgUl9BTFBIQV9UTFNHRAkJMjkKKyNkZWZpbmUgUl9BTFBIQV9UTFNfTERNCQkzMAorI2RlZmluZSBSX0FMUEhBX0RUUE1PRDY0CTMxCisjZGVmaW5lIFJfQUxQSEFfR09URFRQUkVMCTMyCisjZGVmaW5lIFJfQUxQSEFfRFRQUkVMNjQJMzMKKyNkZWZpbmUgUl9BTFBIQV9EVFBSRUxISQkzNAorI2RlZmluZSBSX0FMUEhBX0RUUFJFTExPCTM1CisjZGVmaW5lIFJfQUxQSEFfRFRQUkVMMTYJMzYKKyNkZWZpbmUgUl9BTFBIQV9HT1RUUFJFTAkzNworI2RlZmluZSBSX0FMUEhBX1RQUkVMNjQJCTM4CisjZGVmaW5lIFJfQUxQSEFfVFBSRUxISQkJMzkKKyNkZWZpbmUgUl9BTFBIQV9UUFJFTExPCQk0MAorI2RlZmluZSBSX0FMUEhBX1RQUkVMMTYJCTQxCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX0FMUEhBX05VTQkJNDYKKworLyogTWFnaWMgdmFsdWVzIG9mIHRoZSBMSVRVU0UgcmVsb2NhdGlvbiBhZGRlbmQuICAqLworI2RlZmluZSBMSVRVU0VfQUxQSEFfQUREUgkwCisjZGVmaW5lIExJVFVTRV9BTFBIQV9CQVNFCTEKKyNkZWZpbmUgTElUVVNFX0FMUEhBX0JZVE9GRgkyCisjZGVmaW5lIExJVFVTRV9BTFBIQV9KU1IJMworI2RlZmluZSBMSVRVU0VfQUxQSEFfVExTX0dECTQKKyNkZWZpbmUgTElUVVNFX0FMUEhBX1RMU19MRE0JNQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGRfdGFnIG9mIEVsZjY0X0R5bi4gICovCisjZGVmaW5lIERUX0FMUEhBX1BMVFJPCQkoRFRfTE9QUk9DICsgMCkKKyNkZWZpbmUgRFRfQUxQSEFfTlVNCQkxCisKKy8qIFBvd2VyUEMgc3BlY2lmaWMgZGVjbGFyYXRpb25zICovCisKKy8qIFZhbHVlcyBmb3IgRWxmMzIvNjRfRWhkci5lX2ZsYWdzLiAgKi8KKyNkZWZpbmUgRUZfUFBDX0VNQgkJMHg4MDAwMDAwMAkvKiBQb3dlclBDIGVtYmVkZGVkIGZsYWcgKi8KKworLyogQ3lnbnVzIGxvY2FsIGJpdHMgYmVsb3cgKi8KKyNkZWZpbmUgRUZfUFBDX1JFTE9DQVRBQkxFCTB4MDAwMTAwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlIGZsYWcqLworI2RlZmluZSBFRl9QUENfUkVMT0NBVEFCTEVfTElCCTB4MDAwMDgwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlLWxpYgorCQkJCQkJICAgZmxhZyAqLworCisvKiBQb3dlclBDIHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KKyNkZWZpbmUgUl9QUENfTk9ORQkJMAorI2RlZmluZSBSX1BQQ19BRERSMzIJCTEJLyogMzJiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQ19BRERSMjQJCTIJLyogMjZiaXQgYWRkcmVzcywgMiBiaXRzIGlnbm9yZWQuICAqLworI2RlZmluZSBSX1BQQ19BRERSMTYJCTMJLyogMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQ19BRERSMTZfTE8JCTQJLyogbG93ZXIgMTZiaXQgb2YgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQ19BRERSMTZfSEkJCTUJLyogaGlnaCAxNmJpdCBvZiBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIxNl9IQQkJNgkvKiBhZGp1c3RlZCBoaWdoIDE2Yml0ICovCisjZGVmaW5lIFJfUFBDX0FERFIxNAkJNwkvKiAxNmJpdCBhZGRyZXNzLCAyIGJpdHMgaWdub3JlZCAqLworI2RlZmluZSBSX1BQQ19BRERSMTRfQlJUQUtFTgk4CisjZGVmaW5lIFJfUFBDX0FERFIxNF9CUk5UQUtFTgk5CisjZGVmaW5lIFJfUFBDX1JFTDI0CQkxMAkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfUkVMMTQJCTExCS8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQ19SRUwxNF9CUlRBS0VOCTEyCisjZGVmaW5lIFJfUFBDX1JFTDE0X0JSTlRBS0VOCTEzCisjZGVmaW5lIFJfUFBDX0dPVDE2CQkxNAorI2RlZmluZSBSX1BQQ19HT1QxNl9MTwkJMTUKKyNkZWZpbmUgUl9QUENfR09UMTZfSEkJCTE2CisjZGVmaW5lIFJfUFBDX0dPVDE2X0hBCQkxNworI2RlZmluZSBSX1BQQ19QTFRSRUwyNAkJMTgKKyNkZWZpbmUgUl9QUENfQ09QWQkJMTkKKyNkZWZpbmUgUl9QUENfR0xPQl9EQVQJCTIwCisjZGVmaW5lIFJfUFBDX0pNUF9TTE9UCQkyMQorI2RlZmluZSBSX1BQQ19SRUxBVElWRQkJMjIKKyNkZWZpbmUgUl9QUENfTE9DQUwyNFBDCQkyMworI2RlZmluZSBSX1BQQ19VQUREUjMyCQkyNAorI2RlZmluZSBSX1BQQ19VQUREUjE2CQkyNQorI2RlZmluZSBSX1BQQ19SRUwzMgkJMjYKKyNkZWZpbmUgUl9QUENfUExUMzIJCTI3CisjZGVmaW5lIFJfUFBDX1BMVFJFTDMyCQkyOAorI2RlZmluZSBSX1BQQ19QTFQxNl9MTwkJMjkKKyNkZWZpbmUgUl9QUENfUExUMTZfSEkJCTMwCisjZGVmaW5lIFJfUFBDX1BMVDE2X0hBCQkzMQorI2RlZmluZSBSX1BQQ19TREFSRUwxNgkJMzIKKyNkZWZpbmUgUl9QUENfU0VDVE9GRgkJMzMKKyNkZWZpbmUgUl9QUENfU0VDVE9GRl9MTwkzNAorI2RlZmluZSBSX1BQQ19TRUNUT0ZGX0hJCTM1CisjZGVmaW5lIFJfUFBDX1NFQ1RPRkZfSEEJMzYKKworLyogUG93ZXJQQyByZWxvY2F0aW9ucyBkZWZpbmVkIGZvciB0aGUgVExTIGFjY2VzcyBBQkkuICAqLworI2RlZmluZSBSX1BQQ19UTFMJCTY3IC8qIG5vbmUJKHN5bSthZGQpQHRscyAqLworI2RlZmluZSBSX1BQQ19EVFBNT0QzMgkJNjggLyogd29yZDMyCShzeW0rYWRkKUBkdHBtb2QgKi8KKyNkZWZpbmUgUl9QUENfVFBSRUwxNgkJNjkgLyogaGFsZjE2Kgkoc3ltK2FkZClAdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfVFBSRUwxNl9MTwk3MCAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUENfVFBSRUwxNl9ISQk3MSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUENfVFBSRUwxNl9IQQk3MiAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDX1RQUkVMMzIJCTczIC8qIHdvcmQzMgkoc3ltK2FkZClAdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfRFRQUkVMMTYJCTc0IC8qIGhhbGYxNioJKHN5bSthZGQpQGR0cHJlbCAqLworI2RlZmluZSBSX1BQQ19EVFBSRUwxNl9MTwk3NSAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDX0RUUFJFTDE2X0hJCTc2IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUENfRFRQUkVMMTZfSEEJNzcgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUENfRFRQUkVMMzIJCTc4IC8qIHdvcmQzMgkoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2CTc5IC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNnZCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTR0QxNl9MTwk4MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBsICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNHRDE2X0hJCTgxIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGggKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0dEMTZfSEEJODIgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAaGEgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTYJODMgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRsc2xkICovCisjZGVmaW5lIFJfUFBDX0dPVF9UTFNMRDE2X0xPCTg0IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGwgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RMU0xEMTZfSEkJODUgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaCAqLworI2RlZmluZSBSX1BQQ19HT1RfVExTTEQxNl9IQQk4NiAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBoYSAqLworI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNgk4NyAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAdHByZWwgKi8KKyNkZWZpbmUgUl9QUENfR09UX1RQUkVMMTZfTE8JODggLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQ19HT1RfVFBSRUwxNl9ISQk4OSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoICovCisjZGVmaW5lIFJfUFBDX0dPVF9UUFJFTDE2X0hBCTkwIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGhhICovCisjZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNgk5MSAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDX0dPVF9EVFBSRUwxNl9MTwk5MiAvKiBoYWxmMTYqCShzeW0rYWRkKUBnb3RAZHRwcmVsQGwgKi8KKyNkZWZpbmUgUl9QUENfR09UX0RUUFJFTDE2X0hJCTkzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEBkdHByZWxAaCAqLworI2RlZmluZSBSX1BQQ19HT1RfRFRQUkVMMTZfSEEJOTQgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QGR0cHJlbEBoYSAqLworCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX1BQQ19OVU0JCTk1CisKKy8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBmcm9tIHRoZSBFbWJlZGRlZCBFTEYgQUJJLCBhbmQgYXJlIG5vdAorICAgaW4gdGhlIFNWUjQgRUxGIEFCSS4gICovCisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjMyCTEwMQorI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNgkxMDIKKyNkZWZpbmUgUl9QUENfRU1CX05BRERSMTZfTE8JMTAzCisjZGVmaW5lIFJfUFBDX0VNQl9OQUREUjE2X0hJCTEwNAorI2RlZmluZSBSX1BQQ19FTUJfTkFERFIxNl9IQQkxMDUKKyNkZWZpbmUgUl9QUENfRU1CX1NEQUkxNgkxMDYKKyNkZWZpbmUgUl9QUENfRU1CX1NEQTJJMTYJMTA3CisjZGVmaW5lIFJfUFBDX0VNQl9TREEyUkVMCTEwOAorI2RlZmluZSBSX1BQQ19FTUJfU0RBMjEJCTEwOQkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQSAqLworI2RlZmluZSBSX1BQQ19FTUJfTVJLUkVGCTExMAorI2RlZmluZSBSX1BQQ19FTUJfUkVMU0VDMTYJMTExCisjZGVmaW5lIFJfUFBDX0VNQl9SRUxTVF9MTwkxMTIKKyNkZWZpbmUgUl9QUENfRU1CX1JFTFNUX0hJCTExMworI2RlZmluZSBSX1BQQ19FTUJfUkVMU1RfSEEJMTE0CisjZGVmaW5lIFJfUFBDX0VNQl9CSVRfRkxECTExNQorI2RlZmluZSBSX1BQQ19FTUJfUkVMU0RBCTExNgkvKiAxNiBiaXQgcmVsYXRpdmUgb2Zmc2V0IGluIFNEQSAqLworCisvKiBEaWFiIHRvb2wgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0xPCTE4MAkvKiBsaWtlIEVNQl9TREEyMSwgYnV0IGxvd2VyIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQ19ESUFCX1NEQTIxX0hJCTE4MQkvKiBsaWtlIEVNQl9TREEyMSwgYnV0IGhpZ2ggMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfU0RBMjFfSEEJMTgyCS8qIGxpa2UgRU1CX1NEQTIxLCBhZGp1c3RlZCBoaWdoIDE2ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0xPCTE4MwkvKiBsaWtlIEVNQl9SRUxTREEsIGJ1dCBsb3dlciAxNiBiaXQgKi8KKyNkZWZpbmUgUl9QUENfRElBQl9SRUxTREFfSEkJMTg0CS8qIGxpa2UgRU1CX1JFTFNEQSwgYnV0IGhpZ2ggMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX0RJQUJfUkVMU0RBX0hBCTE4NQkvKiBsaWtlIEVNQl9SRUxTREEsIGFkanVzdGVkIGhpZ2ggMTYgKi8KKworLyogR05VIHJlbG9jcyB1c2VkIGluIFBJQyBjb2RlIHNlcXVlbmNlcy4gICovCisjZGVmaW5lIFJfUFBDX1JFTDE2CQkyNDkJLyogd29yZDMyICAgKHN5bS0uKSAqLworI2RlZmluZSBSX1BQQ19SRUwxNl9MTwkJMjUwCS8qIGhhbGYxNiAgIChzeW0tLilAbCAqLworI2RlZmluZSBSX1BQQ19SRUwxNl9ISQkJMjUxCS8qIGhhbGYxNiAgIChzeW0tLilAaCAqLworI2RlZmluZSBSX1BQQ19SRUwxNl9IQQkJMjUyCS8qIGhhbGYxNiAgIChzeW0tLilAaGEgKi8KKworLyogVGhpcyBpcyBhIHBob255IHJlbG9jIHRvIGhhbmRsZSBhbnkgb2xkIGZhc2hpb25lZCBUT0MxNiByZWZlcmVuY2VzCisgICB0aGF0IG1heSBzdGlsbCBiZSBpbiBvYmplY3QgZmlsZXMuICAqLworI2RlZmluZSBSX1BQQ19UT0MxNgkJMjU1CisKKy8qIFBvd2VyUEMgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KKyNkZWZpbmUgRFRfUFBDX0dPVAkJKERUX0xPUFJPQyArIDApCisjZGVmaW5lIERUX1BQQ19OVU0JCTEKKworLyogUG93ZXJQQzY0IHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KKyNkZWZpbmUgUl9QUEM2NF9OT05FCQlSX1BQQ19OT05FCisjZGVmaW5lIFJfUFBDNjRfQUREUjMyCQlSX1BQQ19BRERSMzIgLyogMzJiaXQgYWJzb2x1dGUgYWRkcmVzcyAqLworI2RlZmluZSBSX1BQQzY0X0FERFIyNAkJUl9QUENfQUREUjI0IC8qIDI2Yml0IGFkZHJlc3MsIHdvcmQgYWxpZ25lZCAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNgkJUl9QUENfQUREUjE2IC8qIDE2Yml0IGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfTE8JUl9QUENfQUREUjE2X0xPCS8qIGxvd2VyIDE2Yml0cyBvZiBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJCVJfUFBDX0FERFIxNl9ISQkvKiBoaWdoIDE2Yml0cyBvZiBhZGRyZXNzLiAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9IQQlSX1BQQ19BRERSMTZfSEEgLyogYWRqdXN0ZWQgaGlnaCAxNmJpdHMuICAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNAkJUl9QUENfQUREUjE0IC8qIDE2Yml0IGFkZHJlc3MsIHdvcmQgYWxpZ25lZCAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNF9CUlRBS0VOCVJfUFBDX0FERFIxNF9CUlRBS0VOCisjZGVmaW5lIFJfUFBDNjRfQUREUjE0X0JSTlRBS0VOCVJfUFBDX0FERFIxNF9CUk5UQUtFTgorI2RlZmluZSBSX1BQQzY0X1JFTDI0CQlSX1BQQ19SRUwyNCAvKiBQQy1yZWwuIDI2IGJpdCwgd29yZCBhbGlnbmVkICovCisjZGVmaW5lIFJfUFBDNjRfUkVMMTQJCVJfUFBDX1JFTDE0IC8qIFBDIHJlbGF0aXZlIDE2IGJpdCAqLworI2RlZmluZSBSX1BQQzY0X1JFTDE0X0JSVEFLRU4JUl9QUENfUkVMMTRfQlJUQUtFTgorI2RlZmluZSBSX1BQQzY0X1JFTDE0X0JSTlRBS0VOCVJfUFBDX1JFTDE0X0JSTlRBS0VOCisjZGVmaW5lIFJfUFBDNjRfR09UMTYJCVJfUFBDX0dPVDE2CisjZGVmaW5lIFJfUFBDNjRfR09UMTZfTE8JUl9QUENfR09UMTZfTE8KKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9ISQlSX1BQQ19HT1QxNl9ISQorI2RlZmluZSBSX1BQQzY0X0dPVDE2X0hBCVJfUFBDX0dPVDE2X0hBCisKKyNkZWZpbmUgUl9QUEM2NF9DT1BZCQlSX1BQQ19DT1BZCisjZGVmaW5lIFJfUFBDNjRfR0xPQl9EQVQJUl9QUENfR0xPQl9EQVQKKyNkZWZpbmUgUl9QUEM2NF9KTVBfU0xPVAlSX1BQQ19KTVBfU0xPVAorI2RlZmluZSBSX1BQQzY0X1JFTEFUSVZFCVJfUFBDX1JFTEFUSVZFCisKKyNkZWZpbmUgUl9QUEM2NF9VQUREUjMyCQlSX1BQQ19VQUREUjMyCisjZGVmaW5lIFJfUFBDNjRfVUFERFIxNgkJUl9QUENfVUFERFIxNgorI2RlZmluZSBSX1BQQzY0X1JFTDMyCQlSX1BQQ19SRUwzMgorI2RlZmluZSBSX1BQQzY0X1BMVDMyCQlSX1BQQ19QTFQzMgorI2RlZmluZSBSX1BQQzY0X1BMVFJFTDMyCVJfUFBDX1BMVFJFTDMyCisjZGVmaW5lIFJfUFBDNjRfUExUMTZfTE8JUl9QUENfUExUMTZfTE8KKyNkZWZpbmUgUl9QUEM2NF9QTFQxNl9ISQlSX1BQQ19QTFQxNl9ISQorI2RlZmluZSBSX1BQQzY0X1BMVDE2X0hBCVJfUFBDX1BMVDE2X0hBCisKKyNkZWZpbmUgUl9QUEM2NF9TRUNUT0ZGCQlSX1BQQ19TRUNUT0ZGCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9MTwlSX1BQQ19TRUNUT0ZGX0xPCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9ISQlSX1BQQ19TRUNUT0ZGX0hJCisjZGVmaW5lIFJfUFBDNjRfU0VDVE9GRl9IQQlSX1BQQ19TRUNUT0ZGX0hBCisjZGVmaW5lIFJfUFBDNjRfQUREUjMwCQkzNyAvKiB3b3JkMzAgKFMgKyBBIC0gUCkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X0FERFI2NAkJMzggLyogZG91Ymxld29yZDY0IFMgKyBBICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFUgkzOSAvKiBoYWxmMTYgI2hpZ2hlcihTICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfSElHSEVSQQk0MCAvKiBoYWxmMTYgI2hpZ2hlcmEoUyArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0hJR0hFU1QJNDEgLyogaGFsZjE2ICNoaWdoZXN0KFMgKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X0FERFIxNl9ISUdIRVNUQQk0MiAvKiBoYWxmMTYgI2hpZ2hlc3RhKFMgKyBBKSAqLworI2RlZmluZSBSX1BQQzY0X1VBRERSNjQJCTQzIC8qIGRvdWJsZXdvcmQ2NCBTICsgQSAqLworI2RlZmluZSBSX1BQQzY0X1JFTDY0CQk0NCAvKiBkb3VibGV3b3JkNjQgUyArIEEgLSBQICovCisjZGVmaW5lIFJfUFBDNjRfUExUNjQJCTQ1IC8qIGRvdWJsZXdvcmQ2NCBMICsgQSAqLworI2RlZmluZSBSX1BQQzY0X1BMVFJFTDY0CTQ2IC8qIGRvdWJsZXdvcmQ2NCBMICsgQSAtIFAgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNgkJNDcgLyogaGFsZjE2KiBTICsgQSAtIC5UT0MgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MxNl9MTwk0OCAvKiBoYWxmMTYgI2xvKFMgKyBBIC0gLlRPQy4pICovCisjZGVmaW5lIFJfUFBDNjRfVE9DMTZfSEkJNDkgLyogaGFsZjE2ICNoaShTICsgQSAtIC5UT0MuKSAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0hBCTUwIC8qIGhhbGYxNiAjaGEoUyArIEEgLSAuVE9DLikgKi8KKyNkZWZpbmUgUl9QUEM2NF9UT0MJCTUxIC8qIGRvdWJsZXdvcmQ2NCAuVE9DICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTYJNTIgLyogaGFsZjE2KiBNICsgQSAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0xPCTUzIC8qIGhhbGYxNiAjbG8oTSArIEEpICovCisjZGVmaW5lIFJfUFBDNjRfUExUR09UMTZfSEkJNTQgLyogaGFsZjE2ICNoaShNICsgQSkgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9IQQk1NSAvKiBoYWxmMTYgI2hhKE0gKyBBKSAqLworCisjZGVmaW5lIFJfUFBDNjRfQUREUjE2X0RTCTU2IC8qIGhhbGYxNmRzKiAoUyArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9BRERSMTZfTE9fRFMJNTcgLyogaGFsZjE2ZHMgICNsbyhTICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X0dPVDE2X0RTCTU4IC8qIGhhbGYxNmRzKiAoRyArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1QxNl9MT19EUwk1OSAvKiBoYWxmMTZkcyAgI2xvKEcgKyBBKSA+PiAyICovCisjZGVmaW5lIFJfUFBDNjRfUExUMTZfTE9fRFMJNjAgLyogaGFsZjE2ZHMgICNsbyhMICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfRFMJNjEgLyogaGFsZjE2ZHMqIChSICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1NFQ1RPRkZfTE9fRFMJNjIgLyogaGFsZjE2ZHMgICNsbyhSICsgQSkgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0RTCTYzIC8qIGhhbGYxNmRzKiAoUyArIEEgLSAuVE9DLikgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1RPQzE2X0xPX0RTCTY0IC8qIGhhbGYxNmRzICAjbG8oUyArIEEgLSAuVE9DLikgPj4gMiAqLworI2RlZmluZSBSX1BQQzY0X1BMVEdPVDE2X0RTCTY1IC8qIGhhbGYxNmRzKiAoTSArIEEpID4+IDIgKi8KKyNkZWZpbmUgUl9QUEM2NF9QTFRHT1QxNl9MT19EUwk2NiAvKiBoYWxmMTZkcyAgI2xvKE0gKyBBKSA+PiAyICovCisKKy8qIFBvd2VyUEM2NCByZWxvY2F0aW9ucyBkZWZpbmVkIGZvciB0aGUgVExTIGFjY2VzcyBBQkkuICAqLworI2RlZmluZSBSX1BQQzY0X1RMUwkJNjcgLyogbm9uZQkoc3ltK2FkZClAdGxzICovCisjZGVmaW5lIFJfUFBDNjRfRFRQTU9ENjQJNjggLyogZG91Ymxld29yZDY0IChzeW0rYWRkKUBkdHBtb2QgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2CQk2OSAvKiBoYWxmMTYqCShzeW0rYWRkKUB0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfTE8JNzAgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISQk3MSAvKiBoYWxmMTYJKHN5bSthZGQpQHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hBCTcyIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDY0CQk3MyAvKiBkb3VibGV3b3JkNjQgKHN5bSthZGQpQHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTYJNzQgLyogaGFsZjE2Kgkoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfTE8JNzUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJCTc2IC8qIGhhbGYxNgkoc3ltK2FkZClAZHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9IQQk3NyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDY0CTc4IC8qIGRvdWJsZXdvcmQ2NCAoc3ltK2FkZClAZHRwcmVsICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTYJNzkgLyogaGFsZjE2Kgkoc3ltK2FkZClAZ290QHRsc2dkICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0dEMTZfTE8JODAgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzZ2RAbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNHRDE2X0hJCTgxIC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2dkQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTR0QxNl9IQQk4MiAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNnZEBoYSAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2CTgzIC8qIGhhbGYxNioJKHN5bSthZGQpQGdvdEB0bHNsZCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UTFNMRDE2X0xPCTg0IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRsc2xkQGwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVExTTEQxNl9ISQk4NSAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0bHNsZEBoICovCisjZGVmaW5lIFJfUFBDNjRfR09UX1RMU0xEMTZfSEEJODYgLyogaGFsZjE2CShzeW0rYWRkKUBnb3RAdGxzbGRAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9EUwk4NyAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQGdvdEB0cHJlbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UUFJFTDE2X0xPX0RTIDg4IC8qIGhhbGYxNmRzIChzeW0rYWRkKUBnb3RAdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9UUFJFTDE2X0hJCTg5IC8qIGhhbGYxNgkoc3ltK2FkZClAZ290QHRwcmVsQGggKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfVFBSRUwxNl9IQQk5MCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEB0cHJlbEBoYSAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9EUwk5MSAvKiBoYWxmMTZkcyoJKHN5bSthZGQpQGdvdEBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9HT1RfRFRQUkVMMTZfTE9fRFMgOTIgLyogaGFsZjE2ZHMgKHN5bSthZGQpQGdvdEBkdHByZWxAbCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9ISQk5MyAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEBkdHByZWxAaCAqLworI2RlZmluZSBSX1BQQzY0X0dPVF9EVFBSRUwxNl9IQQk5NCAvKiBoYWxmMTYJKHN5bSthZGQpQGdvdEBkdHByZWxAaGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0RTCTk1IC8qIGhhbGYxNmRzKgkoc3ltK2FkZClAdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0xPX0RTCTk2IC8qIGhhbGYxNmRzCShzeW0rYWRkKUB0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVIJOTcgLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoaWdoZXIgKi8KKyNkZWZpbmUgUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkEJOTggLyogaGFsZjE2CShzeW0rYWRkKUB0cHJlbEBoaWdoZXJhICovCisjZGVmaW5lIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUCTk5IC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVzdCAqLworI2RlZmluZSBSX1BQQzY0X1RQUkVMMTZfSElHSEVTVEEgMTAwIC8qIGhhbGYxNgkoc3ltK2FkZClAdHByZWxAaGlnaGVzdGEgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9EUwkxMDEgLyogaGFsZjE2ZHMqIChzeW0rYWRkKUBkdHByZWwgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9MT19EUwkxMDIgLyogaGFsZjE2ZHMJKHN5bSthZGQpQGR0cHJlbEBsICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSCTEwMyAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXIgKi8KKyNkZWZpbmUgUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVJBIDEwNCAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXJhICovCisjZGVmaW5lIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVTVCAxMDUgLyogaGFsZjE2CShzeW0rYWRkKUBkdHByZWxAaGlnaGVzdCAqLworI2RlZmluZSBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1RBIDEwNiAvKiBoYWxmMTYJKHN5bSthZGQpQGR0cHJlbEBoaWdoZXN0YSAqLworCisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX1BQQzY0X05VTQkJMTA3CisKKy8qIFBvd2VyUEM2NCBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBEeW4gZF90YWcgZmllbGQuICAqLworI2RlZmluZSBEVF9QUEM2NF9HTElOSyAgKERUX0xPUFJPQyArIDApCisjZGVmaW5lIERUX1BQQzY0X09QRAkoRFRfTE9QUk9DICsgMSkKKyNkZWZpbmUgRFRfUFBDNjRfT1BEU1oJKERUX0xPUFJPQyArIDIpCisjZGVmaW5lIERUX1BQQzY0X05VTSAgICAzCisKKworLyogQVJNIHNwZWNpZmljIGRlY2xhcmF0aW9ucyAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBFRl9BUk1fUkVMRVhFQyAgICAgMHgwMQorI2RlZmluZSBFRl9BUk1fSEFTRU5UUlkgICAgMHgwMgorI2RlZmluZSBFRl9BUk1fSU5URVJXT1JLICAgMHgwNAorI2RlZmluZSBFRl9BUk1fQVBDU18yNiAgICAgMHgwOAorI2RlZmluZSBFRl9BUk1fQVBDU19GTE9BVCAgMHgxMAorI2RlZmluZSBFRl9BUk1fUElDICAgICAgICAgMHgyMAorI2RlZmluZSBFRl9BUk1fQUxJR044ICAgICAgMHg0MAkJLyogOC1iaXQgc3RydWN0dXJlIGFsaWdubWVudCBpcyBpbiB1c2UgKi8KKyNkZWZpbmUgRUZfQVJNX05FV19BQkkgICAgIDB4ODAKKyNkZWZpbmUgRUZfQVJNX09MRF9BQkkgICAgIDB4MTAwCisKKy8qIE90aGVyIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSBBUk0gRUxGIHNwZWMuIHZlcnNpb24gQi0wMS4gICovCisvKiBOQi4gVGhlc2UgY29uZmxpY3Qgd2l0aCB2YWx1ZXMgZGVmaW5lZCBhYm92ZS4gICovCisjZGVmaW5lIEVGX0FSTV9TWU1TQVJFU09SVEVECTB4MDQKKyNkZWZpbmUgRUZfQVJNX0RZTlNZTVNVU0VTRUdJRFggMHgwOAorI2RlZmluZSBFRl9BUk1fTUFQU1lNU0ZJUlNUCTB4MTAKKyNkZWZpbmUgRUZfQVJNX0VBQklNQVNLCQkwWEZGMDAwMDAwCisKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSU0lPTihmbGFncykgKChmbGFncykgJiBFRl9BUk1fRUFCSU1BU0spCisjZGVmaW5lIEVGX0FSTV9FQUJJX1VOS05PV04gIDB4MDAwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMSAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIyICAgICAweDAyMDAwMDAwCisKKy8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzIGZvciBUaHVtYiAqLworI2RlZmluZSBTVFRfQVJNX1RGVU5DICAgICAgMHhkCisKKy8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzICovCisjZGVmaW5lIFNIRl9BUk1fRU5UUllTRUNUICAweDEwMDAwMDAwICAgLyogU2VjdGlvbiBjb250YWlucyBhbiBlbnRyeSBwb2ludCAqLworI2RlZmluZSBTSEZfQVJNX0NPTURFRiAgICAgMHg4MDAwMDAwMCAgIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQKKwkJCQkJICAgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwICovCisKKy8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncyAqLworI2RlZmluZSBQRl9BUk1fU0IgICAgICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlZ21lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCisJCQkJCSAgIGFkZHJlc3NlZCBieSB0aGUgc3RhdGljIGJhc2UgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFBoZHIgcF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgUFRfQVJNX0VYSURYCTB4NzAwMDAwMDEJLyogLkFSTS5leGlkeCBzZWdtZW50ICovCisKKy8qIEFSTSByZWxvY3MuICAqLworCisjZGVmaW5lIFJfQVJNX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9BUk1fUEMyNAkJMQkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX0FCUzMyCQkyCS8qIERpcmVjdCAzMiBiaXQgICovCisjZGVmaW5lIFJfQVJNX1JFTDMyCQkzCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX0FSTV9QQzEzCQk0CisjZGVmaW5lIFJfQVJNX0FCUzE2CQk1CS8qIERpcmVjdCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9BUk1fQUJTMTIJCTYJLyogRGlyZWN0IDEyIGJpdCAqLworI2RlZmluZSBSX0FSTV9USE1fQUJTNQkJNworI2RlZmluZSBSX0FSTV9BQlM4CQk4CS8qIERpcmVjdCA4IGJpdCAqLworI2RlZmluZSBSX0FSTV9TQlJFTDMyCQk5CisjZGVmaW5lIFJfQVJNX1RITV9QQzIyCQkxMAorI2RlZmluZSBSX0FSTV9USE1fUEM4CQkxMQorI2RlZmluZSBSX0FSTV9BTVBfVkNBTEw5CTEyCisjZGVmaW5lIFJfQVJNX1NXSTI0CQkxMworI2RlZmluZSBSX0FSTV9USE1fU1dJOAkJMTQKKyNkZWZpbmUgUl9BUk1fWFBDMjUJCTE1CisjZGVmaW5lIFJfQVJNX1RITV9YUEMyMgkJMTYKKyNkZWZpbmUgUl9BUk1fVExTX0RUUE1PRDMyCTE3CS8qIElEIG9mIG1vZHVsZSBjb250YWluaW5nIHN5bWJvbCAqLworI2RlZmluZSBSX0FSTV9UTFNfRFRQT0ZGMzIJMTgJLyogT2Zmc2V0IGluIFRMUyBibG9jayAqLworI2RlZmluZSBSX0FSTV9UTFNfVFBPRkYzMgkxOQkvKiBPZmZzZXQgaW4gc3RhdGljIFRMUyBibG9jayAqLworI2RlZmluZSBSX0FSTV9DT1BZCQkyMAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfQVJNX0dMT0JfREFUCQkyMQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfQVJNX0pVTVBfU0xPVAkJMjIJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLworI2RlZmluZSBSX0FSTV9SRUxBVElWRQkJMjMJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX0FSTV9HT1RPRkYJCTI0CS8qIDMyIGJpdCBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfQVJNX0dPVFBDCQkyNQkvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX0FSTV9HT1QzMgkJMjYJLyogMzIgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX0FSTV9QTFQzMgkJMjcJLyogMzIgYml0IFBMVCBhZGRyZXNzICovCisjZGVmaW5lIFJfQVJNX0FMVV9QQ1JFTF83XzAJMzIKKyNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzE1XzgJMzMKKyNkZWZpbmUgUl9BUk1fQUxVX1BDUkVMXzIzXzE1CTM0CisjZGVmaW5lIFJfQVJNX0xEUl9TQlJFTF8xMV8wCTM1CisjZGVmaW5lIFJfQVJNX0FMVV9TQlJFTF8xOV8xMgkzNgorI2RlZmluZSBSX0FSTV9BTFVfU0JSRUxfMjdfMjAJMzcKKyNkZWZpbmUgUl9BUk1fR05VX1ZURU5UUlkJMTAwCisjZGVmaW5lIFJfQVJNX0dOVV9WVElOSEVSSVQJMTAxCisjZGVmaW5lIFJfQVJNX1RITV9QQzExCQkxMDIJLyogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KKyNkZWZpbmUgUl9BUk1fVEhNX1BDOQkJMTAzCS8qIHRodW1iIGNvbmRpdGlvbmFsIGJyYW5jaCAqLworI2RlZmluZSBSX0FSTV9UTFNfR0QzMgkJMTA0CS8qIFBDLXJlbCAzMiBiaXQgZm9yIGdsb2JhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhICovCisjZGVmaW5lIFJfQVJNX1RMU19MRE0zMgkJMTA1CS8qIFBDLXJlbCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0xETzMyCQkxMDYJLyogMzIgYml0IG9mZnNldCByZWxhdGl2ZSB0byBUTFMKKwkJCQkJICAgYmxvY2sgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0lFMzIJCTEwNwkvKiBQQy1yZWwgMzIgYml0IGZvciBHT1QgZW50cnkgb2YKKwkJCQkJICAgc3RhdGljIFRMUyBibG9jayBvZmZzZXQgKi8KKyNkZWZpbmUgUl9BUk1fVExTX0xFMzIJCTEwOAkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIHN0YXRpYworCQkJCQkgICBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9BUk1fUlhQQzI1CQkyNDkKKyNkZWZpbmUgUl9BUk1fUlNCUkVMMzIJCTI1MAorI2RlZmluZSBSX0FSTV9USE1fUlBDMjIJCTI1MQorI2RlZmluZSBSX0FSTV9SUkVMMzIJCTI1MgorI2RlZmluZSBSX0FSTV9SQUJTMjIJCTI1MworI2RlZmluZSBSX0FSTV9SUEMyNAkJMjU0CisjZGVmaW5lIFJfQVJNX1JCQVNFCQkyNTUKKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfQVJNX05VTQkJMjU2CisKKy8qIElBLTY0IHNwZWNpZmljIGRlY2xhcmF0aW9ucy4gICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVoZHIgZV9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIEVGX0lBXzY0X01BU0tPUwkJMHgwMDAwMDAwZgkvKiBvcy1zcGVjaWZpYyBmbGFncyAqLworI2RlZmluZSBFRl9JQV82NF9BQkk2NAkJMHgwMDAwMDAxMAkvKiA2NC1iaXQgQUJJICovCisjZGVmaW5lIEVGX0lBXzY0X0FSQ0gJCTB4ZmYwMDAwMDAJLyogYXJjaC4gdmVyc2lvbiBtYXNrICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyB2YWx1ZXMgZm9yIHRoZSBQaGRyIHBfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFBUX0lBXzY0X0FSQ0hFWFQJKFBUX0xPUFJPQyArIDApCS8qIGFyY2ggZXh0ZW5zaW9uIGJpdHMgKi8KKyNkZWZpbmUgUFRfSUFfNjRfVU5XSU5ECQkoUFRfTE9QUk9DICsgMSkJLyogaWE2NCB1bndpbmQgYml0cyAqLworI2RlZmluZSBQVF9JQV82NF9IUF9PUFRfQU5PVAkoUFRfTE9PUyArIDB4MTIpCisjZGVmaW5lIFBUX0lBXzY0X0hQX0hTTF9BTk9UCShQVF9MT09TICsgMHgxMykKKyNkZWZpbmUgUFRfSUFfNjRfSFBfU1RBQ0sJKFBUX0xPT1MgKyAweDE0KQorCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBQaGRyIHBfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBQRl9JQV82NF9OT1JFQ09WCTB4ODAwMDAwMDAJLyogc3BlYyBpbnNucyB3L28gcmVjb3ZlcnkgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFNoZHIgc2hfdHlwZSBmaWVsZC4gICovCisjZGVmaW5lIFNIVF9JQV82NF9FWFQJCShTSFRfTE9QUk9DICsgMCkgLyogZXh0ZW5zaW9uIGJpdHMgKi8KKyNkZWZpbmUgU0hUX0lBXzY0X1VOV0lORAkoU0hUX0xPUFJPQyArIDEpIC8qIHVud2luZCBiaXRzICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIFNoZHIgc2hfZmxhZ3MgZmllbGQuICAqLworI2RlZmluZSBTSEZfSUFfNjRfU0hPUlQJCTB4MTAwMDAwMDAJLyogc2VjdGlvbiBuZWFyIGdwICovCisjZGVmaW5lIFNIRl9JQV82NF9OT1JFQ09WCTB4MjAwMDAwMDAJLyogc3BlYyBpbnNucyB3L28gcmVjb3ZlcnkgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIER5biBkX3RhZyBmaWVsZC4gICovCisjZGVmaW5lIERUX0lBXzY0X1BMVF9SRVNFUlZFCShEVF9MT1BST0MgKyAwKQorI2RlZmluZSBEVF9JQV82NF9OVU0JCTEKKworLyogSUEtNjQgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX0lBNjRfTk9ORQkJMHgwMAkvKiBub25lICovCisjZGVmaW5lIFJfSUE2NF9JTU0xNAkJMHgyMQkvKiBzeW1ib2wgKyBhZGRlbmQsIGFkZCBpbW0xNCAqLworI2RlZmluZSBSX0lBNjRfSU1NMjIJCTB4MjIJLyogc3ltYm9sICsgYWRkZW5kLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0lNTTY0CQkweDIzCS8qIHN5bWJvbCArIGFkZGVuZCwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9ESVIzMk1TQgkJMHgyNAkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRElSMzJMU0IJCTB4MjUJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjY0TVNCCQkweDI2CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9ESVI2NExTQgkJMHgyNwkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUwyMgkJMHgyYQkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDY0SQkJMHgyYgkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDMyTVNCCTB4MmMJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUwzMkxTQgkweDJkCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMNjRNU0IJMHgyZQkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDY0TFNCCTB4MmYJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkYyMgkJMHgzMgkvKiBAbHRvZmYoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRjY0SQkJMHgzMwkvKiBAbHRvZmYoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9QTFRPRkYyMgkJMHgzYQkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGFkZCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGNjRJCTB4M2IJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjY0TVNCCTB4M2UJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjY0TFNCCTB4M2YJLyogQHBsdG9mZihzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFI2NEkJCTB4NDMJLyogQGZwdHIoc3ltICsgYWRkKSwgbW92IGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9GUFRSMzJNU0IJMHg0NAkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFIzMkxTQgkweDQ1CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjY0TVNCCTB4NDYJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9GUFRSNjRMU0IJMHg0NwkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjBCCQkweDQ4CS8qIEBwY3JlbChzeW0gKyBhZGQpLCBicmwgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFCCQkweDQ5CS8qIEBwY3JlbChzeW0gKyBhZGQpLCBwdGIsIGNhbGwgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFNCQkweDRhCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBjaGsucyAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMUYJCTB4NGIJLyogQHBjcmVsKHN5bSArIGFkZCksIGZjaGtmICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDMyTVNCCTB4NGMJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUwzMkxTQgkweDRkCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjRNU0IJMHg0ZQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDY0TFNCCTB4NGYJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjIyCTB4NTIJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjY0SQkweDUzCS8qIEBsdG9mZihAZnB0cihzK2EpKSwgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFIzMk1TQgkweDU0CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSMzJMU0IJMHg1NQkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjY0TVNCCTB4NTYJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFI2NExTQgkweDU3CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUwzMk1TQgkweDVjCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUwzMkxTQgkweDVkCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUw2NE1TQgkweDVlCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUdSRUw2NExTQgkweDVmCS8qIEBzZWdyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUwzMk1TQgkweDY0CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUwzMkxTQgkweDY1CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUw2NE1TQgkweDY2CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9TRUNSRUw2NExTQgkweDY3CS8qIEBzZWNyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9SRUwzMk1TQgkJMHg2YwkvKiBkYXRhIDQgKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDMyTFNCCQkweDZkCS8qIGRhdGEgNCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfUkVMNjRNU0IJCTB4NmUJLyogZGF0YSA4ICsgUkVMICovCisjZGVmaW5lIFJfSUE2NF9SRUw2NExTQgkJMHg2ZgkvKiBkYXRhIDggKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjMyTVNCCQkweDc0CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9MVFYzMkxTQgkJMHg3NQkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRWNjRNU0IJCTB4NzYJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjY0TFNCCQkweDc3CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIxQkkJMHg3OQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgMjFiaXQgaW5zdCAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMgkJMHg3YQkvKiBAcGNyZWwoc3ltICsgYWRkKSwgMjJiaXQgaW5zdCAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2NEkJCTB4N2IJLyogQHBjcmVsKHN5bSArIGFkZCksIDY0Yml0IGluc3QgKi8KKyNkZWZpbmUgUl9JQTY0X0lQTFRNU0IJCTB4ODAJLyogZHluYW1pYyByZWxvYywgaW1wb3J0ZWQgUExULCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0lQTFRMU0IJCTB4ODEJLyogZHluYW1pYyByZWxvYywgaW1wb3J0ZWQgUExULCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0NPUFkJCTB4ODQJLyogY29weSByZWxvY2F0aW9uICovCisjZGVmaW5lIFJfSUE2NF9TVUIJCTB4ODUJLyogQWRkZW5kIGFuZCBzeW1ib2wgZGlmZmVyZW5jZSAqLworI2RlZmluZSBSX0lBNjRfTFRPRkYyMlgJCTB4ODYJLyogTFRPRkYyMiwgcmVsYXhhYmxlLiAgKi8KKyNkZWZpbmUgUl9JQTY0X0xEWE1PVgkJMHg4NwkvKiBVc2Ugb2YgTFRPRkYyMlguICAqLworI2RlZmluZSBSX0lBNjRfVFBSRUwxNAkJMHg5MQkvKiBAdHByZWwoc3ltICsgYWRkKSwgaW1tMTQgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMMjIJCTB4OTIJLyogQHRwcmVsKHN5bSArIGFkZCksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDY0SQkJMHg5MwkvKiBAdHByZWwoc3ltICsgYWRkKSwgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMNjRNU0IJMHg5NgkvKiBAdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDY0TFNCCTB4OTcJLyogQHRwcmVsKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfVFBSRUwyMgkweDlhCS8qIEBsdG9mZihAdHByZWwocythKSksIGltbTIgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUE1PRDY0TVNCCTB4YTYJLyogQGR0cG1vZChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUE1PRDY0TFNCCTB4YTcJLyogQGR0cG1vZChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0RUUE1PRDIyCTB4YWEJLyogQGx0b2ZmKEBkdHBtb2Qoc3ltICsgYWRkKSksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwxNAkJMHhiMQkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGltbTE0ICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwyMgkJMHhiMgkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUw2NEkJMHhiMwkvKiBAZHRwcmVsKHN5bSArIGFkZCksIGltbTY0ICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwzMk1TQgkweGI0CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUwzMkxTQgkweGI1CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUw2NE1TQgkweGI2CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTVNCICovCisjZGVmaW5lIFJfSUE2NF9EVFBSRUw2NExTQgkweGI3CS8qIEBkdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9EVFBSRUwyMgkweGJhCS8qIEBsdG9mZihAZHRwcmVsKHMrYSkpLCBpbW0yMiAqLworCisvKiBTSCBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKworLyogU0ggcmVsb2NzLiAgKi8KKyNkZWZpbmUJUl9TSF9OT05FCQkwCisjZGVmaW5lCVJfU0hfRElSMzIJCTEKKyNkZWZpbmUJUl9TSF9SRUwzMgkJMgorI2RlZmluZQlSX1NIX0RJUjhXUE4JCTMKKyNkZWZpbmUJUl9TSF9JTkQxMlcJCTQKKyNkZWZpbmUJUl9TSF9ESVI4V1BMCQk1CisjZGVmaW5lCVJfU0hfRElSOFdQWgkJNgorI2RlZmluZQlSX1NIX0RJUjhCUAkJNworI2RlZmluZQlSX1NIX0RJUjhXCQk4CisjZGVmaW5lCVJfU0hfRElSOEwJCTkKKyNkZWZpbmUJUl9TSF9TV0lUQ0gxNgkJMjUKKyNkZWZpbmUJUl9TSF9TV0lUQ0gzMgkJMjYKKyNkZWZpbmUJUl9TSF9VU0VTCQkyNworI2RlZmluZQlSX1NIX0NPVU5UCQkyOAorI2RlZmluZQlSX1NIX0FMSUdOCQkyOQorI2RlZmluZQlSX1NIX0NPREUJCTMwCisjZGVmaW5lCVJfU0hfREFUQQkJMzEKKyNkZWZpbmUJUl9TSF9MQUJFTAkJMzIKKyNkZWZpbmUJUl9TSF9TV0lUQ0g4CQkzMworI2RlZmluZQlSX1NIX0dOVV9WVElOSEVSSVQJMzQKKyNkZWZpbmUJUl9TSF9HTlVfVlRFTlRSWQkzNQorI2RlZmluZQlSX1NIX1RMU19HRF8zMgkJMTQ0CisjZGVmaW5lCVJfU0hfVExTX0xEXzMyCQkxNDUKKyNkZWZpbmUJUl9TSF9UTFNfTERPXzMyCQkxNDYKKyNkZWZpbmUJUl9TSF9UTFNfSUVfMzIJCTE0NworI2RlZmluZQlSX1NIX1RMU19MRV8zMgkJMTQ4CisjZGVmaW5lCVJfU0hfVExTX0RUUE1PRDMyCTE0OQorI2RlZmluZQlSX1NIX1RMU19EVFBPRkYzMgkxNTAKKyNkZWZpbmUJUl9TSF9UTFNfVFBPRkYzMgkxNTEKKyNkZWZpbmUJUl9TSF9HT1QzMgkJMTYwCisjZGVmaW5lCVJfU0hfUExUMzIJCTE2MQorI2RlZmluZQlSX1NIX0NPUFkJCTE2MgorI2RlZmluZQlSX1NIX0dMT0JfREFUCQkxNjMKKyNkZWZpbmUJUl9TSF9KTVBfU0xPVAkJMTY0CisjZGVmaW5lCVJfU0hfUkVMQVRJVkUJCTE2NQorI2RlZmluZQlSX1NIX0dPVE9GRgkJMTY2CisjZGVmaW5lCVJfU0hfR09UUEMJCTE2NworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUJUl9TSF9OVU0JCTI1NgorCisvKiBBZGRpdGlvbmFsIHMzOTAgcmVsb2NzICovCisKKyNkZWZpbmUgUl8zOTBfTk9ORQkJMAkvKiBObyByZWxvYy4gICovCisjZGVmaW5lIFJfMzkwXzgJCQkxCS8qIERpcmVjdCA4IGJpdC4gICovCisjZGVmaW5lIFJfMzkwXzEyCQkyCS8qIERpcmVjdCAxMiBiaXQuICAqLworI2RlZmluZSBSXzM5MF8xNgkJMwkvKiBEaXJlY3QgMTYgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfMzIJCTQJLyogRGlyZWN0IDMyIGJpdC4gICovCisjZGVmaW5lIFJfMzkwX1BDMzIJCTUJLyogUEMgcmVsYXRpdmUgMzIgYml0LgkqLworI2RlZmluZSBSXzM5MF9HT1QxMgkJNgkvKiAxMiBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX0dPVDMyCQk3CS8qIDMyIGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMzIJCTgJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl8zOTBfQ09QWQkJOQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgUl8zOTBfR0xPQl9EQVQJCTEwCS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLworI2RlZmluZSBSXzM5MF9KTVBfU0xPVAkJMTEJLyogQ3JlYXRlIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzkwX1JFTEFUSVZFCQkxMgkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UT0ZGMzIJCTEzCS8qIDMyIGJpdCBvZmZzZXQgdG8gR09ULgkgKi8KKyNkZWZpbmUgUl8zOTBfR09UUEMJCTE0CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gR09ULiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UMTYJCTE1CS8qIDE2IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEMxNgkJMTYJLyogUEMgcmVsYXRpdmUgMTYgYml0LgkqLworI2RlZmluZSBSXzM5MF9QQzE2REJMCQkxNwkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMTZEQkwJCTE4CS8qIDE2IGJpdCBQQyByZWwuIFBMVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9QQzMyREJMCQkxOQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMzJEQkwJCTIwCS8qIDMyIGJpdCBQQyByZWwuIFBMVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9HT1RQQ0RCTAkJMjEJLyogMzIgYml0IFBDIHJlbC4gR09UIHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwXzY0CQkyMgkvKiBEaXJlY3QgNjQgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEM2NAkJMjMJLyogUEMgcmVsYXRpdmUgNjQgYml0LgkqLworI2RlZmluZSBSXzM5MF9HT1Q2NAkJMjQJLyogNjQgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9QTFQ2NAkJMjUJLyogNjQgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl8zOTBfR09URU5UCQkyNgkvKiAzMiBiaXQgUEMgcmVsLiB0byBHT1QgZW50cnkgPj4gMS4gKi8KKyNkZWZpbmUgUl8zOTBfR09UT0ZGMTYJCTI3CS8qIDE2IGJpdCBvZmZzZXQgdG8gR09ULiAqLworI2RlZmluZSBSXzM5MF9HT1RPRkY2NAkJMjgJLyogNjQgYml0IG9mZnNldCB0byBHT1QuICovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDEyCQkyOQkvKiAxMiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUMTYJCTMwCS8qIDE2IGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworI2RlZmluZSBSXzM5MF9HT1RQTFQzMgkJMzEJLyogMzIgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDY0CQkzMgkvKiA2NCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExURU5UCQkzMwkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUT0ZGMTYJCTM0CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworI2RlZmluZSBSXzM5MF9QTFRPRkYzMgkJMzUJLyogMzIgYml0IG9mZnNldCBmcm9tIEdPVCB0byBQTFQuICovCisjZGVmaW5lIFJfMzkwX1BMVE9GRjY0CQkzNgkvKiAxNiBiaXQgb2Zmc2V0IGZyb20gR09UIHRvIFBMVC4gKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xPQUQJCTM3CS8qIFRhZyBmb3IgbG9hZCBpbnNuIGluIFRMUyBjb2RlLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dEQ0FMTAkzOAkvKiBUYWcgZm9yIGZ1bmN0aW9uIGNhbGwgaW4gZ2VuZXJhbAorCQkJCQkgICBkeW5hbWljIFRMUyBjb2RlLiAqLworI2RlZmluZSBSXzM5MF9UTFNfTERDQUxMCTM5CS8qIFRhZyBmb3IgZnVuY3Rpb24gY2FsbCBpbiBsb2NhbAorCQkJCQkgICBkeW5hbWljIFRMUyBjb2RlLiAqLworI2RlZmluZSBSXzM5MF9UTFNfR0QzMgkJNDAJLyogRGlyZWN0IDMyIGJpdCBmb3IgZ2VuZXJhbCBkeW5hbWljCisJCQkJCSAgIHRocmVhZCBsb2NhbCBkYXRhLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dENjQJCTQxCS8qIERpcmVjdCA2NCBiaXQgZm9yIGdlbmVyYWwgZHluYW1pYworCQkJCQkgIHRocmVhZCBsb2NhbCBkYXRhLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFMTIJNDIJLyogMTIgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFMzIJNDMJLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFNjQJNDQJLyogNjQgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKwkJCQkJICAgYmxvY2sgb2Zmc2V0LiAqLworI2RlZmluZSBSXzM5MF9UTFNfTERNMzIJCTQ1CS8qIERpcmVjdCAzMiBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKwkJCQkJICAgdGhyZWFkIGxvY2FsIGRhdGEgaW4gTEUgY29kZS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRE02NAkJNDYJLyogRGlyZWN0IDY0IGJpdCBmb3IgbG9jYWwgZHluYW1pYworCQkJCQkgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRSBjb2RlLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFMzIJCTQ3CS8qIDMyIGJpdCBhZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3IKKwkJCQkJICAgbmVnYXRlZCBzdGF0aWMgVExTIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19JRTY0CQk0OAkvKiA2NCBiaXQgYWRkcmVzcyBvZiBHT1QgZW50cnkgZm9yCisJCQkJCSAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfSUVFTlQJCTQ5CS8qIDMyIGJpdCByZWwuIG9mZnNldCB0byBHT1QgZW50cnkgZm9yCisJCQkJCSAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfTEUzMgkJNTAJLyogMzIgYml0IG5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfTEU2NAkJNTEJLyogNjQgYml0IG5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvCisJCQkJCSAgIHN0YXRpYyBUTFMgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfTERPMzIJCTUyCS8qIDMyIGJpdCBvZmZzZXQgcmVsYXRpdmUgdG8gVExTCisJCQkJCSAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETzY0CQk1MwkvKiA2NCBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUworCQkJCQkgICBibG9jay4gICovCisjZGVmaW5lIFJfMzkwX1RMU19EVFBNT0QJNTQJLyogSUQgb2YgbW9kdWxlIGNvbnRhaW5pbmcgc3ltYm9sLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0RUUE9GRgk1NQkvKiBPZmZzZXQgaW4gVExTIGJsb2NrLgkgKi8KKyNkZWZpbmUgUl8zOTBfVExTX1RQT0ZGCQk1NgkvKiBOZWdhdGVkIG9mZnNldCBpbiBzdGF0aWMgVExTCisJCQkJCSAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfMjAJCTU3CS8qIERpcmVjdCAyMCBiaXQuICAqLworI2RlZmluZSBSXzM5MF9HT1QyMAkJNTgJLyogMjAgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9HT1RQTFQyMAkJNTkJLyogMjAgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR09USUUyMAk2MAkvKiAyMCBiaXQgR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUworCQkJCQkgICBibG9jayBvZmZzZXQuICAqLworLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNkZWZpbmUgUl8zOTBfTlVNCQk2MQorCisKKy8qIENSSVMgcmVsb2NhdGlvbnMuICAqLworI2RlZmluZSBSX0NSSVNfTk9ORQkJMAorI2RlZmluZSBSX0NSSVNfOAkJMQorI2RlZmluZSBSX0NSSVNfMTYJCTIKKyNkZWZpbmUgUl9DUklTXzMyCQkzCisjZGVmaW5lIFJfQ1JJU184X1BDUkVMCQk0CisjZGVmaW5lIFJfQ1JJU18xNl9QQ1JFTAkJNQorI2RlZmluZSBSX0NSSVNfMzJfUENSRUwJCTYKKyNkZWZpbmUgUl9DUklTX0dOVV9WVElOSEVSSVQJNworI2RlZmluZSBSX0NSSVNfR05VX1ZURU5UUlkJOAorI2RlZmluZSBSX0NSSVNfQ09QWQkJOQorI2RlZmluZSBSX0NSSVNfR0xPQl9EQVQJCTEwCisjZGVmaW5lIFJfQ1JJU19KVU1QX1NMT1QJMTEKKyNkZWZpbmUgUl9DUklTX1JFTEFUSVZFCQkxMgorI2RlZmluZSBSX0NSSVNfMTZfR09UCQkxMworI2RlZmluZSBSX0NSSVNfMzJfR09UCQkxNAorI2RlZmluZSBSX0NSSVNfMTZfR09UUExUCTE1CisjZGVmaW5lIFJfQ1JJU18zMl9HT1RQTFQJMTYKKyNkZWZpbmUgUl9DUklTXzMyX0dPVFJFTAkxNworI2RlZmluZSBSX0NSSVNfMzJfUExUX0dPVFJFTAkxOAorI2RlZmluZSBSX0NSSVNfMzJfUExUX1BDUkVMCTE5CisKKyNkZWZpbmUgUl9DUklTX05VTQkJMjAKKworCisvKiBBTUQgeDg2LTY0IHJlbG9jYXRpb25zLiAgKi8KKyNkZWZpbmUgUl9YODZfNjRfTk9ORQkJMAkvKiBObyByZWxvYyAqLworI2RlZmluZSBSX1g4Nl82NF82NAkJMQkvKiBEaXJlY3QgNjQgYml0ICAqLworI2RlZmluZSBSX1g4Nl82NF9QQzMyCQkyCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCBzaWduZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UMzIJCTMJLyogMzIgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9QTFQzMgkJNAkvKiAzMiBiaXQgUExUIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9YODZfNjRfQ09QWQkJNQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCisjZGVmaW5lIFJfWDg2XzY0X0dMT0JfREFUCTYJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX1g4Nl82NF9KVU1QX1NMT1QJNwkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1JFTEFUSVZFCTgJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX1g4Nl82NF9HT1RQQ1JFTAk5CS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUKKwkJCQkJICAgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX1g4Nl82NF8zMgkJMTAJLyogRGlyZWN0IDMyIGJpdCB6ZXJvIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0XzMyUwkJMTEJLyogRGlyZWN0IDMyIGJpdCBzaWduIGV4dGVuZGVkICovCisjZGVmaW5lIFJfWDg2XzY0XzE2CQkxMgkvKiBEaXJlY3QgMTYgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEMxNgkJMTMJLyogMTYgYml0IHNpZ24gZXh0ZW5kZWQgcGMgcmVsYXRpdmUgKi8KKyNkZWZpbmUgUl9YODZfNjRfOAkJMTQJLyogRGlyZWN0IDggYml0IHNpZ24gZXh0ZW5kZWQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDOAkJMTUJLyogOCBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF9EVFBNT0Q2NAkxNgkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfRFRQT0ZGNjQJMTcJLyogT2Zmc2V0IGluIG1vZHVsZSdzIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9UUE9GRjY0CTE4CS8qIE9mZnNldCBpbiBpbml0aWFsIFRMUyBibG9jayAqLworI2RlZmluZSBSX1g4Nl82NF9UTFNHRAkJMTkJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gdHdvIEdPVCBlbnRyaWVzIGZvciBHRCBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfVExTTEQJCTIwCS8qIDMyIGJpdCBzaWduZWQgUEMgcmVsYXRpdmUgb2Zmc2V0CisJCQkJCSAgIHRvIHR3byBHT1QgZW50cmllcyBmb3IgTEQgc3ltYm9sICovCisjZGVmaW5lIFJfWDg2XzY0X0RUUE9GRjMyCTIxCS8qIE9mZnNldCBpbiBUTFMgYmxvY2sgKi8KKyNkZWZpbmUgUl9YODZfNjRfR09UVFBPRkYJMjIJLyogMzIgYml0IHNpZ25lZCBQQyByZWxhdGl2ZSBvZmZzZXQKKwkJCQkJICAgdG8gR09UIGVudHJ5IGZvciBJRSBzeW1ib2wgKi8KKyNkZWZpbmUgUl9YODZfNjRfVFBPRkYzMgkyMwkvKiBPZmZzZXQgaW4gaW5pdGlhbCBUTFMgYmxvY2sgKi8KKworI2RlZmluZSBSX1g4Nl82NF9OVU0JCTI0CisKKworLyogQU0zMyByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9OT05FCQkwCS8qIE5vIHJlbG9jLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwXzMyCQkxCS8qIERpcmVjdCAzMiBiaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfMTYJCTIJLyogRGlyZWN0IDE2IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF84CQkzCS8qIERpcmVjdCA4IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QQ1JFTDMyCTQJLyogUEMtcmVsYXRpdmUgMzItYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMMTYJNQkvKiBQQy1yZWxhdGl2ZSAxNi1iaXQgc2lnbmVkLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMOAk2CS8qIFBDLXJlbGF0aXZlIDgtYml0IHNpZ25lZC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUCTcJLyogQW5jaWVudCBDKysgdnRhYmxlIGdhcmJhZ2UuLi4gKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dOVV9WVEVOVFJZCTgJLyogLi4uIGNvbGxlY3Rpb24gYW5ub3RhdGlvbi4gICovCisjZGVmaW5lIFJfTU4xMDMwMF8yNAkJOQkvKiBEaXJlY3QgMjQgYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVFBDMzIJMTAJLyogMzItYml0IFBDcmVsIG9mZnNldCB0byBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UUEMxNgkxMQkvKiAxNi1iaXQgUENyZWwgb2Zmc2V0IHRvIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1RPRkYzMgkxMgkvKiAzMi1iaXQgb2Zmc2V0IGZyb20gR09ULiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVE9GRjI0CTEzCS8qIDI0LWJpdCBvZmZzZXQgZnJvbSBHT1QuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UT0ZGMTYJMTQJLyogMTYtYml0IG9mZnNldCBmcm9tIEdPVC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QTFQzMgkJMTUJLyogMzItYml0IFBDcmVsIHRvIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QTFQxNgkJMTYJLyogMTYtYml0IFBDcmVsIHRvIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9HT1QzMgkJMTcJLyogMzItYml0IG9mZnNldCB0byBHT1QgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfR09UMjQJCTE4CS8qIDI0LWJpdCBvZmZzZXQgdG8gR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dPVDE2CQkxOQkvKiAxNi1iaXQgb2Zmc2V0IHRvIEdPVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9DT1BZCQkyMAkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX0dMT0JfREFUCTIxCS8qIENyZWF0ZSBHT1QgZW50cnkuICAqLworI2RlZmluZSBSX01OMTAzMDBfSk1QX1NMT1QJMjIJLyogQ3JlYXRlIFBMVCBlbnRyeS4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9SRUxBVElWRQkyMwkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlLiAgKi8KKworI2RlZmluZSBSX01OMTAzMDBfTlVNCQkyNAorCisKKy8qIE0zMlIgcmVsb2NzLiAgKi8KKyNkZWZpbmUgUl9NMzJSX05PTkUJCTAJLyogTm8gcmVsb2MuICovCisjZGVmaW5lIFJfTTMyUl8xNgkJMQkvKiBEaXJlY3QgMTYgYml0LiAqLworI2RlZmluZSBSX00zMlJfMzIJCTIJLyogRGlyZWN0IDMyIGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzI0CQkzCS8qIERpcmVjdCAyNCBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8xMF9QQ1JFTAkJNAkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSXzE4X1BDUkVMCQk1CS8qIFBDIHJlbGF0aXZlIDE4IGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfMjZfUENSRUwJCTYJLyogUEMgcmVsYXRpdmUgMjYgYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl9ISTE2X1VMTwkJNwkvKiBIaWdoIDE2IGJpdCB3aXRoIHVuc2lnbmVkIGxvdy4gKi8KKyNkZWZpbmUgUl9NMzJSX0hJMTZfU0xPCQk4CS8qIEhpZ2ggMTYgYml0IHdpdGggc2lnbmVkIGxvdy4gKi8KKyNkZWZpbmUgUl9NMzJSX0xPMTYJCTkJLyogTG93IDE2IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSX1NEQTE2CQkxMAkvKiAxNiBiaXQgb2Zmc2V0IGluIFNEQS4gKi8KKyNkZWZpbmUgUl9NMzJSX0dOVV9WVElOSEVSSVQJMTEKKyNkZWZpbmUgUl9NMzJSX0dOVV9WVEVOVFJZCTEyCisvKiBNMzJSIHJlbG9jcyB1c2UgU0hUX1JFTEEuICAqLworI2RlZmluZSBSX00zMlJfMTZfUkVMQQkJMzMJLyogRGlyZWN0IDE2IGJpdC4gKi8KKyNkZWZpbmUgUl9NMzJSXzMyX1JFTEEJCTM0CS8qIERpcmVjdCAzMiBiaXQuICovCisjZGVmaW5lIFJfTTMyUl8yNF9SRUxBCQkzNQkvKiBEaXJlY3QgMjQgYml0LiAqLworI2RlZmluZSBSX00zMlJfMTBfUENSRUxfUkVMQQkzNgkvKiBQQyByZWxhdGl2ZSAxMCBiaXQgc2hpZnRlZC4gKi8KKyNkZWZpbmUgUl9NMzJSXzE4X1BDUkVMX1JFTEEJMzcJLyogUEMgcmVsYXRpdmUgMTggYml0IHNoaWZ0ZWQuICovCisjZGVmaW5lIFJfTTMyUl8yNl9QQ1JFTF9SRUxBCTM4CS8qIFBDIHJlbGF0aXZlIDI2IGJpdCBzaGlmdGVkLiAqLworI2RlZmluZSBSX00zMlJfSEkxNl9VTE9fUkVMQQkzOQkvKiBIaWdoIDE2IGJpdCB3aXRoIHVuc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfSEkxNl9TTE9fUkVMQQk0MAkvKiBIaWdoIDE2IGJpdCB3aXRoIHNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0xPMTZfUkVMQQk0MQkvKiBMb3cgMTYgYml0ICovCisjZGVmaW5lIFJfTTMyUl9TREExNl9SRUxBCTQyCS8qIDE2IGJpdCBvZmZzZXQgaW4gU0RBICovCisjZGVmaW5lIFJfTTMyUl9SRUxBX0dOVV9WVElOSEVSSVQJNDMKKyNkZWZpbmUgUl9NMzJSX1JFTEFfR05VX1ZURU5UUlkJNDQKKyNkZWZpbmUgUl9NMzJSX1JFTDMyCQk0NQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQuICAqLworCisjZGVmaW5lIFJfTTMyUl9HT1QyNAkJNDgJLyogMjQgYml0IEdPVCBlbnRyeSAqLworI2RlZmluZSBSX00zMlJfMjZfUExUUkVMCTQ5CS8qIDI2IGJpdCBQQyByZWxhdGl2ZSB0byBQTFQgc2hpZnRlZCAqLworI2RlZmluZSBSX00zMlJfQ09QWQkJNTAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX00zMlJfR0xPQl9EQVQJCTUxCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9NMzJSX0pNUF9TTE9UCQk1MgkvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfTTMyUl9SRUxBVElWRQkJNTMJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGCQk1NAkvKiAyNCBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX00zMlJfR09UUEMyNAkJNTUJLyogMjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVDE2X0hJX1VMTwk1NgkvKiBIaWdoIDE2IGJpdCBHT1QgZW50cnkgd2l0aCB1bnNpZ25lZAorCQkJCQkgICBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVDE2X0hJX1NMTwk1NwkvKiBIaWdoIDE2IGJpdCBHT1QgZW50cnkgd2l0aCBzaWduZWQKKwkJCQkJICAgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1QxNl9MTwkJNTgJLyogTG93IDE2IGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVFBDX0hJX1VMTwk1OQkvKiBIaWdoIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQgdG8KKwkJCQkJICAgR09UIHdpdGggdW5zaWduZWQgbG93ICovCisjZGVmaW5lIFJfTTMyUl9HT1RQQ19ISV9TTE8JNjAJLyogSGlnaCAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvCisJCQkJCSAgIEdPVCB3aXRoIHNpZ25lZCBsb3cgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVFBDX0xPCQk2MQkvKiBMb3cgMTYgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0bworCQkJCQkgICBHT1QgKi8KKyNkZWZpbmUgUl9NMzJSX0dPVE9GRl9ISV9VTE8JNjIJLyogSGlnaCAxNiBiaXQgb2Zmc2V0IHRvIEdPVAorCQkJCQkgICB3aXRoIHVuc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGX0hJX1NMTwk2MwkvKiBIaWdoIDE2IGJpdCBvZmZzZXQgdG8gR09UCisJCQkJCSAgIHdpdGggc2lnbmVkIGxvdyAqLworI2RlZmluZSBSX00zMlJfR09UT0ZGX0xPCTY0CS8qIExvdyAxNiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX00zMlJfTlVNCQkyNTYJLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAqLworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBlbGYuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9lbmRpYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3YmNlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW5kaWFuLmgKQEAgLTAsMCArMSw1OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk2LCAxOTk3LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9FTkRJQU5fSAorI2RlZmluZQlfRU5ESUFOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogRGVmaW5pdGlvbnMgZm9yIGJ5dGUgb3JkZXIsIGFjY29yZGluZyB0byBzaWduaWZpY2FuY2Ugb2YgYnl0ZXMsCisgICBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuICBUaGUgdmFsdWUgaXMgd2hhdCB5b3UgZ2V0IGJ5CisgICBwdXR0aW5nICc0JyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCAnMycgaW4gdGhlIHNlY29uZCBtb3N0CisgICBzaWduaWZpY2FudCBieXRlLCAnMicgaW4gdGhlIHNlY29uZCBsZWFzdCBzaWduaWZpY2FudCBieXRlLCBhbmQgJzEnCisgICBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgYW5kIHRoZW4gd3JpdGluZyBkb3duIG9uZSBkaWdpdCBmb3IKKyAgIGVhY2ggYnl0ZSwgc3RhcnRpbmcgd2l0aCB0aGUgYnl0ZSBhdCB0aGUgbG93ZXN0IGFkZHJlc3MgYXQgdGhlIGxlZnQsCisgICBhbmQgcHJvY2VlZGluZyB0byB0aGUgYnl0ZSB3aXRoIHRoZSBoaWdoZXN0IGFkZHJlc3MgYXQgdGhlIHJpZ2h0LiAgKi8KKworI2RlZmluZQlfX0xJVFRMRV9FTkRJQU4JMTIzNAorI2RlZmluZQlfX0JJR19FTkRJQU4JNDMyMQorI2RlZmluZQlfX1BEUF9FTkRJQU4JMzQxMgorCisvKiBUaGlzIGZpbGUgZGVmaW5lcyBgX19CWVRFX09SREVSJyBmb3IgdGhlIHBhcnRpY3VsYXIgbWFjaGluZS4gICovCisjaW5jbHVkZSA8Yml0cy9lbmRpYW4uaD4KKworLyogU29tZSBtYWNoaW5lcyBtYXkgbmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyBmb3IgZmxvYXRpbmcgcG9pbnQKKyAgIHZhbHVlcy4gICovCisjaWZuZGVmIF9fRkxPQVRfV09SRF9PUkRFUgorIyBkZWZpbmUgX19GTE9BVF9XT1JEX09SREVSIF9fQllURV9PUkRFUgorI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKyMgZGVmaW5lIExJVFRMRV9FTkRJQU4JX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBCSUdfRU5ESUFOCV9fQklHX0VORElBTgorIyBkZWZpbmUgUERQX0VORElBTglfX1BEUF9FTkRJQU4KKyMgZGVmaW5lIEJZVEVfT1JERVIJX19CWVRFX09SREVSCisjZW5kaWYKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIF9fTE9OR19MT05HX1BBSVIoSEksIExPKSBMTywgSEkKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgZGVmaW5lIF9fTE9OR19MT05HX1BBSVIoSEksIExPKSBISSwgTE8KKyNlbmRpZgorCisjZW5kaWYJLyogZW5kaWFuLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW52ei5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lbnZ6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MmRlZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZW52ei5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIFJvdXRpbmVzIGZvciBkZWFsaW5nIHdpdGggJ1wwJyBzZXBhcmF0ZWQgZW52aXJvbm1lbnQgdmVjdG9ycworICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTgsIDk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9FTlZaX0gKKyNkZWZpbmUgX0VOVlpfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyogRW52eidzIGFyZSBhcmd6J3MgdG9vLCBhbmQgc2hvdWxkIGJlIGNyZWF0ZWQgZXRjLiwgdXNpbmcgdGhlIHNhbWUKKyAgIHJvdXRpbmVzLiAgKi8KKyNpbmNsdWRlIDxhcmd6Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGluIEVOVlogZm9yIE5BTUUsIG9yIDAgaWYgdGhlcmUgaXMgbm9uZS4gICovCitleHRlcm4gY2hhciAqZW52el9lbnRyeSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZW52eiwgc2l6ZV90IF9fZW52el9sZW4sCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBwb3J0aW9uIG9mIHRoZSBlbnRyeSBpbiBFTlZaIGZvciBOQU1FLCBvciAwCisgICBpZiB0aGVyZSBpcyBub25lLiAgKi8KK2V4dGVybiBjaGFyICplbnZ6X2dldCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZW52eiwgc2l6ZV90IF9fZW52el9sZW4sCisJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogQWRkcyBhbiBlbnRyeSBmb3IgTkFNRSB3aXRoIHZhbHVlIFZBTFVFIHRvIEVOVlogJiBFTlZaX0xFTi4gIElmIGFuIGVudHJ5CisgICB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gRU5WWiwgaXQgaXMgcmVtb3ZlZC4gIElmIFZBTFVFIGlzCisgICBOVUxMLCB0aGVuIHRoZSBuZXcgZW50cnkgd2lsbCBhIHNwZWNpYWwgbnVsbCBvbmUsIGZvciB3aGljaCBlbnZ6X2dldCB3aWxsCisgICByZXR1cm4gTlVMTCwgYWx0aG91Z2ggZW52el9lbnRyeSB3aWxsIHN0aWxsIHJldHVybiBhbiBlbnRyeTsgdGhpcyBpcyBoYW5keQorICAgYmVjYXVzZSB3aGVuIG1lcmdpbmcgd2l0aCBhbm90aGVyIGVudnosIHRoZSBudWxsIGVudHJ5IGNhbiBvdmVycmlkZSBhbgorICAgZW50cnkgaW4gdGhlIG90aGVyIG9uZS4gIE51bGwgZW50cmllcyBjYW4gYmUgcmVtb3ZlZCB3aXRoIGVudnpfc3RyaXAgKCkuICAqLworZXh0ZXJuIGVycm9yX3QgZW52el9hZGQgKGNoYXIgKipfX3Jlc3RyaWN0IF9fZW52eiwKKwkJCSBzaXplX3QgKl9fcmVzdHJpY3QgX19lbnZ6X2xlbiwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3ZhbHVlKSBfX1RIUk9XOworCisvKiBBZGRzIGVhY2ggZW50cnkgaW4gRU5WWjIgdG8gRU5WWiAmIEVOVlpfTEVOLCBhcyBpZiB3aXRoIGVudnpfYWRkKCkuICBJZgorICAgT1ZFUlJJREUgaXMgdHJ1ZSwgdGhlbiB2YWx1ZXMgaW4gRU5WWjIgd2lsbCBzdXBlcnNlZGUgdGhvc2Ugd2l0aCB0aGUgc2FtZQorICAgbmFtZSBpbiBFTlYsIG90aGVyd2lzZSBub3QuICAqLworZXh0ZXJuIGVycm9yX3QgZW52el9tZXJnZSAoY2hhciAqKl9fcmVzdHJpY3QgX19lbnZ6LAorCQkJICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fZW52el9sZW4sCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19lbnZ6MiwKKwkJCSAgIHNpemVfdCBfX2VudnoyX2xlbiwgaW50IF9fb3ZlcnJpZGUpIF9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgZW50cnkgZm9yIE5BTUUgZnJvbSBFTlZaICYgRU5WWl9MRU4sIGlmIGFueS4gICovCitleHRlcm4gdm9pZCBlbnZ6X3JlbW92ZSAoY2hhciAqKl9fcmVzdHJpY3QgX19lbnZ6LAorCQkJIHNpemVfdCAqX19yZXN0cmljdCBfX2VudnpfbGVuLAorCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUpIF9fVEhST1c7CisKKy8qIFJlbW92ZSBudWxsIGVudHJpZXMuICAqLworZXh0ZXJuIHZvaWQgZW52el9zdHJpcCAoY2hhciAqKl9fcmVzdHJpY3QgX19lbnZ6LAorCQkJc2l6ZV90ICpfX3Jlc3RyaWN0IF9fZW52el9sZW4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBlbnZ6LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Vyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjM1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Vyci5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIDQuNEJTRCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZXJyb3IgbWVzc2FnZXMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsMTk5NiwxOTk3LDE5OTgsMTk5OSwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9FUlJfSAorI2RlZmluZQlfRVJSX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlfX25lZWRfX192YV9saXN0CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZuZGVmCV9fR05VQ19WQV9MSVNUCisjIGRlZmluZSBfX2dudWNfdmFfbGlzdAlfX3B0cl90CisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBQcmludCAicHJvZ3JhbTogIiwgRk9STUFULCAiOiAiLCB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyaW5nIGZvciBlcnJubywKKyAgIGFuZCBhIG5ld2xpbmUsIG9uIHN0ZGVyci4gICovCitleHRlcm4gdm9pZCB3YXJuIChfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAyKSkpOworZXh0ZXJuIHZvaWQgdndhcm4gKF9fY29uc3QgY2hhciAqX19mb3JtYXQsIF9fZ251Y192YV9saXN0KQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMSwgMCkpKTsKKworLyogTGlrZXdpc2UsIGJ1dCB3aXRob3V0ICI6ICIgYW5kIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJpbmcuICAqLworZXh0ZXJuIHZvaWQgd2FybnggKF9fY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDIpKSk7CitleHRlcm4gdm9pZCB2d2FybnggKF9fY29uc3QgY2hhciAqX19mb3JtYXQsIF9fZ251Y192YV9saXN0KQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMSwgMCkpKTsKKworLyogTGlrZXdpc2UsIGFuZCB0aGVuIGV4aXQgd2l0aCBTVEFUVVMuICAqLworZXh0ZXJuIHZvaWQgZXJyIChpbnQgX19zdGF0dXMsIF9fY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXywgX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKK2V4dGVybiB2b2lkIHZlcnIgKGludCBfX3N0YXR1cywgX19jb25zdCBjaGFyICpfX2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QpCisgICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18sIF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDApKSk7CitleHRlcm4gdm9pZCBlcnJ4IChpbnQgX19zdGF0dXMsIF9fY29uc3QgY2hhciAqX19mb3JtYXQsIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXywgX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKK2V4dGVybiB2b2lkIHZlcnJ4IChpbnQgX19zdGF0dXMsIF9fY29uc3QgY2hhciAqLCBfX2dudWNfdmFfbGlzdCkKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXywgX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMCkpKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIGVyci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Vycm5vLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzYjBjOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJybm8uaApAQCAtMCwwICsxLDczIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTMsOTQsOTUsOTYsOTcsMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuNSBFcnJvcnMJPGVycm5vLmg+CisgKi8KKworI2lmbmRlZglfRVJSTk9fSAorCisvKiBUaGUgaW5jbHVkZXIgZGVmaW5lZCBfX25lZWRfRW1hdGggaWYgaGUgd2FudHMgb25seSB0aGUgZGVmaW5pdGlvbnMKKyAgIG9mIEVET00gYW5kIEVSQU5HRSwgYW5kIG5vdCBldmVyeXRoaW5nIGVsc2UuICAqLworI2lmbmRlZglfX25lZWRfRW1hdGgKKyMgZGVmaW5lIF9FUlJOT19ICTEKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCB0aGUgZXJyb3IgbnVtYmVyIGNvbnN0YW50cyBmcm9tIHRoZSBzeXN0ZW0tc3BlY2lmaWMgZmlsZS4KKyAgIFRoaXMgZmlsZSB3aWxsIHRlc3QgX19uZWVkX0VtYXRoIGFuZCBfRVJSTk9fSC4gICovCisjaW5jbHVkZSA8Yml0cy9lcnJuby5oPgorI3VuZGVmCV9fbmVlZF9FbWF0aAorCisjaWZkZWYJX0VSUk5PX0gKKworLyogRGVjbGFyZSB0aGUgYGVycm5vJyB2YXJpYWJsZSwgdW5sZXNzIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvIGJ5CisgICBiaXRzL2Vycm5vLmguICBUaGlzIGlzIHRoZSBjYXNlIGluIEdOVSwgd2hlcmUgaXQgaXMgYSBwZXItdGhyZWFkCisgICB2YXJpYWJsZS4gIFRoaXMgcmVkZWNsYXJhdGlvbiB1c2luZyB0aGUgbWFjcm8gc3RpbGwgd29ya3MsIGJ1dCBpdAorICAgd2lsbCBiZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdpdGhvdXQgYSBwcm90b3R5cGUgYW5kIG1heSB0cmlnZ2VyCisgICBhIC1Xc3RyaWN0LXByb3RvdHlwZXMgd2FybmluZy4gICovCisjaWZuZGVmCWVycm5vCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKworLyogVGhlIGZ1bGwgYW5kIHNpbXBsZSBmb3JtcyBvZiB0aGUgbmFtZSB3aXRoIHdoaWNoIHRoZSBwcm9ncmFtIHdhcworICAgaW52b2tlZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYXQgc3RhcnR1cCBiYXNlZCBvbgorICAgdGhlIHZhbHVlIG9mIEFSR1ZbMF0gKHRoaXMgd29ya3Mgb25seSBpZiB5b3UgdXNlIEdOVSBsZCkuICAqLworZXh0ZXJuIGNoYXIgKnByb2dyYW1faW52b2NhdGlvbl9uYW1lLCAqcHJvZ3JhbV9pbnZvY2F0aW9uX3Nob3J0X25hbWU7CisjZW5kaWYgLyogX19VU0VfR05VICovCisjZW5kaWYgLyogX0VSUk5PX0ggKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9FUlJOT19IICovCisKKy8qIFRoZSBIdXJkIDxiaXRzL2Vycm5vLmg+IGRlZmluZXMgYGVycm9yX3QnIGFzIGFuIGVudW1lcmF0ZWQgdHlwZSBzbworICAgdGhhdCBwcmludGluZyBgZXJyb3JfdCcgdmFsdWVzIGluIHRoZSBkZWJ1Z2dlciBzaG93cyB0aGUgbmFtZXMuICBXZQorICAgbWlnaHQgbmVlZCB0aGlzIGRlZmluaXRpb24gc29tZXRpbWVzIGV2ZW4gaWYgdGhpcyBmaWxlIHdhcyBpbmNsdWRlZAorICAgYmVmb3JlLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSB8fCBkZWZpbmVkIF9fbmVlZF9lcnJvcl90CisjIGlmbmRlZiBfX2Vycm9yX3RfZGVmaW5lZAordHlwZWRlZiBpbnQgZXJyb3JfdDsKKyMgIGRlZmluZSBfX2Vycm9yX3RfZGVmaW5lZAkxCisjIGVuZGlmCisjIHVuZGVmIF9fbmVlZF9lcnJvcl90CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJyb3IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDMyMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9lcnJvci5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIERlY2xhcmF0aW9uIGZvciBlcnJvci1yZXBvcnRpbmcgZnVuY3Rpb24KKyAgIENvcHlyaWdodCAoQykgMTk5NSwxOTk2LDE5OTcsMjAwMywyMDA2LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0VSUk9SX0gKKyNkZWZpbmUgX0VSUk9SX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFByaW50IGEgbWVzc2FnZSB3aXRoIGBmcHJpbnRmIChzdGRlcnIsIEZPUk1BVCwgLi4uKSc7CisgICBpZiBFUlJOVU0gaXMgbm9uemVybywgZm9sbG93IGl0IHdpdGggIjogIiBhbmQgc3RyZXJyb3IgKEVSUk5VTSkuCisgICBJZiBTVEFUVVMgaXMgbm9uemVybywgdGVybWluYXRlIHRoZSBwcm9ncmFtIHdpdGggYGV4aXQgKFNUQVRVUyknLiAgKi8KKworZXh0ZXJuIHZvaWQgZXJyb3IgKGludCBfX3N0YXR1cywgaW50IF9fZXJybnVtLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworCitleHRlcm4gdm9pZCBlcnJvcl9hdF9saW5lIChpbnQgX19zdGF0dXMsIGludCBfX2Vycm51bSwgX19jb25zdCBjaGFyICpfX2ZuYW1lLAorCQkJICAgdW5zaWduZWQgaW50IF9fbGluZW5vLCBfX2NvbnN0IGNoYXIgKl9fZm9ybWF0LCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCA1LCA2KSkpOworCisvKiBJZiBOVUxMLCBlcnJvciB3aWxsIGZsdXNoIHN0ZG91dCwgdGhlbiBwcmludCBvbiBzdGRlcnIgdGhlIHByb2dyYW0KKyAgIG5hbWUsIGEgY29sb24gYW5kIGEgc3BhY2UuICBPdGhlcndpc2UsIGVycm9yIHdpbGwgY2FsbCB0aGlzCisgICBmdW5jdGlvbiB3aXRob3V0IHBhcmFtZXRlcnMgaW5zdGVhZC4gICovCitleHRlcm4gdm9pZCAoKmVycm9yX3ByaW50X3Byb2duYW1lKSAodm9pZCk7CisKKy8qIFRoaXMgdmFyaWFibGUgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGBlcnJvcicgaXMgY2FsbGVkLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZXJyb3JfbWVzc2FnZV9jb3VudDsKKworLyogU29tZXRpbWVzIHdlIHdhbnQgdG8gaGF2ZSBhdCBtb3N0IG9uZSBlcnJvciBwZXIgbGluZS4gIFRoaXMKKyAgIHZhcmlhYmxlIGNvbnRyb2xzIHdoZXRoZXIgdGhpcyBtb2RlIGlzIHNlbGVjdGVkIG9yIG5vdC4gICovCitleHRlcm4gaW50IGVycm9yX29uZV9wZXJfbGluZTsKKworCisjaWYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lICYmIGRlZmluZWQgX192YV9hcmdfcGFjaworIyBpbmNsdWRlIDxiaXRzL2Vycm9yLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGVycm9yLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXNkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2VzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTVjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2VzZC5oCkBAIC0wLDAgKzEsMzQwIEBACisjaWZuZGVmIEVTRF9ICisjZGVmaW5lIEVTRF9ICisjaW5jbHVkZSA8YXVkaW9maWxlLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogcGF0aCBhbmQgbmFtZSBvZiB0aGUgZGVmYXVsdCBFc291bkQgZG9tYWluIHNvY2tldCAqLworI2RlZmluZSBFU0RfVU5JWF9TT0NLRVRfRElSCWVzZF9nZXRfc29ja2V0X2Rpcm5hbWUoKQorI2RlZmluZSBFU0RfVU5JWF9TT0NLRVRfTkFNRQllc2RfZ2V0X3NvY2tldF9uYW1lKCkKKworLyogc2l6ZSBvZiB0aGUgYXVkaW8gYnVmZmVyICovCisjZGVmaW5lIEVTRF9CVUZfU0laRSAoNCAqIDEwMjQpCisKKy8qIGxlbmd0aCBvZiB0aGUgYXV0aG9yaXphdGlvbiBrZXksIG9jdGV0cyAqLworI2RlZmluZSBFU0RfS0VZX0xFTiAoMTYpCisKKy8qIGRlZmF1bHQgcG9ydCBmb3IgdGhlIEVzb3VuRCBzZXJ2ZXIgKi8KKyNkZWZpbmUgRVNEX0RFRkFVTFRfUE9SVCAoMTYwMDEpCisKKy8qIGRlZmF1bHQgc2FtcGxlIHJhdGUgZm9yIHRoZSBFc291bkQgc2VydmVyICovCisjZGVmaW5lIEVTRF9ERUZBVUxUX1JBVEUgKDQ0MTAwKQorCisvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIHN0cmVhbS9zYW1wbGUgbmFtZSAqLworI2RlZmluZSBFU0RfTkFNRV9NQVggKDEyOCkKKworLyogYSBtYWdpYyBudW1iZXIgdG8gaWRlbnRpZnkgdGhlIHJlbGF0aXZlIGVuZGlhbm5lc3Mgb2YgYSBjbGllbnQgKi8KKyNkZWZpbmUgRVNEX0VORElBTl9LRVkgXAorCSggKHVuc2lnbmVkIGludCkgKCAoJ0UnIDw8IDI0KSArICgnTicgPDwgMTYpICsgKCdEJyA8PCA4KSArICgnTicpICkgKQorCisjZGVmaW5lIEVTRF9WT0xVTUVfQkFTRSAoMjU2KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHdoYXQgY2FuIHdlIGRvIHRvL3dpdGggdGhlIEVzb3VuRCAqLworZW51bSBlc2RfcHJvdG8geyAKKyAgICBFU0RfUFJPVE9fQ09OTkVDVCwgICAgICAvKiBpbXBsaWVkIG9uIGluaXRhbCBjbGllbnQgY29ubmVjdGlvbiAqLworCisgICAgLyogcHNldWRvICJzZWN1cml0eSIgZnVuY3Rpb25hbGl0eSAqLworICAgIEVTRF9QUk9UT19MT0NLLAkgICAgLyogZGlzYWJsZSAiZm9yZWlnbiIgY2xpZW50IGNvbm5lY3Rpb25zICovCisgICAgRVNEX1BST1RPX1VOTE9DSywJICAgIC8qIGVuYWJsZSAiZm9yZWlnbiIgY2xpZW50IGNvbm5lY3Rpb25zICovCisKKyAgICAvKiBzdHJlYW0gZnVuY3Rpb25hbGl0eTogcGxheSwgcmVjb3JkLCBtb25pdG9yICovCisgICAgRVNEX1BST1RPX1NUUkVBTV9QTEFZLCAgLyogcGxheSBhbGwgZm9sbG93aW5nIGRhdGEgYXMgYSBzdHJlYW0gKi8KKyAgICBFU0RfUFJPVE9fU1RSRUFNX1JFQywgICAvKiByZWNvcmQgZGF0YSBmcm9tIGNhcmQgYXMgYSBzdHJlYW0gKi8KKyAgICBFU0RfUFJPVE9fU1RSRUFNX01PTiwgICAvKiBzZW5kIG1peGVkIGJ1ZmZlciBvdXRwdXQgYXMgYSBzdHJlYW0gKi8KKworICAgIC8qIHNhbXBsZSBmdW5jdGlvbmFsaXR5OiBjYWNoZSwgZnJlZSwgcGxheSwgbG9vcCwgRU9MLCBraWxsICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9DQUNIRSwgLyogY2FjaGUgYSBzYW1wbGUgaW4gdGhlIHNlcnZlciAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfRlJFRSwgIC8qIHJlbGVhc2UgYSBzYW1wbGUgaW4gdGhlIHNlcnZlciAqLworICAgIEVTRF9QUk9UT19TQU1QTEVfUExBWSwgIC8qIHBsYXkgYSBjYWNoZWQgc2FtcGxlICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9MT09QLCAgLyogbG9vcCBhIGNhY2hlZCBzYW1wbGUsIHRpbCBlb2xvb3AgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX1NUT1AsICAvKiBzdG9wIGEgbG9vcGluZyBzYW1wbGUgd2hlbiBkb25lICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9LSUxMLCAgLyogc3RvcCB0aGUgbG9vcGluZyBzYW1wbGUgaW1tZWQuICovCisKKyAgICAvKiBmcmVlIGFuZCByZWNsYWltIC9kZXYvZHNwIGZ1bmN0aW9uYWxpdHkgKi8KKyAgICBFU0RfUFJPVE9fU1RBTkRCWSwJICAgIC8qIHJlbGVhc2UgL2Rldi9kc3AgYW5kIGlnbm9yZSBhbGwgZGF0YSAqLworICAgIEVTRF9QUk9UT19SRVNVTUUsCSAgICAvKiByZWNsYWltIC9kZXYvZHNwIGFuZCBwbGF5IHNvdW5kcyBhZ2FpbiAqLworCisgICAgLyogVE9ETzogbW92ZSB0aGVzZSB0byBhIG1vcmUgbG9naWNhbCBwbGFjZS4gTk9URTogd2lsbCBicmVhayB0aGUgcHJvdG9jb2wgKi8KKyAgICBFU0RfUFJPVE9fU0FNUExFX0dFVElELCAvKiBnZXQgdGhlIElEIGZvciBhbiBhbHJlYWR5LWNhY2hlZCBzYW1wbGUgKi8KKyAgICBFU0RfUFJPVE9fU1RSRUFNX0ZJTFQsICAvKiBmaWx0ZXIgbWl4ZWQgYnVmZmVyIG91dHB1dCBhcyBhIHN0cmVhbSAqLworCisgICAgLyogZXNkIHJlbW90ZSBtYW5hZ2VtZW50ICovCisgICAgRVNEX1BST1RPX1NFUlZFUl9JTkZPLCAgLyogZ2V0IHNlcnZlciBpbmZvICh2ZXIsIHNhbXBsZSByYXRlLCBmb3JtYXQpICovCisgICAgRVNEX1BST1RPX0FMTF9JTkZPLCAgICAgLyogZ2V0IGFsbCBpbmZvIChzZXJ2ZXIgaW5mbywgcGxheWVycywgc2FtcGxlcykgKi8KKyAgICBFU0RfUFJPVE9fU1VCU0NSSUJFLCAgICAvKiB0cmFjayBuZXcgYW5kIHJlbW92ZWQgcGxheWVycyBhbmQgc2FtcGxlcyAqLworICAgIEVTRF9QUk9UT19VTlNVQlNDUklCRSwgIC8qIHN0b3AgdHJhY2tpbmcgdXBkYXRlcyAqLworCisgICAgLyogZXNkIHJlbW90ZSBjb250cm9sICovCisgICAgRVNEX1BST1RPX1NUUkVBTV9QQU4sICAgLyogc2V0IHN0cmVhbSBwYW5uaW5nICovCisgICAgRVNEX1BST1RPX1NBTVBMRV9QQU4sICAgLyogc2V0IGRlZmF1bHQgc2FtcGxlIHBhbm5pbmcgKi8KKworICAgIC8qIGVzZCBzdGF0dXMgKi8KKyAgICBFU0RfUFJPVE9fU1RBTkRCWV9NT0RFLCAvKiBzZWUgaWYgc2VydmVyIGlzIGluIHN0YW5kYnksIGF1dG9zdGFuZGJ5LCBldGMgKi8KKworICAgIC8qIGVzZCBsYXRlbmN5ICovCisgICAgRVNEX1BST1RPX0xBVEVOQ1ksICAgICAgLyogcmV0cmlldmUgbGF0ZW5jeSBiZXR3ZWVuIHdyaXRlKCkncyBhbmQgb3V0cHV0ICovCisgIAorICAgIEVTRF9QUk9UT19NQVggICAgICAgICAgIC8qIGZvciBib3VuZHMgY2hlY2tpbmcgKi8KK307CisgICAgCisKKy8qKioqKioqKioqKioqKioqKiovCisvKiBUaGUgRXNvdW5EIGFwaSAqLworCisvKiB0aGUgcHJvcGVydGllcyBvZiBhIHNvdW5kIGJ1ZmZlciBhcmUgbG9naWNhbGx5IG9yJ2QgKi8KKworLyogYml0cyBvZiBzdHJlYW0vc2FtcGxlIGRhdGEgKi8KKyNkZWZpbmUgRVNEX01BU0tfQklUUwkoIDB4MDAwRiApCisjZGVmaW5lIEVTRF9CSVRTOCAJKCAweDAwMDAgKQorI2RlZmluZSBFU0RfQklUUzE2CSggMHgwMDAxICkKKworLyogaG93IG1hbnkgaW50ZXJsZWF2ZWQgY2hhbm5lbHMgb2YgZGF0YSAqLworI2RlZmluZSBFU0RfTUFTS19DSEFOCSggMHgwMEYwICkKKyNkZWZpbmUgRVNEX01PTk8JKCAweDAwMTAgKQorI2RlZmluZSBFU0RfU1RFUkVPCSggMHgwMDIwICkKKworLyogd2hldGhlciBpdCdzIGEgc3RyZWFtIG9yIGEgc2FtcGxlICovCisjZGVmaW5lIEVTRF9NQVNLX01PREUJKCAweDBGMDAgKQorI2RlZmluZSBFU0RfU1RSRUFNCSggMHgwMDAwICkKKyNkZWZpbmUgRVNEX1NBTVBMRQkoIDB4MDEwMCApCisjZGVmaW5lIEVTRF9BRFBDTQkoIDB4MDIwMCApCS8qIFRPRE86IGFueW9uZSB1cCBmb3IgdGhpcz8gPVAgKi8KKworLyogdGhlIGZ1bmN0aW9uIG9mIHRoZSBzdHJlYW0vc2FtcGxlLCBhbmQgY29tbW9uIGZ1bmN0aW9ucyAqLworI2RlZmluZSBFU0RfTUFTS19GVU5DCSggMHhGMDAwICkKKyNkZWZpbmUgRVNEX1BMQVkJKCAweDEwMDAgKQorLyogZnVuY3Rpb25zIGZvciBzdHJlYW1zIG9ubHkgKi8KKyNkZWZpbmUgRVNEX01PTklUT1IJKCAweDAwMDAgKQorI2RlZmluZSBFU0RfUkVDT1JECSggMHgyMDAwICkKKy8qIGZ1bmN0aW9ucyBmb3Igc2FtcGxlcyBvbmx5ICovCisjZGVmaW5lIEVTRF9TVE9QCSggMHgwMDAwICkKKyNkZWZpbmUgRVNEX0xPT1AJKCAweDIwMDAgKQorCit0eXBlZGVmIGludCBlc2RfZm9ybWF0X3Q7Cit0eXBlZGVmIGludCBlc2RfcHJvdG9fdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjbGllbnQgc2lkZSBBUEkgZm9yIHBsYXlpbmcgc291bmRzICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBvY3RldDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlc2RsaWIuYyAtIGJhc2ljIGVzZCBjbGllbnQgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCisvKiBvcGVucyBjaGFubmVsLCBhdXRoZW50aWNhdGVzIGNvbm5lY3Rpb24sIGFuZCBwcmVmYXJlcyBmb3IgcHJvdG9zICovCisvKiByZXR1cm5zIEVzb3VuRCBzb2NrZXQgZm9yIGNvbW11bmljYXRpb24sIHJlc3VsdCA8IDAgPSBlcnJvciAqLworLyogc2VydmVyID0gbGlzdGVuIHNvY2tldCAobG9jYWxob3N0OjUwMDEsIDE5Mi4xNjguMTY4LjA6OTk5OSAqLworLyogcmF0ZSwgZm9ybWF0ID0gKGJpdHMgfCBjaGFubmVscyB8IHN0cmVhbSB8IGZ1bmMpICovCitpbnQgZXNkX29wZW5fc291bmQoIGNvbnN0IGNoYXIgKmhvc3QgKTsKKworLyogc2VuZCB0aGUgYXV0aG9yaXphdGlvbiBjb29raWUsIGNyZWF0ZSBvbmUgaWYgbmVlZGVkICovCitpbnQgZXNkX3NlbmRfYXV0aCggaW50IHNvY2sgKTsKKworLyogbG9jay91bmxvY2sgd2lsbCBkaXNhYmxlL2VuYWJsZSBmb3JlaWduIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nICovCitpbnQgZXNkX2xvY2soIGludCBlc2QgKTsKK2ludCBlc2RfdW5sb2NrKCBpbnQgZXNkICk7CisKKy8qIHN0YW5kYnkvcmVzdW1lIHdpbGwgZnJlZS9yZWNsYWltIGF1ZGlvIGRldmljZSBzbyBvdGhlcnMgbWF5IHVzZSBpdCAqLworaW50IGVzZF9zdGFuZGJ5KCBpbnQgZXNkICk7CitpbnQgZXNkX3Jlc3VtZSggaW50IGVzZCApOworCisvKiBvcGVuIGEgc29ja2V0IGZvciBwbGF5aW5nLCBtb25pdG9yaW5nLCBvciByZWNvcmRpbmcgYXMgYSBzdHJlYW0gKi8KKy8qIHRoZSAqX2ZhbGxiYWNrIGZ1bmN0aW9ucyB0cnkgdG8gb3BlbiAvZGV2L2RzcCBpZiB0aGVyZSdzIG5vIEVzb3VuRCAqLworaW50IGVzZF9wbGF5X3N0cmVhbSggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIAorCQkgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2ludCBlc2RfcGxheV9zdHJlYW1fZmFsbGJhY2soIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCAKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2ludCBlc2RfbW9uaXRvcl9zdHJlYW0oIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCAKKwkJCWNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUgKTsKKy8qIGludCBlc2RfbW9uaXRvcl9zdHJlYW1fZmFsbGJhY2soIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlICk7ICovCitpbnQgZXNkX3JlY29yZF9zdHJlYW0oIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCAKKwkJICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2ludCBlc2RfcmVjb3JkX3N0cmVhbV9mYWxsYmFjayggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIAorCQkJCWNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2ludCBlc2RfZmlsdGVyX3N0cmVhbSggZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIAorCQkgICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqbmFtZSApOworCisvKiBjYWNoZSBhIHNhbXBsZSBpbiB0aGUgc2VydmVyIHJldHVybnMgc2FtcGxlIGlkLCA8IDAgPSBlcnJvciAqLworaW50IGVzZF9zYW1wbGVfY2FjaGUoIGludCBlc2QsIGVzZF9mb3JtYXRfdCBmb3JtYXQsIGNvbnN0IGludCByYXRlLCAKKwkJICAgICAgY29uc3QgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqbmFtZSApOworaW50IGVzZF9jb25maXJtX3NhbXBsZV9jYWNoZSggaW50IGVzZCApOworCisvKiBnZXQgdGhlIHNhbXBsZSBpZCBmb3IgYW4gYWxyZWFkeS1jYWNoZWQgc2FtcGxlICovCitpbnQgZXNkX3NhbXBsZV9nZXRpZCggaW50IGVzZCwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIHVuY2FjaGUgYSBzYW1wbGUgaW4gdGhlIHNlcnZlciAqLworaW50IGVzZF9zYW1wbGVfZnJlZSggaW50IGVzZCwgaW50IHNhbXBsZSApOworCisvKiBwbGF5IGEgY2FjaGVkIHNhbXBsZSBvbmNlICovCitpbnQgZXNkX3NhbXBsZV9wbGF5KCBpbnQgZXNkLCBpbnQgc2FtcGxlICk7CisvKiBtYWtlIGEgY2FjaGVkIHNhbXBsZSBsb29wICovCitpbnQgZXNkX3NhbXBsZV9sb29wKCBpbnQgZXNkLCBpbnQgc2FtcGxlICk7CisKKy8qIHN0b3AgdGhlIGxvb3Bpbmcgc2FtcGxlIGF0IGVuZCAqLworaW50IGVzZF9zYW1wbGVfc3RvcCggaW50IGVzZCwgaW50IHNhbXBsZSApOworLyogc3RvcCBhIHBsYXlpbmcgc2FtcGxlIGltbWVkLiAqLworaW50IGVzZF9zYW1wbGVfa2lsbCggaW50IGVzZCwgaW50IHNhbXBsZSApOworCisvKiBjbG9zZXMgZmQsIHByZXZpb3VzbHkgb2J0YWluZWQgYnkgZXNkX29wZW4gKi8KK2ludCBlc2RfY2xvc2UoIGludCBlc2QgKTsKKworLyogZ2V0IHRoZSBzdHJlYW0gbGF0ZW5jeSB0byBlc291bmQgKGxhdGVuY3kgaXMgbnVtYmVyIG9mIHNhbXBsZXMgICovCisvKiBhdCA0NC4xa2h6IHN0ZXJlbyAxNiBiaXQgLSB5b3UnbGwgaGF2ZSB0byBhZGp1c3QgaWYgb3l1ciBpbnB1dCAgKi8KKy8qIHNhbXBsaW5nIHJhdGUgaXMgbGVzcyAoaW4gYnl0ZXMgcGVyIHNlY29uZCkgICAgICAgICAgICAgICAgICAgICAqLworLyogc28gaWYgeW91J3JlIGF0IDQ0LjFraHogc3RlcmVvIDE2Yml0IGluIHlvdXIgc3RyZWFtIC0geW91ciBsYWcgICovCisvKiBpbiBieXRlcyB3b3VkbCBiZSBsYWcgKiAyICogMiBieXRlcyAoMiBmb3Igc3RlcmVvLCAyIGZvciAxNmJpdCkgKi8KKy8qIGlmIHlvdXIgc3RyZWFtIGlzIGF0IDIyLjA1IEtoeiBpdCdsbCBiZSBkb3VibGUgdGhpcyAtIGluIG1vbm8gICAqLworLyogZG91YmxlIGFnYWluIC4uLiBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgZXNkX2dldF9sYXRlbmN5KGludCBlc2QpOworICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGVzZG1nci5jIC0gZnVuY3Rpb25zIHRvIGltcGxlbWVudCBhICJzb3VuZCBtYW5hZ2VyIiBmb3IgZXNkICovCisKKy8qIHN0cnVjdHVyZXMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgc3RyZWFtcy9zYW1wbGVzIGZyb20gdGhlIHNlcnZlciAqLwordHlwZWRlZiBzdHJ1Y3QgZXNkX3NlcnZlcl9pbmZvIHsKKworICAgIGludCB2ZXJzaW9uOyAJCS8qIHNlcnZlciB2ZXJzaW9uIGVuY29kZWQgYXMgYW4gaW50ICovCisgICAgZXNkX2Zvcm1hdF90IGZvcm1hdDsJLyogbWFnaWMgaW50IHdpdGggdGhlIGZvcm1hdCBpbmZvICovCisgICAgaW50IHJhdGU7CQkJLyogc2FtcGxlIHJhdGUgKi8KKworfSBlc2Rfc2VydmVyX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZXNkX3BsYXllcl9pbmZvIHsKKworICAgIHN0cnVjdCBlc2RfcGxheWVyX2luZm8gKm5leHQ7IC8qIHBvaW50IHRvIG5leHQgZW50cnkgaW4gbGlzdCAqLworICAgIGVzZF9zZXJ2ZXJfaW5mb190ICpzZXJ2ZXI7CS8qIHRoZSBzZXJ2ZXIgdGhhdCBjb250YWlucyB0aGlzIHN0cmVhbSAqLworICAgIAorICAgIGludCBzb3VyY2VfaWQ7CQkvKiBlaXRoZXIgYSBzdHJlYW0gZmQgb3Igc2FtcGxlIGlkICovCisgICAgY2hhciBuYW1lWyBFU0RfTkFNRV9NQVggXTsJLyogbmFtZSBvZiBzdHJlYW0gZm9yIHJlbW90ZSBjb250cm9sICovCisgICAgaW50IHJhdGU7CQkJLyogc2FtcGxlIHJhdGUgKi8KKyAgICBpbnQgbGVmdF92b2xfc2NhbGU7CQkvKiB2b2x1bWUgc2NhbGluZyAqLworICAgIGludCByaWdodF92b2xfc2NhbGU7CisKKyAgICBlc2RfZm9ybWF0X3QgZm9ybWF0OwkvKiBtYWdpYyBpbnQgd2l0aCB0aGUgZm9ybWF0IGluZm8gKi8KKworfSBlc2RfcGxheWVyX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZXNkX3NhbXBsZV9pbmZvIHsKKworICAgIHN0cnVjdCBlc2Rfc2FtcGxlX2luZm8gKm5leHQ7IC8qIHBvaW50IHRvIG5leHQgZW50cnkgaW4gbGlzdCAqLworICAgIGVzZF9zZXJ2ZXJfaW5mb190ICpzZXJ2ZXI7CS8qIHRoZSBzZXJ2ZXIgdGhhdCBjb250YWlucyB0aGlzIHNhbXBsZSAqLworICAgIAorICAgIGludCBzYW1wbGVfaWQ7CQkvKiBlaXRoZXIgYSBzdHJlYW0gZmQgb3Igc2FtcGxlIGlkICovCisgICAgY2hhciBuYW1lWyBFU0RfTkFNRV9NQVggXTsJLyogbmFtZSBvZiBzdHJlYW0gZm9yIHJlbW90ZSBjb250cm9sICovCisgICAgaW50IHJhdGU7CQkJLyogc2FtcGxlIHJhdGUgKi8KKyAgICBpbnQgbGVmdF92b2xfc2NhbGU7CQkvKiB2b2x1bWUgc2NhbGluZyAqLworICAgIGludCByaWdodF92b2xfc2NhbGU7CisKKyAgICBlc2RfZm9ybWF0X3QgZm9ybWF0OwkvKiBtYWdpYyBpbnQgd2l0aCB0aGUgZm9ybWF0IGluZm8gKi8KKyAgICBpbnQgbGVuZ3RoOwkJCS8qIHRvdGFsIGJ1ZmZlciBsZW5ndGggKi8KKworfSBlc2Rfc2FtcGxlX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZXNkX2luZm8geworCisgICAgZXNkX3NlcnZlcl9pbmZvX3QgKnNlcnZlcjsKKyAgICBlc2RfcGxheWVyX2luZm9fdCAqcGxheWVyX2xpc3Q7CisgICAgZXNkX3NhbXBsZV9pbmZvX3QgKnNhbXBsZV9saXN0OworCit9IGVzZF9pbmZvX3Q7CisKK2VudW0gZXNkX3N0YW5kYnlfbW9kZSB7IAorICAgIEVTTV9FUlJPUiwgRVNNX09OX1NUQU5EQlksIEVTTV9PTl9BVVRPU1RBTkRCWSwgRVNNX1JVTk5JTkcKK307Cit0eXBlZGVmIGludCBlc2Rfc3RhbmRieV9tb2RlX3Q7CisKKy8qIGRlZmluZSBjYWxsYmFja3MgZm9yIGVzZF91cGRhdGVfaW5mbygpICovCisvKiB3aGF0IHRvIGRvIHdoZW4gYSBzdHJlYW0gY29ubmVjdHMsIG9yIHNhbXBsZSBpcyBwbGF5ZWQgKi8KK3R5cGVkZWYgaW50IGVzZF9uZXdfcGxheWVyX2NhbGxiYWNrX3QoIGVzZF9wbGF5ZXJfaW5mb190ICogKTsKKy8qIHdoYXQgdG8gZG8gd2hlbiBhIHN0cmVhbSBkaXNjb25uZWN0cywgb3Igc2FtcGxlIHN0b3BzIHBsYXlpbmcgKi8KK3R5cGVkZWYgaW50IGVzZF9vbGRfcGxheWVyX2NhbGxiYWNrX3QoIGVzZF9wbGF5ZXJfaW5mb190ICogKTsKKy8qIHdoYXQgdG8gZG8gd2hlbiBhIHNhbXBsZSBpcyBjYWNoZWQgKi8KK3R5cGVkZWYgaW50IGVzZF9uZXdfc2FtcGxlX2NhbGxiYWNrX3QoIGVzZF9zYW1wbGVfaW5mb190ICogKTsKKy8qIHdoYXQgdG8gZG8gd2hlbiBhIHNhbXBsZSBpcyB1bmNhY2hlZCAqLwordHlwZWRlZiBpbnQgZXNkX29sZF9zYW1wbGVfY2FsbGJhY2tfdCggZXNkX3NhbXBsZV9pbmZvX3QgKiApOworCit0eXBlZGVmIHN0cnVjdCBlc2RfdXBkYXRlX2luZm9fY2FsbGJhY2tzIHsKKyAgICBlc2RfbmV3X3BsYXllcl9jYWxsYmFja190ICplc2RfbmV3X3BsYXllcl9jYWxsYmFjazsKKyAgICBlc2Rfb2xkX3BsYXllcl9jYWxsYmFja190ICplc2Rfb2xkX3BsYXllcl9jYWxsYmFjazsKKyAgICBlc2RfbmV3X3NhbXBsZV9jYWxsYmFja190ICplc2RfbmV3X3NhbXBsZV9jYWxsYmFjazsKKyAgICBlc2Rfb2xkX3NhbXBsZV9jYWxsYmFja190ICplc2Rfb2xkX3NhbXBsZV9jYWxsYmFjazsKK30gZXNkX3VwZGF0ZV9pbmZvX2NhbGxiYWNrc190OworCisvKiBwcmludCBzZXJ2ZXIgaW50byB0byBzdGRvdXQgKi8KK3ZvaWQgZXNkX3ByaW50X3NlcnZlcl9pbmZvKCBlc2Rfc2VydmVyX2luZm9fdCAqc2VydmVyX2luZm8gKTsKK3ZvaWQgZXNkX3ByaW50X3BsYXllcl9pbmZvKCBlc2RfcGxheWVyX2luZm9fdCAqcGxheWVyX2luZm8gKTsKK3ZvaWQgZXNkX3ByaW50X3NhbXBsZV9pbmZvKCBlc2Rfc2FtcGxlX2luZm9fdCAqc2FtcGxlX2luZm8gKTsKKy8qIHByaW50IGFsbCBpbmZvIHRvIHN0ZG91dCAqLwordm9pZCBlc2RfcHJpbnRfYWxsX2luZm8oIGVzZF9pbmZvX3QgKmFsbF9pbmZvICk7CisKKy8qIHJldHJpZXZlIHNlcnZlciBwcm9wZXJ0aWVzIChzYW1wbGUgcmF0ZSwgZm9ybWF0LCB2ZXJzaW9uIG51bWJlcikgKi8KK2VzZF9zZXJ2ZXJfaW5mb190ICplc2RfZ2V0X3NlcnZlcl9pbmZvKCBpbnQgZXNkICk7CisvKiByZWxlYXNlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgc2VydmVyIHByb3BlcnRpZXMgc3RydWN0dXJlICovCit2b2lkIGVzZF9mcmVlX3NlcnZlcl9pbmZvKCBlc2Rfc2VydmVyX2luZm9fdCAqc2VydmVyX2luZm8gKTsKKworLyogcmV0cmlldmUgYWxsIGluZm9ybWF0aW9uIGZyb20gc2VydmVyICovCitlc2RfaW5mb190ICplc2RfZ2V0X2FsbF9pbmZvKCBpbnQgZXNkICk7CisKKy8qIHJldHJpZXZlIGFsbCBpbmZvcm1hdGlvbiBmcm9tIHNlcnZlciwgYW5kIHVwZGF0ZSB1bnRpbCB1bnN1YnNyaWJlZCBvciBjbG9zZWQgKi8KK2VzZF9pbmZvX3QgKmVzZF9zdWJzY3JpYmVfYWxsX2luZm8oIGludCBlc2QgKTsKKworLyogY2FsbCB0byB1cGRhdGUgdGhlIGluZm8gc3RydWN0dXJlIHdpdGggbmV3IGluZm9ybWF0aW9uLCBhbmQgY2FsbCBjYWxsYmFja3MgKi8KK2VzZF9pbmZvX3QgKmVzZF91cGRhdGVfaW5mbyggaW50IGVzZCwgZXNkX2luZm9fdCAqaW5mbywgCisJCQkgICAgIGVzZF91cGRhdGVfaW5mb19jYWxsYmFja3NfdCAqY2FsbGJhY2tzICk7Citlc2RfaW5mb190ICplc2RfdW5zdWJzY3JpYmVfaW5mbyggaW50IGVzZCApOworCisvKiByZWxlYXNlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgZXNkIGluZm8gc3RydWN0dXJlICovCit2b2lkIGVzZF9mcmVlX2FsbF9pbmZvKCBlc2RfaW5mb190ICppbmZvICk7CisKKworLyogcmVzZXQgdGhlIHZvbHVtZSBwYW5uaW5nIGZvciBhIHN0cmVhbSAqLworaW50IGVzZF9zZXRfc3RyZWFtX3BhbiggaW50IGVzZCwgaW50IHN0cmVhbV9pZCwgCisJCQlpbnQgbGVmdF9zY2FsZSwgaW50IHJpZ2h0X3NjYWxlICk7CisKKy8qIHJlc2V0IHRoZSBkZWZhdWx0IHZvbHVtZSBwYW5uaW5nIGZvciBhIHNhbXBsZSAqLworaW50IGVzZF9zZXRfZGVmYXVsdF9zYW1wbGVfcGFuKCBpbnQgZXNkLCBpbnQgc2FtcGxlX2lkLCAKKwkJCQlpbnQgbGVmdF9zY2FsZSwgaW50IHJpZ2h0X3NjYWxlICk7CisKKy8qIHNlZSBpZiB0aGUgc2VydmVyIGlzIGluIHN0bmFieSwgYXV0b3N0YW5kYnksIGV0YyAqLworZXNkX3N0YW5kYnlfbW9kZV90IGVzZF9nZXRfc3RhbmRieV9tb2RlKCBpbnQgZXNkICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlc2RmaWxlLmMgLSBhdWRpb2ZpbGUgd3JhcHBlcnMgZm9yIHNhbmUgaGFuZGxpbmcgb2YgZmlsZXMgKi8KKworaW50IGVzZF9zZW5kX2ZpbGUoIGludCBlc2QsIEFGZmlsZWhhbmRsZSBhdV9maWxlLCBpbnQgZnJhbWVfbGVuZ3RoICk7CitpbnQgZXNkX3BsYXlfZmlsZSggY29uc3QgY2hhciAqbmFtZV9wcmVmaXgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmFsbGJhY2sgKTsKK2ludCBlc2RfZmlsZV9jYWNoZSggaW50IGVzZCwgY29uc3QgY2hhciAqbmFtZV9wcmVmaXgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBhdWRpby5jIC0gYWJzdHJhY3QgdGhlIHNvdW5kIGhhcmR3YXJlIGZvciBjcm9zcyBwbGF0Zm9ybSB1c2FnZSAqLworZXh0ZXJuIGVzZF9mb3JtYXRfdCBlc2RfYXVkaW9fZm9ybWF0OworZXh0ZXJuIGludCBlc2RfYXVkaW9fcmF0ZTsKK2V4dGVybiBjaGFyICplc2RfYXVkaW9fZGV2aWNlOworCitjb25zdCBjaGFyICplc2RfYXVkaW9fZGV2aWNlcyggdm9pZCApOworaW50IGVzZF9hdWRpb19vcGVuKCB2b2lkICk7Cit2b2lkIGVzZF9hdWRpb19jbG9zZSggdm9pZCApOwordm9pZCBlc2RfYXVkaW9fcGF1c2UoIHZvaWQgKTsKK2ludCBlc2RfYXVkaW9fd3JpdGUoIHZvaWQgKmJ1ZmZlciwgaW50IGJ1Zl9zaXplICk7CitpbnQgZXNkX2F1ZGlvX3JlYWQoIHZvaWQgKmJ1ZmZlciwgaW50IGJ1Zl9zaXplICk7Cit2b2lkIGVzZF9hdWRpb19mbHVzaCggdm9pZCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdXRpbC5jIHV0aWxpdGllcwkJCQkJCSAgKi8KKworY29uc3QgY2hhciAqZXNkX2dldF9zb2NrZXRfZGlybmFtZSggdm9pZCApOworY29uc3QgY2hhciAqZXNkX2dldF9zb2NrZXRfbmFtZSggdm9pZCApOworCitpbnQgaGF2ZV9pcHY2KCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmIC8qICNpZm5kZWYgRVNEX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXRpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2V0aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTYxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2V0aS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogIEp1ZXJnZW4gUGZlaWZlciwgMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogZXRpLmgsdiAxLjggMjAwMy8xMC8yNSAxNToyNDoyOSB0b20gRXhwICQgKi8KKworI2lmbmRlZiBOQ1VSU0VTX0VUSV9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19FVElfSF9pbmNsIDEKKworI2RlZmluZQlFX09LCQkJKDApCisjZGVmaW5lCUVfU1lTVEVNX0VSUk9SCSAJKC0xKQorI2RlZmluZQlFX0JBRF9BUkdVTUVOVAkgCSgtMikKKyNkZWZpbmUJRV9QT1NURUQJIAkoLTMpCisjZGVmaW5lCUVfQ09OTkVDVEVECSAJKC00KQorI2RlZmluZQlFX0JBRF9TVEFURQkgCSgtNSkKKyNkZWZpbmUJRV9OT19ST09NCSAJKC02KQorI2RlZmluZQlFX05PVF9QT1NURUQJCSgtNykKKyNkZWZpbmUJRV9VTktOT1dOX0NPTU1BTkQJKC04KQorI2RlZmluZQlFX05PX01BVENICQkoLTkpCisjZGVmaW5lCUVfTk9UX1NFTEVDVEFCTEUJKC0xMCkKKyNkZWZpbmUJRV9OT1RfQ09OTkVDVEVECSAgICAgICAgKC0xMSkKKyNkZWZpbmUJRV9SRVFVRVNUX0RFTklFRAkoLTEyKQorI2RlZmluZQlFX0lOVkFMSURfRklFTEQJICAgICAgICAoLTEzKQorI2RlZmluZQlFX0NVUlJFTlQJCSgtMTQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ldGlwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2V0aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI0NTEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ldGlwLmgKQEAgLTAsMCArMSwzNzIgQEAKKy8vICogVGhpcyBtYWtlcyBlbWFjcyBoYXBweSAtKi1Nb2RlOiBDKys7LSotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUsMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBBdXRob3I6IEp1ZXJnZW4gUGZlaWZlciwgMTk5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyAkSWQ6IGV0aXAuaC5pbix2IDEuMzYgMjAwNy8wNC8wNyAxODo1NjozMiB0b20gRXhwICQKKworI2lmbmRlZiBOQ1VSU0VTX0VUSVBfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfRVRJUF9IX2luY2wgMQorCisvLyBUaGVzZSBhcmUgc3Vic3RpdHV0ZWQgYXQgY29uZmlndXJlL2J1aWxkIHRpbWUKKyNpZm5kZWYgSEFWRV9CVUlMVElOX0gKKyNkZWZpbmUgSEFWRV9CVUlMVElOX0ggMAorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9HWFhfQlVJTFRJTl9ICisjZGVmaW5lIEhBVkVfR1hYX0JVSUxUSU5fSCAwCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dQUF9CVUlMVElOX0gKKyNkZWZpbmUgSEFWRV9HUFBfQlVJTFRJTl9IIDAKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSU9TVFJFQU0KKyNkZWZpbmUgSEFWRV9JT1NUUkVBTSAxCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1RZUEVJTkZPCisjZGVmaW5lIEhBVkVfVFlQRUlORk8gMQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9WQUxVRVNfSAorI2RlZmluZSBIQVZFX1ZBTFVFU19IIDAKKyNlbmRpZgorCisjaWZuZGVmIEVUSVBfTkVFRFNfTUFUSF9ICisjZGVmaW5lIEVUSVBfTkVFRFNfTUFUSF9IIDEKKyNlbmRpZgorCisjaWZuZGVmIEVUSVBfTkVFRFNfTUFUSF9FWENFUFRJT04KKyNkZWZpbmUgRVRJUF9ORUVEU19NQVRIX0VYQ0VQVElPTiAwCisjZW5kaWYKKworI2lmbmRlZiBDUFBfSEFTX1BBUkFNX0lOSVQKKyNkZWZpbmUgQ1BQX0hBU19QQVJBTV9JTklUIDAKKyNlbmRpZgorCisjaWZuZGVmIENQUF9IQVNfU1RBVElDX0NBU1QKKyNkZWZpbmUgQ1BQX0hBU19TVEFUSUNfQ0FTVCAxCisjZW5kaWYKKworI2lmZGVmIF9fR05VR19fCisjICBpZiAoKF9fR05VR19fIDw9IDIpICYmIChfX0dOVUNfTUlOT1JfXyA8IDgpKQorIyAgICBpZiBIQVZFX1RZUEVJTkZPCisjICAgICAgaW5jbHVkZSA8dHlwZWluZm8+CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VR19fKQorIyAgaWYgSEFWRV9CVUlMVElOX0ggfHwgSEFWRV9HWFhfQlVJTFRJTl9IIHx8IEhBVkVfR1BQX0JVSUxUSU5fSAorIyAgICBpZiBFVElQX05FRURTX01BVEhfSAorIyAgICAgIGlmIEVUSVBfTkVFRFNfTUFUSF9FWENFUFRJT04KKyMgICAgICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgICAgICAgZGVmaW5lIGV4Y2VwdGlvbiBtYXRoX2V4Y2VwdGlvbgorIyAgICAgIGVuZGlmCisjICAgICAgaW5jbHVkZSA8bWF0aC5oPgorIyAgICBlbmRpZgorIyAgICB1bmRlZiBleGNlcHRpb24KKyMgICAgZGVmaW5lIGV4Y2VwdGlvbiBidWlsdGluX2V4Y2VwdGlvbgorIyAgICBpZiBIQVZFX0dQUF9CVUlMVElOX0gKKyMgICAgIGluY2x1ZGUgPGdwcC9idWlsdGluLmg+CisjICAgIGVsaWYgSEFWRV9HWFhfQlVJTFRJTl9ICisjICAgICBpbmNsdWRlIDxnKysvYnVpbHRpbi5oPgorIyAgICBlbHNlCisjICAgICBpbmNsdWRlIDxidWlsdGluLmg+CisjICAgIGVuZGlmCisjICAgIHVuZGVmIGV4Y2VwdGlvbgorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fU1VOUFJPX0NDKQorIyAgaW5jbHVkZSA8Z2VuZXJpYy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuY3Vyc2VzX2RsbC5oPgorCitleHRlcm4gIkMiIHsKKyNpZiBIQVZFX1ZBTFVFU19ICisjICBpbmNsdWRlIDx2YWx1ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXRpLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KK30KKworLy8gTGFuZ3VhZ2UgZmVhdHVyZXMKKyNpZiBDUFBfSEFTX1BBUkFNX0lOSVQKKyNkZWZpbmUgTkNVUlNFU19QQVJBTV9JTklUKHZhbHVlKSA9IHZhbHVlCisjZWxzZQorI2RlZmluZSBOQ1VSU0VTX1BBUkFNX0lOSVQodmFsdWUpIC8qbm90aGluZyovCisjZW5kaWYKKworI2lmIENQUF9IQVNfU1RBVElDX0NBU1QKKyNkZWZpbmUgU1RBVElDX0NBU1Qocykgc3RhdGljX2Nhc3Q8cz4KKyNlbHNlCisjZGVmaW5lIFNUQVRJQ19DQVNUKHMpIChzKQorI2VuZGlmCisKKy8vIEZvcndhcmQgRGVjbGFyYXRpb25zCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzUGFuZWw7CitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudTsKK2NsYXNzIE5DVVJTRVNfSU1QRVhQIE5DdXJzZXNGb3JtOworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7CisgIGludCBlcnJvcm5vOworCisgIE5DdXJzZXNFeGNlcHRpb24gKGNvbnN0IGNoYXIqIG1zZywgaW50IGVycikKKyAgICA6IG1lc3NhZ2UobXNnKSwgZXJyb3JubyAoZXJyKQorICAgIHt9OworCisgIE5DdXJzZXNFeGNlcHRpb24gKGNvbnN0IGNoYXIqIG1zZykKKyAgICA6IG1lc3NhZ2UobXNnKSwgZXJyb3JubyAoRV9TWVNURU1fRVJST1IpCisgICAge307CisKKyAgTkN1cnNlc0V4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNFeGNlcHRpb24mIHJocykKKyAgeworICAgIGVycm9ybm8gPSByaHMuZXJyb3JubzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzRXhjZXB0aW9uKGNvbnN0IE5DdXJzZXNFeGNlcHRpb24mIHJocykKKyAgICA6IG1lc3NhZ2UocmhzLm1lc3NhZ2UpLCBlcnJvcm5vKHJocy5lcnJvcm5vKQorICB7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIk5DdXJzZXNXaW5kb3ciOworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc0V4Y2VwdGlvbigpCisgIHsKKyAgfQorfTsKKworY2xhc3MgTkNVUlNFU19JTVBFWFAgTkN1cnNlc1BhbmVsRXhjZXB0aW9uIDogcHVibGljIE5DdXJzZXNFeGNlcHRpb24KK3sKK3B1YmxpYzoKKyAgY29uc3QgTkN1cnNlc1BhbmVsKiBwOworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoY29uc3QgY2hhciAqbXNnLCBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIHAgKE5VTEwpCisgICAge307CisKKyAgTkN1cnNlc1BhbmVsRXhjZXB0aW9uIChjb25zdCBOQ3Vyc2VzUGFuZWwqIHBhbmVsLAorCQkJIGNvbnN0IGNoYXIgKm1zZywKKwkJCSBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIHAgKHBhbmVsKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoaW50IGVycikgOgorICAgIE5DdXJzZXNFeGNlcHRpb24gKCJwYW5lbCBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBwIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc1BhbmVsKiBwYW5lbCwKKwkJCSBpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAoInBhbmVsIGxpYnJhcnkgZXJyb3IiLCBlcnIpLAorICAgIHAgKHBhbmVsKQorICAgIHt9OworCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiYgb3BlcmF0b3I9KGNvbnN0IE5DdXJzZXNQYW5lbEV4Y2VwdGlvbiYgcmhzKQorICB7CisgICAgaWYgKHRoaXMgIT0gJnJocykgeworICAgICAgTkN1cnNlc0V4Y2VwdGlvbjo6b3BlcmF0b3I9KHJocyk7CisgICAgICBwID0gcmhzLnA7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE5DdXJzZXNQYW5lbEV4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzUGFuZWxFeGNlcHRpb24mIHJocykKKyAgICA6IE5DdXJzZXNFeGNlcHRpb24ocmhzKSwgcChyaHMucCkKKyAgeworICB9CisKKyAgdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJOQ3Vyc2VzUGFuZWwiOworICB9CisKKyAgdmlydHVhbCB+TkN1cnNlc1BhbmVsRXhjZXB0aW9uKCkKKyAgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiA6IHB1YmxpYyBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IE5DdXJzZXNNZW51KiBtOworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uIChjb25zdCBjaGFyICptc2csIGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uIChtc2csIGVyciksCisgICAgbSAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc01lbnUqIG1lbnUsCisJCQljb25zdCBjaGFyICptc2csCisJCQlpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIG0gKG1lbnUpCisgICAge307CisKKyAgTkN1cnNlc01lbnVFeGNlcHRpb24gKGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgibWVudSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBtIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uIChjb25zdCBOQ3Vyc2VzTWVudSogbWVudSwKKwkJCWludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgibWVudSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBtIChtZW51KQorICAgIHt9OworCisgIE5DdXJzZXNNZW51RXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc01lbnVFeGNlcHRpb24mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgIE5DdXJzZXNFeGNlcHRpb246Om9wZXJhdG9yPShyaHMpOworICAgICAgbSA9IHJocy5tOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzTWVudUV4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzTWVudUV4Y2VwdGlvbiYgcmhzKQorICAgIDogTkN1cnNlc0V4Y2VwdGlvbihyaHMpLCBtKHJocy5tKQorICB7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIk5DdXJzZXNNZW51IjsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNNZW51RXhjZXB0aW9uKCkKKyAgeworICB9Cit9OworCitjbGFzcyBOQ1VSU0VTX0lNUEVYUCBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiA6IHB1YmxpYyBOQ3Vyc2VzRXhjZXB0aW9uCit7CitwdWJsaWM6CisgIGNvbnN0IE5DdXJzZXNGb3JtKiBmOworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uIChjb25zdCBjaGFyICptc2csIGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uIChtc2csIGVyciksCisgICAgZiAoTlVMTCkKKyAgICB7fTsKKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiAoY29uc3QgTkN1cnNlc0Zvcm0qIGZvcm0sCisJCQljb25zdCBjaGFyICptc2csCisJCQlpbnQgZXJyKSA6CisgICAgTkN1cnNlc0V4Y2VwdGlvbiAobXNnLCBlcnIpLAorICAgIGYgKGZvcm0pCisgICAge307CisKKyAgTkN1cnNlc0Zvcm1FeGNlcHRpb24gKGludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgiZm9ybSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBmIChOVUxMKQorICAgIHt9OworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uIChjb25zdCBOQ3Vyc2VzRm9ybSogZm9ybSwKKwkJCWludCBlcnIpIDoKKyAgICBOQ3Vyc2VzRXhjZXB0aW9uICgiZm9ybSBsaWJyYXJ5IGVycm9yIiwgZXJyKSwKKyAgICBmIChmb3JtKQorICAgIHt9OworCisgIE5DdXJzZXNGb3JtRXhjZXB0aW9uJiBvcGVyYXRvcj0oY29uc3QgTkN1cnNlc0Zvcm1FeGNlcHRpb24mIHJocykKKyAgeworICAgIGlmICh0aGlzICE9ICZyaHMpIHsKKyAgICAgIE5DdXJzZXNFeGNlcHRpb246Om9wZXJhdG9yPShyaHMpOworICAgICAgZiA9IHJocy5mOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbihjb25zdCBOQ3Vyc2VzRm9ybUV4Y2VwdGlvbiYgcmhzKQorICAgIDogTkN1cnNlc0V4Y2VwdGlvbihyaHMpLCBmKHJocy5mKQorICB7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIk5DdXJzZXNGb3JtIjsKKyAgfQorCisgIHZpcnR1YWwgfk5DdXJzZXNGb3JtRXhjZXB0aW9uKCkKKyAgeworICB9Cit9OworCisjaWYgISgoZGVmaW5lZChfX0dOVUdfXykgJiYgZGVmaW5lZChfX0VYQ0VQVElPTlMpKSB8fCBkZWZpbmVkKF9fU1VOUFJPX0NDKSkKKyMgIGlmIEhBVkVfSU9TVFJFQU0KKyMgICAgIGluY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgc3RkOjpjZXJyOwordXNpbmcgc3RkOjplbmRsOworIyAgZWxzZQorIyAgICAgaW5jbHVkZSA8aW9zdHJlYW0uaD4KKyMgIGVuZGlmCisgICBleHRlcm4gIkMiIHZvaWQgZXhpdChpbnQpOworI2VuZGlmCisKK2lubGluZSB2b2lkIFRIUk9XKGNvbnN0IE5DdXJzZXNFeGNlcHRpb24gKmUpIHsKKyNpZiBkZWZpbmVkKF9fR05VR19fKSAmJiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKKyMgIGlmICgoX19HTlVHX18gPD0gMikgJiYgKF9fR05VQ19NSU5PUl9fIDwgOCkpCisgICAgICAoKmxpYl9lcnJvcl9oYW5kbGVyKShlID8gZS0+Y2xhc3NuYW1lKCkgOiAiIiwgZSA/IGUtPm1lc3NhZ2UgOiAiIik7CisjZWxzZQorI2RlZmluZSBDUFBfSEFTX1RSWV9DQVRDSCAxCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpCisjICBpZiAhZGVmaW5lZChfX1NVTlBST19DQ19DT01QQVQpIHx8IChfX1NVTlBST19DQ19DT01QQVQgPCA1KQorICBnZW5lcmljZXJyb3IoMSwgKChlICE9IDApID8gKGNoYXIgKikoZS0+bWVzc2FnZSkgOiAiIikpOworI2Vsc2UKKyNkZWZpbmUgQ1BQX0hBU19UUllfQ0FUQ0ggMQorI2VuZGlmCisjZWxzZQorICBpZiAoZSkKKyAgICBjZXJyIDw8IGUtPm1lc3NhZ2UgPDwgZW5kbDsKKyAgZXhpdCgwKTsKKyNlbmRpZgorCisjaWZuZGVmIENQUF9IQVNfVFJZX0NBVENICisjZGVmaW5lIENQUF9IQVNfVFJZX0NBVENIIDAKKyNkZWZpbmUgTkNVUlNFU19DUFBfVFJZCQkvKiBub3RoaW5nICovCisjZGVmaW5lIE5DVVJTRVNfQ1BQX0NBVENIKGUpCWlmIChmYWxzZSkKKyNkZWZpbmUgVEhST1dTKHMpCQkvKiBub3RoaW5nICovCisjZWxpZiBDUFBfSEFTX1RSWV9DQVRDSAorICB0aHJvdyAqZTsKKyNkZWZpbmUgTkNVUlNFU19DUFBfVFJZCQl0cnkKKyNkZWZpbmUgTkNVUlNFU19DUFBfQ0FUQ0goZSkJY2F0Y2goZSkKKyNkZWZpbmUgVEhST1dTKHMpCQl0aHJvdyhzKQorI2VuZGlmCit9CisKKyNlbmRpZiAvKiBOQ1VSU0VTX0VUSVBfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2V4ZWNpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2V4ZWNpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2MTRjYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZXhlY2luZm8uaApAQCAtMCwwICsxLDQ0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0VYRUNJTkZPX0gKKyNkZWZpbmUgX0VYRUNJTkZPX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTdG9yZSB1cCB0byBTSVpFIHJldHVybiBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IHByb2dyYW0gc3RhdGUgaW4KKyAgIEFSUkFZIGFuZCByZXR1cm4gdGhlIGV4YWN0IG51bWJlciBvZiB2YWx1ZXMgc3RvcmVkLiAgKi8KK2V4dGVybiBpbnQgYmFja3RyYWNlICh2b2lkICoqX19hcnJheSwgaW50IF9fc2l6ZSkgX19ub25udWxsICgoMSkpOworCisKKy8qIFJldHVybiBuYW1lcyBvZiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFja3RyYWNlIGxpc3QgaW4gQVJSQVkgaW4gYSBuZXdseQorICAgbWFsbG9jKCllZCBtZW1vcnkgYmxvY2suICAqLworZXh0ZXJuIGNoYXIgKipiYWNrdHJhY2Vfc3ltYm9scyAodm9pZCAqX19jb25zdCAqX19hcnJheSwgaW50IF9fc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGJhY2t0cmFjZV9zeW1ib2xzKCkgYnV0IGl0IHdyaXRlcyB0aGUgcmVzdWx0CisgICBpbW1lZGlhdGVseSB0byBhIGZpbGUuICAqLworZXh0ZXJuIHZvaWQgYmFja3RyYWNlX3N5bWJvbHNfZmQgKHZvaWQgKl9fY29uc3QgKl9fYXJyYXksIGludCBfX3NpemUsIGludCBfX2ZkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGV4ZWNpbmZvLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ZjbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwYmIzMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmNudGwuaApAQCAtMCwwICsxLDIyMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NC0yMDAxLDIwMDMsMjAwNCwyMDA1LDIwMDYsMjAwNworCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDYuNSBGaWxlIENvbnRyb2wgT3BlcmF0aW9ucwk8ZmNudGwuaD4KKyAqLworCisjaWZuZGVmCV9GQ05UTF9ICisjZGVmaW5lCV9GQ05UTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIFRoaXMgbXVzdCBiZSBlYXJseSBzbyA8Yml0cy9mY250bC5oPiBjYW4gZGVmaW5lIHR5cGVzIHdpbm5pbmdseS4gICovCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbnMgb2YgT18qLCBGXyosIEZEXyo6IGFsbCB0aGUKKyAgIG51bWJlcnMgYW5kIGZsYWcgYml0cyBmb3IgYG9wZW4nLCBgZmNudGwnLCBldCBhbC4gICovCisjaW5jbHVkZSA8Yml0cy9mY250bC5oPgorCisvKiBGb3IgWFBHIGFsbCBzeW1ib2xzIGZyb20gPHN5cy9zdGF0Lmg+IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZS4gICovCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaWZkZWYJX19VU0VfTUlTQworIyBpZm5kZWYgUl9PSwkJCS8qIFZlcmJhdGltIGZyb20gPHVuaXN0ZC5oPi4gIFVnaC4gICovCisvKiBWYWx1ZXMgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYWNjZXNzLgorICAgVGhlc2UgbWF5IGJlIE9SJ2QgdG9nZXRoZXIuICAqLworIyAgZGVmaW5lIFJfT0sJNAkJLyogVGVzdCBmb3IgcmVhZCBwZXJtaXNzaW9uLiAgKi8KKyMgIGRlZmluZSBXX09LCTIJCS8qIFRlc3QgZm9yIHdyaXRlIHBlcm1pc3Npb24uICAqLworIyAgZGVmaW5lIFhfT0sJMQkJLyogVGVzdCBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLiAgKi8KKyMgIGRlZmluZSBGX09LCTAJCS8qIFRlc3QgZm9yIGV4aXN0ZW5jZS4gICovCisjIGVuZGlmCisjZW5kaWYgLyogVXNlIG1pc2MuICAqLworCisvKiBYUEcgd2FudHMgdGhlIGZvbGxvd2luZyBzeW1ib2xzLiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTgkJLyogPHN0ZGlvLmg+IGhhcyB0aGUgc2FtZSBkZWZpbml0aW9ucy4gICovCisjIGRlZmluZSBTRUVLX1NFVAkwCS8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjIGRlZmluZSBTRUVLX0NVUgkxCS8qIFNlZWsgZnJvbSBjdXJyZW50IHBvc2l0aW9uLiAgKi8KKyMgZGVmaW5lIFNFRUtfRU5ECTIJLyogU2VlayBmcm9tIGVuZCBvZiBmaWxlLiAgKi8KKyNlbmRpZgkvKiBYUEcgKi8KKworI2lmZGVmIF9fVVNFX0FURklMRQorIyBkZWZpbmUgQVRfRkRDV0QJCS0xMDAJLyogU3BlY2lhbCB2YWx1ZSB1c2VkIHRvIGluZGljYXRlCisJCQkJCSAgIHRoZSAqYXQgZnVuY3Rpb25zIHNob3VsZCB1c2UgdGhlCisJCQkJCSAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICovCisjIGRlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XCTB4MTAwCS8qIERvIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworIyBkZWZpbmUgQVRfUkVNT1ZFRElSCQkweDIwMAkvKiBSZW1vdmUgZGlyZWN0b3J5IGluc3RlYWQgb2YKKwkJCQkJICAgdW5saW5raW5nIGZpbGUuICAqLworIyBkZWZpbmUgQVRfU1lNTElOS19GT0xMT1cJMHg0MDAJLyogRm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KKyMgZGVmaW5lIEFUX0VBQ0NFU1MJCTB4MjAwCS8qIFRlc3QgYWNjZXNzIHBlcm1pdHRlZCBmb3IKKwkJCQkJICAgZWZmZWN0aXZlIElEcywgbm90IHJlYWwgSURzLiAgKi8KKyNlbmRpZgorCisvKiBEbyB0aGUgZmlsZSBjb250cm9sIG9wZXJhdGlvbiBkZXNjcmliZWQgYnkgQ01EIG9uIEZELgorICAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGludGVycHJldGVkIGRlcGVuZGluZyBvbiBDTUQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmY250bCAoaW50IF9fZmQsIGludCBfX2NtZCwgLi4uKTsKKworLyogT3BlbiBGSUxFIGFuZCByZXR1cm4gYSBuZXcgZmlsZSBkZXNjcmlwdG9yIGZvciBpdCwgb3IgLTEgb24gZXJyb3IuCisgICBPRkxBRyBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIGFjY2VzcyB1c2VkLiAgSWYgT19DUkVBVCBpcyBvbiBPRkxBRywKKyAgIHRoZSB0aGlyZCBhcmd1bWVudCBpcyB0YWtlbiBhcyBhIGBtb2RlX3QnLCB0aGUgbW9kZSBvZiB0aGUgY3JlYXRlZCBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBvcGVuIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fb2ZsYWcsIC4uLikgX19ub25udWxsICgoMSkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChvcGVuLCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLCAuLi4pLCBvcGVuNjQpCisgICAgIF9fbm9ubnVsbCAoKDEpKTsKKyMgZWxzZQorIyAgZGVmaW5lIG9wZW4gb3BlbjY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBvcGVuNjQgKF9fY29uc3QgY2hhciAqX19maWxlLCBpbnQgX19vZmxhZywgLi4uKSBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2ltaWxhciB0byBgb3BlbicgYnV0IGEgcmVsYXRpdmUgcGF0aCBuYW1lIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvCisgICB0aGUgZGlyZWN0b3J5IGZvciB3aGljaCBGRCBpcyBhIGRlc2NyaXB0b3IuCisKKyAgIE5PVEU6IHNvbWUgb3RoZXIgYG9wZW5hdCcgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkKKyAgIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UsIGVzcGVjaWFsbHkgdXNpbmcgdGhlIE9fWEFUVFIgZmxhZy4gIFRoaXMgaXMgbm90CisgICB5ZXQgc3VwcG9ydGVkIGhlcmUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBvcGVuYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fb2ZsYWcsIC4uLikKKyAgICAgX19ub25udWxsICgoMikpOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKG9wZW5hdCwgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fb2ZsYWcsCisJCQkJLi4uKSwgb3BlbmF0NjQpIF9fbm9ubnVsbCAoKDIpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgb3BlbmF0IG9wZW5hdDY0CisjICBlbmRpZgorIyBlbmRpZgorCitleHRlcm4gaW50IG9wZW5hdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIGludCBfX29mbGFnLCAuLi4pCisgICAgIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisvKiBDcmVhdGUgYW5kIG9wZW4gRklMRSwgd2l0aCBtb2RlIE1PREUuICBUaGlzIHRha2VzIGFuIGBpbnQnIE1PREUKKyAgIGFyZ3VtZW50IGJlY2F1c2UgdGhhdCBpcyB3aGF0IGBtb2RlX3QnIHdpbGwgYmUgd2lkZW5lZCB0by4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgY3JlYXQgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpIF9fbm9ubnVsbCAoKDEpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoY3JlYXQsIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlKSwKKwkJICAgICAgIGNyZWF0NjQpIF9fbm9ubnVsbCAoKDEpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGNyZWF0IGNyZWF0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGNyZWF0NjQgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgRl9MT0NLICYmIChkZWZpbmVkIF9fVVNFX01JU0MgfHwgKGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQgXAorCQkJCQkgICAgICAgJiYgIWRlZmluZWQgX19VU0VfUE9TSVgpKQorLyogTk9URTogVGhlc2UgZGVjbGFyYXRpb25zIGFsc28gYXBwZWFyIGluIDx1bmlzdGQuaD47IGJlIHN1cmUgdG8ga2VlcCBib3RoCisgICBmaWxlcyBjb25zaXN0ZW50LiAgU29tZSBzeXN0ZW1zIGhhdmUgdGhlbSB0aGVyZSBhbmQgc29tZSBoZXJlLCBhbmQgc29tZQorICAgc29mdHdhcmUgZGVwZW5kcyBvbiB0aGUgbWFjcm9zIGJlaW5nIGRlZmluZWQgd2l0aG91dCBpbmNsdWRpbmcgYm90aC4gICovCisKKy8qIGBsb2NrZicgaXMgYSBzaW1wbGVyIGludGVyZmFjZSB0byB0aGUgbG9ja2luZyBmYWNpbGl0aWVzIG9mIGBmY250bCcuCisgICBMRU4gaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCisgICBUaGUgQ01EIGFyZ3VtZW50IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgKi8KKworIyBkZWZpbmUgRl9VTE9DSyAwCS8qIFVubG9jayBhIHByZXZpb3VzbHkgbG9ja2VkIHJlZ2lvbi4gICovCisjIGRlZmluZSBGX0xPQ0sgIDEJLyogTG9jayBhIHJlZ2lvbiBmb3IgZXhjbHVzaXZlIHVzZS4gICovCisjIGRlZmluZSBGX1RMT0NLIDIJLyogVGVzdCBhbmQgbG9jayBhIHJlZ2lvbiBmb3IgZXhjbHVzaXZlIHVzZS4gICovCisjIGRlZmluZSBGX1RFU1QgIDMJLyogVGVzdCBhIHJlZ2lvbiBmb3Igb3RoZXIgcHJvY2Vzc2VzIGxvY2tzLiAgKi8KKworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBsb2NrZiAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmZfdCBfX2xlbik7CisjIGVsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChsb2NrZiwgKGludCBfX2ZkLCBpbnQgX19jbWQsIF9fb2ZmNjRfdCBfX2xlbiksIGxvY2tmNjQpOworIyBlbHNlCisjICBkZWZpbmUgbG9ja2YgbG9ja2Y2NAorIyBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBsb2NrZjY0IChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZjY0X3QgX19sZW4pOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBBZHZpY2UgdGhlIHN5c3RlbSBhYm91dCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIG9mIHRoZSBhcHBsaWNhdGlvbiB3aXRoCisgICByZXNwZWN0IHRvIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBGRC4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHBvc2l4X2ZhZHZpc2UgKGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0LCBfX29mZl90IF9fbGVuLAorCQkJICBpbnQgX19hZHZpc2UpIF9fVEhST1c7CisjIGVsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHBvc2l4X2ZhZHZpc2UsIChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LAorCQkJCQkgICBfX29mZjY0X3QgX19sZW4sIGludCBfX2FkdmlzZSksCisJCQkgICBwb3NpeF9mYWR2aXNlNjQpOworIyBlbHNlCisjICBkZWZpbmUgcG9zaXhfZmFkdmlzZSBwb3NpeF9mYWR2aXNlNjQKKyMgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgcG9zaXhfZmFkdmlzZTY0IChpbnQgX19mZCwgX19vZmY2NF90IF9fb2Zmc2V0LCBfX29mZjY0X3QgX19sZW4sCisJCQkgICAgaW50IF9fYWR2aXNlKSBfX1RIUk9XOworIyBlbmRpZgorCisKKy8qIFJlc2VydmUgc3RvcmFnZSBmb3IgdGhlIGRhdGEgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIEZELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IHBvc2l4X2ZhbGxvY2F0ZSAoaW50IF9fZmQsIF9fb2ZmX3QgX19vZmZzZXQsIF9fb2ZmX3QgX19sZW4pOworIyBlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAocG9zaXhfZmFsbG9jYXRlLCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwKKwkJCQkJIF9fb2ZmNjRfdCBfX2xlbiksCisJCSAgICAgICBwb3NpeF9mYWxsb2NhdGU2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBwb3NpeF9mYWxsb2NhdGUgcG9zaXhfZmFsbG9jYXRlNjQKKyMgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgcG9zaXhfZmFsbG9jYXRlNjQgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsIF9fb2ZmNjRfdCBfX2xlbik7CisjIGVuZGlmCisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBpbmxpbmVzIGhlbHBpbmcgdG8gY2F0Y2ggY29tbW9uIHByb2JsZW1zLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUgXAorICAgICYmIGRlZmluZWQgX192YV9hcmdfcGFja19sZW4KKyMgaW5jbHVkZSA8Yml0cy9mY250bDIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZmNudGwuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVlNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mZWF0dXJlcy5oCkBAIC0wLDAgKzEsMzU3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsMTk5MiwxOTkzLDE5OTUtMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9GRUFUVVJFU19ICisjZGVmaW5lCV9GRUFUVVJFU19ICTEKKworLyogVGhlc2UgYXJlIGRlZmluZWQgYnkgdGhlIHVzZXIgKG9yIHRoZSBjb21waWxlcikKKyAgIHRvIHNwZWNpZnkgdGhlIGRlc2lyZWQgZW52aXJvbm1lbnQ6CisKKyAgIF9fU1RSSUNUX0FOU0lfXwlJU08gU3RhbmRhcmQgQy4KKyAgIF9JU09DOTlfU09VUkNFCUV4dGVuc2lvbnMgdG8gSVNPIEM4OSBmcm9tIElTTyBDOTkuCisgICBfUE9TSVhfU09VUkNFCUlFRUUgU3RkIDEwMDMuMS4KKyAgIF9QT1NJWF9DX1NPVVJDRQlJZiA9PTEsIGxpa2UgX1BPU0lYX1NPVVJDRTsgaWYgPj0yIGFkZCBJRUVFIFN0ZCAxMDAzLjI7CisJCQlpZiA+PTE5OTMwOUwsIGFkZCBJRUVFIFN0ZCAxMDAzLjFiLTE5OTM7CisJCQlpZiA+PTE5OTUwNkwsIGFkZCBJRUVFIFN0ZCAxMDAzLjFjLTE5OTU7CisJCQlpZiA+PTIwMDExMkwsIGFsbCBvZiBJRUVFIDEwMDMuMS0yMDA0CisgICBfWE9QRU5fU09VUkNFCUluY2x1ZGVzIFBPU0lYIGFuZCBYUEcgdGhpbmdzLiAgU2V0IHRvIDUwMCBpZgorCQkJU2luZ2xlIFVuaXggY29uZm9ybWFuY2UgaXMgd2FudGVkLCB0byA2MDAgZm9yIHRoZQorCQkJdXBjb21pbmcgc2l4dGggcmV2aXNpb24uCisgICBfWE9QRU5fU09VUkNFX0VYVEVOREVEIFhQRyB0aGluZ3MgYW5kIFgvT3BlbiBVbml4IGV4dGVuc2lvbnMuCisgICBfTEFSR0VGSUxFX1NPVVJDRQlTb21lIG1vcmUgZnVuY3Rpb25zIGZvciBjb3JyZWN0IHN0YW5kYXJkIEkvTy4KKyAgIF9MQVJHRUZJTEU2NF9TT1VSQ0UJQWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGZyb20gTEZTIGZvciBsYXJnZSBmaWxlcy4KKyAgIF9GSUxFX09GRlNFVF9CSVRTPU4JU2VsZWN0IGRlZmF1bHQgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisgICBfQlNEX1NPVVJDRQkJSVNPIEMsIFBPU0lYLCBhbmQgNC4zQlNEIHRoaW5ncy4KKyAgIF9TVklEX1NPVVJDRQkJSVNPIEMsIFBPU0lYLCBhbmQgU1ZJRCB0aGluZ3MuCisgICBfQVRGSUxFX1NPVVJDRQlBZGRpdGlvbmFsICphdCBpbnRlcmZhY2VzLgorICAgX0dOVV9TT1VSQ0UJCUFsbCBvZiB0aGUgYWJvdmUsIHBsdXMgR05VIGV4dGVuc2lvbnMuCisgICBfUkVFTlRSQU5UCQlTZWxlY3QgYWRkaXRpb25hbGx5IHJlZW50cmFudCBvYmplY3QuCisgICBfVEhSRUFEX1NBRkUJCVNhbWUgYXMgX1JFRU5UUkFOVCwgb2Z0ZW4gdXNlZCBieSBvdGhlciBzeXN0ZW1zLgorICAgX0ZPUlRJRllfU09VUkNFCUlmIHNldCB0byBudW1lcmljIHZhbHVlID4gMCBhZGRpdGlvbmFsIHNlY3VyaXR5CisJCQltZWFzdXJlcyBhcmUgZGVmaW5lZCwgYWNjb3JkaW5nIHRvIGxldmVsLgorCisgICBUaGUgYC1hbnNpJyBzd2l0Y2ggdG8gdGhlIEdOVSBDIGNvbXBpbGVyIGRlZmluZXMgX19TVFJJQ1RfQU5TSV9fLgorICAgSWYgbm9uZSBvZiB0aGVzZSBhcmUgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBfU1ZJRF9TT1VSQ0UsCisgICBfQlNEX1NPVVJDRSwgYW5kIF9QT1NJWF9TT1VSQ0Ugc2V0IHRvIG9uZSBhbmQgX1BPU0lYX0NfU09VUkNFIHNldCB0bworICAgMjAwMTEyTC4gIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgYXJlIGRlZmluZWQsIHRoZXkgYWNjdW11bGF0ZS4KKyAgIEZvciBleGFtcGxlIF9fU1RSSUNUX0FOU0lfXywgX1BPU0lYX1NPVVJDRSBhbmQgX1BPU0lYX0NfU09VUkNFCisgICB0b2dldGhlciBnaXZlIHlvdSBJU08gQywgMTAwMy4xLCBhbmQgMTAwMy4yLCBidXQgbm90aGluZyBlbHNlLgorCisgICBUaGVzZSBhcmUgZGVmaW5lZCBieSB0aGlzIGZpbGUgYW5kIGFyZSB1c2VkIGJ5IHRoZQorICAgaGVhZGVyIGZpbGVzIHRvIGRlY2lkZSB3aGF0IHRvIGRlY2xhcmUgb3IgZGVmaW5lOgorCisgICBfX1VTRV9JU09DOTkJCURlZmluZSBJU08gQzk5IHRoaW5ncy4KKyAgIF9fVVNFX0lTT0M5NQkJRGVmaW5lIElTTyBDOTAgQU1EMSAoQzk1KSB0aGluZ3MuCisgICBfX1VTRV9QT1NJWAkJRGVmaW5lIElFRUUgU3RkIDEwMDMuMSB0aGluZ3MuCisgICBfX1VTRV9QT1NJWDIJCURlZmluZSBJRUVFIFN0ZCAxMDAzLjIgdGhpbmdzLgorICAgX19VU0VfUE9TSVgxOTkzMDkJRGVmaW5lIElFRUUgU3RkIDEwMDMuMSwgYW5kIC4xYiB0aGluZ3MuCisgICBfX1VTRV9QT1NJWDE5OTUwNglEZWZpbmUgSUVFRSBTdGQgMTAwMy4xLCAuMWIsIC4xYyBhbmQgLjFpIHRoaW5ncy4KKyAgIF9fVVNFX1hPUEVOCQlEZWZpbmUgWFBHIHRoaW5ncy4KKyAgIF9fVVNFX1hPUEVOX0VYVEVOREVECURlZmluZSBYL09wZW4gVW5peCB0aGluZ3MuCisgICBfX1VTRV9VTklYOTgJCURlZmluZSBTaW5nbGUgVW5peCBWMiB0aGluZ3MuCisgICBfX1VTRV9YT1BFTjJLICAgICAgICBEZWZpbmUgWFBHNiB0aGluZ3MuCisgICBfX1VTRV9MQVJHRUZJTEUJRGVmaW5lIGNvcnJlY3Qgc3RhbmRhcmQgSS9PIHRoaW5ncy4KKyAgIF9fVVNFX0xBUkdFRklMRTY0CURlZmluZSBMRlMgdGhpbmdzIHdpdGggc2VwYXJhdGUgbmFtZXMuCisgICBfX1VTRV9GSUxFX09GRlNFVDY0CURlZmluZSA2NGJpdCBpbnRlcmZhY2UgYXMgZGVmYXVsdC4KKyAgIF9fVVNFX0JTRAkJRGVmaW5lIDQuM0JTRCB0aGluZ3MuCisgICBfX1VTRV9TVklECQlEZWZpbmUgU1ZJRCB0aGluZ3MuCisgICBfX1VTRV9NSVNDCQlEZWZpbmUgdGhpbmdzIGNvbW1vbiB0byBCU0QgYW5kIFN5c3RlbSBWIFVuaXguCisgICBfX1VTRV9BVEZJTEUJCURlZmluZSAqYXQgaW50ZXJmYWNlcyBhbmQgQVRfKiBjb25zdGFudHMgZm9yIHRoZW0uCisgICBfX1VTRV9HTlUJCURlZmluZSBHTlUgZXh0ZW5zaW9ucy4KKyAgIF9fVVNFX1JFRU5UUkFOVAlEZWZpbmUgcmVlbnRyYW50L3RocmVhZC1zYWZlICpfciBmdW5jdGlvbnMuCisgICBfX1VTRV9GT1JUSUZZX0xFVkVMCUFkZGl0aW9uYWwgc2VjdXJpdHkgbWVhc3VyZXMgdXNlZCwgYWNjb3JkaW5nIHRvIGxldmVsLgorICAgX19GQVZPUl9CU0QJCUZhdm9yIDQuM0JTRCB0aGluZ3MgaW4gY2FzZXMgb2YgY29uZmxpY3QuCisKKyAgIFRoZSBtYWNyb3MgYF9fR05VX0xJQlJBUllfXycsIGBfX0dMSUJDX18nLCBhbmQgYF9fR0xJQkNfTUlOT1JfXycgYXJlCisgICBkZWZpbmVkIGJ5IHRoaXMgZmlsZSB1bmNvbmRpdGlvbmFsbHkuICBgX19HTlVfTElCUkFSWV9fJyBpcyBwcm92aWRlZAorICAgb25seSBmb3IgY29tcGF0aWJpbGl0eS4gIEFsbCBuZXcgY29kZSBzaG91bGQgdXNlIHRoZSBvdGhlciBzeW1ib2xzCisgICB0byB0ZXN0IGZvciBmZWF0dXJlcy4KKworICAgQWxsIG1hY3JvcyBsaXN0ZWQgYWJvdmUgYXMgcG9zc2libHkgYmVpbmcgZGVmaW5lZCBieSB0aGlzIGZpbGUgYXJlCisgICBleHBsaWNpdGx5IHVuZGVmaW5lZCBpZiB0aGV5IGFyZSBub3QgZXhwbGljaXRseSBkZWZpbmVkLgorICAgRmVhdHVyZS10ZXN0IG1hY3JvcyB0aGF0IGFyZSBub3QgZGVmaW5lZCBieSB0aGUgdXNlciBvciBjb21waWxlcgorICAgYnV0IGFyZSBpbXBsaWVkIGJ5IHRoZSBvdGhlciBmZWF0dXJlLXRlc3QgbWFjcm9zIGRlZmluZWQgKG9yIGJ5IHRoZQorICAgbGFjayBvZiBhbnkgZGVmaW5pdGlvbnMpIGFyZSBkZWZpbmVkIGJ5IHRoZSBmaWxlLiAgKi8KKworCisvKiBVbmRlZmluZSBldmVyeXRoaW5nLCBzbyB3ZSBnZXQgYSBjbGVhbiBzbGF0ZS4gICovCisjdW5kZWYJX19VU0VfSVNPQzk5CisjdW5kZWYJX19VU0VfSVNPQzk1CisjdW5kZWYJX19VU0VfUE9TSVgKKyN1bmRlZglfX1VTRV9QT1NJWDIKKyN1bmRlZglfX1VTRV9QT1NJWDE5OTMwOQorI3VuZGVmCV9fVVNFX1BPU0lYMTk5NTA2CisjdW5kZWYJX19VU0VfWE9QRU4KKyN1bmRlZglfX1VTRV9YT1BFTl9FWFRFTkRFRAorI3VuZGVmCV9fVVNFX1VOSVg5OAorI3VuZGVmCV9fVVNFX1hPUEVOMksKKyN1bmRlZglfX1VTRV9MQVJHRUZJTEUKKyN1bmRlZglfX1VTRV9MQVJHRUZJTEU2NAorI3VuZGVmCV9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyN1bmRlZglfX1VTRV9CU0QKKyN1bmRlZglfX1VTRV9TVklECisjdW5kZWYJX19VU0VfTUlTQworI3VuZGVmCV9fVVNFX0FURklMRQorI3VuZGVmCV9fVVNFX0dOVQorI3VuZGVmCV9fVVNFX1JFRU5UUkFOVAorI3VuZGVmCV9fVVNFX0ZPUlRJRllfTEVWRUwKKyN1bmRlZglfX0ZBVk9SX0JTRAorI3VuZGVmCV9fS0VSTkVMX1NUUklDVF9OQU1FUworCisvKiBTdXBwcmVzcyBrZXJuZWwtbmFtZSBzcGFjZSBwb2xsdXRpb24gdW5sZXNzIHVzZXIgZXhwcmVzc2VkbHkgYXNrcworICAgZm9yIGl0LiAgKi8KKyNpZm5kZWYgX0xPT1NFX0tFUk5FTF9OQU1FUworIyBkZWZpbmUgX19LRVJORUxfU1RSSUNUX05BTUVTCisjZW5kaWYKKworLyogQWx3YXlzIHVzZSBJU08gQyB0aGluZ3MuICAqLworI2RlZmluZQlfX1VTRV9BTlNJCTEKKworLyogQ29udmVuaWVuY2UgbWFjcm9zIHRvIHRlc3QgdGhlIHZlcnNpb25zIG9mIGdsaWJjIGFuZCBnY2MuCisgICBVc2UgdGhlbSBsaWtlIHRoaXM6CisgICAjaWYgX19HTlVDX1BSRVJFUSAoMiw4KQorICAgLi4uIGNvZGUgcmVxdWlyaW5nIGdjYyAyLjggb3IgbGF0ZXIgLi4uCisgICAjZW5kaWYKKyAgIE5vdGUgLSB0aGV5IHdvbid0IHdvcmsgZm9yIGdjYzEgb3IgZ2xpYmMxLCBzaW5jZSB0aGUgX01JTk9SIG1hY3JvcworICAgd2VyZSBub3QgZGVmaW5lZCB0aGVuLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIGRlZmluZWQgX19HTlVDX01JTk9SX18KKyMgZGVmaW5lIF9fR05VQ19QUkVSRVEobWFqLCBtaW4pIFwKKwkoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKyNlbHNlCisjIGRlZmluZSBfX0dOVUNfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworCisvKiBJZiBfQlNEX1NPVVJDRSB3YXMgZGVmaW5lZCBieSB0aGUgdXNlciwgZmF2b3IgQlNEIG92ZXIgUE9TSVguICAqLworI2lmIGRlZmluZWQgX0JTRF9TT1VSQ0UgJiYgXAorICAgICEoZGVmaW5lZCBfUE9TSVhfU09VUkNFIHx8IGRlZmluZWQgX1BPU0lYX0NfU09VUkNFIHx8IFwKKyAgICAgIGRlZmluZWQgX1hPUEVOX1NPVVJDRSB8fCBkZWZpbmVkIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgfHwgXAorICAgICAgZGVmaW5lZCBfR05VX1NPVVJDRSB8fCBkZWZpbmVkIF9TVklEX1NPVVJDRSkKKyMgZGVmaW5lIF9fRkFWT1JfQlNECTEKKyNlbmRpZgorCisvKiBJZiBfR05VX1NPVVJDRSB3YXMgZGVmaW5lZCBieSB0aGUgdXNlciwgdHVybiBvbiBhbGwgdGhlIG90aGVyIGZlYXR1cmVzLiAgKi8KKyNpZmRlZiBfR05VX1NPVVJDRQorIyB1bmRlZiAgX0lTT0M5OV9TT1VSQ0UKKyMgZGVmaW5lIF9JU09DOTlfU09VUkNFCTEKKyMgdW5kZWYgIF9QT1NJWF9TT1VSQ0UKKyMgZGVmaW5lIF9QT1NJWF9TT1VSQ0UJMQorIyB1bmRlZiAgX1BPU0lYX0NfU09VUkNFCisjIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UJMjAwMTEyTAorIyB1bmRlZiAgX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgX1hPUEVOX1NPVVJDRQk2MDAKKyMgdW5kZWYgIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQKKyMgZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQJMQorIyB1bmRlZgkgX0xBUkdFRklMRTY0X1NPVVJDRQorIyBkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQkxCisjIHVuZGVmICBfQlNEX1NPVVJDRQorIyBkZWZpbmUgX0JTRF9TT1VSQ0UJMQorIyB1bmRlZiAgX1NWSURfU09VUkNFCisjIGRlZmluZSBfU1ZJRF9TT1VSQ0UJMQorIyB1bmRlZiAgX0FURklMRV9TT1VSQ0UKKyMgZGVmaW5lIF9BVEZJTEVfU09VUkNFCTEKKyNlbmRpZgorCisvKiBJZiBub3RoaW5nIChvdGhlciB0aGFuIF9HTlVfU09VUkNFKSBpcyBkZWZpbmVkLAorICAgZGVmaW5lIF9CU0RfU09VUkNFIGFuZCBfU1ZJRF9TT1VSQ0UuICAqLworI2lmICghZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX0lTT0M5OV9TT1VSQ0UgJiYgXAorICAgICAhZGVmaW5lZCBfUE9TSVhfU09VUkNFICYmICFkZWZpbmVkIF9QT1NJWF9DX1NPVVJDRSAmJiBcCisgICAgICFkZWZpbmVkIF9YT1BFTl9TT1VSQ0UgJiYgIWRlZmluZWQgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCAmJiBcCisgICAgICFkZWZpbmVkIF9CU0RfU09VUkNFICYmICFkZWZpbmVkIF9TVklEX1NPVVJDRSkKKyMgZGVmaW5lIF9CU0RfU09VUkNFCTEKKyMgZGVmaW5lIF9TVklEX1NPVVJDRQkxCisjZW5kaWYKKworLyogVGhpcyBpcyB0byBlbmFibGUgdGhlIElTTyBDOTkgZXh0ZW5zaW9uLiAgQWxzbyByZWNvZ25pemUgdGhlIG9sZCBtYWNybworICAgd2hpY2ggd2FzIHVzZWQgcHJpb3IgdG8gdGhlIHN0YW5kYXJkIGFjY2VwdGFuY2UuICBUaGlzIG1hY3JvIHdpbGwKKyAgIGV2ZW50dWFsbHkgZ28gYXdheSBhbmQgdGhlIGZlYXR1cmVzIGVuYWJsZWQgYnkgZGVmYXVsdCBvbmNlIHRoZSBJU08gQzk5CisgICBzdGFuZGFyZCBpcyB3aWRlbHkgYWRvcHRlZC4gICovCisjaWYgKGRlZmluZWQgX0lTT0M5OV9TT1VSQ0UgfHwgZGVmaW5lZCBfSVNPQzlYX1NPVVJDRSBcCisgICAgIHx8IChkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKSkKKyMgZGVmaW5lIF9fVVNFX0lTT0M5OQkxCisjZW5kaWYKKworLyogVGhpcyBpcyB0byBlbmFibGUgdGhlIElTTyBDOTAgQW1lbmRtZW50IDE6MTk5NSBleHRlbnNpb24uICAqLworI2lmIChkZWZpbmVkIF9JU09DOTlfU09VUkNFIHx8IGRlZmluZWQgX0lTT0M5WF9TT1VSQ0UgXAorICAgICB8fCAoZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5NDA5TCkpCisjIGRlZmluZSBfX1VTRV9JU09DOTUJMQorI2VuZGlmCisKKy8qIElmIG5vbmUgb2YgdGhlIEFOU0kvUE9TSVggbWFjcm9zIGFyZSBkZWZpbmVkLCB1c2UgUE9TSVguMSBhbmQgUE9TSVguMgorICAgKGFuZCBJRUVFIFN0ZCAxMDAzLjFiLTE5OTMgdW5sZXNzIF9YT1BFTl9TT1VSQ0UgaXMgZGVmaW5lZCkuICAqLworI2lmICgoIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IChfWE9QRU5fU09VUkNFIC0gMCkgPj0gNTAwKSAmJiBcCisgICAgICFkZWZpbmVkIF9QT1NJWF9TT1VSQ0UgJiYgIWRlZmluZWQgX1BPU0lYX0NfU09VUkNFKQorIyBkZWZpbmUgX1BPU0lYX1NPVVJDRQkxCisjIGlmIGRlZmluZWQgX1hPUEVOX1NPVVJDRSAmJiAoX1hPUEVOX1NPVVJDRSAtIDApIDwgNTAwCisjICBkZWZpbmUgX1BPU0lYX0NfU09VUkNFCTIKKyMgZWxpZiBkZWZpbmVkIF9YT1BFTl9TT1VSQ0UgJiYgKF9YT1BFTl9TT1VSQ0UgLSAwKSA8IDYwMAorIyAgZGVmaW5lIF9QT1NJWF9DX1NPVVJDRQkxOTk1MDZMCisjIGVsc2UKKyMgIGRlZmluZSBfUE9TSVhfQ19TT1VSQ0UJMjAwMTEyTAorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9QT1NJWF9TT1VSQ0UgfHwgX1BPU0lYX0NfU09VUkNFID49IDEgfHwgZGVmaW5lZCBfWE9QRU5fU09VUkNFCisjIGRlZmluZSBfX1VTRV9QT1NJWAkxCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1BPU0lYX0NfU09VUkNFICYmIF9QT1NJWF9DX1NPVVJDRSA+PSAyIHx8IGRlZmluZWQgX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfUE9TSVgyCTEKKyNlbmRpZgorCisjaWYgKF9QT1NJWF9DX1NPVVJDRSAtIDApID49IDE5OTMwOUwKKyMgZGVmaW5lIF9fVVNFX1BPU0lYMTk5MzA5CTEKKyNlbmRpZgorCisjaWYgKF9QT1NJWF9DX1NPVVJDRSAtIDApID49IDE5OTUwNkwKKyMgZGVmaW5lIF9fVVNFX1BPU0lYMTk5NTA2CTEKKyNlbmRpZgorCisjaWYgKF9QT1NJWF9DX1NPVVJDRSAtIDApID49IDIwMDExMkwKKyMgZGVmaW5lIF9fVVNFX1hPUEVOMksJCTEKKyNlbmRpZgorCisjaWZkZWYJX1hPUEVOX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfWE9QRU4JMQorIyBpZiAoX1hPUEVOX1NPVVJDRSAtIDApID49IDUwMAorIyAgZGVmaW5lIF9fVVNFX1hPUEVOX0VYVEVOREVECTEKKyMgIGRlZmluZSBfX1VTRV9VTklYOTgJMQorIyAgdW5kZWYgX0xBUkdFRklMRV9TT1VSQ0UKKyMgIGRlZmluZSBfTEFSR0VGSUxFX1NPVVJDRQkxCisjICBpZiAoX1hPUEVOX1NPVVJDRSAtIDApID49IDYwMAorIyAgIGRlZmluZSBfX1VTRV9YT1BFTjJLCTEKKyMgICB1bmRlZiBfX1VTRV9JU09DOTkKKyMgICBkZWZpbmUgX19VU0VfSVNPQzk5CQkxCisjICBlbmRpZgorIyBlbHNlCisjICBpZmRlZiBfWE9QRU5fU09VUkNFX0VYVEVOREVECisjICAgZGVmaW5lIF9fVVNFX1hPUEVOX0VYVEVOREVECTEKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9MQVJHRUZJTEVfU09VUkNFCisjIGRlZmluZSBfX1VTRV9MQVJHRUZJTEUJMQorI2VuZGlmCisKKyNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjIGRlZmluZSBfX1VTRV9MQVJHRUZJTEU2NAkxCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0ZJTEVfT0ZGU0VUX0JJVFMgJiYgX0ZJTEVfT0ZGU0VUX0JJVFMgPT0gNjQKKyMgZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9CU0RfU09VUkNFIHx8IGRlZmluZWQgX1NWSURfU09VUkNFCisjIGRlZmluZSBfX1VTRV9NSVNDCTEKKyNlbmRpZgorCisjaWZkZWYJX0JTRF9TT1VSQ0UKKyMgZGVmaW5lIF9fVVNFX0JTRAkxCisjZW5kaWYKKworI2lmZGVmCV9TVklEX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfU1ZJRAkxCisjZW5kaWYKKworI2lmZGVmCV9BVEZJTEVfU09VUkNFCisjIGRlZmluZSBfX1VTRV9BVEZJTEUJMQorI2VuZGlmCisKKyNpZmRlZglfR05VX1NPVVJDRQorIyBkZWZpbmUgX19VU0VfR05VCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfUkVFTlRSQU5UIHx8IGRlZmluZWQgX1RIUkVBRF9TQUZFCisjIGRlZmluZSBfX1VTRV9SRUVOVFJBTlQJMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9GT1JUSUZZX1NPVVJDRSAmJiBfRk9SVElGWV9TT1VSQ0UgPiAwIFwKKyAgICAmJiBfX0dOVUNfUFJFUkVRICg0LCAxKSAmJiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiBfX09QVElNSVpFX18gPiAwCisjIGlmIF9GT1JUSUZZX1NPVVJDRSA+IDEKKyMgIGRlZmluZSBfX1VTRV9GT1JUSUZZX0xFVkVMIDIKKyMgZWxzZQorIyAgZGVmaW5lIF9fVVNFX0ZPUlRJRllfTEVWRUwgMQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIF9fVVNFX0ZPUlRJRllfTEVWRUwgMAorI2VuZGlmCisKKy8qIFdlIGRvIHN1cHBvcnQgdGhlIElFQyA1NTkgbWF0aCBmdW5jdGlvbmFsaXR5LCByZWFsIGFuZCBjb21wbGV4LiAgKi8KKyNkZWZpbmUgX19TVERDX0lFQ181NTlfXwkJMQorI2RlZmluZSBfX1NURENfSUVDXzU1OV9DT01QTEVYX18JMQorCisvKiB3Y2hhcl90IHVzZXMgSVNPIDEwNjQ2LTEgKDJuZCBlZC4sIHB1Ymxpc2hlZCAyMDAwLTA5LTE1KSAvIFVuaWNvZGUgMy4xLiAgKi8KKyNkZWZpbmUgX19TVERDX0lTT18xMDY0Nl9fCQkyMDAwMDlMCisKKy8qIFRoaXMgbWFjcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGluc3RhbGxlZCBsaWJyYXJ5IGlzIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgRm9yIGhpc3RvcmljIHJlYXNvbnMgdGhlIHZhbHVlIG5vdyBpcyA2IGFuZCB0aGlzIHdpbGwgc3RheSBmcm9tIG5vdworICAgb24uICBUaGUgdXNlIG9mIHRoaXMgdmFyaWFibGUgaXMgZGVwcmVjYXRlZC4gIFVzZSBfX0dMSUJDX18gYW5kCisgICBfX0dMSUJDX01JTk9SX18gbm93IChzZWUgYmVsb3cpIHdoZW4geW91IHdhbnQgdG8gdGVzdCBmb3IgYSBzcGVjaWZpYworICAgR05VIEMgbGlicmFyeSB2ZXJzaW9uIGFuZCB1c2UgdGhlIHZhbHVlcyBpbiA8Z251L2xpYi1uYW1lcy5oPiB0byBnZXQKKyAgIHRoZSBzb25hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzLiAgKi8KKyN1bmRlZiAgX19HTlVfTElCUkFSWV9fCisjZGVmaW5lIF9fR05VX0xJQlJBUllfXyA2CisKKy8qIE1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgR05VIEMgbGlicmFyeSBwYWNrYWdlLiAgVXNlCisgICB0aGVzZSBtYWNyb3MgdG8gdGVzdCBmb3IgZmVhdHVyZXMgaW4gc3BlY2lmaWMgcmVsZWFzZXMuICAqLworI2RlZmluZQlfX0dMSUJDX18JMgorI2RlZmluZQlfX0dMSUJDX01JTk9SX18JNworCisjZGVmaW5lIF9fR0xJQkNfUFJFUkVRKG1haiwgbWluKSBcCisJKChfX0dMSUJDX18gPDwgMTYpICsgX19HTElCQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKworLyogRGVjaWRlIHdoZXRoZXIgYSBjb21waWxlciBzdXBwb3J0cyB0aGUgbG9uZyBsb25nIGRhdGF0eXBlcy4gICovCisjaWYgZGVmaW5lZCBfX0dOVUNfXyBcCisgICAgfHwgKGRlZmluZWQgX19QR0kgJiYgZGVmaW5lZCBfX2kzODZfXyApIFwKKyAgICB8fCAoZGVmaW5lZCBfX0lOVEVMX0NPTVBJTEVSICYmIChkZWZpbmVkIF9faTM4Nl9fIHx8IGRlZmluZWQgX19pYTY0X18pKSBcCisgICAgfHwgKGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjIGRlZmluZSBfX0dMSUJDX0hBVkVfTE9OR19MT05HCTEKKyNlbmRpZgorCisvKiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIGV2ZXJ5IGhlYWRlciBmaWxlIGFscmVhZHkgaW5jbHVkZXMgdGhpcyBvbmUuICAqLworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisjIGlmbmRlZiBfU1lTX0NERUZTX0gKKyMgIGluY2x1ZGUgPHN5cy9jZGVmcy5oPgorIyBlbmRpZgorCisvKiBJZiB3ZSBkb24ndCBoYXZlIF9fUkVESVJFQ1QsIHByb3RvdHlwZXMgd2lsbCBiZSBtaXNzaW5nIGlmCisgICBfX1VTRV9GSUxFX09GRlNFVDY0IGJ1dCBub3QgX19VU0VfTEFSR0VGSUxFWzY0XS4gKi8KKyMgaWYgZGVmaW5lZCBfX1VTRV9GSUxFX09GRlNFVDY0ICYmICFkZWZpbmVkIF9fUkVESVJFQ1QKKyMgIGRlZmluZSBfX1VTRV9MQVJHRUZJTEUJMQorIyAgZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0CTEKKyMgZW5kaWYKKworI2VuZGlmCS8qICFBU1NFTUJMRVIgKi8KKworLyogRGVjaWRlIHdoZXRoZXIgd2UgY2FuIGRlZmluZSAnZXh0ZXJuIGlubGluZScgZnVuY3Rpb25zIGluIGhlYWRlcnMuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDIsIDcpICYmIGRlZmluZWQgX19PUFRJTUlaRV9fIFwKKyAgICAmJiAhZGVmaW5lZCBfX09QVElNSVpFX1NJWkVfXyAmJiAhZGVmaW5lZCBfX05PX0lOTElORV9fIFwKKyAgICAmJiBkZWZpbmVkIF9fZXh0ZXJuX2lubGluZQorIyBkZWZpbmUgX19VU0VfRVhURVJOX0lOTElORVMJMQorI2VuZGlmCisKKworLyogVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSBldmVyeSBoZWFkZXIgZmlsZSBhbHJlYWR5IGluY2x1ZGVzIHRoaXMgb25lLgorICAgR2V0IHRoZSBkZWZpbml0aW9ucyBvZiBhbGwgdGhlIGFwcHJvcHJpYXRlIGBfX3N0dWJfRlVOQ1RJT04nIHN5bWJvbHMuCisgICA8Z251L3N0dWJzLmg+IGNvbnRhaW5zIGAjZGVmaW5lIF9fc3R1Yl9GVU5DVElPTicgd2hlbiBGVU5DVElPTiBpcyBhIHN0dWIKKyAgIHRoYXQgd2lsbCBhbHdheXMgcmV0dXJuIGZhaWx1cmUgKGFuZCBzZXQgZXJybm8gdG8gRU5PU1lTKS4gICovCisjaW5jbHVkZSA8Z251L3N0dWJzLmg+CisKKworI2VuZGlmCS8qIGZlYXR1cmVzLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ZlbnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZmVudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDZmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZlbnYuaApAQCAtMCwwICsxLDEzNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogSVNPIEM5OSA3LjY6IEZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50CTxmZW52Lmg+CisgKi8KKworI2lmbmRlZiBfRkVOVl9ICisjZGVmaW5lIF9GRU5WX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHRoZSBhcmNoaXRlY3R1cmUgZGVwZW5kZW5kIGRlZmluaXRpb25zLiAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucworICAgYXJlIGV4cGVjdGVkIHRvIGJlIGRvbmU6CisKKyAgIGZlbnZfdAl0eXBlIGZvciBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVudGlyZSBmbG9hdGluZy1wb2ludAorCQllbnZpcm9ubWVudAorCisgICBGRV9ERkxfRU5WCW1hY3JvIG9mIHR5cGUgcG9pbnRlciB0byBmZW52X3QgdG8gYmUgdXNlZCBhcyB0aGUgYXJndW1lbnQKKwkJdG8gZnVuY3Rpb25zIHRha2luZyBhbiBhcmd1bWVudCBvZiB0eXBlIGZlbnZfdDsgaW4gdGhpcworCQljYXNlIHRoZSBkZWZhdWx0IGVudmlyb25tZW50IHdpbGwgYmUgdXNlZAorCisgICBmZXhjZXB0X3QJdHlwZSBmb3Igb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uCisJCWZsYWdzIGluY2x1ZGluZyBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmbGFncworCisgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCBpZmYgdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoaXMKKyAgIGtpbmQgb2YgZXhjZXB0aW9uLgorICAgRkVfSU5FWEFDVAkJaW5leGFjdCByZXN1bHQKKyAgIEZFX0RJVkJZWkVSTwkJZGl2aXNpb24gYnkgemVybworICAgRkVfVU5ERVJGTE9XCQlyZXN1bHQgbm90IHJlcHJlc2VudGFibGUgZHVlIHRvIHVuZGVyZmxvdworICAgRkVfT1ZFUkZMT1cJCXJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSBkdWUgdG8gb3ZlcmZsb3cKKyAgIEZFX0lOVkFMSUQJCWludmFsaWQgb3BlcmF0aW9uCisKKyAgIEZFX0FMTF9FWENFUFQJYml0d2lzZSBPUiBvZiBhbGwgc3VwcG9ydGVkIGV4Y2VwdGlvbnMKKworICAgVGhlIG5leHQgbWFjcm9zIGFyZSBkZWZpbmVkIGlmZiB0aGUgYXBwcm9wcmlhdGUgcm91bmRpbmcgbW9kZSBpcworICAgc3VwcG9ydGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgIEZFX1RPTkVBUkVTVAkJcm91bmQgdG8gbmVhcmVzdAorICAgRkVfVVBXQVJECQlyb3VuZCB0b3dhcmQgK0luZgorICAgRkVfRE9XTldBUkQJCXJvdW5kIHRvd2FyZCAtSW5mCisgICBGRV9UT1dBUkRaRVJPCXJvdW5kIHRvd2FyZCAwCisqLworI2luY2x1ZGUgPGJpdHMvZmVudi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBoYW5kbGluZy4gICovCisKKy8qIENsZWFyIHRoZSBzdXBwb3J0ZWQgZXhjZXB0aW9ucyByZXByZXNlbnRlZCBieSBFWENFUFRTLiAgKi8KK2V4dGVybiBpbnQgZmVjbGVhcmV4Y2VwdCAoaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworLyogU3RvcmUgaW1wbGVtZW50YXRpb24tZGVmaW5lZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGZsYWdzCisgICBpbmRpY2F0ZWQgYnkgRVhDRVBUUyBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgRkxBR1AuICAqLworZXh0ZXJuIGludCBmZWdldGV4Y2VwdGZsYWcgKGZleGNlcHRfdCAqX19mbGFncCwgaW50IF9fZXhjZXB0cykgX19USFJPVzsKKworLyogUmFpc2UgdGhlIHN1cHBvcnRlZCBleGNlcHRpb25zIHJlcHJlc2VudGVkIGJ5IEVYQ0VQVFMuICAqLworZXh0ZXJuIGludCBmZXJhaXNlZXhjZXB0IChpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisvKiBTZXQgY29tcGxldGUgc3RhdHVzIGZvciBleGNlcHRpb25zIGluZGljYXRlZCBieSBFWENFUFRTIGFjY29yZGluZyB0bworICAgdGhlIHJlcHJlc2VudGF0aW9uIGluIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBGTEFHUC4gICovCitleHRlcm4gaW50IGZlc2V0ZXhjZXB0ZmxhZyAoX19jb25zdCBmZXhjZXB0X3QgKl9fZmxhZ3AsIGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKy8qIERldGVybWluZSB3aGljaCBvZiBzdWJzZXQgb2YgdGhlIGV4Y2VwdGlvbnMgc3BlY2lmaWVkIGJ5IEVYQ0VQVFMgYXJlCisgICBjdXJyZW50bHkgc2V0LiAgKi8KK2V4dGVybiBpbnQgZmV0ZXN0ZXhjZXB0IChpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisKKy8qIFJvdW5kaW5nIGNvbnRyb2wuICAqLworCisvKiBHZXQgY3VycmVudCByb3VuZGluZyBkaXJlY3Rpb24uICAqLworZXh0ZXJuIGludCBmZWdldHJvdW5kICh2b2lkKSBfX1RIUk9XOworCisvKiBFc3RhYmxpc2ggdGhlIHJvdW5kaW5nIGRpcmVjdGlvbiByZXByZXNlbnRlZCBieSBST1VORC4gICovCitleHRlcm4gaW50IGZlc2V0cm91bmQgKGludCBfX3JvdW5kaW5nX2RpcmVjdGlvbikgX19USFJPVzsKKworCisvKiBGbG9hdGluZy1wb2ludCBlbnZpcm9ubWVudC4gICovCisKKy8qIFN0b3JlIHRoZSBjdXJyZW50IGZsb2F0aW5nLXBvaW50IGVudmlyb25tZW50IGluIHRoZSBvYmplY3QgcG9pbnRlZAorICAgdG8gYnkgRU5WUC4gICovCitleHRlcm4gaW50IGZlZ2V0ZW52IChmZW52X3QgKl9fZW52cCkgX19USFJPVzsKKworLyogU2F2ZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpbiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgRU5WUCwgY2xlYXIKKyAgIGV4Y2VwdGlvbiBmbGFncyBhbmQgaW5zdGFsbCBhIG5vbi1zdG9wIG1vZGUgKGlmIGF2YWlsYWJsZSkgZm9yIGFsbAorICAgZXhjZXB0aW9ucy4gICovCitleHRlcm4gaW50IGZlaG9sZGV4Y2VwdCAoZmVudl90ICpfX2VudnApIF9fVEhST1c7CisKKy8qIEVzdGFibGlzaCB0aGUgZmxvYXRpbmctcG9pbnQgZW52aXJvbm1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIG9iamVjdAorICAgcG9pbnRlZCB0byBieSBFTlZQLiAgKi8KK2V4dGVybiBpbnQgZmVzZXRlbnYgKF9fY29uc3QgZmVudl90ICpfX2VudnApIF9fVEhST1c7CisKKy8qIFNhdmUgY3VycmVudCBleGNlcHRpb25zIGluIHRlbXBvcmFyeSBzdG9yYWdlLCBpbnN0YWxsIGVudmlyb25tZW50CisgICByZXByZXNlbnRlZCBieSBvYmplY3QgcG9pbnRlZCB0byBieSBFTlZQIGFuZCByYWlzZSBleGNlcHRpb25zCisgICBhY2NvcmRpbmcgdG8gc2F2ZWQgZXhjZXB0aW9ucy4gICovCitleHRlcm4gaW50IGZldXBkYXRlZW52IChfX2NvbnN0IGZlbnZfdCAqX19lbnZwKSBfX1RIUk9XOworCisKKy8qIEluY2x1ZGUgb3B0aW1pemF0aW9uLiAgKi8KKyNpZmRlZiBfX09QVElNSVpFX18KKyMgaW5jbHVkZSA8Yml0cy9mZW52aW5saW5lLmg+CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorCisvKiBFbmFibGUgaW5kaXZpZHVhbCBleGNlcHRpb25zLiAgV2lsbCBub3QgZW5hYmxlIG1vcmUgZXhjZXB0aW9ucyB0aGFuCisgICBFWENFUFRTIHNwZWNpZmllcy4gIFJldHVybnMgdGhlIHByZXZpb3VzIGVuYWJsZWQgZXhjZXB0aW9ucyBpZiBhbGwKKyAgIGV4Y2VwdGlvbnMgYXJlIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSByZXR1cm5zIC0xLiAgKi8KK2V4dGVybiBpbnQgZmVlbmFibGVleGNlcHQgKGludCBfX2V4Y2VwdHMpIF9fVEhST1c7CisKKy8qIERpc2FibGUgaW5kaXZpZHVhbCBleGNlcHRpb25zLiAgV2lsbCBub3QgZGlzYWJsZSBtb3JlIGV4Y2VwdGlvbnMgdGhhbgorICAgRVhDRVBUUyBzcGVjaWZpZXMuICBSZXR1cm5zIHRoZSBwcmV2aW91cyBlbmFibGVkIGV4Y2VwdGlvbnMgaWYgYWxsCisgICBleGNlcHRpb25zIGFyZSBzdWNjZXNzZnVsbHkgZGlzYWJsZWQsIG90aGVyd2lzZSByZXR1cm5zIC0xLiAgKi8KK2V4dGVybiBpbnQgZmVkaXNhYmxlZXhjZXB0IChpbnQgX19leGNlcHRzKSBfX1RIUk9XOworCisvKiBSZXR1cm4gZW5hYmxlZCBleGNlcHRpb25zLiAgKi8KK2V4dGVybiBpbnQgZmVnZXRleGNlcHQgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZlbnYuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9mbXRtc2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm10bXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlM2U1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm10bXNnLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qIE1lc3NhZ2UgZGlzcGxheSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX0ZNVE1TR19ICisjZGVmaW5lIF9fRk1UTVNHX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFZhbHVlcyB0byBjb250cm9sIGBmbXRtc2cnIGZ1bmN0aW9uLiAgKi8KK2VudW0KK3sKKyAgTU1fSEFSRCA9IDB4MDAxLAkvKiBTb3VyY2Ugb2YgdGhlIGNvbmRpdGlvbiBpcyBoYXJkd2FyZS4gICovCisjZGVmaW5lIE1NX0hBUkQgTU1fSEFSRAorICBNTV9TT0ZUID0gMHgwMDIsCS8qIFNvdXJjZSBvZiB0aGUgY29uZGl0aW9uIGlzIHNvZnR3YXJlLiAgKi8KKyNkZWZpbmUgTU1fU09GVCBNTV9TT0ZUCisgIE1NX0ZJUk0gPSAweDAwNCwJLyogU291cmNlIG9mIHRoZSBjb25kaXRpb24gaXMgZmlybXdhcmUuICAqLworI2RlZmluZSBNTV9GSVJNIE1NX0ZJUk0KKyAgTU1fQVBQTCA9IDB4MDA4LAkvKiBDb25kaXRpb24gZGV0ZWN0ZWQgYnkgYXBwbGljYXRpb24uICAqLworI2RlZmluZSBNTV9BUFBMIE1NX0FQUEwKKyAgTU1fVVRJTCA9IDB4MDEwLAkvKiBDb25kaXRpb24gZGV0ZWN0ZWQgYnkgdXRpbGl0eS4gICovCisjZGVmaW5lIE1NX1VUSUwgTU1fVVRJTAorICBNTV9PUFNZUyA9IDB4MDIwLAkvKiBDb25kaXRpb24gZGV0ZWN0ZWQgYnkgb3BlcmF0aW5nIHN5c3RlbS4gICovCisjZGVmaW5lIE1NX09QU1lTIE1NX09QU1lTCisgIE1NX1JFQ09WRVIgPSAweDA0MCwJLyogUmVjb3ZlcmFibGUgZXJyb3IuICAqLworI2RlZmluZSBNTV9SRUNPVkVSIE1NX1JFQ09WRVIKKyAgTU1fTlJFQ09WID0gMHgwODAsCS8qIE5vbi1yZWNvdmVyYWJsZSBlcnJvci4gICovCisjZGVmaW5lIE1NX05SRUNPViBNTV9OUkVDT1YKKyAgTU1fUFJJTlQgPSAweDEwMCwJLyogRGlzcGxheSBtZXNzYWdlIGluIHN0YW5kYXJkIGVycm9yLiAgKi8KKyNkZWZpbmUgTU1fUFJJTlQgTU1fUFJJTlQKKyAgTU1fQ09OU09MRSA9IDB4MjAwCS8qIERpc3BsYXkgbWVzc2FnZSBvbiBzeXN0ZW0gY29uc29sZS4gICovCisjZGVmaW5lIE1NX0NPTlNPTEUgTU1fQ09OU09MRQorfTsKKworLyogVmFsdWVzIHRvIGJlIGZvciBTRVZFUklUWSBwYXJhbWV0ZXIgb2YgYGZtdG1zZycuICAqLworZW51bQoreworICBNTV9OT1NFViA9IDAsCQkvKiBObyBzZXZlcml0eSBsZXZlbCBwcm92aWRlZCBmb3IgdGhlIG1lc3NhZ2UuICAqLworI2RlZmluZSBNTV9OT1NFViBNTV9OT1NFVgorICBNTV9IQUxULAkJLyogRXJyb3IgY2F1c2luZyBhcHBsaWNhdGlvbiB0byBoYWx0LiAgKi8KKyNkZWZpbmUgTU1fSEFMVCBNTV9IQUxUCisgIE1NX0VSUk9SLAkJLyogQXBwbGljYXRpb24gaGFzIGVuY291bnRlcmVkIGEgbm9uLWZhdGFsIGZhdWx0LiAgKi8KKyNkZWZpbmUgTU1fRVJST1IgTU1fRVJST1IKKyAgTU1fV0FSTklORywJCS8qIEFwcGxpY2F0aW9uIGhhcyBkZXRlY3RlZCB1bnVzdWFsIG5vbi1lcnJvcgorCQkJICAgY29uZGl0aW9uLiAgKi8KKyNkZWZpbmUgTU1fV0FSTklORyBNTV9XQVJOSU5HCisgIE1NX0lORk8JCS8qIEluZm9ybWF0aXZlIG1lc3NhZ2UuICAqLworI2RlZmluZSBNTV9JTkZPIE1NX0lORk8KK307CisKKworLyogTWFjcm9zIHdoaWNoIGNhbiBiZSB1c2VkIGFzIG51bGwgdmFsdWVzIGZvciB0aGUgYXJndW1lbnRzIG9mIGBmbXRtc2cnLiAgKi8KKyNkZWZpbmUgTU1fTlVMTExCTAkoKGNoYXIgKikgMCkKKyNkZWZpbmUgTU1fTlVMTFNFVgkwCisjZGVmaW5lIE1NX05VTExNQwkoKGxvbmcgaW50KSAwKQorI2RlZmluZSBNTV9OVUxMVFhUCSgoY2hhciAqKSAwKQorI2RlZmluZSBNTV9OVUxMQUNUCSgoY2hhciAqKSAwKQorI2RlZmluZSBNTV9OVUxMVEFHCSgoY2hhciAqKSAwKQorCisKKy8qIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgb2YgYGZtdG1zZycuICAqLworZW51bQoreworICBNTV9OT1RPSyA9IC0xLAorI2RlZmluZSBNTV9OT1RPSyBNTV9OT1RPSworICBNTV9PSyA9IDAsCisjZGVmaW5lIE1NX09LIE1NX09LCisgIE1NX05PTVNHID0gMSwKKyNkZWZpbmUgTU1fTk9NU0cgTU1fTk9NU0cKKyAgTU1fTk9DT04gPSA0CisjZGVmaW5lIE1NX05PQ09OIE1NX05PQ09OCit9OworCisKKy8qIFByaW50IG1lc3NhZ2Ugd2l0aCBnaXZlbiBDTEFTU0lGSUNBVElPTiwgTEFCRUwsIFNFVkVSSVRZLCBURVhULCBBQ1RJT04KKyAgIGFuZCBUQUcgdG8gY29uc29sZSBvciBzdGFuZGFyZCBlcnJvci4gICovCitleHRlcm4gaW50IGZtdG1zZyAobG9uZyBpbnQgX19jbGFzc2lmaWNhdGlvbiwgX19jb25zdCBjaGFyICpfX2xhYmVsLAorCQkgICBpbnQgX19zZXZlcml0eSwgX19jb25zdCBjaGFyICpfX3RleHQsCisJCSAgIF9fY29uc3QgY2hhciAqX19hY3Rpb24sIF9fY29uc3QgY2hhciAqX190YWcpOworCisjaWZkZWYgX19VU0VfU1ZJRAorLyogQWRkIG9yIHJlbW92ZSBzZXZlcml0eSBsZXZlbC4gICovCitleHRlcm4gaW50IGFkZHNldmVyaXR5IChpbnQgX19zZXZlcml0eSwgX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVzsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZm10bXNnLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm5tYXRjaC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mbm1hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYjAwNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm5tYXRjaC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS05Myw5Niw5Nyw5OCw5OSwyMDAxLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX0ZOTUFUQ0hfSAorI2RlZmluZQlfRk5NQVRDSF9ICTEKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIGNvbnN0CisjIGlmIChkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fKSB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19jb25zdAljb25zdAorIyBlbHNlCisjICBkZWZpbmUgX19jb25zdAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFdlICN1bmRlZiB0aGVzZSBiZWZvcmUgZGVmaW5pbmcgdGhlbSBiZWNhdXNlIHNvbWUgbG9zaW5nIHN5c3RlbXMKKyAgIChIUC1VWCBBLjA4LjA3IGZvciBleGFtcGxlKSBkZWZpbmUgdGhlc2UgaW4gPHVuaXN0ZC5oPi4gICovCisjdW5kZWYJRk5NX1BBVEhOQU1FCisjdW5kZWYJRk5NX05PRVNDQVBFCisjdW5kZWYJRk5NX1BFUklPRAorCisvKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGZubWF0Y2gnLiAgKi8KKyNkZWZpbmUJRk5NX1BBVEhOQU1FCSgxIDw8IDApIC8qIE5vIHdpbGRjYXJkIGNhbiBldmVyIG1hdGNoIGAvJy4gICovCisjZGVmaW5lCUZOTV9OT0VTQ0FQRQkoMSA8PCAxKSAvKiBCYWNrc2xhc2hlcyBkb24ndCBxdW90ZSBzcGVjaWFsIGNoYXJzLiAgKi8KKyNkZWZpbmUJRk5NX1BFUklPRAkoMSA8PCAyKSAvKiBMZWFkaW5nIGAuJyBpcyBtYXRjaGVkIG9ubHkgZXhwbGljaXRseS4gICovCisKKyNpZiAhZGVmaW5lZCBfUE9TSVhfQ19TT1VSQ0UgfHwgX1BPU0lYX0NfU09VUkNFIDwgMiB8fCBkZWZpbmVkIF9HTlVfU09VUkNFCisjIGRlZmluZSBGTk1fRklMRV9OQU1FCSBGTk1fUEFUSE5BTUUJLyogUHJlZmVycmVkIEdOVSBuYW1lLiAgKi8KKyMgZGVmaW5lIEZOTV9MRUFESU5HX0RJUiAoMSA8PCAzKQkvKiBJZ25vcmUgYC8uLi4nIGFmdGVyIGEgbWF0Y2guICAqLworIyBkZWZpbmUgRk5NX0NBU0VGT0xECSAoMSA8PCA0KQkvKiBDb21wYXJlIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UuICAqLworIyBkZWZpbmUgRk5NX0VYVE1BVENICSAoMSA8PCA1KQkvKiBVc2Uga3NoLWxpa2UgZXh0ZW5kZWQgbWF0Y2hpbmcuICovCisjZW5kaWYKKworLyogVmFsdWUgcmV0dXJuZWQgYnkgYGZubWF0Y2gnIGlmIFNUUklORyBkb2VzIG5vdCBtYXRjaCBQQVRURVJOLiAgKi8KKyNkZWZpbmUJRk5NX05PTUFUQ0gJMQorCisvKiBUaGlzIHZhbHVlIGlzIHJldHVybmVkIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0CisgICBgZm5tYXRjaCcuICBTaW5jZSB0aGlzIGlzIG5vdCB0aGUgY2FzZSBoZXJlIGl0IHdpbGwgbmV2ZXIgYmUKKyAgIHJldHVybmVkIGJ1dCB0aGUgY29uZm9ybWFuY2UgdGVzdCBzdWl0ZXMgc3RpbGwgcmVxdWlyZSB0aGUgc3ltYm9sCisgICB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZmRlZiBfWE9QRU5fU09VUkNFCisjIGRlZmluZSBGTk1fTk9TWVMJKC0xKQorI2VuZGlmCisKKy8qIE1hdGNoIE5BTUUgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLAorICAgcmV0dXJuaW5nIHplcm8gaWYgaXQgbWF0Y2hlcywgRk5NX05PTUFUQ0ggaWYgbm90LiAgKi8KK2V4dGVybiBpbnQgZm5tYXRjaCAoX19jb25zdCBjaGFyICpfX3BhdHRlcm4sIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkgICAgaW50IF9fZmxhZ3MpOworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogZm5tYXRjaC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Zvcm0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjkxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Zvcm0uaApAQCAtMCwwICsxLDQwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgQXV0aG9yOiAgSnVlcmdlbiBQZmVpZmVyLCAxOTk1LDE5OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBmb3JtLmgsdiAwLjIwIDIwMDQvMTIvMDQgMjI6MjI6MTAgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgRk9STV9ICisjZGVmaW5lIEZPUk1fSAorCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaW5jbHVkZSA8ZXRpLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIEZPUk1fUFJJVl9ICit0eXBlZGVmIHZvaWQgKkZJRUxEX0NFTEw7CisjZW5kaWYKKworI2lmbmRlZiBOQ1VSU0VTX0ZJRUxEX0lOVEVSTkFMUworI2RlZmluZSBOQ1VSU0VTX0ZJRUxEX0lOVEVSTkFMUyAvKiBub3RoaW5nICovCisjZW5kaWYKKwordHlwZWRlZiBpbnQgRm9ybV9PcHRpb25zOwordHlwZWRlZiBpbnQgRmllbGRfT3B0aW9uczsKKworCS8qKioqKioqKioqCisJKiAgX1BBR0UgICoKKwkqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHNob3J0IHBtaW47CQkvKiBpbmRleCBvZiBmaXJzdCBmaWVsZCBvbiBwYWdlCQkJKi8KKyAgc2hvcnQgcG1heDsJCS8qIGluZGV4IG9mIGxhc3QgZmllbGQgb24gcGFnZQkJCSovCisgIHNob3J0IHNtaW47CQkvKiBpbmRleCBvZiB0b3AgbGVmdG1vc3QgZmllbGQgb24gcGFnZQkJKi8KKyAgc2hvcnQgc21heDsJCS8qIGluZGV4IG9mIGJvdHRvbSByaWdodG1vc3QgZmllbGQgb24gcGFnZQkqLworfSBfUEFHRTsKKworCS8qKioqKioqKioqCisJKiAgRklFTEQgICoKKwkqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBmaWVsZG5vZGUgeworICB1bnNpZ25lZCBzaG9ydAlzdGF0dXM7CQkvKiBmbGFncwkJCSovCisgIHNob3J0CQkJcm93czsJCS8qIHNpemUgaW4gcm93cwkJCSovCisgIHNob3J0CQkJY29sczsJCS8qIHNpemUgaW4gY29scwkJCSovCisgIHNob3J0CQkJZnJvdzsJCS8qIGZpcnN0IHJvdwkJCSovCisgIHNob3J0CQkJZmNvbDsJCS8qIGZpcnN0IGNvbAkJCSovCisgIGludAkJCWRyb3dzOwkJLyogZHluYW1pYyByb3dzCQkJKi8KKyAgaW50CQkJZGNvbHM7CQkvKiBkeW5hbWljIGNvbHMJCQkqLworICBpbnQJCQltYXhncm93OwkvKiBtYXhpbXVtIGZpZWxkIGdyb3d0aAkJKi8KKyAgaW50CQkJbnJvdzsJCS8qIG9mZi1zY3JlZW4gcm93cwkJKi8KKyAgc2hvcnQJCQluYnVmOwkJLyogYWRkaXRpb25hbCBidWZmZXJzCQkqLworICBzaG9ydAkJCWp1c3Q7CQkvKiBqdXN0aWZpY2F0aW9uCQkqLworICBzaG9ydAkJCXBhZ2U7CQkvKiBwYWdlIG9uIGZvcm0JCQkqLworICBzaG9ydAkJCWluZGV4OwkJLyogaW50byBmb3JtIC0+IGZpZWxkCQkqLworICBpbnQJCQlwYWQ7CQkvKiBwYWQgY2hhcmFjdGVyCQkqLworICBjaHR5cGUJCWZvcmU7CQkvKiBmb3JlZ3JvdW5kIGF0dHJpYnV0ZQkJKi8KKyAgY2h0eXBlCQliYWNrOwkJLyogYmFja2dyb3VuZCBhdHRyaWJ1dGUJCSovCisgIEZpZWxkX09wdGlvbnMJCW9wdHM7CQkvKiBvcHRpb25zCQkJKi8KKyAgc3RydWN0IGZpZWxkbm9kZSAqCXNuZXh0OwkJLyogc29ydGVkIG9yZGVyIHBvaW50ZXIJCSovCisgIHN0cnVjdCBmaWVsZG5vZGUgKglzcHJldjsJCS8qIHNvcnRlZCBvcmRlciBwb2ludGVyCQkqLworICBzdHJ1Y3QgZmllbGRub2RlICoJbGluazsJCS8qIGxpbmtlZCBmaWVsZCBjaGFpbgkJKi8KKyAgc3RydWN0IGZvcm1ub2RlICoJZm9ybTsJCS8qIGNvbnRhaW5pbmcgZm9ybQkJKi8KKyAgc3RydWN0IHR5cGVub2RlICoJdHlwZTsJCS8qIGZpZWxkIHR5cGUJCQkqLworICB2b2lkICoJCWFyZzsJCS8qIGFyZ3VtZW50IGZvciB0eXBlCQkqLworICBGSUVMRF9DRUxMICoJCWJ1ZjsJCS8qIGZpZWxkIGJ1ZmZlcnMJCSovCisgIHZvaWQgKgkJdXNycHRyOwkJLyogdXNlciBwb2ludGVyCQkJKi8KKyAgLyoKKyAgICogVGhlIHdpZGUtY2hhcmFjdGVyIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgZXh0cmEgaW5mb3JtYXRpb24uICBCZWNhdXNlCisgICAqIHRoZXJlIGFyZSBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCBtYW5pcHVsYXRlIHRoZSBtZW1iZXJzIG9mIEZJRUxECisgICAqIGRpcmVjdGx5LCB3ZSBjYW5ub3QgbWFrZSB0aGUgc3RydWN0IG9wYXF1ZS4gIE9mZnNldHMgb2YgbWVtYmVycyB1cCB0bworICAgKiB0aGlzIHBvaW50IGFyZSB0aGUgc2FtZSBpbiB0aGUgbmFycm93LSBhbmQgd2lkZS1jaGFyYWN0ZXIgY29uZmlndXJhdGlvbi4KKyAgICogQnV0IG5vdGUgdGhhdCB0aGUgdHlwZSBvZiBidWYgZGVwZW5kcyBvbiB0aGUgY29uZmlndXJhdGlvbiwgYW5kIGlzIG1hZGUKKyAgICogb3BhcXVlIGZvciB0aGF0IHJlYXNvbi4KKyAgICovCisgIE5DVVJTRVNfRklFTERfSU5URVJOQUxTCit9IEZJRUxEOworCisJLyoqKioqKioqKioqKioqCisJKiAgRklFTERUWVBFICAqCisJKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHR5cGVub2RlIHsKKyAgdW5zaWduZWQgc2hvcnQJc3RhdHVzOwkJCS8qIGZsYWdzCQkqLworICBsb25nCQkJcmVmOwkJCS8qIHJlZmVyZW5jZSBjb3VudAkqLworICBzdHJ1Y3QgdHlwZW5vZGUgKglsZWZ0OwkJCS8qIHB0ciB0byBvcGVyYW5kIGZvciB8ICovCisgIHN0cnVjdCB0eXBlbm9kZSAqCXJpZ2h0OwkJCS8qIHB0ciB0byBvcGVyYW5kIGZvciB8ICovCisKKyAgdm9pZCogKCptYWtlYXJnKSh2YV9saXN0ICopOwkJCS8qIG1ha2UgZmllbGR0eXBlIGFyZwkqLworICB2b2lkKiAoKmNvcHlhcmcpKGNvbnN0IHZvaWQgKik7CQkvKiBjb3B5IGZpZWxkdHlwZSBhcmcJKi8KKyAgdm9pZAkoKmZyZWVhcmcpKHZvaWQgKik7CQkJLyogZnJlZSBmaWVsZHR5cGUgYXJnCSovCisKKyAgYm9vbAkoKmZjaGVjaykoRklFTEQgKixjb25zdCB2b2lkICopOwkvKiBmaWVsZCB2YWxpZGF0aW9uCSovCisgIGJvb2wJKCpjY2hlY2spKGludCxjb25zdCB2b2lkICopOwkJLyogY2hhcmFjdGVyIHZhbGlkYXRpb24gKi8KKworICBib29sCSgqbmV4dCkoRklFTEQgKixjb25zdCB2b2lkICopOwkJLyogZW51bWVyYXRlIG5leHQgdmFsdWUgKi8KKyAgYm9vbAkoKnByZXYpKEZJRUxEICosY29uc3Qgdm9pZCAqKTsJCS8qIGVudW1lcmF0ZSBwcmV2IHZhbHVlICovCisKK30gRklFTERUWVBFOworCisJLyoqKioqKioqKgorCSogIEZPUk0gICoKKwkqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IGZvcm1ub2RlIHsKKyAgdW5zaWduZWQgc2hvcnQJc3RhdHVzOwkJLyogZmxhZ3MJCQkqLworICBzaG9ydAkJCXJvd3M7CQkvKiBzaXplIGluIHJvd3MJCQkqLworICBzaG9ydAkJCWNvbHM7CQkvKiBzaXplIGluIGNvbHMJCQkqLworICBpbnQJCQljdXJyb3c7CQkvKiBjdXJyZW50IHJvdyBpbiBmaWVsZCB3aW5kb3cJKi8KKyAgaW50CQkJY3VyY29sOwkJLyogY3VycmVudCBjb2wgaW4gZmllbGQgd2luZG93CSovCisgIGludAkJCXRvcHJvdzsJCS8qIGluIHNjcm9sbGFibGUgZmllbGQgd2luZG93CSovCisgIGludAkJCWJlZ2luY29sOwkvKiBpbiBob3Jpei4gc2Nyb2xsYWJsZSBmaWVsZAkqLworICBzaG9ydAkJCW1heGZpZWxkOwkvKiBudW1iZXIgb2YgZmllbGRzCQkqLworICBzaG9ydAkJCW1heHBhZ2U7CS8qIG51bWJlciBvZiBwYWdlcwkJKi8KKyAgc2hvcnQJCQljdXJwYWdlOwkvKiBpbmRleCBpbnRvIHBhZ2UJCSovCisgIEZvcm1fT3B0aW9ucwkJb3B0czsJCS8qIG9wdGlvbnMJCQkqLworICBXSU5ET1cgKgkJd2luOwkJLyogd2luZG93CQkJKi8KKyAgV0lORE9XICoJCXN1YjsJCS8qIHN1YndpbmRvdwkJCSovCisgIFdJTkRPVyAqCQl3OwkJLyogd2luZG93IGZvciBjdXJyZW50IGZpZWxkCSovCisgIEZJRUxEICoqCQlmaWVsZDsJCS8qIGZpZWxkIFttYXhmaWVsZF0JCSovCisgIEZJRUxEICoJCWN1cnJlbnQ7CS8qIGN1cnJlbnQgZmllbGQJCSovCisgIF9QQUdFICoJCXBhZ2U7CQkvKiBwYWdlIFttYXhwYWdlXQkJKi8KKyAgdm9pZCAqCQl1c3JwdHI7CQkvKiB1c2VyIHBvaW50ZXIJCQkqLworCisgIHZvaWQJCQkoKmZvcm1pbml0KShzdHJ1Y3QgZm9ybW5vZGUgKik7CisgIHZvaWQJCQkoKmZvcm10ZXJtKShzdHJ1Y3QgZm9ybW5vZGUgKik7CisgIHZvaWQJCQkoKmZpZWxkaW5pdCkoc3RydWN0IGZvcm1ub2RlICopOworICB2b2lkCQkJKCpmaWVsZHRlcm0pKHN0cnVjdCBmb3Jtbm9kZSAqKTsKKworfSBGT1JNOworCit0eXBlZGVmIHZvaWQgKCpGb3JtX0hvb2spKEZPUk0gKik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiAgbWlzY2VsbGFuZW91cyAjZGVmaW5lcyAgKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZmllbGQganVzdGlmaWNhdGlvbiAqLworI2RlZmluZSBOT19KVVNUSUZJQ0FUSU9OCSgwKQorI2RlZmluZSBKVVNUSUZZX0xFRlQJCSgxKQorI2RlZmluZSBKVVNUSUZZX0NFTlRFUgkJKDIpCisjZGVmaW5lIEpVU1RJRllfUklHSFQJCSgzKQorCisvKiBmaWVsZCBvcHRpb25zICovCisjZGVmaW5lIE9fVklTSUJMRQkJKDB4MDAwMVUpCisjZGVmaW5lIE9fQUNUSVZFCQkoMHgwMDAyVSkKKyNkZWZpbmUgT19QVUJMSUMJCSgweDAwMDRVKQorI2RlZmluZSBPX0VESVQJCQkoMHgwMDA4VSkKKyNkZWZpbmUgT19XUkFQCQkJKDB4MDAxMFUpCisjZGVmaW5lIE9fQkxBTksJCQkoMHgwMDIwVSkKKyNkZWZpbmUgT19BVVRPU0tJUAkJKDB4MDA0MFUpCisjZGVmaW5lIE9fTlVMTE9LCQkoMHgwMDgwVSkKKyNkZWZpbmUgT19QQVNTT0sJCSgweDAxMDBVKQorI2RlZmluZSBPX1NUQVRJQwkJKDB4MDIwMFUpCisKKy8qIGZvcm0gb3B0aW9ucyAqLworI2RlZmluZSBPX05MX09WRVJMT0FECQkoMHgwMDAxVSkKKyNkZWZpbmUgT19CU19PVkVSTE9BRAkJKDB4MDAwMlUpCisKKy8qIGZvcm0gZHJpdmVyIGNvbW1hbmRzICovCisjZGVmaW5lIFJFUV9ORVhUX1BBR0UJIChLRVlfTUFYICsgMSkJLyogbW92ZSB0byBuZXh0IHBhZ2UJCSovCisjZGVmaW5lIFJFUV9QUkVWX1BBR0UJIChLRVlfTUFYICsgMikJLyogbW92ZSB0byBwcmV2aW91cyBwYWdlCSovCisjZGVmaW5lIFJFUV9GSVJTVF9QQUdFCSAoS0VZX01BWCArIDMpCS8qIG1vdmUgdG8gZmlyc3QgcGFnZQkJKi8KKyNkZWZpbmUgUkVRX0xBU1RfUEFHRQkgKEtFWV9NQVggKyA0KQkvKiBtb3ZlIHRvIGxhc3QgcGFnZQkJKi8KKworI2RlZmluZSBSRVFfTkVYVF9GSUVMRAkgKEtFWV9NQVggKyA1KQkvKiBtb3ZlIHRvIG5leHQgZmllbGQJCSovCisjZGVmaW5lIFJFUV9QUkVWX0ZJRUxECSAoS0VZX01BWCArIDYpCS8qIG1vdmUgdG8gcHJldmlvdXMgZmllbGQJKi8KKyNkZWZpbmUgUkVRX0ZJUlNUX0ZJRUxECSAoS0VZX01BWCArIDcpCS8qIG1vdmUgdG8gZmlyc3QgZmllbGQJCSovCisjZGVmaW5lIFJFUV9MQVNUX0ZJRUxECSAoS0VZX01BWCArIDgpCS8qIG1vdmUgdG8gbGFzdCBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX1NORVhUX0ZJRUxECSAoS0VZX01BWCArIDkpCS8qIG1vdmUgdG8gc29ydGVkIG5leHQgZmllbGQJKi8KKyNkZWZpbmUgUkVRX1NQUkVWX0ZJRUxECSAoS0VZX01BWCArIDEwKQkvKiBtb3ZlIHRvIHNvcnRlZCBwcmV2IGZpZWxkCSovCisjZGVmaW5lIFJFUV9TRklSU1RfRklFTEQgKEtFWV9NQVggKyAxMSkJLyogbW92ZSB0byBzb3J0ZWQgZmlyc3QgZmllbGQJKi8KKyNkZWZpbmUgUkVRX1NMQVNUX0ZJRUxECSAoS0VZX01BWCArIDEyKQkvKiBtb3ZlIHRvIHNvcnRlZCBsYXN0IGZpZWxkCSovCisjZGVmaW5lIFJFUV9MRUZUX0ZJRUxECSAoS0VZX01BWCArIDEzKQkvKiBtb3ZlIHRvIGxlZnQgdG8gZmllbGQJKi8KKyNkZWZpbmUgUkVRX1JJR0hUX0ZJRUxECSAoS0VZX01BWCArIDE0KQkvKiBtb3ZlIHRvIHJpZ2h0IHRvIGZpZWxkCSovCisjZGVmaW5lIFJFUV9VUF9GSUVMRAkgKEtFWV9NQVggKyAxNSkJLyogbW92ZSB0byB1cCB0byBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX0RPV05fRklFTEQJIChLRVlfTUFYICsgMTYpCS8qIG1vdmUgdG8gZG93biB0byBmaWVsZAkqLworCisjZGVmaW5lIFJFUV9ORVhUX0NIQVIJIChLRVlfTUFYICsgMTcpCS8qIG1vdmUgdG8gbmV4dCBjaGFyIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9QUkVWX0NIQVIJIChLRVlfTUFYICsgMTgpCS8qIG1vdmUgdG8gcHJldiBjaGFyIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9ORVhUX0xJTkUJIChLRVlfTUFYICsgMTkpCS8qIG1vdmUgdG8gbmV4dCBsaW5lIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9QUkVWX0xJTkUJIChLRVlfTUFYICsgMjApCS8qIG1vdmUgdG8gcHJldiBsaW5lIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9ORVhUX1dPUkQJIChLRVlfTUFYICsgMjEpCS8qIG1vdmUgdG8gbmV4dCB3b3JkIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9QUkVWX1dPUkQJIChLRVlfTUFYICsgMjIpCS8qIG1vdmUgdG8gcHJldiB3b3JkIGluIGZpZWxkCSovCisjZGVmaW5lIFJFUV9CRUdfRklFTEQJIChLRVlfTUFYICsgMjMpCS8qIG1vdmUgdG8gZmlyc3QgY2hhciBpbiBmaWVsZAkqLworI2RlZmluZSBSRVFfRU5EX0ZJRUxECSAoS0VZX01BWCArIDI0KQkvKiBtb3ZlIGFmdGVyIGxhc3QgY2hhciBpbiBmbGQJKi8KKyNkZWZpbmUgUkVRX0JFR19MSU5FCSAoS0VZX01BWCArIDI1KQkvKiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBsaW5lCSovCisjZGVmaW5lIFJFUV9FTkRfTElORQkgKEtFWV9NQVggKyAyNikJLyogbW92ZSBhZnRlciBsYXN0IGNoYXIgaW4gbGluZQkqLworI2RlZmluZSBSRVFfTEVGVF9DSEFSCSAoS0VZX01BWCArIDI3KQkvKiBtb3ZlIGxlZnQgaW4gZmllbGQJCSovCisjZGVmaW5lIFJFUV9SSUdIVF9DSEFSCSAoS0VZX01BWCArIDI4KQkvKiBtb3ZlIHJpZ2h0IGluIGZpZWxkCQkqLworI2RlZmluZSBSRVFfVVBfQ0hBUgkgKEtFWV9NQVggKyAyOSkJLyogbW92ZSB1cCBpbiBmaWVsZAkJKi8KKyNkZWZpbmUgUkVRX0RPV05fQ0hBUgkgKEtFWV9NQVggKyAzMCkJLyogbW92ZSBkb3duIGluIGZpZWxkCQkqLworCisjZGVmaW5lIFJFUV9ORVdfTElORQkgKEtFWV9NQVggKyAzMSkJLyogaW5zZXJ0L292ZXJsYXkgbmV3IGxpbmUJKi8KKyNkZWZpbmUgUkVRX0lOU19DSEFSCSAoS0VZX01BWCArIDMyKQkvKiBpbnNlcnQgYmxhbmsgY2hhciBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0lOU19MSU5FCSAoS0VZX01BWCArIDMzKQkvKiBpbnNlcnQgYmxhbmsgbGluZSBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0RFTF9DSEFSCSAoS0VZX01BWCArIDM0KQkvKiBkZWxldGUgY2hhciBhdCBjdXJzb3IJKi8KKyNkZWZpbmUgUkVRX0RFTF9QUkVWCSAoS0VZX01BWCArIDM1KQkvKiBkZWxldGUgY2hhciBiZWZvcmUgY3Vyc29yCSovCisjZGVmaW5lIFJFUV9ERUxfTElORQkgKEtFWV9NQVggKyAzNikJLyogZGVsZXRlIGxpbmUgYXQgY3Vyc29yCSovCisjZGVmaW5lIFJFUV9ERUxfV09SRAkgKEtFWV9NQVggKyAzNykJLyogZGVsZXRlIHdvcmQgYXQgY3Vyc29yCSovCisjZGVmaW5lIFJFUV9DTFJfRU9MCSAoS0VZX01BWCArIDM4KQkvKiBjbGVhciB0byBlbmQgb2YgbGluZQkJKi8KKyNkZWZpbmUgUkVRX0NMUl9FT0YJIChLRVlfTUFYICsgMzkpCS8qIGNsZWFyIHRvIGVuZCBvZiBmaWVsZAkqLworI2RlZmluZSBSRVFfQ0xSX0ZJRUxECSAoS0VZX01BWCArIDQwKQkvKiBjbGVhciBlbnRpcmUgZmllbGQJCSovCisjZGVmaW5lIFJFUV9PVkxfTU9ERQkgKEtFWV9NQVggKyA0MSkJLyogYmVnaW4gb3ZlcmxheSBtb2RlCQkqLworI2RlZmluZSBSRVFfSU5TX01PREUJIChLRVlfTUFYICsgNDIpCS8qIGJlZ2luIGluc2VydCBtb2RlCQkqLworI2RlZmluZSBSRVFfU0NSX0ZMSU5FCSAoS0VZX01BWCArIDQzKQkvKiBzY3JvbGwgZmllbGQgZm9yd2FyZCBhIGxpbmUJKi8KKyNkZWZpbmUgUkVRX1NDUl9CTElORQkgKEtFWV9NQVggKyA0NCkJLyogc2Nyb2xsIGZpZWxkIGJhY2t3YXJkIGEgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0ZQQUdFCSAoS0VZX01BWCArIDQ1KQkvKiBzY3JvbGwgZmllbGQgZm9yd2FyZCBhIHBhZ2UJKi8KKyNkZWZpbmUgUkVRX1NDUl9CUEFHRQkgKEtFWV9NQVggKyA0NikJLyogc2Nyb2xsIGZpZWxkIGJhY2t3YXJkIGEgcGFnZQkqLworI2RlZmluZSBSRVFfU0NSX0ZIUEFHRQkgKEtFWV9NQVggKyA0NykgLyogc2Nyb2xsIGZpZWxkIGZvcndhcmQJIGhhbGYgcGFnZSAqLworI2RlZmluZSBSRVFfU0NSX0JIUEFHRQkgKEtFWV9NQVggKyA0OCkgLyogc2Nyb2xsIGZpZWxkIGJhY2t3YXJkIGhhbGYgcGFnZSAqLworI2RlZmluZSBSRVFfU0NSX0ZDSEFSCSAoS0VZX01BWCArIDQ5KSAvKiBob3Jpem9udGFsIHNjcm9sbCBjaGFyCSovCisjZGVmaW5lIFJFUV9TQ1JfQkNIQVIJIChLRVlfTUFYICsgNTApIC8qIGhvcml6b250YWwgc2Nyb2xsIGNoYXIJKi8KKyNkZWZpbmUgUkVRX1NDUl9IRkxJTkUJIChLRVlfTUFYICsgNTEpIC8qIGhvcml6b250YWwgc2Nyb2xsIGxpbmUJKi8KKyNkZWZpbmUgUkVRX1NDUl9IQkxJTkUJIChLRVlfTUFYICsgNTIpIC8qIGhvcml6b250YWwgc2Nyb2xsIGxpbmUJKi8KKyNkZWZpbmUgUkVRX1NDUl9IRkhBTEYJIChLRVlfTUFYICsgNTMpIC8qIGhvcml6b250YWwgc2Nyb2xsIGhhbGYgbGluZQkqLworI2RlZmluZSBSRVFfU0NSX0hCSEFMRgkgKEtFWV9NQVggKyA1NCkgLyogaG9yaXpvbnRhbCBzY3JvbGwgaGFsZiBsaW5lCSovCisKKyNkZWZpbmUgUkVRX1ZBTElEQVRJT04JIChLRVlfTUFYICsgNTUpCS8qIHZhbGlkYXRlIGZpZWxkCQkqLworI2RlZmluZSBSRVFfTkVYVF9DSE9JQ0UJIChLRVlfTUFYICsgNTYpCS8qIGRpc3BsYXkgbmV4dCBmaWVsZCBjaG9pY2UJKi8KKyNkZWZpbmUgUkVRX1BSRVZfQ0hPSUNFCSAoS0VZX01BWCArIDU3KQkvKiBkaXNwbGF5IHByZXYgZmllbGQgY2hvaWNlCSovCisKKyNkZWZpbmUgTUlOX0ZPUk1fQ09NTUFORCAoS0VZX01BWCArIDEpCS8qIHVzZWQgYnkgZm9ybV9kcml2ZXIJCSovCisjZGVmaW5lIE1BWF9GT1JNX0NPTU1BTkQgKEtFWV9NQVggKyA1NykJLyogdXNlZCBieSBmb3JtX2RyaXZlcgkJKi8KKworI2lmIGRlZmluZWQoTUFYX0NPTU1BTkQpCisjICBpZiAoTUFYX0ZPUk1fQ09NTUFORCA+IE1BWF9DT01NQU5EKQorIyAgICBlcnJvciBTb21ldGhpbmcgaXMgd3JvbmcgLS0gTUFYX0ZPUk1fQ09NTUFORCBpcyBncmVhdGVyIHRoYW4gTUFYX0NPTU1BTkQKKyMgIGVsaWYgKE1BWF9DT01NQU5EICE9IChLRVlfTUFYICsgMTI4KSkKKyMgICAgZXJyb3IgU29tZXRoaW5nIGlzIHdyb25nIC0tIE1BWF9DT01NQU5EIGlzIGFscmVhZHkgaW5jb25zaXN0ZW50bHkgZGVmaW5lZC4KKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIE1BWF9DT01NQU5EIChLRVlfTUFYICsgMTI4KQorI2VuZGlmCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKgorCSogIHN0YW5kYXJkIGZpZWxkIHR5cGVzICAqCisJKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoRklFTERUWVBFICopIFRZUEVfQUxQSEE7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX0FMTlVNOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9FTlVNOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9JTlRFR0VSOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9OVU1FUklDOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGSUVMRFRZUEUgKikgVFlQRV9SRUdFWFA7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiAgYnVpbHQtaW4gYWRkaXRpb25hbCBmaWVsZCB0eXBlcyAgKgorCSogIFRoZXkgYXJlIG5vdCBkZWZpbmVkIGluIFNWcjQgICAgICoKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEVFlQRSAqKSBUWVBFX0lQVjQ7ICAgICAgLyogSW50ZXJuZXQgSVAgVmVyc2lvbiA0IGFkZHJlc3MgKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSogICBEZWZhdWx0IG9iamVjdHMgICAgKgorCSoqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihGT1JNICopCV9uY19EZWZhdWx0X0Zvcm07CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEZJRUxEICopCV9uY19EZWZhdWx0X0ZpZWxkOworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkqICBGSUVMRFRZUEUgcm91dGluZXMgICoKKwkqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRFRZUEUgKikgbmV3X2ZpZWxkdHlwZSAoCisJCSAgICBib29sICgqIGNvbnN0IGZpZWxkX2NoZWNrKShGSUVMRCAqLGNvbnN0IHZvaWQgKiksCisJCSAgICBib29sICgqIGNvbnN0IGNoYXJfY2hlY2spKGludCxjb25zdCB2b2lkICopKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRFRZUEUgKikgbGlua19maWVsZHR5cGUoCisJCSAgICBGSUVMRFRZUEUgKiwgRklFTERUWVBFICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX2ZpZWxkdHlwZSAoRklFTERUWVBFICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkdHlwZV9hcmcgKEZJRUxEVFlQRSAqLAorCQkgICAgdm9pZCAqICgqIGNvbnN0IG1ha2VfYXJnKSh2YV9saXN0ICopLAorCQkgICAgdm9pZCAqICgqIGNvbnN0IGNvcHlfYXJnKShjb25zdCB2b2lkICopLAorCQkgICAgdm9pZCAoKiBjb25zdCBmcmVlX2FyZykodm9pZCAqKSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQkgc2V0X2ZpZWxkdHlwZV9jaG9pY2UgKEZJRUxEVFlQRSAqLAorCQkgICAgYm9vbCAoKiBjb25zdCBuZXh0X2Nob2ljZSkoRklFTEQgKixjb25zdCB2b2lkICopLAorCSAgICAgIAkgICAgYm9vbCAoKiBjb25zdCBwcmV2X2Nob2ljZSkoRklFTEQgKixjb25zdCB2b2lkICopKTsKKworCS8qKioqKioqKioqKioqKioqKioqCisJKiAgRklFTEQgcm91dGluZXMgICoKKwkqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEICopCW5ld19maWVsZCAoaW50LGludCxpbnQsaW50LGludCxpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEICopCWR1cF9maWVsZCAoRklFTEQgKixpbnQsaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGSUVMRCAqKQlsaW5rX2ZpZWxkIChGSUVMRCAqLGludCxpbnQpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX2ZpZWxkIChGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX2luZm8gKGNvbnN0IEZJRUxEICosaW50ICosaW50ICosaW50ICosaW50ICosaW50ICosaW50ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZHluYW1pY19maWVsZF9pbmZvIChjb25zdCBGSUVMRCAqLGludCAqLGludCAqLGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tYXhfZmllbGQgKCBGSUVMRCAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQltb3ZlX2ZpZWxkIChGSUVMRCAqLGludCxpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX3R5cGUgKEZJRUxEICosRklFTERUWVBFICosLi4uKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9uZXdfcGFnZSAoRklFTEQgKixib29sKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9qdXN0IChGSUVMRCAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9qdXN0IChjb25zdCBGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9mb3JlIChGSUVMRCAqLGNodHlwZSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfYmFjayAoRklFTEQgKixjaHR5cGUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX3BhZCAoRklFTEQgKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfcGFkIChjb25zdCBGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9idWZmZXIgKEZJRUxEICosaW50LGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfc3RhdHVzIChGSUVMRCAqLGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2ZpZWxkX3VzZXJwdHIgKEZJRUxEICosIHZvaWQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZmllbGRfb3B0cyAoRklFTEQgKixGaWVsZF9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZpZWxkX29wdHNfb24gKEZJRUxEICosRmllbGRfT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmaWVsZF9vcHRzX29mZiAoRklFTEQgKixGaWVsZF9PcHRpb25zKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJZmllbGRfZm9yZSAoY29uc3QgRklFTEQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2h0eXBlKQlmaWVsZF9iYWNrIChjb25zdCBGSUVMRCAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpCW5ld19wYWdlIChjb25zdCBGSUVMRCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQlmaWVsZF9zdGF0dXMgKGNvbnN0IEZJRUxEICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCAqKQlmaWVsZF9hcmcgKGNvbnN0IEZJRUxEICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCAqKQlmaWVsZF91c2VycHRyIChjb25zdCBGSUVMRCAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEVFlQRSAqKQlmaWVsZF90eXBlIChjb25zdCBGSUVMRCAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikJZmllbGRfYnVmZmVyIChjb25zdCBGSUVMRCAqLGludCk7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChGaWVsZF9PcHRpb25zKQlmaWVsZF9vcHRzIChjb25zdCBGSUVMRCAqKTsKKworCS8qKioqKioqKioqKioqKioqKioKKwkqICBGT1JNIHJvdXRpbmVzICAqCisJKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRk9STSAqKQluZXdfZm9ybSAoRklFTEQgKiopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRklFTEQgKiopCWZvcm1fZmllbGRzIChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZJRUxEICopCWN1cnJlbnRfZmllbGQgKGNvbnN0IEZPUk0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cgKikJZm9ybV93aW4gKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopCWZvcm1fc3ViIChjb25zdCBGT1JNICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRm9ybV9Ib29rKQlmb3JtX2luaXQgKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRm9ybV9Ib29rKQlmb3JtX3Rlcm0gKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoRm9ybV9Ib29rKQlmaWVsZF9pbml0IChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKEZvcm1fSG9vaykJZmllbGRfdGVybSAoY29uc3QgRk9STSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZnJlZV9mb3JtIChGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fZmllbGRzIChGT1JNICosRklFTEQgKiopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfY291bnQgKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV93aW4gKEZPUk0gKixXSU5ET1cgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV9zdWIgKEZPUk0gKixXSU5ET1cgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfY3VycmVudF9maWVsZCAoRk9STSAqLEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZmllbGRfaW5kZXggKGNvbnN0IEZJRUxEICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fcGFnZSAoRk9STSAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmb3JtX3BhZ2UgKGNvbnN0IEZPUk0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzY2FsZV9mb3JtIChjb25zdCBGT1JNICosaW50ICosaW50ICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1faW5pdCAoRk9STSAqLEZvcm1fSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV90ZXJtIChGT1JNICosRm9ybV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF9pbml0IChGT1JNICosRm9ybV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9maWVsZF90ZXJtIChGT1JNICosRm9ybV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXBvc3RfZm9ybSAoRk9STSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXVucG9zdF9mb3JtIChGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJcG9zX2Zvcm1fY3Vyc29yIChGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJZm9ybV9kcml2ZXIgKEZPUk0gKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X2Zvcm1fdXNlcnB0ciAoRk9STSAqLHZvaWQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfZm9ybV9vcHRzIChGT1JNICosRm9ybV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZvcm1fb3B0c19vbiAoRk9STSAqLEZvcm1fT3B0aW9ucyk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmb3JtX29wdHNfb2ZmIChGT1JNICosRm9ybV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWZvcm1fcmVxdWVzdF9ieV9uYW1lIChjb25zdCBjaGFyICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKQlmb3JtX3JlcXVlc3RfbmFtZSAoaW50KTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQgKikJZm9ybV91c2VycHRyIChjb25zdCBGT1JNICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRm9ybV9PcHRpb25zKQlmb3JtX29wdHMgKGNvbnN0IEZPUk0gKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQlkYXRhX2FoZWFkIChjb25zdCBGT1JNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpCWRhdGFfYmVoaW5kIChjb25zdCBGT1JNICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZgkvKiBGT1JNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnB1X2NvbnRyb2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnB1X2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWFlNDhlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mcHVfY29udHJvbC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBGUFUgY29udHJvbCB3b3JkIGJpdHMuICB4ODYtNjQgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5MywxOTk1LDE5OTYsMTk5NywxOTk4LDIwMDAsMjAwMSwyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisgICBDb250cmlidXRlZCBieSBPbGFmIEZsZWJiZS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0ZQVV9DT05UUk9MX0gKKyNkZWZpbmUgX0ZQVV9DT05UUk9MX0gJMQorCisvKiBOb3RlIHRoYXQgdGhpcyBmaWxlIHNldHMgb24geDg2LTY0IG9ubHkgdGhlIHg4NyBGUFUsIGl0IGRvZXMgbm90CisgICB0b3VjaCB0aGUgU1NFIHVuaXQuICAqLworCisvKiBIZXJlIGlzIHRoZSBkaXJ0eSBwYXJ0LiBTZXQgdXAgeW91ciAzODcgdGhyb3VnaCB0aGUgY29udHJvbCB3b3JkCisgKiAoY3cpIHJlZ2lzdGVyLgorICoKKyAqICAgICAxNS0xMyAgICAxMiAgMTEtMTAgIDktOCAgICAgNy02ICAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMAorICogfCByZXNlcnZlZCB8IElDIHwgUkMgIHwgUEMgfCByZXNlcnZlZCB8IFBNIHwgVU0gfCBPTSB8IFpNIHwgRE0gfCBJTQorICoKKyAqIElNOiBJbnZhbGlkIG9wZXJhdGlvbiBtYXNrCisgKiBETTogRGVub3JtYWxpemVkIG9wZXJhbmQgbWFzaworICogWk06IFplcm8tZGl2aWRlIG1hc2sKKyAqIE9NOiBPdmVyZmxvdyBtYXNrCisgKiBVTTogVW5kZXJmbG93IG1hc2sKKyAqIFBNOiBQcmVjaXNpb24gKGluZXhhY3QgcmVzdWx0KSBtYXNrCisgKgorICogTWFzayBiaXQgaXMgMSBtZWFucyBubyBpbnRlcnJ1cHQuCisgKgorICogUEM6IFByZWNpc2lvbiBjb250cm9sCisgKiAxMSAtIHJvdW5kIHRvIGV4dGVuZGVkIHByZWNpc2lvbgorICogMTAgLSByb3VuZCB0byBkb3VibGUgcHJlY2lzaW9uCisgKiAwMCAtIHJvdW5kIHRvIHNpbmdsZSBwcmVjaXNpb24KKyAqCisgKiBSQzogUm91bmRpbmcgY29udHJvbAorICogMDAgLSByb3VuZGluZyB0byBuZWFyZXN0CisgKiAwMSAtIHJvdW5kaW5nIGRvd24gKHRvd2FyZCAtIGluZmluaXR5KQorICogMTAgLSByb3VuZGluZyB1cCAodG93YXJkICsgaW5maW5pdHkpCisgKiAxMSAtIHJvdW5kaW5nIHRvd2FyZCB6ZXJvCisgKgorICogSUM6IEluZmluaXR5IGNvbnRyb2wKKyAqIFRoYXQgaXMgZm9yIDgwODcgYW5kIDgwMjg3IG9ubHkuCisgKgorICogVGhlIGhhcmR3YXJlIGRlZmF1bHQgaXMgMHgwMzdmIHdoaWNoIHdlIHVzZS4KKyAqLworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogbWFza2luZyBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIF9GUFVfTUFTS19JTSAgMHgwMQorI2RlZmluZSBfRlBVX01BU0tfRE0gIDB4MDIKKyNkZWZpbmUgX0ZQVV9NQVNLX1pNICAweDA0CisjZGVmaW5lIF9GUFVfTUFTS19PTSAgMHgwOAorI2RlZmluZSBfRlBVX01BU0tfVU0gIDB4MTAKKyNkZWZpbmUgX0ZQVV9NQVNLX1BNICAweDIwCisKKy8qIHByZWNpc2lvbiBjb250cm9sICovCisjZGVmaW5lIF9GUFVfRVhURU5ERUQgMHgzMDAJLyogbGlibSByZXF1aXJlcyBkb3VibGUgZXh0ZW5kZWQgcHJlY2lzaW9uLiAgKi8KKyNkZWZpbmUgX0ZQVV9ET1VCTEUgICAweDIwMAorI2RlZmluZSBfRlBVX1NJTkdMRSAgIDB4MAorCisvKiByb3VuZGluZyBjb250cm9sICovCisjZGVmaW5lIF9GUFVfUkNfTkVBUkVTVCAweDAgICAgLyogUkVDT01NRU5ERUQgKi8KKyNkZWZpbmUgX0ZQVV9SQ19ET1dOICAgIDB4NDAwCisjZGVmaW5lIF9GUFVfUkNfVVAgICAgICAweDgwMAorI2RlZmluZSBfRlBVX1JDX1pFUk8gICAgMHhDMDAKKworI2RlZmluZSBfRlBVX1JFU0VSVkVEIDB4RjBDMCAgLyogUmVzZXJ2ZWQgYml0cyBpbiBjdyAqLworCisKKy8qIFRoZSBmZGxpYm0gY29kZSByZXF1aXJlcyBzdHJpY3QgSUVFRSBkb3VibGUgcHJlY2lzaW9uIGFyaXRobWV0aWMsCisgICBhbmQgbm8gaW50ZXJydXB0cyBmb3IgZXhjZXB0aW9ucywgcm91bmRpbmcgdG8gbmVhcmVzdC4gICovCisKKyNkZWZpbmUgX0ZQVV9ERUZBVUxUICAweDAzN2YKKworLyogSUVFRTogIHNhbWUgYXMgYWJvdmUuICAqLworI2RlZmluZSBfRlBVX0lFRUUgICAgIDB4MDM3ZgorCisvKiBUeXBlIG9mIHRoZSBjb250cm9sIHdvcmQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZnB1X2NvbnRyb2xfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgdGhlIGhhcmR3YXJlIGNvbnRyb2wgd29yZC4gICovCisjZGVmaW5lIF9GUFVfR0VUQ1coY3cpIF9fYXNtX18gKCJmbnN0Y3cgJTAiIDogIj1tIiAoKiZjdykpCisjZGVmaW5lIF9GUFVfU0VUQ1coY3cpIF9fYXNtX18gKCJmbGRjdyAlMCIgOiA6ICJtIiAoKiZjdykpCisKKy8qIERlZmF1bHQgY29udHJvbCB3b3JkIHNldCBhdCBzdGFydHVwLiAgKi8KK2V4dGVybiBmcHVfY29udHJvbF90IF9fZnB1X2NvbnRyb2w7CisKKyNlbmRpZgkvKiBmcHVfY29udHJvbC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ZzdGFiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2ZzdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlY2FkNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnN0YWIuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWZzdGFiLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfRlNUQUJfSAorI2RlZmluZSBfRlNUQUJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKgorICogRmlsZSBzeXN0ZW0gdGFibGUsIHNlZSBmc3RhYig1KS4KKyAqCisgKiBVc2VkIGJ5IGR1bXAsIG1vdW50LCB1bW91bnQsIHN3YXBvbiwgZnNjaywgZGYsIC4uLgorICoKKyAqIEZvciB1ZnMgZnNfc3BlYyBmaWVsZCBpcyB0aGUgYmxvY2sgc3BlY2lhbCBuYW1lLiAgUHJvZ3JhbXMgdGhhdCB3YW50IHRvCisgKiB1c2UgdGhlIGNoYXJhY3RlciBzcGVjaWFsIG5hbWUgbXVzdCBjcmVhdGUgdGhhdCBuYW1lIGJ5IHByZXBlbmRpbmcgYSAncicKKyAqIGFmdGVyIHRoZSByaWdodCBtb3N0IHNsYXNoLiAgUXVvdGEgZmlsZXMgYXJlIGFsd2F5cyBuYW1lZCAicXVvdGFzIiwgc28KKyAqIGlmIHR5cGUgaXMgInJxIiwgdGhlbiB1c2UgY29uY2F0ZW5hdGlvbiBvZiBmc19maWxlIGFuZCAicXVvdGFzIiB0byBsb2NhdGUKKyAqIHF1b3RhIGZpbGUuCisgKi8KKyNkZWZpbmUJX1BBVEhfRlNUQUIJIi9ldGMvZnN0YWIiCisjZGVmaW5lCUZTVEFCCQkiL2V0Yy9mc3RhYiIJLyogZGVwcmVjYXRlZCAqLworCisjZGVmaW5lCUZTVEFCX1JXCSJydyIJCS8qIHJlYWQvd3JpdGUgZGV2aWNlICovCisjZGVmaW5lCUZTVEFCX1JRCSJycSIJCS8qIHJlYWQvd3JpdGUgd2l0aCBxdW90YXMgKi8KKyNkZWZpbmUJRlNUQUJfUk8JInJvIgkJLyogcmVhZC1vbmx5IGRldmljZSAqLworI2RlZmluZQlGU1RBQl9TVwkic3ciCQkvKiBzd2FwIGRldmljZSAqLworI2RlZmluZQlGU1RBQl9YWAkieHgiCQkvKiBpZ25vcmUgdG90YWxseSAqLworCitzdHJ1Y3QgZnN0YWIKKyAgeworICAgIGNoYXIgKmZzX3NwZWM7CQkJLyogYmxvY2sgc3BlY2lhbCBkZXZpY2UgbmFtZSAqLworICAgIGNoYXIgKmZzX2ZpbGU7CQkJLyogZmlsZSBzeXN0ZW0gcGF0aCBwcmVmaXggKi8KKyAgICBjaGFyICpmc192ZnN0eXBlOwkJCS8qIEZpbGUgc3lzdGVtIHR5cGUsIHVmcywgbmZzICovCisgICAgY2hhciAqZnNfbW50b3BzOwkJCS8qIE1vdW50IG9wdGlvbnMgYWxhIC1vICovCisgICAgY29uc3QgY2hhciAqZnNfdHlwZTsJCS8qIEZTVEFCXyogZnJvbSBmc19tbnRvcHMgKi8KKyAgICBpbnQJZnNfZnJlcTsJCQkvKiBkdW1wIGZyZXF1ZW5jeSwgaW4gZGF5cyAqLworICAgIGludAlmc19wYXNzbm87CQkJLyogcGFzcyBudW1iZXIgb24gcGFyYWxsZWwgZHVtcCAqLworICB9OworCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIHN0cnVjdCBmc3RhYiAqZ2V0ZnNlbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IGZzdGFiICpnZXRmc3NwZWMgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBmc3RhYiAqZ2V0ZnNmaWxlIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVzsKK2V4dGVybiBpbnQgc2V0ZnNlbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBlbmRmc2VudCAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZzdGFiLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZnRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2Z0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDcwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2Z0cy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWZ0cy5oCTguMyAoQmVya2VsZXkpIDgvMTQvOTQKKyAqLworCisjaWZuZGVmCV9GVFNfSAorI2RlZmluZQlfRlRTX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVGhlIGZ0cyBpbnRlcmZhY2UgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIExGUyBpbnRlcmZhY2Ugd2hpY2gKKyAgIHRyYW5zcGFyZW50bHkgdXNlcyB0aGUgNjQtYml0IGZpbGUgYWNjZXNzIGZ1bmN0aW9ucy4gICovCisjaWZkZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBlcnJvciAiPGZ0cy5oPiBjYW5ub3QgYmUgdXNlZCB3aXRoIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9PTY0IgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBfZnRzZW50ICpmdHNfY3VyOwkvKiBjdXJyZW50IG5vZGUgKi8KKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2NoaWxkOwkvKiBsaW5rZWQgbGlzdCBvZiBjaGlsZHJlbiAqLworCXN0cnVjdCBfZnRzZW50ICoqZnRzX2FycmF5OwkvKiBzb3J0IGFycmF5ICovCisJZGV2X3QgZnRzX2RldjsJCQkvKiBzdGFydGluZyBkZXZpY2UgIyAqLworCWNoYXIgKmZ0c19wYXRoOwkJCS8qIHBhdGggZm9yIHRoaXMgZGVzY2VudCAqLworCWludCBmdHNfcmZkOwkJCS8qIGZkIGZvciByb290ICovCisJaW50IGZ0c19wYXRobGVuOwkJLyogc2l6ZW9mKHBhdGgpICovCisJaW50IGZ0c19uaXRlbXM7CQkJLyogZWxlbWVudHMgaW4gdGhlIHNvcnQgYXJyYXkgKi8KKwlpbnQgKCpmdHNfY29tcGFyKSAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOyAvKiBjb21wYXJlIGZuICovCisKKyNkZWZpbmUJRlRTX0NPTUZPTExPVwkweDAwMDEJCS8qIGZvbGxvdyBjb21tYW5kIGxpbmUgc3ltbGlua3MgKi8KKyNkZWZpbmUJRlRTX0xPR0lDQUwJMHgwMDAyCQkvKiBsb2dpY2FsIHdhbGsgKi8KKyNkZWZpbmUJRlRTX05PQ0hESVIJMHgwMDA0CQkvKiBkb24ndCBjaGFuZ2UgZGlyZWN0b3JpZXMgKi8KKyNkZWZpbmUJRlRTX05PU1RBVAkweDAwMDgJCS8qIGRvbid0IGdldCBzdGF0IGluZm8gKi8KKyNkZWZpbmUJRlRTX1BIWVNJQ0FMCTB4MDAxMAkJLyogcGh5c2ljYWwgd2FsayAqLworI2RlZmluZQlGVFNfU0VFRE9UCTB4MDAyMAkJLyogcmV0dXJuIGRvdCBhbmQgZG90LWRvdCAqLworI2RlZmluZQlGVFNfWERFVgkweDAwNDAJCS8qIGRvbid0IGNyb3NzIGRldmljZXMgKi8KKyNkZWZpbmUgRlRTX1dISVRFT1VUCTB4MDA4MAkJLyogcmV0dXJuIHdoaXRlb3V0IGluZm9ybWF0aW9uICovCisjZGVmaW5lCUZUU19PUFRJT05NQVNLCTB4MDBmZgkJLyogdmFsaWQgdXNlciBvcHRpb24gbWFzayAqLworCisjZGVmaW5lCUZUU19OQU1FT05MWQkweDAxMDAJCS8qIChwcml2YXRlKSBjaGlsZCBuYW1lcyBvbmx5ICovCisjZGVmaW5lCUZUU19TVE9QCTB4MDIwMAkJLyogKHByaXZhdGUpIHVucmVjb3ZlcmFibGUgZXJyb3IgKi8KKwlpbnQgZnRzX29wdGlvbnM7CQkvKiBmdHNfb3BlbiBvcHRpb25zLCBnbG9iYWwgZmxhZ3MgKi8KK30gRlRTOworCit0eXBlZGVmIHN0cnVjdCBfZnRzZW50IHsKKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2N5Y2xlOwkvKiBjeWNsZSBub2RlICovCisJc3RydWN0IF9mdHNlbnQgKmZ0c19wYXJlbnQ7CS8qIHBhcmVudCBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgX2Z0c2VudCAqZnRzX2xpbms7CS8qIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgKi8KKwlsb25nIGZ0c19udW1iZXI7CSAgICAgICAgLyogbG9jYWwgbnVtZXJpYyB2YWx1ZSAqLworCXZvaWQgKmZ0c19wb2ludGVyOwkgICAgICAgIC8qIGxvY2FsIGFkZHJlc3MgdmFsdWUgKi8KKwljaGFyICpmdHNfYWNjcGF0aDsJCS8qIGFjY2VzcyBwYXRoICovCisJY2hhciAqZnRzX3BhdGg7CQkJLyogcm9vdCBwYXRoICovCisJaW50IGZ0c19lcnJubzsJCQkvKiBlcnJubyBmb3IgdGhpcyBub2RlICovCisJaW50IGZ0c19zeW1mZDsJCQkvKiBmZCBmb3Igc3ltbGluayAqLworCXVfc2hvcnQgZnRzX3BhdGhsZW47CQkvKiBzdHJsZW4oZnRzX3BhdGgpICovCisJdV9zaG9ydCBmdHNfbmFtZWxlbjsJCS8qIHN0cmxlbihmdHNfbmFtZSkgKi8KKworCWlub190IGZ0c19pbm87CQkJLyogaW5vZGUgKi8KKwlkZXZfdCBmdHNfZGV2OwkJCS8qIGRldmljZSAqLworCW5saW5rX3QgZnRzX25saW5rOwkJLyogbGluayBjb3VudCAqLworCisjZGVmaW5lCUZUU19ST09UUEFSRU5UTEVWRUwJLTEKKyNkZWZpbmUJRlRTX1JPT1RMRVZFTAkJIDAKKwlzaG9ydCBmdHNfbGV2ZWw7CQkvKiBkZXB0aCAoLTEgdG8gTikgKi8KKworI2RlZmluZQlGVFNfRAkJIDEJCS8qIHByZW9yZGVyIGRpcmVjdG9yeSAqLworI2RlZmluZQlGVFNfREMJCSAyCQkvKiBkaXJlY3RvcnkgdGhhdCBjYXVzZXMgY3ljbGVzICovCisjZGVmaW5lCUZUU19ERUZBVUxUCSAzCQkvKiBub25lIG9mIHRoZSBhYm92ZSAqLworI2RlZmluZQlGVFNfRE5SCQkgNAkJLyogdW5yZWFkYWJsZSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRlRTX0RPVAkJIDUJCS8qIGRvdCBvciBkb3QtZG90ICovCisjZGVmaW5lCUZUU19EUAkJIDYJCS8qIHBvc3RvcmRlciBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRlRTX0VSUgkJIDcJCS8qIGVycm9yOyBlcnJubyBpcyBzZXQgKi8KKyNkZWZpbmUJRlRTX0YJCSA4CQkvKiByZWd1bGFyIGZpbGUgKi8KKyNkZWZpbmUJRlRTX0lOSVQJIDkJCS8qIGluaXRpYWxpemVkIG9ubHkgKi8KKyNkZWZpbmUJRlRTX05TCQkxMAkJLyogc3RhdCgyKSBmYWlsZWQgKi8KKyNkZWZpbmUJRlRTX05TT0sJMTEJCS8qIG5vIHN0YXQoMikgcmVxdWVzdGVkICovCisjZGVmaW5lCUZUU19TTAkJMTIJCS8qIHN5bWJvbGljIGxpbmsgKi8KKyNkZWZpbmUJRlRTX1NMTk9ORQkxMwkJLyogc3ltYm9saWMgbGluayB3aXRob3V0IHRhcmdldCAqLworI2RlZmluZSBGVFNfVwkJMTQJCS8qIHdoaXRlb3V0IG9iamVjdCAqLworCXVfc2hvcnQgZnRzX2luZm87CQkvKiB1c2VyIGZsYWdzIGZvciBGVFNFTlQgc3RydWN0dXJlICovCisKKyNkZWZpbmUJRlRTX0RPTlRDSERJUgkgMHgwMQkJLyogZG9uJ3QgY2hkaXIgLi4gdG8gdGhlIHBhcmVudCAqLworI2RlZmluZQlGVFNfU1lNRk9MTE9XCSAweDAyCQkvKiBmb2xsb3dlZCBhIHN5bWxpbmsgdG8gZ2V0IGhlcmUgKi8KKwl1X3Nob3J0IGZ0c19mbGFnczsJCS8qIHByaXZhdGUgZmxhZ3MgZm9yIEZUU0VOVCBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZQlGVFNfQUdBSU4JIDEJCS8qIHJlYWQgbm9kZSBhZ2FpbiAqLworI2RlZmluZQlGVFNfRk9MTE9XCSAyCQkvKiBmb2xsb3cgc3ltYm9saWMgbGluayAqLworI2RlZmluZQlGVFNfTk9JTlNUUgkgMwkJLyogbm8gaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lCUZUU19TS0lQCSA0CQkvKiBkaXNjYXJkIG5vZGUgKi8KKwl1X3Nob3J0IGZ0c19pbnN0cjsJCS8qIGZ0c19zZXQoKSBpbnN0cnVjdGlvbnMgKi8KKworCXN0cnVjdCBzdGF0ICpmdHNfc3RhdHA7CQkvKiBzdGF0KDIpIGluZm9ybWF0aW9uICovCisJY2hhciBmdHNfbmFtZVsxXTsJCS8qIGZpbGUgbmFtZSAqLworfSBGVFNFTlQ7CisKK19fQkVHSU5fREVDTFMKK0ZUU0VOVAkqZnRzX2NoaWxkcmVuIChGVFMgKiwgaW50KTsKK2ludAkgZnRzX2Nsb3NlIChGVFMgKik7CitGVFMJKmZ0c19vcGVuIChjaGFyICogY29uc3QgKiwgaW50LAorCQkgICBpbnQgKCopKGNvbnN0IEZUU0VOVCAqKiwgY29uc3QgRlRTRU5UICoqKSk7CitGVFNFTlQJKmZ0c19yZWFkIChGVFMgKik7CitpbnQJIGZ0c19zZXQgKEZUUyAqLCBGVFNFTlQgKiwgaW50KSBfX1RIUk9XOworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGZ0cy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2Z0dy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mdHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmRmZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9mdHcuaApAQCAtMCwwICsxLDE3OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkyLDE5OTYtMTk5OSwyMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglYL09wZW4gUG9ydGFiaWxpdHkgR3VpZGUgNC4yOiBmdHcuaAorICovCisKKyNpZm5kZWYgX0ZUV19ICisjZGVmaW5lCV9GVFdfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFZhbHVlcyBmb3IgdGhlIEZMQUcgYXJndW1lbnQgdG8gdGhlIHVzZXIgZnVuY3Rpb24gcGFzc2VkIHRvIGBmdHcnCisgICBhbmQgJ25mdHcnLiAgKi8KK2VudW0KK3sKKyAgRlRXX0YsCQkvKiBSZWd1bGFyIGZpbGUuICAqLworI2RlZmluZSBGVFdfRgkgRlRXX0YKKyAgRlRXX0QsCQkvKiBEaXJlY3RvcnkuICAqLworI2RlZmluZSBGVFdfRAkgRlRXX0QKKyAgRlRXX0ROUiwJCS8qIFVucmVhZGFibGUgZGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUgRlRXX0ROUgkgRlRXX0ROUgorICBGVFdfTlMsCQkvKiBVbnN0YXRhYmxlIGZpbGUuICAqLworI2RlZmluZSBGVFdfTlMJIEZUV19OUworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorCisgIEZUV19TTCwJCS8qIFN5bWJvbGljIGxpbmsuICAqLworIyBkZWZpbmUgRlRXX1NMCSBGVFdfU0wKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFRoZXNlIGZsYWdzIGFyZSBvbmx5IHBhc3NlZCBmcm9tIHRoZSBgbmZ0dycgZnVuY3Rpb24uICAqLworICBGVFdfRFAsCQkvKiBEaXJlY3RvcnksIGFsbCBzdWJkaXJzIGhhdmUgYmVlbiB2aXNpdGVkLiAqLworIyBkZWZpbmUgRlRXX0RQCSBGVFdfRFAKKyAgRlRXX1NMTgkJLyogU3ltYm9saWMgbGluayBuYW1pbmcgbm9uLWV4aXN0aW5nIGZpbGUuICAqLworIyBkZWZpbmUgRlRXX1NMTiBGVFdfU0xOCisKKyNlbmRpZgkvKiBleHRlbmRlZCBYL09wZW4gKi8KK307CisKKworI2lmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBGbGFncyBmb3IgZm91cnRoIGFyZ3VtZW50IG9mIGBuZnR3Jy4gICovCitlbnVtCit7CisgIEZUV19QSFlTID0gMSwJCS8qIFBlcmZvcm0gcGh5c2ljYWwgd2FsaywgaWdub3JlIHN5bWxpbmtzLiAgKi8KKyMgZGVmaW5lIEZUV19QSFlTCUZUV19QSFlTCisgIEZUV19NT1VOVCA9IDIsCS8qIFJlcG9ydCBvbmx5IGZpbGVzIG9uIHNhbWUgZmlsZSBzeXN0ZW0gYXMgdGhlCisJCQkgICBhcmd1bWVudC4gICovCisjIGRlZmluZSBGVFdfTU9VTlQJRlRXX01PVU5UCisgIEZUV19DSERJUiA9IDQsCS8qIENoYW5nZSB0byBjdXJyZW50IGRpcmVjdG9yeSB3aGlsZSBwcm9jZXNzaW5nIGl0LiAgKi8KKyMgZGVmaW5lIEZUV19DSERJUglGVFdfQ0hESVIKKyAgRlRXX0RFUFRIID0gOAkJLyogUmVwb3J0IGZpbGVzIGluIGRpcmVjdG9yeSBiZWZvcmUgZGlyZWN0b3J5IGl0c2VsZi4qLworIyBkZWZpbmUgRlRXX0RFUFRICUZUV19ERVBUSAorIyBpZmRlZiBfX1VTRV9HTlUKKyAgLAorICBGVFdfQUNUSU9OUkVUVkFMID0gMTYJLyogQXNzdW1lIGNhbGxiYWNrIHRvIHJldHVybiBGVFdfKiB2YWx1ZXMgaW5zdGVhZCBvZgorCQkJICAgemVybyB0byBjb250aW51ZSBhbmQgbm9uLXplcm8gdG8gdGVybWluYXRlLiAgKi8KKyMgIGRlZmluZSBGVFdfQUNUSU9OUkVUVkFMIEZUV19BQ1RJT05SRVRWQUwKKyMgZW5kaWYKK307CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJldHVybiB2YWx1ZXMgZnJvbSBjYWxsYmFjayBmdW5jdGlvbnMuICAqLworZW51bQoreworICBGVFdfQ09OVElOVUUgPSAwLAkvKiBDb250aW51ZSB3aXRoIG5leHQgc2libGluZyBvciBmb3IgRlRXX0Qgd2l0aCB0aGUKKwkJCSAgIGZpcnN0IGNoaWxkLiAgKi8KKyMgZGVmaW5lIEZUV19DT05USU5VRQlGVFdfQ09OVElOVUUKKyAgRlRXX1NUT1AgPSAxLAkJLyogUmV0dXJuIGZyb20gYGZ0dycgb3IgYG5mdHcnIHdpdGggRlRXX1NUT1AgYXMgcmV0dXJuCisJCQkgICB2YWx1ZS4gICovCisjIGRlZmluZSBGVFdfU1RPUAlGVFdfU1RPUAorICBGVFdfU0tJUF9TVUJUUkVFID0gMiwJLyogT25seSBtZWFuaW5nZnVsIGZvciBGVFdfRDogRG9uJ3Qgd2FsayB0aHJvdWdoIHRoZQorCQkJICAgc3VidHJlZSwgaW5zdGVhZCBqdXN0IGNvbnRpbnVlIHdpdGggaXRzIG5leHQKKwkJCSAgIHNpYmxpbmcuICovCisjIGRlZmluZSBGVFdfU0tJUF9TVUJUUkVFIEZUV19TS0lQX1NVQlRSRUUKKyAgRlRXX1NLSVBfU0lCTElOR1MgPSAzLC8qIENvbnRpbnVlIHdpdGggRlRXX0RQIGNhbGxiYWNrIGZvciBjdXJyZW50IGRpcmVjdG9yeQorCQkJICAgIChpZiBGVFdfREVQVEgpIGFuZCB0aGVuIGl0cyBzaWJsaW5ncy4gICovCisjIGRlZmluZSBGVFdfU0tJUF9TSUJMSU5HUyBGVFdfU0tJUF9TSUJMSU5HUworfTsKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgZm91cnRoIGFyZ3VtZW50IHRvIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBgbmZ0dycuICAqLworc3RydWN0IEZUVworICB7CisgICAgaW50IGJhc2U7CisgICAgaW50IGxldmVsOworICB9OworI2VuZGlmCS8qIGV4dGVuZGVkIFgvT3BlbiAqLworCisKKy8qIENvbnZlbmllbnQgdHlwZXMgZm9yIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICovCit0eXBlZGVmIGludCAoKl9fZnR3X2Z1bmNfdCkgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCSAgICAgX19jb25zdCBzdHJ1Y3Qgc3RhdCAqX19zdGF0dXMsIGludCBfX2ZsYWcpOworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIGludCAoKl9fZnR3NjRfZnVuY190KSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJICAgICAgIF9fY29uc3Qgc3RydWN0IHN0YXQ2NCAqX19zdGF0dXMsIGludCBfX2ZsYWcpOworI2VuZGlmCisjaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKK3R5cGVkZWYgaW50ICgqX19uZnR3X2Z1bmNfdCkgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCSAgICAgIF9fY29uc3Qgc3RydWN0IHN0YXQgKl9fc3RhdHVzLCBpbnQgX19mbGFnLAorCQkJICAgICAgc3RydWN0IEZUVyAqX19pbmZvKTsKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK3R5cGVkZWYgaW50ICgqX19uZnR3NjRfZnVuY190KSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCV9fY29uc3Qgc3RydWN0IHN0YXQ2NCAqX19zdGF0dXMsCisJCQkJaW50IF9fZmxhZywgc3RydWN0IEZUVyAqX19pbmZvKTsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBDYWxsIGEgZnVuY3Rpb24gb24gZXZlcnkgZWxlbWVudCBpbiBhIGRpcmVjdG9yeSB0cmVlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmdHcgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fZnR3X2Z1bmNfdCBfX2Z1bmMsIGludCBfX2Rlc2NyaXB0b3JzKQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZ0dywgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fZnR3X2Z1bmNfdCBfX2Z1bmMsCisJCQkgICAgIGludCBfX2Rlc2NyaXB0b3JzKSwgZnR3NjQpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIGZ0dyBmdHc2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnR3NjQgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fZnR3NjRfZnVuY190IF9fZnVuYywKKwkJICBpbnQgX19kZXNjcmlwdG9ycykgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogQ2FsbCBhIGZ1bmN0aW9uIG9uIGV2ZXJ5IGVsZW1lbnQgaW4gYSBkaXJlY3RvcnkgdHJlZS4gIEZMQUcgYWxsb3dzCisgICB0byBzcGVjaWZ5IHRoZSBiZWhhdmlvdXIgbW9yZSBkZXRhaWxlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IG5mdHcgKF9fY29uc3QgY2hhciAqX19kaXIsIF9fbmZ0d19mdW5jX3QgX19mdW5jLCBpbnQgX19kZXNjcmlwdG9ycywKKwkJIGludCBfX2ZsYWcpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChuZnR3LCAoX19jb25zdCBjaGFyICpfX2RpciwgX19uZnR3X2Z1bmNfdCBfX2Z1bmMsCisJCQkgICAgICBpbnQgX19kZXNjcmlwdG9ycywgaW50IF9fZmxhZyksIG5mdHc2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBuZnR3IG5mdHc2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbmZ0dzY0IChfX2NvbnN0IGNoYXIgKl9fZGlyLCBfX25mdHc2NF9mdW5jX3QgX19mdW5jLAorCQkgICBpbnQgX19kZXNjcmlwdG9ycywgaW50IF9fZmxhZykgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBmdHcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9nY29udi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nY29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDYzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2djb252LmgKQEAgLTAsMCArMSwxODAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5LCAyMDAwLTIwMDIsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgaGVhZGVyIHByb3ZpZGVzIG5vIGludGVyZmFjZSBmb3IgYSB1c2VyIHRvIHRoZSBpbnRlcm5hbHMgb2YKKyAgIHRoZSBnY29udiBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbGliYy4gIFRoZXJlZm9yZSB0aGVyZSBpcyBubyB1c2UKKyAgIGZvciB0aGVzZSBkZWZpbml0aW9ucyBiZXNpZGUgZm9yIHdyaXRpbmcgYWRkaXRpb25hbCBnY29udiBtb2R1bGVzLiAgKi8KKworI2lmbmRlZiBfR0NPTlZfSAorI2RlZmluZSBfR0NPTlZfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX25lZWRfbWJzdGF0ZV90CisjZGVmaW5lIF9fbmVlZF93aW50X3QKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2RlZmluZSBfX25lZWRfc2l6ZV90CisjZGVmaW5lIF9fbmVlZF93Y2hhcl90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIElTTyAxMDY0NiB2YWx1ZSB1c2VkIHRvIHNpZ25hbCBpbnZhbGlkIHZhbHVlLiAgKi8KKyNkZWZpbmUgX19VTktOT1dOXzEwNjQ2X0NIQVIJKCh3Y2hhcl90KSAweGZmZmQpCisKKy8qIEVycm9yIGNvZGVzIGZvciBnY29udiBmdW5jdGlvbnMuICAqLworZW51bQoreworICBfX0dDT05WX09LID0gMCwKKyAgX19HQ09OVl9OT0NPTlYsCisgIF9fR0NPTlZfTk9EQiwKKyAgX19HQ09OVl9OT01FTSwKKworICBfX0dDT05WX0VNUFRZX0lOUFVULAorICBfX0dDT05WX0ZVTExfT1VUUFVULAorICBfX0dDT05WX0lMTEVHQUxfSU5QVVQsCisgIF9fR0NPTlZfSU5DT01QTEVURV9JTlBVVCwKKworICBfX0dDT05WX0lMTEVHQUxfREVTQ1JJUFRPUiwKKyAgX19HQ09OVl9JTlRFUk5BTF9FUlJPUgorfTsKKworCisvKiBGbGFncyB0aGUgYF9fZ2NvbnZfb3BlbicgZnVuY3Rpb24gY2FuIHNldC4gICovCitlbnVtCit7CisgIF9fR0NPTlZfSVNfTEFTVCA9IDB4MDAwMSwKKyAgX19HQ09OVl9JR05PUkVfRVJST1JTID0gMHgwMDAyCit9OworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAgKi8KK3N0cnVjdCBfX2djb252X3N0ZXA7CitzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGE7CitzdHJ1Y3QgX19nY29udl9sb2FkZWRfb2JqZWN0Oworc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YTsKKworCisvKiBUeXBlIG9mIGEgY29udmVyc2lvbiBmdW5jdGlvbi4gICovCit0eXBlZGVmIGludCAoKl9fZ2NvbnZfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqLCBzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEgKiwKKwkJCSAgICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiosIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKiosIHNpemVfdCAqLCBpbnQsIGludCk7CisKKy8qIFR5cGUgb2YgYSBzcGVjaWFsaXplZCBjb252ZXJzaW9uIGZ1bmN0aW9uIGZvciBhIHNpbmdsZSBieXRlIHRvIElOVEVSTkFMLiAgKi8KK3R5cGVkZWYgd2ludF90ICgqX19nY29udl9idG93Y19mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICosIHVuc2lnbmVkIGNoYXIpOworCisvKiBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBmb3IgbG9jYWwgZGF0YSBmb3IgY29udmVyc2lvbiBzdGVwLiAgKi8KK3R5cGVkZWYgaW50ICgqX19nY29udl9pbml0X2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKik7Cit0eXBlZGVmIHZvaWQgKCpfX2djb252X2VuZF9mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICopOworCisKKy8qIFR5cGUgb2YgYSB0cmFuc2xpdGVyYXRpb24vdHJhbnNzY3JpcHRpb24gZnVuY3Rpb24uICAqLwordHlwZWRlZiBpbnQgKCpfX2djb252X3RyYW5zX2ZjdCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKiwKKwkJCQkgIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSAqLCB2b2lkICosCisJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqKiwKKwkJCQkgIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICoqLAorCQkJCSAgc2l6ZV90ICopOworCisvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHByb3ZpZGUgdHJhbnNsaXRlcmF0aW9uIG1vZHVsZSB3aXRoIGNvbnRleHQuICAqLwordHlwZWRlZiBpbnQgKCpfX2djb252X3RyYW5zX2NvbnRleHRfZmN0KSAodm9pZCAqLCBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCQkJICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CisKKy8qIEZ1bmN0aW9uIHRvIHF1ZXJ5IG1vZHVsZSBhYm91dCBzdXBwb3J0ZWQgZW5jb2RlZCBjaGFyYWN0ZXIgc2V0cy4gICovCit0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfcXVlcnlfZmN0KSAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqKiosCisJCQkJCXNpemVfdCAqKTsKKworLyogQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZm9yIGxvY2FsIGRhdGEgZm9yIHRyYW5zbGl0ZXJhdGlvbi4gICovCit0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfaW5pdF9mY3QpICh2b2lkICoqLCBjb25zdCBjaGFyICopOwordHlwZWRlZiB2b2lkICgqX19nY29udl90cmFuc19lbmRfZmN0KSAodm9pZCAqKTsKKworc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YQoreworICAvKiBUcmFuc2xpdGVyYXRpb24vVHJhbnNzY3JpcHRpb24gZnVuY3Rpb24uICAqLworICBfX2djb252X3RyYW5zX2ZjdCBfX3RyYW5zX2ZjdDsKKyAgX19nY29udl90cmFuc19jb250ZXh0X2ZjdCBfX3RyYW5zX2NvbnRleHRfZmN0OworICBfX2djb252X3RyYW5zX2VuZF9mY3QgX190cmFuc19lbmRfZmN0OworICB2b2lkICpfX2RhdGE7CisgIHN0cnVjdCBfX2djb252X3RyYW5zX2RhdGEgKl9fbmV4dDsKK307CisKKworLyogRGVzY3JpcHRpb24gb2YgYSBjb252ZXJzaW9uIHN0ZXAuICAqLworc3RydWN0IF9fZ2NvbnZfc3RlcAoreworICBzdHJ1Y3QgX19nY29udl9sb2FkZWRfb2JqZWN0ICpfX3NobGliX2hhbmRsZTsKKyAgX19jb25zdCBjaGFyICpfX21vZG5hbWU7CisKKyAgaW50IF9fY291bnRlcjsKKworICBjaGFyICpfX2Zyb21fbmFtZTsKKyAgY2hhciAqX190b19uYW1lOworCisgIF9fZ2NvbnZfZmN0IF9fZmN0OworICBfX2djb252X2J0b3djX2ZjdCBfX2J0b3djX2ZjdDsKKyAgX19nY29udl9pbml0X2ZjdCBfX2luaXRfZmN0OworICBfX2djb252X2VuZF9mY3QgX19lbmRfZmN0OworCisgIC8qIEluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIG9yIHByb2R1Y2VkIGluIHRoaXMKKyAgICAgc3RlcC4gIFRoaXMgaGVscHMgb3B0aW1pemluZyB0aGUgYnVmZmVyIHNpemVzLiAgKi8KKyAgaW50IF9fbWluX25lZWRlZF9mcm9tOworICBpbnQgX19tYXhfbmVlZGVkX2Zyb207CisgIGludCBfX21pbl9uZWVkZWRfdG87CisgIGludCBfX21heF9uZWVkZWRfdG87CisKKyAgLyogRmxhZyB3aGV0aGVyIHRoaXMgaXMgYSBzdGF0ZWZ1bCBlbmNvZGluZyBvciBub3QuICAqLworICBpbnQgX19zdGF0ZWZ1bDsKKworICB2b2lkICpfX2RhdGE7CQkvKiBQb2ludGVyIHRvIHN0ZXAtbG9jYWwgZGF0YS4gICovCit9OworCisvKiBBZGRpdGlvbmFsIGRhdGEgZm9yIHN0ZXBzIGluIHVzZSBvZiBjb252ZXJzaW9uIGRlc2NyaXB0b3IuICBUaGlzIGlzCisgICBhbGxvY2F0ZWQgYnkgdGhlIGBpbml0JyBmdW5jdGlvbi4gICovCitzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEKK3sKKyAgdW5zaWduZWQgY2hhciAqX19vdXRidWY7ICAgIC8qIE91dHB1dCBidWZmZXIgZm9yIHRoaXMgc3RlcC4gICovCisgIHVuc2lnbmVkIGNoYXIgKl9fb3V0YnVmZW5kOyAvKiBBZGRyZXNzIG9mIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIG91dHB1dAorCQkJCSBidWZmZXIuICAqLworCisgIC8qIElzIHRoaXMgdGhlIGxhc3QgbW9kdWxlIGluIHRoZSBjaGFpbi4gICovCisgIGludCBfX2ZsYWdzOworCisgIC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBpbnZvY2F0aW9ucyBvZiB0aGUgbW9kdWxlIGZ1bmN0aW9uIGZvciB0aGlzCisgICAgIGRlc2NyaXB0b3IuICAqLworICBpbnQgX19pbnZvY2F0aW9uX2NvdW50ZXI7CisKKyAgLyogRmxhZyB3aGV0aGVyIHRoaXMgaXMgYW4gaW50ZXJuYWwgdXNlIG9mIHRoZSBtb2R1bGUgKGluIHRoZSBtYip0b3djKgorICAgICBhbmQgd2MqdG9tYiogZnVuY3Rpb25zKSBvciByZWd1bGFyIHdpdGggaWNvbnYoMykuICAqLworICBpbnQgX19pbnRlcm5hbF91c2U7CisKKyAgX19tYnN0YXRlX3QgKl9fc3RhdGVwOworICBfX21ic3RhdGVfdCBfX3N0YXRlOwkvKiBUaGlzIGVsZW1lbnQgbXVzdCBub3QgYmUgdXNlZCBkaXJlY3RseSBieQorCQkJICAgYW55IG1vZHVsZTsgYWx3YXlzIHVzZSBTVEFURVAhICAqLworCisgIC8qIFRyYW5zbGl0ZXJhdGlvbiBpbmZvcm1hdGlvbi4gICovCisgIHN0cnVjdCBfX2djb252X3RyYW5zX2RhdGEgKl9fdHJhbnM7Cit9OworCisKKy8qIENvbWJpbmUgY29udmVyc2lvbiBzdGVwIGRlc2NyaXB0aW9uIHdpdGggZGF0YS4gICovCit0eXBlZGVmIHN0cnVjdCBfX2djb252X2luZm8KK3sKKyAgc2l6ZV90IF9fbnN0ZXBzOworICBzdHJ1Y3QgX19nY29udl9zdGVwICpfX3N0ZXBzOworICBfX2V4dGVuc2lvbl9fIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSBfX2RhdGEgX19mbGV4YXJyOworfSAqX19nY29udl90OworCisjZW5kaWYgLyogZ2NvbnYuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9nZXRvcHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMDI2YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ2V0b3B0LmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgZ2V0b3B0LgorICAgQ29weXJpZ2h0IChDKSAxOTg5LTE5OTQsMTk5Ni0xOTk5LDIwMDEsMjAwMywyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfR0VUT1BUX0gKKworI2lmbmRlZiBfX25lZWRfZ2V0b3B0CisjIGRlZmluZSBfR0VUT1BUX0ggMQorI2VuZGlmCisKKy8qIElmIF9fR05VX0xJQlJBUllfXyBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBlaXRoZXIgd2UgYXJlIGJlaW5nIHVzZWQKKyAgIHN0YW5kYWxvbmUsIG9yIHRoaXMgaXMgdGhlIGZpcnN0IGhlYWRlciBpbmNsdWRlZCBpbiB0aGUgc291cmNlIGZpbGUuCisgICBJZiB3ZSBhcmUgYmVpbmcgdXNlZCB3aXRoIGdsaWJjLCB3ZSBuZWVkIHRvIGluY2x1ZGUgPGZlYXR1cmVzLmg+LCBidXQKKyAgIHRoYXQgZG9lcyBub3QgZXhpc3QgaWYgd2UgYXJlIHN0YW5kYWxvbmUuICBTbzogaWYgX19HTlVfTElCUkFSWV9fIGlzCisgICBub3QgZGVmaW5lZCwgaW5jbHVkZSA8Y3R5cGUuaD4sIHdoaWNoIHdpbGwgcHVsbCBpbiA8ZmVhdHVyZXMuaD4gZm9yIHVzCisgICBpZiBpdCdzIGZyb20gZ2xpYmMuICAoV2h5IGN0eXBlLmg/ICBJdCdzIGd1YXJhbnRlZWQgdG8gZXhpc3QgYW5kIGl0CisgICBkb2Vzbid0IGZsb29kIHRoZSBuYW1lc3BhY2Ugd2l0aCBzdHVmZiB0aGUgd2F5IHNvbWUgb3RoZXIgaGVhZGVycyBkby4pICAqLworI2lmICFkZWZpbmVkIF9fR05VX0xJQlJBUllfXworIyBpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKKyNpZm5kZWYgX19USFJPVworIyBpZm5kZWYgX19HTlVDX1BSRVJFUQorIyAgZGVmaW5lIF9fR05VQ19QUkVSRVEobWFqLCBtaW4pICgwKQorIyBlbmRpZgorIyBpZiBkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDIsOCkKKyMgIGRlZmluZSBfX1RIUk9XCXRocm93ICgpCisjIGVsc2UKKyMgIGRlZmluZSBfX1RIUk9XCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGb3IgY29tbXVuaWNhdGlvbiBmcm9tIGBnZXRvcHQnIHRvIHRoZSBjYWxsZXIuCisgICBXaGVuIGBnZXRvcHQnIGZpbmRzIGFuIG9wdGlvbiB0aGF0IHRha2VzIGFuIGFyZ3VtZW50LAorICAgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGhlcmUuCisgICBBbHNvLCB3aGVuIGBvcmRlcmluZycgaXMgUkVUVVJOX0lOX09SREVSLAorICAgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudCBpcyByZXR1cm5lZCBoZXJlLiAgKi8KKworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworLyogSW5kZXggaW4gQVJHViBvZiB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIHNjYW5uZWQuCisgICBUaGlzIGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gdG8gYW5kIGZyb20gdGhlIGNhbGxlcgorICAgYW5kIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gc3VjY2Vzc2l2ZSBjYWxscyB0byBgZ2V0b3B0Jy4KKworICAgT24gZW50cnkgdG8gYGdldG9wdCcsIHplcm8gbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbDsgaW5pdGlhbGl6ZS4KKworICAgV2hlbiBgZ2V0b3B0JyByZXR1cm5zIC0xLCB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2YgdGhlCisgICBub24tb3B0aW9uIGVsZW1lbnRzIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgaXRzZWxmIHNjYW4uCisKKyAgIE90aGVyd2lzZSwgYG9wdGluZCcgY29tbXVuaWNhdGVzIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQKKyAgIGhvdyBtdWNoIG9mIEFSR1YgaGFzIGJlZW4gc2Nhbm5lZCBzbyBmYXIuICAqLworCitleHRlcm4gaW50IG9wdGluZDsKKworLyogQ2FsbGVycyBzdG9yZSB6ZXJvIGhlcmUgdG8gaW5oaWJpdCB0aGUgZXJyb3IgbWVzc2FnZSBgZ2V0b3B0JyBwcmludHMKKyAgIGZvciB1bnJlY29nbml6ZWQgb3B0aW9ucy4gICovCisKK2V4dGVybiBpbnQgb3B0ZXJyOworCisvKiBTZXQgdG8gYW4gb3B0aW9uIGNoYXJhY3RlciB3aGljaCB3YXMgdW5yZWNvZ25pemVkLiAgKi8KKworZXh0ZXJuIGludCBvcHRvcHQ7CisKKyNpZm5kZWYgX19uZWVkX2dldG9wdAorLyogRGVzY3JpYmUgdGhlIGxvbmctbmFtZWQgb3B0aW9ucyByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhlIExPTkdfT1BUSU9OUyBhcmd1bWVudCB0byBnZXRvcHRfbG9uZyBvciBnZXRvcHRfbG9uZ19vbmx5IGlzIGEgdmVjdG9yCisgICBvZiBgc3RydWN0IG9wdGlvbicgdGVybWluYXRlZCBieSBhbiBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIHdoaWNoIGlzCisgICB6ZXJvLgorCisgICBUaGUgZmllbGQgYGhhc19hcmcnIGlzOgorICAgbm9fYXJndW1lbnQJCShvciAwKSBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IHRha2UgYW4gYXJndW1lbnQsCisgICByZXF1aXJlZF9hcmd1bWVudAkob3IgMSkgaWYgdGhlIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCwKKyAgIG9wdGlvbmFsX2FyZ3VtZW50IAkob3IgMikgaWYgdGhlIG9wdGlvbiB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KKworICAgSWYgdGhlIGZpZWxkIGBmbGFnJyBpcyBub3QgTlVMTCwgaXQgcG9pbnRzIHRvIGEgdmFyaWFibGUgdGhhdCBpcyBzZXQKKyAgIHRvIHRoZSB2YWx1ZSBnaXZlbiBpbiB0aGUgZmllbGQgYHZhbCcgd2hlbiB0aGUgb3B0aW9uIGlzIGZvdW5kLCBidXQKKyAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZSBvcHRpb24gaXMgbm90IGZvdW5kLgorCisgICBUbyBoYXZlIGEgbG9uZy1uYW1lZCBvcHRpb24gZG8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2V0IGFuIGBpbnQnIHRvCisgICBhIGNvbXBpbGVkLWluIGNvbnN0YW50LCBzdWNoIGFzIHNldCBhIHZhbHVlIGZyb20gYG9wdGFyZycsIHNldCB0aGUKKyAgIG9wdGlvbidzIGBmbGFnJyBmaWVsZCB0byB6ZXJvIGFuZCBpdHMgYHZhbCcgZmllbGQgdG8gYSBub256ZXJvCisgICB2YWx1ZSAodGhlIGVxdWl2YWxlbnQgc2luZ2xlLWxldHRlciBvcHRpb24gY2hhcmFjdGVyLCBpZiB0aGVyZSBpcworICAgb25lKS4gIEZvciBsb25nIG9wdGlvbnMgdGhhdCBoYXZlIGEgemVybyBgZmxhZycgZmllbGQsIGBnZXRvcHQnCisgICByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgYHZhbCcgZmllbGQuICAqLworCitzdHJ1Y3Qgb3B0aW9uCit7CisgIGNvbnN0IGNoYXIgKm5hbWU7CisgIC8qIGhhc19hcmcgY2FuJ3QgYmUgYW4gZW51bSBiZWNhdXNlIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIGFib3V0CisgICAgIHR5cGUgbWlzbWF0Y2hlcyBpbiBhbGwgdGhlIGNvZGUgdGhhdCBhc3N1bWVzIGl0IGlzIGFuIGludC4gICovCisgIGludCBoYXNfYXJnOworICBpbnQgKmZsYWc7CisgIGludCB2YWw7Cit9OworCisvKiBOYW1lcyBmb3IgdGhlIHZhbHVlcyBvZiB0aGUgYGhhc19hcmcnIGZpZWxkIG9mIGBzdHJ1Y3Qgb3B0aW9uJy4gICovCisKKyMgZGVmaW5lIG5vX2FyZ3VtZW50CQkwCisjIGRlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCisjIGRlZmluZSBvcHRpb25hbF9hcmd1bWVudAkyCisjZW5kaWYJLyogbmVlZCBnZXRvcHQgKi8KKworCisvKiBHZXQgZGVmaW5pdGlvbnMgYW5kIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyB0byBwcm9jZXNzIHRoZQorICAgYXJndW1lbnRzIGluIEFSR1YgKEFSR0Mgb2YgdGhlbSwgbWludXMgdGhlIHByb2dyYW0gbmFtZSkgZm9yCisgICBvcHRpb25zIGdpdmVuIGluIE9QVFMuCisKKyAgIFJldHVybiB0aGUgb3B0aW9uIGNoYXJhY3RlciBmcm9tIE9QVFMganVzdCByZWFkLiAgUmV0dXJuIC0xIHdoZW4KKyAgIHRoZXJlIGFyZSBubyBtb3JlIG9wdGlvbnMuICBGb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMsIG9yIG9wdGlvbnMKKyAgIG1pc3NpbmcgYXJndW1lbnRzLCBgb3B0b3B0JyBpcyBzZXQgdG8gdGhlIG9wdGlvbiBsZXR0ZXIsIGFuZCAnPycgaXMKKyAgIHJldHVybmVkLgorCisgICBUaGUgT1BUUyBzdHJpbmcgaXMgYSBsaXN0IG9mIGNoYXJhY3RlcnMgd2hpY2ggYXJlIHJlY29nbml6ZWQgb3B0aW9uCisgICBsZXR0ZXJzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGNvbG9ucywgc3BlY2lmeWluZyB0aGF0IHRoYXQgbGV0dGVyCisgICB0YWtlcyBhbiBhcmd1bWVudCwgdG8gYmUgcGxhY2VkIGluIGBvcHRhcmcnLgorCisgICBJZiBhIGxldHRlciBpbiBPUFRTIGlzIGZvbGxvd2VkIGJ5IHR3byBjb2xvbnMsIGl0cyBhcmd1bWVudCBpcworICAgb3B0aW9uYWwuICBUaGlzIGJlaGF2aW9yIGlzIHNwZWNpZmljIHRvIHRoZSBHTlUgYGdldG9wdCcuCisKKyAgIFRoZSBhcmd1bWVudCBgLS0nIGNhdXNlcyBwcmVtYXR1cmUgdGVybWluYXRpb24gb2YgYXJndW1lbnQKKyAgIHNjYW5uaW5nLCBleHBsaWNpdGx5IHRlbGxpbmcgYGdldG9wdCcgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZQorICAgb3B0aW9ucy4KKworICAgSWYgT1BUUyBiZWdpbnMgd2l0aCBgLS0nLCB0aGVuIG5vbi1vcHRpb24gYXJndW1lbnRzIGFyZSB0cmVhdGVkIGFzCisgICBhcmd1bWVudHMgdG8gdGhlIG9wdGlvbiAnXDAnLiAgVGhpcyBiZWhhdmlvciBpcyBzcGVjaWZpYyB0byB0aGUgR05VCisgICBgZ2V0b3B0Jy4gICovCisKKyNpZmRlZiBfX0dOVV9MSUJSQVJZX18KKy8qIE1hbnkgb3RoZXIgbGlicmFyaWVzIGhhdmUgY29uZmxpY3RpbmcgcHJvdG90eXBlcyBmb3IgZ2V0b3B0LCB3aXRoCisgICBkaWZmZXJlbmNlcyBpbiB0aGUgY29uc3RzLCBpbiBzdGRsaWIuaC4gIFRvIGF2b2lkIGNvbXBpbGF0aW9uCisgICBlcnJvcnMsIG9ubHkgcHJvdG90eXBlIGdldG9wdCBmb3IgdGhlIEdOVSBDIGxpYnJhcnkuICAqLworZXh0ZXJuIGludCBnZXRvcHQgKGludCBfX19hcmdjLCBjaGFyICpjb25zdCAqX19fYXJndiwgY29uc3QgY2hhciAqX19zaG9ydG9wdHMpCisgICAgICAgX19USFJPVzsKKyNlbHNlIC8qIG5vdCBfX0dOVV9MSUJSQVJZX18gKi8KK2V4dGVybiBpbnQgZ2V0b3B0ICgpOworI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLworCisjaWZuZGVmIF9fbmVlZF9nZXRvcHQKK2V4dGVybiBpbnQgZ2V0b3B0X2xvbmcgKGludCBfX19hcmdjLCBjaGFyICpjb25zdCAqX19fYXJndiwKKwkJCWNvbnN0IGNoYXIgKl9fc2hvcnRvcHRzLAorCQkgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKl9fbG9uZ29wdHMsIGludCAqX19sb25naW5kKQorICAgICAgIF9fVEhST1c7CitleHRlcm4gaW50IGdldG9wdF9sb25nX29ubHkgKGludCBfX19hcmdjLCBjaGFyICpjb25zdCAqX19fYXJndiwKKwkJCSAgICAgY29uc3QgY2hhciAqX19zaG9ydG9wdHMsCisJCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpfX2xvbmdvcHRzLCBpbnQgKl9fbG9uZ2luZCkKKyAgICAgICBfX1RIUk9XOworCisjZW5kaWYKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyogTWFrZSBzdXJlIHdlIGxhdGVyIGNhbiBnZXQgYWxsIHRoZSBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zLiAgKi8KKyN1bmRlZiBfX25lZWRfZ2V0b3B0CisKKyNlbmRpZiAvKiBnZXRvcHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9nbG9iLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2dsb2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQwMWYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbG9iLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSw5Miw5NS05OCwyMDAwLDIwMDEsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfR0xPQl9ICisjZGVmaW5lCV9HTE9CX0gJMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogV2UgbmVlZCBgc2l6ZV90JyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucy4gICovCisjaWZuZGVmIF9fc2l6ZV90CisjIGlmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgordHlwZWRlZiBfX1NJWkVfVFlQRV9fIF9fc2l6ZV90OworIyAgaWZkZWYgX19VU0VfWE9QRU4KK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7CisjICBlbmRpZgorIyBlbHNlCisjICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGlmbmRlZiBfX3NpemVfdAorIyAgIGRlZmluZSBfX3NpemVfdCBzaXplX3QKKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorLyogVGhlIEdOVSBDQyBzdGRkZWYuaCB2ZXJzaW9uIGRlZmluZXMgX19zaXplX3QgYXMgZW1wdHkuICBXZSBuZWVkIGEgcmVhbAorICAgZGVmaW5pdGlvbi4gICovCisjIHVuZGVmIF9fc2l6ZV90CisjIGRlZmluZSBfX3NpemVfdCBzaXplX3QKKyNlbmRpZgorCisvKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGdsb2InLiAgKi8KKyNkZWZpbmUJR0xPQl9FUlIJKDEgPDwgMCkvKiBSZXR1cm4gb24gcmVhZCBlcnJvcnMuICAqLworI2RlZmluZQlHTE9CX01BUksJKDEgPDwgMSkvKiBBcHBlbmQgYSBzbGFzaCB0byBlYWNoIG5hbWUuICAqLworI2RlZmluZQlHTE9CX05PU09SVAkoMSA8PCAyKS8qIERvbid0IHNvcnQgdGhlIG5hbWVzLiAgKi8KKyNkZWZpbmUJR0xPQl9ET09GRlMJKDEgPDwgMykvKiBJbnNlcnQgUEdMT0ItPmdsX29mZnMgTlVMTHMuICAqLworI2RlZmluZQlHTE9CX05PQ0hFQ0sJKDEgPDwgNCkvKiBJZiBub3RoaW5nIG1hdGNoZXMsIHJldHVybiB0aGUgcGF0dGVybi4gICovCisjZGVmaW5lCUdMT0JfQVBQRU5ECSgxIDw8IDUpLyogQXBwZW5kIHRvIHJlc3VsdHMgb2YgYSBwcmV2aW91cyBjYWxsLiAgKi8KKyNkZWZpbmUJR0xPQl9OT0VTQ0FQRQkoMSA8PCA2KS8qIEJhY2tzbGFzaGVzIGRvbid0IHF1b3RlIG1ldGFjaGFyYWN0ZXJzLiAgKi8KKyNkZWZpbmUJR0xPQl9QRVJJT0QJKDEgPDwgNykvKiBMZWFkaW5nIGAuJyBjYW4gYmUgbWF0Y2hlZCBieSBtZXRhY2hhcnMuICAqLworCisjaWYgIWRlZmluZWQgX19VU0VfUE9TSVgyIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZSBHTE9CX01BR0NIQVIJICgxIDw8IDgpLyogU2V0IGluIGdsX2ZsYWdzIGlmIGFueSBtZXRhY2hhcnMgc2Vlbi4gICovCisjIGRlZmluZSBHTE9CX0FMVERJUkZVTkMgKDEgPDwgOSkvKiBVc2UgZ2xfb3BlbmRpciBldCBhbCBmdW5jdGlvbnMuICAqLworIyBkZWZpbmUgR0xPQl9CUkFDRQkgKDEgPDwgMTApLyogRXhwYW5kICJ7YSxifSIgdG8gImEiICJiIi4gICovCisjIGRlZmluZSBHTE9CX05PTUFHSUMJICgxIDw8IDExKS8qIElmIG5vIG1hZ2ljIGNoYXJzLCByZXR1cm4gdGhlIHBhdHRlcm4uICAqLworIyBkZWZpbmUgR0xPQl9USUxERQkgKDEgPDwgMTIpLyogRXhwYW5kIH51c2VyIGFuZCB+IHRvIGhvbWUgZGlyZWN0b3JpZXMuICovCisjIGRlZmluZSBHTE9CX09OTFlESVIJICgxIDw8IDEzKS8qIE1hdGNoIG9ubHkgZGlyZWN0b3JpZXMuICAqLworIyBkZWZpbmUgR0xPQl9USUxERV9DSEVDSyAoMSA8PCAxNCkvKiBMaWtlIEdMT0JfVElMREUgYnV0IHJldHVybiBhbiBlcnJvcgorCQkJCSAgICAgIGlmIHRoZSB1c2VyIG5hbWUgaXMgbm90IGF2YWlsYWJsZS4gICovCisjIGRlZmluZSBfX0dMT0JfRkxBR1MJKEdMT0JfRVJSfEdMT0JfTUFSS3xHTE9CX05PU09SVHxHTE9CX0RPT0ZGU3wgXAorCQkJIEdMT0JfTk9FU0NBUEV8R0xPQl9OT0NIRUNLfEdMT0JfQVBQRU5EfCAgICAgXAorCQkJIEdMT0JfUEVSSU9EfEdMT0JfQUxURElSRlVOQ3xHTE9CX0JSQUNFfCAgICAgXAorCQkJIEdMT0JfTk9NQUdJQ3xHTE9CX1RJTERFfEdMT0JfT05MWURJUnxHTE9CX1RJTERFX0NIRUNLKQorI2Vsc2UKKyMgZGVmaW5lIF9fR0xPQl9GTEFHUwkoR0xPQl9FUlJ8R0xPQl9NQVJLfEdMT0JfTk9TT1JUfEdMT0JfRE9PRkZTfCBcCisJCQkgR0xPQl9OT0VTQ0FQRXxHTE9CX05PQ0hFQ0t8R0xPQl9BUFBFTkR8ICAgICBcCisJCQkgR0xPQl9QRVJJT0QpCisjZW5kaWYKKworLyogRXJyb3IgcmV0dXJucyBmcm9tIGBnbG9iJy4gICovCisjZGVmaW5lCUdMT0JfTk9TUEFDRQkxCS8qIFJhbiBvdXQgb2YgbWVtb3J5LiAgKi8KKyNkZWZpbmUJR0xPQl9BQk9SVEVECTIJLyogUmVhZCBlcnJvci4gICovCisjZGVmaW5lCUdMT0JfTk9NQVRDSAkzCS8qIE5vIG1hdGNoZXMgZm91bmQuICAqLworI2RlZmluZSBHTE9CX05PU1lTCTQJLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZmlsZSBkZWZpbmVkIEdMT0JfQUJFTkQgaW5zdGVhZCBvZgorICAgR0xPQl9BQk9SVEVELiAgUHJvdmlkZSBhIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbiBoZXJlLiAgKi8KKyMgZGVmaW5lIEdMT0JfQUJFTkQgR0xPQl9BQk9SVEVECisjZW5kaWYKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBnbG9iYmluZyBydW4uICAqLworI2lmZGVmIF9fVVNFX0dOVQorc3RydWN0IHN0YXQ7CisjZW5kaWYKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBfX3NpemVfdCBnbF9wYXRoYzsJCS8qIENvdW50IG9mIHBhdGhzIG1hdGNoZWQgYnkgdGhlIHBhdHRlcm4uICAqLworICAgIGNoYXIgKipnbF9wYXRodjsJCS8qIExpc3Qgb2YgbWF0Y2hlZCBwYXRobmFtZXMuICAqLworICAgIF9fc2l6ZV90IGdsX29mZnM7CQkvKiBTbG90cyB0byByZXNlcnZlIGluIGBnbF9wYXRodicuICAqLworICAgIGludCBnbF9mbGFnczsJCS8qIFNldCB0byBGTEFHUywgbWF5YmUgfCBHTE9CX01BR0NIQVIuICAqLworCisgICAgLyogSWYgdGhlIEdMT0JfQUxURElSRlVOQyBmbGFnIGlzIHNldCwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKyAgICAgICBhcmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zLiAgKi8KKyAgICB2b2lkICgqZ2xfY2xvc2VkaXIpICh2b2lkICopOworI2lmZGVmIF9fVVNFX0dOVQorICAgIHN0cnVjdCBkaXJlbnQgKigqZ2xfcmVhZGRpcikgKHZvaWQgKik7CisjZWxzZQorICAgIHZvaWQgKigqZ2xfcmVhZGRpcikgKHZvaWQgKik7CisjZW5kaWYKKyAgICB2b2lkICooKmdsX29wZW5kaXIpIChfX2NvbnN0IGNoYXIgKik7CisjaWZkZWYgX19VU0VfR05VCisgICAgaW50ICgqZ2xfbHN0YXQpIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QsIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0KTsKKyAgICBpbnQgKCpnbF9zdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCk7CisjZWxzZQorICAgIGludCAoKmdsX2xzdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCB2b2lkICpfX3Jlc3RyaWN0KTsKKyAgICBpbnQgKCpnbF9zdGF0KSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0LCB2b2lkICpfX3Jlc3RyaWN0KTsKKyNlbmRpZgorICB9IGdsb2JfdDsKKworI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CisjIGlmZGVmIF9fVVNFX0dOVQorc3RydWN0IHN0YXQ2NDsKKyMgZW5kaWYKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBfX3NpemVfdCBnbF9wYXRoYzsKKyAgICBjaGFyICoqZ2xfcGF0aHY7CisgICAgX19zaXplX3QgZ2xfb2ZmczsKKyAgICBpbnQgZ2xfZmxhZ3M7CisKKyAgICAvKiBJZiB0aGUgR0xPQl9BTFRESVJGVU5DIGZsYWcgaXMgc2V0LCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucworICAgICAgIGFyZSB1c2VkIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMuICAqLworICAgIHZvaWQgKCpnbF9jbG9zZWRpcikgKHZvaWQgKik7CisjIGlmZGVmIF9fVVNFX0dOVQorICAgIHN0cnVjdCBkaXJlbnQ2NCAqKCpnbF9yZWFkZGlyKSAodm9pZCAqKTsKKyMgZWxzZQorICAgIHZvaWQgKigqZ2xfcmVhZGRpcikgKHZvaWQgKik7CisjIGVuZGlmCisgICAgdm9pZCAqKCpnbF9vcGVuZGlyKSAoX19jb25zdCBjaGFyICopOworIyBpZmRlZiBfX1VTRV9HTlUKKyAgICBpbnQgKCpnbF9sc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCk7CisgICAgaW50ICgqZ2xfc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCk7CisjIGVsc2UKKyAgICBpbnQgKCpnbF9sc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgdm9pZCAqX19yZXN0cmljdCk7CisgICAgaW50ICgqZ2xfc3RhdCkgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCwgdm9pZCAqX19yZXN0cmljdCk7CisjIGVuZGlmCisgIH0gZ2xvYjY0X3Q7CisjZW5kaWYKKworI2lmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgJiYgX19HTlVDX18gPCAyCisjIGRlZmluZSBnbG9iIGdsb2I2NAorIyBkZWZpbmUgZ2xvYmZyZWUgZ2xvYmZyZWU2NAorI2VuZGlmCisKKy8qIERvIGdsb2Igc2VhcmNoaW5nIGZvciBQQVRURVJOLCBwbGFjaW5nIHJlc3VsdHMgaW4gUEdMT0IuCisgICBUaGUgYml0cyBkZWZpbmVkIGFib3ZlIG1heSBiZSBzZXQgaW4gRkxBR1MuCisgICBJZiBhIGRpcmVjdG9yeSBjYW5ub3QgYmUgb3BlbmVkIG9yIHJlYWQgYW5kIEVSUkZVTkMgaXMgbm90IG5pbCwKKyAgIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBwYXRobmFtZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IsIGFuZCB0aGUKKyAgIGBlcnJubycgdmFsdWUgZnJvbSB0aGUgZmFpbGluZyBjYWxsOyBpZiBpdCByZXR1cm5zIG5vbi16ZXJvCisgICBgZ2xvYicgcmV0dXJucyBHTE9CX0FCRU5EOyBpZiBpdCByZXR1cm5zIHplcm8sIHRoZSBlcnJvciBpcyBpZ25vcmVkLgorICAgSWYgbWVtb3J5IGNhbm5vdCBiZSBhbGxvY2F0ZWQgZm9yIFBHTE9CLCBHTE9CX05PU1BBQ0UgaXMgcmV0dXJuZWQuCisgICBPdGhlcndpc2UsIGBnbG9iJyByZXR1cm5zIHplcm8uICAqLworI2lmICFkZWZpbmVkIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgfHwgX19HTlVDX18gPCAyCitleHRlcm4gaW50IGdsb2IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sIGludCBfX2ZsYWdzLAorCQkgaW50ICgqX19lcnJmdW5jKSAoX19jb25zdCBjaGFyICosIGludCksCisJCSBnbG9iX3QgKl9fcmVzdHJpY3QgX19wZ2xvYikgX19USFJPVzsKKworLyogRnJlZSBzdG9yYWdlIGFsbG9jYXRlZCBpbiBQR0xPQiBieSBhIHByZXZpb3VzIGBnbG9iJyBjYWxsLiAgKi8KK2V4dGVybiB2b2lkIGdsb2JmcmVlIChnbG9iX3QgKl9fcGdsb2IpIF9fVEhST1c7CisjZWxzZQorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZ2xvYiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sCisJCQkJICBpbnQgX19mbGFncywKKwkJCQkgIGludCAoKl9fZXJyZnVuYykgKF9fY29uc3QgY2hhciAqLCBpbnQpLAorCQkJCSAgZ2xvYl90ICpfX3Jlc3RyaWN0IF9fcGdsb2IpLCBnbG9iNjQpOworCitleHRlcm4gdm9pZCBfX1JFRElSRUNUX05USCAoZ2xvYmZyZWUsIChnbG9iX3QgKl9fcGdsb2IpLCBnbG9iZnJlZTY0KTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZ2xvYjY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXR0ZXJuLCBpbnQgX19mbGFncywKKwkJICAgaW50ICgqX19lcnJmdW5jKSAoX19jb25zdCBjaGFyICosIGludCksCisJCSAgIGdsb2I2NF90ICpfX3Jlc3RyaWN0IF9fcGdsb2IpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkIGdsb2JmcmVlNjQgKGdsb2I2NF90ICpfX3BnbG9iKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmV0dXJuIG5vbnplcm8gaWYgUEFUVEVSTiBjb250YWlucyBhbnkgbWV0YWNoYXJhY3RlcnMuCisgICBNZXRhY2hhcmFjdGVycyBjYW4gYmUgcXVvdGVkIHdpdGggYmFja3NsYXNoZXMgaWYgUVVPVEUgaXMgbm9uemVyby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHNwZWNpZmllZCBieSBQT1NJWC4yCisgICBidXQgc2V2ZXJhbCBwcm9ncmFtcyB3YW50IHRvIHVzZSBpdC4gICovCitleHRlcm4gaW50IGdsb2JfcGF0dGVybl9wIChfX2NvbnN0IGNoYXIgKl9fcGF0dGVybiwgaW50IF9fcXVvdGUpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGdsb2IuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251LXZlcnNpb25zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2dudS12ZXJzaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTYxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2dudS12ZXJzaW9ucy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIEhlYWRlciB3aXRoIGludGVyZmFjZSB2ZXJzaW9uIG1hY3JvcyBmb3IgbGlicmFyeSBwaWVjZXMgY29waWVkIGVsc2V3aGVyZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfR05VX1ZFUlNJT05TX0gKKyNkZWZpbmUJX0dOVV9WRVJTSU9OU19ICTEKKworLyogVGhpcyBmaWxlIGV4aXN0cyB0byBkZWZpbmUgdGhlc2UgZmV3IG1hY3Jvcy4gIEVhY2ggc3BlY2lmaWVzIGEgdmVyc2lvbgorICAgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGlicmFyeSBpbnRlcmZhY2Ugb2YgYSBwaWVjZSBvZiB0aGUgQyBsaWJyYXJ5CisgICB3aGljaCBpcyBhbHNvIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgR05VIHBhY2thZ2VzLiAgVGhlc2UgcGllY2VzIGFyZQorICAgYm90aCBwYXJ0IG9mIHRoZSBHTlUgQyBsaWJyYXJ5IGFuZCBhbHNvIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgR05VCisgICBwYWNrYWdlcyBzbyB0aG9zZSBwYWNrYWdlcyBtYXkgdXNlIHRoZWlyIGZhY2lsaXRpZXMgb24gc3lzdGVtcyBsYWNraW5nCisgICB0aGUgR05VIEMgbGlicmFyeS4gIFRoZSBzb3VyY2UgZmlsZXMgZm9yIGVhY2ggcGllY2Ugc3Vycm91bmQgYWxsIHRoZWlyCisgICBjb2RlIHdpdGggYCNpZm5kZWYgRUxJREVfQ09ERScgYWZ0ZXIgZGVmaW5pbmcgaXQgd2l0aCB0aGlzOgorCisgICAjZGVmaW5lIE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04gMQorICAgI2lmICFkZWZpbmVkIChfTElCQykgJiYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCisgICAjaW5jbHVkZSA8Z251LXZlcnNpb25zLmg+CisgICAjaWYgX0dOVV9PQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OID09IE9CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04KKyAgICNkZWZpbmUgRUxJREVfQ09ERQorICAgI2VuZGlmCisgICAjZW5kaWYKKworICAgVGhpcyBhbGxvd3MgdGhvc2Ugb25lIHRvIGF2b2lkIGNvbXBpbGluZyB0aG9zZSBmaWxlcyB3aGVuIHBhcnQgb2YgYSBHTlUKKyAgIHBhY2thZ2Ugbm90IGxpYmMsIG9uIGEgc3lzdGVtIHVzaW5nIGEgR05VIEMgbGlicmFyeSB0aGF0IHN1cHBvcnRzIHRoZQorICAgc2FtZSBpbnRlcmZhY2UuCisKKyAgIFBsZWFzZSBwcmVzZXJ2ZSB0aGUgZm9ybWF0IG9mIHRoZSBjb21tZW50cyBhZnRlciBlYWNoIG1hY3JvLiAgQW5kCisgICByZW1lbWJlciwgaWYgYW55IG9mIHRoZXNlIHZlcnNpb25zIGNoYW5nZSwgdGhlIGxpYmMuc28gbWFqb3IgdmVyc2lvbgorICAgbnVtYmVyIG11c3QgY2hhbmdlIHRvbyAoc28gYXZvaWQgaXQpISAgKi8KKworI2RlZmluZSBfR05VX09CU1RBQ0tfSU5URVJGQUNFX1ZFUlNJT04JMSAvKiB2cyBtYWxsb2Mvb2JzdGFjay5jICovCisjZGVmaW5lIF9HTlVfUkVHRVhfSU5URVJGQUNFX1ZFUlNJT04JMSAvKiB2cyBwb3NpeC9yZWdleC5jICovCisjZGVmaW5lIF9HTlVfR0xPQl9JTlRFUkZBQ0VfVkVSU0lPTgkxIC8qIHZzIHBvc2l4L2dsb2IuYyAqLworI2RlZmluZSBfR05VX0dFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgkyIC8qIHZzIHBvc2l4L2dldG9wdC5jIGFuZAorCQkJCQkgICAgIHBvc2l4L2dldG9wdDEuYyAqLworCisjZW5kaWYJLyogZ251LXZlcnNpb25zLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251L2xpYi1uYW1lcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUvbGliLW5hbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMTBlZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251L2xpYi1uYW1lcy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4KKyAgIEl0IGRlZmluZXMgbWFjcm9zIHRvIGFsbG93IHVzZXIgcHJvZ3JhbSB0byBmaW5kIHRoZSBzaGFyZWQKKyAgIGxpYnJhcnkgZmlsZXMgd2hpY2ggY29tZSBhcyBwYXJ0IG9mIEdOVSBsaWJjLiAgKi8KKyNpZm5kZWYgX19HTlVfTElCX05BTUVTX0gKKyNkZWZpbmUgX19HTlVfTElCX05BTUVTX0gJMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisjaWYgX19XT1JEU0laRSA9PSAzMgorIyBkZWZpbmUgTERfTElOVVhfU08gICAgICAgICAgICAgICAgICAgICJsZC1saW51eC5zby4yIgorIyBkZWZpbmUgTERfU08gICAgICAgICAgICAgICAgICAgICAgICAgICJsZC1saW51eC5zby4yIgorIyBkZWZpbmUgTElCQU5MX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJhbmwuc28uMSIKKyMgZGVmaW5lIExJQkJST0tFTkxPQ0FMRV9TTyAgICAgICAgICAgICAibGliQnJva2VuTG9jYWxlLnNvLjEiCisjIGRlZmluZSBMSUJDSUROX1NPICAgICAgICAgICAgICAgICAgICAgImxpYmNpZG4uc28uMSIKKyMgZGVmaW5lIExJQkNSWVBUX1NPICAgICAgICAgICAgICAgICAgICAibGliY3J5cHQuc28uMSIKKyMgZGVmaW5lIExJQkNfU08gICAgICAgICAgICAgICAgICAgICAgICAibGliYy5zby42IgorIyBkZWZpbmUgTElCRExfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJkbC5zby4yIgorIyBkZWZpbmUgTElCTV9TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJtLnNvLjYiCisjIGRlZmluZSBMSUJOU0xfU08gICAgICAgICAgICAgICAgICAgICAgImxpYm5zbC5zby4xIgorIyBkZWZpbmUgTElCTlNTX0NPTVBBVF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfY29tcGF0LnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRE5TX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19kbnMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19GSUxFU19TTyAgICAgICAgICAgICAgICAibGlibnNzX2ZpbGVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfSEVTSU9EX1NPICAgICAgICAgICAgICAgImxpYm5zc19oZXNpb2Quc28uMiIKKyMgZGVmaW5lIExJQk5TU19MREFQX1NPICAgICAgICAgICAgICAgICAibGlibnNzX2xkYXAuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNQTFVTX1NPICAgICAgICAgICAgICAibGlibnNzX25pc3BsdXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX25pcy5zby4yIgorIyBkZWZpbmUgTElCUFRIUkVBRF9TTyAgICAgICAgICAgICAgICAgICJsaWJwdGhyZWFkLnNvLjAiCisjIGRlZmluZSBMSUJSRVNPTFZfU08gICAgICAgICAgICAgICAgICAgImxpYnJlc29sdi5zby4yIgorIyBkZWZpbmUgTElCUlRfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJydC5zby4xIgorIyBkZWZpbmUgTElCVEhSRUFEX0RCX1NPICAgICAgICAgICAgICAgICJsaWJ0aHJlYWRfZGIuc28uMSIKKyMgZGVmaW5lIExJQlVUSUxfU08gICAgICAgICAgICAgICAgICAgICAibGlidXRpbC5zby4xIgorI2Vsc2UKKyMgZGVmaW5lIExEX0xJTlVYX1g4Nl82NF9TTyAgICAgICAgICAgICAibGQtbGludXgteDg2LTY0LnNvLjIiCisjIGRlZmluZSBMRF9TTyAgICAgICAgICAgICAgICAgICAgICAgICAgImxkLWxpbnV4LXg4Ni02NC5zby4yIgorIyBkZWZpbmUgTElCQU5MX1NPICAgICAgICAgICAgICAgICAgICAgICJsaWJhbmwuc28uMSIKKyMgZGVmaW5lIExJQkJST0tFTkxPQ0FMRV9TTyAgICAgICAgICAgICAibGliQnJva2VuTG9jYWxlLnNvLjEiCisjIGRlZmluZSBMSUJDSUROX1NPICAgICAgICAgICAgICAgICAgICAgImxpYmNpZG4uc28uMSIKKyMgZGVmaW5lIExJQkNSWVBUX1NPICAgICAgICAgICAgICAgICAgICAibGliY3J5cHQuc28uMSIKKyMgZGVmaW5lIExJQkNfU08gICAgICAgICAgICAgICAgICAgICAgICAibGliYy5zby42IgorIyBkZWZpbmUgTElCRExfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJkbC5zby4yIgorIyBkZWZpbmUgTElCTV9TTyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJtLnNvLjYiCisjIGRlZmluZSBMSUJOU0xfU08gICAgICAgICAgICAgICAgICAgICAgImxpYm5zbC5zby4xIgorIyBkZWZpbmUgTElCTlNTX0NPTVBBVF9TTyAgICAgICAgICAgICAgICJsaWJuc3NfY29tcGF0LnNvLjIiCisjIGRlZmluZSBMSUJOU1NfRE5TX1NPICAgICAgICAgICAgICAgICAgImxpYm5zc19kbnMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19GSUxFU19TTyAgICAgICAgICAgICAgICAibGlibnNzX2ZpbGVzLnNvLjIiCisjIGRlZmluZSBMSUJOU1NfSEVTSU9EX1NPICAgICAgICAgICAgICAgImxpYm5zc19oZXNpb2Quc28uMiIKKyMgZGVmaW5lIExJQk5TU19MREFQX1NPICAgICAgICAgICAgICAgICAibGlibnNzX2xkYXAuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNQTFVTX1NPICAgICAgICAgICAgICAibGlibnNzX25pc3BsdXMuc28uMiIKKyMgZGVmaW5lIExJQk5TU19OSVNfU08gICAgICAgICAgICAgICAgICAibGlibnNzX25pcy5zby4yIgorIyBkZWZpbmUgTElCUFRIUkVBRF9TTyAgICAgICAgICAgICAgICAgICJsaWJwdGhyZWFkLnNvLjAiCisjIGRlZmluZSBMSUJSRVNPTFZfU08gICAgICAgICAgICAgICAgICAgImxpYnJlc29sdi5zby4yIgorIyBkZWZpbmUgTElCUlRfU08gICAgICAgICAgICAgICAgICAgICAgICJsaWJydC5zby4xIgorIyBkZWZpbmUgTElCVEhSRUFEX0RCX1NPICAgICAgICAgICAgICAgICJsaWJ0aHJlYWRfZGIuc28uMSIKKyMgZGVmaW5lIExJQlVUSUxfU08gICAgICAgICAgICAgICAgICAgICAibGlidXRpbC5zby4xIgorI2VuZGlmCisKKyNlbmRpZgkvKiBnbnUvbGliLW5hbWVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251L2xpYmMtdmVyc2lvbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUvbGliYy12ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNzFmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvZ251L2xpYmMtdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIEludGVyZmFjZSB0byBHTlUgbGliYyBzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIHZlcnNpb24gaW5mb3JtYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0dOVV9MSUJDX1ZFUlNJT05fSAorI2RlZmluZQlfR05VX0xJQkNfVkVSU0lPTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIHN0cmluZyBkZXNjcmliaW5nIHJlbGVhc2Ugc3RhdHVzIG9mIGN1cnJlbnRseSBydW5uaW5nIEdOVSBsaWJjLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpnbnVfZ2V0X2xpYmNfcmVsZWFzZSAodm9pZCkgX19USFJPVzsKKworLyogUmV0dXJuIHN0cmluZyBkZXNjcmliaW5nIHZlcnNpb24gb2YgY3VycmVudGx5IHJ1bm5pbmcgR05VIGxpYmMuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmdudV9nZXRfbGliY192ZXJzaW9uICh2b2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogZ251L2xpYmMtdmVyc2lvbi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2dudS9zdHVicy02NC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUvc3R1YnMtNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmU0ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUvc3R1YnMtNjQuaApAQCAtMCwwICsxLDIzIEBACisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuCisgICBJdCBkZWZpbmVzIGEgc3ltYm9sIGBfX3N0dWJfRlVOQ1RJT04nIGZvciBlYWNoIGZ1bmN0aW9uCisgICBpbiB0aGUgQyBsaWJyYXJ5IHdoaWNoIGlzIGEgc3R1YiwgbWVhbmluZyBpdCB3aWxsIGZhaWwKKyAgIGV2ZXJ5IHRpbWUgY2FsbGVkLCB1c3VhbGx5IHNldHRpbmcgZXJybm8gdG8gRU5PU1lTLiAgKi8KKworI2lmZGVmIF9MSUJDCisjIGVycm9yIEFwcGxpY2F0aW9ucyBtYXkgbm90IGRlZmluZSB0aGUgbWFjcm8gX0xJQkMKKyNlbmRpZgorCisjZGVmaW5lIF9fc3R1Yl9iZGZsdXNoCisjZGVmaW5lIF9fc3R1Yl9jaGZsYWdzCisjZGVmaW5lIF9fc3R1Yl9mYXR0YWNoCisjZGVmaW5lIF9fc3R1Yl9mY2hmbGFncworI2RlZmluZSBfX3N0dWJfZmRldGFjaAorI2RlZmluZSBfX3N0dWJfZ2V0bXNnCisjZGVmaW5lIF9fc3R1Yl9ndHR5CisjZGVmaW5lIF9fc3R1Yl9sY2htb2QKKyNkZWZpbmUgX19zdHViX3B1dG1zZworI2RlZmluZSBfX3N0dWJfcmV2b2tlCisjZGVmaW5lIF9fc3R1Yl9zZXRsb2dpbgorI2RlZmluZSBfX3N0dWJfc2lncmV0dXJuCisjZGVmaW5lIF9fc3R1Yl9zc3RrCisjZGVmaW5lIF9fc3R1Yl9zdHR5CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2dudS9zdHVicy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUvc3R1YnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA4NmJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9nbnUvc3R1YnMuaApAQCAtMCwwICsxLDEyIEBACisvKiBUaGlzIGZpbGUgc2VsZWN0cyB0aGUgcmlnaHQgZ2VuZXJhdGVkIGZpbGUgb2YgYF9fc3R1Yl9GVU5DVElPTicgbWFjcm9zCisgICBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIGJlaW5nIGNvbXBpbGVkIGZvci4gICovCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDMyCisjIGluY2x1ZGUgPGdudS9zdHVicy0zMi5oPgorI2VsaWYgX19XT1JEU0laRSA9PSA2NAorIyBpbmNsdWRlIDxnbnUvc3R1YnMtNjQuaD4KKyNlbHNlCisjIGVycm9yICJ1bmV4cGVjdGVkIHZhbHVlIGZvciBfX1dPUkRTSVpFIG1hY3JvIgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2dycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ncnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2NjNjlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ncnAuaApAQCAtMCwwICsxLDIwNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDE5OTIsMTk5NS0yMDAxLDIwMDMsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiA5LjIuMSBHcm91cCBEYXRhYmFzZSBBY2Nlc3MJPGdycC5oPgorICovCisKKyNpZm5kZWYJX0dSUF9ICisjZGVmaW5lCV9HUlBfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qIEZvciB0aGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbiB3ZSBtdXN0IGRlZmluZSB0aGlzIHR5cGUgaGVyZS4gICovCisjaWYgKGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKSAmJiAhZGVmaW5lZCBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKy8qIFRoZSBncm91cCBzdHJ1Y3R1cmUuCSAqLworc3RydWN0IGdyb3VwCisgIHsKKyAgICBjaGFyICpncl9uYW1lOwkJLyogR3JvdXAgbmFtZS4JKi8KKyAgICBjaGFyICpncl9wYXNzd2Q7CQkvKiBQYXNzd29yZC4JKi8KKyAgICBfX2dpZF90IGdyX2dpZDsJCS8qIEdyb3VwIElELgkqLworICAgIGNoYXIgKipncl9tZW07CQkvKiBNZW1iZXIgbGlzdC4JKi8KKyAgfTsKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfRklMRQorIyBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBSZXdpbmQgdGhlIGdyb3VwLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldGdyZW50ICh2b2lkKTsKKworLyogQ2xvc2UgdGhlIGdyb3VwLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZGdyZW50ICh2b2lkKTsKKworLyogUmVhZCBhbiBlbnRyeSBmcm9tIHRoZSBncm91cC1maWxlIHN0cmVhbSwgb3BlbmluZyBpdCBpZiBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JlbnQgKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9TVklECisvKiBSZWFkIGEgZ3JvdXAgZW50cnkgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmZnZXRncmVudCAoRklMRSAqX19zdHJlYW0pOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFdyaXRlIHRoZSBnaXZlbiBlbnRyeSBvbnRvIHRoZSBnaXZlbiBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHV0Z3JlbnQgKF9fY29uc3Qgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcCwKKwkJICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fZik7CisjZW5kaWYKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgZ3JvdXAgSUQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBncm91cCAqZ2V0Z3JnaWQgKF9fZ2lkX3QgX19naWQpOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyBncm91cCBuYW1lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgZ3JvdXAgKmdldGdybmFtIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIFJlYXNvbmFibGUgdmFsdWUgZm9yIHRoZSBidWZmZXIgc2l6ZWQgdXNlZCBpbiB0aGUgcmVlbnRyYW50CisgICBmdW5jdGlvbnMgYmVsb3cuICBCdXQgYmV0dGVyIHVzZSBgc3lzY29uZicuICAqLworIyAgZGVmaW5lIE5TU19CVUZMRU5fR1JPVVAJMTAyNAorIyBlbmRpZgorCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBQTEVBU0UgTk9URTogdGhlIGBnZXRncmVudF9yJyBmdW5jdGlvbiBpcyBub3QgKHlldCkgc3RhbmRhcmRpemVkLgorICAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoaXMgbGlicmFyeS4gIEJ1dAorICAgdGhlIGludGVyZmFjZSBpcyBkZXNpZ25lZCBmb2xsb3dpbmcgdGhlIHByaW5jaXBhbHMgdXNlZCBmb3IgdGhlCisgICBvdGhlciByZWVudHJhbnQgZnVuY3Rpb25zIHNvIHRoZSBjaGFuY2VzIGFyZSBnb29kIHRoaXMgaXMgd2hhdCB0aGUKKyAgIFBPU0lYIHBlb3BsZSB3b3VsZCBjaG9vc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKworIyBpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBpbnQgZ2V0Z3JlbnRfciAoc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisjIGVuZGlmCisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIElELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0Z3JnaWRfciAoX19naWRfdCBfX2dpZCwgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRncm5hbV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkgICAgICAgc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKyMgaWZkZWYJX19VU0VfU1ZJRAorLyogUmVhZCBhIGdyb3VwIGVudHJ5IGZyb20gU1RSRUFNLiAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3RhbmRhcmRpemVkCisgICBhbiBwcm9iYWJseSBuZXZlciB3aWxsLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRncmVudF9yIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJc3RydWN0IGdyb3VwICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IGdyb3VwICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisjIGVuZGlmCisKKyNlbmRpZgkvKiBQT1NJWCBvciByZWVudHJhbnQgKi8KKworCisjaWZkZWYJX19VU0VfQlNECisKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFNldCB0aGUgZ3JvdXAgc2V0IGZvciB0aGUgY3VycmVudCB1c2VyIHRvIEdST1VQUyAoTiBvZiB0aGVtKS4gICovCitleHRlcm4gaW50IHNldGdyb3VwcyAoc2l6ZV90IF9fbiwgX19jb25zdCBfX2dpZF90ICpfX2dyb3VwcykgX19USFJPVzsKKworLyogU3RvcmUgYXQgbW9zdCAqTkdST1VQUyBtZW1iZXJzIG9mIHRoZSBncm91cCBzZXQgZm9yIFVTRVIgaW50bworICAgKkdST1VQUy4gIEFsc28gaW5jbHVkZSBHUk9VUC4gIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGdyb3VwcyBmb3VuZCBpcworICAgcmV0dXJuZWQgaW4gKk5HUk9VUFMuICBSZXR1cm4gLTEgaWYgdGhlIGlmICpOR1JPVVBTIGlzIHRvbyBzbWFsbC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRncm91cGxpc3QgKF9fY29uc3QgY2hhciAqX191c2VyLCBfX2dpZF90IF9fZ3JvdXAsCisJCQkgX19naWRfdCAqX19ncm91cHMsIGludCAqX19uZ3JvdXBzKTsKKworLyogSW5pdGlhbGl6ZSB0aGUgZ3JvdXAgc2V0IGZvciB0aGUgY3VycmVudCB1c2VyCisgICBieSByZWFkaW5nIHRoZSBncm91cCBkYXRhYmFzZSBhbmQgdXNpbmcgYWxsIGdyb3VwcworICAgb2Ygd2hpY2ggVVNFUiBpcyBhIG1lbWJlci4gIEFsc28gaW5jbHVkZSBHUk9VUC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBpbml0Z3JvdXBzIChfX2NvbnN0IGNoYXIgKl9fdXNlciwgX19naWRfdCBfX2dyb3VwKTsKKworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZ3JwLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2ljb252LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2ljb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlYmY5YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvaWNvbnYuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX0lDT05WX0gKKyNkZWZpbmUgX0lDT05WX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogSWRlbnRpZmllciBmb3IgY29udmVyc2lvbiBtZXRob2QgZnJvbSBvbmUgY29kZXNldCB0byBhbm90aGVyLiAgKi8KK3R5cGVkZWYgdm9pZCAqaWNvbnZfdDsKKworCisvKiBBbGxvY2F0ZSBkZXNjcmlwdG9yIGZvciBjb2RlIGNvbnZlcnNpb24gZnJvbSBjb2Rlc2V0IEZST01DT0RFIHRvCisgICBjb2Rlc2V0IFRPQ09ERS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGljb252X3QgaWNvbnZfb3BlbiAoX19jb25zdCBjaGFyICpfX3RvY29kZSwgX19jb25zdCBjaGFyICpfX2Zyb21jb2RlKTsKKworLyogQ29udmVydCBhdCBtb3N0ICpJTkJZVEVTTEVGVCBieXRlcyBmcm9tICpJTkJVRiBhY2NvcmRpbmcgdG8gdGhlCisgICBjb2RlIGNvbnZlcnNpb24gYWxnb3JpdGhtIHNwZWNpZmllZCBieSBDRCBhbmQgcGxhY2UgdXAgdG8KKyAgICpPVVRCWVRFU0xFRlQgYnl0ZXMgaW4gYnVmZmVyIGF0ICpPVVRCVUYuICAqLworZXh0ZXJuIHNpemVfdCBpY29udiAoaWNvbnZfdCBfX2NkLCBjaGFyICoqX19yZXN0cmljdCBfX2luYnVmLAorCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX2luYnl0ZXNsZWZ0LAorCQkgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fb3V0YnVmLAorCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX291dGJ5dGVzbGVmdCk7CisKKy8qIEZyZWUgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgZGVzY3JpcHRvciBDRCBmb3IgY29kZSBjb252ZXJzaW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGljb252X2Nsb3NlIChpY29udl90IF9fY2QpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogaWNvbnYuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pZWVlNzU0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2llZWU3NTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdjMjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pZWVlNzU0LmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NSwgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfSUVFRTc1NF9ICisKKyNkZWZpbmUgX0lFRUU3NTRfSCAxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3VuaW9uIGllZWU3NTRfZmxvYXQKKyAgeworICAgIGZsb2F0IGY7CisKKyAgICAvKiBUaGlzIGlzIHRoZSBJRUVFIDc1NCBzaW5nbGUtcHJlY2lzaW9uIGZvcm1hdC4gICovCisgICAgc3RydWN0CisgICAgICB7CisjaWYJX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBleHBvbmVudDo4OworCXVuc2lnbmVkIGludCBtYW50aXNzYToyMzsKKyNlbmRpZgkJCQkvKiBCaWcgZW5kaWFuLiAgKi8KKyNpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdW5zaWduZWQgaW50IG1hbnRpc3NhOjIzOworCXVuc2lnbmVkIGludCBleHBvbmVudDo4OworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworI2VuZGlmCQkJCS8qIExpdHRsZSBlbmRpYW4uICAqLworICAgICAgfSBpZWVlOworCisgICAgLyogVGhpcyBmb3JtYXQgbWFrZXMgaXQgZWFzaWVyIHRvIHNlZSBpZiBhIE5hTiBpcyBhIHNpZ25hbGxpbmcgTmFOLiAgKi8KKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyNpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50Ojg7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBtYW50aXNzYToyMjsKKyNlbmRpZgkJCQkvKiBCaWcgZW5kaWFuLiAgKi8KKyNpZglfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdW5zaWduZWQgaW50IG1hbnRpc3NhOjIyOworCXVuc2lnbmVkIGludCBxdWlldF9uYW46MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKyNlbmRpZgkJCQkvKiBMaXR0bGUgZW5kaWFuLiAgKi8KKyAgICAgIH0gaWVlZV9uYW47CisgIH07CisKKyNkZWZpbmUgSUVFRTc1NF9GTE9BVF9CSUFTCTB4N2YgLyogQWRkZWQgdG8gZXhwb25lbnQuICAqLworCisKK3VuaW9uIGllZWU3NTRfZG91YmxlCisgIHsKKyAgICBkb3VibGUgZDsKKworICAgIC8qIFRoaXMgaXMgdGhlIElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gZm9ybWF0LiAgKi8KKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyNpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjExOworCS8qIFRvZ2V0aGVyIHRoZXNlIGNvbXByaXNlIHRoZSBtYW50aXNzYS4gICovCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDoyMDsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworI2VuZGlmCQkJCS8qIEJpZyBlbmRpYW4uICAqLworI2lmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgaWYJX19GTE9BVF9XT1JEX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MjA7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjExOworCXVuc2lnbmVkIGludCBuZWdhdGl2ZToxOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjIGVsc2UKKwkvKiBUb2dldGhlciB0aGVzZSBjb21wcmlzZSB0aGUgbWFudGlzc2EuICAqLworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDoyMDsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTE7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisjIGVuZGlmCisjZW5kaWYJCQkJLyogTGl0dGxlIGVuZGlhbi4gICovCisgICAgICB9IGllZWU7CisKKyAgICAvKiBUaGlzIGZvcm1hdCBtYWtlcyBpdCBlYXNpZXIgdG8gc2VlIGlmIGEgTmFOIGlzIGEgc2lnbmFsbGluZyBOYU4uICAqLworICAgIHN0cnVjdAorICAgICAgeworI2lmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTE7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCS8qIFRvZ2V0aGVyIHRoZXNlIGNvbXByaXNlIHRoZSBtYW50aXNzYS4gICovCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDoxOTsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworI2Vsc2UKKyMgaWYJX19GTE9BVF9XT1JEX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MTk7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxMTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworIyBlbHNlCisJLyogVG9nZXRoZXIgdGhlc2UgY29tcHJpc2UgdGhlIG1hbnRpc3NhLiAgKi8KKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MTk7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxMTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgfSBpZWVlX25hbjsKKyAgfTsKKworI2RlZmluZSBJRUVFNzU0X0RPVUJMRV9CSUFTCTB4M2ZmIC8qIEFkZGVkIHRvIGV4cG9uZW50LiAgKi8KKworCit1bmlvbiBpZWVlODU0X2xvbmdfZG91YmxlCisgIHsKKyAgICBsb25nIGRvdWJsZSBkOworCisgICAgLyogVGhpcyBpcyB0aGUgSUVFRSA4NTQgZG91YmxlLWV4dGVuZGVkLXByZWNpc2lvbiBmb3JtYXQuICAqLworICAgIHN0cnVjdAorICAgICAgeworI2lmCV9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisJdW5zaWduZWQgaW50IGVtcHR5OjE2OworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MzI7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyNlbmRpZgorI2lmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgaWYJX19GTE9BVF9XT1JEX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBleHBvbmVudDoxNTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZW1wdHk6MTY7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworIyBlbHNlCisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2EwOjMyOworCXVuc2lnbmVkIGludCBleHBvbmVudDoxNTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZW1wdHk6MTY7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgIH0gaWVlZTsKKworICAgIC8qIFRoaXMgaXMgZm9yIE5hTnMgaW4gdGhlIElFRUUgODU0IGRvdWJsZS1leHRlbmRlZC1wcmVjaXNpb24gZm9ybWF0LiAgKi8KKyAgICBzdHJ1Y3QKKyAgICAgIHsKKyNpZglfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGV4cG9uZW50OjE1OworCXVuc2lnbmVkIGludCBlbXB0eToxNjsKKwl1bnNpZ25lZCBpbnQgb25lOjE7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MzA7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMTozMjsKKyNlbmRpZgorI2lmCV9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgaWYJX19GTE9BVF9XT1JEX09SREVSID09IF9fQklHX0VORElBTgorCXVuc2lnbmVkIGludCBleHBvbmVudDoxNTsKKwl1bnNpZ25lZCBpbnQgbmVnYXRpdmU6MTsKKwl1bnNpZ25lZCBpbnQgZW1wdHk6MTY7CisJdW5zaWduZWQgaW50IG1hbnRpc3NhMDozMDsKKwl1bnNpZ25lZCBpbnQgcXVpZXRfbmFuOjE7CisJdW5zaWduZWQgaW50IG9uZToxOworCXVuc2lnbmVkIGludCBtYW50aXNzYTE6MzI7CisjIGVsc2UKKwl1bnNpZ25lZCBpbnQgbWFudGlzc2ExOjMyOworCXVuc2lnbmVkIGludCBtYW50aXNzYTA6MzA7CisJdW5zaWduZWQgaW50IHF1aWV0X25hbjoxOworCXVuc2lnbmVkIGludCBvbmU6MTsKKwl1bnNpZ25lZCBpbnQgZXhwb25lbnQ6MTU7CisJdW5zaWduZWQgaW50IG5lZ2F0aXZlOjE7CisJdW5zaWduZWQgaW50IGVtcHR5OjE2OworIyBlbmRpZgorI2VuZGlmCisgICAgICB9IGllZWVfbmFuOworICB9OworCisjZGVmaW5lIElFRUU4NTRfTE9OR19ET1VCTEVfQklBUyAweDNmZmYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGllZWU3NTQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pZmFkZHJzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2lmYWRkcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTZhMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pZmFkZHJzLmgKQEAgLTAsMCArMSw3NCBAQAorLyogaWZhZGRycy5oIC0tIGRlY2xhcmF0aW9ucyBmb3IgZ2V0dGluZyBuZXR3b3JrIGludGVyZmFjZSBhZGRyZXNzZXMKKyAgIENvcHlyaWdodCAoQykgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfSUZBRERSU19ICisjZGVmaW5lIF9JRkFERFJTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGBnZXRpZmFkZHJzJyBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorICAgRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0IGRlc2NyaWJlcyBvbmUgbmV0d29yayBpbnRlcmZhY2UuICAqLworc3RydWN0IGlmYWRkcnMKK3sKKyAgc3RydWN0IGlmYWRkcnMgKmlmYV9uZXh0OwkvKiBQb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdHVyZS4gICovCisKKyAgY2hhciAqaWZhX25hbWU7CQkvKiBOYW1lIG9mIHRoaXMgbmV0d29yayBpbnRlcmZhY2UuICAqLworICB1bnNpZ25lZCBpbnQgaWZhX2ZsYWdzOwkvKiBGbGFncyBhcyBmcm9tIFNJT0NHSUZGTEFHUyBpb2N0bC4gICovCisKKyAgc3RydWN0IHNvY2thZGRyICppZmFfYWRkcjsJLyogTmV0d29yayBhZGRyZXNzIG9mIHRoaXMgaW50ZXJmYWNlLiAgKi8KKyAgc3RydWN0IHNvY2thZGRyICppZmFfbmV0bWFzazsgLyogTmV0bWFzayBvZiB0aGlzIGludGVyZmFjZS4gICovCisgIHVuaW9uCisgIHsKKyAgICAvKiBBdCBtb3N0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBpcyB2YWxpZC4gIElmIHRoZSBJRkZfQlJPQURDQVNUCisgICAgICAgYml0IGlzIHNldCBpbiBgaWZhX2ZsYWdzJywgdGhlbiBgaWZhX2Jyb2FkYWRkcicgaXMgdmFsaWQuICBJZiB0aGUKKyAgICAgICBJRkZfUE9JTlRPUE9JTlQgYml0IGlzIHNldCwgdGhlbiBgaWZhX2RzdGFkZHInIGlzIHZhbGlkLgorICAgICAgIEl0IGlzIG5ldmVyIHRoZSBjYXNlIHRoYXQgYm90aCB0aGVzZSBiaXRzIGFyZSBzZXQgYXQgb25jZS4gICovCisgICAgc3RydWN0IHNvY2thZGRyICppZnVfYnJvYWRhZGRyOyAvKiBCcm9hZGNhc3QgYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZS4gKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmlmdV9kc3RhZGRyOyAvKiBQb2ludC10by1wb2ludCBkZXN0aW5hdGlvbiBhZGRyZXNzLiAgKi8KKyAgfSBpZmFfaWZ1OworICAvKiBUaGVzZSB2ZXJ5IHNhbWUgbWFjcm9zIGFyZSBkZWZpbmVkIGJ5IDxuZXQvaWYuaD4gZm9yIGBzdHJ1Y3QgaWZhZGRyJy4KKyAgICAgU28gaWYgdGhleSBhcmUgZGVmaW5lZCBhbHJlYWR5LCB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbnMgd2lsbCBiZSBmaW5lLiAgKi8KKyMgaWZuZGVmIGlmYV9icm9hZGFkZHIKKyMgIGRlZmluZSBpZmFfYnJvYWRhZGRyCWlmYV9pZnUuaWZ1X2Jyb2FkYWRkcgorIyBlbmRpZgorIyBpZm5kZWYgaWZhX2RzdGFkZHIKKyMgIGRlZmluZSBpZmFfZHN0YWRkcglpZmFfaWZ1LmlmdV9kc3RhZGRyCisjIGVuZGlmCisKKyAgdm9pZCAqaWZhX2RhdGE7CQkvKiBBZGRyZXNzLXNwZWNpZmljIGRhdGEgKG1heSBiZSB1bnVzZWQpLiAgKi8KK307CisKKworLyogQ3JlYXRlIGEgbGlua2VkIGxpc3Qgb2YgYHN0cnVjdCBpZmFkZHJzJyBzdHJ1Y3R1cmVzLCBvbmUgZm9yIGVhY2gKKyAgIG5ldHdvcmsgaW50ZXJmYWNlIG9uIHRoZSBob3N0IG1hY2hpbmUuICBJZiBzdWNjZXNzZnVsLCBzdG9yZSB0aGUKKyAgIGxpc3QgaW4gKklGQVAgYW5kIHJldHVybiAwLiAgT24gZXJyb3JzLCByZXR1cm4gLTEgYW5kIHNldCBgZXJybm8nLgorCisgICBUaGUgc3RvcmFnZSByZXR1cm5lZCBpbiAqSUZBUCBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kIGNhbgorICAgb25seSBiZSBwcm9wZXJseSBmcmVlZCBieSBwYXNzaW5nIGl0IHRvIGBmcmVlaWZhZGRycycuICAqLworZXh0ZXJuIGludCBnZXRpZmFkZHJzIChzdHJ1Y3QgaWZhZGRycyAqKl9faWZhcCkgX19USFJPVzsKKworLyogUmVjbGFpbSB0aGUgc3RvcmFnZSBhbGxvY2F0ZWQgYnkgYSBwcmV2aW91cyBgZ2V0aWZhZGRycycgY2FsbC4gICovCitleHRlcm4gdm9pZCBmcmVlaWZhZGRycyAoc3RydWN0IGlmYWRkcnMgKl9faWZhKSAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGlmYWRkcnMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9pbnR0eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9pbnR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGZmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2ludHR5cGVzLmgKQEAgLTAsMCArMSw0NDQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxLCAyMDA0LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OTogNy44IEZvcm1hdCBjb252ZXJzaW9uIG9mIGludGVnZXIgdHlwZXMJPGludHR5cGVzLmg+CisgKi8KKworI2lmbmRlZiBfSU5UVFlQRVNfSAorI2RlZmluZSBfSU5UVFlQRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorLyogR2V0IHRoZSB0eXBlIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogR2V0IGEgZGVmaW5pdGlvbiBmb3Igd2NoYXJfdC4gIEJ1dCB3ZSBtdXN0IG5vdCBkZWZpbmUgd2NoYXJfdCBpdHNlbGYuICAqLworI2lmbmRlZiBfX19fZ3djaGFyX3RfZGVmaW5lZAorIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9fZ3djaGFyX3Qgd2NoYXJfdAorIyBlbGlmIGRlZmluZWQgX19XQ0hBUl9UWVBFX18KK3R5cGVkZWYgX19XQ0hBUl9UWVBFX18gX19nd2NoYXJfdDsKKyMgZWxzZQorIyAgZGVmaW5lIF9fbmVlZF93Y2hhcl90CisjICBpbmNsdWRlIDxzdGRkZWYuaD4KK3R5cGVkZWYgd2NoYXJfdCBfX2d3Y2hhcl90OworIyBlbmRpZgorIyBkZWZpbmUgX19fX2d3Y2hhcl90X2RlZmluZWQJMQorI2VuZGlmCisKKworLyogVGhlIElTTyBDOTkgc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgdGhlc2UgbWFjcm9zIG11c3Qgb25seSBiZQorICAgZGVmaW5lZCBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCisjaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX1NURENfRk9STUFUX01BQ1JPUworCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX1BSSTY0X1BSRUZJWAkibCIKKyMgIGRlZmluZSBfX1BSSVBUUl9QUkVGSVgJImwiCisjIGVsc2UKKyMgIGRlZmluZSBfX1BSSTY0X1BSRUZJWAkibGwiCisjICBkZWZpbmUgX19QUklQVFJfUFJFRklYCisjIGVuZGlmCisKKy8qIE1hY3JvcyBmb3IgcHJpbnRpbmcgZm9ybWF0IHNwZWNpZmllcnMuICAqLworCisvKiBEZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFBSSWQ4CQkiZCIKKyMgZGVmaW5lIFBSSWQxNgkJImQiCisjIGRlZmluZSBQUklkMzIJCSJkIgorIyBkZWZpbmUgUFJJZDY0CQlfX1BSSTY0X1BSRUZJWCAiZCIKKworIyBkZWZpbmUgUFJJZExFQVNUOAkiZCIKKyMgZGVmaW5lIFBSSWRMRUFTVDE2CSJkIgorIyBkZWZpbmUgUFJJZExFQVNUMzIJImQiCisjIGRlZmluZSBQUklkTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiZCIKKworIyBkZWZpbmUgUFJJZEZBU1Q4CSJkIgorIyBkZWZpbmUgUFJJZEZBU1QxNglfX1BSSVBUUl9QUkVGSVggImQiCisjIGRlZmluZSBQUklkRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAiZCIKKyMgZGVmaW5lIFBSSWRGQVNUNjQJX19QUkk2NF9QUkVGSVggImQiCisKKworIyBkZWZpbmUgUFJJaTgJCSJpIgorIyBkZWZpbmUgUFJJaTE2CQkiaSIKKyMgZGVmaW5lIFBSSWkzMgkJImkiCisjIGRlZmluZSBQUklpNjQJCV9fUFJJNjRfUFJFRklYICJpIgorCisjIGRlZmluZSBQUklpTEVBU1Q4CSJpIgorIyBkZWZpbmUgUFJJaUxFQVNUMTYJImkiCisjIGRlZmluZSBQUklpTEVBU1QzMgkiaSIKKyMgZGVmaW5lIFBSSWlMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJpIgorCisjIGRlZmluZSBQUklpRkFTVDgJImkiCisjIGRlZmluZSBQUklpRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAiaSIKKyMgZGVmaW5lIFBSSWlGQVNUMzIJX19QUklQVFJfUFJFRklYICJpIgorIyBkZWZpbmUgUFJJaUZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiaSIKKworLyogT2N0YWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgUFJJbzgJCSJvIgorIyBkZWZpbmUgUFJJbzE2CQkibyIKKyMgZGVmaW5lIFBSSW8zMgkJIm8iCisjIGRlZmluZSBQUklvNjQJCV9fUFJJNjRfUFJFRklYICJvIgorCisjIGRlZmluZSBQUklvTEVBU1Q4CSJvIgorIyBkZWZpbmUgUFJJb0xFQVNUMTYJIm8iCisjIGRlZmluZSBQUklvTEVBU1QzMgkibyIKKyMgZGVmaW5lIFBSSW9MRUFTVDY0CV9fUFJJNjRfUFJFRklYICJvIgorCisjIGRlZmluZSBQUklvRkFTVDgJIm8iCisjIGRlZmluZSBQUklvRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAibyIKKyMgZGVmaW5lIFBSSW9GQVNUMzIJX19QUklQVFJfUFJFRklYICJvIgorIyBkZWZpbmUgUFJJb0ZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAibyIKKworLyogVW5zaWduZWQgaW50ZWdlcnMuICAqLworIyBkZWZpbmUgUFJJdTgJCSJ1IgorIyBkZWZpbmUgUFJJdTE2CQkidSIKKyMgZGVmaW5lIFBSSXUzMgkJInUiCisjIGRlZmluZSBQUkl1NjQJCV9fUFJJNjRfUFJFRklYICJ1IgorCisjIGRlZmluZSBQUkl1TEVBU1Q4CSJ1IgorIyBkZWZpbmUgUFJJdUxFQVNUMTYJInUiCisjIGRlZmluZSBQUkl1TEVBU1QzMgkidSIKKyMgZGVmaW5lIFBSSXVMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJ1IgorCisjIGRlZmluZSBQUkl1RkFTVDgJInUiCisjIGRlZmluZSBQUkl1RkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAidSIKKyMgZGVmaW5lIFBSSXVGQVNUMzIJX19QUklQVFJfUFJFRklYICJ1IgorIyBkZWZpbmUgUFJJdUZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAidSIKKworLyogbG93ZXJjYXNlIGhleGFkZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFBSSXg4CQkieCIKKyMgZGVmaW5lIFBSSXgxNgkJIngiCisjIGRlZmluZSBQUkl4MzIJCSJ4IgorIyBkZWZpbmUgUFJJeDY0CQlfX1BSSTY0X1BSRUZJWCAieCIKKworIyBkZWZpbmUgUFJJeExFQVNUOAkieCIKKyMgZGVmaW5lIFBSSXhMRUFTVDE2CSJ4IgorIyBkZWZpbmUgUFJJeExFQVNUMzIJIngiCisjIGRlZmluZSBQUkl4TEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAieCIKKworIyBkZWZpbmUgUFJJeEZBU1Q4CSJ4IgorIyBkZWZpbmUgUFJJeEZBU1QxNglfX1BSSVBUUl9QUkVGSVggIngiCisjIGRlZmluZSBQUkl4RkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAieCIKKyMgZGVmaW5lIFBSSXhGQVNUNjQJX19QUkk2NF9QUkVGSVggIngiCisKKy8qIFVQUEVSQ0FTRSBoZXhhZGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBQUklYOAkJIlgiCisjIGRlZmluZSBQUklYMTYJCSJYIgorIyBkZWZpbmUgUFJJWDMyCQkiWCIKKyMgZGVmaW5lIFBSSVg2NAkJX19QUkk2NF9QUkVGSVggIlgiCisKKyMgZGVmaW5lIFBSSVhMRUFTVDgJIlgiCisjIGRlZmluZSBQUklYTEVBU1QxNgkiWCIKKyMgZGVmaW5lIFBSSVhMRUFTVDMyCSJYIgorIyBkZWZpbmUgUFJJWExFQVNUNjQJX19QUkk2NF9QUkVGSVggIlgiCisKKyMgZGVmaW5lIFBSSVhGQVNUOAkiWCIKKyMgZGVmaW5lIFBSSVhGQVNUMTYJX19QUklQVFJfUFJFRklYICJYIgorIyBkZWZpbmUgUFJJWEZBU1QzMglfX1BSSVBUUl9QUkVGSVggIlgiCisjIGRlZmluZSBQUklYRkFTVDY0CV9fUFJJNjRfUFJFRklYICJYIgorCisKKy8qIE1hY3JvcyBmb3IgcHJpbnRpbmcgYGludG1heF90JyBhbmQgYHVpbnRtYXhfdCcuICAqLworIyBkZWZpbmUgUFJJZE1BWAlfX1BSSTY0X1BSRUZJWCAiZCIKKyMgZGVmaW5lIFBSSWlNQVgJX19QUkk2NF9QUkVGSVggImkiCisjIGRlZmluZSBQUklvTUFYCV9fUFJJNjRfUFJFRklYICJvIgorIyBkZWZpbmUgUFJJdU1BWAlfX1BSSTY0X1BSRUZJWCAidSIKKyMgZGVmaW5lIFBSSXhNQVgJX19QUkk2NF9QUkVGSVggIngiCisjIGRlZmluZSBQUklYTUFYCV9fUFJJNjRfUFJFRklYICJYIgorCisKKy8qIE1hY3JvcyBmb3IgcHJpbnRpbmcgYGludHB0cl90JyBhbmQgYHVpbnRwdHJfdCcuICAqLworIyBkZWZpbmUgUFJJZFBUUglfX1BSSVBUUl9QUkVGSVggImQiCisjIGRlZmluZSBQUklpUFRSCV9fUFJJUFRSX1BSRUZJWCAiaSIKKyMgZGVmaW5lIFBSSW9QVFIJX19QUklQVFJfUFJFRklYICJvIgorIyBkZWZpbmUgUFJJdVBUUglfX1BSSVBUUl9QUkVGSVggInUiCisjIGRlZmluZSBQUkl4UFRSCV9fUFJJUFRSX1BSRUZJWCAieCIKKyMgZGVmaW5lIFBSSVhQVFIJX19QUklQVFJfUFJFRklYICJYIgorCisKKy8qIE1hY3JvcyBmb3Igc2Nhbm5pbmcgZm9ybWF0IHNwZWNpZmllcnMuICAqLworCisvKiBTaWduZWQgZGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBTQ05kOAkJImhoZCIKKyMgZGVmaW5lIFNDTmQxNgkJImhkIgorIyBkZWZpbmUgU0NOZDMyCQkiZCIKKyMgZGVmaW5lIFNDTmQ2NAkJX19QUkk2NF9QUkVGSVggImQiCisKKyMgZGVmaW5lIFNDTmRMRUFTVDgJImhoZCIKKyMgZGVmaW5lIFNDTmRMRUFTVDE2CSJoZCIKKyMgZGVmaW5lIFNDTmRMRUFTVDMyCSJkIgorIyBkZWZpbmUgU0NOZExFQVNUNjQJX19QUkk2NF9QUkVGSVggImQiCisKKyMgZGVmaW5lIFNDTmRGQVNUOAkiaGhkIgorIyBkZWZpbmUgU0NOZEZBU1QxNglfX1BSSVBUUl9QUkVGSVggImQiCisjIGRlZmluZSBTQ05kRkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAiZCIKKyMgZGVmaW5lIFNDTmRGQVNUNjQJX19QUkk2NF9QUkVGSVggImQiCisKKy8qIFNpZ25lZCBkZWNpbWFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFNDTmk4CQkiaGhpIgorIyBkZWZpbmUgU0NOaTE2CQkiaGkiCisjIGRlZmluZSBTQ05pMzIJCSJpIgorIyBkZWZpbmUgU0NOaTY0CQlfX1BSSTY0X1BSRUZJWCAiaSIKKworIyBkZWZpbmUgU0NOaUxFQVNUOAkiaGhpIgorIyBkZWZpbmUgU0NOaUxFQVNUMTYJImhpIgorIyBkZWZpbmUgU0NOaUxFQVNUMzIJImkiCisjIGRlZmluZSBTQ05pTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiaSIKKworIyBkZWZpbmUgU0NOaUZBU1Q4CSJoaGkiCisjIGRlZmluZSBTQ05pRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAiaSIKKyMgZGVmaW5lIFNDTmlGQVNUMzIJX19QUklQVFJfUFJFRklYICJpIgorIyBkZWZpbmUgU0NOaUZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAiaSIKKworLyogVW5zaWduZWQgZGVjaW1hbCBub3RhdGlvbi4gICovCisjIGRlZmluZSBTQ051OAkJImhodSIKKyMgZGVmaW5lIFNDTnUxNgkJImh1IgorIyBkZWZpbmUgU0NOdTMyCQkidSIKKyMgZGVmaW5lIFNDTnU2NAkJX19QUkk2NF9QUkVGSVggInUiCisKKyMgZGVmaW5lIFNDTnVMRUFTVDgJImhodSIKKyMgZGVmaW5lIFNDTnVMRUFTVDE2CSJodSIKKyMgZGVmaW5lIFNDTnVMRUFTVDMyCSJ1IgorIyBkZWZpbmUgU0NOdUxFQVNUNjQJX19QUkk2NF9QUkVGSVggInUiCisKKyMgZGVmaW5lIFNDTnVGQVNUOAkiaGh1IgorIyBkZWZpbmUgU0NOdUZBU1QxNglfX1BSSVBUUl9QUkVGSVggInUiCisjIGRlZmluZSBTQ051RkFTVDMyCV9fUFJJUFRSX1BSRUZJWCAidSIKKyMgZGVmaW5lIFNDTnVGQVNUNjQJX19QUkk2NF9QUkVGSVggInUiCisKKy8qIE9jdGFsIG5vdGF0aW9uLiAgKi8KKyMgZGVmaW5lIFNDTm84CQkiaGhvIgorIyBkZWZpbmUgU0NObzE2CQkiaG8iCisjIGRlZmluZSBTQ05vMzIJCSJvIgorIyBkZWZpbmUgU0NObzY0CQlfX1BSSTY0X1BSRUZJWCAibyIKKworIyBkZWZpbmUgU0NOb0xFQVNUOAkiaGhvIgorIyBkZWZpbmUgU0NOb0xFQVNUMTYJImhvIgorIyBkZWZpbmUgU0NOb0xFQVNUMzIJIm8iCisjIGRlZmluZSBTQ05vTEVBU1Q2NAlfX1BSSTY0X1BSRUZJWCAibyIKKworIyBkZWZpbmUgU0NOb0ZBU1Q4CSJoaG8iCisjIGRlZmluZSBTQ05vRkFTVDE2CV9fUFJJUFRSX1BSRUZJWCAibyIKKyMgZGVmaW5lIFNDTm9GQVNUMzIJX19QUklQVFJfUFJFRklYICJvIgorIyBkZWZpbmUgU0NOb0ZBU1Q2NAlfX1BSSTY0X1BSRUZJWCAibyIKKworLyogSGV4YWRlY2ltYWwgbm90YXRpb24uICAqLworIyBkZWZpbmUgU0NOeDgJCSJoaHgiCisjIGRlZmluZSBTQ054MTYJCSJoeCIKKyMgZGVmaW5lIFNDTngzMgkJIngiCisjIGRlZmluZSBTQ054NjQJCV9fUFJJNjRfUFJFRklYICJ4IgorCisjIGRlZmluZSBTQ054TEVBU1Q4CSJoaHgiCisjIGRlZmluZSBTQ054TEVBU1QxNgkiaHgiCisjIGRlZmluZSBTQ054TEVBU1QzMgkieCIKKyMgZGVmaW5lIFNDTnhMRUFTVDY0CV9fUFJJNjRfUFJFRklYICJ4IgorCisjIGRlZmluZSBTQ054RkFTVDgJImhoeCIKKyMgZGVmaW5lIFNDTnhGQVNUMTYJX19QUklQVFJfUFJFRklYICJ4IgorIyBkZWZpbmUgU0NOeEZBU1QzMglfX1BSSVBUUl9QUkVGSVggIngiCisjIGRlZmluZSBTQ054RkFTVDY0CV9fUFJJNjRfUFJFRklYICJ4IgorCisKKy8qIE1hY3JvcyBmb3Igc2Nhbm5pbmcgYGludG1heF90JyBhbmQgYHVpbnRtYXhfdCcuICAqLworIyBkZWZpbmUgU0NOZE1BWAlfX1BSSTY0X1BSRUZJWCAiZCIKKyMgZGVmaW5lIFNDTmlNQVgJX19QUkk2NF9QUkVGSVggImkiCisjIGRlZmluZSBTQ05vTUFYCV9fUFJJNjRfUFJFRklYICJvIgorIyBkZWZpbmUgU0NOdU1BWAlfX1BSSTY0X1BSRUZJWCAidSIKKyMgZGVmaW5lIFNDTnhNQVgJX19QUkk2NF9QUkVGSVggIngiCisKKy8qIE1hY3JvcyBmb3Igc2NhbmluZyBgaW50cHRyX3QnIGFuZCBgdWludHB0cl90Jy4gICovCisjIGRlZmluZSBTQ05kUFRSCV9fUFJJUFRSX1BSRUZJWCAiZCIKKyMgZGVmaW5lIFNDTmlQVFIJX19QUklQVFJfUFJFRklYICJpIgorIyBkZWZpbmUgU0NOb1BUUglfX1BSSVBUUl9QUkVGSVggIm8iCisjIGRlZmluZSBTQ051UFRSCV9fUFJJUFRSX1BSRUZJWCAidSIKKyMgZGVmaW5lIFNDTnhQVFIJX19QUklQVFJfUFJFRklYICJ4IgorCisjZW5kaWYJLyogQysrICYmIGZvcm1hdCBtYWNyb3MgKi8KKworCitfX0JFR0lOX0RFQ0xTCisKKyNpZiBfX1dPUkRTSVpFID09IDY0CisKKy8qIFdlIGhhdmUgdG8gZGVmaW5lIHRoZSBgdWludG1heF90JyB0eXBlIHVzaW5nIGBsZGl2X3QnLiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBsb25nIGludCBxdW90OwkJLyogUXVvdGllbnQuICAqLworICAgIGxvbmcgaW50IHJlbTsJCS8qIFJlbWFpbmRlci4gICovCisgIH0gaW1heGRpdl90OworCisjZWxzZQorCisvKiBXZSBoYXZlIHRvIGRlZmluZSB0aGUgYHVpbnRtYXhfdCcgdHlwZSB1c2luZyBgbGxkaXZfdCcuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGxvbmcgbG9uZyBpbnQgcXVvdDsJCS8qIFF1b3RpZW50LiAgKi8KKyAgICBsb25nIGxvbmcgaW50IHJlbTsJCS8qIFJlbWFpbmRlci4gICovCisgIH0gaW1heGRpdl90OworCisjZW5kaWYKKworCisvKiBDb21wdXRlIGFic29sdXRlIHZhbHVlIG9mIE4uICAqLworZXh0ZXJuIGludG1heF90IGltYXhhYnMgKGludG1heF90IF9fbikgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiB0aGUgYGltYXhkaXZfdCcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIE5VTUVSIG92ZXIgREVOT00uICovCitleHRlcm4gaW1heGRpdl90IGltYXhkaXYgKGludG1heF90IF9fbnVtZXIsIGludG1heF90IF9fZGVub20pCisgICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogTGlrZSBgc3RydG9sJyBidXQgY29udmVydCB0byBgaW50bWF4X3QnLiAgKi8KK2V4dGVybiBpbnRtYXhfdCBzdHJ0b2ltYXggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkgX19USFJPVzsKKworLyogTGlrZSBgc3RydG91bCcgYnV0IGNvbnZlcnQgdG8gYHVpbnRtYXhfdCcuICAqLworZXh0ZXJuIHVpbnRtYXhfdCBzdHJ0b3VtYXggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgY2hhciAqKiBfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSBfX1RIUk9XOworCisvKiBMaWtlIGB3Y3N0b2wnIGJ1dCBjb252ZXJ0IHRvIGBpbnRtYXhfdCcuICAqLworZXh0ZXJuIGludG1heF90IHdjc3RvaW1heCAoX19jb25zdCBfX2d3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XOworCisvKiBMaWtlIGB3Y3N0b3VsJyBidXQgY29udmVydCB0byBgdWludG1heF90Jy4gICovCitleHRlcm4gdWludG1heF90IHdjc3RvdW1heCAoX19jb25zdCBfX2d3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICBfX2d3Y2hhcl90ICoqIF9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKworZXh0ZXJuIGxvbmcgaW50IF9fc3RydG9sX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCSAgIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHN0cnRvbCcgYnV0IGNvbnZlcnQgdG8gYGludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgaW50bWF4X3QKK19fTlRIIChzdHJ0b2ltYXggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBucHRyLCBjaGFyICoqX19yZXN0cmljdCBlbmRwdHIsCisJCSAgaW50IGJhc2UpKQoreworICByZXR1cm4gX19zdHJ0b2xfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX3N0cnRvdWxfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqCisJCQkJCSAgICAgX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSAgICAgY2hhciAqKiBfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkgICAgIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHN0cnRvdWwnIGJ1dCBjb252ZXJ0IHRvIGB1aW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSB1aW50bWF4X3QKK19fTlRIIChzdHJ0b3VtYXggKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBucHRyLCBjaGFyICoqX19yZXN0cmljdCBlbmRwdHIsCisJCSAgaW50IGJhc2UpKQoreworICByZXR1cm4gX19zdHJ0b3VsX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCitleHRlcm4gbG9uZyBpbnQgX193Y3N0b2xfaW50ZXJuYWwgKF9fY29uc3QgX19nd2NoYXJfdCAqIF9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCSAgIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIExpa2UgYHdjc3RvbCcgYnV0IGNvbnZlcnQgdG8gYGludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgaW50bWF4X3QKK19fTlRIICh3Y3N0b2ltYXggKF9fY29uc3QgX19nd2NoYXJfdCAqX19yZXN0cmljdCBucHRyLAorCQkgIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IGVuZHB0ciwgaW50IGJhc2UpKQoreworICByZXR1cm4gX193Y3N0b2xfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCBfX3djc3RvdWxfaW50ZXJuYWwgKF9fY29uc3QgX19nd2NoYXJfdCAqCisJCQkJCSAgICAgX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSAgICAgX19nd2NoYXJfdCAqKgorCQkJCQkgICAgIF9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSAgICAgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgd2NzdG91bCcgYnV0IGNvbnZlcnQgdG8gYHVpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIHVpbnRtYXhfdAorX19OVEggKHdjc3RvdW1heCAoX19jb25zdCBfX2d3Y2hhcl90ICpfX3Jlc3RyaWN0IG5wdHIsCisJCSAgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3djc3RvdWxfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKKyMgZWxzZSAvKiBfX1dPUkRTSVpFID09IDMyICovCisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IF9fc3RydG9sbF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgc3RydG9sJyBidXQgY29udmVydCB0byBgaW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSBpbnRtYXhfdAorX19OVEggKHN0cnRvaW1heCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IG5wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IGVuZHB0ciwKKwkJICBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3N0cnRvbGxfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fc3RydG91bGxfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqCisJCQkJCQkgICBfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJCSAgIGNoYXIgKioKKwkJCQkJCSAgIF9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCQkgICBpbnQgX19iYXNlLAorCQkJCQkJICAgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgc3RydG91bCcgYnV0IGNvbnZlcnQgdG8gYHVpbnRtYXhfdCcuICAqLworX19leHRlcm5faW5saW5lIHVpbnRtYXhfdAorX19OVEggKHN0cnRvdW1heCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IG5wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IGVuZHB0ciwKKwkJICBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3N0cnRvdWxsX2ludGVybmFsIChucHRyLCBlbmRwdHIsIGJhc2UsIDApOworfQorCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCBfX3djc3RvbGxfaW50ZXJuYWwgKF9fY29uc3QgX19nd2NoYXJfdCAqCisJCQkJCSBfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJIF9fZ3djaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCQkgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworLyogTGlrZSBgd2NzdG9sJyBidXQgY29udmVydCB0byBgaW50bWF4X3QnLiAgKi8KK19fZXh0ZXJuX2lubGluZSBpbnRtYXhfdAorX19OVEggKHdjc3RvaW1heCAoX19jb25zdCBfX2d3Y2hhcl90ICpfX3Jlc3RyaWN0IG5wdHIsCisJCSAgX19nd2NoYXJfdCAqKl9fcmVzdHJpY3QgZW5kcHRyLCBpbnQgYmFzZSkpCit7CisgIHJldHVybiBfX3djc3RvbGxfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKKworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX193Y3N0b3VsbF9pbnRlcm5hbCAoX19jb25zdCBfX2d3Y2hhcl90ICoKKwkJCQkJCSAgIF9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQkJICAgX19nd2NoYXJfdCAqKgorCQkJCQkJICAgX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJCSAgIGludCBfX2Jhc2UsCisJCQkJCQkgICBpbnQgX19ncm91cCkKKyAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBMaWtlIGB3Y3N0b3VsJyBidXQgY29udmVydCB0byBgdWludG1heF90Jy4gICovCitfX2V4dGVybl9pbmxpbmUgdWludG1heF90CitfX05USCAod2NzdG91bWF4IChfX2NvbnN0IF9fZ3djaGFyX3QgKl9fcmVzdHJpY3QgbnB0ciwKKwkJICBfX2d3Y2hhcl90ICoqX19yZXN0cmljdCBlbmRwdHIsIGludCBiYXNlKSkKK3sKKyAgcmV0dXJuIF9fd2NzdG91bGxfaW50ZXJuYWwgKG5wdHIsIGVuZHB0ciwgYmFzZSwgMCk7Cit9CisKKyMgZW5kaWYJLyogX19XT1JEU0laRSA9PSAzMgkqLworI2VuZGlmCS8qIFVzZSBleHRlcm4gaW5saW5lcy4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBpbnR0eXBlcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xhbmdpbmZvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xhbmdpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGFuZ2luZm8uaApAQCAtMCwwICsxLDU5OCBAQAorLyogQWNjZXNzIHRvIGxvY2FsZS1kZXBlbmRlbnQgcGFyYW1ldGVycy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAyLDIwMDMsMjAwNCwyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MQU5HSU5GT19ICisjZGVmaW5lCV9MQU5HSU5GT19IIDEKKworLyogR2V0IHRoZSB0eXBlIGRlZmluaXRpb24uICAqLworI2luY2x1ZGUgPG5sX3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZS5oPgkvKiBEZWZpbmUgdGhlIF9fTENfKiBjYXRlZ29yeSBuYW1lcy4gICovCisKKworX19CRUdJTl9ERUNMUworCisvKiBDb25zdHJ1Y3QgYW4gYG5sX2l0ZW0nIHZhbHVlIGZvciBgbmxfbGFuZ2luZm8nIGZyb20gYSBsb2NhbGUgY2F0ZWdvcnkKKyAgIChMQ18qKSBhbmQgYW4gaXRlbSBpbmRleCB3aXRoaW4gdGhlIGNhdGVnb3J5LiAgU29tZSBjb2RlIG1heSBkZXBlbmQgb24KKyAgIHRoZSBpdGVtIHZhbHVlcyB3aXRoaW4gYSBjYXRlZ29yeSBpbmNyZWFzaW5nIG1vbm90b25pY2FsbHkgd2l0aCB0aGUKKyAgIGluZGljZXMuICAqLworI2RlZmluZSBfTkxfSVRFTShjYXRlZ29yeSwgaW5kZXgpCSgoKGNhdGVnb3J5KSA8PCAxNikgfCAoaW5kZXgpKQorCisvKiBFeHRyYWN0IHRoZSBjYXRlZ29yeSBhbmQgaXRlbSBpbmRleCBmcm9tIGEgY29uc3RydWN0ZWQgYG5sX2l0ZW0nIHZhbHVlLiAgKi8KKyNkZWZpbmUgX05MX0lURU1fQ0FURUdPUlkoaXRlbSkJCSgoaW50KSAoaXRlbSkgPj4gMTYpCisjZGVmaW5lIF9OTF9JVEVNX0lOREVYKGl0ZW0pCQkoKGludCkgKGl0ZW0pICYgMHhmZmZmKQorCisvKiBFbnVtZXJhdGlvbiBvZiBsb2NhbGUgaXRlbXMgdGhhdCBjYW4gYmUgcXVlcmllZCB3aXRoIGBubF9sYW5naW5mbycuICAqLworZW51bQoreworICAvKiBMQ19USU1FIGNhdGVnb3J5OiBkYXRlIGFuZCB0aW1lIGZvcm1hdHRpbmcuICAqLworCisgIC8qIEFiYnJldmlhdGVkIGRheXMgb2YgdGhlIHdlZWsuICovCisgIEFCREFZXzEgPSBfTkxfSVRFTSAoX19MQ19USU1FLCAwKSwgLyogU3VuICovCisjZGVmaW5lIEFCREFZXzEJCQlBQkRBWV8xCisgIEFCREFZXzIsCisjZGVmaW5lIEFCREFZXzIJCQlBQkRBWV8yCisgIEFCREFZXzMsCisjZGVmaW5lIEFCREFZXzMJCQlBQkRBWV8zCisgIEFCREFZXzQsCisjZGVmaW5lIEFCREFZXzQJCQlBQkRBWV80CisgIEFCREFZXzUsCisjZGVmaW5lIEFCREFZXzUJCQlBQkRBWV81CisgIEFCREFZXzYsCisjZGVmaW5lIEFCREFZXzYJCQlBQkRBWV82CisgIEFCREFZXzcsCisjZGVmaW5lIEFCREFZXzcJCQlBQkRBWV83CisKKyAgLyogTG9uZy1uYW1lZCBkYXlzIG9mIHRoZSB3ZWVrLiAqLworICBEQVlfMSwJCQkvKiBTdW5kYXkgKi8KKyNkZWZpbmUgREFZXzEJCQlEQVlfMQorICBEQVlfMiwJCQkvKiBNb25kYXkgKi8KKyNkZWZpbmUgREFZXzIJCQlEQVlfMgorICBEQVlfMywJCQkvKiBUdWVzZGF5ICovCisjZGVmaW5lIERBWV8zCQkJREFZXzMKKyAgREFZXzQsCQkJLyogV2VkbmVzZGF5ICovCisjZGVmaW5lIERBWV80CQkJREFZXzQKKyAgREFZXzUsCQkJLyogVGh1cnNkYXkgKi8KKyNkZWZpbmUgREFZXzUJCQlEQVlfNQorICBEQVlfNiwJCQkvKiBGcmlkYXkgKi8KKyNkZWZpbmUgREFZXzYJCQlEQVlfNgorICBEQVlfNywJCQkvKiBTYXR1cmRheSAqLworI2RlZmluZSBEQVlfNwkJCURBWV83CisKKyAgLyogQWJicmV2aWF0ZWQgbW9udGggbmFtZXMuICAqLworICBBQk1PTl8xLAkJCS8qIEphbiAqLworI2RlZmluZSBBQk1PTl8xCQkJQUJNT05fMQorICBBQk1PTl8yLAorI2RlZmluZSBBQk1PTl8yCQkJQUJNT05fMgorICBBQk1PTl8zLAorI2RlZmluZSBBQk1PTl8zCQkJQUJNT05fMworICBBQk1PTl80LAorI2RlZmluZSBBQk1PTl80CQkJQUJNT05fNAorICBBQk1PTl81LAorI2RlZmluZSBBQk1PTl81CQkJQUJNT05fNQorICBBQk1PTl82LAorI2RlZmluZSBBQk1PTl82CQkJQUJNT05fNgorICBBQk1PTl83LAorI2RlZmluZSBBQk1PTl83CQkJQUJNT05fNworICBBQk1PTl84LAorI2RlZmluZSBBQk1PTl84CQkJQUJNT05fOAorICBBQk1PTl85LAorI2RlZmluZSBBQk1PTl85CQkJQUJNT05fOQorICBBQk1PTl8xMCwKKyNkZWZpbmUgQUJNT05fMTAJCUFCTU9OXzEwCisgIEFCTU9OXzExLAorI2RlZmluZSBBQk1PTl8xMQkJQUJNT05fMTEKKyAgQUJNT05fMTIsCisjZGVmaW5lIEFCTU9OXzEyCQlBQk1PTl8xMgorCisgIC8qIExvbmcgbW9udGggbmFtZXMuICAqLworICBNT05fMSwJCQkvKiBKYW51YXJ5ICovCisjZGVmaW5lIE1PTl8xCQkJTU9OXzEKKyAgTU9OXzIsCisjZGVmaW5lIE1PTl8yCQkJTU9OXzIKKyAgTU9OXzMsCisjZGVmaW5lIE1PTl8zCQkJTU9OXzMKKyAgTU9OXzQsCisjZGVmaW5lIE1PTl80CQkJTU9OXzQKKyAgTU9OXzUsCisjZGVmaW5lIE1PTl81CQkJTU9OXzUKKyAgTU9OXzYsCisjZGVmaW5lIE1PTl82CQkJTU9OXzYKKyAgTU9OXzcsCisjZGVmaW5lIE1PTl83CQkJTU9OXzcKKyAgTU9OXzgsCisjZGVmaW5lIE1PTl84CQkJTU9OXzgKKyAgTU9OXzksCisjZGVmaW5lIE1PTl85CQkJTU9OXzkKKyAgTU9OXzEwLAorI2RlZmluZSBNT05fMTAJCQlNT05fMTAKKyAgTU9OXzExLAorI2RlZmluZSBNT05fMTEJCQlNT05fMTEKKyAgTU9OXzEyLAorI2RlZmluZSBNT05fMTIJCQlNT05fMTIKKworICBBTV9TVFIsCQkJLyogQW50ZSBtZXJpZGllbSBzdHJpbmcuICAqLworI2RlZmluZSBBTV9TVFIJCQlBTV9TVFIKKyAgUE1fU1RSLAkJCS8qIFBvc3QgbWVyaWRpZW0gc3RyaW5nLiAgKi8KKyNkZWZpbmUgUE1fU1RSCQkJUE1fU1RSCisKKyAgRF9UX0ZNVCwJCQkvKiBEYXRlIGFuZCB0aW1lIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworI2RlZmluZSBEX1RfRk1UCQkJRF9UX0ZNVAorICBEX0ZNVCwJCQkvKiBEYXRlIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworI2RlZmluZSBEX0ZNVAkJCURfRk1UCisgIFRfRk1ULAkJCS8qIFRpbWUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisjZGVmaW5lIFRfRk1UCQkJVF9GTVQKKyAgVF9GTVRfQU1QTSwJCQkvKiAxMi1ob3VyIHRpbWUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisjZGVmaW5lIFRfRk1UX0FNUE0JCVRfRk1UX0FNUE0KKworICBFUkEsCQkJCS8qIEFsdGVybmF0ZSBlcmEuICAqLworI2RlZmluZSBFUkEJCQlFUkEKKyAgX19FUkFfWUVBUiwJCQkvKiBZZWFyIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIEVSQV9ZRUFSCQlfX0VSQV9ZRUFSCisjZW5kaWYKKyAgRVJBX0RfRk1ULAkJCS8qIERhdGUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworI2RlZmluZSBFUkFfRF9GTVQJCUVSQV9EX0ZNVAorICBBTFRfRElHSVRTLAkJCS8qIEFsdGVybmF0ZSBzeW1ib2xzIGZvciBkaWdpdHMuICAqLworI2RlZmluZSBBTFRfRElHSVRTCQlBTFRfRElHSVRTCisgIEVSQV9EX1RfRk1ULAkJCS8qIERhdGUgYW5kIHRpbWUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworI2RlZmluZSBFUkFfRF9UX0ZNVAkJRVJBX0RfVF9GTVQKKyAgRVJBX1RfRk1ULAkJCS8qIFRpbWUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworI2RlZmluZSBFUkFfVF9GTVQJCUVSQV9UX0ZNVAorCisgIF9OTF9USU1FX0VSQV9OVU1fRU5UUklFUywJLyogTnVtYmVyIGVudHJpZXMgaW4gdGhlIGVyYSBhcnJheXMuICAqLworICBfTkxfVElNRV9FUkFfRU5UUklFUywJCS8qIFN0cnVjdHVyZSB3aXRoIGVyYSBlbnRyaWVzIGluIHVzYWJsZSBmb3JtLiovCisKKyAgX05MX1dBQkRBWV8xLAkJLyogU3VuICovCisgIF9OTF9XQUJEQVlfMiwKKyAgX05MX1dBQkRBWV8zLAorICBfTkxfV0FCREFZXzQsCisgIF9OTF9XQUJEQVlfNSwKKyAgX05MX1dBQkRBWV82LAorICBfTkxfV0FCREFZXzcsCisKKyAgLyogTG9uZy1uYW1lZCBkYXlzIG9mIHRoZSB3ZWVrLiAqLworICBfTkxfV0RBWV8xLAkJLyogU3VuZGF5ICovCisgIF9OTF9XREFZXzIsCQkvKiBNb25kYXkgKi8KKyAgX05MX1dEQVlfMywJCS8qIFR1ZXNkYXkgKi8KKyAgX05MX1dEQVlfNCwJCS8qIFdlZG5lc2RheSAqLworICBfTkxfV0RBWV81LAkJLyogVGh1cnNkYXkgKi8KKyAgX05MX1dEQVlfNiwJCS8qIEZyaWRheSAqLworICBfTkxfV0RBWV83LAkJLyogU2F0dXJkYXkgKi8KKworICAvKiBBYmJyZXZpYXRlZCBtb250aCBuYW1lcy4gICovCisgIF9OTF9XQUJNT05fMSwJCS8qIEphbiAqLworICBfTkxfV0FCTU9OXzIsCisgIF9OTF9XQUJNT05fMywKKyAgX05MX1dBQk1PTl80LAorICBfTkxfV0FCTU9OXzUsCisgIF9OTF9XQUJNT05fNiwKKyAgX05MX1dBQk1PTl83LAorICBfTkxfV0FCTU9OXzgsCisgIF9OTF9XQUJNT05fOSwKKyAgX05MX1dBQk1PTl8xMCwKKyAgX05MX1dBQk1PTl8xMSwKKyAgX05MX1dBQk1PTl8xMiwKKworICAvKiBMb25nIG1vbnRoIG5hbWVzLiAgKi8KKyAgX05MX1dNT05fMSwJCS8qIEphbnVhcnkgKi8KKyAgX05MX1dNT05fMiwKKyAgX05MX1dNT05fMywKKyAgX05MX1dNT05fNCwKKyAgX05MX1dNT05fNSwKKyAgX05MX1dNT05fNiwKKyAgX05MX1dNT05fNywKKyAgX05MX1dNT05fOCwKKyAgX05MX1dNT05fOSwKKyAgX05MX1dNT05fMTAsCisgIF9OTF9XTU9OXzExLAorICBfTkxfV01PTl8xMiwKKworICBfTkxfV0FNX1NUUiwJCS8qIEFudGUgbWVyaWRpZW0gc3RyaW5nLiAgKi8KKyAgX05MX1dQTV9TVFIsCQkvKiBQb3N0IG1lcmlkaWVtIHN0cmluZy4gICovCisKKyAgX05MX1dEX1RfRk1ULAkJLyogRGF0ZSBhbmQgdGltZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKyAgX05MX1dEX0ZNVCwJCS8qIERhdGUgZm9ybWF0IGZvciBzdHJmdGltZS4gICovCisgIF9OTF9XVF9GTVQsCQkvKiBUaW1lIGZvcm1hdCBmb3Igc3RyZnRpbWUuICAqLworICBfTkxfV1RfRk1UX0FNUE0sCS8qIDEyLWhvdXIgdGltZSBmb3JtYXQgZm9yIHN0cmZ0aW1lLiAgKi8KKworICBfTkxfV0VSQV9ZRUFSLAkvKiBZZWFyIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyAgX05MX1dFUkFfRF9GTVQsCS8qIERhdGUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworICBfTkxfV0FMVF9ESUdJVFMsCS8qIEFsdGVybmF0ZSBzeW1ib2xzIGZvciBkaWdpdHMuICAqLworICBfTkxfV0VSQV9EX1RfRk1ULAkvKiBEYXRlIGFuZCB0aW1lIGluIGFsdGVybmF0ZSBlcmEgZm9ybWF0LiAgKi8KKyAgX05MX1dFUkFfVF9GTVQsCS8qIFRpbWUgaW4gYWx0ZXJuYXRlIGVyYSBmb3JtYXQuICAqLworCisgIF9OTF9USU1FX1dFRUtfTkRBWVMsCisgIF9OTF9USU1FX1dFRUtfMVNUREFZLAorICBfTkxfVElNRV9XRUVLXzFTVFdFRUssCisgIF9OTF9USU1FX0ZJUlNUX1dFRUtEQVksCisgIF9OTF9USU1FX0ZJUlNUX1dPUktEQVksCisgIF9OTF9USU1FX0NBTF9ESVJFQ1RJT04sCisgIF9OTF9USU1FX1RJTUVaT05FLAorCisgIF9EQVRFX0ZNVCwJCS8qIHN0cmZ0aW1lIGZvcm1hdCBmb3IgZGF0ZS4gICovCisjZGVmaW5lIF9EQVRFX0ZNVAlfREFURV9GTVQKKyAgX05MX1dfREFURV9GTVQsCisKKyAgX05MX1RJTUVfQ09ERVNFVCwKKworICBfTkxfTlVNX0xDX1RJTUUsCS8qIE51bWJlciBvZiBpbmRpY2VzIGluIExDX1RJTUUgY2F0ZWdvcnkuICAqLworCisgIC8qIExDX0NPTExBVEUgY2F0ZWdvcnk6IHRleHQgc29ydGluZy4KKyAgICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhY2Nlc3NlZCBieSB0aGUgc3RyY29sbCBhbmQgc3RyeGZybSBmdW5jdGlvbnMuCisgICAgIFRoZXNlIGBubF9sYW5naW5mbycgbmFtZXMgYXJlIHVzZWQgb25seSBpbnRlcm5hbGx5LiAgKi8KKyAgX05MX0NPTExBVEVfTlJVTEVTID0gX05MX0lURU0gKF9fTENfQ09MTEFURSwgMCksCisgIF9OTF9DT0xMQVRFX1JVTEVTRVRTLAorICBfTkxfQ09MTEFURV9UQUJMRU1CLAorICBfTkxfQ09MTEFURV9XRUlHSFRNQiwKKyAgX05MX0NPTExBVEVfRVhUUkFNQiwKKyAgX05MX0NPTExBVEVfSU5ESVJFQ1RNQiwKKyAgX05MX0NPTExBVEVfR0FQMSwKKyAgX05MX0NPTExBVEVfR0FQMiwKKyAgX05MX0NPTExBVEVfR0FQMywKKyAgX05MX0NPTExBVEVfVEFCTEVXQywKKyAgX05MX0NPTExBVEVfV0VJR0hUV0MsCisgIF9OTF9DT0xMQVRFX0VYVFJBV0MsCisgIF9OTF9DT0xMQVRFX0lORElSRUNUV0MsCisgIF9OTF9DT0xMQVRFX1NZTUJfSEFTSF9TSVpFTUIsCisgIF9OTF9DT0xMQVRFX1NZTUJfVEFCTEVNQiwKKyAgX05MX0NPTExBVEVfU1lNQl9FWFRSQU1CLAorICBfTkxfQ09MTEFURV9DT0xMU0VRTUIsCisgIF9OTF9DT0xMQVRFX0NPTExTRVFXQywKKyAgX05MX0NPTExBVEVfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19DT0xMQVRFLAorCisgIC8qIExDX0NUWVBFIGNhdGVnb3J5OiBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24uCisgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9ucyBpbiA8Y3R5cGUuaD4uCisgICAgIFRoZXNlIGBubF9sYW5naW5mbycgbmFtZXMgYXJlIHVzZWQgb25seSBpbnRlcm5hbGx5LiAgKi8KKyAgX05MX0NUWVBFX0NMQVNTID0gX05MX0lURU0gKF9fTENfQ1RZUEUsIDApLAorICBfTkxfQ1RZUEVfVE9VUFBFUiwKKyAgX05MX0NUWVBFX0dBUDEsCisgIF9OTF9DVFlQRV9UT0xPV0VSLAorICBfTkxfQ1RZUEVfR0FQMiwKKyAgX05MX0NUWVBFX0NMQVNTMzIsCisgIF9OTF9DVFlQRV9HQVAzLAorICBfTkxfQ1RZUEVfR0FQNCwKKyAgX05MX0NUWVBFX0dBUDUsCisgIF9OTF9DVFlQRV9HQVA2LAorICBfTkxfQ1RZUEVfQ0xBU1NfTkFNRVMsCisgIF9OTF9DVFlQRV9NQVBfTkFNRVMsCisgIF9OTF9DVFlQRV9XSURUSCwKKyAgX05MX0NUWVBFX01CX0NVUl9NQVgsCisgIF9OTF9DVFlQRV9DT0RFU0VUX05BTUUsCisgIENPREVTRVQgPSBfTkxfQ1RZUEVfQ09ERVNFVF9OQU1FLAorI2RlZmluZSBDT0RFU0VUCQkJQ09ERVNFVAorICBfTkxfQ1RZUEVfVE9VUFBFUjMyLAorICBfTkxfQ1RZUEVfVE9MT1dFUjMyLAorICBfTkxfQ1RZUEVfQ0xBU1NfT0ZGU0VULAorICBfTkxfQ1RZUEVfTUFQX09GRlNFVCwKKyAgX05MX0NUWVBFX0lORElHSVRTX01CX0xFTiwKKyAgX05MX0NUWVBFX0lORElHSVRTMF9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTMV9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTMl9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTM19NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTNF9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTNV9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTNl9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTN19NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTOF9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTOV9NQiwKKyAgX05MX0NUWVBFX0lORElHSVRTX1dDX0xFTiwKKyAgX05MX0NUWVBFX0lORElHSVRTMF9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTMV9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTMl9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTM19XQywKKyAgX05MX0NUWVBFX0lORElHSVRTNF9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTNV9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTNl9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTN19XQywKKyAgX05MX0NUWVBFX0lORElHSVRTOF9XQywKKyAgX05MX0NUWVBFX0lORElHSVRTOV9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUMF9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUMV9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUMl9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUM19NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUNF9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUNV9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUNl9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUN19NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUOF9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUOV9NQiwKKyAgX05MX0NUWVBFX09VVERJR0lUMF9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUMV9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUMl9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUM19XQywKKyAgX05MX0NUWVBFX09VVERJR0lUNF9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUNV9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUNl9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUN19XQywKKyAgX05MX0NUWVBFX09VVERJR0lUOF9XQywKKyAgX05MX0NUWVBFX09VVERJR0lUOV9XQywKKyAgX05MX0NUWVBFX1RSQU5TTElUX1RBQl9TSVpFLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfRlJPTV9JRFgsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9GUk9NX1RCTCwKKyAgX05MX0NUWVBFX1RSQU5TTElUX1RPX0lEWCwKKyAgX05MX0NUWVBFX1RSQU5TTElUX1RPX1RCTCwKKyAgX05MX0NUWVBFX1RSQU5TTElUX0RFRkFVTFRfTUlTU0lOR19MRU4sCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9ERUZBVUxUX01JU1NJTkcsCisgIF9OTF9DVFlQRV9UUkFOU0xJVF9JR05PUkVfTEVOLAorICBfTkxfQ1RZUEVfVFJBTlNMSVRfSUdOT1JFLAorICBfTkxfQ1RZUEVfTUFQX1RPX05PTkFTQ0lJLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzEsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfMiwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF8zLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzQsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfNSwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF82LAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzcsCisgIF9OTF9DVFlQRV9FWFRSQV9NQVBfOCwKKyAgX05MX0NUWVBFX0VYVFJBX01BUF85LAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzEwLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzExLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzEyLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzEzLAorICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzE0LAorICBfTkxfTlVNX0xDX0NUWVBFLAorCisgIC8qIExDX01PTkVUQVJZIGNhdGVnb3J5OiBmb3JtYXR0aW5nIG9mIG1vbmV0YXJ5IHF1YW50aXRpZXMuCisgICAgIFRoZXNlIGl0ZW1zIGVhY2ggY29ycmVzcG9uZCB0byBhIG1lbWJlciBvZiBgc3RydWN0IGxjb252JywKKyAgICAgZGVmaW5lZCBpbiA8bG9jYWxlLmg+LiAgKi8KKyAgX19JTlRfQ1VSUl9TWU1CT0wgPSBfTkxfSVRFTSAoX19MQ19NT05FVEFSWSwgMCksCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfQ1VSUl9TWU1CT0wJX19JTlRfQ1VSUl9TWU1CT0wKKyNlbmRpZgorICBfX0NVUlJFTkNZX1NZTUJPTCwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIENVUlJFTkNZX1NZTUJPTAlfX0NVUlJFTkNZX1NZTUJPTAorI2VuZGlmCisgIF9fTU9OX0RFQ0lNQUxfUE9JTlQsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBNT05fREVDSU1BTF9QT0lOVAlfX01PTl9ERUNJTUFMX1BPSU5UCisjZW5kaWYKKyAgX19NT05fVEhPVVNBTkRTX1NFUCwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1PTl9USE9VU0FORFNfU0VQCV9fTU9OX1RIT1VTQU5EU19TRVAKKyNlbmRpZgorICBfX01PTl9HUk9VUElORywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1PTl9HUk9VUElORwkJX19NT05fR1JPVVBJTkcKKyNlbmRpZgorICBfX1BPU0lUSVZFX1NJR04sCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBQT1NJVElWRV9TSUdOCQlfX1BPU0lUSVZFX1NJR04KKyNlbmRpZgorICBfX05FR0FUSVZFX1NJR04sCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBORUdBVElWRV9TSUdOCQlfX05FR0FUSVZFX1NJR04KKyNlbmRpZgorICBfX0lOVF9GUkFDX0RJR0lUUywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9GUkFDX0RJR0lUUwlfX0lOVF9GUkFDX0RJR0lUUworI2VuZGlmCisgIF9fRlJBQ19ESUdJVFMsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBGUkFDX0RJR0lUUwkJX19GUkFDX0RJR0lUUworI2VuZGlmCisgIF9fUF9DU19QUkVDRURFUywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFBfQ1NfUFJFQ0VERVMJCV9fUF9DU19QUkVDRURFUworI2VuZGlmCisgIF9fUF9TRVBfQllfU1BBQ0UsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBQX1NFUF9CWV9TUEFDRQkJX19QX1NFUF9CWV9TUEFDRQorI2VuZGlmCisgIF9fTl9DU19QUkVDRURFUywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE5fQ1NfUFJFQ0VERVMJCV9fTl9DU19QUkVDRURFUworI2VuZGlmCisgIF9fTl9TRVBfQllfU1BBQ0UsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBOX1NFUF9CWV9TUEFDRQkJX19OX1NFUF9CWV9TUEFDRQorI2VuZGlmCisgIF9fUF9TSUdOX1BPU04sCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBQX1NJR05fUE9TTgkJX19QX1NJR05fUE9TTgorI2VuZGlmCisgIF9fTl9TSUdOX1BPU04sCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBOX1NJR05fUE9TTgkJX19OX1NJR05fUE9TTgorI2VuZGlmCisgIF9OTF9NT05FVEFSWV9DUk5DWVNUUiwKKyNkZWZpbmUgQ1JOQ1lTVFIJCV9OTF9NT05FVEFSWV9DUk5DWVNUUgorICBfX0lOVF9QX0NTX1BSRUNFREVTLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX1BfQ1NfUFJFQ0VERVMJX19JTlRfUF9DU19QUkVDRURFUworI2VuZGlmCisgIF9fSU5UX1BfU0VQX0JZX1NQQUNFLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX1BfU0VQX0JZX1NQQUNFCV9fSU5UX1BfU0VQX0JZX1NQQUNFCisjZW5kaWYKKyAgX19JTlRfTl9DU19QUkVDRURFUywKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9OX0NTX1BSRUNFREVTCV9fSU5UX05fQ1NfUFJFQ0VERVMKKyNlbmRpZgorICBfX0lOVF9OX1NFUF9CWV9TUEFDRSwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIElOVF9OX1NFUF9CWV9TUEFDRQlfX0lOVF9OX1NFUF9CWV9TUEFDRQorI2VuZGlmCisgIF9fSU5UX1BfU0lHTl9QT1NOLAorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgSU5UX1BfU0lHTl9QT1NOCV9fSU5UX1BfU0lHTl9QT1NOCisjZW5kaWYKKyAgX19JTlRfTl9TSUdOX1BPU04sCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBJTlRfTl9TSUdOX1BPU04JX19JTlRfTl9TSUdOX1BPU04KKyNlbmRpZgorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9DVVJSX1NZTUJPTCwKKyAgX05MX01PTkVUQVJZX0RVT19DVVJSRU5DWV9TWU1CT0wsCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX0ZSQUNfRElHSVRTLAorICBfTkxfTU9ORVRBUllfRFVPX0ZSQUNfRElHSVRTLAorICBfTkxfTU9ORVRBUllfRFVPX1BfQ1NfUFJFQ0VERVMsCisgIF9OTF9NT05FVEFSWV9EVU9fUF9TRVBfQllfU1BBQ0UsCisgIF9OTF9NT05FVEFSWV9EVU9fTl9DU19QUkVDRURFUywKKyAgX05MX01PTkVUQVJZX0RVT19OX1NFUF9CWV9TUEFDRSwKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfUF9DU19QUkVDRURFUywKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfUF9TRVBfQllfU1BBQ0UsCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX05fQ1NfUFJFQ0VERVMsCisgIF9OTF9NT05FVEFSWV9EVU9fSU5UX05fU0VQX0JZX1NQQUNFLAorICBfTkxfTU9ORVRBUllfRFVPX1BfU0lHTl9QT1NOLAorICBfTkxfTU9ORVRBUllfRFVPX05fU0lHTl9QT1NOLAorICBfTkxfTU9ORVRBUllfRFVPX0lOVF9QX1NJR05fUE9TTiwKKyAgX05MX01PTkVUQVJZX0RVT19JTlRfTl9TSUdOX1BPU04sCisgIF9OTF9NT05FVEFSWV9VTk9fVkFMSURfRlJPTSwKKyAgX05MX01PTkVUQVJZX1VOT19WQUxJRF9UTywKKyAgX05MX01PTkVUQVJZX0RVT19WQUxJRF9GUk9NLAorICBfTkxfTU9ORVRBUllfRFVPX1ZBTElEX1RPLAorICBfTkxfTU9ORVRBUllfQ09OVkVSU0lPTl9SQVRFLAorICBfTkxfTU9ORVRBUllfREVDSU1BTF9QT0lOVF9XQywKKyAgX05MX01PTkVUQVJZX1RIT1VTQU5EU19TRVBfV0MsCisgIF9OTF9NT05FVEFSWV9DT0RFU0VULAorICBfTkxfTlVNX0xDX01PTkVUQVJZLAorCisgIC8qIExDX05VTUVSSUMgY2F0ZWdvcnk6IGZvcm1hdHRpbmcgb2YgbnVtYmVycy4KKyAgICAgVGhlc2UgYWxzbyBjb3JyZXNwb25kIHRvIG1lbWJlcnMgb2YgYHN0cnVjdCBsY29udic7IHNlZSA8bG9jYWxlLmg+LiAgKi8KKyAgX19ERUNJTUFMX1BPSU5UID0gX05MX0lURU0gKF9fTENfTlVNRVJJQywgMCksCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBERUNJTUFMX1BPSU5UCQlfX0RFQ0lNQUxfUE9JTlQKKyNlbmRpZgorICBSQURJWENIQVIgPSBfX0RFQ0lNQUxfUE9JTlQsCisjZGVmaW5lIFJBRElYQ0hBUgkJUkFESVhDSEFSCisgIF9fVEhPVVNBTkRTX1NFUCwKKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIFRIT1VTQU5EU19TRVAJCV9fVEhPVVNBTkRTX1NFUAorI2VuZGlmCisgIFRIT1VTRVAgPSBfX1RIT1VTQU5EU19TRVAsCisjZGVmaW5lIFRIT1VTRVAJCQlUSE9VU0VQCisgIF9fR1JPVVBJTkcsCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBHUk9VUElORwkJX19HUk9VUElORworI2VuZGlmCisgIF9OTF9OVU1FUklDX0RFQ0lNQUxfUE9JTlRfV0MsCisgIF9OTF9OVU1FUklDX1RIT1VTQU5EU19TRVBfV0MsCisgIF9OTF9OVU1FUklDX0NPREVTRVQsCisgIF9OTF9OVU1fTENfTlVNRVJJQywKKworICBfX1lFU0VYUFIgPSBfTkxfSVRFTSAoX19MQ19NRVNTQUdFUywgMCksIC8qIFJlZ2V4IG1hdGNoaW5nIGBgeWVzJycgaW5wdXQuICAqLworI2RlZmluZSBZRVNFWFBSCQkJX19ZRVNFWFBSCisgIF9fTk9FWFBSLAkJCS8qIFJlZ2V4IG1hdGNoaW5nIGBgbm8nJyBpbnB1dC4gICovCisjZGVmaW5lIE5PRVhQUgkJCV9fTk9FWFBSCisgIF9fWUVTU1RSLAkJCS8qIE91dHB1dCBzdHJpbmcgZm9yIGBgeWVzJycuICAqLworI2lmIGRlZmluZWQgX19VU0VfR05VIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisjIGRlZmluZSBZRVNTVFIJCQlfX1lFU1NUUgorI2VuZGlmCisgIF9fTk9TVFIsCQkJLyogT3V0cHV0IHN0cmluZyBmb3IgYGBubycnLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyBkZWZpbmUgTk9TVFIJCQlfX05PU1RSCisjZW5kaWYKKyAgX05MX01FU1NBR0VTX0NPREVTRVQsCisgIF9OTF9OVU1fTENfTUVTU0FHRVMsCisKKyAgX05MX1BBUEVSX0hFSUdIVCA9IF9OTF9JVEVNIChfX0xDX1BBUEVSLCAwKSwKKyAgX05MX1BBUEVSX1dJRFRILAorICBfTkxfUEFQRVJfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19QQVBFUiwKKworICBfTkxfTkFNRV9OQU1FX0ZNVCA9IF9OTF9JVEVNIChfX0xDX05BTUUsIDApLAorICBfTkxfTkFNRV9OQU1FX0dFTiwKKyAgX05MX05BTUVfTkFNRV9NUiwKKyAgX05MX05BTUVfTkFNRV9NUlMsCisgIF9OTF9OQU1FX05BTUVfTUlTUywKKyAgX05MX05BTUVfTkFNRV9NUywKKyAgX05MX05BTUVfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19OQU1FLAorCisgIF9OTF9BRERSRVNTX1BPU1RBTF9GTVQgPSBfTkxfSVRFTSAoX19MQ19BRERSRVNTLCAwKSwKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9OQU1FLAorICBfTkxfQUREUkVTU19DT1VOVFJZX1BPU1QsCisgIF9OTF9BRERSRVNTX0NPVU5UUllfQUIyLAorICBfTkxfQUREUkVTU19DT1VOVFJZX0FCMywKKyAgX05MX0FERFJFU1NfQ09VTlRSWV9DQVIsCisgIF9OTF9BRERSRVNTX0NPVU5UUllfTlVNLAorICBfTkxfQUREUkVTU19DT1VOVFJZX0lTQk4sCisgIF9OTF9BRERSRVNTX0xBTkdfTkFNRSwKKyAgX05MX0FERFJFU1NfTEFOR19BQiwKKyAgX05MX0FERFJFU1NfTEFOR19URVJNLAorICBfTkxfQUREUkVTU19MQU5HX0xJQiwKKyAgX05MX0FERFJFU1NfQ09ERVNFVCwKKyAgX05MX05VTV9MQ19BRERSRVNTLAorCisgIF9OTF9URUxFUEhPTkVfVEVMX0lOVF9GTVQgPSBfTkxfSVRFTSAoX19MQ19URUxFUEhPTkUsIDApLAorICBfTkxfVEVMRVBIT05FX1RFTF9ET01fRk1ULAorICBfTkxfVEVMRVBIT05FX0lOVF9TRUxFQ1QsCisgIF9OTF9URUxFUEhPTkVfSU5UX1BSRUZJWCwKKyAgX05MX1RFTEVQSE9ORV9DT0RFU0VULAorICBfTkxfTlVNX0xDX1RFTEVQSE9ORSwKKworICBfTkxfTUVBU1VSRU1FTlRfTUVBU1VSRU1FTlQgPSBfTkxfSVRFTSAoX19MQ19NRUFTVVJFTUVOVCwgMCksCisgIF9OTF9NRUFTVVJFTUVOVF9DT0RFU0VULAorICBfTkxfTlVNX0xDX01FQVNVUkVNRU5ULAorCisgIF9OTF9JREVOVElGSUNBVElPTl9USVRMRSA9IF9OTF9JVEVNIChfX0xDX0lERU5USUZJQ0FUSU9OLCAwKSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX1NPVVJDRSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0FERFJFU1MsCisgIF9OTF9JREVOVElGSUNBVElPTl9DT05UQUNULAorICBfTkxfSURFTlRJRklDQVRJT05fRU1BSUwsCisgIF9OTF9JREVOVElGSUNBVElPTl9URUwsCisgIF9OTF9JREVOVElGSUNBVElPTl9GQVgsCisgIF9OTF9JREVOVElGSUNBVElPTl9MQU5HVUFHRSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX1RFUlJJVE9SWSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0FVRElFTkNFLAorICBfTkxfSURFTlRJRklDQVRJT05fQVBQTElDQVRJT04sCisgIF9OTF9JREVOVElGSUNBVElPTl9BQkJSRVZJQVRJT04sCisgIF9OTF9JREVOVElGSUNBVElPTl9SRVZJU0lPTiwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0RBVEUsCisgIF9OTF9JREVOVElGSUNBVElPTl9DQVRFR09SWSwKKyAgX05MX0lERU5USUZJQ0FUSU9OX0NPREVTRVQsCisgIF9OTF9OVU1fTENfSURFTlRJRklDQVRJT04sCisKKyAgLyogVGhpcyBtYXJrcyB0aGUgaGlnaGVzdCB2YWx1ZSB1c2VkLiAgKi8KKyAgX05MX05VTQorfTsKKworLyogVGhpcyBtYWNybyBwcm9kdWNlcyBhbiBpdGVtIHlvdSBjYW4gcGFzcyB0byBgbmxfbGFuZ2luZm8nIG9yCisgICBgbmxfbGFuZ2luZm9fbCcgdG8gZ2V0IHRoZSBuYW1lIG9mIHRoZSBsb2NhbGUgaW4gdXNlIGZvciBDQVRFR09SWS4gICovCisjZGVmaW5lIF9OTF9MT0NBTEVfTkFNRShjYXRlZ29yeSkJX05MX0lURU0gKChjYXRlZ29yeSksIC0xKQorI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgTkxfTE9DQUxFX05BTUUoY2F0ZWdvcnkpCV9OTF9MT0NBTEVfTkFNRSAoY2F0ZWdvcnkpCisjZW5kaWYKKworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgbG9jYWxlJ3MgdmFsdWUgZm9yIElURU0uCisgICBJZiBJVEVNIGlzIGludmFsaWQsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworICAgVGhlIHN0cmluZyByZXR1cm5lZCB3aWxsIG5vdCBjaGFuZ2UgdW50aWwgYHNldGxvY2FsZScgaXMgY2FsbGVkOworICAgaXQgaXMgdXN1YWxseSBpbiByZWFkLW9ubHkgbWVtb3J5IGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQuICAqLworCitleHRlcm4gY2hhciAqbmxfbGFuZ2luZm8gKG5sX2l0ZW0gX19pdGVtKSBfX1RIUk9XOworCisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIFRoaXMgaW50ZXJmYWNlIGlzIGZvciB0aGUgZXh0ZW5kZWQgbG9jYWxlIG1vZGVsLiAgU2VlIDxsb2NhbGUuaD4gZm9yCisgICBtb3JlIGluZm9ybWF0aW9uLiAgKi8KKworLyogR2V0IGxvY2FsZSBkYXRhdHlwZSBkZWZpbml0aW9uLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBKdXN0IGxpa2UgbmxfbGFuZ2luZm8gYnV0IGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbG9jYWxlIG9iamVjdCBMLiAgKi8KK2V4dGVybiBjaGFyICpubF9sYW5naW5mb19sIChubF9pdGVtIF9faXRlbSwgX19sb2NhbGVfdCBsKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbGFuZ2luZm8uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9sYXN0bG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xhc3Rsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M0MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9sYXN0bG9nLmgKQEAgLTAsMCArMSw0IEBACisvKiBUaGlzIGhlYWRlciBmaWxlIGlzIHVzZWQgaW4gNC4zQlNEIHRvIGRlZmluZSBgc3RydWN0IGxhc3Rsb2cnLAorICAgd2hpY2ggd2UgZGVmaW5lIGluIDxiaXRzL3V0bXAuaD4uICAqLworCisjaW5jbHVkZSA8dXRtcC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saWJnZW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MjU0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliZ2VuLmgKQEAgLTAsMCArMSw0MCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MSUJHRU5fSAorI2RlZmluZSBfTElCR0VOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gZGlyZWN0b3J5IHBhcnQgb2YgUEFUSCBvciAiLiIgaWYgbm9uZSBpcyBhdmFpbGFibGUuICAqLworZXh0ZXJuIGNoYXIgKmRpcm5hbWUgKGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworLyogUmV0dXJuIGZpbmFsIGNvbXBvbmVudCBvZiBQQVRILgorCisgICBUaGlzIGlzIHRoZSB3ZWlyZCBYUEcgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLiAgSXQgc29tZXRpbWVzIHdpbGwKKyAgIG1vZGlmeSBpdHMgYXJndW1lbnQuICBUaGVyZWZvcmUgd2Ugbm9ybWFsbHkgdXNlIHRoZSBHTlUgdmVyc2lvbiAoaW4KKyAgIDxzdHJpbmcuaD4pIGFuZCBvbmx5IGlmIHRoaXMgaGVhZGVyIGlzIGluY2x1ZGVkIG1ha2UgdGhlIFhQRworICAgdmVyc2lvbiBhdmFpbGFibGUgdW5kZXIgdGhlIHJlYWwgbmFtZS4gICovCitleHRlcm4gY2hhciAqX194cGdfYmFzZW5hbWUgKGNoYXIgKl9fcGF0aCkgX19USFJPVzsKKyNkZWZpbmUgYmFzZW5hbWUJX194cGdfYmFzZW5hbWUKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIGxpYmdlbi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmludGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliaW50bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmludGwuaApAQCAtMCwwICsxLDEyNCBAQAorLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiwgMjAwNCwgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBsaWJnZXR0ZXh0LmggaW4gdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2UuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MSUJJTlRMX0gKKyNkZWZpbmUgX0xJQklOVExfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKyAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLworI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisKKy8qIFByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cHBvcnRlZCBmaWxlIGZvcm1hdHMuICBSZXR1cm5zIHRoZQorICAgbWF4aW11bSBtaW5vciByZXZpc2lvbiBudW1iZXIgc3VwcG9ydGVkIGZvciBhIGdpdmVuIG1ham9yIHJldmlzaW9uLiAgKi8KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpIFwKKyAgKChtYWpvcikgPT0gMCA/IDEgOiAtMSkKKworX19CRUdJTl9ERUNMUworCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKKyAgIHRleHQpLiAgKi8KK2V4dGVybiBjaGFyICpnZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgxKTsKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLworZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgX19jb25zdCBjaGFyICpfX21zZ2lkKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMik7CitleHRlcm4gY2hhciAqX19kZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIF9fY29uc3QgY2hhciAqX19tc2dpZCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDIpOworCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKyAgIGxvY2FsZS4gICovCitleHRlcm4gY2hhciAqZGNnZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCV9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKK2V4dGVybiBjaGFyICpfX2RjZ2V0dGV4dCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKKworCisvKiBTaW1pbGFyIHRvIGBnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworZXh0ZXJuIGNoYXIgKm5nZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fbXNnaWQxLCBfX2NvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMSkgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKTsKKworLyogU2ltaWxhciB0byBgZGdldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCitleHRlcm4gY2hhciAqZG5nZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgX19jb25zdCBjaGFyICpfX21zZ2lkMSwKKwkJCV9fY29uc3QgY2hhciAqX19tc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDIpIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyAoMyk7CisKKy8qIFNpbWlsYXIgdG8gYGRjZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KK2V4dGVybiBjaGFyICpkY25nZXR0ZXh0IChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgX19jb25zdCBjaGFyICpfX21zZ2lkMSwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24sCisJCQkgaW50IF9fY2F0ZWdvcnkpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fICgyKSBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18gKDMpOworCisKKy8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgorICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KKyAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLworZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lKSBfX1RIUk9XOworCisvKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KK2V4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19kaXJuYW1lKSBfX1RIUk9XOworCisvKiBTcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gd2hpY2ggdGhlIG1lc3NhZ2VzIGZyb20gdGhlCisgICBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLiAgKi8KK2V4dGVybiBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgICAgX19jb25zdCBjaGFyICpfX2NvZGVzZXQpIF9fVEhST1c7CisKKworLyogT3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIGFib3ZlLiAgKi8KKyNpZiBkZWZpbmVkIF9fT1BUSU1JWkVfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworCisvKiBXZSBuZWVkIE5VTEwgZm9yIGBnZXR0ZXh0Jy4gICovCisjIGRlZmluZSBfX25lZWRfTlVMTAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogV2UgbmVlZCBMQ19NRVNTQUdFUyBmb3IgYGRnZXR0ZXh0Jy4gICovCisjIGluY2x1ZGUgPGxvY2FsZS5oPgorCisvKiBUaGVzZSBtdXN0IGJlIG1hY3Jvcy4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCisgICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgorICAgZmFsc2UuICAqLworCisjIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoTlVMTCwgbXNnaWQpCisKKyMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKSBcCisgIGRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKQorCisjIGRlZmluZSBuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikgZG5nZXR0ZXh0IChOVUxMLCBtc2dpZDEsIG1zZ2lkMiwgbikKKworIyBkZWZpbmUgZG5nZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuKSBcCisgIGRjbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBMQ19NRVNTQUdFUykKKworI2VuZGlmCS8qIE9wdGltaXppbmcuICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpYmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzODEyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGliaW8uaApAQCAtMCwwICsxLDU1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTUsMTk5Ny0yMDA2LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuCisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoZSBjb2RlIGluIHRoaXMgZmlsZSB3aXRoCisgICBmaWxlcyBjb21waWxlZCB3aXRoIGEgR05VIGNvbXBpbGVyIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKKyAgIHRoYXQgZG9lcyBub3QgY2F1c2UgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkKKyAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdAorICAgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlCisgICBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICBUaGlzIGV4Y2VwdGlvbiBhcHBsaWVzIHRvIGNvZGUgcmVsZWFzZWQgYnkgaXRzIGNvcHlyaWdodCBob2xkZXJzCisgICBpbiBmaWxlcyBjb250YWluaW5nIHRoZSBleGNlcHRpb24uICAqLworCisjaWZuZGVmIF9JT19TVERJT19ICisjZGVmaW5lIF9JT19TVERJT19ICisKKyNpbmNsdWRlIDxfR19jb25maWcuaD4KKy8qIEFMTCBvZiB0aGVzZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBfR19jb25maWcuaCAqLworI2RlZmluZSBfSU9fcG9zX3QgX0dfZnBvc190IC8qIG9ic29sZXRlICovCisjZGVmaW5lIF9JT19mcG9zX3QgX0dfZnBvc190CisjZGVmaW5lIF9JT19mcG9zNjRfdCBfR19mcG9zNjRfdAorI2RlZmluZSBfSU9fc2l6ZV90IF9HX3NpemVfdAorI2RlZmluZSBfSU9fc3NpemVfdCBfR19zc2l6ZV90CisjZGVmaW5lIF9JT19vZmZfdCBfR19vZmZfdAorI2RlZmluZSBfSU9fb2ZmNjRfdCBfR19vZmY2NF90CisjZGVmaW5lIF9JT19waWRfdCBfR19waWRfdAorI2RlZmluZSBfSU9fdWlkX3QgX0dfdWlkX3QKKyNkZWZpbmUgX0lPX2ljb252X3QgX0dfaWNvbnZfdAorI2RlZmluZSBfSU9fSEFWRV9TWVNfV0FJVCBfR19IQVZFX1NZU19XQUlUCisjZGVmaW5lIF9JT19IQVZFX1NUX0JMS1NJWkUgX0dfSEFWRV9TVF9CTEtTSVpFCisjZGVmaW5lIF9JT19CVUZTSVogX0dfQlVGU0laCisjZGVmaW5lIF9JT192YV9saXN0IF9HX3ZhX2xpc3QKKyNkZWZpbmUgX0lPX3dpbnRfdCBfR193aW50X3QKKworI2lmZGVmIF9HX05FRURfU1REQVJHX0gKKy8qIFRoaXMgZGVmaW5lIGF2b2lkcyBuYW1lIHBvbGx1dGlvbiBpZiB3ZSdyZSB1c2luZyBHTlUgc3RkYXJnLmggKi8KKyMgZGVmaW5lIF9fbmVlZF9fX3ZhX2xpc3QKKyMgaW5jbHVkZSA8c3RkYXJnLmg+CisjIGlmZGVmIF9fR05VQ19WQV9MSVNUCisjICB1bmRlZiBfSU9fdmFfbGlzdAorIyAgZGVmaW5lIF9JT192YV9saXN0IF9fZ251Y192YV9saXN0CisjIGVuZGlmIC8qIF9fR05VQ19WQV9MSVNUICovCisjZW5kaWYKKworI2lmbmRlZiBfX1AKKyMgaWYgX0dfSEFWRV9TWVNfQ0RFRlMKKyMgIGluY2x1ZGUgPHN5cy9jZGVmcy5oPgorIyBlbHNlCisjICBpZmRlZiBfX1NURENfXworIyAgIGRlZmluZSBfX1AocCkgcAorIyAgIGRlZmluZSBfX1BNVChwKSBwCisjICBlbHNlCisjICAgZGVmaW5lIF9fUChwKSAoKQorIyAgIGRlZmluZSBfX1BNVChwKSAoKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiFfX1AqLworCisvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2lmbmRlZiBfUEFSQU1TCisjIGRlZmluZSBfUEFSQU1TKHByb3RvcykgX19QKHByb3RvcykKKyNlbmRpZiAvKiFfUEFSQU1TKi8KKworI2lmbmRlZiBfX1NURENfXworIyBpZm5kZWYgY29uc3QKKyMgIGRlZmluZSBjb25zdAorIyBlbmRpZgorI2VuZGlmCisjZGVmaW5lIF9JT19VTklGSUVEX0pVTVBUQUJMRVMgMQorI2lmbmRlZiBfR19IQVZFX1BSSU5URl9GUAorIyBkZWZpbmUgX0lPX1VTRV9EVE9BIDEKKyNlbmRpZgorCisjaWZuZGVmIEVPRgorIyBkZWZpbmUgRU9GICgtMSkKKyNlbmRpZgorI2lmbmRlZiBOVUxMCisjIGlmIGRlZmluZWQgX19HTlVHX18gJiYgXAorICAgIChfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gOCkpCisjICBkZWZpbmUgTlVMTCAoX19udWxsKQorIyBlbHNlCisjICBpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICBkZWZpbmUgTlVMTCAoKHZvaWQqKTApCisjICBlbHNlCisjICAgZGVmaW5lIE5VTEwgKDApCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX0lPU19JTlBVVAkxCisjZGVmaW5lIF9JT1NfT1VUUFVUCTIKKyNkZWZpbmUgX0lPU19BVEVORAk0CisjZGVmaW5lIF9JT1NfQVBQRU5ECTgKKyNkZWZpbmUgX0lPU19UUlVOQwkxNgorI2RlZmluZSBfSU9TX05PQ1JFQVRFCTMyCisjZGVmaW5lIF9JT1NfTk9SRVBMQUNFCTY0CisjZGVmaW5lIF9JT1NfQklOCTEyOAorCisvKiBNYWdpYyBudW1iZXJzIGFuZCBiaXRzIGZvciB0aGUgX2ZsYWdzIGZpZWxkLgorICAgVGhlIG1hZ2ljIG51bWJlcnMgdXNlIHRoZSBoaWdoLW9yZGVyIGJpdHMgb2YgX2ZsYWdzOworICAgdGhlIHJlbWFpbmluZyBiaXRzIGFyZSBhdmFpbGFibGUgZm9yIHZhcmlhYmxlIGZsYWdzLgorICAgTm90ZTogVGhlIG1hZ2ljIG51bWJlcnMgbXVzdCBhbGwgYmUgbmVnYXRpdmUgaWYgc3RkaW8KKyAgIGVtdWxhdGlvbiBpcyBkZXNpcmVkLiAqLworCisjZGVmaW5lIF9JT19NQUdJQyAweEZCQUQwMDAwIC8qIE1hZ2ljIG51bWJlciAqLworI2RlZmluZSBfT0xEX1NURElPX01BR0lDIDB4RkFCQzAwMDAgLyogRW11bGF0ZSBvbGQgc3RkaW8uICovCisjZGVmaW5lIF9JT19NQUdJQ19NQVNLIDB4RkZGRjAwMDAKKyNkZWZpbmUgX0lPX1VTRVJfQlVGIDEgLyogVXNlciBvd25zIGJ1ZmZlcjsgZG9uJ3QgZGVsZXRlIGl0IG9uIGNsb3NlLiAqLworI2RlZmluZSBfSU9fVU5CVUZGRVJFRCAyCisjZGVmaW5lIF9JT19OT19SRUFEUyA0IC8qIFJlYWRpbmcgbm90IGFsbG93ZWQgKi8KKyNkZWZpbmUgX0lPX05PX1dSSVRFUyA4IC8qIFdyaXRpbmcgbm90IGFsbG93ZCAqLworI2RlZmluZSBfSU9fRU9GX1NFRU4gMHgxMAorI2RlZmluZSBfSU9fRVJSX1NFRU4gMHgyMAorI2RlZmluZSBfSU9fREVMRVRFX0RPTlRfQ0xPU0UgMHg0MCAvKiBEb24ndCBjYWxsIGNsb3NlKF9maWxlbm8pIG9uIGNsZWFudXAuICovCisjZGVmaW5lIF9JT19MSU5LRUQgMHg4MCAvKiBTZXQgaWYgbGlua2VkICh1c2luZyBfY2hhaW4pIHRvIHN0cmVhbWJ1Zjo6X2xpc3RfYWxsLiovCisjZGVmaW5lIF9JT19JTl9CQUNLVVAgMHgxMDAKKyNkZWZpbmUgX0lPX0xJTkVfQlVGIDB4MjAwCisjZGVmaW5lIF9JT19USUVEX1BVVF9HRVQgMHg0MDAgLyogU2V0IGlmIHB1dCBhbmQgZ2V0IHBvaW50ZXIgbG9naWNseSB0aWVkLiAqLworI2RlZmluZSBfSU9fQ1VSUkVOVExZX1BVVFRJTkcgMHg4MDAKKyNkZWZpbmUgX0lPX0lTX0FQUEVORElORyAweDEwMDAKKyNkZWZpbmUgX0lPX0lTX0ZJTEVCVUYgMHgyMDAwCisjZGVmaW5lIF9JT19CQURfU0VFTiAweDQwMDAKKyNkZWZpbmUgX0lPX1VTRVJfTE9DSyAweDgwMDAKKworI2RlZmluZSBfSU9fRkxBR1MyX01NQVAgMQorI2RlZmluZSBfSU9fRkxBR1MyX05PVENBTkNFTCAyCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIF9JT19GTEFHUzJfRk9SVElGWSA0CisjZW5kaWYKKyNkZWZpbmUgX0lPX0ZMQUdTMl9VU0VSX1dCVUYgOAorI2lmZGVmIF9MSUJDCisjIGRlZmluZSBfSU9fRkxBR1MyX1NDQU5GX1NURCAxNgorI2VuZGlmCisKKy8qIFRoZXNlIGFyZSAiZm9ybWF0dGluZyBmbGFncyIgbWF0Y2hpbmcgdGhlIGlvc3RyZWFtIGZtdGZsYWdzIGVudW0gdmFsdWVzLiAqLworI2RlZmluZSBfSU9fU0tJUFdTIDAxCisjZGVmaW5lIF9JT19MRUZUIDAyCisjZGVmaW5lIF9JT19SSUdIVCAwNAorI2RlZmluZSBfSU9fSU5URVJOQUwgMDEwCisjZGVmaW5lIF9JT19ERUMgMDIwCisjZGVmaW5lIF9JT19PQ1QgMDQwCisjZGVmaW5lIF9JT19IRVggMDEwMAorI2RlZmluZSBfSU9fU0hPV0JBU0UgMDIwMAorI2RlZmluZSBfSU9fU0hPV1BPSU5UIDA0MDAKKyNkZWZpbmUgX0lPX1VQUEVSQ0FTRSAwMTAwMAorI2RlZmluZSBfSU9fU0hPV1BPUyAwMjAwMAorI2RlZmluZSBfSU9fU0NJRU5USUZJQyAwNDAwMAorI2RlZmluZSBfSU9fRklYRUQgMDEwMDAwCisjZGVmaW5lIF9JT19VTklUQlVGIDAyMDAwMAorI2RlZmluZSBfSU9fU1RESU8gMDQwMDAwCisjZGVmaW5lIF9JT19ET05UX0NMT1NFIDAxMDAwMDAKKyNkZWZpbmUgX0lPX0JPT0xBTFBIQSAwMjAwMDAwCisKKworc3RydWN0IF9JT19qdW1wX3Q7ICBzdHJ1Y3QgX0lPX0ZJTEU7CisKKy8qIEhhbmRsZSBsb2NrLiAgKi8KKyNpZmRlZiBfSU9fTVRTQUZFX0lPCisjIGlmIGRlZmluZWQgX19HTElCQ19fICYmIF9fR0xJQkNfXyA+PSAyCisjICBpbmNsdWRlIDxiaXRzL3N0ZGlvLWxvY2suaD4KKyMgZWxzZQorLyojIGluY2x1ZGUgPGNvbXRocmVhZC5oPiovCisjIGVuZGlmCisjZWxzZQordHlwZWRlZiB2b2lkIF9JT19sb2NrX3Q7CisjZW5kaWYKKworCisvKiBBIHN0cmVhbW1hcmtlciByZW1lbWJlcnMgYSBwb3NpdGlvbiBpbiBhIGJ1ZmZlci4gKi8KKworc3RydWN0IF9JT19tYXJrZXIgeworICBzdHJ1Y3QgX0lPX21hcmtlciAqX25leHQ7CisgIHN0cnVjdCBfSU9fRklMRSAqX3NidWY7CisgIC8qIElmIF9wb3MgPj0gMAorIGl0IHBvaW50cyB0byBfYnVmLT5HYmFzZSgpK19wb3MuIEZJWE1FIGNvbW1lbnQgKi8KKyAgLyogaWYgX3BvcyA8IDAsIGl0IHBvaW50cyB0byBfYnVmLT5lQnB0cigpK19wb3MuIEZJWE1FIGNvbW1lbnQgKi8KKyAgaW50IF9wb3M7CisjaWYgMAorICAgIHZvaWQgc2V0X3N0cmVhbXBvcyhzdHJlYW1wb3Mgc3ApIHsgX3Nwb3MgPSBzcDsgfQorICAgIHZvaWQgc2V0X29mZnNldChpbnQgb2Zmc2V0KSB7IF9wb3MgPSBvZmZzZXQ7IF9zcG9zID0gKHN0cmVhbXBvcykoLTIpOyB9CisgIHB1YmxpYzoKKyAgICBzdHJlYW1tYXJrZXIoc3RyZWFtYnVmICpzYik7CisgICAgfnN0cmVhbW1hcmtlcigpOworICAgIGludCBzYXZpbmcoKSB7IHJldHVybiAgX3Nwb3MgPT0gLTI7IH0KKyAgICBpbnQgZGVsdGEoc3RyZWFtbWFya2VyJik7CisgICAgaW50IGRlbHRhKCk7CisjZW5kaWYKK307CisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBmcm9tIHRoZSBsaWJzdGRjKysgY29kZWN2dCBjbGFzcy4gICovCitlbnVtIF9fY29kZWN2dF9yZXN1bHQKK3sKKyAgX19jb2RlY3Z0X29rLAorICBfX2NvZGVjdnRfcGFydGlhbCwKKyAgX19jb2RlY3Z0X2Vycm9yLAorICBfX2NvZGVjdnRfbm9jb252Cit9OworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisvKiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0IG11c3QgbWF0Y2ggdGhlIG9yZGVyCisgICBvZiB0aGUgdmlydHVhbCBmdW5jdGlvbnMgaW4gdGhlIGxpYnN0ZGMrKyBjb2RlY3Z0IGNsYXNzLiAgKi8KK3N0cnVjdCBfSU9fY29kZWN2dAoreworICB2b2lkICgqX19jb2RlY3Z0X2Rlc3RyKSAoc3RydWN0IF9JT19jb2RlY3Z0ICopOworICBlbnVtIF9fY29kZWN2dF9yZXN1bHQgKCpfX2NvZGVjdnRfZG9fb3V0KSAoc3RydWN0IF9JT19jb2RlY3Z0ICosCisJCQkJCSAgICAgX19tYnN0YXRlX3QgKiwKKwkJCQkJICAgICBjb25zdCB3Y2hhcl90ICosCisJCQkJCSAgICAgY29uc3Qgd2NoYXJfdCAqLAorCQkJCQkgICAgIGNvbnN0IHdjaGFyX3QgKiosIGNoYXIgKiwKKwkJCQkJICAgICBjaGFyICosIGNoYXIgKiopOworICBlbnVtIF9fY29kZWN2dF9yZXN1bHQgKCpfX2NvZGVjdnRfZG9fdW5zaGlmdCkgKHN0cnVjdCBfSU9fY29kZWN2dCAqLAorCQkJCQkJIF9fbWJzdGF0ZV90ICosIGNoYXIgKiwKKwkJCQkJCSBjaGFyICosIGNoYXIgKiopOworICBlbnVtIF9fY29kZWN2dF9yZXN1bHQgKCpfX2NvZGVjdnRfZG9faW4pIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKiwKKwkJCQkJICAgIF9fbWJzdGF0ZV90ICosCisJCQkJCSAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKiosIHdjaGFyX3QgKiwKKwkJCQkJICAgIHdjaGFyX3QgKiwgd2NoYXJfdCAqKik7CisgIGludCAoKl9fY29kZWN2dF9kb19lbmNvZGluZykgKHN0cnVjdCBfSU9fY29kZWN2dCAqKTsKKyAgaW50ICgqX19jb2RlY3Z0X2RvX2Fsd2F5c19ub2NvbnYpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKik7CisgIGludCAoKl9fY29kZWN2dF9kb19sZW5ndGgpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKiwgX19tYnN0YXRlX3QgKiwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBfSU9fc2l6ZV90KTsKKyAgaW50ICgqX19jb2RlY3Z0X2RvX21heF9sZW5ndGgpIChzdHJ1Y3QgX0lPX2NvZGVjdnQgKik7CisKKyAgX0lPX2ljb252X3QgX19jZF9pbjsKKyAgX0lPX2ljb252X3QgX19jZF9vdXQ7Cit9OworCisvKiBFeHRyYSBkYXRhIGZvciB3aWRlIGNoYXJhY3RlciBzdHJlYW1zLiAgKi8KK3N0cnVjdCBfSU9fd2lkZV9kYXRhCit7CisgIHdjaGFyX3QgKl9JT19yZWFkX3B0cjsJLyogQ3VycmVudCByZWFkIHBvaW50ZXIgKi8KKyAgd2NoYXJfdCAqX0lPX3JlYWRfZW5kOwkvKiBFbmQgb2YgZ2V0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT19yZWFkX2Jhc2U7CS8qIFN0YXJ0IG9mIHB1dGJhY2srZ2V0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT193cml0ZV9iYXNlOwkvKiBTdGFydCBvZiBwdXQgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX3dyaXRlX3B0cjsJLyogQ3VycmVudCBwdXQgcG9pbnRlci4gKi8KKyAgd2NoYXJfdCAqX0lPX3dyaXRlX2VuZDsJLyogRW5kIG9mIHB1dCBhcmVhLiAqLworICB3Y2hhcl90ICpfSU9fYnVmX2Jhc2U7CS8qIFN0YXJ0IG9mIHJlc2VydmUgYXJlYS4gKi8KKyAgd2NoYXJfdCAqX0lPX2J1Zl9lbmQ7CQkvKiBFbmQgb2YgcmVzZXJ2ZSBhcmVhLiAqLworICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCB0byBzdXBwb3J0IGJhY2tpbmcgdXAgYW5kIHVuZG8uICovCisgIHdjaGFyX3QgKl9JT19zYXZlX2Jhc2U7CS8qIFBvaW50ZXIgdG8gc3RhcnQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisgIHdjaGFyX3QgKl9JT19iYWNrdXBfYmFzZTsJLyogUG9pbnRlciB0byBmaXJzdCB2YWxpZCBjaGFyYWN0ZXIgb2YKKwkJCQkgICBiYWNrdXAgYXJlYSAqLworICB3Y2hhcl90ICpfSU9fc2F2ZV9lbmQ7CS8qIFBvaW50ZXIgdG8gZW5kIG9mIG5vbi1jdXJyZW50IGdldCBhcmVhLiAqLworCisgIF9fbWJzdGF0ZV90IF9JT19zdGF0ZTsKKyAgX19tYnN0YXRlX3QgX0lPX2xhc3Rfc3RhdGU7CisgIHN0cnVjdCBfSU9fY29kZWN2dCBfY29kZWN2dDsKKworICB3Y2hhcl90IF9zaG9ydGJ1ZlsxXTsKKworICBjb25zdCBzdHJ1Y3QgX0lPX2p1bXBfdCAqX3dpZGVfdnRhYmxlOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgX0lPX0ZJTEUgeworICBpbnQgX2ZsYWdzOwkJLyogSGlnaC1vcmRlciB3b3JkIGlzIF9JT19NQUdJQzsgcmVzdCBpcyBmbGFncy4gKi8KKyNkZWZpbmUgX0lPX2ZpbGVfZmxhZ3MgX2ZsYWdzCisKKyAgLyogVGhlIGZvbGxvd2luZyBwb2ludGVycyBjb3JyZXNwb25kIHRvIHRoZSBDKysgc3RyZWFtYnVmIHByb3RvY29sLiAqLworICAvKiBOb3RlOiAgVGsgdXNlcyB0aGUgX0lPX3JlYWRfcHRyIGFuZCBfSU9fcmVhZF9lbmQgZmllbGRzIGRpcmVjdGx5LiAqLworICBjaGFyKiBfSU9fcmVhZF9wdHI7CS8qIEN1cnJlbnQgcmVhZCBwb2ludGVyICovCisgIGNoYXIqIF9JT19yZWFkX2VuZDsJLyogRW5kIG9mIGdldCBhcmVhLiAqLworICBjaGFyKiBfSU9fcmVhZF9iYXNlOwkvKiBTdGFydCBvZiBwdXRiYWNrK2dldCBhcmVhLiAqLworICBjaGFyKiBfSU9fd3JpdGVfYmFzZTsJLyogU3RhcnQgb2YgcHV0IGFyZWEuICovCisgIGNoYXIqIF9JT193cml0ZV9wdHI7CS8qIEN1cnJlbnQgcHV0IHBvaW50ZXIuICovCisgIGNoYXIqIF9JT193cml0ZV9lbmQ7CS8qIEVuZCBvZiBwdXQgYXJlYS4gKi8KKyAgY2hhciogX0lPX2J1Zl9iYXNlOwkvKiBTdGFydCBvZiByZXNlcnZlIGFyZWEuICovCisgIGNoYXIqIF9JT19idWZfZW5kOwkvKiBFbmQgb2YgcmVzZXJ2ZSBhcmVhLiAqLworICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCB0byBzdXBwb3J0IGJhY2tpbmcgdXAgYW5kIHVuZG8uICovCisgIGNoYXIgKl9JT19zYXZlX2Jhc2U7IC8qIFBvaW50ZXIgdG8gc3RhcnQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisgIGNoYXIgKl9JT19iYWNrdXBfYmFzZTsgIC8qIFBvaW50ZXIgdG8gZmlyc3QgdmFsaWQgY2hhcmFjdGVyIG9mIGJhY2t1cCBhcmVhICovCisgIGNoYXIgKl9JT19zYXZlX2VuZDsgLyogUG9pbnRlciB0byBlbmQgb2Ygbm9uLWN1cnJlbnQgZ2V0IGFyZWEuICovCisKKyAgc3RydWN0IF9JT19tYXJrZXIgKl9tYXJrZXJzOworCisgIHN0cnVjdCBfSU9fRklMRSAqX2NoYWluOworCisgIGludCBfZmlsZW5vOworI2lmIDAKKyAgaW50IF9ibGtzaXplOworI2Vsc2UKKyAgaW50IF9mbGFnczI7CisjZW5kaWYKKyAgX0lPX29mZl90IF9vbGRfb2Zmc2V0OyAvKiBUaGlzIHVzZWQgdG8gYmUgX29mZnNldCBidXQgaXQncyB0b28gc21hbGwuICAqLworCisjZGVmaW5lIF9fSEFWRV9DT0xVTU4gLyogdGVtcG9yYXJ5ICovCisgIC8qIDErY29sdW1uIG51bWJlciBvZiBwYmFzZSgpOyAwIGlzIHVua25vd24uICovCisgIHVuc2lnbmVkIHNob3J0IF9jdXJfY29sdW1uOworICBzaWduZWQgY2hhciBfdnRhYmxlX29mZnNldDsKKyAgY2hhciBfc2hvcnRidWZbMV07CisKKyAgLyogIGNoYXIqIF9zYXZlX2dwdHI7ICBjaGFyKiBfc2F2ZV9lZ3B0cjsgKi8KKworICBfSU9fbG9ja190ICpfbG9jazsKKyNpZmRlZiBfSU9fVVNFX09MRF9JT19GSUxFCit9OworCitzdHJ1Y3QgX0lPX0ZJTEVfY29tcGxldGUKK3sKKyAgc3RydWN0IF9JT19GSUxFIF9maWxlOworI2VuZGlmCisjaWYgZGVmaW5lZCBfR19JT19JT19GSUxFX1ZFUlNJT04gJiYgX0dfSU9fSU9fRklMRV9WRVJTSU9OID09IDB4MjAwMDEKKyAgX0lPX29mZjY0X3QgX29mZnNldDsKKyMgaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCisgIC8qIFdpZGUgY2hhcmFjdGVyIHN0cmVhbSBzdHVmZi4gICovCisgIHN0cnVjdCBfSU9fY29kZWN2dCAqX2NvZGVjdnQ7CisgIHN0cnVjdCBfSU9fd2lkZV9kYXRhICpfd2lkZV9kYXRhOworICBzdHJ1Y3QgX0lPX0ZJTEUgKl9mcmVlcmVzX2xpc3Q7CisgIHZvaWQgKl9mcmVlcmVzX2J1ZjsKKyAgc2l6ZV90IF9mcmVlcmVzX3NpemU7CisjIGVsc2UKKyAgdm9pZCAqX19wYWQxOworICB2b2lkICpfX3BhZDI7CisgIHZvaWQgKl9fcGFkMzsKKyAgdm9pZCAqX19wYWQ0OworICBzaXplX3QgX19wYWQ1OworIyBlbmRpZgorICBpbnQgX21vZGU7CisgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW50byB0cm91YmxlIGFnYWluLiAgKi8KKyAgY2hhciBfdW51c2VkMlsxNSAqIHNpemVvZiAoaW50KSAtIDQgKiBzaXplb2YgKHZvaWQgKikgLSBzaXplb2YgKHNpemVfdCldOworI2VuZGlmCit9OworCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIHN0cnVjdCBfSU9fRklMRSBfSU9fRklMRTsKKyNlbmRpZgorCitzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKKworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9JT18yXzFfc3RkaW5fOworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9JT18yXzFfc3Rkb3V0XzsKK2V4dGVybiBzdHJ1Y3QgX0lPX0ZJTEVfcGx1cyBfSU9fMl8xX3N0ZGVycl87CisjaWZuZGVmIF9MSUJDCisjZGVmaW5lIF9JT19zdGRpbiAoKF9JT19GSUxFKikoJl9JT18yXzFfc3RkaW5fKSkKKyNkZWZpbmUgX0lPX3N0ZG91dCAoKF9JT19GSUxFKikoJl9JT18yXzFfc3Rkb3V0XykpCisjZGVmaW5lIF9JT19zdGRlcnIgKChfSU9fRklMRSopKCZfSU9fMl8xX3N0ZGVycl8pKQorI2Vsc2UKK2V4dGVybiBfSU9fRklMRSAqX0lPX3N0ZGluIGF0dHJpYnV0ZV9oaWRkZW47CitleHRlcm4gX0lPX0ZJTEUgKl9JT19zdGRvdXQgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiBfSU9fRklMRSAqX0lPX3N0ZGVyciBhdHRyaWJ1dGVfaGlkZGVuOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIHRvIGRvIEkvTyBhbmQgZmlsZSBtYW5hZ2VtZW50IGZvciBhIHN0cmVhbS4gICovCisKKy8qIFJlYWQgTkJZVEVTIGJ5dGVzIGZyb20gQ09PS0lFIGludG8gYSBidWZmZXIgcG9pbnRlZCB0byBieSBCVUYuCisgICBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICAqLwordHlwZWRlZiBfX3NzaXplX3QgX19pb19yZWFkX2ZuICh2b2lkICpfX2Nvb2tpZSwgY2hhciAqX19idWYsIHNpemVfdCBfX25ieXRlcyk7CisKKy8qIFdyaXRlIE4gYnl0ZXMgcG9pbnRlZCB0byBieSBCVUYgdG8gQ09PS0lFLiAgV3JpdGUgYWxsIE4gYnl0ZXMKKyAgIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvci4gIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgLTEgaWYKKyAgIHRoZXJlIGlzIGFuIGVycm9yIHdpdGhvdXQgd3JpdGluZyBhbnl0aGluZy4gIElmIHRoZSBmaWxlIGhhcyBiZWVuCisgICBvcGVuZWQgZm9yIGFwcGVuZCAoX19tb2RlLl9fYXBwZW5kIHNldCksIHRoZW4gc2V0IHRoZSBmaWxlIHBvaW50ZXIKKyAgIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIHRoZW4gZG8gdGhlIHdyaXRlOyBpZiBub3QsIGp1c3Qgd3JpdGUgYXQKKyAgIHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlci4gICovCit0eXBlZGVmIF9fc3NpemVfdCBfX2lvX3dyaXRlX2ZuICh2b2lkICpfX2Nvb2tpZSwgX19jb25zdCBjaGFyICpfX2J1ZiwKKwkJCQkgc2l6ZV90IF9fbik7CisKKy8qIE1vdmUgQ09PS0lFJ3MgZmlsZSBwb3NpdGlvbiB0byAqUE9TIGJ5dGVzIGZyb20gdGhlCisgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKGlmIFcgaXMgU0VFS19TRVQpLAorICAgdGhlIGN1cnJlbnQgcG9zaXRpb24gKGlmIFcgaXMgU0VFS19DVVIpLAorICAgb3IgdGhlIGVuZCBvZiB0aGUgZmlsZSAoaWYgVyBpcyBTRUVLX0VORCkuCisgICBTZXQgKlBPUyB0byB0aGUgbmV3IGZpbGUgcG9zaXRpb24uCisgICBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgbm9uemVybyBpZiBub3QuICAqLwordHlwZWRlZiBpbnQgX19pb19zZWVrX2ZuICh2b2lkICpfX2Nvb2tpZSwgX0lPX29mZjY0X3QgKl9fcG9zLCBpbnQgX193KTsKKworLyogQ2xvc2UgQ09PS0lFLiAgKi8KK3R5cGVkZWYgaW50IF9faW9fY2xvc2VfZm4gKHZvaWQgKl9fY29va2llKTsKKworCisjaWZkZWYgX0dOVV9TT1VSQ0UKKy8qIFVzZXItdmlzaWJsZSBuYW1lcyBmb3IgdGhlIGFib3ZlLiAgKi8KK3R5cGVkZWYgX19pb19yZWFkX2ZuIGNvb2tpZV9yZWFkX2Z1bmN0aW9uX3Q7Cit0eXBlZGVmIF9faW9fd3JpdGVfZm4gY29va2llX3dyaXRlX2Z1bmN0aW9uX3Q7Cit0eXBlZGVmIF9faW9fc2Vla19mbiBjb29raWVfc2Vla19mdW5jdGlvbl90OwordHlwZWRlZiBfX2lvX2Nsb3NlX2ZuIGNvb2tpZV9jbG9zZV9mdW5jdGlvbl90OworCisvKiBUaGUgc3RydWN0dXJlIHdpdGggdGhlIGNvb2tpZSBmdW5jdGlvbiBwb2ludGVycy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBfX2lvX3JlYWRfZm4gKnJlYWQ7CQkvKiBSZWFkIGJ5dGVzLiAgKi8KKyAgX19pb193cml0ZV9mbiAqd3JpdGU7CQkvKiBXcml0ZSBieXRlcy4gICovCisgIF9faW9fc2Vla19mbiAqc2VlazsJCS8qIFNlZWsvdGVsbCBmaWxlIHBvc2l0aW9uLiAgKi8KKyAgX19pb19jbG9zZV9mbiAqY2xvc2U7CQkvKiBDbG9zZSBmaWxlLiAgKi8KK30gX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdDsKK3R5cGVkZWYgX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdCBjb29raWVfaW9fZnVuY3Rpb25zX3Q7CisKK3N0cnVjdCBfSU9fY29va2llX2ZpbGU7CisKKy8qIEluaXRpYWxpemUgb25lIG9mIHRob3NlLiAgKi8KK2V4dGVybiB2b2lkIF9JT19jb29raWVfaW5pdCAoc3RydWN0IF9JT19jb29raWVfZmlsZSAqX19jZmlsZSwgaW50IF9fcmVhZF93cml0ZSwKKwkJCSAgICAgdm9pZCAqX19jb29raWUsIF9JT19jb29raWVfaW9fZnVuY3Rpb25zX3QgX19mbnMpOworI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IF9fdW5kZXJmbG93IChfSU9fRklMRSAqKTsKK2V4dGVybiBpbnQgX191ZmxvdyAoX0lPX0ZJTEUgKik7CitleHRlcm4gaW50IF9fb3ZlcmZsb3cgKF9JT19GSUxFICosIGludCk7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCitleHRlcm4gX0lPX3dpbnRfdCBfX3d1bmRlcmZsb3cgKF9JT19GSUxFICopOworZXh0ZXJuIF9JT193aW50X3QgX193dWZsb3cgKF9JT19GSUxFICopOworZXh0ZXJuIF9JT193aW50X3QgX193b3ZlcmZsb3cgKF9JT19GSUxFICosIF9JT193aW50X3QpOworI2VuZGlmCisKKyNpZiAgX19HTlVDX18gPj0gMworIyBkZWZpbmUgX0lPX0JFKGV4cHIsIHJlcykgX19idWlsdGluX2V4cGVjdCAoKGV4cHIpLCByZXMpCisjZWxzZQorIyBkZWZpbmUgX0lPX0JFKGV4cHIsIHJlcykgKGV4cHIpCisjZW5kaWYKKworI2RlZmluZSBfSU9fZ2V0Y191bmxvY2tlZChfZnApIFwKKyAgICAgICAoX0lPX0JFICgoX2ZwKS0+X0lPX3JlYWRfcHRyID49IChfZnApLT5fSU9fcmVhZF9lbmQsIDApIFwKKwk/IF9fdWZsb3cgKF9mcCkgOiAqKHVuc2lnbmVkIGNoYXIgKikgKF9mcCktPl9JT19yZWFkX3B0cisrKQorI2RlZmluZSBfSU9fcGVla2NfdW5sb2NrZWQoX2ZwKSBcCisgICAgICAgKF9JT19CRSAoKF9mcCktPl9JT19yZWFkX3B0ciA+PSAoX2ZwKS0+X0lPX3JlYWRfZW5kLCAwKSBcCisJICAmJiBfX3VuZGVyZmxvdyAoX2ZwKSA9PSBFT0YgPyBFT0YgXAorCTogKih1bnNpZ25lZCBjaGFyICopIChfZnApLT5fSU9fcmVhZF9wdHIpCisjZGVmaW5lIF9JT19wdXRjX3VubG9ja2VkKF9jaCwgX2ZwKSBcCisgICAoX0lPX0JFICgoX2ZwKS0+X0lPX3dyaXRlX3B0ciA+PSAoX2ZwKS0+X0lPX3dyaXRlX2VuZCwgMCkgXAorICAgID8gX19vdmVyZmxvdyAoX2ZwLCAodW5zaWduZWQgY2hhcikgKF9jaCkpIFwKKyAgICA6ICh1bnNpZ25lZCBjaGFyKSAoKihfZnApLT5fSU9fd3JpdGVfcHRyKysgPSAoX2NoKSkpCisKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgX0dMSUJDUFBfVVNFX1dDSEFSX1QKKyMgZGVmaW5lIF9JT19nZXR3Y191bmxvY2tlZChfZnApIFwKKyAgKF9JT19CRSAoKF9mcCktPl93aWRlX2RhdGEtPl9JT19yZWFkX3B0ciA+PSAoX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3JlYWRfZW5kLFwKKwkgICAwKSBcCisgICA/IF9fd3VmbG93IChfZnApIDogKF9JT193aW50X3QpICooX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3JlYWRfcHRyKyspCisjIGRlZmluZSBfSU9fcHV0d2NfdW5sb2NrZWQoX3djaCwgX2ZwKSBcCisgIChfSU9fQkUgKChfZnApLT5fd2lkZV9kYXRhLT5fSU9fd3JpdGVfcHRyIFwKKwkgICA+PSAoX2ZwKS0+X3dpZGVfZGF0YS0+X0lPX3dyaXRlX2VuZCwgMCkgXAorICAgPyBfX3dvdmVyZmxvdyAoX2ZwLCBfd2NoKSBcCisgICA6IChfSU9fd2ludF90KSAoKihfZnApLT5fd2lkZV9kYXRhLT5fSU9fd3JpdGVfcHRyKysgPSAoX3djaCkpKQorI2VuZGlmCisKKyNkZWZpbmUgX0lPX2Zlb2ZfdW5sb2NrZWQoX19mcCkgKCgoX19mcCktPl9mbGFncyAmIF9JT19FT0ZfU0VFTikgIT0gMCkKKyNkZWZpbmUgX0lPX2ZlcnJvcl91bmxvY2tlZChfX2ZwKSAoKChfX2ZwKS0+X2ZsYWdzICYgX0lPX0VSUl9TRUVOKSAhPSAwKQorCitleHRlcm4gaW50IF9JT19nZXRjIChfSU9fRklMRSAqX19mcCk7CitleHRlcm4gaW50IF9JT19wdXRjIChpbnQgX19jLCBfSU9fRklMRSAqX19mcCk7CitleHRlcm4gaW50IF9JT19mZW9mIChfSU9fRklMRSAqX19mcCkgX19USFJPVzsKK2V4dGVybiBpbnQgX0lPX2ZlcnJvciAoX0lPX0ZJTEUgKl9fZnApIF9fVEhST1c7CisKK2V4dGVybiBpbnQgX0lPX3BlZWtjX2xvY2tlZCAoX0lPX0ZJTEUgKl9fZnApOworCisvKiBUaGlzIG9uZSBpcyBmb3IgRW1hY3MuICovCisjZGVmaW5lIF9JT19QRU5ESU5HX09VVFBVVF9DT1VOVChfZnApCVwKKwkoKF9mcCktPl9JT193cml0ZV9wdHIgLSAoX2ZwKS0+X0lPX3dyaXRlX2Jhc2UpCisKK2V4dGVybiB2b2lkIF9JT19mbG9ja2ZpbGUgKF9JT19GSUxFICopIF9fVEhST1c7CitleHRlcm4gdm9pZCBfSU9fZnVubG9ja2ZpbGUgKF9JT19GSUxFICopIF9fVEhST1c7CitleHRlcm4gaW50IF9JT19mdHJ5bG9ja2ZpbGUgKF9JT19GSUxFICopIF9fVEhST1c7CisKKyNpZmRlZiBfSU9fTVRTQUZFX0lPCisjIGRlZmluZSBfSU9fcGVla2MoX2ZwKSBfSU9fcGVla2NfbG9ja2VkIChfZnApCisjIGRlZmluZSBfSU9fZmxvY2tmaWxlKF9mcCkgXAorICBpZiAoKChfZnApLT5fZmxhZ3MgJiBfSU9fVVNFUl9MT0NLKSA9PSAwKSBfSU9fZmxvY2tmaWxlIChfZnApCisjIGRlZmluZSBfSU9fZnVubG9ja2ZpbGUoX2ZwKSBcCisgIGlmICgoKF9mcCktPl9mbGFncyAmIF9JT19VU0VSX0xPQ0spID09IDApIF9JT19mdW5sb2NrZmlsZSAoX2ZwKQorI2Vsc2UKKyMgZGVmaW5lIF9JT19wZWVrYyhfZnApIF9JT19wZWVrY191bmxvY2tlZCAoX2ZwKQorIyBkZWZpbmUgX0lPX2Zsb2NrZmlsZShfZnApIC8qKi8KKyMgZGVmaW5lIF9JT19mdW5sb2NrZmlsZShfZnApIC8qKi8KKyMgZGVmaW5lIF9JT19mdHJ5bG9ja2ZpbGUoX2ZwKSAvKiovCisjIGRlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fc3RhcnQoX2ZjdCwgX2ZwKSAvKiovCisjIGRlZmluZSBfSU9fY2xlYW51cF9yZWdpb25fZW5kKF9Eb2l0KSAvKiovCisjZW5kaWYgLyogIV9JT19NVFNBRkVfSU8gKi8KKworZXh0ZXJuIGludCBfSU9fdmZzY2FuZiAoX0lPX0ZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwKKwkJCV9JT192YV9saXN0LCBpbnQgKl9fcmVzdHJpY3QpOworZXh0ZXJuIGludCBfSU9fdmZwcmludGYgKF9JT19GSUxFICpfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0LAorCQkJIF9JT192YV9saXN0KTsKK2V4dGVybiBfSU9fc3NpemVfdCBfSU9fcGFkbiAoX0lPX0ZJTEUgKiwgaW50LCBfSU9fc3NpemVfdCk7CitleHRlcm4gX0lPX3NpemVfdCBfSU9fc2dldG4gKF9JT19GSUxFICosIHZvaWQgKiwgX0lPX3NpemVfdCk7CisKK2V4dGVybiBfSU9fb2ZmNjRfdCBfSU9fc2Vla29mZiAoX0lPX0ZJTEUgKiwgX0lPX29mZjY0X3QsIGludCwgaW50KTsKK2V4dGVybiBfSU9fb2ZmNjRfdCBfSU9fc2Vla3BvcyAoX0lPX0ZJTEUgKiwgX0lPX29mZjY0X3QsIGludCk7CisKK2V4dGVybiB2b2lkIF9JT19mcmVlX2JhY2t1cF9hcmVhIChfSU9fRklMRSAqKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIF9HTElCQ1BQX1VTRV9XQ0hBUl9UCitleHRlcm4gX0lPX3dpbnRfdCBfSU9fZ2V0d2MgKF9JT19GSUxFICpfX2ZwKTsKK2V4dGVybiBfSU9fd2ludF90IF9JT19wdXR3YyAod2NoYXJfdCBfX3djLCBfSU9fRklMRSAqX19mcCk7CitleHRlcm4gaW50IF9JT19md2lkZSAoX0lPX0ZJTEUgKl9fZnAsIGludCBfX21vZGUpIF9fVEhST1c7CisjIGlmIF9fR05VQ19fID49IDIKKy8qIFdoaWxlIGNvbXBpbGluZyBnbGliYyB3ZSBoYXZlIHRvIGhhbmRsZSBjb21wYXRpYmlsaXR5IHdpdGggdmVyeSBvbGQKKyAgIHZlcnNpb25zLiAgKi8KKyMgIGlmIGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBTSEFSRUQKKyMgICBpbmNsdWRlIDxzaGxpYi1jb21wYXQuaD4KKyMgICBpZiBTSExJQl9DT01QQVQgKGxpYmMsIEdMSUJDXzJfMCwgR0xJQkNfMl8xKQorIyAgICBkZWZpbmUgX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSBcCisgIChfX2J1aWx0aW5fZXhwZWN0ICgmX0lPX3N0ZGluX3VzZWQgPT0gTlVMTCwgMCkpCitleHRlcm4gY29uc3QgaW50IF9JT19zdGRpbl91c2VkOword2Vha19leHRlcm4gKF9JT19zdGRpbl91c2VkKTsKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmbmRlZiBfSU9fZndpZGVfbWF5YmVfaW5jb21wYXRpYmxlCisjICAgZGVmaW5lIF9JT19md2lkZV9tYXliZV9pbmNvbXBhdGlibGUgKDApCisjICBlbmRpZgorLyogQSBzcGVjaWFsIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhYm92ZS4gIEl0IG9wdGltaXplcyB0aGUKKyAgIGNhc2Ugb2YgaW5pdGlhbGl6aW5nIGFuIHVub3JpZW50ZWQgYnl0ZSBzdHJlYW0uICAqLworIyAgZGVmaW5lIF9JT19md2lkZShfX2ZwLCBfX21vZGUpIFwKKyAgKHsgaW50IF9fcmVzdWx0ID0gKF9fbW9kZSk7CQkJCQkJICAgICAgXAorICAgICBpZiAoX19yZXN1bHQgPCAwICYmICEgX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSkJCSAgICAgIFwKKyAgICAgICB7CQkJCQkJCQkgICAgICBcCisJIGlmICgoX19mcCktPl9tb2RlID09IDApCQkJCQkgICAgICBcCisJICAgLyogV2Uga25vdyB0aGF0IGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvIHNldCB0aGUgZmxhZy4gICovCSAgICAgIFwKKwkgICAoX19mcCktPl9tb2RlID0gLTE7CQkJCQkJICAgICAgXAorCSBfX3Jlc3VsdCA9IChfX2ZwKS0+X21vZGU7CQkJCQkgICAgICBcCisgICAgICAgfQkJCQkJCQkJICAgICAgXAorICAgICBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoX19tb2RlKSAmJiAoX19tb2RlKSA9PSAwKQkJICAgICAgXAorICAgICAgIF9fcmVzdWx0ID0gX0lPX2Z3aWRlX21heWJlX2luY29tcGF0aWJsZSA/IC0xIDogKF9fZnApLT5fbW9kZTsJICAgICAgXAorICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisgICAgICAgX19yZXN1bHQgPSBfSU9fZndpZGUgKF9fZnAsIF9fcmVzdWx0KTsJCQkJICAgICAgXAorICAgICBfX3Jlc3VsdDsgfSkKKyMgZW5kaWYKKworZXh0ZXJuIGludCBfSU9fdmZ3c2NhbmYgKF9JT19GSUxFICogX19yZXN0cmljdCwgY29uc3Qgd2NoYXJfdCAqIF9fcmVzdHJpY3QsCisJCQkgX0lPX3ZhX2xpc3QsIGludCAqX19yZXN0cmljdCk7CitleHRlcm4gaW50IF9JT192ZndwcmludGYgKF9JT19GSUxFICpfX3Jlc3RyaWN0LCBjb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0LAorCQkJICBfSU9fdmFfbGlzdCk7CitleHRlcm4gX0lPX3NzaXplX3QgX0lPX3dwYWRuIChfSU9fRklMRSAqLCB3aW50X3QsIF9JT19zc2l6ZV90KTsKK2V4dGVybiB2b2lkIF9JT19mcmVlX3diYWNrdXBfYXJlYSAoX0lPX0ZJTEUgKikgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19MREJMX0NPTVBBVAorIyBpbmNsdWRlIDxiaXRzL2xpYmlvLWxkYmwuaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0lPX1NURElPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGltaXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOWE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbWl0cy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xMC81LjIuNC4yLjEgU2l6ZXMgb2YgaW50ZWdlciB0eXBlcwk8bGltaXRzLmg+CisgKi8KKworI2lmbmRlZiBfTElCQ19MSU1JVFNfSF8KKyNkZWZpbmUgX0xJQkNfTElNSVRTX0hfCTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworLyogTWF4aW11bSBsZW5ndGggb2YgYW55IG11bHRpYnl0ZSBjaGFyYWN0ZXIgaW4gYW55IGxvY2FsZS4KKyAgIFdlIGRlZmluZSB0aGlzIHZhbHVlIGhlcmUgc2luY2UgdGhlIGdjYyBoZWFkZXIgZG9lcyBub3QgZGVmaW5lCisgICB0aGUgY29ycmVjdCB2YWx1ZS4gICovCisjZGVmaW5lIE1CX0xFTl9NQVgJMTYKKworCisvKiBJZiB3ZSBhcmUgbm90IHVzaW5nIEdOVSBDQyB3ZSBoYXZlIHRvIGRlZmluZSBhbGwgdGhlIHN5bWJvbHMgb3Vyc2VsZi4KKyAgIE90aGVyd2lzZSB1c2UgZ2NjJ3MgZGVmaW5pdGlvbnMgKHNlZSBiZWxvdykuICAqLworI2lmICFkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMgorCisvKiBXZSBvbmx5IHByb3RlY3QgZnJvbSBtdWx0aXBsZSBpbmNsdXNpb24gaGVyZSwgYmVjYXVzZSBhbGwgdGhlIG90aGVyCisgICAjaW5jbHVkZSdzIHByb3RlY3QgdGhlbXNlbHZlcywgYW5kIGluIEdDQyAyIHdlIG1heSAjaW5jbHVkZV9uZXh0IHRocm91Z2gKKyAgIG11bHRpcGxlIGNvcGllcyBvZiB0aGlzIGZpbGUgYmVmb3JlIHdlIGdldCB0byBHQ0Mncy4gICovCisjIGlmbmRlZiBfTElNSVRTX0gKKyMgIGRlZmluZSBfTElNSVRTX0gJMQorCisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisvKiBXZSBkb24ndCBoYXZlICNpbmNsdWRlX25leHQuCisgICBEZWZpbmUgQU5TSSA8bGltaXRzLmg+IGZvciBzdGFuZGFyZCAzMi1iaXQgd29yZHMuICAqLworCisvKiBUaGVzZSBhc3N1bWUgOC1iaXQgYGNoYXIncywgMTYtYml0IGBzaG9ydCBpbnQncywKKyAgIGFuZCAzMi1iaXQgYGludCdzIGFuZCBgbG9uZyBpbnQncy4gICovCisKKy8qIE51bWJlciBvZiBiaXRzIGluIGEgYGNoYXInLgkqLworIyAgZGVmaW5lIENIQVJfQklUCTgKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGNoYXInIGNhbiBob2xkLiAgKi8KKyMgIGRlZmluZSBTQ0hBUl9NSU4JKC0xMjgpCisjICBkZWZpbmUgU0NIQVJfTUFYCTEyNworCisvKiBNYXhpbXVtIHZhbHVlIGFuIGB1bnNpZ25lZCBjaGFyJyBjYW4gaG9sZC4gIChNaW5pbXVtIGlzIDAuKSAgKi8KKyMgIGRlZmluZSBVQ0hBUl9NQVgJMjU1CisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYGNoYXInIGNhbiBob2xkLiAgKi8KKyMgIGlmZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisjICAgZGVmaW5lIENIQVJfTUlOCTAKKyMgICBkZWZpbmUgQ0hBUl9NQVgJVUNIQVJfTUFYCisjICBlbHNlCisjICAgZGVmaW5lIENIQVJfTUlOCVNDSEFSX01JTgorIyAgIGRlZmluZSBDSEFSX01BWAlTQ0hBUl9NQVgKKyMgIGVuZGlmCisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBzaG9ydCBpbnQnIGNhbiBob2xkLiAgKi8KKyMgIGRlZmluZSBTSFJUX01JTgkoLTMyNzY4KQorIyAgZGVmaW5lIFNIUlRfTUFYCTMyNzY3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIHNob3J0IGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjICBkZWZpbmUgVVNIUlRfTUFYCTY1NTM1CisKKy8qIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGEgYHNpZ25lZCBpbnQnIGNhbiBob2xkLiAgKi8KKyMgIGRlZmluZSBJTlRfTUlOCSgtSU5UX01BWCAtIDEpCisjICBkZWZpbmUgSU5UX01BWAkyMTQ3NDgzNjQ3CisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGludCcgY2FuIGhvbGQuICAoTWluaW11bSBpcyAwLikgICovCisjICBkZWZpbmUgVUlOVF9NQVgJNDI5NDk2NzI5NVUKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgaW50JyBjYW4gaG9sZC4gICovCisjICBpZiBfX1dPUkRTSVpFID09IDY0CisjICAgZGVmaW5lIExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMCisjICBlbHNlCisjICAgZGVmaW5lIExPTkdfTUFYCTIxNDc0ODM2NDdMCisjICBlbmRpZgorIyAgZGVmaW5lIExPTkdfTUlOCSgtTE9OR19NQVggLSAxTCkKKworLyogTWF4aW11bSB2YWx1ZSBhbiBgdW5zaWduZWQgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworIyAgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgIGRlZmluZSBVTE9OR19NQVgJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAorIyAgZWxzZQorIyAgIGRlZmluZSBVTE9OR19NQVgJNDI5NDk2NzI5NVVMCisjICBlbmRpZgorCisjICBpZmRlZiBfX1VTRV9JU09DOTkKKworLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYSBgc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKi8KKyMgICBkZWZpbmUgTExPTkdfTUFYCTkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorIyAgIGRlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxTEwpCisKKy8qIE1heGltdW0gdmFsdWUgYW4gYHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQnIGNhbiBob2xkLiAgKE1pbmltdW0gaXMgMC4pICAqLworIyAgIGRlZmluZSBVTExPTkdfTUFYCTE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMCisKKyMgIGVuZGlmIC8qIElTTyBDOTkgKi8KKworIyBlbmRpZgkvKiBsaW1pdHMuaCAgKi8KKyNlbmRpZgkvKiBHQ0MgMi4gICovCisKKyNlbmRpZgkvKiAhX0xJQkNfTElNSVRTX0hfICovCisKKyAvKiBHZXQgdGhlIGNvbXBpbGVyJ3MgbGltaXRzLmgsIHdoaWNoIGRlZmluZXMgYWxtb3N0IGFsbCB0aGUgSVNPIGNvbnN0YW50cy4KKworICAgIFdlIHB1dCB0aGlzICNpbmNsdWRlX25leHQgb3V0c2lkZSB0aGUgZG91YmxlIGluY2x1c2lvbiBjaGVjayBiZWNhdXNlCisgICAgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGluY2x1ZGUgdGhpcyBmaWxlIG1vcmUgdGhhbiBvbmNlIGFuZCBzdGlsbCBnZXQKKyAgICB0aGUgZGVmaW5pdGlvbnMgZnJvbSBnY2MncyBoZWFkZXIuICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX0dDQ19MSU1JVFNfSF8KKy8qIGBfR0NDX0xJTUlUU19IXycgaXMgd2hhdCBHQ0MncyBmaWxlIGRlZmluZXMuICAqLworIyBpbmNsdWRlX25leHQgPGxpbWl0cy5oPgorI2VuZGlmCisKKy8qIFRoZSA8bGltaXRzLmg+IGZpbGVzIGluIHNvbWUgZ2NjIHZlcnNpb25zIGRvbid0IGRlZmluZSBMTE9OR19NSU4sCisgICBMTE9OR19NQVgsIGFuZCBVTExPTkdfTUFYLiAgSW5zdGVhZCBvbmx5IHRoZSB2YWx1ZXMgZ2NjIGRlZmluZWQgZm9yCisgICBhZ2VzIGFyZSBhdmFpbGFibGUuICAqLworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmIGRlZmluZWQgX19HTlVDX18KKyMgaWZuZGVmIExMT05HX01JTgorIyAgZGVmaW5lIExMT05HX01JTgkoLUxMT05HX01BWC0xKQorIyBlbmRpZgorIyBpZm5kZWYgTExPTkdfTUFYCisjICBkZWZpbmUgTExPTkdfTUFYCV9fTE9OR19MT05HX01BWF9fCisjIGVuZGlmCisjIGlmbmRlZiBVTExPTkdfTUFYCisjICBkZWZpbmUgVUxMT05HX01BWAkoTExPTkdfTUFYICogMlVMTCArIDEpCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBQT1NJWCBhZGRzIHRoaW5ncyB0byA8bGltaXRzLmg+LiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9wb3NpeDFfbGltLmg+CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX1BPU0lYMgorIyBpbmNsdWRlIDxiaXRzL3Bvc2l4Ml9saW0uaD4KKyNlbmRpZgorCisjaWZkZWYJX19VU0VfWE9QRU4KKyMgaW5jbHVkZSA8Yml0cy94b3Blbl9saW0uaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY1MzFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW5rLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qIERhdGEgc3RydWN0dXJlIGZvciBjb21tdW5pY2F0aW9uIGZyb20gdGhlIHJ1bi10aW1lIGR5bmFtaWMgbGlua2VyIGZvcgorICAgbG9hZGVkIEVMRiBzaGFyZWQgb2JqZWN0cy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAxLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9MSU5LX0gKKyNkZWZpbmUJX0xJTktfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIFdlIHVzZSB0aGlzIG1hY3JvIHRvIHJlZmVyIHRvIEVMRiB0eXBlcyBpbmRlcGVuZGVudCBvZiB0aGUgbmF0aXZlIHdvcmRzaXplLgorICAgYEVsZlcoVFlQRSknIGlzIHVzZWQgaW4gcGxhY2Ugb2YgYEVsZjMyX1RZUEUnIG9yIGBFbGY2NF9UWVBFJy4gICovCisjZGVmaW5lIEVsZlcodHlwZSkJX0VsZlcgKEVsZiwgX19FTEZfTkFUSVZFX0NMQVNTLCB0eXBlKQorI2RlZmluZSBfRWxmVyhlLHcsdCkJX0VsZldfMSAoZSwgdywgXyMjdCkKKyNkZWZpbmUgX0VsZldfMShlLHcsdCkJZSMjdyMjdAorCisjaW5jbHVkZSA8Yml0cy9lbGZjbGFzcy5oPgkJLyogRGVmaW5lcyBfX0VMRl9OQVRJVkVfQ0xBU1MuICAqLworI2luY2x1ZGUgPGJpdHMvbGluay5oPgorCisvKiBSZW5kZXp2b3VzIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBydW4tdGltZSBkeW5hbWljIGxpbmtlciB0byBjb21tdW5pY2F0ZQorICAgZGV0YWlscyBvZiBzaGFyZWQgb2JqZWN0IGxvYWRpbmcgdG8gdGhlIGRlYnVnZ2VyLiAgSWYgdGhlIGV4ZWN1dGFibGUncworICAgZHluYW1pYyBzZWN0aW9uIGhhcyBhIERUX0RFQlVHIGVsZW1lbnQsIHRoZSBydW4tdGltZSBsaW5rZXIgc2V0cyB0aGF0CisgICBlbGVtZW50J3MgdmFsdWUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIGZvdW5kLiAgKi8KKworc3RydWN0IHJfZGVidWcKKyAgeworICAgIGludCByX3ZlcnNpb247CQkvKiBWZXJzaW9uIG51bWJlciBmb3IgdGhpcyBwcm90b2NvbC4gICovCisKKyAgICBzdHJ1Y3QgbGlua19tYXAgKnJfbWFwOwkvKiBIZWFkIG9mIHRoZSBjaGFpbiBvZiBsb2FkZWQgb2JqZWN0cy4gICovCisKKyAgICAvKiBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gaW50ZXJuYWwgdG8gdGhlIHJ1bi10aW1lIGxpbmtlciwKKyAgICAgICB0aGF0IHdpbGwgYWx3YXlzIGJlIGNhbGxlZCB3aGVuIHRoZSBsaW5rZXIgYmVnaW5zIHRvIG1hcCBpbiBhCisgICAgICAgbGlicmFyeSBvciB1bm1hcCBpdCwgYW5kIGFnYWluIHdoZW4gdGhlIG1hcHBpbmcgY2hhbmdlIGlzIGNvbXBsZXRlLgorICAgICAgIFRoZSBkZWJ1Z2dlciBjYW4gc2V0IGEgYnJlYWtwb2ludCBhdCB0aGlzIGFkZHJlc3MgaWYgaXQgd2FudHMgdG8KKyAgICAgICBub3RpY2Ugc2hhcmVkIG9iamVjdCBtYXBwaW5nIGNoYW5nZXMuICAqLworICAgIEVsZlcoQWRkcikgcl9icms7CisgICAgZW51bQorICAgICAgeworCS8qIFRoaXMgc3RhdGUgdmFsdWUgZGVzY3JpYmVzIHRoZSBtYXBwaW5nIGNoYW5nZSB0YWtpbmcgcGxhY2Ugd2hlbgorCSAgIHRoZSBgcl9icmsnIGFkZHJlc3MgaXMgY2FsbGVkLiAgKi8KKwlSVF9DT05TSVNURU5ULAkJLyogTWFwcGluZyBjaGFuZ2UgaXMgY29tcGxldGUuICAqLworCVJUX0FERCwJCQkvKiBCZWdpbm5pbmcgdG8gYWRkIGEgbmV3IG9iamVjdC4gICovCisJUlRfREVMRVRFCQkvKiBCZWdpbm5pbmcgdG8gcmVtb3ZlIGFuIG9iamVjdCBtYXBwaW5nLiAgKi8KKyAgICAgIH0gcl9zdGF0ZTsKKworICAgIEVsZlcoQWRkcikgcl9sZGJhc2U7CS8qIEJhc2UgYWRkcmVzcyB0aGUgbGlua2VyIGlzIGxvYWRlZCBhdC4gICovCisgIH07CisKKy8qIFRoaXMgaXMgdGhlIGluc3RhbmNlIG9mIHRoYXQgc3RydWN0dXJlIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgcl9kZWJ1ZyBfcl9kZWJ1ZzsKKworLyogVGhpcyBzeW1ib2wgcmVmZXJzIHRvIHRoZSAiZHluYW1pYyBzdHJ1Y3R1cmUiIGluIHRoZSBgLmR5bmFtaWMnIHNlY3Rpb24KKyAgIG9mIHdoYXRldmVyIG1vZHVsZSByZWZlcnMgdG8gYF9EWU5BTUlDJy4gIFNvLCB0byBmaW5kIGl0cyBvd24KKyAgIGBzdHJ1Y3Qgcl9kZWJ1ZycsIGEgcHJvZ3JhbSBjb3VsZCBkbzoKKyAgICAgZm9yIChkeW4gPSBfRFlOQU1JQzsgZHluLT5kX3RhZyAhPSBEVF9OVUxMOyArK2R5bikKKyAgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9ERUJVRykKKwkgcl9kZWJ1ZyA9IChzdHJ1Y3Qgcl9kZWJ1ZyAqKSBkeW4tPmRfdW4uZF9wdHI7CisgICAqLworZXh0ZXJuIEVsZlcoRHluKSBfRFlOQU1JQ1tdOworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIGxvYWRlZCBzaGFyZWQgb2JqZWN0LiAgVGhlIGBsX25leHQnIGFuZCBgbF9wcmV2JworICAgbWVtYmVycyBmb3JtIGEgY2hhaW4gb2YgYWxsIHRoZSBzaGFyZWQgb2JqZWN0cyBsb2FkZWQgYXQgc3RhcnR1cC4KKworICAgVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGV4aXN0IGluIHNwYWNlIHVzZWQgYnkgdGhlIHJ1bi10aW1lIGR5bmFtaWMgbGlua2VyOworICAgbW9kaWZ5aW5nIHRoZW0gbWF5IGhhdmUgZGlzYXN0cm91cyByZXN1bHRzLiAgKi8KKworc3RydWN0IGxpbmtfbWFwCisgIHsKKyAgICAvKiBUaGVzZSBmaXJzdCBmZXcgbWVtYmVycyBhcmUgcGFydCBvZiB0aGUgcHJvdG9jb2wgd2l0aCB0aGUgZGVidWdnZXIuCisgICAgICAgVGhpcyBpcyB0aGUgc2FtZSBmb3JtYXQgdXNlZCBpbiBTVlI0LiAgKi8KKworICAgIEVsZlcoQWRkcikgbF9hZGRyOwkJLyogQmFzZSBhZGRyZXNzIHNoYXJlZCBvYmplY3QgaXMgbG9hZGVkIGF0LiAgKi8KKyAgICBjaGFyICpsX25hbWU7CQkvKiBBYnNvbHV0ZSBmaWxlIG5hbWUgb2JqZWN0IHdhcyBmb3VuZCBpbi4gICovCisgICAgRWxmVyhEeW4pICpsX2xkOwkJLyogRHluYW1pYyBzZWN0aW9uIG9mIHRoZSBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgICBzdHJ1Y3QgbGlua19tYXAgKmxfbmV4dCwgKmxfcHJldjsgLyogQ2hhaW4gb2YgbG9hZGVkIG9iamVjdHMuICAqLworICB9OworCisjaWZkZWYgX19VU0VfR05VCisKKy8qIFZlcnNpb24gbnVtYmVycyBmb3IgbGFfdmVyc2lvbiBoYW5kc2hha2UgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgTEFWX0NVUlJFTlQJMQorCisvKiBBY3Rpdml0eSB0eXBlcyBzaWduYWxlZCB0aHJvdWdoIGxhX2FjdGl2aXR5LiAgKi8KK2VudW0KKyAgeworICAgIExBX0FDVF9DT05TSVNURU5ULAkJLyogTGluayBtYXAgY29uc2lzdGVudCBhZ2Fpbi4gICovCisgICAgTEFfQUNUX0FERCwJCQkvKiBOZXcgb2JqZWN0IHdpbGwgYmUgYWRkZWQuICAqLworICAgIExBX0FDVF9ERUxFVEUJCS8qIE9iamVjdHMgd2lsbCBiZSByZW1vdmVkLiAgKi8KKyAgfTsKKworLyogVmFsdWVzIHJlcHJlc2VudGluZyBvcmlnaW4gb2YgbmFtZSBmb3IgZHluYW1pYyBsb2FkaW5nLiAgKi8KK2VudW0KKyAgeworICAgIExBX1NFUl9PUklHID0gMHgwMSwJCS8qIE9yaWdpbmFsIG5hbWUuICAqLworICAgIExBX1NFUl9MSUJQQVRIID0gMHgwMiwJLyogRGlyZWN0b3J5IGZyb20gTERfTElCUkFSWV9QQVRILiAgKi8KKyAgICBMQV9TRVJfUlVOUEFUSCA9IDB4MDQsCS8qIERpcmVjdG9yeSBmcm9tIFJQQVRIL1JVTlBBVEguICAqLworICAgIExBX1NFUl9DT05GSUcgPSAweDA4LAkvKiBGb3VuZCB0aHJvdWdoIGxkY29uZmlnLiAgKi8KKyAgICBMQV9TRVJfREVGQVVMVCA9IDB4NDAsCS8qIERlZmF1bHQgZGlyZWN0b3J5LiAgKi8KKyAgICBMQV9TRVJfU0VDVVJFID0gMHg4MAkvKiBVbnVzZWQuICAqLworICB9OworCisvKiBWYWx1ZXMgZm9yIGxhX29iam9wZW4gcmV0dXJuIHZhbHVlLiAgKi8KK2VudW0KKyAgeworICAgIExBX0ZMR19CSU5EVE8gPSAweDAxLAkvKiBBdWRpdCBzeW1ib2xzIGJvdW5kIHRvIHRoaXMgb2JqZWN0LiAgKi8KKyAgICBMQV9GTEdfQklOREZST00gPSAweDAyCS8qIEF1ZGl0IHN5bWJvbHMgYm91bmQgZnJvbSB0aGlzIG9iamVjdC4gICovCisgIH07CisKKy8qIFZhbHVlcyBmb3IgbGFfc3ltYmluZCBmbGFncyBwYXJhbWV0ZXIuICAqLworZW51bQorICB7CisgICAgTEFfU1lNQl9OT1BMVEVOVEVSID0gMHgwMSwJLyogbGFfcGx0ZW50ZXIgd2lsbCBub3QgYmUgY2FsbGVkLiAgKi8KKyAgICBMQV9TWU1CX05PUExURVhJVCA9IDB4MDIsCS8qIGxhX3BsdGV4aXQgd2lsbCBub3QgYmUgY2FsbGVkLiAgKi8KKyAgICBMQV9TWU1CX1NUUlVDVENBTEwgPSAweDA0LAkvKiBSZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3R1cmUuICAqLworICAgIExBX1NZTUJfRExTWU0gPSAweDA4LAkvKiBCaW5kaW5nIGR1ZSB0byBkbHN5bSBjYWxsLiAgKi8KKyAgICBMQV9TWU1CX0FMVFZBTFVFID0gMHgxMAkvKiBWYWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IGEgcHJldmlvdXMKKwkJCQkgICBsYV9zeW1iaW5kIGNhbGwuICAqLworICB9OworCitzdHJ1Y3QgZGxfcGhkcl9pbmZvCisgIHsKKyAgICBFbGZXKEFkZHIpIGRscGlfYWRkcjsKKyAgICBjb25zdCBjaGFyICpkbHBpX25hbWU7CisgICAgY29uc3QgRWxmVyhQaGRyKSAqZGxwaV9waGRyOworICAgIEVsZlcoSGFsZikgZGxwaV9waG51bTsKKworICAgIC8qIE5vdGU6IEZvbGxvd2luZyBtZW1iZXJzIHdlcmUgaW50cm9kdWNlZCBhZnRlciB0aGUgZmlyc3QKKyAgICAgICB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlIHdhcyBhdmFpbGFibGUuICBDaGVjayB0aGUgU0laRQorICAgICAgIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgZGxfaXRlcmF0ZV9waGRyIGNhbGxiYWNrIHRvIGRldGVybWluZQorICAgICAgIHdoZXRoZXIgb3Igbm90IGVhY2ggbGF0ZXIgbWVtYmVyIGlzIGF2YWlsYWJsZS4gICovCisKKyAgICAvKiBJbmNyZW1lbnRlZCB3aGVuIGEgbmV3IG9iamVjdCBtYXkgaGF2ZSBiZWVuIGFkZGVkLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGRscGlfYWRkczsKKyAgICAvKiBJbmNyZW1lbnRlZCB3aGVuIGFuIG9iamVjdCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuICAqLworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgZGxwaV9zdWJzOworCisgICAgLyogSWYgdGhlcmUgaXMgYSBQVF9UTFMgc2VnbWVudCwgaXRzIG1vZHVsZSBJRCBhcyB1c2VkIGluCisgICAgICAgVExTIHJlbG9jYXRpb25zLCBlbHNlIHplcm8uICAqLworICAgIHNpemVfdCBkbHBpX3Rsc19tb2RpZDsKKworICAgIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsaW5nIHRocmVhZCdzIGluc3RhbmNlIG9mIHRoaXMgbW9kdWxlJ3MKKyAgICAgICBQVF9UTFMgc2VnbWVudCwgaWYgaXQgaGFzIG9uZSBhbmQgaXQgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgICAgaW4gdGhlIGNhbGxpbmcgdGhyZWFkLCBvdGhlcndpc2UgYSBudWxsIHBvaW50ZXIuICAqLworICAgIHZvaWQgKmRscGlfdGxzX2RhdGE7CisgIH07CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBkbF9pdGVyYXRlX3BoZHIgKGludCAoKl9fY2FsbGJhY2spIChzdHJ1Y3QgZGxfcGhkcl9pbmZvICosCisJCQkJCSAgICAgICBzaXplX3QsIHZvaWQgKiksCisJCQkgICAgdm9pZCAqX19kYXRhKTsKKworCisvKiBQcm90b3R5cGVzIGZvciB0aGUgbGQuc28gYXVkaXRpbmcgaW50ZXJmYWNlcy4gIFRoZXNlIGFyZSBub3QKKyAgIGRlZmluZWQgYW55d2hlcmUgaW4gbGQuc28gYnV0IGluc3RlYWQgaGF2ZSB0byBiZSBwcm92aWRlZCBieSB0aGUKKyAgIGF1ZGl0aW5nIERTTy4gICovCitleHRlcm4gdW5zaWduZWQgaW50IGxhX3ZlcnNpb24gKHVuc2lnbmVkIGludCBfX3ZlcnNpb24pOworZXh0ZXJuIHZvaWQgbGFfYWN0aXZpdHkgKHVpbnRwdHJfdCAqX19jb29raWUsIHVuc2lnbmVkIGludCBfX2ZsYWcpOworZXh0ZXJuIGNoYXIgKmxhX29ianNlYXJjaCAoY29uc3QgY2hhciAqX19uYW1lLCB1aW50cHRyX3QgKl9fY29va2llLAorCQkJICAgdW5zaWduZWQgaW50IF9fZmxhZyk7CitleHRlcm4gdW5zaWduZWQgaW50IGxhX29iam9wZW4gKHN0cnVjdCBsaW5rX21hcCAqX19tYXAsIExtaWRfdCBfX2xtaWQsCisJCQkJdWludHB0cl90ICpfX2Nvb2tpZSk7CitleHRlcm4gdm9pZCBsYV9wcmVpbml0ICh1aW50cHRyX3QgKl9fY29va2llKTsKK2V4dGVybiB1aW50cHRyX3QgbGFfc3ltYmluZDMyIChFbGYzMl9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkgICAgICAgdWludHB0cl90ICpfX3JlZmNvb2ssIHVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywgY29uc3QgY2hhciAqX19zeW1uYW1lKTsKK2V4dGVybiB1aW50cHRyX3QgbGFfc3ltYmluZDY0IChFbGY2NF9TeW0gKl9fc3ltLCB1bnNpZ25lZCBpbnQgX19uZHgsCisJCQkgICAgICAgdWludHB0cl90ICpfX3JlZmNvb2ssIHVpbnRwdHJfdCAqX19kZWZjb29rLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqX19mbGFncywgY29uc3QgY2hhciAqX19zeW1uYW1lKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGFfb2JqY2xvc2UgKHVpbnRwdHJfdCAqX19jb29raWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmIC8qIGxpbmsuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hLm91dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTNjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKQEAgLTAsMCArMSwyNjggQEAKKyNpZm5kZWYgX19BX09VVF9HTlVfSF9fCisjZGVmaW5lIF9fQV9PVVRfR05VX0hfXworCisjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KKworI2lmbmRlZiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KKworI2luY2x1ZGUgPGFzbS9hLm91dC5oPgorCisjZW5kaWYgLyogX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fICovCisKKy8qIHRoZXNlIGdvIGluIHRoZSBOX01BQ0hUWVBFIGZpZWxkICovCitlbnVtIG1hY2hpbmVfdHlwZSB7CisjaWYgZGVmaW5lZCAoTV9PTERTVU4yKQorICBNX19PTERTVU4yID0gTV9PTERTVU4yLAorI2Vsc2UKKyAgTV9PTERTVU4yID0gMCwKKyNlbmRpZgorI2lmIGRlZmluZWQgKE1fNjgwMTApCisgIE1fXzY4MDEwID0gTV82ODAxMCwKKyNlbHNlCisgIE1fNjgwMTAgPSAxLAorI2VuZGlmCisjaWYgZGVmaW5lZCAoTV82ODAyMCkKKyAgTV9fNjgwMjAgPSBNXzY4MDIwLAorI2Vsc2UKKyAgTV82ODAyMCA9IDIsCisjZW5kaWYKKyNpZiBkZWZpbmVkIChNX1NQQVJDKQorICBNX19TUEFSQyA9IE1fU1BBUkMsCisjZWxzZQorICBNX1NQQVJDID0gMywKKyNlbmRpZgorICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bidzIG51bWJlcnMgKi8KKyAgTV8zODYgPSAxMDAsCisgIE1fTUlQUzEgPSAxNTEsCS8qIE1JUFMgUjMwMDAvUjMwMDAgYmluYXJ5ICovCisgIE1fTUlQUzIgPSAxNTIJCS8qIE1JUFMgUjYwMDAvUjQwMDAgYmluYXJ5ICovCit9OworCisjaWYgIWRlZmluZWQgKE5fTUFHSUMpCisjZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCisjZW5kaWYKKyNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSAoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweGZmKSkKKyNkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKKyNkZWZpbmUgTl9TRVRfSU5GTyhleGVjLCBtYWdpYywgdHlwZSwgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCisJIHwgKCgoaW50KSh0eXBlKSAmIDB4ZmYpIDw8IDE2KSBcCisJIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQorI2RlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAorCSgoZXhlYykuYV9pbmZvID0gKCgoZXhlYykuYV9pbmZvICYgMHhmZmZmMDAwMCkgfCAoKG1hZ2ljKSAmIDB4ZmZmZikpKQorCisjZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCisJKChleGVjKS5hX2luZm8gPSBcCisJICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCisKKyNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKKwkoKGV4ZWMpLmFfaW5mbyA9IFwKKwkgKChleGVjKS5hX2luZm8mMHgwMGZmZmZmZikgfCAoKChmbGFncykgJiAweGZmKSA8PCAyNCkpCisKKy8qIENvZGUgaW5kaWNhdGluZyBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIE9NQUdJQyAwNDA3CisvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KKyNkZWZpbmUgTk1BR0lDIDA0MTAKKy8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCisjZGVmaW5lIFpNQUdJQyAwNDEzCisvKiBUaGlzIGluZGljYXRlcyBhIGRlbWFuZC1wYWdlZCBleGVjdXRhYmxlIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gCisgICBUaGUgZmlyc3QgcGFnZSBpcyB1bm1hcHBlZCB0byBoZWxwIHRyYXAgTlVMTCBwb2ludGVyIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgUU1BR0lDIDAzMTQKKworLyogQ29kZSBpbmRpY2F0aW5nIGNvcmUgZmlsZS4gICovCisjZGVmaW5lIENNQUdJQyAwNDIxCisKKyNpZiAhZGVmaW5lZCAoTl9CQURNQUcpCisjZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCisJCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAorICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQyBcCisJCSAgICAgICAgJiYgTl9NQUdJQyh4KSAhPSBRTUFHSUMpCisjZW5kaWYKKworI2RlZmluZSBfTl9IRFJPRkYoeCkgKDEwMjQgLSBzaXplb2YgKHN0cnVjdCBleGVjKSkKKworI2lmICFkZWZpbmVkIChOX1RYVE9GRikKKyNkZWZpbmUgTl9UWFRPRkYoeCkgXAorIChOX01BR0lDKHgpID09IFpNQUdJQyA/IF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOiBcCisgIChOX01BR0lDKHgpID09IFFNQUdJQyA/IDAgOiBzaXplb2YgKHN0cnVjdCBleGVjKSkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0RBVE9GRikKKyNkZWZpbmUgTl9EQVRPRkYoeCkgKE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKE5fVFJFTE9GRikKKyNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX0RBVE9GRih4KSArICh4KS5hX2RhdGEpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0RSRUxPRkYpCisjZGVmaW5lIE5fRFJFTE9GRih4KSAoTl9UUkVMT0ZGKHgpICsgTl9UUlNJWkUoeCkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX1NZTU9GRikKKyNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fRFJFTE9GRih4KSArIE5fRFJTSVpFKHgpKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCAoTl9TVFJPRkYpCisjZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArIE5fU1lNU0laRSh4KSkKKyNlbmRpZgorCisvKiBBZGRyZXNzIG9mIHRleHQgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNpZiAhZGVmaW5lZCAoTl9UWFRBRERSKQorI2RlZmluZSBOX1RYVEFERFIoeCkgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gUEFHRV9TSVpFIDogMCkKKyNlbmRpZgorCisvKiBBZGRyZXNzIG9mIGRhdGEgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLgorICAgTm90ZSB0aGF0IGl0IGlzIHVwIHRvIHlvdSB0byBkZWZpbmUgU0VHTUVOVF9TSVpFCisgICBvbiBtYWNoaW5lcyBub3QgbGlzdGVkIGhlcmUuICAqLworI2lmIGRlZmluZWQodmF4KSB8fCBkZWZpbmVkKGhwMzAwKSB8fCBkZWZpbmVkKHB5cikKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIHBhZ2Vfc2l6ZQorI2VuZGlmCisjaWZkZWYJc29ueQorI2RlZmluZQlTRUdNRU5UX1NJWkUJMHgyMDAwCisjZW5kaWYJLyogU29ueS4gICovCisjaWZkZWYgaXM2OGsKKyNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4MjAwMDAKKyNlbmRpZgorI2lmIGRlZmluZWQobTY4aykgJiYgZGVmaW5lZChQT1JUQVIpCisjZGVmaW5lIFBBR0VfU0laRSAweDQwMAorI2RlZmluZSBTRUdNRU5UX1NJWkUgUEFHRV9TSVpFCisjZW5kaWYKKworI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKQorI2RlZmluZSBTRUdNRU5UX1NJWkUJMTAyNAorI2Vsc2UKKyNpZm5kZWYgU0VHTUVOVF9TSVpFCisjZGVmaW5lIFNFR01FTlRfU0laRQlQQUdFX1NJWkUKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBfTl9TRUdNRU5UX1JPVU5EKHgpIEFMSUdOKHgsIFNFR01FTlRfU0laRSkKKworI2RlZmluZSBfTl9UWFRFTkRBRERSKHgpIChOX1RYVEFERFIoeCkrKHgpLmFfdGV4dCkKKworI2lmbmRlZiBOX0RBVEFERFIKKyNkZWZpbmUgTl9EQVRBRERSKHgpIFwKKyAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAoX05fVFhURU5EQUREUih4KSkgXAorICAgICA6IChfTl9TRUdNRU5UX1JPVU5EIChfTl9UWFRFTkRBRERSKHgpKSkpCisjZW5kaWYKKworLyogQWRkcmVzcyBvZiBic3Mgc2VnbWVudCBpbiBtZW1vcnkgYWZ0ZXIgaXQgaXMgbG9hZGVkLiAgKi8KKyNpZiAhZGVmaW5lZCAoTl9CU1NBRERSKQorI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCisjZW5kaWYKKwwKKyNpZiAhZGVmaW5lZCAoTl9OTElTVF9ERUNMQVJFRCkKK3N0cnVjdCBubGlzdCB7CisgIHVuaW9uIHsKKyAgICBjaGFyICpuX25hbWU7CisgICAgc3RydWN0IG5saXN0ICpuX25leHQ7CisgICAgbG9uZyBuX3N0cng7CisgIH0gbl91bjsKKyAgdW5zaWduZWQgY2hhciBuX3R5cGU7CisgIGNoYXIgbl9vdGhlcjsKKyAgc2hvcnQgbl9kZXNjOworICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Cit9OworI2VuZGlmIC8qIG5vIE5fTkxJU1RfREVDTEFSRUQuICAqLworCisjaWYgIWRlZmluZWQgKE5fVU5ERikKKyNkZWZpbmUgTl9VTkRGIDAKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX0FCUykKKyNkZWZpbmUgTl9BQlMgMgorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fVEVYVCkKKyNkZWZpbmUgTl9URVhUIDQKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX0RBVEEpCisjZGVmaW5lIE5fREFUQSA2CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoTl9CU1MpCisjZGVmaW5lIE5fQlNTIDgKKyNlbmRpZgorI2lmICFkZWZpbmVkIChOX0ZOKQorI2RlZmluZSBOX0ZOIDE1CisjZW5kaWYKKworI2lmICFkZWZpbmVkIChOX0VYVCkKKyNkZWZpbmUgTl9FWFQgMQorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fVFlQRSkKKyNkZWZpbmUgTl9UWVBFIDAzNgorI2VuZGlmCisjaWYgIWRlZmluZWQgKE5fU1RBQikKKyNkZWZpbmUgTl9TVEFCIDAzNDAKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIHR5cGUgaW5kaWNhdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3ltYm9sIGFzIGJlaW5nCisgICBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGUgb3RoZXIgc3ltYm9sCisgICBhcHBlYXJzIGFzIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UsIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN5bWJvbC4KKworICAgSW5kaXJlY3Rpb24gaXMgYXN5bW1ldHJpY2FsLiAgVGhlIG90aGVyIHN5bWJvbCdzIHZhbHVlIHdpbGwgYmUgdXNlZAorICAgdG8gc2F0aXNmeSByZXF1ZXN0cyBmb3IgdGhlIGluZGlyZWN0IHN5bWJvbCwgYnV0IG5vdCB2aWNlIHZlcnNhLgorICAgSWYgdGhlIG90aGVyIHN5bWJvbCBkb2VzIG5vdCBoYXZlIGEgZGVmaW5pdGlvbiwgbGlicmFyaWVzIHdpbGwKKyAgIGJlIHNlYXJjaGVkIHRvIGZpbmQgYSBkZWZpbml0aW9uLiAgKi8KKyNkZWZpbmUgTl9JTkRSIDB4YQorCisvKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgorICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCisgICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0CisgICBlbGVtZW50J3MgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgorICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KKworICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAorICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgorICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKKyAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLworCisvKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCisjZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KKyNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCisjZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLworI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLworCisvKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KKyNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLworDAorI2lmICFkZWZpbmVkIChOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCkKKy8qIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHNpbmdsZSByZWxvY2F0aW9uIHRvIGJlIHBlcmZvcm1lZC4KKyAgIFRoZSB0ZXh0LXJlbG9jYXRpb24gc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhIHZlY3RvciBvZiB0aGVzZSBzdHJ1Y3R1cmVzLAorICAgYWxsIG9mIHdoaWNoIGFwcGx5IHRvIHRoZSB0ZXh0IHNlY3Rpb24uCisgICBMaWtld2lzZSwgdGhlIGRhdGEtcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gdGhlIGRhdGEgc2VjdGlvbi4gICovCisKK3N0cnVjdCByZWxvY2F0aW9uX2luZm8KK3sKKyAgLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCisgIGludCByX2FkZHJlc3M7CisgIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLworICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7CisgIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKKyAgICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCisgICAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCisgIHVuc2lnbmVkIGludCByX3BjcmVsOjE7CisgIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KKyAgICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7CisgIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCisgICAgICAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKKwkgIGluIGZpbGUncyB0aGUgc3ltYm9sIHRhYmxlLgorICAgICAwID0+IHJlbG9jYXRlIHdpdGggdGhlIGFkZHJlc3Mgb2YgYSBzZWdtZW50LgorICAgICAgICAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUworCSAgKHRoZSBOX0VYVCBiaXQgbWF5IGJlIHNldCBhbHNvLCBidXQgc2lnbmlmaWVzIG5vdGhpbmcpLiAgKi8KKyAgdW5zaWduZWQgaW50IHJfZXh0ZXJuOjE7CisgIC8qIEZvdXIgYml0cyB0aGF0IGFyZW4ndCB1c2VkLCBidXQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlCisgICAgIGl0IGlzIGRlc2lyYWJsZSB0byBjbGVhciB0aGVtLiAgKi8KKyNpZmRlZiBOUzMySworICB1bnNpZ25lZCByX2JzcjoxOworICB1bnNpZ25lZCByX2Rpc3A6MTsKKyAgdW5zaWduZWQgcl9wYWQ6MjsKKyNlbHNlCisgIHVuc2lnbmVkIGludCByX3BhZDo0OworI2VuZGlmCit9OworI2VuZGlmIC8qIG5vIE5fUkVMT0NBVElPTl9JTkZPX0RFQ0xBUkVELiAgKi8KKworCisjZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FjY3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWNjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWE1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FjY3QuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqICBCU0QgUHJvY2VzcyBBY2NvdW50aW5nIGZvciBMaW51eCAtIERlZmluaXRpb25zCisgKgorICogIEF1dGhvcjogTWFyY28gdmFuIFdpZXJpbmdlbiAobXZ3QHBsYW5ldHMuZWxtLm5ldCkKKyAqCisgKiAgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorICogIEJTRC1zdHlsZSBwcm9jZXNzIGFjY291bnRpbmcuIFRoZSBrZXJuZWwgYWNjb3VudGluZyBjb2RlIGFuZCBhbGwKKyAqICB1c2VyLWxldmVsIHByb2dyYW1zIHRoYXQgdHJ5IHRvIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUKKyAqICBwcm9jZXNzIGFjY291bnRpbmcgbG9nIG11c3QgaW5jbHVkZSB0aGlzIGZpbGUuCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSAtIDE5OTcgTWFyY28gdmFuIFdpZXJpbmdlbiAtIEVMTSBDb25zdWx0YW5jeSBCLlYuCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FDQ1RfSAorI2RlZmluZSBfTElOVVhfQUNDVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiAKKyAqICBjb21wX3QgaXMgYSAxNi1iaXQgImZsb2F0aW5nIiBwb2ludCBudW1iZXIgd2l0aCBhIDMtYml0IGJhc2UgOAorICogIGV4cG9uZW50IGFuZCBhIDEzLWJpdCBmcmFjdGlvbi4KKyAqICBjb21wMl90IGlzIDI0LWJpdCB3aXRoIDUtYml0IGJhc2UgMiBleHBvbmVudCBhbmQgMjAgYml0IGZyYWN0aW9uCisgKiAgKGxlYWRpbmcgMSBub3Qgc3RvcmVkKS4KKyAqICBTZWUgbGludXgva2VybmVsL2FjY3QuYyBmb3IgdGhlIHNwZWNpZmljIGVuY29kaW5nIHN5c3RlbXMgdXNlZC4KKyAqLworCit0eXBlZGVmIF9fdTE2CWNvbXBfdDsKK3R5cGVkZWYgX191MzIJY29tcDJfdDsKKworLyoKKyAqICAgYWNjb3VudGluZyBmaWxlIHJlY29yZAorICoKKyAqICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB3cml0dGVuIG91dCB0byB0aGUKKyAqICAgcHJvY2VzcyBhY2NvdW50aW5nIGZpbGUgd2hlbmV2ZXIgYSBwcm9jZXNzIGV4aXRzLgorICovCisKKyNkZWZpbmUgQUNDVF9DT01NCTE2CisKK3N0cnVjdCBhY2N0Cit7CisJY2hhcgkJYWNfZmxhZzsJCS8qIEZsYWdzICovCisJY2hhcgkJYWNfdmVyc2lvbjsJCS8qIEFsd2F5cyBzZXQgdG8gQUNDVF9WRVJTSU9OICovCisJLyogZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IGJhY2sgdW50aWwgMi4wICovCisJX191MTYJCWFjX3VpZDE2OwkJLyogTFNCIG9mIFJlYWwgVXNlciBJRCAqLworCV9fdTE2CQlhY19naWQxNjsJCS8qIExTQiBvZiBSZWFsIEdyb3VwIElEICovCisJX191MTYJCWFjX3R0eTsJCQkvKiBDb250cm9sIFRlcm1pbmFsICovCisJX191MzIJCWFjX2J0aW1lOwkJLyogUHJvY2VzcyBDcmVhdGlvbiBUaW1lICovCisJY29tcF90CQlhY191dGltZTsJCS8qIFVzZXIgVGltZSAqLworCWNvbXBfdAkJYWNfc3RpbWU7CQkvKiBTeXN0ZW0gVGltZSAqLworCWNvbXBfdAkJYWNfZXRpbWU7CQkvKiBFbGFwc2VkIFRpbWUgKi8KKwljb21wX3QJCWFjX21lbTsJCQkvKiBBdmVyYWdlIE1lbW9yeSBVc2FnZSAqLworCWNvbXBfdAkJYWNfaW87CQkJLyogQ2hhcnMgVHJhbnNmZXJyZWQgKi8KKwljb21wX3QJCWFjX3J3OwkJCS8qIEJsb2NrcyBSZWFkIG9yIFdyaXR0ZW4gKi8KKwljb21wX3QJCWFjX21pbmZsdDsJCS8qIE1pbm9yIFBhZ2VmYXVsdHMgKi8KKwljb21wX3QJCWFjX21hamZsdDsJCS8qIE1ham9yIFBhZ2VmYXVsdHMgKi8KKwljb21wX3QJCWFjX3N3YXBzOwkJLyogTnVtYmVyIG9mIFN3YXBzICovCisvKiBtNjhrIGhhZCBubyBwYWRkaW5nIGhlcmUuICovCisjaWYgIWRlZmluZWQoQ09ORklHX002OEspIHx8ICFkZWZpbmVkKF9fS0VSTkVMX18pCisJX191MTYJCWFjX2FoejsJCQkvKiBBSFogKi8KKyNlbmRpZgorCV9fdTMyCQlhY19leGl0Y29kZTsJCS8qIEV4aXRjb2RlICovCisJY2hhcgkJYWNfY29tbVtBQ0NUX0NPTU0gKyAxXTsJLyogQ29tbWFuZCBOYW1lICovCisJX191OAkJYWNfZXRpbWVfaGk7CQkvKiBFbGFwc2VkIFRpbWUgTVNCICovCisJX191MTYJCWFjX2V0aW1lX2xvOwkJLyogRWxhcHNlZCBUaW1lIExTQiAqLworCV9fdTMyCQlhY191aWQ7CQkJLyogUmVhbCBVc2VyIElEICovCisJX191MzIJCWFjX2dpZDsJCQkvKiBSZWFsIEdyb3VwIElEICovCit9OworCitzdHJ1Y3QgYWNjdF92MworeworCWNoYXIJCWFjX2ZsYWc7CQkvKiBGbGFncyAqLworCWNoYXIJCWFjX3ZlcnNpb247CQkvKiBBbHdheXMgc2V0IHRvIEFDQ1RfVkVSU0lPTiAqLworCV9fdTE2CQlhY190dHk7CQkJLyogQ29udHJvbCBUZXJtaW5hbCAqLworCV9fdTMyCQlhY19leGl0Y29kZTsJCS8qIEV4aXRjb2RlICovCisJX191MzIJCWFjX3VpZDsJCQkvKiBSZWFsIFVzZXIgSUQgKi8KKwlfX3UzMgkJYWNfZ2lkOwkJCS8qIFJlYWwgR3JvdXAgSUQgKi8KKwlfX3UzMgkJYWNfcGlkOwkJCS8qIFByb2Nlc3MgSUQgKi8KKwlfX3UzMgkJYWNfcHBpZDsJCS8qIFBhcmVudCBQcm9jZXNzIElEICovCisJX191MzIJCWFjX2J0aW1lOwkJLyogUHJvY2VzcyBDcmVhdGlvbiBUaW1lICovCisJZmxvYXQJCWFjX2V0aW1lOwkJLyogRWxhcHNlZCBUaW1lICovCisJY29tcF90CQlhY191dGltZTsJCS8qIFVzZXIgVGltZSAqLworCWNvbXBfdAkJYWNfc3RpbWU7CQkvKiBTeXN0ZW0gVGltZSAqLworCWNvbXBfdAkJYWNfbWVtOwkJCS8qIEF2ZXJhZ2UgTWVtb3J5IFVzYWdlICovCisJY29tcF90CQlhY19pbzsJCQkvKiBDaGFycyBUcmFuc2ZlcnJlZCAqLworCWNvbXBfdAkJYWNfcnc7CQkJLyogQmxvY2tzIFJlYWQgb3IgV3JpdHRlbiAqLworCWNvbXBfdAkJYWNfbWluZmx0OwkJLyogTWlub3IgUGFnZWZhdWx0cyAqLworCWNvbXBfdAkJYWNfbWFqZmx0OwkJLyogTWFqb3IgUGFnZWZhdWx0cyAqLworCWNvbXBfdAkJYWNfc3dhcHM7CQkvKiBOdW1iZXIgb2YgU3dhcHMgKi8KKwljaGFyCQlhY19jb21tW0FDQ1RfQ09NTV07CS8qIENvbW1hbmQgTmFtZSAqLworfTsKKworLyoKKyAqICBhY2NvdW50aW5nIGZsYWdzCisgKi8KKwkJCQkvKiBiaXQgc2V0IHdoZW4gdGhlIHByb2Nlc3MgLi4uICovCisjZGVmaW5lIEFGT1JLCQkweDAxCS8qIC4uLiBleGVjdXRlZCBmb3JrLCBidXQgZGlkIG5vdCBleGVjICovCisjZGVmaW5lIEFTVQkJMHgwMgkvKiAuLi4gdXNlZCBzdXBlci11c2VyIHByaXZpbGVnZXMgKi8KKyNkZWZpbmUgQUNPTVBBVAkJMHgwNAkvKiAuLi4gdXNlZCBjb21wYXRpYmlsaXR5IG1vZGUgKFZBWCBvbmx5IG5vdCB1c2VkKSAqLworI2RlZmluZSBBQ09SRQkJMHgwOAkvKiAuLi4gZHVtcGVkIGNvcmUgKi8KKyNkZWZpbmUgQVhTSUcJCTB4MTAJLyogLi4uIHdhcyBraWxsZWQgYnkgYSBzaWduYWwgKi8KKworI2lmZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBBQ0NUX0JZVEVPUkRFUgkweDgwCS8qIGFjY291bnRpbmcgZmlsZSBpcyBiaWcgZW5kaWFuICovCisjZWxzZQorI2RlZmluZSBBQ0NUX0JZVEVPUkRFUgkweDAwCS8qIGFjY291bnRpbmcgZmlsZSBpcyBsaXR0bGUgZW5kaWFuICovCisjZW5kaWYKKworI2RlZmluZSBBQ0NUX1ZFUlNJT04JMgorI2RlZmluZSBBSFoJCShIWikKKworCisjZW5kaWYJLyogX0xJTlVYX0FDQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZGIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWRiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxNTAyNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWRiLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBBREIgKEFwcGxlIERlc2t0b3AgQnVzKSBzdXBwb3J0LgorICovCisjaWZuZGVmIF9fQURCX0gKKyNkZWZpbmUgX19BREJfSAorCisvKiBBREIgY29tbWFuZHMgKi8KKyNkZWZpbmUgQURCX0JVU1JFU0VUCQkwCisjZGVmaW5lIEFEQl9GTFVTSChpZCkJCSgweDAxIHwgKChpZCkgPDwgNCkpCisjZGVmaW5lIEFEQl9XUklURVJFRyhpZCwgcmVnKQkoMHgwOCB8IChyZWcpIHwgKChpZCkgPDwgNCkpCisjZGVmaW5lIEFEQl9SRUFEUkVHKGlkLCByZWcpCSgweDBDIHwgKHJlZykgfCAoKGlkKSA8PCA0KSkKKworLyogQURCIGRlZmF1bHQgZGV2aWNlIElEcyAodXBwZXIgNCBiaXRzIG9mIEFEQiBjb21tYW5kIGJ5dGUpICovCisjZGVmaW5lIEFEQl9ET05HTEUJMQkvKiAic29mdHdhcmUgZXhlY3V0aW9uIGNvbnRyb2wiIGRldmljZXMgKi8KKyNkZWZpbmUgQURCX0tFWUJPQVJECTIKKyNkZWZpbmUgQURCX01PVVNFCTMKKyNkZWZpbmUgQURCX1RBQkxFVAk0CisjZGVmaW5lIEFEQl9NT0RFTQk1CisjZGVmaW5lIEFEQl9NSVNDCTcJLyogbWF5YmUgYSBtb25pdG9yICovCisKKyNkZWZpbmUgQURCX1JFVF9PSwkwCisjZGVmaW5lIEFEQl9SRVRfVElNRU9VVAkzCisKKy8qIFRoZSBraW5kIG9mIEFEQiByZXF1ZXN0LiBUaGUgY29udHJvbGxlciBtYXkgZW11bGF0ZSBzb21lCisgICBvciBhbGwgb2YgdGhvc2UgQ1VEQS9QTVUgcGFja2V0IGtpbmRzICovCisjZGVmaW5lIEFEQl9QQUNLRVQJMAorI2RlZmluZSBDVURBX1BBQ0tFVAkxCisjZGVmaW5lIEVSUk9SX1BBQ0tFVAkyCisjZGVmaW5lIFRJTUVSX1BBQ0tFVAkzCisjZGVmaW5lIFBPV0VSX1BBQ0tFVAk0CisjZGVmaW5lIE1BQ0lJQ19QQUNLRVQJNQorI2RlZmluZSBQTVVfUEFDS0VUCTYKKyNkZWZpbmUgQURCX1FVRVJZCTcKKworLyogQURCIHF1ZXJpZXMgKi8KKworLyogQURCX1FVRVJZX0dFVERFVklORk8KKyAqIFF1ZXJ5IEFEQiBzbG90IGZvciBkZXZpY2UgcHJlc2VuY2UKKyAqIGRhdGFbMl0gPSBpZCwgcmVwWzBdID0gb3JpZyBhZGRyLCByZXBbMV0gPSBoYW5kbGVyX2lkCisgKi8KKyNkZWZpbmUgQURCX1FVRVJZX0dFVERFVklORk8JMQorCisKKyNlbmRpZiAvKiBfX0FEQl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FkZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYWRmc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOWE1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FkZnNfZnMuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9BREZTX0ZTX0gKKyNkZWZpbmUgX0FERlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKgorICogRGlzYyBSZWNvcmQgYXQgZGlzYyBhZGRyZXNzIDB4YzAwCisgKi8KK3N0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgeworICAgIF9fdTggIGxvZzJzZWNzaXplOworICAgIF9fdTggIHNlY3NwZXJ0cmFjazsKKyAgICBfX3U4ICBoZWFkczsKKyAgICBfX3U4ICBkZW5zaXR5OworICAgIF9fdTggIGlkbGVuOworICAgIF9fdTggIGxvZzJicG1iOworICAgIF9fdTggIHNrZXc7CisgICAgX191OCAgYm9vdG9wdGlvbjsKKyAgICBfX3U4ICBsb3dzZWN0b3I7CisgICAgX191OCAgbnpvbmVzOworICAgIF9fbGUxNiB6b25lX3NwYXJlOworICAgIF9fbGUzMiByb290OworICAgIF9fbGUzMiBkaXNjX3NpemU7CisgICAgX19sZTE2IGRpc2NfaWQ7CisgICAgX191OCAgZGlzY19uYW1lWzEwXTsKKyAgICBfX2xlMzIgZGlzY190eXBlOworICAgIF9fbGUzMiBkaXNjX3NpemVfaGlnaDsKKyAgICBfX3U4ICBsb2cyc2hhcmVzaXplOjQ7CisgICAgX191OCAgdW51c2VkNDA6NDsKKyAgICBfX3U4ICBiaWdfZmxhZzoxOworICAgIF9fdTggIHVudXNlZDQxOjE7CisgICAgX191OCAgbnpvbmVzX2hpZ2g7CisgICAgX19sZTMyIGZvcm1hdF92ZXJzaW9uOworICAgIF9fbGUzMiByb290X3NpemU7CisgICAgX191OCAgdW51c2VkNTJbNjAgLSA1Ml07Cit9OworCisjZGVmaW5lIEFERlNfRElTQ1JFQ09SRAkJKDB4YzAwKQorI2RlZmluZSBBREZTX0RSX09GRlNFVAkJKDB4MWMwKQorI2RlZmluZSBBREZTX0RSX1NJWkUJCSA2MAorI2RlZmluZSBBREZTX0RSX1NJWkVfQklUUwkoQURGU19EUl9TSVpFIDw8IDMpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FmZnNfaGFyZGJsb2Nrcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZmZzX2hhcmRibG9ja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWI5NDhjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZmZzX2hhcmRibG9ja3MuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmCUFGRlNfSEFSREJMT0NLU19ICisjZGVmaW5lCUFGRlNfSEFSREJMT0NLU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBKdXN0IHRoZSBuZWVkZWQgZGVmaW5pdGlvbnMgZm9yIHRoZSBSREIgb2YgYW4gQW1pZ2EgSEQuICovCisKK3N0cnVjdCBSaWdpZERpc2tCbG9jayB7CisJX191MzIJcmRiX0lEOworCV9fYmUzMglyZGJfU3VtbWVkTG9uZ3M7CisJX19zMzIJcmRiX0Noa1N1bTsKKwlfX3UzMglyZGJfSG9zdElEOworCV9fYmUzMglyZGJfQmxvY2tCeXRlczsKKwlfX3UzMglyZGJfRmxhZ3M7CisJX191MzIJcmRiX0JhZEJsb2NrTGlzdDsKKwlfX2JlMzIJcmRiX1BhcnRpdGlvbkxpc3Q7CisJX191MzIJcmRiX0ZpbGVTeXNIZWFkZXJMaXN0OworCV9fdTMyCXJkYl9Ecml2ZUluaXQ7CisJX191MzIJcmRiX1Jlc2VydmVkMVs2XTsKKwlfX3UzMglyZGJfQ3lsaW5kZXJzOworCV9fdTMyCXJkYl9TZWN0b3JzOworCV9fdTMyCXJkYl9IZWFkczsKKwlfX3UzMglyZGJfSW50ZXJsZWF2ZTsKKwlfX3UzMglyZGJfUGFyazsKKwlfX3UzMglyZGJfUmVzZXJ2ZWQyWzNdOworCV9fdTMyCXJkYl9Xcml0ZVByZUNvbXA7CisJX191MzIJcmRiX1JlZHVjZWRXcml0ZTsKKwlfX3UzMglyZGJfU3RlcFJhdGU7CisJX191MzIJcmRiX1Jlc2VydmVkM1s1XTsKKwlfX3UzMglyZGJfUkRCQmxvY2tzTG87CisJX191MzIJcmRiX1JEQkJsb2Nrc0hpOworCV9fdTMyCXJkYl9Mb0N5bGluZGVyOworCV9fdTMyCXJkYl9IaUN5bGluZGVyOworCV9fdTMyCXJkYl9DeWxCbG9ja3M7CisJX191MzIJcmRiX0F1dG9QYXJrU2Vjb25kczsKKwlfX3UzMglyZGJfSGlnaFJEU0tCbG9jazsKKwlfX3UzMglyZGJfUmVzZXJ2ZWQ0OworCWNoYXIJcmRiX0Rpc2tWZW5kb3JbOF07CisJY2hhcglyZGJfRGlza1Byb2R1Y3RbMTZdOworCWNoYXIJcmRiX0Rpc2tSZXZpc2lvbls0XTsKKwljaGFyCXJkYl9Db250cm9sbGVyVmVuZG9yWzhdOworCWNoYXIJcmRiX0NvbnRyb2xsZXJQcm9kdWN0WzE2XTsKKwljaGFyCXJkYl9Db250cm9sbGVyUmV2aXNpb25bNF07CisJX191MzIJcmRiX1Jlc2VydmVkNVsxMF07Cit9OworCisjZGVmaW5lCUlETkFNRV9SSUdJRERJU0sJMHg1MjQ0NTM0QgkvKiAiUkRTSyIgKi8KKworc3RydWN0IFBhcnRpdGlvbkJsb2NrIHsKKwlfX2JlMzIJcGJfSUQ7CisJX19iZTMyCXBiX1N1bW1lZExvbmdzOworCV9fczMyCXBiX0Noa1N1bTsKKwlfX3UzMglwYl9Ib3N0SUQ7CisJX19iZTMyCXBiX05leHQ7CisJX191MzIJcGJfRmxhZ3M7CisJX191MzIJcGJfUmVzZXJ2ZWQxWzJdOworCV9fdTMyCXBiX0RldkZsYWdzOworCV9fdTgJcGJfRHJpdmVOYW1lWzMyXTsKKwlfX3UzMglwYl9SZXNlcnZlZDJbMTVdOworCV9fYmUzMglwYl9FbnZpcm9ubWVudFsxN107CisJX191MzIJcGJfRVJlc2VydmVkWzE1XTsKK307CisKKyNkZWZpbmUJSUROQU1FX1BBUlRJVElPTgkweDUwNDE1MjU0CS8qICJQQVJUIiAqLworCisjZGVmaW5lIFJEQl9BTExPQ0FUSU9OX0xJTUlUCTE2CisKKyNlbmRpZgkvKiBBRkZTX0hBUkRCTE9DS1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZ3BnYXJ0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FncGdhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjU0NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hZ3BnYXJ0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBBR1BHQVJUIG1vZHVsZSB2ZXJzaW9uIDAuOTkKKyAqIENvcHlyaWdodCAoQykgMTk5OSBKZWZmIEhhcnRtYW5uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBYaSBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogSkVGRiBIQVJUTUFOTiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfQUdQX0gKKyNkZWZpbmUgX0FHUF9IIDEKKworI2RlZmluZSBBR1BJT0NfQkFTRSAgICAgICAnQScKKyNkZWZpbmUgQUdQSU9DX0lORk8gICAgICAgX0lPUiAoQUdQSU9DX0JBU0UsIDAsIHN0cnVjdCBhZ3BfaW5mbyopCisjZGVmaW5lIEFHUElPQ19BQ1FVSVJFICAgIF9JTyAgKEFHUElPQ19CQVNFLCAxKQorI2RlZmluZSBBR1BJT0NfUkVMRUFTRSAgICBfSU8gIChBR1BJT0NfQkFTRSwgMikKKyNkZWZpbmUgQUdQSU9DX1NFVFVQICAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDMsIHN0cnVjdCBhZ3Bfc2V0dXAqKQorI2RlZmluZSBBR1BJT0NfUkVTRVJWRSAgICBfSU9XIChBR1BJT0NfQkFTRSwgNCwgc3RydWN0IGFncF9yZWdpb24qKQorI2RlZmluZSBBR1BJT0NfUFJPVEVDVCAgICBfSU9XIChBR1BJT0NfQkFTRSwgNSwgc3RydWN0IGFncF9yZWdpb24qKQorI2RlZmluZSBBR1BJT0NfQUxMT0NBVEUgICBfSU9XUihBR1BJT0NfQkFTRSwgNiwgc3RydWN0IGFncF9hbGxvY2F0ZSopCisjZGVmaW5lIEFHUElPQ19ERUFMTE9DQVRFIF9JT1cgKEFHUElPQ19CQVNFLCA3LCBpbnQpCisjZGVmaW5lIEFHUElPQ19CSU5EICAgICAgIF9JT1cgKEFHUElPQ19CQVNFLCA4LCBzdHJ1Y3QgYWdwX2JpbmQqKQorI2RlZmluZSBBR1BJT0NfVU5CSU5EICAgICBfSU9XIChBR1BJT0NfQkFTRSwgOSwgc3RydWN0IGFncF91bmJpbmQqKQorCisjZGVmaW5lIEFHUF9ERVZJQ0UgICAgICAiL2Rldi9hZ3BnYXJ0IgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3N0cnVjdCBhZ3BfdmVyc2lvbiB7CisJX191MTYgbWFqb3I7CisJX191MTYgbWlub3I7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfYWdwX2luZm8geworCXN0cnVjdCBhZ3BfdmVyc2lvbiB2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgICAgICAgICovCisJX191MzIgYnJpZGdlX2lkOwkvKiBicmlkZ2UgdmVuZG9yL2RldmljZSAgICAgICAgICovCisJX191MzIgYWdwX21vZGU7CQkvKiBtb2RlIGluZm8gb2YgYnJpZGdlICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyBhcGVyX2Jhc2U7LyogYmFzZSBvZiBhcGVydHVyZSAgICAgICAgICAgICAqLworCXNpemVfdCBhcGVyX3NpemU7CS8qIHNpemUgb2YgYXBlcnR1cmUgICAgICAgICAgICAgKi8KKwlzaXplX3QgcGdfdG90YWw7CS8qIG1heCBwYWdlcyAoc3dhcCArIHN5c3RlbSkgICAgKi8KKwlzaXplX3QgcGdfc3lzdGVtOwkvKiBtYXggcGFnZXMgKHN5c3RlbSkgICAgICAgICAgICovCisJc2l6ZV90IHBnX3VzZWQ7CQkvKiBjdXJyZW50IHBhZ2VzIHVzZWQgICAgICAgICAgICovCit9IGFncF9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBfYWdwX3NldHVwIHsKKwlfX3UzMiBhZ3BfbW9kZTsJCS8qIG1vZGUgaW5mbyBvZiBicmlkZ2UgICAgICAgICAgKi8KK30gYWdwX3NldHVwOworCisvKgorICogVGhlICJwcm90IiBkb3duIGJlbG93IG5lZWRzIHN0aWxsIGEgInNsZWVwIiBmbGFnIHNvbWVob3cgLi4uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9hZ3Bfc2VnbWVudCB7CisJb2ZmX3QgcGdfc3RhcnQ7CQkvKiBzdGFydGluZyBwYWdlIHRvIHBvcHVsYXRlICAgICovCisJc2l6ZV90IHBnX2NvdW50OwkvKiBudW1iZXIgb2YgcGFnZXMgICAgICAgICAgICAgICovCisJaW50IHByb3Q7CQkvKiBwcm90IGZsYWdzIGZvciBtbWFwICAgICAgICAgICovCit9IGFncF9zZWdtZW50OworCit0eXBlZGVmIHN0cnVjdCBfYWdwX3JlZ2lvbiB7CisJcGlkX3QgcGlkOwkJLyogcGlkIG9mIHByb2Nlc3MgICAgICAgICAgICAgICAqLworCXNpemVfdCBzZWdfY291bnQ7CS8qIG51bWJlciBvZiBzZWdtZW50cyAgICAgICAgICAgKi8KKwlzdHJ1Y3QgX2FncF9zZWdtZW50ICpzZWdfbGlzdDsKK30gYWdwX3JlZ2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX2FncF9hbGxvY2F0ZSB7CisJaW50IGtleTsJCS8qIHRhZyBvZiBhbGxvY2F0aW9uICAgICAgICAgICAgKi8KKwlzaXplX3QgcGdfY291bnQ7CS8qIG51bWJlciBvZiBwYWdlcyAgICAgICAgICAgICAgKi8KKwlfX3UzMiB0eXBlOwkJLyogMCA9PSBub3JtYWwsIG90aGVyIGRldnNwZWMgICAqLworICAgCV9fdTMyIHBoeXNpY2FsOyAgICAgICAgIC8qIGRldmljZSBzcGVjaWZpYyAoc29tZSBkZXZpY2VzICAKKwkJCQkgKiBuZWVkIGEgcGh5cyBhZGRyZXNzIG9mIHRoZSAgICAgCisJCQkJICogYWN0dWFsIHBhZ2UgYmVoaW5kIHRoZSBnYXR0ICAgIAorCQkJCSAqIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGFncF9hbGxvY2F0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2FncF9iaW5kIHsKKwlpbnQga2V5OwkJLyogdGFnIG9mIGFsbG9jYXRpb24gICAgICAgICAgICAqLworCW9mZl90IHBnX3N0YXJ0OwkJLyogc3RhcnRpbmcgcGFnZSB0byBwb3B1bGF0ZSAgICAqLworfSBhZ3BfYmluZDsKKwordHlwZWRlZiBzdHJ1Y3QgX2FncF91bmJpbmQgeworCWludCBrZXk7CQkvKiB0YWcgb2YgYWxsb2NhdGlvbiAgICAgICAgICAgICovCisJX191MzIgcHJpb3JpdHk7CQkvKiBwcmlvcml0eSBmb3IgcGFnaW5nIG91dCAgICAgICovCit9IGFncF91bmJpbmQ7CisKKworI2VuZGlmCQkJCS8qIF9BR1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAxNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9haW9fYWJpLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qIGluY2x1ZGUvbGludXgvYWlvX2FiaS5oCisgKgorICogQ29weXJpZ2h0IDIwMDAsMjAwMSwyMDAyIFJlZCBIYXQuCisgKgorICogV3JpdHRlbiBieSBCZW5qYW1pbiBMYUhhaXNlIDxiY3JsQGt2YWNrLm9yZz4KKyAqCisgKiBEaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMdjIgKHNlZSAuLi8uLi9DT1BZSU5HKSBvciB1bmRlciAKKyAqIHRoZSBmb2xsb3dpbmcgdGVybXMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLiAgUmVkIEhhdCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQKKyAqIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBSRUQgSEFUIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgUkVEIEhBVCBIQVMgQkVFTiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUkVEIEhBVCBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIiBCQVNJUywgQU5ECisgKiBSRUQgSEFUIEhBUyBOTyBPQkxJR0FUSU9OIFRPIFBST1ZJREUgTUFJTlRFTkFOQ0UsIFNVUFBPUlQsIFVQREFURVMsCisgKiBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKi8KKyNpZm5kZWYgX19MSU5VWF9fQUlPX0FCSV9ICisjZGVmaW5lIF9fTElOVVhfX0FJT19BQklfSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJYWlvX2NvbnRleHRfdDsKKworZW51bSB7CisJSU9DQl9DTURfUFJFQUQgPSAwLAorCUlPQ0JfQ01EX1BXUklURSA9IDEsCisJSU9DQl9DTURfRlNZTkMgPSAyLAorCUlPQ0JfQ01EX0ZEU1lOQyA9IDMsCisJLyogVGhlc2UgdHdvIGFyZSBleHBlcmltZW50YWwuCisJICogSU9DQl9DTURfUFJFQURYID0gNCwKKwkgKiBJT0NCX0NNRF9QT0xMID0gNSwKKwkgKi8KKwlJT0NCX0NNRF9OT09QID0gNiwKKwlJT0NCX0NNRF9QUkVBRFYgPSA3LAorCUlPQ0JfQ01EX1BXUklURVYgPSA4LAorfTsKKworLyoKKyAqIFZhbGlkIGZsYWdzIGZvciB0aGUgImFpb19mbGFncyIgbWVtYmVyIG9mIHRoZSAic3RydWN0IGlvY2IiLgorICoKKyAqIElPQ0JfRkxBR19SRVNGRCAtIFNldCBpZiB0aGUgImFpb19yZXNmZCIgbWVtYmVyIG9mIHRoZSAic3RydWN0IGlvY2IiCisgKiAgICAgICAgICAgICAgICAgICBpcyB2YWxpZC4KKyAqLworI2RlZmluZSBJT0NCX0ZMQUdfUkVTRkQJCSgxIDw8IDApCisKKy8qIHJlYWQoKSBmcm9tIC9kZXYvYWlvIHJldHVybnMgdGhlc2Ugc3RydWN0dXJlcy4gKi8KK3N0cnVjdCBpb19ldmVudCB7CisJX191NjQJCWRhdGE7CQkvKiB0aGUgZGF0YSBmaWVsZCBmcm9tIHRoZSBpb2NiICovCisJX191NjQJCW9iajsJCS8qIHdoYXQgaW9jYiB0aGlzIGV2ZW50IGNhbWUgZnJvbSAqLworCV9fczY0CQlyZXM7CQkvKiByZXN1bHQgY29kZSBmb3IgdGhpcyBldmVudCAqLworCV9fczY0CQlyZXMyOwkJLyogc2Vjb25kYXJ5IHJlc3VsdCAqLworfTsKKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBQQURERUQoeCx5KQl4LCB5CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgUEFEREVEKHgseSkJeSwgeAorI2Vsc2UKKyNlcnJvciBlZGl0IGZvciB5b3VyIG9kZCBieXRlb3JkZXIuCisjZW5kaWYKKworLyoKKyAqIHdlIGFsd2F5cyB1c2UgYSA2NGJpdCBvZmZfdCB3aGVuIGNvbW11bmljYXRpbmcKKyAqIHdpdGggdXNlcmxhbmQuICBpdHMgdXAgdG8gbGlicmFyaWVzIHRvIGRvIHRoZQorICogcHJvcGVyIHBhZGRpbmcgYW5kIGFpb19lcnJvciBhYnN0cmFjdGlvbgorICovCisKK3N0cnVjdCBpb2NiIHsKKwkvKiB0aGVzZSBhcmUgaW50ZXJuYWwgdG8gdGhlIGtlcm5lbC9saWJjLiAqLworCV9fdTY0CWFpb19kYXRhOwkvKiBkYXRhIHRvIGJlIHJldHVybmVkIGluIGV2ZW50J3MgZGF0YSAqLworCV9fdTMyCVBBRERFRChhaW9fa2V5LCBhaW9fcmVzZXJ2ZWQxKTsKKwkJCQkvKiB0aGUga2VybmVsIHNldHMgYWlvX2tleSB0byB0aGUgcmVxICMgKi8KKworCS8qIGNvbW1vbiBmaWVsZHMgKi8KKwlfX3UxNglhaW9fbGlvX29wY29kZTsJLyogc2VlIElPQ0JfQ01EXyBhYm92ZSAqLworCV9fczE2CWFpb19yZXFwcmlvOworCV9fdTMyCWFpb19maWxkZXM7CisKKwlfX3U2NAlhaW9fYnVmOworCV9fdTY0CWFpb19uYnl0ZXM7CisJX19zNjQJYWlvX29mZnNldDsKKworCS8qIGV4dHJhIHBhcmFtZXRlcnMgKi8KKwlfX3U2NAlhaW9fcmVzZXJ2ZWQyOwkvKiBUT0RPOiB1c2UgdGhpcyBmb3IgYSAoc3RydWN0IHNpZ2V2ZW50ICopICovCisKKwkvKiBmbGFncyBmb3IgdGhlICJzdHJ1Y3QgaW9jYiIgKi8KKwlfX3UzMglhaW9fZmxhZ3M7CisKKwkvKgorCSAqIGlmIHRoZSBJT0NCX0ZMQUdfUkVTRkQgZmxhZyBvZiAiYWlvX2ZsYWdzIiBpcyBzZXQsIHRoaXMgaXMgYW4KKwkgKiBldmVudGZkIHRvIHNpZ25hbCBBSU8gcmVhZGluZXNzIHRvCisJICovCisJX191MzIJYWlvX3Jlc2ZkOworfTsgLyogNjQgYnl0ZXMgKi8KKworI3VuZGVmIElGQklHCisjdW5kZWYgSUZMSVRUTEUKKworI2VuZGlmIC8qIF9fTElOVVhfX0FJT19BQklfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FwbV9iaW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2FwbV9iaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlMTlhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXBtX2Jpb3MuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBfTElOVVhfQVBNX0gKKyNkZWZpbmUgX0xJTlVYX0FQTV9ICisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIHRoZSBpbnRlcmZhY2UgdG8gYW4gQVBNIEJJT1MKKyAqIENvcHlyaWdodCAxOTk0LTIwMDEgU3RlcGhlbiBSb3Rod2VsbCAoc2ZyQGNhbmIuYXV1Zy5vcmcuYXUpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CWFwbV9ldmVudF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlhcG1fZXZlbnRpbmZvX3Q7CisKK3N0cnVjdCBhcG1fYmlvc19pbmZvIHsKKwlfX3UxNgl2ZXJzaW9uOworCV9fdTE2CWNzZWc7CisJX191MzIJb2Zmc2V0OworCV9fdTE2CWNzZWdfMTY7CisJX191MTYJZHNlZzsKKwlfX3UxNglmbGFnczsKKwlfX3UxNgljc2VnX2xlbjsKKwlfX3UxNgljc2VnXzE2X2xlbjsKKwlfX3UxNglkc2VnX2xlbjsKK307CisKKworLyoKKyAqIFBvd2VyIHN0YXRlcworICovCisjZGVmaW5lIEFQTV9TVEFURV9SRUFEWQkJMHgwMDAwCisjZGVmaW5lIEFQTV9TVEFURV9TVEFOREJZCTB4MDAwMQorI2RlZmluZSBBUE1fU1RBVEVfU1VTUEVORAkweDAwMDIKKyNkZWZpbmUgQVBNX1NUQVRFX09GRgkJMHgwMDAzCisjZGVmaW5lIEFQTV9TVEFURV9CVVNZCQkweDAwMDQKKyNkZWZpbmUgQVBNX1NUQVRFX1JFSkVDVAkweDAwMDUKKyNkZWZpbmUgQVBNX1NUQVRFX09FTV9TWVMJMHgwMDIwCisjZGVmaW5lIEFQTV9TVEFURV9PRU1fREVWCTB4MDA0MAorCisjZGVmaW5lIEFQTV9TVEFURV9ESVNBQkxFCTB4MDAwMAorI2RlZmluZSBBUE1fU1RBVEVfRU5BQkxFCTB4MDAwMQorCisjZGVmaW5lIEFQTV9TVEFURV9ESVNFTkdBR0UJMHgwMDAwCisjZGVmaW5lIEFQTV9TVEFURV9FTkdBR0UJMHgwMDAxCisKKy8qCisgKiBFdmVudHMgKHJlc3VsdHMgb2YgR2V0IFBNIEV2ZW50KQorICovCisjZGVmaW5lIEFQTV9TWVNfU1RBTkRCWQkJMHgwMDAxCisjZGVmaW5lIEFQTV9TWVNfU1VTUEVORAkJMHgwMDAyCisjZGVmaW5lIEFQTV9OT1JNQUxfUkVTVU1FCTB4MDAwMworI2RlZmluZSBBUE1fQ1JJVElDQUxfUkVTVU1FCTB4MDAwNAorI2RlZmluZSBBUE1fTE9XX0JBVFRFUlkJCTB4MDAwNQorI2RlZmluZSBBUE1fUE9XRVJfU1RBVFVTX0NIQU5HRQkweDAwMDYKKyNkZWZpbmUgQVBNX1VQREFURV9USU1FCQkweDAwMDcKKyNkZWZpbmUgQVBNX0NSSVRJQ0FMX1NVU1BFTkQJMHgwMDA4CisjZGVmaW5lIEFQTV9VU0VSX1NUQU5EQlkJMHgwMDA5CisjZGVmaW5lIEFQTV9VU0VSX1NVU1BFTkQJMHgwMDBhCisjZGVmaW5lIEFQTV9TVEFOREJZX1JFU1VNRQkweDAwMGIKKyNkZWZpbmUgQVBNX0NBUEFCSUxJVFlfQ0hBTkdFCTB4MDAwYworCisvKgorICogRXJyb3IgY29kZXMKKyAqLworI2RlZmluZSBBUE1fU1VDQ0VTUwkJMHgwMAorI2RlZmluZSBBUE1fRElTQUJMRUQJCTB4MDEKKyNkZWZpbmUgQVBNX0NPTk5FQ1RFRAkJMHgwMgorI2RlZmluZSBBUE1fTk9UX0NPTk5FQ1RFRAkweDAzCisjZGVmaW5lIEFQTV8xNl9DT05ORUNURUQJMHgwNQorI2RlZmluZSBBUE1fMTZfVU5TVVBQT1JURUQJMHgwNgorI2RlZmluZSBBUE1fMzJfQ09OTkVDVEVECTB4MDcKKyNkZWZpbmUgQVBNXzMyX1VOU1VQUE9SVEVECTB4MDgKKyNkZWZpbmUgQVBNX0JBRF9ERVZJQ0UJCTB4MDkKKyNkZWZpbmUgQVBNX0JBRF9QQVJBTQkJMHgwYQorI2RlZmluZSBBUE1fTk9UX0VOR0FHRUQJCTB4MGIKKyNkZWZpbmUgQVBNX0JBRF9GVU5DVElPTgkweDBjCisjZGVmaW5lIEFQTV9SRVNVTUVfRElTQUJMRUQJMHgwZAorI2RlZmluZSBBUE1fTk9fRVJST1IJCTB4NTMKKyNkZWZpbmUgQVBNX0JBRF9TVEFURQkJMHg2MAorI2RlZmluZSBBUE1fTk9fRVZFTlRTCQkweDgwCisjZGVmaW5lIEFQTV9OT1RfUFJFU0VOVAkJMHg4NgorCisvKgorICogQVBNIERldmljZSBJRHMKKyAqLworI2RlZmluZSBBUE1fREVWSUNFX0JJT1MJCTB4MDAwMAorI2RlZmluZSBBUE1fREVWSUNFX0FMTAkJMHgwMDAxCisjZGVmaW5lIEFQTV9ERVZJQ0VfRElTUExBWQkweDAxMDAKKyNkZWZpbmUgQVBNX0RFVklDRV9TVE9SQUdFCTB4MDIwMAorI2RlZmluZSBBUE1fREVWSUNFX1BBUkFMTEVMCTB4MDMwMAorI2RlZmluZSBBUE1fREVWSUNFX1NFUklBTAkweDA0MDAKKyNkZWZpbmUgQVBNX0RFVklDRV9ORVRXT1JLCTB4MDUwMAorI2RlZmluZSBBUE1fREVWSUNFX1BDTUNJQQkweDA2MDAKKyNkZWZpbmUgQVBNX0RFVklDRV9CQVRURVJZCTB4ODAwMAorI2RlZmluZSBBUE1fREVWSUNFX09FTQkJMHhlMDAwCisjZGVmaW5lIEFQTV9ERVZJQ0VfT0xEX0FMTAkweGZmZmYKKyNkZWZpbmUgQVBNX0RFVklDRV9DTEFTUwkweDAwZmYKKyNkZWZpbmUgQVBNX0RFVklDRV9NQVNLCQkweGZmMDAKKworCisvKgorICogQmF0dGVyeSBzdGF0dXMKKyAqLworI2RlZmluZSBBUE1fTUFYX0JBVFRFUklFUwkyCisKKy8qCisgKiBBUE0gZGVmaW5lZCBjYXBhYmlsaXR5IGJpdCBmbGFncworICovCisjZGVmaW5lIEFQTV9DQVBfR0xPQkFMX1NUQU5EQlkJCTB4MDAwMQorI2RlZmluZSBBUE1fQ0FQX0dMT0JBTF9TVVNQRU5ECQkweDAwMDIKKyNkZWZpbmUgQVBNX0NBUF9SRVNVTUVfU1RBTkRCWV9USU1FUgkweDAwMDQgLyogVGltZXIgcmVzdW1lIGZyb20gc3RhbmRieSAqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVVNQRU5EX1RJTUVSCTB4MDAwOCAvKiBUaW1lciByZXN1bWUgZnJvbSBzdXNwZW5kICovCisjZGVmaW5lIEFQTV9DQVBfUkVTVU1FX1NUQU5EQllfUklORwkweDAwMTAgLyogUmVzdW1lIG9uIFJpbmcgZnIgc3RhbmRieSAqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVVNQRU5EX1JJTkcJMHgwMDIwIC8qIFJlc3VtZSBvbiBSaW5nIGZyIHN1c3BlbmQgKi8KKyNkZWZpbmUgQVBNX0NBUF9SRVNVTUVfU1RBTkRCWV9QQ01DSUEJMHgwMDQwIC8qIFJlc3VtZSBvbiBQQ01DSUEgUmluZwkqLworI2RlZmluZSBBUE1fQ0FQX1JFU1VNRV9TVVNQRU5EX1BDTUNJQQkweDAwODAgLyogUmVzdW1lIG9uIFBDTUNJQSBSaW5nCSovCisKKy8qCisgKiBpb2N0bCBvcGVyYXRpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEFQTV9JT0NfU1RBTkRCWQkJX0lPKCdBJywgMSkKKyNkZWZpbmUgQVBNX0lPQ19TVVNQRU5ECQlfSU8oJ0EnLCAyKQorCisjZW5kaWYJLyogTElOVVhfQVBNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXJjZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXJjZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFlNzY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hcmNmYi5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX0xJTlVYX0FSQ0ZCX0hfXworI2RlZmluZSBfX0xJTlVYX0FSQ0ZCX0hfXworCisjZGVmaW5lIEZCSU9fV0FJVEVWRU5UCQlfSU8oJ0YnLCAweDg4KQorI2RlZmluZSBGQklPX0dFVENPTlRST0wyCV9JT1IoJ0YnLCAweDg5LCBzaXplX3QpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0YWxrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxOGQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRhbGsuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIF9fTElOVVhfQVRBTEtfSF9fCisjZGVmaW5lIF9fTElOVVhfQVRBTEtfSF9fCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBBcHBsZVRhbGsgbmV0d29ya2luZyBzdHJ1Y3R1cmVzCisgKgorICogVGhlIGZvbGxvd2luZyBhcmUgZGlyZWN0bHkgcmVmZXJlbmNlZCBmcm9tIHRoZSBVbml2ZXJzaXR5IE9mIE1pY2hpZ2FuCisgKiBuZXRhdGFsayBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorICovCisjZGVmaW5lIEFUUE9SVF9GSVJTVAkxCisjZGVmaW5lIEFUUE9SVF9SRVNFUlZFRAkxMjgKKyNkZWZpbmUgQVRQT1JUX0xBU1QJMjU0CQkvKiAyNTQgaXMgb25seSBsZWdhbCBvbiBsb2NhbHRhbGsgKi8gCisjZGVmaW5lIEFUQUREUl9BTllORVQJKF9fdTE2KTAKKyNkZWZpbmUgQVRBRERSX0FOWU5PREUJKF9fdTgpMAorI2RlZmluZSBBVEFERFJfQU5ZUE9SVCAgKF9fdTgpMAorI2RlZmluZSBBVEFERFJfQkNBU1QJKF9fdTgpMjU1CisjZGVmaW5lIEREUF9NQVhTWgk1ODcKKyNkZWZpbmUgRERQX01BWEhPUFMgICAgIDE1CQkvKiA0IGJpdHMgb2YgaG9wIGNvdW50ZXIgKi8KKworI2RlZmluZSBTSU9DQVRBTEtESUZBRERSICAgICAgIChTSU9DUFJPVE9QUklWQVRFICsgMCkKKworc3RydWN0IGF0YWxrX2FkZHIgeworCV9fYmUxNglzX25ldDsKKwlfX3U4CXNfbm9kZTsKK307CisKK3N0cnVjdCBzb2NrYWRkcl9hdCB7CisJc2FfZmFtaWx5X3QJICBzYXRfZmFtaWx5OworCV9fdTgJCSAgc2F0X3BvcnQ7CisJc3RydWN0IGF0YWxrX2FkZHIgc2F0X2FkZHI7CisJY2hhcgkJICBzYXRfemVyb1s4XTsKK307CisKK3N0cnVjdCBhdGFsa19uZXRyYW5nZSB7CisJX191OAlucl9waGFzZTsKKwlfX2JlMTYJbnJfZmlyc3RuZXQ7CisJX19iZTE2CW5yX2xhc3RuZXQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9BVEFMS19IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2U2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bS5oCkBAIC0wLDAgKzEsMjM4IEBACisvKiBhdG0uaCAtIGdlbmVyYWwgQVRNIGRlY2xhcmF0aW9ucyAqLworIAorLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworLyoKKyAqIFdBUk5JTkc6IFVzZXItc3BhY2UgcHJvZ3JhbXMgc2hvdWxkIG5vdCAjaW5jbHVkZSA8bGludXgvYXRtLmg+IGRpcmVjdGx5LgorICogICAgICAgICAgSW5zdGVhZCwgI2luY2x1ZGUgPGF0bS5oPgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FUTV9ICisjZGVmaW5lIF9MSU5VWF9BVE1fSAorCisvKgorICogQkVHSU5feHggYW5kIEVORF94eCBtYXJrZXJzIGFyZSB1c2VkIGZvciBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZgorICogZG9jdW1lbnRhdGlvbi4gRG8gbm90IGNoYW5nZSB0aGVtLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1zYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworCisvKiBnZW5lcmFsIEFUTSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQVRNX0NFTExfU0laRQkJICAgIDUzCS8qIEFUTSBjZWxsIHNpemUgaW5jbC4gaGVhZGVyICovCisjZGVmaW5lIEFUTV9DRUxMX1BBWUxPQUQJICAgIDQ4CS8qIEFUTSBwYXlsb2FkIHNpemUgKi8KKyNkZWZpbmUgQVRNX0FBTDBfU0RVCQkgICAgNTIJLyogQUFMMCBTRFUgc2l6ZSAqLworI2RlZmluZSBBVE1fTUFYX0FBTDM0X1BEVQkgNjU1MzUJLyogbWF4aW11bSBBQUwzLzQgUERVIHBheWxvYWQgKi8KKyNkZWZpbmUgQVRNX0FBTDVfVFJBSUxFUgkgICAgIDgJLyogQUFMNSB0cmFpbGVyIHNpemUgKi8KKyNkZWZpbmUgQVRNX01BWF9BQUw1X1BEVQkgNjU1MzUJLyogbWF4aW11bSBBQUw1IFBEVSBwYXlsb2FkICovCisjZGVmaW5lIEFUTV9NQVhfQ0RWCQkgIDk5OTkJLyogbWF4aW11bSAoZGVmYXVsdCkgQ0RWICovCisjZGVmaW5lIEFUTV9OT1RfUlNWX1ZDSQkJICAgIDMyCS8qIGZpcnN0IG5vbi1yZXNlcnZlZCBWQ0kgdmFsdWUgKi8KKworI2RlZmluZSBBVE1fTUFYX1ZQSQkJICAgMjU1CS8qIG1heGltdW0gVlBJIGF0IHRoZSBVTkkgKi8KKyNkZWZpbmUgQVRNX01BWF9WUElfTk5JCQkgIDQwOTYJLyogbWF4aW11bSBWUEkgYXQgdGhlIE5OSSAqLworI2RlZmluZSBBVE1fTUFYX1ZDSQkJIDY1NTM1CS8qIG1heGltdW0gVkNJICovCisKKworLyogInByb3Rjb2wiIHZhbHVlcyBmb3IgdGhlIHNvY2tldCBzeXN0ZW0gY2FsbCAqLworI2RlZmluZSBBVE1fTk9fQUFMCTAJCS8qIEFBTCBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9BQUwwCTEzCQkvKiAicmF3IiBBVE0gY2VsbHMgKi8KKyNkZWZpbmUgQVRNX0FBTDEJMQkJLyogQUFMMSAoQ0JSKSAqLworI2RlZmluZSBBVE1fQUFMMgkyCQkvKiBBQUwyIChWQlIpICovCisjZGVmaW5lIEFUTV9BQUwzNAkzCQkvKiBBQUwzLzQgKGRhdGEpICovCisjZGVmaW5lIEFUTV9BQUw1CTUJCS8qIEFBTDUgKGRhdGEpICovCisKKy8qCisgKiBzb2NrZXQgb3B0aW9uIG5hbWUgY29kaW5nIGZ1bmN0aW9ucworICoKKyAqIE5vdGUgdGhhdCBfX1NPX0VOQ09ERSBhbmQgX19TT19MRVZFTCBhcmUgc29tZXdoYXQgYSBoYWNrIHNpbmNlIHRoZQorICogPDwgMjIgb25seSByZXNlcnZlcyA5IGJpdHMgZm9yIHRoZSBsZXZlbC4gIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcworICogU09MX1NPQ0tFVCBpcyAweEZGRkYsIHNvIHRoYXQncyBhIGJpdCBvZiBhIHByb2JsZW0KKyAqLworCisjZGVmaW5lIF9fU09fRU5DT0RFKGwsbix0KQkoKCgobCkgJiAweDFGRikgPDwgMjIpIHwgKChuKSA8PCAxNikgfCBcCisJCQkJc2l6ZW9mKHQpKQorI2RlZmluZSBfX1NPX0xFVkVMX01BVENIKGMsbSkJKCgoYykgPj4gMjIpID09ICgobSkgJiAweDFGRikpCisjZGVmaW5lIF9fU09fTlVNQkVSKGMpCQkoKChjKSA+PiAxNikgJiAweDNmKQorI2RlZmluZSBfX1NPX1NJWkUoYykJCSgoYykgJiAweDNmZmYpCisKKy8qCisgKiBBVE0gbGF5ZXIKKyAqLworCisjZGVmaW5lIFNPX1NFVENMUAlfX1NPX0VOQ09ERShTT0xfQVRNLDAsaW50KQorCQkJICAgIC8qIHNldCBDTFAgYml0IHZhbHVlIC0gVE9ETyAqLworI2RlZmluZSBTT19DSVJBTkdFCV9fU09fRU5DT0RFKFNPTF9BVE0sMSxzdHJ1Y3QgYXRtX2NpcmFuZ2UpCisJCQkgICAgLyogY29ubmVjdGlvbiBpZGVudGlmaWVyIHJhbmdlOyBzb2NrZXQgbXVzdCBiZQorCQkJICAgICAgIGJvdW5kIG9yIGNvbm5lY3RlZCAqLworI2RlZmluZSBTT19BVE1RT1MJX19TT19FTkNPREUoU09MX0FUTSwyLHN0cnVjdCBhdG1fcW9zKQorCQkJICAgIC8qIFF1YWxpdHkgb2YgU2VydmljZSBzZXR0aW5nICovCisjZGVmaW5lIFNPX0FUTVNBUAlfX1NPX0VOQ09ERShTT0xfQVRNLDMsc3RydWN0IGF0bV9zYXApCisJCQkgICAgLyogU2VydmljZSBBY2Nlc3MgUG9pbnQgKi8KKyNkZWZpbmUgU09fQVRNUFZDCV9fU09fRU5DT0RFKFNPTF9BVE0sNCxzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjKQorCQkJICAgIC8qICJQVkMiIGFkZHJlc3MgKGFsc28gZm9yIFNWQ3MpOyBnZXQgb25seSAqLworI2RlZmluZSBTT19NVUxUSVBPSU5UCV9fU09fRU5DT0RFKFNPTF9BVE0sIDUsIGludCkKKwkJCSAgICAvKiBtYWtlIHRoaXMgdmMgYSBwMm1wICovCisKKworLyoKKyAqIE5vdGUgQEBAOiBzaW5jZSB0aGUgc29ja2V0IGxheWVycyBkb24ndCByZWFsbHkgZGlzdGluZ3Vpc2ggdGhlIGNvbnRyb2wgYW5kCisgKiB0aGUgZGF0YSBwbGFuZSBidXQgZ2VuZXJhbGx5IHNlZW1zIHRvIGJlIGRhdGEgcGxhbmUtY2VudHJpYywgYW55IGxheWVyIGlzCisgKiBhYm91dCBlcXVhbGx5IHdyb25nIGZvciB0aGUgU0FQLiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGFib3V0IHRoaXMsCisgKiBwbGVhc2Ugc3BlYWsgdXAgLi4uCisgKi8KKworCisvKiBBVE0gY2VsbCBoZWFkZXIgKGZvciBBQUwwKSAqLworCisvKiBCRUdJTl9DSCAqLworI2RlZmluZSBBVE1fSERSX0dGQ19NQVNLCTB4ZjAwMDAwMDAKKyNkZWZpbmUgQVRNX0hEUl9HRkNfU0hJRlQJMjgKKyNkZWZpbmUgQVRNX0hEUl9WUElfTUFTSwkweDBmZjAwMDAwCisjZGVmaW5lIEFUTV9IRFJfVlBJX1NISUZUCTIwCisjZGVmaW5lIEFUTV9IRFJfVkNJX01BU0sJMHgwMDBmZmZmMAorI2RlZmluZSBBVE1fSERSX1ZDSV9TSElGVAk0CisjZGVmaW5lIEFUTV9IRFJfUFRJX01BU0sJMHgwMDAwMDAwZQorI2RlZmluZSBBVE1fSERSX1BUSV9TSElGVAkxCisjZGVmaW5lIEFUTV9IRFJfQ0xQCQkweDAwMDAwMDAxCisvKiBFTkRfQ0ggKi8KKworCisvKiBQVEkgY29kaW5ncyAqLworCisvKiBCRUdJTl9QVEkgKi8KKyNkZWZpbmUgQVRNX1BUSV9VUzAJMCAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmdlc3Rpb24gbm90IGV4cCwgU0RVLXR5cGUgMCAqLworI2RlZmluZSBBVE1fUFRJX1VTMQkxICAvKiB1c2VyIGRhdGEgY2VsbCwgY29uZ2VzdGlvbiBub3QgZXhwLCBTRFUtdHlwZSAxICovCisjZGVmaW5lIEFUTV9QVElfVUNFUzAJMiAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmcuIGV4cGVyaWVuY2VkLCBTRFUtdHlwZSAwICovCisjZGVmaW5lIEFUTV9QVElfVUNFUzEJMyAgLyogdXNlciBkYXRhIGNlbGwsIGNvbmcuIGV4cGVyaWVuY2VkLCBTRFUtdHlwZSAxICovCisjZGVmaW5lIEFUTV9QVElfU0VHRjUJNCAgLyogc2VnbWVudCBPQU0gRjUgZmxvdyByZWxhdGVkIGNlbGwgKi8KKyNkZWZpbmUgQVRNX1BUSV9FMkVGNQk1ICAvKiBlbmQtdG8tZW5kIE9BTSBGNSBmbG93IHJlbGF0ZWQgY2VsbCAqLworI2RlZmluZSBBVE1fUFRJX1JTVl9STQk2ICAvKiByZXNlcnZlZCBmb3IgdHJhZmZpYyBjb250cm9sL3Jlc291cmNlIG1nbXQgKi8KKyNkZWZpbmUgQVRNX1BUSV9SU1YJNyAgLyogcmVzZXJ2ZWQgKi8KKy8qIEVORF9QVEkgKi8KKworCisvKgorICogVGhlIGZvbGxvd2luZyBpdGVtcyBzaG91bGQgc3RheSBpbiBsaW51eC9hdG0uaCwgd2hpY2ggc2hvdWxkIGJlIGxpbmtlZCB0bworICogbmV0YXRtL2F0bS5oCisgKi8KKworLyogVHJhZmZpYyBkZXNjcmlwdGlvbiAqLworCisjZGVmaW5lIEFUTV9OT05FCTAJCS8qIG5vIHRyYWZmaWMgKi8KKyNkZWZpbmUgQVRNX1VCUgkJMQorI2RlZmluZSBBVE1fQ0JSCQkyCisjZGVmaW5lIEFUTV9WQlIJCTMKKyNkZWZpbmUgQVRNX0FCUgkJNAorI2RlZmluZSBBVE1fQU5ZQ0xBU1MJNQkJLyogY29tcGF0aWJsZSB3aXRoIGV2ZXJ5dGhpbmcgKi8KKworI2RlZmluZSBBVE1fTUFYX1BDUgktMQkJLyogbWF4aW11bSBhdmFpbGFibGUgUENSICovCisKK3N0cnVjdCBhdG1fdHJhZnBybSB7CisJdW5zaWduZWQgY2hhcgl0cmFmZmljX2NsYXNzOwkvKiB0cmFmZmljIGNsYXNzIChBVE1fVUJSLCAuLi4pICovCisJaW50CQltYXhfcGNyOwkvKiBtYXhpbXVtIFBDUiBpbiBjZWxscyBwZXIgc2Vjb25kICovCisJaW50CQlwY3I7CQkvKiBkZXNpcmVkIFBDUiBpbiBjZWxscyBwZXIgc2Vjb25kICovCisJaW50CQltaW5fcGNyOwkvKiBtaW5pbXVtIFBDUiBpbiBjZWxscyBwZXIgc2Vjb25kICovCisJaW50CQltYXhfY2R2OwkvKiBtYXhpbXVtIENEViBpbiBtaWNyb3NlY29uZHMgKi8KKwlpbnQJCW1heF9zZHU7CS8qIG1heGltdW0gU0RVIGluIGJ5dGVzICovCisgICAgICAgIC8qIGV4dHJhIHBhcmFtcyBmb3IgQUJSICovCisgICAgICAgIHVuc2lnbmVkIGludCAJaWNyOyAgICAgICAgIAkvKiBJbml0aWFsIENlbGwgUmF0ZSAoMjQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQJdGJlOwkJLyogVHJhbnNpZW50IEJ1ZmZlciBFeHBvc3VyZSAoMjQtYml0KSAqLyAKKyAgICAgICAgdW5zaWduZWQgaW50IAlmcnR0IDogMjQ7CS8qIEZpeGVkIFJvdW5kIFRyaXAgVGltZSAoMjQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgCXJpZiAgOiA0OyAgICAgICAvKiBSYXRlIEluY3JlbWVudCBGYWN0b3IgKDQtYml0KSAqLworICAgICAgICB1bnNpZ25lZCBpbnQgCXJkZiAgOiA0OyAgICAgICAvKiBSYXRlIERlY3JlYXNlIEZhY3RvciAoNC1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCBucm1fcHJlcyAgOjE7ICAgICAgLyogbnJtIHByZXNlbnQgYml0ICovCisgICAgICAgIHVuc2lnbmVkIGludCB0cm1fcHJlcyAgOjE7ICAgICAJLyogcm0gcHJlc2VudCBiaXQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGFkdGZfcHJlcyA6MTsgICAgIAkvKiBhZHRmIHByZXNlbnQgYml0ICovCisgICAgICAgIHVuc2lnbmVkIGludCBjZGZfcHJlcyAgOjE7ICAgIAkvKiBjZGYgcHJlc2VudCBiaXQqLworICAgICAgICB1bnNpZ25lZCBpbnQgbnJtICAgICAgIDozOyAgICAgCS8qIE1heCAjIG9mIENlbGxzIGZvciBlYWNoIGZvcndhcmQgUk0gY2VsbCAoMy1iaXQpICovCisgICAgICAgIHVuc2lnbmVkIGludCB0cm0gICAgICAgOjM7ICAgIAkvKiBUaW1lIGJldHdlZW4gZm9yd2FyZCBSTSBjZWxscyAoMy1iaXQpICovICAgIAorCXVuc2lnbmVkIGludCBhZHRmICAgICAgOjEwOyAgICAgLyogQUNSIERlY3JlYXNlIFRpbWUgRmFjdG9yICgxMC1iaXQpICovCisJdW5zaWduZWQgaW50IGNkZiAgICAgICA6MzsgICAgICAvKiBDdXRvZmYgRGVjcmVhc2UgRmFjdG9yICgzLWJpdCkgKi8KKyAgICAgICAgdW5zaWduZWQgaW50IHNwYXJlICAgICA6OTsgICAgICAvKiBzcGFyZSBiaXRzICovIAorfTsKKworc3RydWN0IGF0bV9xb3MgeworCXN0cnVjdCBhdG1fdHJhZnBybSB0eHRwOwkvKiBwYXJhbWV0ZXJzIGluIFRYIGRpcmVjdGlvbiAqLworCXN0cnVjdCBhdG1fdHJhZnBybSByeHRwIF9fQVRNX0FQSV9BTElHTjsKKwkJCQkJLyogcGFyYW1ldGVycyBpbiBSWCBkaXJlY3Rpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGFhbCBfX0FUTV9BUElfQUxJR047Cit9OworCisvKiBQVkMgYWRkcmVzc2luZyAqLworCisjZGVmaW5lIEFUTV9JVEZfQU5ZCS0xCQkvKiAibWFnaWMiIFBWQyBhZGRyZXNzIHZhbHVlcyAqLworI2RlZmluZSBBVE1fVlBJX0FOWQktMQorI2RlZmluZSBBVE1fVkNJX0FOWQktMQorI2RlZmluZSBBVE1fVlBJX1VOU1BFQwktMgorI2RlZmluZSBBVE1fVkNJX1VOU1BFQwktMgorCisKK3N0cnVjdCBzb2NrYWRkcl9hdG1wdmMgeworCXVuc2lnbmVkIHNob3J0IAlzYXBfZmFtaWx5OwkvKiBhZGRyZXNzIGZhbWlseSwgQUZfQVRNUFZDICAqLworCXN0cnVjdCB7CQkJLyogUFZDIGFkZHJlc3MgKi8KKwkJc2hvcnQJaXRmOwkJLyogQVRNIGludGVyZmFjZSAqLworCQlzaG9ydAl2cGk7CQkvKiBWUEkgKG9ubHkgOCBiaXRzIGF0IFVOSSkgKi8KKwkJaW50CXZjaTsJCS8qIFZDSSAob25seSAxNiBiaXRzIGF0IFVOSSkgKi8KKwl9IHNhcF9hZGRyIF9fQVRNX0FQSV9BTElHTjsJLyogUFZDIGFkZHJlc3MgKi8KK307CisKKy8qIFNWQyBhZGRyZXNzaW5nICovCisKKyNkZWZpbmUJQVRNX0VTQV9MRU4JMjAJCS8qIEFUTSBFbmQgU3lzdGVtIEFkZHJlc3MgbGVuZ3RoICovCisjZGVmaW5lIEFUTV9FMTY0X0xFTgkxMgkJLyogbWF4aW11bSBFLjE2NCBudW1iZXIgbGVuZ3RoICovCisKKyNkZWZpbmUgQVRNX0FGSV9EQ0MJMHgzOQkJLyogRENDIEFUTSBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9JQ0QJMHg0NwkJLyogSUNEIEFUTSBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9FMTY0CTB4NDUJCS8qIEUuMTY0IEFUTSBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9MT0NBTAkweDQ5CQkvKiBMb2NhbCBBVE0gRm9ybWF0ICovIAorCisjZGVmaW5lIEFUTV9BRklfRENDX0dST1VQCTB4QkQJLyogRENDIEFUTSBHcm91cCBGb3JtYXQgKi8KKyNkZWZpbmUgQVRNX0FGSV9JQ0RfR1JPVVAJMHhDNQkvKiBJQ0QgQVRNIEdyb3VwIEZvcm1hdCAqLworI2RlZmluZSBBVE1fQUZJX0UxNjRfR1JPVVAJMHhDMwkvKiBFLjE2NCBBVE0gR3JvdXAgRm9ybWF0ICovCisjZGVmaW5lIEFUTV9BRklfTE9DQUxfR1JPVVAJMHhDNwkvKiBMb2NhbCBBVE0gR3JvdXAgRm9ybWF0ICovCisKKyNkZWZpbmUgQVRNX0xJSl9OT05FCTAJCS8qIG5vIGxlYWYtaW5pdGlhdGVkIGpvaW4gKi8KKyNkZWZpbmUgQVRNX0xJSgkJMQkJLyogcmVxdWVzdCBqb2luaW5nICovCisjZGVmaW5lIEFUTV9MSUpfUlBKCTIJCS8qIHNldCB0byByb290LXByb21wdGVkIGpvaW4gKi8KKyNkZWZpbmUgQVRNX0xJSl9OSgkzCQkvKiBzZXQgdG8gbmV0d29yayBqb2luICovCisKKworc3RydWN0IHNvY2thZGRyX2F0bXN2YyB7CisgICAgdW5zaWduZWQgc2hvcnQgCXNhc19mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5LCBBRl9BVE1TVkMgKi8KKyAgICBzdHJ1Y3QgewkJCQkvKiBTVkMgYWRkcmVzcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyCXBydltBVE1fRVNBX0xFTl07LyogcHJpdmF0ZSBBVE0gYWRkcmVzcyAqLworICAgICAgICBjaGFyCQlwdWJbQVRNX0UxNjRfTEVOKzFdOyAvKiBwdWJsaWMgYWRkcmVzcyAoRS4xNjQpICovCisgICAgCQkJCQkvKiB1bnVzZWQgYWRkcmVzc2VzIG11c3QgYmUgYnplcm8nZWQgKi8KKwljaGFyCQlsaWpfdHlwZTsJLyogcm9sZSBpbiBMSUogY2FsbDsgb25lIG9mIEFUTV9MSUoqICovCisJdWludDMyX3QJbGlqX2lkOwkJLyogTElKIGNhbGwgaWRlbnRpZmllciAqLworICAgIH0gc2FzX2FkZHIgX19BVE1fQVBJX0FMSUdOOwkJLyogU1ZDIGFkZHJlc3MgKi8KK307CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGF0bXN2Y19hZGRyX2luX3VzZShzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIGFkZHIpCit7CisJcmV0dXJuICphZGRyLnNhc19hZGRyLnBydiB8fCAqYWRkci5zYXNfYWRkci5wdWI7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGF0bXB2Y19hZGRyX2luX3VzZShzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIGFkZHIpCit7CisJcmV0dXJuIGFkZHIuc2FwX2FkZHIuaXRmIHx8IGFkZHIuc2FwX2FkZHIudnBpIHx8IGFkZHIuc2FwX2FkZHIudmNpOworfQorCisKKy8qCisgKiBTb21lIHN0dWZmIGZvciBsaW51eC9zb2NraW9zLmgKKyAqLworCitzdHJ1Y3QgYXRtaWZfc2lvYyB7CisgICAgaW50IG51bWJlcjsKKyAgICBpbnQgbGVuZ3RoOworICAgIHZvaWQgKmFyZzsKK307CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgYXRtX2JhY2tlbmRfdDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fZW5pLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9lbmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGYzMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fZW5pLmgKQEAgLTAsMCArMSwyMyBAQAorLyogYXRtX2VuaS5oIC0gRHJpdmVyLXNwZWNpZmljIGRlY2xhcmF0aW9ucyBvZiB0aGUgRU5JIGRyaXZlciAoZm9yIHVzZSBieQorCSAgICAgICBkcml2ZXItc3BlY2lmaWMgdXRpbGl0aWVzKSAqLworCisvKiBXcml0dGVuIDE5OTUtMjAwMCBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIEVQRkwgTFJDL0lDQSAqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX0VOSV9ICisjZGVmaW5lIExJTlVYX0FUTV9FTklfSAorCisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworc3RydWN0IGVuaV9tdWx0aXBsaWVycyB7CisJaW50IHR4LHJ4OwkvKiB2YWx1ZXMgYXJlIGluIHBlcmNlbnQgYW5kIG11c3QgYmUgPiAxMDAgKi8KK307CisKKworI2RlZmluZSBFTklfTUVNRFVNUCAgICAgX0lPVygnYScsQVRNSU9DX1NBUlBSVixzdHJ1Y3QgYXRtaWZfc2lvYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByaW50ayBtZW1vcnkgbWFwICovCisjZGVmaW5lIEVOSV9TRVRNVUxUCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrNyxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIHNldCBidWZmZXIgbXVsdGlwbGllcnMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9oZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc3MTNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faGUuaApAQCAtMCwwICsxLDIwIEBACisvKiBhdG1faGUuaCAqLworCisjaWZuZGVmIExJTlVYX0FUTV9IRV9ICisjZGVmaW5lIExJTlVYX0FUTV9IRV9ICisKKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworI2RlZmluZSBIRV9HRVRfUkVHCV9JT1coJ2EnLCBBVE1JT0NfU0FSUFJWLCBzdHJ1Y3QgYXRtaWZfc2lvYykKKworI2RlZmluZSBIRV9SRUdUWVBFX1BDSQkxCisjZGVmaW5lIEhFX1JFR1RZUEVfUkNNCTIKKyNkZWZpbmUgSEVfUkVHVFlQRV9UQ00JMworI2RlZmluZSBIRV9SRUdUWVBFX01CT1gJNAorCitzdHJ1Y3QgaGVfaW9jdGxfcmVnIHsKKwl1bnNpZ25lZCBhZGRyLCB2YWw7CisJY2hhciB0eXBlOworfTsKKworI2VuZGlmIC8qIExJTlVYX0FUTV9IRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9pZHQ3NzEwNS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faWR0NzcxMDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTYyMWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1faWR0NzcxMDUuaApAQCAtMCwwICsxLDI4IEBACisvKiBhdG1faWR0NzcxMDUuaCAtIERyaXZlci1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgb2YgdGhlIElEVDc3MTA1IGRyaXZlciAoZm9yCisgKiB1c2UgYnkgZHJpdmVyLXNwZWNpZmljIHV0aWxpdGllcykgKi8KKworLyogV3JpdHRlbiAxOTk5IGJ5IEdyZWcgQmFua3MgPGduYkBsaW51eGZhbi5jb20+LiBDb3BpZWQgZnJvbSBhdG1fc3VuaS5oLiAqLworCisKKyNpZm5kZWYgTElOVVhfQVRNX0lEVDc3MTA1X0gKKyNkZWZpbmUgTElOVVhfQVRNX0lEVDc3MTA1X0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWRldi5oPgorCisvKgorICogU3RydWN0dXJlIGZvciBJRFQ3NzEwNV9HRVRTVEFUIGFuZCBJRFQ3NzEwNV9HRVRTVEFUWiBpb2N0bHMuCisgKiBQb2ludGVkIHRvIGJ5IGBhcmcnIGluIGF0bWlmX3Npb2MuCisgKi8KK3N0cnVjdCBpZHQ3NzEwNV9zdGF0cyB7CisgICAgICAgIF9fdTMyIHN5bWJvbF9lcnJvcnM7ICAvKiB3aXJlIHN5bWJvbCBlcnJvcnMgKi8KKyAgICAgICAgX191MzIgdHhfY2VsbHM7ICAgICAgIC8qIGNlbGxzIHRyYW5zbWl0dGVkICovCisgICAgICAgIF9fdTMyIHJ4X2NlbGxzOyAgICAgICAvKiBjZWxscyByZWNlaXZlZCAqLworICAgICAgICBfX3UzMiByeF9oZWNfZXJyb3JzOyAgLyogSGVhZGVyIEVycm9yIENoZWNrIGVycm9ycyBvbiByZWNlaXZlICovCit9OworCisjZGVmaW5lIElEVDc3MTA1X0dFVFNUQVQJX0lPVygnYScsQVRNSU9DX1BIWVBSVisyLHN0cnVjdCBhdG1pZl9zaW9jKQkvKiBnZXQgc3RhdHMgKi8KKyNkZWZpbmUgSURUNzcxMDVfR0VUU1RBVFoJX0lPVygnYScsQVRNSU9DX1BIWVBSViszLHN0cnVjdCBhdG1pZl9zaW9jKQkvKiBnZXQgc3RhdHMgYW5kIHplcm8gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9uaWNzdGFyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV9uaWNzdGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3Yjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX25pY3N0YXIuaApAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYXRtX25pY3N0YXIuaAorICoKKyAqIERyaXZlci1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgZm9yIHVzZSBieSBOSUNTVEFSIGRyaXZlciBzcGVjaWZpYyB1dGlscy4KKyAqCisgKiBBdXRob3I6IFJ1aSBQcmlvcgorICoKKyAqIChDKSBJTkVTQyAxOTk4CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIExJTlVYX0FUTV9OSUNTVEFSX0gKKyNkZWZpbmUgTElOVVhfQVRNX05JQ1NUQVJfSAorCisvKiBOb3RlOiBub24ta2VybmVsIHByb2dyYW1zIGluY2x1ZGluZyB0aGlzIGZpbGUgbXVzdCBhbHNvIGluY2x1ZGUKKyAqIHN5cy90eXBlcy5oIGZvciBzdHJ1Y3QgdGltZXZhbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworI2RlZmluZSBOU19HRVRQU1RBVAlfSU9XUignYScsQVRNSU9DX1NBUlBSVisxLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkJLyogZ2V0IHBvb2wgc3RhdGlzdGljcyAqLworI2RlZmluZSBOU19TRVRCVUZMRVYJX0lPVygnYScsQVRNSU9DX1NBUlBSVisyLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkJLyogc2V0IGJ1ZmZlciBsZXZlbCBtYXJrZXJzICovCisjZGVmaW5lIE5TX0FESkJVRkxFVglfSU8oJ2EnLEFUTUlPQ19TQVJQUlYrMykKKwkJCQkJCS8qIGFkanVzdCBidWZmZXIgbGV2ZWwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYnVmX25yCit7CisgICB1bnNpZ25lZCBtaW47CisgICB1bnNpZ25lZCBpbml0OworICAgdW5zaWduZWQgbWF4OworfWJ1Zl9ucjsKKworCit0eXBlZGVmIHN0cnVjdCBwb29sX2xldmVscworeworICAgaW50IGJ1ZnR5cGU7CisgICBpbnQgY291bnQ7CQkvKiAoQXQgbGVhc3QgZm9yIG5vdykgb25seSB1c2VkIGluIE5TX0dFVFBTVEFUICovCisgICBidWZfbnIgbGV2ZWw7Cit9IHBvb2xfbGV2ZWxzOworCisvKiB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6ICovCisjZGVmaW5lIE5TX0JVRlRZUEVfU01BTEwgMQorI2RlZmluZSBOU19CVUZUWVBFX0xBUkdFIDIKKyNkZWZpbmUgTlNfQlVGVFlQRV9IVUdFIDMKKyNkZWZpbmUgTlNfQlVGVFlQRV9JT1ZFQyA0CisKKworI2VuZGlmIC8qIExJTlVYX0FUTV9OSUNTVEFSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX3RjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1fdGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjOTdlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtX3RjcC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIGF0bV90Y3AuaCAtIERyaXZlci1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgb2YgdGhlIEFUTVRDUCBkcml2ZXIgKGZvciB1c2UgYnkKKwkgICAgICAgZHJpdmVyLXNwZWNpZmljIHV0aWxpdGllcykgKi8KKworLyogV3JpdHRlbiAxOTk3LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaWZuZGVmIExJTlVYX0FUTV9UQ1BfSAorI2RlZmluZSBMSU5VWF9BVE1fVENQX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorCisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworLyoKKyAqIEFsbCB2YWx1ZXMgaW4gc3RydWN0IGF0bXRjcF9oZHIgYXJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICovCisKK3N0cnVjdCBhdG10Y3BfaGRyIHsKKwl1aW50MTZfdAl2cGk7CisJdWludDE2X3QJdmNpOworCXVpbnQzMl90CWxlbmd0aDsJCS8qIC4uLiBvZiBkYXRhIHBhcnQgKi8KK307CisKKy8qCisgKiBBbGwgdmFsdWVzIGluIHN0cnVjdCBhdG10Y3BfY29tbWFuZCBhcmUgaW4gaG9zdCBieXRlIG9yZGVyCisgKi8KKworI2RlZmluZSBBVE1UQ1BfSERSX01BR0lDCSh+MCkJLyogdGhpcyBsZW5ndGggaW5kaWNhdGVzIGEgY29tbWFuZCAqLworI2RlZmluZSBBVE1UQ1BfQ1RSTF9PUEVOCTEJLyogcmVxdWVzdC9yZXBseSAqLworI2RlZmluZSBBVE1UQ1BfQ1RSTF9DTE9TRQkyCS8qIHJlcXVlc3QvcmVwbHkgKi8KKworc3RydWN0IGF0bXRjcF9jb250cm9sIHsKKwlzdHJ1Y3QgYXRtdGNwX2hkciBoZHI7CS8qIG11c3QgYmUgZmlyc3QgKi8KKwlpbnQgdHlwZTsJCS8qIG1lc3NhZ2UgdHlwZTsgYm90aCBkaXJlY3Rpb25zICovCisJYXRtX2twdHJfdCB2Y2M7CQkvKiBib3RoIGRpcmVjdGlvbnMgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIGFkZHI7IC8qIHN1Z2dlc3RlZCB2YWx1ZSBmcm9tIGtlcm5lbCAqLworCXN0cnVjdCBhdG1fcW9zCXFvczsJLyogYm90aCBkaXJlY3Rpb25zICovCisJaW50IHJlc3VsdDsJCS8qIHRvIGtlcm5lbCBvbmx5ICovCit9IF9fQVRNX0FQSV9BTElHTjsKKworLyoKKyAqIEZpZWxkIHVzYWdlOgorICogTWVzc2dlIHR5cGUJZGlyLgloZHIudj9pCXR5cGUJYWRkcglxb3MJdmNjCXJlc3VsdAorICogLS0tLS0tLS0tLS0gIC0tLS0JLS0tLS0tLSAtLS0tCS0tLS0JLS0tCS0tLQktLS0tLS0KKyAqIE9QRU4JCUstPkQJWQlZCVkJWQlZCTAKKyAqIE9QRU4JCUQtPksJLQlZCVkJWQlZCVkKKyAqIENMT1NFCUstPkQJLQktCVkJLQlZCTAKKyAqIENMT1NFCUQtPksJLQktCS0JLQlZCVkKKyAqLworCisjZGVmaW5lIFNJT0NTSUZBVE1UQ1AJX0lPKCdhJyxBVE1JT0NfSVRGKQkvKiBzZXQgQVRNVENQIG1vZGUgKi8KKyNkZWZpbmUgQVRNVENQX0NSRUFURQlfSU8oJ2EnLEFUTUlPQ19JVEYrMTQpCS8qIGNyZWF0ZSBwZXJzaXN0ZW50IEFUTVRDUAorCQkJCQkJICAgaW50ZXJmYWNlICovCisjZGVmaW5lIEFUTVRDUF9SRU1PVkUJX0lPKCdhJyxBVE1JT0NfSVRGKzE1KQkvKiBkZXN0cm95IHBlcnNpc3RlbnQgQVRNVENQCisJCQkJCQkgICBpbnRlcmZhY2UgKi8KKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1femF0bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1femF0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjBmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bV96YXRtLmgKQEAgLTAsMCArMSw1MiBAQAorLyogYXRtX3phdG0uaCAtIERyaXZlci1zcGVjaWZpYyBkZWNsYXJhdGlvbnMgb2YgdGhlIFpBVE0gZHJpdmVyIChmb3IgdXNlIGJ5CisJCWRyaXZlci1zcGVjaWZpYyB1dGlsaXRpZXMpICovCisKKy8qIFdyaXR0ZW4gMTk5NS0xOTk5IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisKKworI2lmbmRlZiBMSU5VWF9BVE1fWkFUTV9ICisjZGVmaW5lIExJTlVYX0FUTV9aQVRNX0gKKworLyoKKyAqIE5vdGU6IG5vbi1rZXJuZWwgcHJvZ3JhbXMgaW5jbHVkaW5nIHRoaXMgZmlsZSBtdXN0IGFsc28gaW5jbHVkZQorICogc3lzL3R5cGVzLmggZm9yIHN0cnVjdCB0aW1ldmFsCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisjZGVmaW5lIFpBVE1fR0VUUE9PTAlfSU9XKCdhJyxBVE1JT0NfU0FSUFJWKzEsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCQkvKiBnZXQgcG9vbCBzdGF0aXN0aWNzICovCisjZGVmaW5lIFpBVE1fR0VUUE9PTFoJX0lPVygnYScsQVRNSU9DX1NBUlBSVisyLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkJLyogZ2V0IHN0YXRpc3RpY3MgYW5kIHplcm8gKi8KKyNkZWZpbmUgWkFUTV9TRVRQT09MCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrMyxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJCS8qIHNldCBwb29sIHBhcmFtZXRlcnMgKi8KKworc3RydWN0IHphdG1fcG9vbF9pbmZvIHsKKwlpbnQgcmVmX2NvdW50OwkJCS8qIGZyZWUgYnVmZmVyIHBvb2wgdXNhZ2UgY291bnRlcnMgKi8KKwlpbnQgbG93X3dhdGVyLGhpZ2hfd2F0ZXI7CS8qIHJlZmlsbCBwYXJhbWV0ZXJzICovCisJaW50IHJxYV9jb3VudCxycXVfY291bnQ7CS8qIHF1ZXVlIGNvbmRpdGlvbiBjb3VudGVycyAqLworCWludCBvZmZzZXQsbmV4dF9vZmY7CQkvKiBhbGlnbm1lbnQgb3B0aW1pemF0aW9uczogb2Zmc2V0ICovCisJaW50IG5leHRfY250LG5leHRfdGhyZXM7CS8qIHJlcGV0aXRpb24gY291bnRlciBhbmQgdGhyZXNob2xkICovCit9OworCitzdHJ1Y3QgemF0bV9wb29sX3JlcSB7CisJaW50IHBvb2xfbnVtOwkJCS8qIHBvb2wgbnVtYmVyICovCisJc3RydWN0IHphdG1fcG9vbF9pbmZvIGluZm87CS8qIGFjdHVhbCBpbmZvcm1hdGlvbiAqLworfTsKKworc3RydWN0IHphdG1fdF9oaXN0IHsKKwlzdHJ1Y3QgdGltZXZhbCByZWFsOwkJLyogcmVhbCAod2FsbC1jbG9jaykgdGltZSAqLworCXN0cnVjdCB0aW1ldmFsIGV4cGVjdGVkOwkvKiBleHBlY3RlZCByZWFsIHRpbWUgKi8KK307CisKKworI2RlZmluZSBaQVRNX09BTV9QT09MCQkwCS8qIGZyZWUgYnVmZmVyIHBvb2wgZm9yIE9BTSBjZWxscyAqLworI2RlZmluZSBaQVRNX0FBTDBfUE9PTAkJMQkvKiBmcmVlIGJ1ZmZlciBwb29sIGZvciBBQUwwIGNlbGxzICovCisjZGVmaW5lIFpBVE1fQUFMNV9QT09MX0JBU0UJMgkvKiBmaXJzdCBBQUw1IGZyZWUgYnVmZmVyIHBvb2wgKi8KKyNkZWZpbmUgWkFUTV9MQVNUX1BPT0wJWkFUTV9BQUw1X1BPT0xfQkFTRSsxMCAvKiBtYXguIDY0IGtCICovCisKKyNkZWZpbmUgWkFUTV9USU1FUl9ISVNUT1JZX1NJWkUJMTYJLyogbnVtYmVyIG9mIHRpbWVyIGFkanVzdG1lbnRzIHRvCisJCQkJCSAgIHJlY29yZDsgbXVzdCBiZSAyXm4gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWFwaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU1NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1hcGkuaApAQCAtMCwwICsxLDI5IEBACisvKiBhdG1hcGkuaCAtIEFUTSBBUEkgdXNlciBzcGFjZS9rZXJuZWwgY29tcGF0aWJpbGl0eSAqLworIAorLyogV3JpdHRlbiAxOTk5LDIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIElDQSAqLworIAorCisjaWZuZGVmIF9MSU5VWF9BVE1BUElfSAorI2RlZmluZSBfTElOVVhfQVRNQVBJX0gKKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorLyogc3VjaCBhbGlnbm1lbnQgaXMgbm90IHJlcXVpcmVkIG9uIDMyIGJpdCBzcGFyY3MsIGJ1dCB3ZSBjYW4ndAorICAgZmlndXJlIHRoYXQgd2UgYXJlIG9uIGEgc3BhcmM2NCB3aGlsZSBjb21waWxpbmcgdXNlci1zcGFjZSBwcm9ncmFtcy4gKi8KKyNkZWZpbmUgX19BVE1fQVBJX0FMSUdOCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKQorI2Vsc2UKKyNkZWZpbmUgX19BVE1fQVBJX0FMSUdOCisjZW5kaWYKKworCisvKgorICogT3BhcXVlIHR5cGUgZm9yIGtlcm5lbCBwb2ludGVycy4gTm90ZSB0aGF0IF8gaXMgbmV2ZXIgYWNjZXNzZWQuIFdlIG5lZWQKKyAqIHRoZSBzdHJ1Y3QgaW4gb3JkZXIgaGlkZSB0aGUgYXJyYXksIHNvIHRoYXQgd2UgY2FuIG1ha2Ugc2ltcGxlIGFzc2lnbm1lbnRzCisgKiBpbnN0ZWFkIG9mIGJlaW5nIGZvcmNlZCB0byB1c2UgbWVtY3B5LiBJdCBhbHNvIGltcHJvdmVzIGVycm9yIHJlcG9ydGluZyBmb3IKKyAqIGNvZGUgdGhhdCBzdGlsbCBhc3N1bWVzIHRoYXQgd2UncmUgcGFzc2luZyB1bnNpZ25lZCBsb25ncy4KKyAqCisgKiBDb252ZW50aW9uOiBOVUxMIHBvaW50ZXJzIGFyZSBwYXNzZWQgYXMgYSBmaWVsZCBvZiBhbGwgemVyb2VzLgorICovCisgCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgX1s4XTsgfSBfX0FUTV9BUElfQUxJR04gYXRtX2twdHJfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWFycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFmNGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1hcnAuaApAQCAtMCwwICsxLDQxIEBACisvKiBhdG1hcnAuaCAtIEFUTSBBUlAgcHJvdG9jb2wgYW5kIGtlcm5lbC1kZW1vbiBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0xOTk5IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKyNpZm5kZWYgX0xJTlVYX0FUTUFSUF9ICisjZGVmaW5lIF9MSU5VWF9BVE1BUlBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworCisjZGVmaW5lIEFUTUFSUF9SRVRSWV9ERUxBWSAzMAkJLyogcmVxdWVzdCBuZXh0IHJlc29sdXRpb24gb3IgZm9yZ2V0CisJCQkJCSAgIE5BSyBhZnRlciAzMCBzZWMgLSBzaG91bGQgZ28gaW50bworCQkJCQkgICBhdG1jbGlwLmggKi8KKyNkZWZpbmUgQVRNQVJQX01BWF9VTlJFU19QQUNLRVRTIDUJLyogcXVldWUgdGhhdCBtYW55IHBhY2tldHMgd2hpbGUKKwkJCQkJICAgd2FpdGluZyBmb3IgdGhlIHJlc29sdmVyICovCisKKworI2RlZmluZSBBVE1BUlBEX0NUUkwJX0lPKCdhJyxBVE1JT0NfQ0xJUCsxKQkvKiBiZWNvbWUgYXRtYXJwZCBjdHJsIHNvY2sgKi8KKyNkZWZpbmUgQVRNQVJQX01LSVAJX0lPKCdhJyxBVE1JT0NfQ0xJUCsyKQkvKiBhdHRhY2ggc29ja2V0IHRvIElQICovCisjZGVmaW5lIEFUTUFSUF9TRVRFTlRSWQlfSU8oJ2EnLEFUTUlPQ19DTElQKzMpCS8qIGZpbGwgb3IgaGlkZSBBUlAgZW50cnkgKi8KKyNkZWZpbmUgQVRNQVJQX0VOQ0FQCV9JTygnYScsQVRNSU9DX0NMSVArNSkJLyogY2hhbmdlIGVuY2Fwc3VsYXRpb24gKi8KKworCitlbnVtIGF0bWFycF9jdHJsX3R5cGUgeworCWFjdF9pbnZhbGlkLAkJLyogY2F0Y2ggdW5pbml0aWFsaXplZCBzdHJ1Y3R1cmVzICovCisJYWN0X25lZWQsCQkvKiBuZWVkIGFkZHJlc3MgcmVzb2x1dGlvbiAqLworCWFjdF91cCwJCQkvKiBpbnRlcmZhY2UgaXMgY29taW5nIHVwICovCisJYWN0X2Rvd24sCQkvKiBpbnRlcmZhY2UgaXMgZ29pbmcgZG93biAqLworCWFjdF9jaGFuZ2UJCS8qIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkICovCit9OworCitzdHJ1Y3QgYXRtYXJwX2N0cmwgeworCWVudW0gYXRtYXJwX2N0cmxfdHlwZQl0eXBlOwkvKiBtZXNzYWdlIHR5cGUgKi8KKwlpbnQJCQlpdGZfbnVtOy8qIGludGVyZmFjZSBudW1iZXIgKGlmIHByZXNlbnQpICovCisJX19iZTMyCQkJaXA7CS8qIElQIGFkZHJlc3MgKGFjdF9uZWVkIG9ubHkpICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtYnIyNjg0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWJyMjY4NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OWZiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWJyMjY4NC5oCkBAIC0wLDAgKzEsMTAxIEBACisjaWZuZGVmIF9MSU5VWF9BVE1CUjI2ODRfSAorI2RlZmluZSBfTElOVVhfQVRNQlIyNjg0X0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CQkvKiBGb3IgSUZOQU1TSVogKi8KKworLyoKKyAqIFR5cGUgb2YgbWVkaWEgd2UncmUgYnJpZGdpbmcgKGV0aGVybmV0LCB0b2tlbiByaW5nLCBldGMpICBDdXJyZW50bHkgb25seQorICogZXRoZXJuZXQgaXMgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgQlIyNjg0X01FRElBX0VUSEVSTkVUCSgwKQkvKiA4MDIuMyAqLworI2RlZmluZSBCUjI2ODRfTUVESUFfODAyXzQJKDEpCS8qIDgwMi40ICovCisjZGVmaW5lIEJSMjY4NF9NRURJQV9UUgkJKDIpCS8qIDgwMi41IC0gdG9rZW4gcmluZyAqLworI2RlZmluZSBCUjI2ODRfTUVESUFfRkRESQkoMykKKyNkZWZpbmUgQlIyNjg0X01FRElBXzgwMl82CSg0KQkvKiA4MDIuNiAqLworCisvKgorICogSXMgdGhlcmUgRkNTIGluYm91bmQgb24gdGhpcyBWQz8gIFRoaXMgY3VycmVudGx5IGlzbid0IHN1cHBvcnRlZC4KKyAqLworI2RlZmluZSBCUjI2ODRfRkNTSU5fTk8JCSgwKQorI2RlZmluZSBCUjI2ODRfRkNTSU5fSUdOT1JFCSgxKQorI2RlZmluZSBCUjI2ODRfRkNTSU5fVkVSSUZZCSgyKQorCisvKgorICogSXMgdGhlcmUgRkNTIG91dGJvdW5kIG9uIHRoaXMgVkM/ICBUaGlzIGN1cnJlbnRseSBpc24ndCBzdXBwb3J0ZWQuCisgKi8KKyNkZWZpbmUgQlIyNjg0X0ZDU09VVF9OTwkoMCkKKyNkZWZpbmUgQlIyNjg0X0ZDU09VVF9TRU5EWkVSTwkoMSkKKyNkZWZpbmUgQlIyNjg0X0ZDU09VVF9HRU5FUkFURQkoMikKKworLyoKKyAqIERvZXMgdGhpcyBWQyBpbmNsdWRlIExMQyBlbmNhcHN1bGF0aW9uPworICovCisjZGVmaW5lIEJSMjY4NF9FTkNBUFNfVkMJKDApCS8qIFZDLW11eCAqLworI2RlZmluZSBCUjI2ODRfRU5DQVBTX0xMQwkoMSkKKyNkZWZpbmUgQlIyNjg0X0VOQ0FQU19BVVRPREVURUNUICgyKQkvKiBVbnN1cG9ydGVkICovCisKKy8qCisgKiBUaGlzIGlzIGZvciB0aGUgQVRNX05FV0JBQ0tFTkRJRiBjYWxsIC0gdGhlc2UgYXJlIGxpa2Ugc29ja2V0IGZhbWlsaWVzOgorICogdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN0cnVjdHVyZSBpcyB0aGUgYmFja2VuZCBudW1iZXIgYW5kIHRoZSByZXN0CisgKiBpcyBwZXItYmFja2VuZCBzcGVjaWZpYworICovCitzdHJ1Y3QgYXRtX25ld2lmX2JyMjY4NCB7CisJYXRtX2JhY2tlbmRfdAliYWNrZW5kX251bTsJLyogQVRNX0JBQ0tFTkRfQlIyNjg0ICovCisJaW50CQltZWRpYTsJCS8qIEJSMjY4NF9NRURJQV8qICovCisJY2hhcgkJaWZuYW1lW0lGTkFNU0laXTsKKwlpbnQJCW10dTsKK307CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNwZWNpZnkgYSBicjI2ODQgaW50ZXJmYWNlIC0gZWl0aGVyIGJ5IGEKKyAqIHBvc2l0aXZlIGludGVnZXIgKHJldHVybmVkIGJ5IEFUTV9ORVdCQUNLRU5ESUYpIG9yIHRoZSBpbnRlcmZhY2VzIG5hbWUKKyAqLworI2RlZmluZSBCUjI2ODRfRklORF9CWU5PVEhJTkcJKDApCisjZGVmaW5lIEJSMjY4NF9GSU5EX0JZTlVNCSgxKQorI2RlZmluZSBCUjI2ODRfRklORF9CWUlGTkFNRQkoMikKK3N0cnVjdCBicjI2ODRfaWZfc3BlYyB7CisJaW50IG1ldGhvZDsJCQkvKiBCUjI2ODRfRklORF8qICovCisJdW5pb24geworCQljaGFyCQlpZm5hbWVbSUZOQU1TSVpdOworCQlpbnQJCWRldm51bTsKKwl9IHNwZWM7Cit9OworCisvKgorICogVGhpcyBpcyBmb3IgdGhlIEFUTV9TRVRCQUNLRU5EIGNhbGwgLSB0aGVzZSBhcmUgbGlrZSBzb2NrZXQgZmFtaWxpZXM6CisgKiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIGlzIHRoZSBiYWNrZW5kIG51bWJlciBhbmQgdGhlIHJlc3QKKyAqIGlzIHBlci1iYWNrZW5kIHNwZWNpZmljCisgKi8KK3N0cnVjdCBhdG1fYmFja2VuZF9icjI2ODQgeworCWF0bV9iYWNrZW5kX3QJYmFja2VuZF9udW07CS8qIEFUTV9CQUNLRU5EX0JSMjY4NCAqLworCXN0cnVjdCBicjI2ODRfaWZfc3BlYyBpZnNwZWM7CisJaW50CWZjc19pbjsJCS8qIEJSMjY4NF9GQ1NJTl8qICovCisJaW50CWZjc19vdXQ7CS8qIEJSMjY4NF9GQ1NPVVRfKiAqLworCWludAlmY3NfYXV0bzsJLyogMTogZmNzX3tpbixvdXR9IGRpc2FibGVkIGlmIG5vIEZDUyByeCdlZCAqLworCWludAllbmNhcHM7CQkvKiBCUjI2ODRfRU5DQVBTXyogKi8KKwlpbnQJaGFzX3ZwaWlkOwkvKiAxOiB1c2UgdnBuX2lkIC0gVW5zdXBwb3J0ZWQgKi8KKwlfX3U4CXZwbl9pZFs3XTsKKwlpbnQJc2VuZF9wYWRkaW5nOwkvKiB1bnN1cHBvcnRlZCAqLworCWludAltaW5fc2l6ZTsJLyogd2Ugd2lsbCBwYWQgc21hbGxlciBwYWNrZXRzIHRoYW4gdGhpcyAqLworfTsKKworLyoKKyAqIFRoZSBCUjI2ODRfU0VURklMVCBpb2N0bCBpcyBhbiBleHBlcmltZW50YWwgbWVjaGFuaXNtIGZvciBmb2xrcworICogdGVybWluYXRpbmcgYSBsYXJnZSBudW1iZXIgb2YgSVAtb25seSB2Y2Mncy4gIFdoZW4gbmV0ZmlsdGVyIGFsbG93cworICogZWZmaWNpZW50IHBlci1pZiBpbi9vdXQgZmlsdGVycywgdGhpcyBzdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZAorICovCitzdHJ1Y3QgYnIyNjg0X2ZpbHRlciB7CisJX19iZTMyCXByZWZpeDsJCS8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCV9fYmUzMgluZXRtYXNrOwkvKiAwID0gZGlzYWJsZSBmaWx0ZXIgKi8KK307CisKK3N0cnVjdCBicjI2ODRfZmlsdGVyX3NldCB7CisJc3RydWN0IGJyMjY4NF9pZl9zcGVjIGlmc3BlYzsKKwlzdHJ1Y3QgYnIyNjg0X2ZpbHRlciBmaWx0ZXI7Cit9OworCisjZGVmaW5lIEJSMjY4NF9TRVRGSUxUCV9JT1coICdhJywgQVRNSU9DX0JBQ0tFTkQgKyAwLCBcCisJCQkJc3RydWN0IGJyMjY4NF9maWx0ZXJfc2V0KQorCisjZW5kaWYgLyogX0xJTlVYX0FUTUJSMjY4NF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWNsaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtY2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWNsaXAuaApAQCAtMCwwICsxLDIxIEBACisvKiBhdG1jbGlwLmggLSBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0xOTk4IGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKyNpZm5kZWYgTElOVVhfQVRNQ0xJUF9ICisjZGVmaW5lIExJTlVYX0FUTUNMSVBfSAorCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorCisKKyNkZWZpbmUgUkZDMTQ4M0xMQ19MRU4JOAkJLyogTExDK09VSStQSUQgPSA4ICovCisjZGVmaW5lIFJGQzE2MjZfTVRVCTkxODAJCS8qIFJGQzE2MjYgZGVmYXVsdCBNVFUgKi8KKworI2RlZmluZSBDTElQX0RFRkFVTFRfSURMRVRJTUVSIDEyMDAJLyogMjAgbWludXRlcywgc2VlIFJGQzE3NTUgKi8KKyNkZWZpbmUgQ0xJUF9DSEVDS19JTlRFUlZBTAkgMTAJLyogY2hlY2sgZXZlcnkgdGVuIHNlY29uZHMgKi8KKworI2RlZmluZQlTSU9DTUtDTElQCV9JTygnYScsQVRNSU9DX0NMSVApCS8qIGNyZWF0ZSBJUCBpbnRlcmZhY2UgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWRldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA2OGIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1kZXYuaApAQCAtMCwwICsxLDIxMSBAQAorLyogYXRtZGV2LmggLSBBVE0gZGV2aWNlIGRyaXZlciBkZWNsYXJhdGlvbnMgYW5kIHZhcmlvdXMgcmVsYXRlZCBpdGVtcyAqLworIAorLyogV3JpdHRlbiAxOTk1LTIwMDAgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKyAKKworI2lmbmRlZiBMSU5VWF9BVE1ERVZfSAorI2RlZmluZSBMSU5VWF9BVE1ERVZfSAorCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKworCisjZGVmaW5lIEVTSV9MRU4JCTYKKworI2RlZmluZSBBVE1fT0MzX1BDUgkoMTU1NTIwMDAwLzI3MCoyNjAvOC81MykKKwkJCS8qIE9DMyBsaW5rIHJhdGU6ICAxNTU1MjAwMDAgYnBzCisJCQkgICBTT05FVCBvdmVyaGVhZDogLzI3MCoyNjAgKDkgc2VjdGlvbiwgMSBwYXRoKQorCQkJICAgYml0cyBwZXIgY2VsbDogIC84LzUzCisJCQkgICBtYXggY2VsbCByYXRlOiAgMzUzMjA3LjU0NyBjZWxscy9zZWMgKi8KKyNkZWZpbmUgQVRNXzI1X1BDUgkoKDI1NjAwMDAwLzgtODAwMCkvNTQpCisJCQkvKiAyNSBNYnBzIEFUTSBjZWxsIHJhdGUgKDU5MTExKSAqLworI2RlZmluZSBBVE1fT0MxMl9QQ1IJKDYyMjA4MDAwMC8xMDgwKjEwNDAvOC81MykKKwkJCS8qIE9DMTIgbGluayByYXRlOiA2MjIwODAwMDAgYnBzCisJCQkgICBTT05FVCBvdmVyaGVhZDogLzEwODAqMTA0MAorCQkJICAgYml0cyBwZXIgY2VsbDogIC84LzUzCisJCQkgICBtYXggY2VsbCByYXRlOiAgMTQxMjgzMC4xODggY2VsbHMvc2VjICovCisjZGVmaW5lIEFUTV9EUzNfUENSCSg4MDAwKjEyKQorCQkJLyogRFMzOiAxMiBjZWxscyBpbiBhIDEyNSB1c2VjIHRpbWUgc2xvdCAqLworCisKKyNkZWZpbmUgX19BQUxfU1RBVF9JVEVNUyBcCisgICAgX19IQU5ETEVfSVRFTSh0eCk7CQkJLyogVFggb2theSAqLyBcCisgICAgX19IQU5ETEVfSVRFTSh0eF9lcnIpOwkJLyogVFggZXJyb3JzICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHJ4KTsJCQkvKiBSWCBva2F5ICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHJ4X2Vycik7CQkvKiBSWCBlcnJvcnMgKi8gXAorICAgIF9fSEFORExFX0lURU0ocnhfZHJvcCk7CQkvKiBSWCBvdXQgb2YgbWVtb3J5ICovCisKK3N0cnVjdCBhdG1fYWFsX3N0YXRzIHsKKyNkZWZpbmUgX19IQU5ETEVfSVRFTShpKSBpbnQgaQorCV9fQUFMX1NUQVRfSVRFTVMKKyN1bmRlZiBfX0hBTkRMRV9JVEVNCit9OworCisKK3N0cnVjdCBhdG1fZGV2X3N0YXRzIHsKKwlzdHJ1Y3QgYXRtX2FhbF9zdGF0cyBhYWwwOworCXN0cnVjdCBhdG1fYWFsX3N0YXRzIGFhbDM0OworCXN0cnVjdCBhdG1fYWFsX3N0YXRzIGFhbDU7Cit9IF9fQVRNX0FQSV9BTElHTjsKKworCisjZGVmaW5lIEFUTV9HRVRMSU5LUkFURQlfSU9XKCdhJyxBVE1JT0NfSVRGKzEsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBsaW5rIHJhdGUgKi8KKyNkZWZpbmUgQVRNX0dFVE5BTUVTCV9JT1coJ2EnLEFUTUlPQ19JVEYrMyxzdHJ1Y3QgYXRtX2lvYnVmKQorCQkJCQkvKiBnZXQgaW50ZXJmYWNlIG5hbWVzIChudW1iZXJzKSAqLworI2RlZmluZSBBVE1fR0VUVFlQRQlfSU9XKCdhJyxBVE1JT0NfSVRGKzQsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBpbnRlcmZhY2UgdHlwZSBuYW1lICovCisjZGVmaW5lIEFUTV9HRVRFU0kJX0lPVygnYScsQVRNSU9DX0lURis1LHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBnZXQgaW50ZXJmYWNlIEVTSSAqLworI2RlZmluZSBBVE1fR0VUQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzYsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBpdGYncyBsb2NhbCBBVE0gYWRkci4gbGlzdCAqLworI2RlZmluZSBBVE1fUlNUQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzcsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHJlc2V0IGl0ZidzIEFUTSBhZGRyZXNzIGxpc3QgKi8KKyNkZWZpbmUgQVRNX0FEREFERFIJX0lPVygnYScsQVRNSU9DX0lURis4LHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBhZGQgYSBsb2NhbCBBVE0gYWRkcmVzcyAqLworI2RlZmluZSBBVE1fREVMQUREUglfSU9XKCdhJyxBVE1JT0NfSVRGKzksc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHJlbW92ZSBhIGxvY2FsIEFUTSBhZGRyZXNzICovCisjZGVmaW5lIEFUTV9HRVRDSVJBTkdFCV9JT1coJ2EnLEFUTUlPQ19JVEYrMTAsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGdldCBjb25uZWN0aW9uIGlkZW50aWZpZXIgcmFuZ2UgKi8KKyNkZWZpbmUgQVRNX1NFVENJUkFOR0UJX0lPVygnYScsQVRNSU9DX0lURisxMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogc2V0IGNvbm5lY3Rpb24gaWRlbnRpZmllciByYW5nZSAqLworI2RlZmluZSBBVE1fU0VURVNJCV9JT1coJ2EnLEFUTUlPQ19JVEYrMTIsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIHNldCBpbnRlcmZhY2UgRVNJICovCisjZGVmaW5lIEFUTV9TRVRFU0lGCV9JT1coJ2EnLEFUTUlPQ19JVEYrMTMsc3RydWN0IGF0bWlmX3Npb2MpCisJCQkJCS8qIGZvcmNlIGludGVyZmFjZSBFU0kgKi8KKyNkZWZpbmUgQVRNX0FERExFQ1NBRERSCV9JT1coJ2EnLCBBVE1JT0NfSVRGKzE0LCBzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogcmVnaXN0ZXIgYSBMRUNTIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVRNX0RFTExFQ1NBRERSCV9JT1coJ2EnLCBBVE1JT0NfSVRGKzE1LCBzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogdW5yZWdpc3RlciBhIExFQ1MgYWRkcmVzcyAqLworI2RlZmluZSBBVE1fR0VUTEVDU0FERFIJX0lPVygnYScsIEFUTUlPQ19JVEYrMTYsIHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiByZXRyaWV2ZSBMRUNTIGFkZHJlc3MoZXMpICovCisKKyNkZWZpbmUgQVRNX0dFVFNUQVQJX0lPVygnYScsQVRNSU9DX1NBUkNPTSswLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBnZXQgQUFMIGxheWVyIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgQVRNX0dFVFNUQVRaCV9JT1coJ2EnLEFUTUlPQ19TQVJDT00rMSxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IEFBTCBsYXllciBzdGF0aXN0aWNzIGFuZCB6ZXJvICovCisjZGVmaW5lIEFUTV9HRVRMT09QCV9JT1coJ2EnLEFUTUlPQ19TQVJDT00rMixzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogZ2V0IGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgQVRNX1NFVExPT1AJX0lPVygnYScsQVRNSU9DX1NBUkNPTSszLHN0cnVjdCBhdG1pZl9zaW9jKQorCQkJCQkvKiBzZXQgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBBVE1fUVVFUllMT09QCV9JT1coJ2EnLEFUTUlPQ19TQVJDT00rNCxzdHJ1Y3QgYXRtaWZfc2lvYykKKwkJCQkJLyogcXVlcnkgc3VwcG9ydGVkIGxvb3BiYWNrIG1vZGVzICovCisjZGVmaW5lIEFUTV9TRVRTQwlfSU9XKCdhJyxBVE1JT0NfU1BFQ0lBTCsxLGludCkKKwkJCQkJLyogZW5hYmxlIG9yIGRpc2FibGUgc2luZ2xlLWNvcHkgKi8KKyNkZWZpbmUgQVRNX1NFVEJBQ0tFTkQJX0lPVygnYScsQVRNSU9DX1NQRUNJQUwrMixhdG1fYmFja2VuZF90KQorCQkJCQkvKiBzZXQgYmFja2VuZCBoYW5kbGVyICovCisjZGVmaW5lIEFUTV9ORVdCQUNLRU5ESUYgX0lPVygnYScsQVRNSU9DX1NQRUNJQUwrMyxhdG1fYmFja2VuZF90KQorCQkJCQkvKiB1c2UgYmFja2VuZCB0byBtYWtlIG5ldyBpZiAqLworI2RlZmluZSBBVE1fQUREUEFSVFkgIAlfSU9XKCdhJywgQVRNSU9DX1NQRUNJQUwrNCxzdHJ1Y3QgYXRtX2lvYnVmKQorIAkJCQkJLyogYWRkIHBhcnR5IHRvIHAybXAgY2FsbCAqLworI2RlZmluZSBBVE1fRFJPUFBBUlRZIAlfSU9XKCdhJywgQVRNSU9DX1NQRUNJQUwrNSxpbnQpCisJCQkJCS8qIGRyb3AgcGFydHkgZnJvbSBwMm1wIGNhbGwgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBiYWNrZW5kIGhhbmRrZXJzIHRoYXQgY2FuIGJlIHNldCB2aWEgdGhlIEFUTV9TRVRCQUNLRU5EIGNhbGwKKyAqIGFib3ZlLiAgSW4gdGhlIGZ1dHVyZSB3ZSBtYXkgc3VwcG9ydCBkeW5hbWljIGxvYWRpbmcgb2YgdGhlc2UgLSBmb3Igbm93LAorICogdGhleSdyZSBqdXN0IGJlaW5nIHVzZWQgdG8gc2hhcmUgdGhlIEFUTUlPQ19CQUNLRU5EIGlvY3RscworICovCisjZGVmaW5lIEFUTV9CQUNLRU5EX1JBVwkJMAkKKyNkZWZpbmUgQVRNX0JBQ0tFTkRfUFBQCQkxCS8qIFBQUG9BVE0gLSBSRkMyMzY0ICovCisjZGVmaW5lIEFUTV9CQUNLRU5EX0JSMjY4NAkyCS8qIEJyaWRnZWQgUkZDMTQ4My8yNjg0ICovCisKKy8qIGZvciBBVE1fR0VUVFlQRSAqLworI2RlZmluZSBBVE1fSVRGVFlQX0xFTgk4CS8qIG1heGltdW0gbGVuZ3RoIG9mIGludGVyZmFjZSB0eXBlIG5hbWUgKi8KKworLyoKKyAqIExvb3BiYWNrIG1vZGVzIGZvciBBVE1fe1BIWSxTQVJ9X3tHRVQsU0VUfUxPT1AKKyAqLworCisvKiBQb2ludCBvZiBsb29wYmFjawkJCQlDUFUtLT5TQVItLT5QSFktLT5saW5lLS0+IC4uLiAqLworI2RlZmluZSBfX0FUTV9MTV9OT05FCTAJLyogbm8gbG9vcCBiYWNrICAgICBeICAgICBeICAgICBeICAgICAgXiAgICAgICovCisjZGVmaW5lIF9fQVRNX0xNX0FBTAkxCS8qIGxvb3AgYmFjayBQRFVzIC0tJyAgICAgfCAgICAgfCAgICAgIHwgICAgICAqLworI2RlZmluZSBfX0FUTV9MTV9BVE0JMgkvKiBsb29wIGJhY2sgQVRNIGNlbGxzIC0tLScgICAgIHwgICAgICB8ICAgICAgKi8KKy8qIFJFU0VSVkVECQk0CWxvb3AgYmFjayBvbiBQSFkgc2lkZSAgLS0tJwkJICAgICAgKi8KKyNkZWZpbmUgX19BVE1fTE1fUEhZCTgJLyogbG9vcCBiYWNrIGJpdHMgKGRpZ2l0YWwpIC0tLS0nICAgICAgfCAgICAgICovCisjZGVmaW5lIF9fQVRNX0xNX0FOQUxPRyAxNgkvKiBsb29wIGJhY2sgdGhlIGFuYWxvZyBzaWduYWwgLS0tLS0tLS0nICAgICAgKi8KKworLyogRGlyZWN0aW9uIG9mIGxvb3BiYWNrICovCisjZGVmaW5lIF9fQVRNX0xNX01LTE9DKG4pCSgobikpCSAgICAvKiBMb2NhbCAoaS5lLiBsb29wIFRYIHRvIFJYKSAqLworI2RlZmluZSBfX0FUTV9MTV9NS1JNVChuKQkoKG4pIDw8IDgpICAvKiBSZW1vdGUgKGkuZS4gbG9vcCBSWCB0byBUWCkgKi8KKworI2RlZmluZSBfX0FUTV9MTV9YVExPQyhuKQkoKG4pICYgMHhmZikKKyNkZWZpbmUgX19BVE1fTE1fWFRSTVQobikJKCgobikgPj4gOCkgJiAweGZmKQorCisjZGVmaW5lIEFUTV9MTV9OT05FCTAJLyogbm8gbG9vcGJhY2sgKi8KKworI2RlZmluZSBBVE1fTE1fTE9DX0FBTAlfX0FUTV9MTV9NS0xPQyhfX0FUTV9MTV9BQUwpCisjZGVmaW5lIEFUTV9MTV9MT0NfQVRNCV9fQVRNX0xNX01LTE9DKF9fQVRNX0xNX0FUTSkKKyNkZWZpbmUgQVRNX0xNX0xPQ19QSFkJX19BVE1fTE1fTUtMT0MoX19BVE1fTE1fUEhZKQorI2RlZmluZSBBVE1fTE1fTE9DX0FOQUxPRyBfX0FUTV9MTV9NS0xPQyhfX0FUTV9MTV9BTkFMT0cpCisKKyNkZWZpbmUgQVRNX0xNX1JNVF9BQUwJX19BVE1fTE1fTUtSTVQoX19BVE1fTE1fQUFMKQorI2RlZmluZSBBVE1fTE1fUk1UX0FUTQlfX0FUTV9MTV9NS1JNVChfX0FUTV9MTV9BVE0pCisjZGVmaW5lIEFUTV9MTV9STVRfUEhZCV9fQVRNX0xNX01LUk1UKF9fQVRNX0xNX1BIWSkKKyNkZWZpbmUgQVRNX0xNX1JNVF9BTkFMT0cgX19BVE1fTE1fTUtSTVQoX19BVE1fTE1fQU5BTE9HKQorCisvKgorICogTm90ZTogQVRNX0xNX0xPQ18qIGFuZCBBVE1fTE1fUk1UXyogY2FuIGJlIGNvbWJpbmVkLCBwcm92aWRlZCB0aGF0CisgKiBfX0FUTV9MTV9YVExPQyh4KSA8PSBfX0FUTV9MTV9YVFJNVCh4KQorICovCisKKworc3RydWN0IGF0bV9pb2J1ZiB7CisJaW50IGxlbmd0aDsKKwl2b2lkICpidWZmZXI7Cit9OworCisvKiBmb3IgQVRNX0dFVENJUkFOR0UgLyBBVE1fU0VUQ0lSQU5HRSAqLworCisjZGVmaW5lIEFUTV9DSV9NQVggICAgICAtMSAgICAgICAgICAgICAgLyogdXNlIG1heGltdW0gcmFuZ2Ugb2YgVlBJL1ZDSSAqLworIAorc3RydWN0IGF0bV9jaXJhbmdlIHsKKwlzaWduZWQgY2hhcgl2cGlfYml0czsJLyogMS4uOCwgQVRNX0NJX01BWCAoLTEpIGZvciBtYXhpbXVtICovCisJc2lnbmVkIGNoYXIJdmNpX2JpdHM7CS8qIDEuLjE2LCBBVE1fQ0lfTUFYICgtMSkgZm9yIG1heGltdW0gKi8KK307CisKKy8qIGZvciBBVE1fU0VUU0M7IGFjdHVhbGx5IHRha2VuIGZyb20gdGhlIEFUTV9WRiBudW1iZXIgc3BhY2UgKi8KKworI2RlZmluZSBBVE1fU0NfUlgJMTAyNAkJLyogZW5hYmxlIFJYIHNpbmdsZS1jb3B5ICovCisjZGVmaW5lIEFUTV9TQ19UWAkyMDQ4CQkvKiBlbmFibGUgVFggc2luZ2xlLWNvcHkgKi8KKworI2RlZmluZSBBVE1fQkFDS0xPR19ERUZBVUxUIDMyIC8qIGlmIHdlIGdldCBtb3JlLCB3ZSdyZSBsaWtlbHkgdG8gdGltZSBvdXQKKwkJCQkgIGFueXdheSAqLworCisvKiBNRjogY2hhbmdlX3FvcyAoTW9kaWZ5KSBmbGFncyAqLworCisjZGVmaW5lIEFUTV9NRl9JTU1FRAkgMQkvKiBCbG9jayB1bnRpbCBjaGFuZ2UgaXMgZWZmZWN0aXZlICovCisjZGVmaW5lIEFUTV9NRl9JTkNfUlNWCSAyCS8qIENoYW5nZSByZXNlcnZhdGlvbiBvbiBpbmNyZWFzZSAqLworI2RlZmluZSBBVE1fTUZfSU5DX1NIUAkgNAkvKiBDaGFuZ2Ugc2hhcGluZyBvbiBpbmNyZWFzZSAqLworI2RlZmluZSBBVE1fTUZfREVDX1JTVgkgOAkvKiBDaGFuZ2UgcmVzZXJ2YXRpb24gb24gZGVjcmVhc2UgKi8KKyNkZWZpbmUgQVRNX01GX0RFQ19TSFAJMTYJLyogQ2hhbmdlIHNoYXBpbmcgb24gZGVjcmVhc2UgKi8KKyNkZWZpbmUgQVRNX01GX0JXRAkzMgkvKiBTZXQgdGhlIGJhY2t3YXJkIGRpcmVjdGlvbiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgQVRNX01GX1NFVAkoQVRNX01GX0lOQ19SU1YgfCBBVE1fTUZfSU5DX1NIUCB8IEFUTV9NRl9ERUNfUlNWIHwgXAorCQkJICBBVE1fTUZfREVDX1NIUCB8IEFUTV9NRl9CV0QpCisKKy8qCisgKiBBVE1fVlNfKiBhcmUgdXNlZCB0byBleHByZXNzIFZDIHN0YXRlIGluIGEgaHVtYW4tZnJpZW5kbHkgd2F5LgorICovCisKKyNkZWZpbmUgQVRNX1ZTX0lETEUJMAkvKiBWQyBpcyBub3QgdXNlZCAqLworI2RlZmluZSBBVE1fVlNfQ09OTkVDVEVEIDEJLyogVkMgaXMgY29ubmVjdGVkICovCisjZGVmaW5lIEFUTV9WU19DTE9TSU5HCTIJLyogVkMgaXMgY2xvc2luZyAqLworI2RlZmluZSBBVE1fVlNfTElTVEVOCTMJLyogVkMgaXMgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBzZXR1cHMgKi8KKyNkZWZpbmUgQVRNX1ZTX0lOVVNFCTQJLyogVkMgaXMgaW4gdXNlIChyZWdpc3RlcmVkIHdpdGggYXRtc2lnZCkgKi8KKyNkZWZpbmUgQVRNX1ZTX0JPVU5ECTUJLyogVkMgaXMgYm91bmQgKi8KKworI2RlZmluZSBBVE1fVlMyVFhUX01BUCBcCisgICAgIklETEUiLCAiQ09OTkVDVEVEIiwgIkNMT1NJTkciLCAiTElTVEVOIiwgIklOVVNFIiwgIkJPVU5EIgorCisjZGVmaW5lIEFUTV9WRjJUWFRfTUFQIFwKKyAgICAiQUREUiIsCSJSRUFEWSIsCSJQQVJUSUFMIiwJIlJFR0lTIiwgXAorICAgICJSRUxFQVNFRCIsICJIQVNRT1MiLAkiTElTVEVOIiwJIk1FVEEiLCBcCisgICAgIjI1NiIsCSI1MTIiLAkJIjEwMjQiLAkJIjIwNDgiLCBcCisgICAgIlNFU1NJT04iLAkiSEFTU0FQIiwJIkJPVU5EIiwJIkNMT1NFIgorCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F0bWlvYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1pb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y2N2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1pb2MuaApAQCAtMCwwICsxLDQxIEBACisvKiBhdG1pb2MuaCAtIHJhbmdlcyBmb3IgQVRNLXJlbGF0ZWQgaW9jdGwgbnVtYmVycyAqLworIAorLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisvKgorICogU2VlIGh0dHA6Ly9pY2F3d3cxLmVwZmwuY2gvbGludXgtYXRtL21hZ2ljLmh0bWwgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mCisgKiAibWFnaWMiIGlvY3RsIG51bWJlcnMuCisgKi8KKworCisjaWZuZGVmIF9MSU5VWF9BVE1JT0NfSAorI2RlZmluZSBfTElOVVhfQVRNSU9DX0gKKworI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorCQkvKiBldmVyeWJvZHkgaW5jbHVkaW5nIGF0bWlvYy5oIHdpbGwgYWxzbyBuZWVkIF9JT3ssUixXLFdSfSAqLworCisjZGVmaW5lIEFUTUlPQ19QSFlDT00JICAweDAwIC8qIFBIWSBkZXZpY2UgY29tbW9uIGlvY3RscywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lIEFUTUlPQ19QSFlDT01fRU5EIDB4MGYKKyNkZWZpbmUgQVRNSU9DX1BIWVRZUAkgIDB4MTAgLyogUEhZIGRldiB0eXBlIGlvY3RscywgdW5pcXVlIHBlciBQSFkgdHlwZSAqLworI2RlZmluZSBBVE1JT0NfUEhZVFlQX0VORCAweDJmCisjZGVmaW5lIEFUTUlPQ19QSFlQUlYJICAweDMwIC8qIFBIWSBkZXYgcHJpdmF0ZSBpb2N0bHMsIHVuaXF1ZSBwZXIgZHJpdmVyICovCisjZGVmaW5lIEFUTUlPQ19QSFlQUlZfRU5EIDB4NGYKKyNkZWZpbmUgQVRNSU9DX1NBUkNPTQkgIDB4NTAgLyogU0FSIGRldmljZSBjb21tb24gaW9jdGxzLCBnbG9iYWxseSB1bmlxdWUgKi8KKyNkZWZpbmUgQVRNSU9DX1NBUkNPTV9FTkQgMHg1MAorI2RlZmluZSBBVE1JT0NfU0FSUFJWCSAgMHg2MCAvKiBTQVIgZGV2IHByaXZhdGUgaW9jdGxzLCB1bmlxdWUgcGVyIGRyaXZlciAqLworI2RlZmluZSBBVE1JT0NfU0FSUFJWX0VORCAweDdmCisjZGVmaW5lIEFUTUlPQ19JVEYJICAweDgwIC8qIEludGVyZmFjZSBpb2N0bHMsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfSVRGX0VORAkgIDB4OGYKKyNkZWZpbmUgQVRNSU9DX0JBQ0tFTkQJICAweDkwIC8qIEFUTSBnZW5lcmljIGJhY2tlbmQgaW9jdGxzLCB1LiBwZXIgYmFja2VuZCAqLworI2RlZmluZSBBVE1JT0NfQkFDS0VORF9FTkQgMHhhZgorLyogMHhiMC0weGJmOiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBBVE1JT0NfQVJFUVVJUEEJICAweGMwIC8qIEFwcGxpY2F0aW9uIHJlcXVlc3RlZCBJUCBvdmVyIEFUTSwgZ2xvYi4gdS4gKi8KKyNkZWZpbmUgQVRNSU9DX0xBTkUJICAweGQwIC8qIExBTiBFbXVsYXRpb24sIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZSBBVE1JT0NfTVBPQSAgICAgICAweGQ4IC8qIE1QT0EsIGdsb2JhbGx5IHVuaXF1ZSAqLworI2RlZmluZQlBVE1JT0NfQ0xJUAkgIDB4ZTAgLyogQ2xhc3NpY2FsIElQIG92ZXIgQVRNIGNvbnRyb2wsIGdsb2JhbGx5IHUuICovCisjZGVmaW5lCUFUTUlPQ19DTElQX0VORAkgIDB4ZWYKKyNkZWZpbmUJQVRNSU9DX1NQRUNJQUwJICAweGYwIC8qIFNwZWNpYWwtcHVycG9zZSBjb250cm9scywgZ2xvYmFsbHkgdW5pcXVlICovCisjZGVmaW5lCUFUTUlPQ19TUEVDSUFMX0VORCAweGZmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1sZWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1YTFiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbGVjLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIEFUTSBMYW4gRW11bGF0aW9uIERhZW1vbiBkcml2ZXIgaW50ZXJmYWNlCisgKgorICogTWFya28gS2lpc2tpbGEgPG1raWlza2lsYUB5YWhvby5jb20+CisgKi8KKworI2lmbmRlZiBfQVRNTEVDX0hfCisjZGVmaW5lIF9BVE1MRUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKy8qIEFUTSBsZWMgZGFlbW9uIGNvbnRyb2wgc29ja2V0ICovCisjZGVmaW5lIEFUTUxFQ19DVFJMCV9JTygnYScsIEFUTUlPQ19MQU5FKQorI2RlZmluZSBBVE1MRUNfREFUQQlfSU8oJ2EnLCBBVE1JT0NfTEFORSsxKQorI2RlZmluZSBBVE1MRUNfTUNBU1QJX0lPKCdhJywgQVRNSU9DX0xBTkUrMikKKworLyogTWF4aW11bSBudW1iZXIgb2YgTEVDIGludGVyZmFjZXMgKHR3ZWFrYWJsZSkgKi8KKyNkZWZpbmUgTUFYX0xFQ19JVEYgNDgKKworLyoKKyAqIEZyb20gdGhlIHRvdGFsIG9mIE1BWF9MRUNfSVRGLCBsYXN0IE5VTV9UUl9ERVZTIGFyZSByZXNlcnZlZCBmb3IgVG9rZW4gUmluZy4KKyAqIEUuZy4gaWYgTUFYX0xFQ19JVEYgPSA0OCBhbmQgTlVNX1RSX0RFVlMgPSA4LCB0aGVuIGxlYzAtbGVjMzkgYXJlIGZvcgorICogRXRoZXJuZXQgRUxBTnMgYW5kIGxlYzQwLWxlYzQ3IGFyZSBmb3IgVG9rZW4gUmluZyBFTEFOUy4KKyAqLworI2RlZmluZSBOVU1fVFJfREVWUyA4CisKK3R5cGVkZWYgZW51bSB7CisJbF9zZXRfbWFjX2FkZHIsCisJbF9kZWxfbWFjX2FkZHIsCisJbF9zdmNfc2V0dXAsCisJbF9hZGRyX2RlbGV0ZSwKKwlsX3RvcG9sb2d5X2NoYW5nZSwKKwlsX2ZsdXNoX2NvbXBsZXRlLAorCWxfYXJwX3VwZGF0ZSwKKwlsX25hcnBfcmVxLAkJLyogTEFORTIgbWFuZGF0ZXMgdGhlIHVzZSBvZiB0aGlzICovCisJbF9jb25maWcsCisJbF9mbHVzaF90cmFuX2lkLAorCWxfc2V0X2xlY2lkLAorCWxfYXJwX3htdCwKKwlsX3JkZXNjX2FycF94bXQsCisJbF9hc3NvY2lhdGVfcmVxLAorCWxfc2hvdWxkX2JyaWRnZQkJLyogc2hvdWxkIHdlIGJyaWRnZSB0aGlzIE1BQz8gKi8KK30gYXRtbGVjX21zZ190eXBlOworCisjZGVmaW5lIEFUTUxFQ19NU0dfVFlQRV9NQVggbF9zaG91bGRfYnJpZGdlCisKK3N0cnVjdCBhdG1sZWNfY29uZmlnX21zZyB7CisJdW5zaWduZWQgaW50IG1heGltdW1fdW5rbm93bl9mcmFtZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgbWF4X3Vua25vd25fZnJhbWVfdGltZTsKKwl1bnNpZ25lZCBzaG9ydCBtYXhfcmV0cnlfY291bnQ7CisJdW5zaWduZWQgaW50IGFnaW5nX3RpbWU7CisJdW5zaWduZWQgaW50IGZvcndhcmRfZGVsYXlfdGltZTsKKwl1bnNpZ25lZCBpbnQgYXJwX3Jlc3BvbnNlX3RpbWU7CisJdW5zaWduZWQgaW50IGZsdXNoX3RpbWVvdXQ7CisJdW5zaWduZWQgaW50IHBhdGhfc3dpdGNoaW5nX2RlbGF5OworCXVuc2lnbmVkIGludCBsYW5lX3ZlcnNpb247CS8qIExBTkUyOiAxIGZvciBMQU5FdjEsIDIgZm9yIExBTkV2MiAqLworCWludCBtdHU7CisJaW50IGlzX3Byb3h5OworfTsKKworc3RydWN0IGF0bWxlY19tc2cgeworCWF0bWxlY19tc2dfdHlwZSB0eXBlOworCWludCBzaXplb2Z0bHZzOwkJLyogTEFORTI6IGlmICE9IDAsIHRsdnMgZm9sbG93ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgY2hhciBtYWNfYWRkcltFVEhfQUxFTl07CisJCQl1bnNpZ25lZCBjaGFyIGF0bV9hZGRyW0FUTV9FU0FfTEVOXTsKKwkJCXVuc2lnbmVkIGludCBmbGFnOwkvKgorCQkJCQkJICogVG9wb2xvZ3lfY2hhbmdlIGZsYWcsCisJCQkJCQkgKiByZW1vdGVmbGFnLCBwZXJtYW5lbnQgZmxhZywKKwkJCQkJCSAqIGxlY2lkLCB0cmFuc2FjdGlvbiBpZAorCQkJCQkJICovCisJCQl1bnNpZ25lZCBpbnQgdGFyZ2V0bGVzc19sZV9hcnA7CS8qIExBTkUyICovCisJCQl1bnNpZ25lZCBpbnQgbm9fc291cmNlX2xlX25hcnA7CS8qIExBTkUyICovCisJCX0gbm9ybWFsOworCQlzdHJ1Y3QgYXRtbGVjX2NvbmZpZ19tc2cgY29uZmlnOworCQlzdHJ1Y3QgeworCQkJdWludDE2X3QgbGVjX2lkOwkJCS8qIHJlcXVlc3RvciBsZWNfaWQgICovCisJCQl1aW50MzJfdCB0cmFuX2lkOwkJCS8qIHRyYW5zYWN0aW9uIGlkICAgICovCisJCQl1bnNpZ25lZCBjaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsJLyogZHN0IG1hYyBhZGRyICAgICAgKi8KKwkJCXVuc2lnbmVkIGNoYXIgYXRtX2FkZHJbQVRNX0VTQV9MRU5dOwkvKiByZXFlc3RvciBBVE0gYWRkciAqLworCQl9IHByb3h5OwkvKgorCQkJCSAqIEZvciBtYXBwaW5nIExFX0FSUCByZXF1ZXN0cyB0byByZXNwb25zZXMuIEZpbGxlZCBieQorCQkJCSAqIHplcHBlbGluLCByZXR1cm5lZCBieSBrZXJuZWwuIFVzZWQgb25seSB3aGVuIHByb3h5aW5nCisJCQkJICovCisJfSBjb250ZW50OworfSBfX0FUTV9BUElfQUxJR047CisKK3N0cnVjdCBhdG1sZWNfaW9jIHsKKwlpbnQgZGV2X251bTsKKwl1bnNpZ25lZCBjaGFyIGF0bV9hZGRyW0FUTV9FU0FfTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHJlY2VpdmU7CS8qIDE9IHJlY2VpdmUgdmNjLCAwID0gc2VuZCB2Y2MgKi8KK307CisjZW5kaWYgLyogX0FUTUxFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1tcGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExNjUwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtbXBjLmgKQEAgLTAsMCArMSwxMjUgQEAKKyNpZm5kZWYgX0FUTU1QQ19IXworI2RlZmluZSBfQVRNTVBDX0hfCisKKyNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKworI2RlZmluZSBBVE1NUENfQ1RSTCBfSU8oJ2EnLCBBVE1JT0NfTVBPQSkKKyNkZWZpbmUgQVRNTVBDX0RBVEEgX0lPKCdhJywgQVRNSU9DX01QT0ErMSkKKworI2RlZmluZSBNUENfU09DS0VUX0lOR1JFU1MgMQorI2RlZmluZSBNUENfU09DS0VUX0VHUkVTUyAgMgorCitzdHJ1Y3QgYXRtbXBjX2lvYyB7CisgICAgICAgIGludCBkZXZfbnVtOworICAgICAgICBfX2JlMzIgaXBhZGRyOyAgICAgICAgICAgICAgLyogdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNob3J0Y3V0ICAgICovCisgICAgICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgIC8qIGluZ3Jlc3Mgb3IgZWdyZXNzICAgICAgICAgICAgICAgICAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaW5fY3RybF9pbmZvIHsKKyAgICAgICAgdWludDhfdCAgIExhc3RfTkhSUF9DSUVfY29kZTsKKyAgICAgICAgdWludDhfdCAgIExhc3RfUTI5MzFfY2F1c2VfdmFsdWU7ICAgICAKKyAgICAgICAgdWludDhfdCAgIGVnX01QQ19BVE1fYWRkcltBVE1fRVNBX0xFTl07CisgICAgICAgIF9fYmUzMiAgdGFnOworICAgICAgICBfX2JlMzIgIGluX2RzdF9pcDsgICAgICAvKiBJUCBhZGRyZXNzIHRoaXMgaW5ncmVzcyBNUEMgc2VuZHMgcGFja2V0cyB0byAqLworICAgICAgICB1aW50MTZfdCAgaG9sZGluZ190aW1lOworICAgICAgICB1aW50MzJfdCAgcmVxdWVzdF9pZDsKK30gaW5fY3RybF9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBlZ19jdHJsX2luZm8geworICAgICAgICB1aW50OF90ICAgRExMX2hlYWRlclsyNTZdOworICAgICAgICB1aW50OF90ICAgREhfbGVuZ3RoOworICAgICAgICBfX2JlMzIgIGNhY2hlX2lkOworICAgICAgICBfX2JlMzIgIHRhZzsKKyAgICAgICAgX19iZTMyICBtcHNfaXA7CisgICAgICAgIF9fYmUzMiAgZWdfZHN0X2lwOyAgICAgIC8qIElQIGFkZHJlc3MgdG8gd2hpY2ggaW5ncmVzcyBNUEMgc2VuZHMgcGFja2V0cyAqLworICAgICAgICB1aW50OF90ICAgaW5fTVBDX2RhdGFfQVRNX2FkZHJbQVRNX0VTQV9MRU5dOworICAgICAgICB1aW50MTZfdCAgaG9sZGluZ190aW1lOworfSBlZ19jdHJsX2luZm87CisKK3N0cnVjdCBtcGNfcGFyYW1ldGVycyB7CisgICAgICAgIHVpbnQxNl90IG1wY19wMTsgICAvKiBTaG9ydGN1dC1TZXR1cCBGcmFtZSBDb3VudCAgICAqLworICAgICAgICB1aW50MTZfdCBtcGNfcDI7ICAgLyogU2hvcnRjdXQtU2V0dXAgRnJhbWUgVGltZSAgICAgKi8KKyAgICAgICAgdWludDhfdCBtcGNfcDNbOF07IC8qIEZsb3ctZGV0ZWN0aW9uIFByb3RvY29scyAgICAgICovCisgICAgICAgIHVpbnQxNl90IG1wY19wNDsgICAvKiBNUEMgSW5pdGlhbCBSZXRyeSBUaW1lICAgICAgICAqLworICAgICAgICB1aW50MTZfdCBtcGNfcDU7ICAgLyogTVBDIFJldHJ5IFRpbWUgTWF4aW11bSAgICAgICAgKi8KKyAgICAgICAgdWludDE2X3QgbXBjX3A2OyAgIC8qIEhvbGQgRG93biBUaW1lICAgICAgICAgICAgICAgICovICAgICAgCit9IDsKKworc3RydWN0IGtfbWVzc2FnZSB7CisgICAgICAgIHVpbnQxNl90IHR5cGU7CisgICAgICAgIF9fYmUzMiBpcF9tYXNrOworICAgICAgICB1aW50OF90ICBNUFNfY3RybFtBVE1fRVNBX0xFTl07CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBpbl9jdHJsX2luZm8gaW5faW5mbzsKKyAgICAgICAgICAgICAgICBlZ19jdHJsX2luZm8gZWdfaW5mbzsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbXBjX3BhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICB9IGNvbnRlbnQ7CisgICAgICAgIHN0cnVjdCBhdG1fcW9zIHFvczsgICAgICAgCit9IF9fQVRNX0FQSV9BTElHTjsKKworc3RydWN0IGxsY19zbmFwX2hkciB7CisJLyogUkZDIDE0ODMgTExDL1NOQVAgZW5jYXBzdWxhdGlvbiBmb3Igcm91dGVkIElQIFBEVXMgKi8KKyAgICAgICAgdWludDhfdCAgZHNhcDsgICAgLyogRGVzdGluYXRpb24gU2VydmljZSBBY2Nlc3MgUG9pbnQgKDB4QUEpICAgICAqLworICAgICAgICB1aW50OF90ICBzc2FwOyAgICAvKiBTb3VyY2UgU2VydmljZSBBY2Nlc3MgUG9pbnQgICAgICAoMHhBQSkgICAgICovCisgICAgICAgIHVpbnQ4X3QgIHVpOyAgICAgIC8qIFVubnVtYmVyZWQgSW5mb3JtYXRpb24gICAgICAgICAgICgweDAzKSAgICAgKi8KKyAgICAgICAgdWludDhfdCAgb3JnWzNdOyAgLyogT3JnYW5pemF0aW9uYWwgaWRlbnRpZmljYXRpb24gICAgKDB4MDAwMDAwKSAqLworICAgICAgICB1aW50OF90ICB0eXBlWzJdOyAvKiBFdGhlciB0eXBlIChmb3IgSVApICAgICAgICAgICAgICAoMHgwODAwKSAgICovCit9OworCisvKiBUTFZzIHRoaXMgTVBDIHJlY29nbml6ZXMgKi8KKyNkZWZpbmUgVExWX01QT0FfREVWSUNFX1RZUEUgICAgICAgICAweDAwYTAzZTJhICAKKworLyogTVBPQSBkZXZpY2UgdHlwZXMgaW4gTVBPQSBEZXZpY2UgVHlwZSBUTFYgKi8KKyNkZWZpbmUgTk9OX01QT0EgICAgMAorI2RlZmluZSBNUFMgICAgICAgICAxCisjZGVmaW5lIE1QQyAgICAgICAgIDIKKyNkZWZpbmUgTVBTX0FORF9NUEMgMworCisKKy8qIE1QQyBwYXJhbWV0ZXIgZGVmYXVsdHMgKi8KKworI2RlZmluZSBNUENfUDEgMTAgIC8qIFNob3J0Y3V0LVNldHVwIEZyYW1lIENvdW50ICAqLyAKKyNkZWZpbmUgTVBDX1AyIDEgICAvKiBTaG9ydGN1dC1TZXR1cCBGcmFtZSBUaW1lICAgKi8KKyNkZWZpbmUgTVBDX1AzIDAgICAvKiBGbG93LWRldGVjdGlvbiBQcm90b2NvbHMgICAgKi8KKyNkZWZpbmUgTVBDX1A0IDUgICAvKiBNUEMgSW5pdGlhbCBSZXRyeSBUaW1lICAgICAgKi8KKyNkZWZpbmUgTVBDX1A1IDQwICAvKiBNUEMgUmV0cnkgVGltZSBNYXhpbXVtICAgICAgKi8KKyNkZWZpbmUgTVBDX1A2IDE2MCAvKiBIb2xkIERvd24gVGltZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSE9MRElOR19USU1FX0RFRkFVTFQgMTIwMCAvKiBzYW1lIGFzIE1QUy1wNyAqLworCisvKiBNUEMgY29uc3RhbnRzICovCisKKyNkZWZpbmUgTVBDX0MxIDIgICAvKiBSZXRyeSBUaW1lIE11bHRpcGxpZXIgICAgICAgKi8KKyNkZWZpbmUgTVBDX0MyIDYwICAvKiBJbml0aWFsIEtlZXAtQWxpdmUgTGlmZXRpbWUgKi8KKworLyogTWVzc2FnZSB0eXBlcyAtIHRvIE1QT0EgZGFlbW9uICovCisKKyNkZWZpbmUgU05EX01QT0FfUkVTX1JRU1QgICAgMjAxCisjZGVmaW5lIFNFVF9NUFNfQ1RSTF9BRERSICAgIDIwMgorI2RlZmluZSBTTkRfTVBPQV9SRVNfUlRSWSAgICAyMDMgLyogRGlmZmVyZW50IHR5cGUgaW4gYSByZXRyeSBkdWUgdG8gcmVxIGlkICAgICAgICAgKi8KKyNkZWZpbmUgU1RPUF9LRUVQX0FMSVZFX1NNICAgMjA0CisjZGVmaW5lIEVHUkVTU19FTlRSWV9SRU1PVkVEIDIwNQorI2RlZmluZSBTTkRfRUdSRVNTX1BVUkdFICAgICAyMDYKKyNkZWZpbmUgRElFICAgICAgICAgICAgICAgICAgMjA3IC8qIHRlbGwgdGhlIGRhZW1vbiB0byBleGl0KCkgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERBVEFfUExBTkVfUFVSR0UgICAgIDIwOCAvKiBEYXRhIHBsYW5lIHB1cmdlIGJlY2F1c2Ugb2YgZWdyZXNzIGNhY2hlIGhpdCBtaXNzIG9yIGRlYWQgTVBTICovCisjZGVmaW5lIE9QRU5fSU5HUkVTU19TVkMgICAgIDIwOQorCisvKiBNZXNzYWdlIHR5cGVzIC0gZnJvbSBNUE9BIGRhZW1vbiAqLworCisjZGVmaW5lIE1QT0FfVFJJR0dFUl9SQ1ZEICAgICAxMDEKKyNkZWZpbmUgTVBPQV9SRVNfUkVQTFlfUkNWRCAgIDEwMgorI2RlZmluZSBJTkdSRVNTX1BVUkdFX1JDVkQgICAgMTAzCisjZGVmaW5lIEVHUkVTU19QVVJHRV9SQ1ZEICAgICAxMDQKKyNkZWZpbmUgTVBTX0RFQVRIICAgICAgICAgICAgIDEwNQorI2RlZmluZSBDQUNIRV9JTVBPU19SQ1ZEICAgICAgMTA2CisjZGVmaW5lIFNFVF9NUENfQ1RSTF9BRERSICAgICAxMDcgLyogT3VyIE1QQydzIGNvbnRyb2wgQVRNIGFkZHJlc3MgICAqLworI2RlZmluZSBTRVRfTVBTX01BQ19BRERSICAgICAgMTA4CisjZGVmaW5lIENMRUFOX1VQX0FORF9FWElUICAgICAxMDkKKyNkZWZpbmUgU0VUX01QQ19QQVJBTVMgICAgICAgIDExMCAvKiBNUEMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICAgICovCisKKy8qIE1lc3NhZ2UgdHlwZXMgLSBiaWRpcmVjdGlvbmFsICovICAgICAgIAorCisjZGVmaW5lIFJFTE9BRCAgICAgICAgICAgICAgICAzMDEgLyoga2lsbCAtSFVQIHRoZSBkYWVtb24gZm9yIHJlbG9hZCAqLworCisjZW5kaWYgLyogX0FUTU1QQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1wcHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwZGNjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtcHBwLmgKQEAgLTAsMCArMSwyNCBAQAorLyogYXRtcHBwLmggLSBSRkMyMzY0IFBQUG9BVE0gKi8KKworLyogV3JpdHRlbiAyMDAwIGJ5IE1pdGNoZWxsIEJsYW5rIEpyICovCisKKyNpZm5kZWYgX0xJTlVYX0FUTVBQUF9ICisjZGVmaW5lIF9MSU5VWF9BVE1QUFBfSAorCisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisKKyNkZWZpbmUgUFBQT0FUTV9FTkNBUFNfQVVUT0RFVEVDVAkoMCkKKyNkZWZpbmUgUFBQT0FUTV9FTkNBUFNfVkMJCSgxKQorI2RlZmluZSBQUFBPQVRNX0VOQ0FQU19MTEMJCSgyKQorCisvKgorICogVGhpcyBpcyBmb3IgdGhlIEFUTV9TRVRCQUNLRU5EIGNhbGwgLSB0aGVzZSBhcmUgbGlrZSBzb2NrZXQgZmFtaWxpZXM6CisgKiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc3RydWN0dXJlIGlzIHRoZSBiYWNrZW5kIG51bWJlciBhbmQgdGhlIHJlc3QKKyAqIGlzIHBlci1iYWNrZW5kIHNwZWNpZmljCisgKi8KK3N0cnVjdCBhdG1fYmFja2VuZF9wcHAgeworCWF0bV9iYWNrZW5kX3QJYmFja2VuZF9udW07CS8qIEFUTV9CQUNLRU5EX1BQUCAqLworCWludAkJZW5jYXBzOwkJLyogUFBQT0FUTV9FTkNBUFNfKiAqLworfTsKKworI2VuZGlmCS8qIF9MSU5VWF9BVE1QUFBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1zYXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YjEwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc2FwLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIGF0bXNhcC5oIC0gQVRNIFNlcnZpY2UgQWNjZXNzIFBvaW50IGFkZHJlc3NpbmcgZGVmaW5pdGlvbnMgKi8KKworLyogV3JpdHRlbiAxOTk1LTE5OTkgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBFUEZMIExSQy9JQ0EgKi8KKworCisjaWZuZGVmIF9MSU5VWF9BVE1TQVBfSAorI2RlZmluZSBfTElOVVhfQVRNU0FQX0gKKworI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgorCisvKgorICogQkVHSU5feHggYW5kIEVORF94eCBtYXJrZXJzIGFyZSB1c2VkIGZvciBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZgorICogZG9jdW1lbnRhdGlvbi4gRG8gbm90IGNoYW5nZSB0aGVtLgorICovCisKKworLyoKKyAqIExheWVyIDIgcHJvdG9jb2wgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9MMiAqLworI2RlZmluZSBBVE1fTDJfTk9ORQkwCS8qIEwyIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzE3NDUgIDB4MDEJLyogQmFzaWMgbW9kZSBJU08gMTc0NSAqLworI2RlZmluZSBBVE1fTDJfUTI5MQkweDAyCS8qIElUVS1UIFEuMjkxIChSZWMuIEkuNDQxKSAqLworI2RlZmluZSBBVE1fTDJfWDI1X0xMCTB4MDYJLyogSVRVLVQgWC4yNSwgbGluayBsYXllciAqLworI2RlZmluZSBBVE1fTDJfWDI1X01MCTB4MDcJLyogSVRVLVQgWC4yNSwgbXVsdGlsaW5rICovCisjZGVmaW5lIEFUTV9MMl9MQVBCCTB4MDgJLyogRXh0ZW5kZWQgTEFQQiwgaGFsZi1kdXBsZXggKFJlYy4gVC43MSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfQVJNCTB4MDkJLyogSERMQyBBUk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfTlJNCTB4MGEJLyogSERMQyBOUk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0hETENfQUJNCTB4MGIJLyogSERMQyBBQk0gKElTTy9JRUMgNDMzNSkgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzg4MDIJMHgwYwkvKiBMQU4gTExDIChJU08vSUVDIDg4MDIvMikgKi8KKyNkZWZpbmUgQVRNX0wyX1g3NQkweDBkCS8qIElUVS1UIFguNzUsIFNMUCAqLworI2RlZmluZSBBVE1fTDJfUTkyMgkweDBlCS8qIElUVS1UIFEuOTIyICovCisjZGVmaW5lIEFUTV9MMl9VU0VSCTB4MTAJLyogdXNlci1zcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0wyX0lTTzc3NzYJMHgxMQkvKiBJU08gNzc3NiBEVEUtRFRFICovCisvKiBFTkRfTDIgKi8KKworCisvKgorICogTGF5ZXIgMyBwcm90b2NvbCBpZGVudGlmaWVycworICovCisKKy8qIEJFR0lOX0wzICovCisjZGVmaW5lIEFUTV9MM19OT05FCTAJLyogTDMgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fTDNfWDI1CTB4MDYJLyogSVRVLVQgWC4yNSwgcGFja2V0IGxheWVyICovCisjZGVmaW5lIEFUTV9MM19JU084MjA4CTB4MDcJLyogSVNPL0lFQyA4MjA4ICovCisjZGVmaW5lIEFUTV9MM19YMjIzCTB4MDgJLyogSVRVLVQgWC4yMjMgfCBJU08vSUVDIDg4NzggKi8KKyNkZWZpbmUgQVRNX0wzX0lTTzg0NzMJMHgwOQkvKiBJVFUtVCBYLjIzMyB8IElTTy9JRUMgODQ3MyAqLworI2RlZmluZSBBVE1fTDNfVDcwCTB4MGEJLyogSVRVLVQgVC43MCBtaW5pbXVtIG5ldHdvcmsgbGF5ZXIgKi8KKyNkZWZpbmUgQVRNX0wzX1RSOTU3NwkweDBiCS8qIElTTy9JRUMgVFIgOTU3NyAqLworI2RlZmluZSBBVE1fTDNfSDMxMAkweDBjCS8qIElUVS1UIFJlY29tbWVuZGF0aW9uIEguMzEwICovCisjZGVmaW5lIEFUTV9MM19IMzIxCTB4MGQJLyogSVRVLVQgUmVjb21tZW5kYXRpb24gSC4zMjEgKi8KKyNkZWZpbmUgQVRNX0wzX1VTRVIJMHgxMAkvKiB1c2VyLXNwZWNpZmllZCAqLworLyogRU5EX0wzICovCisKKworLyoKKyAqIEhpZ2ggbGF5ZXIgaWRlbnRpZmllcnMKKyAqLworCisvKiBCRUdJTl9ITCAqLworI2RlZmluZSBBVE1fSExfTk9ORQkwCS8qIEhMIG5vdCBzcGVjaWZpZWQgKi8KKyNkZWZpbmUgQVRNX0hMX0lTTwkweDAxCS8qIElTTyAqLworI2RlZmluZSBBVE1fSExfVVNFUgkweDAyCS8qIHVzZXItc3BlY2lmaWMgKi8KKyNkZWZpbmUgQVRNX0hMX0hMUAkweDAzCS8qIGhpZ2ggbGF5ZXIgcHJvZmlsZSAtIFVOSSAzLjAgb25seSAqLworI2RlZmluZSBBVE1fSExfVkVORE9SCTB4MDQJLyogdmVuZG9yLXNwZWNpZmljIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIgKi8KKy8qIEVORF9ITCAqLworCisKKy8qCisgKiBJVFUtVCBjb2RlZCBtb2RlIG9mIG9wZXJhdGlvbgorICovCisKKy8qIEJFR0lOX0lNRCAqLworI2RlZmluZSBBVE1fSU1EX05PTkUJIDAJLyogbW9kZSBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEFUTV9JTURfTk9STUFMCSAxCS8qIG5vcm1hbCBtb2RlIG9mIG9wZXJhdGlvbiAqLworI2RlZmluZSBBVE1fSU1EX0VYVEVOREVEIDIJLyogZXh0ZW5kZWQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKy8qIEVORF9JTUQgKi8KKworLyoKKyAqIEguMzEwIGNvZGUgcG9pbnRzCisgKi8KKworI2RlZmluZSBBVE1fVFRfTk9ORQkwCS8qIHRlcm1pbmFsIHR5cGUgbm90IHNwZWNpZmllZCAqLworI2RlZmluZSBBVE1fVFRfUlgJMQkvKiByZWNlaXZlIG9ubHkgKi8KKyNkZWZpbmUgQVRNX1RUX1RYCTIJLyogc2VuZCBvbmx5ICovCisjZGVmaW5lIEFUTV9UVF9SWFRYCTMJLyogcmVjZWl2ZSBhbmQgc2VuZCAqLworCisjZGVmaW5lIEFUTV9NQ19OT05FCTAJLyogbm8gbXVsdGlwbGV4aW5nICovCisjZGVmaW5lIEFUTV9NQ19UUwkxCS8qIHRyYW5zcG9ydCBzdHJlYW0gKFRTKSAqLworI2RlZmluZSBBVE1fTUNfVFNfRkVDCTIJLyogdHJhbnNwb3J0IHN0cmVhbSB3aXRoIGZvcndhcmQgZXJyb3IgY29yci4gKi8KKyNkZWZpbmUgQVRNX01DX1BTCTMJLyogcHJvZ3JhbSBzdHJlYW0gKFBTKSAqLworI2RlZmluZSBBVE1fTUNfUFNfRkVDCTQJLyogcHJvZ3JhbSBzdHJlYW0gd2l0aCBmb3J3YXJkIGVycm9yIGNvcnIuICovCisjZGVmaW5lIEFUTV9NQ19IMjIxCTUJLyogSVRVLVQgUmVjLiBILjIyMSAqLworCisvKgorICogU0FQIHN0cnVjdHVyZXMKKyAqLworCisjZGVmaW5lIEFUTV9NQVhfSExJCTgJLyogbWF4aW11bSBoaWdoLWxheWVyIGluZm9ybWF0aW9uIGxlbmd0aCAqLworCisKK3N0cnVjdCBhdG1fYmxsaSB7CisgICAgdW5zaWduZWQgY2hhciBsMl9wcm90bzsJLyogbGF5ZXIgMiBwcm90b2NvbCAqLworICAgIHVuaW9uIHsKKwlzdHJ1Y3QgeworCSAgICB1bnNpZ25lZCBjaGFyIG1vZGU7CS8qIG1vZGUgb2Ygb3BlcmF0aW9uIChBVE1fSU1EX3h4eCksIDAgaWYgKi8KKwkJCQkvKiBhYnNlbnQgKi8KKwkgICAgdW5zaWduZWQgY2hhciB3aW5kb3c7IC8qIHdpbmRvdyBzaXplIChrKSwgMS0xMjcgKDAgdG8gb21pdCkgKi8KKwl9IGl0dTsJCQkvKiBJVFUtVCBlbmNvZGluZyAqLworCXVuc2lnbmVkIGNoYXIgdXNlcjsJLyogdXNlci1zcGVjaWZpZWQgbDIgaW5mb3JtYXRpb24gKi8KKyAgICB9IGwyOworICAgIHVuc2lnbmVkIGNoYXIgbDNfcHJvdG87CS8qIGxheWVyIDMgcHJvdG9jb2wgKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdW5zaWduZWQgY2hhciBtb2RlOwkvKiBtb2RlIG9mIG9wZXJhdGlvbiAoQVRNX0lNRF94eHgpLCAwIGlmICovCisJCQkJLyogYWJzZW50ICovCisJICAgIHVuc2lnbmVkIGNoYXIgZGVmX3NpemU7IC8qIGRlZmF1bHQgcGFja2V0IHNpemUgKGxvZzIpLCA0LTEyICgwIHRvICovCisJCQkJICAgIC8qIG9taXQpICovCisJICAgIHVuc2lnbmVkIGNoYXIgd2luZG93Oy8qIHBhY2tldCB3aW5kb3cgc2l6ZSwgMS0xMjcgKDAgdG8gb21pdCkgKi8KKwl9IGl0dTsJCQkvKiBJVFUtVCBlbmNvZGluZyAqLworCXVuc2lnbmVkIGNoYXIgdXNlcjsJLyogdXNlciBzcGVjaWZpZWQgbDMgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgewkJICAgICAgLyogaWYgbDNfcHJvdG8gPSBBVE1fTDNfSDMxMCAqLworCSAgICB1bnNpZ25lZCBjaGFyIHRlcm1fdHlwZTsgIC8qIHRlcm1pbmFsIHR5cGUgKi8KKwkgICAgdW5zaWduZWQgY2hhciBmd19tcHhfY2FwOyAvKiBmb3J3YXJkIG11bHRpcGxleGluZyBjYXBhYmlsaXR5ICovCisJCQkJICAgICAgLyogb25seSBpZiB0ZXJtX3R5cGUgIT0gQVRNX1RUX05PTkUgKi8KKwkgICAgdW5zaWduZWQgY2hhciBid19tcHhfY2FwOyAvKiBiYWNrd2FyZCBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSAqLworCQkJCSAgICAgIC8qIG9ubHkgaWYgdGVybV90eXBlICE9IEFUTV9UVF9OT05FICovCisJfSBoMzEwOworCXN0cnVjdCB7CQkgIC8qIGlmIGwzX3Byb3RvID0gQVRNX0wzX1RSOTU3NyAqLworCSAgICB1bnNpZ25lZCBjaGFyIGlwaTsJICAvKiBpbml0aWFsIHByb3RvY29sIGlkICovCisJICAgIHVuc2lnbmVkIGNoYXIgc25hcFs1XTsvKiBJRUVFIDgwMi4xIFNOQVAgaWRlbnRpZmllciAqLworCQkJCSAgLyogKG9ubHkgaWYgaXBpID09IE5MUElEX0lFRUU4MDJfMV9TTkFQKSAqLworCX0gdHI5NTc3OworICAgIH0gbDM7Cit9IF9fQVRNX0FQSV9BTElHTjsKKworCitzdHJ1Y3QgYXRtX2JobGkgeworICAgIHVuc2lnbmVkIGNoYXIgaGxfdHlwZTsJLyogaGlnaCBsYXllciBpbmZvcm1hdGlvbiB0eXBlICovCisgICAgdW5zaWduZWQgY2hhciBobF9sZW5ndGg7CS8qIGxlbmd0aCAob25seSBpZiBobF90eXBlID09IEFUTV9ITF9VU0VSIHx8ICovCisJCQkJLyogaGxfdHlwZSA9PSBBVE1fSExfSVNPKSAqLworICAgIHVuc2lnbmVkIGNoYXIgaGxfaW5mb1tBVE1fTUFYX0hMSV07LyogaGlnaCBsYXllciBpbmZvcm1hdGlvbiAqLworfTsKKworCisjZGVmaW5lIEFUTV9NQVhfQkxMSQkzCQkvKiBtYXhpbXVtIG51bWJlciBvZiBCTExJIGVsZW1lbnRzICovCisKKworc3RydWN0IGF0bV9zYXAgeworCXN0cnVjdCBhdG1fYmhsaSBiaGxpOwkJLyogbG9jYWwgU0FQLCBoaWdoLWxheWVyIGluZm9ybWF0aW9uICovCisJc3RydWN0IGF0bV9ibGxpIGJsbGlbQVRNX01BWF9CTExJXSBfX0FUTV9BUElfQUxJR047CisJCQkJCS8qIGxvY2FsIFNBUCwgbG93LWxheWVyIGluZm8gKi8KK307CisKKworc3RhdGljIF9faW5saW5lX18gaW50IGJsbGlfaW5fdXNlKHN0cnVjdCBhdG1fYmxsaSBibGxpKQoreworCXJldHVybiBibGxpLmwyX3Byb3RvIHx8IGJsbGkubDNfcHJvdG87Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdG1zdmMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc3ZjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3MTU4MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXRtc3ZjLmgKQEAgLTAsMCArMSw1NSBAQAorLyogYXRtc3ZjLmggLSBBVE0gc2lnbmFsaW5nIGtlcm5lbC1kZW1vbiBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKyNpZm5kZWYgX0xJTlVYX0FUTVNWQ19ICisjZGVmaW5lIF9MSU5VWF9BVE1TVkNfSAorCisjaW5jbHVkZSA8bGludXgvYXRtYXBpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisKKworI2RlZmluZSBBVE1TSUdEX0NUUkwgX0lPKCdhJyxBVE1JT0NfU1BFQ0lBTCkKKwkJCQkvKiBiZWNvbWUgQVRNIHNpZ25hbGluZyBkZW1vbiBjb250cm9sIHNvY2tldCAqLworCitlbnVtIGF0bXN2Y19tc2dfdHlwZSB7IGFzX2NhdGNoX251bGwsIGFzX2JpbmQsIGFzX2Nvbm5lY3QsIGFzX2FjY2VwdCwgYXNfcmVqZWN0LAorCQkgICAgICAgYXNfbGlzdGVuLCBhc19va2F5LCBhc19lcnJvciwgYXNfaW5kaWNhdGUsIGFzX2Nsb3NlLAorCQkgICAgICAgYXNfaXRmX25vdGlmeSwgYXNfbW9kaWZ5LCBhc19pZGVudGlmeSwgYXNfdGVybWluYXRlLAorCQkgICAgICAgYXNfYWRkcGFydHksIGFzX2Ryb3BwYXJ0eSB9OworCitzdHJ1Y3QgYXRtc3ZjX21zZyB7CisJZW51bSBhdG1zdmNfbXNnX3R5cGUgdHlwZTsKKwlhdG1fa3B0cl90IHZjYzsKKwlhdG1fa3B0cl90IGxpc3Rlbl92Y2M7CQkvKiBpbmRpY2F0ZSAqLworCWludCByZXBseTsJCQkvKiBmb3Igb2theSBhbmQgY2xvc2U6CQkgICAqLworCQkJCQkvKiAgIDwgMDogZXJyb3IgYmVmb3JlIGFjdGl2ZQkgICAqLworCQkJCQkvKiAgICAgICAgKHNpZ2QgaGFzIGRpc2NhcmRlZCBjdHgpICovCisJCQkJCS8qICAgPT0wOiBzdWNjZXNzCQkgICAqLworCQkJCSAgICAgICAgLyogICA+IDA6IGVycm9yIHdoZW4gYWN0aXZlIChzdGlsbCAqLworCQkJCQkvKiAgICAgICAgbmVlZCB0byBjbG9zZSkJICAgKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtcHZjIHB2YzsJLyogaW5kaWNhdGUsIG9rYXkgKGNvbm5lY3QpICovCisJc3RydWN0IHNvY2thZGRyX2F0bXN2YyBsb2NhbDsJLyogbG9jYWwgU1ZDIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYXRtX3FvcyBxb3M7CQkvKiBRT1MgcGFyYW1ldGVycyAqLworCXN0cnVjdCBhdG1fc2FwIHNhcDsJCS8qIFNBUCAqLworCXVuc2lnbmVkIGludCBzZXNzaW9uOwkJLyogZm9yIHAycG0gKi8KKwlzdHJ1Y3Qgc29ja2FkZHJfYXRtc3ZjIHN2YzsJLyogU1ZDIGFkZHJlc3MgKi8KK30gX19BVE1fQVBJX0FMSUdOOworCisvKgorICogTWVzc2FnZSBjb250ZW50czogc2VlIGZ0cDovL2ljYWZ0cC5lcGZsLmNoL3B1Yi9saW51eC9hdG0vZG9jcy9pc3AtKi50YXIuZ3oKKyAqLworCisvKgorICogU29tZSBwb2xpY3kgc3R1ZmYgZm9yIGF0bXNpZ2QgYW5kIGZvciBuZXQvYXRtL3N2Yy5jLiBCb3RoIGhhdmUgdG8gYWdyZWUgb24KKyAqIHdoYXQgUENSIGlzIHVzZWQgdG8gcmVxdWVzdCBiYW5kd2lkdGggZnJvbSB0aGUgZGV2aWNlIGRyaXZlci4gbmV0L2F0bS9zdmMuYworICogdHJpZXMgdG8gZG8gYmV0dGVyIHRoYW4gdGhhdCwgYnV0IG9ubHkgaWYgdGhlcmUncyBubyByb3V0aW5nIGRlY2lzaW9uIChpLmUuCisgKiBpZiBzaWduYWxpbmcgb25seSB1c2VzIG9uZSBBVE0gaW50ZXJmYWNlKS4KKyAqLworCisjZGVmaW5lIFNFTEVDVF9UT1BfUENSKHRwKSAoKHRwKS5wY3IgPyAodHApLnBjciA6IFwKKyAgKHRwKS5tYXhfcGNyICYmICh0cCkubWF4X3BjciAhPSBBVE1fTUFYX1BDUiA/ICh0cCkubWF4X3BjciA6IFwKKyAgKHRwKS5taW5fcGNyID8gKHRwKS5taW5fcGNyIDogQVRNX01BWF9QQ1IpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWRpdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTllYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKQEAgLTAsMCArMSwzNDYgQEAKKy8qIGF1ZGl0LmggLS0gQXVkaXRpbmcgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDQgUmVkIEhhdCBJbmMuLCBEdXJoYW0sIE5vcnRoIENhcm9saW5hLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogV3JpdHRlbiBieSBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEByZWRoYXQuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9BVURJVF9IXworI2RlZmluZSBfTElOVVhfQVVESVRfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLWVtLmg+CisKKy8qIFRoZSBuZXRsaW5rIG1lc3NhZ2VzIGZvciB0aGUgYXVkaXQgc3lzdGVtIGlzIGRpdmlkZWQgaW50byBibG9ja3M6CisgKiAxMDAwIC0gMTA5OSBhcmUgZm9yIGNvbW1hbmRpbmcgdGhlIGF1ZGl0IHN5c3RlbQorICogMTEwMCAtIDExOTkgdXNlciBzcGFjZSB0cnVzdGVkIGFwcGxpY2F0aW9uIG1lc3NhZ2VzCisgKiAxMjAwIC0gMTI5OSBtZXNzYWdlcyBpbnRlcm5hbCB0byB0aGUgYXVkaXQgZGFlbW9uCisgKiAxMzAwIC0gMTM5OSBhdWRpdCBldmVudCBtZXNzYWdlcworICogMTQwMCAtIDE0OTkgU0UgTGludXggdXNlCisgKiAxNTAwIC0gMTU5OSBBcHBBcm1vciB1c2UKKyAqIDE2MDAgLSAxNjk5IGtlcm5lbCBjcnlwdG8gZXZlbnRzCisgKiAxNzAwIC0gMTc5OSBrZXJuZWwgYW5vbWFseSByZWNvcmRzCisgKiAxODAwIC0gMTk5OSBmdXR1cmUga2VybmVsIHVzZSAobWF5YmUgaW50ZWdyaXR5IGxhYmVscyBhbmQgcmVsYXRlZCBldmVudHMpCisgKiAyMDAwIGlzIGZvciBvdGhlcndpc2UgdW5jbGFzc2lmaWVkIGtlcm5lbCBhdWRpdCBtZXNzYWdlcyAobGVnYWN5KQorICogMjAwMSAtIDIwOTkgdW51c2VkIChrZXJuZWwpCisgKiAyMTAwIC0gMjE5OSB1c2VyIHNwYWNlIGFub21hbHkgcmVjb3JkcworICogMjIwMCAtIDIyOTkgdXNlciBzcGFjZSBhY3Rpb25zIHRha2VuIGluIHJlc3BvbnNlIHRvIGFub21hbGllcworICogMjMwMCAtIDIzOTkgdXNlciBzcGFjZSBnZW5lcmF0ZWQgTFNQUCBldmVudHMKKyAqIDI0MDAgLSAyNDk5IHVzZXIgc3BhY2UgY3J5cHRvIGV2ZW50cworICogMjUwMCAtIDI5OTkgZnV0dXJlIHVzZXIgc3BhY2UgKG1heWJlIGludGVncml0eSBsYWJlbHMgYW5kIHJlbGF0ZWQgZXZlbnRzKQorICoKKyAqIE1lc3NhZ2VzIGZyb20gMTAwMC0xMTk5IGFyZSBiaS1kaXJlY3Rpb25hbC4gMTIwMC0xMjk5ICYgMjEwMCAtIDI5OTkgYXJlCisgKiBleGNsdXNpdmVseSB1c2VyIHNwYWNlLiAxMzAwLTIwOTkgaXMga2VybmVsIC0tPiB1c2VyIHNwYWNlIAorICogY29tbXVuaWNhdGlvbi4KKyAqLworI2RlZmluZSBBVURJVF9HRVQJCTEwMDAJLyogR2V0IHN0YXR1cyAqLworI2RlZmluZSBBVURJVF9TRVQJCTEwMDEJLyogU2V0IHN0YXR1cyAoZW5hYmxlL2Rpc2FibGUvYXVkaXRkKSAqLworI2RlZmluZSBBVURJVF9MSVNUCQkxMDAyCS8qIExpc3Qgc3lzY2FsbCBydWxlcyAtLSBkZXByZWNhdGVkICovCisjZGVmaW5lIEFVRElUX0FERAkJMTAwMwkvKiBBZGQgc3lzY2FsbCBydWxlIC0tIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgQVVESVRfREVMCQkxMDA0CS8qIERlbGV0ZSBzeXNjYWxsIHJ1bGUgLS0gZGVwcmVjYXRlZCAqLworI2RlZmluZSBBVURJVF9VU0VSCQkxMDA1CS8qIE1lc3NhZ2UgZnJvbSB1c2Vyc3BhY2UgLS0gZGVwcmVjYXRlZCAqLworI2RlZmluZSBBVURJVF9MT0dJTgkJMTAwNgkvKiBEZWZpbmUgdGhlIGxvZ2luIGlkIGFuZCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBBVURJVF9XQVRDSF9JTlMJCTEwMDcJLyogSW5zZXJ0IGZpbGUvZGlyIHdhdGNoIGVudHJ5ICovCisjZGVmaW5lIEFVRElUX1dBVENIX1JFTQkJMTAwOAkvKiBSZW1vdmUgZmlsZS9kaXIgd2F0Y2ggZW50cnkgKi8KKyNkZWZpbmUgQVVESVRfV0FUQ0hfTElTVAkxMDA5CS8qIExpc3QgYWxsIGZpbGUvZGlyIHdhdGNoZXMgKi8KKyNkZWZpbmUgQVVESVRfU0lHTkFMX0lORk8JMTAxMAkvKiBHZXQgaW5mbyBhYm91dCBzZW5kZXIgb2Ygc2lnbmFsIHRvIGF1ZGl0ZCAqLworI2RlZmluZSBBVURJVF9BRERfUlVMRQkJMTAxMQkvKiBBZGQgc3lzY2FsbCBmaWx0ZXJpbmcgcnVsZSAqLworI2RlZmluZSBBVURJVF9ERUxfUlVMRQkJMTAxMgkvKiBEZWxldGUgc3lzY2FsbCBmaWx0ZXJpbmcgcnVsZSAqLworI2RlZmluZSBBVURJVF9MSVNUX1JVTEVTCTEwMTMJLyogTGlzdCBzeXNjYWxsIGZpbHRlcmluZyBydWxlcyAqLworI2RlZmluZSBBVURJVF9UUklNCQkxMDE0CS8qIFRyaW0ganVuayBmcm9tIHdhdGNoZWQgdHJlZSAqLworI2RlZmluZSBBVURJVF9NQUtFX0VRVUlWCTEwMTUJLyogQXBwZW5kIHRvIHdhdGNoZWQgdHJlZSAqLworI2RlZmluZSBBVURJVF9UVFlfR0VUCQkxMDE2CS8qIEdldCBUVFkgYXVkaXRpbmcgc3RhdHVzICovCisjZGVmaW5lIEFVRElUX1RUWV9TRVQJCTEwMTcJLyogU2V0IFRUWSBhdWRpdGluZyBzdGF0dXMgKi8KKworI2RlZmluZSBBVURJVF9GSVJTVF9VU0VSX01TRwkxMTAwCS8qIFVzZXJzcGFjZSBtZXNzYWdlcyBtb3N0bHkgdW5pbnRlcmVzdGluZyB0byBrZXJuZWwgKi8KKyNkZWZpbmUgQVVESVRfVVNFUl9BVkMJCTExMDcJLyogV2UgZmlsdGVyIHRoaXMgZGlmZmVyZW50bHkgKi8KKyNkZWZpbmUgQVVESVRfVVNFUl9UVFkJCTExMjQJLyogTm9uLUlDQU5PTiBUVFkgaW5wdXQgbWVhbmluZyAqLworI2RlZmluZSBBVURJVF9MQVNUX1VTRVJfTVNHCTExOTkKKyNkZWZpbmUgQVVESVRfRklSU1RfVVNFUl9NU0cyCTIxMDAJLyogTW9yZSB1c2VyIHNwYWNlIG1lc3NhZ2VzICovCisjZGVmaW5lIEFVRElUX0xBU1RfVVNFUl9NU0cyCTI5OTkKKyAKKyNkZWZpbmUgQVVESVRfREFFTU9OX1NUQVJUICAgICAgMTIwMCAgICAvKiBEYWVtb24gc3RhcnR1cCByZWNvcmQgKi8KKyNkZWZpbmUgQVVESVRfREFFTU9OX0VORCAgICAgICAgMTIwMSAgICAvKiBEYWVtb24gbm9ybWFsIHN0b3AgcmVjb3JkICovCisjZGVmaW5lIEFVRElUX0RBRU1PTl9BQk9SVCAgICAgIDEyMDIgICAgLyogRGFlbW9uIGVycm9yIHN0b3AgcmVjb3JkICovCisjZGVmaW5lIEFVRElUX0RBRU1PTl9DT05GSUcgICAgIDEyMDMgICAgLyogRGFlbW9uIGNvbmZpZyBjaGFuZ2UgKi8KKworI2RlZmluZSBBVURJVF9TWVNDQUxMCQkxMzAwCS8qIFN5c2NhbGwgZXZlbnQgKi8KKy8qICNkZWZpbmUgQVVESVRfRlNfV0FUQ0gJMTMwMQkgKiBEZXByZWNhdGVkICovCisjZGVmaW5lIEFVRElUX1BBVEgJCTEzMDIJLyogRmlsZW5hbWUgcGF0aCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBBVURJVF9JUEMJCTEzMDMJLyogSVBDIHJlY29yZCAqLworI2RlZmluZSBBVURJVF9TT0NLRVRDQUxMCTEzMDQJLyogc3lzX3NvY2tldGNhbGwgYXJndW1lbnRzICovCisjZGVmaW5lIEFVRElUX0NPTkZJR19DSEFOR0UJMTMwNQkvKiBBdWRpdCBzeXN0ZW0gY29uZmlndXJhdGlvbiBjaGFuZ2UgKi8KKyNkZWZpbmUgQVVESVRfU09DS0FERFIJCTEzMDYJLyogc29ja2FkZHIgY29waWVkIGFzIHN5c2NhbGwgYXJnICovCisjZGVmaW5lIEFVRElUX0NXRAkJMTMwNwkvKiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICovCisjZGVmaW5lIEFVRElUX0VYRUNWRQkJMTMwOQkvKiBleGVjdmUgYXJndW1lbnRzICovCisjZGVmaW5lIEFVRElUX0lQQ19TRVRfUEVSTQkxMzExCS8qIElQQyBuZXcgcGVybWlzc2lvbnMgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfTVFfT1BFTgkJMTMxMgkvKiBQT1NJWCBNUSBvcGVuIHJlY29yZCB0eXBlICovCisjZGVmaW5lIEFVRElUX01RX1NFTkRSRUNWCTEzMTMJLyogUE9TSVggTVEgc2VuZC9yZWNlaXZlIHJlY29yZCB0eXBlICovCisjZGVmaW5lIEFVRElUX01RX05PVElGWQkJMTMxNAkvKiBQT1NJWCBNUSBub3RpZnkgcmVjb3JkIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfTVFfR0VUU0VUQVRUUgkxMzE1CS8qIFBPU0lYIE1RIGdldC9zZXQgYXR0cmlidXRlIHJlY29yZCB0eXBlICovCisjZGVmaW5lIEFVRElUX0tFUk5FTF9PVEhFUgkxMzE2CS8qIEZvciB1c2UgYnkgM3JkIHBhcnR5IG1vZHVsZXMgKi8KKyNkZWZpbmUgQVVESVRfRkRfUEFJUgkJMTMxNyAgICAvKiBhdWRpdCByZWNvcmQgZm9yIHBpcGUvc29ja2V0cGFpciAqLworI2RlZmluZSBBVURJVF9PQkpfUElECQkxMzE4CS8qIHB0cmFjZSB0YXJnZXQgKi8KKyNkZWZpbmUgQVVESVRfVFRZCQkxMzE5CS8qIElucHV0IG9uIGFuIGFkbWluaXN0cmF0aXZlIFRUWSAqLworCisjZGVmaW5lIEFVRElUX0FWQwkJMTQwMAkvKiBTRSBMaW51eCBhdmMgZGVuaWFsIG9yIGdyYW50ICovCisjZGVmaW5lIEFVRElUX1NFTElOVVhfRVJSCTE0MDEJLyogSW50ZXJuYWwgU0UgTGludXggRXJyb3JzICovCisjZGVmaW5lIEFVRElUX0FWQ19QQVRICQkxNDAyCS8qIGRlbnRyeSwgdmZzbW91bnQgcGFpciBmcm9tIGF2YyAqLworI2RlZmluZSBBVURJVF9NQUNfUE9MSUNZX0xPQUQJMTQwMwkvKiBQb2xpY3kgZmlsZSBsb2FkICovCisjZGVmaW5lIEFVRElUX01BQ19TVEFUVVMJMTQwNAkvKiBDaGFuZ2VkIGVuZm9yY2luZyxwZXJtaXNzaXZlLG9mZiAqLworI2RlZmluZSBBVURJVF9NQUNfQ09ORklHX0NIQU5HRQkxNDA1CS8qIENoYW5nZXMgdG8gYm9vbGVhbnMgKi8KKyNkZWZpbmUgQVVESVRfTUFDX1VOTEJMX0FMTE9XCTE0MDYJLyogTmV0TGFiZWw6IGFsbG93IHVubGFiZWxlZCB0cmFmZmljICovCisjZGVmaW5lIEFVRElUX01BQ19DSVBTT1Y0X0FERAkxNDA3CS8qIE5ldExhYmVsOiBhZGQgQ0lQU092NCBET0kgZW50cnkgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0NJUFNPVjRfREVMCTE0MDgJLyogTmV0TGFiZWw6IGRlbCBDSVBTT3Y0IERPSSBlbnRyeSAqLworI2RlZmluZSBBVURJVF9NQUNfTUFQX0FERAkxNDA5CS8qIE5ldExhYmVsOiBhZGQgTFNNIGRvbWFpbiBtYXBwaW5nICovCisjZGVmaW5lIEFVRElUX01BQ19NQVBfREVMCTE0MTAJLyogTmV0TGFiZWw6IGRlbCBMU00gZG9tYWluIG1hcHBpbmcgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0FERFNBCTE0MTEJLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0RFTFNBCTE0MTIJLyogTm90IHVzZWQgICovCisjZGVmaW5lIEFVRElUX01BQ19JUFNFQ19BRERTUEQJMTQxMwkvKiBOb3QgdXNlZCAqLworI2RlZmluZSBBVURJVF9NQUNfSVBTRUNfREVMU1BECTE0MTQJLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgQVVESVRfTUFDX0lQU0VDX0VWRU5UCTE0MTUJLyogQXVkaXQgYW4gSVBTZWMgZXZlbnQgKi8KKworI2RlZmluZSBBVURJVF9BUFBBUk1PUl9BVURJVAkxNTAxCS8qIEFwcEFybW9yIGF1ZGl0ZWQgZ3JhbnRzICovCisjZGVmaW5lIEFVRElUX0FQUEFSTU9SX0FMTE9XRUQJMTUwMgkvKiBBbGxvd2VkIEFjY2VzcyBmb3IgbGVhcm5pbmcgKi8KKyNkZWZpbmUgQVVESVRfQVBQQVJNT1JfREVOSUVECTE1MDMKKyNkZWZpbmUgQVVESVRfQVBQQVJNT1JfSElOVAkxNTA0CS8qIFByb2Nlc3MgVHJhY2tpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQVVESVRfQVBQQVJNT1JfU1RBVFVTCTE1MDUJLyogQ2hhbmdlcyBpbiBjb25maWcgKi8KKyNkZWZpbmUgQVVESVRfQVBQQVJNT1JfRVJST1IJMTUwNgkvKiBJbnRlcm5hbCBBcHBBcm1vciBFcnJvcnMgKi8KKworI2RlZmluZSBBVURJVF9GSVJTVF9LRVJOX0FOT01fTVNHICAgMTcwMAorI2RlZmluZSBBVURJVF9MQVNUX0tFUk5fQU5PTV9NU0cgICAgMTc5OQorI2RlZmluZSBBVURJVF9BTk9NX1BST01JU0NVT1VTICAgICAgMTcwMCAvKiBEZXZpY2UgY2hhbmdlZCBwcm9taXNjdW91cyBtb2RlICovCisjZGVmaW5lIEFVRElUX0FOT01fQUJFTkQgICAgICAgICAgICAxNzAxIC8qIFByb2Nlc3MgZW5kZWQgYWJub3JtYWxseSAqLworCisjZGVmaW5lIEFVRElUX1NECQkxNTAwCS8qIEFwcEFybW9yIChTdWJEb21haW4pIGF1ZGl0ICovCisKKyNkZWZpbmUgQVVESVRfS0VSTkVMCQkyMDAwCS8qIEFzeW5jaHJvbm91cyBhdWRpdCByZWNvcmQuIE5PVCBBIFJFUVVFU1QuICovCisKKy8qIFJ1bGUgZmxhZ3MgKi8KKyNkZWZpbmUgQVVESVRfRklMVEVSX1VTRVIJMHgwMAkvKiBBcHBseSBydWxlIHRvIHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzICovCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9UQVNLCTB4MDEJLyogQXBwbHkgcnVsZSBhdCB0YXNrIGNyZWF0aW9uIChub3Qgc3lzY2FsbCkgKi8KKyNkZWZpbmUgQVVESVRfRklMVEVSX0VOVFJZCTB4MDIJLyogQXBwbHkgcnVsZSBhdCBzeXNjYWxsIGVudHJ5ICovCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9XQVRDSAkweDAzCS8qIEFwcGx5IHJ1bGUgdG8gZmlsZSBzeXN0ZW0gd2F0Y2hlcyAqLworI2RlZmluZSBBVURJVF9GSUxURVJfRVhJVAkweDA0CS8qIEFwcGx5IHJ1bGUgYXQgc3lzY2FsbCBleGl0ICovCisjZGVmaW5lIEFVRElUX0ZJTFRFUl9UWVBFCTB4MDUJLyogQXBwbHkgcnVsZSBhdCBhdWRpdF9sb2dfc3RhcnQgKi8KKworI2RlZmluZSBBVURJVF9OUl9GSUxURVJTCTYKKworI2RlZmluZSBBVURJVF9GSUxURVJfUFJFUEVORAkweDEwCS8qIFByZXBlbmQgdG8gZnJvbnQgb2YgbGlzdCAqLworCisvKiBSdWxlIGFjdGlvbnMgKi8KKyNkZWZpbmUgQVVESVRfTkVWRVIgICAgMAkvKiBEbyBub3QgYnVpbGQgY29udGV4dCBpZiBydWxlIG1hdGNoZXMgKi8KKyNkZWZpbmUgQVVESVRfUE9TU0lCTEUgMQkvKiBCdWlsZCBjb250ZXh0IGlmIHJ1bGUgbWF0Y2hlcyAgKi8KKyNkZWZpbmUgQVVESVRfQUxXQVlTICAgMgkvKiBHZW5lcmF0ZSBhdWRpdCByZWNvcmQgaWYgcnVsZSBtYXRjaGVzICovCisKKy8qIFJ1bGUgc3RydWN0dXJlIHNpemVzIC0tIGlmIHRoZXNlIGNoYW5nZSwgZGlmZmVyZW50IEFVRElUX0FERCBhbmQKKyAqIEFVRElUX0xJU1QgY29tbWFuZHMgbXVzdCBiZSBpbXBsZW1lbnRlZC4gKi8KKyNkZWZpbmUgQVVESVRfTUFYX0ZJRUxEUyAgIDY0CisjZGVmaW5lIEFVRElUX01BWF9LRVlfTEVOICAzMgorI2RlZmluZSBBVURJVF9CSVRNQVNLX1NJWkUgNjQKKyNkZWZpbmUgQVVESVRfV09SRChucikgKChfX3UzMikoKG5yKS8zMikpCisjZGVmaW5lIEFVRElUX0JJVChucikgICgxIDw8ICgobnIpIC0gQVVESVRfV09SRChucikqMzIpKQorCisjZGVmaW5lIEFVRElUX1NZU0NBTExfQ0xBU1NFUyAxNgorI2RlZmluZSBBVURJVF9DTEFTU19ESVJfV1JJVEUgMAorI2RlZmluZSBBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIgMQorI2RlZmluZSBBVURJVF9DTEFTU19DSEFUVFIgMgorI2RlZmluZSBBVURJVF9DTEFTU19DSEFUVFJfMzIgMworI2RlZmluZSBBVURJVF9DTEFTU19SRUFEIDQKKyNkZWZpbmUgQVVESVRfQ0xBU1NfUkVBRF8zMiA1CisjZGVmaW5lIEFVRElUX0NMQVNTX1dSSVRFIDYKKyNkZWZpbmUgQVVESVRfQ0xBU1NfV1JJVEVfMzIgNworI2RlZmluZSBBVURJVF9DTEFTU19TSUdOQUwgOAorI2RlZmluZSBBVURJVF9DTEFTU19TSUdOQUxfMzIgOQorCisvKiBUaGlzIGJpdG1hc2sgaXMgdXNlZCB0byB2YWxpZGF0ZSB1c2VyIGlucHV0LiAgSXQgcmVwcmVzZW50cyBhbGwgYml0cyB0aGF0CisgKiBhcmUgY3VycmVudGx5IHVzZWQgaW4gYW4gYXVkaXQgZmllbGQgY29uc3RhbnQgdW5kZXJzdG9vZCBieSB0aGUga2VybmVsLgorICogSWYgeW91IGFyZSBhZGRpbmcgYSBuZXcgI2RlZmluZSBBVURJVF88d2hhdGV2ZXI+LCBwbGVhc2UgZW5zdXJlIHRoYXQKKyAqIEFVRElUX1VOVVNFRF9CSVRTIGlzIHVwZGF0ZWQgaWYgbmVlZCBiZS4gKi8KKyNkZWZpbmUgQVVESVRfVU5VU0VEX0JJVFMJMHgwN0ZGRkMwMAorCisKKy8qIFJ1bGUgZmllbGRzICovCisJCQkJLyogVGhlc2UgYXJlIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZQorCQkJCSAqIHRhc2sgc3RydWN0dXJlIGF0IHRhc2sgY3JlYXRpb24gdGltZQorCQkJCSAqIChBVURJVF9QRVJfVEFTSykuICAqLworI2RlZmluZSBBVURJVF9QSUQJMAorI2RlZmluZSBBVURJVF9VSUQJMQorI2RlZmluZSBBVURJVF9FVUlECTIKKyNkZWZpbmUgQVVESVRfU1VJRAkzCisjZGVmaW5lIEFVRElUX0ZTVUlECTQKKyNkZWZpbmUgQVVESVRfR0lECTUKKyNkZWZpbmUgQVVESVRfRUdJRAk2CisjZGVmaW5lIEFVRElUX1NHSUQJNworI2RlZmluZSBBVURJVF9GU0dJRAk4CisjZGVmaW5lIEFVRElUX0xPR0lOVUlECTkKKyNkZWZpbmUgQVVESVRfUEVSUwkxMAorI2RlZmluZSBBVURJVF9BUkNICTExCisjZGVmaW5lIEFVRElUX01TR1RZUEUJMTIKKyNkZWZpbmUgQVVESVRfU1VCSl9VU0VSCTEzCS8qIHNlY3VyaXR5IGxhYmVsIHVzZXIgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9ST0xFCTE0CS8qIHNlY3VyaXR5IGxhYmVsIHJvbGUgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9UWVBFCTE1CS8qIHNlY3VyaXR5IGxhYmVsIHR5cGUgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9TRU4JMTYJLyogc2VjdXJpdHkgbGFiZWwgc2Vuc2l0aXZpdHkgbGFiZWwgKi8KKyNkZWZpbmUgQVVESVRfU1VCSl9DTFIJMTcJLyogc2VjdXJpdHkgbGFiZWwgY2xlYXJhbmNlIGxhYmVsICovCisjZGVmaW5lIEFVRElUX1BQSUQJMTgKKyNkZWZpbmUgQVVESVRfT0JKX1VTRVIJMTkKKyNkZWZpbmUgQVVESVRfT0JKX1JPTEUJMjAKKyNkZWZpbmUgQVVESVRfT0JKX1RZUEUJMjEKKyNkZWZpbmUgQVVESVRfT0JKX0xFVl9MT1cJMjIKKyNkZWZpbmUgQVVESVRfT0JKX0xFVl9ISUdICTIzCisKKwkJCQkvKiBUaGVzZSBhcmUgT05MWSB1c2VmdWwgd2hlbiBjaGVja2luZworCQkJCSAqIGF0IHN5c2NhbGwgZXhpdCB0aW1lIChBVURJVF9BVF9FWElUKS4gKi8KKyNkZWZpbmUgQVVESVRfREVWTUFKT1IJMTAwCisjZGVmaW5lIEFVRElUX0RFVk1JTk9SCTEwMQorI2RlZmluZSBBVURJVF9JTk9ERQkxMDIKKyNkZWZpbmUgQVVESVRfRVhJVAkxMDMKKyNkZWZpbmUgQVVESVRfU1VDQ0VTUyAgIDEwNAkvKiBleGl0ID49IDA7IHZhbHVlIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVVESVRfV0FUQ0gJMTA1CisjZGVmaW5lIEFVRElUX1BFUk0JMTA2CisjZGVmaW5lIEFVRElUX0RJUgkxMDcKKworI2RlZmluZSBBVURJVF9BUkcwICAgICAgMjAwCisjZGVmaW5lIEFVRElUX0FSRzEgICAgICAoQVVESVRfQVJHMCsxKQorI2RlZmluZSBBVURJVF9BUkcyICAgICAgKEFVRElUX0FSRzArMikKKyNkZWZpbmUgQVVESVRfQVJHMyAgICAgIChBVURJVF9BUkcwKzMpCisKKyNkZWZpbmUgQVVESVRfRklMVEVSS0VZCTIxMAorCisjZGVmaW5lIEFVRElUX05FR0FURQkJCTB4ODAwMDAwMDAKKworLyogVGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgb3BlcmF0b3JzLgorICoJNCAgMiAgMSAgOAorICoJPSAgPiAgPCAgPworICoJLS0tLS0tLS0tLQorICoJMCAgMCAgMAkgMAkwMAlub25zZW5zZQorICoJMCAgMCAgMAkgMQkwOAkmICBiaXQgbWFzaworICoJMCAgMCAgMQkgMAkxMAk8CisgKgkwICAxICAwCSAwCTIwCT4KKyAqCTAgIDEgIDEJIDAJMzAJIT0KKyAqCTEgIDAgIDAJIDAJNDAJPQorICoJMSAgMCAgMAkgMQk0OAkmPSAgYml0IHRlc3QKKyAqCTEgIDAgIDEJIDAJNTAJPD0KKyAqCTEgIDEgIDAJIDAJNjAJPj0KKyAqCTEgIDEgIDEJIDEJNzgJYWxsIG9wZXJhdG9ycworICovCisjZGVmaW5lIEFVRElUX0JJVF9NQVNLCQkJMHgwODAwMDAwMAorI2RlZmluZSBBVURJVF9MRVNTX1RIQU4JCQkweDEwMDAwMDAwCisjZGVmaW5lIEFVRElUX0dSRUFURVJfVEhBTgkJMHgyMDAwMDAwMAorI2RlZmluZSBBVURJVF9OT1RfRVFVQUwJCQkweDMwMDAwMDAwCisjZGVmaW5lIEFVRElUX0VRVUFMCQkJMHg0MDAwMDAwMAorI2RlZmluZSBBVURJVF9CSVRfVEVTVAkJCShBVURJVF9CSVRfTUFTS3xBVURJVF9FUVVBTCkKKyNkZWZpbmUgQVVESVRfTEVTU19USEFOX09SX0VRVUFMCShBVURJVF9MRVNTX1RIQU58QVVESVRfRVFVQUwpCisjZGVmaW5lIEFVRElUX0dSRUFURVJfVEhBTl9PUl9FUVVBTAkoQVVESVRfR1JFQVRFUl9USEFOfEFVRElUX0VRVUFMKQorI2RlZmluZSBBVURJVF9PUEVSQVRPUlMJCQkoQVVESVRfRVFVQUx8QVVESVRfTk9UX0VRVUFMfEFVRElUX0JJVF9NQVNLKQorCisvKiBTdGF0dXMgc3ltYm9scyAqLworCQkJCS8qIE1hc2sgdmFsdWVzICovCisjZGVmaW5lIEFVRElUX1NUQVRVU19FTkFCTEVECQkweDAwMDEKKyNkZWZpbmUgQVVESVRfU1RBVFVTX0ZBSUxVUkUJCTB4MDAwMgorI2RlZmluZSBBVURJVF9TVEFUVVNfUElECQkweDAwMDQKKyNkZWZpbmUgQVVESVRfU1RBVFVTX1JBVEVfTElNSVQJCTB4MDAwOAorI2RlZmluZSBBVURJVF9TVEFUVVNfQkFDS0xPR19MSU1JVAkweDAwMTAKKwkJCQkvKiBGYWlsdXJlLXRvLWxvZyBhY3Rpb25zICovCisjZGVmaW5lIEFVRElUX0ZBSUxfU0lMRU5UCTAKKyNkZWZpbmUgQVVESVRfRkFJTF9QUklOVEsJMQorI2RlZmluZSBBVURJVF9GQUlMX1BBTklDCTIKKworLyogZGlzdGluZ3Vpc2ggc3lzY2FsbCB0YWJsZXMgKi8KKyNkZWZpbmUgX19BVURJVF9BUkNIXzY0QklUIDB4ODAwMDAwMDAKKyNkZWZpbmUgX19BVURJVF9BUkNIX0xFCSAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQVVESVRfQVJDSF9BTFBIQQkoRU1fQUxQSEF8X19BVURJVF9BUkNIXzY0QklUfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9BUk0JCShFTV9BUk18X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX0FSTUVCCShFTV9BUk0pCisjZGVmaW5lIEFVRElUX0FSQ0hfQ1JJUwkJKEVNX0NSSVN8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX0ZSVgkJKEVNX0ZSVikKKyNkZWZpbmUgQVVESVRfQVJDSF9IODMwMAkoRU1fSDhfMzAwKQorI2RlZmluZSBBVURJVF9BUkNIX0kzODYJCShFTV8zODZ8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX0lBNjQJCShFTV9JQV82NHxfX0FVRElUX0FSQ0hfNjRCSVR8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX00zMlIJCShFTV9NMzJSKQorI2RlZmluZSBBVURJVF9BUkNIX002OEsJCShFTV82OEspCisjZGVmaW5lIEFVRElUX0FSQ0hfTUlQUwkJKEVNX01JUFMpCisjZGVmaW5lIEFVRElUX0FSQ0hfTUlQU0VMCShFTV9NSVBTfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9NSVBTNjQJKEVNX01JUFN8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX01JUFNFTDY0CShFTV9NSVBTfF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCisjZGVmaW5lIEFVRElUX0FSQ0hfUEFSSVNDCShFTV9QQVJJU0MpCisjZGVmaW5lIEFVRElUX0FSQ0hfUEFSSVNDNjQJKEVNX1BBUklTQ3xfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfUFBDCQkoRU1fUFBDKQorI2RlZmluZSBBVURJVF9BUkNIX1BQQzY0CShFTV9QUEM2NHxfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfUzM5MAkJKEVNX1MzOTApCisjZGVmaW5lIEFVRElUX0FSQ0hfUzM5MFgJKEVNX1MzOTB8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX1NICQkoRU1fU0gpCisjZGVmaW5lIEFVRElUX0FSQ0hfU0hFTAkJKEVNX1NIfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9TSDY0CQkoRU1fU0h8X19BVURJVF9BUkNIXzY0QklUKQorI2RlZmluZSBBVURJVF9BUkNIX1NIRUw2NAkoRU1fU0h8X19BVURJVF9BUkNIXzY0QklUfF9fQVVESVRfQVJDSF9MRSkKKyNkZWZpbmUgQVVESVRfQVJDSF9TUEFSQwkoRU1fU1BBUkMpCisjZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkM2NAkoRU1fU1BBUkNWOXxfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfVjg1MAkJKEVNX1Y4NTB8X19BVURJVF9BUkNIX0xFKQorI2RlZmluZSBBVURJVF9BUkNIX1g4Nl82NAkoRU1fWDg2XzY0fF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCisKKyNkZWZpbmUgQVVESVRfUEVSTV9FWEVDCQkxCisjZGVmaW5lIEFVRElUX1BFUk1fV1JJVEUJMgorI2RlZmluZSBBVURJVF9QRVJNX1JFQUQJCTQKKyNkZWZpbmUgQVVESVRfUEVSTV9BVFRSCQk4CisKK3N0cnVjdCBhdWRpdF9zdGF0dXMgeworCV9fdTMyCQltYXNrOwkJLyogQml0IG1hc2sgZm9yIHZhbGlkIGVudHJpZXMgKi8KKwlfX3UzMgkJZW5hYmxlZDsJLyogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworCV9fdTMyCQlmYWlsdXJlOwkvKiBGYWlsdXJlLXRvLWxvZyBhY3Rpb24gKi8KKwlfX3UzMgkJcGlkOwkJLyogcGlkIG9mIGF1ZGl0ZCBwcm9jZXNzICovCisJX191MzIJCXJhdGVfbGltaXQ7CS8qIG1lc3NhZ2VzIHJhdGUgbGltaXQgKHBlciBzZWNvbmQpICovCisJX191MzIJCWJhY2tsb2dfbGltaXQ7CS8qIHdhaXRpbmcgbWVzc2FnZXMgbGltaXQgKi8KKwlfX3UzMgkJbG9zdDsJCS8qIG1lc3NhZ2VzIGxvc3QgKi8KKwlfX3UzMgkJYmFja2xvZzsJLyogbWVzc2FnZXMgd2FpdGluZyBpbiBxdWV1ZSAqLworfTsKKworc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMgeworCV9fdTMyCQllbmFibGVkOyAvKiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCit9OworCisvKiBhdWRpdF9ydWxlX2RhdGEgc3VwcG9ydHMgZmlsdGVyIHJ1bGVzIHdpdGggYm90aCBpbnRlZ2VyIGFuZCBzdHJpbmcKKyAqIGZpZWxkcy4gIEl0IGNvcnJlc3BvbmRzIHdpdGggQVVESVRfQUREX1JVTEUsIEFVRElUX0RFTF9SVUxFIGFuZAorICogQVVESVRfTElTVF9SVUxFUyByZXF1ZXN0cy4KKyAqLworc3RydWN0IGF1ZGl0X3J1bGVfZGF0YSB7CisJX191MzIJCWZsYWdzOwkvKiBBVURJVF9QRVJfe1RBU0ssQ0FMTH0sIEFVRElUX1BSRVBFTkQgKi8KKwlfX3UzMgkJYWN0aW9uOwkvKiBBVURJVF9ORVZFUiwgQVVESVRfUE9TU0lCTEUsIEFVRElUX0FMV0FZUyAqLworCV9fdTMyCQlmaWVsZF9jb3VudDsKKwlfX3UzMgkJbWFza1tBVURJVF9CSVRNQVNLX1NJWkVdOyAvKiBzeXNjYWxsKHMpIGFmZmVjdGVkICovCisJX191MzIJCWZpZWxkc1tBVURJVF9NQVhfRklFTERTXTsKKwlfX3UzMgkJdmFsdWVzW0FVRElUX01BWF9GSUVMRFNdOworCV9fdTMyCQlmaWVsZGZsYWdzW0FVRElUX01BWF9GSUVMRFNdOworCV9fdTMyCQlidWZsZW47CS8qIHRvdGFsIGxlbmd0aCBvZiBzdHJpbmcgZmllbGRzICovCisJY2hhcgkJYnVmWzBdOwkvKiBzdHJpbmcgZmllbGRzIGJ1ZmZlciAqLworfTsKKworLyogYXVkaXRfcnVsZSBpcyBzdXBwb3J0ZWQgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCisgKiB1c2Vyc3BhY2UuICBJdCBzdXBwb3J0cyBpbnRlZ2VyIGZpZWxkcyBvbmx5IGFuZCBjb3JyZXNwb25kcyB0bworICogQVVESVRfQURELCBBVURJVF9ERUwgYW5kIEFVRElUX0xJU1QgcmVxdWVzdHMuCisgKi8KK3N0cnVjdCBhdWRpdF9ydWxlIHsJCS8qIGZvciBBVURJVF9MSVNULCBBVURJVF9BREQsIGFuZCBBVURJVF9ERUwgKi8KKwlfX3UzMgkJZmxhZ3M7CS8qIEFVRElUX1BFUl97VEFTSyxDQUxMfSwgQVVESVRfUFJFUEVORCAqLworCV9fdTMyCQlhY3Rpb247CS8qIEFVRElUX05FVkVSLCBBVURJVF9QT1NTSUJMRSwgQVVESVRfQUxXQVlTICovCisJX191MzIJCWZpZWxkX2NvdW50OworCV9fdTMyCQltYXNrW0FVRElUX0JJVE1BU0tfU0laRV07CisJX191MzIJCWZpZWxkc1tBVURJVF9NQVhfRklFTERTXTsKKwlfX3UzMgkJdmFsdWVzW0FVRElUX01BWF9GSUVMRFNdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTEyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnMuaApAQCAtMCwwICsxLDc5IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogbGludXgvaW5jbHVkZS9saW51eC9hdXRvX2ZzLmgKKyAqCisgKiAgIENvcHlyaWdodCAxOTk3IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyNpZm5kZWYgX0xJTlVYX0FVVE9fRlNfSAorI2RlZmluZSBfTElOVVhfQVVUT19GU19ICisKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIFRoaXMgZmlsZSBkZXNjcmliZXMgYXV0b2ZzIHYzICovCisjZGVmaW5lIEFVVE9GU19QUk9UT19WRVJTSU9OCTMKKworLyogUmFuZ2Ugb2YgcHJvdG9jb2wgdmVyc2lvbnMgZGVmaW5lZCAqLworI2RlZmluZSBBVVRPRlNfTUFYX1BST1RPX1ZFUlNJT04JQVVUT0ZTX1BST1RPX1ZFUlNJT04KKyNkZWZpbmUgQVVUT0ZTX01JTl9QUk9UT19WRVJTSU9OCUFVVE9GU19QUk9UT19WRVJTSU9OCisKKy8qCisgKiBBcmNoaXRlY3R1cmVzIHdoZXJlIGJvdGggMzItIGFuZCA2NC1iaXQgYmluYXJpZXMgY2FuIGJlIGV4ZWN1dGVkCisgKiBvbiA2NC1iaXQga2VybmVscyBuZWVkIHRoaXMuICBUaGlzIGtlZXBzIHRoZSBzdHJ1Y3R1cmUgZm9ybWF0CisgKiB1bmlmb3JtLCBhbmQgbWFrZXMgc3VyZSB0aGUgd2FpdF9xdWV1ZV90b2tlbiBpc24ndCB0b28gYmlnIHRvIGJlCisgKiBwYXNzZWQgYmFjayBkb3duIHRvIHRoZSBrZXJuZWwuCisgKgorICogVGhpcyBhc3N1bWVzIHRoYXQgb24gdGhlc2UgYXJjaGl0ZWN0dXJlczoKKyAqIG1vZGUgICAgIDMyIGJpdCAgICA2NCBiaXQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludCAgICAgIDMyIGJpdCAgICAzMiBiaXQKKyAqIGxvbmcgICAgIDMyIGJpdCAgICA2NCBiaXQKKyAqCisgKiBJZiBzbywgMzItYml0IHVzZXItc3BhY2UgY29kZSBzaG91bGQgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUuCisgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIFwKKyB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fczM5MF9fKQordHlwZWRlZiB1bnNpZ25lZCBpbnQgYXV0b2ZzX3dxdF90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBhdXRvZnNfd3F0X3Q7CisjZW5kaWYKKworLyogUGFja2V0IHR5cGVzICovCisjZGVmaW5lIGF1dG9mc19wdHlwZV9taXNzaW5nCTAJLyogTWlzc2luZyBlbnRyeSAobW91bnQgcmVxdWVzdCkgKi8KKyNkZWZpbmUgYXV0b2ZzX3B0eXBlX2V4cGlyZQkxCS8qIEV4cGlyZSBlbnRyeSAodW1vdW50IHJlcXVlc3QpICovCisKK3N0cnVjdCBhdXRvZnNfcGFja2V0X2hkciB7CisJaW50IHByb3RvX3ZlcnNpb247CQkvKiBQcm90b2NvbCB2ZXJzaW9uICovCisJaW50IHR5cGU7CQkJLyogVHlwZSBvZiBwYWNrZXQgKi8KK307CisKK3N0cnVjdCBhdXRvZnNfcGFja2V0X21pc3NpbmcgeworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2hkciBoZHI7CisgICAgICAgIGF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCWludCBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsJCisKKy8qIHYzIGV4cGlyZSAodmlhIGlvY3RsKSAqLworc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlIHsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9oZHIgaGRyOworCWludCBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsKKworI2RlZmluZSBBVVRPRlNfSU9DX1JFQURZICAgICAgX0lPKDB4OTMsMHg2MCkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19GQUlMICAgICAgIF9JTygweDkzLDB4NjEpCisjZGVmaW5lIEFVVE9GU19JT0NfQ0FUQVRPTklDICBfSU8oMHg5MywweDYyKQorI2RlZmluZSBBVVRPRlNfSU9DX1BST1RPVkVSICAgX0lPUigweDkzLDB4NjMsaW50KQorI2RlZmluZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQgX0lPV1IoMHg5MywweDY0LHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFICAgICBfSU9SKDB4OTMsMHg2NSxzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUpCisKKyNlbmRpZiAvKiBfTElOVVhfQVVUT19GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhMjk1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV0b19mczQuaApAQCAtMCwwICsxLDEwNiBAQAorLyogLSotIGMgLSotCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L2F1dG9fZnM0LmgKKyAqCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAwIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BVVRPX0ZTNF9ICisjZGVmaW5lIF9MSU5VWF9BVVRPX0ZTNF9ICisKKy8qIEluY2x1ZGUgY29tbW9uIHYzIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgorCisvKiBhdXRvZnMgdjQgZGVmaW5pdGlvbnMgKi8KKyN1bmRlZiBBVVRPRlNfUFJPVE9fVkVSU0lPTgorI3VuZGVmIEFVVE9GU19NSU5fUFJPVE9fVkVSU0lPTgorI3VuZGVmIEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTgorCisjZGVmaW5lIEFVVE9GU19QUk9UT19WRVJTSU9OCQk1CisjZGVmaW5lIEFVVE9GU19NSU5fUFJPVE9fVkVSU0lPTgkzCisjZGVmaW5lIEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTgk1CisKKyNkZWZpbmUgQVVUT0ZTX1BST1RPX1NVQlZFUlNJT04JCTAKKworLyogTWFzayBmb3IgZXhwaXJlIGJlaGF2aW91ciAqLworI2RlZmluZSBBVVRPRlNfRVhQX0lNTUVESUFURQkJMQorI2RlZmluZSBBVVRPRlNfRVhQX0xFQVZFUwkJMgorCisvKiBEYWVtb24gbm90aWZpY2F0aW9uIHBhY2tldCB0eXBlcyAqLworZW51bSBhdXRvZnNfbm90aWZ5IHsKKwlORllfTk9ORSwKKwlORllfTU9VTlQsCisJTkZZX0VYUElSRQorfTsKKworLyogS2VybmVsIHByb3RvY29sIHZlcnNpb24gNCBwYWNrZXQgdHlwZXMgKi8KKworLyogRXhwaXJlIGVudHJ5ICh1bW91bnQgcmVxdWVzdCkgKi8KKyNkZWZpbmUgYXV0b2ZzX3B0eXBlX2V4cGlyZV9tdWx0aQkyCisKKy8qIEtlcm5lbCBwcm90b2NvbCB2ZXJzaW9uIDUgcGFja2V0IHR5cGVzICovCisKKy8qIEluZGlyZWN0IG1vdW50IG1pc3NpbmcgYW5kIGV4cGlyZSByZXF1ZXN0cy4gKi8KKyNkZWZpbmUgYXV0b2ZzX3B0eXBlX21pc3NpbmdfaW5kaXJlY3QJMworI2RlZmluZSBhdXRvZnNfcHR5cGVfZXhwaXJlX2luZGlyZWN0CTQKKworLyogRGlyZWN0IG1vdW50IG1pc3NpbmcgYW5kIGV4cGlyZSByZXF1ZXN0cyAqLworI2RlZmluZSBhdXRvZnNfcHR5cGVfbWlzc2luZ19kaXJlY3QJNQorI2RlZmluZSBhdXRvZnNfcHR5cGVfZXhwaXJlX2RpcmVjdAk2CisKKy8qIHY0IG11bHRpIGV4cGlyZSAodmlhIHBpcGUpICovCitzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmVfbXVsdGkgeworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2hkciBoZHI7CisgICAgICAgIGF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCWludCBsZW47CisJY2hhciBuYW1lW05BTUVfTUFYKzFdOworfTsKKwordW5pb24gYXV0b2ZzX3BhY2tldF91bmlvbiB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nIG1pc3Npbmc7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlIGV4cGlyZTsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmVfbXVsdGkgZXhwaXJlX211bHRpOworfTsKKworLyogYXV0b2ZzIHY1IGNvbW1vbiBwYWNrZXQgc3RydWN0ICovCitzdHJ1Y3QgYXV0b2ZzX3Y1X3BhY2tldCB7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfaGRyIGhkcjsKKwlhdXRvZnNfd3F0X3Qgd2FpdF9xdWV1ZV90b2tlbjsKKwlfX3UzMiBkZXY7CisJX191NjQgaW5vOworCV9fdTMyIHVpZDsKKwlfX3UzMiBnaWQ7CisJX191MzIgcGlkOworCV9fdTMyIHRnaWQ7CisJX191MzIgbGVuOworCWNoYXIgbmFtZVtOQU1FX01BWCsxXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGF1dG9mc192NV9wYWNrZXQgYXV0b2ZzX3BhY2tldF9taXNzaW5nX2luZGlyZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBhdXRvZnNfdjVfcGFja2V0IGF1dG9mc19wYWNrZXRfZXhwaXJlX2luZGlyZWN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBhdXRvZnNfdjVfcGFja2V0IGF1dG9mc19wYWNrZXRfbWlzc2luZ19kaXJlY3RfdDsKK3R5cGVkZWYgc3RydWN0IGF1dG9mc192NV9wYWNrZXQgYXV0b2ZzX3BhY2tldF9leHBpcmVfZGlyZWN0X3Q7CisKK3VuaW9uIGF1dG9mc192NV9wYWNrZXRfdW5pb24geworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2hkciBoZHI7CisJc3RydWN0IGF1dG9mc192NV9wYWNrZXQgdjVfcGFja2V0OworCWF1dG9mc19wYWNrZXRfbWlzc2luZ19pbmRpcmVjdF90IG1pc3NpbmdfaW5kaXJlY3Q7CisJYXV0b2ZzX3BhY2tldF9leHBpcmVfaW5kaXJlY3RfdCBleHBpcmVfaW5kaXJlY3Q7CisJYXV0b2ZzX3BhY2tldF9taXNzaW5nX2RpcmVjdF90IG1pc3NpbmdfZGlyZWN0OworCWF1dG9mc19wYWNrZXRfZXhwaXJlX2RpcmVjdF90IGV4cGlyZV9kaXJlY3Q7Cit9OworCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFX01VTFRJCQlfSU9XKDB4OTMsMHg2NixpbnQpCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFX0lORElSRUNUCUFVVE9GU19JT0NfRVhQSVJFX01VTFRJCisjZGVmaW5lIEFVVE9GU19JT0NfRVhQSVJFX0RJUkVDVAlBVVRPRlNfSU9DX0VYUElSRV9NVUxUSQorI2RlZmluZSBBVVRPRlNfSU9DX1BST1RPU1VCVkVSCQlfSU9SKDB4OTMsMHg2NyxpbnQpCisjZGVmaW5lIEFVVE9GU19JT0NfQVNLUkVHSE9TVCAgICAgICAgICAgX0lPUigweDkzLDB4NjgsaW50KQorI2RlZmluZSBBVVRPRlNfSU9DX1RPR0dMRVJFR0hPU1QgICAgICAgIF9JT1IoMHg5MywweDY5LGludCkKKyNkZWZpbmUgQVVUT0ZTX0lPQ19BU0tVTU9VTlQJCV9JT1IoMHg5MywweDcwLGludCkKKworCisjZW5kaWYgLyogX0xJTlVYX0FVVE9fRlM0X0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXV4dmVjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODk1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0xJTlVYX0FVWFZFQ19ICisjZGVmaW5lIF9MSU5VWF9BVVhWRUNfSAorCisjaW5jbHVkZSA8YXNtL2F1eHZlYy5oPgorCisvKiBTeW1ib2xpYyB2YWx1ZXMgZm9yIHRoZSBlbnRyaWVzIGluIHRoZSBhdXhpbGlhcnkgdGFibGUKKyAgIHB1dCBvbiB0aGUgaW5pdGlhbCBzdGFjayAqLworI2RlZmluZSBBVF9OVUxMICAgMAkvKiBlbmQgb2YgdmVjdG9yICovCisjZGVmaW5lIEFUX0lHTk9SRSAxCS8qIGVudHJ5IHNob3VsZCBiZSBpZ25vcmVkICovCisjZGVmaW5lIEFUX0VYRUNGRCAyCS8qIGZpbGUgZGVzY3JpcHRvciBvZiBwcm9ncmFtICovCisjZGVmaW5lIEFUX1BIRFIgICAzCS8qIHByb2dyYW0gaGVhZGVycyBmb3IgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSEVOVCAgNAkvKiBzaXplIG9mIHByb2dyYW0gaGVhZGVyIGVudHJ5ICovCisjZGVmaW5lIEFUX1BITlVNICA1CS8qIG51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnMgKi8KKyNkZWZpbmUgQVRfUEFHRVNaIDYJLyogc3lzdGVtIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBBVF9CQVNFICAgNwkvKiBiYXNlIGFkZHJlc3Mgb2YgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgQVRfRkxBR1MgIDgJLyogZmxhZ3MgKi8KKyNkZWZpbmUgQVRfRU5UUlkgIDkJLyogZW50cnkgcG9pbnQgb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9OT1RFTEYgMTAJLyogcHJvZ3JhbSBpcyBub3QgRUxGICovCisjZGVmaW5lIEFUX1VJRCAgICAxMQkvKiByZWFsIHVpZCAqLworI2RlZmluZSBBVF9FVUlEICAgMTIJLyogZWZmZWN0aXZlIHVpZCAqLworI2RlZmluZSBBVF9HSUQgICAgMTMJLyogcmVhbCBnaWQgKi8KKyNkZWZpbmUgQVRfRUdJRCAgIDE0CS8qIGVmZmVjdGl2ZSBnaWQgKi8KKyNkZWZpbmUgQVRfUExBVEZPUk0gMTUgIC8qIHN0cmluZyBpZGVudGlmeWluZyBDUFUgZm9yIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgQVRfSFdDQVAgIDE2ICAgIC8qIGFyY2ggZGVwZW5kZW50IGhpbnRzIGF0IENQVSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQVRfQ0xLVENLIDE3CS8qIGZyZXF1ZW5jeSBhdCB3aGljaCB0aW1lcygpIGluY3JlbWVudHMgKi8KKworI2RlZmluZSBBVF9TRUNVUkUgMjMgICAvKiBzZWN1cmUgbW9kZSBib29sZWFuICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0JBU0UgKDE0ICsgMikgLyogTkVXX0FVWF9FTlQgZW50cmllcyBpbiBhdXhpbGlhcnkgdGFibGUgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX0FVWFZFQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F4MjUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYXgyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzExZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2F4MjUuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHVibGljIGVsZW1lbnRzIG9mIHRoZSBMaW51eCBrZXJuZWwgQVguMjUgY29kZS4gQSBzaW1pbGFyCisgKiBmaWxlIG5ldHJvbS5oIGV4aXN0cyBmb3IgdGhlIE5FVC9ST00gcHJvdG9jb2wuCisgKi8KKworI2lmbmRlZglBWDI1X0tFUk5FTF9ICisjZGVmaW5lCUFYMjVfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjZGVmaW5lIEFYMjVfTVRVCTI1NgorI2RlZmluZSBBWDI1X01BWF9ESUdJUyAgOAorCisjZGVmaW5lIEFYMjVfV0lORE9XCTEKKyNkZWZpbmUgQVgyNV9UMQkJMgorI2RlZmluZSBBWDI1X04yCQkzCisjZGVmaW5lIEFYMjVfVDMJCTQKKyNkZWZpbmUgQVgyNV9UMgkJNQorI2RlZmluZQlBWDI1X0JBQ0tPRkYJNgorI2RlZmluZQlBWDI1X0VYVFNFUQk3CisjZGVmaW5lCUFYMjVfUElESU5DTAk4CisjZGVmaW5lIEFYMjVfSURMRQk5CisjZGVmaW5lIEFYMjVfUEFDTEVOCTEwCisjZGVmaW5lIEFYMjVfSUFNRElHSQkxMgorCisjZGVmaW5lIEFYMjVfS0lMTAk5OQorCisjZGVmaW5lIFNJT0NBWDI1R0VUVUlECQkoU0lPQ1BST1RPUFJJVkFURSswKQorI2RlZmluZSBTSU9DQVgyNUFERFVJRAkJKFNJT0NQUk9UT1BSSVZBVEUrMSkKKyNkZWZpbmUgU0lPQ0FYMjVERUxVSUQJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lIFNJT0NBWDI1Tk9VSUQJCShTSU9DUFJPVE9QUklWQVRFKzMpCisjZGVmaW5lIFNJT0NBWDI1T1BUUlQJCShTSU9DUFJPVE9QUklWQVRFKzcpCisjZGVmaW5lIFNJT0NBWDI1Q1RMQ09OCQkoU0lPQ1BST1RPUFJJVkFURSs4KQorI2RlZmluZSBTSU9DQVgyNUdFVElORk9PTEQJKFNJT0NQUk9UT1BSSVZBVEUrOSkKKyNkZWZpbmUgU0lPQ0FYMjVBRERGV0QJCShTSU9DUFJPVE9QUklWQVRFKzEwKQorI2RlZmluZSBTSU9DQVgyNURFTEZXRAkJKFNJT0NQUk9UT1BSSVZBVEUrMTEpCisjZGVmaW5lIFNJT0NBWDI1REVWQ1RMICAgICAgICAgIChTSU9DUFJPVE9QUklWQVRFKzEyKQorI2RlZmluZSBTSU9DQVgyNUdFVElORk8gICAgICAgICAoU0lPQ1BST1RPUFJJVkFURSsxMykKKworI2RlZmluZSBBWDI1X1NFVF9SVF9JUE1PREUJMgorCisjZGVmaW5lIEFYMjVfTk9VSURfREVGQVVMVAkwCisjZGVmaW5lIEFYMjVfTk9VSURfQkxPQ0sJMQorCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhcgkJYXgyNV9jYWxsWzddOwkvKiA2IGNhbGwgKyBTU0lEIChzaGlmdGVkIGFzY2lpISkgKi8KK30gYXgyNV9hZGRyZXNzOworCitzdHJ1Y3Qgc29ja2FkZHJfYXgyNSB7CisJc2FfZmFtaWx5X3QJc2F4MjVfZmFtaWx5OworCWF4MjVfYWRkcmVzcwlzYXgyNV9jYWxsOworCWludAkJc2F4MjVfbmRpZ2lzOworCS8qIERpZ2lwZWF0ZXIgYXgyNV9hZGRyZXNzIHNldHMgZm9sbG93ICovCit9OworCisjZGVmaW5lIHNheDI1X3VpZAlzYXgyNV9uZGlnaXMKKworc3RydWN0IGZ1bGxfc29ja2FkZHJfYXgyNSB7CisJc3RydWN0IHNvY2thZGRyX2F4MjUgZnNhX2F4MjU7CisJYXgyNV9hZGRyZXNzCWZzYV9kaWdpcGVhdGVyW0FYMjVfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCBheDI1X3JvdXRlc19zdHJ1Y3QgeworCWF4MjVfYWRkcmVzcwlwb3J0X2FkZHI7CisJYXgyNV9hZGRyZXNzCWRlc3RfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCWRpZ2lfY291bnQ7CisJYXgyNV9hZGRyZXNzCWRpZ2lfYWRkcltBWDI1X01BWF9ESUdJU107Cit9OworCitzdHJ1Y3QgYXgyNV9yb3V0ZV9vcHRfc3RydWN0IHsKKwlheDI1X2FkZHJlc3MJcG9ydF9hZGRyOworCWF4MjVfYWRkcmVzcwlkZXN0X2FkZHI7CisJaW50CQljbWQ7CisJaW50CQlhcmc7Cit9OworCitzdHJ1Y3QgYXgyNV9jdGxfc3RydWN0IHsKKyAgICAgICAgYXgyNV9hZGRyZXNzICAgICAgICAgICAgcG9ydF9hZGRyOworICAgICAgICBheDI1X2FkZHJlc3MgICAgICAgICAgICBzb3VyY2VfYWRkcjsKKyAgICAgICAgYXgyNV9hZGRyZXNzICAgICAgICAgICAgZGVzdF9hZGRyOworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGFyZzsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgZGlnaV9jb3VudDsKKyAgICAgICAgYXgyNV9hZGRyZXNzICAgICAgICAgICAgZGlnaV9hZGRyW0FYMjVfTUFYX0RJR0lTXTsKK307CisKKy8qIHRoaXMgd2lsbCBnbyBhd2F5LiBQbGVhc2UgZG8gbm90IGV4cG9ydCB0byB1c2VyIGxhbmQgKi8KK3N0cnVjdCBheDI1X2luZm9fc3RydWN0X2RlcHJlY2F0ZWQgeworCXVuc2lnbmVkIGludAluMiwgbjJjb3VudDsKKwl1bnNpZ25lZCBpbnQJdDEsIHQxdGltZXI7CisJdW5zaWduZWQgaW50CXQyLCB0MnRpbWVyOworCXVuc2lnbmVkIGludAl0MywgdDN0aW1lcjsKKwl1bnNpZ25lZCBpbnQJaWRsZSwgaWRsZXRpbWVyOworCXVuc2lnbmVkIGludAlzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJcmN2X3EsIHNuZF9xOworfTsKKworc3RydWN0IGF4MjVfaW5mb19zdHJ1Y3QgeworCXVuc2lnbmVkIGludAluMiwgbjJjb3VudDsKKwl1bnNpZ25lZCBpbnQJdDEsIHQxdGltZXI7CisJdW5zaWduZWQgaW50CXQyLCB0MnRpbWVyOworCXVuc2lnbmVkIGludAl0MywgdDN0aW1lcjsKKwl1bnNpZ25lZCBpbnQJaWRsZSwgaWRsZXRpbWVyOworCXVuc2lnbmVkIGludAlzdGF0ZTsKKwl1bnNpZ25lZCBpbnQJcmN2X3EsIHNuZF9xOworCXVuc2lnbmVkIGludAl2cywgdnIsIHZhLCB2c19tYXg7CisJdW5zaWduZWQgaW50CXBhY2xlbjsKKwl1bnNpZ25lZCBpbnQJd2luZG93OworfTsKKworc3RydWN0IGF4MjVfZndkX3N0cnVjdCB7CisJYXgyNV9hZGRyZXNzCXBvcnRfZnJvbTsKKwlheDI1X2FkZHJlc3MJcG9ydF90bzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iMWxsaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iMWxsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2Y3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2IxbGxpLmgKQEAgLTAsMCArMSw3MyBAQAorLyogJElkOiBiMWxsaS5oLHYgMS44LjguMyAyMDAxLzA5LzIzIDIyOjI1OjA1IGthaSBFeHAgJAorICoKKyAqIElTRE4gbG93bGV2ZWwtbW9kdWxlIGZvciBBVk0gQjEtY2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgMTk5NiBieSBDYXJzdGVuIFBhZXRoIChjYWxsZUBjYWxsZS5pbi1iZXJsaW4uZGUpCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfQjFMTElfSF8KKyNkZWZpbmUgX0IxTExJX0hfCisvKgorICogc3RydWN0IGZvciBsb2FkaW5nIHQ0IGZpbGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGF2bWIxX3Q0ZmlsZSB7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworfSBhdm1iMV90NGZpbGU7CisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2xvYWRkZWYgeworCWludCBjb250cjsKKwlhdm1iMV90NGZpbGUgdDRmaWxlOworfSBhdm1iMV9sb2FkZGVmOworCit0eXBlZGVmIHN0cnVjdCBhdm1iMV9sb2FkYW5kY29uZmlnZGVmIHsKKwlpbnQgY29udHI7CisJYXZtYjFfdDRmaWxlIHQ0ZmlsZTsKKyAgICAgICAgYXZtYjFfdDRmaWxlIHQ0Y29uZmlnOyAKK30gYXZtYjFfbG9hZGFuZGNvbmZpZ2RlZjsKKwordHlwZWRlZiBzdHJ1Y3QgYXZtYjFfcmVzZXRkZWYgeworCWludCBjb250cjsKK30gYXZtYjFfcmVzZXRkZWY7CisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2dldGRlZiB7CisJaW50IGNvbnRyOworCWludCBjYXJkdHlwZTsKKwlpbnQgY2FyZHN0YXRlOworfSBhdm1iMV9nZXRkZWY7CisKKy8qCisgKiBzdHJ1Y3QgZm9yIGFkZGluZyBuZXcgY2FyZHMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGF2bWIxX2NhcmRkZWYgeworCWludCBwb3J0OworCWludCBpcnE7Cit9IGF2bWIxX2NhcmRkZWY7CisKKyNkZWZpbmUgQVZNX0NBUkRUWVBFX0IxCQkwCisjZGVmaW5lIEFWTV9DQVJEVFlQRV9UMQkJMQorI2RlZmluZSBBVk1fQ0FSRFRZUEVfTTEJCTIKKyNkZWZpbmUgQVZNX0NBUkRUWVBFX00yCQkzCisKK3R5cGVkZWYgc3RydWN0IGF2bWIxX2V4dGNhcmRkZWYgeworCWludCBwb3J0OworCWludCBpcnE7CisgICAgICAgIGludCBjYXJkdHlwZTsKKyAgICAgICAgaW50IGNhcmRucjsgIC8qIGZvciBIRU1BL1QxICovCit9IGF2bWIxX2V4dGNhcmRkZWY7CisKKyNkZWZpbmUJQVZNQjFfTE9BRAkJMAkvKiBsb2FkIGltYWdlIHRvIGNhcmQgKi8KKyNkZWZpbmUgQVZNQjFfQUREQ0FSRAkJMQkvKiBhZGQgYSBuZXcgY2FyZCAtIE9CU09MRVRFICovCisjZGVmaW5lIEFWTUIxX1JFU0VUQ0FSRAkJMgkvKiByZXNldCBhIGNhcmQgKi8KKyNkZWZpbmUJQVZNQjFfTE9BRF9BTkRfQ09ORklHCTMJLyogbG9hZCBpbWFnZSBhbmQgY29uZmlnIHRvIGNhcmQgKi8KKyNkZWZpbmUJQVZNQjFfQUREQ0FSRF9XSVRIX1RZUEUJNAkvKiBhZGQgYSBuZXcgY2FyZCwgd2l0aCBjYXJkdHlwZSAqLworI2RlZmluZSBBVk1CMV9HRVRfQ0FSRElORk8JNQkvKiBnZXQgY2FyZHR5cGUgKi8KKyNkZWZpbmUgQVZNQjFfUkVNT1ZFQ0FSRAk2CS8qIHJlbW92ZSBhIGNhcmQgLSBPQlNPTEVURSAqLworCisjZGVmaW5lCUFWTUIxX1JFR0lTVEVSQ0FSRF9JU19PQlNPTEVURQorCisjZW5kaWYJCQkJLyogX0IxTExJX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JheWNvbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iYXljb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI0OWUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iYXljb20uaApAQCAtMCwwICsxLDM5IEBACisvKgorICogVGhlIExpbnV4IEJBWUNPTSBkcml2ZXIgZm9yIHRoZSBCYXljb20gc2VyaWFsIDEyMDAgYmF1ZCBtb2RlbQorICogYW5kIHRoZSBwYXJhbGxlbCA5NjAwIGJhdWQgbW9kZW0KKyAqIChDKSAxOTk3LTE5OTggYnkgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBCisgKi8KKworI2lmbmRlZiBfQkFZQ09NX0gKKyNkZWZpbmUgX0JBWUNPTV9ICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogc3RydWN0cyBmb3IgdGhlIElPQ1RMIGNvbW1hbmRzCisgKi8KKworc3RydWN0IGJheWNvbV9kZWJ1Z19kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGRlYnVnMTsKKwl1bnNpZ25lZCBsb25nIGRlYnVnMjsKKwlsb25nIGRlYnVnMzsKK307CisKK3N0cnVjdCBiYXljb21faW9jdGwgeworCWludCBjbWQ7CisJdW5pb24geworCQlzdHJ1Y3QgYmF5Y29tX2RlYnVnX2RhdGEgZGJnOworCX0gZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpb2N0bCB2YWx1ZXMgY2hhbmdlIGZvciBiYXljb20KKyAqLworI2RlZmluZSBCQVlDT01DVExfR0VUREVCVUcgICAgICAgMHg5MgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZW5kaWYgLyogX0JBWUNPTV9IICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkNmRmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmZzX2ZzLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqCWluY2x1ZGUvbGludXgvYmZzX2ZzLmggLSBCRlMgZGF0YSBzdHJ1Y3R1cmVzIG9uIGRpc2suCisgKglDb3B5cmlnaHQgKEMpIDE5OTkgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKi8KKworI2lmbmRlZiBfTElOVVhfQkZTX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0JGU19GU19ICisKKyNkZWZpbmUgQkZTX0JTSVpFX0JJVFMJCTkKKyNkZWZpbmUgQkZTX0JTSVpFCQkoMTw8QkZTX0JTSVpFX0JJVFMpCisKKyNkZWZpbmUgQkZTX01BR0lDCQkweDFCQURGQUNFCisjZGVmaW5lIEJGU19ST09UX0lOTwkJMgorI2RlZmluZSBCRlNfSU5PREVTX1BFUl9CTE9DSwk4CisKKy8qIFNWUjQgdm5vZGUgdHlwZSB2YWx1ZXMgKGJmc19pbm9kZS0+aV92dHlwZSkgKi8KKyNkZWZpbmUgQkZTX1ZESVIgMkwKKyNkZWZpbmUgQkZTX1ZSRUcgMUwKKworCisvKiBCRlMgaW5vZGUgbGF5b3V0IG9uIGRpc2sgKi8KK3N0cnVjdCBiZnNfaW5vZGUgeworCV9fbGUxNiBpX2lubzsKKwlfX3UxNiBpX3VudXNlZDsKKwlfX2xlMzIgaV9zYmxvY2s7CisJX19sZTMyIGlfZWJsb2NrOworCV9fbGUzMiBpX2VvZmZzZXQ7CisJX19sZTMyIGlfdnR5cGU7CisJX19sZTMyIGlfbW9kZTsKKwlfX2xlMzIgaV91aWQ7CisJX19sZTMyIGlfZ2lkOworCV9fbGUzMiBpX25saW5rOworCV9fbGUzMiBpX2F0aW1lOworCV9fbGUzMiBpX210aW1lOworCV9fbGUzMiBpX2N0aW1lOworCV9fdTMyIGlfcGFkZGluZ1s0XTsKK307CisKKyNkZWZpbmUgQkZTX05BTUVMRU4JCTE0CQorI2RlZmluZSBCRlNfRElSRU5UX1NJWkUJCTE2CisjZGVmaW5lIEJGU19ESVJTX1BFUl9CTE9DSwkzMgorCitzdHJ1Y3QgYmZzX2RpcmVudCB7CisJX19sZTE2IGlubzsKKwljaGFyIG5hbWVbQkZTX05BTUVMRU5dOworfTsKKworLyogQkZTIHN1cGVyYmxvY2sgbGF5b3V0IG9uIGRpc2sgKi8KK3N0cnVjdCBiZnNfc3VwZXJfYmxvY2sgeworCV9fbGUzMiBzX21hZ2ljOworCV9fbGUzMiBzX3N0YXJ0OworCV9fbGUzMiBzX2VuZDsKKwlfX2xlMzIgc19mcm9tOworCV9fbGUzMiBzX3RvOworCV9fczMyIHNfYmZyb207CisJX19zMzIgc19idG87CisJY2hhciAgc19mc25hbWVbNl07CisJY2hhciAgc192b2x1bWVbNl07CisJX191MzIgc19wYWRkaW5nWzExOF07Cit9OworCisKKyNkZWZpbmUgQkZTX09GRjJJTk8ob2Zmc2V0KSBcCisgICAgICAgICgoKChvZmZzZXQpIC0gQkZTX0JTSVpFKSAvIHNpemVvZihzdHJ1Y3QgYmZzX2lub2RlKSkgKyBCRlNfUk9PVF9JTk8pCisKKyNkZWZpbmUgQkZTX0lOTzJPRkYoaW5vKSBcCisJKChfX3UzMikoKChpbm8pIC0gQkZTX1JPT1RfSU5PKSAqIHNpemVvZihzdHJ1Y3QgYmZzX2lub2RlKSkgKyBCRlNfQlNJWkUpCisjZGVmaW5lIEJGU19OWkZJTEVTSVpFKGlwKSBcCisgICAgICAgICgobGUzMl90b19jcHUoKGlwKS0+aV9lb2Zmc2V0KSArIDEpIC0gIGxlMzJfdG9fY3B1KChpcCktPmlfc2Jsb2NrKSAqIEJGU19CU0laRSkKKworI2RlZmluZSBCRlNfRklMRVNJWkUoaXApIFwKKyAgICAgICAgKChpcCktPmlfc2Jsb2NrID09IDAgPyAwIDogQkZTX05aRklMRVNJWkUoaXApKQorCisjZGVmaW5lIEJGU19GSUxFQkxPQ0tTKGlwKSBcCisgICAgICAgICgoaXApLT5pX3NibG9jayA9PSAwID8gMCA6IChsZTMyX3RvX2NwdSgoaXApLT5pX2VibG9jaykgKyAxKSAtICBsZTMyX3RvX2NwdSgoaXApLT5pX3NibG9jaykpCisjZGVmaW5lIEJGU19VTkNMRUFOKGJmc19zYiwgc2IpCVwKKwkoKGxlMzJfdG9fY3B1KGJmc19zYi0+c19mcm9tKSAhPSAtMSkgJiYgKGxlMzJfdG9fY3B1KGJmc19zYi0+c190bykgIT0gLTEpICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCisKKyNlbmRpZgkvKiBfTElOVVhfQkZTX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNjc5NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmluZm10cy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0xJTlVYX0JJTkZNVFNfSAorI2RlZmluZSBfTElOVVhfQklORk1UU19ICisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisKK3N0cnVjdCBwdF9yZWdzOworCisvKgorICogVGhlc2UgYXJlIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgbWF4aW11bSBudW1iZXIgb2Ygc3RyaW5ncyBwYXNzZWQgdG8gdGhlCisgKiBleGVjdmUoKSBzeXN0ZW0gY2FsbC4gIE1BWF9BUkdfU1RSTEVOIGlzIGVzc2VudGlhbGx5IHJhbmRvbSBidXQgc2VydmVzIHRvCisgKiBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSBiZWluZyB1bmR1bHkgaW1wYWN0ZWQgYnkgbWlzYWRkcmVzc2VkIHBvaW50ZXJzLgorICogTUFYX0FSR19TVFJJTkdTIGlzIGNob3NlbiB0byBmaXQgaW4gYSBzaWduZWQgMzItYml0IGludGVnZXIuCisgKi8KKyNkZWZpbmUgTUFYX0FSR19TVFJMRU4gKFBBR0VfU0laRSAqIDMyKQorI2RlZmluZSBNQVhfQVJHX1NUUklOR1MgMHg3RkZGRkZGRgorCisvKiBzaXplb2YobGludXhfYmlucHJtLT5idWYpICovCisjZGVmaW5lIEJJTlBSTV9CVUZfU0laRSAxMjgKKworI2VuZGlmIC8qIF9MSU5VWF9CSU5GTVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrcGcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYmxrcGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI2MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ibGtwZy5oCkBAIC0wLDAgKzEsNTcgQEAKKyNpZm5kZWYgX0xJTlVYX0JMS1BHX0gKKyNkZWZpbmUgX0xJTlVYX0JMS1BHX0gKKworLyoKKyAqIFBhcnRpdGlvbiB0YWJsZSBhbmQgZGlzayBnZW9tZXRyeSBoYW5kbGluZworICoKKyAqIEEgc2luZ2xlIGlvY3RsIHdpdGggbG90cyBvZiBzdWJmdW5jdGlvbnM6CisgKgorICogRGV2aWNlIG51bWJlciBzdHVmZjoKKyAqICAgIGdldF93aG9sZV9kaXNrKCkJCShnaXZlbiB0aGUgZGV2aWNlIG51bWJlciBvZiBhIHBhcnRpdGlvbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQgdGhlIGRldmljZSBudW1iZXIgb2YgdGhlIGVuY29tcGFzc2luZyBkaXNrKQorICogICAgZ2V0X2FsbF9wYXJ0aXRpb25zKCkJKGdpdmVuIHRoZSBkZXZpY2UgbnVtYmVyIG9mIGEgZGlzaywgcmV0dXJuIHRoZQorICoJCQkJIGRldmljZSBudW1iZXJzIG9mIGFsbCBpdHMga25vd24gcGFydGl0aW9ucykKKyAqCisgKiBQYXJ0aXRpb24gc3R1ZmY6CisgKiAgICBhZGRfcGFydGl0aW9uKCkKKyAqICAgIGRlbGV0ZV9wYXJ0aXRpb24oKQorICogICAgdGVzdF9wYXJ0aXRpb25faW5fdXNlKCkJKGFsc28gZm9yIHRlc3RfZGlza19pbl91c2UpCisgKgorICogR2VvbWV0cnkgc3R1ZmY6CisgKiAgICBnZXRfZ2VvbWV0cnkoKQorICogICAgc2V0X2dlb21ldHJ5KCkKKyAqICAgIGdldF9iaW9zX2RyaXZlZGF0YSgpCisgKgorICogRm9yIHRvZGF5LCBvbmx5IHRoZSBwYXJ0aXRpb24gc3R1ZmYgLSBhZWIsIDk5MDUxNQorICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBCTEtQRyAgICAgIF9JTygweDEyLDEwNSkKKworLyogVGhlIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworc3RydWN0IGJsa3BnX2lvY3RsX2FyZyB7CisgICAgICAgIGludCBvcDsKKyAgICAgICAgaW50IGZsYWdzOworICAgICAgICBpbnQgZGF0YWxlbjsKKyAgICAgICAgdm9pZCAqZGF0YTsKK307CisKKy8qIFRoZSBzdWJmdW5jdGlvbnMgKGZvciB0aGUgb3AgZmllbGQpICovCisjZGVmaW5lIEJMS1BHX0FERF9QQVJUSVRJT04JMQorI2RlZmluZSBCTEtQR19ERUxfUEFSVElUSU9OCTIKKworLyogU2l6ZXMgb2YgbmFtZSBmaWVsZHMuIFVudXNlZCBhdCBwcmVzZW50LiAqLworI2RlZmluZSBCTEtQR19ERVZOQU1FTFRICTY0CisjZGVmaW5lIEJMS1BHX1ZPTE5BTUVMVEgJNjQKKworLyogVGhlIGRhdGEgc3RydWN0dXJlIGZvciBBRERfUEFSVElUSU9OIGFuZCBERUxfUEFSVElUSU9OICovCitzdHJ1Y3QgYmxrcGdfcGFydGl0aW9uIHsKKwlsb25nIGxvbmcgc3RhcnQ7CQkvKiBzdGFydGluZyBvZmZzZXQgaW4gYnl0ZXMgKi8KKwlsb25nIGxvbmcgbGVuZ3RoOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJaW50IHBubzsJCQkvKiBwYXJ0aXRpb24gbnVtYmVyICovCisJY2hhciBkZXZuYW1lW0JMS1BHX0RFVk5BTUVMVEhdOwkvKiBwYXJ0aXRpb24gbmFtZSwgbGlrZSBzZGE1IG9yIGMwZDFwMiwKKwkJCQkJICAgdG8gYmUgdXNlZCBpbiBrZXJuZWwgbWVzc2FnZXMgKi8KKwljaGFyIHZvbG5hbWVbQkxLUEdfVk9MTkFNRUxUSF07CS8qIHZvbHVtZSBsYWJlbCAqLworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9CTEtQR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JwcWV0aGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2JwcWV0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMzVlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnBxZXRoZXIuaApAQCAtMCwwICsxLDQxIEBACisjaWZuZGVmCV9fQlBRRVRIRVJfSAorI2RlZmluZQlfX0JQUUVUSEVSX0gKKworLyoKKyAqIAlEZWZpbmVzIGZvciB0aGUgQlBRRVRIRVIgcHNldWRvIGRldmljZSBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfRVRIRVJfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjZW5kaWYKKworI2RlZmluZSBTSU9DU0JQUUVUSE9QVAkJKFNJT0NERVZQUklWQVRFKzApCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFNJT0NTQlBRRVRIQUREUgkJKFNJT0NERVZQUklWQVRFKzEpCisgCitzdHJ1Y3QgYnBxX2V0aGFkZHIgeworCXVuc2lnbmVkIGNoYXIgZGVzdGluYXRpb25bRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgYWNjZXB0W0VUSF9BTEVOXTsKK307CisKKy8qIAorICogRm9yIFNJT0NTQlBRRVRIT1BUIC0gdGhpcyBpcyBjb21wYXRpYmxlIHdpdGggUEkyL1BhY2tldFR3aW4gY2FyZCBkcml2ZXJzLAorICogY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCwgdGhvdWdoLiBJZiBzb21lb25lIHdhbnRzIHRvIGhvb2sgYSByYWRpbworICogdG8gaGlzIEV0aGVybmV0IGNhcmQgaGUgbWF5IGZpbmQgdGhpcyB1c2VmdWwuIDstKQorICovCisKKyNkZWZpbmUgU0lPQ0dCUFFFVEhQQVJBTQkweDUwMDAgIC8qIGdldCBMZXZlbCAxIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0lPQ1NCUFFFVEhQQVJBTQkweDUwMDEgIC8qIHNldCAqLworCitzdHJ1Y3QgYnBxX3JlcSAgeworICAgIGludCBjbWQ7CisgICAgaW50IHNwZWVkOwkJCS8qIHVudXNlZCAqLworICAgIGludCBjbG9ja21vZGU7CQkvKiB1bnVzZWQgKi8KKyAgICBpbnQgdHhkZWxheTsKKyAgICB1bnNpZ25lZCBjaGFyIHBlcnNpc3Q7CS8qIHVudXNlZCAqLworICAgIGludCBzbG90aW1lOwkJLyogdW51c2VkICovCisgICAgaW50IHNxdWVsZGVsYXk7CisgICAgaW50IGRtYWNoYW47CQkvKiB1bnVzZWQgKi8KKyAgICBpbnQgaXJxOwkJCS8qIHVudXNlZCAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyMTM2OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApAQCAtMCwwICsxLDEwNiBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAorCisjaWZuZGVmIF9fQklHX0VORElBTgorI2RlZmluZSBfX0JJR19FTkRJQU4gNDMyMQorI2VuZGlmCisjaWZuZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBfX0JJR19FTkRJQU5fQklURklFTEQKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgKCAoX19iZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaGwoeCkgKCAoX191MzIpKF9fYmUzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbnMoeCkgKCAoX19iZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgKCAoX191MTYpKF9fYmUxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlNjQoeCkgKCAoX19sZTY0KV9fX2NvbnN0YW50X3N3YWI2NCgoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWI2NCggKF9fdTY0KShfX2xlNjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpICggKF9fbGUzMilfX19jb25zdGFudF9zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMzIoIChfX3UzMikoX19sZTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSAoIChfX2xlMTYpX19fY29uc3RhbnRfc3dhYjE2KCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGUxNl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjE2KCAoX191MTYpKF9fbGUxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlNjQoeCkgKCAoX19iZTY0KShfX3U2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmU2NF90b19jcHUoeCkgKCAoX191NjQpKF9fYmU2NCkoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgKCAoX19iZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCkgKCAoX191MzIpKF9fYmUzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgKCAoX19iZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgKCAoX191MTYpKF9fYmUxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlNjQoeCkgKCAoX19sZTY0KV9fc3dhYjY0KCh4KSkpCisjZGVmaW5lIF9fbGU2NF90b19jcHUoeCkgX19zd2FiNjQoIChfX3U2NCkoX19sZTY0KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoIChfX2xlMzIpX19zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSBfX3N3YWIzMiggKF9fdTMyKShfX2xlMzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpICggKF9fbGUxNilfX3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KCAoX191MTYpKF9fbGUxNikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlNjQoeCkgKCAoX19iZTY0KShfX3U2NCkoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgKCAoX191NjQpKF9fYmU2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKCAoX19iZTMyKShfX3UzMikoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgKCAoX191MzIpKF9fYmUzMikoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgKCAoX19iZTE2KShfX3UxNikoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHUoeCkgKCAoX191MTYpKF9fYmUxNikoeCkpCisKK3N0YXRpYyBfX2lubGluZV9fIF9fbGU2NCBfX2NwdV90b19sZTY0cChjb25zdCBfX3U2NCAqcCkKK3sKKwlyZXR1cm4gIChfX2xlNjQpX19zd2FiNjRwKHApOworfQorc3RhdGljIF9faW5saW5lX18gX191NjQgX19sZTY0X3RvX2NwdXAoY29uc3QgX19sZTY0ICpwKQoreworCXJldHVybiBfX3N3YWI2NHAoKF9fdTY0ICopcCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2xlMzIgX19jcHVfdG9fbGUzMnAoY29uc3QgX191MzIgKnApCit7CisJcmV0dXJuICAoX19sZTMyKV9fc3dhYjMycChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fbGUzMl90b19jcHVwKGNvbnN0IF9fbGUzMiAqcCkKK3sKKwlyZXR1cm4gX19zd2FiMzJwKChfX3UzMiAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19sZTE2IF9fY3B1X3RvX2xlMTZwKGNvbnN0IF9fdTE2ICpwKQoreworCXJldHVybiAgKF9fbGUxNilfX3N3YWIxNnAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2xlMTZfdG9fY3B1cChjb25zdCBfX2xlMTYgKnApCit7CisJcmV0dXJuIF9fc3dhYjE2cCgoX191MTYgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmU2NCBfX2NwdV90b19iZTY0cChjb25zdCBfX3U2NCAqcCkKK3sKKwlyZXR1cm4gIChfX2JlNjQpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX2JlNjRfdG9fY3B1cChjb25zdCBfX2JlNjQgKnApCit7CisJcmV0dXJuICAoX191NjQpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2JlMzIgX19jcHVfdG9fYmUzMnAoY29uc3QgX191MzIgKnApCit7CisJcmV0dXJuICAoX19iZTMyKSpwOworfQorc3RhdGljIF9faW5saW5lX18gX191MzIgX19iZTMyX3RvX2NwdXAoY29uc3QgX19iZTMyICpwKQoreworCXJldHVybiAgKF9fdTMyKSpwOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTE2IF9fY3B1X3RvX2JlMTZwKGNvbnN0IF9fdTE2ICpwKQoreworCXJldHVybiAgKF9fYmUxNikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fYmUxNl90b19jcHVwKGNvbnN0IF9fYmUxNiAqcCkKK3sKKwlyZXR1cm4gIChfX3UxNikqcDsKK30KKyNkZWZpbmUgX19jcHVfdG9fbGU2NHMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fYmU2NF90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19iZTMycyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWQ5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKQEAgLTAsMCArMSw4NyBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorCisvKgorICogbGludXgvYnl0ZW9yZGVyX2dlbmVyaWMuaAorICogR2VuZXJpYyBCeXRlLXJlb3JkZXJpbmcgc3VwcG9ydAorICoKKyAqIFRoZSAiLi4uIHAiIG1hY3JvcywgbGlrZSBsZTY0X3RvX2NwdXAsIGNhbiBiZSB1c2VkIHdpdGggcG9pbnRlcnMKKyAqIHRvIHVuYWxpZ25lZCBkYXRhLCBidXQgdGhlcmUgd2lsbCBiZSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gCisgKiBzb21lIGFyY2hpdGVjdHVyZXMuICBVc2UgZ2V0X3VuYWxpZ25lZCBmb3IgdW5hbGlnbmVkIGRhdGEuCisgKgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MDcwNworICogICAgZ2F0aGVyZWQgYWxsIHRoZSBnb29kIGlkZWFzIGZyb20gYWxsIGFzbS1mb28vYnl0ZW9yZGVyLmggaW50byBvbmUgZmlsZSwKKyAqICAgIGNsZWFuZWQgdGhlbSB1cC4KKyAqICAgIEkgaG9wZSBpdCBpcyBjb21wbGlhbnQgd2l0aCBub24tR0NDIGNvbXBpbGVycy4KKyAqICAgIEkgZGVjaWRlZCB0byBwdXQgX19CWVRFT1JERVJfSEFTX1U2NF9fIGluIGJ5dGVvcmRlci5oLAorICogICAgYmVjYXVzZSBJIHdhc24ndCBzdXJlIGl0IHdvdWxkIGJlIG9rIHRvIHB1dCBpdCBpbiB0eXBlcy5oCisgKiAgICBVcGdyYWRlZCBpdCB0byAyLjEuNDMKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEwMTIKKyAqICAgIFVwZ3JhZGVkIGl0IHRvIDIuMS41NworICogICAgdG8gcGxlYXNlIExpbnVzIFQuLCByZXBsYWNlZCBodWdlICNpZmRlZidzIGJldHdlZW4gbGl0dGxlL2JpZyBlbmRpYW4KKyAqICAgIGJ5IG5lc3RlZGx5ICNpbmNsdWRlJ2QgZmlsZXMuCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMjA1CisgKiAgICBNYWRlIGl0IHRvIDIuMS43MTsgbm93IGEgZmFjZWxpZnQ6CisgKiAgICBQdXQgZmlsZXMgdW5kZXIgaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvCisgKiAgICBTcGxpdCBzd2FiIGZyb20gZ2VuZXJpYyBzdXBwb3J0LgorICoKKyAqIFRPRE86CisgKiAgID0gUmVndWxhciBrZXJuZWwgbWFpbnRhaW5lcnMgY291bGQgYWxzbyByZXBsYWNlIGFsbCB0aGVzZSBtYW51YWwKKyAqICAgIGJ5dGVzd2FwIG1hY3JvcyB0aGF0IHJlbWFpbiwgZGlzc2VtaW5hdGVkIGFtb25nIGRyaXZlcnMsCisgKiAgICBhZnRlciBzb21lIGdyZXAgb3IgdGhlIHNvdXJjZXMuLi4KKyAqICAgPSBMaW51cyBtaWdodCB3YW50IHRvIHJlbmFtZSBhbGwgdGhlc2UgbWFjcm9zIGFuZCBmaWxlcyB0byBmaXQgaGlzIHRhc3RlLAorICogICAgdG8gZml0IGhpcyBwZXJzb25hbCBuYW1pbmcgc2NoZW1lLgorICogICA9IGl0IHNlZW1zIHRoYXQgYSBmZXcgZHJpdmVycyB3b3VsZCBhbHNvIGFwcHJlY2lhdGUKKyAqICAgIG55YmJsZSBzd2FwcGluZyBzdXBwb3J0Li4uCisgKiAgID0gZXZlcnkgYXJjaGl0ZWN0dXJlIGNvdWxkIGFkZCB0aGVpciBieXRlc3dhcCBtYWNybyBpbiBhc20vYnl0ZW9yZGVyLmgKKyAqICAgIHNlZSBob3cgc29tZSBhcmNoaXRlY3R1cmVzIGFscmVhZHkgZG8gKGkzODYsIGFscGhhLCBwcGMsIGV0YykKKyAqICAgPSBjcHVfdG9fYmVYWCBhbmQgYmVYWF90b19jcHUgbWlnaHQgc29tZSBkYXkgbmVlZCB0byBiZSB3ZWxsCisgKiAgICBkaXN0aW5ndWlzaGVkIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4gVGhpcyBpcyBub3QgdGhlIGNhc2UgY3VycmVudGx5LAorICogICAgc2luY2UgbGl0dGxlIGVuZGlhbiwgYmlnIGVuZGlhbiwgYW5kIHBkcCBlbmRpYW4gbWFjaGluZXMgbmVlZG4ndCBpdC4KKyAqICAgIEJ1dCB0aGlzIG1pZ2h0IGJlIHRoZSBjYXNlIGZvciwgc2F5LCBhIHBvcnQgb2YgTGludXggdG8gMjAvMjEgYml0CisgKiAgICBhcmNoaXRlY3R1cmVzIChhbmQgRjIxIExpbnV4IGFkZGljdCBhcm91bmQ/KS4KKyAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHRvIGJlIGRlZmluZWQgYnkgPGFzbS9ieXRlb3JkZXIuaD46CisgKgorICogQ29udmVyc2lvbiBvZiBsb25nIGFuZCBzaG9ydCBpbnQgYmV0d2VlbiBuZXR3b3JrIGFuZCBob3N0IGZvcm1hdAorICoJbnRvaGwoX191MzIgeCkKKyAqCW50b2hzKF9fdTE2IHgpCisgKglodG9ubChfX3UzMiB4KQorICoJaHRvbnMoX191MTYgeCkKKyAqIEl0IHNlZW1zIHRoYXQgc29tZSBwcm9ncmFtcyAod2hpY2g/IHdoZXJlPyBvciBwZXJoYXBzIGEgc3RhbmRhcmQ/IFBPU0lYPykKKyAqIG1pZ2h0IGxpa2UgdGhlIGFib3ZlIHRvIGJlIGZ1bmN0aW9ucywgbm90IG1hY3JvcyAod2h5PykuCisgKiBpZiB0aGF0J3MgdHJ1ZSwgdGhlbiBkZXRlY3QgdGhlbSwgYW5kIHRha2UgbWVhc3VyZXMuCisgKiBBbnl3YXksIHRoZSBtZWFzdXJlIGlzOiBkZWZpbmUgb25seSBfX19udG9obCBhcyBhIG1hY3JvIGluc3RlYWQsCisgKiBhbmQgaW4gYSBzZXBhcmF0ZSBmaWxlLCBoYXZlCisgKiB1bnNpZ25lZCBsb25nIF9faW5saW5lX18gbnRvaGwoeCl7cmV0dXJuIF9fX250b2hsKHgpO30KKyAqCisgKiBUaGUgc2FtZSBmb3IgY29uc3RhbnQgYXJndW1lbnRzCisgKglfX2NvbnN0YW50X250b2hsKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X250b2hzKF9fdTE2IHgpCisgKglfX2NvbnN0YW50X2h0b25sKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X2h0b25zKF9fdTE2IHgpCisgKgorICogQ29udmVyc2lvbiBvZiBYWC1iaXQgaW50ZWdlcnMgKDE2LSAzMi0gb3IgNjQtKQorICogYmV0d2VlbiBuYXRpdmUgQ1BVIGZvcm1hdCBhbmQgbGl0dGxlL2JpZyBlbmRpYW4gZm9ybWF0CisgKiA2NC1iaXQgc3R1ZmYgb25seSBkZWZpbmVkIGZvciBwcm9wZXIgYXJjaGl0ZWN0dXJlcworICoJY3B1X3RvX1tibF1lWFgoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1KF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIGNvbnZlcnQKKyAqCWNwdV90b19bYmxdZVhYcChfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHVwKF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCBjaGFuZ2UgaW4gc2l0dQorICoJY3B1X3RvX1tibF1lWFhzKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdXMoX191WFggeCkKKyAqCisgKiBTZWUgYXNtLWZvby9ieXRlb3JkZXIuaCBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1vcHRpbWl6ZWQgdmVyc2lvbnMKKyAqCisgKi8KKworCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTczZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKQEAgLTAsMCArMSwxMDYgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0gKKworI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEyMzQKKyNlbmRpZgorI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL3N3YWIuaD4KKworI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICggKF9fYmUzMilfX19jb25zdGFudF9zd2FiMzIoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSBfX19jb25zdGFudF9zd2FiMzIoIChfX2JlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpICggKF9fYmUxNilfX19jb25zdGFudF9zd2FiMTYoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9ocyh4KSBfX19jb25zdGFudF9zd2FiMTYoIChfX2JlMTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTY0KHgpICggKF9fbGU2NCkoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlNjRfdG9fY3B1KHgpICggKF9fdTY0KShfX2xlNjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHgpICggKF9fbGUzMikoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpICggKF9fdTMyKShfX2xlMzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpICggKF9fbGUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KHgpICggKF9fdTE2KShfX2xlMTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTY0KHgpICggKF9fYmU2NClfX19jb25zdGFudF9zd2FiNjQoKHgpKSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTY0X3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiNjQoIChfX3U2NCkoX19iZTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmUzMih4KSAoIChfX2JlMzIpX19fY29uc3RhbnRfc3dhYjMyKCh4KSkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUzMl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjMyKCAoX191MzIpKF9fYmUzMikoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoeCkgKCAoX19iZTE2KV9fX2NvbnN0YW50X3N3YWIxNigoeCkpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWIxNiggKF9fdTE2KShfX2JlMTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0KHgpICggKF9fbGU2NCkoX191NjQpKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1KHgpICggKF9fdTY0KShfX2xlNjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMyKHgpICggKF9fbGUzMikoX191MzIpKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpICggKF9fdTMyKShfX2xlMzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2KHgpICggKF9fbGUxNikoX191MTYpKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1KHgpICggKF9fdTE2KShfX2xlMTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0KHgpICggKF9fYmU2NClfX3N3YWI2NCgoeCkpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1KHgpIF9fc3dhYjY0KCAoX191NjQpKF9fYmU2NCkoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzIoeCkgKCAoX19iZTMyKV9fc3dhYjMyKCh4KSkpCisjZGVmaW5lIF9fYmUzMl90b19jcHUoeCkgX19zd2FiMzIoIChfX3UzMikoX19iZTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNih4KSAoIChfX2JlMTYpX19zd2FiMTYoKHgpKSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdSh4KSBfX3N3YWIxNiggKF9fdTE2KShfX2JlMTYpKHgpKQorCitzdGF0aWMgX19pbmxpbmVfXyBfX2xlNjQgX19jcHVfdG9fbGU2NHAoY29uc3QgX191NjQgKnApCit7CisJcmV0dXJuICAoX19sZTY0KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX191NjQgX19sZTY0X3RvX2NwdXAoY29uc3QgX19sZTY0ICpwKQoreworCXJldHVybiAgKF9fdTY0KSpwOworfQorc3RhdGljIF9faW5saW5lX18gX19sZTMyIF9fY3B1X3RvX2xlMzJwKGNvbnN0IF9fdTMyICpwKQoreworCXJldHVybiAgKF9fbGUzMikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fbGUzMl90b19jcHVwKGNvbnN0IF9fbGUzMiAqcCkKK3sKKwlyZXR1cm4gIChfX3UzMikqcDsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fbGUxNiBfX2NwdV90b19sZTE2cChjb25zdCBfX3UxNiAqcCkKK3sKKwlyZXR1cm4gIChfX2xlMTYpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2xlMTZfdG9fY3B1cChjb25zdCBfX2xlMTYgKnApCit7CisJcmV0dXJuICAoX191MTYpKnA7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX2JlNjQgX19jcHVfdG9fYmU2NHAoY29uc3QgX191NjQgKnApCit7CisJcmV0dXJuICAoX19iZTY0KV9fc3dhYjY0cChwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fYmU2NF90b19jcHVwKGNvbnN0IF9fYmU2NCAqcCkKK3sKKwlyZXR1cm4gX19zd2FiNjRwKChfX3U2NCAqKXApOworfQorc3RhdGljIF9faW5saW5lX18gX19iZTMyIF9fY3B1X3RvX2JlMzJwKGNvbnN0IF9fdTMyICpwKQoreworCXJldHVybiAgKF9fYmUzMilfX3N3YWIzMnAocCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX2JlMzJfdG9fY3B1cChjb25zdCBfX2JlMzIgKnApCit7CisJcmV0dXJuIF9fc3dhYjMycCgoX191MzIgKilwKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fYmUxNiBfX2NwdV90b19iZTE2cChjb25zdCBfX3UxNiAqcCkKK3sKKwlyZXR1cm4gIChfX2JlMTYpX19zd2FiMTZwKHApOworfQorc3RhdGljIF9faW5saW5lX18gX191MTYgX19iZTE2X3RvX2NwdXAoY29uc3QgX19iZTE2ICpwKQoreworCXJldHVybiBfX3N3YWIxNnAoKF9fdTE2ICopcCk7Cit9CisjZGVmaW5lIF9fY3B1X3RvX2xlNjRzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fbGUzMl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19sZTE2cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlNjRzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHVzKHgpIF9fc3dhYjY0cygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fYmUzMl90b19jcHVzKHgpIF9fc3dhYjMycygoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTZzKHgpIF9fc3dhYjE2cygoeCkpCisjZGVmaW5lIF9fYmUxNl90b19jcHVzKHgpIF9fc3dhYjE2cygoeCkpCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorCisjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9MSVRUTEVfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFmOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCkBAIC0wLDAgKzEsMjEwIEBACisjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfU1dBQl9ICisjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfU1dBQl9ICisKKy8qCisgKiBsaW51eC9ieXRlb3JkZXIvc3dhYi5oCisgKiBCeXRlLXN3YXBwaW5nLCBpbmRlcGVuZGVudGx5IGZyb20gQ1BVIGVuZGlhbm5lc3MKKyAqCXN3YWJYWFtwc10/KGZvbykKKyAqCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMjA1CisgKiAgICBzZXBhcmF0ZWQgc3dhYiBmdW5jdGlvbnMgZnJvbSBjcHVfdG9fWFgsCisgKiAgICB0byBjbGVhbiB1cCBzdXBwb3J0IGZvciBiaXphcnJlLWVuZGlhbiBhcmNoaXRlY3R1cmVzLgorICoKKyAqIFRyZW50IFBpZXBobyA8eHl6enlAc3BlYWtlYXN5Lm9yZz4gMjAwNzExNAorICogICAgbWFrZSBjb25zdGFudC1mb2xkaW5nIHdvcmssIHByb3ZpZGUgQyB2ZXJzaW9ucyB0aGF0CisgKiAgICBnY2MgY2FuIG9wdGltaXplIGJldHRlciwgZXhwbGFpbiBkaWZmZXJlbnQgdmVyc2lvbnMKKyAqCisgKiBTZWUgYXNtLWkzODYvYnl0ZW9yZGVyLmggYW5kIHN1Y2hlcyBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgb3B0aW1pemVkIHZlcnNpb25zCisgKgorICovCisKKworLyogRnVuY3Rpb25zL21hY3JvcyBkZWZpbmVkLCB0aGVyZSBhcmUgYSBsb3Q6CisgKgorICogX19fc3dhYlhYCisgKiAgICBHZW5lcmljIEMgdmVyc2lvbnMgb2YgdGhlIHN3YWIgZnVuY3Rpb25zLgorICoKKyAqIF9fX2NvbnN0YW50X3N3YWJYWAorICogICAgQyB2ZXJzaW9ucyB0aGF0IGdjYyBjYW4gZm9sZCBpbnRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IHdoZW4KKyAqICAgIHRoZSBhcmd1bWVudCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4KKyAqCisgKiBfX2FyY2hfX3N3YWJYWFtzcF0/CisgKiAgICBBcmNoaXRlY3R1cmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIGFsbCB0aGUgc3dhYiBmdW5jdGlvbnMKKyAqICAgIChpbmNsdWRpbmcgdGhlIHMgYW5kIHAgdmVyc2lvbnMpLiAgVGhlc2UgY2FuIGJlIGRlZmluZWQgaW4KKyAqICAgIGFzbS1hcmNoL2J5dGVvcmRlci5oLiAgQW55IHdoaWNoIGFyZSBub3QsIGFyZSBkZWZpbmVkIGhlcmUuCisgKiAgICBfX2FyY2hfX3N3YWJYWHMoKSBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIF9fYXJjaF9fc3dhYlhYcCgpLCB3aGljaAorICogICAgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBfX2FyY2hfX3N3YWJYWCgpLCB3aGljaCBpcyBpbiB0dXJuIGRlZmluZWQKKyAqICAgIGluIHRlcm1zIG9mIF9fX3N3YWJYWCh4KS4KKyAqICAgIFRoZXNlIG11c3QgYmUgbWFjcm9zLiAgVGhleSBtYXkgYmUgdW5zYWZlIGZvciBhcmd1bWVudHMgd2l0aAorICogICAgc2lkZS1lZmZlY3RzLgorICoKKyAqIF9fZnN3YWJYWAorICogICAgSW5saW5lIGZ1bmN0aW9uIHZlcnNpb25zIG9mIHRoZSBfX2FyY2hfXyBtYWNyb3MuICBUaGVzZSBfYXJlXyBzYWZlCisgKiAgICBpZiB0aGUgYXJndW1lbnRzIGhhdmUgc2lkZS1lZmZlY3RzLiAgTm90ZSB0aGVyZSBhcmUgbm8gcyBhbmQgcAorICogICAgdmVyc2lvbnMgb2YgdGhlc2UuCisgKgorICogX19zd2FiWFhbc2JdCisgKiAgICBUaGVyZSBhcmUgdGhlIG9uZXMgeW91IHNob3VsZCBhY3R1YWxseSB1c2UuICBUaGUgX19zd2FiWFggdmVyc2lvbnMKKyAqICAgIHdpbGwgYmUgYSBjb25zdGFudCBnaXZlbiBhIGNvbnN0YW50IGFyZ3VtZW50IGFuZCB1c2UgdGhlIGFyY2gKKyAqICAgIHNwZWNpZmljIGNvZGUgKGlmIGFueSkgZm9yIG5vbi1jb25zdGFudCBhcmd1bWVudHMuICBUaGUgcyBhbmQgcAorICogICAgdmVyc2lvbnMgYWx3YXlzIHVzZSB0aGUgYXJjaCBzcGVjaWZpYyBjb2RlIChjb25zdGFudCBmb2xkaW5nCisgKiAgICBkb2Vzbid0IGFwcGx5KS4gIFRoZXkgYXJlIHNhZmUgdG8gdXNlIHdpdGggYXJndW1lbnRzIHdpdGgKKyAqICAgIHNpZGUtZWZmZWN0cy4KKyAqCisgKiBzd2FiWFhbc2JdCisgKiAgICBOaWNrbmFtZXMgZm9yIF9fc3dhYlhYW3NiXSB0byB1c2UgaW4gdGhlIGtlcm5lbC4KKyAqLworCisvKiBjYXN0cyBhcmUgbmVjZXNzYXJ5IGZvciBjb25zdGFudHMsIGJlY2F1c2Ugd2UgbmV2ZXIga25vdyBob3cgZm9yIHN1cmUKKyAqIGhvdyBVL1VML1VMTCBtYXAgdG8gX191MTYsIF9fdTMyLCBfX3U2NC4gQXQgbGVhc3Qgbm90IGluIGEgcG9ydGFibGUgd2F5LgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIF9fdTE2IF9fX3N3YWIxNihfX3UxNiB4KQoreworCXJldHVybiB4PDw4IHwgeD4+ODsKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIF9fX3N3YWIzMihfX3UzMiB4KQoreworCXJldHVybiB4PDwyNCB8IHg+PjI0IHwKKwkJKHggJiAoX191MzIpMHgwMDAwZmYwMFVMKTw8OCB8CisJCSh4ICYgKF9fdTMyKTB4MDBmZjAwMDBVTCk+Pjg7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3U2NCBfX19zd2FiNjQoX191NjQgeCkKK3sKKwlyZXR1cm4geDw8NTYgfCB4Pj41NiB8CisJCSh4ICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCk8PDQwIHwKKwkJKHggJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKTw8MjQgfAorCQkoeCAmIChfX3U2NCkweDAwMDAwMDAwZmYwMDAwMDBVTEwpPDwgOCB8CisJICAgICAgICAoeCAmIChfX3U2NCkweDAwMDAwMGZmMDAwMDAwMDBVTEwpPj4gOCB8CisJCSh4ICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCk+PjI0IHwKKwkJKHggJiAoX191NjQpMHgwMGZmMDAwMDAwMDAwMDAwVUxMKT4+NDA7Cit9CisKKyNkZWZpbmUgX19fY29uc3RhbnRfc3dhYjE2KHgpIFwKKwkoKF9fdTE2KSggXAorCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHgwMGZmVSkgPDwgOCkgfCBcCisJCSgoKF9fdTE2KSh4KSAmIChfX3UxNikweGZmMDBVKSA+PiA4KSApKQorI2RlZmluZSBfX19jb25zdGFudF9zd2FiMzIoeCkgXAorCSgoX191MzIpKCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDI0KSB8IFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweGZmMDAwMDAwVUwpID4+IDI0KSApKQorI2RlZmluZSBfX19jb25zdGFudF9zd2FiNjQoeCkgXAorCSgoX191NjQpKCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDAwMGZmVUxMKSA8PCA1NikgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwMDBmZjAwVUxMKSA8PCA0MCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisJCShfX3U2NCkoKChfX3U2NCkoeCkgJiAoX191NjQpMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCBcCisJICAgICAgICAoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCisKKy8qCisgKiBwcm92aWRlIGRlZmF1bHRzIHdoZW4gbm8gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGltaXphdGlvbiBpcyBkZXRlY3RlZAorICovCisjaWZuZGVmIF9fYXJjaF9fc3dhYjE2CisjICBkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fc3dhYjE2KHgpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzIKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19zd2FiMzIoeCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NAorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9fX3N3YWI2NCh4KQorI2VuZGlmCisKKyNpZm5kZWYgX19hcmNoX19zd2FiMTZwCisjICBkZWZpbmUgX19hcmNoX19zd2FiMTZwKHgpIF9fYXJjaF9fc3dhYjE2KCooeCkpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzJwCisjICBkZWZpbmUgX19hcmNoX19zd2FiMzJwKHgpIF9fYXJjaF9fc3dhYjMyKCooeCkpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiNjRwCisjICBkZWZpbmUgX19hcmNoX19zd2FiNjRwKHgpIF9fYXJjaF9fc3dhYjY0KCooeCkpCisjZW5kaWYKKworI2lmbmRlZiBfX2FyY2hfX3N3YWIxNnMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNnMoeCkgKCh2b2lkKSgqKHgpID0gX19hcmNoX19zd2FiMTZwKHgpKSkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWIzMnMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMnMoeCkgKCh2b2lkKSgqKHgpID0gX19hcmNoX19zd2FiMzJwKHgpKSkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NHMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWI2NHMoeCkgKCh2b2lkKSgqKHgpID0gX19hcmNoX19zd2FiNjRwKHgpKSkKKyNlbmRpZgorCisKKy8qCisgKiBBbGxvdyBjb25zdGFudCBmb2xkaW5nCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fT1BUSU1JWkVfXykKKyMgIGRlZmluZSBfX3N3YWIxNih4KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTE2KSh4KSkgPyBcCisgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkgOiBcCisgX19mc3dhYjE2KCh4KSkpCisjICBkZWZpbmUgX19zd2FiMzIoeCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UzMikoeCkpID8gXAorIF9fX2NvbnN0YW50X3N3YWIzMigoeCkpIDogXAorIF9fZnN3YWIzMigoeCkpKQorIyAgZGVmaW5lIF9fc3dhYjY0KHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191NjQpKHgpKSA/IFwKKyBfX19jb25zdGFudF9zd2FiNjQoKHgpKSA6IFwKKyBfX2Zzd2FiNjQoKHgpKSkKKyNlbHNlCisjICBkZWZpbmUgX19zd2FiMTYoeCkgX19mc3dhYjE2KHgpCisjICBkZWZpbmUgX19zd2FiMzIoeCkgX19mc3dhYjMyKHgpCisjICBkZWZpbmUgX19zd2FiNjQoeCkgX19mc3dhYjY0KHgpCisjZW5kaWYgLyogT1BUSU1JWkUgKi8KKworCitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX2Zzd2FiMTYoX191MTYgeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMTYoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX3N3YWIxNnAoY29uc3QgX191MTYgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjE2cCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMTZzKF9fdTE2ICphZGRyKQoreworCV9fYXJjaF9fc3dhYjE2cyhhZGRyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX191MzIgX19mc3dhYjMyKF9fdTMyIHgpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjMyKHgpOworfQorc3RhdGljIF9faW5saW5lX18gX191MzIgX19zd2FiMzJwKGNvbnN0IF9fdTMyICp4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWIzMnAoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjMycyhfX3UzMiAqYWRkcikKK3sKKwlfX2FyY2hfX3N3YWIzMnMoYWRkcik7Cit9CisKKyNpZmRlZiBfX0JZVEVPUkRFUl9IQVNfVTY0X18KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fZnN3YWI2NChfX3U2NCB4KQoreworIyAgaWZkZWYgX19TV0FCXzY0X1RIUlVfMzJfXworCV9fdTMyIGggPSB4ID4+IDMyOworICAgICAgICBfX3UzMiBsID0geCAmICgoMVVMTDw8MzIpLTEpOworICAgICAgICByZXR1cm4gKCgoX191NjQpX19zd2FiMzIobCkpIDw8IDMyKSB8ICgoX191NjQpKF9fc3dhYjMyKGgpKSk7CisjICBlbHNlCisJcmV0dXJuIF9fYXJjaF9fc3dhYjY0KHgpOworIyAgZW5kaWYKK30KK3N0YXRpYyBfX2lubGluZV9fIF9fdTY0IF9fc3dhYjY0cChjb25zdCBfX3U2NCAqeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiNjRwKHgpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3N3YWI2NHMoX191NjQgKmFkZHIpCit7CisJX19hcmNoX19zd2FiNjRzKGFkZHIpOworfQorI2VuZGlmIC8qIF9fQllURU9SREVSX0hBU19VNjRfXyAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTUwZmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBUaGlzIGlzIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisgKgorICogQW5kcmV3IEcuIE1vcmdhbiA8bW9yZ2FuQGtlcm5lbC5vcmc+CisgKiBBbGV4YW5kZXIgS2plbGRhYXMgPGFzdG9yQGd1YXJkaWFuLm5vPgorICogd2l0aCBoZWxwIGZyb20gQWxlcGgxLCBSb2xhbmQgQnVyZXN1bmQgYW5kIEFuZHJldyBNYWluLgorICoKKyAqIFNlZSBoZXJlIGZvciB0aGUgbGliY2FwIGxpYnJhcnkgKCJQT1NJWCBkcmFmdCIgY29tcGxpYW5jZSk6CisgKgorICogZnRwOi8vbGludXgua2VybmVsLm9yZy9wdWIvbGludXgvbGlicy9zZWN1cml0eS9saW51eC1wcml2cy9rZXJuZWwtMi42LworICovCisKKyNpZm5kZWYgX0xJTlVYX0NBUEFCSUxJVFlfSAorI2RlZmluZSBfTElOVVhfQ0FQQUJJTElUWV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKKy8qIFVzZXItbGV2ZWwgZG8gbW9zdCBvZiB0aGUgbWFwcGluZyBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlcgorICAgY2FwYWJpbGl0aWVzIGJhc2VkIG9uIHRoZSB2ZXJzaW9uIHRhZyBnaXZlbiBieSB0aGUga2VybmVsLiBUaGUKKyAgIGtlcm5lbCBtaWdodCBiZSBzb21ld2hhdCBiYWNrd2FyZHMgY29tcGF0aWJsZSwgYnV0IGRvbid0IGJldCBvbgorICAgaXQuICovCisKKy8qIFhYWCAtIE5vdGUsIGNhcF90LCBpcyBkZWZpbmVkIGJ5IFBPU0lYIHRvIGJlIGFuICJvcGFxdWUiIHBvaW50ZXIgdG8KKyAgIGEgc2V0IG9mIHRocmVlIGNhcGFiaWxpdHkgc2V0cy4gIFRoZSB0cmFuc3Bvc2l0aW9uIG9mIDMqdGhlCisgICBmb2xsb3dpbmcgc3RydWN0dXJlIHRvIHN1Y2ggYSBjb21wb3NpdGUgaXMgYmV0dGVyIGhhbmRsZWQgaW4gYSB1c2VyCisgICBsaWJyYXJ5IHNpbmNlIHRoZSBkcmFmdCBzdGFuZGFyZCByZXF1aXJlcyB0aGUgdXNlIG9mIG1hbGxvYy9mcmVlCisgICBldGMuLiAqLworCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gIDB4MTk5ODAzMzAKKwordHlwZWRlZiBzdHJ1Y3QgX191c2VyX2NhcF9oZWFkZXJfc3RydWN0IHsKKwlfX3UzMiB2ZXJzaW9uOworCWludCBwaWQ7Cit9ICpjYXBfdXNlcl9oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX191c2VyX2NhcF9kYXRhX3N0cnVjdCB7CisgICAgICAgIF9fdTMyIGVmZmVjdGl2ZTsKKyAgICAgICAgX191MzIgcGVybWl0dGVkOworICAgICAgICBfX3UzMiBpbmhlcml0YWJsZTsKK30gKmNhcF91c2VyX2RhdGFfdDsKKworI2RlZmluZSBYQVRUUl9DQVBTX1NVRkZJWCAiY2FwYWJpbGl0eSIKKyNkZWZpbmUgWEFUVFJfTkFNRV9DQVBTIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9DQVBTX1NVRkZJWAorCisjZGVmaW5lIFhBVFRSX0NBUFNfU1ogKDMqc2l6ZW9mKF9fbGUzMikpCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fTUFTSwkweEZGMDAwMDAwCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fMQkweDAxMDAwMDAwCisKKyNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTglWRlNfQ0FQX1JFVklTSU9OXzEKKworI2RlZmluZSBWRlNfQ0FQX0ZMQUdTX01BU0sJflZGU19DQVBfUkVWSVNJT05fTUFTSworI2RlZmluZSBWRlNfQ0FQX0ZMQUdTX0VGRkVDVElWRQkweDAwMDAwMQorCitzdHJ1Y3QgdmZzX2NhcF9kYXRhIHsKKwlfX3UzMiBtYWdpY19ldGM7ICAvKiBMaXR0bGUgZW5kaWFuICovCisJX191MzIgcGVybWl0dGVkOyAgICAvKiBMaXR0bGUgZW5kaWFuICovCisJX191MzIgaW5oZXJpdGFibGU7ICAvKiBMaXR0bGUgZW5kaWFuICovCit9OworCisKKworLyoqCisgKiogUE9TSVgtZHJhZnQgZGVmaW5lZCBjYXBhYmlsaXRpZXMuCisgKiovCisKKy8qIEluIGEgc3lzdGVtIHdpdGggdGhlIFtfUE9TSVhfQ0hPV05fUkVTVFJJQ1RFRF0gb3B0aW9uIGRlZmluZWQsIHRoaXMKKyAgIG92ZXJyaWRlcyB0aGUgcmVzdHJpY3Rpb24gb2YgY2hhbmdpbmcgZmlsZSBvd25lcnNoaXAgYW5kIGdyb3VwCisgICBvd25lcnNoaXAuICovCisKKyNkZWZpbmUgQ0FQX0NIT1dOICAgICAgICAgICAgMAorCisvKiBPdmVycmlkZSBhbGwgREFDIGFjY2VzcywgaW5jbHVkaW5nIEFDTCBleGVjdXRlIGFjY2VzcyBpZgorICAgW19QT1NJWF9BQ0xdIGlzIGRlZmluZWQuIEV4Y2x1ZGluZyBEQUMgYWNjZXNzIGNvdmVyZWQgYnkKKyAgIENBUF9MSU5VWF9JTU1VVEFCTEUuICovCisKKyNkZWZpbmUgQ0FQX0RBQ19PVkVSUklERSAgICAgMQorCisvKiBPdmVycmlkZXMgYWxsIERBQyByZXN0cmljdGlvbnMgcmVnYXJkaW5nIHJlYWQgYW5kIHNlYXJjaCBvbiBmaWxlcworICAgYW5kIGRpcmVjdG9yaWVzLCBpbmNsdWRpbmcgQUNMIHJlc3RyaWN0aW9ucyBpZiBbX1BPU0lYX0FDTF0gaXMKKyAgIGRlZmluZWQuIEV4Y2x1ZGluZyBEQUMgYWNjZXNzIGNvdmVyZWQgYnkgQ0FQX0xJTlVYX0lNTVVUQUJMRS4gKi8KKworI2RlZmluZSBDQVBfREFDX1JFQURfU0VBUkNIICAyCisKKy8qIE92ZXJyaWRlcyBhbGwgcmVzdHJpY3Rpb25zIGFib3V0IGFsbG93ZWQgb3BlcmF0aW9ucyBvbiBmaWxlcywgd2hlcmUKKyAgIGZpbGUgb3duZXIgSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgdXNlciBJRCwgZXhjZXB0IHdoZXJlIENBUF9GU0VUSUQKKyAgIGlzIGFwcGxpY2FibGUuIEl0IGRvZXNuJ3Qgb3ZlcnJpZGUgTUFDIGFuZCBEQUMgcmVzdHJpY3Rpb25zLiAqLworCisjZGVmaW5lIENBUF9GT1dORVIgICAgICAgICAgIDMKKworLyogT3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zIHRoYXQgdGhlIGVmZmVjdGl2ZSB1c2VyIElECisgICBzaGFsbCBtYXRjaCB0aGUgZmlsZSBvd25lciBJRCB3aGVuIHNldHRpbmcgdGhlIFNfSVNVSUQgYW5kIFNfSVNHSUQKKyAgIGJpdHMgb24gdGhhdCBmaWxlOyB0aGF0IHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgKG9yIG9uZSBvZiB0aGUKKyAgIHN1cHBsZW1lbnRhcnkgZ3JvdXAgSURzKSBzaGFsbCBtYXRjaCB0aGUgZmlsZSBvd25lciBJRCB3aGVuIHNldHRpbmcKKyAgIHRoZSBTX0lTR0lEIGJpdCBvbiB0aGF0IGZpbGU7IHRoYXQgdGhlIFNfSVNVSUQgYW5kIFNfSVNHSUQgYml0cyBhcmUKKyAgIGNsZWFyZWQgb24gc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBjaG93bigyKSAobm90IGltcGxlbWVudGVkKS4gKi8KKworI2RlZmluZSBDQVBfRlNFVElEICAgICAgICAgICA0CisKKy8qIFVzZWQgdG8gZGVjaWRlIGJldHdlZW4gZmFsbGluZyBiYWNrIG9uIHRoZSBvbGQgc3VzZXIoKSBvciBmc3VzZXIoKS4gKi8KKworI2RlZmluZSBDQVBfRlNfTUFTSyAgICAgICAgICAweDFmCisKKy8qIE92ZXJyaWRlcyB0aGUgcmVzdHJpY3Rpb24gdGhhdCB0aGUgcmVhbCBvciBlZmZlY3RpdmUgdXNlciBJRCBvZiBhCisgICBwcm9jZXNzIHNlbmRpbmcgYSBzaWduYWwgbXVzdCBtYXRjaCB0aGUgcmVhbCBvciBlZmZlY3RpdmUgdXNlciBJRAorICAgb2YgdGhlIHByb2Nlc3MgcmVjZWl2aW5nIHRoZSBzaWduYWwuICovCisKKyNkZWZpbmUgQ0FQX0tJTEwgICAgICAgICAgICAgNQorCisvKiBBbGxvd3Mgc2V0Z2lkKDIpIG1hbmlwdWxhdGlvbiAqLworLyogQWxsb3dzIHNldGdyb3VwcygyKSAqLworLyogQWxsb3dzIGZvcmdlZCBnaWRzIG9uIHNvY2tldCBjcmVkZW50aWFscyBwYXNzaW5nLiAqLworCisjZGVmaW5lIENBUF9TRVRHSUQgICAgICAgICAgIDYKKworLyogQWxsb3dzIHNldCp1aWQoMikgbWFuaXB1bGF0aW9uIChpbmNsdWRpbmcgZnN1aWQpLiAqLworLyogQWxsb3dzIGZvcmdlZCBwaWRzIG9uIHNvY2tldCBjcmVkZW50aWFscyBwYXNzaW5nLiAqLworCisjZGVmaW5lIENBUF9TRVRVSUQgICAgICAgICAgIDcKKworCisvKioKKyAqKiBMaW51eC1zcGVjaWZpYyBjYXBhYmlsaXRpZXMKKyAqKi8KKworLyogVHJhbnNmZXIgYW55IGNhcGFiaWxpdHkgaW4geW91ciBwZXJtaXR0ZWQgc2V0IHRvIGFueSBwaWQsCisgICByZW1vdmUgYW55IGNhcGFiaWxpdHkgaW4geW91ciBwZXJtaXR0ZWQgc2V0IGZyb20gYW55IHBpZCAqLworCisjZGVmaW5lIENBUF9TRVRQQ0FQICAgICAgICAgIDgKKworLyogQWxsb3cgbW9kaWZpY2F0aW9uIG9mIFNfSU1NVVRBQkxFIGFuZCBTX0FQUEVORCBmaWxlIGF0dHJpYnV0ZXMgKi8KKworI2RlZmluZSBDQVBfTElOVVhfSU1NVVRBQkxFICA5CisKKy8qIEFsbG93cyBiaW5kaW5nIHRvIFRDUC9VRFAgc29ja2V0cyBiZWxvdyAxMDI0ICovCisvKiBBbGxvd3MgYmluZGluZyB0byBBVE0gVkNJcyBiZWxvdyAzMiAqLworCisjZGVmaW5lIENBUF9ORVRfQklORF9TRVJWSUNFIDEwCisKKy8qIEFsbG93IGJyb2FkY2FzdGluZywgbGlzdGVuIHRvIG11bHRpY2FzdCAqLworCisjZGVmaW5lIENBUF9ORVRfQlJPQURDQVNUICAgIDExCisKKy8qIEFsbG93IGludGVyZmFjZSBjb25maWd1cmF0aW9uICovCisvKiBBbGxvdyBhZG1pbmlzdHJhdGlvbiBvZiBJUCBmaXJld2FsbCwgbWFzcXVlcmFkaW5nIGFuZCBhY2NvdW50aW5nICovCisvKiBBbGxvdyBzZXR0aW5nIGRlYnVnIG9wdGlvbiBvbiBzb2NrZXRzICovCisvKiBBbGxvdyBtb2RpZmljYXRpb24gb2Ygcm91dGluZyB0YWJsZXMgKi8KKy8qIEFsbG93IHNldHRpbmcgYXJiaXRyYXJ5IHByb2Nlc3MgLyBwcm9jZXNzIGdyb3VwIG93bmVyc2hpcCBvbgorICAgc29ja2V0cyAqLworLyogQWxsb3cgYmluZGluZyB0byBhbnkgYWRkcmVzcyBmb3IgdHJhbnNwYXJlbnQgcHJveHlpbmcgKi8KKy8qIEFsbG93IHNldHRpbmcgVE9TICh0eXBlIG9mIHNlcnZpY2UpICovCisvKiBBbGxvdyBzZXR0aW5nIHByb21pc2N1b3VzIG1vZGUgKi8KKy8qIEFsbG93IGNsZWFyaW5nIGRyaXZlciBzdGF0aXN0aWNzICovCisvKiBBbGxvdyBtdWx0aWNhc3RpbmcgKi8KKy8qIEFsbG93IHJlYWQvd3JpdGUgb2YgZGV2aWNlLXNwZWNpZmljIHJlZ2lzdGVycyAqLworLyogQWxsb3cgYWN0aXZhdGlvbiBvZiBBVE0gY29udHJvbCBzb2NrZXRzICovCisKKyNkZWZpbmUgQ0FQX05FVF9BRE1JTiAgICAgICAgMTIKKworLyogQWxsb3cgdXNlIG9mIFJBVyBzb2NrZXRzICovCisvKiBBbGxvdyB1c2Ugb2YgUEFDS0VUIHNvY2tldHMgKi8KKworI2RlZmluZSBDQVBfTkVUX1JBVyAgICAgICAgICAxMworCisvKiBBbGxvdyBsb2NraW5nIG9mIHNoYXJlZCBtZW1vcnkgc2VnbWVudHMgKi8KKy8qIEFsbG93IG1sb2NrIGFuZCBtbG9ja2FsbCAod2hpY2ggZG9lc24ndCByZWFsbHkgaGF2ZSBhbnl0aGluZyB0byBkbworICAgd2l0aCBJUEMpICovCisKKyNkZWZpbmUgQ0FQX0lQQ19MT0NLICAgICAgICAgMTQKKworLyogT3ZlcnJpZGUgSVBDIG93bmVyc2hpcCBjaGVja3MgKi8KKworI2RlZmluZSBDQVBfSVBDX09XTkVSICAgICAgICAxNQorCisvKiBJbnNlcnQgYW5kIHJlbW92ZSBrZXJuZWwgbW9kdWxlcyAtIG1vZGlmeSBrZXJuZWwgd2l0aG91dCBsaW1pdCAqLworLyogTW9kaWZ5IGNhcF9ic2V0ICovCisjZGVmaW5lIENBUF9TWVNfTU9EVUxFICAgICAgIDE2CisKKy8qIEFsbG93IGlvcGVybS9pb3BsIGFjY2VzcyAqLworLyogQWxsb3cgc2VuZGluZyBVU0IgbWVzc2FnZXMgdG8gYW55IGRldmljZSB2aWEgL3Byb2MvYnVzL3VzYiAqLworCisjZGVmaW5lIENBUF9TWVNfUkFXSU8gICAgICAgIDE3CisKKy8qIEFsbG93IHVzZSBvZiBjaHJvb3QoKSAqLworCisjZGVmaW5lIENBUF9TWVNfQ0hST09UICAgICAgIDE4CisKKy8qIEFsbG93IHB0cmFjZSgpIG9mIGFueSBwcm9jZXNzICovCisKKyNkZWZpbmUgQ0FQX1NZU19QVFJBQ0UgICAgICAgMTkKKworLyogQWxsb3cgY29uZmlndXJhdGlvbiBvZiBwcm9jZXNzIGFjY291bnRpbmcgKi8KKworI2RlZmluZSBDQVBfU1lTX1BBQ0NUICAgICAgICAyMAorCisvKiBBbGxvdyBjb25maWd1cmF0aW9uIG9mIHRoZSBzZWN1cmUgYXR0ZW50aW9uIGtleSAqLworLyogQWxsb3cgYWRtaW5pc3RyYXRpb24gb2YgdGhlIHJhbmRvbSBkZXZpY2UgKi8KKy8qIEFsbG93IGV4YW1pbmF0aW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIGRpc2sgcXVvdGFzICovCisvKiBBbGxvdyBjb25maWd1cmluZyB0aGUga2VybmVsJ3Mgc3lzbG9nIChwcmludGsgYmVoYXZpb3VyKSAqLworLyogQWxsb3cgc2V0dGluZyB0aGUgZG9tYWlubmFtZSAqLworLyogQWxsb3cgc2V0dGluZyB0aGUgaG9zdG5hbWUgKi8KKy8qIEFsbG93IGNhbGxpbmcgYmRmbHVzaCgpICovCisvKiBBbGxvdyBtb3VudCgpIGFuZCB1bW91bnQoKSwgc2V0dGluZyB1cCBuZXcgc21iIGNvbm5lY3Rpb24gKi8KKy8qIEFsbG93IHNvbWUgYXV0b2ZzIHJvb3QgaW9jdGxzICovCisvKiBBbGxvdyBuZnNzZXJ2Y3RsICovCisvKiBBbGxvdyBWTTg2X1JFUVVFU1RfSVJRICovCisvKiBBbGxvdyB0byByZWFkL3dyaXRlIHBjaSBjb25maWcgb24gYWxwaGEgKi8KKy8qIEFsbG93IGlyaXhfcHJjdGwgb24gbWlwcyAoc2V0c3RhY2tzaXplKSAqLworLyogQWxsb3cgZmx1c2hpbmcgYWxsIGNhY2hlIG9uIG02OGsgKHN5c19jYWNoZWZsdXNoKSAqLworLyogQWxsb3cgcmVtb3Zpbmcgc2VtYXBob3JlcyAqLworLyogVXNlZCBpbnN0ZWFkIG9mIENBUF9DSE9XTiB0byAiY2hvd24iIElQQyBtZXNzYWdlIHF1ZXVlcywgc2VtYXBob3JlcworICAgYW5kIHNoYXJlZCBtZW1vcnkgKi8KKy8qIEFsbG93IGxvY2tpbmcvdW5sb2NraW5nIG9mIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAqLworLyogQWxsb3cgdHVybmluZyBzd2FwIG9uL29mZiAqLworLyogQWxsb3cgZm9yZ2VkIHBpZHMgb24gc29ja2V0IGNyZWRlbnRpYWxzIHBhc3NpbmcgKi8KKy8qIEFsbG93IHNldHRpbmcgcmVhZGFoZWFkIGFuZCBmbHVzaGluZyBidWZmZXJzIG9uIGJsb2NrIGRldmljZXMgKi8KKy8qIEFsbG93IHNldHRpbmcgZ2VvbWV0cnkgaW4gZmxvcHB5IGRyaXZlciAqLworLyogQWxsb3cgdHVybmluZyBETUEgb24vb2ZmIGluIHhkIGRyaXZlciAqLworLyogQWxsb3cgYWRtaW5pc3RyYXRpb24gb2YgbWQgZGV2aWNlcyAobW9zdGx5IHRoZSBhYm92ZSwgYnV0IHNvbWUKKyAgIGV4dHJhIGlvY3RscykgKi8KKy8qIEFsbG93IHR1bmluZyB0aGUgaWRlIGRyaXZlciAqLworLyogQWxsb3cgYWNjZXNzIHRvIHRoZSBudnJhbSBkZXZpY2UgKi8KKy8qIEFsbG93IGFkbWluaXN0cmF0aW9uIG9mIGFwbV9iaW9zLCBzZXJpYWwgYW5kIGJ0dHYgKFRWKSBkZXZpY2UgKi8KKy8qIEFsbG93IG1hbnVmYWN0dXJlciBjb21tYW5kcyBpbiBpc2RuIENBUEkgc3VwcG9ydCBkcml2ZXIgKi8KKy8qIEFsbG93IHJlYWRpbmcgbm9uLXN0YW5kYXJkaXplZCBwb3J0aW9ucyBvZiBwY2kgY29uZmlndXJhdGlvbiBzcGFjZSAqLworLyogQWxsb3cgRERJIGRlYnVnIGlvY3RsIG9uIHNicGNkIGRyaXZlciAqLworLyogQWxsb3cgc2V0dGluZyB1cCBzZXJpYWwgcG9ydHMgKi8KKy8qIEFsbG93IHNlbmRpbmcgcmF3IHFpYy0xMTcgY29tbWFuZHMgKi8KKy8qIEFsbG93IGVuYWJsaW5nL2Rpc2FibGluZyB0YWdnZWQgcXVldWluZyBvbiBTQ1NJIGNvbnRyb2xsZXJzIGFuZCBzZW5kaW5nCisgICBhcmJpdHJhcnkgU0NTSSBjb21tYW5kcyAqLworLyogQWxsb3cgc2V0dGluZyBlbmNyeXB0aW9uIGtleSBvbiBsb29wYmFjayBmaWxlc3lzdGVtICovCisvKiBBbGxvdyBzZXR0aW5nIHpvbmUgcmVjbGFpbSBwb2xpY3kgKi8KKworI2RlZmluZSBDQVBfU1lTX0FETUlOICAgICAgICAyMQorCisvKiBBbGxvdyB1c2Ugb2YgcmVib290KCkgKi8KKworI2RlZmluZSBDQVBfU1lTX0JPT1QgICAgICAgICAyMgorCisvKiBBbGxvdyByYWlzaW5nIHByaW9yaXR5IGFuZCBzZXR0aW5nIHByaW9yaXR5IG9uIG90aGVyIChkaWZmZXJlbnQKKyAgIFVJRCkgcHJvY2Vzc2VzICovCisvKiBBbGxvdyB1c2Ugb2YgRklGTyBhbmQgcm91bmQtcm9iaW4gKHJlYWx0aW1lKSBzY2hlZHVsaW5nIG9uIG93bgorICAgcHJvY2Vzc2VzIGFuZCBzZXR0aW5nIHRoZSBzY2hlZHVsaW5nIGFsZ29yaXRobSB1c2VkIGJ5IGFub3RoZXIKKyAgIHByb2Nlc3MuICovCisvKiBBbGxvdyBzZXR0aW5nIGNwdSBhZmZpbml0eSBvbiBvdGhlciBwcm9jZXNzZXMgKi8KKworI2RlZmluZSBDQVBfU1lTX05JQ0UgICAgICAgICAyMworCisvKiBPdmVycmlkZSByZXNvdXJjZSBsaW1pdHMuIFNldCByZXNvdXJjZSBsaW1pdHMuICovCisvKiBPdmVycmlkZSBxdW90YSBsaW1pdHMuICovCisvKiBPdmVycmlkZSByZXNlcnZlZCBzcGFjZSBvbiBleHQyIGZpbGVzeXN0ZW0gKi8KKy8qIE1vZGlmeSBkYXRhIGpvdXJuYWxpbmcgbW9kZSBvbiBleHQzIGZpbGVzeXN0ZW0gKHVzZXMgam91cm5hbGluZworICAgcmVzb3VyY2VzKSAqLworLyogTk9URTogZXh0MiBob25vcnMgZnN1aWQgd2hlbiBjaGVja2luZyBmb3IgcmVzb3VyY2Ugb3ZlcnJpZGVzLCBzbworICAgeW91IGNhbiBvdmVycmlkZSB1c2luZyBmc3VpZCB0b28gKi8KKy8qIE92ZXJyaWRlIHNpemUgcmVzdHJpY3Rpb25zIG9uIElQQyBtZXNzYWdlIHF1ZXVlcyAqLworLyogQWxsb3cgbW9yZSB0aGFuIDY0aHogaW50ZXJydXB0cyBmcm9tIHRoZSByZWFsLXRpbWUgY2xvY2sgKi8KKy8qIE92ZXJyaWRlIG1heCBudW1iZXIgb2YgY29uc29sZXMgb24gY29uc29sZSBhbGxvY2F0aW9uICovCisvKiBPdmVycmlkZSBtYXggbnVtYmVyIG9mIGtleW1hcHMgKi8KKworI2RlZmluZSBDQVBfU1lTX1JFU09VUkNFICAgICAyNAorCisvKiBBbGxvdyBtYW5pcHVsYXRpb24gb2Ygc3lzdGVtIGNsb2NrICovCisvKiBBbGxvdyBpcml4X3N0aW1lIG9uIG1pcHMgKi8KKy8qIEFsbG93IHNldHRpbmcgdGhlIHJlYWwtdGltZSBjbG9jayAqLworCisjZGVmaW5lIENBUF9TWVNfVElNRSAgICAgICAgIDI1CisKKy8qIEFsbG93IGNvbmZpZ3VyYXRpb24gb2YgdHR5IGRldmljZXMgKi8KKy8qIEFsbG93IHZoYW5ndXAoKSBvZiB0dHkgKi8KKworI2RlZmluZSBDQVBfU1lTX1RUWV9DT05GSUcgICAyNgorCisvKiBBbGxvdyB0aGUgcHJpdmlsZWdlZCBhc3BlY3RzIG9mIG1rbm9kKCkgKi8KKworI2RlZmluZSBDQVBfTUtOT0QgICAgICAgICAgICAyNworCisvKiBBbGxvdyB0YWtpbmcgb2YgbGVhc2VzIG9uIGZpbGVzICovCisKKyNkZWZpbmUgQ0FQX0xFQVNFICAgICAgICAgICAgMjgKKworI2RlZmluZSBDQVBfQVVESVRfV1JJVEUgICAgICAyOQorCisjZGVmaW5lIENBUF9BVURJVF9DT05UUk9MICAgIDMwCisKKyNkZWZpbmUgQ0FQX1NFVEZDQVAJICAgICAzMQorCisKKyNlbmRpZiAvKiAhX0xJTlVYX0NBUEFCSUxJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYXBpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NhcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVjYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jYXBpLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qICRJZDogY2FwaS5oLHYgMS40LjYuMSAyMDAxLzA5LzIzIDIyOjI1OjA1IGthaSBFeHAgJAorICogCisgKiBDQVBJIDIuMCBJbnRlcmZhY2UgZm9yIExpbnV4CisgKiAKKyAqIENvcHlyaWdodCAxOTk3IGJ5IENhcnN0ZW4gUGFldGggKGNhbGxlQGNhbGxlLmluLWJlcmxpbi5kZSkKKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0NBUElfSF9fCisjZGVmaW5lIF9fTElOVVhfQ0FQSV9IX18KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsY2FwaS5oPgorCisvKgorICogQ0FQSV9SRUdJU1RFUgorICovCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfcmVnaXN0ZXJfcGFyYW1zIHsJLyogQ0FQSV9SRUdJU1RFUiAqLworCV9fdTMyIGxldmVsM2NudDsJLyogTm8uIG9mIHNpbXVsYXRuZW91cyB1c2VyIGRhdGEgY29ubmVjdGlvbnMgKi8KKwlfX3UzMiBkYXRhYmxrY250OwkvKiBOby4gb2YgYnVmZmVyZWQgZGF0YSBtZXNzYWdlcyAqLworCV9fdTMyIGRhdGFibGtsZW47CS8qIFNpemUgb2YgYnVmZmVyZWQgZGF0YSBtZXNzYWdlcyAqLworfSBjYXBpX3JlZ2lzdGVyX3BhcmFtczsKKworI2RlZmluZQlDQVBJX1JFR0lTVEVSCV9JT1coJ0MnLDB4MDEsc3RydWN0IGNhcGlfcmVnaXN0ZXJfcGFyYW1zKQorCisvKgorICogQ0FQSV9HRVRfTUFOVUZBQ1RVUkVSCisgKi8KKworI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9MRU4JCTY0CisKKyNkZWZpbmUJQ0FQSV9HRVRfTUFOVUZBQ1RVUkVSCV9JT1dSKCdDJywweDA2LGludCkJLyogYnJva2VuOiB3YW50ZWQgc2l6ZSA2NCAoQ0FQSV9NQU5VRkFDVFVSRVJfTEVOKSAqLworCisvKgorICogQ0FQSV9HRVRfVkVSU0lPTgorICovCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfdmVyc2lvbiB7CisJX191MzIgbWFqb3J2ZXJzaW9uOworCV9fdTMyIG1pbm9ydmVyc2lvbjsKKwlfX3UzMiBtYWpvcm1hbnV2ZXJzaW9uOworCV9fdTMyIG1pbm9ybWFudXZlcnNpb247Cit9IGNhcGlfdmVyc2lvbjsKKworI2RlZmluZSBDQVBJX0dFVF9WRVJTSU9OCV9JT1dSKCdDJywweDA3LHN0cnVjdCBjYXBpX3ZlcnNpb24pCisKKy8qCisgKiBDQVBJX0dFVF9TRVJJQUwKKyAqLworCisjZGVmaW5lIENBUElfU0VSSUFMX0xFTgkJOAorI2RlZmluZSBDQVBJX0dFVF9TRVJJQUwJCV9JT1dSKCdDJywweDA4LGludCkJLyogYnJva2VuOiB3YW50ZWQgc2l6ZSA4IChDQVBJX1NFUklBTF9MRU4pICovCisKKy8qCisgKiBDQVBJX0dFVF9QUk9GSUxFCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2FwaV9wcm9maWxlIHsKKwlfX3UxNiBuY29udHJvbGxlcjsJLyogbnVtYmVyIG9mIGluc3RhbGxlZCBjb250cm9sbGVyICovCisJX191MTYgbmJjaGFubmVsOwkvKiBudW1iZXIgb2YgQi1DaGFubmVscyAqLworCV9fdTMyIGdvcHRpb25zOwkJLyogZ2xvYmFsIG9wdGlvbnMgKi8KKwlfX3UzMiBzdXBwb3J0MTsJCS8qIEIxIHByb3RvY29scyBzdXBwb3J0ICovCisJX191MzIgc3VwcG9ydDI7CQkvKiBCMiBwcm90b2NvbHMgc3VwcG9ydCAqLworCV9fdTMyIHN1cHBvcnQzOwkJLyogQjMgcHJvdG9jb2xzIHN1cHBvcnQgKi8KKwlfX3UzMiByZXNlcnZlZFs2XTsJLyogcmVzZXJ2ZWQgKi8KKwlfX3UzMiBtYW51WzVdOwkJLyogbWFudWZhY3R1cmVyIHNwZWNpZmljIGluZm9ybWF0aW9uICovCit9IGNhcGlfcHJvZmlsZTsKKworI2RlZmluZSBDQVBJX0dFVF9QUk9GSUxFCV9JT1dSKCdDJywweDA5LHN0cnVjdCBjYXBpX3Byb2ZpbGUpCisKK3R5cGVkZWYgc3RydWN0IGNhcGlfbWFudWZhY3R1cmVyX2NtZCB7CisJdW5zaWduZWQgbG9uZyBjbWQ7CisJdm9pZCAqZGF0YTsKK30gY2FwaV9tYW51ZmFjdHVyZXJfY21kOworCisvKgorICogQ0FQSV9NQU5VRkFDVFVSRVJfQ01ECisgKi8KKworI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9DTUQJX0lPV1IoJ0MnLDB4MjAsIHN0cnVjdCBjYXBpX21hbnVmYWN0dXJlcl9jbWQpCisKKy8qCisgKiBDQVBJX0dFVF9FUlJDT0RFCisgKiBjYXBpIGVycmNvZGUgaXMgc2V0LCAqIGlmIHJlYWQsIHdyaXRlLCBvciBpb2N0bCByZXR1cm5zIEVJTywKKyAqIGlvY3RsIHJldHVybnMgZXJyY29kZSBkaXJlY3RseSwgYW5kIGluIGFyZywgaWYgIT0gMAorICovCisKKyNkZWZpbmUgQ0FQSV9HRVRfRVJSQ09ERQlfSU9SKCdDJywweDIxLCBfX3UxNikKKworLyoKKyAqIENBUElfSU5TVEFMTEVECisgKi8KKyNkZWZpbmUgQ0FQSV9JTlNUQUxMRUQJCV9JT1IoJ0MnLDB4MjIsIF9fdTE2KQorCisKKy8qCisgKiBtZW1iZXIgY29udHIgaXMgaW5wdXQgZm9yCisgKiBDQVBJX0dFVF9NQU5VRkFDVFVSRVIsIENBUElfVkVSU0lPTiwgQ0FQSV9HRVRfU0VSSUFMCisgKiBhbmQgQ0FQSV9HRVRfUFJPRklMRQorICovCit0eXBlZGVmIHVuaW9uIGNhcGlfaW9jdGxfc3RydWN0IHsKKwlfX3UzMiBjb250cjsKKwljYXBpX3JlZ2lzdGVyX3BhcmFtcyBycGFyYW1zOworCV9fdTggbWFudWZhY3R1cmVyW0NBUElfTUFOVUZBQ1RVUkVSX0xFTl07CisJY2FwaV92ZXJzaW9uIHZlcnNpb247CisJX191OCBzZXJpYWxbQ0FQSV9TRVJJQUxfTEVOXTsKKwljYXBpX3Byb2ZpbGUgcHJvZmlsZTsKKwljYXBpX21hbnVmYWN0dXJlcl9jbWQgY21kOworCV9fdTE2IGVycmNvZGU7Cit9IGNhcGlfaW9jdGxfc3RydWN0OworCisvKgorICogTWlkZGxld2FyZSBleHRlbnNpb24KKyAqLworCisjZGVmaW5lIENBUElGTEFHX0hJR0hKQUNLSU5HCTB4MDAwMQorCisjZGVmaW5lIENBUElfR0VUX0ZMQUdTCQlfSU9SKCdDJywweDIzLCB1bnNpZ25lZCkKKyNkZWZpbmUgQ0FQSV9TRVRfRkxBR1MJCV9JT1IoJ0MnLDB4MjQsIHVuc2lnbmVkKQorI2RlZmluZSBDQVBJX0NMUl9GTEFHUwkJX0lPUignQycsMHgyNSwgdW5zaWduZWQpCisKKyNkZWZpbmUgQ0FQSV9OQ0NJX09QRU5DT1VOVAlfSU9SKCdDJywweDI2LCB1bnNpZ25lZCkKKworI2RlZmluZSBDQVBJX05DQ0lfR0VUVU5JVAlfSU9SKCdDJywweDI3LCB1bnNpZ25lZCkKKworI2VuZGlmCQkJCS8qIF9fTElOVVhfQ0FQSV9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2JiZWNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oCkBAIC0wLDAgKzEsMjE0IEBACisjaWZuZGVmIENDSVNTX0lPQ1RMSAorI2RlZmluZSBDQ0lTU19JT0NUTEgKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBDQ0lTU19JT0NfTUFHSUMgJ0InCisKKwordHlwZWRlZiBzdHJ1Y3QgX2NjaXNzX3BjaV9pbmZvX3N0cnVjdAoreworCXVuc2lnbmVkIGNoYXIgCWJ1czsKKwl1bnNpZ25lZCBjaGFyIAlkZXZfZm47CisJdW5zaWduZWQgc2hvcnQJZG9tYWluOworCV9fdTMyIAkJYm9hcmRfaWQ7Cit9IGNjaXNzX3BjaV9pbmZvX3N0cnVjdDsgCisKK3R5cGVkZWYgc3RydWN0IF9jY2lzc19jb2FsaW50X3N0cnVjdAoreworCV9fdTMyICBkZWxheTsKKwlfX3UzMiAgY291bnQ7Cit9IGNjaXNzX2NvYWxpbnRfc3RydWN0OworCit0eXBlZGVmIGNoYXIgTm9kZU5hbWVfdHlwZVsxNl07CisKK3R5cGVkZWYgX191MzIgSGVhcnRiZWF0X3R5cGU7CisKKyNkZWZpbmUgQ0lTU19QQVJTQ1NJVTIgCTB4MDAwMQorI2RlZmluZSBDSVNTX1BBUkNTQ0lVMyAJMHgwMDAyCisjZGVmaW5lIENJU1NfRklCUkUxRwkweDAxMDAKKyNkZWZpbmUgQ0lTU19GSUJSRTJHCTB4MDIwMAordHlwZWRlZiBfX3UzMiBCdXNUeXBlc190eXBlOworCit0eXBlZGVmIGNoYXIgRmlybXdhcmVWZXJfdHlwZVs0XTsKK3R5cGVkZWYgX191MzIgRHJpdmVyVmVyX3R5cGU7CisKKyNkZWZpbmUgTUFYX0tNQUxMT0NfU0laRSAxMjgwMDAKKworI2lmbmRlZiBDQ0lTU19DTURfSAorLy8gVGhpcyBkZWZpbmVzIGFyZSBkdXBsaWNhdGVkIGluIGNjaXNzX2NtZC5oIGluIHRoZSBkcml2ZXIgZGlyZWN0b3J5IAorCisvL2dlbmVyYWwgYm91bmRhcnkgZGVmaW50aW9ucworI2RlZmluZSBTRU5TRUlORk9CWVRFUyAgICAgICAgICAzMi8vbm90ZSB0aGF0IHRoaXMgdmFsdWUgbWF5IHZhcnkgYmV0d2VlbiBob3N0IGltcGxlbWVudGF0aW9ucworCisvL0NvbW1hbmQgU3RhdHVzIHZhbHVlCisjZGVmaW5lIENNRF9TVUNDRVNTICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBDTURfVEFSR0VUX1NUQVRVUyAgICAgICAweDAwMDEKKyNkZWZpbmUgQ01EX0RBVEFfVU5ERVJSVU4gICAgICAgMHgwMDAyCisjZGVmaW5lIENNRF9EQVRBX09WRVJSVU4gICAgICAgIDB4MDAwMworI2RlZmluZSBDTURfSU5WQUxJRCAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQ01EX1BST1RPQ09MX0VSUiAgICAgICAgMHgwMDA1CisjZGVmaW5lIENNRF9IQVJEV0FSRV9FUlIgICAgICAgIDB4MDAwNgorI2RlZmluZSBDTURfQ09OTkVDVElPTl9MT1NUICAgICAweDAwMDcKKyNkZWZpbmUgQ01EX0FCT1JURUQgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIENNRF9BQk9SVF9GQUlMRUQgICAgICAgIDB4MDAwOQorI2RlZmluZSBDTURfVU5TT0xJQ0lURURfQUJPUlQgICAweDAwMEEKKyNkZWZpbmUgQ01EX1RJTUVPVVQgICAgICAgICAgICAgMHgwMDBCCisjZGVmaW5lIENNRF9VTkFCT1JUQUJMRQkJMHgwMDBDCisKKy8vdHJhbnNmZXIgZGlyZWN0aW9uCisjZGVmaW5lIFhGRVJfTk9ORSAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgWEZFUl9XUklURSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBYRkVSX1JFQUQgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFhGRVJfUlNWRCAgICAgICAgICAgICAgIDB4MDMKKworLy90YXNrIGF0dHJpYnV0ZQorI2RlZmluZSBBVFRSX1VOVEFHR0VEICAgICAgICAgICAweDAwCisjZGVmaW5lIEFUVFJfU0lNUExFICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQVRUUl9IRUFET0ZRVUVVRSAgICAgICAgMHgwNQorI2RlZmluZSBBVFRSX09SREVSRUQgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFUVFJfQUNBICAgICAgICAgICAgICAgIDB4MDcKKworLy9jZGIgdHlwZQorI2RlZmluZSBUWVBFX0NNRAkJCQkweDAwCisjZGVmaW5lIFRZUEVfTVNHCQkJCTB4MDEKKworLy8gVHlwZSBkZWZzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBzdHJ1Y3RzCisjZGVmaW5lIEJZVEUgX191OAorI2RlZmluZSBXT1JEIF9fdTE2CisjZGVmaW5lIEhXT1JEIF9fdTE2CisjZGVmaW5lIERXT1JEIF9fdTMyCisKKyNkZWZpbmUgQ0lTU19NQVhfTFVOCTEwMjQKKworI2RlZmluZSBMRVZFTDJMVU4gICAxICAgLy8gaW5kZXggaW50byBUYXJnZXQoeCkgc3RydWN0dXJlLCBkdWUgdG8gYnl0ZSBzd2FwcGluZworI2RlZmluZSBMRVZFTDNMVU4gICAwCisKKyNwcmFnbWEgcGFjaygxKQorCisvL0NvbW1hbmQgTGlzdCBTdHJ1Y3R1cmUKK3R5cGVkZWYgdW5pb24gX1NDU0kzQWRkcl9zdHJ1Y3QgeworICAgc3RydWN0IHsKKyAgICBCWVRFIERldjsKKyAgICBCWVRFIEJ1czo2OworICAgIEJZVEUgTW9kZToyOyAgICAgICAgLy8gYjAwCisgIH0gUGVyaXBEZXY7CisgICBzdHJ1Y3QgeworICAgIEJZVEUgRGV2TFNCOworICAgIEJZVEUgRGV2TVNCOjY7CisgICAgQllURSBNb2RlOjI7ICAgICAgICAvLyBiMDEKKyAgfSBMb2dEZXY7CisgICBzdHJ1Y3QgeworICAgIEJZVEUgRGV2OjU7CisgICAgQllURSBCdXM6MzsKKyAgICBCWVRFIFRhcmc6NjsKKyAgICBCWVRFIE1vZGU6MjsgICAgICAgIC8vIGIxMAorICB9IExvZ1VuaXQ7Cit9IFNDU0kzQWRkcl9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9QaHlzRGV2QWRkcl9zdHJ1Y3QgeworICBEV09SRCAgICAgICAgICAgICBUYXJnZXRJZDoyNDsKKyAgRFdPUkQgICAgICAgICAgICAgQnVzOjY7CisgIERXT1JEICAgICAgICAgICAgIE1vZGU6MjsKKyAgU0NTSTNBZGRyX3N0cnVjdCAgVGFyZ2V0WzJdOyAvLzIgbGV2ZWwgdGFyZ2V0IGRldmljZSBhZGRyCit9IFBoeXNEZXZBZGRyX3N0cnVjdDsKKyAgCit0eXBlZGVmIHN0cnVjdCBfTG9nRGV2QWRkcl9zdHJ1Y3QgeworICBEV09SRCAgICAgICAgICAgIFZvbElkOjMwOworICBEV09SRCAgICAgICAgICAgIE1vZGU6MjsKKyAgQllURSAgICAgICAgICAgICByZXNlcnZlZFs0XTsKK30gTG9nRGV2QWRkcl9zdHJ1Y3Q7CisKK3R5cGVkZWYgdW5pb24gX0xVTkFkZHJfc3RydWN0IHsKKyAgQllURSAgICAgICAgICAgICAgIEx1bkFkZHJCeXRlc1s4XTsKKyAgU0NTSTNBZGRyX3N0cnVjdCAgIFNDU0kzTHVuWzRdOworICBQaHlzRGV2QWRkcl9zdHJ1Y3QgUGh5c0RldjsKKyAgTG9nRGV2QWRkcl9zdHJ1Y3QgIExvZ0RldjsKK30gTFVOQWRkcl9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9SZXF1ZXN0QmxvY2tfc3RydWN0IHsKKyAgQllURSAgIENEQkxlbjsKKyAgc3RydWN0IHsKKyAgICBCWVRFIFR5cGU6MzsKKyAgICBCWVRFIEF0dHJpYnV0ZTozOworICAgIEJZVEUgRGlyZWN0aW9uOjI7CisgIH0gVHlwZTsKKyAgSFdPUkQgIFRpbWVvdXQ7CisgIEJZVEUgICBDREJbMTZdOworfSBSZXF1ZXN0QmxvY2tfc3RydWN0OworCit0eXBlZGVmIHVuaW9uIF9Nb3JlRXJySW5mb19zdHJ1Y3R7CisgIHN0cnVjdCB7CisgICAgQllURSAgUmVzZXJ2ZWRbM107CisgICAgQllURSAgVHlwZTsKKyAgICBEV09SRCBFcnJvckluZm87CisgIH1Db21tb25fSW5mbzsKKyAgc3RydWN0eworICAgIEJZVEUgIFJlc2VydmVkWzJdOworICAgIEJZVEUgIG9mZmVuc2Vfc2l6ZTsvL3NpemUgb2Ygb2ZmZW5kaW5nIGVudHJ5CisgICAgQllURSAgb2ZmZW5zZV9udW07IC8vYnl0ZSAjIG9mIG9mZmVuc2UgMC1iYXNlCisgICAgRFdPUkQgb2ZmZW5zZV92YWx1ZTsKKyAgfUludmFsaWRfQ21kOworfU1vcmVFcnJJbmZvX3N0cnVjdDsKK3R5cGVkZWYgc3RydWN0IF9FcnJvckluZm9fc3RydWN0IHsKKyAgQllURSAgICAgICAgICAgICAgIFNjc2lTdGF0dXM7CisgIEJZVEUgICAgICAgICAgICAgICBTZW5zZUxlbjsKKyAgSFdPUkQgICAgICAgICAgICAgIENvbW1hbmRTdGF0dXM7CisgIERXT1JEICAgICAgICAgICAgICBSZXNpZHVhbENudDsKKyAgTW9yZUVyckluZm9fc3RydWN0IE1vcmVFcnJJbmZvOworICBCWVRFICAgICAgICAgICAgICAgU2Vuc2VJbmZvW1NFTlNFSU5GT0JZVEVTXTsKK30gRXJyb3JJbmZvX3N0cnVjdDsKKworI3ByYWdtYSBwYWNrKCkKKyNlbmRpZiAvKiBDQ0lTU19DTURfSCAqLyAKKwordHlwZWRlZiBzdHJ1Y3QgX0lPQ1RMX0NvbW1hbmRfc3RydWN0IHsKKyAgTFVOQWRkcl9zdHJ1Y3QJICAgTFVOX2luZm87CisgIFJlcXVlc3RCbG9ja19zdHJ1Y3QgICAgICBSZXF1ZXN0OworICBFcnJvckluZm9fc3RydWN0ICAJICAgZXJyb3JfaW5mbzsgCisgIFdPUkQJCQkgICBidWZfc2l6ZTsgIC8qIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZiAqLworICBCWVRFCQkJICAgKmJ1ZjsKK30gSU9DVExfQ29tbWFuZF9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IF9CSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgeworICBMVU5BZGRyX3N0cnVjdAkgICBMVU5faW5mbzsKKyAgUmVxdWVzdEJsb2NrX3N0cnVjdCAgICAgIFJlcXVlc3Q7CisgIEVycm9ySW5mb19zdHJ1Y3QgIAkgICBlcnJvcl9pbmZvOworICBEV09SRAkJCSAgIG1hbGxvY19zaXplOyAvKiA8IE1BWF9LTUFMTE9DX1NJWkUgaW4gY2Npc3MuYyAqLworICBEV09SRAkJCSAgIGJ1Zl9zaXplOyAgICAvKiBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWYgKi8KKyAgCQkJCSAgICAgICAgLyogPCBtYWxsb2Nfc2l6ZSAqIE1BWFNHRU5UUklFUyAqLworICBCWVRFCQkJICAgKmJ1ZjsKK30gQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfTG9ndm9sSW5mb19zdHJ1Y3R7CisJX191MzIJTHVuSUQ7CisJaW50CW51bV9vcGVuczsgIC8qIG51bWJlciBvZiBvcGVucyBvbiB0aGUgbG9naWNhbCB2b2x1bWUgKi8KKwlpbnQJbnVtX3BhcnRzOyAgLyogbnVtYmVyIG9mIHBhcnRpdGlvbnMgY29uZmlndXJlZCBvbiBsb2d2b2wgKi8KK30gTG9ndm9sSW5mb19zdHJ1Y3Q7CisKKyNkZWZpbmUgQ0NJU1NfR0VUUENJSU5GTyBfSU9SKENDSVNTX0lPQ19NQUdJQywgMSwgY2Npc3NfcGNpX2luZm9fc3RydWN0KQorCisjZGVmaW5lIENDSVNTX0dFVElOVElORk8gX0lPUihDQ0lTU19JT0NfTUFHSUMsIDIsIGNjaXNzX2NvYWxpbnRfc3RydWN0KQorI2RlZmluZSBDQ0lTU19TRVRJTlRJTkZPIF9JT1coQ0NJU1NfSU9DX01BR0lDLCAzLCBjY2lzc19jb2FsaW50X3N0cnVjdCkKKworI2RlZmluZSBDQ0lTU19HRVROT0RFTkFNRSBfSU9SKENDSVNTX0lPQ19NQUdJQywgNCwgTm9kZU5hbWVfdHlwZSkKKyNkZWZpbmUgQ0NJU1NfU0VUTk9ERU5BTUUgX0lPVyhDQ0lTU19JT0NfTUFHSUMsIDUsIE5vZGVOYW1lX3R5cGUpCisKKyNkZWZpbmUgQ0NJU1NfR0VUSEVBUlRCRUFUIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCA2LCBIZWFydGJlYXRfdHlwZSkKKyNkZWZpbmUgQ0NJU1NfR0VUQlVTVFlQRVMgIF9JT1IoQ0NJU1NfSU9DX01BR0lDLCA3LCBCdXNUeXBlc190eXBlKQorI2RlZmluZSBDQ0lTU19HRVRGSVJNVkVSICAgX0lPUihDQ0lTU19JT0NfTUFHSUMsIDgsIEZpcm13YXJlVmVyX3R5cGUpCisjZGVmaW5lIENDSVNTX0dFVERSSVZWRVIgICBfSU9SKENDSVNTX0lPQ19NQUdJQywgOSwgRHJpdmVyVmVyX3R5cGUpCisjZGVmaW5lIENDSVNTX1JFVkFMSURWT0xTICBfSU8oQ0NJU1NfSU9DX01BR0lDLCAxMCkKKyNkZWZpbmUgQ0NJU1NfUEFTU1RIUlUJICAgX0lPV1IoQ0NJU1NfSU9DX01BR0lDLCAxMSwgSU9DVExfQ29tbWFuZF9zdHJ1Y3QpCisjZGVmaW5lIENDSVNTX0RFUkVHRElTSwkgICBfSU8oQ0NJU1NfSU9DX01BR0lDLCAxMikKKworLyogbm8gbG9uZ2VyIHVzZWQuLi4gdXNlIFJFR05FV0QgaW5zdGVhZCAqLyAKKyNkZWZpbmUgQ0NJU1NfUkVHTkVXRElTSyAgX0lPVyhDQ0lTU19JT0NfTUFHSUMsIDEzLCBpbnQpCisKKyNkZWZpbmUgQ0NJU1NfUkVHTkVXRAkgICBfSU8oQ0NJU1NfSU9DX01BR0lDLCAxNCkKKyNkZWZpbmUgQ0NJU1NfUkVTQ0FORElTSyAgIF9JTyhDQ0lTU19JT0NfTUFHSUMsIDE2KQorI2RlZmluZSBDQ0lTU19HRVRMVU5JTkZPICAgX0lPUihDQ0lTU19JT0NfTUFHSUMsIDE3LCBMb2d2b2xJbmZvX3N0cnVjdCkKKyNkZWZpbmUgQ0NJU1NfQklHX1BBU1NUSFJVIF9JT1dSKENDSVNTX0lPQ19NQUdJQywgMTgsIEJJR19JT0NUTF9Db21tYW5kX3N0cnVjdCkKKworI2VuZGlmICAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2RrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nkay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDhkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nkay5oCkBAIC0wLDAgKzEsNDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgljZGsuaCAgLS0gQ0RLIGludGVyZmFjZSBkZWZpbml0aW9ucy4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCAgU3RhbGxpb24gVGVjaG5vbG9naWVzCisgKglDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiAgR3JlZyBVbmdlcmVyLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYJX0NES19ICisjZGVmaW5lCV9DREtfSAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjcHJhZ21hCXBhY2soMikKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgc2V0IG9mIGRlZmluaXRpb25zIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKKyAqCXNoYXJlZCBtZW1vcnkgaW50ZXJmYWNlIG9mIHRoZSBTdGFsbGlvbiBpbnRlbGxpZ2VudCBtdWx0aXBvcnQgc2VyaWFsCisgKglib2FyZHMuIFRoZSBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlCisgKglkb2N1bWVudCB0aXRsZWQgIkdlbmVyaWMgU3RhY2thYmxlIEludGVyZmFjZSwgRG93bmxvYWRlciBhbmQKKyAqCUNvbW11bmljYXRpb25zIERldmVsb3BtZW50IEtpdCIuCisgKi8KKworLyoKKyAqCURlZmluZSB0aGUgc2V0IG9mIGltcG9ydGFudCBzaGFyZWQgbWVtb3J5IGFkZHJlc3Nlcy4gVGhlc2UgYXJlCisgKglyZXF1aXJlZCB0byBpbml0aWFsaXplIHRoZSBib2FyZCBhbmQgZ2V0IHRoaW5ncyBzdGFydGVkLiBBbGwgb2YgdGhlc2UKKyAqCWFkZHJlc3NlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzaGFyZWQgbWVtb3J5LgorICovCisjZGVmaW5lCUNES19TSUdBRERSCTB4MjAwCisjZGVmaW5lCUNES19GRUFUQUREUgkweDI4MAorI2RlZmluZQlDREtfQ0RLQUREUgkweDMwMAorI2RlZmluZQlDREtfUkRZQUREUgkweDI2MgorCisjZGVmaW5lCUNES19BTElWRU1BUktFUgkxMworCisvKgorICoJT24gaGFyZHdhcmUgcG93ZXIgdXAgdGhlIFJPTXMgbG9jYXRlZCBvbiB0aGUgRWFzeUNvbm5lY3Rpb24gOC82NCB3aWxsCisgKglmaWxsIG91dCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBtZW1vcnkuIFRoaXMKKyAqCXdheSB0aGUgaG9zdCBzeXN0ZW0gY2FuIHF1aWNrbHkgZGV0ZXJtaW5lIHRoYXQgdGhlIGJvYXJkIGlzIHByZXNlbnQKKyAqCWFuZCBpcyBvcGVyYXRpb25hbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RrZWNwc2lnIHsKKwl1bnNpZ25lZCBsb25nCW1hZ2ljOworCXVuc2lnbmVkIHNob3J0CXJvbXZlcjsKKwl1bnNpZ25lZCBzaG9ydAljcHV0eXBlOworCXVuc2lnbmVkIGNoYXIJcGFuZWxpZFs4XTsKK30gY2RrZWNwc2lnX3Q7CisKKyNkZWZpbmUJRUNQX01BR0lDCTB4MjE1MDQzNDUKKworLyoKKyAqCU9uIGhhcmR3YXJlIHBvd2VyIHVwIHRoZSBST01zIGxvY2F0ZWQgb24gdGhlIE9OYm9hcmQsIFN0YWxsaW9uIGFuZAorICoJQnJ1bWJ5cyB3aWxsIGZpbGwgb3V0IHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIGluZm9ybWF0aW9uIGludG8gc2hhcmVkCisgKgltZW1vcnkuIFRoaXMgd2F5IHRoZSBob3N0IHN5c3RlbSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgdGhhdCB0aGUgYm9hcmQKKyAqCWlzIHByZXNlbnQgYW5kIGlzIG9wZXJhdGlvbmFsLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGtvbmJzaWcgeworCXVuc2lnbmVkIHNob3J0CW1hZ2ljMDsKKwl1bnNpZ25lZCBzaG9ydAltYWdpYzE7CisJdW5zaWduZWQgc2hvcnQJbWFnaWMyOworCXVuc2lnbmVkIHNob3J0CW1hZ2ljMzsKKwl1bnNpZ25lZCBzaG9ydAlyb212ZXI7CisJdW5zaWduZWQgc2hvcnQJbWVtb2ZmOworCXVuc2lnbmVkIHNob3J0CW1lbXNlZzsKKwl1bnNpZ25lZCBzaG9ydAlhbWFzazA7CisJdW5zaWduZWQgc2hvcnQJcGljOworCXVuc2lnbmVkIHNob3J0CXN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydAlidHlwZTsKKwl1bnNpZ25lZCBzaG9ydAljbGt0aWNrczsKKwl1bnNpZ25lZCBzaG9ydAljbGtzcGVlZDsKKwl1bnNpZ25lZCBzaG9ydAlhbWFzazE7CisJdW5zaWduZWQgc2hvcnQJYW1hc2syOworfSBjZGtvbmJzaWdfdDsKKworI2RlZmluZQlPTkJfTUFHSUMwCTB4ZjJhNworI2RlZmluZQlPTkJfTUFHSUMxCTB4YTE0OQorI2RlZmluZQlPTkJfTUFHSUMyCTB4NjM1MgorI2RlZmluZQlPTkJfTUFHSUMzCTB4ZjEyMQorCisvKgorICoJRGVmaW5lIHRoZSBmZWF0dXJlIGFyZWEgc3RydWN0dXJlLiBUaGUgZmVhdHVyZSBhcmVhIGlzIHRoZSBzZXQgb2YKKyAqCXN0YXJ0dXAgcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBzbGF2ZSBpbWFnZSB3aGVuIGl0IHN0YXJ0cyBleGVjdXRpbmcuCisgKglUaGV5IGFsbG93IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiBidWZmZXIgc2l6ZXMsIGRlYnVnIHRyYWNlLCBldGMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka2ZlYXR1cmUgeworCXVuc2lnbmVkIGxvbmcJZGVidWc7CisJdW5zaWduZWQgbG9uZwliYW5uZXI7CisJdW5zaWduZWQgbG9uZwlldHlwZTsKKwl1bnNpZ25lZCBsb25nCW5yZGV2czsKKwl1bnNpZ25lZCBsb25nCWJyZHNwZWM7CisJdW5zaWduZWQgbG9uZwl0eHJxc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXJ4cnFzaXplOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Cit9IGNka2ZlYXR1cmVfdDsKKworI2RlZmluZQlFVFlQX0RESwkwCisjZGVmaW5lCUVUWVBfQ0RLCTEKKworLyoKKyAqCURlZmluZSB0aGUgQ0RLIGhlYWRlciBzdHJ1Y3R1cmUuIFRoaXMgaXMgdGhlIGluZm8gdGhhdCB0aGUgc2xhdmUKKyAqCWVudmlyb25tZW50IHNldHMgdXAgYWZ0ZXIgaXQgaGFzIGJlZW4gZG93bmxvYWRlZCBhbmQgc3RhcnRlZC4gSXQKKyAqCWVzc2VudGlhbGx5IHByb3ZpZGVzIGEgbWVtb3J5IG1hcCBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgaW50ZXJmYWNlLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGtoZHIgeworCXVuc2lnbmVkIHNob3J0CWNvbW1hbmQ7CisJdW5zaWduZWQgc2hvcnQJc3RhdHVzOworCXVuc2lnbmVkIHNob3J0CXBvcnQ7CisJdW5zaWduZWQgc2hvcnQJbW9kZTsKKwl1bnNpZ25lZCBsb25nCWNtZF9idWZbMTRdOworCXVuc2lnbmVkIHNob3J0CWFsaXZlX2NudDsKKwl1bnNpZ25lZCBzaG9ydAlpbnRycHRfbW9kZTsKKwl1bnNpZ25lZCBjaGFyCWludHJwdF9pZFs4XTsKKwl1bnNpZ25lZCBjaGFyCXZlcl9yZWxlYXNlOworCXVuc2lnbmVkIGNoYXIJdmVyX21vZGlmaWNhdGlvbjsKKwl1bnNpZ25lZCBjaGFyCXZlcl9maXg7CisJdW5zaWduZWQgY2hhcglkZWFkbWFuX3Jlc3RhcnQ7CisJdW5zaWduZWQgc2hvcnQJZGVhZG1hbjsKKwl1bnNpZ25lZCBzaG9ydAlucmRldnM7CisJdW5zaWduZWQgbG9uZwltZW1wOworCXVuc2lnbmVkIGxvbmcJaG9zdHA7CisJdW5zaWduZWQgbG9uZwlzbGF2ZXA7CisJdW5zaWduZWQgY2hhcglob3N0cmVxOworCXVuc2lnbmVkIGNoYXIJc2xhdmVyZXE7CisJdW5zaWduZWQgY2hhcgljbWRfcmVzZXJ2ZWRbMzBdOworfSBjZGtoZHJfdDsKKworI2RlZmluZQlNT0RFX0RESwkwCisjZGVmaW5lCU1PREVfQ0RLCTEKKworI2RlZmluZQlJTURfSU5UUgkweDAKKyNkZWZpbmUJSU1EX1BQSU5UUgkweDEKKyNkZWZpbmUJSU1EX1BPTEwJMHhmZgorCisvKgorICoJRGVmaW5lIHRoZSBtZW1vcnkgbWFwcGluZyBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIGlzIHBvaW50ZWQgdG8gYnkKKyAqCXRoZSBtZW1wIGZpZWxkIGluIHRoZSBzdGxjZGtoZHIgc3RydWN0LiBBcyBtYW55IGFzIHRoZXNlIHN0cnVjdHVyZXMKKyAqCWFzIHJlcXVpcmVkIGFyZSBsYXllZCBvdXQgaW4gc2hhcmVkIG1lbW9yeSB0byBkZWZpbmUgaG93IHRoZSByZXN0IG9mCisgKglzaGFyZWQgbWVtb3J5IGlzIGRpdmlkZWQgdXAuIFRoZXJlIHdpbGwgYmUgb25lIGZvciBlYWNoIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka21lbSB7CisJdW5zaWduZWQgc2hvcnQJZHR5cGU7CisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7Cit9IGNka21lbV90OworCisjZGVmaW5lCVRZUF9VTkRFRklORUQJMHgwCisjZGVmaW5lCVRZUF9BU1lOQ1RSTAkweDEKKyNkZWZpbmUJVFlQX0FTWU5DCTB4MjAKKyNkZWZpbmUJVFlQX1BBUkFMTEVMCTB4NDAKKyNkZWZpbmUJVFlQX1NZTkNYMjEJMHg2MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglGb2xsb3dpbmcgaXMgYSBzZXQgb2YgZGVmaW5lcyBhbmQgc3RydWN0dXJlcyB1c2VkIHRvIGFjdHVhbGx5IGRlYWwKKyAqCXdpdGggdGhlIHNlcmlhbCBwb3J0cyBvbiB0aGUgYm9hcmQuIEZpcnN0bHkgaXMgdGhlIHNldCBvZiBjb21tYW5kcworICoJdGhhdCBjYW4gYmUgYXBwbGllZCB0byBwb3J0cy4KKyAqLworI2RlZmluZQlBU1lDTUQJCSgoKHVuc2lnbmVkIGxvbmcpICdhJykgPDwgOCkKKworI2RlZmluZQlBX05VTEwJCShBU1lDTUQgfCAwKQorI2RlZmluZQlBX0ZMVVNICQkoQVNZQ01EIHwgMSkKKyNkZWZpbmUJQV9CUkVBSwkJKEFTWUNNRCB8IDIpCisjZGVmaW5lCUFfR0VUUE9SVAkoQVNZQ01EIHwgMykKKyNkZWZpbmUJQV9TRVRQT1JUCShBU1lDTUQgfCA0KQorI2RlZmluZQlBX1NFVFBPUlRGCShBU1lDTUQgfCA1KQorI2RlZmluZQlBX1NFVFBPUlRGVFgJKEFTWUNNRCB8IDYpCisjZGVmaW5lCUFfU0VUUE9SVEZSWAkoQVNZQ01EIHwgNykKKyNkZWZpbmUJQV9HRVRTSUdOQUxTCShBU1lDTUQgfCA4KQorI2RlZmluZQlBX1NFVFNJR05BTFMJKEFTWUNNRCB8IDkpCisjZGVmaW5lCUFfU0VUU0lHTkFMU0YJKEFTWUNNRCB8IDEwKQorI2RlZmluZQlBX1NFVFNJR05BTFNGVFgJKEFTWUNNRCB8IDExKQorI2RlZmluZQlBX1NFVFNJR05BTFNGUlgJKEFTWUNNRCB8IDEyKQorI2RlZmluZQlBX0dFVE5PVElGWQkoQVNZQ01EIHwgMTMpCisjZGVmaW5lCUFfU0VUTk9USUZZCShBU1lDTUQgfCAxNCkKKyNkZWZpbmUJQV9OT1RJRlkJKEFTWUNNRCB8IDE1KQorI2RlZmluZQlBX1BPUlRDVFJMCShBU1lDTUQgfCAxNikKKyNkZWZpbmUJQV9HRVRTVEFUUwkoQVNZQ01EIHwgMTcpCisjZGVmaW5lCUFfUlFTVEFURQkoQVNZQ01EIHwgMTgpCisjZGVmaW5lCUFfRkxPV1NUQVRFCShBU1lDTUQgfCAxOSkKKyNkZWZpbmUJQV9DTEVBUlNUQVRTCShBU1lDTUQgfCAyMCkKKworLyoKKyAqCURlZmluZSB0aG9zZSBhcmd1bWVudHMgdXNlZCBmb3Igc2ltcGxlIGNvbW1hbmRzLgorICovCisjZGVmaW5lCUZMVVNIUlgJCTB4MQorI2RlZmluZQlGTFVTSFRYCQkweDIKKworI2RlZmluZQlCUkVBS09OCQktMQorI2RlZmluZQlCUkVBS09GRgktMgorCisvKgorICoJRGVmaW5lIHRoZSBwb3J0IHNldHRpbmcgc3RydWN0dXJlLCBhbmQgYWxsIHRob3NlIGRlZmluZXMgdGhhdCBnbyBhbG9uZworICoJd2l0aCBpdC4gQmFzaWNhbGx5IHRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGlzCisgKglwb3J0OiBiYXVkIHJhdGUsIGNoYXJzLCBwYXJpdHksIGlucHV0L291dHB1dCBjaGFyIGNvb2tpbmcgZXRjLgorICovCit0eXBlZGVmIHN0cnVjdCBhc3lwb3J0IHsKKwl1bnNpZ25lZCBsb25nCWJhdWRvdXQ7CisJdW5zaWduZWQgbG9uZwliYXVkaW47CisJdW5zaWduZWQgbG9uZwlpZmxhZzsKKwl1bnNpZ25lZCBsb25nCW9mbGFnOworCXVuc2lnbmVkIGxvbmcJbGZsYWc7CisJdW5zaWduZWQgbG9uZwlwZmxhZzsKKwl1bnNpZ25lZCBsb25nCWZsb3c7CisJdW5zaWduZWQgbG9uZwlzcGFyZTE7CisJdW5zaWduZWQgc2hvcnQJdnRpbWU7CisJdW5zaWduZWQgc2hvcnQJdm1pbjsKKwl1bnNpZ25lZCBzaG9ydAl0eGxvOworCXVuc2lnbmVkIHNob3J0CXR4aGk7CisJdW5zaWduZWQgc2hvcnQJcnhsbzsKKwl1bnNpZ25lZCBzaG9ydAlyeGhpOworCXVuc2lnbmVkIHNob3J0CXJ4aG9nOworCXVuc2lnbmVkIHNob3J0CXNwYXJlMjsKKwl1bnNpZ25lZCBjaGFyCWNzaXplOworCXVuc2lnbmVkIGNoYXIJc3RvcGJzOworCXVuc2lnbmVkIGNoYXIJcGFyaXR5OworCXVuc2lnbmVkIGNoYXIJc3RvcGluOworCXVuc2lnbmVkIGNoYXIJc3RhcnRpbjsKKwl1bnNpZ25lZCBjaGFyCXN0b3BvdXQ7CisJdW5zaWduZWQgY2hhcglzdGFydG91dDsKKwl1bnNpZ25lZCBjaGFyCXBhcm1hcms7CisJdW5zaWduZWQgY2hhcglicmttYXJrOworCXVuc2lnbmVkIGNoYXIJY2NbMTFdOworfSBhc3lwb3J0X3Q7CisKKyNkZWZpbmUJUFRfU1RPUDEJMHgwCisjZGVmaW5lCVBUX1NUT1AxNQkweDEKKyNkZWZpbmUJUFRfU1RPUDIJMHgyCisKKyNkZWZpbmUJUFRfTk9QQVJJVFkJMHgwCisjZGVmaW5lCVBUX09ERFBBUklUWQkweDEKKyNkZWZpbmUJUFRfRVZFTlBBUklUWQkweDIKKyNkZWZpbmUJUFRfTUFSS1BBUklUWQkweDMKKyNkZWZpbmUJUFRfU1BBQ0VQQVJJVFkJMHg0CisKKyNkZWZpbmUJRl9OT05FCQkweDAKKyNkZWZpbmUJRl9JWE9OCQkweDEKKyNkZWZpbmUJRl9JWE9GRgkJMHgyCisjZGVmaW5lCUZfSVhBTlkJCTB4NAorI2RlZmluZQlGX0lPWEFOWQkweDgKKyNkZWZpbmUJRl9SVFNGTE9XCTB4MTAKKyNkZWZpbmUJRl9DVFNGTE9XCTB4MjAKKyNkZWZpbmUJRl9EVFJGTE9XCTB4NDAKKyNkZWZpbmUJRl9EQ0RGTE9XCTB4ODAKKyNkZWZpbmUJRl9EU1JPRkxPVwkweDEwMAorI2RlZmluZQlGX0RTUklGTE9XCTB4MjAwCisKKyNkZWZpbmUJRklfTk9SWAkJMHgxCisjZGVmaW5lCUZJX1JBVwkJMHgyCisjZGVmaW5lCUZJX0lTVFJJUAkweDQKKyNkZWZpbmUJRklfVUNMQwkJMHg4CisjZGVmaW5lCUZJX0lOTENSCTB4MTAKKyNkZWZpbmUJRklfSUNSTkwJMHgyMAorI2RlZmluZQlGSV9JR05DUgkweDQwCisjZGVmaW5lCUZJX0lHTkJSRUFLCTB4ODAKKyNkZWZpbmUJRklfRFNDUkRCUkVBSwkweDEwMAorI2RlZmluZQlGSV8xTUFSS0JSRUFLCTB4MjAwCisjZGVmaW5lCUZJXzJNQVJLQlJFQUsJMHg0MDAKKyNkZWZpbmUJRklfWENITkdCUkVBSwkweDgwMAorI2RlZmluZQlGSV9JR05SWEVSUlMJMHgxMDAwCisjZGVmaW5lCUZJX0RTQ0RSWEVSUlMJMHgyMDAwCisjZGVmaW5lCUZJXzFNQVJLUlhFUlJTCTB4NDAwMAorI2RlZmluZQlGSV8yTUFSS1JYRVJSUwkweDgwMDAKKyNkZWZpbmUJRklfWENITkdSWEVSUlMJMHgxMDAwMAorI2RlZmluZQlGSV9EU0NSRE5VTEwJMHgyMDAwMAorCisjZGVmaW5lCUZPX09MQ1VDCTB4MQorI2RlZmluZQlGT19PTkxDUgkweDIKKyNkZWZpbmUJRk9fT09DUk5MCTB4NAorI2RlZmluZQlGT19PTk9DUgkweDgKKyNkZWZpbmUJRk9fT05MUkVUCTB4MTAKKyNkZWZpbmUJRk9fT05MCQkweDIwCisjZGVmaW5lCUZPX09CUwkJMHg0MAorI2RlZmluZQlGT19PVlQJCTB4ODAKKyNkZWZpbmUJRk9fT0ZGCQkweDEwMAorI2RlZmluZQlGT19PVEFCMQkweDIwMAorI2RlZmluZQlGT19PVEFCMgkweDQwMAorI2RlZmluZQlGT19PVEFCMwkweDgwMAorI2RlZmluZQlGT19PQ1IxCQkweDEwMDAKKyNkZWZpbmUJRk9fT0NSMgkJMHgyMDAwCisjZGVmaW5lCUZPX09DUjMJCTB4NDAwMAorI2RlZmluZQlGT19PRklMTAkweDgwMDAKKyNkZWZpbmUJRk9fT0RFTEwJMHgxMDAwMAorCisjZGVmaW5lCVBfUlRTTE9DSwkweDEKKyNkZWZpbmUJUF9DVFNMT0NLCTB4MgorI2RlZmluZQlQX01BUFJUUwkweDQKKyNkZWZpbmUJUF9NQVBDVFMJMHg4CisjZGVmaW5lCVBfTE9PUEJBQ0sJMHgxMAorI2RlZmluZQlQX0RUUkZPTExPVwkweDIwCisjZGVmaW5lCVBfRkFLRURDRAkweDQwCisKKyNkZWZpbmUJUF9SWElNSU4JMHgxMDAwMAorI2RlZmluZQlQX1JYSVRJTUUJMHgyMDAwMAorI2RlZmluZQlQX1JYVEhPTEQJMHg0MDAwMAorCisvKgorICoJRGVmaW5lIGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHNlcmlhbCBwb3J0IHNpZ25hbCBhbmQgZGF0YSBzdGF0ZQorICoJaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzeXNpZ3MgeworCXVuc2lnbmVkIGxvbmcJZGF0YTsKKwl1bnNpZ25lZCBsb25nCXNpZ25hbDsKKwl1bnNpZ25lZCBsb25nCXNpZ3ZhbHVlOworfSBhc3lzaWdzX3Q7CisKKyNkZWZpbmUJRFRfVFhCVVNZCTB4MQorI2RlZmluZQlEVF9UWEVNUFRZCTB4MgorI2RlZmluZQlEVF9UWExPVwkweDQKKyNkZWZpbmUJRFRfVFhISUdICTB4OAorI2RlZmluZQlEVF9UWEZVTEwJMHgxMAorI2RlZmluZQlEVF9UWEhPRwkweDIwCisjZGVmaW5lCURUX1RYRkxPV0VECTB4NDAKKyNkZWZpbmUJRFRfVFhCUkVBSwkweDgwCisKKyNkZWZpbmUJRFRfUlhCVVNZCTB4MTAwCisjZGVmaW5lCURUX1JYRU1QVFkJMHgyMDAKKyNkZWZpbmUJRFRfUlhMT1cJMHg0MDAKKyNkZWZpbmUJRFRfUlhISUdICTB4ODAwCisjZGVmaW5lCURUX1JYRlVMTAkweDEwMDAKKyNkZWZpbmUJRFRfUlhIT0cJMHgyMDAwCisjZGVmaW5lCURUX1JYRkxPV0VECTB4NDAwMAorI2RlZmluZQlEVF9SWEJSRUFLCTB4ODAwMAorCisjZGVmaW5lCVNHX0RUUgkJMHgxCisjZGVmaW5lCVNHX0RDRAkJMHgyCisjZGVmaW5lCVNHX1JUUwkJMHg0CisjZGVmaW5lCVNHX0NUUwkJMHg4CisjZGVmaW5lCVNHX0RTUgkJMHgxMAorI2RlZmluZQlTR19SSQkJMHgyMAorCisvKgorICoJRGVmaW5lIHRoZSBub3RpZmljYXRpb24gc2V0dGluZyBzdHJ1Y3R1cmUuIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZQorICoJcG9ydCB3aGF0IGV2ZW50cyB3ZSB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0LiBGaWVsZHMgaGVyZSB1c2UgdGhlCisgKglzYW1lIGRlZmluZXMgYXMgZm9yIHRoZSBhc3lzaWdzIHN0cnVjdHVyZSBhYm92ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXN5bm90aWZ5IHsKKwl1bnNpZ25lZCBsb25nCWN0cmw7CisJdW5zaWduZWQgbG9uZwlkYXRhOworCXVuc2lnbmVkIGxvbmcJc2lnbmFsOworCXVuc2lnbmVkIGxvbmcJc2lndmFsdWU7Cit9IGFzeW5vdGlmeV90OworCisvKgorICoJRGVmaW5lIHRoZSBwb3J0IGNvbnRyb2wgc3RydWN0dXJlLiBJdCBpcyB1c2VkIHRvIGRvIGZpbmUgZ3JhaW4KKyAqCWNvbnRyb2wgb3BlcmF0aW9ucyBvbiB0aGUgcG9ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJcnhjdHJsOworCXVuc2lnbmVkIGxvbmcJdHhjdHJsOworCWNoYXIJCXJ4aW1kY2g7CisJY2hhcgkJdHhpbWRjaDsKKwljaGFyCQlzcGFyZTE7CisJY2hhcgkJc3BhcmUyOworfSBhc3ljdHJsX3Q7CisKKyNkZWZpbmUJQ1RfRU5BQkxFCTB4MQorI2RlZmluZQlDVF9ESVNBQkxFCTB4MgorI2RlZmluZQlDVF9TVE9QCQkweDQKKyNkZWZpbmUJQ1RfU1RBUlQJMHg4CisjZGVmaW5lCUNUX1NUQVJURkxPVwkweDEwCisjZGVmaW5lCUNUX1NUT1BGTE9XCTB4MjAKKyNkZWZpbmUJQ1RfU0VORENIUgkweDQwCisKKy8qCisgKglEZWZpbmUgdGhlIHN0YXRzIHN0cnVjdHVyZSBrZXB0IGZvciBlYWNoIHBvcnQuIFRoaXMgaXMgYSB1c2VmdWwgc2V0CisgKglvZiBkYXRhIGNvbGxlY3RlZCBmb3IgZWFjaCBwb3J0IG9uIHRoZSBzbGF2ZS4gVGhlIEFfR0VUU1RBVFMgY29tbWFuZAorICoJaXMgdXNlZCB0byByZXRyaWV2ZSB0aGlzIGRhdGEgZnJvbSB0aGUgc2xhdmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFzeXN0YXRzIHsKKwl1bnNpZ25lZCBsb25nCW9wZW5zOworCXVuc2lnbmVkIGxvbmcJdHhjaGFyczsKKwl1bnNpZ25lZCBsb25nCXJ4Y2hhcnM7CisJdW5zaWduZWQgbG9uZwl0eHJpbmdxOworCXVuc2lnbmVkIGxvbmcJcnhyaW5ncTsKKwl1bnNpZ25lZCBsb25nCXR4bXNnczsKKwl1bnNpZ25lZCBsb25nCXJ4bXNnczsKKwl1bnNpZ25lZCBsb25nCXR4Zmx1c2hlczsKKwl1bnNpZ25lZCBsb25nCXJ4Zmx1c2hlczsKKwl1bnNpZ25lZCBsb25nCW92ZXJydW5zOworCXVuc2lnbmVkIGxvbmcJZnJhbWluZzsKKwl1bnNpZ25lZCBsb25nCXBhcml0eTsKKwl1bnNpZ25lZCBsb25nCXJpbmdvdmVyOworCXVuc2lnbmVkIGxvbmcJbG9zdDsKKwl1bnNpZ25lZCBsb25nCXJ4c3RhcnQ7CisJdW5zaWduZWQgbG9uZwlyeHN0b3A7CisJdW5zaWduZWQgbG9uZwl0eHN0YXJ0OworCXVuc2lnbmVkIGxvbmcJdHhzdG9wOworCXVuc2lnbmVkIGxvbmcJZGNkY250OworCXVuc2lnbmVkIGxvbmcJZHRyY250OworCXVuc2lnbmVkIGxvbmcJY3RzY250OworCXVuc2lnbmVkIGxvbmcJcnRzY250OworCXVuc2lnbmVkIGxvbmcJZHNyY250OworCXVuc2lnbmVkIGxvbmcJcmljbnQ7CisJdW5zaWduZWQgbG9uZwl0eGJyZWFrczsKKwl1bnNpZ25lZCBsb25nCXJ4YnJlYWtzOworCXVuc2lnbmVkIGxvbmcJc2lnbmFsczsKKwl1bnNpZ25lZCBsb25nCXN0YXRlOworCXVuc2lnbmVkIGxvbmcJaHdpZDsKK30gYXN5c3RhdHNfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQWxsIGNvbW1hbmQgYW5kIGNvbnRyb2wgY29tbXVuaWNhdGlvbiB3aXRoIGEgZGV2aWNlIG9uIHRoZSBzbGF2ZSBpcworICoJdmlhIGEgY29udHJvbCBibG9jayBpbiBzaGFyZWQgbWVtb3J5LiBFYWNoIGRldmljZSBoYXMgaXRzIG93biBjb250cm9sCisgKglibG9jaywgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4gVGhlIGNvbnRyb2wgYmxvY2sgYWxsb3dzCisgKgl0aGUgaG9zdCB0byBvcGVuLCBjbG9zZSBhbmQgY29udHJvbCB0aGUgZGV2aWNlIG9uIHRoZSBzbGF2ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2RrY3RybCB7CisJdW5zaWduZWQgY2hhcglvcGVuOworCXVuc2lnbmVkIGNoYXIJY2xvc2U7CisJdW5zaWduZWQgbG9uZwlvcGVuYXJnOworCXVuc2lnbmVkIGxvbmcJY2xvc2Vhcmc7CisJdW5zaWduZWQgbG9uZwljbWQ7CisJdW5zaWduZWQgbG9uZwlzdGF0dXM7CisJdW5zaWduZWQgbG9uZwlhcmdzWzMyXTsKK30gY2RrY3RybF90OworCisvKgorICoJRWFjaCBkZXZpY2Ugb24gdGhlIHNsYXZlIHBhc3NlcyBkYXRhIHRvIGFuZCBmcm9tIHRoZSBob3N0IHZpYSBhIHJpbmcKKyAqCXF1ZXVlIGluIHNoYXJlZCBtZW1vcnkuIERlZmluZSBhIHJpbmcgcXVldWUgc3RydWN0dXJlIHRvIGhvbGQgdGhlCisgKgl2aXRhbCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJpbmcgcXVldWUuIFR3byByaW5nIHF1ZXVlcyB3aWxsIGJlCisgKglhbGxvY2F0ZWQgZm9yIGVhY2ggcG9ydCwgb25lIGZvciByZWNlaXZlIGRhdGEgYW5kIG9uZSBmb3IgdHJhbnNtaXQKKyAqCWRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IGNka2FzeXJxIHsKKwl1bnNpZ25lZCBsb25nCW9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydAlzaXplOworCXVuc2lnbmVkIHNob3J0CWhlYWQ7CisJdW5zaWduZWQgc2hvcnQJdGFpbDsKK30gY2RrYXN5cnFfdDsKKworLyoKKyAqCUVhY2ggYXN5bmNocm9ub3VzIHBvcnQgaXMgZGVmaW5lZCBpbiBzaGFyZWQgbWVtb3J5IGJ5IHRoZSBmb2xsb3dpbmcKKyAqCXN0cnVjdHVyZS4gSXQgY29udGFpbnMgYSBjb250cm9sIGJsb2NrIHRvIGNvbW1hbmQgYSBkZXZpY2UsIGFuZCBhbHNvCisgKgl0aGUgbmVjZXNzYXJ5IGRhdGEgY2hhbm5lbCBpbmZvcm1hdGlvbiBhcyB3ZWxsLgorICovCit0eXBlZGVmIHN0cnVjdCBjZGthc3kgeworCWNka2N0cmxfdAljdHJsOworCXVuc2lnbmVkIHNob3J0CW5vdGlmeTsKKwlhc3lub3RpZnlfdAljaGFuZ2VkOworCXVuc2lnbmVkIHNob3J0CXJlY2VpdmU7CisJY2RrYXN5cnFfdAlyeHE7CisJdW5zaWduZWQgc2hvcnQJdHJhbnNtaXQ7CisJY2RrYXN5cnFfdAl0eHE7Cit9IGNka2FzeV90OworCisjcHJhZ21hCXBhY2soKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglEZWZpbmUgdGhlIHNldCBvZiBpb2N0bHMgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGRvIHNwZWNpYWwgdGhpbmdzCisgKgl0byB0aGUgYm9hcmQuIFRoZXNlIGluY2x1ZGUgaW50ZXJydXB0aW5nIGl0LCBhbmQgaW5pdGlhbGl6aW5nCisgKgl0aGUgZHJpdmVyIGFmdGVyIGJvYXJkIHN0YXJ0dXAgYW5kIHNodXRkb3duLgorICovCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZQlTVExfQklOVFIJX0lPKCdzJywyMCkKKyNkZWZpbmUJU1RMX0JTVEFSVAlfSU8oJ3MnLDIxKQorI2RlZmluZQlTVExfQlNUT1AJX0lPKCdzJywyMikKKyNkZWZpbmUJU1RMX0JSRVNFVAlfSU8oJ3MnLDIzKQorCisvKgorICoJRGVmaW5lIGEgc2V0IG9mIGlvY3RsIGV4dGVuc2lvbnMsIHVzZWQgdG8gZ2V0IGF0IHNwZWNpYWwgc3R1ZmYuCisgKi8KKyNkZWZpbmUJU1RMX0dFVFBGTEFHCV9JTygncycsODApCisjZGVmaW5lCVNUTF9TRVRQRkxBRwlfSU8oJ3MnLDgxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Ryb20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2Ryb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA5ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jZHJvbS5oCkBAIC0wLDAgKzEsOTA4IEBACisvKgorICogLS0gPGxpbnV4L2Nkcm9tLmg+CisgKiBHZW5lcmFsIGhlYWRlciBmaWxlIGZvciBsaW51eCBDRC1ST00gZHJpdmVycyAKKyAqIENvcHlyaWdodCAoQykgMTk5MiAgICAgICAgIERhdmlkIEdpbGxlciwgcmFmZXRtYWRAb3h5LmVkdQorICogICAgICAgICAgICAgICAxOTk0LCAxOTk1ICAgRWJlcmhhcmQgTcO2bmtlYmVyZywgZW1vZW5rZUBnd2RnLmRlCisgKiAgICAgICAgICAgICAgIDE5OTYgICAgICAgICBEYXZpZCB2YW4gTGVldXdlbiwgZGF2aWRAdG0udG5vLm5sCisgKiAgICAgICAgICAgICAgIDE5OTcsIDE5OTggICBFcmlrIEFuZGVyc2VuLCBhbmRlcnNlZUBkZWJpYW4ub3JnCisgKiAgICAgICAgICAgICAgIDE5OTgtMjAwMiAgICBKZW5zIEF4Ym9lLCBheGJvZUBzdXNlLmRlCisgKi8KKyAKKyNpZm5kZWYJX0xJTlVYX0NEUk9NX0gKKyNkZWZpbmUJX0xJTlVYX0NEUk9NX0gKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFzIG9mIExpbnV4IDIuMS54LCBhbGwgTGludXggQ0QtUk9NIGFwcGxpY2F0aW9uIHByb2dyYW1zIHdpbGwgdXNlIHRoaXMgCisgKiAoYW5kIG9ubHkgdGhpcykgaW5jbHVkZSBmaWxlLiAgSXQgaXMgbXkgaG9wZSB0byBwcm92aWRlIExpbnV4IHdpdGgKKyAqIGEgdW5pZm9ybSBpbnRlcmZhY2UgYmV0d2VlbiBzb2Z0d2FyZSBhY2Nlc3NpbmcgQ0QtUk9NcyBhbmQgdGhlIHZhcmlvdXMgCisgKiBkZXZpY2UgZHJpdmVycyB0aGF0IGFjdHVhbGx5IHRhbGsgdG8gdGhlIGRyaXZlcy4gIFRoZXJlIG1heSBzdGlsbCBiZQorICogMjMgZGlmZmVyZW50IGtpbmRzIG9mIHN0cmFuZ2UgQ0QtUk9NIGRyaXZlcywgYnV0IGF0IGxlYXN0IHRoZXJlIHdpbGwgCisgKiBub3cgYmUgb25lLCBhbmQgb25seSBvbmUsIExpbnV4IENELVJPTSBpbnRlcmZhY2UuCisgKgorICogQWRkaXRpb25hbGx5LCBhcyBvZiBMaW51eCAyLjEueCwgYWxsIExpbnV4IGFwcGxpY2F0aW9uIHByb2dyYW1zIAorICogc2hvdWxkIHVzZSB0aGUgT19OT05CTE9DSyBvcHRpb24gd2hlbiBvcGVuaW5nIGEgQ0QtUk9NIGRldmljZSAKKyAqIGZvciBzdWJzZXF1ZW50IGlvY3RsIGNvbW1hbmRzLiAgVGhpcyBhbGxvd3MgZm9yIG5lYXQgc3lzdGVtIGVycm9ycyAKKyAqIGxpa2UgIk5vIG1lZGl1bSBmb3VuZCIgb3IgIldyb25nIG1lZGl1bSB0eXBlIiB1cG9uIGF0dGVtcHRpbmcgdG8gCisgKiBtb3VudCBvciBwbGF5IGFuIGVtcHR5IHNsb3QsIG1vdW50IGFuIGF1ZGlvIGRpc2MsIG9yIHBsYXkgYSBkYXRhIGRpc2MuCisgKiBHZW5lcmFsbHksIGNoYW5naW5nIGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gc3VwcG9ydCBPX05PTkJMT0NLCisgKiBpcyBhcyBlYXN5IGFzIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAtICAgIGRyaXZlID0gb3BlbigiL2Rldi9jZHJvbSIsIE9fUkRPTkxZKTsKKyAqICAgICAgICsgICAgZHJpdmUgPSBvcGVuKCIvZGV2L2Nkcm9tIiwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKyAqIEl0IGlzIHdvcnRoIHRoZSBzbWFsbCBjaGFuZ2UuCisgKgorICogIFBhdGNoZXMgZm9yIG1hbnkgY29tbW9uIENEIHByb2dyYW1zIChwcm92aWRlZCBieSBEYXZpZCBBLiB2YW4gTGVldXdlbikKKyAqICBjYW4gYmUgZm91bmQgYXQ6ICBmdHA6Ly9mdHAuZ3dkZy5kZS9wdWIvbGludXgvY2Ryb20vZHJpdmVycy9jbTIwNi8KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdoZW4gYSBkcml2ZXIgc3VwcG9ydHMgYSBjZXJ0YWluIGZ1bmN0aW9uLCBidXQgdGhlIGNkcm9tIGRyaXZlIHdlIGFyZSAKKyAqIHVzaW5nIGRvZXNuJ3QsIHdlIHdpbGwgcmV0dXJuIHRoZSBlcnJvciBFRFJJVkVfQ0FOVF9ET19USElTLiAgV2Ugd2lsbCAKKyAqIGJvcnJvdyB0aGUgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIiBlcnJvciBmcm9tIHRoZSBuZXR3b3JrIGZvbGtzIHRvIAorICogYWNjb21wbGlzaCB0aGlzLiAgTWF5YmUgc29tZWRheSB3ZSB3aWxsIGdldCBhIG1vcmUgdGFyZ2V0ZWQgZXJyb3IgY29kZSwgCisgKiBidXQgdGhpcyB3aWxsIGRvIGZvciBub3cuLi4gKi8KKyNkZWZpbmUgRURSSVZFX0NBTlRfRE9fVEhJUyAgRU9QTk9UU1VQUAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIENELVJPTSBJT0NUTCBjb21tYW5kcyAgLS0gdGhlc2Ugc2hvdWxkIGJlIHN1cHBvcnRlZCBieSAKKyAqIGFsbCB0aGUgdmFyaW91cyBjZHJvbSBkcml2ZXJzLiAgRm9yIHRoZSBDRC1ST00gaW9jdGxzLCB3ZSAKKyAqIHdpbGwgY29tbWFuZGVlciBieXRlIDB4NTMsIG9yICdTJy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDRFJPTVBBVVNFCQkweDUzMDEgLyogUGF1c2UgQXVkaW8gT3BlcmF0aW9uICovIAorI2RlZmluZSBDRFJPTVJFU1VNRQkJMHg1MzAyIC8qIFJlc3VtZSBwYXVzZWQgQXVkaW8gT3BlcmF0aW9uICovCisjZGVmaW5lIENEUk9NUExBWU1TRgkJMHg1MzAzIC8qIFBsYXkgQXVkaW8gTVNGIChzdHJ1Y3QgY2Ryb21fbXNmKSAqLworI2RlZmluZSBDRFJPTVBMQVlUUktJTkQJCTB4NTMwNCAvKiBQbGF5IEF1ZGlvIFRyYWNrL2luZGV4IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdGkpICovCisjZGVmaW5lIENEUk9NUkVBRFRPQ0hEUgkJMHg1MzA1IC8qIFJlYWQgVE9DIGhlYWRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3RvY2hkcikgKi8KKyNkZWZpbmUgQ0RST01SRUFEVE9DRU5UUlkJMHg1MzA2IC8qIFJlYWQgVE9DIGVudHJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdG9jZW50cnkpICovCisjZGVmaW5lIENEUk9NU1RPUAkJMHg1MzA3IC8qIFN0b3AgdGhlIGNkcm9tIGRyaXZlICovCisjZGVmaW5lIENEUk9NU1RBUlQJCTB4NTMwOCAvKiBTdGFydCB0aGUgY2Ryb20gZHJpdmUgKi8KKyNkZWZpbmUgQ0RST01FSkVDVAkJMHg1MzA5IC8qIEVqZWN0cyB0aGUgY2Ryb20gbWVkaWEgKi8KKyNkZWZpbmUgQ0RST01WT0xDVFJMCQkweDUzMGEgLyogQ29udHJvbCBvdXRwdXQgdm9sdW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fdm9sY3RybCkgKi8KKyNkZWZpbmUgQ0RST01TVUJDSE5MCQkweDUzMGIgLyogUmVhZCBzdWJjaGFubmVsIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV9zdWJjaG5sKSAqLworI2RlZmluZSBDRFJPTVJFQURNT0RFMgkJMHg1MzBjIC8qIFJlYWQgQ0RST00gbW9kZSAyIGRhdGEgKDIzMzYgQnl0ZXMpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fcmVhZCkgKi8KKyNkZWZpbmUgQ0RST01SRUFETU9ERTEJCTB4NTMwZCAvKiBSZWFkIENEUk9NIG1vZGUgMSBkYXRhICgyMDQ4IEJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgY2Ryb21fcmVhZCkgKi8KKyNkZWZpbmUgQ0RST01SRUFEQVVESU8JCTB4NTMwZSAvKiAoc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8pICovCisjZGVmaW5lIENEUk9NRUpFQ1RfU1cJCTB4NTMwZiAvKiBlbmFibGUoMSkvZGlzYWJsZSgwKSBhdXRvLWVqZWN0aW5nICovCisjZGVmaW5lIENEUk9NTVVMVElTRVNTSU9OCTB4NTMxMCAvKiBPYnRhaW4gdGhlIHN0YXJ0LW9mLWxhc3Qtc2Vzc2lvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9mIG11bHRpIHNlc3Npb24gZGlza3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24pICovCisjZGVmaW5lIENEUk9NX0dFVF9NQ04JCTB4NTMxMSAvKiBPYnRhaW4gdGhlICJVbml2ZXJzYWwgUHJvZHVjdCBDb2RlIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhdmFpbGFibGUgKHN0cnVjdCBjZHJvbV9tY24pICovCisjZGVmaW5lIENEUk9NX0dFVF9VUEMJCUNEUk9NX0dFVF9NQ04gIC8qIFRoaXMgb25lIGlzIGRlcHJlY2F0ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGhlcmUgYW55d2F5IGZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIENEUk9NUkVTRVQJCTB4NTMxMiAvKiBoYXJkLXJlc2V0IHRoZSBkcml2ZSAqLworI2RlZmluZSBDRFJPTVZPTFJFQUQJCTB4NTMxMyAvKiBHZXQgdGhlIGRyaXZlJ3Mgdm9sdW1lIHNldHRpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3ZvbGN0cmwpICovCisjZGVmaW5lIENEUk9NUkVBRFJBVwkJMHg1MzE0CS8qIHJlYWQgZGF0YSBpbiByYXcgbW9kZSAoMjM1MiBCeXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGNkcm9tX3JlYWQpICovCisvKiAKKyAqIFRoZXNlIGlvY3RscyBhcmUgdXNlZCBvbmx5IHVzZWQgaW4gYXp0Y2QuYyBhbmQgb3B0Y2QuYworICovCisjZGVmaW5lIENEUk9NUkVBRENPT0tFRAkJMHg1MzE1CS8qIHJlYWQgZGF0YSBpbiBjb29rZWQgbW9kZSAqLworI2RlZmluZSBDRFJPTVNFRUsJCTB4NTMxNiAgLyogc2VlayBtc2YgYWRkcmVzcyAqLworICAKKy8qCisgKiBUaGlzIGlvY3RsIGlzIG9ubHkgdXNlZCBieSB0aGUgc2NzaS1jZCBkcml2ZXIuICAKKyAgIEl0IGlzIGZvciBwbGF5aW5nIGF1ZGlvIGluIGxvZ2ljYWwgYmxvY2sgYWRkcmVzc2luZyBtb2RlLgorICovCisjZGVmaW5lIENEUk9NUExBWUJMSwkJMHg1MzE3CS8qIChzdHJ1Y3QgY2Ryb21fYmxrKSAqLworCisvKiAKKyAqIFRoZXNlIGlvY3RscyBhcmUgb25seSB1c2VkIGluIG9wdGNkLmMKKyAqLworI2RlZmluZSBDRFJPTVJFQURBTEwJCTB4NTMxOAkvKiByZWFkIGFsbCAyNjQ2IGJ5dGVzICovCisKKy8qIAorICogVGhlc2UgaW9jdGxzIGFyZSAobm93KSBvbmx5IGluIGlkZS1jZC5jIGZvciBjb250cm9sbGluZyAKKyAqIGRyaXZlIHNwaW5kb3duIHRpbWUuICBUaGV5IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUKKyAqIFVuaWZvcm0gZHJpdmVyLCB2aWEgZ2VuZXJpYyBwYWNrZXQgY29tbWFuZHMsIEdQQ01EX01PREVfU0VMRUNUXzEwLAorICogR1BDTURfTU9ERV9TRU5TRV8xMCBhbmQgdGhlIEdQTU9ERV9QT1dFUl9QQUdFLi4uCisgKiAgLUVyaWsKKyAqLworI2RlZmluZSBDRFJPTUdFVFNQSU5ET1dOICAgICAgICAweDUzMWQKKyNkZWZpbmUgQ0RST01TRVRTUElORE9XTiAgICAgICAgMHg1MzFlCisKKy8qIAorICogVGhlc2UgaW9jdGxzIGFyZSBpbXBsZW1lbnRlZCB0aHJvdWdoIHRoZSB1bmlmb3JtIENELVJPTSBkcml2ZXIKKyAqIFRoZXkgX3dpbGxfIGJlIGFkb3B0ZWQgYnkgYWxsIENELVJPTSBkcml2ZXJzLCB3aGVuIGFsbCB0aGUgQ0QtUk9NCisgKiBkcml2ZXJzIGFyZSBldmVudHVhbGx5IHBvcnRlZCB0byB0aGUgdW5pZm9ybSBDRC1ST00gZHJpdmVyIGludGVyZmFjZS4KKyAqLworI2RlZmluZSBDRFJPTUNMT1NFVFJBWQkJMHg1MzE5CS8qIHBlbmRhbnQgb2YgQ0RST01FSkVDVCAqLworI2RlZmluZSBDRFJPTV9TRVRfT1BUSU9OUwkweDUzMjAgIC8qIFNldCBiZWhhdmlvciBvcHRpb25zICovCisjZGVmaW5lIENEUk9NX0NMRUFSX09QVElPTlMJMHg1MzIxICAvKiBDbGVhciBiZWhhdmlvciBvcHRpb25zICovCisjZGVmaW5lIENEUk9NX1NFTEVDVF9TUEVFRAkweDUzMjIgIC8qIFNldCB0aGUgQ0QtUk9NIHNwZWVkICovCisjZGVmaW5lIENEUk9NX1NFTEVDVF9ESVNDCTB4NTMyMyAgLyogU2VsZWN0IGRpc2MgKGZvciBqdWtlLWJveGVzKSAqLworI2RlZmluZSBDRFJPTV9NRURJQV9DSEFOR0VECTB4NTMyNSAgLyogQ2hlY2sgaXMgbWVkaWEgY2hhbmdlZCAgKi8KKyNkZWZpbmUgQ0RST01fRFJJVkVfU1RBVFVTCTB4NTMyNiAgLyogR2V0IHRyYXkgcG9zaXRpb24sIGV0Yy4gKi8KKyNkZWZpbmUgQ0RST01fRElTQ19TVEFUVVMJMHg1MzI3ICAvKiBHZXQgZGlzYyB0eXBlLCBldGMuICovCisjZGVmaW5lIENEUk9NX0NIQU5HRVJfTlNMT1RTICAgIDB4NTMyOCAgLyogR2V0IG51bWJlciBvZiBzbG90cyAqLworI2RlZmluZSBDRFJPTV9MT0NLRE9PUgkJMHg1MzI5ICAvKiBsb2NrIG9yIHVubG9jayBkb29yICovCisjZGVmaW5lIENEUk9NX0RFQlVHCQkweDUzMzAJLyogVHVybiBkZWJ1ZyBtZXNzYWdlcyBvbi9vZmYgKi8KKyNkZWZpbmUgQ0RST01fR0VUX0NBUEFCSUxJVFkJMHg1MzMxCS8qIGdldCBjYXBhYmlsaXRpZXMgKi8KKworLyogTm90ZSB0aGF0IHNjc2kvc2NzaV9pb2N0bC5oIGFsc28gdXNlcyAweDUzODIgLSAweDUzODYuCisgKiBGdXR1cmUgQ0RST00gaW9jdGxzIHNob3VsZCBiZSBrZXB0IGJlbG93IDB4NTM3RgorICovCisKKy8qIFRoaXMgaW9jdGwgaXMgb25seSB1c2VkIGJ5IHNicGNkIGF0IHRoZSBtb21lbnQgKi8KKyNkZWZpbmUgQ0RST01BVURJT0JVRlNJWiAgICAgICAgMHg1MzgyCS8qIHNldCB0aGUgYXVkaW8gYnVmZmVyIHNpemUgKi8KKwkJCQkJLyogY29uZmxpY3Qgd2l0aCBTQ1NJX0lPQ1RMX0dFVF9JRExVTiAqLworCisvKiBEVkQtUk9NIFNwZWNpZmljIGlvY3RscyAqLworI2RlZmluZSBEVkRfUkVBRF9TVFJVQ1QJCTB4NTM5MCAgLyogUmVhZCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgRFZEX1dSSVRFX1NUUlVDVAkweDUzOTEgIC8qIFdyaXRlIHN0cnVjdHVyZSAqLworI2RlZmluZSBEVkRfQVVUSAkJMHg1MzkyICAvKiBBdXRoZW50aWNhdGlvbiAqLworCisjZGVmaW5lIENEUk9NX1NFTkRfUEFDS0VUCTB4NTM5MwkvKiBzZW5kIGEgcGFja2V0IHRvIHRoZSBkcml2ZSAqLworI2RlZmluZSBDRFJPTV9ORVhUX1dSSVRBQkxFCTB4NTM5NAkvKiBnZXQgbmV4dCB3cml0YWJsZSBibG9jayAqLworI2RlZmluZSBDRFJPTV9MQVNUX1dSSVRURU4JMHg1Mzk1CS8qIGdldCBsYXN0IGJsb2NrIHdyaXR0ZW4gb24gZGlzYyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0RST00gSU9DVEwgc3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFkZHJlc3MgaW4gTVNGIGZvcm1hdCAqLworc3RydWN0IGNkcm9tX21zZjAJCQoreworCV9fdTgJbWludXRlOworCV9fdTgJc2Vjb25kOworCV9fdTgJZnJhbWU7Cit9OworCisvKiBBZGRyZXNzIGluIGVpdGhlciBNU0Ygb3IgbG9naWNhbCBmb3JtYXQgKi8KK3VuaW9uIGNkcm9tX2FkZHIJCQoreworCXN0cnVjdCBjZHJvbV9tc2YwCW1zZjsKKwlpbnQJCQlsYmE7Cit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVBMQVlNU0YgaW9jdGwgKi8gCitzdHJ1Y3QgY2Ryb21fbXNmIAoreworCV9fdTgJY2Rtc2ZfbWluMDsJLyogc3RhcnQgbWludXRlICovCisJX191OAljZG1zZl9zZWMwOwkvKiBzdGFydCBzZWNvbmQgKi8KKwlfX3U4CWNkbXNmX2ZyYW1lMDsJLyogc3RhcnQgZnJhbWUgKi8KKwlfX3U4CWNkbXNmX21pbjE7CS8qIGVuZCBtaW51dGUgKi8KKwlfX3U4CWNkbXNmX3NlYzE7CS8qIGVuZCBzZWNvbmQgKi8KKwlfX3U4CWNkbXNmX2ZyYW1lMTsJLyogZW5kIGZyYW1lICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVBMQVlUUktJTkQgaW9jdGwgKi8KK3N0cnVjdCBjZHJvbV90aSAKK3sKKwlfX3U4CWNkdGlfdHJrMDsJLyogc3RhcnQgdHJhY2sgKi8KKwlfX3U4CWNkdGlfaW5kMDsJLyogc3RhcnQgaW5kZXggKi8KKwlfX3U4CWNkdGlfdHJrMTsJLyogZW5kIHRyYWNrICovCisJX191OAljZHRpX2luZDE7CS8qIGVuZCBpbmRleCAqLworfTsKKworLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCBieSB0aGUgQ0RST01SRUFEVE9DSERSIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fdG9jaGRyIAkKK3sKKwlfX3U4CWNkdGhfdHJrMDsJLyogc3RhcnQgdHJhY2sgKi8KKwlfX3U4CWNkdGhfdHJrMTsJLyogZW5kIHRyYWNrICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVZPTENUUkwgYW5kIENEUk9NVk9MUkVBRCBpb2N0bHMgKi8KK3N0cnVjdCBjZHJvbV92b2xjdHJsCit7CisJX191OAljaGFubmVsMDsKKwlfX3U4CWNoYW5uZWwxOworCV9fdTgJY2hhbm5lbDI7CisJX191OAljaGFubmVsMzsKK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NU1VCQ0hOTCBpb2N0bCAqLworc3RydWN0IGNkcm9tX3N1YmNobmwgCit7CisJX191OAljZHNjX2Zvcm1hdDsKKwlfX3U4CWNkc2NfYXVkaW9zdGF0dXM7CisJX191OAljZHNjX2FkcjoJNDsKKwlfX3U4CWNkc2NfY3RybDoJNDsKKwlfX3U4CWNkc2NfdHJrOworCV9fdTgJY2RzY19pbmQ7CisJdW5pb24gY2Ryb21fYWRkciBjZHNjX2Fic2FkZHI7CisJdW5pb24gY2Ryb21fYWRkciBjZHNjX3JlbGFkZHI7Cit9OworCisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIENEUk9NUkVBRFRPQ0VOVFJZIGlvY3RsICovCitzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgCit7CisJX191OAljZHRlX3RyYWNrOworCV9fdTgJY2R0ZV9hZHIJOjQ7CisJX191OAljZHRlX2N0cmwJOjQ7CisJX191OAljZHRlX2Zvcm1hdDsKKwl1bmlvbiBjZHJvbV9hZGRyIGNkdGVfYWRkcjsKKwlfX3U4CWNkdGVfZGF0YW1vZGU7Cit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVJFQURNT0RFMSwgYW5kIENEUk9NUkVBRE1PREUyIGlvY3RscyAqLworc3RydWN0IGNkcm9tX3JlYWQgICAgICAKK3sKKwlpbnQJY2RyZWFkX2xiYTsKKwljaGFyIAkqY2RyZWFkX2J1ZmFkZHI7CisJaW50CWNkcmVhZF9idWZsZW47Cit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIGJ5IHRoZSBDRFJPTVJFQURBVURJTyBpb2N0bCAqLworc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8KK3sKKwl1bmlvbiBjZHJvbV9hZGRyIGFkZHI7IC8qIGZyYW1lIGFkZHJlc3MgKi8KKwlfX3U4IGFkZHJfZm9ybWF0OyAgICAgIC8qIENEUk9NX0xCQSBvciBDRFJPTV9NU0YgKi8KKwlpbnQgbmZyYW1lczsgICAgICAgICAgIC8qIG51bWJlciBvZiAyMzUyLWJ5dGUtZnJhbWVzIHRvIHJlYWQgYXQgb25jZSAqLworCV9fdTggKmJ1ZjsgICAgICAvKiBmcmFtZSBidWZmZXIgKHNpemU6IG5mcmFtZXMqMjM1MiBieXRlcykgKi8KK307CisKKy8qIFRoaXMgc3RydWN0IGlzIHVzZWQgd2l0aCB0aGUgQ0RST01NVUxUSVNFU1NJT04gaW9jdGwgKi8KK3N0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24KK3sKKwl1bmlvbiBjZHJvbV9hZGRyIGFkZHI7IC8qIGZyYW1lIGFkZHJlc3M6IHN0YXJ0LW9mLWxhc3Qtc2Vzc2lvbiAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHRoZSBuZXcgImZyYW1lIDE2IiEpLiAgT25seSB2YWxpZAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSAieGFfZmxhZyIgaXMgdHJ1ZS4gKi8KKwlfX3U4IHhhX2ZsYWc7ICAgICAgICAvKiAxOiAiaXMgWEEgZGlzayIgKi8KKwlfX3U4IGFkZHJfZm9ybWF0OyAgICAvKiBDRFJPTV9MQkEgb3IgQ0RST01fTVNGICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyB1c2VkIHdpdGggdGhlIENEUk9NX0dFVF9NQ04gaW9jdGwuICAKKyAqIFZlcnkgZmV3IGF1ZGlvIGRpc2NzIGFjdHVhbGx5IGhhdmUgVW5pdmVyc2FsIFByb2R1Y3QgQ29kZSBpbmZvcm1hdGlvbiwgCisgKiB3aGljaCBzaG91bGQganVzdCBiZSB0aGUgTWVkaXVtIENhdGFsb2cgTnVtYmVyIG9uIHRoZSBib3guICBBbHNvIG5vdGUgCisgKiB0aGF0IHRoZSB3YXkgdGhlIGNvZGVpcyB3cml0dGVuIG9uIENEIGlzIF9ub3RfIHVuaWZvcm0gYWNyb3NzIGFsbCBkaXNjcyEKKyAqLyAgCitzdHJ1Y3QgY2Ryb21fbWNuIAoreworICBfX3U4IG1lZGl1bV9jYXRhbG9nX251bWJlclsxNF07IC8qIDEzIEFTQ0lJIGRpZ2l0cywgbnVsbC10ZXJtaW5hdGVkICovCit9OworCisvKiBUaGlzIGlzIHVzZWQgYnkgdGhlIENEUk9NUExBWUJMSyBpb2N0bCAqLworc3RydWN0IGNkcm9tX2JsayAKK3sKKwl1bnNpZ25lZCBmcm9tOworCXVuc2lnbmVkIHNob3J0IGxlbjsKK307CisKKyNkZWZpbmUgQ0RST01fUEFDS0VUX1NJWkUJMTIKKworI2RlZmluZSBDR0NfREFUQV9VTktOT1dOCTAKKyNkZWZpbmUgQ0dDX0RBVEFfV1JJVEUJCTEKKyNkZWZpbmUgQ0dDX0RBVEFfUkVBRAkJMgorI2RlZmluZSBDR0NfREFUQV9OT05FCQkzCisKKy8qIGZvciBDRFJPTV9QQUNLRVRfQ09NTUFORCBpb2N0bCAqLworc3RydWN0IGNkcm9tX2dlbmVyaWNfY29tbWFuZAoreworCXVuc2lnbmVkIGNoYXIgCQljbWRbQ0RST01fUEFDS0VUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIJICpidWZmZXI7CisJdW5zaWduZWQgaW50IAkJYnVmbGVuOworCWludAkJCXN0YXQ7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2UgKnNlbnNlOworCXVuc2lnbmVkIGNoYXIJCWRhdGFfZGlyZWN0aW9uOworCWludAkJCXF1aWV0OworCWludAkJCXRpbWVvdXQ7CisJdm9pZAkJICpyZXNlcnZlZFsxXTsJLyogdW51c2VkLCBhY3R1YWxseSAqLworfTsKKworLyoKKyAqIEEgQ0QtUk9NIHBoeXNpY2FsIHNlY3RvciBzaXplIGlzIDIwNDgsIDIwNTIsIDIwNTYsIDIzMjQsIDIzMzIsIDIzMzYsIAorICogMjM0MCwgb3IgMjM1MiBieXRlcyBsb25nLiAgCisKKyogICAgICAgICBTZWN0b3IgdHlwZXMgb2YgdGhlIHN0YW5kYXJkIENELVJPTSBkYXRhIGZvcm1hdHM6CisgKgorICogZm9ybWF0ICAgc2VjdG9yIHR5cGUgICAgICAgICAgICAgICB1c2VyIGRhdGEgc2l6ZSAoYnl0ZXMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAxICAgICAoUmVkIEJvb2spICAgIENELURBICAgICAgICAgIDIzNTIgICAgKENEX0ZSQU1FU0laRV9SQVcpCisgKiAgIDIgICAgIChZZWxsb3cgQm9vaykgTW9kZTEgRm9ybTEgICAgMjA0OCAgICAoQ0RfRlJBTUVTSVpFKQorICogICAzICAgICAoWWVsbG93IEJvb2spIE1vZGUxIEZvcm0yICAgIDIzMzYgICAgKENEX0ZSQU1FU0laRV9SQVcwKQorICogICA0ICAgICAoR3JlZW4gQm9vaykgIE1vZGUyIEZvcm0xICAgIDIwNDggICAgKENEX0ZSQU1FU0laRSkKKyAqICAgNSAgICAgKEdyZWVuIEJvb2spICBNb2RlMiBGb3JtMiAgICAyMzI4ICAgICgyMzI0KzQgc3BhcmUgYnl0ZXMpCisgKgorICoKKyAqICAgICAgIFRoZSBsYXlvdXQgb2YgdGhlIHN0YW5kYXJkIENELVJPTSBkYXRhIGZvcm1hdHM6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogLSBhdWRpbyAocmVkKTogICAgICAgICAgICAgICAgICB8IGF1ZGlvX3NhbXBsZV9ieXRlcyB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDIzNTIgICAgICAgIHwKKyAqCisgKiAtIGRhdGEgKHllbGxvdywgbW9kZTEpOiAgICAgICAgIHwgc3luYyAtIGhlYWQgLSBkYXRhIC0gRURDIC0gemVybyAtIEVDQyB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyICAtICAgNCAgLSAyMDQ4IC0gIDQgIC0gICA4ICAtIDI3NiB8CisgKgorICogLSBkYXRhICh5ZWxsb3csIG1vZGUyKTogICAgICAgICB8IHN5bmMgLSBoZWFkIC0gZGF0YSB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyICAtICAgNCAgLSAyMzM2IHwKKyAqCisgKiAtIFhBIGRhdGEgKGdyZWVuLCBtb2RlMiBmb3JtMSk6IHwgc3luYyAtIGhlYWQgLSBzdWIgLSBkYXRhIC0gRURDIC0gRUNDIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTIgIC0gICA0ICAtICA4ICAtIDIwNDggLSAgNCAgLSAyNzYgfAorICoKKyAqIC0gWEEgZGF0YSAoZ3JlZW4sIG1vZGUyIGZvcm0yKTogfCBzeW5jIC0gaGVhZCAtIHN1YiAtIGRhdGEgLSBTcGFyZSB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEyICAtICAgNCAgLSAgOCAgLSAyMzI0IC0gIDQgICAgfAorICoKKyAqLworCisvKiBTb21lIGdlbmVyYWxseSB1c2VmdWwgQ0QtUk9NIGluZm9ybWF0aW9uIC0tIG1vc3RseSBiYXNlZCBvbiB0aGUgYWJvdmUgKi8KKyNkZWZpbmUgQ0RfTUlOUyAgICAgICAgICAgICAgNzQgLyogbWF4LiBtaW51dGVzIHBlciBDRCwgbm90IHJlYWxseSBhIGxpbWl0ICovCisjZGVmaW5lIENEX1NFQ1MgICAgICAgICAgICAgIDYwIC8qIHNlY29uZHMgcGVyIG1pbnV0ZSAqLworI2RlZmluZSBDRF9GUkFNRVMgICAgICAgICAgICA3NSAvKiBmcmFtZXMgcGVyIHNlY29uZCAqLworI2RlZmluZSBDRF9TWU5DX1NJWkUgICAgICAgICAxMiAvKiAxMiBzeW5jIGJ5dGVzIHBlciByYXcgZGF0YSBmcmFtZSAqLworI2RlZmluZSBDRF9NU0ZfT0ZGU0VUICAgICAgIDE1MCAvKiBNU0YgbnVtYmVyaW5nIG9mZnNldCBvZiBmaXJzdCBmcmFtZSAqLworI2RlZmluZSBDRF9DSFVOS19TSVpFICAgICAgICAyNCAvKiBsb3dlc3QtbGV2ZWwgImRhdGEgYnl0ZXMgcGllY2UiICovCisjZGVmaW5lIENEX05VTV9PRl9DSFVOS1MgICAgIDk4IC8qIGNodW5rcyBwZXIgZnJhbWUgKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1NVQiAgICAgOTYgLyogc3ViY2hhbm5lbCBkYXRhICJmcmFtZSIgc2l6ZSAqLworI2RlZmluZSBDRF9IRUFEX1NJWkUgICAgICAgICAgNCAvKiBoZWFkZXIgKGFkZHJlc3MpIGJ5dGVzIHBlciByYXcgZGF0YSBmcmFtZSAqLworI2RlZmluZSBDRF9TVUJIRUFEX1NJWkUgICAgICAgOCAvKiBzdWJoZWFkZXIgYnl0ZXMgcGVyIHJhdyBYQSBkYXRhIGZyYW1lICovCisjZGVmaW5lIENEX0VEQ19TSVpFICAgICAgICAgICA0IC8qIGJ5dGVzIEVEQyBwZXIgbW9zdCByYXcgZGF0YSBmcmFtZSB0eXBlcyAqLworI2RlZmluZSBDRF9aRVJPX1NJWkUgICAgICAgICAgOCAvKiBieXRlcyB6ZXJvIHBlciB5ZWxsb3cgYm9vayBtb2RlIDEgZnJhbWUgKi8KKyNkZWZpbmUgQ0RfRUNDX1NJWkUgICAgICAgICAyNzYgLyogYnl0ZXMgRUNDIHBlciBtb3N0IHJhdyBkYXRhIGZyYW1lIHR5cGVzICovCisjZGVmaW5lIENEX0ZSQU1FU0laRSAgICAgICAyMDQ4IC8qIGJ5dGVzIHBlciBmcmFtZSwgImNvb2tlZCIgbW9kZSAqLworI2RlZmluZSBDRF9GUkFNRVNJWkVfUkFXICAgMjM1MiAvKiBieXRlcyBwZXIgZnJhbWUsICJyYXciIG1vZGUgKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1JBV0VSIDI2NDYgLyogVGhlIG1heGltdW0gcG9zc2libGUgcmV0dXJuZWQgYnl0ZXMgKi8gCisvKiBtb3N0IGRyaXZlcyBkb24ndCBkZWxpdmVyIGV2ZXJ5dGhpbmc6ICovCisjZGVmaW5lIENEX0ZSQU1FU0laRV9SQVcxIChDRF9GUkFNRVNJWkVfUkFXLUNEX1NZTkNfU0laRSkgLyoyMzQwKi8KKyNkZWZpbmUgQ0RfRlJBTUVTSVpFX1JBVzAgKENEX0ZSQU1FU0laRV9SQVctQ0RfU1lOQ19TSVpFLUNEX0hFQURfU0laRSkgLyoyMzM2Ki8KKworI2RlZmluZSBDRF9YQV9IRUFEICAgICAgICAoQ0RfSEVBRF9TSVpFK0NEX1NVQkhFQURfU0laRSkgLyogImJlZm9yZSBkYXRhIiBwYXJ0IG9mIHJhdyBYQSBmcmFtZSAqLworI2RlZmluZSBDRF9YQV9UQUlMICAgICAgICAoQ0RfRURDX1NJWkUrQ0RfRUNDX1NJWkUpIC8qICJhZnRlciBkYXRhIiBwYXJ0IG9mIHJhdyBYQSBmcmFtZSAqLworI2RlZmluZSBDRF9YQV9TWU5DX0hFQUQgICAoQ0RfU1lOQ19TSVpFK0NEX1hBX0hFQUQpIC8qIHN5bmMgYnl0ZXMgKyBoZWFkZXIgb2YgWEEgZnJhbWUgKi8KKworLyogQ0QtUk9NIGFkZHJlc3MgdHlwZXMgKGNkcm9tX3RvY2VudHJ5LmNkdGVfZm9ybWF0KSAqLworI2RlZmluZQlDRFJPTV9MQkEgMHgwMSAvKiAibG9naWNhbCBibG9jayI6IGZpcnN0IGZyYW1lIGlzICMwICovCisjZGVmaW5lCUNEUk9NX01TRiAweDAyIC8qICJtaW51dGUtc2Vjb25kLWZyYW1lIjogYmluYXJ5LCBub3QgYmNkIGhlcmUhICovCisKKy8qIGJpdCB0byB0ZWxsIHdoZXRoZXIgdHJhY2sgaXMgZGF0YSBvciBhdWRpbyAoY2Ryb21fdG9jZW50cnkuY2R0ZV9jdHJsKSAqLworI2RlZmluZQlDRFJPTV9EQVRBX1RSQUNLCTB4MDQKKworLyogVGhlIGxlYWRvdXQgdHJhY2sgaXMgYWx3YXlzIDB4QUEsIHJlZ2FyZGxlc3Mgb2YgIyBvZiB0cmFja3Mgb24gZGlzYyAqLworI2RlZmluZQlDRFJPTV9MRUFET1VUCQkweEFBCisKKy8qIGF1ZGlvIHN0YXRlcyAoZnJvbSBTQ1NJLTIsIGJ1dCBzZWVuIHdpdGggb3RoZXIgZHJpdmVzLCB0b28pICovCisjZGVmaW5lCUNEUk9NX0FVRElPX0lOVkFMSUQJMHgwMAkvKiBhdWRpbyBzdGF0dXMgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlDRFJPTV9BVURJT19QTEFZCTB4MTEJLyogYXVkaW8gcGxheSBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJQ0RST01fQVVESU9fUEFVU0VECTB4MTIJLyogYXVkaW8gcGxheSBvcGVyYXRpb24gcGF1c2VkICovCisjZGVmaW5lCUNEUk9NX0FVRElPX0NPTVBMRVRFRAkweDEzCS8qIGF1ZGlvIHBsYXkgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAqLworI2RlZmluZQlDRFJPTV9BVURJT19FUlJPUgkweDE0CS8qIGF1ZGlvIHBsYXkgc3RvcHBlZCBkdWUgdG8gZXJyb3IgKi8KKyNkZWZpbmUJQ0RST01fQVVESU9fTk9fU1RBVFVTCTB4MTUJLyogbm8gY3VycmVudCBhdWRpbyBzdGF0dXMgdG8gcmV0dXJuICovCisKKy8qIGNhcGFiaWxpdHkgZmxhZ3MgdXNlZCB3aXRoIHRoZSB1bmlmb3JtIENELVJPTSBkcml2ZXIgKi8gCisjZGVmaW5lIENEQ19DTE9TRV9UUkFZCQkweDEgICAgIC8qIGNhZGR5IHN5c3RlbXMgX2Nhbid0XyBjbG9zZSAqLworI2RlZmluZSBDRENfT1BFTl9UUkFZCQkweDIgICAgIC8qIGJ1dCBfY2FuXyBlamVjdC4gICovCisjZGVmaW5lIENEQ19MT0NLCQkweDQgICAgIC8qIGRpc2FibGUgbWFudWFsIGVqZWN0ICovCisjZGVmaW5lIENEQ19TRUxFQ1RfU1BFRUQgCTB4OCAgICAgLyogcHJvZ3JhbW1hYmxlIHNwZWVkICovCisjZGVmaW5lIENEQ19TRUxFQ1RfRElTQwkJMHgxMCAgICAvKiBzZWxlY3QgZGlzYyBmcm9tIGp1a2UtYm94ICovCisjZGVmaW5lIENEQ19NVUxUSV9TRVNTSU9OIAkweDIwICAgIC8qIHJlYWQgc2Vzc2lvbnM+MSAqLworI2RlZmluZSBDRENfTUNOCQkJMHg0MCAgICAvKiBNZWRpdW0gQ2F0YWxvZyBOdW1iZXIgKi8KKyNkZWZpbmUgQ0RDX01FRElBX0NIQU5HRUQgCTB4ODAgICAgLyogbWVkaWEgY2hhbmdlZCAqLworI2RlZmluZSBDRENfUExBWV9BVURJTwkJMHgxMDAgICAvKiBhdWRpbyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ0RDX1JFU0VUICAgICAgICAgICAgICAgMHgyMDAgICAvKiBoYXJkIHJlc2V0IGRldmljZSAqLworI2RlZmluZSBDRENfRFJJVkVfU1RBVFVTICAgICAgICAweDgwMCAgIC8qIGRyaXZlciBpbXBsZW1lbnRzIGRyaXZlIHN0YXR1cyAqLworI2RlZmluZSBDRENfR0VORVJJQ19QQUNLRVQJMHgxMDAwCS8qIGRyaXZlciBpbXBsZW1lbnRzIGdlbmVyaWMgcGFja2V0cyAqLworI2RlZmluZSBDRENfQ0RfUgkJMHgyMDAwCS8qIGRyaXZlIGlzIGEgQ0QtUiAqLworI2RlZmluZSBDRENfQ0RfUlcJCTB4NDAwMAkvKiBkcml2ZSBpcyBhIENELVJXICovCisjZGVmaW5lIENEQ19EVkQJCQkweDgwMDAJLyogZHJpdmUgaXMgYSBEVkQgKi8KKyNkZWZpbmUgQ0RDX0RWRF9SCQkweDEwMDAwCS8qIGRyaXZlIGNhbiB3cml0ZSBEVkQtUiAqLworI2RlZmluZSBDRENfRFZEX1JBTQkJMHgyMDAwMAkvKiBkcml2ZSBjYW4gd3JpdGUgRFZELVJBTSAqLworI2RlZmluZSBDRENfTU9fRFJJVkUJCTB4NDAwMDAgLyogZHJpdmUgaXMgYW4gTU8gZGV2aWNlICovCisjZGVmaW5lIENEQ19NUlcJCQkweDgwMDAwIC8qIGRyaXZlIGNhbiByZWFkIE1SVyAqLworI2RlZmluZSBDRENfTVJXX1cJCTB4MTAwMDAwIC8qIGRyaXZlIGNhbiB3cml0ZSBNUlcgKi8KKyNkZWZpbmUgQ0RDX1JBTQkJCTB4MjAwMDAwIC8qIG9rIHRvIG9wZW4gZm9yIFdSSVRFICovCisKKy8qIGRyaXZlIHN0YXR1cyBwb3NzaWJpbGl0aWVzIHJldHVybmVkIGJ5IENEUk9NX0RSSVZFX1NUQVRVUyBpb2N0bCAqLworI2RlZmluZSBDRFNfTk9fSU5GTwkJMAkvKiBpZiBub3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgQ0RTX05PX0RJU0MJCTEKKyNkZWZpbmUgQ0RTX1RSQVlfT1BFTgkJMgorI2RlZmluZSBDRFNfRFJJVkVfTk9UX1JFQURZCTMKKyNkZWZpbmUgQ0RTX0RJU0NfT0sJCTQKKworLyogcmV0dXJuIHZhbHVlcyBmb3IgdGhlIENEUk9NX0RJU0NfU1RBVFVTIGlvY3RsICovCisvKiBjYW4gYWxzbyByZXR1cm4gQ0RTX05PX1tJTkZPfERJU0NdLCBmcm9tIGFib3ZlICovCisjZGVmaW5lIENEU19BVURJTwkJMTAwCisjZGVmaW5lIENEU19EQVRBXzEJCTEwMQorI2RlZmluZSBDRFNfREFUQV8yCQkxMDIKKyNkZWZpbmUgQ0RTX1hBXzJfMQkJMTAzCisjZGVmaW5lIENEU19YQV8yXzIJCTEwNAorI2RlZmluZSBDRFNfTUlYRUQJCTEwNQorCisvKiBVc2VyLWNvbmZpZ3VyYWJsZSBiZWhhdmlvciBvcHRpb25zIGZvciB0aGUgdW5pZm9ybSBDRC1ST00gZHJpdmVyICovCisjZGVmaW5lIENET19BVVRPX0NMT1NFCQkweDEgICAgIC8qIGNsb3NlIHRyYXkgb24gZmlyc3Qgb3BlbigpICovCisjZGVmaW5lIENET19BVVRPX0VKRUNUCQkweDIgICAgIC8qIG9wZW4gdHJheSBvbiBsYXN0IHJlbGVhc2UoKSAqLworI2RlZmluZSBDRE9fVVNFX0ZGTEFHUwkJMHg0ICAgICAvKiB1c2UgT19OT05CTE9DSyBpbmZvcm1hdGlvbiBvbiBvcGVuICovCisjZGVmaW5lIENET19MT0NLCQkweDggICAgIC8qIGxvY2sgdHJheSBvbiBvcGVuIGZpbGVzICovCisjZGVmaW5lIENET19DSEVDS19UWVBFCQkweDEwICAgIC8qIGNoZWNrIHR5cGUgb24gb3BlbiBmb3IgZGF0YSAqLworCisvKiBTcGVjaWFsIGNvZGVzIHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGNoYW5nZXIgc2xvdHMuICovCisjZGVmaW5lIENEU0xfTk9ORSAgICAgICAJKElOVF9NQVgtMSkKKyNkZWZpbmUgQ0RTTF9DVVJSRU5UICAgIAlJTlRfTUFYCisKKy8qIEZvciBwYXJ0aXRpb24gYmFzZWQgbXVsdGlzZXNzaW9uIGFjY2Vzcy4gSURFIGNhbiBoYW5kbGUgNjQgcGFydGl0aW9ucworICogcGVyIGRyaXZlIC0gU0NTSSBDRC1ST00ncyB1c2UgbWlub3JzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUKKyAqIHZhcmlvdXMgZHJpdmVzLCBzbyB3ZSBjYW4ndCBkbyBtdWx0aXNlc3Npb25zIHRoZSBzYW1lIHdheSB0aGVyZS4KKyAqIFVzZSB0aGUgLW8gc2Vzc2lvbj14IG9wdGlvbiB0byBtb3VudCBvbiB0aGVtLgorICovCisjZGVmaW5lIENEX1BBUlRfTUFYCQk2NAorI2RlZmluZSBDRF9QQVJUX01BU0sJCShDRF9QQVJUX01BWCAtIDEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyaWMgUGFja2V0IGNvbW1hbmRzLCBNTUMgY29tbWFuZHMsIGFuZCBzdWNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogVGhlIGdlbmVyaWMgcGFja2V0IGNvbW1hbmQgb3Bjb2RlcyBmb3IgQ0QvRFZEIExvZ2ljYWwgVW5pdHMsCisgKiBGcm9tIFRhYmxlIDU3IG9mIHRoZSBTRkY4MDkwIFZlci4gMyAoTXQuIEZ1amkpIGRyYWZ0IHN0YW5kYXJkLiAqLworI2RlZmluZSBHUENNRF9CTEFOSwkJCSAgICAweGExCisjZGVmaW5lIEdQQ01EX0NMT1NFX1RSQUNLCQkgICAgMHg1YgorI2RlZmluZSBHUENNRF9GTFVTSF9DQUNIRQkJICAgIDB4MzUKKyNkZWZpbmUgR1BDTURfRk9STUFUX1VOSVQJCSAgICAweDA0CisjZGVmaW5lIEdQQ01EX0dFVF9DT05GSUdVUkFUSU9OCQkgICAgMHg0NgorI2RlZmluZSBHUENNRF9HRVRfRVZFTlRfU1RBVFVTX05PVElGSUNBVElPTiAweDRhCisjZGVmaW5lIEdQQ01EX0dFVF9QRVJGT1JNQU5DRQkJICAgIDB4YWMKKyNkZWZpbmUgR1BDTURfSU5RVUlSWQkJCSAgICAweDEyCisjZGVmaW5lIEdQQ01EX0xPQURfVU5MT0FECQkgICAgMHhhNgorI2RlZmluZSBHUENNRF9NRUNIQU5JU01fU1RBVFVTCQkgICAgMHhiZAorI2RlZmluZSBHUENNRF9NT0RFX1NFTEVDVF8xMAkJICAgIDB4NTUKKyNkZWZpbmUgR1BDTURfTU9ERV9TRU5TRV8xMAkJICAgIDB4NWEKKyNkZWZpbmUgR1BDTURfUEFVU0VfUkVTVU1FCQkgICAgMHg0YgorI2RlZmluZSBHUENNRF9QTEFZX0FVRElPXzEwCQkgICAgMHg0NQorI2RlZmluZSBHUENNRF9QTEFZX0FVRElPX01TRgkJICAgIDB4NDcKKyNkZWZpbmUgR1BDTURfUExBWV9BVURJT19USQkJICAgIDB4NDgKKyNkZWZpbmUgR1BDTURfUExBWV9DRAkJCSAgICAweGJjCisjZGVmaW5lIEdQQ01EX1BSRVZFTlRfQUxMT1dfTUVESVVNX1JFTU9WQUwgIDB4MWUKKyNkZWZpbmUgR1BDTURfUkVBRF8xMAkJCSAgICAweDI4CisjZGVmaW5lIEdQQ01EX1JFQURfMTIJCQkgICAgMHhhOAorI2RlZmluZSBHUENNRF9SRUFEX0JVRkZFUl9DQVBBQ0lUWQkgICAgMHg1YworI2RlZmluZSBHUENNRF9SRUFEX0NEVkRfQ0FQQUNJVFkJICAgIDB4MjUKKyNkZWZpbmUgR1BDTURfUkVBRF9DRAkJCSAgICAweGJlCisjZGVmaW5lIEdQQ01EX1JFQURfQ0RfTVNGCQkgICAgMHhiOQorI2RlZmluZSBHUENNRF9SRUFEX0RJU0NfSU5GTwkJICAgIDB4NTEKKyNkZWZpbmUgR1BDTURfUkVBRF9EVkRfU1RSVUNUVVJFCSAgICAweGFkCisjZGVmaW5lIEdQQ01EX1JFQURfRk9STUFUX0NBUEFDSVRJRVMJICAgIDB4MjMKKyNkZWZpbmUgR1BDTURfUkVBRF9IRUFERVIJCSAgICAweDQ0CisjZGVmaW5lIEdQQ01EX1JFQURfVFJBQ0tfUlpPTkVfSU5GTwkgICAgMHg1MgorI2RlZmluZSBHUENNRF9SRUFEX1NVQkNIQU5ORUwJCSAgICAweDQyCisjZGVmaW5lIEdQQ01EX1JFQURfVE9DX1BNQV9BVElQCQkgICAgMHg0MworI2RlZmluZSBHUENNRF9SRVBBSVJfUlpPTkVfVFJBQ0sJICAgIDB4NTgKKyNkZWZpbmUgR1BDTURfUkVQT1JUX0tFWQkJICAgIDB4YTQKKyNkZWZpbmUgR1BDTURfUkVRVUVTVF9TRU5TRQkJICAgIDB4MDMKKyNkZWZpbmUgR1BDTURfUkVTRVJWRV9SWk9ORV9UUkFDSwkgICAgMHg1MworI2RlZmluZSBHUENNRF9TRU5EX0NVRV9TSEVFVAkJICAgIDB4NWQKKyNkZWZpbmUgR1BDTURfU0NBTgkJCSAgICAweGJhCisjZGVmaW5lIEdQQ01EX1NFRUsJCQkgICAgMHgyYgorI2RlZmluZSBHUENNRF9TRU5EX0RWRF9TVFJVQ1RVUkUJICAgIDB4YmYKKyNkZWZpbmUgR1BDTURfU0VORF9FVkVOVAkJICAgIDB4YTIKKyNkZWZpbmUgR1BDTURfU0VORF9LRVkJCQkgICAgMHhhMworI2RlZmluZSBHUENNRF9TRU5EX09QQwkJCSAgICAweDU0CisjZGVmaW5lIEdQQ01EX1NFVF9SRUFEX0FIRUFECQkgICAgMHhhNworI2RlZmluZSBHUENNRF9TRVRfU1RSRUFNSU5HCQkgICAgMHhiNgorI2RlZmluZSBHUENNRF9TVEFSVF9TVE9QX1VOSVQJCSAgICAweDFiCisjZGVmaW5lIEdQQ01EX1NUT1BfUExBWV9TQ0FOCQkgICAgMHg0ZQorI2RlZmluZSBHUENNRF9URVNUX1VOSVRfUkVBRFkJCSAgICAweDAwCisjZGVmaW5lIEdQQ01EX1ZFUklGWV8xMAkJCSAgICAweDJmCisjZGVmaW5lIEdQQ01EX1dSSVRFXzEwCQkJICAgIDB4MmEKKyNkZWZpbmUgR1BDTURfV1JJVEVfQU5EX1ZFUklGWV8xMAkgICAgMHgyZQorLyogVGhpcyBpcyBsaXN0ZWQgYXMgb3B0aW9uYWwgaW4gQVRBUEkgMi42LCBidXQgaXMgKGN1cmlvdXNseSkgCisgKiBtaXNzaW5nIGZyb20gTXQuIEZ1amksIFRhYmxlIDU3LiAgSXQgX2lzXyBtZW50aW9uZWQgaW4gTXQuIEZ1amkKKyAqIFRhYmxlIDM3NyBhcyBhbiBNTUMgY29tbWFuZCBmb3IgU0NTaSBkZXZpY2VzIHRob3VnaC4uLiAgTW9zdCBBVEFQSQorICogZHJpdmVzIHN1cHBvcnQgaXQuICovCisjZGVmaW5lIEdQQ01EX1NFVF9TUEVFRAkJCSAgICAweGJiCisvKiBUaGlzIHNlZW1zIHRvIGJlIGEgU0NTSSBzcGVjaWZpYyBDRC1ST00gb3Bjb2RlIAorICogdG8gcGxheSBkYXRhIGF0IHRyYWNrL2luZGV4ICovCisjZGVmaW5lIEdQQ01EX1BMQVlBVURJT19USQkJICAgIDB4NDgKKy8qCisgKiBGcm9tIE1TIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gU3VwcG9ydCBTcGVjaWZpY2F0aW9uLiBGb3IKKyAqIG9sZGVyIGRyaXZlcyBvbmx5LgorICovCisjZGVmaW5lIEdQQ01EX0dFVF9NRURJQV9TVEFUVVMJCSAgICAweGRhCisKKy8qIE1vZGUgcGFnZSBjb2RlcyBmb3IgbW9kZSBzZW5zZS9zZXQgKi8KKyNkZWZpbmUgR1BNT0RFX1ZFTkRPUl9QQUdFCQkweDAwCisjZGVmaW5lIEdQTU9ERV9SX1dfRVJST1JfUEFHRQkJMHgwMQorI2RlZmluZSBHUE1PREVfV1JJVEVfUEFSTVNfUEFHRQkJMHgwNQorI2RlZmluZSBHUE1PREVfV0NBQ0hJTkdfUEFHRQkJMHgwOAorI2RlZmluZSBHUE1PREVfQVVESU9fQ1RMX1BBR0UJCTB4MGUKKyNkZWZpbmUgR1BNT0RFX1BPV0VSX1BBR0UJCTB4MWEKKyNkZWZpbmUgR1BNT0RFX0ZBVUxUX0ZBSUxfUEFHRQkJMHgxYworI2RlZmluZSBHUE1PREVfVE9fUFJPVEVDVF9QQUdFCQkweDFkCisjZGVmaW5lIEdQTU9ERV9DQVBBQklMSVRJRVNfUEFHRQkweDJhCisjZGVmaW5lIEdQTU9ERV9BTExfUEFHRVMJCTB4M2YKKy8qIE5vdCBpbiBNdC4gRnVqaSwgYnV0IGluIEFUQVBJIDIuNiAtLSBkZXByZWNhdGVkIG5vdyBpbiBmYXZvcgorICogb2YgTU9ERV9TRU5TRV9QT1dFUl9QQUdFICovCisjZGVmaW5lIEdQTU9ERV9DRFJPTV9QQUdFCQkweDBkCisKKworCisvKiBEVkQgc3RydWN0IHR5cGVzICovCisjZGVmaW5lIERWRF9TVFJVQ1RfUEhZU0lDQUwJMHgwMAorI2RlZmluZSBEVkRfU1RSVUNUX0NPUFlSSUdIVAkweDAxCisjZGVmaW5lIERWRF9TVFJVQ1RfRElTQ0tFWQkweDAyCisjZGVmaW5lIERWRF9TVFJVQ1RfQkNBCQkweDAzCisjZGVmaW5lIERWRF9TVFJVQ1RfTUFOVUZBQ1QJMHgwNAorCitzdHJ1Y3QgZHZkX2xheWVyIHsKKwlfX3U4IGJvb2tfdmVyc2lvbgk6IDQ7CisJX191OCBib29rX3R5cGUJCTogNDsKKwlfX3U4IG1pbl9yYXRlCQk6IDQ7CisJX191OCBkaXNjX3NpemUJCTogNDsKKwlfX3U4IGxheWVyX3R5cGUJCTogNDsKKwlfX3U4IHRyYWNrX3BhdGgJCTogMTsKKwlfX3U4IG5sYXllcnMJCTogMjsKKwlfX3U4IHRyYWNrX2RlbnNpdHkJOiA0OworCV9fdTggbGluZWFyX2RlbnNpdHkJOiA0OworCV9fdTggYmNhCQk6IDE7CisJX191MzIgc3RhcnRfc2VjdG9yOworCV9fdTMyIGVuZF9zZWN0b3I7CisJX191MzIgZW5kX3NlY3Rvcl9sMDsKK307CisKKyNkZWZpbmUgRFZEX0xBWUVSUwk0CisKK3N0cnVjdCBkdmRfcGh5c2ljYWwgeworCV9fdTggdHlwZTsKKwlfX3U4IGxheWVyX251bTsKKwlzdHJ1Y3QgZHZkX2xheWVyIGxheWVyW0RWRF9MQVlFUlNdOworfTsKKworc3RydWN0IGR2ZF9jb3B5cmlnaHQgeworCV9fdTggdHlwZTsKKworCV9fdTggbGF5ZXJfbnVtOworCV9fdTggY3BzdDsKKwlfX3U4IHJtaTsKK307CisKK3N0cnVjdCBkdmRfZGlzY2tleSB7CisJX191OCB0eXBlOworCisJdW5zaWduZWQgYWdpZAkJOiAyOworCV9fdTggdmFsdWVbMjA0OF07Cit9OworCitzdHJ1Y3QgZHZkX2JjYSB7CisJX191OCB0eXBlOworCisJaW50IGxlbjsKKwlfX3U4IHZhbHVlWzE4OF07Cit9OworCitzdHJ1Y3QgZHZkX21hbnVmYWN0IHsKKwlfX3U4IHR5cGU7CisKKwlfX3U4IGxheWVyX251bTsKKwlpbnQgbGVuOworCV9fdTggdmFsdWVbMjA0OF07Cit9OworCit0eXBlZGVmIHVuaW9uIHsKKwlfX3U4IHR5cGU7CisKKwlzdHJ1Y3QgZHZkX3BoeXNpY2FsCXBoeXNpY2FsOworCXN0cnVjdCBkdmRfY29weXJpZ2h0CWNvcHlyaWdodDsKKwlzdHJ1Y3QgZHZkX2Rpc2NrZXkJZGlzY2tleTsKKwlzdHJ1Y3QgZHZkX2JjYQkJYmNhOworCXN0cnVjdCBkdmRfbWFudWZhY3QJbWFudWZhY3Q7Cit9IGR2ZF9zdHJ1Y3Q7CisKKy8qCisgKiBEVkQgYXV0aGVudGljYXRpb24gaW9jdGwKKyAqLworCisvKiBBdXRoZW50aWNhdGlvbiBzdGF0ZXMgKi8KKyNkZWZpbmUgRFZEX0xVX1NFTkRfQUdJRAkwCisjZGVmaW5lIERWRF9IT1NUX1NFTkRfQ0hBTExFTkdFCTEKKyNkZWZpbmUgRFZEX0xVX1NFTkRfS0VZMQkyCisjZGVmaW5lIERWRF9MVV9TRU5EX0NIQUxMRU5HRQkzCisjZGVmaW5lIERWRF9IT1NUX1NFTkRfS0VZMgk0CisKKy8qIFRlcm1pbmF0aW9uIHN0YXRlcyAqLworI2RlZmluZSBEVkRfQVVUSF9FU1RBQkxJU0hFRAk1CisjZGVmaW5lIERWRF9BVVRIX0ZBSUxVUkUJNgorCisvKiBPdGhlciBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgRFZEX0xVX1NFTkRfVElUTEVfS0VZCTcKKyNkZWZpbmUgRFZEX0xVX1NFTkRfQVNGCQk4CisjZGVmaW5lIERWRF9JTlZBTElEQVRFX0FHSUQJOQorI2RlZmluZSBEVkRfTFVfU0VORF9SUENfU1RBVEUJMTAKKyNkZWZpbmUgRFZEX0hPU1RfU0VORF9SUENfU1RBVEUJMTEKKworLyogU3RhdGUgZGF0YSAqLwordHlwZWRlZiBfX3U4IGR2ZF9rZXlbNV07CQkvKiA0MC1iaXQgdmFsdWUsIE1TQiBpcyBmaXJzdCBlbGVtLiAqLwordHlwZWRlZiBfX3U4IGR2ZF9jaGFsbGVuZ2VbMTBdOwkvKiA4MC1iaXQgdmFsdWUsIE1TQiBpcyBmaXJzdCBlbGVtLiAqLworCitzdHJ1Y3QgZHZkX2x1X3NlbmRfYWdpZCB7CisJX191OCB0eXBlOworCXVuc2lnbmVkIGFnaWQJCTogMjsKK307CisKK3N0cnVjdCBkdmRfaG9zdF9zZW5kX2NoYWxsZW5nZSB7CisJX191OCB0eXBlOworCXVuc2lnbmVkIGFnaWQJCTogMjsKKworCWR2ZF9jaGFsbGVuZ2UgY2hhbDsKK307CisKK3N0cnVjdCBkdmRfc2VuZF9rZXkgeworCV9fdTggdHlwZTsKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7CisKKwlkdmRfa2V5IGtleTsKK307CisKK3N0cnVjdCBkdmRfbHVfc2VuZF9jaGFsbGVuZ2UgeworCV9fdTggdHlwZTsKKwl1bnNpZ25lZCBhZ2lkCQk6IDI7CisKKwlkdmRfY2hhbGxlbmdlIGNoYWw7Cit9OworCisjZGVmaW5lIERWRF9DUE1fTk9fQ09QWVJJR0hUCTAKKyNkZWZpbmUgRFZEX0NQTV9DT1BZUklHSFRFRAkxCisKKyNkZWZpbmUgRFZEX0NQX1NFQ19OT05FCQkwCisjZGVmaW5lIERWRF9DUF9TRUNfRVhJU1QJMQorCisjZGVmaW5lIERWRF9DR01TX1VOUkVTVFJJQ1RFRAkwCisjZGVmaW5lIERWRF9DR01TX1NJTkdMRQkJMgorI2RlZmluZSBEVkRfQ0dNU19SRVNUUklDVEVECTMKKworc3RydWN0IGR2ZF9sdV9zZW5kX3RpdGxlX2tleSB7CisJX191OCB0eXBlOworCXVuc2lnbmVkIGFnaWQJCTogMjsKKworCWR2ZF9rZXkgdGl0bGVfa2V5OworCWludCBsYmE7CisJdW5zaWduZWQgY3BtCQk6IDE7CisJdW5zaWduZWQgY3Bfc2VjCQk6IDE7CisJdW5zaWduZWQgY2dtcwkJOiAyOworfTsKKworc3RydWN0IGR2ZF9sdV9zZW5kX2FzZiB7CisJX191OCB0eXBlOworCXVuc2lnbmVkIGFnaWQJCTogMjsKKworCXVuc2lnbmVkIGFzZgkJOiAxOworfTsKKworc3RydWN0IGR2ZF9ob3N0X3NlbmRfcnBjc3RhdGUgeworCV9fdTggdHlwZTsKKwlfX3U4IHBkcmM7Cit9OworCitzdHJ1Y3QgZHZkX2x1X3NlbmRfcnBjc3RhdGUgeworCV9fdTggdHlwZQkJOiAyOworCV9fdTggdnJhCQk6IDM7CisJX191OCB1Y2NhCQk6IDM7CisJX191OCByZWdpb25fbWFzazsKKwlfX3U4IHJwY19zY2hlbWU7Cit9OworCit0eXBlZGVmIHVuaW9uIHsKKwlfX3U4IHR5cGU7CisKKwlzdHJ1Y3QgZHZkX2x1X3NlbmRfYWdpZAkJbHNhOworCXN0cnVjdCBkdmRfaG9zdF9zZW5kX2NoYWxsZW5nZQloc2M7CisJc3RydWN0IGR2ZF9zZW5kX2tleQkJbHNrOworCXN0cnVjdCBkdmRfbHVfc2VuZF9jaGFsbGVuZ2UJbHNjOworCXN0cnVjdCBkdmRfc2VuZF9rZXkJCWhzazsKKwlzdHJ1Y3QgZHZkX2x1X3NlbmRfdGl0bGVfa2V5CWxzdGs7CisJc3RydWN0IGR2ZF9sdV9zZW5kX2FzZgkJbHNhc2Y7CisJc3RydWN0IGR2ZF9ob3N0X3NlbmRfcnBjc3RhdGUJaHJwY3M7CisJc3RydWN0IGR2ZF9sdV9zZW5kX3JwY3N0YXRlCWxycGNzOworfSBkdmRfYXV0aGluZm87CisKK3N0cnVjdCByZXF1ZXN0X3NlbnNlIHsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHZhbGlkCQk6IDE7CisJX191OCBlcnJvcl9jb2RlCQk6IDc7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IGVycm9yX2NvZGUJCTogNzsKKwlfX3U4IHZhbGlkCQk6IDE7CisjZW5kaWYKKwlfX3U4IHNlZ21lbnRfbnVtYmVyOworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcmVzZXJ2ZWQxCQk6IDI7CisJX191OCBpbGkJCTogMTsKKwlfX3U4IHJlc2VydmVkMgkJOiAxOworCV9fdTggc2Vuc2Vfa2V5CQk6IDQ7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHNlbnNlX2tleQkJOiA0OworCV9fdTggcmVzZXJ2ZWQyCQk6IDE7CisJX191OCBpbGkJCTogMTsKKwlfX3U4IHJlc2VydmVkMQkJOiAyOworI2VuZGlmCisJX191OCBpbmZvcm1hdGlvbls0XTsKKwlfX3U4IGFkZF9zZW5zZV9sZW47CisJX191OCBjb21tYW5kX2luZm9bNF07CisJX191OCBhc2M7CisJX191OCBhc2NxOworCV9fdTggZnJ1YzsKKwlfX3U4IHNrc1szXTsKKwlfX3U4IGFzYls0Nl07Cit9OworCisvKgorICogZmVhdHVyZSBwcm9maWxlCisgKi8KKyNkZWZpbmUgQ0RGX1JXUlQJMHgwMDIwCS8qICJSYW5kb20gV3JpdGFibGUiICovCisjZGVmaW5lIENERl9IV0RNCTB4MDAyNAkvKiAiSGFyZHdhcmUgRGVmZWN0IE1hbmFnZW1lbnQiICovCisjZGVmaW5lIENERl9NUlcgCTB4MDAyOAorCisvKgorICogbWVkaWEgc3RhdHVzIGJpdHMKKyAqLworI2RlZmluZSBDRE1fTVJXX05PVE1SVwkJCTAKKyNkZWZpbmUgQ0RNX01SV19CR0ZPUk1BVF9JTkFDVElWRQkxCisjZGVmaW5lIENETV9NUldfQkdGT1JNQVRfQUNUSVZFCQkyCisjZGVmaW5lIENETV9NUldfQkdGT1JNQVRfQ09NUExFVEUJMworCisvKgorICogbXJ3IGFkZHJlc3Mgc3BhY2VzCisgKi8KKyNkZWZpbmUgTVJXX0xCQV9ETUEJCQkwCisjZGVmaW5lIE1SV19MQkFfR0FBCQkJMQorCisvKgorICogbXJ3IG1vZGUgcGFnZXMgKGZpcnN0IGlzIGRlcHJlY2F0ZWQpIC0tIHByb2JlZCBhdCBpbml0IHRpbWUgYW5kCisgKiBjZGktPm1yd19tb2RlX3BhZ2UgaXMgc2V0CisgKi8KKyNkZWZpbmUgTVJXX01PREVfUENfUFJFMQkJMHgyYworI2RlZmluZSBNUldfTU9ERV9QQwkJCTB4MDMKKworc3RydWN0IG1yd19mZWF0dXJlX2Rlc2MgeworCV9fYmUxNiBmZWF0dXJlX2NvZGU7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDEJCTogMjsKKwlfX3U4IGZlYXR1cmVfdmVyc2lvbgk6IDQ7CisJX191OCBwZXJzaXN0ZW50CQk6IDE7CisJX191OCBjdXJyCQk6IDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IGN1cnIJCTogMTsKKwlfX3U4IHBlcnNpc3RlbnQJCTogMTsKKwlfX3U4IGZlYXR1cmVfdmVyc2lvbgk6IDQ7CisJX191OCByZXNlcnZlZDEJCTogMjsKKyNlbmRpZgorCV9fdTggYWRkX2xlbjsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMgkJOiA3OworCV9fdTggd3JpdGUJCTogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggd3JpdGUJCTogMTsKKwlfX3U4IHJlc2VydmVkMgkJOiA3OworI2VuZGlmCisJX191OCByZXNlcnZlZDM7CisJX191OCByZXNlcnZlZDQ7CisJX191OCByZXNlcnZlZDU7Cit9OworCisvKiBjZi4gbW1jNHIwMmcucGRmIDUuMy4xMCBSYW5kb20gV3JpdGFibGUgRmVhdHVyZSAoMDAyMGgpIHBnIDE5NyBvZiA2MzUgKi8KK3N0cnVjdCByd3J0X2ZlYXR1cmVfZGVzYyB7CisJX19iZTE2IGZlYXR1cmVfY29kZTsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMQkJOiAyOworCV9fdTggZmVhdHVyZV92ZXJzaW9uCTogNDsKKwlfX3U4IHBlcnNpc3RlbnQJCTogMTsKKwlfX3U4IGN1cnIJCTogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggY3VycgkJOiAxOworCV9fdTggcGVyc2lzdGVudAkJOiAxOworCV9fdTggZmVhdHVyZV92ZXJzaW9uCTogNDsKKwlfX3U4IHJlc2VydmVkMQkJOiAyOworI2VuZGlmCisJX191OCBhZGRfbGVuOworCV9fdTMyIGxhc3RfbGJhOworCV9fdTMyIGJsb2NrX3NpemU7CisJX191MTYgYmxvY2tpbmc7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDIJCTogNzsKKwlfX3U4IHBhZ2VfcHJlc2VudAk6IDE7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHBhZ2VfcHJlc2VudAk6IDE7CisJX191OCByZXNlcnZlZDIJCTogNzsKKyNlbmRpZgorCV9fdTggcmVzZXJ2ZWQzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fYmUxNiBkaXNjX2luZm9ybWF0aW9uX2xlbmd0aDsKKyNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc2VydmVkMQkJCTogMzsKKyAgICAgICAgX191OCBlcmFzYWJsZQkJCTogMTsKKyAgICAgICAgX191OCBib3JkZXJfc3RhdHVzCQk6IDI7CisgICAgICAgIF9fdTggZGlzY19zdGF0dXMJCTogMjsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICBfX3U4IGRpc2Nfc3RhdHVzCQk6IDI7CisgICAgICAgIF9fdTggYm9yZGVyX3N0YXR1cwkJOiAyOworICAgICAgICBfX3U4IGVyYXNhYmxlCQkJOiAxOworCV9fdTggcmVzZXJ2ZWQxCQkJOiAzOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCV9fdTggbl9maXJzdF90cmFjazsKKwlfX3U4IG5fc2Vzc2lvbnNfbHNiOworCV9fdTggZmlyc3RfdHJhY2tfbHNiOworCV9fdTggbGFzdF90cmFja19sc2I7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCBkaWRfdgkJCTogMTsKKyAgICAgICAgX191OCBkYmNfdgkJCTogMTsKKyAgICAgICAgX191OCB1cnUJCQk6IDE7CisgICAgICAgIF9fdTggcmVzZXJ2ZWQyCQkJOiAyOworCV9fdTggZGJpdAkJCTogMTsKKwlfX3U4IG1yd19zdGF0dXMJCQk6IDI7CisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IG1yd19zdGF0dXMJCQk6IDI7CisJX191OCBkYml0CQkJOiAxOworICAgICAgICBfX3U4IHJlc2VydmVkMgkJCTogMjsKKyAgICAgICAgX191OCB1cnUJCQk6IDE7CisgICAgICAgIF9fdTggZGJjX3YJCQk6IDE7CisJX191OCBkaWRfdgkJCTogMTsKKyNlbmRpZgorCV9fdTggZGlzY190eXBlOworCV9fdTggbl9zZXNzaW9uc19tc2I7CisJX191OCBmaXJzdF90cmFja19tc2I7CisJX191OCBsYXN0X3RyYWNrX21zYjsKKwlfX3UzMiBkaXNjX2lkOworCV9fdTMyIGxlYWRfaW47CisJX191MzIgbGVhZF9vdXQ7CisJX191OCBkaXNjX2Jhcl9jb2RlWzhdOworCV9fdTggcmVzZXJ2ZWQzOworCV9fdTggbl9vcGM7Cit9IGRpc2NfaW5mb3JtYXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2JlMTYgdHJhY2tfaW5mb3JtYXRpb25fbGVuZ3RoOworCV9fdTggdHJhY2tfbHNiOworCV9fdTggc2Vzc2lvbl9sc2I7CisJX191OCByZXNlcnZlZDE7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OCByZXNlcnZlZDIJCQk6IDI7CisgICAgICAgIF9fdTggZGFtYWdlCQkJOiAxOworICAgICAgICBfX3U4IGNvcHkJCQk6IDE7CisgICAgICAgIF9fdTggdHJhY2tfbW9kZQkJCTogNDsKKwlfX3U4IHJ0CQkJCTogMTsKKwlfX3U4IGJsYW5rCQkJOiAxOworCV9fdTggcGFja2V0CQkJOiAxOworCV9fdTggZnAJCQkJOiAxOworCV9fdTggZGF0YV9tb2RlCQkJOiA0OworCV9fdTggcmVzZXJ2ZWQzCQkJOiA2OworCV9fdTggbHJhX3YJCQk6IDE7CisJX191OCBud2FfdgkJCTogMTsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICBfX3U4IHRyYWNrX21vZGUJCQk6IDQ7CisgICAgICAgIF9fdTggY29weQkJCTogMTsKKyAgICAgICAgX191OCBkYW1hZ2UJCQk6IDE7CisJX191OCByZXNlcnZlZDIJCQk6IDI7CisJX191OCBkYXRhX21vZGUJCQk6IDQ7CisJX191OCBmcAkJCQk6IDE7CisJX191OCBwYWNrZXQJCQk6IDE7CisJX191OCBibGFuawkJCTogMTsKKwlfX3U4IHJ0CQkJCTogMTsKKwlfX3U4IG53YV92CQkJOiAxOworCV9fdTggbHJhX3YJCQk6IDE7CisJX191OCByZXNlcnZlZDMJCQk6IDY7CisjZW5kaWYKKwlfX2JlMzIgdHJhY2tfc3RhcnQ7CisJX19iZTMyIG5leHRfd3JpdGFibGU7CisJX19iZTMyIGZyZWVfYmxvY2tzOworCV9fYmUzMiBmaXhlZF9wYWNrZXRfc2l6ZTsKKwlfX2JlMzIgdHJhY2tfc2l6ZTsKKwlfX2JlMzIgbGFzdF9yZWNfYWRkcmVzczsKK30gdHJhY2tfaW5mb3JtYXRpb247CisKK3N0cnVjdCBmZWF0dXJlX2hlYWRlciB7CisJX191MzIgZGF0YV9sZW47CisJX191OCByZXNlcnZlZDE7CisJX191OCByZXNlcnZlZDI7CisJX191MTYgY3Vycl9wcm9maWxlOworfTsKKworc3RydWN0IG1vZGVfcGFnZV9oZWFkZXIgeworCV9fYmUxNiBtb2RlX2RhdGFfbGVuZ3RoOworCV9fdTggbWVkaXVtX3R5cGU7CisJX191OCByZXNlcnZlZDE7CisJX191OCByZXNlcnZlZDI7CisJX191OCByZXNlcnZlZDM7CisJX19iZTE2IGRlc2NfbGVuZ3RoOworfTsKKworCisjZW5kaWYgIC8qIF9MSU5VWF9DRFJPTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nncm91cHN0YXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nncm91cHN0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1M2FiZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY2dyb3Vwc3RhdHMuaApAQCAtMCwwICsxLDcwIEBACisvKiBjZ3JvdXBzdGF0cy5oIC0gZXhwb3J0aW5nIHBlci1jZ3JvdXAgc3RhdGlzdGljcworICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDcKKyAqIEF1dGhvciBCYWxiaXIgU2luZ2ggPGJhbGJpckBsaW51eC52bmV0LmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0NHUk9VUFNUQVRTX0gKKyNkZWZpbmUgX0xJTlVYX0NHUk9VUFNUQVRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0cy5oPgorCisvKgorICogRGF0YSBzaGFyZWQgYmV0d2VlbiB1c2VyIHNwYWNlIGFuZCBrZXJuZWwgc3BhY2Ugb24gYSBwZXIgY2dyb3VwCisgKiBiYXNpcy4gVGhpcyBkYXRhIGlzIHNoYXJlZCB1c2luZyB0YXNrc3RhdHMuCisgKgorICogTW9zdCBvZiB0aGVzZSBzdGF0ZXMgYXJlIGRlcml2ZWQgYnkgbG9va2luZyBhdCB0aGUgdGFzay0+c3RhdGUgdmFsdWUKKyAqIEZvciB0aGUgbnJfaW9fd2FpdCBzdGF0ZSwgYSBmbGFnIGluIHRoZSBkZWxheSBhY2NvdW50aW5nIHN0cnVjdHVyZQorICogaW5kaWNhdGVzIHRoYXQgdGhlIHRhc2sgaXMgd2FpdGluZyBvbiBJTworICoKKyAqIEVhY2ggbWVtYmVyIGlzIGFsaWduZWQgdG8gYSA4IGJ5dGUgYm91bmRhcnkuCisgKi8KK3N0cnVjdCBjZ3JvdXBzdGF0cyB7CisJX191NjQJbnJfc2xlZXBpbmc7CQkvKiBOdW1iZXIgb2YgdGFza3Mgc2xlZXBpbmcgKi8KKwlfX3U2NAlucl9ydW5uaW5nOwkJLyogTnVtYmVyIG9mIHRhc2tzIHJ1bm5pbmcgKi8KKwlfX3U2NAlucl9zdG9wcGVkOwkJLyogTnVtYmVyIG9mIHRhc2tzIGluIHN0b3BwZWQgc3RhdGUgKi8KKwlfX3U2NAlucl91bmludGVycnVwdGlibGU7CS8qIE51bWJlciBvZiB0YXNrcyBpbiB1bmludGVycnVwdGlibGUgKi8KKwkJCQkJLyogc3RhdGUgKi8KKwlfX3U2NAlucl9pb193YWl0OwkJLyogTnVtYmVyIG9mIHRhc2tzIHdhaXRpbmcgb24gSU8gKi8KK307CisKKy8qCisgKiBDb21tYW5kcyBzZW50IGZyb20gdXNlcnNwYWNlCisgKiBOb3QgdmVyc2lvbmVkLiBOZXcgY29tbWFuZHMgc2hvdWxkIG9ubHkgYmUgaW5zZXJ0ZWQgYXQgdGhlIGVudW0ncyBlbmQKKyAqIHByaW9yIHRvIF9fQ0dST1VQU1RBVFNfQ01EX01BWAorICovCisKK2VudW0geworCUNHUk9VUFNUQVRTX0NNRF9VTlNQRUMgPSBfX1RBU0tTVEFUU19DTURfTUFYLAkvKiBSZXNlcnZlZCAqLworCUNHUk9VUFNUQVRTX0NNRF9HRVQsCQkvKiB1c2VyLT5rZXJuZWwgcmVxdWVzdC9nZXQtcmVzcG9uc2UgKi8KKwlDR1JPVVBTVEFUU19DTURfTkVXLAkJLyoga2VybmVsLT51c2VyIGV2ZW50ICovCisJX19DR1JPVVBTVEFUU19DTURfTUFYLAorfTsKKworI2RlZmluZSBDR1JPVVBTVEFUU19DTURfTUFYIChfX0NHUk9VUFNUQVRTX0NNRF9NQVggLSAxKQorCitlbnVtIHsKKwlDR1JPVVBTVEFUU19UWVBFX1VOU1BFQyA9IDAsCS8qIFJlc2VydmVkICovCisJQ0dST1VQU1RBVFNfVFlQRV9DR1JPVVBfU1RBVFMsCS8qIGNvbnRhaW5zIG5hbWUgKyBzdGF0cyAqLworCV9fQ0dST1VQU1RBVFNfVFlQRV9NQVgsCit9OworCisjZGVmaW5lIENHUk9VUFNUQVRTX1RZUEVfTUFYIChfX0NHUk9VUFNUQVRTX1RZUEVfTUFYIC0gMSkKKworZW51bSB7CisJQ0dST1VQU1RBVFNfQ01EX0FUVFJfVU5TUEVDID0gMCwKKwlDR1JPVVBTVEFUU19DTURfQVRUUl9GRCwKKwlfX0NHUk9VUFNUQVRTX0NNRF9BVFRSX01BWCwKK307CisKKyNkZWZpbmUgQ0dST1VQU1RBVFNfQ01EX0FUVFJfTUFYIChfX0NHUk9VUFNUQVRTX0NNRF9BVFRSX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfTElOVVhfQ0dST1VQU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jaGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NoaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzAzNWFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jaGlvLmgKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBpb2N0bCBpbnRlcmZhY2UgZm9yIHRoZSBzY3NpIG1lZGlhIGNoYW5nZXIgZHJpdmVyCisgKi8KKworLyogY2hhbmdlciBlbGVtZW50IHR5cGVzICovCisjZGVmaW5lIENIRVRfTVQgICAwCS8qIG1lZGlhIHRyYW5zcG9ydCBlbGVtZW50IChyb2JvdCkgKi8KKyNkZWZpbmUgQ0hFVF9TVCAgIDEJLyogc3RvcmFnZSBlbGVtZW50IChtZWRpYSBzbG90cykgKi8KKyNkZWZpbmUgQ0hFVF9JRSAgIDIJLyogaW1wb3J0L2V4cG9ydCBlbGVtZW50ICovCisjZGVmaW5lIENIRVRfRFQgICAzCS8qIGRhdGEgdHJhbnNmZXIgZWxlbWVudCAodGFwZS9jZHJvbS93aGF0ZXZlcikgKi8KKyNkZWZpbmUgQ0hFVF9WMSAgIDQJLyogdmVuZG9yIHNwZWNpZmljICMxICovCisjZGVmaW5lIENIRVRfVjIgICA1CS8qIHZlbmRvciBzcGVjaWZpYyAjMiAqLworI2RlZmluZSBDSEVUX1YzICAgNgkvKiB2ZW5kb3Igc3BlY2lmaWMgIzMgKi8KKyNkZWZpbmUgQ0hFVF9WNCAgIDcJLyogdmVuZG9yIHNwZWNpZmljICM0ICovCisKKworLyoKKyAqIENISU9HUEFSQU1TCisgKiAgICBxdWVyeSBjaGFuZ2VyIHByb3BlcnRpZXMKKyAqCisgKiBDSElPVkdQQVJBTVMKKyAqICAgIHF1ZXJ5IHZlbmRvci1zcGVjaWZpYyBlbGVtZW50IHR5cGVzCisgKgorICogICAgYWNjZXNzaW5nIGVsZW1lbnRzIHdvcmtzIGJ5IHNwZWNpZmluZyB0eXBlIGFuZCB1bml0IG9mIHRoZSBlbGVtZW50LgorICogICAgZm9yIGVhbXBsZSwgc3RvcmFnZSBlbGVtZW50cyBhcmUgYWRkcmVzc2VkIHdpdGggdHlwZSA9IENIRVRfU1QgYW5kCisgKiAgICB1bml0ID0gMCAuLiBjcF9uc2xvdHMtMQorICoKKyAqLworc3RydWN0IGNoYW5nZXJfcGFyYW1zIHsKKwlpbnQgY3BfY3VycGlja2VyOyAgLyogY3VycmVudCB0cmFuc3BvcnQgZWxlbWVudCAqLworCWludCBjcF9ucGlja2VyczsgICAvKiBudW1iZXIgb2YgdHJhbnNwb3J0IGVsZW1lbnRzICAgICAgKENIRVRfTVQpICovCisJaW50IGNwX25zbG90czsgICAgIC8qIG51bWJlciBvZiBzdG9yYWdlIGVsZW1lbnRzICAgICAgICAoQ0hFVF9TVCkgKi8KKwlpbnQgY3BfbnBvcnRhbHM7ICAgLyogbnVtYmVyIG9mIGltcG9ydC9leHBvcnQgZWxlbWVudHMgIChDSEVUX0lFKSAqLworCWludCBjcF9uZHJpdmVzOyAgICAvKiBudW1iZXIgb2YgZGF0YSB0cmFuc2ZlciBlbGVtZW50cyAgKENIRVRfRFQpICovCit9Oworc3RydWN0IGNoYW5nZXJfdmVuZG9yX3BhcmFtcyB7CisJaW50ICBjdnBfbjE7ICAgICAgIC8qIG51bWJlciBvZiB2ZW5kb3Igc3BlY2lmaWMgZWxlbXMgICAoQ0hFVF9WMSkgKi8KKwljaGFyIGN2cF9sYWJlbDFbMTZdOworCWludCAgY3ZwX24yOyAgICAgICAvKiBudW1iZXIgb2YgdmVuZG9yIHNwZWNpZmljIGVsZW1zICAgKENIRVRfVjIpICovCisJY2hhciBjdnBfbGFiZWwyWzE2XTsKKwlpbnQgIGN2cF9uMzsgICAgICAgLyogbnVtYmVyIG9mIHZlbmRvciBzcGVjaWZpYyBlbGVtcyAgIChDSEVUX1YzKSAqLworCWNoYXIgY3ZwX2xhYmVsM1sxNl07CisJaW50ICBjdnBfbjQ7ICAgICAgIC8qIG51bWJlciBvZiB2ZW5kb3Igc3BlY2lmaWMgZWxlbXMgICAoQ0hFVF9WNCkgKi8KKwljaGFyIGN2cF9sYWJlbDRbMTZdOworCWludCAgcmVzZXJ2ZWRbOF07Cit9OworCisKKy8qCisgKiBDSElPTU9WRQorICogICAgbW92ZSBhIG1lZGl1bSBmcm9tIG9uZSBlbGVtZW50IHRvIGFub3RoZXIKKyAqLworc3RydWN0IGNoYW5nZXJfbW92ZSB7CisJaW50IGNtX2Zyb210eXBlOwkvKiB0eXBlL3VuaXQgb2Ygc291cmNlIGVsZW1lbnQgKi8KKwlpbnQgY21fZnJvbXVuaXQ7CQorCWludCBjbV90b3R5cGU7CS8qIHR5cGUvdW5pdCBvZiBkZXN0aW5hdGlvbiBlbGVtZW50ICovCisJaW50IGNtX3RvdW5pdDsKKwlpbnQgY21fZmxhZ3M7Cit9OworI2RlZmluZSBDTV9JTlZFUlQgICAxICAgLyogZmxhZzogcm90YXRlIG1lZGlhIChmb3IgZG91YmxlLXNpZGVkIGxpa2UgTU9EKSAqLworCisKKy8qCisgKiBDSElPRVhDSEFOR0UKKyAqICAgIG1vdmUgb25lIG1lZGl1bSBmcm9tIGVsZW1lbnQgIzEgdG8gZWxlbWVudCAjMiwKKyAqICAgIGFuZCBhbm90aGVyIG9uZSBmcm9tIGVsZW1lbnQgIzIgdG8gZWxlbWVudCAjMy4KKyAqICAgIGVsZW1lbnQgIzEgYW5kICMzIGFyZSBhbGxvd2VkIHRvIGJlIGlkZW50aWNhbC4KKyAqLworc3RydWN0IGNoYW5nZXJfZXhjaGFuZ2UgeworCWludCBjZV9zcmN0eXBlOwkgICAgLyogdHlwZS91bml0IG9mIGVsZW1lbnQgIzEgKi8KKwlpbnQgY2Vfc3JjdW5pdDsKKwlpbnQgY2VfZmRzdHR5cGU7ICAgIC8qIHR5cGUvdW5pdCBvZiBlbGVtZW50ICMyICovCisJaW50IGNlX2Zkc3R1bml0OworCWludCBjZV9zZHN0dHlwZTsgICAgLyogdHlwZS91bml0IG9mIGVsZW1lbnQgIzMgKi8KKwlpbnQgY2Vfc2RzdHVuaXQ7CisJaW50IGNlX2ZsYWdzOworfTsKKyNkZWZpbmUgQ0VfSU5WRVJUMSAgIDEKKyNkZWZpbmUgQ0VfSU5WRVJUMiAgIDIKKworCisvKgorICogQ0hJT1BPU0lUSU9OCisgKiAgICBtb3ZlIHRoZSB0cmFuc3BvcnQgZWxlbWVudCAocm9ib3QgYXJtKSB0byBhIHNwZWNpZmljIGVsZW1lbnQuCisgKi8KK3N0cnVjdCBjaGFuZ2VyX3Bvc2l0aW9uIHsKKwlpbnQgY3BfdHlwZTsKKwlpbnQgY3BfdW5pdDsKKwlpbnQgY3BfZmxhZ3M7Cit9OworI2RlZmluZSBDUF9JTlZFUlQgICAxCisKKworLyoKKyAqIENISU9HU1RBVFVTCisgKiAgICBnZXQgZWxlbWVudCBzdGF0dXMgZm9yIGFsbCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGUKKyAqLworc3RydWN0IGNoYW5nZXJfZWxlbWVudF9zdGF0dXMgeworCWludCAgICAgICAgICAgICBjZXNfdHlwZTsKKwl1bnNpZ25lZCBjaGFyICAgKmNlc19kYXRhOworfTsKKyNkZWZpbmUgQ0VTVEFUVVNfRlVMTCAgICAgMHgwMSAvKiBmdWxsICovCisjZGVmaW5lIENFU1RBVFVTX0lNUEVYUCAgIDB4MDIJLyogbWVkaWEgd2FzIGltcG9ydGVkIChpbnNlcnRlZCBieSBzeXNvcCkgKi8KKyNkZWZpbmUgQ0VTVEFUVVNfRVhDRVBUICAgMHgwNAkvKiBlcnJvciBjb25kaXRpb24gKi8KKyNkZWZpbmUgQ0VTVEFUVVNfQUNDRVNTICAgMHgwOAkvKiBhY2Nlc3MgYWxsb3dlZCAqLworI2RlZmluZSBDRVNUQVRVU19FWEVOQUIgICAweDEwCS8qIGVsZW1lbnQgY2FuIGV4cG9ydCBtZWRpYSAqLworI2RlZmluZSBDRVNUQVRVU19JTkVOQUIgICAweDIwCS8qIGVsZW1lbnQgY2FuIGltcG9ydCBtZWRpYSAqLworCisKKy8qCisgKiBDSElPR0VMRU0KKyAqICAgIGdldCBtb3JlIGRldGFpbGVkIHN0YXR1cyBpbmZvcm10aW9uIGZvciBhIHNpbmdsZSBlbGVtZW50CisgKi8KK3N0cnVjdCBjaGFuZ2VyX2dldF9lbGVtZW50IHsKKwlpbnQJY2dlX3R5cGU7CSAvKiB0eXBlL3VuaXQgKi8KKwlpbnQJY2dlX3VuaXQ7CisJaW50CWNnZV9zdGF0dXM7ICAgICAgLyogc3RhdHVzICovCisJaW50ICAgICBjZ2VfZXJybm87ICAgICAgIC8qIGVycm5vICovCisJaW50ICAgICBjZ2Vfc3JjdHlwZTsgICAgIC8qIHNvdXJjZSBlbGVtZW50IG9mIHRoZSBsYXN0IG1vdmUvZXhjaGFuZ2UgKi8KKwlpbnQgICAgIGNnZV9zcmN1bml0OworCWludCAgICAgY2dlX2lkOyAgICAgICAgICAvKiBzY3NpIGlkICAoZm9yIGRhdGEgdHJhbnNmZXIgZWxlbWVudHMpICovCisJaW50ICAgICBjZ2VfbHVuOyAgICAgICAgIC8qIHNjc2kgbHVuIChmb3IgZGF0YSB0cmFuc2ZlciBlbGVtZW50cykgKi8KKwljaGFyICAgIGNnZV9wdm9sdGFnWzM2XTsgLyogcHJpbWFyeSB2b2x1bWUgdGFnICovCisJY2hhciAgICBjZ2VfYXZvbHRhZ1szNl07IC8qIGFsdGVybmF0ZSB2b2x1bWUgdGFnICovCisJaW50ICAgICBjZ2VfZmxhZ3M7Cit9OworLyogZmxhZ3MgKi8KKyNkZWZpbmUgQ0dFX0VSUk5PICAgICAweDAxICAgICAgIC8qIGVycm5vIGF2YWlsYWJsZSAgICAgICAqLworI2RlZmluZSBDR0VfSU5WRVJUICAgIDB4MDIgICAgICAgLyogbWVkaWEgaW52ZXJ0ZWQgICAgICAgICovCisjZGVmaW5lIENHRV9TUkMgICAgICAgMHgwNCAgICAgICAvKiBtZWRpYSBzcmMgYXZhaWxhYmxlICAgKi8KKyNkZWZpbmUgQ0dFX0lETFVOICAgICAweDA4ICAgICAgIC8qIElEK0xVTiBhdmFpbGFibGUgICAgICAqLworI2RlZmluZSBDR0VfUFZPTFRBRyAgIDB4MTAgICAgICAgLyogcHJpbWFyeSB2b2x1bWUgdGFnIGF2YWlsYWJsZSAqLworI2RlZmluZSBDR0VfQVZPTFRBRyAgIDB4MjAgICAgICAgLyogYWx0ZXJuYXRlIHZvbHVtZSB0YWcgYXZhaWxhYmxlICovCisKKworLyoKKyAqIENISU9TVk9MVEFHCisgKiAgICBzZXQgdm9sdW1lIHRhZworICovCitzdHJ1Y3QgY2hhbmdlcl9zZXRfdm9sdGFnIHsKKwlpbnQJY3N2X3R5cGU7CSAvKiB0eXBlL3VuaXQgKi8KKwlpbnQJY3N2X3VuaXQ7CisJY2hhciAgICBjc3Zfdm9sdGFnWzM2XTsgIC8qIHZvbHVtZSB0YWcgKi8KKwlpbnQgICAgIGNzdl9mbGFnczsKK307CisjZGVmaW5lIENTVl9QVk9MVEFHICAgMHgwMSAgICAgICAvKiBwcmltYXJ5IHZvbHVtZSB0YWcgKi8KKyNkZWZpbmUgQ1NWX0FWT0xUQUcgICAweDAyICAgICAgIC8qIGFsdGVybmF0ZSB2b2x1bWUgdGFnICovCisjZGVmaW5lIENTVl9DTEVBUlRBRyAgMHgwNCAgICAgICAvKiBjbGVhciB2b2x1bWUgdGFnICovCisKKy8qIGlvY3RscyAqLworI2RlZmluZSBDSElPTU9WRSAgICAgICBfSU9XKCdjJywgMSxzdHJ1Y3QgY2hhbmdlcl9tb3ZlKQorI2RlZmluZSBDSElPRVhDSEFOR0UgICBfSU9XKCdjJywgMixzdHJ1Y3QgY2hhbmdlcl9leGNoYW5nZSkKKyNkZWZpbmUgQ0hJT1BPU0lUSU9OICAgX0lPVygnYycsIDMsc3RydWN0IGNoYW5nZXJfcG9zaXRpb24pCisjZGVmaW5lIENISU9HUElDS0VSICAgIF9JT1IoJ2MnLCA0LGludCkgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgaW1wbC4gKi8KKyNkZWZpbmUgQ0hJT1NQSUNLRVIgICAgX0lPVygnYycsIDUsaW50KSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBpbXBsLiAqLworI2RlZmluZSBDSElPR1BBUkFNUyAgICBfSU9SKCdjJywgNixzdHJ1Y3QgY2hhbmdlcl9wYXJhbXMpCisjZGVmaW5lIENISU9HU1RBVFVTICAgIF9JT1coJ2MnLCA4LHN0cnVjdCBjaGFuZ2VyX2VsZW1lbnRfc3RhdHVzKQorI2RlZmluZSBDSElPR0VMRU0gICAgICBfSU9XKCdjJywxNixzdHJ1Y3QgY2hhbmdlcl9nZXRfZWxlbWVudCkKKyNkZWZpbmUgQ0hJT0lOSVRFTEVNICAgX0lPKCdjJywxNykKKyNkZWZpbmUgQ0hJT1NWT0xUQUcgICAgX0lPVygnYycsMTgsc3RydWN0IGNoYW5nZXJfc2V0X3ZvbHRhZykKKyNkZWZpbmUgQ0hJT0dWUEFSQU1TICAgX0lPUignYycsMTksc3RydWN0IGNoYW5nZXJfdmVuZG9yX3BhcmFtcykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbTQwMDBfY3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY200MDAwX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiODkwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY200MDAwX2NzLmgKQEAgLTAsMCArMSw2MCBAQAorI2lmbmRlZglfQ000MDAwX0hfCisjZGVmaW5lCV9DTTQwMDBfSF8KKworI2RlZmluZQlNQVhfQVRSCQkJMzMKKworI2RlZmluZQlDTTQwMDBfTUFYX0RFVgkJNAorCisvKiB0aG9zZSB0d28gc3RydWN0dXJlcyBhcmUgcGFzc2VkIHZpYSBpb2N0bCgpIGZyb20vdG8gdXNlcnNwYWNlLiAgVGhleSBhcmUKKyAqIHVzZWQgYnkgZXhpc3RpbmcgdXNlcnNwYWNlIHByb2dyYW1zLCBzbyBJIGtlcHRoIHRoZSBhd2t3YXJkICJiSUZTRCIgbmFtaW5nCisgKiBub3QgdG8gYnJlYWsgY29tcGlsYXRpb24gb2YgdXNlcnNwYWNlIGFwcHMuIC1IVyAqLworCit0eXBlZGVmIHN0cnVjdCBhdHJlcSB7CisJaW50MzJfdCBhdHJfbGVuOworCXVuc2lnbmVkIGNoYXIgYXRyWzY0XTsKKwlpbnQzMl90IHBvd2VyX2FjdDsKKwl1bnNpZ25lZCBjaGFyIGJJRlNEOworCXVuc2lnbmVkIGNoYXIgYklGU0M7Cit9IGF0cmVxX3Q7CisKKworLyogd2hhdCBpcyBwYXJ0aWN1bGFybHkgc3R1cGlkIGluIHRoZSBvcmlnaW5hbCBkcml2ZXIgaXMgdGhlIGFyY2gtZGVwZW5kYW50CisgKiBtZW1iZXIgc2l6ZXMuIFRoaXMgbGVhZHMgdG8gQ09ORklHX0NPTVBBVCBicmVha2FnZSwgc2luY2UgMzJiaXQgdXNlcnNwYWNlCisgKiB3aWxsIGxheSBvdXQgdGhlIHN0cnVjdHVyZSBtZW1iZXJzIGRpZmZlcmVudGx5IHRoYW4gdGhlIDY0Yml0IGtlcm5lbC4KKyAqCisgKiBJJ3ZlIGNoYW5nZWQgInB0c3JlcS5wcm90b2NvbCIgZnJvbSAidW5zaWduZWQgbG9uZyIgdG8gInVfaW50MzJfdCIuCisgKiBPbiAzMmJpdCB0aGlzIHdpbGwgbWFrZSBubyBkaWZmZXJlbmNlLiAgV2l0aCA2NGJpdCBrZXJuZWxzLCBpdCB3aWxsIG1ha2UKKyAqIDMyYml0IGFwcHMgd29yaywgdG9vLgorICovCisKK3R5cGVkZWYgc3RydWN0IHB0c3JlcSB7CisJdV9pbnQzMl90IHByb3RvY29sOyAvKlQ9MDogMl4wLCBUPTE6ICAyXjEqLworIAl1bnNpZ25lZCBjaGFyIGZsYWdzOworIAl1bnNpZ25lZCBjaGFyIHB0czE7CisgCXVuc2lnbmVkIGNoYXIgcHRzMjsKKwl1bnNpZ25lZCBjaGFyIHB0czM7Cit9IHB0c3JlcV90OworCisjZGVmaW5lCUNNX0lPQ19NQUdJQwkJJ2MnCisjZGVmaW5lCUNNX0lPQ19NQVhOUgkgICAgICAgIDI1NQorCisjZGVmaW5lCUNNX0lPQ0dTVEFUVVMJCV9JT1IgKENNX0lPQ19NQUdJQywgMCwgdW5zaWduZWQgY2hhciAqKQorI2RlZmluZQlDTV9JT0NHQVRSCQlfSU9XUihDTV9JT0NfTUFHSUMsIDEsIGF0cmVxX3QgKikKKyNkZWZpbmUJQ01fSU9DU1BUUwkJX0lPVyAoQ01fSU9DX01BR0lDLCAyLCBwdHNyZXFfdCAqKQorI2RlZmluZQlDTV9JT0NTUkRSCQlfSU8gIChDTV9JT0NfTUFHSUMsIDMpCisjZGVmaW5lIENNX0lPQ0FSRE9GRiAgICAgICAgICAgIF9JTyAgKENNX0lPQ19NQUdJQywgNCkKKworI2RlZmluZSBDTV9JT1NEQkdMVkwgICAgICAgICAgICBfSU9XKENNX0lPQ19NQUdJQywgMjUwLCBpbnQqKQorCisvKiBjYXJkIGFuZCBkZXZpY2Ugc3RhdGVzICovCisjZGVmaW5lCUNNX0NBUkRfSU5TRVJURUQJCTB4MDEKKyNkZWZpbmUJQ01fQ0FSRF9QT1dFUkVECQkJMHgwMgorI2RlZmluZQlDTV9BVFJfUFJFU0VOVAkJCTB4MDQKKyNkZWZpbmUJQ01fQVRSX1ZBTElECSAJCTB4MDgKKyNkZWZpbmUJQ01fU1RBVEVfVkFMSUQJCQkweDBmCisvKiBleHRyYSBpbmZvIG9ubHkgZnJvbSBDTTQwMDAgKi8KKyNkZWZpbmUJQ01fTk9fUkVBREVSCQkJMHgxMAorI2RlZmluZQlDTV9CQURfQ0FSRAkJCTB4MjAKKworCisjZW5kaWYJLyogX0NNNDAwMF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbl9wcm9jLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NuX3Byb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY2MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jbl9wcm9jLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBjbl9wcm9jLmggLSBwcm9jZXNzIGV2ZW50cyBjb25uZWN0b3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIE1hdHQgSGVsc2xleSwgSUJNIENvcnAuIDIwMDUKKyAqIEJhc2VkIG9uIGNuX2ZvcmsuaCBieSBOZ3V5ZW4gQW5oIFF1eW5oIGFuZCBHdWlsbGF1bWUgVGhvdXZlbmluCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmd1eWVuIEFuaCBRdXluaCA8YXF1eW5oQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBHdWlsbGF1bWUgVGhvdXZlbmluIDxndWlsbGF1bWUudGhvdXZlbmluQGJ1bGwubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIENOX1BST0NfSAorI2RlZmluZSBDTl9QUk9DX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBVc2Vyc3BhY2Ugc2VuZHMgdGhpcyBlbnVtIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGtlcm5lbCB0aGF0IGl0IGlzIGxpc3RlbmluZworICogZm9yIGV2ZW50cyBvbiB0aGUgY29ubmVjdG9yLgorICovCitlbnVtIHByb2NfY25fbWNhc3Rfb3AgeworCVBST0NfQ05fTUNBU1RfTElTVEVOID0gMSwKKwlQUk9DX0NOX01DQVNUX0lHTk9SRSA9IDIKK307CisKKy8qCisgKiBGcm9tIHRoZSB1c2VyJ3MgcG9pbnQgb2YgdmlldywgdGhlIHByb2Nlc3MKKyAqIElEIGlzIHRoZSB0aHJlYWQgZ3JvdXAgSUQgYW5kIHRocmVhZCBJRCBpcyB0aGUgaW50ZXJuYWwKKyAqIGtlcm5lbCAicGlkIi4gU28sIGZpZWxkcyBhcmUgYXNzaWduZWQgYXMgZm9sbG93OgorICoKKyAqICBJbiB1c2VyIHNwYWNlICAgICAtICBJbiAga2VybmVsIHNwYWNlCisgKgorICogcGFyZW50IHByb2Nlc3MgSUQgID0gIHBhcmVudC0+dGdpZAorICogcGFyZW50IHRocmVhZCAgSUQgID0gIHBhcmVudC0+cGlkCisgKiBjaGlsZCAgcHJvY2VzcyBJRCAgPSAgY2hpbGQtPnRnaWQKKyAqIGNoaWxkICB0aHJlYWQgIElEICA9ICBjaGlsZC0+cGlkCisgKi8KKworc3RydWN0IHByb2NfZXZlbnQgeworCWVudW0gd2hhdCB7CisJCS8qIFVzZSBzdWNjZXNzaXZlIGJpdHMgc28gdGhlIGVudW1zIGNhbiBiZSB1c2VkIHRvIHJlY29yZAorCQkgKiBzZXRzIG9mIGV2ZW50cyBhcyB3ZWxsCisJCSAqLworCQlQUk9DX0VWRU5UX05PTkUgPSAweDAwMDAwMDAwLAorCQlQUk9DX0VWRU5UX0ZPUksgPSAweDAwMDAwMDAxLAorCQlQUk9DX0VWRU5UX0VYRUMgPSAweDAwMDAwMDAyLAorCQlQUk9DX0VWRU5UX1VJRCAgPSAweDAwMDAwMDA0LAorCQlQUk9DX0VWRU5UX0dJRCAgPSAweDAwMDAwMDQwLAorCQkvKiAibmV4dCIgc2hvdWxkIGJlIDB4MDAwMDA0MDAgKi8KKwkJLyogImxhc3QiIGlzIHRoZSBsYXN0IHByb2Nlc3MgZXZlbnQ6IGV4aXQgKi8KKwkJUFJPQ19FVkVOVF9FWElUID0gMHg4MDAwMDAwMAorCX0gd2hhdDsKKwlfX3UzMiBjcHU7CisJX191NjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpIHRpbWVzdGFtcF9uczsKKwkJLyogTnVtYmVyIG9mIG5hbm8gc2Vjb25kcyBzaW5jZSBzeXN0ZW0gYm9vdCAqLworCXVuaW9uIHsgLyogbXVzdCBiZSBsYXN0IGZpZWxkIG9mIHByb2NfZXZlbnQgc3RydWN0ICovCisJCXN0cnVjdCB7CisJCQlfX3UzMiBlcnI7CisJCX0gYWNrOworCisJCXN0cnVjdCBmb3JrX3Byb2NfZXZlbnQgeworCQkJcGlkX3QgcGFyZW50X3BpZDsKKwkJCXBpZF90IHBhcmVudF90Z2lkOworCQkJcGlkX3QgY2hpbGRfcGlkOworCQkJcGlkX3QgY2hpbGRfdGdpZDsKKwkJfSBmb3JrOworCisJCXN0cnVjdCBleGVjX3Byb2NfZXZlbnQgeworCQkJcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlwaWRfdCBwcm9jZXNzX3RnaWQ7CisJCX0gZXhlYzsKKworCQlzdHJ1Y3QgaWRfcHJvY19ldmVudCB7CisJCQlwaWRfdCBwcm9jZXNzX3BpZDsKKwkJCXBpZF90IHByb2Nlc3NfdGdpZDsKKwkJCXVuaW9uIHsKKwkJCQlfX3UzMiBydWlkOyAvKiB0YXNrIHVpZCAqLworCQkJCV9fdTMyIHJnaWQ7IC8qIHRhc2sgZ2lkICovCisJCQl9IHI7CisJCQl1bmlvbiB7CisJCQkJX191MzIgZXVpZDsKKwkJCQlfX3UzMiBlZ2lkOworCQkJfSBlOworCQl9IGlkOworCisJCXN0cnVjdCBleGl0X3Byb2NfZXZlbnQgeworCQkJcGlkX3QgcHJvY2Vzc19waWQ7CisJCQlwaWRfdCBwcm9jZXNzX3RnaWQ7CisJCQlfX3UzMiBleGl0X2NvZGUsIGV4aXRfc2lnbmFsOworCQl9IGV4aXQ7CisJfSBldmVudF9kYXRhOworfTsKKworI2VuZGlmCS8qIENOX1BST0NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWYxYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhLmgKQEAgLTAsMCArMSw3ODAgQEAKKy8qIAorICAgWW91IG1heSBkaXN0cmlidXRlIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgb2YgdGhlIHR3byBsaWNlbnNlcyB0aGF0CisgICBmb2xsb3cgYXQgeW91ciBkaXNjcmV0aW9uLgorKi8KKworLyogQkxVUkIgbGdwbAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RhIEZpbGUgU3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIDUKKworICAgICAgICAgIENvcHlyaWdodCAoYykgMTk4Ny0xOTk5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGNvcHlyaWdodHMgbGlzdGVkIGJlbG93CisKK1RoaXMgY29kZSBpcyBkaXN0cmlidXRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBWZXJzaW9uIDIsIGFzCitzaG93biBpbiB0aGUgZmlsZSBMSUNFTlNFLCBvciB1bmRlciB0aGUgbGljZW5zZSBzaG93biBiZWxvdy4gVGhlCit0ZWNobmljYWwgYW5kIGZpbmFuY2lhbCBjb250cmlidXRvcnMgdG8gQ29kYSBhcmUgbGlzdGVkIGluIHRoZSBmaWxlCitDUkVESVRTLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIGNvcHlyaWdodHMgCisqLworCisvKgorCisgICAgICAgICAgICBDb2RhOiBhbiBFeHBlcmltZW50YWwgRGlzdHJpYnV0ZWQgRmlsZSBTeXN0ZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZSA0LjAKKworICAgICAgICAgIENvcHlyaWdodCAoYykgMTk4Ny0xOTk5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitQZXJtaXNzaW9uICB0byAgdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCAgcHJvdmlkZWQgIHRoYXQgIGJvdGggIHRoZSAgY29weXJpZ2h0Citub3RpY2UgIGFuZCAgdGhpcyAgcGVybWlzc2lvbiAgbm90aWNlICBhcHBlYXIgIGluICBhbGwgIGNvcGllcyAgb2YgdGhlCitzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciAgbW9kaWZpZWQgIHZlcnNpb25zLCAgYW5kICBhbnkgIHBvcnRpb25zCit0aGVyZW9mLCBhbmQgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kCit0aGF0IGNyZWRpdCBpcyBnaXZlbiB0byBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSAgaW4gIGFsbCAgZG9jdW1lbnRzCithbmQgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlyZWN0IG9yIGluZGlyZWN0IHVzZSBvZiB0aGlzIGNvZGUgb3IgaXRzCitkZXJpdmF0aXZlcy4KKworQ09EQSBJUyBBTiBFWFBFUklNRU5UQUwgU09GVFdBUkUgU1lTVEVNIEFORCBJUyAgS05PV04gIFRPICBIQVZFICBCVUdTLAorU09NRSAgT0YgIFdISUNIIE1BWSBIQVZFIFNFUklPVVMgQ09OU0VRVUVOQ0VTLiAgQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUworRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIiBDT05ESVRJT04uICAgQ0FSTkVHSUUgIE1FTExPTgorRElTQ0xBSU1TICBBTlkgIExJQUJJTElUWSAgT0YgIEFOWSAgS0lORCAgRk9SICBBTlkgIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIERJUkVDVExZIE9SIElORElSRUNUTFkgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgIE9SICBPRgorQU5ZIERFUklWQVRJVkUgV09SSy4KKworQ2FybmVnaWUgIE1lbGxvbiAgZW5jb3VyYWdlcyAgdXNlcnMgIG9mICB0aGlzICBzb2Z0d2FyZSAgdG8gcmV0dXJuIGFueQoraW1wcm92ZW1lbnRzIG9yIGV4dGVuc2lvbnMgdGhhdCAgdGhleSAgbWFrZSwgIGFuZCAgdG8gIGdyYW50ICBDYXJuZWdpZQorTWVsbG9uIHRoZSByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMgd2l0aG91dCBlbmN1bWJyYW5jZS4KKyovCisKKy8qCisgKgorICogQmFzZWQgb24gY2ZzLmggZnJvbSBNYWNoLCBidXQgcmV2YW1wZWQgZm9yIGluY3JlYXNlZCBzaW1wbGljaXR5LgorICogTGludXggbW9kaWZpY2F0aW9ucyBieSAKKyAqIFBldGVyIEJyYWFtLCBBdWcgMTk5NgorICovCisKKyNpZm5kZWYgX0NPREFfSEVBREVSXworI2RlZmluZSBfQ09EQV9IRUFERVJfCisKKworLyogQ2F0Y2ggbmV3IF9LRVJORUwgZGVmbiBmb3IgTmV0QlNEIGFuZCBESkdQUC9fX0NZR1dJTjMyX18gKi8KKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IFwKKyAgKChkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKF9fQ1lHV0lOMzJfXykpICYmICFkZWZpbmVkKEtFUk5FTCkpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgCisKKyNpZm5kZWYgQ09EQV9NQVhTWU1MSU5LUworI2RlZmluZSBDT0RBX01BWFNZTUxJTktTIDEwCisjZW5kaWYKKworI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoX19DWUdXSU4zMl9fKQorI2lmZGVmIEtFUk5FTAordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVfbG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X3Nob3J0OwordHlwZWRlZiB1X2xvbmcgaW5vX3Q7Cit0eXBlZGVmIHVfbG9uZyBkZXZfdDsKK3R5cGVkZWYgdm9pZCAqIGNhZGRyX3Q7CisjaWZkZWYgRE9TCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdV9xdWFkX3Q7CisjZWxzZSAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfcXVhZF90OworI2VuZGlmCisKKyNkZWZpbmUgaW5saW5lCisKK3N0cnVjdCB0aW1lc3BlYyB7CisgICAgICAgIGxvbmcgICAgICAgdHNfc2VjOworICAgICAgICBsb25nICAgICAgIHRzX25zZWM7Cit9OworI2Vsc2UgIC8qIERKR1BQIGJ1dCBub3QgS0VSTkVMICovCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfcXVhZF90OworI2VuZGlmIC8qICFLRVJORUwgKi8KKyNlbmRpZiAvKiAhREpHUFAgKi8KKworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2RlZmluZSBjZGV2X3QgdV9xdWFkX3QKKyNpZiAhZGVmaW5lZChfVVFVQURfVF8pICYmICghZGVmaW5lZChfX0dMSUJDX18pIHx8IF9fR0xJQkNfXyA8IDIpCisjZGVmaW5lIF9VUVVBRF9UXyAxCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1X3F1YWRfdDsKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgY2Rldl90IGRldl90CisjZW5kaWYKKworI2lmZGVmIF9fQ1lHV0lOMzJfXworc3RydWN0IHRpbWVzcGVjIHsKKyAgICAgICAgdGltZV90ICB0dl9zZWM7ICAgICAgICAgLyogc2Vjb25kcyAqLworICAgICAgICBsb25nICAgIHR2X25zZWM7ICAgICAgICAvKiBuYW5vc2Vjb25kcyAqLworfTsKKyNlbmRpZgorCisjaWZuZGVmIF9fQklUX1RZUEVTX0RFRklORURfXworI2RlZmluZSBfX0JJVF9UWVBFU19ERUZJTkVEX18KK3R5cGVkZWYgc2lnbmVkIGNoYXIJICAgICAgaW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCSAgICB1X2ludDhfdDsKK3R5cGVkZWYgc2hvcnQJCSAgICAgaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgdV9pbnQxNl90OwordHlwZWRlZiBpbnQJCSAgICAgaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CSAgIHVfaW50MzJfdDsKKyNlbmRpZgorCisKKy8qCisgKiBDZnMgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUgQ09EQV9NQVhOQU1MRU4gICAyNTUKKyNkZWZpbmUgQ09EQV9NQVhQQVRITEVOICAxMDI0CisjZGVmaW5lIENPREFfTUFYU1lNTElOSyAgMTAKKworLyogdGhlc2UgYXJlIENvZGEncyB2ZXJzaW9uIG9mIE9fUkRPTkxZIGV0YyBjb21iaW5hdGlvbnMKKyAqIHRvIGRlYWwgd2l0aCBWRlMgb3BlbiBtb2RlcworICovCisjZGVmaW5lCUNfT19SRUFECTB4MDAxCisjZGVmaW5lCUNfT19XUklURSAgICAgICAweDAwMgorI2RlZmluZSBDX09fVFJVTkMgICAgICAgMHgwMTAKKyNkZWZpbmUgQ19PX0VYQ0wJMHgxMDAKKyNkZWZpbmUgQ19PX0NSRUFUCTB4MjAwCisKKy8qIHRoZXNlIGFyZSB0byBmaW5kIG1vZGUgYml0cyBpbiBWZW51cyAqLyAKKyNkZWZpbmUgQ19NX1JFQUQgIDAwNDAwCisjZGVmaW5lIENfTV9XUklURSAwMDIwMAorCisvKiBmb3IgYWNjZXNzIFZlbnVzIHdpbGwgdXNlICovCisjZGVmaW5lIENfQV9DX09LICAgIDggICAgICAgICAgICAgICAvKiBUZXN0IGZvciB3cml0aW5nIHVwb24gY3JlYXRlLiAgKi8KKyNkZWZpbmUgQ19BX1JfT0sgICAgNCAgICAgICAgICAgICAgIC8qIFRlc3QgZm9yIHJlYWQgcGVybWlzc2lvbi4gICovCisjZGVmaW5lIENfQV9XX09LICAgIDIgICAgICAgICAgICAgICAvKiBUZXN0IGZvciB3cml0ZSBwZXJtaXNzaW9uLiAgKi8KKyNkZWZpbmUgQ19BX1hfT0sgICAgMSAgICAgICAgICAgICAgIC8qIFRlc3QgZm9yIGV4ZWN1dGUgcGVybWlzc2lvbi4gICovCisjZGVmaW5lIENfQV9GX09LICAgIDAgICAgICAgICAgICAgICAvKiBUZXN0IGZvciBleGlzdGVuY2UuICAqLworCisKKworI2lmbmRlZiBfVkVOVVNfRElSRU5UX1RfCisjZGVmaW5lIF9WRU5VU19ESVJFTlRfVF8gMQorc3RydWN0IHZlbnVzX2RpcmVudCB7CisgICAgICAgIHVfaW50MzJfdCBkX2ZpbGVubzsJCS8qIGZpbGUgbnVtYmVyIG9mIGVudHJ5ICovCisgICAgICAgIHVfaW50MTZfdCBkX3JlY2xlbjsJCS8qIGxlbmd0aCBvZiB0aGlzIHJlY29yZCAqLworICAgICAgICB1X2ludDhfdCAgZF90eXBlOwkJCS8qIGZpbGUgdHlwZSwgc2VlIGJlbG93ICovCisgICAgICAgIHVfaW50OF90ICBkX25hbWxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgaW4gZF9uYW1lICovCisgICAgICAgIGNoYXIJICBkX25hbWVbQ09EQV9NQVhOQU1MRU4gKyAxXTsvKiBuYW1lIG11c3QgYmUgbm8gbG9uZ2VyIHRoYW4gdGhpcyAqLworfTsKKyN1bmRlZiBESVJTSVoKKyNkZWZpbmUgRElSU0laKGRwKSAgICAgICgoc2l6ZW9mIChzdHJ1Y3QgdmVudXNfZGlyZW50KSAtIChDT0RBX01BWE5BTUxFTisxKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZHApLT5kX25hbWxlbisxICsgMykgJn4gMykpCisKKy8qCisgKiBGaWxlIHR5cGVzCisgKi8KKyNkZWZpbmUJQ0RUX1VOS05PV04JIDAKKyNkZWZpbmUJQ0RUX0ZJRk8JIDEKKyNkZWZpbmUJQ0RUX0NIUgkJIDIKKyNkZWZpbmUJQ0RUX0RJUgkJIDQKKyNkZWZpbmUJQ0RUX0JMSwkJIDYKKyNkZWZpbmUJQ0RUX1JFRwkJIDgKKyNkZWZpbmUJQ0RUX0xOSwkJMTAKKyNkZWZpbmUJQ0RUX1NPQ0sJMTIKKyNkZWZpbmUJQ0RUX1dIVAkJMTQKKworLyoKKyAqIENvbnZlcnQgYmV0d2VlbiBzdGF0IHN0cnVjdHVyZSB0eXBlcyBhbmQgZGlyZWN0b3J5IHR5cGVzLgorICovCisjZGVmaW5lCUlGVE9DRFQobW9kZSkJKCgobW9kZSkgJiAwMTcwMDAwKSA+PiAxMikKKyNkZWZpbmUJQ0RUVE9JRihkaXJ0eXBlKQkoKGRpcnR5cGUpIDw8IDEyKQorCisjZW5kaWYKKworI2lmbmRlZiBfVlVJRF9UXworI2RlZmluZSBfVlVJRF9UXwordHlwZWRlZiB1X2ludDMyX3QgdnVpZF90OwordHlwZWRlZiB1X2ludDMyX3QgdmdpZF90OworI2VuZGlmIC8qX1ZVSURfVF8gKi8KKworI2lmZGVmIENPTkZJR19DT0RBX0ZTX09MRF9BUEkKK3N0cnVjdCBDb2RhRmlkIHsKKwl1X2ludDMyX3Qgb3BhcXVlWzNdOworfTsKKworc3RhdGljIF9faW5saW5lX18gaW5vX3QgIGNvZGFfZjJpKHN0cnVjdCBDb2RhRmlkICpmaWQpCit7CisJaWYgKCAhIGZpZCApIAorCQlyZXR1cm4gMDsgCisJaWYgKGZpZC0+b3BhcXVlWzFdID09IDB4ZmZmZmZmZmUgfHwgZmlkLT5vcGFxdWVbMV0gPT0gMHhmZmZmZmZmZikKKwkJcmV0dXJuICgoZmlkLT5vcGFxdWVbMF0gPDwgMjApIHwgKGZpZC0+b3BhcXVlWzJdICYgMHhmZmZmZikpOworCWVsc2UKKwkJcmV0dXJuIChmaWQtPm9wYXF1ZVsyXSArIChmaWQtPm9wYXF1ZVsxXTw8MTApICsgKGZpZC0+b3BhcXVlWzBdPDwyMCkpOworfQorCitzdHJ1Y3QgY29kYV9jcmVkIHsKKyAgICB2dWlkX3QgY3JfdWlkLCBjcl9ldWlkLCBjcl9zdWlkLCBjcl9mc3VpZDsgLyogUmVhbCwgZWZmdHZlLCBzZXQsIGZzIHVpZCovCisgICAgdmdpZF90IGNyX2dyb3VwaWQsIGNyX2VnaWQsIGNyX3NnaWQsIGNyX2ZzZ2lkOyAvKiBzYW1lIGZvciBncm91cHMgKi8KK307CisKKyNlbHNlIC8qIG5vdCBkZWZpbmVkKENPTkZJR19DT0RBX0ZTX09MRF9BUEkpICovCisKK3N0cnVjdCBDb2RhRmlkIHsKKwl1X2ludDMyX3Qgb3BhcXVlWzRdOworfTsKKworI2RlZmluZSBjb2RhX2YyaShmaWQpXAorCShmaWQgPyAoZmlkLT5vcGFxdWVbM10gXiAoZmlkLT5vcGFxdWVbMl08PDEwKSBeIChmaWQtPm9wYXF1ZVsxXTw8MjApIF4gZmlkLT5vcGFxdWVbMF0pIDogMCkKKworI2VuZGlmCisKKyNpZm5kZWYgX1ZFTlVTX1ZBVFRSX1RfCisjZGVmaW5lIF9WRU5VU19WQVRUUl9UXworLyoKKyAqIFZub2RlIHR5cGVzLiAgVk5PTiBtZWFucyBubyB0eXBlLgorICovCitlbnVtIGNvZGFfdnR5cGUJeyBDX1ZOT04sIENfVlJFRywgQ19WRElSLCBDX1ZCTEssIENfVkNIUiwgQ19WTE5LLCBDX1ZTT0NLLCBDX1ZGSUZPLCBDX1ZCQUQgfTsKKworc3RydWN0IGNvZGFfdmF0dHIgeworCWxvbmcgICAgIAl2YV90eXBlOwkvKiB2bm9kZSB0eXBlIChmb3IgY3JlYXRlKSAqLworCXVfc2hvcnQJCXZhX21vZGU7CS8qIGZpbGVzIGFjY2VzcyBtb2RlIGFuZCB0eXBlICovCisJc2hvcnQJCXZhX25saW5rOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBmaWxlICovCisJdnVpZF90CQl2YV91aWQ7CQkvKiBvd25lciB1c2VyIGlkICovCisJdmdpZF90CQl2YV9naWQ7CQkvKiBvd25lciBncm91cCBpZCAqLworCWxvbmcJCXZhX2ZpbGVpZDsJLyogZmlsZSBpZCAqLworCXVfcXVhZF90CXZhX3NpemU7CS8qIGZpbGUgc2l6ZSBpbiBieXRlcyAqLworCWxvbmcJCXZhX2Jsb2Nrc2l6ZTsJLyogYmxvY2tzaXplIHByZWZlcnJlZCBmb3IgaS9vICovCisJc3RydWN0IHRpbWVzcGVjCXZhX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJc3RydWN0IHRpbWVzcGVjCXZhX210aW1lOwkvKiB0aW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uICovCisJc3RydWN0IHRpbWVzcGVjCXZhX2N0aW1lOwkvKiB0aW1lIGZpbGUgY2hhbmdlZCAqLworCXVfbG9uZwkJdmFfZ2VuOwkJLyogZ2VuZXJhdGlvbiBudW1iZXIgb2YgZmlsZSAqLworCXVfbG9uZwkJdmFfZmxhZ3M7CS8qIGZsYWdzIGRlZmluZWQgZm9yIGZpbGUgKi8KKwljZGV2X3QJICAgICAgICB2YV9yZGV2OwkvKiBkZXZpY2Ugc3BlY2lhbCBmaWxlIHJlcHJlc2VudHMgKi8KKwl1X3F1YWRfdAl2YV9ieXRlczsJLyogYnl0ZXMgb2YgZGlzayBzcGFjZSBoZWxkIGJ5IGZpbGUgKi8KKwl1X3F1YWRfdAl2YV9maWxlcmV2OwkvKiBmaWxlIG1vZGlmaWNhdGlvbiBudW1iZXIgKi8KK307CisKKyNlbmRpZiAKKworLyogc3RydWN0dXJlIHVzZWQgYnkgQ09EQV9TVEFURlMgZm9yIGdldHRpbmcgY2FjaGUgaW5mb3JtYXRpb24gZnJvbSB2ZW51cyAqLworc3RydWN0IGNvZGFfc3RhdGZzIHsKKyAgICBpbnQzMl90IGZfYmxvY2tzOworICAgIGludDMyX3QgZl9iZnJlZTsKKyAgICBpbnQzMl90IGZfYmF2YWlsOworICAgIGludDMyX3QgZl9maWxlczsKKyAgICBpbnQzMl90IGZfZmZyZWU7Cit9OworCisvKgorICogS2VybmVsIDwtLT4gVmVudXMgY29tbXVuaWNhdGlvbnMuCisgKi8KKworI2RlZmluZSBDT0RBX1JPT1QJMgorI2RlZmluZSBDT0RBX09QRU5fQllfRkQJMworI2RlZmluZSBDT0RBX09QRU4JNAorI2RlZmluZSBDT0RBX0NMT1NFCTUKKyNkZWZpbmUgQ09EQV9JT0NUTAk2CisjZGVmaW5lIENPREFfR0VUQVRUUgk3CisjZGVmaW5lIENPREFfU0VUQVRUUgk4CisjZGVmaW5lIENPREFfQUNDRVNTCTkKKyNkZWZpbmUgQ09EQV9MT09LVVAJMTAKKyNkZWZpbmUgQ09EQV9DUkVBVEUJMTEKKyNkZWZpbmUgQ09EQV9SRU1PVkUJMTIKKyNkZWZpbmUgQ09EQV9MSU5LCTEzCisjZGVmaW5lIENPREFfUkVOQU1FCTE0CisjZGVmaW5lIENPREFfTUtESVIJMTUKKyNkZWZpbmUgQ09EQV9STURJUgkxNgorI2RlZmluZSBDT0RBX1NZTUxJTksJMTgKKyNkZWZpbmUgQ09EQV9SRUFETElOSwkxOQorI2RlZmluZSBDT0RBX0ZTWU5DCTIwCisjZGVmaW5lIENPREFfVkdFVAkyMgorI2RlZmluZSBDT0RBX1NJR05BTAkyMworI2RlZmluZSBDT0RBX1JFUExBQ0UJIDI0IC8qIERPV05DQUxMICovCisjZGVmaW5lIENPREFfRkxVU0ggICAgICAgMjUgLyogRE9XTkNBTEwgKi8KKyNkZWZpbmUgQ09EQV9QVVJHRVVTRVIgICAyNiAvKiBET1dOQ0FMTCAqLworI2RlZmluZSBDT0RBX1pBUEZJTEUgICAgIDI3IC8qIERPV05DQUxMICovCisjZGVmaW5lIENPREFfWkFQRElSICAgICAgMjggLyogRE9XTkNBTEwgKi8KKyNkZWZpbmUgQ09EQV9QVVJHRUZJRCAgICAzMCAvKiBET1dOQ0FMTCAqLworI2RlZmluZSBDT0RBX09QRU5fQllfUEFUSCAzMQorI2RlZmluZSBDT0RBX1JFU09MVkUgICAgIDMyCisjZGVmaW5lIENPREFfUkVJTlRFR1JBVEUgMzMKKyNkZWZpbmUgQ09EQV9TVEFURlMJIDM0CisjZGVmaW5lIENPREFfU1RPUkUJIDM1CisjZGVmaW5lIENPREFfUkVMRUFTRQkgMzYKKyNkZWZpbmUgQ09EQV9OQ0FMTFMgMzcKKworI2RlZmluZSBET1dOQ0FMTChvcGNvZGUpIChvcGNvZGUgPj0gQ09EQV9SRVBMQUNFICYmIG9wY29kZSA8PSBDT0RBX1BVUkdFRklEKQorCisjZGVmaW5lIFZDX01BWERBVEFTSVpFCSAgICA4MTkyCisjZGVmaW5lIFZDX01BWE1TR1NJWkUgICAgICBzaXplb2YodW5pb24gaW5wdXRBcmdzKStzaXplb2YodW5pb24gb3V0cHV0QXJncykgK1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ19NQVhEQVRBU0laRSAgCisKKyNkZWZpbmUgQ0lPQ19LRVJORUxfVkVSU0lPTiBfSU9XUignYycsIDEwLCBzaXplX3QpCisKKyNpZiAwCisjZGVmaW5lIENPREFfS0VSTkVMX1ZFUlNJT04gMCAvKiBkb24ndCBjYXJlIGFib3V0IGtlcm5lbCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBDT0RBX0tFUk5FTF9WRVJTSU9OIDEgLyogVGhlIG9sZCB2ZW51cyA0LjYgY29tcGF0aWJsZSBpbnRlcmZhY2UgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT0RBX0ZTX09MRF9BUEkKKyNkZWZpbmUgQ09EQV9LRVJORUxfVkVSU0lPTiAyIC8qIHZlbnVzX2xvb2t1cCBnb3QgYW4gZXh0cmEgcGFyYW1ldGVyICovCisjZWxzZQorI2RlZmluZSBDT0RBX0tFUk5FTF9WRVJTSU9OIDMgLyogMTI4LWJpdCBmaWxlIGlkZW50aWZpZXJzICovCisjZW5kaWYKKworLyoKKyAqICAgICAgICBWZW51cyA8LT4gQ29kYSAgUlBDIGFyZ3VtZW50cworICovCitzdHJ1Y3QgY29kYV9pbl9oZHIgeworICAgIHVfaW50MzJfdCBvcGNvZGU7CisgICAgdV9pbnQzMl90IHVuaXF1ZTsJICAgIC8qIEtlZXAgbXVsdGlwbGUgb3V0c3RhbmRpbmcgbXNncyBkaXN0aW5jdCAqLworI2lmZGVmIENPTkZJR19DT0RBX0ZTX09MRF9BUEkKKyAgICB1X2ludDE2X3QgcGlkOwkgICAgLyogQ29tbW9uIHRvIGFsbCAqLworICAgIHVfaW50MTZfdCBwZ2lkOwkgICAgLyogQ29tbW9uIHRvIGFsbCAqLworICAgIHVfaW50MTZfdCBzaWQ7ICAgICAgICAgIC8qIENvbW1vbiB0byBhbGwgKi8KKyAgICBzdHJ1Y3QgY29kYV9jcmVkIGNyZWQ7ICAvKiBDb21tb24gdG8gYWxsICovCisjZWxzZQorICAgIHBpZF90IHBpZDsKKyAgICBwaWRfdCBwZ2lkOworICAgIHZ1aWRfdCB1aWQ7CisjZW5kaWYKK307CisKKy8qIFJlYWxseSBpbXBvcnRhbnQgdGhhdCBvcGNvZGUgYW5kIHVuaXF1ZSBhcmUgMXN0IHR3byBmaWVsZHMhICovCitzdHJ1Y3QgY29kYV9vdXRfaGRyIHsKKyAgICB1X2ludDMyX3Qgb3Bjb2RlOworICAgIHVfaW50MzJfdCB1bmlxdWU7CQorICAgIHVfaW50MzJfdCByZXN1bHQ7Cit9OworCisvKiBjb2RhX3Jvb3Q6IE5PX0lOICovCitzdHJ1Y3QgY29kYV9yb290X291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworfTsKKworc3RydWN0IGNvZGFfcm9vdF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGluOworfTsKKworLyogY29kYV9vcGVuOiAqLworc3RydWN0IGNvZGFfb3Blbl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfb3Blbl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgY2Rldl90CWRldjsKKyAgICBpbm9fdAlpbm9kZTsKK307CisKKworLyogY29kYV9zdG9yZTogKi8KK3N0cnVjdCBjb2RhX3N0b3JlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9zdG9yZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9yZWxlYXNlOiAqLworc3RydWN0IGNvZGFfcmVsZWFzZV9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfcmVsZWFzZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9jbG9zZTogKi8KK3N0cnVjdCBjb2RhX2Nsb3NlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9jbG9zZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9pb2N0bDogKi8KK3N0cnVjdCBjb2RhX2lvY3RsX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJY21kOworICAgIGludAlsZW47CisgICAgaW50CXJ3ZmxhZzsKKyAgICBjaGFyICpkYXRhOwkJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKK3N0cnVjdCBjb2RhX2lvY3RsX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBpbnQJbGVuOworICAgIGNhZGRyX3QJZGF0YTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKKworLyogY29kYV9nZXRhdHRyOiAqLworc3RydWN0IGNvZGFfZ2V0YXR0cl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9nZXRhdHRyX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworfTsKKworCisvKiBjb2RhX3NldGF0dHI6IE5PX09VVCAqLworc3RydWN0IGNvZGFfc2V0YXR0cl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKK307CisKK3N0cnVjdCBjb2RhX3NldGF0dHJfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG91dDsKK307CisKKy8qIGNvZGFfYWNjZXNzOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX2FjY2Vzc19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CWZsYWdzOworfTsKKworc3RydWN0IGNvZGFfYWNjZXNzX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvdXQ7Cit9OworCisKKy8qIGxvb2t1cCBmbGFncyAqLworI2RlZmluZSBDTFVfQ0FTRV9TRU5TSVRJVkUgICAgIDB4MDEKKyNkZWZpbmUgQ0xVX0NBU0VfSU5TRU5TSVRJVkUgICAweDAyCisKKy8qIGNvZGFfbG9va3VwOiAqLworc3RydWN0ICBjb2RhX2xvb2t1cF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50ICAgICAgICAgbmFtZTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KKyAgICBpbnQgICAgICAgICBmbGFnczsJCit9OworCitzdHJ1Y3QgY29kYV9sb29rdXBfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50CXZ0eXBlOworfTsKKworCisvKiBjb2RhX2NyZWF0ZTogKi8KK3N0cnVjdCBjb2RhX2NyZWF0ZV9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKKyAgICBpbnQgZXhjbDsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgCW5hbWU7CQkvKiBQbGFjZSBob2xkZXIgZm9yIGRhdGEuICovCit9OworCitzdHJ1Y3QgY29kYV9jcmVhdGVfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKK307CisKKworLyogY29kYV9yZW1vdmU6IE5PX09VVCAqLworc3RydWN0IGNvZGFfcmVtb3ZlX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQgbmFtZTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKK3N0cnVjdCBjb2RhX3JlbW92ZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9saW5rOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX2xpbmtfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBzb3VyY2VGaWQ7CS8qIGNub2RlIHRvIGxpbmsgKnRvKiAqLworICAgIHN0cnVjdCBDb2RhRmlkIGRlc3RGaWQ7CS8qIERpcmVjdG9yeSBpbiB3aGljaCB0byBwbGFjZSBsaW5rICovCisgICAgaW50IHRuYW1lOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworc3RydWN0IGNvZGFfbGlua19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworCisvKiBjb2RhX3JlbmFtZTogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9yZW5hbWVfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBzb3VyY2VGaWQ7CisgICAgaW50IAlzcmNuYW1lOworICAgIHN0cnVjdCBDb2RhRmlkIGRlc3RGaWQ7CisgICAgaW50IAlkZXN0bmFtZTsKK307CisKK3N0cnVjdCBjb2RhX3JlbmFtZV9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9ta2RpcjogKi8KK3N0cnVjdCBjb2RhX21rZGlyX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworICAgIGludAkgICBuYW1lOwkJLyogUGxhY2UgaG9sZGVyIGZvciBkYXRhLiAqLworfTsKKworc3RydWN0IGNvZGFfbWtkaXJfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgc3RydWN0IGNvZGFfdmF0dHIgYXR0cjsKK307CisKKworLyogY29kYV9ybWRpcjogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9ybWRpcl9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7CisgICAgaW50IG5hbWU7CQkvKiBQbGFjZSBob2xkZXIgZm9yIGRhdGEuICovCit9OworCitzdHJ1Y3QgY29kYV9ybWRpcl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV9zeW1saW5rOiBOT19PVVQgKi8KK3N0cnVjdCBjb2RhX3N5bWxpbmtfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOwkvKiBEaXJlY3RvcnkgdG8gcHV0IHN5bWxpbmsgaW4gKi8KKyAgICBpbnQgc3JjbmFtZTsKKyAgICBzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworICAgIGludCB0bmFtZTsKK307CisKK3N0cnVjdCBjb2RhX3N5bWxpbmtfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG91dDsKK307CisKKy8qIGNvZGFfcmVhZGxpbms6ICovCitzdHJ1Y3QgY29kYV9yZWFkbGlua19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9yZWFkbGlua19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgaW50CWNvdW50OworICAgIGNhZGRyX3QJZGF0YTsJCS8qIFBsYWNlIGhvbGRlciBmb3IgZGF0YS4gKi8KK307CisKKworLyogY29kYV9mc3luYzogTk9fT1VUICovCitzdHJ1Y3QgY29kYV9mc3luY19pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV9mc3luY19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb3V0OworfTsKKworLyogY29kYV92Z2V0OiAqLworc3RydWN0IGNvZGFfdmdldF9pbiB7CisgICAgc3RydWN0IGNvZGFfaW5faGRyIGloOworICAgIHN0cnVjdCBDb2RhRmlkIFZGaWQ7Cit9OworCitzdHJ1Y3QgY29kYV92Z2V0X291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludAl2dHlwZTsKK307CisKKworLyogQ09EQV9TSUdOQUwgaXMgb3V0LW9mLWJhbmQsIGRvZXNuJ3QgbmVlZCBkYXRhLiAqLworLyogQ09EQV9JTlZBTElEQVRFIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisvKiBDT0RBX0ZMVVNIIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisKKy8qIGNvZGFfcHVyZ2V1c2VyOiAqLworLyogQ09EQV9QVVJHRVVTRVIgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KK3N0cnVjdCBjb2RhX3B1cmdldXNlcl9vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorICAgIHN0cnVjdCBjb2RhX2NyZWQgY3JlZDsKKyNlbHNlCisgICAgdnVpZF90IHVpZDsKKyNlbmRpZgorfTsKKworLyogY29kYV96YXBmaWxlOiAqLworLyogQ09EQV9aQVBGSUxFIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCitzdHJ1Y3QgY29kYV96YXBmaWxlX291dCB7ICAKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIENvZGFGaWQ7Cit9OworCisvKiBjb2RhX3phcGRpcjogKi8KKy8qIENPREFfWkFQRElSIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCQorc3RydWN0IGNvZGFfemFwZGlyX291dCB7CSAgCisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBDb2RhRmlkOworfTsKKworLyogY29kYV9wdXJnZWZpZDogKi8KKy8qIENPREFfUFVSR0VGSUQgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8JCitzdHJ1Y3QgY29kYV9wdXJnZWZpZF9vdXQgeyAKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworICAgIHN0cnVjdCBDb2RhRmlkIENvZGFGaWQ7Cit9OworCisvKiBjb2RhX3JlcGxhY2U6ICovCisvKiBDT0RBX1JFUExBQ0UgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8JCitzdHJ1Y3QgY29kYV9yZXBsYWNlX291dCB7IC8qIGNvZGFfcmVwbGFjZSBpcyBhIHZlbnVzLT5rZXJuZWwgY2FsbCAqLworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IENvZGFGaWQgTmV3RmlkOworICAgIHN0cnVjdCBDb2RhRmlkIE9sZEZpZDsKK307CisKKy8qIGNvZGFfb3Blbl9ieV9mZDogKi8KK3N0cnVjdCBjb2RhX29wZW5fYnlfZmRfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsKKyAgICBzdHJ1Y3QgQ29kYUZpZCBWRmlkOworICAgIGludCAgICAgICAgZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX291dCB7CisgICAgc3RydWN0IGNvZGFfb3V0X2hkciBvaDsKKyAgICBpbnQgZmQ7CisKK307CisKKy8qIGNvZGFfb3Blbl9ieV9wYXRoOiAqLworc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX2luIHsKKyAgICBzdHJ1Y3QgY29kYV9pbl9oZHIgaWg7CisgICAgc3RydWN0IENvZGFGaWQgVkZpZDsKKyAgICBpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgY29kYV9vcGVuX2J5X3BhdGhfb3V0IHsKKyAgICBzdHJ1Y3QgY29kYV9vdXRfaGRyIG9oOworCWludCBwYXRoOworfTsKKworLyogY29kYV9zdGF0ZnM6IE5PX0lOICovCitzdHJ1Y3QgY29kYV9zdGF0ZnNfaW4geworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpbjsKK307CisKK3N0cnVjdCBjb2RhX3N0YXRmc19vdXQgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CisgICAgc3RydWN0IGNvZGFfc3RhdGZzIHN0YXQ7Cit9OworCisvKiAKKyAqIE9jY2FzaW9uYWxseSwgd2UgZG9uJ3QgY2FjaGUgdGhlIGZpZCByZXR1cm5lZCBieSBDT0RBX0xPT0tVUC4gCisgKiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBmaWQgaXMgaW5jb25zaXN0ZW50LiAKKyAqIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGJ5IHNldHRpbmcgdGhlIHRvcCBiaXQgb2YgdGhlIHR5cGUgcmVzdWx0IHBhcmFtZXRlci4KKyAqLworI2RlZmluZSBDT0RBX05PQ0FDSEUgICAgICAgICAgMHg4MDAwMDAwMAorCit1bmlvbiBpbnB1dEFyZ3MgeworICAgIHN0cnVjdCBjb2RhX2luX2hkciBpaDsJCS8qIE5COiBldmVyeSBzdHJ1Y3QgYmVsb3cgYmVnaW5zIHdpdGggYW4gaWggKi8KKyAgICBzdHJ1Y3QgY29kYV9vcGVuX2luIGNvZGFfb3BlbjsKKyAgICBzdHJ1Y3QgY29kYV9zdG9yZV9pbiBjb2RhX3N0b3JlOworICAgIHN0cnVjdCBjb2RhX3JlbGVhc2VfaW4gY29kYV9yZWxlYXNlOworICAgIHN0cnVjdCBjb2RhX2Nsb3NlX2luIGNvZGFfY2xvc2U7CisgICAgc3RydWN0IGNvZGFfaW9jdGxfaW4gY29kYV9pb2N0bDsKKyAgICBzdHJ1Y3QgY29kYV9nZXRhdHRyX2luIGNvZGFfZ2V0YXR0cjsKKyAgICBzdHJ1Y3QgY29kYV9zZXRhdHRyX2luIGNvZGFfc2V0YXR0cjsKKyAgICBzdHJ1Y3QgY29kYV9hY2Nlc3NfaW4gY29kYV9hY2Nlc3M7CisgICAgc3RydWN0IGNvZGFfbG9va3VwX2luIGNvZGFfbG9va3VwOworICAgIHN0cnVjdCBjb2RhX2NyZWF0ZV9pbiBjb2RhX2NyZWF0ZTsKKyAgICBzdHJ1Y3QgY29kYV9yZW1vdmVfaW4gY29kYV9yZW1vdmU7CisgICAgc3RydWN0IGNvZGFfbGlua19pbiBjb2RhX2xpbms7CisgICAgc3RydWN0IGNvZGFfcmVuYW1lX2luIGNvZGFfcmVuYW1lOworICAgIHN0cnVjdCBjb2RhX21rZGlyX2luIGNvZGFfbWtkaXI7CisgICAgc3RydWN0IGNvZGFfcm1kaXJfaW4gY29kYV9ybWRpcjsKKyAgICBzdHJ1Y3QgY29kYV9zeW1saW5rX2luIGNvZGFfc3ltbGluazsKKyAgICBzdHJ1Y3QgY29kYV9yZWFkbGlua19pbiBjb2RhX3JlYWRsaW5rOworICAgIHN0cnVjdCBjb2RhX2ZzeW5jX2luIGNvZGFfZnN5bmM7CisgICAgc3RydWN0IGNvZGFfdmdldF9pbiBjb2RhX3ZnZXQ7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9mZF9pbiBjb2RhX29wZW5fYnlfZmQ7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX2luIGNvZGFfb3Blbl9ieV9wYXRoOworICAgIHN0cnVjdCBjb2RhX3N0YXRmc19pbiBjb2RhX3N0YXRmczsKK307CisKK3VuaW9uIG91dHB1dEFyZ3MgeworICAgIHN0cnVjdCBjb2RhX291dF9oZHIgb2g7CQkvKiBOQjogZXZlcnkgc3RydWN0IGJlbG93IGJlZ2lucyB3aXRoIGFuIG9oICovCisgICAgc3RydWN0IGNvZGFfcm9vdF9vdXQgY29kYV9yb290OworICAgIHN0cnVjdCBjb2RhX29wZW5fb3V0IGNvZGFfb3BlbjsKKyAgICBzdHJ1Y3QgY29kYV9pb2N0bF9vdXQgY29kYV9pb2N0bDsKKyAgICBzdHJ1Y3QgY29kYV9nZXRhdHRyX291dCBjb2RhX2dldGF0dHI7CisgICAgc3RydWN0IGNvZGFfbG9va3VwX291dCBjb2RhX2xvb2t1cDsKKyAgICBzdHJ1Y3QgY29kYV9jcmVhdGVfb3V0IGNvZGFfY3JlYXRlOworICAgIHN0cnVjdCBjb2RhX21rZGlyX291dCBjb2RhX21rZGlyOworICAgIHN0cnVjdCBjb2RhX3JlYWRsaW5rX291dCBjb2RhX3JlYWRsaW5rOworICAgIHN0cnVjdCBjb2RhX3ZnZXRfb3V0IGNvZGFfdmdldDsKKyAgICBzdHJ1Y3QgY29kYV9wdXJnZXVzZXJfb3V0IGNvZGFfcHVyZ2V1c2VyOworICAgIHN0cnVjdCBjb2RhX3phcGZpbGVfb3V0IGNvZGFfemFwZmlsZTsKKyAgICBzdHJ1Y3QgY29kYV96YXBkaXJfb3V0IGNvZGFfemFwZGlyOworICAgIHN0cnVjdCBjb2RhX3B1cmdlZmlkX291dCBjb2RhX3B1cmdlZmlkOworICAgIHN0cnVjdCBjb2RhX3JlcGxhY2Vfb3V0IGNvZGFfcmVwbGFjZTsKKyAgICBzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX291dCBjb2RhX29wZW5fYnlfZmQ7CisgICAgc3RydWN0IGNvZGFfb3Blbl9ieV9wYXRoX291dCBjb2RhX29wZW5fYnlfcGF0aDsKKyAgICBzdHJ1Y3QgY29kYV9zdGF0ZnNfb3V0IGNvZGFfc3RhdGZzOworfTsgICAgCisKK3VuaW9uIGNvZGFfZG93bmNhbGxzIHsKKyAgICAvKiBDT0RBX0lOVkFMSURBVEUgaXMgYSB2ZW51cy0+a2VybmVsIGNhbGwgKi8KKyAgICAvKiBDT0RBX0ZMVVNIIGlzIGEgdmVudXMtPmtlcm5lbCBjYWxsICovCisgICAgc3RydWN0IGNvZGFfcHVyZ2V1c2VyX291dCBwdXJnZXVzZXI7CisgICAgc3RydWN0IGNvZGFfemFwZmlsZV9vdXQgemFwZmlsZTsKKyAgICBzdHJ1Y3QgY29kYV96YXBkaXJfb3V0IHphcGRpcjsKKyAgICBzdHJ1Y3QgY29kYV9wdXJnZWZpZF9vdXQgcHVyZ2VmaWQ7CisgICAgc3RydWN0IGNvZGFfcmVwbGFjZV9vdXQgcmVwbGFjZTsKK307CisKKworLyoKKyAqIFVzZWQgZm9yIGlkZW50aWZ5aW5nIHVzYWdlIG9mICJDb250cm9sIiBhbmQgcGlvY3RscworICovCisKKyNkZWZpbmUgUElPQ1BBUk1fTUFTSyAweDAwMDBmZmZmCitzdHJ1Y3QgVmljZUlvY3RsIHsKKyAgICAgICAgdm9pZCAqaW47ICAgICAgICAvKiBEYXRhIHRvIGJlIHRyYW5zZmVycmVkIGluICovCisgICAgICAgIHZvaWQgKm91dDsgICAgICAgLyogRGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBvdXQgKi8KKyAgICAgICAgdV9zaG9ydCBpbl9zaXplOyAgICAgICAgLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgPD0gMksgKi8KKyAgICAgICAgdV9zaG9ydCBvdXRfc2l6ZTsgICAgICAgLyogTWF4aW11bSBzaXplIG9mIG91dHB1dCBidWZmZXIsIDw9IDJLICovCit9OworCitzdHJ1Y3QgUGlvY3RsRGF0YSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgICAgIGludCBmb2xsb3c7CisgICAgICAgIHN0cnVjdCBWaWNlSW9jdGwgdmk7Cit9OworCisjZGVmaW5lIENPREFfQ09OVFJPTAkJIi5DT05UUk9MIgorI2RlZmluZSBDT0RBX0NPTlRST0xMRU4JCTgKKyNkZWZpbmUgQ1RMX0lOTwkJCS0xCisKKy8qIERhdGEgcGFzc2VkIHRvIG1vdW50ICovCisKKyNkZWZpbmUgQ09EQV9NT1VOVF9WRVJTSU9OIDEKKworc3RydWN0IGNvZGFfbW91bnRfZGF0YSB7CisJaW50CQl2ZXJzaW9uOworCWludAkJZmQ7ICAgICAgIC8qIE9wZW5lZCBkZXZpY2UgKi8KK307CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZGFfcHNkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmUyMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmgKQEAgLTAsMCArMSw5MiBAQAorI2lmbmRlZiBfX0NPREFfUFNERVZfSAorI2RlZmluZSBfX0NPREFfUFNERVZfSAorCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2RlZmluZSBDT0RBX1BTREVWX01BSk9SIDY3CisjZGVmaW5lIE1BWF9DT0RBREVWUyAgNQkgICAvKiBob3cgbWFueSBkbyB3ZSBhbGxvdyAqLworCitzdHJ1Y3Qga3N0YXRmczsKKworLyogY29tbXVuaWNhdGlvbiBwZW5kaW5nL3Byb2Nlc3NpbmcgcXVldWVzICovCitzdHJ1Y3QgdmVudXNfY29tbSB7CisJdV9sb25nCQkgICAgdmNfc2VxOworCXdhaXRfcXVldWVfaGVhZF90ICAgdmNfd2FpdHE7IC8qIFZlbnVzIHdhaXQgcXVldWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIHZjX3BlbmRpbmc7CisJc3RydWN0IGxpc3RfaGVhZCAgICB2Y19wcm9jZXNzaW5nOworCWludCAgICAgICAgICAgICAgICAgdmNfaW51c2U7CisJc3RydWN0IHN1cGVyX2Jsb2NrICp2Y19zYjsKK307CisKKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHZlbnVzX2NvbW0gKmNvZGFfdmNwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgdmVudXNfY29tbSAqKSgoc2IpLT5zX2ZzX2luZm8pOworfQorCisKKy8qIHVwY2FsbHMgKi8KK2ludCB2ZW51c19yb290ZmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWRwKTsKK2ludCB2ZW51c19nZXRhdHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsCisJCSAgc3RydWN0IGNvZGFfdmF0dHIgKmF0dHIpOworaW50IHZlbnVzX3NldGF0dHIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBDb2RhRmlkICosIHN0cnVjdCBjb2RhX3ZhdHRyICopOworaW50IHZlbnVzX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsIGludCAqdHlwZSwgCisJCSBzdHJ1Y3QgQ29kYUZpZCAqcmVzZmlkKTsKK2ludCB2ZW51c19jbG9zZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCBpbnQgZmxhZ3MsCisJCXZ1aWRfdCB1aWQpOworaW50IHZlbnVzX29wZW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgaW50IGZsYWdzLAorCSAgICAgICBzdHJ1Y3QgZmlsZSAqKmYpOworaW50IHZlbnVzX21rZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpkaXJmaWQsIAorCQljb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCAKKwkJc3RydWN0IENvZGFGaWQgKm5ld2ZpZCwgc3RydWN0IGNvZGFfdmF0dHIgKmF0dHJzKTsKK2ludCB2ZW51c19jcmVhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmRpcmZpZCwgCisJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBpbnQgZXhjbCwgaW50IG1vZGUsCisJCSBzdHJ1Y3QgQ29kYUZpZCAqbmV3ZmlkLCBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cnMpIDsKK2ludCB2ZW51c19ybWRpcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZGlyZmlkLCAKKwkJY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCk7CitpbnQgdmVudXNfcmVtb3ZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpkaXJmaWQsIAorCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCk7CitpbnQgdmVudXNfcmVhZGxpbmsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgCisJCSAgIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW5ndGgpOworaW50IHZlbnVzX3JlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IENvZGFGaWQgKm5ld19maWQsIAorCQkgc3RydWN0IENvZGFGaWQgKm9sZF9maWQsIHNpemVfdCBvbGRfbGVuZ3RoLCAKKwkJIHNpemVfdCBuZXdfbGVuZ3RoLCBjb25zdCBjaGFyICpvbGRfbmFtZSwgCisJCSBjb25zdCBjaGFyICpuZXdfbmFtZSk7CitpbnQgdmVudXNfbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICBzdHJ1Y3QgQ29kYUZpZCAqZGlyZmlkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuICk7CitpbnQgdmVudXNfc3ltbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLAorCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIGNvbnN0IGNoYXIgKnN5bW5hbWUsIGludCBzeW1sZW4pOworaW50IHZlbnVzX2FjY2VzcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCBpbnQgbWFzayk7CitpbnQgdmVudXNfcGlvY3RsKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsCisJCSB1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgUGlvY3RsRGF0YSAqZGF0YSk7CitpbnQgY29kYV9kb3duY2FsbChpbnQgb3Bjb2RlLCB1bmlvbiBvdXRwdXRBcmdzICpvdXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworaW50IHZlbnVzX2ZzeW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQpOworaW50IHZlbnVzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpzZnMpOworCisKKy8qIG1lc3NhZ2VzIGJldHdlZW4gY29kYSBmaWxlc3lzdGVtIGluIGtlcm5lbCBhbmQgVmVudXMgKi8KK3N0cnVjdCB1cGNfcmVxIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIHVjX2NoYWluOworCWNhZGRyX3QJICAgICAgICAgICAgdWNfZGF0YTsKKwl1X3Nob3J0CSAgICAgICAgICAgIHVjX2ZsYWdzOworCXVfc2hvcnQgICAgICAgICAgICAgdWNfaW5TaXplOyAgLyogU2l6ZSBpcyBhdCBtb3N0IDUwMDAgYnl0ZXMgKi8KKwl1X3Nob3J0CSAgICAgICAgICAgIHVjX291dFNpemU7CisJdV9zaG9ydAkgICAgICAgICAgICB1Y19vcGNvZGU7ICAvKiBjb3BpZWQgZnJvbSBkYXRhIHRvIHNhdmUgbG9va3VwICovCisJaW50CQkgICAgdWNfdW5pcXVlOworCXdhaXRfcXVldWVfaGVhZF90ICAgdWNfc2xlZXA7ICAgLyogcHJvY2Vzcycgd2FpdCBxdWV1ZSAqLworfTsKKworI2RlZmluZSBSRVFfQVNZTkMgIDB4MQorI2RlZmluZSBSRVFfUkVBRCAgIDB4MgorI2RlZmluZSBSRVFfV1JJVEUgIDB4NAorI2RlZmluZSBSRVFfQUJPUlQgIDB4OAorCisKKy8qCisgKiBTdGF0aXN0aWNzCisgKi8KKworZXh0ZXJuIHN0cnVjdCB2ZW51c19jb21tIGNvZGFfY29tbXNbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZmYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29mZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTRhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvZmYuaApAQCAtMCwwICsxLDM1MSBAQAorLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgR0FTIDIuMS40IGFzc2VtYmxlciBjb250cm9sIGZpbGUuCisgICBUaGUgR0FTIHByb2R1Y3QgaXMgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgICBBcyBzdWNoLCB0aGlzIGZpbGUgaXMgYWxzbyB1bmRlciB0aGF0IGxpY2Vuc2UuCisKKyAgIElmIHRoZSBmaWxlIGZvcm1hdCBjaGFuZ2VzIGluIHRoZSBDT0ZGIG9iamVjdCwgdGhpcyBmaWxlIHNob3VsZCBiZQorICAgc3Vic2VxdWVudGx5IHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY2hhbmdlcy4KKworICAgVGhlIGFjdHVhbCBsb2FkZXIgbW9kdWxlIG9ubHkgdXNlcyBhIGZldyBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiBUaGUgZnVsbAorICAgc2V0IGlzIGRvY3VtZW50ZWQgaGVyZSBiZWNhdXNlIEkgcmVjZWl2ZWQgdGhlIGZ1bGwgc2V0LiBJZiB5b3Ugd2lzaAorICAgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBDT0ZGLCB0aGVuIE8nUmVpbGx5IGhhcyBhIHZlcnkgZXhjZWxsZW50IGJvb2suCisqLworCisjZGVmaW5lICBFX1NZTU5NTEVOICA4ICAgLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZSAgICAgICAgICovCisjZGVmaW5lICBFX0ZJTE5NTEVOIDE0ICAgLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUgICAgICAgICAgICovCisjZGVmaW5lICBFX0RJTU5VTSAgICA0ICAgLyogTnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCisKKy8qCisgKiBUaGVzZSBkZWZpbmVzIGFyZSBieXRlIG9yZGVyIGluZGVwZW5kZW50LiBUaGVyZSBpcyBubyBhbGlnbm1lbnQgb2YgZmllbGRzCisgKiBwZXJtaXR0ZWQgaW4gdGhlIHN0cnVjdHVyZXMuIFRoZXJlZm9yZSB0aGV5IGFyZSBkZWNsYXJlZCBhcyBjaGFyYWN0ZXJzCisgKiBhbmQgdGhlIHZhbHVlcyBsb2FkZWQgZnJvbSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9ucy4gSXQgYWxzbyBtYWtlcyBpdAorICogbmljZSB0byBoYXZlIGl0ICJlbmRpYW4iIGluZGVwZW5kZW50LgorICovCisgCisvKiBMb2FkIGEgc2hvcnQgaW50IGZyb20gdGhlIGZvbGxvd2luZyB0YWJsZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGZvcm1hdHMgKi8KKyNkZWZpbmUgQ09GRl9TSE9SVF9MKHBzKSAoKHNob3J0KSgoKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgY2hhcilwc1sxXSk8PDgpfFwKKwkJCQkgICgodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKXBzWzBdKSkpKQorCisvKiBMb2FkIGEgbG9uZyBpbnQgZnJvbSB0aGUgZm9sbG93aW5nIHRhYmxlcyB3aXRoIGxpdHRsZS1lbmRpYW4gZm9ybWF0cyAqLworI2RlZmluZSBDT0ZGX0xPTkdfTChwcykgKCgobG9uZykoKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1szXSk8PDI0KSB8XAorCQkJCSAoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzJdKTw8MTYpIHxcCisJCQkJICgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbMV0pPDw4KSAgfFwKKwkJCQkgKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1swXSkpKSkpCisgCisvKiBMb2FkIGEgc2hvcnQgaW50IGZyb20gdGhlIGZvbGxvd2luZyB0YWJsZXMgd2l0aCBiaWctZW5kaWFuIGZvcm1hdHMgKi8KKyNkZWZpbmUgQ09GRl9TSE9SVF9IKHBzKSAoKHNob3J0KSgoKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgY2hhcilwc1swXSk8PDgpfFwKKwkJCQkgICgodW5zaWduZWQgc2hvcnQpKCh1bnNpZ25lZCBjaGFyKXBzWzFdKSkpKQorCisvKiBMb2FkIGEgbG9uZyBpbnQgZnJvbSB0aGUgZm9sbG93aW5nIHRhYmxlcyB3aXRoIGJpZy1lbmRpYW4gZm9ybWF0cyAqLworI2RlZmluZSBDT0ZGX0xPTkdfSChwcykgKCgobG9uZykoKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1swXSk8PDI0KSB8XAorCQkJCSAoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBjaGFyKXBzWzFdKTw8MTYpIHxcCisJCQkJICgodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGNoYXIpcHNbMl0pPDw4KSAgfFwKKwkJCQkgKCh1bnNpZ25lZCBsb25nKSgodW5zaWduZWQgY2hhcilwc1szXSkpKSkpCisKKy8qIFRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyIGJ5IGJyYWluIGRlYWQgaW1wbGVtZW50YXRpb25zIHdoaWNoIGdlbmVyYXRlCisgICBhIGJpZy1lbmRpYW4gaGVhZGVyIHdpdGggbGl0dGxlLWVuZGlhbiBkYXRhLiBJbiB0aGF0IGNhc2UsIGdlbmVyYXRlIGEKKyAgIHJlcGxhY2VtZW50IG1hY3JvIHdoaWNoIHRlc3RzIGEgZmxhZyBhbmQgdXNlcyBlaXRoZXIgb2YgdGhlIHR3byBhYm92ZQorICAgYXMgYXBwcm9wcmlhdGUuICovCisKKyNkZWZpbmUgQ09GRl9MT05HKHYpICAgQ09GRl9MT05HX0wodikKKyNkZWZpbmUgQ09GRl9TSE9SVCh2KSAgQ09GRl9TSE9SVF9MKHYpCisKKy8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSW50ZWwgMzg2LzQ4Ni4gICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBDT0ZGX2ZpbGVoZHIgeworCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KKwljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KKwljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCisJY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KKwljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KKwljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KK307CisKKy8qCisgKiAgIEJpdHMgZm9yIGZfZmxhZ3M6CisgKgorICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgIChpLmUuIG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwKKyAqCQkJcmVmZXJlbmNlcykKKyAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQorICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKKyAqCUZfTUlOTUFMCXRoaXMgaXMgYSBtaW5pbWFsIG9iamVjdCBmaWxlICgiLm0iKSBvdXRwdXQgb2YgZmV4dHJhY3QKKyAqCUZfVVBEQVRFCXRoaXMgaXMgYSBmdWxseSBib3VuZCB1cGRhdGUgZmlsZSwgb3V0cHV0IG9mIG9nZW4KKyAqCUZfU1dBQkQJCXRoaXMgZmlsZSBoYXMgaGFkIGl0cyBieXRlcyBzd2FiYmVkIChpbiBuYW1lcykKKyAqCUZfQVIxNldSCXRoaXMgZmlsZSBoYXMgdGhlIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIxNldSCisgKgkJCShlLmcuIDExLzcwKSBtYWNoaW5lCisgKglGX0FSMzJXUgl0aGlzIGZpbGUgaGFzIHRoZSBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lCisgKgkJCShlLmcuIHZheCBhbmQgaU5URUwgMzg2KQorICoJRl9BUjMyVwkJdGhpcyBmaWxlIGhhcyB0aGUgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyVyBtYWNoaW5lCisgKgkJCShlLmcuIDNiLG1heGkpCisgKglGX1BBVENICQlmaWxlIGNvbnRhaW5zICJwYXRjaCIgbGlzdCBpbiBvcHRpb25hbCBoZWFkZXIKKyAqCUZfTk9ERgkJKG1pbmltYWwgZmlsZSBvbmx5KSBubyBkZWNpc2lvbiBmdW5jdGlvbnMgZm9yCisgKgkJCXJlcGxhY2VkIGZ1bmN0aW9ucworICovCisKKyNkZWZpbmUgIENPRkZfRl9SRUxGTEcJCTAwMDAwMDEKKyNkZWZpbmUgIENPRkZfRl9FWEVDCQkwMDAwMDAyCisjZGVmaW5lICBDT0ZGX0ZfTE5OTwkJMDAwMDAwNAorI2RlZmluZSAgQ09GRl9GX0xTWU1TCQkwMDAwMDEwCisjZGVmaW5lICBDT0ZGX0ZfTUlOTUFMCQkwMDAwMDIwCisjZGVmaW5lICBDT0ZGX0ZfVVBEQVRFCQkwMDAwMDQwCisjZGVmaW5lICBDT0ZGX0ZfU1dBQkQJCTAwMDAxMDAKKyNkZWZpbmUgIENPRkZfRl9BUjE2V1IJCTAwMDAyMDAKKyNkZWZpbmUgIENPRkZfRl9BUjMyV1IJCTAwMDA0MDAKKyNkZWZpbmUgIENPRkZfRl9BUjMyVwkJMDAwMTAwMAorI2RlZmluZSAgQ09GRl9GX1BBVENICQkwMDAyMDAwCisjZGVmaW5lICBDT0ZGX0ZfTk9ERgkJMDAwMjAwMAorCisjZGVmaW5lCUNPRkZfSTM4Nk1BR0lDCSAgICAgICAgMHgxNGMgICAvKiBMaW51eCdzIHN5c3RlbSAgICAqLworCisjaWYgMCAgIC8qIFBlcmhhcHMsIHNvbWVkYXksIHRoZXNlIGZvcm1hdHMgbWF5IGJlIHVzZWQuICAgICAgKi8KKyNkZWZpbmUgQ09GRl9JMzg2UFRYTUFHSUMJMHgxNTQKKyNkZWZpbmUgQ09GRl9JMzg2QUlYTUFHSUMJMHgxNzUgICAvKiBJQk0ncyBBSVggc3lzdGVtICAqLworI2RlZmluZSBDT0ZGX0kzODZCQURNQUcoeCkgKChDT0ZGX1NIT1JUKCh4KS5mX21hZ2ljKSAhPSBDT0ZGX0kzODZNQUdJQykgXAorCQkJICAmJiBDT0ZGX1NIT1JUKCh4KS5mX21hZ2ljKSAhPSBDT0ZGX0kzODZQVFhNQUdJQyBcCisJCQkgICYmIENPRkZfU0hPUlQoKHgpLmZfbWFnaWMpICE9IENPRkZfSTM4NkFJWE1BR0lDKQorI2Vsc2UKKyNkZWZpbmUgQ09GRl9JMzg2QkFETUFHKHgpIChDT0ZGX1NIT1JUKCh4KS5mX21hZ2ljKSAhPSBDT0ZGX0kzODZNQUdJQykKKyNlbmRpZgorCisjZGVmaW5lCUNPRkZfRklMSERSCXN0cnVjdCBDT0ZGX2ZpbGVoZHIKKyNkZWZpbmUJQ09GRl9GSUxIU1oJc2l6ZW9mKENPRkZfRklMSERSKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExpbnV4IENPRkYgbXVzdCBoYXZlIHRoaXMgIm9wdGlvbmFsIiBoZWFkZXIuIFN0YW5kYXJkIENPRkYgaGFzIG5vIGVudHJ5CisgICBsb2NhdGlvbiBmb3IgdGhlICJlbnRyeSIgcG9pbnQuIFRoZXkgbm9ybWFsbHkgd291bGQgc3RhcnQgd2l0aCB0aGUgZmlyc3QKKyAgIGxvY2F0aW9uIG9mIHRoZSAudGV4dCBzZWN0aW9uLiBUaGlzIGlzIG5vdCBhIGdvb2QgaWRlYSBmb3IgbGludXguIFNvLAorICAgdGhlIHVzZSBvZiB0aGlzICJvcHRpb25hbCIgaGVhZGVyIGlzIG5vdCBvcHRpb25hbC4gSXQgaXMgcmVxdWlyZWQuCisKKyAgIERvIG5vdCBiZSB0ZW1wdGVkIHRvIGFzc3VtZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBvcHRpb25hbCBoZWFkZXIgaXMKKyAgIGEgY29uc3RhbnQgYW5kIHNpbXBseSBpbmRleCB0aGUgbmV4dCBieXRlIGJ5IHRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlLgorICAgVXNlIHRoZSAnZl9vcHRoZHInIGZpZWxkIGluIHRoZSBtYWluIGNvZmYgaGVhZGVyIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAgIHN0cnVjdHVyZSBhY3R1YWxseSB3cml0dGVuIHRvIHRoZSBmaWxlISEKKyovCisKK3R5cGVkZWYgc3RydWN0IAoreworICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkgKi8KKyAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJICovCisgIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5ICovCisgIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCAgIGRhdGEgIiAgICIJCSAqLworICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkgKi8KKyAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkgKi8KKyAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgICAgICAgKi8KKyAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgICAgICAgKi8KK30KK0NPRkZfQU9VVEhEUjsKKworI2RlZmluZSBDT0ZGX0FPVVRTWiAoc2l6ZW9mKENPRkZfQU9VVEhEUikpCisKKyNkZWZpbmUgQ09GRl9TVE1BR0lDCTA0MDEKKyNkZWZpbmUgQ09GRl9PTUFHSUMgICAgIDA0MDQKKyNkZWZpbmUgQ09GRl9KTUFHSUMgICAgIDA0MDcgICAgLyogZGlydHkgdGV4dCBhbmQgZGF0YSBpbWFnZSwgY2FuJ3Qgc2hhcmUgICovCisjZGVmaW5lIENPRkZfRE1BR0lDICAgICAwNDEwICAgIC8qIGRpcnR5IHRleHQgc2VnbWVudCwgZGF0YSBhbGlnbmVkICAgICAgICAqLworI2RlZmluZSBDT0ZGX1pNQUdJQyAgICAgMDQxMyAgICAvKiBUaGUgcHJvcGVyIG1hZ2ljIG51bWJlciBmb3IgZXhlY3V0YWJsZXMgICovCisjZGVmaW5lIENPRkZfU0hNQUdJQwkwNDQzCS8qIHNoYXJlZCBsaWJyYXJ5IGhlYWRlciAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgQ09GRl9zY25oZHIgeworICBjaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSAgICAqLworICBjaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLworICBjaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSAgICAqLworICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSAgICAqLworICBjaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KKyAgY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JICAgICovCisgIGNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSAgICAqLworICBjaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkgICAgKi8KKyAgY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMgICAgKi8KKyAgY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkgICAgKi8KK307CisKKyNkZWZpbmUJQ09GRl9TQ05IRFIJc3RydWN0IENPRkZfc2NuaGRyCisjZGVmaW5lCUNPRkZfU0NOSFNaCXNpemVvZihDT0ZGX1NDTkhEUikKKworLyoKKyAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucworICovCisKKyNkZWZpbmUgQ09GRl9URVhUCSIudGV4dCIKKyNkZWZpbmUgQ09GRl9EQVRBCSIuZGF0YSIKKyNkZWZpbmUgQ09GRl9CU1MJIi5ic3MiCisjZGVmaW5lIENPRkZfQ09NTUVOVCAgICAiLmNvbW1lbnQiCisjZGVmaW5lIENPRkZfTElCICAgICAgICAiLmxpYiIKKworI2RlZmluZSBDT0ZGX1NFQ1RfVEVYVCAgMCAgICAgIC8qIFNlY3Rpb24gZm9yIGluc3RydWN0aW9uIGNvZGUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TRUNUX0RBVEEgIDEgICAgICAvKiBTZWN0aW9uIGZvciBpbml0aWFsaXplZCBnbG9iYWxzICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU0VDVF9CU1MgICAyICAgICAgLyogU2VjdGlvbiBmb3IgdW4taW5pdGlhbGl6ZWQgZ2xvYmFscyAgICAgICAqLworI2RlZmluZSBDT0ZGX1NFQ1RfUkVRRCAgMyAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIHNlY3Rpb25zIGZvciBnb29kIGZpbGUgKi8KKworI2RlZmluZSBDT0ZGX1NUWVBfUkVHICAgICAweDAwIC8qIHJlZ3VsYXIgc2VnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0RTRUNUICAgMHgwMSAvKiBkdW1teSBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9OT0xPQUQgIDB4MDIgLyogbm8tbG9hZCBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfR1JPVVAgICAweDA0IC8qIGdyb3VwIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX1BBRCAgICAgMHgwOCAvKiAucGFkIHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9DT1BZICAgIDB4MTAgLyogY29weSBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfVEVYVCAgICAweDIwIC8qIC50ZXh0IHNlZ21lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX0RBVEEgICAgMHg0MCAvKiAuZGF0YSBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9CU1MgICAgIDB4ODAgLyogLmJzcyBzZWdtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT0ZGX1NUWVBfSU5GTyAgIDB4MjAwIC8qIC5jb21tZW50IHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ09GRl9TVFlQX09WRVIgICAweDQwMCAvKiBvdmVybGF5IHNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENPRkZfU1RZUF9MSUIgICAgMHg4MDAgLyogbGlicmFyeSBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKgorICogU2hhcmVkIGxpYnJhcmllcyBoYXZlIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBoZWFkZXIgaW4gdGhlIGRhdGEgZmllbGQgZm9yCisgKiBlYWNoIGxpYnJhcnkuCisgKi8KKworc3RydWN0IENPRkZfc2xpYiB7CisgIGNoYXIJCXNsX2VudHN6WzRdOwkvKiBTaXplIG9mIHRoaXMgZW50cnkgICAgICAgICAgICAgICAqLworICBjaGFyCQlzbF9wYXRobmR4WzRdOwkvKiBzaXplIG9mIHRoZSBoZWFkZXIgZmllbGQgICAgICAgICAqLworfTsKKworI2RlZmluZQlDT0ZGX1NMSUJIRAlzdHJ1Y3QgQ09GRl9zbGliCisjZGVmaW5lCUNPRkZfU0xJQlNaCXNpemVvZihDT0ZGX1NMSUJIRCkKKworLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgorICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCisgKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQorICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgorICovCisKK3N0cnVjdCBDT0ZGX2xpbmVubyB7CisgIHVuaW9uIHsKKyAgICBjaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KKyAgICBjaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLworICB9IGxfYWRkcjsKKyAgY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLworfTsKKworI2RlZmluZQlDT0ZGX0xJTkVOTwlzdHJ1Y3QgQ09GRl9saW5lbm8KKyNkZWZpbmUJQ09GRl9MSU5FU1oJNgorCisvKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ09GRl9FX1NZTU5NTEVOCSA4CS8qICMgY2hhcmFjdGVycyBpbiBhIHNob3J0IHN5bWJvbCBuYW1lCSovCisjZGVmaW5lIENPRkZfRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCisjZGVmaW5lIENPRkZfRV9ESU1OVU0JIDQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLworCisvKgorICogIEFsbCBzeW1ib2xzIGFuZCBzZWN0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbgorICovCisKK3N0cnVjdCBDT0ZGX3N5bWVudCAKK3sKKyAgdW5pb24geworICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOyAgICAvKiBTeW1ib2wgbmFtZSAoZmlyc3QgOCBjaGFyYWN0ZXJzKSAqLworICAgIHN0cnVjdCB7CisgICAgICBjaGFyIGVfemVyb2VzWzRdOyAgICAgICAgIC8qIExlYWRpbmcgemVyb3MgKi8KKyAgICAgIGNoYXIgZV9vZmZzZXRbNF07ICAgICAgICAgLyogT2Zmc2V0IGlmIHRoaXMgaXMgYSBoZWFkZXIgc2VjdGlvbiAqLworICAgIH0gZTsKKyAgfSBlOworCisgIGNoYXIgZV92YWx1ZVs0XTsgICAgICAgICAgICAgIC8qIFZhbHVlIChhZGRyZXNzKSBvZiB0aGUgc2VnbWVudCAqLworICBjaGFyIGVfc2NudW1bMl07ICAgICAgICAgICAgICAvKiBTZWN0aW9uIG51bWJlciAqLworICBjaGFyIGVfdHlwZVsyXTsgICAgICAgICAgICAgICAvKiBUeXBlIG9mIHNlY3Rpb24gKi8KKyAgY2hhciBlX3NjbGFzc1sxXTsgICAgICAgICAgICAgLyogTG9hZGVyIGNsYXNzICovCisgIGNoYXIgZV9udW1hdXhbMV07ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyB3aGljaCBmb2xsb3cgKi8KK307CisKKyNkZWZpbmUgQ09GRl9OX0JUTUFTSwkoMHhmKSAgIC8qIE1hc2sgZm9yIGltcG9ydGFudCBjbGFzcyBiaXRzICovCisjZGVmaW5lIENPRkZfTl9UTUFTSwkoMHgzMCkgIC8qIE1hc2sgZm9yIGltcG9ydGFudCB0eXBlIGJpdHMgICovCisjZGVmaW5lIENPRkZfTl9CVFNIRlQJKDQpICAgICAvKiAjIGJpdHMgdG8gc2hpZnQgY2xhc3MgZmllbGQgICAqLworI2RlZmluZSBDT0ZGX05fVFNISUZUCSgyKSAgICAgLyogIyBiaXRzIHRvIHNoaWZ0IHR5cGUgZmllbGQgICAgKi8KKworLyoKKyAqICBBdXhpbGlhcnkgZW50cmllcyBiZWNhdXNlIHRoZSBtYWluIHRhYmxlIGlzIHRvbyBsaW1pdGluZy4KKyAqLworICAKK3VuaW9uIENPRkZfYXV4ZW50IHsKKworLyoKKyAqICBEZWJ1Z2dlciBpbmZvcm1hdGlvbgorICovCisKKyAgc3RydWN0IHsKKyAgICBjaGFyIHhfdGFnbmR4WzRdOwkgICAgICAgIC8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KKyAgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgeworCWNoYXIgIHhfbG5ub1syXTsgICAgICAgIC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCisJY2hhciAgeF9zaXplWzJdOyAgICAgICAgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KKyAgICAgIH0geF9sbnN6OworICAgICAgY2hhciB4X2ZzaXplWzRdOwkgICAgICAgIC8qIHNpemUgb2YgZnVuY3Rpb24gKi8KKyAgICB9IHhfbWlzYzsKKworICAgIHVuaW9uIHsKKyAgICAgIHN0cnVjdCB7CQkgICAgICAgIC8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLworCWNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLworCWNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLworICAgICAgfSB4X2ZjbjsKKworICAgICAgc3RydWN0IHsJCSAgICAgICAgLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCisJY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKKyAgICAgIH0geF9hcnk7CisgICAgfSB4X2ZjbmFyeTsKKworICAgIGNoYXIgeF90dm5keFsyXTsJLyogdHYgaW5kZXggKi8KKyAgfSB4X3N5bTsKKworLyoKKyAqICAgU291cmNlIGZpbGUgbmFtZXMgKGRlYnVnZ2VyIGluZm9ybWF0aW9uKQorICovCisKKyAgdW5pb24geworICAgIGNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKKyAgICBzdHJ1Y3QgeworICAgICAgY2hhciB4X3plcm9lc1s0XTsKKyAgICAgIGNoYXIgeF9vZmZzZXRbNF07CisgICAgfSB4X247CisgIH0geF9maWxlOworCisvKgorICogICBTZWN0aW9uIGluZm9ybWF0aW9uCisgKi8KKworICBzdHJ1Y3QgeworICAgIGNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCisgICAgY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KKyAgICBjaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLworICB9IHhfc2NuOworCisvKgorICogICBUcmFuc2ZlciB2ZWN0b3IgKGJyYW5jaCB0YWJsZSkKKyAqLworICAKKyAgc3RydWN0IHsKKyAgICBjaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCisgICAgY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCisgICAgY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLworICB9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCit9OworCisjZGVmaW5lCUNPRkZfU1lNRU5UCXN0cnVjdCBDT0ZGX3N5bWVudAorI2RlZmluZQlDT0ZGX1NZTUVTWgkxOAkKKyNkZWZpbmUJQ09GRl9BVVhFTlQJdW5pb24gQ09GRl9hdXhlbnQKKyNkZWZpbmUJQ09GRl9BVVhFU1oJMTgKKworI2RlZmluZSBDT0ZGX0VURVhUCSJldGV4dCIKKworLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBDT0ZGX3JlbG9jIHsKKyAgY2hhciByX3ZhZGRyWzRdOyAgICAgICAgLyogVmlydHVhbCBhZGRyZXNzIG9mIGl0ZW0gICAgKi8KKyAgY2hhciByX3N5bW5keFs0XTsgICAgICAgLyogU3ltYm9sIGluZGV4IGluIHRoZSBzeW10YWIgKi8KKyAgY2hhciByX3R5cGVbMl07ICAgICAgICAgLyogUmVsb2NhdGlvbiB0eXBlICAgICAgICAgICAgKi8KK307CisKKyNkZWZpbmUgQ09GRl9SRUxPQyBzdHJ1Y3QgQ09GRl9yZWxvYworI2RlZmluZSBDT0ZGX1JFTFNaIDEwCisKKyNkZWZpbmUgQ09GRl9ERUZfREFUQV9TRUNUSU9OX0FMSUdOTUVOVCAgNAorI2RlZmluZSBDT0ZGX0RFRl9CU1NfU0VDVElPTl9BTElHTk1FTlQgICA0CisjZGVmaW5lIENPRkZfREVGX1RFWFRfU0VDVElPTl9BTElHTk1FTlQgIDQKKworLyogRm9yIG5ldyBzZWN0aW9ucyB3ZSBoYXZlbid0IGhlYXJkIG9mIGJlZm9yZSAqLworI2RlZmluZSBDT0ZGX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCAgICAgICA0CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvbXN0YXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvbXN0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ZWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29tc3RhdHMuaApAQCAtMCwwICsxLDExOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJY29tc3RhdHMuaCAgLS0gU2VyaWFsIFBvcnQgU3RhdHMuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggIFN0YWxsaW9uIFRlY2hub2xvZ2llcworICoJQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIEdyZWcgVW5nZXJlci4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCV9DT01TVEFUU19ICisjZGVmaW5lCV9DT01TVEFUU19ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTZXJpYWwgcG9ydCBzdGF0cyBzdHJ1Y3R1cmUuIFRoZSBzdHJ1Y3R1cmUgaXRzZWxmIGlzIFVBUlQKKyAqCWluZGVwZW5kZW50LCBidXQgc29tZSBmaWVsZHMgbWF5IGJlIFVBUlQvZHJpdmVyIHNwZWNpZmljIChmb3IKKyAqCWV4YW1wbGUgc3RhdGUpLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCWJyZDsKKwl1bnNpZ25lZCBsb25nCXBhbmVsOworCXVuc2lnbmVkIGxvbmcJcG9ydDsKKwl1bnNpZ25lZCBsb25nCWh3aWQ7CisJdW5zaWduZWQgbG9uZwl0eXBlOworCXVuc2lnbmVkIGxvbmcJdHh0b3RhbDsKKwl1bnNpZ25lZCBsb25nCXJ4dG90YWw7CisJdW5zaWduZWQgbG9uZwl0eGJ1ZmZlcmVkOworCXVuc2lnbmVkIGxvbmcJcnhidWZmZXJlZDsKKwl1bnNpZ25lZCBsb25nCXJ4b3ZlcnJ1bjsKKwl1bnNpZ25lZCBsb25nCXJ4cGFyaXR5OworCXVuc2lnbmVkIGxvbmcJcnhmcmFtaW5nOworCXVuc2lnbmVkIGxvbmcJcnhsb3N0OworCXVuc2lnbmVkIGxvbmcJdHhicmVha3M7CisJdW5zaWduZWQgbG9uZwlyeGJyZWFrczsKKwl1bnNpZ25lZCBsb25nCXR4eG9uOworCXVuc2lnbmVkIGxvbmcJdHh4b2ZmOworCXVuc2lnbmVkIGxvbmcJcnh4b247CisJdW5zaWduZWQgbG9uZwlyeHhvZmY7CisJdW5zaWduZWQgbG9uZwl0eGN0c29uOworCXVuc2lnbmVkIGxvbmcJdHhjdHNvZmY7CisJdW5zaWduZWQgbG9uZwlyeHJ0c29uOworCXVuc2lnbmVkIGxvbmcJcnhydHNvZmY7CisJdW5zaWduZWQgbG9uZwltb2RlbTsKKwl1bnNpZ25lZCBsb25nCXN0YXRlOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgbG9uZwl0dHlzdGF0ZTsKKwl1bnNpZ25lZCBsb25nCWNmbGFnczsKKwl1bnNpZ25lZCBsb25nCWlmbGFnczsKKwl1bnNpZ25lZCBsb25nCW9mbGFnczsKKwl1bnNpZ25lZCBsb25nCWxmbGFnczsKKwl1bnNpZ25lZCBsb25nCXNpZ25hbHM7Cit9IGNvbXN0YXRzX3Q7CisKKworLyoKKyAqCUJvYXJkIHN0YXRzIHN0cnVjdHVyZS4gUmV0dXJucyB1c2VmdWwgaW5mbyBhYm91dCB0aGUgYm9hcmQuCisgKi8KKworI2RlZmluZQlDT01fTUFYUEFORUxTCTgKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJcGFuZWw7CisJdW5zaWduZWQgbG9uZwl0eXBlOworCXVuc2lnbmVkIGxvbmcJaHdpZDsKKwl1bnNpZ25lZCBsb25nCW5ycG9ydHM7Cit9IGNvbXBhbmVsX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCWJyZDsKKwl1bnNpZ25lZCBsb25nCXR5cGU7CisJdW5zaWduZWQgbG9uZwlod2lkOworCXVuc2lnbmVkIGxvbmcJc3RhdGU7CisJdW5zaWduZWQgbG9uZwlpb2FkZHI7CisJdW5zaWduZWQgbG9uZwlpb2FkZHIyOworCXVuc2lnbmVkIGxvbmcJbWVtYWRkcjsKKwl1bnNpZ25lZCBsb25nCWlycTsKKwl1bnNpZ25lZCBsb25nCW5ycGFuZWxzOworCXVuc2lnbmVkIGxvbmcJbnJwb3J0czsKKwljb21wYW5lbF90CXBhbmVsc1tDT01fTUFYUEFORUxTXTsKK30gY29tYnJkX3Q7CisKKworLyoKKyAqCURlZmluZSB0aGUgaW9jdGwgb3BlcmF0aW9ucyBmb3Igc3RhdHMgc3R1ZmYuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lCUNPTV9HRVRQT1JUU1RBVFMJX0lPKCdjJywzMCkKKyNkZWZpbmUJQ09NX0NMUlBPUlRTVEFUUwlfSU8oJ2MnLDMxKQorI2RlZmluZQlDT01fR0VUQlJEU1RBVFMJCV9JTygnYycsMzIpCisKKworLyoKKyAqCURlZmluZSB0aGUgc2V0IG9mIGlvY3RscyB0aGF0IGdpdmUgdXNlciBsZXZlbCBhY2Nlc3MgdG8gdGhlCisgKglwcml2YXRlIHBvcnQsIHBhbmVsIGFuZCBib2FyZCBzdHJ1Y3R1cmVzLiBUaGUgYXJndW1lbnQgcmVxdWlyZWQKKyAqCXdpbGwgYmUgZHJpdmVyIGRlcGVuZGVudCEgIAorICovCisjZGVmaW5lCUNPTV9SRUFEUE9SVAkJX0lPKCdjJyw0MCkKKyNkZWZpbmUJQ09NX1JFQURCT0FSRAkJX0lPKCdjJyw0MSkKKyNkZWZpbmUJQ09NX1JFQURQQU5FTAkJX0lPKCdjJyw0MikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNjZmQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogCWNvbm5lY3Rvci5oCisgKiAKKyAqIDIwMDQtMjAwNSBDb3B5cmlnaHQgKGMpIEV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTk5FQ1RPUl9ICisjZGVmaW5lIF9fQ09OTkVDVE9SX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjZGVmaW5lIENOX0lEWF9DT05ORUNUT1IJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgQ05fVkFMX0NPTk5FQ1RPUgkJMHhmZmZmZmZmZgorCisvKgorICogUHJvY2VzcyBFdmVudHMgY29ubmVjdG9yIHVuaXF1ZSBpZHMgLS0gdXNlZCBmb3IgbWVzc2FnZSByb3V0aW5nCisgKi8KKyNkZWZpbmUgQ05fSURYX1BST0MJCQkweDEKKyNkZWZpbmUgQ05fVkFMX1BST0MJCQkweDEKKyNkZWZpbmUgQ05fSURYX0NJRlMJCQkweDIKKyNkZWZpbmUgQ05fVkFMX0NJRlMgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ05fVzFfSURYCQkJMHgzCS8qIHcxIGNvbW11bmljYXRpb24gKi8KKyNkZWZpbmUgQ05fVzFfVkFMCQkJMHgxCisjZGVmaW5lIENOX0lEWF9WODZECQkJMHg0CisjZGVmaW5lIENOX1ZBTF9WODZEX1VWRVNBRkIJCTB4MQorCisjZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTUKKworLyoKKyAqIE1heGltdW0gY29ubmVjdG9yJ3MgbWVzc2FnZSBzaXplLgorICovCisjZGVmaW5lIENPTk5FQ1RPUl9NQVhfTVNHX1NJWkUJCTE2Mzg0CisKKy8qCisgKiBpZHggYW5kIHZhbCBhcmUgdW5pcXVlIGlkZW50aWZpZXJzIHdoaWNoIAorICogYXJlIHVzZWQgZm9yIG1lc3NhZ2Ugcm91dGluZyBhbmQgCisgKiBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gY29ubmVjdG9yLmggZm9yIGluLWtlcm5lbCB1c2FnZS4KKyAqLworCitzdHJ1Y3QgY2JfaWQgeworCV9fdTMyIGlkeDsKKwlfX3UzMiB2YWw7Cit9OworCitzdHJ1Y3QgY25fbXNnIHsKKwlzdHJ1Y3QgY2JfaWQgaWQ7CisKKwlfX3UzMiBzZXE7CisJX191MzIgYWNrOworCisJX191MTYgbGVuOwkJLyogTGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcgZGF0YSAqLworCV9fdTE2IGZsYWdzOworCV9fdTggZGF0YVswXTsKK307CisKKy8qCisgKiBOb3RpZnkgc3RydWN0dXJlIC0gcmVxdWVzdHMgbm90aWZpY2F0aW9uIGFib3V0CisgKiByZWdpc3RlcmluZy91bnJlZ2lzdGVyaW5nIGlkeC92YWwgaW4gcmFuZ2UgW2ZpcnN0LCBmaXJzdCtyYW5nZV0uCisgKi8KK3N0cnVjdCBjbl9ub3RpZnlfcmVxIHsKKwlfX3UzMiBmaXJzdDsKKwlfX3UzMiByYW5nZTsKK307CisKKy8qCisgKiBNYWluIG5vdGlmaWNhdGlvbiBjb250cm9sIG1lc3NhZ2UKKyAqICpfbm90aWZ5X251bSAJLSBudW1iZXIgb2YgYXBwcm9wcmlhdGUgY25fbm90aWZ5X3JlcSBzdHJ1Y3R1cmVzIGFmdGVyIAorICoJCQkJdGhpcyBzdHJ1Y3QuCisgKiBncm91cCAJCS0gbm90aWZpY2F0aW9uIHJlY2VpdmVyJ3MgaWR4LgorICogbGVuIAkJCS0gdG90YWwgbGVuZ3RoIG9mIHRoZSBhdHRhY2hlZCBkYXRhLgorICovCitzdHJ1Y3QgY25fY3RsX21zZyB7CisJX191MzIgaWR4X25vdGlmeV9udW07CisJX191MzIgdmFsX25vdGlmeV9udW07CisJX191MzIgZ3JvdXA7CisJX191MzIgbGVuOworCV9fdTggZGF0YVswXTsKK307CisKKyNlbmRpZgkJCQkvKiBfX0NPTk5FQ1RPUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvbnN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiMzAwYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY29uc3QuaApAQCAtMCwwICsxLDE5IEBACisvKiBjb25zdC5oOiBNYWNyb3MgZm9yIGRlYWxpbmcgd2l0aCBjb25zdGFudHMuICAqLworCisjaWZuZGVmIF9MSU5VWF9DT05TVF9ICisjZGVmaW5lIF9MSU5VWF9DT05TVF9ICisKKy8qIFNvbWUgY29uc3RhbnQgbWFjcm9zIGFyZSB1c2VkIGluIGJvdGggYXNzZW1ibGVyIGFuZAorICogQyBjb2RlLiAgVGhlcmVmb3JlIHdlIGNhbm5vdCBhbm5vdGF0ZSB0aGVtIGFsd2F5cyB3aXRoCisgKiAnVUwnIGFuZCBvdGhlciB0eXBlIHNwZWNpZmllcnMgdW5pbGF0ZXJhbGx5LiAgV2UKKyAqIHVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBkZWFsIHdpdGggdGhpcy4KKyAqLworCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lIF9BQyhYLFkpCVgKKyNlbHNlCisjZGVmaW5lIF9fQUMoWCxZKQkoWCMjWSkKKyNkZWZpbmUgX0FDKFgsWSkJX19BQyhYLFkpCisjZW5kaWYKKworI2VuZGlmIC8qICEoX0xJTlVYX0NPTlNUX0gpICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2NyYW1mc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jcmFtZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmU0ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jcmFtZnNfZnMuaApAQCAtMCwwICsxLDkzIEBACisjaWZuZGVmIF9fQ1JBTUZTX0gKKyNkZWZpbmUgX19DUkFNRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBDUkFNRlNfTUFHSUMJCTB4MjhjZDNkNDUJLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIENSQU1GU19NQUdJQ19XRU5ECTB4NDUzZGNkMjgJLyogbWFnaWMgbnVtYmVyIHdpdGggdGhlIHdyb25nIGVuZGlhbmVzcyAqLworI2RlZmluZSBDUkFNRlNfU0lHTkFUVVJFCSJDb21wcmVzc2VkIFJPTUZTIgorCisvKgorICogV2lkdGggb2YgdmFyaW91cyBiaXRmaWVsZHMgaW4gc3RydWN0IGNyYW1mc19pbm9kZS4KKyAqIFByaW1hcmlseSB1c2VkIHRvIGdlbmVyYXRlIHdhcm5pbmdzIGluIG1rY3JhbWZzLgorICovCisjZGVmaW5lIENSQU1GU19NT0RFX1dJRFRIIDE2CisjZGVmaW5lIENSQU1GU19VSURfV0lEVEggMTYKKyNkZWZpbmUgQ1JBTUZTX1NJWkVfV0lEVEggMjQKKyNkZWZpbmUgQ1JBTUZTX0dJRF9XSURUSCA4CisjZGVmaW5lIENSQU1GU19OQU1FTEVOX1dJRFRIIDYKKyNkZWZpbmUgQ1JBTUZTX09GRlNFVF9XSURUSCAyNgorCisvKgorICogU2luY2UgaW5vZGUubmFtZWxlbiBpcyBhIHVuc2lnbmVkIDYtYml0IG51bWJlciwgdGhlIG1heGltdW0gY3JhbWZzCisgKiBwYXRoIGxlbmd0aCBpcyA2MyA8PCAyID0gMjUyLgorICovCisjZGVmaW5lIENSQU1GU19NQVhQQVRITEVOICgoKDEgPDwgQ1JBTUZTX05BTUVMRU5fV0lEVEgpIC0gMSkgPDwgMikKKworLyoKKyAqIFJlYXNvbmFibHkgdGVyc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlub2RlIGRhdGEuCisgKi8KK3N0cnVjdCBjcmFtZnNfaW5vZGUgeworCV9fdTMyIG1vZGU6Q1JBTUZTX01PREVfV0lEVEgsIHVpZDpDUkFNRlNfVUlEX1dJRFRIOworCS8qIFNJWkUgZm9yIGRldmljZSBmaWxlcyBpcyBpX3JkZXYgKi8KKwlfX3UzMiBzaXplOkNSQU1GU19TSVpFX1dJRFRILCBnaWQ6Q1JBTUZTX0dJRF9XSURUSDsKKwkvKiBOQU1FTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgbmFtZSwgZGl2aWRlZCBieSA0IGFuZAorICAgICAgICAgICByb3VuZGVkIHVwLiAgKGNyYW1mcyBkb2Vzbid0IHN1cHBvcnQgaGFyZCBsaW5rcy4pICovCisJLyogT0ZGU0VUOiBGb3Igc3ltbGlua3MgYW5kIG5vbi1lbXB0eSByZWd1bGFyIGZpbGVzLCB0aGlzCisJICAgY29udGFpbnMgdGhlIG9mZnNldCAoZGl2aWRlZCBieSA0KSBvZiB0aGUgZmlsZSBkYXRhIGluCisJICAgY29tcHJlc3NlZCBmb3JtIChzdGFydGluZyB3aXRoIGFuIGFycmF5IG9mIGJsb2NrIHBvaW50ZXJzOworCSAgIHNlZSBSRUFETUUpLiAgRm9yIG5vbi1lbXB0eSBkaXJlY3RvcmllcyBpdCBpcyB0aGUgb2Zmc2V0CisJICAgKGRpdmlkZWQgYnkgNCkgb2YgdGhlIGlub2RlIG9mIHRoZSBmaXJzdCBmaWxlIGluIHRoYXQKKwkgICBkaXJlY3RvcnkuICBGb3IgYW55dGhpbmcgZWxzZSwgb2Zmc2V0IGlzIHplcm8uICovCisJX191MzIgbmFtZWxlbjpDUkFNRlNfTkFNRUxFTl9XSURUSCwgb2Zmc2V0OkNSQU1GU19PRkZTRVRfV0lEVEg7Cit9OworCitzdHJ1Y3QgY3JhbWZzX2luZm8geworCV9fdTMyIGNyYzsKKwlfX3UzMiBlZGl0aW9uOworCV9fdTMyIGJsb2NrczsKKwlfX3UzMiBmaWxlczsKK307CisKKy8qCisgKiBTdXBlcmJsb2NrIGluZm9ybWF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIEZTLgorICovCitzdHJ1Y3QgY3JhbWZzX3N1cGVyIHsKKwlfX3UzMiBtYWdpYzsJCQkvKiAweDI4Y2QzZDQ1IC0gcmFuZG9tIG51bWJlciAqLworCV9fdTMyIHNpemU7CQkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJX191MzIgZmxhZ3M7CQkJLyogZmVhdHVyZSBmbGFncyAqLworCV9fdTMyIGZ1dHVyZTsJCQkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCV9fdTggc2lnbmF0dXJlWzE2XTsJCS8qICJDb21wcmVzc2VkIFJPTUZTIiAqLworCXN0cnVjdCBjcmFtZnNfaW5mbyBmc2lkOwkvKiB1bmlxdWUgZmlsZXN5c3RlbSBpbmZvICovCisJX191OCBuYW1lWzE2XTsJCQkvKiB1c2VyLWRlZmluZWQgbmFtZSAqLworCXN0cnVjdCBjcmFtZnNfaW5vZGUgcm9vdDsJLyogcm9vdCBpbm9kZSBkYXRhICovCit9OworCisvKgorICogRmVhdHVyZSBmbGFncworICoKKyAqIDB4MDAwMDAwMDAgLSAweDAwMDAwMGZmOiBmZWF0dXJlcyB0aGF0IHdvcmsgZm9yIGFsbCBwYXN0IGtlcm5lbHMKKyAqIDB4MDAwMDAxMDAgLSAweGZmZmZmZmZmOiBmZWF0dXJlcyB0aGF0IGRvbid0IHdvcmsgZm9yIHBhc3Qga2VybmVscworICovCisjZGVmaW5lIENSQU1GU19GTEFHX0ZTSURfVkVSU0lPTl8yCTB4MDAwMDAwMDEJLyogZnNpZCB2ZXJzaW9uICMyICovCisjZGVmaW5lIENSQU1GU19GTEFHX1NPUlRFRF9ESVJTCQkweDAwMDAwMDAyCS8qIHNvcnRlZCBkaXJzICovCisjZGVmaW5lIENSQU1GU19GTEFHX0hPTEVTCQkweDAwMDAwMTAwCS8qIHN1cHBvcnQgZm9yIGhvbGVzICovCisjZGVmaW5lIENSQU1GU19GTEFHX1dST05HX1NJR05BVFVSRQkweDAwMDAwMjAwCS8qIHJlc2VydmVkICovCisjZGVmaW5lIENSQU1GU19GTEFHX1NISUZURURfUk9PVF9PRkZTRVQJMHgwMDAwMDQwMAkvKiBzaGlmdGVkIHJvb3QgZnMgKi8KKworLyoKKyAqIFZhbGlkIHZhbHVlcyBpbiBzdXBlci5mbGFncy4gIEN1cnJlbnRseSB3ZSByZWZ1c2UgdG8gbW91bnQKKyAqIGlmIChmbGFncyAmIH5DUkFNRlNfU1VQUE9SVEVEX0ZMQUdTKS4gIE1heWJlIHRoYXQgc2hvdWxkIGJlCisgKiBjaGFuZ2VkIHRvIHRlc3Qgc3VwZXIuZnV0dXJlIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgQ1JBTUZTX1NVUFBPUlRFRF9GTEFHUwkoIDB4MDAwMDAwZmYgXAorCQkJCXwgQ1JBTUZTX0ZMQUdfSE9MRVMgXAorCQkJCXwgQ1JBTUZTX0ZMQUdfV1JPTkdfU0lHTkFUVVJFIFwKKwkJCQl8IENSQU1GU19GTEFHX1NISUZURURfUk9PVF9PRkZTRVQgKQorCisvKiBVbmNvbXByZXNzaW9uIGludGVyZmFjZXMgdG8gdGhlIHVuZGVybHlpbmcgemxpYiAqLworaW50IGNyYW1mc191bmNvbXByZXNzX2Jsb2NrKHZvaWQgKmRzdCwgaW50IGRzdGxlbiwgdm9pZCAqc3JjLCBpbnQgc3JjbGVuKTsKK2ludCBjcmFtZnNfdW5jb21wcmVzc19pbml0KHZvaWQpOwordm9pZCBjcmFtZnNfdW5jb21wcmVzc19leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3VkYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jdWRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljOGJmMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvY3VkYS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGFsa2luZyB0byB0aGUgQ1VEQS4gIFRoZSBDVURBIGlzIGEgbWljcm9jb250cm9sbGVyCisgKiB3aGljaCBjb250cm9scyB0aGUgQURCLCBzeXN0ZW0gcG93ZXIsIFJUQywgYW5kIHZhcmlvdXMgb3RoZXIgdGhpbmdzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KKyAqLworCisvKiBDVURBIGNvbW1hbmRzICgybmQgYnl0ZSkgKi8KKyNkZWZpbmUgQ1VEQV9XQVJNX1NUQVJUCQkwCisjZGVmaW5lIENVREFfQVVUT1BPTEwJCTEKKyNkZWZpbmUgQ1VEQV9HRVRfNjgwNV9BRERSCTIKKyNkZWZpbmUgQ1VEQV9HRVRfVElNRQkJMworI2RlZmluZSBDVURBX0dFVF9QUkFNCQk3CisjZGVmaW5lIENVREFfU0VUXzY4MDVfQUREUgk4CisjZGVmaW5lIENVREFfU0VUX1RJTUUJCTkKKyNkZWZpbmUgQ1VEQV9QT1dFUkRPV04JCTB4YQorI2RlZmluZSBDVURBX1BPV0VSVVBfVElNRQkweGIKKyNkZWZpbmUgQ1VEQV9TRVRfUFJBTQkJMHhjCisjZGVmaW5lIENVREFfTVNfUkVTRVQJCTB4ZAorI2RlZmluZSBDVURBX1NFTkRfREZBQwkJMHhlCisjZGVmaW5lIENVREFfUkVTRVRfU1lTVEVNCTB4MTEKKyNkZWZpbmUgQ1VEQV9TRVRfSVBMCQkweDEyCisjZGVmaW5lIENVREFfU0VUX0FVVE9fUkFURQkweDE0CisjZGVmaW5lIENVREFfR0VUX0FVVE9fUkFURQkweDE2CisjZGVmaW5lIENVREFfU0VUX0RFVklDRV9MSVNUCTB4MTkKKyNkZWZpbmUgQ1VEQV9HRVRfREVWSUNFX0xJU1QJMHgxYQorI2RlZmluZSBDVURBX0dFVF9TRVRfSUlDCTB4MjIKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjYwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y2xhZGVzLmgKQEAgLTAsMCArMSw1MDggQEAKKy8qICRSZXZpc2lvbjogMy4wICQkRGF0ZTogMTk5OC8xMS8wMiAxNDoyMDo1OSAkCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L2N5Y2xhZGVzLmgKKyAqCisgKiBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSB3cml0dGVuIGJ5CisgKiBSYW5kb2xwaCBCZW50c29uIDxiZW50c29uQGdyaWVnLnNlYXNsdWcub3JnPiBhbmQgaXMgbWFpbnRhaW5lZCBieQorICogSXZhbiBQYXNzb3MgPGl2YW5AY3ljbGFkZXMuY29tPi4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGdlbmVyYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBjeWNsYWRlcy5jIGRyaXZlcgorICokTG9nOiBjeWNsYWRlcy5oLHYgJAorICpSZXZpc2lvbiAzLjEgIDIwMDIvMDEvMjkgMTE6MzY6MTYgIGhlbnJpcXVlCisgKmFkZGVkIHRocm90dGxlIGZpZWxkIG9uIHN0cnVjdCBjeWNsYWRlc19wb3J0IHRvIGluZGljYXRlIHdoZXRoZXIgdGhlCisgKnBvcnQgaXMgdGhyb3R0bGVkIG9yIG5vdAorICoKKyAqUmV2aXNpb24gMy4xICAyMDAwLzA0LzE5IDE4OjUyOjUyICBpdmFuCisgKmNvbnZlcnRlZCBhZGRyZXNzIGZpZWxkcyB0byB1bnNpZ25lZCBsb25nIGFuZCBhZGRlZCBmaWVsZHMgZm9yIHBoeXNpY2FsCisgKmFkZHJlc3NlcyBvbiBjeWNsYWRlc19jYXJkIHN0cnVjdHVyZTsKKyAqCisgKlJldmlzaW9uIDMuMCAgMTk5OC8xMS8wMiAxNDoyMDo1OSAgaXZhbgorICphZGRlZCBucG9ydHMgZmllbGQgb24gY3ljbGFkZXNfY2FyZCBzdHJ1Y3R1cmU7CisgKgorICpSZXZpc2lvbiAyLjUgIDE5OTgvMDgvMDMgMTY6NTc6MDEgIGl2YW4KKyAqYWRkZWQgY3ljbGFkZXNfaWRsZV9zdGF0cyBzdHJ1Y3R1cmU7CisgKiAKKyAqUmV2aXNpb24gMi40ICAxOTk4LzA2LzAxIDEyOjA5OjUzICBpdmFuCisgKnJlbW92ZWQgY2xvc2luZ193YWl0MiBmcm9tIGN5Y2xhZGVzX3BvcnQgc3RydWN0dXJlOworICoKKyAqUmV2aXNpb24gMi4zICAxOTk4LzAzLzE2IDE4OjAxOjEyICBpdmFuCisgKmNoYW5nZXMgaW4gdGhlIGN5Y2xhZGVzX3BvcnQgc3RydWN0dXJlIHRvIGdldCBpdCBjbG9zZXIgdG8gdGhlIAorICpzdGFuZGFyZCBzZXJpYWwgcG9ydCBzdHJ1Y3R1cmU7CisgKmFkZGVkIGNvbnN0YW50cyBmb3IgbmV3IGlvY3RsczsKKyAqCisgKlJldmlzaW9uIDIuMiAgMTk5OC8wMi8xNyAxNjo1MDowMCAgaXZhbgorICpjaGFuZ2VzIGluIHRoZSBjeWNsYWRlc19wb3J0IHN0cnVjdHVyZSAoYWRkaXRpb24gb2Ygc2h1dGRvd25fd2FpdCBhbmQgCisgKmNoaXBfcmV2IHZhcmlhYmxlcyk7CisgKmFkZGVkIGNvbnN0YW50cyBmb3IgbmV3IGlvY3RscyBhbmQgZm9yIENEMTQwMCByZXYuIG51bWJlcnMuCisgKgorICpSZXZpc2lvbiAyLjEJMTk5Ny8xMC8yNCAxNjowMzowMCAgaXZhbgorICphZGRlZCByZmxvdyAod2hpY2ggYWxsb3dzIGVuYWJsaW5nIHRoZSBDRDE0MDAgc3BlY2lhbCBmbG93IGNvbnRyb2wgCisgKmZlYXR1cmUpIGFuZCBydHNkdHJfaW52ICh3aGljaCBhbGxvd3MgRFRSL1JUUyBwaW4gaW52ZXJzaW9uKSB0byAKKyAqY3ljbGFkZXNfcG9ydCBzdHJ1Y3R1cmU7CisgKmFkZGVkIEFscGhhIHN1cHBvcnQKKyAqCisgKlJldmlzaW9uIDIuMCAgMTk5Ny8wNi8zMCAxMDozMDowMCAgaXZhbgorICphZGRlZCBzb21lIG5ldyBkb29yYmVsbCBjb21tYW5kIGNvbnN0YW50cyByZWxhdGVkIHRvIElPQ1RMVyBhbmQKKyAqVUFSVCBlcnJvciBzaWduYWxpbmcKKyAqCisgKlJldmlzaW9uIDEuOCAgMTk5Ny8wNi8wMyAxNTozMDowMCAgaXZhbgorICphZGRlZCBjb25zdGFudCBaRklSTV9ITFQKKyAqYWRkZWQgY29uc3RhbnQgQ3lQQ0lfWmVfd2luICggPSAyICogQ3lfUENJX1p3aW4pCisgKgorICpSZXZpc2lvbiAxLjcgIDE5OTcvMDMvMjYgMTA6MzA6MDAgIGRhbmllbAorICpuZXcgZW50cmllcyBhdCB0aGUgZW5kIG9mIGN5Y2xhZGVzX3BvcnQgc3RydWN0IHRvIHJlYWxsb2NhdGUKKyAqdmFyaWFibGVzIGlsbGVnYWxseSBhbGxvY2F0ZWQgd2l0aGluIGNhcmQgbWVtb3J5LgorICoKKyAqUmV2aXNpb24gMS42ICAxOTk2LzA5LzA5IDE4OjM1OjMwICBiZW50c29uCisgKmZvbGQgaW4gY2hhbmdlcyBmb3IgQ3ljbG9tLVogLS0gaW5jbHVkaW5nIHN0cnVjdHVyZXMgZm9yCisgKmNvbW11bmljYXRpbmcgd2l0aCBib2FyZCBhcyB3ZWxsIG1vZGVzdCBjaGFuZ2VzIHRvIG9yaWdpbmFsCisgKnN0cnVjdHVyZXMgdG8gc3VwcG9ydCBuZXcgZmVhdHVyZXMuCisgKgorICpSZXZpc2lvbiAxLjUgIDE5OTUvMTEvMTMgMjE6MTM6MzEgIGJlbnRzb24KKyAqY2hhbmdlcyBzdWdnZXN0ZWQgYnkgTWljaGFlbCBDaGFzdGFpbiA8bWVjQGR1cmFjZWYuc2hvdXQubmV0PgorICp0byBzdXBwb3J0IHVzZSBvZiB0aGlzIGZpbGUgaW4gbm9uLWtlcm5lbCBhcHBsaWNhdGlvbnMKKyAqCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0NZQ0xBREVTX0gKKyNkZWZpbmUgX0xJTlVYX0NZQ0xBREVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBjeWNsYWRlc19tb25pdG9yIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgaW50X2NvdW50OworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBjaGFyX2NvdW50OworICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBjaGFyX21heDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2hhcl9sYXN0OworfTsKKworLyoKKyAqIFRoZXNlIHN0YXRzIGFsbCByZWZsZWN0IGFjdGl2aXR5IHNpbmNlIHRoZSBkZXZpY2Ugd2FzIGxhc3QgaW5pdGlhbGl6ZWQuCisgKiAoaS5lLiwgc2luY2UgdGhlIHBvcnQgd2FzIG9wZW5lZCB3aXRoIG5vIG90aGVyIHByb2Nlc3NlcyBhbHJlYWR5IGhhdmluZyBpdAorICogb3BlbikKKyAqLworc3RydWN0IGN5Y2xhZGVzX2lkbGVfc3RhdHMgeworICAgIHRpbWVfdAkgICBpbl91c2U7CS8qIFRpbWUgZGV2aWNlIGhhcyBiZWVuIGluIHVzZSAoc2VjcykgKi8KKyAgICB0aW1lX3QJICAgcmVjdl9pZGxlOwkvKiBUaW1lIHNpbmNlIGxhc3QgY2hhciByZWNlaXZlZCAoc2VjcykgKi8KKyAgICB0aW1lX3QJICAgeG1pdF9pZGxlOwkvKiBUaW1lIHNpbmNlIGxhc3QgY2hhciB0cmFuc21pdHRlZCAoc2VjcykgKi8KKyAgICB1bnNpZ25lZCBsb25nICByZWN2X2J5dGVzOwkvKiBCeXRlcyByZWNlaXZlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgIHhtaXRfYnl0ZXM7CS8qIEJ5dGVzIHRyYW5zbWl0dGVkICovCisgICAgdW5zaWduZWQgbG9uZyAgb3ZlcnJ1bnM7CS8qIElucHV0IG92ZXJydW5zICovCisgICAgdW5zaWduZWQgbG9uZyAgZnJhbWVfZXJyczsJLyogSW5wdXQgZnJhbWluZyBlcnJvcnMgKi8KKyAgICB1bnNpZ25lZCBsb25nICBwYXJpdHlfZXJyczsJLyogSW5wdXQgcGFyaXR5IGVycm9ycyAqLworfTsKKworI2RlZmluZSBDWUNMQURFU19NQUdJQyAgMHg0MzU5CisKKyNkZWZpbmUgQ1lHRVRNT04gICAgICAgICAgICAgICAgMHg0MzU5MDEKKyNkZWZpbmUgQ1lHRVRUSFJFU0ggICAgICAgICAgICAgMHg0MzU5MDIKKyNkZWZpbmUgQ1lTRVRUSFJFU0ggICAgICAgICAgICAgMHg0MzU5MDMKKyNkZWZpbmUgQ1lHRVRERUZUSFJFU0ggICAgICAgICAgMHg0MzU5MDQKKyNkZWZpbmUgQ1lTRVRERUZUSFJFU0ggICAgICAgICAgMHg0MzU5MDUKKyNkZWZpbmUgQ1lHRVRUSU1FT1VUICAgICAgICAgICAgMHg0MzU5MDYKKyNkZWZpbmUgQ1lTRVRUSU1FT1VUICAgICAgICAgICAgMHg0MzU5MDcKKyNkZWZpbmUgQ1lHRVRERUZUSU1FT1VUICAgICAgICAgMHg0MzU5MDgKKyNkZWZpbmUgQ1lTRVRERUZUSU1FT1VUICAgICAgICAgMHg0MzU5MDkKKyNkZWZpbmUgQ1lTRVRSRkxPVwkJMHg0MzU5MGEKKyNkZWZpbmUgQ1lHRVRSRkxPVwkJMHg0MzU5MGIKKyNkZWZpbmUgQ1lTRVRSVFNEVFJfSU5WCQkweDQzNTkwYworI2RlZmluZSBDWUdFVFJUU0RUUl9JTlYJCTB4NDM1OTBkCisjZGVmaW5lIENZWlNFVFBPTExDWUNMRQkJMHg0MzU5MGUKKyNkZWZpbmUgQ1laR0VUUE9MTENZQ0xFCQkweDQzNTkwZgorI2RlZmluZSBDWUdFVENEMTQwMFZFUgkJMHg0MzU5MTAKKyNkZWZpbmUJQ1lTRVRXQUlUCQkweDQzNTkxMgorI2RlZmluZQlDWUdFVFdBSVQJCTB4NDM1OTEzCisKKy8qKioqKioqKioqKioqKiogQ1lDTE9NLVogQURESVRJT05TICoqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDWklPQyAgICAgICAgICAgKCdNJyA8PCA4KQorI2RlZmluZSBDWl9OQk9BUkRTICAgICAgKENaSU9DfDB4ZmEpCisjZGVmaW5lIENaX0JPT1RfU1RBUlQgICAoQ1pJT0N8MHhmYikKKyNkZWZpbmUgQ1pfQk9PVF9EQVRBICAgIChDWklPQ3wweGZjKQorI2RlZmluZSBDWl9CT09UX0VORCAgICAgKENaSU9DfDB4ZmQpCisjZGVmaW5lIENaX1RFU1QgICAgICAgICAoQ1pJT0N8MHhmZSkKKworI2RlZmluZSBDWl9ERUZfUE9MTAkoSFovMjUpCisKKyNkZWZpbmUgTUFYX0JPQVJEICAgICAgIDQgICAgICAgLyogTWF4IG51bWJlciBvZiBib2FyZHMgKi8KKyNkZWZpbmUgTUFYX0RFViAgICAgICAgIDI1NiAgICAgLyogTWF4IG51bWJlciBvZiBwb3J0cyB0b3RhbCAqLworI2RlZmluZQlDWVpfTUFYX1NQRUVECTkyMTYwMAorCisjZGVmaW5lCUNZWl9GSUZPX1NJWkUJMTYKKworI2RlZmluZSBDWVpfQk9PVF9OV09SRFMgMHgxMDAKK3N0cnVjdCBDWVpfQk9PVF9DVFJMIHsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIG5ib2FyZDsKKyAgICAgICAgaW50ICAgICAgICAgICAgIHN0YXR1c1tNQVhfQk9BUkRdOworICAgICAgICBpbnQgICAgICAgICAgICAgbmNoYW5uZWxbTUFYX0JPQVJEXTsKKyAgICAgICAgaW50ICAgICAgICAgICAgIGZ3X3JldltNQVhfQk9BUkRdOworICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0OworICAgICAgICB1bnNpZ25lZCBsb25nICAgZGF0YVtDWVpfQk9PVF9OV09SRFNdOworfTsKKworCisjaWZuZGVmIERQX1dJTkRPV19TSVpFCisvKiAjaW5jbHVkZSAiY3ljbG9tei5oIiAqLworLyoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKglUaGUgZGF0YSB0eXBlcyBkZWZpbmVkIGJlbG93IGFyZSB1c2VkIGluIGFsbCBaRklSTSBpbnRlcmZhY2UKKyAqCWRhdGEgc3RydWN0dXJlcy4gVGhleSBhY2NvbW9kYXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gSFcKKyAqCWFyY2hpdGVjdHVyZXMgYW5kIGNvbXBpbGVycy4KKyAqLworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3R5cGVkZWYgX191NjQgIHVjZG91YmxlOwkJLyogNjQgYml0cywgdW5zaWduZWQgKi8KK3R5cGVkZWYgX191MzIgIHVjbG9uZzsJCQkvKiAzMiBiaXRzLCB1bnNpZ25lZCAqLwordHlwZWRlZiBfX3UxNiAgdWNzaG9ydDsJCS8qIDE2IGJpdHMsIHVuc2lnbmVkICovCit0eXBlZGVmIF9fdTggICB1Y2NoYXI7CQkJLyogOCBiaXRzLCB1bnNpZ25lZCAqLworCisvKgorICoJTWVtb3J5IFdpbmRvdyBTaXplcworICovCisKKyNkZWZpbmUJRFBfV0lORE9XX1NJWkUJCSgweDAwMDgwMDAwKQkvKiB3aW5kb3cgc2l6ZSA1MTIgS2IgKi8KKyNkZWZpbmUJWkVfRFBfV0lORE9XX1NJWkUJKDB4MDAxMDAwMDApCS8qIHdpbmRvdyBzaXplIDEgTWIgKFplIGFuZAorCQkJCQkJICA4Wm8gVi4yICovCisjZGVmaW5lCUNUUkxfV0lORE9XX1NJWkUJKDB4MDAwMDAwODApCS8qIHJ1bnRpbWUgcmVncyAxMjggYnl0ZXMgKi8KKworLyoKKyAqCUNVU1RPTV9SRUcgLSBDeWNsb20tWi9QQ0kgQ3VzdG9tIFJlZ2lzdGVycyBTZXQuIFRoZSBkcml2ZXIKKyAqCW5vcm1hbGx5IHdpbGwgYWNjZXNzIG9ubHkgaW50ZXJlc3RlZCBvbiB0aGUgZnBnYV9pZCwgZnBnYV92ZXJzaW9uLAorICoJc3RhcnRfY3B1IGFuZCBzdG9wX2NwdS4KKyAqLworCitzdHJ1Y3QJQ1VTVE9NX1JFRyB7CisJX191MzIJZnBnYV9pZDsJCS8qIEZQR0EgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKwlfX3UzMglmcGdhX3ZlcnNpb247CQkvKiBGUEdBIFZlcnNpb24gTnVtYmVyIFJlZ2lzdGVyICovCisJX191MzIJY3B1X3N0YXJ0OwkJLyogQ1BVIHN0YXJ0IFJlZ2lzdGVyICh3cml0ZSkgKi8KKwlfX3UzMgljcHVfc3RvcDsJCS8qIENQVSBzdG9wIFJlZ2lzdGVyICh3cml0ZSkgKi8KKwlfX3UzMgltaXNjX3JlZzsJCS8qIE1pc2NlbGFuZW91cyBSZWdpc3RlciAqLworCV9fdTMyCWlkdF9tb2RlOwkJLyogSURUIG1vZGUgUmVnaXN0ZXIgKi8KKwlfX3UzMgl1YXJ0X2lycV9zdGF0dXM7CS8qIFVBUlQgSVJRIHN0YXR1cyBSZWdpc3RlciAqLworCV9fdTMyCWNsZWFyX3RpbWVyMF9pcnE7CS8qIENsZWFyIHRpbWVyIGludGVycnVwdCBSZWdpc3RlciAqLworCV9fdTMyCWNsZWFyX3RpbWVyMV9pcnE7CS8qIENsZWFyIHRpbWVyIGludGVycnVwdCBSZWdpc3RlciAqLworCV9fdTMyCWNsZWFyX3RpbWVyMl9pcnE7CS8qIENsZWFyIHRpbWVyIGludGVycnVwdCBSZWdpc3RlciAqLworCV9fdTMyCXRlc3RfcmVnaXN0ZXI7CQkvKiBUZXN0IFJlZ2lzdGVyICovCisJX191MzIJdGVzdF9jb3VudDsJCS8qIFRlc3QgQ291bnQgUmVnaXN0ZXIgKi8KKwlfX3UzMgl0aW1lcl9zZWxlY3Q7CQkvKiBUaW1lciBzZWxlY3QgcmVnaXN0ZXIgKi8KKwlfX3UzMglwcl91YXJ0X2lycV9zdGF0dXM7CS8qIFByaW9yaXRpemVkIFVBUlQgSVJRIHN0YXQgUmVnICovCisJX191MzIJcmFtX3dhaXRfc3RhdGU7CQkvKiBSQU0gd2FpdC1zdGF0ZSBSZWdpc3RlciAqLworCV9fdTMyCXVhcnRfd2FpdF9zdGF0ZTsJLyogVUFSVCB3YWl0LXN0YXRlIFJlZ2lzdGVyICovCisJX191MzIJdGltZXJfd2FpdF9zdGF0ZTsJLyogdGltZXIgd2FpdC1zdGF0ZSBSZWdpc3RlciAqLworCV9fdTMyCWFja193YWl0X3N0YXRlOwkJLyogQUNLIHdhaXQgU3RhdGUgUmVnaXN0ZXIgKi8KK307CisKKy8qCisgKglSVU5USU1FXzkwNjAgLSBQTFggUENJOTA2MEVTIGxvY2FsIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBydW50aW1lCisgKglyZWdpc3RlcnMuIFRoaXMgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgOTA2MCByZWdpc3RlcnMKKyAqCShtZW1vcnkgbWFwcGVkKS4KKyAqLworCitzdHJ1Y3QgUlVOVElNRV85MDYwIHsKKwlfX3UzMglsb2NfYWRkcl9yYW5nZTsJLyogMDBoIC0gTG9jYWwgQWRkcmVzcyBSYW5nZSAqLworCV9fdTMyCWxvY19hZGRyX2Jhc2U7CS8qIDA0aCAtIExvY2FsIEFkZHJlc3MgQmFzZSAqLworCV9fdTMyCWxvY19hcmJpdHI7CS8qIDA4aCAtIExvY2FsIEFyYml0cmF0aW9uICovCisJX191MzIJZW5kaWFuX2Rlc2NyOwkvKiAwQ2ggLSBCaWcvTGl0dGxlIEVuZGlhbiBEZXNjcmlwdG9yICovCisJX191MzIJbG9jX3JvbV9yYW5nZTsJLyogMTBoIC0gTG9jYWwgUk9NIFJhbmdlICovCisJX191MzIJbG9jX3JvbV9iYXNlOwkvKiAxNGggLSBMb2NhbCBST00gQmFzZSAqLworCV9fdTMyCWxvY19idXNfZGVzY3I7CS8qIDE4aCAtIExvY2FsIEJ1cyBkZXNjcmlwdG9yICovCisJX191MzIJbG9jX3JhbmdlX21zdDsJLyogMUNoIC0gTG9jYWwgUmFuZ2UgZm9yIE1hc3RlciB0byBQQ0kgKi8KKwlfX3UzMglsb2NfYmFzZV9tc3Q7CS8qIDIwaCAtIExvY2FsIEJhc2UgZm9yIE1hc3RlciBQQ0kgKi8KKwlfX3UzMglsb2NfcmFuZ2VfaW87CS8qIDI0aCAtIExvY2FsIFJhbmdlIGZvciBNYXN0ZXIgSU8gKi8KKwlfX3UzMglwY2lfYmFzZV9tc3Q7CS8qIDI4aCAtIFBDSSBCYXNlIGZvciBNYXN0ZXIgUENJICovCisJX191MzIJcGNpX2NvbmZfaW87CS8qIDJDaCAtIFBDSSBjb25maWd1cmF0aW9uIGZvciBNYXN0ZXIgSU8gKi8KKwlfX3UzMglmaWxsZXIxOwkvKiAzMGggKi8KKwlfX3UzMglmaWxsZXIyOwkvKiAzNGggKi8KKwlfX3UzMglmaWxsZXIzOwkvKiAzOGggKi8KKwlfX3UzMglmaWxsZXI0OwkvKiAzQ2ggKi8KKwlfX3UzMgltYWlsX2JveF8wOwkvKiA0MGggLSBNYWlsIEJveCAwICovCisJX191MzIJbWFpbF9ib3hfMTsJLyogNDRoIC0gTWFpbCBCb3ggMSAqLworCV9fdTMyCW1haWxfYm94XzI7CS8qIDQ4aCAtIE1haWwgQm94IDIgKi8KKwlfX3UzMgltYWlsX2JveF8zOwkvKiA0Q2ggLSBNYWlsIEJveCAzICovCisJX191MzIJZmlsbGVyNTsJLyogNTBoICovCisJX191MzIJZmlsbGVyNjsJLyogNTRoICovCisJX191MzIJZmlsbGVyNzsJLyogNThoICovCisJX191MzIJZmlsbGVyODsJLyogNUNoICovCisJX191MzIJcGNpX2Rvb3JiZWxsOwkvKiA2MGggLSBQQ0kgdG8gTG9jYWwgRG9vcmJlbGwgKi8KKwlfX3UzMglsb2NfZG9vcmJlbGw7CS8qIDY0aCAtIExvY2FsIHRvIFBDSSBEb29yYmVsbCAqLworCV9fdTMyCWludHJfY3RybF9zdGF0OwkvKiA2OGggLSBJbnRlcnJ1cHQgQ29udHJvbC9TdGF0dXMgKi8KKwlfX3UzMglpbml0X2N0cmw7CS8qIDZDaCAtIEVFUFJPTSBjb250cm9sLCBJbml0IENvbnRyb2wsIGV0YyAqLworfTsKKworLyogVmFsdWVzIGZvciB0aGUgTG9jYWwgQmFzZSBBZGRyZXNzIHJlLW1hcCByZWdpc3RlciAqLworCisjZGVmaW5lCVdJTl9SQU0JCTB4MDAwMDAwMDFMCS8qIHNldCB0aGUgc2xpZGluZyB3aW5kb3cgdG8gUkFNICovCisjZGVmaW5lCVdJTl9DUkVHCTB4MTQwMDAwMDFMCS8qIHNldCB0aGUgd2luZG93IHRvIGN1c3RvbSBSZWdpc3RlcnMgKi8KKworLyogVmFsdWVzIHRpbWVyIHNlbGVjdCByZWdpc3RlcnMgKi8KKworI2RlZmluZQlUSU1FUl9CWV8xTQkweDAwCQkvKiBjbG9jayBkaXZpZGVkIGJ5IDFNICovCisjZGVmaW5lCVRJTUVSX0JZXzI1NksJMHgwMQkJLyogY2xvY2sgZGl2aWRlZCBieSAyNTZrICovCisjZGVmaW5lCVRJTUVSX0JZXzEyOEsJMHgwMgkJLyogY2xvY2sgZGl2aWRlZCBieSAxMjhrICovCisjZGVmaW5lCVRJTUVSX0JZXzMySwkweDAzCQkvKiBjbG9jayBkaXZpZGVkIGJ5IDMyayAqLworCisvKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyNpZm5kZWYgWkZJUk1fSUQKKy8qICNpbmNsdWRlICJ6ZndpbnQuaCIgKi8KKy8qKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiovCisvKgorICoJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUKKyAqCUN5Y2xvbS1aIFpGSVJNIEZpcm13YXJlLgorICovCisKKy8qIEdlbmVyYWwgQ29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZQlNQVhfQ0hBTgk2NAkJLyogbWF4IG51bWJlciBvZiBjaGFubmVscyBwZXIgYm9hcmQgKi8KKworLyogZmlybXdhcmUgaWQgc3RydWN0dXJlIChzZXQgYWZ0ZXIgYm9vdCkgKi8KKworI2RlZmluZSBJRF9BRERSRVNTCTB4MDAwMDAxODBMCS8qIHNpZ25hdHVyZS9wb2ludGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJWkZJUk1fSUQJMHg1NTU3NDY1QUwJLyogWkZJUk0vVSBzaWduYXR1cmUgKi8KKyNkZWZpbmUJWkZJUk1fSExUCTB4NTk1MDVCNUNMCS8qIFpGSVJNIG5lZWRzIGV4dGVybmFsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZQlaRklSTV9SU1QJMHg1NjA0MDY3NEwJLyogUlNUIHNpZ25hbCAoZHVlIHRvIEZXIHJlc2V0KSAqLworCisjZGVmaW5lCVpGX1RJTkFDVF9ERUYJMTAwMAkJLyogZGVmYXVsdCBpbmFjdGl2aXR5IHRpbWVvdXQgCisJCQkJCSAgICgxMDAwIG1zKSAqLworI2RlZmluZQlaRl9USU5BQ1QJWkZfVElOQUNUX0RFRgorCitzdHJ1Y3QJRklSTV9JRCB7CisJX191MzIJc2lnbmF0dXJlOwkJLyogWkZJUk0vVSBzaWduYXR1cmUgKi8KKwlfX3UzMgl6ZndjdHJsX2FkZHI7CQkvKiBwb2ludGVyIHRvIFpGV19DVFJMIHN0cnVjdHVyZSAqLworfTsKKworLyogT3AuIFN5c3RlbSBpZCAqLworCisjZGVmaW5lCUNfT1NfTElOVVgJMHgwMDAwMDAzMAkvKiBnZW5lcmljIExpbnV4IHN5c3RlbSAqLworCisvKiBjaGFubmVsIG9wX21vZGUgKi8KKworI2RlZmluZQlDX0NIX0RJU0FCTEUJMHgwMDAwMDAwMAkvKiBjaGFubmVsIGlzIGRpc2FibGVkICovCisjZGVmaW5lCUNfQ0hfVFhFTkFCTEUJMHgwMDAwMDAwMQkvKiBjaGFubmVsIFR4IGVuYWJsZWQgKi8KKyNkZWZpbmUJQ19DSF9SWEVOQUJMRQkweDAwMDAwMDAyCS8qIGNoYW5uZWwgUnggZW5hYmxlZCAqLworI2RlZmluZQlDX0NIX0VOQUJMRQkweDAwMDAwMDAzCS8qIGNoYW5uZWwgVHgvUnggZW5hYmxlZCAqLworI2RlZmluZQlDX0NIX0xPT1BCQUNLCTB4MDAwMDAwMDQJLyogTG9vcGJhY2sgbW9kZSAqLworCisvKiBjb21tX3Bhcml0eSAtIHBhcml0eSAqLworCisjZGVmaW5lCUNfUFJfTk9ORQkweDAwMDAwMDAwCS8qIE5vbmUgKi8KKyNkZWZpbmUJQ19QUl9PREQJMHgwMDAwMDAwMQkvKiBPZGQgKi8KKyNkZWZpbmUgQ19QUl9FVkVOCTB4MDAwMDAwMDIJLyogRXZlbiAqLworI2RlZmluZSBDX1BSX01BUksJMHgwMDAwMDAwNAkvKiBNYXJrICovCisjZGVmaW5lIENfUFJfU1BBQ0UJMHgwMDAwMDAwOAkvKiBTcGFjZSAqLworI2RlZmluZSBDX1BSX1BBUklUWQkweDAwMDAwMGZmCisKKyNkZWZpbmUJQ19QUl9ESVNDQVJECTB4MDAwMDAxMDAJLyogZGlzY2FyZCBjaGFyIHdpdGggZnJhbWUvcGFyIGVycm9yICovCisjZGVmaW5lIENfUFJfSUdOT1JFCTB4MDAwMDAyMDAJLyogaWdub3JlIGZyYW1lL3BhciBlcnJvciAqLworCisvKiBjb21tX2RhdGFfbCAtIGRhdGEgbGVuZ3RoIGFuZCBzdG9wIGJpdHMgKi8KKworI2RlZmluZSBDX0RMX0NTNQkweDAwMDAwMDAxCisjZGVmaW5lIENfRExfQ1M2CTB4MDAwMDAwMDIKKyNkZWZpbmUgQ19ETF9DUzcJMHgwMDAwMDAwNAorI2RlZmluZSBDX0RMX0NTOAkweDAwMDAwMDA4CisjZGVmaW5lCUNfRExfQ1MJCTB4MDAwMDAwMGYKKyNkZWZpbmUgQ19ETF8xU1RPUAkweDAwMDAwMDEwCisjZGVmaW5lIENfRExfMTVTVE9QCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ19ETF8yU1RPUAkweDAwMDAwMDQwCisjZGVmaW5lCUNfRExfU1RPUAkweDAwMDAwMGYwCisKKy8qIGludGVycnVwdCBlbmFibGluZy9zdGF0dXMgKi8KKworI2RlZmluZQlDX0lOX0RJU0FCTEUJMHgwMDAwMDAwMAkvKiB6ZXJvLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKyNkZWZpbmUJQ19JTl9UWEJFTVBUWQkweDAwMDAwMDAxCS8qIHR4IGJ1ZmZlciBlbXB0eSAqLworI2RlZmluZQlDX0lOX1RYTE9XV00JMHgwMDAwMDAwMgkvKiB0eCBidWZmZXIgYmVsb3cgTFdNICovCisjZGVmaW5lCUNfSU5fUlhISVdNCTB4MDAwMDAwMTAJLyogcnggYnVmZmVyIGFib3ZlIEhXTSAqLworI2RlZmluZQlDX0lOX1JYTk5EVAkweDAwMDAwMDIwCS8qIHJ4IG5vIG5ldyBkYXRhIHRpbWVvdXQgKi8KKyNkZWZpbmUJQ19JTl9NRENECTB4MDAwMDAxMDAJLyogbW9kZW0gRENEIGNoYW5nZSAqLworI2RlZmluZQlDX0lOX01EU1IJMHgwMDAwMDIwMAkvKiBtb2RlbSBEU1IgY2hhbmdlICovCisjZGVmaW5lCUNfSU5fTVJJCTB4MDAwMDA0MDAJLyogbW9kZW0gUkkgY2hhbmdlICovCisjZGVmaW5lCUNfSU5fTUNUUwkweDAwMDAwODAwCS8qIG1vZGVtIENUUyBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19JTl9SWEJSSwkweDAwMDAxMDAwCS8qIEJyZWFrIHJlY2VpdmVkICovCisjZGVmaW5lCUNfSU5fUFJfRVJST1IJMHgwMDAwMjAwMAkvKiBwYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJQ19JTl9GUl9FUlJPUgkweDAwMDA0MDAwCS8qIGZyYW1lIGVycm9yICovCisjZGVmaW5lIENfSU5fT1ZSX0VSUk9SICAweDAwMDA4MDAwICAgICAgLyogb3ZlcnJ1biBlcnJvciAqLworI2RlZmluZSBDX0lOX1JYT0ZMCTB4MDAwMTAwMDAgICAgICAvKiBSWCBidWZmZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgQ19JTl9JT0NUTFcJMHgwMDAyMDAwMCAgICAgIC8qIEkvTyBjb250cm9sIHcvIHdhaXQgKi8KKyNkZWZpbmUgQ19JTl9NUlRTCTB4MDAwNDAwMDAJLyogbW9kZW0gUlRTIGRyb3AgKi8KKyNkZWZpbmUgQ19JTl9JQ0hBUgkweDAwMDgwMDAwCisgCisvKiBmbG93IGNvbnRyb2wgKi8KKworI2RlZmluZQlDX0ZMX09YWAkweDAwMDAwMDAxCS8qIG91dHB1dCBYb24vWG9mZiBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJQ19GTF9JWFgJMHgwMDAwMDAwMgkvKiBvdXRwdXQgWG9uL1hvZmYgZmxvdyBjb250cm9sICovCisjZGVmaW5lIENfRkxfT0lYQU5ZCTB4MDAwMDAwMDQJLyogb3V0cHV0IFhvbi9Yb2ZmIChhbnkgeG9uKSAqLworI2RlZmluZQlDX0ZMX1NXRkxPVwkweDAwMDAwMDBmCisKKy8qIGZsb3cgc3RhdHVzICovCisKKyNkZWZpbmUJQ19GU19UWElETEUJMHgwMDAwMDAwMAkvKiBubyBUeCBkYXRhIGluIHRoZSBidWZmZXIgb3IgVUFSVCAqLworI2RlZmluZQlDX0ZTX1NFTkRJTkcJMHgwMDAwMDAwMQkvKiBVQVJUIGlzIHNlbmRpbmcgZGF0YSAqLworI2RlZmluZQlDX0ZTX1NXRkxPVwkweDAwMDAwMDAyCS8qIFR4IGlzIHN0b3BwZWQgYnkgcmVjZWl2ZWQgWG9mZiAqLworCisvKiByc19jb250cm9sL3JzX3N0YXR1cyBSUy0yMzIgc2lnbmFscyAqLworCisjZGVmaW5lIENfUlNfUEFSQU0JMHg4MDAwMDAwMAkvKiBJbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgcGFyYW1ldGVyIGluIAorCQkJCQkgICBJT0NUTE0gY29tbWFuZCAqLworI2RlZmluZQlDX1JTX1JUUwkweDAwMDAwMDAxCS8qIFJUUyAqLworI2RlZmluZQlDX1JTX0RUUgkweDAwMDAwMDA0CS8qIERUUiAqLworI2RlZmluZQlDX1JTX0RDRAkweDAwMDAwMTAwCS8qIENEICovCisjZGVmaW5lCUNfUlNfRFNSCTB4MDAwMDAyMDAJLyogRFNSICovCisjZGVmaW5lCUNfUlNfUkkJCTB4MDAwMDA0MDAJLyogUkkgKi8KKyNkZWZpbmUJQ19SU19DVFMJMHgwMDAwMDgwMAkvKiBDVFMgKi8KKworLyogY29tbWFuZHMgSG9zdCA8LT4gQm9hcmQgKi8KKworI2RlZmluZQlDX0NNX1JFU0VUCTB4MDEJCS8qIHJlc2V0L2ZsdXNoIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJQ19DTV9JT0NUTAkweDAyCQkvKiByZS1yZWFkIENIX0NUUkwgKi8KKyNkZWZpbmUJQ19DTV9JT0NUTFcJMHgwMwkJLyogcmUtcmVhZCBDSF9DVFJMLCBpbnRyIHdoZW4gZG9uZSAqLworI2RlZmluZQlDX0NNX0lPQ1RMTQkweDA0CQkvKiBSUy0yMzIgb3V0cHV0cyBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19DTV9TRU5EWE9GRgkweDEwCQkvKiBzZW5kIFhvZmYgKi8KKyNkZWZpbmUJQ19DTV9TRU5EWE9OCTB4MTEJCS8qIHNlbmQgWG9uICovCisjZGVmaW5lIENfQ01fQ0xGTE9XCTB4MTIJCS8qIENsZWFyIGZsb3cgY29udHJvbCAocmVzdW1lKSAqLworI2RlZmluZQlDX0NNX1NFTkRCUksJMHg0MQkJLyogc2VuZCBicmVhayAqLworI2RlZmluZQlDX0NNX0lOVEJBQ0sJMHg0MgkJLyogSW50ZXJydXB0IGJhY2sgKi8KKyNkZWZpbmUJQ19DTV9TRVRfQlJFQUsJMHg0MwkJLyogVHggYnJlYWsgb24gKi8KKyNkZWZpbmUJQ19DTV9DTFJfQlJFQUsJMHg0NAkJLyogVHggYnJlYWsgb2ZmICovCisjZGVmaW5lCUNfQ01fQ01EX0RPTkUJMHg0NQkJLyogUHJldmlvdXMgY29tbWFuZCBkb25lICovCisjZGVmaW5lIENfQ01fSU5UQkFDSzIJMHg0NgkJLyogQWx0ZXJuYXRlIEludGVycnVwdCBiYWNrICovCisjZGVmaW5lCUNfQ01fVElOQUNUCTB4NTEJCS8qIHNldCBpbmFjdGl2aXR5IGRldGVjdGlvbiAqLworI2RlZmluZQlDX0NNX0lSUV9FTkJMCTB4NTIJCS8qIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVycnVwdHMgKi8KKyNkZWZpbmUJQ19DTV9JUlFfRFNCTAkweDUzCQkvKiBkaXNhYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJydXB0cyAqLworI2RlZmluZQlDX0NNX0FDS19FTkJMCTB4NTQJCS8qIGVuYWJsZSBhY2tub3dsZWRnZWQgaW50ZXJydXB0IG1vZGUgKi8KKyNkZWZpbmUJQ19DTV9BQ0tfRFNCTAkweDU1CQkvKiBkaXNhYmxlIGFja25vd2xlZGdlZCBpbnRyIG1vZGUgKi8KKyNkZWZpbmUJQ19DTV9GTFVTSF9SWAkweDU2CQkvKiBmbHVzaGVzIFJ4IGJ1ZmZlciAqLworI2RlZmluZQlDX0NNX0ZMVVNIX1RYCTB4NTcJCS8qIGZsdXNoZXMgVHggYnVmZmVyICovCisjZGVmaW5lIENfQ01fUV9FTkFCTEUJMHg1OAkJLyogZW5hYmxlcyBxdWV1ZSBhY2Nlc3MgZnJvbSB0aGUgCisJCQkJCSAgIGRyaXZlciAqLworI2RlZmluZSBDX0NNX1FfRElTQUJMRSAgMHg1OSAgICAgICAgICAgIC8qIGRpc2FibGVzIHF1ZXVlIGFjY2VzcyBmcm9tIHRoZSAKKwkJCQkJICAgZHJpdmVyICovCisKKyNkZWZpbmUJQ19DTV9UWEJFTVBUWQkweDYwCQkvKiBUeCBidWZmZXIgaXMgZW1wdHkgKi8KKyNkZWZpbmUJQ19DTV9UWExPV1dNCTB4NjEJCS8qIFR4IGJ1ZmZlciBsb3cgd2F0ZXIgbWFyayAqLworI2RlZmluZQlDX0NNX1JYSElXTQkweDYyCQkvKiBSeCBidWZmZXIgaGlnaCB3YXRlciBtYXJrICovCisjZGVmaW5lCUNfQ01fUlhOTkRUCTB4NjMJCS8qIHJ4IG5vIG5ldyBkYXRhIHRpbWVvdXQgKi8KKyNkZWZpbmUJQ19DTV9UWEZFTVBUWQkweDY0CisjZGVmaW5lCUNfQ01fSUNIQVIJMHg2NQorI2RlZmluZQlDX0NNX01EQ0QJMHg3MAkJLyogbW9kZW0gRENEIGNoYW5nZSAqLworI2RlZmluZQlDX0NNX01EU1IJMHg3MQkJLyogbW9kZW0gRFNSIGNoYW5nZSAqLworI2RlZmluZQlDX0NNX01SSQkweDcyCQkvKiBtb2RlbSBSSSBjaGFuZ2UgKi8KKyNkZWZpbmUJQ19DTV9NQ1RTCTB4NzMJCS8qIG1vZGVtIENUUyBjaGFuZ2UgKi8KKyNkZWZpbmUgQ19DTV9NUlRTCTB4NzQJCS8qIG1vZGVtIFJUUyBkcm9wICovCisjZGVmaW5lCUNfQ01fUlhCUksJMHg4NAkJLyogQnJlYWsgcmVjZWl2ZWQgKi8KKyNkZWZpbmUJQ19DTV9QUl9FUlJPUgkweDg1CQkvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUJQ19DTV9GUl9FUlJPUgkweDg2CQkvKiBGcmFtZSBlcnJvciAqLworI2RlZmluZSBDX0NNX09WUl9FUlJPUiAgMHg4NyAgICAgICAgICAgIC8qIE92ZXJydW4gZXJyb3IgKi8KKyNkZWZpbmUgQ19DTV9SWE9GTAkweDg4ICAgICAgICAgICAgLyogUlggYnVmZmVyIG92ZXJmbG93ICovCisjZGVmaW5lCUNfQ01fQ01ERVJST1IJMHg5MAkJLyogY29tbWFuZCBlcnJvciAqLworI2RlZmluZQlDX0NNX0ZBVEFMCTB4OTEJCS8qIGZhdGFsIGVycm9yICovCisjZGVmaW5lCUNfQ01fSFdfUkVTRVQJMHg5MgkJLyogcmVzZXQgYm9hcmQgKi8KKworLyoKKyAqCUNIX0NUUkwgLSBUaGlzIHBlciBwb3J0IHN0cnVjdHVyZSBjb250YWlucyBhbGwgcGFyYW1ldGVycworICoJdGhhdCBjb250cm9sIGFuIHNwZWNpZmljIHBvcnQuIEl0IGNhbiBiZSBzZWVuIGFzIHRoZQorICoJY29uZmlndXJhdGlvbiByZWdpc3RlcnMgb2YgYSAic3VwZXItc2VyaWFsLWNvbnRyb2xsZXIiLgorICovCisKK3N0cnVjdCBDSF9DVFJMIHsKKwlfX3UzMglvcF9tb2RlOwkvKiBvcGVyYXRpb24gbW9kZSAqLworCV9fdTMyCWludHJfZW5hYmxlOwkvKiBpbnRlcnJ1cHQgbWFza2luZyAqLworCV9fdTMyCXN3X2Zsb3c7CS8qIFNXIGZsb3cgY29udHJvbCAqLworCV9fdTMyCWZsb3dfc3RhdHVzOwkvKiBvdXRwdXQgZmxvdyBzdGF0dXMgKi8KKwlfX3UzMgljb21tX2JhdWQ7CS8qIGJhdWQgcmF0ZSAgLSBudW1lcmljYWxseSBzcGVjaWZpZWQgKi8KKwlfX3UzMgljb21tX3Bhcml0eTsJLyogcGFyaXR5ICovCisJX191MzIJY29tbV9kYXRhX2w7CS8qIGRhdGEgbGVuZ3RoL3N0b3AgKi8KKwlfX3UzMgljb21tX2ZsYWdzOwkvKiBvdGhlciBmbGFncyAqLworCV9fdTMyCWh3X2Zsb3c7CS8qIEhXIGZsb3cgY29udHJvbCAqLworCV9fdTMyCXJzX2NvbnRyb2w7CS8qIFJTLTIzMiBvdXRwdXRzICovCisJX191MzIJcnNfc3RhdHVzOwkvKiBSUy0yMzIgaW5wdXRzICovCisJX191MzIJZmxvd194b247CS8qIHhvbiBjaGFyICovCisJX191MzIJZmxvd194b2ZmOwkvKiB4b2ZmIGNoYXIgKi8KKwlfX3UzMglod19vdmVyZmxvdzsJLyogaHcgb3ZlcmZsb3cgY291bnRlciAqLworCV9fdTMyCXN3X292ZXJmbG93OwkvKiBzdyBvdmVyZmxvdyBjb3VudGVyICovCisJX191MzIJY29tbV9lcnJvcjsJLyogZnJhbWUvcGFyaXR5IGVycm9yIGNvdW50ZXIgKi8KKwlfX3UzMiBpY2hhcjsKKwlfX3UzMiBmaWxsZXJbN107Cit9OworCisKKy8qCisgKglCVUZfQ1RSTCAtIFRoaXMgcGVyIGNoYW5uZWwgc3RydWN0dXJlIGNvbnRhaW5zCisgKglhbGwgVHggYW5kIFJ4IGJ1ZmZlciBjb250cm9sIGZvciBhIGdpdmVuIGNoYW5uZWwuCisgKi8KKworc3RydWN0CUJVRl9DVFJMCXsKKwlfX3UzMglmbGFnX2RtYTsJLyogYnVmZmVycyBhcmUgaW4gSG9zdCBtZW1vcnkgKi8KKwlfX3UzMgl0eF9idWZhZGRyOwkvKiBhZGRyZXNzIG9mIHRoZSB0eCBidWZmZXIgKi8KKwlfX3UzMgl0eF9idWZzaXplOwkvKiB0eCBidWZmZXIgc2l6ZSAqLworCV9fdTMyCXR4X3RocmVzaG9sZDsJLyogdHggbG93IHdhdGVyIG1hcmsgKi8KKwlfX3UzMgl0eF9nZXQ7CQkvKiB0YWlsIGluZGV4IHR4IGJ1ZiAqLworCV9fdTMyCXR4X3B1dDsJCS8qIGhlYWQgaW5kZXggdHggYnVmICovCisJX191MzIJcnhfYnVmYWRkcjsJLyogYWRkcmVzcyBvZiB0aGUgcnggYnVmZmVyICovCisJX191MzIJcnhfYnVmc2l6ZTsJLyogcnggYnVmZmVyIHNpemUgKi8KKwlfX3UzMglyeF90aHJlc2hvbGQ7CS8qIHJ4IGhpZ2ggd2F0ZXIgbWFyayAqLworCV9fdTMyCXJ4X2dldDsJCS8qIHRhaWwgaW5kZXggcnggYnVmICovCisJX191MzIJcnhfcHV0OwkJLyogaGVhZCBpbmRleCByeCBidWYgKi8KKwlfX3UzMglmaWxsZXJbNV07CS8qIGZpbGxlciB0byBhbGlnbiBzdHJ1Y3R1cmVzICovCit9OworCisvKgorICoJQk9BUkRfQ1RSTCAtIFRoaXMgcGVyIGJvYXJkIHN0cnVjdHVyZSBjb250YWlucyBhbGwgZ2xvYmFsIAorICoJY29udHJvbCBmaWVsZHMgcmVsYXRlZCB0byB0aGUgYm9hcmQuCisgKi8KKworc3RydWN0IEJPQVJEX0NUUkwgeworCisJLyogc3RhdGljIGluZm8gcHJvdmlkZWQgYnkgdGhlIG9uLWJvYXJkIENQVSAqLworCV9fdTMyCW5fY2hhbm5lbDsJLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisJX191MzIJZndfdmVyc2lvbjsJLyogZmlybXdhcmUgdmVyc2lvbiAqLworCisJLyogc3RhdGljIGluZm8gcHJvdmlkZWQgYnkgdGhlIGRyaXZlciAqLworCV9fdTMyCW9wX3N5c3RlbTsJLyogb3Bfc3lzdGVtIGlkICovCisJX191MzIJZHJfdmVyc2lvbjsJLyogZHJpdmVyIHZlcnNpb24gKi8KKworCS8qIGJvYXJkIGNvbnRyb2wgYXJlYSAqLworCV9fdTMyCWluYWN0aXZpdHk7CS8qIGluYWN0aXZpdHkgY29udHJvbCAqLworCisJLyogaG9zdCB0byBGVyBjb21tYW5kcyAqLworCV9fdTMyCWhjbWRfY2hhbm5lbDsJLyogY2hhbm5lbCBudW1iZXIgKi8KKwlfX3UzMgloY21kX3BhcmFtOwkvKiBwb2ludGVyIHRvIHBhcmFtZXRlcnMgKi8KKworCS8qIEZXIHRvIEhvc3QgY29tbWFuZHMgKi8KKwlfX3UzMglmd2NtZF9jaGFubmVsOwkvKiBjaGFubmVsIG51bWJlciAqLworCV9fdTMyCWZ3Y21kX3BhcmFtOwkvKiBwb2ludGVyIHRvIHBhcmFtZXRlcnMgKi8KKwlfX3UzMgl6Zl9pbnRfcXVldWVfYWRkcjsgLyogb2Zmc2V0IGZvciBJTlRfUVVFVUUgc3RydWN0dXJlICovCisKKwkvKiBmaWxsZXIgc28gdGhlIHN0cnVjdHVyZXMgYXJlIGFsaWduZWQgKi8KKwlfX3UzMglmaWxsZXJbNl07Cit9OworCisvKiBIb3N0IEludGVycnVwdCBRdWV1ZSAqLworCisjZGVmaW5lIFFVRVVFX1NJWkUJKDEwKk1BWF9DSEFOKQorCitzdHJ1Y3QJSU5UX1FVRVVFIHsKKwl1bnNpZ25lZCBjaGFyCWludHJfY29kZVtRVUVVRV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nCWNoYW5uZWxbUVVFVUVfU0laRV07CisJdW5zaWduZWQgbG9uZwlwYXJhbVtRVUVVRV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nCXB1dDsKKwl1bnNpZ25lZCBsb25nCWdldDsKK307CisKKy8qCisgKglaRldfQ1RSTCAtIFRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgaW5jbHVkZXMgYWxsIG90aGVyCisgKglkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgRmlybXdhcmUuCisgKi8KKyAKK3N0cnVjdCBaRldfQ1RSTCB7CisJc3RydWN0IEJPQVJEX0NUUkwJYm9hcmRfY3RybDsKKwlzdHJ1Y3QgQ0hfQ1RSTAkJY2hfY3RybFtNQVhfQ0hBTl07CisJc3RydWN0IEJVRl9DVFJMCQlidWZfY3RybFtNQVhfQ0hBTl07Cit9OworCisvKioqKioqKioqKioqKioqKioqICoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfQ1lDTEFERVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWN4X2NmbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9jeWN4X2NmbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMmQyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2N5Y3hfY2ZtLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisqIGN5Y3hfY2ZtLmgJQ3ljbG9tIDJYIFdBTiBMaW5rIERyaXZlci4KKyoJCURlZmluaXRpb25zIGZvciB0aGUgQ3ljbG9tIDJYIEZpcm13YXJlIE1vZHVsZSAoQ0ZNKS4KKyoKKyogQXV0aG9yOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5OC0yMDAzIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbworKgorKiBCYXNlZCBvbiBzZGxhc2ZtLmggYnkgR2VuZSBLb3ppbiA8NzQ2MDQuMTUyQGNvbXB1c2VydmUuY29tPgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAxOTk4LzA4LzA4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KKyovCisjaWZuZGVmCV9DWUNYX0NGTV9ICisjZGVmaW5lCV9DWUNYX0NGTV9ICisKKy8qIERlZmluZXMgKi8KKworI2RlZmluZQlDRk1fVkVSU0lPTgkyCisjZGVmaW5lCUNGTV9TSUdOQVRVUkUJIkNGTSAtIEN5Y2xhZGVzIENZQ1ggRmlybXdhcmUgTW9kdWxlIgorCisvKiBtaW4vbWF4ICovCisjZGVmaW5lCUNGTV9JTUFHRV9TSVpFCTB4MjAwMDAJLyogbWF4IHNpemUgb2YgQ1lDWCBjb2RlIGltYWdlIGZpbGUgKi8KKyNkZWZpbmUJQ0ZNX0RFU0NSX0xFTgkyNTYJLyogbWF4IGxlbmd0aCBvZiBkZXNjcmlwdGlvbiBzdHJpbmcgKi8KKyNkZWZpbmUJQ0ZNX01BWF9DWUNYCTEJLyogbWF4IG51bWJlciBvZiBjb21wYXRpYmxlIGFkYXB0ZXJzICovCisjZGVmaW5lCUNGTV9MT0FEX0JVRlNaCTB4NDAwCS8qIGJ1ZmZlciBzaXplIGZvciByZXNldCBjb2RlIChidWZmZXJfbG9hZCkgKi8KKworLyogRmlybXdhcmUgQ29tbWFuZHMgKi8KKyNkZWZpbmUgR0VOX1BPV0VSX09OCTB4MTI4MAorCisjZGVmaW5lIEdFTl9TRVRfU0VHCTB4MTQwMQkvKiBib290IHNlZ21lbnQgc2V0dGluZy4gKi8KKyNkZWZpbmUgR0VOX0JPT1RfREFUCTB4MTQwMgkvKiBib290IGRhdGEuICovCisjZGVmaW5lIEdFTl9TVEFSVAkweDE0MDMJLyogYm9hcmQgc3RhcnQuICovCisjZGVmaW5lIEdFTl9ERUZQQVIJMHgxNDA0CS8qIGJ1ZmZlciBsZW5ndGggZm9yIGJvb3QuICovCisKKy8qIEFkYXB0ZXIgVHlwZXMgKi8KKyNkZWZpbmUgQ1lDWF8yWAkJMgorLyogZm9yIG5vdyBvbmx5IHRoZSAyWCBpcyBzdXBwb3J0ZWQsIG5vIHBsYW5zIHRvIHN1cHBvcnQgOFggb3IgMTZYICovCisjZGVmaW5lIENZQ1hfOFgJCTgKKyNkZWZpbmUgQ1lDWF8xNlgJMTYKKworI2RlZmluZQlDRklEX1gyNV8yWAk1MjAwCisKKy8qKgorICoJc3RydWN0IGN5Y3hfZndfaW5mbyAtIGZpcm13YXJlIG1vZHVsZSBpbmZvcm1hdGlvbi4KKyAqCUBjb2RlaWQgLSBmaXJtd2FyZSBJRAorICoJQHZlcnNpb24gLSBmaXJtd2FyZSB2ZXJzaW9uIG51bWJlcgorICoJQGFkYXB0ZXIgLSBjb21wYXRpYmxlIGFkYXB0ZXIgdHlwZXMKKyAqCUBtZW1zaXplIC0gbWluaW11bSBtZW1vcnkgc2l6ZQorICoJQHJlc2VydmVkIC0gcmVzZXJ2ZWQKKyAqCUBzdGFydG9mZnMgLSBlbnRyeSBwb2ludCBvZmZzZXQKKyAqCUB3aW5vZmZzIC0gZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgb2Zmc2V0CisgKglAY29kZW9mZnMgLSBjb2RlIGxvYWQgb2Zmc2V0CisgKglAY29kZXNpemUgLSBjb2RlIHNpemUKKyAqCUBkYXRhb2ZmcyAtIGNvbmZpZ3VyYXRpb24gZGF0YSBsb2FkIG9mZnNldAorICoJQGRhdGFzaXplIC0gY29uZmlndXJhdGlvbiBkYXRhIHNpemUKKyAqLworc3RydWN0IGN5Y3hfZndfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQJY29kZWlkOworCXVuc2lnbmVkIHNob3J0CXZlcnNpb247CisJdW5zaWduZWQgc2hvcnQJYWRhcHRlcltDRk1fTUFYX0NZQ1hdOworCXVuc2lnbmVkIGxvbmcJbWVtc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydAlyZXNlcnZlZFsyXTsKKwl1bnNpZ25lZCBzaG9ydAlzdGFydG9mZnM7CisJdW5zaWduZWQgc2hvcnQJd2lub2ZmczsKKwl1bnNpZ25lZCBzaG9ydAljb2Rlb2ZmczsKKwl1bnNpZ25lZCBsb25nCWNvZGVzaXplOworCXVuc2lnbmVkIHNob3J0CWRhdGFvZmZzOworCXVuc2lnbmVkIGxvbmcJZGF0YXNpemU7Cit9OworCisvKioKKyAqCXN0cnVjdCBjeWN4X2Zpcm13YXJlIC0gQ1lDWCBmaXJtd2FyZSBmaWxlIHN0cnVjdHVyZQorICoJQHNpZ25hdHVyZSAtIENGTSBmaWxlIHNpZ25hdHVyZQorICoJQHZlcnNpb24gLSBmaWxlIGZvcm1hdCB2ZXJzaW9uCisgKglAY2hlY2tzdW0gLSBpbmZvICsgaW1hZ2UKKyAqCUByZXNlcnZlZCAtIHJlc2VydmVkCisgKglAZGVzY3IgLSBkZXNjcmlwdGlvbiBzdHJpbmcKKyAqCUBpbmZvIC0gZmlybXdhcmUgbW9kdWxlIGluZm8KKyAqCUBpbWFnZSAtIGNvZGUgaW1hZ2UgKHZhcmlhYmxlIHNpemUpCisgKi8KK3N0cnVjdCBjeWN4X2Zpcm13YXJlIHsKKwljaGFyCQkgICAgc2lnbmF0dXJlWzgwXTsKKwl1bnNpZ25lZCBzaG9ydAkgICAgdmVyc2lvbjsKKwl1bnNpZ25lZCBzaG9ydAkgICAgY2hlY2tzdW07CisJdW5zaWduZWQgc2hvcnQJICAgIHJlc2VydmVkWzZdOworCWNoYXIJCSAgICBkZXNjcltDRk1fREVTQ1JfTEVOXTsKKwlzdHJ1Y3QgY3ljeF9md19pbmZvIGluZm87CisJdW5zaWduZWQgY2hhcgkgICAgaW1hZ2VbMF07Cit9OworCitzdHJ1Y3QgY3ljeF9md19oZWFkZXIgeworCXVuc2lnbmVkIGxvbmcgIHJlc2V0X3NpemU7CisJdW5zaWduZWQgbG9uZyAgZGF0YV9zaXplOworCXVuc2lnbmVkIGxvbmcgIGNvZGVfc2l6ZTsKK307CisjZW5kaWYJLyogX0NZQ1hfQ0ZNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3ZDJiYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGNjcC5oCkBAIC0wLDAgKzEsMjE3IEBACisjaWZuZGVmIF9MSU5VWF9EQ0NQX0gKKyNkZWZpbmUgX0xJTlVYX0RDQ1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qKgorICogc3RydWN0IGRjY3BfaGRyIC0gZ2VuZXJpYyBwYXJ0IG9mIERDQ1AgcGFja2V0IGhlYWRlcgorICoKKyAqIEBkY2NwaF9zcG9ydCAtIFJlbGV2YW50IHBvcnQgb24gdGhlIGVuZHBvaW50IHRoYXQgc2VudCB0aGlzIHBhY2tldAorICogQGRjY3BoX2Rwb3J0IC0gUmVsZXZhbnQgcG9ydCBvbiB0aGUgb3RoZXIgZW5kcG9pbnQKKyAqIEBkY2NwaF9kb2ZmIC0gRGF0YSBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIERDQ1AgaGVhZGVyLCBpbiAzMi1iaXQgd29yZHMKKyAqIEBkY2NwaF9jY3ZhbCAtIFVzZWQgYnkgdGhlIEhDLVNlbmRlciBDQ0lECisgKiBAZGNjcGhfY3Njb3YgLSBQYXJ0cyBvZiB0aGUgcGFja2V0IHRoYXQgYXJlIGNvdmVyZWQgYnkgdGhlIENoZWNrc3VtIGZpZWxkCisgKiBAZGNjcGhfY2hlY2tzdW0gLSBJbnRlcm5ldCBjaGVja3N1bSwgZGVwZW5kcyBvbiBkY2NwaF9jc2NvdgorICogQGRjY3BoX3ggLSAwID0gMjQgYml0IHNlcXVlbmNlIG51bWJlciwgMSA9IDQ4CisgKiBAZGNjcGhfdHlwZSAtIHBhY2tldCB0eXBlLCBzZWUgRENDUF9QS1RfIHByZWZpeGVkIG1hY3JvcworICogQGRjY3BoX3NlcSAtIHNlcXVlbmNlIG51bWJlciBoaWdoIG9yIGxvdyBvcmRlciAyNCBiaXRzLCBkZXBlbmRzIG9uIGRjY3BoX3gKKyAqLworc3RydWN0IGRjY3BfaGRyIHsKKwlfX2JlMTYJZGNjcGhfc3BvcnQsCisJCWRjY3BoX2Rwb3J0OworCV9fdTgJZGNjcGhfZG9mZjsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CWRjY3BoX2NzY292OjQsCisJCWRjY3BoX2NjdmFsOjQ7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CWRjY3BoX2NjdmFsOjQsCisJCWRjY3BoX2NzY292OjQ7CisjZWxzZQorI2Vycm9yICAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgorCV9fc3VtMTYJZGNjcGhfY2hlY2tzdW07CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAlkY2NwaF94OjEsCisJCWRjY3BoX3R5cGU6NCwKKwkJZGNjcGhfcmVzZXJ2ZWQ6MzsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJZGNjcGhfcmVzZXJ2ZWQ6MywKKwkJZGNjcGhfdHlwZTo0LAorCQlkY2NwaF94OjE7CisjZWxzZQorI2Vycm9yICAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKKyNlbmRpZgorCV9fdTgJZGNjcGhfc2VxMjsKKwlfX2JlMTYJZGNjcGhfc2VxOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfZXh0IC0gdGhlIGxvdyBiaXRzIG9mIGEgNDggYml0IHNlcSBwYWNrZXQKKyAqCisgKiBAZGNjcGhfc2VxX2xvdyAtIGxvdyAyNCBiaXRzIG9mIGEgNDggYml0IHNlcSBwYWNrZXQKKyAqLworc3RydWN0IGRjY3BfaGRyX2V4dCB7CisJX19iZTMyCWRjY3BoX3NlcV9sb3c7Cit9OworCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0IC0gQ29ubmVjdGlvbiBpbml0aWF0aW9uIHJlcXVlc3QgaGVhZGVyCisgKgorICogQGRjY3BoX3JlcV9zZXJ2aWNlIC0gU2VydmljZSB0byB3aGljaCB0aGUgY2xpZW50IGFwcCB3YW50cyB0byBjb25uZWN0CisgKi8KK3N0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0IHsKKwlfX2JlMzIJZGNjcGhfcmVxX3NlcnZpY2U7Cit9OworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgLSBhY2tub3dsZWRnbWVudCBiaXRzIGNvbW1vbiB0byBtb3N0IHBhY2tldHMKKyAqCisgKiBAZGNjcGhfcmVzcF9hY2tfbnJfaGlnaCAtIDQ4IGJpdCBhY2sgbnVtYmVyIGhpZ2ggb3JkZXIgYml0cywgY29udGFpbnMgR1NSCisgKiBAZGNjcGhfcmVzcF9hY2tfbnJfbG93IC0gNDggYml0IGFjayBudW1iZXIgbG93IG9yZGVyIGJpdHMsIGNvbnRhaW5zIEdTUgorICovCitzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgeworCV9fYmUxNglkY2NwaF9yZXNlcnZlZDE7CisJX19iZTE2CWRjY3BoX2Fja19ucl9oaWdoOworCV9fYmUzMglkY2NwaF9hY2tfbnJfbG93OworfTsKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlIC0gQ29ubmVjdGlvbiBpbml0aWF0aW9uIHJlc3BvbnNlIGhlYWRlcgorICoKKyAqIEBkY2NwaF9yZXNwX2FjayAtIDQ4IGJpdCBBY2tub3dsZWRnbWVudCBOdW1iZXIgU3ViaGVhZGVyICg1LjMpCisgKiBAZGNjcGhfcmVzcF9zZXJ2aWNlIC0gRWNob2VzIHRoZSBTZXJ2aWNlIENvZGUgb24gYSByZWNlaXZlZCBEQ0NQLVJlcXVlc3QKKyAqLworc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMJZGNjcGhfcmVzcF9hY2s7CisJX19iZTMyCQkJCWRjY3BoX3Jlc3Bfc2VydmljZTsKK307CisKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX3Jlc2V0IC0gVW5jb25kaXRpb25hbGx5IHNodXQgZG93biBhIGNvbm5lY3Rpb24KKyAqCisgKiBAZGNjcGhfcmVzZXRfYWNrIC0gNDggYml0IEFja25vd2xlZGdtZW50IE51bWJlciBTdWJoZWFkZXIgKDUuNikKKyAqIEBkY2NwaF9yZXNldF9jb2RlIC0gb25lIG9mICVkY2NwX3Jlc2V0X2NvZGVzCisgKiBAZGNjcGhfcmVzZXRfZGF0YSAtIHRoZSBEYXRhIDEgLi4uIERhdGEgMyBmaWVsZHMgZnJvbSA1LjYKKyAqLworc3RydWN0IGRjY3BfaGRyX3Jlc2V0IHsKKwlzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMJZGNjcGhfcmVzZXRfYWNrOworCV9fdTgJCQkJZGNjcGhfcmVzZXRfY29kZSwKKwkJCQkJZGNjcGhfcmVzZXRfZGF0YVszXTsKK307CisKK2VudW0gZGNjcF9wa3RfdHlwZSB7CisJRENDUF9QS1RfUkVRVUVTVCA9IDAsCisJRENDUF9QS1RfUkVTUE9OU0UsCisJRENDUF9QS1RfREFUQSwKKwlEQ0NQX1BLVF9BQ0ssCisJRENDUF9QS1RfREFUQUFDSywKKwlEQ0NQX1BLVF9DTE9TRVJFUSwKKwlEQ0NQX1BLVF9DTE9TRSwKKwlEQ0NQX1BLVF9SRVNFVCwKKwlEQ0NQX1BLVF9TWU5DLAorCURDQ1BfUEtUX1NZTkNBQ0ssCisJRENDUF9QS1RfSU5WQUxJRCwKK307CisKKyNkZWZpbmUgRENDUF9OUl9QS1RfVFlQRVMgRENDUF9QS1RfSU5WQUxJRAorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgZGNjcF9wYWNrZXRfaGRyX2xlbihjb25zdCBfX3U4IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gRENDUF9QS1RfREFUQSkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUgPT0gRENDUF9QS1RfREFUQUFDSwl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX0FDSwl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX1NZTkMJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9TWU5DQUNLCXx8CisJICAgIHR5cGUgPT0gRENDUF9QS1RfQ0xPU0UJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9DTE9TRVJFUSkKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMpOworCWlmICh0eXBlID09IERDQ1BfUEtUX1JFUVVFU1QpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3JlcXVlc3QpOworCWlmICh0eXBlID09IERDQ1BfUEtUX1JFU1BPTlNFKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQpOworfQorZW51bSBkY2NwX3Jlc2V0X2NvZGVzIHsKKwlEQ0NQX1JFU0VUX0NPREVfVU5TUEVDSUZJRUQgPSAwLAorCURDQ1BfUkVTRVRfQ09ERV9DTE9TRUQsCisJRENDUF9SRVNFVF9DT0RFX0FCT1JURUQsCisJRENDUF9SRVNFVF9DT0RFX05PX0NPTk5FQ1RJT04sCisJRENDUF9SRVNFVF9DT0RFX1BBQ0tFVF9FUlJPUiwKKwlEQ0NQX1JFU0VUX0NPREVfT1BUSU9OX0VSUk9SLAorCURDQ1BfUkVTRVRfQ09ERV9NQU5EQVRPUllfRVJST1IsCisJRENDUF9SRVNFVF9DT0RFX0NPTk5FQ1RJT05fUkVGVVNFRCwKKwlEQ0NQX1JFU0VUX0NPREVfQkFEX1NFUlZJQ0VfQ09ERSwKKwlEQ0NQX1JFU0VUX0NPREVfVE9PX0JVU1ksCisJRENDUF9SRVNFVF9DT0RFX0JBRF9JTklUX0NPT0tJRSwKKwlEQ0NQX1JFU0VUX0NPREVfQUdHUkVTU0lPTl9QRU5BTFRZLAorCisJRENDUF9NQVhfUkVTRVRfQ09ERVMJCS8qIExlYXZlIGF0IHRoZSBlbmQhICAqLworfTsKKworLyogRENDUCBvcHRpb25zICovCitlbnVtIHsKKwlEQ0NQT19QQURESU5HID0gMCwKKwlEQ0NQT19NQU5EQVRPUlkgPSAxLAorCURDQ1BPX01JTl9SRVNFUlZFRCA9IDMsCisJRENDUE9fTUFYX1JFU0VSVkVEID0gMzEsCisJRENDUE9fQ0hBTkdFX0wgPSAzMiwKKwlEQ0NQT19DT05GSVJNX0wgPSAzMywKKwlEQ0NQT19DSEFOR0VfUiA9IDM0LAorCURDQ1BPX0NPTkZJUk1fUiA9IDM1LAorCURDQ1BPX05EUF9DT1VOVCA9IDM3LAorCURDQ1BPX0FDS19WRUNUT1JfMCA9IDM4LAorCURDQ1BPX0FDS19WRUNUT1JfMSA9IDM5LAorCURDQ1BPX1RJTUVTVEFNUCA9IDQxLAorCURDQ1BPX1RJTUVTVEFNUF9FQ0hPID0gNDIsCisJRENDUE9fRUxBUFNFRF9USU1FID0gNDMsCisJRENDUE9fTUFYID0gNDUsCisJRENDUE9fTUlOX0NDSURfU1BFQ0lGSUMgPSAxMjgsCisJRENDUE9fTUFYX0NDSURfU1BFQ0lGSUMgPSAyNTUsCit9OworCisvKiBEQ0NQIENDSURTICovCitlbnVtIHsKKwlEQ0NQQ19DQ0lEMiA9IDIsCisJRENDUENfQ0NJRDMgPSAzLAorfTsKKworLyogRENDUCBmZWF0dXJlcyAoUkZDIDQzNDAgc2VjdGlvbiA2LjQpICovCitlbnVtIHsKKwlEQ0NQRl9SRVNFUlZFRCA9IDAsCisJRENDUEZfQ0NJRCA9IDEsCisJRENDUEZfU0hPUlRfU0VRTk9TID0gMiwJCS8qIFhYWDogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCURDQ1BGX1NFUVVFTkNFX1dJTkRPVyA9IDMsCisJRENDUEZfRUNOX0lOQ0FQQUJMRSA9IDQsCS8qIFhYWDogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCURDQ1BGX0FDS19SQVRJTyA9IDUsCisJRENDUEZfU0VORF9BQ0tfVkVDVE9SID0gNiwKKwlEQ0NQRl9TRU5EX05EUF9DT1VOVCA9IDcsCisJRENDUEZfTUlOX0NTVU1fQ09WRVIgPSA4LAorCURDQ1BGX0RBVEFfQ0hFQ0tTVU0gPSA5LAkvKiBYWFg6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwkvKiAxMC0xMjcgcmVzZXJ2ZWQgKi8KKwlEQ0NQRl9NSU5fQ0NJRF9TUEVDSUZJQyA9IDEyOCwKKwlEQ0NQRl9NQVhfQ0NJRF9TUEVDSUZJQyA9IDI1NSwKK307CisKKy8qIHRoaXMgc3RydWN0dXJlIGlzIGFyZ3VtZW50IHRvIERDQ1BfU09DS09QVF9DSEFOR0VfWCAqLworc3RydWN0IGRjY3Bfc29fZmVhdCB7CisJX191OCBkY2Nwc2ZfZmVhdDsKKwlfX3U4ICpkY2Nwc2ZfdmFsOworCV9fdTggZGNjcHNmX2xlbjsKK307CisKKy8qIERDQ1Agc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgRENDUF9TT0NLT1BUX1BBQ0tFVF9TSVpFCTEgLyogWFhYIGRlcHJlY2F0ZWQsIHdpdGhvdXQgZWZmZWN0ICovCisjZGVmaW5lIERDQ1BfU09DS09QVF9TRVJWSUNFCQkyCisjZGVmaW5lIERDQ1BfU09DS09QVF9DSEFOR0VfTAkJMworI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQ0hBTkdFX1IJCTQKKyNkZWZpbmUgRENDUF9TT0NLT1BUX0dFVF9DVVJfTVBTCTUKKyNkZWZpbmUgRENDUF9TT0NLT1BUX1NFTkRfQ1NDT1YJCTEwCisjZGVmaW5lIERDQ1BfU09DS09QVF9SRUNWX0NTQ09WCQkxMQorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQ0NJRF9SWF9JTkZPCTEyOAorI2RlZmluZSBEQ0NQX1NPQ0tPUFRfQ0NJRF9UWF9JTkZPCTE5MgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBzZXJ2aWNlcyBwcm92aWRlZCBvbiB0aGUgc2FtZSBsaXN0ZW5pbmcgcG9ydCAqLworI2RlZmluZSBEQ0NQX1NFUlZJQ0VfTElTVF9NQVhfTEVOICAgICAgMzIKKworCisjZW5kaWYgLyogX0xJTlVYX0RDQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kaXJlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGlyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5NjZiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGlyZW50LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfTElOVVhfRElSRU5UX0gKKyNkZWZpbmUgX0xJTlVYX0RJUkVOVF9ICisKK3N0cnVjdCBkaXJlbnQgeworCWxvbmcJCWRfaW5vOworCV9fa2VybmVsX29mZl90CWRfb2ZmOworCXVuc2lnbmVkIHNob3J0CWRfcmVjbGVuOworCWNoYXIJCWRfbmFtZVsyNTZdOyAvKiBXZSBtdXN0IG5vdCBpbmNsdWRlIGxpbWl0cy5oISAqLworfTsKKworc3RydWN0IGRpcmVudDY0IHsKKwlfX3U2NAkJZF9pbm87CisJX19zNjQJCWRfb2ZmOworCXVuc2lnbmVkIHNob3J0CWRfcmVjbGVuOworCXVuc2lnbmVkIGNoYXIJZF90eXBlOworCWNoYXIJCWRfbmFtZVsyNTZdOworfTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwYzY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoqCisqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyoqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0RMTV9ET1RfSF9fCisjZGVmaW5lIF9fRExNX0RPVF9IX18KKworLyoKKyAqIEludGVyZmFjZSB0byBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIgKERMTSkKKyAqIHJvdXRpbmVzIGFuZCBzdHJ1Y3R1cmVzIHRvIHVzZSBETE0gbG9ja3NwYWNlcworICovCisKKy8qCisgKiBMb2NrIE1vZGVzCisgKi8KKworI2RlZmluZSBETE1fTE9DS19JVgkJLTEJLyogaW52YWxpZCAqLworI2RlZmluZSBETE1fTE9DS19OTAkJMAkvKiBudWxsICovCisjZGVmaW5lIERMTV9MT0NLX0NSCQkxCS8qIGNvbmN1cnJlbnQgcmVhZCAqLworI2RlZmluZSBETE1fTE9DS19DVwkJMgkvKiBjb25jdXJyZW50IHdyaXRlICovCisjZGVmaW5lIERMTV9MT0NLX1BSCQkzCS8qIHByb3RlY3RlZCByZWFkICovCisjZGVmaW5lIERMTV9MT0NLX1BXCQk0CS8qIHByb3RlY3RlZCB3cml0ZSAqLworI2RlZmluZSBETE1fTE9DS19FWAkJNQkvKiBleGNsdXNpdmUgKi8KKworLyoKKyAqIE1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhIGRsbV9sb2NrIG5hbWUKKyAqLworCisjZGVmaW5lIERMTV9SRVNOQU1FX01BWExFTgk2NAorCisvKgorICogRmxhZ3MgdG8gZGxtX2xvY2sKKyAqCisgKiBETE1fTEtGX05PUVVFVUUKKyAqCisgKiBEbyBub3QgcXVldWUgdGhlIGxvY2sgcmVxdWVzdCBvbiB0aGUgd2FpdCBxdWV1ZSBpZiBpdCBjYW5ub3QgYmUgZ3JhbnRlZAorICogaW1tZWRpYXRlbHkuICBJZiB0aGUgbG9jayBjYW5ub3QgYmUgZ3JhbnRlZCBiZWNhdXNlIG9mIHRoaXMgZmxhZywgRExNIHdpbGwKKyAqIGVpdGhlciByZXR1cm4gLUVBR0FJTiBmcm9tIHRoZSBkbG1fbG9jayBjYWxsIG9yIHdpbGwgcmV0dXJuIDAgZnJvbQorICogZGxtX2xvY2sgYW5kIC1FQUdBSU4gaW4gdGhlIGxvY2sgc3RhdHVzIGJsb2NrIHdoZW4gdGhlIEFTVCBpcyBleGVjdXRlZC4KKyAqCisgKiBETE1fTEtGX0NBTkNFTAorICoKKyAqIFVzZWQgdG8gY2FuY2VsIGEgcGVuZGluZyBsb2NrIHJlcXVlc3Qgb3IgY29udmVyc2lvbi4gIEEgY29udmVydGluZyBsb2NrIGlzCisgKiByZXR1cm5lZCB0byBpdHMgcHJldmlvdXNseSBncmFudGVkIG1vZGUuCisgKgorICogRExNX0xLRl9DT05WRVJUCisgKgorICogSW5kaWNhdGVzIGEgbG9jayBjb252ZXJzaW9uIHJlcXVlc3QuICBGb3IgY29udmVyc2lvbnMgdGhlIG5hbWUgYW5kIG5hbWVsZW4KKyAqIGFyZSBpZ25vcmVkIGFuZCB0aGUgbG9jayBJRCBpbiB0aGUgTEtTQiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBsb2NrLgorICoKKyAqIERMTV9MS0ZfVkFMQkxLCisgKgorICogUmVxdWVzdHMgRExNIHRvIHJldHVybiB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgbG9jayB2YWx1ZSBibG9jayBpbiB0aGUKKyAqIGxvY2sgc3RhdHVzIGJsb2NrLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0IGluIGEgbG9jayBjb252ZXJzaW9uIGZyb20gUFcgb3IgRVgKKyAqIG1vZGVzLCBETE0gYXNzaWducyB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBsb2NrIHN0YXR1cyBibG9jayB0byB0aGUgbG9jaworICogdmFsdWUgYmxvY2sgb2YgdGhlIGxvY2sgcmVzb3VyY2UuICBUaGUgTFZCIGlzIGEgRExNX0xWQl9MRU4gc2l6ZSBhcnJheQorICogY29udGFpbmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBETE1fTEtGX1FVRUNWVAorICoKKyAqIEZvcmNlIGEgY29udmVyc2lvbiByZXF1ZXN0IHRvIGJlIHF1ZXVlZCwgZXZlbiBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGgKKyAqIHRoZSBncmFudGVkIG1vZGVzIG9mIG90aGVyIGxvY2tzIG9uIHRoZSBzYW1lIHJlc291cmNlLgorICoKKyAqIERMTV9MS0ZfSVZWQUxCTEsKKyAqCisgKiBJbnZhbGlkYXRlIHRoZSBsb2NrIHZhbHVlIGJsb2NrLgorICoKKyAqIERMTV9MS0ZfQ09OVkRFQURMSworICoKKyAqIEFsbG93cyB0aGUgZGxtIHRvIHJlc29sdmUgY29udmVyc2lvbiBkZWFkbG9ja3MgaW50ZXJuYWxseSBieSBkZW1vdGluZyB0aGUKKyAqIGdyYW50ZWQgbW9kZSBvZiBhIGNvbnZlcnRpbmcgbG9jayB0byBOTC4gIFRoZSBETE1fU0JGX0RFTU9URUQgZmxhZyBpcworICogcmV0dXJuZWQgZm9yIGEgY29udmVyc2lvbiB0aGF0J3MgYmVlbiBlZmZlY3RlZCBieSB0aGlzLgorICoKKyAqIERMTV9MS0ZfUEVSU0lTVEVOVAorICoKKyAqIE9ubHkgcmVsZXZhbnQgdG8gbG9ja3Mgb3JpZ2luYXRpbmcgaW4gdXNlcnNwYWNlLiAgQSBwZXJzaXN0ZW50IGxvY2sgd2lsbCBub3QKKyAqIGJlIHJlbW92ZWQgaWYgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgbG9jayBleGl0cy4KKyAqCisgKiBETE1fTEtGX05PRExDS1dUCisgKgorICogRG8gbm90IGNhbmNlbCB0aGUgbG9jayBpZiBpdCBnZXRzIGludG8gY29udmVyc2lvbiBkZWFkbG9jay4KKyAqIEV4Y2x1ZGUgdGhpcyBsb2NrIGZyb20gYmVpbmcgbW9uaXRvcmVkIGR1ZSB0byBETE1fTFNGTF9USU1FV0FSTi4KKyAqCisgKiBETE1fTEtGX05PRExDS0JMSworICoKKyAqIG5ldCB5ZXQgaW1wbGVtZW50ZWQKKyAqCisgKiBETE1fTEtGX0VYUEVESVRFCisgKgorICogVXNlZCBvbmx5IHdpdGggbmV3IHJlcXVlc3RzIGZvciBOTCBtb2RlIGxvY2tzLiAgVGVsbHMgdGhlIGxvY2sgbWFuYWdlcgorICogdG8gZ3JhbnQgdGhlIGxvY2ssIGlnbm9yaW5nIG90aGVyIGxvY2tzIGluIGNvbnZlcnQgYW5kIHdhaXQgcXVldWVzLgorICoKKyAqIERMTV9MS0ZfTk9RVUVVRUJBU1QKKyAqCisgKiBTZW5kIGJsb2NraW5nIEFTVCdzIGJlZm9yZSByZXR1cm5pbmcgLUVBR0FJTiB0byB0aGUgY2FsbGVyLiAgSXQgaXMgb25seQorICogdXNlZCBhbG9uZyB3aXRoIHRoZSBOT1FVRVVFIGZsYWcuICBCbG9ja2luZyBBU1QncyBhcmUgbm90IHNlbnQgZm9yIGZhaWxlZAorICogTk9RVUVVRSByZXF1ZXN0cyBvdGhlcndpc2UuCisgKgorICogRExNX0xLRl9IRUFEUVVFCisgKgorICogQWRkIGEgbG9jayB0byB0aGUgaGVhZCBvZiB0aGUgY29udmVydCBvciB3YWl0IHF1ZXVlIHJhdGhlciB0aGFuIHRoZSB0YWlsLgorICoKKyAqIERMTV9MS0ZfTk9PUkRFUgorICoKKyAqIERpc3JlZ2FyZCB0aGUgc3RhbmRhcmQgZ3JhbnQgb3JkZXIgcnVsZXMgYW5kIGdyYW50IGEgbG9jayBhcyBzb29uIGFzIGl0CisgKiBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgZ3JhbnRlZCBsb2Nrcy4KKyAqCisgKiBETE1fTEtGX09SUEhBTgorICoKKyAqIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAqCisgKiBETE1fTEtGX0FMVFBSCisgKgorICogSWYgdGhlIHJlcXVlc3RlZCBtb2RlIGNhbm5vdCBiZSBncmFudGVkIGltbWVkaWF0ZWx5LCB0cnkgdG8gZ3JhbnQgdGhlIGxvY2sKKyAqIGluIFBSIG1vZGUgaW5zdGVhZC4gIElmIHRoaXMgYWx0ZXJuYXRlIG1vZGUgaXMgZ3JhbnRlZCBpbnN0ZWFkIG9mIHRoZQorICogcmVxdWVzdGVkIG1vZGUsIERMTV9TQkZfQUxUTU9ERSBpcyByZXR1cm5lZCBpbiB0aGUgbGtzYi4KKyAqCisgKiBETE1fTEtGX0FMVENXCisgKgorICogVGhlIHNhbWUgYXMgQUxUUFIsIGJ1dCB0aGUgYWx0ZXJuYXRlIG1vZGUgaXMgQ1cuCisgKgorICogRExNX0xLRl9GT1JDRVVOTE9DSworICoKKyAqIFVubG9jayB0aGUgbG9jayBldmVuIGlmIGl0IGlzIGNvbnZlcnRpbmcgb3Igd2FpdGluZyBvciBoYXMgc3VibG9ja3MuCisgKiBPbmx5IHJlYWxseSBmb3IgdXNlIGJ5IHRoZSB1c2VybGFuZCBkZXZpY2UuYyBjb2RlLgorICoKKyAqLworCisjZGVmaW5lIERMTV9MS0ZfTk9RVUVVRQkJMHgwMDAwMDAwMQorI2RlZmluZSBETE1fTEtGX0NBTkNFTAkJMHgwMDAwMDAwMgorI2RlZmluZSBETE1fTEtGX0NPTlZFUlQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRExNX0xLRl9WQUxCTEsJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRExNX0xLRl9RVUVDVlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRExNX0xLRl9JVlZBTEJMSwkweDAwMDAwMDIwCisjZGVmaW5lIERMTV9MS0ZfQ09OVkRFQURMSwkweDAwMDAwMDQwCisjZGVmaW5lIERMTV9MS0ZfUEVSU0lTVEVOVAkweDAwMDAwMDgwCisjZGVmaW5lIERMTV9MS0ZfTk9ETENLV1QJMHgwMDAwMDEwMAorI2RlZmluZSBETE1fTEtGX05PRExDS0JMSwkweDAwMDAwMjAwCisjZGVmaW5lIERMTV9MS0ZfRVhQRURJVEUJMHgwMDAwMDQwMAorI2RlZmluZSBETE1fTEtGX05PUVVFVUVCQVNUCTB4MDAwMDA4MDAKKyNkZWZpbmUgRExNX0xLRl9IRUFEUVVFCQkweDAwMDAxMDAwCisjZGVmaW5lIERMTV9MS0ZfTk9PUkRFUgkJMHgwMDAwMjAwMAorI2RlZmluZSBETE1fTEtGX09SUEhBTgkJMHgwMDAwNDAwMAorI2RlZmluZSBETE1fTEtGX0FMVFBSCQkweDAwMDA4MDAwCisjZGVmaW5lIERMTV9MS0ZfQUxUQ1cJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRExNX0xLRl9GT1JDRVVOTE9DSwkweDAwMDIwMDAwCisjZGVmaW5lIERMTV9MS0ZfVElNRU9VVAkJMHgwMDA0MDAwMAorCisvKgorICogU29tZSByZXR1cm4gY29kZXMgdGhhdCBhcmUgbm90IGluIGVycm5vLmgKKyAqLworCisjZGVmaW5lIERMTV9FQ0FOQ0VMCQkweDEwMDAxCisjZGVmaW5lIERMTV9FVU5MT0NLCQkweDEwMDAyCisKK3R5cGVkZWYgdm9pZCBkbG1fbG9ja3NwYWNlX3Q7CisKKy8qCisgKiBMb2NrIHN0YXR1cyBibG9jaworICoKKyAqIFVzZSB0aGlzIHN0cnVjdHVyZSB0byBzcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgbG9jayB2YWx1ZSBibG9jay4gIEZvciBhCisgKiBjb252ZXJzaW9uIHJlcXVlc3QsIHRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jayBJRCBvZiB0aGUKKyAqIGxvY2suICBETE0gd3JpdGVzIHRoZSBzdGF0dXMgb2YgdGhlIGxvY2sgcmVxdWVzdCBhbmQgdGhlIGxvY2sgSUQgYXNzaWduZWQKKyAqIHRvIHRoZSByZXF1ZXN0IGluIHRoZSBsb2NrIHN0YXR1cyBibG9jay4KKyAqCisgKiBzYl9sa2lkOiB0aGUgcmV0dXJuZWQgbG9jayBJRC4gIEl0IGlzIHNldCBvbiBuZXcgKG5vbi1jb252ZXJzaW9uKSByZXF1ZXN0cy4KKyAqIEl0IGlzIGF2YWlsYWJsZSB3aGVuIGRsbV9sb2NrIHJldHVybnMuCisgKgorICogc2JfbHZicHRyOiBzYXZlcyBvciByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgbG9jaydzIExWQiBhY2NvcmRpbmcgdG8gcnVsZXMKKyAqIHNob3duIGZvciB0aGUgRExNX0xLRl9WQUxCTEsgZmxhZy4KKyAqCisgKiBzYl9mbGFnczogRExNX1NCRl9ERU1PVEVEIGlzIHJldHVybmVkIGlmIGluIHRoZSBwcm9jZXNzIG9mIHByb21vdGluZyBhIGxvY2ssCisgKiBpdCB3YXMgZmlyc3QgZGVtb3RlZCB0byBOTCB0byBhdm9pZCBjb252ZXJzaW9uIGRlYWRsb2NrLgorICogRExNX1NCRl9WQUxOT1RWQUxJRCBpcyByZXR1cm5lZCBpZiB0aGUgcmVzb3VyY2UncyBMVkIgaXMgbWFya2VkIGludmFsaWQuCisgKgorICogc2Jfc3RhdHVzOiB0aGUgcmV0dXJuZWQgc3RhdHVzIG9mIHRoZSBsb2NrIHJlcXVlc3Qgc2V0IHByaW9yIHRvIEFTVAorICogZXhlY3V0aW9uLiAgUG9zc2libGUgcmV0dXJuIHZhbHVlczoKKyAqCisgKiAwIGlmIGxvY2sgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bAorICogLUVBR0FJTiBpZiByZXF1ZXN0IHdvdWxkIGJsb2NrIGFuZCBpcyBmbGFnZ2VkIERMTV9MS0ZfTk9RVUVVRQorICogLUVOT01FTSBpZiB0aGVyZSBpcyBubyBtZW1vcnkgdG8gcHJvY2VzcyByZXF1ZXN0CisgKiAtRUlOVkFMIGlmIHRoZXJlIGFyZSBpbnZhbGlkIHBhcmFtZXRlcnMKKyAqIC1ETE1fRVVOTE9DSyBpZiB1bmxvY2sgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bAorICogLURMTV9FQ0FOQ0VMIGlmIGEgY2FuY2VsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAqLworCisjZGVmaW5lIERMTV9TQkZfREVNT1RFRAkJMHgwMQorI2RlZmluZSBETE1fU0JGX1ZBTE5PVFZBTElECTB4MDIKKyNkZWZpbmUgRExNX1NCRl9BTFRNT0RFCQkweDA0CisKK3N0cnVjdCBkbG1fbGtzYiB7CisJaW50IAkgc2Jfc3RhdHVzOworCXVpbnQzMl90IHNiX2xraWQ7CisJY2hhciAJIHNiX2ZsYWdzOworCWNoYXIgKgkgc2JfbHZicHRyOworfTsKKworI2RlZmluZSBETE1fTFNGTF9OT0RJUgkJMHgwMDAwMDAwMQorI2RlZmluZSBETE1fTFNGTF9USU1FV0FSTgkweDAwMDAwMDAyCisjZGVmaW5lIERMTV9MU0ZMX0ZTICAgICAJMHgwMDAwMDAwNAorCisKKyNlbmRpZgkJCQkvKiBfX0RMTV9ET1RfSF9fICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX2RldmljZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbG1fZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5NjhjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX2RldmljZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzICBBbGwgcmlnaHRzIHJlc2VydmVkLgorKiogIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKgorKiogIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorKiogIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisqKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgdGhlIGRldmljZSBpbnRlcmZhY2UgZm9yIGRsbSwgbW9zdCB1c2VycyB3aWxsIHVzZSBhIGxpYnJhcnkKKyAqIGludGVyZmFjZS4KKyAqLworCisjZGVmaW5lIERMTV9VU0VSX0xWQl9MRU4JMzIKKworLyogVmVyc2lvbiBvZiB0aGUgZGV2aWNlIGludGVyZmFjZSAqLworI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fTUFKT1IgNgorI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fTUlOT1IgMAorI2RlZmluZSBETE1fREVWSUNFX1ZFUlNJT05fUEFUQ0ggMAorCisvKiBzdHJ1Y3QgcGFzc2VkIHRvIHRoZSBsb2NrIHdyaXRlICovCitzdHJ1Y3QgZGxtX2xvY2tfcGFyYW1zIHsKKwlfX3U4IG1vZGU7CisJX191OCBuYW1lbGVuOworCV9fdTE2IHVudXNlZDsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiBsa2lkOworCV9fdTMyIHBhcmVudDsKKwlfX3U2NCB4aWQ7CisJX191NjQgdGltZW91dDsKKwl2b2lkICpjYXN0cGFyYW07CisJdm9pZCAqY2FzdGFkZHI7CisJdm9pZCAqYmFzdHBhcmFtOworCXZvaWQgKmJhc3RhZGRyOworCXN0cnVjdCBkbG1fbGtzYiAqbGtzYjsKKwljaGFyIGx2YltETE1fVVNFUl9MVkJfTEVOXTsKKwljaGFyIG5hbWVbMF07Cit9OworCitzdHJ1Y3QgZGxtX2xzcGFjZV9wYXJhbXMgeworCV9fdTMyIGZsYWdzOworCV9fdTMyIG1pbm9yOworCWNoYXIgbmFtZVswXTsKK307CisKK3N0cnVjdCBkbG1fcHVyZ2VfcGFyYW1zIHsKKwlfX3UzMiBub2RlaWQ7CisJX191MzIgcGlkOworfTsKKworc3RydWN0IGRsbV93cml0ZV9yZXF1ZXN0IHsKKwlfX3UzMiB2ZXJzaW9uWzNdOworCV9fdTggY21kOworCV9fdTggaXM2NGJpdDsKKwlfX3U4IHVudXNlZFsyXTsKKworCXVuaW9uICB7CisJCXN0cnVjdCBkbG1fbG9ja19wYXJhbXMgICBsb2NrOworCQlzdHJ1Y3QgZGxtX2xzcGFjZV9wYXJhbXMgbHNwYWNlOworCQlzdHJ1Y3QgZGxtX3B1cmdlX3BhcmFtcyAgcHVyZ2U7CisJfSBpOworfTsKKworc3RydWN0IGRsbV9kZXZpY2VfdmVyc2lvbiB7CisJX191MzIgdmVyc2lvblszXTsKK307CisKKy8qIHN0cnVjdCByZWFkIGZyb20gdGhlICJkZXZpY2UiIGZkLAorICAgY29uc2lzdHMgbWFpbmx5IG9mIHVzZXJzcGFjZSBwb2ludGVycyBmb3IgdGhlIGxpYnJhcnkgdG8gdXNlICovCisKK3N0cnVjdCBkbG1fbG9ja19yZXN1bHQgeworCV9fdTMyIHZlcnNpb25bM107CisJX191MzIgbGVuZ3RoOworCXZvaWQgKiB1c2VyX2FzdGFkZHI7CisJdm9pZCAqIHVzZXJfYXN0cGFyYW07CisJc3RydWN0IGRsbV9sa3NiICogdXNlcl9sa3NiOworCXN0cnVjdCBkbG1fbGtzYiBsa3NiOworCV9fdTggYmFzdF9tb2RlOworCV9fdTggdW51c2VkWzNdOworCS8qIE9mZnNldHMgbWF5IGJlIHplcm8gaWYgbm8gZGF0YSBpcyBwcmVzZW50ICovCisJX191MzIgbHZiX29mZnNldDsKK307CisKKy8qIENvbW1hbmRzIHBhc3NlZCB0byB0aGUgZGV2aWNlICovCisjZGVmaW5lIERMTV9VU0VSX0xPQ0sgICAgICAgICAxCisjZGVmaW5lIERMTV9VU0VSX1VOTE9DSyAgICAgICAyCisjZGVmaW5lIERMTV9VU0VSX1FVRVJZICAgICAgICAzCisjZGVmaW5lIERMTV9VU0VSX0NSRUFURV9MT0NLU1BBQ0UgIDQKKyNkZWZpbmUgRExNX1VTRVJfUkVNT1ZFX0xPQ0tTUEFDRSAgNQorI2RlZmluZSBETE1fVVNFUl9QVVJHRSAgICAgICAgNgorI2RlZmluZSBETE1fVVNFUl9ERUFETE9DSyAgICAgNworCisvKiBBcmJpdHJhcnkgbGVuZ3RoIHJlc3RyaWN0aW9uICovCisjZGVmaW5lIE1BWF9MU19OQU1FX0xFTiA2NAorCisvKiBMb2Nrc3BhY2UgZmxhZ3MgKi8KKyNkZWZpbmUgRExNX1VTRVJfTFNGTEdfQVVUT0ZSRUUgICAxCisjZGVmaW5lIERMTV9VU0VSX0xTRkxHX0ZPUkNFRlJFRSAgMgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9uZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RsbV9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyNzYzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZGxtX25ldGxpbmsuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCisgKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYuMi4KKyAqLworCisjaWZuZGVmIF9ETE1fTkVUTElOS19ICisjZGVmaW5lIF9ETE1fTkVUTElOS19ICisKK2VudW0geworCURMTV9TVEFUVVNfV0FJVElORyA9IDEsCisJRExNX1NUQVRVU19HUkFOVEVEID0gMiwKKwlETE1fU1RBVFVTX0NPTlZFUlQgPSAzLAorfTsKKworI2RlZmluZSBETE1fTE9DS19EQVRBX1ZFUlNJT04gMQorCitzdHJ1Y3QgZGxtX2xvY2tfZGF0YSB7CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MzJfdCBsb2Nrc3BhY2VfaWQ7CisJaW50IG5vZGVpZDsKKwlpbnQgb3ducGlkOworCXVpbnQzMl90IGlkOworCXVpbnQzMl90IHJlbWlkOworCXVpbnQ2NF90IHhpZDsKKwlpbnQ4X3Qgc3RhdHVzOworCWludDhfdCBncm1vZGU7CisJaW50OF90IHJxbW9kZTsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKKwlpbnQgcmVzb3VyY2VfbmFtZWxlbjsKKwljaGFyIHJlc291cmNlX25hbWVbRExNX1JFU05BTUVfTUFYTEVOXTsKK307CisKK2VudW0geworCURMTV9DTURfVU5TUEVDID0gMCwKKwlETE1fQ01EX0hFTExPLAkJLyogdXNlci0+a2VybmVsICovCisJRExNX0NNRF9USU1FT1VULAkvKiBrZXJuZWwtPnVzZXIgKi8KKwlfX0RMTV9DTURfTUFYLAorfTsKKworI2RlZmluZSBETE1fQ01EX01BWCAoX19ETE1fQ01EX01BWCAtIDEpCisKK2VudW0geworCURMTV9UWVBFX1VOU1BFQyA9IDAsCisJRExNX1RZUEVfTE9DSywKKwlfX0RMTV9UWVBFX01BWCwKK307CisKKyNkZWZpbmUgRExNX1RZUEVfTUFYIChfX0RMTV9UWVBFX01BWCAtIDEpCisKKyNkZWZpbmUgRExNX0dFTkxfVkVSU0lPTiAweDEKKyNkZWZpbmUgRExNX0dFTkxfTkFNRSAiRExNIgorCisjZW5kaWYgLyogX0RMTV9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMyODFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwMyBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDUgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgTEdQTC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ETV9JT0NUTF9WNF9ICisjZGVmaW5lIF9MSU5VWF9ETV9JT0NUTF9WNF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIERNX0RJUiAibWFwcGVyIgkJLyogU2xhc2hlcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIERNX01BWF9UWVBFX05BTUUgMTYKKyNkZWZpbmUgRE1fTkFNRV9MRU4gMTI4CisjZGVmaW5lIERNX1VVSURfTEVOIDEyOQorCisvKgorICogQSB0cmFkaXRpb25hbCBpb2N0bCBpbnRlcmZhY2UgZm9yIHRoZSBkZXZpY2UgbWFwcGVyLgorICoKKyAqIEVhY2ggZGV2aWNlIGNhbiBoYXZlIHR3byB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBhbgorICogJ2FjdGl2ZScgdGFibGUgd2hpY2ggaXMgdGhlIG9uZSBjdXJyZW50bHkgdXNlZCBieSBpbyBwYXNzaW5nCisgKiB0aHJvdWdoIHRoZSBkZXZpY2UsIGFuZCBhbiAnaW5hY3RpdmUnIG9uZSB3aGljaCBpcyBhIHRhYmxlCisgKiB0aGF0IGlzIGJlaW5nIHByZXBhcmVkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSAnYWN0aXZlJyBvbmUuCisgKgorICogRE1fVkVSU0lPTjoKKyAqIEp1c3QgZ2V0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgaW9jdGwgaW50ZXJmYWNlLgorICoKKyAqIERNX1JFTU9WRV9BTEw6CisgKiBSZW1vdmUgYWxsIGRtIGRldmljZXMsIGRlc3Ryb3kgYWxsIHRhYmxlcy4gIE9ubHkgcmVhbGx5IHVzZWQKKyAqIGZvciBkZWJ1Zy4KKyAqCisgKiBETV9MSVNUX0RFVklDRVM6CisgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgZG0gZGV2aWNlIG5hbWVzLgorICoKKyAqIERNX0RFVl9DUkVBVEU6CisgKiBDcmVhdGUgYSBuZXcgZGV2aWNlLCBuZWl0aGVyIHRoZSAnYWN0aXZlJyBvciAnaW5hY3RpdmUnIHRhYmxlCisgKiBzbG90cyB3aWxsIGJlIGZpbGxlZC4gIFRoZSBkZXZpY2Ugd2lsbCBiZSBpbiBzdXNwZW5kZWQgc3RhdGUKKyAqIGFmdGVyIGNyZWF0aW9uLCBob3dldmVyIGFueSBpbyB0byB0aGUgZGV2aWNlIHdpbGwgZ2V0IGVycm9yZWQKKyAqIHNpbmNlIGl0IHdpbGwgYmUgb3V0LW9mLWJvdW5kcy4KKyAqCisgKiBETV9ERVZfUkVNT1ZFOgorICogUmVtb3ZlIGEgZGV2aWNlLCBkZXN0cm95IGFueSB0YWJsZXMuCisgKgorICogRE1fREVWX1JFTkFNRToKKyAqIFJlbmFtZSBhIGRldmljZS4KKyAqCisgKiBETV9TVVNQRU5EOgorICogVGhpcyBwZXJmb3JtcyBib3RoIHN1c3BlbmQgYW5kIHJlc3VtZSwgZGVwZW5kaW5nIHdoaWNoIGZsYWcgaXMKKyAqIHBhc3NlZCBpbi4KKyAqIFN1c3BlbmQ6IFRoaXMgY29tbWFuZCB3aWxsIG5vdCByZXR1cm4gdW50aWwgYWxsIHBlbmRpbmcgaW8gdG8KKyAqIHRoZSBkZXZpY2UgaGFzIGNvbXBsZXRlZC4gIEZ1cnRoZXIgaW8gd2lsbCBiZSBkZWZlcnJlZCB1bnRpbAorICogdGhlIGRldmljZSBpcyByZXN1bWVkLgorICogUmVzdW1lOiBJdCBpcyBubyBsb25nZXIgYW4gZXJyb3IgdG8gaXNzdWUgdGhpcyBjb21tYW5kIG9uIGFuCisgKiB1bnN1c3BlbmRlZCBkZXZpY2UuICBJZiBhIHRhYmxlIGlzIHByZXNlbnQgaW4gdGhlICdpbmFjdGl2ZScKKyAqIHNsb3QsIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGFjdGl2ZSBzbG90LCB0aGVuIHRoZSBvbGQgdGFibGUKKyAqIGZyb20gdGhlIGFjdGl2ZSBzbG90IHdpbGwgYmUgX2Rlc3Ryb3llZF8uICBGaW5hbGx5IHRoZSBkZXZpY2UKKyAqIGlzIHJlc3VtZWQuCisgKgorICogRE1fREVWX1NUQVRVUzoKKyAqIFJldHJpZXZlcyB0aGUgc3RhdHVzIGZvciB0aGUgdGFibGUgaW4gdGhlICdhY3RpdmUnIHNsb3QuCisgKgorICogRE1fREVWX1dBSVQ6CisgKiBXYWl0IGZvciBhIHNpZ25pZmljYW50IGV2ZW50IHRvIG9jY3VyIHRvIHRoZSBkZXZpY2UuICBUaGlzCisgKiBjb3VsZCBlaXRoZXIgYmUgY2F1c2VkIGJ5IGFuIGV2ZW50IHRyaWdnZXJlZCBieSBvbmUgb2YgdGhlCisgKiB0YXJnZXRzIG9mIHRoZSB0YWJsZSBpbiB0aGUgJ2FjdGl2ZScgc2xvdCwgb3IgYSB0YWJsZSBjaGFuZ2UuCisgKgorICogRE1fVEFCTEVfTE9BRDoKKyAqIExvYWQgYSB0YWJsZSBpbnRvIHRoZSAnaW5hY3RpdmUnIHNsb3QgZm9yIHRoZSBkZXZpY2UuICBUaGUKKyAqIGRldmljZSBkb2VzIF9ub3RfIG5lZWQgdG8gYmUgc3VzcGVuZGVkIHByaW9yIHRvIHRoaXMgY29tbWFuZC4KKyAqCisgKiBETV9UQUJMRV9DTEVBUjoKKyAqIERlc3Ryb3kgYW55IHRhYmxlIGluIHRoZSAnaW5hY3RpdmUnIHNsb3QgKGllLiBhYm9ydCkuCisgKgorICogRE1fVEFCTEVfREVQUzoKKyAqIFJldHVybiBhIHNldCBvZiBkZXZpY2UgZGVwZW5kZW5jaWVzIGZvciB0aGUgJ2FjdGl2ZScgdGFibGUuCisgKgorICogRE1fVEFCTEVfU1RBVFVTOgorICogUmV0dXJuIHRoZSB0YXJnZXRzIHN0YXR1cyBmb3IgdGhlICdhY3RpdmUnIHRhYmxlLgorICoKKyAqIERNX1RBUkdFVF9NU0c6CisgKiBQYXNzIGEgbWVzc2FnZSBzdHJpbmcgdG8gdGhlIHRhcmdldCBhdCBhIHNwZWNpZmljIG9mZnNldCBvZiBhIGRldmljZS4KKyAqCisgKiBETV9ERVZfU0VUX0dFT01FVFJZOgorICogU2V0IHRoZSBnZW9tZXRyeSBvZiBhIGRldmljZSBieSBwYXNzaW5nIGluIGEgc3RyaW5nIGluIHRoaXMgZm9ybWF0OgorICoKKyAqICJjeWxpbmRlcnMgaGVhZHMgc2VjdG9yc19wZXJfdHJhY2sgc3RhcnRfc2VjdG9yIgorICoKKyAqIEJld2FyZSB0aGF0IENIUyBnZW9tZXRyeSBpcyBuZWFybHkgb2Jzb2xldGUgYW5kIG9ubHkgcHJvdmlkZWQKKyAqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZG0gZGV2aWNlcyB0aGF0IGNhbiBiZSBib290ZWQgYnkgYSBQQworICogQklPUy4gIFNlZSBzdHJ1Y3QgaGRfZ2VvbWV0cnkgZm9yIHJhbmdlIGxpbWl0cy4gIEFsc28gbm90ZSB0aGF0CisgKiB0aGUgZ2VvbWV0cnkgaXMgZXJhc2VkIGlmIHRoZSBkZXZpY2Ugc2l6ZSBjaGFuZ2VzLgorICovCisKKy8qCisgKiBBbGwgaW9jdGwgYXJndW1lbnRzIGNvbnNpc3Qgb2YgYSBzaW5nbGUgY2h1bmsgb2YgbWVtb3J5LCB3aXRoCisgKiB0aGlzIHN0cnVjdHVyZSBhdCB0aGUgc3RhcnQuICBJZiBhIHV1aWQgaXMgc3BlY2lmaWVkIGFueQorICogbG9va3VwIChlZy4gZm9yIGEgRE1fSU5GTykgd2lsbCBiZSBkb25lIG9uIHRoYXQsICpub3QqIHRoZQorICogbmFtZS4KKyAqLworc3RydWN0IGRtX2lvY3RsIHsKKwkvKgorCSAqIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBtYWRlIHVwIG9mIHRocmVlIHBhcnRzOgorCSAqIG1ham9yIC0gbm8gYmFja3dhcmQgb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LAorCSAqIG1pbm9yIC0gb25seSBiYWNrd2FyZHMgY29tcGF0aWJsZSwKKwkgKiBwYXRjaCAtIGJvdGggYmFja3dhcmRzIGFuZCBmb3J3YXJkcyBjb21wYXRpYmxlLgorCSAqCisJICogQWxsIGNsaWVudHMgb2YgdGhlIGlvY3RsIGludGVyZmFjZSBzaG91bGQgZmlsbCBpbiB0aGUKKwkgKiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgdGhleSB3ZXJlCisJICogY29tcGlsZWQgd2l0aC4KKwkgKgorCSAqIEFsbCByZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIChpZS4gdGhvc2UgdGhhdCBkb24ndAorCSAqIHJldHVybiAtRU5PVFRZKSBmaWxsIG91dCB0aGlzIGZpZWxkLCBldmVuIGlmIHRoZQorCSAqIGNvbW1hbmQgZmFpbGVkLgorCSAqLworCXVpbnQzMl90IHZlcnNpb25bM107CS8qIGluL291dCAqLworCXVpbnQzMl90IGRhdGFfc2l6ZTsJLyogdG90YWwgc2l6ZSBvZiBkYXRhIHBhc3NlZCBpbgorCQkJCSAqIGluY2x1ZGluZyB0aGlzIHN0cnVjdCAqLworCisJdWludDMyX3QgZGF0YV9zdGFydDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGRhdGEKKwkJCQkgKiByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIHN0cnVjdCAqLworCisJdWludDMyX3QgdGFyZ2V0X2NvdW50OwkvKiBpbi9vdXQgKi8KKwlpbnQzMl90IG9wZW5fY291bnQ7CS8qIG91dCAqLworCXVpbnQzMl90IGZsYWdzOwkJLyogaW4vb3V0ICovCisJdWludDMyX3QgZXZlbnRfbnI7ICAgICAgCS8qIGluL291dCAqLworCXVpbnQzMl90IHBhZGRpbmc7CisKKwl1aW50NjRfdCBkZXY7CQkvKiBpbi9vdXQgKi8KKworCWNoYXIgbmFtZVtETV9OQU1FX0xFTl07CS8qIGRldmljZSBuYW1lICovCisJY2hhciB1dWlkW0RNX1VVSURfTEVOXTsJLyogdW5pcXVlIGlkZW50aWZpZXIgZm9yCisJCQkJICogdGhlIGJsb2NrIGRldmljZSAqLworCWNoYXIgZGF0YVs3XTsJCS8qIHBhZGRpbmcgb3IgZGF0YSAqLworfTsKKworLyoKKyAqIFVzZWQgdG8gc3BlY2lmeSB0YWJsZXMuICBUaGVzZSBzdHJ1Y3R1cmVzIGFwcGVhciBhZnRlciB0aGUKKyAqIGRtX2lvY3RsLgorICovCitzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgeworCXVpbnQ2NF90IHNlY3Rvcl9zdGFydDsKKwl1aW50NjRfdCBsZW5ndGg7CisJaW50MzJfdCBzdGF0dXM7CQkvKiB1c2VkIHdoZW4gcmVhZGluZyBmcm9tIGtlcm5lbCBvbmx5ICovCisKKwkvKgorCSAqIExvY2F0aW9uIG9mIHRoZSBuZXh0IGRtX3RhcmdldF9zcGVjLgorCSAqIC0gV2hlbiBzcGVjaWZ5aW5nIHRhcmdldHMgb24gYSBETV9UQUJMRV9MT0FEIGNvbW1hbmQsIHRoaXMgdmFsdWUgaXMKKwkgKiAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlICJjdXJyZW50IiBkbV90YXJnZXRfc3BlYworCSAqICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAibmV4dCIgZG1fdGFyZ2V0X3NwZWMuCisJICogLSBXaGVuIHJldHJpZXZpbmcgdGFyZ2V0cyBvbiBhIERNX1RBQkxFX1NUQVRVUyBjb21tYW5kLCB0aGlzIHZhbHVlCisJICogICBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBkbV90YXJnZXRfc3BlYworCSAqICAgKHRoYXQgZm9sbG93cyB0aGUgZG1faW9jdGwgc3RydWN0KSB0byB0aGUgc3RhcnQgb2YgdGhlICJuZXh0IgorCSAqICAgZG1fdGFyZ2V0X3NwZWMuCisJICovCisJdWludDMyX3QgbmV4dDsKKworCWNoYXIgdGFyZ2V0X3R5cGVbRE1fTUFYX1RZUEVfTkFNRV07CisKKwkvKgorCSAqIFBhcmFtZXRlciBzdHJpbmcgc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgb2JqZWN0LgorCSAqIEJlIGNhcmVmdWwgdG8gYWRkIHBhZGRpbmcgYWZ0ZXIgc3RyaW5nIHRvIGVuc3VyZSBjb3JyZWN0CisJICogYWxpZ25tZW50IG9mIHN1YnNlcXVlbnQgZG1fdGFyZ2V0X3NwZWMuCisJICovCit9OworCisvKgorICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IGRlcGVuZGVuY2llcy4KKyAqLworc3RydWN0IGRtX3RhcmdldF9kZXBzIHsKKwl1aW50MzJfdCBjb3VudDsJLyogQXJyYXkgc2l6ZSAqLworCXVpbnQzMl90IHBhZGRpbmc7CS8qIHVudXNlZCAqLworCXVpbnQ2NF90IGRldlswXTsJLyogb3V0ICovCit9OworCisvKgorICogVXNlZCB0byBnZXQgYSBsaXN0IG9mIGFsbCBkbSBkZXZpY2VzLgorICovCitzdHJ1Y3QgZG1fbmFtZV9saXN0IHsKKwl1aW50NjRfdCBkZXY7CisJdWludDMyX3QgbmV4dDsJCS8qIG9mZnNldCB0byB0aGUgbmV4dCByZWNvcmQgZnJvbQorCQkJCSAgIHRoZSBfc3RhcnRfIG9mIHRoaXMgKi8KKwljaGFyIG5hbWVbMF07Cit9OworCisvKgorICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IHZlcnNpb25zCisgKi8KK3N0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMgeworICAgICAgICB1aW50MzJfdCBuZXh0OworICAgICAgICB1aW50MzJfdCB2ZXJzaW9uWzNdOworCisgICAgICAgIGNoYXIgbmFtZVswXTsKK307CisKKy8qCisgKiBVc2VkIHRvIHBhc3MgbWVzc2FnZSB0byBhIHRhcmdldAorICovCitzdHJ1Y3QgZG1fdGFyZ2V0X21zZyB7CisJdWludDY0X3Qgc2VjdG9yOwkvKiBEZXZpY2Ugc2VjdG9yICovCisKKwljaGFyIG1lc3NhZ2VbMF07Cit9OworCisvKgorICogSWYgeW91IGNoYW5nZSB0aGlzIG1ha2Ugc3VyZSB5b3UgbWFrZSB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2UKKyAqIHRvIGRtLWlvY3RsLmM6bG9va3VwX2lvY3RsKCkKKyAqLworZW51bSB7CisJLyogVG9wIGxldmVsIGNtZHMgKi8KKwlETV9WRVJTSU9OX0NNRCA9IDAsCisJRE1fUkVNT1ZFX0FMTF9DTUQsCisJRE1fTElTVF9ERVZJQ0VTX0NNRCwKKworCS8qIGRldmljZSBsZXZlbCBjbWRzICovCisJRE1fREVWX0NSRUFURV9DTUQsCisJRE1fREVWX1JFTU9WRV9DTUQsCisJRE1fREVWX1JFTkFNRV9DTUQsCisJRE1fREVWX1NVU1BFTkRfQ01ELAorCURNX0RFVl9TVEFUVVNfQ01ELAorCURNX0RFVl9XQUlUX0NNRCwKKworCS8qIFRhYmxlIGxldmVsIGNtZHMgKi8KKwlETV9UQUJMRV9MT0FEX0NNRCwKKwlETV9UQUJMRV9DTEVBUl9DTUQsCisJRE1fVEFCTEVfREVQU19DTUQsCisJRE1fVEFCTEVfU1RBVFVTX0NNRCwKKworCS8qIEFkZGVkIGxhdGVyICovCisJRE1fTElTVF9WRVJTSU9OU19DTUQsCisJRE1fVEFSR0VUX01TR19DTUQsCisJRE1fREVWX1NFVF9HRU9NRVRSWV9DTUQKK307CisKKy8qCisgKiBUaGUgZG1faW9jdGwgc3RydWN0IHBhc3NlZCBpbnRvIHRoZSBpb2N0bCBpcyBqdXN0IHRoZSBoZWFkZXIKKyAqIG9uIGEgbGFyZ2VyIGNodW5rIG9mIG1lbW9yeS4gIE9uIHg4Ni02NCBhbmQgb3RoZXIKKyAqIGFyY2hpdGVjdHVyZXMgdGhlIGRtLWlvY3RsIHN0cnVjdCB3aWxsIGJlIHBhZGRlZCB0byBhbiA4IGJ5dGUKKyAqIGJvdW5kYXJ5IHNvIHRoZSBzaXplIHdpbGwgYmUgZGlmZmVyZW50LCB3aGljaCB3b3VsZCBjaGFuZ2UgdGhlCisgKiBpb2N0bCBjb2RlIC0geWVzIEkgcmVhbGx5IG1lc3NlZCB1cC4gIFRoaXMgaGFjayBmb3JjZXMgdGhlc2UKKyAqIGFyY2hpdGVjdHVyZXMgdG8gaGF2ZSB0aGUgY29ycmVjdCBpb2N0bCBjb2RlLgorICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAordHlwZWRlZiBjaGFyIGlvY3RsX3N0cnVjdFszMDhdOworI2RlZmluZSBETV9WRVJTSU9OXzMyICAgICAgIF9JT1dSKERNX0lPQ1RMLCBETV9WRVJTSU9OX0NNRCwgaW9jdGxfc3RydWN0KQorI2RlZmluZSBETV9SRU1PVkVfQUxMXzMyICAgIF9JT1dSKERNX0lPQ1RMLCBETV9SRU1PVkVfQUxMX0NNRCwgaW9jdGxfc3RydWN0KQorI2RlZmluZSBETV9MSVNUX0RFVklDRVNfMzIgIF9JT1dSKERNX0lPQ1RMLCBETV9MSVNUX0RFVklDRVNfQ01ELCBpb2N0bF9zdHJ1Y3QpCisKKyNkZWZpbmUgRE1fREVWX0NSRUFURV8zMiAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX0NSRUFURV9DTUQsIGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgRE1fREVWX1JFTU9WRV8zMiAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1JFTU9WRV9DTUQsIGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgRE1fREVWX1JFTkFNRV8zMiAgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1JFTkFNRV9DTUQsIGlvY3RsX3N0cnVjdCkKKyNkZWZpbmUgRE1fREVWX1NVU1BFTkRfMzIgICBfSU9XUihETV9JT0NUTCwgRE1fREVWX1NVU1BFTkRfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIERNX0RFVl9TVEFUVVNfMzIgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TVEFUVVNfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIERNX0RFVl9XQUlUXzMyICAgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9XQUlUX0NNRCwgaW9jdGxfc3RydWN0KQorCisjZGVmaW5lIERNX1RBQkxFX0xPQURfMzIgICAgX0lPV1IoRE1fSU9DVEwsIERNX1RBQkxFX0xPQURfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIERNX1RBQkxFX0NMRUFSXzMyICAgX0lPV1IoRE1fSU9DVEwsIERNX1RBQkxFX0NMRUFSX0NNRCwgaW9jdGxfc3RydWN0KQorI2RlZmluZSBETV9UQUJMRV9ERVBTXzMyICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9ERVBTX0NNRCwgaW9jdGxfc3RydWN0KQorI2RlZmluZSBETV9UQUJMRV9TVEFUVVNfMzIgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9TVEFUVVNfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIERNX0xJU1RfVkVSU0lPTlNfMzIgX0lPV1IoRE1fSU9DVEwsIERNX0xJU1RfVkVSU0lPTlNfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIERNX1RBUkdFVF9NU0dfMzIgICAgX0lPV1IoRE1fSU9DVEwsIERNX1RBUkdFVF9NU0dfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZGVmaW5lIERNX0RFVl9TRVRfR0VPTUVUUllfMzIJX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TRVRfR0VPTUVUUllfQ01ELCBpb2N0bF9zdHJ1Y3QpCisjZW5kaWYKKworI2RlZmluZSBETV9JT0NUTCAweGZkCisKKyNkZWZpbmUgRE1fVkVSU0lPTiAgICAgICBfSU9XUihETV9JT0NUTCwgRE1fVkVSU0lPTl9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fUkVNT1ZFX0FMTCAgICBfSU9XUihETV9JT0NUTCwgRE1fUkVNT1ZFX0FMTF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fTElTVF9ERVZJQ0VTICBfSU9XUihETV9JT0NUTCwgRE1fTElTVF9ERVZJQ0VTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX0RFVl9DUkVBVEUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9DUkVBVEVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9SRU1PVkUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU1PVkVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9SRU5BTUUgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU5BTUVfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TVVNQRU5EICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TVVNQRU5EX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfU1RBVFVTICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU1RBVFVTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9ERVZfV0FJVCAgICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfV0FJVF9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKworI2RlZmluZSBETV9UQUJMRV9MT0FEICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9MT0FEX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorI2RlZmluZSBETV9UQUJMRV9DTEVBUiAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9DTEVBUl9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fVEFCTEVfREVQUyAgICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfREVQU19DTUQsIHN0cnVjdCBkbV9pb2N0bCkKKyNkZWZpbmUgRE1fVEFCTEVfU1RBVFVTICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfU1RBVFVTX0NNRCwgc3RydWN0IGRtX2lvY3RsKQorCisjZGVmaW5lIERNX0xJU1RfVkVSU0lPTlMgX0lPV1IoRE1fSU9DVEwsIERNX0xJU1RfVkVSU0lPTlNfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fVEFSR0VUX01TRwkgX0lPV1IoRE1fSU9DVEwsIERNX1RBUkdFVF9NU0dfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisjZGVmaW5lIERNX0RFVl9TRVRfR0VPTUVUUlkJX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TRVRfR0VPTUVUUllfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCisKKyNkZWZpbmUgRE1fVkVSU0lPTl9NQUpPUgk0CisjZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMTIKKyNkZWZpbmUgRE1fVkVSU0lPTl9QQVRDSExFVkVMCTAKKyNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDA3LTEwLTAyKSIKKworLyogU3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgRE1fUkVBRE9OTFlfRkxBRwkoMSA8PCAwKSAvKiBJbi9PdXQgKi8KKyNkZWZpbmUgRE1fU1VTUEVORF9GTEFHCQkoMSA8PCAxKSAvKiBJbi9PdXQgKi8KKyNkZWZpbmUgRE1fUEVSU0lTVEVOVF9ERVZfRkxBRwkoMSA8PCAzKSAvKiBJbiAqLworCisvKgorICogRmxhZyBwYXNzZWQgaW50byBpb2N0bCBTVEFUVVMgY29tbWFuZCB0byBnZXQgdGFibGUgaW5mb3JtYXRpb24KKyAqIHJhdGhlciB0aGFuIGN1cnJlbnQgc3RhdHVzLgorICovCisjZGVmaW5lIERNX1NUQVRVU19UQUJMRV9GTEFHCSgxIDw8IDQpIC8qIEluICovCisKKy8qCisgKiBGbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgYSB0YWJsZSBpcyBwcmVzZW50IGluIGVpdGhlciBvZgorICogdGhlIHR3byB0YWJsZSBzbG90cyB0aGF0IGEgZGV2aWNlIGhhcy4KKyAqLworI2RlZmluZSBETV9BQ1RJVkVfUFJFU0VOVF9GTEFHICAgKDEgPDwgNSkgLyogT3V0ICovCisjZGVmaW5lIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRyAoMSA8PCA2KSAvKiBPdXQgKi8KKworLyoKKyAqIEluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgcGFzc2VkIGluIHdhc24ndCBiaWcgZW5vdWdoIGZvciB0aGUKKyAqIHJlc3VsdHMuCisgKi8KKyNkZWZpbmUgRE1fQlVGRkVSX0ZVTExfRkxBRwkoMSA8PCA4KSAvKiBPdXQgKi8KKworLyoKKyAqIFRoaXMgZmxhZyBpcyBub3cgaWdub3JlZC4KKyAqLworI2RlZmluZSBETV9TS0lQX0JER0VUX0ZMQUcJKDEgPDwgOSkgLyogSW4gKi8KKworLyoKKyAqIFNldCB0aGlzIHRvIGF2b2lkIGF0dGVtcHRpbmcgdG8gZnJlZXplIGFueSBmaWxlc3lzdGVtIHdoZW4gc3VzcGVuZGluZy4KKyAqLworI2RlZmluZSBETV9TS0lQX0xPQ0tGU19GTEFHCSgxIDw8IDEwKSAvKiBJbiAqLworCisvKgorICogU2V0IHRoaXMgdG8gc3VzcGVuZCB3aXRob3V0IGZsdXNoaW5nIHF1ZXVlZCBpb3MuCisgKi8KKyNkZWZpbmUgRE1fTk9GTFVTSF9GTEFHCQkoMSA8PCAxMSkgLyogSW4gKi8KKworI2VuZGlmCQkJCS8qIF9MSU5VWF9ETV9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiYmEwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZG4uaApAQCAtMCwwICsxLDE0NyBAQAorI2lmbmRlZiBfTElOVVhfRE5fSAorI2RlZmluZSBfTElOVVhfRE5fSAorCisvKgorCisJREVDbmV0IERhdGEgU3RydWN0dXJlcyBhbmQgQ29uc3RhbnRzCisKKyovCisKKy8qIAorICogRE5QUk9UT19OU1AgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgU09MX1NPQ0tFVCwgCisgKiBzbyBpbmNyZW1lbnQgZWFjaCBieSBvbmUgKGNvbXBhcmVkIHRvIFVMVFJJWCkKKyAqLworI2RlZmluZSBETlBST1RPX05TUCAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgLyogTlNQIHByb3RvY29sIG51bWJlciAgICAgICAqLworI2RlZmluZSBETlBST1RPX1JPVSAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgLyogUm91dGluZyBwcm90b2NvbCBudW1iZXIgICAqLworI2RlZmluZSBETlBST1RPX05NTCAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgLyogTmV0IG1ndCBwcm90b2NvbCBudW1iZXIgICAqLworI2RlZmluZSBETlBST1RPX0VWTCAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgLyogRXZsIHByb3RvY29sIG51bWJlciAodXNyKSAqLworI2RlZmluZSBETlBST1RPX0VWUiAgICAgNiAgICAgICAgICAgICAgICAgICAgICAgLyogRXZsIHByb3RvY29sIG51bWJlciAoZXZsKSAqLworI2RlZmluZSBETlBST1RPX05TUFQgICAgNyAgICAgICAgICAgICAgICAgICAgICAgLyogTlNQIHRyYWNlIHByb3RvY29sIG51bWJlciAqLworCisKKyNkZWZpbmUgRE5fQURETAkJMgorI2RlZmluZSBETl9NQVhBRERMCTIgLyogVUxUUklYIGhlYWRlcnMgaGF2ZSAyMCBoZXJlLCBidXQgcGF0aHdvcmtzIGhhcyAyICovCisjZGVmaW5lIEROX01BWE9QVEwJMTYKKyNkZWZpbmUgRE5fTUFYT0JKTAkxNgorI2RlZmluZSBETl9NQVhBQ0NMCTQwCisjZGVmaW5lIEROX01BWEFMSUFTTAkxMjgKKyNkZWZpbmUgRE5fTUFYTk9ERUwJMjU2CisjZGVmaW5lIEROQlVGU0laRQk2NTAyMworCisvKiAKKyAqIFNFVC9HRVQgU29ja2V0IG9wdGlvbnMgIC0gbXVzdCBtYXRjaCB0aGUgRFNPXyBudW1iZXJzIGJlbG93CisgKi8KKyNkZWZpbmUgU09fQ09OREFUQSAgICAgIDEKKyNkZWZpbmUgU09fQ09OQUNDRVNTICAgIDIKKyNkZWZpbmUgU09fUFJPWFlVU1IgICAgIDMKKyNkZWZpbmUgU09fTElOS0lORk8gICAgIDcKKworI2RlZmluZSBEU09fQ09OREFUQSAgICAgMSAgICAgICAgLyogU2V0L0dldCBjb25uZWN0IGRhdGEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0RJU0RBVEEgICAgIDEwICAgICAgIC8qIFNldC9HZXQgZGlzY29ubmVjdCBkYXRhICAgICAgICAgICAgICovCisjZGVmaW5lIERTT19DT05BQ0NFU1MgICAyICAgICAgICAvKiBTZXQvR2V0IGNvbm5lY3QgYWNjZXNzIGRhdGEgICAgICAgICAqLworI2RlZmluZSBEU09fQUNDRVBUTU9ERSAgNCAgICAgICAgLyogU2V0L0dldCBhY2NlcHQgbW9kZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0NPTkFDQ0VQVCAgIDUgICAgICAgIC8qIEFjY2VwdCBkZWZlcnJlZCBjb25uZWN0aW9uICAgICAgICAgICovCisjZGVmaW5lIERTT19DT05SRUpFQ1QgICA2ICAgICAgICAvKiBSZWplY3QgZGVmZXJyZWQgY29ubmVjdGlvbiAgICAgICAgICAqLworI2RlZmluZSBEU09fTElOS0lORk8gICAgNyAgICAgICAgLyogU2V0L0dldCBsaW5rIGluZm9ybWF0aW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX1NUUkVBTSAgICAgIDggICAgICAgIC8qIFNldCBzb2NrZXQgdHlwZSB0byBzdHJlYW0gICAgICAgICAgICovCisjZGVmaW5lIERTT19TRVFQQUNLRVQgICA5ICAgICAgICAvKiBTZXQgc29ja2V0IHR5cGUgdG8gc2VxdWVuY2VkIHBhY2tldCAqLworI2RlZmluZSBEU09fTUFYV0lORE9XICAgMTEgICAgICAgLyogTWF4aW11bSB3aW5kb3cgc2l6ZSBhbGxvd2VkICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX05PREVMQVkJMTIgICAgICAgLyogVHVybiBvZmYgbmFnbGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFNPX0NPUksgICAgICAgIDEzICAgICAgIC8qIFdhaXQgZm9yIG1vcmUgZGF0YSEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERTT19TRVJWSUNFUwkxNCAgICAgICAvKiBOU1AgU2VydmljZXMgZmllbGQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fSU5GTwkxNSAgICAgICAvKiBOU1AgSW5mbyBmaWVsZCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU09fTUFYICAgICAgICAgMTUgICAgICAgLyogTWF4aW11bSBvcHRpb24gbnVtYmVyICAgICAgICAgICAgICAgKi8KKworCisvKiBMSU5LIFN0YXRlcyAqLworI2RlZmluZSBMTF9JTkFDVElWRQkwCisjZGVmaW5lIExMX0NPTk5FQ1RJTkcJMQorI2RlZmluZSBMTF9SVU5OSU5HCTIKKyNkZWZpbmUgTExfRElTQ09OTkVDVElORyAzCisKKyNkZWZpbmUgQUNDX0lNTUVEIDAKKyNkZWZpbmUgQUNDX0RFRkVSIDEKKworI2RlZmluZSBTREZfV0lMRCAgICAgICAgMSAgICAgICAgICAgICAgICAgIC8qIFdpbGQgY2FyZCBvYmplY3QgICAgICAgICAgKi8KKyNkZWZpbmUgU0RGX1BST1hZICAgICAgIDIgICAgICAgICAgICAgICAgICAvKiBBZGRyIGVsaWdpYmxlIGZvciBwcm94eSAgICovCisjZGVmaW5lIFNERl9VSUNQUk9YWSAgICA0ICAgICAgICAgICAgICAgICAgLyogVXNlIHVpYy1iYXNlZCBwcm94eSAgICAgICAqLworCisvKiBTdHJ1Y3R1cmVzICovCisKKworc3RydWN0IGRuX25hZGRyIAoreworCV9fbGUxNgkJYV9sZW47CisJX191OCBhX2FkZHJbRE5fTUFYQURETF07IC8qIFR3byBieXRlcyBsaXR0bGUgZW5kaWFuICovCit9OworCitzdHJ1Y3Qgc29ja2FkZHJfZG4KK3sKKwlfX3UxNgkJc2RuX2ZhbWlseTsKKwlfX3U4CQlzZG5fZmxhZ3M7CisJX191OAkJc2RuX29iam51bTsKKwlfX2xlMTYJCXNkbl9vYmpuYW1lbDsKKwlfX3U4CQlzZG5fb2JqbmFtZVtETl9NQVhPQkpMXTsKKwlzdHJ1Y3QgICBkbl9uYWRkcglzZG5fYWRkOworfTsKKyNkZWZpbmUgc2RuX25vZGVhZGRybCAgIHNkbl9hZGQuYV9sZW4gICAvKiBOb2RlIGFkZHJlc3MgbGVuZ3RoICAqLworI2RlZmluZSBzZG5fbm9kZWFkZHIgICAgc2RuX2FkZC5hX2FkZHIgIC8qIE5vZGUgYWRkcmVzcyAgICAgICAgICovCisKKworCisvKgorICogREVDbmV0IHNldC9nZXQgRFNPX0NPTkRBVEEsIERTT19ESVNEQVRBIChvcHRpb25hbCBkYXRhKSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IG9wdGRhdGFfZG4geworICAgICAgICBfX2xlMTYgIG9wdF9zdGF0dXM7ICAgICAvKiBFeHRlbmRlZCBzdGF0dXMgcmV0dXJuICovCisjZGVmaW5lIG9wdF9zdHMgb3B0X3N0YXR1cworICAgICAgICBfX2xlMTYgIG9wdF9vcHRsOyAgICAgICAvKiBMZW5ndGggb2YgdXNlciBkYXRhICAgICovCisgICAgICAgIF9fdTggICBvcHRfZGF0YVsxNl07ICAgLyogVXNlciBkYXRhICAgICAgICAgICAgICAqLworfTsKKworc3RydWN0IGFjY2Vzc2RhdGFfZG4KK3sKKwlfX3U4CQlhY2NfYWNjbDsKKwlfX3U4CQlhY2NfYWNjW0ROX01BWEFDQ0xdOworCV9fdTggCQlhY2NfcGFzc2w7CisJX191OAkJYWNjX3Bhc3NbRE5fTUFYQUNDTF07CisJX191OCAJCWFjY191c2VybDsKKwlfX3U4CQlhY2NfdXNlcltETl9NQVhBQ0NMXTsKK307CisKKy8qCisgKiBERUNuZXQgbG9naWNhbCBsaW5rIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgbGlua2luZm9fZG4geworICAgICAgICBfX3UxNiAgaWRuX3NlZ3NpemU7ICAgIC8qIFNlZ21lbnQgc2l6ZSBmb3IgbGluayAqLworICAgICAgICBfX3U4ICAgaWRuX2xpbmtzdGF0ZTsgIC8qIExvZ2ljYWwgbGluayBzdGF0ZSAgICAqLworfTsKKworLyoKKyAqIEV0aGVybmV0IGFkZHJlc3MgZm9ybWF0IChmb3IgREVDbmV0KQorICovCit1bmlvbiBldGhlcmFkZHJlc3MgeworICAgICAgICBfX3U4IGRuZV9hZGRyWzZdOyAgICAgICAgICAgICAvKiBGdWxsIGV0aGVybmV0IGFkZHJlc3MgKi8KKyAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICBfX3U4IGRuZV9oaW9yZFs0XTsgICAgLyogREVDbmV0IEhJT1JEIHByZWZpeCAgICovCisgICAgICAgICAgICAgICAgX191OCBkbmVfbm9kZWFkZHJbMl07IC8qIERFQ25ldCBub2RlIGFkZHJlc3MgICAqLworICB9IGRuZV9yZW1vdGU7Cit9OworCisKKy8qCisgKiBERUNuZXQgcGh5c2ljYWwgc29ja2V0IGFkZHJlc3MgZm9ybWF0CisgKi8KK3N0cnVjdCBkbl9hZGRyIHsKKyAgICAgICAgX19sZTE2IGRuYV9mYW1pbHk7ICAgICAgLyogQUZfREVDbmV0ICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdW5pb24gZXRoZXJhZGRyZXNzIGRuYV9uZXRhZGRyOyAvKiBERUNuZXQgZXRoZXJuZXQgYWRkcmVzcyAqLworfTsKKworI2RlZmluZSBERUNORVRfSU9DVExfQkFTRSAweDg5IC8qIFBST1RPUFJJVkFURSByYW5nZSAqLworCisjZGVmaW5lIFNJT0NTTkVUQUREUiAgX0lPVyhERUNORVRfSU9DVExfQkFTRSwgMHhlMCwgc3RydWN0IGRuX25hZGRyKQorI2RlZmluZSBTSU9DR05FVEFERFIgIF9JT1IoREVDTkVUX0lPQ1RMX0JBU0UsIDB4ZTEsIHN0cnVjdCBkbl9uYWRkcikKKyNkZWZpbmUgT1NJT0NTTkVUQUREUiBfSU9XKERFQ05FVF9JT0NUTF9CQVNFLCAweGUwLCBpbnQpCisjZGVmaW5lIE9TSU9DR05FVEFERFIgX0lPUihERUNORVRfSU9DVExfQkFTRSwgMHhlMSwgaW50KQorCisjZW5kaWYgLyogX0xJTlVYX0ROX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHFibGtfdjEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHFibGtfdjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2YxMjUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kcWJsa192MS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKglGaWxlIHdpdGggaW4tbWVtb3J5IHN0cnVjdHVyZXMgb2Ygb2xkIHF1b3RhIGZvcm1hdAorICovCisKKyNpZm5kZWYgX0xJTlVYX0RRQkxLX1YxX0gKKyNkZWZpbmUgX0xJTlVYX0RRQkxLX1YxX0gKKworLyogSWQgb2YgcXVvdGEgZm9ybWF0ICovCisjZGVmaW5lIFFGTVRfVkZTX09MRCAxCisKKy8qIFJvb3Qgc3F1YXNoIHR1cm5lZCBvbiAqLworI2RlZmluZSBWMV9EUUZfUlNRVUFTSCAxCisKKy8qIE51bWJlcnMgb2YgYmxvY2tzIG5lZWRlZCBmb3IgdXBkYXRlcyAqLworI2RlZmluZSBWMV9JTklUX0FMTE9DIDEKKyNkZWZpbmUgVjFfSU5JVF9SRVdSSVRFIDEKKyNkZWZpbmUgVjFfREVMX0FMTE9DIDAKKyNkZWZpbmUgVjFfREVMX1JFV1JJVEUgMgorCisvKiBTcGVjaWFsIGluZm9ybWF0aW9uIGFib3V0IHF1b3RhZmlsZSAqLworc3RydWN0IHYxX21lbV9kcWluZm8geworfTsKKworI2VuZGlmCS8qIF9MSU5VWF9EUUJMS19WMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RxYmxrX3YyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RxYmxrX3YyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4NTMzMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHFibGtfdjIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICoJRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBmb3IgdmZzdjAgcXVvdGEgZm9ybWF0CisgKi8KKworI2lmbmRlZiBfTElOVVhfRFFCTEtfVjJfSAorI2RlZmluZSBfTElOVVhfRFFCTEtfVjJfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogaWQgbnVtYmVycyBvZiBxdW90YSBmb3JtYXQgKi8KKyNkZWZpbmUgUUZNVF9WRlNfVjAgMgorCisvKiBOdW1iZXJzIG9mIGJsb2NrcyBuZWVkZWQgZm9yIHVwZGF0ZXMgKi8KKyNkZWZpbmUgVjJfSU5JVF9BTExPQyA0CisjZGVmaW5lIFYyX0lOSVRfUkVXUklURSAyCisjZGVmaW5lIFYyX0RFTF9BTExPQyAwCisjZGVmaW5lIFYyX0RFTF9SRVdSSVRFIDYKKworLyogSW5tZW1vcnkgY29weSBvZiB2ZXJzaW9uIHNwZWNpZmljIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgdjJfbWVtX2RxaW5mbyB7CisJdW5zaWduZWQgaW50IGRxaV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGRxaV9mcmVlX2JsazsKKwl1bnNpZ25lZCBpbnQgZHFpX2ZyZWVfZW50cnk7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0RRQkxLX1YyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHFibGtfeGZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RxYmxrX3hmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzUwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2RxYmxrX3hmcy5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LTIwMDEsMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NldCBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpZm5kZWYgX0xJTlVYX0RRQkxLX1hGU19ICisjZGVmaW5lIF9MSU5VWF9EUUJMS19YRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIERpc2sgcXVvdGEgLSBxdW90YWN0bCgyKSBjb21tYW5kcyBmb3IgdGhlIFhGUyBRdW90YSBNYW5hZ2VyIChYUU0pLgorICovCisKKyNkZWZpbmUgWFFNX0NNRCh4KQkoKCdYJzw8OCkrKHgpKQkvKiBub3RlOiBmb3JtcyBmaXJzdCBRQ01EIGFyZ3VtZW50ICovCisjZGVmaW5lIFhRTV9DT01NQU5EKHgpCSgoKHgpICYgKDB4ZmY8PDgpKSA9PSAoJ1gnPDw4KSkJLyogdGVzdCBpZiBmb3IgWEZTICovCisKKyNkZWZpbmUgWFFNX1VTUlFVT1RBCTAJLyogc3lzdGVtIGNhbGwgdXNlciBxdW90YSB0eXBlICovCisjZGVmaW5lIFhRTV9HUlBRVU9UQQkxCS8qIHN5c3RlbSBjYWxsIGdyb3VwIHF1b3RhIHR5cGUgKi8KKyNkZWZpbmUgWFFNX1BSSlFVT1RBCTIJLyogc3lzdGVtIGNhbGwgcHJvamVjdCBxdW90YSB0eXBlICovCisjZGVmaW5lIFhRTV9NQVhRVU9UQVMJMworCisjZGVmaW5lIFFfWFFVT1RBT04JWFFNX0NNRCgxKQkvKiBlbmFibGUgYWNjb3VudGluZy9lbmZvcmNlbWVudCAqLworI2RlZmluZSBRX1hRVU9UQU9GRglYUU1fQ01EKDIpCS8qIGRpc2FibGUgYWNjb3VudGluZy9lbmZvcmNlbWVudCAqLworI2RlZmluZSBRX1hHRVRRVU9UQQlYUU1fQ01EKDMpCS8qIGdldCBkaXNrIGxpbWl0cyBhbmQgdXNhZ2UgKi8KKyNkZWZpbmUgUV9YU0VUUUxJTQlYUU1fQ01EKDQpCS8qIHNldCBkaXNrIGxpbWl0cyAqLworI2RlZmluZSBRX1hHRVRRU1RBVAlYUU1fQ01EKDUpCS8qIGdldCBxdW90YSBzdWJzeXN0ZW0gc3RhdHVzICovCisjZGVmaW5lIFFfWFFVT1RBUk0JWFFNX0NNRCg2KQkvKiBmcmVlIGRpc2sgc3BhY2UgdXNlZCBieSBkcXVvdHMgKi8KKyNkZWZpbmUgUV9YUVVPVEFTWU5DCVhRTV9DTUQoNykJLyogZGVsYWxsb2MgZmx1c2gsIHVwZGF0ZXMgZHF1b3RzICovCisKKy8qCisgKiBmc19kaXNrX3F1b3RhIHN0cnVjdHVyZToKKyAqCisgKiBUaGlzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHF1b3RhIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhIHVzZXIvcHJvai9ncm91cC4KKyAqIEl0IGlzIDY0LWJpdCBhbGlnbmVkLCBhbmQgYWxsIHRoZSBibGsgdW5pdHMgYXJlIGluIEJCcyAoQmFzaWMgQmxvY2tzKSBvZgorICogNTEyIGJ5dGVzLgorICovCisjZGVmaW5lIEZTX0RRVU9UX1ZFUlNJT04JMQkvKiBmc19kaXNrX3F1b3RhLmRfdmVyc2lvbiAqLwordHlwZWRlZiBzdHJ1Y3QgZnNfZGlza19xdW90YSB7CisJX19zOAkJZF92ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0dXJlICovCisJX19zOAkJZF9mbGFnczsJLyogWEZTX3tVU0VSLFBST0osR1JPVVB9X1FVT1RBICovCisJX191MTYJCWRfZmllbGRtYXNrOwkvKiBmaWVsZCBzcGVjaWZpZXIgKi8KKwlfX3UzMgkJZF9pZDsJCS8qIHVzZXIsIHByb2plY3QsIG9yIGdyb3VwIElEICovCisJX191NjQJCWRfYmxrX2hhcmRsaW1pdDsvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlfX3U2NAkJZF9ibGtfc29mdGxpbWl0Oy8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlfX3U2NAkJZF9pbm9faGFyZGxpbWl0Oy8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisJX191NjQJCWRfaW5vX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX3U2NAkJZF9iY291bnQ7CS8qICMgZGlzayBibG9ja3Mgb3duZWQgYnkgdGhlIHVzZXIgKi8KKwlfX3U2NAkJZF9pY291bnQ7CS8qICMgaW5vZGVzIG93bmVkIGJ5IHRoZSB1c2VyICovCisJX19zMzIJCWRfaXRpbWVyOwkvKiB6ZXJvIGlmIHdpdGhpbiBpbm9kZSBsaW1pdHMgKi8KKwkJCQkJLyogaWYgbm90LCB3ZSByZWZ1c2Ugc2VydmljZSAqLworCV9fczMyCQlkX2J0aW1lcjsJLyogc2ltaWxhciB0byBhYm92ZTsgZm9yIGRpc2sgYmxvY2tzICovCisJX191MTYJICAJZF9pd2FybnM7ICAgICAgIC8qICMgd2FybmluZ3MgaXNzdWVkIHdydCBudW0gaW5vZGVzICovCisJX191MTYJICAJZF9id2FybnM7ICAgICAgIC8qICMgd2FybmluZ3MgaXNzdWVkIHdydCBkaXNrIGJsb2NrcyAqLworCV9fczMyCQlkX3BhZGRpbmcyOwkvKiBwYWRkaW5nMiAtIGZvciBmdXR1cmUgdXNlICovCisJX191NjQJCWRfcnRiX2hhcmRsaW1pdDsvKiBhYnNvbHV0ZSBsaW1pdCBvbiByZWFsdGltZSBibGtzICovCisJX191NjQJCWRfcnRiX3NvZnRsaW1pdDsvKiBwcmVmZXJyZWQgbGltaXQgb24gUlQgZGlzayBibGtzICovCisJX191NjQJCWRfcnRiY291bnQ7CS8qICMgcmVhbHRpbWUgYmxvY2tzIG93bmVkICovCisJX19zMzIJCWRfcnRidGltZXI7CS8qIHNpbWlsYXIgdG8gYWJvdmU7IGZvciBSVCBkaXNrIGJsa3MgKi8KKwlfX3UxNgkgIAlkX3J0Yndhcm5zOyAgICAgLyogIyB3YXJuaW5ncyBpc3N1ZWQgd3J0IFJUIGRpc2sgYmxrcyAqLworCV9fczE2CQlkX3BhZGRpbmczOwkvKiBwYWRkaW5nMyAtIGZvciBmdXR1cmUgdXNlICovCQorCWNoYXIJCWRfcGFkZGluZzRbOF07CS8qIHlldCBtb3JlIHBhZGRpbmcgKi8KK30gZnNfZGlza19xdW90YV90OworCisvKgorICogVGhlc2UgZmllbGRzIGFyZSBzZW50IHRvIFFfWFNFVFFMSU0gdG8gc3BlY2lmeSBmaWVsZHMgdGhhdCBuZWVkIHRvIGNoYW5nZS4KKyAqLworI2RlZmluZSBGU19EUV9JU09GVAkoMTw8MCkKKyNkZWZpbmUgRlNfRFFfSUhBUkQJKDE8PDEpCisjZGVmaW5lIEZTX0RRX0JTT0ZUCSgxPDwyKQorI2RlZmluZSBGU19EUV9CSEFSRCAJKDE8PDMpCisjZGVmaW5lIEZTX0RRX1JUQlNPRlQJKDE8PDQpCisjZGVmaW5lIEZTX0RRX1JUQkhBUkQJKDE8PDUpCisjZGVmaW5lIEZTX0RRX0xJTUlUX01BU0sJKEZTX0RRX0lTT0ZUIHwgRlNfRFFfSUhBUkQgfCBGU19EUV9CU09GVCB8IFwKKwkJCQkgRlNfRFFfQkhBUkQgfCBGU19EUV9SVEJTT0ZUIHwgRlNfRFFfUlRCSEFSRCkKKy8qCisgKiBUaGVzZSB0aW1lcnMgY2FuIG9ubHkgYmUgc2V0IGluIHN1cGVyIHVzZXIncyBkcXVvdC4gRm9yIG90aGVycywgdGltZXJzIGFyZQorICogYXV0b21hdGljYWxseSBzdGFydGVkIGFuZCBzdG9wcGVkLiBTdXBlcnVzZXJzIHRpbWVyIHZhbHVlcyBzZXQgdGhlIGxpbWl0cworICogZm9yIHRoZSByZXN0LiAgSW4gY2FzZSB0aGVzZSB2YWx1ZXMgYXJlIHplcm8sIHRoZSBEUV97RixCfVRJTUVMSU1JVCB2YWx1ZXMKKyAqIGRlZmluZWQgYmVsb3cgYXJlIHVzZWQuIAorICogVGhlc2UgdmFsdWVzIGFsc28gYXBwbHkgb25seSB0byB0aGUgZF9maWVsZG1hc2sgZmllbGQgZm9yIFFfWFNFVFFMSU0uCisgKi8KKyNkZWZpbmUgRlNfRFFfQlRJTUVSCSgxPDw2KQorI2RlZmluZSBGU19EUV9JVElNRVIJKDE8PDcpCisjZGVmaW5lIEZTX0RRX1JUQlRJTUVSIAkoMTw8OCkKKyNkZWZpbmUgRlNfRFFfVElNRVJfTUFTSwkoRlNfRFFfQlRJTUVSIHwgRlNfRFFfSVRJTUVSIHwgRlNfRFFfUlRCVElNRVIpCisKKy8qCisgKiBXYXJuaW5nIGNvdW50cyBhcmUgc2V0IGluIGJvdGggc3VwZXIgdXNlcidzIGRxdW90IGFuZCBvdGhlcnMuIEZvciBvdGhlcnMsCisgKiB3YXJuaW5ncyBhcmUgc2V0L2NsZWFyZWQgYnkgdGhlIGFkbWluaXN0cmF0b3JzIChvciBhdXRvbWF0aWNhbGx5IGJ5IGdvaW5nCisgKiBiZWxvdyB0aGUgc29mdCBsaW1pdCkuICBTdXBlcnVzZXJzIHdhcm5pbmcgdmFsdWVzIHNldCB0aGUgd2FybmluZyBsaW1pdHMKKyAqIGZvciB0aGUgcmVzdC4gIEluIGNhc2UgdGhlc2UgdmFsdWVzIGFyZSB6ZXJvLCB0aGUgRFFfe0YsQn1XQVJOTElNSVQgdmFsdWVzCisgKiBkZWZpbmVkIGJlbG93IGFyZSB1c2VkLiAKKyAqIFRoZXNlIHZhbHVlcyBhbHNvIGFwcGx5IG9ubHkgdG8gdGhlIGRfZmllbGRtYXNrIGZpZWxkIGZvciBRX1hTRVRRTElNLgorICovCisjZGVmaW5lIEZTX0RRX0JXQVJOUwkoMTw8OSkKKyNkZWZpbmUgRlNfRFFfSVdBUk5TCSgxPDwxMCkKKyNkZWZpbmUgRlNfRFFfUlRCV0FSTlMJKDE8PDExKQorI2RlZmluZSBGU19EUV9XQVJOU19NQVNLCShGU19EUV9CV0FSTlMgfCBGU19EUV9JV0FSTlMgfCBGU19EUV9SVEJXQVJOUykKKworLyoKKyAqIFZhcmlvdXMgZmxhZ3MgcmVsYXRlZCB0byBxdW90YWN0bCgyKS4gIE9ubHkgcmVsZXZhbnQgdG8gWEZTIGZpbGVzeXN0ZW1zLgorICovCisjZGVmaW5lIFhGU19RVU9UQV9VRFFfQUNDVAkoMTw8MCkgIC8qIHVzZXIgcXVvdGEgYWNjb3VudGluZyAqLworI2RlZmluZSBYRlNfUVVPVEFfVURRX0VORkQJKDE8PDEpICAvKiB1c2VyIHF1b3RhIGxpbWl0cyBlbmZvcmNlbWVudCAqLworI2RlZmluZSBYRlNfUVVPVEFfR0RRX0FDQ1QJKDE8PDIpICAvKiBncm91cCBxdW90YSBhY2NvdW50aW5nICovCisjZGVmaW5lIFhGU19RVU9UQV9HRFFfRU5GRAkoMTw8MykgIC8qIGdyb3VwIHF1b3RhIGxpbWl0cyBlbmZvcmNlbWVudCAqLworI2RlZmluZSBYRlNfUVVPVEFfUERRX0FDQ1QJKDE8PDQpICAvKiBwcm9qZWN0IHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgWEZTX1FVT1RBX1BEUV9FTkZECSgxPDw1KSAgLyogcHJvamVjdCBxdW90YSBsaW1pdHMgZW5mb3JjZW1lbnQgKi8KKworI2RlZmluZSBYRlNfVVNFUl9RVU9UQQkJKDE8PDApCS8qIHVzZXIgcXVvdGEgdHlwZSAqLworI2RlZmluZSBYRlNfUFJPSl9RVU9UQQkJKDE8PDEpCS8qIHByb2plY3QgcXVvdGEgdHlwZSAqLworI2RlZmluZSBYRlNfR1JPVVBfUVVPVEEJCSgxPDwyKQkvKiBncm91cCBxdW90YSB0eXBlICovCisKKy8qCisgKiBmc19xdW90YV9zdGF0IGlzIHRoZSBzdHJ1Y3QgcmV0dXJuZWQgaW4gUV9YR0VUUVNUQVQgZm9yIGEgZ2l2ZW4gZmlsZSBzeXN0ZW0uCisgKiBQcm92aWRlcyBhIGNlbnRyYWxpemVkIHdheSB0byBnZXQgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcXVvdGEgc3Vic3lzdGVtLgorICogZWcuIHNwYWNlIHRha2VuIHVwIGZvciB1c2VyIGFuZCBncm91cCBxdW90YXMsIG51bWJlciBvZiBkcXVvdHMgY3VycmVudGx5CisgKiBpbmNvcmUuCisgKi8KKyNkZWZpbmUgRlNfUVNUQVRfVkVSU0lPTgkxCS8qIGZzX3F1b3RhX3N0YXQucXNfdmVyc2lvbiAqLworCisvKgorICogU29tZSBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCAncXVvdGEgZmlsZXMnLgorICovCit0eXBlZGVmIHN0cnVjdCBmc19xZmlsZXN0YXQgeworCV9fdTY0CQlxZnNfaW5vOwkvKiBpbm9kZSBudW1iZXIgKi8KKwlfX3U2NAkJcWZzX25ibGtzOwkvKiBudW1iZXIgb2YgQkJzIDUxMi1ieXRlLWJsa3MgKi8KKwlfX3UzMgkJcWZzX25leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyAqLworfSBmc19xZmlsZXN0YXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZnNfcXVvdGFfc3RhdCB7CisJX19zOAkJcXNfdmVyc2lvbjsJLyogdmVyc2lvbiBudW1iZXIgZm9yIGZ1dHVyZSBjaGFuZ2VzICovCisJX191MTYJCXFzX2ZsYWdzOwkvKiBYRlNfUVVPVEFfe1UsUCxHfURRX3tBQ0NULEVORkR9ICovCisJX19zOAkJcXNfcGFkOwkJLyogdW51c2VkICovCisJZnNfcWZpbGVzdGF0X3QJcXNfdXF1b3RhOwkvKiB1c2VyIHF1b3RhIHN0b3JhZ2UgaW5mb3JtYXRpb24gKi8KKwlmc19xZmlsZXN0YXRfdAlxc19ncXVvdGE7CS8qIGdyb3VwIHF1b3RhIHN0b3JhZ2UgaW5mb3JtYXRpb24gKi8KKwlfX3UzMgkJcXNfaW5jb3JlZHFzOwkvKiBudW1iZXIgb2YgZHF1b3RzIGluY29yZSAqLworCV9fczMyCQlxc19idGltZWxpbWl0OyAgLyogbGltaXQgZm9yIGJsa3MgdGltZXIgKi8JCisJX19zMzIJCXFzX2l0aW1lbGltaXQ7ICAvKiBsaW1pdCBmb3IgaW5vZGVzIHRpbWVyICovCQorCV9fczMyCQlxc19ydGJ0aW1lbGltaXQ7LyogbGltaXQgZm9yIHJ0IGJsa3MgdGltZXIgKi8JCisJX191MTYJCXFzX2J3YXJubGltaXQ7CS8qIGxpbWl0IGZvciBudW0gd2FybmluZ3MgKi8KKwlfX3UxNgkJcXNfaXdhcm5saW1pdDsJLyogbGltaXQgZm9yIG51bSB3YXJuaW5ncyAqLworfSBmc19xdW90YV9zdGF0X3Q7CisKKyNlbmRpZgkvKiBfTElOVVhfRFFCTEtfWEZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMGU2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogYXVkaW8uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgTGVzc2VyIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJBVURJT19IXworI2RlZmluZSBfRFZCQVVESU9fSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU09VUkNFX0RFTVVYLCAvKiBTZWxlY3QgdGhlIGRlbXV4IGFzIHRoZSBtYWluIHNvdXJjZSAqLworCUFVRElPX1NPVVJDRV9NRU1PUlkgLyogU2VsZWN0IGludGVybmFsIG1lbW9yeSBhcyB0aGUgbWFpbiBzb3VyY2UgKi8KK30gYXVkaW9fc3RyZWFtX3NvdXJjZV90OworCisKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU1RPUFBFRCwgICAgICAvKiBEZXZpY2UgaXMgc3RvcHBlZCAqLworCUFVRElPX1BMQVlJTkcsICAgICAgLyogRGV2aWNlIGlzIGN1cnJlbnRseSBwbGF5aW5nICovCisJQVVESU9fUEFVU0VEICAgICAgICAvKiBEZXZpY2UgaXMgcGF1c2VkICovCit9IGF1ZGlvX3BsYXlfc3RhdGVfdDsKKworCit0eXBlZGVmIGVudW0geworCUFVRElPX1NURVJFTywKKwlBVURJT19NT05PX0xFRlQsCisJQVVESU9fTU9OT19SSUdIVCwKKwlBVURJT19NT05PLAorCUFVRElPX1NURVJFT19TV0FQUEVECit9IGF1ZGlvX2NoYW5uZWxfc2VsZWN0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fbWl4ZXIgeworCXVuc2lnbmVkIGludCB2b2x1bWVfbGVmdDsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX3JpZ2h0OworICAvLyB3aGF0IGVsc2UgZG8gd2UgbmVlZD8gYmFzcywgcGFzcy10aHJvdWdoLCAuLi4KK30gYXVkaW9fbWl4ZXJfdDsKKworCit0eXBlZGVmIHN0cnVjdCBhdWRpb19zdGF0dXMgeworCWludCAgICAgICAgICAgICAgICAgICAgQVZfc3luY19zdGF0ZTsgIC8qIHN5bmMgYXVkaW8gYW5kIHZpZGVvPyAqLworCWludCAgICAgICAgICAgICAgICAgICAgbXV0ZV9zdGF0ZTsgICAgIC8qIGF1ZGlvIGlzIG11dGVkICovCisJYXVkaW9fcGxheV9zdGF0ZV90ICAgICBwbGF5X3N0YXRlOyAgICAgLyogY3VycmVudCBwbGF5YmFjayBzdGF0ZSAqLworCWF1ZGlvX3N0cmVhbV9zb3VyY2VfdCAgc3RyZWFtX3NvdXJjZTsgIC8qIGN1cnJlbnQgc3RyZWFtIHNvdXJjZSAqLworCWF1ZGlvX2NoYW5uZWxfc2VsZWN0X3QgY2hhbm5lbF9zZWxlY3Q7IC8qIGN1cnJlbnRseSBzZWxlY3RlZCBjaGFubmVsICovCisJaW50ICAgICAgICAgICAgICAgICAgICBieXBhc3NfbW9kZTsgICAgLyogcGFzcyBvbiBhdWRpbyBkYXRhIHRvICovCisJYXVkaW9fbWl4ZXJfdAkgICAgICAgbWl4ZXJfc3RhdGU7ICAgIC8qIGN1cnJlbnQgbWl4ZXIgc3RhdGUgKi8KK30gYXVkaW9fc3RhdHVzX3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VwYXJhdGUgZGVjb2RlciBoYXJkd2FyZSAqLworCisKK3R5cGVkZWYKK3N0cnVjdCBhdWRpb19rYXJhb2tleyAgLyogaWYgVm9jYWwxIG9yIFZvY2FsMiBhcmUgbm9uLXplcm8sIHRoZXkgZ2V0IG1peGVkICAqLworCWludCB2b2NhbDE7ICAgIC8qIGludG8gbGVmdCBhbmQgcmlnaHQgdCBhdCA3MCUgZWFjaCAqLworCWludCB2b2NhbDI7ICAgIC8qIGlmIGJvdGgsIFZvY2FsMSBhbmQgVm9jYWwyIGFyZSBub24temVybywgVm9jYWwxIGdldHMqLworCWludCBtZWxvZHk7ICAgIC8qIG1peGVkIGludG8gdGhlIGxlZnQgY2hhbm5lbCBhbmQgKi8KKwkJICAgICAgIC8qIFZvY2FsMiBpbnRvIHRoZSByaWdodCBjaGFubmVsIGF0IDEwMCUgZWFjaC4gKi8KKwkJICAgICAgIC8qIGlmIE1lbG9keSBpcyBub24temVybywgdGhlIG1lbG9keSBjaGFubmVsIGdldHMgbWl4ZWQqLworfSBhdWRpb19rYXJhb2tlX3Q7ICAgICAvKiBpbnRvIGxlZnQgYW5kIHJpZ2h0ICAqLworCisKK3R5cGVkZWYgdWludDE2X3QgYXVkaW9fYXR0cmlidXRlc190OworLyogICBiaXRzOiBkZXNjci4gKi8KKy8qICAgMTUtMTMgYXVkaW8gY29kaW5nIG1vZGUgKDA9YWMzLCAyPW1wZWcxLCAzPW1wZWcyZXh0LCA0PUxQQ00sIDY9RFRTLCAqLworLyogICAxMiAgICBtdWx0aWNoYW5uZWwgZXh0ZW5zaW9uICovCisvKiAgIDExLTEwIGF1ZGlvIHR5cGUgKDA9bm90IHNwZWMsIDE9bGFuZ3VhZ2UgaW5jbHVkZWQpICovCisvKiAgICA5LSA4IGF1ZGlvIGFwcGxpY2F0aW9uIG1vZGUgKDA9bm90IHNwZWMsIDE9a2FyYW9rZSwgMj1zdXJyb3VuZCkgKi8KKy8qICAgIDctIDYgUXVhbnRpemF0aW9uIC8gRFJDIChtcGVnIGF1ZGlvOiAxPURSQyBleGlzdHMpKGxwY206IDA9MTZiaXQsICAqLworLyogICAgNS0gNCBTYW1wbGUgZnJlcXVlbmN5IGZzICgwPTQ4a0h6LCAxPTk2a0h6KSAqLworLyogICAgMi0gMCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKG4rMSBjaGFubmVscykgKi8KKworCisvKiBmb3IgR0VUX0NBUEFCSUxJVElFUyBhbmQgU0VUX0ZPUk1BVCwgdGhlIGxhdHRlciBzaG91bGQgb25seSBzZXQgb25lIGJpdCAqLworI2RlZmluZSBBVURJT19DQVBfRFRTICAgIDEKKyNkZWZpbmUgQVVESU9fQ0FQX0xQQ00gICAyCisjZGVmaW5lIEFVRElPX0NBUF9NUDEgICAgNAorI2RlZmluZSBBVURJT19DQVBfTVAyICAgIDgKKyNkZWZpbmUgQVVESU9fQ0FQX01QMyAgIDE2CisjZGVmaW5lIEFVRElPX0NBUF9BQUMgICAzMgorI2RlZmluZSBBVURJT19DQVBfT0dHICAgNjQKKyNkZWZpbmUgQVVESU9fQ0FQX1NERFMgMTI4CisjZGVmaW5lIEFVRElPX0NBUF9BQzMgIDI1NgorCisjZGVmaW5lIEFVRElPX1NUT1AgICAgICAgICAgICAgICAgIF9JTygnbycsIDEpCisjZGVmaW5lIEFVRElPX1BMQVkgICAgICAgICAgICAgICAgIF9JTygnbycsIDIpCisjZGVmaW5lIEFVRElPX1BBVVNFICAgICAgICAgICAgICAgIF9JTygnbycsIDMpCisjZGVmaW5lIEFVRElPX0NPTlRJTlVFICAgICAgICAgICAgIF9JTygnbycsIDQpCisjZGVmaW5lIEFVRElPX1NFTEVDVF9TT1VSQ0UgICAgICAgIF9JTygnbycsIDUpCisjZGVmaW5lIEFVRElPX1NFVF9NVVRFICAgICAgICAgICAgIF9JTygnbycsIDYpCisjZGVmaW5lIEFVRElPX1NFVF9BVl9TWU5DICAgICAgICAgIF9JTygnbycsIDcpCisjZGVmaW5lIEFVRElPX1NFVF9CWVBBU1NfTU9ERSAgICAgIF9JTygnbycsIDgpCisjZGVmaW5lIEFVRElPX0NIQU5ORUxfU0VMRUNUICAgICAgIF9JTygnbycsIDkpCisjZGVmaW5lIEFVRElPX0dFVF9TVEFUVVMgICAgICAgICAgIF9JT1IoJ28nLCAxMCwgYXVkaW9fc3RhdHVzX3QpCisKKyNkZWZpbmUgQVVESU9fR0VUX0NBUEFCSUxJVElFUyAgICAgX0lPUignbycsIDExLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEFVRElPX0NMRUFSX0JVRkZFUiAgICAgICAgIF9JTygnbycsICAxMikKKyNkZWZpbmUgQVVESU9fU0VUX0lEICAgICAgICAgICAgICAgX0lPKCdvJywgMTMpCisjZGVmaW5lIEFVRElPX1NFVF9NSVhFUiAgICAgICAgICAgIF9JT1coJ28nLCAxNCwgYXVkaW9fbWl4ZXJfdCkKKyNkZWZpbmUgQVVESU9fU0VUX1NUUkVBTVRZUEUgICAgICAgX0lPKCdvJywgMTUpCisjZGVmaW5lIEFVRElPX1NFVF9FWFRfSUQgICAgICAgICAgIF9JTygnbycsIDE2KQorI2RlZmluZSBBVURJT19TRVRfQVRUUklCVVRFUyAgICAgICBfSU9XKCdvJywgMTcsIGF1ZGlvX2F0dHJpYnV0ZXNfdCkKKyNkZWZpbmUgQVVESU9fU0VUX0tBUkFPS0UgICAgICAgICAgX0lPVygnbycsIDE4LCBhdWRpb19rYXJhb2tlX3QpCisKKy8qKgorICogQVVESU9fR0VUX1BUUworICoKKyAqIFJlYWQgdGhlIDMzIGJpdCBwcmVzZW50YXRpb24gdGltZSBzdGFtcCBhcyBkZWZpbmVkCisgKiBpbiBJVFUgVC1SRUMtSC4yMjIuMCAvIElTTy9JRUMgMTM4MTgtMS4KKyAqCisgKiBUaGUgUFRTIHNob3VsZCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBwbGF5ZWQKKyAqIGZyYW1lIGlmIHBvc3NpYmxlLCBidXQgbWF5IGFsc28gYmUgYSB2YWx1ZSBjbG9zZSB0byBpdAorICogbGlrZSB0aGUgUFRTIG9mIHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgb3IgdGhlIGxhc3QgUFRTCisgKiBleHRyYWN0ZWQgYnkgdGhlIFBFUyBwYXJzZXIuCisgKi8KKyNkZWZpbmUgQVVESU9fR0VUX1BUUyAgICAgICAgICAgICAgX0lPUignbycsIDE5LCBfX3U2NCkKKyNkZWZpbmUgQVVESU9fQklMSU5HVUFMX0NIQU5ORUxfU0VMRUNUIF9JTygnbycsIDIwKQorCisjZW5kaWYgLyogX0RWQkFVRElPX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9jYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTg1MzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvY2EuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogY2EuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBSYWxwaCAgTWV0emxlciA8cmFscGhAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICYgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgTGVzc2VyIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJDQV9IXworI2RlZmluZSBfRFZCQ0FfSF8KKworLyogc2xvdCBpbnRlcmZhY2UgdHlwZXMgYW5kIGluZm8gKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2Ffc2xvdF9pbmZvIHsKKwlpbnQgbnVtOyAgICAgICAgICAgICAgIC8qIHNsb3QgbnVtYmVyICovCisKKwlpbnQgdHlwZTsgICAgICAgICAgICAgIC8qIENBIGludGVyZmFjZSB0aGlzIHNsb3Qgc3VwcG9ydHMgKi8KKyNkZWZpbmUgQ0FfQ0kgICAgICAgICAgICAxICAgICAvKiBDSSBoaWdoIGxldmVsIGludGVyZmFjZSAqLworI2RlZmluZSBDQV9DSV9MSU5LICAgICAgIDIgICAgIC8qIENJIGxpbmsgbGF5ZXIgbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIENBX0NJX1BIWVMgICAgICAgNCAgICAgLyogQ0kgcGh5c2ljYWwgbGF5ZXIgbGV2ZWwgaW50ZXJmYWNlICovCisjZGVmaW5lIENBX0RFU0NSICAgICAgICAgOCAgICAgLyogYnVpbHQtaW4gZGVzY3JhbWJsZXIgKi8KKyNkZWZpbmUgQ0FfU0MgICAgICAgICAgMTI4ICAgICAvKiBzaW1wbGUgc21hcnQgY2FyZCBpbnRlcmZhY2UgKi8KKworCXVuc2lnbmVkIGludCBmbGFnczsKKyNkZWZpbmUgQ0FfQ0lfTU9EVUxFX1BSRVNFTlQgMSAvKiBtb2R1bGUgKG9yIGNhcmQpIGluc2VydGVkICovCisjZGVmaW5lIENBX0NJX01PRFVMRV9SRUFEWSAgIDIKK30gY2Ffc2xvdF9pbmZvX3Q7CisKKworLyogZGVzY3JhbWJsZXIgdHlwZXMgYW5kIGluZm8gKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2FfZGVzY3JfaW5mbyB7CisJdW5zaWduZWQgaW50IG51bTsgICAgICAgICAgLyogbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNjcmFtYmxlcnMgKGtleXMpICovCisJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgLyogdHlwZSBvZiBzdXBwb3J0ZWQgc2NyYW1ibGluZyBzeXN0ZW0gKi8KKyNkZWZpbmUgQ0FfRUNEICAgICAgICAgICAxCisjZGVmaW5lIENBX05EUyAgICAgICAgICAgMgorI2RlZmluZSBDQV9EU1MgICAgICAgICAgIDQKK30gY2FfZGVzY3JfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBjYV9jYXBzIHsKKwl1bnNpZ25lZCBpbnQgc2xvdF9udW07ICAgICAvKiB0b3RhbCBudW1iZXIgb2YgQ0EgY2FyZCBhbmQgbW9kdWxlIHNsb3RzICovCisJdW5zaWduZWQgaW50IHNsb3RfdHlwZTsgICAgLyogT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAqLworCXVuc2lnbmVkIGludCBkZXNjcl9udW07ICAgIC8qIHRvdGFsIG51bWJlciBvZiBkZXNjcmFtYmxlciBzbG90cyAoa2V5cykgKi8KKwl1bnNpZ25lZCBpbnQgZGVzY3JfdHlwZTsgICAvKiBPUiBvZiBhbGwgc3VwcG9ydGVkIHR5cGVzICovCit9IGNhX2NhcHNfdDsKKworLyogYSBtZXNzYWdlIHRvL2Zyb20gYSBDSS1DQU0gKi8KK3R5cGVkZWYgc3RydWN0IGNhX21zZyB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciBtc2dbMjU2XTsKK30gY2FfbXNnX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhX2Rlc2NyIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHBhcml0eTsJLyogMCA9PSBldmVuLCAxID09IG9kZCAqLworCXVuc2lnbmVkIGNoYXIgY3dbOF07Cit9IGNhX2Rlc2NyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhX3BpZCB7CisJdW5zaWduZWQgaW50IHBpZDsKKwlpbnQgaW5kZXg7CQkvKiAtMSA9PSBkaXNhYmxlKi8KK30gY2FfcGlkX3Q7CisKKyNkZWZpbmUgQ0FfUkVTRVQgICAgICAgICAgX0lPKCdvJywgMTI4KQorI2RlZmluZSBDQV9HRVRfQ0FQICAgICAgICBfSU9SKCdvJywgMTI5LCBjYV9jYXBzX3QpCisjZGVmaW5lIENBX0dFVF9TTE9UX0lORk8gIF9JT1IoJ28nLCAxMzAsIGNhX3Nsb3RfaW5mb190KQorI2RlZmluZSBDQV9HRVRfREVTQ1JfSU5GTyBfSU9SKCdvJywgMTMxLCBjYV9kZXNjcl9pbmZvX3QpCisjZGVmaW5lIENBX0dFVF9NU0cgICAgICAgIF9JT1IoJ28nLCAxMzIsIGNhX21zZ190KQorI2RlZmluZSBDQV9TRU5EX01TRyAgICAgICBfSU9XKCdvJywgMTMzLCBjYV9tc2dfdCkKKyNkZWZpbmUgQ0FfU0VUX0RFU0NSICAgICAgX0lPVygnbycsIDEzNCwgY2FfZGVzY3JfdCkKKyNkZWZpbmUgQ0FfU0VUX1BJRCAgICAgICAgX0lPVygnbycsIDEzNSwgY2FfcGlkX3QpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvZG14LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI5ZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvZG14LmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBkbXguaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJETVhfSF8KKyNkZWZpbmUgX0RWQkRNWF9IXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisKKyNkZWZpbmUgRE1YX0ZJTFRFUl9TSVpFIDE2CisKK3R5cGVkZWYgZW51bQoreworCURNWF9PVVRfREVDT0RFUiwgLyogU3RyZWFtaW5nIGRpcmVjdGx5IHRvIGRlY29kZXIuICovCisJRE1YX09VVF9UQVAsICAgICAvKiBPdXRwdXQgZ29pbmcgdG8gYSBtZW1vcnkgYnVmZmVyICovCisJCQkgLyogKHRvIGJlIHJldHJpZXZlZCB2aWEgdGhlIHJlYWQgY29tbWFuZCkuKi8KKwlETVhfT1VUX1RTX1RBUCAgIC8qIE91dHB1dCBtdWx0aXBsZXhlZCBpbnRvIGEgbmV3IFRTICAqLworCQkJIC8qICh0byBiZSByZXRyaWV2ZWQgYnkgcmVhZGluZyBmcm9tIHRoZSAqLworCQkJIC8qIGxvZ2ljYWwgRFZSIGRldmljZSkuICAgICAgICAgICAgICAgICAqLworfSBkbXhfb3V0cHV0X3Q7CisKKwordHlwZWRlZiBlbnVtCit7CisJRE1YX0lOX0ZST05URU5ELCAvKiBJbnB1dCBmcm9tIGEgZnJvbnQtZW5kIGRldmljZS4gICovCisJRE1YX0lOX0RWUiAgICAgICAvKiBJbnB1dCBmcm9tIHRoZSBsb2dpY2FsIERWUiBkZXZpY2UuICAqLworfSBkbXhfaW5wdXRfdDsKKworCit0eXBlZGVmIGVudW0KK3sKKwlETVhfUEVTX0FVRElPMCwKKwlETVhfUEVTX1ZJREVPMCwKKwlETVhfUEVTX1RFTEVURVhUMCwKKwlETVhfUEVTX1NVQlRJVExFMCwKKwlETVhfUEVTX1BDUjAsCisKKwlETVhfUEVTX0FVRElPMSwKKwlETVhfUEVTX1ZJREVPMSwKKwlETVhfUEVTX1RFTEVURVhUMSwKKwlETVhfUEVTX1NVQlRJVExFMSwKKwlETVhfUEVTX1BDUjEsCisKKwlETVhfUEVTX0FVRElPMiwKKwlETVhfUEVTX1ZJREVPMiwKKwlETVhfUEVTX1RFTEVURVhUMiwKKwlETVhfUEVTX1NVQlRJVExFMiwKKwlETVhfUEVTX1BDUjIsCisKKwlETVhfUEVTX0FVRElPMywKKwlETVhfUEVTX1ZJREVPMywKKwlETVhfUEVTX1RFTEVURVhUMywKKwlETVhfUEVTX1NVQlRJVExFMywKKwlETVhfUEVTX1BDUjMsCisKKwlETVhfUEVTX09USEVSCit9IGRteF9wZXNfdHlwZV90OworCisjZGVmaW5lIERNWF9QRVNfQVVESU8gICAgRE1YX1BFU19BVURJTzAKKyNkZWZpbmUgRE1YX1BFU19WSURFTyAgICBETVhfUEVTX1ZJREVPMAorI2RlZmluZSBETVhfUEVTX1RFTEVURVhUIERNWF9QRVNfVEVMRVRFWFQwCisjZGVmaW5lIERNWF9QRVNfU1VCVElUTEUgRE1YX1BFU19TVUJUSVRMRTAKKyNkZWZpbmUgRE1YX1BFU19QQ1IgICAgICBETVhfUEVTX1BDUjAKKworCit0eXBlZGVmIHN0cnVjdCBkbXhfZmlsdGVyCit7CisJX191OCAgZmlsdGVyW0RNWF9GSUxURVJfU0laRV07CisJX191OCAgbWFza1tETVhfRklMVEVSX1NJWkVdOworCV9fdTggIG1vZGVbRE1YX0ZJTFRFUl9TSVpFXTsKK30gZG14X2ZpbHRlcl90OworCisKK3N0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2ZpbHRlcl90ICAgZmlsdGVyOworCV9fdTMyICAgICAgICAgIHRpbWVvdXQ7CisJX191MzIgICAgICAgICAgZmxhZ3M7CisjZGVmaW5lIERNWF9DSEVDS19DUkMgICAgICAgMQorI2RlZmluZSBETVhfT05FU0hPVCAgICAgICAgIDIKKyNkZWZpbmUgRE1YX0lNTUVESUFURV9TVEFSVCA0CisjZGVmaW5lIERNWF9LRVJORUxfQ0xJRU5UICAgMHg4MDAwCit9OworCisKK3N0cnVjdCBkbXhfcGVzX2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2lucHV0X3QgICAgaW5wdXQ7CisJZG14X291dHB1dF90ICAgb3V0cHV0OworCWRteF9wZXNfdHlwZV90IHBlc190eXBlOworCV9fdTMyICAgICAgICAgIGZsYWdzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZG14X2NhcHMgeworCV9fdTMyIGNhcHM7CisJaW50IG51bV9kZWNvZGVyczsKK30gZG14X2NhcHNfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlETVhfU09VUkNFX0ZST05UMCA9IDAsCisJRE1YX1NPVVJDRV9GUk9OVDEsCisJRE1YX1NPVVJDRV9GUk9OVDIsCisJRE1YX1NPVVJDRV9GUk9OVDMsCisJRE1YX1NPVVJDRV9EVlIwICAgPSAxNiwKKwlETVhfU09VUkNFX0RWUjEsCisJRE1YX1NPVVJDRV9EVlIyLAorCURNWF9TT1VSQ0VfRFZSMworfSBkbXhfc291cmNlX3Q7CisKK3N0cnVjdCBkbXhfc3RjIHsKKwl1bnNpZ25lZCBpbnQgbnVtOwkvKiBpbnB1dCA6IHdoaWNoIFNUQz8gMC4uTiAqLworCXVuc2lnbmVkIGludCBiYXNlOwkvKiBvdXRwdXQ6IGRpdmlzb3IgZm9yIHN0YyB0byBnZXQgOTAga0h6IGNsb2NrICovCisJX191NjQgc3RjOwkJLyogb3V0cHV0OiBzdGMgaW4gJ2Jhc2UnKjkwIGtIeiB1bml0cyAqLworfTsKKworCisjZGVmaW5lIERNWF9TVEFSVCAgICAgICAgICAgICAgICBfSU8oJ28nLCA0MSkKKyNkZWZpbmUgRE1YX1NUT1AgICAgICAgICAgICAgICAgIF9JTygnbycsIDQyKQorI2RlZmluZSBETVhfU0VUX0ZJTFRFUiAgICAgICAgICAgX0lPVygnbycsIDQzLCBzdHJ1Y3QgZG14X3NjdF9maWx0ZXJfcGFyYW1zKQorI2RlZmluZSBETVhfU0VUX1BFU19GSUxURVIgICAgICAgX0lPVygnbycsIDQ0LCBzdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zKQorI2RlZmluZSBETVhfU0VUX0JVRkZFUl9TSVpFICAgICAgX0lPKCdvJywgNDUpCisjZGVmaW5lIERNWF9HRVRfUEVTX1BJRFMgICAgICAgICBfSU9SKCdvJywgNDcsIF9fdTE2WzVdKQorI2RlZmluZSBETVhfR0VUX0NBUFMgICAgICAgICAgICAgX0lPUignbycsIDQ4LCBkbXhfY2Fwc190KQorI2RlZmluZSBETVhfU0VUX1NPVVJDRSAgICAgICAgICAgX0lPVygnbycsIDQ5LCBkbXhfc291cmNlX3QpCisjZGVmaW5lIERNWF9HRVRfU1RDICAgICAgICAgICAgICBfSU9XUignbycsIDUwLCBzdHJ1Y3QgZG14X3N0YykKKworI2VuZGlmIC8qX0RWQkRNWF9IXyovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNiZDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaApAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIGZyb250ZW5kLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgPG1hcmN1c0Bjb252ZXJnZW5jZS5kZT4KKyAqCQkgICAgUmFscGggIE1ldHpsZXIgPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgorICoJCSAgICBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAY29udmVyZ2VuY2UuZGU+CisgKgkJICAgIEFuZHJlIERyYXN6aWsgPGFkQGNvbnZlcmdlbmNlLmRlPgorICoJCSAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJGUk9OVEVORF9IXworI2RlZmluZSBfRFZCRlJPTlRFTkRfSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisKK3R5cGVkZWYgZW51bSBmZV90eXBlIHsKKwlGRV9RUFNLLAorCUZFX1FBTSwKKwlGRV9PRkRNLAorCUZFX0FUU0MKK30gZmVfdHlwZV90OworCisKK3R5cGVkZWYgZW51bSBmZV9jYXBzIHsKKwlGRV9JU19TVFVQSUQJCQk9IDAsCisJRkVfQ0FOX0lOVkVSU0lPTl9BVVRPCQk9IDB4MSwKKwlGRV9DQU5fRkVDXzFfMgkJCT0gMHgyLAorCUZFX0NBTl9GRUNfMl8zCQkJPSAweDQsCisJRkVfQ0FOX0ZFQ18zXzQJCQk9IDB4OCwKKwlGRV9DQU5fRkVDXzRfNQkJCT0gMHgxMCwKKwlGRV9DQU5fRkVDXzVfNgkJCT0gMHgyMCwKKwlGRV9DQU5fRkVDXzZfNwkJCT0gMHg0MCwKKwlGRV9DQU5fRkVDXzdfOAkJCT0gMHg4MCwKKwlGRV9DQU5fRkVDXzhfOQkJCT0gMHgxMDAsCisJRkVfQ0FOX0ZFQ19BVVRPCQkJPSAweDIwMCwKKwlGRV9DQU5fUVBTSwkJCT0gMHg0MDAsCisJRkVfQ0FOX1FBTV8xNgkJCT0gMHg4MDAsCisJRkVfQ0FOX1FBTV8zMgkJCT0gMHgxMDAwLAorCUZFX0NBTl9RQU1fNjQJCQk9IDB4MjAwMCwKKwlGRV9DQU5fUUFNXzEyOAkJCT0gMHg0MDAwLAorCUZFX0NBTl9RQU1fMjU2CQkJPSAweDgwMDAsCisJRkVfQ0FOX1FBTV9BVVRPCQkJPSAweDEwMDAwLAorCUZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPCT0gMHgyMDAwMCwKKwlGRV9DQU5fQkFORFdJRFRIX0FVVE8JCT0gMHg0MDAwMCwKKwlGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTwk9IDB4ODAwMDAsCisJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPCQk9IDB4MTAwMDAwLAorCUZFX0NBTl84VlNCCQkJPSAweDIwMDAwMCwKKwlGRV9DQU5fMTZWU0IJCQk9IDB4NDAwMDAwLAorCUZFX05FRURTX0JFTkRJTkcJCT0gMHgyMDAwMDAwMCwgLy8gbm90IHN1cHBvcnRlZCBhbnltb3JlLCBkb24ndCB1c2UgKGZyb250ZW5kIHJlcXVpcmVzIGZyZXF1ZW5jeSBiZW5kaW5nKQorCUZFX0NBTl9SRUNPVkVSCQkJPSAweDQwMDAwMDAwLCAvLyBmcm9udGVuZCBjYW4gcmVjb3ZlciBmcm9tIGEgY2FibGUgdW5wbHVnIGF1dG9tYXRpY2FsbHkKKwlGRV9DQU5fTVVURV9UUwkJCT0gMHg4MDAwMDAwMCAgLy8gZnJvbnRlbmQgY2FuIHN0b3Agc3B1cmlvdXMgVFMgZGF0YSBvdXRwdXQKK30gZmVfY2Fwc190OworCisKK3N0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyB7CisJY2hhciAgICAgICBuYW1lWzEyOF07CisJZmVfdHlwZV90ICB0eXBlOworCV9fdTMyICAgICAgZnJlcXVlbmN5X21pbjsKKwlfX3UzMiAgICAgIGZyZXF1ZW5jeV9tYXg7CisJX191MzIgICAgICBmcmVxdWVuY3lfc3RlcHNpemU7CisJX191MzIgICAgICBmcmVxdWVuY3lfdG9sZXJhbmNlOworCV9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWluOworCV9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWF4OworCV9fdTMyICAgICAgc3ltYm9sX3JhdGVfdG9sZXJhbmNlOwkvKiBwcG0gKi8KKwlfX3UzMiAgICAgIG5vdGlmaWVyX2RlbGF5OwkJLyogREVQUkVDQVRFRCAqLworCWZlX2NhcHNfdCAgY2FwczsKK307CisKKworLyoqCisgKiAgQ2hlY2sgb3V0IHRoZSBEaVNFcUMgYnVzIHNwZWMgYXZhaWxhYmxlIG9uIGh0dHA6Ly93d3cuZXV0ZWxzYXQub3JnLyBmb3IKKyAqICB0aGUgbWVhbmluZyBvZiB0aGlzIHN0cnVjdC4uLgorICovCitzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kIHsKKwlfX3U4IG1zZyBbNl07CS8qICB7IGZyYW1pbmcsIGFkZHJlc3MsIGNvbW1hbmQsIGRhdGEgWzNdIH0gKi8KKwlfX3U4IG1zZ19sZW47CS8qICB2YWxpZCB2YWx1ZXMgYXJlIDMuLi42ICAqLworfTsKKworCitzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSB7CisJX191OCBtc2cgWzRdOwkvKiAgeyBmcmFtaW5nLCBkYXRhIFszXSB9ICovCisJX191OCBtc2dfbGVuOwkvKiAgdmFsaWQgdmFsdWVzIGFyZSAwLi4uNCwgMCBtZWFucyBubyBtc2cgICovCisJaW50ICB0aW1lb3V0OwkvKiAgcmV0dXJuIGZyb20gaW9jdGwgYWZ0ZXIgdGltZW91dCBtcyB3aXRoICovCit9OwkJCS8qICBlcnJvcmNvZGUgd2hlbiBubyBtZXNzYWdlIHdhcyByZWNlaXZlZCAgKi8KKworCit0eXBlZGVmIGVudW0gZmVfc2VjX3ZvbHRhZ2UgeworCVNFQ19WT0xUQUdFXzEzLAorCVNFQ19WT0xUQUdFXzE4LAorCVNFQ19WT0xUQUdFX09GRgorfSBmZV9zZWNfdm9sdGFnZV90OworCisKK3R5cGVkZWYgZW51bSBmZV9zZWNfdG9uZV9tb2RlIHsKKwlTRUNfVE9ORV9PTiwKKwlTRUNfVE9ORV9PRkYKK30gZmVfc2VjX3RvbmVfbW9kZV90OworCisKK3R5cGVkZWYgZW51bSBmZV9zZWNfbWluaV9jbWQgeworCVNFQ19NSU5JX0EsCisJU0VDX01JTklfQgorfSBmZV9zZWNfbWluaV9jbWRfdDsKKworCit0eXBlZGVmIGVudW0gZmVfc3RhdHVzIHsKKwlGRV9IQVNfU0lHTkFMCT0gMHgwMSwgICAvKiAgZm91bmQgc29tZXRoaW5nIGFib3ZlIHRoZSBub2lzZSBsZXZlbCAqLworCUZFX0hBU19DQVJSSUVSCT0gMHgwMiwgICAvKiAgZm91bmQgYSBEVkIgc2lnbmFsICAqLworCUZFX0hBU19WSVRFUkJJCT0gMHgwNCwgICAvKiAgRkVDIGlzIHN0YWJsZSAgKi8KKwlGRV9IQVNfU1lOQwk9IDB4MDgsICAgLyogIGZvdW5kIHN5bmMgYnl0ZXMgICovCisJRkVfSEFTX0xPQ0sJPSAweDEwLCAgIC8qICBldmVyeXRoaW5nJ3Mgd29ya2luZy4uLiAqLworCUZFX1RJTUVET1VUCT0gMHgyMCwgICAvKiAgbm8gbG9jayB3aXRoaW4gdGhlIGxhc3QgfjIgc2Vjb25kcyAqLworCUZFX1JFSU5JVAk9IDB4NDAgICAgLyogIGZyb250ZW5kIHdhcyByZWluaXRpYWxpemVkLCAgKi8KK30gZmVfc3RhdHVzX3Q7CQkJICAvKiAgYXBwbGljYXRpb24gaXMgcmVjb21tZW5kZWQgdG8gcmVzZXQgKi8KKwkJCQkgIC8qICBEaVNFcUMsIHRvbmUgYW5kIHBhcmFtZXRlcnMgKi8KKwordHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7CisJSU5WRVJTSU9OX09GRiwKKwlJTlZFUlNJT05fT04sCisJSU5WRVJTSU9OX0FVVE8KK30gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7CisKKwordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTworfSBmZV9jb2RlX3JhdGVfdDsKKworCit0eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7CisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzMyLAorCVFBTV82NCwKKwlRQU1fMTI4LAorCVFBTV8yNTYsCisJUUFNX0FVVE8sCisJVlNCXzgsCisJVlNCXzE2Cit9IGZlX21vZHVsYXRpb25fdDsKKwordHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgeworCVRSQU5TTUlTU0lPTl9NT0RFXzJLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzhLLAorCVRSQU5TTUlTU0lPTl9NT0RFX0FVVE8KK30gZmVfdHJhbnNtaXRfbW9kZV90OworCit0eXBlZGVmIGVudW0gZmVfYmFuZHdpZHRoIHsKKwlCQU5EV0lEVEhfOF9NSFosCisJQkFORFdJRFRIXzdfTUhaLAorCUJBTkRXSURUSF82X01IWiwKKwlCQU5EV0lEVEhfQVVUTworfSBmZV9iYW5kd2lkdGhfdDsKKworCit0eXBlZGVmIGVudW0gZmVfZ3VhcmRfaW50ZXJ2YWwgeworCUdVQVJEX0lOVEVSVkFMXzFfMzIsCisJR1VBUkRfSU5URVJWQUxfMV8xNiwKKwlHVUFSRF9JTlRFUlZBTF8xXzgsCisJR1VBUkRfSU5URVJWQUxfMV80LAorCUdVQVJEX0lOVEVSVkFMX0FVVE8KK30gZmVfZ3VhcmRfaW50ZXJ2YWxfdDsKKworCit0eXBlZGVmIGVudW0gZmVfaGllcmFyY2h5IHsKKwlISUVSQVJDSFlfTk9ORSwKKwlISUVSQVJDSFlfMSwKKwlISUVSQVJDSFlfMiwKKwlISUVSQVJDSFlfNCwKKwlISUVSQVJDSFlfQVVUTworfSBmZV9oaWVyYXJjaHlfdDsKKworCitzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyB7CisJX191MzIJCXN5bWJvbF9yYXRlOyAgLyogc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICovCisJZmVfY29kZV9yYXRlX3QJZmVjX2lubmVyOyAgICAvKiBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKHNlZSBhYm92ZSkgKi8KK307CisKK3N0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgeworCV9fdTMyCQlzeW1ib2xfcmF0ZTsgLyogc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICovCisJZmVfY29kZV9yYXRlX3QJZmVjX2lubmVyOyAgIC8qIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoc2VlIGFib3ZlKSAqLworCWZlX21vZHVsYXRpb25fdAltb2R1bGF0aW9uOyAgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCit9OworCitzdHJ1Y3QgZHZiX3ZzYl9wYXJhbWV0ZXJzIHsKKwlmZV9tb2R1bGF0aW9uX3QJbW9kdWxhdGlvbjsgIC8qIG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAqLworfTsKKworc3RydWN0IGR2Yl9vZmRtX3BhcmFtZXRlcnMgeworCWZlX2JhbmR3aWR0aF90ICAgICAgYmFuZHdpZHRoOworCWZlX2NvZGVfcmF0ZV90ICAgICAgY29kZV9yYXRlX0hQOyAgLyogaGlnaCBwcmlvcml0eSBzdHJlYW0gY29kZSByYXRlICovCisJZmVfY29kZV9yYXRlX3QgICAgICBjb2RlX3JhdGVfTFA7ICAvKiBsb3cgcHJpb3JpdHkgc3RyZWFtIGNvZGUgcmF0ZSAqLworCWZlX21vZHVsYXRpb25fdCAgICAgY29uc3RlbGxhdGlvbjsgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCisJZmVfdHJhbnNtaXRfbW9kZV90ICB0cmFuc21pc3Npb25fbW9kZTsKKwlmZV9ndWFyZF9pbnRlcnZhbF90IGd1YXJkX2ludGVydmFsOworCWZlX2hpZXJhcmNoeV90ICAgICAgaGllcmFyY2h5X2luZm9ybWF0aW9uOworfTsKKworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgeworCV9fdTMyIGZyZXF1ZW5jeTsgICAgIC8qIChhYnNvbHV0ZSkgZnJlcXVlbmN5IGluIEh6IGZvciBRQU0vT0ZETS9BVFNDICovCisJCQkgICAgIC8qIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgaW4ga0h6IGZvciBRUFNLICovCisJZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uOworCXVuaW9uIHsKKwkJc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgcXBzazsKKwkJc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyAgcWFtOworCQlzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOworCQlzdHJ1Y3QgZHZiX3ZzYl9wYXJhbWV0ZXJzIHZzYjsKKwl9IHU7Cit9OworCisKK3N0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgeworCWZlX3N0YXR1c190IHN0YXR1czsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKK307CisKKworLyoqCisgKiBXaGVuIHNldCwgdGhpcyBmbGFnIHdpbGwgZGlzYWJsZSBhbnkgemlnemFnZ2luZyBvciBvdGhlciAibm9ybWFsIiB0dW5pbmcKKyAqIGJlaGF2aW91ci4gQWRkaXRpb25hbGx5LCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9tYXRpYyBtb25pdG9yaW5nIG9mIHRoZSBsb2NrCisgKiBzdGF0dXMsIGFuZCBoZW5jZSBubyBmcm9udGVuZCBldmVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIGEgZnJvbnRlbmQgZGV2aWNlCisgKiBpcyBjbG9zZWQsIHRoaXMgZmxhZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9mZiB3aGVuIHRoZSBkZXZpY2UgaXMKKyAqIHJlb3BlbmVkIHJlYWQtd3JpdGUuCisgKi8KKyNkZWZpbmUgRkVfVFVORV9NT0RFX09ORVNIT1QgMHgwMQorCisKKyNkZWZpbmUgRkVfR0VUX0lORk8JCSAgIF9JT1IoJ28nLCA2MSwgc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvKQorCisjZGVmaW5lIEZFX0RJU0VRQ19SRVNFVF9PVkVSTE9BRCAgIF9JTygnbycsIDYyKQorI2RlZmluZSBGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EICBfSU9XKCdvJywgNjMsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQpCisjZGVmaW5lIEZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIF9JT1IoJ28nLCA2NCwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkpCisjZGVmaW5lIEZFX0RJU0VRQ19TRU5EX0JVUlNUICAgICAgIF9JTygnbycsIDY1KSAgLyogZmVfc2VjX21pbmlfY21kX3QgKi8KKworI2RlZmluZSBGRV9TRVRfVE9ORQkJICAgX0lPKCdvJywgNjYpICAvKiBmZV9zZWNfdG9uZV9tb2RlX3QgKi8KKyNkZWZpbmUgRkVfU0VUX1ZPTFRBR0UJCSAgIF9JTygnbycsIDY3KSAgLyogZmVfc2VjX3ZvbHRhZ2VfdCAqLworI2RlZmluZSBGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRSBfSU8oJ28nLCA2OCkgIC8qIGludCAqLworCisjZGVmaW5lIEZFX1JFQURfU1RBVFVTCQkgICBfSU9SKCdvJywgNjksIGZlX3N0YXR1c190KQorI2RlZmluZSBGRV9SRUFEX0JFUgkJICAgX0lPUignbycsIDcwLCBfX3UzMikKKyNkZWZpbmUgRkVfUkVBRF9TSUdOQUxfU1RSRU5HVEggICAgX0lPUignbycsIDcxLCBfX3UxNikKKyNkZWZpbmUgRkVfUkVBRF9TTlIJCSAgIF9JT1IoJ28nLCA3MiwgX191MTYpCisjZGVmaW5lIEZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTIF9JT1IoJ28nLCA3MywgX191MzIpCisKKyNkZWZpbmUgRkVfU0VUX0ZST05URU5ECQkgICBfSU9XKCdvJywgNzYsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykKKyNkZWZpbmUgRkVfR0VUX0ZST05URU5ECQkgICBfSU9SKCdvJywgNzcsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykKKyNkZWZpbmUgRkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERSAgX0lPKCdvJywgODEpIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSBGRV9HRVRfRVZFTlQJCSAgIF9JT1IoJ28nLCA3OCwgc3RydWN0IGR2Yl9mcm9udGVuZF9ldmVudCkKKworI2RlZmluZSBGRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQgX0lPKCdvJywgODApIC8qIHVuc2lnbmVkIGludCAqLworCisjZW5kaWYgLypfRFZCRlJPTlRFTkRfSF8qLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvbmV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU0NzRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvbmV0LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIG5ldC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmN1cyBNZXR6bGVyIDxtYXJjdXNAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICYgUmFscGggIE1ldHpsZXIgPHJhbHBoQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQk5FVF9IXworI2RlZmluZSBfRFZCTkVUX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworCitzdHJ1Y3QgZHZiX25ldF9pZiB7CisJX191MTYgcGlkOworCV9fdTE2IGlmX251bTsKKwlfX3U4ICBmZWVkdHlwZTsKKyNkZWZpbmUgRFZCX05FVF9GRUVEVFlQRV9NUEUgMAkvKiBtdWx0aSBwcm90b2NvbCBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIERWQl9ORVRfRkVFRFRZUEVfVUxFIDEJLyogdWx0cmEgbGlnaHR3ZWlnaHQgZW5jYXBzdWxhdGlvbiAqLworfTsKKworCisjZGVmaW5lIE5FVF9BRERfSUYgICAgX0lPV1IoJ28nLCA1Miwgc3RydWN0IGR2Yl9uZXRfaWYpCisjZGVmaW5lIE5FVF9SRU1PVkVfSUYgX0lPKCdvJywgNTMpCisjZGVmaW5lIE5FVF9HRVRfSUYgICAgX0lPV1IoJ28nLCA1NCwgc3RydWN0IGR2Yl9uZXRfaWYpCisKKworLyogYmluYXJ5IGNvbXBhdGliaWxpdHkgY3J1ZnQ6ICovCitzdHJ1Y3QgX19kdmJfbmV0X2lmX29sZCB7CisJX191MTYgcGlkOworCV9fdTE2IGlmX251bTsKK307CisjZGVmaW5lIF9fTkVUX0FERF9JRl9PTEQgX0lPV1IoJ28nLCA1Miwgc3RydWN0IF9fZHZiX25ldF9pZl9vbGQpCisjZGVmaW5lIF9fTkVUX0dFVF9JRl9PTEQgX0lPV1IoJ28nLCA1NCwgc3RydWN0IF9fZHZiX25ldF9pZl9vbGQpCisKKworI2VuZGlmIC8qX0RWQk5FVF9IXyovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9vc2QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL29zZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi9vc2QuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIG9zZC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBMZXNzZXIgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX0RWQk9TRF9IXworI2RlZmluZSBfRFZCT1NEX0hfCisKKwordHlwZWRlZiBlbnVtIHsKKyAgLy8gQWxsIGZ1bmN0aW9ucyByZXR1cm4gLTIgb24gIm5vdCBvcGVuIgorICBPU0RfQ2xvc2U9MSwgICAgLy8gKCkKKyAgLy8gRGlzYWJsZXMgT1NEIGFuZCByZWxlYXNlcyB0aGUgYnVmZmVycworICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfT3BlbiwgICAgICAgLy8gKHgwLHkwLHgxLHkxLEJpdFBlclBpeGVsWzIvNC84XShjb2xvciYweDBGKSxtaXhbMC4uMTVdKGNvbG9yJjB4RjApKQorICAvLyBPcGVucyBPU0Qgd2l0aCB0aGlzIHNpemUgYW5kIGJpdCBkZXB0aAorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gRFJBTSBhbGxvY2F0aW9uIGVycm9yLCAtMiBvbiAiYWxyZWFkeSBvcGVuIgorICBPU0RfU2hvdywgICAgICAgLy8gKCkKKyAgLy8gZW5hYmxlcyBPU0QgbW9kZQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfSGlkZSwgICAgICAgLy8gKCkKKyAgLy8gZGlzYWJsZXMgT1NEIG1vZGUKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX0NsZWFyLCAgICAgIC8vICgpCisgIC8vIFNldHMgYWxsIHBpeGVsIHRvIGNvbG9yIDAKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX0ZpbGwsICAgICAgIC8vIChjb2xvcikKKyAgLy8gU2V0cyBhbGwgcGl4ZWwgdG8gY29sb3IgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX1NldENvbG9yLCAgIC8vIChjb2xvcixSe3gwfSxHe3kwfSxCe3gxfSxvcGFjaXR5e3kxfSkKKyAgLy8gc2V0IHBhbGV0dGUgZW50cnkgPG51bT4gdG8gPHIsZyxiPiwgPG1peD4gYW5kIDx0cmFucz4gYXBwbHkKKyAgLy8gUixHLEI6IDAuLjI1NQorICAvLyBSPVJlZCwgRz1HcmVlbiwgQj1CbHVlCisgIC8vIG9wYWNpdHk9MDogICAgICBwaXhlbCBvcGFjaXR5IDAlIChvbmx5IHZpZGVvIHBpeGVsIHNob3dzKQorICAvLyBvcGFjaXR5PTEuLjI1NDogcGl4ZWwgb3BhY2l0eSBhcyBzcGVjaWZpZWQgaW4gaGVhZGVyCisgIC8vIG9wYWNpdHk9MjU1OiAgICBwaXhlbCBvcGFjaXR5IDEwMCUgKG9ubHkgT1NEIHBpeGVsIHNob3dzKQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAgT1NEX1NldFBhbGV0dGUsIC8vIChmaXJzdGNvbG9ye2NvbG9yfSxsYXN0Y29sb3J7eDB9LGRhdGEpCisgIC8vIFNldCBhIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwYWxldHRlCisgIC8vIHNldHMgdGhlIGVudHJpZXMgImZpcnN0Y29sb3IiIHRocm91Z2ggImxhc3Rjb2xvciIgZnJvbSB0aGUgYXJyYXkgImRhdGEiCisgIC8vIGRhdGEgaGFzIDQgYnl0ZSBmb3IgZWFjaCBjb2xvcjoKKyAgLy8gUixHLEIsIGFuZCBhIG9wYWNpdHkgdmFsdWU6IDAtPnRyYW5zcGFyZW50LCAxLi4yNTQtPm1peCwgMjU1LT5waXhlbAorICBPU0RfU2V0VHJhbnMsICAgLy8gKHRyYW5zcGFyZW5jeXtjb2xvcn0pCisgIC8vIFNldHMgdHJhbnNwYXJlbmN5IG9mIG1peGVkIHBpeGVsICgwLi4xNSkKKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgT1NEX1NldFBpeGVsLCAgIC8vICh4MCx5MCxjb2xvcikKKyAgLy8gc2V0cyBwaXhlbCA8eD4sPHk+IHRvIGNvbG9yIG51bWJlciA8Y29sPgorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKyAgT1NEX0dldFBpeGVsLCAgIC8vICh4MCx5MCkKKyAgLy8gcmV0dXJucyBjb2xvciBudW1iZXIgb2YgcGl4ZWwgPHg+LDx5PiwgIG9yIC0xCisgIE9TRF9TZXRSb3csICAgICAvLyAoeDAseTAseDEsZGF0YSkKKyAgLy8gZmlsbHMgcGl4ZWxzIHgwLHkgdGhyb3VnaCAgeDEseSB3aXRoIHRoZSBjb250ZW50IG9mIGRhdGFbXQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gY2xpcHBpbmcgYWxsIHBpeGVsIChubyBwaXhlbCBkcmF3bikKKyAgT1NEX1NldEJsb2NrLCAgIC8vICh4MCx5MCx4MSx5MSxpbmNyZW1lbnR7Y29sb3J9LGRhdGEpCisgIC8vIGZpbGxzIHBpeGVscyB4MCx5MCB0aHJvdWdoICB4MSx5MSB3aXRoIHRoZSBjb250ZW50IG9mIGRhdGFbXQorICAvLyBpbmMgY29udGFpbnMgdGhlIHdpZHRoIG9mIG9uZSBsaW5lIGluIHRoZSBkYXRhIGJsb2NrLAorICAvLyBpbmM8PTAgdXNlcyBibG9ja3dpZHRoIGFzIGxpbmV3aWR0aAorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gY2xpcHBpbmcgYWxsIHBpeGVsCisgIE9TRF9GaWxsUm93LCAgICAvLyAoeDAseTAseDEsY29sb3IpCisgIC8vIGZpbGxzIHBpeGVscyB4MCx5IHRocm91Z2ggIHgxLHkgd2l0aCB0aGUgY29sb3IgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGNsaXBwaW5nIGFsbCBwaXhlbAorICBPU0RfRmlsbEJsb2NrLCAgLy8gKHgwLHkwLHgxLHkxLGNvbG9yKQorICAvLyBmaWxscyBwaXhlbHMgeDAseTAgdGhyb3VnaCAgeDEseTEgd2l0aCB0aGUgY29sb3IgPGNvbD4KKyAgLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGNsaXBwaW5nIGFsbCBwaXhlbAorICBPU0RfTGluZSwgICAgICAgLy8gKHgwLHkwLHgxLHkxLGNvbG9yKQorICAvLyBkcmF3IGEgbGluZSBmcm9tIHgwLHkwIHRvIHgxLHkxIHdpdGggdGhlIGNvbG9yIDxjb2w+CisgIC8vIHJldHVybnMgMCBvbiBzdWNjZXNzCisgIE9TRF9RdWVyeSwgICAgICAvLyAoeDAseTAseDEseTEseGFzcHtjb2xvcn19KSwgeWFzcD0xMQorICAvLyBmaWxscyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBpY3R1cmUgZGltZW5zaW9ucyBhbmQgdGhlIHBpeGVsIGFzcGVjdCByYXRpbworICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworICBPU0RfVGVzdCwgICAgICAgLy8gKCkKKyAgLy8gZHJhd3MgYSB0ZXN0IHBpY3R1cmUuIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seQorICAvLyByZXR1cm5zIDAgb24gc3VjY2VzcworLy8gVE9ETzogcmVtb3ZlICJ0ZXN0IiBpbiBmaW5hbCB2ZXJzaW9uCisgIE9TRF9UZXh0LCAgICAgICAvLyAoeDAseTAsc2l6ZSxjb2xvcix0ZXh0KQorICBPU0RfU2V0V2luZG93LCAvLyAgKHgwKSBzZXQgd2luZG93IHdpdGggbnVtYmVyIDA8eDA8OCBhcyBjdXJyZW50CisgIE9TRF9Nb3ZlV2luZG93LCAvLyAgbW92ZSBjdXJyZW50IHdpbmRvdyB0byAoeDAsIHkwKQorICBPU0RfT3BlblJhdywJLy8gT3BlbiBvdGhlciB0eXBlcyBvZiBPU0Qgd2luZG93cworfSBPU0RfQ29tbWFuZDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NkX2NtZF9zIHsKKwlPU0RfQ29tbWFuZCBjbWQ7CisJaW50IHgwOworCWludCB5MDsKKwlpbnQgeDE7CisJaW50IHkxOworCWludCBjb2xvcjsKKwl2b2lkICpkYXRhOworfSBvc2RfY21kX3Q7CisKKy8qIE9TRF9PcGVuUmF3OiBzZXQgJ2NvbG9yJyB0byBkZXNpcmVkIHdpbmRvdyB0eXBlICovCit0eXBlZGVmIGVudW0geworCU9TRF9CSVRNQVAxLCAgICAgICAgICAgLyogMSBiaXQgYml0bWFwICovCisJT1NEX0JJVE1BUDIsICAgICAgICAgICAvKiAyIGJpdCBiaXRtYXAgKi8KKwlPU0RfQklUTUFQNCwgICAgICAgICAgIC8qIDQgYml0IGJpdG1hcCAqLworCU9TRF9CSVRNQVA4LCAgICAgICAgICAgLyogOCBiaXQgYml0bWFwICovCisJT1NEX0JJVE1BUDFIUiwgICAgICAgICAvKiAxIEJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX0JJVE1BUDJIUiwgICAgICAgICAvKiAyIGJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX0JJVE1BUDRIUiwgICAgICAgICAvKiA0IGJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX0JJVE1BUDhIUiwgICAgICAgICAvKiA4IGJpdCBiaXRtYXAgaGFsZiByZXNvbHV0aW9uICovCisJT1NEX1lDUkNCNDIyLCAgICAgICAgICAvKiA0OjI6MiBZQ1JDQiBHcmFwaGljIERpc3BsYXkgKi8KKwlPU0RfWUNSQ0I0NDQsICAgICAgICAgIC8qIDQ6NDo0IFlDUkNCIEdyYXBoaWMgRGlzcGxheSAqLworCU9TRF9ZQ1JDQjQ0NEhSLCAgICAgICAgLyogNDo0OjQgWUNSQ0IgZ3JhcGhpYyBoYWxmIHJlc29sdXRpb24gKi8KKwlPU0RfVklERU9UU0laRSwgICAgICAgIC8qIFRydWUgU2l6ZSBOb3JtYWwgTVBFRyBWaWRlbyBEaXNwbGF5ICovCisJT1NEX1ZJREVPSFNJWkUsICAgICAgICAvKiBNUEVHIFZpZGVvIERpc3BsYXkgSGFsZiBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPUVNJWkUsICAgICAgICAvKiBNUEVHIFZpZGVvIERpc3BsYXkgUXVhcnRlciBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPRFNJWkUsICAgICAgICAvKiBNUEVHIFZpZGVvIERpc3BsYXkgRG91YmxlIFJlc29sdXRpb24gKi8KKwlPU0RfVklERU9USFNJWkUsICAgICAgIC8qIFRydWUgU2l6ZSBNUEVHIFZpZGVvIERpc3BsYXkgSGFsZiBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPVFFTSVpFLCAgICAgICAvKiBUcnVlIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5IFF1YXJ0ZXIgUmVzb2x1dGlvbiovCisJT1NEX1ZJREVPVERTSVpFLCAgICAgICAvKiBUcnVlIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5IERvdWJsZSBSZXNvbHV0aW9uICovCisJT1NEX1ZJREVPTlNJWkUsICAgICAgICAvKiBGdWxsIFNpemUgTVBFRyBWaWRlbyBEaXNwbGF5ICovCisJT1NEX0NVUlNPUiAgICAgICAgICAgICAvKiBDdXJzb3IgKi8KK30gb3NkX3Jhd193aW5kb3dfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3NkX2NhcF9zIHsKKwlpbnQgIGNtZDsKKyNkZWZpbmUgT1NEX0NBUF9NRU1TSVpFICAgICAgICAgMSAgLyogbWVtb3J5IHNpemUgKi8KKwlsb25nIHZhbDsKK30gb3NkX2NhcF90OworCisKKyNkZWZpbmUgT1NEX1NFTkRfQ01EICAgICAgICAgICAgX0lPVygnbycsIDE2MCwgb3NkX2NtZF90KQorI2RlZmluZSBPU0RfR0VUX0NBUEFCSUxJVFkgICAgICBfSU9SKCdvJywgMTYxLCBvc2RfY2FwX3QpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9kdmIvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNmUwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92ZXJzaW9uLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIHZlcnNpb24uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBIb2xnZXIgV2FlY2h0bGVyIDxob2xnZXJAY29udmVyZ2VuY2UuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgZm9yIGNvbnZlcmdlbmNlIGludGVncmF0ZWQgbWVkaWEgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfRFZCVkVSU0lPTl9IXworI2RlZmluZSBfRFZCVkVSU0lPTl9IXworCisjZGVmaW5lIERWQl9BUElfVkVSU0lPTiAzCisjZGVmaW5lIERWQl9BUElfVkVSU0lPTl9NSU5PUiAyCisKKyNlbmRpZiAvKl9EVkJWRVJTSU9OX0hfKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZGUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogdmlkZW8uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjdXMgTWV0emxlciA8bWFyY3VzQGNvbnZlcmdlbmNlLmRlPgorICogICAgICAgICAgICAgICAgICAmIFJhbHBoICBNZXR6bGVyIDxyYWxwaEBjb252ZXJnZW5jZS5kZT4KKyAqICAgICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EVkJWSURFT19IXworI2RlZmluZSBfRFZCVklERU9fSF8KKworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisKK3R5cGVkZWYgZW51bSB7CisJVklERU9fRk9STUFUXzRfMywgICAgIC8qIFNlbGVjdCA0OjMgZm9ybWF0ICovCisJVklERU9fRk9STUFUXzE2XzksICAgIC8qIFNlbGVjdCAxNjo5IGZvcm1hdC4gKi8KKwlWSURFT19GT1JNQVRfMjIxXzEgICAgLyogMi4yMToxICovCit9IHZpZGVvX2Zvcm1hdF90OworCisKK3R5cGVkZWYgZW51bSB7CisJIFZJREVPX1NZU1RFTV9QQUwsCisJIFZJREVPX1NZU1RFTV9OVFNDLAorCSBWSURFT19TWVNURU1fUEFMTiwKKwkgVklERU9fU1lTVEVNX1BBTE5jLAorCSBWSURFT19TWVNURU1fUEFMTSwKKwkgVklERU9fU1lTVEVNX05UU0M2MCwKKwkgVklERU9fU1lTVEVNX1BBTDYwLAorCSBWSURFT19TWVNURU1fUEFMTTYwCit9IHZpZGVvX3N5c3RlbV90OworCisKK3R5cGVkZWYgZW51bSB7CisJVklERU9fUEFOX1NDQU4sICAgICAgIC8qIHVzZSBwYW4gYW5kIHNjYW4gZm9ybWF0ICovCisJVklERU9fTEVUVEVSX0JPWCwgICAgIC8qIHVzZSBsZXR0ZXJib3ggZm9ybWF0ICovCisJVklERU9fQ0VOVEVSX0NVVF9PVVQgIC8qIHVzZSBjZW50ZXIgY3V0IG91dCBmb3JtYXQgKi8KK30gdmlkZW9fZGlzcGxheWZvcm1hdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHc7CisJaW50IGg7CisJdmlkZW9fZm9ybWF0X3QgYXNwZWN0X3JhdGlvOworfSB2aWRlb19zaXplX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJVklERU9fU09VUkNFX0RFTVVYLCAvKiBTZWxlY3QgdGhlIGRlbXV4IGFzIHRoZSBtYWluIHNvdXJjZSAqLworCVZJREVPX1NPVVJDRV9NRU1PUlkgLyogSWYgdGhpcyBzb3VyY2UgaXMgc2VsZWN0ZWQsIHRoZSBzdHJlYW0KKwkJCSAgICAgICBjb21lcyBmcm9tIHRoZSB1c2VyIHRocm91Z2ggdGhlIHdyaXRlCisJCQkgICAgICAgc3lzdGVtIGNhbGwgKi8KK30gdmlkZW9fc3RyZWFtX3NvdXJjZV90OworCisKK3R5cGVkZWYgZW51bSB7CisJVklERU9fU1RPUFBFRCwgLyogVmlkZW8gaXMgc3RvcHBlZCAqLworCVZJREVPX1BMQVlJTkcsIC8qIFZpZGVvIGlzIGN1cnJlbnRseSBwbGF5aW5nICovCisJVklERU9fRlJFRVpFRCAgLyogVmlkZW8gaXMgZnJlZXplZCAqLworfSB2aWRlb19wbGF5X3N0YXRlX3Q7CisKKworLyogRGVjb2RlciBjb21tYW5kcyAqLworI2RlZmluZSBWSURFT19DTURfUExBWSAgICAgICAgKDApCisjZGVmaW5lIFZJREVPX0NNRF9TVE9QICAgICAgICAoMSkKKyNkZWZpbmUgVklERU9fQ01EX0ZSRUVaRSAgICAgICgyKQorI2RlZmluZSBWSURFT19DTURfQ09OVElOVUUgICAgKDMpCisKKy8qIEZsYWdzIGZvciBWSURFT19DTURfRlJFRVpFICovCisjZGVmaW5lIFZJREVPX0NNRF9GUkVFWkVfVE9fQkxBQ0sgICAgIAkoMSA8PCAwKQorCisvKiBGbGFncyBmb3IgVklERU9fQ01EX1NUT1AgKi8KKyNkZWZpbmUgVklERU9fQ01EX1NUT1BfVE9fQkxBQ0sgICAgICAJKDEgPDwgMCkKKyNkZWZpbmUgVklERU9fQ01EX1NUT1BfSU1NRURJQVRFTFkgICAgIAkoMSA8PCAxKQorCisvKiBQbGF5IGlucHV0IGZvcm1hdHM6ICovCisvKiBUaGUgZGVjb2RlciBoYXMgbm8gc3BlY2lhbCBmb3JtYXQgcmVxdWlyZW1lbnRzICovCisjZGVmaW5lIFZJREVPX1BMQVlfRk1UX05PTkUgICAgICAgICAoMCkKKy8qIFRoZSBkZWNvZGVyIHJlcXVpcmVzIGZ1bGwgR09QcyAqLworI2RlZmluZSBWSURFT19QTEFZX0ZNVF9HT1AgICAgICAgICAgKDEpCisKKy8qIFRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSB6ZXJvZWQgYmVmb3JlIHVzZSBieSB0aGUgYXBwbGljYXRpb24KKyAgIFRoaXMgZW5zdXJlcyBpdCBjYW4gYmUgZXh0ZW5kZWQgc2FmZWx5IGluIHRoZSBmdXR1cmUuICovCitzdHJ1Y3QgdmlkZW9fY29tbWFuZCB7CisJX191MzIgY21kOworCV9fdTMyIGZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHB0czsKKwkJfSBzdG9wOworCisJCXN0cnVjdCB7CisJCQkvKiAwIG9yIDEwMDAgc3BlY2lmaWVzIG5vcm1hbCBzcGVlZCwKKwkJCSAgIDEgc3BlY2lmaWVzIGZvcndhcmQgc2luZ2xlIHN0ZXBwaW5nLAorCQkJICAgLTEgc3BlY2lmaWVzIGJhY2t3YXJkIHNpbmdsZSBzdGVwcGluZywKKwkJCSAgID4xOiBwbGF5YmFjayBhdCBzcGVlZC8xMDAwIG9mIHRoZSBub3JtYWwgc3BlZWQsCisJCQkgICA8LTE6IHJldmVyc2UgcGxheWJhY2sgYXQgKC1zcGVlZC8xMDAwKSBvZiB0aGUgbm9ybWFsIHNwZWVkLiAqLworCQkJX19zMzIgc3BlZWQ7CisJCQlfX3UzMiBmb3JtYXQ7CisJCX0gcGxheTsKKworCQlzdHJ1Y3QgeworCQkJX191MzIgZGF0YVsxNl07CisJCX0gcmF3OworCX07Cit9OworCisvKiBGSUVMRF9VTktOT1dOIGNhbiBiZSB1c2VkIGlmIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIKKyAgIHRoZSBWc3luYyBpcyBmb3IgYW4gb2RkLCBldmVuIG9yIHByb2dyZXNzaXZlIChpLmUuIG5vbi1pbnRlcmxhY2VkKQorICAgZmllbGQuICovCisjZGVmaW5lIFZJREVPX1ZTWU5DX0ZJRUxEX1VOS05PV04gIAkoMCkKKyNkZWZpbmUgVklERU9fVlNZTkNfRklFTERfT0REIAkJKDEpCisjZGVmaW5lIFZJREVPX1ZTWU5DX0ZJRUxEX0VWRU4JCSgyKQorI2RlZmluZSBWSURFT19WU1lOQ19GSUVMRF9QUk9HUkVTU0lWRQkoMykKKworc3RydWN0IHZpZGVvX2V2ZW50IHsKKwlpbnQzMl90IHR5cGU7CisjZGVmaW5lIFZJREVPX0VWRU5UX1NJWkVfQ0hBTkdFRAkxCisjZGVmaW5lIFZJREVPX0VWRU5UX0ZSQU1FX1JBVEVfQ0hBTkdFRAkyCisjZGVmaW5lIFZJREVPX0VWRU5UX0RFQ09ERVJfU1RPUFBFRCAJMworI2RlZmluZSBWSURFT19FVkVOVF9WU1lOQyAJCTQKKwl0aW1lX3QgdGltZXN0YW1wOworCXVuaW9uIHsKKwkJdmlkZW9fc2l6ZV90IHNpemU7CisJCXVuc2lnbmVkIGludCBmcmFtZV9yYXRlOwkvKiBpbiBmcmFtZXMgcGVyIDEwMDBzZWMgKi8KKwkJdW5zaWduZWQgY2hhciB2c3luY19maWVsZDsJLyogdW5rbm93bi9vZGQvZXZlbi9wcm9ncmVzc2l2ZSAqLworCX0gdTsKK307CisKKworc3RydWN0IHZpZGVvX3N0YXR1cyB7CisJaW50ICAgICAgICAgICAgICAgICAgIHZpZGVvX2JsYW5rOyAgIC8qIGJsYW5rIHZpZGVvIG9uIGZyZWV6ZT8gKi8KKwl2aWRlb19wbGF5X3N0YXRlX3QgICAgcGxheV9zdGF0ZTsgICAgLyogY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjayAqLworCXZpZGVvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOyAvKiBjdXJyZW50IHNvdXJjZSAoZGVtdXgvbWVtb3J5KSAqLworCXZpZGVvX2Zvcm1hdF90ICAgICAgICB2aWRlb19mb3JtYXQ7ICAvKiBjdXJyZW50IGFzcGVjdCByYXRpbyBvZiBzdHJlYW0qLworCXZpZGVvX2Rpc3BsYXlmb3JtYXRfdCBkaXNwbGF5X2Zvcm1hdDsvKiBzZWxlY3RlZCBjcm9wcGluZyBtb2RlICovCit9OworCisKK3N0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlIHsKKwljaGFyICppRnJhbWU7ICAgICAgICAvKiBwb2ludGVyIHRvIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgKi8KKwlpbnQzMl90IHNpemU7Cit9OworCisKK3R5cGVkZWYKK3N0cnVjdCB2aWRlb19oaWdobGlnaHQgeworCWludCAgICAgYWN0aXZlOyAgICAgIC8qICAgIDE9c2hvdyBoaWdobGlnaHQsIDA9aGlkZSBoaWdobGlnaHQgKi8KKwl1aW50OF90IGNvbnRyYXN0MTsgICAvKiAgICA3LSA0ICBQYXR0ZXJuIHBpeGVsIGNvbnRyYXN0ICovCisJCQkgICAgIC8qICAgIDMtIDAgIEJhY2tncm91bmQgcGl4ZWwgY29udHJhc3QgKi8KKwl1aW50OF90IGNvbnRyYXN0MjsgICAvKiAgICA3LSA0ICBFbXBoYXNpcyBwaXhlbC0yIGNvbnRyYXN0ICovCisJCQkgICAgIC8qICAgIDMtIDAgIEVtcGhhc2lzIHBpeGVsLTEgY29udHJhc3QgKi8KKwl1aW50OF90IGNvbG9yMTsgICAgICAvKiAgICA3LSA0ICBQYXR0ZXJuIHBpeGVsIGNvbG9yICovCisJCQkgICAgIC8qICAgIDMtIDAgIEJhY2tncm91bmQgcGl4ZWwgY29sb3IgKi8KKwl1aW50OF90IGNvbG9yMjsgICAgICAvKiAgICA3LSA0ICBFbXBoYXNpcyBwaXhlbC0yIGNvbG9yICovCisJCQkgICAgIC8qICAgIDMtIDAgIEVtcGhhc2lzIHBpeGVsLTEgY29sb3IgKi8KKwl1aW50MzJfdCB5cG9zOyAgICAgICAvKiAgIDIzLTIyICBhdXRvIGFjdGlvbiBtb2RlICovCisJCQkgICAgIC8qICAgMjEtMTIgIHN0YXJ0IHkgKi8KKwkJCSAgICAgLyogICAgOS0gMCAgZW5kIHkgKi8KKwl1aW50MzJfdCB4cG9zOyAgICAgICAvKiAgIDIzLTIyICBidXR0b24gY29sb3IgbnVtYmVyICovCisJCQkgICAgIC8qICAgMjEtMTIgIHN0YXJ0IHggKi8KKwkJCSAgICAgLyogICAgOS0gMCAgZW5kIHggKi8KK30gdmlkZW9faGlnaGxpZ2h0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgdmlkZW9fc3B1IHsKKwlpbnQgYWN0aXZlOworCWludCBzdHJlYW1faWQ7Cit9IHZpZGVvX3NwdV90OworCisKK3R5cGVkZWYgc3RydWN0IHZpZGVvX3NwdV9wYWxldHRlIHsgICAgICAvKiBTUFUgUGFsZXR0ZSBpbmZvcm1hdGlvbiAqLworCWludCBsZW5ndGg7CisJdWludDhfdCAqcGFsZXR0ZTsKK30gdmlkZW9fc3B1X3BhbGV0dGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB2aWRlb19uYXZpX3BhY2sgeworCWludCBsZW5ndGg7ICAgICAgICAgIC8qIDAgLi4uIDEwMjQgKi8KKwl1aW50OF90IGRhdGFbMTAyNF07Cit9IHZpZGVvX25hdmlfcGFja190OworCisKK3R5cGVkZWYgdWludDE2X3QgdmlkZW9fYXR0cmlidXRlc190OworLyogICBiaXRzOiBkZXNjci4gKi8KKy8qICAgMTUtMTQgVmlkZW8gY29tcHJlc3Npb24gbW9kZSAoMD1NUEVHLTEsIDE9TVBFRy0yKSAqLworLyogICAxMy0xMiBUViBzeXN0ZW0gKDA9NTI1LzYwLCAxPTYyNS81MCkgKi8KKy8qICAgMTEtMTAgQXNwZWN0IHJhdGlvICgwPTQ6MywgMz0xNjo5KSAqLworLyogICAgOS0gOCBwZXJtaXR0ZWQgZGlzcGxheSBtb2RlIG9uIDQ6MyBtb25pdG9yICgwPWJvdGgsIDE9b25seSBwYW4tc2NhICovCisvKiAgICA3ICAgIGxpbmUgMjEtMSBkYXRhIHByZXNlbnQgaW4gR09QICgxPXllcywgMD1ubykgKi8KKy8qICAgIDYgICAgbGluZSAyMS0yIGRhdGEgcHJlc2VudCBpbiBHT1AgKDE9eWVzLCAwPW5vKSAqLworLyogICAgNS0gMyBzb3VyY2UgcmVzb2x1dGlvbiAoMD03MjB4NDgwLzU3NiwgMT03MDR4NDgwLzU3NiwgMj0zNTJ4NDgwLzU3ICovCisvKiAgICAyICAgIHNvdXJjZSBsZXR0ZXJib3hlZCAoMT15ZXMsIDA9bm8pICovCisvKiAgICAwICAgIGZpbG0vY2FtZXJhIG1vZGUgKDA9Y2FtZXJhLCAxPWZpbG0gKDYyNS81MCBvbmx5KSkgKi8KKworCisvKiBiaXQgZGVmaW5pdGlvbnMgZm9yIGNhcGFiaWxpdGllczogKi8KKy8qIGNhbiB0aGUgaGFyZHdhcmUgZGVjb2RlIE1QRUcxIGFuZC9vciBNUEVHMj8gKi8KKyNkZWZpbmUgVklERU9fQ0FQX01QRUcxICAgMQorI2RlZmluZSBWSURFT19DQVBfTVBFRzIgICAyCisvKiBjYW4geW91IHNlbmQgYSBzeXN0ZW0gYW5kL29yIHByb2dyYW0gc3RyZWFtIHRvIHZpZGVvIGRldmljZT8KKyAgICh5b3Ugc3RpbGwgaGF2ZSB0byBvcGVuIHRoZSB2aWRlbyBhbmQgdGhlIGF1ZGlvIGRldmljZSBidXQgb25seQorICAgIHNlbmQgdGhlIHN0cmVhbSB0byB0aGUgdmlkZW8gZGV2aWNlKSAqLworI2RlZmluZSBWSURFT19DQVBfU1lTICAgICA0CisjZGVmaW5lIFZJREVPX0NBUF9QUk9HICAgIDgKKy8qIGNhbiB0aGUgZHJpdmVyIGFsc28gaGFuZGxlIFNQVSwgTkFWSSBhbmQgQ1NTIGVuY29kZWQgZGF0YT8KKyAgIChDU1MgQVBJIGlzIG5vdCBwcmVzZW50IHlldCkgKi8KKyNkZWZpbmUgVklERU9fQ0FQX1NQVSAgICAxNgorI2RlZmluZSBWSURFT19DQVBfTkFWSSAgIDMyCisjZGVmaW5lIFZJREVPX0NBUF9DU1MgICAgNjQKKworCisjZGVmaW5lIFZJREVPX1NUT1AgICAgICAgICAgICAgICAgIF9JTygnbycsIDIxKQorI2RlZmluZSBWSURFT19QTEFZICAgICAgICAgICAgICAgICBfSU8oJ28nLCAyMikKKyNkZWZpbmUgVklERU9fRlJFRVpFICAgICAgICAgICAgICAgX0lPKCdvJywgMjMpCisjZGVmaW5lIFZJREVPX0NPTlRJTlVFICAgICAgICAgICAgIF9JTygnbycsIDI0KQorI2RlZmluZSBWSURFT19TRUxFQ1RfU09VUkNFICAgICAgICBfSU8oJ28nLCAyNSkKKyNkZWZpbmUgVklERU9fU0VUX0JMQU5LICAgICAgICAgICAgX0lPKCdvJywgMjYpCisjZGVmaW5lIFZJREVPX0dFVF9TVEFUVVMgICAgICAgICAgIF9JT1IoJ28nLCAyNywgc3RydWN0IHZpZGVvX3N0YXR1cykKKyNkZWZpbmUgVklERU9fR0VUX0VWRU5UICAgICAgICAgICAgX0lPUignbycsIDI4LCBzdHJ1Y3QgdmlkZW9fZXZlbnQpCisjZGVmaW5lIFZJREVPX1NFVF9ESVNQTEFZX0ZPUk1BVCAgIF9JTygnbycsIDI5KQorI2RlZmluZSBWSURFT19TVElMTFBJQ1RVUkUgICAgICAgICBfSU9XKCdvJywgMzAsIHN0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlKQorI2RlZmluZSBWSURFT19GQVNUX0ZPUldBUkQgICAgICAgICBfSU8oJ28nLCAzMSkKKyNkZWZpbmUgVklERU9fU0xPV01PVElPTiAgICAgICAgICAgX0lPKCdvJywgMzIpCisjZGVmaW5lIFZJREVPX0dFVF9DQVBBQklMSVRJRVMgICAgIF9JT1IoJ28nLCAzMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBWSURFT19DTEVBUl9CVUZGRVIgICAgICAgICBfSU8oJ28nLCAgMzQpCisjZGVmaW5lIFZJREVPX1NFVF9JRCAgICAgICAgICAgICAgIF9JTygnbycsIDM1KQorI2RlZmluZSBWSURFT19TRVRfU1RSRUFNVFlQRSAgICAgICBfSU8oJ28nLCAzNikKKyNkZWZpbmUgVklERU9fU0VUX0ZPUk1BVCAgICAgICAgICAgX0lPKCdvJywgMzcpCisjZGVmaW5lIFZJREVPX1NFVF9TWVNURU0gICAgICAgICAgIF9JTygnbycsIDM4KQorI2RlZmluZSBWSURFT19TRVRfSElHSExJR0hUICAgICAgICBfSU9XKCdvJywgMzksIHZpZGVvX2hpZ2hsaWdodF90KQorI2RlZmluZSBWSURFT19TRVRfU1BVICAgICAgICAgICAgICBfSU9XKCdvJywgNTAsIHZpZGVvX3NwdV90KQorI2RlZmluZSBWSURFT19TRVRfU1BVX1BBTEVUVEUgICAgICBfSU9XKCdvJywgNTEsIHZpZGVvX3NwdV9wYWxldHRlX3QpCisjZGVmaW5lIFZJREVPX0dFVF9OQVZJICAgICAgICAgICAgIF9JT1IoJ28nLCA1MiwgdmlkZW9fbmF2aV9wYWNrX3QpCisjZGVmaW5lIFZJREVPX1NFVF9BVFRSSUJVVEVTICAgICAgIF9JTygnbycsIDUzKQorI2RlZmluZSBWSURFT19HRVRfU0laRSAgICAgICAgICAgICBfSU9SKCdvJywgNTUsIHZpZGVvX3NpemVfdCkKKyNkZWZpbmUgVklERU9fR0VUX0ZSQU1FX1JBVEUgICAgICAgX0lPUignbycsIDU2LCB1bnNpZ25lZCBpbnQpCisKKy8qKgorICogVklERU9fR0VUX1BUUworICoKKyAqIFJlYWQgdGhlIDMzIGJpdCBwcmVzZW50YXRpb24gdGltZSBzdGFtcCBhcyBkZWZpbmVkCisgKiBpbiBJVFUgVC1SRUMtSC4yMjIuMCAvIElTTy9JRUMgMTM4MTgtMS4KKyAqCisgKiBUaGUgUFRTIHNob3VsZCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBwbGF5ZWQKKyAqIGZyYW1lIGlmIHBvc3NpYmxlLCBidXQgbWF5IGFsc28gYmUgYSB2YWx1ZSBjbG9zZSB0byBpdAorICogbGlrZSB0aGUgUFRTIG9mIHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgb3IgdGhlIGxhc3QgUFRTCisgKiBleHRyYWN0ZWQgYnkgdGhlIFBFUyBwYXJzZXIuCisgKi8KKyNkZWZpbmUgVklERU9fR0VUX1BUUyAgICAgICAgICAgICAgX0lPUignbycsIDU3LCBfX3U2NCkKKworLyogUmVhZCB0aGUgbnVtYmVyIG9mIGRpc3BsYXllZCBmcmFtZXMgc2luY2UgdGhlIGRlY29kZXIgd2FzIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgVklERU9fR0VUX0ZSQU1FX0NPVU5UICAJICAgX0lPUignbycsIDU4LCBfX3U2NCkKKworI2RlZmluZSBWSURFT19DT01NQU5EICAgICAJICAgX0lPV1IoJ28nLCA1OSwgc3RydWN0IHZpZGVvX2NvbW1hbmQpCisjZGVmaW5lIFZJREVPX1RSWV9DT01NQU5EIAkgICBfSU9XUignbycsIDYwLCBzdHJ1Y3QgdmlkZW9fY29tbWFuZCkKKworI2VuZGlmIC8qX0RWQlZJREVPX0hfKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWRkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTU4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VkZC5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9lZGQuaAorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCBEZWxsIEluYy4KKyAqICBieSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKgorICogc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnQgMTNoLCBheD17NDEsNDh9aAorICogQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIFNlcnZpY2VzCisgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBUMTMgZ3JvdXAgZG9jdW1lbnQgRDE1NzIgUmV2aXNpb24gMCAoQXVndXN0IDE0IDIwMDIpCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy50MTMub3JnL2RvY3MyMDAyL2QxNTcycjAucGRmLiAgSXQgaXMKKyAqIHZlcnkgc2ltaWxhciB0byBEMTQ4NCBSZXZpc2lvbiAzIGh0dHA6Ly93d3cudDEzLm9yZy9kb2NzMjAwMi9kMTQ4NHIzLnBkZgorICoKKyAqIEluIGEgbnV0c2hlbGwsIGFyY2gve2kzODYseDg2XzY0fS9ib290L3NldHVwLlMgcG9wdWxhdGVzIGEgc2NyYXRjaAorICogdGFibGUgaW4gdGhlIGJvb3RfcGFyYW1zIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIEJJT1MtZW51bWVyYXRlZAorICogYm9vdCBkZXZpY2VzLgorICogSW4gYXJjaC97aTM4Nix4ODZfNjR9L2tlcm5lbC9zZXR1cC5jLCB0aGlzIGluZm9ybWF0aW9uIGlzCisgKiB0cmFuc2ZlcnJlZCBpbnRvIHRoZSBlZGQgc3RydWN0dXJlLCBhbmQgaW4gZHJpdmVycy9maXJtd2FyZS9lZGQuYywgdGhhdAorICogaW5mb3JtYXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSBCSU9TIGJvb3QgZGlzay4gIFRoZSBjb2RlIGluIHNldHVwLlMKKyAqIGlzIHZlcnkgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2lmbmRlZiBfTElOVVhfRUREX0gKKyNkZWZpbmUgX0xJTlVYX0VERF9ICisKKyNkZWZpbmUgRURETlIgMHgxZTkJCS8qIGFkZHIgb2YgbnVtYmVyIG9mIGVkZF9pbmZvIHN0cnVjdHMgYXQgRUREQlVGCisJCQkJICAgaW4gYm9vdF9wYXJhbXMgLSB0cmVhdCB0aGlzIGFzIDEgYnl0ZSAgKi8KKyNkZWZpbmUgRUREQlVGCTB4ZDAwCQkvKiBhZGRyIG9mIGVkZF9pbmZvIHN0cnVjdHMgaW4gYm9vdF9wYXJhbXMgKi8KKyNkZWZpbmUgRURETUFYTlIgNgkJLyogbnVtYmVyIG9mIGVkZF9pbmZvIHN0cnVjdHMgc3RhcnRpbmcgYXQgRUREQlVGICAqLworI2RlZmluZSBFRERFWFRTSVpFIDgJCS8qIGNoYW5nZSB0aGVzZSBpZiB5b3UgbXVjayB3aXRoIHRoZSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIEVERFBBUk1TSVpFIDc0CisjZGVmaW5lIENIRUNLRVhURU5TSU9OU1BSRVNFTlQgMHg0MQorI2RlZmluZSBHRVRERVZJQ0VQQVJBTUVURVJTIDB4NDgKKyNkZWZpbmUgTEVHQUNZR0VUREVWSUNFUEFSQU1FVEVSUyAweDA4CisjZGVmaW5lIEVERE1BR0lDMSAweDU1QUEKKyNkZWZpbmUgRURETUFHSUMyIDB4QUE1NQorCisKKyNkZWZpbmUgUkVBRF9TRUNUT1JTIDB4MDIgICAgICAgICAvKiBpbnQxMyBBSD0weDAyIGlzIFJFQURfU0VDVE9SUyBjb21tYW5kICovCisjZGVmaW5lIEVERF9NQlJfU0lHX09GRlNFVCAweDFCOCAgLyogb2Zmc2V0IG9mIHNpZ25hdHVyZSBpbiB0aGUgTUJSICovCisjZGVmaW5lIEVERF9NQlJfU0lHX0JVRiAgICAweDI5MCAgLyogYWRkciBpbiBib290IHBhcmFtcyAqLworI2RlZmluZSBFRERfTUJSX1NJR19NQVggMTYgICAgICAgIC8qIG1heCBudW1iZXIgb2Ygc2lnbmF0dXJlcyB0byBzdG9yZSAqLworI2RlZmluZSBFRERfTUJSX1NJR19OUl9CVUYgMHgxZWEgIC8qIGFkZHIgb2YgbnVtYmVyIG9mIE1CUiBzaWdudGF1cmVzIGF0IEVERF9NQlJfU0lHX0JVRgorCQkJCSAgICAgaW4gYm9vdF9wYXJhbXMgLSB0cmVhdCB0aGlzIGFzIDEgYnl0ZSAgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBFRERfRVhUX0ZJWEVEX0RJU0tfQUNDRVNTICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBFRERfRVhUX0RFVklDRV9MT0NLSU5HX0FORF9FSkVDVElORyAoMSA8PCAxKQorI2RlZmluZSBFRERfRVhUX0VOSEFOQ0VEX0RJU0tfRFJJVkVfU1VQUE9SVCAoMSA8PCAyKQorI2RlZmluZSBFRERfRVhUXzY0QklUX0VYVEVOU0lPTlMgICAgICAgICAgICAoMSA8PCAzKQorCisjZGVmaW5lIEVERF9JTkZPX0RNQV9CT1VOREFSWV9FUlJPUl9UUkFOU1BBUkVOVCAoMSA8PCAwKQorI2RlZmluZSBFRERfSU5GT19HRU9NRVRSWV9WQUxJRCAgICAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBFRERfSU5GT19SRU1PVkFCTEUgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBFRERfSU5GT19XUklURV9WRVJJRlkgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBFRERfSU5GT19NRURJQV9DSEFOR0VfTk9USUZJQ0FUSU9OICAgICAoMSA8PCA0KQorI2RlZmluZSBFRERfSU5GT19MT0NLQUJMRSAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBFRERfSU5GT19OT19NRURJQV9QUkVTRU5UICAgICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBFRERfSU5GT19VU0VfSU5UMTNfRk41MCAgICAgICAgICAgICAgICAoMSA8PCA3KQorCitzdHJ1Y3QgZWRkX2RldmljZV9wYXJhbXMgeworCV9fdTE2IGxlbmd0aDsKKwlfX3UxNiBpbmZvX2ZsYWdzOworCV9fdTMyIG51bV9kZWZhdWx0X2N5bGluZGVyczsKKwlfX3UzMiBudW1fZGVmYXVsdF9oZWFkczsKKwlfX3UzMiBzZWN0b3JzX3Blcl90cmFjazsKKwlfX3U2NCBudW1iZXJfb2Zfc2VjdG9yczsKKwlfX3UxNiBieXRlc19wZXJfc2VjdG9yOworCV9fdTMyIGRwdGVfcHRyOwkJLyogMHhGRkZGRkZGRiBmb3Igb3VyIHB1cnBvc2VzICovCisJX191MTYga2V5OwkJLyogPSAweEJFREQgKi8KKwlfX3U4IGRldmljZV9wYXRoX2luZm9fbGVuZ3RoOwkvKiA9IDQ0ICovCisJX191OCByZXNlcnZlZDI7CisJX191MTYgcmVzZXJ2ZWQzOworCV9fdTggaG9zdF9idXNfdHlwZVs0XTsKKwlfX3U4IGludGVyZmFjZV90eXBlWzhdOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTE2IGJhc2VfYWRkcmVzczsKKwkJCV9fdTE2IHJlc2VydmVkMTsKKwkJCV9fdTMyIHJlc2VydmVkMjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaXNhOworCQlzdHJ1Y3QgeworCQkJX191OCBidXM7CisJCQlfX3U4IHNsb3Q7CisJCQlfX3U4IGZ1bmN0aW9uOworCQkJX191OCBjaGFubmVsOworCQkJX191MzIgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHBjaTsKKwkJLyogcGNpeCBpcyBzYW1lIGFzIHBjaSAqLworCQlzdHJ1Y3QgeworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGlibmQ7CisJCXN0cnVjdCB7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgeHByczsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlc2VydmVkOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBodHB0OworCQlzdHJ1Y3QgeworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHVua25vd247CisJfSBpbnRlcmZhY2VfcGF0aDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4IGRldmljZTsKKwkJCV9fdTggcmVzZXJ2ZWQxOworCQkJX191MTYgcmVzZXJ2ZWQyOworCQkJX191MzIgcmVzZXJ2ZWQzOworCQkJX191NjQgcmVzZXJ2ZWQ0OworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdGE7CisJCXN0cnVjdCB7CisJCQlfX3U4IGRldmljZTsKKwkJCV9fdTggbHVuOworCQkJX191OCByZXNlcnZlZDE7CisJCQlfX3U4IHJlc2VydmVkMjsKKwkJCV9fdTMyIHJlc2VydmVkMzsKKwkJCV9fdTY0IHJlc2VydmVkNDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYXRhcGk7CisJCXN0cnVjdCB7CisJCQlfX3UxNiBpZDsKKwkJCV9fdTY0IGx1bjsKKwkJCV9fdTE2IHJlc2VydmVkMTsKKwkJCV9fdTMyIHJlc2VydmVkMjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2NzaTsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHNlcmlhbF9udW1iZXI7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdXNiOworCQlzdHJ1Y3QgeworCQkJX191NjQgZXVpOworCQkJX191NjQgcmVzZXJ2ZWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGkxMzk0OworCQlzdHJ1Y3QgeworCQkJX191NjQgd3dpZDsKKwkJCV9fdTY0IGx1bjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZmlicmU7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBpZGVudGl0eV90YWc7CisJCQlfX3U2NCByZXNlcnZlZDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaTJvOworCQlzdHJ1Y3QgeworCQkJX191MzIgYXJyYXlfbnVtYmVyOworCQkJX191MzIgcmVzZXJ2ZWQxOworCQkJX191NjQgcmVzZXJ2ZWQyOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSByYWlkOworCQlzdHJ1Y3QgeworCQkJX191OCBkZXZpY2U7CisJCQlfX3U4IHJlc2VydmVkMTsKKwkJCV9fdTE2IHJlc2VydmVkMjsKKwkJCV9fdTMyIHJlc2VydmVkMzsKKwkJCV9fdTY0IHJlc2VydmVkNDsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgc2F0YTsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHJlc2VydmVkMTsKKwkJCV9fdTY0IHJlc2VydmVkMjsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdW5rbm93bjsKKwl9IGRldmljZV9wYXRoOworCV9fdTggcmVzZXJ2ZWQ0OworCV9fdTggY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGVkZF9pbmZvIHsKKwlfX3U4IGRldmljZTsKKwlfX3U4IHZlcnNpb247CisJX191MTYgaW50ZXJmYWNlX3N1cHBvcnQ7CisJX191MTYgbGVnYWN5X21heF9jeWxpbmRlcjsKKwlfX3U4IGxlZ2FjeV9tYXhfaGVhZDsKKwlfX3U4IGxlZ2FjeV9zZWN0b3JzX3Blcl90cmFjazsKKwlzdHJ1Y3QgZWRkX2RldmljZV9wYXJhbXMgcGFyYW1zOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBlZGQgeworCXVuc2lnbmVkIGludCBtYnJfc2lnbmF0dXJlW0VERF9NQlJfU0lHX01BWF07CisJc3RydWN0IGVkZF9pbmZvIGVkZF9pbmZvW0VERE1BWE5SXTsKKwl1bnNpZ25lZCBjaGFyIG1icl9zaWduYXR1cmVfbnI7CisJdW5zaWduZWQgY2hhciBlZGRfaW5mb19ucjsKK307CisKKyNlbmRpZgkJCQkvKiFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmCQkJCS8qIF9MSU5VWF9FRERfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lZnNfZnNfc2IuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWZzX2ZzX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxOTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWZzX2ZzX3NiLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIGVmc19mc19zYi5oCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIElSSVggaGVhZGVyIGZpbGVzIChjKSAxOTg4IFNpbGljb24gR3JhcGhpY3MKKyAqLworCisjaWZuZGVmIF9fRUZTX0ZTX1NCX0hfXworI2RlZmluZSBfX0VGU19GU19TQl9IX18KKworI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qIEVGUyBzdXBlcmJsb2NrIG1hZ2ljIG51bWJlcnMgKi8KKyNkZWZpbmUgRUZTX01BR0lDCTB4MDcyOTU5CisjZGVmaW5lIEVGU19ORVdNQUdJQwkweDA3Mjk1YQorCisjZGVmaW5lIElTX0VGU19NQUdJQyh4KQkoKHggPT0gRUZTX01BR0lDKSB8fCAoeCA9PSBFRlNfTkVXTUFHSUMpKQorCisjZGVmaW5lIEVGU19TVVBFUgkJMQorI2RlZmluZSBFRlNfUk9PVElOT0RFCQkyCisKKy8qIGVmcyBzdXBlcmJsb2NrIG9uIGRpc2sgKi8KK3N0cnVjdCBlZnNfc3VwZXIgeworCV9fYmUzMgkJZnNfc2l6ZTsgICAgICAgIC8qIHNpemUgb2YgZmlsZXN5c3RlbSwgaW4gc2VjdG9ycyAqLworCV9fYmUzMgkJZnNfZmlyc3RjZzsgICAgIC8qIGJiIG9mZnNldCB0byBmaXJzdCBjZyAqLworCV9fYmUzMgkJZnNfY2dmc2l6ZTsgICAgIC8qIHNpemUgb2YgY3lsaW5kZXIgZ3JvdXAgaW4gYmIncyAqLworCV9fYmUxNgkJZnNfY2dpc2l6ZTsgICAgIC8qIGJiJ3Mgb2YgaW5vZGVzIHBlciBjeWxpbmRlciBncm91cCAqLworCV9fYmUxNgkJZnNfc2VjdG9yczsgICAgIC8qIHNlY3RvcnMgcGVyIHRyYWNrICovCisJX19iZTE2CQlmc19oZWFkczsgICAgICAgLyogaGVhZHMgcGVyIGN5bGluZGVyICovCisJX19iZTE2CQlmc19uY2c7ICAgICAgICAgLyogIyBvZiBjeWxpbmRlciBncm91cHMgaW4gZmlsZXN5c3RlbSAqLworCV9fYmUxNgkJZnNfZGlydHk7ICAgICAgIC8qIGZzIG5lZWRzIHRvIGJlIGZzY2snZCAqLworCV9fYmUzMgkJZnNfdGltZTsgICAgICAgIC8qIGxhc3Qgc3VwZXItYmxvY2sgdXBkYXRlICovCisJX19iZTMyCQlmc19tYWdpYzsgICAgICAgLyogbWFnaWMgbnVtYmVyICovCisJY2hhcgkJZnNfZm5hbWVbNl07ICAgIC8qIGZpbGUgc3lzdGVtIG5hbWUgKi8KKwljaGFyCQlmc19mcGFja1s2XTsgICAgLyogZmlsZSBzeXN0ZW0gcGFjayBuYW1lICovCisJX19iZTMyCQlmc19ibXNpemU7ICAgICAgLyogc2l6ZSBvZiBiaXRtYXAgaW4gYnl0ZXMgKi8KKwlfX2JlMzIJCWZzX3RmcmVlOyAgICAgICAvKiB0b3RhbCBmcmVlIGRhdGEgYmxvY2tzICovCisJX19iZTMyCQlmc190aW5vZGU7ICAgICAgLyogdG90YWwgZnJlZSBpbm9kZXMgKi8KKwlfX2JlMzIJCWZzX2JtYmxvY2s7ICAgICAvKiBiaXRtYXAgbG9jYXRpb24uICovCisJX19iZTMyCQlmc19yZXBsc2I7ICAgICAgLyogTG9jYXRpb24gb2YgcmVwbGljYXRlZCBzdXBlcmJsb2NrLiAqLworCV9fYmUzMgkJZnNfbGFzdGlhbGxvYzsgIC8qIGxhc3QgYWxsb2NhdGVkIGlub2RlICovCisJY2hhcgkJZnNfc3BhcmVbMjBdOyAgIC8qIHNwYWNlIGZvciBleHBhbnNpb24gLSBNVVNUIEJFIFpFUk8gKi8KKwlfX2JlMzIJCWZzX2NoZWNrc3VtOyAgICAvKiBjaGVja3N1bSBvZiB2b2x1bWUgcG9ydGlvbiBvZiBmcyAqLworfTsKKworLyogZWZzIHN1cGVyYmxvY2sgaW5mb3JtYXRpb24gaW4gbWVtb3J5ICovCitzdHJ1Y3QgZWZzX3NiX2luZm8geworCV9fdTMyCWZzX21hZ2ljOwkvKiBzdXBlcmJsb2NrIG1hZ2ljIG51bWJlciAqLworCV9fdTMyCWZzX3N0YXJ0OwkvKiBmaXJzdCBibG9jayBvZiBmaWxlc3lzdGVtICovCisJX191MzIJZmlyc3RfYmxvY2s7CS8qIGZpcnN0IGRhdGEgYmxvY2sgaW4gZmlsZXN5c3RlbSAqLworCV9fdTMyCXRvdGFsX2Jsb2NrczsJLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlc3lzdGVtICovCisJX191MzIJZ3JvdXBfc2l6ZTsJLyogIyBvZiBibG9ja3MgYSBncm91cCBjb25zaXN0cyBvZiAqLyAKKwlfX3UzMglkYXRhX2ZyZWU7CS8qICMgb2YgZnJlZSBkYXRhIGJsb2NrcyAqLworCV9fdTMyCWlub2RlX2ZyZWU7CS8qICMgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX3UxNglpbm9kZV9ibG9ja3M7CS8qICMgb2YgYmxvY2tzIHVzZWQgZm9yIGlub2RlcyBpbiBldmVyeSBncnAgKi8KKwlfX3UxNgl0b3RhbF9ncm91cHM7CS8qICMgb2YgZ3JvdXBzICovCit9OworCisjZW5kaWYgLyogX19FRlNfRlNfU0JfSF9fICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLWVtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzRlODQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oCkBAIC0wLDAgKzEsNTIgQEAKKyNpZm5kZWYgX0xJTlVYX0VMRl9FTV9ICisjZGVmaW5lIF9MSU5VWF9FTEZfRU1fSAorCisvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSB2YXJpb3VzIEVMRiB0YXJnZXQgbWFjaGluZXMgKi8KKyNkZWZpbmUgRU1fTk9ORQkJMAorI2RlZmluZSBFTV9NMzIJCTEKKyNkZWZpbmUgRU1fU1BBUkMJMgorI2RlZmluZSBFTV8zODYJCTMKKyNkZWZpbmUgRU1fNjhLCQk0CisjZGVmaW5lIEVNXzg4SwkJNQorI2RlZmluZSBFTV80ODYJCTYJLyogUGVyaGFwcyBkaXN1c2VkICovCisjZGVmaW5lIEVNXzg2MAkJNworI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KKwkJCQkvKiBOZXh0IHR3byBhcmUgaGlzdG9yaWNhbCBhbmQgYmluYXJpZXMgYW5kCisJCQkJICAgbW9kdWxlcyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIHJlamVjdGVkIGJ5CisJCQkJICAgTGludXguICAqLworI2RlZmluZSBFTV9NSVBTX1JTM19MRQkxMAkvKiBNSVBTIFIzMDAwIGxpdHRsZS1lbmRpYW4gKi8KKyNkZWZpbmUgRU1fTUlQU19SUzRfQkUJMTAJLyogTUlQUyBSNDAwMCBiaWctZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDCTE1CS8qIEhQUEEgKi8KKyNkZWZpbmUgRU1fU1BBUkMzMlBMVVMJMTgJLyogU3VuJ3MgInY4cGx1cyIgKi8KKyNkZWZpbmUgRU1fUFBDCQkyMAkvKiBQb3dlclBDICovCisjZGVmaW5lIEVNX1BQQzY0CTIxCSAvKiBQb3dlclBDNjQgKi8KKyNkZWZpbmUgRU1fU1BVCQkyMwkvKiBDZWxsIEJFIFNQVSAqLworI2RlZmluZSBFTV9TSAkJNDIJLyogU3VwZXJIICovCisjZGVmaW5lIEVNX1NQQVJDVjkJNDMJLyogU1BBUkMgdjkgNjQtYml0ICovCisjZGVmaW5lIEVNX0lBXzY0CTUwCS8qIEhQL0ludGVsIElBLTY0ICovCisjZGVmaW5lIEVNX1g4Nl82NAk2MgkvKiBBTUQgeDg2LTY0ICovCisjZGVmaW5lIEVNX1MzOTAJCTIyCS8qIElCTSBTLzM5MCAqLworI2RlZmluZSBFTV9DUklTCQk3NgkvKiBBeGlzIENvbW11bmljYXRpb25zIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgRU1fVjg1MAkJODcJLyogTkVDIHY4NTAgKi8KKyNkZWZpbmUgRU1fTTMyUgkJODgJLyogUmVuZXNhcyBNMzJSICovCisjZGVmaW5lIEVNX0g4XzMwMAk0NgkvKiBSZW5lc2FzIEg4LzMwMCwzMDBILEg4UyAqLworI2RlZmluZSBFTV9CTEFDS0ZJTiAgICAgMTA2ICAgICAvKiBBREkgQmxhY2tmaW4gUHJvY2Vzc29yICovCisjZGVmaW5lIEVNX0ZSVgkJMHg1NDQxCS8qIEZ1aml0c3UgRlItViAqLworI2RlZmluZSBFTV9BVlIzMgkweDE4YWQJLyogQXRtZWwgQVZSMzIgKi8KKworLyoKKyAqIFRoaXMgaXMgYW4gaW50ZXJpbSB2YWx1ZSB0aGF0IHdlIHdpbGwgdXNlIHVudGlsIHRoZSBjb21taXR0ZWUgY29tZXMKKyAqIHVwIHdpdGggYSBmaW5hbCBudW1iZXIuCisgKi8KKyNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2CisKKy8qIEJvZ3VzIG9sZCB2ODUwIG1hZ2ljIG51bWJlciwgdXNlZCBieSBvbGQgdG9vbHMuICovCisjZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAorLyogQm9ndXMgb2xkIG0zMnIgbWFnaWMgbnVtYmVyLCB1c2VkIGJ5IG9sZCB0b29scy4gKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX00zMlIJMHg5MDQxCisvKiBUaGlzIGlzIHRoZSBvbGQgaW50ZXJpbSB2YWx1ZSBmb3IgUy8zOTAgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEVNX1MzOTBfT0xECTB4QTM5MAorCisKKyNlbmRpZiAvKiBfTElOVVhfRUxGX0VNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZWxmLWZkcGljLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1mZHBpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNWI3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi1mZHBpYy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIGVsZi1mZHBpYy5oOiBGRFBJQyBFTEYgbG9hZCBtYXAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfRUxGX0ZEUElDX0gKKyNkZWZpbmUgX0xJTlVYX0VMRl9GRFBJQ19ICisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworI2RlZmluZSBQVF9HTlVfU1RBQ0sgICAgKFBUX0xPT1MgKyAweDQ3NGU1NTEpCisKKy8qIHNlZ21lbnQgbWFwcGluZ3MgZm9yIEVMRiBGRFBJQyBsaWJyYXJpZXMvZXhlY3V0YWJsZXMvaW50ZXJwcmV0ZXJzICovCitzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyB7CisJRWxmMzJfQWRkcglhZGRyOwkJLyogY29yZSBhZGRyZXNzIHRvIHdoaWNoIG1hcHBlZCAqLworCUVsZjMyX0FkZHIJcF92YWRkcjsJLyogVk1BIHJlY29yZGVkIGluIGZpbGUgKi8KKwlFbGYzMl9Xb3JkCXBfbWVtc3o7CS8qIGFsbG9jYXRpb24gc2l6ZSByZWNvcmRlZCBpbiBmaWxlICovCit9OworCitzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCB7CisJRWxmMzJfSGFsZgl2ZXJzaW9uOwkvKiB2ZXJzaW9uIG9mIHRoZXNlIHN0cnVjdHVyZXMsIGp1c3QgaW4gY2FzZS4uLiAqLworCUVsZjMyX0hhbGYJbnNlZ3M7CQkvKiBudW1iZXIgb2Ygc2VnbWVudHMgKi8KKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyBzZWdzW107Cit9OworCisjZGVmaW5lIEVMRjMyX0ZEUElDX0xPQURNQVBfVkVSU0lPTgkweDAwMDAKKworLyoKKyAqIGJpbmZtdCBiaW5hcnkgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgeworCXN0cnVjdCBlbGZoZHIJCQloZHI7CQkvKiByZWYgY29weSBvZiBFTEYgaGVhZGVyICovCisJc3RydWN0IGVsZl9waGRyCQkJKnBoZHJzOwkJLyogcmVmIGNvcHkgb2YgUFRfUEhEUiB0YWJsZSAqLworCXN0cnVjdCBlbGYzMl9mZHBpY19sb2FkbWFwCSpsb2FkbWFwOwkvKiBsb2FkbWFwIHRvIGJlIHBhc3NlZCB0byB1c2Vyc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nCQkJZWxmaGRyX2FkZHI7CS8qIG1hcHBlZCBFTEYgaGVhZGVyIHVzZXIgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJCQlwaF9hZGRyOwkvKiBtYXBwZWQgUFRfUEhEUiB1c2VyIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCQkJbWFwX2FkZHI7CS8qIG1hcHBlZCBsb2FkbWFwIHVzZXIgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJCQllbnRyeV9hZGRyOwkvKiBtYXBwZWQgZW50cnkgdXNlciBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwkJCXN0YWNrX3NpemU7CS8qIHN0YWNrIHNpemUgcmVxdWVzdGVkIChQVF9HTlVfU1RBQ0spICovCisJdW5zaWduZWQgbG9uZwkJCWR5bmFtaWNfYWRkcjsJLyogbWFwcGVkIFBUX0RZTkFNSUMgdXNlciBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwkJCWxvYWRfYWRkcjsJLyogdXNlciBhZGRyZXNzIGF0IHdoaWNoIHRvIG1hcCBiaW5hcnkgKi8KKwl1bnNpZ25lZCBsb25nCQkJZmxhZ3M7CisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX0FSUkFOR0VNRU5UCTB4MDAwMDAwMGYJLyogUFRfTE9BRCBhcnJhbmdlbWVudCBmbGFncyAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19JTkRFUEVOREVOVAkweDAwMDAwMDAwCS8qIFBUX0xPQURzIGNhbiBiZSBwdXQgYW55d2hlcmUgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfSE9OT1VSVkFERFIJMHgwMDAwMDAwMQkvKiBQVF9MT0FELnZhZGRyIG11c3QgYmUgaG9ub3VyZWQgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfQ09OU1RESVNQCTB4MDAwMDAwMDIJLyogUFRfTE9BRHMgcmVxdWlyZSBjb25zdGFudAorCQkJCQkJCSAqIGRpc3BsYWNlbWVudCAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19DT05USUdVT1VTCTB4MDAwMDAwMDMJLyogUFRfTE9BRHMgc2hvdWxkIGJlIGNvbnRpZ3VvdXMgKi8KKyNkZWZpbmUgRUxGX0ZEUElDX0ZMQUdfRVhFQ19TVEFDSwkweDAwMDAwMDEwCS8qIFQgaWYgc3RhY2sgdG8gYmUgZXhlY3V0YWJsZSAqLworI2RlZmluZSBFTEZfRkRQSUNfRkxBR19OT0VYRUNfU1RBQ0sJMHgwMDAwMDAyMAkvKiBUIGlmIHN0YWNrIG5vdCB0byBiZSBleGVjdXRhYmxlICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEUJMHgwMDAwMDA0MAkvKiBUIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBleGVjdXRhYmxlICovCisjZGVmaW5lIEVMRl9GRFBJQ19GTEFHX1BSRVNFTlQJCTB4ODAwMDAwMDAJLyogVCBpZiB0aGlzIG9iamVjdCBpcyBwcmVzZW50ICovCit9OworCisjaWZkZWYgQ09ORklHX01NVQorZXh0ZXJuIHZvaWQgZWxmX2ZkcGljX2FyY2hfbGF5X291dF9tbShzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqZXhlY19wYXJhbXMsCisJCQkJICAgICAgc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgKmludGVycF9wYXJhbXMsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhcnRfc3RhY2ssCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhcnRfYnJrKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX0VMRl9GRFBJQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUxMDlhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGYuaApAQCAtMCwwICsxLDQwMiBAQAorI2lmbmRlZiBfTElOVVhfRUxGX0gKKyNkZWZpbmUgX0xJTlVYX0VMRl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi1lbS5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KKworc3RydWN0IGZpbGU7CisKKyNpZm5kZWYgZWxmX3JlYWRfaW1wbGllc19leGVjCisgIC8qIEV4ZWN1dGFibGVzIGZvciB3aGljaCBlbGZfcmVhZF9pbXBsaWVzX2V4ZWMoKSByZXR1cm5zIFRSVUUgd2lsbAorICAgICBoYXZlIHRoZSBSRUFEX0lNUExJRVNfRVhFQyBwZXJzb25hbGl0eSBmbGFnIHNldCBhdXRvbWF0aWNhbGx5LgorICAgICBPdmVycmlkZSBpbiBhc20vZWxmLmggYXMgbmVlZGVkLiAgKi8KKyMgZGVmaW5lIGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhleCwgaGF2ZV9wdF9nbnVfc3RhY2spCTAKKyNlbmRpZgorCisvKiAzMi1iaXQgRUxGIGJhc2UgdHlwZXMuICovCit0eXBlZGVmIF9fdTMyCUVsZjMyX0FkZHI7Cit0eXBlZGVmIF9fdTE2CUVsZjMyX0hhbGY7Cit0eXBlZGVmIF9fdTMyCUVsZjMyX09mZjsKK3R5cGVkZWYgX19zMzIJRWxmMzJfU3dvcmQ7Cit0eXBlZGVmIF9fdTMyCUVsZjMyX1dvcmQ7CisKKy8qIDY0LWJpdCBFTEYgYmFzZSB0eXBlcy4gKi8KK3R5cGVkZWYgX191NjQJRWxmNjRfQWRkcjsKK3R5cGVkZWYgX191MTYJRWxmNjRfSGFsZjsKK3R5cGVkZWYgX19zMTYJRWxmNjRfU0hhbGY7Cit0eXBlZGVmIF9fdTY0CUVsZjY0X09mZjsKK3R5cGVkZWYgX19zMzIJRWxmNjRfU3dvcmQ7Cit0eXBlZGVmIF9fdTMyCUVsZjY0X1dvcmQ7Cit0eXBlZGVmIF9fdTY0CUVsZjY0X1h3b3JkOwordHlwZWRlZiBfX3M2NAlFbGY2NF9TeHdvcmQ7CisKKy8qIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIHRoZSBzZWdtZW50IHR5cGVzIHN0b3JlZCBpbiB0aGUgaW1hZ2UgaGVhZGVycyAqLworI2RlZmluZSBQVF9OVUxMICAgIDAKKyNkZWZpbmUgUFRfTE9BRCAgICAxCisjZGVmaW5lIFBUX0RZTkFNSUMgMgorI2RlZmluZSBQVF9JTlRFUlAgIDMKKyNkZWZpbmUgUFRfTk9URSAgICA0CisjZGVmaW5lIFBUX1NITElCICAgNQorI2RlZmluZSBQVF9QSERSICAgIDYKKyNkZWZpbmUgUFRfVExTICAgICA3ICAgICAgICAgICAgICAgLyogVGhyZWFkIGxvY2FsIHN0b3JhZ2Ugc2VnbWVudCAqLworI2RlZmluZSBQVF9MT09TICAgIDB4NjAwMDAwMDAgICAgICAvKiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9ISU9TICAgIDB4NmZmZmZmZmYgICAgICAvKiBPUy1zcGVjaWZpYyAqLworI2RlZmluZSBQVF9MT1BST0MgIDB4NzAwMDAwMDAKKyNkZWZpbmUgUFRfSElQUk9DICAweDdmZmZmZmZmCisjZGVmaW5lIFBUX0dOVV9FSF9GUkFNRQkJMHg2NDc0ZTU1MAorCisjZGVmaW5lIFBUX0dOVV9TVEFDSwkoUFRfTE9PUyArIDB4NDc0ZTU1MSkKKworLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgZGlmZmVyZW50IGVsZiBmaWxlIHR5cGVzICovCisjZGVmaW5lIEVUX05PTkUgICAwCisjZGVmaW5lIEVUX1JFTCAgICAxCisjZGVmaW5lIEVUX0VYRUMgICAyCisjZGVmaW5lIEVUX0RZTiAgICAzCisjZGVmaW5lIEVUX0NPUkUgICA0CisjZGVmaW5lIEVUX0xPUFJPQyAweGZmMDAKKyNkZWZpbmUgRVRfSElQUk9DIDB4ZmZmZgorCisvKiBUaGlzIGlzIHRoZSBpbmZvIHRoYXQgaXMgbmVlZGVkIHRvIHBhcnNlIHRoZSBkeW5hbWljIHNlY3Rpb24gb2YgdGhlIGZpbGUgKi8KKyNkZWZpbmUgRFRfTlVMTAkJMAorI2RlZmluZSBEVF9ORUVERUQJMQorI2RlZmluZSBEVF9QTFRSRUxTWgkyCisjZGVmaW5lIERUX1BMVEdPVAkzCisjZGVmaW5lIERUX0hBU0gJCTQKKyNkZWZpbmUgRFRfU1RSVEFCCTUKKyNkZWZpbmUgRFRfU1lNVEFCCTYKKyNkZWZpbmUgRFRfUkVMQQkJNworI2RlZmluZSBEVF9SRUxBU1oJOAorI2RlZmluZSBEVF9SRUxBRU5UCTkKKyNkZWZpbmUgRFRfU1RSU1oJMTAKKyNkZWZpbmUgRFRfU1lNRU5UCTExCisjZGVmaW5lIERUX0lOSVQJCTEyCisjZGVmaW5lIERUX0ZJTkkJCTEzCisjZGVmaW5lIERUX1NPTkFNRQkxNAorI2RlZmluZSBEVF9SUEFUSCAJMTUKKyNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKKyNkZWZpbmUgRFRfUkVMCSAgICAgICAgMTcKKyNkZWZpbmUgRFRfUkVMU1oJMTgKKyNkZWZpbmUgRFRfUkVMRU5UCTE5CisjZGVmaW5lIERUX1BMVFJFTAkyMAorI2RlZmluZSBEVF9ERUJVRwkyMQorI2RlZmluZSBEVF9URVhUUkVMCTIyCisjZGVmaW5lIERUX0pNUFJFTAkyMworI2RlZmluZSBEVF9FTkNPRElORwkzMgorI2RlZmluZSBPTERfRFRfTE9PUwkweDYwMDAwMDAwCisjZGVmaW5lIERUX0xPT1MJCTB4NjAwMDAwMGQKKyNkZWZpbmUgRFRfSElPUwkJMHg2ZmZmZjAwMAorI2RlZmluZSBEVF9WQUxSTkdMTwkweDZmZmZmZDAwCisjZGVmaW5lIERUX1ZBTFJOR0hJCTB4NmZmZmZkZmYKKyNkZWZpbmUgRFRfQUREUlJOR0xPCTB4NmZmZmZlMDAKKyNkZWZpbmUgRFRfQUREUlJOR0hJCTB4NmZmZmZlZmYKKyNkZWZpbmUgRFRfVkVSU1lNCTB4NmZmZmZmZjAKKyNkZWZpbmUgRFRfUkVMQUNPVU5UCTB4NmZmZmZmZjkKKyNkZWZpbmUgRFRfUkVMQ09VTlQJMHg2ZmZmZmZmYQorI2RlZmluZSBEVF9GTEFHU18xCTB4NmZmZmZmZmIKKyNkZWZpbmUgRFRfVkVSREVGCTB4NmZmZmZmZmMKKyNkZWZpbmUJRFRfVkVSREVGTlVNCTB4NmZmZmZmZmQKKyNkZWZpbmUgRFRfVkVSTkVFRAkweDZmZmZmZmZlCisjZGVmaW5lCURUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgorI2RlZmluZSBPTERfRFRfSElPUyAgICAgMHg2ZmZmZmZmZgorI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAorI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgorCisvKiBUaGlzIGluZm8gaXMgbmVlZGVkIHdoZW4gcGFyc2luZyB0aGUgc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIFNUQl9MT0NBTCAgMAorI2RlZmluZSBTVEJfR0xPQkFMIDEKKyNkZWZpbmUgU1RCX1dFQUsgICAyCisKKyNkZWZpbmUgU1RUX05PVFlQRSAgMAorI2RlZmluZSBTVFRfT0JKRUNUICAxCisjZGVmaW5lIFNUVF9GVU5DICAgIDIKKyNkZWZpbmUgU1RUX1NFQ1RJT04gMworI2RlZmluZSBTVFRfRklMRSAgICA0CisjZGVmaW5lIFNUVF9DT01NT04gIDUKKyNkZWZpbmUgU1RUX1RMUyAgICAgNgorCisjZGVmaW5lIEVMRl9TVF9CSU5EKHgpCQkoKHgpID4+IDQpCisjZGVmaW5lIEVMRl9TVF9UWVBFKHgpCQkoKCh1bnNpZ25lZCBpbnQpIHgpICYgMHhmKQorI2RlZmluZSBFTEYzMl9TVF9CSU5EKHgpCUVMRl9TVF9CSU5EKHgpCisjZGVmaW5lIEVMRjMyX1NUX1RZUEUoeCkJRUxGX1NUX1RZUEUoeCkKKyNkZWZpbmUgRUxGNjRfU1RfQklORCh4KQlFTEZfU1RfQklORCh4KQorI2RlZmluZSBFTEY2NF9TVF9UWVBFKHgpCUVMRl9TVF9UWVBFKHgpCisKK3R5cGVkZWYgc3RydWN0IGR5bmFtaWN7CisgIEVsZjMyX1N3b3JkIGRfdGFnOworICB1bmlvbnsKKyAgICBFbGYzMl9Td29yZAlkX3ZhbDsKKyAgICBFbGYzMl9BZGRyCWRfcHRyOworICB9IGRfdW47Cit9IEVsZjMyX0R5bjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBFbGY2NF9TeHdvcmQgZF90YWc7CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KKyAgdW5pb24geworICAgIEVsZjY0X1h3b3JkIGRfdmFsOworICAgIEVsZjY0X0FkZHIgZF9wdHI7CisgIH0gZF91bjsKK30gRWxmNjRfRHluOworCisvKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHdpdGggcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgRUxGMzJfUl9TWU0oeCkgKCh4KSA+PiA4KQorI2RlZmluZSBFTEYzMl9SX1RZUEUoeCkgKCh4KSAmIDB4ZmYpCisKKyNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCQkoKGkpID4+IDMyKQorI2RlZmluZSBFTEY2NF9SX1RZUEUoaSkJCQkoKGkpICYgMHhmZmZmZmZmZikKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcmVsIHsKKyAgRWxmMzJfQWRkcglyX29mZnNldDsKKyAgRWxmMzJfV29yZAlyX2luZm87Cit9IEVsZjMyX1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcmVsIHsKKyAgRWxmNjRfQWRkciByX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLworICBFbGY2NF9Yd29yZCByX2luZm87CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KK30gRWxmNjRfUmVsOworCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9yZWxheworICBFbGYzMl9BZGRyCXJfb2Zmc2V0OworICBFbGYzMl9Xb3JkCXJfaW5mbzsKKyAgRWxmMzJfU3dvcmQJcl9hZGRlbmQ7Cit9IEVsZjMyX1JlbGE7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3JlbGEgeworICBFbGY2NF9BZGRyIHJfb2Zmc2V0OwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCisgIEVsZjY0X1h3b3JkIHJfaW5mbzsJLyogaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiAqLworICBFbGY2NF9TeHdvcmQgcl9hZGRlbmQ7CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KK30gRWxmNjRfUmVsYTsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfc3lteworICBFbGYzMl9Xb3JkCXN0X25hbWU7CisgIEVsZjMyX0FkZHIJc3RfdmFsdWU7CisgIEVsZjMyX1dvcmQJc3Rfc2l6ZTsKKyAgdW5zaWduZWQgY2hhcglzdF9pbmZvOworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOworICBFbGYzMl9IYWxmCXN0X3NobmR4OworfSBFbGYzMl9TeW07CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3N5bSB7CisgIEVsZjY0X1dvcmQgc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCisgIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJLyogVHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzICovCisgIHVuc2lnbmVkIGNoYXIJc3Rfb3RoZXI7CS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLworICBFbGY2NF9IYWxmIHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCisgIEVsZjY0X0FkZHIgc3RfdmFsdWU7CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCisgIEVsZjY0X1h3b3JkIHN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCit9IEVsZjY0X1N5bTsKKworCisjZGVmaW5lIEVJX05JREVOVAkxNgorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9oZHJ7CisgIHVuc2lnbmVkIGNoYXIJZV9pZGVudFtFSV9OSURFTlRdOworICBFbGYzMl9IYWxmCWVfdHlwZTsKKyAgRWxmMzJfSGFsZgllX21hY2hpbmU7CisgIEVsZjMyX1dvcmQJZV92ZXJzaW9uOworICBFbGYzMl9BZGRyCWVfZW50cnk7ICAvKiBFbnRyeSBwb2ludCAqLworICBFbGYzMl9PZmYJZV9waG9mZjsKKyAgRWxmMzJfT2ZmCWVfc2hvZmY7CisgIEVsZjMyX1dvcmQJZV9mbGFnczsKKyAgRWxmMzJfSGFsZgllX2Voc2l6ZTsKKyAgRWxmMzJfSGFsZgllX3BoZW50c2l6ZTsKKyAgRWxmMzJfSGFsZgllX3BobnVtOworICBFbGYzMl9IYWxmCWVfc2hlbnRzaXplOworICBFbGYzMl9IYWxmCWVfc2hudW07CisgIEVsZjMyX0hhbGYJZV9zaHN0cm5keDsKK30gRWxmMzJfRWhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfaGRyIHsKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLworICBFbGY2NF9IYWxmIGVfdHlwZTsKKyAgRWxmNjRfSGFsZiBlX21hY2hpbmU7CisgIEVsZjY0X1dvcmQgZV92ZXJzaW9uOworICBFbGY2NF9BZGRyIGVfZW50cnk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfT2ZmIGVfcGhvZmY7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICBFbGY2NF9PZmYgZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1dvcmQgZV9mbGFnczsKKyAgRWxmNjRfSGFsZiBlX2Voc2l6ZTsKKyAgRWxmNjRfSGFsZiBlX3BoZW50c2l6ZTsKKyAgRWxmNjRfSGFsZiBlX3BobnVtOworICBFbGY2NF9IYWxmIGVfc2hlbnRzaXplOworICBFbGY2NF9IYWxmIGVfc2hudW07CisgIEVsZjY0X0hhbGYgZV9zaHN0cm5keDsKK30gRWxmNjRfRWhkcjsKKworLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgcGVybWlzc2lvbnMgb24gc2VjdGlvbnMgaW4gdGhlIHByb2dyYW0KKyAgIGhlYWRlciwgcF9mbGFncy4gKi8KKyNkZWZpbmUgUEZfUgkJMHg0CisjZGVmaW5lIFBGX1cJCTB4MgorI2RlZmluZSBQRl9YCQkweDEKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcGhkcnsKKyAgRWxmMzJfV29yZAlwX3R5cGU7CisgIEVsZjMyX09mZglwX29mZnNldDsKKyAgRWxmMzJfQWRkcglwX3ZhZGRyOworICBFbGYzMl9BZGRyCXBfcGFkZHI7CisgIEVsZjMyX1dvcmQJcF9maWxlc3o7CisgIEVsZjMyX1dvcmQJcF9tZW1zejsKKyAgRWxmMzJfV29yZAlwX2ZsYWdzOworICBFbGYzMl9Xb3JkCXBfYWxpZ247Cit9IEVsZjMyX1BoZHI7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3BoZHIgeworICBFbGY2NF9Xb3JkIHBfdHlwZTsKKyAgRWxmNjRfV29yZCBwX2ZsYWdzOworICBFbGY2NF9PZmYgcF9vZmZzZXQ7CQkvKiBTZWdtZW50IGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X0FkZHIgcF92YWRkcjsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCisgIEVsZjY0X0FkZHIgcF9wYWRkcjsJCS8qIFNlZ21lbnQgcGh5c2ljYWwgYWRkcmVzcyAqLworICBFbGY2NF9Yd29yZCBwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCisgIEVsZjY0X1h3b3JkIHBfbWVtc3o7CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCisgIEVsZjY0X1h3b3JkIHBfYWxpZ247CQkvKiBTZWdtZW50IGFsaWdubWVudCwgZmlsZSAmIG1lbW9yeSAqLworfSBFbGY2NF9QaGRyOworCisvKiBzaF90eXBlICovCisjZGVmaW5lIFNIVF9OVUxMCTAKKyNkZWZpbmUgU0hUX1BST0dCSVRTCTEKKyNkZWZpbmUgU0hUX1NZTVRBQgkyCisjZGVmaW5lIFNIVF9TVFJUQUIJMworI2RlZmluZSBTSFRfUkVMQQk0CisjZGVmaW5lIFNIVF9IQVNICTUKKyNkZWZpbmUgU0hUX0RZTkFNSUMJNgorI2RlZmluZSBTSFRfTk9URQk3CisjZGVmaW5lIFNIVF9OT0JJVFMJOAorI2RlZmluZSBTSFRfUkVMCQk5CisjZGVmaW5lIFNIVF9TSExJQgkxMAorI2RlZmluZSBTSFRfRFlOU1lNCTExCisjZGVmaW5lIFNIVF9OVU0JCTEyCisjZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAorI2RlZmluZSBTSFRfSElQUk9DCTB4N2ZmZmZmZmYKKyNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVVTRVIJMHhmZmZmZmZmZgorCisvKiBzaF9mbGFncyAqLworI2RlZmluZSBTSEZfV1JJVEUJMHgxCisjZGVmaW5lIFNIRl9BTExPQwkweDIKKyNkZWZpbmUgU0hGX0VYRUNJTlNUUgkweDQKKyNkZWZpbmUgU0hGX01BU0tQUk9DCTB4ZjAwMDAwMDAKKworLyogc3BlY2lhbCBzZWN0aW9uIGluZGV4ZXMgKi8KKyNkZWZpbmUgU0hOX1VOREVGCTAKKyNkZWZpbmUgU0hOX0xPUkVTRVJWRQkweGZmMDAKKyNkZWZpbmUgU0hOX0xPUFJPQwkweGZmMDAKKyNkZWZpbmUgU0hOX0hJUFJPQwkweGZmMWYKKyNkZWZpbmUgU0hOX0FCUwkJMHhmZmYxCisjZGVmaW5lIFNITl9DT01NT04JMHhmZmYyCisjZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhmZmZmCisgCit0eXBlZGVmIHN0cnVjdCB7CisgIEVsZjMyX1dvcmQJc2hfbmFtZTsKKyAgRWxmMzJfV29yZAlzaF90eXBlOworICBFbGYzMl9Xb3JkCXNoX2ZsYWdzOworICBFbGYzMl9BZGRyCXNoX2FkZHI7CisgIEVsZjMyX09mZglzaF9vZmZzZXQ7CisgIEVsZjMyX1dvcmQJc2hfc2l6ZTsKKyAgRWxmMzJfV29yZAlzaF9saW5rOworICBFbGYzMl9Xb3JkCXNoX2luZm87CisgIEVsZjMyX1dvcmQJc2hfYWRkcmFsaWduOworICBFbGYzMl9Xb3JkCXNoX2VudHNpemU7Cit9IEVsZjMyX1NoZHI7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3NoZHIgeworICBFbGY2NF9Xb3JkIHNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgRWxmNjRfV29yZCBzaF90eXBlOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCisgIEVsZjY0X1h3b3JkIHNoX2ZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KKyAgRWxmNjRfQWRkciBzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCisgIEVsZjY0X09mZiBzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1h3b3JkIHNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KKyAgRWxmNjRfV29yZCBzaF9saW5rOwkJLyogSW5kZXggb2YgYW5vdGhlciBzZWN0aW9uICovCisgIEVsZjY0X1dvcmQgc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLworICBFbGY2NF9Yd29yZCBzaF9hZGRyYWxpZ247CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCisgIEVsZjY0X1h3b3JkIHNoX2VudHNpemU7CS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLworfSBFbGY2NF9TaGRyOworCisjZGVmaW5lCUVJX01BRzAJCTAJCS8qIGVfaWRlbnRbXSBpbmRleGVzICovCisjZGVmaW5lCUVJX01BRzEJCTEKKyNkZWZpbmUJRUlfTUFHMgkJMgorI2RlZmluZQlFSV9NQUczCQkzCisjZGVmaW5lCUVJX0NMQVNTCTQKKyNkZWZpbmUJRUlfREFUQQkJNQorI2RlZmluZQlFSV9WRVJTSU9OCTYKKyNkZWZpbmUJRUlfT1NBQkkJNworI2RlZmluZQlFSV9QQUQJCTgKKworI2RlZmluZQlFTEZNQUcwCQkweDdmCQkvKiBFSV9NQUcgKi8KKyNkZWZpbmUJRUxGTUFHMQkJJ0UnCisjZGVmaW5lCUVMRk1BRzIJCSdMJworI2RlZmluZQlFTEZNQUczCQknRicKKyNkZWZpbmUJRUxGTUFHCQkiXDE3N0VMRiIKKyNkZWZpbmUJU0VMRk1BRwkJNAorCisjZGVmaW5lCUVMRkNMQVNTTk9ORQkwCQkvKiBFSV9DTEFTUyAqLworI2RlZmluZQlFTEZDTEFTUzMyCTEKKyNkZWZpbmUJRUxGQ0xBU1M2NAkyCisjZGVmaW5lCUVMRkNMQVNTTlVNCTMKKworI2RlZmluZSBFTEZEQVRBTk9ORQkwCQkvKiBlX2lkZW50W0VJX0RBVEFdICovCisjZGVmaW5lIEVMRkRBVEEyTFNCCTEKKyNkZWZpbmUgRUxGREFUQTJNU0IJMgorCisjZGVmaW5lIEVWX05PTkUJCTAJCS8qIGVfdmVyc2lvbiwgRUlfVkVSU0lPTiAqLworI2RlZmluZSBFVl9DVVJSRU5UCTEKKyNkZWZpbmUgRVZfTlVNCQkyCisKKyNkZWZpbmUgRUxGT1NBQklfTk9ORQkwCisjZGVmaW5lIEVMRk9TQUJJX0xJTlVYCTMKKworI2lmbmRlZiBFTEZfT1NBQkkKKyNkZWZpbmUgRUxGX09TQUJJIEVMRk9TQUJJX05PTkUKKyNlbmRpZgorCisvKiBOb3RlcyB1c2VkIGluIEVUX0NPUkUgKi8KKyNkZWZpbmUgTlRfUFJTVEFUVVMJMQorI2RlZmluZSBOVF9QUkZQUkVHCTIKKyNkZWZpbmUgTlRfUFJQU0lORk8JMworI2RlZmluZSBOVF9UQVNLU1RSVUNUCTQKKyNkZWZpbmUgTlRfQVVYVgkJNgorI2RlZmluZSBOVF9QUlhGUFJFRyAgICAgMHg0NmU2MmI3ZiAgICAgIC8qIGNvcGllZCBmcm9tIGdkYjUuMS9pbmNsdWRlL2VsZi9jb21tb24uaCAqLworI2RlZmluZSBOVF9QUENfVk1YCTB4MTAwCQkvKiBQb3dlclBDIEFsdGl2ZWMvVk1YIHJlZ2lzdGVycyAqLworCisKKy8qIE5vdGUgaGVhZGVyIGluIGEgUFRfTk9URSBzZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9ub3RlIHsKKyAgRWxmMzJfV29yZAluX25hbWVzejsJLyogTmFtZSBzaXplICovCisgIEVsZjMyX1dvcmQJbl9kZXNjc3o7CS8qIENvbnRlbnQgc2l6ZSAqLworICBFbGYzMl9Xb3JkCW5fdHlwZTsJCS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGYzMl9OaGRyOworCisvKiBOb3RlIGhlYWRlciBpbiBhIFBUX05PVEUgc2VjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfbm90ZSB7CisgIEVsZjY0X1dvcmQgbl9uYW1lc3o7CS8qIE5hbWUgc2l6ZSAqLworICBFbGY2NF9Xb3JkIG5fZGVzY3N6OwkvKiBDb250ZW50IHNpemUgKi8KKyAgRWxmNjRfV29yZCBuX3R5cGU7CS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGY2NF9OaGRyOworCisjaWYgRUxGX0NMQVNTID09IEVMRkNMQVNTMzIKKworZXh0ZXJuIEVsZjMyX0R5biBfRFlOQU1JQyBbXTsKKyNkZWZpbmUgZWxmaGRyCQllbGYzMl9oZHIKKyNkZWZpbmUgZWxmX3BoZHIJZWxmMzJfcGhkcgorI2RlZmluZSBlbGZfbm90ZQllbGYzMl9ub3RlCisjZGVmaW5lIGVsZl9hZGRyX3QJRWxmMzJfT2ZmCisKKyNlbHNlCisKK2V4dGVybiBFbGY2NF9EeW4gX0RZTkFNSUMgW107CisjZGVmaW5lIGVsZmhkcgkJZWxmNjRfaGRyCisjZGVmaW5lIGVsZl9waGRyCWVsZjY0X3BoZHIKKyNkZWZpbmUgZWxmX25vdGUJZWxmNjRfbm90ZQorI2RlZmluZSBlbGZfYWRkcl90CUVsZjY0X09mZgorCisjZW5kaWYKKworLyogT3B0aW9uYWwgY2FsbGJhY2tzIHRvIHdyaXRlIGV4dHJhIEVMRiBub3Rlcy4gKi8KKyNpZm5kZWYgQVJDSF9IQVZFX0VYVFJBX0VMRl9OT1RFUworc3RhdGljIF9faW5saW5lX18gaW50IGVsZl9jb3JlZHVtcF9leHRyYV9ub3Rlc19zaXplKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBfX2lubGluZV9fIGludCBlbGZfY29yZWR1bXBfZXh0cmFfbm90ZXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQlsb2ZmX3QgKmZvZmZzZXQpIHsgcmV0dXJuIDA7IH0KKyNlbHNlCitleHRlcm4gaW50IGVsZl9jb3JlZHVtcF9leHRyYV9ub3Rlc19zaXplKHZvaWQpOworZXh0ZXJuIGludCBlbGZfY29yZWR1bXBfZXh0cmFfbm90ZXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCAqZm9mZnNldCk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGZjb3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2VsZmNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc0ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lbGZjb3JlLmgKQEAgLTAsMCArMSw5NyBAQAorI2lmbmRlZiBfTElOVVhfRUxGQ09SRV9ICisjZGVmaW5lIF9MSU5VWF9FTEZDT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworc3RydWN0IGVsZl9zaWdpbmZvCit7CisJaW50CXNpX3NpZ25vOwkJCS8qIHNpZ25hbCBudW1iZXIgKi8KKwlpbnQJc2lfY29kZTsJCQkvKiBleHRyYSBjb2RlICovCisJaW50CXNpX2Vycm5vOwkJCS8qIGVycm5vICovCit9OworCisjaW5jbHVkZSA8YXNtL2VsZi5oPgorCit0eXBlZGVmIGVsZl9ncmVnX3QgZ3JlZ190OwordHlwZWRlZiBlbGZfZ3JlZ3NldF90IGdyZWdzZXRfdDsKK3R5cGVkZWYgZWxmX2ZwcmVnc2V0X3QgZnByZWdzZXRfdDsKK3R5cGVkZWYgZWxmX2ZweHJlZ3NldF90IGZweHJlZ3NldF90OworI2RlZmluZSBOR1JFRyBFTEZfTkdSRUcKKworLyoKKyAqIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIEludGVsIFNWUjQtbGlrZSBjb3JlIGZpbGVzLgorICogVGhlc2UgbW9zdGx5IGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIFNWUjQgdHlwZXMgd2l0aCAiZWxmXyIKKyAqIHRhY2tlZCBvbiB0aGUgZnJvbnQgdG8gcHJldmVudCBjbGFzaGVzIHdpdGggbGludXggZGVmaW5pdGlvbnMsCisgKiBhbmQgdGhlIHR5cGVkZWYgZm9ybXMgaGF2ZSBiZWVuIGF2b2lkZWQuICBUaGlzIGlzIG1vc3RseSBsaWtlCisgKiB0aGUgU1ZSNCBzdHJ1Y3R1cmUsIGJ1dCBtb3JlIExpbnV4eSwgd2l0aCB0aGluZ3MgdGhhdCBMaW51eCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhbmQgd2hpY2ggZ2RiIGRvZXNuJ3QgcmVhbGx5IHVzZSBleGNsdWRlZC4KKyAqIEZpZWxkcyBwcmVzZW50IGJ1dCBub3QgdXNlZCBhcmUgbWFya2VkIHdpdGggIlhYWCIuCisgKi8KK3N0cnVjdCBlbGZfcHJzdGF0dXMKK3sKKyNpZiAwCisJbG9uZwlwcl9mbGFnczsJLyogWFhYIFByb2Nlc3MgZmxhZ3MgKi8KKwlzaG9ydAlwcl93aHk7CQkvKiBYWFggUmVhc29uIGZvciBwcm9jZXNzIGhhbHQgKi8KKwlzaG9ydAlwcl93aGF0OwkvKiBYWFggTW9yZSBkZXRhaWxlZCByZWFzb24gKi8KKyNlbmRpZgorCXN0cnVjdCBlbGZfc2lnaW5mbyBwcl9pbmZvOwkvKiBJbmZvIGFzc29jaWF0ZWQgd2l0aCBzaWduYWwgKi8KKwlzaG9ydAlwcl9jdXJzaWc7CQkvKiBDdXJyZW50IHNpZ25hbCAqLworCXVuc2lnbmVkIGxvbmcgcHJfc2lncGVuZDsJLyogU2V0IG9mIHBlbmRpbmcgc2lnbmFscyAqLworCXVuc2lnbmVkIGxvbmcgcHJfc2lnaG9sZDsJLyogU2V0IG9mIGhlbGQgc2lnbmFscyAqLworI2lmIDAKKwlzdHJ1Y3Qgc2lnYWx0c3RhY2sgcHJfYWx0c3RhY2s7CS8qIEFsdGVybmF0ZSBzdGFjayBpbmZvICovCisJc3RydWN0IHNpZ2FjdGlvbiBwcl9hY3Rpb247CS8qIFNpZ25hbCBhY3Rpb24gZm9yIGN1cnJlbnQgc2lnICovCisjZW5kaWYKKwlwaWRfdAlwcl9waWQ7CisJcGlkX3QJcHJfcHBpZDsKKwlwaWRfdAlwcl9wZ3JwOworCXBpZF90CXByX3NpZDsKKwlzdHJ1Y3QgdGltZXZhbCBwcl91dGltZTsJLyogVXNlciB0aW1lICovCisJc3RydWN0IHRpbWV2YWwgcHJfc3RpbWU7CS8qIFN5c3RlbSB0aW1lICovCisJc3RydWN0IHRpbWV2YWwgcHJfY3V0aW1lOwkvKiBDdW11bGF0aXZlIHVzZXIgdGltZSAqLworCXN0cnVjdCB0aW1ldmFsIHByX2NzdGltZTsJLyogQ3VtdWxhdGl2ZSBzeXN0ZW0gdGltZSAqLworI2lmIDAKKwlsb25nCXByX2luc3RyOwkJLyogQ3VycmVudCBpbnN0cnVjdGlvbiAqLworI2VuZGlmCisJZWxmX2dyZWdzZXRfdCBwcl9yZWc7CS8qIEdQIHJlZ2lzdGVycyAqLworI2lmZGVmIENPTkZJR19CSU5GTVRfRUxGX0ZEUElDCisJLyogV2hlbiB1c2luZyBGRFBJQywgdGhlIGxvYWRtYXAgYWRkcmVzc2VzIG5lZWQgdG8gYmUgY29tbXVuaWNhdGVkCisJICogdG8gR0RCIGluIG9yZGVyIGZvciBHREIgdG8gZG8gdGhlIG5lY2Vzc2FyeSByZWxvY2F0aW9ucy4gIFRoZQorCSAqIGZpZWxkcyAoYmVsb3cpIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhpcyBpbmZvcm1hdGlvbiBhcmUgcGxhY2VkCisJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYGBwcl9yZWcnJywgc28gdGhhdCB0aGUgbG9hZG1hcCBhZGRyZXNzZXMgbWF5CisJICogYmUgdmlld2VkIGFzIHBhcnQgb2YgdGhlIHJlZ2lzdGVyIHNldCBpZiBzbyBkZXNpcmVkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgcHJfZXhlY19mZHBpY19sb2FkbWFwOworCXVuc2lnbmVkIGxvbmcgcHJfaW50ZXJwX2ZkcGljX2xvYWRtYXA7CisjZW5kaWYKKwlpbnQgcHJfZnB2YWxpZDsJCS8qIFRydWUgaWYgbWF0aCBjby1wcm9jZXNzb3IgYmVpbmcgdXNlZC4gICovCit9OworCisjZGVmaW5lIEVMRl9QUkFSR1NaCSg4MCkJLyogTnVtYmVyIG9mIGNoYXJzIGZvciBhcmdzICovCisKK3N0cnVjdCBlbGZfcHJwc2luZm8KK3sKKwljaGFyCXByX3N0YXRlOwkvKiBudW1lcmljIHByb2Nlc3Mgc3RhdGUgKi8KKwljaGFyCXByX3NuYW1lOwkvKiBjaGFyIGZvciBwcl9zdGF0ZSAqLworCWNoYXIJcHJfem9tYjsJLyogem9tYmllICovCisJY2hhcglwcl9uaWNlOwkvKiBuaWNlIHZhbCAqLworCXVuc2lnbmVkIGxvbmcgcHJfZmxhZzsJLyogZmxhZ3MgKi8KKwlfX2tlcm5lbF91aWRfdAlwcl91aWQ7CisJX19rZXJuZWxfZ2lkX3QJcHJfZ2lkOworCXBpZF90CXByX3BpZCwgcHJfcHBpZCwgcHJfcGdycCwgcHJfc2lkOworCS8qIExvdHMgbWlzc2luZyAqLworCWNoYXIJcHJfZm5hbWVbMTZdOwkvKiBmaWxlbmFtZSBvZiBleGVjdXRhYmxlICovCisJY2hhcglwcl9wc2FyZ3NbRUxGX1BSQVJHU1pdOwkvKiBpbml0aWFsIHBhcnQgb2YgYXJnIGxpc3QgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGVsZl9wcnN0YXR1cyBwcnN0YXR1c190OwordHlwZWRlZiBzdHJ1Y3QgZWxmX3BycHNpbmZvIHBycHNpbmZvX3Q7CisjZGVmaW5lIFBSQVJHU1ogRUxGX1BSQVJHU1ogCisKKworCisjZW5kaWYgLyogX0xJTlVYX0VMRkNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lcnJuby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODVmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Vycm5vLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9MSU5VWF9FUlJOT19ICisjZGVmaW5lIF9MSU5VWF9FUlJOT19ICisKKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXJycXVldWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXJycXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzk0YWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9lcnJxdWV1ZS5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX0xJTlVYX0VSUlFVRVVFX0gKKyNkZWZpbmUgX0xJTlVYX0VSUlFVRVVFX0ggMQorCitzdHJ1Y3Qgc29ja19leHRlbmRlZF9lcnIKK3sKKwlfX3UzMgllZV9lcnJubzsJCisJX191OAllZV9vcmlnaW47CisJX191OAllZV90eXBlOworCV9fdTgJZWVfY29kZTsKKwlfX3U4CWVlX3BhZDsKKwlfX3UzMiAgIGVlX2luZm87CisJX191MzIgICBlZV9kYXRhOworfTsKKworI2RlZmluZSBTT19FRV9PUklHSU5fTk9ORQkwCisjZGVmaW5lIFNPX0VFX09SSUdJTl9MT0NBTAkxCisjZGVmaW5lIFNPX0VFX09SSUdJTl9JQ01QCTIKKyNkZWZpbmUgU09fRUVfT1JJR0lOX0lDTVA2CTMKKworI2RlZmluZSBTT19FRV9PRkZFTkRFUihlZSkJKChzdHJ1Y3Qgc29ja2FkZHIqKSgoZWUpKzEpKQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldGh0b29sLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M3YzlhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBldGh0b29sLmg6IERlZmluZXMgZm9yIExpbnV4IGV0aHRvb2wuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAyMDAxIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAyMDAxIFN1biBNaWNyb3N5c3RlbXMgKHRob2NraW5Ac3VuLmNvbSkKKyAqIFBvcnRpb25zIENvcHlyaWdodCAyMDAyIEludGVsIChlbGkua3VwZXJtYW5uQGludGVsLmNvbSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJpc3RvcGhlci5sZWVjaEBpbnRlbC5jb20sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvdHQuZmVsZG1hbkBpbnRlbC5jb20pCisgKi8KKworI2lmbmRlZiBfTElOVVhfRVRIVE9PTF9ICisjZGVmaW5lIF9MSU5VWF9FVEhUT09MX0gKKworCisvKiBUaGlzIHNob3VsZCB3b3JrIGZvciBib3RoIDMyIGFuZCA2NCBiaXQgdXNlcmxhbmQuICovCitzdHJ1Y3QgZXRodG9vbF9jbWQgeworCV9fdTMyCWNtZDsKKwlfX3UzMglzdXBwb3J0ZWQ7CS8qIEZlYXR1cmVzIHRoaXMgaW50ZXJmYWNlIHN1cHBvcnRzICovCisJX191MzIJYWR2ZXJ0aXNpbmc7CS8qIEZlYXR1cmVzIHRoaXMgaW50ZXJmYWNlIGFkdmVydGlzZXMgKi8KKwlfX3UxNglzcGVlZDsJCS8qIFRoZSBmb3JjZWQgc3BlZWQsIDEwTWIsIDEwME1iLCBnaWdhYml0ICovCisJX191OAlkdXBsZXg7CQkvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbCAqLworCV9fdTgJcG9ydDsJCS8qIFdoaWNoIGNvbm5lY3RvciBwb3J0ICovCisJX191OAlwaHlfYWRkcmVzczsKKwlfX3U4CXRyYW5zY2VpdmVyOwkvKiBXaGljaCB0cmFuc2NlaXZlciB0byB1c2UgKi8KKwlfX3U4CWF1dG9uZWc7CS8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbiAqLworCV9fdTMyCW1heHR4cGt0OwkvKiBUeCBwa3RzIGJlZm9yZSBnZW5lcmF0aW5nIHR4IGludCAqLworCV9fdTMyCW1heHJ4cGt0OwkvKiBSeCBwa3RzIGJlZm9yZSBnZW5lcmF0aW5nIHJ4IGludCAqLworCV9fdTMyCXJlc2VydmVkWzRdOworfTsKKworI2RlZmluZSBFVEhUT09MX0JVU0lORk9fTEVOCTMyCisvKiB0aGVzZSBzdHJpbmdzIGFyZSBzZXQgdG8gd2hhdGV2ZXIgdGhlIGRyaXZlciBhdXRob3IgZGVjaWRlcy4uLiAqLworc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyB7CisJX191MzIJY21kOworCWNoYXIJZHJpdmVyWzMyXTsJLyogZHJpdmVyIHNob3J0IG5hbWUsICJ0dWxpcCIsICJlZXBybzEwMCIgKi8KKwljaGFyCXZlcnNpb25bMzJdOwkvKiBkcml2ZXIgdmVyc2lvbiBzdHJpbmcgKi8KKwljaGFyCWZ3X3ZlcnNpb25bMzJdOwkvKiBmaXJtd2FyZSB2ZXJzaW9uIHN0cmluZywgaWYgYXBwbGljYWJsZSAqLworCWNoYXIJYnVzX2luZm9bRVRIVE9PTF9CVVNJTkZPX0xFTl07CS8qIEJ1cyBpbmZvIGZvciB0aGlzIElGLiAqLworCQkJCS8qIEZvciBQQ0kgZGV2aWNlcywgdXNlIHBjaV9uYW1lKHBjaV9kZXYpLiAqLworCWNoYXIJcmVzZXJ2ZWQxWzMyXTsKKwljaGFyCXJlc2VydmVkMlsxMl07CisJX191MzIJbl9wcml2X2ZsYWdzOwkvKiBudW1iZXIgb2YgZmxhZ3MgdmFsaWQgaW4gRVRIVE9PTF9HUEZMQUdTICovCisJX191MzIJbl9zdGF0czsJLyogbnVtYmVyIG9mIHU2NCdzIGZyb20gRVRIVE9PTF9HU1RBVFMgKi8KKwlfX3UzMgl0ZXN0aW5mb19sZW47CisJX191MzIJZWVkdW1wX2xlbjsJLyogU2l6ZSBvZiBkYXRhIGZyb20gRVRIVE9PTF9HRUVQUk9NIChieXRlcykgKi8KKwlfX3UzMglyZWdkdW1wX2xlbjsJLyogU2l6ZSBvZiBkYXRhIGZyb20gRVRIVE9PTF9HUkVHUyAoYnl0ZXMpICovCit9OworCisjZGVmaW5lIFNPUEFTU19NQVgJNgorLyogd2FrZS1vbi1sYW4gc2V0dGluZ3MgKi8KK3N0cnVjdCBldGh0b29sX3dvbGluZm8geworCV9fdTMyCWNtZDsKKwlfX3UzMglzdXBwb3J0ZWQ7CisJX191MzIJd29sb3B0czsKKwlfX3U4CXNvcGFzc1tTT1BBU1NfTUFYXTsgLyogU2VjdXJlT24odG0pIHBhc3N3b3JkICovCit9OworCisvKiBmb3IgcGFzc2luZyBzaW5nbGUgdmFsdWVzICovCitzdHJ1Y3QgZXRodG9vbF92YWx1ZSB7CisJX191MzIJY21kOworCV9fdTMyCWRhdGE7Cit9OworCisvKiBmb3IgcGFzc2luZyBiaWcgY2h1bmtzIG9mIGRhdGEgKi8KK3N0cnVjdCBldGh0b29sX3JlZ3MgeworCV9fdTMyCWNtZDsKKwlfX3UzMgl2ZXJzaW9uOyAvKiBkcml2ZXItc3BlY2lmaWMsIGluZGljYXRlcyBkaWZmZXJlbnQgY2hpcHMvcmV2cyAqLworCV9fdTMyCWxlbjsgLyogYnl0ZXMgKi8KKwlfX3U4CWRhdGFbMF07Cit9OworCisvKiBmb3IgcGFzc2luZyBFRVBST00gY2h1bmtzICovCitzdHJ1Y3QgZXRodG9vbF9lZXByb20geworCV9fdTMyCWNtZDsKKwlfX3UzMgltYWdpYzsKKwlfX3UzMglvZmZzZXQ7IC8qIGluIGJ5dGVzICovCisJX191MzIJbGVuOyAvKiBpbiBieXRlcyAqLworCV9fdTgJZGF0YVswXTsKK307CisKKy8qIGZvciBjb25maWd1cmluZyBjb2FsZXNjaW5nIHBhcmFtZXRlcnMgb2YgY2hpcCAqLworc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgeworCV9fdTMyCWNtZDsJLyogRVRIVE9PTF97RyxTfUNPQUxFU0NFICovCisKKwkvKiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBhbiBSWCBpbnRlcnJ1cHQgYWZ0ZXIKKwkgKiBhIHBhY2tldCBhcnJpdmVzLiAgSWYgMCwgb25seSByeF9tYXhfY29hbGVzY2VkX2ZyYW1lcworCSAqIGlzIHVzZWQuCisJICovCisJX191MzIJcnhfY29hbGVzY2VfdXNlY3M7CisKKwkvKiBIb3cgbWFueSBwYWNrZXRzIHRvIGRlbGF5IGFuIFJYIGludGVycnVwdCBhZnRlcgorCSAqIGEgcGFja2V0IGFycml2ZXMuICBJZiAwLCBvbmx5IHJ4X2NvYWxlc2NlX3VzZWNzIGlzCisJICogdXNlZC4gIEl0IGlzIGlsbGVnYWwgdG8gc2V0IGJvdGggdXNlY3MgYW5kIG1heCBmcmFtZXMKKwkgKiB0byB6ZXJvIGFzIHRoaXMgd291bGQgY2F1c2UgUlggaW50ZXJydXB0cyB0byBuZXZlciBiZQorCSAqIGdlbmVyYXRlZC4KKwkgKi8KKwlfX3UzMglyeF9tYXhfY29hbGVzY2VkX2ZyYW1lczsKKworCS8qIFNhbWUgYXMgYWJvdmUgdHdvIHBhcmFtZXRlcnMsIGV4Y2VwdCB0aGF0IHRoZXNlIHZhbHVlcworCSAqIGFwcGx5IHdoaWxlIGFuIElSUSBpcyBiZWluZyBzZXJ2aWNlZCBieSB0aGUgaG9zdC4gIE5vdAorCSAqIGFsbCBjYXJkcyBzdXBwb3J0IHRoaXMgZmVhdHVyZSBhbmQgdGhlIHZhbHVlcyBhcmUgaWdub3JlZAorCSAqIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlfX3UzMglyeF9jb2FsZXNjZV91c2Vjc19pcnE7CisJX191MzIJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOworCisJLyogSG93IG1hbnkgdXNlY3MgdG8gZGVsYXkgYSBUWCBpbnRlcnJ1cHQgYWZ0ZXIKKwkgKiBhIHBhY2tldCBpcyBzZW50LiAgSWYgMCwgb25seSB0eF9tYXhfY29hbGVzY2VkX2ZyYW1lcworCSAqIGlzIHVzZWQuCisJICovCisJX191MzIJdHhfY29hbGVzY2VfdXNlY3M7CisKKwkvKiBIb3cgbWFueSBwYWNrZXRzIHRvIGRlbGF5IGEgVFggaW50ZXJydXB0IGFmdGVyCisJICogYSBwYWNrZXQgaXMgc2VudC4gIElmIDAsIG9ubHkgdHhfY29hbGVzY2VfdXNlY3MgaXMKKwkgKiB1c2VkLiAgSXQgaXMgaWxsZWdhbCB0byBzZXQgYm90aCB1c2VjcyBhbmQgbWF4IGZyYW1lcworCSAqIHRvIHplcm8gYXMgdGhpcyB3b3VsZCBjYXVzZSBUWCBpbnRlcnJ1cHRzIHRvIG5ldmVyIGJlCisJICogZ2VuZXJhdGVkLgorCSAqLworCV9fdTMyCXR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCisJLyogU2FtZSBhcyBhYm92ZSB0d28gcGFyYW1ldGVycywgZXhjZXB0IHRoYXQgdGhlc2UgdmFsdWVzCisJICogYXBwbHkgd2hpbGUgYW4gSVJRIGlzIGJlaW5nIHNlcnZpY2VkIGJ5IHRoZSBob3N0LiAgTm90CisJICogYWxsIGNhcmRzIHN1cHBvcnQgdGhpcyBmZWF0dXJlIGFuZCB0aGUgdmFsdWVzIGFyZSBpZ25vcmVkCisJICogaW4gdGhhdCBjYXNlLgorCSAqLworCV9fdTMyCXR4X2NvYWxlc2NlX3VzZWNzX2lycTsKKwlfX3UzMgl0eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CisKKwkvKiBIb3cgbWFueSB1c2VjcyB0byBkZWxheSBpbi1tZW1vcnkgc3RhdGlzdGljcworCSAqIGJsb2NrIHVwZGF0ZXMuICBTb21lIGRyaXZlcnMgZG8gbm90IGhhdmUgYW4gaW4tbWVtb3J5CisJICogc3RhdGlzdGljIGJsb2NrLCBhbmQgaW4gc3VjaCBjYXNlcyB0aGlzIHZhbHVlIGlzIGlnbm9yZWQuCisJICogVGhpcyB2YWx1ZSBtdXN0IG5vdCBiZSB6ZXJvLgorCSAqLworCV9fdTMyCXN0YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzOworCisJLyogQWRhcHRpdmUgUlgvVFggY29hbGVzY2luZyBpcyBhbiBhbGdvcml0aG0gaW1wbGVtZW50ZWQgYnkKKwkgKiBzb21lIGRyaXZlcnMgdG8gaW1wcm92ZSBsYXRlbmN5IHVuZGVyIGxvdyBwYWNrZXQgcmF0ZXMgYW5kCisJICogaW1wcm92ZSB0aHJvdWdocHV0IHVuZGVyIGhpZ2ggcGFja2V0IHJhdGVzLiAgU29tZSBkcml2ZXJzCisJICogb25seSBpbXBsZW1lbnQgb25lIG9mIFJYIG9yIFRYIGFkYXB0aXZlIGNvYWxlc2NpbmcuICBBbnl0aGluZworCSAqIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgZHJpdmVyIGNhdXNlcyB0aGVzZSB2YWx1ZXMgdG8gYmUKKwkgKiBzaWxlbnRseSBpZ25vcmVkLgorCSAqLworCV9fdTMyCXVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZTsKKwlfX3UzMgl1c2VfYWRhcHRpdmVfdHhfY29hbGVzY2U7CisKKwkvKiBXaGVuIHRoZSBwYWNrZXQgcmF0ZSAobWVhc3VyZWQgaW4gcGFja2V0cyBwZXIgc2Vjb25kKQorCSAqIGlzIGJlbG93IHBrdF9yYXRlX2xvdywgdGhlIHtyeCx0eH1fKl9sb3cgcGFyYW1ldGVycyBhcmUKKwkgKiB1c2VkLgorCSAqLworCV9fdTMyCXBrdF9yYXRlX2xvdzsKKwlfX3UzMglyeF9jb2FsZXNjZV91c2Vjc19sb3c7CisJX191MzIJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93OworCV9fdTMyCXR4X2NvYWxlc2NlX3VzZWNzX2xvdzsKKwlfX3UzMgl0eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3c7CisKKwkvKiBXaGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBiZWxvdyBwa3RfcmF0ZV9oaWdoIGJ1dCBhYm92ZQorCSAqIHBrdF9yYXRlX2xvdyAoYm90aCBtZWFzdXJlZCBpbiBwYWNrZXRzIHBlciBzZWNvbmQpIHRoZQorCSAqIG5vcm1hbCB7cngsdHh9XyogY29hbGVzY2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgorCSAqLworCisJLyogV2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgKG1lYXN1cmVkIGluIHBhY2tldHMgcGVyIHNlY29uZCkKKwkgKiBpcyBhYm92ZSBwa3RfcmF0ZV9oaWdoLCB0aGUge3J4LHR4fV8qX2hpZ2ggcGFyYW1ldGVycyBhcmUKKwkgKiB1c2VkLgorCSAqLworCV9fdTMyCXBrdF9yYXRlX2hpZ2g7CisJX191MzIJcnhfY29hbGVzY2VfdXNlY3NfaGlnaDsKKwlfX3UzMglyeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoOworCV9fdTMyCXR4X2NvYWxlc2NlX3VzZWNzX2hpZ2g7CisJX191MzIJdHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaDsKKworCS8qIEhvdyBvZnRlbiB0byBkbyBhZGFwdGl2ZSBjb2FsZXNjaW5nIHBhY2tldCByYXRlIHNhbXBsaW5nLAorCSAqIG1lYXN1cmVkIGluIHNlY29uZHMuICBNdXN0IG5vdCBiZSB6ZXJvLgorCSAqLworCV9fdTMyCXJhdGVfc2FtcGxlX2ludGVydmFsOworfTsKKworLyogZm9yIGNvbmZpZ3VyaW5nIFJYL1RYIHJpbmcgcGFyYW1ldGVycyAqLworc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtIHsKKwlfX3UzMgljbWQ7CS8qIEVUSFRPT0xfe0csU31SSU5HUEFSQU0gKi8KKworCS8qIFJlYWQgb25seSBhdHRyaWJ1dGVzLiAgVGhlc2UgaW5kaWNhdGUgdGhlIG1heGltdW0gbnVtYmVyCisJICogb2YgcGVuZGluZyBSWC9UWCByaW5nIGVudHJpZXMgdGhlIGRyaXZlciB3aWxsIGFsbG93IHRoZQorCSAqIHVzZXIgdG8gc2V0LgorCSAqLworCV9fdTMyCXJ4X21heF9wZW5kaW5nOworCV9fdTMyCXJ4X21pbmlfbWF4X3BlbmRpbmc7CisJX191MzIJcnhfanVtYm9fbWF4X3BlbmRpbmc7CisJX191MzIJdHhfbWF4X3BlbmRpbmc7CisKKwkvKiBWYWx1ZXMgY2hhbmdlYWJsZSBieSB0aGUgdXNlci4gIFRoZSB2YWxpZCB2YWx1ZXMgYXJlCisJICogaW4gdGhlIHJhbmdlIDEgdG8gdGhlICIqX21heF9wZW5kaW5nIiBjb3VudGVycGFydCBhYm92ZS4KKwkgKi8KKwlfX3UzMglyeF9wZW5kaW5nOworCV9fdTMyCXJ4X21pbmlfcGVuZGluZzsKKwlfX3UzMglyeF9qdW1ib19wZW5kaW5nOworCV9fdTMyCXR4X3BlbmRpbmc7Cit9OworCisvKiBmb3IgY29uZmlndXJpbmcgbGluayBmbG93IGNvbnRyb2wgcGFyYW1ldGVycyAqLworc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSB7CisJX191MzIJY21kOwkvKiBFVEhUT09MX3tHLFN9UEFVU0VQQVJBTSAqLworCisJLyogSWYgdGhlIGxpbmsgaXMgYmVpbmcgYXV0by1uZWdvdGlhdGVkICh2aWEgZXRodG9vbF9jbWQuYXV0b25lZworCSAqIGJlaW5nIHRydWUpIHRoZSB1c2VyIG1heSBzZXQgJ2F1dG9uZXQnIGhlcmUgbm9uLXplcm8gdG8gaGF2ZSB0aGUKKwkgKiBwYXVzZSBwYXJhbWV0ZXJzIGJlIGF1dG8tbmVnb3RpYXRlZCB0b28uICBJbiBzdWNoIGEgY2FzZSwgdGhlCisJICoge3J4LHR4fV9wYXVzZSB2YWx1ZXMgYmVsb3cgZGV0ZXJtaW5lIHdoYXQgY2FwYWJpbGl0aWVzIGFyZQorCSAqIGFkdmVydGlzZWQuCisJICoKKwkgKiBJZiAnYXV0b25lZycgaXMgemVybyBvciB0aGUgbGluayBpcyBub3QgYmVpbmcgYXV0by1uZWdvdGlhdGVkLAorCSAqIHRoZW4ge3J4LHR4fV9wYXVzZSBmb3JjZSB0aGUgZHJpdmVyIHRvIHVzZS9ub3QtdXNlIHBhdXNlCisJICogZmxvdyBjb250cm9sLgorCSAqLworCV9fdTMyCWF1dG9uZWc7CisJX191MzIJcnhfcGF1c2U7CisJX191MzIJdHhfcGF1c2U7Cit9OworCisjZGVmaW5lIEVUSF9HU1RSSU5HX0xFTgkJMzIKK2VudW0gZXRodG9vbF9zdHJpbmdzZXQgeworCUVUSF9TU19URVNUCQk9IDAsCisJRVRIX1NTX1NUQVRTLAorCUVUSF9TU19QUklWX0ZMQUdTLAorfTsKKworLyogZm9yIHBhc3Npbmcgc3RyaW5nIHNldHMgZm9yIGRhdGEgdGFnZ2luZyAqLworc3RydWN0IGV0aHRvb2xfZ3N0cmluZ3MgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfR1NUUklOR1MgKi8KKwlfX3UzMglzdHJpbmdfc2V0OwkvKiBzdHJpbmcgc2V0IGlkIGUuYy4gRVRIX1NTX1RFU1QsIGV0YyovCisJX191MzIJbGVuOwkJLyogbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIHN0cmluZyBzZXQgKi8KKwlfX3U4CWRhdGFbMF07Cit9OworCitlbnVtIGV0aHRvb2xfdGVzdF9mbGFncyB7CisJRVRIX1RFU1RfRkxfT0ZGTElORQk9ICgxIDw8IDApLAkvKiBvbmxpbmUgLyBvZmZsaW5lICovCisJRVRIX1RFU1RfRkxfRkFJTEVECT0gKDEgPDwgMSksCS8qIHRlc3QgcGFzc2VkIC8gZmFpbGVkICovCit9OworCisvKiBmb3IgcmVxdWVzdGluZyBOSUMgdGVzdCBhbmQgZ2V0dGluZyByZXN1bHRzKi8KK3N0cnVjdCBldGh0b29sX3Rlc3QgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfVEVTVCAqLworCV9fdTMyCWZsYWdzOwkJLyogRVRIX1RFU1RfRkxfeHh4ICovCisJX191MzIJcmVzZXJ2ZWQ7CisJX191MzIJbGVuOwkJLyogcmVzdWx0IGxlbmd0aCwgaW4gbnVtYmVyIG9mIHU2NCBlbGVtZW50cyAqLworCV9fdTY0CWRhdGFbMF07Cit9OworCisvKiBmb3IgZHVtcGluZyBOSUMtc3BlY2lmaWMgc3RhdGlzdGljcyAqLworc3RydWN0IGV0aHRvb2xfc3RhdHMgeworCV9fdTMyCWNtZDsJCS8qIEVUSFRPT0xfR1NUQVRTICovCisJX191MzIJbl9zdGF0czsJLyogbnVtYmVyIG9mIHU2NCdzIGJlaW5nIHJldHVybmVkICovCisJX191NjQJZGF0YVswXTsKK307CisKK3N0cnVjdCBldGh0b29sX3Blcm1fYWRkciB7CisJX191MzIJY21kOwkJLyogRVRIVE9PTF9HUEVSTUFERFIgKi8KKwlfX3UzMglzaXplOworCV9fdTgJZGF0YVswXTsKK307CisKKy8qIGJvb2xlYW4gZmxhZ3MgY29udHJvbGxpbmcgcGVyLWludGVyZmFjZSBiZWhhdmlvciBjaGFyYWN0ZXJpc3RpY3MuCisgKiBXaGVuIHJlYWRpbmcsIHRoZSBmbGFnIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIGNlcnRhaW4gYmVoYXZpb3IKKyAqIGlzIGVuYWJsZWQvcHJlc2VudC4gIFdoZW4gd3JpdGluZywgdGhlIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIKKyAqIG9yIG5vdCB0aGUgZHJpdmVyIHNob3VsZCB0dXJuIG9uIChzZXQpIG9yIG9mZiAoY2xlYXIpIGEgYmVoYXZpb3IuCisgKgorICogU29tZSBiZWhhdmlvcnMgbWF5IHJlYWQtb25seSAodW5jb25kaXRpb25hbGx5IGFic2VudCBvciBwcmVzZW50KS4KKyAqIElmIHN1Y2ggaXMgdGhlIGNhc2UsIHJldHVybiBFSU5WQUwgaW4gdGhlIHNldC1mbGFncyBvcGVyYXRpb24gaWYgdGhlCisgKiBmbGFnIGRpZmZlcnMgZnJvbSB0aGUgcmVhZC1vbmx5IHZhbHVlLgorICovCitlbnVtIGV0aHRvb2xfZmxhZ3MgeworCUVUSF9GTEFHX0xSTwkJPSAoMSA8PCAxNSksCS8qIExSTyBpcyBlbmFibGVkICovCit9OworCisKKy8qIENNRHMgY3VycmVudGx5IHN1cHBvcnRlZCAqLworI2RlZmluZSBFVEhUT09MX0dTRVQJCTB4MDAwMDAwMDEgLyogR2V0IHNldHRpbmdzLiAqLworI2RlZmluZSBFVEhUT09MX1NTRVQJCTB4MDAwMDAwMDIgLyogU2V0IHNldHRpbmdzLiAqLworI2RlZmluZSBFVEhUT09MX0dEUlZJTkZPCTB4MDAwMDAwMDMgLyogR2V0IGRyaXZlciBpbmZvLiAqLworI2RlZmluZSBFVEhUT09MX0dSRUdTCQkweDAwMDAwMDA0IC8qIEdldCBOSUMgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBFVEhUT09MX0dXT0wJCTB4MDAwMDAwMDUgLyogR2V0IHdha2Utb24tbGFuIG9wdGlvbnMuICovCisjZGVmaW5lIEVUSFRPT0xfU1dPTAkJMHgwMDAwMDAwNiAvKiBTZXQgd2FrZS1vbi1sYW4gb3B0aW9ucy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HTVNHTFZMCQkweDAwMDAwMDA3IC8qIEdldCBkcml2ZXIgbWVzc2FnZSBsZXZlbCAqLworI2RlZmluZSBFVEhUT09MX1NNU0dMVkwJCTB4MDAwMDAwMDggLyogU2V0IGRyaXZlciBtc2cgbGV2ZWwuICovCisjZGVmaW5lIEVUSFRPT0xfTldBWV9SU1QJMHgwMDAwMDAwOSAvKiBSZXN0YXJ0IGF1dG9uZWdvdGlhdGlvbi4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HTElOSwkJMHgwMDAwMDAwYSAvKiBHZXQgbGluayBzdGF0dXMgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR0VFUFJPTQkJMHgwMDAwMDAwYiAvKiBHZXQgRUVQUk9NIGRhdGEgKi8KKyNkZWZpbmUgRVRIVE9PTF9TRUVQUk9NCQkweDAwMDAwMDBjIC8qIFNldCBFRVBST00gZGF0YS4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HQ09BTEVTQ0UJMHgwMDAwMDAwZSAvKiBHZXQgY29hbGVzY2UgY29uZmlnICovCisjZGVmaW5lIEVUSFRPT0xfU0NPQUxFU0NFCTB4MDAwMDAwMGYgLyogU2V0IGNvYWxlc2NlIGNvbmZpZy4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HUklOR1BBUkFNCTB4MDAwMDAwMTAgLyogR2V0IHJpbmcgcGFyYW1ldGVycyAqLworI2RlZmluZSBFVEhUT09MX1NSSU5HUEFSQU0JMHgwMDAwMDAxMSAvKiBTZXQgcmluZyBwYXJhbWV0ZXJzLiAqLworI2RlZmluZSBFVEhUT09MX0dQQVVTRVBBUkFNCTB4MDAwMDAwMTIgLyogR2V0IHBhdXNlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRVRIVE9PTF9TUEFVU0VQQVJBTQkweDAwMDAwMDEzIC8qIFNldCBwYXVzZSBwYXJhbWV0ZXJzLiAqLworI2RlZmluZSBFVEhUT09MX0dSWENTVU0JCTB4MDAwMDAwMTQgLyogR2V0IFJYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NSWENTVU0JCTB4MDAwMDAwMTUgLyogU2V0IFJYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dUWENTVU0JCTB4MDAwMDAwMTYgLyogR2V0IFRYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NUWENTVU0JCTB4MDAwMDAwMTcgLyogU2V0IFRYIGh3IGNzdW0gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dTRwkJMHgwMDAwMDAxOCAvKiBHZXQgc2NhdHRlci1nYXRoZXIgZW5hYmxlCisJCQkJCSAgICAqIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NTRwkJMHgwMDAwMDAxOSAvKiBTZXQgc2NhdHRlci1nYXRoZXIgZW5hYmxlCisJCQkJCSAgICAqIChldGh0b29sX3ZhbHVlKS4gKi8KKyNkZWZpbmUgRVRIVE9PTF9URVNUCQkweDAwMDAwMDFhIC8qIGV4ZWN1dGUgTklDIHNlbGYtdGVzdC4gKi8KKyNkZWZpbmUgRVRIVE9PTF9HU1RSSU5HUwkweDAwMDAwMDFiIC8qIGdldCBzcGVjaWZpZWQgc3RyaW5nIHNldCAqLworI2RlZmluZSBFVEhUT09MX1BIWVNfSUQJCTB4MDAwMDAwMWMgLyogaWRlbnRpZnkgdGhlIE5JQyAqLworI2RlZmluZSBFVEhUT09MX0dTVEFUUwkJMHgwMDAwMDAxZCAvKiBnZXQgTklDLXNwZWNpZmljIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgRVRIVE9PTF9HVFNPCQkweDAwMDAwMDFlIC8qIEdldCBUU08gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NUU08JCTB4MDAwMDAwMWYgLyogU2V0IFRTTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1BFUk1BRERSCTB4MDAwMDAwMjAgLyogR2V0IHBlcm1hbmVudCBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIEVUSFRPT0xfR1VGTwkJMHgwMDAwMDAyMSAvKiBHZXQgVUZPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9TVUZPCQkweDAwMDAwMDIyIC8qIFNldCBVRk8gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX0dHU08JCTB4MDAwMDAwMjMgLyogR2V0IEdTTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfU0dTTwkJMHgwMDAwMDAyNCAvKiBTZXQgR1NPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9HRkxBR1MJCTB4MDAwMDAwMjUgLyogR2V0IGZsYWdzIGJpdG1hcChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NGTEFHUwkJMHgwMDAwMDAyNiAvKiBTZXQgZmxhZ3MgYml0bWFwKGV0aHRvb2xfdmFsdWUpICovCisjZGVmaW5lIEVUSFRPT0xfR1BGTEFHUwkJMHgwMDAwMDAyNyAvKiBHZXQgZHJpdmVyLXByaXZhdGUgZmxhZ3MgYml0bWFwICovCisjZGVmaW5lIEVUSFRPT0xfU1BGTEFHUwkJMHgwMDAwMDAyOCAvKiBTZXQgZHJpdmVyLXByaXZhdGUgZmxhZ3MgYml0bWFwICovCisKKy8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlICovCisjZGVmaW5lIFNQQVJDX0VUSF9HU0VUCQlFVEhUT09MX0dTRVQKKyNkZWZpbmUgU1BBUkNfRVRIX1NTRVQJCUVUSFRPT0xfU1NFVAorCisvKiBJbmRpY2F0ZXMgd2hhdCBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBpbnRlcmZhY2UuICovCisjZGVmaW5lIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYJCSgxIDw8IDApCisjZGVmaW5lIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwJCSgxIDw8IDEpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCQkoMSA8PCAyKQorI2RlZmluZSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAkJKDEgPDwgMykKKyNkZWZpbmUgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCSgxIDw8IDQpCisjZGVmaW5lIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAkoMSA8PCA1KQorI2RlZmluZSBTVVBQT1JURURfQXV0b25lZwkJKDEgPDwgNikKKyNkZWZpbmUgU1VQUE9SVEVEX1RQCQkJKDEgPDwgNykKKyNkZWZpbmUgU1VQUE9SVEVEX0FVSQkJCSgxIDw8IDgpCisjZGVmaW5lIFNVUFBPUlRFRF9NSUkJCQkoMSA8PCA5KQorI2RlZmluZSBTVVBQT1JURURfRklCUkUJCQkoMSA8PCAxMCkKKyNkZWZpbmUgU1VQUE9SVEVEX0JOQwkJCSgxIDw8IDExKQorI2RlZmluZSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsCSgxIDw8IDEyKQorI2RlZmluZSBTVVBQT1JURURfUGF1c2UJCQkoMSA8PCAxMykKKyNkZWZpbmUgU1VQUE9SVEVEX0FzeW1fUGF1c2UJCSgxIDw8IDE0KQorI2RlZmluZSBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwJKDEgPDwgMTUpCisKKy8qIEluZGljYXRlcyB3aGF0IGZlYXR1cmVzIGFyZSBhZHZlcnRpc2VkIGJ5IHRoZSBpbnRlcmZhY2UuICovCisjZGVmaW5lIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmCQkoMSA8PCAwKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbAkJKDEgPDwgMSkKKyNkZWZpbmUgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmCSgxIDw8IDIpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbAkoMSA8PCAzKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmCSgxIDw8IDQpCisjZGVmaW5lIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwJKDEgPDwgNSkKKyNkZWZpbmUgQURWRVJUSVNFRF9BdXRvbmVnCQkoMSA8PCA2KQorI2RlZmluZSBBRFZFUlRJU0VEX1RQCQkJKDEgPDwgNykKKyNkZWZpbmUgQURWRVJUSVNFRF9BVUkJCQkoMSA8PCA4KQorI2RlZmluZSBBRFZFUlRJU0VEX01JSQkJCSgxIDw8IDkpCisjZGVmaW5lIEFEVkVSVElTRURfRklCUkUJCSgxIDw8IDEwKQorI2RlZmluZSBBRFZFUlRJU0VEX0JOQwkJCSgxIDw8IDExKQorI2RlZmluZSBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbAkoMSA8PCAxMikKKyNkZWZpbmUgQURWRVJUSVNFRF9QYXVzZQkJKDEgPDwgMTMpCisjZGVmaW5lIEFEVkVSVElTRURfQXN5bV9QYXVzZQkJKDEgPDwgMTQpCisjZGVmaW5lIEFEVkVSVElTRURfMjUwMGJhc2VYX0Z1bGwJKDEgPDwgMTUpCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBpbnZvbHZlZCBpbiBmb3JjaW5nIGEgcGFydGljdWxhciBsaW5rCisgKiBtb2RlIGZvciB0aGUgZGV2aWNlIGZvciBzZXR0aW5nIHRoaW5ncy4gIFdoZW4gZ2V0dGluZyB0aGUKKyAqIGRldmljZXMgc2V0dGluZ3MsIHRoZXNlIGluZGljYXRlIHRoZSBjdXJyZW50IG1vZGUgYW5kIHdoZXRoZXIKKyAqIGl0IHdhcyBmb2NlZCB1cCBpbnRvIHRoaXMgbW9kZSBvciBhdXRvbmVnb3RpYXRlZC4KKyAqLworCisvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdCwgMi41R2IsIDEwR2JFLiAqLworI2RlZmluZSBTUEVFRF8xMAkJMTAKKyNkZWZpbmUgU1BFRURfMTAwCQkxMDAKKyNkZWZpbmUgU1BFRURfMTAwMAkJMTAwMAorI2RlZmluZSBTUEVFRF8yNTAwCQkyNTAwCisjZGVmaW5lIFNQRUVEXzEwMDAwCQkxMDAwMAorCisvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbC4gKi8KKyNkZWZpbmUgRFVQTEVYX0hBTEYJCTB4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwJCTB4MDEKKworLyogV2hpY2ggY29ubmVjdG9yIHBvcnQuICovCisjZGVmaW5lIFBPUlRfVFAJCQkweDAwCisjZGVmaW5lIFBPUlRfQVVJCQkweDAxCisjZGVmaW5lIFBPUlRfTUlJCQkweDAyCisjZGVmaW5lIFBPUlRfRklCUkUJCTB4MDMKKyNkZWZpbmUgUE9SVF9CTkMJCTB4MDQKKworLyogV2hpY2ggdHJhbnNjZWl2ZXIgdG8gdXNlLiAqLworI2RlZmluZSBYQ1ZSX0lOVEVSTkFMCQkweDAwCisjZGVmaW5lIFhDVlJfRVhURVJOQUwJCTB4MDEKKyNkZWZpbmUgWENWUl9EVU1NWTEJCTB4MDIKKyNkZWZpbmUgWENWUl9EVU1NWTIJCTB4MDMKKyNkZWZpbmUgWENWUl9EVU1NWTMJCTB4MDQKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b25lZ290aWF0aW9uLiAgSWYgdGhpcyBpcyBzZXQgdG8gZW5hYmxlLAorICogdGhlIGZvcmNlZCBsaW5rIG1vZGVzIGFib3ZlIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQuCisgKi8KKyNkZWZpbmUgQVVUT05FR19ESVNBQkxFCQkweDAwCisjZGVmaW5lIEFVVE9ORUdfRU5BQkxFCQkweDAxCisKKy8qIFdha2UtT24tTGFuIG9wdGlvbnMuICovCisjZGVmaW5lIFdBS0VfUEhZCQkoMSA8PCAwKQorI2RlZmluZSBXQUtFX1VDQVNUCQkoMSA8PCAxKQorI2RlZmluZSBXQUtFX01DQVNUCQkoMSA8PCAyKQorI2RlZmluZSBXQUtFX0JDQVNUCQkoMSA8PCAzKQorI2RlZmluZSBXQUtFX0FSUAkJKDEgPDwgNCkKKyNkZWZpbmUgV0FLRV9NQUdJQwkJKDEgPDwgNSkKKyNkZWZpbmUgV0FLRV9NQUdJQ1NFQ1VSRQkoMSA8PCA2KSAvKiBvbmx5IG1lYW5pbmdmdWwgaWYgV0FLRV9NQUdJQyAqLworCisjZW5kaWYgLyogX0xJTlVYX0VUSFRPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzMzZhYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBpbmNsdWRlL2xpbnV4L2V2ZW50cG9sbC5oICggRWZmaWNlbnQgZXZlbnQgcG9sbGluZyBpbXBsZW1lbnRhdGlvbiApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLC4uLiwyMDA2CSBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0VWRU5UUE9MTF9ICisjZGVmaW5lIF9MSU5VWF9FVkVOVFBPTExfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKiBWYWxpZCBvcGNvZGVzIHRvIGlzc3VlIHRvIHN5c19lcG9sbF9jdGwoKSAqLworI2RlZmluZSBFUE9MTF9DVExfQUREIDEKKyNkZWZpbmUgRVBPTExfQ1RMX0RFTCAyCisjZGVmaW5lIEVQT0xMX0NUTF9NT0QgMworCisvKiBTZXQgdGhlIE9uZSBTaG90IGJlaGF2aW91ciBmb3IgdGhlIHRhcmdldCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRVBPTExPTkVTSE9UICgxIDw8IDMwKQorCisvKiBTZXQgdGhlIEVkZ2UgVHJpZ2dlcmVkIGJlaGF2aW91ciBmb3IgdGhlIHRhcmdldCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRVBPTExFVCAoMSA8PCAzMSkKKworLyogCisgKiBPbiB4ODYtNjQgbWFrZSB0aGUgNjRiaXQgc3RydWN0dXJlIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50IGFzIHRoZQorICogMzJiaXQgc3RydWN0dXJlLiBUaGlzIG1ha2VzIDMyYml0IGVtdWxhdGlvbiBlYXNpZXIuCisgKgorICogVU1ML3g4Nl82NCBuZWVkcyB0aGUgc2FtZSBwYWNraW5nIGFzIHg4Nl82NAorICovCisjaWZkZWYgX194ODZfNjRfXworI2RlZmluZSBFUE9MTF9QQUNLRUQgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNlbHNlCisjZGVmaW5lIEVQT0xMX1BBQ0tFRAorI2VuZGlmCisKK3N0cnVjdCBlcG9sbF9ldmVudCB7CisJX191MzIgZXZlbnRzOworCV9fdTY0IGRhdGE7Cit9IEVQT0xMX1BBQ0tFRDsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfTElOVVhfRVZFTlRQT0xMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9leHQyX2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2EzNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9taW5peF9mcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9FWFQyX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0VYVDJfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKgorICogVGhlIHNlY29uZCBleHRlbmRlZCBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCisgKi8KKworLyoKKyAqIERlZmluZSBFWFQyRlNfREVCVUcgdG8gcHJvZHVjZSBkZWJ1ZyBtZXNzYWdlcworICovCisjdW5kZWYgRVhUMkZTX0RFQlVHCisKKy8qCisgKiBEZWZpbmUgRVhUMl9SRVNFUlZBVElPTiB0byByZXNlcnZlIGRhdGEgYmxvY2tzIGZvciBleHBhbmRpbmcgZmlsZXMKKyAqLworI2RlZmluZSBFWFQyX0RFRkFVTFRfUkVTRVJWRV9CTE9DS1MgICAgIDgKKy8qbWF4IHdpbmRvdyBzaXplOiAxMDI0KGRpcmVjdCBibG9ja3MpICsgMyhbdCxkXWluZGlyZWN0IGJsb2NrcykgKi8KKyNkZWZpbmUgRVhUMl9NQVhfUkVTRVJWRV9CTE9DS1MgICAgICAgICAxMDI3CisjZGVmaW5lIEVYVDJfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRCAwCisvKgorICogVGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgRVhUMkZTX0RBVEUJCSI5NS8wOC8wOSIKKyNkZWZpbmUgRVhUMkZTX1ZFUlNJT04JCSIwLjViIgorCisvKgorICogRGVidWcgY29kZQorICovCisjaWZkZWYgRVhUMkZTX0RFQlVHCisjCWRlZmluZSBleHQyX2RlYnVnKGYsIGEuLi4pCXsgXAorCQkJCQlwcmludGsgKCJFWFQyLWZzIERFQlVHICglcywgJWQpOiAlczoiLCBcCisJCQkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IFwKKwkJCQkgIAlwcmludGsgKGYsICMjIGEpOyBcCisJCQkJCX0KKyNlbHNlCisjCWRlZmluZSBleHQyX2RlYnVnKGYsIGEuLi4pCS8qKi8KKyNlbmRpZgorCisvKgorICogU3BlY2lhbCBpbm9kZSBudW1iZXJzCisgKi8KKyNkZWZpbmUJRVhUMl9CQURfSU5PCQkgMQkvKiBCYWQgYmxvY2tzIGlub2RlICovCisjZGVmaW5lIEVYVDJfUk9PVF9JTk8JCSAyCS8qIFJvb3QgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9CT09UX0xPQURFUl9JTk8JIDUJLyogQm9vdCBsb2FkZXIgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9VTkRFTF9ESVJfSU5PCSA2CS8qIFVuZGVsZXRlIGRpcmVjdG9yeSBpbm9kZSAqLworCisvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgZm9yIG9sZCBleHQyIGZpbGVzeXN0ZW1zICovCisjZGVmaW5lIEVYVDJfR09PRF9PTERfRklSU1RfSU5PCTExCisKKy8qIEFzc3VtZSB0aGF0IHVzZXIgbW9kZSBwcm9ncmFtcyBhcmUgcGFzc2luZyBpbiBhbiBleHQyZnMgc3VwZXJibG9jaywgbm90CisgKiBhIGtlcm5lbCBzdHJ1Y3Qgc3VwZXJfYmxvY2suICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY2FsbCB0aGUgZmVhdHVyZS10ZXN0CisgKiBtYWNyb3MgZnJvbSB1c2VyIGxhbmQuICovCisjZGVmaW5lIEVYVDJfU0Ioc2IpCShzYikKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUMl9MSU5LX01BWAkJMzIwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fQkxPQ0tfU0laRQkJMTAyNAorI2RlZmluZQlFWFQyX01BWF9CTE9DS19TSVpFCQk0MDk2CisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCQkgIDEwCisjIGRlZmluZSBFWFQyX0JMT0NLX1NJWkUocykJCShFWFQyX01JTl9CTE9DS19TSVpFIDw8IChzKS0+c19sb2dfYmxvY2tfc2l6ZSkKKyNkZWZpbmUJRVhUMl9BRERSX1BFUl9CTE9DSyhzKQkJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZiAoX191MzIpKQorIyBkZWZpbmUgRVhUMl9CTE9DS19TSVpFX0JJVFMocykJKChzKS0+c19sb2dfYmxvY2tfc2l6ZSArIDEwKQorI2RlZmluZSBFWFQyX0lOT0RFX1NJWkUocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDogXAorCQkJCSAocyktPnNfaW5vZGVfc2l6ZSkKKyNkZWZpbmUgRVhUMl9GSVJTVF9JTk8ocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8gOiBcCisJCQkJIChzKS0+c19maXJzdF9pbm8pCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZnJhZ21lbnRzCisgKi8KKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19TSVpFCQkxMDI0CisjZGVmaW5lCUVYVDJfTUFYX0ZSQUdfU0laRQkJNDA5NgorI2RlZmluZSBFWFQyX01JTl9GUkFHX0xPR19TSVpFCQkgIDEwCisjIGRlZmluZSBFWFQyX0ZSQUdfU0laRShzKQkJKEVYVDJfTUlOX0ZSQUdfU0laRSA8PCAocyktPnNfbG9nX2ZyYWdfc2l6ZSkKKyMgZGVmaW5lIEVYVDJfRlJBR1NfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykgLyBFWFQyX0ZSQUdfU0laRShzKSkKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGJsb2NrcyBncm91cCBkZXNjcmlwdG9yCisgKi8KK3N0cnVjdCBleHQyX2dyb3VwX2Rlc2MKK3sKKwlfX2xlMzIJYmdfYmxvY2tfYml0bWFwOwkJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLworCV9fbGUzMgliZ19pbm9kZV9iaXRtYXA7CQkvKiBJbm9kZXMgYml0bWFwIGJsb2NrICovCisJX19sZTMyCWJnX2lub2RlX3RhYmxlOwkJLyogSW5vZGVzIHRhYmxlIGJsb2NrICovCisJX19sZTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUxNgliZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50OwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLworCV9fbGUxNgliZ19wYWQ7CisJX19sZTMyCWJnX3Jlc2VydmVkWzNdOworfTsKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjIGRlZmluZSBFWFQyX0JMT0NLU19QRVJfR1JPVVAocykJKChzKS0+c19ibG9ja3NfcGVyX2dyb3VwKQorIyBkZWZpbmUgRVhUMl9ERVNDX1BFUl9CTE9DSyhzKQkJKEVYVDJfQkxPQ0tfU0laRShzKSAvIHNpemVvZiAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYykpCisjIGRlZmluZSBFWFQyX0lOT0RFU19QRVJfR1JPVVAocykJKChzKS0+c19pbm9kZXNfcGVyX2dyb3VwKQorCisvKgorICogQ29uc3RhbnRzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIGJsb2NrcworICovCisjZGVmaW5lCUVYVDJfTkRJUl9CTE9DS1MJCTEyCisjZGVmaW5lCUVYVDJfSU5EX0JMT0NLCQkJRVhUMl9ORElSX0JMT0NLUworI2RlZmluZQlFWFQyX0RJTkRfQkxPQ0sJCQkoRVhUMl9JTkRfQkxPQ0sgKyAxKQorI2RlZmluZQlFWFQyX1RJTkRfQkxPQ0sJCQkoRVhUMl9ESU5EX0JMT0NLICsgMSkKKyNkZWZpbmUJRVhUMl9OX0JMT0NLUwkJCShFWFQyX1RJTkRfQkxPQ0sgKyAxKQorCisvKgorICogSW5vZGUgZmxhZ3MgKEdFVEZMQUdTL1NFVEZMQUdTKQorICovCisjZGVmaW5lCUVYVDJfU0VDUk1fRkwJCQlGU19TRUNSTV9GTAkvKiBTZWN1cmUgZGVsZXRpb24gKi8KKyNkZWZpbmUJRVhUMl9VTlJNX0ZMCQkJRlNfVU5STV9GTAkvKiBVbmRlbGV0ZSAqLworI2RlZmluZQlFWFQyX0NPTVBSX0ZMCQkJRlNfQ09NUFJfRkwJLyogQ29tcHJlc3MgZmlsZSAqLworI2RlZmluZSBFWFQyX1NZTkNfRkwJCQlGU19TWU5DX0ZMCS8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRVhUMl9JTU1VVEFCTEVfRkwJCUZTX0lNTVVUQUJMRV9GTAkvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBFWFQyX0FQUEVORF9GTAkJCUZTX0FQUEVORF9GTAkvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgRVhUMl9OT0RVTVBfRkwJCQlGU19OT0RVTVBfRkwJLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBFWFQyX05PQVRJTUVfRkwJCQlGU19OT0FUSU1FX0ZMCS8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KKy8qIFJlc2VydmVkIGZvciBjb21wcmVzc2lvbiB1c2FnZS4uLiAqLworI2RlZmluZSBFWFQyX0RJUlRZX0ZMCQkJRlNfRElSVFlfRkwKKyNkZWZpbmUgRVhUMl9DT01QUkJMS19GTAkJRlNfQ09NUFJCTEtfRkwJLyogT25lIG9yIG1vcmUgY29tcHJlc3NlZCBjbHVzdGVycyAqLworI2RlZmluZSBFWFQyX05PQ09NUF9GTAkJCUZTX05PQ09NUF9GTAkvKiBEb24ndCBjb21wcmVzcyAqLworI2RlZmluZSBFWFQyX0VDT01QUl9GTAkJCUZTX0VDT01QUl9GTAkvKiBDb21wcmVzc2lvbiBlcnJvciAqLworLyogRW5kIGNvbXByZXNzaW9uIGZsYWdzIC0tLSBtYXliZSBub3QgYWxsIHVzZWQgKi8JCisjZGVmaW5lIEVYVDJfQlRSRUVfRkwJCQlGU19CVFJFRV9GTAkvKiBidHJlZSBmb3JtYXQgZGlyICovCisjZGVmaW5lIEVYVDJfSU5ERVhfRkwJCQlGU19JTkRFWF9GTAkvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVYVDJfSU1BR0lDX0ZMCQkJRlNfSU1BR0lDX0ZMCS8qIEFGUyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVhUMl9KT1VSTkFMX0RBVEFfRkwJCUZTX0pPVVJOQUxfREFUQV9GTCAvKiBSZXNlcnZlZCBmb3IgZXh0MyAqLworI2RlZmluZSBFWFQyX05PVEFJTF9GTAkJCUZTX05PVEFJTF9GTAkvKiBmaWxlIHRhaWwgc2hvdWxkIG5vdCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgRVhUMl9ESVJTWU5DX0ZMCQkJRlNfRElSU1lOQ19GTAkvKiBkaXJzeW5jIGJlaGF2aW91ciAoZGlyZWN0b3JpZXMgb25seSkgKi8KKyNkZWZpbmUgRVhUMl9UT1BESVJfRkwJCQlGU19UT1BESVJfRkwJLyogVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcyovCisjZGVmaW5lIEVYVDJfUkVTRVJWRURfRkwJCUZTX1JFU0VSVkVEX0ZMCS8qIHJlc2VydmVkIGZvciBleHQyIGxpYiAqLworCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9WSVNJQkxFCQlGU19GTF9VU0VSX1ZJU0lCTEUJLyogVXNlciB2aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIEVYVDJfRkxfVVNFUl9NT0RJRklBQkxFCQlGU19GTF9VU0VSX01PRElGSUFCTEUJLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisjZGVmaW5lCUVYVDJfSU9DX0dFVEZMQUdTCQlGU19JT0NfR0VURkxBR1MKKyNkZWZpbmUJRVhUMl9JT0NfU0VURkxBR1MJCUZTX0lPQ19TRVRGTEFHUworI2RlZmluZQlFWFQyX0lPQ19HRVRWRVJTSU9OCQlGU19JT0NfR0VUVkVSU0lPTgorI2RlZmluZQlFWFQyX0lPQ19TRVRWRVJTSU9OCQlGU19JT0NfU0VUVkVSU0lPTgorI2RlZmluZQlFWFQyX0lPQ19HRVRSU1ZTWgkJX0lPUignZicsIDUsIGxvbmcpCisjZGVmaW5lCUVYVDJfSU9DX1NFVFJTVlNaCQlfSU9XKCdmJywgNiwgbG9uZykKKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzIGluIDMyIGJpdCBlbXVsYXRpb24KKyAqLworI2RlZmluZSBFWFQyX0lPQzMyX0dFVEZMQUdTCQlGU19JT0MzMl9HRVRGTEFHUworI2RlZmluZSBFWFQyX0lPQzMyX1NFVEZMQUdTCQlGU19JT0MzMl9TRVRGTEFHUworI2RlZmluZSBFWFQyX0lPQzMyX0dFVFZFUlNJT04JCUZTX0lPQzMyX0dFVFZFUlNJT04KKyNkZWZpbmUgRVhUMl9JT0MzMl9TRVRWRVJTSU9OCQlGU19JT0MzMl9TRVRWRVJTSU9OCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGUgeworCV9fbGUxNglpX21vZGU7CQkvKiBGaWxlIG1vZGUgKi8KKwlfX2xlMTYJaV91aWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBPd25lciBVaWQgKi8KKwlfX2xlMzIJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCV9fbGUzMglpX2F0aW1lOwkvKiBBY2Nlc3MgdGltZSAqLworCV9fbGUzMglpX2N0aW1lOwkvKiBDcmVhdGlvbiB0aW1lICovCisJX19sZTMyCWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJX19sZTMyCWlfZHRpbWU7CS8qIERlbGV0aW9uIFRpbWUgKi8KKwlfX2xlMTYJaV9naWQ7CQkvKiBMb3cgMTYgYml0cyBvZiBHcm91cCBJZCAqLworCV9fbGUxNglpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCV9fbGUzMglpX2Jsb2NrczsJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCWlfZmxhZ3M7CS8qIEZpbGUgZmxhZ3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJX19sZTMyICBoX2lfdHJhbnNsYXRvcjsKKwkJfSBodXJkMTsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiAgbV9pX3Jlc2VydmVkMTsKKwkJfSBtYXNpeDE7CisJfSBvc2QxOwkJCQkvKiBPUyBkZXBlbmRlbnQgMSAqLworCV9fbGUzMglpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCV9fbGUzMglpX2dlbmVyYXRpb247CS8qIEZpbGUgdmVyc2lvbiAoZm9yIE5GUykgKi8KKwlfX2xlMzIJaV9maWxlX2FjbDsJLyogRmlsZSBBQ0wgKi8KKwlfX2xlMzIJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJX19sZTMyCWlfZmFkZHI7CS8qIEZyYWdtZW50IGFkZHJlc3MgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4CWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJbF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNglpX3BhZDE7CisJCQlfX2xlMTYJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJX19sZTE2CWxfaV9naWRfaGlnaDsJLyogd2VyZSByZXNlcnZlZDJbMF0gKi8KKwkJCV9fdTMyCWxfaV9yZXNlcnZlZDI7CisJCX0gbGludXgyOworCQlzdHJ1Y3QgeworCQkJX191OAloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CWhfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX19sZTE2CWhfaV9tb2RlX2hpZ2g7CisJCQlfX2xlMTYJaF9pX3VpZF9oaWdoOworCQkJX19sZTE2CWhfaV9naWRfaGlnaDsKKwkJCV9fbGUzMgloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJX191OAltX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQlfX3U4CW1faV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJX191MTYJbV9wYWQxOworCQkJX191MzIJbV9pX3Jlc2VydmVkMlsyXTsKKwkJfSBtYXNpeDI7CisJfSBvc2QyOwkJCQkvKiBPUyBkZXBlbmRlbnQgMiAqLworfTsKKworI2RlZmluZSBpX3NpemVfaGlnaAlpX2Rpcl9hY2wKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX2xpbnV4X18pCisjZGVmaW5lIGlfcmVzZXJ2ZWQxCW9zZDEubGludXgxLmxfaV9yZXNlcnZlZDEKKyNkZWZpbmUgaV9mcmFnCQlvc2QyLmxpbnV4Mi5sX2lfZnJhZworI2RlZmluZSBpX2ZzaXplCQlvc2QyLmxpbnV4Mi5sX2lfZnNpemUKKyNkZWZpbmUgaV91aWRfbG93CWlfdWlkCisjZGVmaW5lIGlfZ2lkX2xvdwlpX2dpZAorI2RlZmluZSBpX3VpZF9oaWdoCW9zZDIubGludXgyLmxfaV91aWRfaGlnaAorI2RlZmluZSBpX2dpZF9oaWdoCW9zZDIubGludXgyLmxfaV9naWRfaGlnaAorI2RlZmluZSBpX3Jlc2VydmVkMglvc2QyLmxpbnV4Mi5sX2lfcmVzZXJ2ZWQyCisjZW5kaWYKKworI2lmZGVmCV9faHVyZF9fCisjZGVmaW5lIGlfdHJhbnNsYXRvcglvc2QxLmh1cmQxLmhfaV90cmFuc2xhdG9yCisjZGVmaW5lIGlfZnJhZwkJb3NkMi5odXJkMi5oX2lfZnJhZzsKKyNkZWZpbmUgaV9mc2l6ZQkJb3NkMi5odXJkMi5oX2lfZnNpemU7CisjZGVmaW5lIGlfdWlkX2hpZ2gJb3NkMi5odXJkMi5oX2lfdWlkX2hpZ2gKKyNkZWZpbmUgaV9naWRfaGlnaAlvc2QyLmh1cmQyLmhfaV9naWRfaGlnaAorI2RlZmluZSBpX2F1dGhvcglvc2QyLmh1cmQyLmhfaV9hdXRob3IKKyNlbmRpZgorCisjaWZkZWYJX19tYXNpeF9fCisjZGVmaW5lIGlfcmVzZXJ2ZWQxCW9zZDEubWFzaXgxLm1faV9yZXNlcnZlZDEKKyNkZWZpbmUgaV9mcmFnCQlvc2QyLm1hc2l4Mi5tX2lfZnJhZworI2RlZmluZSBpX2ZzaXplCQlvc2QyLm1hc2l4Mi5tX2lfZnNpemUKKyNkZWZpbmUgaV9yZXNlcnZlZDIJb3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMgorI2VuZGlmCisKKy8qCisgKiBGaWxlIHN5c3RlbSBzdGF0ZXMKKyAqLworI2RlZmluZQlFWFQyX1ZBTElEX0ZTCQkJMHgwMDAxCS8qIFVubW91bnRlZCBjbGVhbmx5ICovCisjZGVmaW5lCUVYVDJfRVJST1JfRlMJCQkweDAwMDIJLyogRXJyb3JzIGRldGVjdGVkICovCisKKy8qCisgKiBNb3VudCBmbGFncworICovCisjZGVmaW5lIEVYVDJfTU9VTlRfQ0hFQ0sJCTB4MDAwMDAxICAvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLworI2RlZmluZSBFWFQyX01PVU5UX09MREFMTE9DCQkweDAwMDAwMiAgLyogRG9uJ3QgdXNlIHRoZSBuZXcgT3Jsb3YgYWxsb2NhdG9yICovCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQSUQJCTB4MDAwMDA0ICAvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQyX01PVU5UX0RFQlVHCQkweDAwMDAwOCAgLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDAwMTAgIC8qIENvbnRpbnVlIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19STwkJMHgwMDAwMjAgIC8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwMDA0MCAgLyogUGFuaWMgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTUlOSVhfREYJCTB4MDAwMDgwICAvKiBNaW1pY3MgdGhlIE1pbml4IHN0YXRmcyAqLworI2RlZmluZSBFWFQyX01PVU5UX05PQkgJCQkweDAwMDEwMCAgLyogTm8gYnVmZmVyX2hlYWRzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9fVUlEMzIJCTB4MDAwMjAwICAvKiBEaXNhYmxlIDMyLWJpdCBVSURzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfWEFUVFJfVVNFUgkJMHgwMDQwMDAgIC8qIEV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX1BPU0lYX0FDTAkJMHgwMDgwMDAgIC8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfWElQCQkJMHgwMTAwMDAgIC8qIEV4ZWN1dGUgaW4gcGxhY2UgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9VU1JRVU9UQQkJMHgwMjAwMDAgIC8qIHVzZXIgcXVvdGEgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9HUlBRVU9UQQkJMHgwNDAwMDAgIC8qIGdyb3VwIHF1b3RhICovCisjZGVmaW5lIEVYVDJfTU9VTlRfUkVTRVJWQVRJT04JCTB4MDgwMDAwICAvKiBQcmVhbGxvY2F0aW9uICovCisKKworI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSBzZXRfb3B0KG8sIG9wdCkJCQlvIHw9IEVYVDJfTU9VTlRfIyNvcHQKKyNkZWZpbmUgdGVzdF9vcHQoc2IsIG9wdCkJCShFWFQyX1NCKHNiKS0+c19tb3VudF9vcHQgJiBcCisJCQkJCSBFWFQyX01PVU5UXyMjb3B0KQorLyoKKyAqIE1heGltYWwgbW91bnQgY291bnRzIGJldHdlZW4gdHdvIGZpbGVzeXN0ZW0gY2hlY2tzCisgKi8KKyNkZWZpbmUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVAkJMjAJLyogQWxsb3cgMjAgbW91bnRzICovCisjZGVmaW5lIEVYVDJfREZMX0NIRUNLSU5URVJWQUwJCTAJLyogRG9uJ3QgdXNlIGludGVydmFsIGNoZWNrICovCisKKy8qCisgKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzCisgKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfQ09OVElOVUUJCTEJLyogQ29udGludWUgZXhlY3V0aW9uICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1JPCQkJMgkvKiBSZW1vdW50IGZzIHJlYWQtb25seSAqLworI2RlZmluZSBFWFQyX0VSUk9SU19QQU5JQwkJMwkvKiBQYW5pYyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19ERUZBVUxUCQlFWFQyX0VSUk9SU19DT05USU5VRQorCisvKgorICogU3RydWN0dXJlIG9mIHRoZSBzdXBlciBibG9jaworICovCitzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayB7CisJX19sZTMyCXNfaW5vZGVzX2NvdW50OwkJLyogSW5vZGVzIGNvdW50ICovCisJX19sZTMyCXNfYmxvY2tzX2NvdW50OwkJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfcl9ibG9ja3NfY291bnQ7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfYmxvY2tzX2NvdW50OwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fbGUzMglzX2ZpcnN0X2RhdGFfYmxvY2s7CS8qIEZpcnN0IERhdGEgQmxvY2sgKi8KKwlfX2xlMzIJc19sb2dfYmxvY2tfc2l6ZTsJLyogQmxvY2sgc2l6ZSAqLworCV9fbGUzMglzX2xvZ19mcmFnX3NpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwlfX2xlMzIJc19ibG9ja3NfcGVyX2dyb3VwOwkvKiAjIEJsb2NrcyBwZXIgZ3JvdXAgKi8KKwlfX2xlMzIJc19mcmFnc19wZXJfZ3JvdXA7CS8qICMgRnJhZ21lbnRzIHBlciBncm91cCAqLworCV9fbGUzMglzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCV9fbGUzMglzX210aW1lOwkJLyogTW91bnQgdGltZSAqLworCV9fbGUzMglzX3d0aW1lOwkJLyogV3JpdGUgdGltZSAqLworCV9fbGUxNglzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisJX19sZTE2CXNfbWF4X21udF9jb3VudDsJLyogTWF4aW1hbCBtb3VudCBjb3VudCAqLworCV9fbGUxNglzX21hZ2ljOwkJLyogTWFnaWMgc2lnbmF0dXJlICovCisJX19sZTE2CXNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCV9fbGUxNglzX2Vycm9yczsJCS8qIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMgKi8KKwlfX2xlMTYJc19taW5vcl9yZXZfbGV2ZWw7IAkvKiBtaW5vciByZXZpc2lvbiBsZXZlbCAqLworCV9fbGUzMglzX2xhc3RjaGVjazsJCS8qIHRpbWUgb2YgbGFzdCBjaGVjayAqLworCV9fbGUzMglzX2NoZWNraW50ZXJ2YWw7CS8qIG1heC4gdGltZSBiZXR3ZWVuIGNoZWNrcyAqLworCV9fbGUzMglzX2NyZWF0b3Jfb3M7CQkvKiBPUyAqLworCV9fbGUzMglzX3Jldl9sZXZlbDsJCS8qIFJldmlzaW9uIGxldmVsICovCisJX19sZTE2CXNfZGVmX3Jlc3VpZDsJCS8qIERlZmF1bHQgdWlkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwlfX2xlMTYJc19kZWZfcmVzZ2lkOwkJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICogCisJICogZTJmc2NrJ3MgcmVxdWlyZW1lbnRzIGFyZSBtb3JlIHN0cmljdDsgaWYgaXQgZG9lc24ndCBrbm93CisJICogYWJvdXQgYSBmZWF0dXJlIGluIGVpdGhlciB0aGUgY29tcGF0aWJsZSBvciBpbmNvbXBhdGlibGUKKwkgKiBmZWF0dXJlIHNldCwgaXQgbXVzdCBhYm9ydCBhbmQgbm90IHRyeSB0byBtZWRkbGUgd2l0aAorCSAqIHRoaW5ncyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuLi4KKwkgKi8KKwlfX2xlMzIJc19maXJzdF9pbm87IAkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJX19sZTE2ICAgc19pbm9kZV9zaXplOyAJCS8qIHNpemUgb2YgaW5vZGUgc3RydWN0dXJlICovCisJX19sZTE2CXNfYmxvY2tfZ3JvdXBfbnI7IAkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCV9fbGUzMglzX2ZlYXR1cmVfY29tcGF0OyAJLyogY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCV9fbGUzMglzX2ZlYXR1cmVfaW5jb21wYXQ7IAkvKiBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX2xlMzIJc19mZWF0dXJlX3JvX2NvbXBhdDsgCS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX3U4CXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIJc192b2x1bWVfbmFtZVsxNl07IAkvKiB2b2x1bWUgbmFtZSAqLworCWNoYXIJc19sYXN0X21vdW50ZWRbNjRdOyAJLyogZGlyZWN0b3J5IHdoZXJlIGxhc3QgbW91bnRlZCAqLworCV9fbGUzMglzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7IC8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUMl9DT01QQVRfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwlfX3U4CXNfcHJlYWxsb2NfYmxvY2tzOwkvKiBOciBvZiBibG9ja3MgdG8gdHJ5IHRvIHByZWFsbG9jYXRlKi8KKwlfX3U4CXNfcHJlYWxsb2NfZGlyX2Jsb2NrczsJLyogTnIgdG8gcHJlYWxsb2NhdGUgZm9yIGRpcnMgKi8KKwlfX3UxNglzX3BhZGRpbmcxOworCS8qCisJICogSm91cm5hbGluZyBzdXBwb3J0IHZhbGlkIGlmIEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwgc2V0LgorCSAqLworCV9fdTgJc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworCV9fdTMyCXNfam91cm5hbF9pbnVtOwkJLyogaW5vZGUgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfam91cm5hbF9kZXY7CQkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fdTMyCXNfbGFzdF9vcnBoYW47CQkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwlfX3UzMglzX2hhc2hfc2VlZFs0XTsJCS8qIEhUUkVFIGhhc2ggc2VlZCAqLworCV9fdTgJc19kZWZfaGFzaF92ZXJzaW9uOwkvKiBEZWZhdWx0IGhhc2ggdmVyc2lvbiB0byB1c2UgKi8KKwlfX3U4CXNfcmVzZXJ2ZWRfY2hhcl9wYWQ7CisJX191MTYJc19yZXNlcnZlZF93b3JkX3BhZDsKKwlfX2xlMzIJc19kZWZhdWx0X21vdW50X29wdHM7CisgCV9fbGUzMglzX2ZpcnN0X21ldGFfYmc7IAkvKiBGaXJzdCBtZXRhYmxvY2sgYmxvY2sgZ3JvdXAgKi8KKwlfX3UzMglzX3Jlc2VydmVkWzE5MF07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KK307CisKKy8qCisgKiBDb2RlcyBmb3Igb3BlcmF0aW5nIHN5c3RlbXMKKyAqLworI2RlZmluZSBFWFQyX09TX0xJTlVYCQkwCisjZGVmaW5lIEVYVDJfT1NfSFVSRAkJMQorI2RlZmluZSBFWFQyX09TX01BU0lYCQkyCisjZGVmaW5lIEVYVDJfT1NfRlJFRUJTRAkJMworI2RlZmluZSBFWFQyX09TX0xJVEVTCQk0CisKKy8qCisgKiBSZXZpc2lvbiBsZXZlbHMKKyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX1JFVgkwCS8qIFRoZSBnb29kIG9sZCAob3JpZ2luYWwpIGZvcm1hdCAqLworI2RlZmluZSBFWFQyX0RZTkFNSUNfUkVWCTEgCS8qIFYyIGZvcm1hdCB3LyBkeW5hbWljIGlub2RlIHNpemVzICovCisKKyNkZWZpbmUgRVhUMl9DVVJSRU5UX1JFVglFWFQyX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQyX01BWF9TVVBQX1JFVglFWFQyX0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvKgorICogRmVhdHVyZSBzZXQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykgKQorI2RlZmluZSBFWFQyX1NFVF9DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX1NFVF9ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQyX1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUMl9DTEVBUl9DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUMl9DTEVBUl9ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQyX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUMl9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDJfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUwkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDA0CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIJCTB4MDAwOAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk8JCTB4MDAxMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWAkJMHgwMDIwCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfQU5ZCQkJMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUJMHgwMDAyCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSCTB4MDAwNAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0FOWQkJMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIJCTB4MDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHCQkweDAwMTAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0FOWQkJMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfU1VQUAlFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEV8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOU1VQUE9SVEVECX5FWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX1VOU1VQUE9SVEVECX5FWFQyX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAorCisvKgorICogRGVmYXVsdCB2YWx1ZXMgZm9yIHVzZXIgYW5kL29yIGdyb3VwIHVzaW5nIHJlc2VydmVkIGJsb2NrcworICovCisjZGVmaW5lCUVYVDJfREVGX1JFU1VJRAkJMAorI2RlZmluZQlFWFQyX0RFRl9SRVNHSUQJCTAKKworLyoKKyAqIERlZmF1bHQgbW91bnQgb3B0aW9ucworICovCisjZGVmaW5lIEVYVDJfREVGTV9ERUJVRwkJMHgwMDAxCisjZGVmaW5lIEVYVDJfREVGTV9CU0RHUk9VUFMJMHgwMDAyCisjZGVmaW5lIEVYVDJfREVGTV9YQVRUUl9VU0VSCTB4MDAwNAorI2RlZmluZSBFWFQyX0RFRk1fQUNMCQkweDAwMDgKKyNkZWZpbmUgRVhUMl9ERUZNX1VJRDE2CQkweDAwMTAKKyAgICAvKiBOb3QgdXNlZCBieSBleHQyLCBidXQgcmVzZXJ2ZWQgZm9yIHVzZSBieSBleHQzICovCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERQkJMHgwMDYwIAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfREFUQQkweDAwMjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX09SREVSRUQJMHgwMDQwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9XQkFDSwkweDAwNjAKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQorICovCisjZGVmaW5lIEVYVDJfTkFNRV9MRU4gMjU1CisKK3N0cnVjdCBleHQyX2Rpcl9lbnRyeSB7CisJX19sZTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCV9fbGUxNglyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCV9fbGUxNgluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJY2hhcgluYW1lW0VYVDJfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIFNpbmNlIEVYVDIgc3RydWN0dXJlcyBhcmUKKyAqIHN0b3JlZCBpbiBpbnRlbCBieXRlIG9yZGVyLCBhbmQgdGhlIG5hbWVfbGVuIGZpZWxkIGNvdWxkIG5ldmVyIGJlCisgKiBiaWdnZXIgdGhhbiAyNTUgY2hhcnMsIGl0J3Mgc2FmZSB0byByZWNsYWltIHRoZSBleHRyYSBieXRlIGZvciB0aGUKKyAqIGZpbGVfdHlwZSBmaWVsZC4KKyAqLworc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgeworCV9fbGUzMglpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwlfX2xlMTYJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwlfX3U4CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwlfX3U4CWZpbGVfdHlwZTsKKwljaGFyCW5hbWVbRVhUMl9OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIEV4dDIgZGlyZWN0b3J5IGZpbGUgdHlwZXMuICBPbmx5IHRoZSBsb3cgMyBiaXRzIGFyZSB1c2VkLiAgVGhlCisgKiBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBmb3Igbm93LgorICovCitlbnVtIHsKKwlFWFQyX0ZUX1VOS05PV04sCisJRVhUMl9GVF9SRUdfRklMRSwKKwlFWFQyX0ZUX0RJUiwKKwlFWFQyX0ZUX0NIUkRFViwKKwlFWFQyX0ZUX0JMS0RFViwKKwlFWFQyX0ZUX0ZJRk8sCisJRVhUMl9GVF9TT0NLLAorCUVYVDJfRlRfU1lNTElOSywKKwlFWFQyX0ZUX01BWAorfTsKKworLyoKKyAqIEVYVDJfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKgorICogTk9URTogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAqLworI2RlZmluZSBFWFQyX0RJUl9QQUQJCSAJNAorI2RlZmluZSBFWFQyX0RJUl9ST1VORCAJCQkoRVhUMl9ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUMl9ESVJfUkVDX0xFTihuYW1lX2xlbikJKCgobmFtZV9sZW4pICsgOCArIEVYVDJfRElSX1JPVU5EKSAmIFwKKwkJCQkJIH5FWFQyX0RJUl9ST1VORCkKKyNkZWZpbmUgRVhUMl9NQVhfUkVDX0xFTgkJKCgxPDwxNiktMSkKKworI2VuZGlmCS8qIF9MSU5VWF9FWFQyX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5M2FmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCkBAIC0wLDAgKzEsNjQ5IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvZXh0M19mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbWluaXhfZnMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2lmbmRlZiBfTElOVVhfRVhUM19GU19ICisjZGVmaW5lIF9MSU5VWF9FWFQzX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyoKKyAqIFRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcworICovCisKKy8qCisgKiBEZWZpbmUgRVhUM0ZTX0RFQlVHIHRvIHByb2R1Y2UgZGVidWcgbWVzc2FnZXMKKyAqLworI3VuZGVmIEVYVDNGU19ERUJVRworCisvKgorICogRGVmaW5lIEVYVDNfUkVTRVJWQVRJT04gdG8gcmVzZXJ2ZSBkYXRhIGJsb2NrcyBmb3IgZXhwYW5kaW5nIGZpbGVzCisgKi8KKyNkZWZpbmUgRVhUM19ERUZBVUxUX1JFU0VSVkVfQkxPQ0tTICAgICA4CisvKm1heCB3aW5kb3cgc2l6ZTogMTAyNChkaXJlY3QgYmxvY2tzKSArIDMoW3QsZF1pbmRpcmVjdCBibG9ja3MpICovCisjZGVmaW5lIEVYVDNfTUFYX1JFU0VSVkVfQkxPQ0tTICAgICAgICAgMTAyNworI2RlZmluZSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQgMAorCisvKgorICogRGVidWcgY29kZQorICovCisjaWZkZWYgRVhUM0ZTX0RFQlVHCisjZGVmaW5lIGV4dDNfZGVidWcoZiwgYS4uLikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlwcmludGsgKEtFUk5fREVCVUcgIkVYVDMtZnMgREVCVUcgKCVzLCAlZCk6ICVzOiIsCVwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsJCVwKKwkJcHJpbnRrIChLRVJOX0RFQlVHIGYsICMjIGEpOwkJCQlcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGV4dDNfZGVidWcoZiwgYS4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIFNwZWNpYWwgaW5vZGVzIG51bWJlcnMKKyAqLworI2RlZmluZQlFWFQzX0JBRF9JTk8JCSAxCS8qIEJhZCBibG9ja3MgaW5vZGUgKi8KKyNkZWZpbmUgRVhUM19ST09UX0lOTwkJIDIJLyogUm9vdCBpbm9kZSAqLworI2RlZmluZSBFWFQzX0JPT1RfTE9BREVSX0lOTwkgNQkvKiBCb290IGxvYWRlciBpbm9kZSAqLworI2RlZmluZSBFWFQzX1VOREVMX0RJUl9JTk8JIDYJLyogVW5kZWxldGUgZGlyZWN0b3J5IGlub2RlICovCisjZGVmaW5lIEVYVDNfUkVTSVpFX0lOTwkJIDcJLyogUmVzZXJ2ZWQgZ3JvdXAgZGVzY3JpcHRvcnMgaW5vZGUgKi8KKyNkZWZpbmUgRVhUM19KT1VSTkFMX0lOTwkgOAkvKiBKb3VybmFsIGlub2RlICovCisKKy8qIEZpcnN0IG5vbi1yZXNlcnZlZCBpbm9kZSBmb3Igb2xkIGV4dDMgZmlsZXN5c3RlbXMgKi8KKyNkZWZpbmUgRVhUM19HT09EX09MRF9GSVJTVF9JTk8JMTEKKworLyoKKyAqIE1heGltYWwgY291bnQgb2YgbGlua3MgdG8gYSBmaWxlCisgKi8KKyNkZWZpbmUgRVhUM19MSU5LX01BWAkJMzIwMDAKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBzZXZlcmFsIGJsb2NrIHNpemVzCisgKi8KKyNkZWZpbmUgRVhUM19NSU5fQkxPQ0tfU0laRQkJMTAyNAorI2RlZmluZQlFWFQzX01BWF9CTE9DS19TSVpFCQk2NTUzNgorI2RlZmluZSBFWFQzX01JTl9CTE9DS19MT0dfU0laRQkJMTAKKyMgZGVmaW5lIEVYVDNfQkxPQ0tfU0laRShzKQkJKEVYVDNfTUlOX0JMT0NLX1NJWkUgPDwgKHMpLT5zX2xvZ19ibG9ja19zaXplKQorI2RlZmluZQlFWFQzX0FERFJfUEVSX0JMT0NLKHMpCQkoRVhUM19CTE9DS19TSVpFKHMpIC8gc2l6ZW9mIChfX3UzMikpCisjIGRlZmluZSBFWFQzX0JMT0NLX1NJWkVfQklUUyhzKQkoKHMpLT5zX2xvZ19ibG9ja19zaXplICsgMTApCisjZGVmaW5lIEVYVDNfSU5PREVfU0laRShzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUM19HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUgOiBcCisJCQkJIChzKS0+c19pbm9kZV9zaXplKQorI2RlZmluZSBFWFQzX0ZJUlNUX0lOTyhzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUM19HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQzX0dPT0RfT0xEX0ZJUlNUX0lOTyA6IFwKKwkJCQkgKHMpLT5zX2ZpcnN0X2lubykKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBmcmFnbWVudHMKKyAqLworI2RlZmluZSBFWFQzX01JTl9GUkFHX1NJWkUJCTEwMjQKKyNkZWZpbmUJRVhUM19NQVhfRlJBR19TSVpFCQk0MDk2CisjZGVmaW5lIEVYVDNfTUlOX0ZSQUdfTE9HX1NJWkUJCSAgMTAKKyMgZGVmaW5lIEVYVDNfRlJBR19TSVpFKHMpCQkoRVhUM19NSU5fRlJBR19TSVpFIDw8IChzKS0+c19sb2dfZnJhZ19zaXplKQorIyBkZWZpbmUgRVhUM19GUkFHU19QRVJfQkxPQ0socykJKEVYVDNfQkxPQ0tfU0laRShzKSAvIEVYVDNfRlJBR19TSVpFKHMpKQorCisvKgorICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGV4dDNfZ3JvdXBfZGVzYworeworCV9fbGUzMgliZ19ibG9ja19iaXRtYXA7CQkvKiBCbG9ja3MgYml0bWFwIGJsb2NrICovCisJX19sZTMyCWJnX2lub2RlX2JpdG1hcDsJCS8qIElub2RlcyBiaXRtYXAgYmxvY2sgKi8KKwlfX2xlMzIJYmdfaW5vZGVfdGFibGU7CQkvKiBJbm9kZXMgdGFibGUgYmxvY2sgKi8KKwlfX2xlMTYJYmdfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJX19sZTE2CWJnX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCV9fbGUxNgliZ191c2VkX2RpcnNfY291bnQ7CS8qIERpcmVjdG9yaWVzIGNvdW50ICovCisJX191MTYJYmdfcGFkOworCV9fbGUzMgliZ19yZXNlcnZlZFszXTsKK307CisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2UgZ3JvdXAgZGVzY3JpcHRvcnMKKyAqLworIyBkZWZpbmUgRVhUM19CTE9DS1NfUEVSX0dST1VQKHMpCSgocyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyMgZGVmaW5lIEVYVDNfREVTQ19QRVJfQkxPQ0socykJCShFWFQzX0JMT0NLX1NJWkUocykgLyBzaXplb2YgKHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MpKQorIyBkZWZpbmUgRVhUM19JTk9ERVNfUEVSX0dST1VQKHMpCSgocyktPnNfaW5vZGVzX3Blcl9ncm91cCkKKworLyoKKyAqIENvbnN0YW50cyByZWxhdGl2ZSB0byB0aGUgZGF0YSBibG9ja3MKKyAqLworI2RlZmluZQlFWFQzX05ESVJfQkxPQ0tTCQkxMgorI2RlZmluZQlFWFQzX0lORF9CTE9DSwkJCUVYVDNfTkRJUl9CTE9DS1MKKyNkZWZpbmUJRVhUM19ESU5EX0JMT0NLCQkJKEVYVDNfSU5EX0JMT0NLICsgMSkKKyNkZWZpbmUJRVhUM19USU5EX0JMT0NLCQkJKEVYVDNfRElORF9CTE9DSyArIDEpCisjZGVmaW5lCUVYVDNfTl9CTE9DS1MJCQkoRVhUM19USU5EX0JMT0NLICsgMSkKKworLyoKKyAqIElub2RlIGZsYWdzCisgKi8KKyNkZWZpbmUJRVhUM19TRUNSTV9GTAkJCTB4MDAwMDAwMDEgLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lCUVYVDNfVU5STV9GTAkJCTB4MDAwMDAwMDIgLyogVW5kZWxldGUgKi8KKyNkZWZpbmUJRVhUM19DT01QUl9GTAkJCTB4MDAwMDAwMDQgLyogQ29tcHJlc3MgZmlsZSAqLworI2RlZmluZSBFWFQzX1NZTkNfRkwJCQkweDAwMDAwMDA4IC8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRVhUM19JTU1VVEFCTEVfRkwJCTB4MDAwMDAwMTAgLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUM19BUFBFTkRfRkwJCQkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBFWFQzX05PRFVNUF9GTAkJCTB4MDAwMDAwNDAgLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBFWFQzX05PQVRJTUVfRkwJCQkweDAwMDAwMDgwIC8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KKy8qIFJlc2VydmVkIGZvciBjb21wcmVzc2lvbiB1c2FnZS4uLiAqLworI2RlZmluZSBFWFQzX0RJUlRZX0ZMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBFWFQzX0NPTVBSQkxLX0ZMCQkweDAwMDAwMjAwIC8qIE9uZSBvciBtb3JlIGNvbXByZXNzZWQgY2x1c3RlcnMgKi8KKyNkZWZpbmUgRVhUM19OT0NPTVBSX0ZMCQkJMHgwMDAwMDQwMCAvKiBEb24ndCBjb21wcmVzcyAqLworI2RlZmluZSBFWFQzX0VDT01QUl9GTAkJCTB4MDAwMDA4MDAgLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCisjZGVmaW5lIEVYVDNfSU5ERVhfRkwJCQkweDAwMDAxMDAwIC8qIGhhc2gtaW5kZXhlZCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVhUM19JTUFHSUNfRkwJCQkweDAwMDAyMDAwIC8qIEFGUyBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVhUM19KT1VSTkFMX0RBVEFfRkwJCTB4MDAwMDQwMDAgLyogZmlsZSBkYXRhIHNob3VsZCBiZSBqb3VybmFsZWQgKi8KKyNkZWZpbmUgRVhUM19OT1RBSUxfRkwJCQkweDAwMDA4MDAwIC8qIGZpbGUgdGFpbCBzaG91bGQgbm90IGJlIG1lcmdlZCAqLworI2RlZmluZSBFWFQzX0RJUlNZTkNfRkwJCQkweDAwMDEwMDAwIC8qIGRpcnN5bmMgYmVoYXZpb3VyIChkaXJlY3RvcmllcyBvbmx5KSAqLworI2RlZmluZSBFWFQzX1RPUERJUl9GTAkJCTB4MDAwMjAwMDAgLyogVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcyovCisjZGVmaW5lIEVYVDNfUkVTRVJWRURfRkwJCTB4ODAwMDAwMDAgLyogcmVzZXJ2ZWQgZm9yIGV4dDMgbGliICovCisKKyNkZWZpbmUgRVhUM19GTF9VU0VSX1ZJU0lCTEUJCTB4MDAwM0RGRkYgLyogVXNlciB2aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIEVYVDNfRkxfVVNFUl9NT0RJRklBQkxFCQkweDAwMDM4MEZGIC8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLworCisvKgorICogSW5vZGUgZHluYW1pYyBzdGF0ZSBmbGFncworICovCisjZGVmaW5lIEVYVDNfU1RBVEVfSkRBVEEJCTB4MDAwMDAwMDEgLyogam91cm5hbGVkIGRhdGEgZXhpc3RzICovCisjZGVmaW5lIEVYVDNfU1RBVEVfTkVXCQkJMHgwMDAwMDAwMiAvKiBpbm9kZSBpcyBuZXdseSBjcmVhdGVkICovCisjZGVmaW5lIEVYVDNfU1RBVEVfWEFUVFIJCTB4MDAwMDAwMDQgLyogaGFzIGluLWlub2RlIHhhdHRycyAqLworCisvKiBVc2VkIHRvIHBhc3MgZ3JvdXAgZGVzY3JpcHRvciBkYXRhIHdoZW4gb25saW5lIHJlc2l6ZSBpcyBkb25lICovCitzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfaW5wdXQgeworCV9fdTMyIGdyb3VwOyAgICAgICAgICAgIC8qIEdyb3VwIG51bWJlciBmb3IgdGhpcyBkYXRhICovCisJX191MzIgYmxvY2tfYml0bWFwOyAgICAgLyogQWJzb2x1dGUgYmxvY2sgbnVtYmVyIG9mIGJsb2NrIGJpdG1hcCAqLworCV9fdTMyIGlub2RlX2JpdG1hcDsgICAgIC8qIEFic29sdXRlIGJsb2NrIG51bWJlciBvZiBpbm9kZSBiaXRtYXAgKi8KKwlfX3UzMiBpbm9kZV90YWJsZTsgICAgICAvKiBBYnNvbHV0ZSBibG9jayBudW1iZXIgb2YgaW5vZGUgdGFibGUgc3RhcnQgKi8KKwlfX3UzMiBibG9ja3NfY291bnQ7ICAgICAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgZ3JvdXAgKi8KKwlfX3UxNiByZXNlcnZlZF9ibG9ja3M7ICAvKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgYmxvY2tzIGluIHRoaXMgZ3JvdXAgKi8KKwlfX3UxNiB1bnVzZWQ7Cit9OworCisvKiBUaGUgc3RydWN0IGV4dDNfbmV3X2dyb3VwX2lucHV0IGluIGtlcm5lbCBzcGFjZSwgd2l0aCBmcmVlX2Jsb2Nrc19jb3VudCAqLworc3RydWN0IGV4dDNfbmV3X2dyb3VwX2RhdGEgeworCV9fdTMyIGdyb3VwOworCV9fdTMyIGJsb2NrX2JpdG1hcDsKKwlfX3UzMiBpbm9kZV9iaXRtYXA7CisJX191MzIgaW5vZGVfdGFibGU7CisJX191MzIgYmxvY2tzX2NvdW50OworCV9fdTE2IHJlc2VydmVkX2Jsb2NrczsKKwlfX3UxNiB1bnVzZWQ7CisJX191MzIgZnJlZV9ibG9ja3NfY291bnQ7Cit9OworCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisjZGVmaW5lCUVYVDNfSU9DX0dFVEZMQUdTCQlGU19JT0NfR0VURkxBR1MKKyNkZWZpbmUJRVhUM19JT0NfU0VURkxBR1MJCUZTX0lPQ19TRVRGTEFHUworI2RlZmluZQlFWFQzX0lPQ19HRVRWRVJTSU9OCQlfSU9SKCdmJywgMywgbG9uZykKKyNkZWZpbmUJRVhUM19JT0NfU0VUVkVSU0lPTgkJX0lPVygnZicsIDQsIGxvbmcpCisjZGVmaW5lIEVYVDNfSU9DX0dST1VQX0VYVEVORAkJX0lPVygnZicsIDcsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIEVYVDNfSU9DX0dST1VQX0FERAkJX0lPVygnZicsIDgsc3RydWN0IGV4dDNfbmV3X2dyb3VwX2lucHV0KQorI2RlZmluZQlFWFQzX0lPQ19HRVRWRVJTSU9OX09MRAkJRlNfSU9DX0dFVFZFUlNJT04KKyNkZWZpbmUJRVhUM19JT0NfU0VUVkVSU0lPTl9PTEQJCUZTX0lPQ19TRVRWRVJTSU9OCisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworI2RlZmluZSBFWFQzX0lPQ19XQUlUX0ZPUl9SRUFET05MWQlfSU9SKCdmJywgOTksIGxvbmcpCisjZW5kaWYKKyNkZWZpbmUgRVhUM19JT0NfR0VUUlNWU1oJCV9JT1IoJ2YnLCA1LCBsb25nKQorI2RlZmluZSBFWFQzX0lPQ19TRVRSU1ZTWgkJX0lPVygnZicsIDYsIGxvbmcpCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcyBpbiAzMiBiaXQgZW11bGF0aW9uCisgKi8KKyNkZWZpbmUgRVhUM19JT0MzMl9HRVRGTEFHUwkJRlNfSU9DMzJfR0VURkxBR1MKKyNkZWZpbmUgRVhUM19JT0MzMl9TRVRGTEFHUwkJRlNfSU9DMzJfU0VURkxBR1MKKyNkZWZpbmUgRVhUM19JT0MzMl9HRVRWRVJTSU9OCQlfSU9SKCdmJywgMywgaW50KQorI2RlZmluZSBFWFQzX0lPQzMyX1NFVFZFUlNJT04JCV9JT1coJ2YnLCA0LCBpbnQpCisjZGVmaW5lIEVYVDNfSU9DMzJfR0VUUlNWU1oJCV9JT1IoJ2YnLCA1LCBpbnQpCisjZGVmaW5lIEVYVDNfSU9DMzJfU0VUUlNWU1oJCV9JT1coJ2YnLCA2LCBpbnQpCisjZGVmaW5lIEVYVDNfSU9DMzJfR1JPVVBfRVhURU5ECQlfSU9XKCdmJywgNywgdW5zaWduZWQgaW50KQorI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKyNkZWZpbmUgRVhUM19JT0MzMl9XQUlUX0ZPUl9SRUFET05MWQlfSU9SKCdmJywgOTksIGludCkKKyNlbmRpZgorI2RlZmluZSBFWFQzX0lPQzMyX0dFVFZFUlNJT05fT0xECUZTX0lPQzMyX0dFVFZFUlNJT04KKyNkZWZpbmUgRVhUM19JT0MzMl9TRVRWRVJTSU9OX09MRAlGU19JT0MzMl9TRVRWRVJTSU9OCisKKworLyoKKyAqICBNb3VudCBvcHRpb25zCisgKi8KK3N0cnVjdCBleHQzX21vdW50X29wdGlvbnMgeworCXVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQ7CisJdWlkX3Qgc19yZXN1aWQ7CisJZ2lkX3Qgc19yZXNnaWQ7CisJdW5zaWduZWQgbG9uZyBzX2NvbW1pdF9pbnRlcnZhbDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpbnQgc19qcXVvdGFfZm10OworCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsKKyNlbmRpZgorfTsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBpbm9kZSBvbiB0aGUgZGlzaworICovCitzdHJ1Y3QgZXh0M19pbm9kZSB7CisJX19sZTE2CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCV9fbGUxNglpX3VpZDsJCS8qIExvdyAxNiBiaXRzIG9mIE93bmVyIFVpZCAqLworCV9fbGUzMglpX3NpemU7CQkvKiBTaXplIGluIGJ5dGVzICovCisJX19sZTMyCWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJX19sZTMyCWlfY3RpbWU7CS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX2xlMzIJaV9tdGltZTsJLyogTW9kaWZpY2F0aW9uIHRpbWUgKi8KKwlfX2xlMzIJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCV9fbGUxNglpX2dpZDsJCS8qIExvdyAxNiBiaXRzIG9mIEdyb3VwIElkICovCisJX19sZTE2CWlfbGlua3NfY291bnQ7CS8qIExpbmtzIGNvdW50ICovCisJX19sZTMyCWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwlfX2xlMzIJaV9mbGFnczsJLyogRmlsZSBmbGFncyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBsX2lfcmVzZXJ2ZWQxOworCQl9IGxpbnV4MTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBoX2lfdHJhbnNsYXRvcjsKKwkJfSBodXJkMTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyICBtX2lfcmVzZXJ2ZWQxOworCQl9IG1hc2l4MTsKKwl9IG9zZDE7CQkJCS8qIE9TIGRlcGVuZGVudCAxICovCisJX19sZTMyCWlfYmxvY2tbRVhUM19OX0JMT0NLU107LyogUG9pbnRlcnMgdG8gYmxvY2tzICovCisJX19sZTMyCWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCV9fbGUzMglpX2ZpbGVfYWNsOwkvKiBGaWxlIEFDTCAqLworCV9fbGUzMglpX2Rpcl9hY2w7CS8qIERpcmVjdG9yeSBBQ0wgKi8KKwlfX2xlMzIJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTgJbF9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAlsX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CWlfcGFkMTsKKwkJCV9fbGUxNglsX2lfdWlkX2hpZ2g7CS8qIHRoZXNlIDIgZmllbGRzICAgICovCisJCQlfX2xlMTYJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJX191MzIJbF9pX3Jlc2VydmVkMjsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQlfX3U4CWhfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCV9fdTgJaF9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQlfX3UxNgloX2lfbW9kZV9oaWdoOworCQkJX191MTYJaF9pX3VpZF9oaWdoOworCQkJX191MTYJaF9pX2dpZF9oaWdoOworCQkJX191MzIJaF9pX2F1dGhvcjsKKwkJfSBodXJkMjsKKwkJc3RydWN0IHsKKwkJCV9fdTgJbV9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJX191OAltX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCV9fdTE2CW1fcGFkMTsKKwkJCV9fdTMyCW1faV9yZXNlcnZlZDJbMl07CisJCX0gbWFzaXgyOworCX0gb3NkMjsJCQkJLyogT1MgZGVwZW5kZW50IDIgKi8KKwlfX2xlMTYJaV9leHRyYV9pc2l6ZTsKKwlfX2xlMTYJaV9wYWQxOworfTsKKworI2RlZmluZSBpX3NpemVfaGlnaAlpX2Rpcl9hY2wKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX2xpbnV4X18pCisjZGVmaW5lIGlfcmVzZXJ2ZWQxCW9zZDEubGludXgxLmxfaV9yZXNlcnZlZDEKKyNkZWZpbmUgaV9mcmFnCQlvc2QyLmxpbnV4Mi5sX2lfZnJhZworI2RlZmluZSBpX2ZzaXplCQlvc2QyLmxpbnV4Mi5sX2lfZnNpemUKKyNkZWZpbmUgaV91aWRfbG93CWlfdWlkCisjZGVmaW5lIGlfZ2lkX2xvdwlpX2dpZAorI2RlZmluZSBpX3VpZF9oaWdoCW9zZDIubGludXgyLmxfaV91aWRfaGlnaAorI2RlZmluZSBpX2dpZF9oaWdoCW9zZDIubGludXgyLmxfaV9naWRfaGlnaAorI2RlZmluZSBpX3Jlc2VydmVkMglvc2QyLmxpbnV4Mi5sX2lfcmVzZXJ2ZWQyCisKKyNlbGlmIGRlZmluZWQoX19HTlVfXykKKworI2RlZmluZSBpX3RyYW5zbGF0b3IJb3NkMS5odXJkMS5oX2lfdHJhbnNsYXRvcgorI2RlZmluZSBpX2ZyYWcJCW9zZDIuaHVyZDIuaF9pX2ZyYWc7CisjZGVmaW5lIGlfZnNpemUJCW9zZDIuaHVyZDIuaF9pX2ZzaXplOworI2RlZmluZSBpX3VpZF9oaWdoCW9zZDIuaHVyZDIuaF9pX3VpZF9oaWdoCisjZGVmaW5lIGlfZ2lkX2hpZ2gJb3NkMi5odXJkMi5oX2lfZ2lkX2hpZ2gKKyNkZWZpbmUgaV9hdXRob3IJb3NkMi5odXJkMi5oX2lfYXV0aG9yCisKKyNlbGlmIGRlZmluZWQoX19tYXNpeF9fKQorCisjZGVmaW5lIGlfcmVzZXJ2ZWQxCW9zZDEubWFzaXgxLm1faV9yZXNlcnZlZDEKKyNkZWZpbmUgaV9mcmFnCQlvc2QyLm1hc2l4Mi5tX2lfZnJhZworI2RlZmluZSBpX2ZzaXplCQlvc2QyLm1hc2l4Mi5tX2lfZnNpemUKKyNkZWZpbmUgaV9yZXNlcnZlZDIJb3NkMi5tYXNpeDIubV9pX3Jlc2VydmVkMgorCisjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fbGludXhfXykgKi8KKworLyoKKyAqIEZpbGUgc3lzdGVtIHN0YXRlcworICovCisjZGVmaW5lCUVYVDNfVkFMSURfRlMJCQkweDAwMDEJLyogVW5tb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUJRVhUM19FUlJPUl9GUwkJCTB4MDAwMgkvKiBFcnJvcnMgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUJRVhUM19PUlBIQU5fRlMJCQkweDAwMDQJLyogT3JwaGFucyBiZWluZyByZWNvdmVyZWQgKi8KKworLyoKKyAqIE1vdW50IGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9DSEVDSwkJMHgwMDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLworI2RlZmluZSBFWFQzX01PVU5UX09MREFMTE9DCQkweDAwMDAyICAvKiBEb24ndCB1c2UgdGhlIG5ldyBPcmxvdiBhbGxvY2F0b3IgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9HUlBJRAkJMHgwMDAwNAkvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQzX01PVU5UX0RFQlVHCQkweDAwMDA4CS8qIFNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfRVJST1JTX0NPTlQJCTB4MDAwMTAJLyogQ29udGludWUgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfRVJST1JTX1JPCQkweDAwMDIwCS8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwMDQwCS8qIFBhbmljIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQzX01PVU5UX01JTklYX0RGCQkweDAwMDgwCS8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfTk9MT0FECQkweDAwMTAwCS8qIERvbid0IHVzZSBleGlzdGluZyBqb3VybmFsKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9BQk9SVAkJMHgwMDIwMAkvKiBGYXRhbCBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBFWFQzX01PVU5UX0RBVEFfRkxBR1MJCTB4MDBDMDAJLyogTW9kZSBmb3IgZGF0YSB3cml0ZXM6ICovCisjZGVmaW5lIEVYVDNfTU9VTlRfSk9VUk5BTF9EQVRBCQkweDAwNDAwCS8qIFdyaXRlIGRhdGEgdG8gam91cm5hbCAqLworI2RlZmluZSBFWFQzX01PVU5UX09SREVSRURfREFUQQkJMHgwMDgwMAkvKiBGbHVzaCBkYXRhIGJlZm9yZSBjb21taXQgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQQkweDAwQzAwCS8qIE5vIGRhdGEgb3JkZXJpbmcgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9VUERBVEVfSk9VUk5BTAkweDAxMDAwCS8qIFVwZGF0ZSB0aGUgam91cm5hbCBmb3JtYXQgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9OT19VSUQzMgkJMHgwMjAwMCAgLyogRGlzYWJsZSAzMi1iaXQgVUlEcyAqLworI2RlZmluZSBFWFQzX01PVU5UX1hBVFRSX1VTRVIJCTB4MDQwMDAJLyogRXh0ZW5kZWQgdXNlciBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfUE9TSVhfQUNMCQkweDA4MDAwCS8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfUkVTRVJWQVRJT04JCTB4MTAwMDAJLyogUHJlYWxsb2NhdGlvbiAqLworI2RlZmluZSBFWFQzX01PVU5UX0JBUlJJRVIJCTB4MjAwMDAgLyogVXNlIGJsb2NrIGJhcnJpZXJzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfTk9CSAkJCTB4NDAwMDAgLyogTm8gYnVmZmVyaGVhZHMgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9RVU9UQQkJMHg4MDAwMCAvKiBTb21lIHF1b3RhIG9wdGlvbiBzZXQgKi8KKyNkZWZpbmUgRVhUM19NT1VOVF9VU1JRVU9UQQkJMHgxMDAwMDAgLyogIm9sZCIgdXNlciBxdW90YSAqLworI2RlZmluZSBFWFQzX01PVU5UX0dSUFFVT1RBCQkweDIwMDAwMCAvKiAib2xkIiBncm91cCBxdW90YSAqLworCisvKiBDb21wYXRpYmlsaXR5LCBmb3IgaGF2aW5nIGJvdGggZXh0Ml9mcy5oIGFuZCBleHQzX2ZzLmggaW5jbHVkZWQgYXQgb25jZSAqLworI2lmbmRlZiBfTElOVVhfRVhUMl9GU19ICisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQzX01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUM19NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKEVYVDNfU0Ioc2IpLT5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDNfTU9VTlRfIyNvcHQpCisjZWxzZQorI2RlZmluZSBFWFQyX01PVU5UX05PTE9BRAkJRVhUM19NT1VOVF9OT0xPQUQKKyNkZWZpbmUgRVhUMl9NT1VOVF9BQk9SVAkJRVhUM19NT1VOVF9BQk9SVAorI2RlZmluZSBFWFQyX01PVU5UX0RBVEFfRkxBR1MJCUVYVDNfTU9VTlRfREFUQV9GTEFHUworI2VuZGlmCisKKyNkZWZpbmUgZXh0M19zZXRfYml0CQkJZXh0Ml9zZXRfYml0CisjZGVmaW5lIGV4dDNfc2V0X2JpdF9hdG9taWMJCWV4dDJfc2V0X2JpdF9hdG9taWMKKyNkZWZpbmUgZXh0M19jbGVhcl9iaXQJCQlleHQyX2NsZWFyX2JpdAorI2RlZmluZSBleHQzX2NsZWFyX2JpdF9hdG9taWMJCWV4dDJfY2xlYXJfYml0X2F0b21pYworI2RlZmluZSBleHQzX3Rlc3RfYml0CQkJZXh0Ml90ZXN0X2JpdAorI2RlZmluZSBleHQzX2ZpbmRfZmlyc3RfemVyb19iaXQJZXh0Ml9maW5kX2ZpcnN0X3plcm9fYml0CisjZGVmaW5lIGV4dDNfZmluZF9uZXh0X3plcm9fYml0CQlleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdAorCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQzX0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUM19ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworLyoKKyAqIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAqLworI2RlZmluZSBFWFQzX0VSUk9SU19DT05USU5VRQkJMQkvKiBDb250aW51ZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgRVhUM19FUlJPUlNfUk8JCQkyCS8qIFJlbW91bnQgZnMgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVYVDNfRVJST1JTX1BBTklDCQkzCS8qIFBhbmljICovCisjZGVmaW5lIEVYVDNfRVJST1JTX0RFRkFVTFQJCUVYVDNfRVJST1JTX0NPTlRJTlVFCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHN1cGVyIGJsb2NrCisgKi8KK3N0cnVjdCBleHQzX3N1cGVyX2Jsb2NrIHsKKy8qMDAqLwlfX2xlMzIJc19pbm9kZXNfY291bnQ7CQkvKiBJbm9kZXMgY291bnQgKi8KKwlfX2xlMzIJc19ibG9ja3NfY291bnQ7CQkvKiBCbG9ja3MgY291bnQgKi8KKwlfX2xlMzIJc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfZnJlZV9ibG9ja3NfY291bnQ7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisvKjEwKi8JX19sZTMyCXNfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCisJX19sZTMyCXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCV9fbGUzMglzX2xvZ19ibG9ja19zaXplOwkvKiBCbG9jayBzaXplICovCisJX19sZTMyCXNfbG9nX2ZyYWdfc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworLyoyMCovCV9fbGUzMglzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCV9fbGUzMglzX2ZyYWdzX3Blcl9ncm91cDsJLyogIyBGcmFnbWVudHMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfaW5vZGVzX3Blcl9ncm91cDsJLyogIyBJbm9kZXMgcGVyIGdyb3VwICovCisJX19sZTMyCXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisvKjMwKi8JX19sZTMyCXNfd3RpbWU7CQkvKiBXcml0ZSB0aW1lICovCisJX19sZTE2CXNfbW50X2NvdW50OwkJLyogTW91bnQgY291bnQgKi8KKwlfX2xlMTYJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJX19sZTE2CXNfbWFnaWM7CQkvKiBNYWdpYyBzaWduYXR1cmUgKi8KKwlfX2xlMTYJc19zdGF0ZTsJCS8qIEZpbGUgc3lzdGVtIHN0YXRlICovCisJX19sZTE2CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCV9fbGUxNglzX21pbm9yX3Jldl9sZXZlbDsJLyogbWlub3IgcmV2aXNpb24gbGV2ZWwgKi8KKy8qNDAqLwlfX2xlMzIJc19sYXN0Y2hlY2s7CQkvKiB0aW1lIG9mIGxhc3QgY2hlY2sgKi8KKwlfX2xlMzIJc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwlfX2xlMzIJc19jcmVhdG9yX29zOwkJLyogT1MgKi8KKwlfX2xlMzIJc19yZXZfbGV2ZWw7CQkvKiBSZXZpc2lvbiBsZXZlbCAqLworLyo1MCovCV9fbGUxNglzX2RlZl9yZXN1aWQ7CQkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJX19sZTE2CXNfZGVmX3Jlc2dpZDsJCS8qIERlZmF1bHQgZ2lkIGZvciByZXNlcnZlZCBibG9ja3MgKi8KKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgZm9yIEVYVDNfRFlOQU1JQ19SRVYgc3VwZXJibG9ja3Mgb25seS4KKwkgKgorCSAqIE5vdGU6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgYW5kCisJICogdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCBpcyB0aGF0IGlmIHRoZXJlIGlzIGEgYml0IHNldAorCSAqIGluIHRoZSBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgdGhhdCB0aGUga2VybmVsIGRvZXNuJ3QKKwkgKiBrbm93IGFib3V0LCBpdCBzaG91bGQgcmVmdXNlIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtLgorCSAqCisJICogZTJmc2NrJ3MgcmVxdWlyZW1lbnRzIGFyZSBtb3JlIHN0cmljdDsgaWYgaXQgZG9lc24ndCBrbm93CisJICogYWJvdXQgYSBmZWF0dXJlIGluIGVpdGhlciB0aGUgY29tcGF0aWJsZSBvciBpbmNvbXBhdGlibGUKKwkgKiBmZWF0dXJlIHNldCwgaXQgbXVzdCBhYm9ydCBhbmQgbm90IHRyeSB0byBtZWRkbGUgd2l0aAorCSAqIHRoaW5ncyBpdCBkb2Vzbid0IHVuZGVyc3RhbmQuLi4KKwkgKi8KKwlfX2xlMzIJc19maXJzdF9pbm87CQkvKiBGaXJzdCBub24tcmVzZXJ2ZWQgaW5vZGUgKi8KKwlfX2xlMTYgICBzX2lub2RlX3NpemU7CQkvKiBzaXplIG9mIGlub2RlIHN0cnVjdHVyZSAqLworCV9fbGUxNglzX2Jsb2NrX2dyb3VwX25yOwkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCV9fbGUzMglzX2ZlYXR1cmVfY29tcGF0OwkvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisvKjYwKi8JX19sZTMyCXNfZmVhdHVyZV9pbmNvbXBhdDsJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19sZTMyCXNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKy8qNjgqLwlfX3U4CXNfdXVpZFsxNl07CQkvKiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworLyo3OCovCWNoYXIJc192b2x1bWVfbmFtZVsxNl07CS8qIHZvbHVtZSBuYW1lICovCisvKjg4Ki8JY2hhcglzX2xhc3RfbW91bnRlZFs2NF07CS8qIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQgKi8KKy8qQzgqLwlfX2xlMzIJc19hbGdvcml0aG1fdXNhZ2VfYml0bWFwOyAvKiBGb3IgY29tcHJlc3Npb24gKi8KKwkvKgorCSAqIFBlcmZvcm1hbmNlIGhpbnRzLiAgRGlyZWN0b3J5IHByZWFsbG9jYXRpb24gc2hvdWxkIG9ubHkKKwkgKiBoYXBwZW4gaWYgdGhlIEVYVDNfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DIGZsYWcgaXMgb24uCisJICovCisJX191OAlzX3ByZWFsbG9jX2Jsb2NrczsJLyogTnIgb2YgYmxvY2tzIHRvIHRyeSB0byBwcmVhbGxvY2F0ZSovCisJX191OAlzX3ByZWFsbG9jX2Rpcl9ibG9ja3M7CS8qIE5yIHRvIHByZWFsbG9jYXRlIGZvciBkaXJzICovCisJX19sZTE2CXNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsJLyogUGVyIGdyb3VwIGRlc2MgZm9yIG9ubGluZSBncm93dGggKi8KKwkvKgorCSAqIEpvdXJuYWxpbmcgc3VwcG9ydCB2YWxpZCBpZiBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMIHNldC4KKwkgKi8KKy8qRDAqLwlfX3U4CXNfam91cm5hbF91dWlkWzE2XTsJLyogdXVpZCBvZiBqb3VybmFsIHN1cGVyYmxvY2sgKi8KKy8qRTAqLwlfX2xlMzIJc19qb3VybmFsX2ludW07CQkvKiBpbm9kZSBudW1iZXIgb2Ygam91cm5hbCBmaWxlICovCisJX19sZTMyCXNfam91cm5hbF9kZXY7CQkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCV9fbGUzMglzX2xhc3Rfb3JwaGFuOwkJLyogc3RhcnQgb2YgbGlzdCBvZiBpbm9kZXMgdG8gZGVsZXRlICovCisJX19sZTMyCXNfaGFzaF9zZWVkWzRdOwkJLyogSFRSRUUgaGFzaCBzZWVkICovCisJX191OAlzX2RlZl9oYXNoX3ZlcnNpb247CS8qIERlZmF1bHQgaGFzaCB2ZXJzaW9uIHRvIHVzZSAqLworCV9fdTgJc19yZXNlcnZlZF9jaGFyX3BhZDsKKwlfX3UxNglzX3Jlc2VydmVkX3dvcmRfcGFkOworCV9fbGUzMglzX2RlZmF1bHRfbW91bnRfb3B0czsKKwlfX2xlMzIJc19maXJzdF9tZXRhX2JnOwkvKiBGaXJzdCBtZXRhYmxvY2sgYmxvY2sgZ3JvdXAgKi8KKwlfX3UzMglzX3Jlc2VydmVkWzE5MF07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KK307CisKKy8qIEFzc3VtZSB0aGF0IHVzZXIgbW9kZSBwcm9ncmFtcyBhcmUgcGFzc2luZyBpbiBhbiBleHQzZnMgc3VwZXJibG9jaywgbm90CisgKiBhIGtlcm5lbCBzdHJ1Y3Qgc3VwZXJfYmxvY2suICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gY2FsbCB0aGUgZmVhdHVyZS10ZXN0CisgKiBtYWNyb3MgZnJvbSB1c2VyIGxhbmQuICovCisjZGVmaW5lIEVYVDNfU0Ioc2IpCShzYikKKworI2RlZmluZSBORVhUX09SUEhBTihpbm9kZSkgRVhUM19JKGlub2RlKS0+aV9kdGltZQorCisvKgorICogQ29kZXMgZm9yIG9wZXJhdGluZyBzeXN0ZW1zCisgKi8KKyNkZWZpbmUgRVhUM19PU19MSU5VWAkJMAorI2RlZmluZSBFWFQzX09TX0hVUkQJCTEKKyNkZWZpbmUgRVhUM19PU19NQVNJWAkJMgorI2RlZmluZSBFWFQzX09TX0ZSRUVCU0QJCTMKKyNkZWZpbmUgRVhUM19PU19MSVRFUwkJNAorCisvKgorICogUmV2aXNpb24gbGV2ZWxzCisgKi8KKyNkZWZpbmUgRVhUM19HT09EX09MRF9SRVYJMAkvKiBUaGUgZ29vZCBvbGQgKG9yaWdpbmFsKSBmb3JtYXQgKi8KKyNkZWZpbmUgRVhUM19EWU5BTUlDX1JFVgkxCS8qIFYyIGZvcm1hdCB3LyBkeW5hbWljIGlub2RlIHNpemVzICovCisKKyNkZWZpbmUgRVhUM19DVVJSRU5UX1JFVglFWFQzX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQzX01BWF9TVVBQX1JFVglFWFQzX0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvKgorICogRmVhdHVyZSBzZXQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUM19TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCSggRVhUM19TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSApCisjZGVmaW5lIEVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQzX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykgKQorI2RlZmluZSBFWFQzX1NFVF9DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQzX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQzX1NFVF9ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQzX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCB8PSBjcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQzX1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUM19DTEVBUl9DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQzX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUM19DTEVBUl9ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwlFWFQzX1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmPSB+Y3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUM19DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAorCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MJMHgwMDAxCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUwkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDA0CisjZGVmaW5lIEVYVDNfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIJCTB4MDAwOAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERQkweDAwMTAKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgJCTB4MDAyMAorCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCTB4MDAwMQorI2RlZmluZSBFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUJMHgwMDAyCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSCTB4MDAwNAorCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIJCTB4MDAwNCAvKiBOZWVkcyByZWNvdmVyeSAqLworI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDA4IC8qIEpvdXJuYWwgZGV2aWNlICovCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHCQkweDAwMTAKKworI2RlZmluZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX1NVUFAJRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUgorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfU1VQUAkoRVhUM19GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFfCBcCisJCQkJCSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUnwgXAorCQkJCQkgRVhUM19GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisKKy8qCisgKiBEZWZhdWx0IHZhbHVlcyBmb3IgdXNlciBhbmQvb3IgZ3JvdXAgdXNpbmcgcmVzZXJ2ZWQgYmxvY2tzCisgKi8KKyNkZWZpbmUJRVhUM19ERUZfUkVTVUlECQkwCisjZGVmaW5lCUVYVDNfREVGX1JFU0dJRAkJMAorCisvKgorICogRGVmYXVsdCBtb3VudCBvcHRpb25zCisgKi8KKyNkZWZpbmUgRVhUM19ERUZNX0RFQlVHCQkweDAwMDEKKyNkZWZpbmUgRVhUM19ERUZNX0JTREdST1VQUwkweDAwMDIKKyNkZWZpbmUgRVhUM19ERUZNX1hBVFRSX1VTRVIJMHgwMDA0CisjZGVmaW5lIEVYVDNfREVGTV9BQ0wJCTB4MDAwOAorI2RlZmluZSBFWFQzX0RFRk1fVUlEMTYJCTB4MDAxMAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREUJCTB4MDA2MAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfREFUQQkweDAwMjAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX09SREVSRUQJMHgwMDQwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9XQkFDSwkweDAwNjAKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQorICovCisjZGVmaW5lIEVYVDNfTkFNRV9MRU4gMjU1CisKK3N0cnVjdCBleHQzX2Rpcl9lbnRyeSB7CisJX19sZTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCV9fbGUxNglyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCV9fbGUxNgluYW1lX2xlbjsJCS8qIE5hbWUgbGVuZ3RoICovCisJY2hhcgluYW1lW0VYVDNfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIFNpbmNlIEVYVDMgc3RydWN0dXJlcyBhcmUKKyAqIHN0b3JlZCBpbiBpbnRlbCBieXRlIG9yZGVyLCBhbmQgdGhlIG5hbWVfbGVuIGZpZWxkIGNvdWxkIG5ldmVyIGJlCisgKiBiaWdnZXIgdGhhbiAyNTUgY2hhcnMsIGl0J3Mgc2FmZSB0byByZWNsYWltIHRoZSBleHRyYSBieXRlIGZvciB0aGUKKyAqIGZpbGVfdHlwZSBmaWVsZC4KKyAqLworc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgeworCV9fbGUzMglpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwlfX2xlMTYJcmVjX2xlbjsJCS8qIERpcmVjdG9yeSBlbnRyeSBsZW5ndGggKi8KKwlfX3U4CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwlfX3U4CWZpbGVfdHlwZTsKKwljaGFyCW5hbWVbRVhUM19OQU1FX0xFTl07CS8qIEZpbGUgbmFtZSAqLworfTsKKworLyoKKyAqIEV4dDMgZGlyZWN0b3J5IGZpbGUgdHlwZXMuICBPbmx5IHRoZSBsb3cgMyBiaXRzIGFyZSB1c2VkLiAgVGhlCisgKiBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBmb3Igbm93LgorICovCisjZGVmaW5lIEVYVDNfRlRfVU5LTk9XTgkJMAorI2RlZmluZSBFWFQzX0ZUX1JFR19GSUxFCTEKKyNkZWZpbmUgRVhUM19GVF9ESVIJCTIKKyNkZWZpbmUgRVhUM19GVF9DSFJERVYJCTMKKyNkZWZpbmUgRVhUM19GVF9CTEtERVYJCTQKKyNkZWZpbmUgRVhUM19GVF9GSUZPCQk1CisjZGVmaW5lIEVYVDNfRlRfU09DSwkJNgorI2RlZmluZSBFWFQzX0ZUX1NZTUxJTksJCTcKKworI2RlZmluZSBFWFQzX0ZUX01BWAkJOAorCisvKgorICogRVhUM19ESVJfUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIGJvdW5kYXJpZXMKKyAqCisgKiBOT1RFOiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNAorICovCisjZGVmaW5lIEVYVDNfRElSX1BBRAkJCTQKKyNkZWZpbmUgRVhUM19ESVJfUk9VTkQJCQkoRVhUM19ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUM19ESVJfUkVDX0xFTihuYW1lX2xlbikJKCgobmFtZV9sZW4pICsgOCArIEVYVDNfRElSX1JPVU5EKSAmIFwKKwkJCQkJIH5FWFQzX0RJUl9ST1VORCkKKyNkZWZpbmUgRVhUM19NQVhfUkVDX0xFTgkJKCgxPDwxNiktMSkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgZXh0M19yZWNfbGVuX2Zyb21fZGlzayhfX2xlMTYgZGxlbikKK3sKKwl1bnNpZ25lZCBsZW4gPSBsZTE2X3RvX2NwdShkbGVuKTsKKworCWlmIChsZW4gPT0gRVhUM19NQVhfUkVDX0xFTikKKwkJcmV0dXJuIDEgPDwgMTY7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIF9faW5saW5lX18gX19sZTE2IGV4dDNfcmVjX2xlbl90b19kaXNrKHVuc2lnbmVkIGxlbikKK3sKKwlpZiAobGVuID09ICgxIDw8IDE2KSkKKwkJcmV0dXJuIGNwdV90b19sZTE2KEVYVDNfTUFYX1JFQ19MRU4pOworCWVsc2UgaWYgKGxlbiA+ICgxIDw8IDE2KSkKKwkJQlVHKCk7CisJcmV0dXJuIGNwdV90b19sZTE2KGxlbik7Cit9CisKKy8qCisgKiBIYXNoIFRyZWUgRGlyZWN0b3J5IGluZGV4aW5nCisgKiAoYykgRGFuaWVsIFBoaWxsaXBzLCAyMDAxCisgKi8KKworI2RlZmluZSBpc19keChkaXIpIChFWFQzX0hBU19DT01QQVRfRkVBVFVSRShkaXItPmlfc2IsIFwKKwkJCQkgICAgICBFWFQzX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWCkgJiYgXAorCQkgICAgICAoRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSkKKyNkZWZpbmUgRVhUM19ESVJfTElOS19NQVgoZGlyKSAoIWlzX2R4KGRpcikgJiYgKGRpciktPmlfbmxpbmsgPj0gRVhUM19MSU5LX01BWCkKKyNkZWZpbmUgRVhUM19ESVJfTElOS19FTVBUWShkaXIpICgoZGlyKS0+aV9ubGluayA9PSAyIHx8IChkaXIpLT5pX25saW5rID09IDEpCisKKy8qIExlZ2FsIHZhbHVlcyBmb3IgdGhlIGR4X3Jvb3QgaGFzaF92ZXJzaW9uIGZpZWxkOiAqLworCisjZGVmaW5lIERYX0hBU0hfTEVHQUNZCQkwCisjZGVmaW5lIERYX0hBU0hfSEFMRl9NRDQJMQorI2RlZmluZSBEWF9IQVNIX1RFQQkJMgorCisKKyNlbmRpZgkvKiBfTElOVVhfRVhUM19GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZhZHZpc2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmFkdmlzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTc0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZhZHZpc2UuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIEZBRFZJU0VfSF9JTkNMVURFRAorI2RlZmluZSBGQURWSVNFX0hfSU5DTFVERUQKKworI2RlZmluZSBQT1NJWF9GQURWX05PUk1BTAkwIC8qIE5vIGZ1cnRoZXIgc3BlY2lhbCB0cmVhdG1lbnQuICAqLworI2RlZmluZSBQT1NJWF9GQURWX1JBTkRPTQkxIC8qIEV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzLiAgKi8KKyNkZWZpbmUgUE9TSVhfRkFEVl9TRVFVRU5USUFMCTIgLyogRXhwZWN0IHNlcXVlbnRpYWwgcGFnZSByZWZlcmVuY2VzLiAgKi8KKyNkZWZpbmUgUE9TSVhfRkFEVl9XSUxMTkVFRAkzIC8qIFdpbGwgbmVlZCB0aGVzZSBwYWdlcy4gICovCisKKy8qCisgKiBUaGUgYWR2aXNlIHZhbHVlcyBmb3IgUE9TSVhfRkFEVl9ET05UTkVFRCBhbmQgUE9TSVhfQURWX05PUkVVU0UKKyAqIGZvciBzMzkwLTY0IGRpZmZlciBmcm9tIHRoZSB2YWx1ZXMgZm9yIHRoZSByZXN0IG9mIHRoZSB3b3JsZC4KKyAqLworI2lmIGRlZmluZWQoX19zMzkweF9fKQorI2RlZmluZSBQT1NJWF9GQURWX0RPTlRORUVECTYgLyogRG9uJ3QgbmVlZCB0aGVzZSBwYWdlcy4gICovCisjZGVmaW5lIFBPU0lYX0ZBRFZfTk9SRVVTRQk3IC8qIERhdGEgd2lsbCBiZSBhY2Nlc3NlZCBvbmNlLiAgKi8KKyNlbHNlCisjZGVmaW5lIFBPU0lYX0ZBRFZfRE9OVE5FRUQJNCAvKiBEb24ndCBuZWVkIHRoZXNlIHBhZ2VzLiAgKi8KKyNkZWZpbmUgUE9TSVhfRkFEVl9OT1JFVVNFCTUgLyogRGF0YSB3aWxsIGJlIGFjY2Vzc2VkIG9uY2UuICAqLworI2VuZGlmCisKKyNlbmRpZgkvKiBGQURWSVNFX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhkZjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mYi5oCkBAIC0wLDAgKzEsMzg1IEBACisjaWZuZGVmIF9MSU5VWF9GQl9ICisjZGVmaW5lIF9MSU5VWF9GQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworc3RydWN0IGRlbnRyeTsKKworLyogRGVmaW5pdGlvbnMgb2YgZnJhbWUgYnVmZmVycwkJCQkJCSovCisKKyNkZWZpbmUgRkJfTUFKT1IJCTI5CisjZGVmaW5lIEZCX01BWAkJCTMyCS8qIHN1ZmZpY2llbnQgZm9yIG5vdyAqLworCisvKiBpb2N0bHMKKyAgIDB4NDYgaXMgJ0YnCQkJCQkJCQkqLworI2RlZmluZSBGQklPR0VUX1ZTQ1JFRU5JTkZPCTB4NDYwMAorI2RlZmluZSBGQklPUFVUX1ZTQ1JFRU5JTkZPCTB4NDYwMQorI2RlZmluZSBGQklPR0VUX0ZTQ1JFRU5JTkZPCTB4NDYwMgorI2RlZmluZSBGQklPR0VUQ01BUAkJMHg0NjA0CisjZGVmaW5lIEZCSU9QVVRDTUFQCQkweDQ2MDUKKyNkZWZpbmUgRkJJT1BBTl9ESVNQTEFZCQkweDQ2MDYKKyNkZWZpbmUgRkJJT19DVVJTT1IgICAgICAgICAgICBfSU9XUignRicsIDB4MDgsIHN0cnVjdCBmYl9jdXJzb3IpCisvKiAweDQ2MDctMHg0NjBCIGFyZSBkZWZpbmVkIGJlbG93ICovCisvKiAjZGVmaW5lIEZCSU9HRVRfTU9OSVRPUlNQRUMJMHg0NjBDICovCisvKiAjZGVmaW5lIEZCSU9QVVRfTU9OSVRPUlNQRUMJMHg0NjBEICovCisvKiAjZGVmaW5lIEZCSU9TV0lUQ0hfTU9OSUJJVAkweDQ2MEUgKi8KKyNkZWZpbmUgRkJJT0dFVF9DT04yRkJNQVAJMHg0NjBGCisjZGVmaW5lIEZCSU9QVVRfQ09OMkZCTUFQCTB4NDYxMAorI2RlZmluZSBGQklPQkxBTksJCTB4NDYxMQkJLyogYXJnOiAwIG9yIHZlc2EgbGV2ZWwgKyAxICovCisjZGVmaW5lIEZCSU9HRVRfVkJMQU5LCQlfSU9SKCdGJywgMHgxMiwgc3RydWN0IGZiX3ZibGFuaykKKyNkZWZpbmUgRkJJT19BTExPQyAgICAgICAgICAgICAgMHg0NjEzCisjZGVmaW5lIEZCSU9fRlJFRSAgICAgICAgICAgICAgIDB4NDYxNAorI2RlZmluZSBGQklPR0VUX0dMWVBIICAgICAgICAgICAweDQ2MTUKKyNkZWZpbmUgRkJJT0dFVF9IV0NJTkZPICAgICAgICAgMHg0NjE2CisjZGVmaW5lIEZCSU9QVVRfTU9ERUlORk8gICAgICAgIDB4NDYxNworI2RlZmluZSBGQklPR0VUX0RJU1BJTkZPICAgICAgICAweDQ2MTgKKworCisjZGVmaW5lIEZCX1RZUEVfUEFDS0VEX1BJWEVMUwkJMAkvKiBQYWNrZWQgUGl4ZWxzCSovCisjZGVmaW5lIEZCX1RZUEVfUExBTkVTCQkJMQkvKiBOb24gaW50ZXJsZWF2ZWQgcGxhbmVzICovCisjZGVmaW5lIEZCX1RZUEVfSU5URVJMRUFWRURfUExBTkVTCTIJLyogSW50ZXJsZWF2ZWQgcGxhbmVzCSovCisjZGVmaW5lIEZCX1RZUEVfVEVYVAkJCTMJLyogVGV4dC9hdHRyaWJ1dGVzCSovCisjZGVmaW5lIEZCX1RZUEVfVkdBX1BMQU5FUwkJNAkvKiBFR0EvVkdBIHBsYW5lcwkqLworCisjZGVmaW5lIEZCX0FVWF9URVhUX01EQQkJMAkvKiBNb25vY2hyb21lIHRleHQgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfQ0dBCQkxCS8qIENHQS9FR0EvVkdBIENvbG9yIHRleHQgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfUzNfTU1JTwkyCS8qIFMzIE1NSU8gZmFzdHRleHQgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfTUdBX1NURVAxNgkzCS8qIE1HQSBNaWxsZW5pdW0gSTogdGV4dCwgYXR0ciwgMTQgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfTUdBX1NURVA4CTQJLyogb3RoZXIgTUdBczogICAgICB0ZXh0LCBhdHRyLCAgNiByZXNlcnZlZCBieXRlcyAqLworI2RlZmluZSBGQl9BVVhfVEVYVF9TVkdBX0dST1VQCTgJLyogOC0xNTogU1ZHQSB0aWxlYmxpdCBjb21wYXRpYmxlIG1vZGVzICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfTUFTSwk3CS8qIGxvd2VyIHRocmVlIGJpdHMgc2F5cyBzdGVwICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfU1RFUDIJOAkvKiBTVkdBIHRleHQgbW9kZTogIHRleHQsIGF0dHIgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9TVEVQNAk5CS8qIFNWR0EgdGV4dCBtb2RlOiAgdGV4dCwgYXR0ciwgIDIgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9TVEVQOAkxMAkvKiBTVkdBIHRleHQgbW9kZTogIHRleHQsIGF0dHIsICA2IHJlc2VydmVkIGJ5dGVzICovCisjZGVmaW5lIEZCX0FVWF9URVhUX1NWR0FfU1RFUDE2CTExCS8qIFNWR0EgdGV4dCBtb2RlOiAgdGV4dCwgYXR0ciwgMTQgcmVzZXJ2ZWQgYnl0ZXMgKi8KKyNkZWZpbmUgRkJfQVVYX1RFWFRfU1ZHQV9MQVNUCTE1CS8qIHJlc2VydmVkIHVwIHRvIDE1ICovCisKKyNkZWZpbmUgRkJfQVVYX1ZHQV9QTEFORVNfVkdBNAkJMAkvKiAxNiBjb2xvciBwbGFuZXMgKEVHQS9WR0EpICovCisjZGVmaW5lIEZCX0FVWF9WR0FfUExBTkVTX0NGQjQJCTEJLyogQ0ZCNCBpbiBwbGFuZXMgKFZHQSkgKi8KKyNkZWZpbmUgRkJfQVVYX1ZHQV9QTEFORVNfQ0ZCOAkJMgkvKiBDRkI4IGluIHBsYW5lcyAoVkdBKSAqLworCisjZGVmaW5lIEZCX1ZJU1VBTF9NT05PMDEJCTAJLyogTW9ub2Noci4gMT1CbGFjayAwPVdoaXRlICovCisjZGVmaW5lIEZCX1ZJU1VBTF9NT05PMTAJCTEJLyogTW9ub2Noci4gMT1XaGl0ZSAwPUJsYWNrICovCisjZGVmaW5lIEZCX1ZJU1VBTF9UUlVFQ09MT1IJCTIJLyogVHJ1ZSBjb2xvcgkqLworI2RlZmluZSBGQl9WSVNVQUxfUFNFVURPQ09MT1IJCTMJLyogUHNldWRvIGNvbG9yIChsaWtlIGF0YXJpKSAqLworI2RlZmluZSBGQl9WSVNVQUxfRElSRUNUQ09MT1IJCTQJLyogRGlyZWN0IGNvbG9yICovCisjZGVmaW5lIEZCX1ZJU1VBTF9TVEFUSUNfUFNFVURPQ09MT1IJNQkvKiBQc2V1ZG8gY29sb3IgcmVhZG9ubHkgKi8KKworI2RlZmluZSBGQl9BQ0NFTF9OT05FCQkwCS8qIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9yCSovCisjZGVmaW5lIEZCX0FDQ0VMX0FUQVJJQkxJVFQJMQkvKiBBdGFyaSBCbGl0dGVyCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BTUlHQUJMSVRUCTIJLyogQW1pZ2EgQmxpdHRlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TM19UUklPNjQJMwkvKiBDeWJlcnZpc2lvbjY0IChTMyBUcmlvNjQpICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05DUl83N0MzMkJMVAk0CS8qIFJldGluYVozIChOQ1IgNzdDMzJCTFQpICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUzNfVklSR0UJNQkvKiBDeWJlcnZpc2lvbjY0LzNEIChTMyBWaVJHRSkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX01BQ0g2NEdYCTYJLyogQVRJIE1hY2ggNjRHWCBmYW1pbHkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0RFQ19UR0EJNwkvKiBERUMgMjEwMzAgVEdBCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfTUFDSDY0Q1QJOAkvKiBBVEkgTWFjaCA2NENUIGZhbWlseQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX01BQ0g2NFZUCTkJLyogQVRJIE1hY2ggNjRDVCBmYW1pbHkgVlQgY2xhc3MgKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX01BQ0g2NEdUCTEwCS8qIEFUSSBNYWNoIDY0Q1QgZmFtaWx5IEdUIGNsYXNzICovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9DUkVBVE9SCTExCS8qIFN1biBDcmVhdG9yL0NyZWF0b3IzRAkqLworI2RlZmluZSBGQl9BQ0NFTF9TVU5fQ0dTSVgJMTIJLyogU3VuIGNnNgkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9MRU8JMTMJLyogU3VuIGxlby96eAkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0lNU19UV0lOVFVSQk8JMTQJLyogSU1TIFR3aW4gVHVyYm8JCSovCisjZGVmaW5lIEZCX0FDQ0VMXzNETEFCU19QRVJNRURJQTIgMTUJLyogM0RsYWJzIFBlcm1lZGlhIDIJCSovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0EyMDY0VyAxNgkvKiBNYXRyb3ggTUdBMjA2NFcgKE1pbGxlbml1bSkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQTEwNjRTRyAxNwkvKiBNYXRyb3ggTUdBMTA2NFNHIChNeXN0aXF1ZSkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTUFUUk9YX01HQTIxNjRXIDE4CS8qIE1hdHJveCBNR0EyMTY0VyAoTWlsbGVuaXVtIElJKSAqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBMjE2NFdfQUdQIDE5CS8qIE1hdHJveCBNR0EyMTY0VyAoTWlsbGVuaXVtIElJKSAqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzEwMAkyMAkvKiBNYXRyb3ggRzEwMCAoUHJvZHVjdGl2YSBHMTAwKSAqLworI2RlZmluZSBGQl9BQ0NFTF9NQVRST1hfTUdBRzIwMAkyMQkvKiBNYXRyb3ggRzIwMCAoTXlzdCwgTWlsbCwgLi4uKSAqLworI2RlZmluZSBGQl9BQ0NFTF9TVU5fQ0cxNAkyMgkvKiBTdW4gY2dmb3VydGVlbgkJICovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9CV1RXTwkyMwkvKiBTdW4gYnd0d28JCQkqLworI2RlZmluZSBGQl9BQ0NFTF9TVU5fQ0dUSFJFRQkyNAkvKiBTdW4gY2d0aHJlZQkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NVTl9UQ1gJMjUJLyogU3VuIHRjeAkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX01BVFJPWF9NR0FHNDAwCTI2CS8qIE1hdHJveCBHNDAwCQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlYzCQkyNwkvKiBuVmlkaWEgUklWQSAxMjggICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WNAkJMjgJLyogblZpZGlhIFJJVkEgVE5UCQkqLworI2RlZmluZSBGQl9BQ0NFTF9OVjUJCTI5CS8qIG5WaWRpYSBSSVZBIFROVDIJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0NUXzY1NTV4CTMwCS8qIEMmVCA2NTU1eAkJCSovCisjZGVmaW5lIEZCX0FDQ0VMXzNERlhfQkFOU0hFRQkzMQkvKiAzRGZ4IEJhbnNoZWUJCQkqLworI2RlZmluZSBGQl9BQ0NFTF9BVElfUkFHRTEyOAkzMgkvKiBBVEkgUmFnZTEyOCBmYW1pbHkJCSovCisjZGVmaW5lIEZCX0FDQ0VMX0lHU19DWUJFUjIwMDAJMzMJLyogQ3liZXJQcm8gMjAwMAkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSUdTX0NZQkVSMjAxMAkzNAkvKiBDeWJlclBybyAyMDEwCQkqLworI2RlZmluZSBGQl9BQ0NFTF9JR1NfQ1lCRVI1MDAwCTM1CS8qIEN5YmVyUHJvIDUwMDAJCSovCisjZGVmaW5lIEZCX0FDQ0VMX1NJU19HTEFNT1VSICAgIDM2CS8qIFNpUyAzMDAvNjMwLzU0MCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfM0RMQUJTX1BFUk1FRElBMyAzNwkvKiAzRGxhYnMgUGVybWVkaWEgMwkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfQVRJX1JBREVPTgkzOAkvKiBBVEkgUmFkZW9uIGZhbWlseQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSTgxMCAgICAgICAgICAgMzkgICAgICAvKiBJbnRlbCA4MTAvODE1ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NJU19HTEFNT1VSXzIgIDQwCS8qIFNpUyAzMTUsIDY1MCwgNzQwCQkqLworI2RlZmluZSBGQl9BQ0NFTF9TSVNfWEFCUkUgICAgICA0MQkvKiBTaVMgMzMwICgiWGFicmUiKQkJKi8KKyNkZWZpbmUgRkJfQUNDRUxfSTgzMCAgICAgICAgICAgNDIgICAgICAvKiBJbnRlbCA4MzBNLzg0NUcvODV4Lzg2NUcgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WXzEwICAgICAgICAgIDQzICAgICAgLyogblZpZGlhIEFyY2ggMTAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9OVl8yMCAgICAgICAgICA0NCAgICAgIC8qIG5WaWRpYSBBcmNoIDIwICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfTlZfMzAgICAgICAgICAgNDUgICAgICAvKiBuVmlkaWEgQXJjaCAzMCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05WXzQwICAgICAgICAgIDQ2ICAgICAgLyogblZpZGlhIEFyY2ggNDAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1YJNDcJLyogWEdJIFZvbGFyaSBWM1hULCBWNSwgVjggICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9YR0lfVk9MQVJJX1oJNDgJLyogWEdJIFZvbGFyaSBaNyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9PTUFQMTYxMAk0OQkvKiBUSSBPTUFQMTZ4eCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA3MCA5MAkvKiBOZW9NYWdpYyBOTTIwNzAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MCA5MQkvKiBOZW9NYWdpYyBOTTIwOTAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5MyA5MgkvKiBOZW9NYWdpYyBOTTIwOTMgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjA5NyA5MwkvKiBOZW9NYWdpYyBOTTIwOTcgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjE2MCA5NAkvKiBOZW9NYWdpYyBOTTIxNjAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjIwMCA5NQkvKiBOZW9NYWdpYyBOTTIyMDAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjIzMCA5NgkvKiBOZW9NYWdpYyBOTTIyMzAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjM2MCA5NwkvKiBOZW9NYWdpYyBOTTIzNjAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX05FT01BR0lDX05NMjM4MCA5OAkvKiBOZW9NYWdpYyBOTTIzODAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFNCAgICAgICAgMHg4MAkvKiBTMyBTYXZhZ2U0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRTNEICAgICAgIDB4ODEJLyogUzMgU2F2YWdlM0QgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0UzRF9NViAgICAweDgyCS8qIFMzIFNhdmFnZTNELU1WICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFMjAwMCAgICAgMHg4MwkvKiBTMyBTYXZhZ2UyMDAwICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRV9NWF9NViAgIDB4ODQJLyogUzMgU2F2YWdlL01YLU1WICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TQVZBR0VfTVggICAgICAweDg1CS8qIFMzIFNhdmFnZS9NWCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU0FWQUdFX0lYX01WICAgMHg4NgkvKiBTMyBTYXZhZ2UvSVgtTVYgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1NBVkFHRV9JWCAgICAgIDB4ODcJLyogUzMgU2F2YWdlL0lYICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9QUk9TQVZBR0VfUE0gICAweDg4CS8qIFMzIFByb1NhdmFnZSBQTTEzMyAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfUFJPU0FWQUdFX0tNICAgMHg4OQkvKiBTMyBQcm9TYXZhZ2UgS00xMzMgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1MzVFdJU1RFUl9QICAgIDB4OGEJLyogUzMgVHdpc3RlciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9TM1RXSVNURVJfSyAgICAweDhiCS8qIFMzIFR3aXN0ZXJLICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkJfQUNDRUxfU1VQRVJTQVZBR0UgICAgMHg4YyAgICAvKiBTMyBTdXBlcnNhdmFnZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX1BST1NBVkFHRV9ERFIgIDB4OGQJLyogUzMgUHJvU2F2YWdlIEREUiAgICAgICAgICAgICAqLworI2RlZmluZSBGQl9BQ0NFTF9QUk9TQVZBR0VfRERSSyAweDhlCS8qIFMzIFByb1NhdmFnZSBERFItSyAgICAgICAgICAgKi8KKworc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHsKKwljaGFyIGlkWzE2XTsJCQkvKiBpZGVudGlmaWNhdGlvbiBzdHJpbmcgZWcgIlRUIEJ1aWx0aW4iICovCisJdW5zaWduZWQgbG9uZyBzbWVtX3N0YXJ0OwkvKiBTdGFydCBvZiBmcmFtZSBidWZmZXIgbWVtICovCisJCQkJCS8qIChwaHlzaWNhbCBhZGRyZXNzKSAqLworCV9fdTMyIHNtZW1fbGVuOwkJCS8qIExlbmd0aCBvZiBmcmFtZSBidWZmZXIgbWVtICovCisJX191MzIgdHlwZTsJCQkvKiBzZWUgRkJfVFlQRV8qCQkqLworCV9fdTMyIHR5cGVfYXV4OwkJCS8qIEludGVybGVhdmUgZm9yIGludGVybGVhdmVkIFBsYW5lcyAqLworCV9fdTMyIHZpc3VhbDsJCQkvKiBzZWUgRkJfVklTVUFMXyoJCSovIAorCV9fdTE2IHhwYW5zdGVwOwkJCS8qIHplcm8gaWYgbm8gaGFyZHdhcmUgcGFubmluZyAgKi8KKwlfX3UxNiB5cGFuc3RlcDsJCQkvKiB6ZXJvIGlmIG5vIGhhcmR3YXJlIHBhbm5pbmcgICovCisJX191MTYgeXdyYXBzdGVwOwkJLyogemVybyBpZiBubyBoYXJkd2FyZSB5d3JhcCAgICAqLworCV9fdTMyIGxpbmVfbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGEgbGluZSBpbiBieXRlcyAgICAqLworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydDsJLyogU3RhcnQgb2YgTWVtb3J5IE1hcHBlZCBJL08gICAqLworCQkJCQkvKiAocGh5c2ljYWwgYWRkcmVzcykgKi8KKwlfX3UzMiBtbWlvX2xlbjsJCQkvKiBMZW5ndGggb2YgTWVtb3J5IE1hcHBlZCBJL08gICovCisJX191MzIgYWNjZWw7CQkJLyogSW5kaWNhdGUgdG8gZHJpdmVyIHdoaWNoCSovCisJCQkJCS8qICBzcGVjaWZpYyBjaGlwL2NhcmQgd2UgaGF2ZQkqLworCV9fdTE2IHJlc2VydmVkWzNdOwkJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5ICovCit9OworCisvKiBJbnRlcnByZXRhdGlvbiBvZiBvZmZzZXQgZm9yIGNvbG9yIGZpZWxkczogQWxsIG9mZnNldHMgYXJlIGZyb20gdGhlIHJpZ2h0LAorICogaW5zaWRlIGEgInBpeGVsIiB2YWx1ZSwgd2hpY2ggaXMgZXhhY3RseSAnYml0c19wZXJfcGl4ZWwnIHdpZGUgKG1lYW5zOiB5b3UKKyAqIGNhbiB1c2UgdGhlIG9mZnNldCBhcyByaWdodCBhcmd1bWVudCB0byA8PCkuIEEgcGl4ZWwgYWZ0ZXJ3YXJkcyBpcyBhIGJpdAorICogc3RyZWFtIGFuZCBpcyB3cml0dGVuIHRvIHZpZGVvIG1lbW9yeSBhcyB0aGF0IHVubW9kaWZpZWQuIFRoaXMgaW1wbGllcworICogYmlnLWVuZGlhbiBieXRlIG9yZGVyIGlmIGJpdHNfcGVyX3BpeGVsIGlzIGdyZWF0ZXIgdGhhbiA4LgorICovCitzdHJ1Y3QgZmJfYml0ZmllbGQgeworCV9fdTMyIG9mZnNldDsJCQkvKiBiZWdpbm5pbmcgb2YgYml0ZmllbGQJKi8KKwlfX3UzMiBsZW5ndGg7CQkJLyogbGVuZ3RoIG9mIGJpdGZpZWxkCQkqLworCV9fdTMyIG1zYl9yaWdodDsJCS8qICE9IDAgOiBNb3N0IHNpZ25pZmljYW50IGJpdCBpcyAqLyAKKwkJCQkJLyogcmlnaHQgKi8gCit9OworCisjZGVmaW5lIEZCX05PTlNURF9IQU0JCTEJLyogSG9sZC1BbmQtTW9kaWZ5IChIQU0pICAgICAgICAqLworI2RlZmluZSBGQl9OT05TVERfUkVWX1BJWF9JTl9CCTIJLyogb3JkZXIgb2YgcGl4ZWxzIGluIGVhY2ggYnl0ZSBpcyByZXZlcnNlZCAqLworCisjZGVmaW5lIEZCX0FDVElWQVRFX05PVwkJMAkvKiBzZXQgdmFsdWVzIGltbWVkaWF0ZWx5IChvciB2YmwpKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfTlhUT1BFTgkxCS8qIGFjdGl2YXRlIG9uIG5leHQgb3BlbgkqLworI2RlZmluZSBGQl9BQ1RJVkFURV9URVNUCTIJLyogZG9uJ3Qgc2V0LCByb3VuZCB1cCBpbXBvc3NpYmxlICovCisjZGVmaW5lIEZCX0FDVElWQVRFX01BU0sgICAgICAgMTUKKwkJCQkJLyogdmFsdWVzCQkJKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfVkJMCSAgICAgICAxNgkvKiBhY3RpdmF0ZSB2YWx1ZXMgb24gbmV4dCB2YmwgICovCisjZGVmaW5lIEZCX0NIQU5HRV9DTUFQX1ZCTCAgICAgMzIJLyogY2hhbmdlIGNvbG9ybWFwIG9uIHZibAkqLworI2RlZmluZSBGQl9BQ1RJVkFURV9BTEwJICAgICAgIDY0CS8qIGNoYW5nZSBhbGwgVkNzIG9uIHRoaXMgZmIJKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfRk9SQ0UgICAgIDEyOAkvKiBmb3JjZSBhcHBseSBldmVuIHdoZW4gbm8gY2hhbmdlKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfSU5WX01PREUgIDI1NiAgICAgICAvKiBpbnZhbGlkYXRlIHZpZGVvbW9kZSAqLworCisjZGVmaW5lIEZCX0FDQ0VMRl9URVhUCQkxCS8qIChPQlNPTEVURSkgc2VlIGZiX2luZm8uZmxhZ3MgYW5kIHZjX21vZGUgKi8KKworI2RlZmluZSBGQl9TWU5DX0hPUl9ISUdIX0FDVAkxCS8qIGhvcml6b250YWwgc3luYyBoaWdoIGFjdGl2ZQkqLworI2RlZmluZSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QJMgkvKiB2ZXJ0aWNhbCBzeW5jIGhpZ2ggYWN0aXZlCSovCisjZGVmaW5lIEZCX1NZTkNfRVhUCQk0CS8qIGV4dGVybmFsIHN5bmMJCSovCisjZGVmaW5lIEZCX1NZTkNfQ09NUF9ISUdIX0FDVAk4CS8qIGNvbXBvc2l0ZSBzeW5jIGhpZ2ggYWN0aXZlICAgKi8KKyNkZWZpbmUgRkJfU1lOQ19CUk9BRENBU1QJMTYJLyogYnJvYWRjYXN0IHZpZGVvIHRpbWluZ3MgICAgICAqLworCQkJCQkvKiB2dG90YWwgPSAxNDRkLzI4OG4vNTc2aSA9PiBQQUwgICovCisJCQkJCS8qIHZ0b3RhbCA9IDEyMWQvMjQybi80ODRpID0+IE5UU0MgKi8KKyNkZWZpbmUgRkJfU1lOQ19PTl9HUkVFTgkzMgkvKiBzeW5jIG9uIGdyZWVuICovCisKKyNkZWZpbmUgRkJfVk1PREVfTk9OSU5URVJMQUNFRCAgMAkvKiBub24gaW50ZXJsYWNlZCAqLworI2RlZmluZSBGQl9WTU9ERV9JTlRFUkxBQ0VECTEJLyogaW50ZXJsYWNlZAkqLworI2RlZmluZSBGQl9WTU9ERV9ET1VCTEUJCTIJLyogZG91YmxlIHNjYW4gKi8KKyNkZWZpbmUgRkJfVk1PREVfT0REX0ZMRF9GSVJTVAk0CS8qIGludGVybGFjZWQ6IHRvcCBsaW5lIGZpcnN0ICovCisjZGVmaW5lIEZCX1ZNT0RFX01BU0sJCTI1NQorCisjZGVmaW5lIEZCX1ZNT0RFX1lXUkFQCQkyNTYJLyogeXdyYXAgaW5zdGVhZCBvZiBwYW5uaW5nICAgICAqLworI2RlZmluZSBGQl9WTU9ERV9TTU9PVEhfWFBBTgk1MTIJLyogc21vb3RoIHhwYW4gcG9zc2libGUgKGludGVybmFsbHkgdXNlZCkgKi8KKyNkZWZpbmUgRkJfVk1PREVfQ09OVVBEQVRFCTUxMgkvKiBkb24ndCB1cGRhdGUgeC95b2Zmc2V0CSovCisKKy8qCisgKiBEaXNwbGF5IHJvdGF0aW9uIHN1cHBvcnQKKyAqLworI2RlZmluZSBGQl9ST1RBVEVfVVIgICAgICAwCisjZGVmaW5lIEZCX1JPVEFURV9DVyAgICAgIDEKKyNkZWZpbmUgRkJfUk9UQVRFX1VEICAgICAgMgorI2RlZmluZSBGQl9ST1RBVEVfQ0NXICAgICAzCisKKyNkZWZpbmUgUElDT1MyS0haKGEpICgxMDAwMDAwMDAwVUwvKGEpKQorI2RlZmluZSBLSFoyUElDT1MoYSkgKDEwMDAwMDAwMDBVTC8oYSkpCisKK3N0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB7CisJX191MzIgeHJlczsJCQkvKiB2aXNpYmxlIHJlc29sdXRpb24JCSovCisJX191MzIgeXJlczsKKwlfX3UzMiB4cmVzX3ZpcnR1YWw7CQkvKiB2aXJ0dWFsIHJlc29sdXRpb24JCSovCisJX191MzIgeXJlc192aXJ0dWFsOworCV9fdTMyIHhvZmZzZXQ7CQkJLyogb2Zmc2V0IGZyb20gdmlydHVhbCB0byB2aXNpYmxlICovCisJX191MzIgeW9mZnNldDsJCQkvKiByZXNvbHV0aW9uCQkJKi8KKworCV9fdTMyIGJpdHNfcGVyX3BpeGVsOwkJLyogZ3Vlc3Mgd2hhdAkJCSovCisJX191MzIgZ3JheXNjYWxlOwkJLyogIT0gMCBHcmF5bGV2ZWxzIGluc3RlYWQgb2YgY29sb3JzICovCisKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkOwkJLyogYml0ZmllbGQgaW4gZmIgbWVtIGlmIHRydWUgY29sb3IsICovCisJc3RydWN0IGZiX2JpdGZpZWxkIGdyZWVuOwkvKiBlbHNlIG9ubHkgbGVuZ3RoIGlzIHNpZ25pZmljYW50ICovCisJc3RydWN0IGZiX2JpdGZpZWxkIGJsdWU7CisJc3RydWN0IGZiX2JpdGZpZWxkIHRyYW5zcDsJLyogdHJhbnNwYXJlbmN5CQkJKi8JCisKKwlfX3UzMiBub25zdGQ7CQkJLyogIT0gMCBOb24gc3RhbmRhcmQgcGl4ZWwgZm9ybWF0ICovCisKKwlfX3UzMiBhY3RpdmF0ZTsJCQkvKiBzZWUgRkJfQUNUSVZBVEVfKgkJKi8KKworCV9fdTMyIGhlaWdodDsJCQkvKiBoZWlnaHQgb2YgcGljdHVyZSBpbiBtbSAgICAqLworCV9fdTMyIHdpZHRoOwkJCS8qIHdpZHRoIG9mIHBpY3R1cmUgaW4gbW0gICAgICovCisKKwlfX3UzMiBhY2NlbF9mbGFnczsJCS8qIChPQlNPTEVURSkgc2VlIGZiX2luZm8uZmxhZ3MgKi8KKworCS8qIFRpbWluZzogQWxsIHZhbHVlcyBpbiBwaXhjbG9ja3MsIGV4Y2VwdCBwaXhjbG9jayAob2YgY291cnNlKSAqLworCV9fdTMyIHBpeGNsb2NrOwkJCS8qIHBpeGVsIGNsb2NrIGluIHBzIChwaWNvIHNlY29uZHMpICovCisJX191MzIgbGVmdF9tYXJnaW47CQkvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlCSovCisJX191MzIgcmlnaHRfbWFyZ2luOwkJLyogdGltZSBmcm9tIHBpY3R1cmUgdG8gc3luYwkqLworCV9fdTMyIHVwcGVyX21hcmdpbjsJCS8qIHRpbWUgZnJvbSBzeW5jIHRvIHBpY3R1cmUJKi8KKwlfX3UzMiBsb3dlcl9tYXJnaW47CisJX191MzIgaHN5bmNfbGVuOwkJLyogbGVuZ3RoIG9mIGhvcml6b250YWwgc3luYwkqLworCV9fdTMyIHZzeW5jX2xlbjsJCS8qIGxlbmd0aCBvZiB2ZXJ0aWNhbCBzeW5jCSovCisJX191MzIgc3luYzsJCQkvKiBzZWUgRkJfU1lOQ18qCQkqLworCV9fdTMyIHZtb2RlOwkJCS8qIHNlZSBGQl9WTU9ERV8qCQkqLworCV9fdTMyIHJvdGF0ZTsJCQkvKiBhbmdsZSB3ZSByb3RhdGUgY291bnRlciBjbG9ja3dpc2UgKi8KKwlfX3UzMiByZXNlcnZlZFs1XTsJCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworfTsKKworc3RydWN0IGZiX2NtYXAgeworCV9fdTMyIHN0YXJ0OwkJCS8qIEZpcnN0IGVudHJ5CSovCisJX191MzIgbGVuOwkJCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJX191MTYgKnJlZDsJCQkvKiBSZWQgdmFsdWVzCSovCisJX191MTYgKmdyZWVuOworCV9fdTE2ICpibHVlOworCV9fdTE2ICp0cmFuc3A7CQkJLyogdHJhbnNwYXJlbmN5LCBjYW4gYmUgTlVMTCAqLworfTsKKworc3RydWN0IGZiX2NvbjJmYm1hcCB7CisJX191MzIgY29uc29sZTsKKwlfX3UzMiBmcmFtZWJ1ZmZlcjsKK307CisKKy8qIFZFU0EgQmxhbmtpbmcgTGV2ZWxzICovCisjZGVmaW5lIFZFU0FfTk9fQkxBTktJTkcgICAgICAgIDAKKyNkZWZpbmUgVkVTQV9WU1lOQ19TVVNQRU5EICAgICAgMQorI2RlZmluZSBWRVNBX0hTWU5DX1NVU1BFTkQgICAgICAyCisjZGVmaW5lIFZFU0FfUE9XRVJET1dOICAgICAgICAgIDMKKworCitlbnVtIHsKKwkvKiBzY3JlZW46IHVuYmxhbmtlZCwgaHN5bmM6IG9uLCAgdnN5bmM6IG9uICovCisJRkJfQkxBTktfVU5CTEFOSyAgICAgICA9IFZFU0FfTk9fQkxBTktJTkcsCisKKwkvKiBzY3JlZW46IGJsYW5rZWQsICAgaHN5bmM6IG9uLCAgdnN5bmM6IG9uICovCisJRkJfQkxBTktfTk9STUFMICAgICAgICA9IFZFU0FfTk9fQkxBTktJTkcgKyAxLAorCisJLyogc2NyZWVuOiBibGFua2VkLCAgIGhzeW5jOiBvbiwgIHZzeW5jOiBvZmYgKi8KKwlGQl9CTEFOS19WU1lOQ19TVVNQRU5EID0gVkVTQV9WU1lOQ19TVVNQRU5EICsgMSwKKworCS8qIHNjcmVlbjogYmxhbmtlZCwgICBoc3luYzogb2ZmLCB2c3luYzogb24gKi8KKwlGQl9CTEFOS19IU1lOQ19TVVNQRU5EID0gVkVTQV9IU1lOQ19TVVNQRU5EICsgMSwKKworCS8qIHNjcmVlbjogYmxhbmtlZCwgICBoc3luYzogb2ZmLCB2c3luYzogb2ZmICovCisJRkJfQkxBTktfUE9XRVJET1dOICAgICA9IFZFU0FfUE9XRVJET1dOICsgMQorfTsKKworI2RlZmluZSBGQl9WQkxBTktfVkJMQU5LSU5HCTB4MDAxCS8qIGN1cnJlbnRseSBpbiBhIHZlcnRpY2FsIGJsYW5rICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQkxBTktJTkcJMHgwMDIJLyogY3VycmVudGx5IGluIGEgaG9yaXpvbnRhbCBibGFuayAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9WQkxBTksJMHgwMDQJLyogdmVydGljYWwgYmxhbmtzIGNhbiBiZSBkZXRlY3RlZCAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9IQkxBTksJMHgwMDgJLyogaG9yaXpvbnRhbCBibGFua3MgY2FuIGJlIGRldGVjdGVkICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQVZFX0NPVU5UCTB4MDEwCS8qIGdsb2JhbCByZXRyYWNlIGNvdW50ZXIgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQVZFX1ZDT1VOVAkweDAyMAkvKiB0aGUgdmNvdW50IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIEZCX1ZCTEFOS19IQVZFX0hDT1VOVAkweDA0MAkvKiB0aGUgaGNvdW50IGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIEZCX1ZCTEFOS19WU1lOQ0lORwkweDA4MAkvKiBjdXJyZW50bHkgaW4gYSB2c3luYyAqLworI2RlZmluZSBGQl9WQkxBTktfSEFWRV9WU1lOQwkweDEwMAkvKiB2ZXJpY2FsIHN5bmNzIGNhbiBiZSBkZXRlY3RlZCAqLworCitzdHJ1Y3QgZmJfdmJsYW5rIHsKKwlfX3UzMiBmbGFnczsJCQkvKiBGQl9WQkxBTksgZmxhZ3MgKi8KKwlfX3UzMiBjb3VudDsJCQkvKiBjb3VudGVyIG9mIHJldHJhY2VzIHNpbmNlIGJvb3QgKi8KKwlfX3UzMiB2Y291bnQ7CQkJLyogY3VycmVudCBzY2FubGluZSBwb3NpdGlvbiAqLworCV9fdTMyIGhjb3VudDsJCQkvKiBjdXJyZW50IHNjYW5kb3QgcG9zaXRpb24gKi8KKwlfX3UzMiByZXNlcnZlZFs0XTsJCS8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eSAqLworfTsKKworLyogSW50ZXJuYWwgSFcgYWNjZWwgKi8KKyNkZWZpbmUgUk9QX0NPUFkgMAorI2RlZmluZSBST1BfWE9SICAxCisKK3N0cnVjdCBmYl9jb3B5YXJlYSB7CisJX191MzIgZHg7CisJX191MzIgZHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIHN4OworCV9fdTMyIHN5OworfTsKKworc3RydWN0IGZiX2ZpbGxyZWN0IHsKKwlfX3UzMiBkeDsJLyogc2NyZWVuLXJlbGF0aXZlICovCisJX191MzIgZHk7CisJX191MzIgd2lkdGg7CisJX191MzIgaGVpZ2h0OworCV9fdTMyIGNvbG9yOworCV9fdTMyIHJvcDsKK307CisKK3N0cnVjdCBmYl9pbWFnZSB7CisJX191MzIgZHg7CQkvKiBXaGVyZSB0byBwbGFjZSBpbWFnZSAqLworCV9fdTMyIGR5OworCV9fdTMyIHdpZHRoOwkJLyogU2l6ZSBvZiBpbWFnZSAqLworCV9fdTMyIGhlaWdodDsKKwlfX3UzMiBmZ19jb2xvcjsJCS8qIE9ubHkgdXNlZCB3aGVuIGEgbW9ubyBiaXRtYXAgKi8KKwlfX3UzMiBiZ19jb2xvcjsKKwlfX3U4ICBkZXB0aDsJCS8qIERlcHRoIG9mIHRoZSBpbWFnZSAqLworCWNvbnN0IGNoYXIgKmRhdGE7CS8qIFBvaW50ZXIgdG8gaW1hZ2UgZGF0YSAqLworCXN0cnVjdCBmYl9jbWFwIGNtYXA7CS8qIGNvbG9yIG1hcCBpbmZvICovCit9OworCisvKgorICogaGFyZHdhcmUgY3Vyc29yIGNvbnRyb2wKKyAqLworCisjZGVmaW5lIEZCX0NVUl9TRVRJTUFHRSAweDAxCisjZGVmaW5lIEZCX0NVUl9TRVRQT1MgICAweDAyCisjZGVmaW5lIEZCX0NVUl9TRVRIT1QgICAweDA0CisjZGVmaW5lIEZCX0NVUl9TRVRDTUFQICAweDA4CisjZGVmaW5lIEZCX0NVUl9TRVRTSEFQRSAweDEwCisjZGVmaW5lIEZCX0NVUl9TRVRTSVpFCTB4MjAKKyNkZWZpbmUgRkJfQ1VSX1NFVEFMTCAgIDB4RkYKKworc3RydWN0IGZiY3VycG9zIHsKKwlfX3UxNiB4LCB5OworfTsKKworc3RydWN0IGZiX2N1cnNvciB7CisJX191MTYgc2V0OwkJLyogd2hhdCB0byBzZXQgKi8KKwlfX3UxNiBlbmFibGU7CQkvKiBjdXJzb3Igb24vb2ZmICovCisJX191MTYgcm9wOwkJLyogYml0b3Agb3BlcmF0aW9uICovCisJY29uc3QgY2hhciAqbWFzazsJLyogY3Vyc29yIG1hc2sgYml0cyAqLworCXN0cnVjdCBmYmN1cnBvcyBob3Q7CS8qIGN1cnNvciBob3Qgc3BvdCAqLworCXN0cnVjdCBmYl9pbWFnZQlpbWFnZTsJLyogQ3Vyc29yIGltYWdlICovCit9OworCisjaWZkZWYgQ09ORklHX0ZCX0JBQ0tMSUdIVAorLyogU2V0dGluZ3MgZm9yIHRoZSBnZW5lcmljIGJhY2tsaWdodCBjb2RlICovCisjZGVmaW5lIEZCX0JBQ0tMSUdIVF9MRVZFTFMJMTI4CisjZGVmaW5lIEZCX0JBQ0tMSUdIVF9NQVgJMHhGRgorI2VuZGlmCisKKworI2VuZGlmIC8qIF9MSU5VWF9GQl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZjbnRsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjZDM2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmNudGwuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIF9MSU5VWF9GQ05UTF9ICisjZGVmaW5lIF9MSU5VWF9GQ05UTF9ICisKKyNpbmNsdWRlIDxhc20vZmNudGwuaD4KKworI2RlZmluZSBGX1NFVExFQVNFCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyAwKQorI2RlZmluZSBGX0dFVExFQVNFCShGX0xJTlVYX1NQRUNJRklDX0JBU0UgKyAxKQorCisvKgorICogQ2FuY2VsIGEgYmxvY2tpbmcgcG9zaXggbG9jazsgaW50ZXJuYWwgdXNlIG9ubHkgdW50aWwgd2UgZXhwb3NlIGFuCisgKiBhc3luY2hyb25vdXMgbG9jayBhcGkgdG8gdXNlcnNwYWNlOgorICovCisjZGVmaW5lIEZfQ0FOQ0VMTEsJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSArIDUpCisKKy8qIENyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciB3aXRoIEZEX0NMT0VYRUMgc2V0LiAqLworI2RlZmluZSBGX0RVUEZEX0NMT0VYRUMJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSArIDYpCisKKy8qCisgKiBSZXF1ZXN0IG5vZmljYXRpb25zIG9uIGEgZGlyZWN0b3J5LgorICogU2VlIGJlbG93IGZvciBldmVudHMgdGhhdCBtYXkgYmUgbm90aWZpZWQuCisgKi8KKyNkZWZpbmUgRl9OT1RJRlkJKEZfTElOVVhfU1BFQ0lGSUNfQkFTRSsyKQorCisvKgorICogVHlwZXMgb2YgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgdGhhdCBtYXkgYmUgcmVxdWVzdGVkLgorICovCisjZGVmaW5lIEROX0FDQ0VTUwkweDAwMDAwMDAxCS8qIEZpbGUgYWNjZXNzZWQgKi8KKyNkZWZpbmUgRE5fTU9ESUZZCTB4MDAwMDAwMDIJLyogRmlsZSBtb2RpZmllZCAqLworI2RlZmluZSBETl9DUkVBVEUJMHgwMDAwMDAwNAkvKiBGaWxlIGNyZWF0ZWQgKi8KKyNkZWZpbmUgRE5fREVMRVRFCTB4MDAwMDAwMDgJLyogRmlsZSByZW1vdmVkICovCisjZGVmaW5lIEROX1JFTkFNRQkweDAwMDAwMDEwCS8qIEZpbGUgcmVuYW1lZCAqLworI2RlZmluZSBETl9BVFRSSUIJMHgwMDAwMDAyMAkvKiBGaWxlIGNoYW5nZWQgYXR0aWJ1dGVzICovCisjZGVmaW5lIEROX01VTFRJU0hPVAkweDgwMDAwMDAwCS8qIERvbid0IHJlbW92ZSBub3RpZmllciAqLworCisjZGVmaW5lIEFUX0ZEQ1dECQktMTAwICAgIC8qIFNwZWNpYWwgdmFsdWUgdXNlZCB0byBpbmRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5hdCBzaG91bGQgdXNlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyBkaXJlY3RvcnkuICovCisjZGVmaW5lIEFUX1NZTUxJTktfTk9GT0xMT1cJMHgxMDAgICAvKiBEbyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KKyNkZWZpbmUgQVRfUkVNT1ZFRElSCQkweDIwMCAgIC8qIFJlbW92ZSBkaXJlY3RvcnkgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlua2luZyBmaWxlLiAgKi8KKyNkZWZpbmUgQVRfU1lNTElOS19GT0xMT1cJMHg0MDAgICAvKiBGb2xsb3cgc3ltYm9saWMgbGlua3MuICAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYmQwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkLmgKQEAgLTAsMCArMSwzNzMgQEAKKyNpZm5kZWYgX0xJTlVYX0ZEX0gKKyNkZWZpbmUgX0xJTlVYX0ZEX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIE5ldyBmaWxlIGxheW91dDogTm93IHRoZSBpb2N0bCBkZWZpbml0aW9ucyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlCisgKiBkZWZpbml0aW9ucyBvZiB0aGUgc3RydWN0dXJlcyB0aGF0IHRoZXkgdXNlICovCisKKy8qCisgKiBHZW9tZXRyeQorICovCitzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7CisJdW5zaWduZWQgaW50CXNpemUsCQkvKiBuciBvZiBzZWN0b3JzIHRvdGFsICovCisJCQlzZWN0LAkJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLworCQkJdHJhY2ssCQkvKiBuciBvZiB0cmFja3MgKi8KKwkJCXN0cmV0Y2g7CS8qICE9MCBtZWFucyBkb3VibGUgdHJhY2sgc3RlcHMgKi8KKyNkZWZpbmUgRkRfU1RSRVRDSCAxCisjZGVmaW5lIEZEX1NXQVBTSURFUyAyCisjZGVmaW5lIEZEX1pFUk9CQVNFRCA0CisKKwl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLworCisJCQlyYXRlLAkJLyogZGF0YSByYXRlLiB8PSAweDQwIGZvciBwZXJwZW5kaWN1bGFyICovCisjZGVmaW5lIEZEXzJNIDB4NAorI2RlZmluZSBGRF9TSVpFQ09ERU1BU0sgMHgzOAorI2RlZmluZSBGRF9TSVpFQ09ERShmbG9wcHkpICgoKCgoZmxvcHB5KS0+cmF0ZSZGRF9TSVpFQ09ERU1BU0spPj4gMykrIDIpICU4KQorI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKKwkJCSAgICAgNTEyIDogMTI4IDw8IEZEX1NJWkVDT0RFKGZsb3BweSkgKQorI2RlZmluZSBGRF9QRVJQIDB4NDAKKworCQkJc3BlYzEsCQkvKiBzdGVwcGluZyByYXRlLCBoZWFkIHVubG9hZCB0aW1lICovCisJCQlmbXRfZ2FwOwkvKiBnYXAyIHNpemUgKi8KKwljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KK307CisKKworLyogY29tbWFuZHMgbmVlZGluZyB3cml0ZSBhY2Nlc3MgaGF2ZSAweDQwIHNldCAqLworLyogY29tbWFuZHMgbmVlZGluZyBzdXBlciB1c2VyIGFjY2VzcyBoYXZlIDB4ODAgc2V0ICovCisKKyNkZWZpbmUgRkRDTFJQUk0gX0lPKDIsIDB4NDEpCisvKiBjbGVhciB1c2VyLWRlZmluZWQgcGFyYW1ldGVycyAqLworCisjZGVmaW5lIEZEU0VUUFJNIF9JT1coMiwgMHg0Miwgc3RydWN0IGZsb3BweV9zdHJ1Y3QpIAorI2RlZmluZSBGRFNFVE1FRElBUFJNIEZEU0VUUFJNCisvKiBzZXQgdXNlci1kZWZpbmVkIHBhcmFtZXRlcnMgZm9yIGN1cnJlbnQgbWVkaWEgKi8KKworI2RlZmluZSBGRERFRlBSTSBfSU9XKDIsIDB4NDMsIHN0cnVjdCBmbG9wcHlfc3RydWN0KSAKKyNkZWZpbmUgRkRHRVRQUk0gX0lPUigyLCAweDA0LCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCkKKyNkZWZpbmUgRkRERUZNRURJQVBSTSBGRERFRlBSTQorI2RlZmluZSBGREdFVE1FRElBUFJNIEZER0VUUFJNCisvKiBzZXQvZ2V0IGRpc2sgcGFyYW1ldGVycyAqLworCisKKyNkZWZpbmUJRkRNU0dPTiAgX0lPKDIsMHg0NSkKKyNkZWZpbmUJRkRNU0dPRkYgX0lPKDIsMHg0NikKKy8qIGlzc3VlL2Rvbid0IGlzc3VlIGtlcm5lbCBtZXNzYWdlcyBvbiBtZWRpYSB0eXBlIGNoYW5nZSAqLworCisKKy8qIAorICogRm9ybWF0dGluZyAob2Jzb2xldGUpCisgKi8KKyNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KKworc3RydWN0IGZvcm1hdF9kZXNjciB7CisJdW5zaWduZWQgaW50IGRldmljZSxoZWFkLHRyYWNrOworfTsKKworI2RlZmluZSBGREZNVEJFRyBfSU8oMiwweDQ3KQorLyogYmVnaW4gZm9ybWF0dGluZyBhIGRpc2sgKi8KKyNkZWZpbmUJRkRGTVRUUksgX0lPVygyLDB4NDgsIHN0cnVjdCBmb3JtYXRfZGVzY3IpCisvKiBmb3JtYXQgdGhlIHNwZWNpZmllZCB0cmFjayAqLworI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQorLyogZW5kIGZvcm1hdHRpbmcgYSBkaXNrICovCisKKworLyoKKyAqIEVycm9yIHRocmVzaG9sZHMKKyAqLworc3RydWN0IGZsb3BweV9tYXhfZXJyb3JzIHsKKwl1bnNpZ25lZCBpbnQKKwkgIGFib3J0LCAgICAgIC8qIG51bWJlciBvZiBlcnJvcnMgdG8gYmUgcmVhY2hlZCBiZWZvcmUgYWJvcnRpbmcgKi8KKwkgIHJlYWRfdHJhY2ssIC8qIG1heGltYWwgbnVtYmVyIG9mIGVycm9ycyBwZXJtaXR0ZWQgdG8gcmVhZCBhbgorCQkgICAgICAgKiBlbnRpcmUgdHJhY2sgYXQgb25jZSAqLworCSAgcmVzZXQsICAgICAgLyogbWF4aW1hbCBudW1iZXIgb2YgZXJyb3JzIGJlZm9yZSBhIHJlc2V0IGlzIHRyaWVkICovCisJICByZWNhbCwgICAgICAvKiBtYXhpbWFsIG51bWJlciBvZiBlcnJvcnMgYmVmb3JlIGEgcmVjYWxpYnJhdGUgaXMKKwkJICAgICAgICogdHJpZWQgKi8KKworCSAgLyoKKwkgICAqIFRocmVzaG9sZCBmb3IgcmVwb3J0aW5nIEZEQyBlcnJvcnMgdG8gdGhlIGNvbnNvbGUuCisJICAgKiBTZXR0aW5nIHRoaXMgdG8gemVybyBtYXkgZmxvb2QgeW91ciBzY3JlZW4gd2hlbiB1c2luZworCSAgICogdWx0cmEgY2hlYXAgZmxvcHBpZXMgOy0pCisJICAgKi8KKwkgIHJlcG9ydGluZzsKKworfTsKKworI2RlZmluZSBGRFNFVEVNU0dUUkVTSAlfSU8oMiwweDRhKQorLyogc2V0IGZkYyBlcnJvciByZXBvcnRpbmcgdGhyZXNob2xkICovCisKKyNkZWZpbmUgRkRGTFVTSCAgX0lPKDIsMHg0YikKKy8qIGZsdXNoIGJ1ZmZlcnMgZm9yIG1lZGlhOyBlaXRoZXIgZm9yIHZlcmlmeWluZyBtZWRpYSwgb3IgZm9yCisgKiBoYW5kbGluZyBhIG1lZGlhIGNoYW5nZSB3aXRob3V0IGNsb3NpbmcgdGhlIGZpbGUgZGVzY3JpcHRvciAqLworCisjZGVmaW5lIEZEU0VUTUFYRVJSUyBfSU9XKDIsIDB4NGMsIHN0cnVjdCBmbG9wcHlfbWF4X2Vycm9ycykKKyNkZWZpbmUgRkRHRVRNQVhFUlJTIF9JT1IoMiwgMHgwZSwgc3RydWN0IGZsb3BweV9tYXhfZXJyb3JzKQorLyogc2V0L2dldCBhYm9ydGlvbiBhbmQgcmVhZF90cmFjayB0aHJlc2hvbGQuIFNlZSBhbHNvIGZsb3BweV9kcml2ZV9wYXJhbXMKKyAqIHN0cnVjdHVyZSAqLworCisKK3R5cGVkZWYgY2hhciBmbG9wcHlfZHJpdmVfbmFtZVsxNl07CisjZGVmaW5lIEZER0VURFJWVFlQIF9JT1IoMiwgMHgwZiwgZmxvcHB5X2RyaXZlX25hbWUpCisvKiBnZXQgZHJpdmUgdHlwZTogNSAxLzQgb3IgMyAxLzIgKi8KKworCisvKgorICogRHJpdmUgcGFyYW1ldGVycyAodXNlciBtb2RpZmlhYmxlKQorICovCitzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtcyB7CisJc2lnbmVkIGNoYXIgY21vczsJCS8qIENNT1MgdHlwZSAqLworCQorCS8qIFNwZWMyIGlzIChITEQ8PDEgfCBORCksIHdoZXJlIEhMRCBpcyBoZWFkIGxvYWQgdGltZSAoMT0ybXMsIDI9NCBtcyAKKwkgKiBldGMpIGFuZCBORCBpcyBzZXQgbWVhbnMgbm8gRE1BLiBIYXJkY29kZWQgdG8gNiAoSExEPTZtcywgdXNlIERNQSkuCisJICovCisJdW5zaWduZWQgbG9uZyBtYXhfZHRyOwkJLyogU3RlcCByYXRlLCB1c2VjICovCisJdW5zaWduZWQgbG9uZyBobHQ7ICAgICAJCS8qIEhlYWQgbG9hZC9zZXR0bGUgdGltZSwgbXNlYyAqLworCXVuc2lnbmVkIGxvbmcgaHV0OyAgICAgCQkvKiBIZWFkIHVubG9hZCB0aW1lIChyZW1uYW50IG9mIAorCQkJCQkgKiA4IiBkcml2ZXMpICovCisJdW5zaWduZWQgbG9uZyBzcnQ7ICAgICAJCS8qIFN0ZXAgcmF0ZSwgdXNlYyAqLworCisJdW5zaWduZWQgbG9uZyBzcGludXA7CQkvKiB0aW1lIG5lZWRlZCBmb3Igc3BpbnVwIChleHByZXNzZWQKKwkJCQkJICogaW4gamlmZmllcykgKi8KKwl1bnNpZ25lZCBsb25nIHNwaW5kb3duOwkJLyogdGltZW91dCBuZWVkZWQgZm9yIHNwaW5kb3duICovCisJdW5zaWduZWQgY2hhciBzcGluZG93bl9vZmZzZXQ7CS8qIGRlY2lkZXMgaW4gd2hpY2ggcG9zaXRpb24gdGhlIGRpc2sKKwkJCQkJICogd2lsbCBzdG9wICovCisJdW5zaWduZWQgY2hhciBzZWxlY3RfZGVsYXk7CS8qIGRlbGF5IHRvIHdhaXQgYWZ0ZXIgc2VsZWN0ICovCisJdW5zaWduZWQgY2hhciBycHM7CQkvKiByb3RhdGlvbnMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGNoYXIgdHJhY2tzOwkJLyogbWF4aW11bSBudW1iZXIgb2YgdHJhY2tzICovCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwkJLyogdGltZW91dCBmb3IgaW50ZXJydXB0IHJlcXVlc3RzICovCisJCisJdW5zaWduZWQgY2hhciBpbnRlcmxlYXZlX3NlY3Q7CS8qIGlmIHRoZXJlIGFyZSBtb3JlIHNlY3RvcnMsIHVzZSAKKwkJCQkJICogaW50ZXJsZWF2ZSAqLworCQorCXN0cnVjdCBmbG9wcHlfbWF4X2Vycm9ycyBtYXhfZXJyb3JzOworCQorCWNoYXIgZmxhZ3M7CQkJLyogdmFyaW91cyBmbGFncywgaW5jbHVkaW5nIGZ0ZF9tc2cgKi8KKy8qCisgKiBBbm5vdW5jZSBzdWNjZXNzZnVsIG1lZGlhIHR5cGUgZGV0ZWN0aW9uIGFuZCBtZWRpYSBpbmZvcm1hdGlvbiBsb3NzIGFmdGVyCisgKiBkaXNrIGNoYW5nZXMuCisgKiBBbHNvIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgcHJpbnRpbmcgb2Ygb3ZlcnJ1biB3YXJuaW5ncy4KKyAqLworCisjZGVmaW5lIEZURF9NU0cgMHgxMAorI2RlZmluZSBGRF9CUk9LRU5fRENMIDB4MjAKKyNkZWZpbmUgRkRfREVCVUcgMHgwMgorI2RlZmluZSBGRF9TSUxFTlRfRENMX0NMRUFSIDB4NAorI2RlZmluZSBGRF9JTlZFUlRFRF9EQ0wgMHg4MCAvKiBtdXN0IGJlIDB4ODAsIGJlY2F1c2Ugb2YgaGFyZHdhcmUgCisJCQkJY29uc2lkZXJhdGlvbnMgKi8KKworCWNoYXIgcmVhZF90cmFjazsJCS8qIHVzZSByZWFkdHJhY2sgZHVyaW5nIHByb2Jpbmc/ICovCisKKy8qCisgKiBBdXRvLWRldGVjdGlvbi4gRWFjaCBkcml2ZSB0eXBlIGhhcyBlaWdodCBmb3JtYXRzIHdoaWNoIGFyZQorICogdXNlZCBpbiBzdWNjZXNzaW9uIHRvIHRyeSB0byByZWFkIHRoZSBkaXNrLiBJZiB0aGUgRkRDIGNhbm5vdCBsb2NrIG9udG8KKyAqIHRoZSBkaXNrLCB0aGUgbmV4dCBmb3JtYXQgaXMgdHJpZWQuIFRoaXMgdXNlcyB0aGUgdmFyaWFibGUgJ3Byb2JpbmcnLgorICovCisJc2hvcnQgYXV0b2RldGVjdFs4XTsJCS8qIGF1dG9kZXRlY3RlZCBmb3JtYXRzICovCisJCisJaW50IGNoZWNrZnJlcTsgLyogaG93IG9mdGVuIHNob3VsZCB0aGUgZHJpdmUgYmUgY2hlY2tlZCBmb3IgZGlzayAKKwkJCSogY2hhbmdlcyAqLworCWludCBuYXRpdmVfZm9ybWF0OyAvKiBuYXRpdmUgZm9ybWF0IG9mIHRoaXMgZHJpdmUgKi8KK307CisKK2VudW0geworCUZEX05FRURfVFdBRERMRV9CSVQsCS8qIG1vcmUgbWFnaWMgKi8KKwlGRF9WRVJJRllfQklULAkJLyogaW5xdWlyZSBmb3Igd3JpdGUgcHJvdGVjdGlvbiAqLworCUZEX0RJU0tfTkVXQ0hBTkdFX0JJVCwJLyogY2hhbmdlIGRldGVjdGVkLCBhbmQgbm8gYWN0aW9uIHVuZGVydGFrZW4geWV0CisJCQkJICogdG8gY2xlYXIgbWVkaWEgY2hhbmdlIHN0YXR1cyAqLworCUZEX1VOVVNFRF9CSVQsCisJRkRfRElTS19DSEFOR0VEX0JJVCwJLyogZGlzayBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIGxhc3QgaS9vICovCisJRkRfRElTS19XUklUQUJMRV9CSVQJLyogZGlzayBpcyB3cml0YWJsZSAqLworfTsKKworI2RlZmluZSBGRFNFVERSVlBSTSBfSU9XKDIsIDB4OTAsIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zKQorI2RlZmluZSBGREdFVERSVlBSTSBfSU9SKDIsIDB4MTEsIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zKQorLyogc2V0L2dldCBkcml2ZSBwYXJhbWV0ZXJzICovCisKKworLyoKKyAqIEN1cnJlbnQgZHJpdmUgc3RhdGUgKG5vdCBkaXJlY3RseSBtb2RpZmlhYmxlIGJ5IHVzZXIsIHJlYWRvbmx5KQorICovCitzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKy8qIHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgKi8KKyNkZWZpbmUgRkRfTkVFRF9UV0FERExFICgxIDw8IEZEX05FRURfVFdBRERMRV9CSVQpCisjZGVmaW5lIEZEX1ZFUklGWSAoMSA8PCBGRF9WRVJJRllfQklUKQorI2RlZmluZSBGRF9ESVNLX05FV0NIQU5HRSAoMSA8PCBGRF9ESVNLX05FV0NIQU5HRV9CSVQpCisjZGVmaW5lIEZEX0RJU0tfQ0hBTkdFRCAoMSA8PCBGRF9ESVNLX0NIQU5HRURfQklUKQorI2RlZmluZSBGRF9ESVNLX1dSSVRBQkxFICgxIDw8IEZEX0RJU0tfV1JJVEFCTEVfQklUKQorCisJdW5zaWduZWQgbG9uZyBzcGludXBfZGF0ZTsKKwl1bnNpZ25lZCBsb25nIHNlbGVjdF9kYXRlOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfcmVhZF9kYXRlOworCXNob3J0IHByb2JlZF9mb3JtYXQ7CisJc2hvcnQgdHJhY2s7IC8qIGN1cnJlbnQgdHJhY2sgKi8KKwlzaG9ydCBtYXhibG9jazsgLyogaWQgb2YgaGlnaGVzdCBibG9jayByZWFkICovCisJc2hvcnQgbWF4dHJhY2s7IC8qIGlkIG9mIGhpZ2hlc3QgaGFsZiB0cmFjayByZWFkICovCisJaW50IGdlbmVyYXRpb247IC8qIGhvdyBtYW55IGRpc2tjaGFuZ2VzPyAqLworCisvKgorICogKFVzZXItcHJvdmlkZWQpIG1lZGlhIGluZm9ybWF0aW9uIGlzIF9ub3RfIGRpc2NhcmRlZCBhZnRlciBhIG1lZGlhIGNoYW5nZQorICogaWYgdGhlIGNvcnJlc3BvbmRpbmcga2VlcF9kYXRhIGZsYWcgaXMgbm9uLXplcm8uIFBvc2l0aXZlIHZhbHVlcyBhcmUKKyAqIGRlY3JlbWVudGVkIGFmdGVyIGVhY2ggcHJvYmUuCisgKi8KKwlpbnQga2VlcF9kYXRhOworCQorCS8qIFByZXZlbnQgImFsaWFzZWQiIGFjY2Vzc2VzLiAqLworCWludCBmZF9yZWY7CisJaW50IGZkX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY2hlY2tlZDsgLyogd2hlbiB3YXMgdGhlIGRyaXZlIGxhc3QgY2hlY2tlZCBmb3IgYSBkaXNrIAorCQkJICAgKiBjaGFuZ2U/ICovCisJCisJY2hhciAqZG1hYnVmOworCWludCBidWZibG9ja3M7Cit9OworCisjZGVmaW5lIEZER0VURFJWU1RBVCBfSU9SKDIsIDB4MTIsIHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0KQorI2RlZmluZSBGRFBPTExEUlZTVEFUIF9JT1IoMiwgMHgxMywgc3RydWN0IGZsb3BweV9kcml2ZV9zdHJ1Y3QpCisvKiBnZXQgZHJpdmUgc3RhdGU6IEdFVCByZXR1cm5zIHRoZSBjYWNoZWQgc3RhdGUsIFBPTEwgcG9sbHMgZm9yIG5ldyBzdGF0ZSAqLworCisKKy8qCisgKiByZXNldCBGREMKKyAqLworZW51bSByZXNldF9tb2RlIHsKKwlGRF9SRVNFVF9JRl9ORUVERUQsCS8qIHJlc2V0IG9ubHkgaWYgdGhlIHJlc2V0IGZsYWdzIGlzIHNldCAqLworCUZEX1JFU0VUX0lGX1JBV0NNRCwJLyogb2Jzb2xldGUgKi8KKwlGRF9SRVNFVF9BTFdBWVMJCS8qIHJlc2V0IGFsd2F5cyAqLworfTsKKyNkZWZpbmUgRkRSRVNFVCBfSU8oMiwgMHg1NCkKKworCisvKgorICogRkRDIHN0YXRlCisgKi8KK3N0cnVjdCBmbG9wcHlfZmRjX3N0YXRlIHsJCisJaW50IHNwZWMxOwkJLyogc3BlYzEgdmFsdWUgbGFzdCB1c2VkICovCisJaW50IHNwZWMyOwkJLyogc3BlYzIgdmFsdWUgbGFzdCB1c2VkICovCisJaW50IGR0cjsKKwl1bnNpZ25lZCBjaGFyIHZlcnNpb247CS8qIEZEQyB2ZXJzaW9uIGNvZGUgKi8KKwl1bnNpZ25lZCBjaGFyIGRvcjsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CS8qIGlvIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgcmF3Y21kOjI7CisJdW5zaWduZWQgaW50IHJlc2V0OjE7CisJdW5zaWduZWQgaW50IG5lZWRfY29uZmlndXJlOjE7CisJdW5zaWduZWQgaW50IHBlcnBfbW9kZToyOworCXVuc2lnbmVkIGludCBoYXNfZmlmbzoxOworCXVuc2lnbmVkIGludCBkcml2ZXJfdmVyc2lvbjsJLyogdmVyc2lvbiBjb2RlIGZvciBmbG9wcHkgZHJpdmVyICovCisjZGVmaW5lIEZEX0RSSVZFUl9WRVJTSU9OIDB4MTAwCisvKiB1c2VyIHByb2dyYW1zIHVzaW5nIHRoZSBmbG9wcHkgQVBJIHNob3VsZCB1c2UgZmxvcHB5X2ZkY19zdGF0ZSB0bworICogZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmxvcHB5IGRyaXZlciB0aGF0IHRoZXkgYXJlIHJ1bm5pbmcKKyAqIG9uLiBJZiB0aGlzIHZlcnNpb24gbnVtYmVyIGlzIGJpZ2dlciB0aGFuIHRoZSBvbmUgY29tcGlsZWQgaW50byB0aGUKKyAqIHVzZXIgcHJvZ3JhbSAodGhlIEZEX0RSSVZFUl9WRVJTSU9OIGRlZmluZSksIGl0IHNob3VsZCBiZSBwcmVwYXJlZAorICogdG8gYmlnZ2VyIHN0cnVjdHVyZXMKKyAqLworCisJdW5zaWduZWQgY2hhciB0cmFja1s0XTsKKwkvKiBQb3NpdGlvbiBvZiB0aGUgaGVhZHMgb2YgdGhlIDQgdW5pdHMgYXR0YWNoZWQgdG8gdGhpcyBGREMsCisJICogYXMgc3RvcmVkIG9uIHRoZSBGREMuIEluIHRoZSBmdXR1cmUsIHRoZSBwb3NpdGlvbiBhcyBzdG9yZWQKKwkgKiBvbiB0aGUgRkRDIG1pZ2h0IG5vdCBhZ3JlZSB3aXRoIHRoZSBhY3R1YWwgcGh5c2ljYWwKKwkgKiBwb3NpdGlvbiBvZiB0aGVzZSBkcml2ZSBoZWFkcy4gQnkgYWxsb3dpbmcgc3VjaAorCSAqIGRpc2FncmVlbWVudCwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byByZXNldCB0aGUgRkRDIHdpdGhvdXQKKwkgKiBpbmN1cnJpbmcgdGhlIGV4cGVuc2l2ZSBjb3N0IG9mIHJlcG9zaXRpb25pbmcgYWxsIGhlYWRzLgorCSAqIFJpZ2h0IG5vdywgdGhlc2UgcG9zaXRpb25zIGFyZSBoYXJkIHdpcmVkIHRvIDAuICovCisKK307CisKKyNkZWZpbmUgRkRHRVRGRENTVEFUIF9JT1IoMiwgMHgxNSwgc3RydWN0IGZsb3BweV9mZGNfc3RhdGUpCisKKworLyoKKyAqIEFzeW5jaHJvbm91cyBXcml0ZSBlcnJvciB0cmFja2luZworICovCitzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9ycyB7CisJLyogV3JpdGUgZXJyb3IgbG9nZ2luZy4KKwkgKgorCSAqIFRoZXNlIGZpZWxkcyBjYW4gYmUgY2xlYXJlZCB3aXRoIHRoZSBGRFdFUlJPUkNMUiBpb2N0bC4KKwkgKiBPbmx5IHdyaXRlcyB0aGF0IHdlcmUgYXR0ZW1wdGVkIGJ1dCBmYWlsZWQgZHVlIHRvIGEgcGh5c2ljYWwgbWVkaWEKKwkgKiBlcnJvciBhcmUgbG9nZ2VkLiAgd3JpdGUoMikgY2FsbHMgdGhhdCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZQorCSAqIHRvIHRoZSB1c2VyIHByb2Nlc3MgYXJlIG5vdCBjb3VudGVkLgorCSAqLworCisJdW5zaWduZWQgaW50IHdyaXRlX2Vycm9yczsgIC8qIG51bWJlciBvZiBwaHlzaWNhbCB3cml0ZSBlcnJvcnMgCisJCQkJICAgICAqIGVuY291bnRlcmVkICovCisJCisJLyogcG9zaXRpb24gb2YgZmlyc3QgYW5kIGxhc3Qgd3JpdGUgZXJyb3JzICovCisJdW5zaWduZWQgbG9uZyBmaXJzdF9lcnJvcl9zZWN0b3I7CisJaW50ICAgICAgICAgICBmaXJzdF9lcnJvcl9nZW5lcmF0aW9uOworCXVuc2lnbmVkIGxvbmcgbGFzdF9lcnJvcl9zZWN0b3I7CisJaW50ICAgICAgICAgICBsYXN0X2Vycm9yX2dlbmVyYXRpb247CisJCisJdW5zaWduZWQgaW50IGJhZG5lc3M7IC8qIGhpZ2hlc3QgcmV0cnkgY291bnQgZm9yIGEgcmVhZCBvciB3cml0ZSAKKwkJCSAgICAgICAqIG9wZXJhdGlvbiAqLworfTsKKworI2RlZmluZSBGRFdFUlJPUkNMUiAgX0lPKDIsIDB4NTYpCisvKiBjbGVhciB3cml0ZSBlcnJvciBhbmQgYmFkbmVzcyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBGRFdFUlJPUkdFVCAgX0lPUigyLCAweDE3LCBzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9ycykKKy8qIGdldCB3cml0ZSBlcnJvciBhbmQgYmFkbmVzcyBpbmZvcm1hdGlvbiAqLworCisKKy8qCisgKiBSYXcgY29tbWFuZHMKKyAqLworLyogbmV3IGludGVyZmFjZSBmbGFnOiBub3cgd2UgY2FuIGRvIHRoZW0gaW4gYmF0Y2hlcyAqLworI2RlZmluZSBGREhBVkVCQVRDSEVEUkFXQ01ECisKK3N0cnVjdCBmbG9wcHlfcmF3X2NtZCB7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBGRF9SQVdfUkVBRCAxCisjZGVmaW5lIEZEX1JBV19XUklURSAyCisjZGVmaW5lIEZEX1JBV19OT19NT1RPUiA0CisjZGVmaW5lIEZEX1JBV19ESVNLX0NIQU5HRSA0IC8qIG91dDogZGlzayBjaGFuZ2UgZmxhZyB3YXMgc2V0ICovCisjZGVmaW5lIEZEX1JBV19JTlRSIDggICAgLyogd2FpdCBmb3IgYW4gaW50ZXJydXB0ICovCisjZGVmaW5lIEZEX1JBV19TUElOIDB4MTAgLyogc3BpbiB1cCB0aGUgZGlzayBmb3IgdGhpcyBjb21tYW5kICovCisjZGVmaW5lIEZEX1JBV19OT19NT1RPUl9BRlRFUiAweDIwIC8qIHN3aXRjaCB0aGUgbW90b3Igb2ZmIGFmdGVyIGNvbW1hbmQgCisJCQkJICAgICogY29tcGxldGlvbiAqLworI2RlZmluZSBGRF9SQVdfTkVFRF9ESVNLIDB4NDAgIC8qIHRoaXMgY29tbWFuZCBuZWVkcyBhIGRpc2sgdG8gYmUgcHJlc2VudCAqLworI2RlZmluZSBGRF9SQVdfTkVFRF9TRUVLIDB4ODAgIC8qIHRoaXMgY29tbWFuZCB1c2VzIGFuIGltcGxpZWQgc2VlayAoc29mdCkgKi8KKworLyogbW9yZSAiaW4iIGZsYWdzICovCisjZGVmaW5lIEZEX1JBV19NT1JFIDB4MTAwICAvKiBtb3JlIHJlY29yZHMgZm9sbG93ICovCisjZGVmaW5lIEZEX1JBV19TVE9QX0lGX0ZBSUxVUkUgMHgyMDAgLyogc3RvcCBpZiB3ZSBlbmNvdW50ZXIgYSBmYWlsdXJlICovCisjZGVmaW5lIEZEX1JBV19TVE9QX0lGX1NVQ0NFU1MgMHg0MDAgLyogc3RvcCBpZiBjb21tYW5kIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgRkRfUkFXX1NPRlRGQUlMVVJFIDB4ODAwIC8qIGNvbnNpZGVyIHRoZSByZXR1cm4gdmFsdWUgZm9yIGZhaWx1cmUKKwkJCQkgICogZGV0ZWN0aW9uIHRvbyAqLworCisvKiBtb3JlICJvdXQiIGZsYWdzICovCisjZGVmaW5lIEZEX1JBV19GQUlMVVJFIDB4MTAwMDAgLyogY29tbWFuZCBzZW50IHRvIGZkYywgZmRjIHJldHVybmVkIGVycm9yICovCisjZGVmaW5lIEZEX1JBV19IQVJERkFJTFVSRSAweDIwMDAwIC8qIGZkYyBoYWQgdG8gYmUgcmVzZXQsIG9yIHRpbWVkIG91dCAqLworCisJdm9pZCAqZGF0YTsKKwljaGFyICprZXJuZWxfZGF0YTsgLyogbG9jYXRpb24gb2YgZGF0YSBidWZmZXIgaW4gdGhlIGtlcm5lbCAqLworCXN0cnVjdCBmbG9wcHlfcmF3X2NtZCAqbmV4dDsgLyogdXNlZCBmb3IgY2hhaW5pbmcgb2YgcmF3IGNtZCdzIAorCQkJCSAgICAgICogd2l0aGluIHRoZSBrZXJuZWwgKi8KKwlsb25nIGxlbmd0aDsgLyogaW46IGxlbmd0aCBvZiBkbWEgdHJhbnNmZXIuIG91dDogcmVtYWluaW5nIGJ5dGVzICovCisJbG9uZyBwaHlzX2xlbmd0aDsgLyogcGh5c2ljYWwgbGVuZ3RoLCBpZiBkaWZmZXJlbnQgZnJvbSBkbWEgbGVuZ3RoICovCisJaW50IGJ1ZmZlcl9sZW5ndGg7IC8qIGxlbmd0aCBvZiBhbGxvY2F0ZWQgYnVmZmVyICovCisKKwl1bnNpZ25lZCBjaGFyIHJhdGU7CisJdW5zaWduZWQgY2hhciBjbWRfY291bnQ7CisJdW5zaWduZWQgY2hhciBjbWRbMTZdOworCXVuc2lnbmVkIGNoYXIgcmVwbHlfY291bnQ7CisJdW5zaWduZWQgY2hhciByZXBseVsxNl07CisJaW50IHRyYWNrOworCWludCByZXN1bHRjb2RlOworCisJaW50IHJlc2VydmVkMTsKKwlpbnQgcmVzZXJ2ZWQyOworfTsKKworI2RlZmluZSBGRFJBV0NNRCBfSU8oMiwgMHg1OCkKKy8qIHNlbmQgYSByYXcgY29tbWFuZCB0byB0aGUgZmRjLiBTdHJ1Y3R1cmUgc2l6ZSBub3QgaW5jbHVkZWQsIGJlY2F1c2Ugb2YKKyAqIGJhdGNoZXMgKi8KKworI2RlZmluZSBGRFRXQURETEUgX0lPKDIsIDB4NTkpCisvKiBmbGlja2VyIG1vdG9yLW9uIGJpdCBiZWZvcmUgcmVhZGluZyBhIHNlY3Rvci4gRXhwZXJpbWVudGFsICovCisKKworI2RlZmluZSBGREVKRUNUIF9JTygyLCAweDVhKQorLyogZWplY3QgdGhlIGRpc2sgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkcmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZkcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlZWI2MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmRyZWcuaApAQCAtMCwwICsxLDEzNyBAQAorI2lmbmRlZiBfTElOVVhfRkRSRUdfSAorI2RlZmluZSBfTElOVVhfRkRSRUdfSAorLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGRlZmluZXMgZm9yIHRoZSBmbG9wcHkgZGlzayBjb250cm9sbGVyLgorICogVmFyaW91cyBzb3VyY2VzLiBNb3N0bHkgIklCTSBNaWNyb2NvbXB1dGVyczogQSBQcm9ncmFtbWVycworICogSGFuZGJvb2siLCBTYW5jaGVzIGFuZCBDYW50b24uCisgKi8KKworI2lmZGVmIEZEUEFUQ0hFUworI2RlZmluZSBGRF9JT1BPUlQgZmRjX3N0YXRlW2ZkY10uYWRkcmVzcworI2Vsc2UKKy8qIEl0IHdvdWxkIGJlIGEgbG90IHNhbmVyIGp1c3QgdG8gZm9yY2UgZmRjX3N0YXRlW2ZkY10uYWRkcmVzcyB0byBhbHdheXMKKyAgIGJlIHNldCAhIEZJWE1FICovCisjZGVmaW5lIEZEX0lPUE9SVCAweDNmMAorI2VuZGlmCisKKy8qIEZkIGNvbnRyb2xsZXIgcmVncy4gUyZDLCBhYm91dCBwYWdlIDM0MCAqLworI2RlZmluZSBGRF9TVEFUVVMJKDQgKyBGRF9JT1BPUlQgKQorI2RlZmluZSBGRF9EQVRBCQkoNSArIEZEX0lPUE9SVCApCisKKy8qIERpZ2l0YWwgT3V0cHV0IFJlZ2lzdGVyICovCisjZGVmaW5lIEZEX0RPUgkJKDIgKyBGRF9JT1BPUlQgKQorCisvKiBEaWdpdGFsIElucHV0IFJlZ2lzdGVyIChyZWFkKSAqLworI2RlZmluZSBGRF9ESVIJCSg3ICsgRkRfSU9QT1JUICkKKworLyogRGlza2V0dGUgQ29udHJvbCBSZWdpc3RlciAod3JpdGUpKi8KKyNkZWZpbmUgRkRfRENSCQkoNyArIEZEX0lPUE9SVCApCisKKy8qIEJpdHMgb2YgbWFpbiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVFVTX0JVU1lNQVNLCTB4MEYJCS8qIGRyaXZlIGJ1c3kgbWFzayAqLworI2RlZmluZSBTVEFUVVNfQlVTWQkweDEwCQkvKiBGREMgYnVzeSAqLworI2RlZmluZSBTVEFUVVNfRE1BCTB4MjAJCS8qIDAtIERNQSBtb2RlICovCisjZGVmaW5lIFNUQVRVU19ESVIJMHg0MAkJLyogMC0gY3B1LT5mZGMgKi8KKyNkZWZpbmUgU1RBVFVTX1JFQURZCTB4ODAJCS8qIERhdGEgcmVnIHJlYWR5ICovCisKKy8qIEJpdHMgb2YgRkRfU1QwICovCisjZGVmaW5lIFNUMF9EUwkJMHgwMwkJLyogZHJpdmUgc2VsZWN0IG1hc2sgKi8KKyNkZWZpbmUgU1QwX0hBCQkweDA0CQkvKiBIZWFkIChBZGRyZXNzKSAqLworI2RlZmluZSBTVDBfTlIJCTB4MDgJCS8qIE5vdCBSZWFkeSAqLworI2RlZmluZSBTVDBfRUNFCQkweDEwCQkvKiBFcXVpcG1lbnQgY2hlY2sgZXJyb3IgKi8KKyNkZWZpbmUgU1QwX1NFCQkweDIwCQkvKiBTZWVrIGVuZCAqLworI2RlZmluZSBTVDBfSU5UUgkweEMwCQkvKiBJbnRlcnJ1cHQgY29kZSBtYXNrICovCisKKy8qIEJpdHMgb2YgRkRfU1QxICovCisjZGVmaW5lIFNUMV9NQU0JCTB4MDEJCS8qIE1pc3NpbmcgQWRkcmVzcyBNYXJrICovCisjZGVmaW5lIFNUMV9XUAkJMHgwMgkJLyogV3JpdGUgUHJvdGVjdCAqLworI2RlZmluZSBTVDFfTkQJCTB4MDQJCS8qIE5vIERhdGEgLSB1bnJlYWRhYmxlICovCisjZGVmaW5lIFNUMV9PUgkJMHgxMAkJLyogT3ZlclJ1biAqLworI2RlZmluZSBTVDFfQ1JDCQkweDIwCQkvKiBDUkMgZXJyb3IgaW4gZGF0YSBvciBhZGRyICovCisjZGVmaW5lIFNUMV9FT0MJCTB4ODAJCS8qIEVuZCBPZiBDeWxpbmRlciAqLworCisvKiBCaXRzIG9mIEZEX1NUMiAqLworI2RlZmluZSBTVDJfTUFNCQkweDAxCQkvKiBNaXNzaW5nIEFkZHJlc3MgTWFyayAoYWdhaW4pICovCisjZGVmaW5lIFNUMl9CQwkJMHgwMgkJLyogQmFkIEN5bGluZGVyICovCisjZGVmaW5lIFNUMl9TTlMJCTB4MDQJCS8qIFNjYW4gTm90IFNhdGlzZmllZCAqLworI2RlZmluZSBTVDJfU0VICQkweDA4CQkvKiBTY2FuIEVxdWFsIEhpdCAqLworI2RlZmluZSBTVDJfV0MJCTB4MTAJCS8qIFdyb25nIEN5bGluZGVyICovCisjZGVmaW5lIFNUMl9DUkMJCTB4MjAJCS8qIENSQyBlcnJvciBpbiBkYXRhIGZpZWxkICovCisjZGVmaW5lIFNUMl9DTQkJMHg0MAkJLyogQ29udHJvbCBNYXJrID0gZGVsZXRlZCAqLworCisvKiBCaXRzIG9mIEZEX1NUMyAqLworI2RlZmluZSBTVDNfSEEJCTB4MDQJCS8qIEhlYWQgKEFkZHJlc3MpICovCisjZGVmaW5lIFNUM19EUwkJMHgwOAkJLyogZHJpdmUgaXMgZG91YmxlLXNpZGVkICovCisjZGVmaW5lIFNUM19UWgkJMHgxMAkJLyogVHJhY2sgWmVybyBzaWduYWwgKDE9dHJhY2sgMCkgKi8KKyNkZWZpbmUgU1QzX1JZCQkweDIwCQkvKiBkcml2ZSBpcyByZWFkeSAqLworI2RlZmluZSBTVDNfV1AJCTB4NDAJCS8qIFdyaXRlIFByb3RlY3QgKi8KKyNkZWZpbmUgU1QzX0ZUCQkweDgwCQkvKiBEcml2ZSBGYXVsdCAqLworCisvKiBWYWx1ZXMgZm9yIEZEX0NPTU1BTkQgKi8KKyNkZWZpbmUgRkRfUkVDQUxJQlJBVEUJCTB4MDcJLyogbW92ZSB0byB0cmFjayAwICovCisjZGVmaW5lIEZEX1NFRUsJCQkweDBGCS8qIHNlZWsgdHJhY2sgKi8KKyNkZWZpbmUgRkRfUkVBRAkJCTB4RTYJLyogcmVhZCB3aXRoIE1ULCBNRk0sIFNLaXAgZGVsZXRlZCAqLworI2RlZmluZSBGRF9XUklURQkJMHhDNQkvKiB3cml0ZSB3aXRoIE1ULCBNRk0gKi8KKyNkZWZpbmUgRkRfU0VOU0VJCQkweDA4CS8qIFNlbnNlIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgRkRfU1BFQ0lGWQkJMHgwMwkvKiBzcGVjaWZ5IEhVVCBldGMgKi8KKyNkZWZpbmUgRkRfRk9STUFUCQkweDRECS8qIGZvcm1hdCBvbmUgdHJhY2sgKi8KKyNkZWZpbmUgRkRfVkVSU0lPTgkJMHgxMAkvKiBnZXQgdmVyc2lvbiBjb2RlICovCisjZGVmaW5lIEZEX0NPTkZJR1VSRQkJMHgxMwkvKiBjb25maWd1cmUgRklGTyBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkRfUEVSUEVORElDVUxBUgkweDEyCS8qIHBlcnBlbmRpY3VsYXIgci93IG1vZGUgKi8KKyNkZWZpbmUgRkRfR0VUU1RBVFVTCQkweDA0CS8qIHJlYWQgU1QzICovCisjZGVmaW5lIEZEX0RVTVBSRUdTCQkweDBFCS8qIGR1bXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBmZGMgcmVncyAqLworI2RlZmluZSBGRF9SRUFESUQJCTB4RUEJLyogcHJpbnRzIHRoZSBoZWFkZXIgb2YgYSBzZWN0b3IgKi8KKyNkZWZpbmUgRkRfVU5MT0NLCQkweDE0CS8qIEZpZm8gY29uZmlnIHVubG9jayAqLworI2RlZmluZSBGRF9MT0NLCQkJMHg5NAkvKiBGaWZvIGNvbmZpZyBsb2NrICovCisjZGVmaW5lIEZEX1JTRUVLX09VVAkJMHg4ZgkvKiBzZWVrIG91dCAoaS5lLiB0byBsb3dlciB0cmFja3MpICovCisjZGVmaW5lIEZEX1JTRUVLX0lOCQkweGNmCS8qIHNlZWsgaW4gKGkuZS4gdG8gaGlnaGVyIHRyYWNrcykgKi8KKworLyogdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgbmV3IGluIHRoZSA4MjA3OC4gVGhleSBhcmUgbm90IHVzZWQgaW4gdGhlCisgKiBmbG9wcHkgZHJpdmVyLCBleGNlcHQgdGhlIGZpcnN0IHRocmVlLiBUaGVzZSBjb21tYW5kcyBtYXkgYmUgdXNlZnVsIGZvciBhcHBzCisgKiB3aGljaCB1c2UgdGhlIEZEUkFXQ01EIGludGVyZmFjZS4gRm9yIGRvYywgZ2V0IHRoZSA4MjA3OCBzcGVjIHNoZWV0cyBhdAorICogaHR0cDovL3d3dy10ZWNoZG9jLmludGVsLmNvbS9kb2NzL3BlcmlwaC9mZF9jb250ci9kYXRhc2hlZXRzLyAqLworCisjZGVmaW5lIEZEX1BBUlRJRAkJMHgxOAkvKiBwYXJ0IGlkICgiZXh0ZW5kZWQiIHZlcnNpb24gY21kKSAqLworI2RlZmluZSBGRF9TQVZFCQkJMHgyZQkvKiBzYXZlIGZkYyByZWdzIGZvciBsYXRlciByZXN0b3JlICovCisjZGVmaW5lIEZEX0RSSVZFU1BFQwkJMHg4ZQkvKiBkcml2ZSBzcGVjaWZpY2F0aW9uOiBBY2Nlc3MgdG8gdGhlCisJCQkJCSAqIDIgTWJwcyBkYXRhIHRyYW5zZmVyIHJhdGUgZm9yIHRhcGUKKwkJCQkJICogZHJpdmVzICovCisKKyNkZWZpbmUgRkRfUkVTVE9SRQkJMHg0ZSAgICAvKiBsYXRlciByZXN0b3JlICovCisjZGVmaW5lIEZEX1BPV0VSRE9XTgkJMHgyNwkvKiBjb25maWd1cmUgRkRDJ3MgcG93ZXJzYXZlIGZlYXR1cmVzICovCisjZGVmaW5lIEZEX0ZPUk1BVF9OX1dSSVRFCTB4ZWYgICAgLyogZm9ybWF0IGFuZCB3cml0ZSBpbiBvbmUgZ28uICovCisjZGVmaW5lIEZEX09QVElPTgkJMHgzMwkvKiBJU08gZm9ybWF0ICh3aGljaCBpcyBhIGNsZWFuIHdheSB0bworCQkJCQkgKiBwYWNrIG1vcmUgc2VjdG9ycyBvbiBhIHRyYWNrKSAqLworCisvKiBETUEgY29tbWFuZHMgKi8KKyNkZWZpbmUgRE1BX1JFQUQJMHg0NgorI2RlZmluZSBETUFfV1JJVEUJMHg0QQorCisvKiBGREMgdmVyc2lvbiByZXR1cm4gdHlwZXMgKi8KKyNkZWZpbmUgRkRDX05PTkUJMHgwMAorI2RlZmluZSBGRENfVU5LTk9XTgkweDEwCS8qIERPIE5PVCBVU0UgVEhJUyBUWVBFIEVYQ0VQVCBJRiBJREVOVElGSUNBVElPTgorCQkJCSAgIEZBSUxTIEVBUkxZICovCisjZGVmaW5lIEZEQ184MjcyQQkweDIwCS8qIEludGVsIDgyNzJhLCBORUMgNzY1ICovCisjZGVmaW5lIEZEQ183NjVFRAkweDMwCS8qIE5vbi1JbnRlbCAxTUItY29tcGF0aWJsZSBGREMsIGNhbid0IGRldGVjdCAqLworI2RlZmluZSBGRENfODIwNzIJMHg0MAkvKiBJbnRlbCA4MjA3MjsgODI3MmEgKyBGSUZPICsgRFVNUFJFR1MgKi8KKyNkZWZpbmUgRkRDXzgyMDcyQQkweDQ1CS8qIDgyMDcyQSAob24gU3BhcmNzKSAqLworI2RlZmluZSBGRENfODIwNzdfT1JJRwkweDUxCS8qIE9yaWdpbmFsIHZlcnNpb24gb2YgODIwNzdBQSwgc2FucyBMT0NLICovCisjZGVmaW5lIEZEQ184MjA3NwkweDUyCS8qIDgyMDc3QUEtMSAqLworI2RlZmluZSBGRENfODIwNzhfVU5LTgkweDVmCS8qIFVua25vd24gODIwNzggdmFyaWFudCAqLworI2RlZmluZSBGRENfODIwNzgJMHg2MAkvKiA0NHBpbiA4MjA3OCBvciA2NHBpbiA4MjA3OFNMICovCisjZGVmaW5lIEZEQ184MjA3OF8xCTB4NjEJLyogODIwNzgtMSAoMk1icHMgZmRjKSAqLworI2RlZmluZSBGRENfUzgyMDc4QgkweDYyCS8qIFM4MjA3OEIgKGZpcnN0IHNlZW4gb24gQWRhcHRlYyBBVkEtMjgyNSBWTEIKKwkJCQkgKiBTQ1NJL0VJREUvRmxvcHB5IGNvbnRyb2xsZXIpICovCisjZGVmaW5lIEZEQ184NzMwNgkweDYzCS8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEMgODczMDYgKi8KKworLyoKKyAqIEJld2FyZTogdGhlIGZkYyB0eXBlIGxpc3QgaXMgcm91Z2hseSBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmZWF0dXJlcy4KKyAqIFByZXNlbmNlIG9mIGZlYXR1cmVzIGlzIHRlc3RlZCBieSBjb21wYXJpbmcgdGhlIEZEQyB2ZXJzaW9uIGlkIHdpdGggdGhlCisgKiAib2xkZXN0IiB2ZXJzaW9uIHRoYXQgaGFzIHRoZSBuZWVkZWQgZmVhdHVyZS4KKyAqIElmIGR1cmluZyBGREMgZGV0ZWN0aW9uLCBhbiBvYnNjdXJlIHRlc3QgZmFpbHMgbGF0ZSBpbiB0aGUgc2VxdWVuY2UsIGRvbid0CisgKiBhc3NpZ24gRkRDX1VOS05PV04uIEVsc2UgdGhlIEZEQyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBkdW1iIDgyNzJhLCBvciB3b3JzZS4KKyAqIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGlmIHRoZSB0ZXN0cyBhcmUgdW5uZWVkZWQuCisgKi8KKworI2RlZmluZSBGRF9SRVNFVF9ERUxBWSAyMAorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpYl9ydWxlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I2MDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWJfcnVsZXMuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9fTElOVVhfRklCX1JVTEVTX0gKKyNkZWZpbmUgX19MSU5VWF9GSUJfUlVMRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworLyogcnVsZSBpcyBwZXJtYW5lbnQsIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCAqLworI2RlZmluZSBGSUJfUlVMRV9QRVJNQU5FTlQJMHgwMDAwMDAwMQorI2RlZmluZSBGSUJfUlVMRV9JTlZFUlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRklCX1JVTEVfVU5SRVNPTFZFRAkweDAwMDAwMDA0CisjZGVmaW5lIEZJQl9SVUxFX0RFVl9ERVRBQ0hFRAkweDAwMDAwMDA4CisKKy8qIHRyeSB0byBmaW5kIHNvdXJjZSBhZGRyZXNzIGluIHJvdXRpbmcgbG9va3VwcyAqLworI2RlZmluZSBGSUJfUlVMRV9GSU5EX1NBRERSCTB4MDAwMTAwMDAKKworc3RydWN0IGZpYl9ydWxlX2hkcgoreworCV9fdTgJCWZhbWlseTsKKwlfX3U4CQlkc3RfbGVuOworCV9fdTgJCXNyY19sZW47CisJX191OAkJdG9zOworCisJX191OAkJdGFibGU7CisJX191OAkJcmVzMTsJLyogcmVzZXJ2ZWQgKi8KKwlfX3U4CQlyZXMyOwkvKiByZXNlcnZlZCAqLworCV9fdTgJCWFjdGlvbjsKKworCV9fdTMyCQlmbGFnczsKK307CisKK2VudW0KK3sKKwlGUkFfVU5TUEVDLAorCUZSQV9EU1QsCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlGUkFfU1JDLAkvKiBzb3VyY2UgYWRkcmVzcyAqLworCUZSQV9JRk5BTUUsCS8qIGludGVyZmFjZSBuYW1lICovCisJRlJBX0dPVE8sCS8qIHRhcmdldCB0byBqdW1wIHRvIChGUl9BQ1RfR09UTykgKi8KKwlGUkFfVU5VU0VEMiwKKwlGUkFfUFJJT1JJVFksCS8qIHByaW9yaXR5L3ByZWZlcmVuY2UgKi8KKwlGUkFfVU5VU0VEMywKKwlGUkFfVU5VU0VENCwKKwlGUkFfVU5VU0VENSwKKwlGUkFfRldNQVJLLAkvKiBtYXJrICovCisJRlJBX0ZMT1csCS8qIGZsb3cvY2xhc3MgaWQgKi8KKwlGUkFfVU5VU0VENiwKKwlGUkFfVU5VU0VENywKKwlGUkFfVU5VU0VEOCwKKwlGUkFfVEFCTEUsCS8qIEV4dGVuZGVkIHRhYmxlIGlkICovCisJRlJBX0ZXTUFTSywJLyogbWFzayBmb3IgbmV0ZmlsdGVyIG1hcmsgKi8KKwlfX0ZSQV9NQVgKK307CisKKyNkZWZpbmUgRlJBX01BWCAoX19GUkFfTUFYIC0gMSkKKworZW51bQoreworCUZSX0FDVF9VTlNQRUMsCisJRlJfQUNUX1RPX1RCTCwJCS8qIFBhc3MgdG8gZml4ZWQgdGFibGUgKi8KKwlGUl9BQ1RfR09UTywJCS8qIEp1bXAgdG8gYW5vdGhlciBydWxlICovCisJRlJfQUNUX05PUCwJCS8qIE5vIG9wZXJhdGlvbiAqLworCUZSX0FDVF9SRVMzLAorCUZSX0FDVF9SRVM0LAorCUZSX0FDVF9CTEFDS0hPTEUsCS8qIERyb3Agd2l0aG91dCBub3RpZmljYXRpb24gKi8KKwlGUl9BQ1RfVU5SRUFDSEFCTEUsCS8qIERyb3Agd2l0aCBFTkVUVU5SRUFDSCAqLworCUZSX0FDVF9QUk9ISUJJVCwJLyogRHJvcCB3aXRoIEVBQ0NFUyAqLworCV9fRlJfQUNUX01BWCwKK307CisKKyNkZWZpbmUgRlJfQUNUX01BWCAoX19GUl9BQ1RfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTM2MGNiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maWx0ZXIuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpbnV4IFNvY2tldCBGaWx0ZXIgRGF0YSBTdHJ1Y3R1cmVzCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0ZJTFRFUl9IX18KKyNkZWZpbmUgX19MSU5VWF9GSUxURVJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGZpbHRlciBjb2RlIGFyY2hpdGVjdHVyZS4KKyAqLworI2RlZmluZSBCUEZfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIEJQRl9NSU5PUl9WRVJTSU9OIDEKKworLyoKKyAqCVRyeSBhbmQga2VlcCB0aGVzZSB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMgc2ltaWxhciB0byBCU0QsIGVzcGVjaWFsbHkKKyAqCXRoZSBCUEYgY29kZSBkZWZpbml0aW9ucyB3aGljaCBuZWVkIHRvIG1hdGNoIHNvIHlvdSBjYW4gc2hhcmUgZmlsdGVycworICovCisgCitzdHJ1Y3Qgc29ja19maWx0ZXIJLyogRmlsdGVyIGJsb2NrICovCit7CisJX191MTYJY29kZTsgICAvKiBBY3R1YWwgZmlsdGVyIGNvZGUgKi8KKwlfX3U4CWp0OwkvKiBKdW1wIHRydWUgKi8KKwlfX3U4CWpmOwkvKiBKdW1wIGZhbHNlICovCisJX191MzIJazsgICAgICAvKiBHZW5lcmljIG11bHRpdXNlIGZpZWxkICovCit9OworCitzdHJ1Y3Qgc29ja19mcHJvZwkvKiBSZXF1aXJlZCBmb3IgU09fQVRUQUNIX0ZJTFRFUi4gKi8KK3sKKwl1bnNpZ25lZCBzaG9ydAkJbGVuOwkvKiBOdW1iZXIgb2YgZmlsdGVyIGJsb2NrcyAqLworCXN0cnVjdCBzb2NrX2ZpbHRlciAqZmlsdGVyOworfTsKKworCisvKgorICogSW5zdHJ1Y3Rpb24gY2xhc3NlcworICovCisKKyNkZWZpbmUgQlBGX0NMQVNTKGNvZGUpICgoY29kZSkgJiAweDA3KQorI2RlZmluZSAgICAgICAgIEJQRl9MRCAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX0xEWCAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgICAgICBCUEZfU1QgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIEJQRl9TVFggICAgICAgICAweDAzCisjZGVmaW5lICAgICAgICAgQlBGX0FMVSAgICAgICAgIDB4MDQKKyNkZWZpbmUgICAgICAgICBCUEZfSk1QICAgICAgICAgMHgwNQorI2RlZmluZSAgICAgICAgIEJQRl9SRVQgICAgICAgICAweDA2CisjZGVmaW5lICAgICAgICAgQlBGX01JU0MgICAgICAgIDB4MDcKKworLyogbGQvbGR4IGZpZWxkcyAqLworI2RlZmluZSBCUEZfU0laRShjb2RlKSAgKChjb2RlKSAmIDB4MTgpCisjZGVmaW5lICAgICAgICAgQlBGX1cgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBCUEZfSCAgICAgICAgICAgMHgwOAorI2RlZmluZSAgICAgICAgIEJQRl9CICAgICAgICAgICAweDEwCisjZGVmaW5lIEJQRl9NT0RFKGNvZGUpICAoKGNvZGUpICYgMHhlMCkKKyNkZWZpbmUgICAgICAgICBCUEZfSU1NICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIEJQRl9BQlMgICAgICAgICAweDIwCisjZGVmaW5lICAgICAgICAgQlBGX0lORCAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgICAgICBCUEZfTUVNICAgICAgICAgMHg2MAorI2RlZmluZSAgICAgICAgIEJQRl9MRU4gICAgICAgICAweDgwCisjZGVmaW5lICAgICAgICAgQlBGX01TSCAgICAgICAgIDB4YTAKKworLyogYWx1L2ptcCBmaWVsZHMgKi8KKyNkZWZpbmUgQlBGX09QKGNvZGUpICAgICgoY29kZSkgJiAweGYwKQorI2RlZmluZSAgICAgICAgIEJQRl9BREQgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX1NVQiAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICAgICBCUEZfTVVMICAgICAgICAgMHgyMAorI2RlZmluZSAgICAgICAgIEJQRl9ESVYgICAgICAgICAweDMwCisjZGVmaW5lICAgICAgICAgQlBGX09SICAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgICAgICBCUEZfQU5EICAgICAgICAgMHg1MAorI2RlZmluZSAgICAgICAgIEJQRl9MU0ggICAgICAgICAweDYwCisjZGVmaW5lICAgICAgICAgQlBGX1JTSCAgICAgICAgIDB4NzAKKyNkZWZpbmUgICAgICAgICBCUEZfTkVHICAgICAgICAgMHg4MAorI2RlZmluZSAgICAgICAgIEJQRl9KQSAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX0pFUSAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICAgICBCUEZfSkdUICAgICAgICAgMHgyMAorI2RlZmluZSAgICAgICAgIEJQRl9KR0UgICAgICAgICAweDMwCisjZGVmaW5lICAgICAgICAgQlBGX0pTRVQgICAgICAgIDB4NDAKKyNkZWZpbmUgQlBGX1NSQyhjb2RlKSAgICgoY29kZSkgJiAweDA4KQorI2RlZmluZSAgICAgICAgIEJQRl9LICAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQlBGX1ggICAgICAgICAgIDB4MDgKKworLyogcmV0IC0gQlBGX0sgYW5kIEJQRl9YIGFsc28gYXBwbHkgKi8KKyNkZWZpbmUgQlBGX1JWQUwoY29kZSkgICgoY29kZSkgJiAweDE4KQorI2RlZmluZSAgICAgICAgIEJQRl9BICAgICAgICAgICAweDEwCisKKy8qIG1pc2MgKi8KKyNkZWZpbmUgQlBGX01JU0NPUChjb2RlKSAoKGNvZGUpICYgMHhmOCkKKyNkZWZpbmUgICAgICAgICBCUEZfVEFYICAgICAgICAgMHgwMAorI2RlZmluZSAgICAgICAgIEJQRl9UWEEgICAgICAgICAweDgwCisKKyNpZm5kZWYgQlBGX01BWElOU05TCisjZGVmaW5lIEJQRl9NQVhJTlNOUyA0MDk2CisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgZmlsdGVyIGJsb2NrIGFycmF5IGluaXRpYWxpemVycy4KKyAqLworI2lmbmRlZiBCUEZfU1RNVAorI2RlZmluZSBCUEZfU1RNVChjb2RlLCBrKSB7ICh1bnNpZ25lZCBzaG9ydCkoY29kZSksIDAsIDAsIGsgfQorI2VuZGlmCisjaWZuZGVmIEJQRl9KVU1QCisjZGVmaW5lIEJQRl9KVU1QKGNvZGUsIGssIGp0LCBqZikgeyAodW5zaWduZWQgc2hvcnQpKGNvZGUpLCBqdCwgamYsIGsgfQorI2VuZGlmCisKKy8qCisgKiBOdW1iZXIgb2Ygc2NyYXRjaCBtZW1vcnkgd29yZHMgZm9yOiBCUEZfU1QgYW5kIEJQRl9TVFgKKyAqLworI2RlZmluZSBCUEZfTUVNV09SRFMgMTYKKworLyogUkFUSU9OQUxFLiBOZWdhdGl2ZSBvZmZzZXRzIGFyZSBpbnZhbGlkIGluIEJQRi4KKyAgIFdlIHVzZSB0aGVtIHRvIHJlZmVyZW5jZSBhbmNpbGxhcnkgZGF0YS4KKyAgIFVubGlrZSBpbnRyb2R1Y3Rpb24gbmV3IGluc3RydWN0aW9ucywgaXQgZG9lcyBub3QgYnJlYWsKKyAgIGV4aXN0aW5nIGNvbXBpbGVycy9vcHRpbWl6ZXJzLgorICovCisjZGVmaW5lIFNLRl9BRF9PRkYgICAgKC0weDEwMDApCisjZGVmaW5lIFNLRl9BRF9QUk9UT0NPTCAwCisjZGVmaW5lIFNLRl9BRF9QS1RUWVBFIAk0CisjZGVmaW5lIFNLRl9BRF9JRklOREVYIAk4CisjZGVmaW5lIFNLRl9BRF9NQVggCTEyCisjZGVmaW5lIFNLRl9ORVRfT0ZGICAgKC0weDEwMDAwMCkKKyNkZWZpbmUgU0tGX0xMX09GRiAgICAoLTB4MjAwMDAwKQorCisKKyNlbmRpZiAvKiBfX0xJTlVYX0ZJTFRFUl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maXJld2lyZS1jZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwZTI3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmlyZXdpcmUtY2Rldi5oCkBAIC0wLDAgKzEsNDc3IEBACisvKgorICogQ2hhciBkZXZpY2UgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBLcmlzdGlhbiBIb2Vnc2JlcmcgPGtyaEBiaXRwbGFuZXQubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTElOVVhfRklSRVdJUkVfQ0RFVl9ICisjZGVmaW5lIF9MSU5VWF9GSVJFV0lSRV9DREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJld2lyZS1jb25zdGFudHMuaD4KKworI2RlZmluZSBGV19DREVWX0VWRU5UX0JVU19SRVNFVAkJMHgwMAorI2RlZmluZSBGV19DREVWX0VWRU5UX1JFU1BPTlNFCQkweDAxCisjZGVmaW5lIEZXX0NERVZfRVZFTlRfUkVRVUVTVAkJMHgwMgorI2RlZmluZSBGV19DREVWX0VWRU5UX0lTT19JTlRFUlJVUFQJMHgwMworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X2NvbW1vbiAtIENvbW1vbiBwYXJ0IG9mIGFsbCBmd19jZGV2X2V2ZW50XyB0eXBlcworICogQGNsb3N1cmU6CUZvciBhcmJpdHJhcnkgdXNlIGJ5IHVzZXJzcGFjZQorICogQHR5cGU6CURpc2NyaW1pbmF0ZXMgdGhlIGZ3X2NkZXZfZXZlbnRfIHR5cGVzCisgKgorICogVGhpcyBzdHJ1Y3QgbWF5IGJlIHVzZWQgdG8gYWNjZXNzIGdlbmVyaWMgbWVtYmVycyBvZiBhbGwgZndfY2Rldl9ldmVudF8KKyAqIHR5cGVzIHJlZ2FyZGxlc3Mgb2YgdGhlIHNwZWNpZmljIHR5cGUuCisgKgorICogRGF0YSBwYXNzZWQgaW4gdGhlIEBjbG9zdXJlIGZpZWxkIGZvciBhIHJlcXVlc3Qgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZXZlbnQuICBJdCBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgYSBwb2ludGVyIG9uIGFsbCBwbGF0Zm9ybXMuCisgKiBUaGUgaW9jdGwgdXNlZCB0byBzZXQgQGNsb3N1cmUgZGVwZW5kcyBvbiB0aGUgQHR5cGUgb2YgZXZlbnQuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X2NvbW1vbiB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9idXNfcmVzZXQgLSBTZW50IHdoZW4gYSBidXMgcmVzZXQgb2NjdXJyZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBzZXQgYnkgJUZXX0NERVZfSU9DX0dFVF9JTkZPIGlvY3RsCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX0JVU19SRVNFVAorICogQG5vZGVfaWQ6ICAgICAgIE5ldyBub2RlIElEIG9mIHRoaXMgbm9kZQorICogQGxvY2FsX25vZGVfaWQ6IE5vZGUgSUQgb2YgdGhlIGxvY2FsIG5vZGUsIGkuZS4gb2YgdGhlIGNvbnRyb2xsZXIKKyAqIEBibV9ub2RlX2lkOiAgICBOb2RlIElEIG9mIHRoZSBidXMgbWFuYWdlcgorICogQGlybV9ub2RlX2lkOiAgIE5vZGUgSUQgb2YgdGhlIGlzbyByZXNvdXJjZSBtYW5hZ2VyCisgKiBAcm9vdF9ub2RlX2lkOiAgTm9kZSBJRCBvZiB0aGUgcm9vdCBub2RlCisgKiBAZ2VuZXJhdGlvbjogICAgTmV3IGJ1cyBnZW5lcmF0aW9uCisgKgorICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGJ1cyB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gZ29lcyB0aHJvdWdoIGEgYnVzCisgKiByZXNldC4gIEl0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgYnVzIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMKKyAqIG5ldyBub2RlIElEIGZvciB0aGlzIGRldmljZSwgbmV3IHJvb3QgSUQsIGFuZCBvdGhlcnMuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X2J1c19yZXNldCB7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIG5vZGVfaWQ7CisJX191MzIgbG9jYWxfbm9kZV9pZDsKKwlfX3UzMiBibV9ub2RlX2lkOworCV9fdTMyIGlybV9ub2RlX2lkOworCV9fdTMyIHJvb3Rfbm9kZV9pZDsKKwlfX3UzMiBnZW5lcmF0aW9uOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXNwb25zZSAtIFNlbnQgd2hlbiBhIHJlc3BvbnNlIHBhY2tldCB3YXMgcmVjZWl2ZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOworICoJCXNldCBieSAlRldfQ0RFVl9JT0NfU0VORF9SRVFVRVNUIGlvY3RsCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX1JFU1BPTlNFCisgKiBAcmNvZGU6CVJlc3BvbnNlIGNvZGUgcmV0dXJuZWQgYnkgdGhlIHJlbW90ZSBub2RlCisgKiBAbGVuZ3RoOglEYXRhIGxlbmd0aCwgaS5lLiB0aGUgcmVzcG9uc2UncyBwYXlsb2FkIHNpemUgaW4gYnl0ZXMKKyAqIEBkYXRhOglQYXlsb2FkIGRhdGEsIGlmIGFueQorICoKKyAqIFRoaXMgZXZlbnQgaXMgc2VudCB3aGVuIHRoZSBzdGFjayByZWNlaXZlcyBhIHJlc3BvbnNlIHRvIGFuIG91dGdvaW5nIHJlcXVlc3QKKyAqIHNlbnQgYnkgJUZXX0NERVZfSU9DX1NFTkRfUkVRVUVTVCBpb2N0bC4gIFRoZSBwYXlsb2FkIGRhdGEgZm9yIHJlc3BvbnNlcworICogY2FycnlpbmcgZGF0YSAocmVhZCBhbmQgbG9jayByZXNwb25zZXMpIGZvbGxvd3MgaW1tZWRpYXRlbHkgYW5kIGNhbiBiZQorICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgQGRhdGEgZmllbGQuCisgKi8KK3N0cnVjdCBmd19jZGV2X2V2ZW50X3Jlc3BvbnNlIHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgcmNvZGU7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGRhdGFbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2V2ZW50X3JlcXVlc3QgLSBTZW50IG9uIGluY29taW5nIHJlcXVlc3QgdG8gYW4gYWRkcmVzcyByZWdpb24KKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBzZXQgYnkgJUZXX0NERVZfSU9DX0FMTE9DQVRFIGlvY3RsCisgKiBAdHlwZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsgYWx3YXlzICVGV19DREVWX0VWRU5UX1JFUVVFU1QKKyAqIEB0Y29kZToJVHJhbnNhY3Rpb24gY29kZSBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdAorICogQG9mZnNldDoJVGhlIG9mZnNldCBpbnRvIHRoZSA0OC1iaXQgcGVyLW5vZGUgYWRkcmVzcyBzcGFjZQorICogQGhhbmRsZToJUmVmZXJlbmNlIHRvIHRoZSBrZXJuZWwtc2lkZSBwZW5kaW5nIHJlcXVlc3QKKyAqIEBsZW5ndGg6CURhdGEgbGVuZ3RoLCBpLmUuIHRoZSByZXF1ZXN0J3MgcGF5bG9hZCBzaXplIGluIGJ5dGVzCisgKiBAZGF0YToJSW5jb21pbmcgZGF0YSwgaWYgYW55CisgKgorICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIHN0YWNrIHJlY2VpdmVzIGFuIGluY29taW5nIHJlcXVlc3QgdG8gYW4gYWRkcmVzcworICogcmVnaW9uIHJlZ2lzdGVyZWQgdXNpbmcgdGhlICVGV19DREVWX0lPQ19BTExPQ0FURSBpb2N0bC4gIFRoZSByZXF1ZXN0IGlzCisgKiBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlbHkgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgcmVnaW9uLiAgVXNlcnNwYWNlIGlzCisgKiByZXNwb25zaWJsZSBmb3Igc2VuZGluZyB0aGUgcmVzcG9uc2UgYnkgJUZXX0NERVZfSU9DX1NFTkRfUkVTUE9OU0UgaW9jdGwsCisgKiB1c2luZyB0aGUgc2FtZSBAaGFuZGxlLgorICoKKyAqIFRoZSBwYXlsb2FkIGRhdGEgZm9yIHJlcXVlc3RzIGNhcnJ5aW5nIGRhdGEgKHdyaXRlIGFuZCBsb2NrIHJlcXVlc3RzKQorICogZm9sbG93cyBpbW1lZGlhdGVseSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIEBkYXRhIGZpZWxkLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9yZXF1ZXN0IHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgdGNvZGU7CisJX191NjQgb2Zmc2V0OworCV9fdTMyIGhhbmRsZTsKKwlfX3UzMiBsZW5ndGg7CisJX191MzIgZGF0YVswXTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZXZlbnRfaXNvX2ludGVycnVwdCAtIFNlbnQgd2hlbiBhbiBpc28gcGFja2V0IHdhcyBjb21wbGV0ZWQKKyAqIEBjbG9zdXJlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOworICoJCXNldCBieSAlRldfQ0RFVl9DUkVBVEVfSVNPX0NPTlRFWFQgaW9jdGwKKyAqIEB0eXBlOglTZWUgJmZ3X2NkZXZfZXZlbnRfY29tbW9uOyBhbHdheXMgJUZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVAorICogQGN5Y2xlOglDeWNsZSBjb3VudGVyIG9mIHRoZSBpbnRlcnJ1cHQgcGFja2V0CisgKiBAaGVhZGVyX2xlbmd0aDogVG90YWwgbGVuZ3RoIG9mIGZvbGxvd2luZyBoZWFkZXJzLCBpbiBieXRlcworICogQGhlYWRlcjoJU3RyaXBwZWQgaGVhZGVycywgaWYgYW55CisgKgorICogVGhpcyBldmVudCBpcyBzZW50IHdoZW4gdGhlIGNvbnRyb2xsZXIgaGFzIGNvbXBsZXRlZCBhbiAmZndfY2Rldl9pc29fcGFja2V0CisgKiB3aXRoIHRoZSAlRldfQ0RFVl9JU09fSU5URVJSVVBUIGJpdCBzZXQuICBJbiB0aGUgcmVjZWl2ZSBjYXNlLCB0aGUgaGVhZGVycworICogc3RyaXBwZWQgb2YgYWxsIHBhY2tldHMgdXAgdW50aWwgYW5kIGluY2x1ZGluZyB0aGUgaW50ZXJydXB0IHBhY2tldCBhcmUKKyAqIHJldHVybmVkIGluIHRoZSBAaGVhZGVyIGZpZWxkLgorICovCitzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0IHsKKwlfX3U2NCBjbG9zdXJlOworCV9fdTMyIHR5cGU7CisJX191MzIgY3ljbGU7CisJX191MzIgaGVhZGVyX2xlbmd0aDsKKwlfX3UzMiBoZWFkZXJbMF07Cit9OworCisvKioKKyAqIHVuaW9uIGZ3X2NkZXZfZXZlbnQgLSBDb252ZW5pZW5jZSB1bmlvbiBvZiBmd19jZGV2X2V2ZW50XyB0eXBlcworICogQGNvbW1vbjogICAgICAgIFZhbGlkIGZvciBhbGwgdHlwZXMKKyAqIEBidXNfcmVzZXQ6ICAgICBWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0gJUZXX0NERVZfRVZFTlRfQlVTX1JFU0VUCisgKiBAcmVzcG9uc2U6ICAgICAgVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX1JFU1BPTlNFCisgKiBAcmVxdWVzdDogICAgICAgVmFsaWQgaWYgQGNvbW1vbi50eXBlID09ICVGV19DREVWX0VWRU5UX1JFUVVFU1QKKyAqIEBpc29faW50ZXJydXB0OiBWYWxpZCBpZiBAY29tbW9uLnR5cGUgPT0gJUZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVAorICoKKyAqIENvbnZlbmllbmNlIHVuaW9uIGZvciB1c2Vyc3BhY2UgdXNlLiAgRXZlbnRzIGNvdWxkIGJlIHJlYWQoMikgaW50byBhIGNoYXIKKyAqIGJ1ZmZlciBhbmQgdGhlbiBjYXN0IHRvIHRoaXMgdW5pb24gZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqLwordW5pb24gZndfY2Rldl9ldmVudCB7CisJc3RydWN0IGZ3X2NkZXZfZXZlbnRfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9idXNfcmVzZXQgYnVzX3Jlc2V0OworCXN0cnVjdCBmd19jZGV2X2V2ZW50X3Jlc3BvbnNlIHJlc3BvbnNlOworCXN0cnVjdCBmd19jZGV2X2V2ZW50X3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZndfY2Rldl9ldmVudF9pc29faW50ZXJydXB0IGlzb19pbnRlcnJ1cHQ7Cit9OworCisjZGVmaW5lIEZXX0NERVZfSU9DX0dFVF9JTkZPCQlfSU9XUignIycsIDB4MDAsIHN0cnVjdCBmd19jZGV2X2dldF9pbmZvKQorI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX1JFUVVFU1QJX0lPVygnIycsIDB4MDEsIHN0cnVjdCBmd19jZGV2X3NlbmRfcmVxdWVzdCkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfQUxMT0NBVEUJCV9JT1dSKCcjJywgMHgwMiwgc3RydWN0IGZ3X2NkZXZfYWxsb2NhdGUpCisjZGVmaW5lIEZXX0NERVZfSU9DX0RFQUxMT0NBVEUJCV9JT1coJyMnLCAweDAzLCBzdHJ1Y3QgZndfY2Rldl9kZWFsbG9jYXRlKQorI2RlZmluZSBGV19DREVWX0lPQ19TRU5EX1JFU1BPTlNFCV9JT1coJyMnLCAweDA0LCBzdHJ1Y3QgZndfY2Rldl9zZW5kX3Jlc3BvbnNlKQorI2RlZmluZSBGV19DREVWX0lPQ19JTklUSUFURV9CVVNfUkVTRVQJX0lPVygnIycsIDB4MDUsIHN0cnVjdCBmd19jZGV2X2luaXRpYXRlX2J1c19yZXNldCkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfQUREX0RFU0NSSVBUT1IJX0lPV1IoJyMnLCAweDA2LCBzdHJ1Y3QgZndfY2Rldl9hZGRfZGVzY3JpcHRvcikKKyNkZWZpbmUgRldfQ0RFVl9JT0NfUkVNT1ZFX0RFU0NSSVBUT1IJX0lPVygnIycsIDB4MDcsIHN0cnVjdCBmd19jZGV2X3JlbW92ZV9kZXNjcmlwdG9yKQorCisjZGVmaW5lIEZXX0NERVZfSU9DX0NSRUFURV9JU09fQ09OVEVYVAlfSU9XUignIycsIDB4MDgsIHN0cnVjdCBmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dCkKKyNkZWZpbmUgRldfQ0RFVl9JT0NfUVVFVUVfSVNPCQlfSU9XUignIycsIDB4MDksIHN0cnVjdCBmd19jZGV2X3F1ZXVlX2lzbykKKyNkZWZpbmUgRldfQ0RFVl9JT0NfU1RBUlRfSVNPCQlfSU9XKCcjJywgMHgwYSwgc3RydWN0IGZ3X2NkZXZfc3RhcnRfaXNvKQorI2RlZmluZSBGV19DREVWX0lPQ19TVE9QX0lTTwkJX0lPVygnIycsIDB4MGIsIHN0cnVjdCBmd19jZGV2X3N0b3BfaXNvKQorI2RlZmluZSBGV19DREVWX0lPQ19HRVRfQ1lDTEVfVElNRVIJX0lPUignIycsIDB4MGMsIHN0cnVjdCBmd19jZGV2X2dldF9jeWNsZV90aW1lcikKKworLyogRldfQ0RFVl9WRVJTSU9OIEhpc3RvcnkKKyAqCisgKiAxCUZlYiAxOCwgMjAwNzogIEluaXRpYWwgdmVyc2lvbi4KKyAqLworI2RlZmluZSBGV19DREVWX1ZFUlNJT04JCTEKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9nZXRfaW5mbyAtIEdlbmVyYWwgcHVycG9zZSBpbmZvcm1hdGlvbiBpb2N0bAorICogQHZlcnNpb246CVRoZSB2ZXJzaW9uIGZpZWxkIGlzIGp1c3QgYSBydW5uaW5nIHNlcmlhbCBudW1iZXIuCisgKgkJV2UgbmV2ZXIgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBtYXkgYWRkIG1vcmUKKyAqCQlzdHJ1Y3RzIGFuZCBpb2N0bHMgaW4gbGF0ZXIgcmV2aXNpb25zLgorICogQHJvbV9sZW5ndGg6CUlmIEByb20gaXMgbm9uLXplcm8sIGF0IG1vc3Qgcm9tX2xlbmd0aCBieXRlcyBvZiBjb25maWd1cmF0aW9uCisgKgkJUk9NIHdpbGwgYmUgY29waWVkIGludG8gdGhhdCB1c2VyIHNwYWNlIGFkZHJlc3MuICBJbiBlaXRoZXIKKyAqCQljYXNlLCBAcm9tX2xlbmd0aCBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlCisgKgkJY29uZmlndXJhdGlvbiBST00uCisgKiBAcm9tOglJZiBub24temVybywgYWRkcmVzcyBvZiBhIGJ1ZmZlciB0byBiZSBmaWxsZWQgYnkgYSBjb3B5IG9mIHRoZQorICoJCWxvY2FsIG5vZGUncyBjb25maWd1cmF0aW9uIFJPTQorICogQGJ1c19yZXNldDoJSWYgbm9uLXplcm8sIGFkZHJlc3Mgb2YgYSBidWZmZXIgdG8gYmUgZmlsbGVkIGJ5IGEKKyAqCQkmc3RydWN0IGZ3X2NkZXZfZXZlbnRfYnVzX3Jlc2V0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUKKyAqCQlvZiB0aGUgYnVzLiAgVGhpcyBkb2VzIG5vdCBjYXVzZSBhIGJ1cyByZXNldCB0byBoYXBwZW4uCisgKiBAYnVzX3Jlc2V0X2Nsb3N1cmU6IFZhbHVlIG9mICZjbG9zdXJlIGluIHRoaXMgYW5kIHN1YnNlcXVlbnQgYnVzIHJlc2V0IGV2ZW50cworICogQGNhcmQ6CVRoZSBpbmRleCBvZiB0aGUgY2FyZCB0aGlzIGRldmljZSBiZWxvbmdzIHRvCisgKi8KK3N0cnVjdCBmd19jZGV2X2dldF9pbmZvIHsKKwlfX3UzMiB2ZXJzaW9uOworCV9fdTMyIHJvbV9sZW5ndGg7CisJX191NjQgcm9tOworCV9fdTY0IGJ1c19yZXNldDsKKwlfX3U2NCBidXNfcmVzZXRfY2xvc3VyZTsKKwlfX3UzMiBjYXJkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9zZW5kX3JlcXVlc3QgLSBTZW5kIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHBhY2tldAorICogQHRjb2RlOglUcmFuc2FjdGlvbiBjb2RlIG9mIHRoZSByZXF1ZXN0CisgKiBAbGVuZ3RoOglMZW5ndGggb2Ygb3V0Z29pbmcgcGF5bG9hZCwgaW4gYnl0ZXMKKyAqIEBvZmZzZXQ6CTQ4LWJpdCBvZmZzZXQgYXQgZGVzdGluYXRpb24gbm9kZQorICogQGNsb3N1cmU6CVBhc3NlZCBiYWNrIHRvIHVzZXJzcGFjZSBpbiB0aGUgcmVzcG9uc2UgZXZlbnQKKyAqIEBkYXRhOglVc2Vyc3BhY2UgcG9pbnRlciB0byBwYXlsb2FkCisgKiBAZ2VuZXJhdGlvbjoJVGhlIGJ1cyBnZW5lcmF0aW9uIHdoZXJlIHBhY2tldCBpcyB2YWxpZAorICoKKyAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBkZXZpY2UuICBUaGlzIGlvY3RsIGltcGxlbWVudHMgYWxsIG91dGdvaW5nIHJlcXVlc3RzLgorICogQm90aCBxdWFkbGV0IGFuZCBibG9jayByZXF1ZXN0IHNwZWNpZnkgdGhlIHBheWxvYWQgYXMgYSBwb2ludGVyIHRvIHRoZSBkYXRhCisgKiBpbiB0aGUgQGRhdGEgZmllbGQuICBPbmNlIHRoZSB0cmFuc2FjdGlvbiBjb21wbGV0ZXMsIHRoZSBrZXJuZWwgd3JpdGVzIGFuCisgKiAmZndfY2Rldl9ldmVudF9yZXF1ZXN0IGV2ZW50IGJhY2suICBUaGUgQGNsb3N1cmUgZmllbGQgaXMgcGFzc2VkIGJhY2sgdG8KKyAqIHVzZXIgc3BhY2UgaW4gdGhlIHJlc3BvbnNlIGV2ZW50LgorICovCitzdHJ1Y3QgZndfY2Rldl9zZW5kX3JlcXVlc3QgeworCV9fdTMyIHRjb2RlOworCV9fdTMyIGxlbmd0aDsKKwlfX3U2NCBvZmZzZXQ7CisJX191NjQgY2xvc3VyZTsKKwlfX3U2NCBkYXRhOworCV9fdTMyIGdlbmVyYXRpb247Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3NlbmRfcmVzcG9uc2UgLSBTZW5kIGFuIGFzeW5jaHJvbm91cyByZXNwb25zZSBwYWNrZXQKKyAqIEByY29kZToJUmVzcG9uc2UgY29kZSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSB1c2Vyc3BhY2UgaGFuZGxlcgorICogQGxlbmd0aDoJTGVuZ3RoIG9mIG91dGdvaW5nIHBheWxvYWQsIGluIGJ5dGVzCisgKiBAZGF0YToJVXNlcnNwYWNlIHBvaW50ZXIgdG8gcGF5bG9hZAorICogQGhhbmRsZToJVGhlIGhhbmRsZSBmcm9tIHRoZSAmZndfY2Rldl9ldmVudF9yZXF1ZXN0CisgKgorICogU2VuZCBhIHJlc3BvbnNlIHRvIGFuIGluY29taW5nIHJlcXVlc3QuICBCeSBzZXR0aW5nIHVwIGFuIGFkZHJlc3MgcmFuZ2UgdXNpbmcKKyAqIHRoZSAlRldfQ0RFVl9JT0NfQUxMT0NBVEUgaW9jdGwsIHVzZXJzcGFjZSBjYW4gbGlzdGVuIGZvciBpbmNvbWluZyByZXF1ZXN0cy4gIEFuCisgKiBpbmNvbWluZyByZXF1ZXN0IHdpbGwgZ2VuZXJhdGUgYW4gJUZXX0NERVZfRVZFTlRfUkVRVUVTVCwgYW5kIHVzZXJzcGFjZSBtdXN0CisgKiBzZW5kIGEgcmVwbHkgdXNpbmcgdGhpcyBpb2N0bC4gIFRoZSBldmVudCBoYXMgYSBoYW5kbGUgdG8gdGhlIGtlcm5lbC1zaWRlCisgKiBwZW5kaW5nIHRyYW5zYWN0aW9uLCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoaXMgaW9jdGwuCisgKi8KK3N0cnVjdCBmd19jZGV2X3NlbmRfcmVzcG9uc2UgeworCV9fdTMyIHJjb2RlOworCV9fdTMyIGxlbmd0aDsKKwlfX3U2NCBkYXRhOworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfYWxsb2NhdGUgLSBBbGxvY2F0ZSBhIENTUiBhZGRyZXNzIHJhbmdlCisgKiBAb2Zmc2V0OglTdGFydCBvZmZzZXQgb2YgdGhlIGFkZHJlc3MgcmFuZ2UKKyAqIEBjbG9zdXJlOglUbyBiZSBwYXNzZWQgYmFjayB0byB1c2Vyc3BhY2UgaW4gcmVxdWVzdCBldmVudHMKKyAqIEBsZW5ndGg6CUxlbmd0aCBvZiB0aGUgYWRkcmVzcyByYW5nZSwgaW4gYnl0ZXMKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgYWxsb2NhdGlvbiwgd3JpdHRlbiBieSB0aGUga2VybmVsCisgKgorICogQWxsb2NhdGUgYW4gYWRkcmVzcyByYW5nZSBpbiB0aGUgNDgtYml0IGFkZHJlc3Mgc3BhY2Ugb24gdGhlIGxvY2FsIG5vZGUKKyAqICh0aGUgY29udHJvbGxlcikuICBUaGlzIGFsbG93cyB1c2Vyc3BhY2UgdG8gbGlzdGVuIGZvciByZXF1ZXN0cyB3aXRoIGFuCisgKiBvZmZzZXQgd2l0aGluIHRoYXQgYWRkcmVzcyByYW5nZS4gIFdoZW4gdGhlIGtlcm5lbCByZWNlaXZlcyBhIHJlcXVlc3QKKyAqIHdpdGhpbiB0aGUgcmFuZ2UsIGFuICZmd19jZGV2X2V2ZW50X3JlcXVlc3QgZXZlbnQgd2lsbCBiZSB3cml0dGVuIGJhY2suCisgKiBUaGUgQGNsb3N1cmUgZmllbGQgaXMgcGFzc2VkIGJhY2sgdG8gdXNlcnNwYWNlIGluIHRoZSByZXNwb25zZSBldmVudC4KKyAqIFRoZSBAaGFuZGxlIGZpZWxkIGlzIGFuIG91dCBwYXJhbWV0ZXIsIHJldHVybmluZyBhIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkCisgKiByYW5nZSB0byBiZSB1c2VkIGZvciBsYXRlciBkZWFsbG9jYXRpb24gb2YgdGhlIHJhbmdlLgorICovCitzdHJ1Y3QgZndfY2Rldl9hbGxvY2F0ZSB7CisJX191NjQgb2Zmc2V0OworCV9fdTY0IGNsb3N1cmU7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZGVhbGxvY2F0ZSAtIEZyZWUgYW4gYWRkcmVzcyByYW5nZSBhbGxvY2F0aW9uCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGFkZHJlc3MgcmFuZ2UsIGFzIHJldHVybmVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0aGUKKyAqCQlyYW5nZSB3YXMgYWxsb2NhdGVkCisgKi8KK3N0cnVjdCBmd19jZGV2X2RlYWxsb2NhdGUgeworCV9fdTMyIGhhbmRsZTsKK307CisKKyNkZWZpbmUgRldfQ0RFVl9MT05HX1JFU0VUCTAKKyNkZWZpbmUgRldfQ0RFVl9TSE9SVF9SRVNFVAkxCisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfaW5pdGlhdGVfYnVzX3Jlc2V0IC0gSW5pdGlhdGUgYSBidXMgcmVzZXQKKyAqIEB0eXBlOgklRldfQ0RFVl9TSE9SVF9SRVNFVCBvciAlRldfQ0RFVl9MT05HX1JFU0VUCisgKgorICogSW5pdGlhdGUgYSBidXMgcmVzZXQgZm9yIHRoZSBidXMgdGhpcyBkZXZpY2UgaXMgb24uICBUaGUgYnVzIHJlc2V0IGNhbiBiZQorICogZWl0aGVyIHRoZSBvcmlnaW5hbCAobG9uZykgYnVzIHJlc2V0IG9yIHRoZSBhcmJpdHJhdGVkIChzaG9ydCkgYnVzIHJlc2V0CisgKiBpbnRyb2R1Y2VkIGluIDEzOTRhLTIwMDAuCisgKi8KK3N0cnVjdCBmd19jZGV2X2luaXRpYXRlX2J1c19yZXNldCB7CisJX191MzIgdHlwZTsJLyogRldfQ0RFVl9TSE9SVF9SRVNFVCBvciBGV19DREVWX0xPTkdfUkVTRVQgKi8KK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfYWRkX2Rlc2NyaXB0b3IgLSBBZGQgY29udGVudHMgdG8gdGhlIGxvY2FsIG5vZGUncyBjb25maWcgUk9NCisgKiBAaW1tZWRpYXRlOglJZiBub24temVybywgaW1tZWRpYXRlIGtleSB0byBpbnNlcnQgYmVmb3JlIHBvaW50ZXIKKyAqIEBrZXk6CVVwcGVyIDggYml0cyBvZiByb290IGRpcmVjdG9yeSBwb2ludGVyCisgKiBAZGF0YToJVXNlcnNwYWNlIHBvaW50ZXIgdG8gY29udGVudHMgb2YgZGVzY3JpcHRvciBibG9jaworICogQGxlbmd0aDoJTGVuZ3RoIG9mIGRlc2NyaXB0b3IgYmxvY2sgZGF0YSwgaW4gYnl0ZXMKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byB0aGUgZGVzY3JpcHRvciwgd3JpdHRlbiBieSB0aGUga2VybmVsCisgKgorICogQWRkIGEgZGVzY3JpcHRvciBibG9jayBhbmQgb3B0aW9uYWxseSBhIHByZWNlZGluZyBpbW1lZGlhdGUga2V5IHRvIHRoZSBsb2NhbAorICogbm9kZSdzIGNvbmZpZ3VyYXRpb24gUk9NLgorICoKKyAqIFRoZSBAa2V5IGZpZWxkIHNwZWNpZmllcyB0aGUgdXBwZXIgOCBiaXRzIG9mIHRoZSBkZXNjcmlwdG9yIHJvb3QgZGlyZWN0b3J5CisgKiBwb2ludGVyIGFuZCB0aGUgQGRhdGEgYW5kIEBsZW5ndGggZmllbGRzIHNwZWNpZnkgdGhlIGNvbnRlbnRzLiBUaGUgQGtleQorICogc2hvdWxkIGJlIG9mIHRoZSBmb3JtIDB4WFgwMDAwMDAuIFRoZSBvZmZzZXQgcGFydCBvZiB0aGUgcm9vdCBkaXJlY3RvcnkgZW50cnkKKyAqIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZSBrZXJuZWwuCisgKgorICogSWYgbm90IDAsIHRoZSBAaW1tZWRpYXRlIGZpZWxkIHNwZWNpZmllcyBhbiBpbW1lZGlhdGUga2V5IHdoaWNoIHdpbGwgYmUKKyAqIGluc2VydGVkIGJlZm9yZSB0aGUgcm9vdCBkaXJlY3RvcnkgcG9pbnRlci4KKyAqCisgKiBJZiBzdWNjZXNzZnVsLCB0aGUga2VybmVsIGFkZHMgdGhlIGRlc2NyaXB0b3IgYW5kIHdyaXRlcyBiYWNrIGEgaGFuZGxlIHRvIHRoZQorICoga2VybmVsLXNpZGUgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGxhdGVyIHJlbW92YWwgb2YgdGhlIGRlc2NyaXB0b3IgYmxvY2sgYW5kCisgKiBpbW1lZGlhdGUga2V5LgorICovCitzdHJ1Y3QgZndfY2Rldl9hZGRfZGVzY3JpcHRvciB7CisJX191MzIgaW1tZWRpYXRlOworCV9fdTMyIGtleTsKKwlfX3U2NCBkYXRhOworCV9fdTMyIGxlbmd0aDsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3JlbW92ZV9kZXNjcmlwdG9yIC0gUmVtb3ZlIGNvbnRlbnRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gUk9NCisgKiBAaGFuZGxlOglIYW5kbGUgdG8gdGhlIGRlc2NyaXB0b3IsIGFzIHJldHVybmVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0aGUKKyAqCQlkZXNjcmlwdG9yIHdhcyBhZGRlZAorICoKKyAqIFJlbW92ZSBhIGRlc2NyaXB0b3IgYmxvY2sgYW5kIGFjY29tcGFueWluZyBpbW1lZGlhdGUga2V5IGZyb20gdGhlIGxvY2FsCisgKiBub2RlJ3MgY29uZmlndXJhdGlvbiBST00uCisgKi8KK3N0cnVjdCBmd19jZGV2X3JlbW92ZV9kZXNjcmlwdG9yIHsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfVFJBTlNNSVQJMAorI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkUJMQorCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X2NyZWF0ZV9pc29fY29udGV4dCAtIENyZWF0ZSBhIGNvbnRleHQgZm9yIGlzb2Nocm9ub3VzIElPCisgKiBAdHlwZToJJUZXX0NERVZfSVNPX0NPTlRFWFRfVFJBTlNNSVQgb3IgJUZXX0NERVZfSVNPX0NPTlRFWFRfUkVDRUlWRQorICogQGhlYWRlcl9zaXplOiBIZWFkZXIgc2l6ZSB0byBzdHJpcCBmb3IgcmVjZWl2ZSBjb250ZXh0cworICogQGNoYW5uZWw6CUNoYW5uZWwgdG8gYmluZCB0bworICogQHNwZWVkOglTcGVlZCB0byB0cmFuc21pdCBhdAorICogQGNsb3N1cmU6CVRvIGJlIHJldHVybmVkIGluICZmd19jZGV2X2V2ZW50X2lzb19pbnRlcnJ1cHQKKyAqIEBoYW5kbGU6CUhhbmRsZSB0byBjb250ZXh0LCB3cml0dGVuIGJhY2sgYnkga2VybmVsCisgKgorICogUHJpb3IgdG8gc2VuZGluZyBvciByZWNlaXZpbmcgaXNvY2hyb25vdXMgSS9PLCBhIGNvbnRleHQgbXVzdCBiZSBjcmVhdGVkLgorICogVGhlIGNvbnRleHQgcmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNtaXQgb3IgcmVjZWl2ZSBjb25maWd1cmF0aW9uCisgKiBhbmQgdHlwaWNhbGx5IG1hcHMgdG8gYW4gdW5kZXJseWluZyBoYXJkd2FyZSByZXNvdXJjZS4gIEEgY29udGV4dCBpcyBzZXQgdXAKKyAqIGZvciBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcuICBJdCBpcyBib3VuZCB0byBhIHNwZWNpZmljIGlzb2Nocm9ub3VzCisgKiBjaGFubmVsLgorICoKKyAqIElmIGEgY29udGV4dCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHRoZSBrZXJuZWwgd3JpdGVzIGJhY2sgYSBoYW5kbGUgdG8gdGhlCisgKiBjb250ZXh0LCB3aGljaCBtdXN0IGJlIHBhc3NlZCBpbiBmb3Igc3Vic2VxdWVudCBvcGVyYXRpb25zIG9uIHRoYXQgY29udGV4dC4KKyAqLworc3RydWN0IGZ3X2NkZXZfY3JlYXRlX2lzb19jb250ZXh0IHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGhlYWRlcl9zaXplOworCV9fdTMyIGNoYW5uZWw7CisJX191MzIgc3BlZWQ7CisJX191NjQgY2xvc3VyZTsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfSVNPX1BBWUxPQURfTEVOR1RIKHYpCSh2KQorI2RlZmluZSBGV19DREVWX0lTT19JTlRFUlJVUFQJCSgxIDw8IDE2KQorI2RlZmluZSBGV19DREVWX0lTT19TS0lQCQkoMSA8PCAxNykKKyNkZWZpbmUgRldfQ0RFVl9JU09fU1lOQwkJKDEgPDwgMTcpCisjZGVmaW5lIEZXX0NERVZfSVNPX1RBRyh2KQkJKCh2KSA8PCAxOCkKKyNkZWZpbmUgRldfQ0RFVl9JU09fU1kodikJCSgodikgPDwgMjApCisjZGVmaW5lIEZXX0NERVZfSVNPX0hFQURFUl9MRU5HVEgodikJKCh2KSA8PCAyNCkKKworLyoqCisgKiBzdHJ1Y3QgZndfY2Rldl9pc29fcGFja2V0IC0gSXNvY2hyb25vdXMgcGFja2V0CisgKiBAY29udHJvbDoJQ29udGFpbnMgdGhlIGhlYWRlciBsZW5ndGggKDggdXBwZXJtb3N0IGJpdHMpLCB0aGUgc3kgZmllbGQKKyAqCQkoNCBiaXRzKSwgdGhlIHRhZyBmaWVsZCAoMiBiaXRzKSwgYSBzeW5jIGZsYWcgKDEgYml0KSwKKyAqCQlhIHNraXAgZmxhZyAoMSBiaXQpLCBhbiBpbnRlcnJ1cHQgZmxhZyAoMSBiaXQpLCBhbmQgdGhlCisgKgkJcGF5bG9hZCBsZW5ndGggKDE2IGxvd2VybW9zdCBiaXRzKQorICogQGhlYWRlcjoJSGVhZGVyIGFuZCBwYXlsb2FkCisgKgorICogJnN0cnVjdCBmd19jZGV2X2lzb19wYWNrZXQgaXMgdXNlZCB0byBkZXNjcmliZSBpc29jaHJvbm91cyBwYWNrZXQgcXVldWVzLgorICoKKyAqIFVzZSB0aGUgRldfQ0RFVl9JU09fIG1hY3JvcyB0byBmaWxsIGluIEBjb250cm9sLiAgVGhlIHN5IGFuZCB0YWcgZmllbGRzIGFyZQorICogc3BlY2lmaWVkIGJ5IElFRUUgMTM5NGEgYW5kIElFQyA2MTg4My4KKyAqCisgKiBGSVhNRSAtIGZpbmlzaCB0aGlzIGRvY3VtZW50YXRpb24KKyAqLworc3RydWN0IGZ3X2NkZXZfaXNvX3BhY2tldCB7CisJX191MzIgY29udHJvbDsKKwlfX3UzMiBoZWFkZXJbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3F1ZXVlX2lzbyAtIFF1ZXVlIGlzb2Nocm9ub3VzIHBhY2tldHMgZm9yIEkvTworICogQHBhY2tldHM6CVVzZXJzcGFjZSBwb2ludGVyIHRvIHBhY2tldCBkYXRhCisgKiBAZGF0YToJUG9pbnRlciBpbnRvIG1tYXAoKSdlZCBwYXlsb2FkIGJ1ZmZlcgorICogQHNpemU6CVNpemUgb2YgcGFja2V0IGRhdGEgaW4gYnl0ZXMKKyAqIEBoYW5kbGU6CUlzb2Nocm9ub3VzIGNvbnRleHQgaGFuZGxlCisgKgorICogUXVldWUgYSBudW1iZXIgb2YgaXNvY2hyb25vdXMgcGFja2V0cyBmb3IgcmVjZXB0aW9uIG9yIHRyYW5zbWlzc2lvbi4KKyAqIFRoaXMgaW9jdGwgdGFrZXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mICZmd19jZGV2X2lzb19wYWNrZXQgc3RydWN0cywKKyAqIHdoaWNoIGRlc2NyaWJlIGhvdyB0byB0cmFuc21pdCBmcm9tIG9yIHJlY2VpdmUgaW50byBhIGNvbnRpZ3VvdXMgcmVnaW9uCisgKiBvZiBhIG1tYXAoKSdlZCBwYXlsb2FkIGJ1ZmZlci4gIEFzIHBhcnQgb2YgdGhlIHBhY2tldCBkZXNjcmlwdG9ycywKKyAqIGEgc2VyaWVzIG9mIGhlYWRlcnMgY2FuIGJlIHN1cHBsaWVkLCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUKKyAqIHBheWxvYWQgZHVyaW5nIERNQS4KKyAqCisgKiBUaGUga2VybmVsIG1heSBvciBtYXkgbm90IHF1ZXVlIGFsbCBwYWNrZXRzLCBidXQgd2lsbCB3cml0ZSBiYWNrIHVwZGF0ZWQKKyAqIHZhbHVlcyBvZiB0aGUgQHBhY2tldHMsIEBkYXRhIGFuZCBAc2l6ZSBmaWVsZHMsIHNvIHRoZSBpb2N0bCBjYW4gYmUKKyAqIHJlc3VibWl0dGVkIGVhc2lseS4KKyAqLworc3RydWN0IGZ3X2NkZXZfcXVldWVfaXNvIHsKKwlfX3U2NCBwYWNrZXRzOworCV9fdTY0IGRhdGE7CisJX191MzIgc2l6ZTsKKwlfX3UzMiBoYW5kbGU7Cit9OworCisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfVEFHMAkJIDEKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF9UQUcxCQkgMgorI2RlZmluZSBGV19DREVWX0lTT19DT05URVhUX01BVENIX1RBRzIJCSA0CisjZGVmaW5lIEZXX0NERVZfSVNPX0NPTlRFWFRfTUFUQ0hfVEFHMwkJIDgKKyNkZWZpbmUgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF9BTExfVEFHUwkxNQorCisvKioKKyAqIHN0cnVjdCBmd19jZGV2X3N0YXJ0X2lzbyAtIFN0YXJ0IGFuIGlzb2Nocm9ub3VzIHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24KKyAqIEBjeWNsZToJQ3ljbGUgaW4gd2hpY2ggdG8gc3RhcnQgSS9PLiAgSWYgQGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiBvcgorICoJCWVxdWFsIHRvIDAsIHRoZSBJL08gd2lsbCBzdGFydCBvbiB0aGF0IGN5Y2xlLgorICogQHN5bmM6CURldGVybWluZXMgdGhlIHZhbHVlIHRvIHdhaXQgZm9yIGZvciByZWNlaXZlIHBhY2tldHMgdGhhdCBoYXZlCisgKgkJdGhlICVGV19DREVWX0lTT19TWU5DIGJpdCBzZXQKKyAqIEB0YWdzOglUYWcgZmlsdGVyIGJpdCBtYXNrLiAgT25seSB2YWxpZCBmb3IgaXNvY2hyb25vdXMgcmVjZXB0aW9uLgorICoJCURldGVybWluZXMgdGhlIHRhZyB2YWx1ZXMgZm9yIHdoaWNoIHBhY2tldHMgd2lsbCBiZSBhY2NlcHRlZC4KKyAqCQlVc2UgRldfQ0RFVl9JU09fQ09OVEVYVF9NQVRDSF8gbWFjcm9zIHRvIHNldCBAdGFncy4KKyAqIEBoYW5kbGU6CUlzb2Nocm9ub3VzIGNvbnRleHQgaGFuZGxlIHdpdGhpbiB3aGljaCB0byB0cmFuc21pdCBvciByZWNlaXZlCisgKi8KK3N0cnVjdCBmd19jZGV2X3N0YXJ0X2lzbyB7CisJX19zMzIgY3ljbGU7CisJX191MzIgc3luYzsKKwlfX3UzMiB0YWdzOworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfc3RvcF9pc28gLSBTdG9wIGFuIGlzb2Nocm9ub3VzIHRyYW5zbWlzc2lvbiBvciByZWNlcHRpb24KKyAqIEBoYW5kbGU6CUhhbmRsZSBvZiBpc29jaHJvbm91cyBjb250ZXh0IHRvIHN0b3AKKyAqLworc3RydWN0IGZ3X2NkZXZfc3RvcF9pc28geworCV9fdTMyIGhhbmRsZTsKK307CisKKy8qKgorICogc3RydWN0IGZ3X2NkZXZfZ2V0X2N5Y2xlX3RpbWVyIC0gcmVhZCBjeWNsZSB0aW1lciByZWdpc3RlcgorICogQGxvY2FsX3RpbWU6ICAgc3lzdGVtIHRpbWUsIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2gKKyAqIEBjeWNsZV90aW1lcjogIGlzb2Nocm9ub3VzIGN5Y2xlIHRpbWVyLCBhcyBwZXIgT0hDSSAxLjEgY2xhdXNlIDUuMTMKKyAqCisgKiBUaGUgJUZXX0NERVZfSU9DX0dFVF9DWUNMRV9USU1FUiBpb2N0bCByZWFkcyB0aGUgaXNvY2hyb25vdXMgY3ljbGUgdGltZXIKKyAqIGFuZCBhbHNvIHRoZSBzeXN0ZW0gY2xvY2suICBUaGlzIGFsbG93cyB0byBleHByZXNzIHRoZSByZWNlaXZlIHRpbWUgb2YgYW4KKyAqIGlzb2Nocm9ub3VzIHBhY2tldCBhcyBhIHN5c3RlbSB0aW1lIHdpdGggbWljcm9zZWNvbmQgYWNjdXJhY3kuCisgKi8KK3N0cnVjdCBmd19jZGV2X2dldF9jeWNsZV90aW1lciB7CisJX191NjQgbG9jYWxfdGltZTsKKwlfX3UzMiBjeWNsZV90aW1lcjsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfRklSRVdJUkVfQ0RFVl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNvbnN0YW50cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maXJld2lyZS1jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzE2NzcwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9maXJld2lyZS1jb25zdGFudHMuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9MSU5VWF9GSVJFV0lSRV9DT05TVEFOVFNfSAorI2RlZmluZSBfTElOVVhfRklSRVdJUkVfQ09OU1RBTlRTX0gKKworI2RlZmluZSBUQ09ERV9XUklURV9RVUFETEVUX1JFUVVFU1QJMHgwCisjZGVmaW5lIFRDT0RFX1dSSVRFX0JMT0NLX1JFUVVFU1QJMHgxCisjZGVmaW5lIFRDT0RFX1dSSVRFX1JFU1BPTlNFCQkweDIKKyNkZWZpbmUgVENPREVfUkVBRF9RVUFETEVUX1JFUVVFU1QJMHg0CisjZGVmaW5lIFRDT0RFX1JFQURfQkxPQ0tfUkVRVUVTVAkweDUKKyNkZWZpbmUgVENPREVfUkVBRF9RVUFETEVUX1JFU1BPTlNFCTB4NgorI2RlZmluZSBUQ09ERV9SRUFEX0JMT0NLX1JFU1BPTlNFCTB4NworI2RlZmluZSBUQ09ERV9DWUNMRV9TVEFSVAkJMHg4CisjZGVmaW5lIFRDT0RFX0xPQ0tfUkVRVUVTVAkJMHg5CisjZGVmaW5lIFRDT0RFX1NUUkVBTV9EQVRBCQkweGEKKyNkZWZpbmUgVENPREVfTE9DS19SRVNQT05TRQkJMHhiCisKKyNkZWZpbmUgRVhUQ09ERV9NQVNLX1NXQVAJCTB4MQorI2RlZmluZSBFWFRDT0RFX0NPTVBBUkVfU1dBUAkJMHgyCisjZGVmaW5lIEVYVENPREVfRkVUQ0hfQURECQkweDMKKyNkZWZpbmUgRVhUQ09ERV9MSVRUTEVfQURECQkweDQKKyNkZWZpbmUgRVhUQ09ERV9CT1VOREVEX0FERAkJMHg1CisjZGVmaW5lIEVYVENPREVfV1JBUF9BREQJCTB4NgorI2RlZmluZSBFWFRDT0RFX1ZFTkRPUl9ERVBFTkRFTlQJMHg3CisKKy8qIEp1anUgc3BlY2lmaWMgdGNvZGVzICovCisjZGVmaW5lIFRDT0RFX0xPQ0tfTUFTS19TV0FQCQkoMHgxMCB8IEVYVENPREVfTUFTS19TV0FQKQorI2RlZmluZSBUQ09ERV9MT0NLX0NPTVBBUkVfU1dBUAkJKDB4MTAgfCBFWFRDT0RFX0NPTVBBUkVfU1dBUCkKKyNkZWZpbmUgVENPREVfTE9DS19GRVRDSF9BREQJCSgweDEwIHwgRVhUQ09ERV9GRVRDSF9BREQpCisjZGVmaW5lIFRDT0RFX0xPQ0tfTElUVExFX0FERAkJKDB4MTAgfCBFWFRDT0RFX0xJVFRMRV9BREQpCisjZGVmaW5lIFRDT0RFX0xPQ0tfQk9VTkRFRF9BREQJCSgweDEwIHwgRVhUQ09ERV9CT1VOREVEX0FERCkKKyNkZWZpbmUgVENPREVfTE9DS19XUkFQX0FERAkJKDB4MTAgfCBFWFRDT0RFX1dSQVBfQUREKQorI2RlZmluZSBUQ09ERV9MT0NLX1ZFTkRPUl9ERVBFTkRFTlQJKDB4MTAgfCBFWFRDT0RFX1ZFTkRPUl9ERVBFTkRFTlQpCisKKyNkZWZpbmUgUkNPREVfQ09NUExFVEUJCQkweDAKKyNkZWZpbmUgUkNPREVfQ09ORkxJQ1RfRVJST1IJCTB4NAorI2RlZmluZSBSQ09ERV9EQVRBX0VSUk9SCQkweDUKKyNkZWZpbmUgUkNPREVfVFlQRV9FUlJPUgkJMHg2CisjZGVmaW5lIFJDT0RFX0FERFJFU1NfRVJST1IJCTB4NworCisvKiBKdWp1IHNwZWNpZmljIHJjb2RlcyAqLworI2RlZmluZSBSQ09ERV9TRU5EX0VSUk9SCQkweDEwCisjZGVmaW5lIFJDT0RFX0NBTkNFTExFRAkJCTB4MTEKKyNkZWZpbmUgUkNPREVfQlVTWQkJCTB4MTIKKyNkZWZpbmUgUkNPREVfR0VORVJBVElPTgkJMHgxMworI2RlZmluZSBSQ09ERV9OT19BQ0sJCQkweDE0CisKKyNkZWZpbmUgU0NPREVfMTAwCQkJMHgwCisjZGVmaW5lIFNDT0RFXzIwMAkJCTB4MQorI2RlZmluZSBTQ09ERV80MDAJCQkweDIKKyNkZWZpbmUgU0NPREVfODAwCQkJMHgzCisjZGVmaW5lIFNDT0RFXzE2MDAJCQkweDQKKyNkZWZpbmUgU0NPREVfMzIwMAkJCTB4NQorI2RlZmluZSBTQ09ERV9CRVRBCQkJMHgzCisKKyNkZWZpbmUgQUNLX0NPTVBMRVRFCQkJMHgxCisjZGVmaW5lIEFDS19QRU5ESU5HCQkJMHgyCisjZGVmaW5lIEFDS19CVVNZX1gJCQkweDQKKyNkZWZpbmUgQUNLX0JVU1lfQQkJCTB4NQorI2RlZmluZSBBQ0tfQlVTWV9CCQkJMHg2CisjZGVmaW5lIEFDS19EQVRBX0VSUk9SCQkJMHhkCisjZGVmaW5lIEFDS19UWVBFX0VSUk9SCQkJMHhlCisKKyNkZWZpbmUgUkVUUllfMQkJCQkweDAwCisjZGVmaW5lIFJFVFJZX1gJCQkJMHgwMQorI2RlZmluZSBSRVRSWV9BCQkJCTB4MDIKKyNkZWZpbmUgUkVUUllfQgkJCQkweDAzCisKKyNlbmRpZiAvKiBfTElOVVhfRklSRVdJUkVfQ09OU1RBTlRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmxhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mbGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1MWJjNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZmxhdC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMTk5OCAgICAgICBLZW5uZXRoIEFsYmFub3dza2kgPGtqYWhkc0BramFoZHMuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBTaWx2ZXIgSGFtbWVyIEdyb3VwLCBMdGQuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBuZWVkZWQgdG8KKyAqIHN1cHBvcnQgdUNsaW51eCBmbGF0LWZvcm1hdCBleGVjdXRhYmxlcy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9GTEFUX0gKKyNkZWZpbmUgX0xJTlVYX0ZMQVRfSAorCisKKyNkZWZpbmUJRkxBVF9WRVJTSU9OCQkJMHgwMDAwMDAwNEwKKworI2lmZGVmIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQKKyNkZWZpbmUJTUFYX1NIQVJFRF9MSUJTCQkJKDQpCisjZWxzZQorI2RlZmluZQlNQVhfU0hBUkVEX0xJQlMJCQkoMSkKKyNlbmRpZgorCisvKgorICogVG8gbWFrZSBldmVyeXRoaW5nIGVhc2llciB0byBwb3J0IGFuZCBtYW5hZ2UgY3Jvc3MgcGxhdGZvcm0KKyAqIGRldmVsb3BtZW50LCAgYWxsIGZpZWxkcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICovCisKK3N0cnVjdCBmbGF0X2hkciB7CisJY2hhciBtYWdpY1s0XTsKKwl1bnNpZ25lZCBsb25nIHJldjsgICAgICAgICAgLyogdmVyc2lvbiAoYXMgYWJvdmUpICovCisJdW5zaWduZWQgbG9uZyBlbnRyeTsgICAgICAgIC8qIE9mZnNldCBvZiBmaXJzdCBleGVjdXRhYmxlIGluc3RydWN0aW9uCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGV4dCBzZWdtZW50IGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nIGRhdGFfc3RhcnQ7ICAgLyogT2Zmc2V0IG9mIGRhdGEgc2VnbWVudCBmcm9tIGJlZ2lubmluZyBvZgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICovCisJdW5zaWduZWQgbG9uZyBkYXRhX2VuZDsgICAgIC8qIE9mZnNldCBvZiBlbmQgb2YgZGF0YSBzZWdtZW50CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgKi8KKwl1bnNpZ25lZCBsb25nIGJzc19lbmQ7ICAgICAgLyogT2Zmc2V0IG9mIGVuZCBvZiBic3Mgc2VnbWVudCBmcm9tIGJlZ2lubmluZworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBmaWxlICovCisKKwkvKiAoSXQgaXMgYXNzdW1lZCB0aGF0IGRhdGFfZW5kIHRocm91Z2ggYnNzX2VuZCBmb3JtcyB0aGUgYnNzIHNlZ21lbnQuKSAqLworCisJdW5zaWduZWQgbG9uZyBzdGFja19zaXplOyAgIC8qIFNpemUgb2Ygc3RhY2ssIGluIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyByZWxvY19zdGFydDsgIC8qIE9mZnNldCBvZiByZWxvY2F0aW9uIHJlY29yZHMgZnJvbQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgZmlsZSAqLworCXVuc2lnbmVkIGxvbmcgcmVsb2NfY291bnQ7ICAvKiBOdW1iZXIgb2YgcmVsb2NhdGlvbiByZWNvcmRzICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsgICAgICAgCisJdW5zaWduZWQgbG9uZyBidWlsZF9kYXRlOyAgIC8qIFdoZW4gdGhlIHByb2dyYW0vbGlicmFyeSB3YXMgYnVpbHQgKi8KKwl1bnNpZ25lZCBsb25nIGZpbGxlcls1XTsgICAgLyogUmVzZXJ2ZXJlZCwgc2V0IHRvIHplcm8gKi8KK307CisKKyNkZWZpbmUgRkxBVF9GTEFHX1JBTSAgICAweDAwMDEgLyogbG9hZCBwcm9ncmFtIGVudGlyZWx5IGludG8gUkFNICovCisjZGVmaW5lIEZMQVRfRkxBR19HT1RQSUMgMHgwMDAyIC8qIHByb2dyYW0gaXMgUElDIHdpdGggR09UICovCisjZGVmaW5lIEZMQVRfRkxBR19HWklQICAgMHgwMDA0IC8qIGFsbCBidXQgdGhlIGhlYWRlciBpcyBjb21wcmVzc2VkICovCisjZGVmaW5lIEZMQVRfRkxBR19HWkRBVEEgMHgwMDA4IC8qIG9ubHkgZGF0YS9yZWxvY3MgYXJlIGNvbXByZXNzZWQgKGZvciBYSVApICovCisjZGVmaW5lIEZMQVRfRkxBR19LVFJBQ0UgMHgwMDEwIC8qIG91dHB1dCB1c2VmdWwga2VybmVsIHRyYWNlIGZvciBkZWJ1Z2dpbmcgKi8KKworCisKKyNlbmRpZiAvKiBfTElOVVhfRkxBVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkNWFmZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMCwwICsxLDI3MCBAQAorI2lmbmRlZiBfTElOVVhfRlNfSAorI2RlZmluZSBfTElOVVhfRlNfSAorCisvKgorICogVGhpcyBmaWxlIGhhcyBkZWZpbml0aW9ucyBmb3Igc29tZSBpbXBvcnRhbnQgZmlsZSB0YWJsZQorICogc3RydWN0dXJlcyBldGMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qCisgKiBJdCdzIHNpbGx5IHRvIGhhdmUgTlJfT1BFTiBiaWdnZXIgdGhhbiBOUl9GSUxFLCBidXQgeW91IGNhbiBjaGFuZ2UKKyAqIHRoZSBmaWxlIGxpbWl0IGF0IHJ1bnRpbWUgYW5kIG9ubHkgcm9vdCBjYW4gaW5jcmVhc2UgdGhlIHBlci1wcm9jZXNzCisgKiBucl9maWxlIHJsaW1pdCwgc28gaXQncyBzYWZlIHRvIHNldCB1cCBhIHJpZGljdWxvdXNseSBoaWdoIGFic29sdXRlCisgKiB1cHBlciBsaW1pdCBvbiBmaWxlcy1wZXItcHJvY2Vzcy4KKyAqCisgKiBTb21lIHByb2dyYW1zIChub3RhYmx5IHRob3NlIHVzaW5nIHNlbGVjdCgpKSBtYXkgaGF2ZSB0byBiZSAKKyAqIHJlY29tcGlsZWQgdG8gdGFrZSBmdWxsIGFkdmFudGFnZSBvZiB0aGUgbmV3IGxpbWl0cy4uICAKKyAqLworCisvKiBGaXhlZCBjb25zdGFudHMgZmlyc3Q6ICovCisjdW5kZWYgTlJfT1BFTgorI2RlZmluZSBOUl9PUEVOICgxMDI0KjEwMjQpCS8qIEFic29sdXRlIHVwcGVyIGxpbWl0IG9uIGZkIG51bSAqLworI2RlZmluZSBJTlJfT1BFTiAxMDI0CQkvKiBJbml0aWFsIHNldHRpbmcgZm9yIG5maWxlIHJsaW1pdHMgKi8KKworI2RlZmluZSBCTE9DS19TSVpFX0JJVFMgMTAKKyNkZWZpbmUgQkxPQ0tfU0laRSAoMTw8QkxPQ0tfU0laRV9CSVRTKQorCisjZGVmaW5lIFNFRUtfU0VUCTAJLyogc2VlayByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZmlsZSAqLworI2RlZmluZSBTRUVLX0NVUgkxCS8qIHNlZWsgcmVsYXRpdmUgdG8gY3VycmVudCBmaWxlIHBvc2l0aW9uICovCisjZGVmaW5lIFNFRUtfRU5ECTIJLyogc2VlayByZWxhdGl2ZSB0byBlbmQgb2YgZmlsZSAqLworI2RlZmluZSBTRUVLX01BWAlTRUVLX0VORAorCisvKiBBbmQgZHluYW1pY2FsbHktdHVuYWJsZSBsaW1pdHMgYW5kIGRlZmF1bHRzOiAqLworc3RydWN0IGZpbGVzX3N0YXRfc3RydWN0IHsKKwlpbnQgbnJfZmlsZXM7CQkvKiByZWFkIG9ubHkgKi8KKwlpbnQgbnJfZnJlZV9maWxlczsJLyogcmVhZCBvbmx5ICovCisJaW50IG1heF9maWxlczsJCS8qIHR1bmFibGUgKi8KK307CitleHRlcm4gc3RydWN0IGZpbGVzX3N0YXRfc3RydWN0IGZpbGVzX3N0YXQ7CitleHRlcm4gaW50IGdldF9tYXhfZmlsZXModm9pZCk7CisKK3N0cnVjdCBpbm9kZXNfc3RhdF90IHsKKwlpbnQgbnJfaW5vZGVzOworCWludCBucl91bnVzZWQ7CisJaW50IGR1bW15WzVdOwkJLyogcGFkZGluZyBmb3Igc3lzY3RsIEFCSSBjb21wYXRpYmlsaXR5ICovCit9OworZXh0ZXJuIHN0cnVjdCBpbm9kZXNfc3RhdF90IGlub2Rlc19zdGF0OworCitleHRlcm4gaW50IGxlYXNlc19lbmFibGUsIGxlYXNlX2JyZWFrX3RpbWU7CisKKyNpZmRlZiBDT05GSUdfRE5PVElGWQorZXh0ZXJuIGludCBkaXJfbm90aWZ5X2VuYWJsZTsKKyNlbmRpZgorCisjZGVmaW5lIE5SX0ZJTEUgIDgxOTIJLyogdGhpcyBjYW4gd2VsbCBiZSBsYXJnZXIgb24gYSBsYXJnZXIgc3lzdGVtICovCisKKyNkZWZpbmUgTUFZX0VYRUMgMQorI2RlZmluZSBNQVlfV1JJVEUgMgorI2RlZmluZSBNQVlfUkVBRCA0CisjZGVmaW5lIE1BWV9BUFBFTkQgOAorCisjZGVmaW5lIEZNT0RFX1JFQUQgMQorI2RlZmluZSBGTU9ERV9XUklURSAyCisKKy8qIEludGVybmFsIGtlcm5lbCBleHRlbnNpb25zICovCisjZGVmaW5lIEZNT0RFX0xTRUVLCTQKKyNkZWZpbmUgRk1PREVfUFJFQUQJOAorI2RlZmluZSBGTU9ERV9QV1JJVEUJRk1PREVfUFJFQUQJLyogVGhlc2UgZ28gaGFuZCBpbiBoYW5kICovCisKKy8qIEZpbGUgaXMgYmVpbmcgb3BlbmVkIGZvciBleGVjdXRpb24uIFByaW1hcnkgdXNlcnMgb2YgdGhpcyBmbGFnIGFyZQorICAgZGlzdHJpYnV0ZWQgZmlsZXN5c3RlbXMgdGhhdCBjYW4gdXNlIGl0IHRvIGFjaGlldmUgY29ycmVjdCBFVFhUQlVTWQorICAgYmVoYXZpb3IgZm9yIGNyb3NzLW5vZGUgZXhlY3V0aW9uL29wZW5pbmdfZm9yX3dyaXRpbmcgb2YgZmlsZXMgKi8KKyNkZWZpbmUgRk1PREVfRVhFQwkxNgorCisjZGVmaW5lIFJXX01BU0sJCTEKKyNkZWZpbmUgUldBX01BU0sJMgorI2RlZmluZSBSRUFEIDAKKyNkZWZpbmUgV1JJVEUgMQorI2RlZmluZSBSRUFEQSAyCQkvKiByZWFkLWFoZWFkICAtIGRvbid0IGJsb2NrIGlmIG5vIHJlc291cmNlcyAqLworI2RlZmluZSBTV1JJVEUgMwkvKiBmb3IgbGxfcndfYmxvY2soKSAtIHdhaXQgZm9yIGJ1ZmZlciBsb2NrICovCisjZGVmaW5lIFJFQURfU1lOQwkoUkVBRCB8ICgxIDw8IEJJT19SV19TWU5DKSkKKyNkZWZpbmUgUkVBRF9NRVRBCShSRUFEIHwgKDEgPDwgQklPX1JXX01FVEEpKQorI2RlZmluZSBXUklURV9TWU5DCShXUklURSB8ICgxIDw8IEJJT19SV19TWU5DKSkKKyNkZWZpbmUgV1JJVEVfQkFSUklFUgkoKDEgPDwgQklPX1JXKSB8ICgxIDw8IEJJT19SV19CQVJSSUVSKSkKKworI2RlZmluZSBTRUxfSU4JCTEKKyNkZWZpbmUgU0VMX09VVAkJMgorI2RlZmluZSBTRUxfRVgJCTQKKworLyogcHVibGljIGZsYWdzIGZvciBmaWxlX3N5c3RlbV90eXBlICovCisjZGVmaW5lIEZTX1JFUVVJUkVTX0RFViAxIAorI2RlZmluZSBGU19CSU5BUllfTU9VTlREQVRBIDIKKyNkZWZpbmUgRlNfSEFTX1NVQlRZUEUgNAorI2RlZmluZSBGU19SRVZBTF9ET1QJMTYzODQJLyogQ2hlY2sgdGhlIHBhdGhzICIuIiwgIi4uIiBmb3Igc3RhbGVuZXNzICovCisjZGVmaW5lIEZTX1JFTkFNRV9ET0VTX0RfTU9WRQkzMjc2OAkvKiBGUyB3aWxsIGhhbmRsZSBkX21vdmUoKQorCQkJCQkgKiBkdXJpbmcgcmVuYW1lKCkgaW50ZXJuYWxseS4KKwkJCQkJICovCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZzLWluZGVwZW5kZW50IG1vdW50LWZsYWdzOiB1cCB0byAzMiBmbGFncyBhcmUgc3VwcG9ydGVkCisgKi8KKyNkZWZpbmUgTVNfUkRPTkxZCSAxCS8qIE1vdW50IHJlYWQtb25seSAqLworI2RlZmluZSBNU19OT1NVSUQJIDIJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cyAqLworI2RlZmluZSBNU19OT0RFVgkgNAkvKiBEaXNhbGxvdyBhY2Nlc3MgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMgKi8KKyNkZWZpbmUgTVNfTk9FWEVDCSA4CS8qIERpc2FsbG93IHByb2dyYW0gZXhlY3V0aW9uICovCisjZGVmaW5lIE1TX1NZTkNIUk9OT1VTCTE2CS8qIFdyaXRlcyBhcmUgc3luY2VkIGF0IG9uY2UgKi8KKyNkZWZpbmUgTVNfUkVNT1VOVAkzMgkvKiBBbHRlciBmbGFncyBvZiBhIG1vdW50ZWQgRlMgKi8KKyNkZWZpbmUgTVNfTUFORExPQ0sJNjQJLyogQWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIGFuIEZTICovCisjZGVmaW5lIE1TX0RJUlNZTkMJMTI4CS8qIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cyAqLworI2RlZmluZSBNU19OT0FUSU1FCTEwMjQJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICovCisjZGVmaW5lIE1TX05PRElSQVRJTUUJMjA0OAkvKiBEbyBub3QgdXBkYXRlIGRpcmVjdG9yeSBhY2Nlc3MgdGltZXMgKi8KKyNkZWZpbmUgTVNfQklORAkJNDA5NgorI2RlZmluZSBNU19NT1ZFCQk4MTkyCisjZGVmaW5lIE1TX1JFQwkJMTYzODQKKyNkZWZpbmUgTVNfVkVSQk9TRQkzMjc2OAkvKiBXYXIgaXMgcGVhY2UuIFZlcmJvc2l0eSBpcyBzaWxlbmNlLgorCQkJCSAgIE1TX1ZFUkJPU0UgaXMgZGVwcmVjYXRlZC4gKi8KKyNkZWZpbmUgTVNfU0lMRU5UCTMyNzY4CisjZGVmaW5lIE1TX1BPU0lYQUNMCSgxPDwxNikJLyogVkZTIGRvZXMgbm90IGFwcGx5IHRoZSB1bWFzayAqLworI2RlZmluZSBNU19VTkJJTkRBQkxFCSgxPDwxNykJLyogY2hhbmdlIHRvIHVuYmluZGFibGUgKi8KKyNkZWZpbmUgTVNfUFJJVkFURQkoMTw8MTgpCS8qIGNoYW5nZSB0byBwcml2YXRlICovCisjZGVmaW5lIE1TX1NMQVZFCSgxPDwxOSkJLyogY2hhbmdlIHRvIHNsYXZlICovCisjZGVmaW5lIE1TX1NIQVJFRAkoMTw8MjApCS8qIGNoYW5nZSB0byBzaGFyZWQgKi8KKyNkZWZpbmUgTVNfUkVMQVRJTUUJKDE8PDIxKQkvKiBVcGRhdGUgYXRpbWUgcmVsYXRpdmUgdG8gbXRpbWUvY3RpbWUuICovCisjZGVmaW5lIE1TX0tFUk5NT1VOVAkoMTw8MjIpIC8qIHRoaXMgaXMgYSBrZXJuX21vdW50IGNhbGwgKi8KKyNkZWZpbmUgTVNfQUNUSVZFCSgxPDwzMCkKKyNkZWZpbmUgTVNfTk9VU0VSCSgxPDwzMSkKKworLyoKKyAqIFN1cGVyYmxvY2sgZmxhZ3MgdGhhdCBjYW4gYmUgYWx0ZXJlZCBieSBNU19SRU1PVU5UCisgKi8KKyNkZWZpbmUgTVNfUk1UX01BU0sJKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DSykKKworLyoKKyAqIE9sZCBtYWdpYyBtb3VudCBmbGFnIGFuZCBtYXNrCisgKi8KKyNkZWZpbmUgTVNfTUdDX1ZBTCAweEMwRUQwMDAwCisjZGVmaW5lIE1TX01HQ19NU0sgMHhmZmZmMDAwMAorCisvKiBJbm9kZSBmbGFncyAtIHRoZXkgaGF2ZSBub3RoaW5nIHRvIHN1cGVyYmxvY2sgZmxhZ3Mgbm93ICovCisKKyNkZWZpbmUgU19TWU5DCQkxCS8qIFdyaXRlcyBhcmUgc3luY2VkIGF0IG9uY2UgKi8KKyNkZWZpbmUgU19OT0FUSU1FCTIJLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMgKi8KKyNkZWZpbmUgU19BUFBFTkQJNAkvKiBBcHBlbmQtb25seSBmaWxlICovCisjZGVmaW5lIFNfSU1NVVRBQkxFCTgJLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgU19ERUFECQkxNgkvKiByZW1vdmVkLCBidXQgc3RpbGwgb3BlbiBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgU19OT1FVT1RBCTMyCS8qIElub2RlIGlzIG5vdCBjb3VudGVkIHRvIHF1b3RhICovCisjZGVmaW5lIFNfRElSU1lOQwk2NAkvKiBEaXJlY3RvcnkgbW9kaWZpY2F0aW9ucyBhcmUgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgU19OT0NNVElNRQkxMjgJLyogRG8gbm90IHVwZGF0ZSBmaWxlIGMvbXRpbWUgKi8KKyNkZWZpbmUgU19TV0FQRklMRQkyNTYJLyogRG8gbm90IHRydW5jYXRlOiBzd2Fwb24gZ290IGl0cyBibWFwcyAqLworI2RlZmluZSBTX1BSSVZBVEUJNTEyCS8qIElub2RlIGlzIGZzLWludGVybmFsICovCisKKy8qCisgKiBOb3RlIHRoYXQgbm9zdWlkIGV0YyBmbGFncyBhcmUgaW5vZGUtc3BlY2lmaWM6IHNldHRpbmcgc29tZSBmaWxlLXN5c3RlbQorICogZmxhZ3MganVzdCBtZWFucyBhbGwgdGhlIGlub2RlcyBpbmhlcml0IHRob3NlIGZsYWdzIGJ5IGRlZmF1bHQuIEl0IG1pZ2h0IGJlCisgKiBwb3NzaWJsZSB0byBvdmVycmlkZSBpdCBzZWxlY3RpdmVseSBpZiB5b3UgcmVhbGx5IHdhbnRlZCB0byB3aXRoIHNvbWUKKyAqIGlvY3RsKCkgdGhhdCBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgorICoKKyAqIEV4Y2VwdGlvbjogTVNfUkRPTkxZIGlzIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBlbnRpcmUgZmlsZSBzeXN0ZW0uCisgKgorICogVW5mb3J0dW5hdGVseSwgaXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIGEgZmlsZXN5c3RlbXMgZmxhZ3Mgd2l0aCBpdCBtb3VudGVkCisgKiB3aXRoIGZpbGVzIGluIHVzZS4gIFRoaXMgbWVhbnMgdGhhdCBhbGwgb2YgdGhlIGlub2RlcyB3aWxsIG5vdCBoYXZlIHRoZWlyCisgKiBpX2ZsYWdzIHVwZGF0ZWQuICBIZW5jZSwgaV9mbGFncyBubyBsb25nZXIgaW5oZXJpdCB0aGUgc3VwZXJibG9jayBtb3VudAorICogZmxhZ3MsIHNvIHRoZXNlIGhhdmUgdG8gYmUgY2hlY2tlZCBzZXBhcmF0ZWx5LiAtLSBybWtAYXJtLnVrLmxpbnV4Lm9yZworICovCisjZGVmaW5lIF9fSVNfRkxHKGlub2RlLGZsZykgKChpbm9kZSktPmlfc2ItPnNfZmxhZ3MgJiAoZmxnKSkKKworI2RlZmluZSBJU19SRE9OTFkoaW5vZGUpICgoaW5vZGUpLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorI2RlZmluZSBJU19TWU5DKGlub2RlKQkJKF9fSVNfRkxHKGlub2RlLCBNU19TWU5DSFJPTk9VUykgfHwgXAorCQkJCQkoKGlub2RlKS0+aV9mbGFncyAmIFNfU1lOQykpCisjZGVmaW5lIElTX0RJUlNZTkMoaW5vZGUpCShfX0lTX0ZMRyhpbm9kZSwgTVNfU1lOQ0hST05PVVN8TVNfRElSU1lOQykgfHwgXAorCQkJCQkoKGlub2RlKS0+aV9mbGFncyAmIChTX1NZTkN8U19ESVJTWU5DKSkpCisjZGVmaW5lIElTX01BTkRMT0NLKGlub2RlKQlfX0lTX0ZMRyhpbm9kZSwgTVNfTUFORExPQ0spCisjZGVmaW5lIElTX05PQVRJTUUoaW5vZGUpICAgX19JU19GTEcoaW5vZGUsIE1TX1JET05MWXxNU19OT0FUSU1FKQorCisjZGVmaW5lIElTX05PUVVPVEEoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19OT1FVT1RBKQorI2RlZmluZSBJU19BUFBFTkQoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19BUFBFTkQpCisjZGVmaW5lIElTX0lNTVVUQUJMRShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX0lNTVVUQUJMRSkKKyNkZWZpbmUgSVNfUE9TSVhBQ0woaW5vZGUpCV9fSVNfRkxHKGlub2RlLCBNU19QT1NJWEFDTCkKKworI2RlZmluZSBJU19ERUFERElSKGlub2RlKQkoKGlub2RlKS0+aV9mbGFncyAmIFNfREVBRCkKKyNkZWZpbmUgSVNfTk9DTVRJTUUoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19OT0NNVElNRSkKKyNkZWZpbmUgSVNfU1dBUEZJTEUoaW5vZGUpCSgoaW5vZGUpLT5pX2ZsYWdzICYgU19TV0FQRklMRSkKKyNkZWZpbmUgSVNfUFJJVkFURShpbm9kZSkJKChpbm9kZSktPmlfZmxhZ3MgJiBTX1BSSVZBVEUpCisKKy8qIHRoZSByZWFkLW9ubHkgc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUsIGJ1dCBhbnkgb3RoZXIgcGxhY2UgaXMKKyAgIHByb2JhYmx5IGFzIGJhZCBhbmQgSSBkb24ndCB3YW50IHRvIGNyZWF0ZSB5ZXQgYW5vdGhlciBpbmNsdWRlIGZpbGUuICovCisKKyNkZWZpbmUgQkxLUk9TRVQgICBfSU8oMHgxMiw5MykJLyogc2V0IGRldmljZSByZWFkLW9ubHkgKDAgPSByZWFkLXdyaXRlKSAqLworI2RlZmluZSBCTEtST0dFVCAgIF9JTygweDEyLDk0KQkvKiBnZXQgcmVhZC1vbmx5IHN0YXR1cyAoMCA9IHJlYWRfd3JpdGUpICovCisjZGVmaW5lIEJMS1JSUEFSVCAgX0lPKDB4MTIsOTUpCS8qIHJlLXJlYWQgcGFydGl0aW9uIHRhYmxlICovCisjZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpCS8qIHJldHVybiBkZXZpY2Ugc2l6ZSAvNTEyIChsb25nICphcmcpICovCisjZGVmaW5lIEJMS0ZMU0JVRiAgX0lPKDB4MTIsOTcpCS8qIGZsdXNoIGJ1ZmZlciBjYWNoZSAqLworI2RlZmluZSBCTEtSQVNFVCAgIF9JTygweDEyLDk4KQkvKiBzZXQgcmVhZCBhaGVhZCBmb3IgYmxvY2sgZGV2aWNlICovCisjZGVmaW5lIEJMS1JBR0VUICAgX0lPKDB4MTIsOTkpCS8qIGdldCBjdXJyZW50IHJlYWQgYWhlYWQgc2V0dGluZyAqLworI2RlZmluZSBCTEtGUkFTRVQgIF9JTygweDEyLDEwMCkvKiBzZXQgZmlsZXN5c3RlbSAobW0vZmlsZW1hcC5jKSByZWFkLWFoZWFkICovCisjZGVmaW5lIEJMS0ZSQUdFVCAgX0lPKDB4MTIsMTAxKS8qIGdldCBmaWxlc3lzdGVtIChtbS9maWxlbWFwLmMpIHJlYWQtYWhlYWQgKi8KKyNkZWZpbmUgQkxLU0VDVFNFVCBfSU8oMHgxMiwxMDIpLyogc2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0IChsbF9yd19ibGsuYykgKi8KKyNkZWZpbmUgQkxLU0VDVEdFVCBfSU8oMHgxMiwxMDMpLyogZ2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0IChsbF9yd19ibGsuYykgKi8KKyNkZWZpbmUgQkxLU1NaR0VUICBfSU8oMHgxMiwxMDQpLyogZ2V0IGJsb2NrIGRldmljZSBzZWN0b3Igc2l6ZSAqLworI2lmIDAKKyNkZWZpbmUgQkxLUEcgICAgICBfSU8oMHgxMiwxMDUpLyogU2VlIGJsa3BnLmggKi8KKworLyogU29tZSBwZW9wbGUgYXJlIG1vcm9ucy4gIERvIG5vdCB1c2Ugc2l6ZW9mISAqLworCisjZGVmaW5lIEJMS0VMVkdFVCAgX0lPUigweDEyLDEwNixzaXplX3QpLyogZWxldmF0b3IgZ2V0ICovCisjZGVmaW5lIEJMS0VMVlNFVCAgX0lPVygweDEyLDEwNyxzaXplX3QpLyogZWxldmF0b3Igc2V0ICovCisvKiBUaGlzIHdhcyBoZXJlIGp1c3QgdG8gc2hvdyB0aGF0IHRoZSBudW1iZXIgaXMgdGFrZW4gLQorICAgcHJvYmFibHkgYWxsIHRoZXNlIF9JTygweDEyLCopIGlvY3RscyBzaG91bGQgYmUgbW92ZWQgdG8gYmxrcGcuaC4gKi8KKyNlbmRpZgorLyogQSBqdW1wIGhlcmU6IDEwOC0xMTEgaGF2ZSBiZWVuIHVzZWQgZm9yIHZhcmlvdXMgcHJpdmF0ZSBwdXJwb3Nlcy4gKi8KKyNkZWZpbmUgQkxLQlNaR0VUICBfSU9SKDB4MTIsMTEyLHNpemVfdCkKKyNkZWZpbmUgQkxLQlNaU0VUICBfSU9XKDB4MTIsMTEzLHNpemVfdCkKKyNkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQkvKiByZXR1cm4gZGV2aWNlIHNpemUgaW4gYnl0ZXMgKHU2NCAqYXJnKSAqLworI2RlZmluZSBCTEtUUkFDRVNFVFVQIF9JT1dSKDB4MTIsMTE1LHN0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCkKKyNkZWZpbmUgQkxLVFJBQ0VTVEFSVCBfSU8oMHgxMiwxMTYpCisjZGVmaW5lIEJMS1RSQUNFU1RPUCBfSU8oMHgxMiwxMTcpCisjZGVmaW5lIEJMS1RSQUNFVEVBUkRPV04gX0lPKDB4MTIsMTE4KQorCisjZGVmaW5lIEJNQVBfSU9DVEwgMQkJLyogb2Jzb2xldGUgLSBrZXB0IGZvciBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIEZJQk1BUAkgICBfSU8oMHgwMCwxKQkvKiBibWFwIGFjY2VzcyAqLworI2RlZmluZSBGSUdFVEJTWiAgIF9JTygweDAwLDIpCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSB1c2VkIGZvciBibWFwICovCisKKyNkZWZpbmUJRlNfSU9DX0dFVEZMQUdTCQkJX0lPUignZicsIDEsIGxvbmcpCisjZGVmaW5lCUZTX0lPQ19TRVRGTEFHUwkJCV9JT1coJ2YnLCAyLCBsb25nKQorI2RlZmluZQlGU19JT0NfR0VUVkVSU0lPTgkJX0lPUigndicsIDEsIGxvbmcpCisjZGVmaW5lCUZTX0lPQ19TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgbG9uZykKKyNkZWZpbmUgRlNfSU9DMzJfR0VURkxBR1MJCV9JT1IoJ2YnLCAxLCBpbnQpCisjZGVmaW5lIEZTX0lPQzMyX1NFVEZMQUdTCQlfSU9XKCdmJywgMiwgaW50KQorI2RlZmluZSBGU19JT0MzMl9HRVRWRVJTSU9OCQlfSU9SKCd2JywgMSwgaW50KQorI2RlZmluZSBGU19JT0MzMl9TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgaW50KQorCisvKgorICogSW5vZGUgZmxhZ3MgKEZTX0lPQ19HRVRGTEFHUyAvIEZTX0lPQ19TRVRGTEFHUykKKyAqLworI2RlZmluZQlGU19TRUNSTV9GTAkJCTB4MDAwMDAwMDEgLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lCUZTX1VOUk1fRkwJCQkweDAwMDAwMDAyIC8qIFVuZGVsZXRlICovCisjZGVmaW5lCUZTX0NPTVBSX0ZMCQkJMHgwMDAwMDAwNCAvKiBDb21wcmVzcyBmaWxlICovCisjZGVmaW5lIEZTX1NZTkNfRkwJCQkweDAwMDAwMDA4IC8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRlNfSU1NVVRBQkxFX0ZMCQkJMHgwMDAwMDAxMCAvKiBJbW11dGFibGUgZmlsZSAqLworI2RlZmluZSBGU19BUFBFTkRfRkwJCQkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBGU19OT0RVTVBfRkwJCQkweDAwMDAwMDQwIC8qIGRvIG5vdCBkdW1wIGZpbGUgKi8KKyNkZWZpbmUgRlNfTk9BVElNRV9GTAkJCTB4MDAwMDAwODAgLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLworLyogUmVzZXJ2ZWQgZm9yIGNvbXByZXNzaW9uIHVzYWdlLi4uICovCisjZGVmaW5lIEZTX0RJUlRZX0ZMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBGU19DT01QUkJMS19GTAkJCTB4MDAwMDAyMDAgLyogT25lIG9yIG1vcmUgY29tcHJlc3NlZCBjbHVzdGVycyAqLworI2RlZmluZSBGU19OT0NPTVBfRkwJCQkweDAwMDAwNDAwIC8qIERvbid0IGNvbXByZXNzICovCisjZGVmaW5lIEZTX0VDT01QUl9GTAkJCTB4MDAwMDA4MDAgLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCisjZGVmaW5lIEZTX0JUUkVFX0ZMCQkJMHgwMDAwMTAwMCAvKiBidHJlZSBmb3JtYXQgZGlyICovCisjZGVmaW5lIEZTX0lOREVYX0ZMCQkJMHgwMDAwMTAwMCAvKiBoYXNoLWluZGV4ZWQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEZTX0lNQUdJQ19GTAkJCTB4MDAwMDIwMDAgLyogQUZTIGRpcmVjdG9yeSAqLworI2RlZmluZSBGU19KT1VSTkFMX0RBVEFfRkwJCTB4MDAwMDQwMDAgLyogUmVzZXJ2ZWQgZm9yIGV4dDMgKi8KKyNkZWZpbmUgRlNfTk9UQUlMX0ZMCQkJMHgwMDAwODAwMCAvKiBmaWxlIHRhaWwgc2hvdWxkIG5vdCBiZSBtZXJnZWQgKi8KKyNkZWZpbmUgRlNfRElSU1lOQ19GTAkJCTB4MDAwMTAwMDAgLyogZGlyc3luYyBiZWhhdmlvdXIgKGRpcmVjdG9yaWVzIG9ubHkpICovCisjZGVmaW5lIEZTX1RPUERJUl9GTAkJCTB4MDAwMjAwMDAgLyogVG9wIG9mIGRpcmVjdG9yeSBoaWVyYXJjaGllcyovCisjZGVmaW5lIEZTX0VYVEVOVF9GTAkJCTB4MDAwODAwMDAgLyogRXh0ZW50cyAqLworI2RlZmluZSBGU19ESVJFQ1RJT19GTAkJCTB4MDAxMDAwMDAgLyogVXNlIGRpcmVjdCBpL28gKi8KKyNkZWZpbmUgRlNfUkVTRVJWRURfRkwJCQkweDgwMDAwMDAwIC8qIHJlc2VydmVkIGZvciBleHQyIGxpYiAqLworCisjZGVmaW5lIEZTX0ZMX1VTRVJfVklTSUJMRQkJMHgwMDAzREZGRiAvKiBVc2VyIHZpc2libGUgZmxhZ3MgKi8KKyNkZWZpbmUgRlNfRkxfVVNFUl9NT0RJRklBQkxFCQkweDAwMDM4MEZGIC8qIFVzZXIgbW9kaWZpYWJsZSBmbGFncyAqLworCisKKyNkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dBSVRfQkVGT1JFCTEKKyNkZWZpbmUgU1lOQ19GSUxFX1JBTkdFX1dSSVRFCQkyCisjZGVmaW5lIFNZTkNfRklMRV9SQU5HRV9XQUlUX0FGVEVSCTQKKworI2VuZGlmIC8qIF9MSU5VWF9GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1c2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnVzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODZmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAgICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisKKyAgICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KKyAgICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUga2VybmVsIGludGVyZmFjZSBvZiBGVVNFCisgKgorICogUHJvdG9jb2wgY2hhbmdlbG9nOgorICoKKyAqIDcuOToKKyAqICAtIG5ldyBmdXNlX2dldGF0dHJfaW4gaW5wdXQgYXJndW1lbnQgb2YgR0VUQVRUUgorICogIC0gYWRkIGxrX2ZsYWdzIGluIGZ1c2VfbGtfaW4KKyAqICAtIGFkZCBsb2NrX293bmVyIGZpZWxkIHRvIGZ1c2Vfc2V0YXR0cl9pbiwgZnVzZV9yZWFkX2luIGFuZCBmdXNlX3dyaXRlX2luCisgKiAgLSBhZGQgYmxrc2l6ZSBmaWVsZCB0byBmdXNlX2F0dHIKKyAqICAtIGFkZCBmaWxlIGZsYWdzIGZpZWxkIHRvIGZ1c2VfcmVhZF9pbiBhbmQgZnVzZV93cml0ZV9pbgorICovCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorCisvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CisKKy8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLworI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDkKKworLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCisjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCisKKy8qKiBUaGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KKyNkZWZpbmUgRlVTRV9NQUpPUiBNSVNDX01BSk9SCisKKy8qKiBUaGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KKyNkZWZpbmUgRlVTRV9NSU5PUiAyMjkKKworLyogTWFrZSBzdXJlIGFsbCBzdHJ1Y3R1cmVzIGFyZSBwYWRkZWQgdG8gNjRiaXQgYm91bmRhcnksIHNvIDMyYml0CisgICB1c2Vyc3BhY2Ugd29ya3MgdW5kZXIgNjRiaXQga2VybmVscyAqLworCitzdHJ1Y3QgZnVzZV9hdHRyIHsKKwlfX3U2NAlpbm87CisJX191NjQJc2l6ZTsKKwlfX3U2NAlibG9ja3M7CisJX191NjQJYXRpbWU7CisJX191NjQJbXRpbWU7CisJX191NjQJY3RpbWU7CisJX191MzIJYXRpbWVuc2VjOworCV9fdTMyCW10aW1lbnNlYzsKKwlfX3UzMgljdGltZW5zZWM7CisJX191MzIJbW9kZTsKKwlfX3UzMglubGluazsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXJkZXY7CisJX191MzIJYmxrc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfa3N0YXRmcyB7CisJX191NjQJYmxvY2tzOworCV9fdTY0CWJmcmVlOworCV9fdTY0CWJhdmFpbDsKKwlfX3U2NAlmaWxlczsKKwlfX3U2NAlmZnJlZTsKKwlfX3UzMglic2l6ZTsKKwlfX3UzMgluYW1lbGVuOworCV9fdTMyCWZyc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworCV9fdTMyCXNwYXJlWzZdOworfTsKKworc3RydWN0IGZ1c2VfZmlsZV9sb2NrIHsKKwlfX3U2NAlzdGFydDsKKwlfX3U2NAllbmQ7CisJX191MzIJdHlwZTsKKwlfX3UzMglwaWQ7IC8qIHRnaWQgKi8KK307CisKKy8qKgorICogQml0bWFza3MgZm9yIGZ1c2Vfc2V0YXR0cl9pbi52YWxpZAorICovCisjZGVmaW5lIEZBVFRSX01PREUJKDEgPDwgMCkKKyNkZWZpbmUgRkFUVFJfVUlECSgxIDw8IDEpCisjZGVmaW5lIEZBVFRSX0dJRAkoMSA8PCAyKQorI2RlZmluZSBGQVRUUl9TSVpFCSgxIDw8IDMpCisjZGVmaW5lIEZBVFRSX0FUSU1FCSgxIDw8IDQpCisjZGVmaW5lIEZBVFRSX01USU1FCSgxIDw8IDUpCisjZGVmaW5lIEZBVFRSX0ZICSgxIDw8IDYpCisjZGVmaW5lIEZBVFRSX0FUSU1FX05PVwkoMSA8PCA3KQorI2RlZmluZSBGQVRUUl9NVElNRV9OT1cJKDEgPDwgOCkKKyNkZWZpbmUgRkFUVFJfTE9DS09XTkVSCSgxIDw8IDkpCisKKy8qKgorICogRmxhZ3MgcmV0dXJuZWQgYnkgdGhlIE9QRU4gcmVxdWVzdAorICoKKyAqIEZPUEVOX0RJUkVDVF9JTzogYnlwYXNzIHBhZ2UgY2FjaGUgZm9yIHRoaXMgb3BlbiBmaWxlCisgKiBGT1BFTl9LRUVQX0NBQ0hFOiBkb24ndCBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIG9uIG9wZW4KKyAqLworI2RlZmluZSBGT1BFTl9ESVJFQ1RfSU8JCSgxIDw8IDApCisjZGVmaW5lIEZPUEVOX0tFRVBfQ0FDSEUJKDEgPDwgMSkKKworLyoqCisgKiBJTklUIHJlcXVlc3QvcmVwbHkgZmxhZ3MKKyAqLworI2RlZmluZSBGVVNFX0FTWU5DX1JFQUQJCSgxIDw8IDApCisjZGVmaW5lIEZVU0VfUE9TSVhfTE9DS1MJKDEgPDwgMSkKKyNkZWZpbmUgRlVTRV9GSUxFX09QUwkJKDEgPDwgMikKKyNkZWZpbmUgRlVTRV9BVE9NSUNfT19UUlVOQwkoMSA8PCAzKQorCisvKioKKyAqIFJlbGVhc2UgZmxhZ3MKKyAqLworI2RlZmluZSBGVVNFX1JFTEVBU0VfRkxVU0gJKDEgPDwgMCkKKworLyoqCisgKiBHZXRhdHRyIGZsYWdzCisgKi8KKyNkZWZpbmUgRlVTRV9HRVRBVFRSX0ZICQkoMSA8PCAwKQorCisvKioKKyAqIExvY2sgZmxhZ3MKKyAqLworI2RlZmluZSBGVVNFX0xLX0ZMT0NLCQkoMSA8PCAwKQorCisvKioKKyAqIFdSSVRFIGZsYWdzCisgKgorICogRlVTRV9XUklURV9DQUNIRTogZGVsYXllZCB3cml0ZSBmcm9tIHBhZ2UgY2FjaGUsIGZpbGUgaGFuZGxlIGlzIGd1ZXNzZWQKKyAqIEZVU0VfV1JJVEVfTE9DS09XTkVSOiBsb2NrX293bmVyIGZpZWxkIGlzIHZhbGlkCisgKi8KKyNkZWZpbmUgRlVTRV9XUklURV9DQUNIRQkoMSA8PCAwKQorI2RlZmluZSBGVVNFX1dSSVRFX0xPQ0tPV05FUgkoMSA8PCAxKQorCisvKioKKyAqIFJlYWQgZmxhZ3MKKyAqLworI2RlZmluZSBGVVNFX1JFQURfTE9DS09XTkVSCSgxIDw8IDEpCisKK2VudW0gZnVzZV9vcGNvZGUgeworCUZVU0VfTE9PS1VQCSAgID0gMSwKKwlGVVNFX0ZPUkdFVAkgICA9IDIsICAvKiBubyByZXBseSAqLworCUZVU0VfR0VUQVRUUgkgICA9IDMsCisJRlVTRV9TRVRBVFRSCSAgID0gNCwKKwlGVVNFX1JFQURMSU5LCSAgID0gNSwKKwlGVVNFX1NZTUxJTksJICAgPSA2LAorCUZVU0VfTUtOT0QJICAgPSA4LAorCUZVU0VfTUtESVIJICAgPSA5LAorCUZVU0VfVU5MSU5LCSAgID0gMTAsCisJRlVTRV9STURJUgkgICA9IDExLAorCUZVU0VfUkVOQU1FCSAgID0gMTIsCisJRlVTRV9MSU5LCSAgID0gMTMsCisJRlVTRV9PUEVOCSAgID0gMTQsCisJRlVTRV9SRUFECSAgID0gMTUsCisJRlVTRV9XUklURQkgICA9IDE2LAorCUZVU0VfU1RBVEZTCSAgID0gMTcsCisJRlVTRV9SRUxFQVNFICAgICAgID0gMTgsCisJRlVTRV9GU1lOQyAgICAgICAgID0gMjAsCisJRlVTRV9TRVRYQVRUUiAgICAgID0gMjEsCisJRlVTRV9HRVRYQVRUUiAgICAgID0gMjIsCisJRlVTRV9MSVNUWEFUVFIgICAgID0gMjMsCisJRlVTRV9SRU1PVkVYQVRUUiAgID0gMjQsCisJRlVTRV9GTFVTSCAgICAgICAgID0gMjUsCisJRlVTRV9JTklUICAgICAgICAgID0gMjYsCisJRlVTRV9PUEVORElSICAgICAgID0gMjcsCisJRlVTRV9SRUFERElSICAgICAgID0gMjgsCisJRlVTRV9SRUxFQVNFRElSICAgID0gMjksCisJRlVTRV9GU1lOQ0RJUiAgICAgID0gMzAsCisJRlVTRV9HRVRMSyAgICAgICAgID0gMzEsCisJRlVTRV9TRVRMSyAgICAgICAgID0gMzIsCisJRlVTRV9TRVRMS1cgICAgICAgID0gMzMsCisJRlVTRV9BQ0NFU1MgICAgICAgID0gMzQsCisJRlVTRV9DUkVBVEUgICAgICAgID0gMzUsCisJRlVTRV9JTlRFUlJVUFQgICAgID0gMzYsCisJRlVTRV9CTUFQICAgICAgICAgID0gMzcsCisJRlVTRV9ERVNUUk9ZICAgICAgID0gMzgsCit9OworCisvKiBUaGUgcmVhZCBidWZmZXIgaXMgcmVxdWlyZWQgdG8gYmUgYXQgbGVhc3QgOGssIGJ1dCBtYXkgYmUgbXVjaCBsYXJnZXIgKi8KKyNkZWZpbmUgRlVTRV9NSU5fUkVBRF9CVUZGRVIgODE5MgorCisjZGVmaW5lIEZVU0VfQ09NUEFUX0VOVFJZX09VVF9TSVpFIDEyMAorCitzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgeworCV9fdTY0CW5vZGVpZDsJCS8qIElub2RlIElEICovCisJX191NjQJZ2VuZXJhdGlvbjsJLyogSW5vZGUgZ2VuZXJhdGlvbjogbm9kZWlkOmdlbiBtdXN0CisJCQkJICAgYmUgdW5pcXVlIGZvciB0aGUgZnMncyBsaWZldGltZSAqLworCV9fdTY0CWVudHJ5X3ZhbGlkOwkvKiBDYWNoZSB0aW1lb3V0IGZvciB0aGUgbmFtZSAqLworCV9fdTY0CWF0dHJfdmFsaWQ7CS8qIENhY2hlIHRpbWVvdXQgZm9yIHRoZSBhdHRyaWJ1dGVzICovCisJX191MzIJZW50cnlfdmFsaWRfbnNlYzsKKwlfX3UzMglhdHRyX3ZhbGlkX25zZWM7CisJc3RydWN0IGZ1c2VfYXR0ciBhdHRyOworfTsKKworc3RydWN0IGZ1c2VfZm9yZ2V0X2luIHsKKwlfX3U2NAlubG9va3VwOworfTsKKworc3RydWN0IGZ1c2VfZ2V0YXR0cl9pbiB7CisJX191MzIJZ2V0YXR0cl9mbGFnczsKKwlfX3UzMglkdW1teTsKKwlfX3U2NAlmaDsKK307CisKKyNkZWZpbmUgRlVTRV9DT01QQVRfQVRUUl9PVVRfU0laRSA5NgorCitzdHJ1Y3QgZnVzZV9hdHRyX291dCB7CisJX191NjQJYXR0cl92YWxpZDsJLyogQ2FjaGUgdGltZW91dCBmb3IgdGhlIGF0dHJpYnV0ZXMgKi8KKwlfX3UzMglhdHRyX3ZhbGlkX25zZWM7CisJX191MzIJZHVtbXk7CisJc3RydWN0IGZ1c2VfYXR0ciBhdHRyOworfTsKKworc3RydWN0IGZ1c2VfbWtub2RfaW4geworCV9fdTMyCW1vZGU7CisJX191MzIJcmRldjsKK307CisKK3N0cnVjdCBmdXNlX21rZGlyX2luIHsKKwlfX3UzMgltb2RlOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9yZW5hbWVfaW4geworCV9fdTY0CW5ld2RpcjsKK307CisKK3N0cnVjdCBmdXNlX2xpbmtfaW4geworCV9fdTY0CW9sZG5vZGVpZDsKK307CisKK3N0cnVjdCBmdXNlX3NldGF0dHJfaW4geworCV9fdTMyCXZhbGlkOworCV9fdTMyCXBhZGRpbmc7CisJX191NjQJZmg7CisJX191NjQJc2l6ZTsKKwlfX3U2NAlsb2NrX293bmVyOworCV9fdTY0CWF0aW1lOworCV9fdTY0CW10aW1lOworCV9fdTY0CXVudXNlZDI7CisJX191MzIJYXRpbWVuc2VjOworCV9fdTMyCW10aW1lbnNlYzsKKwlfX3UzMgl1bnVzZWQzOworCV9fdTMyCW1vZGU7CisJX191MzIJdW51c2VkNDsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXVudXNlZDU7Cit9OworCitzdHJ1Y3QgZnVzZV9vcGVuX2luIHsKKwlfX3UzMglmbGFnczsKKwlfX3UzMgltb2RlOworfTsKKworc3RydWN0IGZ1c2Vfb3Blbl9vdXQgeworCV9fdTY0CWZoOworCV9fdTMyCW9wZW5fZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3JlbGVhc2VfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZsYWdzOworCV9fdTMyCXJlbGVhc2VfZmxhZ3M7CisJX191NjQJbG9ja19vd25lcjsKK307CisKK3N0cnVjdCBmdXNlX2ZsdXNoX2luIHsKKwlfX3U2NAlmaDsKKwlfX3UzMgl1bnVzZWQ7CisJX191MzIJcGFkZGluZzsKKwlfX3U2NAlsb2NrX293bmVyOworfTsKKworc3RydWN0IGZ1c2VfcmVhZF9pbiB7CisJX191NjQJZmg7CisJX191NjQJb2Zmc2V0OworCV9fdTMyCXNpemU7CisJX191MzIJcmVhZF9mbGFnczsKKwlfX3U2NAlsb2NrX293bmVyOworCV9fdTMyCWZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCisjZGVmaW5lIEZVU0VfQ09NUEFUX1dSSVRFX0lOX1NJWkUgMjQKKworc3RydWN0IGZ1c2Vfd3JpdGVfaW4geworCV9fdTY0CWZoOworCV9fdTY0CW9mZnNldDsKKwlfX3UzMglzaXplOworCV9fdTMyCXdyaXRlX2ZsYWdzOworCV9fdTY0CWxvY2tfb3duZXI7CisJX191MzIJZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX3dyaXRlX291dCB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglwYWRkaW5nOworfTsKKworI2RlZmluZSBGVVNFX0NPTVBBVF9TVEFURlNfU0laRSA0OAorCitzdHJ1Y3QgZnVzZV9zdGF0ZnNfb3V0IHsKKwlzdHJ1Y3QgZnVzZV9rc3RhdGZzIHN0OworfTsKKworc3RydWN0IGZ1c2VfZnN5bmNfaW4geworCV9fdTY0CWZoOworCV9fdTMyCWZzeW5jX2ZsYWdzOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9zZXR4YXR0cl9pbiB7CisJX191MzIJc2l6ZTsKKwlfX3UzMglmbGFnczsKK307CisKK3N0cnVjdCBmdXNlX2dldHhhdHRyX2luIHsKKwlfX3UzMglzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9vdXQgeworCV9fdTMyCXNpemU7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2xrX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlvd25lcjsKKwlzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgbGs7CisJX191MzIJbGtfZmxhZ3M7CisJX191MzIJcGFkZGluZzsKK307CisKK3N0cnVjdCBmdXNlX2xrX291dCB7CisJc3RydWN0IGZ1c2VfZmlsZV9sb2NrIGxrOworfTsKKworc3RydWN0IGZ1c2VfYWNjZXNzX2luIHsKKwlfX3UzMgltYXNrOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9pbml0X2luIHsKKwlfX3UzMgltYWpvcjsKKwlfX3UzMgltaW5vcjsKKwlfX3UzMgltYXhfcmVhZGFoZWFkOworCV9fdTMyCWZsYWdzOworfTsKKworc3RydWN0IGZ1c2VfaW5pdF9vdXQgeworCV9fdTMyCW1ham9yOworCV9fdTMyCW1pbm9yOworCV9fdTMyCW1heF9yZWFkYWhlYWQ7CisJX191MzIJZmxhZ3M7CisJX191MzIJdW51c2VkOworCV9fdTMyCW1heF93cml0ZTsKK307CisKK3N0cnVjdCBmdXNlX2ludGVycnVwdF9pbiB7CisJX191NjQJdW5pcXVlOworfTsKKworc3RydWN0IGZ1c2VfYm1hcF9pbiB7CisJX191NjQJYmxvY2s7CisJX191MzIJYmxvY2tzaXplOworCV9fdTMyCXBhZGRpbmc7Cit9OworCitzdHJ1Y3QgZnVzZV9ibWFwX291dCB7CisJX191NjQJYmxvY2s7Cit9OworCitzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgeworCV9fdTMyCWxlbjsKKwlfX3UzMglvcGNvZGU7CisJX191NjQJdW5pcXVlOworCV9fdTY0CW5vZGVpZDsKKwlfX3UzMgl1aWQ7CisJX191MzIJZ2lkOworCV9fdTMyCXBpZDsKKwlfX3UzMglwYWRkaW5nOworfTsKKworc3RydWN0IGZ1c2Vfb3V0X2hlYWRlciB7CisJX191MzIJbGVuOworCV9fczMyCWVycm9yOworCV9fdTY0CXVuaXF1ZTsKK307CisKK3N0cnVjdCBmdXNlX2RpcmVudCB7CisJX191NjQJaW5vOworCV9fdTY0CW9mZjsKKwlfX3UzMgluYW1lbGVuOworCV9fdTMyCXR5cGU7CisJY2hhciBuYW1lWzBdOworfTsKKworI2RlZmluZSBGVVNFX05BTUVfT0ZGU0VUIG9mZnNldG9mKHN0cnVjdCBmdXNlX2RpcmVudCwgbmFtZSkKKyNkZWZpbmUgRlVTRV9ESVJFTlRfQUxJR04oeCkgKCgoeCkgKyBzaXplb2YoX191NjQpIC0gMSkgJiB+KHNpemVvZihfX3U2NCkgLSAxKSkKKyNkZWZpbmUgRlVTRV9ESVJFTlRfU0laRShkKSBcCisJRlVTRV9ESVJFTlRfQUxJR04oRlVTRV9OQU1FX09GRlNFVCArIChkKS0+bmFtZWxlbikKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnV0ZXguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDdlNThlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9mdXRleC5oCkBAIC0wLDAgKzEsMTM2IEBACisjaWZuZGVmIF9MSU5VWF9GVVRFWF9ICisjZGVmaW5lIF9MSU5VWF9GVVRFWF9ICisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCit1bmlvbiBrdGltZTsKKworLyogU2Vjb25kIGFyZ3VtZW50IHRvIGZ1dGV4IHN5c2NhbGwgKi8KKworCisjZGVmaW5lIEZVVEVYX1dBSVQJCTAKKyNkZWZpbmUgRlVURVhfV0FLRQkJMQorI2RlZmluZSBGVVRFWF9GRAkJMgorI2RlZmluZSBGVVRFWF9SRVFVRVVFCQkzCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFCTQKKyNkZWZpbmUgRlVURVhfV0FLRV9PUAkJNQorI2RlZmluZSBGVVRFWF9MT0NLX1BJCQk2CisjZGVmaW5lIEZVVEVYX1VOTE9DS19QSQkJNworI2RlZmluZSBGVVRFWF9UUllMT0NLX1BJCTgKKworI2RlZmluZSBGVVRFWF9QUklWQVRFX0ZMQUcJMTI4CisjZGVmaW5lIEZVVEVYX0NNRF9NQVNLCQl+RlVURVhfUFJJVkFURV9GTEFHCisKKyNkZWZpbmUgRlVURVhfV0FJVF9QUklWQVRFCShGVVRFWF9XQUlUIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9XQUtFX1BSSVZBVEUJKEZVVEVYX1dBS0UgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1JFUVVFVUVfUFJJVkFURQkoRlVURVhfUkVRVUVVRSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfQ01QX1JFUVVFVUVfUFJJVkFURSAoRlVURVhfQ01QX1JFUVVFVUUgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1dBS0VfT1BfUFJJVkFURQkoRlVURVhfV0FLRV9PUCB8IEZVVEVYX1BSSVZBVEVfRkxBRykKKyNkZWZpbmUgRlVURVhfTE9DS19QSV9QUklWQVRFCShGVVRFWF9MT0NLX1BJIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9VTkxPQ0tfUElfUFJJVkFURQkoRlVURVhfVU5MT0NLX1BJIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9UUllMT0NLX1BJX1BSSVZBVEUgKEZVVEVYX1RSWUxPQ0tfUEkgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisKKy8qCisgKiBTdXBwb3J0IGZvciByb2J1c3QgZnV0ZXhlczogdGhlIGtlcm5lbCBjbGVhbnMgdXAgaGVsZCBmdXRleGVzIGF0CisgKiB0aHJlYWQgZXhpdCB0aW1lLgorICovCisKKy8qCisgKiBQZXItbG9jayBsaXN0IGVudHJ5IC0gZW1iZWRkZWQgaW4gdXNlci1zcGFjZSBsb2Nrcywgc29tZXdoZXJlIGNsb3NlCisgKiB0byB0aGUgZnV0ZXggZmllbGQuIChOb3RlOiB1c2VyLXNwYWNlIHVzZXMgYSBkb3VibGUtbGlua2VkIGxpc3QgdG8KKyAqIGFjaGlldmUgTygxKSBsaXN0IGFkZCBhbmQgcmVtb3ZlLCBidXQgdGhlIGtlcm5lbCBvbmx5IG5lZWRzIHRvIGtub3cKKyAqIGFib3V0IHRoZSBmb3J3YXJkIGxpbmspCisgKgorICogTk9URTogdGhpcyBzdHJ1Y3R1cmUgaXMgcGFydCBvZiB0aGUgc3lzY2FsbCBBQkksIGFuZCBtdXN0IG5vdCBiZQorICogY2hhbmdlZC4KKyAqLworc3RydWN0IHJvYnVzdF9saXN0IHsKKwlzdHJ1Y3Qgcm9idXN0X2xpc3QgKm5leHQ7Cit9OworCisvKgorICogUGVyLXRocmVhZCBsaXN0IGhlYWQ6CisgKgorICogTk9URTogdGhpcyBzdHJ1Y3R1cmUgaXMgcGFydCBvZiB0aGUgc3lzY2FsbCBBQkksIGFuZCBtdXN0IG9ubHkgYmUKKyAqIGNoYW5nZWQgaWYgdGhlIGNoYW5nZSBpcyBmaXJzdCBjb21tdW5pY2F0ZWQgd2l0aCB0aGUgZ2xpYmMgZm9sa3MuCisgKiAoV2hlbiBhbiBpbmNvbXBhdGlibGUgY2hhbmdlIGlzIGRvbmUsIHdlJ2xsIGluY3JlYXNlIHRoZSBzdHJ1Y3R1cmUKKyAqICBzaXplLCB3aGljaCBnbGliYyB3aWxsIGRldGVjdCkKKyAqLworc3RydWN0IHJvYnVzdF9saXN0X2hlYWQgeworCS8qCisJICogVGhlIGhlYWQgb2YgdGhlIGxpc3QuIFBvaW50cyBiYWNrIHRvIGl0c2VsZiBpZiBlbXB0eToKKwkgKi8KKwlzdHJ1Y3Qgcm9idXN0X2xpc3QgbGlzdDsKKworCS8qCisJICogVGhpcyByZWxhdGl2ZSBvZmZzZXQgaXMgc2V0IGJ5IHVzZXItc3BhY2UsIGl0IGdpdmVzIHRoZSBrZXJuZWwKKwkgKiB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGZ1dGV4IGZpZWxkIHRvIGV4YW1pbmUuIFRoaXMgd2F5CisJICogd2Uga2VlcCB1c2Vyc3BhY2UgZmxleGlibGUsIHRvIGZyZWVseSBzaGFwZSBpdHMgZGF0YS1zdHJ1Y3R1cmUsCisJICogd2l0aG91dCBoYXJkY29kaW5nIGFueSBwYXJ0aWN1bGFyIG9mZnNldCBpbnRvIHRoZSBrZXJuZWw6CisJICovCisJbG9uZyBmdXRleF9vZmZzZXQ7CisKKwkvKgorCSAqIFRoZSBkZWF0aCBvZiB0aGUgdGhyZWFkIG1heSByYWNlIHdpdGggdXNlcnNwYWNlIHNldHRpbmcKKwkgKiB1cCBhIGxvY2sncyBsaW5rcy4gU28gdG8gaGFuZGxlIHRoaXMgcmFjZSwgdXNlcnNwYWNlIGZpcnN0CisJICogc2V0cyB0aGlzIGZpZWxkIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSB0by1iZS10YWtlbiBsb2NrLAorCSAqIHRoZW4gZG9lcyB0aGUgbG9jayBhY3F1aXJlLCBhbmQgdGhlbiBhZGRzIGl0c2VsZiB0byB0aGUKKwkgKiBsaXN0LCBhbmQgdGhlbiBjbGVhcnMgdGhpcyBmaWVsZC4gSGVuY2UgdGhlIGtlcm5lbCB3aWxsCisJICogYWx3YXlzIGhhdmUgZnVsbCBrbm93bGVkZ2Ugb2YgYWxsIGxvY2tzIHRoYXQgdGhlIHRocmVhZAorCSAqIF9taWdodF8gaGF2ZSB0YWtlbi4gV2UgY2hlY2sgdGhlIG93bmVyIFRJRCBpbiBhbnkgY2FzZSwKKwkgKiBzbyBvbmx5IHRydWx5IG93bmVkIGxvY2tzIHdpbGwgYmUgaGFuZGxlZC4KKwkgKi8KKwlzdHJ1Y3Qgcm9idXN0X2xpc3QgKmxpc3Rfb3BfcGVuZGluZzsKK307CisKKy8qCisgKiBBcmUgdGhlcmUgYW55IHdhaXRlcnMgZm9yIHRoaXMgcm9idXN0IGZ1dGV4OgorICovCisjZGVmaW5lIEZVVEVYX1dBSVRFUlMJCTB4ODAwMDAwMDAKKworLyoKKyAqIFRoZSBrZXJuZWwgc2lnbmFscyB2aWEgdGhpcyBiaXQgdGhhdCBhIHRocmVhZCBob2xkaW5nIGEgZnV0ZXgKKyAqIGhhcyBleGl0ZWQgd2l0aG91dCB1bmxvY2tpbmcgdGhlIGZ1dGV4LiBUaGUga2VybmVsIGFsc28gZG9lcworICogYSBGVVRFWF9XQUtFIG9uIHN1Y2ggZnV0ZXhlcywgYWZ0ZXIgc2V0dGluZyB0aGUgYml0LCB0byB3YWtlCisgKiB1cCBhbnkgcG9zc2libGUgd2FpdGVyczoKKyAqLworI2RlZmluZSBGVVRFWF9PV05FUl9ESUVECTB4NDAwMDAwMDAKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoZSByb2J1c3QtZnV0ZXggZmllbGQgaXMgZm9yIHRoZSBUSUQ6CisgKi8KKyNkZWZpbmUgRlVURVhfVElEX01BU0sJCTB4M2ZmZmZmZmYKKworLyoKKyAqIFRoaXMgbGltaXQgcHJvdGVjdHMgYWdhaW5zdCBhIGRlbGliZXJhdGVseSBjaXJjdWxhciBsaXN0LgorICogKE5vdCB3b3J0aCBpbnRyb2R1Y2luZyBhbiBybGltaXQgZm9yIGl0KQorICovCisjZGVmaW5lIFJPQlVTVF9MSVNUX0xJTUlUCTIwNDgKKworCisjZGVmaW5lIEZVVEVYX09QX1NFVAkJMAkvKiAqKGludCAqKVVBRERSMiA9IE9QQVJHOyAqLworI2RlZmluZSBGVVRFWF9PUF9BREQJCTEJLyogKihpbnQgKilVQUREUjIgKz0gT1BBUkc7ICovCisjZGVmaW5lIEZVVEVYX09QX09SCQkyCS8qICooaW50ICopVUFERFIyIHw9IE9QQVJHOyAqLworI2RlZmluZSBGVVRFWF9PUF9BTkROCQkzCS8qICooaW50ICopVUFERFIyICY9IH5PUEFSRzsgKi8KKyNkZWZpbmUgRlVURVhfT1BfWE9SCQk0CS8qICooaW50ICopVUFERFIyIF49IE9QQVJHOyAqLworCisjZGVmaW5lIEZVVEVYX09QX09QQVJHX1NISUZUCTgJLyogVXNlICgxIDw8IE9QQVJHKSBpbnN0ZWFkIG9mIE9QQVJHLiAgKi8KKworI2RlZmluZSBGVVRFWF9PUF9DTVBfRVEJCTAJLyogaWYgKG9sZHZhbCA9PSBDTVBBUkcpIHdha2UgKi8KKyNkZWZpbmUgRlVURVhfT1BfQ01QX05FCQkxCS8qIGlmIChvbGR2YWwgIT0gQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9MVAkJMgkvKiBpZiAob2xkdmFsIDwgQ01QQVJHKSB3YWtlICovCisjZGVmaW5lIEZVVEVYX09QX0NNUF9MRQkJMwkvKiBpZiAob2xkdmFsIDw9IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfR1QJCTQJLyogaWYgKG9sZHZhbCA+IENNUEFSRykgd2FrZSAqLworI2RlZmluZSBGVVRFWF9PUF9DTVBfR0UJCTUJLyogaWYgKG9sZHZhbCA+PSBDTVBBUkcpIHdha2UgKi8KKworLyogRlVURVhfV0FLRV9PUCB3aWxsIHBlcmZvcm0gYXRvbWljYWxseQorICAgaW50IG9sZHZhbCA9ICooaW50ICopVUFERFIyOworICAgKihpbnQgKilVQUREUjIgPSBvbGR2YWwgT1AgT1BBUkc7CisgICBpZiAob2xkdmFsIENNUCBDTVBBUkcpCisgICAgIHdha2UgVUFERFIyOyAgKi8KKworI2RlZmluZSBGVVRFWF9PUChvcCwgb3BhcmcsIGNtcCwgY21wYXJnKSBcCisgICgoKG9wICYgMHhmKSA8PCAyOCkgfCAoKGNtcCAmIDB4ZikgPDwgMjQpCQlcCisgICB8ICgob3BhcmcgJiAweGZmZikgPDwgMTIpIHwgKGNtcGFyZyAmIDB4ZmZmKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dhbWVwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzM2M0YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2FtZXBvcnQuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9HQU1FUE9SVF9ICisjZGVmaW5lIF9HQU1FUE9SVF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKworI2RlZmluZSBHQU1FUE9SVF9NT0RFX0RJU0FCTEVECQkwCisjZGVmaW5lIEdBTUVQT1JUX01PREVfUkFXCQkxCisjZGVmaW5lIEdBTUVQT1JUX01PREVfQ09PS0VECQkyCisKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0FOQUxPRwkweDAwMDEKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX01BRENBVFoJMHgwMDAyCisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9MT0dJVEVDSAkweDAwMDMKKyNkZWZpbmUgR0FNRVBPUlRfSURfVkVORE9SX0NSRUFUSVZFCTB4MDAwNAorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfR0VOSVVTCTB4MDAwNQorI2RlZmluZSBHQU1FUE9SVF9JRF9WRU5ET1JfSU5URVJBQ1QJMHgwMDA2CisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9NSUNST1NPRlQJMHgwMDA3CisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9USFJVU1RNQVNURVIJMHgwMDA4CisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9HUkFWSVMJMHgwMDA5CisjZGVmaW5lIEdBTUVQT1JUX0lEX1ZFTkRPUl9HVUlMTEVNT1QJMHgwMDBhCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5fc3RhdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuX3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmNGU3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuX3N0YXRzLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBfX0xJTlVYX0dFTl9TVEFUU19ICisjZGVmaW5lIF9fTElOVVhfR0VOX1NUQVRTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2VudW0geworCVRDQV9TVEFUU19VTlNQRUMsCisJVENBX1NUQVRTX0JBU0lDLAorCVRDQV9TVEFUU19SQVRFX0VTVCwKKwlUQ0FfU1RBVFNfUVVFVUUsCisJVENBX1NUQVRTX0FQUCwKKwlfX1RDQV9TVEFUU19NQVgsCit9OworI2RlZmluZSBUQ0FfU1RBVFNfTUFYIChfX1RDQV9TVEFUU19NQVggLSAxKQorCisvKioKKyAqIHN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljIC0gYnl0ZS9wYWNrZXQgdGhyb3VnaHB1dCBzdGF0aXN0aWNzCisgKiBAYnl0ZXM6IG51bWJlciBvZiBzZWVuIGJ5dGVzCisgKiBAcGFja2V0czogbnVtYmVyIG9mIHNlZW4gcGFja2V0cworICovCitzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpYworeworCV9fdTY0CWJ5dGVzOworCV9fdTMyCXBhY2tldHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0IC0gcmF0ZSBlc3RpbWF0b3IKKyAqIEBicHM6IGN1cnJlbnQgYnl0ZSByYXRlCisgKiBAcHBzOiBjdXJyZW50IHBhY2tldCByYXRlCisgKi8KK3N0cnVjdCBnbmV0X3N0YXRzX3JhdGVfZXN0Cit7CisJX191MzIJYnBzOworCV9fdTMyCXBwczsKK307CisKKy8qKgorICogc3RydWN0IGduZXRfc3RhdHNfcXVldWUgLSBxdWV1aW5nIHN0YXRpc3RpY3MKKyAqIEBxbGVuOiBxdWV1ZSBsZW5ndGgKKyAqIEBiYWNrbG9nOiBiYWNrbG9nIHNpemUgb2YgcXVldWUKKyAqIEBkcm9wczogbnVtYmVyIG9mIGRyb3BwZWQgcGFja2V0cworICogQHJlcXVldWVzOiBudW1iZXIgb2YgcmVxdWV1ZXMKKyAqIEBvdmVybGltaXRzOiBudW1iZXIgb2YgZW5xdWV1ZXMgb3ZlciB0aGUgbGltaXQKKyAqLworc3RydWN0IGduZXRfc3RhdHNfcXVldWUKK3sKKwlfX3UzMglxbGVuOworCV9fdTMyCWJhY2tsb2c7CisJX191MzIJZHJvcHM7CisJX191MzIJcmVxdWV1ZXM7CisJX191MzIJb3ZlcmxpbWl0czsKK307CisKKy8qKgorICogc3RydWN0IGduZXRfZXN0aW1hdG9yIC0gcmF0ZSBlc3RpbWF0b3IgY29uZmlndXJhdGlvbgorICogQGludGVydmFsOiBzYW1wbGluZyBwZXJpb2QKKyAqIEBld21hX2xvZzogdGhlIGxvZyBvZiBtZWFzdXJlbWVudCB3aW5kb3cgd2VpZ2h0CisgKi8KK3N0cnVjdCBnbmV0X2VzdGltYXRvcgoreworCXNpZ25lZCBjaGFyCWludGVydmFsOworCXVuc2lnbmVkIGNoYXIJZXdtYV9sb2c7Cit9OworCisKKyNlbmRpZiAvKiBfX0xJTlVYX0dFTl9TVEFUU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmVyaWNfc2VyaWFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmVyaWNfc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1OTZiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXJpY19zZXJpYWwuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogIGdlbmVyaWNfc2VyaWFsLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4IFIuRS5Xb2xmZkBCaXRXaXphcmQubmwKKyAqCisgKiAgd3JpdHRlbiBmb3IgdGhlIFNYIHNlcmlhbCBkcml2ZXIuCisgKiAgICAgQ29udGFpbnMgdGhlIGNvZGUgdGhhdCBzaG91bGQgYmUgc2hhcmVkIG92ZXIgYWxsIHRoZSBzZXJpYWwgZHJpdmVycy4KKyAqCisgKiAgVmVyc2lvbiAwLjEgLS0gRGVjZW1iZXIsIDE5OTguCisgKi8KKworI2lmbmRlZiBHRU5FUklDX1NFUklBTF9ICisjZGVmaW5lIEdFTkVSSUNfU0VSSUFMX0gKKworCisvKiBGbGFncyAqLworLyogV2FybmluZzogc2VyaWFsLmggZGVmaW5lcyBzb21lIEFTWU5DXyBmbGFncywgdGhleSBzYXkgdGhleSBhcmUgIm9ubHkiCisgICB1c2VkIGluIHNlcmlhbC5jLCBidXQgdGhleSBhcmUgYWxzbyB1c2VkIGluIGFsbCBvdGhlciBzZXJpYWwgZHJpdmVycy4gCisgICBNYWtlIHN1cmUgdGhleSBkb24ndCBjbGFzaCB3aXRoIHRoZXNlIGhlcmUuLi4gKi8KKyNkZWZpbmUgR1NfVFhfSU5URU4gICAgICAweDAwODAwMDAwCisjZGVmaW5lIEdTX1JYX0lOVEVOICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBHU19BQ1RJVkUgICAgICAgIDB4MDAyMDAwMDAKKworCisKKyNkZWZpbmUgR1NfVFlQRV9OT1JNQUwgICAxCisKKyNkZWZpbmUgR1NfREVCVUdfRkxVU0ggICAweDAwMDAwMDAxCisjZGVmaW5lIEdTX0RFQlVHX0JUUiAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHU19ERUJVR19URVJNSU9TIDB4MDAwMDAwMDQKKyNkZWZpbmUgR1NfREVCVUdfU1RVRkYgICAweDAwMDAwMDA4CisjZGVmaW5lIEdTX0RFQlVHX0NMT1NFICAgMHgwMDAwMDAxMAorI2RlZmluZSBHU19ERUJVR19GTE9XICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgR1NfREVCVUdfV1JJVEUgICAweDAwMDAwMDQwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMDJjOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmgKQEAgLTAsMCArMSw4MiBAQAorI2lmbmRlZiBfX0xJTlVYX0dFTkVSSUNfTkVUTElOS19ICisjZGVmaW5lIF9fTElOVVhfR0VORVJJQ19ORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKworI2RlZmluZSBHRU5MX05BTVNJWgkxNgkvKiBsZW5ndGggb2YgZmFtaWx5IG5hbWUgKi8KKworI2RlZmluZSBHRU5MX01JTl9JRAlOTE1TR19NSU5fVFlQRQorI2RlZmluZSBHRU5MX01BWF9JRAkxMDIzCisKK3N0cnVjdCBnZW5sbXNnaGRyIHsKKwlfX3U4CWNtZDsKKwlfX3U4CXZlcnNpb247CisJX191MTYJcmVzZXJ2ZWQ7Cit9OworCisjZGVmaW5lIEdFTkxfSERSTEVOCU5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgZ2VubG1zZ2hkcikpCisKKyNkZWZpbmUgR0VOTF9BRE1JTl9QRVJNCQkweDAxCisjZGVmaW5lIEdFTkxfQ01EX0NBUF9ETwkJMHgwMgorI2RlZmluZSBHRU5MX0NNRF9DQVBfRFVNUAkweDA0CisjZGVmaW5lIEdFTkxfQ01EX0NBUF9IQVNQT0wJMHgwOAorCisvKgorICogTGlzdCBvZiByZXNlcnZlZCBzdGF0aWMgZ2VuZXJpYyBuZXRsaW5rIGlkZW50aWZpZXJzOgorICovCisjZGVmaW5lIEdFTkxfSURfR0VORVJBVEUJMAorI2RlZmluZSBHRU5MX0lEX0NUUkwJCU5MTVNHX01JTl9UWVBFCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udHJvbGxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIHsKKwlDVFJMX0NNRF9VTlNQRUMsCisJQ1RSTF9DTURfTkVXRkFNSUxZLAorCUNUUkxfQ01EX0RFTEZBTUlMWSwKKwlDVFJMX0NNRF9HRVRGQU1JTFksCisJQ1RSTF9DTURfTkVXT1BTLAorCUNUUkxfQ01EX0RFTE9QUywKKwlDVFJMX0NNRF9HRVRPUFMsCisJQ1RSTF9DTURfTkVXTUNBU1RfR1JQLAorCUNUUkxfQ01EX0RFTE1DQVNUX0dSUCwKKwlDVFJMX0NNRF9HRVRNQ0FTVF9HUlAsIC8qIHVudXNlZCAqLworCV9fQ1RSTF9DTURfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0NNRF9NQVggKF9fQ1RSTF9DTURfTUFYIC0gMSkKKworZW51bSB7CisJQ1RSTF9BVFRSX1VOU1BFQywKKwlDVFJMX0FUVFJfRkFNSUxZX0lELAorCUNUUkxfQVRUUl9GQU1JTFlfTkFNRSwKKwlDVFJMX0FUVFJfVkVSU0lPTiwKKwlDVFJMX0FUVFJfSERSU0laRSwKKwlDVFJMX0FUVFJfTUFYQVRUUiwKKwlDVFJMX0FUVFJfT1BTLAorCUNUUkxfQVRUUl9NQ0FTVF9HUk9VUFMsCisJX19DVFJMX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0FUVFJfTUFYIChfX0NUUkxfQVRUUl9NQVggLSAxKQorCitlbnVtIHsKKwlDVFJMX0FUVFJfT1BfVU5TUEVDLAorCUNUUkxfQVRUUl9PUF9JRCwKKwlDVFJMX0FUVFJfT1BfRkxBR1MsCisJX19DVFJMX0FUVFJfT1BfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0FUVFJfT1BfTUFYIChfX0NUUkxfQVRUUl9PUF9NQVggLSAxKQorCitlbnVtIHsKKwlDVFJMX0FUVFJfTUNBU1RfR1JQX1VOU1BFQywKKwlDVFJMX0FUVFJfTUNBU1RfR1JQX05BTUUsCisJQ1RSTF9BVFRSX01DQVNUX0dSUF9JRCwKKwlfX0NUUkxfQVRUUl9NQ0FTVF9HUlBfTUFYLAorfTsKKworI2RlZmluZSBDVFJMX0FUVFJfTUNBU1RfR1JQX01BWCAoX19DVFJMX0FUVFJfTUNBU1RfR1JQX01BWCAtIDEpCisKKyNlbmRpZgkvKiBfX0xJTlVYX0dFTkVSSUNfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzMDhmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtMCwwICsxLDIxMiBAQAorI2lmbmRlZiBfTElOVVhfR0VOSERfSAorI2RlZmluZSBfTElOVVhfR0VOSERfSAorCisvKgorICogCWdlbmhkLmggQ29weXJpZ2h0IChDKSAxOTkyIERyZXcgRWNraGFyZHQKKyAqCUdlbmVyaWMgaGFyZCBkaXNrIGhlYWRlciBmaWxlIGJ5ICAKKyAqIAkJRHJldyBFY2toYXJkdAorICoKKyAqCQk8ZHJld0Bjb2xvcmFkby5lZHU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZmRlZiBDT05GSUdfQkxPQ0sKKworZW51bSB7CisvKiBUaGVzZSB0aHJlZSBoYXZlIGlkZW50aWNhbCBiZWhhdmlvdXI7IHVzZSB0aGUgc2Vjb25kIG9uZSBpZiBET1MgRkRJU0sgZ2V0cworICAgY29uZnVzZWQgYWJvdXQgZXh0ZW5kZWQvbG9naWNhbCBwYXJ0aXRpb25zIHN0YXJ0aW5nIHBhc3QgY3lsaW5kZXIgMTAyMy4gKi8KKwlET1NfRVhURU5ERURfUEFSVElUSU9OID0gNSwKKwlMSU5VWF9FWFRFTkRFRF9QQVJUSVRJT04gPSAweDg1LAorCVdJTjk4X0VYVEVOREVEX1BBUlRJVElPTiA9IDB4MGYsCisKKwlTVU5fV0hPTEVfRElTSyA9IERPU19FWFRFTkRFRF9QQVJUSVRJT04sCisKKwlMSU5VWF9TV0FQX1BBUlRJVElPTiA9IDB4ODIsCisJTElOVVhfREFUQV9QQVJUSVRJT04gPSAweDgzLAorCUxJTlVYX0xWTV9QQVJUSVRJT04gPSAweDhlLAorCUxJTlVYX1JBSURfUEFSVElUSU9OID0gMHhmZCwJLyogYXV0b2RldGVjdCBSQUlEIHBhcnRpdGlvbiAqLworCisJU09MQVJJU19YODZfUEFSVElUSU9OID0JTElOVVhfU1dBUF9QQVJUSVRJT04sCisJTkVXX1NPTEFSSVNfWDg2X1BBUlRJVElPTiA9IDB4YmYsCisKKwlETTZfQVVYMVBBUlRJVElPTiA9IDB4NTEsCS8qIG5vIERETzogIHVzZSB4bGF0ZWQgZ2VvbSAqLworCURNNl9BVVgzUEFSVElUSU9OID0gMHg1MywJLyogbm8gRERPOiAgdXNlIHhsYXRlZCBnZW9tICovCisJRE02X1BBUlRJVElPTiA9CTB4NTQsCQkvKiBoYXMgRERPOiB1c2UgeGxhdGVkIGdlb20gJiBvZmZzZXQgKi8KKwlFWkRfUEFSVElUSU9OID0JMHg1NSwJCS8qIEVaLURSSVZFICovCisKKwlGUkVFQlNEX1BBUlRJVElPTiA9IDB4YTUsCS8qIEZyZWVCU0QgUGFydGl0aW9uIElEICovCisJT1BFTkJTRF9QQVJUSVRJT04gPSAweGE2LAkvKiBPcGVuQlNEIFBhcnRpdGlvbiBJRCAqLworCU5FVEJTRF9QQVJUSVRJT04gPSAweGE5LAkvKiBOZXRCU0QgUGFydGl0aW9uIElEICovCisJQlNESV9QQVJUSVRJT04gPSAweGI3LAkJLyogQlNESSBQYXJ0aXRpb24gSUQgKi8KKwlNSU5JWF9QQVJUSVRJT04gPSAweDgxLAkJLyogTWluaXggUGFydGl0aW9uIElEICovCisJVU5JWFdBUkVfUEFSVElUSU9OID0gMHg2MywJLyogU2FtZSBhcyBHTlVfSFVSRCBhbmQgU0NPIFVuaXggKi8KK307CisKKworc3RydWN0IHBhcnRpdGlvbiB7CisJdW5zaWduZWQgY2hhciBib290X2luZDsJCS8qIDB4ODAgLSBhY3RpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIGhlYWQ7CQkvKiBzdGFydGluZyBoZWFkICovCisJdW5zaWduZWQgY2hhciBzZWN0b3I7CQkvKiBzdGFydGluZyBzZWN0b3IgKi8KKwl1bnNpZ25lZCBjaGFyIGN5bDsJCS8qIHN0YXJ0aW5nIGN5bGluZGVyICovCisJdW5zaWduZWQgY2hhciBzeXNfaW5kOwkJLyogV2hhdCBwYXJ0aXRpb24gdHlwZSAqLworCXVuc2lnbmVkIGNoYXIgZW5kX2hlYWQ7CQkvKiBlbmQgaGVhZCAqLworCXVuc2lnbmVkIGNoYXIgZW5kX3NlY3RvcjsJLyogZW5kIHNlY3RvciAqLworCXVuc2lnbmVkIGNoYXIgZW5kX2N5bDsJCS8qIGVuZCBjeWxpbmRlciAqLworCXVuc2lnbmVkIGludCBzdGFydF9zZWN0OwkvKiBzdGFydGluZyBzZWN0b3IgY291bnRpbmcgZnJvbSAwICovCisJdW5zaWduZWQgaW50IG5yX3NlY3RzOwkJLyogbnIgb2Ygc2VjdG9ycyBpbiBwYXJ0aXRpb24gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworCisjaWZkZWYgQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTgorCisjZGVmaW5lIFNPTEFSSVNfWDg2X05VTVNMSUNFCTE2CisjZGVmaW5lIFNPTEFSSVNfWDg2X1ZUT0NfU0FORQkoMHg2MDBEREVFRVVMKQorCitzdHJ1Y3Qgc29sYXJpc194ODZfc2xpY2UgeworCV9fbGUxNiBzX3RhZzsJCS8qIElEIHRhZyBvZiBwYXJ0aXRpb24gKi8KKwlfX2xlMTYgc19mbGFnOwkJLyogcGVybWlzc2lvbiBmbGFncyAqLworCV9fbGUzMiBzX3N0YXJ0OwkJLyogc3RhcnQgc2VjdG9yIG5vIG9mIHBhcnRpdGlvbiAqLworCV9fbGUzMiBzX3NpemU7CQkvKiAjIG9mIGJsb2NrcyBpbiBwYXJ0aXRpb24gKi8KK307CisKK3N0cnVjdCBzb2xhcmlzX3g4Nl92dG9jIHsKKwl1bnNpZ25lZCBpbnQgdl9ib290aW5mb1szXTsJLyogaW5mbyBuZWVkZWQgYnkgbWJvb3QgKHVuc3VwcG9ydGVkKSAqLworCV9fbGUzMiB2X3Nhbml0eTsJCS8qIHRvIHZlcmlmeSB2dG9jIHNhbml0eSAqLworCV9fbGUzMiB2X3ZlcnNpb247CQkvKiBsYXlvdXQgdmVyc2lvbiAqLworCWNoYXIJdl92b2x1bWVbOF07CQkvKiB2b2x1bWUgbmFtZSAqLworCV9fbGUxNgl2X3NlY3RvcnN6OwkJLyogc2VjdG9yIHNpemUgaW4gYnl0ZXMgKi8KKwlfX2xlMTYJdl9ucGFydHM7CQkvKiBudW1iZXIgb2YgcGFydGl0aW9ucyAqLworCXVuc2lnbmVkIGludCB2X3Jlc2VydmVkWzEwXTsJLyogZnJlZSBzcGFjZSAqLworCXN0cnVjdCBzb2xhcmlzX3g4Nl9zbGljZQorCQl2X3NsaWNlW1NPTEFSSVNfWDg2X05VTVNMSUNFXTsgLyogc2xpY2UgaGVhZGVycyAqLworCXVuc2lnbmVkIGludCB0aW1lc3RhbXBbU09MQVJJU19YODZfTlVNU0xJQ0VdOyAvKiB0aW1lc3RhbXAgKHVuc3VwcG9ydGVkKSAqLworCWNoYXIJdl9hc2NpaWxhYmVsWzEyOF07CS8qIGZvciBjb21wYXRpYmlsaXR5ICovCit9OworCisjZW5kaWYgLyogQ09ORklHX1NPTEFSSVNfWDg2X1BBUlRJVElPTiAqLworCisjaWZkZWYgQ09ORklHX0JTRF9ESVNLTEFCRUwKKy8qCisgKiBCU0QgZGlza2xhYmVsIHN1cHBvcnQgYnkgWW9zc2kgR290dGxpZWIgPHlvZ29AbWF0aC50YXUuYWMuaWw+CisgKiB1cGRhdGVkIGJ5IE1hcmMgRXNwaWUgPE1hcmMuRXNwaWVAb3BlbmJzZC5vcmc+CisgKi8KKworLyogY2hlY2sgYWdhaW5zdCBCU0Qgc3JjL3N5cy9zeXMvZGlza2xhYmVsLmggZm9yIGNvbnNpc3RlbmN5ICovCisKKyNkZWZpbmUgQlNEX0RJU0tNQUdJQwkoMHg4MjU2NDU1N1VMKQkvKiBUaGUgZGlzayBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgQlNEX01BWFBBUlRJVElPTlMJMTYKKyNkZWZpbmUgT1BFTkJTRF9NQVhQQVJUSVRJT05TCTE2CisjZGVmaW5lIEJTRF9GU19VTlVTRUQJCTAJLyogZGlza2xhYmVsIHVudXNlZCBwYXJ0aXRpb24gZW50cnkgSUQgKi8KK3N0cnVjdCBic2RfZGlza2xhYmVsIHsKKwlfX2xlMzIJZF9tYWdpYzsJCS8qIHRoZSBtYWdpYyBudW1iZXIgKi8KKwlfX3MxNglkX3R5cGU7CQkJLyogZHJpdmUgdHlwZSAqLworCV9fczE2CWRfc3VidHlwZTsJCS8qIGNvbnRyb2xsZXIvZF90eXBlIHNwZWNpZmljICovCisJY2hhcglkX3R5cGVuYW1lWzE2XTsJCS8qIHR5cGUgbmFtZSwgZS5nLiAiZWFnbGUiICovCisJY2hhcglkX3BhY2tuYW1lWzE2XTsJCQkvKiBwYWNrIGlkZW50aWZpZXIgKi8gCisJX191MzIJZF9zZWNzaXplOwkJLyogIyBvZiBieXRlcyBwZXIgc2VjdG9yICovCisJX191MzIJZF9uc2VjdG9yczsJCS8qICMgb2YgZGF0YSBzZWN0b3JzIHBlciB0cmFjayAqLworCV9fdTMyCWRfbnRyYWNrczsJCS8qICMgb2YgdHJhY2tzIHBlciBjeWxpbmRlciAqLworCV9fdTMyCWRfbmN5bGluZGVyczsJCS8qICMgb2YgZGF0YSBjeWxpbmRlcnMgcGVyIHVuaXQgKi8KKwlfX3UzMglkX3NlY3BlcmN5bDsJCS8qICMgb2YgZGF0YSBzZWN0b3JzIHBlciBjeWxpbmRlciAqLworCV9fdTMyCWRfc2VjcGVydW5pdDsJCS8qICMgb2YgZGF0YSBzZWN0b3JzIHBlciB1bml0ICovCisJX191MTYJZF9zcGFyZXNwZXJ0cmFjazsJLyogIyBvZiBzcGFyZSBzZWN0b3JzIHBlciB0cmFjayAqLworCV9fdTE2CWRfc3BhcmVzcGVyY3lsOwkJLyogIyBvZiBzcGFyZSBzZWN0b3JzIHBlciBjeWxpbmRlciAqLworCV9fdTMyCWRfYWN5bGluZGVyczsJCS8qICMgb2YgYWx0LiBjeWxpbmRlcnMgcGVyIHVuaXQgKi8KKwlfX3UxNglkX3JwbTsJCQkvKiByb3RhdGlvbmFsIHNwZWVkICovCisJX191MTYJZF9pbnRlcmxlYXZlOwkJLyogaGFyZHdhcmUgc2VjdG9yIGludGVybGVhdmUgKi8KKwlfX3UxNglkX3RyYWNrc2tldzsJCS8qIHNlY3RvciAwIHNrZXcsIHBlciB0cmFjayAqLworCV9fdTE2CWRfY3lsc2tldzsJCS8qIHNlY3RvciAwIHNrZXcsIHBlciBjeWxpbmRlciAqLworCV9fdTMyCWRfaGVhZHN3aXRjaDsJCS8qIGhlYWQgc3dpdGNoIHRpbWUsIHVzZWMgKi8KKwlfX3UzMglkX3Rya3NlZWs7CQkvKiB0cmFjay10by10cmFjayBzZWVrLCB1c2VjICovCisJX191MzIJZF9mbGFnczsJCS8qIGdlbmVyaWMgZmxhZ3MgKi8KKyNkZWZpbmUgTkREQVRBIDUKKwlfX3UzMglkX2RyaXZlZGF0YVtORERBVEFdOwkvKiBkcml2ZS10eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE5TUEFSRSA1CisJX191MzIJZF9zcGFyZVtOU1BBUkVdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCV9fbGUzMglkX21hZ2ljMjsJCS8qIHRoZSBtYWdpYyBudW1iZXIgKGFnYWluKSAqLworCV9fbGUxNglkX2NoZWNrc3VtOwkJLyogeG9yIG9mIGRhdGEgaW5jbC4gcGFydGl0aW9ucyAqLworCisJCQkvKiBmaWxlc3lzdGVtIGFuZCBwYXJ0aXRpb24gaW5mb3JtYXRpb246ICovCisJX19sZTE2CWRfbnBhcnRpdGlvbnM7CQkvKiBudW1iZXIgb2YgcGFydGl0aW9ucyBpbiBmb2xsb3dpbmcgKi8KKwlfX2xlMzIJZF9iYnNpemU7CQkvKiBzaXplIG9mIGJvb3QgYXJlYSBhdCBzbjAsIGJ5dGVzICovCisJX19sZTMyCWRfc2JzaXplOwkJLyogbWF4IHNpemUgb2YgZnMgc3VwZXJibG9jaywgYnl0ZXMgKi8KKwlzdHJ1Y3QJYnNkX3BhcnRpdGlvbiB7CQkvKiB0aGUgcGFydGl0aW9uIHRhYmxlICovCisJCV9fbGUzMglwX3NpemU7CQkvKiBudW1iZXIgb2Ygc2VjdG9ycyBpbiBwYXJ0aXRpb24gKi8KKwkJX19sZTMyCXBfb2Zmc2V0OwkvKiBzdGFydGluZyBzZWN0b3IgKi8KKwkJX19sZTMyCXBfZnNpemU7CS8qIGZpbGVzeXN0ZW0gYmFzaWMgZnJhZ21lbnQgc2l6ZSAqLworCQlfX3U4CXBfZnN0eXBlOwkvKiBmaWxlc3lzdGVtIHR5cGUsIHNlZSBiZWxvdyAqLworCQlfX3U4CXBfZnJhZzsJCS8qIGZpbGVzeXN0ZW0gZnJhZ21lbnRzIHBlciBibG9jayAqLworCQlfX2xlMTYJcF9jcGc7CQkvKiBmaWxlc3lzdGVtIGN5bGluZGVycyBwZXIgZ3JvdXAgKi8KKwl9IGRfcGFydGl0aW9uc1tCU0RfTUFYUEFSVElUSU9OU107CS8qIGFjdHVhbGx5IG1heSBiZSBtb3JlICovCit9OworCisjZW5kaWYJLyogQ09ORklHX0JTRF9ESVNLTEFCRUwgKi8KKworI2lmZGVmIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwKKy8qCisgKiBVbml4d2FyZSBzbGljZXMgc3VwcG9ydCBieSBBbmRyemVqIEtyenlzenRvZm93aWN6IDxhbmtyeUBtaWYucGcuZ2RhLnBsPgorICogYW5kIEtyenlzenRvZiBHLiBCYXJhbm93c2tpIDxrZ2JAa25tLm9yZy5wbD4KKyAqLworCisjZGVmaW5lIFVOSVhXQVJFX0RJU0tNQUdJQyAgICAgKDB4Q0E1RTYwMERVTCkJLyogVGhlIGRpc2sgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIFVOSVhXQVJFX0RJU0tNQUdJQzIgICAgKDB4NjAwRERFRUVVTCkJLyogVGhlIHNsaWNlIHRhYmxlIG1hZ2ljIG5yICovCisjZGVmaW5lIFVOSVhXQVJFX05VTVNMSUNFICAgICAgMTYKKyNkZWZpbmUgVU5JWFdBUkVfRlNfVU5VU0VEICAgICAwCQkvKiBVbnVzZWQgc2xpY2UgZW50cnkgSUQgKi8KKworc3RydWN0IHVuaXh3YXJlX3NsaWNlIHsKKwlfX2xlMTYgICBzX2xhYmVsOwkvKiBsYWJlbCAqLworCV9fbGUxNiAgIHNfZmxhZ3M7CS8qIHBlcm1pc3Npb24gZmxhZ3MgKi8KKwlfX2xlMzIgICBzdGFydF9zZWN0OwkvKiBzdGFydGluZyBzZWN0b3IgKi8KKwlfX2xlMzIgICBucl9zZWN0czsJLyogbnVtYmVyIG9mIHNlY3RvcnMgaW4gc2xpY2UgKi8KK307CisKK3N0cnVjdCB1bml4d2FyZV9kaXNrbGFiZWwgeworCV9fbGUzMiAgIGRfdHlwZTsgICAgICAgICAgICAgICAJLyogZHJpdmUgdHlwZSAqLworCV9fbGUzMiAgIGRfbWFnaWM7ICAgICAgICAgICAgICAgIC8qIHRoZSBtYWdpYyBudW1iZXIgKi8KKwlfX2xlMzIgICBkX3ZlcnNpb247ICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG51bWJlciAqLworCWNoYXIgICAgZF9zZXJpYWxbMTJdOyAgICAgICAgICAgLyogc2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlICovCisJX19sZTMyICAgZF9uY3lsaW5kZXJzOyAgICAgICAgICAgLyogIyBvZiBkYXRhIGN5bGluZGVycyBwZXIgZGV2aWNlICovCisJX19sZTMyICAgZF9udHJhY2tzOyAgICAgICAgICAgICAgLyogIyBvZiB0cmFja3MgcGVyIGN5bGluZGVyICovCisJX19sZTMyICAgZF9uc2VjdG9yczsgICAgICAgICAgICAgLyogIyBvZiBkYXRhIHNlY3RvcnMgcGVyIHRyYWNrICovCisJX19sZTMyICAgZF9zZWNzaXplOyAgICAgICAgICAgICAgLyogIyBvZiBieXRlcyBwZXIgc2VjdG9yICovCisJX19sZTMyICAgZF9wYXJ0X3N0YXJ0OyAgICAgICAgICAgLyogIyBvZiBmaXJzdCBzZWN0b3Igb2YgdGhpcyBwYXJ0aXRpb24gKi8KKwlfX2xlMzIgICBkX3Vua25vd24xWzEyXTsgICAgICAgICAvKiA/ICovCisgCV9fbGUzMglkX2FsdF90Ymw7ICAgICAgICAgICAgICAvKiBieXRlIG9mZnNldCBvZiBhbHRlcm5hdGUgdGFibGUgKi8KKyAJX19sZTMyCWRfYWx0X2xlbjsgICAgICAgICAgICAgIC8qIGJ5dGUgbGVuZ3RoIG9mIGFsdGVybmF0ZSB0YWJsZSAqLworIAlfX2xlMzIJZF9waHlzX2N5bDsgICAgICAgICAgICAgLyogIyBvZiBwaHlzaWNhbCBjeWxpbmRlcnMgcGVyIGRldmljZSAqLworIAlfX2xlMzIJZF9waHlzX3RyazsgICAgICAgICAgICAgLyogIyBvZiBwaHlzaWNhbCB0cmFja3MgcGVyIGN5bGluZGVyICovCisgCV9fbGUzMglkX3BoeXNfc2VjOyAgICAgICAgICAgICAvKiAjIG9mIHBoeXNpY2FsIHNlY3RvcnMgcGVyIHRyYWNrICovCisgCV9fbGUzMglkX3BoeXNfYnl0ZXM7ICAgICAgICAgICAvKiAjIG9mIHBoeXNpY2FsIGJ5dGVzIHBlciBzZWN0b3IgKi8KKyAJX19sZTMyCWRfdW5rbm93bjI7ICAgICAgICAgICAgIC8qID8gKi8KKwlfX2xlMzIgICBkX3Vua25vd24zOyAgICAgICAgICAgICAvKiA/ICovCisJX19sZTMyCWRfcGFkWzhdOyAgICAgICAgICAgICAgIC8qIHBhZCAqLworCisJc3RydWN0IHVuaXh3YXJlX3Z0b2MgeworCQlfX2xlMzIJdl9tYWdpYzsJCS8qIHRoZSBtYWdpYyBudW1iZXIgKi8KKwkJX19sZTMyCXZfdmVyc2lvbjsJCS8qIHZlcnNpb24gbnVtYmVyICovCisJCWNoYXIJdl9uYW1lWzhdOwkJLyogdm9sdW1lIG5hbWUgKi8KKwkJX19sZTE2CXZfbnNsaWNlczsJCS8qICMgb2Ygc2xpY2VzICovCisJCV9fbGUxNgl2X3Vua25vd24xOwkJLyogPyAqLworCQlfX2xlMzIJdl9yZXNlcnZlZFsxMF07CQkvKiByZXNlcnZlZCAqLworCQlzdHJ1Y3QgdW5peHdhcmVfc2xpY2UKKwkJCXZfc2xpY2VbVU5JWFdBUkVfTlVNU0xJQ0VdOwkvKiBzbGljZSBoZWFkZXJzICovCisJfSB2dG9jOworCit9OyAgLyogNDA4ICovCisKKyNlbmRpZiAvKiBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMICovCisKKyNpZmRlZiBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OCisjICAgZGVmaW5lIE1JTklYX05SX1NVQlBBUlRJVElPTlMgIDQKKyNlbmRpZiAvKiBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OICovCisKKworI2Vsc2UgLyogQ09ORklHX0JMT0NLICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcHJpbnRrX2FsbF9wYXJ0aXRpb25zKHZvaWQpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0JMT0NLICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9nZnMyX29uZGlzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dmczJfb25kaXNrLmgKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNpc3RpbmEgU29mdHdhcmUsIEluYy4gIDE5OTctMjAwMyBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvcHlyaWdodGVkIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwKKyAqIG1vZGlmeSwgY29weSwgb3IgcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugdi4yLgorICovCisKKyNpZm5kZWYgX19HRlMyX09ORElTS19ET1RfSF9fCisjZGVmaW5lIF9fR0ZTMl9PTkRJU0tfRE9UX0hfXworCisjZGVmaW5lIEdGUzJfTUFHSUMJCTB4MDExNjE5NzAKKyNkZWZpbmUgR0ZTMl9CQVNJQ19CTE9DSwk1MTIKKyNkZWZpbmUgR0ZTMl9CQVNJQ19CTE9DS19TSElGVAk5CisKKy8qIExvY2sgbnVtYmVycyBvZiB0aGUgTE1fVFlQRV9OT05ESVNLIHR5cGUgKi8KKworI2RlZmluZSBHRlMyX01PVU5UX0xPQ0sJCTAKKyNkZWZpbmUgR0ZTMl9MSVZFX0xPQ0sJCTEKKyNkZWZpbmUgR0ZTMl9UUkFOU19MT0NLCQkyCisjZGVmaW5lIEdGUzJfUkVOQU1FX0xPQ0sJMworCisvKiBGb3JtYXQgbnVtYmVycyBmb3IgdmFyaW91cyBtZXRhZGF0YSB0eXBlcyAqLworCisjZGVmaW5lIEdGUzJfRk9STUFUX05PTkUJMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9TQgkJMTAwCisjZGVmaW5lIEdGUzJfRk9STUFUX1JHCQkyMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUkIJCTMwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9ESQkJNDAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0lOCQk1MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfTEYJCTYwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9KRAkJNzAwCisjZGVmaW5lIEdGUzJfRk9STUFUX0xICQk4MDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfTEQJCTkwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9MQgkJMTAwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9FQQkJMTYwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9FRAkJMTcwMAorI2RlZmluZSBHRlMyX0ZPUk1BVF9RQwkJMTQwMAorLyogVGhlc2UgYXJlIGZvcm1hdCBudW1iZXJzIGZvciBlbnRpdGllcyBjb250YWluZWQgaW4gZmlsZXMgKi8KKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUkkJCTExMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfREUJCTEyMDAKKyNkZWZpbmUgR0ZTMl9GT1JNQVRfUVUJCTE1MDAKKy8qIFRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBzdXBlcmJsb2NrICovCisjZGVmaW5lIEdGUzJfRk9STUFUX0ZTCQkxODAxCisjZGVmaW5lIEdGUzJfRk9STUFUX01VTFRJCTE5MDAKKworLyoKKyAqIEFuIG9uLWRpc2sgaW5vZGUgbnVtYmVyCisgKi8KKworc3RydWN0IGdmczJfaW51bSB7CisJX19iZTY0IG5vX2Zvcm1hbF9pbm87CisJX19iZTY0IG5vX2FkZHI7Cit9OworCisvKgorICogR2VuZXJpYyBtZXRhZGF0YSBoZWFkIHN0cnVjdHVyZQorICogRXZlcnkgaW5wbGFjZSBidWZmZXIgbG9nZ2VkIGluIHRoZSBqb3VybmFsIG11c3Qgc3RhcnQgd2l0aCB0aGlzLgorICovCisKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9OT05FCTAKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9TQgkxCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfUkcJMgorI2RlZmluZSBHRlMyX01FVEFUWVBFX1JCCTMKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9ESQk0CisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfSU4JNQorI2RlZmluZSBHRlMyX01FVEFUWVBFX0xGCTYKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9KRAk3CisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfTEgJOAorI2RlZmluZSBHRlMyX01FVEFUWVBFX0xECTkKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9MQgkxMgorI2RlZmluZSBHRlMyX01FVEFUWVBFX0VBCTEwCisjZGVmaW5lIEdGUzJfTUVUQVRZUEVfRUQJMTEKKyNkZWZpbmUgR0ZTMl9NRVRBVFlQRV9RQwkxNAorCitzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciB7CisJX19iZTMyIG1oX21hZ2ljOworCV9fYmUzMiBtaF90eXBlOworCV9fYmU2NCBfX3BhZDA7CQkvKiBXYXMgZ2VuZXJhdGlvbiBudW1iZXIgaW4gZ2ZzMSAqLworCV9fYmUzMiBtaF9mb3JtYXQ7CisJX19iZTMyIF9fcGFkMTsJCS8qIFdhcyBpbmNhcm5hdGlvbiBudW1iZXIgaW4gZ2ZzMSAqLworfTsKKworLyoKKyAqIHN1cGVyLWJsb2NrIHN0cnVjdHVyZQorICoKKyAqIEl0J3MgcHJvYmFibHkgZ29vZCBpZiBTSVpFT0ZfU0IgPD0gR0ZTMl9CQVNJQ19CTE9DSyAoNTEyIGJ5dGVzKQorICoKKyAqIE9yZGVyIGlzIGltcG9ydGFudCwgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgb2xkIHN1cGVyYmxvY2tzIHRvIGRvIG9uLWRpc2sKKyAqIHZlcnNpb24gdXBncmFkZXMuCisgKi8KKworLyogQWRkcmVzcyBvZiBzdXBlcmJsb2NrIGluIEdGUzIgYmFzaWMgYmxvY2tzICovCisjZGVmaW5lIEdGUzJfU0JfQUREUgkJMTI4CisKKy8qIFRoZSBsb2NrIG51bWJlciBmb3IgdGhlIHN1cGVyYmxvY2sgKG11c3QgYmUgemVybykgKi8KKyNkZWZpbmUgR0ZTMl9TQl9MT0NLCQkwCisKKy8qIFJlcXVpcmVtZW50OiAgR0ZTMl9MT0NLTkFNRV9MRU4gJSA4ID09IDAKKyAgIEluY2x1ZGVzOiB0aGUgZmVuY2luZyB6ZXJvIGF0IHRoZSBlbmQgKi8KKyNkZWZpbmUgR0ZTMl9MT0NLTkFNRV9MRU4JNjQKKworc3RydWN0IGdmczJfc2IgeworCXN0cnVjdCBnZnMyX21ldGFfaGVhZGVyIHNiX2hlYWRlcjsKKworCV9fYmUzMiBzYl9mc19mb3JtYXQ7CisJX19iZTMyIHNiX211bHRpaG9zdF9mb3JtYXQ7CisJX191MzIgIF9fcGFkMDsJLyogV2FzIHN1cGVyYmxvY2sgZmxhZ3MgaW4gZ2ZzMSAqLworCisJX19iZTMyIHNiX2JzaXplOworCV9fYmUzMiBzYl9ic2l6ZV9zaGlmdDsKKwlfX3UzMiBfX3BhZDE7CS8qIFdhcyBqb3VybmFsIHNlZ21lbnQgc2l6ZSBpbiBnZnMxICovCisKKwlzdHJ1Y3QgZ2ZzMl9pbnVtIHNiX21hc3Rlcl9kaXI7IC8qIFdhcyBqaW5kZXggZGlub2RlIGluIGdmczEgKi8KKwlzdHJ1Y3QgZ2ZzMl9pbnVtIF9fcGFkMjsgLyogV2FzIHJpbmRleCBkaW5vZGUgaW4gZ2ZzMSAqLworCXN0cnVjdCBnZnMyX2ludW0gc2Jfcm9vdF9kaXI7CisKKwljaGFyIHNiX2xvY2twcm90b1tHRlMyX0xPQ0tOQU1FX0xFTl07CisJY2hhciBzYl9sb2NrdGFibGVbR0ZTMl9MT0NLTkFNRV9MRU5dOworCS8qIEluIGdmczEsIHF1b3RhIGFuZCBsaWNlbnNlIGRpbm9kZXMgZm9sbG93ZWQgKi8KK307CisKKy8qCisgKiByZXNvdXJjZSBpbmRleCBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgZ2ZzMl9yaW5kZXggeworCV9fYmU2NCByaV9hZGRyOwkvKiBncnAgYmxvY2sgZGlzayBhZGRyZXNzICovCisJX19iZTMyIHJpX2xlbmd0aDsJLyogbGVuZ3RoIG9mIHJncnAgaGVhZGVyIGluIGZzIGJsb2NrcyAqLworCV9fdTMyIF9fcGFkOworCisJX19iZTY0IHJpX2RhdGEwOwkvKiBmaXJzdCBkYXRhIGxvY2F0aW9uICovCisJX19iZTMyIHJpX2RhdGE7CS8qIG51bSBvZiBkYXRhIGJsb2NrcyBpbiByZ3JwICovCisKKwlfX2JlMzIgcmlfYml0Ynl0ZXM7CS8qIG51bWJlciBvZiBieXRlcyBpbiBkYXRhIGJpdG1hcHMgKi8KKworCV9fdTggcmlfcmVzZXJ2ZWRbNjRdOworfTsKKworLyoKKyAqIHJlc291cmNlIGdyb3VwIGhlYWRlciBzdHJ1Y3R1cmUKKyAqLworCisvKiBOdW1iZXIgb2YgYmxvY2tzIHBlciBieXRlIGluIHJncnAgKi8KKyNkZWZpbmUgR0ZTMl9OQkJZCQk0CisjZGVmaW5lIEdGUzJfQklUX1NJWkUJCTIKKyNkZWZpbmUgR0ZTMl9CSVRfTUFTSwkJMHgwMDAwMDAwMworCisjZGVmaW5lIEdGUzJfQkxLU1RfRlJFRQkJMAorI2RlZmluZSBHRlMyX0JMS1NUX1VTRUQJCTEKKyNkZWZpbmUgR0ZTMl9CTEtTVF9VTkxJTktFRAkyCisjZGVmaW5lIEdGUzJfQkxLU1RfRElOT0RFCTMKKworI2RlZmluZSBHRlMyX1JHRl9KT1VSTkFMCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0ZTMl9SR0ZfTUVUQU9OTFkJMHgwMDAwMDAwMgorI2RlZmluZSBHRlMyX1JHRl9EQVRBT05MWQkweDAwMDAwMDA0CisjZGVmaW5lIEdGUzJfUkdGX05PQUxMT0MJMHgwMDAwMDAwOAorCitzdHJ1Y3QgZ2ZzMl9yZ3JwIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciByZ19oZWFkZXI7CisKKwlfX2JlMzIgcmdfZmxhZ3M7CisJX19iZTMyIHJnX2ZyZWU7CisJX19iZTMyIHJnX2Rpbm9kZXM7CisJX19iZTMyIF9fcGFkOworCV9fYmU2NCByZ19pZ2VuZXJhdGlvbjsKKworCV9fdTggcmdfcmVzZXJ2ZWRbODBdOyAvKiBTZXZlcmFsIGZpZWxkcyBmcm9tIGdmczEgbm93IHJlc2VydmVkICovCit9OworCisvKgorICogcXVvdGEgbGlua2VkIGxpc3Q6IHVzZXIgcXVvdGFzIGFuZCBncm91cCBxdW90YXMgZm9ybSB0d28gc2VwYXJhdGUgCisgKiBzaW5nbHkgbGlua2VkIGxpc3RzLiBsbF9uZXh0IHN0b3JlcyB1aWRzIG9yIGdpZHMgb2YgbmV4dCBxdW90YXMgaW4gdGhlIAorICogbGlua2VkIGxpc3QuCisKK0dpdmVuIHRoZSB1aWQvZ2lkLCBob3cgdG8gY2FsY3VsYXRlIHRoZSBxdW90YSBmaWxlIG9mZnNldHMgZm9yIHRoZSBjb3JyZXNwb25kaW5nCitnZnMyX3F1b3RhIHN0cnVjdHVyZXMgb24gZGlzazoKKworZm9yIHVzZXIgcXVvdGFzLCBnaXZlbiB1aWQsCitvZmZzZXQgPSB1aWQgKiBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpOworCitmb3IgZ3JvdXAgcXVvdGFzLCBnaXZlbiBnaWQsCitvZmZzZXQgPSAoZ2lkICogc2l6ZW9mKHN0cnVjdCBnZnMyX3F1b3RhKSkgKyBzaXplb2Yoc3RydWN0IGdmczJfcXVvdGEpOworCisKKyAgdWlkOjAgICBnaWQ6MCAgICAgICB1aWQ6MTIgICBnaWQ6MTIgICAgICB1aWQ6MTcgICBnaWQ6MTcgICAgIHVpZDo1MTQyIGdpZDo1MTQyCisrLS0tLS0tLSstLS0tLS0tKyAgICArLS0tLS0tLSstLS0tLS0tKyAgICArLS0tLS0tLSstIC0gLSAtKyAgICArLSAtIC0gLSstLS0tLS0tKworfCB2YWxpZCB8IHZhbGlkIHwgOjogfCB2YWxpZCB8IHZhbGlkIHwgOjogfCB2YWxpZCB8IGludmFsIHwgOjogfCBpbnZhbCB8IHZhbGlkIHwKKystLS0tLS0tKy0tLS0tLS0rICAgICstLS0tLS0tKy0tLS0tLS0rICAgICstLS0tLS0tKy0gLSAtIC0rICAgICstIC0gLSAtKy0tLS0tLS0rCituZXh0OjEyICAgbmV4dDoxMiAgICBuZXh0OjE3IG5leHQ6NTE0MiAgICBuZXh0Ok5VTEwgICAgICAgICAgICAgICAgICAgIG5leHQ6TlVMTAorICAgIHwgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgIHw8LS0gdXNlciBxdW90YSBsaXN0ICAgICAgICAgfAorICAgICBcX19fX19ffF9fX19fX19fX19fLyBcX19fX19ffF9fX19fX19fX19fLyAgICAgICAgIGdyb3VwIHF1b3RhIGxpc3QgLS0+fAorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgIFxfX19fX19fX19fX19fX19fX18vIFxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vCisKKyovCisKKy8qCisgKiBxdW90YSBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgZ2ZzMl9xdW90YSB7CisJX19iZTY0IHF1X2xpbWl0OworCV9fYmU2NCBxdV93YXJuOworCV9fYmU2NCBxdV92YWx1ZTsKKwlfX2JlMzIgcXVfbGxfbmV4dDsgLyogbG9jYXRpb24gb2YgbmV4dCBxdW90YSBpbiBsaXN0ICovCisJX191OCBxdV9yZXNlcnZlZFs2MF07Cit9OworCisvKgorICogZGlub2RlIHN0cnVjdHVyZQorICovCisKKyNkZWZpbmUgR0ZTMl9NQVhfTUVUQV9IRUlHSFQJMTAKKyNkZWZpbmUgR0ZTMl9ESVJfTUFYX0RFUFRICTE3CisKKyNkZWZpbmUgRFQySUYoZHQpICgoKGR0KSA8PCAxMikgJiBTX0lGTVQpCisjZGVmaW5lIElGMkRUKHNpZikgKCgoc2lmKSAmIFNfSUZNVCkgPj4gMTIpCisKK2VudW0geworCWdmczJmbF9KZGF0YQkJPSAwLAorCWdmczJmbF9FeEhhc2gJCT0gMSwKKwlnZnMyZmxfVW51c2VkCQk9IDIsCisJZ2ZzMmZsX0VhSW5kaXJlY3QJPSAzLAorCWdmczJmbF9EaXJlY3RpbwkJPSA0LAorCWdmczJmbF9JbW11dGFibGUJPSA1LAorCWdmczJmbF9BcHBlbmRPbmx5CT0gNiwKKwlnZnMyZmxfTm9BdGltZQkJPSA3LAorCWdmczJmbF9TeW5jCQk9IDgsCisJZ2ZzMmZsX1N5c3RlbQkJPSA5LAorCWdmczJmbF9UcnVuY0luUHJvZwk9IDI5LAorCWdmczJmbF9Jbmhlcml0RGlyZWN0aW8JPSAzMCwKKwlnZnMyZmxfSW5oZXJpdEpkYXRhCT0gMzEsCit9OworCisvKiBEaW5vZGUgZmxhZ3MgKi8KKyNkZWZpbmUgR0ZTMl9ESUZfSkRBVEEJCQkweDAwMDAwMDAxCisjZGVmaW5lIEdGUzJfRElGX0VYSEFTSAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0ZTMl9ESUZfVU5VU0VECQkJMHgwMDAwMDAwNCAgLyogb25seSBpbiBnZnMxICovCisjZGVmaW5lIEdGUzJfRElGX0VBX0lORElSRUNUCQkweDAwMDAwMDA4CisjZGVmaW5lIEdGUzJfRElGX0RJUkVDVElPCQkweDAwMDAwMDEwCisjZGVmaW5lIEdGUzJfRElGX0lNTVVUQUJMRQkJMHgwMDAwMDAyMAorI2RlZmluZSBHRlMyX0RJRl9BUFBFTkRPTkxZCQkweDAwMDAwMDQwCisjZGVmaW5lIEdGUzJfRElGX05PQVRJTUUJCTB4MDAwMDAwODAKKyNkZWZpbmUgR0ZTMl9ESUZfU1lOQwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgR0ZTMl9ESUZfU1lTVEVNCQkJMHgwMDAwMDIwMCAvKiBOZXcgaW4gZ2ZzMiAqLworI2RlZmluZSBHRlMyX0RJRl9UUlVOQ19JTl9QUk9HCQkweDIwMDAwMDAwIC8qIE5ldyBpbiBnZnMyICovCisjZGVmaW5lIEdGUzJfRElGX0lOSEVSSVRfRElSRUNUSU8JMHg0MDAwMDAwMAorI2RlZmluZSBHRlMyX0RJRl9JTkhFUklUX0pEQVRBCQkweDgwMDAwMDAwCisKK3N0cnVjdCBnZnMyX2Rpbm9kZSB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgZGlfaGVhZGVyOworCisJc3RydWN0IGdmczJfaW51bSBkaV9udW07CisKKwlfX2JlMzIgZGlfbW9kZTsJLyogbW9kZSBvZiBmaWxlICovCisJX19iZTMyIGRpX3VpZDsJLyogb3duZXIncyB1c2VyIGlkICovCisJX19iZTMyIGRpX2dpZDsJLyogb3duZXIncyBncm91cCBpZCAqLworCV9fYmUzMiBkaV9ubGluazsJLyogbnVtYmVyIG9mIGxpbmtzIHRvIHRoaXMgZmlsZSAqLworCV9fYmU2NCBkaV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSAqLworCV9fYmU2NCBkaV9ibG9ja3M7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gZmlsZSAqLworCV9fYmU2NCBkaV9hdGltZTsJLyogdGltZSBsYXN0IGFjY2Vzc2VkICovCisJX19iZTY0IGRpX210aW1lOwkvKiB0aW1lIGxhc3QgbW9kaWZpZWQgKi8KKwlfX2JlNjQgZGlfY3RpbWU7CS8qIHRpbWUgbGFzdCBjaGFuZ2VkICovCisJX19iZTMyIGRpX21ham9yOwkvKiBkZXZpY2UgbWFqb3IgbnVtYmVyICovCisJX19iZTMyIGRpX21pbm9yOwkvKiBkZXZpY2UgbWlub3IgbnVtYmVyICovCisKKwkvKiBUaGlzIHNlY3Rpb24gdmFyaWVzIGZyb20gZ2ZzMS4gUGFkZGluZyBhZGRlZCB0byBhbGlnbiB3aXRoCisgICAgICAgICAqIHJlbWFpbmRlciBvZiBkaW5vZGUKKwkgKi8KKwlfX2JlNjQgZGlfZ29hbF9tZXRhOwkvKiByZ3JwIHRvIGFsbG9jIGZyb20gbmV4dCAqLworCV9fYmU2NCBkaV9nb2FsX2RhdGE7CS8qIGRhdGEgYmxvY2sgZ29hbCAqLworCV9fYmU2NCBkaV9nZW5lcmF0aW9uOwkvKiBnZW5lcmF0aW9uIG51bWJlciBmb3IgTkZTICovCisKKwlfX2JlMzIgZGlfZmxhZ3M7CS8qIEdGUzJfRElGXy4uLiAqLworCV9fYmUzMiBkaV9wYXlsb2FkX2Zvcm1hdDsgIC8qIEdGUzJfRk9STUFUXy4uLiAqLworCV9fdTE2IF9fcGFkMTsJLyogV2FzIGRpdHlwZSBpbiBnZnMxICovCisJX19iZTE2IGRpX2hlaWdodDsJLyogaGVpZ2h0IG9mIG1ldGFkYXRhICovCisJX191MzIgX19wYWQyOwkvKiBVbnVzZWQgaW5jYXJuYXRpb24gbnVtYmVyIGZyb20gZ2ZzMSAqLworCisJLyogVGhlc2Ugb25seSBhcHBseSB0byBkaXJlY3RvcmllcyAgKi8KKwlfX3UxNiBfX3BhZDM7CS8qIFBhZGRpbmcgKi8KKwlfX2JlMTYgZGlfZGVwdGg7CS8qIE51bWJlciBvZiBiaXRzIGluIHRoZSB0YWJsZSAqLworCV9fYmUzMiBkaV9lbnRyaWVzOwkvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSAqLworCisJc3RydWN0IGdmczJfaW51bSBfX3BhZDQ7IC8qIFVudXNlZCBldmVuIGluIGN1cnJlbnQgZ2ZzMSAqLworCisJX19iZTY0IGRpX2VhdHRyOwkvKiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgbnVtYmVyICovCisJX19iZTMyIGRpX2F0aW1lX25zZWM7ICAgLyogbnNlYyBwb3J0aW9uIG9mIGF0aW1lICovCisJX19iZTMyIGRpX210aW1lX25zZWM7ICAgLyogbnNlYyBwb3J0aW9uIG9mIG10aW1lICovCisJX19iZTMyIGRpX2N0aW1lX25zZWM7ICAgLyogbnNlYyBwb3J0aW9uIG9mIGN0aW1lICovCisKKwlfX3U4IGRpX3Jlc2VydmVkWzQ0XTsKK307CisKKy8qCisgKiBkaXJlY3Rvcnkgc3RydWN0dXJlIC0gbWFueSBvZiB0aGVzZSBwZXIgZGlyZWN0b3J5IGZpbGUKKyAqLworCisjZGVmaW5lIEdGUzJfRk5BTUVTSVpFCQkyNTUKKyNkZWZpbmUgR0ZTMl9ESVJFTlRfU0laRShuYW1lX2xlbikgKChzaXplb2Yoc3RydWN0IGdmczJfZGlyZW50KSArIChuYW1lX2xlbikgKyA3KSAmIH43KQorCitzdHJ1Y3QgZ2ZzMl9kaXJlbnQgeworCXN0cnVjdCBnZnMyX2ludW0gZGVfaW51bTsKKwlfX2JlMzIgZGVfaGFzaDsKKwlfX2JlMTYgZGVfcmVjX2xlbjsKKwlfX2JlMTYgZGVfbmFtZV9sZW47CisJX19iZTE2IGRlX3R5cGU7CisJX191OCBfX3BhZFsxNF07Cit9OworCisvKgorICogSGVhZGVyIG9mIGxlYWYgZGlyZWN0b3J5IG5vZGVzCisgKi8KKworc3RydWN0IGdmczJfbGVhZiB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgbGZfaGVhZGVyOworCisJX19iZTE2IGxmX2RlcHRoOwkJLyogRGVwdGggb2YgbGVhZiAqLworCV9fYmUxNiBsZl9lbnRyaWVzOwkJLyogTnVtYmVyIG9mIGRpcmVudHMgaW4gbGVhZiAqLworCV9fYmUzMiBsZl9kaXJlbnRfZm9ybWF0OwkvKiBGb3JtYXQgb2YgdGhlIGRpcmVudHMgKi8KKwlfX2JlNjQgbGZfbmV4dDsJCQkvKiBOZXh0IGxlYWYsIGlmIG92ZXJmbG93ICovCisKKwlfX3U4IGxmX3Jlc2VydmVkWzY0XTsKK307CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgaGVhZGVyIGZvcm1hdAorICovCisKKyNkZWZpbmUgR0ZTMl9FQV9NQVhfTkFNRV9MRU4JMjU1CisjZGVmaW5lIEdGUzJfRUFfTUFYX0RBVEFfTEVOCTY1NTM2CisKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfVU5VU0VECTAKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfVVNSCQkxCisjZGVmaW5lIEdGUzJfRUFUWVBFX1NZUwkJMgorI2RlZmluZSBHRlMyX0VBVFlQRV9TRUNVUklUWQkzCisKKyNkZWZpbmUgR0ZTMl9FQVRZUEVfTEFTVAkzCisjZGVmaW5lIEdGUzJfRUFUWVBFX1ZBTElEKHgpCSgoeCkgPD0gR0ZTMl9FQVRZUEVfTEFTVCkKKworI2RlZmluZSBHRlMyX0VBRkxBR19MQVNUCTB4MDEJLyogbGFzdCBlYSBpbiBibG9jayAqLworCitzdHJ1Y3QgZ2ZzMl9lYV9oZWFkZXIgeworCV9fYmUzMiBlYV9yZWNfbGVuOworCV9fYmUzMiBlYV9kYXRhX2xlbjsKKwlfX3U4IGVhX25hbWVfbGVuOwkvKiBubyBOVUxMIHBvaW50ZXIgYWZ0ZXIgdGhlIHN0cmluZyAqLworCV9fdTggZWFfdHlwZTsJCS8qIEdGUzJfRUFUWVBFXy4uLiAqLworCV9fdTggZWFfZmxhZ3M7CQkvKiBHRlMyX0VBRkxBR18uLi4gKi8KKwlfX3U4IGVhX251bV9wdHJzOworCV9fdTMyIF9fcGFkOworfTsKKworLyoKKyAqIExvZyBoZWFkZXIgc3RydWN0dXJlCisgKi8KKworI2RlZmluZSBHRlMyX0xPR19IRUFEX1VOTU9VTlQJMHgwMDAwMDAwMQkvKiBsb2cgaXMgY2xlYW4gKi8KKworc3RydWN0IGdmczJfbG9nX2hlYWRlciB7CisJc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgbGhfaGVhZGVyOworCisJX19iZTY0IGxoX3NlcXVlbmNlOwkvKiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyB0cmFuc2FjdGlvbiAqLworCV9fYmUzMiBsaF9mbGFnczsJLyogR0ZTMl9MT0dfSEVBRF8uLi4gKi8KKwlfX2JlMzIgbGhfdGFpbDsJCS8qIEJsb2NrIG51bWJlciBvZiBsb2cgdGFpbCAqLworCV9fYmUzMiBsaF9ibGtubzsKKwlfX2JlMzIgbGhfaGFzaDsKK307CisKKy8qCisgKiBMb2cgdHlwZSBkZXNjcmlwdG9yCisgKi8KKworI2RlZmluZSBHRlMyX0xPR19ERVNDX01FVEFEQVRBCTMwMAorLyogbGRfZGF0YTEgaXMgdGhlIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuCisgICBsZF9kYXRhMiBpcyB1bnVzZWQuICovCisKKyNkZWZpbmUgR0ZTMl9MT0dfREVTQ19SRVZPS0UJMzAxCisvKiBsZF9kYXRhMSBpcyB0aGUgbnVtYmVyIG9mIHJldm9rZSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuCisgICBsZF9kYXRhMiBpcyB1bnVzZWQuICovCisKKyNkZWZpbmUgR0ZTMl9MT0dfREVTQ19KREFUQQkzMDIKKy8qIGxkX2RhdGExIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IuCisgICBsZF9kYXRhMiBpcyB1bnVzZWQuICovCisKK3N0cnVjdCBnZnMyX2xvZ19kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgZ2ZzMl9tZXRhX2hlYWRlciBsZF9oZWFkZXI7CisKKwlfX2JlMzIgbGRfdHlwZTsJCS8qIEdGUzJfTE9HX0RFU0NfLi4uICovCisJX19iZTMyIGxkX2xlbmd0aDsJLyogTnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhpcyBjaHVuayAqLworCV9fYmUzMiBsZF9kYXRhMTsJLyogZGVzY3JpcHRvci1zcGVjaWZpYyBmaWVsZCAqLworCV9fYmUzMiBsZF9kYXRhMjsJLyogZGVzY3JpcHRvci1zcGVjaWZpYyBmaWVsZCAqLworCisJX191OCBsZF9yZXNlcnZlZFszMl07Cit9OworCisvKgorICogSW51bSBSYW5nZQorICogRGVzY3JpYmUgYSByYW5nZSBvZiBmb3JtYWwgaW5vZGUgbnVtYmVycyBhbGxvY2F0ZWQgdG8KKyAqIG9uZSBtYWNoaW5lIHRvIGFzc2lnbiB0byBpbm9kZXMuCisgKi8KKworI2RlZmluZSBHRlMyX0lOVU1fUVVBTlRVTQkxMDQ4NTc2CisKK3N0cnVjdCBnZnMyX2ludW1fcmFuZ2UgeworCV9fYmU2NCBpcl9zdGFydDsKKwlfX2JlNjQgaXJfbGVuZ3RoOworfTsKKworLyoKKyAqIFN0YXRmcyBjaGFuZ2UKKyAqIERlc2NyaWJlcyBhbiBjaGFuZ2UgdG8gdGhlIHBvb2wgb2YgZnJlZSBhbmQgYWxsb2NhdGVkCisgKiBibG9ja3MuCisgKi8KKworc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZSB7CisJX19iZTY0IHNjX3RvdGFsOworCV9fYmU2NCBzY19mcmVlOworCV9fYmU2NCBzY19kaW5vZGVzOworfTsKKworLyoKKyAqIFF1b3RhIGNoYW5nZQorICogRGVzY3JpYmVzIGFuIGFsbG9jYXRpb24gY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIKKyAqIHVzZXIgb3IgZ3JvdXAuCisgKi8KKworI2RlZmluZSBHRlMyX1FDRl9VU0VSCQkweDAwMDAwMDAxCisKK3N0cnVjdCBnZnMyX3F1b3RhX2NoYW5nZSB7CisJX19iZTY0IHFjX2NoYW5nZTsKKwlfX2JlMzIgcWNfZmxhZ3M7CS8qIEdGUzJfUUNGXy4uLiAqLworCV9fYmUzMiBxY19pZDsKK307CisKK3N0cnVjdCBnZnMyX3F1b3RhX2x2YiB7CisgICAgICAgIF9fYmUzMiBxYl9tYWdpYzsKKyAgICAgICAgX191MzIgX19wYWQ7CisgICAgICAgIF9fYmU2NCBxYl9saW1pdDsgICAgICAvKiBIYXJkIGxpbWl0IG9mICMgYmxvY2tzIHRvIGFsbG9jICovCisgICAgICAgIF9fYmU2NCBxYl93YXJuOyAgICAgICAvKiBXYXJuIHVzZXIgd2hlbiBhbGxvYyBpcyBhYm92ZSB0aGlzICMgKi8KKyAgICAgICAgX19iZTY0IHFiX3ZhbHVlOyAgICAgICAvKiBDdXJyZW50ICMgYmxvY2tzIGFsbG9jYXRlZCAqLworfTsKKworI2VuZGlmIC8qIF9fR0ZTMl9PTkRJU0tfRE9UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9naWdhc2V0X2Rldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9naWdhc2V0X2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzRhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2dpZ2FzZXRfZGV2LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGludGVyZmFjZSB0byB1c2VyIHNwYWNlIGZvciB0aGUgZ2lnYXNldCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgYnkgSGFuc2pvZXJnIExpcHAgPGhqbGlwcEB3ZWIuZGU+CisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworI2lmbmRlZiBHSUdBU0VUX0lOVEVSRkFDRV9ICisjZGVmaW5lIEdJR0FTRVRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgR0lHQVNFVF9JT0NUTCAweDQ3CisKKyNkZWZpbmUgR0lHVkVSX0RSSVZFUiAwCisjZGVmaW5lIEdJR1ZFUl9DT01QQVQgMQorI2RlZmluZSBHSUdWRVJfRldCQVNFIDIKKworI2RlZmluZSBHSUdBU0VUX1JFRElSICAgIF9JT1dSIChHSUdBU0VUX0lPQ1RMLCAwLCBpbnQpCisjZGVmaW5lIEdJR0FTRVRfQ09ORklHICAgX0lPV1IgKEdJR0FTRVRfSU9DVEwsIDEsIGludCkKKyNkZWZpbmUgR0lHQVNFVF9CUktDSEFSUyBfSU9XICAoR0lHQVNFVF9JT0NUTCwgMiwgdW5zaWduZWQgY2hhcls2XSkgLy9GSVhNRSBbNl0gb2theT8KKyNkZWZpbmUgR0lHQVNFVF9WRVJTSU9OICBfSU9XUiAoR0lHQVNFVF9JT0NUTCwgMywgdW5zaWduZWRbNF0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oYXllc2VzcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oYXllc2VzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDc0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hheWVzZXNwLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBIQVlFU0VTUF9ICisjZGVmaW5lIEhBWUVTRVNQX0gKKworc3RydWN0IGhheWVzX2VzcF9jb25maWcgeworCXNob3J0IGZsb3dfb247CisJc2hvcnQgZmxvd19vZmY7CisJc2hvcnQgcnhfdHJpZ2dlcjsKKwlzaG9ydCB0eF90cmlnZ2VyOworCXNob3J0IHBpb190aHJlc2hvbGQ7CisJdW5zaWduZWQgY2hhciByeF90aW1lb3V0OworCWNoYXIgZG1hX2NoYW5uZWw7Cit9OworCisKKworI2VuZGlmIC8qIEVTUF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllNDg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0hETENfSAorI2RlZmluZSBfX0hETENfSAorCisKKyNkZWZpbmUgSERMQ19NQVhfTVRVIDE1MDAJLyogRXRoZXJuZXQgMTUwMCBieXRlcyAqLworI2lmIDAKKyNkZWZpbmUgSERMQ19NQVhfTVJVIChIRExDX01BWF9NVFUgKyAxMCArIDE0ICsgNCkgLyogZm9yIEVUSCtWTEFOIG92ZXIgRlIgKi8KKyNlbHNlCisjZGVmaW5lIEhETENfTUFYX01SVSAxNjAwIC8qIGFzIHJlcXVpcmVkIGZvciBGUiBuZXR3b3JrICovCisjZW5kaWYKKworCisjZW5kaWYgLyogX19IRExDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsYy9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZGxjL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzOTcyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsYy9pb2N0bC5oCkBAIC0wLDAgKzEsODEgQEAKKyNpZm5kZWYgX19IRExDX0lPQ1RMX0hfXworI2RlZmluZSBfX0hETENfSU9DVExfSF9fCisKKworI2RlZmluZSBHRU5FUklDX0hETENfVkVSU0lPTiA0CS8qIEZvciBzeW5jaHJvbml6YXRpb24gd2l0aCBzZXRoZGxjIHV0aWxpdHkgKi8KKworI2RlZmluZSBDTE9DS19ERUZBVUxUICAgMAkvKiBEZWZhdWx0IHNldHRpbmcgKi8KKyNkZWZpbmUgQ0xPQ0tfRVhUCTEJLyogRXh0ZXJuYWwgVFggYW5kIFJYIGNsb2NrIC0gRFRFICovCisjZGVmaW5lIENMT0NLX0lOVAkyCS8qIEludGVybmFsIFRYIGFuZCBSWCBjbG9jayAtIERDRSAqLworI2RlZmluZSBDTE9DS19UWElOVAkzCS8qIEludGVybmFsIFRYIGFuZCBleHRlcm5hbCBSWCBjbG9jayAqLworI2RlZmluZSBDTE9DS19UWEZST01SWAk0CS8qIFRYIGNsb2NrIGRlcml2ZWQgZnJvbSBleHRlcm5hbCBSWCBjbG9jayAqLworCisKKyNkZWZpbmUgRU5DT0RJTkdfREVGQVVMVAkwIC8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBFTkNPRElOR19OUloJCTEKKyNkZWZpbmUgRU5DT0RJTkdfTlJaSQkJMgorI2RlZmluZSBFTkNPRElOR19GTV9NQVJLCTMKKyNkZWZpbmUgRU5DT0RJTkdfRk1fU1BBQ0UJNAorI2RlZmluZSBFTkNPRElOR19NQU5DSEVTVEVSCTUKKworCisjZGVmaW5lIFBBUklUWV9ERUZBVUxUCQkwIC8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBQQVJJVFlfTk9ORQkJMSAvKiBObyBwYXJpdHkgKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzE2X1BSMAkyIC8qIENSQzE2LCBpbml0aWFsIHZhbHVlIDB4MDAwMCAqLworI2RlZmluZSBQQVJJVFlfQ1JDMTZfUFIxCTMgLyogQ1JDMTYsIGluaXRpYWwgdmFsdWUgMHhGRkZGICovCisjZGVmaW5lIFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQJNCAvKiBDUkMxNiwgaW5pdGlhbCAweDAwMDAsIElUVS1UIHZlcnNpb24gKi8KKyNkZWZpbmUgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVAk1IC8qIENSQzE2LCBpbml0aWFsIDB4RkZGRiwgSVRVLVQgdmVyc2lvbiAqLworI2RlZmluZSBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRUCTYgLyogQ1JDMzIsIGluaXRpYWwgdmFsdWUgMHgwMDAwMDAwMCAqLworI2RlZmluZSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUCTcgLyogQ1JDMzIsIGluaXRpYWwgdmFsdWUgMHhGRkZGRkZGRiAqLworCisjZGVmaW5lIExNSV9ERUZBVUxUCQkwIC8qIERlZmF1bHQgc2V0dGluZyAqLworI2RlZmluZSBMTUlfTk9ORQkJMSAvKiBObyBMTUksIGFsbCBQVkNzIGFyZSBzdGF0aWMgKi8KKyNkZWZpbmUgTE1JX0FOU0kJCTIgLyogQU5TSSBBbm5leCBEICovCisjZGVmaW5lIExNSV9DQ0lUVAkJMyAvKiBJVFUtVCBBbm5leCBBICovCisjZGVmaW5lIExNSV9DSVNDTwkJNCAvKiBUaGUgIm9yaWdpbmFsIiBMTUksIGFrYSBHYW5nIG9mIEZvdXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAKKwl1bnNpZ25lZCBpbnQgY2xvY2tfcmF0ZTsgLyogYml0cyBwZXIgc2Vjb25kICovCisJdW5zaWduZWQgaW50IGNsb2NrX3R5cGU7IC8qIGludGVybmFsLCBleHRlcm5hbCwgVFgtaW50ZXJuYWwgZXRjLiAqLworCXVuc2lnbmVkIHNob3J0IGxvb3BiYWNrOworfSBzeW5jX3NlcmlhbF9zZXR0aW5nczsgICAgICAgICAgLyogVi4zNSwgVi4yNCwgWC4yMSAqLworCit0eXBlZGVmIHN0cnVjdCB7IAorCXVuc2lnbmVkIGludCBjbG9ja19yYXRlOyAvKiBiaXRzIHBlciBzZWNvbmQgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tfdHlwZTsgLyogaW50ZXJuYWwsIGV4dGVybmFsLCBUWC1pbnRlcm5hbCBldGMuICovCisJdW5zaWduZWQgc2hvcnQgbG9vcGJhY2s7CisJdW5zaWduZWQgaW50IHNsb3RfbWFwOworfSB0ZTFfc2V0dGluZ3M7ICAgICAgICAgICAgICAgICAgLyogVDEsIEUxICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBlbmNvZGluZzsKKwl1bnNpZ25lZCBzaG9ydCBwYXJpdHk7Cit9IHJhd19oZGxjX3Byb3RvOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHQzOTE7CisJdW5zaWduZWQgaW50IHQzOTI7CisJdW5zaWduZWQgaW50IG4zOTE7CisJdW5zaWduZWQgaW50IG4zOTI7CisJdW5zaWduZWQgaW50IG4zOTM7CisJdW5zaWduZWQgc2hvcnQgbG1pOworCXVuc2lnbmVkIHNob3J0IGRjZTsgLyogMSBmb3IgRENFIChuZXR3b3JrIHNpZGUpIG9wZXJhdGlvbiAqLworfSBmcl9wcm90bzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBkbGNpOworfSBmcl9wcm90b19wdmM7ICAgICAgICAgIC8qIGZvciBjcmVhdGluZy9kZWxldGluZyBGUiBQVkNzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZGxjaTsKKwljaGFyIG1hc3RlcltJRk5BTVNJWl07CS8qIE5hbWUgb2YgbWFzdGVyIEZSQUQgZGV2aWNlICovCit9ZnJfcHJvdG9fcHZjX2luZm87CQkvKiBmb3IgcmV0dXJuaW5nIFBWQyBpbmZvcm1hdGlvbiBvbmx5ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgaW50ZXJ2YWw7CisgICAgdW5zaWduZWQgaW50IHRpbWVvdXQ7Cit9IGNpc2NvX3Byb3RvOworCisvKiBQUFAgZG9lc24ndCBuZWVkIGFueSBpbmZvIG5vdyAtIHN1cHBseSBsZW5ndGggPSAwIHRvIGlvY3RsICovCisKKyNlbmRpZiAvKiBfX0hETENfSU9DVExfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGNkcnYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGRsY2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMmQ5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkbGNkcnYuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIGhkbGNkcnYuaCAgLS0gSERMQyBwYWNrZXQgcmFkaW8gbmV0d29yayBkcml2ZXIuCisgKiBUaGUgTGludXggc291bmRjYXJkIGRyaXZlciBmb3IgMTIwMCBiYXVkIGFuZCA5NjAwIGJhdWQgcGFja2V0IHJhZGlvCisgKiAoQykgMTk5Ni0xOTk4IGJ5IFRob21hcyBTYWlsZXIsIEhCOUpOWC9BRTRXQQorICovCisKKyNpZm5kZWYgX0hETENEUlZfSAorI2RlZmluZSBfSERMQ0RSVl9ICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogc3RydWN0cyBmb3IgdGhlIElPQ1RMIGNvbW1hbmRzCisgKi8KKworc3RydWN0IGhkbGNkcnZfcGFyYW1zIHsKKwlpbnQgaW9iYXNlOworCWludCBpcnE7CisJaW50IGRtYTsKKwlpbnQgZG1hMjsKKwlpbnQgc2VyaW9iYXNlOworCWludCBwYXJpb2Jhc2U7CisJaW50IG1pZGlpb2Jhc2U7Cit9OwkKKworc3RydWN0IGhkbGNkcnZfY2hhbm5lbF9wYXJhbXMgeworCWludCB0eF9kZWxheTsgIC8qIHRoZSB0cmFuc21pdHRlciBrZXl1cCBkZWxheSBpbiAxMG1zIHVuaXRzICovCisJaW50IHR4X3RhaWw7ICAgLyogdGhlIHRyYW5zbWl0dGVyIGtleW9mZiBkZWxheSBpbiAxMG1zIHVuaXRzICovCisJaW50IHNsb3R0aW1lOyAgLyogdGhlIHNsb3R0aW1lIGluIDEwbXM7IHVzdWFsbHkgMTAgPSAxMDBtcyAqLworCWludCBwcGVyc2lzdDsgIC8qIHRoZSBwLXBlcnNpc3RlbmNlIDAuLjI1NSAqLworCWludCBmdWxsZHVwOyAgIC8qIHNvbWUgZHJpdmVyIGRvIG5vdCBzdXBwb3J0IGZ1bGwgZHVwbGV4LCBzZXR0aW5nICovCisJICAgICAgICAgICAgICAgLyogdGhpcyBqdXN0IG1ha2VzIHRoZW0gc2VuZCBldmVuIGlmIERDRCBpcyBvbiAqLworfTsJCisKK3N0cnVjdCBoZGxjZHJ2X29sZF9jaGFubmVsX3N0YXRlIHsKKyAgCWludCBwdHQ7CisgIAlpbnQgZGNkOworICAJaW50IHB0dF9rZXllZDsKK307CisKK3N0cnVjdCBoZGxjZHJ2X2NoYW5uZWxfc3RhdGUgeworIAlpbnQgcHR0OworIAlpbnQgZGNkOworIAlpbnQgcHR0X2tleWVkOworIAl1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CisgCXVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOworIAl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7CisgCXVuc2lnbmVkIGxvbmcgcnhfZXJyb3JzOworfTsKKworc3RydWN0IGhkbGNkcnZfaW9jdGwgeworCWludCBjbWQ7CisJdW5pb24geworCQlzdHJ1Y3QgaGRsY2Rydl9wYXJhbXMgbXA7CisJCXN0cnVjdCBoZGxjZHJ2X2NoYW5uZWxfcGFyYW1zIGNwOworCQlzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3N0YXRlIGNzOworCQlzdHJ1Y3QgaGRsY2Rydl9vbGRfY2hhbm5lbF9zdGF0ZSBvY3M7CisJCXVuc2lnbmVkIGludCBjYWxpYnJhdGU7CisJCXVuc2lnbmVkIGNoYXIgYml0czsKKwkJY2hhciBtb2RlbmFtZVsxMjhdOworCQljaGFyIGRyaXZlcm5hbWVbMzJdOworCX0gZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpb2N0bCB2YWx1ZXMKKyAqLworI2RlZmluZSBIRExDRFJWQ1RMX0dFVE1PREVNUEFSICAgICAgIDAKKyNkZWZpbmUgSERMQ0RSVkNUTF9TRVRNT0RFTVBBUiAgICAgICAxCisjZGVmaW5lIEhETENEUlZDVExfTU9ERU1QQVJNQVNLICAgICAgMiAgLyogbm90IGhhbmRsZWQgYnkgaGRsY2RydiAqLworI2RlZmluZSBIRExDRFJWQ1RMX0dFVENIQU5ORUxQQVIgICAgMTAKKyNkZWZpbmUgSERMQ0RSVkNUTF9TRVRDSEFOTkVMUEFSICAgIDExCisjZGVmaW5lIEhETENEUlZDVExfT0xER0VUU1RBVCAgICAgICAyMAorI2RlZmluZSBIRExDRFJWQ1RMX0NBTElCUkFURSAgICAgICAgMjEKKyNkZWZpbmUgSERMQ0RSVkNUTF9HRVRTVEFUICAgICAgICAgIDIyCisKKy8qCisgKiB0aGVzZSBhcmUgbWFpbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworI2RlZmluZSBIRExDRFJWQ1RMX0dFVFNBTVBMRVMgICAgICAgMzAKKyNkZWZpbmUgSERMQ0RSVkNUTF9HRVRCSVRTICAgICAgICAgIDMxCisKKy8qCisgKiBub3QgaGFuZGxlZCBieSBoZGxjZHJ2LCBidXQgYnkgaXRzIGRlcGVuZGluZyBkcml2ZXJzCisgKi8KKyNkZWZpbmUgSERMQ0RSVkNUTF9HRVRNT0RFICAgICAgICAgIDQwCisjZGVmaW5lIEhETENEUlZDVExfU0VUTU9ERSAgICAgICAgICA0MQorI2RlZmluZSBIRExDRFJWQ1RMX01PREVMSVNUICAgICAgICAgNDIKKyNkZWZpbmUgSERMQ0RSVkNUTF9EUklWRVJOQU1FICAgICAgIDQzCisKKy8qCisgKiBtYXNrIG9mIG5lZWRlZCBtb2RlbSBwYXJhbWV0ZXJzLCByZXR1cm5lZCBieSBIRExDRFJWQ1RMX01PREVNUEFSTUFTSworICovCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19JT0JBU0UgICAgICAoMTw8MCkKKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX0lSUSAgICAgICAgICgxPDwxKQorI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfRE1BICAgICAgICAgKDE8PDIpCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19ETUEyICAgICAgICAoMTw8MykKKyNkZWZpbmUgSERMQ0RSVl9QQVJNQVNLX1NFUklPQkFTRSAgICgxPDw0KQorI2RlZmluZSBIRExDRFJWX1BBUk1BU0tfUEFSSU9CQVNFICAgKDE8PDUpCisjZGVmaW5lIEhETENEUlZfUEFSTUFTS19NSURJSU9CQVNFICAoMTw8NikKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZW5kaWYgLyogX0hETENEUlZfSCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZHJlZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZHJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDUyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkcmVnLmgKQEAgLTAsMCArMSw2NDcgQEAKKyNpZm5kZWYgX0xJTlVYX0hEUkVHX0gKKyNkZWZpbmUgX0xJTlVYX0hEUkVHX0gKKworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIENvbW1hbmQgSGVhZGVyIHNpemVzIGZvciBJT0NUTCBjb21tYW5kcworICovCisKKyNkZWZpbmUgSERJT19EUklWRV9DTURfSERSX1NJWkUJCSg0ICogc2l6ZW9mKF9fdTgpKQorI2RlZmluZSBIRElPX0RSSVZFX0hPQl9IRFJfU0laRQkJKDggKiBzaXplb2YoX191OCkpCisjZGVmaW5lIEhESU9fRFJJVkVfVEFTS19IRFJfU0laRQkoOCAqIHNpemVvZihfX3U4KSkKKworI2RlZmluZSBJREVfRFJJVkVfVEFTS19JTlZBTElECQktMQorI2RlZmluZSBJREVfRFJJVkVfVEFTS19OT19EQVRBCQkwCisjZGVmaW5lIElERV9EUklWRV9UQVNLX1NFVF9YRkVSCQkxCisKKyNkZWZpbmUgSURFX0RSSVZFX1RBU0tfSU4JCTIKKworI2RlZmluZSBJREVfRFJJVkVfVEFTS19PVVQJCTMKKyNkZWZpbmUgSURFX0RSSVZFX1RBU0tfUkFXX1dSSVRFCTQKKworLyoKKyAqIERlZmluZSBzdGFuZGFyZCB0YXNrZmlsZSBpbi9vdXQgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBJREVfVEFTS0ZJTEVfU1REX0lOX0ZMQUdTCTB4RkUKKyNkZWZpbmUgSURFX0hPQl9TVERfSU5fRkxBR1MJCTB4M0MKKyNkZWZpbmUgSURFX1RBU0tGSUxFX1NURF9PVVRfRkxBR1MJMHhGRQorI2RlZmluZSBJREVfSE9CX1NURF9PVVRfRkxBR1MJCTB4M0MKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRhc2tfaW9yZWdfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBzYXRhX2lvcmVnX3Q7CisKK3R5cGVkZWYgdW5pb24gaWRlX3JlZ192YWxpZF9zIHsKKwl1bnNpZ25lZCBhbGwJCQkJOiAxNjsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBkYXRhCQkJOiAxOworCQl1bnNpZ25lZCBlcnJvcl9mZWF0dXJlCQk6IDE7CisJCXVuc2lnbmVkIHNlY3RvcgkJCTogMTsKKwkJdW5zaWduZWQgbnNlY3RvcgkJOiAxOworCQl1bnNpZ25lZCBsY3lsCQkJOiAxOworCQl1bnNpZ25lZCBoY3lsCQkJOiAxOworCQl1bnNpZ25lZCBzZWxlY3QJCQk6IDE7CisJCXVuc2lnbmVkIHN0YXR1c19jb21tYW5kCQk6IDE7CisKKwkJdW5zaWduZWQgZGF0YV9ob2IJCTogMTsKKwkJdW5zaWduZWQgZXJyb3JfZmVhdHVyZV9ob2IJOiAxOworCQl1bnNpZ25lZCBzZWN0b3JfaG9iCQk6IDE7CisJCXVuc2lnbmVkIG5zZWN0b3JfaG9iCQk6IDE7CisJCXVuc2lnbmVkIGxjeWxfaG9iCQk6IDE7CisJCXVuc2lnbmVkIGhjeWxfaG9iCQk6IDE7CisJCXVuc2lnbmVkIHNlbGVjdF9ob2IJCTogMTsKKwkJdW5zaWduZWQgY29udHJvbF9ob2IJCTogMTsKKwl9IGI7Cit9IGlkZV9yZWdfdmFsaWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaWRlX3Rhc2tfcmVxdWVzdF9zIHsKKwl0YXNrX2lvcmVnX3QJaW9fcG9ydHNbOF07CisJdGFza19pb3JlZ190CWhvYl9wb3J0c1s4XTsKKwlpZGVfcmVnX3ZhbGlkX3QJb3V0X2ZsYWdzOworCWlkZV9yZWdfdmFsaWRfdAlpbl9mbGFnczsKKwlpbnQJCWRhdGFfcGhhc2U7CisJaW50CQlyZXFfY21kOworCXVuc2lnbmVkIGxvbmcJb3V0X3NpemU7CisJdW5zaWduZWQgbG9uZwlpbl9zaXplOworfSBpZGVfdGFza19yZXF1ZXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGlkZV9pb2N0bF9yZXF1ZXN0X3MgeworCWlkZV90YXNrX3JlcXVlc3RfdAkqdGFza19yZXF1ZXN0OworCXVuc2lnbmVkIGNoYXIJCSpvdXRfYnVmZmVyOworCXVuc2lnbmVkIGNoYXIJCSppbl9idWZmZXI7Cit9IGlkZV9pb2N0bF9yZXF1ZXN0X3Q7CisKK3N0cnVjdCBoZF9kcml2ZV9jbWRfaGRyIHsKKwl0YXNrX2lvcmVnX3QgY29tbWFuZDsKKwl0YXNrX2lvcmVnX3Qgc2VjdG9yX251bWJlcjsKKwl0YXNrX2lvcmVnX3QgZmVhdHVyZTsKKwl0YXNrX2lvcmVnX3Qgc2VjdG9yX2NvdW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaGRfZHJpdmVfdGFza19oZHIgeworCXRhc2tfaW9yZWdfdCBkYXRhOworCXRhc2tfaW9yZWdfdCBmZWF0dXJlOworCXRhc2tfaW9yZWdfdCBzZWN0b3JfY291bnQ7CisJdGFza19pb3JlZ190IHNlY3Rvcl9udW1iZXI7CisJdGFza19pb3JlZ190IGxvd19jeWxpbmRlcjsKKwl0YXNrX2lvcmVnX3QgaGlnaF9jeWxpbmRlcjsKKwl0YXNrX2lvcmVnX3QgZGV2aWNlX2hlYWQ7CisJdGFza19pb3JlZ190IGNvbW1hbmQ7Cit9IHRhc2tfc3RydWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGhkX2RyaXZlX2hvYl9oZHIgeworCXRhc2tfaW9yZWdfdCBkYXRhOworCXRhc2tfaW9yZWdfdCBmZWF0dXJlOworCXRhc2tfaW9yZWdfdCBzZWN0b3JfY291bnQ7CisJdGFza19pb3JlZ190IHNlY3Rvcl9udW1iZXI7CisJdGFza19pb3JlZ190IGxvd19jeWxpbmRlcjsKKwl0YXNrX2lvcmVnX3QgaGlnaF9jeWxpbmRlcjsKKwl0YXNrX2lvcmVnX3QgZGV2aWNlX2hlYWQ7CisJdGFza19pb3JlZ190IGNvbnRyb2w7Cit9IGhvYl9zdHJ1Y3RfdDsKKworI2RlZmluZSBUQVNLRklMRV9JTlZBTElECQkweDdmZmYKKyNkZWZpbmUgVEFTS0ZJTEVfNDgJCQkweDgwMDAKKworI2RlZmluZSBUQVNLRklMRV9OT19EQVRBCQkweDAwMDAKKworI2RlZmluZSBUQVNLRklMRV9JTgkJCTB4MDAwMQorI2RlZmluZSBUQVNLRklMRV9NVUxUSV9JTgkJMHgwMDAyCisKKyNkZWZpbmUgVEFTS0ZJTEVfT1VUCQkJMHgwMDA0CisjZGVmaW5lIFRBU0tGSUxFX01VTFRJX09VVAkJMHgwMDA4CisjZGVmaW5lIFRBU0tGSUxFX0lOX09VVAkJCTB4MDAxMAorCisjZGVmaW5lIFRBU0tGSUxFX0lOX0RNQQkJCTB4MDAyMAorI2RlZmluZSBUQVNLRklMRV9PVVRfRE1BCQkweDAwNDAKKyNkZWZpbmUgVEFTS0ZJTEVfSU5fRE1BUQkJMHgwMDgwCisjZGVmaW5lIFRBU0tGSUxFX09VVF9ETUFRCQkweDAxMDAKKworI2RlZmluZSBUQVNLRklMRV9QX0lOCQkJMHgwMjAwCisjZGVmaW5lIFRBU0tGSUxFX1BfT1VUCQkJMHgwNDAwCisjZGVmaW5lIFRBU0tGSUxFX1BfSU5fRE1BCQkweDA4MDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9PVVRfRE1BCQkweDEwMDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9JTl9ETUFRCQkweDIwMDAKKyNkZWZpbmUgVEFTS0ZJTEVfUF9PVVRfRE1BUQkJMHg0MDAwCisKKy8qIEFUQS9BVEFQSSBDb21tYW5kcyBwcmUgVDEzIFNwZWMgKi8KKyNkZWZpbmUgV0lOX05PUAkJCQkweDAwCisvKgorICoJMHgwMS0+MHgwMiBSZXNlcnZlZAorICovCisjZGVmaW5lIENGQV9SRVFfRVhUX0VSUk9SX0NPREUJCTB4MDMgLyogQ0ZBIFJlcXVlc3QgRXh0ZW5kZWQgRXJyb3IgQ29kZSAqLworLyoKKyAqCTB4MDQtPjB4MDcgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fU1JTVAkJCTB4MDggLyogQVRBUEkgc29mdCByZXNldCBjb21tYW5kICovCisjZGVmaW5lIFdJTl9ERVZJQ0VfUkVTRVQJCTB4MDgKKy8qCisgKgkweDA5LT4weDBGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1JFQ0FMCQkJMHgxMAorI2RlZmluZSBXSU5fUkVTVE9SRQkJCVdJTl9SRUNBTAorLyoKKyAqCTB4MTAtPjB4MUYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fUkVBRAkJCTB4MjAgLyogMjgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFEX09OQ0UJCQkweDIxIC8qIDI4LUJpdCB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1JFQURfTE9ORwkJCTB4MjIgLyogMjgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFEX0xPTkdfT05DRQkJMHgyMyAvKiAyOC1CaXQgd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9SRUFEX0VYVAkJCTB4MjQgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFERE1BX0VYVAkJCTB4MjUgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFERE1BX1FVRVVFRF9FWFQJCTB4MjYgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9SRUFEX05BVElWRV9NQVhfRVhUCQkweDI3IC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4MjgKKyAqLworI2RlZmluZSBXSU5fTVVMVFJFQURfRVhUCQkweDI5IC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4MkEtPjB4MkYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fV1JJVEUJCQkweDMwIC8qIDI4LUJpdCAqLworI2RlZmluZSBXSU5fV1JJVEVfT05DRQkJCTB4MzEgLyogMjgtQml0IHdpdGhvdXQgcmV0cmllcyAqLworI2RlZmluZSBXSU5fV1JJVEVfTE9ORwkJCTB4MzIgLyogMjgtQml0ICovCisjZGVmaW5lIFdJTl9XUklURV9MT05HX09OQ0UJCTB4MzMgLyogMjgtQml0IHdpdGhvdXQgcmV0cmllcyAqLworI2RlZmluZSBXSU5fV1JJVEVfRVhUCQkJMHgzNCAvKiA0OC1CaXQgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BX0VYVAkJMHgzNSAvKiA0OC1CaXQgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BX1FVRVVFRF9FWFQJCTB4MzYgLyogNDgtQml0ICovCisjZGVmaW5lIFdJTl9TRVRfTUFYX0VYVAkJCTB4MzcgLyogNDgtQml0ICovCisjZGVmaW5lIENGQV9XUklURV9TRUNUX1dPX0VSQVNFCQkweDM4IC8qIENGQSBXcml0ZSBTZWN0b3JzIHdpdGhvdXQgZXJhc2UgKi8KKyNkZWZpbmUgV0lOX01VTFRXUklURV9FWFQJCTB4MzkgLyogNDgtQml0ICovCisvKgorICoJMHgzQS0+MHgzQiBSZXNlcnZlZAorICovCisjZGVmaW5lIFdJTl9XUklURV9WRVJJRlkJCTB4M0MgLyogMjgtQml0ICovCisvKgorICoJMHgzRC0+MHgzRiBSZXNlcnZlZAorICovCisjZGVmaW5lIFdJTl9WRVJJRlkJCQkweDQwIC8qIDI4LUJpdCAtIFJlYWQgVmVyaWZ5IFNlY3RvcnMgKi8KKyNkZWZpbmUgV0lOX1ZFUklGWV9PTkNFCQkJMHg0MSAvKiAyOC1CaXQgLSB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1ZFUklGWV9FWFQJCQkweDQyIC8qIDQ4LUJpdCAqLworLyoKKyAqCTB4NDMtPjB4NEYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fRk9STUFUCQkJMHg1MAorLyoKKyAqCTB4NTEtPjB4NUYgUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBXSU5fSU5JVAkJCTB4NjAKKy8qCisgKgkweDYxLT4weDVGIFJlc2VydmVkCisgKi8KKyNkZWZpbmUgV0lOX1NFRUsJCQkweDcwIC8qIDB4NzAtMHg3RiBSZXNlcnZlZCAqLworCisjZGVmaW5lIENGQV9UUkFOU0xBVEVfU0VDVE9SCQkweDg3IC8qIENGQSBUcmFuc2xhdGUgU2VjdG9yICovCisjZGVmaW5lIFdJTl9ESUFHTk9TRQkJCTB4OTAKKyNkZWZpbmUgV0lOX1NQRUNJRlkJCQkweDkxIC8qIHNldCBkcml2ZSBnZW9tZXRyeSB0cmFuc2xhdGlvbiAqLworI2RlZmluZSBXSU5fRE9XTkxPQURfTUlDUk9DT0RFCQkweDkyCisjZGVmaW5lIFdJTl9TVEFOREJZTk9XMgkJCTB4OTQKKyNkZWZpbmUgV0lOX1NUQU5EQlkyCQkJMHg5NgorI2RlZmluZSBXSU5fU0VUSURMRTIJCQkweDk3CisjZGVmaW5lIFdJTl9DSEVDS1BPV0VSTU9ERTIJCTB4OTgKKyNkZWZpbmUgV0lOX1NMRUVQTk9XMgkJCTB4OTkKKy8qCisgKgkweDlBIFZFTkRPUgorICovCisjZGVmaW5lIFdJTl9QQUNLRVRDTUQJCQkweEEwIC8qIFNlbmQgYSBwYWNrZXQgY29tbWFuZC4gKi8KKyNkZWZpbmUgV0lOX1BJREVOVElGWQkJCTB4QTEgLyogaWRlbnRpZnkgQVRBUEkgZGV2aWNlCSovCisjZGVmaW5lIFdJTl9RVUVVRURfU0VSVklDRQkJMHhBMgorI2RlZmluZSBXSU5fU01BUlQJCQkweEIwIC8qIHNlbGYtbW9uaXRvcmluZyBhbmQgcmVwb3J0aW5nICovCisjZGVmaW5lIENGQV9FUkFTRV9TRUNUT1JTCQkweEMwCisjZGVmaW5lIFdJTl9NVUxUUkVBRAkJCTB4QzQgLyogcmVhZCBzZWN0b3JzIHVzaW5nIG11bHRpcGxlIG1vZGUqLworI2RlZmluZSBXSU5fTVVMVFdSSVRFCQkJMHhDNSAvKiB3cml0ZSBzZWN0b3JzIHVzaW5nIG11bHRpcGxlIG1vZGUgKi8KKyNkZWZpbmUgV0lOX1NFVE1VTFQJCQkweEM2IC8qIGVuYWJsZS9kaXNhYmxlIG11bHRpcGxlIG1vZGUgKi8KKyNkZWZpbmUgV0lOX1JFQURETUFfUVVFVUVECQkweEM3IC8qIHJlYWQgc2VjdG9ycyB1c2luZyBRdWV1ZWQgRE1BIHRyYW5zZmVycyAqLworI2RlZmluZSBXSU5fUkVBRERNQQkJCTB4QzggLyogcmVhZCBzZWN0b3JzIHVzaW5nIERNQSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgV0lOX1JFQURETUFfT05DRQkJMHhDOSAvKiAyOC1CaXQgLSB3aXRob3V0IHJldHJpZXMgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BCQkJMHhDQSAvKiB3cml0ZSBzZWN0b3JzIHVzaW5nIERNQSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgV0lOX1dSSVRFRE1BX09OQ0UJCTB4Q0IgLyogMjgtQml0IC0gd2l0aG91dCByZXRyaWVzICovCisjZGVmaW5lIFdJTl9XUklURURNQV9RVUVVRUQJCTB4Q0MgLyogd3JpdGUgc2VjdG9ycyB1c2luZyBRdWV1ZWQgRE1BIHRyYW5zZmVycyAqLworI2RlZmluZSBDRkFfV1JJVEVfTVVMVElfV09fRVJBU0UJMHhDRCAvKiBDRkEgV3JpdGUgbXVsdGlwbGUgd2l0aG91dCBlcmFzZSAqLworI2RlZmluZSBXSU5fR0VUTUVESUFTVEFUVVMJCTB4REEKKyNkZWZpbmUgV0lOX0FDS01FRElBQ0hBTkdFCQkweERCIC8qIEFUQS0xLCBBVEEtMiB2ZW5kb3IgKi8KKyNkZWZpbmUgV0lOX1BPU1RCT09UCQkJMHhEQworI2RlZmluZSBXSU5fUFJFQk9PVCAJCQkweERECisjZGVmaW5lIFdJTl9ET09STE9DSwkJCTB4REUgLyogbG9jayBkb29yIG9uIHJlbW92YWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUgV0lOX0RPT1JVTkxPQ0sJCQkweERGIC8qIHVubG9jayBkb29yIG9uIHJlbW92YWJsZSBkcml2ZXMgKi8KKyNkZWZpbmUgV0lOX1NUQU5EQllOT1cxCQkJMHhFMAorI2RlZmluZSBXSU5fSURMRUlNTUVESUFURQkJMHhFMSAvKiBmb3JjZSBkcml2ZSB0byBiZWNvbWUgInJlYWR5IiAqLworI2RlZmluZSBXSU5fU1RBTkRCWQkJCTB4RTIgLyogU2V0IGRldmljZSBpbiBTdGFuZGJ5IE1vZGUgKi8KKyNkZWZpbmUgV0lOX1NFVElETEUxCQkJMHhFMworI2RlZmluZSBXSU5fUkVBRF9CVUZGRVIJCQkweEU0IC8qIGZvcmNlIHJlYWQgb25seSAxIHNlY3RvciAqLworI2RlZmluZSBXSU5fQ0hFQ0tQT1dFUk1PREUxCQkweEU1CisjZGVmaW5lIFdJTl9TTEVFUE5PVzEJCQkweEU2CisjZGVmaW5lIFdJTl9GTFVTSF9DQUNIRQkJCTB4RTcKKyNkZWZpbmUgV0lOX1dSSVRFX0JVRkZFUgkJMHhFOCAvKiBmb3JjZSB3cml0ZSBvbmx5IDEgc2VjdG9yICovCisjZGVmaW5lIFdJTl9XUklURV9TQU1FCQkJMHhFOSAvKiByZWFkIGF0YS0yIHRvIHVzZSAqLworCS8qIFNFVF9GRUFUVVJFUyAweDIyIG9yIDB4REQgKi8KKyNkZWZpbmUgV0lOX0ZMVVNIX0NBQ0hFX0VYVAkJMHhFQSAvKiA0OC1CaXQgKi8KKyNkZWZpbmUgV0lOX0lERU5USUZZCQkJMHhFQyAvKiBhc2sgZHJpdmUgdG8gaWRlbnRpZnkgaXRzZWxmCSovCisjZGVmaW5lIFdJTl9NRURJQUVKRUNUCQkJMHhFRAorI2RlZmluZSBXSU5fSURFTlRJRllfRE1BCQkweEVFIC8qIHNhbWUgYXMgV0lOX0lERU5USUZZLCBidXQgRE1BICovCisjZGVmaW5lIFdJTl9TRVRGRUFUVVJFUwkJCTB4RUYgLyogc2V0IHNwZWNpYWwgZHJpdmUgZmVhdHVyZXMgKi8KKyNkZWZpbmUgRVhBQllURV9FTkFCTEVfTkVTVAkJMHhGMAorI2RlZmluZSBXSU5fU0VDVVJJVFlfU0VUX1BBU1MJCTB4RjEKKyNkZWZpbmUgV0lOX1NFQ1VSSVRZX1VOTE9DSwkJMHhGMgorI2RlZmluZSBXSU5fU0VDVVJJVFlfRVJBU0VfUFJFUEFSRQkweEYzCisjZGVmaW5lIFdJTl9TRUNVUklUWV9FUkFTRV9VTklUCQkweEY0CisjZGVmaW5lIFdJTl9TRUNVUklUWV9GUkVFWkVfTE9DSwkweEY1CisjZGVmaW5lIFdJTl9TRUNVUklUWV9ESVNBQkxFCQkweEY2CisjZGVmaW5lIFdJTl9SRUFEX05BVElWRV9NQVgJCTB4RjggLyogcmV0dXJuIHRoZSBuYXRpdmUgbWF4aW11bSBhZGRyZXNzICovCisjZGVmaW5lIFdJTl9TRVRfTUFYCQkJMHhGOQorI2RlZmluZSBESVNBQkxFX1NFQUdBVEUJCQkweEZCCisKKy8qIFdJTl9TTUFSVCBzdWItY29tbWFuZHMgKi8KKworI2RlZmluZSBTTUFSVF9SRUFEX1ZBTFVFUwkJMHhEMAorI2RlZmluZSBTTUFSVF9SRUFEX1RIUkVTSE9MRFMJCTB4RDEKKyNkZWZpbmUgU01BUlRfQVVUT1NBVkUJCQkweEQyCisjZGVmaW5lIFNNQVJUX1NBVkUJCQkweEQzCisjZGVmaW5lIFNNQVJUX0lNTUVESUFURV9PRkZMSU5FCQkweEQ0CisjZGVmaW5lIFNNQVJUX1JFQURfTE9HX1NFQ1RPUgkJMHhENQorI2RlZmluZSBTTUFSVF9XUklURV9MT0dfU0VDVE9SCQkweEQ2CisjZGVmaW5lIFNNQVJUX1dSSVRFX1RIUkVTSE9MRFMJCTB4RDcKKyNkZWZpbmUgU01BUlRfRU5BQkxFCQkJMHhEOAorI2RlZmluZSBTTUFSVF9ESVNBQkxFCQkJMHhEOQorI2RlZmluZSBTTUFSVF9TVEFUVVMJCQkweERBCisjZGVmaW5lIFNNQVJUX0FVVE9fT0ZGTElORQkJMHhEQgorCisvKiBQYXNzd29yZCB1c2VkIGluIFRGNCAmIFRGNSBleGVjdXRpbmcgU01BUlQgY29tbWFuZHMgKi8KKworI2RlZmluZSBTTUFSVF9MQ1lMX1BBU1MJCQkweDRGCisjZGVmaW5lIFNNQVJUX0hDWUxfUEFTUwkJCTB4QzIKKworLyogV0lOX1NFVEZFQVRVUkVTIHN1Yi1jb21tYW5kcyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl84QklUCTB4MDEJLyogRW5hYmxlIDgtQml0IFRyYW5zZmVycyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9XQ0FDSEUJMHgwMgkvKiBFbmFibGUgd3JpdGUgY2FjaGUgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0RFRkVDVAkweDA0CS8qIERpc2FibGUgRGVmZWN0IE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fQVBNCTB4MDUJLyogRW5hYmxlIGFkdmFuY2VkIHBvd2VyIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fU0FNRV9SCTB4MjIJLyogZm9yIGEgcmVnaW9uIEFUQS0xICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19NU04JMHgzMQkvKiBEaXNhYmxlIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX1JFVFJZCTB4MzMJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9BQU0JMHg0MgkvKiBFbmFibGUgQXV0b21hdGljIEFjb3VzdGljIE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfUldfTE9ORwkweDQ0CS8qIFNldCBMZW5ndGggb2YgVlMgYnl0ZXMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfU0VUX0NBQ0hFCTB4NTQJLyogU2V0IENhY2hlIHNlZ21lbnRzIHRvIFNDIFJlZy4gVmFsICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19STEEJMHg1NQkvKiBEaXNhYmxlIHJlYWQgbG9vay1haGVhZCBmZWF0dXJlICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1JJCTB4NUQJLyogRW5hYmxlIHJlbGVhc2UgaW50ZXJydXB0ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1NJCTB4NUUJLyogRW5hYmxlIFNFUlZJQ0UgaW50ZXJydXB0ICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0RJU19SUE9ECTB4NjYJLyogRGlzYWJsZSByZXZlcnRpbmcgdG8gcG93ZXIgb24gZGVmYXVsdHMgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0VDQwkweDc3CS8qIERpc2FibGUgRUNDIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTXzhCSVQJMHg4MQkvKiBEaXNhYmxlIDgtQml0IFRyYW5zZmVycyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfV0NBQ0hFCTB4ODIJLyogRGlzYWJsZSB3cml0ZSBjYWNoZSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9ERUZFQ1QJMHg4NAkvKiBFbmFibGUgRGVmZWN0IE1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX0FQTQkweDg1CS8qIERpc2FibGUgYWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9FQ0MJMHg4OAkvKiBFbmFibGUgRUNDIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fTVNOCTB4OTUJLyogRW5hYmxlIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fUkVUUlkJMHg5OQkvKiBFbmFibGUgUmV0cnkgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRU5fUkxBCTB4QUEJLyogRW5hYmxlIHJlYWQgbG9vay1haGVhZCBmZWF0dXJlICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX1BSRUZFVENICTB4QUIJLyogU2V0cyBkcml2ZSBwcmVmZXRjaCB2YWx1ZSAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9SRVNUCTB4QUMJLyogQVRBLTEgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfNEJfUldfTE9ORwkweEJCCS8qIFNldCBMZW5naHQgb2YgNCBieXRlcyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfQUFNCTB4QzIJLyogRGlzYWJsZSBBdXRvbWF0aWMgQWNvdXN0aWMgTWFuYWdlbWVudCAqLworI2RlZmluZSBTRVRGRUFUVVJFU19FTl9SUE9ECTB4Q0MJLyogRW5hYmxlIHJldmVydGluZyB0byBwb3dlciBvbiBkZWZhdWx0cyAqLworI2RlZmluZSBTRVRGRUFUVVJFU19ESVNfUkkJMHhERAkvKiBEaXNhYmxlIHJlbGVhc2UgaW50ZXJydXB0IEFUQVBJICovCisjZGVmaW5lIFNFVEZFQVRVUkVTX0VOX1NBTUVfTQkweERECS8qIGZvciBhIGVudGlyZSBkZXZpY2UgQVRBLTEgKi8KKyNkZWZpbmUgU0VURkVBVFVSRVNfRElTX1NJCTB4REUJLyogRGlzYWJsZSBTRVJWSUNFIGludGVycnVwdCBBVEFQSSAqLworCisvKiBXSU5fU0VDVVJJVFkgc3ViLWNvbW1hbmRzICovCisKKyNkZWZpbmUgU0VDVVJJVFlfU0VUX1BBU1NXT1JECQkweEJBCisjZGVmaW5lIFNFQ1VSSVRZX1VOTE9DSwkJCTB4QkIKKyNkZWZpbmUgU0VDVVJJVFlfRVJBU0VfUFJFUEFSRQkJMHhCQworI2RlZmluZSBTRUNVUklUWV9FUkFTRV9VTklUCQkweEJECisjZGVmaW5lIFNFQ1VSSVRZX0ZSRUVaRV9MT0NLCQkweEJFCisjZGVmaW5lIFNFQ1VSSVRZX0RJU0FCTEVfUEFTU1dPUkQJMHhCRgorCitzdHJ1Y3QgaGRfZ2VvbWV0cnkgeworICAgICAgdW5zaWduZWQgY2hhciBoZWFkczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKKyAgICAgIHVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKKyAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7Cit9OworCisvKiBoZC9pZGUgY3RsJ3MgdGhhdCBwYXNzIChhcmcpIHB0cnMgdG8gdXNlciBzcGFjZSBhcmUgbnVtYmVyZWQgMHgwMzBuLzB4MDMxbiAqLworI2RlZmluZSBIRElPX0dFVEdFTwkJMHgwMzAxCS8qIGdldCBkZXZpY2UgZ2VvbWV0cnkgKi8KKyNkZWZpbmUgSERJT19HRVRfVU5NQVNLSU5UUgkweDAzMDIJLyogZ2V0IGN1cnJlbnQgdW5tYXNrIHNldHRpbmcgKi8KKyNkZWZpbmUgSERJT19HRVRfTVVMVENPVU5UCTB4MDMwNAkvKiBnZXQgY3VycmVudCBJREUgYmxvY2ttb2RlIHNldHRpbmcgKi8KKyNkZWZpbmUgSERJT19HRVRfUURNQQkJMHgwMzA1CS8qIGdldCB1c2UtcWRtYSBmbGFnICovCisKKyNkZWZpbmUgSERJT19TRVRfWEZFUgkJMHgwMzA2ICAvKiBzZXQgdHJhbnNmZXIgcmF0ZSB2aWEgcHJvYyAqLworCisjZGVmaW5lIEhESU9fT0JTT0xFVEVfSURFTlRJVFkJMHgwMzA3CS8qIE9CU09MRVRFLCBETyBOT1QgVVNFOiByZXR1cm5zIDE0MiBieXRlcyAqLworI2RlZmluZSBIRElPX0dFVF9LRUVQU0VUVElOR1MJMHgwMzA4CS8qIGdldCBrZWVwLXNldHRpbmdzLW9uLXJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgSERJT19HRVRfMzJCSVQJCTB4MDMwOQkvKiBnZXQgY3VycmVudCBpb18zMmJpdCBzZXR0aW5nICovCisjZGVmaW5lIEhESU9fR0VUX05PV0VSUgkJMHgwMzBhCS8qIGdldCBpZ25vcmUtd3JpdGUtZXJyb3IgZmxhZyAqLworI2RlZmluZSBIRElPX0dFVF9ETUEJCTB4MDMwYgkvKiBnZXQgdXNlLWRtYSBmbGFnICovCisjZGVmaW5lIEhESU9fR0VUX05JQ0UJCTB4MDMwYwkvKiBnZXQgbmljZSBmbGFncyAqLworI2RlZmluZSBIRElPX0dFVF9JREVOVElUWQkweDAzMGQJLyogZ2V0IElERSBpZGVudGlmaWNhdGlvbiBpbmZvICovCisjZGVmaW5lIEhESU9fR0VUX1dDQUNIRQkJMHgwMzBlCS8qIGdldCB3cml0ZSBjYWNoZSBtb2RlIG9ufG9mZiAqLworI2RlZmluZSBIRElPX0dFVF9BQ09VU1RJQwkweDAzMGYJLyogZ2V0IGFjb3VzdGljIHZhbHVlICovCisjZGVmaW5lCUhESU9fR0VUX0FERFJFU1MJMHgwMzEwCS8qICovCisKKyNkZWZpbmUgSERJT19HRVRfQlVTU1RBVEUJMHgwMzFhCS8qIGdldCB0aGUgYnVzIHN0YXRlIG9mIHRoZSBod2lmICovCisjZGVmaW5lIEhESU9fVFJJU1RBVEVfSFdJRgkweDAzMWIJLyogZXhlY3V0ZSBhIGNoYW5uZWwgdHJpc3RhdGUgKi8KKyNkZWZpbmUgSERJT19EUklWRV9SRVNFVAkweDAzMWMJLyogZXhlY3V0ZSBhIGRldmljZSByZXNldCAqLworI2RlZmluZSBIRElPX0RSSVZFX1RBU0tGSUxFCTB4MDMxZAkvKiBleGVjdXRlIHJhdyB0YXNrZmlsZSAqLworI2RlZmluZSBIRElPX0RSSVZFX1RBU0sJCTB4MDMxZQkvKiBleGVjdXRlIHRhc2sgYW5kIHNwZWNpYWwgZHJpdmUgY29tbWFuZCAqLworI2RlZmluZSBIRElPX0RSSVZFX0NNRAkJMHgwMzFmCS8qIGV4ZWN1dGUgYSBzcGVjaWFsIGRyaXZlIGNvbW1hbmQgKi8KKyNkZWZpbmUgSERJT19EUklWRV9DTURfQUVCCUhESU9fRFJJVkVfVEFTSworCisvKiBoZC9pZGUgY3RsJ3MgdGhhdCBwYXNzIChhcmcpIG5vbi1wdHIgdmFsdWVzIGFyZSBudW1iZXJlZCAweDAzMm4vMHgwMzNuICovCisjZGVmaW5lIEhESU9fU0VUX01VTFRDT1VOVAkweDAzMjEJLyogY2hhbmdlIElERSBibG9ja21vZGUgKi8KKyNkZWZpbmUgSERJT19TRVRfVU5NQVNLSU5UUgkweDAzMjIJLyogcGVybWl0IG90aGVyIGlycXMgZHVyaW5nIEkvTyAqLworI2RlZmluZSBIRElPX1NFVF9LRUVQU0VUVElOR1MJMHgwMzIzCS8qIGtlZXAgaW9jdGwgc2V0dGluZ3Mgb24gcmVzZXQgKi8KKyNkZWZpbmUgSERJT19TRVRfMzJCSVQJCTB4MDMyNAkvKiBjaGFuZ2UgaW9fMzJiaXQgZmxhZ3MgKi8KKyNkZWZpbmUgSERJT19TRVRfTk9XRVJSCQkweDAzMjUJLyogY2hhbmdlIGlnbm9yZS13cml0ZS1lcnJvciBmbGFnICovCisjZGVmaW5lIEhESU9fU0VUX0RNQQkJMHgwMzI2CS8qIGNoYW5nZSB1c2UtZG1hIGZsYWcgKi8KKyNkZWZpbmUgSERJT19TRVRfUElPX01PREUJMHgwMzI3CS8qIHJlY29uZmlnIGludGVyZmFjZSB0byBuZXcgc3BlZWQgKi8KKyNkZWZpbmUgSERJT19TQ0FOX0hXSUYJCTB4MDMyOAkvKiByZWdpc3RlciBhbmQgKHJlKXNjYW4gaW50ZXJmYWNlICovCisjZGVmaW5lIEhESU9fU0VUX05JQ0UJCTB4MDMyOQkvKiBzZXQgbmljZSBmbGFncyAqLworI2RlZmluZSBIRElPX1VOUkVHSVNURVJfSFdJRgkweDAzMmEgIC8qIHVucmVnaXN0ZXIgaW50ZXJmYWNlICovCisjZGVmaW5lIEhESU9fU0VUX1dDQUNIRQkJMHgwMzJiCS8qIGNoYW5nZSB3cml0ZSBjYWNoZSBlbmFibGUtZGlzYWJsZSAqLworI2RlZmluZSBIRElPX1NFVF9BQ09VU1RJQwkweDAzMmMJLyogY2hhbmdlIGFjb3VzdGljIGJlaGF2aW9yICovCisjZGVmaW5lIEhESU9fU0VUX0JVU1NUQVRFCTB4MDMyZAkvKiBzZXQgdGhlIGJ1cyBzdGF0ZSBvZiB0aGUgaHdpZiAqLworI2RlZmluZSBIRElPX1NFVF9RRE1BCQkweDAzMmUJLyogY2hhbmdlIHVzZS1xZG1hIGZsYWcgKi8KKyNkZWZpbmUgSERJT19TRVRfQUREUkVTUwkweDAzMmYJLyogY2hhbmdlIGxiYSBhZGRyZXNzaW5nIG1vZGVzICovCisKKy8qIGJ1cyBzdGF0ZXMgKi8KK2VudW0geworCUJVU1NUQVRFX09GRiA9IDAsCisJQlVTU1RBVEVfT04sCisJQlVTU1RBVEVfVFJJU1RBVEUKK307CisKKy8qIGhkL2lkZSBjdGwncyB0aGF0IHBhc3MgKGFyZykgcHRycyB0byB1c2VyIHNwYWNlIGFyZSBudW1iZXJlZCAweDAzM24vMHgwMzNuICovCisvKiAweDMzMCBpcyByZXNlcnZlZCAtIHVzZWQgdG8gYmUgSERJT19HRVRHRU9fQklHICovCisvKiAweDMzMSBpcyByZXNlcnZlZCAtIHVzZWQgdG8gYmUgSERJT19HRVRHRU9fQklHX1JBVyAqLworLyogMHgzMzggaXMgcmVzZXJ2ZWQgLSB1c2VkIHRvIGJlIEhESU9fU0VUX0lERV9TQ1NJICovCisvKiAweDMzOSBpcyByZXNlcnZlZCAtIHVzZWQgdG8gYmUgSERJT19TRVRfU0NTSV9JREUgKi8KKworI2RlZmluZSBfX05FV19IRF9EUklWRV9JRAorCisvKgorICogU3RydWN0dXJlIHJldHVybmVkIGJ5IEhESU9fR0VUX0lERU5USVRZLCBhcyBwZXIgQU5TSSBOQ0lUUyBBVEE2IHJldi4xYiBzcGVjLgorICoKKyAqIElmIHlvdSBjaGFuZ2Ugc29tZXRoaW5nIGhlcmUsIHBsZWFzZSByZW1lbWJlciB0byB1cGRhdGUgZml4X2RyaXZlaWQoKSBpbgorICogaWRlL3Byb2JlLmMuCisgKi8KK3N0cnVjdCBoZF9kcml2ZWlkIHsKKwl1bnNpZ25lZCBzaG9ydAljb25maWc7CQkvKiBsb3RzIG9mIG9ic29sZXRlIGJpdCBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0CWN5bHM7CQkvKiBPYnNvbGV0ZSwgInBoeXNpY2FsIiBjeWxzICovCisJdW5zaWduZWQgc2hvcnQJcmVzZXJ2ZWQyOwkvKiByZXNlcnZlZCAod29yZCAyKSAqLworCXVuc2lnbmVkIHNob3J0CWhlYWRzOwkJLyogT2Jzb2xldGUsICJwaHlzaWNhbCIgaGVhZHMgKi8KKwl1bnNpZ25lZCBzaG9ydAl0cmFja19ieXRlczsJLyogdW5mb3JtYXR0ZWQgYnl0ZXMgcGVyIHRyYWNrICovCisJdW5zaWduZWQgc2hvcnQJc2VjdG9yX2J5dGVzOwkvKiB1bmZvcm1hdHRlZCBieXRlcyBwZXIgc2VjdG9yICovCisJdW5zaWduZWQgc2hvcnQJc2VjdG9yczsJLyogT2Jzb2xldGUsICJwaHlzaWNhbCIgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1bnNpZ25lZCBzaG9ydAl2ZW5kb3IwOwkvKiB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgc2hvcnQJdmVuZG9yMTsJLyogdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIHNob3J0CXZlbmRvcjI7CS8qIFJldGlyZWQgdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIGNoYXIJc2VyaWFsX25vWzIwXTsJLyogMCA9IG5vdF9zcGVjaWZpZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAlidWZfdHlwZTsJLyogUmV0aXJlZCAqLworCXVuc2lnbmVkIHNob3J0CWJ1Zl9zaXplOwkvKiBSZXRpcmVkLCA1MTIgYnl0ZSBpbmNyZW1lbnRzCisJCQkJCSAqIDAgPSBub3Rfc3BlY2lmaWVkCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CWVjY19ieXRlczsJLyogZm9yIHIvdyBsb25nIGNtZHM7IDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgY2hhcglmd19yZXZbOF07CS8qIDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgY2hhcgltb2RlbFs0MF07CS8qIDAgPSBub3Rfc3BlY2lmaWVkICovCisJdW5zaWduZWQgY2hhcgltYXhfbXVsdHNlY3Q7CS8qIDA9bm90X2ltcGxlbWVudGVkICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3IzOwkvKiB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgc2hvcnQJZHdvcmRfaW87CS8qIDA9bm90X2ltcGxlbWVudGVkOyAxPWltcGxlbWVudGVkICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3I0OwkvKiB2ZW5kb3IgdW5pcXVlICovCisJdW5zaWduZWQgY2hhcgljYXBhYmlsaXR5OwkvKiAodXBwZXIgYnl0ZSBvZiB3b3JkIDQ5KQorCQkJCQkgKiAgMzoJSU9SRFlzdXAKKwkJCQkJICogIDI6CUlPUkRZc3cKKwkJCQkJICogIDE6CUxCQQorCQkJCQkgKiAgMDoJRE1BCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CXJlc2VydmVkNTA7CS8qIHJlc2VydmVkICh3b3JkIDUwKSAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yNTsJLyogT2Jzb2xldGUsIHZlbmRvciB1bmlxdWUgKi8KKwl1bnNpZ25lZCBjaGFyCXRQSU87CQkvKiBPYnNvbGV0ZSwgMD1zbG93LCAxPW1lZGl1bSwgMj1mYXN0ICovCisJdW5zaWduZWQgY2hhcgl2ZW5kb3I2OwkvKiBPYnNvbGV0ZSwgdmVuZG9yIHVuaXF1ZSAqLworCXVuc2lnbmVkIGNoYXIJdERNQTsJCS8qIE9ic29sZXRlLCAwPXNsb3csIDE9bWVkaXVtLCAyPWZhc3QgKi8KKwl1bnNpZ25lZCBzaG9ydAlmaWVsZF92YWxpZDsJLyogKHdvcmQgNTMpCisJCQkJCSAqICAyOgl1bHRyYV9vawl3b3JkICA4OAorCQkJCQkgKiAgMToJZWlkZV9vawkJd29yZHMgNjQtNzAKKwkJCQkJICogIDA6CWN1cl9vawkJd29yZHMgNTQtNTgKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJY3VyX2N5bHM7CS8qIE9ic29sZXRlLCBsb2dpY2FsIGN5bGluZGVycyAqLworCXVuc2lnbmVkIHNob3J0CWN1cl9oZWFkczsJLyogT2Jzb2xldGUsIGwgaGVhZHMgKi8KKwl1bnNpZ25lZCBzaG9ydAljdXJfc2VjdG9yczsJLyogT2Jzb2xldGUsIGwgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwl1bnNpZ25lZCBzaG9ydAljdXJfY2FwYWNpdHkwOwkvKiBPYnNvbGV0ZSwgbCB0b3RhbCBzZWN0b3JzIG9uIGRyaXZlICovCisJdW5zaWduZWQgc2hvcnQJY3VyX2NhcGFjaXR5MTsJLyogT2Jzb2xldGUsICgyIHdvcmRzLCBtaXNhbGlnbmVkIGludCkgICAgICovCisJdW5zaWduZWQgY2hhcgltdWx0c2VjdDsJLyogY3VycmVudCBtdWx0aXBsZSBzZWN0b3IgY291bnQgKi8KKwl1bnNpZ25lZCBjaGFyCW11bHRzZWN0X3ZhbGlkOwkvKiB3aGVuIChiaXQwPT0xKSBtdWx0c2VjdCBpcyBvayAqLworCXVuc2lnbmVkIGludAlsYmFfY2FwYWNpdHk7CS8qIE9ic29sZXRlLCB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyAqLworCXVuc2lnbmVkIHNob3J0CWRtYV8xd29yZDsJLyogT2Jzb2xldGUsIHNpbmdsZS13b3JkIGRtYSBpbmZvICovCisJdW5zaWduZWQgc2hvcnQJZG1hX213b3JkOwkvKiBtdWx0aXBsZS13b3JkIGRtYSBpbmZvICovCisJdW5zaWduZWQgc2hvcnQgIGVpZGVfcGlvX21vZGVzOyAvKiBiaXRzIDA6bW9kZTMgMTptb2RlNCAqLworCXVuc2lnbmVkIHNob3J0ICBlaWRlX2RtYV9taW47CS8qIG1pbiBtd29yZCBkbWEgY3ljbGUgdGltZSAobnMpICovCisJdW5zaWduZWQgc2hvcnQgIGVpZGVfZG1hX3RpbWU7CS8qIHJlY29tbWVuZGVkIG13b3JkIGRtYSBjeWNsZSB0aW1lIChucykgKi8KKwl1bnNpZ25lZCBzaG9ydCAgZWlkZV9waW87ICAgICAgIC8qIG1pbiBjeWNsZSB0aW1lIChucyksIG5vIElPUkRZICAqLworCXVuc2lnbmVkIHNob3J0ICBlaWRlX3Bpb19pb3JkeTsgLyogbWluIGN5Y2xlIHRpbWUgKG5zKSwgd2l0aCBJT1JEWSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzNjlfNzBbMl07CS8qIHJlc2VydmVkIHdvcmRzIDY5LTcwCisJCQkJCSAqIGZ1dHVyZSBjb21tYW5kIG92ZXJsYXAgYW5kIHF1ZXVpbmcKKwkJCQkJICovCisJLyogSERJT19HRVRfSURFTlRJVFkgY3VycmVudGx5IHJldHVybnMgb25seSB3b3JkcyAwIHRocm91Z2ggNzAgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczcxXzc0WzRdOwkvKiByZXNlcnZlZCB3b3JkcyA3MS03NAorCQkJCQkgKiBmb3IgSURFTlRJRlkgUEFDS0VUIERFVklDRSBjb21tYW5kCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBxdWV1ZV9kZXB0aDsJLyogKHdvcmQgNzUpCisJCQkJCSAqIDE1OjUJcmVzZXJ2ZWQKKwkJCQkJICogIDQ6MAlNYXhpbXVtIHF1ZXVlIGRlcHRoIC0xCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICB3b3Jkczc2Xzc5WzRdOwkvKiByZXNlcnZlZCB3b3JkcyA3Ni03OSAqLworCXVuc2lnbmVkIHNob3J0ICBtYWpvcl9yZXZfbnVtOwkvKiAod29yZCA4MCkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgbWlub3JfcmV2X251bTsJLyogKHdvcmQgODEpICovCisJdW5zaWduZWQgc2hvcnQgIGNvbW1hbmRfc2V0XzE7CS8qICh3b3JkIDgyKSBzdXBwb3J0ZWQKKwkJCQkJICogMTU6CU9ic29sZXRlCisJCQkJCSAqIDE0OglOT1AgY29tbWFuZAorCQkJCQkgKiAxMzoJUkVBRF9CVUZGRVIKKwkJCQkJICogMTI6CVdSSVRFX0JVRkZFUgorCQkJCQkgKiAxMToJT2Jzb2xldGUKKwkJCQkJICogMTA6CUhvc3QgUHJvdGVjdGVkIEFyZWEKKwkJCQkJICogIDk6CURFVklDRSBSZXNldAorCQkJCQkgKiAgODoJU0VSVklDRSBJbnRlcnJ1cHQKKwkJCQkJICogIDc6CVJlbGVhc2UgSW50ZXJydXB0CisJCQkJCSAqICA2Oglsb29rLWFoZWFkCisJCQkJCSAqICA1Ogl3cml0ZSBjYWNoZQorCQkJCQkgKiAgNDoJUEFDS0VUIENvbW1hbmQKKwkJCQkJICogIDM6CVBvd2VyIE1hbmFnZW1lbnQgRmVhdHVyZSBTZXQKKwkJCQkJICogIDI6CVJlbW92YWJsZSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMToJU2VjdXJpdHkgRmVhdHVyZSBTZXQKKwkJCQkJICogIDA6CVNNQVJUIEZlYXR1cmUgU2V0CisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBjb21tYW5kX3NldF8yOwkvKiAod29yZCA4MykKKwkJCQkJICogMTU6CVNoYWxsIGJlIFpFUk8KKwkJCQkJICogMTQ6CVNoYWxsIGJlIE9ORQorCQkJCQkgKiAxMzoJRkxVU0ggQ0FDSEUgRVhUCisJCQkJCSAqIDEyOglGTFVTSCBDQUNIRQorCQkJCQkgKiAxMToJRGV2aWNlIENvbmZpZ3VyYXRpb24gT3ZlcmxheQorCQkJCQkgKiAxMDoJNDgtYml0IEFkZHJlc3MgRmVhdHVyZSBTZXQKKwkJCQkJICogIDk6CUF1dG9tYXRpYyBBY291c3RpYyBNYW5hZ2VtZW50CisJCQkJCSAqICA4OglTRVQgTUFYIHNlY3VyaXR5CisJCQkJCSAqICA3OglyZXNlcnZlZCAxNDA3RFQgUEFSVElFUworCQkJCQkgKiAgNjoJU2V0RiBzdWItY29tbWFuZCBQb3dlci1VcAorCQkJCQkgKiAgNToJUG93ZXItVXAgaW4gU3RhbmRieSBGZWF0dXJlIFNldAorCQkJCQkgKiAgNDoJUmVtb3ZhYmxlIE1lZGlhIE5vdGlmaWNhdGlvbgorCQkJCQkgKiAgMzoJQVBNIEZlYXR1cmUgU2V0CisJCQkJCSAqICAyOglDRkEgRmVhdHVyZSBTZXQKKwkJCQkJICogIDE6CVJFQUQvV1JJVEUgRE1BIFFVRVVFRAorCQkJCQkgKiAgMDoJRG93bmxvYWQgTWljcm9Db2RlCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBjZnNzZTsJCS8qICh3b3JkIDg0KQorCQkJCQkgKiBjbWQgc2V0LWZlYXR1cmUgc3VwcG9ydGVkIGV4dGVuc2lvbnMKKwkJCQkJICogMTU6CVNoYWxsIGJlIFpFUk8KKwkJCQkJICogMTQ6CVNoYWxsIGJlIE9ORQorCQkJCQkgKiAxMzo2CXJlc2VydmVkCisJCQkJCSAqICA1OglHZW5lcmFsIFB1cnBvc2UgTG9nZ2luZworCQkJCQkgKiAgNDoJU3RyZWFtaW5nIEZlYXR1cmUgU2V0CisJCQkJCSAqICAzOglNZWRpYSBDYXJkIFBhc3MgVGhyb3VnaAorCQkJCQkgKiAgMjoJTWVkaWEgU2VyaWFsIE51bWJlciBWYWxpZAorCQkJCQkgKiAgMToJU01BUlQgc2VsdC10ZXN0IHN1cHBvcnRlZAorCQkJCQkgKiAgMDoJU01BUlQgZXJyb3IgbG9nZ2luZworCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY2ZzX2VuYWJsZV8xOwkvKiAod29yZCA4NSkKKwkJCQkJICogY29tbWFuZCBzZXQtZmVhdHVyZSBlbmFibGVkCisJCQkJCSAqIDE1OglPYnNvbGV0ZQorCQkJCQkgKiAxNDoJTk9QIGNvbW1hbmQKKwkJCQkJICogMTM6CVJFQURfQlVGRkVSCisJCQkJCSAqIDEyOglXUklURV9CVUZGRVIKKwkJCQkJICogMTE6CU9ic29sZXRlCisJCQkJCSAqIDEwOglIb3N0IFByb3RlY3RlZCBBcmVhCisJCQkJCSAqICA5OglERVZJQ0UgUmVzZXQKKwkJCQkJICogIDg6CVNFUlZJQ0UgSW50ZXJydXB0CisJCQkJCSAqICA3OglSZWxlYXNlIEludGVycnVwdAorCQkJCQkgKiAgNjoJbG9vay1haGVhZAorCQkJCQkgKiAgNToJd3JpdGUgY2FjaGUKKwkJCQkJICogIDQ6CVBBQ0tFVCBDb21tYW5kCisJCQkJCSAqICAzOglQb3dlciBNYW5hZ2VtZW50IEZlYXR1cmUgU2V0CisJCQkJCSAqICAyOglSZW1vdmFibGUgRmVhdHVyZSBTZXQKKwkJCQkJICogIDE6CVNlY3VyaXR5IEZlYXR1cmUgU2V0CisJCQkJCSAqICAwOglTTUFSVCBGZWF0dXJlIFNldAorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY2ZzX2VuYWJsZV8yOwkvKiAod29yZCA4NikKKwkJCQkJICogY29tbWFuZCBzZXQtZmVhdHVyZSBlbmFibGVkCisJCQkJCSAqIDE1OglTaGFsbCBiZSBaRVJPCisJCQkJCSAqIDE0OglTaGFsbCBiZSBPTkUKKwkJCQkJICogMTM6CUZMVVNIIENBQ0hFIEVYVAorCQkJCQkgKiAxMjoJRkxVU0ggQ0FDSEUKKwkJCQkJICogMTE6CURldmljZSBDb25maWd1cmF0aW9uIE92ZXJsYXkKKwkJCQkJICogMTA6CTQ4LWJpdCBBZGRyZXNzIEZlYXR1cmUgU2V0CisJCQkJCSAqICA5OglBdXRvbWF0aWMgQWNvdXN0aWMgTWFuYWdlbWVudAorCQkJCQkgKiAgODoJU0VUIE1BWCBzZWN1cml0eQorCQkJCQkgKiAgNzoJcmVzZXJ2ZWQgMTQwN0RUIFBBUlRJRVMKKwkJCQkJICogIDY6CVNldEYgc3ViLWNvbW1hbmQgUG93ZXItVXAKKwkJCQkJICogIDU6CVBvd2VyLVVwIGluIFN0YW5kYnkgRmVhdHVyZSBTZXQKKwkJCQkJICogIDQ6CVJlbW92YWJsZSBNZWRpYSBOb3RpZmljYXRpb24KKwkJCQkJICogIDM6CUFQTSBGZWF0dXJlIFNldAorCQkJCQkgKiAgMjoJQ0ZBIEZlYXR1cmUgU2V0CisJCQkJCSAqICAxOglSRUFEL1dSSVRFIERNQSBRVUVVRUQKKwkJCQkJICogIDA6CURvd25sb2FkIE1pY3JvQ29kZQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY3NmX2RlZmF1bHQ7CS8qICh3b3JkIDg3KQorCQkJCQkgKiBjb21tYW5kIHNldC1mZWF0dXJlIGRlZmF1bHQKKwkJCQkJICogMTU6CVNoYWxsIGJlIFpFUk8KKwkJCQkJICogMTQ6CVNoYWxsIGJlIE9ORQorCQkJCQkgKiAxMzo2CXJlc2VydmVkCisJCQkJCSAqICA1OglHZW5lcmFsIFB1cnBvc2UgTG9nZ2luZyBlbmFibGVkCisJCQkJCSAqICA0OglWYWxpZCBDT05GSUdVUkUgU1RSRUFNIGV4ZWN1dGVkCisJCQkJCSAqICAzOglNZWRpYSBDYXJkIFBhc3MgVGhyb3VnaCBlbmFibGVkCisJCQkJCSAqICAyOglNZWRpYSBTZXJpYWwgTnVtYmVyIFZhbGlkCisJCQkJCSAqICAxOglTTUFSVCBzZWx0LXRlc3Qgc3VwcG9ydGVkCisJCQkJCSAqICAwOglTTUFSVCBlcnJvciBsb2dnaW5nCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0ICBkbWFfdWx0cmE7CS8qICh3b3JkIDg4KSAqLworCXVuc2lnbmVkIHNob3J0CXRyc2V1YzsJCS8qIHRpbWUgcmVxdWlyZWQgZm9yIHNlY3VyaXR5IGVyYXNlICovCisJdW5zaWduZWQgc2hvcnQJdHJzRXVjOwkJLyogdGltZSByZXF1aXJlZCBmb3IgZW5oYW5jZWQgZXJhc2UgKi8KKwl1bnNpZ25lZCBzaG9ydAlDdXJBUE12YWx1ZXM7CS8qIGN1cnJlbnQgQVBNIHZhbHVlcyAqLworCXVuc2lnbmVkIHNob3J0CW1wcmM7CQkvKiBtYXN0ZXIgcGFzc3dvcmQgcmV2aXNpb24gY29kZSAqLworCXVuc2lnbmVkIHNob3J0CWh3X2NvbmZpZzsJLyogaGFyZHdhcmUgY29uZmlnICh3b3JkIDkzKQorCQkJCQkgKiAxNToJU2hhbGwgYmUgWkVSTworCQkJCQkgKiAxNDoJU2hhbGwgYmUgT05FCisJCQkJCSAqIDEzOgorCQkJCQkgKiAxMjoKKwkJCQkJICogMTE6CisJCQkJCSAqIDEwOgorCQkJCQkgKiAgOToKKwkJCQkJICogIDg6CisJCQkJCSAqICA3OgorCQkJCQkgKiAgNjoKKwkJCQkJICogIDU6CisJCQkJCSAqICA0OgorCQkJCQkgKiAgMzoKKwkJCQkJICogIDI6CisJCQkJCSAqICAxOgorCQkJCQkgKiAgMDoJU2hhbGwgYmUgT05FCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CWFjb3VzdGljOwkvKiAod29yZCA5NCkKKwkJCQkJICogMTU6OAlWZW5kb3IncyByZWNvbW1lbmRlZCB2YWx1ZQorCQkJCQkgKiAgNzowCWN1cnJlbnQgdmFsdWUKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJbXNycXM7CQkvKiBtaW4gc3RyZWFtIHJlcXVlc3Qgc2l6ZSAqLworCXVuc2lnbmVkIHNob3J0CXN4ZmVydDsJCS8qIHN0cmVhbSB0cmFuc2ZlciB0aW1lICovCisJdW5zaWduZWQgc2hvcnQJc2FsOwkJLyogc3RyZWFtIGFjY2VzcyBsYXRlbmN5ICovCisJdW5zaWduZWQgaW50CXNwZzsJCS8qIHN0cmVhbSBwZXJmb3JtYW5jZSBncmFudWxhcml0eSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYmFfY2FwYWNpdHlfMjsvKiA0OC1iaXQgdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczEwNF8xMjVbMjJdOy8qIHJlc2VydmVkIHdvcmRzIDEwNC0xMjUgKi8KKwl1bnNpZ25lZCBzaG9ydAlsYXN0X2x1bjsJLyogKHdvcmQgMTI2KSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmQxMjc7CS8qICh3b3JkIDEyNykgRmVhdHVyZSBTZXQKKwkJCQkJICogUmVtb3ZhYmxlIE1lZGlhIE5vdGlmaWNhdGlvbgorCQkJCQkgKiAxNToyCXJlc2VydmVkCisJCQkJCSAqICAxOjAJMDAgPSBub3Qgc3VwcG9ydGVkCisJCQkJCSAqCTAxID0gc3VwcG9ydGVkCisJCQkJCSAqCTEwID0gcmVzZXJ2ZWQKKwkJCQkJICoJMTEgPSByZXNlcnZlZAorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydAlkbGY7CQkvKiAod29yZCAxMjgpCisJCQkJCSAqIGRldmljZSBsb2NrIGZ1bmN0aW9uCisJCQkJCSAqIDE1OjkJcmVzZXJ2ZWQKKwkJCQkJICogIDgJc2VjdXJpdHkgbGV2ZWwgMTptYXggMDpoaWdoCisJCQkJCSAqICA3OjYJcmVzZXJ2ZWQKKwkJCQkJICogIDUJZW5oYW5jZWQgZXJhc2UKKwkJCQkJICogIDQJZXhwaXJlCisJCQkJCSAqICAzCWZyb3plbgorCQkJCQkgKiAgMglsb2NrZWQKKwkJCQkJICogIDEJZW4vZGlzYWJsZWQKKwkJCQkJICogIDAJY2FwYWJpbGl0eQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAgY3NmbzsJCS8qICAod29yZCAxMjkpCisJCQkJCSAqIGN1cnJlbnQgc2V0IGZlYXR1cmVzIG9wdGlvbnMKKwkJCQkJICogMTU6NAlyZXNlcnZlZAorCQkJCQkgKiAgMzoJYXV0byByZWFzc2lnbgorCQkJCQkgKiAgMjoJcmV2ZXJ0aW5nCisJCQkJCSAqICAxOglyZWFkLWxvb2stYWhlYWQKKwkJCQkJICogIDA6CXdyaXRlIGNhY2hlCisJCQkJCSAqLworCXVuc2lnbmVkIHNob3J0CXdvcmRzMTMwXzE1NVsyNl07LyogcmVzZXJ2ZWQgdmVuZG9yIHdvcmRzIDEzMC0xNTUgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkMTU2OwkvKiByZXNlcnZlZCB2ZW5kb3Igd29yZCAxNTYgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczE1N18xNTlbM107LyogcmVzZXJ2ZWQgdmVuZG9yIHdvcmRzIDE1Ny0xNTkgKi8KKwl1bnNpZ25lZCBzaG9ydAljZmFfcG93ZXI7CS8qICh3b3JkIDE2MCkgQ0ZBIFBvd2VyIE1vZGUKKwkJCQkJICogMTUgd29yZCAxNjAgc3VwcG9ydGVkCisJCQkJCSAqIDE0IHJlc2VydmVkCisJCQkJCSAqIDEzCisJCQkJCSAqIDEyCisJCQkJCSAqIDExOjAKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQJd29yZHMxNjFfMTc1WzE1XTsvKiBSZXNlcnZlZCBmb3IgQ0ZBICovCisJdW5zaWduZWQgc2hvcnQJd29yZHMxNzZfMjA1WzMwXTsvKiBDdXJyZW50IE1lZGlhIFNlcmlhbCBOdW1iZXIgKi8KKwl1bnNpZ25lZCBzaG9ydAl3b3JkczIwNl8yNTRbNDldOy8qIHJlc2VydmVkIHdvcmRzIDIwNi0yNTQgKi8KKwl1bnNpZ25lZCBzaG9ydAlpbnRlZ3JpdHlfd29yZDsJLyogKHdvcmQgMjU1KQorCQkJCQkgKiAxNTo4IENoZWNrc3VtCisJCQkJCSAqICA3OjAgU2lnbmF0dXJlCisJCQkJCSAqLworfTsKKworLyoKKyAqIElERSAibmljZSIgZmxhZ3MuIFRoZXNlIGFyZSB1c2VkIG9uIGEgcGVyIGRyaXZlIGJhc2lzIHRvIGRldGVybWluZQorICogd2hlbiB0byBiZSBuaWNlIGFuZCBnaXZlIG1vcmUgYmFuZHdpZHRoIHRvIHRoZSBvdGhlciBkZXZpY2VzIHdoaWNoCisgKiBzaGFyZSB0aGUgc2FtZSBJREUgYnVzLgorICovCisjZGVmaW5lIElERV9OSUNFX0RTQ19PVkVSTEFQCSgwKQkvKiBwZXIgdGhlIERTQyBvdmVybGFwIHByb3RvY29sICovCisjZGVmaW5lIElERV9OSUNFX0FUQVBJX09WRVJMQVAJKDEpCS8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisjZGVmaW5lIElERV9OSUNFXzAJCSgyKQkvKiB3aGVuIHN1cmUgdGhhdCBpdCB3b24ndCBhZmZlY3QgdXMgKi8KKyNkZWZpbmUgSURFX05JQ0VfMQkJKDMpCS8qIHdoZW4gcHJvYmFibHkgd29uJ3QgYWZmZWN0IHVzIG11Y2ggKi8KKyNkZWZpbmUgSURFX05JQ0VfMgkJKDQpCS8qIHdoZW4gd2Uga25vdyBpdCdzIG9uIG91ciBleHBlbnNlICovCisKKyNlbmRpZgkvKiBfTElOVVhfSERSRUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZHNtYXJ0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hkc21hcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc0YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oZHNtYXJ0LmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L2hkc21hcnQuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAwCU1pY2hhZWwgQ29ybndlbGwgPGNvcm53ZWxsQGFjbS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAJCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKGZvciBleGFtcGxlIC91c3Ivc3JjL2xpbnV4L0NPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9IRFNNQVJUX0gKKyNkZWZpbmUgX0xJTlVYX0hEU01BUlRfSAorCisjZGVmaW5lIE9GRkxJTkVfRlVMTF9TQ0FOCQkwCisjZGVmaW5lIFNIT1JUX1NFTEZfVEVTVAkJCTEKKyNkZWZpbmUgRVhURU5EX1NFTEZfVEVTVAkJMgorI2RlZmluZSBTSE9SVF9DQVBUSVZFX1NFTEZfVEVTVAkJMTI5CisjZGVmaW5lIEVYVEVORF9DQVBUSVZFX1NFTEZfVEVTVAkxMzAKKworLyogc21hcnRfYXR0cmlidXRlIGlzIHRoZSB2ZW5kb3Igc3BlY2lmaWMgaW4gU0ZGLTgwMzUgc3BlYyAqLwordHlwZWRlZiBzdHJ1Y3QgYXRhX3NtYXJ0X2F0dHJpYnV0ZV9zIHsKKwl1bnNpZ25lZCBjaGFyCQkJaWQ7CisJdW5zaWduZWQgc2hvcnQJCQlzdGF0dXNfZmxhZzsKKwl1bnNpZ25lZCBjaGFyCQkJbm9ybWFsaXplZDsKKwl1bnNpZ25lZCBjaGFyCQkJd29yc2Vfbm9ybWFsOworCXVuc2lnbmVkIGNoYXIJCQlyYXdbNl07CisJdW5zaWduZWQgY2hhcgkJCXJlc2VydjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YV9zbWFydF9hdHRyaWJ1dGVfdDsKKworLyogc21hcnRfdmFsdWVzIGlzIGZvcm1hdCBvZiB0aGUgcmVhZCBkcml2ZSBBdHJyaWJ1dGUgY29tbWFuZCAqLwordHlwZWRlZiBzdHJ1Y3QgYXRhX3NtYXJ0X3ZhbHVlc19zIHsKKwl1bnNpZ25lZCBzaG9ydAkJCXJldm51bWJlcjsKKwlhdGFfc21hcnRfYXR0cmlidXRlX3QJCXZlbmRvcl9hdHRyaWJ1dGVzIFszMF07CisgICAgICAgIHVuc2lnbmVkIGNoYXIJCQlvZmZsaW5lX2RhdGFfY29sbGVjdGlvbl9zdGF0dXM7CisgICAgICAgIHVuc2lnbmVkIGNoYXIJCQlzZWxmX3Rlc3RfZXhlY19zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJCQl0b3RhbF90aW1lX3RvX2NvbXBsZXRlX29mZl9saW5lOworCXVuc2lnbmVkIGNoYXIJCQl2ZW5kb3Jfc3BlY2lmaWNfMzY2OworCXVuc2lnbmVkIGNoYXIJCQlvZmZsaW5lX2RhdGFfY29sbGVjdGlvbl9jYXBhYmlsaXR5OworCXVuc2lnbmVkIHNob3J0CQkJc21hcnRfY2FwYWJpbGl0eTsKKwl1bnNpZ25lZCBjaGFyCQkJZXJyb3Jsb2dfY2FwYWJpbGl0eTsKKwl1bnNpZ25lZCBjaGFyCQkJdmVuZG9yX3NwZWNpZmljXzM3MTsKKwl1bnNpZ25lZCBjaGFyCQkJc2hvcnRfdGVzdF9jb21wbGV0aW9uX3RpbWU7CisJdW5zaWduZWQgY2hhcgkJCWV4dGVuZF90ZXN0X2NvbXBsZXRpb25fdGltZTsKKwl1bnNpZ25lZCBjaGFyCQkJcmVzZXJ2ZWRfMzc0XzM4NSBbMTJdOworCXVuc2lnbmVkIGNoYXIJCQl2ZW5kb3Jfc3BlY2lmaWNfMzg2XzUwOSBbMTI1XTsKKwl1bnNpZ25lZCBjaGFyCQkJY2hrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYXRhX3NtYXJ0X3ZhbHVlc190OworCisvKiBTbWFydCBUaHJlc2hvbGQgZGF0YSBzdHJ1Y3R1cmVzICovCisvKiBWZW5kb3IgYXR0cmlidXRlIG9mIFNNQVJUIFRocmVzaG9sZCAqLwordHlwZWRlZiBzdHJ1Y3QgYXRhX3NtYXJ0X3RocmVzaG9sZF9lbnRyeV9zIHsKKwl1bnNpZ25lZCBjaGFyCQkJaWQ7CisJdW5zaWduZWQgY2hhcgkJCW5vcm1hbGl6ZWRfdGhyZXNob2xkOworCXVuc2lnbmVkIGNoYXIJCQlyZXNlcnZlZFsxMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdGFfc21hcnRfdGhyZXNob2xkX2VudHJ5X3Q7CisKKy8qIEZvcm1hdCBvZiBSZWFkIFNNQVJUIFRIcmVzaG9sZCBDb21tYW5kICovCit0eXBlZGVmIHN0cnVjdCBhdGFfc21hcnRfdGhyZXNob2xkc19zIHsKKwl1bnNpZ25lZCBzaG9ydAkJCXJldm51bWJlcjsKKwlhdGFfc21hcnRfdGhyZXNob2xkX2VudHJ5X3QJdGhyZXNfZW50cmllc1szMF07CisJdW5zaWduZWQgY2hhcgkJCXJlc2VydmVkWzE0OV07CisJdW5zaWduZWQgY2hhcgkJCWNoa3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YV9zbWFydF90aHJlc2hvbGRzX3Q7CisKK3R5cGVkZWYgc3RydWN0IGF0YV9zbWFydF9lcnJvcmxvZ19jb21tYW5kX3N0cnVjdF9zIHsKKwl1bnNpZ25lZCBjaGFyCQkJZGV2aWNlY29udHJvbHJlZzsKKwl1bnNpZ25lZCBjaGFyCQkJZmVhdHVyZXNyZWc7CisJdW5zaWduZWQgY2hhcgkJCXNlY3Rvcl9jb3VudDsKKwl1bnNpZ25lZCBjaGFyCQkJc2VjdG9yX251bWJlcjsKKwl1bnNpZ25lZCBjaGFyCQkJY3lsaW5kZXJfbG93OworCXVuc2lnbmVkIGNoYXIJCQljeWxpbmRlcl9oaWdoOworCXVuc2lnbmVkIGNoYXIJCQlkcml2ZV9oZWFkOworCXVuc2lnbmVkIGNoYXIJCQljb21tYW5kcmVnOworCXVuc2lnbmVkIGludAkJCXRpbWVzdGFtcDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YV9zbWFydF9lcnJvcmxvZ19jb21tYW5kX3N0cnVjdF90OworCit0eXBlZGVmIHN0cnVjdCBhdGFfc21hcnRfZXJyb3Jsb2dfZXJyb3Jfc3RydWN0X3MgeworCXVuc2lnbmVkIGNoYXIJCQllcnJvcl9jb25kaXRpb247CisJdW5zaWduZWQgY2hhcgkJCWV4dGVuZGVkX2Vycm9yWzE0XTsKKwl1bnNpZ25lZCBjaGFyCQkJc3RhdGU7CisJdW5zaWduZWQgc2hvcnQJCQl0aW1lc3RhbXA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdGFfc21hcnRfZXJyb3Jsb2dfZXJyb3Jfc3RydWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGF0YV9zbWFydF9lcnJvcmxvZ19zdHJ1Y3RfcyB7CisJYXRhX3NtYXJ0X2Vycm9ybG9nX2NvbW1hbmRfc3RydWN0X3QJY29tbWFuZHNbNl07CisJYXRhX3NtYXJ0X2Vycm9ybG9nX2Vycm9yX3N0cnVjdF90CWVycm9yX3N0cnVjdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YV9zbWFydF9lcnJvcmxvZ19zdHJ1Y3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYXRhX3NtYXJ0X2Vycm9ybG9nX3MgeworCXVuc2lnbmVkIGNoYXIJCQlyZXZudW1iZXI7CisJdW5zaWduZWQgY2hhcgkJCWVycm9yX2xvZ19wb2ludGVyOworCWF0YV9zbWFydF9lcnJvcmxvZ19zdHJ1Y3RfdAllcnJvcmxvZ19zdHJ1Y3RbNV07CisJdW5zaWduZWQgc2hvcnQJCQlhdGFfZXJyb3JfY291bnQ7CisJdW5zaWduZWQgc2hvcnQJCQlub25fZmF0YWxfY291bnQ7CisJdW5zaWduZWQgc2hvcnQJCQlkcml2ZV90aW1lb3V0X2NvdW50OworCXVuc2lnbmVkIGNoYXIJCQlyZXNlcnZlZFs1M107CisJdW5zaWduZWQgY2hhcgkJCWNoa3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YV9zbWFydF9lcnJvcmxvZ190OworCit0eXBlZGVmIHN0cnVjdCBhdGFfc21hcnRfc2VsZnRlc3Rsb2dfc3RydWN0X3MgeworCXVuc2lnbmVkIGNoYXIJCQlzZWxmdGVzdG51bWJlcjsKKwl1bnNpZ25lZCBjaGFyCQkJc2VsZnRlc3RzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQJCQl0aW1lc3RhbXA7CisJdW5zaWduZWQgY2hhcgkJCXNlbGZ0ZXN0ZmFpbHVyZWNoZWNrcG9pbnQ7CisJdW5zaWduZWQgaW50CQkJbGJhZmlyc3RmYWlsdXJlOworCXVuc2lnbmVkIGNoYXIJCQl2ZW5kb3JzcGVjaWZpY1sxNV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhdGFfc21hcnRfc2VsZnRlc3Rsb2dfc3RydWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGF0YV9zbWFydF9zZWxmdGVzdGxvZ19zIHsKKwl1bnNpZ25lZCBzaG9ydAkJCXJldm51bWJlcjsKKwlhdGFfc21hcnRfc2VsZnRlc3Rsb2dfc3RydWN0X3QJc2VsZnRlc3Rfc3RydWN0WzIxXTsKKwl1bnNpZ25lZCBjaGFyCQkJdmVuZG9yc3BlY2lmaWNbMl07CisJdW5zaWduZWQgY2hhcgkJCW1vc3RyZWNlbnR0ZXN0OworCXVuc2lnbmVkIGNoYXIJCQlyZXNldmVyZWRbMl07CisJdW5zaWduZWQgY2hhcgkJCWNoa3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGF0YV9zbWFydF9zZWxmdGVzdGxvZ190OworCisjZW5kaWYJLyogX0xJTlVYX0hEU01BUlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oaWRkZXYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhMWY2MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaGlkZGV2LmgKQEAgLTAsMCArMSwyMTAgQEAKKyNpZm5kZWYgX0hJRERFVl9ICisjZGVmaW5lIF9ISURERVZfSAorCisvKgorICogJElkOiBoaWRkZXYuaCx2IDEuMiAyMDAxLzA0LzI2IDExOjI2OjA5IHZvanRlY2ggRXhwICQKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiAgU3BvbnNvcmVkIGJ5IFN1U0UKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIAorICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5CisgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEBzdXNlLmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKKyAqIFZvanRlY2ggUGF2bGlrLCBVY2l0ZWxza2EgMTU3NiwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYworICovCisKKy8qCisgKiBUaGUgZXZlbnQgc3RydWN0dXJlIGl0c2VsZgorICovCisKK3N0cnVjdCBoaWRkZXZfZXZlbnQgeworCXVuc2lnbmVkIGhpZDsKKwlzaWduZWQgaW50IHZhbHVlOworfTsKKworc3RydWN0IGhpZGRldl9kZXZpbmZvIHsKKwlfX3UzMiBidXN0eXBlOworCV9fdTMyIGJ1c251bTsKKwlfX3UzMiBkZXZudW07CisJX191MzIgaWZudW07CisJX19zMTYgdmVuZG9yOworCV9fczE2IHByb2R1Y3Q7CisJX19zMTYgdmVyc2lvbjsKKwlfX3UzMiBudW1fYXBwbGljYXRpb25zOworfTsKKworc3RydWN0IGhpZGRldl9jb2xsZWN0aW9uX2luZm8geworCV9fdTMyIGluZGV4OworCV9fdTMyIHR5cGU7CisJX191MzIgdXNhZ2U7CisJX191MzIgbGV2ZWw7Cit9OworCisjZGVmaW5lIEhJRF9TVFJJTkdfU0laRSAyNTYKK3N0cnVjdCBoaWRkZXZfc3RyaW5nX2Rlc2NyaXB0b3IgeworCV9fczMyIGluZGV4OworCWNoYXIgdmFsdWVbSElEX1NUUklOR19TSVpFXTsKK307CisKK3N0cnVjdCBoaWRkZXZfcmVwb3J0X2luZm8geworCV9fdTMyIHJlcG9ydF90eXBlOworCV9fdTMyIHJlcG9ydF9pZDsKKwlfX3UzMiBudW1fZmllbGRzOworfTsKKworLyogVG8gZG8gYSBHVVNBR0UvU1VTQUdFLCBmaWxsIGluIGF0IGxlYXN0IHVzYWdlX2NvZGUsICByZXBvcnRfdHlwZSBhbmQgCisgKiByZXBvcnRfaWQuICBTZXQgcmVwb3J0X2lkIHRvIFJFUE9SVF9JRF9VTktOT1dOIGlmIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgCisgKiBhcmUgdW5rbm93bi4gIE90aGVyd2lzZSB1c2UgYSB1c2FnZV9yZWYgc3RydWN0IGZpbGxlZCBpbiBmcm9tIGEgcHJldmlvdXMgCisgKiBzdWNjZXNzZnVsIEdVU0FHRSBjYWxsIHRvIHNhdmUgdGltZS4gIFRvIGFjdHVhbGx5IHNlbmQgYSB2YWx1ZSB0byB0aGUKKyAqIGRldmljZSwgcGVyZm9ybSBhIFNVU0FHRSBmaXJzdCwgZm9sbG93ZWQgYnkgYSBTUkVQT1JULiAgQW4gSU5JVFJFUE9SVCBvciBhCisgKiBHUkVQT1JUIGlzbid0IG5lY2Vzc2FyeSBmb3IgYSBHVVNBR0UgdG8gcmV0dXJuIHZhbGlkIGRhdGEuCisgKi8KKyNkZWZpbmUgSElEX1JFUE9SVF9JRF9VTktOT1dOIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSElEX1JFUE9SVF9JRF9GSVJTVCAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSElEX1JFUE9SVF9JRF9ORVhUICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSElEX1JFUE9SVF9JRF9NQVNLICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSElEX1JFUE9SVF9JRF9NQVggICAgIDB4MDAwMDAwZmYKKworI2RlZmluZSBISURfUkVQT1JUX1RZUEVfSU5QVVQJMQorI2RlZmluZSBISURfUkVQT1JUX1RZUEVfT1VUUFVUCTIKKyNkZWZpbmUgSElEX1JFUE9SVF9UWVBFX0ZFQVRVUkUJMworI2RlZmluZSBISURfUkVQT1JUX1RZUEVfTUlOICAgICAxCisjZGVmaW5lIEhJRF9SRVBPUlRfVFlQRV9NQVggICAgIDMKKworc3RydWN0IGhpZGRldl9maWVsZF9pbmZvIHsKKwlfX3UzMiByZXBvcnRfdHlwZTsKKwlfX3UzMiByZXBvcnRfaWQ7CisJX191MzIgZmllbGRfaW5kZXg7CisJX191MzIgbWF4dXNhZ2U7CisJX191MzIgZmxhZ3M7CisJX191MzIgcGh5c2ljYWw7CQkvKiBwaHlzaWNhbCB1c2FnZSBmb3IgdGhpcyBmaWVsZCAqLworCV9fdTMyIGxvZ2ljYWw7CQkvKiBsb2dpY2FsIHVzYWdlIGZvciB0aGlzIGZpZWxkICovCisJX191MzIgYXBwbGljYXRpb247CQkvKiBhcHBsaWNhdGlvbiB1c2FnZSBmb3IgdGhpcyBmaWVsZCAqLworCV9fczMyIGxvZ2ljYWxfbWluaW11bTsKKwlfX3MzMiBsb2dpY2FsX21heGltdW07CisJX19zMzIgcGh5c2ljYWxfbWluaW11bTsKKwlfX3MzMiBwaHlzaWNhbF9tYXhpbXVtOworCV9fdTMyIHVuaXRfZXhwb25lbnQ7CisJX191MzIgdW5pdDsKK307CisKKy8qIEZpbGwgaW4gcmVwb3J0X3R5cGUsIHJlcG9ydF9pZCBhbmQgZmllbGRfaW5kZXggdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBvbiBhCisgKiBmaWVsZC4KKyAqLworI2RlZmluZSBISURfRklFTERfQ09OU1RBTlQJCTB4MDAxCisjZGVmaW5lIEhJRF9GSUVMRF9WQVJJQUJMRQkJMHgwMDIKKyNkZWZpbmUgSElEX0ZJRUxEX1JFTEFUSVZFCQkweDAwNAorI2RlZmluZSBISURfRklFTERfV1JBUAkJCTB4MDA4CQorI2RlZmluZSBISURfRklFTERfTk9OTElORUFSCQkweDAxMAorI2RlZmluZSBISURfRklFTERfTk9fUFJFRkVSUkVECQkweDAyMAorI2RlZmluZSBISURfRklFTERfTlVMTF9TVEFURQkJMHgwNDAKKyNkZWZpbmUgSElEX0ZJRUxEX1ZPTEFUSUxFCQkweDA4MAorI2RlZmluZSBISURfRklFTERfQlVGRkVSRURfQllURQkJMHgxMDAKKworc3RydWN0IGhpZGRldl91c2FnZV9yZWYgeworCV9fdTMyIHJlcG9ydF90eXBlOworCV9fdTMyIHJlcG9ydF9pZDsKKwlfX3UzMiBmaWVsZF9pbmRleDsKKwlfX3UzMiB1c2FnZV9pbmRleDsKKwlfX3UzMiB1c2FnZV9jb2RlOworCV9fczMyIHZhbHVlOworfTsKKworLyogaGlkZGV2X3VzYWdlX3JlZl9tdWx0aSBpcyB1c2VkIGZvciBzZW5kaW5nIG11bHRpcGxlIGJ5dGVzIHRvIGEgY29udHJvbC4KKyAqIEl0IHJlYWxseSBtYW5pZmVzdHMgaXRzZWxmIGFzIHNldHRpbmcgdGhlIHZhbHVlIG9mIGNvbnNlY3V0aXZlIHVzYWdlcyAqLworI2RlZmluZSBISURfTUFYX01VTFRJX1VTQUdFUyAxMDI0CitzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZl9tdWx0aSB7CisJc3RydWN0IGhpZGRldl91c2FnZV9yZWYgdXJlZjsKKwlfX3UzMiBudW1fdmFsdWVzOworCV9fczMyIHZhbHVlc1tISURfTUFYX01VTFRJX1VTQUdFU107Cit9OworCisvKiBGSUVMRF9JTkRFWF9OT05FIGlzIHJldHVybmVkIGluIHJlYWQoKSBkYXRhIGZyb20gdGhlIGtlcm5lbCB3aGVuIGZsYWdzCisgKiBpcyBzZXQgdG8gKEhJRERFVl9GTEFHX1VSRUYgfCBISURERVZfRkxBR19SRVBPUlQpIGFuZCBhIG5ldyByZXBvcnQgaGFzCisgKiBiZWVuIHNlbnQgYnkgdGhlIGRldmljZSAKKyAqLworI2RlZmluZSBISURfRklFTERfSU5ERVhfTk9ORSAweGZmZmZmZmZmCisKKy8qCisgKiBQcm90b2NvbCB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgSElEX1ZFUlNJT04JCTB4MDEwMDA0CisKKy8qCisgKiBJT0NUTHMgKDB4MDAgLSAweDdmKQorICovCisKKyNkZWZpbmUgSElESU9DR1ZFUlNJT04JCV9JT1IoJ0gnLCAweDAxLCBpbnQpCisjZGVmaW5lIEhJRElPQ0FQUExJQ0FUSU9OCV9JTygnSCcsIDB4MDIpCisjZGVmaW5lIEhJRElPQ0dERVZJTkZPCQlfSU9SKCdIJywgMHgwMywgc3RydWN0IGhpZGRldl9kZXZpbmZvKQorI2RlZmluZSBISURJT0NHU1RSSU5HCQlfSU9SKCdIJywgMHgwNCwgc3RydWN0IGhpZGRldl9zdHJpbmdfZGVzY3JpcHRvcikKKyNkZWZpbmUgSElESU9DSU5JVFJFUE9SVAlfSU8oJ0gnLCAweDA1KQorI2RlZmluZSBISURJT0NHTkFNRShsZW4pCV9JT0MoX0lPQ19SRUFELCAnSCcsIDB4MDYsIGxlbikKKyNkZWZpbmUgSElESU9DR1JFUE9SVAkJX0lPVygnSCcsIDB4MDcsIHN0cnVjdCBoaWRkZXZfcmVwb3J0X2luZm8pCisjZGVmaW5lIEhJRElPQ1NSRVBPUlQJCV9JT1coJ0gnLCAweDA4LCBzdHJ1Y3QgaGlkZGV2X3JlcG9ydF9pbmZvKQorI2RlZmluZSBISURJT0NHUkVQT1JUSU5GTwlfSU9XUignSCcsIDB4MDksIHN0cnVjdCBoaWRkZXZfcmVwb3J0X2luZm8pCisjZGVmaW5lIEhJRElPQ0dGSUVMRElORk8JX0lPV1IoJ0gnLCAweDBBLCBzdHJ1Y3QgaGlkZGV2X2ZpZWxkX2luZm8pCisjZGVmaW5lIEhJRElPQ0dVU0FHRQkJX0lPV1IoJ0gnLCAweDBCLCBzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZikKKyNkZWZpbmUgSElESU9DU1VTQUdFCQlfSU9XKCdIJywgMHgwQywgc3RydWN0IGhpZGRldl91c2FnZV9yZWYpCisjZGVmaW5lIEhJRElPQ0dVQ09ERQkJX0lPV1IoJ0gnLCAweDBELCBzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZikKKyNkZWZpbmUgSElESU9DR0ZMQUcJCV9JT1IoJ0gnLCAweDBFLCBpbnQpCisjZGVmaW5lIEhJRElPQ1NGTEFHCQlfSU9XKCdIJywgMHgwRiwgaW50KQorI2RlZmluZSBISURJT0NHQ09MTEVDVElPTklOREVYCV9JT1coJ0gnLCAweDEwLCBzdHJ1Y3QgaGlkZGV2X3VzYWdlX3JlZikKKyNkZWZpbmUgSElESU9DR0NPTExFQ1RJT05JTkZPCV9JT1dSKCdIJywgMHgxMSwgc3RydWN0IGhpZGRldl9jb2xsZWN0aW9uX2luZm8pCisjZGVmaW5lIEhJRElPQ0dQSFlTKGxlbikJX0lPQyhfSU9DX1JFQUQsICdIJywgMHgxMiwgbGVuKQorCisvKiBGb3Igd3JpdGluZy9yZWFkaW5nIHRvIG11bHRpcGxlL2NvbnNlY3V0aXZlIHVzYWdlcyAqLworI2RlZmluZSBISURJT0NHVVNBR0VTCQlfSU9XUignSCcsIDB4MTMsIHN0cnVjdCBoaWRkZXZfdXNhZ2VfcmVmX211bHRpKQorI2RlZmluZSBISURJT0NTVVNBR0VTCQlfSU9XKCdIJywgMHgxNCwgc3RydWN0IGhpZGRldl91c2FnZV9yZWZfbXVsdGkpCisKKy8qIAorICogRmxhZ3MgdG8gYmUgdXNlZCBpbiBISURJT0NTRkxBRworICovCisjZGVmaW5lIEhJRERFVl9GTEFHX1VSRUYJMHgxCisjZGVmaW5lIEhJRERFVl9GTEFHX1JFUE9SVAkweDIKKyNkZWZpbmUgSElEREVWX0ZMQUdTCQkweDMKKworLyogVG8gdHJhdmVyc2UgdGhlIGlucHV0IHJlcG9ydCBkZXNjcmlwdG9yIGluZm8gZm9yIGEgSElEIGRldmljZSwgcGVyZm9ybSB0aGUgCisgKiBmb2xsb3dpbmc6CisgKgorICogIHJpbmZvLnJlcG9ydF90eXBlID0gSElEX1JFUE9SVF9UWVBFX0lOUFVUOworICogIHJpbmZvLnJlcG9ydF9pZCA9IEhJRF9SRVBPUlRfSURfRklSU1Q7CisgKiAgcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOworICoKKyAqICB3aGlsZSAocmV0ID49IDApIHsKKyAqICAgICAgZm9yIChpID0gMDsgaSA8IHJpbmZvLm51bV9maWVsZHM7IGkrKykgeyAKKyAqCSAgICBmaW5mby5yZXBvcnRfdHlwZSA9IHJpbmZvLnJlcG9ydF90eXBlOworICogICAgICAgICAgZmluZm8ucmVwb3J0X2lkID0gcmluZm8ucmVwb3J0X2lkOworICogICAgICAgICAgZmluZm8uZmllbGRfaW5kZXggPSBpOworICogICAgICAgICAgaW9jdGwoZmQsIEhJRElPQ0dGSUVMRElORk8sICZmaW5mbyk7CisgKiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmluZm8ubWF4dXNhZ2U7IGorKykgeworICogICAgICAgICAgICAgIHVyZWYuZmllbGRfaW5kZXggPSBpOworICoJCXVyZWYudXNhZ2VfaW5kZXggPSBqOworICoJCWlvY3RsKGZkLCBISURJT0NHVUNPREUsICZ1cmVmKTsKKyAqCQlpb2N0bChmZCwgSElESU9DR1VTQUdFLCAmdXJlZik7CisgKiAgICAgICAgICB9CisgKgl9CisgKglyaW5mby5yZXBvcnRfaWQgfD0gSElEX1JFUE9SVF9JRF9ORVhUOworICoJcmV0ID0gaW9jdGwoZmQsIEhJRElPQ0dSRVBPUlRJTkZPLCAmcmluZm8pOworICogIH0KKyAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ocGV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2hwZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQwNTFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ocGV0LmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZglfX0hQRVRfXworI2RlZmluZQlfX0hQRVRfXyAxCisKKworCitzdHJ1Y3QgaHBldF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGhpX2lyZXFmcmVxOwkvKiBIeiAqLworCXVuc2lnbmVkIGxvbmcgaGlfZmxhZ3M7CS8qIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgc2hvcnQgaGlfaHBldDsKKwl1bnNpZ25lZCBzaG9ydCBoaV90aW1lcjsKK307CisKKyNkZWZpbmUJSFBFVF9JTkZPX1BFUklPRElDCTB4MDAwMQkvKiB0aW1lciBpcyBwZXJpb2RpYyAqLworCisjZGVmaW5lCUhQRVRfSUVfT04JX0lPKCdoJywgMHgwMSkJLyogaW50ZXJydXB0IG9uICovCisjZGVmaW5lCUhQRVRfSUVfT0ZGCV9JTygnaCcsIDB4MDIpCS8qIGludGVycnVwdCBvZmYgKi8KKyNkZWZpbmUJSFBFVF9JTkZPCV9JT1IoJ2gnLCAweDAzLCBzdHJ1Y3QgaHBldF9pbmZvKQorI2RlZmluZQlIUEVUX0VQSQlfSU8oJ2gnLCAweDA0KQkvKiBlbmFibGUgcGVyaW9kaWMgKi8KKyNkZWZpbmUJSFBFVF9EUEkJX0lPKCdoJywgMHgwNSkJLyogZGlzYWJsZSBwZXJpb2RpYyAqLworI2RlZmluZQlIUEVUX0lSUUZSRVEJX0lPVygnaCcsIDB4NiwgdW5zaWduZWQgbG9uZykJLyogSVJRRlJFUSB1c2VjICovCisKKyNlbmRpZgkJCQkvKiAhX19IUEVUX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaHlzZG5faWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaHlzZG5faWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDIzNmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9oeXNkbl9pZi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qICRJZDogaHlzZG5faWYuaCx2IDEuMS44LjMgMjAwMS8wOS8yMyAyMjoyNTowNSBrYWkgRXhwICQKKyAqCisgKiBMaW51eCBkcml2ZXIgZm9yIEhZU0ROIGNhcmRzCisgKiBpb2N0bCBkZWZpbml0aW9ucyBzaGFyZWQgYnkgaHluZXRtZ3IgYW5kIGRyaXZlci4KKyAqCisgKiBBdXRob3IgICAgV2VybmVyIENvcm5lbGl1cyAod2VybmVyQHRpdHJvLmRlKSBmb3IgSHlwZXJjb3BlIEdtYkgKKyAqIENvcHlyaWdodCAxOTk5IGJ5IFdlcm5lciBDb3JuZWxpdXMgKHdlcm5lckB0aXRyby5kZSkKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKi8KKy8qIGVycm9yIHZhbHVlcyAqLworLyoqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVSUl9OT05FICAgICAgICAgICAgIDAgLyogbm8gZXJyb3Igb2NjdXJyZWQgKi8KKyNkZWZpbmUgRVJSX0FMUkVBRFlfQk9PVCAgMTAwMCAvKiB3ZSBhcmUgYWxyZWFkeSBib290aW5nICovCisjZGVmaW5lIEVQT0ZfQkFEX01BR0lDICAgIDEwMDEgLyogYmFkIG1hZ2ljIGluIFBPRiBoZWFkZXIgKi8KKyNkZWZpbmUgRVJSX0JPQVJEX0RQUkFNICAgMTAwMiAvKiBib2FyZCBEUFJBTSBmYWlsZWQgKi8KKyNkZWZpbmUgRVBPRl9JTlRFUk5BTCAgICAgMTAwMyAvKiBpbnRlcm5hbCBQT0YgaGFuZGxlciBlcnJvciAqLworI2RlZmluZSBFUE9GX0JBRF9JTUdfU0laRSAxMDA0IC8qIFBPRiBib290IGltYWdlIHNpemUgaW52YWxpZCAqLworI2RlZmluZSBFUlJfQk9PVElNR19GQUlMICAxMDA1IC8qIDEuIHN0YWdlIGJvb3QgaW1hZ2UgZGlkIG5vdCBzdGFydCAqLworI2RlZmluZSBFUlJfQk9PVFNFUV9GQUlMICAxMDA2IC8qIDIuIHN0YWdlIGJvb3Qgc2VxIGhhbmRzaGFrZSB0aW1lb3V0ICovCisjZGVmaW5lIEVSUl9QT0ZfVElNRU9VVCAgIDEwMDcgLyogdGltZW91dCB3YWl0aW5nIGZvciBjYXJkIHBvZiByZWFkeSAqLworI2RlZmluZSBFUlJfTk9UX0JPT1RFRCAgICAxMDA4IC8qIG9wZXJhdGlvbiBvbmx5IGFsbG93ZWQgd2hlbiBib290ZWQgKi8KKyNkZWZpbmUgRVJSX0NPTkZfTE9ORyAgICAgMTAwOSAvKiBjb25mIGxpbmUgaXMgdG9vIGxvbmcgKi8gCisjZGVmaW5lIEVSUl9JTlZfQ0hBTiAgICAgIDEwMTAgLyogaW52YWxpZCBjaGFubmVsIG51bWJlciAqLyAKKyNkZWZpbmUgRVJSX0FTWU5DX1RJTUUgICAgMTAxMSAvKiB0aW1lb3V0IHNlbmRpbmcgYXN5bmMgZGF0YSAqLyAKKworCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMtZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ExZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMtZGV2LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAgICBpMmMtZGV2LmggLSBpMmMtYnVzIGRyaXZlciwgY2hhciBkZXZpY2UgaW50ZXJmYWNlCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTUtOTcgU2ltb24gRy4gVm9nbAorICAgIENvcHlyaWdodCAoQykgMTk5OC05OSBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpZm5kZWYgX0xJTlVYX0kyQ19ERVZfSAorI2RlZmluZSBfTElOVVhfSTJDX0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAvZGV2L2kyYy1YIGlvY3RsIGNvbW1hbmRzLiAgVGhlIGlvY3RsJ3MgcGFyYW1ldGVyIGlzIGFsd2F5cyBhbgorICogdW5zaWduZWQgbG9uZywgZXhjZXB0IGZvcjoKKyAqCS0gSTJDX0ZVTkNTLCB0YWtlcyBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGxvbmcKKyAqCS0gSTJDX1JEV1IsIHRha2VzIHBvaW50ZXIgdG8gc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEKKyAqCS0gSTJDX1NNQlVTLCB0YWtlcyBwb2ludGVyIHRvIHN0cnVjdCBpMmNfc21idXNfaW9jdGxfZGF0YQorICovCisjZGVmaW5lIEkyQ19SRVRSSUVTCTB4MDcwMQkvKiBudW1iZXIgb2YgdGltZXMgYSBkZXZpY2UgYWRkcmVzcyBzaG91bGQKKwkJCQkgICBiZSBwb2xsZWQgd2hlbiBub3QgYWNrbm93bGVkZ2luZyAqLworI2RlZmluZSBJMkNfVElNRU9VVAkweDA3MDIJLyogc2V0IHRpbWVvdXQgaW4gamlmZmllcyAtIGNhbGwgd2l0aCBpbnQgKi8KKworLyogTk9URTogU2xhdmUgYWRkcmVzcyBpcyA3IG9yIDEwIGJpdHMsIGJ1dCAxMC1iaXQgYWRkcmVzc2VzCisgKiBhcmUgTk9UIHN1cHBvcnRlZCEgKGR1ZSB0byBjb2RlIGJyb2tlbm5lc3MpCisgKi8KKyNkZWZpbmUgSTJDX1NMQVZFCTB4MDcwMwkvKiBVc2UgdGhpcyBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19TTEFWRV9GT1JDRQkweDA3MDYJLyogVXNlIHRoaXMgc2xhdmUgYWRkcmVzcywgZXZlbiBpZiBpdAorCQkJCSAgIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGEgZHJpdmVyISAqLworI2RlZmluZSBJMkNfVEVOQklUCTB4MDcwNAkvKiAwIGZvciA3IGJpdCBhZGRycywgIT0gMCBmb3IgMTAgYml0ICovCisKKyNkZWZpbmUgSTJDX0ZVTkNTCTB4MDcwNQkvKiBHZXQgdGhlIGFkYXB0ZXIgZnVuY3Rpb25hbGl0eSBtYXNrICovCisKKyNkZWZpbmUgSTJDX1JEV1IJMHgwNzA3CS8qIENvbWJpbmVkIFIvVyB0cmFuc2ZlciAob25lIFNUT1Agb25seSkgKi8KKworI2RlZmluZSBJMkNfUEVDCQkweDA3MDgJLyogIT0gMCB0byB1c2UgUEVDIHdpdGggU01CdXMgKi8KKyNkZWZpbmUgSTJDX1NNQlVTCTB4MDcyMAkvKiBTTUJ1cyB0cmFuc2ZlciAqLworCisKKy8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBhcyB1c2VkIGluIHRoZSBJMkNfU01CVVMgaW9jdGwgY2FsbCAqLworc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhIHsKKwlfX3U4IHJlYWRfd3JpdGU7CisJX191OCBjb21tYW5kOworCV9fdTMyIHNpemU7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGE7Cit9OworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgYXMgdXNlZCBpbiB0aGUgSTJDX1JEV1IgaW9jdGwgY2FsbCAqLworc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgeworCXN0cnVjdCBpMmNfbXNnICptc2dzOwkvKiBwb2ludGVycyB0byBpMmNfbXNncyAqLworCV9fdTMyIG5tc2dzOwkJCS8qIG51bWJlciBvZiBpMmNfbXNncyAqLworfTsKKworI2RlZmluZSAgSTJDX1JEUldfSU9DVExfTUFYX01TR1MJNDIKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgSTJDX01BSk9SCTg5CQkvKiBEZXZpY2UgbWFqb3IgbnVtYmVyCQkqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfSTJDX0RFVl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk3ZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMCwwICsxLDE1MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoJCQkJCQkJCQkgICAgICovCisvKiBpMmMuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgaTJjLWJ1cyBpbnRlcmZhY2UJCQkgICAgICovCisvKgkJCQkJCQkJCSAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3nDtnN0aSBNw6Rsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4gYW5kCisgICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+ICovCisKKyNpZm5kZWYgX0xJTlVYX0kyQ19ICisjZGVmaW5lIF9MSU5VWF9JMkNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBzdHJ1Y3QgaTJjX21zZyAtIGFuIEkyQyB0cmFuc2FjdGlvbiBzZWdtZW50IGJlZ2lubmluZyB3aXRoIFNUQVJUCisgKiBAYWRkcjogU2xhdmUgYWRkcmVzcywgZWl0aGVyIHNldmVuIG9yIHRlbiBiaXRzLiAgV2hlbiB0aGlzIGlzIGEgdGVuCisgKgliaXQgYWRkcmVzcywgSTJDX01fVEVOIG11c3QgYmUgc2V0IGluIEBmbGFncyBhbmQgdGhlIGFkYXB0ZXIKKyAqCW11c3Qgc3VwcG9ydCBJMkNfRlVOQ18xMEJJVF9BRERSLgorICogQGZsYWdzOiBJMkNfTV9SRCBpcyBoYW5kbGVkIGJ5IGFsbCBhZGFwdGVycy4gIE5vIG90aGVyIGZsYWdzIG1heSBiZQorICoJcHJvdmlkZWQgdW5sZXNzIHRoZSBhZGFwdGVyIGV4cG9ydGVkIHRoZSByZWxldmFudCBJMkNfRlVOQ18qCisgKglmbGFncyB0aHJvdWdoIGkyY19jaGVja19mdW5jdGlvbmFsaXR5KCkuCisgKiBAbGVuOiBOdW1iZXIgb2YgZGF0YSBieXRlcyBpbiBAYnVmIGJlaW5nIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHRoZQorICoJSTJDIHNsYXZlIGFkZHJlc3MuICBGb3IgcmVhZCB0cmFuc2FjdGlvbnMgd2hlcmUgSTJDX01fUkVDVl9MRU4KKyAqCWlzIHNldCwgdGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhpcyBidWZmZXIgY2FuIGhvbGQgdXAgdG8KKyAqCTMyIGJ5dGVzIGluIGFkZGl0aW9uIHRvIHRoZSBpbml0aWFsIGxlbmd0aCBieXRlIHNlbnQgYnkgdGhlCisgKglzbGF2ZSAocGx1cywgaWYgdXNlZCwgdGhlIFNNQnVzIFBFQyk7IGFuZCB0aGlzIHZhbHVlIHdpbGwgYmUKKyAqCWluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYmxvY2sgZGF0YSBieXRlcyByZWNlaXZlZC4KKyAqIEBidWY6IFRoZSBidWZmZXIgaW50byB3aGljaCBkYXRhIGlzIHJlYWQsIG9yIGZyb20gd2hpY2ggaXQncyB3cml0dGVuLgorICoKKyAqIEFuIGkyY19tc2cgaXMgdGhlIGxvdyBsZXZlbCByZXByZXNlbnRhdGlvbiBvZiBvbmUgc2VnbWVudCBvZiBhbiBJMkMKKyAqIHRyYW5zYWN0aW9uLiAgSXQgaXMgdmlzaWJsZSB0byBkcml2ZXJzIGluIHRoZSBAaTJjX3RyYW5zZmVyKCkgcHJvY2VkdXJlLAorICogdG8gdXNlcnNwYWNlIGZyb20gaTJjLWRldiwgYW5kIHRvIEkyQyBhZGFwdGVyIGRyaXZlcnMgdGhyb3VnaCB0aGUKKyAqIEBpMmNfYWRhcHRlci5AbWFzdGVyX3hmZXIoKSBtZXRob2QuCisgKgorICogRXhjZXB0IHdoZW4gSTJDICJwcm90b2NvbCBtYW5nbGluZyIgaXMgdXNlZCwgYWxsIEkyQyBhZGFwdGVycyBpbXBsZW1lbnQKKyAqIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgSTJDIHRyYW5zYWN0aW9ucy4gIEVhY2ggdHJhbnNhY3Rpb24gYmVnaW5zIHdpdGggYQorICogU1RBUlQuICBUaGF0IGlzIGZvbGxvd2VkIGJ5IHRoZSBzbGF2ZSBhZGRyZXNzLCBhbmQgYSBiaXQgZW5jb2RpbmcgcmVhZAorICogdmVyc3VzIHdyaXRlLiAgVGhlbiBmb2xsb3cgYWxsIHRoZSBkYXRhIGJ5dGVzLCBwb3NzaWJseSBpbmNsdWRpbmcgYSBieXRlCisgKiB3aXRoIFNNQnVzIFBFQy4gIFRoZSB0cmFuc2ZlciB0ZXJtaW5hdGVzIHdpdGggYSBOQUssIG9yIHdoZW4gYWxsIHRob3NlCisgKiBieXRlcyBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgYW5kIEFDS2VkLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCBtZXNzYWdlIGluIGEKKyAqIGdyb3VwLCBpdCBpcyBmb2xsb3dlZCBieSBhIFNUT1AuICBPdGhlcndpc2UgaXQgaXMgZm9sbG93ZWQgYnkgdGhlIG5leHQKKyAqIEBpMmNfbXNnIHRyYW5zYWN0aW9uIHNlZ21lbnQsIGJlZ2lubmluZyB3aXRoIGEgKHJlcGVhdGVkKSBTVEFSVC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB3aGVuIHRoZSBhZGFwdGVyIHN1cHBvcnRzIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HIHRoZW4KKyAqIHBhc3NpbmcgY2VydGFpbiBAZmxhZ3MgbWF5IGhhdmUgY2hhbmdlZCB0aG9zZSBzdGFuZGFyZCBwcm90b2NvbCBiZWhhdmlvcnMuCisgKiBUaG9zZSBmbGFncyBhcmUgb25seSBmb3IgdXNlIHdpdGggYnJva2VuL25vbmNvbmZvcm1pbmcgc2xhdmVzLCBhbmQgd2l0aAorICogYWRhcHRlcnMgd2hpY2ggYXJlIGtub3duIHRvIHN1cHBvcnQgdGhlIHNwZWNpZmljIG1hbmdsaW5nIG9wdGlvbnMgdGhleQorICogbmVlZCAob25lIG9yIG1vcmUgb2YgSUdOT1JFX05BSywgTk9fUkRfQUNLLCBOT1NUQVJULCBhbmQgUkVWX0RJUl9BRERSKS4KKyAqLworc3RydWN0IGkyY19tc2cgeworCV9fdTE2IGFkZHI7CS8qIHNsYXZlIGFkZHJlc3MJCQkqLworCV9fdTE2IGZsYWdzOworI2RlZmluZSBJMkNfTV9URU4JCTB4MDAxMAkvKiB0aGlzIGlzIGEgdGVuIGJpdCBjaGlwIGFkZHJlc3MgKi8KKyNkZWZpbmUgSTJDX01fUkQJCTB4MDAwMQkvKiByZWFkIGRhdGEsIGZyb20gc2xhdmUgdG8gbWFzdGVyICovCisjZGVmaW5lIEkyQ19NX05PU1RBUlQJCTB4NDAwMAkvKiBpZiBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORyAqLworI2RlZmluZSBJMkNfTV9SRVZfRElSX0FERFIJMHgyMDAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX0lHTk9SRV9OQUsJMHgxMDAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX05PX1JEX0FDSwkJMHgwODAwCS8qIGlmIEkyQ19GVU5DX1BST1RPQ09MX01BTkdMSU5HICovCisjZGVmaW5lIEkyQ19NX1JFQ1ZfTEVOCQkweDA0MDAJLyogbGVuZ3RoIHdpbGwgYmUgZmlyc3QgcmVjZWl2ZWQgYnl0ZSAqLworCV9fdTE2IGxlbjsJCS8qIG1zZyBsZW5ndGgJCQkJKi8KKwlfX3U4ICpidWY7CQkvKiBwb2ludGVyIHRvIG1zZyBkYXRhCQkJKi8KK307CisKKy8qIFRvIGRldGVybWluZSB3aGF0IGZ1bmN0aW9uYWxpdHkgaXMgcHJlc2VudCAqLworCisjZGVmaW5lIEkyQ19GVU5DX0kyQwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTJDX0ZVTkNfMTBCSVRfQUREUgkJMHgwMDAwMDAwMgorI2RlZmluZSBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORwkweDAwMDAwMDA0IC8qIEkyQ19NX3tSRVZfRElSX0FERFIsTk9TVEFSVCwuLn0gKi8KKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUEVDCQkweDAwMDAwMDA4CisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JMT0NLX1BST0NfQ0FMTAkweDAwMDA4MDAwIC8qIFNNQnVzIDIuMCAqLworI2RlZmluZSBJMkNfRlVOQ19TTUJVU19RVUlDSwkJMHgwMDAxMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUJMHgwMDAyMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFCTB4MDAwNDAwMDAKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEJMHgwMDA4MDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEJMHgwMDEwMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQQkweDAwMjAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX1dPUkRfREFUQQkweDAwNDAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTAkweDAwODAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQQkweDAxMDAwMDAwCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEEgMHgwMjAwMDAwMAorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19SRUFEX0kyQ19CTE9DSwkweDA0MDAwMDAwIC8qIEkyQy1saWtlIGJsb2NrIHhmZXIgICovCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DSwkweDA4MDAwMDAwIC8qIHcvIDEtYnl0ZSByZWcuIGFkZHIuICovCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1JFQURfSTJDX0JMT0NLXzIJIDB4MTAwMDAwMDAgLyogSTJDLWxpa2UgYmxvY2sgeGZlciAgKi8KKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLXzIgMHgyMDAwMDAwMCAvKiB3LyAyLWJ5dGUgcmVnLiBhZGRyLiAqLworCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0JZVEUgKEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkKKyNkZWZpbmUgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIChJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSAoSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfV09SRF9EQVRBKQorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBIChJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JMT0NLX0RBVEEpCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSyAoSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLKQorI2RlZmluZSBJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0tfMiAoSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0tfMiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0kyQ19CTE9DS18yKQorCisjZGVmaW5lIEkyQ19GVU5DX1NNQlVTX0VNVUwgKEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfUFJPQ19DQUxMIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBIHwgXAorCQkJICAgICBJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0sgfCBcCisJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1BFQykKKworLyoKKyAqIERhdGEgZm9yIFNNQnVzIE1lc3NhZ2VzCisgKi8KKyNkZWZpbmUgSTJDX1NNQlVTX0JMT0NLX01BWAkzMgkvKiBBcyBzcGVjaWZpZWQgaW4gU01CdXMgc3RhbmRhcmQgKi8KK3VuaW9uIGkyY19zbWJ1c19kYXRhIHsKKwlfX3U4IGJ5dGU7CisJX191MTYgd29yZDsKKwlfX3U4IGJsb2NrW0kyQ19TTUJVU19CTE9DS19NQVggKyAyXTsgLyogYmxvY2tbMF0gaXMgdXNlZCBmb3IgbGVuZ3RoICovCisJICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgb25lIG1vcmUgZm9yIHVzZXItc3BhY2UgY29tcGF0aWJpbGl0eSAqLworfTsKKworLyogc21idXNfYWNjZXNzIHJlYWQgb3Igd3JpdGUgbWFya2VycyAqLworI2RlZmluZSBJMkNfU01CVVNfUkVBRAkxCisjZGVmaW5lIEkyQ19TTUJVU19XUklURQkwCisKKy8qIFNNQnVzIHRyYW5zYWN0aW9uIHR5cGVzIChzaXplIHBhcmFtZXRlciBpbiB0aGUgYWJvdmUgZnVuY3Rpb25zKQorICAgTm90ZTogdGhlc2Ugbm8gbG9uZ2VyIGNvcnJlc3BvbmQgdG8gdGhlIChhcmJpdHJhcnkpIFBJSVg0IGludGVybmFsIGNvZGVzISAqLworI2RlZmluZSBJMkNfU01CVVNfUVVJQ0sJCSAgICAwCisjZGVmaW5lIEkyQ19TTUJVU19CWVRFCQkgICAgMQorI2RlZmluZSBJMkNfU01CVVNfQllURV9EQVRBCSAgICAyCisjZGVmaW5lIEkyQ19TTUJVU19XT1JEX0RBVEEJICAgIDMKKyNkZWZpbmUgSTJDX1NNQlVTX1BST0NfQ0FMTAkgICAgNAorI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfREFUQQkgICAgNQorI2RlZmluZSBJMkNfU01CVVNfSTJDX0JMT0NLX0JST0tFTiAgNgorI2RlZmluZSBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMICAgNwkJLyogU01CdXMgMi4wICovCisjZGVmaW5lIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSAgICA4CisKKworI2VuZGlmIC8qIF9MSU5VWF9JMkNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMm8tZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2kyby1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU4MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pMm8tZGV2LmgKQEAgLTAsMCArMSw0MjEgQEAKKy8qCisgKiBJMk8gdXNlciBzcGFjZSBhY2Nlc3NpYmxlIHN0cnVjdHVyZXMvQVBJcworICoKKyAqIChjKSBDb3B5cmlnaHQgMTk5OSwgMjAwMCBSZWQgSGF0IFNvZnR3YXJlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgSTJPIEFQSXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIGJvdGgKKyAqIHRoZSBrZXJuZWwgYW5kIHVzZXIgbGV2ZWwgYXBwbGljYXRpb25zLiAgS2VybmVsIHNwZWNpZmljIHN0cnVjdHVyZXMKKyAqIGFyZSBkZWZpbmVkIGluIGkyb19vc20uIE9TTXMgc2hvdWxkIGluY2x1ZGUgX29ubHlfIGkyb19vc20uaCB3aGljaAorICogYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGlzIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX0kyT19ERVZfSAorI2RlZmluZSBfSTJPX0RFVl9ICisKKy8qIEhvdyBtYW55IGNvbnRyb2xsZXJzIGFyZSB3ZSBhbGxvd2luZyAqLworI2RlZmluZSBNQVhfSTJPX0NPTlRST0xMRVJTCTMyCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBJMk8gQ29udHJvbCBJT0NUTHMgYW5kIHN0cnVjdHVyZXMKKyAqLworI2RlZmluZSBJMk9fTUFHSUNfTlVNQkVSCSdpJworI2RlZmluZSBJMk9HRVRJT1BTCQlfSU9SKEkyT19NQUdJQ19OVU1CRVIsMCxfX3U4W01BWF9JMk9fQ09OVFJPTExFUlNdKQorI2RlZmluZSBJMk9IUlRHRVQJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsMSxzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpCisjZGVmaW5lIEkyT0xDVEdFVAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiwyLHN0cnVjdCBpMm9fY21kX2hydGxjdCkKKyNkZWZpbmUgSTJPUEFSTVNFVAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiwzLHN0cnVjdCBpMm9fY21kX3BzZXRnZXQpCisjZGVmaW5lIEkyT1BBUk1HRVQJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsNCxzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0KQorI2RlZmluZSBJMk9TV0RMIAkJX0lPV1IoSTJPX01BR0lDX05VTUJFUiw1LHN0cnVjdCBpMm9fc3dfeGZlcikKKyNkZWZpbmUgSTJPU1dVTCAJCV9JT1dSKEkyT19NQUdJQ19OVU1CRVIsNixzdHJ1Y3QgaTJvX3N3X3hmZXIpCisjZGVmaW5lIEkyT1NXREVMCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDcsc3RydWN0IGkyb19zd194ZmVyKQorI2RlZmluZSBJMk9WQUxJREFURQkJX0lPUihJMk9fTUFHSUNfTlVNQkVSLDgsX191MzIpCisjZGVmaW5lIEkyT0hUTUwgCQlfSU9XUihJMk9fTUFHSUNfTlVNQkVSLDksc3RydWN0IGkyb19odG1sKQorI2RlZmluZSBJMk9FVlRSRUcJCV9JT1coSTJPX01BR0lDX05VTUJFUiwxMCxzdHJ1Y3QgaTJvX2V2dF9pZCkKKyNkZWZpbmUgSTJPRVZUR0VUCQlfSU9SKEkyT19NQUdJQ19OVU1CRVIsMTEsc3RydWN0IGkyb19ldnRfaW5mbykKKyNkZWZpbmUgSTJPUEFTU1RIUlUJCV9JT1IoSTJPX01BR0lDX05VTUJFUiwxMixzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSkKKyNkZWZpbmUgSTJPUEFTU1RIUlUzMgkJX0lPUihJMk9fTUFHSUNfTlVNQkVSLDEyLHN0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1MzIpCisKK3N0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1MzIgeworCXVuc2lnbmVkIGludCBpb3A7CS8qIElPUCB1bml0IG51bWJlciAqLworCV9fdTMyIG1zZzsJCS8qIG1lc3NhZ2UgKi8KK307CisKK3N0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1IHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl2b2lkICptc2c7CS8qIG1lc3NhZ2UgKi8KK307CisKK3N0cnVjdCBpMm9fY21kX2hydGxjdCB7CisJdW5zaWduZWQgaW50IGlvcDsJLyogSU9QIHVuaXQgbnVtYmVyICovCisJdm9pZCAqcmVzYnVmOwkvKiBCdWZmZXIgZm9yIHJlc3VsdCAqLworCXVuc2lnbmVkIGludCAqcmVzbGVuOwkvKiBCdWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgdGlkOwkvKiBUYXJnZXQgZGV2aWNlIFRJRCAqLworCXZvaWQgKm9wYnVmOwkvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgb3BsZW47CS8qIE9wZXJhdGlvbiBMaXN0IGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKwl2b2lkICpyZXNidWY7CS8qIFJlc3VsdCBMaXN0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCAqcmVzbGVuOwkvKiBSZXN1bHQgTGlzdCBidWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgaTJvX3N3X3hmZXIgeworCXVuc2lnbmVkIGludCBpb3A7CS8qIElPUCB1bml0IG51bWJlciAqLworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CS8qIEZsYWdzIGZpZWxkICovCisJdW5zaWduZWQgY2hhciBzd190eXBlOwkvKiBTb2Z0d2FyZSB0eXBlICovCisJdW5zaWduZWQgaW50IHN3X2lkOwkvKiBTb2Z0d2FyZSBJRCAqLworCXZvaWQgKmJ1ZjsJLyogUG9pbnRlciB0byBzb2Z0d2FyZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgKnN3bGVuOwkvKiBMZW5ndGggb2Ygc29mdHdhcmUgZGF0YSAqLworCXVuc2lnbmVkIGludCAqbWF4ZnJhZzsJLyogTWF4aW11bSBmcmFnbWVudCBjb3VudCAqLworCXVuc2lnbmVkIGludCAqY3VyZnJhZzsJLyogQ3VycmVudCBmcmFnbWVudCBjb3VudCAqLworfTsKKworc3RydWN0IGkyb19odG1sIHsKKwl1bnNpZ25lZCBpbnQgaW9wOwkvKiBJT1AgdW5pdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgdGlkOwkvKiBUYXJnZXQgZGV2aWNlIElEICovCisJdW5zaWduZWQgaW50IHBhZ2U7CS8qIEhUTUwgcGFnZSAqLworCXZvaWQgKnJlc2J1ZjsJLyogQnVmZmVyIGZvciByZXBseSBIVE1MIHBhZ2UgKi8KKwl1bnNpZ25lZCBpbnQgKnJlc2xlbjsJLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHJlcGx5IGJ1ZmZlciAqLworCXZvaWQgKnFidWY7CS8qIFBvaW50ZXIgdG8gSFRUUCBxdWVyeSBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgcWxlbjsJLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHF1ZXJ5IHN0cmluZyBidWZmZXIgKi8KK307CisKKyNkZWZpbmUgSTJPX0VWVF9RX0xFTiAzMgorCitzdHJ1Y3QgaTJvX2V2dF9pZCB7CisJdW5zaWduZWQgaW50IGlvcDsKKwl1bnNpZ25lZCBpbnQgdGlkOworCXVuc2lnbmVkIGludCBldnRfbWFzazsKK307CisKKy8qIEV2ZW50IGRhdGEgc2l6ZSA9IGZyYW1lIHNpemUgLSBtZXNzYWdlIGhlYWRlciArIGV2dCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgSTJPX0VWVF9EQVRBX1NJWkUgODgKKworc3RydWN0IGkyb19ldnRfaW5mbyB7CisJc3RydWN0IGkyb19ldnRfaWQgaWQ7CisJdW5zaWduZWQgY2hhciBldnRfZGF0YVtJMk9fRVZUX0RBVEFfU0laRV07CisJdW5zaWduZWQgaW50IGRhdGFfc2l6ZTsKK307CisKK3N0cnVjdCBpMm9fZXZ0X2dldCB7CisJc3RydWN0IGkyb19ldnRfaW5mbyBpbmZvOworCWludCBwZW5kaW5nOworCWludCBsb3N0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaTJvX3NnX2lvX2hkciB7CisJdW5zaWduZWQgaW50IGZsYWdzOwkvKiBzZWUgSTJPX0RQVF9TR19JT19GTEFHUyAqLworfSBpMm9fc2dfaW9faGRyX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSFJUIHJlbGF0ZWQgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEkyT19CVVNfTE9DQUwJMAorI2RlZmluZSBJMk9fQlVTX0lTQQkxCisjZGVmaW5lIEkyT19CVVNfRUlTQQkyCisjZGVmaW5lIEkyT19CVVNfTUNBCTMKKyNkZWZpbmUgSTJPX0JVU19QQ0kJNAorI2RlZmluZSBJMk9fQlVTX1BDTUNJQQk1CisjZGVmaW5lIEkyT19CVVNfTlVCVVMJNgorI2RlZmluZSBJMk9fQlVTX0NBUkRCVVMgNworI2RlZmluZSBJMk9fQlVTX1VOS05PV04gMHg4MAorCit0eXBlZGVmIHN0cnVjdCBfaTJvX3BjaV9idXMgeworCV9fdTggUGNpRnVuY3Rpb25OdW1iZXI7CisJX191OCBQY2lEZXZpY2VOdW1iZXI7CisJX191OCBQY2lCdXNOdW1iZXI7CisJX191OCByZXNlcnZlZDsKKwlfX3UxNiBQY2lWZW5kb3JJRDsKKwlfX3UxNiBQY2lEZXZpY2VJRDsKK30gaTJvX3BjaV9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9fbG9jYWxfYnVzIHsKKwlfX3UxNiBMYkJhc2VJT1BvcnQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191MzIgTGJCYXNlTWVtb3J5QWRkcmVzczsKK30gaTJvX2xvY2FsX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19pc2FfYnVzIHsKKwlfX3UxNiBJc2FCYXNlSU9Qb3J0OworCV9fdTggQ1NOOworCV9fdTggcmVzZXJ2ZWQ7CisJX191MzIgSXNhQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19pc2FfYnVzOworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2Vpc2FfYnVzX2luZm8geworCV9fdTE2IEVpc2FCYXNlSU9Qb3J0OworCV9fdTggcmVzZXJ2ZWQ7CisJX191OCBFaXNhU2xvdE51bWJlcjsKKwlfX3UzMiBFaXNhQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19laXNhX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19tY2FfYnVzIHsKKwlfX3UxNiBNY2FCYXNlSU9Qb3J0OworCV9fdTggcmVzZXJ2ZWQ7CisJX191OCBNY2FTbG90TnVtYmVyOworCV9fdTMyIE1jYUJhc2VNZW1vcnlBZGRyZXNzOworfSBpMm9fbWNhX2J1czsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19vdGhlcl9idXMgeworCV9fdTE2IEJhc2VJT1BvcnQ7CisJX191MTYgcmVzZXJ2ZWQ7CisJX191MzIgQmFzZU1lbW9yeUFkZHJlc3M7Cit9IGkyb19vdGhlcl9idXM7CisKK3R5cGVkZWYgc3RydWN0IF9pMm9faHJ0X2VudHJ5IHsKKwlfX3UzMiBhZGFwdGVyX2lkOworCV9fdTMyIHBhcmVudF90aWQ6MTI7CisJX191MzIgc3RhdGU6NDsKKwlfX3UzMiBidXNfbnVtOjg7CisJX191MzIgYnVzX3R5cGU6ODsKKwl1bmlvbiB7CisJCWkyb19wY2lfYnVzIHBjaV9idXM7CisJCWkyb19sb2NhbF9idXMgbG9jYWxfYnVzOworCQlpMm9faXNhX2J1cyBpc2FfYnVzOworCQlpMm9fZWlzYV9idXMgZWlzYV9idXM7CisJCWkyb19tY2FfYnVzIG1jYV9idXM7CisJCWkyb19vdGhlcl9idXMgb3RoZXJfYnVzOworCX0gYnVzOworfSBpMm9faHJ0X2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2hydCB7CisJX191MTYgbnVtX2VudHJpZXM7CisJX191OCBlbnRyeV9sZW47CisJX191OCBocnRfdmVyc2lvbjsKKwlfX3UzMiBjaGFuZ2VfaW5kOworCWkyb19ocnRfZW50cnkgaHJ0X2VudHJ5WzFdOworfSBpMm9faHJ0OworCit0eXBlZGVmIHN0cnVjdCBfaTJvX2xjdF9lbnRyeSB7CisJX191MzIgZW50cnlfc2l6ZToxNjsKKwlfX3UzMiB0aWQ6MTI7CisJX191MzIgcmVzZXJ2ZWQ6NDsKKwlfX3UzMiBjaGFuZ2VfaW5kOworCV9fdTMyIGRldmljZV9mbGFnczsKKwlfX3UzMiBjbGFzc19pZDoxMjsKKwlfX3UzMiB2ZXJzaW9uOjQ7CisJX191MzIgdmVuZG9yX2lkOjE2OworCV9fdTMyIHN1Yl9jbGFzczsKKwlfX3UzMiB1c2VyX3RpZDoxMjsKKwlfX3UzMiBwYXJlbnRfdGlkOjEyOworCV9fdTMyIGJpb3NfaW5mbzo4OworCV9fdTggaWRlbnRpdHlfdGFnWzhdOworCV9fdTMyIGV2ZW50X2NhcGFiaWxpdGllczsKK30gaTJvX2xjdF9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgX2kyb19sY3QgeworCV9fdTMyIHRhYmxlX3NpemU6MTY7CisJX191MzIgYm9vdF90aWQ6MTI7CisJX191MzIgbGN0X3Zlcjo0OworCV9fdTMyIGlvcF9mbGFnczsKKwlfX3UzMiBjaGFuZ2VfaW5kOworCWkyb19sY3RfZW50cnkgbGN0X2VudHJ5WzFdOworfSBpMm9fbGN0OworCit0eXBlZGVmIHN0cnVjdCBfaTJvX3N0YXR1c19ibG9jayB7CisJX191MTYgb3JnX2lkOworCV9fdTE2IHJlc2VydmVkOworCV9fdTE2IGlvcF9pZDoxMjsKKwlfX3UxNiByZXNlcnZlZDE6NDsKKwlfX3UxNiBob3N0X3VuaXRfaWQ7CisJX191MTYgc2VnbWVudF9udW1iZXI6MTI7CisJX191MTYgaTJvX3ZlcnNpb246NDsKKwlfX3U4IGlvcF9zdGF0ZTsKKwlfX3U4IG1zZ190eXBlOworCV9fdTE2IGluYm91bmRfZnJhbWVfc2l6ZTsKKwlfX3U4IGluaXRfY29kZTsKKwlfX3U4IHJlc2VydmVkMjsKKwlfX3UzMiBtYXhfaW5ib3VuZF9mcmFtZXM7CisJX191MzIgY3VyX2luYm91bmRfZnJhbWVzOworCV9fdTMyIG1heF9vdXRib3VuZF9mcmFtZXM7CisJY2hhciBwcm9kdWN0X2lkWzI0XTsKKwlfX3UzMiBleHBlY3RlZF9sY3Rfc2l6ZTsKKwlfX3UzMiBpb3BfY2FwYWJpbGl0aWVzOworCV9fdTMyIGRlc2lyZWRfbWVtX3NpemU7CisJX191MzIgY3VycmVudF9tZW1fc2l6ZTsKKwlfX3UzMiBjdXJyZW50X21lbV9iYXNlOworCV9fdTMyIGRlc2lyZWRfaW9fc2l6ZTsKKwlfX3UzMiBjdXJyZW50X2lvX3NpemU7CisJX191MzIgY3VycmVudF9pb19iYXNlOworCV9fdTMyIHJlc2VydmVkMzoyNDsKKwlfX3UzMiBjbWRfc3RhdHVzOjg7Cit9IGkyb19zdGF0dXNfYmxvY2s7CisKKy8qIEV2ZW50IGluZGljYXRvciBtYXNrIGZsYWdzICovCisjZGVmaW5lIEkyT19FVlRfSU5EX1NUQVRFX0NIQU5HRQkJMHg4MDAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9HRU5FUkFMX1dBUk5JTkcJCTB4NDAwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfQ09ORklHVVJBVElPTl9GTEFHCQkweDIwMDAwMDAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0xPQ0tfUkVMRUFTRQkJMHgxMDAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9DQVBBQklMSVRZX0NIQU5HRQkJMHgwODAwMDAwMAorI2RlZmluZSBJMk9fRVZUX0lORF9ERVZJQ0VfUkVTRVQJCTB4MDQwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVZUX01BU0tfTU9ESUZJRUQJCTB4MDIwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRklFTERfTU9ESUZJRUQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfVkVORE9SX0VWVAkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfREVWSUNFX1NUQVRFCQkweDAwNDAwMDAwCisKKy8qIEV4ZWN1dGl2ZSBldmVudCBpbmRpY2l0b3JzICovCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfUkVTT1VSQ0VfTElNSVRTCTB4MDAwMDAwMDEKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19DT05ORUNUSU9OX0ZBSUwJMHgwMDAwMDAwMgorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX0FEQVBURVJfRkFVTFQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19QT1dFUl9GQUlMCQkweDAwMDAwMDA4CisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfUkVTRVRfUEVORElORwkJMHgwMDAwMDAxMAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX1JFU0VUX0lNTUlORU5UIAkweDAwMDAwMDIwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfSFdfRkFJTAkJMHgwMDAwMDA0MAorI2RlZmluZSBJMk9fRVZUX0lORF9FWEVDX1hDVF9DSEFOR0UJCTB4MDAwMDAwODAKKyNkZWZpbmUgSTJPX0VWVF9JTkRfRVhFQ19ORVdfTENUX0VOVFJZCQkweDAwMDAwMTAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfTU9ESUZJRURfTENUCQkweDAwMDAwMjAwCisjZGVmaW5lIEkyT19FVlRfSU5EX0VYRUNfRERNX0FWQUlMQUJJTElUWQkweDAwMDAwNDAwCisKKy8qIFJhbmRvbSBCbG9jayBTdG9yYWdlIEV2ZW50IEluZGljYXRvcnMgKi8KKyNkZWZpbmUgSTJPX0VWVF9JTkRfQlNBX1ZPTFVNRV9MT0FECQkweDAwMDAwMDAxCisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9WT0xVTUVfVU5MT0FECQkweDAwMDAwMDAyCisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9WT0xVTUVfVU5MT0FEX1JFUQkweDAwMDAwMDA0CisjZGVmaW5lIEkyT19FVlRfSU5EX0JTQV9DQVBBQ0lUWV9DSEFOR0UgCTB4MDAwMDAwMDgKKyNkZWZpbmUgSTJPX0VWVF9JTkRfQlNBX1NDU0lfU01BUlQJCTB4MDAwMDAwMTAKKworLyogRXZlbnQgZGF0YSBmb3IgZ2VuZXJpYyBldmVudHMgKi8KKyNkZWZpbmUgSTJPX0VWVF9TVEFURV9DSEFOR0VfTk9STUFMCQkweDAwCisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX1NVU1BFTkRFRAkJMHgwMQorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9SRVNUQVJUCQkweDAyCisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX05BX1JFQ09WRVIgCTB4MDMKKyNkZWZpbmUgSTJPX0VWVF9TVEFURV9DSEFOR0VfTkFfTk9fUkVDT1ZFUgkweDA0CisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX1FVSUVTQ0VfUkVRVUVTVAkweDA1CisjZGVmaW5lIEkyT19FVlRfU1RBVEVfQ0hBTkdFX0ZBSUxFRAkJMHgxMAorI2RlZmluZSBJMk9fRVZUX1NUQVRFX0NIQU5HRV9GQVVMVEVECQkweDExCisKKyNkZWZpbmUgSTJPX0VWVF9HRU5fV0FSTklOR19OT1JNQUwJCTB4MDAKKyNkZWZpbmUgSTJPX0VWVF9HRU5fV0FSTklOR19FUlJPUl9USFJFU0hPTEQJMHgwMQorI2RlZmluZSBJMk9fRVZUX0dFTl9XQVJOSU5HX01FRElBX0ZBVUxUIAkweDAyCisKKyNkZWZpbmUgSTJPX0VWVF9DQVBBQklMSVRZX09USEVSCQkweDAxCisjZGVmaW5lIEkyT19FVlRfQ0FQQUJJTElUWV9DSEFOR0VECQkweDAyCisKKyNkZWZpbmUgSTJPX0VWVF9TRU5TT1JfU1RBVEVfQ0hBTkdFRAkJMHgwMQorCisvKgorICoJSTJPIGNsYXNzZXMgLyBzdWJjbGFzc2VzCisgKi8KKworLyogIENsYXNzIElEIGFuZCBDb2RlIEFzc2lnbm1lbnRzCisgKiAgKExDVC5DbGFzc0lELlZlcnNpb24gZmllbGQpCisgKi8KKyNkZWZpbmUgSTJPX0NMQVNTX1ZFUlNJT05fMTAJCQkweDAwCisjZGVmaW5lIEkyT19DTEFTU19WRVJTSU9OXzExCQkJMHgwMQorCisvKiAgQ2xhc3MgY29kZSBuYW1lcworICogIChmcm9tIHYxLjUgVGFibGUgNi0xIENsYXNzIENvZGUgQXNzaWdubWVudHMuKQorICovCisKKyNkZWZpbmUgSTJPX0NMQVNTX0VYRUNVVElWRQkJCTB4MDAwCisjZGVmaW5lIEkyT19DTEFTU19ERE0JCQkJMHgwMDEKKyNkZWZpbmUgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFCQkweDAxMAorI2RlZmluZSBJMk9fQ0xBU1NfU0VRVUVOVElBTF9TVE9SQUdFCQkweDAxMQorI2RlZmluZSBJMk9fQ0xBU1NfTEFOCQkJCTB4MDIwCisjZGVmaW5lIEkyT19DTEFTU19XQU4JCQkJMHgwMzAKKyNkZWZpbmUgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUE9SVAkJMHgwNDAKKyNkZWZpbmUgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTAkweDA0MQorI2RlZmluZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMCQkweDA1MQorI2RlZmluZSBJMk9fQ0xBU1NfQVRFX1BPUlQJCQkweDA2MAorI2RlZmluZSBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUwJCTB4MDYxCisjZGVmaW5lIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUgkJMHgwNzAKKyNkZWZpbmUgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0UgCQkweDA3MQorI2RlZmluZSBJMk9fQ0xBU1NfQlVTX0FEQVBURVIJCQkweDA4MAorI2RlZmluZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlRfQUdFTlQJCTB4MDkwCisjZGVmaW5lIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVAkJMHgwOTEKKyNkZWZpbmUJSTJPX0NMQVNTX0VORAkJCQkweGZmZgorCisvKgorICogIFJlc3Qgb2YgMHgwOTIgLSAweDA5ZiByZXNlcnZlZCBmb3IgcGVlci10by1wZWVyIGNsYXNzZXMKKyAqLworCisjZGVmaW5lIEkyT19DTEFTU19NQVRDSF9BTllDTEFTUwkJMHhmZmZmZmZmZgorCisvKgorICogIFN1YmNsYXNzZXMKKyAqLworCisjZGVmaW5lIEkyT19TVUJDTEFTU19pOTYwCQkJMHgwMDEKKyNkZWZpbmUgSTJPX1NVQkNMQVNTX0hETQkJCTB4MDIwCisjZGVmaW5lIEkyT19TVUJDTEFTU19JU00JCQkweDAyMQorCisvKiBPcGVyYXRpb24gZnVuY3Rpb25zICovCisKKyNkZWZpbmUgSTJPX1BBUkFNU19GSUVMRF9HRVQJCQkweDAwMDEKKyNkZWZpbmUgSTJPX1BBUkFNU19MSVNUX0dFVAkJCTB4MDAwMgorI2RlZmluZSBJMk9fUEFSQU1TX01PUkVfR0VUCQkJMHgwMDAzCisjZGVmaW5lIEkyT19QQVJBTVNfU0laRV9HRVQJCQkweDAwMDQKKyNkZWZpbmUgSTJPX1BBUkFNU19UQUJMRV9HRVQJCQkweDAwMDUKKyNkZWZpbmUgSTJPX1BBUkFNU19GSUVMRF9TRVQJCQkweDAwMDYKKyNkZWZpbmUgSTJPX1BBUkFNU19MSVNUX1NFVAkJCTB4MDAwNworI2RlZmluZSBJMk9fUEFSQU1TX1JPV19BREQJCQkweDAwMDgKKyNkZWZpbmUgSTJPX1BBUkFNU19ST1dfREVMRVRFCQkJMHgwMDA5CisjZGVmaW5lIEkyT19QQVJBTVNfVEFCTEVfQ0xFQVIJCQkweDAwMEEKKworLyoKKyAqIEkyTyBzZXJpYWwgbnVtYmVyIGNvbnZlbnRpb25zIC8gZm9ybWF0cworICogKGNpcmNhIHYxLjUpCisgKi8KKworI2RlZmluZSBJMk9fU05GT1JNQVRfVU5LTk9XTgkJCTAKKyNkZWZpbmUgSTJPX1NORk9STUFUX0JJTkFSWQkJCTEKKyNkZWZpbmUgSTJPX1NORk9STUFUX0FTQ0lJCQkJMgorI2RlZmluZSBJMk9fU05GT1JNQVRfVU5JQ09ERQkJCTMKKyNkZWZpbmUgSTJPX1NORk9STUFUX0xBTjQ4X01BQwkJCTQKKyNkZWZpbmUgSTJPX1NORk9STUFUX1dBTgkJCTUKKworLyoKKyAqIFBsdXMgbmV3IGluIHYyLjAgKFllbGxvd3N0b25lIHBkZiBkb2MpCisgKi8KKworI2RlZmluZSBJMk9fU05GT1JNQVRfTEFONjRfTUFDCQkJNgorI2RlZmluZSBJMk9fU05GT1JNQVRfRERNCQkJNworI2RlZmluZSBJMk9fU05GT1JNQVRfSUVFRV9SRUc2NCAJCTgKKyNkZWZpbmUgSTJPX1NORk9STUFUX0lFRUVfUkVHMTI4CQk5CisjZGVmaW5lIEkyT19TTkZPUk1BVF9VTktOT1dOMgkJCTB4ZmYKKworLyoKKyAqCUkyTyBHZXQgU3RhdHVzIFN0YXRlIHZhbHVlcworICovCisKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9JTklUSUFMSVpJTkcJCTB4MDEKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9SRVNFVAkJCTB4MDIKKyNkZWZpbmUgQURBUFRFUl9TVEFURV9IT0xECQkJMHgwNAorI2RlZmluZSBBREFQVEVSX1NUQVRFX1JFQURZCQkJMHgwNQorI2RlZmluZSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMCQkweDA4CisjZGVmaW5lIEFEQVBURVJfU1RBVEVfRkFJTEVECQkJMHgxMAorI2RlZmluZSBBREFQVEVSX1NUQVRFX0ZBVUxURUQJCQkweDExCisKKy8qCisgKglTb2Z0d2FyZSBtb2R1bGUgdHlwZXMKKyAqLworI2RlZmluZSBJMk9fU09GVFdBUkVfTU9EVUxFX0lSVE9TCQkweDExCisjZGVmaW5lIEkyT19TT0ZUV0FSRV9NT0RVTEVfSU9QX1BSSVZBVEUJCTB4MjIKKyNkZWZpbmUgSTJPX1NPRlRXQVJFX01PRFVMRV9JT1BfQ09ORklHCQkweDIzCisKKy8qCisgKglWZW5kb3JzCisgKi8KKyNkZWZpbmUgSTJPX1ZFTkRPUl9EUFQJCQkJMHgwMDFiCisKKy8qCisgKiBEUFQgLyBBZGFwdGVjIHNwZWNpZmljIHZhbHVlcyBmb3IgaTJvX3NnX2lvX2hkciBmbGFncy4KKyAqLworI2RlZmluZSBJMk9fRFBUX1NHX0ZMQUdfSU5URVJQUkVUCQkweDAwMDEwMDAwCisjZGVmaW5lIEkyT19EUFRfU0dfRkxBR19QSFlTSUNBTAkJMHgwMDAyMDAwMAorCisjZGVmaW5lIEkyT19EUFRfRkxBU0hfRlJBR19TSVpFCQkJMHgxMDAwMAorI2RlZmluZSBJMk9fRFBUX0ZMQVNIX1JFQUQJCQkweDAxMDEKKyNkZWZpbmUgSTJPX0RQVF9GTEFTSF9XUklURQkJCTB4MDEwMgorCisjZW5kaWYJCQkJLyogX0kyT19ERVZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pOGsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaThrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0NWJhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaThrLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGk4ay5oIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hc3NpbW8gRGFsIFpvdHRvIDxkekBkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JOEtfSAorI2RlZmluZSBfTElOVVhfSThLX0gKKworI2RlZmluZSBJOEtfUFJPQwkJIi9wcm9jL2k4ayIKKyNkZWZpbmUgSThLX1BST0NfRk1UCQkiMS4wIgorCisjZGVmaW5lIEk4S19CSU9TX1ZFUlNJT04JX0lPUiAoJ2knLCAweDgwLCBpbnQpCS8qIGJyb2tlbjogbWVhbnQgNCBieXRlcyAqLworI2RlZmluZSBJOEtfTUFDSElORV9JRAkJX0lPUiAoJ2knLCAweDgxLCBpbnQpCS8qIGJyb2tlbjogbWVhbnQgMTYgYnl0ZXMgKi8KKyNkZWZpbmUgSThLX1BPV0VSX1NUQVRVUwlfSU9SICgnaScsIDB4ODIsIHNpemVfdCkKKyNkZWZpbmUgSThLX0ZOX1NUQVRVUwkJX0lPUiAoJ2knLCAweDgzLCBzaXplX3QpCisjZGVmaW5lIEk4S19HRVRfVEVNUAkJX0lPUiAoJ2knLCAweDg0LCBzaXplX3QpCisjZGVmaW5lIEk4S19HRVRfU1BFRUQJCV9JT1dSKCdpJywgMHg4NSwgc2l6ZV90KQorI2RlZmluZSBJOEtfR0VUX0ZBTgkJX0lPV1IoJ2knLCAweDg2LCBzaXplX3QpCisjZGVmaW5lIEk4S19TRVRfRkFOCQlfSU9XUignaScsIDB4ODcsIHNpemVfdCkKKworI2RlZmluZSBJOEtfRkFOX0xFRlQJCTEKKyNkZWZpbmUgSThLX0ZBTl9SSUdIVAkJMAorI2RlZmluZSBJOEtfRkFOX09GRgkJMAorI2RlZmluZSBJOEtfRkFOX0xPVwkJMQorI2RlZmluZSBJOEtfRkFOX0hJR0gJCTIKKyNkZWZpbmUgSThLX0ZBTl9NQVgJCUk4S19GQU5fSElHSAorCisjZGVmaW5lIEk4S19WT0xfVVAJCTEKKyNkZWZpbmUgSThLX1ZPTF9ET1dOCQkyCisjZGVmaW5lIEk4S19WT0xfTVVURQkJNAorCisjZGVmaW5lIEk4S19BQwkJCTEKKyNkZWZpbmUgSThLX0JBVFRFUlkJCTAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWRhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2ljbXAuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgSUNNUCBwcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWNtcC5oCTEuMC4zCTA0LzI4LzkzCisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUNNUF9ICisjZGVmaW5lCV9MSU5VWF9JQ01QX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSUNNUF9FQ0hPUkVQTFkJCTAJLyogRWNobyBSZXBseQkJCSovCisjZGVmaW5lIElDTVBfREVTVF9VTlJFQUNICTMJLyogRGVzdGluYXRpb24gVW5yZWFjaGFibGUJKi8KKyNkZWZpbmUgSUNNUF9TT1VSQ0VfUVVFTkNICTQJLyogU291cmNlIFF1ZW5jaAkJKi8KKyNkZWZpbmUgSUNNUF9SRURJUkVDVAkJNQkvKiBSZWRpcmVjdCAoY2hhbmdlIHJvdXRlKQkqLworI2RlZmluZSBJQ01QX0VDSE8JCTgJLyogRWNobyBSZXF1ZXN0CQkJKi8KKyNkZWZpbmUgSUNNUF9USU1FX0VYQ0VFREVECTExCS8qIFRpbWUgRXhjZWVkZWQJCSovCisjZGVmaW5lIElDTVBfUEFSQU1FVEVSUFJPQgkxMgkvKiBQYXJhbWV0ZXIgUHJvYmxlbQkJKi8KKyNkZWZpbmUgSUNNUF9USU1FU1RBTVAJCTEzCS8qIFRpbWVzdGFtcCBSZXF1ZXN0CQkqLworI2RlZmluZSBJQ01QX1RJTUVTVEFNUFJFUExZCTE0CS8qIFRpbWVzdGFtcCBSZXBseQkJKi8KKyNkZWZpbmUgSUNNUF9JTkZPX1JFUVVFU1QJMTUJLyogSW5mb3JtYXRpb24gUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9JTkZPX1JFUExZCQkxNgkvKiBJbmZvcm1hdGlvbiBSZXBseQkJKi8KKyNkZWZpbmUgSUNNUF9BRERSRVNTCQkxNwkvKiBBZGRyZXNzIE1hc2sgUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9BRERSRVNTUkVQTFkJMTgJLyogQWRkcmVzcyBNYXNrIFJlcGx5CQkqLworI2RlZmluZSBOUl9JQ01QX1RZUEVTCQkxOAorCisKKy8qIENvZGVzIGZvciBVTlJFQUNILiAqLworI2RlZmluZSBJQ01QX05FVF9VTlJFQUNICTAJLyogTmV0d29yayBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9IT1NUX1VOUkVBQ0gJMQkvKiBIb3N0IFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX1BST1RfVU5SRUFDSAkyCS8qIFByb3RvY29sIFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX1BPUlRfVU5SRUFDSAkzCS8qIFBvcnQgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfRlJBR19ORUVERUQJNAkvKiBGcmFnbWVudGF0aW9uIE5lZWRlZC9ERiBzZXQJKi8KKyNkZWZpbmUgSUNNUF9TUl9GQUlMRUQJCTUJLyogU291cmNlIFJvdXRlIGZhaWxlZAkJKi8KKyNkZWZpbmUgSUNNUF9ORVRfVU5LTk9XTgk2CisjZGVmaW5lIElDTVBfSE9TVF9VTktOT1dOCTcKKyNkZWZpbmUgSUNNUF9IT1NUX0lTT0xBVEVECTgKKyNkZWZpbmUgSUNNUF9ORVRfQU5PCQk5CisjZGVmaW5lIElDTVBfSE9TVF9BTk8JCTEwCisjZGVmaW5lIElDTVBfTkVUX1VOUl9UT1MJMTEKKyNkZWZpbmUgSUNNUF9IT1NUX1VOUl9UT1MJMTIKKyNkZWZpbmUgSUNNUF9QS1RfRklMVEVSRUQJMTMJLyogUGFja2V0IGZpbHRlcmVkICovCisjZGVmaW5lIElDTVBfUFJFQ19WSU9MQVRJT04JMTQJLyogUHJlY2VkZW5jZSB2aW9sYXRpb24gKi8KKyNkZWZpbmUgSUNNUF9QUkVDX0NVVE9GRgkxNQkvKiBQcmVjZWRlbmNlIGN1dCBvZmYgKi8KKyNkZWZpbmUgTlJfSUNNUF9VTlJFQUNICQkxNQkvKiBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgaW1tZWRpYXRlIHZhbHVlICovCisKKy8qIENvZGVzIGZvciBSRURJUkVDVC4gKi8KKyNkZWZpbmUgSUNNUF9SRURJUl9ORVQJCTAJLyogUmVkaXJlY3QgTmV0CQkJKi8KKyNkZWZpbmUgSUNNUF9SRURJUl9IT1NUCQkxCS8qIFJlZGlyZWN0IEhvc3QJCSovCisjZGVmaW5lIElDTVBfUkVESVJfTkVUVE9TCTIJLyogUmVkaXJlY3QgTmV0IGZvciBUT1MJCSovCisjZGVmaW5lIElDTVBfUkVESVJfSE9TVFRPUwkzCS8qIFJlZGlyZWN0IEhvc3QgZm9yIFRPUwkqLworCisvKiBDb2RlcyBmb3IgVElNRV9FWENFRURFRC4gKi8KKyNkZWZpbmUgSUNNUF9FWENfVFRMCQkwCS8qIFRUTCBjb3VudCBleGNlZWRlZAkJKi8KKyNkZWZpbmUgSUNNUF9FWENfRlJBR1RJTUUJMQkvKiBGcmFnbWVudCBSZWFzcyB0aW1lIGV4Y2VlZGVkCSovCisKKworc3RydWN0IGljbXBoZHIgeworICBfX3U4CQl0eXBlOworICBfX3U4CQljb2RlOworICBfX3N1bTE2CWNoZWNrc3VtOworICB1bmlvbiB7CisJc3RydWN0IHsKKwkJX19iZTE2CWlkOworCQlfX2JlMTYJc2VxdWVuY2U7CisJfSBlY2hvOworCV9fYmUzMglnYXRld2F5OworCXN0cnVjdCB7CisJCV9fYmUxNglfX3VudXNlZDsKKwkJX19iZTE2CW10dTsKKwl9IGZyYWc7CisgIH0gdW47Cit9OworCisKKy8qCisgKgljb25zdGFudHMgZm9yIChzZXR8Z2V0KXNvY2tvcHQKKyAqLworCisjZGVmaW5lIElDTVBfRklMVEVSCQkJMQorCitzdHJ1Y3QgaWNtcF9maWx0ZXIgeworCV9fdTMyCQlkYXRhOworfTsKKworCisjZW5kaWYJLyogX0xJTlVYX0lDTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pY21wdjYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlM2Q0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWNtcHY2LmgKQEAgLTAsMCArMSwxNjEgQEAKKyNpZm5kZWYgX0xJTlVYX0lDTVBWNl9ICisjZGVmaW5lIF9MSU5VWF9JQ01QVjZfSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitzdHJ1Y3QgaWNtcDZoZHIgeworCisJX191OAkJaWNtcDZfdHlwZTsKKwlfX3U4CQlpY21wNl9jb2RlOworCV9fc3VtMTYJCWljbXA2X2Nrc3VtOworCisKKwl1bmlvbiB7CisJCV9fYmUzMgkJCXVuX2RhdGEzMlsxXTsKKwkJX19iZTE2CQkJdW5fZGF0YTE2WzJdOworCQlfX3U4CQkJdW5fZGF0YThbNF07CisKKwkJc3RydWN0IGljbXB2Nl9lY2hvIHsKKwkJCV9fYmUxNgkJaWRlbnRpZmllcjsKKwkJCV9fYmUxNgkJc2VxdWVuY2U7CisJCX0gdV9lY2hvOworCisgICAgICAgICAgICAgICAgc3RydWN0IGljbXB2Nl9uZF9hZHZ0IHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyCQlyZXNlcnZlZDo1LAorICAgICAgICAgICAgICAgICAgICAgICAgCQlvdmVycmlkZToxLAorICAgICAgICAgICAgICAgICAgICAgICAgCQlzb2xpY2l0ZWQ6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJcm91dGVyOjEsCisJCQkJCXJlc2VydmVkMjoyNDsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorICAgICAgICAgICAgICAgICAgICAgICAgX191MzIJCXJvdXRlcjoxLAorCQkJCQlzb2xpY2l0ZWQ6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJb3ZlcnJpZGU6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVzZXJ2ZWQ6Mjk7CisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCQkJCQkJCisgICAgICAgICAgICAgICAgfSB1X25kX2FkdnQ7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaWNtcHY2X25kX3JhIHsKKwkJCV9fdTgJCWhvcF9saW1pdDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwkJCV9fdTgJCXJlc2VydmVkOjQsCisJCQkJCXJvdXRlcl9wcmVmOjIsCisJCQkJCW90aGVyOjEsCisJCQkJCW1hbmFnZWQ6MTsKKworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJCQlfX3U4CQltYW5hZ2VkOjEsCisJCQkJCW90aGVyOjEsCisJCQkJCXJvdXRlcl9wcmVmOjIsCisJCQkJCXJlc2VydmVkOjQ7CisjZWxzZQorI2Vycm9yCSJQbGVhc2UgZml4IDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJCQlfX2JlMTYJCXJ0X2xpZmV0aW1lOworICAgICAgICAgICAgICAgIH0gdV9uZF9yYTsKKworCX0gaWNtcDZfZGF0YXVuOworCisjZGVmaW5lIGljbXA2X2lkZW50aWZpZXIJaWNtcDZfZGF0YXVuLnVfZWNoby5pZGVudGlmaWVyCisjZGVmaW5lIGljbXA2X3NlcXVlbmNlCQlpY21wNl9kYXRhdW4udV9lY2hvLnNlcXVlbmNlCisjZGVmaW5lIGljbXA2X3BvaW50ZXIJCWljbXA2X2RhdGF1bi51bl9kYXRhMzJbMF0KKyNkZWZpbmUgaWNtcDZfbXR1CQlpY21wNl9kYXRhdW4udW5fZGF0YTMyWzBdCisjZGVmaW5lIGljbXA2X3VudXNlZAkJaWNtcDZfZGF0YXVuLnVuX2RhdGEzMlswXQorI2RlZmluZSBpY21wNl9tYXhkZWxheQkJaWNtcDZfZGF0YXVuLnVuX2RhdGExNlswXQorI2RlZmluZSBpY21wNl9yb3V0ZXIJCWljbXA2X2RhdGF1bi51X25kX2FkdnQucm91dGVyCisjZGVmaW5lIGljbXA2X3NvbGljaXRlZAkJaWNtcDZfZGF0YXVuLnVfbmRfYWR2dC5zb2xpY2l0ZWQKKyNkZWZpbmUgaWNtcDZfb3ZlcnJpZGUJCWljbXA2X2RhdGF1bi51X25kX2FkdnQub3ZlcnJpZGUKKyNkZWZpbmUgaWNtcDZfbmRpc2NyZXNlcnZlZAlpY21wNl9kYXRhdW4udV9uZF9hZHZ0LnJlc2VydmVkCisjZGVmaW5lIGljbXA2X2hvcF9saW1pdAkJaWNtcDZfZGF0YXVuLnVfbmRfcmEuaG9wX2xpbWl0CisjZGVmaW5lIGljbXA2X2FkZHJjb25mX21hbmFnZWQJaWNtcDZfZGF0YXVuLnVfbmRfcmEubWFuYWdlZAorI2RlZmluZSBpY21wNl9hZGRyY29uZl9vdGhlcglpY21wNl9kYXRhdW4udV9uZF9yYS5vdGhlcgorI2RlZmluZSBpY21wNl9ydF9saWZldGltZQlpY21wNl9kYXRhdW4udV9uZF9yYS5ydF9saWZldGltZQorI2RlZmluZSBpY21wNl9yb3V0ZXJfcHJlZglpY21wNl9kYXRhdW4udV9uZF9yYS5yb3V0ZXJfcHJlZgorfTsKKworCisjZGVmaW5lIElDTVBWNl9ST1VURVJfUFJFRl9MT1cJCTB4MworI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfTUVESVVNCTB4MAorI2RlZmluZSBJQ01QVjZfUk9VVEVSX1BSRUZfSElHSAkJMHgxCisjZGVmaW5lIElDTVBWNl9ST1VURVJfUFJFRl9JTlZBTElECTB4MgorCisjZGVmaW5lIElDTVBWNl9ERVNUX1VOUkVBQ0gJCTEKKyNkZWZpbmUgSUNNUFY2X1BLVF9UT09CSUcJCTIKKyNkZWZpbmUgSUNNUFY2X1RJTUVfRVhDRUVECQkzCisjZGVmaW5lIElDTVBWNl9QQVJBTVBST0IJCTQKKworI2RlZmluZSBJQ01QVjZfSU5GT01TR19NQVNLCQkweDgwCisKKyNkZWZpbmUgSUNNUFY2X0VDSE9fUkVRVUVTVAkJMTI4CisjZGVmaW5lIElDTVBWNl9FQ0hPX1JFUExZCQkxMjkKKyNkZWZpbmUgSUNNUFY2X01HTV9RVUVSWQkJMTMwCisjZGVmaW5lIElDTVBWNl9NR01fUkVQT1JUICAgICAgIAkxMzEKKyNkZWZpbmUgSUNNUFY2X01HTV9SRURVQ1RJT04gICAgCTEzMgorCisjZGVmaW5lIElDTVBWNl9OSV9RVUVSWQkJCTEzOQorI2RlZmluZSBJQ01QVjZfTklfUkVQTFkJCQkxNDAKKworI2RlZmluZSBJQ01QVjZfTUxEMl9SRVBPUlQJCTE0MworCisjZGVmaW5lIElDTVBWNl9ESEFBRF9SRVFVRVNUCQkxNDQKKyNkZWZpbmUgSUNNUFY2X0RIQUFEX1JFUExZCQkxNDUKKyNkZWZpbmUgSUNNUFY2X01PQklMRV9QUkVGSVhfU09MCTE0NgorI2RlZmluZSBJQ01QVjZfTU9CSUxFX1BSRUZJWF9BRFYJMTQ3CisKKy8qCisgKglDb2RlcyBmb3IgRGVzdGluYXRpb24gVW5yZWFjaGFibGUKKyAqLworI2RlZmluZSBJQ01QVjZfTk9ST1VURQkJCTAKKyNkZWZpbmUgSUNNUFY2X0FETV9QUk9ISUJJVEVECQkxCisjZGVmaW5lIElDTVBWNl9OT1RfTkVJR0hCT1VSCQkyCisjZGVmaW5lIElDTVBWNl9BRERSX1VOUkVBQ0gJCTMKKyNkZWZpbmUgSUNNUFY2X1BPUlRfVU5SRUFDSAkJNAorCisvKgorICoJQ29kZXMgZm9yIFRpbWUgRXhjZWVkZWQKKyAqLworI2RlZmluZSBJQ01QVjZfRVhDX0hPUExJTUlUCQkwCisjZGVmaW5lIElDTVBWNl9FWENfRlJBR1RJTUUJCTEKKworLyoKKyAqCUNvZGVzIGZvciBQYXJhbWV0ZXIgUHJvYmxlbQorICovCisjZGVmaW5lIElDTVBWNl9IRFJfRklFTEQJCTAKKyNkZWZpbmUgSUNNUFY2X1VOS19ORVhUSERSCQkxCisjZGVmaW5lIElDTVBWNl9VTktfT1BUSU9OCQkyCisKKy8qCisgKgljb25zdGFudHMgZm9yIChzZXR8Z2V0KXNvY2tvcHQKKyAqLworCisjZGVmaW5lIElDTVBWNl9GSUxURVIJCQkxCisKKy8qCisgKglJQ01QVjYgZmlsdGVyCisgKi8KKworI2RlZmluZSBJQ01QVjZfRklMVEVSX0JMT0NLCQkxCisjZGVmaW5lIElDTVBWNl9GSUxURVJfUEFTUwkJMgorI2RlZmluZSBJQ01QVjZfRklMVEVSX0JMT0NLT1RIRVJTCTMKKyNkZWZpbmUgSUNNUFY2X0ZJTFRFUl9QQVNTT05MWQkJNAorCitzdHJ1Y3QgaWNtcDZfZmlsdGVyIHsKKwlfX3UzMgkJZGF0YVs4XTsKK307CisKKy8qCisgKglEZWZpbml0aW9ucyBmb3IgTUxEdjIKKyAqLworI2RlZmluZSBNTEQyX01PREVfSVNfSU5DTFVERQkxCisjZGVmaW5lIE1MRDJfTU9ERV9JU19FWENMVURFCTIKKyNkZWZpbmUgTUxEMl9DSEFOR0VfVE9fSU5DTFVERQkzCisjZGVmaW5lIE1MRDJfQ0hBTkdFX1RPX0VYQ0xVREUJNAorI2RlZmluZSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTCTUKKyNkZWZpbmUgTUxEMl9CTE9DS19PTERfU09VUkNFUwk2CisKKyNkZWZpbmUgTUxEMl9BTExfTUNSX0lOSVQgeyB7IHsgMHhmZiwweDAyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMHgxNiB9IH0gfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmNkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgSU5FVCBpbnRlcmZhY2UgbW9kdWxlLgorICoKKyAqIFZlcnNpb246CUAoIylpZi5oCTEuMC4yCTA0LzE4LzkzCisgKgorICogQXV0aG9yczoJT3JpZ2luYWwgdGFrZW4gZnJvbSBCZXJrZWxleSBVTklYIDQuMywgKGMpIFVDQiAxOTgyLTE5ODgKKyAqCQlSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSUZfSAorI2RlZmluZSBfTElOVVhfSUZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIGZvciAiX19rZXJuZWxfY2FkZHJfdCIgZXQgYWwJKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4JCS8qIGZvciAic3RydWN0IHNvY2thZGRyIiBldCBhbAkqLworCisjZGVmaW5lCUlGTkFNU0laCTE2CisjaW5jbHVkZSA8bGludXgvaGRsYy9pb2N0bC5oPgorCisvKiBTdGFuZGFyZCBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+ZmxhZ3MpLiAqLworI2RlZmluZQlJRkZfVVAJCTB4MQkJLyogaW50ZXJmYWNlIGlzIHVwCQkqLworI2RlZmluZQlJRkZfQlJPQURDQVNUCTB4MgkJLyogYnJvYWRjYXN0IGFkZHJlc3MgdmFsaWQJKi8KKyNkZWZpbmUJSUZGX0RFQlVHCTB4NAkJLyogdHVybiBvbiBkZWJ1Z2dpbmcJCSovCisjZGVmaW5lCUlGRl9MT09QQkFDSwkweDgJCS8qIGlzIGEgbG9vcGJhY2sgbmV0CQkqLworI2RlZmluZQlJRkZfUE9JTlRPUE9JTlQJMHgxMAkJLyogaW50ZXJmYWNlIGlzIGhhcyBwLXAgbGluawkqLworI2RlZmluZQlJRkZfTk9UUkFJTEVSUwkweDIwCQkvKiBhdm9pZCB1c2Ugb2YgdHJhaWxlcnMJKi8KKyNkZWZpbmUJSUZGX1JVTk5JTkcJMHg0MAkJLyogaW50ZXJmYWNlIFJGQzI4NjMgT1BFUl9VUAkqLworI2RlZmluZQlJRkZfTk9BUlAJMHg4MAkJLyogbm8gQVJQIHByb3RvY29sCQkqLworI2RlZmluZQlJRkZfUFJPTUlTQwkweDEwMAkJLyogcmVjZWl2ZSBhbGwgcGFja2V0cwkJKi8KKyNkZWZpbmUJSUZGX0FMTE1VTFRJCTB4MjAwCQkvKiByZWNlaXZlIGFsbCBtdWx0aWNhc3QgcGFja2V0cyovCisKKyNkZWZpbmUgSUZGX01BU1RFUgkweDQwMAkJLyogbWFzdGVyIG9mIGEgbG9hZCBiYWxhbmNlciAJKi8KKyNkZWZpbmUgSUZGX1NMQVZFCTB4ODAwCQkvKiBzbGF2ZSBvZiBhIGxvYWQgYmFsYW5jZXIJKi8KKworI2RlZmluZSBJRkZfTVVMVElDQVNUCTB4MTAwMAkJLyogU3VwcG9ydHMgbXVsdGljYXN0CQkqLworCisjZGVmaW5lIElGRl9QT1JUU0VMCTB4MjAwMCAgICAgICAgICAvKiBjYW4gc2V0IG1lZGlhIHR5cGUJCSovCisjZGVmaW5lIElGRl9BVVRPTUVESUEJMHg0MDAwCQkvKiBhdXRvIG1lZGlhIHNlbGVjdCBhY3RpdmUJKi8KKyNkZWZpbmUgSUZGX0RZTkFNSUMJMHg4MDAwCQkvKiBkaWFsdXAgZGV2aWNlIHdpdGggY2hhbmdpbmcgYWRkcmVzc2VzKi8KKworI2RlZmluZSBJRkZfTE9XRVJfVVAJMHgxMDAwMAkJLyogZHJpdmVyIHNpZ25hbHMgTDEgdXAJCSovCisjZGVmaW5lIElGRl9ET1JNQU5UCTB4MjAwMDAJCS8qIGRyaXZlciBzaWduYWxzIGRvcm1hbnQJKi8KKworI2RlZmluZSBJRkZfVk9MQVRJTEUJKElGRl9MT09QQkFDS3xJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVHxcCisJCUlGRl9NQVNURVJ8SUZGX1NMQVZFfElGRl9SVU5OSU5HfElGRl9MT1dFUl9VUHxJRkZfRE9STUFOVCkKKworLyogUHJpdmF0ZSAoZnJvbSB1c2VyKSBpbnRlcmZhY2UgZmxhZ3MgKG5ldGRldmljZS0+cHJpdl9mbGFncykuICovCisjZGVmaW5lIElGRl84MDJfMVFfVkxBTiAweDEgICAgICAgICAgICAgLyogODAyLjFRIFZMQU4gZGV2aWNlLiAgICAgICAgICAqLworI2RlZmluZSBJRkZfRUJSSURHRQkweDIJCS8qIEV0aGVybmV0IGJyaWRnaW5nIGRldmljZS4JKi8KKyNkZWZpbmUgSUZGX1NMQVZFX0lOQUNUSVZFCTB4NAkvKiBib25kaW5nIHNsYXZlIG5vdCB0aGUgY3Vyci4gYWN0aXZlICovCisjZGVmaW5lIElGRl9NQVNURVJfODAyM0FECTB4OAkvKiBib25kaW5nIG1hc3RlciwgODAyLjNhZC4gCSovCisjZGVmaW5lIElGRl9NQVNURVJfQUxCCTB4MTAJCS8qIGJvbmRpbmcgbWFzdGVyLCBiYWxhbmNlLWFsYi4JKi8KKyNkZWZpbmUgSUZGX0JPTkRJTkcJMHgyMAkJLyogYm9uZGluZyBtYXN0ZXIgb3Igc2xhdmUJKi8KKyNkZWZpbmUgSUZGX1NMQVZFX05FRURBUlAgMHg0MAkJLyogbmVlZCBBUlBzIGZvciB2YWxpZGF0aW9uCSovCisKKyNkZWZpbmUgSUZfR0VUX0lGQUNFCTB4MDAwMQkJLyogZm9yIHF1ZXJ5aW5nIG9ubHkgKi8KKyNkZWZpbmUgSUZfR0VUX1BST1RPCTB4MDAwMgorCisvKiBGb3IgZGVmaW5pdGlvbnMgc2VlIGhkbGMuaCAqLworI2RlZmluZSBJRl9JRkFDRV9WMzUJMHgxMDAwCQkvKiBWLjM1IHNlcmlhbCBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfVjI0CTB4MTAwMQkJLyogVi4yNCBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX1gyMQkweDEwMDIJCS8qIFguMjEgc2VyaWFsIGludGVyZmFjZQkqLworI2RlZmluZSBJRl9JRkFDRV9UMQkweDEwMDMJCS8qIFQxIHRlbGNvIHNlcmlhbCBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfRTEJMHgxMDA0CQkvKiBFMSB0ZWxjbyBzZXJpYWwgaW50ZXJmYWNlCSovCisjZGVmaW5lIElGX0lGQUNFX1NZTkNfU0VSSUFMIDB4MTAwNQkvKiBjYW4ndCBiZSBzZXQgYnkgc29mdHdhcmUJKi8KKyNkZWZpbmUgSUZfSUZBQ0VfWDIxRCAgIDB4MTAwNiAgICAgICAgICAvKiBYLjIxIER1YWwgQ2xvY2tpbmcgKEZhclNpdGUpICovCisKKy8qIEZvciBkZWZpbml0aW9ucyBzZWUgaGRsYy5oICovCisjZGVmaW5lIElGX1BST1RPX0hETEMJMHgyMDAwCQkvKiByYXcgSERMQyBwcm90b2NvbAkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fUFBQCTB4MjAwMQkJLyogUFBQIHByb3RvY29sCQkJKi8KKyNkZWZpbmUgSUZfUFJPVE9fQ0lTQ08JMHgyMDAyCQkvKiBDaXNjbyBIRExDIHByb3RvY29sCQkqLworI2RlZmluZSBJRl9QUk9UT19GUgkweDIwMDMJCS8qIEZyYW1lIFJlbGF5IHByb3RvY29sCQkqLworI2RlZmluZSBJRl9QUk9UT19GUl9BRERfUFZDIDB4MjAwNAkvKiAgICBDcmVhdGUgRlIgUFZDCQkqLworI2RlZmluZSBJRl9QUk9UT19GUl9ERUxfUFZDIDB4MjAwNQkvKiAgICBEZWxldGUgRlIgUFZDCQkqLworI2RlZmluZSBJRl9QUk9UT19YMjUJMHgyMDA2CQkvKiBYLjI1CQkJCSovCisjZGVmaW5lIElGX1BST1RPX0hETENfRVRIIDB4MjAwNwkvKiByYXcgSERMQywgRXRoZXJuZXQgZW11bGF0aW9uCSovCisjZGVmaW5lIElGX1BST1RPX0ZSX0FERF9FVEhfUFZDIDB4MjAwOAkvKiAgQ3JlYXRlIEZSIEV0aGVybmV0LWJyaWRnZWQgUFZDICovCisjZGVmaW5lIElGX1BST1RPX0ZSX0RFTF9FVEhfUFZDIDB4MjAwOQkvKiAgRGVsZXRlIEZSIEV0aGVybmV0LWJyaWRnZWQgUFZDICovCisjZGVmaW5lIElGX1BST1RPX0ZSX1BWQwkweDIwMEEJCS8qIGZvciByZWFkaW5nIFBWQyBzdGF0dXMJKi8KKyNkZWZpbmUgSUZfUFJPVE9fRlJfRVRIX1BWQyAweDIwMEIKKyNkZWZpbmUgSUZfUFJPVE9fUkFXICAgIDB4MjAwQyAgICAgICAgICAvKiBSQVcgU29ja2V0ICAgICAgICAgICAgICAgICAgICovCisKKy8qIFJGQyAyODYzIG9wZXJhdGlvbmFsIHN0YXR1cyAqLworZW51bSB7CisJSUZfT1BFUl9VTktOT1dOLAorCUlGX09QRVJfTk9UUFJFU0VOVCwKKwlJRl9PUEVSX0RPV04sCisJSUZfT1BFUl9MT1dFUkxBWUVSRE9XTiwKKwlJRl9PUEVSX1RFU1RJTkcsCisJSUZfT1BFUl9ET1JNQU5ULAorCUlGX09QRVJfVVAsCit9OworCisvKiBsaW5rIG1vZGVzICovCitlbnVtIHsKKwlJRl9MSU5LX01PREVfREVGQVVMVCwKKwlJRl9MSU5LX01PREVfRE9STUFOVCwJLyogbGltaXQgdXB3YXJkIHRyYW5zaXRpb24gdG8gZG9ybWFudCAqLworfTsKKworLyoKKyAqCURldmljZSBtYXBwaW5nIHN0cnVjdHVyZS4gSSdkIGp1c3QgZ29uZSBvZmYgYW5kIGRlc2lnbmVkIGEgCisgKgliZWF1dGlmdWwgc2NoZW1lIHVzaW5nIG9ubHkgbG9hZGFibGUgbW9kdWxlcyB3aXRoIGFyZ3VtZW50cworICoJZm9yIGRyaXZlciBvcHRpb25zIGFuZCBhbG9uZyBjb21lIHRoZSBQQ01DSUEgcGVvcGxlIDgpCisgKgorICoJQWggd2VsbC4gVGhlIGdldCgpIHNpZGUgb2YgdGhpcyBpcyBnb29kIGZvciBXRFNFVFVQLCBhbmQgaXQnbGwKKyAqCWJlIGhhbmR5IGZvciBkZWJ1Z2dpbmcgdGhpbmdzLiBUaGUgc2V0IHNpZGUgaXMgZmluZSBmb3Igbm93IGFuZAorICoJYmVpbmcgdmVyeSBzbWFsbCBtaWdodCBiZSB3b3J0aCBrZWVwaW5nIGZvciBjbGVhbiBjb25maWd1cmF0aW9uLgorICovCisKK3N0cnVjdCBpZm1hcCAKK3sKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIG1lbV9lbmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZV9hZGRyOyAKKwl1bnNpZ25lZCBjaGFyIGlycTsKKwl1bnNpZ25lZCBjaGFyIGRtYTsKKwl1bnNpZ25lZCBjaGFyIHBvcnQ7CisJLyogMyBieXRlcyBzcGFyZSAqLworfTsKKworc3RydWN0IGlmX3NldHRpbmdzCit7CisJdW5zaWduZWQgaW50IHR5cGU7CS8qIFR5cGUgb2YgcGh5c2ljYWwgZGV2aWNlIG9yIHByb3RvY29sICovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIFNpemUgb2YgdGhlIGRhdGEgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwl1bmlvbiB7CisJCS8qIHthdG0vZXRoL2RzbH1fc2V0dGluZ3MgYW55b25lID8gKi8KKwkJcmF3X2hkbGNfcHJvdG8JICpyYXdfaGRsYzsKKwkJY2lzY29fcHJvdG8JICpjaXNjbzsKKwkJZnJfcHJvdG8JICpmcjsKKwkJZnJfcHJvdG9fcHZjCSAqZnJfcHZjOworCQlmcl9wcm90b19wdmNfaW5mbyAqZnJfcHZjX2luZm87CisKKwkJLyogaW50ZXJmYWNlIHNldHRpbmdzICovCisJCXN5bmNfc2VyaWFsX3NldHRpbmdzICpzeW5jOworCQl0ZTFfc2V0dGluZ3MJICp0ZTE7CisJfSBpZnNfaWZzdTsKK307CisKKy8qCisgKiBJbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3R1cmUgdXNlZCBmb3Igc29ja2V0CisgKiBpb2N0bCdzLiAgQWxsIGludGVyZmFjZSBpb2N0bCdzIG11c3QgaGF2ZSBwYXJhbWV0ZXIKKyAqIGRlZmluaXRpb25zIHdoaWNoIGJlZ2luIHdpdGggaWZyX25hbWUuICBUaGUKKyAqIHJlbWFpbmRlciBtYXkgYmUgaW50ZXJmYWNlIHNwZWNpZmljLgorICovCisKK3N0cnVjdCBpZnJlcSAKK3sKKyNkZWZpbmUgSUZIV0FERFJMRU4JNgorCXVuaW9uCisJeworCQljaGFyCWlmcm5fbmFtZVtJRk5BTVNJWl07CQkvKiBpZiBuYW1lLCBlLmcuICJlbjAiICovCisJfSBpZnJfaWZybjsKKwkKKwl1bmlvbiB7CisJCXN0cnVjdAlzb2NrYWRkciBpZnJ1X2FkZHI7CisJCXN0cnVjdAlzb2NrYWRkciBpZnJ1X2RzdGFkZHI7CisJCXN0cnVjdAlzb2NrYWRkciBpZnJ1X2Jyb2FkYWRkcjsKKwkJc3RydWN0CXNvY2thZGRyIGlmcnVfbmV0bWFzazsKKwkJc3RydWN0ICBzb2NrYWRkciBpZnJ1X2h3YWRkcjsKKwkJc2hvcnQJaWZydV9mbGFnczsKKwkJaW50CWlmcnVfaXZhbHVlOworCQlpbnQJaWZydV9tdHU7CisJCXN0cnVjdCAgaWZtYXAgaWZydV9tYXA7CisJCWNoYXIJaWZydV9zbGF2ZVtJRk5BTVNJWl07CS8qIEp1c3QgZml0cyB0aGUgc2l6ZSAqLworCQljaGFyCWlmcnVfbmV3bmFtZVtJRk5BTVNJWl07CisJCXZvaWQgKglpZnJ1X2RhdGE7CisJCXN0cnVjdAlpZl9zZXR0aW5ncyBpZnJ1X3NldHRpbmdzOworCX0gaWZyX2lmcnU7Cit9OworCisjZGVmaW5lIGlmcl9uYW1lCWlmcl9pZnJuLmlmcm5fbmFtZQkvKiBpbnRlcmZhY2UgbmFtZSAJKi8KKyNkZWZpbmUgaWZyX2h3YWRkcglpZnJfaWZydS5pZnJ1X2h3YWRkcgkvKiBNQUMgYWRkcmVzcyAJCSovCisjZGVmaW5lCWlmcl9hZGRyCWlmcl9pZnJ1LmlmcnVfYWRkcgkvKiBhZGRyZXNzCQkqLworI2RlZmluZQlpZnJfZHN0YWRkcglpZnJfaWZydS5pZnJ1X2RzdGFkZHIJLyogb3RoZXIgZW5kIG9mIHAtcCBsbmsJKi8KKyNkZWZpbmUJaWZyX2Jyb2FkYWRkcglpZnJfaWZydS5pZnJ1X2Jyb2FkYWRkcgkvKiBicm9hZGNhc3QgYWRkcmVzcwkqLworI2RlZmluZQlpZnJfbmV0bWFzawlpZnJfaWZydS5pZnJ1X25ldG1hc2sJLyogaW50ZXJmYWNlIG5ldCBtYXNrCSovCisjZGVmaW5lCWlmcl9mbGFncwlpZnJfaWZydS5pZnJ1X2ZsYWdzCS8qIGZsYWdzCQkqLworI2RlZmluZQlpZnJfbWV0cmljCWlmcl9pZnJ1LmlmcnVfaXZhbHVlCS8qIG1ldHJpYwkJKi8KKyNkZWZpbmUJaWZyX210dQkJaWZyX2lmcnUuaWZydV9tdHUJLyogbXR1CQkJKi8KKyNkZWZpbmUgaWZyX21hcAkJaWZyX2lmcnUuaWZydV9tYXAJLyogZGV2aWNlIG1hcAkJKi8KKyNkZWZpbmUgaWZyX3NsYXZlCWlmcl9pZnJ1LmlmcnVfc2xhdmUJLyogc2xhdmUgZGV2aWNlCQkqLworI2RlZmluZQlpZnJfZGF0YQlpZnJfaWZydS5pZnJ1X2RhdGEJLyogZm9yIHVzZSBieSBpbnRlcmZhY2UJKi8KKyNkZWZpbmUgaWZyX2lmaW5kZXgJaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogaW50ZXJmYWNlIGluZGV4CSovCisjZGVmaW5lIGlmcl9iYW5kd2lkdGgJaWZyX2lmcnUuaWZydV9pdmFsdWUgICAgLyogbGluayBiYW5kd2lkdGgJKi8KKyNkZWZpbmUgaWZyX3FsZW4JaWZyX2lmcnUuaWZydV9pdmFsdWUJLyogUXVldWUgbGVuZ3RoIAkqLworI2RlZmluZSBpZnJfbmV3bmFtZQlpZnJfaWZydS5pZnJ1X25ld25hbWUJLyogTmV3IG5hbWUJCSovCisjZGVmaW5lIGlmcl9zZXR0aW5ncwlpZnJfaWZydS5pZnJ1X3NldHRpbmdzCS8qIERldmljZS9wcm90byBzZXR0aW5ncyovCisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBpbiBTSU9DR0lGQ09ORiByZXF1ZXN0LgorICogVXNlZCB0byByZXRyaWV2ZSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorICogZm9yIG1hY2hpbmUgKHVzZWZ1bCBmb3IgcHJvZ3JhbXMgd2hpY2gKKyAqIG11c3Qga25vdyBhbGwgbmV0d29ya3MgYWNjZXNzaWJsZSkuCisgKi8KKworc3RydWN0IGlmY29uZiAKK3sKKwlpbnQJaWZjX2xlbjsJCQkvKiBzaXplIG9mIGJ1ZmZlcgkqLworCXVuaW9uIAorCXsKKwkJY2hhciAqaWZjdV9idWY7CisJCXN0cnVjdCBpZnJlcSAqaWZjdV9yZXE7CisJfSBpZmNfaWZjdTsKK307CisjZGVmaW5lCWlmY19idWYJaWZjX2lmY3UuaWZjdV9idWYJCS8qIGJ1ZmZlciBhZGRyZXNzCSovCisjZGVmaW5lCWlmY19yZXEJaWZjX2lmY3UuaWZjdV9yZXEJCS8qIGFycmF5IG9mIHN0cnVjdHVyZXMJKi8KKworI2VuZGlmIC8qIF9MSU5VWF9JRl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmNiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FkZHIuaApAQCAtMCwwICsxLDYwIEBACisjaWZuZGVmIF9fTElOVVhfSUZfQUREUl9ICisjZGVmaW5lIF9fTElOVVhfSUZfQUREUl9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKK3N0cnVjdCBpZmFkZHJtc2cKK3sKKwlfX3U4CQlpZmFfZmFtaWx5OworCV9fdTgJCWlmYV9wcmVmaXhsZW47CS8qIFRoZSBwcmVmaXggbGVuZ3RoCQkqLworCV9fdTgJCWlmYV9mbGFnczsJLyogRmxhZ3MJCQkqLworCV9fdTgJCWlmYV9zY29wZTsJLyogQWRkcmVzcyBzY29wZQkJKi8KKwlfX3UzMgkJaWZhX2luZGV4OwkvKiBMaW5rIGluZGV4CQkJKi8KK307CisKKy8qCisgKiBJbXBvcnRhbnQgY29tbWVudDoKKyAqIElGQV9BRERSRVNTIGlzIHByZWZpeCBhZGRyZXNzLCByYXRoZXIgdGhhbiBsb2NhbCBpbnRlcmZhY2UgYWRkcmVzcy4KKyAqIEl0IG1ha2VzIG5vIGRpZmZlcmVuY2UgZm9yIG5vcm1hbGx5IGNvbmZpZ3VyZWQgYnJvYWRjYXN0IGludGVyZmFjZXMsCisgKiBidXQgZm9yIHBvaW50LXRvLXBvaW50IElGQV9BRERSRVNTIGlzIERFU1RJTkFUSU9OIGFkZHJlc3MsCisgKiBsb2NhbCBhZGRyZXNzIGlzIHN1cHBsaWVkIGluIElGQV9MT0NBTCBhdHRyaWJ1dGUuCisgKi8KK2VudW0KK3sKKwlJRkFfVU5TUEVDLAorCUlGQV9BRERSRVNTLAorCUlGQV9MT0NBTCwKKwlJRkFfTEFCRUwsCisJSUZBX0JST0FEQ0FTVCwKKwlJRkFfQU5ZQ0FTVCwKKwlJRkFfQ0FDSEVJTkZPLAorCUlGQV9NVUxUSUNBU1QsCisJX19JRkFfTUFYLAorfTsKKworI2RlZmluZSBJRkFfTUFYIChfX0lGQV9NQVggLSAxKQorCisvKiBpZmFfZmxhZ3MgKi8KKyNkZWZpbmUgSUZBX0ZfU0VDT05EQVJZCQkweDAxCisjZGVmaW5lIElGQV9GX1RFTVBPUkFSWQkJSUZBX0ZfU0VDT05EQVJZCisKKyNkZWZpbmUJSUZBX0ZfTk9EQUQJCTB4MDIKKyNkZWZpbmUgSUZBX0ZfT1BUSU1JU1RJQwkweDA0CisjZGVmaW5lCUlGQV9GX0hPTUVBRERSRVNTCTB4MTAKKyNkZWZpbmUgSUZBX0ZfREVQUkVDQVRFRAkweDIwCisjZGVmaW5lIElGQV9GX1RFTlRBVElWRQkJMHg0MAorI2RlZmluZSBJRkFfRl9QRVJNQU5FTlQJCTB4ODAKKworc3RydWN0IGlmYV9jYWNoZWluZm8KK3sKKwlfX3UzMglpZmFfcHJlZmVyZWQ7CisJX191MzIJaWZhX3ZhbGlkOworCV9fdTMyCWNzdGFtcDsgLyogY3JlYXRlZCB0aW1lc3RhbXAsIGh1bmRyZWR0aHMgb2Ygc2Vjb25kcyAqLworCV9fdTMyCXRzdGFtcDsgLyogdXBkYXRlZCB0aW1lc3RhbXAsIGh1bmRyZWR0aHMgb2Ygc2Vjb25kcyAqLworfTsKKworLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBJRkFfUlRBKHIpICAoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IGlmYWRkcm1zZykpKSkKKyNkZWZpbmUgSUZBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FyY25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcmNuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VhMmFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcmNuZXQuaApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIElORVQgICAgICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqICAgICAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqICAgICAgICAgICAgICBpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKiAgICAgICAgICAgICAgR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgQVJDbmV0IGludGVyZmFjZS4KKyAqCisgKiBBdXRob3JzOiAgICAgRGF2aWQgV29vZGhvdXNlIGFuZCBBdmVyeSBQZW5uYXJ1bgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgICAgICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgICAgICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0FSQ05FVF9ICisjZGVmaW5lIF9MSU5VWF9JRl9BUkNORVRfSAorCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworCisvKgorICogICAgVGhlc2UgYXJlIHRoZSBkZWZpbmVkIEFSQ25ldCBQcm90b2NvbCBJRCdzLgorICovCisKKy8qIENBUCBtb2RlICovCisvKiBObyBtYWNybyBidXQgdXNlcyAxLTggKi8KKworLyogUkZDMTIwMSBQcm90b2NvbCBJRCdzICovCisjZGVmaW5lIEFSQ19QX0lQCQkyMTIJLyogMHhENCAqLworI2RlZmluZSBBUkNfUF9JUFY2CQkxOTYJLyogMHhDNDogUkZDMjQ5NyAqLworI2RlZmluZSBBUkNfUF9BUlAJCTIxMwkvKiAweEQ1ICovCisjZGVmaW5lIEFSQ19QX1JBUlAJCTIxNAkvKiAweEQ2ICovCisjZGVmaW5lIEFSQ19QX0lQWAkJMjUwCS8qIDB4RkEgKi8KKyNkZWZpbmUgQVJDX1BfTk9WRUxMX0VDCQkyMzYJLyogMHhFQyAqLworCisvKiBPbGQgUkZDMTA1MSBQcm90b2NvbCBJRCdzICovCisjZGVmaW5lIEFSQ19QX0lQX1JGQzEwNTEJMjQwCS8qIDB4RjAgKi8KKyNkZWZpbmUgQVJDX1BfQVJQX1JGQzEwNTEJMjQxCS8qIDB4RjEgKi8KKworLyogTVMgTGFuTWFuL1dmV2cgIk5ESVMiIGVuY2Fwc3VsYXRpb24gKi8KKyNkZWZpbmUgQVJDX1BfRVRIRVIJCTIzMgkvKiAweEU4ICovCisKKy8qIFVuc3VwcG9ydGVkL2luZGlyZWN0bHkgc3VwcG9ydGVkIHByb3RvY29scyAqLworI2RlZmluZSBBUkNfUF9EQVRBUE9JTlRfQk9PVAkwCS8qIHZlcnkgb2xkIERhdGFwb2ludCBlcXVpcG1lbnQgKi8KKyNkZWZpbmUgQVJDX1BfREFUQVBPSU5UX01PVU5UCTEKKyNkZWZpbmUgQVJDX1BfUE9XRVJMQU5fQkVBQ09OCTgJLyogUHJvYmFibHkgQVRBLU5ldGJpb3MgcmVsYXRlZCAqLworI2RlZmluZSBBUkNfUF9QT1dFUkxBTl9CRUFDT04yCTI0MwkvKiAweEYzICovCisjZGVmaW5lIEFSQ19QX0xBTlNPRlQJCTI1MQkvKiAweEZCIC0gd2hhdCBpcyB0aGlzPyAqLworI2RlZmluZSBBUkNfUF9BVEFMSwkJMHhERAorCisvKiBIYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZSBBUkNORVRfQUxFTgkxCisKKy8qCisgKiBUaGUgUkZDMTIwMS1zcGVjaWZpYyBjb21wb25lbnRzIG9mIGFuIGFyY25ldCBwYWNrZXQgaGVhZGVyLgorICovCitzdHJ1Y3QgYXJjX3JmYzEyMDEKK3sKKyAgICB1aW50OF90ICBwcm90bzsJCS8qIHByb3RvY29sIElEIGZpZWxkIC0gdmFyaWVzCQkqLworICAgIHVpbnQ4X3QgIHNwbGl0X2ZsYWc7CS8qIGZvciB1c2Ugd2l0aCBzcGxpdCBwYWNrZXRzCQkqLworICAgIF9fYmUxNiAgIHNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyCQkJKi8KKyAgICB1aW50OF90ICBwYXlsb2FkWzBdOwkvKiBzcGFjZSByZW1haW5pbmcgaW4gcGFja2V0ICg1MDQgYnl0ZXMpKi8KK307CisjZGVmaW5lIFJGQzEyMDFfSERSX1NJWkUgNAorCisKKy8qCisgKiBUaGUgUkZDMTA1MS1zcGVjaWZpYyBjb21wb25lbnRzLgorICovCitzdHJ1Y3QgYXJjX3JmYzEwNTEKK3sKKyAgICB1aW50OF90IHByb3RvOwkJLyogQVJDX1BfUkZDMTA1MV9BUlAvUkZDMTA1MV9JUAkqLworICAgIHVpbnQ4X3QgcGF5bG9hZFswXTsJCS8qIDUwNyBieXRlcwkJCSovCit9OworI2RlZmluZSBSRkMxMDUxX0hEUl9TSVpFIDEKKworCisvKgorICogVGhlIGV0aGVybmV0LWVuY2FwLXNwZWNpZmljIGNvbXBvbmVudHMuICBXZSBoYXZlIGEgcmVhbCBldGhlcm5ldCBoZWFkZXIKKyAqIGFuZCBzb21lIGRhdGEuCisgKi8KK3N0cnVjdCBhcmNfZXRoX2VuY2FwCit7CisgICAgdWludDhfdCBwcm90bzsJCS8qIEFsd2F5cyBBUkNfUF9FVEhFUgkJCSovCisgICAgc3RydWN0IGV0aGhkciBldGg7CQkvKiBzdGFuZGFyZCBldGhlcm5ldCBoZWFkZXIgKHl1Y2shKQkqLworICAgIHVpbnQ4X3QgcGF5bG9hZFswXTsJCS8qIDQ5MyBieXRlcwkJCQkqLworfTsKKyNkZWZpbmUgRVRIX0VOQ0FQX0hEUl9TSVpFIDE0CisKKworc3RydWN0IGFyY19jYXAKK3sKKwl1aW50OF90IHByb3RvOworCXVpbnQ4X3QgY29va2llW3NpemVvZihpbnQpXTsgICAvKiBBY3R1YWxseSBOT1Qgc2VudCBvdmVyIHRoZSBuZXR3b3JrICovCisJdW5pb24geworCQl1aW50OF90IGFjazsKKwkJdWludDhfdCByYXdbMF07CQkvKiA1MDcgYnl0ZXMgKi8KKwl9IG1lczsKK307CisKKy8qCisgKiBUaGUgZGF0YSBuZWVkZWQgYnkgdGhlIGFjdHVhbCBhcmNuZXQgaGFyZHdhcmUuCisgKgorICogTm93LCBpbiB0aGUgcmVhbCBhcmNuZXQgaGFyZHdhcmUsIHRoZSB0aGlyZCBhbmQgZm91cnRoIGJ5dGVzIGFyZSB0aGUKKyAqICdvZmZzZXQnIHNwZWNpZmljYXRpb24gaW5zdGVhZCBvZiB0aGUgbGVuZ3RoLCBhbmQgdGhlIHNvZnQgZGF0YSBpcyBhdAorICogdGhlIF9lbmRfIG9mIHRoZSA1MTItYnl0ZSBidWZmZXIuICBXZSBoaWRlIHRoaXMgY29tcGxleGl0eSBpbnNpZGUgdGhlCisgKiBkcml2ZXIuCisgKi8KK3N0cnVjdCBhcmNfaGFyZHdhcmUKK3sKKyAgICB1aW50OF90ICBzb3VyY2UsCQkvKiBzb3VyY2UgQVJDbmV0IC0gZmlsbGVkIGluIGF1dG9tYWdpY2FsbHkgKi8KKyAgICAgICAgICAgICBkZXN0LAkJLyogZGVzdGluYXRpb24gQVJDbmV0IC0gMCBmb3IgYnJvYWRjYXN0ICAgICovCisgICAgCSAgICAgb2Zmc2V0WzJdOwkJLyogb2Zmc2V0IGJ5dGVzIChzb21lIHdlaXJkIHNlbWFudGljcykgICAgICovCit9OworI2RlZmluZSBBUkNfSERSX1NJWkUgNAorCisvKgorICogVGhpcyBpcyBhbiBBUkNuZXQgZnJhbWUgaGVhZGVyLCBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwgKGFuZCB1c2Vyc3BhY2UsCisgKiB3aGVuIHlvdSBkbyBhIHJhdyBwYWNrZXQgY2FwdHVyZSkuCisgKi8KK3N0cnVjdCBhcmNoZHIKK3sKKyAgICAvKiBoYXJkd2FyZSByZXF1aXJlbWVudHMgKi8KKyAgICBzdHJ1Y3QgYXJjX2hhcmR3YXJlIGhhcmQ7CisgICAgIAorICAgIC8qIGFyY25ldCBlbmNhcHN1bGF0aW9uLXNwZWNpZmljIGJpdHMgKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IGFyY19yZmMxMjAxICAgcmZjMTIwMTsKKwlzdHJ1Y3QgYXJjX3JmYzEwNTEgICByZmMxMDUxOworCXN0cnVjdCBhcmNfZXRoX2VuY2FwIGV0aF9lbmNhcDsKKwlzdHJ1Y3QgYXJjX2NhcCAgICAgICBjYXA7CisJdWludDhfdCByYXdbMF07CQkvKiA1MDggYnl0ZXMJCQkJKi8KKyAgICB9IHNvZnQ7Cit9OworCisjZW5kaWYJCQkJLyogX0xJTlVYX0lGX0FSQ05FVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2FycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzMwOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9hcnAuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBBUlAgKFJGQyA4MjYpIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIylpZl9hcnAuaAkxLjAuMQkwNC8xNi85MworICoKKyAqIEF1dGhvcnM6CU9yaWdpbmFsIHRha2VuIGZyb20gQmVya2VsZXkgVU5JWCA0LjMsIChjKSBVQ0IgMTk4Ni0xOTg4CisgKgkJUG9ydGlvbnMgdGFrZW4gZnJvbSB0aGUgS0E5US9OT1MgKHYyLjAwbSBQQTBHUkkpIHNvdXJjZS4KKyAqCQlSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlGbG9yaWFuIExhIFJvY2hlLAorICoJCUpvbmF0aGFuIExheWVzIDxsYXllc0Bsb3Jhbi5jb20+CisgKgkJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IEFSUEhSRF9IV1gyNQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9JRl9BUlBfSAorI2RlZmluZSBfTElOVVhfSUZfQVJQX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisvKiBBUlAgcHJvdG9jb2wgSEFSRFdBUkUgaWRlbnRpZmllcnMuICovCisjZGVmaW5lIEFSUEhSRF9ORVRST00JMAkJLyogZnJvbSBLQTlROiBORVQvUk9NIHBzZXVkbwkqLworI2RlZmluZSBBUlBIUkRfRVRIRVIgCTEJCS8qIEV0aGVybmV0IDEwTWJwcwkJKi8KKyNkZWZpbmUJQVJQSFJEX0VFVEhFUgkyCQkvKiBFeHBlcmltZW50YWwgRXRoZXJuZXQJKi8KKyNkZWZpbmUJQVJQSFJEX0FYMjUJMwkJLyogQVguMjUgTGV2ZWwgMgkJKi8KKyNkZWZpbmUJQVJQSFJEX1BST05FVAk0CQkvKiBQUk9uZXQgdG9rZW4gcmluZwkJKi8KKyNkZWZpbmUJQVJQSFJEX0NIQU9TCTUJCS8qIENoYW9zbmV0CQkJKi8KKyNkZWZpbmUJQVJQSFJEX0lFRUU4MDIJNgkJLyogSUVFRSA4MDIuMiBFdGhlcm5ldC9UUi9UQgkqLworI2RlZmluZQlBUlBIUkRfQVJDTkVUCTcJCS8qIEFSQ25ldAkJCSovCisjZGVmaW5lCUFSUEhSRF9BUFBMRVRMSwk4CQkvKiBBUFBMRXRhbGsJCQkqLworI2RlZmluZSBBUlBIUkRfRExDSQkxNQkJLyogRnJhbWUgUmVsYXkgRExDSQkJKi8KKyNkZWZpbmUgQVJQSFJEX0FUTQkxOQkJLyogQVRNIAkJCQkqLworI2RlZmluZSBBUlBIUkRfTUVUUklDT00JMjMJCS8qIE1ldHJpY29tIFNUUklQIChuZXcgSUFOQSBpZCkJKi8KKyNkZWZpbmUJQVJQSFJEX0lFRUUxMzk0CTI0CQkvKiBJRUVFIDEzOTQgSVB2NCAtIFJGQyAyNzM0CSovCisjZGVmaW5lIEFSUEhSRF9FVUk2NAkyNwkJLyogRVVJLTY0ICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBUlBIUkRfSU5GSU5JQkFORCAzMgkJLyogSW5maW5pQmFuZAkJCSovCisKKy8qIER1bW15IHR5cGVzIGZvciBub24gQVJQIGhhcmR3YXJlICovCisjZGVmaW5lIEFSUEhSRF9TTElQCTI1NgorI2RlZmluZSBBUlBIUkRfQ1NMSVAJMjU3CisjZGVmaW5lIEFSUEhSRF9TTElQNgkyNTgKKyNkZWZpbmUgQVJQSFJEX0NTTElQNgkyNTkKKyNkZWZpbmUgQVJQSFJEX1JTUlZECTI2MAkJLyogTm90aW9uYWwgS0lTUyB0eXBlIAkJKi8KKyNkZWZpbmUgQVJQSFJEX0FEQVBUCTI2NAorI2RlZmluZSBBUlBIUkRfUk9TRQkyNzAKKyNkZWZpbmUgQVJQSFJEX1gyNQkyNzEJCS8qIENDSVRUIFguMjUJCQkqLworI2RlZmluZSBBUlBIUkRfSFdYMjUJMjcyCQkvKiBCb2FyZHMgd2l0aCBYLjI1IGluIGZpcm13YXJlCSovCisjZGVmaW5lIEFSUEhSRF9QUFAJNTEyCisjZGVmaW5lIEFSUEhSRF9DSVNDTwk1MTMJCS8qIENpc2NvIEhETEMJIAkJKi8KKyNkZWZpbmUgQVJQSFJEX0hETEMJQVJQSFJEX0NJU0NPCisjZGVmaW5lIEFSUEhSRF9MQVBCCTUxNgkJLyogTEFQQgkJCQkqLworI2RlZmluZSBBUlBIUkRfRERDTVAgICAgNTE3CQkvKiBEaWdpdGFsJ3MgRERDTVAgcHJvdG9jb2wgICAgICovCisjZGVmaW5lIEFSUEhSRF9SQVdIRExDCTUxOAkJLyogUmF3IEhETEMJCQkqLworCisjZGVmaW5lIEFSUEhSRF9UVU5ORUwJNzY4CQkvKiBJUElQIHR1bm5lbAkJCSovCisjZGVmaW5lIEFSUEhSRF9UVU5ORUw2CTc2OQkJLyogSVA2SVA2IHR1bm5lbCAgICAgICAJCSovCisjZGVmaW5lIEFSUEhSRF9GUkFECTc3MCAgICAgICAgICAgICAvKiBGcmFtZSBSZWxheSBBY2Nlc3MgRGV2aWNlICAgICovCisjZGVmaW5lIEFSUEhSRF9TS0lQCTc3MQkJLyogU0tJUCB2aWYJCQkqLworI2RlZmluZSBBUlBIUkRfTE9PUEJBQ0sJNzcyCQkvKiBMb29wYmFjayBkZXZpY2UJCSovCisjZGVmaW5lIEFSUEhSRF9MT0NBTFRMSyA3NzMJCS8qIExvY2FsdGFsayBkZXZpY2UJCSovCisjZGVmaW5lIEFSUEhSRF9GRERJCTc3NAkJLyogRmliZXIgRGlzdHJpYnV0ZWQgRGF0YSBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQVJQSFJEX0JJRiAgICAgIDc3NSAgICAgICAgICAgICAvKiBBUDEwMDAgQklGICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFSUEhSRF9TSVQJNzc2CQkvKiBzaXQwIGRldmljZSAtIElQdjYtaW4tSVB2NAkqLworI2RlZmluZSBBUlBIUkRfSVBERFAJNzc3CQkvKiBJUCBvdmVyIEREUCB0dW5uZWxsZXIJKi8KKyNkZWZpbmUgQVJQSFJEX0lQR1JFCTc3OAkJLyogR1JFIG92ZXIgSVAJCQkqLworI2RlZmluZSBBUlBIUkRfUElNUkVHCTc3OQkJLyogUElNU00gcmVnaXN0ZXIgaW50ZXJmYWNlCSovCisjZGVmaW5lIEFSUEhSRF9ISVBQSQk3ODAJCS8qIEhpZ2ggUGVyZm9ybWFuY2UgUGFyYWxsZWwgSW50ZXJmYWNlICovCisjZGVmaW5lIEFSUEhSRF9BU0gJNzgxCQkvKiBOZXh1cyA2NE1icHMgQXNoCQkqLworI2RlZmluZSBBUlBIUkRfRUNPTkVUCTc4MgkJLyogQWNvcm4gRWNvbmV0CQkJKi8KKyNkZWZpbmUgQVJQSFJEX0lSREEgCTc4MwkJLyogTGludXgtSXJEQQkJCSovCisvKiBBUlAgd29ya3MgZGlmZmVyZW50bHkgb24gZGlmZmVyZW50IEZDIG1lZGlhIC4uIHNvICAqLworI2RlZmluZSBBUlBIUkRfRkNQUAk3ODQJCS8qIFBvaW50IHRvIHBvaW50IGZpYnJlY2hhbm5lbAkqLworI2RlZmluZSBBUlBIUkRfRkNBTAk3ODUJCS8qIEZpYnJlY2hhbm5lbCBhcmJpdHJhdGVkIGxvb3AgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUEwJNzg2CQkvKiBGaWJyZWNoYW5uZWwgcHVibGljIGxvb3AJKi8KKyNkZWZpbmUgQVJQSFJEX0ZDRkFCUklDCTc4NwkJLyogRmlicmVjaGFubmVsIGZhYnJpYwkJKi8KKwkvKiA3ODctPjc5OSByZXNlcnZlZCBmb3IgZmlicmVjaGFubmVsIG1lZGlhIHR5cGVzICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyX1RSIDgwMAkJLyogTWFnaWMgdHlwZSBpZGVudCBmb3IgVFIJKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMSA4MDEJCS8qIElFRUUgODAyLjExCQkJKi8KKyNkZWZpbmUgQVJQSFJEX0lFRUU4MDIxMV9QUklTTSA4MDIJLyogSUVFRSA4MDIuMTEgKyBQcmlzbTIgaGVhZGVyICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQIDgwMwkvKiBJRUVFIDgwMi4xMSArIHJhZGlvdGFwIGhlYWRlciAqLworCisjZGVmaW5lIEFSUEhSRF9WT0lECSAgMHhGRkZGCS8qIFZvaWQgdHlwZSwgbm90aGluZyBpcyBrbm93biAqLworI2RlZmluZSBBUlBIUkRfTk9ORQkgIDB4RkZGRQkvKiB6ZXJvIGhlYWRlciBsZW5ndGggKi8KKworLyogQVJQIHByb3RvY29sIG9wY29kZXMuICovCisjZGVmaW5lCUFSUE9QX1JFUVVFU1QJMQkJLyogQVJQIHJlcXVlc3QJCQkqLworI2RlZmluZQlBUlBPUF9SRVBMWQkyCQkvKiBBUlAgcmVwbHkJCQkqLworI2RlZmluZQlBUlBPUF9SUkVRVUVTVAkzCQkvKiBSQVJQIHJlcXVlc3QJCQkqLworI2RlZmluZQlBUlBPUF9SUkVQTFkJNAkJLyogUkFSUCByZXBseQkJCSovCisjZGVmaW5lCUFSUE9QX0luUkVRVUVTVAk4CQkvKiBJbkFSUCByZXF1ZXN0CQkqLworI2RlZmluZQlBUlBPUF9JblJFUExZCTkJCS8qIEluQVJQIHJlcGx5CQkJKi8KKyNkZWZpbmUJQVJQT1BfTkFLCTEwCQkvKiAoQVRNKUFSUCBOQUsJCQkqLworCisKKy8qIEFSUCBpb2N0bCByZXF1ZXN0LiAqLworc3RydWN0IGFycHJlcSB7CisgIHN0cnVjdCBzb2NrYWRkcglhcnBfcGE7CQkvKiBwcm90b2NvbCBhZGRyZXNzCQkqLworICBzdHJ1Y3Qgc29ja2FkZHIJYXJwX2hhOwkJLyogaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyAgaW50CQkJYXJwX2ZsYWdzOwkvKiBmbGFncwkJCSovCisgIHN0cnVjdCBzb2NrYWRkciAgICAgICBhcnBfbmV0bWFzazsgICAgLyogbmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykgKi8KKyAgY2hhcgkJCWFycF9kZXZbMTZdOworfTsKKworc3RydWN0IGFycHJlcV9vbGQgeworICBzdHJ1Y3Qgc29ja2FkZHIJYXJwX3BhOwkJLyogcHJvdG9jb2wgYWRkcmVzcwkJKi8KKyAgc3RydWN0IHNvY2thZGRyCWFycF9oYTsJCS8qIGhhcmR3YXJlIGFkZHJlc3MJCSovCisgIGludAkJCWFycF9mbGFnczsJLyogZmxhZ3MJCQkqLworICBzdHJ1Y3Qgc29ja2FkZHIgICAgICAgYXJwX25ldG1hc2s7ICAgIC8qIG5ldG1hc2sgKG9ubHkgZm9yIHByb3h5IGFycHMpICovCit9OworCisvKiBBUlAgRmxhZyB2YWx1ZXMuICovCisjZGVmaW5lIEFURl9DT00JCTB4MDIJCS8qIGNvbXBsZXRlZCBlbnRyeSAoaGEgdmFsaWQpCSovCisjZGVmaW5lCUFURl9QRVJNCTB4MDQJCS8qIHBlcm1hbmVudCBlbnRyeQkJKi8KKyNkZWZpbmUJQVRGX1BVQkwJMHgwOAkJLyogcHVibGlzaCBlbnRyeQkJKi8KKyNkZWZpbmUJQVRGX1VTRVRSQUlMRVJTCTB4MTAJCS8qIGhhcyByZXF1ZXN0ZWQgdHJhaWxlcnMJKi8KKyNkZWZpbmUgQVRGX05FVE1BU0sgICAgIDB4MjAgICAgICAgICAgICAvKiB3YW50IHRvIHVzZSBhIG5ldG1hc2sgKG9ubHkKKwkJCQkJICAgZm9yIHByb3h5IGVudHJpZXMpICovCisjZGVmaW5lIEFURl9ET05UUFVCCTB4NDAJCS8qIGRvbid0IGFuc3dlciB0aGlzIGFkZHJlc3NlcwkqLworCisvKgorICoJVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBldGhlcm5ldCBhcnAgaGVhZGVyLgorICovCisKK3N0cnVjdCBhcnBoZHIKK3sKKwlfX2JlMTYJCWFyX2hyZDsJCS8qIGZvcm1hdCBvZiBoYXJkd2FyZSBhZGRyZXNzCSovCisJX19iZTE2CQlhcl9wcm87CQkvKiBmb3JtYXQgb2YgcHJvdG9jb2wgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJYXJfaGxuOwkJLyogbGVuZ3RoIG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWFyX3BsbjsJCS8qIGxlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzCSovCisJX19iZTE2CQlhcl9vcDsJCS8qIEFSUCBvcGNvZGUgKGNvbW1hbmQpCQkqLworCisjaWYgMAorCSAvKgorCSAgKgkgRXRoZXJuZXQgbG9va3MgbGlrZSB0aGlzIDogVGhpcyBiaXQgaXMgdmFyaWFibGUgc2l6ZWQgaG93ZXZlci4uLgorCSAgKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl9zaGFbRVRIX0FMRU5dOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3NpcFs0XTsJCS8qIHNlbmRlciBJUCBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcgkJYXJfdGlwWzRdOwkJLyogdGFyZ2V0IElQIGFkZHJlc3MJCSovCisjZW5kaWYKKworfTsKKworCisjZW5kaWYJLyogX0xJTlVYX0lGX0FSUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYm9uZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzJkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIEJvbmQgc2V2ZXJhbCBldGhlcm5ldCBpbnRlcmZhY2VzIGludG8gYSBDaXNjbywgcnVubmluZyAnRXRoZXJjaGFubmVsJy4KKyAqCisgKgorICogUG9ydGlvbnMgYXJlIChjKSBDb3B5cmlnaHQgMTk5NSBTaW1vbiAiR3VydSBBbGVwaC1OdWxsIiBKYW5lcworICogTkNNOiBOZXR3b3JrIGFuZCBDb21tdW5pY2F0aW9ucyBNYW5hZ2VtZW50LCBJbmMuCisgKgorICogQlVULCBJJ20gdGhlIG9uZSB3aG8gbW9kaWZpZWQgaXQgZm9yIGV0aGVybmV0LCBzbzoKKyAqIChjKSBDb3B5cmlnaHQgMTk5OSwgVGhvbWFzIERhdmlzLCB0YWRhdmlzQGxibC5nb3YKKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAyMDAzLzAzLzE4IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgZ2V0dGluZyBzbGF2ZSdzIHNwZWVkIGFuZCBkdXBsZXggdmlhIGV0aHRvb2wuCisgKgkgIE5lZWRlZCBmb3IgODAyLjNhZCBhbmQgb3RoZXIgZnV0dXJlIG1vZGVzLgorICoKKyAqIDIwMDMvMDMvMTggLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCVNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBFbmFibGUgc3VwcG9ydCBvZiBtb2RlcyB0aGF0IG5lZWQgdG8gdXNlIHRoZSB1bmlxdWUgbWFjIGFkZHJlc3Mgb2YKKyAqCSAgZWFjaCBzbGF2ZS4KKyAqCisgKiAyMDAzLzAzLzE4IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBNb3ZlZCBkcml2ZXIncyBwcml2YXRlIGRhdGEgdHlwZXMgdG8gYm9uZGluZy5oCisgKgorICogMjAwMy8wMy8xOCAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+LAorICoJCVRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIElFRUUgODAyLjNhZCBEeW5hbWljIGxpbmsgYWdncmVnYXRpb24gbW9kZS4KKyAqCisgKiAyMDAzLzA1LzAxIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgQUJJIHZlcnNpb24gY29udHJvbCB0byByZXN0b3JlIGNvbXBhdGliaWxpdHkgYmV0d2VlbgorICoJICBuZXcvb2xkIGlmZW5zbGF2ZSBhbmQgbmV3L29sZCBib25kaW5nLgorICoKKyAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKgorICogMjAwNS8wNS8wNSAtIEphc29uIEdhYmxlciA8anlnYWJsZXIgYXQgbGJsIGRvdCBnb3Y+CisgKiAgICAgIC0gYWRkZWQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgWE9SIGhhc2hpbmcgcG9saWNpZXMKKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9CT05ESU5HX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0JPTkRJTkdfSAorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKKy8qIHVzZXJsYW5kIC0ga2VybmVsIEFCSSB2ZXJzaW9uICgyMDAzLzA1LzA4KSAqLworI2RlZmluZSBCT05EX0FCSV9WRVJTSU9OIDIKKworLyoKKyAqIFdlIGNhbiByZW1vdmUgdGhlc2UgaW9jdGwgZGVmaW5pdGlvbnMgaW4gMi41LiAgUGVvcGxlIHNob3VsZCB1c2UgdGhlCisgKiBTSU9DKioqIHZlcnNpb25zIG9mIHRoZW0gaW5zdGVhZAorICovCisjZGVmaW5lIEJPTkRfRU5TTEFWRV9PTEQJCShTSU9DREVWUFJJVkFURSkKKyNkZWZpbmUgQk9ORF9SRUxFQVNFX09MRAkJKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgQk9ORF9TRVRIV0FERFJfT0xECQkoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBCT05EX1NMQVZFX0lORk9fUVVFUllfT0xECShTSU9DREVWUFJJVkFURSArIDExKQorI2RlZmluZSBCT05EX0lORk9fUVVFUllfT0xECQkoU0lPQ0RFVlBSSVZBVEUgKyAxMikKKyNkZWZpbmUgQk9ORF9DSEFOR0VfQUNUSVZFX09MRAkJKFNJT0NERVZQUklWQVRFICsgMTMpCisKKyNkZWZpbmUgQk9ORF9DSEVDS19NSUlfU1RBVFVTCShTSU9DR01JSVBIWSkKKworI2RlZmluZSBCT05EX01PREVfUk9VTkRST0JJTgkwCisjZGVmaW5lIEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVAJMQorI2RlZmluZSBCT05EX01PREVfWE9SCQkyCisjZGVmaW5lIEJPTkRfTU9ERV9CUk9BRENBU1QJMworI2RlZmluZSBCT05EX01PREVfODAyM0FEICAgICAgICA0CisjZGVmaW5lIEJPTkRfTU9ERV9UTEIgICAgICAgICAgIDUKKyNkZWZpbmUgQk9ORF9NT0RFX0FMQgkJNiAvKiBUTEIgKyBSTEIgKHJlY2VpdmUgbG9hZCBiYWxhbmNpbmcpICovCisKKy8qIGVhY2ggc2xhdmUncyBsaW5rIGhhcyA0IHN0YXRlcyAqLworI2RlZmluZSBCT05EX0xJTktfVVAgICAgMCAgICAgICAgICAgLyogbGluayBpcyB1cCBhbmQgcnVubmluZyAqLworI2RlZmluZSBCT05EX0xJTktfRkFJTCAgMSAgICAgICAgICAgLyogbGluayBoYXMganVzdCBnb25lIGRvd24gKi8KKyNkZWZpbmUgQk9ORF9MSU5LX0RPV04gIDIgICAgICAgICAgIC8qIGxpbmsgaGFzIGJlZW4gZG93biBmb3IgdG9vIGxvbmcgdGltZSAqLworI2RlZmluZSBCT05EX0xJTktfQkFDSyAgMyAgICAgICAgICAgLyogbGluayBpcyBnb2luZyBiYWNrICovCisKKy8qIGVhY2ggc2xhdmUgaGFzIHNldmVyYWwgc3RhdGVzICovCisjZGVmaW5lIEJPTkRfU1RBVEVfQUNUSVZFICAgICAgIDAgICAvKiBsaW5rIGlzIGFjdGl2ZSAqLworI2RlZmluZSBCT05EX1NUQVRFX0JBQ0tVUCAgICAgICAxICAgLyogbGluayBpcyBiYWNrdXAgKi8KKworI2RlZmluZSBCT05EX0RFRkFVTFRfTUFYX0JPTkRTICAxICAgLyogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHRvIHN1cHBvcnQgKi8KKworLyogaGFzaGluZyB0eXBlcyAqLworI2RlZmluZSBCT05EX1hNSVRfUE9MSUNZX0xBWUVSMgkJMCAvKiBsYXllciAyIChNQUMgb25seSksIGRlZmF1bHQgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjM0CTEgLyogbGF5ZXIgMys0IChJUCBeIChUQ1AgfHwgVURQKSkgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIzCTIgLyogbGF5ZXIgMiszIChJUCBeIE1BQykgKi8KKwordHlwZWRlZiBzdHJ1Y3QgaWZib25kIHsKKwlfX3MzMiBib25kX21vZGU7CisJX19zMzIgbnVtX3NsYXZlczsKKwlfX3MzMiBtaWltb247Cit9IGlmYm9uZDsKKwordHlwZWRlZiBzdHJ1Y3QgaWZzbGF2ZQoreworCV9fczMyIHNsYXZlX2lkOyAvKiBVc2VkIGFzIGFuIElOIHBhcmFtIHRvIHRoZSBCT05EX1NMQVZFX0lORk9fUVVFUlkgaW9jdGwgKi8KKwljaGFyIHNsYXZlX25hbWVbSUZOQU1TSVpdOworCV9fczggbGluazsKKwlfX3M4IHN0YXRlOworCV9fdTMyICBsaW5rX2ZhaWx1cmVfY291bnQ7Cit9IGlmc2xhdmU7CisKK3N0cnVjdCBhZF9pbmZvIHsKKwlfX3UxNiBhZ2dyZWdhdG9yX2lkOworCV9fdTE2IHBvcnRzOworCV9fdTE2IGFjdG9yX2tleTsKKwlfX3UxNiBwYXJ0bmVyX2tleTsKKwlfX3U4IHBhcnRuZXJfc3lzdGVtW0VUSF9BTEVOXTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfSUZfQk9ORElOR19IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2MThlOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKglMaW51eCBldGhlcm5ldCBicmlkZ2UKKyAqCisgKglBdXRob3JzOgorICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+CisgKgorICoJJElkOiBpZl9icmlkZ2UuaCx2IDEuMSAyMDAwLzAyLzE4IDE2OjQ3OjAxIGRhdmVtIEV4cCAkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JRl9CUklER0VfSAorI2RlZmluZSBfTElOVVhfSUZfQlJJREdFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgU1lTRlNfQlJJREdFX0FUVFIJImJyaWRnZSIKKyNkZWZpbmUgU1lTRlNfQlJJREdFX0ZEQgkiYnJmb3J3YXJkIgorI2RlZmluZSBTWVNGU19CUklER0VfUE9SVF9TVUJESVIgImJyaWYiCisjZGVmaW5lIFNZU0ZTX0JSSURHRV9QT1JUX0FUVFIJImJycG9ydCIKKyNkZWZpbmUgU1lTRlNfQlJJREdFX1BPUlRfTElOSwkiYnJpZGdlIgorCisjZGVmaW5lIEJSQ1RMX1ZFUlNJT04gMQorCisjZGVmaW5lIEJSQ1RMX0dFVF9WRVJTSU9OIDAKKyNkZWZpbmUgQlJDVExfR0VUX0JSSURHRVMgMQorI2RlZmluZSBCUkNUTF9BRERfQlJJREdFIDIKKyNkZWZpbmUgQlJDVExfREVMX0JSSURHRSAzCisjZGVmaW5lIEJSQ1RMX0FERF9JRiA0CisjZGVmaW5lIEJSQ1RMX0RFTF9JRiA1CisjZGVmaW5lIEJSQ1RMX0dFVF9CUklER0VfSU5GTyA2CisjZGVmaW5lIEJSQ1RMX0dFVF9QT1JUX0xJU1QgNworI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX0ZPUldBUkRfREVMQVkgOAorI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX0hFTExPX1RJTUUgOQorI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX01BWF9BR0UgMTAKKyNkZWZpbmUgQlJDVExfU0VUX0FHRUlOR19USU1FIDExCisjZGVmaW5lIEJSQ1RMX1NFVF9HQ19JTlRFUlZBTCAxMgorI2RlZmluZSBCUkNUTF9HRVRfUE9SVF9JTkZPIDEzCisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfU1RQX1NUQVRFIDE0CisjZGVmaW5lIEJSQ1RMX1NFVF9CUklER0VfUFJJT1JJVFkgMTUKKyNkZWZpbmUgQlJDVExfU0VUX1BPUlRfUFJJT1JJVFkgMTYKKyNkZWZpbmUgQlJDVExfU0VUX1BBVEhfQ09TVCAxNworI2RlZmluZSBCUkNUTF9HRVRfRkRCX0VOVFJJRVMgMTgKKworI2RlZmluZSBCUl9TVEFURV9ESVNBQkxFRCAwCisjZGVmaW5lIEJSX1NUQVRFX0xJU1RFTklORyAxCisjZGVmaW5lIEJSX1NUQVRFX0xFQVJOSU5HIDIKKyNkZWZpbmUgQlJfU1RBVEVfRk9SV0FSRElORyAzCisjZGVmaW5lIEJSX1NUQVRFX0JMT0NLSU5HIDQKKworc3RydWN0IF9fYnJpZGdlX2luZm8KK3sKKwlfX3U2NCBkZXNpZ25hdGVkX3Jvb3Q7CisJX191NjQgYnJpZGdlX2lkOworCV9fdTMyIHJvb3RfcGF0aF9jb3N0OworCV9fdTMyIG1heF9hZ2U7CisJX191MzIgaGVsbG9fdGltZTsKKwlfX3UzMiBmb3J3YXJkX2RlbGF5OworCV9fdTMyIGJyaWRnZV9tYXhfYWdlOworCV9fdTMyIGJyaWRnZV9oZWxsb190aW1lOworCV9fdTMyIGJyaWRnZV9mb3J3YXJkX2RlbGF5OworCV9fdTggdG9wb2xvZ3lfY2hhbmdlOworCV9fdTggdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkOworCV9fdTggcm9vdF9wb3J0OworCV9fdTggc3RwX2VuYWJsZWQ7CisJX191MzIgYWdlaW5nX3RpbWU7CisJX191MzIgZ2NfaW50ZXJ2YWw7CisJX191MzIgaGVsbG9fdGltZXJfdmFsdWU7CisJX191MzIgdGNuX3RpbWVyX3ZhbHVlOworCV9fdTMyIHRvcG9sb2d5X2NoYW5nZV90aW1lcl92YWx1ZTsKKwlfX3UzMiBnY190aW1lcl92YWx1ZTsKK307CisKK3N0cnVjdCBfX3BvcnRfaW5mbworeworCV9fdTY0IGRlc2lnbmF0ZWRfcm9vdDsKKwlfX3U2NCBkZXNpZ25hdGVkX2JyaWRnZTsKKwlfX3UxNiBwb3J0X2lkOworCV9fdTE2IGRlc2lnbmF0ZWRfcG9ydDsKKwlfX3UzMiBwYXRoX2Nvc3Q7CisJX191MzIgZGVzaWduYXRlZF9jb3N0OworCV9fdTggc3RhdGU7CisJX191OCB0b3BfY2hhbmdlX2FjazsKKwlfX3U4IGNvbmZpZ19wZW5kaW5nOworCV9fdTggdW51c2VkMDsKKwlfX3UzMiBtZXNzYWdlX2FnZV90aW1lcl92YWx1ZTsKKwlfX3UzMiBmb3J3YXJkX2RlbGF5X3RpbWVyX3ZhbHVlOworCV9fdTMyIGhvbGRfdGltZXJfdmFsdWU7Cit9OworCitzdHJ1Y3QgX19mZGJfZW50cnkKK3sKKwlfX3U4IG1hY19hZGRyWzZdOworCV9fdTggcG9ydF9ubzsKKwlfX3U4IGlzX2xvY2FsOworCV9fdTMyIGFnZWluZ190aW1lcl92YWx1ZTsKKwlfX3UzMiB1bnVzZWQ7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9jYWJsZW1vZGVtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2NhYmxlbW9kZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ExMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9jYWJsZW1vZGVtLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfTElOVVhfQ0FCTEVNT0RFTV9IXworI2RlZmluZSBfTElOVVhfQ0FCTEVNT0RFTV9IXworLyoKKyAqCQlBdXRob3I6IEZyYW5jbyBWZW50dXJpIDxmdmVudHVyaUBtZWRpYW9uZS5uZXQ+CisgKgkJQ29weXJpZ2h0IDE5OTggRnJhbmNvIFZlbnR1cmkKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKgkJYW5kL29yICBtb2RpZnkgaXQgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsCisgKgkJUHVibGljICBMaWNlbnNlIGFzICBwdWJsaXNoZWQgIGJ5ICB0aGUgIEZyZWUgIFNvZnR3YXJlCisgKgkJRm91bmRhdGlvbjsgIGVpdGhlciAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgKGF0CisgKgkJeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIHNvbWUgdXNlZnVsIGRlZmluZXMgZm9yIHNiMTAwMC5jIGUgY21jb25maWcuYyAtIGZ2ICovCisjZGVmaW5lIFNJT0NHQ01TVEFUUwkJU0lPQ0RFVlBSSVZBVEUrMAkvKiBnZXQgY2FibGUgbW9kZW0gc3RhdHMgKi8KKyNkZWZpbmUgU0lPQ0dDTUZJUk1XQVJFCQlTSU9DREVWUFJJVkFURSsxCS8qIGdldCBjbSBmaXJtd2FyZSB2ZXJzaW9uICovCisjZGVmaW5lIFNJT0NHQ01GUkVRVUVOQ1kJU0lPQ0RFVlBSSVZBVEUrMgkvKiBnZXQgY2FibGUgbW9kZW0gZnJlcXVlbmN5ICovCisjZGVmaW5lIFNJT0NTQ01GUkVRVUVOQ1kJU0lPQ0RFVlBSSVZBVEUrMwkvKiBzZXQgY2FibGUgbW9kZW0gZnJlcXVlbmN5ICovCisjZGVmaW5lIFNJT0NHQ01QSURTCQkJU0lPQ0RFVlBSSVZBVEUrNAkvKiBnZXQgY2FibGUgbW9kZW0gUElEcyAqLworI2RlZmluZSBTSU9DU0NNUElEUwkJCVNJT0NERVZQUklWQVRFKzUJLyogc2V0IGNhYmxlIG1vZGVtIFBJRHMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2VjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2VjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiODFmOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZWMuaApAQCAtMCwwICsxLDM2IEBACisvKiBEZWZpbml0aW9ucyBmb3IgRWNvbmV0IHNvY2tldHMuICovCisKKyNpZm5kZWYgX19MSU5VWF9JRl9FQworI2RlZmluZSBfX0xJTlVYX0lGX0VDCisKKy8qIFVzZXIgdmlzaWJsZSBzdHVmZi4gR2xpYmMgcHJvdmlkZXMgaXRzIG93biBidXQgbGliYzUgZm9sayB3aWxsIHVzZSB0aGVzZSAqLworCitzdHJ1Y3QgZWNfYWRkcgoreworICB1bnNpZ25lZCBjaGFyIHN0YXRpb247CQkvKiBTdGF0aW9uIG51bWJlci4gICovCisgIHVuc2lnbmVkIGNoYXIgbmV0OwkJCS8qIE5ldHdvcmsgbnVtYmVyLiAgKi8KK307CisKK3N0cnVjdCBzb2NrYWRkcl9lYworeworICB1bnNpZ25lZCBzaG9ydCBzZWNfZmFtaWx5OworICB1bnNpZ25lZCBjaGFyIHBvcnQ7CQkJLyogUG9ydCBudW1iZXIuICAqLworICB1bnNpZ25lZCBjaGFyIGNiOwkJCS8qIENvbnRyb2wvZmxhZyBieXRlLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0eXBlOwkJCS8qIFR5cGUgb2YgbWVzc2FnZS4gICovCisgIHN0cnVjdCBlY19hZGRyIGFkZHI7CisgIHVuc2lnbmVkIGxvbmcgY29va2llOworfTsKKworI2RlZmluZSBFQ1RZUEVfUEFDS0VUX1JFQ0VJVkVECQkwCS8qIFBhY2tldCByZWNlaXZlZCAqLworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfU1RBVFVTCQkweDEwCS8qIFRyYW5zbWl0IGNvbXBsZXRlZCwgCisJCQkJCQkgICBsb3cgbmliYmxlIGhvbGRzIHN0YXR1cyAqLworCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9PSwkJMQorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9UX0xJU1RFTklORwkyCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9ORVRfRVJST1IJMworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9fQ0xPQ0sJNAorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTElORV9KQU1NRUQJNQorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9UX1BSRVNFTlQJNgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9lcWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZXFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiOTRlYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZXFsLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIEVxdWFsaXplciBMb2FkLWJhbGFuY2VyIGZvciBzZXJpYWwgbmV0d29yayBpbnRlcmZhY2VzLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMTk5NSBTaW1vbiAiR3VydSBBbGVwaC1OdWxsIiBKYW5lcworICogTkNNOiBOZXR3b3JrIGFuZCBDb21tdW5pY2F0aW9ucyBNYW5hZ2VtZW50LCBJbmMuCisgKgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAKKyAqIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgc2ltb25AbmNtLmNvbSwgb3IgQy9PCisgKiAgICBOQ00KKyAqICAgIEF0dG46IFNpbW9uIEphbmVzCisgKiAgICA2ODAzIFdoaXR0aWVyIEF2ZQorICogICAgTWNMZWFuIFZBIDIyMTAxCisgKiAgICBQaG9uZTogMS03MDMtODQ3LTAwNDAgZXh0IDEwMworICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0VRTF9ICisjZGVmaW5lIF9MSU5VWF9JRl9FUUxfSAorCisjZGVmaW5lIEVRTF9ERUZBVUxUX1NMQVZFX1BSSU9SSVRZIDI4ODAwCisjZGVmaW5lIEVRTF9ERUZBVUxUX01BWF9TTEFWRVMgICAgIDQKKyNkZWZpbmUgRVFMX0RFRkFVTFRfTVRVICAgICAgICAgICAgNTc2CisjZGVmaW5lIEVRTF9ERUZBVUxUX1JFU0NIRURfSVZBTCAgIDEwMAorCisjZGVmaW5lIEVRTF9FTlNMQVZFICAgICAoU0lPQ0RFVlBSSVZBVEUpCisjZGVmaW5lIEVRTF9FTUFOQ0lQQVRFICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorCisjZGVmaW5lIEVRTF9HRVRTTEFWRUNGRyAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBFUUxfU0VUU0xBVkVDRkcgKFNJT0NERVZQUklWQVRFICsgMykKKworI2RlZmluZSBFUUxfR0VUTUFTVFJDRkcgKFNJT0NERVZQUklWQVRFICsgNCkKKyNkZWZpbmUgRVFMX1NFVE1BU1RSQ0ZHIChTSU9DREVWUFJJVkFURSArIDUpCisKKwordHlwZWRlZiBzdHJ1Y3QgbWFzdGVyX2NvbmZpZyB7CisJY2hhcgltYXN0ZXJfbmFtZVsxNl07CisJaW50CW1heF9zbGF2ZXM7CisJaW50CW1pbl9zbGF2ZXM7Cit9IG1hc3Rlcl9jb25maWdfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2xhdmVfY29uZmlnIHsKKwljaGFyCXNsYXZlX25hbWVbMTZdOworCWxvbmcJcHJpb3JpdHk7Cit9IHNsYXZlX2NvbmZpZ190OworCit0eXBlZGVmIHN0cnVjdCBzbGF2aW5nX3JlcXVlc3QgeworCWNoYXIJc2xhdmVfbmFtZVsxNl07CisJbG9uZwlwcmlvcml0eTsKK30gc2xhdmluZ19yZXF1ZXN0X3Q7CisKKworI2VuZGlmIC8qIF9MSU5VWF9FUUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MjY5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgRXRoZXJuZXQgSUVFRSA4MDIuMyBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2V0aGVyLmgJMS4wLjFhCTAyLzA4Lzk0CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQlBbGFuIENveCwgPGFsYW5AcmVkaGF0LmNvbT4KKyAqCQlTdGV2ZSBXaGl0ZWhvdXNlLCA8Z3c3cnJtQGVlc2hhY2szLnN3YW4uYWMudWs+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyAKKyNpZm5kZWYgX0xJTlVYX0lGX0VUSEVSX0gKKyNkZWZpbmUgX0xJTlVYX0lGX0VUSEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKglJRUVFIDgwMi4zIEV0aGVybmV0IG1hZ2ljIGNvbnN0YW50cy4gIFRoZSBmcmFtZSBzaXplcyBvbWl0IHRoZSBwcmVhbWJsZQorICoJYW5kIEZDUy9DUkMgKGZyYW1lIGNoZWNrIHNlcXVlbmNlKS4gCisgKi8KKworI2RlZmluZSBFVEhfQUxFTgk2CQkvKiBPY3RldHMgaW4gb25lIGV0aGVybmV0IGFkZHIJICovCisjZGVmaW5lIEVUSF9ITEVOCTE0CQkvKiBUb3RhbCBvY3RldHMgaW4gaGVhZGVyLgkgKi8KKyNkZWZpbmUgRVRIX1pMRU4JNjAJCS8qIE1pbi4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEVUSF9EQVRBX0xFTgkxNTAwCQkvKiBNYXguIG9jdGV0cyBpbiBwYXlsb2FkCSAqLworI2RlZmluZSBFVEhfRlJBTUVfTEVOCTE1MTQJCS8qIE1heC4gb2N0ZXRzIGluIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEVUSF9GQ1NfTEVOCTQJCS8qIE9jdGV0cyBpbiB0aGUgRkNTCQkgKi8KKworLyoKKyAqCVRoZXNlIGFyZSB0aGUgZGVmaW5lZCBFdGhlcm5ldCBQcm90b2NvbCBJRCdzLgorICovCisKKyNkZWZpbmUgRVRIX1BfTE9PUAkweDAwNjAJCS8qIEV0aGVybmV0IExvb3BiYWNrIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9QVVAJMHgwMjAwCQkvKiBYZXJveCBQVVAgcGFja2V0CQkqLworI2RlZmluZSBFVEhfUF9QVVBBVAkweDAyMDEJCS8qIFhlcm94IFBVUCBBZGRyIFRyYW5zIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9JUAkweDA4MDAJCS8qIEludGVybmV0IFByb3RvY29sIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9YMjUJMHgwODA1CQkvKiBDQ0lUVCBYLjI1CQkJKi8KKyNkZWZpbmUgRVRIX1BfQVJQCTB4MDgwNgkJLyogQWRkcmVzcyBSZXNvbHV0aW9uIHBhY2tldAkqLworI2RlZmluZQlFVEhfUF9CUFEJMHgwOEZGCQkvKiBHOEJQUSBBWC4yNSBFdGhlcm5ldCBQYWNrZXQJWyBOT1QgQU4gT0ZGSUNJQUxMWSBSRUdJU1RFUkVEIElEIF0gKi8KKyNkZWZpbmUgRVRIX1BfSUVFRVBVUAkweDBhMDAJCS8qIFhlcm94IElFRUU4MDIuMyBQVVAgcGFja2V0ICovCisjZGVmaW5lIEVUSF9QX0lFRUVQVVBBVAkweDBhMDEJCS8qIFhlcm94IElFRUU4MDIuMyBQVVAgQWRkciBUcmFucyBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIX1BfREVDICAgICAgIDB4NjAwMCAgICAgICAgICAvKiBERUMgQXNzaWduZWQgcHJvdG8gICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0ROQV9ETCAgICAweDYwMDEgICAgICAgICAgLyogREVDIEROQSBEdW1wL0xvYWQgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ETkFfUkMgICAgMHg2MDAyICAgICAgICAgIC8qIERFQyBETkEgUmVtb3RlIENvbnNvbGUgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfRE5BX1JUICAgIDB4NjAwMyAgICAgICAgICAvKiBERUMgRE5BIFJvdXRpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX0xBVCAgICAgICAweDYwMDQgICAgICAgICAgLyogREVDIExBVCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFVEhfUF9ESUFHICAgICAgMHg2MDA1ICAgICAgICAgIC8qIERFQyBEaWFnbm9zdGljcyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRIX1BfQ1VTVCAgICAgIDB4NjAwNiAgICAgICAgICAvKiBERUMgQ3VzdG9tZXIgdXNlICAgICAgICAgICAgICovCisjZGVmaW5lIEVUSF9QX1NDQSAgICAgICAweDYwMDcgICAgICAgICAgLyogREVDIFN5c3RlbXMgQ29tbXMgQXJjaCAgICAgICAqLworI2RlZmluZSBFVEhfUF9SQVJQICAgICAgMHg4MDM1CQkvKiBSZXZlcnNlIEFkZHIgUmVzIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9BVEFMSwkweDgwOUIJCS8qIEFwcGxldGFsayBERFAJCSovCisjZGVmaW5lIEVUSF9QX0FBUlAJMHg4MEYzCQkvKiBBcHBsZXRhbGsgQUFSUAkJKi8KKyNkZWZpbmUgRVRIX1BfODAyMVEJMHg4MTAwICAgICAgICAgIC8qIDgwMi4xUSBWTEFOIEV4dGVuZGVkIEhlYWRlciAgKi8KKyNkZWZpbmUgRVRIX1BfSVBYCTB4ODEzNwkJLyogSVBYIG92ZXIgRElYCQkJKi8KKyNkZWZpbmUgRVRIX1BfSVBWNgkweDg2REQJCS8qIElQdjYgb3ZlciBibHVlYm9vawkJKi8KKyNkZWZpbmUgRVRIX1BfUEFVU0UJMHg4ODA4CQkvKiBJRUVFIFBhdXNlIGZyYW1lcy4gU2VlIDgwMi4zIDMxQiAqLworI2RlZmluZSBFVEhfUF9TTE9XCTB4ODgwOQkJLyogU2xvdyBQcm90b2NvbC4gU2VlIDgwMi4zYWQgNDNCICovCisjZGVmaW5lIEVUSF9QX1dDQ1AJMHg4ODNFCQkvKiBXZWItY2FjaGUgY29vcmRpbmF0aW9uIHByb3RvY29sCisJCQkJCSAqIGRlZmluZWQgaW4gZHJhZnQtd2lsc29uLXdyZWMtd2NjcC12Mi0wMC50eHQgKi8KKyNkZWZpbmUgRVRIX1BfUFBQX0RJU0MJMHg4ODYzCQkvKiBQUFBvRSBkaXNjb3ZlcnkgbWVzc2FnZXMgICAgICovCisjZGVmaW5lIEVUSF9QX1BQUF9TRVMJMHg4ODY0CQkvKiBQUFBvRSBzZXNzaW9uIG1lc3NhZ2VzCSovCisjZGVmaW5lIEVUSF9QX01QTFNfVUMJMHg4ODQ3CQkvKiBNUExTIFVuaWNhc3QgdHJhZmZpYwkJKi8KKyNkZWZpbmUgRVRIX1BfTVBMU19NQwkweDg4NDgJCS8qIE1QTFMgTXVsdGljYXN0IHRyYWZmaWMJKi8KKyNkZWZpbmUgRVRIX1BfQVRNTVBPQQkweDg4NGMJCS8qIE11bHRpUHJvdG9jb2wgT3ZlciBBVE0JKi8KKyNkZWZpbmUgRVRIX1BfQVRNRkFURQkweDg4ODQJCS8qIEZyYW1lLWJhc2VkIEFUTSBUcmFuc3BvcnQKKwkJCQkJICogb3ZlciBFdGhlcm5ldAorCQkJCQkgKi8KKyNkZWZpbmUgRVRIX1BfQU9FCTB4ODhBMgkJLyogQVRBIG92ZXIgRXRoZXJuZXQJCSovCisjZGVmaW5lIEVUSF9QX1RJUEMJMHg4OENBCQkvKiBUSVBDIAkJCSovCisKKy8qCisgKglOb24gRElYIHR5cGVzLiBXb24ndCBjbGFzaCBmb3IgMTUwMCB0eXBlcy4KKyAqLworIAorI2RlZmluZSBFVEhfUF84MDJfMwkweDAwMDEJCS8qIER1bW15IHR5cGUgZm9yIDgwMi4zIGZyYW1lcyAgKi8KKyNkZWZpbmUgRVRIX1BfQVgyNQkweDAwMDIJCS8qIER1bW15IHByb3RvY29sIGlkIGZvciBBWC4yNSAgKi8KKyNkZWZpbmUgRVRIX1BfQUxMCTB4MDAwMwkJLyogRXZlcnkgcGFja2V0IChiZSBjYXJlZnVsISEhKSAqLworI2RlZmluZSBFVEhfUF84MDJfMgkweDAwMDQJCS8qIDgwMi4yIGZyYW1lcyAJCSovCisjZGVmaW5lIEVUSF9QX1NOQVAJMHgwMDA1CQkvKiBJbnRlcm5hbCBvbmx5CQkqLworI2RlZmluZSBFVEhfUF9ERENNUCAgICAgMHgwMDA2ICAgICAgICAgIC8qIERFQyBERENNUDogSW50ZXJuYWwgb25seSAgICAgKi8KKyNkZWZpbmUgRVRIX1BfV0FOX1BQUCAgIDB4MDAwNyAgICAgICAgICAvKiBEdW1teSB0eXBlIGZvciBXQU4gUFBQIGZyYW1lcyovCisjZGVmaW5lIEVUSF9QX1BQUF9NUCAgICAweDAwMDggICAgICAgICAgLyogRHVtbXkgdHlwZSBmb3IgUFBQIE1QIGZyYW1lcyAqLworI2RlZmluZSBFVEhfUF9MT0NBTFRBTEsgMHgwMDA5CQkvKiBMb2NhbHRhbGsgcHNldWRvIHR5cGUgCSovCisjZGVmaW5lIEVUSF9QX1BQUFRBTEsJMHgwMDEwCQkvKiBEdW1teSB0eXBlIGZvciBBdGFsayBvdmVyIFBQUCovCisjZGVmaW5lIEVUSF9QX1RSXzgwMl8yCTB4MDAxMQkJLyogODAyLjIgZnJhbWVzIAkJKi8KKyNkZWZpbmUgRVRIX1BfTU9CSVRFWAkweDAwMTUJCS8qIE1vYml0ZXggKGthekBjYWZlLm5ldCkJKi8KKyNkZWZpbmUgRVRIX1BfQ09OVFJPTAkweDAwMTYJCS8qIENhcmQgc3BlY2lmaWMgY29udHJvbCBmcmFtZXMgKi8KKyNkZWZpbmUgRVRIX1BfSVJEQQkweDAwMTcJCS8qIExpbnV4LUlyREEJCQkqLworI2RlZmluZSBFVEhfUF9FQ09ORVQJMHgwMDE4CQkvKiBBY29ybiBFY29uZXQJCQkqLworI2RlZmluZSBFVEhfUF9IRExDCTB4MDAxOQkJLyogSERMQyBmcmFtZXMJCQkqLworI2RlZmluZSBFVEhfUF9BUkNORVQJMHgwMDFBCQkvKiAxQSBmb3IgQXJjTmV0IDotKSAgICAgICAgICAgICovCisKKy8qCisgKglUaGlzIGlzIGFuIEV0aGVybmV0IGZyYW1lIGhlYWRlci4KKyAqLworIAorc3RydWN0IGV0aGhkciB7CisJdW5zaWduZWQgY2hhcgloX2Rlc3RbRVRIX0FMRU5dOwkvKiBkZXN0aW5hdGlvbiBldGggYWRkcgkqLworCXVuc2lnbmVkIGNoYXIJaF9zb3VyY2VbRVRIX0FMRU5dOwkvKiBzb3VyY2UgZXRoZXIgYWRkcgkqLworCV9fYmUxNgkJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNlbmRpZgkvKiBfTElOVVhfSUZfRVRIRVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NmEzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2ZjLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIEZpYnJlIENoYW5uZWwuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2ZjLmgJMC4wCTExLzIwLzk4CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqICAgIFBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgkgIFZpbmVldCBBYnJhaGFtLCA8dm1hQGlvbC51bmguZWR1PgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9JRl9GQ19ICisjZGVmaW5lIF9MSU5VWF9JRl9GQ19ICisKKworI2RlZmluZSBGQ19BTEVOCTYJCS8qIE9jdGV0cyBpbiBvbmUgZXRoZXJuZXQgYWRkcgkgKi8KKyNkZWZpbmUgRkNfSExFTiAgIChzaXplb2Yoc3RydWN0IGZjaF9oZHIpK3NpemVvZihzdHJ1Y3QgZmNsbGMpKQorI2RlZmluZSBGQ19JRF9MRU4gMwkJLyogT2N0ZXRzIGluIGEgRmlicmUgQ2hhbm5lbCBBZGRyZXNzICovCisKKy8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVhURU5ERURfU0FQIDB4QUEKKyNkZWZpbmUgVUlfQ01EICAgICAgIDB4MDMKKworLyogVGhpcyBpcyBOT1QgdGhlIEZpYnJlIENoYW5uZWwgZnJhbWUgaGVhZGVyLiBUaGUgRkMgZnJhbWUgaGVhZGVyIGlzCisgKiAgY29uc3RydWN0ZWQgaW4gdGhlIGRyaXZlciBhcyB0aGUgVGFjaHlvbiBuZWVkcyBjZXJ0YWluIGZpZWxkcyBpbgorICogIGNlcnRhaW5zIHBvc2l0aW9ucy4gU28sIGl0IGNhbid0IGJlIGdlbmVyYWxpemVkIGhlcmUuKi8KKworc3RydWN0IGZjaF9oZHIgeworCV9fdTggIGRhZGRyW0ZDX0FMRU5dOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCV9fdTggIHNhZGRyW0ZDX0FMRU5dOwkJLyogc291cmNlIGFkZHJlc3MgKi8KK307CisKKy8qIFRoaXMgaXMgYSBGaWJyZSBDaGFubmVsIExMQyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBmY2xsYyB7CisJX191OCAgZHNhcDsJCQkvKiBkZXN0aW5hdGlvbiBTQVAgKi8KKwlfX3U4ICBzc2FwOwkJCS8qIHNvdXJjZSBTQVAgKi8KKwlfX3U4ICBsbGM7CQkJLyogTExDIGNvbnRyb2wgZmllbGQgKi8KKwlfX3U4ICBwcm90aWRbM107CQkvKiBwcm90b2NvbCBpZCAqLworCV9fYmUxNiBldGhlcnR5cGU7CQkvKiBldGhlciB0eXBlIGZpZWxkICovCit9OworCisjZW5kaWYJLyogX0xJTlVYX0lGX0ZDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mZGRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyYmY0YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfZmRkaS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgQU5TSSBGRERJIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfZmRkaS5oCTEuMC4yCVNlcCAyOSAyMDA0CisgKgorICogQXV0aG9yOglMYXdyZW5jZSBWLiBTdGVmYW5pLCA8c3RlZmFuaUBsa2cuZGVjLmNvbT4KKyAqCisgKgkJaWZfZmRkaS5oIGlzIGJhc2VkIG9uIHByZXZpb3VzIGlmX2V0aGVyLmggYW5kIGlmX3RyLmggd29yayBieQorICoJCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQkJRG9uYWxkIEJlY2tlciwgPGJlY2tlckBzdXBlci5vcmc+CisgKgkJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJCQlTdGV2ZSBXaGl0ZWhvdXNlLCA8Z3c3cnJtQGVlc2hhY2szLnN3YW4uYWMudWs+CisgKgkJCVBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lGX0ZERElfSAorI2RlZmluZSBfTElOVVhfSUZfRkRESV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogIERlZmluZSBtYXggYW5kIG1pbiBsZWdhbCBzaXplcy4gIFRoZSBmcmFtZSBzaXplcyBkbyBub3QgaW5jbHVkZQorICogIDQgYnl0ZSBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuCisgKi8KKyNkZWZpbmUgRkRESV9LX0FMRU4JCQk2CQkvKiBPY3RldHMgaW4gb25lIEZEREkgYWRkcmVzcyAqLworI2RlZmluZSBGRERJX0tfODAyMl9ITEVOCTE2CQkvKiBUb3RhbCBvY3RldHMgaW4gODAyLjIgaGVhZGVyICovCisjZGVmaW5lIEZERElfS19TTkFQX0hMRU4JMjEJCS8qIFRvdGFsIG9jdGV0cyBpbiA4MDIuMiBTTkFQIGhlYWRlciAqLworI2RlZmluZSBGRERJX0tfODAyMl9aTEVOCTE2CQkvKiBNaW4gb2N0ZXRzIGluIDgwMi4yIGZyYW1lIHNhbnMgRkNTICovCisjZGVmaW5lIEZERElfS19TTkFQX1pMRU4JMjEJCS8qIE1pbiBvY3RldHMgaW4gODAyLjIgU05BUCBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBGRERJX0tfODAyMl9ETEVOCTQ0NzUJLyogTWF4IG9jdGV0cyBpbiA4MDIuMiBwYXlsb2FkICovCisjZGVmaW5lIEZERElfS19TTkFQX0RMRU4JNDQ3MAkvKiBNYXggb2N0ZXRzIGluIDgwMi4yIFNOQVAgcGF5bG9hZCAqLworI2RlZmluZSBGRERJX0tfTExDX1pMRU4JCTEzCQkvKiBNaW4gb2N0ZXRzIGluIExMQyBmcmFtZSBzYW5zIEZDUyAqLworI2RlZmluZSBGRERJX0tfTExDX0xFTgkJNDQ5MQkvKiBNYXggb2N0ZXRzIGluIExMQyBmcmFtZSBzYW5zIEZDUyAqLworCisvKiBEZWZpbmUgRkRESSBGcmFtZSBDb250cm9sIChGQykgQnl0ZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRkRESV9GQ19LX1ZPSUQJCQkJCTB4MDAJCisjZGVmaW5lIEZERElfRkNfS19OT05fUkVTVFJJQ1RFRF9UT0tFTgkweDgwCQorI2RlZmluZSBGRERJX0ZDX0tfUkVTVFJJQ1RFRF9UT0tFTgkJMHhDMAkKKyNkZWZpbmUgRkRESV9GQ19LX1NNVF9NSU4JCQkJMHg0MQorI2RlZmluZSBGRERJX0ZDX0tfU01UX01BWAkJICAgCQkweDRGCisjZGVmaW5lIEZERElfRkNfS19NQUNfTUlOCQkJCTB4QzEKKyNkZWZpbmUgRkRESV9GQ19LX01BQ19NQVgJCSAgCQkweENGCQorI2RlZmluZSBGRERJX0ZDX0tfQVNZTkNfTExDX01JTgkJCTB4NTAKKyNkZWZpbmUgRkRESV9GQ19LX0FTWU5DX0xMQ19ERUYJCQkweDU0CisjZGVmaW5lIEZERElfRkNfS19BU1lOQ19MTENfTUFYCQkJMHg1RgorI2RlZmluZSBGRERJX0ZDX0tfU1lOQ19MTENfTUlOCQkJMHhEMAorI2RlZmluZSBGRERJX0ZDX0tfU1lOQ19MTENfTUFYCQkJMHhENworI2RlZmluZSBGRERJX0ZDX0tfSU1QTEVNRU5UT1JfTUlOCQkweDYwCisjZGVmaW5lIEZERElfRkNfS19JTVBMRU1FTlRPUl9NQVggIAkJMHg2RgorI2RlZmluZSBGRERJX0ZDX0tfUkVTRVJWRURfTUlOCQkJMHg3MAorI2RlZmluZSBGRERJX0ZDX0tfUkVTRVJWRURfTUFYCQkJMHg3RgorCisvKiBEZWZpbmUgTExDIGFuZCBTTkFQIGNvbnN0YW50cyAqLworI2RlZmluZSBGRERJX0VYVEVOREVEX1NBUAkweEFBCisjZGVmaW5lIEZERElfVUlfQ01ECQkJMHgwMworCisvKiBEZWZpbmUgODAyLjIgVHlwZSAxIGhlYWRlciAqLworc3RydWN0IGZkZGlfODAyMl8xX2hkcgorCXsKKwlfX3U4CWRzYXA7CQkJCQkvKiBkZXN0aW5hdGlvbiBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJc3NhcDsJCQkJCS8qIHNvdXJjZSBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJY3RybDsJCQkJCS8qIGNvbnRyb2wgYnl0ZSAjMSAqLworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBEZWZpbmUgODAyLjIgVHlwZSAyIGhlYWRlciAqLworc3RydWN0IGZkZGlfODAyMl8yX2hkcgorCXsKKwlfX3U4CWRzYXA7CQkJCQkvKiBkZXN0aW5hdGlvbiBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJc3NhcDsJCQkJCS8qIHNvdXJjZSBzZXJ2aWNlIGFjY2VzcyBwb2ludCAqLworCV9fdTgJY3RybF8xOwkJCQkJLyogY29udHJvbCBieXRlICMxICovCisJX191OAljdHJsXzI7CQkJCQkvKiBjb250cm9sIGJ5dGUgIzIgKi8KKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRGVmaW5lIDgwMi4yIFNOQVAgaGVhZGVyICovCisjZGVmaW5lIEZERElfS19PVUlfTEVOCTMKK3N0cnVjdCBmZGRpX3NuYXBfaGRyCisJeworCV9fdTgJZHNhcDsJCQkJCS8qIGFsd2F5cyAweEFBICovCisJX191OAlzc2FwOwkJCQkJLyogYWx3YXlzIDB4QUEgKi8KKwlfX3U4CWN0cmw7CQkJCQkvKiBhbHdheXMgMHgwMyAqLworCV9fdTgJb3VpW0ZERElfS19PVUlfTEVOXTsJLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCisJX19iZTE2CWV0aGVydHlwZTsJCQkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRGVmaW5lIEZEREkgTExDIGZyYW1lIGhlYWRlciAqLworc3RydWN0IGZkZGloZHIKKwl7CisJX191OAlmYzsJCQkJCQkvKiBmcmFtZSBjb250cm9sICovCisJX191OAlkYWRkcltGRERJX0tfQUxFTl07CQkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJX191OAlzYWRkcltGRERJX0tfQUxFTl07CQkvKiBzb3VyY2UgYWRkcmVzcyAqLworCXVuaW9uCisJCXsKKwkJc3RydWN0IGZkZGlfODAyMl8xX2hkcgkJbGxjXzgwMjJfMTsKKwkJc3RydWN0IGZkZGlfODAyMl8yX2hkcgkJbGxjXzgwMjJfMjsKKwkJc3RydWN0IGZkZGlfc25hcF9oZHIJCWxsY19zbmFwOworCQl9IGhkcjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisjZW5kaWYJLyogX0xJTlVYX0lGX0ZERElfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mcmFkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2ZyYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc0MGMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9mcmFkLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBETENJL0ZSQUQJRGVmaW5pdGlvbnMgZm9yIEZyYW1lIFJlbGF5IEFjY2VzcyBEZXZpY2VzLiAgRExDSSBkZXZpY2VzIGFyZQorICoJCWNyZWF0ZWQgZm9yIGVhY2ggRExDSSBhc3NvY2lhdGVkIHdpdGggYSBGUkFELiAgVGhlIEZSQUQgZHJpdmVyCisgKgkJaXMgbm90IHRydWx5IGEgbmV0d29yayBkZXZpY2UsIGJ1dCB0aGUgbG93ZXIgbGV2ZWwgZGV2aWNlCisgKgkJaGFuZGxlci4gIFRoaXMgYWxsb3dzIG90aGVyIEZSQUQgbWFudWZhY3R1cmVycyB0byB1c2UgdGhlIERMQ0kKKyAqCQljb2RlLCBpbmNsdWRpbmcgaXRzIFJGQzE0OTAgZW5jYXBzdWxhdGlvbiBhbG9uZ3NpZGUgdGhlIGN1cnJlbnQKKyAqCQlpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNhbmdvbWEgY2FyZHMuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2lmcmFkLmgJMC4xNQkzMSBNYXIgOTYKKyAqCisgKiBBdXRob3I6CU1pa2UgTWNMYWdhbiA8bWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZz4KKyAqCisgKiBDaGFuZ2VzOgorICoJCTAuMTUJTWlrZSBNY0xhZ2FuCWNoYW5nZWQgc3RydWN0dXJlIGRlZnMgKHBhY2tlZCkKKyAqCQkJCQlyZS1hcnJhbmdlZCBmbGFncworICoJCQkJCWFkZGVkIERMQ0lfUkVUIHZhcnMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9GUkFEX0hfCisjZGVmaW5lIF9GUkFEX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRExDSSkgfHwgZGVmaW5lZChDT05GSUdfRExDSV9NT0RVTEUpCisKKy8qIFN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIERMQ0kgZGV2aWNlIGRyaXZlciAqLworCitzdHJ1Y3QgZGxjaV9hZGQKK3sKKyAgIGNoYXIgIGRldm5hbWVbSUZOQU1TSVpdOworICAgc2hvcnQgZGxjaTsKK307CisKKyNkZWZpbmUgRExDSV9HRVRfQ09ORgkoU0lPQ0RFVlBSSVZBVEUgKyAyKQorI2RlZmluZSBETENJX1NFVF9DT05GCShTSU9DREVWUFJJVkFURSArIDMpCisKKy8qIAorICogVGhlc2UgYXJlIHJlbGF0ZWQgdG8gdGhlIFNhbmdvbWEgU0RMQSBhbmQgc2hvdWxkIHJlbWFpbiBpbiBvcmRlci4gCisgKiBDb2RlIHdpdGhpbiB0aGUgU0RMQSBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIAorICogc3RydWN0dXJlLiAgQ2hhbmdlIGF0IHlvdXIgb3duIHBlcmlsLgorICovCitzdHJ1Y3QgZGxjaV9jb25mIHsKKyAgIHNob3J0IGZsYWdzOworICAgc2hvcnQgQ0lSX2Z3ZDsKKyAgIHNob3J0IEJjX2Z3ZDsKKyAgIHNob3J0IEJlX2Z3ZDsKKyAgIHNob3J0IENJUl9id2Q7CisgICBzaG9ydCBCY19id2Q7CisgICBzaG9ydCBCZV9id2Q7IAorCisvKiB0aGVzZSBhcmUgcGFydCBvZiB0aGUgc3RhdHVzIHJlYWQgKi8KKyAgIHNob3J0IFRjX2Z3ZDsKKyAgIHNob3J0IFRjX2J3ZDsKKyAgIHNob3J0IFRmX21heDsKKyAgIHNob3J0IFRiX21heDsKKworLyogYWRkIGFueSBuZXcgZmllbGRzIGhlcmUgYWJvdmUgaXMgYSBtaXJyb3Igb2Ygc2RsYV9kbGNpX2NvbmYgKi8KK307CisKKyNkZWZpbmUgRExDSV9HRVRfU0xBVkUJKFNJT0NERVZQUklWQVRFICsgNCkKKworLyogY29uZmlndXJhdGlvbiBmbGFncyBmb3IgRExDSSAqLworI2RlZmluZSBETENJX0lHTk9SRV9DSVJfT1VUCTB4MDAwMQorI2RlZmluZSBETENJX0FDQ09VTlRfQ0lSX0lOCTB4MDAwMgorI2RlZmluZSBETENJX0JVRkZFUl9JRgkJMHgwMDA4CisKKyNkZWZpbmUgRExDSV9WQUxJRF9GTEFHUwkweDAwMEIKKworLyogRlJBRCBkcml2ZXIgdXNlcyB0aGVzZSB0byBpbmRpY2F0ZSB3aGF0IGl0IGRpZCB3aXRoIHBhY2tldCAqLworI2RlZmluZSBETENJX1JFVF9PSwkJMHgwMAorI2RlZmluZSBETENJX1JFVF9FUlIJCTB4MDEKKyNkZWZpbmUgRExDSV9SRVRfRFJPUAkJMHgwMgorCisvKiBkZWZpbmVzIGZvciB0aGUgYWN0dWFsIEZyYW1lIFJlbGF5IGhhcmR3YXJlICovCisjZGVmaW5lIEZSQURfR0VUX0NPTkYJKFNJT0NERVZQUklWQVRFKQorI2RlZmluZSBGUkFEX1NFVF9DT05GCShTSU9DREVWUFJJVkFURSArIDEpCisKKyNkZWZpbmUgRlJBRF9MQVNUX0lPQ1RMCUZSQURfU0VUX0NPTkYKKworLyoKKyAqIEJhc2VkIG9uIHRoZSBzZXR1cCBmb3IgdGhlIFNhbmdvbWEgU0RMQS4gIElmIGNoYW5nZXMgYXJlIAorICogbmVjZXNzYXJ5IHRvIHRoaXMgc3RydWN0dXJlLCBhIHJvdXRpbmUgd2lsbCBuZWVkIHRvIGJlIAorICogYWRkZWQgdG8gdGhhdCBtb2R1bGUgdG8gY29weSBmaWVsZHMuCisgKi8KK3N0cnVjdCBmcmFkX2NvbmYgCit7CisgICBzaG9ydCBzdGF0aW9uOworICAgc2hvcnQgZmxhZ3M7CisgICBzaG9ydCBrYmF1ZDsKKyAgIHNob3J0IGNsb2NraW5nOworICAgc2hvcnQgbXR1OworICAgc2hvcnQgVDM5MTsKKyAgIHNob3J0IFQzOTI7CisgICBzaG9ydCBOMzkxOworICAgc2hvcnQgTjM5MjsKKyAgIHNob3J0IE4zOTM7CisgICBzaG9ydCBDSVJfZndkOworICAgc2hvcnQgQmNfZndkOworICAgc2hvcnQgQmVfZndkOworICAgc2hvcnQgQ0lSX2J3ZDsKKyAgIHNob3J0IEJjX2J3ZDsKKyAgIHNob3J0IEJlX2J3ZDsKKworLyogQWRkIG5ldyBmaWVsZHMgaGVyZSwgYWJvdmUgaXMgYSBtaXJyb3Igb2YgdGhlIHNkbGFfY29uZiAqLworCit9OworCisjZGVmaW5lIEZSQURfU1RBVElPTl9DUEUJMHgwMDAwCisjZGVmaW5lIEZSQURfU1RBVElPTl9OT0RFCTB4MDAwMQorCisjZGVmaW5lIEZSQURfVFhfSUdOT1JFX0NJUgkweDAwMDEKKyNkZWZpbmUgRlJBRF9SWF9BQ0NPVU5UX0NJUgkweDAwMDIKKyNkZWZpbmUgRlJBRF9EUk9QX0FCT1JURUQJMHgwMDA0CisjZGVmaW5lIEZSQURfQlVGRkVSSUYJCTB4MDAwOAorI2RlZmluZSBGUkFEX1NUQVRTCQkweDAwMTAKKyNkZWZpbmUgRlJBRF9NQ0kJCTB4MDEwMAorI2RlZmluZSBGUkFEX0FVVE9ETENJCQkweDgwMDAKKyNkZWZpbmUgRlJBRF9WQUxJRF9GTEFHUwkweDgxMUYKKworI2RlZmluZSBGUkFEX0NMT0NLX0lOVAkJMHgwMDAxCisjZGVmaW5lIEZSQURfQ0xPQ0tfRVhUCQkweDAwMDAKKworCisjZW5kaWYgLyogQ09ORklHX0RMQ0kgfHwgQ09ORklHX0RMQ0lfTU9EVUxFICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2hpcHBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkMzFjYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaGlwcGkuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBISVBQSSBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2hpcHBpLmgJMS4wLjAJMDUvMjYvOTcKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICoJCVN0ZXZlIFdoaXRlaG91c2UsIDxndzdycm1AZWVzaGFjazMuc3dhbi5hYy51az4KKyAqCQlKZXMgU29yZW5zZW4sIDxKZXMuU29yZW5zZW5AY2Vybi5jaD4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworIAorI2lmbmRlZiBfTElOVVhfSUZfSElQUElfSAorI2RlZmluZSBfTElOVVhfSUZfSElQUElfSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKgorICoJSElQUEkgbWFnaWMgY29uc3RhbnRzLgorICovCisKKyNkZWZpbmUgSElQUElfQUxFTgk2CQkvKiBCeXRlcyBpbiBvbmUgSElQUEkgaHctYWRkcgkgICAqLworI2RlZmluZSBISVBQSV9ITEVOCXNpemVvZihzdHJ1Y3QgaGlwcGlfaGRyKQorI2RlZmluZSBISVBQSV9aTEVOCTAJCS8qIE1pbi4gYnl0ZXMgaW4gZnJhbWUgd2l0aG91dCBGQ1MgKi8KKyNkZWZpbmUgSElQUElfREFUQV9MRU4JNjUyODAJCS8qIE1heC4gYnl0ZXMgaW4gcGF5bG9hZAkgICAqLworI2RlZmluZSBISVBQSV9GUkFNRV9MRU4JKEhJUFBJX0RBVEFfTEVOICsgSElQUElfSExFTikKKwkJCQkJLyogTWF4LiBieXRlcyBpbiBmcmFtZSB3aXRob3V0IEZDUyAqLworCisvKgorICogRGVmaW5lIExMQyBhbmQgU05BUCBjb25zdGFudHMuCisgKi8KKyNkZWZpbmUgSElQUElfRVhURU5ERURfU0FQCTB4QUEKKyNkZWZpbmUgSElQUElfVUlfQ01ECQkweDAzCisKKworLyoKKyAqCURvIHdlIG5lZWQgdG8gbGlzdCBzb21lIHNvcnQgb2YgSUQncyBoZXJlPworICovCisKKy8qCisgKglISVBQSSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZGF0YS4gCisgKi8KKyAKK3N0cnVjdCBoaXBuZXRfc3RhdGlzdGljcworeworCWludAlyeF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZAkqLworCWludAl0eF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworCWludAlyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwlpbnQJdHhfZXJyb3JzOwkJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zCSovCisJaW50CXJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisJaW50CXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwlpbnQJcnhfbGVuZ3RoX2Vycm9yczsKKwlpbnQJcnhfb3Zlcl9lcnJvcnM7CQkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cJKi8KKwlpbnQJcnhfY3JjX2Vycm9yczsJCS8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IJKi8KKwlpbnQJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJaW50CXJ4X2ZpZm9fZXJyb3JzOwkJLyogcmVjdidyIGZpZm8gb3ZlcnJ1bgkJKi8KKwlpbnQJcnhfbWlzc2VkX2Vycm9yczsJLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAkqLworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJaW50CXR4X2Fib3J0ZWRfZXJyb3JzOworCWludAl0eF9jYXJyaWVyX2Vycm9yczsKKwlpbnQJdHhfZmlmb19lcnJvcnM7CisJaW50CXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJaW50CXR4X3dpbmRvd19lcnJvcnM7Cit9OworCisKK3N0cnVjdCBoaXBwaV9mcF9oZHIKK3sKKyNpZiAwCisJX191OAkJdWxwOwkJCQkvKiBtdXN0IGNvbnRhaW4gNCAqLworI2lmIGRlZmluZWQgKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CQlkMV9kYXRhX3ByZXNlbnQ6MTsJCS8qIG11c3QgYmUgMSAqLworCV9fdTgJCXN0YXJ0X2QyX2J1cnN0X2JvdW5kYXJ5OjE7CS8qIG11c3QgYmUgemVybyAqLworCV9fdTgJCXJlc2VydmVkOjY7CQkJLyogbXVzdCBiZSB6ZXJvICovCisjaWYgMAorCV9fdTE2CQlyZXNlcnZlZDE6NTsKKwlfX3UxNgkJZDFfYXJlYV9zaXplOjg7CQkJLyogbXVzdCBiZSAzICovCisJX191MTYJCWQyX29mZnNldDozOwkJCS8qIG11c3QgYmUgemVybyAqLworI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CQlyZXNlcnZlZDo2OwkJCS8qIG11c3QgYmUgemVybyAqLworCV9fdTgJIAlzdGFydF9kMl9idXJzdF9ib3VuZGFyeToxOwkvKiBtdXN0IGJlIHplcm8gKi8KKwlfX3U4CQlkMV9kYXRhX3ByZXNlbnQ6MTsJCS8qIG11c3QgYmUgMSAqLworI2lmIDAKKwlfX3UxNgkJZDJfb2Zmc2V0OjM7CQkJLyogbXVzdCBiZSB6ZXJvICovCisJX191MTYJCWQxX2FyZWFfc2l6ZTo4OwkJCS8qIG11c3QgYmUgMyAqLworCV9fdTE2CQlyZXNlcnZlZDE6NTsJCQkvKiBtdXN0IGJlIHplcm8gKi8KKyNlbmRpZgorI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorI2Vsc2UKKwlfX2JlMzIJCWZpeGVkOworI2VuZGlmCisJX19iZTMyCQlkMl9zaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBoaXBwaV9sZV9oZHIKK3sKKyNpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAkJZmM6MzsKKwlfX3U4CQlkb3VibGVfd2lkZToxOworCV9fdTgJCW1lc3NhZ2VfdHlwZTo0OworI2VsaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAkJbWVzc2FnZV90eXBlOjQ7CisJX191OAkJZG91YmxlX3dpZGU6MTsKKwlfX3U4CQlmYzozOworI2VuZGlmCisJX191OAkJZGVzdF9zd2l0Y2hfYWRkclszXTsKKyNpZiBkZWZpbmVkIChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAkJZGVzdF9hZGRyX3R5cGU6NCwKKwkJCXNyY19hZGRyX3R5cGU6NDsKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJCXNyY19hZGRyX3R5cGU6NCwKKwkJCWRlc3RfYWRkcl90eXBlOjQ7CisjZW5kaWYKKwlfX3U4CQlzcmNfc3dpdGNoX2FkZHJbM107CisJX191MTYJCXJlc2VydmVkOworCV9fdTgJCWRhZGRyW0hJUFBJX0FMRU5dOworCV9fdTE2CQlsb2NhbGx5X2FkbWluaXN0ZXJlZDsKKwlfX3U4CQlzYWRkcltISVBQSV9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEhJUFBJX09VSV9MRU4JMworLyoKKyAqIExvb2tzIGxpa2UgdGhlIGRzYXAgYW5kIHNzYXAgZmllbGRzIGhhdmUgYmVlbiBzd2FwcGVkIGJ5IG1pc3Rha2UgaW4KKyAqIFJGQyAyMDY3ICJJUCBvdmVyIEhJUFBJIi4KKyAqLworc3RydWN0IGhpcHBpX3NuYXBfaGRyCit7CisJX191OAlkc2FwOwkJCS8qIGFsd2F5cyAweEFBICovCisJX191OAlzc2FwOwkJCS8qIGFsd2F5cyAweEFBICovCisJX191OAljdHJsOwkJCS8qIGFsd2F5cyAweDAzICovCisJX191OAlvdWlbSElQUElfT1VJX0xFTl07CS8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAoemVybykqLworCV9fYmUxNglldGhlcnR5cGU7CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBoaXBwaV9oZHIKK3sKKwlzdHJ1Y3QgaGlwcGlfZnBfaGRyCWZwOworCXN0cnVjdCBoaXBwaV9sZV9oZHIJbGU7CisJc3RydWN0IGhpcHBpX3NuYXBfaGRyCXNuYXA7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmCS8qIF9MSU5VWF9JRl9ISVBQSV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2luZmluaWJhbmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfaW5maW5pYmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjU5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2luZmluaWJhbmQuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgYXQKKyAqIDxodHRwOi8vd3d3LmZzZi5vcmcvY29weWxlZnQvZ3BsLmh0bWw+LCBvciB0aGUgT3BlbklCLm9yZyBCU0QKKyAqIGxpY2Vuc2UsIGF2YWlsYWJsZSBpbiB0aGUgTElDRU5TRS5UWFQgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcworICogc29mdHdhcmUuICBUaGVzZSBkZXRhaWxzIGFyZSBhbHNvIGF2YWlsYWJsZSBhdAorICogPGh0dHA6Ly9vcGVuaWIub3JnL2xpY2Vuc2UuaHRtbD4uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogJElkJAorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0lORklOSUJBTkRfSAorI2RlZmluZSBfTElOVVhfSUZfSU5GSU5JQkFORF9ICisKKyNkZWZpbmUgSU5GSU5JQkFORF9BTEVOCQkyMAkvKiBPY3RldHMgaW4gSVBvSUIgSFcgYWRkcgkqLworCisjZW5kaWYgLyogX0xJTlVYX0lGX0lORklOSUJBTkRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9saW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ4Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTAsMCArMSwxODkgQEAKKyNpZm5kZWYgX0xJTlVYX0lGX0xJTktfSAorI2RlZmluZSBfTElOVVhfSUZfTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKy8qIFRoZSBzdHJ1Y3Qgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqLworc3RydWN0IHJ0bmxfbGlua19zdGF0cworeworCV9fdTMyCXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJX191MzIJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwlfX3UzMglyeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIAkqLworCV9fdTMyCXR4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKwlfX3UzMglyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwlfX3UzMgl0eF9lcnJvcnM7CQkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwlfX3UzMglyeF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCV9fdTMyCXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKwlfX3UzMgltdWx0aWNhc3Q7CQkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCV9fdTMyCWNvbGxpc2lvbnM7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJX191MzIJcnhfbGVuZ3RoX2Vycm9yczsKKwlfX3UzMglyeF9vdmVyX2Vycm9yczsJCS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwkqLworCV9fdTMyCXJ4X2NyY19lcnJvcnM7CQkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCSovCisJX191MzIJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJX191MzIJcnhfZmlmb19lcnJvcnM7CQkvKiByZWN2J3IgZmlmbyBvdmVycnVuCQkqLworCV9fdTMyCXJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQJKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCV9fdTMyCXR4X2Fib3J0ZWRfZXJyb3JzOworCV9fdTMyCXR4X2NhcnJpZXJfZXJyb3JzOworCV9fdTMyCXR4X2ZpZm9fZXJyb3JzOworCV9fdTMyCXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJX191MzIJdHhfd2luZG93X2Vycm9yczsKKworCS8qIGZvciBjc2xpcCBldGMgKi8KKwlfX3UzMglyeF9jb21wcmVzc2VkOworCV9fdTMyCXR4X2NvbXByZXNzZWQ7Cit9OworCisvKiBUaGUgc3RydWN0IHNob3VsZCBiZSBpbiBzeW5jIHdpdGggc3RydWN0IGlmbWFwICovCitzdHJ1Y3QgcnRubF9saW5rX2lmbWFwCit7CisJX191NjQJbWVtX3N0YXJ0OworCV9fdTY0CW1lbV9lbmQ7CisJX191NjQJYmFzZV9hZGRyOworCV9fdTE2CWlycTsKKwlfX3U4CWRtYTsKKwlfX3U4CXBvcnQ7Cit9OworCitlbnVtCit7CisJSUZMQV9VTlNQRUMsCisJSUZMQV9BRERSRVNTLAorCUlGTEFfQlJPQURDQVNULAorCUlGTEFfSUZOQU1FLAorCUlGTEFfTVRVLAorCUlGTEFfTElOSywKKwlJRkxBX1FESVNDLAorCUlGTEFfU1RBVFMsCisJSUZMQV9DT1NULAorI2RlZmluZSBJRkxBX0NPU1QgSUZMQV9DT1NUCisJSUZMQV9QUklPUklUWSwKKyNkZWZpbmUgSUZMQV9QUklPUklUWSBJRkxBX1BSSU9SSVRZCisJSUZMQV9NQVNURVIsCisjZGVmaW5lIElGTEFfTUFTVEVSIElGTEFfTUFTVEVSCisJSUZMQV9XSVJFTEVTUywJCS8qIFdpcmVsZXNzIEV4dGVuc2lvbiBldmVudCAtIHNlZSB3aXJlbGVzcy5oICovCisjZGVmaW5lIElGTEFfV0lSRUxFU1MgSUZMQV9XSVJFTEVTUworCUlGTEFfUFJPVElORk8sCQkvKiBQcm90b2NvbCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgYSBsaW5rICovCisjZGVmaW5lIElGTEFfUFJPVElORk8gSUZMQV9QUk9USU5GTworCUlGTEFfVFhRTEVOLAorI2RlZmluZSBJRkxBX1RYUUxFTiBJRkxBX1RYUUxFTgorCUlGTEFfTUFQLAorI2RlZmluZSBJRkxBX01BUCBJRkxBX01BUAorCUlGTEFfV0VJR0hULAorI2RlZmluZSBJRkxBX1dFSUdIVCBJRkxBX1dFSUdIVAorCUlGTEFfT1BFUlNUQVRFLAorCUlGTEFfTElOS01PREUsCisJSUZMQV9MSU5LSU5GTywKKyNkZWZpbmUgSUZMQV9MSU5LSU5GTyBJRkxBX0xJTktJTkZPCisJSUZMQV9ORVRfTlNfUElELAorCV9fSUZMQV9NQVgKK307CisKKworI2RlZmluZSBJRkxBX01BWCAoX19JRkxBX01BWCAtIDEpCisKKy8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgSUZMQV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkpKQorI2RlZmluZSBJRkxBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkKKworLyogaWZpX2ZsYWdzLgorCisgICBJRkZfKiBmbGFncy4KKworICAgVGhlIG9ubHkgY2hhbmdlIGlzOgorICAgSUZGX0xPT1BCQUNLLCBJRkZfQlJPQURDQVNUIGFuZCBJRkZfUE9JTlRPUE9JTlQgYXJlCisgICBtb3JlIG5vdCBjaGFuZ2VhYmxlIGJ5IHVzZXIuIFRoZXkgZGVzY3JpYmUgbGluayBtZWRpYQorICAgY2hhcmFjdGVyaXN0aWNzIGFuZCBzZXQgYnkgZGV2aWNlIGRyaXZlci4KKworICAgQ29tbWVudHM6CisgICAtIENvbWJpbmF0aW9uIElGRl9CUk9BRENBU1R8SUZGX1BPSU5UT1BPSU5UIGlzIGludmFsaWQKKyAgIC0gSWYgbmVpdGhlciBvZiB0aGVzZSB0aHJlZSBmbGFncyBhcmUgc2V0OworICAgICB0aGUgaW50ZXJmYWNlIGlzIE5CTUEuCisKKyAgIC0gSUZGX01VTFRJQ0FTVCBkb2VzIG5vdCBtZWFuIGFueXRoaW5nIHNwZWNpYWw6CisgICBtdWx0aWNhc3RzIGNhbiBiZSB1c2VkIG9uIGFsbCBub3QtTkJNQSBsaW5rcy4KKyAgIElGRl9NVUxUSUNBU1QgbWVhbnMgdGhhdCB0aGlzIG1lZGlhIHVzZXMgc3BlY2lhbCBlbmNhcHN1bGF0aW9uCisgICBmb3IgbXVsdGljYXN0IGZyYW1lcy4gQXBwYXJlbnRseSwgYWxsIElGRl9QT0lOVE9QT0lOVCBhbmQKKyAgIElGRl9CUk9BRENBU1QgZGV2aWNlcyBhcmUgYWJsZSB0byB1c2UgbXVsdGljYXN0cyB0b28uCisgKi8KKworLyogSUZMQV9MSU5LLgorICAgRm9yIHVzdWFsIGRldmljZXMgaXQgaXMgZXF1YWwgaWZpX2luZGV4LgorICAgSWYgaXQgaXMgYSAidmlydHVhbCBpbnRlcmZhY2UiIChmLmUuIHR1bm5lbCksIGlmaV9saW5rCisgICBjYW4gcG9pbnQgdG8gcmVhbCBwaHlzaWNhbCBpbnRlcmZhY2UgKGYuZS4gZm9yIGJhbmR3aWR0aCBjYWxjdWxhdGlvbnMpLAorICAgb3IgbWF5YmUgMCwgd2hhdCBtZWFucywgdGhhdCByZWFsIG1lZGlhIGlzIHVua25vd24gKHVzdWFsCisgICBmb3IgSVBJUCB0dW5uZWxzLCB3aGVuIHJvdXRlIHRvIGVuZHBvaW50IGlzIGFsbG93ZWQgdG8gY2hhbmdlKQorICovCisKKy8qIFN1YnR5cGUgYXR0cmlidXRlcyBmb3IgSUZMQV9QUk9USU5GTyAqLworZW51bQoreworCUlGTEFfSU5FVDZfVU5TUEVDLAorCUlGTEFfSU5FVDZfRkxBR1MsCS8qIGxpbmsgZmxhZ3MJCQkqLworCUlGTEFfSU5FVDZfQ09ORiwJLyogc3lzY3RsIHBhcmFtZXRlcnMJCSovCisJSUZMQV9JTkVUNl9TVEFUUywJLyogc3RhdGlzdGljcwkJCSovCisJSUZMQV9JTkVUNl9NQ0FTVCwJLyogTUMgdGhpbmdzLiBXaGF0IG9mIHRoZW0/CSovCisJSUZMQV9JTkVUNl9DQUNIRUlORk8sCS8qIHRpbWUgdmFsdWVzIGFuZCBtYXggcmVhc20gc2l6ZSAqLworCUlGTEFfSU5FVDZfSUNNUDZTVEFUUywJLyogc3RhdGlzdGljcyAoaWNtcHY2KQkJKi8KKwlfX0lGTEFfSU5FVDZfTUFYCit9OworCisjZGVmaW5lIElGTEFfSU5FVDZfTUFYCShfX0lGTEFfSU5FVDZfTUFYIC0gMSkKKworc3RydWN0IGlmbGFfY2FjaGVpbmZvCit7CisJX191MzIJbWF4X3JlYXNtX2xlbjsKKwlfX3UzMgl0c3RhbXA7CQkvKiBpcHY2SW50ZXJmYWNlVGFibGUgdXBkYXRlZCB0aW1lc3RhbXAgKi8KKwlfX3UzMglyZWFjaGFibGVfdGltZTsKKwlfX3UzMglyZXRyYW5zX3RpbWU7Cit9OworCitlbnVtCit7CisJSUZMQV9JTkZPX1VOU1BFQywKKwlJRkxBX0lORk9fS0lORCwKKwlJRkxBX0lORk9fREFUQSwKKwlJRkxBX0lORk9fWFNUQVRTLAorCV9fSUZMQV9JTkZPX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9JTkZPX01BWAkoX19JRkxBX0lORk9fTUFYIC0gMSkKKworLyogVkxBTiBzZWN0aW9uICovCisKK2VudW0KK3sKKwlJRkxBX1ZMQU5fVU5TUEVDLAorCUlGTEFfVkxBTl9JRCwKKwlJRkxBX1ZMQU5fRkxBR1MsCisJSUZMQV9WTEFOX0VHUkVTU19RT1MsCisJSUZMQV9WTEFOX0lOR1JFU1NfUU9TLAorCV9fSUZMQV9WTEFOX01BWCwKK307CisKKyNkZWZpbmUgSUZMQV9WTEFOX01BWAkoX19JRkxBX1ZMQU5fTUFYIC0gMSkKKworc3RydWN0IGlmbGFfdmxhbl9mbGFncyB7CisJX191MzIJZmxhZ3M7CisJX191MzIJbWFzazsKK307CisKK2VudW0KK3sKKwlJRkxBX1ZMQU5fUU9TX1VOU1BFQywKKwlJRkxBX1ZMQU5fUU9TX01BUFBJTkcsCisJX19JRkxBX1ZMQU5fUU9TX01BWAorfTsKKworI2RlZmluZSBJRkxBX1ZMQU5fUU9TX01BWAkoX19JRkxBX1ZMQU5fUU9TX01BWCAtIDEpCisKK3N0cnVjdCBpZmxhX3ZsYW5fcW9zX21hcHBpbmcKK3sKKwlfX3UzMiBmcm9tOworCV9fdTMyIHRvOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9JRl9MSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfbHRhbGsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfbHRhbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmMzZTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9sdGFsay5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0xJTlVYX0xUQUxLX0gKKyNkZWZpbmUgX19MSU5VWF9MVEFMS19ICisKKyNkZWZpbmUgTFRBTEtfSExFTgkJMQorI2RlZmluZSBMVEFMS19NVFUJCTYwMAorI2RlZmluZSBMVEFMS19BTEVOCQkxCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDA5NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wYWNrZXQuaApAQCAtMCwwICsxLDExNSBAQAorI2lmbmRlZiBfX0xJTlVYX0lGX1BBQ0tFVF9ICisjZGVmaW5lIF9fTElOVVhfSUZfUEFDS0VUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBzb2NrYWRkcl9wa3QKK3sKKwl1bnNpZ25lZCBzaG9ydCBzcGt0X2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyIHNwa3RfZGV2aWNlWzE0XTsKKwlfX2JlMTYgc3BrdF9wcm90b2NvbDsKK307CisKK3N0cnVjdCBzb2NrYWRkcl9sbAoreworCXVuc2lnbmVkIHNob3J0CXNsbF9mYW1pbHk7CisJX19iZTE2CQlzbGxfcHJvdG9jb2w7CisJaW50CQlzbGxfaWZpbmRleDsKKwl1bnNpZ25lZCBzaG9ydAlzbGxfaGF0eXBlOworCXVuc2lnbmVkIGNoYXIJc2xsX3BrdHR5cGU7CisJdW5zaWduZWQgY2hhcglzbGxfaGFsZW47CisJdW5zaWduZWQgY2hhcglzbGxfYWRkcls4XTsKK307CisKKy8qIFBhY2tldCB0eXBlcyAqLworCisjZGVmaW5lIFBBQ0tFVF9IT1NUCQkwCQkvKiBUbyB1cwkJKi8KKyNkZWZpbmUgUEFDS0VUX0JST0FEQ0FTVAkxCQkvKiBUbyBhbGwJCSovCisjZGVmaW5lIFBBQ0tFVF9NVUxUSUNBU1QJMgkJLyogVG8gZ3JvdXAJCSovCisjZGVmaW5lIFBBQ0tFVF9PVEhFUkhPU1QJMwkJLyogVG8gc29tZW9uZSBlbHNlIAkqLworI2RlZmluZSBQQUNLRVRfT1VUR09JTkcJCTQJCS8qIE91dGdvaW5nIG9mIGFueSB0eXBlICovCisvKiBUaGVzZSBvbmVzIGFyZSBpbnZpc2libGUgYnkgdXNlciBsZXZlbCAqLworI2RlZmluZSBQQUNLRVRfTE9PUEJBQ0sJCTUJCS8qIE1DL0JSRCBmcmFtZSBsb29wZWQgYmFjayAqLworI2RlZmluZSBQQUNLRVRfRkFTVFJPVVRFCTYJCS8qIEZhc3Ryb3V0ZWQgZnJhbWUJKi8KKworLyogUGFja2V0IHNvY2tldCBvcHRpb25zICovCisKKyNkZWZpbmUgUEFDS0VUX0FERF9NRU1CRVJTSElQCQkxCisjZGVmaW5lIFBBQ0tFVF9EUk9QX01FTUJFUlNISVAJCTIKKyNkZWZpbmUgUEFDS0VUX1JFQ1ZfT1VUUFVUCQkzCisvKiBWYWx1ZSA0IGlzIHN0aWxsIHVzZWQgYnkgb2Jzb2xldGUgdHVyYm8tcGFja2V0LiAqLworI2RlZmluZSBQQUNLRVRfUlhfUklORwkJCTUKKyNkZWZpbmUgUEFDS0VUX1NUQVRJU1RJQ1MJCTYKKyNkZWZpbmUgUEFDS0VUX0NPUFlfVEhSRVNICQk3CisjZGVmaW5lIFBBQ0tFVF9BVVhEQVRBCQkJOAorI2RlZmluZSBQQUNLRVRfT1JJR0RFVgkJCTkKKworc3RydWN0IHRwYWNrZXRfc3RhdHMKK3sKKwl1bnNpZ25lZCBpbnQJdHBfcGFja2V0czsKKwl1bnNpZ25lZCBpbnQJdHBfZHJvcHM7Cit9OworCitzdHJ1Y3QgdHBhY2tldF9hdXhkYXRhCit7CisJX191MzIJCXRwX3N0YXR1czsKKwlfX3UzMgkJdHBfbGVuOworCV9fdTMyCQl0cF9zbmFwbGVuOworCV9fdTE2CQl0cF9tYWM7CisJX191MTYJCXRwX25ldDsKK307CisKK3N0cnVjdCB0cGFja2V0X2hkcgoreworCXVuc2lnbmVkIGxvbmcJdHBfc3RhdHVzOworI2RlZmluZSBUUF9TVEFUVVNfS0VSTkVMCTAKKyNkZWZpbmUgVFBfU1RBVFVTX1VTRVIJCTEKKyNkZWZpbmUgVFBfU1RBVFVTX0NPUFkJCTIKKyNkZWZpbmUgVFBfU1RBVFVTX0xPU0lORwk0CisjZGVmaW5lIFRQX1NUQVRVU19DU1VNTk9UUkVBRFkJOAorCXVuc2lnbmVkIGludAl0cF9sZW47CisJdW5zaWduZWQgaW50CXRwX3NuYXBsZW47CisJdW5zaWduZWQgc2hvcnQJdHBfbWFjOworCXVuc2lnbmVkIHNob3J0CXRwX25ldDsKKwl1bnNpZ25lZCBpbnQJdHBfc2VjOworCXVuc2lnbmVkIGludAl0cF91c2VjOworfTsKKworI2RlZmluZSBUUEFDS0VUX0FMSUdOTUVOVAkxNgorI2RlZmluZSBUUEFDS0VUX0FMSUdOKHgpCSgoKHgpK1RQQUNLRVRfQUxJR05NRU5ULTEpJn4oVFBBQ0tFVF9BTElHTk1FTlQtMSkpCisjZGVmaW5lIFRQQUNLRVRfSERSTEVOCQkoVFBBQ0tFVF9BTElHTihzaXplb2Yoc3RydWN0IHRwYWNrZXRfaGRyKSkgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSkKKworLyoKKyAgIEZyYW1lIHN0cnVjdHVyZToKKworICAgLSBTdGFydC4gRnJhbWUgbXVzdCBiZSBhbGlnbmVkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CisgICAtIHN0cnVjdCB0cGFja2V0X2hkcgorICAgLSBwYWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYKKyAgIC0gc3RydWN0IHNvY2thZGRyX2xsCisgICAtIEdhcCwgY2hvc2VuIHNvIHRoYXQgcGFja2V0IGRhdGEgKFN0YXJ0K3RwX25ldCkgYWxpZ25lcyB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNgorICAgLSBTdGFydCt0cF9tYWM6IFsgT3B0aW9uYWwgTUFDIGhlYWRlciBdCisgICAtIFN0YXJ0K3RwX25ldDogUGFja2V0IGRhdGEsIGFsaWduZWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYuCisgICAtIFBhZCB0byBhbGlnbiB0byBUUEFDS0VUX0FMSUdOTUVOVD0xNgorICovCisKK3N0cnVjdCB0cGFja2V0X3JlcQoreworCXVuc2lnbmVkIGludAl0cF9ibG9ja19zaXplOwkvKiBNaW5pbWFsIHNpemUgb2YgY29udGlndW91cyBibG9jayAqLworCXVuc2lnbmVkIGludAl0cF9ibG9ja19ucjsJLyogTnVtYmVyIG9mIGJsb2NrcyAqLworCXVuc2lnbmVkIGludAl0cF9mcmFtZV9zaXplOwkvKiBTaXplIG9mIGZyYW1lICovCisJdW5zaWduZWQgaW50CXRwX2ZyYW1lX25yOwkvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzICovCit9OworCitzdHJ1Y3QgcGFja2V0X21yZXEKK3sKKwlpbnQJCW1yX2lmaW5kZXg7CisJdW5zaWduZWQgc2hvcnQJbXJfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydAltcl9hbGVuOworCXVuc2lnbmVkIGNoYXIJbXJfYWRkcmVzc1s4XTsKK307CisKKyNkZWZpbmUgUEFDS0VUX01SX01VTFRJQ0FTVAkwCisjZGVmaW5lIFBBQ0tFVF9NUl9QUk9NSVNDCTEKKyNkZWZpbmUgUEFDS0VUX01SX0FMTE1VTFRJCTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BsaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcGxpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2E2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BsaXAuaApAQCAtMCwwICsxLDI4IEBACisvKgorICoJTkVUMwlQTElQIHR1bmluZyBmYWNpbGl0aWVzIGZvciB0aGUgbmV3IE5paWJlIFBMSVAuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX0xJTlVYX0lGX1BMSVBfSAorI2RlZmluZSBfTElOVVhfSUZfUExJUF9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisKKyNkZWZpbmUJU0lPQ0RFVlBMSVAJU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IHBsaXBjb25mCit7CisJdW5zaWduZWQgc2hvcnQgcGNtZDsKKwl1bnNpZ25lZCBsb25nICBuaWJibGU7CisJdW5zaWduZWQgbG9uZyAgdHJpZ2dlcjsKK307CisKKyNkZWZpbmUgUExJUF9HRVRfVElNRU9VVAkweDEKKyNkZWZpbmUgUExJUF9TRVRfVElNRU9VVAkweDIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFhZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHAuaApAQCAtMCwwICsxLDE3MyBAQAorLyoJJElkOiBpZl9wcHAuaCx2IDEuMjEgMjAwMC8wMy8yNyAwNjowMzozNiBwYXVsdXMgRXhwICQJKi8KKworLyoKKyAqIGlmX3BwcC5oIC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICovCisKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiAyMDA1MDgxMj09CisgKgorICogIE5PVEUgVE8gTUFJTlRBSU5FUlM6CisgKiAgICAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUgYXQgYWxsLCBwbGVhc2Ugc2V0IHRoZSBhYm92ZSBkYXRlLgorICogICAgIGlmX3BwcC5oIGlzIHNoaXBwZWQgd2l0aCBhIFBQUCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB3aXRoIHRoZSBrZXJuZWw7CisgKiAgICAgaWYgZXZlcnlvbmUgaW5jcmVhc2VzIHRoZSBGSUxFVkVSU0lPTiBudW1iZXIgYWJvdmUsIHRoZW4gc2NyaXB0cworICogICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGluc3RhbGwgYSBuZXcgaWZfcHBwLmgKKyAqICAgICBmaWxlLiAgRG9uJ3QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhhdCBsaW5lIG90aGVyd2lzZSwgc28gdGhlCisgKiAgICAgaW5zdGFsbGF0aW9uIHNjcmlwdCBjYW4gcmVjb2duaXplIGl0LgorICovCisKKyNpZm5kZWYgX0lGX1BQUF9IXworI2RlZmluZSBfSUZfUFBQX0hfCisKKworLyoKKyAqIFBhY2tldCBzaXplcworICovCisKKyNkZWZpbmUJUFBQX01UVQkJMTUwMAkvKiBEZWZhdWx0IE1UVSAoc2l6ZSBvZiBJbmZvIGZpZWxkKSAqLworI2RlZmluZSBQUFBfTUFYTVJVCTY1MDAwCS8qIExhcmdlc3QgTVJVIHdlIGFsbG93ICovCisjZGVmaW5lIFBST1RPX0lQWAkweDAwMmIJLyogcHJvdG9jb2wgbnVtYmVycyAqLworI2RlZmluZSBQUk9UT19ETkFfUlQgICAgMHgwMDI3ICAvKiBETkEgUm91dGluZyAqLworCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbnMgZm9yIGZsYWdzLgorICovCisKKyNkZWZpbmUgU0NfQ09NUF9QUk9UCTB4MDAwMDAwMDEJLyogcHJvdG9jb2wgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KKyNkZWZpbmUgU0NfQ09NUF9BQwkweDAwMDAwMDAyCS8qIGhlYWRlciBjb21wcmVzc2lvbiAob3V0cHV0KSAqLworI2RlZmluZQlTQ19DT01QX1RDUAkweDAwMDAwMDA0CS8qIFRDUCAoVkopIGNvbXByZXNzaW9uIChvdXRwdXQpICovCisjZGVmaW5lIFNDX05PX1RDUF9DQ0lECTB4MDAwMDAwMDgJLyogZGlzYWJsZSBWSiBjb25uZWN0aW9uLWlkIGNvbXAuICovCisjZGVmaW5lIFNDX1JFSl9DT01QX0FDCTB4MDAwMDAwMTAJLyogcmVqZWN0IGFkcnMvY3RybCBjb21wLiBvbiBpbnB1dCAqLworI2RlZmluZSBTQ19SRUpfQ09NUF9UQ1AJMHgwMDAwMDAyMAkvKiByZWplY3QgVENQIChWSikgY29tcC4gb24gaW5wdXQgKi8KKyNkZWZpbmUgU0NfQ0NQX09QRU4JMHgwMDAwMDA0MAkvKiBMb29rIGF0IENDUCBwYWNrZXRzICovCisjZGVmaW5lIFNDX0NDUF9VUAkweDAwMDAwMDgwCS8qIE1heSBzZW5kL3JlY3YgY29tcHJlc3NlZCBwYWNrZXRzICovCisjZGVmaW5lIFNDX0VOQUJMRV9JUAkweDAwMDAwMTAwCS8qIElQIHBhY2tldHMgbWF5IGJlIGV4Y2hhbmdlZCAqLworI2RlZmluZSBTQ19MT09QX1RSQUZGSUMJMHgwMDAwMDIwMAkvKiBzZW5kIHRyYWZmaWMgdG8gcHBwZCAqLworI2RlZmluZSBTQ19NVUxUSUxJTksJMHgwMDAwMDQwMAkvKiBkbyBtdWx0aWxpbmsgZW5jYXBzdWxhdGlvbiAqLworI2RlZmluZSBTQ19NUF9TSE9SVFNFUQkweDAwMDAwODAwCS8qIHVzZSBzaG9ydCBNUCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIFNDX0NPTVBfUlVOCTB4MDAwMDEwMDAJLyogY29tcHJlc3NvciBoYXMgYmVlbiBpbml0ZWQgKi8KKyNkZWZpbmUgU0NfREVDT01QX1JVTgkweDAwMDAyMDAwCS8qIGRlY29tcHJlc3NvciBoYXMgYmVlbiBpbml0ZWQgKi8KKyNkZWZpbmUgU0NfTVBfWFNIT1JUU0VRCTB4MDAwMDQwMDAJLyogdHJhbnNtaXQgc2hvcnQgTVAgc2VxIG51bWJlcnMgKi8KKyNkZWZpbmUgU0NfREVCVUcJMHgwMDAxMDAwMAkvKiBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0NfTE9HX0lOUEtUCTB4MDAwMjAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIGdvb2QgcGt0cyByZWN2ZCAqLworI2RlZmluZSBTQ19MT0dfT1VUUEtUCTB4MDAwNDAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIHBrdHMgc2VudCAqLworI2RlZmluZSBTQ19MT0dfUkFXSU4JMHgwMDA4MDAwMAkvKiBsb2cgYWxsIGNoYXJzIHJlY2VpdmVkICovCisjZGVmaW5lIFNDX0xPR19GTFVTSAkweDAwMTAwMDAwCS8qIGxvZyBhbGwgY2hhcnMgZmx1c2hlZCAqLworI2RlZmluZQlTQ19TWU5DCQkweDAwMjAwMDAwCS8qIHN5bmNocm9ub3VzIHNlcmlhbCBtb2RlICovCisjZGVmaW5lCVNDX01VU1RfQ09NUCAgICAweDAwNDAwMDAwCS8qIG5vIHVuY29tcHJlc3NlZCBwYWNrZXRzIG1heSBiZSBzZW50IG9yIHJlY2VpdmVkICovCisjZGVmaW5lCVNDX01BU0sJCTB4MGY2MDBmZmYJLyogYml0cyB0aGF0IHVzZXIgY2FuIGNoYW5nZSAqLworCisvKiBzdGF0ZSBiaXRzICovCisjZGVmaW5lIFNDX1hNSVRfQlVTWQkweDEwMDAwMDAwCS8qICh1c2VkIGJ5IGlzZG5fcHBwPykgKi8KKyNkZWZpbmUgU0NfUkNWX09ERFAJMHgwODAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIG9kZCBwYXJpdHkgKi8KKyNkZWZpbmUgU0NfUkNWX0VWTlAJMHgwNDAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lIFNDX1JDVl9CN18xCTB4MDIwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBiaXQgNyA9IDEgKi8KKyNkZWZpbmUgU0NfUkNWX0I3XzAJMHgwMTAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGJpdCA3ID0gMCAqLworI2RlZmluZSBTQ19EQ19GRVJST1IJMHgwMDgwMDAwMAkvKiBmYXRhbCBkZWNvbXAgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgU0NfRENfRVJST1IJMHgwMDQwMDAwMAkvKiBub24tZmF0YWwgZGVjb21wIGVycm9yIGRldGVjdGVkICovCisKKy8qCisgKiBJb2N0bCBkZWZpbml0aW9ucy4KKyAqLworCitzdHJ1Y3QgbnBpb2N0bCB7CisJaW50CQlwcm90b2NvbDsJLyogUFBQIHByb3RvY29sLCBlLmcuIFBQUF9JUCAqLworCWVudW0gTlBtb2RlCW1vZGU7Cit9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIENDUCBjb25maWd1cmF0aW9uIG9wdGlvbiwgZm9yIFBQUElPQ1NDT01QUkVTUyAqLworc3RydWN0IHBwcF9vcHRpb25fZGF0YSB7CisJX191OCAqcHRyOworCV9fdTMyCWxlbmd0aDsKKwlpbnQJdHJhbnNtaXQ7Cit9OworCitzdHJ1Y3QgaWZwcHBzdGF0c3JlcSB7CisJc3RydWN0IGlmcmVxCSBiOworCXN0cnVjdCBwcHBfc3RhdHMgc3RhdHM7CQkJLyogc3RhdGlzdGljIGluZm9ybWF0aW9uICovCit9OworCitzdHJ1Y3QgaWZwcHBjc3RhdHNyZXEgeworCXN0cnVjdCBpZnJlcQkgICAgICBiOworCXN0cnVjdCBwcHBfY29tcF9zdGF0cyBzdGF0czsKK307CisKKy8qIEZvciBQUFBJT0NHTDJUUFNUQVRTICovCitzdHJ1Y3QgcHBwb2wydHBfaW9jX3N0YXRzIHsKKwlfX3UxNgkJdHVubmVsX2lkOwkvKiByZWR1bmRhbnQgKi8KKwlfX3UxNgkJc2Vzc2lvbl9pZDsJLyogaWYgemVybywgZ2V0IHR1bm5lbCBzdGF0cyAqLworCV9fdTMyCQl1c2luZ19pcHNlYzoxOwkvKiB2YWxpZCBvbmx5IGZvciBzZXNzaW9uX2lkID09IDAgKi8KKwlhbGlnbmVkX3U2NAl0eF9wYWNrZXRzOworCWFsaWduZWRfdTY0CXR4X2J5dGVzOworCWFsaWduZWRfdTY0CXR4X2Vycm9yczsKKwlhbGlnbmVkX3U2NAlyeF9wYWNrZXRzOworCWFsaWduZWRfdTY0CXJ4X2J5dGVzOworCWFsaWduZWRfdTY0CXJ4X3NlcV9kaXNjYXJkczsKKwlhbGlnbmVkX3U2NAlyeF9vb3NfcGFja2V0czsKKwlhbGlnbmVkX3U2NAlyeF9lcnJvcnM7Cit9OworCisjZGVmaW5lIGlmcl9fbmFtZSAgICAgICBiLmlmcl9pZnJuLmlmcm5fbmFtZQorI2RlZmluZSBzdGF0c19wdHIgICAgICAgYi5pZnJfaWZydS5pZnJ1X2RhdGEKKworLyoKKyAqIElvY3RsIGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUJUFBQSU9DR0ZMQUdTCV9JT1IoJ3QnLCA5MCwgaW50KQkvKiBnZXQgY29uZmlndXJhdGlvbiBmbGFncyAqLworI2RlZmluZQlQUFBJT0NTRkxBR1MJX0lPVygndCcsIDg5LCBpbnQpCS8qIHNldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lCVBQUElPQ0dBU1lOQ01BUAlfSU9SKCd0JywgODgsIGludCkJLyogZ2V0IGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NTQVNZTkNNQVAJX0lPVygndCcsIDg3LCBpbnQpCS8qIHNldCBhc3luYyBtYXAgKi8KKyNkZWZpbmUJUFBQSU9DR1VOSVQJX0lPUigndCcsIDg2LCBpbnQpCS8qIGdldCBwcHAgdW5pdCBudW1iZXIgKi8KKyNkZWZpbmUJUFBQSU9DR1JBU1lOQ01BUCBfSU9SKCd0JywgODUsIGludCkJLyogZ2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ1NSQVNZTkNNQVAgX0lPVygndCcsIDg0LCBpbnQpCS8qIHNldCByZWNlaXZlIGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NHTVJVCV9JT1IoJ3QnLCA4MywgaW50KQkvKiBnZXQgbWF4IHJlY2VpdmUgdW5pdCAqLworI2RlZmluZQlQUFBJT0NTTVJVCV9JT1coJ3QnLCA4MiwgaW50KQkvKiBzZXQgbWF4IHJlY2VpdmUgdW5pdCAqLworI2RlZmluZQlQUFBJT0NTTUFYQ0lECV9JT1coJ3QnLCA4MSwgaW50KQkvKiBzZXQgVkogbWF4IHNsb3QgSUQgKi8KKyNkZWZpbmUgUFBQSU9DR1hBU1lOQ01BUCBfSU9SKCd0JywgODAsIGV4dF9hY2NtKSAvKiBnZXQgZXh0ZW5kZWQgQUNDTSAqLworI2RlZmluZSBQUFBJT0NTWEFTWU5DTUFQIF9JT1coJ3QnLCA3OSwgZXh0X2FjY20pIC8qIHNldCBleHRlbmRlZCBBQ0NNICovCisjZGVmaW5lIFBQUElPQ1hGRVJVTklUCV9JTygndCcsIDc4KQkJLyogdHJhbnNmZXIgUFBQIHVuaXQgKi8KKyNkZWZpbmUgUFBQSU9DU0NPTVBSRVNTCV9JT1coJ3QnLCA3Nywgc3RydWN0IHBwcF9vcHRpb25fZGF0YSkKKyNkZWZpbmUgUFBQSU9DR05QTU9ERQlfSU9XUigndCcsIDc2LCBzdHJ1Y3QgbnBpb2N0bCkgLyogZ2V0IE5QIG1vZGUgKi8KKyNkZWZpbmUgUFBQSU9DU05QTU9ERQlfSU9XKCd0JywgNzUsIHN0cnVjdCBucGlvY3RsKSAgLyogc2V0IE5QIG1vZGUgKi8KKyNkZWZpbmUgUFBQSU9DU1BBU1MJX0lPVygndCcsIDcxLCBzdHJ1Y3Qgc29ja19mcHJvZykgLyogc2V0IHBhc3MgZmlsdGVyICovCisjZGVmaW5lIFBQUElPQ1NBQ1RJVkUJX0lPVygndCcsIDcwLCBzdHJ1Y3Qgc29ja19mcHJvZykgLyogc2V0IGFjdGl2ZSBmaWx0ICovCisjZGVmaW5lIFBQUElPQ0dERUJVRwlfSU9SKCd0JywgNjUsIGludCkJLyogUmVhZCBkZWJ1ZyBsZXZlbCAqLworI2RlZmluZSBQUFBJT0NTREVCVUcJX0lPVygndCcsIDY0LCBpbnQpCS8qIFNldCBkZWJ1ZyBsZXZlbCAqLworI2RlZmluZSBQUFBJT0NHSURMRQlfSU9SKCd0JywgNjMsIHN0cnVjdCBwcHBfaWRsZSkgLyogZ2V0IGlkbGUgdGltZSAqLworI2RlZmluZSBQUFBJT0NORVdVTklUCV9JT1dSKCd0JywgNjIsIGludCkJLyogY3JlYXRlIG5ldyBwcHAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NBVFRBQ0gJX0lPVygndCcsIDYxLCBpbnQpCS8qIGF0dGFjaCB0byBwcHAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NERVRBQ0gJX0lPVygndCcsIDYwLCBpbnQpCS8qIGRldGFjaCBmcm9tIHBwcCB1bml0L2NoYW4gKi8KKyNkZWZpbmUgUFBQSU9DU01SUlUJX0lPVygndCcsIDU5LCBpbnQpCS8qIHNldCBtdWx0aWxpbmsgTVJVICovCisjZGVmaW5lIFBQUElPQ0NPTk5FQ1QJX0lPVygndCcsIDU4LCBpbnQpCS8qIGNvbm5lY3QgY2hhbm5lbCB0byB1bml0ICovCisjZGVmaW5lIFBQUElPQ0RJU0NPTk4JX0lPKCd0JywgNTcpCQkvKiBkaXNjb25uZWN0IGNoYW5uZWwgKi8KKyNkZWZpbmUgUFBQSU9DQVRUQ0hBTglfSU9XKCd0JywgNTYsIGludCkJLyogYXR0YWNoIHRvIHBwcCBjaGFubmVsICovCisjZGVmaW5lIFBQUElPQ0dDSEFOCV9JT1IoJ3QnLCA1NSwgaW50KQkvKiBnZXQgcHBwIGNoYW5uZWwgbnVtYmVyICovCisjZGVmaW5lIFBQUElPQ0dMMlRQU1RBVFMgX0lPUigndCcsIDU0LCBzdHJ1Y3QgcHBwb2wydHBfaW9jX3N0YXRzKQorCisjZGVmaW5lIFNJT0NHUFBQU1RBVFMgICAoU0lPQ0RFVlBSSVZBVEUgKyAwKQorI2RlZmluZSBTSU9DR1BQUFZFUiAgICAgKFNJT0NERVZQUklWQVRFICsgMSkJLyogTkVWRVIgY2hhbmdlIHRoaXMhISAqLworI2RlZmluZSBTSU9DR1BQUENTVEFUUyAgKFNJT0NERVZQUklWQVRFICsgMikKKworI2lmICFkZWZpbmVkKGlmcl9tdHUpCisjZGVmaW5lIGlmcl9tdHUJaWZyX2lmcnUuaWZydV9tZXRyaWMKKyNlbmRpZgorCisjZW5kaWYgLyogX0lGX1BQUF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHBvbDJ0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9wcHBvbDJ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTk4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG9sMnRwLmgKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggUFBQIG92ZXIgTDJUUCAoUFBQb0wyVFApIFNvY2tldCBJbXBsZW1lbnRhdGlvbiAoUkZDIDI2NjEpCisgKgorICogVGhpcyBmaWxlIHN1cHBsaWVzIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IHRoZSBQUFAgb3ZlciBMMlRQIGRyaXZlcgorICogKHBwcG9sMnRwLmMpLiAgQWxsIHZlcnNpb24gaW5mb3JtYXRpb24gd3J0IHRoaXMgZmlsZSBpcyBsb2NhdGVkIGluIHBwcG9sMnRwLmMKKyAqCisgKiBMaWNlbnNlOgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9JRl9QUFBPTDJUUF9ICisjZGVmaW5lIF9fTElOVVhfSUZfUFBQT0wyVFBfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKworLyogU3RydWN0dXJlIHVzZWQgdG8gY29ubmVjdCgpIHRoZSBzb2NrZXQgdG8gYSBwYXJ0aWN1bGFyIHR1bm5lbCBVRFAKKyAqIHNvY2tldC4KKyAqLworc3RydWN0IHBwcG9sMnRwX2FkZHIKK3sKKwlwaWRfdAlwaWQ7CQkJLyogcGlkIHRoYXQgb3ducyB0aGUgZmQuCisJCQkJCSAqIDAgPT4gY3VycmVudCAqLworCWludAlmZDsJCQkvKiBGRCBvZiBVRFAgc29ja2V0IHRvIHVzZSAqLworCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CS8qIElQIGFkZHJlc3MgYW5kIHBvcnQgdG8gc2VuZCB0byAqLworCisJX191MTYgc190dW5uZWwsIHNfc2Vzc2lvbjsJLyogRm9yIG1hdGNoaW5nIGluY29taW5nIHBhY2tldHMgKi8KKwlfX3UxNiBkX3R1bm5lbCwgZF9zZXNzaW9uOwkvKiBGb3Igc2VuZGluZyBvdXRnb2luZyBwYWNrZXRzICovCit9OworCisvKiBTb2NrZXQgb3B0aW9uczoKKyAqIERFQlVHCS0gYml0bWFzayBvZiBkZWJ1ZyBtZXNzYWdlIGNhdGVnb3JpZXMKKyAqIFNFTkRTRVEJLSAwID0+IGRvbid0IHNlbmQgcGFja2V0cyB3aXRoIHNlcXVlbmNlIG51bWJlcnMKKyAqCQkgIDEgPT4gc2VuZCBwYWNrZXRzIHdpdGggc2VxdWVuY2UgbnVtYmVycworICogUkVDVlNFUQktIDAgPT4gcmVjZWl2ZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVycyBhcmUgb3B0aW9uYWwKKyAqCQkgIDEgPT4gZHJvcCByZWNlaXZlIHBhY2tldHMgd2l0aG91dCBzZXF1ZW5jZSBudW1iZXJzCisgKiBMTlNNT0RFCS0gMCA9PiBhY3QgYXMgTEFDLgorICoJCSAgMSA9PiBhY3QgYXMgTE5TLgorICogUkVPUkRFUlRPCS0gcmVvcmRlciB0aW1lb3V0IChpbiBtaWxsaXNlY3MpLiBJZiAwLCBkb24ndCB0cnkgdG8gcmVvcmRlci4KKyAqLworZW51bSB7CisJUFBQT0wyVFBfU09fREVCVUcJPSAxLAorCVBQUE9MMlRQX1NPX1JFQ1ZTRVEJPSAyLAorCVBQUE9MMlRQX1NPX1NFTkRTRVEJPSAzLAorCVBQUE9MMlRQX1NPX0xOU01PREUJPSA0LAorCVBQUE9MMlRQX1NPX1JFT1JERVJUTwk9IDUsCit9OworCisvKiBEZWJ1ZyBtZXNzYWdlIGNhdGVnb3JpZXMgZm9yIHRoZSBERUJVRyBzb2NrZXQgb3B0aW9uICovCitlbnVtIHsKKwlQUFBPTDJUUF9NU0dfREVCVUcJPSAoMSA8PCAwKSwJLyogdmVyYm9zZSBkZWJ1ZyAoaWYKKwkJCQkJCSAqIGNvbXBpbGVkIGluKSAqLworCVBQUE9MMlRQX01TR19DT05UUk9MCT0gKDEgPDwgMSksCS8qIHVzZXJzcGFjZSAtIGtlcm5lbAorCQkJCQkJICogaW50ZXJmYWNlICovCisJUFBQT0wyVFBfTVNHX1NFUQk9ICgxIDw8IDIpLAkvKiBzZXF1ZW5jZSBudW1iZXJzICovCisJUFBQT0wyVFBfTVNHX0RBVEEJPSAoMSA8PCAzKSwJLyogZGF0YSBwYWNrZXRzICovCit9OworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjYmVmNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaApAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggUFBQIG92ZXIgWCAtIEdlbmVyaWMgUFBQIHRyYW5zcG9ydCBsYXllciBzb2NrZXRzCisgKiBMaW51eCBQUFAgb3ZlciBFdGhlcm5ldCAoUFBQb0UpIFNvY2tldCBJbXBsZW1lbnRhdGlvbiAoUkZDIDI1MTYpIAorICoKKyAqIFRoaXMgZmlsZSBzdXBwbGllcyBkZWZpbml0aW9ucyByZXF1aXJlZCBieSB0aGUgUFBQIG92ZXIgRXRoZXJuZXQgZHJpdmVyCisgKiAocHBwb3guYykuICBBbGwgdmVyc2lvbiBpbmZvcm1hdGlvbiB3cnQgdGhpcyBmaWxlIGlzIGxvY2F0ZWQgaW4gcHBwb3guYworICoKKyAqIExpY2Vuc2U6CisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lGX1BQUE9YX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9QUFBPWF9ICisKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmX3BwcG9sMnRwLmg+CisKKy8qIEZvciB1c2VyLXNwYWNlIHByb2dyYW1zIHRvIHBpY2sgdXAgdGhlc2UgZGVmaW5pdGlvbnMKKyAqIHdoaWNoIHRoZXkgd291bGRuJ3QgZ2V0IG90aGVyd2lzZSB3aXRob3V0IGRlZmluaW5nIF9fS0VSTkVMX18KKyAqLworI2lmbmRlZiBBRl9QUFBPWAorI2RlZmluZSBBRl9QUFBPWAkyNAorI2RlZmluZSBQRl9QUFBPWAlBRl9QUFBPWAorI2VuZGlmIC8qICEoQUZfUFBQT1gpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBQUFBvRSBhZGRyZXNzaW5nIGRlZmluaXRpb24gCisgKi8gCit0eXBlZGVmIF9fYmUxNiBzaWRfdDsKK3N0cnVjdCBwcHBvZV9hZGRyeyAKKyAgICAgICBzaWRfdCAgICAgICAgICAgc2lkOyAgICAgICAgICAgICAgICAgICAgLyogU2Vzc2lvbiBpZGVudGlmaWVyICovIAorICAgICAgIHVuc2lnbmVkIGNoYXIgICByZW1vdGVbRVRIX0FMRU5dOyAgICAgICAvKiBSZW1vdGUgYWRkcmVzcyAqLyAKKyAgICAgICBjaGFyICAgICAgICAgICAgZGV2W0lGTkFNU0laXTsgICAgICAgICAgLyogTG9jYWwgZGV2aWNlIHRvIHVzZSAqLyAKK307IAorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIFByb3RvY29scyBzdXBwb3J0ZWQgYnkgQUZfUFBQT1ggCisgKi8gCisjZGVmaW5lIFBYX1BST1RPX09FICAgIDAgLyogQ3VycmVudGx5IGp1c3QgUFBQb0UgKi8KKyNkZWZpbmUgUFhfUFJPVE9fT0wyVFAgMSAvKiBOb3cgTDJUUCBhbHNvICovCisjZGVmaW5lIFBYX01BWF9QUk9UTyAgIDIKKworc3RydWN0IHNvY2thZGRyX3BwcG94IHsgCisgICAgICAgc2FfZmFtaWx5X3QgICAgIHNhX2ZhbWlseTsgICAgICAgICAgICAvKiBhZGRyZXNzIGZhbWlseSwgQUZfUFBQT1ggKi8gCisgICAgICAgdW5zaWduZWQgaW50ICAgIHNhX3Byb3RvY29sOyAgICAgICAgICAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovIAorICAgICAgIHVuaW9ueyAKKyAgICAgICAgICAgICAgIHN0cnVjdCBwcHBvZV9hZGRyICAgICAgIHBwcG9lOyAKKyAgICAgICB9c2FfYWRkcjsgCit9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAKKworLyogVGhlIHVzZSBvZiB0aGUgYWJvdmUgdW5pb24gaXNuJ3QgdmlhYmxlIGJlY2F1c2UgdGhlIHNpemUgb2YgdGhpcworICogc3RydWN0IG11c3Qgc3RheSBmaXhlZCBvdmVyIHRpbWUgLS0gYXBwbGljYXRpb25zIHVzZSBzaXplb2Yoc3RydWN0CisgKiBzb2NrYWRkcl9wcHBveCkgdG8gZmlsbCBpdC4gV2UgdXNlIGEgcHJvdG9jb2wgc3BlY2lmaWMgc29ja2FkZHIKKyAqIHR5cGUgaW5zdGVhZC4KKyAqLworc3RydWN0IHNvY2thZGRyX3BwcG9sMnRwIHsKKwlzYV9mYW1pbHlfdCAgICAgc2FfZmFtaWx5OyAgICAgIC8qIGFkZHJlc3MgZmFtaWx5LCBBRl9QUFBPWCAqLworCXVuc2lnbmVkIGludCAgICBzYV9wcm90b2NvbDsgICAgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXN0cnVjdCBwcHBvbDJ0cF9hZGRyIHBwcG9sMnRwOworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGlvY3RsIGludGVyZmFjZSBmb3IgZGVmaW5pbmcgZm9yd2FyZGluZyBvZiBjb25uZWN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQUFBPRUlPQ1NGV0QJX0lPVygweEIxICwwLCBzaXplX3QpCisjZGVmaW5lIFBQUE9FSU9DREZXRAlfSU8oMHhCMSAsMSkKKy8qI2RlZmluZSBQUFBPRUlPQ0dGV0QJX0lPV1IoMHhCMSwyLCBzaXplX3QpKi8KKworLyogQ29kZXMgdG8gaWRlbnRpZnkgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBQQURJX0NPREUJMHgwOQorI2RlZmluZSBQQURPX0NPREUJMHgwNworI2RlZmluZSBQQURSX0NPREUJMHgxOQorI2RlZmluZSBQQURTX0NPREUJMHg2NQorI2RlZmluZSBQQURUX0NPREUJMHhhNworc3RydWN0IHBwcG9lX3RhZyB7CisJX19iZTE2IHRhZ190eXBlOworCV9fYmUxNiB0YWdfbGVuOworCWNoYXIgdGFnX2RhdGFbMF07Cit9IF9fYXR0cmlidXRlICgocGFja2VkKSk7CisKKy8qIFRhZyBpZGVudGlmaWVycyAqLworI2RlZmluZSBQVFRfRU9MCQlfX2NvbnN0YW50X2h0b25zKDB4MDAwMCkKKyNkZWZpbmUgUFRUX1NSVl9OQU1FCV9fY29uc3RhbnRfaHRvbnMoMHgwMTAxKQorI2RlZmluZSBQVFRfQUNfTkFNRQlfX2NvbnN0YW50X2h0b25zKDB4MDEwMikKKyNkZWZpbmUgUFRUX0hPU1RfVU5JUQlfX2NvbnN0YW50X2h0b25zKDB4MDEwMykKKyNkZWZpbmUgUFRUX0FDX0NPT0tJRQlfX2NvbnN0YW50X2h0b25zKDB4MDEwNCkKKyNkZWZpbmUgUFRUX1ZFTkRPUiAJX19jb25zdGFudF9odG9ucygweDAxMDUpCisjZGVmaW5lIFBUVF9SRUxBWV9TSUQJX19jb25zdGFudF9odG9ucygweDAxMTApCisjZGVmaW5lIFBUVF9TUlZfRVJSICAgICBfX2NvbnN0YW50X2h0b25zKDB4MDIwMSkKKyNkZWZpbmUgUFRUX1NZU19FUlIgIAlfX2NvbnN0YW50X2h0b25zKDB4MDIwMikKKyNkZWZpbmUgUFRUX0dFTl9FUlIgIAlfX2NvbnN0YW50X2h0b25zKDB4MDIwMykKKworc3RydWN0IHBwcG9lX2hkciB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCB2ZXIgOiA0OworCV9fdTggdHlwZSA6IDQ7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHR5cGUgOiA0OworCV9fdTggdmVyIDogNDsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4IGNvZGU7CisJX19iZTE2IHNpZDsKKwlfX2JlMTYgbGVuZ3RoOworCXN0cnVjdCBwcHBvZV90YWcgdGFnWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIExlbmd0aCBvZiBlbnRpcmUgUFBQb0UgKyBQUFAgaGVhZGVyICovCisjZGVmaW5lIFBQUE9FX1NFU19ITEVOCTgKKworCisjZW5kaWYgLyogIShfX0xJTlVYX0lGX1BQUE9YX0gpICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zaGFwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2M2YWNlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zaGFwZXIuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fTElOVVhfU0hBUEVSX0gKKyNkZWZpbmUgX19MSU5VWF9TSEFQRVJfSAorCisKKyNkZWZpbmUgU0hBUEVSX1NFVF9ERVYJCTB4MDAwMQorI2RlZmluZSBTSEFQRVJfU0VUX1NQRUVECTB4MDAwMgorI2RlZmluZSBTSEFQRVJfR0VUX0RFVgkJMHgwMDAzCisjZGVmaW5lIFNIQVBFUl9HRVRfU1BFRUQJMHgwMDA0CisKK3N0cnVjdCBzaGFwZXJjb25mCit7CisJX191MTYJc3NfY21kOworCXVuaW9uCisJeworCQljaGFyIAlzc3VfbmFtZVsxNF07CisJCV9fdTMyCXNzdV9zcGVlZDsKKwl9IHNzX3U7CisjZGVmaW5lIHNzX3NwZWVkIHNzX3Uuc3N1X3NwZWVkCisjZGVmaW5lIHNzX25hbWUgc3NfdS5zc3VfbmFtZQorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3NsaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjRlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3NsaXAuaApAQCAtMCwwICsxLDMwIEBACisvKgorICoJU3dhbnNlYSBVbml2ZXJzaXR5IENvbXB1dGVyIFNvY2lldHkJTkVUMworICoJCisgKglUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbnN0YW50cyBvZiBzcGVjaWFsIHVzZSB3aXRoIHRoZSBTTElQL0NTTElQLworICoJS0lTUyBUTkMgZHJpdmVyLgorICovCisgCisjaWZuZGVmIF9fTElOVVhfU0xJUF9ICisjZGVmaW5lIF9fTElOVVhfU0xJUF9ICisKKyNkZWZpbmUJCVNMX01PREVfU0xJUAkJMAorI2RlZmluZQkJU0xfTU9ERV9DU0xJUAkJMQorI2RlZmluZSAJU0xfTU9ERV9LSVNTCQk0CisKKyNkZWZpbmUJCVNMX09QVF9TSVhCSVQJCTIKKyNkZWZpbmUJCVNMX09QVF9BREFQVElWRQkJOAorCisvKgorICoJVlNWID0gaW9jdGwgZm9yIGtlZXBhbGl2ZSAmIG91dGZpbGwgaW4gU0xJUCBkcml2ZXIgCisgKi8KKyAKKyNkZWZpbmUgU0lPQ1NLRUVQQUxJVkUJKFNJT0NERVZQUklWQVRFKQkJLyogU2V0IGtlZXBhbGl2ZSB0aW1lb3V0IGluIHNlYyAqLworI2RlZmluZSBTSU9DR0tFRVBBTElWRQkoU0lPQ0RFVlBSSVZBVEUrMSkJCS8qIEdldCBrZWVwYWxpdmUgdGltZW91dCAqLworI2RlZmluZSBTSU9DU09VVEZJTEwJKFNJT0NERVZQUklWQVRFKzIpCQkvKiBTZXQgb3V0ZmlsbCB0aW1lb3V0ICovCisjZGVmaW5lCVNJT0NHT1VURklMTAkoU0lPQ0RFVlBSSVZBVEUrMykJCS8qIEdldCBvdXRmaWxsIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0lPQ1NMRUFTRQkoU0lPQ0RFVlBSSVZBVEUrNCkJCS8qIFNldCAibGVhc2VkIiBsaW5lIHR5cGUgKi8KKyNkZWZpbmUJU0lPQ0dMRUFTRQkoU0lPQ0RFVlBSSVZBVEUrNSkJCS8qIEdldCBsaW5lIHR5cGUgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc3RyaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfc3RyaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjVjNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl9zdHJpcC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBpZl9zdHJpcC5oIC0tCisgKgorICogICAgICBEZWZpbml0aW9ucyBmb3IgdGhlIFNUUklQIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAxOTk2IFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiBUaGUgTGVsYW5kIFN0YW5mb3JkCisgKiBKdW5pb3IgVW5pdmVyc2l0eS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CisgKiBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLiAgU3RhbmZvcmQgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfU1RSSVBfSAorI2RlZmluZSBfX0xJTlVYX1NUUklQX0gKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9fdTggY1s2XTsKK30gTWV0cmljb21BZGRyZXNzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJjZTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90ci5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgVG9rZW4tUmluZyBJRUVFIDgwMi41IGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpaWZfdHIuaAkwLjAJMDcvMTEvOTQKKyAqCisgKiBBdXRob3I6CUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCVBldGVyIERlIFNjaHJpanZlciwgPHN0dWQxMUBjYzQua3VsZXV2ZW4uYWMuYmU+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lGX1RSX0gKKyNkZWZpbmUgX0xJTlVYX0lGX1RSX0gKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogRm9yIF9fYmUxNiAqLworCisvKiBJRUVFIDgwMi41IFRva2VuLVJpbmcgbWFnaWMgY29uc3RhbnRzLiAgVGhlIGZyYW1lIHNpemVzIG9taXQgdGhlIHByZWFtYmxlCisgICBhbmQgRkNTL0NSQyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLiAqLworI2RlZmluZSBUUl9BTEVOCQk2CQkvKiBPY3RldHMgaW4gb25lIHRva2VuLXJpbmcgYWRkciAqLworI2RlZmluZSBUUl9ITEVOIAkoc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKStzaXplb2Yoc3RydWN0IHRybGxjKSkKKyNkZWZpbmUgQUMJCTB4MTAKKyNkZWZpbmUgTExDX0ZSQU1FIAkweDQwCisKKy8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVhURU5ERURfU0FQIAkweEFBCisjZGVmaW5lIFVJX0NNRCAgICAgICAJMHgwMworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgZnJhbWUgaGVhZGVyLiAqLworc3RydWN0IHRyaF9oZHIgeworCV9fdTggIGFjOwkJCS8qIGFjY2VzcyBjb250cm9sIGZpZWxkICovCisJX191OCAgZmM7CQkJLyogZnJhbWUgY29udHJvbCBmaWVsZCAqLworCV9fdTggIGRhZGRyW1RSX0FMRU5dOwkJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCV9fdTggIHNhZGRyW1RSX0FMRU5dOwkJLyogc291cmNlIGFkZHJlc3MgKi8KKwlfX2JlMTYgcmNmOwkJCS8qIHJvdXRlIGNvbnRyb2wgZmllbGQgKi8KKwlfX2JlMTYgcnNlZ1s4XTsJCQkvKiByb3V0aW5nIHJlZ2lzdGVycyAqLworfTsKKworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgTExDIHN0cnVjdHVyZSAqLworc3RydWN0IHRybGxjIHsKKwlfX3U4ICBkc2FwOwkJCS8qIGRlc3RpbmF0aW9uIFNBUCAqLworCV9fdTggIHNzYXA7CQkJLyogc291cmNlIFNBUCAqLworCV9fdTggIGxsYzsJCQkvKiBMTEMgY29udHJvbCBmaWVsZCAqLworCV9fdTggIHByb3RpZFszXTsJCS8qIHByb3RvY29sIGlkICovCisJX19iZTE2IGV0aGVydHlwZTsJCS8qIGV0aGVyIHR5cGUgZmllbGQgKi8KK307CisKKy8qIFRva2VuLVJpbmcgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGRhdGEuICovCitzdHJ1Y3QgdHJfc3RhdGlzdGljcyB7CisJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOyAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOwkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkCSovCisJdW5zaWduZWQgbG9uZyByeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICAgCSovCisJdW5zaWduZWQgbG9uZyB0eF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkCSovCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkCQkqLworCXVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOwkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMJKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Ryb3BwZWQ7CS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eAkqLworCXVuc2lnbmVkIGxvbmcgbXVsdGljYXN0OwkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCXVuc2lnbmVkIGxvbmcgdHJhbnNtaXRfY29sbGlzaW9uOworCisJLyogZGV0YWlsZWQgVG9rZW4tUmluZyBlcnJvcnMuIFNlZSBJQk0gVG9rZW4tUmluZyBOZXR3b3JrCisJICAgQXJjaGl0ZWN0dXJlIGZvciBtb3JlIGluZm8gKi8KKworCXVuc2lnbmVkIGxvbmcgbGluZV9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBpbnRlcm5hbF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBidXJzdF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBBX0NfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgYWJvcnRfZGVsaW1pdGVyczsKKwl1bnNpZ25lZCBsb25nIGxvc3RfZnJhbWVzOworCXVuc2lnbmVkIGxvbmcgcmVjdl9jb25nZXN0X2NvdW50OworCXVuc2lnbmVkIGxvbmcgZnJhbWVfY29waWVkX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeV9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyB0b2tlbl9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyBkdW1teTE7Cit9OworCisvKiBzb3VyY2Ugcm91dGluZyBzdHVmZiAqLworI2RlZmluZSBUUl9SSUkgCQkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfRElSX0JJVCAJCTB4ODAKKyNkZWZpbmUgVFJfUkNGX0xFTl9NQVNLIAkweDFmMDAKKyNkZWZpbmUgVFJfUkNGX0JST0FEQ0FTVCAJMHg4MDAwCS8qIGFsbC1yb3V0ZXMgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCAweEMwMDAJLyogc2luZ2xlLXJvdXRlIGJyb2FkY2FzdCAqLworI2RlZmluZSBUUl9SQ0ZfRlJBTUUySyAJCTB4MjAKKyNkZWZpbmUgVFJfUkNGX0JST0FEQ0FTVF9NQVNLIAkweEMwMDAKKyNkZWZpbmUgVFJfTUFYUklGTEVOIAkJMTgKKworI2VuZGlmCS8qIF9MSU5VWF9JRl9UUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3R1bi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDVmMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW4uaApAQCAtMCwwICsxLDYwIEBACisvKgorICogIFVuaXZlcnNhbCBUVU4vVEFQIGRldmljZSBkcml2ZXIuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgTWF4aW0gS3Jhc255YW5za3kgPG1heF9ta0B5YWhvby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgJElkOiBpZl90dW4uaCx2IDEuMiAyMDAxLzA2LzAxIDE4OjM5OjQ3IGRhdmVtIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0lGX1RVTl9ICisjZGVmaW5lIF9fSUZfVFVOX0gKKworLyogVW5jb21tZW50IHRvIGVuYWJsZSBkZWJ1Z2dpbmcgKi8KKy8qICNkZWZpbmUgVFVOX0RFQlVHIDEgKi8KKworCisvKiBSZWFkIHF1ZXVlIHNpemUgKi8KKyNkZWZpbmUgVFVOX1JFQURRX1NJWkUJNTAwCisKKy8qIFRVTiBkZXZpY2UgZmxhZ3MgKi8KKyNkZWZpbmUgVFVOX1RVTl9ERVYgCTB4MDAwMQkKKyNkZWZpbmUgVFVOX1RBUF9ERVYJMHgwMDAyCisjZGVmaW5lIFRVTl9UWVBFX01BU0sgICAweDAwMGYKKworI2RlZmluZSBUVU5fRkFTWU5DCTB4MDAxMAorI2RlZmluZSBUVU5fTk9DSEVDS1NVTQkweDAwMjAKKyNkZWZpbmUgVFVOX05PX1BJCTB4MDA0MAorI2RlZmluZSBUVU5fT05FX1FVRVVFCTB4MDA4MAorI2RlZmluZSBUVU5fUEVSU0lTVCAJMHgwMTAwCQorCisvKiBJb2N0bCBkZWZpbmVzICovCisjZGVmaW5lIFRVTlNFVE5PQ1NVTSAgX0lPVygnVCcsIDIwMCwgaW50KSAKKyNkZWZpbmUgVFVOU0VUREVCVUcgICBfSU9XKCdUJywgMjAxLCBpbnQpIAorI2RlZmluZSBUVU5TRVRJRkYgICAgIF9JT1coJ1QnLCAyMDIsIGludCkgCisjZGVmaW5lIFRVTlNFVFBFUlNJU1QgX0lPVygnVCcsIDIwMywgaW50KSAKKyNkZWZpbmUgVFVOU0VUT1dORVIgICBfSU9XKCdUJywgMjA0LCBpbnQpCisjZGVmaW5lIFRVTlNFVExJTksgICAgX0lPVygnVCcsIDIwNSwgaW50KQorI2RlZmluZSBUVU5TRVRHUk9VUCAgIF9JT1coJ1QnLCAyMDYsIGludCkKKworLyogVFVOU0VUSUZGIGlmciBmbGFncyAqLworI2RlZmluZSBJRkZfVFVOCQkweDAwMDEKKyNkZWZpbmUgSUZGX1RBUAkJMHgwMDAyCisjZGVmaW5lIElGRl9OT19QSQkweDEwMDAKKyNkZWZpbmUgSUZGX09ORV9RVUVVRQkweDIwMDAKKworc3RydWN0IHR1bl9waSB7CisJdW5zaWduZWQgc2hvcnQgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgcHJvdG87Cit9OworI2RlZmluZSBUVU5fUEtUX1NUUklQCTB4MDAwMQorCisjZW5kaWYgLyogX19JRl9UVU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwYjUwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfSUZfVFVOTkVMX0hfCisjZGVmaW5lIF9JRl9UVU5ORUxfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgU0lPQ0dFVFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NBRERUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DREVMVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgU0lPQ0NIR1RVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDMpCisKKyNkZWZpbmUgR1JFX0NTVU0JX19jb25zdGFudF9odG9ucygweDgwMDApCisjZGVmaW5lIEdSRV9ST1VUSU5HCV9fY29uc3RhbnRfaHRvbnMoMHg0MDAwKQorI2RlZmluZSBHUkVfS0VZCQlfX2NvbnN0YW50X2h0b25zKDB4MjAwMCkKKyNkZWZpbmUgR1JFX1NFUQkJX19jb25zdGFudF9odG9ucygweDEwMDApCisjZGVmaW5lIEdSRV9TVFJJQ1QJX19jb25zdGFudF9odG9ucygweDA4MDApCisjZGVmaW5lIEdSRV9SRUMJCV9fY29uc3RhbnRfaHRvbnMoMHgwNzAwKQorI2RlZmluZSBHUkVfRkxBR1MJX19jb25zdGFudF9odG9ucygweDAwRjgpCisjZGVmaW5lIEdSRV9WRVJTSU9OCV9fY29uc3RhbnRfaHRvbnMoMHgwMDA3KQorCitzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0KK3sKKwljaGFyCQkJbmFtZVtJRk5BTVNJWl07CisJaW50CQkJbGluazsKKwlfX2JlMTYJCQlpX2ZsYWdzOworCV9fYmUxNgkJCW9fZmxhZ3M7CisJX19iZTMyCQkJaV9rZXk7CisJX19iZTMyCQkJb19rZXk7CisJc3RydWN0IGlwaGRyCQlpcGg7Cit9OworCisjZW5kaWYgLyogX0lGX1RVTk5FTF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl92bGFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE0YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFZMQU4JCUFuIGltcGxlbWVudGF0aW9uIG9mIDgwMi4xUSBWTEFOIHRhZ2dpbmcuCisgKgorICogQXV0aG9yczoJQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX1ZMQU5fSF8KKyNkZWZpbmUgX0xJTlVYX0lGX1ZMQU5fSF8KKworCisvKiBWTEFOIElPQ1RMcyBhcmUgZm91bmQgaW4gc29ja2lvcy5oICovCisKKy8qIFBhc3NlZCBpbiB2bGFuX2lvY3RsX2FyZ3Mgc3RydWN0dXJlIHRvIGRldGVybWluZSBiZWhhdmlvdXIuICovCitlbnVtIHZsYW5faW9jdGxfY21kcyB7CisJQUREX1ZMQU5fQ01ELAorCURFTF9WTEFOX0NNRCwKKwlTRVRfVkxBTl9JTkdSRVNTX1BSSU9SSVRZX0NNRCwKKwlTRVRfVkxBTl9FR1JFU1NfUFJJT1JJVFlfQ01ELAorCUdFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01ELAorCUdFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQsCisJU0VUX1ZMQU5fTkFNRV9UWVBFX0NNRCwKKwlTRVRfVkxBTl9GTEFHX0NNRCwKKwlHRVRfVkxBTl9SRUFMREVWX05BTUVfQ01ELCAvKiBJZiB0aGlzIHdvcmtzLCB5b3Uga25vdyBpdCdzIGEgVkxBTiBkZXZpY2UsIGJ0dyAqLworCUdFVF9WTEFOX1ZJRF9DTUQgLyogR2V0IHRoZSBWSUQgb2YgdGhpcyBWTEFOIChzcGVjaWZpZWQgYnkgbmFtZSkgKi8KK307CisKK2VudW0gdmxhbl9mbGFncyB7CisJVkxBTl9GTEFHX1JFT1JERVJfSERSCT0gMHgxLAorfTsKKworZW51bSB2bGFuX25hbWVfdHlwZXMgeworCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgdmxhbjAwMDUgKi8KKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSUQsIC8qIG5hbWUgd2lsbCBsb29rIGxpa2U6ICBldGgxLjAwMDUgKi8KKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRF9OT19QQUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICB2bGFuNSAqLworCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRF9OT19QQUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICBldGgwLjUgKi8KKwlWTEFOX05BTUVfVFlQRV9ISUdIRVNUCit9OworCitzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzIHsKKwlpbnQgY21kOyAvKiBTaG91bGQgYmUgb25lIG9mIHRoZSB2bGFuX2lvY3RsX2NtZHMgZW51bSBhYm92ZS4gKi8KKwljaGFyIGRldmljZTFbMjRdOworCisgICAgICAgIHVuaW9uIHsKKwkJY2hhciBkZXZpY2UyWzI0XTsKKwkJaW50IFZJRDsKKwkJdW5zaWduZWQgaW50IHNrYl9wcmlvcml0eTsKKwkJdW5zaWduZWQgaW50IG5hbWVfdHlwZTsKKwkJdW5zaWduZWQgaW50IGJpbmRfdHlwZTsKKwkJdW5zaWduZWQgaW50IGZsYWc7IC8qIE1hdGNoZXMgdmxhbl9kZXZfaW5mbyBmbGFncyAqLworICAgICAgICB9IHU7CisKKwlzaG9ydCB2bGFuX3FvczsgICAKK307CisKKyNlbmRpZiAvKiAhKF9MSU5VWF9JRl9WTEFOX0hfKSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl93YW5waXBlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lmX3dhbnBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRiYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pZl93YW5waXBlLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpZl93YW5waXBlLmgJSGVhZGVyIGZpbGUgZm9yIHRoZSBTYW5nb21hIEFGX1dBTlBJUEUgU29ja2V0IAkKKyoKKyogQXV0aG9yOiAJTmVuYWQgQ29yYmljIAkKKyoKKyogQ29weXJpZ2h0OgkoYykgMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIEphbiAyOCwgMjAwMAlOZW5hZCBDb3JiaWMgCUluaXRpYWwgVmVyc2lvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19MSU5VWF9JRl9XQU5fUEFDS0VUX0gKKyNkZWZpbmUgX19MSU5VWF9JRl9XQU5fUEFDS0VUX0gKKworc3RydWN0IHdhbl9zb2NrYWRkcl9sbAoreworCXVuc2lnbmVkIHNob3J0CXNsbF9mYW1pbHk7CisJdW5zaWduZWQgc2hvcnQJc2xsX3Byb3RvY29sOworCWludAkJc2xsX2lmaW5kZXg7CisJdW5zaWduZWQgc2hvcnQJc2xsX2hhdHlwZTsKKwl1bnNpZ25lZCBjaGFyCXNsbF9wa3R0eXBlOworCXVuc2lnbmVkIGNoYXIJc2xsX2hhbGVuOworCXVuc2lnbmVkIGNoYXIJc2xsX2FkZHJbOF07CisJdW5zaWduZWQgY2hhciAgIHNsbF9kZXZpY2VbMTRdOworCXVuc2lnbmVkIGNoYXIgCXNsbF9jYXJkWzE0XTsKK307CisKK3R5cGVkZWYgc3RydWN0IAoreworCXVuc2lnbmVkIGNoYXIgZnJlZTsKKwl1bnNpZ25lZCBjaGFyIHN0YXRlX3NrOworCWludCByY3ZidWY7CisJaW50IHNuZGJ1ZjsKKwlpbnQgcm1lbTsKKwlpbnQgd21lbTsKKwlpbnQgc2tfY291bnQ7CisJdW5zaWduZWQgY2hhciBib3VuZDsKKwljaGFyIG5hbWVbMTRdOworCXVuc2lnbmVkIGNoYXIgZF9zdGF0ZTsKKwl1bnNpZ25lZCBjaGFyIHN2YzsKKwl1bnNpZ25lZCBzaG9ydCBsY247CisJdW5zaWduZWQgY2hhciBtYm94OworCXVuc2lnbmVkIGNoYXIgY21kX2J1c3k7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCXVuc2lnbmVkIHBvbGw7CisJdW5zaWduZWQgcG9sbF9jbnQ7CisJaW50IHJibG9jazsJCit9IHdhbl9kZWJ1Z19oZHJfdDsKKworI2RlZmluZSBNQVhfTlVNX0RFQlVHICAxMAorI2RlZmluZSBYMjVfUFJPVCAgICAgICAweDE2CisjZGVmaW5lIFBWQ19QUk9UICAgICAgIDB4MTcJCisKK3R5cGVkZWYgc3RydWN0Cit7CisJd2FuX2RlYnVnX2hkcl90IGRlYnVnW01BWF9OVU1fREVCVUddOworfXdhbl9kZWJ1Z190OworCisjZGVmaW5lCVNJT0NfV0FOUElQRV9HRVRfQ0FMTF9EQVRBCShTSU9DUFJPVE9QUklWQVRFICsgMCkKKyNkZWZpbmUJU0lPQ19XQU5QSVBFX1NFVF9DQUxMX0RBVEEJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DX1dBTlBJUEVfQUNDRVBUX0NBTEwJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DX1dBTlBJUEVfQ0xFQVJfQ0FMTAkgICAgICAgIChTSU9DUFJPVE9QUklWQVRFICsgMykKKyNkZWZpbmUgU0lPQ19XQU5QSVBFX1JFU0VUX0NBTEwJICAgICAgICAoU0lPQ1BST1RPUFJJVkFURSArIDQpCisjZGVmaW5lIFNJT0NfV0FOUElQRV9ERUJVRwkgICAgICAgIChTSU9DUFJPVE9QUklWQVRFICsgNSkKKyNkZWZpbmUgU0lPQ19XQU5QSVBFX1NFVF9OT05CTE9DSwkoU0lPQ1BST1RPUFJJVkFURSArIDYpCisjZGVmaW5lIFNJT0NfV0FOUElQRV9DSEVDS19UWAkJKFNJT0NQUk9UT1BSSVZBVEUgKyA3KQorI2RlZmluZSBTSU9DX1dBTlBJUEVfU09DS19TVEFURQkJKFNJT0NQUk9UT1BSSVZBVEUgKyA4KQorCisvKiBQYWNrZXQgdHlwZXMgKi8KKworI2RlZmluZSBXQU5fUEFDS0VUX0hPU1QJCTAJCS8qIFRvIHVzCQkqLworI2RlZmluZSBXQU5fUEFDS0VUX0JST0FEQ0FTVAkxCQkvKiBUbyBhbGwJCSovCisjZGVmaW5lIFdBTl9QQUNLRVRfTVVMVElDQVNUCTIJCS8qIFRvIGdyb3VwCQkqLworI2RlZmluZSBXQU5fUEFDS0VUX09USEVSSE9TVAkzCQkvKiBUbyBzb21lb25lIGVsc2UgCSovCisjZGVmaW5lIFdBTl9QQUNLRVRfT1VUR09JTkcJCTQJCS8qIE91dGdvaW5nIG9mIGFueSB0eXBlICovCisvKiBUaGVzZSBvbmVzIGFyZSBpbnZpc2libGUgYnkgdXNlciBsZXZlbCAqLworI2RlZmluZSBXQU5fUEFDS0VUX0xPT1BCQUNLCQk1CQkvKiBNQy9CUkQgZnJhbWUgbG9vcGVkIGJhY2sgKi8KKyNkZWZpbmUgV0FOX1BBQ0tFVF9GQVNUUk9VVEUJNgkJLyogRmFzdHJvdXRlZCBmcmFtZQkqLworCisKKy8qIFgyNSBzcGVjaWZpYyAqLworI2RlZmluZSBXQU5fUEFDS0VUX0RBVEEgCTcKKyNkZWZpbmUgV0FOX1BBQ0tFVF9DTUQgCQk4CisjZGVmaW5lIFdBTl9QQUNLRVRfQVNZTkMJOQorI2RlZmluZSBXQU5fUEFDS0VUX0VSUgkgICAgICAgMTAKKworLyogUGFja2V0IHNvY2tldCBvcHRpb25zICovCisKKyNkZWZpbmUgV0FOX1BBQ0tFVF9BRERfTUVNQkVSU0hJUAkJMQorI2RlZmluZSBXQU5fUEFDS0VUX0RST1BfTUVNQkVSU0hJUAkJMgorCisjZGVmaW5lIFdBTl9QQUNLRVRfTVJfTVVMVElDQVNUCTAKKyNkZWZpbmUgV0FOX1BBQ0tFVF9NUl9QUk9NSVNDCTEKKyNkZWZpbmUgV0FOX1BBQ0tFVF9NUl9BTExNVUxUSQkyCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaWdtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmRhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lnbXAuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqCUxpbnV4IE5FVDM6CUludGVybmV0IEdyb3VwIE1hbmFnZW1lbnQgUHJvdG9jb2wgIFtJR01QXQorICoKKyAqCUF1dGhvcnM6CisgKgkJQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqCisgKglFeHRlbmRlZCB0byB0YWxrIHRoZSBCU0QgZXh0ZW5kZWQgSUdNUCBwcm90b2NvbCBvZiBtcm91dGVkIDMuNgorICoKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lHTVBfSAorI2RlZmluZSBfTElOVVhfSUdNUF9ICisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKglJR01QIHByb3RvY29sIHN0cnVjdHVyZXMKKyAqLworCisvKgorICoJSGVhZGVyIGluIG9uIGNhYmxlIGZvcm1hdAorICovCisKK3N0cnVjdCBpZ21waGRyCit7CisJX191OCB0eXBlOworCV9fdTggY29kZTsJCS8qIEZvciBuZXdlciBJR01QICovCisJX19zdW0xNiBjc3VtOworCV9fYmUzMiBncm91cDsKK307CisKKy8qIFYzIGdyb3VwIHJlY29yZCB0eXBlcyBbZ3JlY190eXBlXSAqLworI2RlZmluZSBJR01QVjNfTU9ERV9JU19JTkNMVURFCQkxCisjZGVmaW5lIElHTVBWM19NT0RFX0lTX0VYQ0xVREUJCTIKKyNkZWZpbmUgSUdNUFYzX0NIQU5HRV9UT19JTkNMVURFCTMKKyNkZWZpbmUgSUdNUFYzX0NIQU5HRV9UT19FWENMVURFCTQKKyNkZWZpbmUgSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTCTUKKyNkZWZpbmUgSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTCTYKKworc3RydWN0IGlnbXB2M19ncmVjIHsKKwlfX3U4CWdyZWNfdHlwZTsKKwlfX3U4CWdyZWNfYXV4d29yZHM7CisJX19iZTE2CWdyZWNfbnNyY3M7CisJX19iZTMyCWdyZWNfbWNhOworCV9fYmUzMglncmVjX3NyY1swXTsKK307CisKK3N0cnVjdCBpZ21wdjNfcmVwb3J0IHsKKwlfX3U4IHR5cGU7CisJX191OCByZXN2MTsKKwlfX2JlMTYgY3N1bTsKKwlfX2JlMTYgcmVzdjI7CisJX19iZTE2IG5ncmVjOworCXN0cnVjdCBpZ21wdjNfZ3JlYyBncmVjWzBdOworfTsKKworc3RydWN0IGlnbXB2M19xdWVyeSB7CisJX191OCB0eXBlOworCV9fdTggY29kZTsKKwlfX2JlMTYgY3N1bTsKKwlfX2JlMzIgZ3JvdXA7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBxcnY6MywKKwkgICAgIHN1cHByZXNzOjEsCisJICAgICByZXN2OjQ7CisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHJlc3Y6NCwKKwkgICAgIHN1cHByZXNzOjEsCisJICAgICBxcnY6MzsKKyNlbHNlCisjZXJyb3IgIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4IHFxaWM7CisJX19iZTE2IG5zcmNzOworCV9fYmUzMiBzcmNzWzBdOworfTsKKworCisjZGVmaW5lIElHTVBfSE9TVF9NRU1CRVJTSElQX1FVRVJZCTB4MTEJLyogRnJvbSBSRkMxMTEyICovCisjZGVmaW5lIElHTVBfSE9TVF9NRU1CRVJTSElQX1JFUE9SVAkweDEyCS8qIERpdHRvICovCisjZGVmaW5lIElHTVBfRFZNUlAJCQkweDEzCS8qIERWTVJQIHJvdXRpbmcgKi8KKyNkZWZpbmUgSUdNUF9QSU0JCQkweDE0CS8qIFBJTSByb3V0aW5nICovCisjZGVmaW5lIElHTVBfVFJBQ0UJCQkweDE1CisjZGVmaW5lIElHTVBWMl9IT1NUX01FTUJFUlNISVBfUkVQT1JUCTB4MTYJLyogVjIgdmVyc2lvbiBvZiAweDExICovCisjZGVmaW5lIElHTVBfSE9TVF9MRUFWRV9NRVNTQUdFIAkweDE3CisjZGVmaW5lIElHTVBWM19IT1NUX01FTUJFUlNISVBfUkVQT1JUCTB4MjIJLyogVjMgdmVyc2lvbiBvZiAweDExICovCisKKyNkZWZpbmUgSUdNUF9NVFJBQ0VfUkVTUAkJMHgxZQorI2RlZmluZSBJR01QX01UUkFDRQkJCTB4MWYKKworCisvKgorICoJVXNlIHRoZSBCU0QgbmFtZXMgZm9yIHRoZXNlIGZvciBjb21wYXRpYmlsaXR5CisgKi8KKworI2RlZmluZSBJR01QX0RFTEFZSU5HX01FTUJFUgkJMHgwMQorI2RlZmluZSBJR01QX0lETEVfTUVNQkVSCQkweDAyCisjZGVmaW5lIElHTVBfTEFaWV9NRU1CRVIJCTB4MDMKKyNkZWZpbmUgSUdNUF9TTEVFUElOR19NRU1CRVIJCTB4MDQKKyNkZWZpbmUgSUdNUF9BV0FLRU5JTkdfTUVNQkVSCQkweDA1CisKKyNkZWZpbmUgSUdNUF9NSU5MRU4JCQk4CisKKyNkZWZpbmUgSUdNUF9NQVhfSE9TVF9SRVBPUlRfREVMQVkJMTAJLyogbWF4IGRlbGF5IGZvciByZXNwb25zZSB0byAqLworCQkJCQkJLyogcXVlcnkgKGluIHNlY29uZHMpCSovCisKKyNkZWZpbmUgSUdNUF9USU1FUl9TQ0FMRQkJMTAJLyogZGVub3RlcyB0aGF0IHRoZSBpZ21waGRyLT50aW1lciBmaWVsZCAqLworCQkJCQkJLyogc3BlY2lmaWVzIHRpbWUgaW4gMTB0aCBvZiBzZWNvbmRzCSAqLworCisjZGVmaW5lIElHTVBfQUdFX1RIUkVTSE9MRAkJNDAwCS8qIElmIHRoaXMgaG9zdCBkb24ndCBoZWFyIGFueSBJR01QIFYxCSovCisJCQkJCQkvKiBtZXNzYWdlIGluIHRoaXMgcGVyaW9kIG9mIHRpbWUsCSovCisJCQkJCQkvKiByZXZlcnQgdG8gSUdNUCB2MiByb3V0ZXIuCQkqLworCisjZGVmaW5lIElHTVBfQUxMX0hPU1RTCQlodG9ubCgweEUwMDAwMDAxTCkKKyNkZWZpbmUgSUdNUF9BTExfUk9VVEVSIAlodG9ubCgweEUwMDAwMDAyTCkKKyNkZWZpbmUgSUdNUFYzX0FMTF9NQ1IJIAlodG9ubCgweEUwMDAwMDE2TCkKKyNkZWZpbmUgSUdNUF9MT0NBTF9HUk9VUAlodG9ubCgweEUwMDAwMDAwTCkKKyNkZWZpbmUgSUdNUF9MT0NBTF9HUk9VUF9NQVNLCWh0b25sKDB4RkZGRkZGMDBMKQorCisvKgorICogc3RydWN0IGZvciBrZWVwaW5nIHRoZSBtdWx0aWNhc3QgbGlzdCBpbgorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGJjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRGVmaW5pdGlvbnMgb2YgdGhlIEludGVybmV0IFByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIylpbi5oCTEuMC4xCTA0LzIxLzkzCisgKgorICogQXV0aG9yczoJT3JpZ2luYWwgdGFrZW4gZnJvbSB0aGUgR05VIFByb2plY3QgPG5ldGluZXQvaW4uaD4gZmlsZS4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSU5fSAorI2RlZmluZSBfTElOVVhfSU5fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworLyogU3RhbmRhcmQgd2VsbC1kZWZpbmVkIElQIHByb3RvY29scy4gICovCitlbnVtIHsKKyAgSVBQUk9UT19JUCA9IDAsCQkvKiBEdW1teSBwcm90b2NvbCBmb3IgVENQCQkqLworICBJUFBST1RPX0lDTVAgPSAxLAkJLyogSW50ZXJuZXQgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sCSovCisgIElQUFJPVE9fSUdNUCA9IDIsCQkvKiBJbnRlcm5ldCBHcm91cCBNYW5hZ2VtZW50IFByb3RvY29sCSovCisgIElQUFJPVE9fSVBJUCA9IDQsCQkvKiBJUElQIHR1bm5lbHMgKG9sZGVyIEtBOVEgdHVubmVscyB1c2UgOTQpICovCisgIElQUFJPVE9fVENQID0gNiwJCS8qIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sCSovCisgIElQUFJPVE9fRUdQID0gOCwJCS8qIEV4dGVyaW9yIEdhdGV3YXkgUHJvdG9jb2wJCSovCisgIElQUFJPVE9fUFVQID0gMTIsCQkvKiBQVVAgcHJvdG9jb2wJCQkJKi8KKyAgSVBQUk9UT19VRFAgPSAxNywJCS8qIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wJCSovCisgIElQUFJPVE9fSURQID0gMjIsCQkvKiBYTlMgSURQIHByb3RvY29sCQkJKi8KKyAgSVBQUk9UT19EQ0NQID0gMzMsCQkvKiBEYXRhZ3JhbSBDb25nZXN0aW9uIENvbnRyb2wgUHJvdG9jb2wgKi8KKyAgSVBQUk9UT19SU1ZQID0gNDYsCQkvKiBSU1ZQIHByb3RvY29sCQkJKi8KKyAgSVBQUk9UT19HUkUgPSA0NywJCS8qIENpc2NvIEdSRSB0dW5uZWxzIChyZmMgMTcwMSwxNzAyKQkqLworCisgIElQUFJPVE9fSVBWNgkgPSA0MSwJCS8qIElQdjYtaW4tSVB2NCB0dW5uZWxsaW5nCQkqLworCisgIElQUFJPVE9fRVNQID0gNTAsICAgICAgICAgICAgLyogRW5jYXBzdWxhdGlvbiBTZWN1cml0eSBQYXlsb2FkIHByb3RvY29sICovCisgIElQUFJPVE9fQUggPSA1MSwgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gSGVhZGVyIHByb3RvY29sICAgICAgICovCisgIElQUFJPVE9fQkVFVFBIID0gOTQsCSAgICAgICAvKiBJUCBvcHRpb24gcHNldWRvIGhlYWRlciBmb3IgQkVFVCAqLworICBJUFBST1RPX1BJTSAgICA9IDEwMywJCS8qIFByb3RvY29sIEluZGVwZW5kZW50IE11bHRpY2FzdAkqLworCisgIElQUFJPVE9fQ09NUCAgID0gMTA4LCAgICAgICAgICAgICAgICAvKiBDb21wcmVzc2lvbiBIZWFkZXIgcHJvdG9jb2wgKi8KKyAgSVBQUk9UT19TQ1RQICAgPSAxMzIsCQkvKiBTdHJlYW0gQ29udHJvbCBUcmFuc3BvcnQgUHJvdG9jb2wJKi8KKyAgSVBQUk9UT19VRFBMSVRFID0gMTM2LAkvKiBVRFAtTGl0ZSAoUkZDIDM4MjgpCQkJKi8KKworICBJUFBST1RPX1JBVwkgPSAyNTUsCQkvKiBSYXcgSVAgcGFja2V0cwkJCSovCisgIElQUFJPVE9fTUFYCit9OworCisKKy8qIEludGVybmV0IGFkZHJlc3MuICovCitzdHJ1Y3QgaW5fYWRkciB7CisJX19iZTMyCXNfYWRkcjsKK307CisKKyNkZWZpbmUgSVBfVE9TCQkxCisjZGVmaW5lIElQX1RUTAkJMgorI2RlZmluZSBJUF9IRFJJTkNMCTMKKyNkZWZpbmUgSVBfT1BUSU9OUwk0CisjZGVmaW5lIElQX1JPVVRFUl9BTEVSVAk1CisjZGVmaW5lIElQX1JFQ1ZPUFRTCTYKKyNkZWZpbmUgSVBfUkVUT1BUUwk3CisjZGVmaW5lIElQX1BLVElORk8JOAorI2RlZmluZSBJUF9QS1RPUFRJT05TCTkKKyNkZWZpbmUgSVBfTVRVX0RJU0NPVkVSCTEwCisjZGVmaW5lIElQX1JFQ1ZFUlIJMTEKKyNkZWZpbmUgSVBfUkVDVlRUTAkxMgorI2RlZmluZQlJUF9SRUNWVE9TCTEzCisjZGVmaW5lIElQX01UVQkJMTQKKyNkZWZpbmUgSVBfRlJFRUJJTkQJMTUKKyNkZWZpbmUgSVBfSVBTRUNfUE9MSUNZCTE2CisjZGVmaW5lIElQX1hGUk1fUE9MSUNZCTE3CisjZGVmaW5lIElQX1BBU1NTRUMJMTgKKworLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgSVBfUkVDVlJFVE9QVFMJSVBfUkVUT1BUUworCisvKiBJUF9NVFVfRElTQ09WRVIgdmFsdWVzICovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPTlQJCTAJLyogTmV2ZXIgc2VuZCBERiBmcmFtZXMgKi8KKyNkZWZpbmUgSVBfUE1UVURJU0NfV0FOVAkJMQkvKiBVc2UgcGVyIHJvdXRlIGhpbnRzCSovCisjZGVmaW5lIElQX1BNVFVESVNDX0RPCQkJMgkvKiBBbHdheXMgREYJCSovCisjZGVmaW5lIElQX1BNVFVESVNDX1BST0JFCQkzICAgICAgIC8qIElnbm9yZSBkc3QgcG10dSAgICAgICovCisKKyNkZWZpbmUgSVBfTVVMVElDQVNUX0lGCQkJMzIKKyNkZWZpbmUgSVBfTVVMVElDQVNUX1RUTCAJCTMzCisjZGVmaW5lIElQX01VTFRJQ0FTVF9MT09QIAkJMzQKKyNkZWZpbmUgSVBfQUREX01FTUJFUlNISVAJCTM1CisjZGVmaW5lIElQX0RST1BfTUVNQkVSU0hJUAkJMzYKKyNkZWZpbmUgSVBfVU5CTE9DS19TT1VSQ0UJCTM3CisjZGVmaW5lIElQX0JMT0NLX1NPVVJDRQkJCTM4CisjZGVmaW5lIElQX0FERF9TT1VSQ0VfTUVNQkVSU0hJUAkzOQorI2RlZmluZSBJUF9EUk9QX1NPVVJDRV9NRU1CRVJTSElQCTQwCisjZGVmaW5lIElQX01TRklMVEVSCQkJNDEKKyNkZWZpbmUgTUNBU1RfSk9JTl9HUk9VUAkJNDIKKyNkZWZpbmUgTUNBU1RfQkxPQ0tfU09VUkNFCQk0MworI2RlZmluZSBNQ0FTVF9VTkJMT0NLX1NPVVJDRQkJNDQKKyNkZWZpbmUgTUNBU1RfTEVBVkVfR1JPVVAJCTQ1CisjZGVmaW5lIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQCQk0NgorI2RlZmluZSBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAJNDcKKyNkZWZpbmUgTUNBU1RfTVNGSUxURVIJCQk0OAorCisjZGVmaW5lIE1DQVNUX0VYQ0xVREUJMAorI2RlZmluZSBNQ0FTVF9JTkNMVURFCTEKKworLyogVGhlc2UgbmVlZCB0byBhcHBlYXIgc29tZXdoZXJlIGFyb3VuZCBoZXJlICovCisjZGVmaW5lIElQX0RFRkFVTFRfTVVMVElDQVNUX1RUTCAgICAgICAgMQorI2RlZmluZSBJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QICAgICAgIDEKKworLyogUmVxdWVzdCBzdHJ1Y3QgZm9yIG11bHRpY2FzdCBzb2NrZXQgb3BzICovCisKK3N0cnVjdCBpcF9tcmVxIAoreworCXN0cnVjdCBpbl9hZGRyIGltcl9tdWx0aWFkZHI7CS8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwICovCisJc3RydWN0IGluX2FkZHIgaW1yX2ludGVyZmFjZTsJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KK307CisKK3N0cnVjdCBpcF9tcmVxbgoreworCXN0cnVjdCBpbl9hZGRyCWltcl9tdWx0aWFkZHI7CQkvKiBJUCBtdWx0aWNhc3QgYWRkcmVzcyBvZiBncm91cCAqLworCXN0cnVjdCBpbl9hZGRyCWltcl9hZGRyZXNzOwkJLyogbG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKwlpbnQJCWltcl9pZmluZGV4OwkJLyogSW50ZXJmYWNlIGluZGV4ICovCit9OworCitzdHJ1Y3QgaXBfbXJlcV9zb3VyY2UgeworCV9fYmUzMgkJaW1yX211bHRpYWRkcjsKKwlfX2JlMzIJCWltcl9pbnRlcmZhY2U7CisJX19iZTMyCQlpbXJfc291cmNlYWRkcjsKK307CisKK3N0cnVjdCBpcF9tc2ZpbHRlciB7CisJX19iZTMyCQlpbXNmX211bHRpYWRkcjsKKwlfX2JlMzIJCWltc2ZfaW50ZXJmYWNlOworCV9fdTMyCQlpbXNmX2Ztb2RlOworCV9fdTMyCQlpbXNmX251bXNyYzsKKwlfX2JlMzIJCWltc2Zfc2xpc3RbMV07Cit9OworCisjZGVmaW5lIElQX01TRklMVEVSX1NJWkUobnVtc3JjKSBcCisJKHNpemVvZihzdHJ1Y3QgaXBfbXNmaWx0ZXIpIC0gc2l6ZW9mKF9fdTMyKSBcCisJKyAobnVtc3JjKSAqIHNpemVvZihfX3UzMikpCisKK3N0cnVjdCBncm91cF9yZXEKK3sKKwlfX3UzMgkJCQkgZ3JfaW50ZXJmYWNlOwkvKiBpbnRlcmZhY2UgaW5kZXggKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBncl9ncm91cDsJLyogZ3JvdXAgYWRkcmVzcyAqLworfTsKKworc3RydWN0IGdyb3VwX3NvdXJjZV9yZXEKK3sKKwlfX3UzMgkJCQkgZ3NyX2ludGVyZmFjZTsJLyogaW50ZXJmYWNlIGluZGV4ICovCisJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3NyX2dyb3VwOwkvKiBncm91cCBhZGRyZXNzICovCisJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3NyX3NvdXJjZTsJLyogc291cmNlIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCBncm91cF9maWx0ZXIKK3sKKwlfX3UzMgkJCQkgZ2ZfaW50ZXJmYWNlOwkvKiBpbnRlcmZhY2UgaW5kZXggKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9ncm91cDsJLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KKwlfX3UzMgkJCQkgZ2ZfZm1vZGU7CS8qIGZpbHRlciBtb2RlICovCisJX191MzIJCQkJIGdmX251bXNyYzsJLyogbnVtYmVyIG9mIHNvdXJjZXMgKi8KKwlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9zbGlzdFsxXTsJLyogaW50ZXJmYWNlIGluZGV4ICovCit9OworCisjZGVmaW5lIEdST1VQX0ZJTFRFUl9TSVpFKG51bXNyYykgXAorCShzaXplb2Yoc3RydWN0IGdyb3VwX2ZpbHRlcikgLSBzaXplb2Yoc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UpIFwKKwkrIChudW1zcmMpICogc2l6ZW9mKHN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlKSkKKworc3RydWN0IGluX3BrdGluZm8KK3sKKwlpbnQJCWlwaV9pZmluZGV4OworCXN0cnVjdCBpbl9hZGRyCWlwaV9zcGVjX2RzdDsKKwlzdHJ1Y3QgaW5fYWRkcglpcGlfYWRkcjsKK307CisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGFuIEludGVybmV0IChJUCkgc29ja2V0IGFkZHJlc3MuICovCisjZGVmaW5lIF9fU09DS19TSVpFX18JMTYJCS8qIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpCSovCitzdHJ1Y3Qgc29ja2FkZHJfaW4geworICBzYV9mYW1pbHlfdAkJc2luX2ZhbWlseTsJLyogQWRkcmVzcyBmYW1pbHkJCSovCisgIF9fYmUxNgkJc2luX3BvcnQ7CS8qIFBvcnQgbnVtYmVyCQkJKi8KKyAgc3RydWN0IGluX2FkZHIJc2luX2FkZHI7CS8qIEludGVybmV0IGFkZHJlc3MJCSovCisKKyAgLyogUGFkIHRvIHNpemUgb2YgYHN0cnVjdCBzb2NrYWRkcicuICovCisgIHVuc2lnbmVkIGNoYXIJCV9fcGFkW19fU09DS19TSVpFX18gLSBzaXplb2Yoc2hvcnQgaW50KSAtCisJCQlzaXplb2YodW5zaWduZWQgc2hvcnQgaW50KSAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcildOworfTsKKyNkZWZpbmUgc2luX3plcm8JX19wYWQJCS8qIGZvciBCU0QgVU5JWCBjb21wLiAtRnZLCSovCisKKworLyoKKyAqIERlZmluaXRpb25zIG9mIHRoZSBiaXRzIGluIGFuIEludGVybmV0IGFkZHJlc3MgaW50ZWdlci4KKyAqIE9uIHN1Ym5ldHMsIGhvc3QgYW5kIG5ldHdvcmsgcGFydHMgYXJlIGZvdW5kIGFjY29yZGluZworICogdG8gdGhlIHN1Ym5ldCBtYXNrLCBub3QgdGhlc2UgbWFza3MuCisgKi8KKyNkZWZpbmUJSU5fQ0xBU1NBKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweDgwMDAwMDAwKSA9PSAwKQorI2RlZmluZQlJTl9DTEFTU0FfTkVUCQkweGZmMDAwMDAwCisjZGVmaW5lCUlOX0NMQVNTQV9OU0hJRlQJMjQKKyNkZWZpbmUJSU5fQ0xBU1NBX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQV9ORVQpCisjZGVmaW5lCUlOX0NMQVNTQV9NQVgJCTEyOAorCisjZGVmaW5lCUlOX0NMQVNTQihhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NCX05FVAkJMHhmZmZmMDAwMAorI2RlZmluZQlJTl9DTEFTU0JfTlNISUZUCTE2CisjZGVmaW5lCUlOX0NMQVNTQl9IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0JfTkVUKQorI2RlZmluZQlJTl9DTEFTU0JfTUFYCQk2NTUzNgorCisjZGVmaW5lCUlOX0NMQVNTQyhhKQkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NDX05FVAkJMHhmZmZmZmYwMAorI2RlZmluZQlJTl9DTEFTU0NfTlNISUZUCTgKKyNkZWZpbmUJSU5fQ0xBU1NDX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQ19ORVQpCisKKyNkZWZpbmUJSU5fQ0xBU1NEKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGYwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2RlZmluZQlJTl9NVUxUSUNBU1QoYSkJCUlOX0NMQVNTRChhKQorI2RlZmluZSBJTl9NVUxUSUNBU1RfTkVUCTB4RjAwMDAwMDAKKworI2RlZmluZQlJTl9FWFBFUklNRU5UQUwoYSkJKCgoKGxvbmcgaW50KSAoYSkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKKyNkZWZpbmUJSU5fQkFEQ0xBU1MoYSkJCUlOX0VYUEVSSU1FTlRBTCgoYSkpCisKKy8qIEFkZHJlc3MgdG8gYWNjZXB0IGFueSBpbmNvbWluZyBtZXNzYWdlcy4gKi8KKyNkZWZpbmUJSU5BRERSX0FOWQkJKCh1bnNpZ25lZCBsb25nIGludCkgMHgwMDAwMDAwMCkKKworLyogQWRkcmVzcyB0byBzZW5kIHRvIGFsbCBob3N0cy4gKi8KKyNkZWZpbmUJSU5BRERSX0JST0FEQ0FTVAkoKHVuc2lnbmVkIGxvbmcgaW50KSAweGZmZmZmZmZmKQorCisvKiBBZGRyZXNzIGluZGljYXRpbmcgYW4gZXJyb3IgcmV0dXJuLiAqLworI2RlZmluZQlJTkFERFJfTk9ORQkJKCh1bnNpZ25lZCBsb25nIGludCkgMHhmZmZmZmZmZikKKworLyogTmV0d29yayBudW1iZXIgZm9yIGxvY2FsIGhvc3QgbG9vcGJhY2suICovCisjZGVmaW5lCUlOX0xPT1BCQUNLTkVUCQkxMjcKKworLyogQWRkcmVzcyB0byBsb29wYmFjayBpbiBzb2Z0d2FyZSB0byBsb2NhbCBob3N0LiAgKi8KKyNkZWZpbmUJSU5BRERSX0xPT1BCQUNLCQkweDdmMDAwMDAxCS8qIDEyNy4wLjAuMSAgICovCisjZGVmaW5lCUlOX0xPT1BCQUNLKGEpCQkoKCgobG9uZyBpbnQpIChhKSkgJiAweGZmMDAwMDAwKSA9PSAweDdmMDAwMDAwKQorCisvKiBEZWZpbmVzIGZvciBNdWx0aWNhc3QgSU5BRERSICovCisjZGVmaW5lIElOQUREUl9VTlNQRUNfR1JPVVAgICAJMHhlMDAwMDAwMFUJLyogMjI0LjAuMC4wICAgKi8KKyNkZWZpbmUgSU5BRERSX0FMTEhPU1RTX0dST1VQIAkweGUwMDAwMDAxVQkvKiAyMjQuMC4wLjEgICAqLworI2RlZmluZSBJTkFERFJfQUxMUlRSU19HUk9VUCAgICAweGUwMDAwMDAyVQkvKiAyMjQuMC4wLjIgKi8KKyNkZWZpbmUgSU5BRERSX01BWF9MT0NBTF9HUk9VUCAgMHhlMDAwMDBmZlUJLyogMjI0LjAuMC4yNTUgKi8KKworCisvKiA8YXNtL2J5dGVvcmRlci5oPiBjb250YWlucyB0aGUgaHRvbmwgdHlwZSBzdHVmZi4uICovCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPiAKKworCisjZW5kaWYJLyogX0xJTlVYX0lOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW42LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjFjODIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luNi5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICoJVHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBBRl9JTkVUNiAKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uIAorICoKKyAqCUF1dGhvcnM6CisgKglQZWRybyBSb3F1ZQkJPHJvcXVlQGRpLmZjLnVsLnB0PgkKKyAqCisgKglTb3VyY2VzOgorICoJSVB2NiBQcm9ncmFtIEludGVyZmFjZXMgZm9yIEJTRCBTeXN0ZW1zCisgKiAgICAgIDxkcmFmdC1pZXRmLWlwbmd3Zy1ic2QtYXBpLTA1LnR4dD4KKyAqCisgKglBZHZhbmNlZCBTb2NrZXRzIEFQSSBmb3IgSVB2NgorICoJPGRyYWZ0LXN0ZXZlbnMtYWR2YW5jZWQtYXBpLTAwLnR4dD4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lONl9ICisjZGVmaW5lIF9MSU5VWF9JTjZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqCUlQdjYgYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqLworCitzdHJ1Y3QgaW42X2FkZHIKK3sKKwl1bmlvbiAKKwl7CisJCV9fdTgJCXU2X2FkZHI4WzE2XTsKKwkJX19iZTE2CQl1Nl9hZGRyMTZbOF07CisJCV9fYmUzMgkJdTZfYWRkcjMyWzRdOworCX0gaW42X3U7CisjZGVmaW5lIHM2X2FkZHIJCQlpbjZfdS51Nl9hZGRyOAorI2RlZmluZSBzNl9hZGRyMTYJCWluNl91LnU2X2FkZHIxNgorI2RlZmluZSBzNl9hZGRyMzIJCWluNl91LnU2X2FkZHIzMgorfTsKKworLyogSVB2NiBXaWxkY2FyZCBBZGRyZXNzICg6OikgYW5kIExvb3BiYWNrIEFkZHJlc3MgKDo6MSkgZGVmaW5lZCBpbiBSRkMyNTUzCisgKiBOT1RFOiBCZSBhd2FyZSB0aGUgSU42QUREUl8qIGNvbnN0YW50cyBhbmQgaW42YWRkcl8qIGV4dGVybmFscyBhcmUgZGVmaW5lZAorICogaW4gbmV0d29yayBieXRlIG9yZGVyLCBub3QgaW4gaG9zdCBieXRlIG9yZGVyIGFzIGFyZSB0aGUgSVB2NCBlcXVpdmFsZW50cworICovCitleHRlcm4gY29uc3Qgc3RydWN0IGluNl9hZGRyIGluNmFkZHJfYW55OworI2RlZmluZSBJTjZBRERSX0FOWV9JTklUIHsgeyB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfSB9IH0KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9sb29wYmFjazsKKyNkZWZpbmUgSU42QUREUl9MT09QQkFDS19JTklUIHsgeyB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEgfSB9IH0KKworc3RydWN0IHNvY2thZGRyX2luNiB7CisJdW5zaWduZWQgc2hvcnQgaW50CXNpbjZfZmFtaWx5OyAgICAvKiBBRl9JTkVUNiAqLworCV9fYmUxNgkJCXNpbjZfcG9ydDsgICAgICAvKiBUcmFuc3BvcnQgbGF5ZXIgcG9ydCAjICovCisJX19iZTMyCQkJc2luNl9mbG93aW5mbzsgIC8qIElQdjYgZmxvdyBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBpbjZfYWRkcgkJc2luNl9hZGRyOyAgICAgIC8qIElQdjYgYWRkcmVzcyAqLworCV9fdTMyCQkJc2luNl9zY29wZV9pZDsgIC8qIHNjb3BlIGlkIChuZXcgaW4gUkZDMjU1MykgKi8KK307CisKK3N0cnVjdCBpcHY2X21yZXEgeworCS8qIElQdjYgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgaXB2Nm1yX211bHRpYWRkcjsKKworCS8qIGxvY2FsIElQdjYgYWRkcmVzcyBvZiBpbnRlcmZhY2UgKi8KKwlpbnQJCWlwdjZtcl9pZmluZGV4OworfTsKKworI2RlZmluZSBpcHY2bXJfYWNhZGRyCWlwdjZtcl9tdWx0aWFkZHIKKworc3RydWN0IGluNl9mbG93bGFiZWxfcmVxCit7CisJc3RydWN0IGluNl9hZGRyCWZscl9kc3Q7CisJX19iZTMyCWZscl9sYWJlbDsKKwlfX3U4CWZscl9hY3Rpb247CisJX191OAlmbHJfc2hhcmU7CisJX191MTYJZmxyX2ZsYWdzOworCV9fdTE2IAlmbHJfZXhwaXJlczsKKwlfX3UxNglmbHJfbGluZ2VyOworCV9fdTMyCV9fZmxyX3BhZDsKKwkvKiBPcHRpb25zIGluIGZvcm1hdCBvZiBJUFY2X1BLVE9QVElPTlMgKi8KK307CisKKyNkZWZpbmUgSVBWNl9GTF9BX0dFVAkwCisjZGVmaW5lIElQVjZfRkxfQV9QVVQJMQorI2RlZmluZSBJUFY2X0ZMX0FfUkVORVcJMgorCisjZGVmaW5lIElQVjZfRkxfRl9DUkVBVEUJMQorI2RlZmluZSBJUFY2X0ZMX0ZfRVhDTAkJMgorCisjZGVmaW5lIElQVjZfRkxfU19OT05FCQkwCisjZGVmaW5lIElQVjZfRkxfU19FWENMCQkxCisjZGVmaW5lIElQVjZfRkxfU19QUk9DRVNTCTIKKyNkZWZpbmUgSVBWNl9GTF9TX1VTRVIJCTMKKyNkZWZpbmUgSVBWNl9GTF9TX0FOWQkJMjU1CisKKworLyoKKyAqCUJpdG1hc2sgY29uc3RhbnQgZGVjbGFyYXRpb25zIHRvIGhlbHAgYXBwbGljYXRpb25zIHNlbGVjdCBvdXQgdGhlIAorICoJZmxvdyBsYWJlbCBhbmQgcHJpb3JpdHkgZmllbGRzLgorICoKKyAqCU5vdGUgdGhhdCB0aGlzIGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIgd2hpbGUgdGhlIGZsb3dpbmZvIGZpZWxkIG9mCisgKglzb2NrYWRkcl9pbjYgaXMgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICovCisKKyNkZWZpbmUgSVBWNl9GTE9XSU5GT19GTE9XTEFCRUwJCTB4MDAwZmZmZmYKKyNkZWZpbmUgSVBWNl9GTE9XSU5GT19QUklPUklUWQkJMHgwZmYwMDAwMAorCisvKiBUaGVzZSBkZWZpbnRpb25zIGFyZSBvYnNvbGV0ZSAqLworI2RlZmluZSBJUFY2X1BSSU9SSVRZX1VOQ0hBUkFDVEVSSVpFRAkweDAwMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9GSUxMRVIJCTB4MDEwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX1VOQVRURU5ERUQJMHgwMjAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfUkVTRVJWRUQxCQkweDAzMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9CVUxLCQkweDA0MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV9SRVNFUlZFRDIJCTB4MDUwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX0lOVEVSQUNUSVZFCTB4MDYwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZX0NPTlRST0wJCTB4MDcwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzgJCQkweDA4MDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV85CQkJMHgwOTAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTAJCTB4MGEwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzExCQkweDBiMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xMgkJMHgwYzAwCisjZGVmaW5lIElQVjZfUFJJT1JJVFlfMTMJCTB4MGQwMAorI2RlZmluZSBJUFY2X1BSSU9SSVRZXzE0CQkweDBlMDAKKyNkZWZpbmUgSVBWNl9QUklPUklUWV8xNQkJMHgwZjAwCisKKy8qCisgKglJUFY2IGV4dGVuc2lvbiBoZWFkZXJzCisgKi8KKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCS8qIElQdjYgaG9wLWJ5LWhvcCBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fUk9VVElORwkJNDMJLyogSVB2NiByb3V0aW5nIGhlYWRlcgkJKi8KKyNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAk0NAkvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyCSovCisjZGVmaW5lIElQUFJPVE9fSUNNUFY2CQk1OAkvKiBJQ01QdjYJCQkqLworI2RlZmluZSBJUFBST1RPX05PTkUJCTU5CS8qIElQdjYgbm8gbmV4dCBoZWFkZXIJCSovCisjZGVmaW5lIElQUFJPVE9fRFNUT1BUUwkJNjAJLyogSVB2NiBkZXN0aW5hdGlvbiBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fTUgJCTEzNQkvKiBJUHY2IG1vYmlsaXR5IGhlYWRlcgkJKi8KKworLyoKKyAqCUlQdjYgVExWIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUgSVBWNl9UTFZfUEFEMAkJMAorI2RlZmluZSBJUFY2X1RMVl9QQUROCQkxCisjZGVmaW5lIElQVjZfVExWX1JPVVRFUkFMRVJUCTUKKyNkZWZpbmUgSVBWNl9UTFZfSlVNQk8JCTE5NAorI2RlZmluZSBJUFY2X1RMVl9IQU8JCTIwMQkvKiBob21lIGFkZHJlc3Mgb3B0aW9uICovCisKKy8qCisgKglJUFY2IHNvY2tldCBvcHRpb25zCisgKi8KKworI2RlZmluZSBJUFY2X0FERFJGT1JNCQkxCisjZGVmaW5lIElQVjZfMjI5MlBLVElORk8JMgorI2RlZmluZSBJUFY2XzIyOTJIT1BPUFRTCTMKKyNkZWZpbmUgSVBWNl8yMjkyRFNUT1BUUwk0CisjZGVmaW5lIElQVjZfMjI5MlJUSERSCQk1CisjZGVmaW5lIElQVjZfMjI5MlBLVE9QVElPTlMJNgorI2RlZmluZSBJUFY2X0NIRUNLU1VNCQk3CisjZGVmaW5lIElQVjZfMjI5MkhPUExJTUlUCTgKKyNkZWZpbmUgSVBWNl9ORVhUSE9QCQk5CisjZGVmaW5lIElQVjZfQVVUSEhEUgkJMTAJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgSVBWNl9GTE9XSU5GTwkJMTEKKworI2RlZmluZSBJUFY2X1VOSUNBU1RfSE9QUwkxNgorI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9JRgkxNworI2RlZmluZSBJUFY2X01VTFRJQ0FTVF9IT1BTCTE4CisjZGVmaW5lIElQVjZfTVVMVElDQVNUX0xPT1AJMTkKKyNkZWZpbmUgSVBWNl9BRERfTUVNQkVSU0hJUAkyMAorI2RlZmluZSBJUFY2X0RST1BfTUVNQkVSU0hJUAkyMQorI2RlZmluZSBJUFY2X1JPVVRFUl9BTEVSVAkyMgorI2RlZmluZSBJUFY2X01UVV9ESVNDT1ZFUgkyMworI2RlZmluZSBJUFY2X01UVQkJMjQKKyNkZWZpbmUgSVBWNl9SRUNWRVJSCQkyNQorI2RlZmluZSBJUFY2X1Y2T05MWQkJMjYKKyNkZWZpbmUgSVBWNl9KT0lOX0FOWUNBU1QJMjcKKyNkZWZpbmUgSVBWNl9MRUFWRV9BTllDQVNUCTI4CisKKy8qIElQVjZfTVRVX0RJU0NPVkVSIHZhbHVlcyAqLworI2RlZmluZSBJUFY2X1BNVFVESVNDX0RPTlQJCTAKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19XQU5UCQkxCisjZGVmaW5lIElQVjZfUE1UVURJU0NfRE8JCTIKKyNkZWZpbmUgSVBWNl9QTVRVRElTQ19QUk9CRQkJMworCisvKiBGbG93bGFiZWwgKi8KKyNkZWZpbmUgSVBWNl9GTE9XTEFCRUxfTUdSCTMyCisjZGVmaW5lIElQVjZfRkxPV0lORk9fU0VORAkzMworCisjZGVmaW5lIElQVjZfSVBTRUNfUE9MSUNZCTM0CisjZGVmaW5lIElQVjZfWEZSTV9QT0xJQ1kJMzUKKworLyoKKyAqIE11bHRpY2FzdDoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgc2hhcmVkIGJldHdlZW4gSVB2NCBhbmQgSVB2Ni4KKyAqCisgKiBNQ0FTVF9KT0lOX0dST1VQCQk0MgorICogTUNBU1RfQkxPQ0tfU09VUkNFCQk0MworICogTUNBU1RfVU5CTE9DS19TT1VSQ0UJCTQ0CisgKiBNQ0FTVF9MRUFWRV9HUk9VUAkJNDUKKyAqIE1DQVNUX0pPSU5fU09VUkNFX0dST1VQCTQ2CisgKiBNQ0FTVF9MRUFWRV9TT1VSQ0VfR1JPVVAJNDcKKyAqIE1DQVNUX01TRklMVEVSCQk0OAorICovCisKKy8qCisgKiBBZHZhbmNlZCBBUEkgKFJGQzM1NDIpICgxKQorICoKKyAqIE5vdGU6IElQVjZfUkVDVlJUSERSRFNUT1BUUyBkb2VzIG5vdCBleGlzdC4gc2VlIG5ldC9pcHY2L2RhdGFncmFtLmMuCisgKi8KKworI2RlZmluZSBJUFY2X1JFQ1ZQS1RJTkZPCTQ5CisjZGVmaW5lIElQVjZfUEtUSU5GTwkJNTAKKyNkZWZpbmUgSVBWNl9SRUNWSE9QTElNSVQJNTEKKyNkZWZpbmUgSVBWNl9IT1BMSU1JVAkJNTIKKyNkZWZpbmUgSVBWNl9SRUNWSE9QT1BUUwk1MworI2RlZmluZSBJUFY2X0hPUE9QVFMJCTU0CisjZGVmaW5lIElQVjZfUlRIRFJEU1RPUFRTCTU1CisjZGVmaW5lIElQVjZfUkVDVlJUSERSCQk1NgorI2RlZmluZSBJUFY2X1JUSERSCQk1NworI2RlZmluZSBJUFY2X1JFQ1ZEU1RPUFRTCTU4CisjZGVmaW5lIElQVjZfRFNUT1BUUwkJNTkKKyNpZiAwCS8qIG5vdCB5ZXQgKi8KKyNkZWZpbmUgSVBWNl9SRUNWUEFUSE1UVQk2MAorI2RlZmluZSBJUFY2X1BBVEhNVFUJCTYxCisjZGVmaW5lIElQVjZfRE9OVEZSQUcJCTYyCisjZGVmaW5lIElQVjZfVVNFX01JTl9NVFUJNjMKKyNlbmRpZgorCisvKgorICogTmV0ZmlsdGVyICgxKQorICoKKyAqIEZvbGxvd2luZyBzb2NrZXQgb3B0aW9ucyBhcmUgdXNlZCBpbiBpcDZfdGFibGVzOworICogc2VlIGluY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oLgorICoKKyAqIElQNlRfU09fU0VUX1JFUExBQ0UgLyBJUDZUX1NPX0dFVF9JTkZPCQk2NAorICogSVA2VF9TT19TRVRfQUREX0NPVU5URVJTIC8gSVA2VF9TT19HRVRfRU5UUklFUwk2NQorICovCisKKy8qCisgKiBBZHZhbmNlZCBBUEkgKFJGQzM1NDIpICgyKQorICovCisjZGVmaW5lIElQVjZfUkVDVlRDTEFTUwkJNjYKKyNkZWZpbmUgSVBWNl9UQ0xBU1MJCTY3CisKKy8qCisgKiBOZXRmaWx0ZXIgKDIpCisgKgorICogRm9sbG93aW5nIHNvY2tldCBvcHRpb25zIGFyZSB1c2VkIGluIGlwNl90YWJsZXM7CisgKiBzZWUgaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmguCisgKgorICogSVA2VF9TT19HRVRfUkVWSVNJT05fTUFUQ0gJNjgKKyAqIElQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAk2OQorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbl9yb3V0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbl9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjI1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luX3JvdXRlLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfTElOVVhfSU5fUk9VVEVfSAorI2RlZmluZSBfTElOVVhfSU5fUk9VVEVfSAorCisvKiBJUHY0IHJvdXRpbmcgY2FjaGUgZmxhZ3MgKi8KKworI2RlZmluZSBSVENGX0RFQUQJUlROSF9GX0RFQUQKKyNkZWZpbmUgUlRDRl9PTkxJTksJUlROSF9GX09OTElOSworCisvKiBPYnNvbGV0ZSBmbGFnLiBBYm91dCB0byBiZSBkZWxldGVkICovCisjZGVmaW5lIFJUQ0ZfTk9QTVRVRElTQyBSVE1fRl9OT1BNVFVESVNDCisKKyNkZWZpbmUgUlRDRl9OT1RJRlkJMHgwMDAxMDAwMAorI2RlZmluZSBSVENGX0RJUkVDVERTVAkweDAwMDIwMDAwCisjZGVmaW5lIFJUQ0ZfUkVESVJFQ1RFRAkweDAwMDQwMDAwCisjZGVmaW5lIFJUQ0ZfVFBST1hZCTB4MDAwODAwMDAKKworI2RlZmluZSBSVENGX0ZBU1QJMHgwMDIwMDAwMAorI2RlZmluZSBSVENGX01BU1EJMHgwMDQwMDAwMAorI2RlZmluZSBSVENGX1NOQVQJMHgwMDgwMDAwMAorI2RlZmluZSBSVENGX0RPUkVESVJFQ1QgMHgwMTAwMDAwMAorI2RlZmluZSBSVENGX0RJUkVDVFNSQwkweDA0MDAwMDAwCisjZGVmaW5lIFJUQ0ZfRE5BVAkweDA4MDAwMDAwCisjZGVmaW5lIFJUQ0ZfQlJPQURDQVNUCTB4MTAwMDAwMDAKKyNkZWZpbmUgUlRDRl9NVUxUSUNBU1QJMHgyMDAwMDAwMAorI2RlZmluZSBSVENGX1JFSkVDVAkweDQwMDAwMDAwCisjZGVmaW5lIFJUQ0ZfTE9DQUwJMHg4MDAwMDAwMAorCisjZGVmaW5lIFJUQ0ZfTkFUCShSVENGX0ROQVR8UlRDRl9TTkFUKQorCisjZGVmaW5lIFJUX1RPUyh0b3MpCSgodG9zKSZJUFRPU19UT1NfTUFTSykKKworI2VuZGlmIC8qIF9MSU5VWF9JTl9ST1VURV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU5MzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfSU5FVF9ESUFHX0hfCisjZGVmaW5lIF9JTkVUX0RJQUdfSF8gMQorCisvKiBKdXN0IHNvbWUgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBUQ1BESUFHX0dFVFNPQ0sgMTgKKyNkZWZpbmUgRENDUERJQUdfR0VUU09DSyAxOQorCisjZGVmaW5lIElORVRfRElBR19HRVRTT0NLX01BWCAyNAorCisvKiBTb2NrZXQgaWRlbnRpdHkgKi8KK3N0cnVjdCBpbmV0X2RpYWdfc29ja2lkIHsKKwlfX2JlMTYJaWRpYWdfc3BvcnQ7CisJX19iZTE2CWlkaWFnX2Rwb3J0OworCV9fYmUzMglpZGlhZ19zcmNbNF07CisJX19iZTMyCWlkaWFnX2RzdFs0XTsKKwlfX3UzMglpZGlhZ19pZjsKKwlfX3UzMglpZGlhZ19jb29raWVbMl07CisjZGVmaW5lIElORVRfRElBR19OT0NPT0tJRSAofjBVKQorfTsKKworLyogUmVxdWVzdCBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGluZXRfZGlhZ19yZXEgeworCV9fdTgJaWRpYWdfZmFtaWx5OwkJLyogRmFtaWx5IG9mIGFkZHJlc3Nlcy4gKi8KKwlfX3U4CWlkaWFnX3NyY19sZW47CisJX191OAlpZGlhZ19kc3RfbGVuOworCV9fdTgJaWRpYWdfZXh0OwkJLyogUXVlcnkgZXh0ZW5kZWQgaW5mb3JtYXRpb24gKi8KKworCXN0cnVjdCBpbmV0X2RpYWdfc29ja2lkIGlkOworCisJX191MzIJaWRpYWdfc3RhdGVzOwkJLyogU3RhdGVzIHRvIGR1bXAgKi8KKwlfX3UzMglpZGlhZ19kYnM7CQkvKiBUYWJsZXMgdG8gZHVtcCAoTkkpICovCit9OworCitlbnVtIHsKKwlJTkVUX0RJQUdfUkVRX05PTkUsCisJSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSwKK307CisKKyNkZWZpbmUgSU5FVF9ESUFHX1JFUV9NQVggSU5FVF9ESUFHX1JFUV9CWVRFQ09ERQorCisvKiBCeXRlY29kZSBpcyBzZXF1ZW5jZSBvZiA0IGJ5dGUgY29tbWFuZHMgZm9sbG93ZWQgYnkgdmFyaWFibGUgYXJndW1lbnRzLgorICogQWxsIHRoZSBjb21tYW5kcyBpZGVudGlmaWVkIGJ5ICJjb2RlIiBhcmUgY29uZGl0aW9uYWwganVtcHMgZm9yd2FyZDoKKyAqIHRvIG9mZnNldCBjYysieWVzIiBvciB0byBvZmZzZXQgY2MrIm5vIi4gInllcyIgaXMgc3VwcG9zZWQgdG8gYmUKKyAqIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBhbmQgaXRzIGFyZ3VtZW50cy4KKyAqLworIAorc3RydWN0IGluZXRfZGlhZ19iY19vcCB7CisJdW5zaWduZWQgY2hhcgljb2RlOworCXVuc2lnbmVkIGNoYXIJeWVzOworCXVuc2lnbmVkIHNob3J0CW5vOworfTsKKworZW51bSB7CisJSU5FVF9ESUFHX0JDX05PUCwKKwlJTkVUX0RJQUdfQkNfSk1QLAorCUlORVRfRElBR19CQ19TX0dFLAorCUlORVRfRElBR19CQ19TX0xFLAorCUlORVRfRElBR19CQ19EX0dFLAorCUlORVRfRElBR19CQ19EX0xFLAorCUlORVRfRElBR19CQ19BVVRPLAorCUlORVRfRElBR19CQ19TX0NPTkQsCisJSU5FVF9ESUFHX0JDX0RfQ09ORCwKK307CisKK3N0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgeworCV9fdTgJZmFtaWx5OworCV9fdTgJcHJlZml4X2xlbjsKKwlpbnQJcG9ydDsKKwlfX2JlMzIJYWRkclswXTsKK307CisKKy8qIEJhc2UgaW5mbyBzdHJ1Y3R1cmUuIEl0IGNvbnRhaW5zIHNvY2tldCBpZGVudGl0eSAoYWRkcnMvcG9ydHMvY29va2llKQorICogYW5kLCBhbGFzLCB0aGUgaW5mb3JtYXRpb24gc2hvd24gYnkgbmV0c3RhdC4gKi8KK3N0cnVjdCBpbmV0X2RpYWdfbXNnIHsKKwlfX3U4CWlkaWFnX2ZhbWlseTsKKwlfX3U4CWlkaWFnX3N0YXRlOworCV9fdTgJaWRpYWdfdGltZXI7CisJX191OAlpZGlhZ19yZXRyYW5zOworCisJc3RydWN0IGluZXRfZGlhZ19zb2NraWQgaWQ7CisKKwlfX3UzMglpZGlhZ19leHBpcmVzOworCV9fdTMyCWlkaWFnX3JxdWV1ZTsKKwlfX3UzMglpZGlhZ193cXVldWU7CisJX191MzIJaWRpYWdfdWlkOworCV9fdTMyCWlkaWFnX2lub2RlOworfTsKKworLyogRXh0ZW5zaW9ucyAqLworCitlbnVtIHsKKwlJTkVUX0RJQUdfTk9ORSwKKwlJTkVUX0RJQUdfTUVNSU5GTywKKwlJTkVUX0RJQUdfSU5GTywKKwlJTkVUX0RJQUdfVkVHQVNJTkZPLAorCUlORVRfRElBR19DT05HLAorfTsKKworI2RlZmluZSBJTkVUX0RJQUdfTUFYIElORVRfRElBR19DT05HCisKKworLyogSU5FVF9ESUFHX01FTSAqLworCitzdHJ1Y3QgaW5ldF9kaWFnX21lbWluZm8geworCV9fdTMyCWlkaWFnX3JtZW07CisJX191MzIJaWRpYWdfd21lbTsKKwlfX3UzMglpZGlhZ19mbWVtOworCV9fdTMyCWlkaWFnX3RtZW07Cit9OworCisvKiBJTkVUX0RJQUdfVkVHQVNJTkZPICovCisKK3N0cnVjdCB0Y3B2ZWdhc19pbmZvIHsKKwlfX3UzMgl0Y3B2X2VuYWJsZWQ7CisJX191MzIJdGNwdl9ydHRjbnQ7CisJX191MzIJdGNwdl9ydHQ7CisJX191MzIJdGNwdl9taW5ydHQ7Cit9OworCisKKyNlbmRpZiAvKiBfSU5FVF9ESUFHX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzRlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lub3RpZnkuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0lOT1RJRllfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2V2ZW50IC0gc3RydWN0dXJlIHJlYWQgZnJvbSB0aGUgaW5vdGlmeSBkZXZpY2UgZm9yIGVhY2ggZXZlbnQKKyAqCisgKiBXaGVuIHlvdSBhcmUgd2F0Y2hpbmcgYSBkaXJlY3RvcnksIHlvdSB3aWxsIHJlY2VpdmUgdGhlIGZpbGVuYW1lIGZvciBldmVudHMKKyAqIHN1Y2ggYXMgSU5fQ1JFQVRFLCBJTl9ERUxFVEUsIElOX09QRU4sIElOX0NMT1NFLCAuLi4sIHJlbGF0aXZlIHRvIHRoZSB3ZC4KKyAqLworc3RydWN0IGlub3RpZnlfZXZlbnQgeworCV9fczMyCQl3ZDsJCS8qIHdhdGNoIGRlc2NyaXB0b3IgKi8KKwlfX3UzMgkJbWFzazsJCS8qIHdhdGNoIG1hc2sgKi8KKwlfX3UzMgkJY29va2llOwkJLyogY29va2llIHRvIHN5bmNocm9uaXplIHR3byBldmVudHMgKi8KKwlfX3UzMgkJbGVuOwkJLyogbGVuZ3RoIChpbmNsdWRpbmcgbnVsbHMpIG9mIG5hbWUgKi8KKwljaGFyCQluYW1lWzBdOwkvKiBzdHViIGZvciBwb3NzaWJsZSBuYW1lICovCit9OworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCwgaW1wbGVtZW50ZWQgZXZlbnRzIHRoYXQgdXNlci1zcGFjZSBjYW4gd2F0Y2ggZm9yICovCisjZGVmaW5lIElOX0FDQ0VTUwkJMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZCAqLworI2RlZmluZSBJTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgSU5fQVRUUklCCQkweDAwMDAwMDA0CS8qIE1ldGFkYXRhIGNoYW5nZWQgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZCAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFCTB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQgKi8KKyNkZWZpbmUgSU5fT1BFTgkJCTB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JCTB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYICovCisjZGVmaW5lIElOX01PVkVEX1RPCQkweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCQkweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFCQkweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJCTB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZCAqLworI2RlZmluZSBJTl9NT1ZFX1NFTEYJCTB4MDAwMDA4MDAJLyogU2VsZiB3YXMgbW92ZWQgKi8KKworLyogdGhlIGZvbGxvd2luZyBhcmUgbGVnYWwgZXZlbnRzLiAgdGhleSBhcmUgc2VudCBhcyBuZWVkZWQgdG8gYW55IHdhdGNoICovCisjZGVmaW5lIElOX1VOTU9VTlQJCTB4MDAwMDIwMDAJLyogQmFja2luZyBmcyB3YXMgdW5tb3VudGVkICovCisjZGVmaW5lIElOX1FfT1ZFUkZMT1cJCTB4MDAwMDQwMDAJLyogRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQgKi8KKyNkZWZpbmUgSU5fSUdOT1JFRAkJMHgwMDAwODAwMAkvKiBGaWxlIHdhcyBpZ25vcmVkICovCisKKy8qIGhlbHBlciBldmVudHMgKi8KKyNkZWZpbmUgSU5fQ0xPU0UJCShJTl9DTE9TRV9XUklURSB8IElOX0NMT1NFX05PV1JJVEUpIC8qIGNsb3NlICovCisjZGVmaW5lIElOX01PVkUJCQkoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKSAvKiBtb3ZlcyAqLworCisvKiBzcGVjaWFsIGZsYWdzICovCisjZGVmaW5lIElOX09OTFlESVIJCTB4MDEwMDAwMDAJLyogb25seSB3YXRjaCB0aGUgcGF0aCBpZiBpdCBpcyBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBJTl9ET05UX0ZPTExPVwkJMHgwMjAwMDAwMAkvKiBkb24ndCBmb2xsb3cgYSBzeW0gbGluayAqLworI2RlZmluZSBJTl9NQVNLX0FERAkJMHgyMDAwMDAwMAkvKiBhZGQgdG8gdGhlIG1hc2sgb2YgYW4gYWxyZWFkeSBleGlzdGluZyB3YXRjaCAqLworI2RlZmluZSBJTl9JU0RJUgkJMHg0MDAwMDAwMAkvKiBldmVudCBvY2N1cnJlZCBhZ2FpbnN0IGRpciAqLworI2RlZmluZSBJTl9PTkVTSE9UCQkweDgwMDAwMDAwCS8qIG9ubHkgc2VuZCBldmVudCBvbmNlICovCisKKy8qCisgKiBBbGwgb2YgdGhlIGV2ZW50cyAtIHdlIGJ1aWxkIHRoZSBsaXN0IGJ5IGhhbmQgc28gdGhhdCB3ZSBjYW4gYWRkIGZsYWdzIGluCisgKiB0aGUgZnV0dXJlIGFuZCBub3QgYnJlYWsgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIEFwcHMgd2lsbCBnZXQgb25seSB0aGUKKyAqIGV2ZW50cyB0aGF0IHRoZXkgb3JpZ2luYWxseSB3YW50ZWQuICBCZSBzdXJlIHRvIGFkZCBuZXcgZXZlbnRzIGhlcmUhCisgKi8KKyNkZWZpbmUgSU5fQUxMX0VWRU5UUwkoSU5fQUNDRVNTIHwgSU5fTU9ESUZZIHwgSU5fQVRUUklCIHwgSU5fQ0xPU0VfV1JJVEUgfCBcCisJCQkgSU5fQ0xPU0VfTk9XUklURSB8IElOX09QRU4gfCBJTl9NT1ZFRF9GUk9NIHwgXAorCQkJIElOX01PVkVEX1RPIHwgSU5fREVMRVRFIHwgSU5fQ1JFQVRFIHwgSU5fREVMRVRFX1NFTEYgfCBcCisJCQkgSU5fTU9WRV9TRUxGKQorCisKKyNlbmRpZgkvKiBfTElOVVhfSU5PVElGWV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lucHV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlMjEyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaW5wdXQuaApAQCAtMCwwICsxLDkzNiBAQAorI2lmbmRlZiBfSU5QVVRfSAorI2RlZmluZSBfSU5QVVRfSAorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisvKgorICogVGhlIGV2ZW50IHN0cnVjdHVyZSBpdHNlbGYKKyAqLworCitzdHJ1Y3QgaW5wdXRfZXZlbnQgeworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CisJX191MTYgdHlwZTsKKwlfX3UxNiBjb2RlOworCV9fczMyIHZhbHVlOworfTsKKworLyoKKyAqIFByb3RvY29sIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBFVl9WRVJTSU9OCQkweDAxMDAwMAorCisvKgorICogSU9DVExzICgweDAwIC0gMHg3ZikKKyAqLworCitzdHJ1Y3QgaW5wdXRfaWQgeworCV9fdTE2IGJ1c3R5cGU7CisJX191MTYgdmVuZG9yOworCV9fdTE2IHByb2R1Y3Q7CisJX191MTYgdmVyc2lvbjsKK307CisKK3N0cnVjdCBpbnB1dF9hYnNpbmZvIHsKKwlfX3MzMiB2YWx1ZTsKKwlfX3MzMiBtaW5pbXVtOworCV9fczMyIG1heGltdW07CisJX19zMzIgZnV6ejsKKwlfX3MzMiBmbGF0OworfTsKKworI2RlZmluZSBFVklPQ0dWRVJTSU9OCQlfSU9SKCdFJywgMHgwMSwgaW50KQkJCS8qIGdldCBkcml2ZXIgdmVyc2lvbiAqLworI2RlZmluZSBFVklPQ0dJRAkJX0lPUignRScsIDB4MDIsIHN0cnVjdCBpbnB1dF9pZCkJLyogZ2V0IGRldmljZSBJRCAqLworI2RlZmluZSBFVklPQ0dSRVAJCV9JT1IoJ0UnLCAweDAzLCBpbnRbMl0pCQkJLyogZ2V0IHJlcGVhdCBzZXR0aW5ncyAqLworI2RlZmluZSBFVklPQ1NSRVAJCV9JT1coJ0UnLCAweDAzLCBpbnRbMl0pCQkJLyogc2V0IHJlcGVhdCBzZXR0aW5ncyAqLworI2RlZmluZSBFVklPQ0dLRVlDT0RFCQlfSU9SKCdFJywgMHgwNCwgaW50WzJdKQkJCS8qIGdldCBrZXljb2RlICovCisjZGVmaW5lIEVWSU9DU0tFWUNPREUJCV9JT1coJ0UnLCAweDA0LCBpbnRbMl0pCQkJLyogc2V0IGtleWNvZGUgKi8KKworI2RlZmluZSBFVklPQ0dOQU1FKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDYsIGxlbikJCS8qIGdldCBkZXZpY2UgbmFtZSAqLworI2RlZmluZSBFVklPQ0dQSFlTKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDcsIGxlbikJCS8qIGdldCBwaHlzaWNhbCBsb2NhdGlvbiAqLworI2RlZmluZSBFVklPQ0dVTklRKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MDgsIGxlbikJCS8qIGdldCB1bmlxdWUgaWRlbnRpZmllciAqLworCisjZGVmaW5lIEVWSU9DR0tFWShsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDE4LCBsZW4pCQkvKiBnZXQgZ2xvYmFsIGtleXN0YXRlICovCisjZGVmaW5lIEVWSU9DR0xFRChsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDE5LCBsZW4pCQkvKiBnZXQgYWxsIExFRHMgKi8KKyNkZWZpbmUgRVZJT0NHU05EKGxlbikJCV9JT0MoX0lPQ19SRUFELCAnRScsIDB4MWEsIGxlbikJCS8qIGdldCBhbGwgc291bmRzIHN0YXR1cyAqLworI2RlZmluZSBFVklPQ0dTVyhsZW4pCQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDFiLCBsZW4pCQkvKiBnZXQgYWxsIHN3aXRjaCBzdGF0ZXMgKi8KKworI2RlZmluZSBFVklPQ0dCSVQoZXYsbGVuKQlfSU9DKF9JT0NfUkVBRCwgJ0UnLCAweDIwICsgZXYsIGxlbikJLyogZ2V0IGV2ZW50IGJpdHMgKi8KKyNkZWZpbmUgRVZJT0NHQUJTKGFicykJCV9JT1IoJ0UnLCAweDQwICsgYWJzLCBzdHJ1Y3QgaW5wdXRfYWJzaW5mbykJCS8qIGdldCBhYnMgdmFsdWUvbGltaXRzICovCisjZGVmaW5lIEVWSU9DU0FCUyhhYnMpCQlfSU9XKCdFJywgMHhjMCArIGFicywgc3RydWN0IGlucHV0X2Fic2luZm8pCQkvKiBzZXQgYWJzIHZhbHVlL2xpbWl0cyAqLworCisjZGVmaW5lIEVWSU9DU0ZGCQlfSU9DKF9JT0NfV1JJVEUsICdFJywgMHg4MCwgc2l6ZW9mKHN0cnVjdCBmZl9lZmZlY3QpKQkvKiBzZW5kIGEgZm9yY2UgZWZmZWN0IHRvIGEgZm9yY2UgZmVlZGJhY2sgZGV2aWNlICovCisjZGVmaW5lIEVWSU9DUk1GRgkJX0lPVygnRScsIDB4ODEsIGludCkJCQkvKiBFcmFzZSBhIGZvcmNlIGVmZmVjdCAqLworI2RlZmluZSBFVklPQ0dFRkZFQ1RTCQlfSU9SKCdFJywgMHg4NCwgaW50KQkJCS8qIFJlcG9ydCBudW1iZXIgb2YgZWZmZWN0cyBwbGF5YWJsZSBhdCB0aGUgc2FtZSB0aW1lICovCisKKyNkZWZpbmUgRVZJT0NHUkFCCQlfSU9XKCdFJywgMHg5MCwgaW50KQkJCS8qIEdyYWIvUmVsZWFzZSBkZXZpY2UgKi8KKworLyoKKyAqIEV2ZW50IHR5cGVzCisgKi8KKworI2RlZmluZSBFVl9TWU4JCQkweDAwCisjZGVmaW5lIEVWX0tFWQkJCTB4MDEKKyNkZWZpbmUgRVZfUkVMCQkJMHgwMgorI2RlZmluZSBFVl9BQlMJCQkweDAzCisjZGVmaW5lIEVWX01TQwkJCTB4MDQKKyNkZWZpbmUgRVZfU1cJCQkweDA1CisjZGVmaW5lIEVWX0xFRAkJCTB4MTEKKyNkZWZpbmUgRVZfU05ECQkJMHgxMgorI2RlZmluZSBFVl9SRVAJCQkweDE0CisjZGVmaW5lIEVWX0ZGCQkJMHgxNQorI2RlZmluZSBFVl9QV1IJCQkweDE2CisjZGVmaW5lIEVWX0ZGX1NUQVRVUwkJMHgxNworI2RlZmluZSBFVl9NQVgJCQkweDFmCisjZGVmaW5lIEVWX0NOVAkJCShFVl9NQVgrMSkKKworLyoKKyAqIFN5bmNocm9uaXphdGlvbiBldmVudHMuCisgKi8KKworI2RlZmluZSBTWU5fUkVQT1JUCQkwCisjZGVmaW5lIFNZTl9DT05GSUcJCTEKKworLyoKKyAqIEtleXMgYW5kIGJ1dHRvbnMKKyAqCisgKiBNb3N0IG9mIHRoZSBrZXlzL2J1dHRvbnMgYXJlIG1vZGVsZWQgYWZ0ZXIgVVNCIEhVVCAxLjEyCisgKiAoc2VlIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2hpZHBhZ2UpLgorICogQWJicmV2aWF0aW9ucyBpbiB0aGUgY29tbWVudHM6CisgKiBBQyAtIEFwcGxpY2F0aW9uIENvbnRyb2wKKyAqIEFMIC0gQXBwbGljYXRpb24gTGF1bmNoIEJ1dHRvbgorICogU0MgLSBTeXN0ZW0gQ29udHJvbAorICovCisKKyNkZWZpbmUgS0VZX1JFU0VSVkVECQkwCisjZGVmaW5lIEtFWV9FU0MJCQkxCisjZGVmaW5lIEtFWV8xCQkJMgorI2RlZmluZSBLRVlfMgkJCTMKKyNkZWZpbmUgS0VZXzMJCQk0CisjZGVmaW5lIEtFWV80CQkJNQorI2RlZmluZSBLRVlfNQkJCTYKKyNkZWZpbmUgS0VZXzYJCQk3CisjZGVmaW5lIEtFWV83CQkJOAorI2RlZmluZSBLRVlfOAkJCTkKKyNkZWZpbmUgS0VZXzkJCQkxMAorI2RlZmluZSBLRVlfMAkJCTExCisjZGVmaW5lIEtFWV9NSU5VUwkJMTIKKyNkZWZpbmUgS0VZX0VRVUFMCQkxMworI2RlZmluZSBLRVlfQkFDS1NQQUNFCQkxNAorI2RlZmluZSBLRVlfVEFCCQkJMTUKKyNkZWZpbmUgS0VZX1EJCQkxNgorI2RlZmluZSBLRVlfVwkJCTE3CisjZGVmaW5lIEtFWV9FCQkJMTgKKyNkZWZpbmUgS0VZX1IJCQkxOQorI2RlZmluZSBLRVlfVAkJCTIwCisjZGVmaW5lIEtFWV9ZCQkJMjEKKyNkZWZpbmUgS0VZX1UJCQkyMgorI2RlZmluZSBLRVlfSQkJCTIzCisjZGVmaW5lIEtFWV9PCQkJMjQKKyNkZWZpbmUgS0VZX1AJCQkyNQorI2RlZmluZSBLRVlfTEVGVEJSQUNFCQkyNgorI2RlZmluZSBLRVlfUklHSFRCUkFDRQkJMjcKKyNkZWZpbmUgS0VZX0VOVEVSCQkyOAorI2RlZmluZSBLRVlfTEVGVENUUkwJCTI5CisjZGVmaW5lIEtFWV9BCQkJMzAKKyNkZWZpbmUgS0VZX1MJCQkzMQorI2RlZmluZSBLRVlfRAkJCTMyCisjZGVmaW5lIEtFWV9GCQkJMzMKKyNkZWZpbmUgS0VZX0cJCQkzNAorI2RlZmluZSBLRVlfSAkJCTM1CisjZGVmaW5lIEtFWV9KCQkJMzYKKyNkZWZpbmUgS0VZX0sJCQkzNworI2RlZmluZSBLRVlfTAkJCTM4CisjZGVmaW5lIEtFWV9TRU1JQ09MT04JCTM5CisjZGVmaW5lIEtFWV9BUE9TVFJPUEhFCQk0MAorI2RlZmluZSBLRVlfR1JBVkUJCTQxCisjZGVmaW5lIEtFWV9MRUZUU0hJRlQJCTQyCisjZGVmaW5lIEtFWV9CQUNLU0xBU0gJCTQzCisjZGVmaW5lIEtFWV9aCQkJNDQKKyNkZWZpbmUgS0VZX1gJCQk0NQorI2RlZmluZSBLRVlfQwkJCTQ2CisjZGVmaW5lIEtFWV9WCQkJNDcKKyNkZWZpbmUgS0VZX0IJCQk0OAorI2RlZmluZSBLRVlfTgkJCTQ5CisjZGVmaW5lIEtFWV9NCQkJNTAKKyNkZWZpbmUgS0VZX0NPTU1BCQk1MQorI2RlZmluZSBLRVlfRE9UCQkJNTIKKyNkZWZpbmUgS0VZX1NMQVNICQk1MworI2RlZmluZSBLRVlfUklHSFRTSElGVAkJNTQKKyNkZWZpbmUgS0VZX0tQQVNURVJJU0sJCTU1CisjZGVmaW5lIEtFWV9MRUZUQUxUCQk1NgorI2RlZmluZSBLRVlfU1BBQ0UJCTU3CisjZGVmaW5lIEtFWV9DQVBTTE9DSwkJNTgKKyNkZWZpbmUgS0VZX0YxCQkJNTkKKyNkZWZpbmUgS0VZX0YyCQkJNjAKKyNkZWZpbmUgS0VZX0YzCQkJNjEKKyNkZWZpbmUgS0VZX0Y0CQkJNjIKKyNkZWZpbmUgS0VZX0Y1CQkJNjMKKyNkZWZpbmUgS0VZX0Y2CQkJNjQKKyNkZWZpbmUgS0VZX0Y3CQkJNjUKKyNkZWZpbmUgS0VZX0Y4CQkJNjYKKyNkZWZpbmUgS0VZX0Y5CQkJNjcKKyNkZWZpbmUgS0VZX0YxMAkJCTY4CisjZGVmaW5lIEtFWV9OVU1MT0NLCQk2OQorI2RlZmluZSBLRVlfU0NST0xMTE9DSwkJNzAKKyNkZWZpbmUgS0VZX0tQNwkJCTcxCisjZGVmaW5lIEtFWV9LUDgJCQk3MgorI2RlZmluZSBLRVlfS1A5CQkJNzMKKyNkZWZpbmUgS0VZX0tQTUlOVVMJCTc0CisjZGVmaW5lIEtFWV9LUDQJCQk3NQorI2RlZmluZSBLRVlfS1A1CQkJNzYKKyNkZWZpbmUgS0VZX0tQNgkJCTc3CisjZGVmaW5lIEtFWV9LUFBMVVMJCTc4CisjZGVmaW5lIEtFWV9LUDEJCQk3OQorI2RlZmluZSBLRVlfS1AyCQkJODAKKyNkZWZpbmUgS0VZX0tQMwkJCTgxCisjZGVmaW5lIEtFWV9LUDAJCQk4MgorI2RlZmluZSBLRVlfS1BET1QJCTgzCisKKyNkZWZpbmUgS0VZX1pFTktBS1VIQU5LQUtVCTg1CisjZGVmaW5lIEtFWV8xMDJORAkJODYKKyNkZWZpbmUgS0VZX0YxMQkJCTg3CisjZGVmaW5lIEtFWV9GMTIJCQk4OAorI2RlZmluZSBLRVlfUk8JCQk4OQorI2RlZmluZSBLRVlfS0FUQUtBTkEJCTkwCisjZGVmaW5lIEtFWV9ISVJBR0FOQQkJOTEKKyNkZWZpbmUgS0VZX0hFTktBTgkJOTIKKyNkZWZpbmUgS0VZX0tBVEFLQU5BSElSQUdBTkEJOTMKKyNkZWZpbmUgS0VZX01VSEVOS0FOCQk5NAorI2RlZmluZSBLRVlfS1BKUENPTU1BCQk5NQorI2RlZmluZSBLRVlfS1BFTlRFUgkJOTYKKyNkZWZpbmUgS0VZX1JJR0hUQ1RSTAkJOTcKKyNkZWZpbmUgS0VZX0tQU0xBU0gJCTk4CisjZGVmaW5lIEtFWV9TWVNSUQkJOTkKKyNkZWZpbmUgS0VZX1JJR0hUQUxUCQkxMDAKKyNkZWZpbmUgS0VZX0xJTkVGRUVECQkxMDEKKyNkZWZpbmUgS0VZX0hPTUUJCTEwMgorI2RlZmluZSBLRVlfVVAJCQkxMDMKKyNkZWZpbmUgS0VZX1BBR0VVUAkJMTA0CisjZGVmaW5lIEtFWV9MRUZUCQkxMDUKKyNkZWZpbmUgS0VZX1JJR0hUCQkxMDYKKyNkZWZpbmUgS0VZX0VORAkJCTEwNworI2RlZmluZSBLRVlfRE9XTgkJMTA4CisjZGVmaW5lIEtFWV9QQUdFRE9XTgkJMTA5CisjZGVmaW5lIEtFWV9JTlNFUlQJCTExMAorI2RlZmluZSBLRVlfREVMRVRFCQkxMTEKKyNkZWZpbmUgS0VZX01BQ1JPCQkxMTIKKyNkZWZpbmUgS0VZX01VVEUJCTExMworI2RlZmluZSBLRVlfVk9MVU1FRE9XTgkJMTE0CisjZGVmaW5lIEtFWV9WT0xVTUVVUAkJMTE1CisjZGVmaW5lIEtFWV9QT1dFUgkJMTE2CS8qIFNDIFN5c3RlbSBQb3dlciBEb3duICovCisjZGVmaW5lIEtFWV9LUEVRVUFMCQkxMTcKKyNkZWZpbmUgS0VZX0tQUExVU01JTlVTCQkxMTgKKyNkZWZpbmUgS0VZX1BBVVNFCQkxMTkKKworI2RlZmluZSBLRVlfS1BDT01NQQkJMTIxCisjZGVmaW5lIEtFWV9IQU5HRVVMCQkxMjIKKyNkZWZpbmUgS0VZX0hBTkdVRUwJCUtFWV9IQU5HRVVMCisjZGVmaW5lIEtFWV9IQU5KQQkJMTIzCisjZGVmaW5lIEtFWV9ZRU4JCQkxMjQKKyNkZWZpbmUgS0VZX0xFRlRNRVRBCQkxMjUKKyNkZWZpbmUgS0VZX1JJR0hUTUVUQQkJMTI2CisjZGVmaW5lIEtFWV9DT01QT1NFCQkxMjcKKworI2RlZmluZSBLRVlfU1RPUAkJMTI4CS8qIEFDIFN0b3AgKi8KKyNkZWZpbmUgS0VZX0FHQUlOCQkxMjkKKyNkZWZpbmUgS0VZX1BST1BTCQkxMzAJLyogQUMgUHJvcGVydGllcyAqLworI2RlZmluZSBLRVlfVU5ETwkJMTMxCS8qIEFDIFVuZG8gKi8KKyNkZWZpbmUgS0VZX0ZST05UCQkxMzIKKyNkZWZpbmUgS0VZX0NPUFkJCTEzMwkvKiBBQyBDb3B5ICovCisjZGVmaW5lIEtFWV9PUEVOCQkxMzQJLyogQUMgT3BlbiAqLworI2RlZmluZSBLRVlfUEFTVEUJCTEzNQkvKiBBQyBQYXN0ZSAqLworI2RlZmluZSBLRVlfRklORAkJMTM2CS8qIEFDIFNlYXJjaCAqLworI2RlZmluZSBLRVlfQ1VUCQkJMTM3CS8qIEFDIEN1dCAqLworI2RlZmluZSBLRVlfSEVMUAkJMTM4CS8qIEFMIEludGVncmF0ZWQgSGVscCBDZW50ZXIgKi8KKyNkZWZpbmUgS0VZX01FTlUJCTEzOQkvKiBNZW51IChzaG93IG1lbnUpICovCisjZGVmaW5lIEtFWV9DQUxDCQkxNDAJLyogQUwgQ2FsY3VsYXRvciAqLworI2RlZmluZSBLRVlfU0VUVVAJCTE0MQorI2RlZmluZSBLRVlfU0xFRVAJCTE0MgkvKiBTQyBTeXN0ZW0gU2xlZXAgKi8KKyNkZWZpbmUgS0VZX1dBS0VVUAkJMTQzCS8qIFN5c3RlbSBXYWtlIFVwICovCisjZGVmaW5lIEtFWV9GSUxFCQkxNDQJLyogQUwgTG9jYWwgTWFjaGluZSBCcm93c2VyICovCisjZGVmaW5lIEtFWV9TRU5ERklMRQkJMTQ1CisjZGVmaW5lIEtFWV9ERUxFVEVGSUxFCQkxNDYKKyNkZWZpbmUgS0VZX1hGRVIJCTE0NworI2RlZmluZSBLRVlfUFJPRzEJCTE0OAorI2RlZmluZSBLRVlfUFJPRzIJCTE0OQorI2RlZmluZSBLRVlfV1dXCQkJMTUwCS8qIEFMIEludGVybmV0IEJyb3dzZXIgKi8KKyNkZWZpbmUgS0VZX01TRE9TCQkxNTEKKyNkZWZpbmUgS0VZX0NPRkZFRQkJMTUyCS8qIEFMIFRlcm1pbmFsIExvY2svU2NyZWVuc2F2ZXIgKi8KKyNkZWZpbmUgS0VZX1NDUkVFTkxPQ0sJCUtFWV9DT0ZGRUUKKyNkZWZpbmUgS0VZX0RJUkVDVElPTgkJMTUzCisjZGVmaW5lIEtFWV9DWUNMRVdJTkRPV1MJMTU0CisjZGVmaW5lIEtFWV9NQUlMCQkxNTUKKyNkZWZpbmUgS0VZX0JPT0tNQVJLUwkJMTU2CS8qIEFDIEJvb2ttYXJrcyAqLworI2RlZmluZSBLRVlfQ09NUFVURVIJCTE1NworI2RlZmluZSBLRVlfQkFDSwkJMTU4CS8qIEFDIEJhY2sgKi8KKyNkZWZpbmUgS0VZX0ZPUldBUkQJCTE1OQkvKiBBQyBGb3J3YXJkICovCisjZGVmaW5lIEtFWV9DTE9TRUNECQkxNjAKKyNkZWZpbmUgS0VZX0VKRUNUQ0QJCTE2MQorI2RlZmluZSBLRVlfRUpFQ1RDTE9TRUNECTE2MgorI2RlZmluZSBLRVlfTkVYVFNPTkcJCTE2MworI2RlZmluZSBLRVlfUExBWVBBVVNFCQkxNjQKKyNkZWZpbmUgS0VZX1BSRVZJT1VTU09ORwkxNjUKKyNkZWZpbmUgS0VZX1NUT1BDRAkJMTY2CisjZGVmaW5lIEtFWV9SRUNPUkQJCTE2NworI2RlZmluZSBLRVlfUkVXSU5ECQkxNjgKKyNkZWZpbmUgS0VZX1BIT05FCQkxNjkJLyogTWVkaWEgU2VsZWN0IFRlbGVwaG9uZSAqLworI2RlZmluZSBLRVlfSVNPCQkJMTcwCisjZGVmaW5lIEtFWV9DT05GSUcJCTE3MQkvKiBBTCBDb25zdW1lciBDb250cm9sIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgS0VZX0hPTUVQQUdFCQkxNzIJLyogQUMgSG9tZSAqLworI2RlZmluZSBLRVlfUkVGUkVTSAkJMTczCS8qIEFDIFJlZnJlc2ggKi8KKyNkZWZpbmUgS0VZX0VYSVQJCTE3NAkvKiBBQyBFeGl0ICovCisjZGVmaW5lIEtFWV9NT1ZFCQkxNzUKKyNkZWZpbmUgS0VZX0VESVQJCTE3NgorI2RlZmluZSBLRVlfU0NST0xMVVAJCTE3NworI2RlZmluZSBLRVlfU0NST0xMRE9XTgkJMTc4CisjZGVmaW5lIEtFWV9LUExFRlRQQVJFTgkJMTc5CisjZGVmaW5lIEtFWV9LUFJJR0hUUEFSRU4JMTgwCisjZGVmaW5lIEtFWV9ORVcJCQkxODEJLyogQUMgTmV3ICovCisjZGVmaW5lIEtFWV9SRURPCQkxODIJLyogQUMgUmVkby9SZXBlYXQgKi8KKworI2RlZmluZSBLRVlfRjEzCQkJMTgzCisjZGVmaW5lIEtFWV9GMTQJCQkxODQKKyNkZWZpbmUgS0VZX0YxNQkJCTE4NQorI2RlZmluZSBLRVlfRjE2CQkJMTg2CisjZGVmaW5lIEtFWV9GMTcJCQkxODcKKyNkZWZpbmUgS0VZX0YxOAkJCTE4OAorI2RlZmluZSBLRVlfRjE5CQkJMTg5CisjZGVmaW5lIEtFWV9GMjAJCQkxOTAKKyNkZWZpbmUgS0VZX0YyMQkJCTE5MQorI2RlZmluZSBLRVlfRjIyCQkJMTkyCisjZGVmaW5lIEtFWV9GMjMJCQkxOTMKKyNkZWZpbmUgS0VZX0YyNAkJCTE5NAorCisjZGVmaW5lIEtFWV9QTEFZQ0QJCTIwMAorI2RlZmluZSBLRVlfUEFVU0VDRAkJMjAxCisjZGVmaW5lIEtFWV9QUk9HMwkJMjAyCisjZGVmaW5lIEtFWV9QUk9HNAkJMjAzCisjZGVmaW5lIEtFWV9TVVNQRU5ECQkyMDUKKyNkZWZpbmUgS0VZX0NMT1NFCQkyMDYJLyogQUMgQ2xvc2UgKi8KKyNkZWZpbmUgS0VZX1BMQVkJCTIwNworI2RlZmluZSBLRVlfRkFTVEZPUldBUkQJCTIwOAorI2RlZmluZSBLRVlfQkFTU0JPT1NUCQkyMDkKKyNkZWZpbmUgS0VZX1BSSU5UCQkyMTAJLyogQUMgUHJpbnQgKi8KKyNkZWZpbmUgS0VZX0hQCQkJMjExCisjZGVmaW5lIEtFWV9DQU1FUkEJCTIxMgorI2RlZmluZSBLRVlfU09VTkQJCTIxMworI2RlZmluZSBLRVlfUVVFU1RJT04JCTIxNAorI2RlZmluZSBLRVlfRU1BSUwJCTIxNQorI2RlZmluZSBLRVlfQ0hBVAkJMjE2CisjZGVmaW5lIEtFWV9TRUFSQ0gJCTIxNworI2RlZmluZSBLRVlfQ09OTkVDVAkJMjE4CisjZGVmaW5lIEtFWV9GSU5BTkNFCQkyMTkJLyogQUwgQ2hlY2tib29rL0ZpbmFuY2UgKi8KKyNkZWZpbmUgS0VZX1NQT1JUCQkyMjAKKyNkZWZpbmUgS0VZX1NIT1AJCTIyMQorI2RlZmluZSBLRVlfQUxURVJBU0UJCTIyMgorI2RlZmluZSBLRVlfQ0FOQ0VMCQkyMjMJLyogQUMgQ2FuY2VsICovCisjZGVmaW5lIEtFWV9CUklHSFRORVNTRE9XTgkyMjQKKyNkZWZpbmUgS0VZX0JSSUdIVE5FU1NVUAkyMjUKKyNkZWZpbmUgS0VZX01FRElBCQkyMjYKKworI2RlZmluZSBLRVlfU1dJVENIVklERU9NT0RFCTIyNwkvKiBDeWNsZSBiZXR3ZWVuIGF2YWlsYWJsZSB2aWRlbworCQkJCQkgICBvdXRwdXRzIChNb25pdG9yL0xDRC9UVi1vdXQvZXRjKSAqLworI2RlZmluZSBLRVlfS0JESUxMVU1UT0dHTEUJMjI4CisjZGVmaW5lIEtFWV9LQkRJTExVTURPV04JMjI5CisjZGVmaW5lIEtFWV9LQkRJTExVTVVQCQkyMzAKKworI2RlZmluZSBLRVlfU0VORAkJMjMxCS8qIEFDIFNlbmQgKi8KKyNkZWZpbmUgS0VZX1JFUExZCQkyMzIJLyogQUMgUmVwbHkgKi8KKyNkZWZpbmUgS0VZX0ZPUldBUkRNQUlMCQkyMzMJLyogQUMgRm9yd2FyZCBNc2cgKi8KKyNkZWZpbmUgS0VZX1NBVkUJCTIzNAkvKiBBQyBTYXZlICovCisjZGVmaW5lIEtFWV9ET0NVTUVOVFMJCTIzNQorCisjZGVmaW5lIEtFWV9CQVRURVJZCQkyMzYKKworI2RlZmluZSBLRVlfQkxVRVRPT1RICQkyMzcKKyNkZWZpbmUgS0VZX1dMQU4JCTIzOAorI2RlZmluZSBLRVlfVVdCCQkJMjM5CisKKyNkZWZpbmUgS0VZX1VOS05PV04JCTI0MAorCisjZGVmaW5lIEtFWV9WSURFT19ORVhUCQkyNDEJLyogZHJpdmUgbmV4dCB2aWRlbyBzb3VyY2UgKi8KKyNkZWZpbmUgS0VZX1ZJREVPX1BSRVYJCTI0MgkvKiBkcml2ZSBwcmV2aW91cyB2aWRlbyBzb3VyY2UgKi8KKyNkZWZpbmUgS0VZX0JSSUdIVE5FU1NfQ1lDTEUJMjQzCS8qIGJyaWdodG5lc3MgdXAsIGFmdGVyIG1heCBpcyBtaW4gKi8KKyNkZWZpbmUgS0VZX0JSSUdIVE5FU1NfWkVSTwkyNDQJLyogYnJpZ2h0bmVzcyBvZmYsIHVzZSBhbWJpZW50ICovCisjZGVmaW5lIEtFWV9ESVNQTEFZX09GRgkJMjQ1CS8qIGRpc3BsYXkgZGV2aWNlIHRvIG9mZiBzdGF0ZSAqLworCisjZGVmaW5lIEJUTl9NSVNDCQkweDEwMAorI2RlZmluZSBCVE5fMAkJCTB4MTAwCisjZGVmaW5lIEJUTl8xCQkJMHgxMDEKKyNkZWZpbmUgQlROXzIJCQkweDEwMgorI2RlZmluZSBCVE5fMwkJCTB4MTAzCisjZGVmaW5lIEJUTl80CQkJMHgxMDQKKyNkZWZpbmUgQlROXzUJCQkweDEwNQorI2RlZmluZSBCVE5fNgkJCTB4MTA2CisjZGVmaW5lIEJUTl83CQkJMHgxMDcKKyNkZWZpbmUgQlROXzgJCQkweDEwOAorI2RlZmluZSBCVE5fOQkJCTB4MTA5CisKKyNkZWZpbmUgQlROX01PVVNFCQkweDExMAorI2RlZmluZSBCVE5fTEVGVAkJMHgxMTAKKyNkZWZpbmUgQlROX1JJR0hUCQkweDExMQorI2RlZmluZSBCVE5fTUlERExFCQkweDExMgorI2RlZmluZSBCVE5fU0lERQkJMHgxMTMKKyNkZWZpbmUgQlROX0VYVFJBCQkweDExNAorI2RlZmluZSBCVE5fRk9SV0FSRAkJMHgxMTUKKyNkZWZpbmUgQlROX0JBQ0sJCTB4MTE2CisjZGVmaW5lIEJUTl9UQVNLCQkweDExNworCisjZGVmaW5lIEJUTl9KT1lTVElDSwkJMHgxMjAKKyNkZWZpbmUgQlROX1RSSUdHRVIJCTB4MTIwCisjZGVmaW5lIEJUTl9USFVNQgkJMHgxMjEKKyNkZWZpbmUgQlROX1RIVU1CMgkJMHgxMjIKKyNkZWZpbmUgQlROX1RPUAkJCTB4MTIzCisjZGVmaW5lIEJUTl9UT1AyCQkweDEyNAorI2RlZmluZSBCVE5fUElOS0lFCQkweDEyNQorI2RlZmluZSBCVE5fQkFTRQkJMHgxMjYKKyNkZWZpbmUgQlROX0JBU0UyCQkweDEyNworI2RlZmluZSBCVE5fQkFTRTMJCTB4MTI4CisjZGVmaW5lIEJUTl9CQVNFNAkJMHgxMjkKKyNkZWZpbmUgQlROX0JBU0U1CQkweDEyYQorI2RlZmluZSBCVE5fQkFTRTYJCTB4MTJiCisjZGVmaW5lIEJUTl9ERUFECQkweDEyZgorCisjZGVmaW5lIEJUTl9HQU1FUEFECQkweDEzMAorI2RlZmluZSBCVE5fQQkJCTB4MTMwCisjZGVmaW5lIEJUTl9CCQkJMHgxMzEKKyNkZWZpbmUgQlROX0MJCQkweDEzMgorI2RlZmluZSBCVE5fWAkJCTB4MTMzCisjZGVmaW5lIEJUTl9ZCQkJMHgxMzQKKyNkZWZpbmUgQlROX1oJCQkweDEzNQorI2RlZmluZSBCVE5fVEwJCQkweDEzNgorI2RlZmluZSBCVE5fVFIJCQkweDEzNworI2RlZmluZSBCVE5fVEwyCQkJMHgxMzgKKyNkZWZpbmUgQlROX1RSMgkJCTB4MTM5CisjZGVmaW5lIEJUTl9TRUxFQ1QJCTB4MTNhCisjZGVmaW5lIEJUTl9TVEFSVAkJMHgxM2IKKyNkZWZpbmUgQlROX01PREUJCTB4MTNjCisjZGVmaW5lIEJUTl9USFVNQkwJCTB4MTNkCisjZGVmaW5lIEJUTl9USFVNQlIJCTB4MTNlCisKKyNkZWZpbmUgQlROX0RJR0kJCTB4MTQwCisjZGVmaW5lIEJUTl9UT09MX1BFTgkJMHgxNDAKKyNkZWZpbmUgQlROX1RPT0xfUlVCQkVSCQkweDE0MQorI2RlZmluZSBCVE5fVE9PTF9CUlVTSAkJMHgxNDIKKyNkZWZpbmUgQlROX1RPT0xfUEVOQ0lMCQkweDE0MworI2RlZmluZSBCVE5fVE9PTF9BSVJCUlVTSAkweDE0NAorI2RlZmluZSBCVE5fVE9PTF9GSU5HRVIJCTB4MTQ1CisjZGVmaW5lIEJUTl9UT09MX01PVVNFCQkweDE0NgorI2RlZmluZSBCVE5fVE9PTF9MRU5TCQkweDE0NworI2RlZmluZSBCVE5fVE9VQ0gJCTB4MTRhCisjZGVmaW5lIEJUTl9TVFlMVVMJCTB4MTRiCisjZGVmaW5lIEJUTl9TVFlMVVMyCQkweDE0YworI2RlZmluZSBCVE5fVE9PTF9ET1VCTEVUQVAJMHgxNGQKKyNkZWZpbmUgQlROX1RPT0xfVFJJUExFVEFQCTB4MTRlCisKKyNkZWZpbmUgQlROX1dIRUVMCQkweDE1MAorI2RlZmluZSBCVE5fR0VBUl9ET1dOCQkweDE1MAorI2RlZmluZSBCVE5fR0VBUl9VUAkJMHgxNTEKKworI2RlZmluZSBLRVlfT0sJCQkweDE2MAorI2RlZmluZSBLRVlfU0VMRUNUCQkweDE2MQorI2RlZmluZSBLRVlfR09UTwkJMHgxNjIKKyNkZWZpbmUgS0VZX0NMRUFSCQkweDE2MworI2RlZmluZSBLRVlfUE9XRVIyCQkweDE2NAorI2RlZmluZSBLRVlfT1BUSU9OCQkweDE2NQorI2RlZmluZSBLRVlfSU5GTwkJMHgxNjYJLyogQUwgT0VNIEZlYXR1cmVzL1RpcHMvVHV0b3JpYWwgKi8KKyNkZWZpbmUgS0VZX1RJTUUJCTB4MTY3CisjZGVmaW5lIEtFWV9WRU5ET1IJCTB4MTY4CisjZGVmaW5lIEtFWV9BUkNISVZFCQkweDE2OQorI2RlZmluZSBLRVlfUFJPR1JBTQkJMHgxNmEJLyogTWVkaWEgU2VsZWN0IFByb2dyYW0gR3VpZGUgKi8KKyNkZWZpbmUgS0VZX0NIQU5ORUwJCTB4MTZiCisjZGVmaW5lIEtFWV9GQVZPUklURVMJCTB4MTZjCisjZGVmaW5lIEtFWV9FUEcJCQkweDE2ZAorI2RlZmluZSBLRVlfUFZSCQkJMHgxNmUJLyogTWVkaWEgU2VsZWN0IEhvbWUgKi8KKyNkZWZpbmUgS0VZX01IUAkJCTB4MTZmCisjZGVmaW5lIEtFWV9MQU5HVUFHRQkJMHgxNzAKKyNkZWZpbmUgS0VZX1RJVExFCQkweDE3MQorI2RlZmluZSBLRVlfU1VCVElUTEUJCTB4MTcyCisjZGVmaW5lIEtFWV9BTkdMRQkJMHgxNzMKKyNkZWZpbmUgS0VZX1pPT00JCTB4MTc0CisjZGVmaW5lIEtFWV9NT0RFCQkweDE3NQorI2RlZmluZSBLRVlfS0VZQk9BUkQJCTB4MTc2CisjZGVmaW5lIEtFWV9TQ1JFRU4JCTB4MTc3CisjZGVmaW5lIEtFWV9QQwkJCTB4MTc4CS8qIE1lZGlhIFNlbGVjdCBDb21wdXRlciAqLworI2RlZmluZSBLRVlfVFYJCQkweDE3OQkvKiBNZWRpYSBTZWxlY3QgVFYgKi8KKyNkZWZpbmUgS0VZX1RWMgkJCTB4MTdhCS8qIE1lZGlhIFNlbGVjdCBDYWJsZSAqLworI2RlZmluZSBLRVlfVkNSCQkJMHgxN2IJLyogTWVkaWEgU2VsZWN0IFZDUiAqLworI2RlZmluZSBLRVlfVkNSMgkJMHgxN2MJLyogVkNSIFBsdXMgKi8KKyNkZWZpbmUgS0VZX1NBVAkJCTB4MTdkCS8qIE1lZGlhIFNlbGVjdCBTYXRlbGxpdGUgKi8KKyNkZWZpbmUgS0VZX1NBVDIJCTB4MTdlCisjZGVmaW5lIEtFWV9DRAkJCTB4MTdmCS8qIE1lZGlhIFNlbGVjdCBDRCAqLworI2RlZmluZSBLRVlfVEFQRQkJMHgxODAJLyogTWVkaWEgU2VsZWN0IFRhcGUgKi8KKyNkZWZpbmUgS0VZX1JBRElPCQkweDE4MQorI2RlZmluZSBLRVlfVFVORVIJCTB4MTgyCS8qIE1lZGlhIFNlbGVjdCBUdW5lciAqLworI2RlZmluZSBLRVlfUExBWUVSCQkweDE4MworI2RlZmluZSBLRVlfVEVYVAkJMHgxODQKKyNkZWZpbmUgS0VZX0RWRAkJCTB4MTg1CS8qIE1lZGlhIFNlbGVjdCBEVkQgKi8KKyNkZWZpbmUgS0VZX0FVWAkJCTB4MTg2CisjZGVmaW5lIEtFWV9NUDMJCQkweDE4NworI2RlZmluZSBLRVlfQVVESU8JCTB4MTg4CisjZGVmaW5lIEtFWV9WSURFTwkJMHgxODkKKyNkZWZpbmUgS0VZX0RJUkVDVE9SWQkJMHgxOGEKKyNkZWZpbmUgS0VZX0xJU1QJCTB4MThiCisjZGVmaW5lIEtFWV9NRU1PCQkweDE4YwkvKiBNZWRpYSBTZWxlY3QgTWVzc2FnZXMgKi8KKyNkZWZpbmUgS0VZX0NBTEVOREFSCQkweDE4ZAorI2RlZmluZSBLRVlfUkVECQkJMHgxOGUKKyNkZWZpbmUgS0VZX0dSRUVOCQkweDE4ZgorI2RlZmluZSBLRVlfWUVMTE9XCQkweDE5MAorI2RlZmluZSBLRVlfQkxVRQkJMHgxOTEKKyNkZWZpbmUgS0VZX0NIQU5ORUxVUAkJMHgxOTIJLyogQ2hhbm5lbCBJbmNyZW1lbnQgKi8KKyNkZWZpbmUgS0VZX0NIQU5ORUxET1dOCQkweDE5MwkvKiBDaGFubmVsIERlY3JlbWVudCAqLworI2RlZmluZSBLRVlfRklSU1QJCTB4MTk0CisjZGVmaW5lIEtFWV9MQVNUCQkweDE5NQkvKiBSZWNhbGwgTGFzdCAqLworI2RlZmluZSBLRVlfQUIJCQkweDE5NgorI2RlZmluZSBLRVlfTkVYVAkJMHgxOTcKKyNkZWZpbmUgS0VZX1JFU1RBUlQJCTB4MTk4CisjZGVmaW5lIEtFWV9TTE9XCQkweDE5OQorI2RlZmluZSBLRVlfU0hVRkZMRQkJMHgxOWEKKyNkZWZpbmUgS0VZX0JSRUFLCQkweDE5YgorI2RlZmluZSBLRVlfUFJFVklPVVMJCTB4MTljCisjZGVmaW5lIEtFWV9ESUdJVFMJCTB4MTlkCisjZGVmaW5lIEtFWV9URUVOCQkweDE5ZQorI2RlZmluZSBLRVlfVFdFTgkJMHgxOWYKKyNkZWZpbmUgS0VZX1ZJREVPUEhPTkUJCTB4MWEwCS8qIE1lZGlhIFNlbGVjdCBWaWRlbyBQaG9uZSAqLworI2RlZmluZSBLRVlfR0FNRVMJCTB4MWExCS8qIE1lZGlhIFNlbGVjdCBHYW1lcyAqLworI2RlZmluZSBLRVlfWk9PTUlOCQkweDFhMgkvKiBBQyBab29tIEluICovCisjZGVmaW5lIEtFWV9aT09NT1VUCQkweDFhMwkvKiBBQyBab29tIE91dCAqLworI2RlZmluZSBLRVlfWk9PTVJFU0VUCQkweDFhNAkvKiBBQyBab29tICovCisjZGVmaW5lIEtFWV9XT1JEUFJPQ0VTU09SCTB4MWE1CS8qIEFMIFdvcmQgUHJvY2Vzc29yICovCisjZGVmaW5lIEtFWV9FRElUT1IJCTB4MWE2CS8qIEFMIFRleHQgRWRpdG9yICovCisjZGVmaW5lIEtFWV9TUFJFQURTSEVFVAkJMHgxYTcJLyogQUwgU3ByZWFkc2hlZXQgKi8KKyNkZWZpbmUgS0VZX0dSQVBISUNTRURJVE9SCTB4MWE4CS8qIEFMIEdyYXBoaWNzIEVkaXRvciAqLworI2RlZmluZSBLRVlfUFJFU0VOVEFUSU9OCTB4MWE5CS8qIEFMIFByZXNlbnRhdGlvbiBBcHAgKi8KKyNkZWZpbmUgS0VZX0RBVEFCQVNFCQkweDFhYQkvKiBBTCBEYXRhYmFzZSBBcHAgKi8KKyNkZWZpbmUgS0VZX05FV1MJCTB4MWFiCS8qIEFMIE5ld3NyZWFkZXIgKi8KKyNkZWZpbmUgS0VZX1ZPSUNFTUFJTAkJMHgxYWMJLyogQUwgVm9pY2VtYWlsICovCisjZGVmaW5lIEtFWV9BRERSRVNTQk9PSwkJMHgxYWQJLyogQUwgQ29udGFjdHMvQWRkcmVzcyBCb29rICovCisjZGVmaW5lIEtFWV9NRVNTRU5HRVIJCTB4MWFlCS8qIEFMIEluc3RhbnQgTWVzc2FnaW5nICovCisjZGVmaW5lIEtFWV9ESVNQTEFZVE9HR0xFCTB4MWFmCS8qIFR1cm4gZGlzcGxheSAoTENEKSBvbiBhbmQgb2ZmICovCisjZGVmaW5lIEtFWV9TUEVMTENIRUNLCQkweDFiMCAgIC8qIEFMIFNwZWxsIENoZWNrICovCisjZGVmaW5lIEtFWV9MT0dPRkYJCTB4MWIxICAgLyogQUwgTG9nb2ZmICovCisKKyNkZWZpbmUgS0VZX0RPTExBUgkJMHgxYjIKKyNkZWZpbmUgS0VZX0VVUk8JCTB4MWIzCisKKyNkZWZpbmUgS0VZX0ZSQU1FQkFDSwkJMHgxYjQJLyogQ29uc3VtZXIgLSB0cmFuc3BvcnQgY29udHJvbHMgKi8KKyNkZWZpbmUgS0VZX0ZSQU1FRk9SV0FSRAkweDFiNQorCisjZGVmaW5lIEtFWV9DT05URVhUX01FTlUJMHgxYjYJLyogR2VuRGVzYyAtIHN5c3RlbSBjb250ZXh0IG1lbnUgKi8KKworI2RlZmluZSBLRVlfREVMX0VPTAkJMHgxYzAKKyNkZWZpbmUgS0VZX0RFTF9FT1MJCTB4MWMxCisjZGVmaW5lIEtFWV9JTlNfTElORQkJMHgxYzIKKyNkZWZpbmUgS0VZX0RFTF9MSU5FCQkweDFjMworCisjZGVmaW5lIEtFWV9GTgkJCTB4MWQwCisjZGVmaW5lIEtFWV9GTl9FU0MJCTB4MWQxCisjZGVmaW5lIEtFWV9GTl9GMQkJMHgxZDIKKyNkZWZpbmUgS0VZX0ZOX0YyCQkweDFkMworI2RlZmluZSBLRVlfRk5fRjMJCTB4MWQ0CisjZGVmaW5lIEtFWV9GTl9GNAkJMHgxZDUKKyNkZWZpbmUgS0VZX0ZOX0Y1CQkweDFkNgorI2RlZmluZSBLRVlfRk5fRjYJCTB4MWQ3CisjZGVmaW5lIEtFWV9GTl9GNwkJMHgxZDgKKyNkZWZpbmUgS0VZX0ZOX0Y4CQkweDFkOQorI2RlZmluZSBLRVlfRk5fRjkJCTB4MWRhCisjZGVmaW5lIEtFWV9GTl9GMTAJCTB4MWRiCisjZGVmaW5lIEtFWV9GTl9GMTEJCTB4MWRjCisjZGVmaW5lIEtFWV9GTl9GMTIJCTB4MWRkCisjZGVmaW5lIEtFWV9GTl8xCQkweDFkZQorI2RlZmluZSBLRVlfRk5fMgkJMHgxZGYKKyNkZWZpbmUgS0VZX0ZOX0QJCTB4MWUwCisjZGVmaW5lIEtFWV9GTl9FCQkweDFlMQorI2RlZmluZSBLRVlfRk5fRgkJMHgxZTIKKyNkZWZpbmUgS0VZX0ZOX1MJCTB4MWUzCisjZGVmaW5lIEtFWV9GTl9CCQkweDFlNAorCisjZGVmaW5lIEtFWV9CUkxfRE9UMQkJMHgxZjEKKyNkZWZpbmUgS0VZX0JSTF9ET1QyCQkweDFmMgorI2RlZmluZSBLRVlfQlJMX0RPVDMJCTB4MWYzCisjZGVmaW5lIEtFWV9CUkxfRE9UNAkJMHgxZjQKKyNkZWZpbmUgS0VZX0JSTF9ET1Q1CQkweDFmNQorI2RlZmluZSBLRVlfQlJMX0RPVDYJCTB4MWY2CisjZGVmaW5lIEtFWV9CUkxfRE9UNwkJMHgxZjcKKyNkZWZpbmUgS0VZX0JSTF9ET1Q4CQkweDFmOAorI2RlZmluZSBLRVlfQlJMX0RPVDkJCTB4MWY5CisjZGVmaW5lIEtFWV9CUkxfRE9UMTAJCTB4MWZhCisKKy8qIFdlIGF2b2lkIGxvdyBjb21tb24ga2V5cyBpbiBtb2R1bGUgYWxpYXNlcyBzbyB0aGV5IGRvbid0IGdldCBodWdlLiAqLworI2RlZmluZSBLRVlfTUlOX0lOVEVSRVNUSU5HCUtFWV9NVVRFCisjZGVmaW5lIEtFWV9NQVgJCQkweDFmZgorI2RlZmluZSBLRVlfQ05UCQkJKEtFWV9NQVgrMSkKKworLyoKKyAqIFJlbGF0aXZlIGF4ZXMKKyAqLworCisjZGVmaW5lIFJFTF9YCQkJMHgwMAorI2RlZmluZSBSRUxfWQkJCTB4MDEKKyNkZWZpbmUgUkVMX1oJCQkweDAyCisjZGVmaW5lIFJFTF9SWAkJCTB4MDMKKyNkZWZpbmUgUkVMX1JZCQkJMHgwNAorI2RlZmluZSBSRUxfUloJCQkweDA1CisjZGVmaW5lIFJFTF9IV0hFRUwJCTB4MDYKKyNkZWZpbmUgUkVMX0RJQUwJCTB4MDcKKyNkZWZpbmUgUkVMX1dIRUVMCQkweDA4CisjZGVmaW5lIFJFTF9NSVNDCQkweDA5CisjZGVmaW5lIFJFTF9NQVgJCQkweDBmCisjZGVmaW5lIFJFTF9DTlQJCQkoUkVMX01BWCsxKQorCisvKgorICogQWJzb2x1dGUgYXhlcworICovCisKKyNkZWZpbmUgQUJTX1gJCQkweDAwCisjZGVmaW5lIEFCU19ZCQkJMHgwMQorI2RlZmluZSBBQlNfWgkJCTB4MDIKKyNkZWZpbmUgQUJTX1JYCQkJMHgwMworI2RlZmluZSBBQlNfUlkJCQkweDA0CisjZGVmaW5lIEFCU19SWgkJCTB4MDUKKyNkZWZpbmUgQUJTX1RIUk9UVExFCQkweDA2CisjZGVmaW5lIEFCU19SVURERVIJCTB4MDcKKyNkZWZpbmUgQUJTX1dIRUVMCQkweDA4CisjZGVmaW5lIEFCU19HQVMJCQkweDA5CisjZGVmaW5lIEFCU19CUkFLRQkJMHgwYQorI2RlZmluZSBBQlNfSEFUMFgJCTB4MTAKKyNkZWZpbmUgQUJTX0hBVDBZCQkweDExCisjZGVmaW5lIEFCU19IQVQxWAkJMHgxMgorI2RlZmluZSBBQlNfSEFUMVkJCTB4MTMKKyNkZWZpbmUgQUJTX0hBVDJYCQkweDE0CisjZGVmaW5lIEFCU19IQVQyWQkJMHgxNQorI2RlZmluZSBBQlNfSEFUM1gJCTB4MTYKKyNkZWZpbmUgQUJTX0hBVDNZCQkweDE3CisjZGVmaW5lIEFCU19QUkVTU1VSRQkJMHgxOAorI2RlZmluZSBBQlNfRElTVEFOQ0UJCTB4MTkKKyNkZWZpbmUgQUJTX1RJTFRfWAkJMHgxYQorI2RlZmluZSBBQlNfVElMVF9ZCQkweDFiCisjZGVmaW5lIEFCU19UT09MX1dJRFRICQkweDFjCisjZGVmaW5lIEFCU19WT0xVTUUJCTB4MjAKKyNkZWZpbmUgQUJTX01JU0MJCTB4MjgKKyNkZWZpbmUgQUJTX01BWAkJCTB4M2YKKyNkZWZpbmUgQUJTX0NOVAkJCShBQlNfTUFYKzEpCisKKy8qCisgKiBTd2l0Y2ggZXZlbnRzCisgKi8KKworI2RlZmluZSBTV19MSUQJCQkweDAwICAvKiBzZXQgPSBsaWQgc2h1dCAqLworI2RlZmluZSBTV19UQUJMRVRfTU9ERQkJMHgwMSAgLyogc2V0ID0gdGFibGV0IG1vZGUgKi8KKyNkZWZpbmUgU1dfSEVBRFBIT05FX0lOU0VSVAkweDAyICAvKiBzZXQgPSBpbnNlcnRlZCAqLworI2RlZmluZSBTV19SQURJTwkJMHgwMyAgLyogc2V0ID0gcmFkaW8gZW5hYmxlZCAqLworI2RlZmluZSBTV19NQVgJCQkweDBmCisjZGVmaW5lIFNXX0NOVAkJCShTV19NQVgrMSkKKworLyoKKyAqIE1pc2MgZXZlbnRzCisgKi8KKworI2RlZmluZSBNU0NfU0VSSUFMCQkweDAwCisjZGVmaW5lIE1TQ19QVUxTRUxFRAkJMHgwMQorI2RlZmluZSBNU0NfR0VTVFVSRQkJMHgwMgorI2RlZmluZSBNU0NfUkFXCQkJMHgwMworI2RlZmluZSBNU0NfU0NBTgkJMHgwNAorI2RlZmluZSBNU0NfTUFYCQkJMHgwNworI2RlZmluZSBNU0NfQ05UCQkJKE1TQ19NQVgrMSkKKworLyoKKyAqIExFRHMKKyAqLworCisjZGVmaW5lIExFRF9OVU1MCQkweDAwCisjZGVmaW5lIExFRF9DQVBTTAkJMHgwMQorI2RlZmluZSBMRURfU0NST0xMTAkJMHgwMgorI2RlZmluZSBMRURfQ09NUE9TRQkJMHgwMworI2RlZmluZSBMRURfS0FOQQkJMHgwNAorI2RlZmluZSBMRURfU0xFRVAJCTB4MDUKKyNkZWZpbmUgTEVEX1NVU1BFTkQJCTB4MDYKKyNkZWZpbmUgTEVEX01VVEUJCTB4MDcKKyNkZWZpbmUgTEVEX01JU0MJCTB4MDgKKyNkZWZpbmUgTEVEX01BSUwJCTB4MDkKKyNkZWZpbmUgTEVEX0NIQVJHSU5HCQkweDBhCisjZGVmaW5lIExFRF9NQVgJCQkweDBmCisjZGVmaW5lIExFRF9DTlQJCQkoTEVEX01BWCsxKQorCisvKgorICogQXV0b3JlcGVhdCB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFJFUF9ERUxBWQkJMHgwMAorI2RlZmluZSBSRVBfUEVSSU9ECQkweDAxCisjZGVmaW5lIFJFUF9NQVgJCQkweDAxCisKKy8qCisgKiBTb3VuZHMKKyAqLworCisjZGVmaW5lIFNORF9DTElDSwkJMHgwMAorI2RlZmluZSBTTkRfQkVMTAkJMHgwMQorI2RlZmluZSBTTkRfVE9ORQkJMHgwMgorI2RlZmluZSBTTkRfTUFYCQkJMHgwNworI2RlZmluZSBTTkRfQ05UCQkJKFNORF9NQVgrMSkKKworLyoKKyAqIElEcy4KKyAqLworCisjZGVmaW5lIElEX0JVUwkJCTAKKyNkZWZpbmUgSURfVkVORE9SCQkxCisjZGVmaW5lIElEX1BST0RVQ1QJCTIKKyNkZWZpbmUgSURfVkVSU0lPTgkJMworCisjZGVmaW5lIEJVU19QQ0kJCQkweDAxCisjZGVmaW5lIEJVU19JU0FQTlAJCTB4MDIKKyNkZWZpbmUgQlVTX1VTQgkJCTB4MDMKKyNkZWZpbmUgQlVTX0hJTAkJCTB4MDQKKyNkZWZpbmUgQlVTX0JMVUVUT09USAkJMHgwNQorI2RlZmluZSBCVVNfVklSVFVBTAkJMHgwNgorCisjZGVmaW5lIEJVU19JU0EJCQkweDEwCisjZGVmaW5lIEJVU19JODA0MgkJMHgxMQorI2RlZmluZSBCVVNfWFRLQkQJCTB4MTIKKyNkZWZpbmUgQlVTX1JTMjMyCQkweDEzCisjZGVmaW5lIEJVU19HQU1FUE9SVAkJMHgxNAorI2RlZmluZSBCVVNfUEFSUE9SVAkJMHgxNQorI2RlZmluZSBCVVNfQU1JR0EJCTB4MTYKKyNkZWZpbmUgQlVTX0FEQgkJCTB4MTcKKyNkZWZpbmUgQlVTX0kyQwkJCTB4MTgKKyNkZWZpbmUgQlVTX0hPU1QJCTB4MTkKKyNkZWZpbmUgQlVTX0dTQwkJCTB4MUEKKyNkZWZpbmUgQlVTX0FUQVJJCQkweDFCCisKKy8qCisgKiBWYWx1ZXMgZGVzY3JpYmluZyB0aGUgc3RhdHVzIG9mIGEgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKi8KKyNkZWZpbmUgRkZfU1RBVFVTX1NUT1BQRUQJMHgwMAorI2RlZmluZSBGRl9TVEFUVVNfUExBWUlORwkweDAxCisjZGVmaW5lIEZGX1NUQVRVU19NQVgJCTB4MDEKKworLyoKKyAqIFN0cnVjdHVyZXMgdXNlZCBpbiBpb2N0bHMgdG8gdXBsb2FkIGVmZmVjdHMgdG8gYSBkZXZpY2UKKyAqIFRoZXkgYXJlIHBpZWNlcyBvZiBhIGJpZ2dlciBzdHJ1Y3R1cmUgKGNhbGxlZCBmZl9lZmZlY3QpCisgKi8KKworLyoKKyAqIEFsbCBkdXJhdGlvbiB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiBtcy4gVmFsdWVzIGFib3ZlIDMyNzY3IG1zICgweDdmZmYpCisgKiBzaG91bGQgbm90IGJlIHVzZWQgYW5kIGhhdmUgdW5zcGVjaWZpZWQgcmVzdWx0cy4KKyAqLworCisvKioKKyAqIHN0cnVjdCBmZl9yZXBsYXkgLSBkZWZpbmVzIHNjaGVkdWxpbmcgb2YgdGhlIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQGxlbmd0aDogZHVyYXRpb24gb2YgdGhlIGVmZmVjdAorICogQGRlbGF5OiBkZWxheSBiZWZvcmUgZWZmZWN0IHNob3VsZCBzdGFydCBwbGF5aW5nCisgKi8KK3N0cnVjdCBmZl9yZXBsYXkgeworCV9fdTE2IGxlbmd0aDsKKwlfX3UxNiBkZWxheTsKK307CisKKy8qKgorICogc3RydWN0IGZmX3RyaWdnZXIgLSBkZWZpbmVzIHdoYXQgdHJpZ2dlcnMgdGhlIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQGJ1dHRvbjogbnVtYmVyIG9mIHRoZSBidXR0b24gdHJpZ2dlcmluZyB0aGUgZWZmZWN0CisgKiBAaW50ZXJ2YWw6IGNvbnRyb2xzIGhvdyBzb29uIHRoZSBlZmZlY3QgY2FuIGJlIHJlLXRyaWdnZXJlZAorICovCitzdHJ1Y3QgZmZfdHJpZ2dlciB7CisJX191MTYgYnV0dG9uOworCV9fdTE2IGludGVydmFsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfZW52ZWxvcGUgLSBnZW5lcmljIGZvcmNlLWZlZWRiYWNrIGVmZmVjdCBlbnZlbG9wZQorICogQGF0dGFja19sZW5ndGg6IGR1cmF0aW9uIG9mIHRoZSBhdHRhY2sgKG1zKQorICogQGF0dGFja19sZXZlbDogbGV2ZWwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXR0YWNrCisgKiBAZmFkZV9sZW5ndGg6IGR1cmF0aW9uIG9mIGZhZGUgKG1zKQorICogQGZhZGVfbGV2ZWw6IGxldmVsIGF0IHRoZSBlbmQgb2YgZmFkZQorICoKKyAqIFRoZSBAYXR0YWNrX2xldmVsIGFuZCBAZmFkZV9sZXZlbCBhcmUgYWJzb2x1dGUgdmFsdWVzOyB3aGVuIGFwcGx5aW5nCisgKiBlbnZlbG9wZSBmb3JjZS1mZWVkYmFjayBjb3JlIHdpbGwgY29udmVydCB0byBwb3NpdGl2ZS9uZWdhdGl2ZQorICogdmFsdWUgYmFzZWQgb24gcG9sYXJpdHkgb2YgdGhlIGRlZmF1bHQgbGV2ZWwgb2YgdGhlIGVmZmVjdC4KKyAqIFZhbGlkIHJhbmdlIGZvciB0aGUgYXR0YWNrIGFuZCBmYWRlIGxldmVscyBpcyAweDAwMDAgLSAweDdmZmYKKyAqLworc3RydWN0IGZmX2VudmVsb3BlIHsKKwlfX3UxNiBhdHRhY2tfbGVuZ3RoOworCV9fdTE2IGF0dGFja19sZXZlbDsKKwlfX3UxNiBmYWRlX2xlbmd0aDsKKwlfX3UxNiBmYWRlX2xldmVsOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgY29uc3RhbnQgZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKiBAbGV2ZWw6IHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3Q7IG1heSBiZSBuZWdhdGl2ZQorICogQGVudmVsb3BlOiBlbnZlbG9wZSBkYXRhCisgKi8KK3N0cnVjdCBmZl9jb25zdGFudF9lZmZlY3QgeworCV9fczE2IGxldmVsOworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKK307CisKKy8qKgorICogc3RydWN0IGZmX3JhbXBfZWZmZWN0IC0gZGVmaW5lcyBwYXJhbWV0ZXJzIG9mIGEgcmFtcCBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEBzdGFydF9sZXZlbDogYmVnaW5uaW5nIHN0cmVuZ3RoIG9mIHRoZSBlZmZlY3Q7IG1heSBiZSBuZWdhdGl2ZQorICogQGVuZF9sZXZlbDogZmluYWwgc3RyZW5ndGggb2YgdGhlIGVmZmVjdDsgbWF5IGJlIG5lZ2F0aXZlCisgKiBAZW52ZWxvcGU6IGVudmVsb3BlIGRhdGEKKyAqLworc3RydWN0IGZmX3JhbXBfZWZmZWN0IHsKKwlfX3MxNiBzdGFydF9sZXZlbDsKKwlfX3MxNiBlbmRfbGV2ZWw7CisJc3RydWN0IGZmX2VudmVsb3BlIGVudmVsb3BlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfY29uZGl0aW9uX2VmZmVjdCAtIGRlZmluZXMgYSBzcHJpbmcgb3IgZnJpY3Rpb24gZm9yY2UtZmVlZGJhY2sgZWZmZWN0CisgKiBAcmlnaHRfc2F0dXJhdGlvbjogbWF4aW11bSBsZXZlbCB3aGVuIGpveXN0aWNrIG1vdmVkIGFsbCB3YXkgdG8gdGhlIHJpZ2h0CisgKiBAbGVmdF9zYXR1cmF0aW9uOiBzYW1lIGZvciB0aGUgbGVmdCBzaWRlCisgKiBAcmlnaHRfY29lZmY6IGNvbnRyb2xzIGhvdyBmYXN0IHRoZSBmb3JjZSBncm93cyB3aGVuIHRoZSBqb3lzdGljayBtb3ZlcworICoJdG8gdGhlIHJpZ2h0CisgKiBAbGVmdF9jb2VmZjogc2FtZSBmb3IgdGhlIGxlZnQgc2lkZQorICogQGRlYWRiYW5kOiBzaXplIG9mIHRoZSBkZWFkIHpvbmUsIHdoZXJlIG5vIGZvcmNlIGlzIHByb2R1Y2VkCisgKiBAY2VudGVyOiBwb3NpdGlvbiBvZiB0aGUgZGVhZCB6b25lCisgKi8KK3N0cnVjdCBmZl9jb25kaXRpb25fZWZmZWN0IHsKKwlfX3UxNiByaWdodF9zYXR1cmF0aW9uOworCV9fdTE2IGxlZnRfc2F0dXJhdGlvbjsKKworCV9fczE2IHJpZ2h0X2NvZWZmOworCV9fczE2IGxlZnRfY29lZmY7CisKKwlfX3UxNiBkZWFkYmFuZDsKKwlfX3MxNiBjZW50ZXI7Cit9OworCisvKioKKyAqIHN0cnVjdCBmZl9wZXJpb2RpY19lZmZlY3QgLSBkZWZpbmVzIHBhcmFtZXRlcnMgb2YgYSBwZXJpb2RpYyBmb3JjZS1mZWVkYmFjayBlZmZlY3QKKyAqIEB3YXZlZm9ybToga2luZCBvZiB0aGUgZWZmZWN0ICh3YXZlKQorICogQHBlcmlvZDogcGVyaW9kIG9mIHRoZSB3YXZlIChtcykKKyAqIEBtYWduaXR1ZGU6IHBlYWsgdmFsdWUKKyAqIEBvZmZzZXQ6IG1lYW4gdmFsdWUgb2YgdGhlIHdhdmUgKHJvdWdobHkpCisgKiBAcGhhc2U6ICdob3Jpem9udGFsJyBzaGlmdAorICogQGVudmVsb3BlOiBlbnZlbG9wZSBkYXRhCisgKiBAY3VzdG9tX2xlbjogbnVtYmVyIG9mIHNhbXBsZXMgKEZGX0NVU1RPTSBvbmx5KQorICogQGN1c3RvbV9kYXRhOiBidWZmZXIgb2Ygc2FtcGxlcyAoRkZfQ1VTVE9NIG9ubHkpCisgKgorICogS25vd24gd2F2ZWZvcm1zIC0gRkZfU1FVQVJFLCBGRl9UUklBTkdMRSwgRkZfU0lORSwgRkZfU0FXX1VQLAorICogRkZfU0FXX0RPV04sIEZGX0NVU1RPTS4gVGhlIGV4YWN0IHN5bnRheCBGRl9DVVNUT00gaXMgdW5kZWZpbmVkCisgKiBmb3IgdGhlIHRpbWUgYmVpbmcgYXMgbm8gZHJpdmVyIHN1cHBvcnRzIGl0IHlldC4KKyAqCisgKiBOb3RlOiB0aGUgZGF0YSBwb2ludGVkIGJ5IGN1c3RvbV9kYXRhIGlzIGNvcGllZCBieSB0aGUgZHJpdmVyLgorICogWW91IGNhbiB0aGVyZWZvcmUgZGlzcG9zZSBvZiB0aGUgbWVtb3J5IGFmdGVyIHRoZSB1cGxvYWQvdXBkYXRlLgorICovCitzdHJ1Y3QgZmZfcGVyaW9kaWNfZWZmZWN0IHsKKwlfX3UxNiB3YXZlZm9ybTsKKwlfX3UxNiBwZXJpb2Q7CisJX19zMTYgbWFnbml0dWRlOworCV9fczE2IG9mZnNldDsKKwlfX3UxNiBwaGFzZTsKKworCXN0cnVjdCBmZl9lbnZlbG9wZSBlbnZlbG9wZTsKKworCV9fdTMyIGN1c3RvbV9sZW47CisJX19zMTYgKmN1c3RvbV9kYXRhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZmZfcnVtYmxlX2VmZmVjdCAtIGRlZmluZXMgcGFyYW1ldGVycyBvZiBhIHBlcmlvZGljIGZvcmNlLWZlZWRiYWNrIGVmZmVjdAorICogQHN0cm9uZ19tYWduaXR1ZGU6IG1hZ25pdHVkZSBvZiB0aGUgaGVhdnkgbW90b3IKKyAqIEB3ZWFrX21hZ25pdHVkZTogbWFnbml0dWRlIG9mIHRoZSBsaWdodCBvbmUKKyAqCisgKiBTb21lIHJ1bWJsZSBwYWRzIGhhdmUgdHdvIG1vdG9ycyBvZiBkaWZmZXJlbnQgd2VpZ2h0LiBTdHJvbmdfbWFnbml0dWRlCisgKiByZXByZXNlbnRzIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZpYnJhdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIGhlYXZ5IG9uZS4KKyAqLworc3RydWN0IGZmX3J1bWJsZV9lZmZlY3QgeworCV9fdTE2IHN0cm9uZ19tYWduaXR1ZGU7CisJX191MTYgd2Vha19tYWduaXR1ZGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBmZl9lZmZlY3QgLSBkZWZpbmVzIGZvcmNlIGZlZWRiYWNrIGVmZmVjdAorICogQHR5cGU6IHR5cGUgb2YgdGhlIGVmZmVjdCAoRkZfQ09OU1RBTlQsIEZGX1BFUklPRElDLCBGRl9SQU1QLCBGRl9TUFJJTkcsCisgKglGRl9GUklDVElPTiwgRkZfREFNUEVSLCBGRl9SVU1CTEUsIEZGX0lORVJUSUEsIG9yIEZGX0NVU1RPTSkKKyAqIEBpZDogYW4gdW5pcXVlIGlkIGFzc2lnbmVkIHRvIGFuIGVmZmVjdAorICogQGRpcmVjdGlvbjogZGlyZWN0aW9uIG9mIHRoZSBlZmZlY3QKKyAqIEB0cmlnZ2VyOiB0cmlnZ2VyIGNvbmRpdGlvbnMgKHN0cnVjdCBmZl90cmlnZ2VyKQorICogQHJlcGxheTogc2NoZWR1bGluZyBvZiB0aGUgZWZmZWN0IChzdHJ1Y3QgZmZfcmVwbGF5KQorICogQHU6IGVmZmVjdC1zcGVjaWZpYyBzdHJ1Y3R1cmUgKG9uZSBvZiBmZl9jb25zdGFudF9lZmZlY3QsIGZmX3JhbXBfZWZmZWN0LAorICoJZmZfcGVyaW9kaWNfZWZmZWN0LCBmZl9jb25kaXRpb25fZWZmZWN0LCBmZl9ydW1ibGVfZWZmZWN0KSBmdXJ0aGVyCisgKglkZWZpbmluZyBlZmZlY3QgcGFyYW1ldGVycworICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHNlbnQgdGhyb3VnaCBpb2N0bCBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgZHJpdmVyLgorICogVG8gY3JlYXRlIGEgbmV3IGVmZmVjdCBhcHBsaWNhdGlvbiBzaG91bGQgc2V0IGl0cyBAaWQgdG8gLTE7IHRoZSBrZXJuZWwKKyAqIHdpbGwgcmV0dXJuIGFzc2lnbmVkIEBpZCB3aGljaCBjYW4gbGF0ZXIgYmUgdXNlZCB0byB1cGRhdGUgb3IgZGVsZXRlCisgKiB0aGlzIGVmZmVjdC4KKyAqCisgKiBEaXJlY3Rpb24gb2YgdGhlIGVmZmVjdCBpcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgKgkwIGRlZyAtPiAweDAwMDAgKGRvd24pCisgKgk5MCBkZWcgLT4gMHg0MDAwIChsZWZ0KQorICoJMTgwIGRlZyAtPiAweDgwMDAgKHVwKQorICoJMjcwIGRlZyAtPiAweEMwMDAgKHJpZ2h0KQorICovCitzdHJ1Y3QgZmZfZWZmZWN0IHsKKwlfX3UxNiB0eXBlOworCV9fczE2IGlkOworCV9fdTE2IGRpcmVjdGlvbjsKKwlzdHJ1Y3QgZmZfdHJpZ2dlciB0cmlnZ2VyOworCXN0cnVjdCBmZl9yZXBsYXkgcmVwbGF5OworCisJdW5pb24geworCQlzdHJ1Y3QgZmZfY29uc3RhbnRfZWZmZWN0IGNvbnN0YW50OworCQlzdHJ1Y3QgZmZfcmFtcF9lZmZlY3QgcmFtcDsKKwkJc3RydWN0IGZmX3BlcmlvZGljX2VmZmVjdCBwZXJpb2RpYzsKKwkJc3RydWN0IGZmX2NvbmRpdGlvbl9lZmZlY3QgY29uZGl0aW9uWzJdOyAvKiBPbmUgZm9yIGVhY2ggYXhpcyAqLworCQlzdHJ1Y3QgZmZfcnVtYmxlX2VmZmVjdCBydW1ibGU7CisJfSB1OworfTsKKworLyoKKyAqIEZvcmNlIGZlZWRiYWNrIGVmZmVjdCB0eXBlcworICovCisKKyNkZWZpbmUgRkZfUlVNQkxFCTB4NTAKKyNkZWZpbmUgRkZfUEVSSU9ESUMJMHg1MQorI2RlZmluZSBGRl9DT05TVEFOVAkweDUyCisjZGVmaW5lIEZGX1NQUklORwkweDUzCisjZGVmaW5lIEZGX0ZSSUNUSU9OCTB4NTQKKyNkZWZpbmUgRkZfREFNUEVSCTB4NTUKKyNkZWZpbmUgRkZfSU5FUlRJQQkweDU2CisjZGVmaW5lIEZGX1JBTVAJCTB4NTcKKworI2RlZmluZSBGRl9FRkZFQ1RfTUlOCUZGX1JVTUJMRQorI2RlZmluZSBGRl9FRkZFQ1RfTUFYCUZGX1JBTVAKKworLyoKKyAqIEZvcmNlIGZlZWRiYWNrIHBlcmlvZGljIGVmZmVjdCB0eXBlcworICovCisKKyNkZWZpbmUgRkZfU1FVQVJFCTB4NTgKKyNkZWZpbmUgRkZfVFJJQU5HTEUJMHg1OQorI2RlZmluZSBGRl9TSU5FCQkweDVhCisjZGVmaW5lIEZGX1NBV19VUAkweDViCisjZGVmaW5lIEZGX1NBV19ET1dOCTB4NWMKKyNkZWZpbmUgRkZfQ1VTVE9NCTB4NWQKKworI2RlZmluZSBGRl9XQVZFRk9STV9NSU4JRkZfU1FVQVJFCisjZGVmaW5lIEZGX1dBVkVGT1JNX01BWAlGRl9DVVNUT00KKworLyoKKyAqIFNldCBmZiBkZXZpY2UgcHJvcGVydGllcworICovCisKKyNkZWZpbmUgRkZfR0FJTgkJMHg2MAorI2RlZmluZSBGRl9BVVRPQ0VOVEVSCTB4NjEKKworI2RlZmluZSBGRl9NQVgJCTB4N2YKKyNkZWZpbmUgRkZfQ05UCQkoRkZfTUFYKzEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTFlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lvY3RsLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9MSU5VWF9JT0NUTF9ICisjZGVmaW5lIF9MSU5VWF9JT0NUTF9ICisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9JT0NUTF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY0NzJhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgSVAgcHJvdG9jb2wuCisgKgorICogVmVyc2lvbjoJQCgjKWlwLmgJMS4wLjIJMDQvMjgvOTMKKyAqCisgKiBBdXRob3JzOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfSVBfSAorI2RlZmluZSBfTElOVVhfSVBfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIElQVE9TX1RPU19NQVNLCQkweDFFCisjZGVmaW5lIElQVE9TX1RPUyh0b3MpCQkoKHRvcykmSVBUT1NfVE9TX01BU0spCisjZGVmaW5lCUlQVE9TX0xPV0RFTEFZCQkweDEwCisjZGVmaW5lCUlQVE9TX1RIUk9VR0hQVVQJMHgwOAorI2RlZmluZQlJUFRPU19SRUxJQUJJTElUWQkweDA0CisjZGVmaW5lCUlQVE9TX01JTkNPU1QJCTB4MDIKKworI2RlZmluZSBJUFRPU19QUkVDX01BU0sJCTB4RTAKKyNkZWZpbmUgSVBUT1NfUFJFQyh0b3MpCQkoKHRvcykmSVBUT1NfUFJFQ19NQVNLKQorI2RlZmluZSBJUFRPU19QUkVDX05FVENPTlRST0wgICAgICAgICAgIDB4ZTAKKyNkZWZpbmUgSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wgICAgICAweGMwCisjZGVmaW5lIElQVE9TX1BSRUNfQ1JJVElDX0VDUCAgICAgICAgICAgMHhhMAorI2RlZmluZSBJUFRPU19QUkVDX0ZMQVNIT1ZFUlJJREUgICAgICAgIDB4ODAKKyNkZWZpbmUgSVBUT1NfUFJFQ19GTEFTSCAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIElQVE9TX1BSRUNfSU1NRURJQVRFICAgICAgICAgICAgMHg0MAorI2RlZmluZSBJUFRPU19QUkVDX1BSSU9SSVRZICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSVBUT1NfUFJFQ19ST1VUSU5FICAgICAgICAgICAgICAweDAwCisKKworLyogSVAgb3B0aW9ucyAqLworI2RlZmluZSBJUE9QVF9DT1BZCQkweDgwCisjZGVmaW5lIElQT1BUX0NMQVNTX01BU0sJMHg2MAorI2RlZmluZSBJUE9QVF9OVU1CRVJfTUFTSwkweDFmCisKKyNkZWZpbmUJSVBPUFRfQ09QSUVEKG8pCQkoKG8pJklQT1BUX0NPUFkpCisjZGVmaW5lCUlQT1BUX0NMQVNTKG8pCQkoKG8pJklQT1BUX0NMQVNTX01BU0spCisjZGVmaW5lCUlQT1BUX05VTUJFUihvKQkJKChvKSZJUE9QVF9OVU1CRVJfTUFTSykKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9NRUFTVVJFTUVOVAkweDQwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAorCisjZGVmaW5lIElQT1BUX0VORAkoMCB8SVBPUFRfQ09OVFJPTCkKKyNkZWZpbmUgSVBPUFRfTk9PUAkoMSB8SVBPUFRfQ09OVFJPTCkKKyNkZWZpbmUgSVBPUFRfU0VDCSgyIHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisjZGVmaW5lIElQT1BUX0xTUlIJKDMgfElQT1BUX0NPTlRST0x8SVBPUFRfQ09QWSkKKyNkZWZpbmUgSVBPUFRfVElNRVNUQU1QCSg0IHxJUE9QVF9NRUFTVVJFTUVOVCkKKyNkZWZpbmUgSVBPUFRfQ0lQU08JKDYgfElQT1BUX0NPTlRST0x8SVBPUFRfQ09QWSkKKyNkZWZpbmUgSVBPUFRfUlIJKDcgfElQT1BUX0NPTlRST0wpCisjZGVmaW5lIElQT1BUX1NJRAkoOCB8SVBPUFRfQ09OVFJPTHxJUE9QVF9DT1BZKQorI2RlZmluZSBJUE9QVF9TU1JSCSg5IHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisjZGVmaW5lIElQT1BUX1JBCSgyMHxJUE9QVF9DT05UUk9MfElQT1BUX0NPUFkpCisKKyNkZWZpbmUgSVBWRVJTSU9OCTQKKyNkZWZpbmUgTUFYVFRMCQkyNTUKKyNkZWZpbmUgSVBERUZUVEwJNjQKKworI2RlZmluZSBJUE9QVF9PUFRWQUwgMAorI2RlZmluZSBJUE9QVF9PTEVOICAgMQorI2RlZmluZSBJUE9QVF9PRkZTRVQgMgorI2RlZmluZSBJUE9QVF9NSU5PRkYgNAorI2RlZmluZSBNQVhfSVBPUFRMRU4gNDAKKyNkZWZpbmUgSVBPUFRfTk9QIElQT1BUX05PT1AKKyNkZWZpbmUgSVBPUFRfRU9MIElQT1BUX0VORAorI2RlZmluZSBJUE9QVF9UUyAgSVBPUFRfVElNRVNUQU1QCisKKyNkZWZpbmUJSVBPUFRfVFNfVFNPTkxZCQkwCQkvKiB0aW1lc3RhbXBzIG9ubHkgKi8KKyNkZWZpbmUJSVBPUFRfVFNfVFNBTkRBRERSCTEJCS8qIHRpbWVzdGFtcHMgYW5kIGFkZHJlc3NlcyAqLworI2RlZmluZQlJUE9QVF9UU19QUkVTUEVDCTMJCS8qIHNwZWNpZmllZCBtb2R1bGVzIG9ubHkgKi8KKworI2RlZmluZSBJUFY0X0JFRVRfUEhNQVhMRU4gOAorCitzdHJ1Y3QgaXBoZHIgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTgJaWhsOjQsCisJCXZlcnNpb246NDsKKyNlbGlmIGRlZmluZWQgKF9fQklHX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4CXZlcnNpb246NCwKKyAgCQlpaGw6NDsKKyNlbHNlCisjZXJyb3IJIlBsZWFzZSBmaXggPGFzbS9ieXRlb3JkZXIuaD4iCisjZW5kaWYKKwlfX3U4CXRvczsKKwlfX2JlMTYJdG90X2xlbjsKKwlfX2JlMTYJaWQ7CisJX19iZTE2CWZyYWdfb2ZmOworCV9fdTgJdHRsOworCV9fdTgJcHJvdG9jb2w7CisJX19zdW0xNgljaGVjazsKKwlfX2JlMzIJc2FkZHI7CisJX19iZTMyCWRhZGRyOworCS8qVGhlIG9wdGlvbnMgc3RhcnQgaGVyZS4gKi8KK307CisKKworc3RydWN0IGlwX2F1dGhfaGRyIHsKKwlfX3U4ICBuZXh0aGRyOworCV9fdTggIGhkcmxlbjsJCS8qIFRoaXMgb25lIGlzIG1lYXN1cmVkIGluIDMyIGJpdCB1bml0cyEgKi8KKwlfX2JlMTYgcmVzZXJ2ZWQ7CisJX19iZTMyIHNwaTsKKwlfX2JlMzIgc2VxX25vOwkJLyogU2VxdWVuY2UgbnVtYmVyICovCisJX191OCAgYXV0aF9kYXRhWzBdOwkvKiBWYXJpYWJsZSBsZW4gYnV0ID49NC4gTWluZCB0aGUgNjQgYml0IGFsaWdubWVudCEgKi8KK307CisKK3N0cnVjdCBpcF9lc3BfaGRyIHsKKwlfX2JlMzIgc3BpOworCV9fYmUzMiBzZXFfbm87CQkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwlfX3U4ICBlbmNfZGF0YVswXTsJLyogVmFyaWFibGUgbGVuIGJ1dCA+PTguIE1pbmQgdGhlIDY0IGJpdCBhbGlnbm1lbnQhICovCit9OworCitzdHJ1Y3QgaXBfY29tcF9oZHIgeworCV9fdTggbmV4dGhkcjsKKwlfX3U4IGZsYWdzOworCV9fYmUxNiBjcGk7Cit9OworCitzdHJ1Y3QgaXBfYmVldF9waGRyIHsKKwlfX3U4IG5leHRoZHI7CisJX191OCBoZHJsZW47CisJX191OCBwYWRsZW47CisJX191OCByZXNlcnZlZDsKK307CisKKyNlbmRpZgkvKiBfTElOVVhfSVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNmNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqICRJZCQKKyAqLworCisjaWZuZGVmIF9JUDZfVFVOTkVMX0gKKyNkZWZpbmUgX0lQNl9UVU5ORUxfSAorCisjZGVmaW5lIElQVjZfVExWX1ROTF9FTkNBUF9MSU1JVCA0CisjZGVmaW5lIElQVjZfREVGQVVMVF9UTkxfRU5DQVBfTElNSVQgNAorCisvKiBkb24ndCBhZGQgZW5jYXBzdWxhdGlvbiBsaW1pdCBpZiBvbmUgaXNuJ3QgcHJlc2VudCBpbiBpbm5lciBwYWNrZXQgKi8KKyNkZWZpbmUgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCAweDEKKy8qIGNvcHkgdGhlIHRyYWZmaWMgY2xhc3MgZmllbGQgZnJvbSB0aGUgaW5uZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MgMHgyCisvKiBjb3B5IHRoZSBmbG93bGFiZWwgZnJvbSB0aGUgaW5uZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwgMHg0CisvKiBiZWluZyB1c2VkIGZvciBNb2JpbGUgSVB2NiAqLworI2RlZmluZSBJUDZfVE5MX0ZfTUlQNl9ERVYgMHg4CisvKiBjb3B5IERTQ1AgZnJvbSB0aGUgb3V0ZXIgcGFja2V0ICovCisjZGVmaW5lIElQNl9UTkxfRl9SQ1ZfRFNDUF9DT1BZIDB4MTAKKworc3RydWN0IGlwNl90bmxfcGFybSB7CisJY2hhciBuYW1lW0lGTkFNU0laXTsJLyogbmFtZSBvZiB0dW5uZWwgZGV2aWNlICovCisJaW50IGxpbms7CQkvKiBpZmluZGV4IG9mIHVuZGVybHlpbmcgTDIgaW50ZXJmYWNlICovCisJX191OCBwcm90bzsJCS8qIHR1bm5lbCBwcm90b2NvbCAqLworCV9fdTggZW5jYXBfbGltaXQ7CS8qIGVuY2Fwc3VsYXRpb24gbGltaXQgZm9yIHR1bm5lbCAqLworCV9fdTggaG9wX2xpbWl0OwkJLyogaG9wIGxpbWl0IGZvciB0dW5uZWwgKi8KKwlfX2JlMzIgZmxvd2luZm87CS8qIHRyYWZmaWMgY2xhc3MgYW5kIGZsb3dsYWJlbCBmb3IgdHVubmVsICovCisJX191MzIgZmxhZ3M7CQkvKiB0dW5uZWwgZmxhZ3MgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgbGFkZHI7CS8qIGxvY2FsIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLworCXN0cnVjdCBpbjZfYWRkciByYWRkcjsJLyogcmVtb3RlIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE1M2ExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcGMuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9MSU5VWF9JUENfSAorI2RlZmluZSBfTElOVVhfSVBDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVBDX1BSSVZBVEUgKChfX2tlcm5lbF9rZXlfdCkgMCkgIAorCisvKiBPYnNvbGV0ZSwgdXNlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQgbGliYzUgY29tcGlsZXMgKi8KK3N0cnVjdCBpcGNfcGVybQoreworCV9fa2VybmVsX2tleV90CWtleTsKKwlfX2tlcm5lbF91aWRfdAl1aWQ7CisJX19rZXJuZWxfZ2lkX3QJZ2lkOworCV9fa2VybmVsX3VpZF90CWN1aWQ7CisJX19rZXJuZWxfZ2lkX3QJY2dpZDsKKwlfX2tlcm5lbF9tb2RlX3QJbW9kZTsgCisJdW5zaWduZWQgc2hvcnQJc2VxOworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBpcGM2NF9wZXJtICovCisjaW5jbHVkZSA8YXNtL2lwY2J1Zi5oPgorCisvKiByZXNvdXJjZSBnZXQgcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBJUENfQ1JFQVQgIDAwMDAxMDAwICAgLyogY3JlYXRlIGlmIGtleSBpcyBub25leGlzdGVudCAqLworI2RlZmluZSBJUENfRVhDTCAgIDAwMDAyMDAwICAgLyogZmFpbCBpZiBrZXkgZXhpc3RzICovCisjZGVmaW5lIElQQ19OT1dBSVQgMDAwMDQwMDAgICAvKiByZXR1cm4gZXJyb3Igb24gd2FpdCAqLworCisvKiB0aGVzZSBmaWVsZHMgYXJlIHVzZWQgYnkgdGhlIERJUEMgcGFja2FnZSBzbyB0aGUga2VybmVsIGFzIHN0YW5kYXJkCisgICBzaG91bGQgYXZvaWQgdXNpbmcgdGhlbSBpZiBwb3NzaWJsZSAqLworICAgCisjZGVmaW5lIElQQ19ESVBDIDAwMDEwMDAwICAvKiBtYWtlIGl0IGRpc3RyaWJ1dGVkICovCisjZGVmaW5lIElQQ19PV04gIDAwMDIwMDAwICAvKiB0aGlzIG1hY2hpbmUgaXMgdGhlIERJUEMgb3duZXIgKi8KKworLyogCisgKiBDb250cm9sIGNvbW1hbmRzIHVzZWQgd2l0aCBzZW1jdGwsIG1zZ2N0bCBhbmQgc2htY3RsIAorICogc2VlIGFsc28gc3BlY2lmaWMgY29tbWFuZHMgaW4gc2VtLmgsIG1zZy5oIGFuZCBzaG0uaAorICovCisjZGVmaW5lIElQQ19STUlEIDAgICAgIC8qIHJlbW92ZSByZXNvdXJjZSAqLworI2RlZmluZSBJUENfU0VUICAxICAgICAvKiBzZXQgaXBjX3Blcm0gb3B0aW9ucyAqLworI2RlZmluZSBJUENfU1RBVCAyICAgICAvKiBnZXQgaXBjX3Blcm0gb3B0aW9ucyAqLworI2RlZmluZSBJUENfSU5GTyAzICAgICAvKiBzZWUgaXBjcyAqLworCisvKgorICogVmVyc2lvbiBmbGFncyBmb3Igc2VtY3RsLCBtc2djdGwsIGFuZCBzaG1jdGwgY29tbWFuZHMKKyAqIFRoZXNlIGFyZSBwYXNzZWQgYXMgYml0ZmxhZ3Mgb3ItZWQgd2l0aCB0aGUgYWN0dWFsIGNvbW1hbmQKKyAqLworI2RlZmluZSBJUENfT0xEIDAJLyogT2xkIHZlcnNpb24gKG5vIDMyLWJpdCBVSUQgc3VwcG9ydCBvbiBtYW55CisJCQkgICBhcmNoaXRlY3R1cmVzKSAqLworI2RlZmluZSBJUENfNjQgIDB4MDEwMCAgLyogTmV3IHZlcnNpb24gKHN1cHBvcnQgMzItYml0IFVJRHMsIGJpZ2dlcgorCQkJICAgbWVzc2FnZSBzaXplcywgZXRjLiAqLworCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gd3JhcCBzeXN0ZW0gY2FsbHMuCisgKgorICogU2VlIGFyY2hpdGVjdHVyZSBjb2RlIGZvciB1Z2x5IGRldGFpbHMuLgorICovCitzdHJ1Y3QgaXBjX2tsdWRnZSB7CisJc3RydWN0IG1zZ2J1ZiAqbXNncDsKKwlsb25nIG1zZ3R5cDsKK307CisKKyNkZWZpbmUgU0VNT1AJCSAxCisjZGVmaW5lIFNFTUdFVAkJIDIKKyNkZWZpbmUgU0VNQ1RMCQkgMworI2RlZmluZSBTRU1USU1FRE9QCSA0CisjZGVmaW5lIE1TR1NORAkJMTEKKyNkZWZpbmUgTVNHUkNWCQkxMgorI2RlZmluZSBNU0dHRVQJCTEzCisjZGVmaW5lIE1TR0NUTAkJMTQKKyNkZWZpbmUgU0hNQVQJCTIxCisjZGVmaW5lIFNITURUCQkyMgorI2RlZmluZSBTSE1HRVQJCTIzCisjZGVmaW5lIFNITUNUTAkJMjQKKworLyogVXNlZCBieSB0aGUgRElQQyBwYWNrYWdlLCB0cnkgYW5kIGF2b2lkIHJldXNpbmcgaXQgKi8KKyNkZWZpbmUgRElQQyAgICAgICAgICAgIDI1CisKKyNkZWZpbmUgSVBDQ0FMTCh2ZXJzaW9uLG9wKQkoKHZlcnNpb24pPDwxNiB8IChvcCkpCisKKworI2VuZGlmIC8qIF9MSU5VWF9JUENfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE3OTViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pLmgKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBpcG1pLmgKKyAqCisgKiBNb250YVZpc3RhIElQTUkgaW50ZXJmYWNlCisgKgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIENvcmV5IE1pbnlhcmQgPG1pbnlhcmRAbXZpc3RhLmNvbT4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICogIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAqICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiAgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSVBNSV9ICisjZGVmaW5lIF9fTElOVVhfSVBNSV9ICisKKyNpbmNsdWRlIDxsaW51eC9pcG1pX21zZ2RlZnMuaD4KKworLyoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgYW4gaW50ZXJmYWNlIHRvIGFuIElQTUkgZHJpdmVyLiAgWW91IGhhdmUgdG8KKyAqIGhhdmUgYSBmYWlybHkgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIElQTUkgdG8gdXNlIHRoaXMsIHNvIGdvIHJlYWQKKyAqIHRoZSBzcGVjcyBmaXJzdCBiZWZvcmUgYWN0dWFsbHkgdHJ5aW5nIHRvIGRvIGFueXRoaW5nLgorICoKKyAqIFdpdGggdGhhdCBzYWlkLCB0aGlzIGRyaXZlciBwcm92aWRlcyBhIG11bHRpLXVzZXIgaW50ZXJmYWNlIHRvIHRoZQorICogSVBNSSBkcml2ZXIsIGFuZCBpdCBhbGxvd3MgbXVsdGlwbGUgSVBNSSBwaHlzaWNhbCBpbnRlcmZhY2VzIGJlbG93CisgKiB0aGUgZHJpdmVyLiAgVGhlIHBoeXNpY2FsIGludGVyZmFjZXMgYmluZCBhcyBhIGxvd2VyIGxheWVyIG9uIHRoZQorICogZHJpdmVyLiAgVGhleSBhcHBlYXIgYXMgaW50ZXJmYWNlcyB0byB0aGUgYXBwbGljYXRpb24gdXNpbmcgdGhpcworICogaW50ZXJmYWNlLgorICoKKyAqIE11bHRpLXVzZXIgbWVhbnMgdGhhdCBtdWx0aXBsZSBhcHBsaWNhdGlvbnMgbWF5IHVzZSB0aGUgZHJpdmVyLAorICogc2VuZCBjb21tYW5kcywgcmVjZWl2ZSByZXNwb25zZXMsIGV0Yy4gIFRoZSBkcml2ZXIga2VlcHMgdHJhY2sgb2YKKyAqIGNvbW1hbmRzIHRoZSB1c2VyIHNlbmRzIGFuZCB0cmFja3MgdGhlIHJlc3BvbnNlcy4gIFRoZSByZXNwb25zZXMKKyAqIHdpbGwgZ28gYmFjayB0byB0aGUgYXBwbGljYXRpb24gdGhhdCBzZW5kIHRoZSBjb21tYW5kLiAgSWYgdGhlCisgKiByZXNwb25zZSBkb2Vzbid0IGNvbWUgYmFjayBpbiB0aW1lLCB0aGUgZHJpdmVyIHdpbGwgcmV0dXJuIGEKKyAqIHRpbWVvdXQgZXJyb3IgcmVzcG9uc2UgdG8gdGhlIGFwcGxpY2F0aW9uLiAgQXN5bmNocm9ub3VzIGV2ZW50cworICogZnJvbSB0aGUgQk1DIGV2ZW50IHF1ZXVlIHdpbGwgZ28gdG8gYWxsIHVzZXJzIGJvdW5kIHRvIHRoZSBkcml2ZXIuCisgKiBUaGUgaW5jb21pbmcgZXZlbnQgcXVldWUgaW4gdGhlIEJNQyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZmx1c2hlZAorICogaWYgaXQgYmVjb21lcyBmdWxsIGFuZCBpdCBpcyBxdWVyaWVkIG9uY2UgYSBzZWNvbmQgdG8gc2VlIGlmCisgKiBhbnl0aGluZyBpcyBpbiBpdC4gIEluY29taW5nIGNvbW1hbmRzIHRvIHRoZSBkcml2ZXIgd2lsbCBnZXQKKyAqIGRlbGl2ZXJlZCBhcyBjb21tYW5kcy4KKyAqCisgKiBUaGlzIGRyaXZlciBwcm92aWRlcyB0d28gbWFpbiBpbnRlcmZhY2VzOiBvbmUgZm9yIGluLWtlcm5lbAorICogYXBwbGljYXRpb25zIGFuZCBhbm90aGVyIGZvciB1c2VybGFuZCBhcHBsaWNhdGlvbnMuICBUaGUKKyAqIGNhcGFiaWxpdGllcyBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGZvciBib3RoIGludGVyZmFjZSwgYWx0aG91Z2gKKyAqIHRoZSBpbnRlcmZhY2VzIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQuICBUaGUgc3R1ZmYgaW4gdGhlCisgKiAjaWZkZWYgS0VSTkVMIGJlbG93IGlzIHRoZSBpbi1rZXJuZWwgaW50ZXJmYWNlLiAgVGhlIHVzZXJsYW5kCisgKiBpbnRlcmZhY2UgaXMgZGVmaW5lZCBsYXRlciBpbiB0aGUgZmlsZS4gICovCisKKworCisvKgorICogVGhpcyBpcyBhbiBvdmVybGF5IGZvciBhbGwgdGhlIGFkZHJlc3MgdHlwZXMsIHNvIGl0J3MgZWFzeSB0bworICogZGV0ZXJtaW5lIHRoZSBhY3R1YWwgYWRkcmVzcyB0eXBlLiAgVGhpcyBpcyBraW5kIG9mIGxpa2UgYWRkcmVzc2VzCisgKiB3b3JrIGZvciBzb2NrZXRzLgorICovCisjZGVmaW5lIElQTUlfTUFYX0FERFJfU0laRSAzMgorc3RydWN0IGlwbWlfYWRkcgoreworCSAvKiBUcnkgdG8gdGFrZSB0aGVzZSBmcm9tIHRoZSAiQ2hhbm5lbCBNZWRpdW0gVHlwZSIgdGFibGUKKwkgICAgaW4gc2VjdGlvbiA2LjUgb2YgdGhlIElQTUkgMS41IG1hbnVhbC4gKi8KKwlpbnQgICBhZGRyX3R5cGU7CisJc2hvcnQgY2hhbm5lbDsKKwljaGFyICBkYXRhW0lQTUlfTUFYX0FERFJfU0laRV07Cit9OworCisvKgorICogV2hlbiB0aGUgYWRkcmVzcyBpcyBub3QgdXNlZCwgdGhlIHR5cGUgd2lsbCBiZSBzZXQgdG8gdGhpcyB2YWx1ZS4KKyAqIFRoZSBjaGFubmVsIGlzIHRoZSBCTUMncyBjaGFubmVsIG51bWJlciBmb3IgdGhlIGNoYW5uZWwgKHVzdWFsbHkKKyAqIDApLCBvciBJUE1DX0JNQ19DSEFOTkVMIGlmIGNvbW11bmljYXRpbmcgZGlyZWN0bHkgd2l0aCB0aGUgQk1DLgorICovCisjZGVmaW5lIElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEUJMHgwYworc3RydWN0IGlwbWlfc3lzdGVtX2ludGVyZmFjZV9hZGRyCit7CisJaW50ICAgICAgICAgICBhZGRyX3R5cGU7CisJc2hvcnQgICAgICAgICBjaGFubmVsOworCXVuc2lnbmVkIGNoYXIgbHVuOworfTsKKworLyogQW4gSVBNQiBBZGRyZXNzLiAqLworI2RlZmluZSBJUE1JX0lQTUJfQUREUl9UWVBFCQkweDAxCisvKiBVc2VkIGZvciBicm9hZGNhc3QgZ2V0IGRldmljZSBpZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAxNy45IG9mIHRoZQorICAgSVBNSSAxLjUgbWFudWFsLiAqLyAKKyNkZWZpbmUgSVBNSV9JUE1CX0JST0FEQ0FTVF9BRERSX1RZUEUJMHg0MQorc3RydWN0IGlwbWlfaXBtYl9hZGRyCit7CisJaW50ICAgICAgICAgICBhZGRyX3R5cGU7CisJc2hvcnQgICAgICAgICBjaGFubmVsOworCXVuc2lnbmVkIGNoYXIgc2xhdmVfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIGx1bjsKK307CisKKy8qCisgKiBBIExBTiBBZGRyZXNzLiAgVGhpcyBpcyBhbiBhZGRyZXNzIHRvL2Zyb20gYSBMQU4gaW50ZXJmYWNlIGJyaWRnZWQKKyAqIGJ5IHRoZSBCTUMsIG5vdCBhbiBhZGRyZXNzIGFjdHVhbGx5IG91dCBvbiB0aGUgTEFOLgorICoKKyAqIEEgY29uY2lvdXMgZGVjaXNpb24gd2FzIG1hZGUgaGVyZSB0byBkZXZpYXRlIHNsaWdodGx5IGZyb20gdGhlIElQTUkKKyAqIHNwZWMuICBXZSBkbyBub3QgdXNlIHJxU1dJRCBhbmQgcnNTV0lEIGxpa2UgaXQgc2hvd3MgaW4gdGhlCisgKiBtZXNzYWdlLiAgSW5zdGVhZCwgd2UgdXNlIHJlbW90ZV9TV0lEIGFuZCBsb2NhbF9TV0lELiAgVGhpcyBtZWFucworICogdGhhdCBhbnkgbWVzc2FnZSAoYSByZXF1ZXN0IG9yIHJlc3BvbnNlKSBmcm9tIGFub3RoZXIgZGV2aWNlIHdpbGwKKyAqIGFsd2F5cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgYWRkcmVzcy4gIElmIHlvdSBkaWRuJ3QgZG8gdGhpcywKKyAqIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgc2FtZSBkZXZpY2Ugd291bGQgaGF2ZSBkaWZmZXJlbnQKKyAqIGFkZHJlc3NlcywgYW5kIHRoYXQncyBub3QgdG9vIGNvb2wuCisgKgorICogSW4gdGhpcyBhZGRyZXNzLCB0aGUgcmVtb3RlX1NXSUQgaXMgYWx3YXlzIHRoZSBTV0lEIHRoZSByZW1vdGUKKyAqIG1lc3NhZ2UgY2FtZSBmcm9tLCBvciB0aGUgU1dJRCB3ZSBhcmUgc2VuZGluZyB0aGUgbWVzc2FnZSB0by4KKyAqIGxvY2FsX1NXSUQgaXMgYWx3YXlzIG91ciBTV0lELiAgTm90ZSB0aGF0IGhhdmluZyBvdXIgU1dJRCBpbiB0aGUKKyAqIG1lc3NhZ2UgaXMgYSBsaXR0bGUgd2VpcmQsIGJ1dCB0aGlzIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIElQTUlfTEFOX0FERFJfVFlQRQkJMHgwNAorc3RydWN0IGlwbWlfbGFuX2FkZHIKK3sKKwlpbnQgICAgICAgICAgIGFkZHJfdHlwZTsKKwlzaG9ydCAgICAgICAgIGNoYW5uZWw7CisJdW5zaWduZWQgY2hhciBwcml2aWxlZ2U7CisJdW5zaWduZWQgY2hhciBzZXNzaW9uX2hhbmRsZTsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9TV0lEOworCXVuc2lnbmVkIGNoYXIgbG9jYWxfU1dJRDsKKwl1bnNpZ25lZCBjaGFyIGx1bjsKK307CisKKworLyoKKyAqIENoYW5uZWwgZm9yIHRhbGtpbmcgZGlyZWN0bHkgd2l0aCB0aGUgQk1DLiAgV2hlbiB1c2luZyB0aGlzCisgKiBjaGFubmVsLCBUaGlzIGlzIGZvciB0aGUgc3lzdGVtIGludGVyZmFjZSBhZGRyZXNzIHR5cGUgb25seS4gIEZJWE1FCisgKiAtIGlzIHRoaXMgcmlnaHQsIG9yIHNob3VsZCB3ZSB1c2UgLTE/CisgKi8KKyNkZWZpbmUgSVBNSV9CTUNfQ0hBTk5FTCAgMHhmCisjZGVmaW5lIElQTUlfTlVNX0NIQU5ORUxTIDB4MTAKKworLyoKKyAqIFVzZWQgdG8gc2lnbmlmeSBhbiAiYWxsIGNoYW5uZWwiIGJpdG1hc2suICBUaGlzIGlzIG1vcmUgdGhhbiB0aGUKKyAqIGFjdHVhbCBudW1iZXIgb2YgY2hhbm5lbHMgYmVjYXVzZSB0aGlzIGlzIHVzZWQgaW4gdXNlcmxhbmQgYW5kCisgKiB3aWxsIGNvdmVyIHVzIGlmIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgZXh0ZW5kZWQuCisgKi8KKyNkZWZpbmUgSVBNSV9DSEFOX0FMTCAgICAgKH4wKQorCisKKy8qCisgKiBBIHJhdyBJUE1JIG1lc3NhZ2Ugd2l0aG91dCBhbnkgYWRkcmVzc2luZy4gIFRoaXMgY292ZXJzIGJvdGgKKyAqIGNvbW1hbmRzIGFuZCByZXNwb25zZXMuICBUaGUgY29tcGxldGlvbiBjb2RlIGlzIGFsd2F5cyB0aGUgZmlyc3QKKyAqIGJ5dGUgb2YgZGF0YSBpbiB0aGUgcmVzcG9uc2UgKGFzIHRoZSBzcGVjIHNob3dzIHRoZSBtZXNzYWdlcyBsYWlkCisgKiBvdXQpLgorICovCitzdHJ1Y3QgaXBtaV9tc2cKK3sKKwl1bnNpZ25lZCBjaGFyICBuZXRmbjsKKwl1bnNpZ25lZCBjaGFyICBjbWQ7CisJdW5zaWduZWQgc2hvcnQgZGF0YV9sZW47CisJdW5zaWduZWQgY2hhciAgKmRhdGE7Cit9OworCitzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnCit7CisJdW5zaWduZWQgY2hhciAgbmV0Zm47CisJdW5zaWduZWQgY2hhciAgY21kOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgICpkYXRhOworfTsKKworLyoKKyAqIFZhcmlvdXMgZGVmaW5lcyB0aGF0IGFyZSB1c2VmdWwgZm9yIElQTUkgYXBwbGljYXRpb25zLgorICovCisjZGVmaW5lIElQTUlfSU5WQUxJRF9DTURfQ09NUExFVElPTl9DT0RFCTB4QzEKKyNkZWZpbmUgSVBNSV9USU1FT1VUX0NPTVBMRVRJT05fQ09ERQkJMHhDMworI2RlZmluZSBJUE1JX1VOS05PV05fRVJSX0NPTVBMRVRJT05fQ09ERQkweGZmCisKKworLyoKKyAqIFJlY2VpdmUgdHlwZXMgZm9yIG1lc3NhZ2VzIGNvbWluZyBmcm9tIHRoZSByZWNlaXZlIGludGVyZmFjZS4gIFRoaXMKKyAqIGlzIHVzZWQgZm9yIHRoZSByZWNlaXZlIGluLWtlcm5lbCBpbnRlcmZhY2UgYW5kIGluIHRoZSByZWNlaXZlCisgKiBJT0NUTC4KKyAqCisgKiBUaGUgIklQTUlfUkVTUE9OU0VfUkVTUE5PU0VfVFlQRSIgaXMgYSBsaXR0bGUgc3RyYW5nZSBzb3VuZGluZywgYnV0CisgKiBpdCBhbGxvd3MgeW91IHRvIGdldCB0aGUgbWVzc2FnZSByZXN1bHRzIHdoZW4geW91IHNlbmQgYSByZXNwb25zZQorICogbWVzc2FnZS4KKyAqLworI2RlZmluZSBJUE1JX1JFU1BPTlNFX1JFQ1ZfVFlQRQkJMSAvKiBBIHJlc3BvbnNlIHRvIGEgY29tbWFuZCAqLworI2RlZmluZSBJUE1JX0FTWU5DX0VWRU5UX1JFQ1ZfVFlQRQkyIC8qIFNvbWV0aGluZyBmcm9tIHRoZSBldmVudCBxdWV1ZSAqLworI2RlZmluZSBJUE1JX0NNRF9SRUNWX1RZUEUJCTMgLyogQSBjb21tYW5kIGZyb20gc29tZXdoZXJlIGVsc2UgKi8KKyNkZWZpbmUgSVBNSV9SRVNQT05TRV9SRVNQT05TRV9UWVBFCTQgLyogVGhlIHJlc3BvbnNlIGZvcgorCQkJCQkgICAgICBhIHNlbnQgcmVzcG9uc2UsIGdpdmluZyBhbnkKKwkJCQkJICAgICAgZXJyb3Igc3RhdHVzIGZvciBzZW5kaW5nIHRoZQorCQkJCQkgICAgICByZXNwb25zZS4gIFdoZW4geW91IHNlbmQgYQorCQkJCQkgICAgICByZXNwb25zZSBtZXNzYWdlLCB0aGlzIHdpbGwKKwkJCQkJICAgICAgYmUgcmV0dXJuZWQuICovCisvKiBOb3RlIHRoYXQgYXN5bmMgZXZlbnRzIGFuZCByZWNlaXZlZCBjb21tYW5kcyBkbyBub3QgaGF2ZSBhIGNvbXBsZXRpb24KKyAgIGNvZGUgYXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGluY29taW5nIGRhdGEsIHVubGlrZSBhIHJlc3BvbnNlLiAqLworCisKKy8qCisgKiBNb2RlcyBmb3IgaXBtaV9zZXRfbWFpbnRfbW9kZSgpIGFuZCB0aGUgdXNlcmxhbmQgSU9DVEwuICBUaGUgQVVUTworICogc2V0dGluZyBpcyB0aGUgZGVmYXVsdCBhbmQgbWVhbnMgaXQgd2lsbCBiZSBzZXQgb24gY2VydGFpbgorICogY29tbWFuZHMuICBIYXJkIHNldHRpbmcgaXQgb24gYW5kIG9mZiB3aWxsIG92ZXJyaWRlIGF1dG9tYXRpYworICogb3BlcmF0aW9uLgorICovCisjZGVmaW5lIElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9BVVRPCTAKKyNkZWZpbmUgSVBNSV9NQUlOVEVOQU5DRV9NT0RFX09GRgkxCisjZGVmaW5lIElQTUlfTUFJTlRFTkFOQ0VfTU9ERV9PTgkyCisKKworCisvKgorICogVGhlIHVzZXJsYW5kIGludGVyZmFjZQorICovCisKKy8qCisgKiBUaGUgdXNlcmxhbmQgaW50ZXJmYWNlIGZvciB0aGUgSVBNSSBkcml2ZXIgaXMgYSBzdGFuZGFyZCBjaGFyYWN0ZXIKKyAqIGRldmljZSwgd2l0aCBlYWNoIGluc3RhbmNlIG9mIGFuIGludGVyZmFjZSByZWdpc3RlcmVkIGFzIGEgbWlub3IKKyAqIG51bWJlciB1bmRlciB0aGUgbWFqb3IgY2hhcmFjdGVyIGRldmljZS4KKyAqCisgKiBUaGUgcmVhZCBhbmQgd3JpdGUgY2FsbHMgZG8gbm90IHdvcmssIHRvIGdldCBtZXNzYWdlcyBpbiBhbmQgb3V0CisgKiByZXF1aXJlcyBpb2N0bCBjYWxscyBiZWNhdXNlIG9mIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkYXRhLiAgc2VsZWN0CisgKiBhbmQgcG9sbCBkbyB3b3JrLCBzbyB5b3UgY2FuIHdhaXQgZm9yIGlucHV0IHVzaW5nIHRoZSBmaWxlCisgKiBkZXNjcmlwdG9yLCB5b3UganVzdCBjYW4gdXNlIHJlYWQgdG8gZ2V0IGl0LgorICoKKyAqIEluIGdlbmVyYWwsIHlvdSBzZW5kIGEgY29tbWFuZCBkb3duIHRvIHRoZSBpbnRlcmZhY2UgYW5kIHJlY2VpdmUKKyAqIHJlc3BvbnNlcyBiYWNrLiAgWW91IGNhbiB1c2UgdGhlIG1zZ2lkIHZhbHVlIHRvIGNvcnJlbGF0ZSBjb21tYW5kcworICogYW5kIHJlc3BvbnNlcywgdGhlIGRyaXZlciB3aWxsIHRha2UgY2FyZSBvZiBmaWd1cmluZyBvdXQgd2hpY2gKKyAqIGluY29taW5nIG1lc3NhZ2VzIGFyZSBmb3Igd2hpY2ggY29tbWFuZCBhbmQgZmluZCB0aGUgcHJvcGVyIG1zZ2lkCisgKiB2YWx1ZSB0byByZXBvcnQuICBZb3Ugd2lsbCBvbmx5IHJlY2VpdmUgcmVwb25zZXMgZm9yIGNvbW1hbmRzIHlvdQorICogc2VuZC4gIEFzeW5jaHJvbm91cyBldmVudHMsIGhvd2V2ZXIsIGdvIHRvIGFsbCBvcGVuIHVzZXJzLCBzbyB5b3UKKyAqIG11c3QgYmUgcmVhZHkgdG8gaGFuZGxlIHRoZXNlIChvciBpZ25vcmUgdGhlbSBpZiB5b3UgZG9uJ3QgY2FyZSkuCisgKgorICogVGhlIGFkZHJlc3MgdHlwZSBkZXBlbmRzIHVwb24gdGhlIGNoYW5uZWwgdHlwZS4gIFdoZW4gdGFsa2luZworICogZGlyZWN0bHkgdG8gdGhlIEJNQyAoSVBNQ19CTUNfQ0hBTk5FTCksIHRoZSBhZGRyZXNzIGlzIGlnbm9yZWQKKyAqIChJUE1JX1VOVVNFRF9BRERSX1RZUEUpLiAgV2hlbiB0YWxraW5nIHRvIGFuIElQTUIgY2hhbm5lbCwgeW91IG11c3QKKyAqIHN1cHBseSBhIHZhbGlkIElQTUIgYWRkcmVzcyB3aXRoIHRoZSBhZGRyX3R5cGUgc2V0IHByb3Blcmx5LgorICoKKyAqIFdoZW4gdGFsa2luZyB0byBub3JtYWwgY2hhbm5lbHMsIHRoZSBkcml2ZXIgdGFrZXMgY2FyZSBvZiB0aGUKKyAqIGRldGFpbHMgb2YgZm9ybWF0dGluZyBhbmQgc2VuZGluZyBtZXNzYWdlcyBvbiB0aGF0IGNoYW5uZWwuICBZb3UgZG8KKyAqIG5vdCwgZm9yIGluc3RhbmNlLCBoYXZlIHRvIGZvcm1hdCBhIHNlbmQgY29tbWFuZCwgeW91IGp1c3Qgc2VuZAorICogd2hhdGV2ZXIgY29tbWFuZCB5b3Ugd2FudCB0byB0aGUgY2hhbm5lbCwgdGhlIGRyaXZlciB3aWxsIGNyZWF0ZQorICogdGhlIHNlbmQgY29tbWFuZCwgYXV0b21hdGljYWxseSBpc3N1ZSByZWNlaXZlIGNvbW1hbmQgYW5kIGdldCBldmVuCisgKiBjb21tYW5kcywgYW5kIHBhc3MgdGhvc2UgdXAgdG8gdGhlIHByb3BlciB1c2VyLgorICovCisKKworLyogVGhlIG1hZ2ljIElPQ1RMIHZhbHVlIGZvciB0aGlzIGludGVyZmFjZS4gKi8KKyNkZWZpbmUgSVBNSV9JT0NfTUFHSUMgJ2knCisKKworLyogTWVzc2FnZXMgc2VudCB0byB0aGUgaW50ZXJmYWNlIGFyZSB0aGlzIGZvcm1hdC4gKi8KK3N0cnVjdCBpcG1pX3JlcQoreworCXVuc2lnbmVkIGNoYXIgKmFkZHI7IC8qIEFkZHJlc3MgdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gKi8KKwl1bnNpZ25lZCBpbnQgIGFkZHJfbGVuOworCisJbG9uZyAgICBtc2dpZDsgLyogVGhlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzCisJCQkgIGV4YWN0IHZhbHVlIHdpbGwgYmUgcmVwb3J0ZWQgYmFjayBpbiB0aGUKKwkJCSAgcmVzcG9uc2UgdG8gdGhpcyByZXF1ZXN0IGlmIGl0IGlzIGEgY29tbWFuZC4KKwkJCSAgSWYgaXQgaXMgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlIHVzZWQgYXMKKwkJCSAgdGhlIHNlcXVlbmNlIHZhbHVlIGZvciB0aGUgcmVzcG9uc2UuICAqLworCisJc3RydWN0IGlwbWlfbXNnIG1zZzsKK307CisvKgorICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGludGVyZmFjZXMuICBlcnJvciB2YWx1ZXMgYXJlOgorICogICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgIC0gRUlOVkFMIC0gVGhlIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIG5vdCB2YWxpZCwgb3IgdGhlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICB3YXMgbm90IGFsbG93ZWQuCisgKiAgIC0gRU1TR1NJWkUgLSBUaGUgbWVzc2FnZSB0byB3YXMgdG9vIGxhcmdlLgorICogICAtIEVOT01FTSAtIEJ1ZmZlcnMgY291bGQgbm90IGJlIGFsbG9jYXRlZCBmb3IgdGhlIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9TRU5EX0NPTU1BTkQJCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDEzLAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfcmVxKQorCisvKiBNZXNzYWdlcyBzZW50IHRvIHRoZSBpbnRlcmZhY2Ugd2l0aCB0aW1pbmcgcGFyYW1ldGVycyBhcmUgdGhpcworICAgZm9ybWF0LiAqLworc3RydWN0IGlwbWlfcmVxX3NldHRpbWUKK3sKKwlzdHJ1Y3QgaXBtaV9yZXEgcmVxOworCisJLyogU2VlIGlwbWlfcmVxdWVzdF9zZXR0aW1lKCkgYWJvdmUgZm9yIGRldGFpbHMgb24gdGhlc2UKKyAgICAgICAgICAgdmFsdWVzLiAqLworCWludCAgICAgICAgICByZXRyaWVzOworCXVuc2lnbmVkIGludCByZXRyeV90aW1lX21zOworfTsKKy8qCisgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgaW50ZXJmYWNlcyB3aXRoIHRpbWluZyBwYXJhbWV0ZXJzLiAgZXJyb3IgdmFsdWVzCisgKiBhcmU6CisgKiAgIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAgLSBFSU5WQUwgLSBUaGUgYWRkcmVzcyBzdXBwbGllZCB3YXMgbm90IHZhbGlkLCBvciB0aGUgY29tbWFuZAorICogICAgICAgICAgICAgIHdhcyBub3QgYWxsb3dlZC4KKyAqICAgLSBFTVNHU0laRSAtIFRoZSBtZXNzYWdlIHRvIHdhcyB0b28gbGFyZ2UuCisgKiAgIC0gRU5PTUVNIC0gQnVmZmVycyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkIGZvciB0aGUgY29tbWFuZC4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1NFTkRfQ09NTUFORF9TRVRUSU1FCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDIxLAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfcmVxX3NldHRpbWUpCisKKy8qIE1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIGludGVyZmFjZSBhcmUgdGhpcyBmb3JtYXQuICovCitzdHJ1Y3QgaXBtaV9yZWN2Cit7CisJaW50ICAgICByZWN2X3R5cGU7IC8qIElzIHRoaXMgYSBjb21tYW5kLCByZXNwb25zZSBvciBhbgorCQkJICAgICAgYXN5bmNyb25vdXMgZXZlbnQuICovCisKKwl1bnNpZ25lZCBjaGFyICphZGRyOyAgICAvKiBBZGRyZXNzIHRoZSBtZXNzYWdlIHdhcyBmcm9tIGlzIHB1dAorCQkJCSAgIGhlcmUuICBUaGUgY2FsbGVyIG11c3Qgc3VwcGx5IHRoZQorCQkJCSAgIG1lbW9yeS4gKi8KKwl1bnNpZ25lZCBpbnQgIGFkZHJfbGVuOyAvKiBUaGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyBidWZmZXIuCisJCQkJICAgVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgZnVsbCBidWZmZXIKKwkJCQkgICBsZW5ndGgsIHRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0bworCQkJCSAgIHRoZSBhY3R1YWwgbWVzc2FnZSBsZW5ndGggd2hlbiB0aGUKKwkJCQkgICBtZXNzYWdlIGlzIHJlY2VpdmVkLiAqLworCisJbG9uZyAgICBtc2dpZDsgLyogVGhlIHNlcXVlbmNlIG51bWJlciBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QKKwkJCSAgaWYgdGhpcyBpcyBhIHJlc3BvbnNlLiAgSWYgdGhpcyBpcyBhIGNvbW1hbmQsCisJCQkgIHRoaXMgd2lsbCBiZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gdGhlCisJCQkgIGNvbW1hbmQuICovCisKKwlzdHJ1Y3QgaXBtaV9tc2cgbXNnOyAvKiBUaGUgZGF0YSBmaWVsZCBtdXN0IHBvaW50IHRvIGEgYnVmZmVyLgorCQkJCVRoZSBkYXRhX3NpemUgZmllbGQgbXVzdCBiZSBzZXQgdG8gdGhlCisJCQkJc2l6ZSBvZiB0aGUgbWVzc2FnZSBidWZmZXIuICBUaGUKKwkJCQljYWxsZXIgc3VwcGxpZXMgdGhlIGZ1bGwgYnVmZmVyCisJCQkJbGVuZ3RoLCB0aGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gdGhlCisJCQkJYWN0dWFsIG1lc3NhZ2UgbGVuZ3RoIHdoZW4gdGhlIG1lc3NhZ2UKKwkJCQlpcyByZWNlaXZlZC4gKi8KK307CisKKy8qCisgKiBSZWNlaXZlIGEgbWVzc2FnZS4gIGVycm9yIHZhbHVlczoKKyAqICAtIEVBR0FJTiAtIG5vIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZS4KKyAqICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgLSBFSU5WQUwgLSBUaGUgYWRkcmVzcyBzdXBwbGllZCB3YXMgbm90IHZhbGlkLgorICogIC0gRU1TR1NJWkUgLSBUaGUgbWVzc2FnZSB0byB3YXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHRoZSBtZXNzYWdlIGJ1ZmZlciwKKyAqICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBsZWZ0IGluIHRoZSBidWZmZXIuICovCisjZGVmaW5lIElQTUlDVExfUkVDRUlWRV9NU0cJCV9JT1dSKElQTUlfSU9DX01BR0lDLCAxMiwJXAorCQkJCQkgICAgICBzdHJ1Y3QgaXBtaV9yZWN2KQorCisvKgorICogTGlrZSBSRUNFSVZFX01TRywgYnV0IGlmIHRoZSBtZXNzYWdlIHdvbid0IGZpdCBpbiB0aGUgYnVmZmVyLCBpdAorICogd2lsbCB0cnVuY2F0ZSB0aGUgY29udGVudHMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSBkYXRhIGluIHRoZQorICogYnVmZmVyLgorICovCisjZGVmaW5lIElQTUlDVExfUkVDRUlWRV9NU0dfVFJVTkMJX0lPV1IoSVBNSV9JT0NfTUFHSUMsIDExLAlcCisJCQkJCSAgICAgIHN0cnVjdCBpcG1pX3JlY3YpCisKKy8qIFJlZ2lzdGVyIHRvIGdldCBjb21tYW5kcyBmcm9tIG90aGVyIGVudGl0aWVzIG9uIHRoaXMgaW50ZXJmYWNlLiAqLworc3RydWN0IGlwbWlfY21kc3BlYworeworCXVuc2lnbmVkIGNoYXIgbmV0Zm47CisJdW5zaWduZWQgY2hhciBjbWQ7Cit9OworCisvKiAKKyAqIFJlZ2lzdGVyIHRvIHJlY2VpdmUgYSBzcGVjaWZpYyBjb21tYW5kLiAgZXJyb3IgdmFsdWVzOgorICogICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKiAgIC0gRUJVU1kgLSBUaGUgbmV0Zm4vY21kIHN1cHBsaWVkIHdhcyBhbHJlYWR5IGluIHVzZS4KKyAqICAgLSBFTk9NRU0gLSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZW50cnkuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9SRUdJU1RFUl9GT1JfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE0LAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfY21kc3BlYykKKy8qCisgKiBVbnJlZ2lzdGVyIGEgcmVnc2l0ZXJlZCBjb21tYW5kLiAgZXJyb3IgdmFsdWVzOgorICogIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAtIEVOT0VOVCAtIFRoZSBuZXRmbi9jbWQgd2FzIG5vdCBmb3VuZCByZWdpc3RlcmVkIGZvciB0aGlzIHVzZXIuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9VTlJFR0lTVEVSX0ZPUl9DTUQJX0lPUihJUE1JX0lPQ19NQUdJQywgMTUsCVwKKwkJCQkJICAgICBzdHJ1Y3QgaXBtaV9jbWRzcGVjKQorCisvKgorICogUmVnaXN0ZXIgdG8gZ2V0IGNvbW1hbmRzIGZyb20gb3RoZXIgZW50aXRpZXMgb24gc3BlY2lmaWMgY2hhbm5lbHMuCisgKiBUaGlzIHdheSwgeW91IGNhbiBvbmx5IGxpc3RlbiBvbiBzcGVjaWZpYyBjaGFubmVscywgb3IgaGF2ZSBtZXNzYWdlcworICogZnJvbSBzb21lIGNoYW5uZWxzIGdvIHRvIG9uZSBwbGFjZSBhbmQgb3RoZXIgY2hhbm5lbHMgdG8gc29tZXBsYWNlCisgKiBlbHNlLiAgVGhlIGNoYW5zIGZpZWxkIGlzIGEgYml0bWFzaywgKDEgPDwgY2hhbm5lbCkgZm9yIGVhY2ggY2hhbm5lbC4KKyAqIEl0IG1heSBiZSBJUE1JX0NIQU5fQUxMIGZvciBhbGwgY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBpcG1pX2NtZHNwZWNfY2hhbnMKK3sKKwl1bnNpZ25lZCBpbnQgbmV0Zm47CisJdW5zaWduZWQgaW50IGNtZDsKKwl1bnNpZ25lZCBpbnQgY2hhbnM7Cit9OworCisvKgorICogUmVnaXN0ZXIgdG8gcmVjZWl2ZSBhIHNwZWNpZmljIGNvbW1hbmQgb24gc3BlY2lmaWMgY2hhbm5lbHMuICBlcnJvciB2YWx1ZXM6CisgKiAgIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAgLSBFQlVTWSAtIE9uZSBvZiB0aGUgbmV0Zm4vY21kL2NoYW5zIHN1cHBsaWVkIHdhcyBhbHJlYWR5IGluIHVzZS4KKyAqICAgLSBFTk9NRU0gLSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZW50cnkuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9SRUdJU1RFUl9GT1JfQ01EX0NIQU5TCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDI4LAlcCisJCQkJCSAgICAgc3RydWN0IGlwbWlfY21kc3BlY19jaGFucykKKy8qCisgKiBVbnJlZ2lzdGVyIHNvbWUgbmV0Zm4vY21kL2NoYW5zLiAgZXJyb3IgdmFsdWVzOgorICogIC0gRUZBVUxUIC0gYW4gYWRkcmVzcyBzdXBwbGllZCB3YXMgaW52YWxpZC4KKyAqICAtIEVOT0VOVCAtIE5vbmUgb2YgdGhlIG5ldGZuL2NtZC9jaGFucyB3ZXJlIGZvdW5kIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdXNlci4KKyAqLworI2RlZmluZSBJUE1JQ1RMX1VOUkVHSVNURVJfRk9SX0NNRF9DSEFOUyBfSU9SKElQTUlfSU9DX01BR0lDLCAyOSwJXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX2NtZHNwZWNfY2hhbnMpCisKKy8qIAorICogU2V0IHdoZXRoZXIgdGhpcyBpbnRlcmZhY2UgcmVjZWl2ZXMgZXZlbnRzLiAgTm90ZSB0aGF0IHRoZSBmaXJzdAorICogdXNlciByZWdpc3RlcmVkIGZvciBldmVudHMgd2lsbCBnZXQgYWxsIHBlbmRpbmcgZXZlbnRzIGZvciB0aGUKKyAqIGludGVyZmFjZS4gIGVycm9yIHZhbHVlczoKKyAqICAtIEVGQVVMVCAtIGFuIGFkZHJlc3Mgc3VwcGxpZWQgd2FzIGludmFsaWQuCisgKi8KKyNkZWZpbmUgSVBNSUNUTF9TRVRfR0VUU19FVkVOVFNfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE2LCBpbnQpCisKKy8qCisgKiBTZXQgYW5kIGdldCB0aGUgc2xhdmUgYWRkcmVzcyBhbmQgTFVOIHRoYXQgd2Ugd2lsbCB1c2UgZm9yIG91cgorICogc291cmNlIG1lc3NhZ2VzLiAgTm90ZSB0aGF0IHRoaXMgYWZmZWN0cyB0aGUgaW50ZXJmYWNlLCBub3QganVzdAorICogdGhpcyB1c2VyLCBzbyBpdCB3aWxsIGFmZmVjdCBhbGwgdXNlcnMgb2YgdGhpcyBpbnRlcmZhY2UuICBUaGlzIGlzCisgKiBzbyBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgY2FuIGNvbWUgaW4gYW5kIGRvIHRoZSBPRU0tc3BlY2lmaWMKKyAqIHRoaW5ncyBpdCB0YWtlcyB0byBkZXRlcm1pbmUgeW91ciBhZGRyZXNzIChpZiBub3QgdGhlIEJNQykgYW5kIHNldAorICogaXQgZm9yIGV2ZXJ5b25lIGVsc2UuICBZb3Ugc2hvdWxkIHByb2JhYmx5IGxlYXZlIHRoZSBMVU4gYWxvbmUuCisgKi8KK3N0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0Cit7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyICB2YWx1ZTsKK307CisjZGVmaW5lIElQTUlDVExfU0VUX01ZX0NIQU5ORUxfQUREUkVTU19DTUQgX0lPUihJUE1JX0lPQ19NQUdJQywgMjQsIHN0cnVjdCBpcG1pX2NoYW5uZWxfbHVuX2FkZHJlc3Nfc2V0KQorI2RlZmluZSBJUE1JQ1RMX0dFVF9NWV9DSEFOTkVMX0FERFJFU1NfQ01EIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI1LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9TRVRfTVlfQ0hBTk5FTF9MVU5fQ01ECSAgIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI2LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKyNkZWZpbmUgSVBNSUNUTF9HRVRfTVlfQ0hBTk5FTF9MVU5fQ01ECSAgIF9JT1IoSVBNSV9JT0NfTUFHSUMsIDI3LCBzdHJ1Y3QgaXBtaV9jaGFubmVsX2x1bl9hZGRyZXNzX3NldCkKKy8qIExlZ2FjeSBpbnRlcmZhY2VzLCB0aGVzZSBvbmx5IHNldCBJUE1CIDAuICovCisjZGVmaW5lIElQTUlDVExfU0VUX01ZX0FERFJFU1NfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE3LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIElQTUlDVExfR0VUX01ZX0FERFJFU1NfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE4LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIElQTUlDVExfU0VUX01ZX0xVTl9DTUQJCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDE5LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIElQTUlDVExfR0VUX01ZX0xVTl9DTUQJCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDIwLCB1bnNpZ25lZCBpbnQpCisKKy8qCisgKiBHZXQvc2V0IHRoZSBkZWZhdWx0IHRpbWluZyB2YWx1ZXMgZm9yIGFuIGludGVyZmFjZS4gIFlvdSBzaG91bGRuJ3QKKyAqIGdlbmVyYWxseSBtZXNzIHdpdGggdGhlc2UuCisgKi8KK3N0cnVjdCBpcG1pX3RpbWluZ19wYXJtcworeworCWludCAgICAgICAgICByZXRyaWVzOworCXVuc2lnbmVkIGludCByZXRyeV90aW1lX21zOworfTsKKyNkZWZpbmUgSVBNSUNUTF9TRVRfVElNSU5HX1BBUk1TX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAyMiwgXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcykKKyNkZWZpbmUgSVBNSUNUTF9HRVRfVElNSU5HX1BBUk1TX0NNRAlfSU9SKElQTUlfSU9DX01BR0lDLCAyMywgXAorCQkJCQkgICAgIHN0cnVjdCBpcG1pX3RpbWluZ19wYXJtcykKKworLyoKKyAqIFNldCB0aGUgbWFpbnRlbmFuY2UgbW9kZS4gIFNlZSBpcG1pX3NldF9tYWludGVuYW5jZV9tb2RlKCkgYWJvdmUKKyAqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhpcyBkb2VzLgorICovCisjZGVmaW5lIElQTUlDVExfR0VUX01BSU5URU5BTkNFX01PREVfQ01ECV9JT1IoSVBNSV9JT0NfTUFHSUMsIDMwLCBpbnQpCisjZGVmaW5lIElQTUlDVExfU0VUX01BSU5URU5BTkNFX01PREVfQ01ECV9JT1coSVBNSV9JT0NfTUFHSUMsIDMxLCBpbnQpCisKKyNlbmRpZiAvKiBfX0xJTlVYX0lQTUlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcG1pX21zZ2RlZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2YTE1OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBtaV9tc2dkZWZzLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBpcG1pX3NtaS5oCisgKgorICogTW9udGFWaXN0YSBJUE1JIHN5c3RlbSBtYW5hZ2VtZW50IGludGVyZmFjZQorICoKKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICBDb3JleSBNaW55YXJkIDxtaW55YXJkQG12aXN0YS5jb20+CisgKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogQ29weXJpZ2h0IDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgKiAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0lQTUlfTVNHREVGU19ICisjZGVmaW5lIF9fTElOVVhfSVBNSV9NU0dERUZTX0gKKworLyogVmFyaW91cyBkZWZpbml0aW9ucyBmb3IgSVBNSSBtZXNzYWdlcyB1c2VkIGJ5IGFsbW9zdCBldmVyeXRoaW5nIGluCisgICB0aGUgSVBNSSBzdGFjay4gKi8KKworLyogTmV0Rk5zIGFuZCBjb21tYW5kcyB1c2VkIGluc2lkZSB0aGUgSVBNSSBzdGFjay4gKi8KKworI2RlZmluZSBJUE1JX05FVEZOX1NFTlNPUl9FVkVOVF9SRVFVRVNUCQkweDA0CisjZGVmaW5lIElQTUlfTkVURk5fU0VOU09SX0VWRU5UX1JFU1BPTlNFCTB4MDUKKyNkZWZpbmUgSVBNSV9HRVRfRVZFTlRfUkVDRUlWRVJfQ01ECTB4MDEKKworI2RlZmluZSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUCQkJMHgwNgorI2RlZmluZSBJUE1JX05FVEZOX0FQUF9SRVNQT05TRQkJCTB4MDcKKyNkZWZpbmUgSVBNSV9HRVRfREVWSUNFX0lEX0NNRAkJMHgwMQorI2RlZmluZSBJUE1JX0NPTERfUkVTRVRfQ01ECQkweDAyCisjZGVmaW5lIElQTUlfV0FSTV9SRVNFVF9DTUQJCTB4MDMKKyNkZWZpbmUgSVBNSV9DTEVBUl9NU0dfRkxBR1NfQ01ECTB4MzAKKyNkZWZpbmUgSVBNSV9HRVRfREVWSUNFX0dVSURfQ01ECTB4MDgKKyNkZWZpbmUgSVBNSV9HRVRfTVNHX0ZMQUdTX0NNRAkJMHgzMQorI2RlZmluZSBJUE1JX1NFTkRfTVNHX0NNRAkJMHgzNAorI2RlZmluZSBJUE1JX0dFVF9NU0dfQ01ECQkweDMzCisjZGVmaW5lIElQTUlfU0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQJMHgyZQorI2RlZmluZSBJUE1JX0dFVF9CTUNfR0xPQkFMX0VOQUJMRVNfQ01ECTB4MmYKKyNkZWZpbmUgSVBNSV9SRUFEX0VWRU5UX01TR19CVUZGRVJfQ01ECTB4MzUKKyNkZWZpbmUgSVBNSV9HRVRfQ0hBTk5FTF9JTkZPX0NNRAkweDQyCisKKyNkZWZpbmUgSVBNSV9ORVRGTl9TVE9SQUdFX1JFUVVFU1QJCTB4MGEKKyNkZWZpbmUgSVBNSV9ORVRGTl9TVE9SQUdFX1JFU1BPTlNFCQkweDBiCisjZGVmaW5lIElQTUlfQUREX1NFTF9FTlRSWV9DTUQJCTB4NDQKKworI2RlZmluZSBJUE1JX05FVEZOX0ZJUk1XQVJFX1JFUVVFU1QJCTB4MDgKKyNkZWZpbmUgSVBNSV9ORVRGTl9GSVJNV0FSRV9SRVNQT05TRQkJMHgwOQorCisvKiBUaGUgZGVmYXVsdCBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIElQTUlfQk1DX1NMQVZFX0FERFIJMHgyMAorCisvKiBUaGUgQlQgaW50ZXJmYWNlIG9uIGhpZ2gtZW5kIEhQIHN5c3RlbXMgc3VwcG9ydHMgdXAgdG8gMjU1IGJ5dGVzIGluCisgKiBvbmUgdHJhbnNmZXIuICBJdHMgInZpcnR1YWwiIEJNQyBzdXBwb3J0cyBzb21lIGNvbW1hbmRzIHRoYXQgYXJlIGxvbmdlcgorICogdGhhbiAxMjggYnl0ZXMuICBVc2UgdGhlIGZ1bGwgMjU2LCBwbHVzIE5ldEZuL0xVTiwgQ21kLCBjQ29kZSwgcGx1cworICogc29tZSBvdmVyaGVhZDsgaXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBkeW5hbWljYWxseSBzaXplIHRoaXMgYmFzZWQKKyAqIG9uIHRoZSByZXN1bHRzIG9mIHRoZSAiR2V0IEJUIENhcGFiaWxpdGllcyIgY29tbWFuZC4gKi8KKyNkZWZpbmUgSVBNSV9NQVhfTVNHX0xFTkdUSAkyNzIJLyogbXVsdGlwbGUgb2YgMTYgKi8KKworI2RlZmluZSBJUE1JX0NDX05PX0VSUk9SCQkweDAwCisjZGVmaW5lIElQTUlfTk9ERV9CVVNZX0VSUgkJMHhjMAorI2RlZmluZSBJUE1JX0lOVkFMSURfQ09NTUFORF9FUlIJMHhjMQorI2RlZmluZSBJUE1JX1RJTUVPVVRfRVJSCQkweGMzCisjZGVmaW5lIElQTUlfRVJSX01TR19UUlVOQ0FURUQJCTB4YzYKKyNkZWZpbmUgSVBNSV9SRVFfTEVOX0lOVkFMSURfRVJSCTB4YzcKKyNkZWZpbmUgSVBNSV9SRVFfTEVOX0VYQ0VFREVEX0VSUgkweGM4CisjZGVmaW5lIElQTUlfTk9UX0lOX01ZX1NUQVRFX0VSUgkweGQ1CS8qIElQTUkgMi4wICovCisjZGVmaW5lIElQTUlfTE9TVF9BUkJJVFJBVElPTl9FUlIJMHg4MQorI2RlZmluZSBJUE1JX0JVU19FUlIJCQkweDgyCisjZGVmaW5lIElQTUlfTkFLX09OX1dSSVRFX0VSUgkJMHg4MworI2RlZmluZSBJUE1JX0VSUl9VTlNQRUNJRklFRAkJMHhmZgorCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9JUE1CCTEKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX0lDTUIJMgorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfU01CVVMJNAorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfS0NTCTUKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX1NNSUMJNgorI2RlZmluZSBJUE1JX0NIQU5ORUxfUFJPVE9DT0xfQlQxMAk3CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9QUk9UT0NPTF9CVDE1CTgKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX1BST1RPQ09MX1RNT0RFCTkKKworI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX0lQTUIJMQorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX0lDTUIxMAkyCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fSUNNQjA5CTMKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV84MDIzTEFOCTQKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9BU1lOQwk1CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fT1RIRVJfTEFOCTYKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9QQ0lfU01CVVMJNworI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX1NNQlVTMQk4CisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fU01CVVMyCTkKKyNkZWZpbmUgSVBNSV9DSEFOTkVMX01FRElVTV9VU0IxCTEwCisjZGVmaW5lIElQTUlfQ0hBTk5FTF9NRURJVU1fVVNCMgkxMQorI2RlZmluZSBJUE1JX0NIQU5ORUxfTUVESVVNX1NZU0lOVEYJMTIKKworI2VuZGlmIC8qIF9fTElOVVhfSVBNSV9NU0dERUZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBzZWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXBzZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdhNjMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHNlYy5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX0xJTlVYX0lQU0VDX0gKKyNkZWZpbmUgX0xJTlVYX0lQU0VDX0gKKworLyogVGhlIGRlZmluaXRpb25zLCByZXF1aXJlZCB0byB0YWxrIHRvIEtBTUUgcmFjb29uIElLRS4gKi8KKworI2luY2x1ZGUgPGxpbnV4L3Bma2V5djIuaD4KKworI2RlZmluZSBJUFNFQ19QT1JUX0FOWQkJMAorI2RlZmluZSBJUFNFQ19VTFBST1RPX0FOWQkyNTUKKyNkZWZpbmUgSVBTRUNfUFJPVE9fQU5ZCQkyNTUKKworZW51bSB7CisJSVBTRUNfTU9ERV9BTlkJCT0gMCwJLyogV2UgZG8gbm90IHN1cHBvcnQgdGhpcyBmb3IgU0EgKi8KKwlJUFNFQ19NT0RFX1RSQU5TUE9SVAk9IDEsCisJSVBTRUNfTU9ERV9UVU5ORUwJPSAyLAorCUlQU0VDX01PREVfQkVFVCAgICAgICAgID0gMworfTsKKworZW51bSB7CisJSVBTRUNfRElSX0FOWQkJPSAwLAorCUlQU0VDX0RJUl9JTkJPVU5ECT0gMSwKKwlJUFNFQ19ESVJfT1VUQk9VTkQJPSAyLAorCUlQU0VDX0RJUl9GV0QJCT0gMywJLyogSXQgaXMgb3VyIG93biAqLworCUlQU0VDX0RJUl9NQVgJCT0gNCwKKwlJUFNFQ19ESVJfSU5WQUxJRAk9IDUKK307CisKK2VudW0geworCUlQU0VDX1BPTElDWV9ESVNDQVJECT0gMCwKKwlJUFNFQ19QT0xJQ1lfTk9ORQk9IDEsCisJSVBTRUNfUE9MSUNZX0lQU0VDCT0gMiwKKwlJUFNFQ19QT0xJQ1lfRU5UUlVTVAk9IDMsCisJSVBTRUNfUE9MSUNZX0JZUEFTUwk9IDQKK307CisKK2VudW0geworCUlQU0VDX0xFVkVMX0RFRkFVTFQJPSAwLAorCUlQU0VDX0xFVkVMX1VTRQkJPSAxLAorCUlQU0VDX0xFVkVMX1JFUVVJUkUJPSAyLAorCUlQU0VDX0xFVkVMX1VOSVFVRQk9IDMKK307CisKKyNkZWZpbmUgSVBTRUNfTUFOVUFMX1JFUUlEX01BWAkweDNmZmYKKworI2RlZmluZSBJUFNFQ19SRVBMQVlXU0laRSAgMzIKKworI2VuZGlmCS8qIF9MSU5VWF9JUFNFQ19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2ViYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lwdjYuaApAQCAtMCwwICsxLDE5NCBAQAorI2lmbmRlZiBfSVBWNl9ICisjZGVmaW5lIF9JUFY2X0gKKworI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogVGhlIGxhdGVzdCBkcmFmdHMgZGVjbGFyZWQgaW5jcmVhc2UgaW4gbWluaW1hbCBtdHUgdXAgdG8gMTI4MC4gKi8KKworI2RlZmluZSBJUFY2X01JTl9NVFUJMTI4MAorCisvKgorICoJQWR2YW5jZWQgQVBJCisgKglzb3VyY2UgaW50ZXJmYWNlL2FkZHJlc3Mgc2VsZWN0aW9uLCBzb3VyY2Ugcm91dGluZywgZXRjLi4uCisgKgkqdW5kZXIgY29uc3RydWN0aW9uKgorICovCisKKworc3RydWN0IGluNl9wa3RpbmZvIHsKKwlzdHJ1Y3QgaW42X2FkZHIJaXBpNl9hZGRyOworCWludAkJaXBpNl9pZmluZGV4OworfTsKKworCitzdHJ1Y3QgaW42X2lmcmVxIHsKKwlzdHJ1Y3QgaW42X2FkZHIJaWZyNl9hZGRyOworCV9fdTMyCQlpZnI2X3ByZWZpeGxlbjsKKwlpbnQJCWlmcjZfaWZpbmRleDsgCit9OworCisjZGVmaW5lIElQVjZfU1JDUlRfU1RSSUNUCTB4MDEJLyogRGVwcmVjYXRlZDsgd2lsbCBiZSByZW1vdmVkICovCisjZGVmaW5lIElQVjZfU1JDUlRfVFlQRV8wCTAJLyogRGVwcmVjYXRlZDsgd2lsbCBiZSByZW1vdmVkICovCisjZGVmaW5lIElQVjZfU1JDUlRfVFlQRV8yCTIJLyogSVB2NiB0eXBlIDIgUm91dGluZyBIZWFkZXIJKi8KKworLyoKKyAqCXJvdXRpbmcgaGVhZGVyCisgKi8KK3N0cnVjdCBpcHY2X3J0X2hkciB7CisJX191OAkJbmV4dGhkcjsKKwlfX3U4CQloZHJsZW47CisJX191OAkJdHlwZTsKKwlfX3U4CQlzZWdtZW50c19sZWZ0OworCisJLyoKKwkgKgl0eXBlIHNwZWNpZmljIGRhdGEKKwkgKgl2YXJpYWJsZSBsZW5ndGggZmllbGQKKwkgKi8KK307CisKKworc3RydWN0IGlwdjZfb3B0X2hkciB7CisJX191OCAJCW5leHRoZHI7CisJX191OCAJCWhkcmxlbjsKKwkvKiAKKwkgKiBUTFYgZW5jb2RlZCBvcHRpb24gZGF0YSBmb2xsb3dzLgorCSAqLworfTsKKworI2RlZmluZSBpcHY2X2Rlc3RvcHRfaGRyIGlwdjZfb3B0X2hkcgorI2RlZmluZSBpcHY2X2hvcG9wdF9oZHIgIGlwdjZfb3B0X2hkcgorCisKKy8qCisgKglyb3V0aW5nIGhlYWRlciB0eXBlIDAgKHVzZWQgaW4gY21zZ2hkciBzdHJ1Y3QpCisgKi8KKworc3RydWN0IHJ0MF9oZHIgeworCXN0cnVjdCBpcHY2X3J0X2hkcglydF9oZHI7CisJX191MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgaW42X2FkZHIJCWFkZHJbMF07CisKKyNkZWZpbmUgcnQwX3R5cGUJCXJ0X2hkci50eXBlCit9OworCisvKgorICoJcm91dGluZyBoZWFkZXIgdHlwZSAyCisgKi8KKworc3RydWN0IHJ0Ml9oZHIgeworCXN0cnVjdCBpcHY2X3J0X2hkcglydF9oZHI7CisJX191MzIJCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgaW42X2FkZHIJCWFkZHI7CisKKyNkZWZpbmUgcnQyX3R5cGUJCXJ0X2hkci50eXBlCit9OworCisvKgorICoJaG9tZSBhZGRyZXNzIG9wdGlvbiBpbiBkZXN0aW5hdGlvbiBvcHRpb25zIGhlYWRlcgorICovCisKK3N0cnVjdCBpcHY2X2Rlc3RvcHRfaGFvIHsKKwlfX3U4CQkJdHlwZTsKKwlfX3U4CQkJbGVuZ3RoOworCXN0cnVjdCBpbjZfYWRkcgkJYWRkcjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyoKKyAqCUlQdjYgZml4ZWQgaGVhZGVyCisgKgorICoJQkVXQVJFLCBpdCBpcyBpbmNvcnJlY3QuIFRoZSBmaXJzdCA0IGJpdHMgb2YgZmxvd19sYmwKKyAqCWFyZSBnbHVlZCB0byBwcmlvcml0eSBub3csIGZvcm1pbmcgImNsYXNzIi4KKyAqLworCitzdHJ1Y3QgaXB2NmhkciB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OAkJCXByaW9yaXR5OjQsCisJCQkJdmVyc2lvbjo0OworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191OAkJCXZlcnNpb246NCwKKwkJCQlwcmlvcml0eTo0OworI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCA8YXNtL2J5dGVvcmRlci5oPiIKKyNlbmRpZgorCV9fdTgJCQlmbG93X2xibFszXTsKKworCV9fYmUxNgkJCXBheWxvYWRfbGVuOworCV9fdTgJCQluZXh0aGRyOworCV9fdTgJCQlob3BfbGltaXQ7CisKKwlzdHJ1Y3QJaW42X2FkZHIJc2FkZHI7CisJc3RydWN0CWluNl9hZGRyCWRhZGRyOworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBwZXIgSVB2NiBsaW5rLgorICovCitzdHJ1Y3QgaXB2Nl9kZXZjb25mIHsKKwlfX3MzMgkJZm9yd2FyZGluZzsKKwlfX3MzMgkJaG9wX2xpbWl0OworCV9fczMyCQltdHU2OworCV9fczMyCQlhY2NlcHRfcmE7CisJX19zMzIJCWFjY2VwdF9yZWRpcmVjdHM7CisJX19zMzIJCWF1dG9jb25mOworCV9fczMyCQlkYWRfdHJhbnNtaXRzOworCV9fczMyCQlydHJfc29saWNpdHM7CisJX19zMzIJCXJ0cl9zb2xpY2l0X2ludGVydmFsOworCV9fczMyCQlydHJfc29saWNpdF9kZWxheTsKKwlfX3MzMgkJZm9yY2VfbWxkX3ZlcnNpb247CisjaWZkZWYgQ09ORklHX0lQVjZfUFJJVkFDWQorCV9fczMyCQl1c2VfdGVtcGFkZHI7CisJX19zMzIJCXRlbXBfdmFsaWRfbGZ0OworCV9fczMyCQl0ZW1wX3ByZWZlcmVkX2xmdDsKKwlfX3MzMgkJcmVnZW5fbWF4X3JldHJ5OworCV9fczMyCQltYXhfZGVzeW5jX2ZhY3RvcjsKKyNlbmRpZgorCV9fczMyCQltYXhfYWRkcmVzc2VzOworCV9fczMyCQlhY2NlcHRfcmFfZGVmcnRyOworCV9fczMyCQlhY2NlcHRfcmFfcGluZm87CisjaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYKKwlfX3MzMgkJYWNjZXB0X3JhX3J0cl9wcmVmOworCV9fczMyCQlydHJfcHJvYmVfaW50ZXJ2YWw7CisjaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVfSU5GTworCV9fczMyCQlhY2NlcHRfcmFfcnRfaW5mb19tYXhfcGxlbjsKKyNlbmRpZgorI2VuZGlmCisJX19zMzIJCXByb3h5X25kcDsKKwlfX3MzMgkJYWNjZXB0X3NvdXJjZV9yb3V0ZTsKKyNpZmRlZiBDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRAorCV9fczMyCQlvcHRpbWlzdGljX2RhZDsKKyNlbmRpZgorCXZvaWQJCSpzeXNjdGw7Cit9OworCisvKiBpbmRleCB2YWx1ZXMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gaXB2Nl9kZXZjb25mICovCitlbnVtIHsKKwlERVZDT05GX0ZPUldBUkRJTkcgPSAwLAorCURFVkNPTkZfSE9QTElNSVQsCisJREVWQ09ORl9NVFU2LAorCURFVkNPTkZfQUNDRVBUX1JBLAorCURFVkNPTkZfQUNDRVBUX1JFRElSRUNUUywKKwlERVZDT05GX0FVVE9DT05GLAorCURFVkNPTkZfREFEX1RSQU5TTUlUUywKKwlERVZDT05GX1JUUl9TT0xJQ0lUUywKKwlERVZDT05GX1JUUl9TT0xJQ0lUX0lOVEVSVkFMLAorCURFVkNPTkZfUlRSX1NPTElDSVRfREVMQVksCisJREVWQ09ORl9VU0VfVEVNUEFERFIsCisJREVWQ09ORl9URU1QX1ZBTElEX0xGVCwKKwlERVZDT05GX1RFTVBfUFJFRkVSRURfTEZULAorCURFVkNPTkZfUkVHRU5fTUFYX1JFVFJZLAorCURFVkNPTkZfTUFYX0RFU1lOQ19GQUNUT1IsCisJREVWQ09ORl9NQVhfQUREUkVTU0VTLAorCURFVkNPTkZfRk9SQ0VfTUxEX1ZFUlNJT04sCisJREVWQ09ORl9BQ0NFUFRfUkFfREVGUlRSLAorCURFVkNPTkZfQUNDRVBUX1JBX1BJTkZPLAorCURFVkNPTkZfQUNDRVBUX1JBX1JUUl9QUkVGLAorCURFVkNPTkZfUlRSX1BST0JFX0lOVEVSVkFMLAorCURFVkNPTkZfQUNDRVBUX1JBX1JUX0lORk9fTUFYX1BMRU4sCisJREVWQ09ORl9QUk9YWV9ORFAsCisJREVWQ09ORl9PUFRJTUlTVElDX0RBRCwKKwlERVZDT05GX0FDQ0VQVF9TT1VSQ0VfUk9VVEUsCisJREVWQ09ORl9NQVgKK307CisKKworI2VuZGlmIC8qIF9JUFY2X0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Nl9yb3V0ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pcHY2X3JvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2YmJiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB2Nl9yb3V0ZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKglMaW51eCBJTkVUNiBpbXBsZW1lbnRhdGlvbiAKKyAqCisgKglBdXRob3JzOgorICoJUGVkcm8gUm9xdWUJCTxyb3F1ZUBkaS5mYy51bC5wdD4JCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JUFY2X1JPVVRFX0gKKyNkZWZpbmUgX0xJTlVYX0lQVjZfUk9VVEVfSAorCisjZGVmaW5lIFJURl9ERUZBVUxUCTB4MDAwMTAwMDAJLyogZGVmYXVsdCAtIGxlYXJuZWQgdmlhIE5ECSovCisjZGVmaW5lIFJURl9BTExPTkxJTksJMHgwMDAyMDAwMAkvKiAoZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkKQorCQkJCQkgICBmYWxsYmFjaywgbm8gcm91dGVycyBvbiBsaW5rICovCisjZGVmaW5lIFJURl9BRERSQ09ORgkweDAwMDQwMDAwCS8qIGFkZHJjb25mIHJvdXRlIC0gUkEJCSovCisjZGVmaW5lIFJURl9QUkVGSVhfUlQJMHgwMDA4MDAwMAkvKiBBIHByZWZpeCBvbmx5IHJvdXRlIC0gUkEJKi8KKyNkZWZpbmUgUlRGX0FOWUNBU1QJMHgwMDEwMDAwMAkvKiBBbnljYXN0CQkJKi8KKworI2RlZmluZSBSVEZfTk9ORVhUSE9QCTB4MDAyMDAwMDAJLyogcm91dGUgd2l0aCBubyBuZXh0aG9wCSovCisjZGVmaW5lIFJURl9FWFBJUkVTCTB4MDA0MDAwMDAKKworI2RlZmluZSBSVEZfUk9VVEVJTkZPCTB4MDA4MDAwMDAJLyogcm91dGUgaW5mb3JtYXRpb24gLSBSQQkqLworCisjZGVmaW5lIFJURl9DQUNIRQkweDAxMDAwMDAwCS8qIGNhY2hlIGVudHJ5CQkJKi8KKyNkZWZpbmUgUlRGX0ZMT1cJMHgwMjAwMDAwMAkvKiBmbG93IHNpZ25pZmljYW50IHJvdXRlCSovCisjZGVmaW5lIFJURl9QT0xJQ1kJMHgwNDAwMDAwMAkvKiBwb2xpY3kgcm91dGUJCQkqLworCisjZGVmaW5lIFJURl9QUkVGKHByZWYpCSgocHJlZikgPDwgMjcpCisjZGVmaW5lIFJURl9QUkVGX01BU0sJMHgxODAwMDAwMAorCisjZGVmaW5lIFJURl9MT0NBTAkweDgwMDAwMDAwCisKKworc3RydWN0IGluNl9ydG1zZyB7CisJc3RydWN0IGluNl9hZGRyCQlydG1zZ19kc3Q7CisJc3RydWN0IGluNl9hZGRyCQlydG1zZ19zcmM7CisJc3RydWN0IGluNl9hZGRyCQlydG1zZ19nYXRld2F5OworCV9fdTMyCQkJcnRtc2dfdHlwZTsKKwlfX3UxNgkJCXJ0bXNnX2RzdF9sZW47CisJX191MTYJCQlydG1zZ19zcmNfbGVuOworCV9fdTMyCQkJcnRtc2dfbWV0cmljOworCXVuc2lnbmVkIGxvbmcJCXJ0bXNnX2luZm87CisgICAgICAgIF9fdTMyCQkJcnRtc2dfZmxhZ3M7CisJaW50CQkJcnRtc2dfaWZpbmRleDsKK307CisKKyNkZWZpbmUgUlRNU0dfTkVXREVWSUNFCQkweDExCisjZGVmaW5lIFJUTVNHX0RFTERFVklDRQkJMHgxMgorI2RlZmluZSBSVE1TR19ORVdST1VURQkJMHgyMQorI2RlZmluZSBSVE1TR19ERUxST1VURQkJMHgyMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXB4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lweC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTliNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lweC5oCkBAIC0wLDAgKzEsNzQgQEAKKyNpZm5kZWYgX0lQWF9IXworI2RlZmluZSBfSVBYX0hfCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2RlZmluZSBJUFhfTk9ERV9MRU4JNgorI2RlZmluZSBJUFhfTVRVCQk1NzYKKworc3RydWN0IHNvY2thZGRyX2lweCB7CisJc2FfZmFtaWx5X3QJc2lweF9mYW1pbHk7CisJX19iZTE2CQlzaXB4X3BvcnQ7CisJX19iZTMyCQlzaXB4X25ldHdvcms7CisJdW5zaWduZWQgY2hhciAJc2lweF9ub2RlW0lQWF9OT0RFX0xFTl07CisJX191OAkJc2lweF90eXBlOworCXVuc2lnbmVkIGNoYXIJc2lweF96ZXJvOwkvKiAxNiBieXRlIGZpbGwgKi8KK307CisKKy8qCisgKiBTbyB3ZSBjYW4gZml0IHRoZSBleHRyYSBpbmZvIGZvciBTSU9DU0lGQUREUiBpbnRvIHRoZSBhZGRyZXNzIG5pY2VseQorICovCisjZGVmaW5lIHNpcHhfc3BlY2lhbAlzaXB4X3BvcnQKKyNkZWZpbmUgc2lweF9hY3Rpb24Jc2lweF96ZXJvCisjZGVmaW5lIElQWF9ETFRJVEYJMAorI2RlZmluZSBJUFhfQ1JUSVRGCTEKKworc3RydWN0IGlweF9yb3V0ZV9kZWZpbml0aW9uIHsKKwlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOworCV9fYmUzMiAgICAgICAgaXB4X3JvdXRlcl9uZXR3b3JrOworCXVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07Cit9OworCitzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uIHsKKwlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOworCXVuc2lnbmVkIGNoYXIgaXB4X2RldmljZVsxNl07CisJdW5zaWduZWQgY2hhciBpcHhfZGxpbmtfdHlwZTsKKyNkZWZpbmUgSVBYX0ZSQU1FX05PTkUJCTAKKyNkZWZpbmUgSVBYX0ZSQU1FX1NOQVAJCTEKKyNkZWZpbmUgSVBYX0ZSQU1FXzgwMjIJCTIKKyNkZWZpbmUgSVBYX0ZSQU1FX0VUSEVSSUkJMworI2RlZmluZSBJUFhfRlJBTUVfODAyMwkJNAorI2RlZmluZSBJUFhfRlJBTUVfVFJfODAyMiAgICAgICA1IC8qIG9ic29sZXRlICovCisJdW5zaWduZWQgY2hhciBpcHhfc3BlY2lhbDsKKyNkZWZpbmUgSVBYX1NQRUNJQUxfTk9ORQkwCisjZGVmaW5lIElQWF9QUklNQVJZCQkxCisjZGVmaW5lIElQWF9JTlRFUk5BTAkJMgorCXVuc2lnbmVkIGNoYXIgaXB4X25vZGVbSVBYX05PREVfTEVOXTsKK307CisJCitzdHJ1Y3QgaXB4X2NvbmZpZ19kYXRhIHsKKwl1bnNpZ25lZCBjaGFyCWlweGNmZ19hdXRvX3NlbGVjdF9wcmltYXJ5OworCXVuc2lnbmVkIGNoYXIJaXB4Y2ZnX2F1dG9fY3JlYXRlX2ludGVyZmFjZXM7Cit9OworCisvKgorICogT0xEIFJvdXRlIERlZmluaXRpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KKworc3RydWN0IGlweF9yb3V0ZV9kZWYgeworCV9fYmUzMgkJaXB4X25ldHdvcms7CisJX19iZTMyCQlpcHhfcm91dGVyX25ldHdvcms7CisjZGVmaW5lIElQWF9ST1VURV9OT19ST1VURVIJMAorCXVuc2lnbmVkIGNoYXIJaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CisJdW5zaWduZWQgY2hhcglpcHhfZGV2aWNlWzE2XTsKKwl1bnNpZ25lZCBzaG9ydAlpcHhfZmxhZ3M7CisjZGVmaW5lIElQWF9SVF9TTkFQCQk4CisjZGVmaW5lIElQWF9SVF84MDIyCQk0CisjZGVmaW5lIElQWF9SVF9CTFVFQk9PSwkJMgorI2RlZmluZSBJUFhfUlRfUk9VVEVECQkxCit9OworCisjZGVmaW5lIFNJT0NBSVBYSVRGQ1JUCQkoU0lPQ1BST1RPUFJJVkFURSkKKyNkZWZpbmUgU0lPQ0FJUFhQUklTTFQJCShTSU9DUFJPVE9QUklWQVRFICsgMSkKKyNkZWZpbmUgU0lPQ0lQWENGR0RBVEEJCShTSU9DUFJPVE9QUklWQVRFICsgMikKKyNkZWZpbmUgU0lPQ0lQWE5DUENPTk4JCShTSU9DUFJPVE9QUklWQVRFICsgMykKKyNlbmRpZiAvKiBfSVBYX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lyZGEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXJkYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Zjg4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lyZGEuaApAQCAtMCwwICsxLDI1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBpcmRhLmgKKyAqIFZlcnNpb246ICAgICAgIAorICogRGVzY3JpcHRpb246ICAgCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBNb24gTWFyICA4IDE0OjA2OjEyIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBEZWMgMjUgMTY6MDY6NDIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXPDuCBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBLRVJORUxfSVJEQV9ICisjZGVmaW5lIEtFUk5FTF9JUkRBX0gKKworLyogUGxlYXNlIGRvICpub3QqIGFkZCBhbnkgI2luY2x1ZGUgaW4gdGhpcyBmaWxlLCB0aGlzIGZpbGUgaXMKKyAqIGluY2x1ZGVkIGFzLWlzIGluIHVzZXIgc3BhY2UuCisgKiBQbGVhc2UgZml4IHRoZSBjYWxsaW5nIGZpbGUgdG8gcHJvcGVybHkgaW5jbHVkZWQgbmVlZGVkIGZpbGVzIGJlZm9yZQorICogdGhpcyBvbmUsIG9yIHByZWZlcmFibHkgdG8gaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPiBpbnN0ZWFkLgorICogSmVhbiBJSSAqLworCisvKiBIaW50IGJpdCBwb3NpdGlvbnMgZm9yIGZpcnN0IGhpbnQgYnl0ZSAqLworI2RlZmluZSBISU5UX1BOUCAgICAgICAgIDB4MDEKKyNkZWZpbmUgSElOVF9QREEgICAgICAgICAweDAyCisjZGVmaW5lIEhJTlRfQ09NUFVURVIgICAgMHgwNAorI2RlZmluZSBISU5UX1BSSU5URVIgICAgIDB4MDgKKyNkZWZpbmUgSElOVF9NT0RFTSAgICAgICAweDEwCisjZGVmaW5lIEhJTlRfRkFYICAgICAgICAgMHgyMAorI2RlZmluZSBISU5UX0xBTiAgICAgICAgIDB4NDAKKyNkZWZpbmUgSElOVF9FWFRFTlNJT04gICAweDgwCisKKy8qIEhpbnQgYml0IHBvc2l0aW9ucyBmb3Igc2Vjb25kIGhpbnQgYnl0ZSAoZmlyc3QgZXh0ZW5zaW9uIGJ5dGUpICovCisjZGVmaW5lIEhJTlRfVEVMRVBIT05ZICAgMHgwMQorI2RlZmluZSBISU5UX0ZJTEVfU0VSVkVSIDB4MDIKKyNkZWZpbmUgSElOVF9DT01NICAgICAgICAweDA0CisjZGVmaW5lIEhJTlRfTUVTU0FHRSAgICAgMHgwOAorI2RlZmluZSBISU5UX0hUVFAgICAgICAgIDB4MTAKKyNkZWZpbmUgSElOVF9PQkVYICAgICAgICAweDIwCisKKy8qIElyTE1QIGNoYXJhY3RlciBjb2RlIHZhbHVlcyAqLworI2RlZmluZSBDU19BU0NJSSAgICAgICAgIDB4MDAKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfMSAgICAweDAxCisjZGVmaW5lCUNTX0lTT184ODU5XzIgICAgMHgwMgorI2RlZmluZQlDU19JU09fODg1OV8zICAgIDB4MDMKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfNCAgICAweDA0CisjZGVmaW5lCUNTX0lTT184ODU5XzUgICAgMHgwNQorI2RlZmluZQlDU19JU09fODg1OV82ICAgIDB4MDYKKyNkZWZpbmUJQ1NfSVNPXzg4NTlfNyAgICAweDA3CisjZGVmaW5lCUNTX0lTT184ODU5XzggICAgMHgwOAorI2RlZmluZQlDU19JU09fODg1OV85ICAgIDB4MDkKKyNkZWZpbmUgQ1NfVU5JQ09ERSAgICAgICAweGZmCisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIGRvbmdsZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJSVJEQV9URUtSQU1fRE9OR0xFICAgICAgID0gMCwKKwlJUkRBX0VTSV9ET05HTEUgICAgICAgICAgPSAxLAorCUlSREFfQUNUSVNZU19ET05HTEUgICAgICA9IDIsCisJSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFID0gMywKKwlJUkRBX0dJUkJJTF9ET05HTEUgICAgICAgPSA0LAorCUlSREFfTElURUxJTktfRE9OR0xFICAgICA9IDUsCisJSVJEQV9BSVJQT1JUX0RPTkdMRSAgICAgID0gNiwKKwlJUkRBX09MRF9CRUxLSU5fRE9OR0xFICAgPSA3LAorCUlSREFfRVA3MjExX0lSICAgICAgICAgICA9IDgsCisJSVJEQV9NQ1AyMTIwX0RPTkdMRSAgICAgID0gOSwKKwlJUkRBX0FDVDIwMExfRE9OR0xFICAgICAgPSAxMCwKKwlJUkRBX01BNjAwX0RPTkdMRSAgICAgICAgPSAxMSwKKwlJUkRBX1RPSU0zMjMyX0RPTkdMRSAgICAgPSAxMiwKKwlJUkRBX0VQNzIxMV9ET05HTEUgICAgICAgPSAxMywKK30gSVJEQV9ET05HTEU7CisKKy8qIFByb3RvY29sIHR5cGVzIHRvIGJlIHVzZWQgZm9yIFNPQ0tfREdSQU0gKi8KK2VudW0geworCUlSREFQUk9UT19VTklUREFUQSA9IDAsCisJSVJEQVBST1RPX1VMVFJBICAgID0gMSwKKwlJUkRBUFJPVE9fTUFYCit9OworCisjZGVmaW5lIFNPTF9JUkxNUCAgICAgIDI2NiAvKiBTYW1lIGFzIFNPTF9JUkRBIGZvciBub3cgKi8KKyNkZWZpbmUgU09MX0lSVFRQICAgICAgMjY2IC8qIFNhbWUgYXMgU09MX0lSREEgZm9yIG5vdyAqLworCisjZGVmaW5lIElSTE1QX0VOVU1ERVZJQ0VTICAgICAgICAxCS8qIFJldHVybiBkaXNjb3ZlcnkgbG9nICovCisjZGVmaW5lIElSTE1QX0lBU19TRVQgICAgICAgICAgICAyCS8qIFNldCBhbiBhdHRyaWJ1dGUgaW4gbG9jYWwgSUFTICovCisjZGVmaW5lIElSTE1QX0lBU19RVUVSWSAgICAgICAgICAzCS8qIFF1ZXJ5IHJlbW90ZSBJQVMgZm9yIGF0dHJpYnV0ZSAqLworI2RlZmluZSBJUkxNUF9ISU5UU19TRVQgICAgICAgICAgNAkvKiBTZXQgaGludCBiaXRzIGFkdmVydGlzZWQgKi8KKyNkZWZpbmUgSVJMTVBfUU9TX1NFVCAgICAgICAgICAgIDUKKyNkZWZpbmUgSVJMTVBfUU9TX0dFVCAgICAgICAgICAgIDYKKyNkZWZpbmUgSVJMTVBfTUFYX1NEVV9TSVpFICAgICAgIDcKKyNkZWZpbmUgSVJMTVBfSUFTX0dFVCAgICAgICAgICAgIDgJLyogR2V0IGFuIGF0dHJpYnV0ZSBmcm9tIGxvY2FsIElBUyAqLworI2RlZmluZSBJUkxNUF9JQVNfREVMCQkgOQkvKiBSZW1vdmUgYXR0cmlidXRlIGZyb20gbG9jYWwgSUFTICovCisjZGVmaW5lIElSTE1QX0hJTlRfTUFTS19TRVQJMTAJLyogU2V0IGRpc2NvdmVyeSBmaWx0ZXIgKi8KKyNkZWZpbmUgSVJMTVBfV0FJVERFVklDRQkxMQkvKiBXYWl0IGZvciBhIG5ldyBkaXNjb3ZlcnkgKi8KKworI2RlZmluZSBJUlRUUF9NQVhfU0RVX1NJWkUgSVJMTVBfTUFYX1NEVV9TSVpFIC8qIENvbXBhdGliaWxpdHkgKi8KKworI2RlZmluZSBJQVNfTUFYX1NUUklORyAgICAgICAgIDI1NgkvKiBTZWUgSXJMTVAgMS4xLCA0LjMuMy4yICovCisjZGVmaW5lIElBU19NQVhfT0NURVRfU1RSSU5HICAxMDI0CS8qIFNlZSBJckxNUCAxLjEsIDQuMy4zLjIgKi8KKyNkZWZpbmUgSUFTX01BWF9DTEFTU05BTUUgICAgICAgNjAJLyogU2VlIElyTE1QIDEuMSwgNC4zLjEgKi8KKyNkZWZpbmUgSUFTX01BWF9BVFRSSUJOQU1FICAgICAgNjAJLyogU2VlIElyTE1QIDEuMSwgNC4zLjMuMSAqLworI2RlZmluZSBJQVNfTUFYX0FUVFJJQk5VTUJFUiAgIDI1NgkvKiBTZWUgSXJMTVAgMS4xLCA0LjMuMy4xICovCisvKiBGb3IgdXNlciBzcGFjZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gbWF5IGJlIGZpeGVkIGluIGtlcm5lbCAyLjUuWAorICogTm90ZSA6IG5lZWQgNjArMSAoJ1wwJyksIG1ha2UgaXQgNjQgZm9yIGFsaWduZW1lbnQgLSBKZWFuIElJICovCisjZGVmaW5lIElBU19FWFBPUlRfQ0xBU1NOQU1FICAgICAgIDY0CisjZGVmaW5lIElBU19FWFBPUlRfQVRUUklCTkFNRSAgICAgMjU2CisKKy8qIEF0dHJpYnV0ZSB0eXBlIG5lZWRlZCBmb3Igc3RydWN0IGlyZGFfaWFzX3NldCAqLworI2RlZmluZSBJQVNfTUlTU0lORyAwCisjZGVmaW5lIElBU19JTlRFR0VSIDEKKyNkZWZpbmUgSUFTX09DVF9TRVEgMgorI2RlZmluZSBJQVNfU1RSSU5HICAzCisKKyNkZWZpbmUgTFNBUF9BTlkgICAgICAgICAgICAgIDB4ZmYKKworc3RydWN0IHNvY2thZGRyX2lyZGEgeworCXNhX2ZhbWlseV90IHNpcl9mYW1pbHk7ICAgLyogQUZfSVJEQSAqLworCV9fdTggICAgICAgIHNpcl9sc2FwX3NlbDsgLyogTFNBUCBzZWxlY3RvciAqLworCV9fdTMyICAgICAgIHNpcl9hZGRyOyAgICAgLyogRGV2aWNlIGFkZHJlc3MgKi8KKwljaGFyICAgICAgICBzaXJfbmFtZVsyNV07IC8qIFVzdWFsbHkgPHNlcnZpY2U+OklyREE6VGlueVRQICovCit9OworCitzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyB7CisJX191MzIgICAgICAgc2FkZHI7ICAgIC8qIEFkZHJlc3Mgb2YgbG9jYWwgaW50ZXJmYWNlICovCisJX191MzIgICAgICAgZGFkZHI7ICAgIC8qIEFkZHJlc3Mgb2YgcmVtb3RlIGRldmljZSAqLworCWNoYXIgICAgICAgIGluZm9bMjJdOyAvKiBEZXNjcmlwdGlvbiAqLworCV9fdTggICAgICAgIGNoYXJzZXQ7ICAvKiBDaGFyc2V0IHVzZWQgZm9yIGRlc2NyaXB0aW9uICovCisJX191OCAgICAgICAgaGludHNbMl07IC8qIEhpbnQgYml0cyAqLworfTsKKworc3RydWN0IGlyZGFfZGV2aWNlX2xpc3QgeworICAgICAgIF9fdTMyIGxlbjsKKyAgICAgICBzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyBkZXZbMV07Cit9OworCitzdHJ1Y3QgaXJkYV9pYXNfc2V0IHsKKwljaGFyIGlyZGFfY2xhc3NfbmFtZVtJQVNfRVhQT1JUX0NMQVNTTkFNRV07CisJY2hhciBpcmRhX2F0dHJpYl9uYW1lW0lBU19FWFBPUlRfQVRUUklCTkFNRV07CisJdW5zaWduZWQgaW50IGlyZGFfYXR0cmliX3R5cGU7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQgaXJkYV9hdHRyaWJfaW50OworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgc2hvcnQgbGVuOworCQkJX191OCBvY3RldF9zZXFbSUFTX01BWF9PQ1RFVF9TVFJJTkddOworCQl9IGlyZGFfYXR0cmliX29jdGV0X3NlcTsKKwkJc3RydWN0IHsKKwkJCV9fdTggbGVuOworCQkJX191OCBjaGFyc2V0OworCQkJX191OCBzdHJpbmdbSUFTX01BWF9TVFJJTkddOworCQl9IGlyZGFfYXR0cmliX3N0cmluZzsKKwl9IGF0dHJpYnV0ZTsKKwlfX3UzMiAgICAgICBkYWRkcjsgICAgLyogQWRkcmVzcyBvZiBkZXZpY2UgKGZvciBzb21lIHF1ZXJpZXMgb25seSkgKi8KK307CisKKy8qIFNvbWUgcHJpdmF0ZSBJT0NUTCdzIChtYXggMTYpICovCisjZGVmaW5lIFNJT0NTRE9OR0xFICAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NHRE9OR0xFICAgIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFNJT0NTQkFORFdJRFRIIChTSU9DREVWUFJJVkFURSArIDIpCisjZGVmaW5lIFNJT0NTTUVESUFCVVNZIChTSU9DREVWUFJJVkFURSArIDMpCisjZGVmaW5lIFNJT0NHTUVESUFCVVNZIChTSU9DREVWUFJJVkFURSArIDQpCisjZGVmaW5lIFNJT0NHUkVDRUlWSU5HIChTSU9DREVWUFJJVkFURSArIDUpCisjZGVmaW5lIFNJT0NTTU9ERSAgICAgIChTSU9DREVWUFJJVkFURSArIDYpCisjZGVmaW5lIFNJT0NHTU9ERSAgICAgIChTSU9DREVWUFJJVkFURSArIDcpCisjZGVmaW5lIFNJT0NTRFRSUlRTICAgIChTSU9DREVWUFJJVkFURSArIDgpCisjZGVmaW5lIFNJT0NHUU9TICAgICAgIChTSU9DREVWUFJJVkFURSArIDkpCisKKy8qIE5vIHJlYXNvbiB0byBpbmNsdWRlIDxsaW51eC9pZi5oPiBqdXN0IGJlY2F1c2Ugb2YgdGhpcyBvbmUgOy0pICovCisjZGVmaW5lIElSTkFNU0laIDE2IAorCisvKiBJckRBIHF1YWxpdHkgb2Ygc2VydmljZSBpbmZvcm1hdGlvbiAobXVzdCBub3QgZXhjZWVkIDE2IGJ5dGVzKSAqLworc3RydWN0IGlmX2lyZGFfcW9zIHsKKwl1bnNpZ25lZCBsb25nICBiYXVkcmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3NpemU7CisJdW5zaWduZWQgc2hvcnQgd2luZG93X3NpemU7CisJdW5zaWduZWQgc2hvcnQgbWluX3R1cm5fdGltZTsKKwl1bnNpZ25lZCBzaG9ydCBtYXhfdHVybl90aW1lOworCXVuc2lnbmVkIGNoYXIgIGFkZF9ib2ZzOworCXVuc2lnbmVkIGNoYXIgIGxpbmtfZGlzYzsKK307CisKKy8qIEZvciBzZXR0aW5nIFJUUyBhbmQgRFRSIGxpbmVzIG9mIGEgZG9uZ2xlICovCitzdHJ1Y3QgaWZfaXJkYV9saW5lIHsKKwlfX3U4IGR0cjsKKwlfX3U4IHJ0czsKK307CisKKy8qIElyREEgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gKGRhdGEgcGFydCBtdXN0IG5vdCBleGNlZWQgMTYgYnl0ZXMpICovCitzdHJ1Y3QgaWZfaXJkYV9yZXEgeworCXVuaW9uIHsKKwkJY2hhciBpZnJuX25hbWVbSVJOQU1TSVpdOyAgLyogaWYgbmFtZSwgZS5nLiAiaXJkYTAiICovCisJfSBpZnJfaWZybjsKKwkKKwkvKiBEYXRhIHBhcnQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBpZl9pcmRhX2xpbmUgaWZydV9saW5lOworCQlzdHJ1Y3QgaWZfaXJkYV9xb3MgIGlmcnVfcW9zOworCQl1bnNpZ25lZCBzaG9ydCAgICAgIGlmcnVfZmxhZ3M7CisJCXVuc2lnbmVkIGludCAgICAgICAgaWZydV9yZWNlaXZpbmc7CisJCXVuc2lnbmVkIGludCAgICAgICAgaWZydV9tb2RlOworCQl1bnNpZ25lZCBpbnQgICAgICAgIGlmcnVfZG9uZ2xlOworCX0gaWZyX2lmcnU7Cit9OworCisjZGVmaW5lIGlmcl9iYXVkcmF0ZSAgaWZyX2lmcnUuaWZydV9xb3MuYmF1ZHJhdGUKKyNkZWZpbmUgaWZyX3JlY2VpdmluZyBpZnJfaWZydS5pZnJ1X3JlY2VpdmluZyAKKyNkZWZpbmUgaWZyX2RvbmdsZSAgICBpZnJfaWZydS5pZnJ1X2RvbmdsZQorI2RlZmluZSBpZnJfbW9kZSAgICAgIGlmcl9pZnJ1LmlmcnVfbW9kZQorI2RlZmluZSBpZnJfZHRyICAgICAgIGlmcl9pZnJ1LmlmcnVfbGluZS5kdHIKKyNkZWZpbmUgaWZyX3J0cyAgICAgICBpZnJfaWZydS5pZnJ1X2xpbmUucnRzCisKKworLyogSXJEQSBuZXRsaW5rIGRlZmluaXRpb25zICovCisjZGVmaW5lIElSREFfTkxfTkFNRSAiaXJkYSIKKyNkZWZpbmUgSVJEQV9OTF9WRVJTSU9OIDEKKworZW51bSBpcmRhX25sX2NvbW1hbmRzIHsKKwlJUkRBX05MX0NNRF9VTlNQRUMsCisJSVJEQV9OTF9DTURfU0VUX01PREUsCisJSVJEQV9OTF9DTURfR0VUX01PREUsCisKKwlfX0lSREFfTkxfQ01EX0FGVEVSX0xBU1QKK307CisjZGVmaW5lIElSREFfTkxfQ01EX01BWCAoX19JUkRBX05MX0NNRF9BRlRFUl9MQVNUIC0gMSkKKworZW51bSBubDgwMjExX2F0dHJzIHsKKwlJUkRBX05MX0FUVFJfVU5TUEVDLAorCUlSREFfTkxfQVRUUl9JRk5BTUUsCisJSVJEQV9OTF9BVFRSX01PREUsCisKKwlfX0lSREFfTkxfQVRUUl9BRlRFUl9MQVNUCit9OworI2RlZmluZSBJUkRBX05MX0FUVFJfTUFYIChfX0lSREFfTkxfQVRUUl9BRlRFUl9MQVNUIC0gMSkKKworLyogSXJEQSBtb2RlcyAqLworI2RlZmluZSBJUkRBX01PREVfUFJJTUFSWSAgIDB4MQorI2RlZmluZSBJUkRBX01PREVfU0VDT05EQVJZIDB4MgorI2RlZmluZSBJUkRBX01PREVfTU9OSVRPUiAgIDB4NAorCisjZW5kaWYgLyogS0VSTkVMX0lSREFfSCAqLworCisKKworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjM1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG4uaApAQCAtMCwwICsxLDE0OCBAQAorLyogJElkOiBpc2RuLmgsdiAxLjEyNS4yLjMgMjAwNC8wMi8xMCAwMTowNzoxNCBrZWlsIEV4cCAkCisgKgorICogTWFpbiBoZWFkZXIgZm9yIHRoZSBMaW51eCBJU0ROIHN1YnN5c3RlbSAobGlua2xldmVsKS4KKyAqCisgKiBDb3B5cmlnaHQgMTk5NCw5NSw5NiBieSBGcml0eiBFbGZlcnQgKGZyaXR6QGlzZG40bGludXguZGUpCisgKiBDb3B5cmlnaHQgMTk5NSw5NiAgICBieSBUaGlua2luZyBPYmplY3RzIFNvZnR3YXJlIEdtYkggV3VlcnpidXJnCisgKiBDb3B5cmlnaHQgMTk5NSw5NiAgICBieSBNaWNoYWVsIEhpcHAgKE1pY2hhZWwuSGlwcEBzdHVkZW50LnVuaS10dWViaW5nZW4uZGUpCisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX19JU0ROX0hfXworI2RlZmluZSBfX0lTRE5fSF9fCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjaWZkZWYgQ09ORklHX0NPQkFMVF9NSUNST19TRVJWRVIKKy8qIFNhdmUgbWVtb3J5ICovCisjZGVmaW5lIElTRE5fTUFYX0RSSVZFUlMgICAgMgorI2RlZmluZSBJU0ROX01BWF9DSEFOTkVMUyAgIDgKKyNlbHNlCisjZGVmaW5lIElTRE5fTUFYX0RSSVZFUlMgICAgMzIKKyNkZWZpbmUgSVNETl9NQVhfQ0hBTk5FTFMgICA2NAorI2VuZGlmCisKKy8qIE5ldyBpb2N0bC1jb2RlcyAqLworI2RlZmluZSBJSU9DTkVUQUlGICBfSU8oJ0knLDEpCisjZGVmaW5lIElJT0NORVRESUYgIF9JTygnSScsMikKKyNkZWZpbmUgSUlPQ05FVFNDRiAgX0lPKCdJJywzKQorI2RlZmluZSBJSU9DTkVUR0NGICBfSU8oJ0knLDQpCisjZGVmaW5lIElJT0NORVRBTk0gIF9JTygnSScsNSkKKyNkZWZpbmUgSUlPQ05FVEROTSAgX0lPKCdJJyw2KQorI2RlZmluZSBJSU9DTkVUR05NICBfSU8oJ0knLDcpCisjZGVmaW5lIElJT0NHRVRTRVQgIF9JTygnSScsOCkgLyogbm8gbG9uZ2VyIHN1cHBvcnRlZCAqLworI2RlZmluZSBJSU9DU0VUU0VUICBfSU8oJ0knLDkpIC8qIG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUlPQ1NFVFZFUiAgX0lPKCdJJywxMCkKKyNkZWZpbmUgSUlPQ05FVEhVUCAgX0lPKCdJJywxMSkKKyNkZWZpbmUgSUlPQ1NFVEdTVCAgX0lPKCdJJywxMikKKyNkZWZpbmUgSUlPQ1NFVEJSSiAgX0lPKCdJJywxMykKKyNkZWZpbmUgSUlPQ1NJR1BSRiAgX0lPKCdJJywxNCkKKyNkZWZpbmUgSUlPQ0dFVFBSRiAgX0lPKCdJJywxNSkKKyNkZWZpbmUgSUlPQ1NFVFBSRiAgX0lPKCdJJywxNikKKyNkZWZpbmUgSUlPQ0dFVE1BUCAgX0lPKCdJJywxNykKKyNkZWZpbmUgSUlPQ1NFVE1BUCAgX0lPKCdJJywxOCkKKyNkZWZpbmUgSUlPQ05FVEFTTCAgX0lPKCdJJywxOSkKKyNkZWZpbmUgSUlPQ05FVERJTCAgX0lPKCdJJywyMCkKKyNkZWZpbmUgSUlPQ0dFVENQUyAgX0lPKCdJJywyMSkKKyNkZWZpbmUgSUlPQ0dFVERWUiAgX0lPKCdJJywyMikKKyNkZWZpbmUgSUlPQ05FVExDUiAgX0lPKCdJJywyMykgLyogZHdhYmMgaW9jdGwgZm9yIExDUiBmcm9tIGlzZG5sb2cgKi8KKyNkZWZpbmUgSUlPQ05FVERXUlNFVCAgX0lPKCdJJywyNCkgLyogZHdhYmMgaW9jdGwgdG8gcmVzZXQgYWJjLXZhbHVlcyB0byBkZWZhdWx0IG9uIGEgbmV0LWludGVyZmFjZSAqLworCisjZGVmaW5lIElJT0NORVRBTE4gIF9JTygnSScsMzIpCisjZGVmaW5lIElJT0NORVRETE4gIF9JTygnSScsMzMpCisKKyNkZWZpbmUgSUlPQ05FVEdQTiAgX0lPKCdJJywzNCkKKworI2RlZmluZSBJSU9DREJHVkFSICBfSU8oJ0knLDEyNykKKworI2RlZmluZSBJSU9DRFJWQ1RMICBfSU8oJ0knLDEyOCkKKworLyogY2lzY28gaGRsY2sgZGV2aWNlIHByaXZhdGUgaW9jdGxzICovCisjZGVmaW5lIFNJT0NHS0VFUFBFUklPRAkoU0lPQ0RFVlBSSVZBVEUgKyAwKQorI2RlZmluZSBTSU9DU0tFRVBQRVJJT0QJKFNJT0NERVZQUklWQVRFICsgMSkKKyNkZWZpbmUgU0lPQ0dERUJTRVJJTlQJKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgU0lPQ1NERUJTRVJJTlQJKFNJT0NERVZQUklWQVRFICsgMykKKworLyogUGFja2V0IGVuY2Fwc3VsYXRpb25zIGZvciBuZXQtaW50ZXJmYWNlcyAqLworI2RlZmluZSBJU0ROX05FVF9FTkNBUF9FVEhFUiAgICAgIDAKKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfUkFXSVAgICAgICAxCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX0lQVFlQICAgICAgMgorI2RlZmluZSBJU0ROX05FVF9FTkNBUF9DSVNDT0hETEMgIDMgLyogV2l0aG91dCBTTEFSUCBhbmQga2VlcGFsaXZlICovCisjZGVmaW5lIElTRE5fTkVUX0VOQ0FQX1NZTkNQUFAgICAgNAorI2RlZmluZSBJU0ROX05FVF9FTkNBUF9VSUhETEMgICAgIDUKKyNkZWZpbmUgSVNETl9ORVRfRU5DQVBfQ0lTQ09IRExDSyA2IC8qIFdpdGggU0xBUlAgYW5kIGtlZXBhbGl2ZSAgICAqLworI2RlZmluZSBJU0ROX05FVF9FTkNBUF9YMjVJRkFDRSAgIDcgLyogRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQqLworI2RlZmluZSBJU0ROX05FVF9FTkNBUF9NQVhfRU5DQVAgIElTRE5fTkVUX0VOQ0FQX1gyNUlGQUNFCisKKy8qIEZhY2lsaXR5IHdoaWNoIGN1cnJlbnRseSB1c2VzIGFuIElTRE4tY2hhbm5lbCAqLworI2RlZmluZSBJU0ROX1VTQUdFX05PTkUgICAgICAgMAorI2RlZmluZSBJU0ROX1VTQUdFX1JBVyAgICAgICAgMQorI2RlZmluZSBJU0ROX1VTQUdFX01PREVNICAgICAgMgorI2RlZmluZSBJU0ROX1VTQUdFX05FVCAgICAgICAgMworI2RlZmluZSBJU0ROX1VTQUdFX1ZPSUNFICAgICAgNAorI2RlZmluZSBJU0ROX1VTQUdFX0ZBWCAgICAgICAgNQorI2RlZmluZSBJU0ROX1VTQUdFX01BU0sgICAgICAgNyAvKiBNYXNrIHRvIGdldCBwbGFpbiB1c2FnZSAqLworI2RlZmluZSBJU0ROX1VTQUdFX0RJU0FCTEVEICAzMiAvKiBUaGlzIGJpdCBpcyBzZXQsIGlmIGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVNETl9VU0FHRV9FWENMVVNJVkUgNjQgLyogVGhpcyBiaXQgaXMgc2V0LCBpZiBjaGFubmVsIGlzIGV4Y2x1c2l2ZSAqLworI2RlZmluZSBJU0ROX1VTQUdFX09VVEdPSU5HIDEyOCAvKiBUaGlzIGJpdCBpcyBzZXQsIGlmIGNoYW5uZWwgaXMgb3V0Z29pbmcgICovCisKKyNkZWZpbmUgSVNETl9NT0RFTV9OVU1SRUcgICAgMjQgICAgICAgIC8qIE51bWJlciBvZiBNb2RlbS1SZWdpc3RlcnMgICAgICAgICovCisjZGVmaW5lIElTRE5fTE1TTkxFTiAgICAgICAgIDI1NSAvKiBMZW5ndGggb2YgdHR5J3MgTGlzdGVuLU1TTiBzdHJpbmcgKi8KKyNkZWZpbmUgSVNETl9DTVNHTEVOCSAgICAgNTAJIC8qIExlbmd0aCBvZiBDT05ORUNULU1lc3NhZ2UgdG8gYWRkIGZvciBNb2RlbSAqLworCisjZGVmaW5lIElTRE5fTVNOTEVOICAgICAgICAgIDMyCisjZGVmaW5lIE5FVF9EViAweDA2ICAvKiBEYXRhIHZlcnNpb24gZm9yIGlzZG5fbmV0X2lvY3RsX2NmZyAgICovCisjZGVmaW5lIFRUWV9EViAweDA2ICAvKiBEYXRhIHZlcnNpb24gZm9yIGlwcm9mZCBldGMuICAgICAgICAgICovCisKKyNkZWZpbmUgSU5GX0RWIDB4MDEgIC8qIERhdGEgdmVyc2lvbiBmb3IgL2Rldi9pc2RuaW5mbyAgICAgICAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIGRydmlkWzI1XTsKKyAgdW5zaWduZWQgbG9uZyBhcmc7Cit9IGlzZG5faW9jdGxfc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgbmFtZVsxMF07CisgIGNoYXIgcGhvbmVbSVNETl9NU05MRU5dOworICBpbnQgIG91dGdvaW5nOworfSBpc2RuX25ldF9pb2N0bF9waG9uZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIG5hbWVbMTBdOyAgICAgLyogTmFtZSBvZiBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAqLworICBjaGFyIG1hc3RlclsxMF07ICAgLyogTmFtZSBvZiBNYXN0ZXIgZm9yIEJ1bmRsaW5nICAgICAgICAgICAqLworICBjaGFyIHNsYXZlWzEwXTsgICAgLyogTmFtZSBvZiBTbGF2ZSBmb3IgQnVuZGxpbmcgICAgICAgICAgICAqLworICBjaGFyIGVhelsyNTZdOyAgICAgLyogRUFaL01TTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBjaGFyIGRydmlkWzI1XTsgICAgLyogRHJpdmVySWQgZm9yIEJpbmRpbmdzICAgICAgICAgICAgICAgICAqLworICBpbnQgIG9uaHRpbWU7ICAgICAgLyogSGFuZ3VwLVRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNoYXJnZTsgICAgICAgLyogQ2hhcmdlLVVuaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGwyX3Byb3RvOyAgICAgLyogTGF5ZXItMiBwcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGwzX3Byb3RvOyAgICAgLyogTGF5ZXItMyBwcm90b2NvbCAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIHBfZW5jYXA7ICAgICAgLyogRW5jYXBzdWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGV4Y2x1c2l2ZTsgICAgLyogQ2hhbm5lbCwgaWYgYm91bmQgZXhjbHVzaXZlICAgICAgICAgICAqLworICBpbnQgIGRpYWxtYXg7ICAgICAgLyogRGlhbCBSZXRyeS1Db3VudGVyICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIHNsYXZlZGVsYXk7ICAgLyogRGVsYXkgdW50aWwgc2xhdmUgc3RhcnRzIHVwICAgICAgICAgICAqLworICBpbnQgIGNiZGVsYXk7ICAgICAgLyogRGVsYXkgYmVmb3JlIENhbGxiYWNrICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNoYXJnZWh1cDsgICAgLyogRmxhZzogQ2hhcmdlLUhhbmd1cCAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGlodXA7ICAgICAgICAgLyogRmxhZzogSGFuZ3VwLVRpbWVvdXQgb24gaW5jb21pbmcgbGluZSAqLworICBpbnQgIHNlY3VyZTsgICAgICAgLyogRmxhZzogU2VjdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNhbGxiYWNrOyAgICAgLyogRmxhZzogQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGNiaHVwOyAgICAgICAgLyogRmxhZzogUmVqZWN0IENhbGwgYmVmb3JlIENhbGxiYWNrICAgICAqLworICBpbnQgIHBwcGJpbmQ7ICAgICAgLyogaXBwcCBkZXZpY2UgZm9yIGJpbmRpbmdzICAgICAgICAgICAgICAqLworICBpbnQgIGNoYXJnZWludDsgICAgLyogVXNlIGZpeGVkIGNoYXJnZSBpbnRlcnZhbCBsZW5ndGggICAgICAqLworICBpbnQgIHRyaWdnZXJjcHM7ICAgLyogQm9nb0NQUyBuZWVkZWQgZm9yIHRyaWdnZXJpbmcgc2xhdmUgICAqLworICBpbnQgIGRpYWx0aW1lb3V0OyAgLyogRGlhbC1UaW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgIGRpYWx3YWl0OyAgICAgLyogVGltZSB0byB3YWl0IGFmdGVyIGZhaWxlZCBkaWFsICAgICAgICAqLworICBpbnQgIGRpYWxtb2RlOyAgICAgLyogRmxhZzogb2ZmIC8gb24gLyBhdXRvICAgICAgICAgICAgICAgICAqLworfSBpc2RuX25ldF9pb2N0bF9jZmc7CisKKyNkZWZpbmUgSVNETl9ORVRfRElBTE1PREVfTUFTSyAgMHhDMCAgICAvKiBiaXRzIGZvciBzdGF0dXMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9ORVRfRE1fT0ZGCSAgICAgICAgMHgwMCAgICAvKiB0aGlzIGludGVyZmFjZSBpcyBzdG9wcGVkICAgICAgKi8KKyNkZWZpbmUgSVNETl9ORVRfRE1fTUFOVUFMCTB4NDAgICAgLyogdGhpcyBpbnRlcmZhY2UgaXMgb24gKG1hbnVhbCkgICovCisjZGVmaW5lIElTRE5fTkVUX0RNX0FVVE8JMHg4MCAgICAvKiB0aGlzIGludGVyZmFjZSBpcyBhdXRvZGlhbCAgICAgKi8KKyNkZWZpbmUgSVNETl9ORVRfRElBTE1PREUoeCkgKCgmKHgpKS0+ZmxhZ3MgJiBJU0ROX05FVF9ESUFMTU9ERV9NQVNLKQorCisKKyNlbmRpZiAvKiBfX0lTRE5fSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG4vY2FwaWNtZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuL2NhcGljbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTg2MzVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuL2NhcGljbWQuaApAQCAtMCwwICsxLDExNSBAQAorLyogJElkOiBjYXBpY21kLmgsdiAxLjIuNi4yIDIwMDEvMDkvMjMgMjI6MjQ6MzMga2FpIEV4cCAkCisgKiAKKyAqIENBUEkgMi4wIEludGVyZmFjZSBmb3IgTGludXgKKyAqIAorICogQ29weXJpZ2h0IDE5OTcgYnkgQ2Fyc3RlbiBQYWV0aCA8Y2FsbGVAY2FsbGUuZGU+CisgKiAKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpZm5kZWYgX19DQVBJQ01EX0hfXworI2RlZmluZSBfX0NBUElDTURfSF9fCisKKyNkZWZpbmUgQ0FQSV9NU0dfQkFTRUxFTgkJOAorI2RlZmluZSBDQVBJX0RBVEFfQjNfUkVRX0xFTgkJKENBUElfTVNHX0JBU0VMRU4rNCs0KzIrMisyKQorI2RlZmluZSBDQVBJX0RBVEFfQjNfUkVTUF9MRU4JCShDQVBJX01TR19CQVNFTEVOKzQrMikKKworLyotLS0tLSBDQVBJIGNvbW1hbmRzIC0tLS0tKi8KKyNkZWZpbmUgQ0FQSV9BTEVSVAkJICAgIDB4MDEKKyNkZWZpbmUgQ0FQSV9DT05ORUNUCQkgICAgMHgwMgorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFCSAgICAweDAzCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkUJICAgIDB4ODMKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzIAkgICAgMHg4MgorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfVDkwX0FDVElWRSAgMHg4OAorI2RlZmluZSBDQVBJX0RBVEFfQjMJCSAgICAweDg2CisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9CMwkgICAgMHg4NAorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1QgCSAgICAweDA0CisjZGVmaW5lIENBUElfRkFDSUxJVFkJCSAgICAweDgwCisjZGVmaW5lIENBUElfSU5GTwkJICAgIDB4MDgKKyNkZWZpbmUgQ0FQSV9MSVNURU4JCSAgICAweDA1CisjZGVmaW5lIENBUElfTUFOVUZBQ1RVUkVSCSAgICAweGZmCisjZGVmaW5lIENBUElfUkVTRVRfQjMJCSAgICAweDg3CisjZGVmaW5lIENBUElfU0VMRUNUX0JfUFJPVE9DT0wJICAgIDB4NDEKKworLyotLS0tLSBDQVBJIHN1YmNvbW1hbmRzIC0tLS0tKi8KKworI2RlZmluZSBDQVBJX1JFUSAgICAweDgwCisjZGVmaW5lIENBUElfQ09ORiAgIDB4ODEKKyNkZWZpbmUgQ0FQSV9JTkQgICAgMHg4MgorI2RlZmluZSBDQVBJX1JFU1AgICAweDgzCisKKy8qLS0tLS0gQ0FQSSBjb21iaW5lZCBjb21tYW5kcyAtLS0tLSovCisKKyNkZWZpbmUgQ0FQSUNNRChjbWQsc3ViY21kKQkoKChjbWQpPDw4KXwoc3ViY21kKSkKKworI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfUkVRCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVCxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0NPTkYJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNULENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0lORAkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1QsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9SRVNQCQlDQVBJQ01EKENBUElfRElTQ09OTkVDVCxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9BTEVSVF9SRVEJCQlDQVBJQ01EKENBUElfQUxFUlQsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQUxFUlRfQ09ORgkJCUNBUElDTUQoQ0FQSV9BTEVSVCxDQVBJX0NPTkYpCisKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX1JFUQkJQ0FQSUNNRChDQVBJX0NPTk5FQ1QsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9DT05GCQlDQVBJQ01EKENBUElfQ09OTkVDVCxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfQ09OTkVDVF9JTkQJCUNBUElDTUQoQ0FQSV9DT05ORUNULENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfUkVTUAkJQ0FQSUNNRChDQVBJX0NPTk5FQ1QsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfQ09OTkVDVF9BQ1RJVkVfUkVRCQlDQVBJQ01EKENBUElfQ09OTkVDVF9BQ1RJVkUsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9BQ1RJVkVfQ09ORglDQVBJQ01EKENBUElfQ09OTkVDVF9BQ1RJVkUsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFX0lORAkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQUNUSVZFLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQUNUSVZFX1JFU1AJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQUNUSVZFLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX1NFTEVDVF9CX1BST1RPQ09MX1JFUQlDQVBJQ01EKENBUElfU0VMRUNUX0JfUFJPVE9DT0wsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfU0VMRUNUX0JfUFJPVE9DT0xfQ09ORglDQVBJQ01EKENBUElfU0VMRUNUX0JfUFJPVE9DT0wsQ0FQSV9DT05GKQorCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkVfUkVRCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX0FDVElWRV9DT05GCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19BQ1RJVkVfSU5ECUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX0FDVElWRV9SRVNQCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX0FDVElWRSxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX1JFUQkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjMsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19DT05GCQlDQVBJQ01EKENBUElfQ09OTkVDVF9CMyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19JTkQJCUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0NPTk5FQ1RfQjNfUkVTUAkJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjMsQ0FQSV9SRVNQKQorCisKKyNkZWZpbmUgQ0FQSV9DT05ORUNUX0IzX1Q5MF9BQ1RJVkVfSU5ECUNBUElDTUQoQ0FQSV9DT05ORUNUX0IzX1Q5MF9BQ1RJVkUsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfQ09OTkVDVF9CM19UOTBfQUNUSVZFX1JFU1AJQ0FQSUNNRChDQVBJX0NPTk5FQ1RfQjNfVDkwX0FDVElWRSxDQVBJX1JFU1ApCisKKyNkZWZpbmUgQ0FQSV9EQVRBX0IzX1JFUQkJQ0FQSUNNRChDQVBJX0RBVEFfQjMsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfREFUQV9CM19DT05GCQlDQVBJQ01EKENBUElfREFUQV9CMyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfREFUQV9CM19JTkQJCUNBUElDTUQoQ0FQSV9EQVRBX0IzLENBUElfSU5EKQorI2RlZmluZSBDQVBJX0RBVEFfQjNfUkVTUAkJQ0FQSUNNRChDQVBJX0RBVEFfQjMsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfRElTQ09OTkVDVF9CM19SRVEJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNUX0IzLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfQjNfQ09ORgkJQ0FQSUNNRChDQVBJX0RJU0NPTk5FQ1RfQjMsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX0RJU0NPTk5FQ1RfQjNfSU5ECQlDQVBJQ01EKENBUElfRElTQ09OTkVDVF9CMyxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9ESVNDT05ORUNUX0IzX1JFU1AJCUNBUElDTUQoQ0FQSV9ESVNDT05ORUNUX0IzLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX1JFU0VUX0IzX1JFUQkJQ0FQSUNNRChDQVBJX1JFU0VUX0IzLENBUElfUkVRKQorI2RlZmluZSBDQVBJX1JFU0VUX0IzX0NPTkYJCUNBUElDTUQoQ0FQSV9SRVNFVF9CMyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfUkVTRVRfQjNfSU5ECQlDQVBJQ01EKENBUElfUkVTRVRfQjMsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfUkVTRVRfQjNfUkVTUAkJQ0FQSUNNRChDQVBJX1JFU0VUX0IzLENBUElfUkVTUCkKKworI2RlZmluZSBDQVBJX0xJU1RFTl9SRVEJCQlDQVBJQ01EKENBUElfTElTVEVOLENBUElfUkVRKQorI2RlZmluZSBDQVBJX0xJU1RFTl9DT05GCQlDQVBJQ01EKENBUElfTElTVEVOLENBUElfQ09ORikKKworI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9SRVEJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfTUFOVUZBQ1RVUkVSX0NPTkYJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9DT05GKQorI2RlZmluZSBDQVBJX01BTlVGQUNUVVJFUl9JTkQJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9JTkQpCisjZGVmaW5lIENBUElfTUFOVUZBQ1RVUkVSX1JFU1AJCUNBUElDTUQoQ0FQSV9NQU5VRkFDVFVSRVIsQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfRkFDSUxJVFlfUkVRCQlDQVBJQ01EKENBUElfRkFDSUxJVFksQ0FQSV9SRVEpCisjZGVmaW5lIENBUElfRkFDSUxJVFlfQ09ORgkJQ0FQSUNNRChDQVBJX0ZBQ0lMSVRZLENBUElfQ09ORikKKyNkZWZpbmUgQ0FQSV9GQUNJTElUWV9JTkQJCUNBUElDTUQoQ0FQSV9GQUNJTElUWSxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9GQUNJTElUWV9SRVNQCQlDQVBJQ01EKENBUElfRkFDSUxJVFksQ0FQSV9SRVNQKQorCisjZGVmaW5lIENBUElfSU5GT19SRVEJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX1JFUSkKKyNkZWZpbmUgQ0FQSV9JTkZPX0NPTkYJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX0NPTkYpCisjZGVmaW5lIENBUElfSU5GT19JTkQJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX0lORCkKKyNkZWZpbmUgQ0FQSV9JTkZPX1JFU1AJCQlDQVBJQ01EKENBUElfSU5GTyxDQVBJX1JFU1ApCisKKyNlbmRpZgkJCQkvKiBfX0NBUElDTURfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fZGl2ZXJ0aWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9kaXZlcnRpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmY3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5fZGl2ZXJ0aWYuaApAQCAtMCwwICsxLDI2IEBACisvKiAkSWQ6IGlzZG5fZGl2ZXJ0aWYuaCx2IDEuNC42LjEgMjAwMS8wOS8yMyAyMjoyNTowNSBrYWkgRXhwICQKKyAqCisgKiBIZWFkZXIgZm9yIHRoZSBkaXZlcnNpb24gc3VwcGxlbWVudGFyeSBpbnRlcmZhY2UgZm9yIGk0bC4KKyAqCisgKiBBdXRob3IgICAgV2VybmVyIENvcm5lbGl1cyAod2VybmVyQHRpdHJvLmRlKQorICogQ29weXJpZ2h0IGJ5IFdlcm5lciBDb3JuZWxpdXMgKHdlcm5lckB0aXRyby5kZSkKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hZ2ljIHZhbHVlIGlzIGFsc28gdXNlZCB0byBjb250cm9sIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRElWRVJUX0lGX01BR0lDIDB4MjU4NzM0MDEKKyNkZWZpbmUgRElWRVJUX0NNRF9SRUcgIDB4MDAgIC8qIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKyNkZWZpbmUgRElWRVJUX0NNRF9SRUwgIDB4MDEgIC8qIHJlbGVhc2UgY29tbWFuZCAqLworI2RlZmluZSBESVZFUlRfTk9fRVJSICAgMHgwMCAgLyogcmV0dXJuIHZhbHVlIG5vIGVycm9yICovCisjZGVmaW5lIERJVkVSVF9DTURfRVJSICAweDAxICAvKiBpbnZhbGlkIGNtZCAqLworI2RlZmluZSBESVZFUlRfVkVSX0VSUiAgMHgwMiAgLyogbWFnaWMvdmVyc2lvbiBpbnZhbGlkICovCisjZGVmaW5lIERJVkVSVF9SRUdfRVJSICAweDAzICAvKiBtb2R1bGUgYWxyZWFkeSByZWdpc3RlcmVkICovCisjZGVmaW5lIERJVkVSVF9SRUxfRVJSICAweDA0ICAvKiBtb2R1bGUgbm90IHJlZ2lzdGVyZWQgKi8KKyNkZWZpbmUgRElWRVJUX1JFR19OQU1FIGlzZG5fcmVnaXN0ZXJfZGl2ZXJ0CisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9wcHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbl9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJiMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc2RuX3BwcC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIExpbnV4IElTRE4gc3Vic3lzdGVtLCBzeW5jIFBQUCwgaW50ZXJmYWNlIHRvIGlwcHBkCisgKgorICogQ29weXJpZ2h0IDE5OTQtMTk5OSAgYnkgRnJpdHogRWxmZXJ0IChmcml0ekBpc2RuNGxpbnV4LmRlKQorICogQ29weXJpZ2h0IDE5OTUsOTYgICAgVGhpbmtpbmcgT2JqZWN0cyBTb2Z0d2FyZSBHbWJIIFd1ZXJ6YnVyZworICogQ29weXJpZ2h0IDE5OTUsOTYgICAgYnkgTWljaGFlbCBIaXBwIChNaWNoYWVsLkhpcHBAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlKQorICogQ29weXJpZ2h0IDIwMDAtMjAwMiAgYnkgS2FpIEdlcm1hc2NoZXdza2kgKGthaUBnZXJtYXNjaGV3c2tpLm5hbWUpCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfSVNETl9QUFBfSAorI2RlZmluZSBfTElOVVhfSVNETl9QUFBfSAorCisjZGVmaW5lIENBTExUWVBFX0lOQ09NSU5HIDB4MQorI2RlZmluZSBDQUxMVFlQRV9PVVRHT0lORyAweDIKKyNkZWZpbmUgQ0FMTFRZUEVfQ0FMTEJBQ0sgMHg0CisKKyNkZWZpbmUgSVBQUF9WRVJTSU9OICAgICIyLjIuMCIKKworc3RydWN0IHBwcGNhbGxpbmZvCit7CisgIGludCBjYWxsdHlwZTsKKyAgdW5zaWduZWQgY2hhciBsb2NhbF9udW1bNjRdOworICB1bnNpZ25lZCBjaGFyIHJlbW90ZV9udW1bNjRdOworICBpbnQgY2hhcmdlX3VuaXRzOworfTsKKworI2RlZmluZSBQUFBJT0NHQ0FMTElORk8gX0lPV1IoJ3QnLDEyOCxzdHJ1Y3QgcHBwY2FsbGluZm8pCisjZGVmaW5lIFBQUElPQ0JVTkRMRSAgIF9JT1coJ3QnLDEyOSxpbnQpCisjZGVmaW5lIFBQUElPQ0dNUEZMQUdTIF9JT1IoJ3QnLDEzMCxpbnQpCisjZGVmaW5lIFBQUElPQ1NNUEZMQUdTIF9JT1coJ3QnLDEzMSxpbnQpCisjZGVmaW5lIFBQUElPQ1NNUE1UVSAgIF9JT1coJ3QnLDEzMixpbnQpCisjZGVmaW5lIFBQUElPQ1NNUE1SVSAgIF9JT1coJ3QnLDEzMyxpbnQpCisjZGVmaW5lIFBQUElPQ0dDT01QUkVTU09SUyBfSU9SKCd0JywxMzQsdW5zaWduZWQgbG9uZyBbOF0pCisjZGVmaW5lIFBQUElPQ1NDT01QUkVTU09SIF9JT1coJ3QnLDEzNSxpbnQpCisjZGVmaW5lIFBQUElPQ0dJRk5BTUUgICAgICBfSU9SKCd0JywxMzYsIGNoYXIgW0lGTkFNU0laXSApCisKKworI2RlZmluZSBTQ19NUF9QUk9UICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU0NfUkVKX01QX1BST1QgICAweDAwMDAwNDAwCisjZGVmaW5lIFNDX09VVF9TSE9SVF9TRVEgMHgwMDAwMDgwMAorI2RlZmluZSBTQ19JTl9TSE9SVF9TRVEgIDB4MDAwMDQwMDAKKworI2RlZmluZSBTQ19ERUNPTVBfT04JCTB4MDEKKyNkZWZpbmUgU0NfQ09NUF9PTgkJMHgwMgorI2RlZmluZSBTQ19ERUNPTVBfRElTQ0FSRAkweDA0CisjZGVmaW5lIFNDX0NPTVBfRElTQ0FSRAkJMHgwOAorI2RlZmluZSBTQ19MSU5LX0RFQ09NUF9PTgkweDEwCisjZGVmaW5lIFNDX0xJTktfQ09NUF9PTgkJMHgyMAorI2RlZmluZSBTQ19MSU5LX0RFQ09NUF9ESVNDQVJECTB4NDAKKyNkZWZpbmUgU0NfTElOS19DT01QX0RJU0NBUkQJMHg4MAorCisjZGVmaW5lIElTRE5fUFBQX0NPTVBfTUFYX09QVElPTlMgMTYKKworI2RlZmluZSBJUFBQX0NPTVBfRkxBR19YTUlUIDB4MQorI2RlZmluZSBJUFBQX0NPTVBfRkxBR19MSU5LIDB4MgorCitzdHJ1Y3QgaXNkbl9wcHBfY29tcF9kYXRhIHsKKyAgaW50IG51bTsKKyAgdW5zaWduZWQgY2hhciBvcHRpb25zW0lTRE5fUFBQX0NPTVBfTUFYX09QVElPTlNdOworICBpbnQgb3B0bGVuOworICBpbnQgZmxhZ3M7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0lTRE5fUFBQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXNkbmlmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjFiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzZG5pZi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qICRJZDogaXNkbmlmLmgsdiAxLjQzLjIuMiAyMDA0LzAxLzEyIDIzOjA4OjM1IGtlaWwgRXhwICQKKyAqCisgKiBMaW51eCBJU0ROIHN1YnN5c3RlbQorICogRGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN1YnN5c3RlbSBhbmQgaXRzIGxvdy1sZXZlbCBkcml2ZXJzLgorICoKKyAqIENvcHlyaWdodCAxOTk0LDk1LDk2IGJ5IEZyaXR6IEVsZmVydCAoZnJpdHpAaXNkbjRsaW51eC5kZSkKKyAqIENvcHlyaWdodCAxOTk1LDk2ICAgIFRoaW5raW5nIE9iamVjdHMgU29mdHdhcmUgR21iSCBXdWVyemJ1cmcKKyAqIAorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0lTRE5JRl9IX18KKyNkZWZpbmUgX19JU0ROSUZfSF9fCisKKworLyoKKyAqIFZhbHVlcyBmb3IgZ2VuZXJhbCBwcm90b2NvbC1zZWxlY3Rpb24KKyAqLworI2RlZmluZSBJU0ROX1BUWVBFX1VOS05PV04gICAwICAgLyogUHJvdG9jb2wgdW5kZWZpbmVkICAgKi8KKyNkZWZpbmUgSVNETl9QVFlQRV8xVFI2ICAgICAgMSAgIC8qIGdlcm1hbiAxVFI2LXByb3RvY29sICovCisjZGVmaW5lIElTRE5fUFRZUEVfRVVSTyAgICAgIDIgICAvKiBFRFNTMS1wcm90b2NvbCAgICAgICAqLworI2RlZmluZSBJU0ROX1BUWVBFX0xFQVNFRCAgICAzICAgLyogZm9yIGxlYXNlZCBsaW5lcyAgICAgKi8KKyNkZWZpbmUgSVNETl9QVFlQRV9OSTEgICAgICAgNCAgIC8qIFVTIE5JLTEgcHJvdG9jb2wgICAgICovCisjZGVmaW5lIElTRE5fUFRZUEVfTUFYICAgICAgIDcgICAvKiBNYXguIDggUHJvdG9jb2xzICAgICAqLworCisvKgorICogVmFsdWVzIGZvciBMYXllci0yLXByb3RvY29sLXNlbGVjdGlvbgorICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfWDc1SSAgIDAgICAvKiBYNzUvTEFQQiB3aXRoIEktRnJhbWVzICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9YNzVVSSAgMSAgIC8qIFg3NS9MQVBCIHdpdGggVUktRnJhbWVzICAgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1g3NUJVSSAyICAgLyogWDc1L0xBUEIgd2l0aCBVSS1GcmFtZXMgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfSERMQyAgIDMgICAvKiBIRExDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9UUkFOUyAgNCAgIC8qIFRyYW5zcGFyZW50IChWb2ljZSkgICAgICAgICAgICAgICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1gyNURURSA1ICAgLyogWDI1L0xBUEIgRFRFIG1vZGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfWDI1RENFIDYgICAvKiBYMjUvTEFQQiBEQ0UgbW9kZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9WMTEwOTYgNyAgIC8qIFYuMTEwIGJpdHJhdGUgYWRhcHRpb24gOTYwMCBCYXVkICAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX1YxMTAxOSA4ICAgLyogVi4xMTAgYml0cmF0ZSBhZGFwdGlvbiAxOTIwMCBCYXVkICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfVjExMDM4IDkgICAvKiBWLjExMCBiaXRyYXRlIGFkYXB0aW9uIDM4NDAwIEJhdWQgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9NT0RFTSAgMTAgIC8qIEFuYWxvZyBNb2RlbSBvbiBCb2FyZCAqLworI2RlZmluZSBJU0ROX1BST1RPX0wyX0ZBWCAgICAxMSAgLyogRmF4IEdyb3VwIDIvMyAgICAgICAgICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDJfSERMQ181NksgMTIgICAvKiBIRExDIDU2ayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MMl9NQVggICAgMTUgIC8qIE1heC4gMTYgUHJvdG9jb2xzICAgICAgICAgICAgICAgICAqLworCisvKgorICogVmFsdWVzIGZvciBMYXllci0zLXByb3RvY29sLXNlbGVjdGlvbgorICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDNfVFJBTlMJMAkvKiBUcmFuc3BhcmVudCAqLworI2RlZmluZSBJU0ROX1BST1RPX0wzX1RSQU5TRFNQCTEJLyogVHJhbnNwYXJlbnQgd2l0aCBEU1AgKi8KKyNkZWZpbmUgSVNETl9QUk9UT19MM19GQ0xBU1MyCTIJLyogRmF4IEdyb3VwIDIvMyBDTEFTUyAyICovCisjZGVmaW5lIElTRE5fUFJPVE9fTDNfRkNMQVNTMQkzCS8qIEZheCBHcm91cCAyLzMgQ0xBU1MgMSAqLworI2RlZmluZSBJU0ROX1BST1RPX0wzX01BWAk3CS8qIE1heC4gOCBQcm90b2NvbHMgKi8KKworCisjZW5kaWYgLyogX19JU0ROSUZfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2lzb19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc29fZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg4YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9pc29fZnMuaApAQCAtMCwwICsxLDE2NSBAQAorI2lmbmRlZiBfSVNPRlNfRlNfSAorI2RlZmluZSBfSVNPRlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisvKgorICogVGhlIGlzb2ZzIGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKKyAqLworCisvKiBUaGlzIHBhcnQgYm9ycm93ZWQgZnJvbSB0aGUgYnNkMzg2IGlzb2ZzICovCisjZGVmaW5lIElTT0RDTChmcm9tLCB0bykgKHRvIC0gZnJvbSArIDEpCisKK3N0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgeworCWNoYXIgdHlwZVtJU09EQ0woMSwxKV07IC8qIDcxMSAqLworCWNoYXIgaWRbSVNPRENMKDIsNildOworCWNoYXIgdmVyc2lvbltJU09EQ0woNyw3KV07CisJY2hhciBkYXRhW0lTT0RDTCg4LDIwNDgpXTsKK307CisKKy8qIHZvbHVtZSBkZXNjcmlwdG9yIHR5cGVzICovCisjZGVmaW5lIElTT19WRF9QUklNQVJZIDEKKyNkZWZpbmUgSVNPX1ZEX1NVUFBMRU1FTlRBUlkgMgorI2RlZmluZSBJU09fVkRfRU5EIDI1NQorCisjZGVmaW5lIElTT19TVEFOREFSRF9JRCAiQ0QwMDEiCisKK3N0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yIHsKKwljaGFyIHR5cGUJCQlbSVNPRENMICggIDEsICAgMSldOyAvKiA3MTEgKi8KKwljaGFyIGlkCQkJCVtJU09EQ0wgKCAgMiwgICA2KV07CisJY2hhciB2ZXJzaW9uCQkJW0lTT0RDTCAoICA3LCAgIDcpXTsgLyogNzExICovCisJY2hhciB1bnVzZWQxCQkJW0lTT0RDTCAoICA4LCAgIDgpXTsKKwljaGFyIHN5c3RlbV9pZAkJCVtJU09EQ0wgKCAgOSwgIDQwKV07IC8qIGFjaGFycyAqLworCWNoYXIgdm9sdW1lX2lkCQkJW0lTT0RDTCAoIDQxLCAgNzIpXTsgLyogZGNoYXJzICovCisJY2hhciB1bnVzZWQyCQkJW0lTT0RDTCAoIDczLCAgODApXTsKKwljaGFyIHZvbHVtZV9zcGFjZV9zaXplCQlbSVNPRENMICggODEsICA4OCldOyAvKiA3MzMgKi8KKwljaGFyIHVudXNlZDMJCQlbSVNPRENMICggODksIDEyMCldOworCWNoYXIgdm9sdW1lX3NldF9zaXplCQlbSVNPRENMICgxMjEsIDEyNCldOyAvKiA3MjMgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMTI1LCAxMjgpXTsgLyogNzIzICovCisJY2hhciBsb2dpY2FsX2Jsb2NrX3NpemUJCVtJU09EQ0wgKDEyOSwgMTMyKV07IC8qIDcyMyAqLworCWNoYXIgcGF0aF90YWJsZV9zaXplCQlbSVNPRENMICgxMzMsIDE0MCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGVfbF9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDEsIDE0NCldOyAvKiA3MzEgKi8KKwljaGFyIG9wdF90eXBlX2xfcGF0aF90YWJsZQlbSVNPRENMICgxNDUsIDE0OCldOyAvKiA3MzEgKi8KKwljaGFyIHR5cGVfbV9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDksIDE1MildOyAvKiA3MzIgKi8KKwljaGFyIG9wdF90eXBlX21fcGF0aF90YWJsZQlbSVNPRENMICgxNTMsIDE1NildOyAvKiA3MzIgKi8KKwljaGFyIHJvb3RfZGlyZWN0b3J5X3JlY29yZAlbSVNPRENMICgxNTcsIDE5MCldOyAvKiA5LjEgKi8KKwljaGFyIHZvbHVtZV9zZXRfaWQJCVtJU09EQ0wgKDE5MSwgMzE4KV07IC8qIGRjaGFycyAqLworCWNoYXIgcHVibGlzaGVyX2lkCQlbSVNPRENMICgzMTksIDQ0NildOyAvKiBhY2hhcnMgKi8KKwljaGFyIHByZXBhcmVyX2lkCQlbSVNPRENMICg0NDcsIDU3NCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIGFwcGxpY2F0aW9uX2lkCQlbSVNPRENMICg1NzUsIDcwMildOyAvKiBhY2hhcnMgKi8KKwljaGFyIGNvcHlyaWdodF9maWxlX2lkCQlbSVNPRENMICg3MDMsIDczOSldOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBhYnN0cmFjdF9maWxlX2lkCQlbSVNPRENMICg3NDAsIDc3NildOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBiaWJsaW9ncmFwaGljX2ZpbGVfaWQJW0lTT0RDTCAoNzc3LCA4MTMpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgY3JlYXRpb25fZGF0ZQkJW0lTT0RDTCAoODE0LCA4MzApXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIG1vZGlmaWNhdGlvbl9kYXRlCQlbSVNPRENMICg4MzEsIDg0NyldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZXhwaXJhdGlvbl9kYXRlCQlbSVNPRENMICg4NDgsIDg2NCldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZWZmZWN0aXZlX2RhdGUJCVtJU09EQ0wgKDg2NSwgODgxKV07IC8qIDguNC4yNi4xICovCisJY2hhciBmaWxlX3N0cnVjdHVyZV92ZXJzaW9uCVtJU09EQ0wgKDg4MiwgODgyKV07IC8qIDcxMSAqLworCWNoYXIgdW51c2VkNAkJCVtJU09EQ0wgKDg4MywgODgzKV07CisJY2hhciBhcHBsaWNhdGlvbl9kYXRhCQlbSVNPRENMICg4ODQsIDEzOTUpXTsKKwljaGFyIHVudXNlZDUJCQlbSVNPRENMICgxMzk2LCAyMDQ4KV07Cit9OworCisvKiBBbG1vc3QgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkgZGVzY3JpcHRvciBidXQgdHdvIGZpZWxkcyBhcmUgc3BlY2lmaWVkICovCitzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciB7CisJY2hhciB0eXBlCQkJW0lTT0RDTCAoICAxLCAgIDEpXTsgLyogNzExICovCisJY2hhciBpZAkJCQlbSVNPRENMICggIDIsICAgNildOworCWNoYXIgdmVyc2lvbgkJCVtJU09EQ0wgKCAgNywgICA3KV07IC8qIDcxMSAqLworCWNoYXIgZmxhZ3MJCQlbSVNPRENMICggIDgsICAgOCldOyAvKiA4NTMgKi8KKwljaGFyIHN5c3RlbV9pZAkJCVtJU09EQ0wgKCAgOSwgIDQwKV07IC8qIGFjaGFycyAqLworCWNoYXIgdm9sdW1lX2lkCQkJW0lTT0RDTCAoIDQxLCAgNzIpXTsgLyogZGNoYXJzICovCisJY2hhciB1bnVzZWQyCQkJW0lTT0RDTCAoIDczLCAgODApXTsKKwljaGFyIHZvbHVtZV9zcGFjZV9zaXplCQlbSVNPRENMICggODEsICA4OCldOyAvKiA3MzMgKi8KKwljaGFyIGVzY2FwZQkJCVtJU09EQ0wgKCA4OSwgMTIwKV07IC8qIDg1NiAqLworCWNoYXIgdm9sdW1lX3NldF9zaXplCQlbSVNPRENMICgxMjEsIDEyNCldOyAvKiA3MjMgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMTI1LCAxMjgpXTsgLyogNzIzICovCisJY2hhciBsb2dpY2FsX2Jsb2NrX3NpemUJCVtJU09EQ0wgKDEyOSwgMTMyKV07IC8qIDcyMyAqLworCWNoYXIgcGF0aF90YWJsZV9zaXplCQlbSVNPRENMICgxMzMsIDE0MCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGVfbF9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDEsIDE0NCldOyAvKiA3MzEgKi8KKwljaGFyIG9wdF90eXBlX2xfcGF0aF90YWJsZQlbSVNPRENMICgxNDUsIDE0OCldOyAvKiA3MzEgKi8KKwljaGFyIHR5cGVfbV9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDksIDE1MildOyAvKiA3MzIgKi8KKwljaGFyIG9wdF90eXBlX21fcGF0aF90YWJsZQlbSVNPRENMICgxNTMsIDE1NildOyAvKiA3MzIgKi8KKwljaGFyIHJvb3RfZGlyZWN0b3J5X3JlY29yZAlbSVNPRENMICgxNTcsIDE5MCldOyAvKiA5LjEgKi8KKwljaGFyIHZvbHVtZV9zZXRfaWQJCVtJU09EQ0wgKDE5MSwgMzE4KV07IC8qIGRjaGFycyAqLworCWNoYXIgcHVibGlzaGVyX2lkCQlbSVNPRENMICgzMTksIDQ0NildOyAvKiBhY2hhcnMgKi8KKwljaGFyIHByZXBhcmVyX2lkCQlbSVNPRENMICg0NDcsIDU3NCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIGFwcGxpY2F0aW9uX2lkCQlbSVNPRENMICg1NzUsIDcwMildOyAvKiBhY2hhcnMgKi8KKwljaGFyIGNvcHlyaWdodF9maWxlX2lkCQlbSVNPRENMICg3MDMsIDczOSldOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBhYnN0cmFjdF9maWxlX2lkCQlbSVNPRENMICg3NDAsIDc3NildOyAvKiA3LjUgZGNoYXJzICovCisJY2hhciBiaWJsaW9ncmFwaGljX2ZpbGVfaWQJW0lTT0RDTCAoNzc3LCA4MTMpXTsgLyogNy41IGRjaGFycyAqLworCWNoYXIgY3JlYXRpb25fZGF0ZQkJW0lTT0RDTCAoODE0LCA4MzApXTsgLyogOC40LjI2LjEgKi8KKwljaGFyIG1vZGlmaWNhdGlvbl9kYXRlCQlbSVNPRENMICg4MzEsIDg0NyldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZXhwaXJhdGlvbl9kYXRlCQlbSVNPRENMICg4NDgsIDg2NCldOyAvKiA4LjQuMjYuMSAqLworCWNoYXIgZWZmZWN0aXZlX2RhdGUJCVtJU09EQ0wgKDg2NSwgODgxKV07IC8qIDguNC4yNi4xICovCisJY2hhciBmaWxlX3N0cnVjdHVyZV92ZXJzaW9uCVtJU09EQ0wgKDg4MiwgODgyKV07IC8qIDcxMSAqLworCWNoYXIgdW51c2VkNAkJCVtJU09EQ0wgKDg4MywgODgzKV07CisJY2hhciBhcHBsaWNhdGlvbl9kYXRhCQlbSVNPRENMICg4ODQsIDEzOTUpXTsKKwljaGFyIHVudXNlZDUJCQlbSVNPRENMICgxMzk2LCAyMDQ4KV07Cit9OworCisKKyNkZWZpbmUgSFNfU1RBTkRBUkRfSUQgIkNEUk9NIgorCitzdHJ1Y3QgIGhzX3ZvbHVtZV9kZXNjcmlwdG9yIHsKKwljaGFyIGZvbwkJCVtJU09EQ0wgKCAgMSwgICA4KV07IC8qIDczMyAqLworCWNoYXIgdHlwZQkJCVtJU09EQ0wgKCAgOSwgICA5KV07IC8qIDcxMSAqLworCWNoYXIgaWQJCQkJW0lTT0RDTCAoIDEwLCAgMTQpXTsKKwljaGFyIHZlcnNpb24JCQlbSVNPRENMICggMTUsICAxNSldOyAvKiA3MTEgKi8KKwljaGFyIGRhdGFbSVNPRENMKDE2LDIwNDgpXTsKK307CisKKworc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciB7CisJY2hhciBmb28JCQlbSVNPRENMICggIDEsICAgOCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGUJCQlbSVNPRENMICggIDksICAgOSldOyAvKiA3MTEgKi8KKwljaGFyIGlkCQkJCVtJU09EQ0wgKCAxMCwgIDE0KV07CisJY2hhciB2ZXJzaW9uCQkJW0lTT0RDTCAoIDE1LCAgMTUpXTsgLyogNzExICovCisJY2hhciB1bnVzZWQxCQkJW0lTT0RDTCAoIDE2LCAgMTYpXTsgLyogNzExICovCisJY2hhciBzeXN0ZW1faWQJCQlbSVNPRENMICggMTcsICA0OCldOyAvKiBhY2hhcnMgKi8KKwljaGFyIHZvbHVtZV9pZAkJCVtJU09EQ0wgKCA0OSwgIDgwKV07IC8qIGRjaGFycyAqLworCWNoYXIgdW51c2VkMgkJCVtJU09EQ0wgKCA4MSwgIDg4KV07IC8qIDczMyAqLworCWNoYXIgdm9sdW1lX3NwYWNlX3NpemUJCVtJU09EQ0wgKCA4OSwgIDk2KV07IC8qIDczMyAqLworCWNoYXIgdW51c2VkMwkJCVtJU09EQ0wgKCA5NywgMTI4KV07IC8qIDczMyAqLworCWNoYXIgdm9sdW1lX3NldF9zaXplCQlbSVNPRENMICgxMjksIDEzMildOyAvKiA3MjMgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMTMzLCAxMzYpXTsgLyogNzIzICovCisJY2hhciBsb2dpY2FsX2Jsb2NrX3NpemUJCVtJU09EQ0wgKDEzNywgMTQwKV07IC8qIDcyMyAqLworCWNoYXIgcGF0aF90YWJsZV9zaXplCQlbSVNPRENMICgxNDEsIDE0OCldOyAvKiA3MzMgKi8KKwljaGFyIHR5cGVfbF9wYXRoX3RhYmxlCQlbSVNPRENMICgxNDksIDE1MildOyAvKiA3MzEgKi8KKwljaGFyIHVudXNlZDQJCQlbSVNPRENMICgxNTMsIDE4MCldOyAvKiA3MzMgKi8KKwljaGFyIHJvb3RfZGlyZWN0b3J5X3JlY29yZAlbSVNPRENMICgxODEsIDIxNCldOyAvKiA5LjEgKi8KK307CisKKy8qIFdlIHVzZSB0aGlzIHRvIGhlbHAgdXMgbG9vayB1cCB0aGUgcGFyZW50IGlub2RlIG51bWJlcnMuICovCisKK3N0cnVjdCBpc29fcGF0aF90YWJsZXsKKwl1bnNpZ25lZCBjaGFyICBuYW1lX2xlblsyXTsJLyogNzIxICovCisJY2hhciBleHRlbnRbNF07CQkvKiA3MzEgKi8KKwljaGFyICBwYXJlbnRbMl07CS8qIDcyMSAqLworCWNoYXIgbmFtZVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIGhpZ2ggc2llcnJhIGlzIGlkZW50aWNhbCB0byBpc28sIGV4Y2VwdCB0aGF0IHRoZSBkYXRlIGlzIG9ubHkgNiBieXRlcywgYW5kCisgICB0aGVyZSBpcyBhbiBleHRyYSByZXNlcnZlZCBieXRlIGFmdGVyIHRoZSBmbGFncyAqLworCitzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgeworCWNoYXIgbGVuZ3RoCQkJW0lTT0RDTCAoMSwgMSldOyAvKiA3MTEgKi8KKwljaGFyIGV4dF9hdHRyX2xlbmd0aAkJW0lTT0RDTCAoMiwgMildOyAvKiA3MTEgKi8KKwljaGFyIGV4dGVudAkJCVtJU09EQ0wgKDMsIDEwKV07IC8qIDczMyAqLworCWNoYXIgc2l6ZQkJCVtJU09EQ0wgKDExLCAxOCldOyAvKiA3MzMgKi8KKwljaGFyIGRhdGUJCQlbSVNPRENMICgxOSwgMjUpXTsgLyogNyBieSA3MTEgKi8KKwljaGFyIGZsYWdzCQkJW0lTT0RDTCAoMjYsIDI2KV07CisJY2hhciBmaWxlX3VuaXRfc2l6ZQkJW0lTT0RDTCAoMjcsIDI3KV07IC8qIDcxMSAqLworCWNoYXIgaW50ZXJsZWF2ZQkJCVtJU09EQ0wgKDI4LCAyOCldOyAvKiA3MTEgKi8KKwljaGFyIHZvbHVtZV9zZXF1ZW5jZV9udW1iZXIJW0lTT0RDTCAoMjksIDMyKV07IC8qIDcyMyAqLworCXVuc2lnbmVkIGNoYXIgbmFtZV9sZW4JCVtJU09EQ0wgKDMzLCAzMyldOyAvKiA3MTEgKi8KKwljaGFyIG5hbWUJCQlbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIElTT0ZTX0JMT0NLX0JJVFMgMTEKKyNkZWZpbmUgSVNPRlNfQkxPQ0tfU0laRSAyMDQ4CisKKyNkZWZpbmUgSVNPRlNfQlVGRkVSX1NJWkUoSU5PREUpICgoSU5PREUpLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKyNkZWZpbmUgSVNPRlNfQlVGRkVSX0JJVFMoSU5PREUpICgoSU5PREUpLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKQorCisjZW5kaWYgLyogX0lTT0ZTX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXhqdXNlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9peGp1c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4NTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvaXhqdXNlci5oCkBAIC0wLDAgKzEsNzIwIEBACisjaWZuZGVmIF9fTElOVVhfSVhKVVNFUl9ICisjZGVmaW5lIF9fTElOVVhfSVhKVVNFUl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICBpeGp1c2VyLmgKKyAqCisgKiBEZXZpY2UgRHJpdmVyIGZvciBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4ncyBUZWxlcGhvbnkgY2FyZHMKKyAqIGluY2x1ZGluZyB0aGUgSW50ZXJuZXQgUGhvbmVKQUNLLCBJbnRlcm5ldCBQaG9uZUpBQ0sgTGl0ZSwKKyAqIEludGVybmV0IFBob25lSkFDSyBQQ0ksIEludGVybmV0IExpbmVKQUNLLCBJbnRlcm5ldCBQaG9uZUNBUkQgYW5kCisgKiBTbWFydENBQkxFCisgKgorICogICAgKGMpIENvcHlyaWdodCAxOTk5LTIwMDEgIFF1aWNrbmV0IFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOiAgICAgICAgICBFZCBPa2Vyc29uLCA8ZW9rZXJzb25AcXVpY2tuZXQubmV0PgorICogICAgCisgKiBDb250cmlidXRvcnM6ICAgIEdyZWcgSGVybGVpbiwgPGdoZXJsZWluQHF1aWNrbmV0Lm5ldD4KKyAqICAgICAgICAgICAgICAgICAgRGF2aWQgVy4gRXJoYXJ0LCA8ZGVyaGFydEBxdWlja25ldC5uZXQ+CisgKiAgICAgICAgICAgICAgICAgIEpvaG4gU2VsbGVycywgPGpzZWxsZXJzQHF1aWNrbmV0Lm5ldD4KKyAqICAgICAgICAgICAgICAgICAgTWlrZSBQcmVzdG9uLCA8bXByZXN0b25AcXVpY2tuZXQubmV0PgorICoKKyAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhcmR3YXJlIHJlbGF0ZWQgdG8gdGhpcyBkcml2ZXIgY2FuIGJlIGZvdW5kCisgKiBhdCBvdXIgd2Vic2l0ZTogICAgaHR0cDovL3d3dy5xdWlja25ldC5uZXQKKyAqCisgKiBGaXhlczoKKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gQkUgTElBQkxFIFRPIEFOWSBQQVJUWSBGT1IKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwgRVZFTiBJRiBRVUlDS05FVAorICogVEVDSE5PTE9HSUVTLCBJTkMuSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gSEFTIE5PIE9CTElHQVRJT04gCisgKiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsIE9SIE1PRElGSUNBVElPTlMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvdGVsZXBob255Lmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBJT0NUTCdzIHVzZWQgZm9yIHRoZSBRdWlja25ldCBUZWxlcGhvbnkgQ2FyZHMKKyoKKyogSWYgeW91IHVzZSB0aGUgSVhKQ1RMX1RFU1RSQU0gY29tbWFuZCwgdGhlIGNhcmQgbXVzdCBiZSBwb3dlciBjeWNsZWQgdG8KKyogcmVzZXQgdGhlIFNSQU0gdmFsdWVzIGJlZm9yZSBmdXRoZXIgdXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9EU1BfUkVTRVQgCQlfSU8gICgncScsIDB4QzApCisKKyNkZWZpbmUgSVhKQ1RMX1JJTkcgICAgICAgICAgICAgICAgICAgICBQSE9ORV9SSU5HCisjZGVmaW5lIElYSkNUTF9IT09LU1RBVEUgICAgICAgICAgICAgICAgUEhPTkVfSE9PS1NUQVRFCisjZGVmaW5lIElYSkNUTF9NQVhSSU5HUwkJCVBIT05FX01BWFJJTkdTCisjZGVmaW5lIElYSkNUTF9SSU5HX0NBREVOQ0UJCVBIT05FX1JJTkdfQ0FERU5DRQorI2RlZmluZSBJWEpDVExfUklOR19TVEFSVAkJUEhPTkVfUklOR19TVEFSVAorI2RlZmluZSBJWEpDVExfUklOR19TVE9QCQlQSE9ORV9SSU5HX1NUT1AKKworI2RlZmluZSBJWEpDVExfQ0FSRFRZUEUJCQlfSU9SICgncScsIDB4QzEsIGludCkKKyNkZWZpbmUgSVhKQ1RMX1NFUklBTAkJCV9JT1IgKCdxJywgMHhDMiwgaW50KQorI2RlZmluZSBJWEpDVExfRFNQX1RZUEUgICAgICAgICAgICAgICAgIF9JT1IgKCdxJywgMHhDMywgaW50KQorI2RlZmluZSBJWEpDVExfRFNQX1ZFUlNJT04gICAgICAgICAgICAgIF9JT1IgKCdxJywgMHhDNCwgaW50KQorI2RlZmluZSBJWEpDVExfVkVSU0lPTiAgICAgICAgICAgICAgCV9JT1IgKCdxJywgMHhEQSwgY2hhciAqKQorI2RlZmluZSBJWEpDVExfRFNQX0lETEUJCQlfSU8gICgncScsIDB4QzUpCisjZGVmaW5lIElYSkNUTF9URVNUUkFNCQkJX0lPICAoJ3EnLCAweEM2KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZ3JvdXAgb2YgSU9DVExzIGRlYWwgd2l0aCB0aGUgcmVjb3JkIHNldHRpbmdzIG9mIHRoZSBEU1AKKyoKKyogVGhlIElYSkNUTF9SRUNfREVQVEggY29tbWFuZCBzZXRzIHRoZSBpbnRlcm5hbCBidWZmZXIgZGVwdGggb2YgdGhlIERTUC4KKyogU2V0dGluZyBhIGxvd2VyIGRlcHRoIHJlZHVjZXMgbGF0ZW5jeSwgYnV0IGluY3JlYXNlcyB0aGUgZGVtYW5kIG9mIHRoZQorKiBhcHBsaWNhdGlvbiB0byBzZXJ2aWNlIHRoZSBkcml2ZXIgd2l0aG91dCBmcmFtZSBsb3NzLiAgVGhlIERTUCBoYXMgNDgwCisqIGJ5dGVzIG9mIHBoeXNpY2FsIGJ1ZmZlciBtZW1vcnkgZm9yIHRoZSByZWNvcmQgY2hhbm5lbCBzbyB0aGUgdHJ1ZQorKiBtYXhpbXVtIGxpbWl0IGlzIGRldGVybWluZWQgYnkgaG93IG1hbnkgZnJhbWVzIHdpbGwgZml0IGluIHRoZSBidWZmZXIuCisqCisqIDEgdW5jb21wcmVzc2VkICg0ODAgYnl0ZSkgMTYtYml0IGxpbmVhciBmcmFtZS4KKyogMiB1bmNvbXByZXNzZWQgKDI0MCBieXRlKSA4LWJpdCBBLWxhdy9tdS1sYXcgZnJhbWVzLgorKiAxNSBUcnVlU3BlZWNoIDguNSBmcmFtZXMuCisqIDIwIFRydWVTcGVlY2ggNi4zLDUuMyw0Ljggb3IgNC4xIGZyYW1lcy4KKyoKKyogVGhlIGRlZmF1bHQgaW4gdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgc2V0IHRvIDIgZnJhbWVzLgorKgorKiBUaGUgSVhKQ1RMX1JFQ19WT0xVTUUgYW5kIElYSkNUTF9QTEFZX1ZPTFVNRSBjb21tYW5kcyBib3RoIHVzZSBhIFE4CisqIG51bWJlciBhcyBhIHBhcmFtZXRlciwgMHgxMDAgc2NhbGVzIHRoZSBzaWduYWwgYnkgMS4wLCAweDIwMCBzY2FsZXMgdGhlCisqIHNpZ25hbCBieSAyLjAsIDB4ODAgc2NhbGVzIHRoZSBzaWduYWwgYnkgMC41LiAgTm8gcHJvdGVjdGlvbiBpcyBnaXZlbgorKiBhZ2FpbnN0IG92ZXItc2NhbGluZywgaWYgdGhlIG11bHRpcGxpY2F0aW9uIGZhY3RvciB0aW1lcyB0aGUgaW5wdXQKKyogc2lnbmFsIGV4Y2VlZHMgMTYgYml0cywgb3ZlcmZsb3cgZGlzdG9ydGlvbiB3aWxsIG9jY3VyLiAgVGhlIGRlZmF1bHQKKyogc2V0dGluZyBpcyAweDEwMCAoMS4wKS4KKyoKKyogVGhlIElYSkNUTF9SRUNfTEVWRUwgcmV0dXJucyB0aGUgYXZlcmFnZSBzaWduYWwgbGV2ZWwgKG5vdCByLm0ucy4pIG9uCisqIHRoZSBtb3N0IHJlY2VudGx5IHJlY29yZGVkIGZyYW1lIGFzIGEgMTYgYml0IHZhbHVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9SRUNfQ09ERUMgICAgICAgICAgICAgICAgUEhPTkVfUkVDX0NPREVDCisjZGVmaW5lIElYSkNUTF9SRUNfU1RBUlQgICAgICAgICAgICAgICAgUEhPTkVfUkVDX1NUQVJUCisjZGVmaW5lIElYSkNUTF9SRUNfU1RPUCAgICAgICAgICAgICAgICAgUEhPTkVfUkVDX1NUT1AKKyNkZWZpbmUgSVhKQ1RMX1JFQ19ERVBUSAkJUEhPTkVfUkVDX0RFUFRICisjZGVmaW5lIElYSkNUTF9GUkFNRQkJCVBIT05FX0ZSQU1FCisjZGVmaW5lIElYSkNUTF9SRUNfVk9MVU1FCQlQSE9ORV9SRUNfVk9MVU1FCisjZGVmaW5lIElYSkNUTF9SRUNfTEVWRUwJCVBIT05FX1JFQ19MRVZFTAorCit0eXBlZGVmIGVudW0geworCWYzMDBfNjQwID0gNCwgZjMwMF81MDAsIGYxMTAwLCBmMzUwLCBmNDAwLCBmNDgwLCBmNDQwLCBmNjIwLCBmMjBfNTAsCisJZjEzM18yMDAsIGYzMDAsIGYzMDBfNDIwLCBmMzMwLCBmMzAwXzQyNSwgZjMzMF80NDAsIGYzNDAsIGYzNTBfNDAwLAorCWYzNTBfNDQwLCBmMzUwXzQ1MCwgZjM2MCwgZjM4MF80MjAsIGYzOTIsIGY0MDBfNDI1LCBmNDAwXzQ0MCwgZjQwMF80NTAsCisJZjQyMCwgZjQyNSwgZjQyNV80NTAsIGY0MjVfNDc1LCBmNDM1LCBmNDQwXzQ1MCwgZjQ0MF80ODAsIGY0NDUsIGY0NTAsCisJZjQ1MiwgZjQ3NSwgZjQ4MF82MjAsIGY0OTQsIGY1MDAsIGY1MjAsIGY1MjMsIGY1MjUsIGY1NDBfNjYwLCBmNTg3LAorCWY1OTAsIGY2MDAsIGY2NjAsIGY3MDAsIGY3NDAsIGY3NTAsIGY3NTBfMTQ1MCwgZjc3MCwgZjgwMCwgZjgxNiwgZjg1MCwKKwlmODU3XzE2NDUsIGY5MDAsIGY5MDBfMTMwMCwgZjkzNV8xMjE1LCBmOTQxXzE0NzcsIGY5NDIsIGY5NTAsIGY5NTBfMTQwMCwKKwlmOTc1LCBmMTAwMCwgZjEwMjAsIGYxMDUwLCBmMTEwMF8xNzUwLCBmMTE0MCwgZjEyMDAsIGYxMjA5LCBmMTMzMCwgZjEzMzYsCisJbGYxMzY2LCBmMTM4MCwgZjE0MDAsIGYxNDc3LCBmMTYwMCwgZjE2MzNfMTYzOCwgZjE4MDAsIGYxODYwCit9IElYSl9GSUxURVJfRlJFUTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBmaWx0ZXI7CisJSVhKX0ZJTFRFUl9GUkVRIGZyZXE7CisJY2hhciBlbmFibGU7Cit9IElYSl9GSUxURVI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGVuYWJsZTsKKwljaGFyIGVuX2ZpbHRlcjsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyOworCXVuc2lnbmVkIGludCBvbjE7CisJdW5zaWduZWQgaW50IG9mZjE7CisJdW5zaWduZWQgaW50IG9uMjsKKwl1bnNpZ25lZCBpbnQgb2ZmMjsKKwl1bnNpZ25lZCBpbnQgb24zOworCXVuc2lnbmVkIGludCBvZmYzOworfSBJWEpfRklMVEVSX0NBREVOQ0U7CisKKyNkZWZpbmUgSVhKQ1RMX1NFVF9GSUxURVIJCV9JT1cgKCdxJywgMHhDNywgSVhKX0ZJTFRFUiAqKQorI2RlZmluZSBJWEpDVExfU0VUX0ZJTFRFUl9SQVcJCV9JT1cgKCdxJywgMHhERCwgSVhKX0ZJTFRFUl9SQVcgKikKKyNkZWZpbmUgSVhKQ1RMX0dFVF9GSUxURVJfSElTVAkJX0lPVyAoJ3EnLCAweEM4LCBpbnQpCisjZGVmaW5lIElYSkNUTF9GSUxURVJfQ0FERU5DRQkJX0lPVyAoJ3EnLCAweEQ2LCBJWEpfRklMVEVSX0NBREVOQ0UgKikKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfQ0lECQkJX0lPICAoJ3EnLCAweEQ3KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIElPQ1RMIGFsbG93cyB5b3UgdG8gcmVhc3NpZ24gdmFsdWVzIGluIHRoZSB0b25lIGluZGV4IHRhYmxlLiAgVGhlCisqIHRvbmUgdGFibGUgaGFzIDMyIGVudHJpZXMgKDAgLSAzMSksIGJ1dCB0aGUgZHJpdmVyIG9ubHkgYWxsb3dzIGVudHJpZXMKKyogMTMgLSAyNyB0byBiZSBtb2RpZmllZCwgZW50cnkgMCBpcyByZXNlcnZlZCBmb3Igc2lsZW5jZSBhbmQgMSAtIDEyIGFyZQorKiB0aGUgc3RhbmRhcmQgRFRNRiBkaWdpdHMgYW5kIDI4IC0gMzEgYXJlIHRoZSBEVE1GIHRvbmVzIGZvciBBLCBCLCBDICYgRC4KKyogVGhlIHBvc2l0aW9ucyB1c2VkIGludGVybmFsbHkgZm9yIENhbGwgUHJvZ3Jlc3MgVG9uZXMgYXJlIGFzIGZvbGxvd3M6CisqICAgIERpYWwgVG9uZSAgIC0gMjUKKyogICAgUmluZyBCYWNrICAgLSAyNgorKiAgICBCdXN5IFNpZ25hbCAtIDI3CisqCisqIFRoZSBmcmVxIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBhczoKKyogZnJlcSA9IGNvcygyICogUEkgKiBmcmVxdWVuY3kgLyA4MDAwKQorKgorKiBUaGUgbW9zdCBjb21tb25seSBuZWVkZWQgdmFsdWVzIGFyZSBhbHJlYWR5IGNhbGN1bGF0ZWQgYW5kIGxpc3RlZCBpbiB0aGUKKyogZW51bSBJWEpfVE9ORV9GUkVRLiAgRWFjaCB0b25lIGluZGV4IGNhbiBoYXZlIHR3byBmcmVxdWVuY2llcyB3aXRoCisqIGRpZmZlcmVudCBnYWlucywgaWYgeW91IGFyZSBvbmx5IHVzaW5nIGEgc2luZ2xlIGZyZXF1ZW5jeSBzZXQgdGhlIHVudXNlZAorKiBvbmUgdG8gMC4KKyoKKyogVGhlIGdhaW4gdmFsdWVzIHJhbmdlIGZyb20gMCB0byAxNSBpbmRpY2F0aW5nICs2ZEIgdG8gLTI0ZEIgaW4gMmRCCisqIGluY3JlbWVudHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisJaHoyMCA9IDB4N2ZmYSwKKwloejUwID0gMHg3ZmU1LAorCWh6MTMzID0gMHg3ZjRjLAorCWh6MjAwID0gMHg3ZTZiLAorCWh6MjYxID0gMHg3ZDUwLAkJLyogLjYzIEMxICAqLworCWh6Mjc3ID0gMHg3Y2ZhLAkJLyogLjE4IENTMSAqLworCWh6MjkzID0gMHg3YzlmLAkJLyogLjY2IEQxICAqLworCWh6MzAwID0gMHg3Yzc1LAorCWh6MzExID0gMHg3YzMyLAkJLyogLjEzIERTMSAqLworCWh6MzI5ID0gMHg3YmJmLAkJLyogLjYzIEUxICAqLworCWh6MzMwID0gMHg3YmI4LAorCWh6MzQwID0gMHg3Yjc1LAorCWh6MzQ5ID0gMHg3YjM3LAkJLyogLjIzIEYxICAqLworCWh6MzUwID0gMHg3YjMwLAorCWh6MzYwID0gMHg3YWU5LAorCWh6MzY5ID0gMHg3YWE4LAkJLyogLjk5IEZTMSAqLworCWh6MzgwID0gMHg3YTU2LAorCWh6MzkyID0gMHg3OWZhLAkJLyogLjAwIEcxICAqLworCWh6NDAwID0gMHg3OWJiLAorCWh6NDE1ID0gMHg3OTQxLAkJLyogLjMwIEdTMSAqLworCWh6NDIwID0gMHg3OTE4LAorCWh6NDI1ID0gMHg3OGVlLAorCWh6NDM1ID0gMHg3ODk5LAorCWh6NDQwID0gMHg3ODZkLAkJLyogLjAwIEExICAqLworCWh6NDQ1ID0gMHg3ODQyLAorCWh6NDUwID0gMHg3ODE1LAorCWh6NDUyID0gMHg3ODAzLAorCWh6NDY2ID0gMHg3Nzg0LAkJLyogLjE2IEFTMSAqLworCWh6NDc1ID0gMHg3NzMxLAorCWh6NDgwID0gMHg3NzAxLAorCWh6NDkzID0gMHg3Njg1LAkJLyogLjg4IEIxICAqLworCWh6NDk0ID0gMHg3NjdiLAorCWh6NTAwID0gMHg3NjQwLAorCWh6NTIwID0gMHg3NTc4LAorCWh6NTIzID0gMHg3NTU5LAkJLyogLjI1IEMyICAqLworCWh6NTI1ID0gMHg3NTQ0LAorCWh6NTQwID0gMHg3NGE3LAorCWh6NTU0ID0gMHg3NDExLAkJLyogLjM3IENTMiAqLworCWh6NTg3ID0gMHg3MmExLAkJLyogLjMzIEQyICAqLworCWh6NTkwID0gMHg3MjdmLAorCWh6NjAwID0gMHg3MjBiLAorCWh6NjIwID0gMHg3MTFlLAorCWh6NjIyID0gMHg3MTA2LAkJLyogLjI1IERTMiAqLworCWh6NjU5ID0gMHg2ZjNiLAkJLyogLjI2IEUyICAqLworCWh6NjYwID0gMHg2ZjJlLAorCWh6Njk4ID0gMHg2ZDNkLAkJLyogLjQ2IEYyICAqLworCWh6NzAwID0gMHg2ZDIyLAorCWh6NzM5ID0gMHg2YjA5LAkJLyogLjk5IEZTMiAqLworCWh6NzQwID0gMHg2YWZhLAorCWh6NzUwID0gMHg2YTZjLAorCWh6NzcwID0gMHg2OTRiLAorCWh6NzgzID0gMHg2ODhiLAkJLyogLjk5IEcyICAqLworCWh6ODAwID0gMHg2NzhkLAorCWh6ODE2ID0gMHg2Njk4LAorCWh6ODMwID0gMHg2NWJmLAkJLyogLjYxIEdTMiAqLworCWh6ODUwID0gMHg2NDg0LAorCWh6ODU3ID0gMHg2NDE0LAorCWh6ODgwID0gMHg2MjlmLAkJLyogLjAwIEEyICAqLworCWh6OTAwID0gMHg2MTU0LAorCWh6OTMyID0gMHg1ZjM1LAkJLyogLjMzIEFTMiAqLworCWh6OTM1ID0gMHg1ZjAxLAorCWh6OTQxID0gMHg1ZTlhLAorCWh6OTQyID0gMHg1ZTg4LAorCWh6OTUwID0gMHg1ZGZkLAorCWh6OTc1ID0gMHg1YzQ0LAorCWh6MTAwMCA9IDB4NWE4MSwKKwloejEwMjAgPSAweDU5MTIsCisJaHoxMDUwID0gMHg1NmUyLAorCWh6MTEwMCA9IDB4NTMyMCwKKwloejExNDAgPSAweDUwMDcsCisJaHoxMjAwID0gMHg0YjNiLAorCWh6MTIwOSA9IDB4NGE4MCwKKwloejEyMTUgPSAweDRhMDIsCisJaHoxMjUwID0gMHg0NzFjLAorCWh6MTMwMCA9IDB4NDJlMCwKKwloejEzMzAgPSAweDQwNDksCisJaHoxMzM2ID0gMHgzZmM0LAorCWh6MTM2NiA9IDB4M2QyMiwKKwloejEzODAgPSAweDNiZTQsCisJaHoxNDAwID0gMHgzYTFiLAorCWh6MTQ1MCA9IDB4MzU5NiwKKwloejE0NzcgPSAweDMzMWMsCisJaHoxNTAwID0gMHgzMGZiLAorCWh6MTYwMCA9IDB4Mjc4ZCwKKwloejE2MzMgPSAweDI0NjIsCisJaHoxNjM4ID0gMHgyM2U3LAorCWh6MTY0NSA9IDB4MjMzYSwKKwloejE3NTAgPSAweDE4ZjgsCisJaHoxODAwID0gMHgxNDA1LAorCWh6MTg2MCA9IDB4ZTBiLAorCWh6MjEwMCA9IDB4ZjVmNiwKKwloejIxMzAgPSAweGYyZjUsCisJaHoyNDUwID0gMHhkM2IzLAorCWh6Mjc1MCA9IDB4YjhlNAorfSBJWEpfRlJFUTsKKwordHlwZWRlZiBlbnVtIHsKKwlDMSA9IGh6MjYxLAorCUNTMSA9IGh6Mjc3LAorCUQxID0gaHoyOTMsCisJRFMxID0gaHozMTEsCisJRTEgPSBoejMyOSwKKwlGMSA9IGh6MzQ5LAorCUZTMSA9IGh6MzY5LAorCUcxID0gaHozOTIsCisJR1MxID0gaHo0MTUsCisJQTEgPSBoejQ0MCwKKwlBUzEgPSBoejQ2NiwKKwlCMSA9IGh6NDkzLAorCUMyID0gaHo1MjMsCisJQ1MyID0gaHo1NTQsCisJRDIgPSBoejU4NywKKwlEUzIgPSBoejYyMiwKKwlFMiA9IGh6NjU5LAorCUYyID0gaHo2OTgsCisJRlMyID0gaHo3MzksCisJRzIgPSBoejc4MywKKwlHUzIgPSBoejgzMCwKKwlBMiA9IGh6ODgwLAorCUFTMiA9IGh6OTMyLAorfSBJWEpfTk9URTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0b25lX2luZGV4OworCWludCBmcmVxMDsKKwlpbnQgZ2FpbjA7CisJaW50IGZyZXExOworCWludCBnYWluMTsKK30gSVhKX1RPTkU7CisKKyNkZWZpbmUgSVhKQ1RMX0lOSVRfVE9ORQkJX0lPVyAoJ3EnLCAweEM5LCBJWEpfVE9ORSAqKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZSBJWEpDVExfVE9ORV9DQURFTkNFIGlvY3RsIGRlZmluZXMgdG9uZSBzZXF1ZW5jZXMgdXNlZCBmb3IgdmFyaW91cworKiBDYWxsIFByb2dyZXNzIFRvbmVzIChDUFQpLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgc2V0dGluZyB1cCBhbiBhcnJheSBvZgorKiBJWEpfQ0FERU5DRV9FTEVNRU5UIHN0cnVjdHVyZXMgdGhhdCBzZXF1ZW50aWFsbHkgZGVmaW5lIHRoZSBzdGF0ZXMgb2YKKyogdGhlIHRvbmUgc2VxdWVuY2UuICBUaGUgdG9uZV9vbl90aW1lIGFuZCB0b25lX29mZiB0aW1lIGFyZSBpbgorKiAyNTAgbWljcm9zZWNvbmQgaW50ZXJ2YWxzLiAgQSBwb2ludGVyIHRvIHRoaXMgYXJyYXkgaXMgcGFzc2VkIHRvIHRoZQorKiBkcml2ZXIgYXMgdGhlIGNlIGVsZW1lbnQgb2YgYW4gSVhKX0NBREVOQ0Ugc3RydWN0dXJlLiAgVGhlIGVsZW1lbnRzX3VzZWQKKyogbXVzdCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBJWEpfQ0FERU5DRV9FTEVNRU5UUyBpbiB0aGUgYXJyYXkuICBUaGUKKyogdGVybWluYXRpb24gdmFyaWFibGUgZGVmaW5lcyB3aGF0IHRvIGRvIGF0IHRoZSBlbmQgb2YgYSBjYWRlbmNlLCB0aGUKKyogb3B0aW9ucyBhcmUgdG8gcGxheSB0aGUgY2FkZW5jZSBvbmNlIGFuZCBzdG9wLCB0byByZXBlYXQgdGhlIGxhc3QKKyogZWxlbWVudCBvZiB0aGUgY2FkZW5jZSBpbmRlZmluaXRlbHksIG9yIHRvIHJlcGVhdCB0aGUgZW50aXJlIGNhZGVuY2UKKyogaW5kZWZpbml0ZWx5LiAgVGhlIGNlIHZhcmlhYmxlIGlzIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgSVhKX1RPTkUKKyogc3RydWN0dXJlcy4gIElmIHRoZSBmcmVxMCB2YXJpYWJsZSBpcyBub24temVybywgdGhlIHRvbmUgdGFibGUgY29udGVudHMKKyogZm9yIHRoZSB0b25lX2luZGV4IGFyZSB1cGRhdGVkIHRvIHRoZSBmcmVxdWVuY2llcyBhbmQgZ2FpbnMgZGVmaW5lZC4gIEl0CisqIHNob3VsZCBiZSBub3RlZCB0aGF0IERUTUYgdG9uZXMgY2Fubm90IGJlIHJlYXNzaWduZWQsIHNvIGlmIERUTUYgdG9uZQorKiB0YWJsZSBpbmRleGVzIGFyZSB1c2VkIGluIGEgY2FkZW5jZSB0aGUgZnJlcXVlbmN5IGFuZCBnYWluIHZhcmlhYmxlcyB3aWxsCisqIGJlIGlnbm9yZWQuCisqCisqIElmIHRoZSBhcnJheSBlbGVtZW50cyBjb250YWluIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzIHRoZSBkcml2ZXIgd2lsbAorKiBpbml0aWFsaXplIHRoZSBuZWVkZWQgdG9uZSB0YWJsZSBlbGVtZW50cyBhbmQgYmVnaW4gcGxheWluZyB0aGUgdG9uZSwKKyogdGhlcmUgaXMgbm8gcHJlc2V0IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNhZGVuY2UuICBJZgorKiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGZyZXF1ZW5jeSB1c2VkIGluIHRoZSBjYWRlbmNlLCBzZXF1ZW50aWFsIGVsZW1lbnRzCisqIG9mIGRpZmZlcmVudCBmcmVxdWVuY2llcyBNVVNUIHVzZSBkaWZmZXJlbnQgdG9uZSB0YWJsZSBpbmRleGVzLiAgT25seSBvbmUKKyogY2FkZW5jZSBjYW4gYmUgcGxheWVkIGF0IGEgdGltZS4gIEl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGNvbXBsZXgKKyogY2FkZW5jZXMgd2l0aCBtdWx0aXBsZSBmcmVxdWVuY2llcyB1c2luZyAyIHRvbmUgdGFibGUgaW5kZXhlcyBieQorKiBhbHRlcm5hdGluZyBiZXR3ZWVuIHRoZW0uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgaW5kZXg7CisJaW50IHRvbmVfb25fdGltZTsKKwlpbnQgdG9uZV9vZmZfdGltZTsKKwlpbnQgZnJlcTA7CisJaW50IGdhaW4wOworCWludCBmcmVxMTsKKwlpbnQgZ2FpbjE7Cit9IElYSl9DQURFTkNFX0VMRU1FTlQ7CisKK3R5cGVkZWYgZW51bSB7CisJUExBWV9PTkNFLAorCVJFUEVBVF9MQVNUX0VMRU1FTlQsCisJUkVQRUFUX0FMTAorfSBJWEpfQ0FERU5DRV9URVJNOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGVsZW1lbnRzX3VzZWQ7CisJSVhKX0NBREVOQ0VfVEVSTSB0ZXJtaW5hdGlvbjsKKwlJWEpfQ0FERU5DRV9FTEVNRU5UICpjZTsKK30gSVhKX0NBREVOQ0U7CisKKyNkZWZpbmUgSVhKQ1RMX1RPTkVfQ0FERU5DRQkJX0lPVyAoJ3EnLCAweENBLCBJWEpfQ0FERU5DRSAqKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIGdyb3VwIG9mIElPQ1RMcyBkZWFsIHdpdGggdGhlIHBsYXliYWNrIHNldHRpbmdzIG9mIHRoZSBEU1AKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJWEpDVExfUExBWV9DT0RFQyAgICAgICAgICAgICAgIFBIT05FX1BMQVlfQ09ERUMKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfU1RBUlQgICAgICAgICAgICAgICBQSE9ORV9QTEFZX1NUQVJUCisjZGVmaW5lIElYSkNUTF9QTEFZX1NUT1AgICAgICAgICAgICAgICAgUEhPTkVfUExBWV9TVE9QCisjZGVmaW5lIElYSkNUTF9QTEFZX0RFUFRICQlQSE9ORV9QTEFZX0RFUFRICisjZGVmaW5lIElYSkNUTF9QTEFZX1ZPTFVNRQkJUEhPTkVfUExBWV9WT0xVTUUKKyNkZWZpbmUgSVhKQ1RMX1BMQVlfTEVWRUwJCVBIT05FX1BMQVlfTEVWRUwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIGdyb3VwIG9mIElPQ1RMcyBkZWFsIHdpdGggdGhlIEFjb3VzdGljIEVjaG8gQ2FuY2VsbGF0aW9uIHNldHRpbmdzCisqIG9mIHRoZSBEU1AKKyoKKyogSXNzdWluZyB0aGUgSVhKQ1RMX0FFQ19TVEFSVCBjb21tYW5kIHdpdGggYSB2YWx1ZSBvZiBBRUNfT0ZGIGhhcyB0aGUKKyogc2FtZSBlZmZlY3QgYXMgSVhKQ1RMX0FFQ19TVE9QLiAgVGhpcyBpcyB0byBzaW1wbGlmeSBzbGlkZXIgYmFyCisqIGNvbnRyb2xzLiAgSVhKQ1RMX0FFQ19HRVRfTEVWRUwgcmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIG9mIHRoZSBBRUMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9BRUNfU1RBUlQJCV9JT1cgKCdxJywgMHhDQiwgaW50KQorI2RlZmluZSBJWEpDVExfQUVDX1NUT1AJCQlfSU8gICgncScsIDB4Q0MpCisjZGVmaW5lIElYSkNUTF9BRUNfR0VUX0xFVkVMCQlfSU8gICgncScsIDB4Q0QpCisKKyNkZWZpbmUgQUVDX09GRiAgIDAKKyNkZWZpbmUgQUVDX0xPVyAgIDEKKyNkZWZpbmUgQUVDX01FRCAgIDIKKyNkZWZpbmUgQUVDX0hJR0ggIDMKKyNkZWZpbmUgQUVDX0FVVE8gIDQKKyNkZWZpbmUgQUVDX0FHQyAgIDUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogQ2FsbCBQcm9ncmVzcyBUb25lcywgRFRNRiwgZXRjLgorKiBJWEpDVExfRFRNRl9PT0IgZGV0ZXJtaW5lcyBpZiBEVE1GIHNpZ25hbGluZyBpcyBzZW50IGFzIE91dC1PZi1CYW5kCisqIG9ubHkuICBJZiB5b3UgcGFzcyBhIDEsIERUTUYgaXMgc3VwcHJlc3NlZCBmcm9tIHRoZSBhdWRpbyBzdHJlYW0uCisqIFRvbmUgb24gYW5kIG9mZiB0aW1lcyBhcmUgaW4gMjUwIG1pY3Jvc2Vjb25kIGludGVydmFscyBzbworKiBpb2N0bChpeGoxLCBJWEpDVExfU0VUX1RPTkVfT05fVElNRSwgMzYwKTsKKyogd2lsbCBzZXQgdGhlIHRvbmUgb24gdGltZSBvZiBib2FyZCBpeGoxIHRvIDM2MCAqIDI1MHVzID0gOTBtcworKiB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdG9uZSBvbiBhbmQgb2ZmIHRpbWVzIGlzIDg0MCBvciAyMTBtcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElYSkNUTF9EVE1GX1JFQURZCQlQSE9ORV9EVE1GX1JFQURZCisjZGVmaW5lIElYSkNUTF9HRVRfRFRNRiAgICAgICAgICAgICAgICAgUEhPTkVfR0VUX0RUTUYKKyNkZWZpbmUgSVhKQ1RMX0dFVF9EVE1GX0FTQ0lJICAgICAgICAgICBQSE9ORV9HRVRfRFRNRl9BU0NJSQorI2RlZmluZSBJWEpDVExfRFRNRl9PT0IJCQlQSE9ORV9EVE1GX09PQgorI2RlZmluZSBJWEpDVExfRVhDRVBUSU9OCQlQSE9ORV9FWENFUFRJT04KKyNkZWZpbmUgSVhKQ1RMX1BMQVlfVE9ORQkJUEhPTkVfUExBWV9UT05FCisjZGVmaW5lIElYSkNUTF9TRVRfVE9ORV9PTl9USU1FCQlQSE9ORV9TRVRfVE9ORV9PTl9USU1FCisjZGVmaW5lIElYSkNUTF9TRVRfVE9ORV9PRkZfVElNRQlQSE9ORV9TRVRfVE9ORV9PRkZfVElNRQorI2RlZmluZSBJWEpDVExfR0VUX1RPTkVfT05fVElNRQkJUEhPTkVfR0VUX1RPTkVfT05fVElNRQorI2RlZmluZSBJWEpDVExfR0VUX1RPTkVfT0ZGX1RJTUUJUEhPTkVfR0VUX1RPTkVfT0ZGX1RJTUUKKyNkZWZpbmUgSVhKQ1RMX0dFVF9UT05FX1NUQVRFCQlQSE9ORV9HRVRfVE9ORV9TVEFURQorI2RlZmluZSBJWEpDVExfQlVTWQkJCVBIT05FX0JVU1kKKyNkZWZpbmUgSVhKQ1RMX1JJTkdCQUNLCQkJUEhPTkVfUklOR0JBQ0sKKyNkZWZpbmUgSVhKQ1RMX0RJQUxUT05FCQkJUEhPTkVfRElBTFRPTkUKKyNkZWZpbmUgSVhKQ1RMX0NQVF9TVE9QCQkJUEhPTkVfQ1BUX1NUT1AKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBMaW5lSkFDSyBzcGVjaWZpYyBJT0NUTHMKKyoKKyogVGhlIGxzYiA0IGJpdHMgb2YgdGhlIExFRCBhcmd1bWVudCByZXByZXNlbnQgdGhlIHN0YXRlIG9mIGVhY2ggb2YgdGhlIDQKKyogTEVEJ3Mgb24gdGhlIExpbmVKQUNLCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX1NFVF9MRUQJCQlfSU9XICgncScsIDB4Q0UsIGludCkKKyNkZWZpbmUgSVhKQ1RMX01JWEVSCQkJX0lPVyAoJ3EnLCAweENGLCBpbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2xzIHVzZSBhdHRlbnVhdGlvbiB3aXRoIDMyIGxldmVscyBmcm9tIDAgdG8gLTYyZEIKKyogd2l0aCBzdGVwcyBvZiAyZEIgZWFjaCwgdGhlIGRlZmluZXMgc2hvdWxkIGJlIE9SJ2VkIHRvZ2V0aGVyIHRoZW4gc2VudAorKiBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZSBtaXhlciBjb21tYW5kIHRvIGNoYW5nZSB0aGUgbWl4ZXIgc2V0dGluZ3MuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNSVhFUl9NQVNURVJfTAkJMHgwMDAwCisjZGVmaW5lIE1JWEVSX01BU1RFUl9SCQkweDAxMDAKKyNkZWZpbmUgQVRUMDBEQgkJCTB4MDAKKyNkZWZpbmUgQVRUMDJEQgkJCTB4MDEKKyNkZWZpbmUgQVRUMDREQgkJCTB4MDIKKyNkZWZpbmUgQVRUMDZEQgkJCTB4MDMKKyNkZWZpbmUgQVRUMDhEQgkJCTB4MDQKKyNkZWZpbmUgQVRUMTBEQgkJCTB4MDUKKyNkZWZpbmUgQVRUMTJEQgkJCTB4MDYKKyNkZWZpbmUgQVRUMTREQgkJCTB4MDcKKyNkZWZpbmUgQVRUMTZEQgkJCTB4MDgKKyNkZWZpbmUgQVRUMThEQgkJCTB4MDkKKyNkZWZpbmUgQVRUMjBEQgkJCTB4MEEKKyNkZWZpbmUgQVRUMjJEQgkJCTB4MEIKKyNkZWZpbmUgQVRUMjREQgkJCTB4MEMKKyNkZWZpbmUgQVRUMjZEQgkJCTB4MEQKKyNkZWZpbmUgQVRUMjhEQgkJCTB4MEUKKyNkZWZpbmUgQVRUMzBEQgkJCTB4MEYKKyNkZWZpbmUgQVRUMzJEQgkJCTB4MTAKKyNkZWZpbmUgQVRUMzREQgkJCTB4MTEKKyNkZWZpbmUgQVRUMzZEQgkJCTB4MTIKKyNkZWZpbmUgQVRUMzhEQgkJCTB4MTMKKyNkZWZpbmUgQVRUNDBEQgkJCTB4MTQKKyNkZWZpbmUgQVRUNDJEQgkJCTB4MTUKKyNkZWZpbmUgQVRUNDREQgkJCTB4MTYKKyNkZWZpbmUgQVRUNDZEQgkJCTB4MTcKKyNkZWZpbmUgQVRUNDhEQgkJCTB4MTgKKyNkZWZpbmUgQVRUNTBEQgkJCTB4MTkKKyNkZWZpbmUgQVRUNTJEQgkJCTB4MUEKKyNkZWZpbmUgQVRUNTREQgkJCTB4MUIKKyNkZWZpbmUgQVRUNTZEQgkJCTB4MUMKKyNkZWZpbmUgQVRUNThEQgkJCTB4MUQKKyNkZWZpbmUgQVRUNjBEQgkJCTB4MUUKKyNkZWZpbmUgQVRUNjJEQgkJCTB4MUYKKyNkZWZpbmUgTUFTVEVSX01VVEUJCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIGlucHV0IHZvbHVtZSBjb250cm9scyB1c2UgZ2FpbiB3aXRoIDMyIGxldmVscyBmcm9tICsxMmRCIHRvIC01MGRCCisqIHdpdGggc3RlcHMgb2YgMmRCIGVhY2gsIHRoZSBkZWZpbmVzIHNob3VsZCBiZSBPUidlZCB0b2dldGhlciB0aGVuIHNlbnQKKyogYXMgdGhlIHBhcmFtZXRlciB0byB0aGUgbWl4ZXIgY29tbWFuZCB0byBjaGFuZ2UgdGhlIG1peGVyIHNldHRpbmdzLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUlYRVJfUE9SVF9DRF9MCQkweDA2MDAKKyNkZWZpbmUgTUlYRVJfUE9SVF9DRF9SCQkweDA3MDAKKyNkZWZpbmUgTUlYRVJfUE9SVF9MSU5FX0lOX0wJMHgwODAwCisjZGVmaW5lIE1JWEVSX1BPUlRfTElORV9JTl9SCTB4MDkwMAorI2RlZmluZSBNSVhFUl9QT1JUX1BPVFNfUkVDCTB4MEMwMAorI2RlZmluZSBNSVhFUl9QT1JUX01JQwkJMHgwRTAwCisKKyNkZWZpbmUgR0FJTjEyREIJCTB4MDAKKyNkZWZpbmUgR0FJTjEwREIJCTB4MDEKKyNkZWZpbmUgR0FJTjA4REIJCTB4MDIKKyNkZWZpbmUgR0FJTjA2REIJCTB4MDMKKyNkZWZpbmUgR0FJTjA0REIJCTB4MDQKKyNkZWZpbmUgR0FJTjAyREIJCTB4MDUKKyNkZWZpbmUgR0FJTjAwREIJCTB4MDYKKyNkZWZpbmUgR0FJTl8wMkRCCQkweDA3CisjZGVmaW5lIEdBSU5fMDREQgkJMHgwOAorI2RlZmluZSBHQUlOXzA2REIJCTB4MDkKKyNkZWZpbmUgR0FJTl8wOERCCQkweDBBCisjZGVmaW5lIEdBSU5fMTBEQgkJMHgwQgorI2RlZmluZSBHQUlOXzEyREIJCTB4MEMKKyNkZWZpbmUgR0FJTl8xNERCCQkweDBECisjZGVmaW5lIEdBSU5fMTZEQgkJMHgwRQorI2RlZmluZSBHQUlOXzE4REIJCTB4MEYKKyNkZWZpbmUgR0FJTl8yMERCCQkweDEwCisjZGVmaW5lIEdBSU5fMjJEQgkJMHgxMQorI2RlZmluZSBHQUlOXzI0REIJCTB4MTIKKyNkZWZpbmUgR0FJTl8yNkRCCQkweDEzCisjZGVmaW5lIEdBSU5fMjhEQgkJMHgxNAorI2RlZmluZSBHQUlOXzMwREIJCTB4MTUKKyNkZWZpbmUgR0FJTl8zMkRCCQkweDE2CisjZGVmaW5lIEdBSU5fMzREQgkJMHgxNworI2RlZmluZSBHQUlOXzM2REIJCTB4MTgKKyNkZWZpbmUgR0FJTl8zOERCCQkweDE5CisjZGVmaW5lIEdBSU5fNDBEQgkJMHgxQQorI2RlZmluZSBHQUlOXzQyREIJCTB4MUIKKyNkZWZpbmUgR0FJTl80NERCCQkweDFDCisjZGVmaW5lIEdBSU5fNDZEQgkJMHgxRAorI2RlZmluZSBHQUlOXzQ4REIJCTB4MUUKKyNkZWZpbmUgR0FJTl81MERCCQkweDFGCisjZGVmaW5lIElOUFVUX01VVEUJCTB4ODAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIFBPVFMgdm9sdW1lIGNvbnRyb2wgdXNlIGF0dGVudWF0aW9uIHdpdGggOCBsZXZlbHMgZnJvbSAwZEIgdG8gLTI4ZEIKKyogd2l0aCBzdGVwcyBvZiA0ZEIgZWFjaCwgdGhlIGRlZmluZXMgc2hvdWxkIGJlIE9SJ2VkIHRvZ2V0aGVyIHRoZW4gc2VudAorKiBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZSBtaXhlciBjb21tYW5kIHRvIGNoYW5nZSB0aGUgbWl4ZXIgc2V0dGluZ3MuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNSVhFUl9QT1JUX1BPVFNfUExBWQkweDBGMDAKKworI2RlZmluZSBQT1RTX0FUVF8wMERCCQkweDAwCisjZGVmaW5lIFBPVFNfQVRUXzA0REIJCTB4MDEKKyNkZWZpbmUgUE9UU19BVFRfMDhEQgkJMHgwMgorI2RlZmluZSBQT1RTX0FUVF8xMkRCCQkweDAzCisjZGVmaW5lIFBPVFNfQVRUXzE2REIJCTB4MDQKKyNkZWZpbmUgUE9UU19BVFRfMjBEQgkJMHgwNQorI2RlZmluZSBQT1RTX0FUVF8yNERCCQkweDA2CisjZGVmaW5lIFBPVFNfQVRUXzI4REIJCTB4MDcKKyNkZWZpbmUgUE9UU19NVVRFCQkweDgwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSBEQUEgY29udHJvbHMgdGhlIGludGVyZmFjZSB0byB0aGUgUFNUTiBwb3J0LiAgVGhlIGRyaXZlciBsb2FkcyB0aGUKKyogVVMgY29lZmZpY2llbnRzIGJ5IGRlZmF1bHQsIHNvIGlmIHlvdSBsaXZlIGluIGEgZGlmZmVyZW50IGNvdW50cnkgeW91CisqIG5lZWQgdG8gbG9hZCB0aGUgc2V0IGZvciB5b3VyIGNvdW50cmllcyBwaG9uZSBzeXN0ZW0uCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfREFBX0NPRUZGX1NFVAkJX0lPVyAoJ3EnLCAweEQwLCBpbnQpCisKKyNkZWZpbmUgREFBX1VTIAkJMQkvKlBJVEEgOGtIeiAqLworI2RlZmluZSBEQUFfVUsgCQkyCS8qSVNBUjM0IDhrSHogKi8KKyNkZWZpbmUgREFBX0ZSQU5DRSAJMwkvKiAqLworI2RlZmluZSBEQUFfR0VSTUFOWQk0CisjZGVmaW5lIERBQV9BVVNUUkFMSUEJNQorI2RlZmluZSBEQUFfSkFQQU4JNgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBVc2UgSVhKQ1RMX1BPUlQgdG8gc2V0IG9yIHF1ZXJ5IHRoZSBwb3J0IHRoZSBjYXJkIGlzIHNldCB0by4gIElmIHRoZQorKiBhcmd1bWVudCBpcyBzZXQgdG8gUE9SVF9RVUVSWSwgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgaW9jdGwgd2lsbAorKiBpbmRpY2F0ZSB3aGljaCBwb3J0IGlzIGN1cnJlbnRseSBpbiB1c2UsIG90aGVyd2lzZSBpdCB3aWxsIGNoYW5nZSB0aGUKKyogcG9ydC4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElYSkNUTF9QT1JUCQkJX0lPVyAoJ3EnLCAweEQxLCBpbnQpCisKKyNkZWZpbmUgUE9SVF9RVUVSWQkwCisjZGVmaW5lIFBPUlRfUE9UUwkxCisjZGVmaW5lIFBPUlRfUFNUTgkyCisjZGVmaW5lIFBPUlRfU1BFQUtFUgkzCisjZGVmaW5lIFBPUlRfSEFORFNFVAk0CisKKyNkZWZpbmUgSVhKQ1RMX1BTVE5fU0VUX1NUQVRFCQlQSE9ORV9QU1ROX1NFVF9TVEFURQorI2RlZmluZSBJWEpDVExfUFNUTl9HRVRfU1RBVEUJCVBIT05FX1BTVE5fR0VUX1NUQVRFCisKKyNkZWZpbmUgUFNUTl9PTl9IT09LCTAKKyNkZWZpbmUgUFNUTl9SSU5HSU5HCTEKKyNkZWZpbmUgUFNUTl9PRkZfSE9PSwkyCisjZGVmaW5lIFBTVE5fUFVMU0VfRElBTAkzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCisqIFRoZSBEQUEgQW5hbG9nIEdBSU4gc2V0cyAyIHBhcmFtZXRlcnMgYXQgb25lIHRpbWUsIHRoZSByZWNlaXZlIGdhaW4gKEFHUlIpLCAKKyogYW5kIHRoZSB0cmFuc21pdCBnYWluIChBR1gpLiAgT1IgdG9nZXRoZXIgdGhlIGNvbXBvbmVudHMgYW5kIHBhc3MgdGhlbQorKiBhcyB0aGUgcGFyYW1ldGVyIHRvIElYSkNUTF9EQUFfQUdBSU4uICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIGJvdGggYXQgMGRCLgorKiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX0RBQV9BR0FJTgkJX0lPVyAoJ3EnLCAweEQyLCBpbnQpCisKKyNkZWZpbmUgQUdSUjAwREIJMHgwMAkvKiBBbmFsb2cgZ2FpbiBpbiByZWNlaXZlIGRpcmVjdGlvbiAwZEIgKi8KKyNkZWZpbmUgQUdSUjNfNURCCTB4MTAJLyogQW5hbG9nIGdhaW4gaW4gcmVjZWl2ZSBkaXJlY3Rpb24gMy41ZEIgKi8KKyNkZWZpbmUgQUdSUjA2REIJMHgzMAkvKiBBbmFsb2cgZ2FpbiBpbiByZWNlaXZlIGRpcmVjdGlvbiA2ZEIgKi8KKworI2RlZmluZSBBR1gwMERCCQkweDAwCS8qIEFuYWxvZyBnYWluIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAwZEIgKi8KKyNkZWZpbmUgQUdYXzZEQgkJMHgwNAkvKiBBbmFsb2cgZ2FpbiBpbiB0cmFuc21pdCBkaXJlY3Rpb24gLTZkQiAqLworI2RlZmluZSBBR1gzXzVEQgkweDA4CS8qIEFuYWxvZyBnYWluIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAzLjVkQiAqLworI2RlZmluZSBBR1hfMl81QgkweDBDCS8qIEFuYWxvZyBnYWluIGluIHRyYW5zbWl0IGRpcmVjdGlvbiAtMi41ZEIgKi8KKworI2RlZmluZSBJWEpDVExfUFNUTl9MSU5FVEVTVAkJX0lPICAoJ3EnLCAweEQzKQorCisjZGVmaW5lIElYSkNUTF9DSUQJCQlfSU9SICgncScsIDB4RDQsIFBIT05FX0NJRCAqKQorI2RlZmluZSBJWEpDVExfVk1XSQkJCV9JT1IgKCdxJywgMHhEOCwgaW50KQorI2RlZmluZSBJWEpDVExfQ0lEQ1cJCQlfSU9XICgncScsIDB4RDksIFBIT05FX0NJRCAqKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIHdpbmsgZHVyYXRpb24gaXMgdHVuYWJsZSB3aXRoIHRoaXMgaW9jdGwuICBUaGUgZGVmYXVsdCB3aW5rIGR1cmF0aW9uICAKKyogaXMgMzIwbXMuICBZb3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgaW9jdGwgaWYgeW91IGRvIG5vdCByZXF1aXJlIGEKKyogZGlmZmVyZW50IHdpbmsgZHVyYXRpb24uCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfV0lOS19EVVJBVElPTgkJUEhPTkVfV0lOS19EVVJBVElPTgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiBUaGlzIGlvY3RsIHdpbGwgY29ubmVjdCB0aGUgUE9UUyBwb3J0IHRvIHRoZSBQU1ROIHBvcnQgb24gdGhlIExpbmVKQUNLCisqIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkgdGhlIHBvcnQgc2VsZWN0aW9uIHNob3VsZCBiZSBzZXQgdG8KKyogdGhlIFBTVE4gcG9ydCB3aXRoIElYSkNUTF9QT1JUIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBpb2N0bC4gIFRoaXMgd2lsbAorKiBlbmFibGUgY29uZmVyZW5jZSBjYWxscyBiZXR3ZWVuIFBTVE4gY2FsbGVycyBhbmQgbmV0d29yayBjYWxsZXJzLgorKiBQYXNzaW5nIGEgMSB0byB0aGlzIGlvY3RsIGVuYWJsZXMgdGhlIFBPVFM8LT5QU1ROIGNvbm5lY3Rpb24gd2hpbGUKKyogcGFzc2luZyBhIDAgdHVybnMgaXQgYmFjayBvZmYuCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJWEpDVExfUE9UU19QU1ROCQlfSU9XICgncScsIDB4RDUsIGludCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBJT0NUTHMgYWRkZWQgYnkgcmVxdWVzdC4KKyoKKyogSVhKQ1RMX0haIHNldHMgdGhlIHZhbHVlIHlvdXIgTGludXgga2VybmVsIHVzZXMgZm9yIEhaIGFzIGRlZmluZWQgaW4KKyogICAgICAgICAgIC91c3IvaW5jbHVkZS9hc20vcGFyYW0uaCwgdGhpcyBkZXRlcm1pbmVzIHRoZSBmdW5kYW1lbnRhbAorKiAgICAgICAgICAgZnJlcXVlbmN5IG9mIHRoZSBjbG9jayB0aWNrcyBvbiB5b3VyIExpbnV4IHN5c3RlbS4gIFRoZSBrZXJuZWwKKyogICAgICAgICAgIG11c3QgYmUgcmVidWlsdCBpZiB5b3UgY2hhbmdlIHRoaXMgdmFsdWUsIGFsc28gYWxsIG1vZHVsZXMgeW91CisqICAgICAgICAgICB1c2UgKGV4Y2VwdCB0aGlzIG9uZSkgbXVzdCBiZSByZWNvbXBpbGVkLiAgVGhlIGRlZmF1bHQgdmFsdWUKKyogICAgICAgICAgIGlzIDEwMCwgYW5kIHlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMgSU9DVEwgaWYgeW91IHVzZSBzb21lCisqICAgICAgICAgICBvdGhlciB2YWx1ZS4KKyoKKyoKKyogSVhKQ1RMX1JBVEUgc2V0cyB0aGUgbnVtYmVyIG9mIHRpbWVzIHBlciBzZWNvbmQgdGhhdCB0aGUgZHJpdmVyIHBvbGxzCisqICAgICAgICAgICAgIHRoZSBEU1AuICBUaGlzIHZhbHVlIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBIWi4gIEJ5CisqICAgICAgICAgICAgIGluY3JlYXNpbmcgYm90aCBvZiB0aGVzZSB2YWx1ZXMsIHlvdSBtYXkgYmUgYWJsZSB0byByZWR1Y2UKKyogICAgICAgICAgICAgbGF0ZW5jeSBiZWNhdXNlIHRoZSBtYXggaGFuZyB0aW1lIHRoYXQgY2FuIGV4aXN0IGJldHdlZW4gdGhlCisqICAgICAgICAgICAgIGRyaXZlciBhbmQgdGhlIERTUCB3aWxsIGJlIHJlZHVjZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX0haICAgICAgICAgICAgICAgICAgICAgICBfSU9XICgncScsIDB4RTAsIGludCkKKyNkZWZpbmUgSVhKQ1RMX1JBVEUgICAgICAgICAgICAgICAgICAgICBfSU9XICgncScsIDB4RTEsIGludCkKKyNkZWZpbmUgSVhKQ1RMX0ZSQU1FU19SRUFECQlfSU9SICgncScsIDB4RTIsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIElYSkNUTF9GUkFNRVNfV1JJVFRFTgkJX0lPUiAoJ3EnLCAweEUzLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBJWEpDVExfUkVBRF9XQUlUCQlfSU9SICgncScsIDB4RTQsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIElYSkNUTF9XUklURV9XQUlUCQlfSU9SICgncScsIDB4RTUsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIElYSkNUTF9EUllCVUZGRVJfUkVBRAkJX0lPUiAoJ3EnLCAweEU2LCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBJWEpDVExfRFJZQlVGRkVSX0NMRUFSCQlfSU8gICgncScsIDB4RTcpCisjZGVmaW5lIElYSkNUTF9EVE1GX1BSRVNDQUxFCQlfSU9XICgncScsIDB4RTgsIGludCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIGlvY3RsIGFsbG93cyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjb250cm9sIHdoYXQgZXZlbnRzIHRoZSBkcml2ZXIKKyogd2lsbCBzZW5kIHNpZ25hbHMgZm9yLCBhbmQgd2hhdCBzaWduYWxzIGl0IHdpbGwgc2VuZCBmb3Igd2hpY2ggZXZlbnQuCisqIEJ5IGRlZmF1bHQsIGlmIHNpZ25hbGluZyBpcyBlbmFibGVkLCBhbGwgZXZlbnRzIHdpbGwgc2VuZCBTSUdJTyB3aGVuCisqIHRoZXkgb2NjdXIuICBUbyBkaXNhYmxlIHNpZ25hbHMgZm9yIGFuIGV2ZW50IHNldCB0aGUgc2lnbmFsIHRvIDAuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVNJR19EVE1GX1JFQURZLAorCVNJR19IT09LU1RBVEUsCisJU0lHX0ZMQVNILAorCVNJR19QU1ROX1JJTkcsCisJU0lHX0NBTExFUl9JRCwKKwlTSUdfUFNUTl9XSU5LLAorCVNJR19GMCwgU0lHX0YxLCBTSUdfRjIsIFNJR19GMywKKwlTSUdfRkMwLCBTSUdfRkMxLCBTSUdfRkMyLCBTSUdfRkMzLAorCVNJR19SRUFEX1JFQURZID0gMzMsCisJU0lHX1dSSVRFX1JFQURZID0gMzQKK30gSVhKX1NJR0VWRU5UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGV2ZW50OworCWludCBzaWduYWw7Cit9IElYSl9TSUdERUY7CisKKyNkZWZpbmUgSVhKQ1RMX1NJR0NUTAkJCV9JT1cgKCdxJywgMHhFOSwgSVhKX1NJR0RFRiAqKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZXNlIGlvY3RscyBhbGxvdyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBjaGFuZ2UgdGhlIGdhaW4gaW4gdGhlIAorKiBTbWFydCBDYWJsZSBvZiB0aGUgSW50ZXJuZXQgUGhvbmUgQ2FyZC4gIFNlbmRpbmcgLTEgYXMgYSB2YWx1ZSB3aWxsIGNhdXNlCisqIHJldHVybiB2YWx1ZSB0byBiZSB0aGUgY3VycmVudCBzZXR0aW5nLiAgVmFsaWQgdmFsdWVzIHRvIHNldCBhcmUgMHgwMCAtIDB4MUYKKyoKKyogMTExMTEgPSArMTIgZEIKKyogMTAxMTEgPSAgIDAgZEIKKyogMDAwMDAgPSAtMzQuNSBkQgorKgorKiBJWEpDVExfU0NfUlhHIHNldHMgdGhlIFJlY2VpdmUgZ2FpbgorKiBJWEpDVExfU0NfVFhHIHNldHMgdGhlIFRyYW5zbWl0IGdhaW4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSVhKQ1RMX1NDX1JYRwkJCV9JT1cgKCdxJywgMHhFQSwgaW50KQorI2RlZmluZSBJWEpDVExfU0NfVFhHCQkJX0lPVyAoJ3EnLCAweEVCLCBpbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogVGhlIGludGVyY29tIElPQ1RMJ3Mgc2hvcnQgdGhlIG91dHB1dCBmcm9tIG9uZSBjYXJkIHRvIHRoZSBpbnB1dCBvZiB0aGUKKyogb3RoZXIgYW5kIHZpY2UgdmVyc2EgKGFjdHVhbGx5IGRvbmUgaW4gdGhlIERTUCByZWFkIGZ1bmN0aW9uKS4gIEl0IGlzIG9ubHkKKyogbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgdGhlIElPQ1RMIG9uIG9uZSBjYXJkLCBidXQgaXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUKKyogYm90aCBkZXZpY2VzIG9wZW4gdG8gYmUgYWJsZSB0byBkZXRlY3QgaG9vayBzd2l0Y2ggY2hhbmdlcy4gIFRoZSByZWNvcmQKKyogY29kZWMgYW5kIHJhdGUgb2YgZWFjaCBjYXJkIG11c3QgbWF0Y2ggdGhlIHBsYXliYWNrIGNvZGVjIGFuZCByYXRlIG9mCisqIHRoZSBvdGhlciBjYXJkIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVhKQ1RMX0lOVEVSQ09NX1NUQVJUIAkJX0lPVyAoJ3EnLCAweEZELCBpbnQpCisjZGVmaW5lIElYSkNUTF9JTlRFUkNPTV9TVE9QICAJCV9JT1cgKCdxJywgMHhGRSwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbmV3IHN0cnVjdHVyZSBmb3IgYWNjZXNzaW5nIHJhdyBmaWx0ZXIgaW5mb3JtYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGZpbHRlcjsKKwljaGFyIGVuYWJsZTsKKwl1bnNpZ25lZCBpbnQgY29lZmZbMTldOworfSBJWEpfRklMVEVSX1JBVzsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2piZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qYmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDRlOWQxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qYmQuaApAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvamJkLmgKKyAqCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+CisgKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMCBSZWQgSGF0LCBJbmMgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBEZWZpbml0aW9ucyBmb3IgdHJhbnNhY3Rpb24gZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgYnVmZmVyIGNhY2hlCisgKiBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgc3VwcG9ydC4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9KQkRfSAorI2RlZmluZSBfTElOVVhfSkJEX0gKKworLyogQWxsb3cgdGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5IGludG8gZTJmc3Byb2dzICovCisjaW5jbHVkZSAiamZzX2NvbXBhdC5oIgorI2RlZmluZSBKRlNfREVCVUcKKyNkZWZpbmUgamZzX2RlYnVnIGpiZF9kZWJ1ZworCisjZGVmaW5lIGpvdXJuYWxfb29tX3JldHJ5IDEKKworLyoKKyAqIERlZmluZSBKQkRfUEFSQU5JT0RfSU9GQUlMIHRvIGNhdXNlIGEga2VybmVsIEJVRygpIGlmIGV4dDMgZmluZHMKKyAqIGNlcnRhaW4gY2xhc3NlcyBvZiBlcnJvciB3aGljaCBjYW4gb2NjdXIgZHVlIHRvIGZhaWxlZCBJT3MuICBVbmRlcgorICogbm9ybWFsIHVzZSB3ZSB3YW50IGV4dDMgdG8gY29udGludWUgYWZ0ZXIgc3VjaCBlcnJvcnMsIGJlY2F1c2UKKyAqIGhhcmR3YXJlIF9jYW5fIGZhaWwsIGJ1dCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHdoZW4gcnVubmluZyB0ZXN0cyBvbgorICoga25vd24tZ29vZCBoYXJkd2FyZSB3ZSBtYXkgd2FudCB0byB0cmFwIHRoZXNlIGVycm9ycy4KKyAqLworI3VuZGVmIEpCRF9QQVJBTk9JRF9JT0ZBSUwKKworLyoKKyAqIFRoZSBkZWZhdWx0IG1heGltdW0gY29tbWl0IGFnZSwgaW4gc2Vjb25kcy4KKyAqLworI2RlZmluZSBKQkRfREVGQVVMVF9NQVhfQ09NTUlUX0FHRSA1CisKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisvKgorICogRGVmaW5lIEpCRF9FWFBFTlNJVkVfQ0hFQ0tJTkcgdG8gZW5hYmxlIG1vcmUgZXhwZW5zaXZlIGludGVybmFsCisgKiBjb25zaXN0ZW5jeSBjaGVja3MuICBCeSBkZWZhdWx0IHdlIGRvbid0IGRvIHRoaXMgdW5sZXNzCisgKiBDT05GSUdfSkJEX0RFQlVHIGlzIG9uLgorICovCisjZGVmaW5lIEpCRF9FWFBFTlNJVkVfQ0hFQ0tJTkcKK2V4dGVybiB1OCBqb3VybmFsX2VuYWJsZV9kZWJ1ZzsKKworI2RlZmluZSBqYmRfZGVidWcobiwgZiwgYS4uLikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoKG4pIDw9IGpvdXJuYWxfZW5hYmxlX2RlYnVnKSB7CQkJXAorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIoJXMsICVkKTogJXM6ICIsCQlcCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOwlcCisJCQlwcmludGsgKGYsICMjIGEpOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBqYmRfZGVidWcoZiwgYS4uLikJLyoqLworI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgKmpiZF9hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhmbGFncywgZ2V0X29yZGVyKHNpemUpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBqYmRfZnJlZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfTsKKworI2RlZmluZSBKRlNfTUlOX0pPVVJOQUxfQkxPQ0tTIDEwMjQKKworCisvKgorICogSW50ZXJuYWwgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBsb2dnaW5nIG1lY2hhbmlzbToKKyAqLworCisjZGVmaW5lIEpGU19NQUdJQ19OVU1CRVIgMHhjMDNiMzk5OFUgLyogVGhlIGZpcnN0IDQgYnl0ZXMgb2YgL2Rldi9yYW5kb20hICovCisKKy8qCisgKiBPbi1kaXNrIHN0cnVjdHVyZXMKKyAqLworCisvKgorICogRGVzY3JpcHRvciBibG9jayB0eXBlczoKKyAqLworCisjZGVmaW5lIEpGU19ERVNDUklQVE9SX0JMT0NLCTEKKyNkZWZpbmUgSkZTX0NPTU1JVF9CTE9DSwkyCisjZGVmaW5lIEpGU19TVVBFUkJMT0NLX1YxCTMKKyNkZWZpbmUgSkZTX1NVUEVSQkxPQ0tfVjIJNAorI2RlZmluZSBKRlNfUkVWT0tFX0JMT0NLCTUKKworLyoKKyAqIFN0YW5kYXJkIGhlYWRlciBmb3IgYWxsIGRlc2NyaXB0b3IgYmxvY2tzOgorICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2hlYWRlcl9zCit7CisJX19iZTMyCQloX21hZ2ljOworCV9fYmUzMgkJaF9ibG9ja3R5cGU7CisJX19iZTMyCQloX3NlcXVlbmNlOworfSBqb3VybmFsX2hlYWRlcl90OworCisKKy8qCisgKiBUaGUgYmxvY2sgdGFnOiB1c2VkIHRvIGRlc2NyaWJlIGEgc2luZ2xlIGJ1ZmZlciBpbiB0aGUgam91cm5hbAorICovCit0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2Jsb2NrX3RhZ19zCit7CisJX19iZTMyCQl0X2Jsb2NrbnI7CS8qIFRoZSBvbi1kaXNrIGJsb2NrIG51bWJlciAqLworCV9fYmUzMgkJdF9mbGFnczsJLyogU2VlIGJlbG93ICovCit9IGpvdXJuYWxfYmxvY2tfdGFnX3Q7CisKKy8qCisgKiBUaGUgcmV2b2tlIGRlc2NyaXB0b3I6IHVzZWQgb24gZGlzayB0byBkZXNjcmliZSBhIHNlcmllcyBvZiBibG9ja3MgdG8KKyAqIGJlIHJldm9rZWQgZnJvbSB0aGUgbG9nCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfcmV2b2tlX2hlYWRlcl9zCit7CisJam91cm5hbF9oZWFkZXJfdCByX2hlYWRlcjsKKwlfX2JlMzIJCSByX2NvdW50OwkvKiBDb3VudCBvZiBieXRlcyB1c2VkIGluIHRoZSBibG9jayAqLworfSBqb3VybmFsX3Jldm9rZV9oZWFkZXJfdDsKKworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIGpvdXJuYWwgdGFnIGZsYWdzIHdvcmQ6ICovCisjZGVmaW5lIEpGU19GTEFHX0VTQ0FQRQkJMQkvKiBvbi1kaXNrIGJsb2NrIGlzIGVzY2FwZWQgKi8KKyNkZWZpbmUgSkZTX0ZMQUdfU0FNRV9VVUlECTIJLyogYmxvY2sgaGFzIHNhbWUgdXVpZCBhcyBwcmV2aW91cyAqLworI2RlZmluZSBKRlNfRkxBR19ERUxFVEVECTQJLyogYmxvY2sgZGVsZXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uICovCisjZGVmaW5lIEpGU19GTEFHX0xBU1RfVEFHCTgJLyogbGFzdCB0YWcgaW4gdGhpcyBkZXNjcmlwdG9yIGJsb2NrICovCisKKworLyoKKyAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2suICBBbGwgZmllbGRzIGFyZSBpbiBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja19zCit7CisvKiAweDAwMDAgKi8KKwlqb3VybmFsX2hlYWRlcl90IHNfaGVhZGVyOworCisvKiAweDAwMEMgKi8KKwkvKiBTdGF0aWMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgam91cm5hbCAqLworCV9fYmUzMglzX2Jsb2Nrc2l6ZTsJCS8qIGpvdXJuYWwgZGV2aWNlIGJsb2Nrc2l6ZSAqLworCV9fYmUzMglzX21heGxlbjsJCS8qIHRvdGFsIGJsb2NrcyBpbiBqb3VybmFsIGZpbGUgKi8KKwlfX2JlMzIJc19maXJzdDsJCS8qIGZpcnN0IGJsb2NrIG9mIGxvZyBpbmZvcm1hdGlvbiAqLworCisvKiAweDAwMTggKi8KKwkvKiBEeW5hbWljIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvZyAqLworCV9fYmUzMglzX3NlcXVlbmNlOwkJLyogZmlyc3QgY29tbWl0IElEIGV4cGVjdGVkIGluIGxvZyAqLworCV9fYmUzMglzX3N0YXJ0OwkJLyogYmxvY2tuciBvZiBzdGFydCBvZiBsb2cgKi8KKworLyogMHgwMDIwICovCisJLyogRXJyb3IgdmFsdWUsIGFzIHNldCBieSBqb3VybmFsX2Fib3J0KCkuICovCisJX19iZTMyCXNfZXJybm87CisKKy8qIDB4MDAyNCAqLworCS8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIG9ubHkgdmFsaWQgaW4gYSB2ZXJzaW9uLTIgc3VwZXJibG9jayAqLworCV9fYmUzMglzX2ZlYXR1cmVfY29tcGF0OwkvKiBjb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19iZTMyCXNfZmVhdHVyZV9pbmNvbXBhdDsJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19iZTMyCXNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKy8qIDB4MDAzMCAqLworCV9fdTgJc191dWlkWzE2XTsJCS8qIDEyOC1iaXQgdXVpZCBmb3Igam91cm5hbCAqLworCisvKiAweDAwNDAgKi8KKwlfX2JlMzIJc19ucl91c2VyczsJCS8qIE5yIG9mIGZpbGVzeXN0ZW1zIHNoYXJpbmcgbG9nICovCisKKwlfX2JlMzIJc19keW5zdXBlcjsJCS8qIEJsb2NrbnIgb2YgZHluYW1pYyBzdXBlcmJsb2NrIGNvcHkqLworCisvKiAweDAwNDggKi8KKwlfX2JlMzIJc19tYXhfdHJhbnNhY3Rpb247CS8qIExpbWl0IG9mIGpvdXJuYWwgYmxvY2tzIHBlciB0cmFucy4qLworCV9fYmUzMglzX21heF90cmFuc19kYXRhOwkvKiBMaW1pdCBvZiBkYXRhIGJsb2NrcyBwZXIgdHJhbnMuICovCisKKy8qIDB4MDA1MCAqLworCV9fdTMyCXNfcGFkZGluZ1s0NF07CisKKy8qIDB4MDEwMCAqLworCV9fdTgJc191c2Vyc1sxNio0OF07CQkvKiBpZHMgb2YgYWxsIGZzJ2VzIHNoYXJpbmcgdGhlIGxvZyAqLworLyogMHgwNDAwICovCit9IGpvdXJuYWxfc3VwZXJibG9ja190OworCisjZGVmaW5lIEpGU19IQVNfQ09NUEFUX0ZFQVRVUkUoaixtYXNrKQkJCQkJXAorCSgoaiktPmpfZm9ybWF0X3ZlcnNpb24gPj0gMiAmJgkJCQkJXAorCSAoKGopLT5qX3N1cGVyYmxvY2stPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fYmUzMigobWFzaykpKSkKKyNkZWZpbmUgSkZTX0hBU19ST19DT01QQVRfRkVBVFVSRShqLG1hc2spCQkJCVwKKwkoKGopLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIgJiYJCQkJCVwKKwkgKChqKS0+al9zdXBlcmJsb2NrLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgY3B1X3RvX2JlMzIoKG1hc2spKSkpCisjZGVmaW5lIEpGU19IQVNfSU5DT01QQVRfRkVBVFVSRShqLG1hc2spCQkJCVwKKwkoKGopLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIgJiYJCQkJCVwKKwkgKChqKS0+al9zdXBlcmJsb2NrLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fYmUzMigobWFzaykpKSkKKworI2RlZmluZSBKRlNfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UJMHgwMDAwMDAwMQorCisvKiBGZWF0dXJlcyBrbm93biB0byB0aGlzIGtlcm5lbCB2ZXJzaW9uOiAqLworI2RlZmluZSBKRlNfS05PV05fQ09NUEFUX0ZFQVRVUkVTCTAKKyNkZWZpbmUgSkZTX0tOT1dOX1JPQ09NUEFUX0ZFQVRVUkVTCTAKKyNkZWZpbmUgSkZTX0tOT1dOX0lOQ09NUEFUX0ZFQVRVUkVTCUpGU19GRUFUVVJFX0lOQ09NUEFUX1JFVk9LRQorCisKKy8qIENvbXBhcmlzb24gZnVuY3Rpb25zIGZvciB0cmFuc2FjdGlvbiBJRHM6IHBlcmZvcm0gY29tcGFyaXNvbnMgdXNpbmcKKyAqIG1vZHVsbyBhcml0aG1ldGljIHNvIHRoYXQgdGhleSB3b3JrIG92ZXIgc2VxdWVuY2UgbnVtYmVyIHdyYXBzLiAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGlkX2d0KHRpZF90IHgsIHRpZF90IHkpCit7CisJaW50IGRpZmZlcmVuY2UgPSAoeCAtIHkpOworCXJldHVybiAoZGlmZmVyZW5jZSA+IDApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGlkX2dlcSh0aWRfdCB4LCB0aWRfdCB5KQoreworCWludCBkaWZmZXJlbmNlID0gKHggLSB5KTsKKwlyZXR1cm4gKGRpZmZlcmVuY2UgPj0gMCk7Cit9CisKK2V4dGVybiBpbnQgam91cm5hbF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSk7CisKKy8qCisgKiBSZXR1cm4gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyB3aGljaCBtdXN0IGJlIGZyZWUgaW4gdGhlIGpvdXJuYWwKKyAqIGJlZm9yZSBhIG5ldyB0cmFuc2FjdGlvbiBtYXkgYmUgc3RhcnRlZC4gIE11c3QgYmUgY2FsbGVkIHVuZGVyIGpfc3RhdGVfbG9jay4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IGpiZF9zcGFjZV9uZWVkZWQoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBuYmxvY2tzID0gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVyczsKKwlpZiAoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKQorCQluYmxvY2tzICs9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbi0+CisJCQkJCXRfb3V0c3RhbmRpbmdfY3JlZGl0czsKKwlyZXR1cm4gbmJsb2NrczsKK30KKworLyoKKyAqIERlZmluaXRpb25zIHdoaWNoIGF1Z21lbnQgdGhlIGJ1ZmZlcl9oZWFkIGxheWVyCisgKi8KKworLyogam91cm5hbGluZyBidWZmZXIgdHlwZXMgKi8KKyNkZWZpbmUgQkpfTm9uZQkJMAkvKiBOb3Qgam91cm5hbGVkICovCisjZGVmaW5lIEJKX1N5bmNEYXRhCTEJLyogTm9ybWFsIGRhdGE6IGZsdXNoIGJlZm9yZSBjb21taXQgKi8KKyNkZWZpbmUgQkpfTWV0YWRhdGEJMgkvKiBOb3JtYWwgam91cm5hbGVkIG1ldGFkYXRhICovCisjZGVmaW5lIEJKX0ZvcmdldAkzCS8qIEJ1ZmZlciBzdXBlcnNlZGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgQkpfSU8JCTQJLyogQnVmZmVyIGlzIGZvciB0ZW1wb3JhcnkgSU8gdXNlICovCisjZGVmaW5lIEJKX1NoYWRvdwk1CS8qIEJ1ZmZlciBjb250ZW50cyBiZWluZyBzaGFkb3dlZCB0byB0aGUgbG9nICovCisjZGVmaW5lIEJKX0xvZ0N0bAk2CS8qIEJ1ZmZlciBjb250YWlucyBsb2cgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQkpfUmVzZXJ2ZWQJNwkvKiBCdWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIGFjY2VzcyBieSBqb3VybmFsICovCisjZGVmaW5lIEJKX0xvY2tlZAk4CS8qIExvY2tlZCBmb3IgSS9PIGR1cmluZyBjb21taXQgKi8KKyNkZWZpbmUgQkpfVHlwZXMJOQorCitleHRlcm4gaW50IGpiZF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSk7CisKKworI2VuZGlmCS8qIF9MSU5VWF9KQkRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qZmZzMi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9qZmZzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTYzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2pmZnMyLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoZQorICogamZmczIgZGlyZWN0b3J5LgorICoKKyAqICRJZDogamZmczIuaCx2IDEuMzggMjAwNS8wOS8yNiAxMTozNzoyMyBoYXZhc2kgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0pGRlMyX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlMyX0hfXworCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyogWW91IG11c3QgaW5jbHVkZSBzb21ldGhpbmcgd2hpY2ggZGVmaW5lcyB0aGUgQzk5IHVpbnRYWF90IHR5cGVzLiAKKyAgIFdlIGRvbid0IGRvIGl0IGZyb20gaGVyZSBiZWNhdXNlIHRoaXMgZmlsZSBpcyB1c2VkIGluIHRvbyBtYW55CisgICBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLiAqLworCisvKiBWYWx1ZXMgd2UgbWF5IGV4cGVjdCB0byBmaW5kIGluIHRoZSAnbWFnaWMnIGZpZWxkICovCisjZGVmaW5lIEpGRlMyX09MRF9NQUdJQ19CSVRNQVNLIDB4MTk4NAorI2RlZmluZSBKRkZTMl9NQUdJQ19CSVRNQVNLIDB4MTk4NQorI2RlZmluZSBLU0FNVElCX0NJR0FNXzJTRkZKIDB4ODUxOSAvKiBGb3IgZGV0ZWN0aW5nIHdyb25nLWVuZGlhbiBmcyAqLworI2RlZmluZSBKRkZTMl9FTVBUWV9CSVRNQVNLIDB4ZmZmZgorI2RlZmluZSBKRkZTMl9ESVJUWV9CSVRNQVNLIDB4MDAwMAorCisvKiBTdW1tYXJ5IG5vZGUgTUFHSUMgbWFya2VyICovCisjZGVmaW5lIEpGRlMyX1NVTV9NQUdJQwkweDAyODUxODg1CisKKy8qIFdlIG9ubHkgYWxsb3cgYSBzaW5nbGUgY2hhciBmb3IgbGVuZ3RoLCBhbmQgMHhGRiBpcyBlbXB0eSBmbGFzaCBzbworICAgd2UgZG9uJ3Qgd2FudCBpdCBjb25mdXNlZCB3aXRoIGEgcmVhbCBsZW5ndGguIEhlbmNlIG1heCAyNTQuCisqLworI2RlZmluZSBKRkZTMl9NQVhfTkFNRV9MRU4gMjU0CisKKy8qIEhvdyBzbWFsbCBjYW4gd2Ugc2Vuc2libHkgd3JpdGUgbm9kZXM/ICovCisjZGVmaW5lIEpGRlMyX01JTl9EQVRBX0xFTiAxMjgKKworI2RlZmluZSBKRkZTMl9DT01QUl9OT05FCTB4MDAKKyNkZWZpbmUgSkZGUzJfQ09NUFJfWkVSTwkweDAxCisjZGVmaW5lIEpGRlMyX0NPTVBSX1JUSU1FCTB4MDIKKyNkZWZpbmUgSkZGUzJfQ09NUFJfUlVCSU5NSVBTCTB4MDMKKyNkZWZpbmUgSkZGUzJfQ09NUFJfQ09QWQkweDA0CisjZGVmaW5lIEpGRlMyX0NPTVBSX0RZTlJVQklOCTB4MDUKKyNkZWZpbmUgSkZGUzJfQ09NUFJfWkxJQgkweDA2CisjZGVmaW5lIEpGRlMyX0NPTVBSX0xaTwkJMHgwNworLyogQ29tcGF0aWJpbGl0eSBmbGFncy4gKi8KKyNkZWZpbmUgSkZGUzJfQ09NUEFUX01BU0sgMHhjMDAwICAgICAgLyogV2hhdCBkbyB0byBpZiBhbiB1bmtub3duIG5vZGV0eXBlIGlzIGZvdW5kICovCisjZGVmaW5lIEpGRlMyX05PREVfQUNDVVJBVEUgMHgyMDAwCisvKiBJTkNPTVBBVDogRmFpbCB0byBtb3VudCB0aGUgZmlsZXN5c3RlbSAqLworI2RlZmluZSBKRkZTMl9GRUFUVVJFX0lOQ09NUEFUIDB4YzAwMAorLyogUk9DT01QQVQ6IE1vdW50IHJlYWQtb25seSAqLworI2RlZmluZSBKRkZTMl9GRUFUVVJFX1JPQ09NUEFUIDB4ODAwMAorLyogUldDT01QQVRfQ09QWTogTW91bnQgcmVhZC93cml0ZSwgYW5kIGNvcHkgdGhlIG5vZGUgd2hlbiBpdCdzIEdDJ2QgKi8KKyNkZWZpbmUgSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9DT1BZIDB4NDAwMAorLyogUldDT01QQVRfREVMRVRFOiBNb3VudCByZWFkL3dyaXRlLCBhbmQgZGVsZXRlIHRoZSBub2RlIHdoZW4gaXQncyBHQydkICovCisjZGVmaW5lIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFIDB4MDAwMAorCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX0RJUkVOVCAoSkZGUzJfRkVBVFVSRV9JTkNPTVBBVCB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCAxKQorI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9JTk9ERSAoSkZGUzJfRkVBVFVSRV9JTkNPTVBBVCB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCAyKQorI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9DTEVBTk1BUktFUiAoSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9ERUxFVEUgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgMykKKyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfUEFERElORyAoSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9ERUxFVEUgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgNCkKKworI2RlZmluZSBKRkZTMl9OT0RFVFlQRV9TVU1NQVJZIChKRkZTMl9GRUFUVVJFX1JXQ09NUEFUX0RFTEVURSB8IEpGRlMyX05PREVfQUNDVVJBVEUgfCA2KQorCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX1hBVFRSIChKRkZTMl9GRUFUVVJFX0lOQ09NUEFUIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDgpCisjZGVmaW5lIEpGRlMyX05PREVUWVBFX1hSRUYgKEpGRlMyX0ZFQVRVUkVfSU5DT01QQVQgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFIHwgOSkKKworLyogWEFUVFIgUmVsYXRlZCAqLworI2RlZmluZSBKRkZTMl9YUFJFRklYX1VTRVIJCTEJLyogZm9yICJ1c2VyLiIgKi8KKyNkZWZpbmUgSkZGUzJfWFBSRUZJWF9TRUNVUklUWQkJMgkvKiBmb3IgInNlY3VyaXR5LiIgKi8KKyNkZWZpbmUgSkZGUzJfWFBSRUZJWF9BQ0xfQUNDRVNTCTMJLyogZm9yICJzeXN0ZW0ucG9zaXhfYWNsX2FjY2VzcyIgKi8KKyNkZWZpbmUgSkZGUzJfWFBSRUZJWF9BQ0xfREVGQVVMVAk0CS8qIGZvciAic3lzdGVtLnBvc2l4X2FjbF9kZWZhdWx0IiAqLworI2RlZmluZSBKRkZTMl9YUFJFRklYX1RSVVNURUQJCTUJLyogZm9yICJ0cnVzdGVkLioiICovCisKKyNkZWZpbmUgSkZGUzJfQUNMX1ZFUlNJT04JCTB4MDAwMQorCisvLyBNYXliZSBsYXRlci4uLgorLy8jZGVmaW5lIEpGRlMyX05PREVUWVBFX0NIRUNLUE9JTlQgKEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDMpCisvLyNkZWZpbmUgSkZGUzJfTk9ERVRZUEVfT1BUSU9OUyAoSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9DT1BZIHwgSkZGUzJfTk9ERV9BQ0NVUkFURSB8IDQpCisKKworI2RlZmluZSBKRkZTMl9JTk9fRkxBR19QUkVSRUFECSAgMQkvKiBEbyByZWFkX2lub2RlKCkgZm9yIHRoaXMgb25lIGF0CisJCQkJCSAgIG1vdW50IHRpbWUsIGRvbid0IHdhaXQgZm9yIGl0IHRvCisJCQkJCSAgIGhhcHBlbiBsYXRlciAqLworI2RlZmluZSBKRkZTMl9JTk9fRkxBR19VU0VSQ09NUFIgIDIJLyogVXNlciBoYXMgcmVxdWVzdGVkIGEgc3BlY2lmaWMKKwkJCQkJICAgY29tcHJlc3Npb24gdHlwZSAqLworCisKKy8qIFRoZXNlIGNhbiBnbyBvbmNlIHdlJ3ZlIG1hZGUgc3VyZSB3ZSd2ZSBjYXVnaHQgYWxsIHVzZXMgd2l0aG91dAorICAgYnl0ZXN3YXBwaW5nICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCB2MzI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGppbnQzMl90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgbTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgam1vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHYxNjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgamludDE2X3Q7CisKK3N0cnVjdCBqZmZzMl91bmtub3duX25vZGUKK3sKKwkvKiBBbGwgc3RhcnQgbGlrZSB0aGlzICovCisJamludDE2X3QgbWFnaWM7CisJamludDE2X3Qgbm9kZXR5cGU7CisJamludDMyX3QgdG90bGVuOyAvKiBTbyB3ZSBjYW4gc2tpcCBvdmVyIG5vZGVzIHdlIGRvbid0IGdyb2sgKi8KKwlqaW50MzJfdCBoZHJfY3JjOworfTsKKworc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQKK3sKKwlqaW50MTZfdCBtYWdpYzsKKwlqaW50MTZfdCBub2RldHlwZTsJLyogPT0gSkZGUzJfTk9ERVRZUEVfRElSRU5UICovCisJamludDMyX3QgdG90bGVuOworCWppbnQzMl90IGhkcl9jcmM7CisJamludDMyX3QgcGlubzsKKwlqaW50MzJfdCB2ZXJzaW9uOworCWppbnQzMl90IGlubzsgLyogPT0gemVybyBmb3IgdW5saW5rICovCisJamludDMyX3QgbWN0aW1lOworCXVpbnQ4X3QgbnNpemU7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgdW51c2VkWzJdOworCWppbnQzMl90IG5vZGVfY3JjOworCWppbnQzMl90IG5hbWVfY3JjOworCXVpbnQ4X3QgbmFtZVswXTsKK307CisKKy8qIFRoZSBKRkZTMiByYXcgaW5vZGUgc3RydWN0dXJlOiBVc2VkIGZvciBzdG9yYWdlIG9uIHBoeXNpY2FsIG1lZGlhLiAgKi8KKy8qIFRoZSB1aWQsIGdpZCwgYXRpbWUsIG10aW1lIGFuZCBjdGltZSBtZW1iZXJzIGNvdWxkIGJlIGxvbmdlciwgYnV0CisgICBhcmUgbGVmdCBsaWtlIHRoaXMgZm9yIHNwYWNlIGVmZmljaWVuY3kuIElmIGFuZCB3aGVuIHBlb3BsZSBkZWNpZGUKKyAgIHRoZXkgcmVhbGx5IG5lZWQgdGhlbSBleHRlbmRlZCwgaXQncyBzaW1wbGUgZW5vdWdoIHRvIGFkZCBzdXBwb3J0IGZvcgorICAgYSBuZXcgdHlwZSBvZiByYXcgbm9kZS4KKyovCitzdHJ1Y3QgamZmczJfcmF3X2lub2RlCit7CisJamludDE2X3QgbWFnaWM7ICAgICAgLyogQSBjb25zdGFudCBtYWdpYyBudW1iZXIuICAqLworCWppbnQxNl90IG5vZGV0eXBlOyAgIC8qID09IEpGRlMyX05PREVUWVBFX0lOT0RFICovCisJamludDMyX3QgdG90bGVuOyAgICAgLyogVG90YWwgbGVuZ3RoIG9mIHRoaXMgbm9kZSAoaW5jIGRhdGEsIGV0Yy4pICovCisJamludDMyX3QgaGRyX2NyYzsKKwlqaW50MzJfdCBpbm87ICAgICAgICAvKiBJbm9kZSBudW1iZXIuICAqLworCWppbnQzMl90IHZlcnNpb247ICAgIC8qIFZlcnNpb24gbnVtYmVyLiAgKi8KKwlqbW9kZV90IG1vZGU7ICAgICAgIC8qIFRoZSBmaWxlJ3MgdHlwZSBvciBtb2RlLiAgKi8KKwlqaW50MTZfdCB1aWQ7ICAgICAgICAvKiBUaGUgZmlsZSdzIG93bmVyLiAgKi8KKwlqaW50MTZfdCBnaWQ7ICAgICAgICAvKiBUaGUgZmlsZSdzIGdyb3VwLiAgKi8KKwlqaW50MzJfdCBpc2l6ZTsgICAgICAvKiBUb3RhbCByZXN1bHRhbnQgc2l6ZSBvZiB0aGlzIGlub2RlICh1c2VkIGZvciB0cnVuY2F0aW9ucykgICovCisJamludDMyX3QgYXRpbWU7ICAgICAgLyogTGFzdCBhY2Nlc3MgdGltZS4gICovCisJamludDMyX3QgbXRpbWU7ICAgICAgLyogTGFzdCBtb2RpZmljYXRpb24gdGltZS4gICovCisJamludDMyX3QgY3RpbWU7ICAgICAgLyogQ2hhbmdlIHRpbWUuICAqLworCWppbnQzMl90IG9mZnNldDsgICAgIC8qIFdoZXJlIHRvIGJlZ2luIHRvIHdyaXRlLiAgKi8KKwlqaW50MzJfdCBjc2l6ZTsgICAgICAvKiAoQ29tcHJlc3NlZCkgZGF0YSBzaXplICovCisJamludDMyX3QgZHNpemU7CSAgICAgLyogU2l6ZSBvZiB0aGUgbm9kZSdzIGRhdGEuIChhZnRlciBkZWNvbXByZXNzaW9uKSAqLworCXVpbnQ4X3QgY29tcHI7ICAgICAgIC8qIENvbXByZXNzaW9uIGFsZ29yaXRobSB1c2VkICovCisJdWludDhfdCB1c2VyY29tcHI7ICAgLyogQ29tcHJlc3Npb24gYWxnb3JpdGhtIHJlcXVlc3RlZCBieSB0aGUgdXNlciAqLworCWppbnQxNl90IGZsYWdzOwkgICAgIC8qIFNlZSBKRkZTMl9JTk9fRkxBR18qICovCisJamludDMyX3QgZGF0YV9jcmM7ICAgLyogQ1JDIGZvciB0aGUgKGNvbXByZXNzZWQpIGRhdGEuICAqLworCWppbnQzMl90IG5vZGVfY3JjOyAgIC8qIENSQyBmb3IgdGhlIHJhdyBpbm9kZSAoZXhjbHVkaW5nIGRhdGEpICAqLworCXVpbnQ4X3QgZGF0YVswXTsKK307CisKK3N0cnVjdCBqZmZzMl9yYXdfeGF0dHIgeworCWppbnQxNl90IG1hZ2ljOworCWppbnQxNl90IG5vZGV0eXBlOwkvKiA9IEpGRlMyX05PREVUWVBFX1hBVFRSICovCisJamludDMyX3QgdG90bGVuOworCWppbnQzMl90IGhkcl9jcmM7CisJamludDMyX3QgeGlkOwkJLyogWEFUVFIgaWRlbnRpZmllciBudW1iZXIgKi8KKwlqaW50MzJfdCB2ZXJzaW9uOworCXVpbnQ4X3QgeHByZWZpeDsKKwl1aW50OF90IG5hbWVfbGVuOworCWppbnQxNl90IHZhbHVlX2xlbjsKKwlqaW50MzJfdCBkYXRhX2NyYzsKKwlqaW50MzJfdCBub2RlX2NyYzsKKwl1aW50OF90IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgamZmczJfcmF3X3hyZWYKK3sKKwlqaW50MTZfdCBtYWdpYzsKKwlqaW50MTZfdCBub2RldHlwZTsJLyogPSBKRkZTMl9OT0RFVFlQRV9YUkVGICovCisJamludDMyX3QgdG90bGVuOworCWppbnQzMl90IGhkcl9jcmM7CisJamludDMyX3QgaW5vOwkJLyogaW5vZGUgbnVtYmVyICovCisJamludDMyX3QgeGlkOwkJLyogWEFUVFIgaWRlbnRpZmllciBudW1iZXIgKi8KKwlqaW50MzJfdCB4c2Vxbm87CS8qIHhyZWYgc2VxdWVuY2lhbCBudW1iZXIgKi8KKwlqaW50MzJfdCBub2RlX2NyYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBqZmZzMl9yYXdfc3VtbWFyeQoreworCWppbnQxNl90IG1hZ2ljOworCWppbnQxNl90IG5vZGV0eXBlOyAJLyogPSBKRkZTMl9OT0RFVFlQRV9TVU1NQVJZICovCisJamludDMyX3QgdG90bGVuOworCWppbnQzMl90IGhkcl9jcmM7CisJamludDMyX3Qgc3VtX251bTsJLyogbnVtYmVyIG9mIHN1bSBlbnRyaWVzKi8KKwlqaW50MzJfdCBjbG5fbWtyOwkvKiBjbGVhbiBtYXJrZXIgc2l6ZSwgMCA9IG5vIGNsZWFubWFya2VyICovCisJamludDMyX3QgcGFkZGVkOwkvKiBzdW0gb2YgdGhlIHNpemUgb2YgcGFkZGluZyBub2RlcyAqLworCWppbnQzMl90IHN1bV9jcmM7CS8qIHN1bW1hcnkgaW5mb3JtYXRpb24gY3JjICovCisJamludDMyX3Qgbm9kZV9jcmM7IAkvKiBub2RlIGNyYyAqLworCWppbnQzMl90IHN1bVswXTsgCS8qIGlub2RlIHN1bW1hcnkgaW5mbyAqLworfTsKKwordW5pb24gamZmczJfbm9kZV91bmlvbgoreworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgaTsKKwlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCBkOworCXN0cnVjdCBqZmZzMl9yYXdfeGF0dHIgeDsKKwlzdHJ1Y3QgamZmczJfcmF3X3hyZWYgcjsKKwlzdHJ1Y3QgamZmczJfcmF3X3N1bW1hcnkgczsKKwlzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlIHU7Cit9OworCisvKiBEYXRhIHBheWxvYWQgZm9yIGRldmljZSBub2Rlcy4gKi8KK3VuaW9uIGpmZnMyX2RldmljZV9ub2RlIHsKKwlqaW50MTZfdCBvbGQ7CisJamludDMyX3QgbmV3OworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfSkZGUzJfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNGNlZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvam95c3RpY2suaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfTElOVVhfSk9ZU1RJQ0tfSAorI2RlZmluZSBfTElOVVhfSk9ZU1RJQ0tfSAorCisvKgorICogJElkOiBqb3lzdGljay5oLHYgMS4zIDIwMDAvMTEvMzAgMTE6MDc6MDUgdm9qdGVjaCBFeHAgJAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBWb2p0ZWNoIFBhdmxpaworICoKKyAqICBTcG9uc29yZWQgYnkgU3VTRQorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICogCisgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKKyAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHN1c2UuY3o+LCBvciBieSBwYXBlciBtYWlsOgorICogVm9qdGVjaCBQYXZsaWssIFVjaXRlbHNrYSAxNTc2LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCisgKi8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKy8qCisgKiBWZXJzaW9uCisgKi8KKworI2RlZmluZSBKU19WRVJTSU9OCQkweDAyMDEwMAorCisvKgorICogVHlwZXMgYW5kIGNvbnN0YW50cyBmb3IgcmVhZGluZyBmcm9tIC9kZXYvanMKKyAqLworCisjZGVmaW5lIEpTX0VWRU5UX0JVVFRPTgkJMHgwMQkvKiBidXR0b24gcHJlc3NlZC9yZWxlYXNlZCAqLworI2RlZmluZSBKU19FVkVOVF9BWElTCQkweDAyCS8qIGpveXN0aWNrIG1vdmVkICovCisjZGVmaW5lIEpTX0VWRU5UX0lOSVQJCTB4ODAJLyogaW5pdGlhbCBzdGF0ZSBvZiBkZXZpY2UgKi8KKworc3RydWN0IGpzX2V2ZW50IHsKKwlfX3UzMiB0aW1lOwkvKiBldmVudCB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzICovCisJX19zMTYgdmFsdWU7CS8qIHZhbHVlICovCisJX191OCB0eXBlOwkvKiBldmVudCB0eXBlICovCisJX191OCBudW1iZXI7CS8qIGF4aXMvYnV0dG9uIG51bWJlciAqLworfTsKKworLyoKKyAqIElPQ1RMIGNvbW1hbmRzIGZvciBqb3lzdGljayBkcml2ZXIKKyAqLworCisjZGVmaW5lIEpTSU9DR1ZFUlNJT04JCV9JT1IoJ2onLCAweDAxLCBfX3UzMikJCQkJLyogZ2V0IGRyaXZlciB2ZXJzaW9uICovCisKKyNkZWZpbmUgSlNJT0NHQVhFUwkJX0lPUignaicsIDB4MTEsIF9fdTgpCQkJCS8qIGdldCBudW1iZXIgb2YgYXhlcyAqLworI2RlZmluZSBKU0lPQ0dCVVRUT05TCQlfSU9SKCdqJywgMHgxMiwgX191OCkJCQkJLyogZ2V0IG51bWJlciBvZiBidXR0b25zICovCisjZGVmaW5lIEpTSU9DR05BTUUobGVuKQkJX0lPQyhfSU9DX1JFQUQsICdqJywgMHgxMywgbGVuKQkJCS8qIGdldCBpZGVudGlmaWVyIHN0cmluZyAqLworCisjZGVmaW5lIEpTSU9DU0NPUlIJCV9JT1coJ2onLCAweDIxLCBzdHJ1Y3QganNfY29ycikJCQkvKiBzZXQgY29ycmVjdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUgSlNJT0NHQ09SUgkJX0lPUignaicsIDB4MjIsIHN0cnVjdCBqc19jb3JyKQkJCS8qIGdldCBjb3JyZWN0aW9uIHZhbHVlcyAqLworCisjZGVmaW5lIEpTSU9DU0FYTUFQCQlfSU9XKCdqJywgMHgzMSwgX191OFtBQlNfTUFYICsgMV0pCQkvKiBzZXQgYXhpcyBtYXBwaW5nICovCisjZGVmaW5lIEpTSU9DR0FYTUFQCQlfSU9SKCdqJywgMHgzMiwgX191OFtBQlNfTUFYICsgMV0pCQkvKiBnZXQgYXhpcyBtYXBwaW5nICovCisjZGVmaW5lIEpTSU9DU0JUTk1BUAkJX0lPVygnaicsIDB4MzMsIF9fdTE2W0tFWV9NQVggLSBCVE5fTUlTQyArIDFdKQkvKiBzZXQgYnV0dG9uIG1hcHBpbmcgKi8KKyNkZWZpbmUgSlNJT0NHQlROTUFQCQlfSU9SKCdqJywgMHgzNCwgX191MTZbS0VZX01BWCAtIEJUTl9NSVNDICsgMV0pCS8qIGdldCBidXR0b24gbWFwcGluZyAqLworCisvKgorICogVHlwZXMgYW5kIGNvbnN0YW50cyBmb3IgZ2V0L3NldCBjb3JyZWN0aW9uCisgKi8KKworI2RlZmluZSBKU19DT1JSX05PTkUJCTB4MDAJLyogcmV0dXJucyByYXcgdmFsdWVzICovCisjZGVmaW5lIEpTX0NPUlJfQlJPS0VOCQkweDAxCS8qIGJyb2tlbiBsaW5lICovCisKK3N0cnVjdCBqc19jb3JyIHsKKwlfX3MzMiBjb2VmWzhdOworCV9fczE2IHByZWM7CisJX191MTYgdHlwZTsKK307CisKKy8qCisgKiB2MC54IGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEpTX1JFVFVSTgkJc2l6ZW9mKHN0cnVjdCBKU19EQVRBX1RZUEUpCisjZGVmaW5lIEpTX1RSVUUJCQkxCisjZGVmaW5lIEpTX0ZBTFNFCQkwCisjZGVmaW5lIEpTX1hfMAkJCTB4MDEKKyNkZWZpbmUgSlNfWV8wCQkJMHgwMgorI2RlZmluZSBKU19YXzEJCQkweDA0CisjZGVmaW5lIEpTX1lfMQkJCTB4MDgKKyNkZWZpbmUgSlNfTUFYCQkJMgorCisjZGVmaW5lIEpTX0RFRl9USU1FT1VUCQkweDEzMDAKKyNkZWZpbmUgSlNfREVGX0NPUlIJCTAKKyNkZWZpbmUgSlNfREVGX1RJTUVMSU1JVAkxMEwKKworI2RlZmluZSBKU19TRVRfQ0FMCQkxCisjZGVmaW5lIEpTX0dFVF9DQUwJCTIKKyNkZWZpbmUgSlNfU0VUX1RJTUVPVVQJCTMKKyNkZWZpbmUgSlNfR0VUX1RJTUVPVVQJCTQKKyNkZWZpbmUgSlNfU0VUX1RJTUVMSU1JVAk1CisjZGVmaW5lIEpTX0dFVF9USU1FTElNSVQJNgorI2RlZmluZSBKU19HRVRfQUxMCQk3CisjZGVmaW5lIEpTX1NFVF9BTEwJCTgKKworc3RydWN0IEpTX0RBVEFfVFlQRSB7CisJX19zMzIgYnV0dG9uczsKKwlfX3MzMiB4OworCV9fczMyIHk7Cit9OworCitzdHJ1Y3QgSlNfREFUQV9TQVZFX1RZUEVfMzIgeworCV9fczMyIEpTX1RJTUVPVVQ7CisJX19zMzIgQlVTWTsKKwlfX3MzMiBKU19FWFBJUkVUSU1FOworCV9fczMyIEpTX1RJTUVMSU1JVDsKKwlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX1NBVkU7CisJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19DT1JSOworfTsKKworc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFXzY0IHsKKwlfX3MzMiBKU19USU1FT1VUOworCV9fczMyIEJVU1k7CisJX19zNjQgSlNfRVhQSVJFVElNRTsKKwlfX3M2NCBKU19USU1FTElNSVQ7CisJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19TQVZFOworCXN0cnVjdCBKU19EQVRBX1RZUEUgSlNfQ09SUjsKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9KT1lTVElDS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlMzcyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2QuaApAQCAtMCwwICsxLDE4MSBAQAorI2lmbmRlZiBfTElOVVhfS0RfSAorI2RlZmluZSBfTElOVVhfS0RfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIDB4NEIgaXMgJ0snLCB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCB0ZXJtaW9zIGFuZCB2dCAqLworCisjZGVmaW5lIEdJT19GT05UCTB4NEI2MAkvKiBnZXRzIGZvbnQgaW4gZXhwYW5kZWQgZm9ybSAqLworI2RlZmluZSBQSU9fRk9OVAkweDRCNjEJLyogdXNlIGZvbnQgaW4gZXhwYW5kZWQgZm9ybSAqLworCisjZGVmaW5lIEdJT19GT05UWAkweDRCNkIJLyogZ2V0IGZvbnQgdXNpbmcgc3RydWN0IGNvbnNvbGVmb250ZGVzYyAqLworI2RlZmluZSBQSU9fRk9OVFgJMHg0QjZDCS8qIHNldCBmb250IHVzaW5nIHN0cnVjdCBjb25zb2xlZm9udGRlc2MgKi8KK3N0cnVjdCBjb25zb2xlZm9udGRlc2MgeworCXVuc2lnbmVkIHNob3J0IGNoYXJjb3VudDsJLyogY2hhcmFjdGVycyBpbiBmb250ICgyNTYgb3IgNTEyKSAqLworCXVuc2lnbmVkIHNob3J0IGNoYXJoZWlnaHQ7CS8qIHNjYW4gbGluZXMgcGVyIGNoYXJhY3RlciAoMS0zMikgKi8KKwljaGFyICpjaGFyZGF0YTsJCS8qIGZvbnQgZGF0YSBpbiBleHBhbmRlZCBmb3JtICovCit9OworCisjZGVmaW5lIFBJT19GT05UUkVTRVQgICAweDRCNkQJLyogcmVzZXQgdG8gZGVmYXVsdCBmb250ICovCisKKyNkZWZpbmUgR0lPX0NNQVAJMHg0QjcwCS8qIGdldHMgY29sb3VyIHBhbGV0dGUgb24gVkdBKyAqLworI2RlZmluZSBQSU9fQ01BUAkweDRCNzEJLyogc2V0cyBjb2xvdXIgcGFsZXR0ZSBvbiBWR0ErICovCisKKyNkZWZpbmUgS0lPQ1NPVU5ECTB4NEIyRgkvKiBzdGFydCBzb3VuZCBnZW5lcmF0aW9uICgwIGZvciBvZmYpICovCisjZGVmaW5lIEtETUtUT05FCTB4NEIzMAkvKiBnZW5lcmF0ZSB0b25lICovCisKKyNkZWZpbmUgS0RHRVRMRUQJMHg0QjMxCS8qIHJldHVybiBjdXJyZW50IGxlZCBzdGF0ZSAqLworI2RlZmluZSBLRFNFVExFRAkweDRCMzIJLyogc2V0IGxlZCBzdGF0ZSBbbGlnaHRzLCBub3QgZmxhZ3NdICovCisjZGVmaW5lIAlMRURfU0NSCQkweDAxCS8qIHNjcm9sbCBsb2NrIGxlZCAqLworI2RlZmluZSAJTEVEX05VTQkJMHgwMgkvKiBudW0gbG9jayBsZWQgKi8KKyNkZWZpbmUgCUxFRF9DQVAJCTB4MDQJLyogY2FwcyBsb2NrIGxlZCAqLworCisjZGVmaW5lIEtER0tCVFlQRQkweDRCMzMJLyogZ2V0IGtleWJvYXJkIHR5cGUgKi8KKyNkZWZpbmUgCUtCXzg0CQkweDAxCisjZGVmaW5lIAlLQl8xMDEJCTB4MDIgCS8qIHRoaXMgaXMgd2hhdCB3ZSBhbHdheXMgYW5zd2VyICovCisjZGVmaW5lIAlLQl9PVEhFUgkweDAzCisKKyNkZWZpbmUgS0RBRERJTwkJMHg0QjM0CS8qIGFkZCBpL28gcG9ydCBhcyB2YWxpZCAqLworI2RlZmluZSBLRERFTElPCQkweDRCMzUJLyogZGVsIGkvbyBwb3J0IGFzIHZhbGlkICovCisjZGVmaW5lIEtERU5BQklPCTB4NEIzNgkvKiBlbmFibGUgaS9vIHRvIHZpZGVvIGJvYXJkICovCisjZGVmaW5lIEtERElTQUJJTwkweDRCMzcJLyogZGlzYWJsZSBpL28gdG8gdmlkZW8gYm9hcmQgKi8KKworI2RlZmluZSBLRFNFVE1PREUJMHg0QjNBCS8qIHNldCB0ZXh0L2dyYXBoaWNzIG1vZGUgKi8KKyNkZWZpbmUJCUtEX1RFWFQJCTB4MDAKKyNkZWZpbmUJCUtEX0dSQVBISUNTCTB4MDEKKyNkZWZpbmUJCUtEX1RFWFQwCTB4MDIJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUJCUtEX1RFWFQxCTB4MDMJLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgS0RHRVRNT0RFCTB4NEIzQgkvKiBnZXQgY3VycmVudCBtb2RlICovCisKKyNkZWZpbmUgS0RNQVBESVNQCTB4NEIzQwkvKiBtYXAgZGlzcGxheSBpbnRvIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgS0RVTk1BUERJU1AJMHg0QjNECS8qIHVubWFwIGRpc3BsYXkgZnJvbSBhZGRyZXNzIHNwYWNlICovCisKK3R5cGVkZWYgY2hhciBzY3JubWFwX3Q7CisjZGVmaW5lCQlFX1RBQlNaCQkyNTYKKyNkZWZpbmUgR0lPX1NDUk5NQVAJMHg0QjQwCS8qIGdldCBzY3JlZW4gbWFwcGluZyBmcm9tIGtlcm5lbCAqLworI2RlZmluZSBQSU9fU0NSTk1BUAkweDRCNDEJLyogcHV0IHNjcmVlbiBtYXBwaW5nIHRhYmxlIGluIGtlcm5lbCAqLworI2RlZmluZSBHSU9fVU5JU0NSTk1BUCAgMHg0QjY5CS8qIGdldCBmdWxsIFVuaWNvZGUgc2NyZWVuIG1hcHBpbmcgKi8KKyNkZWZpbmUgUElPX1VOSVNDUk5NQVAgIDB4NEI2QSAgLyogc2V0IGZ1bGwgVW5pY29kZSBzY3JlZW4gbWFwcGluZyAqLworCisjZGVmaW5lIEdJT19VTklNQVAJMHg0QjY2CS8qIGdldCB1bmljb2RlLXRvLWZvbnQgbWFwcGluZyBmcm9tIGtlcm5lbCAqLworc3RydWN0IHVuaXBhaXIgeworCXVuc2lnbmVkIHNob3J0IHVuaWNvZGU7CisJdW5zaWduZWQgc2hvcnQgZm9udHBvczsKK307CitzdHJ1Y3QgdW5pbWFwZGVzYyB7CisJdW5zaWduZWQgc2hvcnQgZW50cnlfY3Q7CisJc3RydWN0IHVuaXBhaXIgKmVudHJpZXM7Cit9OworI2RlZmluZSBQSU9fVU5JTUFQCTB4NEI2NwkvKiBwdXQgdW5pY29kZS10by1mb250IG1hcHBpbmcgaW4ga2VybmVsICovCisjZGVmaW5lIFBJT19VTklNQVBDTFIJMHg0QjY4CS8qIGNsZWFyIHRhYmxlLCBwb3NzaWJseSBhZHZpc2UgaGFzaCBhbGdvcml0aG0gKi8KK3N0cnVjdCB1bmltYXBpbml0IHsKKwl1bnNpZ25lZCBzaG9ydCBhZHZpc2VkX2hhc2hzaXplOyAgLyogMCBpZiBubyBvcGluaW9uICovCisJdW5zaWduZWQgc2hvcnQgYWR2aXNlZF9oYXNoc3RlcDsgIC8qIDAgaWYgbm8gb3BpbmlvbiAqLworCXVuc2lnbmVkIHNob3J0IGFkdmlzZWRfaGFzaGxldmVsOyAvKiAwIGlmIG5vIG9waW5pb24gKi8KK307CisKKyNkZWZpbmUgVU5JX0RJUkVDVF9CQVNFIDB4RjAwMAkvKiBzdGFydCBvZiBEaXJlY3QgRm9udCBSZWdpb24gKi8KKyNkZWZpbmUgVU5JX0RJUkVDVF9NQVNLIDB4MDFGRgkvKiBEaXJlY3QgRm9udCBSZWdpb24gYml0bWFzayAqLworCisjZGVmaW5lCQlLX1JBVwkJMHgwMAorI2RlZmluZQkJS19YTEFURQkJMHgwMQorI2RlZmluZQkJS19NRURJVU1SQVcJMHgwMgorI2RlZmluZQkJS19VTklDT0RFCTB4MDMKKyNkZWZpbmUgS0RHS0JNT0RFCTB4NEI0NAkvKiBnZXRzIGN1cnJlbnQga2V5Ym9hcmQgbW9kZSAqLworI2RlZmluZSBLRFNLQk1PREUJMHg0QjQ1CS8qIHNldHMgY3VycmVudCBrZXlib2FyZCBtb2RlICovCisKKyNkZWZpbmUJCUtfTUVUQUJJVAkweDAzCisjZGVmaW5lCQlLX0VTQ1BSRUZJWAkweDA0CisjZGVmaW5lIEtER0tCTUVUQQkweDRCNjIJLyogZ2V0cyBtZXRhIGtleSBoYW5kbGluZyBtb2RlICovCisjZGVmaW5lIEtEU0tCTUVUQQkweDRCNjMJLyogc2V0cyBtZXRhIGtleSBoYW5kbGluZyBtb2RlICovCisKKyNkZWZpbmUJCUtfU0NST0xMTE9DSwkweDAxCisjZGVmaW5lCQlLX05VTUxPQ0sJMHgwMgorI2RlZmluZQkJS19DQVBTTE9DSwkweDA0CisjZGVmaW5lCUtER0tCTEVECTB4NEI2NAkvKiBnZXQgbGVkIGZsYWdzIChub3QgbGlnaHRzKSAqLworI2RlZmluZQlLRFNLQkxFRAkweDRCNjUJLyogc2V0IGxlZCBmbGFncyAobm90IGxpZ2h0cykgKi8KKworc3RydWN0IGtiZW50cnkgeworCXVuc2lnbmVkIGNoYXIga2JfdGFibGU7CisJdW5zaWduZWQgY2hhciBrYl9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCBrYl92YWx1ZTsKK307CisjZGVmaW5lCQlLX05PUk1UQUIJMHgwMAorI2RlZmluZQkJS19TSElGVFRBQgkweDAxCisjZGVmaW5lCQlLX0FMVFRBQgkweDAyCisjZGVmaW5lCQlLX0FMVFNISUZUVEFCCTB4MDMKKworI2RlZmluZSBLREdLQkVOVAkweDRCNDYJLyogZ2V0cyBvbmUgZW50cnkgaW4gdHJhbnNsYXRpb24gdGFibGUgKi8KKyNkZWZpbmUgS0RTS0JFTlQJMHg0QjQ3CS8qIHNldHMgb25lIGVudHJ5IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCisKK3N0cnVjdCBrYnNlbnRyeSB7CisJdW5zaWduZWQgY2hhciBrYl9mdW5jOworCXVuc2lnbmVkIGNoYXIga2Jfc3RyaW5nWzUxMl07Cit9OworI2RlZmluZSBLREdLQlNFTlQJMHg0QjQ4CS8qIGdldHMgb25lIGZ1bmN0aW9uIGtleSBzdHJpbmcgZW50cnkgKi8KKyNkZWZpbmUgS0RTS0JTRU5UCTB4NEI0OQkvKiBzZXRzIG9uZSBmdW5jdGlvbiBrZXkgc3RyaW5nIGVudHJ5ICovCisKK3N0cnVjdCBrYmRpYWNyIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBkaWFjciwgYmFzZSwgcmVzdWx0OworfTsKK3N0cnVjdCBrYmRpYWNycyB7CisgICAgICAgIHVuc2lnbmVkIGludCBrYl9jbnQ7ICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGZvbGxvd2luZyBhcnJheSAqLworCXN0cnVjdCBrYmRpYWNyIGtiZGlhY3JbMjU2XTsgICAgLyogTUFYX0RJQUNSIGZyb20ga2V5Ym9hcmQuaCAqLworfTsKKyNkZWZpbmUgS0RHS0JESUFDUiAgICAgIDB4NEI0QSAgLyogcmVhZCBrZXJuZWwgYWNjZW50IHRhYmxlICovCisjZGVmaW5lIEtEU0tCRElBQ1IgICAgICAweDRCNEIgIC8qIHdyaXRlIGtlcm5lbCBhY2NlbnQgdGFibGUgKi8KKworc3RydWN0IGtiZGlhY3J1YyB7CisJdW5zaWduZWQgaW50IGRpYWNyLCBiYXNlLCByZXN1bHQ7Cit9Oworc3RydWN0IGtiZGlhY3JzdWMgeworICAgICAgICB1bnNpZ25lZCBpbnQga2JfY250OyAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBmb2xsb3dpbmcgYXJyYXkgKi8KKwlzdHJ1Y3Qga2JkaWFjcnVjIGtiZGlhY3J1Y1syNTZdOyAgICAvKiBNQVhfRElBQ1IgZnJvbSBrZXlib2FyZC5oICovCit9OworI2RlZmluZSBLREdLQkRJQUNSVUMgICAgMHg0QkZBICAvKiByZWFkIGtlcm5lbCBhY2NlbnQgdGFibGUgLSBVQ1MgKi8KKyNkZWZpbmUgS0RTS0JESUFDUlVDICAgIDB4NEJGQiAgLyogd3JpdGUga2VybmVsIGFjY2VudCB0YWJsZSAtIFVDUyAqLworCitzdHJ1Y3Qga2JrZXljb2RlIHsKKwl1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIGtleWNvZGU7Cit9OworI2RlZmluZSBLREdFVEtFWUNPREUJMHg0QjRDCS8qIHJlYWQga2VybmVsIGtleWNvZGUgdGFibGUgZW50cnkgKi8KKyNkZWZpbmUgS0RTRVRLRVlDT0RFCTB4NEI0RAkvKiB3cml0ZSBrZXJuZWwga2V5Y29kZSB0YWJsZSBlbnRyeSAqLworCisjZGVmaW5lIEtEU0lHQUNDRVBUCTB4NEI0RQkvKiBhY2NlcHQga2JkIGdlbmVyYXRlZCBzaWduYWxzICovCisKK3N0cnVjdCBrYmRfcmVwZWF0IHsKKwlpbnQgZGVsYXk7CS8qIGluIG1zZWM7IDw9IDA6IGRvbid0IGNoYW5nZSAqLworCWludCBwZXJpb2Q7CS8qIGluIG1zZWM7IDw9IDA6IGRvbid0IGNoYW5nZSAqLworCQkJLyogZWFybGllciB0aGlzIGZpZWxkIHdhcyBtaXNuYW1lZCAicmF0ZSIgKi8KK307CisKKyNkZWZpbmUgS0RLQkRSRVAgICAgICAgIDB4NEI1MiAgLyogc2V0IGtleWJvYXJkIGRlbGF5L3JlcGVhdCByYXRlOworCQkJCSAqIGFjdHVhbGx5IHVzZWQgdmFsdWVzIGFyZSByZXR1cm5lZCAqLworCisjZGVmaW5lIEtERk9OVE9QCTB4NEI3MgkvKiBmb250IG9wZXJhdGlvbnMgKi8KKworc3RydWN0IGNvbnNvbGVfZm9udF9vcCB7CisJdW5zaWduZWQgaW50IG9wOwkvKiBvcGVyYXRpb24gY29kZSBLRF9GT05UX09QXyogKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CS8qIEtEX0ZPTlRfRkxBR18qICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CS8qIGZvbnQgc2l6ZSAqLworCXVuc2lnbmVkIGludCBjaGFyY291bnQ7CisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogZm9udCBkYXRhIHdpdGggaGVpZ2h0IGZpeGVkIHRvIDMyICovCit9OworCitzdHJ1Y3QgY29uc29sZV9mb250IHsKKwl1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsJLyogZm9udCBzaXplICovCisJdW5zaWduZWQgaW50IGNoYXJjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBmb250IGRhdGEgd2l0aCBoZWlnaHQgZml4ZWQgdG8gMzIgKi8KK307CisKKyNkZWZpbmUgS0RfRk9OVF9PUF9TRVQJCTAJLyogU2V0IGZvbnQgKi8KKyNkZWZpbmUgS0RfRk9OVF9PUF9HRVQJCTEJLyogR2V0IGZvbnQgKi8KKyNkZWZpbmUgS0RfRk9OVF9PUF9TRVRfREVGQVVMVAkyCS8qIFNldCBmb250IHRvIGRlZmF1bHQsIGRhdGEgcG9pbnRzIHRvIG5hbWUgLyBOVUxMICovCisjZGVmaW5lIEtEX0ZPTlRfT1BfQ09QWQkJMwkvKiBDb3B5IGZyb20gYW5vdGhlciBjb25zb2xlICovCisKKyNkZWZpbmUgS0RfRk9OVF9GTEFHX0RPTlRfUkVDQUxDIAkxCS8qIERvbid0IHJlY2FsY3VsYXRlIGh3IGNoYXJjZWxsIHNpemUgW2NvbXBhdF0gKi8KKworLyogbm90ZTogMHg0QjAwLTB4NEI0RSBhbGwgaGF2ZSBoYWQgYSB2YWx1ZSBhdCBzb21lIHRpbWU7CisgICBkb24ndCByZXVzZSBmb3IgdGhlIHRpbWUgYmVpbmcgKi8KKy8qIG5vdGU6IDB4NEI2MC0weDRCNkQsIDB4NEI3MC0weDRCNzIgdXNlZCBhYm92ZSAqLworCisjZW5kaWYgLyogX0xJTlVYX0tEX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2Rldl90LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkZXZfdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTU1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tkZXZfdC5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX0xJTlVYX0tERVZfVF9ICisjZGVmaW5lIF9MSU5VWF9LREVWX1RfSAorCisvKgorU29tZSBwcm9ncmFtcyB3YW50IHRoZWlyIGRlZmluaXRpb25zIG9mIE1BSk9SIGFuZCBNSU5PUiBhbmQgTUtERVYKK2Zyb20gdGhlIGtlcm5lbCBzb3VyY2VzLiBUaGVzZSBtdXN0IGJlIHRoZSBleHRlcm5hbGx5IHZpc2libGUgb25lcy4KKyovCisjZGVmaW5lIE1BSk9SKGRldikJKChkZXYpPj44KQorI2RlZmluZSBNSU5PUihkZXYpCSgoZGV2KSAmIDB4ZmYpCisjZGVmaW5lIE1LREVWKG1hLG1pKQkoKG1hKTw8OCB8IChtaSkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTIwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX0xJTlVYX0tFUk5FTF9ICisjZGVmaW5lIF9MSU5VWF9LRVJORUxfSAorCisvKgorICogJ2tlcm5lbC5oJyBjb250YWlucyBzb21lIG9mdGVuLXVzZWQgZnVuY3Rpb24gcHJvdG90eXBlcyBldGMKKyAqLworCisKKyNkZWZpbmUgU0lfTE9BRF9TSElGVAkxNgorc3RydWN0IHN5c2luZm8geworCWxvbmcgdXB0aW1lOwkJCS8qIFNlY29uZHMgc2luY2UgYm9vdCAqLworCXVuc2lnbmVkIGxvbmcgbG9hZHNbM107CQkvKiAxLCA1LCBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFscmFtOwkJLyogVG90YWwgdXNhYmxlIG1haW4gbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVyYW07CQkvKiBBdmFpbGFibGUgbWVtb3J5IHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIHNoYXJlZHJhbTsJLyogQW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcnJhbTsJLyogTWVtb3J5IHVzZWQgYnkgYnVmZmVycyAqLworCXVuc2lnbmVkIGxvbmcgdG90YWxzd2FwOwkvKiBUb3RhbCBzd2FwIHNwYWNlIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWVzd2FwOwkJLyogc3dhcCBzcGFjZSBzdGlsbCBhdmFpbGFibGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm9jczsJCS8qIE51bWJlciBvZiBjdXJyZW50IHByb2Nlc3NlcyAqLworCXVuc2lnbmVkIHNob3J0IHBhZDsJCS8qIGV4cGxpY2l0IHBhZGRpbmcgZm9yIG02OGsgKi8KKwl1bnNpZ25lZCBsb25nIHRvdGFsaGlnaDsJLyogVG90YWwgaGlnaCBtZW1vcnkgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgZnJlZWhpZ2g7CQkvKiBBdmFpbGFibGUgaGlnaCBtZW1vcnkgc2l6ZSAqLworCXVuc2lnbmVkIGludCBtZW1fdW5pdDsJCS8qIE1lbW9yeSB1bml0IHNpemUgaW4gYnl0ZXMgKi8KKwljaGFyIF9mWzIwLTIqc2l6ZW9mKGxvbmcpLXNpemVvZihpbnQpXTsJLyogUGFkZGluZzogbGliYzUgdXNlcyB0aGlzLi4gKi8KK307CisKKy8qIEZvcmNlIGEgY29tcGlsYXRpb24gZXJyb3IgaWYgY29uZGl0aW9uIGlzIHRydWUgKi8KKyNkZWZpbmUgQlVJTERfQlVHX09OKGNvbmRpdGlvbikgKCh2b2lkKXNpemVvZihjaGFyWzEgLSAyKiEhKGNvbmRpdGlvbildKSkKKworLyogRm9yY2UgYSBjb21waWxhdGlvbiBlcnJvciBpZiBjb25kaXRpb24gaXMgdHJ1ZSwgYnV0IGFsc28gcHJvZHVjZSBhCisgICByZXN1bHQgKG9mIHZhbHVlIDAgYW5kIHR5cGUgc2l6ZV90KSwgc28gdGhlIGV4cHJlc3Npb24gY2FuIGJlIHVzZWQKKyAgIGUuZy4gaW4gYSBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZXIgKG9yIHdoZXJlLWV2ZXIgZWxzZSBjb21tYSBleHByZXNzaW9ucworICAgYXJlbid0IHBlcm1pdHRlZCkuICovCisjZGVmaW5lIEJVSUxEX0JVR19PTl9aRVJPKGUpIChzaXplb2YoY2hhclsxIC0gMiAqICEhKGUpXSkgLSAxKQorCisvKiBUcmFwIHBhc3RlcnMgb2YgX19GVU5DVElPTl9fIGF0IGNvbXBpbGUtdGltZSAqLworI2RlZmluZSBfX0ZVTkNUSU9OX18gKF9fZnVuY19fKQorCisvKiBUaGlzIGhlbHBzIHVzIHRvIGF2b2lkICNpZmRlZiBDT05GSUdfTlVNQSAqLworI2lmZGVmIENPTkZJR19OVU1BCisjZGVmaW5lIE5VTUFfQlVJTEQgMQorI2Vsc2UKKyNkZWZpbmUgTlVNQV9CVUlMRCAwCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjZiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tlcm5lbGNhcGkuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogJElkOiBrZXJuZWxjYXBpLmgsdiAxLjguNi4yIDIwMDEvMDIvMDcgMTE6MzE6MzEga2FpIEV4cCAkCisgKiAKKyAqIEtlcm5lbCBDQVBJIDIuMCBJbnRlcmZhY2UgZm9yIExpbnV4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMTk5NyBieSBDYXJzdGVuIFBhZXRoIChjYWxsZUBjYWxsZS5pbi1iZXJsaW4uZGUpCisgKiAKKyAqLworCisjaWZuZGVmIF9fS0VSTkVMQ0FQSV9IX18KKyNkZWZpbmUgX19LRVJORUxDQVBJX0hfXworCisjZGVmaW5lIENBUElfTUFYQVBQTAkyNDAJLyogbWF4aW11bSBudW1iZXIgb2YgYXBwbGljYXRpb25zICAqLworI2RlZmluZSBDQVBJX01BWENPTlRSCTMyCS8qIG1heGltdW0gbnVtYmVyIG9mIGNvbnRyb2xsZXIgICAgKi8KKyNkZWZpbmUgQ0FQSV9NQVhEQVRBV0lORE9XCTgKKworCit0eXBlZGVmIHN0cnVjdCBrY2FwaV9mbGFnZGVmIHsKKwlpbnQgY29udHI7CisJaW50IGZsYWc7Cit9IGtjYXBpX2ZsYWdkZWY7CisKK3R5cGVkZWYgc3RydWN0IGtjYXBpX2NhcmRkZWYgeworCWNoYXIJCWRyaXZlclszMl07CisJdW5zaWduZWQgaW50CXBvcnQ7CisJdW5zaWduZWQJaXJxOworCXVuc2lnbmVkIGludAltZW1iYXNlOworCWludAkJY2FyZG5yOworfSBrY2FwaV9jYXJkZGVmOworCisvKiBuZXcgaW9jdGxzID49IDEwICovCisjZGVmaW5lIEtDQVBJX0NNRF9UUkFDRQkJMTAKKyNkZWZpbmUgS0NBUElfQ01EX0FERENBUkQJMTEJLyogT0JTT0xFVEUgKi8KKworLyogCisgKiBmbGFnID4gMiA9PiB0cmFjZSBhbHNvIGRhdGEKKyAqIGZsYWcgJiAxID0+IHNob3cgdHJhY2UKKyAqLworI2RlZmluZSBLQ0FQSV9UUkFDRV9PRkYJCQkwCisjZGVmaW5lIEtDQVBJX1RSQUNFX1NIT1JUX05PX0RBVEEJMQorI2RlZmluZSBLQ0FQSV9UUkFDRV9GVUxMX05PX0RBVEEJMgorI2RlZmluZSBLQ0FQSV9UUkFDRV9TSE9SVAkJMworI2RlZmluZSBLQ0FQSV9UUkFDRV9GVUxMCQk0CisKKworCisjZW5kaWYJCQkJLyogX19LRVJORUxDQVBJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXlib2FyZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXlib2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTM5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tleWJvYXJkLmgKQEAgLTAsMCArMSw0NDIgQEAKKyNpZm5kZWYgX19MSU5VWF9LRVlCT0FSRF9ICisjZGVmaW5lIF9fTElOVVhfS0VZQk9BUkRfSAorCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjZGVmaW5lIEtHX1NISUZUCTAKKyNkZWZpbmUgS0dfQ1RSTAkJMgorI2RlZmluZSBLR19BTFQJCTMKKyNkZWZpbmUgS0dfQUxUR1IJMQorI2RlZmluZSBLR19TSElGVEwJNAorI2RlZmluZSBLR19LQU5BU0hJRlQJNAorI2RlZmluZSBLR19TSElGVFIJNQorI2RlZmluZSBLR19DVFJMTAk2CisjZGVmaW5lIEtHX0NUUkxSCTcKKyNkZWZpbmUgS0dfQ0FQU1NISUZUCTgKKworI2RlZmluZSBOUl9TSElGVAk5CisKKyNkZWZpbmUgTlJfS0VZUwkJMjU2CisjZGVmaW5lIE1BWF9OUl9LRVlNQVBTCTI1NgorLyogVGhpcyBtZWFucyAxMjhLYiBpZiBhbGwga2V5bWFwcyBhcmUgYWxsb2NhdGVkLiBPbmx5IHRoZSBzdXBlcnVzZXIKKwltYXkgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBrZXltYXBzIGJleW9uZCBNQVhfTlJfT0ZfVVNFUl9LRVlNQVBTLiAqLworI2RlZmluZSBNQVhfTlJfT0ZfVVNFUl9LRVlNQVBTIDI1NiAJLyogc2hvdWxkIGJlIGF0IGxlYXN0IDcgKi8KKworCisjZGVmaW5lIE1BWF9OUl9GVU5DCTI1NgkvKiBtYXggbnIgb2Ygc3RyaW5ncyBhc3NpZ25lZCB0byBrZXlzICovCisKKyNkZWZpbmUgS1RfTEFUSU4JMAkvKiB3ZSBkZXBlbmQgb24gdGhpcyBiZWluZyB6ZXJvICovCisjZGVmaW5lIEtUX0xFVFRFUgkxMQkvKiBzeW1ib2wgdGhhdCBjYW4gYmUgYWN0ZWQgdXBvbiBieSBDYXBzTG9jayAqLworI2RlZmluZSBLVF9GTgkJMQorI2RlZmluZSBLVF9TUEVDCQkyCisjZGVmaW5lIEtUX1BBRAkJMworI2RlZmluZSBLVF9ERUFECQk0CisjZGVmaW5lIEtUX0NPTlMJCTUKKyNkZWZpbmUgS1RfQ1VSCQk2CisjZGVmaW5lIEtUX1NISUZUCTcKKyNkZWZpbmUgS1RfTUVUQQkJOAorI2RlZmluZSBLVF9BU0NJSQk5CisjZGVmaW5lIEtUX0xPQ0sJCTEwCisjZGVmaW5lIEtUX1NMT0NLCTEyCisjZGVmaW5lIEtUX0JSTAkJMTQKKworI2RlZmluZSBLKHQsdikJCSgoKHQpPDw4KXwodikpCisjZGVmaW5lIEtUWVAoeCkJCSgoeCkgPj4gOCkKKyNkZWZpbmUgS1ZBTCh4KQkJKCh4KSAmIDB4ZmYpCisKKyNkZWZpbmUgS19GMQkJSyhLVF9GTiwwKQorI2RlZmluZSBLX0YyCQlLKEtUX0ZOLDEpCisjZGVmaW5lIEtfRjMJCUsoS1RfRk4sMikKKyNkZWZpbmUgS19GNAkJSyhLVF9GTiwzKQorI2RlZmluZSBLX0Y1CQlLKEtUX0ZOLDQpCisjZGVmaW5lIEtfRjYJCUsoS1RfRk4sNSkKKyNkZWZpbmUgS19GNwkJSyhLVF9GTiw2KQorI2RlZmluZSBLX0Y4CQlLKEtUX0ZOLDcpCisjZGVmaW5lIEtfRjkJCUsoS1RfRk4sOCkKKyNkZWZpbmUgS19GMTAJCUsoS1RfRk4sOSkKKyNkZWZpbmUgS19GMTEJCUsoS1RfRk4sMTApCisjZGVmaW5lIEtfRjEyCQlLKEtUX0ZOLDExKQorI2RlZmluZSBLX0YxMwkJSyhLVF9GTiwxMikKKyNkZWZpbmUgS19GMTQJCUsoS1RfRk4sMTMpCisjZGVmaW5lIEtfRjE1CQlLKEtUX0ZOLDE0KQorI2RlZmluZSBLX0YxNgkJSyhLVF9GTiwxNSkKKyNkZWZpbmUgS19GMTcJCUsoS1RfRk4sMTYpCisjZGVmaW5lIEtfRjE4CQlLKEtUX0ZOLDE3KQorI2RlZmluZSBLX0YxOQkJSyhLVF9GTiwxOCkKKyNkZWZpbmUgS19GMjAJCUsoS1RfRk4sMTkpCisjZGVmaW5lIEtfRklORAkJSyhLVF9GTiwyMCkKKyNkZWZpbmUgS19JTlNFUlQJSyhLVF9GTiwyMSkKKyNkZWZpbmUgS19SRU1PVkUJSyhLVF9GTiwyMikKKyNkZWZpbmUgS19TRUxFQ1QJSyhLVF9GTiwyMykKKyNkZWZpbmUgS19QR1VQCQlLKEtUX0ZOLDI0KSAvKiBQR1VQIGlzIGEgc3lub255bSBmb3IgUFJJT1IgKi8KKyNkZWZpbmUgS19QR0ROCQlLKEtUX0ZOLDI1KSAvKiBQR0ROIGlzIGEgc3lub255bSBmb3IgTkVYVCAqLworI2RlZmluZSBLX01BQ1JPCSAJSyhLVF9GTiwyNikKKyNkZWZpbmUgS19IRUxQCQlLKEtUX0ZOLDI3KQorI2RlZmluZSBLX0RPCQlLKEtUX0ZOLDI4KQorI2RlZmluZSBLX1BBVVNFCSAJSyhLVF9GTiwyOSkKKyNkZWZpbmUgS19GMjEJCUsoS1RfRk4sMzApCisjZGVmaW5lIEtfRjIyCQlLKEtUX0ZOLDMxKQorI2RlZmluZSBLX0YyMwkJSyhLVF9GTiwzMikKKyNkZWZpbmUgS19GMjQJCUsoS1RfRk4sMzMpCisjZGVmaW5lIEtfRjI1CQlLKEtUX0ZOLDM0KQorI2RlZmluZSBLX0YyNgkJSyhLVF9GTiwzNSkKKyNkZWZpbmUgS19GMjcJCUsoS1RfRk4sMzYpCisjZGVmaW5lIEtfRjI4CQlLKEtUX0ZOLDM3KQorI2RlZmluZSBLX0YyOQkJSyhLVF9GTiwzOCkKKyNkZWZpbmUgS19GMzAJCUsoS1RfRk4sMzkpCisjZGVmaW5lIEtfRjMxCQlLKEtUX0ZOLDQwKQorI2RlZmluZSBLX0YzMgkJSyhLVF9GTiw0MSkKKyNkZWZpbmUgS19GMzMJCUsoS1RfRk4sNDIpCisjZGVmaW5lIEtfRjM0CQlLKEtUX0ZOLDQzKQorI2RlZmluZSBLX0YzNQkJSyhLVF9GTiw0NCkKKyNkZWZpbmUgS19GMzYJCUsoS1RfRk4sNDUpCisjZGVmaW5lIEtfRjM3CQlLKEtUX0ZOLDQ2KQorI2RlZmluZSBLX0YzOAkJSyhLVF9GTiw0NykKKyNkZWZpbmUgS19GMzkJCUsoS1RfRk4sNDgpCisjZGVmaW5lIEtfRjQwCQlLKEtUX0ZOLDQ5KQorI2RlZmluZSBLX0Y0MQkJSyhLVF9GTiw1MCkKKyNkZWZpbmUgS19GNDIJCUsoS1RfRk4sNTEpCisjZGVmaW5lIEtfRjQzCQlLKEtUX0ZOLDUyKQorI2RlZmluZSBLX0Y0NAkJSyhLVF9GTiw1MykKKyNkZWZpbmUgS19GNDUJCUsoS1RfRk4sNTQpCisjZGVmaW5lIEtfRjQ2CQlLKEtUX0ZOLDU1KQorI2RlZmluZSBLX0Y0NwkJSyhLVF9GTiw1NikKKyNkZWZpbmUgS19GNDgJCUsoS1RfRk4sNTcpCisjZGVmaW5lIEtfRjQ5CQlLKEtUX0ZOLDU4KQorI2RlZmluZSBLX0Y1MAkJSyhLVF9GTiw1OSkKKyNkZWZpbmUgS19GNTEJCUsoS1RfRk4sNjApCisjZGVmaW5lIEtfRjUyCQlLKEtUX0ZOLDYxKQorI2RlZmluZSBLX0Y1MwkJSyhLVF9GTiw2MikKKyNkZWZpbmUgS19GNTQJCUsoS1RfRk4sNjMpCisjZGVmaW5lIEtfRjU1CQlLKEtUX0ZOLDY0KQorI2RlZmluZSBLX0Y1NgkJSyhLVF9GTiw2NSkKKyNkZWZpbmUgS19GNTcJCUsoS1RfRk4sNjYpCisjZGVmaW5lIEtfRjU4CQlLKEtUX0ZOLDY3KQorI2RlZmluZSBLX0Y1OQkJSyhLVF9GTiw2OCkKKyNkZWZpbmUgS19GNjAJCUsoS1RfRk4sNjkpCisjZGVmaW5lIEtfRjYxCQlLKEtUX0ZOLDcwKQorI2RlZmluZSBLX0Y2MgkJSyhLVF9GTiw3MSkKKyNkZWZpbmUgS19GNjMJCUsoS1RfRk4sNzIpCisjZGVmaW5lIEtfRjY0CQlLKEtUX0ZOLDczKQorI2RlZmluZSBLX0Y2NQkJSyhLVF9GTiw3NCkKKyNkZWZpbmUgS19GNjYJCUsoS1RfRk4sNzUpCisjZGVmaW5lIEtfRjY3CQlLKEtUX0ZOLDc2KQorI2RlZmluZSBLX0Y2OAkJSyhLVF9GTiw3NykKKyNkZWZpbmUgS19GNjkJCUsoS1RfRk4sNzgpCisjZGVmaW5lIEtfRjcwCQlLKEtUX0ZOLDc5KQorI2RlZmluZSBLX0Y3MQkJSyhLVF9GTiw4MCkKKyNkZWZpbmUgS19GNzIJCUsoS1RfRk4sODEpCisjZGVmaW5lIEtfRjczCQlLKEtUX0ZOLDgyKQorI2RlZmluZSBLX0Y3NAkJSyhLVF9GTiw4MykKKyNkZWZpbmUgS19GNzUJCUsoS1RfRk4sODQpCisjZGVmaW5lIEtfRjc2CQlLKEtUX0ZOLDg1KQorI2RlZmluZSBLX0Y3NwkJSyhLVF9GTiw4NikKKyNkZWZpbmUgS19GNzgJCUsoS1RfRk4sODcpCisjZGVmaW5lIEtfRjc5CQlLKEtUX0ZOLDg4KQorI2RlZmluZSBLX0Y4MAkJSyhLVF9GTiw4OSkKKyNkZWZpbmUgS19GODEJCUsoS1RfRk4sOTApCisjZGVmaW5lIEtfRjgyCQlLKEtUX0ZOLDkxKQorI2RlZmluZSBLX0Y4MwkJSyhLVF9GTiw5MikKKyNkZWZpbmUgS19GODQJCUsoS1RfRk4sOTMpCisjZGVmaW5lIEtfRjg1CQlLKEtUX0ZOLDk0KQorI2RlZmluZSBLX0Y4NgkJSyhLVF9GTiw5NSkKKyNkZWZpbmUgS19GODcJCUsoS1RfRk4sOTYpCisjZGVmaW5lIEtfRjg4CQlLKEtUX0ZOLDk3KQorI2RlZmluZSBLX0Y4OQkJSyhLVF9GTiw5OCkKKyNkZWZpbmUgS19GOTAJCUsoS1RfRk4sOTkpCisjZGVmaW5lIEtfRjkxCQlLKEtUX0ZOLDEwMCkKKyNkZWZpbmUgS19GOTIJCUsoS1RfRk4sMTAxKQorI2RlZmluZSBLX0Y5MwkJSyhLVF9GTiwxMDIpCisjZGVmaW5lIEtfRjk0CQlLKEtUX0ZOLDEwMykKKyNkZWZpbmUgS19GOTUJCUsoS1RfRk4sMTA0KQorI2RlZmluZSBLX0Y5NgkJSyhLVF9GTiwxMDUpCisjZGVmaW5lIEtfRjk3CQlLKEtUX0ZOLDEwNikKKyNkZWZpbmUgS19GOTgJCUsoS1RfRk4sMTA3KQorI2RlZmluZSBLX0Y5OQkJSyhLVF9GTiwxMDgpCisjZGVmaW5lIEtfRjEwMAkJSyhLVF9GTiwxMDkpCisjZGVmaW5lIEtfRjEwMQkJSyhLVF9GTiwxMTApCisjZGVmaW5lIEtfRjEwMgkJSyhLVF9GTiwxMTEpCisjZGVmaW5lIEtfRjEwMwkJSyhLVF9GTiwxMTIpCisjZGVmaW5lIEtfRjEwNAkJSyhLVF9GTiwxMTMpCisjZGVmaW5lIEtfRjEwNQkJSyhLVF9GTiwxMTQpCisjZGVmaW5lIEtfRjEwNgkJSyhLVF9GTiwxMTUpCisjZGVmaW5lIEtfRjEwNwkJSyhLVF9GTiwxMTYpCisjZGVmaW5lIEtfRjEwOAkJSyhLVF9GTiwxMTcpCisjZGVmaW5lIEtfRjEwOQkJSyhLVF9GTiwxMTgpCisjZGVmaW5lIEtfRjExMAkJSyhLVF9GTiwxMTkpCisjZGVmaW5lIEtfRjExMQkJSyhLVF9GTiwxMjApCisjZGVmaW5lIEtfRjExMgkJSyhLVF9GTiwxMjEpCisjZGVmaW5lIEtfRjExMwkJSyhLVF9GTiwxMjIpCisjZGVmaW5lIEtfRjExNAkJSyhLVF9GTiwxMjMpCisjZGVmaW5lIEtfRjExNQkJSyhLVF9GTiwxMjQpCisjZGVmaW5lIEtfRjExNgkJSyhLVF9GTiwxMjUpCisjZGVmaW5lIEtfRjExNwkJSyhLVF9GTiwxMjYpCisjZGVmaW5lIEtfRjExOAkJSyhLVF9GTiwxMjcpCisjZGVmaW5lIEtfRjExOQkJSyhLVF9GTiwxMjgpCisjZGVmaW5lIEtfRjEyMAkJSyhLVF9GTiwxMjkpCisjZGVmaW5lIEtfRjEyMQkJSyhLVF9GTiwxMzApCisjZGVmaW5lIEtfRjEyMgkJSyhLVF9GTiwxMzEpCisjZGVmaW5lIEtfRjEyMwkJSyhLVF9GTiwxMzIpCisjZGVmaW5lIEtfRjEyNAkJSyhLVF9GTiwxMzMpCisjZGVmaW5lIEtfRjEyNQkJSyhLVF9GTiwxMzQpCisjZGVmaW5lIEtfRjEyNgkJSyhLVF9GTiwxMzUpCisjZGVmaW5lIEtfRjEyNwkJSyhLVF9GTiwxMzYpCisjZGVmaW5lIEtfRjEyOAkJSyhLVF9GTiwxMzcpCisjZGVmaW5lIEtfRjEyOQkJSyhLVF9GTiwxMzgpCisjZGVmaW5lIEtfRjEzMAkJSyhLVF9GTiwxMzkpCisjZGVmaW5lIEtfRjEzMQkJSyhLVF9GTiwxNDApCisjZGVmaW5lIEtfRjEzMgkJSyhLVF9GTiwxNDEpCisjZGVmaW5lIEtfRjEzMwkJSyhLVF9GTiwxNDIpCisjZGVmaW5lIEtfRjEzNAkJSyhLVF9GTiwxNDMpCisjZGVmaW5lIEtfRjEzNQkJSyhLVF9GTiwxNDQpCisjZGVmaW5lIEtfRjEzNgkJSyhLVF9GTiwxNDUpCisjZGVmaW5lIEtfRjEzNwkJSyhLVF9GTiwxNDYpCisjZGVmaW5lIEtfRjEzOAkJSyhLVF9GTiwxNDcpCisjZGVmaW5lIEtfRjEzOQkJSyhLVF9GTiwxNDgpCisjZGVmaW5lIEtfRjE0MAkJSyhLVF9GTiwxNDkpCisjZGVmaW5lIEtfRjE0MQkJSyhLVF9GTiwxNTApCisjZGVmaW5lIEtfRjE0MgkJSyhLVF9GTiwxNTEpCisjZGVmaW5lIEtfRjE0MwkJSyhLVF9GTiwxNTIpCisjZGVmaW5lIEtfRjE0NAkJSyhLVF9GTiwxNTMpCisjZGVmaW5lIEtfRjE0NQkJSyhLVF9GTiwxNTQpCisjZGVmaW5lIEtfRjE0NgkJSyhLVF9GTiwxNTUpCisjZGVmaW5lIEtfRjE0NwkJSyhLVF9GTiwxNTYpCisjZGVmaW5lIEtfRjE0OAkJSyhLVF9GTiwxNTcpCisjZGVmaW5lIEtfRjE0OQkJSyhLVF9GTiwxNTgpCisjZGVmaW5lIEtfRjE1MAkJSyhLVF9GTiwxNTkpCisjZGVmaW5lIEtfRjE1MQkJSyhLVF9GTiwxNjApCisjZGVmaW5lIEtfRjE1MgkJSyhLVF9GTiwxNjEpCisjZGVmaW5lIEtfRjE1MwkJSyhLVF9GTiwxNjIpCisjZGVmaW5lIEtfRjE1NAkJSyhLVF9GTiwxNjMpCisjZGVmaW5lIEtfRjE1NQkJSyhLVF9GTiwxNjQpCisjZGVmaW5lIEtfRjE1NgkJSyhLVF9GTiwxNjUpCisjZGVmaW5lIEtfRjE1NwkJSyhLVF9GTiwxNjYpCisjZGVmaW5lIEtfRjE1OAkJSyhLVF9GTiwxNjcpCisjZGVmaW5lIEtfRjE1OQkJSyhLVF9GTiwxNjgpCisjZGVmaW5lIEtfRjE2MAkJSyhLVF9GTiwxNjkpCisjZGVmaW5lIEtfRjE2MQkJSyhLVF9GTiwxNzApCisjZGVmaW5lIEtfRjE2MgkJSyhLVF9GTiwxNzEpCisjZGVmaW5lIEtfRjE2MwkJSyhLVF9GTiwxNzIpCisjZGVmaW5lIEtfRjE2NAkJSyhLVF9GTiwxNzMpCisjZGVmaW5lIEtfRjE2NQkJSyhLVF9GTiwxNzQpCisjZGVmaW5lIEtfRjE2NgkJSyhLVF9GTiwxNzUpCisjZGVmaW5lIEtfRjE2NwkJSyhLVF9GTiwxNzYpCisjZGVmaW5lIEtfRjE2OAkJSyhLVF9GTiwxNzcpCisjZGVmaW5lIEtfRjE2OQkJSyhLVF9GTiwxNzgpCisjZGVmaW5lIEtfRjE3MAkJSyhLVF9GTiwxNzkpCisjZGVmaW5lIEtfRjE3MQkJSyhLVF9GTiwxODApCisjZGVmaW5lIEtfRjE3MgkJSyhLVF9GTiwxODEpCisjZGVmaW5lIEtfRjE3MwkJSyhLVF9GTiwxODIpCisjZGVmaW5lIEtfRjE3NAkJSyhLVF9GTiwxODMpCisjZGVmaW5lIEtfRjE3NQkJSyhLVF9GTiwxODQpCisjZGVmaW5lIEtfRjE3NgkJSyhLVF9GTiwxODUpCisjZGVmaW5lIEtfRjE3NwkJSyhLVF9GTiwxODYpCisjZGVmaW5lIEtfRjE3OAkJSyhLVF9GTiwxODcpCisjZGVmaW5lIEtfRjE3OQkJSyhLVF9GTiwxODgpCisjZGVmaW5lIEtfRjE4MAkJSyhLVF9GTiwxODkpCisjZGVmaW5lIEtfRjE4MQkJSyhLVF9GTiwxOTApCisjZGVmaW5lIEtfRjE4MgkJSyhLVF9GTiwxOTEpCisjZGVmaW5lIEtfRjE4MwkJSyhLVF9GTiwxOTIpCisjZGVmaW5lIEtfRjE4NAkJSyhLVF9GTiwxOTMpCisjZGVmaW5lIEtfRjE4NQkJSyhLVF9GTiwxOTQpCisjZGVmaW5lIEtfRjE4NgkJSyhLVF9GTiwxOTUpCisjZGVmaW5lIEtfRjE4NwkJSyhLVF9GTiwxOTYpCisjZGVmaW5lIEtfRjE4OAkJSyhLVF9GTiwxOTcpCisjZGVmaW5lIEtfRjE4OQkJSyhLVF9GTiwxOTgpCisjZGVmaW5lIEtfRjE5MAkJSyhLVF9GTiwxOTkpCisjZGVmaW5lIEtfRjE5MQkJSyhLVF9GTiwyMDApCisjZGVmaW5lIEtfRjE5MgkJSyhLVF9GTiwyMDEpCisjZGVmaW5lIEtfRjE5MwkJSyhLVF9GTiwyMDIpCisjZGVmaW5lIEtfRjE5NAkJSyhLVF9GTiwyMDMpCisjZGVmaW5lIEtfRjE5NQkJSyhLVF9GTiwyMDQpCisjZGVmaW5lIEtfRjE5NgkJSyhLVF9GTiwyMDUpCisjZGVmaW5lIEtfRjE5NwkJSyhLVF9GTiwyMDYpCisjZGVmaW5lIEtfRjE5OAkJSyhLVF9GTiwyMDcpCisjZGVmaW5lIEtfRjE5OQkJSyhLVF9GTiwyMDgpCisjZGVmaW5lIEtfRjIwMAkJSyhLVF9GTiwyMDkpCisjZGVmaW5lIEtfRjIwMQkJSyhLVF9GTiwyMTApCisjZGVmaW5lIEtfRjIwMgkJSyhLVF9GTiwyMTEpCisjZGVmaW5lIEtfRjIwMwkJSyhLVF9GTiwyMTIpCisjZGVmaW5lIEtfRjIwNAkJSyhLVF9GTiwyMTMpCisjZGVmaW5lIEtfRjIwNQkJSyhLVF9GTiwyMTQpCisjZGVmaW5lIEtfRjIwNgkJSyhLVF9GTiwyMTUpCisjZGVmaW5lIEtfRjIwNwkJSyhLVF9GTiwyMTYpCisjZGVmaW5lIEtfRjIwOAkJSyhLVF9GTiwyMTcpCisjZGVmaW5lIEtfRjIwOQkJSyhLVF9GTiwyMTgpCisjZGVmaW5lIEtfRjIxMAkJSyhLVF9GTiwyMTkpCisjZGVmaW5lIEtfRjIxMQkJSyhLVF9GTiwyMjApCisjZGVmaW5lIEtfRjIxMgkJSyhLVF9GTiwyMjEpCisjZGVmaW5lIEtfRjIxMwkJSyhLVF9GTiwyMjIpCisjZGVmaW5lIEtfRjIxNAkJSyhLVF9GTiwyMjMpCisjZGVmaW5lIEtfRjIxNQkJSyhLVF9GTiwyMjQpCisjZGVmaW5lIEtfRjIxNgkJSyhLVF9GTiwyMjUpCisjZGVmaW5lIEtfRjIxNwkJSyhLVF9GTiwyMjYpCisjZGVmaW5lIEtfRjIxOAkJSyhLVF9GTiwyMjcpCisjZGVmaW5lIEtfRjIxOQkJSyhLVF9GTiwyMjgpCisjZGVmaW5lIEtfRjIyMAkJSyhLVF9GTiwyMjkpCisjZGVmaW5lIEtfRjIyMQkJSyhLVF9GTiwyMzApCisjZGVmaW5lIEtfRjIyMgkJSyhLVF9GTiwyMzEpCisjZGVmaW5lIEtfRjIyMwkJSyhLVF9GTiwyMzIpCisjZGVmaW5lIEtfRjIyNAkJSyhLVF9GTiwyMzMpCisjZGVmaW5lIEtfRjIyNQkJSyhLVF9GTiwyMzQpCisjZGVmaW5lIEtfRjIyNgkJSyhLVF9GTiwyMzUpCisjZGVmaW5lIEtfRjIyNwkJSyhLVF9GTiwyMzYpCisjZGVmaW5lIEtfRjIyOAkJSyhLVF9GTiwyMzcpCisjZGVmaW5lIEtfRjIyOQkJSyhLVF9GTiwyMzgpCisjZGVmaW5lIEtfRjIzMAkJSyhLVF9GTiwyMzkpCisjZGVmaW5lIEtfRjIzMQkJSyhLVF9GTiwyNDApCisjZGVmaW5lIEtfRjIzMgkJSyhLVF9GTiwyNDEpCisjZGVmaW5lIEtfRjIzMwkJSyhLVF9GTiwyNDIpCisjZGVmaW5lIEtfRjIzNAkJSyhLVF9GTiwyNDMpCisjZGVmaW5lIEtfRjIzNQkJSyhLVF9GTiwyNDQpCisjZGVmaW5lIEtfRjIzNgkJSyhLVF9GTiwyNDUpCisjZGVmaW5lIEtfRjIzNwkJSyhLVF9GTiwyNDYpCisjZGVmaW5lIEtfRjIzOAkJSyhLVF9GTiwyNDcpCisjZGVmaW5lIEtfRjIzOQkJSyhLVF9GTiwyNDgpCisjZGVmaW5lIEtfRjI0MAkJSyhLVF9GTiwyNDkpCisjZGVmaW5lIEtfRjI0MQkJSyhLVF9GTiwyNTApCisjZGVmaW5lIEtfRjI0MgkJSyhLVF9GTiwyNTEpCisjZGVmaW5lIEtfRjI0MwkJSyhLVF9GTiwyNTIpCisjZGVmaW5lIEtfRjI0NAkJSyhLVF9GTiwyNTMpCisjZGVmaW5lIEtfRjI0NQkJSyhLVF9GTiwyNTQpCisjZGVmaW5lIEtfVU5ETwkJSyhLVF9GTiwyNTUpCisKKworI2RlZmluZSBLX0hPTEUJCUsoS1RfU1BFQywwKQorI2RlZmluZSBLX0VOVEVSCQlLKEtUX1NQRUMsMSkKKyNkZWZpbmUgS19TSF9SRUdTCUsoS1RfU1BFQywyKQorI2RlZmluZSBLX1NIX01FTQlLKEtUX1NQRUMsMykKKyNkZWZpbmUgS19TSF9TVEFUCUsoS1RfU1BFQyw0KQorI2RlZmluZSBLX0JSRUFLCQlLKEtUX1NQRUMsNSkKKyNkZWZpbmUgS19DT05TCQlLKEtUX1NQRUMsNikKKyNkZWZpbmUgS19DQVBTCQlLKEtUX1NQRUMsNykKKyNkZWZpbmUgS19OVU0JCUsoS1RfU1BFQyw4KQorI2RlZmluZSBLX0hPTEQJCUsoS1RfU1BFQyw5KQorI2RlZmluZSBLX1NDUk9MTEZPUlcJSyhLVF9TUEVDLDEwKQorI2RlZmluZSBLX1NDUk9MTEJBQ0sJSyhLVF9TUEVDLDExKQorI2RlZmluZSBLX0JPT1QJCUsoS1RfU1BFQywxMikKKyNkZWZpbmUgS19DQVBTT04JSyhLVF9TUEVDLDEzKQorI2RlZmluZSBLX0NPTVBPU0UJSyhLVF9TUEVDLDE0KQorI2RlZmluZSBLX1NBSwkJSyhLVF9TUEVDLDE1KQorI2RlZmluZSBLX0RFQ1JDT05TT0xFCUsoS1RfU1BFQywxNikKKyNkZWZpbmUgS19JTkNSQ09OU09MRQlLKEtUX1NQRUMsMTcpCisjZGVmaW5lIEtfU1BBV05DT05TT0xFCUsoS1RfU1BFQywxOCkKKyNkZWZpbmUgS19CQVJFTlVNTE9DSwlLKEtUX1NQRUMsMTkpCisKKyNkZWZpbmUgS19BTExPQ0FURUQJSyhLVF9TUEVDLDEyNikgLyogZHluYW1pY2FsbHkgYWxsb2NhdGVkIGtleW1hcCAqLworI2RlZmluZSBLX05PU1VDSE1BUAlLKEtUX1NQRUMsMTI3KSAvKiByZXR1cm5lZCBieSBLREdLQkVOVCAqLworCisjZGVmaW5lIEtfUDAJCUsoS1RfUEFELDApCisjZGVmaW5lIEtfUDEJCUsoS1RfUEFELDEpCisjZGVmaW5lIEtfUDIJCUsoS1RfUEFELDIpCisjZGVmaW5lIEtfUDMJCUsoS1RfUEFELDMpCisjZGVmaW5lIEtfUDQJCUsoS1RfUEFELDQpCisjZGVmaW5lIEtfUDUJCUsoS1RfUEFELDUpCisjZGVmaW5lIEtfUDYJCUsoS1RfUEFELDYpCisjZGVmaW5lIEtfUDcJCUsoS1RfUEFELDcpCisjZGVmaW5lIEtfUDgJCUsoS1RfUEFELDgpCisjZGVmaW5lIEtfUDkJCUsoS1RfUEFELDkpCisjZGVmaW5lIEtfUFBMVVMJCUsoS1RfUEFELDEwKQkvKiBrZXktcGFkIHBsdXMgKi8KKyNkZWZpbmUgS19QTUlOVVMJSyhLVF9QQUQsMTEpCS8qIGtleS1wYWQgbWludXMgKi8KKyNkZWZpbmUgS19QU1RBUgkJSyhLVF9QQUQsMTIpCS8qIGtleS1wYWQgYXN0ZXJpc2sgKHN0YXIpICovCisjZGVmaW5lIEtfUFNMQVNICUsoS1RfUEFELDEzKQkvKiBrZXktcGFkIHNsYXNoICovCisjZGVmaW5lIEtfUEVOVEVSCUsoS1RfUEFELDE0KQkvKiBrZXktcGFkIGVudGVyICovCisjZGVmaW5lIEtfUENPTU1BCUsoS1RfUEFELDE1KQkvKiBrZXktcGFkIGNvbW1hOiBrbHVkZ2UuLi4gKi8KKyNkZWZpbmUgS19QRE9UCQlLKEtUX1BBRCwxNikJLyoga2V5LXBhZCBkb3QgKHBlcmlvZCk6IGtsdWRnZS4uLiAqLworI2RlZmluZSBLX1BQTFVTTUlOVVMJSyhLVF9QQUQsMTcpCS8qIGtleS1wYWQgcGx1cy9taW51cyAqLworI2RlZmluZSBLX1BQQVJFTkwJSyhLVF9QQUQsMTgpCS8qIGtleS1wYWQgbGVmdCBwYXJlbnRoZXNpcyAqLworI2RlZmluZSBLX1BQQVJFTlIJSyhLVF9QQUQsMTkpCS8qIGtleS1wYWQgcmlnaHQgcGFyZW50aGVzaXMgKi8KKworI2RlZmluZSBOUl9QQUQJCTIwCisKKyNkZWZpbmUgS19ER1JBVkUJSyhLVF9ERUFELDApCisjZGVmaW5lIEtfREFDVVRFCUsoS1RfREVBRCwxKQorI2RlZmluZSBLX0RDSVJDTQlLKEtUX0RFQUQsMikKKyNkZWZpbmUgS19EVElMREUJSyhLVF9ERUFELDMpCisjZGVmaW5lIEtfRERJRVJFCUsoS1RfREVBRCw0KQorI2RlZmluZSBLX0RDRURJTAlLKEtUX0RFQUQsNSkKKworI2RlZmluZSBOUl9ERUFECQk2CisKKyNkZWZpbmUgS19ET1dOCQlLKEtUX0NVUiwwKQorI2RlZmluZSBLX0xFRlQJCUsoS1RfQ1VSLDEpCisjZGVmaW5lIEtfUklHSFQJCUsoS1RfQ1VSLDIpCisjZGVmaW5lIEtfVVAJCUsoS1RfQ1VSLDMpCisKKyNkZWZpbmUgS19TSElGVAkJSyhLVF9TSElGVCxLR19TSElGVCkKKyNkZWZpbmUgS19DVFJMCQlLKEtUX1NISUZULEtHX0NUUkwpCisjZGVmaW5lIEtfQUxUCQlLKEtUX1NISUZULEtHX0FMVCkKKyNkZWZpbmUgS19BTFRHUgkJSyhLVF9TSElGVCxLR19BTFRHUikKKyNkZWZpbmUgS19TSElGVEwJSyhLVF9TSElGVCxLR19TSElGVEwpCisjZGVmaW5lIEtfU0hJRlRSCUsoS1RfU0hJRlQsS0dfU0hJRlRSKQorI2RlZmluZSBLX0NUUkxMCSAJSyhLVF9TSElGVCxLR19DVFJMTCkKKyNkZWZpbmUgS19DVFJMUgkgCUsoS1RfU0hJRlQsS0dfQ1RSTFIpCisjZGVmaW5lIEtfQ0FQU1NISUZUCUsoS1RfU0hJRlQsS0dfQ0FQU1NISUZUKQorCisjZGVmaW5lIEtfQVNDMAkJSyhLVF9BU0NJSSwwKQorI2RlZmluZSBLX0FTQzEJCUsoS1RfQVNDSUksMSkKKyNkZWZpbmUgS19BU0MyCQlLKEtUX0FTQ0lJLDIpCisjZGVmaW5lIEtfQVNDMwkJSyhLVF9BU0NJSSwzKQorI2RlZmluZSBLX0FTQzQJCUsoS1RfQVNDSUksNCkKKyNkZWZpbmUgS19BU0M1CQlLKEtUX0FTQ0lJLDUpCisjZGVmaW5lIEtfQVNDNgkJSyhLVF9BU0NJSSw2KQorI2RlZmluZSBLX0FTQzcJCUsoS1RfQVNDSUksNykKKyNkZWZpbmUgS19BU0M4CQlLKEtUX0FTQ0lJLDgpCisjZGVmaW5lIEtfQVNDOQkJSyhLVF9BU0NJSSw5KQorI2RlZmluZSBLX0hFWDAJCUsoS1RfQVNDSUksMTApCisjZGVmaW5lIEtfSEVYMQkJSyhLVF9BU0NJSSwxMSkKKyNkZWZpbmUgS19IRVgyCQlLKEtUX0FTQ0lJLDEyKQorI2RlZmluZSBLX0hFWDMJCUsoS1RfQVNDSUksMTMpCisjZGVmaW5lIEtfSEVYNAkJSyhLVF9BU0NJSSwxNCkKKyNkZWZpbmUgS19IRVg1CQlLKEtUX0FTQ0lJLDE1KQorI2RlZmluZSBLX0hFWDYJCUsoS1RfQVNDSUksMTYpCisjZGVmaW5lIEtfSEVYNwkJSyhLVF9BU0NJSSwxNykKKyNkZWZpbmUgS19IRVg4CQlLKEtUX0FTQ0lJLDE4KQorI2RlZmluZSBLX0hFWDkJCUsoS1RfQVNDSUksMTkpCisjZGVmaW5lIEtfSEVYYQkJSyhLVF9BU0NJSSwyMCkKKyNkZWZpbmUgS19IRVhiCQlLKEtUX0FTQ0lJLDIxKQorI2RlZmluZSBLX0hFWGMJCUsoS1RfQVNDSUksMjIpCisjZGVmaW5lIEtfSEVYZAkJSyhLVF9BU0NJSSwyMykKKyNkZWZpbmUgS19IRVhlCQlLKEtUX0FTQ0lJLDI0KQorI2RlZmluZSBLX0hFWGYJCUsoS1RfQVNDSUksMjUpCisKKyNkZWZpbmUgTlJfQVNDSUkJMjYKKworI2RlZmluZSBLX1NISUZUTE9DSwlLKEtUX0xPQ0ssS0dfU0hJRlQpCisjZGVmaW5lIEtfQ1RSTExPQ0sJSyhLVF9MT0NLLEtHX0NUUkwpCisjZGVmaW5lIEtfQUxUTE9DSwlLKEtUX0xPQ0ssS0dfQUxUKQorI2RlZmluZSBLX0FMVEdSTE9DSwlLKEtUX0xPQ0ssS0dfQUxUR1IpCisjZGVmaW5lIEtfU0hJRlRMTE9DSwlLKEtUX0xPQ0ssS0dfU0hJRlRMKQorI2RlZmluZSBLX1NISUZUUkxPQ0sJSyhLVF9MT0NLLEtHX1NISUZUUikKKyNkZWZpbmUgS19DVFJMTExPQ0sJSyhLVF9MT0NLLEtHX0NUUkxMKQorI2RlZmluZSBLX0NUUkxSTE9DSwlLKEtUX0xPQ0ssS0dfQ1RSTFIpCisjZGVmaW5lIEtfQ0FQU1NISUZUTE9DSwlLKEtUX0xPQ0ssS0dfQ0FQU1NISUZUKQorCisjZGVmaW5lIEtfU0hJRlRfU0xPQ0sJSyhLVF9TTE9DSyxLR19TSElGVCkKKyNkZWZpbmUgS19DVFJMX1NMT0NLCUsoS1RfU0xPQ0ssS0dfQ1RSTCkKKyNkZWZpbmUgS19BTFRfU0xPQ0sJSyhLVF9TTE9DSyxLR19BTFQpCisjZGVmaW5lIEtfQUxUR1JfU0xPQ0sJSyhLVF9TTE9DSyxLR19BTFRHUikKKyNkZWZpbmUgS19TSElGVExfU0xPQ0sJSyhLVF9TTE9DSyxLR19TSElGVEwpCisjZGVmaW5lIEtfU0hJRlRSX1NMT0NLCUsoS1RfU0xPQ0ssS0dfU0hJRlRSKQorI2RlZmluZSBLX0NUUkxMX1NMT0NLCUsoS1RfU0xPQ0ssS0dfQ1RSTEwpCisjZGVmaW5lIEtfQ1RSTFJfU0xPQ0sJSyhLVF9TTE9DSyxLR19DVFJMUikKKyNkZWZpbmUgS19DQVBTU0hJRlRfU0xPQ0sJSyhLVF9TTE9DSyxLR19DQVBTU0hJRlQpCisKKyNkZWZpbmUgTlJfTE9DSwkJOQorCisjZGVmaW5lIEtfQlJMX0JMQU5LICAgICBLKEtUX0JSTCwgMCkKKyNkZWZpbmUgS19CUkxfRE9UMSAgICAgIEsoS1RfQlJMLCAxKQorI2RlZmluZSBLX0JSTF9ET1QyICAgICAgSyhLVF9CUkwsIDIpCisjZGVmaW5lIEtfQlJMX0RPVDMgICAgICBLKEtUX0JSTCwgMykKKyNkZWZpbmUgS19CUkxfRE9UNCAgICAgIEsoS1RfQlJMLCA0KQorI2RlZmluZSBLX0JSTF9ET1Q1ICAgICAgSyhLVF9CUkwsIDUpCisjZGVmaW5lIEtfQlJMX0RPVDYgICAgICBLKEtUX0JSTCwgNikKKyNkZWZpbmUgS19CUkxfRE9UNyAgICAgIEsoS1RfQlJMLCA3KQorI2RlZmluZSBLX0JSTF9ET1Q4ICAgICAgSyhLVF9CUkwsIDgpCisjZGVmaW5lIEtfQlJMX0RPVDkgICAgICBLKEtUX0JSTCwgOSkKKyNkZWZpbmUgS19CUkxfRE9UMTAgICAgIEsoS1RfQlJMLCAxMCkKKworI2RlZmluZSBOUl9CUkwJCTExCisKKyNkZWZpbmUgTUFYX0RJQUNSCTI1NgorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2tleWN0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXljdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzY1OTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9rZXljdGwuaApAQCAtMCwwICsxLDUzIEBACisvKiBrZXljdGwuaDoga2V5Y3RsIGNvbW1hbmQgSURzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0tFWUNUTF9ICisjZGVmaW5lIF9MSU5VWF9LRVlDVExfSAorCisvKiBzcGVjaWFsIHByb2Nlc3Mga2V5cmluZyBzaG9ydGN1dCBJRHMgKi8KKyNkZWZpbmUgS0VZX1NQRUNfVEhSRUFEX0tFWVJJTkcJCS0xCS8qIC0ga2V5IElEIGZvciB0aHJlYWQtc3BlY2lmaWMga2V5cmluZyAqLworI2RlZmluZSBLRVlfU1BFQ19QUk9DRVNTX0tFWVJJTkcJLTIJLyogLSBrZXkgSUQgZm9yIHByb2Nlc3Mtc3BlY2lmaWMga2V5cmluZyAqLworI2RlZmluZSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcJLTMJLyogLSBrZXkgSUQgZm9yIHNlc3Npb24tc3BlY2lmaWMga2V5cmluZyAqLworI2RlZmluZSBLRVlfU1BFQ19VU0VSX0tFWVJJTkcJCS00CS8qIC0ga2V5IElEIGZvciBVSUQtc3BlY2lmaWMga2V5cmluZyAqLworI2RlZmluZSBLRVlfU1BFQ19VU0VSX1NFU1NJT05fS0VZUklORwktNQkvKiAtIGtleSBJRCBmb3IgVUlELXNlc3Npb24ga2V5cmluZyAqLworI2RlZmluZSBLRVlfU1BFQ19HUk9VUF9LRVlSSU5HCQktNgkvKiAtIGtleSBJRCBmb3IgR0lELXNwZWNpZmljIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZX1NQRUNfUkVRS0VZX0FVVEhfS0VZCS03CS8qIC0ga2V5IElEIGZvciBhc3N1bWVkIHJlcXVlc3Rfa2V5IGF1dGgga2V5ICovCisKKy8qIHJlcXVlc3Qta2V5IGRlZmF1bHQga2V5cmluZ3MgKi8KKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX05PX0NIQU5HRQkJLTEKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX0RFRkFVTFQJCQkwCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9USFJFQURfS0VZUklORwkJMQorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfUFJPQ0VTU19LRVlSSU5HCQkyCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9TRVNTSU9OX0tFWVJJTkcJCTMKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX1VTRVJfS0VZUklORwkJNAorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfVVNFUl9TRVNTSU9OX0tFWVJJTkcJNQorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfR1JPVVBfS0VZUklORwkJNgorCisvKiBrZXljdGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgS0VZQ1RMX0dFVF9LRVlSSU5HX0lECQkwCS8qIGFzayBmb3IgYSBrZXlyaW5nJ3MgSUQgKi8KKyNkZWZpbmUgS0VZQ1RMX0pPSU5fU0VTU0lPTl9LRVlSSU5HCTEJLyogam9pbiBvciBzdGFydCBuYW1lZCBzZXNzaW9uIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1VQREFURQkJCTIJLyogdXBkYXRlIGEga2V5ICovCisjZGVmaW5lIEtFWUNUTF9SRVZPS0UJCQkzCS8qIHJldm9rZSBhIGtleSAqLworI2RlZmluZSBLRVlDVExfQ0hPV04JCQk0CS8qIHNldCBvd25lcnNoaXAgb2YgYSBrZXkgKi8KKyNkZWZpbmUgS0VZQ1RMX1NFVFBFUk0JCQk1CS8qIHNldCBwZXJtcyBvbiBhIGtleSAqLworI2RlZmluZSBLRVlDVExfREVTQ1JJQkUJCQk2CS8qIGRlc2NyaWJlIGEga2V5ICovCisjZGVmaW5lIEtFWUNUTF9DTEVBUgkJCTcJLyogY2xlYXIgY29udGVudHMgb2YgYSBrZXlyaW5nICovCisjZGVmaW5lIEtFWUNUTF9MSU5LCQkJOAkvKiBsaW5rIGEga2V5IGludG8gYSBrZXlyaW5nICovCisjZGVmaW5lIEtFWUNUTF9VTkxJTksJCQk5CS8qIHVubGluayBhIGtleSBmcm9tIGEga2V5cmluZyAqLworI2RlZmluZSBLRVlDVExfU0VBUkNICQkJMTAJLyogc2VhcmNoIGZvciBhIGtleSBpbiBhIGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1JFQUQJCQkxMQkvKiByZWFkIGEga2V5IG9yIGtleXJpbmcncyBjb250ZW50cyAqLworI2RlZmluZSBLRVlDVExfSU5TVEFOVElBVEUJCTEyCS8qIGluc3RhbnRpYXRlIGEgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGtleSAqLworI2RlZmluZSBLRVlDVExfTkVHQVRFCQkJMTMJLyogbmVnYXRlIGEgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGtleSAqLworI2RlZmluZSBLRVlDVExfU0VUX1JFUUtFWV9LRVlSSU5HCTE0CS8qIHNldCBkZWZhdWx0IHJlcXVlc3Qta2V5IGtleXJpbmcgKi8KKyNkZWZpbmUgS0VZQ1RMX1NFVF9USU1FT1VUCQkxNQkvKiBzZXQga2V5IHRpbWVvdXQgKi8KKyNkZWZpbmUgS0VZQ1RMX0FTU1VNRV9BVVRIT1JJVFkJCTE2CS8qIGFzc3VtZSByZXF1ZXN0X2tleSgpIGF1dGhvcmlzYXRpb24gKi8KKworI2VuZGlmIC8qICBfTElOVVhfS0VZQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbGltaXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGY5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0xJTlVYX0xJTUlUU19ICisjZGVmaW5lIF9MSU5VWF9MSU1JVFNfSAorCisjZGVmaW5lIE5SX09QRU4JICAgICAgICAxMDI0CisKKyNkZWZpbmUgTkdST1VQU19NQVggICAgNjU1MzYJLyogc3VwcGxlbWVudGFsIGdyb3VwIElEcyBhcmUgYXZhaWxhYmxlICovCisjZGVmaW5lIEFSR19NQVggICAgICAgMTMxMDcyCS8qICMgYnl0ZXMgb2YgYXJncyArIGVudmlyb24gZm9yIGV4ZWMoKSAqLworI2RlZmluZSBMSU5LX01BWCAgICAgICAgIDEyNwkvKiAjIGxpbmtzIGEgZmlsZSBtYXkgaGF2ZSAqLworI2RlZmluZSBNQVhfQ0FOT04gICAgICAgIDI1NQkvKiBzaXplIG9mIHRoZSBjYW5vbmljYWwgaW5wdXQgcXVldWUgKi8KKyNkZWZpbmUgTUFYX0lOUFVUICAgICAgICAyNTUJLyogc2l6ZSBvZiB0aGUgdHlwZS1haGVhZCBidWZmZXIgKi8KKyNkZWZpbmUgTkFNRV9NQVggICAgICAgICAyNTUJLyogIyBjaGFycyBpbiBhIGZpbGUgbmFtZSAqLworI2RlZmluZSBQQVRIX01BWCAgICAgICAgNDA5NgkvKiAjIGNoYXJzIGluIGEgcGF0aCBuYW1lIGluY2x1ZGluZyBudWwgKi8KKyNkZWZpbmUgUElQRV9CVUYgICAgICAgIDQwOTYJLyogIyBieXRlcyBpbiBhdG9taWMgd3JpdGUgdG8gYSBwaXBlICovCisjZGVmaW5lIFhBVFRSX05BTUVfTUFYICAgMjU1CS8qICMgY2hhcnMgaW4gYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWUgKi8KKyNkZWZpbmUgWEFUVFJfU0laRV9NQVggNjU1MzYJLyogc2l6ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgdmFsdWUgKDY0aykgKi8KKyNkZWZpbmUgWEFUVFJfTElTVF9NQVggNjU1MzYJLyogc2l6ZSBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZWxpc3QgKDY0aykgKi8KKworI2RlZmluZSBSVFNJR19NQVgJICAzMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbGxjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZWIzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xsYy5oCkBAIC0wLDAgKzEsNzMgQEAKKyNpZm5kZWYgX19MSU5VWF9MTENfSAorI2RlZmluZSBfX0xJTlVYX0xMQ19ICisvKgorICogSUVFRSA4MDIuMiBVc2VyIEludGVyZmFjZSBTQVBzIGZvciBMaW51eCwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBpbmRpY2F0b3JzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBieSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgcmVkaXN0cmlidXRlZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisgKgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjZGVmaW5lIF9fTExDX1NPQ0tfU0laRV9fIDE2CS8qIHNpemVvZihzb2NrYWRkcl9sbGMpLCB3b3JkIGFsaWduLiAqLworc3RydWN0IHNvY2thZGRyX2xsYyB7CisJc2FfZmFtaWx5X3QgICAgIHNsbGNfZmFtaWx5OwkvKiBBRl9MTEMgKi8KKwlzYV9mYW1pbHlfdAlzbGxjX2FycGhyZDsJLyogQVJQSFJEX0VUSEVSICovCisJdW5zaWduZWQgY2hhciAgIHNsbGNfdGVzdDsKKwl1bnNpZ25lZCBjaGFyICAgc2xsY194aWQ7CisJdW5zaWduZWQgY2hhcglzbGxjX3VhOwkvKiBVQSBkYXRhLCBvbmx5IGZvciBTT0NLX1NUUkVBTS4gKi8KKwl1bnNpZ25lZCBjaGFyICAgc2xsY19zYXA7CisJdW5zaWduZWQgY2hhciAgIHNsbGNfbWFjW0lGSFdBRERSTEVOXTsKKwl1bnNpZ25lZCBjaGFyICAgX19wYWRbX19MTENfU09DS19TSVpFX18gLSBzaXplb2Yoc2FfZmFtaWx5X3QpICogMiAtCisJCQkgICAgICBzaXplb2YodW5zaWduZWQgY2hhcikgKiA0IC0gSUZIV0FERFJMRU5dOworfTsKKworLyogc29ja29wdCBkZWZpbml0aW9ucy4gKi8KK2VudW0gbGxjX3NvY2tvcHRzIHsKKwlMTENfT1BUX1VOS05PV04gPSAwLAorCUxMQ19PUFRfUkVUUlksCQkvKiBtYXggcmV0cmFucyBhdHRlbXB0cy4gKi8KKwlMTENfT1BUX1NJWkUsCQkvKiBtYXggUERVIHNpemUgKG9jdGV0cykuICovCisJTExDX09QVF9BQ0tfVE1SX0VYUCwJLyogYWNrIGV4cGlyZSB0aW1lIChzZWNzKS4gKi8KKwlMTENfT1BUX1BfVE1SX0VYUCwJLyogcGYgY3ljbGUgZXhwaXJlIHRpbWUgKHNlY3MpLiAqLworCUxMQ19PUFRfUkVKX1RNUl9FWFAsCS8qIHJlaiBzZW50IGV4cGlyZSB0aW1lIChzZWNzKS4gKi8KKwlMTENfT1BUX0JVU1lfVE1SX0VYUCwJLyogYnVzeSBzdGF0ZSBleHBpcmUgdGltZSAoc2VjcykuICovCisJTExDX09QVF9UWF9XSU4sCQkvKiB0eCB3aW5kb3cgc2l6ZS4gKi8KKwlMTENfT1BUX1JYX1dJTiwJCS8qIHJ4IHdpbmRvdyBzaXplLiAqLworCUxMQ19PUFRfTUFYCit9OworCisjZGVmaW5lIExMQ19PUFRfTUFYX1JFVFJZCSAxMDAKKyNkZWZpbmUgTExDX09QVF9NQVhfU0laRQk0MTk2CisjZGVmaW5lIExMQ19PUFRfTUFYX1dJTgkJIDEyNworI2RlZmluZSBMTENfT1BUX01BWF9BQ0tfVE1SX0VYUAkgIDYwCisjZGVmaW5lIExMQ19PUFRfTUFYX1BfVE1SX0VYUAkgIDYwCisjZGVmaW5lIExMQ19PUFRfTUFYX1JFSl9UTVJfRVhQCSAgNjAKKyNkZWZpbmUgTExDX09QVF9NQVhfQlVTWV9UTVJfRVhQICA2MAorCisvKiBMTEMgU0FQIHR5cGVzLiAqLworI2RlZmluZSBMTENfU0FQX05VTEwJMHgwMAkJLyogTlVMTCBTQVAuIAkJCSovCisjZGVmaW5lIExMQ19TQVBfTExDCTB4MDIJCS8qIExMQyBTdWJsYXllciBNYW5hZ21lbnQuIAkqLworI2RlZmluZSBMTENfU0FQX1NOQQkweDA0CQkvKiBTTkEgUGF0aCBDb250cm9sLiAJCSovCisjZGVmaW5lIExMQ19TQVBfUE5NCTB4MEUJCS8qIFByb3dheSBOZXR3b3JrIE1hbmFnbWVudC4JKi8JCisjZGVmaW5lIExMQ19TQVBfSVAJMHgwNgkJLyogVENQL0lQLiAJCQkqLworI2RlZmluZSBMTENfU0FQX0JTUEFOCTB4NDIJCS8qIEJyaWRnZSBTcGFubmluZyBUcmVlIFByb3RvCSovCisjZGVmaW5lIExMQ19TQVBfTU1TCTB4NEUJCS8qIE1hbnVmYWN0dXJpbmcgTWVzc2FnZSBTcnYuCSovCisjZGVmaW5lIExMQ19TQVBfODIwOAkweDdFCQkvKiBJU08gODIwOAkJCSovCisjZGVmaW5lIExMQ19TQVBfM0NPTQkweDgwCQkvKiAzQ09NLiAJCQkqLworI2RlZmluZSBMTENfU0FQX1BSTwkweDhFCQkvKiBQcm93YXkgQWN0aXZlIFN0YXRpb24gTGlzdAkqLworI2RlZmluZSBMTENfU0FQX1NOQVAJMHhBQQkJLyogU05BUC4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9CQU5ZQU4JMHhCQwkJLyogQmFueWFuLiAJCQkqLworI2RlZmluZSBMTENfU0FQX0lQWAkweEUwCQkvKiBJUFgvU1BYLiAJCQkqLworI2RlZmluZSBMTENfU0FQX05FVEJFVUkJMHhGMAkJLyogTmV0QkVVSS4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9MQU5NR1IJMHhGNAkJLyogTGFuTWFuYWdlci4gCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9JTVBMCTB4RjgJCS8qIElNUEwJCQkJKi8KKyNkZWZpbmUgTExDX1NBUF9ESVNDCTB4RkMJCS8qIERpc2NvdmVyeQkJCSovCisjZGVmaW5lIExMQ19TQVBfT1NJCTB4RkUJCS8qIE9TSSBOZXR3b3JrIExheWVycy4gCQkqLworI2RlZmluZSBMTENfU0FQX0xBUgkweERDCQkvKiBMQU4gQWRkcmVzcyBSZXNvbHV0aW9uIAkqLworI2RlZmluZSBMTENfU0FQX1JNCTB4RDQJCS8qIFJlc291cmNlIE1hbmFnZW1lbnQgCQkqLworI2RlZmluZSBMTENfU0FQX0dMT0JBTAkweEZGCQkvKiBHbG9iYWwgU0FQLiAJCQkqLworCisjZW5kaWYgLyogX19MSU5VWF9MTENfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sb2NrX2RsbV9wbG9jay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9sb2NrX2RsbV9wbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzQxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xvY2tfZGxtX3Bsb2NrLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAorICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2LjIuCisgKi8KKworI2lmbmRlZiBfX0xPQ0tfRExNX1BMT0NLX0RPVF9IX18KKyNkZWZpbmUgX19MT0NLX0RMTV9QTE9DS19ET1RfSF9fCisKKyNkZWZpbmUgR0RMTV9QTE9DS19NSVNDX05BTUUJCSJsb2NrX2RsbV9wbG9jayIKKworI2RlZmluZSBHRExNX1BMT0NLX1ZFUlNJT05fTUFKT1IJMQorI2RlZmluZSBHRExNX1BMT0NLX1ZFUlNJT05fTUlOT1IJMQorI2RlZmluZSBHRExNX1BMT0NLX1ZFUlNJT05fUEFUQ0gJMAorCitlbnVtIHsKKwlHRExNX1BMT0NLX09QX0xPQ0sgPSAxLAorCUdETE1fUExPQ0tfT1BfVU5MT0NLLAorCUdETE1fUExPQ0tfT1BfR0VULAorfTsKKworc3RydWN0IGdkbG1fcGxvY2tfaW5mbyB7CisJX191MzIgdmVyc2lvblszXTsKKwlfX3U4IG9wdHlwZTsKKwlfX3U4IGV4OworCV9fdTggd2FpdDsKKwlfX3U4IHBhZDsKKwlfX3UzMiBwaWQ7CisJX19zMzIgbm9kZWlkOworCV9fczMyIHJ2OworCV9fdTMyIGZzaWQ7CisJX191NjQgbnVtYmVyOworCV9fdTY0IHN0YXJ0OworCV9fdTY0IGVuZDsKKwlfX3U2NCBvd25lcjsKK307CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xvb3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbG9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjkzODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xvb3AuaApAQCAtMCwwICsxLDg4IEBACisjaWZuZGVmIF9MSU5VWF9MT09QX0gKKyNkZWZpbmUgX0xJTlVYX0xPT1BfSAorCisvKgorICogaW5jbHVkZS9saW51eC9sb29wLmgKKyAqCisgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIDMvMjkvOTMuCisgKgorICogQ29weXJpZ2h0IDE5OTMgYnkgVGhlb2RvcmUgVHMnby4gIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcworICogcGVybWl0dGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPX05BTUVfU0laRQk2NAorI2RlZmluZSBMT19LRVlfU0laRQkzMgorCisKKy8qCisgKiBMb29wIGZsYWdzCisgKi8KK2VudW0geworCUxPX0ZMQUdTX1JFQURfT05MWQk9IDEsCisJTE9fRkxBR1NfVVNFX0FPUFMJPSAyLAorfTsKKworI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlcy5oPgkvKiBmb3IgX19rZXJuZWxfb2xkX2Rldl90ICovCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CQkvKiBmb3IgX191NjQgKi8KKworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdmVyc2lvbiAqLworc3RydWN0IGxvb3BfaW5mbyB7CisJaW50CQkgICBsb19udW1iZXI7CQkvKiBpb2N0bCByL28gKi8KKwlfX2tlcm5lbF9vbGRfZGV2X3QgbG9fZGV2aWNlOyAJCS8qIGlvY3RsIHIvbyAqLworCXVuc2lnbmVkIGxvbmcJICAgbG9faW5vZGU7IAkJLyogaW9jdGwgci9vICovCisJX19rZXJuZWxfb2xkX2Rldl90IGxvX3JkZXZpY2U7IAkJLyogaW9jdGwgci9vICovCisJaW50CQkgICBsb19vZmZzZXQ7CisJaW50CQkgICBsb19lbmNyeXB0X3R5cGU7CisJaW50CQkgICBsb19lbmNyeXB0X2tleV9zaXplOyAJLyogaW9jdGwgdy9vICovCisJaW50CQkgICBsb19mbGFnczsJCQkvKiBpb2N0bCByL28gKi8KKwljaGFyCQkgICBsb19uYW1lW0xPX05BTUVfU0laRV07CisJdW5zaWduZWQgY2hhcgkgICBsb19lbmNyeXB0X2tleVtMT19LRVlfU0laRV07IC8qIGlvY3RsIHcvbyAqLworCXVuc2lnbmVkIGxvbmcJICAgbG9faW5pdFsyXTsKKwljaGFyCQkgICByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBsb29wX2luZm82NCB7CisJX191NjQJCSAgIGxvX2RldmljZTsJCQkvKiBpb2N0bCByL28gKi8KKwlfX3U2NAkJICAgbG9faW5vZGU7CQkJLyogaW9jdGwgci9vICovCisJX191NjQJCSAgIGxvX3JkZXZpY2U7CQkJLyogaW9jdGwgci9vICovCisJX191NjQJCSAgIGxvX29mZnNldDsKKwlfX3U2NAkJICAgbG9fc2l6ZWxpbWl0Oy8qIGJ5dGVzLCAwID09IG1heCBhdmFpbGFibGUgKi8KKwlfX3UzMgkJICAgbG9fbnVtYmVyOwkJCS8qIGlvY3RsIHIvbyAqLworCV9fdTMyCQkgICBsb19lbmNyeXB0X3R5cGU7CisJX191MzIJCSAgIGxvX2VuY3J5cHRfa2V5X3NpemU7CQkvKiBpb2N0bCB3L28gKi8KKwlfX3UzMgkJICAgbG9fZmxhZ3M7CQkJLyogaW9jdGwgci9vICovCisJX191OAkJICAgbG9fZmlsZV9uYW1lW0xPX05BTUVfU0laRV07CisJX191OAkJICAgbG9fY3J5cHRfbmFtZVtMT19OQU1FX1NJWkVdOworCV9fdTgJCSAgIGxvX2VuY3J5cHRfa2V5W0xPX0tFWV9TSVpFXTsgLyogaW9jdGwgdy9vICovCisJX191NjQJCSAgIGxvX2luaXRbMl07Cit9OworCisvKgorICogTG9vcCBmaWx0ZXIgdHlwZXMKKyAqLworCisjZGVmaW5lIExPX0NSWVBUX05PTkUJCTAKKyNkZWZpbmUgTE9fQ1JZUFRfWE9SCQkxCisjZGVmaW5lIExPX0NSWVBUX0RFUwkJMgorI2RlZmluZSBMT19DUllQVF9GSVNIMgkJMyAgICAvKiBUd29maXNoIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUgTE9fQ1JZUFRfQkxPVwkJNAorI2RlZmluZSBMT19DUllQVF9DQVNUMTI4CTUKKyNkZWZpbmUgTE9fQ1JZUFRfSURFQQkJNgorI2RlZmluZSBMT19DUllQVF9EVU1NWQkJOQorI2RlZmluZSBMT19DUllQVF9TS0lQSkFDSwkxMAorI2RlZmluZSBMT19DUllQVF9DUllQVE9BUEkJMTgKKyNkZWZpbmUgTUFYX0xPX0NSWVBUCQkyMAorCisvKgorICogSU9DVEwgY29tbWFuZHMgLS0tIHdlIHdpbGwgY29tbWFuZGVlciAweDRDICgnTCcpCisgKi8KKworI2RlZmluZSBMT09QX1NFVF9GRAkJMHg0QzAwCisjZGVmaW5lIExPT1BfQ0xSX0ZECQkweDRDMDEKKyNkZWZpbmUgTE9PUF9TRVRfU1RBVFVTCQkweDRDMDIKKyNkZWZpbmUgTE9PUF9HRVRfU1RBVFVTCQkweDRDMDMKKyNkZWZpbmUgTE9PUF9TRVRfU1RBVFVTNjQJMHg0QzA0CisjZGVmaW5lIExPT1BfR0VUX1NUQVRVUzY0CTB4NEMwNQorI2RlZmluZSBMT09QX0NIQU5HRV9GRAkJMHg0QzA2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9scC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9scC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjFhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L2xwLmgKQEAgLTAsMCArMSwxMDAgQEAKKyNpZm5kZWYgX0xJTlVYX0xQX0gKKyNkZWZpbmUgX0xJTlVYX0xQX0gKKworLyoKKyAqIHVzci9pbmNsdWRlL2xpbnV4L2xwLmggYy4xOTkxLTE5OTIgSmFtZXMgV2llZ2FuZAorICogbWFueSBtb2RpZmljYXRpb25zIGNvcHlyaWdodCAoQykgMTk5MiBNaWNoYWVsIEsuIEpvaG5zb24KKyAqIEludGVycnVwdCBzdXBwb3J0IGFkZGVkIDE5OTMgTmlnZWwgR2FtYmxlCisgKiBSZW1vdmVkIDgyNTUgc3RhdHVzIGRlZmluZXMgZnJvbSBpbnNpZGUgX19LRVJORUxfXyBNYXJjZWxvIFRvc2F0dGkgCisgKi8KKworLyoKKyAqIFBlciBQT1NJWCBndWlkZWxpbmVzLCB0aGlzIG1vZHVsZSByZXNlcnZlcyB0aGUgTFAgYW5kIGxwIHByZWZpeGVzCisgKiBUaGVzZSBhcmUgdGhlIGxwX3RhYmxlW21pbm9yXS5mbGFncyBmbGFncy4uLgorICovCisjZGVmaW5lIExQX0VYSVNUIDB4MDAwMQorI2RlZmluZSBMUF9TRUxFQyAweDAwMDIKKyNkZWZpbmUgTFBfQlVTWQkgMHgwMDA0CisjZGVmaW5lIExQX0JVU1lfQklUX1BPUyAyCisjZGVmaW5lIExQX09GRkwJIDB4MDAwOAorI2RlZmluZSBMUF9OT1BBICAweDAwMTAKKyNkZWZpbmUgTFBfRVJSICAgMHgwMDIwCisjZGVmaW5lIExQX0FCT1JUIDB4MDA0MAorI2RlZmluZSBMUF9DQVJFRlVMIDB4MDA4MCAvKiBvYnNvbGV0ZWQgLWFyY2EgKi8KKyNkZWZpbmUgTFBfQUJPUlRPUEVOIDB4MDEwMAorCisjZGVmaW5lIExQX1RSVVNUX0lSUV8gIDB4MDIwMCAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBMUF9OT19SRVZFUlNFICAweDA0MDAgLyogTm8gcmV2ZXJzZSBtb2RlIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgTFBfREFUQV9BVkFJTCAgMHgwODAwIC8qIERhdGEgaXMgYXZhaWxhYmxlLiAqLworCisvKiAKKyAqIGJpdCBkZWZpbmVzIGZvciA4MjU1IHN0YXR1cyBwb3J0CisgKiBiYXNlICsgMQorICogYWNjZXNzZWQgd2l0aCBMUF9TKG1pbm9yKSwgd2hpY2ggZ2V0cyB0aGUgYnl0ZS4uLgorICovCisjZGVmaW5lIExQX1BCVVNZCTB4ODAgIC8qIGludmVydGVkIGlucHV0LCBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBMUF9QQUNLCQkweDQwICAvKiB1bmNoYW5nZWQgaW5wdXQsIGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgTFBfUE9VVFBBCTB4MjAgIC8qIHVuY2hhbmdlZCBpbnB1dCwgYWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgTFBfUFNFTEVDRAkweDEwICAvKiB1bmNoYW5nZWQgaW5wdXQsIGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIExQX1BFUlJPUlAJMHgwOCAgLyogdW5jaGFuZ2VkIGlucHV0LCBhY3RpdmUgbG93ICovCisKKy8qIHRpbWVvdXQgZm9yIGVhY2ggY2hhcmFjdGVyLiAgVGhpcyBpcyByZWxhdGl2ZSB0byBidXMgY3ljbGVzIC0tIGl0CisgKiBpcyB0aGUgY291bnQgaW4gYSBidXN5IGxvb3AuICBUSElTIElTIFRIRSBWQUxVRSBUTyBDSEFOR0UgaWYgeW91CisgKiBoYXZlIGV4dHJlbWVseSBzbG93IHByaW50aW5nLCBvciBpZiB0aGUgbWFjaGluZSBzZWVtcyB0byBzbG93IGRvd24KKyAqIGEgbG90IHdoZW4geW91IHByaW50LiAgSWYgeW91IGhhdmUgc2xvdyBwcmludGluZywgaW5jcmVhc2UgdGhpcworICogbnVtYmVyIGFuZCByZWNvbXBpbGUsIGFuZCBpZiB5b3VyIHN5c3RlbSBnZXRzIGJvZ2dlZCBkb3duLCBkZWNyZWFzZQorICogdGhpcyBudW1iZXIuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlIHR1bmVscCg4KSBjb21tYW5kIGFzIHdlbGwuCisgKi8KKworI2RlZmluZSBMUF9JTklUX0NIQVIgMTAwMAorCisvKiBUaGUgcGFyYWxsZWwgcG9ydCBzcGVjcyBhcHBhcmVudGx5IHNheSB0aGF0IHRoZXJlIG5lZWRzIHRvIGJlCisgKiBhIC41dXNlYyB3YWl0IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHN0cm9iZS4KKyAqLworCisjZGVmaW5lIExQX0lOSVRfV0FJVCAxCisKKy8qIFRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGRyaXZlciB3YWl0cyBmb3IgdGhlIHByaW50ZXIgdG8KKyAqIGNhdGNoIHVwIHdoZW4gdGhlIHByaW50ZXIncyBidWZmZXIgYXBwZWFycyB0byBiZSBmaWxsZWQuICBJZiB5b3UKKyAqIHdhbnQgdG8gdHVuZSB0aGlzIGFuZCBoYXZlIGEgZmFzdCBwcmludGVyIChpLmUuIEhQSUlJUCksIGRlY3JlYXNlCisgKiB0aGlzIG51bWJlciwgYW5kIGlmIHlvdSBoYXZlIGEgc2xvdyBwcmludGVyLCBpbmNyZWFzZSB0aGlzIG51bWJlci4KKyAqIFRoaXMgaXMgaW4gaHVuZHJlZHRocyBvZiBhIHNlY29uZCwgdGhlIGRlZmF1bHQgMiBiZWluZyAuMDUgc2Vjb25kLgorICogT3IgdXNlIHRoZSB0dW5lbHAoOCkgY29tbWFuZCwgd2hpY2ggaXMgZXNwZWNpYWxseSBuaWNlIGlmIHlvdSB3YW50CisgKiBjaGFuZ2UgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBjaGFyYWN0ZXIgYW5kIGdyYXBoaWNzIHByaW50aW5nLCB3aGljaAorICogYXJlIHdpbGRseSBkaWZmZXJlbnQuLi4KKyAqLworCisjZGVmaW5lIExQX0lOSVRfVElNRSAyCisKKy8qIElPQ1RMIG51bWJlcnMgKi8KKyNkZWZpbmUgTFBDSEFSICAgMHgwNjAxICAvKiBjb3JyZXNwb25kcyB0byBMUF9JTklUX0NIQVIgKi8KKyNkZWZpbmUgTFBUSU1FICAgMHgwNjAyICAvKiBjb3JyZXNwb25kcyB0byBMUF9JTklUX1RJTUUgKi8KKyNkZWZpbmUgTFBBQk9SVCAgMHgwNjA0ICAvKiBjYWxsIHdpdGggVFJVRSBhcmcgdG8gYWJvcnQgb24gZXJyb3IsCisJCQkgICAgRkFMU0UgdG8gcmV0cnkuICBEZWZhdWx0IGlzIHJldHJ5LiAgKi8KKyNkZWZpbmUgTFBTRVRJUlEgMHgwNjA1ICAvKiBjYWxsIHdpdGggbmV3IElSUSBudW1iZXIsCisJCQkgICAgb3IgMCBmb3IgcG9sbGluZyAobm8gSVJRKSAqLworI2RlZmluZSBMUEdFVElSUSAweDA2MDYgIC8qIGdldCB0aGUgY3VycmVudCBJUlEgbnVtYmVyICovCisjZGVmaW5lIExQV0FJVCAgIDB4MDYwOCAgLyogY29ycmVzcG9uZHMgdG8gTFBfSU5JVF9XQUlUICovCisvKiBOT1RFOiBMUENBUkVGVUwgaXMgb2Jzb2xldGVkIGFuZCBpdCcgcyBhbHdheXMgdGhlIGRlZmF1bHQgcmlnaHQgbm93IC1hcmNhICovCisjZGVmaW5lIExQQ0FSRUZVTCAgIDB4MDYwOSAgLyogY2FsbCB3aXRoIFRSVUUgYXJnIHRvIHJlcXVpcmUgb3V0LW9mLXBhcGVyLCBvZmYtCisJCQkgICAgbGluZSwgYW5kIGVycm9yIGluZGljYXRvcnMgZ29vZCBvbiBhbGwgd3JpdGVzLAorCQkJICAgIEZBTFNFIHRvIGlnbm9yZSB0aGVtLiAgRGVmYXVsdCBpcyBpZ25vcmUuICovCisjZGVmaW5lIExQQUJPUlRPUEVOIDB4MDYwYSAgLyogY2FsbCB3aXRoIFRSVUUgYXJnIHRvIGFib3J0IG9wZW4oKSBvbiBlcnJvciwKKwkJCSAgICBGQUxTRSB0byBpZ25vcmUgZXJyb3IuICBEZWZhdWx0IGlzIGlnbm9yZS4gICovCisjZGVmaW5lIExQR0VUU1RBVFVTIDB4MDYwYiAgLyogcmV0dXJuIExQX1MobWlub3IpICovCisjZGVmaW5lIExQUkVTRVQgICAgIDB4MDYwYyAgLyogcmVzZXQgcHJpbnRlciAqLworI2lmZGVmIExQX1NUQVRTCisjZGVmaW5lIExQR0VUU1RBVFMgIDB4MDYwZCAgLyogZ2V0IHN0YXRpc3RpY3MgKHN0cnVjdCBscF9zdGF0cykgKi8KKyNlbmRpZgorI2RlZmluZSBMUEdFVEZMQUdTICAweDA2MGUgIC8qIGdldCBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgTFBTRVRUSU1FT1VUIDB4MDYwZiAvKiBzZXQgcGFycG9ydCB0aW1lb3V0ICovCisKKy8qIHRpbWVvdXQgZm9yIHByaW50aydpbmcgYSB0aW1lb3V0LCBpbiBqaWZmaWVzICgxMDB0aHMgb2YgYSBzZWNvbmQpLgorICAgVGhpcyBpcyBhbHNvIHVzZWQgZm9yIHJlLWNoZWNraW5nIGVycm9yIGNvbmRpdGlvbnMgaWYgTFBfQUJPUlQgaXMKKyAgIG5vdCBzZXQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAqLworCisjZGVmaW5lIExQX1RJTUVPVVRfSU5URVJSVVBUCSg2MCAqIEhaKQorI2RlZmluZSBMUF9USU1FT1VUX1BPTExFRAkoMTAgKiBIWikKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFnaWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWFnaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEwYzJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWdpYy5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgX19MSU5VWF9NQUdJQ19IX18KKyNkZWZpbmUgX19MSU5VWF9NQUdJQ19IX18KKworI2RlZmluZSBBREZTX1NVUEVSX01BR0lDCTB4YWRmNQorI2RlZmluZSBBRkZTX1NVUEVSX01BR0lDCTB4YWRmZgorI2RlZmluZSBBRlNfU1VQRVJfTUFHSUMgICAgICAgICAgICAgICAgMHg1MzQ2NDE0RgorI2RlZmluZSBBVVRPRlNfU1VQRVJfTUFHSUMJMHgwMTg3CisjZGVmaW5lIENPREFfU1VQRVJfTUFHSUMJMHg3Mzc1NzI0NQorI2RlZmluZSBFRlNfU1VQRVJfTUFHSUMJCTB4NDE0QTUzCisjZGVmaW5lIEVYVDJfU1VQRVJfTUFHSUMJMHhFRjUzCisjZGVmaW5lIEVYVDNfU1VQRVJfTUFHSUMJMHhFRjUzCisjZGVmaW5lIEVYVDRfU1VQRVJfTUFHSUMJMHhFRjUzCisjZGVmaW5lIEhQRlNfU1VQRVJfTUFHSUMJMHhmOTk1ZTg0OQorI2RlZmluZSBJU09GU19TVVBFUl9NQUdJQwkweDk2NjAKKyNkZWZpbmUgSkZGUzJfU1VQRVJfTUFHSUMJMHg3MmI2CisjZGVmaW5lIEFOT05fSU5PREVfRlNfTUFHSUMJMHgwOTA0MTkzNAorCisjZGVmaW5lIE1JTklYX1NVUEVSX01BR0lDCTB4MTM3RgkJLyogb3JpZ2luYWwgbWluaXggZnMgKi8KKyNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMyCTB4MTM4RgkJLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDCTB4MjQ2OAkJLyogbWluaXggVjIgZnMgKi8KKyNkZWZpbmUgTUlOSVgyX1NVUEVSX01BR0lDMgkweDI0NzgJCS8qIG1pbml4IFYyIGZzLCAzMCBjaGFyIG5hbWVzICovCisjZGVmaW5lIE1JTklYM19TVVBFUl9NQUdJQwkweDRkNWEJCS8qIG1pbml4IFYzIGZzICovCisKKyNkZWZpbmUgTVNET1NfU1VQRVJfTUFHSUMJMHg0ZDQ0CQkvKiBNRCAqLworI2RlZmluZSBOQ1BfU1VQRVJfTUFHSUMJCTB4NTY0YwkJLyogR3Vlc3MsIHdoYXQgMHg1NjRjIGlzIDotKSAqLworI2RlZmluZSBORlNfU1VQRVJfTUFHSUMJCTB4Njk2OQorI2RlZmluZSBPUEVOUFJPTV9TVVBFUl9NQUdJQwkweDlmYTEKKyNkZWZpbmUgUFJPQ19TVVBFUl9NQUdJQwkweDlmYTAKKyNkZWZpbmUgUU5YNF9TVVBFUl9NQUdJQwkweDAwMmYJCS8qIHFueDQgZnMgZGV0ZWN0aW9uICovCisKKyNkZWZpbmUgUkVJU0VSRlNfU1VQRVJfTUFHSUMJMHg1MjY1NDk3MwkvKiB1c2VkIGJ5IGdjYyAqLworCQkJCQkvKiB1c2VkIGJ5IGZpbGUgc3lzdGVtIHV0aWxpdGllcyB0aGF0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rIGF0IHRoZSBzdXBlcmJsb2NrLCBldGMuICAqLworI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcJIlJlSXNFckZzIgorI2RlZmluZSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HCSJSZUlzRXIyRnMiCisjZGVmaW5lIFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkcJIlJlSXNFcjNGcyIKKworI2RlZmluZSBTTUJfU1VQRVJfTUFHSUMJCTB4NTE3QgorI2RlZmluZSBVU0JERVZJQ0VfU1VQRVJfTUFHSUMJMHg5ZmEyCisjZGVmaW5lIENHUk9VUF9TVVBFUl9NQUdJQwkweDI3ZTBlYgorCisjZGVmaW5lIEZVVEVYRlNfU1VQRVJfTUFHSUMJMHhCQUQxREVBCisjZGVmaW5lIElOT1RJRllGU19TVVBFUl9NQUdJQwkweDJCQUQxREVBCisKKyNlbmRpZiAvKiBfX0xJTlVYX01BR0lDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjk4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21ham9yLmgKQEAgLTAsMCArMSwxNzMgQEAKKyNpZm5kZWYgX0xJTlVYX01BSk9SX0gKKyNkZWZpbmUgX0xJTlVYX01BSk9SX0gKKworLyoKKyAqIFRoaXMgZmlsZSBoYXMgZGVmaW5pdGlvbnMgZm9yIG1ham9yIGRldmljZSBudW1iZXJzLgorICogRm9yIHRoZSBkZXZpY2UgbnVtYmVyIGFzc2lnbm1lbnRzLCBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dC4KKyAqLworCisjZGVmaW5lIFVOTkFNRURfTUFKT1IJCTAKKyNkZWZpbmUgTUVNX01BSk9SCQkxCisjZGVmaW5lIFJBTURJU0tfTUFKT1IJCTEKKyNkZWZpbmUgRkxPUFBZX01BSk9SCQkyCisjZGVmaW5lIFBUWV9NQVNURVJfTUFKT1IJMgorI2RlZmluZSBJREUwX01BSk9SCQkzCisjZGVmaW5lIEhEX01BSk9SCQlJREUwX01BSk9SCisjZGVmaW5lIFBUWV9TTEFWRV9NQUpPUgkJMworI2RlZmluZSBUVFlfTUFKT1IJCTQKKyNkZWZpbmUgVFRZQVVYX01BSk9SCQk1CisjZGVmaW5lIExQX01BSk9SCQk2CisjZGVmaW5lIFZDU19NQUpPUgkJNworI2RlZmluZSBMT09QX01BSk9SCQk3CisjZGVmaW5lIFNDU0lfRElTSzBfTUFKT1IJOAorI2RlZmluZSBTQ1NJX1RBUEVfTUFKT1IJCTkKKyNkZWZpbmUgTURfTUFKT1IJCTkKKyNkZWZpbmUgTUlTQ19NQUpPUgkJMTAKKyNkZWZpbmUgU0NTSV9DRFJPTV9NQUpPUgkxMQorI2RlZmluZSBNVVhfTUFKT1IJCTExCS8qIFBBLVJJU0Mgb25seSAqLworI2RlZmluZSBYVF9ESVNLX01BSk9SCQkxMworI2RlZmluZSBJTlBVVF9NQUpPUgkJMTMKKyNkZWZpbmUgU09VTkRfTUFKT1IJCTE0CisjZGVmaW5lIENEVTMxQV9DRFJPTV9NQUpPUgkxNQorI2RlZmluZSBKT1lTVElDS19NQUpPUgkJMTUKKyNkZWZpbmUgR09MRFNUQVJfQ0RST01fTUFKT1IJMTYKKyNkZWZpbmUgT1BUSUNTX0NEUk9NX01BSk9SCTE3CisjZGVmaW5lIFNBTllPX0NEUk9NX01BSk9SCTE4CisjZGVmaW5lIENZQ0xBREVTX01BSk9SCQkxOQorI2RlZmluZSBDWUNMQURFU0FVWF9NQUpPUgkyMAorI2RlZmluZSBNSVRTVU1JX1hfQ0RST01fTUFKT1IJMjAKKyNkZWZpbmUgTUZNX0FDT1JOX01BSk9SCQkyMQkvKiBBUk0gTGludXggL2Rldi9tZm0gKi8KKyNkZWZpbmUgU0NTSV9HRU5FUklDX01BSk9SCTIxCisjZGVmaW5lIElERTFfTUFKT1IJCTIyCisjZGVmaW5lIERJR0lDVV9NQUpPUgkJMjIKKyNkZWZpbmUgRElHSV9NQUpPUgkJMjMKKyNkZWZpbmUgTUlUU1VNSV9DRFJPTV9NQUpPUgkyMworI2RlZmluZSBDRFU1MzVfQ0RST01fTUFKT1IJMjQKKyNkZWZpbmUgU1RMX1NFUklBTE1BSk9SCQkyNAorI2RlZmluZSBNQVRTVVNISVRBX0NEUk9NX01BSk9SCTI1CisjZGVmaW5lIFNUTF9DQUxMT1VUTUFKT1IJMjUKKyNkZWZpbmUgTUFUU1VTSElUQV9DRFJPTTJfTUFKT1IJMjYKKyNkZWZpbmUgUUlDMTE3X1RBUEVfTUFKT1IJMjcKKyNkZWZpbmUgTUFUU1VTSElUQV9DRFJPTTNfTUFKT1IJMjcKKyNkZWZpbmUgTUFUU1VTSElUQV9DRFJPTTRfTUFKT1IJMjgKKyNkZWZpbmUgU1RMX1NJT01FTU1BSk9SCQkyOAorI2RlZmluZSBBQ1NJX01BSk9SCQkyOAorI2RlZmluZSBBWlRFQ0hfQ0RST01fTUFKT1IJMjkKKyNkZWZpbmUgR1JBUEhERVZfTUFKT1IJCTI5ICAgLyogU3BhcmNMaW51eCAmIExpbnV4LzY4ayAvZGV2L2ZiICovCisjZGVmaW5lIENNMjA2X0NEUk9NX01BSk9SCTMyCisjZGVmaW5lIElERTJfTUFKT1IJCTMzCisjZGVmaW5lIElERTNfTUFKT1IJCTM0CisjZGVmaW5lIFo4NTMwX01BSk9SCQkzNAorI2RlZmluZSBYUFJBTV9NQUpPUgkJMzUgICAvKiBFeHBhbmRlZCBzdG9yYWdlIG9uIFMvMzkwOiAic2xvdyByYW0iKi8KKyNkZWZpbmUgTkVUTElOS19NQUpPUgkJMzYKKyNkZWZpbmUgUFMyRVNESV9NQUpPUgkJMzYKKyNkZWZpbmUgSURFVEFQRV9NQUpPUgkJMzcKKyNkZWZpbmUgWjJSQU1fTUFKT1IJCTM3CisjZGVmaW5lIEFQQkxPQ0tfTUFKT1IJCTM4ICAgLyogQVAxMDAwIEJsb2NrIGRldmljZSAqLworI2RlZmluZSBERFZfTUFKT1IJCTM5ICAgLyogQVAxMDAwIEREViBibG9jayBkZXZpY2UgKi8KKyNkZWZpbmUgTkJEX01BSk9SCQk0MyAgIC8qIE5ldHdvcmsgYmxvY2sgZGV2aWNlCSovCisjZGVmaW5lIFJJU0NPTThfTk9STUFMX01BSk9SCTQ4CisjZGVmaW5lIERBQzk2MF9NQUpPUgkJNDggICAvKiA0OC4uNTUgKi8KKyNkZWZpbmUgUklTQ09NOF9DQUxMT1VUX01BSk9SCTQ5CisjZGVmaW5lIE1LSVNTX01BSk9SCQk1NQorI2RlZmluZSBEU1A1NktfTUFKT1IJCTU1ICAgLyogRFNQNTYwMDEgcHJvY2Vzc29yIGRldmljZSAqLworCisjZGVmaW5lIElERTRfTUFKT1IJCTU2CisjZGVmaW5lIElERTVfTUFKT1IJCTU3CisKKyNkZWZpbmUgU0NTSV9ESVNLMV9NQUpPUgk2NQorI2RlZmluZSBTQ1NJX0RJU0syX01BSk9SCTY2CisjZGVmaW5lIFNDU0lfRElTSzNfTUFKT1IJNjcKKyNkZWZpbmUgU0NTSV9ESVNLNF9NQUpPUgk2OAorI2RlZmluZSBTQ1NJX0RJU0s1X01BSk9SCTY5CisjZGVmaW5lIFNDU0lfRElTSzZfTUFKT1IJNzAKKyNkZWZpbmUgU0NTSV9ESVNLN19NQUpPUgk3MQorCisjZGVmaW5lIENPTVBBUV9TTUFSVDJfTUFKT1IJNzIKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjEJNzMKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjIJNzQKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjMJNzUKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjQJNzYKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjUJNzcKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjYJNzgKKyNkZWZpbmUgQ09NUEFRX1NNQVJUMl9NQUpPUjcJNzkKKworI2RlZmluZSBTUEVDSUFMSVhfTk9STUFMX01BSk9SCTc1CisjZGVmaW5lIFNQRUNJQUxJWF9DQUxMT1VUX01BSk9SCTc2CisKKyNkZWZpbmUgQVVST1JBX01BSk9SCQk3OQorCisjZGVmaW5lIEkyT19NQUpPUgkJODAJLyogODAtPjg3ICovCisKKyNkZWZpbmUgU0hNSVFfTUFKT1IJCTg1ICAgLyogTGludXgvbWlwcywgU0dJIC9kZXYvc2htaXEgKi8KKyNkZWZpbmUgU0NTSV9DSEFOR0VSX01BSk9SICAgICAgODYKKworI2RlZmluZSBJREU2X01BSk9SCQk4OAorI2RlZmluZSBJREU3X01BSk9SCQk4OQorI2RlZmluZSBJREU4X01BSk9SCQk5MAorI2RlZmluZSBJREU5X01BSk9SCQk5MQorCisjZGVmaW5lIERBU0RfTUFKT1IJCTk0CisKKyNkZWZpbmUgTURJU0tfTUFKT1IJCTk1CisKKyNkZWZpbmUgVUJEX01BSk9SCQk5OAorCisjZGVmaW5lIFBQX01BSk9SCQk5OQorI2RlZmluZSBKU0ZEX01BSk9SCQk5OQorCisjZGVmaW5lIFBIT05FX01BSk9SCQkxMDAKKworI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUgkxMDQKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1IxCTEwNQorI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjIgICAgICAxMDYKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1IzICAgICAgMTA3CisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SNCAgICAgIDEwOAorI2RlZmluZSBDT01QQVFfQ0lTU19NQUpPUjUgICAgICAxMDkKKyNkZWZpbmUgQ09NUEFRX0NJU1NfTUFKT1I2ICAgICAgMTEwCisjZGVmaW5lIENPTVBBUV9DSVNTX01BSk9SNyAgICAgIDExMQorCisjZGVmaW5lIFZJT0RBU0RfTUFKT1IJCTExMgorI2RlZmluZSBWSU9DRF9NQUpPUgkJMTEzCisKKyNkZWZpbmUgQVRBUkFJRF9NQUpPUgkJMTE0CisKKyNkZWZpbmUgU0NTSV9ESVNLOF9NQUpPUgkxMjgKKyNkZWZpbmUgU0NTSV9ESVNLOV9NQUpPUgkxMjkKKyNkZWZpbmUgU0NTSV9ESVNLMTBfTUFKT1IJMTMwCisjZGVmaW5lIFNDU0lfRElTSzExX01BSk9SCTEzMQorI2RlZmluZSBTQ1NJX0RJU0sxMl9NQUpPUgkxMzIKKyNkZWZpbmUgU0NTSV9ESVNLMTNfTUFKT1IJMTMzCisjZGVmaW5lIFNDU0lfRElTSzE0X01BSk9SCTEzNAorI2RlZmluZSBTQ1NJX0RJU0sxNV9NQUpPUgkxMzUKKworI2RlZmluZSBVTklYOThfUFRZX01BU1RFUl9NQUpPUgkxMjgKKyNkZWZpbmUgVU5JWDk4X1BUWV9NQUpPUl9DT1VOVAk4CisjZGVmaW5lIFVOSVg5OF9QVFlfU0xBVkVfTUFKT1IJKFVOSVg5OF9QVFlfTUFTVEVSX01BSk9SK1VOSVg5OF9QVFlfTUFKT1JfQ09VTlQpCisKKyNkZWZpbmUgUlRGX01BSk9SCQkxNTAKKyNkZWZpbmUgUkFXX01BSk9SCQkxNjIKKworI2RlZmluZSBVU0JfQUNNX01BSk9SCQkxNjYKKyNkZWZpbmUgVVNCX0FDTV9BVVhfTUFKT1IJMTY3CisjZGVmaW5lIFVTQl9DSEFSX01BSk9SCQkxODAKKworI2RlZmluZSBNTUNfQkxPQ0tfTUFKT1IJCTE3OQorCisjZGVmaW5lIFZYVk1fTUFKT1IJCTE5OQkvKiBWRVJJVEFTIHZvbHVtZSBpL28gZHJpdmVyICAgICovCisjZGVmaW5lIFZYU1BFQ19NQUpPUgkJMjAwCS8qIFZFUklUQVMgdm9sdW1lIGNvbmZpZyBkcml2ZXIgKi8KKyNkZWZpbmUgVlhETVBfTUFKT1IJCTIwMQkvKiBWRVJJVEFTIHZvbHVtZSBtdWx0aXBhdGggZHJpdmVyICovCisKKyNkZWZpbmUgWEVOVkJEX01BSk9SCQkyMDIJLyogWGVuIHZpcnR1YWwgYmxvY2sgZGV2aWNlICovCisKKyNkZWZpbmUgTVNSX01BSk9SCQkyMDIKKyNkZWZpbmUgQ1BVSURfTUFKT1IJCTIwMworCisjZGVmaW5lIE9TU1RfTUFKT1IJCTIwNgkvKiBPblN0cmVhbS1TQ3gwIFNDU0kgdGFwZSAqLworCisjZGVmaW5lIElCTV9UVFkzMjcwX01BSk9SCTIyNworI2RlZmluZSBJQk1fRlMzMjcwX01BSk9SCTIyOAorCisjZGVmaW5lIFZJT1RBUEVfTUFKT1IJCTIzMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWF0cm94ZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWF0cm94ZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTViMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tYXRyb3hmYi5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX19MSU5VWF9NQVRST1hGQl9IX18KKyNkZWZpbmUgX19MSU5VWF9NQVRST1hGQl9IX18KKworI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCitzdHJ1Y3QgbWF0cm94aW9jX291dHB1dF9tb2RlIHsKKwlfX3UzMglvdXRwdXQ7CQkvKiB3aGljaCBvdXRwdXQgKi8KKyNkZWZpbmUgTUFUUk9YRkJfT1VUUFVUX1BSSU1BUlkJCTB4MDAwMAorI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfU0VDT05EQVJZCTB4MDAwMQorI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfREZQCQkweDAwMDIKKwlfX3UzMgltb2RlOwkJLyogd2hpY2ggbW9kZSAqLworI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfTU9ERV9QQUwJMHgwMDAxCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9NT0RFX05UU0MJMHgwMDAyCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9NT0RFX01PTklUT1IJMHgwMDgwCit9OworI2RlZmluZSBNQVRST1hGQl9TRVRfT1VUUFVUX01PREUJX0lPVygnbicsMHhGQSxzaXplX3QpCisjZGVmaW5lIE1BVFJPWEZCX0dFVF9PVVRQVVRfTU9ERQlfSU9XUignbicsMHhGQSxzaXplX3QpCisKKy8qIGJpdGZpZWxkICovCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9DT05OX1BSSU1BUlkJKDEgPDwgTUFUUk9YRkJfT1VUUFVUX1BSSU1BUlkpCisjZGVmaW5lIE1BVFJPWEZCX09VVFBVVF9DT05OX1NFQ09OREFSWQkoMSA8PCBNQVRST1hGQl9PVVRQVVRfU0VDT05EQVJZKQorI2RlZmluZSBNQVRST1hGQl9PVVRQVVRfQ09OTl9ERlAJKDEgPDwgTUFUUk9YRkJfT1VUUFVUX0RGUCkKKy8qIGNvbm5lY3QgdGhlc2Ugb3V0cHV0cyB0byB0aGlzIGZyYW1lYnVmZmVyICovCisjZGVmaW5lIE1BVFJPWEZCX1NFVF9PVVRQVVRfQ09OTkVDVElPTglfSU9XKCduJywweEY4LHNpemVfdCkKKy8qIHdoaWNoIG91dHB1dHMgYXJlIGNvbm5lY3RlZCB0byB0aGlzIGZyYW1lYnVmZmVyICovCisjZGVmaW5lIE1BVFJPWEZCX0dFVF9PVVRQVVRfQ09OTkVDVElPTglfSU9SKCduJywweEY4LHNpemVfdCkKKy8qIHdoaWNoIG91dHB1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBmcmFtZWJ1ZmZlciAqLworI2RlZmluZSBNQVRST1hGQl9HRVRfQVZBSUxBQkxFX09VVFBVVFMJX0lPUignbicsMHhGOSxzaXplX3QpCisvKiB3aGljaCBvdXRwdXRzIGV4aXN0IG9uIHRoaXMgZnJhbWVidWZmZXIgKi8KKyNkZWZpbmUgTUFUUk9YRkJfR0VUX0FMTF9PVVRQVVRTCV9JT1IoJ24nLDB4RkIsc2l6ZV90KQorCitlbnVtIG1hdHJveGZiX2N0cmxfaWQgeworICBNQVRST1hGQl9DSURfVEVTVE9VVAkgPSBWNEwyX0NJRF9QUklWQVRFX0JBU0UsCisgIE1BVFJPWEZCX0NJRF9ERUZMSUNLRVIsCisgIE1BVFJPWEZCX0NJRF9MQVNUCit9OworCisjZGVmaW5lIEZCSU9fV0FJVEZPUlZTWU5DCV9JT1coJ0YnLCAweDIwLCB1X2ludDMyX3QpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMwNGNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIF9MSU5VWF9NRU1QT0xJQ1lfSAorI2RlZmluZSBfTElOVVhfTUVNUE9MSUNZX0ggMQorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworLyoKKyAqIE5VTUEgbWVtb3J5IHBvbGljaWVzIGZvciBMaW51eC4KKyAqIENvcHlyaWdodCAyMDAzLDIwMDQgQW5kaSBLbGVlbiBTdVNFIExhYnMKKyAqLworCisvKiBQb2xpY2llcyAqLworI2RlZmluZSBNUE9MX0RFRkFVTFQJMAorI2RlZmluZSBNUE9MX1BSRUZFUlJFRAkxCisjZGVmaW5lIE1QT0xfQklORAkyCisjZGVmaW5lIE1QT0xfSU5URVJMRUFWRQkzCisKKyNkZWZpbmUgTVBPTF9NQVggTVBPTF9JTlRFUkxFQVZFCisKKy8qIEZsYWdzIGZvciBnZXRfbWVtX3BvbGljeSAqLworI2RlZmluZSBNUE9MX0ZfTk9ERQkoMTw8MCkJLyogcmV0dXJuIG5leHQgSUwgbW9kZSBpbnN0ZWFkIG9mIG5vZGUgbWFzayAqLworI2RlZmluZSBNUE9MX0ZfQUREUgkoMTw8MSkJLyogbG9vayB1cCB2bWEgdXNpbmcgYWRkcmVzcyAqLworI2RlZmluZSBNUE9MX0ZfTUVNU19BTExPV0VEICgxPDwyKSAvKiByZXR1cm4gYWxsb3dlZCBtZW1vcmllcyAqLworCisvKiBGbGFncyBmb3IgbWJpbmQgKi8KKyNkZWZpbmUgTVBPTF9NRl9TVFJJQ1QJKDE8PDApCS8qIFZlcmlmeSBleGlzdGluZyBwYWdlcyBpbiB0aGUgbWFwcGluZyAqLworI2RlZmluZSBNUE9MX01GX01PVkUJKDE8PDEpCS8qIE1vdmUgcGFnZXMgb3duZWQgYnkgdGhpcyBwcm9jZXNzIHRvIGNvbmZvcm0gdG8gbWFwcGluZyAqLworI2RlZmluZSBNUE9MX01GX01PVkVfQUxMICgxPDwyKQkvKiBNb3ZlIGV2ZXJ5IHBhZ2UgdG8gY29uZm9ybSB0byBtYXBwaW5nICovCisjZGVmaW5lIE1QT0xfTUZfSU5URVJOQUwgKDE8PDMpCS8qIEludGVybmFsIGZsYWdzIHN0YXJ0IGhlcmUgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWV5ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tZXllLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmZDljOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWV5ZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBNb3Rpb24gRXllIHZpZGVvNGxpbnV4IGRyaXZlciBmb3IgU29ueSBWYWlvIFBpY3R1cmVCb29rCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGPDtHZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CisgKgorICogRWFybGllciB3b3JrIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgUGF1bCBgUnVzdHknIFJ1c3NlbGwgYW5kIFBhdWwgTWFja2VycmFzLgorICoKKyAqIFNvbWUgcGFydHMgYm9ycm93ZWQgZnJvbSB2YXJpb3VzIHZpZGVvNGxpbnV4IGRyaXZlcnMsIGVzcGVjaWFsbHkKKyAqIGJ0dHYtZHJpdmVyLmMgYW5kIHpvcmFuLmMsIHNlZSBvcmlnaW5hbCBmaWxlcyBmb3IgY3JlZGl0cy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9NRVlFX0hfCisjZGVmaW5lIF9NRVlFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUHJpdmF0ZSBBUEkgZm9yIGhhbmRsaW5nIG1qcGVnIGNhcHR1cmUgLyBwbGF5YmFjay4gICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG1leWVfcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIHN1YnNhbXBsZTsKKwl1bnNpZ25lZCBjaGFyIHF1YWxpdHk7CisJdW5zaWduZWQgY2hhciBzaGFycG5lc3M7CisJdW5zaWduZWQgY2hhciBhZ2M7CisJdW5zaWduZWQgY2hhciBwaWN0dXJlOworCXVuc2lnbmVkIGNoYXIgZnJhbWVyYXRlOworfTsKKworLyogcXVlcnkgdGhlIGV4dGVuZGVkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUVZRUlPQ19HX1BBUkFNUwlfSU9SICgndicsIEJBU0VfVklESU9DUFJJVkFURSswLCBzdHJ1Y3QgbWV5ZV9wYXJhbXMpCisvKiBzZXQgdGhlIGV4dGVuZGVkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUVZRUlPQ19TX1BBUkFNUwlfSU9XICgndicsIEJBU0VfVklESU9DUFJJVkFURSsxLCBzdHJ1Y3QgbWV5ZV9wYXJhbXMpCisvKiBxdWV1ZSBhIGJ1ZmZlciBmb3IgbWpwZWcgY2FwdHVyZSAqLworI2RlZmluZSBNRVlFSU9DX1FCVUZfQ0FQVAlfSU9XICgndicsIEJBU0VfVklESU9DUFJJVkFURSsyLCBpbnQpCisvKiBzeW5jIGEgcHJldmlvdXNseSBxdWV1ZWQgbWpwZWcgYnVmZmVyICovCisjZGVmaW5lIE1FWUVJT0NfU1lOQwkJX0lPV1IoJ3YnLCBCQVNFX1ZJRElPQ1BSSVZBVEUrMywgaW50KQorLyogZ2V0IGEgc3RpbGwgdW5jb21wcmVzc2VkIHNuYXBzaG90ICovCisjZGVmaW5lIE1FWUVJT0NfU1RJTExDQVBUCV9JTyAgKCd2JywgQkFTRV9WSURJT0NQUklWQVRFKzQpCisvKiBnZXQgYSBqcGVnIGNvbXByZXNzZWQgc25hcHNob3QgKi8KKyNkZWZpbmUgTUVZRUlPQ19TVElMTEpDQVBUCV9JT1IgKCd2JywgQkFTRV9WSURJT0NQUklWQVRFKzUsIGludCkKKworLyogVjRMMiBwcml2YXRlIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ0lEX0FHQwkJVjRMMl9DSURfUFJJVkFURV9CQVNFCisjZGVmaW5lIFY0TDJfQ0lEX1NIQVJQTkVTUwkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUElDVFVSRQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfSlBFR1FVQUwJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX0ZSQU1FUkFURQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21paS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9taWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZkN2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9taWkuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIGxpbnV4L21paS5oOiBkZWZpbml0aW9ucyBmb3IgTUlJLWNvbXBhdGlibGUgdHJhbnNjZWl2ZXJzCisgKiBPcmlnaW5hbGx5IGRyaXZlcnMvbmV0L3N1bmhtZS5oLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01JSV9IX18KKyNkZWZpbmUgX19MSU5VWF9NSUlfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBHZW5lcmljIE1JSSByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgTUlJX0JNQ1IgICAgICAgICAgICAweDAwICAgICAgICAvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JNU1IgICAgICAgICAgICAweDAxICAgICAgICAvKiBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDEgICAgICAgICAweDAyICAgICAgICAvKiBQSFlTIElEIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1BIWVNJRDIgICAgICAgICAweDAzICAgICAgICAvKiBQSFlTIElEIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0FEVkVSVElTRSAgICAgICAweDA0ICAgICAgICAvKiBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnICAgKi8KKyNkZWZpbmUgTUlJX0xQQSAgICAgICAgICAgICAweDA1ICAgICAgICAvKiBMaW5rIHBhcnRuZXIgYWJpbGl0eSByZWcgICAgKi8KKyNkZWZpbmUgTUlJX0VYUEFOU0lPTiAgICAgICAweDA2ICAgICAgICAvKiBFeHBhbnNpb24gcmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0NUUkwxMDAwICAgICAgICAweDA5ICAgICAgICAvKiAxMDAwQkFTRS1UIGNvbnRyb2wgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1NUQVQxMDAwICAgICAgICAweDBhICAgICAgICAvKiAxMDAwQkFTRS1UIHN0YXR1cyAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0VTVEFUVVMJICAgIDB4MGYJLyogRXh0ZW5kZWQgU3RhdHVzICovCisjZGVmaW5lIE1JSV9EQ09VTlRFUiAgICAgICAgMHgxMiAgICAgICAgLyogRGlzY29ubmVjdCBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIE1JSV9GQ1NDT1VOVEVSICAgICAgMHgxMyAgICAgICAgLyogRmFsc2UgY2FycmllciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9OV0FZVEVTVCAgICAgICAgMHgxNCAgICAgICAgLyogTi13YXkgYXV0by1uZWcgdGVzdCByZWcgICAgICovCisjZGVmaW5lIE1JSV9SRVJSQ09VTlRFUiAgICAgMHgxNSAgICAgICAgLyogUmVjZWl2ZSBlcnJvciBjb3VudGVyICAgICAgICovCisjZGVmaW5lIE1JSV9TUkVWSVNJT04gICAgICAgMHgxNiAgICAgICAgLyogU2lsaWNvbiByZXZpc2lvbiAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMSAgICAgICAgICAgMHgxNyAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9MQlJFUlJPUiAgICAgICAgMHgxOCAgICAgICAgLyogTHBiYWNrLCByeCwgYnlwYXNzIGVycm9yICAgICovCisjZGVmaW5lIE1JSV9QSFlBRERSICAgICAgICAgMHgxOSAgICAgICAgLyogUEhZIGFkZHJlc3MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRVNWMiAgICAgICAgICAgMHgxYSAgICAgICAgLyogUmVzZXJ2ZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9UUElTVEFUVVMgICAgICAgMHgxYiAgICAgICAgLyogVFBJIHN0YXR1cyBmb3IgMTBtYnBzICAgICAgICovCisjZGVmaW5lIE1JSV9OQ09ORklHICAgICAgICAgMHgxYyAgICAgICAgLyogTmV0d29yayBpbnRlcmZhY2UgY29uZmlnICAgICovCisKKy8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQk1DUl9SRVNWICAgICAgICAgICAgICAgMHgwMDNmICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMDAJCTB4MDA0MCAgLyogTVNCIG9mIFNwZWVkICgxMDAwKSAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfQ1RTVCAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQ29sbGlzaW9uIHRlc3QgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfRlVMTERQTFggICAgICAgICAgIDB4MDEwMCAgLyogRnVsbCBkdXBsZXggICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5SRVNUQVJUICAgICAgICAgIDB4MDIwMCAgLyogQXV0byBuZWdvdGlhdGlvbiByZXN0YXJ0ICAgICovCisjZGVmaW5lIEJNQ1JfSVNPTEFURSAgICAgICAgICAgIDB4MDQwMCAgLyogRGlzY29ubmVjdCBEUDgzODQwIGZyb20gTUlJICovCisjZGVmaW5lIEJNQ1JfUERPV04gICAgICAgICAgICAgIDB4MDgwMCAgLyogUG93ZXJkb3duIHRoZSBEUDgzODQwICAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5FTkFCTEUgICAgICAgICAgIDB4MTAwMCAgLyogRW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gICAgICovCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAgICAgICAgICAgIDB4MjAwMCAgLyogU2VsZWN0IDEwME1icHMgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfTE9PUEJBQ0sgICAgICAgICAgIDB4NDAwMCAgLyogVFhEIGxvb3BiYWNrIGJpdHMgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfUkVTRVQgICAgICAgICAgICAgIDB4ODAwMCAgLyogUmVzZXQgdGhlIERQODM4NDAgICAgICAgICAgICovCisKKy8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCTVNSX0VSQ0FQICAgICAgICAgICAgICAweDAwMDEgIC8qIEV4dC1yZWcgY2FwYWJpbGl0eSAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0pDRCAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEphYmJlciBkZXRlY3RlZCAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0xTVEFUVVMgICAgICAgICAgICAweDAwMDQgIC8qIExpbmsgc3RhdHVzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDQVBBQkxFICAgICAgICAweDAwMDggIC8qIEFibGUgdG8gZG8gYXV0by1uZWdvdGlhdGlvbiAqLworI2RlZmluZSBCTVNSX1JGQVVMVCAgICAgICAgICAgICAweDAwMTAgIC8qIFJlbW90ZSBmYXVsdCBkZXRlY3RlZCAgICAgICAqLworI2RlZmluZSBCTVNSX0FORUdDT01QTEVURSAgICAgICAweDAwMjAgIC8qIEF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUgICAqLworI2RlZmluZSBCTVNSX1JFU1YgICAgICAgICAgICAgICAweDAwYzAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0VTVEFURU4JCTB4MDEwMAkvKiBFeHRlbmRlZCBTdGF0dXMgaW4gUjE1ICovCisjZGVmaW5lIEJNU1JfMTAwSEFMRjIgICAgICAgICAgIDB4MDIwMCAgLyogQ2FuIGRvIDEwMEJBU0UtVDIgSERYICovCisjZGVmaW5lIEJNU1JfMTAwRlVMTDIgICAgICAgICAgIDB4MDQwMCAgLyogQ2FuIGRvIDEwMEJBU0UtVDIgRkRYICovCisjZGVmaW5lIEJNU1JfMTBIQUxGICAgICAgICAgICAgIDB4MDgwMCAgLyogQ2FuIGRvIDEwbWJwcywgaGFsZi1kdXBsZXggICovCisjZGVmaW5lIEJNU1JfMTBGVUxMICAgICAgICAgICAgIDB4MTAwMCAgLyogQ2FuIGRvIDEwbWJwcywgZnVsbC1kdXBsZXggICovCisjZGVmaW5lIEJNU1JfMTAwSEFMRiAgICAgICAgICAgIDB4MjAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIGhhbGYtZHVwbGV4ICovCisjZGVmaW5lIEJNU1JfMTAwRlVMTCAgICAgICAgICAgIDB4NDAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIEJNU1JfMTAwQkFTRTQgICAgICAgICAgIDB4ODAwMCAgLyogQ2FuIGRvIDEwMG1icHMsIDRrIHBhY2tldHMgICovCisKKy8qIEFkdmVydGlzZW1lbnQgY29udHJvbCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQURWRVJUSVNFX1NMQ1QgICAgICAgICAgMHgwMDFmICAvKiBTZWxlY3RvciBiaXRzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFX0NTTUEgICAgICAgICAgMHgwMDAxICAvKiBPbmx5IHNlbGVjdG9yIHN1cHBvcnRlZCAgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwSEFMRiAgICAgICAgMHgwMDIwICAvKiBUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYRlVMTCAgICAgMHgwMDIwICAvKiBUcnkgZm9yIDEwMDBCQVNFLVggZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwRlVMTCAgICAgICAgMHgwMDQwICAvKiBUcnkgZm9yIDEwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYSEFMRiAgICAgMHgwMDQwICAvKiBUcnkgZm9yIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEhBTEYgICAgICAgMHgwMDgwICAvKiBUcnkgZm9yIDEwMG1icHMgaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYUEFVU0UgICAgMHgwMDgwICAvKiBUcnkgZm9yIDEwMDBCQVNFLVggcGF1c2UgICAgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMEZVTEwgICAgICAgMHgwMTAwICAvKiBUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0gMHgwMTAwICAvKiBUcnkgZm9yIDEwMDBCQVNFLVggYXN5bSBwYXVzZSAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwQkFTRTQgICAgICAweDAyMDAgIC8qIFRyeSBmb3IgMTAwbWJwcyA0ayBwYWNrZXRzICAqLworI2RlZmluZSBBRFZFUlRJU0VfUEFVU0VfQ0FQICAgICAweDA0MDAgIC8qIFRyeSBmb3IgcGF1c2UgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfUEFVU0VfQVNZTSAgICAweDA4MDAgIC8qIFRyeSBmb3IgYXN5bWV0cmljIHBhdXNlICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfUkVTViAgICAgICAgICAweDEwMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfUkZBVUxUICAgICAgICAweDIwMDAgIC8qIFNheSB3ZSBjYW4gZGV0ZWN0IGZhdWx0cyAgICAqLworI2RlZmluZSBBRFZFUlRJU0VfTFBBQ0sgICAgICAgICAweDQwMDAgIC8qIEFjayBsaW5rIHBhcnRuZXJzIHJlc3BvbnNlICAqLworI2RlZmluZSBBRFZFUlRJU0VfTlBBR0UgICAgICAgICAweDgwMDAgIC8qIE5leHQgcGFnZSBiaXQgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEFEVkVSVElTRV9GVUxMIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisJCQlBRFZFUlRJU0VfQ1NNQSkKKyNkZWZpbmUgQURWRVJUSVNFX0FMTCAoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpCisKKy8qIExpbmsgcGFydG5lciBhYmlsaXR5IHJlZ2lzdGVyLiAqLworI2RlZmluZSBMUEFfU0xDVCAgICAgICAgICAgICAgICAweDAwMWYgIC8qIFNhbWUgYXMgYWR2ZXJ0aXNlIHNlbGVjdG9yICAqLworI2RlZmluZSBMUEFfMTBIQUxGICAgICAgICAgICAgICAweDAwMjAgIC8qIENhbiBkbyAxMG1icHMgaGFsZi1kdXBsZXggICAqLworI2RlZmluZSBMUEFfMTAwMFhGVUxMICAgICAgICAgICAweDAwMjAgIC8qIENhbiBkbyAxMDAwQkFTRS1YIGZ1bGwtZHVwbGV4ICovCisjZGVmaW5lIExQQV8xMEZVTEwgICAgICAgICAgICAgIDB4MDA0MCAgLyogQ2FuIGRvIDEwbWJwcyBmdWxsLWR1cGxleCAgICovCisjZGVmaW5lIExQQV8xMDAwWEhBTEYgICAgICAgICAgIDB4MDA0MCAgLyogQ2FuIGRvIDEwMDBCQVNFLVggaGFsZi1kdXBsZXggKi8KKyNkZWZpbmUgTFBBXzEwMEhBTEYgICAgICAgICAgICAgMHgwMDgwICAvKiBDYW4gZG8gMTAwbWJwcyBoYWxmLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYUEFVU0UgICAgICAgICAgMHgwMDgwICAvKiBDYW4gZG8gMTAwMEJBU0UtWCBwYXVzZSAgICAgKi8KKyNkZWZpbmUgTFBBXzEwMEZVTEwgICAgICAgICAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwbWJwcyBmdWxsLWR1cGxleCAgKi8KKyNkZWZpbmUgTFBBXzEwMDBYUEFVU0VfQVNZTSAgICAgMHgwMTAwICAvKiBDYW4gZG8gMTAwMEJBU0UtWCBwYXVzZSBhc3ltKi8KKyNkZWZpbmUgTFBBXzEwMEJBU0U0ICAgICAgICAgICAgMHgwMjAwICAvKiBDYW4gZG8gMTAwbWJwcyA0ayBwYWNrZXRzICAgKi8KKyNkZWZpbmUgTFBBX1BBVVNFX0NBUCAgICAgICAgICAgMHgwNDAwICAvKiBDYW4gcGF1c2UgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1BBVVNFX0FTWU0gICAgICAgICAgMHgwODAwICAvKiBDYW4gcGF1c2UgYXN5bWV0cmljYWxseSAgICAgKi8KKyNkZWZpbmUgTFBBX1JFU1YgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBBX1JGQVVMVCAgICAgICAgICAgICAgMHgyMDAwICAvKiBMaW5rIHBhcnRuZXIgZmF1bHRlZCAgICAgICAgKi8KKyNkZWZpbmUgTFBBX0xQQUNLICAgICAgICAgICAgICAgMHg0MDAwICAvKiBMaW5rIHBhcnRuZXIgYWNrZWQgdXMgICAgICAgKi8KKyNkZWZpbmUgTFBBX05QQUdFICAgICAgICAgICAgICAgMHg4MDAwICAvKiBOZXh0IHBhZ2UgYml0ICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMUEFfRFVQTEVYCQkoTFBBXzEwRlVMTCB8IExQQV8xMDBGVUxMKQorI2RlZmluZSBMUEFfMTAwCQkJKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYgfCBMUEFfMTAwQkFTRTQpCisKKy8qIEV4cGFuc2lvbiByZWdpc3RlciBmb3IgYXV0by1uZWdvdGlhdGlvbi4gKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05XQVkgICAgICAgICAgMHgwMDAxICAvKiBDYW4gZG8gTi13YXkgYXV0by1uZWdvICAgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0xDV1AgICAgICAgICAgMHgwMDAyICAvKiBHb3QgbmV3IFJYIHBhZ2UgY29kZSB3b3JkICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX0VOQUJMRU5QQUdFICAgMHgwMDA0ICAvKiBUaGlzIGVuYWJsZXMgbnBhZ2Ugd29yZHMgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX05QQ0FQQUJMRSAgICAgMHgwMDA4ICAvKiBMaW5rIHBhcnRuZXIgc3VwcG9ydHMgbnBhZ2UgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX01GQVVMVFMgICAgICAgMHgwMDEwICAvKiBNdWx0aXBsZSBmYXVsdHMgZGV0ZWN0ZWQgICAgKi8KKyNkZWZpbmUgRVhQQU5TSU9OX1JFU1YgICAgICAgICAgMHhmZmUwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFU1RBVFVTXzEwMDBfVEZVTEwJMHgyMDAwCS8qIENhbiBkbyAxMDAwQlQgRnVsbCAqLworI2RlZmluZSBFU1RBVFVTXzEwMDBfVEhBTEYJMHgxMDAwCS8qIENhbiBkbyAxMDAwQlQgSGFsZiAqLworCisvKiBOLXdheSB0ZXN0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMSAgICAgICAgICAweDAwZmYgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOV0FZVEVTVF9MT09QQkFDSyAgICAgICAweDAxMDAgIC8qIEVuYWJsZSBsb29wYmFjayBmb3IgTi13YXkgICAqLworI2RlZmluZSBOV0FZVEVTVF9SRVNWMiAgICAgICAgICAweGZlMDAgIC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgICAqLworCisvKiAxMDAwQkFTRS1UIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBGVUxMICAgICAgMHgwMjAwICAvKiBBZHZlcnRpc2UgMTAwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBBRFZFUlRJU0VfMTAwMEhBTEYgICAgICAweDAxMDAgIC8qIEFkdmVydGlzZSAxMDAwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisKKy8qIDEwMDBCQVNFLVQgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExQQV8xMDAwTE9DQUxSWE9LICAgICAgIDB4MjAwMCAgLyogTGluayBwYXJ0bmVyIGxvY2FsIHJlY2VpdmVyIHN0YXR1cyAqLworI2RlZmluZSBMUEFfMTAwMFJFTVJYT0sgICAgICAgICAweDEwMDAgIC8qIExpbmsgcGFydG5lciByZW1vdGUgcmVjZWl2ZXIgc3RhdHVzICovCisjZGVmaW5lIExQQV8xMDAwRlVMTCAgICAgICAgICAgIDB4MDgwMCAgLyogTGluayBwYXJ0bmVyIDEwMDBCQVNFLVQgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgTFBBXzEwMDBIQUxGICAgICAgICAgICAgMHgwNDAwICAvKiBMaW5rIHBhcnRuZXIgMTAwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGluIGFsbCBTSU9DeE1JSXh4eCBpb2N0bCBjYWxscyAqLworc3RydWN0IG1paV9pb2N0bF9kYXRhIHsKKwlfX3UxNgkJcGh5X2lkOworCV9fdTE2CQlyZWdfbnVtOworCV9fdTE2CQl2YWxfaW47CisJX191MTYJCXZhbF9vdXQ7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9NSUlfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21pbml4X2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21pbml4X2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzOTc0NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbWluaXhfZnMuaApAQCAtMCwwICsxLDEwNSBAQAorI2lmbmRlZiBfTElOVVhfTUlOSVhfRlNfSAorI2RlZmluZSBfTElOVVhfTUlOSVhfRlNfSAorCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyoKKyAqIFRoZSBtaW5peCBmaWxlc3lzdGVtIGNvbnN0YW50cy9zdHJ1Y3R1cmVzCisgKi8KKworLyoKKyAqIFRoYW5rcyB0byBLZWVzIEogQm90IGZvciBzZW5kaW5nIG1lIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgbmV3CisgKiBtaW5peCBmaWxlc3lzdGVtIChha2EgVjIpIHdpdGggYmlnZ2VyIGlub2RlcyBhbmQgMzItYml0IGJsb2NrCisgKiBwb2ludGVycy4KKyAqLworCisjZGVmaW5lIE1JTklYX1JPT1RfSU5PIDEKKworLyogTm90IHRoZSBzYW1lIGFzIHRoZSBib2d1cyBMSU5LX01BWCBpbiA8bGludXgvbGltaXRzLmg+LiBPaCB3ZWxsLiAqLworI2RlZmluZSBNSU5JWF9MSU5LX01BWAkyNTAKKyNkZWZpbmUgTUlOSVgyX0xJTktfTUFYCTY1NTMwCisKKyNkZWZpbmUgTUlOSVhfSV9NQVBfU0xPVFMJOAorI2RlZmluZSBNSU5JWF9aX01BUF9TTE9UUwk2NAorI2RlZmluZSBNSU5JWF9WQUxJRF9GUwkJMHgwMDAxCQkvKiBDbGVhbiBmcy4gKi8KKyNkZWZpbmUgTUlOSVhfRVJST1JfRlMJCTB4MDAwMgkJLyogZnMgaGFzIGVycm9ycy4gKi8KKworI2RlZmluZSBNSU5JWF9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4X2lub2RlKSkpCisKKy8qCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBtaW5peCBpbm9kZSBsYXlvdXQgb24gZGlzay4KKyAqIE5vdGUgdGhlIDgtYml0IGdpZCBhbmQgYXRpbWUgYW5kIGN0aW1lLgorICovCitzdHJ1Y3QgbWluaXhfaW5vZGUgeworCV9fdTE2IGlfbW9kZTsKKwlfX3UxNiBpX3VpZDsKKwlfX3UzMiBpX3NpemU7CisJX191MzIgaV90aW1lOworCV9fdTggIGlfZ2lkOworCV9fdTggIGlfbmxpbmtzOworCV9fdTE2IGlfem9uZVs5XTsKK307CisKKy8qCisgKiBUaGUgbmV3IG1pbml4IGlub2RlIGhhcyBhbGwgdGhlIHRpbWUgZW50cmllcywgYXMgd2VsbCBhcworICogbG9uZyBibG9jayBudW1iZXJzIGFuZCBhIHRoaXJkIGluZGlyZWN0IGJsb2NrICg3KzErMSsxCisgKiBpbnN0ZWFkIG9mIDcrMSsxKS4gQWxzbywgc29tZSBwcmV2aW91c2x5IDgtYml0IHZhbHVlcyBhcmUKKyAqIG5vdyAxNi1iaXQuIFRoZSBpbm9kZSBpcyBub3cgNjQgYnl0ZXMgaW5zdGVhZCBvZiAzMi4KKyAqLworc3RydWN0IG1pbml4Ml9pbm9kZSB7CisJX191MTYgaV9tb2RlOworCV9fdTE2IGlfbmxpbmtzOworCV9fdTE2IGlfdWlkOworCV9fdTE2IGlfZ2lkOworCV9fdTMyIGlfc2l6ZTsKKwlfX3UzMiBpX2F0aW1lOworCV9fdTMyIGlfbXRpbWU7CisJX191MzIgaV9jdGltZTsKKwlfX3UzMiBpX3pvbmVbMTBdOworfTsKKworLyoKKyAqIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzaworICovCitzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgeworCV9fdTE2IHNfbmlub2RlczsKKwlfX3UxNiBzX256b25lczsKKwlfX3UxNiBzX2ltYXBfYmxvY2tzOworCV9fdTE2IHNfem1hcF9ibG9ja3M7CisJX191MTYgc19maXJzdGRhdGF6b25lOworCV9fdTE2IHNfbG9nX3pvbmVfc2l6ZTsKKwlfX3UzMiBzX21heF9zaXplOworCV9fdTE2IHNfbWFnaWM7CisJX191MTYgc19zdGF0ZTsKKwlfX3UzMiBzX3pvbmVzOworfTsKKworLyoKKyAqIFYzIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzaworICovCitzdHJ1Y3QgbWluaXgzX3N1cGVyX2Jsb2NrIHsKKwlfX3UzMiBzX25pbm9kZXM7CisJX191MTYgc19wYWQwOworCV9fdTE2IHNfaW1hcF9ibG9ja3M7CisJX191MTYgc196bWFwX2Jsb2NrczsKKwlfX3UxNiBzX2ZpcnN0ZGF0YXpvbmU7CisJX191MTYgc19sb2dfem9uZV9zaXplOworCV9fdTE2IHNfcGFkMTsKKwlfX3UzMiBzX21heF9zaXplOworCV9fdTMyIHNfem9uZXM7CisJX191MTYgc19tYWdpYzsKKwlfX3UxNiBzX3BhZDI7CisJX191MTYgc19ibG9ja3NpemU7CisJX191OCAgc19kaXNrX3ZlcnNpb247Cit9OworCitzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKKwlfX3UxNiBpbm9kZTsKKwljaGFyIG5hbWVbMF07Cit9OworCitzdHJ1Y3QgbWluaXgzX2Rpcl9lbnRyeSB7CisJX191MzIgaW5vZGU7CisJY2hhciBuYW1lWzBdOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbWFuLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmIzMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbWFuLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfTElOVVhfTU1BTl9ICisjZGVmaW5lIF9MSU5VWF9NTUFOX0gKKworI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisKKyNkZWZpbmUgTVJFTUFQX01BWU1PVkUJMQorI2RlZmluZSBNUkVNQVBfRklYRUQJMgorCisjZGVmaW5lIE9WRVJDT01NSVRfR1VFU1MJCTAKKyNkZWZpbmUgT1ZFUkNPTU1JVF9BTFdBWVMJCTEKKyNkZWZpbmUgT1ZFUkNPTU1JVF9ORVZFUgkJMgorCisjZW5kaWYgLyogX0xJTlVYX01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbXRpbWVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21tdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODRjYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tbXRpbWVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIEludGVsIE11bHRpbWVkaWEgVGltZXIgZGV2aWNlIGludGVyZmFjZQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCB0aGUgSUEtUEMgTXVsdGltZWRpYQorICogVGltZXJzIERyYWZ0IFNwZWNpZmljYXRpb24gKHJldi4gMC45NykgZnJvbSBJbnRlbC4gIE5vdGUgdGhhdCBzb21lCisgKiBoYXJkd2FyZSBtYXkgbm90IGJlIGFibGUgdG8gc2FmZWx5IGV4cG9ydCBpdHMgcmVnaXN0ZXJzIHRvIHVzZXJzcGFjZSwKKyAqIHNvIHRoZSBpb2N0bCBpbnRlcmZhY2Ugc2hvdWxkIHN1cHBvcnQgYWxsIG5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5LgorICoKKyAqIDExLzAxLzAxIC0gamJhcm5lcyAtIGluaXRpYWwgcmV2aXNpb24KKyAqIDkvMTAvMDQgLSBDaHJpc3RvcGggTGFtZXRlciAtIHJlbW92ZSBpbnRlcnJ1cHQgc3VwcG9ydAorICogOS8xNy8wNCAtIGpiYXJuZXMgLSByZW1vdmUgdGVzdCBwcm9ncmFtLCBtb3ZlIHNvbWUgI2RlZmluZXMgdG8gdGhlIGRyaXZlcgorICovCisKKyNpZm5kZWYgX0xJTlVYX01NVElNRVJfSAorI2RlZmluZSBfTElOVVhfTU1USU1FUl9ICisKKy8qCisgKiBCcmVha2Rvd24gb2YgdGhlIGlvY3RsJ3MgYXZhaWxhYmxlLiAgQW4gJ29wdGlvbmFsJyBuZXh0IHRvIHRoZSBjb21tYW5kCisgKiBpbmRpY2F0ZXMgdGhhdCBzdXBwb3J0aW5nIHRoaXMgY29tbWFuZCBpcyBvcHRpb25hbCwgd2hpbGUgJ3JlcXVpcmVkJworICogY29tbWFuZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiBjb25mb3JtYW5jZSBpcyBkZXNpcmVkLgorICoKKyAqIE1NVElNRVJfR0VUT0ZGU0VUIC0gb3B0aW9uYWwKKyAqICAgU2hvdWxkIHJldHVybiB0aGUgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHBhZ2Ugd2hlcmUgdGhlCisgKiAgIHJlZ2lzdGVycyBhcmUgbWFwcGVkKSBmb3IgdGhlIGNvdW50ZXIgaW4gcXVlc3Rpb24uCisgKgorICogTU1USU1FUl9HRVRSRVMgLSByZXF1aXJlZAorICogICBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2sgaW4gZmVtdG8gKDEwXi0xNSkgc2Vjb25kcworICoKKyAqIE1NVElNRVJfR0VURlJFUSAtIHJlcXVpcmVkCisgKiAgIEZyZXF1ZW5jeSBvZiB0aGUgY2xvY2sgaW4gSHoKKyAqCisgKiBNTVRJTUVSX0dFVEJJVFMgLSByZXF1aXJlZAorICogICBOdW1iZXIgb2YgYml0cyBpbiB0aGUgY2xvY2sncyBjb3VudGVyCisgKgorICogTU1USU1FUl9NTUFQQVZBSUwgLSByZXF1aXJlZAorICogICBSZXR1cm5zIG5vbnplcm8gaWYgdGhlIHJlZ2lzdGVycyBjYW4gYmUgbW1hcCdkIGludG8gdXNlcnNwYWNlLCAwIG90aGVyd2lzZQorICoKKyAqIE1NVElNRVJfR0VUQ09VTlRFUiAtIHJlcXVpcmVkCisgKiAgIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlIGNvdW50ZXIKKyAqLworI2RlZmluZSBNTVRJTUVSX0lPQ1RMX0JBU0UgJ20nCisKKyNkZWZpbmUgTU1USU1FUl9HRVRPRkZTRVQgX0lPKE1NVElNRVJfSU9DVExfQkFTRSwgMCkKKyNkZWZpbmUgTU1USU1FUl9HRVRSRVMgX0lPUihNTVRJTUVSX0lPQ1RMX0JBU0UsIDEsIHVuc2lnbmVkIGxvbmcpCisjZGVmaW5lIE1NVElNRVJfR0VURlJFUSBfSU9SKE1NVElNRVJfSU9DVExfQkFTRSwgMiwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgTU1USU1FUl9HRVRCSVRTIF9JTyhNTVRJTUVSX0lPQ1RMX0JBU0UsIDQpCisjZGVmaW5lIE1NVElNRVJfTU1BUEFWQUlMIF9JTyhNTVRJTUVSX0lPQ1RMX0JBU0UsIDYpCisjZGVmaW5lIE1NVElNRVJfR0VUQ09VTlRFUiBfSU9SKE1NVElNRVJfSU9DVExfQkFTRSwgOSwgdW5zaWduZWQgbG9uZykKKworI2VuZGlmIC8qIF9MSU5VWF9NTVRJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXF1ZXVlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNWE3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21xdWV1ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMyBLcnp5c3p0b2YgQmVuZWR5Y3phayAmIE1pY2hhbCBXcm9uc2tpCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEl0IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9MSU5VWF9NUVVFVUVfSAorI2RlZmluZSBfTElOVVhfTVFVRVVFX0gKKworI2RlZmluZSBNUV9QUklPX01BWCAJMzI3NjgKKy8qIHBlci11aWQgbGltaXQgb2Yga2VybmVsIG1lbW9yeSB1c2VkIGJ5IG1xdWV1ZSwgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgTVFfQllURVNfTUFYCTgxOTIwMAorCitzdHJ1Y3QgbXFfYXR0ciB7CisJbG9uZwltcV9mbGFnczsJLyogbWVzc2FnZSBxdWV1ZSBmbGFncwkJCSovCisJbG9uZwltcV9tYXhtc2c7CS8qIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzCQkqLworCWxvbmcJbXFfbXNnc2l6ZTsJLyogbWF4aW11bSBtZXNzYWdlIHNpemUJCQkqLworCWxvbmcJbXFfY3VybXNnczsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBxdWV1ZWQJKi8KKwlsb25nCV9fcmVzZXJ2ZWRbNF07CS8qIGlnbm9yZWQgZm9yIGlucHV0LCB6ZXJvZWQgZm9yIG91dHB1dCAqLworfTsKKworLyoKKyAqIFNJR0VWX1RIUkVBRCBpbXBsZW1lbnRhdGlvbjoKKyAqIFNJR0VWX1RIUkVBRCBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgc3BhY2UuIElmIFNJR0VWX1RIUkVBRCBpcyBwYXNzZWQKKyAqIHRvIG1xX25vdGlmeSwgdGhlbgorICogLSBzaWdldl9zaWdubyBtdXN0IGJlIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gQUZfTkVUTElOSyBzb2NrZXQuIEl0J3Mgbm90CisgKiAgIG5lY2Vzc2FyeSB0aGF0IHRoZSBzb2NrZXQgaXMgYm91bmQuCisgKiAtIHNpZ2V2X3ZhbHVlLnNpdmFsX3B0ciBtdXN0IHBvaW50IHRvIGEgY29va2llIHRoYXQgaXMgTk9USUZZX0NPT0tJRV9MRU4KKyAqICAgYnl0ZXMgbG9uZy4KKyAqIElmIHRoZSBub3RpZmljYXRpb24gaXMgdHJpZ2dlcmVkLCB0aGVuIHRoZSBjb29raWUgaXMgc2VudCB0byB0aGUgbmV0bGluaworICogc29ja2V0LiBUaGUgbGFzdCBieXRlIG9mIHRoZSBjb29raWUgaXMgcmVwbGFjZWQgd2l0aCB0aGUgTk9USUZZXz8/IGNvZGVzOgorICogTk9USUZZX1dPS0VOVVAgaWYgdGhlIG5vdGlmaWNhdGlvbiBnb3QgdHJpZ2dlcmVkLCBOT1RJRllfUkVNT1ZFRCBpZiBpdCB3YXMKKyAqIHJlbW92ZWQsIGVpdGhlciBkdWUgdG8gYSBjbG9zZSgpIG9uIHRoZSBtZXNzYWdlIHF1ZXVlIGZkIG9yIGR1ZSB0byBhCisgKiBtcV9ub3RpZnkoKSB0aGF0IHJlbW92ZWQgdGhlIG5vdGlmaWNhdGlvbi4KKyAqLworI2RlZmluZSBOT1RJRllfTk9ORQkwCisjZGVmaW5lIE5PVElGWV9XT0tFTlVQCTEKKyNkZWZpbmUgTk9USUZZX1JFTU9WRUQJMgorCisjZGVmaW5lIE5PVElGWV9DT09LSUVfTEVOCTMyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tcm91dGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1MGRhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKQEAgLTAsMCArMSwxNDEgQEAKKyNpZm5kZWYgX19MSU5VWF9NUk9VVEVfSAorI2RlZmluZSBfX0xJTlVYX01ST1VURV9ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKworLyoKKyAqCUJhc2VkIG9uIHRoZSBNUk9VVElORyAzLjUgZGVmaW5lcyBwcmltYXJpbHkgdG8ga2VlcAorICoJc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBCU0QuCisgKgorICoJU2VlIHRoZSBtcm91dGVkIGNvZGUgZm9yIHRoZSBvcmlnaW5hbCBoaXN0b3J5LgorICoKKyAqICAgICAgUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0IChQSU0pIGRhdGEgc3RydWN0dXJlcyBpbmNsdWRlZAorICogICAgICBDYXJsb3MgUGljb3RvIChjYXBAZGkuZmMudWwucHQpCisgKgorICovCisKKyNkZWZpbmUgTVJUX0JBU0UJMjAwCisjZGVmaW5lIE1SVF9JTklUCShNUlRfQkFTRSkJLyogQWN0aXZhdGUgdGhlIGtlcm5lbCBtcm91dGUgY29kZSAJKi8KKyNkZWZpbmUgTVJUX0RPTkUJKE1SVF9CQVNFKzEpCS8qIFNodXRkb3duIHRoZSBrZXJuZWwgbXJvdXRlCQkqLworI2RlZmluZSBNUlRfQUREX1ZJRgkoTVJUX0JBU0UrMikJLyogQWRkIGEgdmlydHVhbCBpbnRlcmZhY2UJCSovCisjZGVmaW5lIE1SVF9ERUxfVklGCShNUlRfQkFTRSszKQkvKiBEZWxldGUgYSB2aXJ0dWFsIGludGVyZmFjZQkJKi8KKyNkZWZpbmUgTVJUX0FERF9NRkMJKE1SVF9CQVNFKzQpCS8qIEFkZCBhIG11bHRpY2FzdCBmb3J3YXJkaW5nIGVudHJ5CSovCisjZGVmaW5lIE1SVF9ERUxfTUZDCShNUlRfQkFTRSs1KQkvKiBEZWxldGUgYSBtdWx0aWNhc3QgZm9yd2FyZGluZyBlbnRyeQkqLworI2RlZmluZSBNUlRfVkVSU0lPTgkoTVJUX0JBU0UrNikJLyogR2V0IHRoZSBrZXJuZWwgbXVsdGljYXN0IHZlcnNpb24JKi8KKyNkZWZpbmUgTVJUX0FTU0VSVAkoTVJUX0JBU0UrNykJLyogQWN0aXZhdGUgUElNIGFzc2VydCBtb2RlCQkqLworI2RlZmluZSBNUlRfUElNCQkoTVJUX0JBU0UrOCkJLyogZW5hYmxlIFBJTSBjb2RlCSovCisKKyNkZWZpbmUgU0lPQ0dFVFZJRkNOVAlTSU9DUFJPVE9QUklWQVRFCS8qIElQIHByb3RvY29sIHByaXZhdGVzICovCisjZGVmaW5lIFNJT0NHRVRTR0NOVAkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZSBTSU9DR0VUUlBGCShTSU9DUFJPVE9QUklWQVRFKzIpCisKKyNkZWZpbmUgTUFYVklGUwkJMzIJCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdmlmYml0bWFwX3Q7CS8qIFVzZXIgbW9kZSBjb2RlIGRlcGVuZHMgb24gdGhpcyBsb3QgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdmlmaV90OworI2RlZmluZSBBTExfVklGUwkoKHZpZmlfdCkoLTEpKQorCisvKgorICoJU2FtZSBpZGVhIGFzIHNlbGVjdAorICovCisgCisjZGVmaW5lIFZJRk1fU0VUKG4sbSkJKChtKXw9KDE8PChuKSkpCisjZGVmaW5lIFZJRk1fQ0xSKG4sbSkJKChtKSY9figxPDwobikpKQorI2RlZmluZSBWSUZNX0lTU0VUKG4sbSkJKChtKSYoMTw8KG4pKSkKKyNkZWZpbmUgVklGTV9DTFJBTEwobSkJKChtKT0wKQorI2RlZmluZSBWSUZNX0NPUFkobWZyb20sbXRvKQkoKG10byk9KG1mcm9tKSkKKyNkZWZpbmUgVklGTV9TQU1FKG0xLG0yKQkoKG0xKT09KG0yKSkKKworLyoKKyAqCVBhc3NlZCBieSBtcm91dGVkIGZvciBhbiBNUlRfQUREX1ZJRiAtIGFnYWluIHdlIHVzZSB0aGUKKyAqCW1yb3V0ZWQgMy42IHN0cnVjdHVyZXMgZm9yIGNvbXBhdGliaWxpdHkKKyAqLworIAorc3RydWN0IHZpZmN0bCB7CisJdmlmaV90CXZpZmNfdmlmaTsJCS8qIEluZGV4IG9mIFZJRiAqLworCXVuc2lnbmVkIGNoYXIgdmlmY19mbGFnczsJLyogVklGRl8gZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIHZpZmNfdGhyZXNob2xkOwkvKiB0dGwgbGltaXQgKi8KKwl1bnNpZ25lZCBpbnQgdmlmY19yYXRlX2xpbWl0OwkvKiBSYXRlIGxpbWl0ZXIgdmFsdWVzIChOSSkgKi8KKwlzdHJ1Y3QgaW5fYWRkciB2aWZjX2xjbF9hZGRyOwkvKiBPdXIgYWRkcmVzcyAqLworCXN0cnVjdCBpbl9hZGRyIHZpZmNfcm10X2FkZHI7CS8qIElQSVAgdHVubmVsIGFkZHIgKi8KK307CisKKyNkZWZpbmUgVklGRl9UVU5ORUwJMHgxCS8qIElQSVAgdHVubmVsICovCisjZGVmaW5lIFZJRkZfU1JDUlQJMHgyCS8qIE5JICovCisjZGVmaW5lIFZJRkZfUkVHSVNURVIJMHg0CS8qIHJlZ2lzdGVyIHZpZgkqLworCisvKgorICoJQ2FjaGUgbWFuaXB1bGF0aW9uIHN0cnVjdHVyZXMgZm9yIG1yb3V0ZWQgYW5kIFBJTWQKKyAqLworIAorc3RydWN0IG1mY2N0bAoreworCXN0cnVjdCBpbl9hZGRyIG1mY2Nfb3JpZ2luOwkJLyogT3JpZ2luIG9mIG1jYXN0CSovCisJc3RydWN0IGluX2FkZHIgbWZjY19tY2FzdGdycDsJCS8qIEdyb3VwIGluIHF1ZXN0aW9uCSovCisJdmlmaV90CW1mY2NfcGFyZW50OwkJCS8qIFdoZXJlIGl0IGFycml2ZWQJKi8KKwl1bnNpZ25lZCBjaGFyIG1mY2NfdHRsc1tNQVhWSUZTXTsJLyogV2hlcmUgaXQgaXMgZ29pbmcJKi8KKwl1bnNpZ25lZCBpbnQgbWZjY19wa3RfY250OwkJLyogcGt0IGNvdW50IGZvciBzcmMtZ3JwICovCisJdW5zaWduZWQgaW50IG1mY2NfYnl0ZV9jbnQ7CisJdW5zaWduZWQgaW50IG1mY2Nfd3JvbmdfaWY7CisJaW50CSAgICAgbWZjY19leHBpcmU7Cit9OworCisvKiAKKyAqCUdyb3VwIGNvdW50IHJldHJpZXZhbCBmb3IgbXJvdXRlZAorICovCisgCitzdHJ1Y3Qgc2lvY19zZ19yZXEKK3sKKwlzdHJ1Y3QgaW5fYWRkciBzcmM7CisJc3RydWN0IGluX2FkZHIgZ3JwOworCXVuc2lnbmVkIGxvbmcgcGt0Y250OworCXVuc2lnbmVkIGxvbmcgYnl0ZWNudDsKKwl1bnNpZ25lZCBsb25nIHdyb25nX2lmOworfTsKKworLyoKKyAqCVRvIGdldCB2aWYgcGFja2V0IGNvdW50cworICovCisKK3N0cnVjdCBzaW9jX3ZpZl9yZXEKK3sKKwl2aWZpX3QJdmlmaTsJCS8qIFdoaWNoIGlmYWNlICovCisJdW5zaWduZWQgbG9uZyBpY291bnQ7CS8qIEluIHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIG9jb3VudDsJLyogT3V0IHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIGlieXRlczsJLyogSW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIG9ieXRlczsJLyogT3V0IGJ5dGVzICovCit9OworCisvKgorICoJVGhpcyBpcyB0aGUgZm9ybWF0IHRoZSBtcm91dGUgZGFlbW9uIGV4cGVjdHMgdG8gc2VlIElHTVAgY29udHJvbAorICoJZGF0YS4gTWFnaWNhbGx5IGhhcHBlbnMgdG8gYmUgbGlrZSBhbiBJUCBwYWNrZXQgYXMgcGVyIHRoZSBvcmlnaW5hbAorICovCisgCitzdHJ1Y3QgaWdtcG1zZworeworCV9fdTMyIHVudXNlZDEsdW51c2VkMjsKKwl1bnNpZ25lZCBjaGFyIGltX21zZ3R5cGU7CQkvKiBXaGF0IGlzIHRoaXMgKi8KKwl1bnNpZ25lZCBjaGFyIGltX21iejsJCQkvKiBNdXN0IGJlIHplcm8gKi8KKwl1bnNpZ25lZCBjaGFyIGltX3ZpZjsJCQkvKiBJbnRlcmZhY2UgKHRoaXMgb3VnaHQgdG8gYmUgYSB2aWZpX3QhKSAqLworCXVuc2lnbmVkIGNoYXIgdW51c2VkMzsKKwlzdHJ1Y3QgaW5fYWRkciBpbV9zcmMsaW1fZHN0OworfTsKKworLyoKKyAqCVRoYXQncyBhbGwgdXNlcm1vZGUgZm9sa3MKKyAqLworCisKKworI2RlZmluZSBNRkNfQVNTRVJUX1RIUkVTSCAoMypIWikJCS8qIE1heGltYWwgZnJlcS4gb2YgYXNzZXJ0cyAqLworCisvKgorICoJUHNldWRvIG1lc3NhZ2VzIHVzZWQgYnkgbXJvdXRlZAorICovCisKKyNkZWZpbmUgSUdNUE1TR19OT0NBQ0hFCQkxCQkvKiBLZXJuIGNhY2hlIGZpbGwgcmVxdWVzdCB0byBtcm91dGVkICovCisjZGVmaW5lIElHTVBNU0dfV1JPTkdWSUYJMgkJLyogRm9yIFBJTSBhc3NlcnQgcHJvY2Vzc2luZyAodW51c2VkKSAqLworI2RlZmluZSBJR01QTVNHX1dIT0xFUEtUCTMJCS8qIEZvciBQSU0gUmVnaXN0ZXIgcHJvY2Vzc2luZyAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWVlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKQEAgLTAsMCArMSwxODIgQEAKKyNpZm5kZWYgX0xJTlVYX01TRE9TX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX01TRE9TX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qCisgKiBUaGUgTVMtRE9TIGZpbGVzeXN0ZW0gY29uc3RhbnRzL3N0cnVjdHVyZXMKKyAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2RlZmluZSBTRUNUT1JfU0laRQk1MTIJCS8qIHNlY3RvciBzaXplIChieXRlcykgKi8KKyNkZWZpbmUgU0VDVE9SX0JJVFMJOQkJLyogbG9nMihTRUNUT1JfU0laRSkgKi8KKyNkZWZpbmUgTVNET1NfRFBCCShNU0RPU19EUFMpCS8qIGRpciBlbnRyaWVzIHBlciBibG9jayAqLworI2RlZmluZSBNU0RPU19EUEJfQklUUwk0CQkvKiBsb2cyKE1TRE9TX0RQQikgKi8KKyNkZWZpbmUgTVNET1NfRFBTCShTRUNUT1JfU0laRSAvIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KSkKKyNkZWZpbmUgTVNET1NfRFBTX0JJVFMJNAkJLyogbG9nMihNU0RPU19EUFMpICovCisjZGVmaW5lIENGX0xFX1codikJbGUxNl90b19jcHUodikKKyNkZWZpbmUgQ0ZfTEVfTCh2KQlsZTMyX3RvX2NwdSh2KQorI2RlZmluZSBDVF9MRV9XKHYpCWNwdV90b19sZTE2KHYpCisjZGVmaW5lIENUX0xFX0wodikJY3B1X3RvX2xlMzIodikKKworCisjZGVmaW5lIE1TRE9TX1JPT1RfSU5PCTEJLyogPT0gTUlOSVhfUk9PVF9JTk8gKi8KKyNkZWZpbmUgTVNET1NfRElSX0JJVFMJNQkvKiBsb2cyKHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KSkgKi8KKworLyogZGlyZWN0b3J5IGxpbWl0ICovCisjZGVmaW5lIEZBVF9NQVhfRElSX0VOVFJJRVMJKDY1NTM2KQorI2RlZmluZSBGQVRfTUFYX0RJUl9TSVpFCShGQVRfTUFYX0RJUl9FTlRSSUVTIDw8IE1TRE9TX0RJUl9CSVRTKQorCisjZGVmaW5lIEFUVFJfTk9ORQkwCS8qIG5vIGF0dHJpYnV0ZSBiaXRzICovCisjZGVmaW5lIEFUVFJfUk8JCTEJLyogcmVhZC1vbmx5ICovCisjZGVmaW5lIEFUVFJfSElEREVOCTIJLyogaGlkZGVuICovCisjZGVmaW5lIEFUVFJfU1lTCTQJLyogc3lzdGVtICovCisjZGVmaW5lIEFUVFJfVk9MVU1FCTgJLyogdm9sdW1lIGxhYmVsICovCisjZGVmaW5lIEFUVFJfRElSCTE2CS8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBBVFRSX0FSQ0gJMzIJLyogYXJjaGl2ZWQgKi8KKworLyogYXR0cmlidXRlIGJpdHMgdGhhdCBhcmUgY29waWVkICJhcyBpcyIgKi8KKyNkZWZpbmUgQVRUUl9VTlVTRUQJKEFUVFJfVk9MVU1FIHwgQVRUUl9BUkNIIHwgQVRUUl9TWVMgfCBBVFRSX0hJRERFTikKKy8qIGJpdHMgdGhhdCBhcmUgdXNlZCBieSB0aGUgV2luZG93cyA5NS9XaW5kb3dzIE5UIGV4dGVuZGVkIEZBVCAqLworI2RlZmluZSBBVFRSX0VYVAkoQVRUUl9STyB8IEFUVFJfSElEREVOIHwgQVRUUl9TWVMgfCBBVFRSX1ZPTFVNRSkKKworI2RlZmluZSBDQVNFX0xPV0VSX0JBU0UJOAkvKiBiYXNlIGlzIGxvd2VyIGNhc2UgKi8KKyNkZWZpbmUgQ0FTRV9MT1dFUl9FWFQJMTYJLyogZXh0ZW5zaW9uIGlzIGxvd2VyIGNhc2UgKi8KKworI2RlZmluZSBERUxFVEVEX0ZMQUcJMHhlNQkvKiBtYXJrcyBmaWxlIGFzIGRlbGV0ZWQgd2hlbiBpbiBuYW1lWzBdICovCisjZGVmaW5lIElTX0ZSRUUobikJKCEqKG4pIHx8ICoobikgPT0gREVMRVRFRF9GTEFHKQorCisvKiB2YWxpZCBmaWxlIG1vZGUgYml0cyAqLworI2RlZmluZSBNU0RPU19WQUxJRF9NT0RFIChTX0lGUkVHIHwgU19JRkRJUiB8IFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKKy8qIENvbnZlcnQgYXR0cmlidXRlIGJpdHMgYW5kIGEgbWFzayB0byB0aGUgVU5JWCBtb2RlLiAqLworI2RlZmluZSBNU0RPU19NS01PREUoYSwgbSkgKG0gJiAoYSAmIEFUVFJfUk8gPyBTX0lSVUdPfFNfSVhVR08gOiBTX0lSV1hVR08pKQorCisjZGVmaW5lIE1TRE9TX05BTUUJMTEJLyogbWF4aW11bSBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBNU0RPU19MT05HTkFNRQkyNTYJLyogbWF4aW11bSBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBNU0RPU19TTE9UUwkyMQkvKiBtYXggIyBvZiBzbG90cyBmb3Igc2hvcnQgYW5kIGxvbmcgbmFtZXMgKi8KKyNkZWZpbmUgTVNET1NfRE9UCSIuICAgICAgICAgICIJLyogIi4iLCBwYWRkZWQgdG8gTVNET1NfTkFNRSBjaGFycyAqLworI2RlZmluZSBNU0RPU19ET1RET1QJIi4uICAgICAgICAgIgkvKiAiLi4iLCBwYWRkZWQgdG8gTVNET1NfTkFNRSBjaGFycyAqLworCisvKiBtZWRpYSBvZiBib290IHNlY3RvciAqLworI2RlZmluZSBGQVRfVkFMSURfTUVESUEoeCkJKCgweEY4IDw9ICh4KSAmJiAoeCkgPD0gMHhGRikgfHwgKHgpID09IDB4RjApCisjZGVmaW5lIEZBVF9GSVJTVF9FTlQocywgeCkJKChNU0RPU19TQihzKS0+ZmF0X2JpdHMgPT0gMzIgPyAweDBGRkZGRjAwIDogXAorCU1TRE9TX1NCKHMpLT5mYXRfYml0cyA9PSAxNiA/IDB4RkYwMCA6IDB4RjAwKSB8ICh4KSkKKworLyogc3RhcnQgb2YgZGF0YSBjbHVzdGVyJ3MgZW50cnkgKG51bWJlciBvZiByZXNlcnZlZCBjbHVzdGVycykgKi8KKyNkZWZpbmUgRkFUX1NUQVJUX0VOVAkyCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGNsdXN0ZXJzICovCisjZGVmaW5lIE1BWF9GQVQxMgkweEZGNAorI2RlZmluZSBNQVhfRkFUMTYJMHhGRkY0CisjZGVmaW5lIE1BWF9GQVQzMgkweDBGRkZGRkY2CisjZGVmaW5lIE1BWF9GQVQocykJKE1TRE9TX1NCKHMpLT5mYXRfYml0cyA9PSAzMiA/IE1BWF9GQVQzMiA6IFwKKwlNU0RPU19TQihzKS0+ZmF0X2JpdHMgPT0gMTYgPyBNQVhfRkFUMTYgOiBNQVhfRkFUMTIpCisKKy8qIGJhZCBjbHVzdGVyIG1hcmsgKi8KKyNkZWZpbmUgQkFEX0ZBVDEyCTB4RkY3CisjZGVmaW5lIEJBRF9GQVQxNgkweEZGRjcKKyNkZWZpbmUgQkFEX0ZBVDMyCTB4MEZGRkZGRjcKKworLyogc3RhbmRhcmQgRU9GICovCisjZGVmaW5lIEVPRl9GQVQxMgkweEZGRgorI2RlZmluZSBFT0ZfRkFUMTYJMHhGRkZGCisjZGVmaW5lIEVPRl9GQVQzMgkweDBGRkZGRkZGCisKKyNkZWZpbmUgRkFUX0VOVF9GUkVFCSgwKQorI2RlZmluZSBGQVRfRU5UX0JBRAkoQkFEX0ZBVDMyKQorI2RlZmluZSBGQVRfRU5UX0VPRgkoRU9GX0ZBVDMyKQorCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMQkweDQxNjE1MjUyCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMgkweDYxNDE3MjcyCisjZGVmaW5lIElTX0ZTSU5GTyh4KQkobGUzMl90b19jcHUoKHgpLT5zaWduYXR1cmUxKSA9PSBGQVRfRlNJTkZPX1NJRzEgXAorCQkJICYmIGxlMzJfdG9fY3B1KCh4KS0+c2lnbmF0dXJlMikgPT0gRkFUX0ZTSU5GT19TSUcyKQorCisvKgorICogaW9jdGwgY29tbWFuZHMKKyAqLworI2RlZmluZSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USAkJX0lPUigncicsIDEsIHN0cnVjdCBkaXJlbnQgWzJdKQorI2RlZmluZSBWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQJX0lPUigncicsIDIsIHN0cnVjdCBkaXJlbnQgWzJdKQorLyogPGxpbnV4L3ZpZGVvdGV4dC5oPiBoYXMgdXNlZCAweDcyICgncicpIGluIGNvbGxpc2lvbiwgc28gc2tpcCBhIGZldyAqLworI2RlZmluZSBGQVRfSU9DVExfR0VUX0FUVFJJQlVURVMJX0lPUigncicsIDB4MTAsIF9fdTMyKQorI2RlZmluZSBGQVRfSU9DVExfU0VUX0FUVFJJQlVURVMJX0lPVygncicsIDB4MTEsIF9fdTMyKQorCisvKgorICogdmZhdCBzaG9ydG5hbWUgZmxhZ3MKKyAqLworI2RlZmluZSBWRkFUX1NGTl9ESVNQTEFZX0xPV0VSCTB4MDAwMSAvKiBjb252ZXJ0IHRvIGxvd2VyY2FzZSBmb3IgZGlzcGxheSAqLworI2RlZmluZSBWRkFUX1NGTl9ESVNQTEFZX1dJTjk1CTB4MDAwMiAvKiBlbXVsYXRlIHdpbjk1IHJ1bGUgZm9yIGRpc3BsYXkgKi8KKyNkZWZpbmUgVkZBVF9TRk5fRElTUExBWV9XSU5OVAkweDAwMDQgLyogZW11bGF0ZSB3aW5udCBydWxlIGZvciBkaXNwbGF5ICovCisjZGVmaW5lIFZGQVRfU0ZOX0NSRUFURV9XSU45NQkweDAxMDAgLyogZW11bGF0ZSB3aW45NSBydWxlIGZvciBjcmVhdGUgKi8KKyNkZWZpbmUgVkZBVF9TRk5fQ1JFQVRFX1dJTk5UCTB4MDIwMCAvKiBlbXVsYXRlIHdpbm50IHJ1bGUgZm9yIGNyZWF0ZSAqLworCitzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yIHsKKwlfX3U4CWlnbm9yZWRbM107CS8qIEJvb3Qgc3RyYXAgc2hvcnQgb3IgbmVhciBqdW1wICovCisJX191OAlzeXN0ZW1faWRbOF07CS8qIE5hbWUgLSBjYW4gYmUgdXNlZCB0byBzcGVjaWFsIGNhc2UKKwkJCQkgICBwYXJ0aXRpb24gbWFuYWdlciB2b2x1bWVzICovCisJX191OAlzZWN0b3Jfc2l6ZVsyXTsJLyogYnl0ZXMgcGVyIGxvZ2ljYWwgc2VjdG9yICovCisJX191OAlzZWNfcGVyX2NsdXM7CS8qIHNlY3RvcnMvY2x1c3RlciAqLworCV9fbGUxNglyZXNlcnZlZDsJLyogcmVzZXJ2ZWQgc2VjdG9ycyAqLworCV9fdTgJZmF0czsJCS8qIG51bWJlciBvZiBGQVRzICovCisJX191OAlkaXJfZW50cmllc1syXTsJLyogcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCV9fdTgJc2VjdG9yc1syXTsJLyogbnVtYmVyIG9mIHNlY3RvcnMgKi8KKwlfX3U4CW1lZGlhOwkJLyogbWVkaWEgY29kZSAqLworCV9fbGUxNglmYXRfbGVuZ3RoOwkvKiBzZWN0b3JzL0ZBVCAqLworCV9fbGUxNglzZWNzX3RyYWNrOwkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCV9fbGUxNgloZWFkczsJCS8qIG51bWJlciBvZiBoZWFkcyAqLworCV9fbGUzMgloaWRkZW47CQkvKiBoaWRkZW4gc2VjdG9ycyAodW51c2VkKSAqLworCV9fbGUzMgl0b3RhbF9zZWN0OwkvKiBudW1iZXIgb2Ygc2VjdG9ycyAoaWYgc2VjdG9ycyA9PSAwKSAqLworCisJLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBieSBGQVQzMiAqLworCV9fbGUzMglmYXQzMl9sZW5ndGg7CS8qIHNlY3RvcnMvRkFUICovCisJX19sZTE2CWZsYWdzOwkJLyogYml0IDg6IGZhdCBtaXJyb3JpbmcsIGxvdyA0OiBhY3RpdmUgZmF0ICovCisJX191OAl2ZXJzaW9uWzJdOwkvKiBtYWpvciwgbWlub3IgZmlsZXN5c3RlbSB2ZXJzaW9uICovCisJX19sZTMyCXJvb3RfY2x1c3RlcjsJLyogZmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLworCV9fbGUxNglpbmZvX3NlY3RvcjsJLyogZmlsZXN5c3RlbSBpbmZvIHNlY3RvciAqLworCV9fbGUxNgliYWNrdXBfYm9vdDsJLyogYmFja3VwIGJvb3Qgc2VjdG9yICovCisJX19sZTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCit9OworCitzdHJ1Y3QgZmF0X2Jvb3RfZnNpbmZvIHsKKwlfX2xlMzIgICBzaWduYXR1cmUxOwkvKiAweDQxNjE1MjUyTCAqLworCV9fbGUzMiAgIHJlc2VydmVkMVsxMjBdOwkvKiBOb3RoaW5nIGFzIGZhciBhcyBJIGNhbiB0ZWxsICovCisJX19sZTMyICAgc2lnbmF0dXJlMjsJLyogMHg2MTQxNzI3MkwgKi8KKwlfX2xlMzIgICBmcmVlX2NsdXN0ZXJzOwkvKiBGcmVlIGNsdXN0ZXIgY291bnQuICAtMSBpZiB1bmtub3duICovCisJX19sZTMyICAgbmV4dF9jbHVzdGVyOwkvKiBNb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBjbHVzdGVyICovCisJX19sZTMyICAgcmVzZXJ2ZWQyWzRdOworfTsKKworc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSB7CisJX191OAluYW1lW01TRE9TX05BTUVdOy8qIG5hbWUgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJYXR0cjsJCS8qIGF0dHJpYnV0ZSBiaXRzICovCisJX191OCAgICBsY2FzZTsJCS8qIENhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLworCV9fdTgJY3RpbWVfY3M7CS8qIENyZWF0aW9uIHRpbWUsIGNlbnRpc2Vjb25kcyAoMC0xOTkpICovCisJX19sZTE2CWN0aW1lOwkJLyogQ3JlYXRpb24gdGltZSAqLworCV9fbGUxNgljZGF0ZTsJCS8qIENyZWF0aW9uIGRhdGUgKi8KKwlfX2xlMTYJYWRhdGU7CQkvKiBMYXN0IGFjY2VzcyBkYXRlICovCisJX19sZTE2CXN0YXJ0aGk7CS8qIEhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCisJX19sZTE2CXRpbWUsZGF0ZSxzdGFydDsvKiB0aW1lLCBkYXRlIGFuZCBmaXJzdCBjbHVzdGVyICovCisJX19sZTMyCXNpemU7CQkvKiBmaWxlIHNpemUgKGluIGJ5dGVzKSAqLworfTsKKworLyogVXAgdG8gMTMgY2hhcmFjdGVycyBvZiB0aGUgbmFtZSAqLworc3RydWN0IG1zZG9zX2Rpcl9zbG90IHsKKwlfX3U4ICAgIGlkOwkJLyogc2VxdWVuY2UgbnVtYmVyIGZvciBzbG90ICovCisJX191OCAgICBuYW1lMF80WzEwXTsJLyogZmlyc3QgNSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKwlfX3U4ICAgIGF0dHI7CQkvKiBhdHRyaWJ1dGUgYnl0ZSAqLworCV9fdTggICAgcmVzZXJ2ZWQ7CS8qIGFsd2F5cyAwICovCisJX191OCAgICBhbGlhc19jaGVja3N1bTsJLyogY2hlY2tzdW0gZm9yIDguMyBhbGlhcyAqLworCV9fdTggICAgbmFtZTVfMTBbMTJdOwkvKiA2IG1vcmUgY2hhcmFjdGVycyBpbiBuYW1lICovCisJX19sZTE2ICAgc3RhcnQ7CQkvKiBzdGFydGluZyBjbHVzdGVyIG51bWJlciwgMCBpbiBsb25nIHNsb3RzICovCisJX191OCAgICBuYW1lMTFfMTJbNF07CS8qIGxhc3QgMiBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KK307CisKK3N0cnVjdCBmYXRfc2xvdF9pbmZvIHsKKwlsb2ZmX3QgaV9wb3M7CQkvKiBvbi1kaXNrIHBvc2l0aW9uIG9mIGRpcmVjdG9yeSBlbnRyeSAqLworCWxvZmZfdCBzbG90X29mZjsJLyogb2Zmc2V0IGZvciBzbG90IG9yIGRlIHN0YXJ0ICovCisJaW50IG5yX3Nsb3RzOwkJLyogbnVtYmVyIG9mIHNsb3RzICsgMShkZSkgaW4gZmlsZW5hbWUgKi8KKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbXNnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDdkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L21zZy5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX0xJTlVYX01TR19ICisjZGVmaW5lIF9MSU5VWF9NU0dfSAorCisjaW5jbHVkZSA8bGludXgvaXBjLmg+CisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjZGVmaW5lIE1TR19TVEFUIDExCisjZGVmaW5lIE1TR19JTkZPIDEyCisKKy8qIG1zZ3JjdiBvcHRpb25zICovCisjZGVmaW5lIE1TR19OT0VSUk9SICAgICAwMTAwMDAgIC8qIG5vIGVycm9yIGlmIG1lc3NhZ2UgaXMgdG9vIGJpZyAqLworI2RlZmluZSBNU0dfRVhDRVBUICAgICAgMDIwMDAwICAvKiByZWN2IGFueSBtc2cgZXhjZXB0IG9mIHNwZWNpZmllZCB0eXBlLiovCisKKy8qIE9ic29sZXRlLCB1c2VkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBsaWJjNSBjb21waWxlcyAqLworc3RydWN0IG1zcWlkX2RzIHsKKwlzdHJ1Y3QgaXBjX3Blcm0gbXNnX3Blcm07CisJc3RydWN0IG1zZyAqbXNnX2ZpcnN0OwkJLyogZmlyc3QgbWVzc2FnZSBvbiBxdWV1ZSx1bnVzZWQgICovCisJc3RydWN0IG1zZyAqbXNnX2xhc3Q7CQkvKiBsYXN0IG1lc3NhZ2UgaW4gcXVldWUsdW51c2VkICovCisJX19rZXJuZWxfdGltZV90IG1zZ19zdGltZTsJLyogbGFzdCBtc2dzbmQgdGltZSAqLworCV9fa2VybmVsX3RpbWVfdCBtc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KKwlfX2tlcm5lbF90aW1lX3QgbXNnX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgbG9uZyAgbXNnX2xjYnl0ZXM7CS8qIFJldXNlIGp1bmsgZmllbGRzIGZvciAzMiBiaXQgKi8KKwl1bnNpZ25lZCBsb25nICBtc2dfbHFieXRlczsJLyogZGl0dG8gKi8KKwl1bnNpZ25lZCBzaG9ydCBtc2dfY2J5dGVzOwkvKiBjdXJyZW50IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCXVuc2lnbmVkIHNob3J0IG1zZ19xbnVtOwkvKiBudW1iZXIgb2YgbWVzc2FnZXMgaW4gcXVldWUgKi8KKwl1bnNpZ25lZCBzaG9ydCBtc2dfcWJ5dGVzOwkvKiBtYXggbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisJX19rZXJuZWxfaXBjX3BpZF90IG1zZ19sc3BpZDsJLyogcGlkIG9mIGxhc3QgbXNnc25kICovCisJX19rZXJuZWxfaXBjX3BpZF90IG1zZ19scnBpZDsJLyogbGFzdCByZWNlaXZlIHBpZCAqLworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBtc3FpZDY0X2RzICovCisjaW5jbHVkZSA8YXNtL21zZ2J1Zi5oPgorCisvKiBtZXNzYWdlIGJ1ZmZlciBmb3IgbXNnc25kIGFuZCBtc2dyY3YgY2FsbHMgKi8KK3N0cnVjdCBtc2didWYgeworCWxvbmcgbXR5cGU7ICAgICAgICAgLyogdHlwZSBvZiBtZXNzYWdlICovCisJY2hhciBtdGV4dFsxXTsgICAgICAvKiBtZXNzYWdlIHRleHQgKi8KK307CisKKy8qIGJ1ZmZlciBmb3IgbXNnY3RsIGNhbGxzIElQQ19JTkZPLCBNU0dfSU5GTyAqLworc3RydWN0IG1zZ2luZm8geworCWludCBtc2dwb29sOworCWludCBtc2dtYXA7IAorCWludCBtc2dtYXg7IAorCWludCBtc2dtbmI7IAorCWludCBtc2dtbmk7IAorCWludCBtc2dzc3o7IAorCWludCBtc2d0cWw7IAorCXVuc2lnbmVkIHNob3J0ICBtc2dzZWc7IAorfTsKKworI2RlZmluZSBNU0dNTkkgICAgMTYgICAvKiA8PSBJUENNTkkgKi8gICAgIC8qIG1heCAjIG9mIG1zZyBxdWV1ZSBpZGVudGlmaWVycyAqLworI2RlZmluZSBNU0dNQVggIDgxOTIgICAvKiA8PSBJTlRfTUFYICovICAgLyogbWF4IHNpemUgb2YgbWVzc2FnZSAoYnl0ZXMpICovCisjZGVmaW5lIE1TR01OQiAxNjM4NCAgIC8qIDw9IElOVF9NQVggKi8gICAvKiBkZWZhdWx0IG1heCBzaXplIG9mIGEgbWVzc2FnZSBxdWV1ZSAqLworCisvKiB1bnVzZWQgKi8KKyNkZWZpbmUgTVNHUE9PTCAoTVNHTU5JKk1TR01OQi8xMDI0KSAgLyogc2l6ZSBpbiBraWxvYnl0ZXMgb2YgbWVzc2FnZSBwb29sICovCisjZGVmaW5lIE1TR1RRTCAgTVNHTU5CICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN5c3RlbSBtZXNzYWdlIGhlYWRlcnMgKi8KKyNkZWZpbmUgTVNHTUFQICBNU0dNTkIgICAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBtZXNzYWdlIG1hcCAqLworI2RlZmluZSBNU0dTU1ogIDE2ICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2Ugc2VnbWVudCBzaXplICovCisjZGVmaW5lIF9fTVNHU0VHICgoTVNHUE9PTCoxMDI0KS8gTVNHU1NaKSAvKiBtYXggbm8uIG9mIHNlZ21lbnRzICovCisjZGVmaW5lIE1TR1NFRyAoX19NU0dTRUcgPD0gMHhmZmZmID8gX19NU0dTRUcgOiAweGZmZmYpCisKKworI2VuZGlmIC8qIF9MSU5VWF9NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tdGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L210aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhkMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9tdGlvLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8qIAorICogbGludXgvbXRpby5oIGhlYWRlciBmaWxlIGZvciBMaW51eC4gV3JpdHRlbiBieSBILiBCZXJnbWFuCisgKgorICogTW9kaWZpZWQgZm9yIHNwZWNpYWwgaW9jdGxzIHByb3ZpZGVkIGJ5IHpmdGFwZSBpbiBTZXB0ZW1iZXIgMTk5NworICogYnkgQy4tSi4gSGVpbmUuCisgKi8KKworI2lmbmRlZiBfTElOVVhfTVRJT19ICisjZGVmaW5lIF9MSU5VWF9NVElPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyoKKyAqIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciBtYWcgdGFwZSBpbyBjb250cm9sIGNvbW1hbmRzCisgKi8KKworLyogc3RydWN0dXJlIGZvciBNVElPQ1RPUCAtIG1hZyB0YXBlIG9wIGNvbW1hbmQgKi8KK3N0cnVjdAltdG9wIHsKKwlzaG9ydAltdF9vcDsJCS8qIG9wZXJhdGlvbnMgZGVmaW5lZCBiZWxvdyAqLworCWludAltdF9jb3VudDsJLyogaG93IG1hbnkgb2YgdGhlbSAqLworfTsKKworLyogTWFnbmV0aWMgVGFwZSBvcGVyYXRpb25zIFtOb3QgYWxsIG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzXTogKi8KKyNkZWZpbmUgTVRSRVNFVCAwCS8qICtyZXNldCBkcml2ZSBpbiBjYXNlIG9mIHByb2JsZW1zICovCisjZGVmaW5lIE1URlNGCTEJLyogZm9yd2FyZCBzcGFjZSBvdmVyIEZpbGVNYXJrLAorCQkJICogcG9zaXRpb24gYXQgZmlyc3QgcmVjb3JkIG9mIG5leHQgZmlsZSAKKwkJCSAqLworI2RlZmluZSBNVEJTRgkyCS8qIGJhY2t3YXJkIHNwYWNlIEZpbGVNYXJrIChwb3NpdGlvbiBiZWZvcmUgRk0pICovCisjZGVmaW5lIE1URlNSCTMJLyogZm9yd2FyZCBzcGFjZSByZWNvcmQgKi8KKyNkZWZpbmUgTVRCU1IJNAkvKiBiYWNrd2FyZCBzcGFjZSByZWNvcmQgKi8KKyNkZWZpbmUgTVRXRU9GCTUJLyogd3JpdGUgYW4gZW5kLW9mLWZpbGUgcmVjb3JkIChtYXJrKSAqLworI2RlZmluZSBNVFJFVwk2CS8qIHJld2luZCAqLworI2RlZmluZSBNVE9GRkwJNwkvKiByZXdpbmQgYW5kIHB1dCB0aGUgZHJpdmUgb2ZmbGluZSAoZWplY3Q/KSAqLworI2RlZmluZSBNVE5PUAk4CS8qIG5vIG9wLCBzZXQgc3RhdHVzIG9ubHkgKHJlYWQgd2l0aCBNVElPQ0dFVCkgKi8KKyNkZWZpbmUgTVRSRVRFTiA5CS8qIHJldGVuc2lvbiB0YXBlICovCisjZGVmaW5lIE1UQlNGTQkxMAkvKiArYmFja3dhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNICovCisjZGVmaW5lIE1URlNGTSAgMTEJLyogK2ZvcndhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNICovCisjZGVmaW5lIE1URU9NCTEyCS8qIGdvdG8gZW5kIG9mIHJlY29yZGVkIG1lZGlhIChmb3IgYXBwZW5kaW5nIGZpbGVzKS4KKwkJCSAqIE1URU9NIHBvc2l0aW9ucyBhZnRlciB0aGUgbGFzdCBGTSwgcmVhZHkgZm9yCisJCQkgKiBhcHBlbmRpbmcgYW5vdGhlciBmaWxlLgorCQkJICovCisjZGVmaW5lIE1URVJBU0UgMTMJLyogZXJhc2UgdGFwZSAtLSBiZSBjYXJlZnVsISAqLworCisjZGVmaW5lIE1UUkFTMSAgMTQJLyogcnVuIHNlbGYgdGVzdCAxIChub25kZXN0cnVjdGl2ZSkgKi8KKyNkZWZpbmUgTVRSQVMyCTE1CS8qIHJ1biBzZWxmIHRlc3QgMiAoZGVzdHJ1Y3RpdmUpICovCisjZGVmaW5lIE1UUkFTMyAgMTYJLyogcmVzZXJ2ZWQgZm9yIHNlbGYgdGVzdCAzICovCisKKyNkZWZpbmUgTVRTRVRCTEsgMjAJLyogc2V0IGJsb2NrIGxlbmd0aCAoU0NTSSkgKi8KKyNkZWZpbmUgTVRTRVRERU5TSVRZIDIxCS8qIHNldCB0YXBlIGRlbnNpdHkgKFNDU0kpICovCisjZGVmaW5lIE1UU0VFSwkyMgkvKiBzZWVrIHRvIGJsb2NrIChUYW5kYmVyZywgZXRjLikgKi8KKyNkZWZpbmUgTVRURUxMCTIzCS8qIHRlbGwgYmxvY2sgKFRhbmRiZXJnLCBldGMuKSAqLworI2RlZmluZSBNVFNFVERSVkJVRkZFUiAyNCAvKiBzZXQgdGhlIGRyaXZlIGJ1ZmZlcmluZyBhY2NvcmRpbmcgdG8gU0NTSS0yICovCisJCQkvKiBvcmRpbmFyeSBidWZmZXJlZCBvcGVyYXRpb24gd2l0aCBjb2RlIDEgKi8KKyNkZWZpbmUgTVRGU1MJMjUJLyogc3BhY2UgZm9yd2FyZCBvdmVyIHNldG1hcmtzICovCisjZGVmaW5lIE1UQlNTCTI2CS8qIHNwYWNlIGJhY2t3YXJkIG92ZXIgc2V0bWFya3MgKi8KKyNkZWZpbmUgTVRXU00JMjcJLyogd3JpdGUgc2V0bWFya3MgKi8KKworI2RlZmluZSBNVExPQ0sgIDI4CS8qIGxvY2sgdGhlIGRyaXZlIGRvb3IgKi8KKyNkZWZpbmUgTVRVTkxPQ0sgMjkJLyogdW5sb2NrIHRoZSBkcml2ZSBkb29yICovCisjZGVmaW5lIE1UTE9BRCAgMzAJLyogZXhlY3V0ZSB0aGUgU0NTSSBsb2FkIGNvbW1hbmQgKi8KKyNkZWZpbmUgTVRVTkxPQUQgMzEJLyogZXhlY3V0ZSB0aGUgU0NTSSB1bmxvYWQgY29tbWFuZCAqLworI2RlZmluZSBNVENPTVBSRVNTSU9OIDMyLyogY29udHJvbCBjb21wcmVzc2lvbiB3aXRoIFNDU0kgbW9kZSBwYWdlIDE1ICovCisjZGVmaW5lIE1UU0VUUEFSVCAzMwkvKiBDaGFuZ2UgdGhlIGFjdGl2ZSB0YXBlIHBhcnRpdGlvbiAqLworI2RlZmluZSBNVE1LUEFSVCAgMzQJLyogRm9ybWF0IHRoZSB0YXBlIHdpdGggb25lIG9yIHR3byBwYXJ0aXRpb25zICovCisKKy8qIHN0cnVjdHVyZSBmb3IgTVRJT0NHRVQgLSBtYWcgdGFwZSBnZXQgc3RhdHVzIGNvbW1hbmQgKi8KKworc3RydWN0CW10Z2V0IHsKKwlsb25nCW10X3R5cGU7CS8qIHR5cGUgb2YgbWFndGFwZSBkZXZpY2UgKi8KKwlsb25nCW10X3Jlc2lkOwkvKiByZXNpZHVhbCBjb3VudDogKG5vdCBzdXJlKQorCQkJCSAqCW51bWJlciBvZiBieXRlcyBpZ25vcmVkLCBvcgorCQkJCSAqCW51bWJlciBvZiBmaWxlcyBub3Qgc2tpcHBlZCwgb3IKKwkJCQkgKgludW1iZXIgb2YgcmVjb3JkcyBub3Qgc2tpcHBlZC4KKwkJCQkgKi8KKwkvKiB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgZGV2aWNlIGRlcGVuZGVudCAqLworCWxvbmcJbXRfZHNyZWc7CS8qIHN0YXR1cyByZWdpc3RlciAqLworCWxvbmcJbXRfZ3N0YXQ7CS8qIGdlbmVyaWMgKGRldmljZSBpbmRlcGVuZGVudCkgc3RhdHVzICovCisJbG9uZwltdF9lcnJlZzsJLyogZXJyb3IgcmVnaXN0ZXIgKi8KKwkvKiBUaGUgbmV4dCB0d28gZmllbGRzIGFyZSBub3QgYWx3YXlzIHVzZWQgKi8KKwlfX2tlcm5lbF9kYWRkcl90IG10X2ZpbGVubzsJLyogbnVtYmVyIG9mIGN1cnJlbnQgZmlsZSBvbiB0YXBlICovCisJX19rZXJuZWxfZGFkZHJfdCBtdF9ibGtubzsJLyogY3VycmVudCBibG9jayBudW1iZXIgKi8KK307CisKKworCisvKgorICogQ29uc3RhbnRzIGZvciBtdF90eXBlLiBOb3QgYWxsIG9mIHRoZXNlIGFyZSBzdXBwb3J0ZWQsCisgKiBhbmQgdGhlc2UgYXJlIG5vdCBhbGwgb2YgdGhlIG9uZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIE1UX0lTVU5LTk9XTgkJMHgwMQorI2RlZmluZSBNVF9JU1FJQzAyCQkweDAyCS8qIEdlbmVyaWMgUUlDLTAyIHRhcGUgc3RyZWFtZXIgKi8KKyNkZWZpbmUgTVRfSVNXVDUxNTAJCTB4MDMJLyogV2FuZ3RlayA1MTUwRVEsIFFJQy0xNTAsIFFJQy0wMiAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfNTk0NUwyCTB4MDQJLyogQXJjaGl2ZSA1OTQ1TC0yLCBRSUMtMjQsIFFJQy0wMj8gKi8KKyNkZWZpbmUgTVRfSVNDTVNKNTAwCQkweDA1CS8qIENNUyBKdW1ibyA1MDAgKFFJQy0wMj8pICovCisjZGVmaW5lIE1UX0lTVERDMzYxMAkJMHgwNgkvKiBUYW5kYmVyZyA2MzEwLCBRSUMtMjQgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFX1ZQNjBJCTB4MDcJLyogQXJjaGl2ZSBWUDYwaSwgUUlDLTAyICovCisjZGVmaW5lIE1UX0lTQVJDSElWRV8yMTUwTAkweDA4CS8qIEFyY2hpdmUgVmlwZXIgMjE1MEwgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzIwNjBMCTB4MDkJLyogQXJjaGl2ZSBWaXBlciAyMDYwTCAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVTQzQ5OQkweDBBCS8qIEFyY2hpdmUgU0MtNDk5IFFJQy0zNiBjb250cm9sbGVyICovCisjZGVmaW5lIE1UX0lTUUlDMDJfQUxMX0ZFQVRVUkVTCTB4MEYJLyogR2VuZXJpYyBRSUMtMDIgd2l0aCBhbGwgZmVhdHVyZXMgKi8KKyNkZWZpbmUgTVRfSVNXVDUwOTlFRU4yNAkweDExCS8qIFdhbmd0ZWsgNTA5OS1lZW4yNCwgNjBNQiwgUUlDLTI0ICovCisjZGVmaW5lIE1UX0lTVEVBQ19NVDJTVAkJMHgxMgkvKiBUZWFjIE1ULTJTVCAxNTVtYiBkcml2ZSwgVGVhYyBEQy0xIGNhcmQgKFdhbmd0ZWsgdHlwZSkgKi8KKyNkZWZpbmUgTVRfSVNFVkVSRVhfRlQ0MEEJMHgzMgkvKiBFdmVyZXggRlQ0MEEgKFFJQy00MCkgKi8KKyNkZWZpbmUgTVRfSVNERFMxCQkweDUxCS8qIEREUyBkZXZpY2Ugd2l0aG91dCBwYXJ0aXRpb25zICovCisjZGVmaW5lIE1UX0lTRERTMgkJMHg1MgkvKiBERFMgZGV2aWNlIHdpdGggcGFydGl0aW9ucyAqLworI2RlZmluZSBNVF9JU09OU1RSRUFNX1NDICAgICAgICAweDYxICAgLyogT25TdHJlYW0gU0NTSSB0YXBlIGRyaXZlcyAoU0MteDApCisJCQkJCSAgYW5kIFNDU0kgZW11bGF0ZWQgKERJLCBEUCwgVVNCKSAqLworI2RlZmluZSBNVF9JU1NDU0kxCQkweDcxCS8qIEdlbmVyaWMgQU5TSSBTQ1NJLTEgdGFwZSB1bml0ICovCisjZGVmaW5lIE1UX0lTU0NTSTIJCTB4NzIJLyogR2VuZXJpYyBBTlNJIFNDU0ktMiB0YXBlIHVuaXQgKi8KKworLyogUUlDLTQwLzgwLzMwMTAvMzAyMCBmdGFwZSBzdXBwb3J0ZWQgZHJpdmVzLgorICogMjBiaXQgdmVuZG9yIElEICsgMHg4MDAwMDAgKHNlZSBmdGFwZS12ZW5kb3JzLmgpCisgKi8KKyNkZWZpbmUgTVRfSVNGVEFQRV9VTktOT1dOCTB4ODAwMDAwIC8qIG9ic29sZXRlICovCisjZGVmaW5lIE1UX0lTRlRBUEVfRkxBRwkweDgwMDAwMAorCisKKy8qIHN0cnVjdHVyZSBmb3IgTVRJT0NQT1MgLSBtYWcgdGFwZSBnZXQgcG9zaXRpb24gY29tbWFuZCAqLworCitzdHJ1Y3QJbXRwb3MgeworCWxvbmcgCW10X2Jsa25vOwkvKiBjdXJyZW50IGJsb2NrIG51bWJlciAqLworfTsKKworCisvKiBtYWcgdGFwZSBpbyBjb250cm9sIGNvbW1hbmRzICovCisjZGVmaW5lCU1USU9DVE9QCV9JT1coJ20nLCAxLCBzdHJ1Y3QgbXRvcCkJLyogZG8gYSBtYWcgdGFwZSBvcCAqLworI2RlZmluZQlNVElPQ0dFVAlfSU9SKCdtJywgMiwgc3RydWN0IG10Z2V0KQkvKiBnZXQgdGFwZSBzdGF0dXMgKi8KKyNkZWZpbmUJTVRJT0NQT1MJX0lPUignbScsIDMsIHN0cnVjdCBtdHBvcykJLyogZ2V0IHRhcGUgcG9zaXRpb24gKi8KKworCisvKiBHZW5lcmljIE1hZyBUYXBlIChkZXZpY2UgaW5kZXBlbmRlbnQpIHN0YXR1cyBtYWNyb3MgZm9yIGV4YW1pbmluZworICogbXRfZ3N0YXQgLS0gSFAtVVggY29tcGF0aWJsZS4KKyAqIFRoZXJlIGlzIHJvb20gZm9yIG1vcmUgZ2VuZXJpYyBzdGF0dXMgYml0cyBoZXJlLCBidXQgSSBkb24ndAorICoga25vdyB3aGljaCBvZiB0aGVtIGFyZSByZXNlcnZlZC4gQXQgbGVhc3QgdGhyZWUgb3Igc28gc2hvdWxkCisgKiBiZSBhZGRlZCB0byBtYWtlIHRoaXMgcmVhbGx5IHVzZWZ1bC4KKyAqLworI2RlZmluZSBHTVRfRU9GKHgpICAgICAgICAgICAgICAoKHgpICYgMHg4MDAwMDAwMCkKKyNkZWZpbmUgR01UX0JPVCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4NDAwMDAwMDApCisjZGVmaW5lIEdNVF9FT1QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDIwMDAwMDAwKQorI2RlZmluZSBHTVRfU00oeCkgICAgICAgICAgICAgICAoKHgpICYgMHgxMDAwMDAwMCkgIC8qIEREUyBzZXRtYXJrICovCisjZGVmaW5lIEdNVF9FT0QoeCkgICAgICAgICAgICAgICgoeCkgJiAweDA4MDAwMDAwKSAgLyogRERTIEVPRCAqLworI2RlZmluZSBHTVRfV1JfUFJPVCh4KSAgICAgICAgICAoKHgpICYgMHgwNDAwMDAwMCkKKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDIwMDAwMDApICovCisjZGVmaW5lIEdNVF9PTkxJTkUoeCkgICAgICAgICAgICgoeCkgJiAweDAxMDAwMDAwKQorI2RlZmluZSBHTVRfRF82MjUwKHgpICAgICAgICAgICAoKHgpICYgMHgwMDgwMDAwMCkKKyNkZWZpbmUgR01UX0RfMTYwMCh4KSAgICAgICAgICAgKCh4KSAmIDB4MDA0MDAwMDApCisjZGVmaW5lIEdNVF9EXzgwMCh4KSAgICAgICAgICAgICgoeCkgJiAweDAwMjAwMDAwKQorLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDEwMDAwMCkgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwODAwMDApICovCisjZGVmaW5lIEdNVF9EUl9PUEVOKHgpICAgICAgICAgICgoeCkgJiAweDAwMDQwMDAwKSAgLyogZG9vciBvcGVuIChubyB0YXBlKSAqLworLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDAyMDAwMCkgKi8KKyNkZWZpbmUgR01UX0lNX1JFUF9FTih4KSAgICAgICAgKCh4KSAmIDB4MDAwMTAwMDApICAvKiBpbW1lZGlhdGUgcmVwb3J0IG1vZGUgKi8KKyNkZWZpbmUgR01UX0NMTih4KSAgICAgICAgICAgICAgKCh4KSAmIDB4MDAwMDgwMDApICAvKiBjbGVhbmluZyByZXF1ZXN0ZWQgKi8KKy8qIDE1IGdlbmVyaWMgc3RhdHVzIGJpdHMgdW51c2VkICovCisKKworLyogU0NTSS10YXBlIHNwZWNpZmljIGRlZmluaXRpb25zICovCisvKiBCaXRmaWVsZCBzaGlmdHMgaW4gdGhlIHN0YXR1cyAgKi8KKyNkZWZpbmUgTVRfU1RfQkxLU0laRV9TSElGVAkwCisjZGVmaW5lIE1UX1NUX0JMS1NJWkVfTUFTSwkweGZmZmZmZgorI2RlZmluZSBNVF9TVF9ERU5TSVRZX1NISUZUCTI0CisjZGVmaW5lIE1UX1NUX0RFTlNJVFlfTUFTSwkweGZmMDAwMDAwCisKKyNkZWZpbmUgTVRfU1RfU09GVEVSUl9TSElGVAkwCisjZGVmaW5lIE1UX1NUX1NPRlRFUlJfTUFTSwkweGZmZmYKKworLyogQml0ZmllbGRzIGZvciB0aGUgTVRTRVREUlZCVUZGRVIgaW9jdGwgKi8KKyNkZWZpbmUgTVRfU1RfT1BUSU9OUwkJMHhmMDAwMDAwMAorI2RlZmluZSBNVF9TVF9CT09MRUFOUwkJMHgxMDAwMDAwMAorI2RlZmluZSBNVF9TVF9TRVRCT09MRUFOUwkweDMwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0NMRUFSQk9PTEVBTlMJMHg0MDAwMDAwMAorI2RlZmluZSBNVF9TVF9XUklURV9USFJFU0hPTEQJMHgyMDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfQkxLU0laRQkweDUwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0RFRl9PUFRJT05TCTB4NjAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfVElNRU9VVFMJCTB4NzAwMDAwMDAKKyNkZWZpbmUgTVRfU1RfU0VUX1RJTUVPVVQJKE1UX1NUX1RJTUVPVVRTIHwgMHgwMDAwMDApCisjZGVmaW5lIE1UX1NUX1NFVF9MT05HX1RJTUVPVVQJKE1UX1NUX1RJTUVPVVRTIHwgMHgxMDAwMDApCisjZGVmaW5lIE1UX1NUX1NFVF9DTE4JCTB4ODAwMDAwMDAKKworI2RlZmluZSBNVF9TVF9CVUZGRVJfV1JJVEVTCTB4MQorI2RlZmluZSBNVF9TVF9BU1lOQ19XUklURVMJMHgyCisjZGVmaW5lIE1UX1NUX1JFQURfQUhFQUQJMHg0CisjZGVmaW5lIE1UX1NUX0RFQlVHR0lORwkJMHg4CisjZGVmaW5lIE1UX1NUX1RXT19GTQkJMHgxMAorI2RlZmluZSBNVF9TVF9GQVNUX01URU9NCTB4MjAKKyNkZWZpbmUgTVRfU1RfQVVUT19MT0NLCQkweDQwCisjZGVmaW5lIE1UX1NUX0RFRl9XUklURVMJMHg4MAorI2RlZmluZSBNVF9TVF9DQU5fQlNSCQkweDEwMAorI2RlZmluZSBNVF9TVF9OT19CTEtMSU1TCTB4MjAwCisjZGVmaW5lIE1UX1NUX0NBTl9QQVJUSVRJT05TICAgIDB4NDAwCisjZGVmaW5lIE1UX1NUX1NDU0kyTE9HSUNBTCAgICAgIDB4ODAwCisjZGVmaW5lIE1UX1NUX1NZU1YgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBNVF9TVF9OT1dBSVQgICAgICAgICAgICAweDIwMDAKKworLyogVGhlIG1vZGUgcGFyYW1ldGVycyB0byBiZSBjb250cm9sbGVkLiBQYXJhbWV0ZXIgY2hvc2VuIHdpdGggYml0cyAyMC0yOCAqLworI2RlZmluZSBNVF9TVF9DTEVBUl9ERUZBVUxUCTB4ZmZmZmYKKyNkZWZpbmUgTVRfU1RfREVGX0RFTlNJVFkJKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgxMDAwMDApCisjZGVmaW5lIE1UX1NUX0RFRl9DT01QUkVTU0lPTgkoTVRfU1RfREVGX09QVElPTlMgfCAweDIwMDAwMCkKKyNkZWZpbmUgTVRfU1RfREVGX0RSVkJVRkZFUgkoTVRfU1RfREVGX09QVElPTlMgfCAweDMwMDAwMCkKKworLyogVGhlIG9mZnNldCBmb3IgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHNwZWNpYWwgSFAgY2hhbmdlciBsb2FkIGNvbW1hbmQuICovCisjZGVmaW5lIE1UX1NUX0hQTE9BREVSX09GRlNFVCAxMDAwMAorCisjZW5kaWYgLyogX0xJTlVYX01USU9fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uX3IzOTY0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25fcjM5NjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzE2ODA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uX3IzOTY0LmgKQEAgLTAsMCArMSw5OSBAQAorLyogcjM5NjQgbGluZWRpc2NpcGxpbmUgZm9yIGxpbnV4CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCBieQorICogUGhpbGlwcyBBdXRvbWF0aW9uIFByb2plY3RzCisgKiBLYXNzZWwgKEdlcm1hbnkpCisgKiBodHRwOi8vd3d3LnBhcC1waGlsaXBzLmRlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBBdXRob3I6CisgKiBMLiBIYWFnCisgKgorICogJExvZzogcjM5NjQuaCx2ICQKKyAqIFJldmlzaW9uIDEuNCAgMjAwNS8xMi8yMSAxOTo1NDoyNCAgS3VydCBIdXdpZyA8a3VydCBodXdpZyBkZT4KKyAqIEZpeGVkIEhaIHVzYWdlIG9uIDIuNiBrZXJuZWxzCisgKiBSZW1vdmVkIHVubmVjZXNzYXJ5IGluY2x1ZGUKKyAqCisgKiBSZXZpc2lvbiAxLjMgIDIwMDEvMDMvMTggMTM6MDI6MjQgIGR3bXcyCisgKiBGaXggdGltZXIgdXNhZ2UsIHVzZSBzcGlubG9ja3MgcHJvcGVybHkuCisgKgorICogUmV2aXNpb24gMS4yICAyMDAxLzAzLzE4IDEyOjUzOjE1ICBkd213MgorICogTWVyZ2UgY2hhbmdlcyBpbiAyLjQuMgorICoKKyAqIFJldmlzaW9uIDEuMS4xLjEgIDE5OTgvMTAvMTMgMTY6NDM6MTQgIGR3bXcyCisgKiBUaGlzJ2xsIHNjcmV3IHRoZSB2ZXJzaW9uIGNvbnRyb2wKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDE5OTgvMDkvMzAgMDA6NDA6MzggIGR3bXcyCisgKiBVcGRhdGVkIHRvIHVzZSBrZXJuZWwncyBOX1IzOTY0IGlmIGF2YWlsYWJsZQorICoKKyAqIFJldmlzaW9uIDEuNCAgMTk5OC8wNC8wMiAyMDoyOTo0NCAgbGhhYWcKKyAqIHNlbGVjdCwgYmxvY2tpbmcsIC4uLgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5OC8wMi8xMiAxODo1ODo0MyAgcm9vdAorICogZml4ZWQgc29tZSBtZW1vcnkgbGVha3MKKyAqIGNhbGN1bGF0aW9uIG9mIGNoZWNrc3VtIGNoYXJhY3RlcnMKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTgvMDIvMDcgMTM6MDM6MTcgIHJvb3QKKyAqIGlvY3RsIHJlYWRfdGVsZWdyYW0KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTgvMDIvMDYgMTk6MTk6NDMgIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9OX1IzOTY0X0hfXworI2RlZmluZSBfX0xJTlVYX05fUjM5NjRfSF9fCisKKy8qIGxpbmUgZGlzY2lwbGluZXMgZm9yIHIzOTY0IHByb3RvY29sICovCisKKworLyoKKyAqIElvY3RsLWNvbW1hbmRzCisgKi8KKworI2RlZmluZSBSMzk2NF9FTkFCTEVfU0lHTkFMUyAgICAgIDB4NTMwMQorI2RlZmluZSBSMzk2NF9TRVRQUklPUklUWSAgICAgICAgIDB4NTMwMgorI2RlZmluZSBSMzk2NF9VU0VfQkNDICAgICAgICAgICAgIDB4NTMwMworI2RlZmluZSBSMzk2NF9SRUFEX1RFTEVHUkFNICAgICAgIDB4NTMwNAorCisvKiBPcHRpb25zIGZvciBSMzk2NF9TRVRQUklPUklUWSAqLworI2RlZmluZSBSMzk2NF9NQVNURVIgICAwCisjZGVmaW5lIFIzOTY0X1NMQVZFICAgIDEKKworLyogT3B0aW9ucyBmb3IgUjM5NjRfRU5BQkxFX1NJR05BTFMgKi8KKyNkZWZpbmUgUjM5NjRfU0lHX0FDSyAgIDB4MDAwMQorI2RlZmluZSBSMzk2NF9TSUdfREFUQSAgMHgwMDAyCisjZGVmaW5lIFIzOTY0X1NJR19BTEwgICAweDAwMGYKKyNkZWZpbmUgUjM5NjRfU0lHX05PTkUgIDB4MDAwMAorI2RlZmluZSBSMzk2NF9VU0VfU0lHSU8gMHgxMDAwCisKKy8qCisgKiByMzk2NCBvcGVyYXRpb24gc3RhdGVzOgorICovCisKKy8qIHR5cGVzIGZvciBtc2dfaWQ6ICovCitlbnVtIHtSMzk2NF9NU0dfQUNLPTEsIFIzOTY0X01TR19EQVRBIH07CisKKyNkZWZpbmUgUjM5NjRfTUFYX01TR19DT1VOVCAzMgorCisvKiBlcnJvciBjb2RlcyBmb3IgY2xpZW50IG1lc3NhZ2VzICovCisjZGVmaW5lIFIzOTY0X09LIDAgICAgICAgIC8qIG5vIGVycm9yLiAqLworI2RlZmluZSBSMzk2NF9UWF9GQUlMIC0xICAvKiB0cmFuc21pc3Npb24gZXJyb3IsIGJsb2NrIE5PVCBzZW50ICovCisjZGVmaW5lIFIzOTY0X09WRVJGTE9XIC0yIC8qIG1zZyBxdWV1ZSBvdmVyZmxvdyAqLworCisvKiB0aGUgY2xpZW50IGdldHMgdGhpcyBzdHJ1Y3Qgd2hlbiBjYWxsaW5nIHJlYWQoZmQsLi4uKTogKi8KK3N0cnVjdCByMzk2NF9jbGllbnRfbWVzc2FnZSB7CisJICBpbnQgICAgIG1zZ19pZDsKKwkgIGludCAgICAgYXJnOworCSAgaW50ICAgICBlcnJvcl9jb2RlOworfTsKKworI2RlZmluZSBSMzk2NF9NVFUgICAgICAyNTYKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uYmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1NDFiYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmJkLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIDE5OTkgQ29weXJpZ2h0IChDKSBQYXZlbCBNYWNoZWssIHBhdmVsQHVjdy5jei4gVGhpcyBjb2RlIGlzIEdQTC4KKyAqIDE5OTkvMTEvMDQgQ29weXJpZ2h0IChDKSAxOTk5IFZNd2FyZSwgSW5jLiAoUmVnaXMgIkhQUmVnIiBEdWNoZXNuZSkKKyAqICAgICAgICAgICAgTWFkZSBuYmRfZW5kX3JlcXVlc3QoKSB1c2UgdGhlIGlvX3JlcXVlc3RfbG9jaworICogMjAwMSBDb3B5cmlnaHQgKEMpIFN0ZXZlbiBXaGl0ZWhvdXNlCisgKiAgICAgICAgICAgIE5ldyBuYmRfZW5kX3JlcXVlc3QoKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5ldyBsaW51eCBibG9jaworICogICAgICAgICAgICBsYXllciBjb2RlLgorICogMjAwMy8wNi8yNCBMb3VpcyBELiBMYW5naG9sdHogPGxkbEBhcm9zLm5ldD4KKyAqICAgICAgICAgICAgUmVtb3ZlZCB1bm5lZWRlZCBibGtzaXplX2JpdHMgZmllbGQgZnJvbSBuYmRfZGV2aWNlIHN0cnVjdC4KKyAqICAgICAgICAgICAgQ2xlYW51cCBQQVJBTk9JQSB1c2FnZSAmIGNvZGUuCisgKiAyMDA0LzAyLzE5IFBhdWwgQ2xlbWVudHMKKyAqICAgICAgICAgICAgUmVtb3ZlZCBQQVJBTk9JQSwgcGx1cyB2YXJpb3VzIGNsZWFudXAgYW5kIGNvbW1lbnRzCisgKi8KKworI2lmbmRlZiBMSU5VWF9OQkRfSAorI2RlZmluZSBMSU5VWF9OQkRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBOQkRfU0VUX1NPQ0sJX0lPKCAweGFiLCAwICkKKyNkZWZpbmUgTkJEX1NFVF9CTEtTSVpFCV9JTyggMHhhYiwgMSApCisjZGVmaW5lIE5CRF9TRVRfU0laRQlfSU8oIDB4YWIsIDIgKQorI2RlZmluZSBOQkRfRE9fSVQJX0lPKCAweGFiLCAzICkKKyNkZWZpbmUgTkJEX0NMRUFSX1NPQ0sJX0lPKCAweGFiLCA0ICkKKyNkZWZpbmUgTkJEX0NMRUFSX1FVRQlfSU8oIDB4YWIsIDUgKQorI2RlZmluZSBOQkRfUFJJTlRfREVCVUcJX0lPKCAweGFiLCA2ICkKKyNkZWZpbmUgTkJEX1NFVF9TSVpFX0JMT0NLUwlfSU8oIDB4YWIsIDcgKQorI2RlZmluZSBOQkRfRElTQ09OTkVDVCAgX0lPKCAweGFiLCA4ICkKKyNkZWZpbmUgTkJEX1NFVF9USU1FT1VUIF9JTyggMHhhYiwgOSApCisKK2VudW0geworCU5CRF9DTURfUkVBRCA9IDAsCisJTkJEX0NNRF9XUklURSA9IDEsCisJTkJEX0NNRF9ESVNDID0gMgorfTsKKworI2RlZmluZSBuYmRfY21kKHJlcSkgKChyZXEpLT5jbWRbMF0pCisjZGVmaW5lIE1BWF9OQkQgMTI4CisKKy8qIHVzZXJzcGFjZSBkb2Vzbid0IG5lZWQgdGhlIG5iZF9kZXZpY2Ugc3RydWN0dXJlICovCisKKy8qIFRoZXNlIGFyZSBzZW50IG92ZXIgdGhlIG5ldHdvcmsgaW4gdGhlIHJlcXVlc3QvcmVwbHkgbWFnaWMgZmllbGRzICovCisKKyNkZWZpbmUgTkJEX1JFUVVFU1RfTUFHSUMgMHgyNTYwOTUxMworI2RlZmluZSBOQkRfUkVQTFlfTUFHSUMgMHg2NzQ0NjY5OAorLyogRG8gKm5vdCogdXNlIG1hZ2ljczogMHgxMjU2MDk1MyAweDk2NzQ0NjY4LiAqLworCisvKgorICogVGhpcyBpcyB0aGUgcGFja2V0IHVzZWQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBjbGllbnQgYW5kCisgKiBzZXJ2ZXIuIEFsbCBkYXRhIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KK3N0cnVjdCBuYmRfcmVxdWVzdCB7CisJX19iZTMyIG1hZ2ljOworCV9fYmUzMiB0eXBlOwkvKiA9PSBSRUFEIHx8ID09IFdSSVRFIAkqLworCWNoYXIgaGFuZGxlWzhdOworCV9fYmU2NCBmcm9tOworCV9fYmUzMiBsZW47Cit9CisjaWZkZWYgX19HTlVDX18KKwlfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKyNlbmRpZgorOworCisvKgorICogVGhpcyBpcyB0aGUgcmVwbHkgcGFja2V0IHRoYXQgbmJkLXNlcnZlciBzZW5kcyBiYWNrIHRvIHRoZSBjbGllbnQgYWZ0ZXIKKyAqIGl0IGhhcyBjb21wbGV0ZWQgYW4gSS9PIHJlcXVlc3QgKG9yIGFuIGVycm9yIG9jY3VycykuCisgKi8KK3N0cnVjdCBuYmRfcmVwbHkgeworCV9fYmUzMiBtYWdpYzsKKwlfX2JlMzIgZXJyb3I7CQkvKiAwID0gb2ssIGVsc2UgZXJyb3IJKi8KKwljaGFyIGhhbmRsZVs4XTsJCS8qIGhhbmRsZSB5b3UgZ290IGZyb20gcmVxdWVzdAkqLworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4MmFkNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwLmgKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiAgbmNwLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1IGJ5IFZvbGtlciBMZW5kZWNrZQorICogIE1vZGlmaWVkIGZvciBzcGFyYyBieSBKLkYuIENoYWRpbWEKKyAqICBNb2RpZmllZCBmb3IgX19jb25zdGFudF9udG9oIGJ5IEZyYW5rIEEuIFZvcnN0ZW5ib3NjaAorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OQ1BfSAorI2RlZmluZSBfTElOVVhfTkNQX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTkNQX1BUWVBFICAgICAgICAgICAgICAgICgweDExKQorI2RlZmluZSBOQ1BfUE9SVCAgICAgICAgICAgICAgICAgKDB4MDQ1MSkKKworI2RlZmluZSBOQ1BfQUxMT0NfU0xPVF9SRVFVRVNUICAgKDB4MTExMSkKKyNkZWZpbmUgTkNQX1JFUVVFU1QgICAgICAgICAgICAgICgweDIyMjIpCisjZGVmaW5lIE5DUF9ERUFMTE9DX1NMT1RfUkVRVUVTVCAoMHg1NTU1KQorCitzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyIHsKKwlfX3UxNiB0eXBlOworCV9fdTggc2VxdWVuY2U7CisJX191OCBjb25uX2xvdzsKKwlfX3U4IHRhc2s7CisJX191OCBjb25uX2hpZ2g7CisJX191OCBmdW5jdGlvbjsKKwlfX3U4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE5DUF9SRVBMWSAgICAgICAgICAgICAgICAoMHgzMzMzKQorI2RlZmluZSBOQ1BfV0FUQ0hET0cJCSAoMHgzRTNFKQorI2RlZmluZSBOQ1BfUE9TSVRJVkVfQUNLICAgICAgICAgKDB4OTk5OSkKKworc3RydWN0IG5jcF9yZXBseV9oZWFkZXIgeworCV9fdTE2IHR5cGU7CisJX191OCBzZXF1ZW5jZTsKKwlfX3U4IGNvbm5fbG93OworCV9fdTggdGFzazsKKwlfX3U4IGNvbm5faGlnaDsKKwlfX3U4IGNvbXBsZXRpb25fY29kZTsKKwlfX3U4IGNvbm5lY3Rpb25fc3RhdGU7CisJX191OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBOQ1BfVk9MTkFNRV9MRU4gKDE2KQorI2RlZmluZSBOQ1BfTlVNQkVSX09GX1ZPTFVNRVMgKDI1NikKK3N0cnVjdCBuY3Bfdm9sdW1lX2luZm8geworCV9fdTMyIHRvdGFsX2Jsb2NrczsKKwlfX3UzMiBmcmVlX2Jsb2NrczsKKwlfX3UzMiBwdXJnZWFibGVfYmxvY2tzOworCV9fdTMyIG5vdF95ZXRfcHVyZ2VhYmxlX2Jsb2NrczsKKwlfX3UzMiB0b3RhbF9kaXJfZW50cmllczsKKwlfX3UzMiBhdmFpbGFibGVfZGlyX2VudHJpZXM7CisJX191OCBzZWN0b3JzX3Blcl9ibG9jazsKKwljaGFyIHZvbHVtZV9uYW1lW05DUF9WT0xOQU1FX0xFTiArIDFdOworfTsKKworI2RlZmluZSBBUl9SRUFEICAgICAgKGNwdV90b19sZTE2KDEpKQorI2RlZmluZSBBUl9XUklURSAgICAgKGNwdV90b19sZTE2KDIpKQorI2RlZmluZSBBUl9FWENMVVNJVkUgKGNwdV90b19sZTE2KDB4MjApKQorCisjZGVmaW5lIE5DUF9GSUxFX0lEX0xFTiA2CisKKy8qIERlZmluZXMgZm9yIE5hbWUgU3BhY2VzICovCisjZGVmaW5lIE5XX05TX0RPUyAgICAgMAorI2RlZmluZSBOV19OU19NQUMgICAgIDEKKyNkZWZpbmUgTldfTlNfTkZTICAgICAyCisjZGVmaW5lIE5XX05TX0ZUQU0gICAgMworI2RlZmluZSBOV19OU19PUzIgICAgIDQKKworLyogIERlZmluZXMgZm9yIFJldHVybkluZm9ybWF0aW9uTWFzayAqLworI2RlZmluZSBSSU1fTkFNRQkgICAgICAoY3B1X3RvX2xlMzIoMSkpCisjZGVmaW5lIFJJTV9TUEFDRV9BTExPQ0FURUQgICAoY3B1X3RvX2xlMzIoMikpCisjZGVmaW5lIFJJTV9BVFRSSUJVVEVTCSAgICAgIChjcHVfdG9fbGUzMig0KSkKKyNkZWZpbmUgUklNX0RBVEFfU0laRQkgICAgICAoY3B1X3RvX2xlMzIoOCkpCisjZGVmaW5lIFJJTV9UT1RBTF9TSVpFCSAgICAgIChjcHVfdG9fbGUzMigweDEwKSkKKyNkZWZpbmUgUklNX0VYVF9BVFRSX0lORk8gICAgIChjcHVfdG9fbGUzMigweDIwKSkKKyNkZWZpbmUgUklNX0FSQ0hJVkUJICAgICAgKGNwdV90b19sZTMyKDB4NDApKQorI2RlZmluZSBSSU1fTU9ESUZZCSAgICAgIChjcHVfdG9fbGUzMigweDgwKSkKKyNkZWZpbmUgUklNX0NSRUFUSU9OCSAgICAgIChjcHVfdG9fbGUzMigweDEwMCkpCisjZGVmaW5lIFJJTV9PV05JTkdfTkFNRVNQQUNFICAoY3B1X3RvX2xlMzIoMHgyMDApKQorI2RlZmluZSBSSU1fRElSRUNUT1JZCSAgICAgIChjcHVfdG9fbGUzMigweDQwMCkpCisjZGVmaW5lIFJJTV9SSUdIVFMJICAgICAgKGNwdV90b19sZTMyKDB4ODAwKSkKKyNkZWZpbmUgUklNX0FMTCAJICAgICAgKGNwdV90b19sZTMyKDB4RkZGKSkKKyNkZWZpbmUgUklNX0NPTVBSRVNTRURfSU5GTyAgIChjcHVfdG9fbGUzMigweDgwMDAwMDAwKSkKKworLyogRGVmaW5lcyBmb3IgTlNJbmZvQml0TWFzayAqLworI2RlZmluZSBOU0lCTV9ORlNfTkFNRQkJMHgwMDAxCisjZGVmaW5lIE5TSUJNX05GU19NT0RFCQkweDAwMDIKKyNkZWZpbmUgTlNJQk1fTkZTX0dJRAkJMHgwMDA0CisjZGVmaW5lIE5TSUJNX05GU19OTElOS1MJMHgwMDA4CisjZGVmaW5lIE5TSUJNX05GU19SREVWCQkweDAwMTAKKyNkZWZpbmUgTlNJQk1fTkZTX0xJTksJCTB4MDAyMAorI2RlZmluZSBOU0lCTV9ORlNfQ1JFQVRFRAkweDAwNDAKKyNkZWZpbmUgTlNJQk1fTkZTX1VJRAkJMHgwMDgwCisjZGVmaW5lIE5TSUJNX05GU19BQ1NGTEFHCTB4MDEwMAorI2RlZmluZSBOU0lCTV9ORlNfTVlGTEFHCTB4MDIwMAorCisvKiBvcGVuL2NyZWF0ZSBtb2RlcyAqLworI2RlZmluZSBPQ19NT0RFX09QRU4JICAweDAxCisjZGVmaW5lIE9DX01PREVfVFJVTkNBVEUgIDB4MDIKKyNkZWZpbmUgT0NfTU9ERV9SRVBMQUNFICAgMHgwMgorI2RlZmluZSBPQ19NT0RFX0NSRUFURQkgIDB4MDgKKworLyogb3Blbi9jcmVhdGUgcmVzdWx0cyAqLworI2RlZmluZSBPQ19BQ1RJT05fTk9ORQkgICAweDAwCisjZGVmaW5lIE9DX0FDVElPTl9PUEVOCSAgIDB4MDEKKyNkZWZpbmUgT0NfQUNUSU9OX0NSRUFURSAgIDB4MDIKKyNkZWZpbmUgT0NfQUNUSU9OX1RSVU5DQVRFIDB4MDQKKyNkZWZpbmUgT0NfQUNUSU9OX1JFUExBQ0UgIDB4MDQKKworLyogYWNjZXNzIHJpZ2h0cyBhdHRyaWJ1dGVzICovCisjaWZuZGVmIEFSX1JFQURfT05MWQorI2RlZmluZSBBUl9SRUFEX09OTFkJICAgMHgwMDAxCisjZGVmaW5lIEFSX1dSSVRFX09OTFkJICAgMHgwMDAyCisjZGVmaW5lIEFSX0RFTllfUkVBRAkgICAweDAwMDQKKyNkZWZpbmUgQVJfREVOWV9XUklURQkgICAweDAwMDgKKyNkZWZpbmUgQVJfQ09NUEFUSUJJTElUWSAgIDB4MDAxMAorI2RlZmluZSBBUl9XUklURV9USFJPVUdIICAgMHgwMDQwCisjZGVmaW5lIEFSX09QRU5fQ09NUFJFU1NFRCAweDAxMDAKKyNlbmRpZgorCitzdHJ1Y3QgbndfbmZzX2luZm8geworCV9fdTMyIG1vZGU7CisJX191MzIgcmRldjsKK307CisKK3N0cnVjdCBud19pbmZvX3N0cnVjdCB7CisJX191MzIgc3BhY2VBbGxvYzsKKwlfX2xlMzIgYXR0cmlidXRlczsKKwlfX3UxNiBmbGFnczsKKwlfX2xlMzIgZGF0YVN0cmVhbVNpemU7CisJX19sZTMyIHRvdGFsU3RyZWFtU2l6ZTsKKwlfX3UxNiBudW1iZXJPZlN0cmVhbXM7CisJX19sZTE2IGNyZWF0aW9uVGltZTsKKwlfX2xlMTYgY3JlYXRpb25EYXRlOworCV9fdTMyIGNyZWF0b3JJRDsKKwlfX2xlMTYgbW9kaWZ5VGltZTsKKwlfX2xlMTYgbW9kaWZ5RGF0ZTsKKwlfX3UzMiBtb2RpZmllcklEOworCV9fbGUxNiBsYXN0QWNjZXNzRGF0ZTsKKwlfX3UxNiBhcmNoaXZlVGltZTsKKwlfX3UxNiBhcmNoaXZlRGF0ZTsKKwlfX3UzMiBhcmNoaXZlcklEOworCV9fdTE2IGluaGVyaXRlZFJpZ2h0c01hc2s7CisJX19sZTMyIGRpckVudE51bTsKKwlfX2xlMzIgRG9zRGlyTnVtOworCV9fdTMyIHZvbE51bWJlcjsKKwlfX3UzMiBFQURhdGFTaXplOworCV9fdTMyIEVBS2V5Q291bnQ7CisJX191MzIgRUFLZXlTaXplOworCV9fdTMyIE5TQ3JlYXRvcjsKKwlfX3U4IG5hbWVMZW47CisJX191OCBlbnRyeU5hbWVbMjU2XTsKKwkvKiBsaWJuY3AgbWF5IGRlcGVuZCBvbiB0aGVyZSBiZWluZyBub3RoaW5nIGFmdGVyIGVudHJ5TmFtZSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogbW9kaWZ5IG1hc2sgLSB1c2Ugd2l0aCBNT0RJRllfRE9TX0lORk8gc3RydWN0dXJlICovCisjZGVmaW5lIERNX0FUVFJJQlVURVMJCSAgKGNwdV90b19sZTMyKDB4MDIpKQorI2RlZmluZSBETV9DUkVBVEVfREFURQkJICAoY3B1X3RvX2xlMzIoMHgwNCkpCisjZGVmaW5lIERNX0NSRUFURV9USU1FCQkgIChjcHVfdG9fbGUzMigweDA4KSkKKyNkZWZpbmUgRE1fQ1JFQVRPUl9JRAkJICAoY3B1X3RvX2xlMzIoMHgxMCkpCisjZGVmaW5lIERNX0FSQ0hJVkVfREFURSAJICAoY3B1X3RvX2xlMzIoMHgyMCkpCisjZGVmaW5lIERNX0FSQ0hJVkVfVElNRSAJICAoY3B1X3RvX2xlMzIoMHg0MCkpCisjZGVmaW5lIERNX0FSQ0hJVkVSX0lECQkgIChjcHVfdG9fbGUzMigweDgwKSkKKyNkZWZpbmUgRE1fTU9ESUZZX0RBVEUJCSAgKGNwdV90b19sZTMyKDB4MDEwMCkpCisjZGVmaW5lIERNX01PRElGWV9USU1FCQkgIChjcHVfdG9fbGUzMigweDAyMDApKQorI2RlZmluZSBETV9NT0RJRklFUl9JRAkJICAoY3B1X3RvX2xlMzIoMHgwNDAwKSkKKyNkZWZpbmUgRE1fTEFTVF9BQ0NFU1NfREFURQkgIChjcHVfdG9fbGUzMigweDA4MDApKQorI2RlZmluZSBETV9JTkhFUklURURfUklHSFRTX01BU0sgIChjcHVfdG9fbGUzMigweDEwMDApKQorI2RlZmluZSBETV9NQVhJTVVNX1NQQUNFCSAgKGNwdV90b19sZTMyKDB4MjAwMCkpCisKK3N0cnVjdCBud19tb2RpZnlfZG9zX2luZm8geworCV9fbGUzMiBhdHRyaWJ1dGVzOworCV9fbGUxNiBjcmVhdGlvbkRhdGU7CisJX19sZTE2IGNyZWF0aW9uVGltZTsKKwlfX3UzMiBjcmVhdG9ySUQ7CisJX19sZTE2IG1vZGlmeURhdGU7CisJX19sZTE2IG1vZGlmeVRpbWU7CisJX191MzIgbW9kaWZpZXJJRDsKKwlfX3UxNiBhcmNoaXZlRGF0ZTsKKwlfX3UxNiBhcmNoaXZlVGltZTsKKwlfX3UzMiBhcmNoaXZlcklEOworCV9fbGUxNiBsYXN0QWNjZXNzRGF0ZTsKKwlfX3UxNiBpbmhlcml0YW5jZUdyYW50TWFzazsKKwlfX3UxNiBpbmhlcml0YW5jZVJldm9rZU1hc2s7CisJX191MzIgbWF4aW11bVNwYWNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSB7CisJX191OCB2b2xOdW1iZXI7CisJX191MzIgZGlyQmFzZTsKKwlfX3UzMiBzZXF1ZW5jZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZgkJCQkvKiBfTElOVVhfTkNQX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZWI1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogIG5jcF9mcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfTkNQX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX05DUF9GU19ICisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisjaW5jbHVkZSA8bGludXgvaXB4Lmg+CisjaW5jbHVkZSA8bGludXgvbmNwX25vLmg+CisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisKK3N0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdCB7CisJdW5zaWduZWQgaW50IGZ1bmN0aW9uOworCXVuc2lnbmVkIGludCBzaXplOworCWNoYXIgKmRhdGE7Cit9OworCitzdHJ1Y3QgbmNwX2ZzX2luZm8geworCWludCB2ZXJzaW9uOworCXN0cnVjdCBzb2NrYWRkcl9pcHggYWRkcjsKKwlfX2tlcm5lbF91aWRfdCBtb3VudGVkX3VpZDsKKwlpbnQgY29ubmVjdGlvbjsJCS8qIENvbm5lY3Rpb24gbnVtYmVyIHRoZSBzZXJ2ZXIgYXNzaWduZWQgdXMgKi8KKwlpbnQgYnVmZmVyX3NpemU7CS8qIFRoZSBuZWdvdGlhdGVkIGJ1ZmZlciBzaXplLCB0byBiZQorCQkJCSAgIHVzZWQgZm9yIHJlYWQvd3JpdGUgcmVxdWVzdHMhICovCisKKwlpbnQgdm9sdW1lX251bWJlcjsKKwlfX2xlMzIgZGlyZWN0b3J5X2lkOworfTsKKworc3RydWN0IG5jcF9mc19pbmZvX3YyIHsKKwlpbnQgdmVyc2lvbjsKKwl1bnNpZ25lZCBsb25nIG1vdW50ZWRfdWlkOworCXVuc2lnbmVkIGludCBjb25uZWN0aW9uOworCXVuc2lnbmVkIGludCBidWZmZXJfc2l6ZTsKKworCXVuc2lnbmVkIGludCB2b2x1bWVfbnVtYmVyOworCV9fbGUzMiBkaXJlY3RvcnlfaWQ7CisKKwlfX3UzMiBkdW1teTE7CisJX191MzIgZHVtbXkyOworCV9fdTMyIGR1bW15MzsKK307CisKK3N0cnVjdCBuY3Bfc2lnbl9pbml0Cit7CisJY2hhciBzaWduX3Jvb3RbOF07CisJY2hhciBzaWduX2xhc3RbMTZdOworfTsKKworc3RydWN0IG5jcF9sb2NrX2lvY3RsCit7CisjZGVmaW5lIE5DUF9MT0NLX0xPRwkwCisjZGVmaW5lIE5DUF9MT0NLX1NICTEKKyNkZWZpbmUgTkNQX0xPQ0tfRVgJMgorI2RlZmluZSBOQ1BfTE9DS19DTEVBUgkyNTYKKwlpbnQJCWNtZDsKKwlpbnQJCW9yaWdpbjsKKwl1bnNpZ25lZCBpbnQJb2Zmc2V0OworCXVuc2lnbmVkIGludAlsZW5ndGg7CisjZGVmaW5lIE5DUF9MT0NLX0RFRkFVTFRfVElNRU9VVAkxOAorI2RlZmluZSBOQ1BfTE9DS19NQVhfVElNRU9VVAkJMTgwCisJaW50CQl0aW1lb3V0OworfTsKKworc3RydWN0IG5jcF9zZXRyb290X2lvY3RsCit7CisJaW50CQl2b2xOdW1iZXI7CisJaW50CQluYW1lc3BhY2U7CisJX19sZTMyCQlkaXJFbnROdW07Cit9OworCitzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGwKK3sKKyNkZWZpbmUgTkNQX0FVVEhfTk9ORQkweDAwCisjZGVmaW5lIE5DUF9BVVRIX0JJTkQJMHgzMQorI2RlZmluZSBOQ1BfQVVUSF9ORFMJMHgzMgorCWludAkJYXV0aF90eXBlOworCXNpemVfdAkJb2JqZWN0X25hbWVfbGVuOworCXZvaWQgKglvYmplY3RfbmFtZTsJLyogYW4gdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCit9OworCitzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsCit7CisJc2l6ZV90CQlsZW47CisJdm9pZCAqCWRhdGE7CQkvKiB+MTAwMCBmb3IgTkRTICovCit9OworCisvKiBOTFMgY2hhcnNldHMgYnkgaW9jdGwgKi8KKyNkZWZpbmUgTkNQX0lPQ1NOQU1FX0xFTiAyMAorc3RydWN0IG5jcF9ubHNfaW9jdGwKK3sKKwl1bnNpZ25lZCBjaGFyIGNvZGVwYWdlW05DUF9JT0NTTkFNRV9MRU4rMV07CisJdW5zaWduZWQgY2hhciBpb2NoYXJzZXRbTkNQX0lPQ1NOQU1FX0xFTisxXTsKK307CisKKyNkZWZpbmUJTkNQX0lPQ19OQ1BSRVFVRVNUCQlfSU9SKCduJywgMSwgc3RydWN0IG5jcF9pb2N0bF9yZXF1ZXN0KQorI2RlZmluZQlOQ1BfSU9DX0dFVE1PVU5UVUlECQlfSU9XKCduJywgMiwgX19rZXJuZWxfb2xkX3VpZF90KQorI2RlZmluZSBOQ1BfSU9DX0dFVE1PVU5UVUlEMgkJX0lPVygnbicsIDIsIHVuc2lnbmVkIGxvbmcpCisKKyNkZWZpbmUgTkNQX0lPQ19DT05OX0xPR0dFRF9JTiAgICAgICAgICBfSU8oJ24nLCAzKQorCisjZGVmaW5lIE5DUF9HRVRfRlNfSU5GT19WRVJTSU9OICAgICgxKQorI2RlZmluZSBOQ1BfSU9DX0dFVF9GU19JTkZPICAgICAgICAgICAgIF9JT1dSKCduJywgNCwgc3RydWN0IG5jcF9mc19pbmZvKQorI2RlZmluZSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTl9WMiAoMikKKyNkZWZpbmUgTkNQX0lPQ19HRVRfRlNfSU5GT19WMgkJX0lPV1IoJ24nLCA0LCBzdHJ1Y3QgbmNwX2ZzX2luZm9fdjIpCisKKyNkZWZpbmUgTkNQX0lPQ19TSUdOX0lOSVQJCV9JT1IoJ24nLCA1LCBzdHJ1Y3QgbmNwX3NpZ25faW5pdCkKKyNkZWZpbmUgTkNQX0lPQ19TSUdOX1dBTlRFRAkJX0lPUignbicsIDYsIGludCkKKyNkZWZpbmUgTkNQX0lPQ19TRVRfU0lHTl9XQU5URUQJCV9JT1coJ24nLCA2LCBpbnQpCisKKyNkZWZpbmUgTkNQX0lPQ19MT0NLVU5MT0NLCQlfSU9SKCduJywgNywgc3RydWN0IG5jcF9sb2NrX2lvY3RsKQorCisjZGVmaW5lIE5DUF9JT0NfR0VUUk9PVAkJCV9JT1coJ24nLCA4LCBzdHJ1Y3QgbmNwX3NldHJvb3RfaW9jdGwpCisjZGVmaW5lIE5DUF9JT0NfU0VUUk9PVAkJCV9JT1IoJ24nLCA4LCBzdHJ1Y3QgbmNwX3NldHJvb3RfaW9jdGwpCisKKyNkZWZpbmUgTkNQX0lPQ19HRVRPQkpFQ1ROQU1FCQlfSU9XUignbicsIDksIHN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCkKKyNkZWZpbmUgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FCQlfSU9SKCduJywgOSwgc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsKQorI2RlZmluZSBOQ1BfSU9DX0dFVFBSSVZBVEVEQVRBCQlfSU9XUignbicsIDEwLCBzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsKQorI2RlZmluZSBOQ1BfSU9DX1NFVFBSSVZBVEVEQVRBCQlfSU9SKCduJywgMTAsIHN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwpCisKKyNkZWZpbmUgTkNQX0lPQ19HRVRDSEFSU0VUUwkJX0lPV1IoJ24nLCAxMSwgc3RydWN0IG5jcF9ubHNfaW9jdGwpCisjZGVmaW5lIE5DUF9JT0NfU0VUQ0hBUlNFVFMJCV9JT1IoJ24nLCAxMSwgc3RydWN0IG5jcF9ubHNfaW9jdGwpCisKKyNkZWZpbmUgTkNQX0lPQ19HRVRERU5UUllUVEwJCV9JT1coJ24nLCAxMiwgX191MzIpCisjZGVmaW5lIE5DUF9JT0NfU0VUREVOVFJZVFRMCQlfSU9SKCduJywgMTIsIF9fdTMyKQorCisvKgorICogVGhlIHBhY2tldCBzaXplIHRvIGFsbG9jYXRlLiBPbmUgcGFnZSBzaG91bGQgYmUgZW5vdWdoLgorICovCisjZGVmaW5lIE5DUF9QQUNLRVRfU0laRSA0MDcwCisKKyNkZWZpbmUgTkNQX01BWFBBVEhMRU4gMjU1CisjZGVmaW5lIE5DUF9NQVhOQU1FTEVOIDE0CisKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9OQ1BfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3BfbW91bnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNGEyZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX21vdW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqICBuY3BfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX05DUF9NT1VOVF9ICisjZGVmaW5lIF9MSU5VWF9OQ1BfTU9VTlRfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uY3AuaD4KKworI2RlZmluZSBOQ1BfTU9VTlRfVkVSU0lPTiAzCS8qIEJpbmFyeSAqLworCisvKiBWYWx1ZXMgZm9yIGZsYWdzICovCisjZGVmaW5lIE5DUF9NT1VOVF9TT0ZUCQkweDAwMDEKKyNkZWZpbmUgTkNQX01PVU5UX0lOVFIJCTB4MDAwMgorI2RlZmluZSBOQ1BfTU9VTlRfU1RST05HCTB4MDAwNAkvKiBlbmFibGUgZGVsZXRlL3JlbmFtZSBvZiByL28gZmlsZXMgKi8KKyNkZWZpbmUgTkNQX01PVU5UX05PX09TMgkweDAwMDgJLyogZG8gbm90IHVzZSBPUy8yIChMT05HKSBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgTkNQX01PVU5UX05PX05GUwkweDAwMTAJLyogZG8gbm90IHVzZSBORlMgbmFtZXNwYWNlICovCisjZGVmaW5lIE5DUF9NT1VOVF9FWFRSQVMJMHgwMDIwCisjZGVmaW5lIE5DUF9NT1VOVF9TWU1MSU5LUwkweDAwNDAJLyogZW5hYmxlIHN5bWxpbmtzICovCisjZGVmaW5lIE5DUF9NT1VOVF9ORlNfRVhUUkFTCTB4MDA4MAkvKiBFbmFibGUgdXNlIG9mIE5GUyBOUyBtZXRhLWluZm8gKi8KKworc3RydWN0IG5jcF9tb3VudF9kYXRhIHsKKwlpbnQgdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgbmNwX2ZkOwkvKiBUaGUgc29ja2V0IHRvIHRoZSBuY3AgcG9ydCAqLworCV9fa2VybmVsX3VpZF90IG1vdW50ZWRfdWlkOwkvKiBXaG8gbWF5IHVtb3VudCgpIHRoaXMgZmlsZXN5c3RlbT8gKi8KKwlfX2tlcm5lbF9waWRfdCB3ZG9nX3BpZDsJCS8qIFdobyBjYXJlcyBmb3Igb3VyIHdhdGNoZG9nIHBhY2tldHM/ICovCisKKwl1bnNpZ25lZCBjaGFyIG1vdW50ZWRfdm9sW05DUF9WT0xOQU1FX0xFTiArIDFdOworCXVuc2lnbmVkIGludCB0aW1lX291dDsJLyogSG93IGxvbmcgc2hvdWxkIEkgd2FpdCBhZnRlcgorCQkJCSAgIHNlbmRpbmcgYSBOQ1AgcmVxdWVzdD8gKi8KKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CS8qIEFuZCBob3cgb2Z0ZW4gc2hvdWxkIEkgcmV0cnk/ICovCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJX19rZXJuZWxfdWlkX3QgdWlkOworCV9fa2VybmVsX2dpZF90IGdpZDsKKwlfX2tlcm5lbF9tb2RlX3QgZmlsZV9tb2RlOworCV9fa2VybmVsX21vZGVfdCBkaXJfbW9kZTsKK307CisKKyNkZWZpbmUgTkNQX01PVU5UX1ZFUlNJT05fVjQJKDQpCS8qIEJpbmFyeSBvciB0ZXh0ICovCisKK3N0cnVjdCBuY3BfbW91bnRfZGF0YV92NCB7CisJaW50IHZlcnNpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogTkNQX01PVU5UXyogZmxhZ3MgKi8KKwkvKiBNSVBTIHVzZXMgbG9uZyBfX2tlcm5lbF91aWRfdCwgYnV0Li4uICovCisJLyogd2UgbmVldmVyIHBhc3MgLTEsIHNvIGl0IGlzIHNhZmUgKi8KKwl1bnNpZ25lZCBsb25nIG1vdW50ZWRfdWlkOwkvKiBXaG8gbWF5IHVtb3VudCgpIHRoaXMgZmlsZXN5c3RlbT8gKi8KKwkvKiBNSVBTIHVzZXMgbG9uZyBfX2tlcm5lbF9waWRfdCAqLworCWxvbmcgd2RvZ19waWQ7CQkvKiBXaG8gY2FyZXMgZm9yIG91ciB3YXRjaGRvZyBwYWNrZXRzPyAqLworCisJdW5zaWduZWQgaW50IG5jcF9mZDsJLyogVGhlIHNvY2tldCB0byB0aGUgbmNwIHBvcnQgKi8KKwl1bnNpZ25lZCBpbnQgdGltZV9vdXQ7CS8qIEhvdyBsb25nIHNob3VsZCBJIHdhaXQgYWZ0ZXIKKwkJCQkgICBzZW5kaW5nIGEgTkNQIHJlcXVlc3Q/ICovCisJdW5zaWduZWQgaW50IHJldHJ5X2NvdW50OwkvKiBBbmQgaG93IG9mdGVuIHNob3VsZCBJIHJldHJ5PyAqLworCisJLyogTUlQUyB1c2VzIGxvbmcgX19rZXJuZWxfdWlkX3QuLi4gKi8KKwkvKiB3ZSBuZXZlciBwYXNzIC0xLCBzbyBpdCBpcyBzYWZlICovCisJdW5zaWduZWQgbG9uZyB1aWQ7CisJdW5zaWduZWQgbG9uZyBnaWQ7CisJLyogTUlQUyB1c2VzIHVuc2lnbmVkIGxvbmcgX19rZXJuZWxfbW9kZV90ICovCisJdW5zaWduZWQgbG9uZyBmaWxlX21vZGU7CisJdW5zaWduZWQgbG9uZyBkaXJfbW9kZTsKK307CisKKyNkZWZpbmUgTkNQX01PVU5UX1ZFUlNJT05fVjUJKDUpCS8qIFRleHQgb25seSAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uY3Bfbm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX25vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2YTY5NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmNwX25vLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfTkNQX05PCisjZGVmaW5lIF9OQ1BfTk8KKworLyogdGhlc2UgZGVmaW5lIHRoZSBhdHRyaWJ1dGUgYnl0ZSBhcyBzZWVuIGJ5IE5DUCAqLworI2RlZmluZSBhUk9OTFkJCQkoX19jb25zdGFudF9jcHVfdG9fbGUzMigxKSkKKyNkZWZpbmUgYUhJRERFTgkJCShfX2NvbnN0YW50X2NwdV90b19sZTMyKDIpKQorI2RlZmluZSBhU1lTVEVNCQkJKF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoNCkpCisjZGVmaW5lIGFFWEVDVVRFCQkoX19jb25zdGFudF9jcHVfdG9fbGUzMig4KSkKKyNkZWZpbmUgYURJUgkJCShfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MTApKQorI2RlZmluZSBhQVJDSAkJCShfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MjApKQorI2RlZmluZSBhU0hBUkVECQkJKF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHg4MCkpCisjZGVmaW5lIGFET05UU1VCQUxMT0NBVEUJKF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMUw8PDExKSkKKyNkZWZpbmUgYVRSQU5TQUNUSU9OQUwJCShfX2NvbnN0YW50X2NwdV90b19sZTMyKDFMPDwxMikpCisjZGVmaW5lIGFQVVJHRQkJCShfX2NvbnN0YW50X2NwdV90b19sZTMyKDFMPDwxNikpCisjZGVmaW5lIGFSRU5BTUVJTkhJQklUCQkoX19jb25zdGFudF9jcHVfdG9fbGUzMigxTDw8MTcpKQorI2RlZmluZSBhREVMRVRFSU5ISUJJVAkJKF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMUw8PDE4KSkKKyNkZWZpbmUgYURPTlRDT01QUkVTUwkJKF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMUw8PDI3KSkKKworI2VuZGlmIC8qIF9OQ1BfTk8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmVpZ2hib3VyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2JiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCkBAIC0wLDAgKzEsMTU5IEBACisjaWZuZGVmIF9fTElOVVhfTkVJR0hCT1VSX0gKKyNkZWZpbmUgX19MSU5VWF9ORUlHSEJPVVJfSAorCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorCitzdHJ1Y3QgbmRtc2cKK3sKKwlfX3U4CQluZG1fZmFtaWx5OworCV9fdTgJCW5kbV9wYWQxOworCV9fdTE2CQluZG1fcGFkMjsKKwlfX3MzMgkJbmRtX2lmaW5kZXg7CisJX191MTYJCW5kbV9zdGF0ZTsKKwlfX3U4CQluZG1fZmxhZ3M7CisJX191OAkJbmRtX3R5cGU7Cit9OworCitlbnVtCit7CisJTkRBX1VOU1BFQywKKwlOREFfRFNULAorCU5EQV9MTEFERFIsCisJTkRBX0NBQ0hFSU5GTywKKwlOREFfUFJPQkVTLAorCV9fTkRBX01BWAorfTsKKworI2RlZmluZSBOREFfTUFYIChfX05EQV9NQVggLSAxKQorCisvKgorICoJTmVpZ2hib3IgQ2FjaGUgRW50cnkgRmxhZ3MKKyAqLworCisjZGVmaW5lIE5URl9QUk9YWQkweDA4CS8qID09IEFURl9QVUJMICovCisjZGVmaW5lIE5URl9ST1VURVIJMHg4MAorCisvKgorICoJTmVpZ2hib3IgQ2FjaGUgRW50cnkgU3RhdGVzLgorICovCisKKyNkZWZpbmUgTlVEX0lOQ09NUExFVEUJMHgwMQorI2RlZmluZSBOVURfUkVBQ0hBQkxFCTB4MDIKKyNkZWZpbmUgTlVEX1NUQUxFCTB4MDQKKyNkZWZpbmUgTlVEX0RFTEFZCTB4MDgKKyNkZWZpbmUgTlVEX1BST0JFCTB4MTAKKyNkZWZpbmUgTlVEX0ZBSUxFRAkweDIwCisKKy8qIER1bW15IHN0YXRlcyAqLworI2RlZmluZSBOVURfTk9BUlAJMHg0MAorI2RlZmluZSBOVURfUEVSTUFORU5UCTB4ODAKKyNkZWZpbmUgTlVEX05PTkUJMHgwMAorCisvKiBOVURfTk9BUlAgJiBOVURfUEVSTUFORU5UIGFyZSBwc2V1ZG9zdGF0ZXMsIHRoZXkgbmV2ZXIgY2hhbmdlCisgICBhbmQgbWFrZSBubyBhZGRyZXNzIHJlc29sdXRpb24gb3IgTlVELgorICAgTlVEX1BFUk1BTkVOVCBpcyBhbHNvIGNhbm5vdCBiZSBkZWxldGVkIGJ5IGdhcmJhZ2UgY29sbGVjdG9ycy4KKyAqLworCitzdHJ1Y3QgbmRhX2NhY2hlaW5mbworeworCV9fdTMyCQluZG1fY29uZmlybWVkOworCV9fdTMyCQluZG1fdXNlZDsKKwlfX3UzMgkJbmRtX3VwZGF0ZWQ7CisJX191MzIJCW5kbV9yZWZjbnQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlOZWlnaGJvdXIgdGFibGVzIHNwZWNpZmljIG1lc3NhZ2VzLgorICoKKyAqIFRvIHJldHJpZXZlIHRoZSBuZWlnaGJvdXIgdGFibGVzIHNlbmQgUlRNX0dFVE5FSUdIVEJMIHdpdGggdGhlCisgKiBOTE1fRl9EVU1QIGZsYWcgc2V0LiBFdmVyeSBuZWlnaGJvdXIgdGFibGUgY29uZmlndXJhdGlvbiBpcworICogc3ByZWFkIG92ZXIgbXVsdGlwbGUgbWVzc2FnZXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIG1lc3NhZ2UKKyAqIHNpemUgbGltaXRzIG9uIHN5c3RlbXMgd2l0aCBtYW55IGludGVyZmFjZXMuIFRoZSBmaXJzdCBtZXNzYWdlCisgKiBpbiB0aGUgc2VxdWVuY2UgdHJhbnNwb3J0cyBhbGwgbm90IGRldmljZSBzcGVjaWZpYyBkYXRhIHN1Y2ggYXMKKyAqIHN0YXRpc3RpY3MsIGNvbmZpZ3VyYXRpb24sIGFuZCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgc2V0LgorICogVGhpcyBtZXNzYWdlIGlzIGZvbGxvd2VkIGJ5IDAuLm4gbWVzc2FnZXMgY2FycnlpbmcgZGV2aWNlCisgKiBzcGVjaWZpYyBwYXJhbWV0ZXIgc2V0cy4KKyAqIEFsdGhvdWdoIHRoZSBvcmRlcmluZyBzaG91bGQgYmUgc3VmZmljaWVudCwgTkRUQV9OQU1FIGNhbiBiZQorICogdXNlZCB0byBpZGVudGlmeSBzZXF1ZW5jZXMuIFRoZSBpbml0aWFsIG1lc3NhZ2UgY2FuIGJlIGlkZW50aWZpZWQKKyAqIGJ5IGNoZWNraW5nIGZvciBORFRBX0NPTkZJRy4gVGhlIGRldmljZSBzcGVjaWZpYyBtZXNzYWdlcyBkbworICogbm90IGNvbnRhaW4gdGhpcyBUTFYgYnV0IGhhdmUgTkRUUEFfSUZJTkRFWCBzZXQgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIGludGVyZmFjZSBpbmRleC4KKyAqCisgKiBUbyBjaGFuZ2UgbmVpZ2hib3VyIHRhYmxlIGF0dHJpYnV0ZXMsIHNlbmQgUlRNX1NFVE5FSUdIVEJMCisgKiB3aXRoIE5EVEFfTkFNRSBzZXQuIENoYW5nZWFibGUgYXR0cmlidXRlIGluY2x1ZGUgTkRUQV9USFJFU0hbMS0zXSwKKyAqIE5EVEFfR0NfSU5URVJWQUwsIGFuZCBhbGwgVExWcyBpbiBORFRBX1BBUk1TIHVubGVzcyBtYXJrZWQKKyAqIG90aGVyd2lzZS4gRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlciBzZXRzIGNhbiBiZSBjaGFuZ2VkIGJ5CisgKiBzZXR0aW5nIE5EVFBBX0lGSU5ERVggdG8gdGhlIGludGVyZmFjZSBpbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZworICogZGV2aWNlLgorICoqKiovCisKK3N0cnVjdCBuZHRfc3RhdHMKK3sKKwlfX3U2NAkJbmR0c19hbGxvY3M7CisJX191NjQJCW5kdHNfZGVzdHJveXM7CisJX191NjQJCW5kdHNfaGFzaF9ncm93czsKKwlfX3U2NAkJbmR0c19yZXNfZmFpbGVkOworCV9fdTY0CQluZHRzX2xvb2t1cHM7CisJX191NjQJCW5kdHNfaGl0czsKKwlfX3U2NAkJbmR0c19yY3ZfcHJvYmVzX21jYXN0OworCV9fdTY0CQluZHRzX3Jjdl9wcm9iZXNfdWNhc3Q7CisJX191NjQJCW5kdHNfcGVyaW9kaWNfZ2NfcnVuczsKKwlfX3U2NAkJbmR0c19mb3JjZWRfZ2NfcnVuczsKK307CisKK2VudW0geworCU5EVFBBX1VOU1BFQywKKwlORFRQQV9JRklOREVYLAkJCS8qIHUzMiwgdW5jaGFuZ2VhYmxlICovCisJTkRUUEFfUkVGQ05ULAkJCS8qIHUzMiwgcmVhZC1vbmx5ICovCisJTkRUUEFfUkVBQ0hBQkxFX1RJTUUsCQkvKiB1NjQsIHJlYWQtb25seSwgbXNlY3MgKi8KKwlORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FLAkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUkVUUkFOU19USU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX0dDX1NUQUxFVElNRSwJCS8qIHU2NCwgbXNlY3MgKi8KKwlORFRQQV9ERUxBWV9QUk9CRV9USU1FLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1FVRVVFX0xFTiwJCS8qIHUzMiAqLworCU5EVFBBX0FQUF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9VQ0FTVF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9NQ0FTVF9QUk9CRVMsCQkvKiB1MzIgKi8KKwlORFRQQV9BTllDQVNUX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1BST1hZX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLworCU5EVFBBX1BST1hZX1FMRU4sCQkvKiB1MzIgKi8KKwlORFRQQV9MT0NLVElNRSwJCQkvKiB1NjQsIG1zZWNzICovCisJX19ORFRQQV9NQVgKK307CisjZGVmaW5lIE5EVFBBX01BWCAoX19ORFRQQV9NQVggLSAxKQorCitzdHJ1Y3QgbmR0bXNnCit7CisJX191OAkJbmR0bV9mYW1pbHk7CisJX191OAkJbmR0bV9wYWQxOworCV9fdTE2CQluZHRtX3BhZDI7Cit9OworCitzdHJ1Y3QgbmR0X2NvbmZpZworeworCV9fdTE2CQluZHRjX2tleV9sZW47CisJX191MTYJCW5kdGNfZW50cnlfc2l6ZTsKKwlfX3UzMgkJbmR0Y19lbnRyaWVzOworCV9fdTMyCQluZHRjX2xhc3RfZmx1c2g7CS8qIGRlbHRhIHRvIG5vdyBpbiBtc2VjcyAqLworCV9fdTMyCQluZHRjX2xhc3RfcmFuZDsJCS8qIGRlbHRhIHRvIG5vdyBpbiBtc2VjcyAqLworCV9fdTMyCQluZHRjX2hhc2hfcm5kOworCV9fdTMyCQluZHRjX2hhc2hfbWFzazsKKwlfX3UzMgkJbmR0Y19oYXNoX2NoYWluX2djOworCV9fdTMyCQluZHRjX3Byb3h5X3FsZW47Cit9OworCitlbnVtIHsKKwlORFRBX1VOU1BFQywKKwlORFRBX05BTUUsCQkJLyogY2hhciAqLCB1bmNoYW5nZWFibGUgKi8KKwlORFRBX1RIUkVTSDEsCQkJLyogdTMyICovCisJTkRUQV9USFJFU0gyLAkJCS8qIHUzMiAqLworCU5EVEFfVEhSRVNIMywJCQkvKiB1MzIgKi8KKwlORFRBX0NPTkZJRywJCQkvKiBzdHJ1Y3QgbmR0X2NvbmZpZywgcmVhZC1vbmx5ICovCisJTkRUQV9QQVJNUywJCQkvKiBuZXN0ZWQgVExWIE5EVFBBXyogKi8KKwlORFRBX1NUQVRTLAkJCS8qIHN0cnVjdCBuZHRfc3RhdHMsIHJlYWQtb25seSAqLworCU5EVEFfR0NfSU5URVJWQUwsCQkvKiB1NjQsIG1zZWNzICovCisJX19ORFRBX01BWAorfTsKKyNkZWZpbmUgTkRUQV9NQVggKF9fTkRUQV9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWVhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTT0NLRVQgbmV0d29yayBhY2Nlc3MgcHJvdG9jb2wuCisgKgkJVGhpcyBpcyB0aGUgbWFzdGVyIGhlYWRlciBmaWxlIGZvciB0aGUgTGludXggTkVUIGxheWVyLAorICoJCW9yLCBpbiBwbGFpbiBFbmdsaXNoOiB0aGUgbmV0d29ya2luZyBoYW5kbGluZyBwYXJ0IG9mIHRoZQorICoJCWtlcm5lbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpbmV0LmgJMS4wLjMJMDUvMjUvOTMKKyAqCisgKiBBdXRob3JzOglPcmVzdCBaYm9yb3dza2ksIDxvYnpAS29kYWsuQ09NPgorICoJCVJvc3MgQmlybworICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9ORVRfSAorI2RlZmluZSBfTElOVVhfTkVUX0gKKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vc29ja2V0Lmg+CisKK3N0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdDsKK3N0cnVjdCBpbm9kZTsKK3N0cnVjdCBuZXQ7CisKKyNkZWZpbmUgTlBST1RPCQkzNAkJLyogc2hvdWxkIGJlIGVub3VnaCBmb3Igbm93Li4JKi8KKworI2RlZmluZSBTWVNfU09DS0VUCTEJCS8qIHN5c19zb2NrZXQoMikJCSovCisjZGVmaW5lIFNZU19CSU5ECTIJCS8qIHN5c19iaW5kKDIpCQkJKi8KKyNkZWZpbmUgU1lTX0NPTk5FQ1QJMwkJLyogc3lzX2Nvbm5lY3QoMikJCSovCisjZGVmaW5lIFNZU19MSVNURU4JNAkJLyogc3lzX2xpc3RlbigyKQkJKi8KKyNkZWZpbmUgU1lTX0FDQ0VQVAk1CQkvKiBzeXNfYWNjZXB0KDIpCQkqLworI2RlZmluZSBTWVNfR0VUU09DS05BTUUJNgkJLyogc3lzX2dldHNvY2tuYW1lKDIpCQkqLworI2RlZmluZSBTWVNfR0VUUEVFUk5BTUUJNwkJLyogc3lzX2dldHBlZXJuYW1lKDIpCQkqLworI2RlZmluZSBTWVNfU09DS0VUUEFJUgk4CQkvKiBzeXNfc29ja2V0cGFpcigyKQkJKi8KKyNkZWZpbmUgU1lTX1NFTkQJOQkJLyogc3lzX3NlbmQoMikJCQkqLworI2RlZmluZSBTWVNfUkVDVgkxMAkJLyogc3lzX3JlY3YoMikJCQkqLworI2RlZmluZSBTWVNfU0VORFRPCTExCQkvKiBzeXNfc2VuZHRvKDIpCQkqLworI2RlZmluZSBTWVNfUkVDVkZST00JMTIJCS8qIHN5c19yZWN2ZnJvbSgyKQkJKi8KKyNkZWZpbmUgU1lTX1NIVVRET1dOCTEzCQkvKiBzeXNfc2h1dGRvd24oMikJCSovCisjZGVmaW5lIFNZU19TRVRTT0NLT1BUCTE0CQkvKiBzeXNfc2V0c29ja29wdCgyKQkJKi8KKyNkZWZpbmUgU1lTX0dFVFNPQ0tPUFQJMTUJCS8qIHN5c19nZXRzb2Nrb3B0KDIpCQkqLworI2RlZmluZSBTWVNfU0VORE1TRwkxNgkJLyogc3lzX3NlbmRtc2coMikJCSovCisjZGVmaW5lIFNZU19SRUNWTVNHCTE3CQkvKiBzeXNfcmVjdm1zZygyKQkJKi8KKwordHlwZWRlZiBlbnVtIHsKKwlTU19GUkVFID0gMCwJCQkvKiBub3QgYWxsb2NhdGVkCQkqLworCVNTX1VOQ09OTkVDVEVELAkJCS8qIHVuY29ubmVjdGVkIHRvIGFueSBzb2NrZXQJKi8KKwlTU19DT05ORUNUSU5HLAkJCS8qIGluIHByb2Nlc3Mgb2YgY29ubmVjdGluZwkqLworCVNTX0NPTk5FQ1RFRCwJCQkvKiBjb25uZWN0ZWQgdG8gc29ja2V0CQkqLworCVNTX0RJU0NPTk5FQ1RJTkcJCS8qIGluIHByb2Nlc3Mgb2YgZGlzY29ubmVjdGluZwkqLworfSBzb2NrZXRfc3RhdGU7CisKKyNkZWZpbmUgX19TT19BQ0NFUFRDT04JKDEgPDwgMTYpCS8qIHBlcmZvcm1lZCBhIGxpc3RlbgkJKi8KKworI2VuZGlmCS8qIF9MSU5VWF9ORVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNjY3MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJRGVmaW5pdGlvbnMgZm9yIHRoZSBJbnRlcmZhY2VzIGhhbmRsZXIuCisgKgorICogVmVyc2lvbjoJQCgjKWRldi5oCTEuMC4xMAkwOC8xMi85MworICoKKyAqIEF1dGhvcnM6CVJvc3MgQmlybworICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCUNvcmV5IE1pbnlhcmQgPHdmLXJjaCFtaW55YXJkQHJlbGF5LkVVLm5ldD4KKyAqCQlEb25hbGQgSi4gQmVja2VyLCA8YmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292PgorICoJCUFsYW4gQ294LCA8QWxhbi5Db3hAbGludXgub3JnPgorICoJCUJqb3JuIEVrd2FsbC4gPGJqMHJuQGJsb3guc2U+CisgKiAgICAgICAgICAgICAgUGVra2EgUmlpa29uZW4gPHByaWlrb25lQHBvc2VpZG9uLnBzcHQuZmk+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJCU1vdmVkIHRvIC91c3IvaW5jbHVkZS9saW51eCBmb3IgTkVUMworICovCisjaWZuZGVmIF9MSU5VWF9ORVRERVZJQ0VfSAorI2RlZmluZSBfTElOVVhfTkVUREVWSUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKworCisjZGVmaW5lIE1BWF9BRERSX0xFTgkzMgkJLyogTGFyZ2VzdCBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCisvKiBEcml2ZXIgdHJhbnNtaXQgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIE5FVERFVl9UWF9PSyAwCQkvKiBkcml2ZXIgdG9vayBjYXJlIG9mIHBhY2tldCAqLworI2RlZmluZSBORVRERVZfVFhfQlVTWSAxCS8qIGRyaXZlciB0eCBwYXRoIHdhcyBidXN5Ki8KKyNkZWZpbmUgTkVUREVWX1RYX0xPQ0tFRCAtMQkvKiBkcml2ZXIgdHggbG9jayB3YXMgYWxyZWFkeSB0YWtlbiAqLworCisvKgorICoJQ29tcHV0ZSB0aGUgd29yc3QgY2FzZSBoZWFkZXIgbGVuZ3RoIGFjY29yZGluZyB0byB0aGUgcHJvdG9jb2xzCisgKgl1c2VkLgorICovCisgCisjaWYgIWRlZmluZWQoQ09ORklHX0FYMjUpICYmICFkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkgJiYgIWRlZmluZWQoQ09ORklHX1RSKQorI2RlZmluZSBMTF9NQVhfSEVBREVSCTMyCisjZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorI2RlZmluZSBMTF9NQVhfSEVBREVSCTk2CisjZWxzZQorI2RlZmluZSBMTF9NQVhfSEVBREVSCTQ4CisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX05FVF9JUElQKSAmJiAhZGVmaW5lZChDT05GSUdfTkVUX0lQSVBfTU9EVUxFKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX05FVF9JUEdSRSkgJiYgICFkZWZpbmVkKENPTkZJR19ORVRfSVBHUkVfTU9EVUxFKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX0lQVjZfU0lUKSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX0lQVjZfVFVOTkVMKSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9UVU5ORUxfTU9EVUxFKQorI2RlZmluZSBNQVhfSEVBREVSIExMX01BWF9IRUFERVIKKyNlbHNlCisjZGVmaW5lIE1BWF9IRUFERVIgKExMX01BWF9IRUFERVIgKyA0OCkKKyNlbmRpZgorCitzdHJ1Y3QgbmV0X2RldmljZV9zdWJxdWV1ZQoreworCS8qIEdpdmUgYSBjb250cm9sIHN0YXRlIGZvciBlYWNoIHF1ZXVlLiAgVGhpcyBzdHJ1Y3QgbWF5IGNvbnRhaW4KKwkgKiBwZXItcXVldWUgbG9ja3MgaW4gdGhlIGZ1dHVyZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nICAgc3RhdGU7Cit9OworCisvKgorICoJTmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcy4gQWtpbiB0byB0aGUgMi4wIGV0aGVyIHN0YXRzIGJ1dAorICoJd2l0aCBieXRlIGNvdW50ZXJzLgorICovCisgCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cworeworCXVuc2lnbmVkIGxvbmcJcnhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQJKi8KKwl1bnNpZ25lZCBsb25nCXR4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkCSovCisJdW5zaWduZWQgbG9uZwlyeF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkIAkqLworCXVuc2lnbmVkIGxvbmcJdHhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZAkqLworCXVuc2lnbmVkIGxvbmcJcnhfZXJyb3JzOwkJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCisJdW5zaWduZWQgbG9uZwl0eF9lcnJvcnM7CQkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisJdW5zaWduZWQgbG9uZwl0eF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCisJdW5zaWduZWQgbG9uZwltdWx0aWNhc3Q7CQkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworCXVuc2lnbmVkIGxvbmcJY29sbGlzaW9uczsKKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2xlbmd0aF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZwlyeF9vdmVyX2Vycm9yczsJCS8qIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwkqLworCXVuc2lnbmVkIGxvbmcJcnhfY3JjX2Vycm9yczsJCS8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IJKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2ZyYW1lX2Vycm9yczsJLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworCXVuc2lnbmVkIGxvbmcJcnhfZmlmb19lcnJvcnM7CQkvKiByZWN2J3IgZmlmbyBvdmVycnVuCQkqLworCXVuc2lnbmVkIGxvbmcJcnhfbWlzc2VkX2Vycm9yczsJLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldAkqLworCisJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJdW5zaWduZWQgbG9uZwl0eF9hYm9ydGVkX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXR4X2NhcnJpZXJfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJdHhfZmlmb19lcnJvcnM7CisJdW5zaWduZWQgbG9uZwl0eF9oZWFydGJlYXRfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJdHhfd2luZG93X2Vycm9yczsKKwkKKwkvKiBmb3IgY3NsaXAgZXRjICovCisJdW5zaWduZWQgbG9uZwlyeF9jb21wcmVzc2VkOworCXVuc2lnbmVkIGxvbmcJdHhfY29tcHJlc3NlZDsKK307CisKKworLyogTWVkaWEgc2VsZWN0aW9uIG9wdGlvbnMuICovCitlbnVtIHsKKyAgICAgICAgSUZfUE9SVF9VTktOT1dOID0gMCwKKyAgICAgICAgSUZfUE9SVF8xMEJBU0UyLAorICAgICAgICBJRl9QT1JUXzEwQkFTRVQsCisgICAgICAgIElGX1BPUlRfQVVJLAorICAgICAgICBJRl9QT1JUXzEwMEJBU0VULAorICAgICAgICBJRl9QT1JUXzEwMEJBU0VUWCwKKyAgICAgICAgSUZfUE9SVF8xMDBCQVNFRlgKK307CisKKworI2VuZGlmCS8qIF9MSU5VWF9ERVZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxNzYzNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKQEAgLTAsMCArMSwzMCBAQAorI2lmbmRlZiBfX0xJTlVYX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfTkVURklMVEVSX0gKKworCisvKiBSZXNwb25zZXMgZnJvbSBob29rIGZ1bmN0aW9ucy4gKi8KKyNkZWZpbmUgTkZfRFJPUCAwCisjZGVmaW5lIE5GX0FDQ0VQVCAxCisjZGVmaW5lIE5GX1NUT0xFTiAyCisjZGVmaW5lIE5GX1FVRVVFIDMKKyNkZWZpbmUgTkZfUkVQRUFUIDQKKyNkZWZpbmUgTkZfU1RPUCA1CisjZGVmaW5lIE5GX01BWF9WRVJESUNUIE5GX1NUT1AKKworLyogd2Ugb3ZlcmxvYWQgdGhlIGhpZ2hlciBiaXRzIGZvciBlbmNvZGluZyBhdXhpbGlhcnkgZGF0YSBzdWNoIGFzIHRoZSBxdWV1ZQorICogbnVtYmVyLiBOb3QgbmljZSwgYnV0IGJldHRlciB0aGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gYXJndW1lbnRzLiAqLworI2RlZmluZSBORl9WRVJESUNUX01BU0sgMHgwMDAwZmZmZgorI2RlZmluZSBORl9WRVJESUNUX0JJVFMgMTYKKworI2RlZmluZSBORl9WRVJESUNUX1FNQVNLIDB4ZmZmZjAwMDAKKyNkZWZpbmUgTkZfVkVSRElDVF9RQklUUyAxNgorCisjZGVmaW5lIE5GX1FVRVVFX05SKHgpICgoKHggPDwgTkZfVkVSRElDVF9RQklUUykgJiBORl9WRVJESUNUX1FNQVNLKSB8IE5GX1FVRVVFKQorCisvKiBvbmx5IGZvciB1c2Vyc3BhY2UgY29tcGF0aWJpbGl0eSAqLworLyogR2VuZXJpYyBjYWNoZSByZXNwb25zZXMgZnJvbSBob29rIGZ1bmN0aW9ucy4KKyAgIDw9IDB4MjAwMCBpcyB1c2VkIGZvciBwcm90b2NvbC1mbGFncy4gKi8KKyNkZWZpbmUgTkZDX1VOS05PV04gMHg0MDAwCisjZGVmaW5lIE5GQ19BTFRFUkVEIDB4ODAwMAorCisjZW5kaWYgLypfX0xJTlVYX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjU4MzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQwIEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfQ09NTU9OX0gKKyNkZWZpbmUgX05GX0NPTk5UUkFDS19DT01NT05fSAorLyogQ29ubmVjdGlvbiBzdGF0ZSB0cmFja2luZyBmb3IgbmV0ZmlsdGVyLiAgVGhpcyBpcyBzZXBhcmF0ZWQgZnJvbSwKKyAgIGJ1dCByZXF1aXJlZCBieSwgdGhlIE5BVCBsYXllcjsgaXQgY2FuIGFsc28gYmUgdXNlZCBieSBhbiBpcHRhYmxlcworICAgZXh0ZW5zaW9uLiAqLworZW51bSBpcF9jb25udHJhY2tfaW5mbworeworCS8qIFBhcnQgb2YgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiAoZWl0aGVyIGRpcmVjdGlvbikuICovCisJSVBfQ1RfRVNUQUJMSVNIRUQsCisKKwkvKiBMaWtlIE5FVywgYnV0IHJlbGF0ZWQgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgb3IgSUNNUCBlcnJvcgorCSAgIChpbiBlaXRoZXIgZGlyZWN0aW9uKS4gKi8KKwlJUF9DVF9SRUxBVEVELAorCisJLyogU3RhcnRlZCBhIG5ldyBjb25uZWN0aW9uIHRvIHRyYWNrIChvbmx5CisgICAgICAgICAgIElQX0NUX0RJUl9PUklHSU5BTCk7IG1heSBiZSBhIHJldHJhbnNtaXNzaW9uLiAqLworCUlQX0NUX05FVywKKworCS8qID49IHRoaXMgaW5kaWNhdGVzIHJlcGx5IGRpcmVjdGlvbiAqLworCUlQX0NUX0lTX1JFUExZLAorCisJLyogTnVtYmVyIG9mIGRpc3RpbmN0IElQX0NUIHR5cGVzIChubyBORVcgaW4gcmVwbHkgZGlybikuICovCisJSVBfQ1RfTlVNQkVSID0gSVBfQ1RfSVNfUkVQTFkgKiAyIC0gMQorfTsKKworLyogQml0c2V0IHJlcHJlc2VudGluZyBzdGF0dXMgb2YgY29ubmVjdGlvbi4gKi8KK2VudW0gaXBfY29ubnRyYWNrX3N0YXR1cyB7CisJLyogSXQncyBhbiBleHBlY3RlZCBjb25uZWN0aW9uOiBiaXQgMCBzZXQuICBUaGlzIGJpdCBuZXZlciBjaGFuZ2VkICovCisJSVBTX0VYUEVDVEVEX0JJVCA9IDAsCisJSVBTX0VYUEVDVEVEID0gKDEgPDwgSVBTX0VYUEVDVEVEX0JJVCksCisKKwkvKiBXZSd2ZSBzZWVuIHBhY2tldHMgYm90aCB3YXlzOiBiaXQgMSBzZXQuICBDYW4gYmUgc2V0LCBub3QgdW5zZXQuICovCisJSVBTX1NFRU5fUkVQTFlfQklUID0gMSwKKwlJUFNfU0VFTl9SRVBMWSA9ICgxIDw8IElQU19TRUVOX1JFUExZX0JJVCksCisKKwkvKiBDb25udHJhY2sgc2hvdWxkIG5ldmVyIGJlIGVhcmx5LWV4cGlyZWQuICovCisJSVBTX0FTU1VSRURfQklUID0gMiwKKwlJUFNfQVNTVVJFRCA9ICgxIDw8IElQU19BU1NVUkVEX0JJVCksCisKKwkvKiBDb25uZWN0aW9uIGlzIGNvbmZpcm1lZDogb3JpZ2luYXRpbmcgcGFja2V0IGhhcyBsZWZ0IGJveCAqLworCUlQU19DT05GSVJNRURfQklUID0gMywKKwlJUFNfQ09ORklSTUVEID0gKDEgPDwgSVBTX0NPTkZJUk1FRF9CSVQpLAorCisJLyogQ29ubmVjdGlvbiBuZWVkcyBzcmMgbmF0IGluIG9yaWcgZGlyLiAgVGhpcyBiaXQgbmV2ZXIgY2hhbmdlZC4gKi8KKwlJUFNfU1JDX05BVF9CSVQgPSA0LAorCUlQU19TUkNfTkFUID0gKDEgPDwgSVBTX1NSQ19OQVRfQklUKSwKKworCS8qIENvbm5lY3Rpb24gbmVlZHMgZHN0IG5hdCBpbiBvcmlnIGRpci4gIFRoaXMgYml0IG5ldmVyIGNoYW5nZWQuICovCisJSVBTX0RTVF9OQVRfQklUID0gNSwKKwlJUFNfRFNUX05BVCA9ICgxIDw8IElQU19EU1RfTkFUX0JJVCksCisKKwkvKiBCb3RoIHRvZ2V0aGVyLiAqLworCUlQU19OQVRfTUFTSyA9IChJUFNfRFNUX05BVCB8IElQU19TUkNfTkFUKSwKKworCS8qIENvbm5lY3Rpb24gbmVlZHMgVENQIHNlcXVlbmNlIGFkanVzdGVkLiAqLworCUlQU19TRVFfQURKVVNUX0JJVCA9IDYsCisJSVBTX1NFUV9BREpVU1QgPSAoMSA8PCBJUFNfU0VRX0FESlVTVF9CSVQpLAorCisJLyogTkFUIGluaXRpYWxpemF0aW9uIGJpdHMuICovCisJSVBTX1NSQ19OQVRfRE9ORV9CSVQgPSA3LAorCUlQU19TUkNfTkFUX0RPTkUgPSAoMSA8PCBJUFNfU1JDX05BVF9ET05FX0JJVCksCisKKwlJUFNfRFNUX05BVF9ET05FX0JJVCA9IDgsCisJSVBTX0RTVF9OQVRfRE9ORSA9ICgxIDw8IElQU19EU1RfTkFUX0RPTkVfQklUKSwKKworCS8qIEJvdGggdG9nZXRoZXIgKi8KKwlJUFNfTkFUX0RPTkVfTUFTSyA9IChJUFNfRFNUX05BVF9ET05FIHwgSVBTX1NSQ19OQVRfRE9ORSksCisKKwkvKiBDb25uZWN0aW9uIGlzIGR5aW5nIChyZW1vdmVkIGZyb20gbGlzdHMpLCBjYW4gbm90IGJlIHVuc2V0LiAqLworCUlQU19EWUlOR19CSVQgPSA5LAorCUlQU19EWUlORyA9ICgxIDw8IElQU19EWUlOR19CSVQpLAorCisJLyogQ29ubmVjdGlvbiBoYXMgZml4ZWQgdGltZW91dC4gKi8KKwlJUFNfRklYRURfVElNRU9VVF9CSVQgPSAxMCwKKwlJUFNfRklYRURfVElNRU9VVCA9ICgxIDw8IElQU19GSVhFRF9USU1FT1VUX0JJVCksCit9OworCisvKiBDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50IGJpdHMgKi8KK2VudW0gaXBfY29ubnRyYWNrX2V2ZW50cworeworCS8qIE5ldyBjb25udHJhY2sgKi8KKwlJUENUX05FV19CSVQgPSAwLAorCUlQQ1RfTkVXID0gKDEgPDwgSVBDVF9ORVdfQklUKSwKKworCS8qIEV4cGVjdGVkIGNvbm5lY3Rpb24gKi8KKwlJUENUX1JFTEFURURfQklUID0gMSwKKwlJUENUX1JFTEFURUQgPSAoMSA8PCBJUENUX1JFTEFURURfQklUKSwKKworCS8qIERlc3Ryb3llZCBjb25udHJhY2sgKi8KKwlJUENUX0RFU1RST1lfQklUID0gMiwKKwlJUENUX0RFU1RST1kgPSAoMSA8PCBJUENUX0RFU1RST1lfQklUKSwKKworCS8qIFRpbWVyIGhhcyBiZWVuIHJlZnJlc2hlZCAqLworCUlQQ1RfUkVGUkVTSF9CSVQgPSAzLAorCUlQQ1RfUkVGUkVTSCA9ICgxIDw8IElQQ1RfUkVGUkVTSF9CSVQpLAorCisJLyogU3RhdHVzIGhhcyBjaGFuZ2VkICovCisJSVBDVF9TVEFUVVNfQklUID0gNCwKKwlJUENUX1NUQVRVUyA9ICgxIDw8IElQQ1RfU1RBVFVTX0JJVCksCisKKwkvKiBVcGRhdGUgb2YgcHJvdG9jb2wgaW5mbyAqLworCUlQQ1RfUFJPVE9JTkZPX0JJVCA9IDUsCisJSVBDVF9QUk9UT0lORk8gPSAoMSA8PCBJUENUX1BST1RPSU5GT19CSVQpLAorCisJLyogVm9sYXRpbGUgcHJvdG9jb2wgaW5mbyAqLworCUlQQ1RfUFJPVE9JTkZPX1ZPTEFUSUxFX0JJVCA9IDYsCisJSVBDVF9QUk9UT0lORk9fVk9MQVRJTEUgPSAoMSA8PCBJUENUX1BST1RPSU5GT19WT0xBVElMRV9CSVQpLAorCisJLyogTmV3IGhlbHBlciBmb3IgY29ubnRyYWNrICovCisJSVBDVF9IRUxQRVJfQklUID0gNywKKwlJUENUX0hFTFBFUiA9ICgxIDw8IElQQ1RfSEVMUEVSX0JJVCksCisKKwkvKiBVcGRhdGUgb2YgaGVscGVyIGluZm8gKi8KKwlJUENUX0hFTFBJTkZPX0JJVCA9IDgsCisJSVBDVF9IRUxQSU5GTyA9ICgxIDw8IElQQ1RfSEVMUElORk9fQklUKSwKKworCS8qIFZvbGF0aWxlIGhlbHBlciBpbmZvICovCisJSVBDVF9IRUxQSU5GT19WT0xBVElMRV9CSVQgPSA5LAorCUlQQ1RfSEVMUElORk9fVk9MQVRJTEUgPSAoMSA8PCBJUENUX0hFTFBJTkZPX1ZPTEFUSUxFX0JJVCksCisKKwkvKiBOQVQgaW5mbyAqLworCUlQQ1RfTkFUSU5GT19CSVQgPSAxMCwKKwlJUENUX05BVElORk8gPSAoMSA8PCBJUENUX05BVElORk9fQklUKSwKKworCS8qIENvdW50ZXIgaGlnaGVzdCBiaXQgaGFzIGJlZW4gc2V0ICovCisJSVBDVF9DT1VOVEVSX0ZJTExJTkdfQklUID0gMTEsCisJSVBDVF9DT1VOVEVSX0ZJTExJTkcgPSAoMSA8PCBJUENUX0NPVU5URVJfRklMTElOR19CSVQpLAorCisJLyogTWFyayBpcyBzZXQgKi8KKwlJUENUX01BUktfQklUID0gMTIsCisJSVBDVF9NQVJLID0gKDEgPDwgSVBDVF9NQVJLX0JJVCksCit9OworCitlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIHsKKwlJUEVYUF9ORVdfQklUID0gMCwKKwlJUEVYUF9ORVcgPSAoMSA8PCBJUEVYUF9ORVdfQklUKSwKK307CisKKworI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRiYjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX05GX0NPTk5UUkFDS19GVFBfSAorI2RlZmluZSBfTkZfQ09OTlRSQUNLX0ZUUF9ICisvKiBGVFAgdHJhY2tpbmcuICovCisKKy8qIFRoaXMgZW51bSBpcyBleHBvc2VkIHRvIHVzZXJzcGFjZSAqLworZW51bSBuZl9jdF9mdHBfdHlwZQoreworCS8qIFBPUlQgY29tbWFuZCBmcm9tIGNsaWVudCAqLworCU5GX0NUX0ZUUF9QT1JULAorCS8qIFBBU1YgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KKwlORl9DVF9GVFBfUEFTViwKKwkvKiBFUFJUIGNvbW1hbmQgZnJvbSBjbGllbnQgKi8KKwlORl9DVF9GVFBfRVBSVCwKKwkvKiBFUFNWIHJlc3BvbnNlIGZyb20gc2VydmVyICovCisJTkZfQ1RfRlRQX0VQU1YsCit9OworCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0ZUUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2N0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YyYzExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9ORl9DT05OVFJBQ0tfU0NUUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfU0NUUF9ICisvKiBTQ1RQIHRyYWNraW5nLiAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaD4KKworZW51bSBzY3RwX2Nvbm50cmFjayB7CisJU0NUUF9DT05OVFJBQ0tfTk9ORSwKKwlTQ1RQX0NPTk5UUkFDS19DTE9TRUQsCisJU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVQsCisJU0NUUF9DT05OVFJBQ0tfQ09PS0lFX0VDSE9FRCwKKwlTQ1RQX0NPTk5UUkFDS19FU1RBQkxJU0hFRCwKKwlTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9TRU5ULAorCVNDVFBfQ09OTlRSQUNLX1NIVVRET1dOX1JFQ0QsCisJU0NUUF9DT05OVFJBQ0tfU0hVVERPV05fQUNLX1NFTlQsCisJU0NUUF9DT05OVFJBQ0tfTUFYCit9OworCitzdHJ1Y3QgaXBfY3Rfc2N0cAoreworCWVudW0gc2N0cF9jb25udHJhY2sgc3RhdGU7CisKKwlfX2JlMzIgdnRhZ1tJUF9DVF9ESVJfTUFYXTsKKwl1X2ludDMyX3QgdHRhZ1tJUF9DVF9ESVJfTUFYXTsKK307CisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1NDVFBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWNlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1RDUF9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfVENQX0gKKy8qIFRDUCB0cmFja2luZy4gKi8KKworLyogVGhpcyBpcyBleHBvc2VkIHRvIHVzZXJzcGFjZSAoY3RuZXRsaW5rKSAqLworZW51bSB0Y3BfY29ubnRyYWNrIHsKKwlUQ1BfQ09OTlRSQUNLX05PTkUsCisJVENQX0NPTk5UUkFDS19TWU5fU0VOVCwKKwlUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWLAorCVRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQsCisJVENQX0NPTk5UUkFDS19GSU5fV0FJVCwKKwlUQ1BfQ09OTlRSQUNLX0NMT1NFX1dBSVQsCisJVENQX0NPTk5UUkFDS19MQVNUX0FDSywKKwlUQ1BfQ09OTlRSQUNLX1RJTUVfV0FJVCwKKwlUQ1BfQ09OTlRSQUNLX0NMT1NFLAorCVRDUF9DT05OVFJBQ0tfTElTVEVOLAorCVRDUF9DT05OVFJBQ0tfTUFYLAorCVRDUF9DT05OVFJBQ0tfSUdOT1JFCit9OworCisvKiBXaW5kb3cgc2NhbGluZyBpcyBhZHZlcnRpc2VkIGJ5IHRoZSBzZW5kZXIgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfV0lORE9XX1NDQUxFCQkweDAxCisKKy8qIFNBQ0sgaXMgcGVybWl0dGVkIGJ5IHRoZSBzZW5kZXIgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfU0FDS19QRVJNCQkweDAyCisKKy8qIFRoaXMgc2VuZGVyIHNlbnQgRklOIGZpcnN0ICovCisjZGVmaW5lIElQX0NUX1RDUF9GTEFHX0NMT1NFX0lOSVQJCTB4MDQKKworLyogQmUgbGliZXJhbCBpbiB3aW5kb3cgY2hlY2tpbmcgKi8KKyNkZWZpbmUgSVBfQ1RfVENQX0ZMQUdfQkVfTElCRVJBTAkJMHgwOAorCitzdHJ1Y3QgbmZfY3RfdGNwX2ZsYWdzIHsKKwl1X2ludDhfdCBmbGFnczsKKwl1X2ludDhfdCBtYXNrOworfTsKKworCisjZW5kaWYgLyogX05GX0NPTk5UUkFDS19UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTQ1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfTkZfQ09OTlRSQUNLX1RVUExFX0NPTU1PTl9ICisjZGVmaW5lIF9ORl9DT05OVFJBQ0tfVFVQTEVfQ09NTU9OX0gKKworZW51bSBpcF9jb25udHJhY2tfZGlyCit7CisJSVBfQ1RfRElSX09SSUdJTkFMLAorCUlQX0NUX0RJUl9SRVBMWSwKKwlJUF9DVF9ESVJfTUFYCit9OworCisjZGVmaW5lIENUSU5GTzJESVIoY3RpbmZvKSAoKGN0aW5mbykgPj0gSVBfQ1RfSVNfUkVQTFkgPyBJUF9DVF9ESVJfUkVQTFkgOiBJUF9DVF9ESVJfT1JJR0lOQUwpCisKKyNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1RVUExFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWVmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIF9ORk5FVExJTktfSAorI2RlZmluZSBfTkZORVRMSU5LX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29tcGF0Lmg+CisKK2VudW0gbmZuZXRsaW5rX2dyb3VwcyB7CisJTkZOTEdSUF9OT05FLAorI2RlZmluZSBORk5MR1JQX05PTkUJCQlORk5MR1JQX05PTkUKKwlORk5MR1JQX0NPTk5UUkFDS19ORVcsCisjZGVmaW5lIE5GTkxHUlBfQ09OTlRSQUNLX05FVwkJTkZOTEdSUF9DT05OVFJBQ0tfTkVXCisJTkZOTEdSUF9DT05OVFJBQ0tfVVBEQVRFLAorI2RlZmluZSBORk5MR1JQX0NPTk5UUkFDS19VUERBVEUJTkZOTEdSUF9DT05OVFJBQ0tfVVBEQVRFCisJTkZOTEdSUF9DT05OVFJBQ0tfREVTVFJPWSwKKyNkZWZpbmUgTkZOTEdSUF9DT05OVFJBQ0tfREVTVFJPWQlORk5MR1JQX0NPTk5UUkFDS19ERVNUUk9ZCisJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX05FVywKKyNkZWZpbmUJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX05FVwlORk5MR1JQX0NPTk5UUkFDS19FWFBfTkVXCisJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX1VQREFURSwKKyNkZWZpbmUgTkZOTEdSUF9DT05OVFJBQ0tfRVhQX1VQREFURQlORk5MR1JQX0NPTk5UUkFDS19FWFBfVVBEQVRFCisJTkZOTEdSUF9DT05OVFJBQ0tfRVhQX0RFU1RST1ksCisjZGVmaW5lIE5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ERVNUUk9ZCU5GTkxHUlBfQ09OTlRSQUNLX0VYUF9ERVNUUk9ZCisJX19ORk5MR1JQX01BWCwKK307CisjZGVmaW5lIE5GTkxHUlBfTUFYCShfX05GTkxHUlBfTUFYIC0gMSkKKworLyogR2VuZXJhbCBmb3JtIG9mIGFkZHJlc3MgZmFtaWx5IGRlcGVuZGVudCBtZXNzYWdlLgorICovCitzdHJ1Y3QgbmZnZW5tc2cgeworCXVfaW50OF90ICBuZmdlbl9mYW1pbHk7CQkvKiBBRl94eHggKi8KKwl1X2ludDhfdCAgdmVyc2lvbjsJCS8qIG5mbmV0bGluayB2ZXJzaW9uICovCisJX19iZTE2ICAgIHJlc19pZDsJCS8qIHJlc291cmNlIGlkICovCit9OworCisjZGVmaW5lIE5GTkVUTElOS19WMAkwCisKKy8qIG5ldGZpbHRlciBuZXRsaW5rIG1lc3NhZ2UgdHlwZXMgYXJlIHNwbGl0IGluIHR3byBwaWVjZXM6CisgKiA4IGJpdCBzdWJzeXN0ZW0sIDhiaXQgb3BlcmF0aW9uLgorICovCisKKyNkZWZpbmUgTkZOTF9TVUJTWVNfSUQoeCkJKCh4ICYgMHhmZjAwKSA+PiA4KQorI2RlZmluZSBORk5MX01TR19UWVBFKHgpCSh4ICYgMHgwMGZmKQorCisvKiBObyBlbnVtIGhlcmUsIG90aGVyd2lzZSBfX3N0cmluZ2lmeSgpIHRyaWNrIG9mIE1PRFVMRV9BTElBU19ORk5MX1NVQlNZUygpCisgKiB3b24ndCB3b3JrIGFueW1vcmUgKi8KKyNkZWZpbmUgTkZOTF9TVUJTWVNfTk9ORSAJCTAKKyNkZWZpbmUgTkZOTF9TVUJTWVNfQ1RORVRMSU5LCQkxCisjZGVmaW5lIE5GTkxfU1VCU1lTX0NUTkVUTElOS19FWFAJMgorI2RlZmluZSBORk5MX1NVQlNZU19RVUVVRQkJMworI2RlZmluZSBORk5MX1NVQlNZU19VTE9HCQk0CisjZGVmaW5lIE5GTkxfU1VCU1lTX0NPVU5UCQk1CisKKyNlbmRpZgkvKiBfTkZORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb21wYXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE0MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2NvbXBhdC5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX05GTkVUTElOS19DT01QQVRfSAorI2RlZmluZSBfTkZORVRMSU5LX0NPTVBBVF9ICisjaWZuZGVmIF9fS0VSTkVMCisvKiBPbGQgbmZuZXRsaW5rIG1hY3JvcyBmb3IgdXNlcnNwYWNlICovCisKKy8qIG5mbmV0bGluayBncm91cHM6IFVwIHRvIDMyIG1heGltdW0gKi8KKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfTkVXIAkJMHgwMDAwMDAwMQorI2RlZmluZSBORl9ORVRMSU5LX0NPTk5UUkFDS19VUERBVEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfREVTVFJPWQkJMHgwMDAwMDAwNAorI2RlZmluZSBORl9ORVRMSU5LX0NPTk5UUkFDS19FWFBfTkVXCQkweDAwMDAwMDA4CisjZGVmaW5lIE5GX05FVExJTktfQ09OTlRSQUNLX0VYUF9VUERBVEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTkZfTkVUTElOS19DT05OVFJBQ0tfRVhQX0RFU1RST1kJMHgwMDAwMDAyMAorCisvKiBHZW5lcmljIHN0cnVjdHVyZSBmb3IgZW5jYXBzdWxhdGlvbiBvcHRpb25hbCBuZXRmaWx0ZXIgaW5mb3JtYXRpb24uCisgKiBJdCBpcyByZW1pbmlzY2VudCBvZiBzb2NrYWRkciwgYnV0IHdpdGggc2FfZmFtaWx5IHJlcGxhY2VkCisgKiB3aXRoIGF0dHJpYnV0ZSB0eXBlLgorICogISBUaGlzIHNob3VsZCBzb21lZGF5IGJlIHB1dCBzb21ld2hlcmUgZ2VuZXJpYyBhcyBub3cgcnRuZXRsaW5rIGFuZAorICogISBuZm5ldGxpbmsgdXNlIHRoZSBzYW1lIGF0dHJpYnV0ZXMgbWV0aG9kcy4gLSBKLiBTY2h1bGlzdC4KKyAqLworCitzdHJ1Y3QgbmZhdHRyCit7CisJdV9pbnQxNl90IG5mYV9sZW47CisJdV9pbnQxNl90IG5mYV90eXBlOwkvKiB3ZSB1c2UgMTUgYml0cyBmb3IgdGhlIHR5cGUsIGFuZCB0aGUgaGlnaGVzdAorCQkJCSAqIGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBwYXlsb2FkIGlzIG5lc3RlZCAqLworfTsKKworLyogRklYTUU6IEFwYXJ0IGZyb20gTkZOTF9ORkFfTkVTVEVEIHNoYW1lbGVzc2x5IGNvcHkgYW5kIHBhc3RlZCBmcm9tCisgKiBydG5ldGxpbmsuaCwgaXQncyB0aW1lIHRvIHB1dCB0aGlzIGluIGEgZ2VuZXJpYyBmaWxlICovCisKKyNkZWZpbmUgTkZOTF9ORkFfTkVTVAkweDgwMDAKKyNkZWZpbmUgTkZBX1RZUEUoYXR0cikgCSgoYXR0ciktPm5mYV90eXBlICYgMHg3ZmZmKQorCisjZGVmaW5lIE5GQV9BTElHTlRPICAgICA0CisjZGVmaW5lIE5GQV9BTElHTihsZW4pCSgoKGxlbikgKyBORkFfQUxJR05UTyAtIDEpICYgfihORkFfQUxJR05UTyAtIDEpKQorI2RlZmluZSBORkFfT0sobmZhLGxlbikJKChsZW4pID4gMCAmJiAobmZhKS0+bmZhX2xlbiA+PSBzaXplb2Yoc3RydWN0IG5mYXR0cikgXAorCSYmIChuZmEpLT5uZmFfbGVuIDw9IChsZW4pKQorI2RlZmluZSBORkFfTkVYVChuZmEsYXR0cmxlbikJKChhdHRybGVuKSAtPSBORkFfQUxJR04oKG5mYSktPm5mYV9sZW4pLCBcCisJKHN0cnVjdCBuZmF0dHIgKikoKChjaGFyICopKG5mYSkpICsgTkZBX0FMSUdOKChuZmEpLT5uZmFfbGVuKSkpCisjZGVmaW5lIE5GQV9MRU5HVEgobGVuKQkoTkZBX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZhdHRyKSkgKyAobGVuKSkKKyNkZWZpbmUgTkZBX1NQQUNFKGxlbikJTkZBX0FMSUdOKE5GQV9MRU5HVEgobGVuKSkKKyNkZWZpbmUgTkZBX0RBVEEobmZhKSAgICgodm9pZCAqKSgoKGNoYXIgKikobmZhKSkgKyBORkFfTEVOR1RIKDApKSkKKyNkZWZpbmUgTkZBX1BBWUxPQUQobmZhKSAoKGludCkoKG5mYSktPm5mYV9sZW4pIC0gTkZBX0xFTkdUSCgwKSkKKyNkZWZpbmUgTkZBX05FU1Qoc2tiLCB0eXBlKSBcCisoewlzdHJ1Y3QgbmZhdHRyICpfX3N0YXJ0ID0gKHN0cnVjdCBuZmF0dHIgKilza2JfdGFpbF9wb2ludGVyKHNrYik7IFwKKwlORkFfUFVUKHNrYiwgKE5GTkxfTkZBX05FU1QgfCB0eXBlKSwgMCwgTlVMTCk7IFwKKwlfX3N0YXJ0OyAgfSkKKyNkZWZpbmUgTkZBX05FU1RfRU5EKHNrYiwgc3RhcnQpIFwKKyh7ICAgICAgKHN0YXJ0KS0+bmZhX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtICh1bnNpZ25lZCBjaGFyICopKHN0YXJ0KTsgXAorICAgICAgICAoc2tiKS0+bGVuOyB9KQorI2RlZmluZSBORkFfTkVTVF9DQU5DRUwoc2tiLCBzdGFydCkgXAorKHsgICAgICBpZiAoc3RhcnQpIFwKKyAgICAgICAgICAgICAgICBza2JfdHJpbShza2IsICh1bnNpZ25lZCBjaGFyICopIChzdGFydCkgLSAoc2tiKS0+ZGF0YSk7IFwKKyAgICAgICAgLTE7IH0pCisKKyNkZWZpbmUgTkZNX05GQShuKSAgICAgICgoc3RydWN0IG5mYXR0ciAqKSgoKGNoYXIgKikobikpIFwKKyAgICAgICAgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkpKQorI2RlZmluZSBORk1fUEFZTE9BRChuKSAgTkxNU0dfUEFZTE9BRChuLCBzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkKKworI2VuZGlmIC8qICEgX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9ORk5FVExJTktfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZmYTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCkBAIC0wLDAgKzEsMTQxIEBACisjaWZuZGVmIF9JUENPTk5UUkFDS19ORVRMSU5LX0gKKyNkZWZpbmUgX0lQQ09OTlRSQUNLX05FVExJTktfSAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKworZW51bSBjbnRsX21zZ190eXBlcyB7CisJSVBDVE5MX01TR19DVF9ORVcsCisJSVBDVE5MX01TR19DVF9HRVQsCisJSVBDVE5MX01TR19DVF9ERUxFVEUsCisJSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVSTywKKworCUlQQ1ROTF9NU0dfTUFYCit9OworCitlbnVtIGN0bmxfZXhwX21zZ190eXBlcyB7CisJSVBDVE5MX01TR19FWFBfTkVXLAorCUlQQ1ROTF9NU0dfRVhQX0dFVCwKKwlJUENUTkxfTVNHX0VYUF9ERUxFVEUsCisKKwlJUENUTkxfTVNHX0VYUF9NQVgKK307CisKKworZW51bSBjdGF0dHJfdHlwZSB7CisJQ1RBX1VOU1BFQywKKwlDVEFfVFVQTEVfT1JJRywKKwlDVEFfVFVQTEVfUkVQTFksCisJQ1RBX1NUQVRVUywKKwlDVEFfUFJPVE9JTkZPLAorCUNUQV9IRUxQLAorCUNUQV9OQVRfU1JDLAorI2RlZmluZSBDVEFfTkFUCUNUQV9OQVRfU1JDCS8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisJQ1RBX1RJTUVPVVQsCisJQ1RBX01BUkssCisJQ1RBX0NPVU5URVJTX09SSUcsCisJQ1RBX0NPVU5URVJTX1JFUExZLAorCUNUQV9VU0UsCisJQ1RBX0lELAorCUNUQV9OQVRfRFNULAorCUNUQV9UVVBMRV9NQVNURVIsCisJX19DVEFfTUFYCit9OworI2RlZmluZSBDVEFfTUFYIChfX0NUQV9NQVggLSAxKQorCitlbnVtIGN0YXR0cl90dXBsZSB7CisJQ1RBX1RVUExFX1VOU1BFQywKKwlDVEFfVFVQTEVfSVAsCisJQ1RBX1RVUExFX1BST1RPLAorCV9fQ1RBX1RVUExFX01BWAorfTsKKyNkZWZpbmUgQ1RBX1RVUExFX01BWCAoX19DVEFfVFVQTEVfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfaXAgeworCUNUQV9JUF9VTlNQRUMsCisJQ1RBX0lQX1Y0X1NSQywKKwlDVEFfSVBfVjRfRFNULAorCUNUQV9JUF9WNl9TUkMsCisJQ1RBX0lQX1Y2X0RTVCwKKwlfX0NUQV9JUF9NQVgKK307CisjZGVmaW5lIENUQV9JUF9NQVggKF9fQ1RBX0lQX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX2w0cHJvdG8geworCUNUQV9QUk9UT19VTlNQRUMsCisJQ1RBX1BST1RPX05VTSwKKwlDVEFfUFJPVE9fU1JDX1BPUlQsCisJQ1RBX1BST1RPX0RTVF9QT1JULAorCUNUQV9QUk9UT19JQ01QX0lELAorCUNUQV9QUk9UT19JQ01QX1RZUEUsCisJQ1RBX1BST1RPX0lDTVBfQ09ERSwKKwlDVEFfUFJPVE9fSUNNUFY2X0lELAorCUNUQV9QUk9UT19JQ01QVjZfVFlQRSwKKwlDVEFfUFJPVE9fSUNNUFY2X0NPREUsCisJX19DVEFfUFJPVE9fTUFYCit9OworI2RlZmluZSBDVEFfUFJPVE9fTUFYIChfX0NUQV9QUk9UT19NQVggLSAxKQorCitlbnVtIGN0YXR0cl9wcm90b2luZm8geworCUNUQV9QUk9UT0lORk9fVU5TUEVDLAorCUNUQV9QUk9UT0lORk9fVENQLAorCV9fQ1RBX1BST1RPSU5GT19NQVgKK307CisjZGVmaW5lIENUQV9QUk9UT0lORk9fTUFYIChfX0NUQV9QUk9UT0lORk9fTUFYIC0gMSkKKworZW51bSBjdGF0dHJfcHJvdG9pbmZvX3RjcCB7CisJQ1RBX1BST1RPSU5GT19UQ1BfVU5TUEVDLAorCUNUQV9QUk9UT0lORk9fVENQX1NUQVRFLAorCUNUQV9QUk9UT0lORk9fVENQX1dTQ0FMRV9PUklHSU5BTCwKKwlDVEFfUFJPVE9JTkZPX1RDUF9XU0NBTEVfUkVQTFksCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfT1JJR0lOQUwsCisJQ1RBX1BST1RPSU5GT19UQ1BfRkxBR1NfUkVQTFksCisJX19DVEFfUFJPVE9JTkZPX1RDUF9NQVgKK307CisjZGVmaW5lIENUQV9QUk9UT0lORk9fVENQX01BWCAoX19DVEFfUFJPVE9JTkZPX1RDUF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9jb3VudGVycyB7CisJQ1RBX0NPVU5URVJTX1VOU1BFQywKKwlDVEFfQ09VTlRFUlNfUEFDS0VUUywJCS8qIG9sZCA2NGJpdCBjb3VudGVycyAqLworCUNUQV9DT1VOVEVSU19CWVRFUywJCS8qIG9sZCA2NGJpdCBjb3VudGVycyAqLworCUNUQV9DT1VOVEVSUzMyX1BBQ0tFVFMsCisJQ1RBX0NPVU5URVJTMzJfQllURVMsCisJX19DVEFfQ09VTlRFUlNfTUFYCit9OworI2RlZmluZSBDVEFfQ09VTlRFUlNfTUFYIChfX0NUQV9DT1VOVEVSU19NQVggLSAxKQorCitlbnVtIGN0YXR0cl9uYXQgeworCUNUQV9OQVRfVU5TUEVDLAorCUNUQV9OQVRfTUlOSVAsCisJQ1RBX05BVF9NQVhJUCwKKwlDVEFfTkFUX1BST1RPLAorCV9fQ1RBX05BVF9NQVgKK307CisjZGVmaW5lIENUQV9OQVRfTUFYIChfX0NUQV9OQVRfTUFYIC0gMSkKKworZW51bSBjdGF0dHJfcHJvdG9uYXQgeworCUNUQV9QUk9UT05BVF9VTlNQRUMsCisJQ1RBX1BST1RPTkFUX1BPUlRfTUlOLAorCUNUQV9QUk9UT05BVF9QT1JUX01BWCwKKwlfX0NUQV9QUk9UT05BVF9NQVgKK307CisjZGVmaW5lIENUQV9QUk9UT05BVF9NQVggKF9fQ1RBX1BST1RPTkFUX01BWCAtIDEpCisKK2VudW0gY3RhdHRyX2V4cGVjdCB7CisJQ1RBX0VYUEVDVF9VTlNQRUMsCisJQ1RBX0VYUEVDVF9NQVNURVIsCisJQ1RBX0VYUEVDVF9UVVBMRSwKKwlDVEFfRVhQRUNUX01BU0ssCisJQ1RBX0VYUEVDVF9USU1FT1VULAorCUNUQV9FWFBFQ1RfSUQsCisJQ1RBX0VYUEVDVF9IRUxQX05BTUUsCisJX19DVEFfRVhQRUNUX01BWAorfTsKKyNkZWZpbmUgQ1RBX0VYUEVDVF9NQVggKF9fQ1RBX0VYUEVDVF9NQVggLSAxKQorCitlbnVtIGN0YXR0cl9oZWxwIHsKKwlDVEFfSEVMUF9VTlNQRUMsCisJQ1RBX0hFTFBfTkFNRSwKKwlfX0NUQV9IRUxQX01BWAorfTsKKyNkZWZpbmUgQ1RBX0hFTFBfTUFYIChfX0NUQV9IRUxQX01BWCAtIDEpCisKKyNlbmRpZiAvKiBfSVBDT05OVFJBQ0tfTkVUTElOS19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NmFmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaApAQCAtMCwwICsxLDkyIEBACisjaWZuZGVmIF9ORk5FVExJTktfTE9HX0gKKyNkZWZpbmUgX05GTkVUTElOS19MT0dfSAorCisvKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBuZXRsaW5rIG1lc3NhZ2VzIChpLmUuICdwcm90b2NvbCBwYWNrZXRzJyksCisgKiBhbmQgbm90IGFueSBraW5kIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgSXQgaXMgc2hhcmVkIGJldHdlZW4ga2VybmVsIGFuZAorICogdXNlcnNwYWNlLiAgRG9uJ3QgcHV0IGtlcm5lbCBzcGVjaWZpYyBzdHVmZiBpbiBoZXJlICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaD4KKworZW51bSBuZnVsbmxfbXNnX3R5cGVzIHsKKwlORlVMTkxfTVNHX1BBQ0tFVCwJCS8qIHBhY2tldCBmcm9tIGtlcm5lbCB0byB1c2Vyc3BhY2UgKi8KKwlORlVMTkxfTVNHX0NPTkZJRywJCS8qIGNvbm5lY3QgdG8gYSBwYXJ0aWN1bGFyIHF1ZXVlICovCisKKwlORlVMTkxfTVNHX01BWAorfTsKKworc3RydWN0IG5mdWxubF9tc2dfcGFja2V0X2hkciB7CisJX19iZTE2CQlod19wcm90b2NvbDsJLyogaHcgcHJvdG9jb2wgKG5ldHdvcmsgb3JkZXIpICovCisJdV9pbnQ4X3QJaG9vazsJCS8qIG5ldGZpbHRlciBob29rICovCisJdV9pbnQ4X3QJX3BhZDsKK307CisKK3N0cnVjdCBuZnVsbmxfbXNnX3BhY2tldF9odyB7CisJX19iZTE2CQlod19hZGRybGVuOworCXVfaW50MTZfdAlfcGFkOworCXVfaW50OF90CWh3X2FkZHJbOF07Cit9OworCitzdHJ1Y3QgbmZ1bG5sX21zZ19wYWNrZXRfdGltZXN0YW1wIHsKKwlhbGlnbmVkX2JlNjQJc2VjOworCWFsaWduZWRfYmU2NAl1c2VjOworfTsKKworZW51bSBuZnVsbmxfYXR0cl90eXBlIHsKKwlORlVMQV9VTlNQRUMsCisJTkZVTEFfUEFDS0VUX0hEUiwKKwlORlVMQV9NQVJLLAkJCS8qIHVfaW50MzJfdCBuZm1hcmsgKi8KKwlORlVMQV9USU1FU1RBTVAsCQkvKiBuZnVsbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgKi8KKwlORlVMQV9JRklOREVYX0lOREVWLAkJLyogdV9pbnQzMl90IGlmaW5kZXggKi8KKwlORlVMQV9JRklOREVYX09VVERFViwJCS8qIHVfaW50MzJfdCBpZmluZGV4ICovCisJTkZVTEFfSUZJTkRFWF9QSFlTSU5ERVYsCS8qIHVfaW50MzJfdCBpZmluZGV4ICovCisJTkZVTEFfSUZJTkRFWF9QSFlTT1VUREVWLAkvKiB1X2ludDMyX3QgaWZpbmRleCAqLworCU5GVUxBX0hXQUREUiwJCQkvKiBuZnVsbmxfbXNnX3BhY2tldF9odyAqLworCU5GVUxBX1BBWUxPQUQsCQkJLyogb3BhcXVlIGRhdGEgcGF5bG9hZCAqLworCU5GVUxBX1BSRUZJWCwJCQkvKiBzdHJpbmcgcHJlZml4ICovCisJTkZVTEFfVUlELAkJCS8qIHVzZXIgaWQgb2Ygc29ja2V0ICovCisJTkZVTEFfU0VRLAkJCS8qIGluc3RhbmNlLWxvY2FsIHNlcXVlbmNlIG51bWJlciAqLworCU5GVUxBX1NFUV9HTE9CQUwsCQkvKiBnbG9iYWwgc2VxdWVuY2UgbnVtYmVyICovCisKKwlfX05GVUxBX01BWAorfTsKKyNkZWZpbmUgTkZVTEFfTUFYIChfX05GVUxBX01BWCAtIDEpCisKK2VudW0gbmZ1bG5sX21zZ19jb25maWdfY21kcyB7CisJTkZVTE5MX0NGR19DTURfTk9ORSwKKwlORlVMTkxfQ0ZHX0NNRF9CSU5ELAorCU5GVUxOTF9DRkdfQ01EX1VOQklORCwKKwlORlVMTkxfQ0ZHX0NNRF9QRl9CSU5ELAorCU5GVUxOTF9DRkdfQ01EX1BGX1VOQklORCwKK307CisKK3N0cnVjdCBuZnVsbmxfbXNnX2NvbmZpZ19jbWQgeworCXVfaW50OF90CWNvbW1hbmQ7CS8qIG5mdWxubF9tc2dfY29uZmlnX2NtZHMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbmZ1bG5sX21zZ19jb25maWdfbW9kZSB7CisJX19iZTMyCQljb3B5X3JhbmdlOworCXVfaW50OF90CWNvcHlfbW9kZTsKKwl1X2ludDhfdAlfcGFkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gbmZ1bG5sX2F0dHJfY29uZmlnIHsKKwlORlVMQV9DRkdfVU5TUEVDLAorCU5GVUxBX0NGR19DTUQsCQkJLyogbmZ1bG5sX21zZ19jb25maWdfY21kICovCisJTkZVTEFfQ0ZHX01PREUsCQkJLyogbmZ1bG5sX21zZ19jb25maWdfbW9kZSAqLworCU5GVUxBX0NGR19OTEJVRlNJWiwJCS8qIHVfaW50MzJfdCBidWZmZXIgc2l6ZSAqLworCU5GVUxBX0NGR19USU1FT1VULAkJLyogdV9pbnQzMl90IGluIDEvMTAwIHMgKi8KKwlORlVMQV9DRkdfUVRIUkVTSCwJCS8qIHVfaW50MzJfdCAqLworCU5GVUxBX0NGR19GTEFHUywJCS8qIHVfaW50MTZfdCAqLworCV9fTkZVTEFfQ0ZHX01BWAorfTsKKyNkZWZpbmUgTkZVTEFfQ0ZHX01BWCAoX19ORlVMQV9DRkdfTUFYIC0xKQorCisjZGVmaW5lIE5GVUxOTF9DT1BZX05PTkUJMHgwMAorI2RlZmluZSBORlVMTkxfQ09QWV9NRVRBCTB4MDEKKyNkZWZpbmUgTkZVTE5MX0NPUFlfUEFDS0VUCTB4MDIKKworI2RlZmluZSBORlVMTkxfQ0ZHX0ZfU0VRCTB4MDAwMQorI2RlZmluZSBORlVMTkxfQ0ZHX0ZfU0VRX0dMT0JBTAkweDAwMDIKKworI2VuZGlmIC8qIF9ORk5FVExJTktfTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlNzg5NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5oCkBAIC0wLDAgKzEsOTAgQEAKKyNpZm5kZWYgX05GTkVUTElOS19RVUVVRV9ICisjZGVmaW5lIF9ORk5FVExJTktfUVVFVUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CisKK2VudW0gbmZxbmxfbXNnX3R5cGVzIHsKKwlORlFOTF9NU0dfUEFDS0VULAkJLyogcGFja2V0IGZyb20ga2VybmVsIHRvIHVzZXJzcGFjZSAqLworCU5GUU5MX01TR19WRVJESUNULAkJLyogdmVyZGljdCBmcm9tIHVzZXJzcGFjZSB0byBrZXJuZWwgKi8KKwlORlFOTF9NU0dfQ09ORklHLAkJLyogY29ubmVjdCB0byBhIHBhcnRpY3VsYXIgcXVldWUgKi8KKworCU5GUU5MX01TR19NQVgKK307CisKK3N0cnVjdCBuZnFubF9tc2dfcGFja2V0X2hkciB7CisJX19iZTMyCQlwYWNrZXRfaWQ7CS8qIHVuaXF1ZSBJRCBvZiBwYWNrZXQgaW4gcXVldWUgKi8KKwlfX2JlMTYJCWh3X3Byb3RvY29sOwkvKiBodyBwcm90b2NvbCAobmV0d29yayBvcmRlcikgKi8KKwl1X2ludDhfdAlob29rOwkJLyogbmV0ZmlsdGVyIGhvb2sgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF9odyB7CisJX19iZTE2CQlod19hZGRybGVuOworCXVfaW50MTZfdAlfcGFkOworCXVfaW50OF90CWh3X2FkZHJbOF07Cit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF90aW1lc3RhbXAgeworCWFsaWduZWRfYmU2NAlzZWM7CisJYWxpZ25lZF9iZTY0CXVzZWM7Cit9OworCitlbnVtIG5mcW5sX2F0dHJfdHlwZSB7CisJTkZRQV9VTlNQRUMsCisJTkZRQV9QQUNLRVRfSERSLAorCU5GUUFfVkVSRElDVF9IRFIsCQkvKiBuZnFubF9tc2dfdmVyZGljdF9ocmQgKi8KKwlORlFBX01BUkssCQkJLyogdV9pbnQzMl90IG5mbWFyayAqLworCU5GUUFfVElNRVNUQU1QLAkJCS8qIG5mcW5sX21zZ19wYWNrZXRfdGltZXN0YW1wICovCisJTkZRQV9JRklOREVYX0lOREVWLAkJLyogdV9pbnQzMl90IGlmaW5kZXggKi8KKwlORlFBX0lGSU5ERVhfT1VUREVWLAkJLyogdV9pbnQzMl90IGlmaW5kZXggKi8KKwlORlFBX0lGSU5ERVhfUEhZU0lOREVWLAkJLyogdV9pbnQzMl90IGlmaW5kZXggKi8KKwlORlFBX0lGSU5ERVhfUEhZU09VVERFViwJLyogdV9pbnQzMl90IGlmaW5kZXggKi8KKwlORlFBX0hXQUREUiwJCQkvKiBuZnFubF9tc2dfcGFja2V0X2h3ICovCisJTkZRQV9QQVlMT0FELAkJCS8qIG9wYXF1ZSBkYXRhIHBheWxvYWQgKi8KKworCV9fTkZRQV9NQVgKK307CisjZGVmaW5lIE5GUUFfTUFYIChfX05GUUFfTUFYIC0gMSkKKworc3RydWN0IG5mcW5sX21zZ192ZXJkaWN0X2hkciB7CisJX19iZTMyIHZlcmRpY3Q7CisJX19iZTMyIGlkOworfTsKKworCitlbnVtIG5mcW5sX21zZ19jb25maWdfY21kcyB7CisJTkZRTkxfQ0ZHX0NNRF9OT05FLAorCU5GUU5MX0NGR19DTURfQklORCwKKwlORlFOTF9DRkdfQ01EX1VOQklORCwKKwlORlFOTF9DRkdfQ01EX1BGX0JJTkQsCisJTkZRTkxfQ0ZHX0NNRF9QRl9VTkJJTkQsCit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19jbWQgeworCXVfaW50OF90CWNvbW1hbmQ7CS8qIG5mcW5sX21zZ19jb25maWdfY21kcyAqLworCXVfaW50OF90CV9wYWQ7CisJX19iZTE2CQlwZjsJCS8qIEFGX3h4eCBmb3IgUEZfW1VOXUJJTkQgKi8KK307CisKK2VudW0gbmZxbmxfY29uZmlnX21vZGUgeworCU5GUU5MX0NPUFlfTk9ORSwKKwlORlFOTF9DT1BZX01FVEEsCisJTkZRTkxfQ09QWV9QQUNLRVQsCit9OworCitzdHJ1Y3QgbmZxbmxfbXNnX2NvbmZpZ19wYXJhbXMgeworCV9fYmUzMgkJY29weV9yYW5nZTsKKwl1X2ludDhfdAljb3B5X21vZGU7CS8qIGVudW0gbmZxbmxfY29uZmlnX21vZGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKK2VudW0gbmZxbmxfYXR0cl9jb25maWcgeworCU5GUUFfQ0ZHX1VOU1BFQywKKwlORlFBX0NGR19DTUQsCQkJLyogbmZxbmxfbXNnX2NvbmZpZ19jbWQgKi8KKwlORlFBX0NGR19QQVJBTVMsCQkvKiBuZnFubF9tc2dfY29uZmlnX3BhcmFtcyAqLworCU5GUUFfQ0ZHX1FVRVVFX01BWExFTiwJCS8qIHVfaW50MzJfdCAqLworCV9fTkZRQV9DRkdfTUFYCit9OworI2RlZmluZSBORlFBX0NGR19NQVggKF9fTkZRQV9DRkdfTUFYLTEpCisKKyNlbmRpZiAvKiBfTkZORVRMSU5LX1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmM2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIF9YX1RBQkxFU19ICisjZGVmaW5lIF9YX1RBQkxFU19ICisKKyNkZWZpbmUgWFRfRlVOQ1RJT05fTUFYTkFNRUxFTiAzMAorI2RlZmluZSBYVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisKK3N0cnVjdCB4dF9lbnRyeV9tYXRjaAoreworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50MTZfdCBtYXRjaF9zaXplOworCisJCQkvKiBVc2VkIGJ5IHVzZXJzcGFjZSAqLworCQkJY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwkJCXVfaW50OF90IHJldmlzaW9uOworCQl9IHVzZXI7CisJCXN0cnVjdCB7CisJCQl1X2ludDE2X3QgbWF0Y2hfc2l6ZTsKKworCQkJLyogVXNlZCBpbnNpZGUgdGhlIGtlcm5lbCAqLworCQkJc3RydWN0IHh0X21hdGNoICptYXRjaDsKKwkJfSBrZXJuZWw7CisKKwkJLyogVG90YWwgbGVuZ3RoICovCisJCXVfaW50MTZfdCBtYXRjaF9zaXplOworCX0gdTsKKworCXVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK307CisKK3N0cnVjdCB4dF9lbnRyeV90YXJnZXQKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDE2X3QgdGFyZ2V0X3NpemU7CisKKwkJCS8qIFVzZWQgYnkgdXNlcnNwYWNlICovCisJCQljaGFyIG5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKworCQkJdV9pbnQ4X3QgcmV2aXNpb247CisJCX0gdXNlcjsKKwkJc3RydWN0IHsKKwkJCXVfaW50MTZfdCB0YXJnZXRfc2l6ZTsKKworCQkJLyogVXNlZCBpbnNpZGUgdGhlIGtlcm5lbCAqLworCQkJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCQl9IGtlcm5lbDsKKworCQkvKiBUb3RhbCBsZW5ndGggKi8KKwkJdV9pbnQxNl90IHRhcmdldF9zaXplOworCX0gdTsKKworCXVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK307CisKKyNkZWZpbmUgWFRfVEFSR0VUX0lOSVQoX19uYW1lLCBfX3NpemUpCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLnRhcmdldC51LnVzZXIgPSB7CQkJCQkJICAgICAgIFwKKwkJLnRhcmdldF9zaXplCT0gWFRfQUxJR04oX19zaXplKSwJCQkgICAgICAgXAorCQkubmFtZQkJPSBfX25hbWUsCQkJCSAgICAgICBcCisJfSwJCQkJCQkJCSAgICAgICBcCit9CisKK3N0cnVjdCB4dF9zdGFuZGFyZF90YXJnZXQKK3sKKwlzdHJ1Y3QgeHRfZW50cnlfdGFyZ2V0IHRhcmdldDsKKwlpbnQgdmVyZGljdDsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX1JFVklTSU9OXyouICBSZXR1cm5zIGhpZ2hlc3QgcmV2aXNpb24KKyAqIGtlcm5lbCBzdXBwb3J0cywgaWYgPj0gcmV2aXNpb24uICovCitzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uCit7CisJY2hhciBuYW1lW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU4tMV07CisKKwl1X2ludDhfdCByZXZpc2lvbjsKK307CisKKy8qIENPTlRJTlVFIHZlcmRpY3QgZm9yIHRhcmdldHMgKi8KKyNkZWZpbmUgWFRfQ09OVElOVUUgMHhGRkZGRkZGRgorCisvKiBGb3Igc3RhbmRhcmQgdGFyZ2V0ICovCisjZGVmaW5lIFhUX1JFVFVSTiAoLU5GX1JFUEVBVCAtIDEpCisKKy8qIHRoaXMgaXMgYSBkdW1teSBzdHJ1Y3R1cmUgdG8gZmluZCBvdXQgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgYSBzdHJ1Y3QKKyAqIGNvbnRhaW5pbmcgYWxsIHRoZSBmdW5kYW1lbnRhbCBkYXRhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaXB0X2VudHJ5LAorICogaXA2dF9lbnRyeSBhbmQgYXJwdF9lbnRyeS4gIFRoaXMgc3Vja3MsIGFuZCBpdCBpcyBhIGhhY2suICBJdCB3aWxsIGJlIG15CisgKiBwZXJzb25hbCBwbGVhc3VyZSB0byByZW1vdmUgaXQgLUhXCisgKi8KK3N0cnVjdCBfeHRfYWxpZ24KK3sKKwl1X2ludDhfdCB1ODsKKwl1X2ludDE2X3QgdTE2OworCXVfaW50MzJfdCB1MzI7CisJdV9pbnQ2NF90IHU2NDsKK307CisKKyNkZWZpbmUgWFRfQUxJR04ocykgKCgocykgKyAoX19hbGlnbm9mX18oc3RydWN0IF94dF9hbGlnbiktMSkpIAlcCisJCQkmIH4oX19hbGlnbm9mX18oc3RydWN0IF94dF9hbGlnbiktMSkpCisKKy8qIFN0YW5kYXJkIHJldHVybiB2ZXJkaWN0LCBvciBkbyBqdW1wLiAqLworI2RlZmluZSBYVF9TVEFOREFSRF9UQVJHRVQgIiIKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIFhUX0VSUk9SX1RBUkdFVCAiRVJST1IiCisKKyNkZWZpbmUgU0VUX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgPSAoYik7IChjKS5wY250ID0gKHApOyB9IHdoaWxlKDApCisjZGVmaW5lIEFERF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ICs9IChiKTsgKGMpLnBjbnQgKz0gKHApOyB9IHdoaWxlKDApCisKK3N0cnVjdCB4dF9jb3VudGVycworeworCXVfaW50NjRfdCBwY250LCBiY250OwkJCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycyAqLworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIElQVF9TT19BRERfQ09VTlRFUlMuICovCitzdHJ1Y3QgeHRfY291bnRlcnNfaW5mbworeworCS8qIFdoaWNoIHRhYmxlLiAqLworCWNoYXIgbmFtZVtYVF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisKKwkvKiBUaGUgY291bnRlcnMgKGFjdHVhbGx5IGBudW1iZXInIG9mIHRoZXNlKS4gKi8KKwlzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnNbMF07Cit9OworCisjZGVmaW5lIFhUX0lOVl9QUk9UTwkJMHg0MAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFBST1RPLiAqLworCisKKyNlbmRpZiAvKiBfWF9UQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxMTEzNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9YVF9DTEFTU0lGWV9ICisjZGVmaW5lIF9YVF9DTEFTU0lGWV9ICisKK3N0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbyB7CisJdV9pbnQzMl90IHByaW9yaXR5OworfTsKKworI2VuZGlmIC8qX1hUX0NMQVNTSUZZX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzQ0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OTUFSSy5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX1hUX0NPTk5NQVJLX0hfdGFyZ2V0CisjZGVmaW5lIF9YVF9DT05OTUFSS19IX3RhcmdldAorCisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwNCBNQVJBIFN5c3RlbXMgQUIgPGh0dHA6Ly93d3cubWFyYXN5c3RlbXMuY29tPgorICogYnkgSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK2VudW0geworCVhUX0NPTk5NQVJLX1NFVCA9IDAsCisJWFRfQ09OTk1BUktfU0FWRSwKKwlYVF9DT05OTUFSS19SRVNUT1JFCit9OworCitzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyazsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdV9pbnQ4X3QgbW9kZTsKK307CisKKyNlbmRpZiAvKl9YVF9DT05OTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DT05OU0VDTUFSSy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmJkNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ09OTlNFQ01BUksuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9YVF9DT05OU0VDTUFSS19IX3RhcmdldAorI2RlZmluZSBfWFRfQ09OTlNFQ01BUktfSF90YXJnZXQKKworZW51bSB7CisJQ09OTlNFQ01BUktfU0FWRSA9IDEsCisJQ09OTlNFQ01BUktfUkVTVE9SRSwKK307CisKK3N0cnVjdCB4dF9jb25uc2VjbWFya190YXJnZXRfaW5mbyB7CisJdV9pbnQ4X3QgbW9kZTsKK307CisKKyNlbmRpZiAvKl9YVF9DT05OU0VDTUFSS19IX3RhcmdldCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfRFNDUC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfRFNDUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2M5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9EU0NQLmgKQEAgLTAsMCArMSwyMCBAQAorLyogeF90YWJsZXMgbW9kdWxlIGZvciBzZXR0aW5nIHRoZSBJUHY0L0lQdjYgRFNDUCBmaWVsZAorICoKKyAqIChDKSAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBiYXNlZCBvbiBpcHRfRlRPUy5jIChDKSAyMDAwIGJ5IE1hdHRoZXcgRy4gTWFyc2ggPG1nbUBwYWt0cm9uaXguY29tPgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKgorICogU2VlIFJGQzI0NzQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIERTQ1AgZmllbGQgd2l0aGluIHRoZSBJUCBIZWFkZXIuCisgKgorICogeHRfRFNDUC5oLHYgMS43IDIwMDIvMDMvMTQgMTI6MDM6MTMgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9YVF9EU0NQX1RBUkdFVF9ICisjZGVmaW5lIF9YVF9EU0NQX1RBUkdFVF9ICisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2RzY3AuaD4KKworLyogdGFyZ2V0IGluZm8gKi8KK3N0cnVjdCB4dF9EU0NQX2luZm8geworCXVfaW50OF90IGRzY3A7Cit9OworCisjZW5kaWYgLyogX1hUX0RTQ1BfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X01BUksuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIxZTkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX1hUX01BUktfSF90YXJnZXQKKyNkZWZpbmUgX1hUX01BUktfSF90YXJnZXQKKworLyogVmVyc2lvbiAwICovCitzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBtYXJrOworfTsKKworLyogVmVyc2lvbiAxICovCitlbnVtIHsKKwlYVF9NQVJLX1NFVD0wLAorCVhUX01BUktfQU5ELAorCVhUX01BUktfT1IsCit9OworCitzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSB7CisJdW5zaWduZWQgbG9uZyBtYXJrOworCXVfaW50OF90IG1vZGU7Cit9OworCisjZW5kaWYgLypfWFRfTUFSS19IX3RhcmdldCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfTkZMT0cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZDBlZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GTE9HLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfWFRfTkZMT0dfVEFSR0VUCisjZGVmaW5lIF9YVF9ORkxPR19UQVJHRVQKKworI2RlZmluZSBYVF9ORkxPR19ERUZBVUxUX0dST1VQCQkweDEKKyNkZWZpbmUgWFRfTkZMT0dfREVGQVVMVF9USFJFU0hPTEQJMQorCisjZGVmaW5lIFhUX05GTE9HX01BU0sJCQkweDAKKworc3RydWN0IHh0X25mbG9nX2luZm8geworCXVfaW50MzJfdAlsZW47CisJdV9pbnQxNl90CWdyb3VwOworCXVfaW50MTZfdAl0aHJlc2hvbGQ7CisJdV9pbnQxNl90CWZsYWdzOworCXVfaW50MTZfdAlwYWQ7CisJY2hhcgkJcHJlZml4WzY0XTsKK307CisKKyNlbmRpZiAvKiBfWFRfTkZMT0dfVEFSR0VUICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5YWY3OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaApAQCAtMCwwICsxLDE2IEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIHVzaW5nIE5GUVVFVUUgbWVjaGFuaXNtCisgKgorICogKEMpIDIwMDUgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHTlUgR1BMIHYyLCAxOTkxCisgKiAKKyovCisjaWZuZGVmIF9YVF9ORlFfVEFSR0VUX0gKKyNkZWZpbmUgX1hUX05GUV9UQVJHRVRfSAorCisvKiB0YXJnZXQgaW5mbyAqLworc3RydWN0IHh0X05GUV9pbmZvIHsKKwl1X2ludDE2X3QgcXVldWVudW07Cit9OworCisjZW5kaWYgLyogX1hUX05GUV9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfU0VDTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2ZiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9TRUNNQVJLLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfWFRfU0VDTUFSS19IX3RhcmdldAorI2RlZmluZSBfWFRfU0VDTUFSS19IX3RhcmdldAorCisvKgorICogVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHZhcmlvdXMgc2VjdXJpdHkgc3Vic3lzdGVtcyAoYnV0IG5vdAorICogYXQgdGhlIHNhbWUgdGltZSkuCisgKgorICogJ21vZGUnIHJlZmVycyB0byB0aGUgc3BlY2lmaWMgc2VjdXJpdHkgc3Vic3lzdGVtIHdoaWNoIHRoZQorICogcGFja2V0cyBhcmUgYmVpbmcgbWFya2VkIGZvci4KKyAqLworI2RlZmluZSBTRUNNQVJLX01PREVfU0VMCTB4MDEJCS8qIFNFTGludXggKi8KKyNkZWZpbmUgU0VDTUFSS19TRUxDVFhfTUFYCTI1NgorCitzdHJ1Y3QgeHRfc2VjbWFya190YXJnZXRfc2VsaW51eF9pbmZvIHsKKwl1X2ludDMyX3Qgc2Vsc2lkOworCWNoYXIgc2VsY3R4W1NFQ01BUktfU0VMQ1RYX01BWF07Cit9OworCitzdHJ1Y3QgeHRfc2VjbWFya190YXJnZXRfaW5mbyB7CisJdV9pbnQ4X3QgbW9kZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB4dF9zZWNtYXJrX3RhcmdldF9zZWxpbnV4X2luZm8gc2VsOworCX0gdTsKK307CisKKyNlbmRpZiAvKl9YVF9TRUNNQVJLX0hfdGFyZ2V0ICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTI5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9UQ1BNU1MuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9YVF9UQ1BNU1NfSAorI2RlZmluZSBfWFRfVENQTVNTX0gKKworc3RydWN0IHh0X3RjcG1zc19pbmZvIHsKKwl1X2ludDE2X3QgbXNzOworfTsKKworI2RlZmluZSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSAweGZmZmYKKworI2VuZGlmIC8qIF9YVF9UQ1BNU1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2ZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb21tZW50LmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfWFRfQ09NTUVOVF9ICisjZGVmaW5lIF9YVF9DT01NRU5UX0gKKworI2RlZmluZSBYVF9NQVhfQ09NTUVOVF9MRU4gMjU2CisKK3N0cnVjdCB4dF9jb21tZW50X2luZm8geworCXVuc2lnbmVkIGNoYXIgY29tbWVudFtYVF9NQVhfQ09NTUVOVF9MRU5dOworfTsKKworI2VuZGlmIC8qIFhUX0NPTU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25uYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIyYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfWFRfQ09OTkJZVEVTX0gKKyNkZWZpbmUgX1hUX0NPTk5CWVRFU19ICisKK2VudW0geHRfY29ubmJ5dGVzX3doYXQgeworCVhUX0NPTk5CWVRFU19QS1RTLAorCVhUX0NPTk5CWVRFU19CWVRFUywKKwlYVF9DT05OQllURVNfQVZHUEtULAorfTsKKworZW51bSB4dF9jb25uYnl0ZXNfZGlyZWN0aW9uIHsKKwlYVF9DT05OQllURVNfRElSX09SSUdJTkFMLAorCVhUX0NPTk5CWVRFU19ESVJfUkVQTFksCisJWFRfQ09OTkJZVEVTX0RJUl9CT1RILAorfTsKKworc3RydWN0IHh0X2Nvbm5ieXRlc19pbmZvCit7CisJc3RydWN0IHsKKwkJYWxpZ25lZF91NjQgZnJvbTsJLyogY291bnQgdG8gYmUgbWF0Y2hlZCAqLworCQlhbGlnbmVkX3U2NCB0bzsJCS8qIGNvdW50IHRvIGJlIG1hdGNoZWQgKi8KKwl9IGNvdW50OworCXVfaW50OF90IHdoYXQ7CQkvKiBpcHRfY29ubmJ5dGVzX3doYXQgKi8KKwl1X2ludDhfdCBkaXJlY3Rpb247CS8qIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25ubWFyay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkyZjZhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9YVF9DT05OTUFSS19ICisjZGVmaW5lIF9YVF9DT05OTUFSS19ICisKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworc3RydWN0IHh0X2Nvbm5tYXJrX2luZm8geworCXVuc2lnbmVkIGxvbmcgbWFyaywgbWFzazsKKwl1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfQ09OTk1BUktfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjZmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9jb25udHJhY2suaApAQCAtMCwwICsxLDYzIEBACisvKiBIZWFkZXIgZmlsZSBmb3Iga2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLgorICogR1BMIChDKSAyMDAxICBNYXJjIEJvdWNoZXIgKG1hcmNAbWJzaS5jYSkuCisgKi8KKworI2lmbmRlZiBfWFRfQ09OTlRSQUNLX0gKKyNkZWZpbmUgX1hUX0NPTk5UUkFDS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pICgxIDw8ICgoY3RpbmZvKSVJUF9DVF9JU19SRVBMWSsxKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMSkpCisjZGVmaW5lIFhUX0NPTk5UUkFDS19TVEFURV9ETkFUICgxIDw8IChJUF9DVF9OVU1CRVIgKyAyKSkKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRCAoMSA8PCAoSVBfQ1RfTlVNQkVSICsgMykpCisKKy8qIGZsYWdzLCBpbnZmbGFnczogKi8KKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1NUQVRFCTB4MDEKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1BST1RPCTB4MDIKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX09SSUdTUkMJMHgwNAorI2RlZmluZSBYVF9DT05OVFJBQ0tfT1JJR0RTVAkweDA4CisjZGVmaW5lIFhUX0NPTk5UUkFDS19SRVBMU1JDCTB4MTAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX1JFUExEU1QJMHgyMAorI2RlZmluZSBYVF9DT05OVFJBQ0tfU1RBVFVTCTB4NDAKKyNkZWZpbmUgWFRfQ09OTlRSQUNLX0VYUElSRVMJMHg4MAorCisvKiBUaGlzIGlzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLCBzbyByZW1haW5zIGZyb3plbiBpbiB0aW1lLiAqLworc3RydWN0IGlwX2Nvbm50cmFja19vbGRfdHVwbGUKK3sKKwlzdHJ1Y3QgeworCQlfX2JlMzIgaXA7CisJCXVuaW9uIHsKKwkJCV9fdTE2IGFsbDsKKwkJfSB1OworCX0gc3JjOworCisJc3RydWN0IHsKKwkJX19iZTMyIGlwOworCQl1bmlvbiB7CisJCQlfX3UxNiBhbGw7CisJCX0gdTsKKworCQkvKiBUaGUgcHJvdG9jb2wuICovCisJCV9fdTE2IHByb3RvbnVtOworCX0gZHN0OworfTsKKworc3RydWN0IHh0X2Nvbm50cmFja19pbmZvCit7CisJdW5zaWduZWQgaW50IHN0YXRlbWFzaywgc3RhdHVzbWFzazsKKworCXN0cnVjdCBpcF9jb25udHJhY2tfb2xkX3R1cGxlIHR1cGxlW0lQX0NUX0RJUl9NQVhdOworCXN0cnVjdCBpbl9hZGRyIHNpcG1za1tJUF9DVF9ESVJfTUFYXSwgZGlwbXNrW0lQX0NUX0RJUl9NQVhdOworCisJdW5zaWduZWQgbG9uZyBleHBpcmVzX21pbiwgZXhwaXJlc19tYXg7CisKKwkvKiBGbGFncyB3b3JkICovCisJdV9pbnQ4X3QgZmxhZ3M7CisJLyogSW52ZXJzZSBmbGFncyAqLworCXVfaW50OF90IGludmZsYWdzOworfTsKKyNlbmRpZiAvKl9YVF9DT05OVFJBQ0tfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kY2NwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyMjFiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RjY3AuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9YVF9EQ0NQX0hfCisjZGVmaW5lIF9YVF9EQ0NQX0hfCisKKyNkZWZpbmUgWFRfRENDUF9TUkNfUE9SVFMJICAgICAgICAweDAxCisjZGVmaW5lIFhUX0RDQ1BfREVTVF9QT1JUUwkgICAgICAgIDB4MDIKKyNkZWZpbmUgWFRfRENDUF9UWVBFCQkJMHgwNAorI2RlZmluZSBYVF9EQ0NQX09QVElPTgkJCTB4MDgKKworI2RlZmluZSBYVF9EQ0NQX1ZBTElEX0ZMQUdTCQkweDBmCisKK3N0cnVjdCB4dF9kY2NwX2luZm8geworCXVfaW50MTZfdCBkcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKwl1X2ludDE2X3Qgc3B0c1syXTsgIC8qIE1pbiwgTWF4ICovCisKKwl1X2ludDE2X3QgZmxhZ3M7CisJdV9pbnQxNl90IGludmZsYWdzOworCisJdV9pbnQxNl90IHR5cGVtYXNrOworCXVfaW50OF90IG9wdGlvbjsKK307CisKKyNlbmRpZiAvKiBfWFRfRENDUF9IXyAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kc2NwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9kc2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhNjFlNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2RzY3AuaApAQCAtMCwwICsxLDIzIEBACisvKiB4X3RhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSBJUHY0L0lQdjYgRFNDUCBmaWVsZAorICoKKyAqIChDKSAyMDAyIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyAqCisgKiBTZWUgUkZDMjQ3NCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgRFNDUCBmaWVsZCB3aXRoaW4gdGhlIElQIEhlYWRlci4KKyAqCisgKiB4dF9kc2NwLmgsdiAxLjMgMjAwMi8wOC8wNSAxOTowMDoyMSBsYWZvcmdlIEV4cAorKi8KKyNpZm5kZWYgX1hUX0RTQ1BfSAorI2RlZmluZSBfWFRfRFNDUF9ICisKKyNkZWZpbmUgWFRfRFNDUF9NQVNLCTB4ZmMJLyogMTExMTExMDAgKi8KKyNkZWZpbmUgWFRfRFNDUF9TSElGVAkyCisjZGVmaW5lIFhUX0RTQ1BfTUFYCTB4M2YJLyogMDAxMTExMTEgKi8KKworLyogbWF0Y2ggaW5mbyAqLworc3RydWN0IHh0X2RzY3BfaW5mbyB7CisJdV9pbnQ4X3QgZHNjcDsKKwl1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLyogX1hUX0RTQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZXNwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9lc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzgwZmIxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZXNwLmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfWFRfRVNQX0gKKyNkZWZpbmUgX1hUX0VTUF9ICisKK3N0cnVjdCB4dF9lc3AKK3sKKwl1X2ludDMyX3Qgc3Bpc1syXTsJLyogU2VjdXJpdHkgUGFyYW1ldGVyIEluZGV4ICovCisJdV9pbnQ4X3QgIGludmZsYWdzOwkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IHh0X2VzcC4gKi8KKyNkZWZpbmUgWFRfRVNQX0lOVl9TUEkJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNwaS4gKi8KKyNkZWZpbmUgWFRfRVNQX0lOVl9NQVNLCTB4MDEJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfWFRfRVNQX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDU1NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfWFRfSEFTSExJTUlUX0gKKyNkZWZpbmUgX1hUX0hBU0hMSU1JVF9ICisKKy8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KKyNkZWZpbmUgWFRfSEFTSExJTUlUX1NDQUxFIDEwMDAwCisvKiAxLzEwLDAwMCBzZWMgcGVyaW9kID0+IG1heCBvZiAxMCwwMDAvc2VjLiAgTWluIHJhdGUgaXMgdGhlbiA0Mjk0OTAKKyAgIHNlY29uZHMsIG9yIG9uZSBldmVyeSA1OSBob3Vycy4gKi8KKworLyogZGV0YWlscyBvZiB0aGlzIHN0cnVjdHVyZSBoaWRkZW4gYnkgdGhlIGltcGxlbWVudGF0aW9uICovCitzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZTsKKworI2RlZmluZSBYVF9IQVNITElNSVRfSEFTSF9ESVAJMHgwMDAxCisjZGVmaW5lIFhUX0hBU0hMSU1JVF9IQVNIX0RQVAkweDAwMDIKKyNkZWZpbmUgWFRfSEFTSExJTUlUX0hBU0hfU0lQCTB4MDAwNAorI2RlZmluZSBYVF9IQVNITElNSVRfSEFTSF9TUFQJMHgwMDA4CisKK3N0cnVjdCBoYXNobGltaXRfY2ZnIHsKKwl1X2ludDMyX3QgbW9kZTsJICAvKiBiaXRtYXNrIG9mIElQVF9IQVNITElNSVRfSEFTSF8qICovCisJdV9pbnQzMl90IGF2ZzsgICAgLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCisJdV9pbnQzMl90IGJ1cnN0OyAgLyogUGVyaW9kIG11bHRpcGxpZXIgZm9yIHVwcGVyIGxpbWl0LiAqLworCisJLyogdXNlciBzcGVjaWZpZWQgKi8KKwl1X2ludDMyX3Qgc2l6ZTsJCS8qIGhvdyBtYW55IGJ1Y2tldHMgKi8KKwl1X2ludDMyX3QgbWF4OwkJLyogbWF4IG51bWJlciBvZiBlbnRyaWVzICovCisJdV9pbnQzMl90IGdjX2ludGVydmFsOwkvKiBnYyBpbnRlcnZhbCAqLworCXVfaW50MzJfdCBleHBpcmU7CS8qIHdoZW4gZG8gZW50cmllcyBleHBpcmU/ICovCit9OworCitzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8geworCWNoYXIgbmFtZSBbSUZOQU1TSVpdOwkJLyogbmFtZSAqLworCXN0cnVjdCBoYXNobGltaXRfY2ZnIGNmZzsKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm87CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXVuaW9uIHsKKwkJdm9pZCAqcHRyOworCQlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKm1hc3RlcjsKKwl9IHU7Cit9OworI2VuZGlmIC8qX1hUX0hBU0hMSU1JVF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0Mjc2MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfWFRfSEVMUEVSX0gKKyNkZWZpbmUgX1hUX0hFTFBFUl9ICisKK3N0cnVjdCB4dF9oZWxwZXJfaW5mbyB7CisJaW50IGludmVydDsKKwljaGFyIG5hbWVbMzBdOworfTsKKyNlbmRpZiAvKiBfWFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYjQzOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X2xlbmd0aC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWFRfTEVOR1RIX0gKKyNkZWZpbmUgX1hUX0xFTkdUSF9ICisKK3N0cnVjdCB4dF9sZW5ndGhfaW5mbyB7CisgICAgdV9pbnQxNl90CW1pbiwgbWF4OworICAgIHVfaW50OF90CWludmVydDsKK307CisKKyNlbmRpZiAvKl9YVF9MRU5HVEhfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9saW1pdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NlNjUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbGltaXQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9YVF9SQVRFX0gKKyNkZWZpbmUgX1hUX1JBVEVfSAorCisvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCisjZGVmaW5lIFhUX0xJTUlUX1NDQUxFIDEwMDAwCisKKy8qIDEvMTAsMDAwIHNlYyBwZXJpb2QgPT4gbWF4IG9mIDEwLDAwMC9zZWMuICBNaW4gcmF0ZSBpcyB0aGVuIDQyOTQ5MAorICAgc2Vjb25kcywgb3Igb25lIGV2ZXJ5IDU5IGhvdXJzLiAqLworc3RydWN0IHh0X3JhdGVpbmZvIHsKKwl1X2ludDMyX3QgYXZnOyAgICAvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwl1X2ludDMyX3QgYnVyc3Q7ICAvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXVuc2lnbmVkIGxvbmcgcHJldjsKKwl1X2ludDMyX3QgY3JlZGl0OworCXVfaW50MzJfdCBjcmVkaXRfY2FwLCBjb3N0OworCisJLyogVWdseSwgdWdseSBmdWNrZXIuICovCisJc3RydWN0IHh0X3JhdGVpbmZvICptYXN0ZXI7Cit9OworI2VuZGlmIC8qX1hUX1JBVEVfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTJjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYWMuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX01BQ19ICisjZGVmaW5lIF9YVF9NQUNfSAorCitzdHJ1Y3QgeHRfbWFjX2luZm8geworICAgIHVuc2lnbmVkIGNoYXIgc3JjYWRkcltFVEhfQUxFTl07CisgICAgaW50IGludmVydDsKK307CisjZW5kaWYgLypfWFRfTUFDX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmRkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tYXJrLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9YVF9NQVJLX0gKKyNkZWZpbmUgX1hUX01BUktfSAorCitzdHJ1Y3QgeHRfbWFya19pbmZvIHsKKyAgICB1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7CisgICAgdV9pbnQ4X3QgaW52ZXJ0OworfTsKKworI2VuZGlmIC8qX1hUX01BUktfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OWVlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9YVF9NVUxUSVBPUlRfSAorI2RlZmluZSBfWFRfTVVMVElQT1JUX0gKKworZW51bSB4dF9tdWx0aXBvcnRfZmxhZ3MKK3sKKwlYVF9NVUxUSVBPUlRfU09VUkNFLAorCVhUX01VTFRJUE9SVF9ERVNUSU5BVElPTiwKKwlYVF9NVUxUSVBPUlRfRUlUSEVSCit9OworCisjZGVmaW5lIFhUX01VTFRJX1BPUlRTCTE1CisKKy8qIE11c3QgZml0IGluc2lkZSB1bmlvbiB4dF9tYXRjaGluZm86IDE2IGJ5dGVzICovCitzdHJ1Y3QgeHRfbXVsdGlwb3J0Cit7CisJdV9pbnQ4X3QgZmxhZ3M7CQkJCS8qIFR5cGUgb2YgY29tcGFyaXNvbiAqLworCXVfaW50OF90IGNvdW50OwkJCQkvKiBOdW1iZXIgb2YgcG9ydHMgKi8KKwl1X2ludDE2X3QgcG9ydHNbWFRfTVVMVElfUE9SVFNdOwkvKiBQb3J0cyAqLworfTsKKworc3RydWN0IHh0X211bHRpcG9ydF92MQoreworCXVfaW50OF90IGZsYWdzOwkJCQkvKiBUeXBlIG9mIGNvbXBhcmlzb24gKi8KKwl1X2ludDhfdCBjb3VudDsJCQkJLyogTnVtYmVyIG9mIHBvcnRzICovCisJdV9pbnQxNl90IHBvcnRzW1hUX01VTFRJX1BPUlRTXTsJLyogUG9ydHMgKi8KKwl1X2ludDhfdCBwZmxhZ3NbWFRfTVVMVElfUE9SVFNdOwkvKiBQb3J0IGZsYWdzICovCisJdV9pbnQ4X3QgaW52ZXJ0OwkJCS8qIEludmVydCBmbGFnICovCit9OworCisjZW5kaWYgLypfWFRfTVVMVElQT1JUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzM2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9waHlzZGV2LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfWFRfUEhZU0RFVl9ICisjZGVmaW5lIF9YVF9QSFlTREVWX0gKKworCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfSU4JCTB4MDEKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9PVVQJCTB4MDIKKyNkZWZpbmUgWFRfUEhZU0RFVl9PUF9CUklER0VECQkweDA0CisjZGVmaW5lIFhUX1BIWVNERVZfT1BfSVNJTgkJMHgwOAorI2RlZmluZSBYVF9QSFlTREVWX09QX0lTT1VUCQkweDEwCisjZGVmaW5lIFhUX1BIWVNERVZfT1BfTUFTSwkJKDB4MjAgLSAxKQorCitzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvIHsKKwljaGFyIHBoeXNpbmRldltJRk5BTVNJWl07CisJY2hhciBpbl9tYXNrW0lGTkFNU0laXTsKKwljaGFyIHBoeXNvdXRkZXZbSUZOQU1TSVpdOworCWNoYXIgb3V0X21hc2tbSUZOQU1TSVpdOworCXVfaW50OF90IGludmVydDsKKwl1X2ludDhfdCBiaXRtYXNrOworfTsKKworI2VuZGlmIC8qX1hUX1BIWVNERVZfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wa3R0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2NWNmNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX1hUX1BLVFRZUEVfSAorI2RlZmluZSBfWFRfUEtUVFlQRV9ICisKK3N0cnVjdCB4dF9wa3R0eXBlX2luZm8geworCWludAlwa3R0eXBlOworCWludAlpbnZlcnQ7Cit9OworI2VuZGlmIC8qX1hUX1BLVFRZUEVfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NjU0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9wb2xpY3kuaApAQCAtMCwwICsxLDU4IEBACisjaWZuZGVmIF9YVF9QT0xJQ1lfSAorI2RlZmluZSBfWFRfUE9MSUNZX0gKKworI2RlZmluZSBYVF9QT0xJQ1lfTUFYX0VMRU0JNAorCitlbnVtIHh0X3BvbGljeV9mbGFncworeworCVhUX1BPTElDWV9NQVRDSF9JTgk9IDB4MSwKKwlYVF9QT0xJQ1lfTUFUQ0hfT1VUCT0gMHgyLAorCVhUX1BPTElDWV9NQVRDSF9OT05FCT0gMHg0LAorCVhUX1BPTElDWV9NQVRDSF9TVFJJQ1QJPSAweDgsCit9OworCitlbnVtIHh0X3BvbGljeV9tb2RlcworeworCVhUX1BPTElDWV9NT0RFX1RSQU5TUE9SVCwKKwlYVF9QT0xJQ1lfTU9ERV9UVU5ORUwKK307CisKK3N0cnVjdCB4dF9wb2xpY3lfc3BlYworeworCXVfaW50OF90CXNhZGRyOjEsCisJCQlkYWRkcjoxLAorCQkJcHJvdG86MSwKKwkJCW1vZGU6MSwKKwkJCXNwaToxLAorCQkJcmVxaWQ6MTsKK307CisKK3VuaW9uIHh0X3BvbGljeV9hZGRyCit7CisJc3RydWN0IGluX2FkZHIJYTQ7CisJc3RydWN0IGluNl9hZGRyCWE2OworfTsKKworc3RydWN0IHh0X3BvbGljeV9lbGVtCit7CisJdW5pb24geHRfcG9saWN5X2FkZHIJc2FkZHI7CisJdW5pb24geHRfcG9saWN5X2FkZHIJc21hc2s7CisJdW5pb24geHRfcG9saWN5X2FkZHIJZGFkZHI7CisJdW5pb24geHRfcG9saWN5X2FkZHIJZG1hc2s7CisJX19iZTMyCQkJc3BpOworCXVfaW50MzJfdAkJcmVxaWQ7CisJdV9pbnQ4X3QJCXByb3RvOworCXVfaW50OF90CQltb2RlOworCisJc3RydWN0IHh0X3BvbGljeV9zcGVjCW1hdGNoOworCXN0cnVjdCB4dF9wb2xpY3lfc3BlYwlpbnZlcnQ7Cit9OworCitzdHJ1Y3QgeHRfcG9saWN5X2luZm8KK3sKKwlzdHJ1Y3QgeHRfcG9saWN5X2VsZW0gcG9sW1hUX1BPTElDWV9NQVhfRUxFTV07CisJdV9pbnQxNl90IGZsYWdzOworCXVfaW50MTZfdCBsZW47Cit9OworCisjZW5kaWYgLyogX1hUX1BPTElDWV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9xdW90YS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Q3ZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcXVvdGEuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9YVF9RVU9UQV9ICisjZGVmaW5lIF9YVF9RVU9UQV9ICisKK2VudW0geHRfcXVvdGFfZmxhZ3MgeworCVhUX1FVT1RBX0lOVkVSVAkJPSAweDEsCit9OworI2RlZmluZSBYVF9RVU9UQV9NQVNLCQkweDEKKworc3RydWN0IHh0X3F1b3RhX2luZm8geworCXVfaW50MzJfdAkJZmxhZ3M7CisJdV9pbnQzMl90CQlwYWQ7CisJYWxpZ25lZF91NjQJCXF1b3RhOworCXN0cnVjdCB4dF9xdW90YV9pbmZvCSptYXN0ZXI7Cit9OworCisjZW5kaWYgLyogX1hUX1FVT1RBX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9yZWFsbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGU4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9yZWFsbS5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX1hUX1JFQUxNX0gKKyNkZWZpbmUgX1hUX1JFQUxNX0gKKworc3RydWN0IHh0X3JlYWxtX2luZm8geworCXVfaW50MzJfdCBpZDsKKwl1X2ludDMyX3QgbWFzazsKKwl1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLyogX1hUX1JFQUxNX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NjdHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3NjdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDVhNGZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc2N0cC5oCkBAIC0wLDAgKzEsMTA0IEBACisjaWZuZGVmIF9YVF9TQ1RQX0hfCisjZGVmaW5lIF9YVF9TQ1RQX0hfCisKKyNkZWZpbmUgWFRfU0NUUF9TUkNfUE9SVFMJICAgICAgICAweDAxCisjZGVmaW5lIFhUX1NDVFBfREVTVF9QT1JUUwkgICAgICAgIDB4MDIKKyNkZWZpbmUgWFRfU0NUUF9DSFVOS19UWVBFUwkJMHgwNAorCisjZGVmaW5lIFhUX1NDVFBfVkFMSURfRkxBR1MJCTB4MDcKKworc3RydWN0IHh0X3NjdHBfZmxhZ19pbmZvIHsKKwl1X2ludDhfdCBjaHVua3R5cGU7CisJdV9pbnQ4X3QgZmxhZzsKKwl1X2ludDhfdCBmbGFnX21hc2s7Cit9OworCisjZGVmaW5lIFhUX05VTV9TQ1RQX0ZMQUdTCTQKKworc3RydWN0IHh0X3NjdHBfaW5mbyB7CisJdV9pbnQxNl90IGRwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCXVfaW50MTZfdCBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCXVfaW50MzJfdCBjaHVua21hcFsyNTYgLyBzaXplb2YgKHVfaW50MzJfdCldOyAgLyogQml0IG1hc2sgb2YgY2h1bmtzIHRvIGJlIG1hdGNoZWQgYWNjb3JkaW5nIHRvIFJGQyAyOTYwICovCisKKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9BTlkgICAweDAxICAvKiBNYXRjaCBpZiBhbnkgb2YgdGhlIGNodW5rIHR5cGVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfQUxMICAgMHgwMiAgLyogTWF0Y2ggaWYgYWxsIG9mIHRoZSBjaHVuayB0eXBlcyBhcmUgcHJlc2VudCAqLworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX09OTFkgIDB4MDQgIC8qIE1hdGNoIGlmIHRoZXNlIGFyZSB0aGUgb25seSBjaHVuayB0eXBlcyBwcmVzZW50ICovCisKKwl1X2ludDMyX3QgY2h1bmtfbWF0Y2hfdHlwZTsKKwlzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8gZmxhZ19pbmZvW1hUX05VTV9TQ1RQX0ZMQUdTXTsKKwlpbnQgZmxhZ19jb3VudDsKKworCXVfaW50MzJfdCBmbGFnczsKKwl1X2ludDMyX3QgaW52ZmxhZ3M7Cit9OworCisjZGVmaW5lIGJ5dGVzKHR5cGUpIChzaXplb2YodHlwZSkgKiA4KQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfU0VUKGNodW5rbWFwLCB0eXBlKSAJCVwKKwlkbyB7IAkJCQkJCVwKKwkJY2h1bmttYXBbdHlwZSAvIGJ5dGVzKHVfaW50MzJfdCldIHw9IAlcCisJCQkxIDw8ICh0eXBlICUgYnl0ZXModV9pbnQzMl90KSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfQ0xFQVIoY2h1bmttYXAsIHR5cGUpCQkgCVwKKwlkbyB7CQkJCQkJCVwKKwkJY2h1bmttYXBbdHlwZSAvIGJ5dGVzKHVfaW50MzJfdCldICY9IAkJXAorCQkJfigxIDw8ICh0eXBlICUgYnl0ZXModV9pbnQzMl90KSkpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0lTX1NFVChjaHVua21hcCwgdHlwZSkgCQkJXAorKHsJCQkJCQkJCVwKKwkoY2h1bmttYXBbdHlwZSAvIGJ5dGVzICh1X2ludDMyX3QpXSAmIAkJCVwKKwkJKDEgPDwgKHR5cGUgJSBieXRlcyAodV9pbnQzMl90KSkpKSA/IDE6IDA7CVwKK30pCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9SRVNFVChjaHVua21hcCkgCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50IGk7IAkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2h1bmttYXApOyBpKyspCVwKKwkJCWNodW5rbWFwW2ldID0gMDsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1NFVF9BTEwoY2h1bmttYXApIAkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50IGk7IAkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2h1bmttYXApOyBpKyspIAlcCisJCQljaHVua21hcFtpXSA9IH4wOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfQ09QWShkZXN0bWFwLCBzcmNtYXApIAkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50IGk7IAkJCQkJCVwKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3JjbWFwKTsgaSsrKSAJXAorCQkJZGVzdG1hcFtpXSA9IHNyY21hcFtpXTsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0lTX0NMRUFSKGNodW5rbWFwKSAJCVwKKyh7CQkJCQkJCVwKKwlpbnQgaTsgCQkJCQkJXAorCWludCBmbGFnID0gMTsJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaHVua21hcCk7IGkrKykgewlcCisJCWlmIChjaHVua21hcFtpXSkgewkJCVwKKwkJCWZsYWcgPSAwOwkJCVwKKwkJCWJyZWFrOwkJCQlcCisJCX0JCQkJCVwKKwl9CQkJCQkJXAorICAgICAgICBmbGFnOwkJCQkJCVwKK30pCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9JU19BTExfU0VUKGNodW5rbWFwKSAJCVwKKyh7CQkJCQkJCVwKKwlpbnQgaTsgCQkJCQkJXAorCWludCBmbGFnID0gMTsJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaHVua21hcCk7IGkrKykgewlcCisJCWlmIChjaHVua21hcFtpXSAhPSB+MCkgewkJXAorCQkJZmxhZyA9IDA7CQkJXAorCQkJCWJyZWFrOwkJCVwKKwkJfQkJCQkJXAorCX0JCQkJCQlcCisgICAgICAgIGZsYWc7CQkJCQkJXAorfSkKKworI2VuZGlmIC8qIF9YVF9TQ1RQX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmYzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0ZS5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX1hUX1NUQVRFX0gKKyNkZWZpbmUgX1hUX1NUQVRFX0gKKworI2RlZmluZSBYVF9TVEFURV9CSVQoY3RpbmZvKSAoMSA8PCAoKGN0aW5mbyklSVBfQ1RfSVNfUkVQTFkrMSkpCisjZGVmaW5lIFhUX1NUQVRFX0lOVkFMSUQgKDEgPDwgMCkKKworI2RlZmluZSBYVF9TVEFURV9VTlRSQUNLRUQgKDEgPDwgKElQX0NUX05VTUJFUiArIDEpKQorCitzdHJ1Y3QgeHRfc3RhdGVfaW5mbworeworCXVuc2lnbmVkIGludCBzdGF0ZW1hc2s7Cit9OworI2VuZGlmIC8qX1hUX1NUQVRFX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9zdGF0aXN0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ0ZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RhdGlzdGljLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfWFRfU1RBVElTVElDX0gKKyNkZWZpbmUgX1hUX1NUQVRJU1RJQ19ICisKK2VudW0geHRfc3RhdGlzdGljX21vZGUgeworCVhUX1NUQVRJU1RJQ19NT0RFX1JBTkRPTSwKKwlYVF9TVEFUSVNUSUNfTU9ERV9OVEgsCisJX19YVF9TVEFUSVNUSUNfTU9ERV9NQVgKK307CisjZGVmaW5lIFhUX1NUQVRJU1RJQ19NT0RFX01BWCAoX19YVF9TVEFUSVNUSUNfTU9ERV9NQVggLSAxKQorCitlbnVtIHh0X3N0YXRpc3RpY19mbGFncyB7CisJWFRfU1RBVElTVElDX0lOVkVSVAkJPSAweDEsCit9OworI2RlZmluZSBYVF9TVEFUSVNUSUNfTUFTSwkJMHgxCisKK3N0cnVjdCB4dF9zdGF0aXN0aWNfaW5mbyB7CisJdV9pbnQxNl90CQkJbW9kZTsKKwl1X2ludDE2X3QJCQlmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDMyX3QJcHJvYmFiaWxpdHk7CisJCX0gcmFuZG9tOworCQlzdHJ1Y3QgeworCQkJdV9pbnQzMl90CWV2ZXJ5OworCQkJdV9pbnQzMl90CXBhY2tldDsKKwkJCXVfaW50MzJfdAljb3VudDsKKwkJfSBudGg7CisJfSB1OworCXN0cnVjdCB4dF9zdGF0aXN0aWNfaW5mbwkqbWFzdGVyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKK307CisKKyNlbmRpZiAvKiBfWFRfU1RBVElTVElDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNDE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX1hUX1NUUklOR19ICisjZGVmaW5lIF9YVF9TVFJJTkdfSAorCisjZGVmaW5lIFhUX1NUUklOR19NQVhfUEFUVEVSTl9TSVpFIDEyOAorI2RlZmluZSBYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFIDE2CisKK3N0cnVjdCB4dF9zdHJpbmdfaW5mbworeworCXVfaW50MTZfdCBmcm9tX29mZnNldDsKKwl1X2ludDE2X3QgdG9fb2Zmc2V0OworCWNoYXIJICBhbGdvW1hUX1NUUklOR19NQVhfQUxHT19OQU1FX1NJWkVdOworCWNoYXIgCSAgcGF0dGVybltYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRV07CisJdV9pbnQ4X3QgIHBhdGxlbjsKKwl1X2ludDhfdCAgaW52ZXJ0OworCXN0cnVjdCB0c19jb25maWcgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpICpjb25maWc7Cit9OworCisjZW5kaWYgLypfWFRfU1RSSU5HX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3Btc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDMyNzRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwbXNzLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9YVF9UQ1BNU1NfTUFUQ0hfSAorI2RlZmluZSBfWFRfVENQTVNTX01BVENIX0gKKworc3RydWN0IHh0X3RjcG1zc19tYXRjaF9pbmZvIHsKKyAgICB1X2ludDE2X3QgbXNzX21pbiwgbXNzX21heDsKKyAgICB1X2ludDhfdCBpbnZlcnQ7Cit9OworCisjZW5kaWYgLypfWFRfVENQTVNTX01BVENIX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJjNjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfdGNwdWRwLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfWFRfVENQVURQX0gKKyNkZWZpbmUgX1hUX1RDUFVEUF9ICisKKy8qIFRDUCBtYXRjaGluZyBzdHVmZiAqLworc3RydWN0IHh0X3RjcAoreworCXVfaW50MTZfdCBzcHRzWzJdOwkJCS8qIFNvdXJjZSBwb3J0IHJhbmdlLiAqLworCXVfaW50MTZfdCBkcHRzWzJdOwkJCS8qIERlc3RpbmF0aW9uIHBvcnQgcmFuZ2UuICovCisJdV9pbnQ4X3Qgb3B0aW9uOwkJCS8qIFRDUCBPcHRpb24gaWZmIG5vbi16ZXJvKi8KKwl1X2ludDhfdCBmbGdfbWFzazsJCQkvKiBUQ1AgZmxhZ3MgbWFzayBieXRlICovCisJdV9pbnQ4X3QgZmxnX2NtcDsJCQkvKiBUQ1AgZmxhZ3MgY29tcGFyZSBieXRlICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3RjcC4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9TUkNQVAkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc291cmNlIHBvcnRzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX0RTVFBUCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBkZXN0IHBvcnRzLiAqLworI2RlZmluZSBYVF9UQ1BfSU5WX0ZMQUdTCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUQ1AgZmxhZ3MuICovCisjZGVmaW5lIFhUX1RDUF9JTlZfT1BUSU9OCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBvcHRpb24gdGVzdC4gKi8KKyNkZWZpbmUgWFRfVENQX0lOVl9NQVNLCQkweDBGCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworLyogVURQIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgeHRfdWRwCit7CisJdV9pbnQxNl90IHNwdHNbMl07CQkJLyogU291cmNlIHBvcnQgcmFuZ2UuICovCisJdV9pbnQxNl90IGRwdHNbMl07CQkJLyogRGVzdGluYXRpb24gcG9ydCByYW5nZS4gKi8KKwl1X2ludDhfdCBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisvKiBWYWx1ZXMgZm9yICJpbnZmbGFncyIgZmllbGQgaW4gc3RydWN0IGlwdF91ZHAuICovCisjZGVmaW5lIFhUX1VEUF9JTlZfU1JDUFQJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHNvdXJjZSBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVURQX0lOVl9EU1RQVAkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgZGVzdCBwb3J0cy4gKi8KKyNkZWZpbmUgWFRfVURQX0lOVl9NQVNLCTB4MDMJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJjNmRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX0xJTlVYX0FSUF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0FSUF9ORVRGSUxURVJfSAorCisvKiBBUlAtc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLgorICogKEMpMjAwMiBSdXN0eSBSdXNzZWxsIElCTSAtLSBUaGlzIGNvZGUgaXMgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogVGhlcmUgaXMgbm8gUEZfQVJQLiAqLworI2RlZmluZSBORl9BUlAJCTAKKworLyogQVJQIEhvb2tzICovCisjZGVmaW5lIE5GX0FSUF9JTgkwCisjZGVmaW5lIE5GX0FSUF9PVVQJMQorI2RlZmluZSBORl9BUlBfRk9SV0FSRAkyCisjZGVmaW5lIE5GX0FSUF9OVU1IT09LUwkzCisKKyNlbmRpZiAvKiBfX0xJTlVYX0FSUF9ORVRGSUxURVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4M2Q0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiAJRm9ybWF0IG9mIGFuIEFSUCBmaXJld2FsbCBkZXNjcmlwdG9yCisgKgorICogCXNyYywgdGd0LCBzcmNfbWFzaywgdGd0X21hc2ssIGFycG9wLCBhcnBvcF9tYXNrIGFyZSBhbHdheXMgc3RvcmVkIGluCisgKgluZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAJZmxhZ3MgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXIgKG9mIGNvdXJzZSkuCisgKi8KKworI2lmbmRlZiBfQVJQVEFCTEVTX0gKKyNkZWZpbmUgX0FSUFRBQkxFU19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2RlZmluZSBBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU4gWFRfRlVOQ1RJT05fTUFYTkFNRUxFTgorI2RlZmluZSBBUlBUX1RBQkxFX01BWE5BTUVMRU4gWFRfVEFCTEVfTUFYTkFNRUxFTgorI2RlZmluZSBhcnB0X3RhcmdldCB4dF90YXJnZXQKKyNkZWZpbmUgYXJwdF90YWJsZSB4dF90YWJsZQorCisjZGVmaW5lIEFSUFRfREVWX0FERFJfTEVOX01BWCAxNgorCitzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8geworCWNoYXIgYWRkcltBUlBUX0RFVl9BRERSX0xFTl9NQVhdOworCWNoYXIgbWFza1tBUlBUX0RFVl9BRERSX0xFTl9NQVhdOworfTsKKworLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KK3N0cnVjdCBhcnB0X2FycCB7CisJLyogU291cmNlIGFuZCB0YXJnZXQgSVAgYWRkciAqLworCXN0cnVjdCBpbl9hZGRyIHNyYywgdGd0OworCS8qIE1hc2sgZm9yIHNyYyBhbmQgdGFyZ2V0IElQIGFkZHIgKi8KKwlzdHJ1Y3QgaW5fYWRkciBzbXNrLCB0bXNrOworCisJLyogRGV2aWNlIGh3IGFkZHJlc3MgbGVuZ3RoLCBzcmMrdGFyZ2V0IGRldmljZSBhZGRyZXNzZXMgKi8KKwl1X2ludDhfdCBhcmhsbiwgYXJobG5fbWFzazsKKwlzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8gc3JjX2RldmFkZHI7CisJc3RydWN0IGFycHRfZGV2YWRkcl9pbmZvIHRndF9kZXZhZGRyOworCisJLyogQVJQIG9wZXJhdGlvbiBjb2RlLiAqLworCV9fYmUxNiBhcnBvcCwgYXJwb3BfbWFzazsKKworCS8qIEFSUCBoYXJkd2FyZSBhZGRyZXNzIGFuZCBwcm90b2NvbCBhZGRyZXNzIGZvcm1hdC4gKi8KKwlfX2JlMTYgYXJocmQsIGFyaHJkX21hc2s7CisJX19iZTE2IGFycHJvLCBhcnByb19tYXNrOworCisJLyogVGhlIHByb3RvY29sIGFkZHJlc3MgbGVuZ3RoIGlzIG9ubHkgYWNjZXB0ZWQgaWYgaXQgaXMgNAorCSAqIHNvIHRoZXJlIGlzIG5vIHVzZSBpbiBvZmZlcmluZyBhIHdheSB0byBkbyBmaWx0ZXJpbmcgb24gaXQuCisJICovCisKKwljaGFyIGluaWZhY2VbSUZOQU1TSVpdLCBvdXRpZmFjZVtJRk5BTVNJWl07CisJdW5zaWduZWQgY2hhciBpbmlmYWNlX21hc2tbSUZOQU1TSVpdLCBvdXRpZmFjZV9tYXNrW0lGTkFNU0laXTsKKworCS8qIEZsYWdzIHdvcmQgKi8KKwl1X2ludDhfdCBmbGFnczsKKwkvKiBJbnZlcnNlIGZsYWdzICovCisJdV9pbnQxNl90IGludmZsYWdzOworfTsKKworI2RlZmluZSBhcnB0X2VudHJ5X3RhcmdldCB4dF9lbnRyeV90YXJnZXQKKyNkZWZpbmUgYXJwdF9zdGFuZGFyZF90YXJnZXQgeHRfc3RhbmRhcmRfdGFyZ2V0CisKKy8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBhcnB0X2lwIChnZW5lcmFsIGFycCBzdHJ1Y3R1cmUpLgorICogTm8gZmxhZ3MgZGVmaW5lZCB5ZXQuCisgKi8KKyNkZWZpbmUgQVJQVF9GX01BU0sJCTB4MDAJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBhcnB0X2FycC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVklBX0lOCQkweDAwMDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBJTiBJRkFDRS4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVklBX09VVAkweDAwMDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBPVVQgSUZBQ0UgKi8KKyNkZWZpbmUgQVJQVF9JTlZfU1JDSVAJCTB4MDAwNAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNSQyBJUC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfVEdUSVAJCTB4MDAwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFRHVCBJUC4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfU1JDREVWQUREUgkweDAwMTAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBTUkMgREVWIEFERFIuICovCisjZGVmaW5lIEFSUFRfSU5WX1RHVERFVkFERFIJMHgwMDIwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVEdUIERFViBBRERSLiAqLworI2RlZmluZSBBUlBUX0lOVl9BUlBPUAkJMHgwMDQwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgQVJQIE9QLiAqLworI2RlZmluZSBBUlBUX0lOVl9BUlBIUkQJCTB4MDA4MAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEFSUCBIUkQuICovCisjZGVmaW5lIEFSUFRfSU5WX0FSUFBSTwkJMHgwMTAwCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgQVJQIFBSTy4gKi8KKyNkZWZpbmUgQVJQVF9JTlZfQVJQSExOCQkweDAyMDAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBBUlAgSExOLiAqLworI2RlZmluZSBBUlBUX0lOVl9NQVNLCQkweDAzRkYJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMworICAgcGFydHMgd2hpY2ggYXJlIDEpIGdlbmVyYWwgQVJQIGhlYWRlciBzdHVmZiAyKSBtYXRjaCBzcGVjaWZpYworICAgc3R1ZmYgMykgdGhlIHRhcmdldCB0byBwZXJmb3JtIGlmIHRoZSBydWxlIG1hdGNoZXMgKi8KK3N0cnVjdCBhcnB0X2VudHJ5Cit7CisJc3RydWN0IGFycHRfYXJwIGFycDsKKworCS8qIFNpemUgb2YgYXJwdF9lbnRyeSArIG1hdGNoZXMgKi8KKwl1X2ludDE2X3QgdGFyZ2V0X29mZnNldDsKKwkvKiBTaXplIG9mIGFycHRfZW50cnkgKyBtYXRjaGVzICsgdGFyZ2V0ICovCisJdV9pbnQxNl90IG5leHRfb2Zmc2V0OworCisJLyogQmFjayBwb2ludGVyICovCisJdW5zaWduZWQgaW50IGNvbWVmcm9tOworCisJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyczsKKworCS8qIFRoZSBtYXRjaGVzIChpZiBhbnkpLCB0aGVuIHRoZSB0YXJnZXQuICovCisJdW5zaWduZWQgY2hhciBlbGVtc1swXTsKK307CisKKy8qCisgKiBOZXcgSVAgZmlyZXdhbGwgb3B0aW9ucyBmb3IgW2dzXWV0c29ja29wdCBhdCB0aGUgUkFXIElQIGxldmVsLgorICogVW5saWtlIEJTRCBMaW51eCBpbmhlcml0cyBJUCBvcHRpb25zIHNvIHlvdSBkb24ndCBoYXZlIHRvIHVzZSBhIHJhdworICogc29ja2V0IGZvciB0aGlzLiBJbnN0ZWFkIHdlIGNoZWNrIHJpZ2h0cyBpbiB0aGUgY2FsbHMuCisgKgorICogQVRURU5USU9OOiBjaGVjayBsaW51eC9pbi5oIGJlZm9yZSBhZGRpbmcgbmV3IG51bWJlciBoZXJlLgorICovCisjZGVmaW5lIEFSUFRfQkFTRV9DVEwJCTk2CisKKyNkZWZpbmUgQVJQVF9TT19TRVRfUkVQTEFDRQkJKEFSUFRfQkFTRV9DVEwpCisjZGVmaW5lIEFSUFRfU09fU0VUX0FERF9DT1VOVEVSUwkoQVJQVF9CQVNFX0NUTCArIDEpCisjZGVmaW5lIEFSUFRfU09fU0VUX01BWAkJCUFSUFRfU09fU0VUX0FERF9DT1VOVEVSUworCisjZGVmaW5lIEFSUFRfU09fR0VUX0lORk8JCShBUlBUX0JBU0VfQ1RMKQorI2RlZmluZSBBUlBUX1NPX0dFVF9FTlRSSUVTCQkoQVJQVF9CQVNFX0NUTCArIDEpCisvKiAjZGVmaW5lIEFSUFRfU09fR0VUX1JFVklTSU9OX01BVENICShBUFJUX0JBU0VfQ1RMICsgMikgKi8KKyNkZWZpbmUgQVJQVF9TT19HRVRfUkVWSVNJT05fVEFSR0VUCShBUlBUX0JBU0VfQ1RMICsgMykKKyNkZWZpbmUgQVJQVF9TT19HRVRfTUFYCQkJKEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVCkKKworLyogQ09OVElOVUUgdmVyZGljdCBmb3IgdGFyZ2V0cyAqLworI2RlZmluZSBBUlBUX0NPTlRJTlVFIFhUX0NPTlRJTlVFCisKKy8qIEZvciBzdGFuZGFyZCB0YXJnZXQgKi8KKyNkZWZpbmUgQVJQVF9SRVRVUk4gWFRfUkVUVVJOCisKKy8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9JTkZPICovCitzdHJ1Y3QgYXJwdF9nZXRpbmZvCit7CisJLyogV2hpY2ggdGFibGU6IGNhbGxlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtBUlBUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogS2VybmVsIGZpbGxzIHRoZXNlIGluLiAqLworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzayAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzOiBvbmUgcGVyIG5ldGZpbHRlciBob29rLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0FSUF9OVU1IT09LU107CisKKwkvKiBVbmRlcmZsb3cgcG9pbnRzLiAqLworCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfQVJQX05VTUhPT0tTXTsKKworCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJLyogU2l6ZSBvZiBlbnRyaWVzLiAqLworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fU0VUX1JFUExBQ0UuICovCitzdHJ1Y3QgYXJwdF9yZXBsYWNlCit7CisJLyogV2hpY2ggdGFibGUuICovCisJY2hhciBuYW1lW0FSUFRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2suICBZb3UgY2FuJ3QKKyAgICAgICAgICAgY2hhbmdlIHRoaXMuICovCisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCisJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisKKwkvKiBUb3RhbCBzaXplIG9mIG5ldyBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9BUlBfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0FSUF9OVU1IT09LU107CisKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCBvbGQgZW50cmllczogKi8KKwkvKiBOdW1iZXIgb2YgY291bnRlcnMgKG11c3QgYmUgZXF1YWwgdG8gY3VycmVudCBudW1iZXIgb2YgZW50cmllcykuICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiBUaGUgb2xkIGVudHJpZXMnIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CisKKwkvKiBUaGUgZW50cmllcyAoaGFuZyBvZmYgZW5kOiBub3QgcmVhbGx5IGFuIGFycmF5KS4gKi8KKwlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworLyogVGhlIGFyZ3VtZW50IHRvIEFSUFRfU09fQUREX0NPVU5URVJTLiAqLworI2RlZmluZSBhcnB0X2NvdW50ZXJzX2luZm8geHRfY291bnRlcnNfaW5mbworI2RlZmluZSBhcnB0X2NvdW50ZXJzIHh0X2NvdW50ZXJzCisKKy8qIFRoZSBhcmd1bWVudCB0byBBUlBUX1NPX0dFVF9FTlRSSUVTLiAqLworc3RydWN0IGFycHRfZ2V0X2VudHJpZXMKK3sKKwkvKiBXaGljaCB0YWJsZTogdXNlciBmaWxscyB0aGlzIGluLiAqLworCWNoYXIgbmFtZVtBUlBUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogVXNlciBmaWxscyB0aGlzIGluOiB0b3RhbCBlbnRyeSBzaXplLiAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogVGhlIGVudHJpZXMuICovCisJc3RydWN0IGFycHRfZW50cnkgZW50cnl0YWJsZVswXTsKK307CisKKy8qIFN0YW5kYXJkIHJldHVybiB2ZXJkaWN0LCBvciBkbyBqdW1wLiAqLworI2RlZmluZSBBUlBUX1NUQU5EQVJEX1RBUkdFVCBYVF9TVEFOREFSRF9UQVJHRVQKKy8qIEVycm9yIHZlcmRpY3QuICovCisjZGVmaW5lIEFSUFRfRVJST1JfVEFSR0VUIFhUX0VSUk9SX1RBUkdFVAorCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgYXJwdF9lbnRyeV90YXJnZXQgKmFycHRfZ2V0X3RhcmdldChzdHJ1Y3QgYXJwdF9lbnRyeSAqZSkKK3sKKwlyZXR1cm4gKHZvaWQgKillICsgZS0+dGFyZ2V0X29mZnNldDsKK30KKworLyogZm4gcmV0dXJucyAwIHRvIGNvbnRpbnVlIGl0ZXJhdGlvbiAqLworI2RlZmluZSBBUlBUX0VOVFJZX0lURVJBVEUoZW50cmllcywgc2l6ZSwgZm4sIGFyZ3MuLi4pCQlcCisoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2k7CQkJCQlcCisJaW50IF9fcmV0ID0gMDsJCQkJCQlcCisJc3RydWN0IGFycHRfZW50cnkgKl9fZW50cnk7CQkJCVwKKwkJCQkJCQkJXAorCWZvciAoX19pID0gMDsgX19pIDwgKHNpemUpOyBfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQpIHsgXAorCQlfX2VudHJ5ID0gKHZvaWQgKikoZW50cmllcykgKyBfX2k7CQlcCisJCQkJCQkJCVwKKwkJX19yZXQgPSBmbihfX2VudHJ5ICwgIyMgYXJncyk7CQkJXAorCQlpZiAoX19yZXQgIT0gMCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJXAorCX0JCQkJCQkJXAorCV9fcmV0OwkJCQkJCQlcCit9KQorCisvKgorICoJTWFpbiBmaXJld2FsbCBjaGFpbnMgZGVmaW5pdGlvbnMgYW5kIGdsb2JhbCB2YXIncyBkZWZpbml0aW9ucy4KKyAqLworI2VuZGlmIC8qIF9BUlBUQUJMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycHRfbWFuZ2xlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwdF9tYW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBmNTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycHRfbWFuZ2xlLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfQVJQVF9NQU5HTEVfSAorI2RlZmluZSBfQVJQVF9NQU5HTEVfSAorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oPgorCisjZGVmaW5lIEFSUFRfTUFOR0xFX0FERFJfTEVOX01BWCBzaXplb2Yoc3RydWN0IGluX2FkZHIpCitzdHJ1Y3QgYXJwdF9tYW5nbGUKK3sKKwljaGFyIHNyY19kZXZhZGRyW0FSUFRfREVWX0FERFJfTEVOX01BWF07CisJY2hhciB0Z3RfZGV2YWRkcltBUlBUX0RFVl9BRERSX0xFTl9NQVhdOworCXVuaW9uIHsKKwkJc3RydWN0IGluX2FkZHIgc3JjX2lwOworCX0gdV9zOworCXVuaW9uIHsKKwkJc3RydWN0IGluX2FkZHIgdGd0X2lwOworCX0gdV90OworCXVfaW50OF90IGZsYWdzOworCWludCB0YXJnZXQ7Cit9OworCisjZGVmaW5lIEFSUFRfTUFOR0xFX1NERVYgMHgwMQorI2RlZmluZSBBUlBUX01BTkdMRV9UREVWIDB4MDIKKyNkZWZpbmUgQVJQVF9NQU5HTEVfU0lQIDB4MDQKKyNkZWZpbmUgQVJQVF9NQU5HTEVfVElQIDB4MDgKKyNkZWZpbmUgQVJQVF9NQU5HTEVfTUFTSyAweDBmCisKKyNlbmRpZiAvKiBfQVJQVF9NQU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk0ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9ORVRGSUxURVJfSAorCisvKiBicmlkZ2Utc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKworLyogQnJpZGdlIEhvb2tzICovCisvKiBBZnRlciBwcm9taXNjIGRyb3BzLCBjaGVja3N1bSBjaGVja3MuICovCisjZGVmaW5lIE5GX0JSX1BSRV9ST1VUSU5HCTAKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIHRoaXMgYm94LiAqLworI2RlZmluZSBORl9CUl9MT0NBTF9JTgkJMQorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgYW5vdGhlciBpbnRlcmZhY2UuICovCisjZGVmaW5lIE5GX0JSX0ZPUldBUkQJCTIKKy8qIFBhY2tldHMgY29taW5nIGZyb20gYSBsb2NhbCBwcm9jZXNzLiAqLworI2RlZmluZSBORl9CUl9MT0NBTF9PVVQJCTMKKy8qIFBhY2tldHMgYWJvdXQgdG8gaGl0IHRoZSB3aXJlLiAqLworI2RlZmluZSBORl9CUl9QT1NUX1JPVVRJTkcJNAorLyogTm90IHJlYWxseSBhIGhvb2ssIGJ1dCB1c2VkIGZvciB0aGUgZWJ0YWJsZXMgYnJvdXRlIHRhYmxlICovCisjZGVmaW5lIE5GX0JSX0JST1VUSU5HCQk1CisjZGVmaW5lIE5GX0JSX05VTUhPT0tTCQk2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF84MDJfMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWUzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0XzgwMl8zLmgKQEAgLTAsMCArMSw2MSBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfODAyXzNfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfODAyXzNfSAorCisjZGVmaW5lIEVCVF84MDJfM19TQVAgMHgwMQorI2RlZmluZSBFQlRfODAyXzNfVFlQRSAweDAyCisKKyNkZWZpbmUgRUJUXzgwMl8zX01BVENIICI4MDJfMyIKKworLyoKKyAqIElmIGZyYW1lIGhhcyBEU0FQL1NTQVAgdmFsdWUgMHhhYSB5b3UgbXVzdCBjaGVjayB0aGUgU05BUCB0eXBlCisgKiB0byBkaXNjb3ZlciB3aGF0IGtpbmQgb2YgcGFja2V0IHdlJ3JlIGNhcnJ5aW5nLiAKKyAqLworI2RlZmluZSBDSEVDS19UWVBFIDB4YWEKKworLyoKKyAqIENvbnRyb2wgZmllbGQgbWF5IGJlIG9uZSBvciB0d28gYnl0ZXMuICBJZiB0aGUgZmlyc3QgYnl0ZSBoYXMKKyAqIHRoZSB2YWx1ZSAweDAzIHRoZW4gdGhlIGVudGlyZSBsZW5ndGggaXMgb25lIGJ5dGUsIG90aGVyd2lzZSBpdCBpcyB0d28uCisgKiBPbmUgYnl0ZSBjb250cm9scyBhcmUgdXNlZCBpbiBVbm51bWJlcmVkIEluZm9ybWF0aW9uIGZyYW1lcy4KKyAqIFR3byBieXRlIGNvbnRyb2xzIGFyZSB1c2VkIGluIE51bWJlcmVkIEluZm9ybWF0aW9uIGZyYW1lcy4KKyAqLworI2RlZmluZSBJU19VSSAweDAzCisKKyNkZWZpbmUgRUJUXzgwMl8zX01BU0sgKEVCVF84MDJfM19TQVAgfCBFQlRfODAyXzNfVFlQRSB8IEVCVF84MDJfMykKKworLyogdWkgaGFzIG9uZSBieXRlIGN0cmwsIG5pIGhhcyB0d28gKi8KK3N0cnVjdCBoZHJfdWkgeworCXVpbnQ4X3QgZHNhcDsKKwl1aW50OF90IHNzYXA7CisJdWludDhfdCBjdHJsOworCXVpbnQ4X3Qgb3JpZ1szXTsKKwlfX2JlMTYgdHlwZTsKK307CisKK3N0cnVjdCBoZHJfbmkgeworCXVpbnQ4X3QgZHNhcDsKKwl1aW50OF90IHNzYXA7CisJX19iZTE2IGN0cmw7CisJdWludDhfdCAgb3JpZ1szXTsKKwlfX2JlMTYgdHlwZTsKK307CisKK3N0cnVjdCBlYnRfODAyXzNfaGRyIHsKKwl1aW50OF90ICBkYWRkcls2XTsKKwl1aW50OF90ICBzYWRkcls2XTsKKwlfX2JlMTYgbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IGhkcl91aSB1aTsKKwkJc3RydWN0IGhkcl9uaSBuaTsKKwl9IGxsYzsKK307CisKKworc3RydWN0IGVidF84MDJfM19pbmZvIAoreworCXVpbnQ4X3QgIHNhcDsKKwlfX2JlMTYgdHlwZTsKKwl1aW50OF90ICBiaXRtYXNrOworCXVpbnQ4X3QgIGludmZsYWdzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2Ftb25nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2Ftb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1NDA2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfYW1vbmcuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9BTU9OR19ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9BTU9OR19ICisKKyNkZWZpbmUgRUJUX0FNT05HX0RTVCAweDAxCisjZGVmaW5lIEVCVF9BTU9OR19TUkMgMHgwMgorCisvKiBHcnplZ29yeiBCb3Jvd2lhayA8Z3J6ZXNAZ251LnVuaXYuZ2RhLnBsPiAyMDAzCisgKiAKKyAqIFdyaXRlLW9uY2UtcmVhZC1tYW55IGhhc2ggdGFibGUsIHVzZWQgZm9yIGNoZWNraW5nIGlmIGEgZ2l2ZW4KKyAqIE1BQyBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBzZXQgb3Igbm90IGFuZCBwb3NzaWJseSBmb3IgY2hlY2tpbmcKKyAqIGlmIGl0IGlzIHJlbGF0ZWQgd2l0aCBhIGdpdmVuIElQdjQgYWRkcmVzcy4KKyAqCisgKiBUaGUgaGFzaCB2YWx1ZSBvZiBhbiBhZGRyZXNzIGlzIGl0cyBsYXN0IGJ5dGUuCisgKiAKKyAqIEluIHJlYWwtd29ybGQgZXRoZXJuZXQgYWRkcmVzc2VzLCB2YWx1ZXMgb2YgdGhlIGxhc3QgYnl0ZSBhcmUKKyAqIGV2ZW5seSBkaXN0cmlidXRlZCBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBjb25zaWRlciBvdGhlciBieXRlcy4KKyAqIEl0IHdvdWxkIG9ubHkgc2xvdyB0aGUgcm91dGluZXMgZG93bi4KKyAqCisgKiBGb3IgTUFDIGFkZHJlc3MgY29tcGFyaXNvbiBzcGVlZHVwIHJlYXNvbnMsIHdlIGludHJvZHVjZSBhIHRyaWNrLgorICogTUFDIGFkZHJlc3MgaXMgbWFwcGVkIG9udG8gYW4gYXJyYXkgb2YgdHdvIDMyLWJpdCBpbnRlZ2Vycy4KKyAqIFRoaXMgcGFpciBvZiBpbnRlZ2VycyBpcyBjb21wYXJlZCB3aXRoIE1BQyBhZGRyZXNzZXMgaW4gdGhlCisgKiBoYXNoIHRhYmxlLCB3aGljaCBhcmUgc3RvcmVkIGFsc28gaW4gZm9ybSBvZiBwYWlycyBvZiBpbnRlZ2VycworICogKGluIGBjbXAnIGFycmF5KS4gVGhpcyBpcyBxdWljayBhcyBpdCByZXF1aXJlcyBvbmx5IHR3byBlbGVtZW50YXJ5CisgKiBudW1iZXIgY29tcGFyaXNvbnMgaW4gd29yc3QgY2FzZS4gRnVydGhlciwgd2UgdGFrZSBhZHZhbnRhZ2Ugb2YKKyAqIGZhY3QgdGhhdCBlbnRyb3B5IG9mIDMgbGFzdCBieXRlcyBvZiBhZGRyZXNzIGlzIGxhcmdlciB0aGFuIGVudHJvcHkKKyAqIG9mIDMgZmlyc3QgYnl0ZXMuIFNvIGZpcnN0IHdlIGNvbXBhcmUgNCBsYXN0IGJ5dGVzIG9mIGFkZHJlc3NlcyBhbmQKKyAqIGlmIHRoZXkgYXJlIHRoZSBzYW1lIHdlIGNvbXBhcmUgMiBmaXJzdC4KKyAqCisgKiBZZXMsIGl0IGlzIGEgbWVtb3J5IG92ZXJoZWFkLCBidXQgaW4gMjAwMyBBRCwgd2hvIGNhcmVzPworICovCisKK3N0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlCit7CisJdWludDMyX3QgY21wWzJdOworCV9fYmUzMiBpcDsKK307CisKK3N0cnVjdCBlYnRfbWFjX3dvcm1oYXNoCit7CisJaW50IHRhYmxlWzI1N107CisJaW50IHBvb2xzaXplOworCXN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoX3R1cGxlIHBvb2xbMF07Cit9OworCisjZGVmaW5lIGVidF9tYWNfd29ybWhhc2hfc2l6ZSh4KSAoKHgpID8gc2l6ZW9mKHN0cnVjdCBlYnRfbWFjX3dvcm1oYXNoKSBcCisJCSsgKHgpLT5wb29sc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZWJ0X21hY193b3JtaGFzaF90dXBsZSkgOiAwKQorCitzdHJ1Y3QgZWJ0X2Ftb25nX2luZm8KK3sKKwlpbnQgd2hfZHN0X29mczsKKwlpbnQgd2hfc3JjX29mczsKKwlpbnQgYml0bWFzazsKK307CisKKyNkZWZpbmUgRUJUX0FNT05HX0RTVF9ORUcgMHgxCisjZGVmaW5lIEVCVF9BTU9OR19TUkNfTkVHIDB4MgorCisjZGVmaW5lIGVidF9hbW9uZ193aF9kc3QoeCkgKCh4KS0+d2hfZHN0X29mcyA/IFwKKwkoc3RydWN0IGVidF9tYWNfd29ybWhhc2gqKSgoY2hhciopKHgpICsgKHgpLT53aF9kc3Rfb2ZzKSA6IE5VTEwpCisjZGVmaW5lIGVidF9hbW9uZ193aF9zcmMoeCkgKCh4KS0+d2hfc3JjX29mcyA/IFwKKwkoc3RydWN0IGVidF9tYWNfd29ybWhhc2gqKSgoY2hhciopKHgpICsgKHgpLT53aF9zcmNfb2ZzKSA6IE5VTEwpCisKKyNkZWZpbmUgRUJUX0FNT05HX01BVENIICJhbW9uZyIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY0ODQzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnAuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9BUlBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfQVJQX0gKKworI2RlZmluZSBFQlRfQVJQX09QQ09ERSAweDAxCisjZGVmaW5lIEVCVF9BUlBfSFRZUEUgMHgwMgorI2RlZmluZSBFQlRfQVJQX1BUWVBFIDB4MDQKKyNkZWZpbmUgRUJUX0FSUF9TUkNfSVAgMHgwOAorI2RlZmluZSBFQlRfQVJQX0RTVF9JUCAweDEwCisjZGVmaW5lIEVCVF9BUlBfU1JDX01BQyAweDIwCisjZGVmaW5lIEVCVF9BUlBfRFNUX01BQyAweDQwCisjZGVmaW5lIEVCVF9BUlBfR1JBVCAweDgwCisjZGVmaW5lIEVCVF9BUlBfTUFTSyAoRUJUX0FSUF9PUENPREUgfCBFQlRfQVJQX0hUWVBFIHwgRUJUX0FSUF9QVFlQRSB8IFwKKyAgIEVCVF9BUlBfU1JDX0lQIHwgRUJUX0FSUF9EU1RfSVAgfCBFQlRfQVJQX1NSQ19NQUMgfCBFQlRfQVJQX0RTVF9NQUMgfCBcCisgICBFQlRfQVJQX0dSQVQpCisjZGVmaW5lIEVCVF9BUlBfTUFUQ0ggImFycCIKKworc3RydWN0IGVidF9hcnBfaW5mbworeworCV9fYmUxNiBodHlwZTsKKwlfX2JlMTYgcHR5cGU7CisJX19iZTE2IG9wY29kZTsKKwlfX2JlMzIgc2FkZHI7CisJX19iZTMyIHNtc2s7CisJX19iZTMyIGRhZGRyOworCV9fYmUzMiBkbXNrOworCXVuc2lnbmVkIGNoYXIgc21hZGRyW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHNtbXNrW0VUSF9BTEVOXTsKKwl1bnNpZ25lZCBjaGFyIGRtYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkbW1za1tFVEhfQUxFTl07CisJdWludDhfdCAgYml0bWFzazsKKwl1aW50OF90ICBpbnZmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9hcnByZXBseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTgzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2FycHJlcGx5LmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfQVJQUkVQTFlfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfQVJQUkVQTFlfSAorCitzdHJ1Y3QgZWJ0X2FycHJlcGx5X2luZm8KK3sKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07CisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9BUlBSRVBMWV9UQVJHRVQgImFycHJlcGx5IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjg0NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9pcC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgZWJ0X2lwCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIgPGJhcnQuZGUuc2NodXltZXJAcGFuZG9yYS5iZT4KKyAqCisgKiAgQXByaWwsIDIwMDIKKyAqCisgKiAgQ2hhbmdlczoKKyAqICAgIGFkZGVkIGlwLXNwb3J0IGFuZCBpcC1kcG9ydAorICogICAgSW5ub21pbmF0ZSBTZWN1cml0eSBUZWNobm9sb2dpZXMgQUcgPG1ob3BmQGlubm9taW5hdGUuY29tPgorICogICAgU2VwdGVtYmVyLCAyMDAyCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfSVBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfSVBfSAorCisjZGVmaW5lIEVCVF9JUF9TT1VSQ0UgMHgwMQorI2RlZmluZSBFQlRfSVBfREVTVCAweDAyCisjZGVmaW5lIEVCVF9JUF9UT1MgMHgwNAorI2RlZmluZSBFQlRfSVBfUFJPVE8gMHgwOAorI2RlZmluZSBFQlRfSVBfU1BPUlQgMHgxMAorI2RlZmluZSBFQlRfSVBfRFBPUlQgMHgyMAorI2RlZmluZSBFQlRfSVBfTUFTSyAoRUJUX0lQX1NPVVJDRSB8IEVCVF9JUF9ERVNUIHwgRUJUX0lQX1RPUyB8IEVCVF9JUF9QUk9UTyB8XAorIEVCVF9JUF9TUE9SVCB8IEVCVF9JUF9EUE9SVCApCisjZGVmaW5lIEVCVF9JUF9NQVRDSCAiaXAiCisKKy8qIHRoZSBzYW1lIHZhbHVlcyBhcmUgdXNlZCBmb3IgdGhlIGludmZsYWdzICovCitzdHJ1Y3QgZWJ0X2lwX2luZm8KK3sKKwlfX2JlMzIgc2FkZHI7CisJX19iZTMyIGRhZGRyOworCV9fYmUzMiBzbXNrOworCV9fYmUzMiBkbXNrOworCXVpbnQ4X3QgIHRvczsKKwl1aW50OF90ICBwcm90b2NvbDsKKwl1aW50OF90ICBiaXRtYXNrOworCXVpbnQ4X3QgIGludmZsYWdzOworCXVpbnQxNl90IHNwb3J0WzJdOworCXVpbnQxNl90IGRwb3J0WzJdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiNjUwMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbGltaXQuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9MSU1JVF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9MSU1JVF9ICisKKyNkZWZpbmUgRUJUX0xJTUlUX01BVENIICJsaW1pdCIKKworLyogdGltaW5ncyBhcmUgaW4gbWlsbGlzZWNvbmRzLiAqLworI2RlZmluZSBFQlRfTElNSVRfU0NBTEUgMTAwMDAKKworLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCisgICBzZWNvbmRzLCBvciBvbmUgZXZlcnkgNTkgaG91cnMuICovCisKK3N0cnVjdCBlYnRfbGltaXRfaW5mbworeworCXVfaW50MzJfdCBhdmc7ICAgIC8qIEF2ZXJhZ2Ugc2VjcyBiZXR3ZWVuIHBhY2tldHMgKiBzY2FsZSAqLworCXVfaW50MzJfdCBidXJzdDsgIC8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKworCS8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsICovCisJdW5zaWduZWQgbG9uZyBwcmV2OworCXVfaW50MzJfdCBjcmVkaXQ7CisJdV9pbnQzMl90IGNyZWRpdF9jYXAsIGNvc3Q7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTIzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X2xvZy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUJUX0xPR19ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9MT0dfSAorCisjZGVmaW5lIEVCVF9MT0dfSVAgMHgwMSAvKiBpZiB0aGUgZnJhbWUgaXMgbWFkZSBieSBpcCwgbG9nIHRoZSBpcCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBFQlRfTE9HX0FSUCAweDAyCisjZGVmaW5lIEVCVF9MT0dfTkZMT0cgMHgwNAorI2RlZmluZSBFQlRfTE9HX01BU0sgKEVCVF9MT0dfSVAgfCBFQlRfTE9HX0FSUCkKKyNkZWZpbmUgRUJUX0xPR19QUkVGSVhfU0laRSAzMAorI2RlZmluZSBFQlRfTE9HX1dBVENIRVIgImxvZyIKKworc3RydWN0IGVidF9sb2dfaW5mbworeworCXVpbnQ4X3QgbG9nbGV2ZWw7CisJdWludDhfdCBwcmVmaXhbRUJUX0xPR19QUkVGSVhfU0laRV07CisJdWludDMyX3QgYml0bWFzazsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya19tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxNTI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfbWFya19tLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfX0xJTlVYX0JSSURHRV9FQlRfTUFSS19NX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX01BUktfTV9ICisKKyNkZWZpbmUgRUJUX01BUktfQU5EIDB4MDEKKyNkZWZpbmUgRUJUX01BUktfT1IgMHgwMgorI2RlZmluZSBFQlRfTUFSS19NQVNLIChFQlRfTUFSS19BTkQgfCBFQlRfTUFSS19PUikKK3N0cnVjdCBlYnRfbWFya19tX2luZm8KK3sKKwl1bnNpZ25lZCBsb25nIG1hcmssIG1hc2s7CisJdWludDhfdCBpbnZlcnQ7CisJdWludDhfdCBiaXRtYXNrOworfTsKKyNkZWZpbmUgRUJUX01BUktfTUFUQ0ggIm1hcmtfbSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X21hcmtfdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjcwZjZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9tYXJrX3QuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9NQVJLX1RfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTUFSS19UX0gKKworLyogVGhlIHRhcmdldCBtZW1iZXIgaXMgcmV1c2VkIGZvciBhZGRpbmcgbmV3IGFjdGlvbnMsIHRoZQorICogdmFsdWUgb2YgdGhlIHJlYWwgdGFyZ2V0IGlzIC0xIHRvIC1OVU1fU1RBTkRBUkRfVEFSR0VUUy4KKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgNCBsc2IgKDIgd291bGQgYmUgZW5vdWdoLAorICogYnV0IGxldCdzIHBsYXkgaXQgc2FmZSkgYXJlIGtlcHQgdG8gZGVzaWduYXRlIHRoaXMgdGFyZ2V0LgorICogVGhlIHJlbWFpbmluZyBiaXRzIGRlc2lnbmF0ZSB0aGUgYWN0aW9uLiBCeSBtYWtpbmcgdGhlIHNldAorICogYWN0aW9uIDB4ZmZmZmZmZjAsIHRoZSByZXN1bHQgd2lsbCBsb29rIG9rIGZvciBvbGRlcgorICogdmVyc2lvbnMuIFtTZXB0ZW1iZXIgMjAwNl0gKi8KKyNkZWZpbmUgTUFSS19TRVRfVkFMVUUgKDB4ZmZmZmZmZjApCisjZGVmaW5lIE1BUktfT1JfVkFMVUUgICgweGZmZmZmZmUwKQorI2RlZmluZSBNQVJLX0FORF9WQUxVRSAoMHhmZmZmZmZkMCkKKyNkZWZpbmUgTUFSS19YT1JfVkFMVUUgKDB4ZmZmZmZmYzApCisKK3N0cnVjdCBlYnRfbWFya190X2luZm8KK3sKKwl1bnNpZ25lZCBsb25nIG1hcms7CisJLyogRUJUX0FDQ0VQVCwgRUJUX0RST1AsIEVCVF9DT05USU5VRSBvciBFQlRfUkVUVVJOICovCisJaW50IHRhcmdldDsKK307CisjZGVmaW5lIEVCVF9NQVJLX1RBUkdFVCAibWFyayIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X25hdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzViODg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9uYXQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9OQVRfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfTkFUX0gKKworI2RlZmluZSBOQVRfQVJQX0JJVCAgKDB4MDAwMDAwMTApCitzdHJ1Y3QgZWJ0X25hdF9pbmZvCit7CisJdW5zaWduZWQgY2hhciBtYWNbRVRIX0FMRU5dOworCS8qIEVCVF9BQ0NFUFQsIEVCVF9EUk9QLCBFQlRfQ09OVElOVUUgb3IgRUJUX1JFVFVSTiAqLworCWludCB0YXJnZXQ7Cit9OworI2RlZmluZSBFQlRfU05BVF9UQVJHRVQgInNuYXQiCisjZGVmaW5lIEVCVF9ETkFUX1RBUkdFVCAiZG5hdCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3BrdHR5cGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcGt0dHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjRiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3BrdHR5cGUuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9QS1RUWVBFX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX1BLVFRZUEVfSAorCitzdHJ1Y3QgZWJ0X3BrdHR5cGVfaW5mbworeworCXVpbnQ4X3QgcGt0X3R5cGU7CisJdWludDhfdCBpbnZlcnQ7Cit9OworI2RlZmluZSBFQlRfUEtUVFlQRV9NQVRDSCAicGt0dHlwZSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3JlZGlyZWN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3JlZGlyZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2Nzk5MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfcmVkaXJlY3QuaApAQCAtMCwwICsxLDExIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9SRURJUkVDVF9ICisjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VCVF9SRURJUkVDVF9ICisKK3N0cnVjdCBlYnRfcmVkaXJlY3RfaW5mbworeworCS8qIEVCVF9BQ0NFUFQsIEVCVF9EUk9QLCBFQlRfQ09OVElOVUUgb3IgRUJUX1JFVFVSTiAqLworCWludCB0YXJnZXQ7Cit9OworI2RlZmluZSBFQlRfUkVESVJFQ1RfVEFSR0VUICJyZWRpcmVjdCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3N0cC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWZkNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF9zdHAuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9TVFBfSAorI2RlZmluZSBfX0xJTlVYX0JSSURHRV9FQlRfU1RQX0gKKworI2RlZmluZSBFQlRfU1RQX1RZUEUJCTB4MDAwMQorCisjZGVmaW5lIEVCVF9TVFBfRkxBR1MJCTB4MDAwMgorI2RlZmluZSBFQlRfU1RQX1JPT1RQUklPCTB4MDAwNAorI2RlZmluZSBFQlRfU1RQX1JPT1RBRERSCTB4MDAwOAorI2RlZmluZSBFQlRfU1RQX1JPT1RDT1NUCTB4MDAxMAorI2RlZmluZSBFQlRfU1RQX1NFTkRFUlBSSU8JMHgwMDIwCisjZGVmaW5lIEVCVF9TVFBfU0VOREVSQUREUgkweDAwNDAKKyNkZWZpbmUgRUJUX1NUUF9QT1JUCQkweDAwODAKKyNkZWZpbmUgRUJUX1NUUF9NU0dBR0UJCTB4MDEwMAorI2RlZmluZSBFQlRfU1RQX01BWEFHRQkJMHgwMjAwCisjZGVmaW5lIEVCVF9TVFBfSEVMTE9USU1FCTB4MDQwMAorI2RlZmluZSBFQlRfU1RQX0ZXREQJCTB4MDgwMAorCisjZGVmaW5lIEVCVF9TVFBfTUFTSwkJMHgwZmZmCisjZGVmaW5lIEVCVF9TVFBfQ09ORklHX01BU0sJMHgwZmZlCisKKyNkZWZpbmUgRUJUX1NUUF9NQVRDSCAic3RwIgorCitzdHJ1Y3QgZWJ0X3N0cF9jb25maWdfaW5mbworeworCXVpbnQ4X3QgZmxhZ3M7CisJdWludDE2X3Qgcm9vdF9wcmlvbCwgcm9vdF9wcmlvdTsKKwljaGFyIHJvb3RfYWRkcls2XSwgcm9vdF9hZGRybXNrWzZdOworCXVpbnQzMl90IHJvb3RfY29zdGwsIHJvb3RfY29zdHU7CisJdWludDE2X3Qgc2VuZGVyX3ByaW9sLCBzZW5kZXJfcHJpb3U7CisJY2hhciBzZW5kZXJfYWRkcls2XSwgc2VuZGVyX2FkZHJtc2tbNl07CisJdWludDE2X3QgcG9ydGwsIHBvcnR1OworCXVpbnQxNl90IG1zZ19hZ2VsLCBtc2dfYWdldTsKKwl1aW50MTZfdCBtYXhfYWdlbCwgbWF4X2FnZXU7CisJdWludDE2X3QgaGVsbG9fdGltZWwsIGhlbGxvX3RpbWV1OworCXVpbnQxNl90IGZvcndhcmRfZGVsYXlsLCBmb3J3YXJkX2RlbGF5dTsKK307CisKK3N0cnVjdCBlYnRfc3RwX2luZm8KK3sKKwl1aW50OF90IHR5cGU7CisJc3RydWN0IGVidF9zdHBfY29uZmlnX2luZm8gY29uZmlnOworCXVpbnQxNl90IGJpdG1hc2s7CisJdWludDE2X3QgaW52ZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdWxvZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidF91bG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3N2UyNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdWxvZy5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0VCVF9VTE9HX0gKKyNkZWZpbmUgX0VCVF9VTE9HX0gKKworI2RlZmluZSBFQlRfVUxPR19ERUZBVUxUX05MR1JPVVAgMAorI2RlZmluZSBFQlRfVUxPR19ERUZBVUxUX1FUSFJFU0hPTEQgMQorI2RlZmluZSBFQlRfVUxPR19NQVhOTEdST1VQUyAzMiAvKiBoYXJkY29kZWQgbmV0bGluayBtYXggKi8KKyNkZWZpbmUgRUJUX1VMT0dfUFJFRklYX0xFTiAzMgorI2RlZmluZSBFQlRfVUxPR19NQVhfUUxFTiA1MAorI2RlZmluZSBFQlRfVUxPR19XQVRDSEVSICJ1bG9nIgorI2RlZmluZSBFQlRfVUxPR19WRVJTSU9OIDEKKworc3RydWN0IGVidF91bG9nX2luZm8geworCXVpbnQzMl90IG5sZ3JvdXA7CisJdW5zaWduZWQgaW50IGNwcmFuZ2U7CisJdW5zaWduZWQgaW50IHF0aHJlc2hvbGQ7CisJY2hhciBwcmVmaXhbRUJUX1VMT0dfUFJFRklYX0xFTl07Cit9OworCit0eXBlZGVmIHN0cnVjdCBlYnRfdWxvZ19wYWNrZXRfbXNnIHsKKwlpbnQgdmVyc2lvbjsKKwljaGFyIGluZGV2W0lGTkFNU0laXTsKKwljaGFyIG91dGRldltJRk5BTVNJWl07CisJY2hhciBwaHlzaW5kZXZbSUZOQU1TSVpdOworCWNoYXIgcGh5c291dGRldltJRk5BTVNJWl07CisJY2hhciBwcmVmaXhbRUJUX1VMT0dfUFJFRklYX0xFTl07CisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJdW5zaWduZWQgbG9uZyBtYXJrOworCXVuc2lnbmVkIGludCBob29rOworCXNpemVfdCBkYXRhX2xlbjsKKwkvKiBUaGUgY29tcGxldGUgcGFja2V0LCBpbmNsdWRpbmcgRXRoZXJuZXQgaGVhZGVyIGFuZCBwZXJoYXBzCisJICogdGhlIFZMQU4gaGVhZGVyIGlzIGFwcGVuZGVkICovCisJdW5zaWduZWQgY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18KKwkgICAgICAgICAgICAgICAgICAgICAgKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3Vsb2dfaW5mbykpKSk7Cit9IGVidF91bG9nX3BhY2tldF9tc2dfdDsKKworI2VuZGlmIC8qIF9FQlRfVUxPR19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRfdmxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOThiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0X3ZsYW4uaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VCVF9WTEFOX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUJUX1ZMQU5fSAorCisjZGVmaW5lIEVCVF9WTEFOX0lECTB4MDEKKyNkZWZpbmUgRUJUX1ZMQU5fUFJJTwkweDAyCisjZGVmaW5lIEVCVF9WTEFOX0VOQ0FQCTB4MDQKKyNkZWZpbmUgRUJUX1ZMQU5fTUFTSyAoRUJUX1ZMQU5fSUQgfCBFQlRfVkxBTl9QUklPIHwgRUJUX1ZMQU5fRU5DQVApCisjZGVmaW5lIEVCVF9WTEFOX01BVENIICJ2bGFuIgorCitzdHJ1Y3QgZWJ0X3ZsYW5faW5mbyB7CisJdWludDE2X3QgaWQ7CQkvKiBWTEFOIElEIHsxLTQwOTV9ICovCisJdWludDhfdCBwcmlvOwkJLyogVkxBTiBVc2VyIFByaW9yaXR5IHswLTd9ICovCisJX19iZTE2IGVuY2FwOwkJLyogVkxBTiBFbmNhcHN1bGF0ZWQgZnJhbWUgY29kZSB7MC02NTUzNX0gKi8KKwl1aW50OF90IGJpdG1hc2s7CQkvKiBBcmdzIGJpdG1hc2sgYml0IDE9MSAtIElEIGFyZywKKwkJCQkgICBiaXQgMj0xIFVzZXItUHJpb3JpdHkgYXJnLCBiaXQgMz0xIGVuY2FwKi8KKwl1aW50OF90IGludmZsYWdzOwkJLyogSW52ZXJzZSBiaXRtYXNrICBiaXQgMT0xIC0gaW52ZXJzZWQgSUQgYXJnLCAKKwkJCQkgICBiaXQgMj0xIC0gaW52ZXJzZWQgUGlyb3JpdHkgYXJnICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyNWNiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogIGVidGFibGVzCisgKgorICoJQXV0aG9yczoKKyAqCUJhcnQgRGUgU2NodXltZXIJCTxiZHNjaHV5bUBwYW5kb3JhLmJlPgorICoKKyAqICBlYnRhYmxlcy5jLHYgMi4wLCBBcHJpbCwgMjAwMgorICoKKyAqICBUaGlzIGNvZGUgaXMgc3RvbmdseSBpbnNwaXJlZCBvbiB0aGUgaXB0YWJsZXMgY29kZSB3aGljaCBpcworICogIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZworICovCisKKyNpZm5kZWYgX19MSU5VWF9CUklER0VfRUZGX0gKKyNkZWZpbmUgX19MSU5VWF9CUklER0VfRUZGX0gKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjZGVmaW5lIEVCVF9UQUJMRV9NQVhOQU1FTEVOIDMyCisjZGVmaW5lIEVCVF9DSEFJTl9NQVhOQU1FTEVOIEVCVF9UQUJMRV9NQVhOQU1FTEVOCisjZGVmaW5lIEVCVF9GVU5DVElPTl9NQVhOQU1FTEVOIEVCVF9UQUJMRV9NQVhOQU1FTEVOCisKKy8qIHZlcmRpY3RzID4wIGFyZSAiYnJhbmNoZXMiICovCisjZGVmaW5lIEVCVF9BQ0NFUFQgICAtMQorI2RlZmluZSBFQlRfRFJPUCAgICAgLTIKKyNkZWZpbmUgRUJUX0NPTlRJTlVFIC0zCisjZGVmaW5lIEVCVF9SRVRVUk4gICAtNAorI2RlZmluZSBOVU1fU1RBTkRBUkRfVEFSR0VUUyAgIDQKKy8qIGVidGFibGVzIHRhcmdldCBtb2R1bGVzIHN0b3JlIHRoZSB2ZXJkaWN0IGluc2lkZSBhbiBpbnQuIFdlIGNhbgorICogcmVjbGFpbSBhIHBhcnQgb2YgdGhpcyBpbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxlIGV4dGVuc2lvbnMuCisgKiBUaGUgNCBsc2IgYXJlIG1vcmUgdGhhbiBlbm91Z2ggdG8gc3RvcmUgdGhlIHZlcmRpY3QuICovCisjZGVmaW5lIEVCVF9WRVJESUNUX0JJVFMgMHgwMDAwMDAwRgorCitzdHJ1Y3QgZWJ0X2NvdW50ZXIKK3sKKwl1aW50NjRfdCBwY250OworCXVpbnQ2NF90IGJjbnQ7Cit9OworCitzdHJ1Y3QgZWJ0X3JlcGxhY2UKK3sKKwljaGFyIG5hbWVbRUJUX1RBQkxFX01BWE5BTUVMRU5dOworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKwkvKiBuciBvZiBydWxlcyBpbiB0aGUgdGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgbmVudHJpZXM7CisJLyogdG90YWwgc2l6ZSBvZiB0aGUgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBlbnRyaWVzX3NpemU7CisJLyogc3RhcnQgb2YgdGhlIGNoYWlucyAqLworCXN0cnVjdCBlYnRfZW50cmllcyAqaG9va19lbnRyeVtORl9CUl9OVU1IT09LU107CisJLyogbnIgb2YgY291bnRlcnMgdXNlcnNwYWNlIGV4cGVjdHMgYmFjayAqLworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJLyogd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHB1dCB0aGUgb2xkIGNvdW50ZXJzICovCisJc3RydWN0IGVidF9jb3VudGVyICpjb3VudGVyczsKKwljaGFyICplbnRyaWVzOworfTsKKworc3RydWN0IGVidF9yZXBsYWNlX2tlcm5lbAoreworCWNoYXIgbmFtZVtFQlRfVEFCTEVfTUFYTkFNRUxFTl07CisJdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzOworCS8qIG5yIG9mIHJ1bGVzIGluIHRoZSB0YWJsZSAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwkvKiB0b3RhbCBzaXplIG9mIHRoZSBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IGVudHJpZXNfc2l6ZTsKKwkvKiBzdGFydCBvZiB0aGUgY2hhaW5zICovCisJc3RydWN0IGVidF9lbnRyaWVzICpob29rX2VudHJ5W05GX0JSX05VTUhPT0tTXTsKKwkvKiBuciBvZiBjb3VudGVycyB1c2Vyc3BhY2UgZXhwZWN0cyBiYWNrICovCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKwkvKiB3aGVyZSB0aGUga2VybmVsIHdpbGwgcHV0IHRoZSBvbGQgY291bnRlcnMgKi8KKwlzdHJ1Y3QgZWJ0X2NvdW50ZXIgKmNvdW50ZXJzOworCWNoYXIgKmVudHJpZXM7Cit9OworCitzdHJ1Y3QgZWJ0X2VudHJpZXMgeworCS8qIHRoaXMgZmllbGQgaXMgYWx3YXlzIHNldCB0byB6ZXJvCisJICogU2VlIEVCVF9FTlRSWV9PUl9FTlRSSUVTLgorCSAqIE11c3QgYmUgc2FtZSBzaXplIGFzIGVidF9lbnRyeS5iaXRtYXNrICovCisJdW5zaWduZWQgaW50IGRpc3Rpbmd1aXNoZXI7CisJLyogdGhlIGNoYWluIG5hbWUgKi8KKwljaGFyIG5hbWVbRUJUX0NIQUlOX01BWE5BTUVMRU5dOworCS8qIGNvdW50ZXIgb2Zmc2V0IGZvciB0aGlzIGNoYWluICovCisJdW5zaWduZWQgaW50IGNvdW50ZXJfb2Zmc2V0OworCS8qIG9uZSBzdGFuZGFyZCAoYWNjZXB0LCBkcm9wLCByZXR1cm4pIHBlciBob29rICovCisJaW50IHBvbGljeTsKKwkvKiBuci4gb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBuZW50cmllczsKKwkvKiBlbnRyeSBsaXN0ICovCisJY2hhciBkYXRhWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChfX2FsaWdub2ZfXyhzdHJ1Y3QgZWJ0X3JlcGxhY2UpKSkpOworfTsKKworLyogdXNlZCBmb3IgdGhlIGJpdG1hc2sgb2Ygc3RydWN0IGVidF9lbnRyeSAqLworCisvKiBUaGlzIGlzIGEgaGFjayB0byBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGVidF9lbnRyeSBzdHJ1Y3QgYW5kIGFuCisgKiBlYnRfZW50cmllcyBzdHJ1Y3Qgd2hlbiB0cmF2ZXJzaW5nIHRoZSBlbnRyaWVzIGZyb20gc3RhcnQgdG8gZW5kLgorICogVXNpbmcgdGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGFsb3QsIHdoaWxlIHN0aWxsIGJlaW5nIGFibGUgdG8gdXNlCisgKiBlYnRfZW50cmllcy4KKyAqIENvbnRyYXJ5LCBpcHRhYmxlcyBkb2Vzbid0IHVzZSBzb21ldGhpbmcgbGlrZSBlYnRfZW50cmllcyBhbmQgdGhlcmVmb3JlIHVzZXMKKyAqIGRpZmZlcmVudCB0ZWNobmlxdWVzIGZvciBuYW1pbmcgdGhlIHBvbGljeSBhbmQgc3VjaC4gU28sIGlwdGFibGVzIGRvZXNuJ3QKKyAqIG5lZWQgYSBoYWNrIGxpa2UgdGhpcy4KKyAqLworI2RlZmluZSBFQlRfRU5UUllfT1JfRU5UUklFUyAweDAxCisvKiB0aGVzZSBhcmUgdGhlIG5vcm1hbCBtYXNrcyAqLworI2RlZmluZSBFQlRfTk9QUk9UTyAweDAyCisjZGVmaW5lIEVCVF84MDJfMyAweDA0CisjZGVmaW5lIEVCVF9TT1VSQ0VNQUMgMHgwOAorI2RlZmluZSBFQlRfREVTVE1BQyAweDEwCisjZGVmaW5lIEVCVF9GX01BU0sgKEVCVF9OT1BST1RPIHwgRUJUXzgwMl8zIHwgRUJUX1NPVVJDRU1BQyB8IEVCVF9ERVNUTUFDIFwKKyAgIHwgRUJUX0VOVFJZX09SX0VOVFJJRVMpCisKKyNkZWZpbmUgRUJUX0lQUk9UTyAweDAxCisjZGVmaW5lIEVCVF9JSU4gMHgwMgorI2RlZmluZSBFQlRfSU9VVCAweDA0CisjZGVmaW5lIEVCVF9JU09VUkNFIDB4OAorI2RlZmluZSBFQlRfSURFU1QgMHgxMAorI2RlZmluZSBFQlRfSUxPR0lDQUxJTiAweDIwCisjZGVmaW5lIEVCVF9JTE9HSUNBTE9VVCAweDQwCisjZGVmaW5lIEVCVF9JTlZfTUFTSyAoRUJUX0lQUk9UTyB8IEVCVF9JSU4gfCBFQlRfSU9VVCB8IEVCVF9JTE9HSUNBTElOIFwKKyAgIHwgRUJUX0lMT0dJQ0FMT1VUIHwgRUJUX0lTT1VSQ0UgfCBFQlRfSURFU1QpCisKK3N0cnVjdCBlYnRfZW50cnlfbWF0Y2gKK3sKKwl1bmlvbiB7CisJCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJCXN0cnVjdCBlYnRfbWF0Y2ggKm1hdGNoOworCX0gdTsKKwkvKiBzaXplIG9mIGRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgbWF0Y2hfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCitzdHJ1Y3QgZWJ0X2VudHJ5X3dhdGNoZXIKK3sKKwl1bmlvbiB7CisJCWNoYXIgbmFtZVtFQlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisJCXN0cnVjdCBlYnRfd2F0Y2hlciAqd2F0Y2hlcjsKKwl9IHU7CisJLyogc2l6ZSBvZiBkYXRhICovCisJdW5zaWduZWQgaW50IHdhdGNoZXJfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKF9fYWxpZ25vZl9fKHN0cnVjdCBlYnRfcmVwbGFjZSkpKSk7Cit9OworCitzdHJ1Y3QgZWJ0X2VudHJ5X3RhcmdldAoreworCXVuaW9uIHsKKwkJY2hhciBuYW1lW0VCVF9GVU5DVElPTl9NQVhOQU1FTEVOXTsKKwkJc3RydWN0IGVidF90YXJnZXQgKnRhcmdldDsKKwl9IHU7CisJLyogc2l6ZSBvZiBkYXRhICovCisJdW5zaWduZWQgaW50IHRhcmdldF9zaXplOworCXVuc2lnbmVkIGNoYXIgZGF0YVswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKKyNkZWZpbmUgRUJUX1NUQU5EQVJEX1RBUkdFVCAic3RhbmRhcmQiCitzdHJ1Y3QgZWJ0X3N0YW5kYXJkX3RhcmdldAoreworCXN0cnVjdCBlYnRfZW50cnlfdGFyZ2V0IHRhcmdldDsKKwlpbnQgdmVyZGljdDsKK307CisKKy8qIG9uZSBlbnRyeSAqLworc3RydWN0IGVidF9lbnRyeSB7CisJLyogdGhpcyBuZWVkcyB0byBiZSB0aGUgZmlyc3QgZmllbGQgKi8KKwl1bnNpZ25lZCBpbnQgYml0bWFzazsKKwl1bnNpZ25lZCBpbnQgaW52ZmxhZ3M7CisJX19iZTE2IGV0aHByb3RvOworCS8qIHRoZSBwaHlzaWNhbCBpbi1kZXYgKi8KKwljaGFyIGluW0lGTkFNU0laXTsKKwkvKiB0aGUgbG9naWNhbCBpbi1kZXYgKi8KKwljaGFyIGxvZ2ljYWxfaW5bSUZOQU1TSVpdOworCS8qIHRoZSBwaHlzaWNhbCBvdXQtZGV2ICovCisJY2hhciBvdXRbSUZOQU1TSVpdOworCS8qIHRoZSBsb2dpY2FsIG91dC1kZXYgKi8KKwljaGFyIGxvZ2ljYWxfb3V0W0lGTkFNU0laXTsKKwl1bnNpZ25lZCBjaGFyIHNvdXJjZW1hY1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBzb3VyY2Vtc2tbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgZGVzdG1hY1tFVEhfQUxFTl07CisJdW5zaWduZWQgY2hhciBkZXN0bXNrW0VUSF9BTEVOXTsKKwkvKiBzaXplb2YgZWJ0X2VudHJ5ICsgbWF0Y2hlcyAqLworCXVuc2lnbmVkIGludCB3YXRjaGVyc19vZmZzZXQ7CisJLyogc2l6ZW9mIGVidF9lbnRyeSArIG1hdGNoZXMgKyB3YXRjaGVycyAqLworCXVuc2lnbmVkIGludCB0YXJnZXRfb2Zmc2V0OworCS8qIHNpemVvZiBlYnRfZW50cnkgKyBtYXRjaGVzICsgd2F0Y2hlcnMgKyB0YXJnZXQgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9vZmZzZXQ7CisJdW5zaWduZWQgY2hhciBlbGVtc1swXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoX19hbGlnbm9mX18oc3RydWN0IGVidF9yZXBsYWNlKSkpKTsKK307CisKKy8qIHtnLHN9ZXRzb2Nrb3B0IG51bWJlcnMgKi8KKyNkZWZpbmUgRUJUX0JBU0VfQ1RMICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgRUJUX1NPX1NFVF9FTlRSSUVTICAgICAgKEVCVF9CQVNFX0NUTCkKKyNkZWZpbmUgRUJUX1NPX1NFVF9DT1VOVEVSUyAgICAgKEVCVF9TT19TRVRfRU5UUklFUysxKQorI2RlZmluZSBFQlRfU09fU0VUX01BWCAgICAgICAgICAoRUJUX1NPX1NFVF9DT1VOVEVSUysxKQorCisjZGVmaW5lIEVCVF9TT19HRVRfSU5GTyAgICAgICAgIChFQlRfQkFTRV9DVEwpCisjZGVmaW5lIEVCVF9TT19HRVRfRU5UUklFUyAgICAgIChFQlRfU09fR0VUX0lORk8rMSkKKyNkZWZpbmUgRUJUX1NPX0dFVF9JTklUX0lORk8gICAgKEVCVF9TT19HRVRfRU5UUklFUysxKQorI2RlZmluZSBFQlRfU09fR0VUX0lOSVRfRU5UUklFUyAoRUJUX1NPX0dFVF9JTklUX0lORk8rMSkKKyNkZWZpbmUgRUJUX1NPX0dFVF9NQVggICAgICAgICAgKEVCVF9TT19HRVRfSU5JVF9FTlRSSUVTKzEpCisKKworLyogYmxhdGVudGx5IHN0b2xlbiBmcm9tIGlwX3RhYmxlcy5oCisgKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIEVCVF9NQVRDSF9JVEVSQVRFKGUsIGZuLCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdW5zaWduZWQgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgX19yZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBlYnRfZW50cnlfbWF0Y2ggKl9fbWF0Y2g7ICAgICAgICAgICAgICAgICAgICBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKF9faSA9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5KTsgICAgICAgICAgICAgICAgXAorCSAgICAgX19pIDwgKGUpLT53YXRjaGVyc19vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX2kgKz0gX19tYXRjaC0+bWF0Y2hfc2l6ZSArICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJ5X21hdGNoKSkgeyAgICAgICAgICAgICAgXAorCQlfX21hdGNoID0gKHZvaWQgKikoZSkgKyBfX2k7ICAgICAgICAgICAgICAgIFwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCV9fcmV0ID0gZm4oX19tYXRjaCAsICMjIGFyZ3MpOyAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChfX3JldCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWlmIChfX2kgIT0gKGUpLT53YXRjaGVyc19vZmZzZXQpICAgICAgICAgICAgXAorCQkJX19yZXQgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJX19yZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgRUJUX1dBVENIRVJfSVRFUkFURShlLCBmbiwgYXJncy4uLikgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1bnNpZ25lZCBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCBfX3JldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IGVidF9lbnRyeV93YXRjaGVyICpfX3dhdGNoZXI7ICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWZvciAoX19pID0gZS0+d2F0Y2hlcnNfb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICBcCisJICAgICBfX2kgPCAoZSktPnRhcmdldF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgIF9faSArPSBfX3dhdGNoZXItPndhdGNoZXJfc2l6ZSArICAgICAgICAgICAgICAgXAorCSAgICAgc2l6ZW9mKHN0cnVjdCBlYnRfZW50cnlfd2F0Y2hlcikpIHsgICAgICAgICAgICBcCisJCV9fd2F0Y2hlciA9ICh2b2lkICopKGUpICsgX19pOyAgICAgICAgICAgICAgXAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX19yZXQgPSBmbihfX3dhdGNoZXIgLCAjIyBhcmdzKTsgICAgICAgICAgICBcCisJCWlmIChfX3JldCAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9fcmV0ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9faSAhPSAoZSktPnRhcmdldF9vZmZzZXQpICAgICAgICAgICAgICBcCisJCQlfX3JldCA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBFQlRfRU5UUllfSVRFUkFURShlbnRyaWVzLCBzaXplLCBmbiwgYXJncy4uLikgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaW50IF9fcmV0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZWJ0X2VudHJ5ICpfX2VudHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZm9yIChfX2kgPSAwOyBfX2kgPCAoc2l6ZSk7KSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkJX19lbnRyeSA9ICh2b2lkICopKGVudHJpZXMpICsgX19pOyAgICAgICAgICBcCisJCV9fcmV0ID0gZm4oX19lbnRyeSAsICMjIGFyZ3MpOyAgICAgICAgICAgICAgXAorCQlpZiAoX19yZXQgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9fZW50cnktPmJpdG1hc2sgIT0gMCkgICAgICAgICAgICAgICAgICBcCisJCQlfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQ7ICAgICAgICBcCisJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJX19pICs9IHNpemVvZihzdHJ1Y3QgZWJ0X2VudHJpZXMpOyAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKF9fcmV0ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYgKF9faSAhPSAoc2l6ZSkpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlfX3JldCA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlfX3JldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9kZWNuZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2RlY25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzBjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9kZWNuZXQuaApAQCAtMCwwICsxLDcyIEBACisjaWZuZGVmIF9fTElOVVhfREVDTkVUX05FVEZJTFRFUl9ICisjZGVmaW5lIF9fTElOVVhfREVDTkVUX05FVEZJTFRFUl9ICisKKy8qIERFQ25ldC1zcGVjaWZpYyBkZWZpbmVzIGZvciBuZXRmaWx0ZXIuIAorICogVGhpcyBmaWxlIChDKSBTdGV2ZSBXaGl0ZWhvdXNlIDE5OTkgZGVyaXZlZCBmcm9tIHRoZQorICogaXB2NCBuZXRmaWx0ZXIgaGVhZGVyIGZpbGUgd2hpY2ggaXMKKyAqIChDKTE5OTggUnVzdHkgUnVzc2VsbCAtLSBUaGlzIGNvZGUgaXMgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKy8qIElQIENhY2hlIGJpdHMuICovCisvKiBTcmMgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0ROX1NSQwkJMHgwMDAxCisvKiBEZXN0IElQIGFkZHJlc3MuICovCisjZGVmaW5lIE5GQ19ETl9EU1QJCTB4MDAwMgorLyogSW5wdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfRE5fSUZfSU4JCTB4MDAwNAorLyogT3V0cHV0IGRldmljZS4gKi8KKyNkZWZpbmUgTkZDX0ROX0lGX09VVAkJMHgwMDA4CisKKy8qIERFQ25ldCBIb29rcyAqLworLyogQWZ0ZXIgcHJvbWlzYyBkcm9wcywgY2hlY2tzdW0gY2hlY2tzLiAqLworI2RlZmluZSBORl9ETl9QUkVfUk9VVElORwkwCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciB0aGlzIGJveC4gKi8KKyNkZWZpbmUgTkZfRE5fTE9DQUxfSU4JCTEKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIGFub3RoZXIgaW50ZXJmYWNlLiAqLworI2RlZmluZSBORl9ETl9GT1JXQVJECQkyCisvKiBQYWNrZXRzIGNvbWluZyBmcm9tIGEgbG9jYWwgcHJvY2Vzcy4gKi8KKyNkZWZpbmUgTkZfRE5fTE9DQUxfT1VUCQkzCisvKiBQYWNrZXRzIGFib3V0IHRvIGhpdCB0aGUgd2lyZS4gKi8KKyNkZWZpbmUgTkZfRE5fUE9TVF9ST1VUSU5HCTQKKy8qIElucHV0IEhlbGxvIFBhY2tldHMgKi8KKyNkZWZpbmUgTkZfRE5fSEVMTE8JCTUKKy8qIElucHV0IFJvdXRpbmcgUGFja2V0cyAqLworI2RlZmluZSBORl9ETl9ST1VURQkJNgorI2RlZmluZSBORl9ETl9OVU1IT09LUwkJNworCitlbnVtIG5mX2RuX2hvb2tfcHJpb3JpdGllcyB7CisJTkZfRE5fUFJJX0ZJUlNUID0gSU5UX01JTiwKKwlORl9ETl9QUklfQ09OTlRSQUNLID0gLTIwMCwKKwlORl9ETl9QUklfTUFOR0xFID0gLTE1MCwKKwlORl9ETl9QUklfTkFUX0RTVCA9IC0xMDAsCisJTkZfRE5fUFJJX0ZJTFRFUiA9IDAsCisJTkZfRE5fUFJJX05BVF9TUkMgPSAxMDAsCisJTkZfRE5fUFJJX0ROUlRNU0cgPSAyMDAsCisJTkZfRE5fUFJJX0xBU1QgPSBJTlRfTUFYLAorfTsKKworc3RydWN0IG5mX2RuX3J0bXNnIHsKKwlpbnQgbmZkbl9pZmluZGV4OworfTsKKworI2RlZmluZSBORkROX1JUTVNHKHIpICgodW5zaWduZWQgY2hhciAqKShyKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZfZG5fcnRtc2cpKSkKKworLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBETlJNR19MMV9HUk9VUCAweDAxCisjZGVmaW5lIEROUk1HX0wyX0dST1VQIDB4MDIKKworZW51bSB7CisJRE5STkdfTkxHUlBfTk9ORSwKKyNkZWZpbmUgRE5STkdfTkxHUlBfTk9ORQlETlJOR19OTEdSUF9OT05FCisJRE5STkdfTkxHUlBfTDEsCisjZGVmaW5lIEROUk5HX05MR1JQX0wxCQlETlJOR19OTEdSUF9MMQorCUROUk5HX05MR1JQX0wyLAorI2RlZmluZSBETlJOR19OTEdSUF9MMgkJRE5STkdfTkxHUlBfTDIKKwlfX0ROUk5HX05MR1JQX01BWAorfTsKKyNkZWZpbmUgRE5STkdfTkxHUlBfTUFYCShfX0ROUk5HX05MR1JQX01BWCAtIDEpCisKKyNlbmRpZiAvKl9fTElOVVhfREVDTkVUX05FVEZJTFRFUl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFlNTBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC5oCkBAIC0wLDAgKzEsNzYgQEAKKyNpZm5kZWYgX19MSU5VWF9JUF9ORVRGSUxURVJfSAorI2RlZmluZSBfX0xJTlVYX0lQX05FVEZJTFRFUl9ICisKKy8qIElQdjQtc3BlY2lmaWMgZGVmaW5lcyBmb3IgbmV0ZmlsdGVyLiAKKyAqIChDKTE5OTggUnVzdHkgUnVzc2VsbCAtLSBUaGlzIGNvZGUgaXMgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKy8qIElQIENhY2hlIGJpdHMuICovCisvKiBTcmMgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0lQX1NSQwkJMHgwMDAxCisvKiBEZXN0IElQIGFkZHJlc3MuICovCisjZGVmaW5lIE5GQ19JUF9EU1QJCTB4MDAwMgorLyogSW5wdXQgZGV2aWNlLiAqLworI2RlZmluZSBORkNfSVBfSUZfSU4JCTB4MDAwNAorLyogT3V0cHV0IGRldmljZS4gKi8KKyNkZWZpbmUgTkZDX0lQX0lGX09VVAkJMHgwMDA4CisvKiBUT1MuICovCisjZGVmaW5lIE5GQ19JUF9UT1MJCTB4MDAxMAorLyogUHJvdG9jb2wuICovCisjZGVmaW5lIE5GQ19JUF9QUk9UTwkJMHgwMDIwCisvKiBJUCBvcHRpb25zLiAqLworI2RlZmluZSBORkNfSVBfT1BUSU9OUwkJMHgwMDQwCisvKiBGcmFnICYgZmxhZ3MuICovCisjZGVmaW5lIE5GQ19JUF9GUkFHCQkweDAwODAKKworLyogUGVyLXByb3RvY29sIGluZm9ybWF0aW9uOiBvbmx5IG1hdHRlcnMgaWYgcHJvdG8gbWF0Y2guICovCisvKiBUQ1AgZmxhZ3MuICovCisjZGVmaW5lIE5GQ19JUF9UQ1BGTEFHUwkJMHgwMTAwCisvKiBTb3VyY2UgcG9ydC4gKi8KKyNkZWZpbmUgTkZDX0lQX1NSQ19QVAkJMHgwMjAwCisvKiBEZXN0IHBvcnQuICovCisjZGVmaW5lIE5GQ19JUF9EU1RfUFQJCTB4MDQwMAorLyogU29tZXRoaW5nIGVsc2UgYWJvdXQgdGhlIHByb3RvICovCisjZGVmaW5lIE5GQ19JUF9QUk9UT19VTktOT1dOCTB4MjAwMAorCisvKiBJUCBIb29rcyAqLworLyogQWZ0ZXIgcHJvbWlzYyBkcm9wcywgY2hlY2tzdW0gY2hlY2tzLiAqLworI2RlZmluZSBORl9JUF9QUkVfUk9VVElORwkwCisvKiBJZiB0aGUgcGFja2V0IGlzIGRlc3RpbmVkIGZvciB0aGlzIGJveC4gKi8KKyNkZWZpbmUgTkZfSVBfTE9DQUxfSU4JCTEKKy8qIElmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgZm9yIGFub3RoZXIgaW50ZXJmYWNlLiAqLworI2RlZmluZSBORl9JUF9GT1JXQVJECQkyCisvKiBQYWNrZXRzIGNvbWluZyBmcm9tIGEgbG9jYWwgcHJvY2Vzcy4gKi8KKyNkZWZpbmUgTkZfSVBfTE9DQUxfT1VUCQkzCisvKiBQYWNrZXRzIGFib3V0IHRvIGhpdCB0aGUgd2lyZS4gKi8KKyNkZWZpbmUgTkZfSVBfUE9TVF9ST1VUSU5HCTQKKyNkZWZpbmUgTkZfSVBfTlVNSE9PS1MJCTUKKworZW51bSBuZl9pcF9ob29rX3ByaW9yaXRpZXMgeworCU5GX0lQX1BSSV9GSVJTVCA9IElOVF9NSU4sCisJTkZfSVBfUFJJX0NPTk5UUkFDS19ERUZSQUcgPSAtNDAwLAorCU5GX0lQX1BSSV9SQVcgPSAtMzAwLAorCU5GX0lQX1BSSV9TRUxJTlVYX0ZJUlNUID0gLTIyNSwKKwlORl9JUF9QUklfQ09OTlRSQUNLID0gLTIwMCwKKwlORl9JUF9QUklfTUFOR0xFID0gLTE1MCwKKwlORl9JUF9QUklfTkFUX0RTVCA9IC0xMDAsCisJTkZfSVBfUFJJX0ZJTFRFUiA9IDAsCisJTkZfSVBfUFJJX05BVF9TUkMgPSAxMDAsCisJTkZfSVBfUFJJX1NFTElOVVhfTEFTVCA9IDIyNSwKKwlORl9JUF9QUklfQ09OTlRSQUNLX0hFTFBFUiA9IElOVF9NQVggLSAyLAorCU5GX0lQX1BSSV9OQVRfU0VRX0FESlVTVCA9IElOVF9NQVggLSAxLAorCU5GX0lQX1BSSV9DT05OVFJBQ0tfQ09ORklSTSA9IElOVF9NQVgsCisJTkZfSVBfUFJJX0xBU1QgPSBJTlRfTUFYLAorfTsKKworLyogQXJndW1lbnRzIGZvciBzZXRzb2Nrb3B0IFNPTF9JUDogKi8KKy8qIDIuMCBmaXJld2FsbGluZyB3ZW50IGZyb20gNjQgdGhyb3VnaCA3MSAoYW5kICsyNTYsICs1MTIsIGV0YykuICovCisvKiAyLjIgZmlyZXdhbGxpbmcgKCsgbWFzcSkgd2VudCBmcm9tIDY0IHRocm91Z2ggNzYgKi8KKy8qIDIuNCBmaXJld2FsbGluZyB3ZW50IDY0IHRocm91Z2ggNjcuICovCisjZGVmaW5lIFNPX09SSUdJTkFMX0RTVCA4MAorCisKKyNlbmRpZiAvKl9fTElOVVhfSVBfTkVURklMVEVSX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9xdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjI5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3F1ZXVlLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFRoaXMgaXMgYSBtb2R1bGUgd2hpY2ggaXMgdXNlZCBmb3IgcXVldWVpbmcgSVB2NCBwYWNrZXRzIGFuZAorICogY29tbXVuaWNhdGluZyB3aXRoIHVzZXJzcGFjZSB2aWEgbmV0bGluay4KKyAqCisgKiAoQykgMjAwMCBKYW1lcyBNb3JyaXMsIHRoaXMgY29kZSBpcyBHUEwuCisgKi8KKyNpZm5kZWYgX0lQX1FVRVVFX0gKKyNkZWZpbmUgX0lQX1FVRVVFX0gKKworI2luY2x1ZGUgPG5ldC9pZi5oPgorCisvKiBNZXNzYWdlcyBzZW50IGZyb20ga2VybmVsICovCit0eXBlZGVmIHN0cnVjdCBpcHFfcGFja2V0X21zZyB7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfaWQ7CS8qIElEIG9mIHF1ZXVlZCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBsb25nIG1hcms7CQkvKiBOZXRmaWx0ZXIgbWFyayB2YWx1ZSAqLworCWxvbmcgdGltZXN0YW1wX3NlYzsJCS8qIFBhY2tldCBhcnJpdmFsIHRpbWUgKHNlY29uZHMpICovCisJbG9uZyB0aW1lc3RhbXBfdXNlYzsJCS8qIFBhY2tldCBhcnJ2aWFsIHRpbWUgKCt1c2Vjb25kcykgKi8KKwl1bnNpZ25lZCBpbnQgaG9vazsJCS8qIE5ldGZpbHRlciBob29rIHdlIHJvZGUgaW4gb24gKi8KKwljaGFyIGluZGV2X25hbWVbSUZOQU1TSVpdOwkvKiBOYW1lIG9mIGluY29taW5nIGludGVyZmFjZSAqLworCWNoYXIgb3V0ZGV2X25hbWVbSUZOQU1TSVpdOwkvKiBOYW1lIG9mIG91dGdvaW5nIGludGVyZmFjZSAqLworCV9fYmUxNiBod19wcm90b2NvbDsJCS8qIEhhcmR3YXJlIHByb3RvY29sIChuZXR3b3JrIG9yZGVyKSAqLworCXVuc2lnbmVkIHNob3J0IGh3X3R5cGU7CQkvKiBIYXJkd2FyZSB0eXBlICovCisJdW5zaWduZWQgY2hhciBod19hZGRybGVuOwkvKiBIYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCXVuc2lnbmVkIGNoYXIgaHdfYWRkcls4XTsJLyogSGFyZHdhcmUgYWRkcmVzcyAqLworCXNpemVfdCBkYXRhX2xlbjsJCS8qIExlbmd0aCBvZiBwYWNrZXQgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgcGF5bG9hZFswXTsJLyogT3B0aW9uYWwgcGFja2V0IGRhdGEgKi8KK30gaXBxX3BhY2tldF9tc2dfdDsKKworLyogTWVzc2FnZXMgc2VudCBmcm9tIHVzZXJzcGFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgaXBxX21vZGVfbXNnIHsKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOwkJLyogUmVxdWVzdGVkIG1vZGUgKi8KKwlzaXplX3QgcmFuZ2U7CQkJLyogT3B0aW9uYWwgcmFuZ2Ugb2YgcGFja2V0IHJlcXVlc3RlZCAqLworfSBpcHFfbW9kZV9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaXBxX3ZlcmRpY3RfbXNnIHsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CQkvKiBWZXJkaWN0IHRvIGhhbmQgdG8gbmV0ZmlsdGVyICovCisJdW5zaWduZWQgbG9uZyBpZDsJCS8qIFBhY2tldCBJRCBmb3IgdGhpcyB2ZXJkaWN0ICovCisJc2l6ZV90IGRhdGFfbGVuOwkJLyogTGVuZ3RoIG9mIHJlcGxhY2VtZW50IGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIHBheWxvYWRbMF07CS8qIE9wdGlvbmFsIHJlcGxhY2VtZW50IHBhY2tldCAqLworfSBpcHFfdmVyZGljdF9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaXBxX3BlZXJfbXNnIHsKKwl1bmlvbiB7CisJCWlwcV92ZXJkaWN0X21zZ190IHZlcmRpY3Q7CisJCWlwcV9tb2RlX21zZ190IG1vZGU7CisJfSBtc2c7Cit9IGlwcV9wZWVyX21zZ190OworCisvKiBQYWNrZXQgZGVsaXZlcnkgbW9kZXMgKi8KK2VudW0geworCUlQUV9DT1BZX05PTkUsCQkvKiBJbml0aWFsIG1vZGUsIHBhY2tldHMgYXJlIGRyb3BwZWQgKi8KKwlJUFFfQ09QWV9NRVRBLAkJLyogQ29weSBtZXRhZGF0YSAqLworCUlQUV9DT1BZX1BBQ0tFVAkJLyogQ29weSBtZXRhZGF0YSArIHBhY2tldCAocmFuZ2UpICovCit9OworI2RlZmluZSBJUFFfQ09QWV9NQVggSVBRX0NPUFlfUEFDS0VUCisKKy8qIFR5cGVzIG9mIG1lc3NhZ2VzICovCisjZGVmaW5lIElQUU1fQkFTRQkweDEwCS8qIHN0YW5kYXJkIG5ldGxpbmsgbWVzc2FnZXMgYmVsb3cgdGhpcyAqLworI2RlZmluZSBJUFFNX01PREUJKElQUU1fQkFTRSArIDEpCQkvKiBNb2RlIHJlcXVlc3QgZnJvbSBwZWVyICovCisjZGVmaW5lIElQUU1fVkVSRElDVAkoSVBRTV9CQVNFICsgMikJCS8qIFZlcmRpY3QgZnJvbSBwZWVyICovIAorI2RlZmluZSBJUFFNX1BBQ0tFVAkoSVBRTV9CQVNFICsgMykJCS8qIFBhY2tldCBmcm9tIGtlcm5lbCAqLworI2RlZmluZSBJUFFNX01BWAkoSVBRTV9CQVNFICsgNCkKKworI2VuZGlmIC8qX0lQX1FVRVVFX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzNjIzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiAyNS1KdWwtMTk5OCBNYWpvciBjaGFuZ2VzIHRvIGFsbG93IGZvciBpcCBjaGFpbiB0YWJsZQorICoKKyAqIDMtSmFuLTIwMDAgTmFtZWQgdGFibGVzIHRvIGFsbG93IHBhY2tldCBzZWxlY3Rpb24gZm9yIGRpZmZlcmVudCB1c2VzLgorICovCisKKy8qCisgKiAJRm9ybWF0IG9mIGFuIElQIGZpcmV3YWxsIGRlc2NyaXB0b3IKKyAqCisgKiAJc3JjLCBkc3QsIHNyY19tYXNrLCBkc3RfbWFzayBhcmUgYWx3YXlzIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiAJZmxhZ3MgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXIgKG9mIGNvdXJzZSkuCisgKiAJUG9ydCBudW1iZXJzIGFyZSBzdG9yZWQgaW4gSE9TVCBieXRlIG9yZGVyLgorICovCisKKyNpZm5kZWYgX0lQVEFCTEVTX0gKKyNkZWZpbmUgX0lQVEFCTEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworI2RlZmluZSBJUFRfRlVOQ1RJT05fTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIElQVF9UQUJMRV9NQVhOQU1FTEVOIFhUX1RBQkxFX01BWE5BTUVMRU4KKyNkZWZpbmUgaXB0X21hdGNoIHh0X21hdGNoCisjZGVmaW5lIGlwdF90YXJnZXQgeHRfdGFyZ2V0CisjZGVmaW5lIGlwdF90YWJsZSB4dF90YWJsZQorI2RlZmluZSBpcHRfZ2V0X3JldmlzaW9uIHh0X2dldF9yZXZpc2lvbgorCisvKiBZZXMsIFZpcmdpbmlhLCB5b3UgaGF2ZSB0byB6ZXJvIHRoZSBwYWRkaW5nLiAqLworc3RydWN0IGlwdF9pcCB7CisJLyogU291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUCBhZGRyICovCisJc3RydWN0IGluX2FkZHIgc3JjLCBkc3Q7CisJLyogTWFzayBmb3Igc3JjIGFuZCBkZXN0IElQIGFkZHIgKi8KKwlzdHJ1Y3QgaW5fYWRkciBzbXNrLCBkbXNrOworCWNoYXIgaW5pZmFjZVtJRk5BTVNJWl0sIG91dGlmYWNlW0lGTkFNU0laXTsKKwl1bnNpZ25lZCBjaGFyIGluaWZhY2VfbWFza1tJRk5BTVNJWl0sIG91dGlmYWNlX21hc2tbSUZOQU1TSVpdOworCisJLyogUHJvdG9jb2wsIDAgPSBBTlkgKi8KKwl1X2ludDE2X3QgcHJvdG87CisKKwkvKiBGbGFncyB3b3JkICovCisJdV9pbnQ4X3QgZmxhZ3M7CisJLyogSW52ZXJzZSBmbGFncyAqLworCXVfaW50OF90IGludmZsYWdzOworfTsKKworI2RlZmluZSBpcHRfZW50cnlfbWF0Y2ggeHRfZW50cnlfbWF0Y2gKKyNkZWZpbmUgaXB0X2VudHJ5X3RhcmdldCB4dF9lbnRyeV90YXJnZXQKKyNkZWZpbmUgaXB0X3N0YW5kYXJkX3RhcmdldCB4dF9zdGFuZGFyZF90YXJnZXQKKworI2RlZmluZSBpcHRfY291bnRlcnMgeHRfY291bnRlcnMKKworLyogVmFsdWVzIGZvciAiZmxhZyIgZmllbGQgaW4gc3RydWN0IGlwdF9pcCAoZ2VuZXJhbCBpcCBzdHJ1Y3R1cmUpLiAqLworI2RlZmluZSBJUFRfRl9GUkFHCQkweDAxCS8qIFNldCBpZiBydWxlIGlzIGEgZnJhZ21lbnQgcnVsZSAqLworI2RlZmluZSBJUFRfRl9HT1RPCQkweDAyCS8qIFNldCBpZiBqdW1wIGlzIGEgZ290byAqLworI2RlZmluZSBJUFRfRl9NQVNLCQkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFnIGJpdHMgbWFzay4gKi8KKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X2lwLiAqLworI2RlZmluZSBJUFRfSU5WX1ZJQV9JTgkJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIElOIElGQUNFLiAqLworI2RlZmluZSBJUFRfSU5WX1ZJQV9PVVQJCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBPVVQgSUZBQ0UgKi8KKyNkZWZpbmUgSVBUX0lOVl9UT1MJCTB4MDQJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBUT1MuICovCisjZGVmaW5lIElQVF9JTlZfU1JDSVAJCTB4MDgJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBTUkMgSVAuICovCisjZGVmaW5lIElQVF9JTlZfRFNUSVAJCTB4MTAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBEU1QgT1AuICovCisjZGVmaW5lIElQVF9JTlZfRlJBRwkJMHgyMAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIEZSQUcuICovCisjZGVmaW5lIElQVF9JTlZfUFJPVE8JCVhUX0lOVl9QUk9UTworI2RlZmluZSBJUFRfSU5WX01BU0sJCTB4N0YJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMworICAgcGFydHMgd2hpY2ggYXJlIDEpIGdlbmVyYWwgSVAgaGVhZGVyIHN0dWZmIDIpIG1hdGNoIHNwZWNpZmljCisgICBzdHVmZiAzKSB0aGUgdGFyZ2V0IHRvIHBlcmZvcm0gaWYgdGhlIHJ1bGUgbWF0Y2hlcyAqLworc3RydWN0IGlwdF9lbnRyeQoreworCXN0cnVjdCBpcHRfaXAgaXA7CisKKwkvKiBNYXJrIHdpdGggZmllbGRzIHRoYXQgd2UgY2FyZSBhYm91dC4gKi8KKwl1bnNpZ25lZCBpbnQgbmZjYWNoZTsKKworCS8qIFNpemUgb2YgaXB0X2VudHJ5ICsgbWF0Y2hlcyAqLworCXVfaW50MTZfdCB0YXJnZXRfb2Zmc2V0OworCS8qIFNpemUgb2YgaXB0X2VudHJ5ICsgbWF0Y2hlcyArIHRhcmdldCAqLworCXVfaW50MTZfdCBuZXh0X29mZnNldDsKKworCS8qIEJhY2sgcG9pbnRlciAqLworCXVuc2lnbmVkIGludCBjb21lZnJvbTsKKworCS8qIFBhY2tldCBhbmQgYnl0ZSBjb3VudGVycy4gKi8KKwlzdHJ1Y3QgeHRfY291bnRlcnMgY291bnRlcnM7CisKKwkvKiBUaGUgbWF0Y2hlcyAoaWYgYW55KSwgdGhlbiB0aGUgdGFyZ2V0LiAqLworCXVuc2lnbmVkIGNoYXIgZWxlbXNbMF07Cit9OworCisvKgorICogTmV3IElQIGZpcmV3YWxsIG9wdGlvbnMgZm9yIFtnc11ldHNvY2tvcHQgYXQgdGhlIFJBVyBJUCBsZXZlbC4KKyAqIFVubGlrZSBCU0QgTGludXggaW5oZXJpdHMgSVAgb3B0aW9ucyBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSByYXcKKyAqIHNvY2tldCBmb3IgdGhpcy4gSW5zdGVhZCB3ZSBjaGVjayByaWdodHMgaW4gdGhlIGNhbGxzLgorICoKKyAqIEFUVEVOVElPTjogY2hlY2sgbGludXgvaW4uaCBiZWZvcmUgYWRkaW5nIG5ldyBudW1iZXIgaGVyZS4KKyAqLworI2RlZmluZSBJUFRfQkFTRV9DVEwJCTY0CisKKyNkZWZpbmUgSVBUX1NPX1NFVF9SRVBMQUNFCShJUFRfQkFTRV9DVEwpCisjZGVmaW5lIElQVF9TT19TRVRfQUREX0NPVU5URVJTCShJUFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUFRfU09fU0VUX01BWAkJSVBUX1NPX1NFVF9BRERfQ09VTlRFUlMKKworI2RlZmluZSBJUFRfU09fR0VUX0lORk8JCQkoSVBUX0JBU0VfQ1RMKQorI2RlZmluZSBJUFRfU09fR0VUX0VOVFJJRVMJCShJUFRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENICShJUFRfQkFTRV9DVEwgKyAyKQorI2RlZmluZSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoSVBUX0JBU0VfQ1RMICsgMykKKyNkZWZpbmUgSVBUX1NPX0dFVF9NQVgJCQlJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorCisjZGVmaW5lIElQVF9DT05USU5VRSBYVF9DT05USU5VRQorI2RlZmluZSBJUFRfUkVUVVJOIFhUX1JFVFVSTgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2RlZmluZSBpcHRfdWRwIHh0X3VkcAorI2RlZmluZSBpcHRfdGNwIHh0X3RjcAorCisjZGVmaW5lIElQVF9UQ1BfSU5WX1NSQ1BUCVhUX1RDUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVBUX1RDUF9JTlZfRFNUUFQJWFRfVENQX0lOVl9EU1RQVAorI2RlZmluZSBJUFRfVENQX0lOVl9GTEFHUwlYVF9UQ1BfSU5WX0ZMQUdTCisjZGVmaW5lIElQVF9UQ1BfSU5WX09QVElPTglYVF9UQ1BfSU5WX09QVElPTgorI2RlZmluZSBJUFRfVENQX0lOVl9NQVNLCVhUX1RDUF9JTlZfTUFTSworCisjZGVmaW5lIElQVF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVBUX1VEUF9JTlZfRFNUUFQJWFRfVURQX0lOVl9EU1RQVAorI2RlZmluZSBJUFRfVURQX0lOVl9NQVNLCVhUX1VEUF9JTlZfTUFTSworCisvKiBJQ01QIG1hdGNoaW5nIHN0dWZmICovCitzdHJ1Y3QgaXB0X2ljbXAKK3sKKwl1X2ludDhfdCB0eXBlOwkJCQkvKiB0eXBlIHRvIG1hdGNoICovCisJdV9pbnQ4X3QgY29kZVsyXTsJCQkvKiByYW5nZSBvZiBjb2RlICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBmb3Igc3RydWN0IGlwdF9pY21wLiAqLworI2RlZmluZSBJUFRfSUNNUF9JTlYJMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIHR5cGUvY29kZSB0ZXN0ICovCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX0lORk8gKi8KK3N0cnVjdCBpcHRfZ2V0aW5mbworeworCS8qIFdoaWNoIHRhYmxlOiBjYWxsZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogS2VybmVsIGZpbGxzIHRoZXNlIGluLiAqLworCS8qIFdoaWNoIGhvb2sgZW50cnkgcG9pbnRzIGFyZSB2YWxpZDogYml0bWFzayAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIEhvb2sgZW50cnkgcG9pbnRzOiBvbmUgcGVyIG5ldGZpbHRlciBob29rLiAqLworCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0lQX05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JUF9OVU1IT09LU107CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKworCS8qIFNpemUgb2YgZW50cmllcy4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fU0VUX1JFUExBQ0UuICovCitzdHJ1Y3QgaXB0X3JlcGxhY2UKK3sKKwkvKiBXaGljaCB0YWJsZS4gKi8KKwljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogV2hpY2ggaG9vayBlbnRyeSBwb2ludHMgYXJlIHZhbGlkOiBiaXRtYXNrLiAgWW91IGNhbid0CisgICAgICAgICAgIGNoYW5nZSB0aGlzLiAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJLyogVG90YWwgc2l6ZSBvZiBuZXcgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogSG9vayBlbnRyeSBwb2ludHMuICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVBfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0lQX05VTUhPT0tTXTsKKworCS8qIEluZm9ybWF0aW9uIGFib3V0IG9sZCBlbnRyaWVzOiAqLworCS8qIE51bWJlciBvZiBjb3VudGVycyAobXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzKS4gKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOworCS8qIFRoZSBvbGQgZW50cmllcycgY291bnRlcnMuICovCisJc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyczsKKworCS8qIFRoZSBlbnRyaWVzIChoYW5nIG9mZiBlbmQ6IG5vdCByZWFsbHkgYW4gYXJyYXkpLiAqLworCXN0cnVjdCBpcHRfZW50cnkgZW50cmllc1swXTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fQUREX0NPVU5URVJTLiAqLworI2RlZmluZSBpcHRfY291bnRlcnNfaW5mbyB4dF9jb3VudGVyc19pbmZvCisKKy8qIFRoZSBhcmd1bWVudCB0byBJUFRfU09fR0VUX0VOVFJJRVMuICovCitzdHJ1Y3QgaXB0X2dldF9lbnRyaWVzCit7CisJLyogV2hpY2ggdGFibGU6IHVzZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbSVBUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogVXNlciBmaWxscyB0aGlzIGluOiB0b3RhbCBlbnRyeSBzaXplLiAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogVGhlIGVudHJpZXMuICovCisJc3RydWN0IGlwdF9lbnRyeSBlbnRyeXRhYmxlWzBdOworfTsKKworLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCisjZGVmaW5lIElQVF9TVEFOREFSRF9UQVJHRVQgWFRfU1RBTkRBUkRfVEFSR0VUCisvKiBFcnJvciB2ZXJkaWN0LiAqLworI2RlZmluZSBJUFRfRVJST1JfVEFSR0VUIFhUX0VSUk9SX1RBUkdFVAorCisvKiBIZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaXB0X2VudHJ5X3RhcmdldCAqCitpcHRfZ2V0X3RhcmdldChzdHJ1Y3QgaXB0X2VudHJ5ICplKQoreworCXJldHVybiAodm9pZCAqKWUgKyBlLT50YXJnZXRfb2Zmc2V0OworfQorCisvKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIElQVF9NQVRDSF9JVEVSQVRFKGUsIGZuLCBhcmdzLi4uKQlcCisoewkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pOwkJCVwKKwlpbnQgX19yZXQgPSAwOwkJCQlcCisJc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqX19tYXRjaDsJXAorCQkJCQkJXAorCWZvciAoX19pID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpOwlcCisJICAgICBfX2kgPCAoZSktPnRhcmdldF9vZmZzZXQ7CQlcCisJICAgICBfX2kgKz0gX19tYXRjaC0+dS5tYXRjaF9zaXplKSB7CVwKKwkJX19tYXRjaCA9ICh2b2lkICopKGUpICsgX19pOwlcCisJCQkJCQlcCisJCV9fcmV0ID0gZm4oX19tYXRjaCAsICMjIGFyZ3MpOwlcCisJCWlmIChfX3JldCAhPSAwKQkJCVwKKwkJCWJyZWFrOwkJCVwKKwl9CQkJCQlcCisJX19yZXQ7CQkJCQlcCit9KQorCisvKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIElQVF9FTlRSWV9JVEVSQVRFKGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKQkJXAorKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pOwkJCQkJXAorCWludCBfX3JldCA9IDA7CQkJCQkJXAorCXN0cnVjdCBpcHRfZW50cnkgKl9fZW50cnk7CQkJCVwKKwkJCQkJCQkJXAorCWZvciAoX19pID0gMDsgX19pIDwgKHNpemUpOyBfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQpIHsgXAorCQlfX2VudHJ5ID0gKHZvaWQgKikoZW50cmllcykgKyBfX2k7CQlcCisJCQkJCQkJCVwKKwkJX19yZXQgPSBmbihfX2VudHJ5ICwgIyMgYXJncyk7CQkJXAorCQlpZiAoX19yZXQgIT0gMCkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJXAorCX0JCQkJCQkJXAorCV9fcmV0OwkJCQkJCQlcCit9KQorCisvKiBmbiByZXR1cm5zIDAgdG8gY29udGludWUgaXRlcmF0aW9uICovCisjZGVmaW5lIElQVF9FTlRSWV9JVEVSQVRFX0NPTlRJTlVFKGVudHJpZXMsIHNpemUsIG4sIGZuLCBhcmdzLi4uKSBcCisoewkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBfX2ksIF9fbjsJCQkJCVwKKwlpbnQgX19yZXQgPSAwOwkJCQkJCVwKKwlzdHJ1Y3QgaXB0X2VudHJ5ICpfX2VudHJ5OwkJCQlcCisJCQkJCQkJCVwKKwlmb3IgKF9faSA9IDAsIF9fbiA9IDA7IF9faSA8IChzaXplKTsJCQlcCisJICAgICBfX2kgKz0gX19lbnRyeS0+bmV4dF9vZmZzZXQsIF9fbisrKSB7IAkJXAorCQlfX2VudHJ5ID0gKHZvaWQgKikoZW50cmllcykgKyBfX2k7CQlcCisJCWlmIChfX24gPCBuKQkJCQkJXAorCQkJY29udGludWU7CQkJCVwKKwkJCQkJCQkJXAorCQlfX3JldCA9IGZuKF9fZW50cnkgLCAjIyBhcmdzKTsJCQlcCisJCWlmIChfX3JldCAhPSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCVwKK30pCisKKy8qCisgKglNYWluIGZpcmV3YWxsIGNoYWlucyBkZWZpbml0aW9ucyBhbmQgZ2xvYmFsIHZhcidzIGRlZmluaXRpb25zLgorICovCisjZW5kaWYgLyogX0lQVEFCTEVTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMQVNTSUZZLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmQ1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTEFTU0lGWS5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfSVBUX0NMQVNTSUZZX0gKKyNkZWZpbmUgX0lQVF9DTEFTU0lGWV9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaD4KKyNkZWZpbmUgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvIHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvCisKKyNlbmRpZiAvKl9JUFRfQ0xBU1NJRllfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DTFVTVEVSSVAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY1MGJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xVU1RFUklQLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfSVBUX0NMVVNURVJJUF9IX3RhcmdldAorI2RlZmluZSBfSVBUX0NMVVNURVJJUF9IX3RhcmdldAorCitlbnVtIGNsdXN0ZXJpcF9oYXNobW9kZSB7CisgICAgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUCA9IDAsCisgICAgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUF9TUFQsCisgICAgQ0xVU1RFUklQX0hBU0hNT0RFX1NJUF9TUFRfRFBULAorfTsKKworI2RlZmluZSBDTFVTVEVSSVBfSEFTSE1PREVfTUFYIENMVVNURVJJUF9IQVNITU9ERV9TSVBfU1BUX0RQVAorCisjZGVmaW5lIENMVVNURVJJUF9NQVhfTk9ERVMgMTYKKworI2RlZmluZSBDTFVTVEVSSVBfRkxBR19ORVcgMHgwMDAwMDAwMQorCitzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZzsKKworc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8geworCisJdV9pbnQzMl90IGZsYWdzOworCisJLyogb25seSByZWxldmFudCBmb3IgbmV3IG9uZXMgKi8KKwl1X2ludDhfdCBjbHVzdGVybWFjWzZdOworCXVfaW50MTZfdCBudW1fdG90YWxfbm9kZXM7CisJdV9pbnQxNl90IG51bV9sb2NhbF9ub2RlczsKKwl1X2ludDE2X3QgbG9jYWxfbm9kZXNbQ0xVU1RFUklQX01BWF9OT0RFU107CisJdV9pbnQzMl90IGhhc2hfbW9kZTsKKwl1X2ludDMyX3QgaGFzaF9pbml0dmFsOworCisJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZzsKK307CisKKyNlbmRpZiAvKl9JUFRfQ0xVU1RFUklQX0hfdGFyZ2V0Ki8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2ZlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9DT05OTUFSSy5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0lQVF9DT05OTUFSS19IX3RhcmdldAorI2RlZmluZSBfSVBUX0NPTk5NQVJLX0hfdGFyZ2V0CisKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDA0IE1BUkEgU3lzdGVtcyBBQiA8aHR0cDovL3d3dy5tYXJhc3lzdGVtcy5jb20+CisgKiBieSBIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuaD4KKyNkZWZpbmUgSVBUX0NPTk5NQVJLX1NFVAlYVF9DT05OTUFSS19TRVQKKyNkZWZpbmUgSVBUX0NPTk5NQVJLX1NBVkUJWFRfQ09OTk1BUktfU0FWRQorI2RlZmluZQlJUFRfQ09OTk1BUktfUkVTVE9SRQlYVF9DT05OTUFSS19SRVNUT1JFCisKKyNkZWZpbmUgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvIHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvCisKKyNlbmRpZiAvKl9JUFRfQ09OTk1BUktfSF90YXJnZXQqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRFNDUC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRFNDUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTFlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9EU0NQLmgKQEAgLTAsMCArMSwxOCBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciBzZXR0aW5nIHRoZSBJUHY0IERTQ1AgZmllbGQKKyAqCisgKiAoQykgMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogYmFzZWQgb24gaXB0X0ZUT1MuYyAoQykgMjAwMCBieSBNYXR0aGV3IEcuIE1hcnNoIDxtZ21AcGFrdHJvbml4LmNvbT4KKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICogCisgKiBTZWUgUkZDMjQ3NCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgRFNDUCBmaWVsZCB3aXRoaW4gdGhlIElQIEhlYWRlci4KKyAqCisgKiBpcHRfRFNDUC5oLHYgMS43IDIwMDIvMDMvMTQgMTI6MDM6MTMgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9JUFRfRFNDUF9UQVJHRVRfSAorI2RlZmluZSBfSVBUX0RTQ1BfVEFSR0VUX0gKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZHNjcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9EU0NQLmg+CisKKyNkZWZpbmUgaXB0X0RTQ1BfaW5mbyB4dF9EU0NQX2luZm8KKworI2VuZGlmIC8qIF9JUFRfRFNDUF9UQVJHRVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRUNOLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9FQ04uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGUwZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfRUNOLmgKQEAgLTAsMCArMSwzMSBAQAorLyogSGVhZGVyIGZpbGUgZm9yIGlwdGFibGVzIGlwdF9FQ04gdGFyZ2V0CisgKgorICogKEMpIDIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyAqIAorICogaXB0X0VDTi5oLHYgMS4zIDIwMDIvMDUvMjkgMTI6MTc6NDAgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9JUFRfRUNOX1RBUkdFVF9ICisjZGVmaW5lIF9JUFRfRUNOX1RBUkdFVF9ICisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0RTQ1AuaD4KKworI2RlZmluZSBJUFRfRUNOX0lQX01BU0sJKH5JUFRfRFNDUF9NQVNLKQorCisjZGVmaW5lIElQVF9FQ05fT1BfU0VUX0lQCTB4MDEJLyogc2V0IEVDTiBiaXRzIG9mIElQdjQgaGVhZGVyICovCisjZGVmaW5lIElQVF9FQ05fT1BfU0VUX0VDRQkweDEwCS8qIHNldCBFQ0UgYml0IG9mIFRDUCBoZWFkZXIgKi8KKyNkZWZpbmUgSVBUX0VDTl9PUF9TRVRfQ1dSCTB4MjAJLyogc2V0IENXUiBiaXQgb2YgVENQIGhlYWRlciAqLworCisjZGVmaW5lIElQVF9FQ05fT1BfTUFTSwkJMHhjZQorCitzdHJ1Y3QgaXB0X0VDTl9pbmZvIHsKKwl1X2ludDhfdCBvcGVyYXRpb247CS8qIGJpdHNldCBvZiBvcGVyYXRpb25zICovCisJdV9pbnQ4X3QgaXBfZWN0OwkvKiBFQ1QgY29kZXBvaW50IG9mIElQdjQgaGVhZGVyLCBwcmUtc2hpZnRlZCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IGVjZToxLCBjd3I6MTsgLyogVENQIEVDVCBiaXRzICovCisJCX0gdGNwOworCX0gcHJvdG87Cit9OworCisjZW5kaWYgLyogX0lQVF9FQ05fVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmYTY1MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0xPRy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0lQVF9MT0dfSAorI2RlZmluZSBfSVBUX0xPR19ICisKKy8qIG1ha2Ugc3VyZSBub3QgdG8gY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBuZXRmaWx0ZXIuaDpORl9MT0dfKiAoISkgKi8KKyNkZWZpbmUgSVBUX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIElQVF9MT0dfVENQT1BUCQkweDAyCS8qIExvZyBUQ1Agb3B0aW9ucyAqLworI2RlZmluZSBJUFRfTE9HX0lQT1BUCQkweDA0CS8qIExvZyBJUCBvcHRpb25zICovCisjZGVmaW5lIElQVF9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLworI2RlZmluZSBJUFRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCByZXVzZSAqLworI2RlZmluZSBJUFRfTE9HX01BU0sJCTB4MWYKKworc3RydWN0IGlwdF9sb2dfaW5mbyB7CisJdW5zaWduZWQgY2hhciBsZXZlbDsKKwl1bnNpZ25lZCBjaGFyIGxvZ2ZsYWdzOworCWNoYXIgcHJlZml4WzMwXTsKK307CisKKyNlbmRpZiAvKl9JUFRfTE9HX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTUFSSy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5N2E0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfSVBUX01BUktfSF90YXJnZXQKKyNkZWZpbmUgX0lQVF9NQVJLX0hfdGFyZ2V0CisKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfTUFSSy5oPgorCisvKiBWZXJzaW9uIDAgKi8KKyNkZWZpbmUgaXB0X21hcmtfdGFyZ2V0X2luZm8geHRfbWFya190YXJnZXRfaW5mbworCisvKiBWZXJzaW9uIDEgKi8KKyNkZWZpbmUgSVBUX01BUktfU0VUCVhUX01BUktfU0VUCisjZGVmaW5lIElQVF9NQVJLX0FORAlYVF9NQVJLX0FORAorI2RlZmluZQlJUFRfTUFSS19PUglYVF9NQVJLX09SCisKKyNkZWZpbmUgaXB0X21hcmtfdGFyZ2V0X2luZm9fdjEgeHRfbWFya190YXJnZXRfaW5mb192MQorCisjZW5kaWYgLypfSVBUX01BUktfSF90YXJnZXQqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTJhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9ORlFVRVVFLmgKQEAgLTAsMCArMSwxNiBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciB1c2luZyBORlFVRVVFIG1lY2hhbmlzbQorICoKKyAqIChDKSAyMDA1IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICogCisqLworI2lmbmRlZiBfSVBUX05GUV9UQVJHRVRfSAorI2RlZmluZSBfSVBUX05GUV9UQVJHRVRfSAorCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ORlFVRVVFLmg+CisKKyNkZWZpbmUgaXB0X05GUV9pbmZvIHh0X05GUV9pbmZvCisKKyNlbmRpZiAvKiBfSVBUX0RTQ1BfVEFSR0VUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1JFSkVDVC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfUkVKRUNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5M2ExYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1JFSkVDVC5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX0lQVF9SRUpFQ1RfSAorI2RlZmluZSBfSVBUX1JFSkVDVF9ICisKK2VudW0gaXB0X3JlamVjdF93aXRoIHsKKwlJUFRfSUNNUF9ORVRfVU5SRUFDSEFCTEUsCisJSVBUX0lDTVBfSE9TVF9VTlJFQUNIQUJMRSwKKwlJUFRfSUNNUF9QUk9UX1VOUkVBQ0hBQkxFLAorCUlQVF9JQ01QX1BPUlRfVU5SRUFDSEFCTEUsCisJSVBUX0lDTVBfRUNIT1JFUExZLAorCUlQVF9JQ01QX05FVF9QUk9ISUJJVEVELAorCUlQVF9JQ01QX0hPU1RfUFJPSElCSVRFRCwKKwlJUFRfVENQX1JFU0VULAorCUlQVF9JQ01QX0FETUlOX1BST0hJQklURUQKK307CisKK3N0cnVjdCBpcHRfcmVqZWN0X2luZm8geworCWVudW0gaXB0X3JlamVjdF93aXRoIHdpdGg7ICAgICAgLyogcmVqZWN0IHR5cGUgKi8KK307CisKKyNlbmRpZiAvKl9JUFRfUkVKRUNUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfU0FNRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNmU2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9TQU1FLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfSVBUX1NBTUVfSAorI2RlZmluZSBfSVBUX1NBTUVfSAorCisjZGVmaW5lIElQVF9TQU1FX01BWF9SQU5HRQkxMAorCisjZGVmaW5lIElQVF9TQU1FX05PRFNUCQkweDAxCisKK3N0cnVjdCBpcHRfc2FtZV9pbmZvCit7CisJdW5zaWduZWQgY2hhciBpbmZvOworCXVfaW50MzJfdCByYW5nZXNpemU7CisJdV9pbnQzMl90IGlwbnVtOworCXVfaW50MzJfdCAqaXBhcnJheTsKKworCS8qIGhhbmdzIG9mZiBlbmQuICovCisJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZVtJUFRfU0FNRV9NQVhfUkFOR0VdOworfTsKKworI2VuZGlmIC8qX0lQVF9TQU1FX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVENQTVNTLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UQ1BNU1MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg1MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVENQTVNTLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9JUFRfVENQTVNTX0gKKyNkZWZpbmUgX0lQVF9UQ1BNU1NfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X1RDUE1TUy5oPgorCisjZGVmaW5lIGlwdF90Y3Btc3NfaW5mbwkJeHRfdGNwbXNzX2luZm8KKyNkZWZpbmUgSVBUX1RDUE1TU19DTEFNUF9QTVRVCVhUX1RDUE1TU19DTEFNUF9QTVRVCisKKyNlbmRpZiAvKl9JUFRfVENQTVNTX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVE9TLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UT1MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmY5ZTFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfVE9TLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfSVBUX1RPU19IX3RhcmdldAorI2RlZmluZSBfSVBUX1RPU19IX3RhcmdldAorCisjaWZuZGVmIElQVE9TX05PUk1BTFNWQworI2RlZmluZSBJUFRPU19OT1JNQUxTVkMgMAorI2VuZGlmCisKK3N0cnVjdCBpcHRfdG9zX3RhcmdldF9pbmZvIHsKKwl1X2ludDhfdCB0b3M7Cit9OworCisjZW5kaWYgLypfSVBUX1RPU19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UVEwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1RUTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjYxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9UVEwuaApAQCAtMCwwICsxLDIxIEBACisvKiBUVEwgbW9kaWZpY2F0aW9uIG1vZHVsZSBmb3IgSVAgdGFibGVzCisgKiAoQykgMjAwMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4gKi8KKworI2lmbmRlZiBfSVBUX1RUTF9ICisjZGVmaW5lIF9JUFRfVFRMX0gKKworZW51bSB7CisJSVBUX1RUTF9TRVQgPSAwLAorCUlQVF9UVExfSU5DLAorCUlQVF9UVExfREVDCit9OworCisjZGVmaW5lIElQVF9UVExfTUFYTU9ERQlJUFRfVFRMX0RFQworCitzdHJ1Y3QgaXB0X1RUTF9pbmZvIHsKKwl1X2ludDhfdAltb2RlOworCXVfaW50OF90CXR0bDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9VTE9HLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9VTE9HLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3YWFkMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X1VMT0cuaApAQCAtMCwwICsxLDQ5IEBACisvKiBIZWFkZXIgZmlsZSBmb3IgSVAgdGFibGVzIHVzZXJzcGFjZSBsb2dnaW5nLCBWZXJzaW9uIDEuOAorICoKKyAqIChDKSAyMDAwLTIwMDIgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIAorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHUEwgKi8KKworI2lmbmRlZiBfSVBUX1VMT0dfSAorI2RlZmluZSBfSVBUX1VMT0dfSAorCisjaWZuZGVmIE5FVExJTktfTkZMT0cKKyNkZWZpbmUgTkVUTElOS19ORkxPRyAJNQorI2VuZGlmCisKKyNkZWZpbmUgVUxPR19ERUZBVUxUX05MR1JPVVAJMQorI2RlZmluZSBVTE9HX0RFRkFVTFRfUVRIUkVTSE9MRAkxCisKKyNkZWZpbmUgVUxPR19NQUNfTEVOCTgwCisjZGVmaW5lIFVMT0dfUFJFRklYX0xFTgkzMgorCisjZGVmaW5lIFVMT0dfTUFYX1FMRU4JNTAKKy8qIFdoeSA1MD8gV2VsbC4uLiB0aGVyZSBpcyBhIGxpbWl0IGltcG9zZWQgYnkgdGhlIHNsYWIgY2FjaGUgMTMxMDAwCisgKiBieXRlcy4gU28gdGhlIG11bHRpcGFydCBuZXRsaW5rLW1lc3NhZ2UgaGFzIHRvIGJlIDwgMTMxMDAwIGJ5dGVzLgorICogQXNzdW1pbmcgYSBzdGFuZGFyZCBldGhlcm5ldC1tdHUgb2YgMTUwMCwgd2UgY291bGQgZGVmaW5lIHRoaXMgdXAKKyAqIHRvIDgwLi4uIGJ1dCBldmVuIDUwIHNlZW1zIHRvIGJlIGJpZyBlbm91Z2guICovCisKKy8qIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVhY2ggcnVsZSB3aXRoIGEgVUxPRyB0YXJnZXQgKi8KK3N0cnVjdCBpcHRfdWxvZ19pbmZvIHsKKwl1bnNpZ25lZCBpbnQgbmxfZ3JvdXA7CisJc2l6ZV90IGNvcHlfcmFuZ2U7CisJc2l6ZV90IHF0aHJlc2hvbGQ7CisJY2hhciBwcmVmaXhbVUxPR19QUkVGSVhfTEVOXTsKK307CisKKy8qIEZvcm1hdCBvZiB0aGUgVUxPRyBwYWNrZXRzIHBhc3NlZCB0aHJvdWdoIG5ldGxpbmsgKi8KK3R5cGVkZWYgc3RydWN0IHVsb2dfcGFja2V0X21zZyB7CisJdW5zaWduZWQgbG9uZyBtYXJrOworCWxvbmcgdGltZXN0YW1wX3NlYzsKKwlsb25nIHRpbWVzdGFtcF91c2VjOworCXVuc2lnbmVkIGludCBob29rOworCWNoYXIgaW5kZXZfbmFtZVtJRk5BTVNJWl07CisJY2hhciBvdXRkZXZfbmFtZVtJRk5BTVNJWl07CisJc2l6ZV90IGRhdGFfbGVuOworCWNoYXIgcHJlZml4W1VMT0dfUFJFRklYX0xFTl07CisJdW5zaWduZWQgY2hhciBtYWNfbGVuOworCXVuc2lnbmVkIGNoYXIgbWFjW1VMT0dfTUFDX0xFTl07CisJdW5zaWduZWQgY2hhciBwYXlsb2FkWzBdOworfSB1bG9nX3BhY2tldF9tc2dfdDsKKworI2VuZGlmIC8qX0lQVF9VTE9HX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWRkcnR5cGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FkZHJ0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2ZWQwMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2FkZHJ0eXBlLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfSVBUX0FERFJUWVBFX0gKKyNkZWZpbmUgX0lQVF9BRERSVFlQRV9ICisKK3N0cnVjdCBpcHRfYWRkcnR5cGVfaW5mbyB7CisJdV9pbnQxNl90CXNvdXJjZTsJCS8qIHNvdXJjZS10eXBlIG1hc2sgKi8KKwl1X2ludDE2X3QJZGVzdDsJCS8qIGRlc3QtdHlwZSBtYXNrICovCisJdV9pbnQzMl90CWludmVydF9zb3VyY2U7CisJdV9pbnQzMl90CWludmVydF9kZXN0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9haC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjlhMmFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfYWguaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9JUFRfQUhfSAorI2RlZmluZSBfSVBUX0FIX0gKKworc3RydWN0IGlwdF9haAoreworCXVfaW50MzJfdCBzcGlzWzJdOwkJCS8qIFNlY3VyaXR5IFBhcmFtZXRlciBJbmRleCAqLworCXVfaW50OF90ICBpbnZmbGFnczsJCQkvKiBJbnZlcnNlIGZsYWdzICovCit9OworCisKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcHRfYWguICovCisjZGVmaW5lIElQVF9BSF9JTlZfU1BJCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2Ygc3BpLiAqLworI2RlZmluZSBJUFRfQUhfSU5WX01BU0sJMHgwMQkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9JUFRfQUhfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb21tZW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb21tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyYWZjMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9JUFRfQ09NTUVOVF9ICisjZGVmaW5lIF9JUFRfQ09NTUVOVF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29tbWVudC5oPgorCisjZGVmaW5lIElQVF9NQVhfQ09NTUVOVF9MRU4gWFRfTUFYX0NPTU1FTlRfTEVOCisKKyNkZWZpbmUgaXB0X2NvbW1lbnRfaW5mbyB4dF9jb21tZW50X2luZm8KKworI2VuZGlmIC8qIF9JUFRfQ09NTUVOVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5ieXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2U2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9JUFRfQ09OTkJZVEVTX0gKKyNkZWZpbmUgX0lQVF9DT05OQllURVNfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5oPgorI2RlZmluZSBpcHRfY29ubmJ5dGVzX3doYXQgeHRfY29ubmJ5dGVzX3doYXQKKworI2RlZmluZSBJUFRfQ09OTkJZVEVTX1BLVFMJWFRfQ09OTkJZVEVTX1BLVFMKKyNkZWZpbmUgSVBUX0NPTk5CWVRFU19CWVRFUwlYVF9DT05OQllURVNfQllURVMKKyNkZWZpbmUgSVBUX0NPTk5CWVRFU19BVkdQS1QJWFRfQ09OTkJZVEVTX0FWR1BLVAorCisjZGVmaW5lIGlwdF9jb25uYnl0ZXNfZGlyZWN0aW9uIAl4dF9jb25uYnl0ZXNfZGlyZWN0aW9uCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX09SSUdJTkFMIAlYVF9DT05OQllURVNfRElSX09SSUdJTkFMCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX1JFUExZIAlYVF9DT05OQllURVNfRElSX1JFUExZCisjZGVmaW5lIElQVF9DT05OQllURVNfRElSX0JPVEgJCVhUX0NPTk5CWVRFU19ESVJfQk9USAorCisjZGVmaW5lIGlwdF9jb25uYnl0ZXNfaW5mbyB4dF9jb25uYnl0ZXNfaW5mbworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Nvbm5tYXJrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YmE2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25ubWFyay5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfSVBUX0NPTk5NQVJLX0gKKyNkZWZpbmUgX0lQVF9DT05OTUFSS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaD4KKyNkZWZpbmUgaXB0X2Nvbm5tYXJrX2luZm8geHRfY29ubm1hcmtfaW5mbworCisjZW5kaWYgLypfSVBUX0NPTk5NQVJLX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubnRyYWNrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25udHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU2NzYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubnRyYWNrLmgKQEAgLTAsMCArMSwyOCBAQAorLyogSGVhZGVyIGZpbGUgZm9yIGtlcm5lbCBtb2R1bGUgdG8gbWF0Y2ggY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbi4KKyAqIEdQTCAoQykgMjAwMSAgTWFyYyBCb3VjaGVyIChtYXJjQG1ic2kuY2EpLgorICovCisKKyNpZm5kZWYgX0lQVF9DT05OVFJBQ0tfSAorI2RlZmluZSBfSVBUX0NPTk5UUkFDS19ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmg+CisKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbykKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEIAlYVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRAorCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfU05BVCAJWFRfQ09OTlRSQUNLX1NUQVRFX1NOQVQKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUCVhUX0NPTk5UUkFDS19TVEFURV9ETkFUCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VECVhUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQKKworLyogZmxhZ3MsIGludmZsYWdzOiAqLworI2RlZmluZSBJUFRfQ09OTlRSQUNLX1NUQVRFCQlYVF9DT05OVFJBQ0tfU1RBVEUKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19QUk9UTwkJWFRfQ09OTlRSQUNLX1BST1RPCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfT1JJR1NSQwkJWFRfQ09OTlRSQUNLX09SSUdTUkMKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19PUklHRFNUCQlYVF9DT05OVFJBQ0tfT1JJR0RTVAorI2RlZmluZSBJUFRfQ09OTlRSQUNLX1JFUExTUkMJCVhUX0NPTk5UUkFDS19SRVBMU1JDCisjZGVmaW5lIElQVF9DT05OVFJBQ0tfUkVQTERTVAkJWFRfQ09OTlRSQUNLX1JFUExEU1QKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19TVEFUVVMJCVhUX0NPTk5UUkFDS19TVEFUVVMKKyNkZWZpbmUgSVBUX0NPTk5UUkFDS19FWFBJUkVTCQlYVF9DT05OVFJBQ0tfRVhQSVJFUworCisjZGVmaW5lIGlwdF9jb25udHJhY2tfaW5mbwkJeHRfY29ubnRyYWNrX2luZm8KKyNlbmRpZiAvKl9JUFRfQ09OTlRSQUNLX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGQxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kY2NwLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfSVBUX0RDQ1BfSF8KKyNkZWZpbmUgX0lQVF9EQ0NQX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oPgorI2RlZmluZSBJUFRfRENDUF9TUkNfUE9SVFMJWFRfRENDUF9TUkNfUE9SVFMKKyNkZWZpbmUgSVBUX0RDQ1BfREVTVF9QT1JUUwlYVF9EQ0NQX0RFU1RfUE9SVFMKKyNkZWZpbmUgSVBUX0RDQ1BfVFlQRQkJWFRfRENDUF9UWVBFCisjZGVmaW5lIElQVF9EQ0NQX09QVElPTgkJWFRfRENDUF9PUFRJT04KKworI2RlZmluZSBJUFRfRENDUF9WQUxJRF9GTEFHUyAJWFRfRENDUF9WQUxJRF9GTEFHUworCisjZGVmaW5lIGlwdF9kY2NwX2luZm8geHRfZGNjcF9pbmZvCisKKyNlbmRpZiAvKiBfSVBUX0RDQ1BfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZHNjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZHNjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODJjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9kc2NwLmgKQEAgLTAsMCArMSwyMSBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgSVB2NCBEU0NQIGZpZWxkCisgKgorICogKEMpIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICogCisgKiBTZWUgUkZDMjQ3NCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgRFNDUCBmaWVsZCB3aXRoaW4gdGhlIElQIEhlYWRlci4KKyAqCisgKiBpcHRfZHNjcC5oLHYgMS4zIDIwMDIvMDgvMDUgMTk6MDA6MjEgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9JUFRfRFNDUF9ICisjZGVmaW5lIF9JUFRfRFNDUF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZHNjcC5oPgorCisjZGVmaW5lIElQVF9EU0NQX01BU0sJWFRfRFNDUF9NQVNLCisjZGVmaW5lIElQVF9EU0NQX1NISUZUCVhUX0RTQ1BfU0hJRlQKKyNkZWZpbmUgSVBUX0RTQ1BfTUFYCVhUX0RTQ1BfTUFYCisKKyNkZWZpbmUgaXB0X2RzY3BfaW5mbwl4dF9kc2NwX2luZm8KKworI2VuZGlmIC8qIF9JUFRfRFNDUF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2Vjbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGQ5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaApAQCAtMCwwICsxLDMzIEBACisvKiBpcHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSBFQ04gaGVhZGVyIGluIElQdjQgYW5kIFRDUCBoZWFkZXIKKyAqCisgKiAoQykgMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgR05VIEdQTCB2MiwgMTk5MQorICogCisgKiBpcHRfZWNuLmgsdiAxLjQgMjAwMi8wOC8wNSAxOTozOTowMCBsYWZvcmdlIEV4cAorKi8KKyNpZm5kZWYgX0lQVF9FQ05fSAorI2RlZmluZSBfSVBUX0VDTl9ICisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2RzY3AuaD4KKworI2RlZmluZSBJUFRfRUNOX0lQX01BU0sJKH5JUFRfRFNDUF9NQVNLKQorCisjZGVmaW5lIElQVF9FQ05fT1BfTUFUQ0hfSVAJMHgwMQorI2RlZmluZSBJUFRfRUNOX09QX01BVENIX0VDRQkweDEwCisjZGVmaW5lIElQVF9FQ05fT1BfTUFUQ0hfQ1dSCTB4MjAKKworI2RlZmluZSBJUFRfRUNOX09QX01BVENIX01BU0sJMHhjZQorCisvKiBtYXRjaCBpbmZvICovCitzdHJ1Y3QgaXB0X2Vjbl9pbmZvIHsKKwl1X2ludDhfdCBvcGVyYXRpb247CisJdV9pbnQ4X3QgaW52ZXJ0OworCXVfaW50OF90IGlwX2VjdDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBlY3Q7CisJCX0gdGNwOworCX0gcHJvdG87Cit9OworCisjZW5kaWYgLyogX0lQVF9FQ05fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZXNwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODI5NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZXNwLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfSVBUX0VTUF9ICisjZGVmaW5lIF9JUFRfRVNQX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9lc3AuaD4KKworI2RlZmluZSBpcHRfZXNwIHh0X2VzcAorI2RlZmluZSBJUFRfRVNQX0lOVl9TUEkJCVhUX0VTUF9JTlZfU1BJCisjZGVmaW5lIElQVF9FU1BfSU5WX01BU0sJWFRfRVNQX0lOVl9NQVNLCisKKyNlbmRpZiAvKl9JUFRfRVNQX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGFzaGxpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oYXNobGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYyMTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGFzaGxpbWl0LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfSVBUX0hBU0hMSU1JVF9ICisjZGVmaW5lIF9JUFRfSEFTSExJTUlUX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaD4KKworI2RlZmluZSBJUFRfSEFTSExJTUlUX1NDQUxFCVhUX0hBU0hMSU1JVF9TQ0FMRQorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfRElQCVhUX0hBU0hMSU1JVF9IQVNIX0RJUAorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfRFBUCVhUX0hBU0hMSU1JVF9IQVNIX0RQVAorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfU0lQCVhUX0hBU0hMSU1JVF9IQVNIX1NJUAorI2RlZmluZSBJUFRfSEFTSExJTUlUX0hBU0hfU1BUCVhUX0hBU0hMSU1JVF9IQVNIX1NQVAorCisjZGVmaW5lIGlwdF9oYXNobGltaXRfaW5mbyB4dF9oYXNobGltaXRfaW5mbworCisjZW5kaWYgLyogX0lQVF9IQVNITElNSVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQ1MmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaGVscGVyLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9JUFRfSEVMUEVSX0gKKyNkZWZpbmUgX0lQVF9IRUxQRVJfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2hlbHBlci5oPgorI2RlZmluZSBpcHRfaGVscGVyX2luZm8geHRfaGVscGVyX2luZm8KKworI2VuZGlmIC8qIF9JUFRfSEVMUEVSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2lwcmFuZ2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2lwcmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJmZWZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaXByYW5nZS5oCkBAIC0wLDAgKzEsMjUgQEAKKyNpZm5kZWYgX0lQVF9JUFJBTkdFX0gKKyNkZWZpbmUgX0lQVF9JUFJBTkdFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgSVBSQU5HRV9TUkMJCTB4MDEJLyogTWF0Y2ggc291cmNlIElQIGFkZHJlc3MgKi8KKyNkZWZpbmUgSVBSQU5HRV9EU1QJCTB4MDIJLyogTWF0Y2ggZGVzdGluYXRpb24gSVAgYWRkcmVzcyAqLworI2RlZmluZSBJUFJBTkdFX1NSQ19JTlYJCTB4MTAJLyogTmVnYXRlIHRoZSBjb25kaXRpb24gKi8KKyNkZWZpbmUgSVBSQU5HRV9EU1RfSU5WCQkweDIwCS8qIE5lZ2F0ZSB0aGUgY29uZGl0aW9uICovCisKK3N0cnVjdCBpcHRfaXByYW5nZSB7CisJLyogSW5jbHVzaXZlOiBuZXR3b3JrIG9yZGVyLiAqLworCV9fYmUzMiBtaW5faXAsIG1heF9pcDsKK307CisKK3N0cnVjdCBpcHRfaXByYW5nZV9pbmZvCit7CisJc3RydWN0IGlwdF9pcHJhbmdlIHNyYzsKKwlzdHJ1Y3QgaXB0X2lwcmFuZ2UgZHN0OworCisJLyogRmxhZ3MgZnJvbSBhYm92ZSAqLworCXVfaW50OF90IGZsYWdzOworfTsKKworI2VuZGlmIC8qIF9JUFRfSVBSQU5HRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9sZW5ndGguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDUyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9sZW5ndGguaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0lQVF9MRU5HVEhfSAorI2RlZmluZSBfSVBUX0xFTkdUSF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmg+CisjZGVmaW5lIGlwdF9sZW5ndGhfaW5mbyB4dF9sZW5ndGhfaW5mbworCisjZW5kaWYgLypfSVBUX0xFTkdUSF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjVjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9saW1pdC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfSVBUX1JBVEVfSAorI2RlZmluZSBfSVBUX1JBVEVfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0Lmg+CisjZGVmaW5lIElQVF9MSU1JVF9TQ0FMRSBYVF9MSU1JVF9TQ0FMRQorI2RlZmluZSBpcHRfcmF0ZWluZm8geHRfcmF0ZWluZm8KKworI2VuZGlmIC8qX0lQVF9SQVRFX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg2MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbWFjLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9JUFRfTUFDX0gKKyNkZWZpbmUgX0lQVF9NQUNfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hYy5oPgorI2RlZmluZSBpcHRfbWFjX2luZm8geHRfbWFjX2luZm8KKworI2VuZGlmIC8qX0lQVF9NQUNfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9tYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkZTY3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX0lQVF9NQVJLX0gKKyNkZWZpbmUgX0lQVF9NQVJLX0gKKworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFyay5oPgorCisjZGVmaW5lIGlwdF9tYXJrX2luZm8geHRfbWFya19pbmZvCisKKyNlbmRpZiAvKl9JUFRfTUFSS19IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X211bHRpcG9ydC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbXVsdGlwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmZTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X211bHRpcG9ydC5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0lQVF9NVUxUSVBPUlRfSAorI2RlZmluZSBfSVBUX01VTFRJUE9SVF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0Lmg+CisKKyNkZWZpbmUgSVBUX01VTFRJUE9SVF9TT1VSQ0UJCVhUX01VTFRJUE9SVF9TT1VSQ0UKKyNkZWZpbmUgSVBUX01VTFRJUE9SVF9ERVNUSU5BVElPTglYVF9NVUxUSVBPUlRfREVTVElOQVRJT04KKyNkZWZpbmUgSVBUX01VTFRJUE9SVF9FSVRIRVIJCVhUX01VTFRJUE9SVF9FSVRIRVIKKworI2RlZmluZSBJUFRfTVVMVElfUE9SVFMJCQlYVF9NVUxUSV9QT1JUUworCisjZGVmaW5lIGlwdF9tdWx0aXBvcnQJCQl4dF9tdWx0aXBvcnQKKyNkZWZpbmUgaXB0X211bHRpcG9ydF92MQkJeHRfbXVsdGlwb3J0X3YxCisKKyNlbmRpZiAvKl9JUFRfTVVMVElQT1JUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfb3duZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X293bmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNGJkYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X293bmVyLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfSVBUX09XTkVSX0gKKyNkZWZpbmUgX0lQVF9PV05FUl9ICisKKy8qIG1hdGNoIGFuZCBpbnZlcnQgZmxhZ3MgKi8KKyNkZWZpbmUgSVBUX09XTkVSX1VJRAkweDAxCisjZGVmaW5lIElQVF9PV05FUl9HSUQJMHgwMgorI2RlZmluZSBJUFRfT1dORVJfUElECTB4MDQKKyNkZWZpbmUgSVBUX09XTkVSX1NJRAkweDA4CisjZGVmaW5lIElQVF9PV05FUl9DT01NCTB4MTAKKworc3RydWN0IGlwdF9vd25lcl9pbmZvIHsKKyAgICB1aWRfdCB1aWQ7CisgICAgZ2lkX3QgZ2lkOworICAgIHBpZF90IHBpZDsKKyAgICBwaWRfdCBzaWQ7CisgICAgY2hhciBjb21tWzE2XTsKKyAgICB1X2ludDhfdCBtYXRjaCwgaW52ZXJ0OwkvKiBmbGFncyAqLworfTsKKworI2VuZGlmIC8qX0lQVF9PV05FUl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BoeXNkZXYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BoeXNkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDAwZTcxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGh5c2Rldi5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0lQVF9QSFlTREVWX0gKKyNkZWZpbmUgX0lQVF9QSFlTREVWX0gKKworLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG9sZCB1c2Vyc3BhY2UgKi8KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9waHlzZGV2Lmg+CisKKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSU4JCVhUX1BIWVNERVZfT1BfSU4KKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfT1VUCQlYVF9QSFlTREVWX09QX09VVAorI2RlZmluZSBJUFRfUEhZU0RFVl9PUF9CUklER0VECQlYVF9QSFlTREVWX09QX0JSSURHRUQKKyNkZWZpbmUgSVBUX1BIWVNERVZfT1BfSVNJTgkJWFRfUEhZU0RFVl9PUF9JU0lOCisjZGVmaW5lIElQVF9QSFlTREVWX09QX0lTT1VUCQlYVF9QSFlTREVWX09QX0lTT1VUCisjZGVmaW5lIElQVF9QSFlTREVWX09QX01BU0sJCVhUX1BIWVNERVZfT1BfTUFTSworCisjZGVmaW5lIGlwdF9waHlzZGV2X2luZm8geHRfcGh5c2Rldl9pbmZvCisKKyNlbmRpZiAvKl9JUFRfUEhZU0RFVl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BrdHR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFmYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcGt0dHlwZS5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfSVBUX1BLVFRZUEVfSAorI2RlZmluZSBfSVBUX1BLVFRZUEVfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BrdHR5cGUuaD4KKyNkZWZpbmUgaXB0X3BrdHR5cGVfaW5mbyB4dF9wa3R0eXBlX2luZm8KKworI2VuZGlmIC8qX0lQVF9QS1RUWVBFX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcG9saWN5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQ3OGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcG9saWN5LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfSVBUX1BPTElDWV9ICisjZGVmaW5lIF9JUFRfUE9MSUNZX0gKKworI2RlZmluZSBJUFRfUE9MSUNZX01BWF9FTEVNCQlYVF9QT0xJQ1lfTUFYX0VMRU0KKworLyogaXB0X3BvbGljeV9mbGFncyAqLworI2RlZmluZSBJUFRfUE9MSUNZX01BVENIX0lOCQlYVF9QT0xJQ1lfTUFUQ0hfSU4KKyNkZWZpbmUgSVBUX1BPTElDWV9NQVRDSF9PVVQJCVhUX1BPTElDWV9NQVRDSF9PVVQKKyNkZWZpbmUgSVBUX1BPTElDWV9NQVRDSF9OT05FCQlYVF9QT0xJQ1lfTUFUQ0hfTk9ORQorI2RlZmluZSBJUFRfUE9MSUNZX01BVENIX1NUUklDVAkJWFRfUE9MSUNZX01BVENIX1NUUklDVAorCisvKiBpcHRfcG9saWN5X21vZGVzICovCisjZGVmaW5lIElQVF9QT0xJQ1lfTU9ERV9UUkFOU1BPUlQJWFRfUE9MSUNZX01PREVfVFJBTlNQT1JUCisjZGVmaW5lIElQVF9QT0xJQ1lfTU9ERV9UVU5ORUwJCVhUX1BPTElDWV9NT0RFX1RVTk5FTAorCisjZGVmaW5lIGlwdF9wb2xpY3lfc3BlYwkJCXh0X3BvbGljeV9zcGVjCisjZGVmaW5lIGlwdF9wb2xpY3lfYWRkcgkJCXh0X3BvbGljeV9hZGRyCisjZGVmaW5lIGlwdF9wb2xpY3lfZWxlbQkJCXh0X3BvbGljeV9lbGVtCisjZGVmaW5lIGlwdF9wb2xpY3lfaW5mbwkJCXh0X3BvbGljeV9pbmZvCisKKyNlbmRpZiAvKiBfSVBUX1BPTElDWV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk5NmVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVhbG0uaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0lQVF9SRUFMTV9ICisjZGVmaW5lIF9JUFRfUkVBTE1fSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3JlYWxtLmg+CisjZGVmaW5lIGlwdF9yZWFsbV9pbmZvIHh0X3JlYWxtX2luZm8KKworI2VuZGlmIC8qIF9JUFRfUkVBTE1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVjZW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWNlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4YTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfcmVjZW50LmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfSVBUX1JFQ0VOVF9ICisjZGVmaW5lIF9JUFRfUkVDRU5UX0gKKworI2RlZmluZSBSRUNFTlRfTkFNRQkiaXB0X3JlY2VudCIKKyNkZWZpbmUgUkVDRU5UX1ZFUgkidjAuMy4xIgorCisjZGVmaW5lIElQVF9SRUNFTlRfQ0hFQ0sgIDEKKyNkZWZpbmUgSVBUX1JFQ0VOVF9TRVQgICAgMgorI2RlZmluZSBJUFRfUkVDRU5UX1VQREFURSA0CisjZGVmaW5lIElQVF9SRUNFTlRfUkVNT1ZFIDgKKyNkZWZpbmUgSVBUX1JFQ0VOVF9UVEwgICAxNgorCisjZGVmaW5lIElQVF9SRUNFTlRfU09VUkNFIDAKKyNkZWZpbmUgSVBUX1JFQ0VOVF9ERVNUICAgMQorCisjZGVmaW5lIElQVF9SRUNFTlRfTkFNRV9MRU4gMjAwCisKK3N0cnVjdCBpcHRfcmVjZW50X2luZm8geworCXVfaW50MzJfdCAgIHNlY29uZHM7CisJdV9pbnQzMl90ICAgaGl0X2NvdW50OworCXVfaW50OF90ICAgIGNoZWNrX3NldDsKKwl1X2ludDhfdCAgICBpbnZlcnQ7CisJY2hhciAgICAgICAgbmFtZVtJUFRfUkVDRU5UX05BTUVfTEVOXTsKKwl1X2ludDhfdCAgICBzaWRlOworfTsKKworI2VuZGlmIC8qX0lQVF9SRUNFTlRfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zY3RwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zY3RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiM2RiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3NjdHAuaApAQCAtMCwwICsxLDEwNSBAQAorI2lmbmRlZiBfSVBUX1NDVFBfSF8KKyNkZWZpbmUgX0lQVF9TQ1RQX0hfCisKKyNkZWZpbmUgSVBUX1NDVFBfU1JDX1BPUlRTCSAgICAgICAgMHgwMQorI2RlZmluZSBJUFRfU0NUUF9ERVNUX1BPUlRTCSAgICAgICAgMHgwMgorI2RlZmluZSBJUFRfU0NUUF9DSFVOS19UWVBFUwkJMHgwNAorCisjZGVmaW5lIElQVF9TQ1RQX1ZBTElEX0ZMQUdTCQkweDA3CisKKworc3RydWN0IGlwdF9zY3RwX2ZsYWdfaW5mbyB7CisJdV9pbnQ4X3QgY2h1bmt0eXBlOworCXVfaW50OF90IGZsYWc7CisJdV9pbnQ4X3QgZmxhZ19tYXNrOworfTsKKworI2RlZmluZSBJUFRfTlVNX1NDVFBfRkxBR1MJNAorCitzdHJ1Y3QgaXB0X3NjdHBfaW5mbyB7CisJdV9pbnQxNl90IGRwdHNbMl07ICAvKiBNaW4sIE1heCAqLworCXVfaW50MTZfdCBzcHRzWzJdOyAgLyogTWluLCBNYXggKi8KKworCXVfaW50MzJfdCBjaHVua21hcFsyNTYgLyBzaXplb2YgKHVfaW50MzJfdCldOyAgLyogQml0IG1hc2sgb2YgY2h1bmtzIHRvIGJlIG1hdGNoZWQgYWNjb3JkaW5nIHRvIFJGQyAyOTYwICovCisKKyNkZWZpbmUgU0NUUF9DSFVOS19NQVRDSF9BTlkgICAweDAxICAvKiBNYXRjaCBpZiBhbnkgb2YgdGhlIGNodW5rIHR5cGVzIGFyZSBwcmVzZW50ICovCisjZGVmaW5lIFNDVFBfQ0hVTktfTUFUQ0hfQUxMICAgMHgwMiAgLyogTWF0Y2ggaWYgYWxsIG9mIHRoZSBjaHVuayB0eXBlcyBhcmUgcHJlc2VudCAqLworI2RlZmluZSBTQ1RQX0NIVU5LX01BVENIX09OTFkgIDB4MDQgIC8qIE1hdGNoIGlmIHRoZXNlIGFyZSB0aGUgb25seSBjaHVuayB0eXBlcyBwcmVzZW50ICovCisKKwl1X2ludDMyX3QgY2h1bmtfbWF0Y2hfdHlwZTsKKwlzdHJ1Y3QgaXB0X3NjdHBfZmxhZ19pbmZvIGZsYWdfaW5mb1tJUFRfTlVNX1NDVFBfRkxBR1NdOworCWludCBmbGFnX2NvdW50OworCisJdV9pbnQzMl90IGZsYWdzOworCXVfaW50MzJfdCBpbnZmbGFnczsKK307CisKKyNkZWZpbmUgYnl0ZXModHlwZSkgKHNpemVvZih0eXBlKSAqIDgpCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9TRVQoY2h1bmttYXAsIHR5cGUpIAkJXAorCWRvIHsgCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gfD0gCVwKKwkJCTEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU0NUUF9DSFVOS01BUF9DTEVBUihjaHVua21hcCwgdHlwZSkJCSAJXAorCWRvIHsJCQkJCQkJXAorCQljaHVua21hcFt0eXBlIC8gYnl0ZXModV9pbnQzMl90KV0gJj0gCQlcCisJCQl+KDEgPDwgKHR5cGUgJSBieXRlcyh1X2ludDMyX3QpKSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfU0VUKGNodW5rbWFwLCB0eXBlKSAJCQlcCisoewkJCQkJCQkJXAorCShjaHVua21hcFt0eXBlIC8gYnl0ZXMgKHVfaW50MzJfdCldICYgCQkJXAorCQkoMSA8PCAodHlwZSAlIGJ5dGVzICh1X2ludDMyX3QpKSkpID8gMTogMDsJXAorfSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX1JFU0VUKGNodW5rbWFwKSAJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpbnQgaTsgCQkJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaHVua21hcCk7IGkrKykJXAorCQkJY2h1bmttYXBbaV0gPSAwOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfU0VUX0FMTChjaHVua21hcCkgCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpbnQgaTsgCQkJCQkJXAorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaHVua21hcCk7IGkrKykJXAorCQkJY2h1bmttYXBbaV0gPSB+MDsJCQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0NPUFkoZGVzdG1hcCwgc3JjbWFwKSAJCQlcCisJZG8gewkJCQkJCQlcCisJCWludCBpOyAJCQkJCQlcCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNodW5rbWFwKTsgaSsrKQlcCisJCQlkZXN0bWFwW2ldID0gc3JjbWFwW2ldOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNDVFBfQ0hVTktNQVBfSVNfQ0xFQVIoY2h1bmttYXApIAkJXAorKHsJCQkJCQkJXAorCWludCBpOyAJCQkJCQlcCisJaW50IGZsYWcgPSAxOwkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNodW5rbWFwKTsgaSsrKSB7CVwKKwkJaWYgKGNodW5rbWFwW2ldKSB7CQkJXAorCQkJZmxhZyA9IDA7CQkJXAorCQkJYnJlYWs7CQkJCVwKKwkJfQkJCQkJXAorCX0JCQkJCQlcCisgICAgICAgIGZsYWc7CQkJCQkJXAorfSkKKworI2RlZmluZSBTQ1RQX0NIVU5LTUFQX0lTX0FMTF9TRVQoY2h1bmttYXApIAkJXAorKHsJCQkJCQkJXAorCWludCBpOyAJCQkJCQlcCisJaW50IGZsYWcgPSAxOwkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNodW5rbWFwKTsgaSsrKSB7CVwKKwkJaWYgKGNodW5rbWFwW2ldICE9IH4wKSB7CQlcCisJCQlmbGFnID0gMDsJCQlcCisJCQkJYnJlYWs7CQkJXAorCQl9CQkJCQlcCisJfQkJCQkJCVwKKyAgICAgICAgZmxhZzsJCQkJCQlcCit9KQorCisjZW5kaWYgLyogX0lQVF9TQ1RQX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0YXRlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGE5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdGF0ZS5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX0lQVF9TVEFURV9ICisjZGVmaW5lIF9JUFRfU1RBVEVfSAorCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmg+CisKKyNkZWZpbmUgSVBUX1NUQVRFX0JJVAkJWFRfU1RBVEVfQklUCisjZGVmaW5lIElQVF9TVEFURV9JTlZBTElECVhUX1NUQVRFX0lOVkFMSUQKKworI2RlZmluZSBJUFRfU1RBVEVfVU5UUkFDS0VECVhUX1NUQVRFX1VOVFJBQ0tFRAorCisjZGVmaW5lIGlwdF9zdGF0ZV9pbmZvCQl4dF9zdGF0ZV9pbmZvCisKKyNlbmRpZiAvKl9JUFRfU1RBVEVfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmRlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9zdHJpbmcuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9JUFRfU1RSSU5HX0gKKyNkZWZpbmUgX0lQVF9TVFJJTkdfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oPgorCisjZGVmaW5lIElQVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRSBYVF9TVFJJTkdfTUFYX1BBVFRFUk5fU0laRQorI2RlZmluZSBJUFRfU1RSSU5HX01BWF9BTEdPX05BTUVfU0laRSBYVF9TVFJJTkdfTUFYX0FMR09fTkFNRV9TSVpFCisjZGVmaW5lIGlwdF9zdHJpbmdfaW5mbyB4dF9zdHJpbmdfaW5mbworCisjZW5kaWYgLypfSVBUX1NUUklOR19IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3RjcG1zcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdGNwbXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiYmM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3RjcG1zcy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfSVBUX1RDUE1TU19NQVRDSF9ICisjZGVmaW5lIF9JUFRfVENQTVNTX01BVENIX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3Btc3MuaD4KKyNkZWZpbmUgaXB0X3RjcG1zc19tYXRjaF9pbmZvIHh0X3RjcG1zc19tYXRjaF9pbmZvCisKKyNlbmRpZiAvKl9JUFRfVENQTVNTX01BVENIX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdG9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90b3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjFmNWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfdG9zLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfSVBUX1RPU19ICisjZGVmaW5lIF9JUFRfVE9TX0gKKworc3RydWN0IGlwdF90b3NfaW5mbyB7CisgICAgdV9pbnQ4X3QgdG9zOworICAgIHVfaW50OF90IGludmVydDsKK307CisKKyNpZm5kZWYgSVBUT1NfTk9STUFMU1ZDCisjZGVmaW5lIElQVE9TX05PUk1BTFNWQyAwCisjZW5kaWYKKworI2VuZGlmIC8qX0lQVF9UT1NfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90dGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3R0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjRmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90dGwuaApAQCAtMCwwICsxLDIxIEBACisvKiBJUCB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgdmFsdWUgb2YgdGhlIFRUTAorICogKEMpIDIwMDAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4gKi8KKworI2lmbmRlZiBfSVBUX1RUTF9ICisjZGVmaW5lIF9JUFRfVFRMX0gKKworZW51bSB7CisJSVBUX1RUTF9FUSA9IDAsCQkvKiBlcXVhbHMgKi8KKwlJUFRfVFRMX05FLAkJLyogbm90IGVxdWFscyAqLworCUlQVF9UVExfTFQsCQkvKiBsZXNzIHRoYW4gKi8KKwlJUFRfVFRMX0dULAkJLyogZ3JlYXRlciB0aGFuICovCit9OworCisKK3N0cnVjdCBpcHRfdHRsX2luZm8geworCXVfaW50OF90CW1vZGU7CisJdV9pbnQ4X3QJdHRsOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQxMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni5oCkBAIC0wLDAgKzEsODMgQEAKKyNpZm5kZWYgX19MSU5VWF9JUDZfTkVURklMVEVSX0gKKyNkZWZpbmUgX19MSU5VWF9JUDZfTkVURklMVEVSX0gKKworLyogSVB2Ni1zcGVjaWZpYyBkZWZpbmVzIGZvciBuZXRmaWx0ZXIuIAorICogKEMpMTk5OCBSdXN0eSBSdXNzZWxsIC0tIFRoaXMgY29kZSBpcyBHUEwuCisgKiAoQykxOTk5IERhdmlkIEplZmZlcnkKKyAqICAgdGhpcyBoZWFkZXIgd2FzIGJsYXRhbnRseSByaXBwZWQgZnJvbSBuZXRmaWx0ZXJfaXB2NC5oIAorICogICBpdCdzIGFtYXppbmcgd2hhdCBhZGRpbmcgYSBidW5jaCBvZiA2cyBjYW4gZG8gPTheKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKworLyogb25seSBmb3IgdXNlcnNwYWNlIGNvbXBhdGliaWxpdHkgKi8KKy8qIElQIENhY2hlIGJpdHMuICovCisvKiBTcmMgSVAgYWRkcmVzcy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9TUkMgICAgICAgICAgICAgIDB4MDAwMQorLyogRGVzdCBJUCBhZGRyZXNzLiAqLworI2RlZmluZSBORkNfSVA2X0RTVCAgICAgICAgICAgICAgMHgwMDAyCisvKiBJbnB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19JUDZfSUZfSU4gICAgICAgICAgICAweDAwMDQKKy8qIE91dHB1dCBkZXZpY2UuICovCisjZGVmaW5lIE5GQ19JUDZfSUZfT1VUICAgICAgICAgICAweDAwMDgKKy8qIFRPUy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9UT1MgICAgICAgICAgICAgIDB4MDAxMAorLyogUHJvdG9jb2wuICovCisjZGVmaW5lIE5GQ19JUDZfUFJPVE8gICAgICAgICAgICAweDAwMjAKKy8qIElQIG9wdGlvbnMuICovCisjZGVmaW5lIE5GQ19JUDZfT1BUSU9OUyAgICAgICAgICAweDAwNDAKKy8qIEZyYWcgJiBmbGFncy4gKi8KKyNkZWZpbmUgTkZDX0lQNl9GUkFHICAgICAgICAgICAgIDB4MDA4MAorCisKKy8qIFBlci1wcm90b2NvbCBpbmZvcm1hdGlvbjogb25seSBtYXR0ZXJzIGlmIHByb3RvIG1hdGNoLiAqLworLyogVENQIGZsYWdzLiAqLworI2RlZmluZSBORkNfSVA2X1RDUEZMQUdTICAgICAgICAgMHgwMTAwCisvKiBTb3VyY2UgcG9ydC4gKi8KKyNkZWZpbmUgTkZDX0lQNl9TUkNfUFQgICAgICAgICAgIDB4MDIwMAorLyogRGVzdCBwb3J0LiAqLworI2RlZmluZSBORkNfSVA2X0RTVF9QVCAgICAgICAgICAgMHgwNDAwCisvKiBTb21ldGhpbmcgZWxzZSBhYm91dCB0aGUgcHJvdG8gKi8KKyNkZWZpbmUgTkZDX0lQNl9QUk9UT19VTktOT1dOICAgIDB4MjAwMAorCisKKy8qIElQNiBIb29rcyAqLworLyogQWZ0ZXIgcHJvbWlzYyBkcm9wcywgY2hlY2tzdW0gY2hlY2tzLiAqLworI2RlZmluZSBORl9JUDZfUFJFX1JPVVRJTkcJMAorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgdGhpcyBib3guICovCisjZGVmaW5lIE5GX0lQNl9MT0NBTF9JTgkJMQorLyogSWYgdGhlIHBhY2tldCBpcyBkZXN0aW5lZCBmb3IgYW5vdGhlciBpbnRlcmZhY2UuICovCisjZGVmaW5lIE5GX0lQNl9GT1JXQVJECQkyCisvKiBQYWNrZXRzIGNvbWluZyBmcm9tIGEgbG9jYWwgcHJvY2Vzcy4gKi8KKyNkZWZpbmUgTkZfSVA2X0xPQ0FMX09VVAkJMworLyogUGFja2V0cyBhYm91dCB0byBoaXQgdGhlIHdpcmUuICovCisjZGVmaW5lIE5GX0lQNl9QT1NUX1JPVVRJTkcJNAorI2RlZmluZSBORl9JUDZfTlVNSE9PS1MJCTUKKworCitlbnVtIG5mX2lwNl9ob29rX3ByaW9yaXRpZXMgeworCU5GX0lQNl9QUklfRklSU1QgPSBJTlRfTUlOLAorCU5GX0lQNl9QUklfQ09OTlRSQUNLX0RFRlJBRyA9IC00MDAsCisJTkZfSVA2X1BSSV9TRUxJTlVYX0ZJUlNUID0gLTIyNSwKKwlORl9JUDZfUFJJX0NPTk5UUkFDSyA9IC0yMDAsCisJTkZfSVA2X1BSSV9NQU5HTEUgPSAtMTUwLAorCU5GX0lQNl9QUklfTkFUX0RTVCA9IC0xMDAsCisJTkZfSVA2X1BSSV9GSUxURVIgPSAwLAorCU5GX0lQNl9QUklfTkFUX1NSQyA9IDEwMCwKKwlORl9JUDZfUFJJX1NFTElOVVhfTEFTVCA9IDIyNSwKKwlORl9JUDZfUFJJX0xBU1QgPSBJTlRfTUFYLAorfTsKKworI2lmZGVmIENPTkZJR19ORVRGSUxURVIKK2V4dGVybiBpbnQgaXA2X3JvdXRlX21lX2hhcmRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBfX3N1bTE2IG5mX2lwNl9jaGVja3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaG9vaywKKwkJCQkgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsIHVfaW50OF90IHByb3RvY29sKTsKKworZXh0ZXJuIGludCBpcHY2X25ldGZpbHRlcl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaXB2Nl9uZXRmaWx0ZXJfZmluaSh2b2lkKTsKKyNlbHNlIC8qIENPTkZJR19ORVRGSUxURVIgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBpcHY2X25ldGZpbHRlcl9pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgaXB2Nl9uZXRmaWx0ZXJfZmluaSh2b2lkKSB7IHJldHVybjsgfQorI2VuZGlmIC8qIENPTkZJR19ORVRGSUxURVIgKi8KKworI2VuZGlmIC8qX19MSU5VWF9JUDZfTkVURklMVEVSX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODRmYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiAyNS1KdWwtMTk5OCBNYWpvciBjaGFuZ2VzIHRvIGFsbG93IGZvciBpcCBjaGFpbiB0YWJsZQorICoKKyAqIDMtSmFuLTIwMDAgTmFtZWQgdGFibGVzIHRvIGFsbG93IHBhY2tldCBzZWxlY3Rpb24gZm9yIGRpZmZlcmVudCB1c2VzLgorICovCisKKy8qCisgKiAJRm9ybWF0IG9mIGFuIElQNiBmaXJld2FsbCBkZXNjcmlwdG9yCisgKgorICogCXNyYywgZHN0LCBzcmNfbWFzaywgZHN0X21hc2sgYXJlIGFsd2F5cyBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICogCWZsYWdzIGFyZSBzdG9yZWQgaW4gaG9zdCBieXRlIG9yZGVyIChvZiBjb3Vyc2UpLgorICogCVBvcnQgbnVtYmVycyBhcmUgc3RvcmVkIGluIEhPU1QgYnl0ZSBvcmRlci4KKyAqLworCisjaWZuZGVmIF9JUDZfVEFCTEVTX0gKKyNkZWZpbmUgX0lQNl9UQUJMRVNfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjZGVmaW5lIElQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTiBYVF9GVU5DVElPTl9NQVhOQU1FTEVOCisjZGVmaW5lIElQNlRfVEFCTEVfTUFYTkFNRUxFTiBYVF9UQUJMRV9NQVhOQU1FTEVOCisKKyNkZWZpbmUgaXA2dF9tYXRjaCB4dF9tYXRjaAorI2RlZmluZSBpcDZ0X3RhcmdldCB4dF90YXJnZXQKKyNkZWZpbmUgaXA2dF90YWJsZSB4dF90YWJsZQorI2RlZmluZSBpcDZ0X2dldF9yZXZpc2lvbiB4dF9nZXRfcmV2aXNpb24KKworLyogWWVzLCBWaXJnaW5pYSwgeW91IGhhdmUgdG8gemVybyB0aGUgcGFkZGluZy4gKi8KK3N0cnVjdCBpcDZ0X2lwNiB7CisJLyogU291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUDYgYWRkciAqLworCXN0cnVjdCBpbjZfYWRkciBzcmMsIGRzdDsJCQorCS8qIE1hc2sgZm9yIHNyYyBhbmQgZGVzdCBJUDYgYWRkciAqLworCXN0cnVjdCBpbjZfYWRkciBzbXNrLCBkbXNrOworCWNoYXIgaW5pZmFjZVtJRk5BTVNJWl0sIG91dGlmYWNlW0lGTkFNU0laXTsKKwl1bnNpZ25lZCBjaGFyIGluaWZhY2VfbWFza1tJRk5BTVNJWl0sIG91dGlmYWNlX21hc2tbSUZOQU1TSVpdOworCisJLyogVXBwZXIgcHJvdG9jb2wgbnVtYmVyCisJICogLSBUaGUgYWxsb3dlZCB2YWx1ZSBpcyAwIChhbnkpIG9yIHByb3RvY29sIG51bWJlciBvZiBsYXN0IHBhcnNhYmxlCisJICogICBoZWFkZXIsIHdoaWNoIGlzIDUwIChFU1ApLCA1OSAoTm8gTmV4dCBIZWFkZXIpLCAxMzUgKE1IKSwgb3IKKwkgKiAgIHRoZSBub24gSVB2NiBleHRlbnNpb24gaGVhZGVycy4KKwkgKiAtIFRoZSBwcm90b2NvbCBudW1iZXJzIG9mIElQdjYgZXh0ZW5zaW9uIGhlYWRlcnMgZXhjZXB0IG9mIEVTUCBhbmQKKwkgKiAgIE1IIGRvIG5vdCBtYXRjaCBhbnkgcGFja2V0cy4KKwkgKiAtIFlvdSBhbHNvIG5lZWQgdG8gc2V0IElQNlRfRkxBR1NfUFJPVE8gdG8gImZsYWdzIiB0byBjaGVjayBwcm90b2NvbC4KKwkgKi8KKwl1X2ludDE2X3QgcHJvdG87CisJLyogVE9TIHRvIG1hdGNoIGlmZiBmbGFncyAmIElQNlRfRl9UT1MgKi8KKwl1X2ludDhfdCB0b3M7CisKKwkvKiBGbGFncyB3b3JkICovCisJdV9pbnQ4X3QgZmxhZ3M7CisJLyogSW52ZXJzZSBmbGFncyAqLworCXVfaW50OF90IGludmZsYWdzOworfTsKKworI2RlZmluZSBpcDZ0X2VudHJ5X21hdGNoIHh0X2VudHJ5X21hdGNoCisjZGVmaW5lIGlwNnRfZW50cnlfdGFyZ2V0IHh0X2VudHJ5X3RhcmdldAorI2RlZmluZSBpcDZ0X3N0YW5kYXJkX3RhcmdldCB4dF9zdGFuZGFyZF90YXJnZXQKKworI2RlZmluZSBpcDZ0X2NvdW50ZXJzCXh0X2NvdW50ZXJzCisKKy8qIFZhbHVlcyBmb3IgImZsYWciIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2lwNiAoZ2VuZXJhbCBpcDYgc3RydWN0dXJlKS4gKi8KKyNkZWZpbmUgSVA2VF9GX1BST1RPCQkweDAxCS8qIFNldCBpZiBydWxlIGNhcmVzIGFib3V0IHVwcGVyIAorCQkJCQkgICBwcm90b2NvbHMgKi8KKyNkZWZpbmUgSVA2VF9GX1RPUwkJMHgwMgkvKiBNYXRjaCB0aGUgVE9TLiAqLworI2RlZmluZSBJUDZUX0ZfR09UTwkJMHgwNAkvKiBTZXQgaWYganVtcCBpcyBhIGdvdG8gKi8KKyNkZWZpbmUgSVA2VF9GX01BU0sJCTB4MDcJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBWYWx1ZXMgZm9yICJpbnYiIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2lwNi4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfVklBX0lOCQkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgSU4gSUZBQ0UuICovCisjZGVmaW5lIElQNlRfSU5WX1ZJQV9PVVQJCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBPVVQgSUZBQ0UgKi8KKyNkZWZpbmUgSVA2VF9JTlZfVE9TCQkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgVE9TLiAqLworI2RlZmluZSBJUDZUX0lOVl9TUkNJUAkJMHgwOAkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIFNSQyBJUC4gKi8KKyNkZWZpbmUgSVA2VF9JTlZfRFNUSVAJCTB4MTAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBEU1QgT1AuICovCisjZGVmaW5lIElQNlRfSU5WX0ZSQUcJCTB4MjAJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBGUkFHLiAqLworI2RlZmluZSBJUDZUX0lOVl9QUk9UTwkJWFRfSU5WX1BST1RPCisjZGVmaW5lIElQNlRfSU5WX01BU0sJCTB4N0YJLyogQWxsIHBvc3NpYmxlIGZsYWcgYml0cyBtYXNrLiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGVhY2ggb2YgdGhlIGZpcmV3YWxsIHJ1bGVzLiAgQ29uc2lzdHMgb2YgMworICAgcGFydHMgd2hpY2ggYXJlIDEpIGdlbmVyYWwgSVAgaGVhZGVyIHN0dWZmIDIpIG1hdGNoIHNwZWNpZmljCisgICBzdHVmZiAzKSB0aGUgdGFyZ2V0IHRvIHBlcmZvcm0gaWYgdGhlIHJ1bGUgbWF0Y2hlcyAqLworc3RydWN0IGlwNnRfZW50cnkKK3sKKwlzdHJ1Y3QgaXA2dF9pcDYgaXB2NjsKKworCS8qIE1hcmsgd2l0aCBmaWVsZHMgdGhhdCB3ZSBjYXJlIGFib3V0LiAqLworCXVuc2lnbmVkIGludCBuZmNhY2hlOworCisJLyogU2l6ZSBvZiBpcHRfZW50cnkgKyBtYXRjaGVzICovCisJdV9pbnQxNl90IHRhcmdldF9vZmZzZXQ7CisJLyogU2l6ZSBvZiBpcHRfZW50cnkgKyBtYXRjaGVzICsgdGFyZ2V0ICovCisJdV9pbnQxNl90IG5leHRfb2Zmc2V0OworCisJLyogQmFjayBwb2ludGVyICovCisJdW5zaWduZWQgaW50IGNvbWVmcm9tOworCisJLyogUGFja2V0IGFuZCBieXRlIGNvdW50ZXJzLiAqLworCXN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyczsKKworCS8qIFRoZSBtYXRjaGVzIChpZiBhbnkpLCB0aGVuIHRoZSB0YXJnZXQuICovCisJdW5zaWduZWQgY2hhciBlbGVtc1swXTsKK307CisKKy8qIFN0YW5kYXJkIGVudHJ5ICovCitzdHJ1Y3QgaXA2dF9zdGFuZGFyZAoreworCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OworCXN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCB0YXJnZXQ7Cit9OworCitzdHJ1Y3QgaXA2dF9lcnJvcl90YXJnZXQKK3sKKwlzdHJ1Y3QgaXA2dF9lbnRyeV90YXJnZXQgdGFyZ2V0OworCWNoYXIgZXJyb3JuYW1lW0lQNlRfRlVOQ1RJT05fTUFYTkFNRUxFTl07Cit9OworCitzdHJ1Y3QgaXA2dF9lcnJvcgoreworCXN0cnVjdCBpcDZ0X2VudHJ5IGVudHJ5OworCXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCB0YXJnZXQ7Cit9OworCisjZGVmaW5lIElQNlRfRU5UUllfSU5JVChfX3NpemUpCQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS50YXJnZXRfb2Zmc2V0CT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwJCQkgICAgICAgXAorCS5uZXh0X29mZnNldAk9IChfX3NpemUpLAkJCQkJICAgICAgIFwKK30KKworI2RlZmluZSBJUDZUX1NUQU5EQVJEX0lOSVQoX192ZXJkaWN0KQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS5lbnRyeQkJPSBJUDZUX0VOVFJZX0lOSVQoc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSksICAgICAgIFwKKwkudGFyZ2V0CQk9IFhUX1RBUkdFVF9JTklUKElQNlRfU1RBTkRBUkRfVEFSR0VULAkJICAgICAgIFwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgXAorCS50YXJnZXQudmVyZGljdAk9IC0oX192ZXJkaWN0KSAtIDEsCQkJCSAgICAgICBcCit9CisKKyNkZWZpbmUgSVA2VF9FUlJPUl9JTklUCQkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkuZW50cnkJCT0gSVA2VF9FTlRSWV9JTklUKHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvcikpLAkgICAgICAgXAorCS50YXJnZXQJCT0gWFRfVEFSR0VUX0lOSVQoSVA2VF9FUlJPUl9UQVJHRVQsCQkgICAgICAgXAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCkpLCAgICBcCisJLnRhcmdldC5lcnJvcm5hbWUgPSAiRVJST1IiLAkJCQkJICAgICAgIFwKK30KKworLyoKKyAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCisgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlCisgKiBhIHJhdyBzb2NrZXQgZm9yIHRoaXMuIEluc3RlYWQgd2UgY2hlY2sgcmlnaHRzIGluIHRoZSBjYWxscy4KKyAqCisgKiBBVFRFTlRJT046IGNoZWNrIGxpbnV4L2luNi5oIGJlZm9yZSBhZGRpbmcgbmV3IG51bWJlciBoZXJlLgorICovCisjZGVmaW5lIElQNlRfQkFTRV9DVEwJCQk2NAorCisjZGVmaW5lIElQNlRfU09fU0VUX1JFUExBQ0UJCShJUDZUX0JBU0VfQ1RMKQorI2RlZmluZSBJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMJKElQNlRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUDZUX1NPX1NFVF9NQVgJCQlJUDZUX1NPX1NFVF9BRERfQ09VTlRFUlMKKworI2RlZmluZSBJUDZUX1NPX0dFVF9JTkZPCQkoSVA2VF9CQVNFX0NUTCkKKyNkZWZpbmUgSVA2VF9TT19HRVRfRU5UUklFUwkJKElQNlRfQkFTRV9DVEwgKyAxKQorI2RlZmluZSBJUDZUX1NPX0dFVF9SRVZJU0lPTl9NQVRDSAkoSVA2VF9CQVNFX0NUTCArIDQpCisjZGVmaW5lIElQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAkoSVA2VF9CQVNFX0NUTCArIDUpCisjZGVmaW5lIElQNlRfU09fR0VUX01BWAkJCUlQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVAorCisvKiBDT05USU5VRSB2ZXJkaWN0IGZvciB0YXJnZXRzICovCisjZGVmaW5lIElQNlRfQ09OVElOVUUgWFRfQ09OVElOVUUKKworLyogRm9yIHN0YW5kYXJkIHRhcmdldCAqLworI2RlZmluZSBJUDZUX1JFVFVSTiBYVF9SRVRVUk4KKworLyogVENQL1VEUCBtYXRjaGluZyBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaD4KKworI2RlZmluZSBpcDZ0X3RjcCB4dF90Y3AKKyNkZWZpbmUgaXA2dF91ZHAgeHRfdWRwCisKKy8qIFZhbHVlcyBmb3IgImludiIgZmllbGQgaW4gc3RydWN0IGlwdF90Y3AuICovCisjZGVmaW5lIElQNlRfVENQX0lOVl9TUkNQVAlYVF9UQ1BfSU5WX1NSQ1BUCisjZGVmaW5lIElQNlRfVENQX0lOVl9EU1RQVAlYVF9UQ1BfSU5WX0RTVFBUCisjZGVmaW5lIElQNlRfVENQX0lOVl9GTEFHUwlYVF9UQ1BfSU5WX0ZMQUdTCisjZGVmaW5lIElQNlRfVENQX0lOVl9PUFRJT04JWFRfVENQX0lOVl9PUFRJT04KKyNkZWZpbmUgSVA2VF9UQ1BfSU5WX01BU0sJWFRfVENQX0lOVl9NQVNLCisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXB0X3VkcC4gKi8KKyNkZWZpbmUgSVA2VF9VRFBfSU5WX1NSQ1BUCVhUX1VEUF9JTlZfU1JDUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX0RTVFBUCVhUX1VEUF9JTlZfRFNUUFQKKyNkZWZpbmUgSVA2VF9VRFBfSU5WX01BU0sJWFRfVURQX0lOVl9NQVNLCisKKy8qIElDTVAgbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCBpcDZ0X2ljbXAKK3sKKwl1X2ludDhfdCB0eXBlOwkJCQkvKiB0eXBlIHRvIG1hdGNoICovCisJdV9pbnQ4X3QgY29kZVsyXTsJCQkvKiByYW5nZSBvZiBjb2RlICovCisJdV9pbnQ4X3QgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52IiBmaWVsZCBmb3Igc3RydWN0IGlwdF9pY21wLiAqLworI2RlZmluZSBJUDZUX0lDTVBfSU5WCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0eXBlL2NvZGUgdGVzdCAqLworCisvKiBUaGUgYXJndW1lbnQgdG8gSVA2VF9TT19HRVRfSU5GTyAqLworc3RydWN0IGlwNnRfZ2V0aW5mbworeworCS8qIFdoaWNoIHRhYmxlOiBjYWxsZXIgZmlsbHMgdGhpcyBpbi4gKi8KKwljaGFyIG5hbWVbSVA2VF9UQUJMRV9NQVhOQU1FTEVOXTsKKworCS8qIEtlcm5lbCBmaWxscyB0aGVzZSBpbi4gKi8KKwkvKiBXaGljaCBob29rIGVudHJ5IHBvaW50cyBhcmUgdmFsaWQ6IGJpdG1hc2sgKi8KKwl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7CisKKwkvKiBIb29rIGVudHJ5IHBvaW50czogb25lIHBlciBuZXRmaWx0ZXIgaG9vay4gKi8KKwl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JUDZfTlVNSE9PS1NdOworCisJLyogVW5kZXJmbG93IHBvaW50cy4gKi8KKwl1bnNpZ25lZCBpbnQgdW5kZXJmbG93W05GX0lQNl9OVU1IT09LU107CisKKwkvKiBOdW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBudW1fZW50cmllczsKKworCS8qIFNpemUgb2YgZW50cmllcy4gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX1NFVF9SRVBMQUNFLiAqLworc3RydWN0IGlwNnRfcmVwbGFjZQoreworCS8qIFdoaWNoIHRhYmxlLiAqLworCWNoYXIgbmFtZVtJUDZUX1RBQkxFX01BWE5BTUVMRU5dOworCisJLyogV2hpY2ggaG9vayBlbnRyeSBwb2ludHMgYXJlIHZhbGlkOiBiaXRtYXNrLiAgWW91IGNhbid0CisgICAgICAgICAgIGNoYW5nZSB0aGlzLiAqLworCXVuc2lnbmVkIGludCB2YWxpZF9ob29rczsKKworCS8qIE51bWJlciBvZiBlbnRyaWVzICovCisJdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworCisJLyogVG90YWwgc2l6ZSBvZiBuZXcgZW50cmllcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJLyogSG9vayBlbnRyeSBwb2ludHMuICovCisJdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVA2X05VTUhPT0tTXTsKKworCS8qIFVuZGVyZmxvdyBwb2ludHMuICovCisJdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9JUDZfTlVNSE9PS1NdOworCisJLyogSW5mb3JtYXRpb24gYWJvdXQgb2xkIGVudHJpZXM6ICovCisJLyogTnVtYmVyIG9mIGNvdW50ZXJzIChtdXN0IGJlIGVxdWFsIHRvIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMpLiAqLworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJLyogVGhlIG9sZCBlbnRyaWVzJyBjb3VudGVycy4gKi8KKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCisJLyogVGhlIGVudHJpZXMgKGhhbmcgb2ZmIGVuZDogbm90IHJlYWxseSBhbiBhcnJheSkuICovCisJc3RydWN0IGlwNnRfZW50cnkgZW50cmllc1swXTsKK307CisKKy8qIFRoZSBhcmd1bWVudCB0byBJUDZUX1NPX0FERF9DT1VOVEVSUy4gKi8KKyNkZWZpbmUgaXA2dF9jb3VudGVyc19pbmZvIHh0X2NvdW50ZXJzX2luZm8KKworLyogVGhlIGFyZ3VtZW50IHRvIElQNlRfU09fR0VUX0VOVFJJRVMuICovCitzdHJ1Y3QgaXA2dF9nZXRfZW50cmllcworeworCS8qIFdoaWNoIHRhYmxlOiB1c2VyIGZpbGxzIHRoaXMgaW4uICovCisJY2hhciBuYW1lW0lQNlRfVEFCTEVfTUFYTkFNRUxFTl07CisKKwkvKiBVc2VyIGZpbGxzIHRoaXMgaW46IHRvdGFsIGVudHJ5IHNpemUuICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwkvKiBUaGUgZW50cmllcy4gKi8KKwlzdHJ1Y3QgaXA2dF9lbnRyeSBlbnRyeXRhYmxlWzBdOworfTsKKworLyogU3RhbmRhcmQgcmV0dXJuIHZlcmRpY3QsIG9yIGRvIGp1bXAuICovCisjZGVmaW5lIElQNlRfU1RBTkRBUkRfVEFSR0VUIFhUX1NUQU5EQVJEX1RBUkdFVAorLyogRXJyb3IgdmVyZGljdC4gKi8KKyNkZWZpbmUgSVA2VF9FUlJPUl9UQVJHRVQgWFRfRVJST1JfVEFSR0VUCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpcDZ0X2VudHJ5X3RhcmdldCAqCitpcDZ0X2dldF90YXJnZXQoc3RydWN0IGlwNnRfZW50cnkgKmUpCit7CisJcmV0dXJuICh2b2lkICopZSArIGUtPnRhcmdldF9vZmZzZXQ7Cit9CisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgSVA2VF9NQVRDSF9JVEVSQVRFKGUsIGZuLCBhcmdzLi4uKQlcCisoewkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pOwkJCVwKKwlpbnQgX19yZXQgPSAwOwkJCQlcCisJc3RydWN0IGlwNnRfZW50cnlfbWF0Y2ggKl9fbTsJCVwKKwkJCQkJCVwKKwlmb3IgKF9faSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSk7CVwKKwkgICAgIF9faSA8IChlKS0+dGFyZ2V0X29mZnNldDsJCVwKKwkgICAgIF9faSArPSBfX20tPnUubWF0Y2hfc2l6ZSkgewlcCisJCV9fbSA9ICh2b2lkICopKGUpICsgX19pOwlcCisJCQkJCQlcCisJCV9fcmV0ID0gZm4oX19tICwgIyMgYXJncyk7CVwKKwkJaWYgKF9fcmV0ICE9IDApCQkJXAorCQkJYnJlYWs7CQkJXAorCX0JCQkJCVwKKwlfX3JldDsJCQkJCVwKK30pCisKKy8qIGZuIHJldHVybnMgMCB0byBjb250aW51ZSBpdGVyYXRpb24gKi8KKyNkZWZpbmUgSVA2VF9FTlRSWV9JVEVSQVRFKGVudHJpZXMsIHNpemUsIGZuLCBhcmdzLi4uKQkJXAorKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX19pOwkJCQkJXAorCWludCBfX3JldCA9IDA7CQkJCQkJXAorCXN0cnVjdCBpcDZ0X2VudHJ5ICpfX2U7CQkJCQlcCisJCQkJCQkJCVwKKwlmb3IgKF9faSA9IDA7IF9faSA8IChzaXplKTsgX19pICs9IF9fZS0+bmV4dF9vZmZzZXQpIHsJXAorCQlfX2UgPSAodm9pZCAqKShlbnRyaWVzKSArIF9faTsJCQlcCisJCQkJCQkJCVwKKwkJX19yZXQgPSBmbihfX2UgLCAjIyBhcmdzKTsJCQlcCisJCWlmIChfX3JldCAhPSAwKQkJCQkJXAorCQkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCQlcCisJX19yZXQ7CQkJCQkJCVwKK30pCisKKy8qCisgKglNYWluIGZpcmV3YWxsIGNoYWlucyBkZWZpbml0aW9ucyBhbmQgZ2xvYmFsIHZhcidzIGRlZmluaXRpb25zLgorICovCisKKyNlbmRpZiAvKiBfSVA2X1RBQkxFU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfSEwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9ITC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjc4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfSEwuaApAQCAtMCwwICsxLDIyIEBACisvKiBIb3AgTGltaXQgbW9kaWZpY2F0aW9uIG1vZHVsZSBmb3IgaXA2dGFibGVzCisgKiBNYWNpZWogU29sdHlzaWFrIDxzb2x0QGRucy50b3hpY2ZpbG1zLnR2PgorICogQmFzZWQgb24gSFcncyBUVEwgbW9kdWxlICovCisKKyNpZm5kZWYgX0lQNlRfSExfSAorI2RlZmluZSBfSVA2VF9ITF9ICisKK2VudW0geworCUlQNlRfSExfU0VUID0gMCwKKwlJUDZUX0hMX0lOQywKKwlJUDZUX0hMX0RFQworfTsKKworI2RlZmluZSBJUDZUX0hMX01BWE1PREUJSVA2VF9ITF9ERUMKKworc3RydWN0IGlwNnRfSExfaW5mbyB7CisJdV9pbnQ4X3QJbW9kZTsKKwl1X2ludDhfdAlob3BfbGltaXQ7Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X0xPRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDExOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfTE9HLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfSVA2VF9MT0dfSAorI2RlZmluZSBfSVA2VF9MT0dfSAorCisvKiBtYWtlIHN1cmUgbm90IHRvIGNoYW5nZSB0aGlzIHdpdGhvdXQgY2hhbmdpbmcgbmV0ZmlsdGVyLmg6TkZfTE9HXyogKCEpICovCisjZGVmaW5lIElQNlRfTE9HX1RDUFNFUQkJMHgwMQkvKiBMb2cgVENQIHNlcXVlbmNlIG51bWJlcnMgKi8KKyNkZWZpbmUgSVA2VF9MT0dfVENQT1BUCQkweDAyCS8qIExvZyBUQ1Agb3B0aW9ucyAqLworI2RlZmluZSBJUDZUX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLworI2RlZmluZSBJUDZUX0xPR19VSUQJCTB4MDgJLyogTG9nIFVJRCBvd25pbmcgbG9jYWwgc29ja2V0ICovCisjZGVmaW5lIElQNlRfTE9HX05GTE9HCQkweDEwCS8qIFVuc3VwcG9ydGVkLCBkb24ndCB1c2UgKi8KKyNkZWZpbmUgSVA2VF9MT0dfTUFTSwkJMHgxZgorCitzdHJ1Y3QgaXA2dF9sb2dfaW5mbyB7CisJdW5zaWduZWQgY2hhciBsZXZlbDsKKwl1bnNpZ25lZCBjaGFyIGxvZ2ZsYWdzOworCWNoYXIgcHJlZml4WzMwXTsKK307CisKKyNlbmRpZiAvKl9JUFRfTE9HX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X01BUksuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmNjI5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9JUDZUX01BUktfSF90YXJnZXQKKyNkZWZpbmUgX0lQNlRfTUFSS19IX3RhcmdldAorCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9NQVJLLmg+CisKKyNkZWZpbmUgaXA2dF9tYXJrX3RhcmdldF9pbmZvIHh0X21hcmtfdGFyZ2V0X2luZm8KKworI2VuZGlmIC8qX0lQNlRfTUFSS19IX3RhcmdldCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfUkVKRUNULmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfUkVKRUNULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlNjUwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9SRUpFQ1QuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9JUDZUX1JFSkVDVF9ICisjZGVmaW5lIF9JUDZUX1JFSkVDVF9ICisKK2VudW0gaXA2dF9yZWplY3Rfd2l0aCB7CisJSVA2VF9JQ01QNl9OT19ST1VURSwKKwlJUDZUX0lDTVA2X0FETV9QUk9ISUJJVEVELAorCUlQNlRfSUNNUDZfTk9UX05FSUdIQk9VUiwKKwlJUDZUX0lDTVA2X0FERFJfVU5SRUFDSCwKKwlJUDZUX0lDTVA2X1BPUlRfVU5SRUFDSCwKKwlJUDZUX0lDTVA2X0VDSE9SRVBMWSwKKwlJUDZUX1RDUF9SRVNFVAorfTsKKworc3RydWN0IGlwNnRfcmVqZWN0X2luZm8geworCXVfaW50MzJfdAl3aXRoOwkvKiByZWplY3QgdHlwZSAqLworfTsKKworI2VuZGlmIC8qX0lQNlRfUkVKRUNUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2FoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfYWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMxODc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2FoLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfSVA2VF9BSF9ICisjZGVmaW5lIF9JUDZUX0FIX0gKKworc3RydWN0IGlwNnRfYWgKK3sKKwl1X2ludDMyX3Qgc3Bpc1syXTsJCQkvKiBTZWN1cml0eSBQYXJhbWV0ZXIgSW5kZXggKi8KKwl1X2ludDMyX3QgaGRybGVuOwkJCS8qIEhlYWRlciBMZW5ndGggKi8KKwl1X2ludDhfdCAgaGRycmVzOwkJCS8qIFRlc3Qgb2YgdGhlIFJlc2VydmVkIEZpbGVkICovCisJdV9pbnQ4X3QgIGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKyNkZWZpbmUgSVA2VF9BSF9TUEkgMHgwMQorI2RlZmluZSBJUDZUX0FIX0xFTiAweDAyCisjZGVmaW5lIElQNlRfQUhfUkVTIDB4MDQKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcDZ0X2FoLiAqLworI2RlZmluZSBJUDZUX0FIX0lOVl9TUEkJCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBzcGkuICovCisjZGVmaW5lIElQNlRfQUhfSU5WX0xFTgkJMHgwMgkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGxlbmd0aC4gKi8KKyNkZWZpbmUgSVA2VF9BSF9JTlZfTUFTSwkweDAzCS8qIEFsbCBwb3NzaWJsZSBmbGFncy4gKi8KKworI2VuZGlmIC8qX0lQNlRfQUhfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZXNwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZXNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyZWFmNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9lc3AuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9JUDZUX0VTUF9ICisjZGVmaW5lIF9JUDZUX0VTUF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZXNwLmg+CisKKyNkZWZpbmUgaXA2dF9lc3AgeHRfZXNwCisjZGVmaW5lIElQNlRfRVNQX0lOVl9TUEkJWFRfRVNQX0lOVl9TUEkKKyNkZWZpbmUgSVA2VF9FU1BfSU5WX01BU0sJWFRfRVNQX0lOVl9NQVNLCisKKyNlbmRpZiAvKl9JUDZUX0VTUF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9mcmFnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZnJhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDcwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfZnJhZy5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX0lQNlRfRlJBR19ICisjZGVmaW5lIF9JUDZUX0ZSQUdfSAorCitzdHJ1Y3QgaXA2dF9mcmFnCit7CisJdV9pbnQzMl90IGlkc1syXTsJCQkvKiBTZWN1cml0eSBQYXJhbWV0ZXIgSW5kZXggKi8KKwl1X2ludDMyX3QgaGRybGVuOwkJCS8qIEhlYWRlciBMZW5ndGggKi8KKwl1X2ludDhfdCAgZmxhZ3M7CQkJLyogICovCisJdV9pbnQ4X3QgIGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KK307CisKKyNkZWZpbmUgSVA2VF9GUkFHX0lEUyAJCTB4MDEKKyNkZWZpbmUgSVA2VF9GUkFHX0xFTiAJCTB4MDIKKyNkZWZpbmUgSVA2VF9GUkFHX1JFUyAJCTB4MDQKKyNkZWZpbmUgSVA2VF9GUkFHX0ZTVCAJCTB4MDgKKyNkZWZpbmUgSVA2VF9GUkFHX01GICAJCTB4MTAKKyNkZWZpbmUgSVA2VF9GUkFHX05NRiAgCQkweDIwCisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9mcmFnLiAqLworI2RlZmluZSBJUDZUX0ZSQUdfSU5WX0lEUwkweDAxCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgaWRzLiAqLworI2RlZmluZSBJUDZUX0ZSQUdfSU5WX0xFTgkweDAyCS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgbGVuZ3RoLiAqLworI2RlZmluZSBJUDZUX0ZSQUdfSU5WX01BU0sJMHgwMwkvKiBBbGwgcG9zc2libGUgZmxhZ3MuICovCisKKyNlbmRpZiAvKl9JUDZUX0ZSQUdfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9obC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjkxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaGwuaApAQCAtMCwwICsxLDIyIEBACisvKiBpcDZ0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgSG9wIExpbWl0IHZhbHVlCisgKiBNYWNpZWogU29sdHlzaWFrIDxzb2x0QGRucy50b3hpY2ZpbG1zLnR2PgorICogQmFzZWQgb24gSFcncyB0dGwgbW9kdWxlICovCisKKyNpZm5kZWYgX0lQNlRfSExfSAorI2RlZmluZSBfSVA2VF9ITF9ICisKK2VudW0geworCUlQNlRfSExfRVEgPSAwLAkJLyogZXF1YWxzICovCisJSVA2VF9ITF9ORSwJCS8qIG5vdCBlcXVhbHMgKi8KKwlJUDZUX0hMX0xULAkJLyogbGVzcyB0aGFuICovCisJSVA2VF9ITF9HVCwJCS8qIGdyZWF0ZXIgdGhhbiAqLworfTsKKworCitzdHJ1Y3QgaXA2dF9obF9pbmZvIHsKKwl1X2ludDhfdAltb2RlOworCXVfaW50OF90CWhvcF9saW1pdDsKK307CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfaXB2NmhlYWRlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2lwdjZoZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM1M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2lwdjZoZWFkZXIuaApAQCAtMCwwICsxLDI3IEBACisvKiBpcHY2aGVhZGVyIG1hdGNoIC0gbWF0Y2hlcyBJUHY2IHBhY2tldHMgYmFzZWQKK29uIHdoZXRoZXIgdGhleSBjb250YWluIGNlcnRhaW4gaGVhZGVycyAqLworCisvKiBPcmlnaW5hbCBpZGVhOiBCcmFkIENoYXBtYW4gCisgKiBSZXdyaXR0ZW4gYnk6IEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+ICovCisKKworI2lmbmRlZiBfX0lQVjZIRUFERVJfSAorI2RlZmluZSBfX0lQVjZIRUFERVJfSAorCitzdHJ1Y3QgaXA2dF9pcHY2aGVhZGVyX2luZm8KK3sKKwl1X2ludDhfdCBtYXRjaGZsYWdzOworCXVfaW50OF90IGludmZsYWdzOworCXVfaW50OF90IG1vZGVmbGFnOworfTsKKworI2RlZmluZSBNQVNLX0hPUE9QVFMgICAgMTI4CisjZGVmaW5lIE1BU0tfRFNUT1BUUyAgICA2NAorI2RlZmluZSBNQVNLX1JPVVRJTkcgICAgMzIKKyNkZWZpbmUgTUFTS19GUkFHTUVOVCAgIDE2CisjZGVmaW5lIE1BU0tfQUggICAgICAgICA4CisjZGVmaW5lIE1BU0tfRVNQICAgICAgICA0CisjZGVmaW5lIE1BU0tfTk9ORSAgICAgICAyCisjZGVmaW5lIE1BU0tfUFJPVE8gICAgICAxCisKKyNlbmRpZiAvKiBfX0lQVjZIRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTY4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGVuZ3RoLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9JUDZUX0xFTkdUSF9ICisjZGVmaW5lIF9JUDZUX0xFTkdUSF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmg+CisjZGVmaW5lIGlwNnRfbGVuZ3RoX2luZm8geHRfbGVuZ3RoX2luZm8KKworI2VuZGlmIC8qX0lQNlRfTEVOR1RIX0gqLworCQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xpbWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbGltaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdlNWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xpbWl0LmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9JUDZUX1JBVEVfSAorI2RlZmluZSBfSVA2VF9SQVRFX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9saW1pdC5oPgorI2RlZmluZSBJUDZUX0xJTUlUX1NDQUxFIFhUX0xJTUlUX1NDQUxFCisjZGVmaW5lIGlwNnRfcmF0ZWluZm8geHRfcmF0ZWluZm8KKworI2VuZGlmIC8qX0lQNlRfUkFURV9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU4ZTgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hYy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfSVA2VF9NQUNfSAorI2RlZmluZSBfSVA2VF9NQUNfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hYy5oPgorI2RlZmluZSBpcDZ0X21hY19pbmZvIHh0X21hY19pbmZvCisKKyNlbmRpZiAvKl9JUDZUX01BQ19IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYXJrLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjA0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWFyay5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfSVA2VF9NQVJLX0gKKyNkZWZpbmUgX0lQNlRfTUFSS19ICisKKy8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGQgdXNlcnNwYWNlICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hcmsuaD4KKworI2RlZmluZSBpcDZ0X21hcmtfaW5mbyB4dF9tYXJrX2luZm8KKworI2VuZGlmIC8qX0lQVF9NQVJLX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfbWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWNhOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21oLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfSVA2VF9NSF9ICisjZGVmaW5lIF9JUDZUX01IX0gKKworLyogTUggbWF0Y2hpbmcgc3R1ZmYgKi8KK3N0cnVjdCBpcDZ0X21oCit7CisJdV9pbnQ4X3QgdHlwZXNbMl07CS8qIE1IIHR5cGUgcmFuZ2UgKi8KKwl1X2ludDhfdCBpbnZmbGFnczsJLyogSW52ZXJzZSBmbGFncyAqLworfTsKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcDZ0X21oLiAqLworI2RlZmluZSBJUDZUX01IX0lOVl9UWVBFCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0eXBlLiAqLworI2RlZmluZSBJUDZUX01IX0lOVl9NQVNLCTB4MDEJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVA2VF9NSF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tdWx0aXBvcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tdWx0aXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJjOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X211bHRpcG9ydC5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0lQNlRfTVVMVElQT1JUX0gKKyNkZWZpbmUgX0lQNlRfTVVMVElQT1JUX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaD4KKworI2RlZmluZSBJUDZUX01VTFRJUE9SVF9TT1VSQ0UJCVhUX01VTFRJUE9SVF9TT1VSQ0UKKyNkZWZpbmUgSVA2VF9NVUxUSVBPUlRfREVTVElOQVRJT04JWFRfTVVMVElQT1JUX0RFU1RJTkFUSU9OCisjZGVmaW5lIElQNlRfTVVMVElQT1JUX0VJVEhFUgkJWFRfTVVMVElQT1JUX0VJVEhFUgorCisjZGVmaW5lIElQNlRfTVVMVElfUE9SVFMJCVhUX01VTFRJX1BPUlRTCisKKyNkZWZpbmUgaXA2dF9tdWx0aXBvcnQJCQl4dF9tdWx0aXBvcnQKKworI2VuZGlmIC8qX0lQNlRfTVVMVElQT1JUX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X29wdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZTM2MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9vcHRzLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfSVA2VF9PUFRTX0gKKyNkZWZpbmUgX0lQNlRfT1BUU19ICisKKyNkZWZpbmUgSVA2VF9PUFRTX09QVFNOUiAxNgorCitzdHJ1Y3QgaXA2dF9vcHRzCit7CisJdV9pbnQzMl90IGhkcmxlbjsJCQkvKiBIZWFkZXIgTGVuZ3RoICovCisJdV9pbnQ4X3QgZmxhZ3M7CQkJCS8qICAqLworCXVfaW50OF90IGludmZsYWdzOwkJCS8qIEludmVyc2UgZmxhZ3MgKi8KKwl1X2ludDE2X3Qgb3B0c1tJUDZUX09QVFNfT1BUU05SXTsJLyogb3B0cyAqLworCXVfaW50OF90IG9wdHNucjsJCQkvKiBOciBvZiBPUHRzICovCit9OworCisjZGVmaW5lIElQNlRfT1BUU19MRU4gCQkweDAxCisjZGVmaW5lIElQNlRfT1BUU19PUFRTIAkJMHgwMgorI2RlZmluZSBJUDZUX09QVFNfTlNUUklDVAkweDA0CisKKy8qIFZhbHVlcyBmb3IgImludmZsYWdzIiBmaWVsZCBpbiBzdHJ1Y3QgaXA2dF9ydC4gKi8KKyNkZWZpbmUgSVA2VF9PUFRTX0lOVl9MRU4JMHgwMQkvKiBJbnZlcnQgdGhlIHNlbnNlIG9mIGxlbmd0aC4gKi8KKyNkZWZpbmUgSVA2VF9PUFRTX0lOVl9NQVNLCTB4MDEJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVA2VF9PUFRTX0gqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X293bmVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfb3duZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkzN2RhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X293bmVyLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfSVA2VF9PV05FUl9ICisjZGVmaW5lIF9JUDZUX09XTkVSX0gKKworLyogbWF0Y2ggYW5kIGludmVydCBmbGFncyAqLworI2RlZmluZSBJUDZUX09XTkVSX1VJRAkweDAxCisjZGVmaW5lIElQNlRfT1dORVJfR0lECTB4MDIKKyNkZWZpbmUgSVA2VF9PV05FUl9QSUQJMHgwNAorI2RlZmluZSBJUDZUX09XTkVSX1NJRAkweDA4CisKK3N0cnVjdCBpcDZ0X293bmVyX2luZm8geworICAgIHVpZF90IHVpZDsKKyAgICBnaWRfdCBnaWQ7CisgICAgcGlkX3QgcGlkOworICAgIHBpZF90IHNpZDsKKyAgICB1X2ludDhfdCBtYXRjaCwgaW52ZXJ0OwkvKiBmbGFncyAqLworfTsKKworI2VuZGlmIC8qX0lQVF9PV05FUl9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9waHlzZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjFjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0lQNlRfUEhZU0RFVl9ICisjZGVmaW5lIF9JUDZUX1BIWVNERVZfSAorCisvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igb2xkIHVzZXJzcGFjZSAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaD4KKworI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSU4JCVhUX1BIWVNERVZfT1BfSU4KKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX09VVAkJWFRfUEhZU0RFVl9PUF9PVVQKKyNkZWZpbmUgSVA2VF9QSFlTREVWX09QX0JSSURHRUQJCVhUX1BIWVNERVZfT1BfQlJJREdFRAorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfSVNJTgkJWFRfUEhZU0RFVl9PUF9JU0lOCisjZGVmaW5lIElQNlRfUEhZU0RFVl9PUF9JU09VVAkJWFRfUEhZU0RFVl9PUF9JU09VVAorI2RlZmluZSBJUDZUX1BIWVNERVZfT1BfTUFTSwkJWFRfUEhZU0RFVl9PUF9NQVNLCisKKyNkZWZpbmUgaXA2dF9waHlzZGV2X2luZm8geHRfcGh5c2Rldl9pbmZvCisKKyNlbmRpZiAvKl9JUDZUX1BIWVNERVZfSCovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcG9saWN5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhYjMxNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9wb2xpY3kuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9JUDZUX1BPTElDWV9ICisjZGVmaW5lIF9JUDZUX1BPTElDWV9ICisKKyNkZWZpbmUgSVA2VF9QT0xJQ1lfTUFYX0VMRU0JCVhUX1BPTElDWV9NQVhfRUxFTQorCisvKiBpcDZ0X3BvbGljeV9mbGFncyAqLworI2RlZmluZSBJUDZUX1BPTElDWV9NQVRDSF9JTgkJWFRfUE9MSUNZX01BVENIX0lOCisjZGVmaW5lIElQNlRfUE9MSUNZX01BVENIX09VVAkJWFRfUE9MSUNZX01BVENIX09VVAorI2RlZmluZSBJUDZUX1BPTElDWV9NQVRDSF9OT05FCQlYVF9QT0xJQ1lfTUFUQ0hfTk9ORQorI2RlZmluZSBJUDZUX1BPTElDWV9NQVRDSF9TVFJJQ1QJWFRfUE9MSUNZX01BVENIX1NUUklDVAorCisvKiBpcDZ0X3BvbGljeV9tb2RlcyAqLworI2RlZmluZSBJUDZUX1BPTElDWV9NT0RFX1RSQU5TUE9SVAlYVF9QT0xJQ1lfTU9ERV9UUkFOU1BPUlQKKyNkZWZpbmUgSVA2VF9QT0xJQ1lfTU9ERV9UVU5ORUwJCVhUX1BPTElDWV9NT0RFX1RVTk5FTAorCisjZGVmaW5lIGlwNnRfcG9saWN5X3NwZWMJCXh0X3BvbGljeV9zcGVjCisjZGVmaW5lIGlwNnRfcG9saWN5X2FkZHIJCXh0X3BvbGljeV9hZGRyCisjZGVmaW5lIGlwNnRfcG9saWN5X2VsZW0JCXh0X3BvbGljeV9lbGVtCisjZGVmaW5lIGlwNnRfcG9saWN5X2luZm8JCXh0X3BvbGljeV9pbmZvCisKKyNlbmRpZiAvKiBfSVA2VF9QT0xJQ1lfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE1NjAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X3J0LmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfSVA2VF9SVF9ICisjZGVmaW5lIF9JUDZUX1JUX0gKKworLyojaW5jbHVkZSA8bGludXgvaW42Lmg+Ki8KKworI2RlZmluZSBJUDZUX1JUX0hPUFMgMTYKKworc3RydWN0IGlwNnRfcnQKK3sKKwl1X2ludDMyX3QgcnRfdHlwZTsJCQkvKiBSb3V0aW5nIFR5cGUgKi8KKwl1X2ludDMyX3Qgc2Vnc2xlZnRbMl07CQkJLyogU2VnbWVudHMgTGVmdCAqLworCXVfaW50MzJfdCBoZHJsZW47CQkJLyogSGVhZGVyIExlbmd0aCAqLworCXVfaW50OF90ICBmbGFnczsJCQkvKiAgKi8KKwl1X2ludDhfdCAgaW52ZmxhZ3M7CQkJLyogSW52ZXJzZSBmbGFncyAqLworCXN0cnVjdCBpbjZfYWRkciBhZGRyc1tJUDZUX1JUX0hPUFNdOwkvKiBIb3BzICovCisJdV9pbnQ4X3QgYWRkcm5yOwkJCS8qIE5yIG9mIEFkZHJlc3NlcyAqLworfTsKKworI2RlZmluZSBJUDZUX1JUX1RZUCAJCTB4MDEKKyNkZWZpbmUgSVA2VF9SVF9TR1MgCQkweDAyCisjZGVmaW5lIElQNlRfUlRfTEVOIAkJMHgwNAorI2RlZmluZSBJUDZUX1JUX1JFUyAJCTB4MDgKKyNkZWZpbmUgSVA2VF9SVF9GU1RfTUFTSwkweDMwCisjZGVmaW5lIElQNlRfUlRfRlNUIAkJMHgxMAorI2RlZmluZSBJUDZUX1JUX0ZTVF9OU1RSSUNUCTB4MjAKKworLyogVmFsdWVzIGZvciAiaW52ZmxhZ3MiIGZpZWxkIGluIHN0cnVjdCBpcDZ0X3J0LiAqLworI2RlZmluZSBJUDZUX1JUX0lOVl9UWVAJCTB4MDEJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiB0eXBlLiAqLworI2RlZmluZSBJUDZUX1JUX0lOVl9TR1MJCTB4MDIJLyogSW52ZXJ0IHRoZSBzZW5zZSBvZiBTZWdtZW50cy4gKi8KKyNkZWZpbmUgSVA2VF9SVF9JTlZfTEVOCQkweDA0CS8qIEludmVydCB0aGUgc2Vuc2Ugb2YgbGVuZ3RoLiAqLworI2RlZmluZSBJUDZUX1JUX0lOVl9NQVNLCTB4MDcJLyogQWxsIHBvc3NpYmxlIGZsYWdzLiAqLworCisjZW5kaWYgLypfSVA2VF9SVF9IKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5M2YwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0bGluay5oCkBAIC0wLDAgKzEsMTUzIEBACisjaWZuZGVmIF9fTElOVVhfTkVUTElOS19ICisjZGVmaW5lIF9fTElOVVhfTkVUTElOS19ICisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4gLyogZm9yIHNhX2ZhbWlseV90ICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBORVRMSU5LX1JPVVRFCQkwCS8qIFJvdXRpbmcvZGV2aWNlIGhvb2sJCQkJKi8KKyNkZWZpbmUgTkVUTElOS19VTlVTRUQJCTEJLyogVW51c2VkIG51bWJlcgkJCQkqLworI2RlZmluZSBORVRMSU5LX1VTRVJTT0NLCTIJLyogUmVzZXJ2ZWQgZm9yIHVzZXIgbW9kZSBzb2NrZXQgcHJvdG9jb2xzIAkqLworI2RlZmluZSBORVRMSU5LX0ZJUkVXQUxMCTMJLyogRmlyZXdhbGxpbmcgaG9vawkJCQkqLworI2RlZmluZSBORVRMSU5LX0lORVRfRElBRwk0CS8qIElORVQgc29ja2V0IG1vbml0b3JpbmcJCQkqLworI2RlZmluZSBORVRMSU5LX05GTE9HCQk1CS8qIG5ldGZpbHRlci9pcHRhYmxlcyBVTE9HICovCisjZGVmaW5lIE5FVExJTktfWEZSTQkJNgkvKiBpcHNlYyAqLworI2RlZmluZSBORVRMSU5LX1NFTElOVVgJCTcJLyogU0VMaW51eCBldmVudCBub3RpZmljYXRpb25zICovCisjZGVmaW5lIE5FVExJTktfSVNDU0kJCTgJLyogT3Blbi1pU0NTSSAqLworI2RlZmluZSBORVRMSU5LX0FVRElUCQk5CS8qIGF1ZGl0aW5nICovCisjZGVmaW5lIE5FVExJTktfRklCX0xPT0tVUAkxMAkKKyNkZWZpbmUgTkVUTElOS19DT05ORUNUT1IJMTEKKyNkZWZpbmUgTkVUTElOS19ORVRGSUxURVIJMTIJLyogbmV0ZmlsdGVyIHN1YnN5c3RlbSAqLworI2RlZmluZSBORVRMSU5LX0lQNl9GVwkJMTMKKyNkZWZpbmUgTkVUTElOS19ETlJUTVNHCQkxNAkvKiBERUNuZXQgcm91dGluZyBtZXNzYWdlcyAqLworI2RlZmluZSBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UCTE1CS8qIEtlcm5lbCBtZXNzYWdlcyB0byB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgTkVUTElOS19HRU5FUklDCQkxNgorLyogbGVhdmUgcm9vbSBmb3IgTkVUTElOS19ETSAoRE0gRXZlbnRzKSAqLworI2RlZmluZSBORVRMSU5LX1NDU0lUUkFOU1BPUlQJMTgJLyogU0NTSSBUcmFuc3BvcnRzICovCisjZGVmaW5lIE5FVExJTktfRUNSWVBURlMJMTkKKworI2RlZmluZSBNQVhfTElOS1MgMzIJCQorCitzdHJ1Y3QgbmV0OworCitzdHJ1Y3Qgc29ja2FkZHJfbmwKK3sKKwlzYV9mYW1pbHlfdAlubF9mYW1pbHk7CS8qIEFGX05FVExJTksJKi8KKwl1bnNpZ25lZCBzaG9ydAlubF9wYWQ7CQkvKiB6ZXJvCQkqLworCV9fdTMyCQlubF9waWQ7CQkvKiBwb3J0IElECSovCisgICAgICAgCV9fdTMyCQlubF9ncm91cHM7CS8qIG11bHRpY2FzdCBncm91cHMgbWFzayAqLworfTsKKworc3RydWN0IG5sbXNnaGRyCit7CisJX191MzIJCW5sbXNnX2xlbjsJLyogTGVuZ3RoIG9mIG1lc3NhZ2UgaW5jbHVkaW5nIGhlYWRlciAqLworCV9fdTE2CQlubG1zZ190eXBlOwkvKiBNZXNzYWdlIGNvbnRlbnQgKi8KKwlfX3UxNgkJbmxtc2dfZmxhZ3M7CS8qIEFkZGl0aW9uYWwgZmxhZ3MgKi8KKwlfX3UzMgkJbmxtc2dfc2VxOwkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwlfX3UzMgkJbmxtc2dfcGlkOwkvKiBTZW5kaW5nIHByb2Nlc3MgcG9ydCBJRCAqLworfTsKKworLyogRmxhZ3MgdmFsdWVzICovCisKKyNkZWZpbmUgTkxNX0ZfUkVRVUVTVAkJMQkvKiBJdCBpcyByZXF1ZXN0IG1lc3NhZ2UuIAkqLworI2RlZmluZSBOTE1fRl9NVUxUSQkJMgkvKiBNdWx0aXBhcnQgbWVzc2FnZSwgdGVybWluYXRlZCBieSBOTE1TR19ET05FICovCisjZGVmaW5lIE5MTV9GX0FDSwkJNAkvKiBSZXBseSB3aXRoIGFjaywgd2l0aCB6ZXJvIG9yIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgTkxNX0ZfRUNITwkJOAkvKiBFY2hvIHRoaXMgcmVxdWVzdCAJCSovCisKKy8qIE1vZGlmaWVycyB0byBHRVQgcmVxdWVzdCAqLworI2RlZmluZSBOTE1fRl9ST09UCTB4MTAwCS8qIHNwZWNpZnkgdHJlZQlyb290CSovCisjZGVmaW5lIE5MTV9GX01BVENICTB4MjAwCS8qIHJldHVybiBhbGwgbWF0Y2hpbmcJKi8KKyNkZWZpbmUgTkxNX0ZfQVRPTUlDCTB4NDAwCS8qIGF0b21pYyBHRVQJCSovCisjZGVmaW5lIE5MTV9GX0RVTVAJKE5MTV9GX1JPT1R8TkxNX0ZfTUFUQ0gpCisKKy8qIE1vZGlmaWVycyB0byBORVcgcmVxdWVzdCAqLworI2RlZmluZSBOTE1fRl9SRVBMQUNFCTB4MTAwCS8qIE92ZXJyaWRlIGV4aXN0aW5nCQkqLworI2RlZmluZSBOTE1fRl9FWENMCTB4MjAwCS8qIERvIG5vdCB0b3VjaCwgaWYgaXQgZXhpc3RzCSovCisjZGVmaW5lIE5MTV9GX0NSRUFURQkweDQwMAkvKiBDcmVhdGUsIGlmIGl0IGRvZXMgbm90IGV4aXN0CSovCisjZGVmaW5lIE5MTV9GX0FQUEVORAkweDgwMAkvKiBBZGQgdG8gZW5kIG9mIGxpc3QJCSovCisKKy8qCisgICA0LjRCU0QgQURECQlOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTAorICAgNC40QlNEIENIQU5HRQlOTE1fRl9SRVBMQUNFCisKKyAgIFRydWUgQ0hBTkdFCQlOTE1fRl9DUkVBVEV8TkxNX0ZfUkVQTEFDRQorICAgQXBwZW5kCQlOTE1fRl9DUkVBVEUKKyAgIENoZWNrCQlOTE1fRl9FWENMCisgKi8KKworI2RlZmluZSBOTE1TR19BTElHTlRPCTQKKyNkZWZpbmUgTkxNU0dfQUxJR04obGVuKSAoICgobGVuKStOTE1TR19BTElHTlRPLTEpICYgfihOTE1TR19BTElHTlRPLTEpICkKKyNkZWZpbmUgTkxNU0dfSERSTEVOCSAoKGludCkgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikpKQorI2RlZmluZSBOTE1TR19MRU5HVEgobGVuKSAoKGxlbikrTkxNU0dfQUxJR04oTkxNU0dfSERSTEVOKSkKKyNkZWZpbmUgTkxNU0dfU1BBQ0UobGVuKSBOTE1TR19BTElHTihOTE1TR19MRU5HVEgobGVuKSkKKyNkZWZpbmUgTkxNU0dfREFUQShubGgpICAoKHZvaWQqKSgoKGNoYXIqKW5saCkgKyBOTE1TR19MRU5HVEgoMCkpKQorI2RlZmluZSBOTE1TR19ORVhUKG5saCxsZW4pCSAoKGxlbikgLT0gTkxNU0dfQUxJR04oKG5saCktPm5sbXNnX2xlbiksIFwKKwkJCQkgIChzdHJ1Y3Qgbmxtc2doZHIqKSgoKGNoYXIqKShubGgpKSArIE5MTVNHX0FMSUdOKChubGgpLT5ubG1zZ19sZW4pKSkKKyNkZWZpbmUgTkxNU0dfT0sobmxoLGxlbikgKChsZW4pID49IChpbnQpc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikgJiYgXAorCQkJICAgKG5saCktPm5sbXNnX2xlbiA+PSBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSAmJiBcCisJCQkgICAobmxoKS0+bmxtc2dfbGVuIDw9IChsZW4pKQorI2RlZmluZSBOTE1TR19QQVlMT0FEKG5saCxsZW4pICgobmxoKS0+bmxtc2dfbGVuIC0gTkxNU0dfU1BBQ0UoKGxlbikpKQorCisjZGVmaW5lIE5MTVNHX05PT1AJCTB4MQkvKiBOb3RoaW5nLgkJKi8KKyNkZWZpbmUgTkxNU0dfRVJST1IJCTB4MgkvKiBFcnJvcgkJKi8KKyNkZWZpbmUgTkxNU0dfRE9ORQkJMHgzCS8qIEVuZCBvZiBhIGR1bXAJKi8KKyNkZWZpbmUgTkxNU0dfT1ZFUlJVTgkJMHg0CS8qIERhdGEgbG9zdAkJKi8KKworI2RlZmluZSBOTE1TR19NSU5fVFlQRQkJMHgxMAkvKiA8IDB4MTA6IHJlc2VydmVkIGNvbnRyb2wgbWVzc2FnZXMgKi8KKworc3RydWN0IG5sbXNnZXJyCit7CisJaW50CQllcnJvcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgbXNnOworfTsKKworI2RlZmluZSBORVRMSU5LX0FERF9NRU1CRVJTSElQCTEKKyNkZWZpbmUgTkVUTElOS19EUk9QX01FTUJFUlNISVAJMgorI2RlZmluZSBORVRMSU5LX1BLVElORk8JCTMKKworc3RydWN0IG5sX3BrdGluZm8KK3sKKwlfX3UzMglncm91cDsKK307CisKKyNkZWZpbmUgTkVUX01BSk9SIDM2CQkvKiBNYWpvciAzNiBpcyByZXNlcnZlZCBmb3IgbmV0d29ya2luZyAJCQkJCQkqLworCitlbnVtIHsKKwlORVRMSU5LX1VOQ09OTkVDVEVEID0gMCwKKwlORVRMSU5LX0NPTk5FQ1RFRCwKK307CisKKy8qCisgKiAgPC0tLS0tLS0gTkxBX0hEUkxFTiAtLS0tLS0+IDwtLSBOTEFfQUxJR04ocGF5bG9hZCktLT4KKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSAtIC0rLSAtIC0gLSAtIC0gLSAtIC0gLSstIC0gLSsKKyAqIHwgICAgICAgIEhlYWRlciAgICAgICB8IFBhZCB8ICAgICBQYXlsb2FkICAgICAgIHwgUGFkIHwKKyAqIHwgICAoc3RydWN0IG5sYXR0cikgICB8IGluZyB8ICAgICAgICAgICAgICAgICAgIHwgaW5nIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSAtIC0rLSAtIC0gLSAtIC0gLSAtIC0gLSstIC0gLSsKKyAqICA8LS0tLS0tLS0tLS0tLS0gbmxhdHRyLT5ubGFfbGVuIC0tLS0tLS0tLS0tLS0tPgorICovCisKK3N0cnVjdCBubGF0dHIKK3sKKwlfX3UxNiAgICAgICAgICAgbmxhX2xlbjsKKwlfX3UxNiAgICAgICAgICAgbmxhX3R5cGU7Cit9OworCisvKgorICogbmxhX3R5cGUgKDE2IGJpdHMpCisgKiArLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBOIHwgTyB8IEF0dHJpYnV0ZSBUeXBlICAgICAgICAgICAgICAgIHwKKyAqICstLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBOIDo9IENhcnJpZXMgbmVzdGVkIGF0dHJpYnV0ZXMKKyAqIE8gOj0gUGF5bG9hZCBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKgorICogTm90ZTogVGhlIE4gYW5kIE8gZmxhZyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICovCisjZGVmaW5lIE5MQV9GX05FU1RFRAkJKDEgPDwgMTUpCisjZGVmaW5lIE5MQV9GX05FVF9CWVRFT1JERVIJKDEgPDwgMTQpCisjZGVmaW5lIE5MQV9UWVBFX01BU0sJCX4oTkxBX0ZfTkVTVEVEIHwgTkxBX0ZfTkVUX0JZVEVPUkRFUikKKworI2RlZmluZSBOTEFfQUxJR05UTwkJNAorI2RlZmluZSBOTEFfQUxJR04obGVuKQkJKCgobGVuKSArIE5MQV9BTElHTlRPIC0gMSkgJiB+KE5MQV9BTElHTlRPIC0gMSkpCisjZGVmaW5lIE5MQV9IRFJMRU4JCSgoaW50KSBOTEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBubGF0dHIpKSkKKworCisjZW5kaWYJLyogX19MSU5VWF9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmV0cm9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzliMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25ldHJvbS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHB1YmxpYyBlbGVtZW50cyBvZiB0aGUgTGludXgga2VybmVsIE5FVC9ST00gaW1wbGVtZW50YXRpb24uCisgKiBGb3Iga2VybmVsIEFYLjI1IHNlZSB0aGUgZmlsZSBheDI1LmguIFRoaXMgZmlsZSByZXF1aXJlcyBheDI1LmggZm9yIHRoZQorICogZGVmaW5pdGlvbiBvZiB0aGUgYXgyNV9hZGRyZXNzIHN0cnVjdHVyZS4KKyAqLworCisjaWZuZGVmCU5FVFJPTV9LRVJORUxfSAorI2RlZmluZQlORVRST01fS0VSTkVMX0gKKworI2RlZmluZSBORVRST01fTVRVCTIzNgorCisjZGVmaW5lIE5FVFJPTV9UMQkxCisjZGVmaW5lIE5FVFJPTV9UMgkyCisjZGVmaW5lIE5FVFJPTV9OMgkzCisjZGVmaW5lCU5FVFJPTV9UNAk2CisjZGVmaW5lCU5FVFJPTV9JRExFCTcKKworI2RlZmluZQlTSU9DTlJERUNPQlMJCShTSU9DUFJPVE9QUklWQVRFKzIpCisKK3N0cnVjdCBucl9yb3V0ZV9zdHJ1Y3QgeworI2RlZmluZQlORVRST01fTkVJR0gJMAorI2RlZmluZQlORVRST01fTk9ERQkxCisJaW50CQl0eXBlOworCWF4MjVfYWRkcmVzcwljYWxsc2lnbjsKKwljaGFyCQlkZXZpY2VbMTZdOworCXVuc2lnbmVkIGludAlxdWFsaXR5OworCWNoYXIJCW1uZW1vbmljWzddOworCWF4MjVfYWRkcmVzcwluZWlnaGJvdXI7CisJdW5zaWduZWQgaW50CW9ic19jb3VudDsKKwl1bnNpZ25lZCBpbnQJbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlkaWdpcGVhdGVyc1tBWDI1X01BWF9ESUdJU107Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmFkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mcy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTkZTIHByb3RvY29sIGRlZmluaXRpb25zCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyBtb3N0bHkgZm9yIFZlcnNpb24gMiBvZiB0aGUgcHJvdG9jb2wsCisgKiBidXQgYWxzbyBoYXMgYSBjb3VwbGUgb2YgTkZTdjMgYml0cyBpbiAobm90YWJseSB0aGUgZXJyb3IgY29kZXMpLgorICovCisjaWZuZGVmIF9MSU5VWF9ORlNfSAorI2RlZmluZSBfTElOVVhfTkZTX0gKKworI2RlZmluZSBORlNfUFJPR1JBTQkxMDAwMDMKKyNkZWZpbmUgTkZTX1BPUlQJMjA0OQorI2RlZmluZSBORlNfTUFYREFUQQk4MTkyCisjZGVmaW5lIE5GU19NQVhQQVRITEVOCTEwMjQKKyNkZWZpbmUgTkZTX01BWE5BTUxFTgkyNTUKKyNkZWZpbmUgTkZTX01BWEdST1VQUwkxNgorI2RlZmluZSBORlNfRkhTSVpFCTMyCisjZGVmaW5lIE5GU19DT09LSUVTSVpFCTQKKyNkZWZpbmUgTkZTX0ZJRk9fREVWCSgtMSkKKyNkZWZpbmUgTkZTTU9ERV9GTVQJMDE3MDAwMAorI2RlZmluZSBORlNNT0RFX0RJUgkwMDQwMDAwCisjZGVmaW5lIE5GU01PREVfQ0hSCTAwMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9CTEsJMDA2MDAwMAorI2RlZmluZSBORlNNT0RFX1JFRwkwMTAwMDAwCisjZGVmaW5lIE5GU01PREVfTE5LCTAxMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9TT0NLCTAxNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9GSUZPCTAwMTAwMDAKKworI2RlZmluZSBORlNfTU5UX1BST0dSQU0JMTAwMDA1CisjZGVmaW5lIE5GU19NTlRfUE9SVAk2MjcKKworLyoKKyAqIE5GUyBzdGF0cy4gVGhlIGdvb2QgdGhpbmcgd2l0aCB0aGVzZSB2YWx1ZXMgaXMgdGhhdCBORlN2MyBlcnJvcnMgYXJlCisgKiBhIHN1cGVyc2V0IG9mIE5GU3YyIGVycm9ycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIE5GU0VSUl9XRkxVU0ggd2hpY2gKKyAqIG5vLW9uZSB1c2VzIGFueXdheSksIHNvIHdlIGNhbiBoYXBwaWx5IG1peCBjb2RlIGFzIGxvbmcgYXMgd2UgbWFrZSBzdXJlCisgKiBubyBORlN2MyBlcnJvcnMgYXJlIHJldHVybmVkIHRvIE5GU3YyIGNsaWVudHMuCisgKiBFcnJvciBjb2RlcyB0aGF0IGhhdmUgYSBgLS0nIGluIHRoZSB2MiBjb2x1bW4gYXJlIG5vdCBwYXJ0IG9mIHRoZQorICogc3RhbmRhcmQsIGJ1dCBzZWVtIHRvIGJlIHdpZGVseSB1c2VkIG5ldmVydGhlbGVzcy4KKyAqLworIGVudW0gbmZzX3N0YXQgeworCU5GU19PSyA9IDAsCQkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfUEVSTSA9IDEsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9OT0VOVCA9IDIsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9JTyA9IDUsCQkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTlhJTyA9IDYsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9FQUdBSU4gPSAxMSwJCS8qIHYyIHYzICovCisJTkZTRVJSX0FDQ0VTID0gMTMsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9FWElTVCA9IDE3LAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfWERFViA9IDE4LAkJLyogICAgdjMgdjQgKi8KKwlORlNFUlJfTk9ERVYgPSAxOSwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX05PVERJUiA9IDIwLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfSVNESVIgPSAyMSwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0lOVkFMID0gMjIsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9GQklHID0gMjcsCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9OT1NQQyA9IDI4LAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfUk9GUyA9IDMwLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTUxJTksgPSAzMSwJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX09QTk9UU1VQUCA9IDQ1LAkJLyogdjIgdjMgKi8KKwlORlNFUlJfTkFNRVRPT0xPTkcgPSA2MywJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfTk9URU1QVFkgPSA2NiwJCS8qIHYyIHYzIHY0ICovCisJTkZTRVJSX0RRVU9UID0gNjksCQkvKiB2MiB2MyB2NCAqLworCU5GU0VSUl9TVEFMRSA9IDcwLAkJLyogdjIgdjMgdjQgKi8KKwlORlNFUlJfUkVNT1RFID0gNzEsCQkvKiB2MiB2MyAqLworCU5GU0VSUl9XRkxVU0ggPSA5OSwJCS8qIHYyICAgICovCisJTkZTRVJSX0JBREhBTkRMRSA9IDEwMDAxLAkvKiAgICB2MyB2NCAqLworCU5GU0VSUl9OT1RfU1lOQyA9IDEwMDAyLAkvKiAgICB2MyAqLworCU5GU0VSUl9CQURfQ09PS0lFID0gMTAwMDMsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX05PVFNVUFAgPSAxMDAwNCwJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX1RPT1NNQUxMID0gMTAwMDUsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX1NFUlZFUkZBVUxUID0gMTAwMDYsCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX0JBRFRZUEUgPSAxMDAwNywJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX0pVS0VCT1ggPSAxMDAwOCwJCS8qICAgIHYzIHY0ICovCisJTkZTRVJSX1NBTUUgPSAxMDAwOSwJCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0RFTklFRCA9IDEwMDEwLAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfRVhQSVJFRCA9IDEwMDExLAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTE9DS0VEID0gMTAwMTIsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9HUkFDRSA9IDEwMDEzLAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfRkhFWFBJUkVEID0gMTAwMTQsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1NIQVJFX0RFTklFRCA9IDEwMDE1LAkvKiAgICAgICB2NCAqLworCU5GU0VSUl9XUk9OR1NFQyA9IDEwMDE2LAkvKiAgICAgICB2NCAqLworCU5GU0VSUl9DTElEX0lOVVNFID0gMTAwMTcsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFU09VUkNFID0gMTAwMTgsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX01PVkVEID0gMTAwMTksCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9OT0ZJTEVIQU5ETEUgPSAxMDAyMCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfTUlOT1JfVkVSU19NSVNNQVRDSCA9IDEwMDIxLCAgIC8qIHY0ICovCisJTkZTRVJSX1NUQUxFX0NMSUVOVElEID0gMTAwMjIsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1NUQUxFX1NUQVRFSUQgPSAxMDAyMywgICAvKiAgICAgICB2NCAqLworCU5GU0VSUl9PTERfU1RBVEVJRCA9IDEwMDI0LCAgICAgLyogICAgICAgdjQgKi8KKwlORlNFUlJfQkFEX1NUQVRFSUQgPSAxMDAyNSwgICAgIC8qICAgICAgIHY0ICovICAKKwlORlNFUlJfQkFEX1NFUUlEID0gMTAwMjYsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX05PVF9TQU1FID0gMTAwMjcsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0xPQ0tfUkFOR0UgPSAxMDAyOCwJLyogICAgICAgdjQgKi8KKwlORlNFUlJfU1lNTElOSyA9IDEwMDI5LAkJLyogICAgICAgdjQgKi8KKwlORlNFUlJfUkVTVE9SRUZIID0gMTAwMzAsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0xFQVNFX01PVkVEID0gMTAwMzEsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX0FUVFJOT1RTVVBQID0gMTAwMzIsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX05PX0dSQUNFID0gMTAwMzMsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFQ0xBSU1fQkFEID0gMTAwMzQsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFQ0xBSU1fQ09ORkxJQ1QgPSAxMDAzNSwvKiAgICAgICB2NCAqLworCU5GU0VSUl9CQURfWERSID0gMTAwMzYsCQkvKiAgICAgICB2NCAqLworCU5GU0VSUl9MT0NLU19IRUxEID0gMTAwMzcsCS8qICAgICAgIHY0ICovCisJTkZTRVJSX09QRU5NT0RFID0gMTAwMzgsICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRE9XTkVSID0gMTAwMzksICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRENIQVIgPSAxMDA0MCwgICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRE5BTUUgPSAxMDA0MSwgICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0JBRF9SQU5HRSA9IDEwMDQyLCAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0xPQ0tfTk9UU1VQUCA9IDEwMDQzLCAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX09QX0lMTEVHQUwgPSAxMDA0NCwgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0RFQURMT0NLID0gMTAwNDUsICAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0ZJTEVfT1BFTiA9IDEwMDQ2LCAgICAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0FETUlOX1JFVk9LRUQgPSAxMDA0NywgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX0NCX1BBVEhfRE9XTiA9IDEwMDQ4LCAgIC8qICAgICAgIHY0ICovCisJTkZTRVJSX1JFUExBWV9NRSA9IDEwMDQ5CS8qICAgICAgIHY0ICovCit9OworCisvKiBORlN2MiBmaWxlIHR5cGVzIC0gYmV3YXJlLCB0aGVzZSBhcmUgbm90IHRoZSBzYW1lIGluIE5GU3YzICovCisKK2VudW0gbmZzX2Z0eXBlIHsKKwlORk5PTiA9IDAsCisJTkZSRUcgPSAxLAorCU5GRElSID0gMiwKKwlORkJMSyA9IDMsCisJTkZDSFIgPSA0LAorCU5GTE5LID0gNSwKKwlORlNPQ0sgPSA2LAorCU5GQkFEID0gNywKKwlORkZJRk8gPSA4Cit9OworCisjZW5kaWYgLyogX0xJTlVYX05GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDk1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczIuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogTkZTIHByb3RvY29sIGRlZmluaXRpb25zCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyBmb3IgVmVyc2lvbiAyIG9mIHRoZSBwcm90b2NvbC4KKyAqLworI2lmbmRlZiBfTElOVVhfTkZTMl9ICisjZGVmaW5lIF9MSU5VWF9ORlMyX0gKKworI2RlZmluZSBORlMyX1BPUlQJMjA0OQorI2RlZmluZSBORlMyX01BWERBVEEJODE5MgorI2RlZmluZSBORlMyX01BWFBBVEhMRU4JMTAyNAorI2RlZmluZSBORlMyX01BWE5BTUxFTgkyNTUKKyNkZWZpbmUgTkZTMl9NQVhHUk9VUFMJMTYKKyNkZWZpbmUgTkZTMl9GSFNJWkUJMzIKKyNkZWZpbmUgTkZTMl9DT09LSUVTSVpFCTQKKyNkZWZpbmUgTkZTMl9GSUZPX0RFVgkoLTEpCisjZGVmaW5lIE5GUzJNT0RFX0ZNVAkwMTcwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0RJUgkwMDQwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0NIUgkwMDIwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0JMSwkwMDYwMDAwCisjZGVmaW5lIE5GUzJNT0RFX1JFRwkwMTAwMDAwCisjZGVmaW5lIE5GUzJNT0RFX0xOSwkwMTIwMDAwCisjZGVmaW5lIE5GUzJNT0RFX1NPQ0sJMDE0MDAwMAorI2RlZmluZSBORlMyTU9ERV9GSUZPCTAwMTAwMDAKKworCisvKiBORlN2MiBmaWxlIHR5cGVzIC0gYmV3YXJlLCB0aGVzZSBhcmUgbm90IHRoZSBzYW1lIGluIE5GU3YzICovCitlbnVtIG5mczJfZnR5cGUgeworCU5GMk5PTiA9IDAsCisJTkYyUkVHID0gMSwKKwlORjJESVIgPSAyLAorCU5GMkJMSyA9IDMsCisJTkYyQ0hSID0gNCwKKwlORjJMTksgPSA1LAorCU5GMlNPQ0sgPSA2LAorCU5GMkJBRCA9IDcsCisJTkYyRklGTyA9IDgKK307CisKK3N0cnVjdCBuZnMyX2ZoIHsKKwljaGFyCQkJZGF0YVtORlMyX0ZIU0laRV07Cit9OworCisvKgorICogUHJvY2VkdXJlIG51bWJlcnMgZm9yIE5GU3YyCisgKi8KKyNkZWZpbmUgTkZTMl9WRVJTSU9OCQkyCisjZGVmaW5lIE5GU1BST0NfTlVMTAkJMAorI2RlZmluZSBORlNQUk9DX0dFVEFUVFIJCTEKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSCQkyCisjZGVmaW5lIE5GU1BST0NfUk9PVAkJMworI2RlZmluZSBORlNQUk9DX0xPT0tVUAkJNAorI2RlZmluZSBORlNQUk9DX1JFQURMSU5LCTUKKyNkZWZpbmUgTkZTUFJPQ19SRUFECQk2CisjZGVmaW5lIE5GU1BST0NfV1JJVEVDQUNIRQk3CisjZGVmaW5lIE5GU1BST0NfV1JJVEUJCTgKKyNkZWZpbmUgTkZTUFJPQ19DUkVBVEUJCTkKKyNkZWZpbmUgTkZTUFJPQ19SRU1PVkUJCTEwCisjZGVmaW5lIE5GU1BST0NfUkVOQU1FCQkxMQorI2RlZmluZSBORlNQUk9DX0xJTksJCTEyCisjZGVmaW5lIE5GU1BST0NfU1lNTElOSwkJMTMKKyNkZWZpbmUgTkZTUFJPQ19NS0RJUgkJMTQKKyNkZWZpbmUgTkZTUFJPQ19STURJUgkJMTUKKyNkZWZpbmUgTkZTUFJPQ19SRUFERElSCQkxNgorI2RlZmluZSBORlNQUk9DX1NUQVRGUwkJMTcKKworI2RlZmluZSBORlNfTU5UX1BST0dSQU0JCTEwMDAwNQorI2RlZmluZSBORlNfTU5UX1ZFUlNJT04JCTEKKyNkZWZpbmUgTU5UUFJPQ19OVUxMCQkwCisjZGVmaW5lIE1OVFBST0NfTU5UCQkxCisjZGVmaW5lIE1OVFBST0NfVU1OVAkJMworI2RlZmluZSBNTlRQUk9DX1VNTlRBTEwJCTQKKworI2VuZGlmIC8qIF9MSU5VWF9ORlMyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnMzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxMWZhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzMy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTkZTdjMgcHJvdG9jb2wgZGVmaW5pdGlvbnMKKyAqLworI2lmbmRlZiBfTElOVVhfTkZTM19ICisjZGVmaW5lIF9MSU5VWF9ORlMzX0gKKworI2RlZmluZSBORlMzX1BPUlQJCTIwNDkKKyNkZWZpbmUgTkZTM19NQVhEQVRBCQkzMjc2OAorI2RlZmluZSBORlMzX01BWFBBVEhMRU4JCVBBVEhfTUFYCisjZGVmaW5lIE5GUzNfTUFYTkFNTEVOCQlOQU1FX01BWAorI2RlZmluZSBORlMzX01BWEdST1VQUwkJMTYKKyNkZWZpbmUgTkZTM19GSFNJWkUJCTY0CisjZGVmaW5lIE5GUzNfQ09PS0lFU0laRQkJNAorI2RlZmluZSBORlMzX0ZJRk9fREVWCQkoLTEpCisjZGVmaW5lIE5GUzNNT0RFX0ZNVAkJMDE3MDAwMAorI2RlZmluZSBORlMzTU9ERV9ESVIJCTAwNDAwMDAKKyNkZWZpbmUgTkZTM01PREVfQ0hSCQkwMDIwMDAwCisjZGVmaW5lIE5GUzNNT0RFX0JMSwkJMDA2MDAwMAorI2RlZmluZSBORlMzTU9ERV9SRUcJCTAxMDAwMDAKKyNkZWZpbmUgTkZTM01PREVfTE5LCQkwMTIwMDAwCisjZGVmaW5lIE5GUzNNT0RFX1NPQ0sJCTAxNDAwMDAKKyNkZWZpbmUgTkZTM01PREVfRklGTwkJMDAxMDAwMAorCisvKiBGbGFncyBmb3IgYWNjZXNzKCkgY2FsbCAqLworI2RlZmluZSBORlMzX0FDQ0VTU19SRUFECTB4MDAwMQorI2RlZmluZSBORlMzX0FDQ0VTU19MT09LVVAJMHgwMDAyCisjZGVmaW5lIE5GUzNfQUNDRVNTX01PRElGWQkweDAwMDQKKyNkZWZpbmUgTkZTM19BQ0NFU1NfRVhURU5ECTB4MDAwOAorI2RlZmluZSBORlMzX0FDQ0VTU19ERUxFVEUJMHgwMDEwCisjZGVmaW5lIE5GUzNfQUNDRVNTX0VYRUNVVEUJMHgwMDIwCisjZGVmaW5lIE5GUzNfQUNDRVNTX0ZVTEwJMHgwMDNmCisKKy8qIEZsYWdzIGZvciBjcmVhdGUgbW9kZSAqLworZW51bSBuZnMzX2NyZWF0ZW1vZGUgeworCU5GUzNfQ1JFQVRFX1VOQ0hFQ0tFRCA9IDAsCisJTkZTM19DUkVBVEVfR1VBUkRFRCA9IDEsCisJTkZTM19DUkVBVEVfRVhDTFVTSVZFID0gMgorfTsKKworLyogTkZTdjMgZmlsZSBzeXN0ZW0gcHJvcGVydGllcyAqLworI2RlZmluZSBORlMzX0ZTRl9MSU5LCQkweDAwMDEKKyNkZWZpbmUgTkZTM19GU0ZfU1lNTElOSwkweDAwMDIKKyNkZWZpbmUgTkZTM19GU0ZfSE9NT0dFTkVPVVMJMHgwMDA4CisjZGVmaW5lIE5GUzNfRlNGX0NBTlNFVFRJTUUJMHgwMDEwCisvKiBTb21lIHNob3J0aGFuZHMuIFNlZSBmcy9uZnNkL25mczNwcm9jLmMgKi8KKyNkZWZpbmUgTkZTM19GU0ZfREVGQVVMVAkweDAwMUIKKyNkZWZpbmUgTkZTM19GU0ZfQklMTFlCT1kJMHgwMDE4CisjZGVmaW5lIE5GUzNfRlNGX1JFQURPTkxZCTB4MDAwOAorCitlbnVtIG5mczNfZnR5cGUgeworCU5GM05PTiAgPSAwLAorCU5GM1JFRyAgPSAxLAorCU5GM0RJUiAgPSAyLAorCU5GM0JMSyAgPSAzLAorCU5GM0NIUiAgPSA0LAorCU5GM0xOSyAgPSA1LAorCU5GM1NPQ0sgPSA2LAorCU5GM0ZJRk8gPSA3LAkvKiBjaGFuZ2VkIGZyb20gTkZTdjIgKHdhcyA4KSAqLworCU5GM0JBRCAgPSA4Cit9OworCitzdHJ1Y3QgbmZzM19maCB7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICBkYXRhW05GUzNfRkhTSVpFXTsKK307CisKKyNkZWZpbmUgTkZTM19WRVJTSU9OCQkzCisjZGVmaW5lIE5GUzNQUk9DX05VTEwJCTAKKyNkZWZpbmUgTkZTM1BST0NfR0VUQVRUUgkxCisjZGVmaW5lIE5GUzNQUk9DX1NFVEFUVFIJMgorI2RlZmluZSBORlMzUFJPQ19MT09LVVAJCTMKKyNkZWZpbmUgTkZTM1BST0NfQUNDRVNTCQk0CisjZGVmaW5lIE5GUzNQUk9DX1JFQURMSU5LCTUKKyNkZWZpbmUgTkZTM1BST0NfUkVBRAkJNgorI2RlZmluZSBORlMzUFJPQ19XUklURQkJNworI2RlZmluZSBORlMzUFJPQ19DUkVBVEUJCTgKKyNkZWZpbmUgTkZTM1BST0NfTUtESVIJCTkKKyNkZWZpbmUgTkZTM1BST0NfU1lNTElOSwkxMAorI2RlZmluZSBORlMzUFJPQ19NS05PRAkJMTEKKyNkZWZpbmUgTkZTM1BST0NfUkVNT1ZFCQkxMgorI2RlZmluZSBORlMzUFJPQ19STURJUgkJMTMKKyNkZWZpbmUgTkZTM1BST0NfUkVOQU1FCQkxNAorI2RlZmluZSBORlMzUFJPQ19MSU5LCQkxNQorI2RlZmluZSBORlMzUFJPQ19SRUFERElSCTE2CisjZGVmaW5lIE5GUzNQUk9DX1JFQURESVJQTFVTCTE3CisjZGVmaW5lIE5GUzNQUk9DX0ZTU1RBVAkJMTgKKyNkZWZpbmUgTkZTM1BST0NfRlNJTkZPCQkxOQorI2RlZmluZSBORlMzUFJPQ19QQVRIQ09ORgkyMAorI2RlZmluZSBORlMzUFJPQ19DT01NSVQJCTIxCisKKyNkZWZpbmUgTkZTX01OVDNfUFJPR1JBTQkxMDAwMDUKKyNkZWZpbmUgTkZTX01OVDNfVkVSU0lPTgkzCisjZGVmaW5lIE1PVU5UUFJPQzNfTlVMTAkJMAorI2RlZmluZSBNT1VOVFBST0MzX01OVAkJMQorI2RlZmluZSBNT1VOVFBST0MzX1VNTlQJCTMKKyNkZWZpbmUgTU9VTlRQUk9DM19VTU5UQUxMCTQKKyAKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChORlNfTkVFRF9LRVJORUxfVFlQRVMpCisKKy8qIE51bWJlciBvZiAzMmJpdCB3b3JkcyBpbiBwb3N0X29wX2F0dHIgKi8KKyNkZWZpbmUgTkZTM19QT1NUX09QX0FUVFJfV09SRFMJCTIyCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0xJTlVYX05GUzNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTA5NWRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAgaW5jbHVkZS9saW51eC9uZnM0LmgKKyAqCisgKiAgTkZTdjQgcHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKi8KKworI2lmbmRlZiBfTElOVVhfTkZTNF9ICisjZGVmaW5lIF9MSU5VWF9ORlM0X0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTkZTNF9CSVRNQVBfU0laRQkyCisjZGVmaW5lIE5GUzRfVkVSSUZJRVJfU0laRQk4CisjZGVmaW5lIE5GUzRfU1RBVEVJRF9TSVpFCTE2CisjZGVmaW5lIE5GUzRfRkhTSVpFCQkxMjgKKyNkZWZpbmUgTkZTNF9NQVhQQVRITEVOCQlQQVRIX01BWAorI2RlZmluZSBORlM0X01BWE5BTUxFTgkJTkFNRV9NQVgKKworI2RlZmluZSBORlM0X0FDQ0VTU19SRUFEICAgICAgICAweDAwMDEKKyNkZWZpbmUgTkZTNF9BQ0NFU1NfTE9PS1VQICAgICAgMHgwMDAyCisjZGVmaW5lIE5GUzRfQUNDRVNTX01PRElGWSAgICAgIDB4MDAwNAorI2RlZmluZSBORlM0X0FDQ0VTU19FWFRFTkQgICAgICAweDAwMDgKKyNkZWZpbmUgTkZTNF9BQ0NFU1NfREVMRVRFICAgICAgMHgwMDEwCisjZGVmaW5lIE5GUzRfQUNDRVNTX0VYRUNVVEUgICAgIDB4MDAyMAorCisjZGVmaW5lIE5GUzRfRkhfUEVSU0lTVEVOVAkJMHgwMDAwCisjZGVmaW5lIE5GUzRfRkhfTk9FWFBJUkVfV0lUSF9PUEVOCTB4MDAwMQorI2RlZmluZSBORlM0X0ZIX1ZPTEFUSUxFX0FOWQkJMHgwMDAyCisjZGVmaW5lIE5GUzRfRkhfVk9MX01JR1JBVElPTgkJMHgwMDA0CisjZGVmaW5lIE5GUzRfRkhfVk9MX1JFTkFNRQkJMHgwMDA4CisKKyNkZWZpbmUgTkZTNF9PUEVOX1JFU1VMVF9DT05GSVJNIDB4MDAwMgorI2RlZmluZSBORlM0X09QRU5fUkVTVUxUX0xPQ0tUWVBFX1BPU0lYIDB4MDAwNAorCisjZGVmaW5lIE5GUzRfU0hBUkVfQUNDRVNTX1JFQUQJMHgwMDAxCisjZGVmaW5lIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFCTB4MDAwMgorI2RlZmluZSBORlM0X1NIQVJFX0FDQ0VTU19CT1RICTB4MDAwMworI2RlZmluZSBORlM0X1NIQVJFX0RFTllfUkVBRAkweDAwMDEKKyNkZWZpbmUgTkZTNF9TSEFSRV9ERU5ZX1dSSVRFCTB4MDAwMgorI2RlZmluZSBORlM0X1NIQVJFX0RFTllfQk9USAkweDAwMDMKKworI2RlZmluZSBORlM0X1NFVF9UT19TRVJWRVJfVElNRQkwCisjZGVmaW5lIE5GUzRfU0VUX1RPX0NMSUVOVF9USU1FCTEKKworI2RlZmluZSBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSAwCisjZGVmaW5lIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUgIDEKKyNkZWZpbmUgTkZTNF9BQ0VfU1lTVEVNX0FVRElUX0FDRV9UWVBFICAgMgorI2RlZmluZSBORlM0X0FDRV9TWVNURU1fQUxBUk1fQUNFX1RZUEUgICAzCisKKyNkZWZpbmUgQUNMNF9TVVBQT1JUX0FMTE9XX0FDTCAweDAxCisjZGVmaW5lIEFDTDRfU1VQUE9SVF9ERU5ZX0FDTCAgMHgwMgorI2RlZmluZSBBQ0w0X1NVUFBPUlRfQVVESVRfQUNMIDB4MDQKKyNkZWZpbmUgQUNMNF9TVVBQT1JUX0FMQVJNX0FDTCAweDA4CisKKyNkZWZpbmUgTkZTNF9BQ0VfRklMRV9JTkhFUklUX0FDRSAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5GUzRfQUNFX0RJUkVDVE9SWV9JTkhFUklUX0FDRSAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBORlM0X0FDRV9OT19QUk9QQUdBVEVfSU5IRVJJVF9BQ0UgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRSAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE5GUzRfQUNFX1NVQ0NFU1NGVUxfQUNDRVNTX0FDRV9GTEFHICAgMHgwMDAwMDAxMAorI2RlZmluZSBORlM0X0FDRV9GQUlMRURfQUNDRVNTX0FDRV9GTEFHICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5GUzRfQUNFX09XTkVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBORlM0X0FDRV9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTkZTNF9BQ0VfRVZFUllPTkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisKKyNkZWZpbmUgTkZTNF9BQ0VfUkVBRF9EQVRBICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5GUzRfQUNFX0xJU1RfRElSRUNUT1JZICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBORlM0X0FDRV9XUklURV9EQVRBICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgTkZTNF9BQ0VfQUREX0ZJTEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5GUzRfQUNFX0FQUEVORF9EQVRBICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBORlM0X0FDRV9BRERfU1VCRElSRUNUT1JZICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTkZTNF9BQ0VfUkVBRF9OQU1FRF9BVFRSUyAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIE5GUzRfQUNFX1dSSVRFX05BTUVEX0FUVFJTICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBORlM0X0FDRV9FWEVDVVRFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgTkZTNF9BQ0VfREVMRVRFX0NISUxEICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5GUzRfQUNFX1JFQURfQVRUUklCVVRFUyAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBORlM0X0FDRV9XUklURV9BVFRSSUJVVEVTICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTkZTNF9BQ0VfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE5GUzRfQUNFX1JFQURfQUNMICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBORlM0X0FDRV9XUklURV9BQ0wgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgTkZTNF9BQ0VfV1JJVEVfT1dORVIgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIE5GUzRfQUNFX1NZTkNIUk9OSVpFICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBORlM0X0FDRV9HRU5FUklDX1JFQUQgICAgICAgICAgICAgICAgIDB4MDAxMjAwODEKKyNkZWZpbmUgTkZTNF9BQ0VfR0VORVJJQ19XUklURSAgICAgICAgICAgICAgICAweDAwMTYwMTA2CisjZGVmaW5lIE5GUzRfQUNFX0dFTkVSSUNfRVhFQ1VURSAgICAgICAgICAgICAgMHgwMDEyMDBBMAorI2RlZmluZSBORlM0X0FDRV9NQVNLX0FMTCAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAxRkYKKworZW51bSBuZnM0X2FjbF93aG90eXBlIHsKKwlORlM0X0FDTF9XSE9fTkFNRUQgPSAwLAorCU5GUzRfQUNMX1dIT19PV05FUiwKKwlORlM0X0FDTF9XSE9fR1JPVVAsCisJTkZTNF9BQ0xfV0hPX0VWRVJZT05FLAorfTsKKworI2VuZGlmCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0X21vdW50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZmMzJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnM0X21vdW50LmgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBfTElOVVhfTkZTNF9NT1VOVF9ICisjZGVmaW5lIF9MSU5VWF9ORlM0X01PVU5UX0gKKworLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIFRyb25kIE15a2xlYnVzdAorICoKKyAqICBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gdXNlci1zcGFjZSB0byBrZXJuZWwtc3BhY2UgZHVyaW5nIGFuIG5mc3Y0IG1vdW50CisgKi8KKworLyoKKyAqIFdBUk5JTkchICBEbyBub3QgZGVsZXRlIG9yIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UgZmllbGRzLiAgSWYKKyAqIGEgbmV3IGZpZWxkIGlzIHJlcXVpcmVkIHRoZW4gYWRkIGl0IHRvIHRoZSBlbmQuICBUaGUgdmVyc2lvbiBmaWVsZAorICogdHJhY2tzIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudC4gIFRoaXMgd2lsbCBlbnN1cmUgc29tZSBtZWFzdXJlIG9mCisgKiBtb3VudC10by1rZXJuZWwgdmVyc2lvbiBjb21wYXRpYmlsaXR5LiAgU29tZSBvZiB0aGVzZSBhcmVuJ3QgdXNlZCB5ZXQKKyAqIGJ1dCBoZXJlIHRoZXkgYXJlIGFueXdheS4KKyAqLworI2RlZmluZSBORlM0X01PVU5UX1ZFUlNJT04JMQorCitzdHJ1Y3QgbmZzX3N0cmluZyB7CisJdW5zaWduZWQgaW50IGxlbjsKKwljb25zdCBjaGFyICogZGF0YTsKK307CisKK3N0cnVjdCBuZnM0X21vdW50X2RhdGEgeworCWludCB2ZXJzaW9uOwkJCQkvKiAxICovCisJaW50IGZsYWdzOwkJCQkvKiAxICovCisJaW50IHJzaXplOwkJCQkvKiAxICovCisJaW50IHdzaXplOwkJCQkvKiAxICovCisJaW50IHRpbWVvOwkJCQkvKiAxICovCisJaW50IHJldHJhbnM7CQkJCS8qIDEgKi8KKwlpbnQgYWNyZWdtaW47CQkJCS8qIDEgKi8KKwlpbnQgYWNyZWdtYXg7CQkJCS8qIDEgKi8KKwlpbnQgYWNkaXJtaW47CQkJCS8qIDEgKi8KKwlpbnQgYWNkaXJtYXg7CQkJCS8qIDEgKi8KKworCS8qIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiAnc3RydWN0IGNsaWVudGFkZHI0JyBpbiBSRkMzMDEwICovCisJc3RydWN0IG5mc19zdHJpbmcgY2xpZW50X2FkZHI7CQkvKiAxICovCisKKwkvKiBNb3VudCBwYXRoICovCisJc3RydWN0IG5mc19zdHJpbmcgbW50X3BhdGg7CQkvKiAxICovCisKKwkvKiBTZXJ2ZXIgZGV0YWlscyAqLworCXN0cnVjdCBuZnNfc3RyaW5nIGhvc3RuYW1lOwkJLyogMSAqLworCS8qIFNlcnZlciBJUCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGhvc3RfYWRkcmxlbjsJCS8qIDEgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKiBob3N0X2FkZHI7CS8qIDEgKi8KKworCS8qIFRyYW5zcG9ydCBwcm90b2NvbCB0byB1c2UgKi8KKwlpbnQgcHJvdG87CQkJCS8qIDEgKi8KKworCS8qIFBzZXVkby1mbGF2b3VycyB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLiBTZWUgUkZDMjYyMyAqLworCWludCBhdXRoX2ZsYXZvdXJsZW47CQkJLyogMSAqLworCWludCAqYXV0aF9mbGF2b3VyczsJCS8qIDEgKi8KK307CisKKy8qIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkICovCisvKiBOb3RlOiB0aGUgZmllbGRzIHRoYXQgY29ycmVzcG9uZCB0byBleGlzdGluZyBORlN2Mi92MyBtb3VudCBvcHRpb25zCisgKiAJIHNob3VsZCBtaXJyb3IgdGhlIHZhbHVlcyBmcm9tIGluY2x1ZGUvbGludXgvbmZzX21vdW50LmgKKyAqLworCisjZGVmaW5lIE5GUzRfTU9VTlRfU09GVAkJMHgwMDAxCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9JTlRSCQkweDAwMDIJLyogMSAqLworI2RlZmluZSBORlM0X01PVU5UX05PQ1RPCTB4MDAxMAkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfTk9BQwkJMHgwMDIwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9TVFJJQ1RMT0NLCTB4MTAwMAkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfVU5TSEFSRUQJMHg4MDAwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9GTEFHTUFTSwkweDkwMzMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDA2MjBhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgT1Mtc3BlY2lmaWMgbmZzIGZpbGVzeXN0ZW0gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucworICovCisKKyNpZm5kZWYgX0xJTlVYX05GU19GU19ICisjZGVmaW5lIF9MSU5VWF9ORlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworLyogRGVmYXVsdCB0aW1lb3V0IHZhbHVlcyAqLworI2RlZmluZSBORlNfTUFYX1VEUF9USU1FT1VUCSg2MCpIWikKKyNkZWZpbmUgTkZTX01BWF9UQ1BfVElNRU9VVAkoNjAwKkhaKQorCisvKgorICogV2hlbiBmbHVzaGluZyBhIGNsdXN0ZXIgb2YgZGlydHkgcGFnZXMsIHRoZXJlIGNhbiBiZSBkaWZmZXJlbnQKKyAqIHN0cmF0ZWdpZXM6CisgKi8KKyNkZWZpbmUgRkxVU0hfU1lOQwkJMQkvKiBmaWxlIGJlaW5nIHN5bmNlZCwgb3IgY29udGVudGlvbiAqLworI2RlZmluZSBGTFVTSF9TVEFCTEUJCTQJLyogY29tbWl0IHRvIHN0YWJsZSBzdG9yYWdlICovCisjZGVmaW5lIEZMVVNIX0xPV1BSSQkJOAkvKiBsb3cgcHJpb3JpdHkgYmFja2dyb3VuZCBmbHVzaCAqLworI2RlZmluZSBGTFVTSF9ISUdIUFJJCQkxNgkvKiBoaWdoIHByaW9yaXR5IG1lbW9yeSByZWNsYWltIGZsdXNoICovCisjZGVmaW5lIEZMVVNIX05PQ09NTUlUCQkzMgkvKiBEb24ndCBzZW5kIHRoZSBORlN2My92NCBDT01NSVQgKi8KKyNkZWZpbmUgRkxVU0hfSU5WQUxJREFURQk2NAkvKiBJbnZhbGlkYXRlIHRoZSBwYWdlIGNhY2hlICovCisjZGVmaW5lIEZMVVNIX05PV1JJVEVQQUdFCTEyOAkvKiBEb24ndCBjYWxsIHdyaXRlcGFnZSgpICovCisKKworLyoKKyAqIE5GUyBkZWJ1ZyBmbGFncworICovCisjZGVmaW5lIE5GU0RCR19WRlMJCTB4MDAwMQorI2RlZmluZSBORlNEQkdfRElSQ0FDSEUJCTB4MDAwMgorI2RlZmluZSBORlNEQkdfTE9PS1VQQ0FDSEUJMHgwMDA0CisjZGVmaW5lIE5GU0RCR19QQUdFQ0FDSEUJMHgwMDA4CisjZGVmaW5lIE5GU0RCR19QUk9DCQkweDAwMTAKKyNkZWZpbmUgTkZTREJHX1hEUgkJMHgwMDIwCisjZGVmaW5lIE5GU0RCR19GSUxFCQkweDAwNDAKKyNkZWZpbmUgTkZTREJHX1JPT1QJCTB4MDA4MAorI2RlZmluZSBORlNEQkdfQ0FMTEJBQ0sJCTB4MDEwMAorI2RlZmluZSBORlNEQkdfQ0xJRU5UCQkweDAyMDAKKyNkZWZpbmUgTkZTREJHX01PVU5UCQkweDA0MDAKKyNkZWZpbmUgTkZTREJHX0FMTAkJMHhGRkZGCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc19pZG1hcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWIxZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaAorICoKKyAqICBVSUQgYW5kIEdJRCB0byBuYW1lIG1hcHBpbmcgZm9yIGNsaWVudHMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBORlNfSURNQVBfSAorI2RlZmluZSBORlNfSURNQVBfSAorCisvKiBYWFggZnJvbSBiaXRzL3V0bXAuaCAgKi8KKyNkZWZpbmUgSURNQVBfTkFNRVNaICAxMjgKKworI2RlZmluZSBJRE1BUF9UWVBFX1VTRVIgIDAKKyNkZWZpbmUgSURNQVBfVFlQRV9HUk9VUCAxCisKKyNkZWZpbmUgSURNQVBfQ09OVl9JRFRPTkFNRSAwCisjZGVmaW5lIElETUFQX0NPTlZfTkFNRVRPSUQgMQorCisjZGVmaW5lIElETUFQX1NUQVRVU19JTlZBTElETVNHIDB4MDEKKyNkZWZpbmUgSURNQVBfU1RBVFVTX0FHQUlOICAgICAgMHgwMgorI2RlZmluZSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTCAweDA0CisjZGVmaW5lIElETUFQX1NUQVRVU19TVUNDRVNTICAgIDB4MDgKKworc3RydWN0IGlkbWFwX21zZyB7CisJX191OCAgaW1fdHlwZTsKKwlfX3U4ICBpbV9jb252OworCWNoYXIgIGltX25hbWVbSURNQVBfTkFNRVNaXTsKKwlfX3UzMiBpbV9pZDsKKwlfX3U4ICBpbV9zdGF0dXM7Cit9OworCisKKyNlbmRpZiAvKiBORlNfSURNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhZGU4OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzX21vdW50LmgKQEAgLTAsMCArMSw2OCBAQAorI2lmbmRlZiBfTElOVVhfTkZTX01PVU5UX0gKKyNkZWZpbmUgX0xJTlVYX05GU19NT1VOVF9ICisKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC9uZnNfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJpY2sgU2xhZGtleQorICoKKyAqICBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gdXNlci1zcGFjZSB0byBrZXJuZWwtc3BhY2UgZHVyaW5nIGFuIG5mcyBtb3VudAorICovCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorCisvKgorICogV0FSTklORyEgIERvIG5vdCBkZWxldGUgb3IgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGVzZSBmaWVsZHMuICBJZgorICogYSBuZXcgZmllbGQgaXMgcmVxdWlyZWQgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZC4gIFRoZSB2ZXJzaW9uIGZpZWxkCisgKiB0cmFja3Mgd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50LiAgVGhpcyB3aWxsIGVuc3VyZSBzb21lIG1lYXN1cmUgb2YKKyAqIG1vdW50LXRvLWtlcm5lbCB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuICBTb21lIG9mIHRoZXNlIGFyZW4ndCB1c2VkIHlldAorICogYnV0IGhlcmUgdGhleSBhcmUgYW55d2F5LgorICovCisjZGVmaW5lIE5GU19NT1VOVF9WRVJTSU9OCTYKKyNkZWZpbmUgTkZTX01BWF9DT05URVhUX0xFTgkyNTYKKworc3RydWN0IG5mc19tb3VudF9kYXRhIHsKKwlpbnQJCXZlcnNpb247CQkvKiAxICovCisJaW50CQlmZDsJCQkvKiAxICovCisJc3RydWN0IG5mczJfZmgJb2xkX3Jvb3Q7CQkvKiAxICovCisJaW50CQlmbGFnczsJCQkvKiAxICovCisJaW50CQlyc2l6ZTsJCQkvKiAxICovCisJaW50CQl3c2l6ZTsJCQkvKiAxICovCisJaW50CQl0aW1lbzsJCQkvKiAxICovCisJaW50CQlyZXRyYW5zOwkJLyogMSAqLworCWludAkJYWNyZWdtaW47CQkvKiAxICovCisJaW50CQlhY3JlZ21heDsJCS8qIDEgKi8KKwlpbnQJCWFjZGlybWluOwkJLyogMSAqLworCWludAkJYWNkaXJtYXg7CQkvKiAxICovCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CQkvKiAxICovCisJY2hhcgkJaG9zdG5hbWVbTkZTX01BWE5BTUxFTiArIDFdOwkJLyogMSAqLworCWludAkJbmFtbGVuOwkJCS8qIDIgKi8KKwl1bnNpZ25lZCBpbnQJYnNpemU7CQkJLyogMyAqLworCXN0cnVjdCBuZnMzX2ZoCXJvb3Q7CQkJLyogNCAqLworCWludAkJcHNldWRvZmxhdm9yOwkJLyogNSAqLworCWNoYXIJCWNvbnRleHRbTkZTX01BWF9DT05URVhUX0xFTiArIDFdOwkvKiA2ICovCit9OworCisvKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLworCisjZGVmaW5lIE5GU19NT1VOVF9TT0ZUCQkweDAwMDEJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfSU5UUgkJMHgwMDAyCS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1NFQ1VSRQkweDAwMDQJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfUE9TSVgJCTB4MDAwOAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9OT0NUTwkJMHgwMDEwCS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PQUMJCTB4MDAyMAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9UQ1AJCTB4MDA0MAkvKiAyICovCisjZGVmaW5lIE5GU19NT1VOVF9WRVIzCQkweDAwODAJLyogMyAqLworI2RlZmluZSBORlNfTU9VTlRfS0VSQkVST1MJMHgwMTAwCS8qIDMgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PTkxNCQkweDAyMDAJLyogMyAqLworI2RlZmluZSBORlNfTU9VTlRfQlJPS0VOX1NVSUQJMHgwNDAwCS8qIDQgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PQUNMCQkweDA4MDAJLyogNCAqLworI2RlZmluZSBORlNfTU9VTlRfU1RSSUNUTE9DSwkweDEwMDAJLyogcmVzZXJ2ZWQgZm9yIE5GU3Y0ICovCisjZGVmaW5lIE5GU19NT1VOVF9TRUNGTEFWT1VSCTB4MjAwMAkvKiA1ICovCisjZGVmaW5lIE5GU19NT1VOVF9OT1JESVJQTFVTCTB4NDAwMAkvKiA1ICovCisjZGVmaW5lIE5GU19NT1VOVF9VTlNIQVJFRAkweDgwMDAJLyogNSAqLworI2RlZmluZSBORlNfTU9VTlRfRkxBR01BU0sJMHhGRkZGCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNhY2wuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1ZTE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzYWNsLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIEZpbGU6IGxpbnV4L25mc2FjbC5oCisgKgorICogKEMpIDIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciA8YWdydWVuQHN1c2UuZGU+CisgKi8KKyNpZm5kZWYgX19MSU5VWF9ORlNBQ0xfSAorI2RlZmluZSBfX0xJTlVYX05GU0FDTF9ICisKKyNkZWZpbmUgTkZTX0FDTF9QUk9HUkFNCTEwMDIyNworCisjZGVmaW5lIEFDTFBST0MyX0dFVEFDTAkJMQorI2RlZmluZSBBQ0xQUk9DMl9TRVRBQ0wJCTIKKyNkZWZpbmUgQUNMUFJPQzJfR0VUQVRUUgkzCisjZGVmaW5lIEFDTFBST0MyX0FDQ0VTUwkJNAorCisjZGVmaW5lIEFDTFBST0MzX0dFVEFDTAkJMQorI2RlZmluZSBBQ0xQUk9DM19TRVRBQ0wJCTIKKworCisvKiBGbGFncyBmb3IgdGhlIGdldGFjbC9zZXRhY2wgbW9kZSAqLworI2RlZmluZSBORlNfQUNMCQkJMHgwMDAxCisjZGVmaW5lIE5GU19BQ0xDTlQJCTB4MDAwMgorI2RlZmluZSBORlNfREZBQ0wJCTB4MDAwNAorI2RlZmluZSBORlNfREZBQ0xDTlQJCTB4MDAwOAorCisvKiBGbGFnIGZvciBEZWZhdWx0IEFDTCBlbnRyaWVzICovCisjZGVmaW5lIE5GU19BQ0xfREVGQVVMVAkJMHgxMDAwCisKKyNlbmRpZiAgLyogX19MSU5VWF9ORlNBQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2F1dGguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxYTA4MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9hdXRoLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvbmZzZC9hdXRoLmgKKyAqCisgKiBuZnNkLXNwZWNpZmljIGF1dGhlbnRpY2F0aW9uIHN0dWZmLgorICogdWlkL2dpZCBtYXBwaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgTElOVVhfTkZTRF9BVVRIX0gKKyNkZWZpbmUgTElOVVhfTkZTRF9BVVRIX0gKKworI2VuZGlmIC8qIExJTlVYX05GU0RfQVVUSF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvY29uc3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZmZiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvY29uc3QuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogaW5jbHVkZS9saW51eC9uZnNkL2NvbnN0LmgKKyAqCisgKiBWYXJpb3VzIGNvbnN0YW50cyByZWxhdGVkIHRvIE5GUy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9ORlNEX0NPTlNUX0gKKyNkZWZpbmUgX0xJTlVYX05GU0RfQ09OU1RfSAorCisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisKKy8qCisgKiBNYXhpbXVtIHByb3RvY29sIHZlcnNpb24gc3VwcG9ydGVkIGJ5IGtuZnNkCisgKi8KKyNkZWZpbmUgTkZTU1ZDX01BWFZFUlMJCTMKKworLyoKKyAqIE1heGltdW0gYmxvY2tzaXplcyBzdXBwb3J0ZWQgYnkgZGFlbW9uIHVuZGVyIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcy4KKyAqLworI2RlZmluZSBORlNTVkNfTUFYQkxLU0laRQlSUENTVkNfTUFYUEFZTE9BRAorLyogTkZTdjIgaXMgbGltaXRlZCBieSB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiwgc2VlIFJGQyAxMDk0ICovCisjZGVmaW5lIE5GU1NWQ19NQVhCTEtTSVpFX1YyCSg4KjEwMjQpCisKKworI2VuZGlmIC8qIF9MSU5VWF9ORlNEX0NPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9kZWJ1Zy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1OGMxMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9kZWJ1Zy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L25mc2QvZGVidWcuaAorICoKKyAqIERlYnVnZ2luZy1yZWxhdGVkIHN0dWZmIGZvciBuZnNkCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgTElOVVhfTkZTRF9ERUJVR19ICisjZGVmaW5lIExJTlVYX05GU0RfREVCVUdfSAorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL2RlYnVnLmg+CisKKy8qCisgKiBFbmFibGUgZGVidWdnaW5nIGZvciBuZnNkLgorICogUmVxdWlyZXMgUlBDX0RFQlVHLgorICovCisjaWZkZWYgUlBDX0RFQlVHCisjIGRlZmluZSBORlNEX0RFQlVHCQkxCisjZW5kaWYKKworLyoKKyAqIGtuZnNkIGRlYnVnIGZsYWdzCisgKi8KKyNkZWZpbmUgTkZTRERCR19TT0NLCQkweDAwMDEKKyNkZWZpbmUgTkZTRERCR19GSAkJMHgwMDAyCisjZGVmaW5lIE5GU0REQkdfRVhQT1JUCQkweDAwMDQKKyNkZWZpbmUgTkZTRERCR19TVkMJCTB4MDAwOAorI2RlZmluZSBORlNEREJHX1BST0MJCTB4MDAxMAorI2RlZmluZSBORlNEREJHX0ZJTEVPUAkJMHgwMDIwCisjZGVmaW5lIE5GU0REQkdfQVVUSAkJMHgwMDQwCisjZGVmaW5lIE5GU0REQkdfUkVQQ0FDSEUJMHgwMDgwCisjZGVmaW5lIE5GU0REQkdfWERSCQkweDAxMDAKKyNkZWZpbmUgTkZTRERCR19MT0NLRAkJMHgwMjAwCisjZGVmaW5lIE5GU0REQkdfQUxMCQkweDdGRkYKKyNkZWZpbmUgTkZTRERCR19OT0NIQU5HRQkweEZGRkYKKworCisKKyNlbmRpZiAvKiBMSU5VWF9ORlNEX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWE1ODMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKKyAqIAorICogUHVibGljIGRlY2xhcmF0aW9ucyBmb3IgTkZTIGV4cG9ydHMuIFRoZSBkZWZpbml0aW9ucyBmb3IgdGhlCisgKiBzeXNjYWxsIGludGVyZmFjZSBhcmUgaW4gbmZzY3RsLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIE5GU0RfRVhQT1JUX0gKKyNkZWZpbmUgTkZTRF9FWFBPUlRfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKy8qCisgKiBJbXBvcnRhbnQgbGltaXRzIGZvciB0aGUgZXhwb3J0cyBzdHVmZi4KKyAqLworI2RlZmluZSBORlNDTE5UX0lETUFYCQkxMDI0CisjZGVmaW5lIE5GU0NMTlRfQUREUk1BWAkJMTYKKyNkZWZpbmUgTkZTQ0xOVF9LRVlNQVgJCTMyCisKKy8qCisgKiBFeHBvcnQgZmxhZ3MuCisgKi8KKyNkZWZpbmUgTkZTRVhQX1JFQURPTkxZCQkweDAwMDEKKyNkZWZpbmUgTkZTRVhQX0lOU0VDVVJFX1BPUlQJMHgwMDAyCisjZGVmaW5lIE5GU0VYUF9ST09UU1FVQVNICTB4MDAwNAorI2RlZmluZSBORlNFWFBfQUxMU1FVQVNICTB4MDAwOAorI2RlZmluZSBORlNFWFBfQVNZTkMJCTB4MDAxMAorI2RlZmluZSBORlNFWFBfR0FUSEVSRURfV1JJVEVTCTB4MDAyMAorLyogNDAgODAgMTAwIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNkZWZpbmUgTkZTRVhQX05PSElERQkJMHgwMjAwCisjZGVmaW5lIE5GU0VYUF9OT1NVQlRSRUVDSEVDSwkweDA0MDAKKyNkZWZpbmUJTkZTRVhQX05PQVVUSE5MTQkweDA4MDAJCS8qIERvbid0IGF1dGhlbnRpY2F0ZSBOTE0gcmVxdWVzdHMgLSBqdXN0IHRydXN0ICovCisjZGVmaW5lIE5GU0VYUF9NU05GUwkJMHgxMDAwCS8qIGRvIHNpbGx5IHRoaW5ncyB0aGF0IE1TIGNsaWVudHMgZXhwZWN0ICovCisjZGVmaW5lIE5GU0VYUF9GU0lECQkweDIwMDAKKyNkZWZpbmUJTkZTRVhQX0NST1NTTU9VTlQJMHg0MDAwCisjZGVmaW5lCU5GU0VYUF9OT0FDTAkJMHg4MDAwCS8qIHJlc2VydmVkIGZvciBwb3NzaWJsZSBBQ0wgcmVsYXRlZCB1c2UgKi8KKyNkZWZpbmUgTkZTRVhQX0FMTEZMQUdTCQkweEZFM0YKKworLyogVGhlIGZsYWdzIHRoYXQgbWF5IHZhcnkgZGVwZW5kaW5nIG9uIHNlY3VyaXR5IGZsYXZvcjogKi8KKyNkZWZpbmUgTkZTRVhQX1NFQ0lORk9fRkxBR1MJKE5GU0VYUF9SRUFET05MWSB8IE5GU0VYUF9ST09UU1FVQVNIIFwKKwkJCQkJfCBORlNFWFBfQUxMU1FVQVNIKQorCisKKyNlbmRpZiAvKiBORlNEX0VYUE9SVF9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5NThmYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKKyAqCisgKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBsYXlvdXQgb2YgdGhlIGZpbGUgaGFuZGxlcyBhcyBwYXNzZWQKKyAqIG92ZXIgdGhlIHdpcmUuCisgKgorICogRWFybGllciB2ZXJzaW9ucyBvZiBrbmZzZCB1c2VkIHRvIHNpZ24gZmlsZSBoYW5kbGVzIHVzaW5nIGtleWVkIE1ENQorICogb3IgU0hBLiBJJ3ZlIHJlbW92ZWQgdGhpcyBjb2RlLCBiZWNhdXNlIGl0IGRvZXNuJ3QgZ2l2ZSB5b3UgbW9yZQorICogc2VjdXJpdHkgdGhhbiBibG9ja2luZyBleHRlcm5hbCBhY2Nlc3MgdG8gcG9ydCAyMDQ5IG9uIHlvdXIgZmlyZXdhbGwuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgX0xJTlVYX05GU0RfRkhfSAorI2RlZmluZSBfTElOVVhfTkZTRF9GSF9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NvbnN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9kZWJ1Zy5oPgorCisvKgorICogVGhpcyBpcyB0aGUgb2xkICJkZW50cnkgc3R5bGUiIExpbnV4IE5GU3YyIGZpbGUgaGFuZGxlLgorICoKKyAqIFRoZSB4aW5vIGFuZCB4ZGV2IGZpZWxkcyBhcmUgY3VycmVudGx5IHVzZWQgdG8gdHJhbnNwb3J0IHRoZQorICogaW5vL2RldiBvZiB0aGUgZXhwb3J0ZWQgaW5vZGUuCisgKi8KK3N0cnVjdCBuZnNfZmhiYXNlX29sZCB7CisJX191MzIJCWZiX2Rjb29raWU7CS8qIGRlbnRyeSBjb29raWUgLSBhbHdheXMgMHhmZWViYmFjYSAqLworCV9fdTMyCQlmYl9pbm87CQkvKiBvdXIgaW5vZGUgbnVtYmVyICovCisJX191MzIJCWZiX2RpcmlubzsJLyogZGlyIGlub2RlIG51bWJlciwgMCBmb3IgZGlyZWN0b3JpZXMgKi8KKwlfX3UzMgkJZmJfZGV2OwkJLyogb3VyIGRldmljZSAqLworCV9fdTMyCQlmYl94ZGV2OworCV9fdTMyCQlmYl94aW5vOworCV9fdTMyCQlmYl9nZW5lcmF0aW9uOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG5ldyBmbGV4aWJsZSwgZXh0ZW5zaWJsZSBzdHlsZSBORlN2Mi92MyBmaWxlIGhhbmRsZS4KKyAqIGJ5IE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4gLSBNYXJjaCAyMDAwCisgKgorICogVGhlIGZpbGUgaGFuZGxlIGlzIHNlZW5zIGFzIGEgbGlzdCBvZiA0Ynl0ZSB3b3Jkcy4KKyAqIFRoZSBmaXJzdCB3b3JkIGNvbnRhaW5zIGEgdmVyc2lvbiBudW1iZXIgKDEpIGFuZCBmb3VyIGRlc2NyaXB0b3IgYnl0ZXMKKyAqIHRoYXQgdGVsbCBob3cgdGhlIHJlbWFpbmluZyAzIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgc2hvdWxkIGJlIGhhbmRsZWQuCisgKiBUaGVzZSB0aHJlZSBieXRlcyBhcmUgYXV0aF90eXBlLCBmc2lkX3R5cGUgYW5kIGZpbGVpZF90eXBlLgorICoKKyAqIEFsbCA0Ynl0ZSB2YWx1ZXMgYXJlIGluIGhvc3QtYnl0ZS1vcmRlci4KKyAqCisgKiBUaGUgYXV0aF90eXBlIGZpZWxkIHNwZWNpZmllcyBob3cgdGhlIGZpbGVoYW5kbGUgY2FuIGJlIGF1dGhlbnRpY2F0ZWQKKyAqIFRoaXMgbWlnaHQgYWxsb3cgYSBmaWxlIHRvIGJlIGNvbmZpcm1lZCB0byBiZSBpbiBhIHdyaXRhYmxlIHBhcnQgb2YgYQorICogZmlsZXRyZWUgd2l0aG91dCBjaGVja2luZyB0aGUgcGF0aCBmcm9tIGl0IHVwdG8gdGhlIHJvb3QuCisgKiBDdXJyZW50IHZhbHVlczoKKyAqICAgICAwICAtIE5vIGF1dGhlbnRpY2F0aW9uLiAgZmJfYXV0aCBpcyAwIGJ5dGVzIGxvbmcKKyAqIFBvc3NpYmxlIGZ1dHVyZSB2YWx1ZXM6CisgKiAgICAgMSAgLSA0IGJ5dGVzIHRha2VuIGZyb20gTUQ1IGhhc2ggb2YgdGhlIHJlbWFpbmVyIG9mIHRoZSBmaWxlIGhhbmRsZQorICogICAgICAgICAgcHJlZml4ZWQgYnkgYSBzZWNyZXQgYW5kIHdpdGggdGhlIGltcG9ydGFudCBleHBvcnQgZmxhZ3MuCisgKgorICogVGhlIGZzaWRfdHlwZSBpZGVudGlmaWVzIGhvdyB0aGUgZmlsZXN5c3RlbSAob3IgZXhwb3J0IHBvaW50KSBpcworICogICAgZW5jb2RlZC4KKyAqICBDdXJyZW50IHZhbHVlczoKKyAqICAgICAwICAtIDQgYnl0ZSBkZXZpY2UgaWQgKG1zLTItYnl0ZXMgbWFqb3IsIGxzLTItYnl0ZXMgbWlub3IpLCA0Ynl0ZSBpbm9kZSBudW1iZXIKKyAqICAgICAgICBOT1RFOiB3ZSBjYW5ub3QgdXNlIHRoZSBrZGV2X3QgZGV2aWNlIGlkIHZhbHVlLCBiZWNhdXNlIGtkZXZfdC5oCisgKiAgICAgICAgICAgICAgc2F5cyB3ZSBtdXN0bid0LiAgV2UgbXVzdCBicmVhayBpdCB1cCBhbmQgcmVhc3NlbWJsZS4KKyAqICAgICAxICAtIDQgYnl0ZSB1c2VyIHNwZWNpZmllZCBpZGVudGlmaWVyCisgKiAgICAgMiAgLSA0IGJ5dGUgbWFqb3IsIDQgYnl0ZSBtaW5vciwgNCBieXRlIGlub2RlIG51bWJlciAtIERFUFJFQ0FURUQKKyAqICAgICAzICAtIDQgYnl0ZSBkZXZpY2UgaWQsIGVuY29kZWQgZm9yIHVzZXItc3BhY2UsIDQgYnl0ZSBpbm9kZSBudW1iZXIKKyAqCisgKiBUaGUgZmlsZWlkX3R5cGUgaWRlbnRpZmllZCBob3cgdGhlIGZpbGUgd2l0aGluIHRoZSBmaWxlc3lzdGVtIGlzIGVuY29kZWQuCisgKiBUaGlzIGlzICh3aWxsIGJlKSBwYXNzZWQgdG8sIGFuZCBzZXQgYnksIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaWYgaXQgc3VwcG9ydHMKKyAqIGZpbGVoYW5kbGUgb3BlcmF0aW9ucy4gIFRoZSBmaWxlc3lzdGVtIG11c3Qgbm90IHVzZSB0aGUgdmFsdWUgJzAnIG9yICcweGZmJyBhbmQgbWF5CisgKiBvbmx5IHVzZSB0aGUgdmFsdWVzIDEgYW5kIDIgYXMgZGVmaW5lZCBiZWxvdzoKKyAqICBDdXJyZW50IHZhbHVlczoKKyAqICAgIDAgICAtIFRoZSByb290LCBvciBleHBvcnQgcG9pbnQsIG9mIHRoZSBmaWxlc3lzdGVtLiAgZmJfZmlsZWlkIGlzIDAgYnl0ZXMuCisgKiAgICAxICAgLSAzMmJpdCBpbm9kZSBudW1iZXIsIDMyIGJpdCBnZW5lcmF0aW9uIG51bWJlci4KKyAqICAgIDIgICAtIDMyYml0IGlub2RlIG51bWJlciwgMzIgYml0IGdlbmVyYXRpb24gbnVtYmVyLCAzMiBiaXQgcGFyZW50IGRpcmVjdG9yeSBpbm9kZSBudW1iZXIuCisgKgorICovCitzdHJ1Y3QgbmZzX2ZoYmFzZV9uZXcgeworCV9fdTgJCWZiX3ZlcnNpb247CS8qID09IDEsIGV2ZW4gPT4gbmZzX2ZoYmFzZV9vbGQgKi8KKwlfX3U4CQlmYl9hdXRoX3R5cGU7CisJX191OAkJZmJfZnNpZF90eXBlOworCV9fdTgJCWZiX2ZpbGVpZF90eXBlOworCV9fdTMyCQlmYl9hdXRoWzFdOworLyoJX191MzIJCWZiX2ZzaWRbMF07IGZsb2F0aW5nICovCisvKglfX3UzMgkJZmJfZmlsZWlkWzBdOyBmbG9hdGluZyAqLworfTsKKworc3RydWN0IGtuZnNkX2ZoIHsKKwl1bnNpZ25lZCBpbnQJZmhfc2l6ZTsJLyogc2lnbmlmaWNhbnQgZm9yIE5GU3YzLgorCQkJCQkgKiBQb2ludHMgdG8gdGhlIGN1cnJlbnQgc2l6ZSB3aGlsZSBidWlsZGluZworCQkJCQkgKiBhIG5ldyBmaWxlIGhhbmRsZQorCQkJCQkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBuZnNfZmhiYXNlX29sZAlmaF9vbGQ7CisJCV9fdTMyCQkJZmhfcGFkW05GUzRfRkhTSVpFLzRdOworCQlzdHJ1Y3QgbmZzX2ZoYmFzZV9uZXcJZmhfbmV3OworCX0gZmhfYmFzZTsKK307CisKKyNkZWZpbmUgb2ZoX2Rjb29raWUJCWZoX2Jhc2UuZmhfb2xkLmZiX2Rjb29raWUKKyNkZWZpbmUgb2ZoX2lubwkJCWZoX2Jhc2UuZmhfb2xkLmZiX2lubworI2RlZmluZSBvZmhfZGlyaW5vCQlmaF9iYXNlLmZoX29sZC5mYl9kaXJpbm8KKyNkZWZpbmUgb2ZoX2RldgkJCWZoX2Jhc2UuZmhfb2xkLmZiX2RldgorI2RlZmluZSBvZmhfeGRldgkJZmhfYmFzZS5maF9vbGQuZmJfeGRldgorI2RlZmluZSBvZmhfeGlubwkJZmhfYmFzZS5maF9vbGQuZmJfeGlubworI2RlZmluZSBvZmhfZ2VuZXJhdGlvbgkJZmhfYmFzZS5maF9vbGQuZmJfZ2VuZXJhdGlvbgorCisjZGVmaW5lCWZoX3ZlcnNpb24JCWZoX2Jhc2UuZmhfbmV3LmZiX3ZlcnNpb24KKyNkZWZpbmUJZmhfZnNpZF90eXBlCQlmaF9iYXNlLmZoX25ldy5mYl9mc2lkX3R5cGUKKyNkZWZpbmUJZmhfYXV0aF90eXBlCQlmaF9iYXNlLmZoX25ldy5mYl9hdXRoX3R5cGUKKyNkZWZpbmUJZmhfZmlsZWlkX3R5cGUJCWZoX2Jhc2UuZmhfbmV3LmZiX2ZpbGVpZF90eXBlCisjZGVmaW5lCWZoX2F1dGgJCQlmaF9iYXNlLmZoX25ldy5mYl9hdXRoCisjZGVmaW5lCWZoX2ZzaWQJCQlmaF9iYXNlLmZoX25ldy5mYl9hdXRoCisKKworCisjZW5kaWYgLyogX0xJTlVYX05GU0RfRkhfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU5M2RmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRzLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvbmZzZC9zdGF0cy5oCisgKgorICogU3RhdGlzdGljcyBmb3IgTkZTIHNlcnZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBMSU5VWF9ORlNEX1NUQVRTX0gKKyNkZWZpbmUgTElOVVhfTkZTRF9TVEFUU19ICisKKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisKK3N0cnVjdCBuZnNkX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQJcmNoaXRzOwkJLyogcmVwY2FjaGUgaGl0cyAqLworCXVuc2lnbmVkIGludAlyY21pc3NlczsJLyogcmVwY2FjaGUgaGl0cyAqLworCXVuc2lnbmVkIGludAlyY25vY2FjaGU7CS8qIHVuY2FjaGVkIHJlcXMgKi8KKwl1bnNpZ25lZCBpbnQJZmhfc3RhbGU7CS8qIEZIIHN0YWxlIGVycm9yICovCisJdW5zaWduZWQgaW50CWZoX2xvb2t1cDsJLyogZGVudHJ5IGNhY2hlZCAqLworCXVuc2lnbmVkIGludAlmaF9hbm9uOwkvKiBhbm9uIGZpbGUgZGVudHJ5IHJldHVybmVkICovCisJdW5zaWduZWQgaW50CWZoX25vY2FjaGVfZGlyOwkvKiBmaWxlaGFuZGxlIG5vdCBmb3VuZCBpbiBkY2FjaGUgKi8KKwl1bnNpZ25lZCBpbnQJZmhfbm9jYWNoZV9ub25kaXI7CS8qIGZpbGVoYW5kbGUgbm90IGZvdW5kIGluIGRjYWNoZSAqLworCXVuc2lnbmVkIGludAlpb19yZWFkOwkvKiBieXRlcyByZXR1cm5lZCB0byByZWFkIHJlcXVlc3RzICovCisJdW5zaWduZWQgaW50CWlvX3dyaXRlOwkvKiBieXRlcyBwYXNzZWQgaW4gd3JpdGUgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBpbnQJdGhfY250OwkJLyogbnVtYmVyIG9mIGF2YWlsYWJsZSB0aHJlYWRzICovCisJdW5zaWduZWQgaW50CXRoX3VzYWdlWzEwXTsJLyogbnVtYmVyIG9mIHRpY2tzIGR1cmluZyB3aGljaCBuIHBlcmRlY2lsZXMKKwkJCQkJICogb2YgYXZhaWxhYmxlIHRocmVhZHMgd2VyZSBpbiB1c2UgKi8KKwl1bnNpZ25lZCBpbnQJdGhfZnVsbGNudDsJLyogbnVtYmVyIG9mIHRpbWVzIGxhc3QgZnJlZSB0aHJlYWQgd2FzIHVzZWQgKi8KKwl1bnNpZ25lZCBpbnQJcmFfc2l6ZTsJLyogc2l6ZSBvZiByYSBjYWNoZSAqLworCXVuc2lnbmVkIGludAlyYV9kZXB0aFsxMV07CS8qIG51bWJlciBvZiB0aW1lcyByYSBlbnRyeSB3YXMgZm91bmQgdGhhdCBkZWVwCisJCQkJCSAqIGluIHRoZSBjYWNoZSAoMTBwZXJjZW50aWxlcykuIFsxMF0gPSBub3QgZm91bmQgKi8KKyNpZmRlZiBDT05GSUdfTkZTRF9WNAorCXVuc2lnbmVkIGludAluZnM0X29wY291bnRbTEFTVF9ORlM0X09QICsgMV07CS8qIGNvdW50IG9mIGluZGl2aWR1YWwgbmZzdjQgb3BlcmF0aW9ucyAqLworI2VuZGlmCisKK307CisKKy8qIHRocmVhZCB1c2FnZSB3cmFwcyB2ZXJ5IG1pbGxpb24gc2Vjb25kcyAoYXBwcm94IG9uZSBmb3J0bmlnaHQpICovCisjZGVmaW5lCU5GU0RfVVNBR0VfV1JBUAkoSFoqMTAwMDAwMCkKKworI2VuZGlmIC8qIExJTlVYX05GU0RfU1RBVFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9uZnNkL3N5c2NhbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2ZjRiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmZzZC9zeXNjYWxsLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L25mc2Qvc3lzY2FsbC5oCisgKgorICogVGhpcyBmaWxlIGhvbGRzIGFsbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBrbmZzZCBzeXNjYWxsIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIE5GU0RfU1lTQ0FMTF9ICisjZGVmaW5lIE5GU0RfU1lTQ0FMTF9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvY29uc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZmguaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2F1dGguaD4KKworLyoKKyAqIFZlcnNpb24gb2YgdGhlIHN5c2NhbGwgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgTkZTQ1RMX1ZFUlNJT04JCTB4MDIwMQorCisvKgorICogVGhlc2UgYXJlIHRoZSBjb21tYW5kcyB1bmRlcnN0b29kIGJ5IG5mc2N0bCgpLgorICovCisjZGVmaW5lIE5GU0NUTF9TVkMJCTAJLyogVGhpcyBpcyBhIHNlcnZlciBwcm9jZXNzLiAqLworI2RlZmluZSBORlNDVExfQUREQ0xJRU5UCTEJLyogQWRkIGFuIE5GUyBjbGllbnQuICovCisjZGVmaW5lIE5GU0NUTF9ERUxDTElFTlQJMgkvKiBSZW1vdmUgYW4gTkZTIGNsaWVudC4gKi8KKyNkZWZpbmUgTkZTQ1RMX0VYUE9SVAkJMwkvKiBleHBvcnQgYSBmaWxlIHN5c3RlbS4gKi8KKyNkZWZpbmUgTkZTQ1RMX1VORVhQT1JUCQk0CS8qIHVuZXhwb3J0IGEgZmlsZSBzeXN0ZW0uICovCisvKiNkZWZpbmUgTkZTQ1RMX1VHSURVUERBVEUJNQkvICogdXBkYXRlIGEgY2xpZW50J3MgdWlkL2dpZCBtYXAuIERJU0NBUkRFRCAqLworLyojZGVmaW5lIE5GU0NUTF9HRVRGSAkJNgkvICogZ2V0IGFuIGZoIGJ5IGlubyBESVNDQVJERUQgKi8KKyNkZWZpbmUgTkZTQ1RMX0dFVEZECQk3CS8qIGdldCBhbiBmaCBieSBwYXRoICh1c2VkIGJ5IG1vdW50ZCkgKi8KKyNkZWZpbmUJTkZTQ1RMX0dFVEZTCQk4CS8qIGdldCBhbiBmaCBieSBwYXRoIHdpdGggbWF4IEZIIGxlbiAqLworCisvKiBTVkMgKi8KK3N0cnVjdCBuZnNjdGxfc3ZjIHsKKwl1bnNpZ25lZCBzaG9ydAkJc3ZjX3BvcnQ7CisJaW50CQkJc3ZjX250aHJlYWRzOworfTsKKworLyogQUREQ0xJRU5UL0RFTENMSUVOVCAqLworc3RydWN0IG5mc2N0bF9jbGllbnQgeworCWNoYXIJCQljbF9pZGVudFtORlNDTE5UX0lETUFYKzFdOworCWludAkJCWNsX25hZGRyOworCXN0cnVjdCBpbl9hZGRyCQljbF9hZGRybGlzdFtORlNDTE5UX0FERFJNQVhdOworCWludAkJCWNsX2Zoa2V5dHlwZTsKKwlpbnQJCQljbF9maGtleWxlbjsKKwl1bnNpZ25lZCBjaGFyCQljbF9maGtleVtORlNDTE5UX0tFWU1BWF07Cit9OworCisvKiBFWFBPUlQvVU5FWFBPUlQgKi8KK3N0cnVjdCBuZnNjdGxfZXhwb3J0IHsKKwljaGFyCQkJZXhfY2xpZW50W05GU0NMTlRfSURNQVgrMV07CisJY2hhcgkJCWV4X3BhdGhbTkZTX01BWFBBVEhMRU4rMV07CisJX19rZXJuZWxfb2xkX2Rldl90CWV4X2RldjsKKwlfX2tlcm5lbF9pbm9fdAkJZXhfaW5vOworCWludAkJCWV4X2ZsYWdzOworCV9fa2VybmVsX3VpZF90CQlleF9hbm9uX3VpZDsKKwlfX2tlcm5lbF9naWRfdAkJZXhfYW5vbl9naWQ7Cit9OworCisvKiBHRVRGRCAqLworc3RydWN0IG5mc2N0bF9mZHBhcm0geworCXN0cnVjdCBzb2NrYWRkcgkJZ2RfYWRkcjsKKwljaGFyCQkJZ2RfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKKwlpbnQJCQlnZF92ZXJzaW9uOworfTsKKworLyogR0VURlMgLSBHRVQgRmlsZWhhbmRsZSB3aXRoIFNpemUgKi8KK3N0cnVjdCBuZnNjdGxfZnNwYXJtIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJCWdkX2FkZHI7CisJY2hhcgkJCWdkX3BhdGhbTkZTX01BWFBBVEhMRU4rMV07CisJaW50CQkJZ2RfbWF4bGVuOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGFyZ3VtZW50IHVuaW9uLgorICovCitzdHJ1Y3QgbmZzY3RsX2FyZyB7CisJaW50CQkJY2FfdmVyc2lvbjsJLyogc2FmZWd1YXJkICovCisJdW5pb24geworCQlzdHJ1Y3QgbmZzY3RsX3N2Ywl1X3N2YzsKKwkJc3RydWN0IG5mc2N0bF9jbGllbnQJdV9jbGllbnQ7CisJCXN0cnVjdCBuZnNjdGxfZXhwb3J0CXVfZXhwb3J0OworCQlzdHJ1Y3QgbmZzY3RsX2ZkcGFybQl1X2dldGZkOworCQlzdHJ1Y3QgbmZzY3RsX2ZzcGFybQl1X2dldGZzOworCQkvKgorCQkgKiBUaGUgZm9sbG93aW5nIGR1bW15IG1lbWJlciBpcyBuZWVkZWQgdG8gcHJlc2VydmUgYmluYXJ5IGNvbXBhdGliaWxpdHkKKwkJICogb24gcGxhdGZvcm1zIHdoZXJlIGFsaWdub2Yodm9pZCopPmFsaWdub2YoaW50KS4gIEl0J3MgbmVlZGVkIGJlY2F1c2UKKwkJICogdGhpcyB1bmlvbiB1c2VkIHRvIGNvbnRhaW4gYSBtZW1iZXIgKHVfdW1hcCkgd2hpY2ggY29udGFpbmVkIGEKKwkJICogcG9pbnRlci4KKwkJICovCisJCXZvaWQgKnVfcHRyOworCX0gdTsKKyNkZWZpbmUgY2Ffc3ZjCQl1LnVfc3ZjCisjZGVmaW5lIGNhX2NsaWVudAl1LnVfY2xpZW50CisjZGVmaW5lIGNhX2V4cG9ydAl1LnVfZXhwb3J0CisjZGVmaW5lIGNhX2dldGZkCXUudV9nZXRmZAorI2RlZmluZQljYV9nZXRmcwl1LnVfZ2V0ZnMKK307CisKK3VuaW9uIG5mc2N0bF9yZXMgeworCV9fdTgJCQljcl9nZXRmaFtORlNfRkhTSVpFXTsKKwlzdHJ1Y3Qga25mc2RfZmgJCWNyX2dldGZzOworfTsKKworCisjZW5kaWYgLyogTkZTRF9TWVNDQUxMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ubDgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4ZWUxZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbmw4MDIxMS5oCkBAIC0wLDAgKzEsMTI5IEBACisjaWZuZGVmIF9fTElOVVhfTkw4MDIxMV9ICisjZGVmaW5lIF9fTElOVVhfTkw4MDIxMV9ICisvKgorICogODAyLjExIG5ldGxpbmsgaW50ZXJmYWNlIHB1YmxpYyBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiwgMjAwNyBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICovCisKKy8qKgorICogZW51bSBubDgwMjExX2NvbW1hbmRzIC0gc3VwcG9ydGVkIG5sODAyMTEgY29tbWFuZHMKKyAqCisgKiBATkw4MDIxMV9DTURfVU5TUEVDOiB1bnNwZWNpZmllZCBjb21tYW5kIHRvIGNhdGNoIGVycm9ycworICoKKyAqIEBOTDgwMjExX0NNRF9HRVRfV0lQSFk6IHJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgYSB3aXBoeSBvciBkdW1wIHJlcXVlc3QKKyAqCXRvIGdldCBhIGxpc3Qgb2YgYWxsIHByZXNlbnQgd2lwaHlzLgorICogQE5MODAyMTFfQ01EX1NFVF9XSVBIWTogc2V0IHdpcGh5IG5hbWUsIG5lZWRzICVOTDgwMjExX0FUVFJfV0lQSFkgYW5kCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUuCisgKiBATkw4MDIxMV9DTURfTkVXX1dJUEhZOiBOZXdseSBjcmVhdGVkIHdpcGh5LCByZXNwb25zZSB0byBnZXQgcmVxdWVzdAorICoJb3IgcmVuYW1lIG5vdGlmaWNhdGlvbi4gSGFzIGF0dHJpYnV0ZXMgJU5MODAyMTFfQVRUUl9XSVBIWSBhbmQKKyAqCSVOTDgwMjExX0FUVFJfV0lQSFlfTkFNRS4KKyAqIEBOTDgwMjExX0NNRF9ERUxfV0lQSFk6IFdpcGh5IGRlbGV0ZWQuIEhhcyBhdHRyaWJ1dGVzCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZIGFuZCAlTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUuCisgKgorICogQE5MODAyMTFfQ01EX0dFVF9JTlRFUkZBQ0U6IFJlcXVlc3QgYW4gaW50ZXJmYWNlJ3MgY29uZmlndXJhdGlvbjsKKyAqCWVpdGhlciBhIGR1bXAgcmVxdWVzdCBvbiBhICVOTDgwMjExX0FUVFJfV0lQSFkgb3IgYSBzcGVjaWZpYyBnZXQKKyAqCW9uIGFuICVOTDgwMjExX0FUVFJfSUZJTkRFWCBpcyBzdXBwb3J0ZWQuCisgKiBATkw4MDIxMV9DTURfU0VUX0lOVEVSRkFDRTogU2V0IHR5cGUgb2YgYSB2aXJ0dWFsIGludGVyZmFjZSwgcmVxdWlyZXMKKyAqCSVOTDgwMjExX0FUVFJfSUZJTkRFWCBhbmQgJU5MODAyMTFfQVRUUl9JRlRZUEUuCisgKiBATkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRTogTmV3bHkgY3JlYXRlZCB2aXJ0dWFsIGludGVyZmFjZSBvciByZXNwb25zZQorICoJdG8gJU5MODAyMTFfQ01EX0dFVF9JTlRFUkZBQ0UuIEhhcyAlTkw4MDIxMV9BVFRSX0lGSU5ERVgsCisgKgklTkw4MDIxMV9BVFRSX1dJUEhZIGFuZCAlTkw4MDIxMV9BVFRSX0lGVFlQRSBhdHRyaWJ1dGVzLiBDYW4gYWxzbworICoJYmUgc2VudCBmcm9tIHVzZXJzcGFjZSB0byByZXF1ZXN0IGNyZWF0aW9uIG9mIGEgbmV3IHZpcnR1YWwgaW50ZXJmYWNlLAorICoJdGhlbiByZXF1aXJlcyBhdHRyaWJ1dGVzICVOTDgwMjExX0FUVFJfV0lQSFksICVOTDgwMjExX0FUVFJfSUZUWVBFIGFuZAorICoJJU5MODAyMTFfQVRUUl9JRk5BTUUuCisgKiBATkw4MDIxMV9DTURfREVMX0lOVEVSRkFDRTogVmlydHVhbCBpbnRlcmZhY2Ugd2FzIGRlbGV0ZWQsIGhhcyBhdHRyaWJ1dGVzCisgKgklTkw4MDIxMV9BVFRSX0lGSU5ERVggYW5kICVOTDgwMjExX0FUVFJfV0lQSFkuIENhbiBhbHNvIGJlIHNlbnQgZnJvbQorICoJdXNlcnNwYWNlIHRvIHJlcXVlc3QgZGVsZXRpb24gb2YgYSB2aXJ0dWFsIGludGVyZmFjZSwgdGhlbiByZXF1aXJlcworICoJYXR0cmlidXRlICVOTDgwMjExX0FUVFJfSUZJTkRFWC4KKyAqCisgKiBATkw4MDIxMV9DTURfTUFYOiBoaWdoZXN0IHVzZWQgY29tbWFuZCBudW1iZXIKKyAqIEBfX05MODAyMTFfQ01EX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQorICovCitlbnVtIG5sODAyMTFfY29tbWFuZHMgeworLyogZG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvciBhZGQgYW55dGhpbmcgaW5iZXR3ZWVuLCB0aGlzIGlzIEFCSSEgKi8KKwlOTDgwMjExX0NNRF9VTlNQRUMsCisKKwlOTDgwMjExX0NNRF9HRVRfV0lQSFksCQkvKiBjYW4gZHVtcCAqLworCU5MODAyMTFfQ01EX1NFVF9XSVBIWSwKKwlOTDgwMjExX0NNRF9ORVdfV0lQSFksCisJTkw4MDIxMV9DTURfREVMX1dJUEhZLAorCisJTkw4MDIxMV9DTURfR0VUX0lOVEVSRkFDRSwJLyogY2FuIGR1bXAgKi8KKwlOTDgwMjExX0NNRF9TRVRfSU5URVJGQUNFLAorCU5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0UsCisJTkw4MDIxMV9DTURfREVMX0lOVEVSRkFDRSwKKworCS8qIGFkZCBjb21tYW5kcyBoZXJlICovCisKKwkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KKwlfX05MODAyMTFfQ01EX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9DTURfTUFYID0gX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUIC0gMQorfTsKKworCisvKioKKyAqIGVudW0gbmw4MDIxMV9hdHRycyAtIG5sODAyMTEgbmV0bGluayBhdHRyaWJ1dGVzCisgKgorICogQE5MODAyMTFfQVRUUl9VTlNQRUM6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKKyAqCisgKiBATkw4MDIxMV9BVFRSX1dJUEhZOiBpbmRleCBvZiB3aXBoeSB0byBvcGVyYXRlIG9uLCBjZi4KKyAqCS9zeXMvY2xhc3MvaWVlZTgwMjExLzxwaHluYW1lPi9pbmRleAorICogQE5MODAyMTFfQVRUUl9XSVBIWV9OQU1FOiB3aXBoeSBuYW1lICh1c2VkIGZvciByZW5hbWluZykKKyAqCisgKiBATkw4MDIxMV9BVFRSX0lGSU5ERVg6IG5ldHdvcmsgaW50ZXJmYWNlIGluZGV4IG9mIHRoZSBkZXZpY2UgdG8gb3BlcmF0ZSBvbgorICogQE5MODAyMTFfQVRUUl9JRk5BTUU6IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWUKKyAqIEBOTDgwMjExX0FUVFJfSUZUWVBFOiB0eXBlIG9mIHZpcnR1YWwgaW50ZXJmYWNlLCBzZWUgJmVudW0gbmw4MDIxMV9pZnR5cGUKKyAqCisgKiBATkw4MDIxMV9BVFRSX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCisgKi8KK2VudW0gbmw4MDIxMV9hdHRycyB7CisvKiBkb24ndCBjaGFuZ2UgdGhlIG9yZGVyIG9yIGFkZCBhbnl0aGluZyBpbmJldHdlZW4sIHRoaXMgaXMgQUJJISAqLworCU5MODAyMTFfQVRUUl9VTlNQRUMsCisKKwlOTDgwMjExX0FUVFJfV0lQSFksCisJTkw4MDIxMV9BVFRSX1dJUEhZX05BTUUsCisKKwlOTDgwMjExX0FUVFJfSUZJTkRFWCwKKwlOTDgwMjExX0FUVFJfSUZOQU1FLAorCU5MODAyMTFfQVRUUl9JRlRZUEUsCisKKwkvKiBhZGQgYXR0cmlidXRlcyBoZXJlLCB1cGRhdGUgdGhlIHBvbGljeSBpbiBubDgwMjExLmMgKi8KKworCV9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9BVFRSX01BWCA9IF9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9pZnR5cGUgLSAodmlydHVhbCkgaW50ZXJmYWNlIHR5cGVzCisgKgorICogQE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOiB1bnNwZWNpZmllZCB0eXBlLCBkcml2ZXIgZGVjaWRlcworICogQE5MODAyMTFfSUZUWVBFX0FESE9DOiBpbmRlcGVuZGVudCBCU1MgbWVtYmVyCisgKiBATkw4MDIxMV9JRlRZUEVfU1RBVElPTjogbWFuYWdlZCBCU1MgbWVtYmVyCisgKiBATkw4MDIxMV9JRlRZUEVfQVA6IGFjY2VzcyBwb2ludAorICogQE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46IFZMQU4gaW50ZXJmYWNlIGZvciBhY2Nlc3MgcG9pbnRzCisgKiBATkw4MDIxMV9JRlRZUEVfV0RTOiB3aXJlbGVzcyBkaXN0cmlidXRpb24gaW50ZXJmYWNlCisgKiBATkw4MDIxMV9JRlRZUEVfTU9OSVRPUjogbW9uaXRvciBpbnRlcmZhY2UgcmVjZWl2aW5nIGFsbCBmcmFtZXMKKyAqIEBOTDgwMjExX0lGVFlQRV9NQVg6IGhpZ2hlc3QgaW50ZXJmYWNlIHR5cGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCisgKiBAX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgd2l0aCB0aGUgJU5MODAyMTFfQVRUUl9JRlRZUEUKKyAqIHRvIHNldCB0aGUgdHlwZSBvZiBhbiBpbnRlcmZhY2UuCisgKgorICovCitlbnVtIG5sODAyMTFfaWZ0eXBlIHsKKwlOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRCwKKwlOTDgwMjExX0lGVFlQRV9BREhPQywKKwlOTDgwMjExX0lGVFlQRV9TVEFUSU9OLAorCU5MODAyMTFfSUZUWVBFX0FQLAorCU5MODAyMTFfSUZUWVBFX0FQX1ZMQU4sCisJTkw4MDIxMV9JRlRZUEVfV0RTLAorCU5MODAyMTFfSUZUWVBFX01PTklUT1IsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX05MODAyMTFfSUZUWVBFX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9JRlRZUEVfTUFYID0gX19OTDgwMjExX0lGVFlQRV9BRlRFUl9MQVNUIC0gMQorfTsKKworI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L251YnVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L251YnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmOGIyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvbnVidXMuaApAQCAtMCwwICsxLDM1NSBAQAorLyoKKyAgbnVidXMuaDogdmFyaW91cyBkZWZpbml0aW9ucyBhbmQgcHJvdG90eXBlcyBmb3IgTnVCdXMgZHJpdmVycyB0byB1c2UuCisKKyAgT3JpZ2luYWxseSB3cml0dGVuIGJ5IEFsYW4gQ294LgorCisgIEhhY2tlZCB0byBkZWF0aCBieSBDLiBTY290dCBBbmFuaWFuIGFuZCBEYXZpZCBIdWdnaW5zLURhaW5lcy4KKyAgCisgIFNvbWUgb2YgdGhlIGNvbnN0YW50cyBpbiBoZXJlIGFyZSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nCisgIE5ldEJTRC9PcGVuQlNEIGhlYWRlciBmaWxlLCBieSBBbGxlbiBCcmlnZ3MuICBXZSBmaWd1cmVkIG91dCB0aGUKKyAgcmVzdCBvZiB0aGVtIG9uIG91ciBvd24uICovCisKKyNpZm5kZWYgTElOVVhfTlVCVVNfSAorI2RlZmluZSBMSU5VWF9OVUJVU19ICisKKworZW51bSBudWJ1c19jYXRlZ29yeSB7CisJTlVCVVNfQ0FUX0JPQVJEICAgICAgICAgID0gMHgwMDAxLAorCU5VQlVTX0NBVF9ESVNQTEFZICAgICAgICA9IDB4MDAwMywKKwlOVUJVU19DQVRfTkVUV09SSyAgICAgICAgPSAweDAwMDQsCisJTlVCVVNfQ0FUX0NPTU1VTklDQVRJT05TID0gMHgwMDA2LAorCU5VQlVTX0NBVF9GT05UICAgICAgICAgICA9IDB4MDAwOSwKKwlOVUJVU19DQVRfQ1BVICAgICAgICAgICAgPSAweDAwMEEsCisJLyogRm9yIGxhY2sgb2YgYSBiZXR0ZXIgbmFtZSAqLworCU5VQlVTX0NBVF9EVU9ET0NLICAgICAgICA9IDB4MDAyMAorfTsKKworZW51bSBudWJ1c190eXBlX25ldHdvcmsgeworCU5VQlVTX1RZUEVfRVRIRVJORVQgICAgICA9IDB4MDAwMSwKKwlOVUJVU19UWVBFX1JTMjMyICAgICAgICAgPSAweDAwMDIKK307CisKK2VudW0gbnVidXNfdHlwZV9kaXNwbGF5IHsKKwlOVUJVU19UWVBFX1ZJREVPICAgICAgICAgPSAweDAwMDEKK307CisKK2VudW0gbnVidXNfdHlwZV9jcHUgeworCU5VQlVTX1RZUEVfNjgwMjAgICAgICAgICA9IDB4MDAwMywKKwlOVUJVU19UWVBFXzY4MDMwICAgICAgICAgPSAweDAwMDQsCisJTlVCVVNfVFlQRV82ODA0MCAgICAgICAgID0gMHgwMDA1Cit9OworCisvKiBLbm93biA8Q2F0LFR5cGUsU1csSFc+IHR1cGxlczogKGFjY29yZGluZyB0byBUYXR0bGVUZWNoIGFuZCBTbG90cykKKyAqICA2ODAzMCBtb3RoZXJib2FyZHM6IDwxMCw0LDAsMjQ+CisgKiAgNjgwNDAgbW90aGVyYm9hcmRzOiA8MTAsNSwwLDI0PgorICogIER1b0RvY2sgUGx1czogPDMyLDEsMSwyPgorICoKKyAqICBUb2J5IEZyYW1lIEJ1ZmZlciBjYXJkOiA8MywxLDEsMT4KKyAqICBSQlYgYnVpbHQtaW4gdmlkZW8gKElJY2kpOiA8MywxLDEsMjQ+CisgKiAgVmFsa3lyaWUgYnVpbHQtaW4gdmlkZW8gKFE2MzApOiA8MywxLDEsNDY+CisgKiAgTWFjaW50b3NoIERpc3BsYXkgQ2FyZDogPDMsMSwxLDI1PgorICogIFNvbm9yYSBidWlsdC1pbiB2aWRlbyAoUDQ2MCk6IDwzLDEsMSwzND4KKyAqICBKZXQgZnJhbWVidWZmZXIgKER1b0RvY2sgUGx1cyk6IDwzLDEsMSw0MT4KKyAqCisgKiAgU09OSUMgY29tbS1zbG90L29uLWJvYXJkIGFuZCBEdW9Eb2NrIEV0aGVybmV0OiA8NCwxLDEsMjcyPgorICogIFNPTklDIExDLVBEUyBFdGhlcm5ldCAoRGF5bmEsIGJ1dCBsaWtlIEFwcGxlIDE2LWJpdCwgc29ydCBvZik6IDw0LDEsMSwyNzE+CisgKiAgQXBwbGUgU09OSUMgTEMtUERTIEV0aGVybmV0ICgiQXBwbGUgRXRoZXJuZXQgTEMgVHdpc3RlZC1QYWlyIENhcmQiKTogPDQsMSwwLDI4MT4KKyAqICBTb25pYyBTeXN0ZW1zIEV0aGVybmV0IEEtU2VyaWVzIENhcmQ6IDw0LDEsMjY4LDI1Nj4KKyAqICBBc2FudGUgTWFjQ29uIE51QnVzLUE6IDw0LDEsMjYwLDI1Nj4gKGFscGhhLTEuMCwxLjEgcmV2aXNpb24pCisgKiAgIFJPTSBvbiB0aGUgYWJvdmUgY2FyZDogPDIsMSwwLDA+CisgKiAgQ2FibGV0cm9uIGV0aGVybmV0IGNhcmQ6IDw0LDEsMSwyNjU+CisgKiAgRmFyYWxsb24gZXRoZXJuZXQgY2FyZDogPDQsMSwyNjgsMjU2PiAoaWRlbnRpY2FsIHRvIFNvbmljIFN5c3RlbXMgY2FyZCkKKyAqICBLaW5ldGljcyBFdGhlclBvcnQgSUlOOiA8NCwxLDI1OSwyNjI+CisgKiAgQVBJIEVuZ2luZWVyaW5nIEV0aGVyUnVuX0xDYSBQRFMgZW5ldCBjYXJkOiA8NCwxLDI4MiwyNTY+CisgKgorICogIEFkZCB5b3VyIGRldmljZXMgdG8gdGhlIGxpc3QhICBZb3UgY2FuIG9idGFpbiB0aGUgIlNsb3RzIiB1dGlsaXR5CisgKiAgZnJvbSBBcHBsZSdzIEZUUCBzaXRlIGF0OgorICogIGZ0cDovL2Rldi5hcHBsZS5jb20vZGV2d29ybGQvVG9vbF9DaGVzdC9EZXZpY2VzXy1fSGFyZHdhcmUvTnVCdXNfU2xvdF9NYW5hZ2VyLworICoKKyAqICBBbHRlcm5hdGVseSwgVGF0dGxlVGVjaCBjYW4gYmUgZm91bmQgYXQgYW55IEluZm8tTWFjIG1pcnJvciBzaXRlLiAgCisgKiAgb3IgZnJvbSBpdHMgZGlzdHJpYnV0aW9uIHNpdGU6IGZ0cDovL2Z0cC5kZWNpc21rci5jb20vZG1zCisgKi8KKworLyogRHJTVzogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgc29mdHdhcmUgaW50ZXJmYWNlIHRvIGEgYm9hcmQuICBUaGlzCisgICBpcyB1c3VhbGx5IHRoZSBvbmUgeW91IHdhbnQgdG8gbG9vayBhdCB3aGVuIHdyaXRpbmcgYSBkcml2ZXIuICBJdCdzCisgICBub3QgYXMgdXNlZnVsIGFzIHlvdSB0aGluaywgdGhvdWdoLCBiZWNhdXNlIGFzIHdlIHNob3VsZCBrbm93IGJ5CisgICBub3cgKGR1aCksICJBcHBsZSBDb21wYXRpYmxlIiBjYW4gbWVhbiBhIGxvdCBvZiB0aGluZ3MuLi4gKi8KKworLyogQWRkIGtub3duIERyU1cgdmFsdWVzIGhlcmUgKi8KK2VudW0gbnVidXNfZHJzdyB7CisJLyogTlVCVVNfQ0FUX0RJU1BMQVkgKi8KKwlOVUJVU19EUlNXX0FQUExFICAgICAgICA9IDB4MDAwMSwKKwlOVUJVU19EUlNXX0FQUExFX0hJUkVTICA9IDB4MDAxMywgLyogTWFjSUkgSGlSZXMgY2FyZCBkcml2ZXIgKi8KKwkKKwkvKiBOVUJVU19DQVRfTkVUV09SSyAqLworCU5VQlVTX0RSU1dfM0NPTSAgICAgICAgID0gMHgwMDAwLAorCU5VQlVTX0RSU1dfQ0FCTEVUUk9OICAgID0gMHgwMDAxLAorCU5VQlVTX0RSU1dfU09OSUNfTEMgICAgID0gMHgwMDAxLAorCU5VQlVTX0RSU1dfS0lORVRJQ1MgICAgID0gMHgwMTAzLAorCU5VQlVTX0RSU1dfQVNBTlRFICAgICAgID0gMHgwMTA0LAorCU5VQlVTX0RSU1dfVEVDSFdPUktTICAgID0gMHgwMTA5LAorCU5VQlVTX0RSU1dfREFZTkEgICAgICAgID0gMHgwMTBiLAorCU5VQlVTX0RSU1dfRkFSQUxMT04gICAgID0gMHgwMTBjLAorCU5VQlVTX0RSU1dfQVBQTEVfU04gICAgID0gMHgwMTBmLAorCU5VQlVTX0RSU1dfREFZTkEyICAgICAgID0gMHgwMTE1LAorCU5VQlVTX0RSU1dfRk9DVVMgICAgICAgID0gMHgwMTFhLAorCU5VQlVTX0RSU1dfQVNBTlRFX0NTICAgID0gMHgwMTFkLCAvKiB1c2UgYXNhbnRlIFNNQzkxOTQgZHJpdmVyICovCisJTlVCVVNfRFJTV19EQVlOQV9MQyAgICAgPSAweDAxMWUsCisKKwkvKiBOVUJVU19DQVRfQ1BVICovCisJTlVCVVNfRFJTV19OT05FICAgICAgICAgPSAweDAwMDAsCit9OworCisvKiBEckhXOiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYSBib2FyZCAob3IgYXQKKyAgIGxlYXN0LCBpdCBzaG91bGQuLi4gIHNvbWUgdmlkZW8gY2FyZHMgYXJlIGtub3duIHRvIGluY29ycmVjdGx5CisgICBpZGVudGlmeSB0aGVtc2VsdmVzIGFzIFRvYnkgY2FyZHMpICovCisKKy8qIEFkZCBrbm93biBEckhXIHZhbHVlcyBoZXJlICovCitlbnVtIG51YnVzX2RyaHcgeworCS8qIE5VQlVTX0NBVF9ESVNQTEFZICovCisJTlVCVVNfRFJIV19BUFBMRV9URkIgICAgICA9IDB4MDAwMSwgLyogVG9ieSBmcmFtZSBidWZmZXIgY2FyZCAqLworCU5VQlVTX0RSSFdfQVBQTEVfV1ZDICAgICAgPSAweDAwMDYsIC8qIEFwcGxlIFdvcmtzdGF0aW9uIFZpZGVvIENhcmQgKi8KKwlOVUJVU19EUkhXX1NJR01BX0NMUk1BWCAgID0gMHgwMDA3LCAvKiBTaWdtYSBEZXNpZ24gQ29sb3JNYXggKi8KKwlOVUJVU19EUkhXX0FQUExFX1NFMzAgICAgID0gMHgwMDA5LCAvKiBBcHBsZSBTRS8zMCB2aWRlbyAqLworCU5VQlVTX0RSSFdfQVBQTEVfSFJWQyAgICAgPSAweDAwMTMsIC8qIE1hYyBJSSBIaWdoLVJlcyBWaWRlbyBDYXJkICovCisJTlVCVVNfRFJIV19BUFBMRV9QVkMgICAgICA9IDB4MDAxNywgLyogTWFjIElJIFBvcnRyYWl0IFZpZGVvIENhcmQgKi8KKwlOVUJVU19EUkhXX0FQUExFX1JCVjEgICAgID0gMHgwMDE4LCAvKiBJSWNpIFJCViB2aWRlbyAqLworCU5VQlVTX0RSSFdfQVBQTEVfTURDICAgICAgPSAweDAwMTksIC8qIE1hY2ludG9zaCBEaXNwbGF5IENhcmQgKi8KKwlOVUJVU19EUkhXX0FQUExFX1NPTk9SQSAgID0gMHgwMDIyLCAvKiBTb25vcmEgYnVpbHQtaW4gdmlkZW8gKi8KKwlOVUJVU19EUkhXX0FQUExFXzI0QUMgICAgID0gMHgwMDJiLCAvKiBNYWMgMjRBQyBWaWRlbyBDYXJkICovCisJTlVCVVNfRFJIV19BUFBMRV9WQUxLWVJJRSA9IDB4MDAyZSwKKwlOVUJVU19EUkhXX0FQUExFX0pFVCAgICAgID0gMHgwMDI5LCAvKiBKZXQgZnJhbWVidWZmZXIgKER1b0RvY2spICovCisJTlVCVVNfRFJIV19TTUFDX0dGWCAgICAgICA9IDB4MDEwNSwgLyogU3VwZXJNYWMgR0ZYICovCisJTlVCVVNfRFJIV19SQVNURVJfQ0IyNjQgICA9IDB4MDEzQiwgLyogUmFzdGVyT3BzIENvbG9yQm9hcmQgMjY0ICovCisJTlVCVVNfRFJIV19NSUNST05fWENFRUQgICA9IDB4MDE0NiwgLyogTWljcm9uIEV4Y2VlZCBjb2xvciAqLworCU5VQlVTX0RSSFdfUkRJVVNfR1NDICAgICAgPSAweDAxNTMsIC8qIFJhZGl1cyBHUy9DICovCisJTlVCVVNfRFJIV19TTUFDX1NQRUM4ICAgICA9IDB4MDE3QiwgLyogU3VwZXJNYWMgU3BlY3RydW0vOCAqLworCU5VQlVTX0RSSFdfU01BQ19TUEVDMjQgICAgPSAweDAxN0MsIC8qIFN1cGVyTWFjIFNwZWN0cnVtLzI0ICovCisJTlVCVVNfRFJIV19SQVNURVJfQ0IzNjQgICA9IDB4MDI2RiwgLyogUmFzdGVyT3BzIENvbG9yQm9hcmQgMzY0ICovCisJTlVCVVNfRFJIV19SRElVU19EQ0dYICAgICA9IDB4MDI3QywgLyogUmFkaXVzIERpcmVjdENvbG9yL0dYICovCisJTlVCVVNfRFJIV19SRElVU19QQzggICAgICA9IDB4MDI5MSwgLyogUmFkaXVzIFByZWNpc2lvbkNvbG9yIDggKi8KKwlOVUJVU19EUkhXX0xBUElTX1BDUzggICAgID0gMHgwMjkyLCAvKiBMYXBpcyBQcm9Db2xvclNlcnZlciA4ICovCisJTlVCVVNfRFJIV19SQVNURVJfMjRMWEkgICA9IDB4MDJBMCwgLyogUmFzdGVyT3BzIDgvMjQgWExpICovCisJTlVCVVNfRFJIV19SQVNURVJfUEJQR1QgICA9IDB4MDJBNSwgLyogUmFzdGVyT3BzIFBhaW50Qm9hcmQgUHJpc20gR1QgKi8KKwlOVUJVU19EUkhXX0VNQUNIX0ZTWCAgICAgID0gMHgwMkFFLCAvKiBFLU1hY2hpbmVzIEZ1dHVyYSBTWCAqLworCU5VQlVTX0RSSFdfU01BQ19USFVORDI0ICAgPSAweDAyQ0IsIC8qIFN1cGVyTWFjIFRodW5kZXIvMjQgKi8KKwlOVUJVU19EUkhXX1JESVVTX1BDMjRYUCAgID0gMHgwNDA2LCAvKiBSYWRpdXMgUHJlY2lzaW9uQ29sb3IgMjRYcCAqLworCU5VQlVTX0RSSFdfUkRJVVNfUEMyNFggICAgPSAweDA0MEEsIC8qIFJhZGl1cyBQcmVjaXNpb25Db2xvciAyNFggKi8KKwlOVUJVU19EUkhXX1JESVVTX1BDOFhKICAgID0gMHgwNDBCLCAvKiBSYWRpdXMgUHJlY2lzaW9uQ29sb3IgOFhKICovCisJCisJLyogTlVCVVNfQ0FUX05FVFdPUksgKi8KKwlOVUJVU19EUkhXX0lOVEVSTEFOICAgICAgID0gMHgwMTAwLAorCU5VQlVTX0RSSFdfU01DOTE5NCAgICAgICAgPSAweDAxMDEsCisJTlVCVVNfRFJIV19LSU5FVElDUyAgICAgICA9IDB4MDEwNiwKKwlOVUJVU19EUkhXX0NBQkxFVFJPTiAgICAgID0gMHgwMTA5LAorCU5VQlVTX0RSSFdfQVNBTlRFX0xDICAgICAgPSAweDAxMGYsCisJTlVCVVNfRFJIV19TT05JQyAgICAgICAgICA9IDB4MDExMCwKKwlOVUJVU19EUkhXX1RFQ0hXT1JLUyAgICAgID0gMHgwMTEyLAorCU5VQlVTX0RSSFdfQVBQTEVfU09OSUNfTkIgPSAweDAxMTgsCisJTlVCVVNfRFJIV19BUFBMRV9TT05JQ19MQyA9IDB4MDExOSwKKwlOVUJVU19EUkhXX0ZPQ1VTICAgICAgICAgID0gMHgwMTFjLAorCU5VQlVTX0RSSFdfU09OTkVUICAgICAgICAgPSAweDAxMWQsCit9OworCisvKiBSZXNvdXJjZSBJRHM6IFRoZXNlIGFyZSB0aGUgaWRlbnRpZmllcnMgZm9yIHRoZSB2YXJpb3VzIHdlaXJkIGFuZAorICAgd29uZGVyZnVsIHRpZGJpdHMgb2YgaW5mb3JtYXRpb24gdGhhdCBtYXkgb3IgbWF5IG5vdCByZXNpZGUgaW4gdGhlCisgICBOdUJ1cyBST00gZGlyZWN0b3J5LiAqLworZW51bSBudWJ1c19yZXNfaWQgeworCU5VQlVTX1JFU0lEX1RZUEUgICAgICAgICA9IDB4MDAwMSwKKwlOVUJVU19SRVNJRF9OQU1FICAgICAgICAgPSAweDAwMDIsCisJTlVCVVNfUkVTSURfSUNPTiAgICAgICAgID0gMHgwMDAzLAorCU5VQlVTX1JFU0lEX0RSVlJESVIgICAgICA9IDB4MDAwNCwKKwlOVUJVU19SRVNJRF9MT0FEUkVDICAgICAgPSAweDAwMDUsCisJTlVCVVNfUkVTSURfQk9PVFJFQyAgICAgID0gMHgwMDA2LAorCU5VQlVTX1JFU0lEX0ZMQUdTICAgICAgICA9IDB4MDAwNywKKwlOVUJVU19SRVNJRF9IV0RFVklEICAgICAgPSAweDAwMDgsCisJTlVCVVNfUkVTSURfTUlOT1JfQkFTRU9TID0gMHgwMDBhLAorCU5VQlVTX1JFU0lEX01JTk9SX0xFTkdUSCA9IDB4MDAwYiwKKwlOVUJVU19SRVNJRF9NQUpPUl9CQVNFT1MgPSAweDAwMGMsCisJTlVCVVNfUkVTSURfTUFKT1JfTEVOR1RIID0gMHgwMDBkLAorCU5VQlVTX1JFU0lEX0NJQ04gICAgICAgICA9IDB4MDAwZiwKKwlOVUJVU19SRVNJRF9JQ0w4ICAgICAgICAgPSAweDAwMTAsCisJTlVCVVNfUkVTSURfSUNMNCAgICAgICAgID0gMHgwMDExLAorfTsKKworLyogQ2F0ZWdvcnktc3BlY2lmaWMgcmVzb3VyY2VzLiAqLworZW51bSBudWJ1c19ib2FyZF9yZXNfaWQgeworCU5VQlVTX1JFU0lEX0JPQVJESUQgICAgICA9IDB4MDAyMCwKKwlOVUJVU19SRVNJRF9QUkFNSU5JVERBVEEgPSAweDAwMjEsCisJTlVCVVNfUkVTSURfUFJJTUFSWUlOSVQgID0gMHgwMDIyLAorCU5VQlVTX1JFU0lEX1RJTUVPVVRDT05TVCA9IDB4MDAyMywKKwlOVUJVU19SRVNJRF9WRU5ET1JJTkZPICAgPSAweDAwMjQsCisJTlVCVVNfUkVTSURfQk9BUkRGTEFHUyAgID0gMHgwMDI1LAorCU5VQlVTX1JFU0lEX1NFQ09ORElOSVQgICA9IDB4MDAyNiwKKworCS8qIE5vdCBzdXJlIHdoeSBBcHBsZSBwdXQgdGhlc2UgbmV4dCB0d28gaW4gaGVyZSAqLworCU5VQlVTX1JFU0lEX1ZJRE5BTUVTICAgICA9IDB4MDA0MSwKKwlOVUJVU19SRVNJRF9WSURNT0RFUyAgICAgPSAweDAwN2UKK307CisKKy8qIEZpZWxkcyB3aXRoaW4gdGhlIHZlbmRvciBpbmZvIGRpcmVjdG9yeSAqLworZW51bSBudWJ1c192ZW5kb3JfcmVzX2lkIHsKKwlOVUJVU19SRVNJRF9WRU5EX0lEICAgICA9IDB4MDAwMSwKKwlOVUJVU19SRVNJRF9WRU5EX1NFUklBTCA9IDB4MDAwMiwKKwlOVUJVU19SRVNJRF9WRU5EX1JFViAgICA9IDB4MDAwMywKKwlOVUJVU19SRVNJRF9WRU5EX1BBUlQgICA9IDB4MDAwNCwKKwlOVUJVU19SRVNJRF9WRU5EX0RBVEUgICA9IDB4MDAwNQorfTsKKworZW51bSBudWJ1c19uZXRfcmVzX2lkIHsKKwlOVUJVU19SRVNJRF9NQUNfQUREUkVTUyAgPSAweDAwODAKK307CisKK2VudW0gbnVidXNfY3B1X3Jlc19pZCB7CisJTlVCVVNfUkVTSURfTUVNSU5GTyAgICAgID0gMHgwMDgxLAorCU5VQlVTX1JFU0lEX1JPTUlORk8gICAgICA9IDB4MDA4MgorfTsKKworZW51bSBudWJ1c19kaXNwbGF5X3Jlc19pZCB7CisJTlVCVVNfUkVTSURfR0FNTUFESVIgICAgPSAweDAwNDAsCisJTlVCVVNfUkVTSURfRklSU1RNT0RFICAgPSAweDAwODAsCisJTlVCVVNfUkVTSURfU0VDT05ETU9ERSAgPSAweDAwODEsCisJTlVCVVNfUkVTSURfVEhJUkRNT0RFICAgPSAweDAwODIsCisJTlVCVVNfUkVTSURfRk9VUlRITU9ERSAgPSAweDAwODMsCisJTlVCVVNfUkVTSURfRklGVEhNT0RFICAgPSAweDAwODQsCisJTlVCVVNfUkVTSURfU0lYVEhNT0RFICAgPSAweDAwODUKK307CisKK3N0cnVjdCBudWJ1c19kaXIKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlpbnQgZG9uZTsKKwlpbnQgbWFzazsKK307CisKK3N0cnVjdCBudWJ1c19kaXJlbnQKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwlfX3UzMiBkYXRhOwkvKiBBY3R1YWxseSAyNGJpdHMgdXNlZCAqLworCWludCBtYXNrOworfTsKKworc3RydWN0IG51YnVzX2JvYXJkIHsKKwlzdHJ1Y3QgbnVidXNfYm9hcmQqIG5leHQ7CisJc3RydWN0IG51YnVzX2RldiogZmlyc3RfZGV2OworCQorCS8qIE9ubHkgOS1FIGFjdHVhbGx5IGV4aXN0LCB0aG91Z2ggMC04IGFyZSBhbHNvIHRoZW9yZXRpY2FsbHkKKwkgICBwb3NzaWJsZSwgYW5kIDAgaXMgYSBzcGVjaWFsIGNhc2Ugd2hpY2ggcmVwcmVzZW50cyB0aGUKKwkgICBtb3RoZXJib2FyZCBhbmQgb25ib2FyZCBwZXJpcGhlcmFscyAoRXRoZXJuZXQsIHZpZGVvKSAqLworCWludCBzbG90OworCS8qIEZvciBzbG90IDAsIHRoaXMgaXMgYm9ndXMuICovCisJY2hhciBuYW1lWzY0XTsKKworCS8qIEZvcm1hdCBibG9jayAqLworCXVuc2lnbmVkIGNoYXIqIGZibG9jazsKKwkvKiBSb290IGRpcmVjdG9yeSAoZG9lcyAqbm90KiBhbHdheXMgZXF1YWwgZmJsb2NrICsgZG9mZnNldCEpICovCisJdW5zaWduZWQgY2hhciogZGlyZWN0b3J5OworCQorCXVuc2lnbmVkIGxvbmcgc2xvdF9hZGRyOworCS8qIE9mZnNldCB0byByb290IGRpcmVjdG9yeSAoc29tZXRpbWVzKSAqLworCXVuc2lnbmVkIGxvbmcgZG9mZnNldDsKKwkvKiBMZW5ndGggb3ZlciB3aGljaCB0byBjb21wdXRlIHRoZSBjcmMgKi8KKwl1bnNpZ25lZCBsb25nIHJvbV9sZW5ndGg7CisJLyogQ29tcGxldGVseSB1c2VsZXNzIG1vc3Qgb2YgdGhlIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIGNyYzsKKwl1bnNpZ25lZCBjaGFyIHJldjsKKwl1bnNpZ25lZCBjaGFyIGZvcm1hdDsKKwl1bnNpZ25lZCBjaGFyIGxhbmVzOworfTsKKworc3RydWN0IG51YnVzX2RldiB7CisJLyogTmV4dCBsaW5rIGluIGRldmljZSBsaXN0ICovCisJc3RydWN0IG51YnVzX2RldiogbmV4dDsKKwkvKiBEaXJlY3RvcnkgZW50cnkgaW4gL3Byb2MvYnVzL251YnVzICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5KiBwcm9jZGlyOworCisJLyogVGhlIGZ1bmN0aW9uYWwgcmVzb3VyY2UgSUQgb2YgdGhpcyBkZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyIHJlc2lkOworCS8qIFRoZXNlIGFyZSBtb3N0bHkgaGVyZSBmb3IgY29udmVuaWVuY2U7IHdlIGNvdWxkIGFsd2F5cyByZWFkCisJICAgdGhlbSBmcm9tIHRoZSBST01zIGlmIHdlIHdhbnRlZCB0byAqLworCXVuc2lnbmVkIHNob3J0IGNhdGVnb3J5OworCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJdW5zaWduZWQgc2hvcnQgZHJfc3c7CisJdW5zaWduZWQgc2hvcnQgZHJfaHc7CisJLyogVGhpcyBpcyB0aGUgZGV2aWNlJ3MgbmFtZSByYXRoZXIgdGhhbiB0aGUgYm9hcmQncy4KKwkgICBTb21ldGltZXMgdGhleSBhcmUgZGlmZmVyZW50LiAgVXN1YWxseSB0aGUgYm9hcmQgbmFtZSBpcworCSAgIG1vcmUgY29ycmVjdC4gKi8KKwljaGFyIG5hbWVbNjRdOworCS8qIE1hY09TIGRyaXZlciAoSSBraWQgeW91IG5vdCkgKi8KKwl1bnNpZ25lZCBjaGFyKiBkcml2ZXI7CisJLyogQWN0dWFsbHkgdGhpcyBpcyBhbiBvZmZzZXQgKi8KKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl1bnNpZ25lZCBsb25nIGlvc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzLCBod2RldmlkOworCQorCS8qIEZ1bmN0aW9uYWwgZGlyZWN0b3J5ICovCisJdW5zaWduZWQgY2hhciogZGlyZWN0b3J5OworCS8qIE11Y2ggb2Ygb3VyIGluZm8gY29tZXMgZnJvbSBoZXJlICovCisJc3RydWN0IG51YnVzX2JvYXJkKiBib2FyZDsKK307CisKKy8qIFRoaXMgaXMgYWxsIE51QnVzIGRldmljZXMgKHVzZWQgdG8gZmluZCBkZXZpY2VzIGxhdGVyIG9uKSAqLworZXh0ZXJuIHN0cnVjdCBudWJ1c19kZXYqIG51YnVzX2RldmljZXM7CisvKiBUaGlzIGlzIGFsbCBOdUJ1cyBjYXJkcyAqLworZXh0ZXJuIHN0cnVjdCBudWJ1c19ib2FyZCogbnVidXNfYm9hcmRzOworCisvKiBHZW5lcmljIE51QnVzIGludGVyZmFjZSBmdW5jdGlvbnMsIG1vZGVsbGVkIGFmdGVyIHRoZSBQQ0kgaW50ZXJmYWNlICovCit2b2lkIG51YnVzX3NjYW5fYnVzKHZvaWQpOworZXh0ZXJuIHZvaWQgbnVidXNfcHJvY19pbml0KHZvaWQpOworaW50IGdldF9udWJ1c19saXN0KGNoYXIgKmJ1Zik7CitpbnQgbnVidXNfcHJvY19hdHRhY2hfZGV2aWNlKHN0cnVjdCBudWJ1c19kZXYgKmRldik7CitpbnQgbnVidXNfcHJvY19kZXRhY2hfZGV2aWNlKHN0cnVjdCBudWJ1c19kZXYgKmRldik7CisvKiBJZiB3ZSBuZWVkIG1vcmUgcHJlY2lzaW9uIHdlIGNhbiBhZGQgc29tZSBtb3JlIG9mIHRoZXNlICovCitzdHJ1Y3QgbnVidXNfZGV2KiBudWJ1c19maW5kX2RldmljZSh1bnNpZ25lZCBzaG9ydCBjYXRlZ29yeSwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgZHJfaHcsCisJCQkJICAgIHVuc2lnbmVkIHNob3J0IGRyX3N3LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbnVidXNfZGV2KiBmcm9tKTsKK3N0cnVjdCBudWJ1c19kZXYqIG51YnVzX2ZpbmRfdHlwZSh1bnNpZ25lZCBzaG9ydCBjYXRlZ29yeSwKKwkJCQkgIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJCQkJICBjb25zdCBzdHJ1Y3QgbnVidXNfZGV2KiBmcm9tKTsKKy8qIE1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBkZXZpY2UgaW4gYSBzbG90LCB5b3Uga25vdy4uLiAqLworc3RydWN0IG51YnVzX2RldiogbnVidXNfZmluZF9zbG90KHVuc2lnbmVkIGludCBzbG90LAorCQkJCSAgY29uc3Qgc3RydWN0IG51YnVzX2RldiogZnJvbSk7CisKKy8qIFRoZXNlIGFyZSBzb21ld2hhdCBtb3JlIE51QnVzLXNwZWNpZmljLiAgVGhleSBhbGwgcmV0dXJuIDAgZm9yCisgICBzdWNjZXNzIGFuZCAtMSBmb3IgZmFpbHVyZSwgYXMgeW91J2QgZXhwZWN0LiAqLworCisvKiBUaGUgcm9vdCBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGJvYXJkIGFuZCBmdW5jdGlvbmFsCisgICBkaXJlY3RvcmllcyAqLworaW50IG51YnVzX2dldF9yb290X2Rpcihjb25zdCBzdHJ1Y3QgbnVidXNfYm9hcmQqIGJvYXJkLAorCQkgICAgICAgc3RydWN0IG51YnVzX2RpciogZGlyKTsKKy8qIFRoZSBib2FyZCBkaXJlY3RvcnkgKi8KK2ludCBudWJ1c19nZXRfYm9hcmRfZGlyKGNvbnN0IHN0cnVjdCBudWJ1c19ib2FyZCogYm9hcmQsCisJCQlzdHJ1Y3QgbnVidXNfZGlyKiBkaXIpOworLyogVGhlIGZ1bmN0aW9uYWwgZGlyZWN0b3J5ICovCitpbnQgbnVidXNfZ2V0X2Z1bmNfZGlyKGNvbnN0IHN0cnVjdCBudWJ1c19kZXYqIGRldiwKKwkJICAgICAgIHN0cnVjdCBudWJ1c19kaXIqIGRpcik7CisKKy8qIFRoZXNlIHdvcmsgb24gYW55IGRpcmVjdG9yeSBnb3R0ZW4gdmlhIHRoZSBhYm92ZSAqLworaW50IG51YnVzX3JlYWRkaXIoc3RydWN0IG51YnVzX2RpciogZGlyLAorCQkgIHN0cnVjdCBudWJ1c19kaXJlbnQqIGVudCk7CitpbnQgbnVidXNfZmluZF9yc3JjKHN0cnVjdCBudWJ1c19kaXIqIGRpciwKKwkJICAgIHVuc2lnbmVkIGNoYXIgcnNyY190eXBlLAorCQkgICAgc3RydWN0IG51YnVzX2RpcmVudCogZW50KTsKK2ludCBudWJ1c19yZXdpbmRkaXIoc3RydWN0IG51YnVzX2RpciogZGlyKTsKKworLyogVGhpbmdzIHRvIGRvIHdpdGggZGlyZWN0b3J5IGVudHJpZXMgKi8KK2ludCBudWJ1c19nZXRfc3ViZGlyKGNvbnN0IHN0cnVjdCBudWJ1c19kaXJlbnQqIGVudCwKKwkJICAgICBzdHJ1Y3QgbnVidXNfZGlyKiBkaXIpOwordm9pZCBudWJ1c19nZXRfcnNyY19tZW0odm9pZCogZGVzdCwKKwkJCWNvbnN0IHN0cnVjdCBudWJ1c19kaXJlbnQgKmRpcmVudCwKKwkJCWludCBsZW4pOwordm9pZCBudWJ1c19nZXRfcnNyY19zdHIodm9pZCogZGVzdCwKKwkJCWNvbnN0IHN0cnVjdCBudWJ1c19kaXJlbnQgKmRpcmVudCwKKwkJCWludCBtYXhsZW4pOworCisvKiBXZSdkIGxpa2UgdG8gZ2V0IHJpZCBvZiB0aGlzIGV2ZW50dWFsbHkuICBPbmx5IGRheW5hcG9ydC5jIHVzZXMgaXQgbm93LiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCAqbnVidXNfc2xvdF9hZGRyKGludCBzbG90KQoreworCXJldHVybiAodm9pZCAqKSgweEYwMDAwMDAwfChzbG90PDwyNCkpOworfQorCisjZW5kaWYgLyogTElOVVhfTlVCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9udnJhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9udnJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYWExMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L252cmFtLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfTElOVVhfTlZSQU1fSAorI2RlZmluZSBfTElOVVhfTlZSQU1fSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworLyogL2Rldi9udnJhbSBpb2N0bHMgKi8KKyNkZWZpbmUgTlZSQU1fSU5JVAlfSU8oJ3AnLCAweDQwKSAvKiBpbml0aWFsaXplIE5WUkFNIGFuZCBzZXQgY2hlY2tzdW0gKi8KKyNkZWZpbmUgTlZSQU1fU0VUQ0tTCV9JTygncCcsIDB4NDEpIC8qIHJlY2FsY3VsYXRlIGNoZWNrc3VtICovCisKKy8qIGZvciBhbGwgY3VycmVudCBzeXN0ZW1zLCB0aGlzIGlzIHdoZXJlIE5WUkFNIHN0YXJ0cyAqLworI2RlZmluZSBOVlJBTV9GSVJTVF9CWVRFICAgIDE0CisvKiBhbGwgdGhlc2UgZnVuY3Rpb25zIGV4cGVjdCBhbiBOVlJBTSBvZmZzZXQsIG5vdCBhbiBhYnNvbHV0ZSAqLworI2RlZmluZSBOVlJBTV9PRkZTRVQoeCkgICAoKHgpLU5WUkFNX0ZJUlNUX0JZVEUpCisKKworI2VuZGlmICAvKiBfTElOVVhfTlZSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9vb20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3MjdiOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvb29tLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0lOQ0xVREVfTElOVVhfT09NX0gKKyNkZWZpbmUgX19JTkNMVURFX0xJTlVYX09PTV9ICisKKy8qIC9wcm9jLzxwaWQ+L29vbV9hZGogc2V0IHRvIC0xNyBwcm90ZWN0cyBmcm9tIHRoZSBvb20ta2lsbGVyICovCisjZGVmaW5lIE9PTV9ESVNBQkxFICgtMTcpCisvKiBpbmNsdXNpdmUgKi8KKyNkZWZpbmUgT09NX0FESlVTVF9NSU4gKC0xNikKKyNkZWZpbmUgT09NX0FESlVTVF9NQVggMTUKKworI2VuZGlmIC8qIF9JTkNMVURFX0xJTlVYX09PTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcmFtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyZTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFyYW0uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0xJTlVYX1BBUkFNX0gKKyNkZWZpbmUgX0xJTlVYX1BBUkFNX0gKKworI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFycG9ydC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MmE3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGFycG9ydC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qICRJZDogcGFycG9ydC5oLHYgMS4xIDE5OTgvMDUvMTcgMTA6NTc6NTIgYW5kcmVhIEV4cCBhbmRyZWEgJCAqLworCisvKgorICogQW55IHBhcnQgb2YgdGhpcyBwcm9ncmFtIG1heSBiZSB1c2VkIGluIGRvY3VtZW50cyBsaWNlbnNlZCB1bmRlcgorICogdGhlIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgVmVyc2lvbiAxLjEgb3IgYW55IGxhdGVyIHZlcnNpb24KKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1BBUlBPUlRfSF8KKyNkZWZpbmUgX1BBUlBPUlRfSF8KKworLyogU3RhcnQgb2ZmIHdpdGggdXNlci12aXNpYmxlIGNvbnN0YW50cyAqLworCisvKiBNYXhpbXVtIG9mIDE2IHBvcnRzIHBlciBtYWNoaW5lICovCisjZGVmaW5lIFBBUlBPUlRfTUFYICAxNgorCisvKiBNYWdpYyBudW1iZXJzICovCisjZGVmaW5lIFBBUlBPUlRfSVJRX05PTkUgIC0xCisjZGVmaW5lIFBBUlBPUlRfRE1BX05PTkUgIC0xCisjZGVmaW5lIFBBUlBPUlRfSVJRX0FVVE8gIC0yCisjZGVmaW5lIFBBUlBPUlRfRE1BX0FVVE8gIC0yCisjZGVmaW5lIFBBUlBPUlRfRE1BX05PRklGTyAtMworI2RlZmluZSBQQVJQT1JUX0RJU0FCTEUgICAtMgorI2RlZmluZSBQQVJQT1JUX0lSUV9QUk9CRU9OTFkgLTMKKyNkZWZpbmUgUEFSUE9SVF9JT0hJX0FVVE8gLTEKKworI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfU1RST0JFICAgIDB4MQorI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfQVVUT0ZEICAgIDB4MgorI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfSU5JVCAgICAgIDB4NAorI2RlZmluZSBQQVJQT1JUX0NPTlRST0xfU0VMRUNUICAgIDB4OAorCisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX0VSUk9SICAgICAgMHg4CisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX1NFTEVDVCAgICAgMHgxMAorI2RlZmluZSBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCAgIDB4MjAKKyNkZWZpbmUgUEFSUE9SVF9TVEFUVVNfQUNLICAgICAgICAweDQwCisjZGVmaW5lIFBBUlBPUlRfU1RBVFVTX0JVU1kgICAgICAgMHg4MAorCisvKiBUeXBlIGNsYXNzZXMgZm9yIFBsdWctYW5kLVBsYXkgcHJvYmUuICAqLwordHlwZWRlZiBlbnVtIHsKKwlQQVJQT1JUX0NMQVNTX0xFR0FDWSA9IDAsICAgICAgIC8qIE5vbi1JRUVFMTI4NCBkZXZpY2UgKi8KKwlQQVJQT1JUX0NMQVNTX1BSSU5URVIsCisJUEFSUE9SVF9DTEFTU19NT0RFTSwKKwlQQVJQT1JUX0NMQVNTX05FVCwKKwlQQVJQT1JUX0NMQVNTX0hEQywgICAgICAgICAgICAgIC8qIEhhcmQgZGlzayBjb250cm9sbGVyICovCisJUEFSUE9SVF9DTEFTU19QQ01DSUEsCisJUEFSUE9SVF9DTEFTU19NRURJQSwgICAgICAgICAgICAvKiBNdWx0aW1lZGlhIGRldmljZSAqLworCVBBUlBPUlRfQ0xBU1NfRkRDLCAgICAgICAgICAgICAgLyogRmxvcHB5IGRpc2sgY29udHJvbGxlciAqLworCVBBUlBPUlRfQ0xBU1NfUE9SVFMsCisJUEFSUE9SVF9DTEFTU19TQ0FOTkVSLAorCVBBUlBPUlRfQ0xBU1NfRElHQ0FNLAorCVBBUlBPUlRfQ0xBU1NfT1RIRVIsICAgICAgICAgICAgLyogQW55dGhpbmcgZWxzZSAqLworCVBBUlBPUlRfQ0xBU1NfVU5TUEVDLCAgICAgICAgICAgLyogTm8gQ0xTIGZpZWxkIGluIElEICovCisJUEFSUE9SVF9DTEFTU19TQ1NJQURBUFRFUgorfSBwYXJwb3J0X2RldmljZV9jbGFzczsKKworLyogVGhlICJtb2RlcyIgZW50cnkgaW4gcGFycG9ydCBpcyBhIGJpdCBmaWVsZCByZXByZXNlbnRpbmcgdGhlCisgICBjYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfUENTUFAJKDE8PDApIC8qIElCTSBQQyByZWdpc3RlcnMgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfVFJJU1RBVEUJKDE8PDEpIC8qIENhbiB0cmlzdGF0ZS4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX0VQUAkoMTw8MikgLyogSGFyZHdhcmUgRVBQLiAqLworI2RlZmluZSBQQVJQT1JUX01PREVfRUNQCSgxPDwzKSAvKiBIYXJkd2FyZSBFQ1AuICovCisjZGVmaW5lIFBBUlBPUlRfTU9ERV9DT01QQVQJKDE8PDQpIC8qIEhhcmR3YXJlICdwcmludGVyIHByb3RvY29sJy4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX0RNQQkoMTw8NSkgLyogSGFyZHdhcmUgY2FuIERNQS4gKi8KKyNkZWZpbmUgUEFSUE9SVF9NT0RFX1NBRkVJTklOVAkoMTw8NikgLyogU1BQIHJlZ2lzdGVycyBhY2Nlc3NpYmxlIGluIElSUS4gKi8KKworLyogSUVFRTEyODQgbW9kZXM6IAorICAgTmliYmxlIG1vZGUsIGJ5dGUgbW9kZSwgRUNQLCBFQ1BSTEUgYW5kIEVQUCBhcmUgdGhlaXIgb3duCisgICAnZXh0ZW5zaWJpbGl0eSByZXF1ZXN0JyB2YWx1ZXMuICBPdGhlcnMgYXJlIHNwZWNpYWwuCisgICAnUmVhbCcgRUNQIG1vZGVzIG11c3QgaGF2ZSB0aGUgSUVFRTEyODRfTU9ERV9FQ1AgYml0IHNldC4gICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfTklCQkxFICAgICAgICAgICAgIDAKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9CWVRFICAgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9DT01QQVQgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9CRUNQICAgICAgICAgICAgICAoMTw8OSkgLyogQm91bmRlZCBFQ1AgbW9kZSAqLworI2RlZmluZSBJRUVFMTI4NF9NT0RFX0VDUCAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBJRUVFMTI4NF9NT0RFX0VDUFJMRSAgICAgICAgICAgIChJRUVFMTI4NF9NT0RFX0VDUCB8ICgxPDw1KSkKKyNkZWZpbmUgSUVFRTEyODRfTU9ERV9FQ1BTV0UgICAgICAgICAgICAoMTw8MTApIC8qIFNvZnR3YXJlLWVtdWxhdGVkICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfRVBQICAgICAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIElFRUUxMjg0X01PREVfRVBQU0wgICAgICAgICAgICAgKDE8PDExKSAvKiBFUFAgMS43ICovCisjZGVmaW5lIElFRUUxMjg0X01PREVfRVBQU1dFICAgICAgICAgICAgKDE8PDEyKSAvKiBTb2Z0d2FyZS1lbXVsYXRlZCAqLworI2RlZmluZSBJRUVFMTI4NF9ERVZJQ0VJRCAgICAgICAgICAgICAgICgxPDwyKSAgLyogVGhpcyBpcyBhIGZsYWcgKi8KKyNkZWZpbmUgSUVFRTEyODRfRVhUX0xJTksgICAgICAgICAgICAgICAoMTw8MTQpIC8qIFRoaXMgZmxhZyBjYXVzZXMgdGhlCisJCQkJCQkgKiBleHRlbnNpYmlsaXR5IGxpbmsgdG8KKwkJCQkJCSAqIGJlIHJlcXVlc3RlZCwgdXNpbmcKKwkJCQkJCSAqIGJpdHMgMC02LiAqLworCisvKiBGb3IgdGhlIGJlbmVmaXQgb2YgcGFycG9ydF9yZWFkL3dyaXRlLCB5b3UgY2FuIHVzZSB0aGVzZSB3aXRoCisgKiBwYXJwb3J0X25lZ290aWF0ZSB0byB1c2UgYWRkcmVzcyBvcGVyYXRpb25zLiAgVGhleSBoYXZlIG5vIGVmZmVjdAorICogb3RoZXIgdGhhbiB0byBtYWtlIHBhcnBvcnRfcmVhZC93cml0ZSB1c2UgYWRkcmVzcyB0cmFuc2ZlcnMuICovCisjZGVmaW5lIElFRUUxMjg0X0FERFIJCQkoMTw8MTMpCS8qIFRoaXMgaXMgYSBmbGFnICovCisjZGVmaW5lIElFRUUxMjg0X0RBVEEJCQkgMAkvKiBTbyBpcyB0aGlzICovCisKKy8qIEZsYWdzIGZvciBibG9jayB0cmFuc2ZlciBvcGVyYXRpb25zLiAqLworI2RlZmluZSBQQVJQT1JUX0VQUF9GQVNUCQkoMTw8MCkgLyogVW5yZWxpYWJsZSBjb3VudHMuICovCisjZGVmaW5lIFBBUlBPUlRfVzkxMjg0UElDCQkoMTw8MSkgLyogaGF2ZSBhIFdhcnA5IHc5MTI4NHBpYyBpbiB0aGUgZGV2aWNlICovCisKKy8qIFRoZSByZXN0IGlzIGZvciB0aGUga2VybmVsIG9ubHkgKi8KKyNlbmRpZiAvKiBfUEFSUE9SVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXRjaGtleS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wYXRjaGtleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODEwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BhdGNoa2V5LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIDxsaW51eC9wYXRjaGtleS5oPiAtLSBkZWZpbml0aW9uIG9mIF9QQVRDSEtFWSBtYWNybworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBTdHVhcnQgQnJhZHkKKyAqCisgKiBUaGlzIGV4aXN0cyBiZWNhdXNlIGF3ZV92b2ljZS5oIGRlZmluZWQgaXRzIG93biBfUEFUQ0hLRVkgYW5kIGl0IHdhc24ndAorICogY2xlYXIgd2hldGhlciByZW1vdmluZyB0aGlzIHdvdWxkIGJyZWFrIGFueXRoaW5nIGluIHVzZXJzcGFjZS4KKyAqCisgKiBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuICBQbGVhc2UgdXNlIDxzeXMvc291bmRjYXJkLmg+IGluc3RlYWQuCisgKiBGb3Iga2VybmVsIGNvZGUsIHVzZSA8bGludXgvc291bmRjYXJkLmg+CisgKi8KKworI2lmbmRlZiBfTElOVVhfUEFUQ0hLRVlfSF9JTkRJUkVDVAorI2Vycm9yICJwYXRjaGtleS5oIGluY2x1ZGVkIGRpcmVjdGx5IgorI2VuZGlmCisKKyNpZm5kZWYgX0xJTlVYX1BBVENIS0VZX0gKKyNkZWZpbmUgX0xJTlVYX1BBVENIS0VZX0gKKworLyogRW5kaWFuIG1hY3Jvcy4gKi8KKyMgIGluY2x1ZGUgPGVuZGlhbi5oPgorCisjaWYgICBkZWZpbmVkKF9fQllURV9PUkRFUikKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgICAgZGVmaW5lIF9QQVRDSEtFWShpZCkgKDB4ZmQwMHxpZCkKKyMgIGVsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgICBkZWZpbmUgX1BBVENIS0VZKGlkKSAoKGlkPDw4KXwweDAwZmQpCisjICBlbHNlCisjICAgIGVycm9yICJjb3VsZCBub3QgZGV0ZXJtaW5lIGJ5dGUgb3JkZXIiCisjICBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfUEFUQ0hLRVlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wY2kuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ODhiNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqCXBjaS5oCisgKgorICoJUENJIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqCUNvcHlyaWdodCAxOTk0LCBEcmV3IEVja2hhcmR0CisgKglDb3B5cmlnaHQgMTk5Ny0tMTk5OSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqCisgKglGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBtYW51YWxzIChsb29rIGF0CisgKglodHRwOi8vd3d3LnBjaXNpZy5jb20vIGZvciBob3cgdG8gZ2V0IHRoZW0pOgorICoKKyAqCVBDSSBCSU9TIFNwZWNpZmljYXRpb24KKyAqCVBDSSBMb2NhbCBCdXMgU3BlY2lmaWNhdGlvbgorICoJUENJIHRvIFBDSSBCcmlkZ2UgU3BlY2lmaWNhdGlvbgorICoJUENJIFN5c3RlbSBEZXNpZ24gR3VpZGUKKyAqLworCisjaWZuZGVmIExJTlVYX1BDSV9ICisjZGVmaW5lIExJTlVYX1BDSV9ICisKKy8qIEluY2x1ZGUgdGhlIHBjaSByZWdpc3RlciBkZWZpbmVzICovCisjaW5jbHVkZSA8bGludXgvcGNpX3JlZ3MuaD4KKworLyoKKyAqIFRoZSBQQ0kgaW50ZXJmYWNlIHRyZWF0cyBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzIGFzIGluZGVwZW5kZW50CisgKiBkZXZpY2VzLiAgVGhlIHNsb3QvZnVuY3Rpb24gYWRkcmVzcyBvZiBlYWNoIGRldmljZSBpcyBlbmNvZGVkCisgKiBpbiBhIHNpbmdsZSBieXRlIGFzIGZvbGxvd3M6CisgKgorICoJNzozID0gc2xvdAorICoJMjowID0gZnVuY3Rpb24KKyAqLworI2RlZmluZSBQQ0lfREVWRk4oc2xvdCxmdW5jKQkoKCgoc2xvdCkgJiAweDFmKSA8PCAzKSB8ICgoZnVuYykgJiAweDA3KSkKKyNkZWZpbmUgUENJX1NMT1QoZGV2Zm4pCQkoKChkZXZmbikgPj4gMykgJiAweDFmKQorI2RlZmluZSBQQ0lfRlVOQyhkZXZmbikJCSgoZGV2Zm4pICYgMHgwNykKKworLyogSW9jdGxzIGZvciAvcHJvYy9idXMvcGNpL1gvWSBub2Rlcy4gKi8KKyNkZWZpbmUgUENJSU9DX0JBU0UJCSgnUCcgPDwgMjQgfCAnQycgPDwgMTYgfCAnSScgPDwgOCkKKyNkZWZpbmUgUENJSU9DX0NPTlRST0xMRVIJKFBDSUlPQ19CQVNFIHwgMHgwMCkJLyogR2V0IGNvbnRyb2xsZXIgZm9yIFBDSSBkZXZpY2UuICovCisjZGVmaW5lIFBDSUlPQ19NTUFQX0lTX0lPCShQQ0lJT0NfQkFTRSB8IDB4MDEpCS8qIFNldCBtbWFwIHN0YXRlIHRvIEkvTyBzcGFjZS4gKi8KKyNkZWZpbmUgUENJSU9DX01NQVBfSVNfTUVNCShQQ0lJT0NfQkFTRSB8IDB4MDIpCS8qIFNldCBtbWFwIHN0YXRlIHRvIE1FTSBzcGFjZS4gKi8KKyNkZWZpbmUgUENJSU9DX1dSSVRFX0NPTUJJTkUJKFBDSUlPQ19CQVNFIHwgMHgwMykJLyogRW5hYmxlL2Rpc2FibGUgd3JpdGUtY29tYmluaW5nLiAqLworCisjZW5kaWYgLyogTElOVVhfUENJX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTkxNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICoJcGNpX3JlZ3MuaAorICoKKyAqCVBDSSBzdGFuZGFyZCBkZWZpbmVzCisgKglDb3B5cmlnaHQgMTk5NCwgRHJldyBFY2toYXJkdAorICoJQ29weXJpZ2h0IDE5OTctLTE5OTkgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKgorICoJRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IHRoZSBmb2xsb3dpbmcgbWFudWFscyAobG9vayBhdAorICoJaHR0cDovL3d3dy5wY2lzaWcuY29tLyBmb3IgaG93IHRvIGdldCB0aGVtKToKKyAqCisgKglQQ0kgQklPUyBTcGVjaWZpY2F0aW9uCisgKglQQ0kgTG9jYWwgQnVzIFNwZWNpZmljYXRpb24KKyAqCVBDSSB0byBQQ0kgQnJpZGdlIFNwZWNpZmljYXRpb24KKyAqCVBDSSBTeXN0ZW0gRGVzaWduIEd1aWRlCisgKgorICogCUZvciBoeXBlcnRyYW5zcG9ydCBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBtYW51YWxzCisgKiAJZnJvbSBodHRwOi8vd3d3Lmh5cGVydHJhbnNwb3J0Lm9yZworICoKKyAqCVRoZSBIeXBlcnRyYW5zcG9ydCBJL08gTGluayBTcGVjaWZpY2F0aW9uCisgKi8KKworI2lmbmRlZiBMSU5VWF9QQ0lfUkVHU19ICisjZGVmaW5lIExJTlVYX1BDSV9SRUdTX0gKKworLyoKKyAqIFVuZGVyIFBDSSwgZWFjaCBkZXZpY2UgaGFzIDI1NiBieXRlcyBvZiBjb25maWd1cmF0aW9uIGFkZHJlc3Mgc3BhY2UsCisgKiBvZiB3aGljaCB0aGUgZmlyc3QgNjQgYnl0ZXMgYXJlIHN0YW5kYXJkaXplZCBhcyBmb2xsb3dzOgorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSUQJCTB4MDAJLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lECQkweDAyCS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkQJCTB4MDQJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU8JCTB4MQkvKiBFbmFibGUgcmVzcG9uc2UgaW4gSS9PIHNwYWNlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9NRU1PUlkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBNZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX01BU1RFUgkweDQJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1NQRUNJQUwJMHg4CS8qIEVuYWJsZSByZXNwb25zZSB0byBzcGVjaWFsIGN5Y2xlcyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU5WQUxJREFURQkweDEwCS8qIFVzZSBtZW1vcnkgd3JpdGUgYW5kIGludmFsaWRhdGUgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1ZHQV9QQUxFVFRFIDB4MjAJLyogRW5hYmxlIHBhbGV0dGUgc25vb3BpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1BBUklUWQkweDQwCS8qIEVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKyNkZWZpbmUgIFBDSV9DT01NQU5EX1dBSVQgCTB4ODAJLyogRW5hYmxlIGFkZHJlc3MvZGF0YSBzdGVwcGluZyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfU0VSUgkweDEwMAkvKiBFbmFibGUgU0VSUiAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfRkFTVF9CQUNLCTB4MjAwCS8qIEVuYWJsZSBiYWNrLXRvLWJhY2sgd3JpdGVzICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUgMHg0MDAgLyogSU5UeCBFbXVsYXRpb24gRGlzYWJsZSAqLworCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX1NUQVRVU19DQVBfTElTVAkweDEwCS8qIFN1cHBvcnQgQ2FwYWJpbGl0eSBMaXN0ICovCisjZGVmaW5lICBQQ0lfU1RBVFVTXzY2TUhaCTB4MjAJLyogU3VwcG9ydCA2NiBNaHogUENJIDIuMSBidXMgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfVURGCQkweDQwCS8qIFN1cHBvcnQgVXNlciBEZWZpbmFibGUgRmVhdHVyZXMgW29ic29sZXRlXSAqLworI2RlZmluZSAgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHg4MAkvKiBBY2NlcHQgZmFzdC1iYWNrIHRvIGJhY2sgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUEFSSVRZCTB4MTAwCS8qIERldGVjdGVkIHBhcml0eSBlcnJvciAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUFTSwkweDYwMAkvKiBERVZTRUwgdGltaW5nICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9GQVNUCQkweDAwMAorI2RlZmluZSAgUENJX1NUQVRVU19ERVZTRUxfTUVESVVNCTB4MjAwCisjZGVmaW5lICBQQ0lfU1RBVFVTX0RFVlNFTF9TTE9XCQkweDQwMAorI2RlZmluZSAgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUCTB4ODAwIC8qIFNldCBvbiB0YXJnZXQgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVAkweDEwMDAgLyogTWFzdGVyIGFjayBvZiAiICovCisjZGVmaW5lICBQQ0lfU1RBVFVTX1JFQ19NQVNURVJfQUJPUlQJMHgyMDAwIC8qIFNldCBvbiBtYXN0ZXIgYWJvcnQgKi8KKyNkZWZpbmUgIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUgkweDQwMDAgLyogU2V0IHdoZW4gd2UgZHJpdmUgU0VSUiAqLworI2RlZmluZSAgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkJMHg4MDAwIC8qIFNldCBvbiBwYXJpdHkgZXJyb3IgKi8KKworI2RlZmluZSBQQ0lfQ0xBU1NfUkVWSVNJT04JMHgwOAkvKiBIaWdoIDI0IGJpdHMgYXJlIGNsYXNzLCBsb3cgOCByZXZpc2lvbiAqLworI2RlZmluZSBQQ0lfUkVWSVNJT05fSUQJCTB4MDgJLyogUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgUENJX0NMQVNTX1BST0cJCTB4MDkJLyogUmVnLiBMZXZlbCBQcm9ncmFtbWluZyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgUENJX0NMQVNTX0RFVklDRQkweDBhCS8qIERldmljZSBjbGFzcyAqLworCisjZGVmaW5lIFBDSV9DQUNIRV9MSU5FX1NJWkUJMHgwYwkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0xBVEVOQ1lfVElNRVIJMHgwZAkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0hFQURFUl9UWVBFCQkweDBlCS8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX05PUk1BTAkJMAorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRQkJMQorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0NBUkRCVVMJMgorCisjZGVmaW5lIFBDSV9CSVNUCQkweDBmCS8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0JJU1RfQ09ERV9NQVNLCTB4MGYJLyogUmV0dXJuIHJlc3VsdCAqLworI2RlZmluZSAgUENJX0JJU1RfU1RBUlQJCTB4NDAJLyogMSB0byBzdGFydCBCSVNULCAyIHNlY3Mgb3IgbGVzcyAqLworI2RlZmluZSAgUENJX0JJU1RfQ0FQQUJMRQkweDgwCS8qIDEgaWYgQklTVCBjYXBhYmxlICovCisKKy8qCisgKiBCYXNlIGFkZHJlc3NlcyBzcGVjaWZ5IGxvY2F0aW9ucyBpbiBtZW1vcnkgb3IgSS9PIHNwYWNlLgorICogRGVjb2RlZCBzaXplIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHdyaXRpbmcgYSB2YWx1ZSBvZgorICogMHhmZmZmZmZmZiB0byB0aGUgcmVnaXN0ZXIsIGFuZCByZWFkaW5nIGl0IGJhY2suICBPbmx5CisgKiAxIGJpdHMgYXJlIGRlY29kZWQuCisgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18wCTB4MTAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEJMHgxNAkvKiAzMiBiaXRzIFtodHlwZSAwLDEgb25seV0gKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18yCTB4MTgJLyogMzIgYml0cyBbaHR5cGUgMCBvbmx5XSAqLworI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzMJMHgxYwkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNAkweDIwCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX0JBU0VfQUREUkVTU181CTB4MjQJLyogMzIgYml0cyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRQkJMHgwMQkvKiAwID0gbWVtb3J5LCAxID0gSS9PICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPCTB4MDEKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZCTB4MDAKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSwkweDA2CisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyCTB4MDAJLyogMzIgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU0JMHgwMgkvKiBCZWxvdyAxTSBbb2Jzb2xldGVdICovCisjZGVmaW5lICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0CTB4MDQJLyogNjQgYml0IGFkZHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENICTB4MDgJLyogcHJlZmV0Y2hhYmxlPyAqLworI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSwkofjB4MDNVTCkKKy8qIGJpdCAxIGlzIHJlc2VydmVkIGlmIGFkZHJlc3Nfc3BhY2UgPSAxICovCisKKy8qIEhlYWRlciB0eXBlIDAgKG5vcm1hbCBkZXZpY2VzKSAqLworI2RlZmluZSBQQ0lfQ0FSREJVU19DSVMJCTB4MjgKKyNkZWZpbmUgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHgyYworI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lECTB4MmUKKyNkZWZpbmUgUENJX1JPTV9BRERSRVNTCQkweDMwCS8qIEJpdHMgMzEuLjExIGFyZSBhZGRyZXNzLCAxMC4uMSByZXNlcnZlZCAqLworI2RlZmluZSAgUENJX1JPTV9BRERSRVNTX0VOQUJMRQkweDAxCisjZGVmaW5lIFBDSV9ST01fQUREUkVTU19NQVNLCSh+MHg3ZmZVTCkKKworI2RlZmluZSBQQ0lfQ0FQQUJJTElUWV9MSVNUCTB4MzQJLyogT2Zmc2V0IG9mIGZpcnN0IGNhcGFiaWxpdHkgbGlzdCBlbnRyeSAqLworCisvKiAweDM1LTB4M2IgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfTElORQkweDNjCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfSU5URVJSVVBUX1BJTgkweDNkCS8qIDggYml0cyAqLworI2RlZmluZSBQQ0lfTUlOX0dOVAkJMHgzZQkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX01BWF9MQVQJCTB4M2YJLyogOCBiaXRzICovCisKKy8qIEhlYWRlciB0eXBlIDEgKFBDSS10by1QQ0kgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX1BSSU1BUllfQlVTCQkweDE4CS8qIFByaW1hcnkgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfU0VDT05EQVJZX0JVUwkweDE5CS8qIFNlY29uZGFyeSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBIaWdoZXN0IGJ1cyBudW1iZXIgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX1NFQ19MQVRFTkNZX1RJTUVSCTB4MWIJLyogTGF0ZW5jeSB0aW1lciBmb3Igc2Vjb25kYXJ5IGludGVyZmFjZSAqLworI2RlZmluZSBQQ0lfSU9fQkFTRQkJMHgxYwkvKiBJL08gcmFuZ2UgYmVoaW5kIHRoZSBicmlkZ2UgKi8KKyNkZWZpbmUgUENJX0lPX0xJTUlUCQkweDFkCisjZGVmaW5lICBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLCTB4MGZVTAkvKiBJL08gYnJpZGdpbmcgdHlwZSAqLworI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMTYJMHgwMAorI2RlZmluZSAgUENJX0lPX1JBTkdFX1RZUEVfMzIJMHgwMQorI2RlZmluZSAgUENJX0lPX1JBTkdFX01BU0sJKH4weDBmVUwpCisjZGVmaW5lIFBDSV9TRUNfU1RBVFVTCQkweDFlCS8qIFNlY29uZGFyeSBzdGF0dXMgcmVnaXN0ZXIsIG9ubHkgYml0IDE0IHVzZWQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9CQVNFCQkweDIwCS8qIE1lbW9yeSByYW5nZSBiZWhpbmQgKi8KKyNkZWZpbmUgUENJX01FTU9SWV9MSU1JVAkweDIyCisjZGVmaW5lICBQQ0lfTUVNT1JZX1JBTkdFX1RZUEVfTUFTSyAweDBmVUwKKyNkZWZpbmUgIFBDSV9NRU1PUllfUkFOR0VfTUFTSwkofjB4MGZVTCkKKyNkZWZpbmUgUENJX1BSRUZfTUVNT1JZX0JBU0UJMHgyNAkvKiBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlIGJlaGluZCAqLworI2RlZmluZSBQQ0lfUFJFRl9NRU1PUllfTElNSVQJMHgyNgorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV9NQVNLIDB4MGZVTAorI2RlZmluZSAgUENJX1BSRUZfUkFOR0VfVFlQRV8zMgkweDAwCisjZGVmaW5lICBQQ0lfUFJFRl9SQU5HRV9UWVBFXzY0CTB4MDEKKyNkZWZpbmUgIFBDSV9QUkVGX1JBTkdFX01BU0sJKH4weDBmVUwpCisjZGVmaW5lIFBDSV9QUkVGX0JBU0VfVVBQRVIzMgkweDI4CS8qIFVwcGVyIGhhbGYgb2YgcHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZSAqLworI2RlZmluZSBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyCTB4MmMKKyNkZWZpbmUgUENJX0lPX0JBU0VfVVBQRVIxNgkweDMwCS8qIFVwcGVyIGhhbGYgb2YgSS9PIGFkZHJlc3NlcyAqLworI2RlZmluZSBQQ0lfSU9fTElNSVRfVVBQRVIxNgkweDMyCisvKiAweDM0IHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKy8qIDB4MzUtMHgzYiBpcyByZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUk9NX0FERFJFU1MxCTB4MzgJLyogU2FtZSBhcyBQQ0lfUk9NX0FERFJFU1MsIGJ1dCBmb3IgaHR5cGUgMSAqLworLyogMHgzYy0weDNkIGFyZSBzYW1lIGFzIGZvciBodHlwZSAwICovCisjZGVmaW5lIFBDSV9CUklER0VfQ09OVFJPTAkweDNlCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9QQVJJVFkJMHgwMQkvKiBFbmFibGUgcGFyaXR5IGRldGVjdGlvbiBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9TRVJSCTB4MDIJLyogVGhlIHNhbWUgZm9yIFNFUlIgZm9yd2FyZGluZyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfSVNBCTB4MDQJLyogRW5hYmxlIElTQSBtb2RlICovCisjZGVmaW5lICBQQ0lfQlJJREdFX0NUTF9WR0EJMHgwOAkvKiBGb3J3YXJkIFZHQSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFBDSV9CUklER0VfQ1RMX01BU1RFUl9BQk9SVAkweDIwICAvKiBSZXBvcnQgbWFzdGVyIGFib3J0cyAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfQlVTX1JFU0VUCTB4NDAJLyogU2Vjb25kYXJ5IGJ1cyByZXNldCAqLworI2RlZmluZSAgUENJX0JSSURHRV9DVExfRkFTVF9CQUNLCTB4ODAJLyogRmFzdCBCYWNrMkJhY2sgZW5hYmxlZCBvbiBzZWNvbmRhcnkgaW50ZXJmYWNlICovCisKKy8qIEhlYWRlciB0eXBlIDIgKENhcmRCdXMgYnJpZGdlcykgKi8KKyNkZWZpbmUgUENJX0NCX0NBUEFCSUxJVFlfTElTVAkweDE0CisvKiAweDE1IHJlc2VydmVkICovCisjZGVmaW5lIFBDSV9DQl9TRUNfU1RBVFVTCTB4MTYJLyogU2Vjb25kYXJ5IHN0YXR1cyAqLworI2RlZmluZSBQQ0lfQ0JfUFJJTUFSWV9CVVMJMHgxOAkvKiBQQ0kgYnVzIG51bWJlciAqLworI2RlZmluZSBQQ0lfQ0JfQ0FSRF9CVVMJCTB4MTkJLyogQ2FyZEJ1cyBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9DQl9TVUJPUkRJTkFURV9CVVMJMHgxYQkvKiBTdWJvcmRpbmF0ZSBidXMgbnVtYmVyICovCisjZGVmaW5lIFBDSV9DQl9MQVRFTkNZX1RJTUVSCTB4MWIJLyogQ2FyZEJ1cyBsYXRlbmN5IHRpbWVyICovCisjZGVmaW5lIFBDSV9DQl9NRU1PUllfQkFTRV8wCTB4MWMKKyNkZWZpbmUgUENJX0NCX01FTU9SWV9MSU1JVF8wCTB4MjAKKyNkZWZpbmUgUENJX0NCX01FTU9SWV9CQVNFXzEJMHgyNAorI2RlZmluZSBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEJMHgyOAorI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8wCTB4MmMKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMF9ISQkweDJlCisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8wCTB4MzAKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzBfSEkJMHgzMgorI2RlZmluZSBQQ0lfQ0JfSU9fQkFTRV8xCTB4MzQKKyNkZWZpbmUgUENJX0NCX0lPX0JBU0VfMV9ISQkweDM2CisjZGVmaW5lIFBDSV9DQl9JT19MSU1JVF8xCTB4MzgKKyNkZWZpbmUgUENJX0NCX0lPX0xJTUlUXzFfSEkJMHgzYQorI2RlZmluZSAgUENJX0NCX0lPX1JBTkdFX01BU0sJKH4weDAzVUwpCisvKiAweDNjLTB4M2QgYXJlIHNhbWUgYXMgZm9yIGh0eXBlIDAgKi8KKyNkZWZpbmUgUENJX0NCX0JSSURHRV9DT05UUk9MCTB4M2UKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BBUklUWQkweDAxCS8qIFNpbWlsYXIgdG8gc3RhbmRhcmQgYnJpZGdlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1NFUlIJCTB4MDIKKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX0lTQQkJMHgwNAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfVkdBCQkweDA4CisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9NQVNURVJfQUJPUlQJMHgyMAorI2RlZmluZSAgUENJX0NCX0JSSURHRV9DVExfQ0JfUkVTRVQJMHg0MAkvKiBDYXJkQnVzIHJlc2V0ICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF8xNkJJVF9JTlQJMHg4MAkvKiBFbmFibGUgaW50ZXJydXB0IGZvciAxNi1iaXQgY2FyZHMgKi8KKyNkZWZpbmUgIFBDSV9DQl9CUklER0VfQ1RMX1BSRUZFVENIX01FTTAgMHgxMDAJLyogUHJlZmV0Y2ggZW5hYmxlIGZvciBib3RoIG1lbW9yeSByZWdpb25zICovCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QUkVGRVRDSF9NRU0xIDB4MjAwCisjZGVmaW5lICBQQ0lfQ0JfQlJJREdFX0NUTF9QT1NUX1dSSVRFUwkweDQwMAorI2RlZmluZSBQQ0lfQ0JfU1VCU1lTVEVNX1ZFTkRPUl9JRAkweDQwCisjZGVmaW5lIFBDSV9DQl9TVUJTWVNURU1fSUQJCTB4NDIKKyNkZWZpbmUgUENJX0NCX0xFR0FDWV9NT0RFX0JBU0UJCTB4NDQJLyogMTYtYml0IFBDIENhcmQgbGVnYWN5IG1vZGUgYmFzZSBhZGRyZXNzIChFeENhKSAqLworLyogMHg0OC0weDdmIHJlc2VydmVkICovCisKKy8qIENhcGFiaWxpdHkgbGlzdHMgKi8KKworI2RlZmluZSBQQ0lfQ0FQX0xJU1RfSUQJCTAJLyogQ2FwYWJpbGl0eSBJRCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9QTQkJMHgwMQkvKiBQb3dlciBNYW5hZ2VtZW50ICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX0FHUAkJMHgwMgkvKiBBY2NlbGVyYXRlZCBHcmFwaGljcyBQb3J0ICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1ZQRAkJMHgwMwkvKiBWaXRhbCBQcm9kdWN0IERhdGEgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfU0xPVElECTB4MDQJLyogU2xvdCBJZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSAgUENJX0NBUF9JRF9NU0kJCTB4MDUJLyogTWVzc2FnZSBTaWduYWxsZWQgSW50ZXJydXB0cyAqLworI2RlZmluZSAgUENJX0NBUF9JRF9DSFNXUAkweDA2CS8qIENvbXBhY3RQQ0kgSG90U3dhcCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9QQ0lYCTB4MDcJLyogUENJLVggKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfSFQJCTB4MDgJLyogSHlwZXJUcmFuc3BvcnQgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfVk5EUgkweDA5CS8qIFZlbmRvciBzcGVjaWZpYyAqLworI2RlZmluZSAgUENJX0NBUF9JRF9EQkcJCTB4MEEJLyogRGVidWcgcG9ydCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9DQ1JDCTB4MEIJLyogQ29tcGFjdFBDSSBDZW50cmFsIFJlc291cmNlIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfU0hQQyAJMHgwQwkvKiBQQ0kgU3RhbmRhcmQgSG90LVBsdWcgQ29udHJvbGxlciAqLworI2RlZmluZSAgUENJX0NBUF9JRF9TU1ZJRAkweDBECS8qIEJyaWRnZSBzdWJzeXN0ZW0gdmVuZG9yL2RldmljZSBJRCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9BR1AzCTB4MEUJLyogQUdQIFRhcmdldCBQQ0ktUENJIGJyaWRnZSAqLworI2RlZmluZSAgUENJX0NBUF9JRF9FWFAgCTB4MTAJLyogUENJIEV4cHJlc3MgKi8KKyNkZWZpbmUgIFBDSV9DQVBfSURfTVNJWAkweDExCS8qIE1TSS1YICovCisjZGVmaW5lIFBDSV9DQVBfTElTVF9ORVhUCTEJLyogTmV4dCBjYXBhYmlsaXR5IGluIHRoZSBsaXN0ICovCisjZGVmaW5lIFBDSV9DQVBfRkxBR1MJCTIJLyogQ2FwYWJpbGl0eSBkZWZpbmVkIGZsYWdzICgxNiBiaXRzKSAqLworI2RlZmluZSBQQ0lfQ0FQX1NJWkVPRgkJNAorCisvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9QTV9QTUMJCTIJLyogUE0gQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1ZFUl9NQVNLCTB4MDAwNwkvKiBWZXJzaW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1BNRV9DTE9DSwkweDAwMDgJLyogUE1FIGNsb2NrIHJlcXVpcmVkICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX1JFU0VSVkVEICAgIDB4MDAxMCAgLyogUmVzZXJ2ZWQgZmllbGQgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRFNJCQkweDAwMjAJLyogRGV2aWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0FVWF9QT1dFUgkweDAxQzAJLyogQXV4aWxsaWFyeSBwb3dlciBzdXBwb3J0IG1hc2sgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfRDEJCTB4MDIwMAkvKiBEMSBwb3dlciBzdGF0ZSBzdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfUE1fQ0FQX0QyCQkweDA0MDAJLyogRDIgcG93ZXIgc3RhdGUgc3VwcG9ydCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUUJCTB4MDgwMAkvKiBQTUUgcGluIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX1BNX0NBUF9QTUVfTUFTSwkweEY4MDAJLyogUE1FIE1hc2sgb2YgYWxsIHN1cHBvcnRlZCBzdGF0ZXMgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QwCTB4MDgwMAkvKiBQTUUjIGZyb20gRDAgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QxCTB4MTAwMAkvKiBQTUUjIGZyb20gRDEgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QyCTB4MjAwMAkvKiBQTUUjIGZyb20gRDIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzCTB4NDAwMAkvKiBQTUUjIGZyb20gRDMgKGhvdCkgKi8KKyNkZWZpbmUgIFBDSV9QTV9DQVBfUE1FX0QzY29sZAkweDgwMDAJLyogUE1FIyBmcm9tIEQzIChjb2xkKSAqLworI2RlZmluZSBQQ0lfUE1fQ1RSTAkJNAkvKiBQTSBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX1NUQVRFX01BU0sJMHgwMDAzCS8qIEN1cnJlbnQgcG93ZXIgc3RhdGUgKEQwIHRvIEQzKSAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfTk9fU09GVF9SRVNFVAkweDAwMDQJLyogTm8gcmVzZXQgZm9yIEQzaG90LT5EMCAqLworI2RlZmluZSAgUENJX1BNX0NUUkxfUE1FX0VOQUJMRQkweDAxMDAJLyogUE1FIHBpbiBlbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX0RBVEFfU0VMX01BU0sJMHgxZTAwCS8qIERhdGEgc2VsZWN0ICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9DVFJMX0RBVEFfU0NBTEVfTUFTSwkweDYwMDAJLyogRGF0YSBzY2FsZSAoPz8pICovCisjZGVmaW5lICBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTCTB4ODAwMAkvKiBQTUUgcGluIHN0YXR1cyAqLworI2RlZmluZSBQQ0lfUE1fUFBCX0VYVEVOU0lPTlMJNgkvKiBQUEIgc3VwcG9ydCBleHRlbnNpb25zICg/PykgKi8KKyNkZWZpbmUgIFBDSV9QTV9QUEJfQjJfQjMJMHg0MAkvKiBTdG9wIGNsb2NrIHdoZW4gaW4gRDNob3QgKD8/KSAqLworI2RlZmluZSAgUENJX1BNX0JQQ0NfRU5BQkxFCTB4ODAJLyogQnVzIHBvd2VyL2Nsb2NrIGNvbnRyb2wgZW5hYmxlICg/PykgKi8KKyNkZWZpbmUgUENJX1BNX0RBVEFfUkVHSVNURVIJNwkvKiAoPz8pICovCisjZGVmaW5lIFBDSV9QTV9TSVpFT0YJCTgKKworLyogQUdQIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9BR1BfVkVSU0lPTgkJMgkvKiBCQ0QgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUENJX0FHUF9SRlUJCTMJLyogUmVzdCBvZiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIFBDSV9BR1BfU1RBVFVTCQk0CS8qIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUlFfTUFTSwkweGZmMDAwMDAwCS8qIE1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIC0gMSAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfU0JBCTB4MDIwMAkvKiBTaWRlYmFuZCBhZGRyZXNzaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfNjRCSVQJMHgwMDIwCS8qIDY0LWJpdCBhZGRyZXNzaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfRlcJMHgwMDEwCS8qIEZXIHRyYW5zZmVycyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgIFBDSV9BR1BfU1RBVFVTX1JBVEU0CTB4MDAwNAkvKiA0eCB0cmFuc2ZlciByYXRlIHN1cHBvcnRlZCAqLworI2RlZmluZSAgUENJX0FHUF9TVEFUVVNfUkFURTIJMHgwMDAyCS8qIDJ4IHRyYW5zZmVyIHJhdGUgc3VwcG9ydGVkICovCisjZGVmaW5lICBQQ0lfQUdQX1NUQVRVU19SQVRFMQkweDAwMDEJLyogMXggdHJhbnNmZXIgcmF0ZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX0FHUF9DT01NQU5ECQk4CS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9SUV9NQVNLIDB4ZmYwMDAwMDAgIC8qIE1hc3RlcjogTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9TQkEJMHgwMjAwCS8qIFNpZGViYW5kIGFkZHJlc3NpbmcgZW5hYmxlZCAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX0FHUAkweDAxMDAJLyogQWxsb3cgcHJvY2Vzc2luZyBvZiBBR1AgdHJhbnNhY3Rpb25zICovCisjZGVmaW5lICBQQ0lfQUdQX0NPTU1BTkRfNjRCSVQJMHgwMDIwIAkvKiBBbGxvdyBwcm9jZXNzaW5nIG9mIDY0LWJpdCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgIFBDSV9BR1BfQ09NTUFORF9GVwkweDAwMTAgCS8qIEZvcmNlIEZXIHRyYW5zZmVycyAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEU0CTB4MDAwNAkvKiBVc2UgNHggcmF0ZSAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEUyCTB4MDAwMgkvKiBVc2UgMnggcmF0ZSAqLworI2RlZmluZSAgUENJX0FHUF9DT01NQU5EX1JBVEUxCTB4MDAwMQkvKiBVc2UgMXggcmF0ZSAqLworI2RlZmluZSBQQ0lfQUdQX1NJWkVPRgkJMTIKKworLyogVml0YWwgUHJvZHVjdCBEYXRhICovCisKKyNkZWZpbmUgUENJX1ZQRF9BRERSCQkyCS8qIEFkZHJlc3MgdG8gYWNjZXNzICgxNSBiaXRzISkgKi8KKyNkZWZpbmUgIFBDSV9WUERfQUREUl9NQVNLCTB4N2ZmZgkvKiBBZGRyZXNzIG1hc2sgKi8KKyNkZWZpbmUgIFBDSV9WUERfQUREUl9GCQkweDgwMDAJLyogV3JpdGUgMCwgMSBpbmRpY2F0ZXMgY29tcGxldGlvbiAqLworI2RlZmluZSBQQ0lfVlBEX0RBVEEJCTQJLyogMzItYml0cyBvZiBkYXRhIHJldHVybmVkIGhlcmUgKi8KKworLyogU2xvdCBJZGVudGlmaWNhdGlvbiAqLworCisjZGVmaW5lIFBDSV9TSURfRVNSCQkyCS8qIEV4cGFuc2lvbiBTbG90IFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfU0lEX0VTUl9OU0xPVFMJMHgxZgkvKiBOdW1iZXIgb2YgZXhwYW5zaW9uIHNsb3RzIGF2YWlsYWJsZSAqLworI2RlZmluZSAgUENJX1NJRF9FU1JfRklDCTB4MjAJLyogRmlyc3QgSW4gQ2hhc3NpcyBGbGFnICovCisjZGVmaW5lIFBDSV9TSURfQ0hBU1NJU19OUgkzCS8qIENoYXNzaXMgTnVtYmVyICovCisKKy8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUENJX01TSV9GTEFHUwkJMgkvKiBWYXJpb3VzIGZsYWdzICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTXzY0QklUCTB4ODAJLyogNjQtYml0IGFkZHJlc3NlcyBhbGxvd2VkICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX1FTSVpFCTB4NzAJLyogTWVzc2FnZSBxdWV1ZSBzaXplIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfUU1BU0sJMHgwZQkvKiBNYXhpbXVtIHF1ZXVlIHNpemUgYXZhaWxhYmxlICovCisjZGVmaW5lICBQQ0lfTVNJX0ZMQUdTX0VOQUJMRQkweDAxCS8qIE1TSSBmZWF0dXJlIGVuYWJsZWQgKi8KKyNkZWZpbmUgIFBDSV9NU0lfRkxBR1NfTUFTS0JJVAkweDEwMAkvKiA2NC1iaXQgbWFzayBiaXRzIGFsbG93ZWQgKi8KKyNkZWZpbmUgUENJX01TSV9SRlUJCTMJLyogUmVzdCBvZiBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIFBDSV9NU0lfQUREUkVTU19MTwk0CS8qIExvd2VyIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJX01TSV9BRERSRVNTX0hJCTgJLyogVXBwZXIgMzIgYml0cyAoaWYgUENJX01TSV9GTEFHU182NEJJVCBzZXQpICovCisjZGVmaW5lIFBDSV9NU0lfREFUQV8zMgkJOAkvKiAxNiBiaXRzIG9mIGRhdGEgZm9yIDMyLWJpdCBkZXZpY2VzICovCisjZGVmaW5lIFBDSV9NU0lfREFUQV82NAkJMTIJLyogMTYgYml0cyBvZiBkYXRhIGZvciA2NC1iaXQgZGV2aWNlcyAqLworI2RlZmluZSBQQ0lfTVNJX01BU0tfQklUCTE2CS8qIE1hc2sgYml0cyByZWdpc3RlciAqLworCisvKiBNU0ktWCByZWdpc3RlcnMgKHRoZXNlIGFyZSBhdCBvZmZzZXQgUENJX01TSVhfRkxBR1MpICovCisjZGVmaW5lIFBDSV9NU0lYX0ZMQUdTCQkyCisjZGVmaW5lICBQQ0lfTVNJWF9GTEFHU19RU0laRQkweDdGRgorI2RlZmluZSAgUENJX01TSVhfRkxBR1NfRU5BQkxFCSgxIDw8IDE1KQorI2RlZmluZSAgUENJX01TSVhfRkxBR1NfTUFTS0FMTAkoMSA8PCAxNCkKKyNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklSTUFTSwkoNyA8PCAwKQorI2RlZmluZSBQQ0lfTVNJWF9GTEFHU19CSVRNQVNLCSgxIDw8IDApCisKKy8qIENvbXBhY3RQQ0kgSG90c3dhcCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBDSV9DSFNXUF9DU1IJCTIJLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfREhBCQkweDAxCS8qIERldmljZSBIaWRpbmcgQXJtICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfRUlNCQkweDAyCS8qIEVOVU0jIFNpZ25hbCBNYXNrICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfUElFCQkweDA0CS8qIFBlbmRpbmcgSW5zZXJ0IG9yIEV4dHJhY3QgKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9MT08JCTB4MDgJLyogTEVEIE9uIC8gT2ZmICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfUEkJCTB4MzAJLyogUHJvZ3JhbW1pbmcgSW50ZXJmYWNlICovCisjZGVmaW5lICBQQ0lfQ0hTV1BfRVhUCQkweDQwCS8qIEVOVU0jIHN0YXR1cyAtIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUgIFBDSV9DSFNXUF9JTlMJCTB4ODAJLyogRU5VTSMgc3RhdHVzIC0gaW5zZXJ0aW9uICovCisKKy8qIFBDSS1YIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9YX0NNRAkJMgkvKiBNb2RlcyAmIEZlYXR1cmVzICovCisjZGVmaW5lICBQQ0lfWF9DTURfRFBFUlJfRQkweDAwMDEJLyogRGF0YSBQYXJpdHkgRXJyb3IgUmVjb3ZlcnkgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfWF9DTURfRVJPCQkweDAwMDIJLyogRW5hYmxlIFJlbGF4ZWQgT3JkZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzUxMgkweDAwMDAJLyogNTEyIGJ5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzFLCTB4MDAwNAkvKiAxS2J5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzJLCTB4MDAwOAkvKiAyS2J5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9SRUFEXzRLCTB4MDAwYwkvKiA0S2J5dGUgbWF4aW11bSByZWFkIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9NQVhfUkVBRAkweDAwMGMJLyogTWF4IE1lbW9yeSBSZWFkIEJ5dGUgQ291bnQgKi8KKwkJCQkvKiBNYXggIyBvZiBvdXRzdGFuZGluZyBzcGxpdCB0cmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF8xCTB4MDAwMAkvKiBNYXggMSAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzIJMHgwMDEwCS8qIE1heCAyICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfMwkweDAwMjAJLyogTWF4IDMgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF80CTB4MDAzMAkvKiBNYXggNCAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzgJMHgwMDQwCS8qIE1heCA4ICovCisjZGVmaW5lICBQQ0lfWF9DTURfU1BMSVRfMTIJMHgwMDUwCS8qIE1heCAxMiAqLworI2RlZmluZSAgUENJX1hfQ01EX1NQTElUXzE2CTB4MDA2MAkvKiBNYXggMTYgKi8KKyNkZWZpbmUgIFBDSV9YX0NNRF9TUExJVF8zMgkweDAwNzAJLyogTWF4IDMyICovCisjZGVmaW5lICBQQ0lfWF9DTURfTUFYX1NQTElUCTB4MDA3MAkvKiBNYXggT3V0c3RhbmRpbmcgU3BsaXQgVHJhbnNhY3Rpb25zICovCisjZGVmaW5lICBQQ0lfWF9DTURfVkVSU0lPTih4KSAJKCgoeCkgPj4gMTIpICYgMykgLyogVmVyc2lvbiAqLworI2RlZmluZSBQQ0lfWF9TVEFUVVMJCTQJLyogUENJLVggY2FwYWJpbGl0aWVzICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfREVWRk4JMHgwMDAwMDBmZgkvKiBBIGNvcHkgb2YgZGV2Zm4gKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19CVVMJMHgwMDAwZmYwMAkvKiBBIGNvcHkgb2YgYnVzIG5yICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfNjRCSVQJMHgwMDAxMDAwMAkvKiA2NC1iaXQgZGV2aWNlICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfMTMzTUhaCTB4MDAwMjAwMDAJLyogMTMzIE1IeiBjYXBhYmxlICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfU1BMX0RJU0MJMHgwMDA0MDAwMAkvKiBTcGxpdCBDb21wbGV0aW9uIERpc2NhcmRlZCAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX1VOWF9TUEwJMHgwMDA4MDAwMAkvKiBVbmV4cGVjdGVkIFNwbGl0IENvbXBsZXRpb24gKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19DT01QTEVYCTB4MDAxMDAwMDAJLyogRGV2aWNlIENvbXBsZXhpdHkgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19NQVhfUkVBRAkweDAwNjAwMDAwCS8qIERlc2lnbmVkIE1heCBNZW1vcnkgUmVhZCBDb3VudCAqLworI2RlZmluZSAgUENJX1hfU1RBVFVTX01BWF9TUExJVAkweDAzODAwMDAwCS8qIERlc2lnbmVkIE1heCBPdXRzdGFuZGluZyBTcGxpdCBUcmFuc2FjdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU19NQVhfQ1VNCTB4MWMwMDAwMDAJLyogRGVzaWduZWQgTWF4IEN1bXVsYXRpdmUgUmVhZCBTaXplICovCisjZGVmaW5lICBQQ0lfWF9TVEFUVVNfU1BMX0VSUgkweDIwMDAwMDAwCS8qIFJjdmQgU3BsaXQgQ29tcGxldGlvbiBFcnJvciBNc2cgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU18yNjZNSFoJMHg0MDAwMDAwMAkvKiAyNjYgTUh6IGNhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9YX1NUQVRVU181MzNNSFoJMHg4MDAwMDAwMAkvKiA1MzMgTUh6IGNhcGFibGUgKi8KKworLyogUENJIEV4cHJlc3MgY2FwYWJpbGl0eSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTCQkyCS8qIENhcGFiaWxpdGllcyByZWdpc3RlciAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX1ZFUlMJMHgwMDBmCS8qIENhcGFiaWxpdHkgdmVyc2lvbiAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX1RZUEUJMHgwMGYwCS8qIERldmljZS9Qb3J0IHR5cGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9FTkRQT0lOVAkweDAJLyogRXhwcmVzcyBFbmRwb2ludCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX0xFR19FTkQJMHgxCS8qIExlZ2FjeSBFbmRwb2ludCAqLworI2RlZmluZSAgUENJX0VYUF9UWVBFX1JPT1RfUE9SVCAweDQJLyogUm9vdCBQb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX1RZUEVfVVBTVFJFQU0JMHg1CS8qIFVwc3RyZWFtIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNIDB4NgkvKiBEb3duc3RyZWFtIFBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfVFlQRV9QQ0lfQlJJREdFIDB4NwkvKiBQQ0kvUENJLVggQnJpZGdlICovCisjZGVmaW5lIFBDSV9FWFBfRkxBR1NfU0xPVAkweDAxMDAJLyogU2xvdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBQQ0lfRVhQX0ZMQUdTX0lSUQkweDNlMDAJLyogSW50ZXJydXB0IG1lc3NhZ2UgbnVtYmVyICovCisjZGVmaW5lIFBDSV9FWFBfREVWQ0FQCQk0CS8qIERldmljZSBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BBWUxPQUQJMHgwNwkvKiBNYXhfUGF5bG9hZF9TaXplICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9QSEFOVE9NCTB4MTgJLyogUGhhbnRvbSBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0VYVF9UQUcJMHgyMAkvKiBFeHRlbmRlZCB0YWdzICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9MMFMJMHgxYzAJLyogTDBzIEFjY2VwdGFibGUgTGF0ZW5jeSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfTDEJMHhlMDAJLyogTDEgQWNjZXB0YWJsZSBMYXRlbmN5ICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUF9BVE5fQlVUCTB4MTAwMAkvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX0FUTl9JTkQJMHgyMDAwCS8qIEF0dGVudGlvbiBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDQVBfUFdSX0lORAkweDQwMDAJLyogUG93ZXIgSW5kaWNhdG9yIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BXUl9WQUwJMHgzZmMwMDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgVmFsdWUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ0FQX1BXUl9TQ0wJMHhjMDAwMDAwIC8qIFNsb3QgUG93ZXIgTGltaXQgU2NhbGUgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZDVEwJCTgJLyogRGV2aWNlIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0NFUkUJMHgwMDAxCS8qIENvcnJlY3RhYmxlIEVycm9yIFJlcG9ydGluZyBFbi4gKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX05GRVJFCTB4MDAwMgkvKiBOb24tRmF0YWwgRXJyb3IgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfRkVSRQkweDAwMDQJLyogRmF0YWwgRXJyb3IgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfVVJSRQkweDAwMDgJLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCBSZXBvcnRpbmcgRW4uICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVkNUTF9SRUxBWF9FTiAweDAwMTAgLyogRW5hYmxlIHJlbGF4ZWQgb3JkZXJpbmcgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQJMHgwMGUwCS8qIE1heF9QYXlsb2FkX1NpemUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX0VYVF9UQUcJMHgwMTAwCS8qIEV4dGVuZGVkIFRhZyBGaWVsZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWQ1RMX1BIQU5UT00JMHgwMjAwCS8qIFBoYW50b20gRnVuY3Rpb25zIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfQVVYX1BNRQkweDA0MDAJLyogQXV4aWxpYXJ5IFBvd2VyIFBNIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfTk9TTk9PUF9FTiAweDA4MDAgIC8qIEVuYWJsZSBObyBTbm9vcCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZDVExfUkVBRFJRCTB4NzAwMAkvKiBNYXhfUmVhZF9SZXF1ZXN0X1NpemUgKi8KKyNkZWZpbmUgUENJX0VYUF9ERVZTVEEJCTEwCS8qIERldmljZSBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0NFRAkweDAxCS8qIENvcnJlY3RhYmxlIEVycm9yIERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9ORkVECTB4MDIJLyogTm9uLUZhdGFsIEVycm9yIERldGVjdGVkICovCisjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9GRUQJMHgwNAkvKiBGYXRhbCBFcnJvciBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfVVJECTB4MDgJLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCBEZXRlY3RlZCAqLworI2RlZmluZSAgUENJX0VYUF9ERVZTVEFfQVVYUEQJMHgxMAkvKiBBVVggUG93ZXIgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX1RSUE5ECTB4MjAJLyogVHJhbnNhY3Rpb25zIFBlbmRpbmcgKi8KKyNkZWZpbmUgUENJX0VYUF9MTktDQVAJCTEyCS8qIExpbmsgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkxNgkvKiBMaW5rIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTiAweDEwMAkvKiBFbmFibGUgY2xrcmVxICovCisjZGVmaW5lIFBDSV9FWFBfTE5LU1RBCQkxOAkvKiBMaW5rIFN0YXR1cyAqLworI2RlZmluZSBQQ0lfRVhQX1NMVENBUAkJMjAJLyogU2xvdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgUENJX0VYUF9TTFRDVEwJCTI0CS8qIFNsb3QgQ29udHJvbCAqLworI2RlZmluZSBQQ0lfRVhQX1NMVFNUQQkJMjYJLyogU2xvdCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVENUTAkJMjgJLyogUm9vdCBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFQ0VFCTB4MDEJLyogU3lzdGVtIEVycm9yIG9uIENvcnJlY3RhYmxlIEVycm9yICovCisjZGVmaW5lICBQQ0lfRVhQX1JUQ1RMX1NFTkZFRQkweDAyCS8qIFN5c3RlbSBFcnJvciBvbiBOb24tRmF0YWwgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VGRUUJMHgwNAkvKiBTeXN0ZW0gRXJyb3Igb24gRmF0YWwgRXJyb3IgKi8KKyNkZWZpbmUgIFBDSV9FWFBfUlRDVExfUE1FSUUJMHgwOAkvKiBQTUUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9SVENUTF9DUlNTVkUJMHgxMAkvKiBDUlMgU29mdHdhcmUgVmlzaWJpbGl0eSBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VYUF9SVENBUAkJMzAJLyogUm9vdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVFNUQQkJMzIJLyogUm9vdCBTdGF0dXMgKi8KKworLyogRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzIChQQ0ktWCAyLjAgYW5kIEV4cHJlc3MpICovCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEKGhlYWRlcikJCShoZWFkZXIgJiAweDAwMDBmZmZmKQorI2RlZmluZSBQQ0lfRVhUX0NBUF9WRVIoaGVhZGVyKQkJKChoZWFkZXIgPj4gMTYpICYgMHhmKQorI2RlZmluZSBQQ0lfRVhUX0NBUF9ORVhUKGhlYWRlcikJKChoZWFkZXIgPj4gMjApICYgMHhmZmMpCisKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfRVJSCTEKKyNkZWZpbmUgUENJX0VYVF9DQVBfSURfVkMJMgorI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9EU04JMworI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9QV1IJNAorCisvKiBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9TVEFUVVMJNAkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVFJBSU4JMHgwMDAwMDAwMQkvKiBUcmFpbmluZyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfRExQCTB4MDAwMDAwMTAJLyogRGF0YSBMaW5rIFByb3RvY29sICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19QT0lTT05fVExQCTB4MDAwMDEwMDAJLyogUG9pc29uZWQgVExQICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19GQ1AJMHgwMDAwMjAwMAkvKiBGbG93IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX0NPTVBfVElNRQkweDAwMDA0MDAwCS8qIENvbXBsZXRpb24gVGltZW91dCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfQ09NUF9BQk9SVAkweDAwMDA4MDAwCS8qIENvbXBsZXRlciBBYm9ydCAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfVU5YX0NPTVAJMHgwMDAxMDAwMAkvKiBVbmV4cGVjdGVkIENvbXBsZXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1JYX09WRVIJMHgwMDAyMDAwMAkvKiBSZWNlaXZlciBPdmVyZmxvdyAqLworI2RlZmluZSAgUENJX0VSUl9VTkNfTUFMRl9UTFAJMHgwMDA0MDAwMAkvKiBNYWxmb3JtZWQgVExQICovCisjZGVmaW5lICBQQ0lfRVJSX1VOQ19FQ1JDCTB4MDAwODAwMDAJLyogRUNSQyBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfVU5DX1VOU1VQCTB4MDAxMDAwMDAJLyogVW5zdXBwb3J0ZWQgUmVxdWVzdCAqLworI2RlZmluZSBQQ0lfRVJSX1VOQ09SX01BU0sJOAkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIE1hc2sgKi8KKwkvKiBTYW1lIGJpdHMgYXMgYWJvdmUgKi8KKyNkZWZpbmUgUENJX0VSUl9VTkNPUl9TRVZFUgkxMgkvKiBVbmNvcnJlY3RhYmxlIEVycm9yIFNldmVyaXR5ICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfQ09SX1NUQVRVUwkxNgkvKiBDb3JyZWN0YWJsZSBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JDVlIJMHgwMDAwMDAwMQkvKiBSZWNlaXZlciBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX0JBRF9UTFAJMHgwMDAwMDA0MAkvKiBCYWQgVExQIFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfQkFEX0RMTFAJMHgwMDAwMDA4MAkvKiBCYWQgRExMUCBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ09SX1JFUF9ST0xMCTB4MDAwMDAxMDAJLyogUkVQTEFZX05VTSBSb2xsb3ZlciAqLworI2RlZmluZSAgUENJX0VSUl9DT1JfUkVQX1RJTUVSCTB4MDAwMDEwMDAJLyogUmVwbGF5IFRpbWVyIFRpbWVvdXQgKi8KKyNkZWZpbmUgUENJX0VSUl9DT1JfTUFTSwkyMAkvKiBDb3JyZWN0YWJsZSBFcnJvciBNYXNrICovCisJLyogU2FtZSBiaXRzIGFzIGFib3ZlICovCisjZGVmaW5lIFBDSV9FUlJfQ0FQCQkyNAkvKiBBZHZhbmNlZCBFcnJvciBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0ZFUCh4KQkoKHgpICYgMzEpCS8qIEZpcnN0IEVycm9yIFBvaW50ZXIgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0VDUkNfR0VOQwkweDAwMDAwMDIwCS8qIEVDUkMgR2VuZXJhdGlvbiBDYXBhYmxlICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0dFTkUJMHgwMDAwMDA0MAkvKiBFQ1JDIEdlbmVyYXRpb24gRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVJSX0NBUF9FQ1JDX0NIS0MJMHgwMDAwMDA4MAkvKiBFQ1JDIENoZWNrIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FUlJfQ0FQX0VDUkNfQ0hLRQkweDAwMDAwMTAwCS8qIEVDUkMgQ2hlY2sgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FUlJfSEVBREVSX0xPRwkyOAkvKiBIZWFkZXIgTG9nIFJlZ2lzdGVyICgxNiBieXRlcykgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0NPTU1BTkQJNDQJLyogUm9vdCBFcnJvciBDb21tYW5kICovCisvKiBDb3JyZWN0YWJsZSBFcnIgUmVwb3J0aW5nIEVuYWJsZSAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfQ01EX0NPUl9FTgkJMHgwMDAwMDAwMQorLyogTm9uLWZhdGFsIEVyciBSZXBvcnRpbmcgRW5hYmxlICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9DTURfTk9ORkFUQUxfRU4JMHgwMDAwMDAwMgorLyogRmF0YWwgRXJyIFJlcG9ydGluZyBFbmFibGUgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0NNRF9GQVRBTF9FTgkweDAwMDAwMDA0CisjZGVmaW5lIFBDSV9FUlJfUk9PVF9TVEFUVVMJNDgKKyNkZWZpbmUgUENJX0VSUl9ST09UX0NPUl9SQ1YJCTB4MDAwMDAwMDEJLyogRVJSX0NPUiBSZWNlaXZlZCAqLworLyogTXVsdGkgRVJSX0NPUiBSZWNlaXZlZCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfTVVMVElfQ09SX1JDVgkweDAwMDAwMDAyCisvKiBFUlJfRkFUQUwvTk9ORkFUQUwgUmVjZXZpZWQgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX1VOQ09SX1JDVgkJMHgwMDAwMDAwNAorLyogTXVsdGkgRVJSX0ZBVEFML05PTkZBVEFMIFJlY2V2aWVkICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9NVUxUSV9VTkNPUl9SQ1YJMHgwMDAwMDAwOAorI2RlZmluZSBQQ0lfRVJSX1JPT1RfRklSU1RfRkFUQUwJMHgwMDAwMDAxMAkvKiBGaXJzdCBGYXRhbCAqLworI2RlZmluZSBQQ0lfRVJSX1JPT1RfTk9ORkFUQUxfUkNWCTB4MDAwMDAwMjAJLyogTm9uLUZhdGFsIFJlY2VpdmVkICovCisjZGVmaW5lIFBDSV9FUlJfUk9PVF9GQVRBTF9SQ1YJCTB4MDAwMDAwNDAJLyogRmF0YWwgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUENJX0VSUl9ST09UX0NPUl9TUkMJNTIKKyNkZWZpbmUgUENJX0VSUl9ST09UX1NSQwk1NAorCisvKiBWaXJ0dWFsIENoYW5uZWwgKi8KKyNkZWZpbmUgUENJX1ZDX1BPUlRfUkVHMQk0CisjZGVmaW5lIFBDSV9WQ19QT1JUX1JFRzIJOAorI2RlZmluZSBQQ0lfVkNfUE9SVF9DVFJMCTEyCisjZGVmaW5lIFBDSV9WQ19QT1JUX1NUQVRVUwkxNAorI2RlZmluZSBQQ0lfVkNfUkVTX0NBUAkJMTYKKyNkZWZpbmUgUENJX1ZDX1JFU19DVFJMCQkyMAorI2RlZmluZSBQQ0lfVkNfUkVTX1NUQVRVUwkyNgorCisvKiBQb3dlciBCdWRnZXRpbmcgKi8KKyNkZWZpbmUgUENJX1BXUl9EU1IJCTQJLyogRGF0YSBTZWxlY3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1BXUl9EQVRBCQk4CS8qIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9CQVNFKHgpCSgoeCkgJiAweGZmKQkgICAgLyogQmFzZSBQb3dlciAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1NDQUxFKHgpCSgoKHgpID4+IDgpICYgMykgICAgLyogRGF0YSBTY2FsZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1BNX1NVQih4KQkoKCh4KSA+PiAxMCkgJiA3KSAgIC8qIFBNIFN1YiBTdGF0ZSAqLworI2RlZmluZSAgUENJX1BXUl9EQVRBX1BNX1NUQVRFKHgpICgoKHgpID4+IDEzKSAmIDMpIC8qIFBNIFN0YXRlICovCisjZGVmaW5lICBQQ0lfUFdSX0RBVEFfVFlQRSh4KQkoKCh4KSA+PiAxNSkgJiA3KSAgIC8qIFR5cGUgKi8KKyNkZWZpbmUgIFBDSV9QV1JfREFUQV9SQUlMKHgpCSgoKHgpID4+IDE4KSAmIDcpICAgLyogUG93ZXIgUmFpbCAqLworI2RlZmluZSBQQ0lfUFdSX0NBUAkJMTIJLyogQ2FwYWJpbGl0eSAqLworI2RlZmluZSAgUENJX1BXUl9DQVBfQlVER0VUKHgpCSgoeCkgJiAxKQkvKiBJbmNsdWRlZCBpbiBzeXN0ZW0gYnVkZ2V0ICovCisKKy8qCisgKiBIeXBlcnRyYW5zcG9ydCBzdWIgY2FwYWJpbGl0eSB0eXBlcworICoKKyAqIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlIGJvdGggMyBiaXQgYW5kIDUgYml0IGNhcGFiaWxpdHkgdHlwZXMgZGVmaW5lZAorICogaW4gdGhlIEhUIHNwZWMsIGNhdGVyaW5nIGZvciB0aGF0IGlzIGEgbGl0dGxlIG1lc3N5LiBZb3UgcHJvYmFibHkgZG9uJ3QKKyAqIHdhbnQgdG8gdXNlIHRoZXNlIGRpcmVjdGx5LCBqdXN0IHVzZSBwY2lfZmluZF9odF9jYXBhYmlsaXR5KCkgYW5kIGl0CisgKiB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBmb3IgeW91LgorICovCisjZGVmaW5lIEhUXzNCSVRfQ0FQX01BU0sJMHhFMAorI2RlZmluZSBIVF9DQVBUWVBFX1NMQVZFCTB4MDAJLyogU2xhdmUvUHJpbWFyeSBsaW5rIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9IT1NUCQkweDIwCS8qIEhvc3QvU2Vjb25kYXJ5IGxpbmsgY29uZmlndXJhdGlvbiAqLworCisjZGVmaW5lIEhUXzVCSVRfQ0FQX01BU0sJMHhGOAorI2RlZmluZSBIVF9DQVBUWVBFX0lSUQkJMHg4MAkvKiBJUlEgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBIVF9DQVBUWVBFX1JFTUFQUElOR180MAkweEEwCS8qIDQwIGJpdCBhZGRyZXNzIHJlbWFwcGluZyAqLworI2RlZmluZSBIVF9DQVBUWVBFX1JFTUFQUElOR182NCAweEEyCS8qIDY0IGJpdCBhZGRyZXNzIHJlbWFwcGluZyAqLworI2RlZmluZSBIVF9DQVBUWVBFX1VOSVRJRF9DTFVNUAkweDkwCS8qIFVuaXQgSUQgY2x1bXBpbmcgKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9FWFRDT05GCTB4OTgJLyogRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBTcGFjZSBBY2Nlc3MgKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9NU0lfTUFQUElORwkweEE4CS8qIE1TSSBNYXBwaW5nIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIEhUX01TSV9GTEFHUwkJMHgwMgkJLyogT2Zmc2V0IHRvIGZsYWdzICovCisjZGVmaW5lICBIVF9NU0lfRkxBR1NfRU5BQkxFCTB4MQkJLyogTWFwcGluZyBlbmFibGUgKi8KKyNkZWZpbmUgIEhUX01TSV9GTEFHU19GSVhFRAkweDIJCS8qIEZpeGVkIG1hcHBpbmcgb25seSAqLworI2RlZmluZSAgSFRfTVNJX0ZJWEVEX0FERFIJMHgwMDAwMDAwMEZFRTAwMDAwVUxMCS8qIEZpeGVkIGFkZHIgKi8KKyNkZWZpbmUgIEhUX01TSV9BRERSX0xPCQkweDA0CQkvKiBPZmZzZXQgdG8gbG93IGFkZHIgYml0cyAqLworI2RlZmluZSAgSFRfTVNJX0FERFJfTE9fTUFTSwkweEZGRjAwMDAwCS8qIExvdyBhZGRyZXNzIGJpdCBtYXNrICovCisjZGVmaW5lICBIVF9NU0lfQUREUl9ISQkJMHgwOAkJLyogT2Zmc2V0IHRvIGhpZ2ggYWRkciBiaXRzICovCisjZGVmaW5lIEhUX0NBUFRZUEVfRElSRUNUX1JPVVRFCTB4QjAJLyogRGlyZWN0IHJvdXRpbmcgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBIVF9DQVBUWVBFX1ZDU0VUCTB4QjgJLyogVmlydHVhbCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9FUlJPUl9SRVRSWQkweEMwCS8qIFJldHJ5IG9uIGVycm9yIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSFRfQ0FQVFlQRV9HRU4zCQkweEQwCS8qIEdlbmVyYXRpb24gMyBoeXBlcnRyYW5zcG9ydCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEhUX0NBUFRZUEVfUE0JCTB4RTAJLyogSHlwZXJ0cmFuc3BvcnQgcG93ZXJtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gKi8KKworCisjZW5kaWYgLyogTElOVVhfUENJX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMWFiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBfTElOVVhfUEVSU09OQUxJVFlfSAorI2RlZmluZSBfTElOVVhfUEVSU09OQUxJVFlfSAorCisKKy8qCisgKiBGbGFncyBmb3IgYnVnIGVtdWxhdGlvbi4KKyAqCisgKiBUaGVzZSBvY2N1cHkgdGhlIHRvcCB0aHJlZSBieXRlcy4KKyAqLworZW51bSB7CisJQUREUl9OT19SQU5ET01JWkUgPSAJMHgwMDQwMDAwLAkvKiBkaXNhYmxlIHJhbmRvbWl6YXRpb24gb2YgVkEgc3BhY2UgKi8KKwlGRFBJQ19GVU5DUFRSUyA9CTB4MDA4MDAwMCwJLyogdXNlcnNwYWNlIGZ1bmN0aW9uIHB0cnMgcG9pbnQgdG8gZGVzY3JpcHRvcnMKKwkJCQkJCSAqIChzaWduYWwgaGFuZGxpbmcpCisJCQkJCQkgKi8KKwlNTUFQX1BBR0VfWkVSTyA9CTB4MDEwMDAwMCwKKwlBRERSX0NPTVBBVF9MQVlPVVQgPQkweDAyMDAwMDAsCisJUkVBRF9JTVBMSUVTX0VYRUMgPQkweDA0MDAwMDAsCisJQUREUl9MSU1JVF8zMkJJVCA9CTB4MDgwMDAwMCwKKwlTSE9SVF9JTk9ERSA9CQkweDEwMDAwMDAsCisJV0hPTEVfU0VDT05EUyA9CQkweDIwMDAwMDAsCisJU1RJQ0tZX1RJTUVPVVRTCT0JMHg0MDAwMDAwLAorCUFERFJfTElNSVRfM0dCID0gCTB4ODAwMDAwMCwKK307CisKKy8qCisgKiBTZWN1cml0eS1yZWxldmFudCBjb21wYXRpYmlsaXR5IGZsYWdzIHRoYXQgbXVzdCBiZQorICogY2xlYXJlZCB1cG9uIHNldHVpZCBvciBzZXRnaWQgZXhlYzoKKyAqLworI2RlZmluZSBQRVJfQ0xFQVJfT05fU0VUSUQgKFJFQURfSU1QTElFU19FWEVDfEFERFJfTk9fUkFORE9NSVpFKQorCisvKgorICogUGVyc29uYWxpdHkgdHlwZXMuCisgKgorICogVGhlc2UgZ28gaW4gdGhlIGxvdyBieXRlLiAgQXZvaWQgdXNpbmcgdGhlIHRvcCBiaXQsIGl0IHdpbGwKKyAqIGNvbmZsaWN0IHdpdGggZXJyb3IgcmV0dXJucy4KKyAqLworZW51bSB7CisJUEVSX0xJTlVYID0JCTB4MDAwMCwKKwlQRVJfTElOVVhfMzJCSVQgPQkweDAwMDAgfCBBRERSX0xJTUlUXzMyQklULAorCVBFUl9MSU5VWF9GRFBJQyA9CTB4MDAwMCB8IEZEUElDX0ZVTkNQVFJTLAorCVBFUl9TVlI0ID0JCTB4MDAwMSB8IFNUSUNLWV9USU1FT1VUUyB8IE1NQVBfUEFHRV9aRVJPLAorCVBFUl9TVlIzID0JCTB4MDAwMiB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorCVBFUl9TQ09TVlIzID0JCTB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8CisJCQkJCSBXSE9MRV9TRUNPTkRTIHwgU0hPUlRfSU5PREUsCisJUEVSX09TUjUgPQkJMHgwMDAzIHwgU1RJQ0tZX1RJTUVPVVRTIHwgV0hPTEVfU0VDT05EUywKKwlQRVJfV1lTRVYzODYgPQkJMHgwMDA0IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisJUEVSX0lTQ1I0ID0JCTB4MDAwNSB8IFNUSUNLWV9USU1FT1VUUywKKwlQRVJfQlNEID0JCTB4MDAwNiwKKwlQRVJfU1VOT1MgPQkJMHgwMDA2IHwgU1RJQ0tZX1RJTUVPVVRTLAorCVBFUl9YRU5JWCA9CQkweDAwMDcgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKwlQRVJfTElOVVgzMiA9CQkweDAwMDgsCisJUEVSX0xJTlVYMzJfM0dCID0JMHgwMDA4IHwgQUREUl9MSU1JVF8zR0IsCisJUEVSX0lSSVgzMiA9CQkweDAwMDkgfCBTVElDS1lfVElNRU9VVFMsLyogSVJJWDUgMzItYml0ICovCisJUEVSX0lSSVhOMzIgPQkJMHgwMDBhIHwgU1RJQ0tZX1RJTUVPVVRTLC8qIElSSVg2IG5ldyAzMi1iaXQgKi8KKwlQRVJfSVJJWDY0ID0JCTB4MDAwYiB8IFNUSUNLWV9USU1FT1VUUywvKiBJUklYNiA2NC1iaXQgKi8KKwlQRVJfUklTQ09TID0JCTB4MDAwYywKKwlQRVJfU09MQVJJUyA9CQkweDAwMGQgfCBTVElDS1lfVElNRU9VVFMsCisJUEVSX1VXNyA9CQkweDAwMGUgfCBTVElDS1lfVElNRU9VVFMgfCBNTUFQX1BBR0VfWkVSTywKKwlQRVJfT1NGNCA9CQkweDAwMGYsCQkJIC8qIE9TRi8xIHY0ICovCisJUEVSX0hQVVggPQkJMHgwMDEwLAorCVBFUl9NQVNLID0JCTB4MDBmZiwKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9QRVJTT05BTElUWV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGI1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaApAQCAtMCwwICsxLDM1MSBAQAorLyogUEZfS0VZIHVzZXIgaW50ZXJmYWNlLCB0aGlzIGlzIGRlZmluZWQgYnkgcmZjMjM2NyBzbworICogZG8gbm90IG1ha2UgYXJiaXRyYXJ5IG1vZGlmaWNhdGlvbnMgb3IgZWxzZSB0aGlzIGhlYWRlcgorICogZmlsZSB3aWxsIG5vdCBiZSBjb21wbGlhbnQuCisgKi8KKworI2lmbmRlZiBfTElOVVhfUEZLRVkyX0gKKyNkZWZpbmUgX0xJTlVYX1BGS0VZMl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFBGX0tFWV9WMgkJMgorI2RlZmluZSBQRktFWVYyX1JFVklTSU9OCTE5OTgwNkwKKworc3RydWN0IHNhZGJfbXNnIHsKKwl1aW50OF90CQlzYWRiX21zZ192ZXJzaW9uOworCXVpbnQ4X3QJCXNhZGJfbXNnX3R5cGU7CisJdWludDhfdAkJc2FkYl9tc2dfZXJybm87CisJdWludDhfdAkJc2FkYl9tc2dfc2F0eXBlOworCXVpbnQxNl90CXNhZGJfbXNnX2xlbjsKKwl1aW50MTZfdAlzYWRiX21zZ19yZXNlcnZlZDsKKwl1aW50MzJfdAlzYWRiX21zZ19zZXE7CisJdWludDMyX3QJc2FkYl9tc2dfcGlkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpID09IDE2ICovCisKK3N0cnVjdCBzYWRiX2V4dCB7CisJdWludDE2X3QJc2FkYl9leHRfbGVuOworCXVpbnQxNl90CXNhZGJfZXh0X3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2V4dCkgPT0gNCAqLworCitzdHJ1Y3Qgc2FkYl9zYSB7CisJdWludDE2X3QJc2FkYl9zYV9sZW47CisJdWludDE2X3QJc2FkYl9zYV9leHR0eXBlOworCV9fYmUzMgkJc2FkYl9zYV9zcGk7CisJdWludDhfdAkJc2FkYl9zYV9yZXBsYXk7CisJdWludDhfdAkJc2FkYl9zYV9zdGF0ZTsKKwl1aW50OF90CQlzYWRiX3NhX2F1dGg7CisJdWludDhfdAkJc2FkYl9zYV9lbmNyeXB0OworCXVpbnQzMl90CXNhZGJfc2FfZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NhKSA9PSAxNiAqLworCitzdHJ1Y3Qgc2FkYl9saWZldGltZSB7CisJdWludDE2X3QJc2FkYl9saWZldGltZV9sZW47CisJdWludDE2X3QJc2FkYl9saWZldGltZV9leHR0eXBlOworCXVpbnQzMl90CXNhZGJfbGlmZXRpbWVfYWxsb2NhdGlvbnM7CisJdWludDY0X3QJc2FkYl9saWZldGltZV9ieXRlczsKKwl1aW50NjRfdAlzYWRiX2xpZmV0aW1lX2FkZHRpbWU7CisJdWludDY0X3QJc2FkYl9saWZldGltZV91c2V0aW1lOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9saWZldGltZSkgPT0gMzIgKi8KKworc3RydWN0IHNhZGJfYWRkcmVzcyB7CisJdWludDE2X3QJc2FkYl9hZGRyZXNzX2xlbjsKKwl1aW50MTZfdAlzYWRiX2FkZHJlc3NfZXh0dHlwZTsKKwl1aW50OF90CQlzYWRiX2FkZHJlc3NfcHJvdG87CisJdWludDhfdAkJc2FkYl9hZGRyZXNzX3ByZWZpeGxlbjsKKwl1aW50MTZfdAlzYWRiX2FkZHJlc3NfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2FkZHJlc3MpID09IDggKi8KKworc3RydWN0IHNhZGJfa2V5IHsKKwl1aW50MTZfdAlzYWRiX2tleV9sZW47CisJdWludDE2X3QJc2FkYl9rZXlfZXh0dHlwZTsKKwl1aW50MTZfdAlzYWRiX2tleV9iaXRzOworCXVpbnQxNl90CXNhZGJfa2V5X3Jlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9rZXkpID09IDggKi8KKworc3RydWN0IHNhZGJfaWRlbnQgeworCXVpbnQxNl90CXNhZGJfaWRlbnRfbGVuOworCXVpbnQxNl90CXNhZGJfaWRlbnRfZXh0dHlwZTsKKwl1aW50MTZfdAlzYWRiX2lkZW50X3R5cGU7CisJdWludDE2X3QJc2FkYl9pZGVudF9yZXNlcnZlZDsKKwl1aW50NjRfdAlzYWRiX2lkZW50X2lkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9pZGVudCkgPT0gMTYgKi8KKworc3RydWN0IHNhZGJfc2VucyB7CisJdWludDE2X3QJc2FkYl9zZW5zX2xlbjsKKwl1aW50MTZfdAlzYWRiX3NlbnNfZXh0dHlwZTsKKwl1aW50MzJfdAlzYWRiX3NlbnNfZHBkOworCXVpbnQ4X3QJCXNhZGJfc2Vuc19zZW5zX2xldmVsOworCXVpbnQ4X3QJCXNhZGJfc2Vuc19zZW5zX2xlbjsKKwl1aW50OF90CQlzYWRiX3NlbnNfaW50ZWdfbGV2ZWw7CisJdWludDhfdAkJc2FkYl9zZW5zX2ludGVnX2xlbjsKKwl1aW50MzJfdAlzYWRiX3NlbnNfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NlbnMpID09IDE2ICovCisKKy8qIGZvbGxvd2VkIGJ5OgorCXVpbnQ2NF90CXNhZGJfc2Vuc19iaXRtYXBbc2Vuc19sZW5dOworCXVpbnQ2NF90CXNhZGJfaW50ZWdfYml0bWFwW2ludGVnX2xlbl07ICAqLworCitzdHJ1Y3Qgc2FkYl9wcm9wIHsKKwl1aW50MTZfdAlzYWRiX3Byb3BfbGVuOworCXVpbnQxNl90CXNhZGJfcHJvcF9leHR0eXBlOworCXVpbnQ4X3QJCXNhZGJfcHJvcF9yZXBsYXk7CisJdWludDhfdAkJc2FkYl9wcm9wX3Jlc2VydmVkWzNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl9wcm9wKSA9PSA4ICovCisKKy8qIGZvbGxvd2VkIGJ5OgorCXN0cnVjdCBzYWRiX2NvbWIgc2FkYl9jb21ic1soc2FkYl9wcm9wX2xlbiArCisJCXNpemVvZih1aW50NjRfdCkgLSBzaXplb2Yoc3RydWN0IHNhZGJfcHJvcCkpIC8KKwkJc2l6ZW9mKHN0cnVjdCBzYWRiX2NvbWIpXTsgKi8KKworc3RydWN0IHNhZGJfY29tYiB7CisJdWludDhfdAkJc2FkYl9jb21iX2F1dGg7CisJdWludDhfdAkJc2FkYl9jb21iX2VuY3J5cHQ7CisJdWludDE2X3QJc2FkYl9jb21iX2ZsYWdzOworCXVpbnQxNl90CXNhZGJfY29tYl9hdXRoX21pbmJpdHM7CisJdWludDE2X3QJc2FkYl9jb21iX2F1dGhfbWF4Yml0czsKKwl1aW50MTZfdAlzYWRiX2NvbWJfZW5jcnlwdF9taW5iaXRzOworCXVpbnQxNl90CXNhZGJfY29tYl9lbmNyeXB0X21heGJpdHM7CisJdWludDMyX3QJc2FkYl9jb21iX3Jlc2VydmVkOworCXVpbnQzMl90CXNhZGJfY29tYl9zb2Z0X2FsbG9jYXRpb25zOworCXVpbnQzMl90CXNhZGJfY29tYl9oYXJkX2FsbG9jYXRpb25zOworCXVpbnQ2NF90CXNhZGJfY29tYl9zb2Z0X2J5dGVzOworCXVpbnQ2NF90CXNhZGJfY29tYl9oYXJkX2J5dGVzOworCXVpbnQ2NF90CXNhZGJfY29tYl9zb2Z0X2FkZHRpbWU7CisJdWludDY0X3QJc2FkYl9jb21iX2hhcmRfYWRkdGltZTsKKwl1aW50NjRfdAlzYWRiX2NvbWJfc29mdF91c2V0aW1lOworCXVpbnQ2NF90CXNhZGJfY29tYl9oYXJkX3VzZXRpbWU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX2NvbWIpID09IDcyICovCisKK3N0cnVjdCBzYWRiX3N1cHBvcnRlZCB7CisJdWludDE2X3QJc2FkYl9zdXBwb3J0ZWRfbGVuOworCXVpbnQxNl90CXNhZGJfc3VwcG9ydGVkX2V4dHR5cGU7CisJdWludDMyX3QJc2FkYl9zdXBwb3J0ZWRfcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3N1cHBvcnRlZCkgPT0gOCAqLworCisvKiBmb2xsb3dlZCBieToKKwlzdHJ1Y3Qgc2FkYl9hbGcgc2FkYl9hbGdzWyhzYWRiX3N1cHBvcnRlZF9sZW4gKworCQlzaXplb2YodWludDY0X3QpIC0gc2l6ZW9mKHN0cnVjdCBzYWRiX3N1cHBvcnRlZCkpIC8KKwkJc2l6ZW9mKHN0cnVjdCBzYWRiX2FsZyldOyAqLworCitzdHJ1Y3Qgc2FkYl9hbGcgeworCXVpbnQ4X3QJCXNhZGJfYWxnX2lkOworCXVpbnQ4X3QJCXNhZGJfYWxnX2l2bGVuOworCXVpbnQxNl90CXNhZGJfYWxnX21pbmJpdHM7CisJdWludDE2X3QJc2FkYl9hbGdfbWF4Yml0czsKKwl1aW50MTZfdAlzYWRiX2FsZ19yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfYWxnKSA9PSA4ICovCisKK3N0cnVjdCBzYWRiX3NwaXJhbmdlIHsKKwl1aW50MTZfdAlzYWRiX3NwaXJhbmdlX2xlbjsKKwl1aW50MTZfdAlzYWRiX3NwaXJhbmdlX2V4dHR5cGU7CisJdWludDMyX3QJc2FkYl9zcGlyYW5nZV9taW47CisJdWludDMyX3QJc2FkYl9zcGlyYW5nZV9tYXg7CisJdWludDMyX3QJc2FkYl9zcGlyYW5nZV9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfc3BpcmFuZ2UpID09IDE2ICovCisKK3N0cnVjdCBzYWRiX3hfa21wcml2YXRlIHsKKwl1aW50MTZfdAlzYWRiX3hfa21wcml2YXRlX2xlbjsKKwl1aW50MTZfdAlzYWRiX3hfa21wcml2YXRlX2V4dHR5cGU7CisJdWludDMyX3QJc2FkYl94X2ttcHJpdmF0ZV9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9rbXByaXZhdGUpID09IDggKi8KKworc3RydWN0IHNhZGJfeF9zYTIgeworCXVpbnQxNl90CXNhZGJfeF9zYTJfbGVuOworCXVpbnQxNl90CXNhZGJfeF9zYTJfZXh0dHlwZTsKKwl1aW50OF90CQlzYWRiX3hfc2EyX21vZGU7CisJdWludDhfdAkJc2FkYl94X3NhMl9yZXNlcnZlZDE7CisJdWludDE2X3QJc2FkYl94X3NhMl9yZXNlcnZlZDI7CisJdWludDMyX3QJc2FkYl94X3NhMl9zZXF1ZW5jZTsKKwl1aW50MzJfdAlzYWRiX3hfc2EyX3JlcWlkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl94X3NhMikgPT0gMTYgKi8KKworc3RydWN0IHNhZGJfeF9wb2xpY3kgeworCXVpbnQxNl90CXNhZGJfeF9wb2xpY3lfbGVuOworCXVpbnQxNl90CXNhZGJfeF9wb2xpY3lfZXh0dHlwZTsKKwl1aW50MTZfdAlzYWRiX3hfcG9saWN5X3R5cGU7CisJdWludDhfdAkJc2FkYl94X3BvbGljeV9kaXI7CisJdWludDhfdAkJc2FkYl94X3BvbGljeV9yZXNlcnZlZDsKKwl1aW50MzJfdAlzYWRiX3hfcG9saWN5X2lkOworCXVpbnQzMl90CXNhZGJfeF9wb2xpY3lfcHJpb3JpdHk7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3hfcG9saWN5KSA9PSAxNiAqLworCitzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCB7CisJdWludDE2X3QJc2FkYl94X2lwc2VjcmVxdWVzdF9sZW47CisJdWludDE2X3QJc2FkYl94X2lwc2VjcmVxdWVzdF9wcm90bzsKKwl1aW50OF90CQlzYWRiX3hfaXBzZWNyZXF1ZXN0X21vZGU7CisJdWludDhfdAkJc2FkYl94X2lwc2VjcmVxdWVzdF9sZXZlbDsKKwl1aW50MTZfdAlzYWRiX3hfaXBzZWNyZXF1ZXN0X3Jlc2VydmVkMTsKKwl1aW50MzJfdAlzYWRiX3hfaXBzZWNyZXF1ZXN0X3JlcWlkOworCXVpbnQzMl90CXNhZGJfeF9pcHNlY3JlcXVlc3RfcmVzZXJ2ZWQyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKy8qIHNpemVvZihzdHJ1Y3Qgc2FkYl94X2lwc2VjcmVxdWVzdCkgPT0gMTYgKi8KKworLyogVGhpcyBkZWZpbmVzIHRoZSBUWVBFIG9mIE5hdCBUcmF2ZXJzYWwgaW4gdXNlLiAgQ3VycmVudGx5IG9ubHkgb25lCisgKiB0eXBlIG9mIE5BVC1UIGlzIHN1cHBvcnRlZCwgZHJhZnQtaWV0Zi1pcHNlYy11ZHAtZW5jYXBzLTA2CisgKi8KK3N0cnVjdCBzYWRiX3hfbmF0X3RfdHlwZSB7CisJdWludDE2X3QJc2FkYl94X25hdF90X3R5cGVfbGVuOworCXVpbnQxNl90CXNhZGJfeF9uYXRfdF90eXBlX2V4dHR5cGU7CisJdWludDhfdAkJc2FkYl94X25hdF90X3R5cGVfdHlwZTsKKwl1aW50OF90CQlzYWRiX3hfbmF0X3RfdHlwZV9yZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF90eXBlKSA9PSA4ICovCisKKy8qIFBhc3MgYSBOQVQgVHJhdmVyc2FsIHBvcnQgKFNvdXJjZSBvciBEZXN0IHBvcnQpICovCitzdHJ1Y3Qgc2FkYl94X25hdF90X3BvcnQgeworCXVpbnQxNl90CXNhZGJfeF9uYXRfdF9wb3J0X2xlbjsKKwl1aW50MTZfdAlzYWRiX3hfbmF0X3RfcG9ydF9leHR0eXBlOworCV9fYmUxNgkJc2FkYl94X25hdF90X3BvcnRfcG9ydDsKKwl1aW50MTZfdAlzYWRiX3hfbmF0X3RfcG9ydF9yZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisvKiBzaXplb2Yoc3RydWN0IHNhZGJfeF9uYXRfdF9wb3J0KSA9PSA4ICovCisKKy8qIEdlbmVyaWMgTFNNIHNlY3VyaXR5IGNvbnRleHQgKi8KK3N0cnVjdCBzYWRiX3hfc2VjX2N0eCB7CisJdWludDE2X3QJc2FkYl94X3NlY19sZW47CisJdWludDE2X3QJc2FkYl94X3NlY19leHR0eXBlOworCXVpbnQ4X3QJCXNhZGJfeF9jdHhfYWxnOyAgLyogTFNNczogZS5nLiwgc2VsaW51eCA9PSAxICovCisJdWludDhfdAkJc2FkYl94X2N0eF9kb2k7CisJdWludDE2X3QJc2FkYl94X2N0eF9sZW47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworLyogc2l6ZW9mKHN0cnVjdCBzYWRiX3NlY19jdHgpID0gOCAqLworCisvKiBNZXNzYWdlIHR5cGVzICovCisjZGVmaW5lIFNBREJfUkVTRVJWRUQJCTAKKyNkZWZpbmUgU0FEQl9HRVRTUEkJCTEKKyNkZWZpbmUgU0FEQl9VUERBVEUJCTIKKyNkZWZpbmUgU0FEQl9BREQJCTMKKyNkZWZpbmUgU0FEQl9ERUxFVEUJCTQKKyNkZWZpbmUgU0FEQl9HRVQJCTUKKyNkZWZpbmUgU0FEQl9BQ1FVSVJFCQk2CisjZGVmaW5lIFNBREJfUkVHSVNURVIJCTcKKyNkZWZpbmUgU0FEQl9FWFBJUkUJCTgKKyNkZWZpbmUgU0FEQl9GTFVTSAkJOQorI2RlZmluZSBTQURCX0RVTVAJCTEwCisjZGVmaW5lIFNBREJfWF9QUk9NSVNDCQkxMQorI2RlZmluZSBTQURCX1hfUENIQU5HRQkJMTIKKyNkZWZpbmUgU0FEQl9YX1NQRFVQREFURQkxMworI2RlZmluZSBTQURCX1hfU1BEQURECQkxNAorI2RlZmluZSBTQURCX1hfU1BEREVMRVRFCTE1CisjZGVmaW5lIFNBREJfWF9TUERHRVQJCTE2CisjZGVmaW5lIFNBREJfWF9TUERBQ1FVSVJFCTE3CisjZGVmaW5lIFNBREJfWF9TUEREVU1QCQkxOAorI2RlZmluZSBTQURCX1hfU1BERkxVU0gJCTE5CisjZGVmaW5lIFNBREJfWF9TUERTRVRJRFgJMjAKKyNkZWZpbmUgU0FEQl9YX1NQREVYUElSRQkyMQorI2RlZmluZSBTQURCX1hfU1BEREVMRVRFMgkyMgorI2RlZmluZSBTQURCX1hfTkFUX1RfTkVXX01BUFBJTkcJMjMKKyNkZWZpbmUgU0FEQl9YX01JR1JBVEUJCTI0CisjZGVmaW5lIFNBREJfTUFYCQkyNAorCisvKiBTZWN1cml0eSBBc3NvY2lhdGlvbiBmbGFncyAqLworI2RlZmluZSBTQURCX1NBRkxBR1NfUEZTCTEKKyNkZWZpbmUgU0FEQl9TQUZMQUdTX05PUE1UVURJU0MJMHgyMDAwMDAwMAorI2RlZmluZSBTQURCX1NBRkxBR1NfREVDQVBfRFNDUAkweDQwMDAwMDAwCisjZGVmaW5lIFNBREJfU0FGTEFHU19OT0VDTgkweDgwMDAwMDAwCisKKy8qIFNlY3VyaXR5IEFzc29jaWF0aW9uIHN0YXRlcyAqLworI2RlZmluZSBTQURCX1NBU1RBVEVfTEFSVkFMCTAKKyNkZWZpbmUgU0FEQl9TQVNUQVRFX01BVFVSRQkxCisjZGVmaW5lIFNBREJfU0FTVEFURV9EWUlORwkyCisjZGVmaW5lIFNBREJfU0FTVEFURV9ERUFECTMKKyNkZWZpbmUgU0FEQl9TQVNUQVRFX01BWAkzCisKKy8qIFNlY3VyaXR5IEFzc29jaWF0aW9uIHR5cGVzICovCisjZGVmaW5lIFNBREJfU0FUWVBFX1VOU1BFQwkwCisjZGVmaW5lIFNBREJfU0FUWVBFX0FICQkyCisjZGVmaW5lIFNBREJfU0FUWVBFX0VTUAkJMworI2RlZmluZSBTQURCX1NBVFlQRV9SU1ZQCTUKKyNkZWZpbmUgU0FEQl9TQVRZUEVfT1NQRlYyCTYKKyNkZWZpbmUgU0FEQl9TQVRZUEVfUklQVjIJNworI2RlZmluZSBTQURCX1NBVFlQRV9NSVAJCTgKKyNkZWZpbmUgU0FEQl9YX1NBVFlQRV9JUENPTVAJOQorI2RlZmluZSBTQURCX1NBVFlQRV9NQVgJCTkKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBTQURCX0FBTEdfTk9ORQkJCTAKKyNkZWZpbmUgU0FEQl9BQUxHX01ENUhNQUMJCTIKKyNkZWZpbmUgU0FEQl9BQUxHX1NIQTFITUFDCQkzCisjZGVmaW5lIFNBREJfWF9BQUxHX1NIQTJfMjU2SE1BQwk1CisjZGVmaW5lIFNBREJfWF9BQUxHX1NIQTJfMzg0SE1BQwk2CisjZGVmaW5lIFNBREJfWF9BQUxHX1NIQTJfNTEySE1BQwk3CisjZGVmaW5lIFNBREJfWF9BQUxHX1JJUEVNRDE2MEhNQUMJOAorI2RlZmluZSBTQURCX1hfQUFMR19BRVNfWENCQ19NQUMJOQorI2RlZmluZSBTQURCX1hfQUFMR19OVUxMCQkyNTEJLyoga2FtZSAqLworI2RlZmluZSBTQURCX0FBTEdfTUFYCQkJMjUxCisKKy8qIEVuY3J5cHRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZSBTQURCX0VBTEdfTk9ORQkJCTAKKyNkZWZpbmUgU0FEQl9FQUxHX0RFU0NCQwkJMgorI2RlZmluZSBTQURCX0VBTEdfM0RFU0NCQwkJMworI2RlZmluZSBTQURCX1hfRUFMR19DQVNUQ0JDCQk2CisjZGVmaW5lIFNBREJfWF9FQUxHX0JMT1dGSVNIQ0JDCQk3CisjZGVmaW5lIFNBREJfRUFMR19OVUxMCQkJMTEKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTQ0JDCQkxMgorI2RlZmluZSBTQURCX1hfRUFMR19DQU1FTExJQUNCQwkJMjIKKyNkZWZpbmUgU0FEQl9FQUxHX01BWCAgICAgICAgICAgICAgICAgICAyNTMgLyogbGFzdCBFQUxHICovCisvKiBwcml2YXRlIGFsbG9jYXRpb25zIHNob3VsZCB1c2UgMjQ5LTI1NSAoUkZDMjQwNykgKi8KKyNkZWZpbmUgU0FEQl9YX0VBTEdfU0VSUEVOVENCQyAgMjUyICAgICAvKiBkcmFmdC1pZXRmLWlwc2VjLWNpcGgtYWVzLWNiYy0wMCAqLworI2RlZmluZSBTQURCX1hfRUFMR19UV09GSVNIQ0JDICAyNTMgICAgIC8qIGRyYWZ0LWlldGYtaXBzZWMtY2lwaC1hZXMtY2JjLTAwICovCisKKy8qIENvbXByZXNzaW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgU0FEQl9YX0NBTEdfTk9ORQkJMAorI2RlZmluZSBTQURCX1hfQ0FMR19PVUkJCQkxCisjZGVmaW5lIFNBREJfWF9DQUxHX0RFRkxBVEUJCTIKKyNkZWZpbmUgU0FEQl9YX0NBTEdfTFpTCQkJMworI2RlZmluZSBTQURCX1hfQ0FMR19MWkpICQk0CisjZGVmaW5lIFNBREJfWF9DQUxHX01BWAkJCTQKKworLyogRXh0ZW5zaW9uIEhlYWRlciB2YWx1ZXMgKi8KKyNkZWZpbmUgU0FEQl9FWFRfUkVTRVJWRUQJCTAKKyNkZWZpbmUgU0FEQl9FWFRfU0EJCQkxCisjZGVmaW5lIFNBREJfRVhUX0xJRkVUSU1FX0NVUlJFTlQJMgorI2RlZmluZSBTQURCX0VYVF9MSUZFVElNRV9IQVJECQkzCisjZGVmaW5lIFNBREJfRVhUX0xJRkVUSU1FX1NPRlQJCTQKKyNkZWZpbmUgU0FEQl9FWFRfQUREUkVTU19TUkMJCTUKKyNkZWZpbmUgU0FEQl9FWFRfQUREUkVTU19EU1QJCTYKKyNkZWZpbmUgU0FEQl9FWFRfQUREUkVTU19QUk9YWQkJNworI2RlZmluZSBTQURCX0VYVF9LRVlfQVVUSAkJOAorI2RlZmluZSBTQURCX0VYVF9LRVlfRU5DUllQVAkJOQorI2RlZmluZSBTQURCX0VYVF9JREVOVElUWV9TUkMJCTEwCisjZGVmaW5lIFNBREJfRVhUX0lERU5USVRZX0RTVAkJMTEKKyNkZWZpbmUgU0FEQl9FWFRfU0VOU0lUSVZJVFkJCTEyCisjZGVmaW5lIFNBREJfRVhUX1BST1BPU0FMCQkxMworI2RlZmluZSBTQURCX0VYVF9TVVBQT1JURURfQVVUSAkJMTQKKyNkZWZpbmUgU0FEQl9FWFRfU1VQUE9SVEVEX0VOQ1JZUFQJMTUKKyNkZWZpbmUgU0FEQl9FWFRfU1BJUkFOR0UJCTE2CisjZGVmaW5lIFNBREJfWF9FWFRfS01QUklWQVRFCQkxNworI2RlZmluZSBTQURCX1hfRVhUX1BPTElDWQkJMTgKKyNkZWZpbmUgU0FEQl9YX0VYVF9TQTIJCQkxOQorLyogVGhlIG5leHQgZm91ciBlbnRyaWVzIGFyZSBmb3Igc2V0dGluZyB1cCBOQVQgVHJhdmVyc2FsICovCisjZGVmaW5lIFNBREJfWF9FWFRfTkFUX1RfVFlQRQkJMjAKKyNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9TUE9SVAkJMjEKKyNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9EUE9SVAkJMjIKKyNkZWZpbmUgU0FEQl9YX0VYVF9OQVRfVF9PQQkJMjMKKyNkZWZpbmUgU0FEQl9YX0VYVF9TRUNfQ1RYCQkyNAorI2RlZmluZSBTQURCX0VYVF9NQVgJCQkyNAorCisvKiBJZGVudGl0eSBFeHRlbnNpb24gdmFsdWVzICovCisjZGVmaW5lIFNBREJfSURFTlRUWVBFX1JFU0VSVkVECTAKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfUFJFRklYCTEKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfRlFETgkyCisjZGVmaW5lIFNBREJfSURFTlRUWVBFX1VTRVJGUUROCTMKKyNkZWZpbmUgU0FEQl9JREVOVFRZUEVfTUFYCTMKKworI2VuZGlmIC8qICEoX0xJTlVYX1BGS0VZMl9IKSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTk0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BnLmgKQEAgLTAsMCArMSw2MyBAQAorLyogCXBnLmggKGMpIDE5OTggIEdyYW50IFIuIEd1ZW50aGVyIDxncmFudEB0b3JxdWUubmV0PgorIAkJICAgICAgIFVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKworCisJcGcuaCBkZWZpbmVzIHRoZSB1c2VyIGludGVyZmFjZSB0byB0aGUgZ2VuZXJpYyBBVEFQSSBwYWNrZXQKKyAgICAgICAgY29tbWFuZCBkcml2ZXIgZm9yIHBhcmFsbGVsIHBvcnQgQVRBUEkgZGV2aWNlcyAocGcpLiBUaGUKKwlkcml2ZXIgaXMgbG9vc2VseSBtb2RlbGxlZCBhZnRlciB0aGUgZ2VuZXJpYyBTQ1NJIGRyaXZlciwgc2csCisJYWx0aG91Z2ggdGhlIGFjdHVhbCBpbnRlcmZhY2UgaXMgZGlmZmVyZW50LgorCisJVGhlIHBnIGRyaXZlciBwcm92aWRlcyBhIHNpbXBsZSBjaGFyYWN0ZXIgZGV2aWNlIGludGVyZmFjZSBmb3IKKyAgICAgICAgc2VuZGluZyBBVEFQSSBjb21tYW5kcyB0byBhIGRldmljZS4gIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKKwlBVEFQSSByZXNldCBvcGVyYXRpb24sIGFsbCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYnkgYSBwYWlyCisgICAgICAgIG9mIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMgdG8gdGhlIGFwcHJvcHJpYXRlIC9kZXYvcGdOIGRldmljZS4KKwlBIHdyaXRlIG9wZXJhdGlvbiBkZWxpdmVycyBhIGNvbW1hbmQgYW5kIGFueSBvdXRib3VuZCBkYXRhIGluCisgICAgICAgIGEgc2luZ2xlIGJ1ZmZlci4gIE5vcm1hbGx5LCB0aGUgd3JpdGUgd2lsbCBzdWNjZWVkIHVubGVzcyB0aGUKKyAgICAgICAgZGV2aWNlIGlzIG9mZmxpbmUgb3IgbWFsZnVuY3Rpb25pbmcsIG9yIHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlcgorCWNvbW1hbmQgcGVuZGluZy4gIElmIHRoZSB3cml0ZSBzdWNjZWVkcywgaXQgc2hvdWxkIGJlIGZvbGxvd2VkCisgICAgICAgIGltbWVkaWF0ZWx5IGJ5IGEgcmVhZCBvcGVyYXRpb24sIHRvIG9idGFpbiBhbnkgcmV0dXJuZWQgZGF0YSBhbmQKKyAgICAgICAgc3RhdHVzIGluZm9ybWF0aW9uLiAgQSByZWFkIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBubyBvcGVyYXRpb24KKyAgICAgICAgaW4gcHJvZ3Jlc3MuCisKKwlBcyBhIHNwZWNpYWwgY2FzZSwgdGhlIGRldmljZSBjYW4gYmUgcmVzZXQgd2l0aCBhIHdyaXRlIG9wZXJhdGlvbiwKKyAgICAgICAgYW5kIGluIHRoaXMgY2FzZSwgbm8gZm9sbG93aW5nIHJlYWQgaXMgZXhwZWN0ZWQsIG9yIHBlcm1pdHRlZC4KKworCVRoZXJlIGFyZSBubyBpb2N0bCgpIG9wZXJhdGlvbnMuICBBbnkgc2luZ2xlIG9wZXJhdGlvbgorCW1heSB0cmFuc2ZlciBhdCBtb3N0IFBHX01BWF9EQVRBIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZSBkcml2ZXIgbXVzdAorICAgICAgICBjb3B5IHRoZSBkYXRhIHRocm91Z2ggYW4gaW50ZXJuYWwgYnVmZmVyLiAgSW4ga2VlcGluZyB3aXRoIGFsbAorCWN1cnJlbnQgQVRBUEkgZGV2aWNlcywgY29tbWFuZCBwYWNrZXRzIGFyZSBhc3N1bWVkIHRvIGJlIGV4YWN0bHkKKwkxMiBieXRlcyBpbiBsZW5ndGguCisKKwlUbyBwZXJtaXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhpcyBpbnRlcmZhY2UsIHRoZSBoZWFkZXJzIGluIHRoZQorCXJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgY29udGFpbiBhIHNpbmdsZSBjaGFyYWN0ZXIgIm1hZ2ljIiBmbGFnLgorICAgICAgICBDdXJyZW50bHkgdGhpcyBmbGFnIG11c3QgYmUgdGhlIGNoYXJhY3RlciAiUCIuCisKKyovCisKKyNkZWZpbmUgUEdfTUFHSUMJJ1AnCisjZGVmaW5lIFBHX1JFU0VUCSdaJworI2RlZmluZSBQR19DT01NQU5ECSdDJworCisjZGVmaW5lIFBHX01BWF9EQVRBCTMyNzY4CisKK3N0cnVjdCBwZ193cml0ZV9oZHIgeworCisJY2hhcgltYWdpYzsJCS8qID09IFBHX01BR0lDICovCisJY2hhcglmdW5jOwkJLyogUEdfUkVTRVQgb3IgUEdfQ09NTUFORCAqLworCWludCAgICAgZGxlbjsJCS8qIG51bWJlciBvZiBieXRlcyBleHBlY3RlZCB0byB0cmFuc2ZlciAqLworCWludCAgICAgdGltZW91dDsJLyogbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHRpbWVvdXQgKi8KKwljaGFyCXBhY2tldFsxMl07CS8qIHBhY2tldCBjb21tYW5kICovCisKK307CisKK3N0cnVjdCBwZ19yZWFkX2hkciB7CisKKwljaGFyCW1hZ2ljOwkJLyogPT0gUEdfTUFHSUMgKi8KKwljaGFyCXNjc2k7CQkvKiAic2NzaSIgc3RhdHVzID09IHNlbnNlIGtleSAqLworCWludAlkbGVuOwkJLyogc2l6ZSBvZiBkZXZpY2UgdHJhbnNmZXIgcmVxdWVzdCAqLworCWludCAgICAgZHVyYXRpb247CS8qIHRpbWUgaW4gc2Vjb25kcyBjb21tYW5kIHRvb2sgKi8KKwljaGFyICAgIHBhZFsxMl07CS8qIG5vdCB1c2VkICovCisKK307CisKKy8qIGVuZCBvZiBwZy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BoYW50b20uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGhhbnRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZjQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BoYW50b20uaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX1BIQU5UT01fSAorI2RlZmluZSBfX1BIQU5UT01fSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKy8qIFBITl8oRy9TKUVUX1JFRyBwYXJhbSAqLworc3RydWN0IHBobV9yZWcgeworCV9fdTMyIHJlZzsKKwlfX3UzMiB2YWx1ZTsKK307CisKKy8qIFBITl8oRy9TKUVUX1JFR1MgcGFyYW0gKi8KK3N0cnVjdCBwaG1fcmVncyB7CisJX191MzIgY291bnQ7CisJX191MzIgbWFzazsKKwlfX3UzMiB2YWx1ZXNbOF07Cit9OworCisjZGVmaW5lIFBIX0lPQ19NQUdJQwkJJ3AnCisjZGVmaW5lIFBITl9HRVRfUkVHCQlfSU9XUihQSF9JT0NfTUFHSUMsIDAsIHN0cnVjdCBwaG1fcmVnICopCisjZGVmaW5lIFBITl9TRVRfUkVHCQlfSU9XIChQSF9JT0NfTUFHSUMsIDEsIHN0cnVjdCBwaG1fcmVnICopCisjZGVmaW5lIFBITl9HRVRfUkVHUwkJX0lPV1IoUEhfSU9DX01BR0lDLCAyLCBzdHJ1Y3QgcGhtX3JlZ3MgKikKKyNkZWZpbmUgUEhOX1NFVF9SRUdTCQlfSU9XIChQSF9JT0NfTUFHSUMsIDMsIHN0cnVjdCBwaG1fcmVncyAqKQorLyogdGhpcyBpb2N0bCB0ZWxscyB0aGUgZHJpdmVyLCB0aGF0IHRoZSBjYWxsZXIgaXMgbm90IE9wZW5IYXB0aWNzIGFuZCBtaWdodAorICogdXNlIGltcHJvdmVkIHJlZ2lzdGVycyB1cGRhdGUgKG5vIG1vcmUgcGhhbnRvbSBzd2l0Y2hvZmZzIHdoZW4gdXNpbmcKKyAqIGxpYnBoYW50b20pICovCisjZGVmaW5lIFBITl9OT1RfT0gJCV9JTyAgKFBIX0lPQ19NQUdJQywgNCkKKyNkZWZpbmUgUEhfSU9DX01BWE5SCQk0CisKKyNkZWZpbmUgUEhOX0NPTlRST0wJCTB4NiAgICAgLyogY29udHJvbCBieXRlIGluIGlhZGRyIHNwYWNlICovCisjZGVmaW5lIFBITl9DVExfQU1QCQkweDEgICAgIC8qICAgc3dpdGNoIGFmdGVyIHRvcnF1ZXMgY2hhbmdlICovCisjZGVmaW5lIFBITl9DVExfQlVUCQkweDIgICAgIC8qICAgaXMgYnV0dG9uIHN3aXRjaGVkICovCisjZGVmaW5lIFBITl9DVExfSVJRCQkweDEwICAgIC8qICAgaXMgaXJxIGVuYWJsZWQgKi8KKworI2RlZmluZSBQSE5fWkVST19GT1JDRQkJMjA0OAkvKiB6ZXJvIHRvcnF1ZSBvbiBtb3RvciAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0X2Nscy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RfY2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiODU3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0X2Nscy5oCkBAIC0wLDAgKzEsNDI2IEBACisjaWZuZGVmIF9fTElOVVhfUEtUX0NMU19ICisjZGVmaW5lIF9fTElOVVhfUEtUX0NMU19ICisKKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKworLyogSSB0aGluayBpIGNvdWxkIGhhdmUgZG9uZSBiZXR0ZXIgbWFjcm9zIDsgZm9yIG5vdyB0aGlzIGlzIHN0b2xlbiBmcm9tCisgKiBzb21lIGFyY2gvbWlwcyBjb2RlIC0gamhzCisqLworI2RlZmluZSBfVENfTUFLRTMyKHgpICgoeCkpCisKKyNkZWZpbmUgX1RDX01BS0VNQVNLMShuKSAoX1RDX01BS0UzMigxKSA8PCBfVENfTUFLRTMyKG4pKQorI2RlZmluZSBfVENfTUFLRU1BU0sodixuKSAoX1RDX01BS0UzMigoX1RDX01BS0UzMigxKTw8KHYpKS0xKSA8PCBfVENfTUFLRTMyKG4pKQorI2RlZmluZSBfVENfTUFLRVZBTFVFKHYsbikgKF9UQ19NQUtFMzIodikgPDwgX1RDX01BS0UzMihuKSkKKyNkZWZpbmUgX1RDX0dFVFZBTFVFKHYsbixtKSAoKF9UQ19NQUtFMzIodikgJiBfVENfTUFLRTMyKG0pKSA+PiBfVENfTUFLRTMyKG4pKQorCisvKiB2ZXJkaWN0IGJpdCBicmVha2Rvd24gCisgKgorYml0IDA6IHdoZW4gc2V0IC0+IHRoaXMgcGFja2V0IGhhcyBiZWVuIG11bmdlZCBhbHJlYWR5CisKK2JpdCAxOiB3aGVuIHNldCAtPiBJdCBpcyBvayB0byBtdW5nZSB0aGlzIHBhY2tldAorCitiaXQgMiwzLDQsNTogUmVjbGFzc2lmeSBjb3VudGVyIC0gc29ydCBvZiByZXZlcnNlIFRUTCAtIGlmIGV4Y2VlZGVkCithc3N1bWUgbG9vcAorCitiaXQgNiw3OiBXaGVyZSB0aGlzIHBhY2tldCB3YXMgbGFzdCBzZWVuIAorMDogQWJvdmUgdGhlIHRyYW5zbWl0IGV4YW1wbGUgYXQgdGhlIHNvY2tldCBsZXZlbAorMTogb24gdGhlIEluZ3Jlc3MKKzI6IG9uIHRoZSBFZ3Jlc3MKKworYml0IDg6IHdoZW4gc2V0IC0tPiBSZXF1ZXN0IG5vdCB0byBjbGFzc2lmeSBvbiBpbmdyZXNzLiAKKworYml0cyA5LDEwLDExOiByZWRpcmVjdCBjb3VudGVyIC0gIHJlZGlyZWN0IFRUTC4gTG9vcCBhdm9pZGFuY2UKKworICoKKyAqICovCisKKyNkZWZpbmUgVENfTVVOR0VEICAgICAgICAgIF9UQ19NQUtFTUFTSzEoMCkKKyNkZWZpbmUgU0VUX1RDX01VTkdFRCh2KSAgICggVENfTVVOR0VEIHwgKHYgJiB+VENfTVVOR0VEKSkKKyNkZWZpbmUgQ0xSX1RDX01VTkdFRCh2KSAgICggdiAmIH5UQ19NVU5HRUQpCisKKyNkZWZpbmUgVENfT0syTVVOR0UgICAgICAgIF9UQ19NQUtFTUFTSzEoMSkKKyNkZWZpbmUgU0VUX1RDX09LMk1VTkdFKHYpICAgKCBUQ19PSzJNVU5HRSB8ICh2ICYgflRDX09LMk1VTkdFKSkKKyNkZWZpbmUgQ0xSX1RDX09LMk1VTkdFKHYpICAgKCB2ICYgflRDX09LMk1VTkdFKQorCisjZGVmaW5lIFNfVENfVkVSRCAgICAgICAgICBfVENfTUFLRTMyKDIpCisjZGVmaW5lIE1fVENfVkVSRCAgICAgICAgICBfVENfTUFLRU1BU0soNCxTX1RDX1ZFUkQpCisjZGVmaW5lIEdfVENfVkVSRCh4KSAgICAgICBfVENfR0VUVkFMVUUoeCxTX1RDX1ZFUkQsTV9UQ19WRVJEKQorI2RlZmluZSBWX1RDX1ZFUkQoeCkgICAgICAgX1RDX01BS0VWQUxVRSh4LFNfVENfVkVSRCkKKyNkZWZpbmUgU0VUX1RDX1ZFUkQodixuKSAgICgoVl9UQ19WRVJEKG4pKSB8ICh2ICYgfk1fVENfVkVSRCkpCisKKyNkZWZpbmUgU19UQ19GUk9NICAgICAgICAgIF9UQ19NQUtFMzIoNikKKyNkZWZpbmUgTV9UQ19GUk9NICAgICAgICAgIF9UQ19NQUtFTUFTSygyLFNfVENfRlJPTSkKKyNkZWZpbmUgR19UQ19GUk9NKHgpICAgICAgIF9UQ19HRVRWQUxVRSh4LFNfVENfRlJPTSxNX1RDX0ZST00pCisjZGVmaW5lIFZfVENfRlJPTSh4KSAgICAgICBfVENfTUFLRVZBTFVFKHgsU19UQ19GUk9NKQorI2RlZmluZSBTRVRfVENfRlJPTSh2LG4pICAgKChWX1RDX0ZST00obikpIHwgKHYgJiB+TV9UQ19GUk9NKSkKKyNkZWZpbmUgQVRfU1RBQ0sJMHgwCisjZGVmaW5lIEFUX0lOR1JFU1MJMHgxCisjZGVmaW5lIEFUX0VHUkVTUwkweDIKKworI2RlZmluZSBUQ19OQ0xTICAgICAgICAgIF9UQ19NQUtFTUFTSzEoOCkKKyNkZWZpbmUgU0VUX1RDX05DTFModikgICAoIFRDX05DTFMgfCAodiAmIH5UQ19OQ0xTKSkKKyNkZWZpbmUgQ0xSX1RDX05DTFModikgICAoIHYgJiB+VENfTkNMUykKKworI2RlZmluZSBTX1RDX1JUVEwgICAgICAgICAgX1RDX01BS0UzMig5KQorI2RlZmluZSBNX1RDX1JUVEwgICAgICAgICAgX1RDX01BS0VNQVNLKDMsU19UQ19SVFRMKQorI2RlZmluZSBHX1RDX1JUVEwoeCkgICAgICAgX1RDX0dFVFZBTFVFKHgsU19UQ19SVFRMLE1fVENfUlRUTCkKKyNkZWZpbmUgVl9UQ19SVFRMKHgpICAgICAgIF9UQ19NQUtFVkFMVUUoeCxTX1RDX1JUVEwpCisjZGVmaW5lIFNFVF9UQ19SVFRMKHYsbikgICAoKFZfVENfUlRUTChuKSkgfCAodiAmIH5NX1RDX1JUVEwpKQorCisjZGVmaW5lIFNfVENfQVQgICAgICAgICAgX1RDX01BS0UzMigxMikKKyNkZWZpbmUgTV9UQ19BVCAgICAgICAgICBfVENfTUFLRU1BU0soMixTX1RDX0FUKQorI2RlZmluZSBHX1RDX0FUKHgpICAgICAgIF9UQ19HRVRWQUxVRSh4LFNfVENfQVQsTV9UQ19BVCkKKyNkZWZpbmUgVl9UQ19BVCh4KSAgICAgICBfVENfTUFLRVZBTFVFKHgsU19UQ19BVCkKKyNkZWZpbmUgU0VUX1RDX0FUKHYsbikgICAoKFZfVENfQVQobikpIHwgKHYgJiB+TV9UQ19BVCkpCisKKy8qIEFjdGlvbiBhdHRyaWJ1dGVzICovCitlbnVtCit7CisJVENBX0FDVF9VTlNQRUMsCisJVENBX0FDVF9LSU5ELAorCVRDQV9BQ1RfT1BUSU9OUywKKwlUQ0FfQUNUX0lOREVYLAorCVRDQV9BQ1RfU1RBVFMsCisJX19UQ0FfQUNUX01BWAorfTsKKworI2RlZmluZSBUQ0FfQUNUX01BWCBfX1RDQV9BQ1RfTUFYCisjZGVmaW5lIFRDQV9PTERfQ09NUEFUIChUQ0FfQUNUX01BWCsxKQorI2RlZmluZSBUQ0FfQUNUX01BWF9QUklPIDMyCisjZGVmaW5lIFRDQV9BQ1RfQklORAkxCisjZGVmaW5lIFRDQV9BQ1RfTk9CSU5ECTAKKyNkZWZpbmUgVENBX0FDVF9VTkJJTkQJMQorI2RlZmluZSBUQ0FfQUNUX05PVU5CSU5ECTAKKyNkZWZpbmUgVENBX0FDVF9SRVBMQUNFCQkxCisjZGVmaW5lIFRDQV9BQ1RfTk9SRVBMQUNFCTAKKyNkZWZpbmUgTUFYX1JFQ19MT09QIDQKKyNkZWZpbmUgTUFYX1JFRF9MT09QIDQKKworI2RlZmluZSBUQ19BQ1RfVU5TUEVDCSgtMSkKKyNkZWZpbmUgVENfQUNUX09LCQkwCisjZGVmaW5lIFRDX0FDVF9SRUNMQVNTSUZZCTEKKyNkZWZpbmUgVENfQUNUX1NIT1QJCTIKKyNkZWZpbmUgVENfQUNUX1BJUEUJCTMKKyNkZWZpbmUgVENfQUNUX1NUT0xFTgkJNAorI2RlZmluZSBUQ19BQ1RfUVVFVUVECQk1CisjZGVmaW5lIFRDX0FDVF9SRVBFQVQJCTYKKyNkZWZpbmUgVENfQUNUX0pVTVAJCTB4MTAwMDAwMDAKKworLyogQWN0aW9uIHR5cGUgaWRlbnRpZmllcnMqLworZW51bQoreworCVRDQV9JRF9VTlNQRUM9MCwKKwlUQ0FfSURfUE9MSUNFPTEsCisJLyogb3RoZXIgYWN0aW9ucyBnbyBoZXJlICovCisJX19UQ0FfSURfTUFYPTI1NQorfTsKKworI2RlZmluZSBUQ0FfSURfTUFYIF9fVENBX0lEX01BWAorCitzdHJ1Y3QgdGNfcG9saWNlCit7CisJX191MzIJCQlpbmRleDsKKwlpbnQJCQlhY3Rpb247CisjZGVmaW5lIFRDX1BPTElDRV9VTlNQRUMJVENfQUNUX1VOU1BFQworI2RlZmluZSBUQ19QT0xJQ0VfT0sJCVRDX0FDVF9PSworI2RlZmluZSBUQ19QT0xJQ0VfUkVDTEFTU0lGWQlUQ19BQ1RfUkVDTEFTU0lGWQorI2RlZmluZSBUQ19QT0xJQ0VfU0hPVAkJVENfQUNUX1NIT1QKKyNkZWZpbmUgVENfUE9MSUNFX1BJUEUJCVRDX0FDVF9QSVBFCisKKwlfX3UzMgkJCWxpbWl0OworCV9fdTMyCQkJYnVyc3Q7CisJX191MzIJCQltdHU7CisJc3RydWN0IHRjX3JhdGVzcGVjCXJhdGU7CisJc3RydWN0IHRjX3JhdGVzcGVjCXBlYWtyYXRlOworCWludCAJCQlyZWZjbnQ7CisJaW50IAkJCWJpbmRjbnQ7CisJX191MzIJCQljYXBhYjsKK307CisKK3N0cnVjdCB0Y2ZfdAoreworCV9fdTY0ICAgaW5zdGFsbDsKKwlfX3U2NCAgIGxhc3R1c2U7CisJX191NjQgICBleHBpcmVzOworfTsKKworc3RydWN0IHRjX2NudAoreworCWludCAgICAgICAgICAgICAgICAgICByZWZjbnQ7IAorCWludCAgICAgICAgICAgICAgICAgICBiaW5kY250OworfTsKKworI2RlZmluZSB0Y19nZW4gXAorCV9fdTMyICAgICAgICAgICAgICAgICBpbmRleDsgXAorCV9fdTMyICAgICAgICAgICAgICAgICBjYXBhYjsgXAorCWludCAgICAgICAgICAgICAgICAgICBhY3Rpb247IFwKKwlpbnQgICAgICAgICAgICAgICAgICAgcmVmY250OyBcCisJaW50ICAgICAgICAgICAgICAgICAgIGJpbmRjbnQKKworZW51bQoreworCVRDQV9QT0xJQ0VfVU5TUEVDLAorCVRDQV9QT0xJQ0VfVEJGLAorCVRDQV9QT0xJQ0VfUkFURSwKKwlUQ0FfUE9MSUNFX1BFQUtSQVRFLAorCVRDQV9QT0xJQ0VfQVZSQVRFLAorCVRDQV9QT0xJQ0VfUkVTVUxULAorCV9fVENBX1BPTElDRV9NQVgKKyNkZWZpbmUgVENBX1BPTElDRV9SRVNVTFQgVENBX1BPTElDRV9SRVNVTFQKK307CisKKyNkZWZpbmUgVENBX1BPTElDRV9NQVggKF9fVENBX1BPTElDRV9NQVggLSAxKQorCisvKiBVMzIgZmlsdGVycyAqLworCisjZGVmaW5lIFRDX1UzMl9IVElEKGgpICgoaCkmMHhGRkYwMDAwMCkKKyNkZWZpbmUgVENfVTMyX1VTRVJIVElEKGgpIChUQ19VMzJfSFRJRChoKT4+MjApCisjZGVmaW5lIFRDX1UzMl9IQVNIKGgpICgoKGgpPj4xMikmMHhGRikKKyNkZWZpbmUgVENfVTMyX05PREUoaCkgKChoKSYweEZGRikKKyNkZWZpbmUgVENfVTMyX0tFWShoKSAoKGgpJjB4RkZGRkYpCisjZGVmaW5lIFRDX1UzMl9VTlNQRUMJMAorI2RlZmluZSBUQ19VMzJfUk9PVAkoMHhGRkYwMDAwMCkKKworZW51bQoreworCVRDQV9VMzJfVU5TUEVDLAorCVRDQV9VMzJfQ0xBU1NJRCwKKwlUQ0FfVTMyX0hBU0gsCisJVENBX1UzMl9MSU5LLAorCVRDQV9VMzJfRElWSVNPUiwKKwlUQ0FfVTMyX1NFTCwKKwlUQ0FfVTMyX1BPTElDRSwKKwlUQ0FfVTMyX0FDVCwgICAKKwlUQ0FfVTMyX0lOREVWLAorCVRDQV9VMzJfUENOVCwKKwlUQ0FfVTMyX01BUkssCisJX19UQ0FfVTMyX01BWAorfTsKKworI2RlZmluZSBUQ0FfVTMyX01BWCAoX19UQ0FfVTMyX01BWCAtIDEpCisKK3N0cnVjdCB0Y191MzJfa2V5Cit7CisJX191MzIJCW1hc2s7CisJX191MzIJCXZhbDsKKwlpbnQJCW9mZjsKKwlpbnQJCW9mZm1hc2s7Cit9OworCitzdHJ1Y3QgdGNfdTMyX3NlbAoreworCXVuc2lnbmVkIGNoYXIJCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJCW9mZnNoaWZ0OworCXVuc2lnbmVkIGNoYXIJCW5rZXlzOworCisJX191MTYJCQlvZmZtYXNrOworCV9fdTE2CQkJb2ZmOworCXNob3J0CQkJb2Zmb2ZmOworCisJc2hvcnQJCQlob2ZmOworCV9fdTMyCQkJaG1hc2s7CisJc3RydWN0IHRjX3UzMl9rZXkJa2V5c1swXTsKK307CisKK3N0cnVjdCB0Y191MzJfbWFyaworeworCV9fdTMyCQl2YWw7CisJX191MzIJCW1hc2s7CisJX191MzIJCXN1Y2Nlc3M7Cit9OworCitzdHJ1Y3QgdGNfdTMyX3BjbnQKK3sKKwlfX3U2NCByY250OworCV9fdTY0IHJoaXQ7CisJX191NjQga2NudHNbMF07Cit9OworCisvKiBGbGFncyAqLworCisjZGVmaW5lIFRDX1UzMl9URVJNSU5BTAkJMQorI2RlZmluZSBUQ19VMzJfT0ZGU0VUCQkyCisjZGVmaW5lIFRDX1UzMl9WQVJPRkZTRVQJNAorI2RlZmluZSBUQ19VMzJfRUFUCQk4CisKKyNkZWZpbmUgVENfVTMyX01BWERFUFRIIDgKKworCisvKiBSU1ZQIGZpbHRlciAqLworCitlbnVtCit7CisJVENBX1JTVlBfVU5TUEVDLAorCVRDQV9SU1ZQX0NMQVNTSUQsCisJVENBX1JTVlBfRFNULAorCVRDQV9SU1ZQX1NSQywKKwlUQ0FfUlNWUF9QSU5GTywKKwlUQ0FfUlNWUF9QT0xJQ0UsCisJVENBX1JTVlBfQUNULAorCV9fVENBX1JTVlBfTUFYCit9OworCisjZGVmaW5lIFRDQV9SU1ZQX01BWCAoX19UQ0FfUlNWUF9NQVggLSAxICkKKworc3RydWN0IHRjX3JzdnBfZ3BpCit7CisJX191MzIJa2V5OworCV9fdTMyCW1hc2s7CisJaW50CW9mZnNldDsKK307CisKK3N0cnVjdCB0Y19yc3ZwX3BpbmZvCit7CisJc3RydWN0IHRjX3JzdnBfZ3BpIGRwaTsKKwlzdHJ1Y3QgdGNfcnN2cF9ncGkgc3BpOworCV9fdTgJcHJvdG9jb2w7CisJX191OAl0dW5uZWxpZDsKKwlfX3U4CXR1bm5lbGhkcjsKKwlfX3U4CXBhZDsKK307CisKKy8qIFJPVVRFIGZpbHRlciAqLworCitlbnVtCit7CisJVENBX1JPVVRFNF9VTlNQRUMsCisJVENBX1JPVVRFNF9DTEFTU0lELAorCVRDQV9ST1VURTRfVE8sCisJVENBX1JPVVRFNF9GUk9NLAorCVRDQV9ST1VURTRfSUlGLAorCVRDQV9ST1VURTRfUE9MSUNFLAorCVRDQV9ST1VURTRfQUNULAorCV9fVENBX1JPVVRFNF9NQVgKK307CisKKyNkZWZpbmUgVENBX1JPVVRFNF9NQVggKF9fVENBX1JPVVRFNF9NQVggLSAxKQorCisKKy8qIEZXIGZpbHRlciAqLworCitlbnVtCit7CisJVENBX0ZXX1VOU1BFQywKKwlUQ0FfRldfQ0xBU1NJRCwKKwlUQ0FfRldfUE9MSUNFLAorCVRDQV9GV19JTkRFViwgLyogIHVzZWQgYnkgQ09ORklHX05FVF9DTFNfSU5EICovCisJVENBX0ZXX0FDVCwgLyogdXNlZCBieSBDT05GSUdfTkVUX0NMU19BQ1QgKi8KKwlUQ0FfRldfTUFTSywKKwlfX1RDQV9GV19NQVgKK307CisKKyNkZWZpbmUgVENBX0ZXX01BWCAoX19UQ0FfRldfTUFYIC0gMSkKKworLyogVEMgaW5kZXggZmlsdGVyICovCisKK2VudW0KK3sKKwlUQ0FfVENJTkRFWF9VTlNQRUMsCisJVENBX1RDSU5ERVhfSEFTSCwKKwlUQ0FfVENJTkRFWF9NQVNLLAorCVRDQV9UQ0lOREVYX1NISUZULAorCVRDQV9UQ0lOREVYX0ZBTExfVEhST1VHSCwKKwlUQ0FfVENJTkRFWF9DTEFTU0lELAorCVRDQV9UQ0lOREVYX1BPTElDRSwKKwlUQ0FfVENJTkRFWF9BQ1QsCisJX19UQ0FfVENJTkRFWF9NQVgKK307CisKKyNkZWZpbmUgVENBX1RDSU5ERVhfTUFYICAgICAoX19UQ0FfVENJTkRFWF9NQVggLSAxKQorCisvKiBCYXNpYyBmaWx0ZXIgKi8KKworZW51bQoreworCVRDQV9CQVNJQ19VTlNQRUMsCisJVENBX0JBU0lDX0NMQVNTSUQsCisJVENBX0JBU0lDX0VNQVRDSEVTLAorCVRDQV9CQVNJQ19BQ1QsCisJVENBX0JBU0lDX1BPTElDRSwKKwlfX1RDQV9CQVNJQ19NQVgKK307CisKKyNkZWZpbmUgVENBX0JBU0lDX01BWCAoX19UQ0FfQkFTSUNfTUFYIC0gMSkKKworLyogRXh0ZW5kZWQgTWF0Y2hlcyAqLworCitzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlX2hkcgoreworCV9fdTE2CQlubWF0Y2hlczsKKwlfX3UxNgkJcHJvZ2lkOworfTsKKworZW51bQoreworCVRDQV9FTUFUQ0hfVFJFRV9VTlNQRUMsCisJVENBX0VNQVRDSF9UUkVFX0hEUiwKKwlUQ0FfRU1BVENIX1RSRUVfTElTVCwKKwlfX1RDQV9FTUFUQ0hfVFJFRV9NQVgKK307CisjZGVmaW5lIFRDQV9FTUFUQ0hfVFJFRV9NQVggKF9fVENBX0VNQVRDSF9UUkVFX01BWCAtIDEpCisKK3N0cnVjdCB0Y2ZfZW1hdGNoX2hkcgoreworCV9fdTE2CQltYXRjaGlkOworCV9fdTE2CQlraW5kOworCV9fdTE2CQlmbGFnczsKKwlfX3UxNgkJcGFkOyAvKiBjdXJyZW50bHkgdW51c2VkICovCit9OworCisvKiAgMCAgICAgICAgICAgICAgICAgICAxCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSAKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstKy0rLS0tKworICogfCAgICAgICAgIFVudXNlZCAgICAgICAgfFN8SXwgUiB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLSstKy0tLSsKKyAqCisgKiBSKDIpIDo6PSByZWxhdGlvbiB0byBuZXh0IGVtYXRjaAorICogICAgICAgICAgd2hlcmU6IDAgMCBFTkQgKGxhc3QgZW1hdGNoKQorICogICAgICAgICAgICAgICAgIDAgMSBBTkQKKyAqICAgICAgICAgICAgICAgICAxIDAgT1IKKyAqICAgICAgICAgICAgICAgICAxIDEgVW51c2VkIChpbnZhbGlkKQorICogSSgxKSA6Oj0gaW52ZXJ0IHJlc3VsdAorICogUygxKSA6Oj0gc2ltcGxlIHBheWxvYWQKKyAqLworI2RlZmluZSBUQ0ZfRU1fUkVMX0VORAkwCisjZGVmaW5lIFRDRl9FTV9SRUxfQU5ECSgxPDwwKQorI2RlZmluZSBUQ0ZfRU1fUkVMX09SCSgxPDwxKQorI2RlZmluZSBUQ0ZfRU1fSU5WRVJUCSgxPDwyKQorI2RlZmluZSBUQ0ZfRU1fU0lNUExFCSgxPDwzKQorCisjZGVmaW5lIFRDRl9FTV9SRUxfTUFTSwkzCisjZGVmaW5lIFRDRl9FTV9SRUxfVkFMSUQodikgKCgodikgJiBUQ0ZfRU1fUkVMX01BU0spICE9IFRDRl9FTV9SRUxfTUFTSykKKworZW51bQoreworCVRDRl9MQVlFUl9MSU5LLAorCVRDRl9MQVlFUl9ORVRXT1JLLAorCVRDRl9MQVlFUl9UUkFOU1BPUlQsCisJX19UQ0ZfTEFZRVJfTUFYCit9OworI2RlZmluZSBUQ0ZfTEFZRVJfTUFYIChfX1RDRl9MQVlFUl9NQVggLSAxKQorCisvKiBFbWF0Y2ggdHlwZSBhc3NpZ25tZW50cworICogICAxLi4zMjc2NwkJUmVzZXJ2ZWQgZm9yIGVtYXRjaGVzIGluc2lkZSBrZXJuZWwgdHJlZQorICogICAzMjc2OC4uNjU1MzUJRnJlZSB0byB1c2UsIG5vdCByZWxpYWJsZQorICovCisjZGVmaW5lCVRDRl9FTV9DT05UQUlORVIJMAorI2RlZmluZQlUQ0ZfRU1fQ01QCQkxCisjZGVmaW5lCVRDRl9FTV9OQllURQkJMgorI2RlZmluZQlUQ0ZfRU1fVTMyCQkzCisjZGVmaW5lCVRDRl9FTV9NRVRBCQk0CisjZGVmaW5lCVRDRl9FTV9URVhUCQk1CisjZGVmaW5lCVRDRl9FTV9NQVgJCTUKKworZW51bQoreworCVRDRl9FTV9QUk9HX1RDCit9OworCitlbnVtCit7CisJVENGX0VNX09QTkRfRVEsCisJVENGX0VNX09QTkRfR1QsCisJVENGX0VNX09QTkRfTFQKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5YWY5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKQEAgLTAsMCArMSw0NzggQEAKKyNpZm5kZWYgX19MSU5VWF9QS1RfU0NIRURfSAorI2RlZmluZSBfX0xJTlVYX1BLVF9TQ0hFRF9ICisKKy8qIExvZ2ljYWwgcHJpb3JpdHkgYmFuZHMgbm90IGRlcGVuZGluZyBvbiBzcGVjaWZpYyBwYWNrZXQgc2NoZWR1bGVyLgorICAgRXZlcnkgc2NoZWR1bGVyIHdpbGwgbWFwIHRoZW0gdG8gcmVhbCB0cmFmZmljIGNsYXNzZXMsIGlmIGl0IGhhcworICAgbm8gbW9yZSBwcmVjaXNlIG1lY2hhbmlzbSB0byBjbGFzc2lmeSBwYWNrZXRzLgorCisgICBUaGVzZSBudW1iZXJzIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nLCB0aG91Z2ggdGhlaXIgY29pbmNpZGVuY2UKKyAgIHdpdGggb2Jzb2xldGUgSVB2NiB2YWx1ZXMgaXMgbm90IG9jY2FzaW9uYWwgOi0pLiBOZXcgSVB2NiBkcmFmdHMKKyAgIHByZWZlcnJlZCBmdWxsIGFuYXJjaHkgaW5zcGlyZWQgYnkgZGlmZnNlcnYgZ3JvdXAuCisKKyAgIE5vdGU6IFRDX1BSSU9fQkVTVEVGRk9SVCBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgdGhlIG1vc3QgdW5oYXBweQorICAgY2xhc3MsIGFjdHVhbGx5LCBhcyBydWxlIGl0IHdpbGwgYmUgaGFuZGxlZCB3aXRoIG1vcmUgY2FyZSB0aGFuCisgICBmaWxsZXIgb3IgZXZlbiBidWxrLgorICovCisKKyNkZWZpbmUgVENfUFJJT19CRVNURUZGT1JUCQkwCisjZGVmaW5lIFRDX1BSSU9fRklMTEVSCQkJMQorI2RlZmluZSBUQ19QUklPX0JVTEsJCQkyCisjZGVmaW5lIFRDX1BSSU9fSU5URVJBQ1RJVkVfQlVMSwk0CisjZGVmaW5lIFRDX1BSSU9fSU5URVJBQ1RJVkUJCTYKKyNkZWZpbmUgVENfUFJJT19DT05UUk9MCQkJNworCisjZGVmaW5lIFRDX1BSSU9fTUFYCQkJMTUKKworLyogR2VuZXJpYyBxdWV1ZSBzdGF0aXN0aWNzLCBhdmFpbGFibGUgZm9yIGFsbCB0aGUgZWxlbWVudHMuCisgICBQYXJ0aWN1bGFyIHNjaGVkdWxlcnMgbWF5IGhhdmUgYWxzbyB0aGVpciBwcml2YXRlIHJlY29yZHMuCisgKi8KKworc3RydWN0IHRjX3N0YXRzCit7CisJX191NjQJYnl0ZXM7CQkJLyogTlVtYmVyIG9mIGVucXVldWVzIGJ5dGVzICovCisJX191MzIJcGFja2V0czsJCS8qIE51bWJlciBvZiBlbnF1ZXVlZCBwYWNrZXRzCSovCisJX191MzIJZHJvcHM7CQkJLyogUGFja2V0cyBkcm9wcGVkIGJlY2F1c2Ugb2YgbGFjayBvZiByZXNvdXJjZXMgKi8KKwlfX3UzMglvdmVybGltaXRzOwkJLyogTnVtYmVyIG9mIHRocm90dGxlIGV2ZW50cyB3aGVuIHRoaXMKKwkJCQkJICogZmxvdyBnb2VzIG91dCBvZiBhbGxvY2F0ZWQgYmFuZHdpZHRoICovCisJX191MzIJYnBzOwkJCS8qIEN1cnJlbnQgZmxvdyBieXRlIHJhdGUgKi8KKwlfX3UzMglwcHM7CQkJLyogQ3VycmVudCBmbG93IHBhY2tldCByYXRlICovCisJX191MzIJcWxlbjsKKwlfX3UzMgliYWNrbG9nOworfTsKKworc3RydWN0IHRjX2VzdGltYXRvcgoreworCXNpZ25lZCBjaGFyCWludGVydmFsOworCXVuc2lnbmVkIGNoYXIJZXdtYV9sb2c7Cit9OworCisvKiAiSGFuZGxlcyIKKyAgIC0tLS0tLS0tLQorCisgICAgQWxsIHRoZSB0cmFmZmljIGNvbnRyb2wgb2JqZWN0cyBoYXZlIDMyYml0IGlkZW50aWZpZXJzLCBvciAiaGFuZGxlcyIuCisKKyAgICBUaGV5IGNhbiBiZSBjb25zaWRlcmVkIGFzIG9wYXF1ZSBudW1iZXJzIGZyb20gdXNlciBBUEkgdmlld3BvaW50LAorICAgIGJ1dCBhY3R1YWxseSB0aGV5IGFsd2F5cyBjb25zaXN0IG9mIHR3byBmaWVsZHM6IG1ham9yIGFuZAorICAgIG1pbm9yIG51bWJlcnMsIHdoaWNoIGFyZSBpbnRlcnByZXRlZCBieSBrZXJuZWwgc3BlY2lhbGx5LAorICAgIHRoYXQgbWF5IGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLCB0aG91Z2ggbm90IHJlY29tbWVuZGVkLgorCisgICAgRi5lLiBxZGlzYyBoYW5kbGVzIGFsd2F5cyBoYXZlIG1pbm9yIG51bWJlciBlcXVhbCB0byB6ZXJvLAorICAgIGNsYXNzZXMgKG9yIGZsb3dzKSBoYXZlIG1ham9yIGVxdWFsIHRvIHBhcmVudCBxZGlzYyBtYWpvciwgYW5kCisgICAgbWlub3IgdW5pcXVlbHkgaWRlbnRpZnlpbmcgY2xhc3MgaW5zaWRlIHFkaXNjLgorCisgICAgTWFjcm9zIHRvIG1hbmlwdWxhdGUgaGFuZGxlczoKKyAqLworCisjZGVmaW5lIFRDX0hfTUFKX01BU0sgKDB4RkZGRjAwMDBVKQorI2RlZmluZSBUQ19IX01JTl9NQVNLICgweDAwMDBGRkZGVSkKKyNkZWZpbmUgVENfSF9NQUooaCkgKChoKSZUQ19IX01BSl9NQVNLKQorI2RlZmluZSBUQ19IX01JTihoKSAoKGgpJlRDX0hfTUlOX01BU0spCisjZGVmaW5lIFRDX0hfTUFLRShtYWosbWluKSAoKChtYWopJlRDX0hfTUFKX01BU0spfCgobWluKSZUQ19IX01JTl9NQVNLKSkKKworI2RlZmluZSBUQ19IX1VOU1BFQwkoMFUpCisjZGVmaW5lIFRDX0hfUk9PVAkoMHhGRkZGRkZGRlUpCisjZGVmaW5lIFRDX0hfSU5HUkVTUyAgICAoMHhGRkZGRkZGMVUpCisKK3N0cnVjdCB0Y19yYXRlc3BlYworeworCXVuc2lnbmVkIGNoYXIJY2VsbF9sb2c7CisJdW5zaWduZWQgY2hhcglfX3Jlc2VydmVkOworCXVuc2lnbmVkIHNob3J0CW92ZXJoZWFkOworCXNob3J0CQljZWxsX2FsaWduOworCXVuc2lnbmVkIHNob3J0CW1wdTsKKwlfX3UzMgkJcmF0ZTsKK307CisKKy8qIEZJRk8gc2VjdGlvbiAqLworCitzdHJ1Y3QgdGNfZmlmb19xb3B0Cit7CisJX191MzIJbGltaXQ7CS8qIFF1ZXVlIGxlbmd0aDogYnl0ZXMgZm9yIGJmaWZvLCBwYWNrZXRzIGZvciBwZmlmbyAqLworfTsKKworLyogUFJJTyBzZWN0aW9uICovCisKKyNkZWZpbmUgVENRX1BSSU9fQkFORFMJMTYKKyNkZWZpbmUgVENRX01JTl9QUklPX0JBTkRTIDIKKworc3RydWN0IHRjX3ByaW9fcW9wdAoreworCWludAliYW5kczsJCQkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKwlfX3U4CXByaW9tYXBbVENfUFJJT19NQVgrMV07CS8qIE1hcDogbG9naWNhbCBwcmlvcml0eSAtPiBQUklPIGJhbmQgKi8KK307CisKK2VudW0KK3sKKwlUQ0FfUFJJT19VTlNQRUMsCisJVENBX1BSSU9fTVEsCisJX19UQ0FfUFJJT19NQVgKK307CisKKyNkZWZpbmUgVENBX1BSSU9fTUFYICAgIChfX1RDQV9QUklPX01BWCAtIDEpCisKKy8qIFRCRiBzZWN0aW9uICovCisKK3N0cnVjdCB0Y190YmZfcW9wdAoreworCXN0cnVjdCB0Y19yYXRlc3BlYyByYXRlOworCXN0cnVjdCB0Y19yYXRlc3BlYyBwZWFrcmF0ZTsKKwlfX3UzMgkJbGltaXQ7CisJX191MzIJCWJ1ZmZlcjsKKwlfX3UzMgkJbXR1OworfTsKKworZW51bQoreworCVRDQV9UQkZfVU5TUEVDLAorCVRDQV9UQkZfUEFSTVMsCisJVENBX1RCRl9SVEFCLAorCVRDQV9UQkZfUFRBQiwKKwlfX1RDQV9UQkZfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfVEJGX01BWCAoX19UQ0FfVEJGX01BWCAtIDEpCisKKworLyogVEVRTCBzZWN0aW9uICovCisKKy8qIFRFUUwgZG9lcyBub3QgcmVxdWlyZSBhbnkgcGFyYW1ldGVycyAqLworCisvKiBTRlEgc2VjdGlvbiAqLworCitzdHJ1Y3QgdGNfc2ZxX3FvcHQKK3sKKwl1bnNpZ25lZAlxdWFudHVtOwkvKiBCeXRlcyBwZXIgcm91bmQgYWxsb2NhdGVkIHRvIGZsb3cgKi8KKwlpbnQJCXBlcnR1cmJfcGVyaW9kOwkvKiBQZXJpb2Qgb2YgaGFzaCBwZXJ0dXJiYXRpb24gKi8KKwlfX3UzMgkJbGltaXQ7CQkvKiBNYXhpbWFsIHBhY2tldHMgaW4gcXVldWUgKi8KKwl1bnNpZ25lZAlkaXZpc29yOwkvKiBIYXNoIGRpdmlzb3IgICovCisJdW5zaWduZWQJZmxvd3M7CQkvKiBNYXhpbWFsIG51bWJlciBvZiBmbG93cyAgKi8KK307CisKKy8qCisgKiAgTk9URTogbGltaXQsIGRpdmlzb3IgYW5kIGZsb3dzIGFyZSBoYXJkd2lyZWQgdG8gY29kZSBhdCB0aGUgbW9tZW50LgorICoKKyAqCWxpbWl0PWZsb3dzPTEyOCwgZGl2aXNvcj0xMDI0OworICoKKyAqCVRoZSBvbmx5IHJlYXNvbiBmb3IgdGhpcyBpcyBlZmZpY2llbmN5LCBpdCBpcyBwb3NzaWJsZQorICoJdG8gY2hhbmdlIHRoZXNlIHBhcmFtZXRlcnMgaW4gY29tcGlsZSB0aW1lLgorICovCisKKy8qIFJFRCBzZWN0aW9uICovCisKK2VudW0KK3sKKwlUQ0FfUkVEX1VOU1BFQywKKwlUQ0FfUkVEX1BBUk1TLAorCVRDQV9SRURfU1RBQiwKKwlfX1RDQV9SRURfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfUkVEX01BWCAoX19UQ0FfUkVEX01BWCAtIDEpCisKK3N0cnVjdCB0Y19yZWRfcW9wdAoreworCV9fdTMyCQlsaW1pdDsJCS8qIEhBUkQgbWF4aW1hbCBxdWV1ZSBsZW5ndGggKGJ5dGVzKQkqLworCV9fdTMyCQlxdGhfbWluOwkvKiBNaW4gYXZlcmFnZSBsZW5ndGggdGhyZXNob2xkIChieXRlcykgKi8KKwlfX3UzMgkJcXRoX21heDsJLyogTWF4IGF2ZXJhZ2UgbGVuZ3RoIHRocmVzaG9sZCAoYnl0ZXMpICovCisJdW5zaWduZWQgY2hhciAgIFdsb2c7CQkvKiBsb2coVykJCSovCisJdW5zaWduZWQgY2hhciAgIFBsb2c7CQkvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpCSovCisJdW5zaWduZWQgY2hhciAgIFNjZWxsX2xvZzsJLyogY2VsbCBzaXplIGZvciBpZGxlIGRhbXBpbmcgKi8KKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworI2RlZmluZSBUQ19SRURfRUNOCTEKKyNkZWZpbmUgVENfUkVEX0hBUkREUk9QCTIKK307CisKK3N0cnVjdCB0Y19yZWRfeHN0YXRzCit7CisJX191MzIgICAgICAgICAgIGVhcmx5OyAgICAgICAgICAvKiBFYXJseSBkcm9wcyAqLworCV9fdTMyICAgICAgICAgICBwZHJvcDsgICAgICAgICAgLyogRHJvcHMgZHVlIHRvIHF1ZXVlIGxpbWl0cyAqLworCV9fdTMyICAgICAgICAgICBvdGhlcjsgICAgICAgICAgLyogRHJvcHMgZHVlIHRvIGRyb3AoKSBjYWxscyAqLworCV9fdTMyICAgICAgICAgICBtYXJrZWQ7ICAgICAgICAgLyogTWFya2VkIHBhY2tldHMgKi8KK307CisKKy8qIEdSRUQgc2VjdGlvbiAqLworCisjZGVmaW5lIE1BWF9EUHMgMTYKKworZW51bQoreworICAgICAgIFRDQV9HUkVEX1VOU1BFQywKKyAgICAgICBUQ0FfR1JFRF9QQVJNUywKKyAgICAgICBUQ0FfR1JFRF9TVEFCLAorICAgICAgIFRDQV9HUkVEX0RQUywKKwkgICBfX1RDQV9HUkVEX01BWCwKK307CisKKyNkZWZpbmUgVENBX0dSRURfTUFYIChfX1RDQV9HUkVEX01BWCAtIDEpCisKK3N0cnVjdCB0Y19ncmVkX3FvcHQKK3sKKwlfX3UzMgkJbGltaXQ7ICAgICAgICAvKiBIQVJEIG1heGltYWwgcXVldWUgbGVuZ3RoIChieXRlcykgICAgKi8KKwlfX3UzMgkJcXRoX21pbjsgICAgICAvKiBNaW4gYXZlcmFnZSBsZW5ndGggdGhyZXNob2xkIChieXRlcykgKi8KKwlfX3UzMgkJcXRoX21heDsgICAgICAvKiBNYXggYXZlcmFnZSBsZW5ndGggdGhyZXNob2xkIChieXRlcykgKi8KKwlfX3UzMgkJRFA7ICAgICAgICAgICAvKiB1cHRvIDJeMzIgRFBzICovCisJX191MzIJCWJhY2tsb2c7CisJX191MzIJCXFhdmU7CisJX191MzIJCWZvcmNlZDsKKwlfX3UzMgkJZWFybHk7CisJX191MzIJCW90aGVyOworCV9fdTMyCQlwZHJvcDsKKwlfX3U4CQlXbG9nOyAgICAgICAgIC8qIGxvZyhXKSAgICAgICAgICAgICAgICovCisJX191OAkJUGxvZzsgICAgICAgICAvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpICovCisJX191OAkJU2NlbGxfbG9nOyAgICAvKiBjZWxsIHNpemUgZm9yIGlkbGUgZGFtcGluZyAqLworCV9fdTgJCXByaW87ICAgICAgICAgLyogcHJpbyBvZiB0aGlzIFZRICovCisJX191MzIJCXBhY2tldHM7CisJX191MzIJCWJ5dGVzaW47Cit9OworCisvKiBncmVkIHNldHVwICovCitzdHJ1Y3QgdGNfZ3JlZF9zb3B0Cit7CisJX191MzIJCURQczsKKwlfX3UzMgkJZGVmX0RQOworCV9fdTgJCWdyaW87CisJX191OAkJZmxhZ3M7CisJX191MTYJCXBhZDE7Cit9OworCisvKiBIVEIgc2VjdGlvbiAqLworI2RlZmluZSBUQ19IVEJfTlVNUFJJTwkJOAorI2RlZmluZSBUQ19IVEJfTUFYREVQVEgJCTgKKyNkZWZpbmUgVENfSFRCX1BST1RPVkVSCQkzIC8qIHRoZSBzYW1lIGFzIEhUQiBhbmQgVEMncyBtYWpvciAqLworCitzdHJ1Y3QgdGNfaHRiX29wdAoreworCXN0cnVjdCB0Y19yYXRlc3BlYyAJcmF0ZTsKKwlzdHJ1Y3QgdGNfcmF0ZXNwZWMgCWNlaWw7CisJX191MzIJYnVmZmVyOworCV9fdTMyCWNidWZmZXI7CisJX191MzIJcXVhbnR1bTsKKwlfX3UzMglsZXZlbDsJCS8qIG91dCBvbmx5ICovCisJX191MzIJcHJpbzsKK307CitzdHJ1Y3QgdGNfaHRiX2dsb2IKK3sKKwlfX3UzMiB2ZXJzaW9uOwkJLyogdG8gbWF0Y2ggSFRCL1RDICovCisgICAgCV9fdTMyIHJhdGUycXVhbnR1bTsJLyogYnBzLT5xdWFudHVtIGRpdmlzb3IgKi8KKyAgICAJX191MzIgZGVmY2xzOwkJLyogZGVmYXVsdCBjbGFzcyBudW1iZXIgKi8KKwlfX3UzMiBkZWJ1ZzsJCS8qIGRlYnVnIGZsYWdzICovCisKKwkvKiBzdGF0cyAqLworCV9fdTMyIGRpcmVjdF9wa3RzOyAvKiBjb3VudCBvZiBub24gc2hhcHBlZCBwYWNrZXRzICovCit9OworZW51bQoreworCVRDQV9IVEJfVU5TUEVDLAorCVRDQV9IVEJfUEFSTVMsCisJVENBX0hUQl9JTklULAorCVRDQV9IVEJfQ1RBQiwKKwlUQ0FfSFRCX1JUQUIsCisJX19UQ0FfSFRCX01BWCwKK307CisKKyNkZWZpbmUgVENBX0hUQl9NQVggKF9fVENBX0hUQl9NQVggLSAxKQorCitzdHJ1Y3QgdGNfaHRiX3hzdGF0cworeworCV9fdTMyIGxlbmRzOworCV9fdTMyIGJvcnJvd3M7CisJX191MzIgZ2lhbnRzOwkvKiB0b28gYmlnIHBhY2tldHMgKHJhdGUgd2lsbCBub3QgYmUgYWNjdXJhdGUpICovCisJX191MzIgdG9rZW5zOworCV9fdTMyIGN0b2tlbnM7Cit9OworCisvKiBIRlNDIHNlY3Rpb24gKi8KKworc3RydWN0IHRjX2hmc2NfcW9wdAoreworCV9fdTE2CWRlZmNsczsJCS8qIGRlZmF1bHQgY2xhc3MgKi8KK307CisKK3N0cnVjdCB0Y19zZXJ2aWNlX2N1cnZlCit7CisJX191MzIJbTE7CQkvKiBzbG9wZSBvZiB0aGUgZmlyc3Qgc2VnbWVudCBpbiBicHMgKi8KKwlfX3UzMglkOwkJLyogeC1wcm9qZWN0aW9uIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIHVzICovCisJX191MzIJbTI7CQkvKiBzbG9wZSBvZiB0aGUgc2Vjb25kIHNlZ21lbnQgaW4gYnBzICovCit9OworCitzdHJ1Y3QgdGNfaGZzY19zdGF0cworeworCV9fdTY0CXdvcms7CQkvKiB0b3RhbCB3b3JrIGRvbmUgKi8KKwlfX3U2NAlydHdvcms7CQkvKiB3b3JrIGRvbmUgYnkgcmVhbC10aW1lIGNyaXRlcmlhICovCisJX191MzIJcGVyaW9kOwkJLyogY3VycmVudCBwZXJpb2QgKi8KKwlfX3UzMglsZXZlbDsJCS8qIGNsYXNzIGxldmVsIGluIGhpZXJhcmNoeSAqLworfTsKKworZW51bQoreworCVRDQV9IRlNDX1VOU1BFQywKKwlUQ0FfSEZTQ19SU0MsCisJVENBX0hGU0NfRlNDLAorCVRDQV9IRlNDX1VTQywKKwlfX1RDQV9IRlNDX01BWCwKK307CisKKyNkZWZpbmUgVENBX0hGU0NfTUFYIChfX1RDQV9IRlNDX01BWCAtIDEpCisKKworLyogQ0JRIHNlY3Rpb24gKi8KKworI2RlZmluZSBUQ19DQlFfTUFYUFJJTwkJOAorI2RlZmluZSBUQ19DQlFfTUFYTEVWRUwJCTgKKyNkZWZpbmUgVENfQ0JRX0RFRl9FV01BCQk1CisKK3N0cnVjdCB0Y19jYnFfbHNzb3B0Cit7CisJdW5zaWduZWQgY2hhcgljaGFuZ2U7CisJdW5zaWduZWQgY2hhcglmbGFnczsKKyNkZWZpbmUgVENGX0NCUV9MU1NfQk9VTkRFRAkxCisjZGVmaW5lIFRDRl9DQlFfTFNTX0lTT0xBVEVECTIKKwl1bnNpZ25lZCBjaGFyICAJZXdtYV9sb2c7CisJdW5zaWduZWQgY2hhciAgCWxldmVsOworI2RlZmluZSBUQ0ZfQ0JRX0xTU19GTEFHUwkxCisjZGVmaW5lIFRDRl9DQlFfTFNTX0VXTUEJMgorI2RlZmluZSBUQ0ZfQ0JRX0xTU19NQVhJRExFCTQKKyNkZWZpbmUgVENGX0NCUV9MU1NfTUlOSURMRQk4CisjZGVmaW5lIFRDRl9DQlFfTFNTX09GRlRJTUUJMHgxMAorI2RlZmluZSBUQ0ZfQ0JRX0xTU19BVlBLVAkweDIwCisJX191MzIJCW1heGlkbGU7CisJX191MzIJCW1pbmlkbGU7CisJX191MzIJCW9mZnRpbWU7CisJX191MzIJCWF2cGt0OworfTsKKworc3RydWN0IHRjX2NicV93cnJvcHQKK3sKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOworCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHk7CisJdW5zaWduZWQgY2hhcgljcHJpb3JpdHk7CisJdW5zaWduZWQgY2hhcglfX3Jlc2VydmVkOworCV9fdTMyCQlhbGxvdDsKKwlfX3UzMgkJd2VpZ2h0OworfTsKKworc3RydWN0IHRjX2NicV9vdmwKK3sKKwl1bnNpZ25lZCBjaGFyCXN0cmF0ZWd5OworI2RlZmluZQlUQ19DQlFfT1ZMX0NMQVNTSUMJMAorI2RlZmluZQlUQ19DQlFfT1ZMX0RFTEFZCTEKKyNkZWZpbmUJVENfQ0JRX09WTF9MT1dQUklPCTIKKyNkZWZpbmUJVENfQ0JRX09WTF9EUk9QCQkzCisjZGVmaW5lCVRDX0NCUV9PVkxfUkNMQVNTSUMJNAorCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHkyOworCV9fdTE2CQlwYWQ7CisJX191MzIJCXBlbmFsdHk7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3BvbGljZQoreworCXVuc2lnbmVkIGNoYXIJcG9saWNlOworCXVuc2lnbmVkIGNoYXIJX19yZXMxOworCXVuc2lnbmVkIHNob3J0CV9fcmVzMjsKK307CisKK3N0cnVjdCB0Y19jYnFfZm9wdAoreworCV9fdTMyCQlzcGxpdDsKKwlfX3UzMgkJZGVmbWFwOworCV9fdTMyCQlkZWZjaGFuZ2U7Cit9OworCitzdHJ1Y3QgdGNfY2JxX3hzdGF0cworeworCV9fdTMyCQlib3Jyb3dzOworCV9fdTMyCQlvdmVyYWN0aW9uczsKKwlfX3MzMgkJYXZnaWRsZTsKKwlfX3MzMgkJdW5kZXJ0aW1lOworfTsKKworZW51bQoreworCVRDQV9DQlFfVU5TUEVDLAorCVRDQV9DQlFfTFNTT1BULAorCVRDQV9DQlFfV1JST1BULAorCVRDQV9DQlFfRk9QVCwKKwlUQ0FfQ0JRX09WTF9TVFJBVEVHWSwKKwlUQ0FfQ0JRX1JBVEUsCisJVENBX0NCUV9SVEFCLAorCVRDQV9DQlFfUE9MSUNFLAorCV9fVENBX0NCUV9NQVgsCit9OworCisjZGVmaW5lIFRDQV9DQlFfTUFYCShfX1RDQV9DQlFfTUFYIC0gMSkKKworLyogZHNtYXJrIHNlY3Rpb24gKi8KKworZW51bSB7CisJVENBX0RTTUFSS19VTlNQRUMsCisJVENBX0RTTUFSS19JTkRJQ0VTLAorCVRDQV9EU01BUktfREVGQVVMVF9JTkRFWCwKKwlUQ0FfRFNNQVJLX1NFVF9UQ19JTkRFWCwKKwlUQ0FfRFNNQVJLX01BU0ssCisJVENBX0RTTUFSS19WQUxVRSwKKwlfX1RDQV9EU01BUktfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfRFNNQVJLX01BWCAoX19UQ0FfRFNNQVJLX01BWCAtIDEpCisKKy8qIEFUTSAgc2VjdGlvbiAqLworCitlbnVtIHsKKwlUQ0FfQVRNX1VOU1BFQywKKwlUQ0FfQVRNX0ZELAkJLyogZmlsZS9zb2NrZXQgZGVzY3JpcHRvciAqLworCVRDQV9BVE1fUFRSLAkJLyogcG9pbnRlciB0byBkZXNjcmlwdG9yIC0gbGF0ZXIgKi8KKwlUQ0FfQVRNX0hEUiwJCS8qIExMIGhlYWRlciAqLworCVRDQV9BVE1fRVhDRVNTLAkJLyogZXhjZXNzIHRyYWZmaWMgY2xhc3MgKDAgZm9yIENMUCkgICovCisJVENBX0FUTV9BRERSLAkJLyogUFZDIGFkZHJlc3MgKGZvciBvdXRwdXQgb25seSkgKi8KKwlUQ0FfQVRNX1NUQVRFLAkJLyogVkMgc3RhdGUgKEFUTV9WU18qOyBmb3Igb3V0cHV0IG9ubHkpICovCisJX19UQ0FfQVRNX01BWCwKK307CisKKyNkZWZpbmUgVENBX0FUTV9NQVgJKF9fVENBX0FUTV9NQVggLSAxKQorCisvKiBOZXR3b3JrIGVtdWxhdG9yICovCisKK2VudW0KK3sKKwlUQ0FfTkVURU1fVU5TUEVDLAorCVRDQV9ORVRFTV9DT1JSLAorCVRDQV9ORVRFTV9ERUxBWV9ESVNULAorCVRDQV9ORVRFTV9SRU9SREVSLAorCVRDQV9ORVRFTV9DT1JSVVBULAorCV9fVENBX05FVEVNX01BWCwKK307CisKKyNkZWZpbmUgVENBX05FVEVNX01BWCAoX19UQ0FfTkVURU1fTUFYIC0gMSkKKworc3RydWN0IHRjX25ldGVtX3FvcHQKK3sKKwlfX3UzMglsYXRlbmN5OwkvKiBhZGRlZCBkZWxheSAodXMpICovCisJX191MzIgICBsaW1pdDsJCS8qIGZpZm8gbGltaXQgKHBhY2tldHMpICovCisJX191MzIJbG9zczsJCS8qIHJhbmRvbSBwYWNrZXQgbG9zcyAoMD1ub25lIH4wPTEwMCUpICovCisJX191MzIJZ2FwOwkJLyogcmUtb3JkZXJpbmcgZ2FwICgwIGZvciBub25lKSAqLworCV9fdTMyICAgZHVwbGljYXRlOwkvKiByYW5kb20gcGFja2V0IGR1cCAgKDA9bm9uZSB+MD0xMDAlKSAqLworCV9fdTMyCWppdHRlcjsJCS8qIHJhbmRvbSBqaXR0ZXIgaW4gbGF0ZW5jeSAodXMpICovCit9OworCitzdHJ1Y3QgdGNfbmV0ZW1fY29ycgoreworCV9fdTMyCWRlbGF5X2NvcnI7CS8qIGRlbGF5IGNvcnJlbGF0aW9uICovCisJX191MzIJbG9zc19jb3JyOwkvKiBwYWNrZXQgbG9zcyBjb3JyZWxhdGlvbiAqLworCV9fdTMyCWR1cF9jb3JyOwkvKiBkdXBsaWNhdGUgY29ycmVsYXRpb24gICovCit9OworCitzdHJ1Y3QgdGNfbmV0ZW1fcmVvcmRlcgoreworCV9fdTMyCXByb2JhYmlsaXR5OworCV9fdTMyCWNvcnJlbGF0aW9uOworfTsKKworc3RydWN0IHRjX25ldGVtX2NvcnJ1cHQKK3sKKwlfX3UzMglwcm9iYWJpbGl0eTsKKwlfX3UzMgljb3JyZWxhdGlvbjsKK307CisKKyNkZWZpbmUgTkVURU1fRElTVF9TQ0FMRQk4MTkyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RjZHZkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BrdGNkdmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjY4MDVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wa3RjZHZkLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFBldGVyIE9zdGVybHVuZCA8cGV0ZXJvMkB0ZWxpYS5jb20+CisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFBhY2tldCB3cml0aW5nIGxheWVyIGZvciBBVEFQSSBhbmQgU0NTSSBDRC1SLCBDRC1SVywgRFZELVIsIGFuZAorICogRFZELVJXIGRldmljZXMuCisgKgorICovCisjaWZuZGVmIF9fUEtUQ0RWRF9ICisjZGVmaW5lIF9fUEtUQ0RWRF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogMSBmb3Igbm9ybWFsIGRlYnVnIG1lc3NhZ2VzLCAyIGlzIHZlcnkgdmVyYm9zZS4gMCB0byB0dXJuIGl0IG9mZi4KKyAqLworI2RlZmluZSBQQUNLRVRfREVCVUcJCTEKKworI2RlZmluZQlNQVhfV1JJVEVSUwkJOAorCisjZGVmaW5lIFBLVF9SQl9QT09MX1NJWkUJNTEyCisKKy8qCisgKiBIb3cgbG9uZyB3ZSBzaG91bGQgaG9sZCBhIG5vbi1mdWxsIHBhY2tldCBiZWZvcmUgc3RhcnRpbmcgZGF0YSBnYXRoZXJpbmcuCisgKi8KKyNkZWZpbmUgUEFDS0VUX1dBSVRfVElNRQkoSFogKiA1IC8gMTAwMCkKKworLyoKKyAqIHVzZSBkcml2ZSB3cml0ZSBjYWNoaW5nIC0tIHdlIG5lZWQgZGVmZXJyZWQgZXJyb3IgaGFuZGxpbmcgdG8gYmUKKyAqIGFibGUgdG8gc3VjZXNzZnVsbHkgcmVjb3ZlciB3aXRoIHRoaXMgb3B0aW9uIChkcml2ZSB3aWxsIHJldHVybiBnb29kCisgKiBzdGF0dXMgYXMgc29vbiBhcyB0aGUgY2RiIGlzIHZhbGlkYXRlZCkuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSkKKyNkZWZpbmUgVVNFX1dDQUNISU5HCQkxCisjZWxzZQorI2RlZmluZSBVU0VfV0NBQ0hJTkcJCTAKKyNlbmRpZgorCisvKgorICogTm8gdXNlci1zZXJ2aWNhYmxlIHBhcnRzIGJleW9uZCB0aGlzIHBvaW50IC0+CisgKi8KKworLyoKKyAqIGRldmljZSB0eXBlcworICovCisjZGVmaW5lIFBBQ0tFVF9DRFIJCTEKKyNkZWZpbmUJUEFDS0VUX0NEUlcJCTIKKyNkZWZpbmUgUEFDS0VUX0RWRFIJCTMKKyNkZWZpbmUgUEFDS0VUX0RWRFJXCQk0CisKKy8qCisgKiBmbGFncworICovCisjZGVmaW5lIFBBQ0tFVF9XUklUQUJMRQkJMQkvKiBwZCBpcyB3cml0YWJsZSAqLworI2RlZmluZSBQQUNLRVRfTldBX1ZBTElECTIJLyogbmV4dCB3cml0YWJsZSBhZGRyZXNzIHZhbGlkICovCisjZGVmaW5lIFBBQ0tFVF9MUkFfVkFMSUQJMwkvKiBsYXN0IHJlY29yZGVkIGFkZHJlc3MgdmFsaWQgKi8KKyNkZWZpbmUgUEFDS0VUX01FUkdFX1NFR1MJNAkvKiBwZXJmb3JtIHNlZ21lbnQgbWVyZ2luZyB0byBrZWVwICovCisJCQkJCS8qIHVuZGVybHlpbmcgY2Ryb20gZGV2aWNlIGhhcHB5ICovCisKKy8qCisgKiBEaXNjIHN0YXR1cyAtLSBmcm9tIFJFQURfRElTQ19JTkZPCisgKi8KKyNkZWZpbmUgUEFDS0VUX0RJU0NfRU1QVFkJMAorI2RlZmluZSBQQUNLRVRfRElTQ19JTkNPTVBMRVRFCTEKKyNkZWZpbmUgUEFDS0VUX0RJU0NfQ09NUExFVEUJMgorI2RlZmluZSBQQUNLRVRfRElTQ19PVEhFUgkzCisKKy8qCisgKiB3cml0ZSB0eXBlLCBhbmQgY29ycmVzcG9uZGluZyBkYXRhIGJsb2NrIHR5cGUKKyAqLworI2RlZmluZSBQQUNLRVRfTU9ERTEJCTEKKyNkZWZpbmUgUEFDS0VUX01PREUyCQkyCisjZGVmaW5lIFBBQ0tFVF9CTE9DS19NT0RFMQk4CisjZGVmaW5lIFBBQ0tFVF9CTE9DS19NT0RFMgkxMAorCisvKgorICogTGFzdCBzZXNzaW9uL2JvcmRlciBzdGF0dXMKKyAqLworI2RlZmluZSBQQUNLRVRfU0VTU0lPTl9FTVBUWQkJMAorI2RlZmluZSBQQUNLRVRfU0VTU0lPTl9JTkNPTVBMRVRFCTEKKyNkZWZpbmUgUEFDS0VUX1NFU1NJT05fUkVTRVJWRUQJCTIKKyNkZWZpbmUgUEFDS0VUX1NFU1NJT05fQ09NUExFVEUJCTMKKworI2RlZmluZSBQQUNLRVRfTUNOCQkJIjRhNjU2ZTczNDE3ODYyNmY2NTMyMzAzMDMwMDAwMCIKKworI3VuZGVmIFBBQ0tFVF9VU0VfTFMKKworI2RlZmluZSBQS1RfQ1RSTF9DTURfU0VUVVAJMAorI2RlZmluZSBQS1RfQ1RSTF9DTURfVEVBUkRPV04JMQorI2RlZmluZSBQS1RfQ1RSTF9DTURfU1RBVFVTCTIKKworc3RydWN0IHBrdF9jdHJsX2NvbW1hbmQgeworCV9fdTMyIGNvbW1hbmQ7CQkJCS8qIGluOiBTZXR1cCwgdGVhcmRvd24sIHN0YXR1cyAqLworCV9fdTMyIGRldl9pbmRleDsJCQkvKiBpbi9vdXQ6IERldmljZSBpbmRleCAqLworCV9fdTMyIGRldjsJCQkJLyogaW4vb3V0OiBEZXZpY2UgbnIgZm9yIGNkcncgZGV2aWNlICovCisJX191MzIgcGt0X2RldjsJCQkJLyogaW4vb3V0OiBEZXZpY2UgbnIgZm9yIHBhY2tldCBkZXZpY2UgKi8KKwlfX3UzMiBudW1fZGV2aWNlczsJCQkvKiBvdXQ6IExhcmdlc3QgZGV2aWNlIGluZGV4ICsgMSAqLworCV9fdTMyIHBhZGRpbmc7CQkJCS8qIE5vdCB1c2VkICovCit9OworCisvKgorICogcGFja2V0IGlvY3RscworICovCisjZGVmaW5lIFBBQ0tFVF9JT0NUTF9NQUdJQwkoJ1gnKQorI2RlZmluZSBQQUNLRVRfQ1RSTF9DTUQJCV9JT1dSKFBBQ0tFVF9JT0NUTF9NQUdJQywgMSwgc3RydWN0IHBrdF9jdHJsX2NvbW1hbmQpCisKKworI2VuZGlmIC8qIF9fUEtUQ0RWRF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BtdS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTc3Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wbXUuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciB0YWxraW5nIHRvIHRoZSBQTVUuICBUaGUgUE1VIGlzIGEgbWljcm9jb250cm9sbGVyCisgKiB3aGljaCBjb250cm9scyBiYXR0ZXJ5IGNoYXJnaW5nIGFuZCBzeXN0ZW0gcG93ZXIgb24gUG93ZXJCb29rIDM0MDAKKyAqIGFuZCAyNDAwIG1vZGVscyBhcyB3ZWxsIGFzIHRoZSBSVEMgYW5kIHZhcmlvdXMgb3RoZXIgdGhpbmdzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBQYXVsIE1hY2tlcnJhcy4KKyAqLworCisKKyNkZWZpbmUgUE1VX0RSSVZFUl9WRVJTSU9OCTIKKworLyoKKyAqIFBNVSBjb21tYW5kcworICovCisjZGVmaW5lIFBNVV9QT1dFUl9DVFJMMAkJMHgxMAkvKiBjb250cm9sIHBvd2VyIG9mIHNvbWUgZGV2aWNlcyAqLworI2RlZmluZSBQTVVfUE9XRVJfQ1RSTAkJMHgxMQkvKiBjb250cm9sIHBvd2VyIG9mIHNvbWUgZGV2aWNlcyAqLworI2RlZmluZSBQTVVfQURCX0NNRAkJMHgyMAkvKiBzZW5kIEFEQiBwYWNrZXQgKi8KKyNkZWZpbmUgUE1VX0FEQl9QT0xMX09GRgkweDIxCS8qIGRpc2FibGUgQURCIGF1dG8tcG9sbCAqLworI2RlZmluZSBQTVVfV1JJVEVfTlZSQU0JCTB4MzMJLyogd3JpdGUgbm9uLXZvbGF0aWxlIFJBTSAqLworI2RlZmluZSBQTVVfUkVBRF9OVlJBTQkJMHgzYgkvKiByZWFkIG5vbi12b2xhdGlsZSBSQU0gKi8KKyNkZWZpbmUgUE1VX1NFVF9SVEMJCTB4MzAJLyogc2V0IHJlYWwtdGltZSBjbG9jayAqLworI2RlZmluZSBQTVVfUkVBRF9SVEMJCTB4MzgJLyogcmVhZCByZWFsLXRpbWUgY2xvY2sgKi8KKyNkZWZpbmUgUE1VX1NFVF9WT0xCVVRUT04JMHg0MAkvKiBzZXQgdm9sdW1lIHVwL2Rvd24gcG9zaXRpb24gKi8KKyNkZWZpbmUgUE1VX0JBQ0tMSUdIVF9CUklHSFQJMHg0MQkvKiBzZXQgYmFja2xpZ2h0IGJyaWdodG5lc3MgKi8KKyNkZWZpbmUgUE1VX0dFVF9WT0xCVVRUT04JMHg0OAkvKiBnZXQgdm9sdW1lIHVwL2Rvd24gcG9zaXRpb24gKi8KKyNkZWZpbmUgUE1VX1BDRUpFQ1QJCTB4NGMJLyogZWplY3QgUEMtY2FyZCBmcm9tIHNsb3QgKi8KKyNkZWZpbmUgUE1VX0JBVFRFUllfU1RBVEUJMHg2YgkvKiByZXBvcnQgYmF0dGVyeSBzdGF0ZSBldGMuICovCisjZGVmaW5lIFBNVV9TTUFSVF9CQVRURVJZX1NUQVRFCTB4NmYJLyogcmVwb3J0IGJhdHRlcnkgc3RhdGUgKG5ldyB3YXkpICovCisjZGVmaW5lIFBNVV9TRVRfSU5UUl9NQVNLCTB4NzAJLyogc2V0IFBNVSBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBQTVVfSU5UX0FDSwkJMHg3OAkvKiByZWFkIGludGVycnVwdCBiaXRzICovCisjZGVmaW5lIFBNVV9TSFVURE9XTgkJMHg3ZQkvKiB0dXJuIHBvd2VyIG9mZiAqLworI2RlZmluZSBQTVVfQ1BVX1NQRUVECQkweDdkCS8qIGNvbnRyb2wgQ1BVIHNwZWVkIG9uIHNvbWUgbW9kZWxzICovCisjZGVmaW5lIFBNVV9TTEVFUAkJMHg3ZgkvKiBwdXQgQ1BVIHRvIHNsZWVwICovCisjZGVmaW5lIFBNVV9QT1dFUl9FVkVOVFMJMHg4ZgkvKiBTZW5kIHBvd2VyLWV2ZW50IGNvbW1hbmRzIHRvIFBNVSAqLworI2RlZmluZSBQTVVfSTJDX0NNRAkJMHg5YQkvKiBJMkMgb3BlcmF0aW9ucyAqLworI2RlZmluZSBQTVVfUkVTRVQJCTB4ZDAJLyogcmVzZXQgQ1BVICovCisjZGVmaW5lIFBNVV9HRVRfQlJJR0hUQlVUVE9OCTB4ZDkJLyogcmVwb3J0IGJyaWdodG5lc3MgdXAvZG93biBwb3MgKi8KKyNkZWZpbmUgUE1VX0dFVF9DT1ZFUgkJMHhkYwkvKiByZXBvcnQgY292ZXIgb3Blbi9jbG9zZWQgKi8KKyNkZWZpbmUgUE1VX1NZU1RFTV9SRUFEWQkweGRmCS8qIHRlbGwgUE1VIHdlIGFyZSBhd2FrZSAqLworI2RlZmluZSBQTVVfR0VUX1ZFUlNJT04JCTB4ZWEJLyogcmVhZCB0aGUgUE1VIHZlcnNpb24gKi8KKworLyogQml0cyB0byB1c2Ugd2l0aCB0aGUgUE1VX1BPV0VSX0NUUkwwIGNvbW1hbmQgKi8KKyNkZWZpbmUgUE1VX1BPVzBfT04JCTB4ODAJLyogT1IgdGhpcyB0byBwb3dlciBPTiB0aGUgZGV2aWNlICovCisjZGVmaW5lIFBNVV9QT1cwX09GRgkJMHgwMAkvKiBsZWF2ZSBiaXQgNyB0byAwIHRvIHBvd2VyIGl0IE9GRiAqLworI2RlZmluZSBQTVVfUE9XMF9IQVJEX0RSSVZFCTB4MDQJLyogSGFyZCBkcml2ZSBwb3dlciAob24gd2FsbHN0cmVldC9sb21iYXJkID8pICovCisKKy8qIEJpdHMgdG8gdXNlIHdpdGggdGhlIFBNVV9QT1dFUl9DVFJMIGNvbW1hbmQgKi8KKyNkZWZpbmUgUE1VX1BPV19PTgkJMHg4MAkvKiBPUiB0aGlzIHRvIHBvd2VyIE9OIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgUE1VX1BPV19PRkYJCTB4MDAJLyogbGVhdmUgYml0IDcgdG8gMCB0byBwb3dlciBpdCBPRkYgKi8KKyNkZWZpbmUgUE1VX1BPV19CQUNLTElHSFQJMHgwMQkvKiBiYWNrbGlnaHQgcG93ZXIgKi8KKyNkZWZpbmUgUE1VX1BPV19DSEFSR0VSCQkweDAyCS8qIGJhdHRlcnkgY2hhcmdlciBwb3dlciAqLworI2RlZmluZSBQTVVfUE9XX0lSTEVECQkweDA0CS8qIElSIGxlZCBwb3dlciAob24gd2FsbHN0cmVldCkgKi8KKyNkZWZpbmUgUE1VX1BPV19NRURJQUJBWQkweDA4CS8qIG1lZGlhIGJheSBwb3dlciAod2FsbHN0cmVldC9sb21iYXJkID8pICovCisKKy8qIEJpdHMgaW4gUE1VIGludGVycnVwdCBhbmQgaW50ZXJydXB0IG1hc2sgYnl0ZXMgKi8KKyNkZWZpbmUgUE1VX0lOVF9QQ0VKRUNUCQkweDA0CS8qIFBDLWNhcmQgZWplY3QgYnV0dG9ucyAqLworI2RlZmluZSBQTVVfSU5UX1NOREJSVAkJMHgwOAkvKiBzb3VuZC9icmlnaHRuZXNzIHVwL2Rvd24gYnV0dG9ucyAqLworI2RlZmluZSBQTVVfSU5UX0FEQgkJMHgxMAkvKiBBREIgYXV0b3BvbGwgb3IgcmVwbHkgZGF0YSAqLworI2RlZmluZSBQTVVfSU5UX0JBVFRFUlkJCTB4MjAJLyogQmF0dGVyeSBzdGF0ZSBjaGFuZ2UgKi8KKyNkZWZpbmUgUE1VX0lOVF9FTlZJUk9OTUVOVAkweDQwCS8qIEVudmlyb25tZW50IGludGVycnVwdHMgKi8KKyNkZWZpbmUgUE1VX0lOVF9USUNLCQkweDgwCS8qIDEtc2Vjb25kIHRpY2sgaW50ZXJydXB0ICovCisKKy8qIE90aGVyIGJpdHMgaW4gUE1VIGludGVycnVwdCB2YWxpZCB3aGVuIFBNVV9JTlRfQURCIGlzIHNldCAqLworI2RlZmluZSBQTVVfSU5UX0FEQl9BVVRPCTB4MDQJLyogQURCIGF1dG9wb2xsLCB3aGVuIFBNVV9JTlRfQURCICovCisjZGVmaW5lIFBNVV9JTlRfV0FJVElOR19DSEFSR0VSCTB4MDEJLyogPz8/ICovCisjZGVmaW5lIFBNVV9JTlRfQVVUT19TUlFfUE9MTAkweDAyCS8qID8/PyAqLworCisvKiBCaXRzIGluIHRoZSBlbnZpcm9uZW1lbnQgbWVzc2FnZSAoZWl0aGVyIG9idGFpbmVkIHZpYSBQTVVfR0VUX0NPVkVSLAorICogb3IgdmlhIFBNVV9JTlRfRU5WSVJPTk1FTlQgb24gY29yZTk5ICovCisjZGVmaW5lIFBNVV9FTlZfTElEX0NMT1NFRAkweDAxCS8qIFRoZSBsaWQgaXMgY2xvc2VkICovCisKKy8qIEkyQyByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIFBNVV9JMkNfTU9ERV9TSU1QTEUJMAorI2RlZmluZSBQTVVfSTJDX01PREVfU1REU1VCCTEKKyNkZWZpbmUgUE1VX0kyQ19NT0RFX0NPTUJJTkVECTIKKworI2RlZmluZSBQTVVfSTJDX0JVU19TVEFUVVMJMAorI2RlZmluZSBQTVVfSTJDX0JVU19TWVNDTEsJMQorI2RlZmluZSBQTVVfSTJDX0JVU19QT1dFUgkyCisKKyNkZWZpbmUgUE1VX0kyQ19TVEFUVVNfT0sJMAorI2RlZmluZSBQTVVfSTJDX1NUQVRVU19EQVRBUkVBRAkxCisjZGVmaW5lIFBNVV9JMkNfU1RBVFVTX0JVU1kJMHhmZQorCisKKy8qIEtpbmQgb2YgUE1VIChtb2RlbCkgKi8KK2VudW0geworCVBNVV9VTktOT1dOLAorCVBNVV9PSEFSRV9CQVNFRCwJLyogMjQwMCwgMzQwMCwgMzUwMCAob2xkIEczIHBvd2VyYm9vaykgKi8KKwlQTVVfSEVBVEhST1dfQkFTRUQsCS8qIFBvd2VyQm9vayBHMyBzZXJpZXMgKi8KKwlQTVVfUEFERElOR1RPTl9CQVNFRCwJLyogMTk5OSBQb3dlckJvb2sgRzMgKi8KKwlQTVVfS0VZTEFSR09fQkFTRUQsCS8qIENvcmU5OSBtb3RoZXJib2FyZCAoUE1VOTkpICovCisJUE1VXzY4S19WMSwJCS8qIDY4SyBQTVUsIHZlcnNpb24gMSAqLworCVBNVV82OEtfVjIsIAkJLyogNjhLIFBNVSwgdmVyc2lvbiAyICovCit9OworCisvKiBQTVUgUE1VX1BPV0VSX0VWRU5UUyBjb21tYW5kcyAqLworZW51bSB7CisJUE1VX1BXUl9HRVRfUE9XRVJVUF9FVkVOVFMJPSAweDAwLAorCVBNVV9QV1JfU0VUX1BPV0VSVVBfRVZFTlRTCT0gMHgwMSwKKwlQTVVfUFdSX0NMUl9QT1dFUlVQX0VWRU5UUwk9IDB4MDIsCisJUE1VX1BXUl9HRVRfV0FLRVVQX0VWRU5UUwk9IDB4MDMsCisJUE1VX1BXUl9TRVRfV0FLRVVQX0VWRU5UUwk9IDB4MDQsCisJUE1VX1BXUl9DTFJfV0FLRVVQX0VWRU5UUwk9IDB4MDUsCit9OworCisvKiBQb3dlciBldmVudHMgd2FrZXVwIGJpdHMgKi8KK2VudW0geworCVBNVV9QV1JfV0FLRVVQX0tFWQkJPSAweDAxLAkvKiBXYWtlIG9uIGtleSBwcmVzcyAqLworCVBNVV9QV1JfV0FLRVVQX0FDX0lOU0VSVAk9IDB4MDIsIC8qIFdha2Ugb24gQUMgYWRhcHRlciBwbHVnICovCisJUE1VX1BXUl9XQUtFVVBfQUNfQ0hBTkdFCT0gMHgwNCwKKwlQTVVfUFdSX1dBS0VVUF9MSURfT1BFTgkJPSAweDA4LAorCVBNVV9QV1JfV0FLRVVQX1JJTkcJCT0gMHgxMCwKK307CisJCisvKgorICogSW9jdGwgY29tbWFuZHMgZm9yIHRoZSAvZGV2L3BtdSBkZXZpY2UKKyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIG5vIHBhcmFtICovCisjZGVmaW5lIFBNVV9JT0NfU0xFRVAJCV9JTygnQicsIDApCisvKiBvdXQgcGFyYW06IHUzMioJYmFja2xpZ2h0IHZhbHVlOiAwIHRvIDE1ICovCisjZGVmaW5lIFBNVV9JT0NfR0VUX0JBQ0tMSUdIVAlfSU9SKCdCJywgMSwgc2l6ZV90KQorLyogaW4gcGFyYW06IHUzMgliYWNrbGlnaHQgdmFsdWU6IDAgdG8gMTUgKi8KKyNkZWZpbmUgUE1VX0lPQ19TRVRfQkFDS0xJR0hUCV9JT1coJ0InLCAyLCBzaXplX3QpCisvKiBvdXQgcGFyYW06IHUzMioJUE1VIG1vZGVsICovCisjZGVmaW5lIFBNVV9JT0NfR0VUX01PREVMCV9JT1IoJ0InLCAzLCBzaXplX3QpCisvKiBvdXQgcGFyYW06IHUzMioJaGFzX2FkYjogMCBvciAxICovCisjZGVmaW5lIFBNVV9JT0NfSEFTX0FEQgkJX0lPUignQicsIDQsIHNpemVfdCkgCisvKiBvdXQgcGFyYW06IHUzMioJY2FuX3NsZWVwOiAwIG9yIDEgKi8KKyNkZWZpbmUgUE1VX0lPQ19DQU5fU0xFRVAJX0lPUignQicsIDUsIHNpemVfdCkgCisvKiBubyBwYXJhbSwgYnV0IGhpc3RvcmljYWxseSB3YXMgX0lPUignQicsIDYsIDApLCBtZWFuaW5nIDQgYnl0ZXMgKi8KKyNkZWZpbmUgUE1VX0lPQ19HUkFCX0JBQ0tMSUdIVAlfSU9SKCdCJywgNiwgc2l6ZV90KSAKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb2xsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFiMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb2xsLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9MSU5VWF9QT0xMX0gKKyNkZWZpbmUgX0xJTlVYX1BPTExfSAorCisjaW5jbHVkZSA8YXNtL3BvbGwuaD4KKworCisjZW5kaWYgLyogX0xJTlVYX1BPTExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNGM5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmgKQEAgLTAsMCArMSw0OSBAQAorI2lmbmRlZiBfTElOVVhfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfUE9TSVhfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKy8qCisgKiBUaGlzIGFsbG93cyBmb3IgMTAyNCBmaWxlIGRlc2NyaXB0b3JzOiBpZiBOUl9PUEVOIGlzIGV2ZXIgZ3Jvd24KKyAqIGJleW9uZCB0aGF0IHlvdSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzIHRvby4gQnV0IDEwMjQgZmQncyBzZWVtIHRvIGJlCisgKiBlbm91Z2ggZXZlbiBmb3Igc3VjaCAicmVhbCIgdW5pY2VzIGxpa2UgT1NGLzEsIHNvIGhvcGVmdWxseSB0aGlzIGlzCisgKiBvbmUgbGltaXQgdGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUgY2hhbmdlZCBbYWdhaW5dLgorICoKKyAqIE5vdGUgdGhhdCBQT1NJWCB3YW50cyB0aGUgRkRfQ0xFQVIoZmQsZmRzZXRwKSBkZWZpbmVzIHRvIGJlIGluCisgKiA8c3lzL3RpbWUuaD4gKGFuZCB0aHVzIDxsaW51eC90aW1lLmg+KSAtIGJ1dCB0aGlzIGlzIGEgbW9yZSBsb2dpY2FsCisgKiBwbGFjZSBmb3IgdGhlbS4gU29sdmVkIGJ5IGhhdmluZyBkdW1teSBkZWZpbmVzIGluIDxzeXMvdGltZS5oPi4KKyAqLworCisvKgorICogVGhvc2UgbWFjcm9zIG1heSBoYXZlIGJlZW4gZGVmaW5lZCBpbiA8Z251L3R5cGVzLmg+LiBCdXQgd2UgYWx3YXlzCisgKiB1c2UgdGhlIG9uZXMgaGVyZS4gCisgKi8KKyN1bmRlZiBfX05GREJJVFMKKyNkZWZpbmUgX19ORkRCSVRTCSg4ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCisjdW5kZWYgX19GRF9TRVRTSVpFCisjZGVmaW5lIF9fRkRfU0VUU0laRQkxMDI0CisKKyN1bmRlZiBfX0ZEU0VUX0xPTkdTCisjZGVmaW5lIF9fRkRTRVRfTE9OR1MJKF9fRkRfU0VUU0laRS9fX05GREJJVFMpCisKKyN1bmRlZiBfX0ZERUxUCisjZGVmaW5lCV9fRkRFTFQoZCkJKChkKSAvIF9fTkZEQklUUykKKworI3VuZGVmIF9fRkRNQVNLCisjZGVmaW5lCV9fRkRNQVNLKGQpCSgxVUwgPDwgKChkKSAlIF9fTkZEQklUUykpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGZkc19iaXRzIFtfX0ZEU0VUX0xPTkdTXTsKK30gX19rZXJuZWxfZmRfc2V0OworCisvKiBUeXBlIG9mIGEgc2lnbmFsIGhhbmRsZXIuICAqLwordHlwZWRlZiB2b2lkICgqX19rZXJuZWxfc2lnaGFuZGxlcl90KShpbnQpOworCisvKiBUeXBlIG9mIGEgU1lTViBJUEMga2V5LiAgKi8KK3R5cGVkZWYgaW50IF9fa2VybmVsX2tleV90OwordHlwZWRlZiBpbnQgX19rZXJuZWxfbXFkX3Q7CisKKyNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxOGM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBkZXYuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9wcGRldi5oCisgKgorICogVXNlci1zcGFjZSBwYXJhbGxlbCBwb3J0IGRldmljZSBkcml2ZXIgKGhlYWRlciBmaWxlKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtOSBUaW0gV2F1Z2ggPHRpbUBjeWJlcmVsay5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEFkZGVkIFBQR0VUVElNRS9QUFNFVFRJTUUsIEZyZWQgQmFybmVzLCAxOTk5CisgKiBBZGRlZCBQUEdFVE1PREVTL1BQR0VUTU9ERS9QUEdFVFBIQVNFLCBGcmVkIEJhcm5lcyA8ZnJtYjJAdWtjLmFjLnVrPiwgMDMvMDEvMjAwMQorICovCisKKyNkZWZpbmUgUFBfSU9DVEwJJ3AnCisKKy8qIFNldCBtb2RlIGZvciByZWFkL3dyaXRlIChlLmcuIElFRUUxMjg0X01PREVfRVBQKSAqLworI2RlZmluZSBQUFNFVE1PREUJX0lPVyhQUF9JT0NUTCwgMHg4MCwgaW50KQorCisvKiBSZWFkIHN0YXR1cyAqLworI2RlZmluZSBQUFJTVEFUVVMJX0lPUihQUF9JT0NUTCwgMHg4MSwgdW5zaWduZWQgY2hhcikKKyNkZWZpbmUgUFBXU1RBVFVTCU9CU09MRVRFX19JT1coUFBfSU9DVEwsIDB4ODIsIHVuc2lnbmVkIGNoYXIpCisKKy8qIFJlYWQvd3JpdGUgY29udHJvbCAqLworI2RlZmluZSBQUFJDT05UUk9MCV9JT1IoUFBfSU9DVEwsIDB4ODMsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0NPTlRST0wJX0lPVyhQUF9JT0NUTCwgMHg4NCwgdW5zaWduZWQgY2hhcikKKworc3RydWN0IHBwZGV2X2Zyb2Jfc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJdW5zaWduZWQgY2hhciB2YWw7Cit9OworI2RlZmluZSBQUEZDT05UUk9MICAgICAgX0lPVyhQUF9JT0NUTCwgMHg4ZSwgc3RydWN0IHBwZGV2X2Zyb2Jfc3RydWN0KQorCisvKiBSZWFkL3dyaXRlIGRhdGEgKi8KKyNkZWZpbmUgUFBSREFUQQkJX0lPUihQUF9JT0NUTCwgMHg4NSwgdW5zaWduZWQgY2hhcikKKyNkZWZpbmUgUFBXREFUQQkJX0lPVyhQUF9JT0NUTCwgMHg4NiwgdW5zaWduZWQgY2hhcikKKworLyogUmVhZC93cml0ZSBlY29udHJvbCAobm90IHVzZWQpICovCisjZGVmaW5lIFBQUkVDT05UUk9MCU9CU09MRVRFX19JT1IoUFBfSU9DVEwsIDB4ODcsIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0VDT05UUk9MCU9CU09MRVRFX19JT1coUFBfSU9DVEwsIDB4ODgsIHVuc2lnbmVkIGNoYXIpCisKKy8qIFJlYWQvd3JpdGUgRklGTyAobm90IHVzZWQpICovCisjZGVmaW5lIFBQUkZJRk8JCU9CU09MRVRFX19JT1IoUFBfSU9DVEwsIDB4ODksIHVuc2lnbmVkIGNoYXIpCisjZGVmaW5lIFBQV0ZJRk8JCU9CU09MRVRFX19JT1coUFBfSU9DVEwsIDB4OGEsIHVuc2lnbmVkIGNoYXIpCisKKy8qIENsYWltIHRoZSBwb3J0IHRvIHN0YXJ0IHVzaW5nIGl0ICovCisjZGVmaW5lIFBQQ0xBSU0JCV9JTyhQUF9JT0NUTCwgMHg4YikKKworLyogUmVsZWFzZSB0aGUgcG9ydCB3aGVuIHlvdSBhcmVuJ3QgdXNpbmcgaXQgKi8KKyNkZWZpbmUgUFBSRUxFQVNFCV9JTyhQUF9JT0NUTCwgMHg4YykKKworLyogWWllbGQgdGhlIHBvcnQgKHJlbGVhc2UgaXQgaWYgYW5vdGhlciBkcml2ZXIgaXMgd2FpdGluZywKKyAqIHRoZW4gcmVjbGFpbSkgKi8KKyNkZWZpbmUgUFBZSUVMRAkJX0lPKFBQX0lPQ1RMLCAweDhkKQorCisvKiBSZWdpc3RlciBkZXZpY2UgZXhjbHVzaXZlbHkgKG11c3QgYmUgYmVmb3JlIFBQQ0xBSU0pLiAqLworI2RlZmluZSBQUEVYQ0wJCV9JTyhQUF9JT0NUTCwgMHg4ZikKKworLyogRGF0YSBsaW5lIGRpcmVjdGlvbjogbm9uLXplcm8gZm9yIGlucHV0IG1vZGUuICovCisjZGVmaW5lIFBQREFUQURJUglfSU9XKFBQX0lPQ1RMLCAweDkwLCBpbnQpCisKKy8qIE5lZ290aWF0ZSBhIHBhcnRpY3VsYXIgSUVFRSAxMjg0IG1vZGUuICovCisjZGVmaW5lIFBQTkVHT1QJCV9JT1coUFBfSU9DVEwsIDB4OTEsIGludCkKKworLyogU2V0IGNvbnRyb2wgbGluZXMgd2hlbiBhbiBpbnRlcnJ1cHQgb2NjdXJzLiAqLworI2RlZmluZSBQUFdDVExPTklSUQlfSU9XKFBQX0lPQ1RMLCAweDkyLCB1bnNpZ25lZCBjaGFyKQorCisvKiBDbGVhciAoYW5kIHJldHVybikgaW50ZXJydXB0IGNvdW50LiAqLworI2RlZmluZSBQUENMUklSUQlfSU9SKFBQX0lPQ1RMLCAweDkzLCBpbnQpCisKKy8qIFNldCB0aGUgSUVFRSAxMjg0IHBoYXNlIHRoYXQgd2UncmUgaW4gKGUuZy4gSUVFRTEyODRfUEhfRldEX0lETEUpICovCisjZGVmaW5lIFBQU0VUUEhBU0UJX0lPVyhQUF9JT0NUTCwgMHg5NCwgaW50KQorCisvKiBTZXQgYW5kIGdldCBwb3J0IHRpbWVvdXQgKHN0cnVjdCB0aW1ldmFsJ3MpICovCisjZGVmaW5lIFBQR0VUVElNRQlfSU9SKFBQX0lPQ1RMLCAweDk1LCBzdHJ1Y3QgdGltZXZhbCkKKyNkZWZpbmUgUFBTRVRUSU1FCV9JT1coUFBfSU9DVEwsIDB4OTYsIHN0cnVjdCB0aW1ldmFsKQorCisvKiBHZXQgYXZhaWxhYmxlIG1vZGVzICh3aGF0IHRoZSBoYXJkd2FyZSBjYW4gZG8pICovCisjZGVmaW5lIFBQR0VUTU9ERVMJX0lPUihQUF9JT0NUTCwgMHg5NywgdW5zaWduZWQgaW50KQorCisvKiBHZXQgdGhlIGN1cnJlbnQgbW9kZSBhbmQgcGhhemUgKi8KKyNkZWZpbmUgUFBHRVRNT0RFCV9JT1IoUFBfSU9DVEwsIDB4OTgsIGludCkKKyNkZWZpbmUgUFBHRVRQSEFTRQlfSU9SKFBQX0lPQ1RMLCAweDk5LCBpbnQpCisKKy8qIGdldC9zZXQgZmxhZ3MgKi8KKyNkZWZpbmUgUFBHRVRGTEFHUwlfSU9SKFBQX0lPQ1RMLCAweDlhLCBpbnQpCisjZGVmaW5lIFBQU0VURkxBR1MJX0lPVyhQUF9JT0NUTCwgMHg5YiwgaW50KQorCisvKiBmbGFncyB2aXNpYmxlIHRvIHRoZSB3b3JsZCAqLworI2RlZmluZSBQUF9GQVNUV1JJVEUJKDE8PDIpCisjZGVmaW5lIFBQX0ZBU1RSRUFECSgxPDwzKQorI2RlZmluZSBQUF9XOTEyODRQSUMJKDE8PDQpCisKKy8qIG9ubHkgbWFza3MgdXNlci12aXNpYmxlIGZsYWdzICovCisjZGVmaW5lIFBQX0ZMQUdNQVNLCShQUF9GQVNUV1JJVEUgfCBQUF9GQVNUUkVBRCB8IFBQX1c5MTI4NFBJQykKKworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcC1jb21wLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcC1jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiZDMzOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHBwLWNvbXAuaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIHBwcC1jb21wLmggLSBEZWZpbml0aW9ucyBmb3IgZG9pbmcgUFBQIHBhY2tldCBjb21wcmVzc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLiBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5CisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEJFIExJQUJMRSBUTyBBTlkKKyAqIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYKKyAqIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBOTworICogT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsCisgKiBPUiBNT0RJRklDQVRJT05TLgorICoKKyAqICRJZDogcHBwLWNvbXAuaCx2IDEuNiAxOTk3LzExLzI3IDA2OjA0OjQ0IHBhdWx1cyBFeHAgJAorICovCisKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiA5ODAzMTk9PQorICoKKyAqICBOT1RFIFRPIE1BSU5UQUlORVJTOgorICogICAgIElmIHlvdSBtb2RpZnkgdGhpcyBmaWxlIGF0IGFsbCwgcGxlYXNlIHNldCB0aGUgYWJvdmUgZGF0ZS4KKyAqICAgICBwcHAtY29tcC5oIGlzIHNoaXBwZWQgd2l0aCBhIFBQUCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB3aXRoIHRoZSBrZXJuZWw7CisgKiAgICAgaWYgZXZlcnlvbmUgaW5jcmVhc2VzIHRoZSBGSUxFVkVSU0lPTiBudW1iZXIgYWJvdmUsIHRoZW4gc2NyaXB0cworICogICAgIGNhbiBkbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIGluc3RhbGwgYSBuZXcgcHBwLWNvbXAuaAorICogICAgIGZpbGUuICBEb24ndCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGF0IGxpbmUgb3RoZXJ3aXNlLCBzbyB0aGUKKyAqICAgICBpbnN0YWxsYXRpb24gc2NyaXB0IGNhbiByZWNvZ25pemUgaXQuCisgKi8KKworI2lmbmRlZiBfTkVUX1BQUF9DT01QX0gKKyNkZWZpbmUgX05FVF9QUFBfQ09NUF9ICisKK3N0cnVjdCBtb2R1bGU7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgY29udHJvbCB3aGV0aGVyIHdlIGluY2x1ZGUgY29kZSBmb3IKKyAqIHZhcmlvdXMgY29tcHJlc3Npb24gbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIERPX0JTRF9DT01QUkVTUworI2RlZmluZSBET19CU0RfQ09NUFJFU1MJMQkvKiBieSBkZWZhdWx0LCBpbmNsdWRlIEJTRC1Db21wcmVzcyAqLworI2VuZGlmCisjaWZuZGVmIERPX0RFRkxBVEUKKyNkZWZpbmUgRE9fREVGTEFURQkxCS8qIGJ5IGRlZmF1bHQsIGluY2x1ZGUgRGVmbGF0ZSAqLworI2VuZGlmCisjZGVmaW5lIERPX1BSRURJQ1RPUl8xCTAKKyNkZWZpbmUgRE9fUFJFRElDVE9SXzIJMAorCisvKgorICogU3RydWN0dXJlIGdpdmluZyBtZXRob2RzIGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICovCisKK3N0cnVjdCBjb21wcmVzc29yIHsKKwlpbnQJY29tcHJlc3NfcHJvdG87CS8qIENDUCBjb21wcmVzc2lvbiBwcm90b2NvbCBudW1iZXIgKi8KKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbXByZXNzb3IgKHRyYW5zbWl0IHNpZGUpICovCisJdm9pZAkqKCpjb21wX2FsbG9jKSAodW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pOworCisJLyogRnJlZSBzcGFjZSB1c2VkIGJ5IGEgY29tcHJlc3NvciAqLworCXZvaWQJKCpjb21wX2ZyZWUpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBJbml0aWFsaXplIGEgY29tcHJlc3NvciAqLworCWludAkoKmNvbXBfaW5pdCkgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJICAgICAgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgZGVidWcpOworCisJLyogUmVzZXQgYSBjb21wcmVzc29yICovCisJdm9pZAkoKmNvbXBfcmVzZXQpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBDb21wcmVzcyBhIHBhY2tldCAqLworCWludCAgICAgKCpjb21wcmVzcykgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpycHRyLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IGlzaXplLCBpbnQgb3NpemUpOworCisJLyogUmV0dXJuIGNvbXByZXNzaW9uIHN0YXRpc3RpY3MgKi8KKwl2b2lkCSgqY29tcF9zdGF0KSAodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgZGVjb21wcmVzc29yIChyZWNlaXZlIHNpZGUpICovCisJdm9pZAkqKCpkZWNvbXBfYWxsb2MpICh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbik7CisKKwkvKiBGcmVlIHNwYWNlIHVzZWQgYnkgYSBkZWNvbXByZXNzb3IgKi8KKwl2b2lkCSgqZGVjb21wX2ZyZWUpICh2b2lkICpzdGF0ZSk7CisKKwkvKiBJbml0aWFsaXplIGEgZGVjb21wcmVzc29yICovCisJaW50CSgqZGVjb21wX2luaXQpICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCQlpbnQgb3B0X2xlbiwgaW50IHVuaXQsIGludCBvcHRoZHIsIGludCBtcnUsCisJCQkJaW50IGRlYnVnKTsKKworCS8qIFJlc2V0IGEgZGVjb21wcmVzc29yICovCisJdm9pZAkoKmRlY29tcF9yZXNldCkgKHZvaWQgKnN0YXRlKTsKKworCS8qIERlY29tcHJlc3MgYSBwYWNrZXQuICovCisJaW50CSgqZGVjb21wcmVzcykgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaXNpemUsCisJCQkJdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IG9zaXplKTsKKworCS8qIFVwZGF0ZSBzdGF0ZSBmb3IgYW4gaW5jb21wcmVzc2libGUgcGFja2V0IHJlY2VpdmVkICovCisJdm9pZAkoKmluY29tcCkgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaWNudCk7CisKKwkvKiBSZXR1cm4gZGVjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCisJdm9pZAkoKmRlY29tcF9zdGF0KSAodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpOworCisJLyogVXNlZCBpbiBsb2NraW5nIGNvbXByZXNzb3IgbW9kdWxlcyAqLworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCS8qIEV4dHJhIHNrYiBzcGFjZSBuZWVkZWQgYnkgdGhlIGNvbXByZXNzb3IgYWxnb3JpdGhtICovCisJdW5zaWduZWQgaW50IGNvbXBfZXh0cmE7Cit9OworCisvKgorICogVGhlIHJldHVybiB2YWx1ZSBmcm9tIGRlY29tcHJlc3Mgcm91dGluZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorICogZGVjb21wcmVzc2VkIHBhY2tldCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgREVDT01QX0VSUk9SCisgKiBvciBERUNPTVBfRkFUQUxFUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqIAorICogV2UgbmVlZCB0byBtYWtlIHRoaXMgZGlzdGluY3Rpb24gc28gdGhhdCB3ZSBjYW4gZGlzYWJsZSBjZXJ0YWluCisgKiB1c2VmdWwgZnVuY3Rpb25hbGl0eSwgbmFtZWx5IHNlbmRpbmcgYSBDQ1AgcmVzZXQtcmVxdWVzdCBhcyBhIHJlc3VsdAorICogb2YgYW4gZXJyb3IgZGV0ZWN0ZWQgYWZ0ZXIgZGVjb21wcmVzc2lvbi4gIFRoaXMgaXMgdG8gYXZvaWQgaW5mcmluZ2luZworICogYSBwYXRlbnQgaGVsZCBieSBNb3Rvcm9sYS4KKyAqIERvbid0IHlvdSBqdXN0IGx1cnZlIHNvZnR3YXJlIHBhdGVudHMuCisgKi8KKworI2RlZmluZSBERUNPTVBfRVJST1IJCS0xCS8qIGVycm9yIGRldGVjdGVkIGJlZm9yZSBkZWNvbXAuICovCisjZGVmaW5lIERFQ09NUF9GQVRBTEVSUk9SCS0yCS8qIGVycm9yIGRldGVjdGVkIGFmdGVyIGRlY29tcC4gKi8KKworLyoKKyAqIENDUCBjb2Rlcy4KKyAqLworCisjZGVmaW5lIENDUF9DT05GUkVRCTEKKyNkZWZpbmUgQ0NQX0NPTkZBQ0sJMgorI2RlZmluZSBDQ1BfVEVSTVJFUQk1CisjZGVmaW5lIENDUF9URVJNQUNLCTYKKyNkZWZpbmUgQ0NQX1JFU0VUUkVRCTE0CisjZGVmaW5lIENDUF9SRVNFVEFDSwkxNQorCisvKgorICogTWF4ICMgYnl0ZXMgZm9yIGEgQ0NQIG9wdGlvbgorICovCisKKyNkZWZpbmUgQ0NQX01BWF9PUFRJT05fTEVOR1RICTMyCisKKy8qCisgKiBQYXJ0cyBvZiBhIENDUCBwYWNrZXQuCisgKi8KKworI2RlZmluZSBDQ1BfQ09ERShkcCkJCSgoZHApWzBdKQorI2RlZmluZSBDQ1BfSUQoZHApCQkoKGRwKVsxXSkKKyNkZWZpbmUgQ0NQX0xFTkdUSChkcCkJCSgoKGRwKVsyXSA8PCA4KSArIChkcClbM10pCisjZGVmaW5lIENDUF9IRFJMRU4JCTQKKworI2RlZmluZSBDQ1BfT1BUX0NPREUoZHApCSgoZHApWzBdKQorI2RlZmluZSBDQ1BfT1BUX0xFTkdUSChkcCkJKChkcClbMV0pCisjZGVmaW5lIENDUF9PUFRfTUlOTEVOCQkyCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgQlNELUNvbXByZXNzLgorICovCisKKyNkZWZpbmUgQ0lfQlNEX0NPTVBSRVNTCQkyMQkvKiBjb25maWcuIG9wdGlvbiBmb3IgQlNELUNvbXByZXNzICovCisjZGVmaW5lIENJTEVOX0JTRF9DT01QUkVTUwkzCS8qIGxlbmd0aCBvZiBjb25maWcuIG9wdGlvbiAqLworCisvKiBNYWNyb3MgZm9yIGhhbmRsaW5nIHRoZSAzcmQgYnl0ZSBvZiB0aGUgQlNELUNvbXByZXNzIGNvbmZpZyBvcHRpb24uICovCisjZGVmaW5lIEJTRF9OQklUUyh4KQkJKCh4KSAmIDB4MUYpCS8qIG51bWJlciBvZiBiaXRzIHJlcXVlc3RlZCAqLworI2RlZmluZSBCU0RfVkVSU0lPTih4KQkJKCh4KSA+PiA1KQkvKiB2ZXJzaW9uIG9mIG9wdGlvbiBmb3JtYXQgKi8KKyNkZWZpbmUgQlNEX0NVUlJFTlRfVkVSU0lPTgkxCQkvKiBjdXJyZW50IHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIEJTRF9NQUtFX09QVCh2LCBuKQkoKCh2KSA8PCA1KSB8IChuKSkKKworI2RlZmluZSBCU0RfTUlOX0JJVFMJCTkJLyogc21hbGxlc3QgY29kZSBzaXplIHN1cHBvcnRlZCAqLworI2RlZmluZSBCU0RfTUFYX0JJVFMJCTE1CS8qIGxhcmdlc3QgY29kZSBzaXplIHN1cHBvcnRlZCAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIERlZmxhdGUuCisgKi8KKworI2RlZmluZSBDSV9ERUZMQVRFCQkyNgkvKiBjb25maWcgb3B0aW9uIGZvciBEZWZsYXRlICovCisjZGVmaW5lIENJX0RFRkxBVEVfRFJBRlQJMjQJLyogdmFsdWUgdXNlZCBpbiBvcmlnaW5hbCBkcmFmdCBSRkMgKi8KKyNkZWZpbmUgQ0lMRU5fREVGTEFURQkJNAkvKiBsZW5ndGggb2YgaXRzIGNvbmZpZyBvcHRpb24gKi8KKworI2RlZmluZSBERUZMQVRFX01JTl9TSVpFCTkKKyNkZWZpbmUgREVGTEFURV9NQVhfU0laRQkxNQorI2RlZmluZSBERUZMQVRFX01FVEhPRF9WQUwJOAorI2RlZmluZSBERUZMQVRFX1NJWkUoeCkJCSgoKHgpID4+IDQpICsgOCkKKyNkZWZpbmUgREVGTEFURV9NRVRIT0QoeCkJKCh4KSAmIDB4MEYpCisjZGVmaW5lIERFRkxBVEVfTUFLRV9PUFQodykJKCgoKHcpIC0gOCkgPDwgNCkgKyBERUZMQVRFX01FVEhPRF9WQUwpCisjZGVmaW5lIERFRkxBVEVfQ0hLX1NFUVVFTkNFCTAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBNUFBFLgorICovCisKKyNkZWZpbmUgQ0lfTVBQRSAgICAgICAgICAgICAgICAxOCAgICAgIC8qIGNvbmZpZyBvcHRpb24gZm9yIE1QUEUgKi8KKyNkZWZpbmUgQ0lMRU5fTVBQRSAgICAgICAgICAgICAgNiAgICAgIC8qIGxlbmd0aCBvZiBjb25maWcgb3B0aW9uICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3Igb3RoZXIsIGFzIHlldCB1bnN1cHBvcnRlZCwgY29tcHJlc3Npb24gbWV0aG9kcy4KKyAqLworCisjZGVmaW5lIENJX1BSRURJQ1RPUl8xCQkxCS8qIGNvbmZpZyBvcHRpb24gZm9yIFByZWRpY3Rvci0xICovCisjZGVmaW5lIENJTEVOX1BSRURJQ1RPUl8xCTIJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCisjZGVmaW5lIENJX1BSRURJQ1RPUl8yCQkyCS8qIGNvbmZpZyBvcHRpb24gZm9yIFByZWRpY3Rvci0yICovCisjZGVmaW5lIENJTEVOX1BSRURJQ1RPUl8yCTIJLyogbGVuZ3RoIG9mIGl0cyBjb25maWcgb3B0aW9uICovCisKKworI2VuZGlmIC8qIF9ORVRfUFBQX0NPTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHBfZGVmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wcHBfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODMyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BwcF9kZWZzLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCSRJZDogcHBwX2RlZnMuaCx2IDEuMiAxOTk0LzA5LzIxIDAxOjMxOjA2IHBhdWx1cyBFeHAgJAkqLworCisvKgorICogcHBwX2RlZnMuaCAtIFBQUCBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLiBUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5CisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yCisgKiBhbnkgcHVycG9zZS4KKyAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEJFIExJQUJMRSBUTyBBTlkKKyAqIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYKKyAqIFRIRSBBVVNUUkFMSUFOIE5BVElPTkFMIFVOSVZFUlNJVFkgSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBOTworICogT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsCisgKiBPUiBNT0RJRklDQVRJT05TLgorICovCisKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiAyMDAwMDExND09CisgKgorICogIE5PVEUgVE8gTUFJTlRBSU5FUlM6CisgKiAgICAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUgYXQgYWxsLCBwbGVhc2Ugc2V0IHRoZSBhYm92ZSBkYXRlLgorICogICAgIHBwcF9kZWZzLmggaXMgc2hpcHBlZCB3aXRoIGEgUFBQIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHdpdGggdGhlIGtlcm5lbDsKKyAqICAgICBpZiBldmVyeW9uZSBpbmNyZWFzZXMgdGhlIEZJTEVWRVJTSU9OIG51bWJlciBhYm92ZSwgdGhlbiBzY3JpcHRzCisgKiAgICAgY2FuIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBhIG5ldyBwcHBfZGVmcy5oCisgKiAgICAgZmlsZS4gIERvbid0IGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoYXQgbGluZSBvdGhlcndpc2UsIHNvIHRoZQorICogICAgIGluc3RhbGxhdGlvbiBzY3JpcHQgY2FuIHJlY29nbml6ZSBpdC4KKyAqLworCisjaWZuZGVmIF9QUFBfREVGU19IXworI2RlZmluZSBfUFBQX0RFRlNfSF8KKworLyoKKyAqIFRoZSBiYXNpYyBQUFAgZnJhbWUuCisgKi8KKyNkZWZpbmUgUFBQX0hEUkxFTgk0CS8qIG9jdGV0cyBmb3Igc3RhbmRhcmQgcHBwIGhlYWRlciAqLworI2RlZmluZSBQUFBfRkNTTEVOCTIJLyogb2N0ZXRzIGZvciBGQ1MgKi8KKyNkZWZpbmUgUFBQX01SVQkJMTUwMAkvKiBkZWZhdWx0IE1SVSA9IG1heCBsZW5ndGggb2YgaW5mbyBmaWVsZCAqLworCisjZGVmaW5lIFBQUF9BRERSRVNTKHApCSgoKF9fdTggKikocCkpWzBdKQorI2RlZmluZSBQUFBfQ09OVFJPTChwKQkoKChfX3U4ICopKHApKVsxXSkKKyNkZWZpbmUgUFBQX1BST1RPQ09MKHApCSgoKChfX3U4ICopKHApKVsyXSA8PCA4KSArICgoX191OCAqKShwKSlbM10pCisKKy8qCisgKiBTaWduaWZpY2FudCBvY3RldCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJUFBQX0FMTFNUQVRJT05TCTB4ZmYJLyogQWxsLVN0YXRpb25zIGJyb2FkY2FzdCBhZGRyZXNzICovCisjZGVmaW5lCVBQUF9VSQkJMHgwMwkvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICovCisjZGVmaW5lCVBQUF9GTEFHCTB4N2UJLyogRmxhZyBTZXF1ZW5jZSAqLworI2RlZmluZQlQUFBfRVNDQVBFCTB4N2QJLyogQXN5bmNocm9ub3VzIENvbnRyb2wgRXNjYXBlICovCisjZGVmaW5lCVBQUF9UUkFOUwkweDIwCS8qIEFzeW5jaHJvbm91cyB0cmFuc3BhcmVuY3kgbW9kaWZpZXIgKi8KKworLyoKKyAqIFByb3RvY29sIGZpZWxkIHZhbHVlcy4KKyAqLworI2RlZmluZSBQUFBfSVAJCTB4MjEJLyogSW50ZXJuZXQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0FUCQkweDI5CS8qIEFwcGxlVGFsayBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBYCQkweDJiCS8qIElQWCBwcm90b2NvbCAqLworI2RlZmluZQlQUFBfVkpDX0NPTVAJMHgyZAkvKiBWSiBjb21wcmVzc2VkIFRDUCAqLworI2RlZmluZQlQUFBfVkpDX1VOQ09NUAkweDJmCS8qIFZKIHVuY29tcHJlc3NlZCBUQ1AgKi8KKyNkZWZpbmUgUFBQX01QCQkweDNkCS8qIE11bHRpbGluayBwcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBWNgkweDU3CS8qIEludGVybmV0IFByb3RvY29sIFZlcnNpb24gNiAqLworI2RlZmluZSBQUFBfQ09NUEZSQUcJMHhmYgkvKiBmcmFnbWVudCBjb21wcmVzc2VkIGJlbG93IGJ1bmRsZSAqLworI2RlZmluZSBQUFBfQ09NUAkweGZkCS8qIGNvbXByZXNzZWQgcGFja2V0ICovCisjZGVmaW5lIFBQUF9NUExTX1VDCTB4MDI4MQkvKiBNdWx0aSBQcm90b2NvbCBMYWJlbCBTd2l0Y2hpbmcgLSBVbmljYXN0ICovCisjZGVmaW5lIFBQUF9NUExTX01DCTB4MDI4MwkvKiBNdWx0aSBQcm90b2NvbCBMYWJlbCBTd2l0Y2hpbmcgLSBNdWx0aWNhc3QgKi8KKyNkZWZpbmUgUFBQX0lQQ1AJMHg4MDIxCS8qIElQIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0FUQ1AJMHg4MDI5CS8qIEFwcGxlVGFsayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUFhDUAkweDgwMmIJLyogSVBYIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQVjZDUAkweDgwNTcJLyogSVB2NiBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9DQ1BGUkFHCTB4ODBmYgkvKiBDQ1AgYXQgbGluayBsZXZlbCAoYmVsb3cgTVAgYnVuZGxlKSAqLworI2RlZmluZSBQUFBfQ0NQCQkweDgwZmQJLyogQ29tcHJlc3Npb24gQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfTVBMU0NQCTB4ODBmZAkvKiBNUExTIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0xDUAkJMHhjMDIxCS8qIExpbmsgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfUEFQCQkweGMwMjMJLyogUGFzc3dvcmQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0xRUgkJMHhjMDI1CS8qIExpbmsgUXVhbGl0eSBSZXBvcnQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0NIQVAJMHhjMjIzCS8qIENyeXB0b2dyYXBoaWMgSGFuZHNoYWtlIEF1dGguIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9DQkNQCTB4YzAyOQkvKiBDYWxsYmFjayBDb250cm9sIFByb3RvY29sICovCisKKy8qCisgKiBWYWx1ZXMgZm9yIEZDUyBjYWxjdWxhdGlvbnMuCisgKi8KKworI2RlZmluZSBQUFBfSU5JVEZDUwkweGZmZmYJLyogSW5pdGlhbCBGQ1MgdmFsdWUgKi8KKyNkZWZpbmUgUFBQX0dPT0RGQ1MJMHhmMGI4CS8qIEdvb2QgZmluYWwgRkNTIHZhbHVlICovCisKKworLyoKKyAqIEV4dGVuZGVkIGFzeW5jbWFwIC0gYWxsb3dzIGFueSBjaGFyYWN0ZXIgdG8gYmUgZXNjYXBlZC4KKyAqLworCit0eXBlZGVmIF9fdTMyCQlleHRfYWNjbVs4XTsKKworLyoKKyAqIFdoYXQgdG8gZG8gd2l0aCBuZXR3b3JrIHByb3RvY29sIChOUCkgcGFja2V0cy4KKyAqLworZW51bSBOUG1vZGUgeworICAgIE5QTU9ERV9QQVNTLAkJLyogcGFzcyB0aGUgcGFja2V0IHRocm91Z2ggKi8KKyAgICBOUE1PREVfRFJPUCwJCS8qIHNpbGVudGx5IGRyb3AgdGhlIHBhY2tldCAqLworICAgIE5QTU9ERV9FUlJPUiwJCS8qIHJldHVybiBhbiBlcnJvciAqLworICAgIE5QTU9ERV9RVUVVRQkJLyogc2F2ZSBpdCB1cCBmb3IgbGF0ZXIuICovCit9OworCisvKgorICogU3RhdGlzdGljcyBmb3IgTFFSUCBhbmQgcHBwc3RhdHMKKyAqLworc3RydWN0IHBwcHN0YXQJeworICAgIF9fdTMyCXBwcF9kaXNjYXJkczsJLyogIyBmcmFtZXMgZGlzY2FyZGVkICovCisKKyAgICBfX3UzMglwcHBfaWJ5dGVzOwkvKiBieXRlcyByZWNlaXZlZCAqLworICAgIF9fdTMyCXBwcF9pb2N0ZWN0czsJLyogYnl0ZXMgcmVjZWl2ZWQgbm90IGluIGVycm9yICovCisgICAgX191MzIJcHBwX2lwYWNrZXRzOwkvKiBwYWNrZXRzIHJlY2VpdmVkICovCisgICAgX191MzIJcHBwX2llcnJvcnM7CS8qIHJlY2VpdmUgZXJyb3JzICovCisgICAgX191MzIJcHBwX2lscXJzOwkvKiAjIExRUiBmcmFtZXMgcmVjZWl2ZWQgKi8KKworICAgIF9fdTMyCXBwcF9vYnl0ZXM7CS8qIHJhdyBieXRlcyBzZW50ICovCisgICAgX191MzIJcHBwX29vY3RlY3RzOwkvKiBmcmFtZSBieXRlcyBzZW50ICovCisgICAgX191MzIJcHBwX29wYWNrZXRzOwkvKiBwYWNrZXRzIHNlbnQgKi8KKyAgICBfX3UzMglwcHBfb2Vycm9yczsJLyogdHJhbnNtaXQgZXJyb3JzICovIAorICAgIF9fdTMyCXBwcF9vbHFyczsJLyogIyBMUVIgZnJhbWVzIHNlbnQgKi8KK307CisKK3N0cnVjdCB2anN0YXQgeworICAgIF9fdTMyCXZqc19wYWNrZXRzOwkvKiBvdXRib3VuZCBwYWNrZXRzICovCisgICAgX191MzIJdmpzX2NvbXByZXNzZWQ7CS8qIG91dGJvdW5kIGNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc19zZWFyY2hlczsJLyogc2VhcmNoZXMgZm9yIGNvbm5lY3Rpb24gc3RhdGUgKi8KKyAgICBfX3UzMgl2anNfbWlzc2VzOwkvKiB0aW1lcyBjb3VsZG4ndCBmaW5kIGNvbm4uIHN0YXRlICovCisgICAgX191MzIJdmpzX3VuY29tcHJlc3NlZGluOyAvKiBpbmJvdW5kIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgX191MzIJdmpzX2NvbXByZXNzZWRpbjsgICAvKiBpbmJvdW5kIGNvbXByZXNzZWQgcGFja2V0cyAqLworICAgIF9fdTMyCXZqc19lcnJvcmluOwkvKiBpbmJvdW5kIHVua25vd24gdHlwZSBwYWNrZXRzICovCisgICAgX191MzIJdmpzX3Rvc3NlZDsJLyogaW5ib3VuZCBwYWNrZXRzIHRvc3NlZCBiZWNhdXNlIG9mIGVycm9yICovCit9OworCitzdHJ1Y3QgY29tcHN0YXQgeworICAgIF9fdTMyCXVuY19ieXRlczsJLyogdG90YWwgdW5jb21wcmVzc2VkIGJ5dGVzICovCisgICAgX191MzIJdW5jX3BhY2tldHM7CS8qIHRvdGFsIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgX191MzIJY29tcF9ieXRlczsJLyogY29tcHJlc3NlZCBieXRlcyAqLworICAgIF9fdTMyCWNvbXBfcGFja2V0czsJLyogY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgX191MzIJaW5jX2J5dGVzOwkvKiBpbmNvbXByZXNzaWJsZSBieXRlcyAqLworICAgIF9fdTMyCWluY19wYWNrZXRzOwkvKiBpbmNvbXByZXNzaWJsZSBwYWNrZXRzICovCisKKyAgICAvKiB0aGUgY29tcHJlc3Npb24gcmF0aW8gaXMgZGVmaW5lZCBhcyBpbl9jb3VudCAvIGJ5dGVzX291dCAqLworICAgIF9fdTMyICAgICAgIGluX2NvdW50OwkvKiBCeXRlcyByZWNlaXZlZCAqLworICAgIF9fdTMyICAgICAgIGJ5dGVzX291dDsJLyogQnl0ZXMgdHJhbnNtaXR0ZWQgKi8KKworICAgIGRvdWJsZQlyYXRpbzsJCS8qIG5vdCBjb21wdXRlZCBpbiBrZXJuZWwuICovCit9OworCitzdHJ1Y3QgcHBwX3N0YXRzIHsKKyAgICBzdHJ1Y3QgcHBwc3RhdAlwOwkvKiBiYXNpYyBQUFAgc3RhdGlzdGljcyAqLworICAgIHN0cnVjdCB2anN0YXQJdmo7CS8qIFZKIGhlYWRlciBjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCit9OworCitzdHJ1Y3QgcHBwX2NvbXBfc3RhdHMgeworICAgIHN0cnVjdCBjb21wc3RhdAljOwkvKiBwYWNrZXQgY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLworICAgIHN0cnVjdCBjb21wc3RhdAlkOwkvKiBwYWNrZXQgZGVjb21wcmVzc2lvbiBzdGF0aXN0aWNzICovCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgcmVjb3JkcyB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlCisgKiB0aGUgbGFzdCBOUCBwYWNrZXQgd2FzIHNlbnQgb3IgcmVjZWl2ZWQuCisgKi8KK3N0cnVjdCBwcHBfaWRsZSB7CisgICAgdGltZV90IHhtaXRfaWRsZTsJCS8qIHRpbWUgc2luY2UgbGFzdCBOUCBwYWNrZXQgc2VudCAqLworICAgIHRpbWVfdCByZWN2X2lkbGU7CQkvKiB0aW1lIHNpbmNlIGxhc3QgTlAgcGFja2V0IHJlY2VpdmVkICovCit9OworCisjZW5kaWYgLyogX1BQUF9ERUZTX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ByY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlZmY5MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHJjdGwuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9MSU5VWF9QUkNUTF9ICisjZGVmaW5lIF9MSU5VWF9QUkNUTF9ICisKKy8qIFZhbHVlcyB0byBwYXNzIGFzIGZpcnN0IGFyZ3VtZW50IHRvIHByY3RsKCkgKi8KKworI2RlZmluZSBQUl9TRVRfUERFQVRIU0lHICAxICAvKiBTZWNvbmQgYXJnIGlzIGEgc2lnbmFsICovCisjZGVmaW5lIFBSX0dFVF9QREVBVEhTSUcgIDIgIC8qIFNlY29uZCBhcmcgaXMgYSBwdHIgdG8gcmV0dXJuIHRoZSBzaWduYWwgKi8KKworLyogR2V0L3NldCBjdXJyZW50LT5tbS0+ZHVtcGFibGUgKi8KKyNkZWZpbmUgUFJfR0VUX0RVTVBBQkxFICAgMworI2RlZmluZSBQUl9TRVRfRFVNUEFCTEUgICA0CisKKy8qIEdldC9zZXQgdW5hbGlnbmVkIGFjY2VzcyBjb250cm9sIGJpdHMgKGlmIG1lYW5pbmdmdWwpICovCisjZGVmaW5lIFBSX0dFVF9VTkFMSUdOCSAgNQorI2RlZmluZSBQUl9TRVRfVU5BTElHTgkgIDYKKyMgZGVmaW5lIFBSX1VOQUxJR05fTk9QUklOVAkxCS8qIHNpbGVudGx5IGZpeCB1cCB1bmFsaWduZWQgdXNlciBhY2Nlc3NlcyAqLworIyBkZWZpbmUgUFJfVU5BTElHTl9TSUdCVVMJMgkvKiBnZW5lcmF0ZSBTSUdCVVMgb24gdW5hbGlnbmVkIHVzZXIgYWNjZXNzICovCisKKy8qIEdldC9zZXQgd2hldGhlciBvciBub3QgdG8gZHJvcCBjYXBhYmlsaXRpZXMgb24gc2V0dWlkKCkgYXdheSBmcm9tIHVpZCAwICovCisjZGVmaW5lIFBSX0dFVF9LRUVQQ0FQUyAgIDcKKyNkZWZpbmUgUFJfU0VUX0tFRVBDQVBTICAgOAorCisvKiBHZXQvc2V0IGZsb2F0aW5nLXBvaW50IGVtdWxhdGlvbiBjb250cm9sIGJpdHMgKGlmIG1lYW5pbmdmdWwpICovCisjZGVmaW5lIFBSX0dFVF9GUEVNVSAgOQorI2RlZmluZSBQUl9TRVRfRlBFTVUgMTAKKyMgZGVmaW5lIFBSX0ZQRU1VX05PUFJJTlQJMQkvKiBzaWxlbnRseSBlbXVsYXRlIGZwIG9wZXJhdGlvbnMgYWNjZXNzZXMgKi8KKyMgZGVmaW5lIFBSX0ZQRU1VX1NJR0ZQRQkyCS8qIGRvbid0IGVtdWxhdGUgZnAgb3BlcmF0aW9ucywgc2VuZCBTSUdGUEUgaW5zdGVhZCAqLworCisvKiBHZXQvc2V0IGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBtb2RlIChpZiBtZWFuaW5nZnVsKSAqLworI2RlZmluZSBQUl9HRVRfRlBFWEMJMTEKKyNkZWZpbmUgUFJfU0VUX0ZQRVhDCTEyCisjIGRlZmluZSBQUl9GUF9FWENfU1dfRU5BQkxFCTB4ODAJLyogVXNlIEZQRVhDIGZvciBGUCBleGNlcHRpb24gZW5hYmxlcyAqLworIyBkZWZpbmUgUFJfRlBfRVhDX0RJVgkJMHgwMTAwMDAJLyogZmxvYXRpbmcgcG9pbnQgZGl2aWRlIGJ5IHplcm8gKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19PVkYJCTB4MDIwMDAwCS8qIGZsb2F0aW5nIHBvaW50IG92ZXJmbG93ICovCisjIGRlZmluZSBQUl9GUF9FWENfVU5ECQkweDA0MDAwMAkvKiBmbG9hdGluZyBwb2ludCB1bmRlcmZsb3cgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19SRVMJCTB4MDgwMDAwCS8qIGZsb2F0aW5nIHBvaW50IGluZXhhY3QgcmVzdWx0ICovCisjIGRlZmluZSBQUl9GUF9FWENfSU5WCQkweDEwMDAwMAkvKiBmbG9hdGluZyBwb2ludCBpbnZhbGlkIG9wZXJhdGlvbiAqLworIyBkZWZpbmUgUFJfRlBfRVhDX0RJU0FCTEVECTAJLyogRlAgZXhjZXB0aW9ucyBkaXNhYmxlZCAqLworIyBkZWZpbmUgUFJfRlBfRVhDX05PTlJFQ09WCTEJLyogYXN5bmMgbm9uLXJlY292ZXJhYmxlIGV4Yy4gbW9kZSAqLworIyBkZWZpbmUgUFJfRlBfRVhDX0FTWU5DCTIJLyogYXN5bmMgcmVjb3ZlcmFibGUgZXhjZXB0aW9uIG1vZGUgKi8KKyMgZGVmaW5lIFBSX0ZQX0VYQ19QUkVDSVNFCTMJLyogcHJlY2lzZSBleGNlcHRpb24gbW9kZSAqLworCisvKiBHZXQvc2V0IHdoZXRoZXIgd2UgdXNlIHN0YXRpc3RpY2FsIHByb2Nlc3MgdGltaW5nIG9yIGFjY3VyYXRlIHRpbWVzdGFtcAorICogYmFzZWQgcHJvY2VzcyB0aW1pbmcgKi8KKyNkZWZpbmUgUFJfR0VUX1RJTUlORyAgIDEzCisjZGVmaW5lIFBSX1NFVF9USU1JTkcgICAxNAorIyBkZWZpbmUgUFJfVElNSU5HX1NUQVRJU1RJQ0FMICAwICAgICAgIC8qIE5vcm1hbCwgdHJhZGl0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNhbCBwcm9jZXNzIHRpbWluZyAqLworIyBkZWZpbmUgUFJfVElNSU5HX1RJTUVTVEFNUCAgICAxICAgICAgIC8qIEFjY3VyYXRlIHRpbWVzdGFtcCBiYXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyB0aW1pbmcgKi8KKworI2RlZmluZSBQUl9TRVRfTkFNRSAgICAxNQkJLyogU2V0IHByb2Nlc3MgbmFtZSAqLworI2RlZmluZSBQUl9HRVRfTkFNRSAgICAxNgkJLyogR2V0IHByb2Nlc3MgbmFtZSAqLworCisvKiBHZXQvc2V0IHByb2Nlc3MgZW5kaWFuICovCisjZGVmaW5lIFBSX0dFVF9FTkRJQU4JMTkKKyNkZWZpbmUgUFJfU0VUX0VORElBTgkyMAorIyBkZWZpbmUgUFJfRU5ESUFOX0JJRwkJMAorIyBkZWZpbmUgUFJfRU5ESUFOX0xJVFRMRQkxCS8qIFRydWUgbGl0dGxlIGVuZGlhbiBtb2RlICovCisjIGRlZmluZSBQUl9FTkRJQU5fUFBDX0xJVFRMRQkyCS8qICJQb3dlclBDIiBwc2V1ZG8gbGl0dGxlIGVuZGlhbiAqLworCisvKiBHZXQvc2V0IHByb2Nlc3Mgc2VjY29tcCBtb2RlICovCisjZGVmaW5lIFBSX0dFVF9TRUNDT01QCTIxCisjZGVmaW5lIFBSX1NFVF9TRUNDT01QCTIyCisKKyNlbmRpZiAvKiBfTElOVVhfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wczJlc2RpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3BzMmVzZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGUwNTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9wczJlc2RpLmgKQEAgLTAsMCArMSw5OCBAQAorI2lmbmRlZiBfUFMyRVNESV9IXworI2RlZmluZSBfUFMyRVNESV9IXworCisjZGVmaW5lIE5STUxfRVNESV9JRCAweGRkZmYKKyNkZWZpbmUgSU5UR19FU0RJX0lEIDB4ZGY5ZgorCisjZGVmaW5lIFBSSU1BUllfSU9fQkFTRSAweDM1MTAKKyNkZWZpbmUgQUxUX0lPX0JBU0UgMHgzNTE4CisKKyNkZWZpbmUgRVNESV9DTURfSU5UIChpb19iYXNlKzApCisjZGVmaW5lIEVTRElfU1RUX0lOVCAoaW9fYmFzZSswKQorI2RlZmluZSBFU0RJX0NPTlRST0wgKGlvX2Jhc2UrMikKKyNkZWZpbmUgRVNESV9TVEFUVVMgIChpb19iYXNlKzIpCisjZGVmaW5lIEVTRElfQVRUTiAgICAoaW9fYmFzZSszKQorI2RlZmluZSBFU0RJX0lOVFJQVCAgKGlvX2Jhc2UrMykKKworI2RlZmluZSBTVEFUVVNfRU5BQkxFRCAgICAweDAxCisjZGVmaW5lIFNUQVRVU19BTFRFUk5BVEUgIDB4MDIKKyNkZWZpbmUgU1RBVFVTX0JVU1kgICAgICAgMHgxMAorI2RlZmluZSBTVEFUVVNfU1RBVF9BVkFJTCAweDA4CisjZGVmaW5lIFNUQVRVU19JTlRSICAgICAgIDB4MDEKKyNkZWZpbmUgU1RBVFVTX1JFU0VUX0ZBSUwgMHhlYQorI2RlZmluZSBTVEFUVVNfQ01EX0lORgkgIDB4MDQKKworI2RlZmluZSBDVFJMX1NPRlRfUkVTRVQgICAweGU0CisjZGVmaW5lIENUUkxfSEFSRF9SRVNFVCAgIDB4ODAKKyNkZWZpbmUgQ1RSTF9FT0kgICAgICAgICAgMHhlMgorI2RlZmluZSBDVFJMX0VOQUJMRV9ETUEgICAweDAyCisjZGVmaW5lIENUUkxfRU5BQkxFX0lOVFIgIDB4MDEKKyNkZWZpbmUgQ1RSTF9ESVNBQkxFX0lOVFIgIDB4MDAKKworI2RlZmluZSBBVFRfRU9JIDB4MDIKKworLyogYml0cyBvZiB3b3JkIDAgb2YgY29uZmlndXJhdGlvbiBzdGF0dXMgYmxvY2suIG1vcmUgaW5mbyBzZWUgcC4zOCBvZiB0ZWNoIHJlZiAqLworI2RlZmluZSBDT05GSUdfSVMgMHgxMCAvKiBJbnZhbGlkIFNlY29uZGFyeSAqLworI2RlZmluZSBDT05GSUdfWkQgMHgwOCAvKiBaZXJvIERlZmVjdCAqLworI2RlZmluZSBDT05GSUdfU0YgMHgwNCAvKiBTa2V3ZWQgRm9ybWF0ICovCisjZGVmaW5lIENPTkZJR19GUiAweDAyIC8qIFJlbW92YWJsZSAqLworI2RlZmluZSBDT05GSUdfUlQgMHgwMSAvKiBSZXRyaWVzICovCisKKyNkZWZpbmUgUE9SVF9TWVNfQSAgIDB4OTIKKyNkZWZpbmUgUE9SVF9ETUFfRk4gIDB4MTgKKyNkZWZpbmUgUE9SVF9ETUFfRVggIDB4MWEKKworI2RlZmluZSBPTiAodW5zaWduZWQgY2hhcikweDQwCisjZGVmaW5lIE9GRiAodW5zaWduZWQgY2hhcil+T04KKyNkZWZpbmUgTElURV9PTiBvdXRiKGluYihQT1JUX1NZU19BKSB8IE9OLFBPUlRfU1lTX0EpCisjZGVmaW5lIExJVEVfT0ZGIG91dGIoKGluYihQT1JUX1NZU19BKSAmIE9GRiksUE9SVF9TWVNfQSkKKworI2RlZmluZSBGQUlMIDAKKyNkZWZpbmUgU1VDQ0VTIDEKKworI2RlZmluZSBJTlRfQ01EX0NPTVBMRVRFIDB4MDEKKyNkZWZpbmUgSU5UX0NNRF9FQ0MgICAgICAweDAzCisjZGVmaW5lIElOVF9DTURfUkVUUlkgICAgMHgwNQorI2RlZmluZSBJTlRfQ01EX0ZPUk1BVCAgIDB4MDYKKyNkZWZpbmUgSU5UX0NNRF9FQ0NfUkVUUlkgMHgwNworI2RlZmluZSBJTlRfQ01EX1dBUk5JTkcgIDB4MDgKKyNkZWZpbmUgSU5UX0NNRF9BQk9SVCAgICAweDA5CisjZGVmaW5lIElOVF9SRVNFVCAgICAgICAgMHgwQQorI2RlZmluZSBJTlRfVFJBTlNGRVJfUkVRIDB4MEIKKyNkZWZpbmUgSU5UX0NNRF9GQUlMRUQgICAweDBDCisjZGVmaW5lIElOVF9ETUFfRVJSICAgICAgMHgwRAorI2RlZmluZSBJTlRfQ01EX0JMS19FUlIgIDB4MEUKKyNkZWZpbmUgSU5UX0FUVE5fRVJST1IgICAweDBGCisKKyNkZWZpbmUgRE1BX01BU0tfQ0hBTiAweDkwCisjZGVmaW5lIERNQV9VTk1BU0tfQ0hBTiAweEEwCisjZGVmaW5lIERNQV9XUklURV9BRERSIDB4MjAKKyNkZWZpbmUgRE1BX1dSSVRFX1RDIDB4NDAKKyNkZWZpbmUgRE1BX1dSSVRFX01PREUgMHg3MAorCisjZGVmaW5lIENNRF9HRVRfREVWX0NPTkZJRyAweDA5CisjZGVmaW5lIENNRF9SRUFEIDB4NDYwMQorI2RlZmluZSBDTURfV1JJVEUgMHg0NjAyCisjZGVmaW5lIERNQV9SRUFEXzE2IDB4NEMKKyNkZWZpbmUgRE1BX1dSSVRFXzE2IDB4NDQKKworCisjZGVmaW5lIE1CIDEwMjQqMTAyNAorI2RlZmluZSBTRUNUX1NJWkUgNTEyICAgCisKKyNkZWZpbmUgRVJST1IgMQorI2RlZmluZSBPSyAwCisKKyNkZWZpbmUgSERJT19HRVRHRU8gMHgwMzAxCisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFICFGQUxTRQorCitzdHJ1Y3QgcHMyZXNkaV9nZW9tZXRyeSB7CisJdW5zaWduZWQgY2hhciBoZWFkczsKKwl1bnNpZ25lZCBjaGFyIHNlY3RvcnM7CisJdW5zaWduZWQgc2hvcnQgY3lsaW5kZXJzOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Cit9OworCisjZW5kaWYgLyogX1BTMkVTRElfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcHRyYWNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNjZiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKyNpZm5kZWYgX0xJTlVYX1BUUkFDRV9ICisjZGVmaW5lIF9MSU5VWF9QVFJBQ0VfSAorLyogcHRyYWNlLmggKi8KKy8qIHN0cnVjdHMgYW5kIGRlZmluZXMgdG8gaGVscCB0aGUgdXNlciB1c2UgdGhlIHB0cmFjZSBzeXN0ZW0gY2FsbC4gKi8KKworLyogaGFzIHRoZSBkZWZpbmVzIHRvIGdldCBhdCB0aGUgcmVnaXN0ZXJzLiAqLworCisjZGVmaW5lIFBUUkFDRV9UUkFDRU1FCQkgICAwCisjZGVmaW5lIFBUUkFDRV9QRUVLVEVYVAkJICAgMQorI2RlZmluZSBQVFJBQ0VfUEVFS0RBVEEJCSAgIDIKKyNkZWZpbmUgUFRSQUNFX1BFRUtVU1IJCSAgIDMKKyNkZWZpbmUgUFRSQUNFX1BPS0VURVhUCQkgICA0CisjZGVmaW5lIFBUUkFDRV9QT0tFREFUQQkJICAgNQorI2RlZmluZSBQVFJBQ0VfUE9LRVVTUgkJICAgNgorI2RlZmluZSBQVFJBQ0VfQ09OVAkJICAgNworI2RlZmluZSBQVFJBQ0VfS0lMTAkJICAgOAorI2RlZmluZSBQVFJBQ0VfU0lOR0xFU1RFUAkgICA5CisKKyNkZWZpbmUgUFRSQUNFX0FUVEFDSAkJICAxNgorI2RlZmluZSBQVFJBQ0VfREVUQUNICQkgIDE3CisKKyNkZWZpbmUgUFRSQUNFX1NZU0NBTEwJCSAgMjQKKworLyogMHg0MjAwLTB4NDMwMCBhcmUgcmVzZXJ2ZWQgZm9yIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBhZGRpdGlvbnMuICAqLworI2RlZmluZSBQVFJBQ0VfU0VUT1BUSU9OUwkweDQyMDAKKyNkZWZpbmUgUFRSQUNFX0dFVEVWRU5UTVNHCTB4NDIwMQorI2RlZmluZSBQVFJBQ0VfR0VUU0lHSU5GTwkweDQyMDIKKyNkZWZpbmUgUFRSQUNFX1NFVFNJR0lORk8JMHg0MjAzCisKKy8qIG9wdGlvbnMgc2V0IHVzaW5nIFBUUkFDRV9TRVRPUFRJT05TICovCisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFU1lTR09PRAkweDAwMDAwMDAxCisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFRk9SSwkweDAwMDAwMDAyCisjZGVmaW5lIFBUUkFDRV9PX1RSQUNFVkZPUksJMHgwMDAwMDAwNAorI2RlZmluZSBQVFJBQ0VfT19UUkFDRUNMT05FCTB4MDAwMDAwMDgKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VFWEVDCTB4MDAwMDAwMTAKKyNkZWZpbmUgUFRSQUNFX09fVFJBQ0VWRk9SS0RPTkUJMHgwMDAwMDAyMAorI2RlZmluZSBQVFJBQ0VfT19UUkFDRUVYSVQJMHgwMDAwMDA0MAorCisjZGVmaW5lIFBUUkFDRV9PX01BU0sJCTB4MDAwMDAwN2YKKworLyogV2FpdCBleHRlbmRlZCByZXN1bHQgY29kZXMgZm9yIHRoZSBhYm92ZSB0cmFjZSBvcHRpb25zLiAgKi8KKyNkZWZpbmUgUFRSQUNFX0VWRU5UX0ZPUksJMQorI2RlZmluZSBQVFJBQ0VfRVZFTlRfVkZPUksJMgorI2RlZmluZSBQVFJBQ0VfRVZFTlRfQ0xPTkUJMworI2RlZmluZSBQVFJBQ0VfRVZFTlRfRVhFQwk0CisjZGVmaW5lIFBUUkFDRV9FVkVOVF9WRk9SS19ET05FCTUKKyNkZWZpbmUgUFRSQUNFX0VWRU5UX0VYSVQJNgorCisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbng0X2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2NmYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDogcW54NF9mcy5oCisgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgorICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBxbng0IGdsb2JhbCBmaWxlc3lzdGVtIGRlZmluaXRpb25zCisgKiAgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICA6IDEuMC4yCisgKiAgTGFzdCBtb2RpZmllZCAgICAgICAgICAgICAgICA6IDIwMDAtMDEtMzEKKyAqCisgKiAgSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICA6IDIzLTAzLTE5OTggY3JlYXRlZAorICovCisjaWZuZGVmIF9MSU5VWF9RTlg0X0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1FOWDRfRlNfSAorCisjaW5jbHVkZSA8bGludXgvcW54dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisjZGVmaW5lIFFOWDRfUk9PVF9JTk8gMQorCisjZGVmaW5lIFFOWDRfTUFYX1hUTlRTX1BFUl9YQkxLCTYwCisvKiBmb3IgZGlfc3RhdHVzICovCisjZGVmaW5lIFFOWDRfRklMRV9VU0VEICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUU5YNF9GSUxFX01PRElGSUVEICAgICAgMHgwMgorI2RlZmluZSBRTlg0X0ZJTEVfQlVTWSAgICAgICAgICAweDA0CisjZGVmaW5lIFFOWDRfRklMRV9MSU5LICAgICAgICAgIDB4MDgKKyNkZWZpbmUgUU5YNF9GSUxFX0lOT0RFICAgICAgICAgMHgxMAorI2RlZmluZSBRTlg0X0ZJTEVfRlNZU0NMRUFOICAgICAweDIwCisKKyNkZWZpbmUgUU5YNF9JX01BUF9TTE9UUwk4CisjZGVmaW5lIFFOWDRfWl9NQVBfU0xPVFMJNjQKKyNkZWZpbmUgUU5YNF9WQUxJRF9GUwkJMHgwMDAxCS8qIENsZWFuIGZzLiAqLworI2RlZmluZSBRTlg0X0VSUk9SX0ZTCQkweDAwMDIJLyogZnMgaGFzIGVycm9ycy4gKi8KKyNkZWZpbmUgUU5YNF9CTE9DS19TSVpFICAgICAgICAgMHgyMDAJLyogYmxvY2tzaXplIG9mIDUxMiBieXRlcyAqLworI2RlZmluZSBRTlg0X0JMT0NLX1NJWkVfQklUUyAgICA5CS8qIGJsb2Nrc2l6ZSBzaGlmdCAqLworI2RlZmluZSBRTlg0X0RJUl9FTlRSWV9TSVpFICAgICAweDA0MAkvKiBkaXIgZW50cnkgc2l6ZSBvZiA2NCBieXRlcyAqLworI2RlZmluZSBRTlg0X0RJUl9FTlRSWV9TSVpFX0JJVFMgNgkvKiBkaXIgZW50cnkgc2l6ZSBzaGlmdCAqLworI2RlZmluZSBRTlg0X1hCTEtfRU5UUllfU0laRSAgICAweDIwMAkvKiB4YmxrIGVudHJ5IHNpemUgKi8KKyNkZWZpbmUgUU5YNF9JTk9ERVNfUEVSX0JMT0NLICAgMHgwOAkvKiA1MTIgLyA2NCAqLworCisvKiBmb3IgZmlsZW5hbWVzICovCisjZGVmaW5lIFFOWDRfU0hPUlRfTkFNRV9NQVgJMTYKKyNkZWZpbmUgUU5YNF9OQU1FX01BWAkJNDgKKworLyoKKyAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIHFueDQgaW5vZGUgbGF5b3V0IG9uIGRpc2suCisgKi8KK3N0cnVjdCBxbng0X2lub2RlX2VudHJ5IHsKKwljaGFyCQlkaV9mbmFtZVtRTlg0X1NIT1JUX05BTUVfTUFYXTsKKwlxbng0X29mZl90CWRpX3NpemU7CisJcW54NF94dG50X3QJZGlfZmlyc3RfeHRudDsKKwlfX2xlMzIJCWRpX3hibGs7CisJX19sZTMyCQlkaV9mdGltZTsKKwlfX2xlMzIJCWRpX210aW1lOworCV9fbGUzMgkJZGlfYXRpbWU7CisJX19sZTMyCQlkaV9jdGltZTsKKwlxbng0X254dG50X3QJZGlfbnVtX3h0bnRzOworCXFueDRfbW9kZV90CWRpX21vZGU7CisJcW54NF9tdWlkX3QJZGlfdWlkOworCXFueDRfbWdpZF90CWRpX2dpZDsKKwlxbng0X25saW5rX3QJZGlfbmxpbms7CisJX191OAkJZGlfemVyb1s0XTsKKwlxbng0X2Z0eXBlX3QJZGlfdHlwZTsKKwlfX3U4CQlkaV9zdGF0dXM7Cit9OworCitzdHJ1Y3QgcW54NF9saW5rX2luZm8geworCWNoYXIJCWRsX2ZuYW1lW1FOWDRfTkFNRV9NQVhdOworCV9fbGUzMgkJZGxfaW5vZGVfYmxrOworCV9fdTgJCWRsX2lub2RlX25keDsKKwlfX3U4CQlkbF9zcGFyZVsxMF07CisJX191OAkJZGxfc3RhdHVzOworfTsKKworc3RydWN0IHFueDRfeGJsayB7CisJX19sZTMyCQl4YmxrX25leHRfeGJsazsKKwlfX2xlMzIJCXhibGtfcHJldl94YmxrOworCV9fdTgJCXhibGtfbnVtX3h0bnRzOworCV9fdTgJCXhibGtfc3BhcmVbM107CisJX19sZTMyCQl4YmxrX251bV9ibG9ja3M7CisJcW54NF94dG50X3QJeGJsa194dG50c1tRTlg0X01BWF9YVE5UU19QRVJfWEJMS107CisJY2hhcgkJeGJsa19zaWduYXR1cmVbOF07CisJcW54NF94dG50X3QJeGJsa19maXJzdF94dG50OworfTsKKworc3RydWN0IHFueDRfc3VwZXJfYmxvY2sgeworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5IFJvb3REaXI7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgSW5vZGU7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgQm9vdDsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSBBbHRCb290OworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ViMTEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICA6IHFueHR5cGVzLmgKKyAqICBBdXRob3IgICAgICAgICAgICAgICAgICAgICAgIDogUmljaGFyZCBGcm93aWpuCisgKiAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICA6IHN0YW5kYXJkIHFueCB0eXBlcworICogIFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgOiAxLjAuMgorICogIExhc3QgbW9kaWZpZWQgICAgICAgICAgICAgICAgOiAyMDAwLTAxLTA2CisgKgorICogIEhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgOiAyMi0wMy0xOTk4IGNyZWF0ZWQKKyAqCisgKi8KKworI2lmbmRlZiBfUU5YNFRZUEVTX0gKKyNkZWZpbmUgX1FOWDRUWVBFU19ICisKK3R5cGVkZWYgX19sZTE2IHFueDRfbnh0bnRfdDsKK3R5cGVkZWYgX191OCAgcW54NF9mdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyIHh0bnRfYmxrOworCV9fbGUzMiB4dG50X3NpemU7Cit9IHFueDRfeHRudF90OworCit0eXBlZGVmIF9fbGUxNiBxbng0X21vZGVfdDsKK3R5cGVkZWYgX19sZTE2IHFueDRfbXVpZF90OwordHlwZWRlZiBfX2xlMTYgcW54NF9tZ2lkX3Q7Cit0eXBlZGVmIF9fbGUzMiBxbng0X29mZl90OwordHlwZWRlZiBfX2xlMTYgcW54NF9ubGlua190OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE5YWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xdW90YS5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogUm9iZXJ0IEVseiBhdCBUaGUgVW5pdmVyc2l0eSBvZiBNZWxib3VybmUuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFZlcnNpb246ICRJZDogcXVvdGEuaCx2IDIuMCAxOTk2LzExLzE3IDE2OjQ4OjE0IG12dyBFeHAgbXZ3ICQKKyAqLworCisjaWZuZGVmIF9MSU5VWF9RVU9UQV8KKyNkZWZpbmUgX0xJTlVYX1FVT1RBXworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIF9fRFFVT1RfVkVSU0lPTl9fCSJkcXVvdF82LjUuMSIKKyNkZWZpbmUgX19EUVVPVF9OVU1fVkVSU0lPTl9fCTYqMTAwMDArNSoxMDArMQorCit0eXBlZGVmIF9fa2VybmVsX3VpZDMyX3QgcWlkX3Q7IC8qIFR5cGUgaW4gd2hpY2ggd2Ugc3RvcmUgaWRzIGluIG1lbW9yeSAqLwordHlwZWRlZiBfX3U2NCBxc2l6ZV90OyAgICAgICAgICAvKiBUeXBlIGluIHdoaWNoIHdlIHN0b3JlIHNpemVzICovCisKKy8qIFNpemUgb2YgYmxvY2tzIGluIHdoaWNoIGFyZSBjb3VudGVkIHNpemUgbGltaXRzICovCisjZGVmaW5lIFFVT1RBQkxPQ0tfQklUUyAxMAorI2RlZmluZSBRVU9UQUJMT0NLX1NJWkUgKDEgPDwgUVVPVEFCTE9DS19CSVRTKQorCisvKiBDb252ZXJzaW9uIHJvdXRpbmVzIGZyb20gYW5kIHRvIHF1b3RhIGJsb2NrcyAqLworI2RlZmluZSBxYjJrYih4KSAoKHgpIDw8IChRVU9UQUJMT0NLX0JJVFMtMTApKQorI2RlZmluZSBrYjJxYih4KSAoKHgpID4+IChRVU9UQUJMT0NLX0JJVFMtMTApKQorI2RlZmluZSB0b3FiKHgpICgoKHgpICsgUVVPVEFCTE9DS19TSVpFIC0gMSkgPj4gUVVPVEFCTE9DS19CSVRTKQorCisjZGVmaW5lIE1BWFFVT1RBUyAyCisjZGVmaW5lIFVTUlFVT1RBICAwCQkvKiBlbGVtZW50IHVzZWQgZm9yIHVzZXIgcXVvdGFzICovCisjZGVmaW5lIEdSUFFVT1RBICAxCQkvKiBlbGVtZW50IHVzZWQgZm9yIGdyb3VwIHF1b3RhcyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG5hbWVzIG9mIHRoZSBxdW90YXMgZmlsZXMuCisgKi8KKyNkZWZpbmUgSU5JVFFGTkFNRVMgeyBcCisJInVzZXIiLCAgICAvKiBVU1JRVU9UQSAqLyBcCisJImdyb3VwIiwgICAvKiBHUlBRVU9UQSAqLyBcCisJInVuZGVmaW5lZCIsIFwKK307CisKKy8qCisgKiBDb21tYW5kIGRlZmluaXRpb25zIGZvciB0aGUgJ3F1b3RhY3RsJyBzeXN0ZW0gY2FsbC4KKyAqIFRoZSBjb21tYW5kcyBhcmUgYnJva2VuIGludG8gYSBtYWluIGNvbW1hbmQgZGVmaW5lZCBiZWxvdworICogYW5kIGEgc3ViY29tbWFuZCB0aGF0IGlzIHVzZWQgdG8gY29udmV5IHRoZSB0eXBlIG9mCisgKiBxdW90YSB0aGF0IGlzIGJlaW5nIG1hbmlwdWxhdGVkIChzZWUgYWJvdmUpLgorICovCisjZGVmaW5lIFNVQkNNRE1BU0sgIDB4MDBmZgorI2RlZmluZSBTVUJDTURTSElGVCA4CisjZGVmaW5lIFFDTUQoY21kLCB0eXBlKSAgKCgoY21kKSA8PCBTVUJDTURTSElGVCkgfCAoKHR5cGUpICYgU1VCQ01ETUFTSykpCisKKyNkZWZpbmUgUV9TWU5DICAgICAweDgwMDAwMQkvKiBzeW5jIGRpc2sgY29weSBvZiBhIGZpbGVzeXN0ZW1zIHF1b3RhcyAqLworI2RlZmluZSBRX1FVT1RBT04gIDB4ODAwMDAyCS8qIHR1cm4gcXVvdGFzIG9uICovCisjZGVmaW5lIFFfUVVPVEFPRkYgMHg4MDAwMDMJLyogdHVybiBxdW90YXMgb2ZmICovCisjZGVmaW5lIFFfR0VURk1UICAgMHg4MDAwMDQJLyogZ2V0IHF1b3RhIGZvcm1hdCB1c2VkIG9uIGdpdmVuIGZpbGVzeXN0ZW0gKi8KKyNkZWZpbmUgUV9HRVRJTkZPICAweDgwMDAwNQkvKiBnZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyNkZWZpbmUgUV9TRVRJTkZPICAweDgwMDAwNgkvKiBzZXQgaW5mb3JtYXRpb24gYWJvdXQgcXVvdGEgZmlsZXMgKi8KKyNkZWZpbmUgUV9HRVRRVU9UQSAweDgwMDAwNwkvKiBnZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUV9TRVRRVU9UQSAweDgwMDAwOAkvKiBzZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIFF1b3RhIHN0cnVjdHVyZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdXNlcnNwYWNlIHZpYSBxdW90YWN0bAorICogRm9sbG93aW5nIGZsYWdzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGFyZSB2YWxpZAorICovCisjZGVmaW5lIFFJRl9CTElNSVRTCTEKKyNkZWZpbmUgUUlGX1NQQUNFCTIKKyNkZWZpbmUgUUlGX0lMSU1JVFMJNAorI2RlZmluZSBRSUZfSU5PREVTCTgKKyNkZWZpbmUgUUlGX0JUSU1FCTE2CisjZGVmaW5lIFFJRl9JVElNRQkzMgorI2RlZmluZSBRSUZfTElNSVRTCShRSUZfQkxJTUlUUyB8IFFJRl9JTElNSVRTKQorI2RlZmluZSBRSUZfVVNBR0UJKFFJRl9TUEFDRSB8IFFJRl9JTk9ERVMpCisjZGVmaW5lIFFJRl9USU1FUwkoUUlGX0JUSU1FIHwgUUlGX0lUSU1FKQorI2RlZmluZSBRSUZfQUxMCQkoUUlGX0xJTUlUUyB8IFFJRl9VU0FHRSB8IFFJRl9USU1FUykKKworc3RydWN0IGlmX2RxYmxrIHsKKwlfX3U2NCBkcWJfYmhhcmRsaW1pdDsKKwlfX3U2NCBkcWJfYnNvZnRsaW1pdDsKKwlfX3U2NCBkcWJfY3Vyc3BhY2U7CisJX191NjQgZHFiX2loYXJkbGltaXQ7CisJX191NjQgZHFiX2lzb2Z0bGltaXQ7CisJX191NjQgZHFiX2N1cmlub2RlczsKKwlfX3U2NCBkcWJfYnRpbWU7CisJX191NjQgZHFiX2l0aW1lOworCV9fdTMyIGRxYl92YWxpZDsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBmb3Igc2V0dGluZyBxdW90YSBpbmZvcm1hdGlvbiBhYm91dCBmaWxlIHZpYSBxdW90YWN0bAorICogRm9sbG93aW5nIGZsYWdzIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGFyZSB2YWxpZAorICovCisjZGVmaW5lIElJRl9CR1JBQ0UJMQorI2RlZmluZSBJSUZfSUdSQUNFCTIKKyNkZWZpbmUgSUlGX0ZMQUdTCTQKKyNkZWZpbmUgSUlGX0FMTAkJKElJRl9CR1JBQ0UgfCBJSUZfSUdSQUNFIHwgSUlGX0ZMQUdTKQorCitzdHJ1Y3QgaWZfZHFpbmZvIHsKKwlfX3U2NCBkcWlfYmdyYWNlOworCV9fdTY0IGRxaV9pZ3JhY2U7CisJX191MzIgZHFpX2ZsYWdzOworCV9fdTMyIGRxaV92YWxpZDsKK307CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgcXVvdGEgbmV0bGluayBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBRVU9UQV9OTF9OT1dBUk4gMAorI2RlZmluZSBRVU9UQV9OTF9JSEFSRFdBUk4gMQkJLyogSW5vZGUgaGFyZGxpbWl0IHJlYWNoZWQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfSVNPRlRMT05HV0FSTiAyIAkvKiBJbm9kZSBncmFjZSB0aW1lIGV4cGlyZWQgKi8KKyNkZWZpbmUgUVVPVEFfTkxfSVNPRlRXQVJOIDMJCS8qIElub2RlIHNvZnRsaW1pdCByZWFjaGVkICovCisjZGVmaW5lIFFVT1RBX05MX0JIQVJEV0FSTiA0CQkvKiBCbG9jayBoYXJkbGltaXQgcmVhY2hlZCAqLworI2RlZmluZSBRVU9UQV9OTF9CU09GVExPTkdXQVJOIDUJLyogQmxvY2sgZ3JhY2UgdGltZSBleHBpcmVkICovCisjZGVmaW5lIFFVT1RBX05MX0JTT0ZUV0FSTiA2CQkvKiBCbG9jayBzb2Z0bGltaXQgcmVhY2hlZCAqLworCitlbnVtIHsKKwlRVU9UQV9OTF9DX1VOU1BFQywKKwlRVU9UQV9OTF9DX1dBUk5JTkcsCisJX19RVU9UQV9OTF9DX01BWCwKK307CisjZGVmaW5lIFFVT1RBX05MX0NfTUFYIChfX1FVT1RBX05MX0NfTUFYIC0gMSkKKworZW51bSB7CisJUVVPVEFfTkxfQV9VTlNQRUMsCisJUVVPVEFfTkxfQV9RVFlQRSwKKwlRVU9UQV9OTF9BX0VYQ0VTU19JRCwKKwlRVU9UQV9OTF9BX1dBUk5JTkcsCisJUVVPVEFfTkxfQV9ERVZfTUFKT1IsCisJUVVPVEFfTkxfQV9ERVZfTUlOT1IsCisJUVVPVEFfTkxfQV9DQVVTRURfSUQsCisJX19RVU9UQV9OTF9BX01BWCwKK307CisjZGVmaW5lIFFVT1RBX05MX0FfTUFYIChfX1FVT1RBX05MX0FfTUFYIC0gMSkKKworCisKKyMgLyogbm9kZXAgKi8gaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKK19fQkVHSU5fREVDTFMKK2xvbmcgcXVvdGFjdGwgX19QICgodW5zaWduZWQgaW50LCBjb25zdCBjaGFyICosIGludCwgY2FkZHJfdCkpOworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9RVU9UQV8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGFpb192MS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9xdW90YWlvX3YxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2NjU0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGFpb192MS5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0xJTlVYX1FVT1RBSU9fVjFfSAorI2RlZmluZSBfTElOVVhfUVVPVEFJT19WMV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgZGVmaW5lIHRoZSBhbW91bnQgb2YgdGltZSBnaXZlbiBhIHVzZXIKKyAqIGJlZm9yZSB0aGUgc29mdCBsaW1pdHMgYXJlIHRyZWF0ZWQgYXMgaGFyZCBsaW1pdHMgKHVzdWFsbHkgcmVzdWx0aW5nCisgKiBpbiBhbiBhbGxvY2F0aW9uIGZhaWx1cmUpLiBUaGUgdGltZXIgaXMgc3RhcnRlZCB3aGVuIHRoZSB1c2VyIGNyb3NzZXMKKyAqIHRoZWlyIHNvZnQgbGltaXQsIGl0IGlzIHJlc2V0IHdoZW4gdGhleSBnbyBiZWxvdyB0aGVpciBzb2Z0IGxpbWl0LgorICovCisjZGVmaW5lIE1BWF9JUV9USU1FICA2MDQ4MDAJLyogKDcqMjQqNjAqNjApIDEgd2VlayAqLworI2RlZmluZSBNQVhfRFFfVElNRSAgNjA0ODAwCS8qICg3KjI0KjYwKjYwKSAxIHdlZWsgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGlzayBxdW90YSBmaWxlCisgKiAoYXMgaXQgYXBwZWFycyBvbiBkaXNrKSAtIHRoZSBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMKKyAqIGluZGV4ZWQgYnkgdXNlciBvciBncm91cCBudW1iZXIuCisgKi8KK3N0cnVjdCB2MV9kaXNrX2RxYmxrIHsKKwlfX3UzMiBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzIGFsbG9jICovCisJX191MzIgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwlfX3UzMiBkcWJfY3VyYmxvY2tzOwkvKiBjdXJyZW50IGJsb2NrIGNvdW50ICovCisJX191MzIgZHFiX2loYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwlfX3UzMiBkcWJfaXNvZnRsaW1pdDsJLyogcHJlZmVycmVkIGlub2RlIGxpbWl0ICovCisJX191MzIgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwl0aW1lX3QgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKwl0aW1lX3QgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgaW5vZGUgdXNlICovCit9OworCisjZGVmaW5lIHYxX2Rxb2ZmKFVJRCkgICAgICAoKGxvZmZfdCkoKFVJRCkgKiBzaXplb2YgKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSkpCisKKyNlbmRpZgkvKiBfTElOVVhfUVVPVEFJT19WMV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcXVvdGFpb192Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2Q3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3F1b3RhaW9fdjIuaApAQCAtMCwwICsxLDc5IEBACisvKgorICoJRGVmaW5pdGlvbnMgb2Ygc3RydWN0dXJlcyBmb3IgdmZzdjAgcXVvdGEgZm9ybWF0CisgKi8KKworI2lmbmRlZiBfTElOVVhfUVVPVEFJT19WMl9ICisjZGVmaW5lIF9MSU5VWF9RVU9UQUlPX1YyX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KKworLyoKKyAqIERlZmluaXRpb25zIG9mIG1hZ2ljcyBhbmQgdmVyc2lvbnMgb2YgY3VycmVudCBxdW90YSBmaWxlcworICovCisjZGVmaW5lIFYyX0lOSVRRTUFHSUNTIHtcCisJMHhkOWMwMWYxMSwJLyogVVNSUVVPVEEgKi9cCisJMHhkOWMwMTkyNwkvKiBHUlBRVU9UQSAqL1wKK30KKworI2RlZmluZSBWMl9JTklUUVZFUlNJT05TIHtcCisJMCwJCS8qIFVTUlFVT1RBICovXAorCTAJCS8qIEdSUFFVT1RBICovXAorfQorCisvKgorICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSBkaXNrIHF1b3RhIGZpbGUKKyAqIChhcyBpdCBhcHBlYXJzIG9uIGRpc2spIC0gdGhlIGZpbGUgaXMgYSByYWRpeCB0cmVlIHdob3NlIGxlYXZlcyBwb2ludAorICogdG8gYmxvY2tzIG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCB2Ml9kaXNrX2RxYmxrIHsKKwlfX2xlMzIgZHFiX2lkOwkJLyogaWQgdGhpcyBxdW90YSBhcHBsaWVzIHRvICovCisJX19sZTMyIGRxYl9paGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBhbGxvY2F0ZWQgaW5vZGVzICovCisJX19sZTMyIGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKwlfX2xlMzIgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwlfX2xlMzIgZHFiX2JoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgc3BhY2UgKGluIFFVT1RBQkxPQ0tfU0laRSkgKi8KKwlfX2xlMzIgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIHNwYWNlIChpbiBRVU9UQUJMT0NLX1NJWkUpICovCisJX19sZTY0IGRxYl9jdXJzcGFjZTsJLyogY3VycmVudCBzcGFjZSBvY2N1cGllZCAoaW4gYnl0ZXMpICovCisJX19sZTY0IGRxYl9idGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisJX19sZTY0IGRxYl9pdGltZTsJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGlub2RlIHVzZSAqLworfTsKKworLyoKKyAqIEhlcmUgYXJlIGhlYWRlciBzdHJ1Y3R1cmVzIGFzIHdyaXR0ZW4gb24gZGlzayBhbmQgdGhlaXIgaW4tbWVtb3J5IGNvcGllcworICovCisvKiBGaXJzdCBnZW5lcmljIGhlYWRlciAqLworc3RydWN0IHYyX2Rpc2tfZHFoZWFkZXIgeworCV9fbGUzMiBkcWhfbWFnaWM7CS8qIE1hZ2ljIG51bWJlciBpZGVudGlmeWluZyBmaWxlICovCisJX19sZTMyIGRxaF92ZXJzaW9uOwkvKiBGaWxlIHZlcnNpb24gKi8KK307CisKKy8qIEhlYWRlciB3aXRoIHR5cGUgYW5kIHZlcnNpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCB2Ml9kaXNrX2RxaW5mbyB7CisJX19sZTMyIGRxaV9iZ3JhY2U7CS8qIFRpbWUgYmVmb3JlIGJsb2NrIHNvZnQgbGltaXQgYmVjb21lcyBoYXJkIGxpbWl0ICovCisJX19sZTMyIGRxaV9pZ3JhY2U7CS8qIFRpbWUgYmVmb3JlIGlub2RlIHNvZnQgbGltaXQgYmVjb21lcyBoYXJkIGxpbWl0ICovCisJX19sZTMyIGRxaV9mbGFnczsJLyogRmxhZ3MgZm9yIHF1b3RhZmlsZSAoRFFGXyopICovCisJX19sZTMyIGRxaV9ibG9ja3M7CS8qIE51bWJlciBvZiBibG9ja3MgaW4gZmlsZSAqLworCV9fbGUzMiBkcWlfZnJlZV9ibGs7CS8qIE51bWJlciBvZiBmaXJzdCBmcmVlIGJsb2NrIGluIHRoZSBsaXN0ICovCisJX19sZTMyIGRxaV9mcmVlX2VudHJ5OwkvKiBOdW1iZXIgb2YgYmxvY2sgd2l0aCBhdCBsZWFzdCBvbmUgZnJlZSBlbnRyeSAqLworfTsKKworLyoKKyAqICBTdHJ1Y3R1cmUgb2YgaGVhZGVyIG9mIGJsb2NrIHdpdGggcXVvdGEgc3RydWN0dXJlcy4gSXQgaXMgcGFkZGVkIHRvIDE2IGJ5dGVzIHNvCisgKiAgdGhlcmUgd2lsbCBiZSBzcGFjZSBmb3IgZXhhY3RseSAyMSBxdW90YS1lbnRyaWVzIGluIGEgYmxvY2sKKyAqLworc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciB7CisJX19sZTMyIGRxZGhfbmV4dF9mcmVlOwkvKiBOdW1iZXIgb2YgbmV4dCBibG9jayB3aXRoIGZyZWUgZW50cnkgKi8KKwlfX2xlMzIgZHFkaF9wcmV2X2ZyZWU7CS8qIE51bWJlciBvZiBwcmV2aW91cyBibG9jayB3aXRoIGZyZWUgZW50cnkgKi8KKwlfX2xlMTYgZHFkaF9lbnRyaWVzOwkvKiBOdW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiBibG9jayAqLworCV9fbGUxNiBkcWRoX3BhZDE7CisJX19sZTMyIGRxZGhfcGFkMjsKK307CisKKyNkZWZpbmUgVjJfRFFJTkZPT0ZGCXNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWhlYWRlcikJLyogT2Zmc2V0IG9mIGluZm8gaGVhZGVyIGluIGZpbGUgKi8KKyNkZWZpbmUgVjJfRFFCTEtTSVpFX0JJVFMJMTAKKyNkZWZpbmUgVjJfRFFCTEtTSVpFCSgxIDw8IFYyX0RRQkxLU0laRV9CSVRTKQkvKiBTaXplIG9mIGJsb2NrIHdpdGggcXVvdGEgc3RydWN0dXJlcyAqLworI2RlZmluZSBWMl9EUVRSRUVPRkYJMQkJLyogT2Zmc2V0IG9mIHRyZWUgaW4gZmlsZSBpbiBibG9ja3MgKi8KKyNkZWZpbmUgVjJfRFFUUkVFREVQVEgJNAkJLyogRGVwdGggb2YgcXVvdGEgdHJlZSAqLworI2RlZmluZSBWMl9EUVNUUklOQkxLCSgoVjJfRFFCTEtTSVpFIC0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIpKSAvIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIG9uZSBibG9ja3MgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9RVU9UQUlPX1YyX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ4OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWRlb25mYi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgX19MSU5VWF9SQURFT05GQl9IX18KKyNkZWZpbmUgX19MSU5VWF9SQURFT05GQl9IX18KKworI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjZGVmaW5lIEFUWV9SQURFT05fTENEX09OCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVRZX1JBREVPTl9DUlRfT04JMHgwMDAwMDAwMgorCisKKyNkZWZpbmUgRkJJT19SQURFT05fR0VUX01JUlJPUglfSU9SKCdAJywgMywgc2l6ZV90KQorI2RlZmluZSBGQklPX1JBREVPTl9TRVRfTUlSUk9SCV9JT1coJ0AnLCA0LCBzaXplX3QpCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY4MmEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaApAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAgIG1kX3AuaCA6IHBoeXNpY2FsIGxheW91dCBvZiBMaW51eCBSQUlEIGRldmljZXMKKyAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtOTggSW5nbyBNb2xuYXIsIEdhZGkgT3htYW4KKwkgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIChmb3IgZXhhbXBsZSAvdXNyL3NyYy9saW51eC9DT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAKKyovCisKKyNpZm5kZWYgX01EX1BfSAorI2RlZmluZSBfTURfUF9ICisKKy8qCisgKiBSQUlEIHN1cGVyYmxvY2suCisgKgorICogVGhlIFJBSUQgc3VwZXJibG9jayBtYWludGFpbnMgc29tZSBzdGF0aXN0aWNzIG9uIGVhY2ggUkFJRCBjb25maWd1cmF0aW9uLgorICogRWFjaCByZWFsIGRldmljZSBpbiB0aGUgUkFJRCBzZXQgY29udGFpbnMgaXQgbmVhciB0aGUgZW5kIG9mIHRoZSBkZXZpY2UuCisgKiBTb21lIG9mIHRoZSBpZGVhcyBhcmUgY29waWVkIGZyb20gdGhlIGV4dDJmcyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBXZSBjdXJyZW50bHkgdXNlIDQwOTYgYnl0ZXMgYXMgZm9sbG93czoKKyAqCisgKgl3b3JkIG9mZnNldAlmdW5jdGlvbgorICoKKyAqCSAgIDAgIC0gICAgMzEJQ29uc3RhbnQgZ2VuZXJpYyBSQUlEIGRldmljZSBpbmZvcm1hdGlvbi4KKyAqICAgICAgICAzMiAgLSAgICA2MyAgIEdlbmVyaWMgc3RhdGUgaW5mb3JtYXRpb24uCisgKgkgIDY0ICAtICAgMTI3CVBlcnNvbmFsaXR5IHNwZWNpZmljIGluZm9ybWF0aW9uLgorICoJIDEyOCAgLSAgIDUxMQkxMiAzMi13b3JkcyBkZXNjcmlwdG9ycyBvZiB0aGUgZGlza3MgaW4gdGhlIHJhaWQgc2V0LgorICoJIDUxMiAgLSAgIDkxMQlSZXNlcnZlZC4KKyAqCSA5MTIgIC0gIDEwMjMJRGlzayBzcGVjaWZpYyBkZXNjcmlwdG9yLgorICovCisKKy8qCisgKiBJZiB4IGlzIHRoZSByZWFsIGRldmljZSBzaXplIGluIGJ5dGVzLCB3ZSByZXR1cm4gYW4gYXBwYXJlbnQgc2l6ZSBvZjoKKyAqCisgKgl5ID0gKHggJiB+KE1EX1JFU0VSVkVEX0JZVEVTIC0gMSkpIC0gTURfUkVTRVJWRURfQllURVMKKyAqCisgKiBhbmQgcGxhY2UgdGhlIDRrQiBzdXBlcmJsb2NrIGF0IG9mZnNldCB5LgorICovCisjZGVmaW5lIE1EX1JFU0VSVkVEX0JZVEVTCQkoNjQgKiAxMDI0KQorI2RlZmluZSBNRF9SRVNFUlZFRF9TRUNUT1JTCQkoTURfUkVTRVJWRURfQllURVMgLyA1MTIpCisjZGVmaW5lIE1EX1JFU0VSVkVEX0JMT0NLUwkJKE1EX1JFU0VSVkVEX0JZVEVTIC8gQkxPQ0tfU0laRSkKKworI2RlZmluZSBNRF9ORVdfU0laRV9TRUNUT1JTKHgpCQkoKHggJiB+KE1EX1JFU0VSVkVEX1NFQ1RPUlMgLSAxKSkgLSBNRF9SRVNFUlZFRF9TRUNUT1JTKQorI2RlZmluZSBNRF9ORVdfU0laRV9CTE9DS1MoeCkJCSgoeCAmIH4oTURfUkVTRVJWRURfQkxPQ0tTIC0gMSkpIC0gTURfUkVTRVJWRURfQkxPQ0tTKQorCisjZGVmaW5lIE1EX1NCX0JZVEVTCQkJNDA5NgorI2RlZmluZSBNRF9TQl9XT1JEUwkJCShNRF9TQl9CWVRFUyAvIDQpCisjZGVmaW5lIE1EX1NCX0JMT0NLUwkJCShNRF9TQl9CWVRFUyAvIEJMT0NLX1NJWkUpCisjZGVmaW5lIE1EX1NCX1NFQ1RPUlMJCQkoTURfU0JfQllURVMgLyA1MTIpCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFyZSBjb3VudGVkIGluIDMyLWJpdCB3b3JkcworICovCisjZGVmaW5lCU1EX1NCX0dFTkVSSUNfT0ZGU0VUCQkwCisjZGVmaW5lIE1EX1NCX1BFUlNPTkFMSVRZX09GRlNFVAk2NAorI2RlZmluZSBNRF9TQl9ESVNLU19PRkZTRVQJCTEyOAorI2RlZmluZSBNRF9TQl9ERVNDUklQVE9SX09GRlNFVAkJOTkyCisKKyNkZWZpbmUgTURfU0JfR0VORVJJQ19DT05TVEFOVF9XT1JEUwkzMgorI2RlZmluZSBNRF9TQl9HRU5FUklDX1NUQVRFX1dPUkRTCTMyCisjZGVmaW5lIE1EX1NCX0dFTkVSSUNfV09SRFMJCShNRF9TQl9HRU5FUklDX0NPTlNUQU5UX1dPUkRTICsgTURfU0JfR0VORVJJQ19TVEFURV9XT1JEUykKKyNkZWZpbmUgTURfU0JfUEVSU09OQUxJVFlfV09SRFMJCTY0CisjZGVmaW5lIE1EX1NCX0RFU0NSSVBUT1JfV09SRFMJCTMyCisjZGVmaW5lIE1EX1NCX0RJU0tTCQkJMjcKKyNkZWZpbmUgTURfU0JfRElTS1NfV09SRFMJCShNRF9TQl9ESVNLUypNRF9TQl9ERVNDUklQVE9SX1dPUkRTKQorI2RlZmluZSBNRF9TQl9SRVNFUlZFRF9XT1JEUwkJKDEwMjQgLSBNRF9TQl9HRU5FUklDX1dPUkRTIC0gTURfU0JfUEVSU09OQUxJVFlfV09SRFMgLSBNRF9TQl9ESVNLU19XT1JEUyAtIE1EX1NCX0RFU0NSSVBUT1JfV09SRFMpCisjZGVmaW5lIE1EX1NCX0VRVUFMX1dPUkRTCQkoTURfU0JfR0VORVJJQ19XT1JEUyArIE1EX1NCX1BFUlNPTkFMSVRZX1dPUkRTICsgTURfU0JfRElTS1NfV09SRFMpCisKKy8qCisgKiBEZXZpY2UgIm9wZXJhdGlvbmFsIiBzdGF0ZSBiaXRzCisgKi8KKyNkZWZpbmUgTURfRElTS19GQVVMVFkJCTAgLyogZGlzayBpcyBmYXVsdHkgLyBvcGVyYXRpb25hbCAqLworI2RlZmluZSBNRF9ESVNLX0FDVElWRQkJMSAvKiBkaXNrIGlzIHJ1bm5pbmcgb3Igc3BhcmUgZGlzayAqLworI2RlZmluZSBNRF9ESVNLX1NZTkMJCTIgLyogZGlzayBpcyBpbiBzeW5jIHdpdGggdGhlIHJhaWQgc2V0ICovCisjZGVmaW5lIE1EX0RJU0tfUkVNT1ZFRAkJMyAvKiBkaXNrIGlzIGluIHN5bmMgd2l0aCB0aGUgcmFpZCBzZXQgKi8KKworI2RlZmluZQlNRF9ESVNLX1dSSVRFTU9TVExZCTkgLyogZGlzayBpcyAid3JpdGUtbW9zdGx5IiBpcyBSQUlEMSBjb25maWcuCisJCQkJICAgKiByZWFkIHJlcXVlc3RzIHdpbGwgb25seSBiZSBzZW50IGhlcmUgaW4KKwkJCQkgICAqIGRpcmUgbmVlZAorCQkJCSAgICovCisKK3R5cGVkZWYgc3RydWN0IG1kcF9kZXZpY2VfZGVzY3JpcHRvcl9zIHsKKwlfX3UzMiBudW1iZXI7CQkvKiAwIERldmljZSBudW1iZXIgaW4gdGhlIGVudGlyZSBzZXQJICAgICAgKi8KKwlfX3UzMiBtYWpvcjsJCS8qIDEgRGV2aWNlIG1ham9yIG51bWJlcgkJICAgICAgKi8KKwlfX3UzMiBtaW5vcjsJCS8qIDIgRGV2aWNlIG1pbm9yIG51bWJlcgkJICAgICAgKi8KKwlfX3UzMiByYWlkX2Rpc2s7CS8qIDMgVGhlIHJvbGUgb2YgdGhlIGRldmljZSBpbiB0aGUgcmFpZCBzZXQgICAqLworCV9fdTMyIHN0YXRlOwkJLyogNCBPcGVyYXRpb25hbCBzdGF0ZQkJCSAgICAgICovCisJX191MzIgcmVzZXJ2ZWRbTURfU0JfREVTQ1JJUFRPUl9XT1JEUyAtIDVdOworfSBtZHBfZGlza190OworCisjZGVmaW5lIE1EX1NCX01BR0lDCQkweGE5MmI0ZWZjCisKKy8qCisgKiBTdXBlcmJsb2NrIHN0YXRlIGJpdHMKKyAqLworI2RlZmluZSBNRF9TQl9DTEVBTgkJMAorI2RlZmluZSBNRF9TQl9FUlJPUlMJCTEKKworI2RlZmluZQlNRF9TQl9CSVRNQVBfUFJFU0VOVAk4IC8qIGJpdG1hcCBtYXkgYmUgcHJlc2VudCBuZWFyYnkgKi8KKworLyoKKyAqIE5vdGVzOgorICogLSBpZiBhbiBhcnJheSBpcyBiZWluZyByZXNoYXBlZCAocmVzdHJpcGVkKSBpbiBvcmRlciB0byBjaGFuZ2UgdGhlCisgKiAgIHRoZSBudW1iZXIgb2YgYWN0aXZlIGRldmljZXMgaW4gdGhlIGFycmF5LCAncmFpZF9kaXNrcycgd2lsbCBiZQorICogICB0aGUgbGFyZ2VyIG9mIHRoZSBvbGQgYW5kIG5ldyBudW1iZXJzLiAgJ2RlbHRhX2Rpc2tzJyB3aWxsCisgKiAgIGJlIHRoZSAibmV3IC0gb2xkIi4gIFNvIGlmICt2ZSwgcmFpZF9kaXNrcyBpcyB0aGUgbmV3IHZhbHVlLCBhbmQKKyAqICAgInJhaWRfZGlza3MtZGVsdGFfZGlza3MiIGlzIHRoZSBvbGQuICBJZiAtdmUsIHJhaWRfZGlza3MgaXMgdGhlCisgKiAgIG9sZCB2YWx1ZSBhbmQgInJhaWRfZGlza3MrZGVsdGFfZGlza3MiIGlzIHRoZSBuZXcgKHNtYWxsZXIpIHZhbHVlLgorICovCisKKwordHlwZWRlZiBzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfcyB7CisJLyoKKwkgKiBDb25zdGFudCBnZW5lcmljIGluZm9ybWF0aW9uCisJICovCisJX191MzIgbWRfbWFnaWM7CQkvKiAgMCBNRCBpZGVudGlmaWVyIAkJCSAgICAgICovCisJX191MzIgbWFqb3JfdmVyc2lvbjsJLyogIDEgbWFqb3IgdmVyc2lvbiB0byB3aGljaCB0aGUgc2V0IGNvbmZvcm1zICovCisJX191MzIgbWlub3JfdmVyc2lvbjsJLyogIDIgbWlub3IgdmVyc2lvbiAuLi4JCQkgICAgICAqLworCV9fdTMyIHBhdGNoX3ZlcnNpb247CS8qICAzIHBhdGNobGV2ZWwgdmVyc2lvbiAuLi4JCSAgICAgICovCisJX191MzIgZ3ZhbGlkX3dvcmRzOwkvKiAgNCBOdW1iZXIgb2YgdXNlZCB3b3JkcyBpbiB0aGlzIHNlY3Rpb24gICAgKi8KKwlfX3UzMiBzZXRfdXVpZDA7CS8qICA1IFJhaWQgc2V0IGlkZW50aWZpZXIJCSAgICAgICovCisJX191MzIgY3RpbWU7CQkvKiAgNiBDcmVhdGlvbiB0aW1lCQkJICAgICAgKi8KKwlfX3UzMiBsZXZlbDsJCS8qICA3IFJhaWQgcGVyc29uYWxpdHkJCQkgICAgICAqLworCV9fdTMyIHNpemU7CQkvKiAgOCBBcHBhcmVudCBzaXplIG9mIGVhY2ggaW5kaXZpZHVhbCBkaXNrICAgKi8KKwlfX3UzMiBucl9kaXNrczsJCS8qICA5IHRvdGFsIGRpc2tzIGluIHRoZSByYWlkIHNldAkgICAgICAqLworCV9fdTMyIHJhaWRfZGlza3M7CS8qIDEwIGRpc2tzIGluIGEgZnVsbHkgZnVuY3Rpb25hbCByYWlkIHNldCAgICAqLworCV9fdTMyIG1kX21pbm9yOwkJLyogMTEgcHJlZmVycmVkIE1EIG1pbm9yIGRldmljZSBudW1iZXIJICAgICAgKi8KKwlfX3UzMiBub3RfcGVyc2lzdGVudDsJLyogMTIgZG9lcyBpdCBoYXZlIGEgcGVyc2lzdGVudCBzdXBlcmJsb2NrICAgICovCisJX191MzIgc2V0X3V1aWQxOwkvKiAxMyBSYWlkIHNldCBpZGVudGlmaWVyICMyCQkgICAgICAqLworCV9fdTMyIHNldF91dWlkMjsJLyogMTQgUmFpZCBzZXQgaWRlbnRpZmllciAjMwkJICAgICAgKi8KKwlfX3UzMiBzZXRfdXVpZDM7CS8qIDE1IFJhaWQgc2V0IGlkZW50aWZpZXIgIzQJCSAgICAgICovCisJX191MzIgZ3N0YXRlX2NyZXNlcnZlZFtNRF9TQl9HRU5FUklDX0NPTlNUQU5UX1dPUkRTIC0gMTZdOworCisJLyoKKwkgKiBHZW5lcmljIHN0YXRlIGluZm9ybWF0aW9uCisJICovCisJX191MzIgdXRpbWU7CQkvKiAgMCBTdXBlcmJsb2NrIHVwZGF0ZSB0aW1lCQkgICAgICAqLworCV9fdTMyIHN0YXRlOwkJLyogIDEgU3RhdGUgYml0cyAoY2xlYW4sIC4uLikJCSAgICAgICovCisJX191MzIgYWN0aXZlX2Rpc2tzOwkvKiAgMiBOdW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBkaXNrcwkgICAgICAqLworCV9fdTMyIHdvcmtpbmdfZGlza3M7CS8qICAzIE51bWJlciBvZiB3b3JraW5nIGRpc2tzCQkgICAgICAqLworCV9fdTMyIGZhaWxlZF9kaXNrczsJLyogIDQgTnVtYmVyIG9mIGZhaWxlZCBkaXNrcwkJICAgICAgKi8KKwlfX3UzMiBzcGFyZV9kaXNrczsJLyogIDUgTnVtYmVyIG9mIHNwYXJlIGRpc2tzCQkgICAgICAqLworCV9fdTMyIHNiX2NzdW07CQkvKiAgNiBjaGVja3N1bSBvZiB0aGUgd2hvbGUgc3VwZXJibG9jayAgICAgICAgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlfX3UzMiBldmVudHNfaGk7CS8qICA3IGhpZ2gtb3JkZXIgb2Ygc3VwZXJibG9jayB1cGRhdGUgY291bnQgICAqLworCV9fdTMyIGV2ZW50c19sbzsJLyogIDggbG93LW9yZGVyIG9mIHN1cGVyYmxvY2sgdXBkYXRlIGNvdW50ICAgICovCisJX191MzIgY3BfZXZlbnRzX2hpOwkvKiAgOSBoaWdoLW9yZGVyIG9mIGNoZWNrcG9pbnQgdXBkYXRlIGNvdW50ICAgKi8KKwlfX3UzMiBjcF9ldmVudHNfbG87CS8qIDEwIGxvdy1vcmRlciBvZiBjaGVja3BvaW50IHVwZGF0ZSBjb3VudCAgICAqLworI2Vsc2UKKwlfX3UzMiBldmVudHNfbG87CS8qICA3IGxvdy1vcmRlciBvZiBzdXBlcmJsb2NrIHVwZGF0ZSBjb3VudCAgICAqLworCV9fdTMyIGV2ZW50c19oaTsJLyogIDggaGlnaC1vcmRlciBvZiBzdXBlcmJsb2NrIHVwZGF0ZSBjb3VudCAgICovCisJX191MzIgY3BfZXZlbnRzX2xvOwkvKiAgOSBsb3ctb3JkZXIgb2YgY2hlY2twb2ludCB1cGRhdGUgY291bnQgICAgKi8KKwlfX3UzMiBjcF9ldmVudHNfaGk7CS8qIDEwIGhpZ2gtb3JkZXIgb2YgY2hlY2twb2ludCB1cGRhdGUgY291bnQgICAqLworI2VuZGlmCisJX191MzIgcmVjb3ZlcnlfY3A7CS8qIDExIHJlY292ZXJ5IGNoZWNrcG9pbnQgc2VjdG9yIGNvdW50CSAgICAgICovCisJLyogVGhlcmUgYXJlIG9ubHkgdmFsaWQgZm9yIG1pbm9yX3ZlcnNpb24gPiA5MCAqLworCV9fdTY0IHJlc2hhcGVfcG9zaXRpb247CS8qIDEyLDEzIG5leHQgYWRkcmVzcyBpbiBhcnJheS1zcGFjZSBmb3IgcmVzaGFwZSAqLworCV9fdTMyIG5ld19sZXZlbDsJLyogMTQgbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JICAgICAgKi8KKwlfX3UzMiBkZWx0YV9kaXNrczsJLyogMTUgY2hhbmdlIGluIG51bWJlciBvZiByYWlkX2Rpc2tzCSAgICAgICovCisJX191MzIgbmV3X2xheW91dDsJLyogMTYgbmV3IGxheW91dAkJCSAgICAgICovCisJX191MzIgbmV3X2NodW5rOwkvKiAxNyBuZXcgY2h1bmsgc2l6ZSAoYnl0ZXMpCQkgICAgICAqLworCV9fdTMyIGdzdGF0ZV9zcmVzZXJ2ZWRbTURfU0JfR0VORVJJQ19TVEFURV9XT1JEUyAtIDE4XTsKKworCS8qCisJICogUGVyc29uYWxpdHkgaW5mb3JtYXRpb24KKwkgKi8KKwlfX3UzMiBsYXlvdXQ7CQkvKiAgMCB0aGUgYXJyYXkncyBwaHlzaWNhbCBsYXlvdXQJICAgICAgKi8KKwlfX3UzMiBjaHVua19zaXplOwkvKiAgMSBjaHVuayBzaXplIGluIGJ5dGVzCQkgICAgICAqLworCV9fdTMyIHJvb3RfcHY7CQkvKiAgMiBMViByb290IFBWICovCisJX191MzIgcm9vdF9ibG9jazsJLyogIDMgTFYgcm9vdCBibG9jayAqLworCV9fdTMyIHBzdGF0ZV9yZXNlcnZlZFtNRF9TQl9QRVJTT05BTElUWV9XT1JEUyAtIDRdOworCisJLyoKKwkgKiBEaXNrcyBpbmZvcm1hdGlvbgorCSAqLworCW1kcF9kaXNrX3QgZGlza3NbTURfU0JfRElTS1NdOworCisJLyoKKwkgKiBSZXNlcnZlZAorCSAqLworCV9fdTMyIHJlc2VydmVkW01EX1NCX1JFU0VSVkVEX1dPUkRTXTsKKworCS8qCisJICogQWN0aXZlIGRlc2NyaXB0b3IKKwkgKi8KKwltZHBfZGlza190IHRoaXNfZGlzazsKKworfSBtZHBfc3VwZXJfdDsKKworc3RhdGljIF9faW5saW5lX18gX191NjQgbWRfZXZlbnQobWRwX3N1cGVyX3QgKnNiKSB7CisJX191NjQgZXYgPSBzYi0+ZXZlbnRzX2hpOworCXJldHVybiAoZXY8PDMyKXwgc2ItPmV2ZW50c19sbzsKK30KKworLyoKKyAqIFRoZSB2ZXJzaW9uLTEgc3VwZXJibG9jayA6CisgKiBBbGwgbnVtZXJpYyBmaWVsZHMgYXJlIGxpdHRsZS1lbmRpYW4uCisgKgorICogdG90YWwgc2l6ZTogMjU2IGJ5dGVzIHBsdXMgMiBwZXIgZGV2aWNlLgorICogIDFLIGFsbG93cyAzODQgZGV2aWNlcy4KKyAqLworc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgeworCS8qIGNvbnN0YW50IGFycmF5IGluZm9ybWF0aW9uIC0gMTI4IGJ5dGVzICovCisJX19sZTMyCW1hZ2ljOwkJLyogTURfU0JfTUFHSUM6IDB4YTkyYjRlZmMgLSBsaXR0bGUgZW5kaWFuICovCisJX19sZTMyCW1ham9yX3ZlcnNpb247CS8qIDEgKi8KKwlfX2xlMzIJZmVhdHVyZV9tYXA7CS8qIGJpdCAwIHNldCBpZiAnYml0bWFwX29mZnNldCcgaXMgbWVhbmluZ2Z1bCAqLworCV9fbGUzMglwYWQwOwkJLyogYWx3YXlzIHNldCB0byAwIHdoZW4gd3JpdGluZyAqLworCisJX191OAlzZXRfdXVpZFsxNl07CS8qIHVzZXItc3BhY2UgZ2VuZXJhdGVkLiAqLworCWNoYXIJc2V0X25hbWVbMzJdOwkvKiBzZXQgYW5kIGludGVycHJldGVkIGJ5IHVzZXItc3BhY2UgKi8KKworCV9fbGU2NAljdGltZTsJCS8qIGxvIDQwIGJpdHMgYXJlIHNlY29uZHMsIHRvcCAyNCBhcmUgbWljcm9zZWNvbmRzIG9yIDAqLworCV9fbGUzMglsZXZlbDsJCS8qIC00IChtdWx0aXBhdGgpLCAtMSAobGluZWFyKSwgMCwxLDQsNSAqLworCV9fbGUzMglsYXlvdXQ7CQkvKiBvbmx5IGZvciByYWlkNSBhbmQgcmFpZDEwIGN1cnJlbnRseSAqLworCV9fbGU2NAlzaXplOwkJLyogdXNlZCBzaXplIG9mIGNvbXBvbmVudCBkZXZpY2VzLCBpbiA1MTJieXRlIHNlY3RvcnMgKi8KKworCV9fbGUzMgljaHVua3NpemU7CS8qIGluIDUxMmJ5dGUgc2VjdG9ycyAqLworCV9fbGUzMglyYWlkX2Rpc2tzOworCV9fbGUzMgliaXRtYXBfb2Zmc2V0OwkvKiBzZWN0b3JzIGFmdGVyIHN0YXJ0IG9mIHN1cGVyYmxvY2sgdGhhdCBiaXRtYXAgc3RhcnRzCisJCQkJICogTk9URTogc2lnbmVkLCBzbyBiaXRtYXAgY2FuIGJlIGJlZm9yZSBzdXBlcmJsb2NrCisJCQkJICogb25seSBtZWFuaW5nZnVsIG9mIGZlYXR1cmVfbWFwWzBdIGlzIHNldC4KKwkJCQkgKi8KKworCS8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIHdpdGggZmVhdHVyZSBiaXQgJzQnICovCisJX19sZTMyCW5ld19sZXZlbDsJLyogbmV3IGxldmVsIHdlIGFyZSByZXNoYXBpbmcgdG8JCSovCisJX19sZTY0CXJlc2hhcGVfcG9zaXRpb247CS8qIG5leHQgYWRkcmVzcyBpbiBhcnJheS1zcGFjZSBmb3IgcmVzaGFwZSAqLworCV9fbGUzMglkZWx0YV9kaXNrczsJLyogY2hhbmdlIGluIG51bWJlciBvZiByYWlkX2Rpc2tzCQkqLworCV9fbGUzMgluZXdfbGF5b3V0OwkvKiBuZXcgbGF5b3V0CQkJCQkqLworCV9fbGUzMgluZXdfY2h1bms7CS8qIG5ldyBjaHVuayBzaXplIChieXRlcykJCQkqLworCV9fdTgJcGFkMVsxMjgtMTI0XTsJLyogc2V0IHRvIDAgd2hlbiB3cml0dGVuICovCisKKwkvKiBjb25zdGFudCB0aGlzLWRldmljZSBpbmZvcm1hdGlvbiAtIDY0IGJ5dGVzICovCisJX19sZTY0CWRhdGFfb2Zmc2V0OwkvKiBzZWN0b3Igc3RhcnQgb2YgZGF0YSwgb2Z0ZW4gMCAqLworCV9fbGU2NAlkYXRhX3NpemU7CS8qIHNlY3RvcnMgaW4gdGhpcyBkZXZpY2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZGF0YSAqLworCV9fbGU2NAlzdXBlcl9vZmZzZXQ7CS8qIHNlY3RvciBzdGFydCBvZiB0aGlzIHN1cGVyYmxvY2sgKi8KKwlfX2xlNjQJcmVjb3Zlcnlfb2Zmc2V0Oy8qIHNlY3RvcnMgYmVmb3JlIHRoaXMgb2Zmc2V0IChmcm9tIGRhdGFfb2Zmc2V0KSBoYXZlIGJlZW4gcmVjb3ZlcmVkICovCisJX19sZTMyCWRldl9udW1iZXI7CS8qIHBlcm1hbmVudCBpZGVudGlmaWVyIG9mIHRoaXMgIGRldmljZSAtIG5vdCByb2xlIGluIHJhaWQgKi8KKwlfX2xlMzIJY250X2NvcnJlY3RlZF9yZWFkOyAvKiBudW1iZXIgb2YgcmVhZCBlcnJvcnMgdGhhdCB3ZXJlIGNvcnJlY3RlZCBieSByZS13cml0aW5nICovCisJX191OAlkZXZpY2VfdXVpZFsxNl07IC8qIHVzZXItc3BhY2Ugc2V0YWJsZSwgaWdub3JlZCBieSBrZXJuZWwgKi8KKwlfX3U4CWRldmZsYWdzOwkvKiBwZXItZGV2aWNlIGZsYWdzLiAgT25seSBvbmUgZGVmaW5lZC4uLiovCisjZGVmaW5lCVdyaXRlTW9zdGx5MQkxCS8qIG1hc2sgZm9yIHdyaXRlbW9zdGx5IGZsYWcgaW4gYWJvdmUgKi8KKwlfX3U4CXBhZDJbNjQtNTddOwkvKiBzZXQgdG8gMCB3aGVuIHdyaXRpbmcgKi8KKworCS8qIGFycmF5IHN0YXRlIGluZm9ybWF0aW9uIC0gNjQgYnl0ZXMgKi8KKwlfX2xlNjQJdXRpbWU7CQkvKiA0MCBiaXRzIHNlY29uZCwgMjQgYnRlcyBtaWNyb3NlY29uZHMgKi8KKwlfX2xlNjQJZXZlbnRzOwkJLyogaW5jcmVtZW50ZWQgd2hlbiBzdXBlcmJsb2NrIHVwZGF0ZWQgKi8KKwlfX2xlNjQJcmVzeW5jX29mZnNldDsJLyogZGF0YSBiZWZvcmUgdGhpcyBvZmZzZXQgKGZyb20gZGF0YV9vZmZzZXQpIGtub3duIHRvIGJlIGluIHN5bmMgKi8KKwlfX2xlMzIJc2JfY3N1bTsJLyogY2hlY2tzdW0gdXB0byBkZXZzW21heF9kZXZdICovCisJX19sZTMyCW1heF9kZXY7CS8qIHNpemUgb2YgZGV2c1tdIGFycmF5IHRvIGNvbnNpZGVyICovCisJX191OAlwYWQzWzY0LTMyXTsJLyogc2V0IHRvIDAgd2hlbiB3cml0aW5nICovCisKKwkvKiBkZXZpY2Ugc3RhdGUgaW5mb3JtYXRpb24uIEluZGV4ZWQgYnkgZGV2X251bWJlci4KKwkgKiAyIGJ5dGVzIHBlciBkZXZpY2UKKwkgKiBOb3RlIHRoZXJlIGFyZSBubyBwZXItZGV2aWNlIHN0YXRlIGZsYWdzLiBTdGF0ZSBpbmZvcm1hdGlvbiBpcyByb2xsZWQKKwkgKiBpbnRvIHRoZSAncm9sZXMnIHZhbHVlLiAgSWYgYSBkZXZpY2UgaXMgc3BhcmUgb3IgZmF1bHR5LCB0aGVuIGl0IGRvZXNuJ3QKKwkgKiBoYXZlIGEgbWVhbmluZ2Z1bCByb2xlLgorCSAqLworCV9fbGUxNglkZXZfcm9sZXNbMF07CS8qIHJvbGUgaW4gYXJyYXksIG9yIDB4ZmZmZiBmb3IgYSBzcGFyZSwgb3IgMHhmZmZlIGZvciBmYXVsdHkgKi8KK307CisKKy8qIGZlYXR1cmVfbWFwIGJpdHMgKi8KKyNkZWZpbmUgTURfRkVBVFVSRV9CSVRNQVBfT0ZGU0VUCTEKKyNkZWZpbmUJTURfRkVBVFVSRV9SRUNPVkVSWV9PRkZTRVQJMiAvKiByZWNvdmVyeV9vZmZzZXQgaXMgcHJlc2VudCBhbmQKKwkJCQkJICAgKiBtdXN0IGJlIGhvbm91cmVkCisJCQkJCSAgICovCisjZGVmaW5lCU1EX0ZFQVRVUkVfUkVTSEFQRV9BQ1RJVkUJNAorCisjZGVmaW5lCU1EX0ZFQVRVUkVfQUxMCQkJKDF8Mnw0KQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFpZC9tZF91LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTIwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfdS5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICAgbWRfdS5oIDogdXNlciA8PT4ga2VybmVsIEFQSSBiZXR3ZWVuIExpbnV4IHJhaWR0b29scyBhbmQgUkFJRCBkcml2ZXJzCisgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4IEluZ28gTW9sbmFyCisJICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAoZm9yIGV4YW1wbGUgL3Vzci9zcmMvbGludXgvQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgCisqLworCisjaWZuZGVmIF9NRF9VX0gKKyNkZWZpbmUgX01EX1VfSAorCisvKiBpb2N0bHMgKi8KKworLyogc3RhdHVzICovCisjZGVmaW5lIFJBSURfVkVSU0lPTgkJX0lPUiAoTURfTUFKT1IsIDB4MTAsIG1kdV92ZXJzaW9uX3QpCisjZGVmaW5lIEdFVF9BUlJBWV9JTkZPCQlfSU9SIChNRF9NQUpPUiwgMHgxMSwgbWR1X2FycmF5X2luZm9fdCkKKyNkZWZpbmUgR0VUX0RJU0tfSU5GTwkJX0lPUiAoTURfTUFKT1IsIDB4MTIsIG1kdV9kaXNrX2luZm9fdCkKKyNkZWZpbmUgUFJJTlRfUkFJRF9ERUJVRwlfSU8gKE1EX01BSk9SLCAweDEzKQorI2RlZmluZSBSQUlEX0FVVE9SVU4JCV9JTyAoTURfTUFKT1IsIDB4MTQpCisjZGVmaW5lIEdFVF9CSVRNQVBfRklMRQkJX0lPUiAoTURfTUFKT1IsIDB4MTUsIG1kdV9iaXRtYXBfZmlsZV90KQorCisvKiBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENMRUFSX0FSUkFZCQlfSU8gKE1EX01BSk9SLCAweDIwKQorI2RlZmluZSBBRERfTkVXX0RJU0sJCV9JT1cgKE1EX01BSk9SLCAweDIxLCBtZHVfZGlza19pbmZvX3QpCisjZGVmaW5lIEhPVF9SRU1PVkVfRElTSwkJX0lPIChNRF9NQUpPUiwgMHgyMikKKyNkZWZpbmUgU0VUX0FSUkFZX0lORk8JCV9JT1cgKE1EX01BSk9SLCAweDIzLCBtZHVfYXJyYXlfaW5mb190KQorI2RlZmluZSBTRVRfRElTS19JTkZPCQlfSU8gKE1EX01BSk9SLCAweDI0KQorI2RlZmluZSBXUklURV9SQUlEX0lORk8JCV9JTyAoTURfTUFKT1IsIDB4MjUpCisjZGVmaW5lIFVOUFJPVEVDVF9BUlJBWQkJX0lPIChNRF9NQUpPUiwgMHgyNikKKyNkZWZpbmUgUFJPVEVDVF9BUlJBWQkJX0lPIChNRF9NQUpPUiwgMHgyNykKKyNkZWZpbmUgSE9UX0FERF9ESVNLCQlfSU8gKE1EX01BSk9SLCAweDI4KQorI2RlZmluZSBTRVRfRElTS19GQVVMVFkJCV9JTyAoTURfTUFKT1IsIDB4MjkpCisjZGVmaW5lIEhPVF9HRU5FUkFURV9FUlJPUglfSU8gKE1EX01BSk9SLCAweDJhKQorI2RlZmluZSBTRVRfQklUTUFQX0ZJTEUJCV9JT1cgKE1EX01BSk9SLCAweDJiLCBpbnQpCisKKy8qIHVzYWdlICovCisjZGVmaW5lIFJVTl9BUlJBWQkJX0lPVyAoTURfTUFKT1IsIDB4MzAsIG1kdV9wYXJhbV90KQorLyogIDB4MzEgd2FzIFNUQVJUX0FSUkFZICAqLworI2RlZmluZSBTVE9QX0FSUkFZCQlfSU8gKE1EX01BSk9SLCAweDMyKQorI2RlZmluZSBTVE9QX0FSUkFZX1JPCQlfSU8gKE1EX01BSk9SLCAweDMzKQorI2RlZmluZSBSRVNUQVJUX0FSUkFZX1JXCV9JTyAoTURfTUFKT1IsIDB4MzQpCisKK3R5cGVkZWYgc3RydWN0IG1kdV92ZXJzaW9uX3MgeworCWludCBtYWpvcjsKKwlpbnQgbWlub3I7CisJaW50IHBhdGNobGV2ZWw7Cit9IG1kdV92ZXJzaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1kdV9hcnJheV9pbmZvX3MgeworCS8qCisJICogR2VuZXJpYyBjb25zdGFudCBpbmZvcm1hdGlvbgorCSAqLworCWludCBtYWpvcl92ZXJzaW9uOworCWludCBtaW5vcl92ZXJzaW9uOworCWludCBwYXRjaF92ZXJzaW9uOworCWludCBjdGltZTsKKwlpbnQgbGV2ZWw7CisJaW50IHNpemU7CisJaW50IG5yX2Rpc2tzOworCWludCByYWlkX2Rpc2tzOworCWludCBtZF9taW5vcjsKKwlpbnQgbm90X3BlcnNpc3RlbnQ7CisKKwkvKgorCSAqIEdlbmVyaWMgc3RhdGUgaW5mb3JtYXRpb24KKwkgKi8KKwlpbnQgdXRpbWU7CQkvKiAgMCBTdXBlcmJsb2NrIHVwZGF0ZSB0aW1lCQkgICAgICAqLworCWludCBzdGF0ZTsJCS8qICAxIFN0YXRlIGJpdHMgKGNsZWFuLCAuLi4pCQkgICAgICAqLworCWludCBhY3RpdmVfZGlza3M7CS8qICAyIE51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIGRpc2tzCSAgICAgICovCisJaW50IHdvcmtpbmdfZGlza3M7CS8qICAzIE51bWJlciBvZiB3b3JraW5nIGRpc2tzCQkgICAgICAqLworCWludCBmYWlsZWRfZGlza3M7CS8qICA0IE51bWJlciBvZiBmYWlsZWQgZGlza3MJCSAgICAgICovCisJaW50IHNwYXJlX2Rpc2tzOwkvKiAgNSBOdW1iZXIgb2Ygc3BhcmUgZGlza3MJCSAgICAgICovCisKKwkvKgorCSAqIFBlcnNvbmFsaXR5IGluZm9ybWF0aW9uCisJICovCisJaW50IGxheW91dDsJCS8qICAwIHRoZSBhcnJheSdzIHBoeXNpY2FsIGxheW91dAkgICAgICAqLworCWludCBjaHVua19zaXplOwkvKiAgMSBjaHVuayBzaXplIGluIGJ5dGVzCQkgICAgICAqLworCit9IG1kdV9hcnJheV9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1kdV9kaXNrX2luZm9fcyB7CisJLyoKKwkgKiBjb25maWd1cmF0aW9uL3N0YXR1cyBvZiBvbmUgcGFydGljdWxhciBkaXNrCisJICovCisJaW50IG51bWJlcjsKKwlpbnQgbWFqb3I7CisJaW50IG1pbm9yOworCWludCByYWlkX2Rpc2s7CisJaW50IHN0YXRlOworCit9IG1kdV9kaXNrX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWR1X3N0YXJ0X2luZm9fcyB7CisJLyoKKwkgKiBjb25maWd1cmF0aW9uL3N0YXR1cyBvZiBvbmUgcGFydGljdWxhciBkaXNrCisJICovCisJaW50IG1ham9yOworCWludCBtaW5vcjsKKwlpbnQgcmFpZF9kaXNrOworCWludCBzdGF0ZTsKKworfSBtZHVfc3RhcnRfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCBtZHVfYml0bWFwX2ZpbGVfcworeworCWNoYXIgcGF0aG5hbWVbNDA5Nl07Cit9IG1kdV9iaXRtYXBfZmlsZV90OworCit0eXBlZGVmIHN0cnVjdCBtZHVfcGFyYW1fcworeworCWludAkJCXBlcnNvbmFsaXR5OwkvKiAxLDIsMyw0ICovCisJaW50CQkJY2h1bmtfc2l6ZTsJLyogaW4gYnl0ZXMgKi8KKwlpbnQJCQltYXhfZmF1bHQ7CS8qIHVudXNlZCBmb3Igbm93ICovCit9IG1kdV9wYXJhbV90OworCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmFuZG9tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjYxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3JhbmRvbS5oCisgKgorICogSW5jbHVkZSBmaWxlIGZvciB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgKi8KKworI2lmbmRlZiBfTElOVVhfUkFORE9NX0gKKyNkZWZpbmUgX0xJTlVYX1JBTkRPTV9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiBpb2N0bCgpJ3MgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqLworCisvKiBHZXQgdGhlIGVudHJvcHkgY291bnQuICovCisjZGVmaW5lIFJOREdFVEVOVENOVAlfSU9SKCAnUicsIDB4MDAsIGludCApCisKKy8qIEFkZCB0byAob3Igc3VidHJhY3QgZnJvbSkgdGhlIGVudHJvcHkgY291bnQuICAoU3VwZXJ1c2VyIG9ubHkuKSAqLworI2RlZmluZSBSTkRBRERUT0VOVENOVAlfSU9XKCAnUicsIDB4MDEsIGludCApCisKKy8qIEdldCB0aGUgY29udGVudHMgb2YgdGhlIGVudHJvcHkgcG9vbC4gIChTdXBlcnVzZXIgb25seS4pICovCisjZGVmaW5lIFJOREdFVFBPT0wJX0lPUiggJ1InLCAweDAyLCBpbnQgWzJdICkKKworLyogCisgKiBXcml0ZSBieXRlcyBpbnRvIHRoZSBlbnRyb3B5IHBvb2wgYW5kIGFkZCB0byB0aGUgZW50cm9weSBjb3VudC4KKyAqIChTdXBlcnVzZXIgb25seS4pCisgKi8KKyNkZWZpbmUgUk5EQURERU5UUk9QWQlfSU9XKCAnUicsIDB4MDMsIGludCBbMl0gKQorCisvKiBDbGVhciBlbnRyb3B5IGNvdW50IHRvIDAuICAoU3VwZXJ1c2VyIG9ubHkuKSAqLworI2RlZmluZSBSTkRaQVBFTlRDTlQJX0lPKCAnUicsIDB4MDQgKQorCisvKiBDbGVhciB0aGUgZW50cm9weSBwb29sIGFuZCBhc3NvY2lhdGVkIGNvdW50ZXJzLiAgKFN1cGVydXNlciBvbmx5LikgKi8KKyNkZWZpbmUgUk5EQ0xFQVJQT09MCV9JTyggJ1InLCAweDA2ICkKKworc3RydWN0IHJhbmRfcG9vbF9pbmZvIHsKKwlpbnQJZW50cm9weV9jb3VudDsKKwlpbnQJYnVmX3NpemU7CisJX191MzIJYnVmWzBdOworfTsKKworLyogRXhwb3J0ZWQgZnVuY3Rpb25zICovCisKKworI2VuZGlmIC8qIF9MSU5VWF9SQU5ET01fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yYXcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkNTQzZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmF3LmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBfX0xJTlVYX1JBV19ICisjZGVmaW5lIF9fTElOVVhfUkFXX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgUkFXX1NFVEJJTkQJX0lPKCAweGFjLCAwICkKKyNkZWZpbmUgUkFXX0dFVEJJTkQJX0lPKCAweGFjLCAxICkKKworc3RydWN0IHJhd19jb25maWdfcmVxdWVzdCAKK3sKKwlpbnQJcmF3X21pbm9yOworCV9fdTY0CWJsb2NrX21ham9yOworCV9fdTY0CWJsb2NrX21pbm9yOworfTsKKworI2RlZmluZSBNQVhfUkFXX01JTk9SUyBDT05GSUdfTUFYX1JBV19ERVZTCisKKyNlbmRpZiAvKiBfX0xJTlVYX1JBV19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTMzNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWJvb3QuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9MSU5VWF9SRUJPT1RfSAorI2RlZmluZSBfTElOVVhfUkVCT09UX0gKKworLyoKKyAqIE1hZ2ljIHZhbHVlcyByZXF1aXJlZCB0byB1c2UgX3JlYm9vdCgpIHN5c3RlbSBjYWxsLgorICovCisKKyNkZWZpbmUJTElOVVhfUkVCT09UX01BR0lDMQkweGZlZTFkZWFkCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzIJNjcyMjc0NzkzCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzJBCTg1MDcyMjc4CisjZGVmaW5lCUxJTlVYX1JFQk9PVF9NQUdJQzJCCTM2OTM2NzQ0OAorI2RlZmluZQlMSU5VWF9SRUJPT1RfTUFHSUMyQwk1Mzc5OTMyMTYKKworCisvKgorICogQ29tbWFuZHMgYWNjZXB0ZWQgYnkgdGhlIF9yZWJvb3QoKSBzeXN0ZW0gY2FsbC4KKyAqCisgKiBSRVNUQVJUICAgICBSZXN0YXJ0IHN5c3RlbSB1c2luZyBkZWZhdWx0IGNvbW1hbmQgYW5kIG1vZGUuCisgKiBIQUxUICAgICAgICBTdG9wIE9TIGFuZCBnaXZlIHN5c3RlbSBjb250cm9sIHRvIFJPTSBtb25pdG9yLCBpZiBhbnkuCisgKiBDQURfT04gICAgICBDdHJsLUFsdC1EZWwgc2VxdWVuY2UgY2F1c2VzIFJFU1RBUlQgY29tbWFuZC4KKyAqIENBRF9PRkYgICAgIEN0cmwtQWx0LURlbCBzZXF1ZW5jZSBzZW5kcyBTSUdJTlQgdG8gaW5pdCB0YXNrLgorICogUE9XRVJfT0ZGICAgU3RvcCBPUyBhbmQgcmVtb3ZlIGFsbCBwb3dlciBmcm9tIHN5c3RlbSwgaWYgcG9zc2libGUuCisgKiBSRVNUQVJUMiAgICBSZXN0YXJ0IHN5c3RlbSB1c2luZyBnaXZlbiBjb21tYW5kIHN0cmluZy4KKyAqIFNXX1NVU1BFTkQgIFN1c3BlbmQgc3lzdGVtIHVzaW5nIHNvZnR3YXJlIHN1c3BlbmQgaWYgY29tcGlsZWQgaW4uCisgKiBLRVhFQyAgICAgICBSZXN0YXJ0IHN5c3RlbSB1c2luZyBhIHByZXZpb3VzbHkgbG9hZGVkIExpbnV4IGtlcm5lbAorICovCisKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUCTB4MDEyMzQ1NjcKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9IQUxUCQkweENERUYwMTIzCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfQ0FEX09OCQkweDg5QUJDREVGCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfQ0FEX09GRgkweDAwMDAwMDAwCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfUE9XRVJfT0ZGCTB4NDMyMUZFREMKKyNkZWZpbmUJTElOVVhfUkVCT09UX0NNRF9SRVNUQVJUMgkweEExQjJDM0Q0CisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfU1dfU1VTUEVORAkweEQwMDBGQ0UyCisjZGVmaW5lCUxJTlVYX1JFQk9PVF9DTURfS0VYRUMJCTB4NDU1ODQ1NDMKKworCisKKyNlbmRpZiAvKiBfTElOVVhfUkVCT09UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc4NWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC0wLDAgKzEsMjE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEhhbnMgUmVpc2VyLCBzZWUgcmVpc2VyZnMvUkVBRE1FIGZvciBsaWNlbnNpbmcgYW5kIGNvcHlyaWdodCBkZXRhaWxzCisgKi8KKworCQkJCS8qIHRoaXMgZmlsZSBoYXMgYW4gYW1hemluZ2x5IHN0dXBpZAorCQkJCSAgIG5hbWUsIHl1cmEgcGxlYXNlIGZpeCBpdCB0byBiZQorCQkJCSAgIHJlaXNlcmZzLmgsIGFuZCBtZXJnZSBhbGwgdGhlIHJlc3QKKwkJCQkgICBvZiBvdXIgLmggZmlsZXMgdGhhdCBhcmUgaW4gdGhpcworCQkJCSAgIGRpcmVjdG9yeSBpbnRvIGl0LiAgKi8KKworI2lmbmRlZiBfTElOVVhfUkVJU0VSX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1JFSVNFUl9GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKworc3RydWN0IGZpZDsKKworLyoKKyAqICBpbmNsdWRlL2xpbnV4L3JlaXNlcl9mcy5oCisgKgorICogIFJlaXNlciBGaWxlIFN5c3RlbSBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMKKyAqCisgKi8KKworLyogaW4gcmVhZGluZyB0aGUgI2RlZmluZXMsIGl0IG1heSBoZWxwIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGV5IGVtcGxveQorICAgdGhlIGZvbGxvd2luZyBhYmJyZXZpYXRpb25zOgorCisgICBCID0gQnVmZmVyCisgICBJID0gSXRlbSBoZWFkZXIKKyAgIEggPSBIZWlnaHQgd2l0aGluIHRoZSB0cmVlIChzaG91bGQgYmUgY2hhbmdlZCB0byBMRVYpCisgICBOID0gTnVtYmVyIG9mIHRoZSBpdGVtIGluIHRoZSBub2RlCisgICBTVEFUID0gc3RhdCBkYXRhCisgICBERUggPSBEaXJlY3RvcnkgRW50cnkgSGVhZGVyCisgICBFQyA9IEVudHJ5IENvdW50CisgICBFID0gRW50cnkgbnVtYmVyCisgICBVTCA9IFVuc2lnbmVkIExvbmcKKyAgIEJMS0ggPSBCTG9jSyBIZWFkZXIKKyAgIFVORk0gPSBVTkZvck1hdHRlZCBub2RlCisgICBEQyA9IERpc2sgQ2hpbGQKKyAgIFAgPSBQYXRoCisKKyAgIFRoZXNlICNkZWZpbmVzIGFyZSBuYW1lZCBieSBjb25jYXRlbmF0aW5nIHRoZXNlIGFiYnJldmlhdGlvbnMsCisgICB3aGVyZSBmaXJzdCBjb21lcyB0aGUgYXJndW1lbnRzLCBhbmQgbGFzdCBjb21lcyB0aGUgcmV0dXJuIHZhbHVlLAorICAgb2YgdGhlIG1hY3JvLgorCisqLworCisjZGVmaW5lIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIKKworI2RlZmluZSBSRUlTRVJGU19QUkVBTExPQ0FURQorI2RlZmluZSBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisjZGVmaW5lIFBSRUFMTE9DQVRJT05fU0laRSA5CisKKy8qIG4gbXVzdCBiZSBwb3dlciBvZiAyICovCisjZGVmaW5lIF9ST1VORF9VUCh4LG4pICgoKHgpKyhuKS0xdSkgJiB+KChuKS0xdSkpCisKKy8vIHRvIGJlIG9rIGZvciBhbHBoYSBhbmQgb3RoZXJzIHdlIGhhdmUgdG8gYWxpZ24gc3RydWN0dXJlcyB0byA4IGJ5dGUKKy8vIGJvdW5kYXJ5LgorLy8gRklYTUU6IGRvIG5vdCBjaGFuZ2UgNCBieSBhbnl0aGluZyBlbHNlOiB0aGVyZSBpcyBjb2RlIHdoaWNoIHJlbGllcyBvbiB0aGF0CisjZGVmaW5lIFJPVU5EX1VQKHgpIF9ST1VORF9VUCh4LDhMTCkKKworLyogZGVidWcgbGV2ZWxzLiAgUmlnaHQgbm93LCBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgbWVhbnMgcHJpbnQgYWxsIGRlYnVnCisqKiBtZXNzYWdlcy4KKyovCisjZGVmaW5lIFJFSVNFUkZTX0RFQlVHX0NPREUgNQkvKiBleHRyYSBtZXNzYWdlcyB0byBoZWxwIGZpbmQvZGVidWcgZXJyb3JzICovCisKK3ZvaWQgcmVpc2VyZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKy8qIGFzc2VydGlvbnMgaGFuZGxpbmcgKi8KKworLyoqIGFsd2F5cyBjaGVjayBhIGNvbmRpdGlvbiBhbmQgcGFuaWMgaWYgaXQncyBmYWxzZS4gKi8KKyNkZWZpbmUgX19SQVNTRVJUKCBjb25kLCBzY29uZCwgZm9ybWF0LCBhcmdzLi4uICkJCQkJCVwKK2lmKCAhKCBjb25kICkgKSAJCQkJCQkJCVwKKyAgcmVpc2VyZnNfcGFuaWMoIE5VTEwsICJyZWlzZXJmc1slaV06IGFzc2VydGlvbiAiIHNjb25kICIgZmFpbGVkIGF0ICIJXAorCQkgIF9fRklMRV9fICI6JWk6JXM6ICIgZm9ybWF0ICJcbiIsCQlcCisJCSAgaW5faW50ZXJydXB0KCkgPyAtMSA6IHRhc2tfcGlkX25yKGN1cnJlbnQpLCBfX0xJTkVfXyAsIF9fRlVOQ1RJT05fXyAsICMjYXJncyApCisKKyNkZWZpbmUgUkFTU0VSVChjb25kLCBmb3JtYXQsIGFyZ3MuLi4pIF9fUkFTU0VSVChjb25kLCAjY29uZCwgZm9ybWF0LCAjI2FyZ3MpCisKKyNpZiBkZWZpbmVkKCBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKQorI2RlZmluZSBSRkFMU0UoY29uZCwgZm9ybWF0LCBhcmdzLi4uKSBfX1JBU1NFUlQoIShjb25kKSwgIiEoIiAjY29uZCAiKSIsIGZvcm1hdCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUkZBTFNFKCBjb25kLCBmb3JtYXQsIGFyZ3MuLi4gKSBkbyB7O30gd2hpbGUoIDAgKQorI2VuZGlmCisKKyNkZWZpbmUgQ09OU1RGCisvKgorICogRGlzayBEYXRhIFN0cnVjdHVyZXMKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUEVSIEJMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2Ygc3VwZXIgYmxvY2sgb24gZGlzaywgYSB2ZXJzaW9uIG9mIHdoaWNoIGluIFJBTSBpcyBvZnRlbiBhY2Nlc3NlZCBhcyBSRUlTRVJGU19TQihzKS0+c19ycworICogdGhlIHZlcnNpb24gaW4gUkFNIGlzIHBhcnQgb2YgYSBsYXJnZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgZmllbGRzIG5ldmVyIHdyaXR0ZW4gdG8gZGlzay4KKyAqLworI2RlZmluZSBVTlNFVF9IQVNIIDAJCS8vIHJlYWRfc3VwZXIgd2lsbCBndWVzcyBhYm91dCwgd2hhdCBoYXNoIG5hbWVzCisJCSAgICAgLy8gaW4gZGlyZWN0b3JpZXMgd2VyZSBzb3J0ZWQgd2l0aAorI2RlZmluZSBURUFfSEFTSCAgMQorI2RlZmluZSBZVVJBX0hBU0ggMgorI2RlZmluZSBSNV9IQVNIICAgMworI2RlZmluZSBERUZBVUxUX0hBU0ggUjVfSEFTSAorCitzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgeworCV9fbGUzMiBqcF9qb3VybmFsXzFzdF9ibG9jazsJLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzCisJCQkJCSAqIGRldmljZSAqLworCV9fbGUzMiBqcF9qb3VybmFsX2RldjsJLyogam91cm5hbCBkZXZpY2Ugc3RfcmRldiAqLworCV9fbGUzMiBqcF9qb3VybmFsX3NpemU7CS8qIHNpemUgb2YgdGhlIGpvdXJuYWwgKi8KKwlfX2xlMzIganBfam91cm5hbF90cmFuc19tYXg7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWFnaWM7CS8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICh0aGlzCisJCQkJCSAqIHdhcyBzYl9qb3VybmFsX2Jsb2NrX2NvdW50KSAqLworCV9fbGUzMiBqcF9qb3VybmFsX21heF9iYXRjaDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhCisJCQkJCSAqIHRyYW5zICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U7CS8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jCisJCQkJCQkgKiBjb21taXQgYmUgKi8KKwlfX2xlMzIganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uCisJCQkJCQkgKiBiZSAqLworfTsKKworLyogdGhpcyBpcyB0aGUgc3VwZXIgZnJvbSAzLjUuWCwgd2hlcmUgWCA+PSAxMCAqLworc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxIHsKKwlfX2xlMzIgc19ibG9ja19jb3VudDsJLyogYmxvY2tzIGNvdW50ICAgICAgICAgKi8KKwlfX2xlMzIgc19mcmVlX2Jsb2NrczsJLyogZnJlZSBibG9ja3MgY291bnQgICAgKi8KKwlfX2xlMzIgc19yb290X2Jsb2NrOwkvKiByb290IGJsb2NrIG51bWJlciAgICAqLworCXN0cnVjdCBqb3VybmFsX3BhcmFtcyBzX2pvdXJuYWw7CisJX19sZTE2IHNfYmxvY2tzaXplOwkvKiBibG9jayBzaXplICovCisJX19sZTE2IHNfb2lkX21heHNpemU7CS8qIG1heCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSwgc2VlCisJCQkJICogZ2V0X29iamVjdGlkKCkgY29tbWVudGFyeSAgKi8KKwlfX2xlMTYgc19vaWRfY3Vyc2l6ZTsJLyogY3VycmVudCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSAqLworCV9fbGUxNiBzX3Vtb3VudF9zdGF0ZTsJLyogdGhpcyBpcyBzZXQgdG8gMSB3aGVuIGZpbGVzeXN0ZW0gd2FzCisJCQkJICogdW1vdW50ZWQsIHRvIDIgLSB3aGVuIG5vdCAqLworCWNoYXIgc19tYWdpY1sxMF07CS8qIHJlaXNlcmZzIG1hZ2ljIHN0cmluZyBpbmRpY2F0ZXMgdGhhdAorCQkJCSAqIGZpbGUgc3lzdGVtIGlzIHJlaXNlcmZzOgorCQkJCSAqICJSZUlzRXJGcyIgb3IgIlJlSXNFcjJGcyIgb3IgIlJlSXNFcjNGcyIgKi8KKwlfX2xlMTYgc19mc19zdGF0ZTsJLyogaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoCisJCQkJICogcGhhc2Ugb2YgcmVidWlsZGluZyBpcyBkb25lICovCisJX19sZTMyIHNfaGFzaF9mdW5jdGlvbl9jb2RlOwkvKiBpbmRpY2F0ZSwgd2hhdCBoYXNoIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZQorCQkJCQkgKiB0byBzb3J0IG5hbWVzIGluIGEgZGlyZWN0b3J5Ki8KKwlfX2xlMTYgc190cmVlX2hlaWdodDsJLyogaGVpZ2h0IG9mIGRpc2sgdHJlZSAqLworCV9fbGUxNiBzX2JtYXBfbnI7CS8qIGFtb3VudCBvZiBiaXRtYXAgYmxvY2tzIG5lZWRlZCB0byBhZGRyZXNzCisJCQkJICogZWFjaCBibG9jayBvZiBmaWxlIHN5c3RlbSAqLworCV9fbGUxNiBzX3ZlcnNpb247CS8qIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtCisJCQkJICogd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLworCV9fbGUxNiBzX3Jlc2VydmVkX2Zvcl9qb3VybmFsOwkvKiBzaXplIGluIGJsb2NrcyBvZiBqb3VybmFsIGFyZWEgb24gbWFpbgorCQkJCQkgKiBkZXZpY2UsIHdlIG5lZWQgdG8ga2VlcCBhZnRlcgorCQkJCQkgKiBtYWtpbmcgZnMgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFNCX1NJWkVfVjEgKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEpKQorCisvKiB0aGlzIGlzIHRoZSBvbiBkaXNrIHN1cGVyIGJsb2NrICovCitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSBzX3YxOworCV9fbGUzMiBzX2lub2RlX2dlbmVyYXRpb247CisJX19sZTMyIHNfZmxhZ3M7CQkvKiBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07CS8qIGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOwkvKiBmaWxlc3lzdGVtIHZvbHVtZSBsYWJlbCAqLworCWNoYXIgc191bnVzZWRbODhdOwkvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZAorCQkJCSAqIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkKKwkJCQkgKiBzbyBhbnkgYWRkaXRpb25zIG11c3QgYmUgdXBkYXRlZAorCQkJCSAqIHRoZXJlIGFzIHdlbGwuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgU0JfU0laRSAoc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jaykpCisKKyNkZWZpbmUgUkVJU0VSRlNfVkVSU0lPTl8xIDAKKyNkZWZpbmUgUkVJU0VSRlNfVkVSU0lPTl8yIDIKKworLy8gb24tZGlzayBzdXBlciBibG9jayBmaWVsZHMgY29udmVydGVkIHRvIGNwdSBmb3JtCisjZGVmaW5lIFNCX0RJU0tfU1VQRVJfQkxPQ0socykgKFJFSVNFUkZTX1NCKHMpLT5zX3JzKQorI2RlZmluZSBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpICgmKFNCX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdjEpKQorI2RlZmluZSBTQl9CTE9DS1NJWkUocykgXAorICAgICAgICBsZTMyX3RvX2NwdSAoKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfYmxvY2tzaXplKSkKKyNkZWZpbmUgU0JfQkxPQ0tfQ09VTlQocykgXAorICAgICAgICBsZTMyX3RvX2NwdSAoKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfYmxvY2tfY291bnQpKQorI2RlZmluZSBTQl9GUkVFX0JMT0NLUyhzKSBcCisgICAgICAgIGxlMzJfdG9fY3B1ICgoU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19mcmVlX2Jsb2NrcykpCisjZGVmaW5lIFNCX1JFSVNFUkZTX01BR0lDKHMpIFwKKyAgICAgICAgKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfbWFnaWMpCisjZGVmaW5lIFNCX1JPT1RfQkxPQ0socykgXAorICAgICAgICBsZTMyX3RvX2NwdSAoKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfcm9vdF9ibG9jaykpCisjZGVmaW5lIFNCX1RSRUVfSEVJR0hUKHMpIFwKKyAgICAgICAgbGUxNl90b19jcHUgKChTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX3RyZWVfaGVpZ2h0KSkKKyNkZWZpbmUgU0JfUkVJU0VSRlNfU1RBVEUocykgXAorICAgICAgICBsZTE2X3RvX2NwdSAoKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdW1vdW50X3N0YXRlKSkKKyNkZWZpbmUgU0JfVkVSU0lPTihzKSBsZTE2X3RvX2NwdSAoKFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdmVyc2lvbikpCisjZGVmaW5lIFNCX0JNQVBfTlIocykgbGUxNl90b19jcHUgKChTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2JtYXBfbnIpKQorCisjZGVmaW5lIFBVVF9TQl9CTE9DS19DT1VOVChzLCB2YWwpIFwKKyAgIGRvIHsgU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19ibG9ja19jb3VudCA9IGNwdV90b19sZTMyKHZhbCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFBVVF9TQl9GUkVFX0JMT0NLUyhzLCB2YWwpIFwKKyAgIGRvIHsgU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19mcmVlX2Jsb2NrcyA9IGNwdV90b19sZTMyKHZhbCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFBVVF9TQl9ST09UX0JMT0NLKHMsIHZhbCkgXAorICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX3Jvb3RfYmxvY2sgPSBjcHVfdG9fbGUzMih2YWwpOyB9IHdoaWxlICgwKQorI2RlZmluZSBQVVRfU0JfVFJFRV9IRUlHSFQocywgdmFsKSBcCisgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdHJlZV9oZWlnaHQgPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQorI2RlZmluZSBQVVRfU0JfUkVJU0VSRlNfU1RBVEUocywgdmFsKSBcCisgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdW1vdW50X3N0YXRlID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUFVUX1NCX1ZFUlNJT04ocywgdmFsKSBcCisgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdmVyc2lvbiA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFBVVF9TQl9CTUFQX05SKHMsIHZhbCkgXAorICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2JtYXBfbnIgPSBjcHVfdG9fbGUxNiAodmFsKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBTQl9PTkRJU0tfSlAocykgKCZTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2pvdXJuYWwpCisjZGVmaW5lIFNCX09ORElTS19KT1VSTkFMX1NJWkUocykgXAorICAgICAgICAgbGUzMl90b19jcHUgKChTQl9PTkRJU0tfSlAocyktPmpwX2pvdXJuYWxfc2l6ZSkpCisjZGVmaW5lIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhzKSBcCisgICAgICAgICBsZTMyX3RvX2NwdSAoKFNCX09ORElTS19KUChzKS0+anBfam91cm5hbF8xc3RfYmxvY2spKQorI2RlZmluZSBTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0UocykgXAorICAgICAgICAgbGUzMl90b19jcHUgKChTQl9PTkRJU0tfSlAocyktPmpwX2pvdXJuYWxfZGV2KSkKKyNkZWZpbmUgU0JfT05ESVNLX1JFU0VSVkVEX0ZPUl9KT1VSTkFMKHMpIFwKKyAgICAgICAgIGxlMTZfdG9fY3B1ICgoU0JfVjFfRElTS19TVVBFUl9CTE9DSyhzKS0+c19yZXNlcnZlZF9mb3Jfam91cm5hbCkpCisKKyNkZWZpbmUgaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEocywgYmxvY2spIFwKKyAgICAgICAgIGJsb2NrID49IFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHMpIFwKKyAgICAgICAgICYmIGJsb2NrIDwgU0JfSk9VUk5BTF8xc3RfUkVTRVJWRURfQkxPQ0socykgKyAgXAorICAgICAgICAgKCghaXNfcmVpc2VyZnNfanIoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkgPyBcCisgICAgICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpICsgMSA6IFNCX09ORElTS19SRVNFUlZFRF9GT1JfSk9VUk5BTChzKSkpCisKK2ludCBpc19yZWlzZXJmc18zXzUoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyk7CitpbnQgaXNfcmVpc2VyZnNfM182KHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpOworaW50IGlzX3JlaXNlcmZzX2pyKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpOworCisvKiBSZWlzZXJGUyBsZWF2ZXMgdGhlIGZpcnN0IDY0ayB1bnVzZWQsIHNvIHRoYXQgcGFydGl0aW9uIGxhYmVscyBoYXZlCisgICBlbm91Z2ggc3BhY2UuICBJZiBzb21lb25lIHdhbnRzIHRvIHdyaXRlIGEgZmFuY3kgYm9vdGxvYWRlciB0aGF0CisgICBuZWVkcyBtb3JlIHRoYW4gNjRrLCBsZXQgdXMga25vdywgYW5kIHRoaXMgd2lsbCBiZSBpbmNyZWFzZWQgaW4gc2l6ZS4KKyAgIFRoaXMgbnVtYmVyIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhhbiB0aGUgbGFyZ2VzdCBibG9jayBzaXplIG9uIGFueQorICAgcGxhdGZvcm0sIG9yIGNvZGUgd2lsbCBicmVhay4gIC1IYW5zICovCisjZGVmaW5lIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICg2NCAqIDEwMjQpCisjZGVmaW5lIFJFSVNFUkZTX0ZJUlNUX0JMT0NLIHVudXNlZF9kZWZpbmUKKyNkZWZpbmUgUkVJU0VSRlNfSk9VUk5BTF9PRkZTRVRfSU5fQllURVMgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMKKworLyogdGhlIHNwb3QgZm9yIHRoZSBzdXBlciBpbiB2ZXJzaW9ucyAzLjUgLSAzLjUuMTAgKGluY2x1c2l2ZSkgKi8KKyNkZWZpbmUgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICg4ICogMTAyNCkKKworLy8gcmVpc2VyZnMgaW50ZXJuYWwgZXJyb3IgY29kZSAodXNlZCBieSBzZWFyY2hfYnlfa2V5IGFkbiBmaXhfbm9kZXMpKQorI2RlZmluZSBDQVJSWV9PTiAgICAgIDAKKyNkZWZpbmUgUkVQRUFUX1NFQVJDSCAtMQorI2RlZmluZSBJT19FUlJPUiAgICAgIC0yCisjZGVmaW5lIE5PX0RJU0tfU1BBQ0UgLTMKKyNkZWZpbmUgTk9fQkFMQU5DSU5HX05FRURFRCAgKC00KQorI2RlZmluZSBOT19NT1JFX1VOVVNFRF9DT05USUdVT1VTX0JMT0NLUyAoLTUpCisjZGVmaW5lIFFVT1RBX0VYQ0VFREVEIC02CisKK3R5cGVkZWYgX191MzIgYl9ibG9ja25yX3Q7Cit0eXBlZGVmIF9fbGUzMiB1bnBfdDsKKworc3RydWN0IHVuZm1fbm9kZWluZm8geworCXVucF90IHVuZm1fbm9kZW51bTsKKwl1bnNpZ25lZCBzaG9ydCB1bmZtX2ZyZWVzcGFjZTsKK307CisKKy8qIHRoZXJlIGFyZSB0d28gZm9ybWF0cyBvZiBrZXlzOiAzLjUgYW5kIDMuNgorICovCisjZGVmaW5lIEtFWV9GT1JNQVRfM181IDAKKyNkZWZpbmUgS0VZX0ZPUk1BVF8zXzYgMQorCisvKiB0aGVyZSBhcmUgdHdvIHN0YXQgZGF0YXMgKi8KKyNkZWZpbmUgU1RBVF9EQVRBX1YxIDAKKyNkZWZpbmUgU1RBVF9EQVRBX1YyIDEKKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKlJFSVNFUkZTX0koY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKlJFSVNFUkZTX1NCKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKKy8qIERvbid0IHRydXN0IFJFSVNFUkZTX1NCKHNiKS0+c19ibWFwX25yLCBpdCdzIGEgdTE2CisgKiB3aGljaCBvdmVyZmxvd3Mgb24gbGFyZ2UgZmlsZSBzeXN0ZW1zLiAqLworc3RhdGljIF9faW5saW5lX18gdTMyIHJlaXNlcmZzX2JtYXBfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gKFNCX0JMT0NLX0NPVU5UKHNiKSAtIDEpIC8gKHNiLT5zX2Jsb2Nrc2l6ZSAqIDgpICsgMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGJtYXBfd291bGRfd3JhcCh1bnNpZ25lZCBibWFwX25yKQoreworCXJldHVybiBibWFwX25yID4gKCgxTEwgPDwgMTYpIC0gMSk7Cit9CisKKy8qKiB0aGlzIHNheXMgYWJvdXQgdmVyc2lvbiBvZiBrZXkgb2YgYWxsIGl0ZW1zIChidXQgc3RhdCBkYXRhKSB0aGUKKyAgICBvYmplY3QgY29uc2lzdHMgb2YgKi8KKyNkZWZpbmUgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oIGlub2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfaXRlbV9rZXlfdmVyc2lvbl9tYXNrKSA/IEtFWV9GT1JNQVRfM182IDogS0VZX0ZPUk1BVF8zXzUpCisKKyNkZWZpbmUgc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oIGlub2RlLCB2ZXJzaW9uICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoeyBpZigodmVyc2lvbik9PUtFWV9GT1JNQVRfM182KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaXRlbV9rZXlfdmVyc2lvbl9tYXNrOyAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfaXRlbV9rZXlfdmVyc2lvbl9tYXNrOyB9KQorCisjZGVmaW5lIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3N0YXRfZGF0YV92ZXJzaW9uX21hc2spID8gU1RBVF9EQVRBX1YyIDogU1RBVF9EQVRBX1YxKQorCisjZGVmaW5lIHNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCB2ZXJzaW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHsgaWYoKHZlcnNpb24pPT1TVEFUX0RBVEFfVjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3N0YXRfZGF0YV92ZXJzaW9uX21hc2s7ICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3N0YXRfZGF0YV92ZXJzaW9uX21hc2s7IH0pCisKKy8qIFRoaXMgaXMgYW4gYWdncmVzc2l2ZSB0YWlsIHN1cHByZXNzaW9uIHBvbGljeSwgSSBhbSBob3BpbmcgaXQKKyAgIGltcHJvdmVzIG91ciBiZW5jaG1hcmtzLiBUaGUgcHJpbmNpcGxlIGJlaGluZCBpdCBpcyB0aGF0IHBlcmNlbnRhZ2UKKyAgIHNwYWNlIHNhdmluZyBpcyB3aGF0IG1hdHRlcnMsIG5vdCBhYnNvbHV0ZSBzcGFjZSBzYXZpbmcuICBUaGlzIGlzCisgICBub24taW50dWl0aXZlLCBidXQgaXQgaGVscHMgdG8gdW5kZXJzdGFuZCBpdCBpZiB5b3UgY29uc2lkZXIgdGhhdCB0aGUKKyAgIGNvc3QgdG8gYWNjZXNzIDQgYmxvY2tzIGlzIG5vdCBtdWNoIG1vcmUgdGhhbiB0aGUgY29zdCB0byBhY2Nlc3MgMQorICAgYmxvY2ssIGlmIHlvdSBoYXZlIHRvIGRvIGEgc2VlayBhbmQgcm90YXRlLiAgQSB0YWlsIHJpc2tzIGEKKyAgIG5vbi1saW5lYXIgZGlzayBhY2Nlc3MgdGhhdCBpcyBzaWduaWZpY2FudCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdG90YWwKKyAgIHRpbWUgY29zdCBmb3IgYSA0IGJsb2NrIGZpbGUgYW5kIHNhdmVzIGFuIGFtb3VudCBvZiBzcGFjZSB0aGF0IGlzCisgICBsZXNzIHNpZ25pZmljYW50IGFzIGEgcGVyY2VudGFnZSBvZiBzcGFjZSwgb3Igc28gZ29lcyB0aGUgaHlwb3RoZXNpcy4KKyAgIC1IYW5zICovCisjZGVmaW5lIFNUT1JFX1RBSUxfSU5fVU5GTV9TMShuX2ZpbGVfc2l6ZSxuX3RhaWxfc2l6ZSxuX2Jsb2NrX3NpemUpIFwKKyhcCisgICghKG5fdGFpbF9zaXplKSkgfHwgXAorICAoKChuX3RhaWxfc2l6ZSkgPiBNQVhfRElSRUNUX0lURU1fTEVOKG5fYmxvY2tfc2l6ZSkpIHx8IFwKKyAgICggKG5fZmlsZV9zaXplKSA+PSAobl9ibG9ja19zaXplKSAqIDQgKSB8fCBcCisgICAoICggKG5fZmlsZV9zaXplKSA+PSAobl9ibG9ja19zaXplKSAqIDMgKSAmJiBcCisgICAgICggKG5fdGFpbF9zaXplKSA+PSAgIChNQVhfRElSRUNUX0lURU1fTEVOKG5fYmxvY2tfc2l6ZSkpLzQpICkgfHwgXAorICAgKCAoIChuX2ZpbGVfc2l6ZSkgPj0gKG5fYmxvY2tfc2l6ZSkgKiAyICkgJiYgXAorICAgICAoIChuX3RhaWxfc2l6ZSkgPj0gICAoTUFYX0RJUkVDVF9JVEVNX0xFTihuX2Jsb2NrX3NpemUpKS8yKSApIHx8IFwKKyAgICggKCAobl9maWxlX3NpemUpID49IChuX2Jsb2NrX3NpemUpICkgJiYgXAorICAgICAoIChuX3RhaWxfc2l6ZSkgPj0gICAoTUFYX0RJUkVDVF9JVEVNX0xFTihuX2Jsb2NrX3NpemUpICogMykvNCkgKSApIFwKKykKKworLyogQW5vdGhlciBzdHJhdGVneSBmb3IgdGFpbHMsIHRoaXMgb25lIG1lYW5zIG9ubHkgY3JlYXRlIGEgdGFpbCBpZiBhbGwgdGhlCisgICBmaWxlIHdvdWxkIGZpdCBpbnRvIG9uZSBESVJFQ1QgaXRlbS4KKyAgIFByaW1hcnkgaW50ZW50aW9uIGZvciB0aGlzIG9uZSBpcyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBkZWNyZWFzaW5nCisgICBzZWVraW5nLgorKi8KKyNkZWZpbmUgU1RPUkVfVEFJTF9JTl9VTkZNX1MyKG5fZmlsZV9zaXplLG5fdGFpbF9zaXplLG5fYmxvY2tfc2l6ZSkgXAorKFwKKyAgKCEobl90YWlsX3NpemUpKSB8fCBcCisgICgoKG5fZmlsZV9zaXplKSA+IE1BWF9ESVJFQ1RfSVRFTV9MRU4obl9ibG9ja19zaXplKSkgKSBcCispCisKKy8qCisgKiB2YWx1ZXMgZm9yIHNfdW1vdW50X3N0YXRlIGZpZWxkCisgKi8KKyNkZWZpbmUgUkVJU0VSRlNfVkFMSURfRlMgICAgMQorI2RlZmluZSBSRUlTRVJGU19FUlJPUl9GUyAgICAyCisKKy8vCisvLyB0aGVyZSBhcmUgNSBpdGVtIHR5cGVzIGN1cnJlbnRseQorLy8KKyNkZWZpbmUgVFlQRV9TVEFUX0RBVEEgMAorI2RlZmluZSBUWVBFX0lORElSRUNUIDEKKyNkZWZpbmUgVFlQRV9ESVJFQ1QgMgorI2RlZmluZSBUWVBFX0RJUkVOVFJZIDMKKyNkZWZpbmUgVFlQRV9NQVhUWVBFIDMKKyNkZWZpbmUgVFlQRV9BTlkgMTUJCS8vIEZJWE1FOiBjb21tZW50IGlzIHJlcXVpcmVkCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgS0VZICYgSVRFTSBIRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8KKy8vIGRpcmVjdG9yaWVzIHVzZSB0aGlzIGtleSBhcyB3ZWxsIGFzIG9sZCBmaWxlcworLy8KK3N0cnVjdCBvZmZzZXRfdjEgeworCV9fbGUzMiBrX29mZnNldDsKKwlfX2xlMzIga191bmlxdWVuZXNzOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qgb2Zmc2V0X3YyIHsKKwlfX2xlNjQgdjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RhdGljIF9faW5saW5lX18gX191MTYgb2Zmc2V0X3YyX2tfdHlwZShjb25zdCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MikKK3sKKwlfX3U4IHR5cGUgPSBsZTY0X3RvX2NwdSh2Mi0+dikgPj4gNjA7CisJcmV0dXJuICh0eXBlIDw9IFRZUEVfTUFYVFlQRSkgPyB0eXBlIDogVFlQRV9BTlk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X29mZnNldF92Ml9rX3R5cGUoc3RydWN0IG9mZnNldF92MiAqdjIsIGludCB0eXBlKQoreworCXYyLT52ID0KKwkgICAgKHYyLT52ICYgY3B1X3RvX2xlNjQofjBVTEwgPj4gNCkpIHwgY3B1X3RvX2xlNjQoKF9fdTY0KSB0eXBlIDw8IDYwKTsKK30KKworc3RhdGljIF9faW5saW5lX18gbG9mZl90IG9mZnNldF92Ml9rX29mZnNldChjb25zdCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MikKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUodjItPnYpICYgKH4wVUxMID4+IDQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9vZmZzZXRfdjJfa19vZmZzZXQoc3RydWN0IG9mZnNldF92MiAqdjIsIGxvZmZfdCBvZmZzZXQpCit7CisJb2Zmc2V0ICY9ICh+MFVMTCA+PiA0KTsKKwl2Mi0+diA9ICh2Mi0+diAmIGNwdV90b19sZTY0KDE1VUxMIDw8IDYwKSkgfCBjcHVfdG9fbGU2NChvZmZzZXQpOworfQorCisvKiBLZXkgb2YgYW4gaXRlbSBkZXRlcm1pbmVzIGl0cyBsb2NhdGlvbiBpbiB0aGUgUyt0cmVlLCBhbmQKKyAgIGlzIGNvbXBvc2VkIG9mIDQgY29tcG9uZW50cyAqLworc3RydWN0IHJlaXNlcmZzX2tleSB7CisJX19sZTMyIGtfZGlyX2lkOwkvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudAorCQkJCSAgIGRpcmVjdG9yeSBvYmplY3QgaWQgKi8KKwlfX2xlMzIga19vYmplY3RpZDsJLyogb2JqZWN0IGlkZW50aWZpZXIgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBvZmZzZXRfdjEga19vZmZzZXRfdjE7CisJCXN0cnVjdCBvZmZzZXRfdjIga19vZmZzZXRfdjI7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBpbl9jb3JlX2tleSB7CisJX191MzIga19kaXJfaWQ7CQkvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudAorCQkJCSAgIGRpcmVjdG9yeSBvYmplY3QgaWQgKi8KKwlfX3UzMiBrX29iamVjdGlkOwkvKiBvYmplY3QgaWRlbnRpZmllciAqLworCV9fdTY0IGtfb2Zmc2V0OworCV9fdTgga190eXBlOworfTsKKworc3RydWN0IGNwdV9rZXkgeworCXN0cnVjdCBpbl9jb3JlX2tleSBvbl9kaXNrX2tleTsKKwlpbnQgdmVyc2lvbjsKKwlpbnQga2V5X2xlbmd0aDsJCS8qIDMgaW4gYWxsIGNhc2VzIGJ1dCBkaXJlY3QyaW5kaXJlY3QgYW5kCisJCQkJICAgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24gKi8KK307CisKKy8qIE91ciBmdW5jdGlvbiBmb3IgY29tcGFyaW5nIGtleXMgY2FuIGNvbXBhcmUga2V5cyBvZiBkaWZmZXJlbnQKKyAgIGxlbmd0aHMuICBJdCB0YWtlcyBhcyBhIHBhcmFtZXRlciB0aGUgbGVuZ3RoIG9mIHRoZSBrZXlzIGl0IGlzIHRvCisgICBjb21wYXJlLiAgVGhlc2UgZGVmaW5lcyBhcmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGF0IGlzIHRvIGJlIHBhc3NlZAorICAgdG8gaXQgYXMgdGhhdCBwYXJhbWV0ZXIuICovCisjZGVmaW5lIFJFSVNFUkZTX0ZVTExfS0VZX0xFTiAgICAgNAorI2RlZmluZSBSRUlTRVJGU19TSE9SVF9LRVlfTEVOICAgIDIKKworLyogVGhlIHJlc3VsdCBvZiB0aGUga2V5IGNvbXBhcmUgKi8KKyNkZWZpbmUgRklSU1RfR1JFQVRFUiAxCisjZGVmaW5lIFNFQ09ORF9HUkVBVEVSIC0xCisjZGVmaW5lIEtFWVNfSURFTlRJQ0FMIDAKKyNkZWZpbmUgS0VZX0ZPVU5EIDEKKyNkZWZpbmUgS0VZX05PVF9GT1VORCAwCisKKyNkZWZpbmUgS0VZX1NJWkUgKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfa2V5KSkKKyNkZWZpbmUgU0hPUlRfS0VZX1NJWkUgKHNpemVvZiAoX191MzIpICsgc2l6ZW9mIChfX3UzMikpCisKKy8qIHJldHVybiB2YWx1ZXMgZm9yIHNlYXJjaF9ieV9rZXkgYW5kIGNsb25lcyAqLworI2RlZmluZSBJVEVNX0ZPVU5EIDEKKyNkZWZpbmUgSVRFTV9OT1RfRk9VTkQgMAorI2RlZmluZSBFTlRSWV9GT1VORCAxCisjZGVmaW5lIEVOVFJZX05PVF9GT1VORCAwCisjZGVmaW5lIERJUkVDVE9SWV9OT1RfRk9VTkQgLTEKKyNkZWZpbmUgUkVHVUxBUl9GSUxFX0ZPVU5EIC0yCisjZGVmaW5lIERJUkVDVE9SWV9GT1VORCAtMworI2RlZmluZSBCWVRFX0ZPVU5EIDEKKyNkZWZpbmUgQllURV9OT1RfRk9VTkQgMAorI2RlZmluZSBGSUxFX05PVF9GT1VORCAtMQorCisjZGVmaW5lIFBPU0lUSU9OX0ZPVU5EIDEKKyNkZWZpbmUgUE9TSVRJT05fTk9UX0ZPVU5EIDAKKworLy8gcmV0dXJuIHZhbHVlcyBmb3IgcmVpc2VyZnNfZmluZF9lbnRyeSBhbmQgc2VhcmNoX2J5X2VudHJ5X2tleQorI2RlZmluZSBOQU1FX0ZPVU5EIDEKKyNkZWZpbmUgTkFNRV9OT1RfRk9VTkQgMAorI2RlZmluZSBHT1RPX1BSRVZJT1VTX0lURU0gMgorI2RlZmluZSBOQU1FX0ZPVU5EX0lOVklTSUJMRSAzCisKKy8qICBFdmVyeXRoaW5nIGluIHRoZSBmaWxlc3lzdGVtIGlzIHN0b3JlZCBhcyBhIHNldCBvZiBpdGVtcy4gIFRoZQorICAgIGl0ZW0gaGVhZCBjb250YWlucyB0aGUga2V5IG9mIHRoZSBpdGVtLCBpdHMgZnJlZSBzcGFjZSAoZm9yCisgICAgaW5kaXJlY3QgaXRlbXMpIGFuZCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpdGVtIGl0c2VsZgorICAgIHdpdGhpbiB0aGUgYmxvY2suICAqLworCitzdHJ1Y3QgaXRlbV9oZWFkIHsKKwkvKiBFdmVyeXRoaW5nIGluIHRoZSB0cmVlIGlzIGZvdW5kIGJ5IHNlYXJjaGluZyBmb3IgaXQgYmFzZWQgb24KKwkgKiBpdHMga2V5LiovCisJc3RydWN0IHJlaXNlcmZzX2tleSBpaF9rZXk7CisJdW5pb24geworCQkvKiBUaGUgZnJlZSBzcGFjZSBpbiB0aGUgbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIGFuCisJCSAgIGluZGlyZWN0IGl0ZW0gaWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBpdGVtLiAgVGhpcworCQkgICBlcXVhbHMgMHhGRkZGIGlmZiB0aGlzIGlzIGEgZGlyZWN0IGl0ZW0gb3Igc3RhdCBkYXRhCisJCSAgIGl0ZW0uIE5vdGUgdGhhdCB0aGUga2V5LCBub3QgdGhpcyBmaWVsZCwgaXMgdXNlZCB0bworCQkgICBkZXRlcm1pbmUgdGhlIGl0ZW0gdHlwZSwgYW5kIHRodXMgd2hpY2ggZmllbGQgdGhpcworCQkgICB1bmlvbiBjb250YWlucy4gKi8KKwkJX19sZTE2IGloX2ZyZWVfc3BhY2VfcmVzZXJ2ZWQ7CisJCS8qIElmZiB0aGlzIGlzIGEgZGlyZWN0b3J5IGl0ZW0sIHRoaXMgZmllbGQgZXF1YWxzIHRoZQorCQkgICBudW1iZXIgb2YgZGlyZWN0b3J5IGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtLiAqLworCQlfX2xlMTYgaWhfZW50cnlfY291bnQ7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHU7CisJX19sZTE2IGloX2l0ZW1fbGVuOwkvKiB0b3RhbCBzaXplIG9mIHRoZSBpdGVtIGJvZHkgKi8KKwlfX2xlMTYgaWhfaXRlbV9sb2NhdGlvbjsJLyogYW4gb2Zmc2V0IHRvIHRoZSBpdGVtIGJvZHkKKwkJCQkJICogd2l0aGluIHRoZSBibG9jayAqLworCV9fbGUxNiBpaF92ZXJzaW9uOwkvKiAwIGZvciBhbGwgb2xkIGl0ZW1zLCAyIGZvciBuZXcKKwkJCQkgICBvbmVzLiBIaWdoZXN0IGJpdCBpcyBzZXQgYnkgZnNjaworCQkJCSAgIHRlbXBvcmFyeSwgY2xlYW5lZCBhZnRlciBhbGwKKwkJCQkgICBkb25lICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisvKiBzaXplIG9mIGl0ZW0gaGVhZGVyICAgICAqLworI2RlZmluZSBJSF9TSVpFIChzaXplb2Yoc3RydWN0IGl0ZW1faGVhZCkpCisKKyNkZWZpbmUgaWhfZnJlZV9zcGFjZShpaCkgICAgICAgICAgICBsZTE2X3RvX2NwdSgoaWgpLT51LmloX2ZyZWVfc3BhY2VfcmVzZXJ2ZWQpCisjZGVmaW5lIGloX3ZlcnNpb24oaWgpICAgICAgICAgICAgICAgbGUxNl90b19jcHUoKGloKS0+aWhfdmVyc2lvbikKKyNkZWZpbmUgaWhfZW50cnlfY291bnQoaWgpICAgICAgICAgICBsZTE2X3RvX2NwdSgoaWgpLT51LmloX2VudHJ5X2NvdW50KQorI2RlZmluZSBpaF9sb2NhdGlvbihpaCkgICAgICAgICAgICAgIGxlMTZfdG9fY3B1KChpaCktPmloX2l0ZW1fbG9jYXRpb24pCisjZGVmaW5lIGloX2l0ZW1fbGVuKGloKSAgICAgICAgICAgICAgbGUxNl90b19jcHUoKGloKS0+aWhfaXRlbV9sZW4pCisKKyNkZWZpbmUgcHV0X2loX2ZyZWVfc3BhY2UoaWgsIHZhbCkgICBkbyB7IChpaCktPnUuaWhfZnJlZV9zcGFjZV9yZXNlcnZlZCA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcHV0X2loX3ZlcnNpb24oaWgsIHZhbCkgICAgICBkbyB7IChpaCktPmloX3ZlcnNpb24gPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQorI2RlZmluZSBwdXRfaWhfZW50cnlfY291bnQoaWgsIHZhbCkgIGRvIHsgKGloKS0+dS5paF9lbnRyeV9jb3VudCA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHB1dF9paF9sb2NhdGlvbihpaCwgdmFsKSAgICAgZG8geyAoaWgpLT5paF9pdGVtX2xvY2F0aW9uID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHV0X2loX2l0ZW1fbGVuKGloLCB2YWwpICAgICBkbyB7IChpaCktPmloX2l0ZW1fbGVuID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSB1bnJlYWNoYWJsZV9pdGVtKGloKSAoaWhfdmVyc2lvbihpaCkgJiAoMSA8PCAxNSkpCisKKyNkZWZpbmUgZ2V0X2loX2ZyZWVfc3BhY2UoaWgpIChpaF92ZXJzaW9uIChpaCkgPT0gS0VZX0ZPUk1BVF8zXzYgPyAwIDogaWhfZnJlZV9zcGFjZSAoaWgpKQorI2RlZmluZSBzZXRfaWhfZnJlZV9zcGFjZShpaCx2YWwpIHB1dF9paF9mcmVlX3NwYWNlKChpaCksICgoaWhfdmVyc2lvbihpaCkgPT0gS0VZX0ZPUk1BVF8zXzYpID8gMCA6ICh2YWwpKSkKKworLyogdGhlc2Ugb3BlcmF0ZSBvbiBpbmRpcmVjdCBpdGVtcywgd2hlcmUgeW91J3ZlIGdvdCBhbiBhcnJheSBvZiBpbnRzCisqKiBhdCBhIHBvc3NpYmx5IHVuYWxpZ25lZCBsb2NhdGlvbi4gIFRoZXNlIGFyZSBhIG5vb3Agb24gaWEzMgorKiogCisqKiBwIGlzIHRoZSBhcnJheSBvZiBfX3UzMiwgaSBpcyB0aGUgaW5kZXggaW50byB0aGUgYXJyYXksIHYgaXMgdGhlIHZhbHVlCisqKiB0byBzdG9yZSB0aGVyZS4KKyovCisjZGVmaW5lIGdldF9ibG9ja19udW0ocCwgaSkgbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgocCkgKyAoaSkpKQorI2RlZmluZSBwdXRfYmxvY2tfbnVtKHAsIGksIHYpIHB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIodiksIChwKSArIChpKSkKKworLy8KKy8vIGluIG9sZCB2ZXJzaW9uIHVuaXF1ZW5lc3MgZmllbGQgc2hvd3Mga2V5IHR5cGUKKy8vCisjZGVmaW5lIFYxX1NEX1VOSVFVRU5FU1MgMAorI2RlZmluZSBWMV9JTkRJUkVDVF9VTklRVUVORVNTIDB4ZmZmZmZmZmUKKyNkZWZpbmUgVjFfRElSRUNUX1VOSVFVRU5FU1MgMHhmZmZmZmZmZgorI2RlZmluZSBWMV9ESVJFTlRSWV9VTklRVUVORVNTIDUwMAorI2RlZmluZSBWMV9BTllfVU5JUVVFTkVTUyA1NTUJLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKKworLy8KKy8vIGhlcmUgYXJlIGNvbnZlcnNpb24gcm91dGluZXMKKy8vCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdW5pcXVlbmVzczJ0eXBlKF9fdTMyIHVuaXF1ZW5lc3MpIENPTlNURjsKK3N0YXRpYyBfX2lubGluZV9fIGludCB1bmlxdWVuZXNzMnR5cGUoX191MzIgdW5pcXVlbmVzcykKK3sKKwlzd2l0Y2ggKChpbnQpdW5pcXVlbmVzcykgeworCWNhc2UgVjFfU0RfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfU1RBVF9EQVRBOworCWNhc2UgVjFfSU5ESVJFQ1RfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfSU5ESVJFQ1Q7CisJY2FzZSBWMV9ESVJFQ1RfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfRElSRUNUOworCWNhc2UgVjFfRElSRU5UUllfVU5JUVVFTkVTUzoKKwkJcmV0dXJuIFRZUEVfRElSRU5UUlk7CisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAidnMtNTAwOiB1bmtub3duIHVuaXF1ZW5lc3MgJWQiLAorCQkJCSB1bmlxdWVuZXNzKTsKKwljYXNlIFYxX0FOWV9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9BTlk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiB0eXBlMnVuaXF1ZW5lc3MoaW50IHR5cGUpIENPTlNURjsKK3N0YXRpYyBfX2lubGluZV9fIF9fdTMyIHR5cGUydW5pcXVlbmVzcyhpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRZUEVfU1RBVF9EQVRBOgorCQlyZXR1cm4gVjFfU0RfVU5JUVVFTkVTUzsKKwljYXNlIFRZUEVfSU5ESVJFQ1Q6CisJCXJldHVybiBWMV9JTkRJUkVDVF9VTklRVUVORVNTOworCWNhc2UgVFlQRV9ESVJFQ1Q6CisJCXJldHVybiBWMV9ESVJFQ1RfVU5JUVVFTkVTUzsKKwljYXNlIFRZUEVfRElSRU5UUlk6CisJCXJldHVybiBWMV9ESVJFTlRSWV9VTklRVUVORVNTOworCWRlZmF1bHQ6CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgInZzLTUwMTogdW5rbm93biB0eXBlICVkIiwgdHlwZSk7CisJY2FzZSBUWVBFX0FOWToKKwkJcmV0dXJuIFYxX0FOWV9VTklRVUVORVNTOworCX0KK30KKworLy8KKy8vIGtleSBpcyBwb2ludGVyIHRvIG9uIGRpc2sga2V5IHdoaWNoIGlzIHN0b3JlZCBpbiBsZSwgcmVzdWx0IGlzIGNwdSwKKy8vIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdmVyc2lvbiBvZiBvYmplY3QgZnJvbSBrZXksIHNvLCBwcm92aWRlCisvLyB2ZXJzaW9uIHRvIHRoZXNlIGRlZmluZXMKKy8vCitzdGF0aWMgX19pbmxpbmVfXyBsb2ZmX3QgbGVfa2V5X2tfb2Zmc2V0KGludCB2ZXJzaW9uLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQoreworCXJldHVybiAodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPworCSAgICBsZTMyX3RvX2NwdShrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQpIDoKKwkgICAgb2Zmc2V0X3YyX2tfb2Zmc2V0KCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGxvZmZfdCBsZV9paF9rX29mZnNldChjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICppaCkKK3sKKwlyZXR1cm4gbGVfa2V5X2tfb2Zmc2V0KGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gbG9mZl90IGxlX2tleV9rX3R5cGUoaW50IHZlcnNpb24sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKK3sKKwlyZXR1cm4gKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8KKwkgICAgdW5pcXVlbmVzczJ0eXBlKGxlMzJfdG9fY3B1KGtleS0+dS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MpKSA6CisJICAgIG9mZnNldF92Ml9rX3R5cGUoJihrZXktPnUua19vZmZzZXRfdjIpKTsKK30KKworc3RhdGljIF9faW5saW5lX18gbG9mZl90IGxlX2loX2tfdHlwZShjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICppaCkKK3sKKwlyZXR1cm4gbGVfa2V5X2tfdHlwZShpaF92ZXJzaW9uKGloKSwgJihpaC0+aWhfa2V5KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X2xlX2tleV9rX29mZnNldChpbnQgdmVyc2lvbiwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0KQoreworCSh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/ICh2b2lkKShrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpKSA6CS8qIGpkbSBjaGVjayAqLworCSAgICAodm9pZCkoc2V0X29mZnNldF92Ml9rX29mZnNldCgmKGtleS0+dS5rX29mZnNldF92MiksIG9mZnNldCkpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9sZV9paF9rX29mZnNldChzdHJ1Y3QgaXRlbV9oZWFkICppaCwgbG9mZl90IG9mZnNldCkKK3sKKwlzZXRfbGVfa2V5X2tfb2Zmc2V0KGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpLCBvZmZzZXQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9sZV9rZXlfa190eXBlKGludCB2ZXJzaW9uLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXksCisJCQkJICAgICBpbnQgdHlwZSkKK3sKKwkodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPworCSAgICAodm9pZCkoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyA9CisJCSAgIGNwdV90b19sZTMyKHR5cGUydW5pcXVlbmVzcyh0eXBlKSkpCisJICAgIDogKHZvaWQpKHNldF9vZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgdHlwZSkpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfbGVfaWhfa190eXBlKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgdHlwZSkKK3sKKwlzZXRfbGVfa2V5X2tfdHlwZShpaF92ZXJzaW9uKGloKSwgJihpaC0+aWhfa2V5KSwgdHlwZSk7Cit9CisKKyNkZWZpbmUgaXNfZGlyZW50cnlfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorI2RlZmluZSBpc19kaXJlY3RfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVDVCkKKyNkZWZpbmUgaXNfaW5kaXJlY3RfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0lORElSRUNUKQorI2RlZmluZSBpc19zdGF0ZGF0YV9sZV9rZXkodmVyc2lvbixrZXkpIChsZV9rZXlfa190eXBlICh2ZXJzaW9uLCBrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCisvLworLy8gaXRlbSBoZWFkZXIgaGFzIHZlcnNpb24uCisvLworI2RlZmluZSBpc19kaXJlbnRyeV9sZV9paChpaCkgaXNfZGlyZW50cnlfbGVfa2V5IChpaF92ZXJzaW9uIChpaCksICYoKGloKS0+aWhfa2V5KSkKKyNkZWZpbmUgaXNfZGlyZWN0X2xlX2loKGloKSBpc19kaXJlY3RfbGVfa2V5IChpaF92ZXJzaW9uIChpaCksICYoKGloKS0+aWhfa2V5KSkKKyNkZWZpbmUgaXNfaW5kaXJlY3RfbGVfaWgoaWgpIGlzX2luZGlyZWN0X2xlX2tleSAoaWhfdmVyc2lvbihpaCksICYoKGloKS0+aWhfa2V5KSkKKyNkZWZpbmUgaXNfc3RhdGRhdGFfbGVfaWgoaWgpIGlzX3N0YXRkYXRhX2xlX2tleSAoaWhfdmVyc2lvbiAoaWgpLCAmKChpaCktPmloX2tleSkpCisKKy8vCisvLyBrZXkgaXMgcG9pbnRlciB0byBjcHUga2V5LCByZXN1bHQgaXMgY3B1CisvLworc3RhdGljIF9faW5saW5lX18gbG9mZl90IGNwdV9rZXlfa19vZmZzZXQoY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSkKK3sKKwlyZXR1cm4ga2V5LT5vbl9kaXNrX2tleS5rX29mZnNldDsKK30KKworc3RhdGljIF9faW5saW5lX18gbG9mZl90IGNwdV9rZXlfa190eXBlKGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXkpCit7CisJcmV0dXJuIGtleS0+b25fZGlza19rZXkua190eXBlOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9jcHVfa2V5X2tfb2Zmc2V0KHN0cnVjdCBjcHVfa2V5ICprZXksIGxvZmZfdCBvZmZzZXQpCit7CisJa2V5LT5vbl9kaXNrX2tleS5rX29mZnNldCA9IG9mZnNldDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfY3B1X2tleV9rX3R5cGUoc3RydWN0IGNwdV9rZXkgKmtleSwgaW50IHR5cGUpCit7CisJa2V5LT5vbl9kaXNrX2tleS5rX3R5cGUgPSB0eXBlOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNwdV9rZXlfa19vZmZzZXRfZGVjKHN0cnVjdCBjcHVfa2V5ICprZXkpCit7CisJa2V5LT5vbl9kaXNrX2tleS5rX29mZnNldC0tOworfQorCisjZGVmaW5lIGlzX2RpcmVudHJ5X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKyNkZWZpbmUgaXNfZGlyZWN0X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFQ1QpCisjZGVmaW5lIGlzX2luZGlyZWN0X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9JTkRJUkVDVCkKKyNkZWZpbmUgaXNfc3RhdGRhdGFfY3B1X2tleShrZXkpIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX1NUQVRfREFUQSkKKworLyogYXJlIHRoZXNlIHVzZWQgPyAqLworI2RlZmluZSBpc19kaXJlbnRyeV9jcHVfaWgoaWgpIChpc19kaXJlbnRyeV9jcHVfa2V5ICgmKChpaCktPmloX2tleSkpKQorI2RlZmluZSBpc19kaXJlY3RfY3B1X2loKGloKSAoaXNfZGlyZWN0X2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCisjZGVmaW5lIGlzX2luZGlyZWN0X2NwdV9paChpaCkgKGlzX2luZGlyZWN0X2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCisjZGVmaW5lIGlzX3N0YXRkYXRhX2NwdV9paChpaCkgKGlzX3N0YXRkYXRhX2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCisKKyNkZWZpbmUgSV9LX0tFWV9JTl9JVEVNKHBfc19paCwgcF9zX2tleSwgbl9ibG9ja3NpemUpIFwKKyAgICAoICEgQ09NUF9TSE9SVF9LRVlTKHBfc19paCwgcF9zX2tleSkgJiYgXAorICAgICAgICAgIElfT0ZGX0JZVEVfSU5fSVRFTShwX3NfaWgsIGtfb2Zmc2V0IChwX3Nfa2V5KSwgbl9ibG9ja3NpemUpICkKKworLyogbWF4aW1hbCBsZW5ndGggb2YgaXRlbSAqLworI2RlZmluZSBNQVhfSVRFTV9MRU4oYmxvY2tfc2l6ZSkgKGJsb2NrX3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFKQorI2RlZmluZSBNSU5fSVRFTV9MRU4gMQorCisvKiBvYmplY3QgaWRlbnRpZmllciBmb3Igcm9vdCBkaXIgKi8KKyNkZWZpbmUgUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRCAyCisjZGVmaW5lIFJFSVNFUkZTX1JPT1RfUEFSRU5UX09CSkVDVElEIDEKK2V4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfa2V5IHJvb3Rfa2V5OworCisvKiAKKyAqIFBpY3R1cmUgcmVwcmVzZW50cyBhIGxlYWYgb2YgdGhlIFMrdHJlZQorICogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogfCAgICAgIHwgIEFycmF5IG9mICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqIHxCbG9jayB8ICBPYmplY3QtSXRlbSAgfCAgICAgIEYgciBlIGUgICAgICB8ICBPYmplY3RzLSB8CisgKiB8IGhlYWQgfCAgSGVhZGVycyAgICAgIHwgICAgIFMgcCBhIGMgZSAgICAgfCAgIEl0ZW1zICAgfAorICogfF9fX19fX3xfX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX3wKKyAqLworCisvKiBIZWFkZXIgb2YgYSBkaXNrIGJsb2NrLiAgTW9yZSBwcmVjaXNlbHksIGhlYWRlciBvZiBhIGZvcm1hdHRlZCBsZWFmCisgICBvciBpbnRlcm5hbCBub2RlLCBhbmQgbm90IHRoZSBoZWFkZXIgb2YgYW4gdW5mb3JtYXR0ZWQgbm9kZS4gKi8KK3N0cnVjdCBibG9ja19oZWFkIHsKKwlfX2xlMTYgYmxrX2xldmVsOwkvKiBMZXZlbCBvZiBhIGJsb2NrIGluIHRoZSB0cmVlLiAqLworCV9fbGUxNiBibGtfbnJfaXRlbTsJLyogTnVtYmVyIG9mIGtleXMvaXRlbXMgaW4gYSBibG9jay4gKi8KKwlfX2xlMTYgYmxrX2ZyZWVfc3BhY2U7CS8qIEJsb2NrIGZyZWUgc3BhY2UgaW4gYnl0ZXMuICovCisJX19sZTE2IGJsa19yZXNlcnZlZDsKKwkvKiBkdW1wIHRoaXMgaW4gdjQvcGxhbkEgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfa2V5IGJsa19yaWdodF9kZWxpbV9rZXk7CS8qIGtlcHQgb25seSBmb3IgY29tcGF0aWJpbGl0eSAqLworfTsKKworI2RlZmluZSBCTEtIX1NJWkUgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHN0cnVjdCBibG9ja19oZWFkKSkKKyNkZWZpbmUgYmxraF9sZXZlbChwX2Jsa2gpICAgICAgICAgICAgKGxlMTZfdG9fY3B1KChwX2Jsa2gpLT5ibGtfbGV2ZWwpKQorI2RlZmluZSBibGtoX25yX2l0ZW0ocF9ibGtoKSAgICAgICAgICAobGUxNl90b19jcHUoKHBfYmxraCktPmJsa19ucl9pdGVtKSkKKyNkZWZpbmUgYmxraF9mcmVlX3NwYWNlKHBfYmxraCkgICAgICAgKGxlMTZfdG9fY3B1KChwX2Jsa2gpLT5ibGtfZnJlZV9zcGFjZSkpCisjZGVmaW5lIGJsa2hfcmVzZXJ2ZWQocF9ibGtoKSAgICAgICAgIChsZTE2X3RvX2NwdSgocF9ibGtoKS0+YmxrX3Jlc2VydmVkKSkKKyNkZWZpbmUgc2V0X2Jsa2hfbGV2ZWwocF9ibGtoLHZhbCkgICAgKChwX2Jsa2gpLT5ibGtfbGV2ZWwgPSBjcHVfdG9fbGUxNih2YWwpKQorI2RlZmluZSBzZXRfYmxraF9ucl9pdGVtKHBfYmxraCx2YWwpICAoKHBfYmxraCktPmJsa19ucl9pdGVtID0gY3B1X3RvX2xlMTYodmFsKSkKKyNkZWZpbmUgc2V0X2Jsa2hfZnJlZV9zcGFjZShwX2Jsa2gsdmFsKSAoKHBfYmxraCktPmJsa19mcmVlX3NwYWNlID0gY3B1X3RvX2xlMTYodmFsKSkKKyNkZWZpbmUgc2V0X2Jsa2hfcmVzZXJ2ZWQocF9ibGtoLHZhbCkgKChwX2Jsa2gpLT5ibGtfcmVzZXJ2ZWQgPSBjcHVfdG9fbGUxNih2YWwpKQorI2RlZmluZSBibGtoX3JpZ2h0X2RlbGltX2tleShwX2Jsa2gpICAoKHBfYmxraCktPmJsa19yaWdodF9kZWxpbV9rZXkpCisjZGVmaW5lIHNldF9ibGtoX3JpZ2h0X2RlbGltX2tleShwX2Jsa2gsdmFsKSAgKChwX2Jsa2gpLT5ibGtfcmlnaHRfZGVsaW1fa2V5ID0gdmFsKQorCisvKgorICogdmFsdWVzIGZvciBibGtfbGV2ZWwgZmllbGQgb2YgdGhlIHN0cnVjdCBibG9ja19oZWFkCisgKi8KKworI2RlZmluZSBGUkVFX0xFVkVMIDAJCS8qIHdoZW4gbm9kZSBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBpdHMKKwkJCQkgICBibGtfbGV2ZWwgaXMgc2V0IHRvIEZSRUVfTEVWRUwuIEl0IGlzIHRoZW4KKwkJCQkgICB1c2VkIHRvIHNlZSB3aGV0aGVyIHRoZSBub2RlIGlzIHN0aWxsIGluIHRoZQorCQkJCSAgIHRyZWUgKi8KKworI2RlZmluZSBESVNLX0xFQUZfTk9ERV9MRVZFTCAgMQkvKiBMZWFmIG5vZGUgbGV2ZWwuICovCisKKy8qIEdpdmVuIHRoZSBidWZmZXIgaGVhZCBvZiBhIGZvcm1hdHRlZCBub2RlLCByZXNvbHZlIHRvIHRoZSBibG9jayBoZWFkIG9mIHRoYXQgbm9kZS4gKi8KKyNkZWZpbmUgQl9CTEtfSEVBRChwX3NfYmgpICAgICAgICAgICAgKChzdHJ1Y3QgYmxvY2tfaGVhZCAqKSgocF9zX2JoKS0+Yl9kYXRhKSkKKy8qIE51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSBpbiBidWZmZXIuICovCisjZGVmaW5lIEJfTlJfSVRFTVMocF9zX2JoKSAgICAgICAgICAgIChibGtoX25yX2l0ZW0oQl9CTEtfSEVBRChwX3NfYmgpKSkKKyNkZWZpbmUgQl9MRVZFTChwX3NfYmgpICAgICAgICAgICAgICAgKGJsa2hfbGV2ZWwoQl9CTEtfSEVBRChwX3NfYmgpKSkKKyNkZWZpbmUgQl9GUkVFX1NQQUNFKHBfc19iaCkgICAgICAgICAgKGJsa2hfZnJlZV9zcGFjZShCX0JMS19IRUFEKHBfc19iaCkpKQorCisjZGVmaW5lIFBVVF9CX05SX0lURU1TKHBfc19iaCx2YWwpICAgIGRvIHsgc2V0X2Jsa2hfbnJfaXRlbShCX0JMS19IRUFEKHBfc19iaCksdmFsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUFVUX0JfTEVWRUwocF9zX2JoLHZhbCkgICAgICAgZG8geyBzZXRfYmxraF9sZXZlbChCX0JMS19IRUFEKHBfc19iaCksdmFsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUFVUX0JfRlJFRV9TUEFDRShwX3NfYmgsdmFsKSAgZG8geyBzZXRfYmxraF9mcmVlX3NwYWNlKEJfQkxLX0hFQUQocF9zX2JoKSx2YWwpOyB9IHdoaWxlICgwKQorCisvKiBHZXQgcmlnaHQgZGVsaW1pdGluZyBrZXkuIC0tIGxpdHRsZSBlbmRpYW4gKi8KKyNkZWZpbmUgQl9QUklHSFRfREVMSU1fS0VZKHBfc19iaCkgICAoJihibGtfcmlnaHRfZGVsaW1fa2V5KEJfQkxLX0hFQUQocF9zX2JoKSkpKQorCisvKiBEb2VzIHRoZSBidWZmZXIgY29udGFpbiBhIGRpc2sgbGVhZi4gKi8KKyNkZWZpbmUgQl9JU19JVEVNU19MRVZFTChwX3NfYmgpICAgICAoQl9MRVZFTChwX3NfYmgpID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQorCisvKiBEb2VzIHRoZSBidWZmZXIgY29udGFpbiBhIGRpc2sgaW50ZXJuYWwgbm9kZSAqLworI2RlZmluZSBCX0lTX0tFWVNfTEVWRUwocF9zX2JoKSAgICAgIChCX0xFVkVMKHBfc19iaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEJfTEVWRUwocF9zX2JoKSA8PSBNQVhfSEVJR0hUKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVQgREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vCisvLyBvbGQgc3RhdCBkYXRhIGlzIDMyIGJ5dGVzIGxvbmcuIFdlIGFyZSBnb2luZyB0byBkaXN0aW5ndWlzaCBuZXcgb25lIGJ5CisvLyBkaWZmZXJlbnQgc2l6ZQorLy8KK3N0cnVjdCBzdGF0X2RhdGFfdjEgeworCV9fbGUxNiBzZF9tb2RlOwkJLyogZmlsZSB0eXBlLCBwZXJtaXNzaW9ucyAqLworCV9fbGUxNiBzZF9ubGluazsJLyogbnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKwlfX2xlMTYgc2RfdWlkOwkJLyogb3duZXIgKi8KKwlfX2xlMTYgc2RfZ2lkOwkJLyogZ3JvdXAgKi8KKwlfX2xlMzIgc2Rfc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworCV9fbGUzMiBzZF9hdGltZTsJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLworCV9fbGUzMiBzZF9tdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkICAqLworCV9fbGUzMiBzZF9jdGltZTsJLyogdGltZSBpbm9kZSAoc3RhdCBkYXRhKSB3YXMgbGFzdCBjaGFuZ2VkIChleGNlcHQgY2hhbmdlcyB0byBzZF9hdGltZSBhbmQgc2RfbXRpbWUpICovCisJdW5pb24geworCQlfX2xlMzIgc2RfcmRldjsKKwkJX19sZTMyIHNkX2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcyBmaWxlIHVzZXMgKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKKwlfX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7CS8qIGZpcnN0IGJ5dGUgb2YgZmlsZSB3aGljaCBpcyBzdG9yZWQKKwkJCQkJICAgaW4gYSBkaXJlY3QgaXRlbTogZXhjZXB0IHRoYXQgaWYgaXQKKwkJCQkJICAgZXF1YWxzIDEgaXQgaXMgYSBzeW1saW5rIGFuZCBpZiBpdAorCQkJCQkgICBlcXVhbHMgfihfX3UzMikwIHRoZXJlIGlzIG5vCisJCQkJCSAgIGRpcmVjdCBpdGVtLiAgVGhlIGV4aXN0ZW5jZSBvZiB0aGlzCisJCQkJCSAgIGZpZWxkIHJlYWxseSBncmF0ZXMgb24gbWUuIExldCdzCisJCQkJCSAgIHJlcGxhY2UgaXQgd2l0aCBhIG1hY3JvIGJhc2VkIG9uCisJCQkJCSAgIHNkX3NpemUgYW5kIG91ciB0YWlsIHN1cHByZXNzaW9uCisJCQkJCSAgIHBvbGljeS4gIFNvbWVkYXkuICAtSGFucyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZGVmaW5lIFNEX1YxX1NJWkUgICAgICAgICAgICAgIChzaXplb2Yoc3RydWN0IHN0YXRfZGF0YV92MSkpCisjZGVmaW5lIHN0YXRfZGF0YV92MShpaCkgICAgICAgIChpaF92ZXJzaW9uIChpaCkgPT0gS0VZX0ZPUk1BVF8zXzUpCisjZGVmaW5lIHNkX3YxX21vZGUoc2RwKSAgICAgICAgIChsZTE2X3RvX2NwdSgoc2RwKS0+c2RfbW9kZSkpCisjZGVmaW5lIHNldF9zZF92MV9tb2RlKHNkcCx2KSAgICgoc2RwKS0+c2RfbW9kZSA9IGNwdV90b19sZTE2KHYpKQorI2RlZmluZSBzZF92MV9ubGluayhzZHApICAgICAgICAobGUxNl90b19jcHUoKHNkcCktPnNkX25saW5rKSkKKyNkZWZpbmUgc2V0X3NkX3YxX25saW5rKHNkcCx2KSAgKChzZHApLT5zZF9ubGluayA9IGNwdV90b19sZTE2KHYpKQorI2RlZmluZSBzZF92MV91aWQoc2RwKSAgICAgICAgICAobGUxNl90b19jcHUoKHNkcCktPnNkX3VpZCkpCisjZGVmaW5lIHNldF9zZF92MV91aWQoc2RwLHYpICAgICgoc2RwKS0+c2RfdWlkID0gY3B1X3RvX2xlMTYodikpCisjZGVmaW5lIHNkX3YxX2dpZChzZHApICAgICAgICAgIChsZTE2X3RvX2NwdSgoc2RwKS0+c2RfZ2lkKSkKKyNkZWZpbmUgc2V0X3NkX3YxX2dpZChzZHAsdikgICAgKChzZHApLT5zZF9naWQgPSBjcHVfdG9fbGUxNih2KSkKKyNkZWZpbmUgc2RfdjFfc2l6ZShzZHApICAgICAgICAgKGxlMzJfdG9fY3B1KChzZHApLT5zZF9zaXplKSkKKyNkZWZpbmUgc2V0X3NkX3YxX3NpemUoc2RwLHYpICAgKChzZHApLT5zZF9zaXplID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YxX2F0aW1lKHNkcCkgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfYXRpbWUpKQorI2RlZmluZSBzZXRfc2RfdjFfYXRpbWUoc2RwLHYpICAoKHNkcCktPnNkX2F0aW1lID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YxX210aW1lKHNkcCkgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfbXRpbWUpKQorI2RlZmluZSBzZXRfc2RfdjFfbXRpbWUoc2RwLHYpICAoKHNkcCktPnNkX210aW1lID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YxX2N0aW1lKHNkcCkgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfY3RpbWUpKQorI2RlZmluZSBzZXRfc2RfdjFfY3RpbWUoc2RwLHYpICAoKHNkcCktPnNkX2N0aW1lID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YxX3JkZXYoc2RwKSAgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+dS5zZF9yZGV2KSkKKyNkZWZpbmUgc2V0X3NkX3YxX3JkZXYoc2RwLHYpICAgKChzZHApLT51LnNkX3JkZXYgPSBjcHVfdG9fbGUzMih2KSkKKyNkZWZpbmUgc2RfdjFfYmxvY2tzKHNkcCkgICAgICAgKGxlMzJfdG9fY3B1KChzZHApLT51LnNkX2Jsb2NrcykpCisjZGVmaW5lIHNldF9zZF92MV9ibG9ja3Moc2RwLHYpICgoc2RwKS0+dS5zZF9ibG9ja3MgPSBjcHVfdG9fbGUzMih2KSkKKyNkZWZpbmUgc2RfdjFfZmlyc3RfZGlyZWN0X2J5dGUoc2RwKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfZmlyc3RfZGlyZWN0X2J5dGUpKQorI2RlZmluZSBzZXRfc2RfdjFfZmlyc3RfZGlyZWN0X2J5dGUoc2RwLHYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzZHApLT5zZF9maXJzdF9kaXJlY3RfYnl0ZSA9IGNwdV90b19sZTMyKHYpKQorCisvKiBpbm9kZSBmbGFncyBzdG9yZWQgaW4gc2RfYXR0cnMgKG5lZSBzZF9yZXNlcnZlZCkgKi8KKworLyogd2Ugd2FudCBjb21tb24gZmxhZ3MgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gZXh0MiwKKyAgIHNvIGNoYXR0cigxKSB3aWxsIHdvcmsgd2l0aG91dCBwcm9ibGVtcyAqLworI2RlZmluZSBSRUlTRVJGU19JTU1VVEFCTEVfRkwgRlNfSU1NVVRBQkxFX0ZMCisjZGVmaW5lIFJFSVNFUkZTX0FQUEVORF9GTCAgICBGU19BUFBFTkRfRkwKKyNkZWZpbmUgUkVJU0VSRlNfU1lOQ19GTCAgICAgIEZTX1NZTkNfRkwKKyNkZWZpbmUgUkVJU0VSRlNfTk9BVElNRV9GTCAgIEZTX05PQVRJTUVfRkwKKyNkZWZpbmUgUkVJU0VSRlNfTk9EVU1QX0ZMICAgIEZTX05PRFVNUF9GTAorI2RlZmluZSBSRUlTRVJGU19TRUNSTV9GTCAgICAgRlNfU0VDUk1fRkwKKyNkZWZpbmUgUkVJU0VSRlNfVU5STV9GTCAgICAgIEZTX1VOUk1fRkwKKyNkZWZpbmUgUkVJU0VSRlNfQ09NUFJfRkwgICAgIEZTX0NPTVBSX0ZMCisjZGVmaW5lIFJFSVNFUkZTX05PVEFJTF9GTCAgICBGU19OT1RBSUxfRkwKKworLyogcGVyc2lzdGVudCBmbGFncyB0aGF0IGZpbGUgaW5oZXJpdHMgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSAqLworI2RlZmluZSBSRUlTRVJGU19JTkhFUklUX01BU0sgKCBSRUlTRVJGU19JTU1VVEFCTEVfRkwgfAlcCisJCQkJUkVJU0VSRlNfU1lOQ19GTCB8CVwKKwkJCQlSRUlTRVJGU19OT0FUSU1FX0ZMIHwJXAorCQkJCVJFSVNFUkZTX05PRFVNUF9GTCB8CVwKKwkJCQlSRUlTRVJGU19TRUNSTV9GTCB8CVwKKwkJCQlSRUlTRVJGU19DT01QUl9GTCB8CVwKKwkJCQlSRUlTRVJGU19OT1RBSUxfRkwgKQorCisvKiBTdGF0IERhdGEgb24gZGlzayAocmVpc2VyZnMgdmVyc2lvbiBvZiBVRlMgZGlzayBpbm9kZSBtaW51cyB0aGUKKyAgIGFkZHJlc3MgYmxvY2tzKSAqLworc3RydWN0IHN0YXRfZGF0YSB7CisJX19sZTE2IHNkX21vZGU7CQkvKiBmaWxlIHR5cGUsIHBlcm1pc3Npb25zICovCisJX19sZTE2IHNkX2F0dHJzOwkvKiBwZXJzaXN0ZW50IGlub2RlIGZsYWdzICovCisJX19sZTMyIHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLworCV9fbGU2NCBzZF9zaXplOwkJLyogZmlsZSBzaXplICovCisJX19sZTMyIHNkX3VpZDsJCS8qIG93bmVyICovCisJX19sZTMyIHNkX2dpZDsJCS8qIGdyb3VwICovCisJX19sZTMyIHNkX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJX19sZTMyIHNkX210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgICovCisJX19sZTMyIHNkX2N0aW1lOwkvKiB0aW1lIGlub2RlIChzdGF0IGRhdGEpIHdhcyBsYXN0IGNoYW5nZWQgKGV4Y2VwdCBjaGFuZ2VzIHRvIHNkX2F0aW1lIGFuZCBzZF9tdGltZSkgKi8KKwlfX2xlMzIgc2RfYmxvY2tzOworCXVuaW9uIHsKKwkJX19sZTMyIHNkX3JkZXY7CisJCV9fbGUzMiBzZF9nZW5lcmF0aW9uOworCQkvL19fbGUzMiBzZF9maXJzdF9kaXJlY3RfYnl0ZTsKKwkJLyogZmlyc3QgYnl0ZSBvZiBmaWxlIHdoaWNoIGlzIHN0b3JlZCBpbiBhCisJCSAgIGRpcmVjdCBpdGVtOiBleGNlcHQgdGhhdCBpZiBpdCBlcXVhbHMgMQorCQkgICBpdCBpcyBhIHN5bWxpbmsgYW5kIGlmIGl0IGVxdWFscworCQkgICB+KF9fdTMyKTAgdGhlcmUgaXMgbm8gZGlyZWN0IGl0ZW0uICBUaGUKKwkJICAgZXhpc3RlbmNlIG9mIHRoaXMgZmllbGQgcmVhbGx5IGdyYXRlcworCQkgICBvbiBtZS4gTGV0J3MgcmVwbGFjZSBpdCB3aXRoIGEgbWFjcm8KKwkJICAgYmFzZWQgb24gc2Rfc2l6ZSBhbmQgb3VyIHRhaWwKKwkJICAgc3VwcHJlc3Npb24gcG9saWN5PyAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworLy8KKy8vIHRoaXMgaXMgNDQgYnl0ZXMgbG9uZworLy8KKyNkZWZpbmUgU0RfU0laRSAoc2l6ZW9mKHN0cnVjdCBzdGF0X2RhdGEpKQorI2RlZmluZSBTRF9WMl9TSVpFICAgICAgICAgICAgICBTRF9TSVpFCisjZGVmaW5lIHN0YXRfZGF0YV92MihpaCkgICAgICAgIChpaF92ZXJzaW9uIChpaCkgPT0gS0VZX0ZPUk1BVF8zXzYpCisjZGVmaW5lIHNkX3YyX21vZGUoc2RwKSAgICAgICAgIChsZTE2X3RvX2NwdSgoc2RwKS0+c2RfbW9kZSkpCisjZGVmaW5lIHNldF9zZF92Ml9tb2RlKHNkcCx2KSAgICgoc2RwKS0+c2RfbW9kZSA9IGNwdV90b19sZTE2KHYpKQorLyogc2RfcmVzZXJ2ZWQgKi8KKy8qIHNldF9zZF9yZXNlcnZlZCAqLworI2RlZmluZSBzZF92Ml9ubGluayhzZHApICAgICAgICAobGUzMl90b19jcHUoKHNkcCktPnNkX25saW5rKSkKKyNkZWZpbmUgc2V0X3NkX3YyX25saW5rKHNkcCx2KSAgKChzZHApLT5zZF9ubGluayA9IGNwdV90b19sZTMyKHYpKQorI2RlZmluZSBzZF92Ml9zaXplKHNkcCkgICAgICAgICAobGU2NF90b19jcHUoKHNkcCktPnNkX3NpemUpKQorI2RlZmluZSBzZXRfc2RfdjJfc2l6ZShzZHAsdikgICAoKHNkcCktPnNkX3NpemUgPSBjcHVfdG9fbGU2NCh2KSkKKyNkZWZpbmUgc2RfdjJfdWlkKHNkcCkgICAgICAgICAgKGxlMzJfdG9fY3B1KChzZHApLT5zZF91aWQpKQorI2RlZmluZSBzZXRfc2RfdjJfdWlkKHNkcCx2KSAgICAoKHNkcCktPnNkX3VpZCA9IGNwdV90b19sZTMyKHYpKQorI2RlZmluZSBzZF92Ml9naWQoc2RwKSAgICAgICAgICAobGUzMl90b19jcHUoKHNkcCktPnNkX2dpZCkpCisjZGVmaW5lIHNldF9zZF92Ml9naWQoc2RwLHYpICAgICgoc2RwKS0+c2RfZ2lkID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YyX2F0aW1lKHNkcCkgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfYXRpbWUpKQorI2RlZmluZSBzZXRfc2RfdjJfYXRpbWUoc2RwLHYpICAoKHNkcCktPnNkX2F0aW1lID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YyX210aW1lKHNkcCkgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfbXRpbWUpKQorI2RlZmluZSBzZXRfc2RfdjJfbXRpbWUoc2RwLHYpICAoKHNkcCktPnNkX210aW1lID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YyX2N0aW1lKHNkcCkgICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfY3RpbWUpKQorI2RlZmluZSBzZXRfc2RfdjJfY3RpbWUoc2RwLHYpICAoKHNkcCktPnNkX2N0aW1lID0gY3B1X3RvX2xlMzIodikpCisjZGVmaW5lIHNkX3YyX2Jsb2NrcyhzZHApICAgICAgIChsZTMyX3RvX2NwdSgoc2RwKS0+c2RfYmxvY2tzKSkKKyNkZWZpbmUgc2V0X3NkX3YyX2Jsb2NrcyhzZHAsdikgKChzZHApLT5zZF9ibG9ja3MgPSBjcHVfdG9fbGUzMih2KSkKKyNkZWZpbmUgc2RfdjJfcmRldihzZHApICAgICAgICAgKGxlMzJfdG9fY3B1KChzZHApLT51LnNkX3JkZXYpKQorI2RlZmluZSBzZXRfc2RfdjJfcmRldihzZHAsdikgICAoKHNkcCktPnUuc2RfcmRldiA9IGNwdV90b19sZTMyKHYpKQorI2RlZmluZSBzZF92Ml9nZW5lcmF0aW9uKHNkcCkgICAobGUzMl90b19jcHUoKHNkcCktPnUuc2RfZ2VuZXJhdGlvbikpCisjZGVmaW5lIHNldF9zZF92Ml9nZW5lcmF0aW9uKHNkcCx2KSAoKHNkcCktPnUuc2RfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKHYpKQorI2RlZmluZSBzZF92Ml9hdHRycyhzZHApICAgICAgICAgKGxlMTZfdG9fY3B1KChzZHApLT5zZF9hdHRycykpCisjZGVmaW5lIHNldF9zZF92Ml9hdHRycyhzZHAsdikgICAoKHNkcCktPnNkX2F0dHJzID0gY3B1X3RvX2xlMTYodikpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUlkgU1RSVUNUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIAorICAgUGljdHVyZSByZXByZXNlbnRzIHRoZSBzdHJ1Y3R1cmUgb2YgZGlyZWN0b3J5IGl0ZW1zCisgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgIHwgIEFycmF5IG9mICAgICB8ICAgfCAgICAgfCAgICAgICAgfCAgICAgICB8ICAgfAorICAgfCBkaXJlY3RvcnkgICAgIHxOLTF8IE4tMiB8IC4uLi4gICB8ICAgMXN0IHwwdGh8CisgICB8IGVudHJ5IGhlYWRlcnMgfCAgIHwgICAgIHwgICAgICAgIHwgICAgICAgfCAgIHwKKyAgIHxfX19fX19fX19fX19fX198X19ffF9fX19ffF9fX19fX19ffF9fX19fX198X19ffAorICAgICAgICAgICAgICAgICAgICA8LS0tLSAgIGRpcmVjdG9yeSBlbnRyaWVzICAgICAgICAgLS0tLS0tPgorCisgRmlyc3QgZGlyZWN0b3J5IGl0ZW0gaGFzIGtfb2Zmc2V0IGNvbXBvbmVudCAxLiBXZSBzdG9yZSAiLiIgYW5kICIuLiIKKyBpbiBvbmUgaXRlbSwgYWx3YXlzLCB3ZSBuZXZlciBzcGxpdCAiLiIgYW5kICIuLiIgaW50byBkaWZmZXJpbmcKKyBpdGVtcy4gIFRoaXMgbWFrZXMsIGFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvZGUgZm9yIHJlbW92aW5nCisgZGlyZWN0b3JpZXMgc2ltcGxlci4gKi8KKyNkZWZpbmUgU0RfT0ZGU0VUICAwCisjZGVmaW5lIFNEX1VOSVFVRU5FU1MgMAorI2RlZmluZSBET1RfT0ZGU0VUIDEKKyNkZWZpbmUgRE9UX0RPVF9PRkZTRVQgMgorI2RlZmluZSBESVJFTlRSWV9VTklRVUVORVNTIDUwMAorCisvKiAqLworI2RlZmluZSBGSVJTVF9JVEVNX09GRlNFVCAxCisKKy8qCisgICBROiBIb3cgdG8gZ2V0IGtleSBvZiBvYmplY3QgcG9pbnRlZCB0byBieSBlbnRyeSBmcm9tIGVudHJ5PyAgCisKKyAgIEE6IEVhY2ggZGlyZWN0b3J5IGVudHJ5IGhhcyBpdHMgaGVhZGVyLiBUaGlzIGhlYWRlciBoYXMgZGVoX2Rpcl9pZCBhbmQgZGVoX29iamVjdGlkIGZpZWxkcywgdGhvc2UgYXJlIGtleQorICAgICAgb2Ygb2JqZWN0LCBlbnRyeSBwb2ludHMgdG8gKi8KKworLyogTk9UIElNUExFTUVOVEVEOiAgIAorICAgRGlyZWN0b3J5IHdpbGwgc29tZWRheSBjb250YWluIHN0YXQgZGF0YSBvZiBvYmplY3QgKi8KKworc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgeworCV9fbGUzMiBkZWhfb2Zmc2V0OwkvKiB0aGlyZCBjb21wb25lbnQgb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSBrZXkgKi8KKwlfX2xlMzIgZGVoX2Rpcl9pZDsJLyogb2JqZWN0aWQgb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIG9iamVjdCwgdGhhdCBpcyByZWZlcmVuY2VkCisJCQkJICAgYnkgZGlyZWN0b3J5IGVudHJ5ICovCisJX19sZTMyIGRlaF9vYmplY3RpZDsJLyogb2JqZWN0aWQgb2YgdGhlIG9iamVjdCwgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGRpcmVjdG9yeSBlbnRyeSAqLworCV9fbGUxNiBkZWhfbG9jYXRpb247CS8qIG9mZnNldCBvZiBuYW1lIGluIHRoZSB3aG9sZSBpdGVtICovCisJX19sZTE2IGRlaF9zdGF0ZTsJLyogd2hldGhlciAxKSBlbnRyeSBjb250YWlucyBzdGF0IGRhdGEgKGZvciBmdXR1cmUpLCBhbmQgMikgd2hldGhlcgorCQkJCSAgIGVudHJ5IGlzIGhpZGRlbiAodW5saW5rZWQpICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisjZGVmaW5lIERFSF9TSVpFICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkKQorI2RlZmluZSBkZWhfb2Zmc2V0KHBfZGVoKSAgICAgICAgIChsZTMyX3RvX2NwdSgocF9kZWgpLT5kZWhfb2Zmc2V0KSkKKyNkZWZpbmUgZGVoX2Rpcl9pZChwX2RlaCkgICAgICAgICAobGUzMl90b19jcHUoKHBfZGVoKS0+ZGVoX2Rpcl9pZCkpCisjZGVmaW5lIGRlaF9vYmplY3RpZChwX2RlaCkgICAgICAgKGxlMzJfdG9fY3B1KChwX2RlaCktPmRlaF9vYmplY3RpZCkpCisjZGVmaW5lIGRlaF9sb2NhdGlvbihwX2RlaCkgICAgICAgKGxlMTZfdG9fY3B1KChwX2RlaCktPmRlaF9sb2NhdGlvbikpCisjZGVmaW5lIGRlaF9zdGF0ZShwX2RlaCkgICAgICAgICAgKGxlMTZfdG9fY3B1KChwX2RlaCktPmRlaF9zdGF0ZSkpCisKKyNkZWZpbmUgcHV0X2RlaF9vZmZzZXQocF9kZWgsdikgICAoKHBfZGVoKS0+ZGVoX29mZnNldCA9IGNwdV90b19sZTMyKCh2KSkpCisjZGVmaW5lIHB1dF9kZWhfZGlyX2lkKHBfZGVoLHYpICAgKChwX2RlaCktPmRlaF9kaXJfaWQgPSBjcHVfdG9fbGUzMigodikpKQorI2RlZmluZSBwdXRfZGVoX29iamVjdGlkKHBfZGVoLHYpICgocF9kZWgpLT5kZWhfb2JqZWN0aWQgPSBjcHVfdG9fbGUzMigodikpKQorI2RlZmluZSBwdXRfZGVoX2xvY2F0aW9uKHBfZGVoLHYpICgocF9kZWgpLT5kZWhfbG9jYXRpb24gPSBjcHVfdG9fbGUxNigodikpKQorI2RlZmluZSBwdXRfZGVoX3N0YXRlKHBfZGVoLHYpICAgICgocF9kZWgpLT5kZWhfc3RhdGUgPSBjcHVfdG9fbGUxNigodikpKQorCisvKiBlbXB0eSBkaXJlY3RvcnkgY29udGFpbnMgdHdvIGVudHJpZXMgIi4iIGFuZCAiLi4iIGFuZCB0aGVpciBoZWFkZXJzICovCisjZGVmaW5lIEVNUFRZX0RJUl9TSVpFIFwKKyhERUhfU0laRSAqIDIgKyBST1VORF9VUCAoc3RybGVuICgiLiIpKSArIFJPVU5EX1VQIChzdHJsZW4gKCIuLiIpKSkKKworLyogb2xkIGZvcm1hdCBkaXJlY3RvcmllcyBoYXZlIHRoaXMgc2l6ZSB3aGVuIGVtcHR5ICovCisjZGVmaW5lIEVNUFRZX0RJUl9TSVpFX1YxIChERUhfU0laRSAqIDIgKyAzKQorCisjZGVmaW5lIERFSF9TdGF0ZGF0YSAwCQkvKiBub3QgdXNlZCBub3cgKi8KKyNkZWZpbmUgREVIX1Zpc2libGUgMgorCisvKiA2NCBiaXQgc3lzdGVtcyAoYW5kIHRoZSBTLzM5MCkgbmVlZCB0byBiZSBhbGlnbmVkIGV4cGxpY2l0bHkgLWpkbSAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQgfHwgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX2hwcGFfXykKKyMgICBkZWZpbmUgQUREUl9VTkFMSUdORURfQklUUyAgKDMpCisjZW5kaWYKKworLyogVGhlc2UgYXJlIG9ubHkgdXNlZCB0byBtYW5pcHVsYXRlIGRlaF9zdGF0ZS4KKyAqIEJlY2F1c2Ugb2YgdGhpcywgd2UnbGwgdXNlIHRoZSBleHQyXyBiaXQgcm91dGluZXMsCisgKiBzaW5jZSB0aGV5IGFyZSBsaXR0bGUgZW5kaWFuICovCisjaWZkZWYgQUREUl9VTkFMSUdORURfQklUUworCisjICAgZGVmaW5lIGFsaWduZWRfYWRkcmVzcyhhZGRyKSAgICAgICAgICAgKCh2b2lkICopKChsb25nKShhZGRyKSAmIH4oKDFVTCA8PCBBRERSX1VOQUxJR05FRF9CSVRTKSAtIDEpKSkKKyMgICBkZWZpbmUgdW5hbGlnbmVkX29mZnNldChhZGRyKSAgICAgICAgICAoKChpbnQpKChsb25nKShhZGRyKSAmICgoMSA8PCBBRERSX1VOQUxJR05FRF9CSVRTKSAtIDEpKSkgPDwgMykKKworIyAgIGRlZmluZSBzZXRfYml0X3VuYWxpZ25lZChuciwgYWRkcikgICAgIGV4dDJfc2V0X2JpdCgobnIpICsgdW5hbGlnbmVkX29mZnNldChhZGRyKSwgYWxpZ25lZF9hZGRyZXNzKGFkZHIpKQorIyAgIGRlZmluZSBjbGVhcl9iaXRfdW5hbGlnbmVkKG5yLCBhZGRyKSAgIGV4dDJfY2xlYXJfYml0KChucikgKyB1bmFsaWduZWRfb2Zmc2V0KGFkZHIpLCBhbGlnbmVkX2FkZHJlc3MoYWRkcikpCisjICAgZGVmaW5lIHRlc3RfYml0X3VuYWxpZ25lZChuciwgYWRkcikgICAgZXh0Ml90ZXN0X2JpdCgobnIpICsgdW5hbGlnbmVkX29mZnNldChhZGRyKSwgYWxpZ25lZF9hZGRyZXNzKGFkZHIpKQorCisjZWxzZQorCisjICAgZGVmaW5lIHNldF9iaXRfdW5hbGlnbmVkKG5yLCBhZGRyKSAgICAgZXh0Ml9zZXRfYml0KG5yLCBhZGRyKQorIyAgIGRlZmluZSBjbGVhcl9iaXRfdW5hbGlnbmVkKG5yLCBhZGRyKSAgIGV4dDJfY2xlYXJfYml0KG5yLCBhZGRyKQorIyAgIGRlZmluZSB0ZXN0X2JpdF91bmFsaWduZWQobnIsIGFkZHIpICAgIGV4dDJfdGVzdF9iaXQobnIsIGFkZHIpCisKKyNlbmRpZgorCisjZGVmaW5lIG1hcmtfZGVfd2l0aF9zZChkZWgpICAgICAgICBzZXRfYml0X3VuYWxpZ25lZCAoREVIX1N0YXRkYXRhLCAmKChkZWgpLT5kZWhfc3RhdGUpKQorI2RlZmluZSBtYXJrX2RlX3dpdGhvdXRfc2QoZGVoKSAgICAgY2xlYXJfYml0X3VuYWxpZ25lZCAoREVIX1N0YXRkYXRhLCAmKChkZWgpLT5kZWhfc3RhdGUpKQorI2RlZmluZSBtYXJrX2RlX3Zpc2libGUoZGVoKQkgICAgc2V0X2JpdF91bmFsaWduZWQgKERFSF9WaXNpYmxlLCAmKChkZWgpLT5kZWhfc3RhdGUpKQorI2RlZmluZSBtYXJrX2RlX2hpZGRlbihkZWgpCSAgICBjbGVhcl9iaXRfdW5hbGlnbmVkIChERUhfVmlzaWJsZSwgJigoZGVoKS0+ZGVoX3N0YXRlKSkKKworI2RlZmluZSBkZV93aXRoX3NkKGRlaCkJCSAgICB0ZXN0X2JpdF91bmFsaWduZWQgKERFSF9TdGF0ZGF0YSwgJigoZGVoKS0+ZGVoX3N0YXRlKSkKKyNkZWZpbmUgZGVfdmlzaWJsZShkZWgpCSAgICAJICAgIHRlc3RfYml0X3VuYWxpZ25lZCAoREVIX1Zpc2libGUsICYoKGRlaCktPmRlaF9zdGF0ZSkpCisjZGVmaW5lIGRlX2hpZGRlbihkZWgpCSAgICAJICAgICF0ZXN0X2JpdF91bmFsaWduZWQgKERFSF9WaXNpYmxlLCAmKChkZWgpLT5kZWhfc3RhdGUpKQorCitleHRlcm4gdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxKGNoYXIgKmJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAorCQkJCSAgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpOworZXh0ZXJuIHZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbShjaGFyICpib2R5LCBfX2xlMzIgZGlyaWQsIF9fbGUzMiBvYmppZCwKKwkJCQlfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKTsKKworLyogYXJyYXkgb2YgdGhlIGVudHJ5IGhlYWRlcnMgKi8KKyAvKiBnZXQgaXRlbSBib2R5ICovCisjZGVmaW5lIEJfSV9QSVRFTShiaCxpaCkgKCAoYmgpLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKQorI2RlZmluZSBCX0lfREVIKGJoLGloKSAoKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKEJfSV9QSVRFTShiaCxpaCkpKQorCisvKiBsZW5ndGggb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSBpbiBkaXJlY3RvcnkgaXRlbS4gVGhpcyBkZWZpbmUKKyAgIGNhbGN1bGF0ZXMgbGVuZ3RoIG9mIGktdGggZGlyZWN0b3J5IGVudHJ5IHVzaW5nIGRpcmVjdG9yeSBlbnRyeQorICAgbG9jYXRpb25zIGZyb20gZGlyIGVudHJ5IGhlYWQuIFdoZW4gaXQgY2FsY3VsYXRlcyBsZW5ndGggb2YgMC10aAorICAgZGlyZWN0b3J5IGVudHJ5LCBpdCB1c2VzIGxlbmd0aCBvZiB3aG9sZSBpdGVtIGluIHBsYWNlIG9mIGVudHJ5CisgICBsb2NhdGlvbiBvZiB0aGUgbm9uLWV4aXN0ZW50IGZvbGxvd2luZyBlbnRyeSBpbiB0aGUgY2FsY3VsYXRpb24uCisgICBTZWUgcGljdHVyZSBhYm92ZS4qLworLyoKKyNkZWZpbmUgSV9ERUhfTl9FTlRSWV9MRU5HVEgoaWgsZGVoLGkpIFwKKygoaSkgPyAoZGVoX2xvY2F0aW9uKChkZWgpLTEpIC0gZGVoX2xvY2F0aW9uKChkZWgpKSkgOiAoaWhfaXRlbV9sZW4oKGloKSkgLSBkZWhfbG9jYXRpb24oKGRlaCkpKSkKKyovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZW50cnlfbGVuZ3RoKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBwb3NfaW5faXRlbSkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCisJZGVoID0gQl9JX0RFSChiaCwgaWgpICsgcG9zX2luX2l0ZW07CisJaWYgKHBvc19pbl9pdGVtKQorCQlyZXR1cm4gZGVoX2xvY2F0aW9uKGRlaCAtIDEpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CisKKwlyZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC0gZGVoX2xvY2F0aW9uKGRlaCk7Cit9CisKKy8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgaXRlbSwgZGVwZW5kcyBvbiBFTlRSWV9DT1VOVCBiZWluZyBhdCB0aGUgc3RhcnQgb2YgZGlyZWN0b3J5IGR5bmFtaWMgZGF0YS4gKi8KKyNkZWZpbmUgSV9FTlRSWV9DT1VOVChpaCkgKGloX2VudHJ5X2NvdW50KChpaCkpKQorCisvKiBuYW1lIGJ5IGJoLCBpaCBhbmQgZW50cnlfbnVtICovCisjZGVmaW5lIEJfSV9FX05BTUUoYmgsaWgsZW50cnlfbnVtKSAoKGNoYXIgKikoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIGRlaF9sb2NhdGlvbihCX0lfREVIKGJoLGloKSsoZW50cnlfbnVtKSkpKQorCisvLyB0d28gZW50cmllcyBwZXIgYmxvY2sgKGF0IGxlYXN0KQorI2RlZmluZSBSRUlTRVJGU19NQVhfTkFNRShibG9ja19zaXplKSAyNTUKKworLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3Igb3BlcmF0aW9ucyBvbiBkaXJlY3RvcnkgZW50cmllcy4gSXQgaXMKKyAgIG5vdCBhIGRpc2sgc3RydWN0dXJlLiAqLworLyogV2hlbiByZWlzZXJmc19maW5kX2VudHJ5IG9yIHNlYXJjaF9ieV9lbnRyeV9rZXkgZmluZCBkaXJlY3RvcnkKKyAgIGVudHJ5LCB0aGV5IHJldHVybiBmaWxsZWQgcmVpc2VyZnNfZGlyX2VudHJ5IHN0cnVjdHVyZSAqLworc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZV9iaDsKKwlpbnQgZGVfaXRlbV9udW07CisJc3RydWN0IGl0ZW1faGVhZCAqZGVfaWg7CisJaW50IGRlX2VudHJ5X251bTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVfZGVoOworCWludCBkZV9lbnRyeWxlbjsKKwlpbnQgZGVfbmFtZWxlbjsKKwljaGFyICpkZV9uYW1lOworCXVuc2lnbmVkIGxvbmcgKmRlX2dlbl9udW1iZXJfYml0X3N0cmluZzsKKworCV9fdTMyIGRlX2Rpcl9pZDsKKwlfX3UzMiBkZV9vYmplY3RpZDsKKworCXN0cnVjdCBjcHVfa2V5IGRlX2VudHJ5X2tleTsKK307CisKKy8qIHRoZXNlIGRlZmluZXMgYXJlIHVzZWZ1bCB3aGVuIGEgcGFydGljdWxhciBtZW1iZXIgb2YgYSByZWlzZXJmc19kaXJfZW50cnkgaXMgbmVlZGVkICovCisKKy8qIHBvaW50ZXIgdG8gZmlsZSBuYW1lLCBzdG9yZWQgaW4gZW50cnkgKi8KKyNkZWZpbmUgQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUoYmgsaWgsZGVoKSAoQl9JX1BJVEVNIChiaCwgaWgpICsgZGVoX2xvY2F0aW9uKGRlaCkpCisKKy8qIGxlbmd0aCBvZiBuYW1lICovCisjZGVmaW5lIElfREVIX05fRU5UUllfRklMRV9OQU1FX0xFTkdUSChpaCxkZWgsZW50cnlfbnVtKSBcCisoSV9ERUhfTl9FTlRSWV9MRU5HVEggKGloLCBkZWgsIGVudHJ5X251bSkgLSAoZGVfd2l0aF9zZCAoZGVoKSA/IFNEX1NJWkUgOiAwKSkKKworLyogaGFzaCB2YWx1ZSBvY2N1cGllcyBiaXRzIGZyb20gNyB1cCB0byAzMCAqLworI2RlZmluZSBHRVRfSEFTSF9WQUxVRShvZmZzZXQpICgob2Zmc2V0KSAmIDB4N2ZmZmZmODBMTCkKKy8qIGdlbmVyYXRpb24gbnVtYmVyIG9jY3VwaWVzIDcgYml0cyBzdGFydGluZyBmcm9tIDAgdXAgdG8gNiAqLworI2RlZmluZSBHRVRfR0VORVJBVElPTl9OVU1CRVIob2Zmc2V0KSAoKG9mZnNldCkgJiAweDdmTEwpCisjZGVmaW5lIE1BWF9HRU5FUkFUSU9OX05VTUJFUiAgMTI3CisKKyNkZWZpbmUgU0VUX0dFTkVSQVRJT05fTlVNQkVSKG9mZnNldCxnZW5fbnVtYmVyKSAoR0VUX0hBU0hfVkFMVUUob2Zmc2V0KXwoZ2VuX251bWJlcikpCisKKy8qCisgKiBQaWN0dXJlIHJlcHJlc2VudHMgYW4gaW50ZXJuYWwgbm9kZSBvZiB0aGUgcmVpc2VyZnMgdHJlZQorICogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogfCAgICAgIHwgIEFycmF5IG9mICAgICB8ICBBcnJheSBvZiAgICAgICAgIHwgIEZyZWUgICAgIHwKKyAqIHxibG9jayB8ICAgIGtleXMgICAgICAgfCAgcG9pbnRlcnMgICAgICAgICB8IHNwYWNlICAgICB8CisgKiB8IGhlYWQgfCAgICAgIE4gICAgICAgIHwgICAgICBOKzEgICAgICAgICAgfCAgICAgICAgICAgfAorICogfF9fX19fX3xfX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX3wKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgRElTSyBDSElMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEaXNrIGNoaWxkIHBvaW50ZXI6IFRoZSBwb2ludGVyIGZyb20gYW4gaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZQorICAgdG8gYSBub2RlIHRoYXQgaXMgb24gZGlzay4gKi8KK3N0cnVjdCBkaXNrX2NoaWxkIHsKKwlfX2xlMzIgZGNfYmxvY2tfbnVtYmVyOwkvKiBEaXNrIGNoaWxkJ3MgYmxvY2sgbnVtYmVyLiAqLworCV9fbGUxNiBkY19zaXplOwkJLyogRGlzayBjaGlsZCdzIHVzZWQgc3BhY2UuICAgKi8KKwlfX2xlMTYgZGNfcmVzZXJ2ZWQ7Cit9OworCisjZGVmaW5lIERDX1NJWkUgKHNpemVvZihzdHJ1Y3QgZGlza19jaGlsZCkpCisjZGVmaW5lIGRjX2Jsb2NrX251bWJlcihkY19wKQkobGUzMl90b19jcHUoKGRjX3ApLT5kY19ibG9ja19udW1iZXIpKQorI2RlZmluZSBkY19zaXplKGRjX3ApCQkobGUxNl90b19jcHUoKGRjX3ApLT5kY19zaXplKSkKKyNkZWZpbmUgcHV0X2RjX2Jsb2NrX251bWJlcihkY19wLCB2YWwpICAgZG8geyAoZGNfcCktPmRjX2Jsb2NrX251bWJlciA9IGNwdV90b19sZTMyKHZhbCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgcHV0X2RjX3NpemUoZGNfcCwgdmFsKSAgIGRvIHsgKGRjX3ApLT5kY19zaXplID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSgwKQorCisvKiBHZXQgZGlzayBjaGlsZCBieSBidWZmZXIgaGVhZGVyIGFuZCBwb3NpdGlvbiBpbiB0aGUgdHJlZSBub2RlLiAqLworI2RlZmluZSBCX05fQ0hJTEQocF9zX2JoLG5fcG9zKSAgKChzdHJ1Y3QgZGlza19jaGlsZCAqKVwKKygocF9zX2JoKS0+Yl9kYXRhK0JMS0hfU0laRStCX05SX0lURU1TKHBfc19iaCkqS0VZX1NJWkUrRENfU0laRSoobl9wb3MpKSkKKworLyogR2V0IGRpc2sgY2hpbGQgbnVtYmVyIGJ5IGJ1ZmZlciBoZWFkZXIgYW5kIHBvc2l0aW9uIGluIHRoZSB0cmVlIG5vZGUuICovCisjZGVmaW5lIEJfTl9DSElMRF9OVU0ocF9zX2JoLG5fcG9zKSAoZGNfYmxvY2tfbnVtYmVyKEJfTl9DSElMRChwX3NfYmgsbl9wb3MpKSkKKyNkZWZpbmUgUFVUX0JfTl9DSElMRF9OVU0ocF9zX2JoLG5fcG9zLCB2YWwpIChwdXRfZGNfYmxvY2tfbnVtYmVyKEJfTl9DSElMRChwX3NfYmgsbl9wb3MpLCB2YWwgKSkKKworIC8qIG1heGltYWwgdmFsdWUgb2YgZmllbGQgY2hpbGRfc2l6ZSBpbiBzdHJ1Y3R1cmUgZGlza19jaGlsZCAqLworIC8qIGNoaWxkIHNpemUgaXMgdGhlIGNvbWJpbmVkIHNpemUgb2YgYWxsIGl0ZW1zIGFuZCB0aGVpciBoZWFkZXJzICovCisjZGVmaW5lIE1BWF9DSElMRF9TSVpFKGJoKSAoKGludCkoIChiaCktPmJfc2l6ZSAtIEJMS0hfU0laRSApKQorCisvKiBhbW91bnQgb2YgdXNlZCBzcGFjZSBpbiBidWZmZXIgKG5vdCBpbmNsdWRpbmcgYmxvY2sgaGVhZCkgKi8KKyNkZWZpbmUgQl9DSElMRF9TSVpFKGN1cikgKE1BWF9DSElMRF9TSVpFKGN1ciktKEJfRlJFRV9TUEFDRShjdXIpKSkKKworLyogbWF4IGFuZCBtaW4gbnVtYmVyIG9mIGtleXMgaW4gaW50ZXJuYWwgbm9kZSAqLworI2RlZmluZSBNQVhfTlJfS0VZKGJoKSAoIChNQVhfQ0hJTERfU0laRShiaCktRENfU0laRSkvKEtFWV9TSVpFK0RDX1NJWkUpICkKKyNkZWZpbmUgTUlOX05SX0tFWShiaCkgICAgKE1BWF9OUl9LRVkoYmgpLzIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICBQQVRIIFNUUlVDVFVSRVMgQU5EIERFRklORVMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU2VhcmNoX2J5X2tleSBmaWxscyB1cCB0aGUgcGF0aCBmcm9tIHRoZSByb290IHRvIHRoZSBsZWFmIGFzIGl0IGRlc2NlbmRzIHRoZSB0cmVlIGxvb2tpbmcgZm9yIHRoZQorICAga2V5LiAgSXQgdXNlcyByZWlzZXJmc19icmVhZCB0byB0cnkgdG8gZmluZCBidWZmZXJzIGluIHRoZSBjYWNoZSBnaXZlbiB0aGVpciBibG9jayBudW1iZXIuICBJZiBpdAorICAgZG9lcyBub3QgZmluZCB0aGVtIGluIHRoZSBjYWNoZSBpdCByZWFkcyB0aGVtIGZyb20gZGlzay4gIEZvciBlYWNoIG5vZGUgc2VhcmNoX2J5X2tleSBmaW5kcyB1c2luZworICAgcmVpc2VyZnNfYnJlYWQgaXQgdGhlbiB1c2VzIGJpbl9zZWFyY2ggdG8gbG9vayB0aHJvdWdoIHRoYXQgbm9kZS4gIGJpbl9zZWFyY2ggd2lsbCBmaW5kIHRoZQorICAgcG9zaXRpb24gb2YgdGhlIGJsb2NrX251bWJlciBvZiB0aGUgbmV4dCBub2RlIGlmIGl0IGlzIGxvb2tpbmcgdGhyb3VnaCBhbiBpbnRlcm5hbCBub2RlLiAgSWYgaXQKKyAgIGlzIGxvb2tpbmcgdGhyb3VnaCBhIGxlYWYgbm9kZSBiaW5fc2VhcmNoIHdpbGwgZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gd2hpY2ggaGFzIGtleSBlaXRoZXIKKyAgIGVxdWFsIHRvIGdpdmVuIGtleSwgb3Igd2hpY2ggaXMgdGhlIG1heGltYWwga2V5IGxlc3MgdGhhbiB0aGUgZ2l2ZW4ga2V5LiAqLworCitzdHJ1Y3QgcGF0aF9lbGVtZW50IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBlX2J1ZmZlcjsJLyogUG9pbnRlciB0byB0aGUgYnVmZmVyIGF0IHRoZSBwYXRoIGluIHRoZSB0cmVlLiAqLworCWludCBwZV9wb3NpdGlvbjsJLyogUG9zaXRpb24gaW4gdGhlIHRyZWUgbm9kZSB3aGljaCBpcyBwbGFjZWQgaW4gdGhlICovCisJLyogYnVmZmVyIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworI2RlZmluZSBNQVhfSEVJR0hUIDUJCS8qIG1heGltYWwgaGVpZ2h0IG9mIGEgdHJlZS4gZG9uJ3QgY2hhbmdlIHRoaXMgd2l0aG91dCBjaGFuZ2luZyBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqLworI2RlZmluZSBFWFRFTkRFRF9NQVhfSEVJR0hUICAgICAgICAgNwkvKiBNdXN0IGJlIGVxdWFscyBNQVhfSEVJR0hUICsgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAqLworI2RlZmluZSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICAgMgkvKiBNdXN0IGJlIGVxdWFsIHRvIGF0IGxlYXN0IDIuICovCisKKyNkZWZpbmUgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUIDEJLyogTXVzdCBiZSBlcXVhbCB0byBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUIC0gMSAqLworI2RlZmluZSBNQVhfRkVCX1NJWkUgNgkJLyogdGhpcyBNVVNUIGJlIE1BWF9IRUlHSFQgKyAxLiBTZWUgYWJvdXQgRkVCIGJlbG93ICovCisKKy8qIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aG8gdGhlIGFuY2VzdG9ycyBvZiBub2RlcyBhcmUuICBXaGVuIHdlCisgICBwZXJmb3JtIGEgc2VhcmNoIHdlIHJlY29yZCB3aGljaCBub2RlcyB3ZXJlIHZpc2l0ZWQgd2hpbGUKKyAgIGRlc2NlbmRpbmcgdGhlIHRyZWUgbG9va2luZyBmb3IgdGhlIG5vZGUgd2Ugc2VhcmNoZWQgZm9yLiBUaGlzIGxpc3QKKyAgIG9mIG5vZGVzIGlzIGNhbGxlZCB0aGUgcGF0aC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB3aGlsZQorICAgcGVyZm9ybWluZyBiYWxhbmNpbmcuICBOb3RlIHRoYXQgdGhpcyBwYXRoIGluZm9ybWF0aW9uIG1heSBiZWNvbWUKKyAgIGludmFsaWQsIGFuZCB0aGlzIG1lYW5zIHdlIG11c3QgY2hlY2sgaXQgd2hlbiB1c2luZyBpdCB0byBzZWUgaWYgaXQKKyAgIGlzIHN0aWxsIHZhbGlkLiBZb3UnbGwgbmVlZCB0byByZWFkIHNlYXJjaF9ieV9rZXkgYW5kIHRoZSBjb21tZW50cworICAgaW4gaXQsIGVzcGVjaWFsbHkgYWJvdXQgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoKSwgdG8gdW5kZXJzdGFuZAorICAgdGhpcyBzdHJ1Y3R1cmUuICAKKworUGF0aHMgbWFrZSB0aGUgY29kZSBzbyBtdWNoIGhhcmRlciB0byB3b3JrIHdpdGggYW5kIGRlYnVnLi4uLiBBbgorZW5vcm1vdXMgbnVtYmVyIG9mIGJ1Z3MgYXJlIGR1ZSB0byB0aGVtLCBhbmQgdHJ5aW5nIHRvIHdyaXRlIG9yIG1vZGlmeQorY29kZSB0aGF0IHVzZXMgdGhlbSBqdXN0IG1ha2VzIG15IGhlYWQgaHVydC4gIFRoZXkgYXJlIGJhc2VkIG9uIGFuCitleGNlc3NpdmUgZWZmb3J0IHRvIGF2b2lkIGRpc3R1cmJpbmcgdGhlIHByZWNpb3VzIFZGUyBjb2RlLjotKCBUaGUKK2dvZHMgb25seSBrbm93IGhvdyB3ZSBhcmUgZ29pbmcgdG8gU01QIHRoZSBjb2RlIHRoYXQgdXNlcyB0aGVtLgorem5vZGVzIGFyZSB0aGUgd2F5ISAqLworCisjZGVmaW5lIFBBVEhfUkVBREEJMHgxCS8qIGRvIHJlYWQgYWhlYWQgKi8KKyNkZWZpbmUgUEFUSF9SRUFEQV9CQUNLIDB4MgkvKiByZWFkIGJhY2t3YXJkcyAqLworCitzdHJ1Y3QgdHJlZXBhdGggeworCWludCBwYXRoX2xlbmd0aDsJLyogTGVuZ3RoIG9mIHRoZSBhcnJheSBhYm92ZS4gICAqLworCWludCByZWFkYTsKKwlzdHJ1Y3QgcGF0aF9lbGVtZW50IHBhdGhfZWxlbWVudHNbRVhURU5ERURfTUFYX0hFSUdIVF07CS8qIEFycmF5IG9mIHRoZSBwYXRoIGVsZW1lbnRzLiAgKi8KKwlpbnQgcG9zX2luX2l0ZW07Cit9OworCisjZGVmaW5lIHBvc19pbl9pdGVtKHBhdGgpICgocGF0aCktPnBvc19pbl9pdGVtKQorCisjZGVmaW5lIElOSVRJQUxJWkVfUEFUSCh2YXIpIFwKK3N0cnVjdCB0cmVlcGF0aCB2YXIgPSB7LnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAucmVhZGEgPSAwLH0KKworLyogR2V0IHBhdGggZWxlbWVudCBieSBwYXRoIGFuZCBwYXRoIHBvc2l0aW9uLiAqLworI2RlZmluZSBQQVRIX09GRlNFVF9QRUxFTUVOVChwX3NfcGF0aCxuX29mZnNldCkgICgocF9zX3BhdGgpLT5wYXRoX2VsZW1lbnRzICsobl9vZmZzZXQpKQorCisvKiBHZXQgYnVmZmVyIGhlYWRlciBhdCB0aGUgcGF0aCBieSBwYXRoIGFuZCBwYXRoIHBvc2l0aW9uLiAqLworI2RlZmluZSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLG5fb2Zmc2V0KSAgIChQQVRIX09GRlNFVF9QRUxFTUVOVChwX3NfcGF0aCxuX29mZnNldCktPnBlX2J1ZmZlcikKKworLyogR2V0IHBvc2l0aW9uIGluIHRoZSBlbGVtZW50IGF0IHRoZSBwYXRoIGJ5IHBhdGggYW5kIHBhdGggcG9zaXRpb24uICovCisjZGVmaW5lIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLG5fb2Zmc2V0KSAoUEFUSF9PRkZTRVRfUEVMRU1FTlQocF9zX3BhdGgsbl9vZmZzZXQpLT5wZV9wb3NpdGlvbikKKworI2RlZmluZSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCkgKFBBVEhfT0ZGU0VUX1BCVUZGRVIoKHBfc19wYXRoKSwgKHBfc19wYXRoKS0+cGF0aF9sZW5ndGgpKQorCQkJCS8qIHlvdSBrbm93LCB0byB0aGUgcGVyc29uIHdobyBkaWRuJ3QKKwkJCQkgICB3cml0ZSB0aGlzIHRoZSBtYWNybyBuYW1lIGRvZXMgbm90CisJCQkJICAgYXQgZmlyc3Qgc3VnZ2VzdCB3aGF0IGl0IGRvZXMuCisJCQkJICAgTWF5YmUgUE9TSVRJT05fRlJPTV9QQVRIX0VORD8gT3IKKwkJCQkgICBtYXliZSB3ZSBzaG91bGQganVzdCBmb2N1cyBvbgorCQkJCSAgIGR1bXBpbmcgcGF0aHMuLi4gLUhhbnMgKi8KKyNkZWZpbmUgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19wYXRoKSAoUEFUSF9PRkZTRVRfUE9TSVRJT04oKHBfc19wYXRoKSwgKHBfc19wYXRoKS0+cGF0aF9sZW5ndGgpKQorCisjZGVmaW5lIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpLFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkpCisKKy8qIGluIGRvX2JhbGFuY2UgbGVhZiBoYXMgaCA9PSAwIGluIGNvbnRyYXN0IHdpdGggcGF0aCBzdHJ1Y3R1cmUsCisgICB3aGVyZSByb290IGhhcyBsZXZlbCA9PSAwLiBUaGF0IGlzIHdoeSB3ZSBuZWVkIHRoZXNlIGRlZmluZXMgKi8KKyNkZWZpbmUgUEFUSF9IX1BCVUZGRVIocF9zX3BhdGgsIGgpIFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc19wYXRoLCBwX3NfcGF0aC0+cGF0aF9sZW5ndGggLSAoaCkpCS8qIHRiLT5TW2hdICovCisjZGVmaW5lIFBBVEhfSF9QUEFSRU5UKHBhdGgsIGgpIFBBVEhfSF9QQlVGRkVSIChwYXRoLCAoaCkgKyAxKQkvKiB0Yi0+RltoXSBvciB0Yi0+U1swXS0+Yl9wYXJlbnQgKi8KKyNkZWZpbmUgUEFUSF9IX1BPU0lUSU9OKHBhdGgsIGgpIFBBVEhfT0ZGU0VUX1BPU0lUSU9OIChwYXRoLCBwYXRoLT5wYXRoX2xlbmd0aCAtIChoKSkKKyNkZWZpbmUgUEFUSF9IX0JfSVRFTV9PUkRFUihwYXRoLCBoKSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCArIDEpCS8qIHRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIgKi8KKworI2RlZmluZSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCkgKChwX3NfcGF0aCktPnBhdGhfbGVuZ3RoIC0gKG5faCkpCisKKyNkZWZpbmUgZ2V0X2xhc3RfYmgocGF0aCkgUEFUSF9QTEFTVF9CVUZGRVIocGF0aCkKKyNkZWZpbmUgZ2V0X2loKHBhdGgpIFBBVEhfUElURU1fSEVBRChwYXRoKQorI2RlZmluZSBnZXRfaXRlbV9wb3MocGF0aCkgUEFUSF9MQVNUX1BPU0lUSU9OKHBhdGgpCisjZGVmaW5lIGdldF9pdGVtKHBhdGgpICgodm9pZCAqKUJfTl9QSVRFTShQQVRIX1BMQVNUX0JVRkZFUihwYXRoKSwgUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKSkpCisjZGVmaW5lIGl0ZW1fbW92ZWQoaWgscGF0aCkgY29tcF9pdGVtcyhpaCwgcGF0aCkKKyNkZWZpbmUgcGF0aF9jaGFuZ2VkKGloLHBhdGgpIGNvbXBfaXRlbXMgKGloLCBwYXRoKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgIE1JU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNpemUgb2YgcG9pbnRlciB0byB0aGUgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KKyNkZWZpbmUgVU5GTV9QX1NJWkUgKHNpemVvZih1bnBfdCkpCisjZGVmaW5lIFVORk1fUF9TSElGVCAyCisKKy8vIGluIGluLWNvcmUgaW5vZGUga2V5IGlzIHN0b3JlZCBvbiBsZSBmb3JtCisjZGVmaW5lIElOT0RFX1BLRVkoaW5vZGUpICgoc3RydWN0IHJlaXNlcmZzX2tleSAqKShSRUlTRVJGU19JKGlub2RlKS0+aV9rZXkpKQorCisjZGVmaW5lIE1BWF9VTF9JTlQgMHhmZmZmZmZmZgorI2RlZmluZSBNQVhfSU5UICAgIDB4N2ZmZmZmZgorI2RlZmluZSBNQVhfVVNfSU5UIDB4ZmZmZgorCisvLyByZWlzZXJmcyB2ZXJzaW9uIDIgaGFzIG1heCBvZmZzZXQgNjAgYml0cy4gVmVyc2lvbiAxIC0gMzIgYml0IG9mZnNldAorI2RlZmluZSBVMzJfTUFYICh+KF9fdTMyKTApCisKK3N0YXRpYyBfX2lubGluZV9fIGxvZmZfdCBtYXhfcmVpc2VyZnNfb2Zmc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNSkKKwkJcmV0dXJuIChsb2ZmX3QpIFUzMl9NQVg7CisKKwlyZXR1cm4gKGxvZmZfdCkgKCh+KF9fdTY0KSAwKSA+PiA0KTsKK30KKworLyojZGVmaW5lIE1BWF9LRVlfVU5JUVVFTkVTUwlNQVhfVUxfSU5UKi8KKyNkZWZpbmUgTUFYX0tFWV9PQkpFQ1RJRAlNQVhfVUxfSU5UCisKKyNkZWZpbmUgTUFYX0JfTlVNICBNQVhfVUxfSU5UCisjZGVmaW5lIE1BWF9GQ19OVU0gTUFYX1VTX0lOVAorCisvKiB0aGUgcHVycG9zZSBpcyB0byBkZXRlY3Qgb3ZlcmZsb3cgb2YgYW4gdW5zaWduZWQgc2hvcnQgKi8KKyNkZWZpbmUgUkVJU0VSRlNfTElOS19NQVggKE1BWF9VU19JTlQgLSAxMDAwKQorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgaW4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gYW5kIHJlaXNlcmZzX2FwcGVuZF9pdGVtICAqLworI2RlZmluZSBSRUlTRVJGU19LRVJORUxfTUVNCQkwCS8qIHJlaXNlcmZzIGtlcm5lbCBtZW1vcnkgbW9kZSAgKi8KKyNkZWZpbmUgUkVJU0VSRlNfVVNFUl9NRU0JCTEJLyogcmVpc2VyZnMgdXNlciBtZW1vcnkgbW9kZSAgICAgICAgICAgICovCisKKyNkZWZpbmUgZnNfZ2VuZXJhdGlvbihzKSAoUkVJU0VSRlNfU0IocyktPnNfZ2VuZXJhdGlvbl9jb3VudGVyKQorI2RlZmluZSBnZXRfZ2VuZXJhdGlvbihzKSBhdG9taWNfcmVhZCAoJmZzX2dlbmVyYXRpb24ocykpCisjZGVmaW5lIEZJTEVTWVNURU1fQ0hBTkdFRF9UQih0YikgIChnZXRfZ2VuZXJhdGlvbigodGIpLT50Yl9zYikgIT0gKHRiKS0+ZnNfZ2VuKQorI2RlZmluZSBfX2ZzX2NoYW5nZWQoZ2VuLHMpIChnZW4gIT0gZ2V0X2dlbmVyYXRpb24gKHMpKQorI2RlZmluZSBmc19jaGFuZ2VkKGdlbixzKSAoe2NvbmRfcmVzY2hlZCgpOyBfX2ZzX2NoYW5nZWQoZ2VuLCBzKTt9KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICBGSVhBVEUgTk9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVklfVFlQRV9MRUZUX01FUkdFQUJMRSAxCisjZGVmaW5lIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFIDIKKworLyogVG8gbWFrZSBhbnkgY2hhbmdlcyBpbiB0aGUgdHJlZSB3ZSBhbHdheXMgZmlyc3QgZmluZCBub2RlLCB0aGF0CisgICBjb250YWlucyBpdGVtIHRvIGJlIGNoYW5nZWQvZGVsZXRlZCBvciBwbGFjZSB0byBpbnNlcnQgYSBuZXcKKyAgIGl0ZW0uIFdlIGNhbGwgdGhpcyBub2RlIFMuIFRvIGRvIGJhbGFuY2luZyB3ZSBuZWVkIHRvIGRlY2lkZSB3aGF0CisgICB3ZSB3aWxsIHNoaWZ0IHRvIGxlZnQvcmlnaHQgbmVpZ2hib3IsIG9yIHRvIGEgbmV3IG5vZGUsIHdoZXJlIG5ldworICAgaXRlbSB3aWxsIGJlIGV0Yy4gVG8gbWFrZSB0aGlzIGFuYWx5c2lzIHNpbXBsZXIgd2UgYnVpbGQgdmlydHVhbAorICAgbm9kZS4gVmlydHVhbCBub2RlIGlzIGFuIGFycmF5IG9mIGl0ZW1zLCB0aGF0IHdpbGwgcmVwbGFjZSBpdGVtcyBvZgorICAgbm9kZSBTLiAoRm9yIGluc3RhbmNlIGlmIHdlIGFyZSBnb2luZyB0byBkZWxldGUgYW4gaXRlbSwgdmlydHVhbAorICAgbm9kZSBkb2VzIG5vdCBjb250YWluIGl0KS4gVmlydHVhbCBub2RlIGtlZXBzIGluZm9ybWF0aW9uIGFib3V0CisgICBpdGVtIHNpemVzIGFuZCB0eXBlcywgbWVyZ2VhYmlsaXR5IG9mIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLCBzaXplcworICAgb2YgYWxsIGVudHJpZXMgaW4gZGlyZWN0b3J5IGl0ZW0uIFdlIHVzZSB0aGlzIGFycmF5IG9mIGl0ZW1zIHdoZW4KKyAgIGNhbGN1bGF0aW5nIHdoYXQgd2UgY2FuIHNoaWZ0IHRvIG5laWdoYm9ycyBhbmQgaG93IG1hbnkgbm9kZXMgd2UKKyAgIGhhdmUgdG8gaGF2ZSBpZiB3ZSBkbyBub3QgYW55IHNoaWZ0aW5ncywgaWYgd2Ugc2hpZnQgdG8gbGVmdC9yaWdodAorICAgbmVpZ2hib3Igb3IgdG8gYm90aC4gKi8KK3N0cnVjdCB2aXJ0dWFsX2l0ZW0geworCWludCB2aV9pbmRleDsJCS8vIGluZGV4IGluIHRoZSBhcnJheSBvZiBpdGVtIG9wZXJhdGlvbnMKKwl1bnNpZ25lZCBzaG9ydCB2aV90eXBlOwkvLyBsZWZ0L3JpZ2h0IG1lcmdlYWJpbGl0eQorCXVuc2lnbmVkIHNob3J0IHZpX2l0ZW1fbGVuOwkvKiBsZW5ndGggb2YgaXRlbSB0aGF0IGl0IHdpbGwgaGF2ZSBhZnRlciBiYWxhbmNpbmcgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICp2aV9paDsKKwljb25zdCBjaGFyICp2aV9pdGVtOwkvLyBib2R5IG9mIGl0ZW0gKG9sZCBvciBuZXcpCisJY29uc3Qgdm9pZCAqdmlfbmV3X2RhdGE7CS8vIDAgYWx3YXlzIGJ1dCBwYXN0ZSBtb2RlCisJdm9pZCAqdmlfdWFyZWE7CQkvLyBpdGVtIHNwZWNpZmljIGFyZWEKK307CisKK3N0cnVjdCB2aXJ0dWFsX25vZGUgeworCWNoYXIgKnZuX2ZyZWVfcHRyOwkvKiB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCisJdW5zaWduZWQgc2hvcnQgdm5fbnJfaXRlbTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIHZpcnR1YWwgbm9kZSAqLworCXNob3J0IHZuX3NpemU7CQkvKiBzaXplIG9mIG5vZGUgLCB0aGF0IG5vZGUgd291bGQgaGF2ZSBpZiBpdCBoYXMgdW5saW1pdGVkIHNpemUgYW5kIG5vIGJhbGFuY2luZyBpcyBwZXJmb3JtZWQgKi8KKwlzaG9ydCB2bl9tb2RlOwkJLyogbW9kZSBvZiBiYWxhbmNpbmcgKHBhc3RlLCBpbnNlcnQsIGRlbGV0ZSwgY3V0KSAqLworCXNob3J0IHZuX2FmZmVjdGVkX2l0ZW1fbnVtOworCXNob3J0IHZuX3Bvc19pbl9pdGVtOworCXN0cnVjdCBpdGVtX2hlYWQgKnZuX2luc19paDsJLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSwgMCBmb3Igb3RoZXIgbW9kZXMgKi8KKwljb25zdCB2b2lkICp2bl9kYXRhOworCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZuX3ZpOwkvKiBhcnJheSBvZiBpdGVtcyAoaW5jbHVkaW5nIGEgbmV3IG9uZSwgZXhjbHVkaW5nIGl0ZW0gdG8gYmUgZGVsZXRlZCkgKi8KK307CisKKy8qIHVzZWQgYnkgZGlyZWN0b3J5IGl0ZW1zIHdoZW4gY3JlYXRpbmcgdmlydHVhbCBub2RlcyAqLworc3RydWN0IGRpcmVudHJ5X3VhcmVhIHsKKwlpbnQgZmxhZ3M7CisJX191MTYgZW50cnlfY291bnQ7CisJX191MTYgZW50cnlfc2l6ZXNbMV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgIFRSRUUgQkFMQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyB0ZW1wb3Jhcnkgc3RydWN0dXJlIGlzIHVzZWQgaW4gdHJlZSBiYWxhbmNlIGFsZ29yaXRobXMsIGFuZAorICAgY29uc3RydWN0ZWQgYXMgd2UgZ28gdG8gdGhlIGV4dGVudCB0aGF0IGl0cyB2YXJpb3VzIHBhcnRzIGFyZQorICAgbmVlZGVkLiAgSXQgY29udGFpbnMgYXJyYXlzIG9mIG5vZGVzIHRoYXQgY2FuIHBvdGVudGlhbGx5IGJlCisgICBpbnZvbHZlZCBpbiB0aGUgYmFsYW5jaW5nIG9mIG5vZGUgUywgYW5kIHBhcmFtZXRlcnMgdGhhdCBkZWZpbmUgaG93CisgICBlYWNoIG9mIHRoZSBub2RlcyBtdXN0IGJlIGJhbGFuY2VkLiAgTm90ZSB0aGF0IGluIHRoZXNlIGFsZ29yaXRobXMKKyAgIGZvciBiYWxhbmNpbmcgdGhlIHdvcnN0IGNhc2UgaXMgdG8gbmVlZCB0byBiYWxhbmNlIHRoZSBjdXJyZW50IG5vZGUKKyAgIFMgYW5kIHRoZSBsZWZ0IGFuZCByaWdodCBuZWlnaGJvcnMgYW5kIGFsbCBvZiB0aGVpciBwYXJlbnRzIHBsdXMKKyAgIGNyZWF0ZSBhIG5ldyBub2RlLiAgV2UgaW1wbGVtZW50IFMxIGJhbGFuY2luZyBmb3IgdGhlIGxlYWYgbm9kZXMKKyAgIGFuZCBTMCBiYWxhbmNpbmcgZm9yIHRoZSBpbnRlcm5hbCBub2RlcyAoUzEgYW5kIFMwIGFyZSBkZWZpbmVkIGluCisgICBvdXIgcGFwZXJzLikqLworCisjZGVmaW5lIE1BWF9GUkVFX0JMT0NLIDcJLyogc2l6ZSBvZiB0aGUgYXJyYXkgb2YgYnVmZmVycyB0byBmcmVlIGF0IGVuZCBvZiBkb19iYWxhbmNlICovCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIEZFQiBibG9ja25ycyBvbiBhIHNpbmdsZSBsZXZlbCAqLworI2RlZmluZSBNQVhfQU1PVU5UX05FRURFRCAyCisKKy8qIHNvbWVkYXkgc29tZWJvZHkgd2lsbCBwcmVmaXggZXZlcnkgZmllbGQgaW4gdGhpcyBzdHJ1Y3Qgd2l0aCB0Yl8gKi8KK3N0cnVjdCB0cmVlX2JhbGFuY2UgeworCWludCB0Yl9tb2RlOworCWludCBuZWVkX2JhbGFuY2VfZGlydHk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICp0Yl9zYjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0cmFuc2FjdGlvbl9oYW5kbGU7CisJc3RydWN0IHRyZWVwYXRoICp0Yl9wYXRoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgbGVmdCBuZWlnaGJvcnMgb2Ygbm9kZXMgaW4gdGhlIHBhdGggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlJbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIHJpZ2h0IG5laWdoYm9ycyBvZiBub2RlcyBpbiB0aGUgcGF0aCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqRkxbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIGxlZnQgIG5laWdoYm9ycyAgICAgICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpGUltNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgZmF0aGVycyBvZiB0aGUgcmlnaHQgbmVpZ2hib3JzICAgICAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkNGTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgY29tbW9uIHBhcmVudHMgb2YgY2VudGVyIG5vZGUgYW5kIGl0cyBsZWZ0IG5laWdoYm9yICAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqQ0ZSW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yICovCisKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkZFQltNQVhfRkVCX1NJWkVdOwkvKiBhcnJheSBvZiBlbXB0eSBidWZmZXJzLiBOdW1iZXIgb2YgYnVmZmVycyBpbiBhcnJheSBlcXVhbHMKKwkJCQkJCSAgIGN1cl9ibGtudW0uICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICp1c2VkW01BWF9GRUJfU0laRV07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp0aHJvd25bTUFYX0ZFQl9TSVpFXTsKKwlpbnQgbG51bVtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgbnVtYmVyIG9mIGl0ZW1zIHdoaWNoIG11c3QgYmUKKwkJCQkgICBzaGlmdGVkIHRvIHRoZSBsZWZ0IGluIG9yZGVyIHRvIGJhbGFuY2UgdGhlCisJCQkJICAgY3VycmVudCBub2RlOyBmb3IgbGVhdmVzIGluY2x1ZGVzIGl0ZW0gdGhhdAorCQkJCSAgIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQ7IGZvciBpbnRlcm5hbAorCQkJCSAgIG5vZGVzLCBpdCBpcyB0aGUgbnVtYmVyIG9mIGNoaWxkIHBvaW50ZXJzCisJCQkJICAgcmF0aGVyIHRoYW4gaXRlbXMuIEl0IGluY2x1ZGVzIHRoZSBuZXcgaXRlbQorCQkJCSAgIGJlaW5nIGNyZWF0ZWQuIFRoZSBjb2RlIHNvbWV0aW1lcyBzdWJ0cmFjdHMKKwkJCQkgICBvbmUgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygd2hvbGx5IHNoaWZ0ZWQKKwkJCQkgICBpdGVtcyBmb3Igb3RoZXIgcHVycG9zZXMuICovCisJaW50IHJudW1bTUFYX0hFSUdIVF07CS8qIHN1YnN0aXR1dGUgcmlnaHQgZm9yIGxlZnQgaW4gY29tbWVudCBhYm92ZSAqLworCWludCBsa2V5W01BWF9IRUlHSFRdOwkvKiBhcnJheSBpbmRleGVkIGJ5IGhlaWdodCBoIG1hcHBpbmcgdGhlIGtleSBkZWxpbWl0aW5nIExbaF0gYW5kCisJCQkJICAgU1toXSB0byBpdHMgaXRlbSBudW1iZXIgd2l0aGluIHRoZSBub2RlIENGTFtoXSAqLworCWludCBya2V5W01BWF9IRUlHSFRdOwkvKiBzdWJzdGl0dXRlIHIgZm9yIGwgaW4gY29tbWVudCBhYm92ZSAqLworCWludCBpbnNlcnRfc2l6ZVtNQVhfSEVJR0hUXTsJLyogdGhlIG51bWJlciBvZiBieXRlcyBieSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZnJvbQorCQkJCQkgICBTW2hdLiBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHJlbW92aW5nLiAgKi8KKwlpbnQgYmxrbnVtW01BWF9IRUlHSFRdOwkvKiBudW1iZXIgb2Ygbm9kZXMgdGhhdCB3aWxsIHJlcGxhY2Ugbm9kZSBTW2hdIGFmdGVyCisJCQkJICAgYmFsYW5jaW5nIG9uIHRoZSBsZXZlbCBoIG9mIHRoZSB0cmVlLiAgSWYgMCB0aGVuIFMgaXMKKwkJCQkgICBiZWluZyBkZWxldGVkLCBpZiAxIHRoZW4gUyBpcyByZW1haW5pbmcgYW5kIG5vIG5ldyBub2RlcworCQkJCSAgIGFyZSBiZWluZyBjcmVhdGVkLCBpZiAyIG9yIDMgdGhlbiAxIG9yIDIgbmV3IG5vZGVzIGlzCisJCQkJICAgYmVpbmcgY3JlYXRlZCAqLworCisJLyogZmllbGRzIHRoYXQgYXJlIHVzZWQgb25seSBmb3IgYmFsYW5jaW5nIGxlYXZlcyBvZiB0aGUgdHJlZSAqLworCWludCBjdXJfYmxrbnVtOwkJLyogbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyBoYXZpbmcgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZCAgICAgICAgICAgICAgICAgKi8KKwlpbnQgczBudW07CQkvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCBmYWxsIGludG8gbGVmdCBtb3N0ICBub2RlIHdoZW4gU1swXSBzcGxpdHMgICAgICovCisJaW50IHMxbnVtOwkJLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgICAqLworCWludCBzMm51bTsJCS8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBzZWNvbmQgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAgICAgKi8KKwlpbnQgbGJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yIGZyb20gdGhlICAgICAgICBsZWZ0ICAgICovCisJLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAgICAgICAgICovCisJLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgKi8KKwlpbnQgcmJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IgZnJvbSB0aGUgcmlnaHQgICAgICAgICovCisJLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAgICAgICAgICovCisJLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCBzMWJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgKi8KKwkvKiBub3RlOiBpZiBTWzBdIHNwbGl0cyBpbnRvIDMgbm9kZXMsIHRoZW4gaXRlbXMgZG8gbm90IG5lZWQgdG8gYmUgY3V0ICAqLworCWludCBzMmJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYnVmX3RvX2ZyZWVbTUFYX0ZSRUVfQkxPQ0tdOwkvKiBidWZmZXJzIHdoaWNoIGFyZSB0byBiZSBmcmVlZCBhZnRlciBkb19iYWxhbmNlIGZpbmlzaGVzIGJ5IHVuZml4X25vZGVzICovCisJY2hhciAqdm5fYnVmOwkJLyoga21hbGxvY2VkIG1lbW9yeS4gVXNlZCB0byBjcmVhdGUKKwkJCQkgICB2aXJ0dWFsIG5vZGUgYW5kIGtlZXAgbWFwIG9mCisJCQkJICAgZGlydGllZCBiaXRtYXAgYmxvY2tzICovCisJaW50IHZuX2J1Zl9zaXplOwkvKiBzaXplIG9mIHRoZSB2bl9idWYgKi8KKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp0Yl92bjsJLyogVk4gc3RhcnRzIGFmdGVyIGJpdG1hcCBvZiBiaXRtYXAgYmxvY2tzICovCisKKwlpbnQgZnNfZ2VuOwkJLyogc2F2ZWQgdmFsdWUgb2YgYHJlaXNlcmZzX2dlbmVyYXRpb24nIGNvdW50ZXIKKwkJCQkgICBzZWUgRklMRVNZU1RFTV9DSEFOR0VEKCkgbWFjcm8gaW4gcmVpc2VyZnNfZnMuaCAqLworI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKKwlzdHJ1Y3QgaW5fY29yZV9rZXkga2V5OwkvKiBrZXkgcG9pbnRlciwgdG8gcGFzcyB0byBibG9jayBhbGxvY2F0b3Igb3IKKwkJCQkgICBhbm90aGVyIGxvdy1sZXZlbCBzdWJzeXN0ZW0gKi8KKyNlbmRpZgorfTsKKworLyogVGhlc2UgYXJlIG1vZGVzIG9mIGJhbGFuY2luZyAqLworCisvKiBXaGVuIGluc2VydGluZyBhbiBpdGVtLiAqLworI2RlZmluZSBNX0lOU0VSVAknaScKKy8qIFdoZW4gaW5zZXJ0aW5nIGludG8gKGRpcmVjdG9yaWVzIG9ubHkpIG9yIGFwcGVuZGluZyBvbnRvIGFuIGFscmVhZHkKKyAgIGV4aXN0YW50IGl0ZW0uICovCisjZGVmaW5lIE1fUEFTVEUJCSdwJworLyogV2hlbiBkZWxldGluZyBhbiBpdGVtLiAqLworI2RlZmluZSBNX0RFTEVURQknZCcKKy8qIFdoZW4gdHJ1bmNhdGluZyBhbiBpdGVtIG9yIHJlbW92aW5nIGFuIGVudHJ5IGZyb20gYSAoZGlyZWN0b3J5KSBpdGVtLiAqLworI2RlZmluZSBNX0NVVCAJCSdjJworCisvKiB1c2VkIHdoZW4gYmFsYW5jaW5nIG9uIGxlYWYgbGV2ZWwgc2tpcHBlZCAoaW4gcmVpc2VyZnNjaykgKi8KKyNkZWZpbmUgTV9JTlRFUk5BTAknbicKKworLyogV2hlbiBmdXJ0aGVyIGJhbGFuY2luZyBpcyBub3QgbmVlZGVkLCB0aGVuIGRvX2JhbGFuY2UgZG9lcyBub3QgbmVlZAorICAgdG8gYmUgY2FsbGVkLiAqLworI2RlZmluZSBNX1NLSVBfQkFMQU5DSU5HIAkJJ3MnCisjZGVmaW5lIE1fQ09OVkVSVAkndicKKworLyogbW9kZXMgb2YgbGVhZl9tb3ZlX2l0ZW1zICovCisjZGVmaW5lIExFQUZfRlJPTV9TX1RPX0wgMAorI2RlZmluZSBMRUFGX0ZST01fU19UT19SIDEKKyNkZWZpbmUgTEVBRl9GUk9NX1JfVE9fTCAyCisjZGVmaW5lIExFQUZfRlJPTV9MX1RPX1IgMworI2RlZmluZSBMRUFGX0ZST01fU19UT19TTkVXIDQKKworI2RlZmluZSBGSVJTVF9UT19MQVNUIDAKKyNkZWZpbmUgTEFTVF9UT19GSVJTVCAxCisKKy8qIHVzZWQgaW4gZG9fYmFsYW5jZSBmb3IgcGFzc2luZyBwYXJlbnQgb2Ygbm9kZSBpbmZvcm1hdGlvbiB0aGF0IGhhcworICAgYmVlbiBnb3R0ZW4gZnJvbSB0YiBzdHJ1Y3QgKi8KK3N0cnVjdCBidWZmZXJfaW5mbyB7CisJc3RydWN0IHRyZWVfYmFsYW5jZSAqdGI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaV9iaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpX3BhcmVudDsKKwlpbnQgYmlfcG9zaXRpb247Cit9OworCisvKiB0aGVyZSBhcmUgNCB0eXBlcyBvZiBpdGVtczogc3RhdCBkYXRhLCBkaXJlY3RvcnkgaXRlbSwgaW5kaXJlY3QsIGRpcmVjdC4KKystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8CSAgICAgICAgICAgIHwgIGtfb2Zmc2V0ICB8IGtfdW5pcXVlbmVzcyB8IG1lcmdlYWJsZT8gfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKK3wgICAgIHN0YXQgZGF0YSAgICAgfAkwICAgICAgICB8ICAgICAgMCAgICAgICB8ICAgbm8gICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKK3wgMXN0IGRpcmVjdG9yeSBpdGVtfCBET1RfT0ZGU0VUIHxESVJFTlRSWV9VTklRVUVORVNTfCAgIG5vICAgICAgIHwgCit8IG5vbiAxc3QgZGlyZWN0b3J5IHwgaGFzaCB2YWx1ZSB8ICAgICAgICAgICAgICB8ICAgeWVzICAgICAgfAorfCAgICAgaXRlbSAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCit8IGluZGlyZWN0IGl0ZW0gICAgIHwgb2Zmc2V0ICsgMSB8VFlQRV9JTkRJUkVDVCB8ICAgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGluZGlyZWN0IGl0ZW0gb2YgdGhlIG9iamVjdAorKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKK3wgZGlyZWN0IGl0ZW0gICAgICAgfCBvZmZzZXQgKyAxIHxUWVBFX0RJUkVDVCAgIHwgaWYgbm90IHRoaXMgaXMgbm90IHRoZSBmaXJzdCBkaXJlY3QgaXRlbSBvZiB0aGUgb2JqZWN0CisrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKworKi8KKworc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyB7CisJaW50ICgqYnl0ZXNfbnVtYmVyKSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSk7CisJdm9pZCAoKmRlY3JlbWVudF9rZXkpIChzdHJ1Y3QgY3B1X2tleSAqKTsKKwlpbnQgKCppc19sZWZ0X21lcmdlYWJsZSkgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBpaCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYnNpemUpOworCXZvaWQgKCpwcmludF9pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICppdGVtKTsKKwl2b2lkICgqY2hlY2tfaXRlbSkgKHN0cnVjdCBpdGVtX2hlYWQgKiwgY2hhciAqaXRlbSk7CisKKwlpbnQgKCpjcmVhdGVfdmkpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwKKwkJCSAgaW50IGlzX2FmZmVjdGVkLCBpbnQgaW5zZXJ0X3NpemUpOworCWludCAoKmNoZWNrX2xlZnQpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAorCQkJICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCk7CisJaW50ICgqY2hlY2tfcmlnaHQpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKTsKKwlpbnQgKCpwYXJ0X3NpemUpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcm9tLCBpbnQgdG8pOworCWludCAoKnVuaXRfbnVtKSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKTsKKwl2b2lkICgqcHJpbnRfdmkpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpOworfTsKKworZXh0ZXJuIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgKml0ZW1fb3BzW1RZUEVfQU5ZICsgMV07CisKKyNkZWZpbmUgb3BfYnl0ZXNfbnVtYmVyKGloLGJzaXplKSAgICAgICAgICAgICAgICAgICAgaXRlbV9vcHNbbGVfaWhfa190eXBlIChpaCldLT5ieXRlc19udW1iZXIgKGloLCBic2l6ZSkKKyNkZWZpbmUgb3BfaXNfbGVmdF9tZXJnZWFibGUoa2V5LGJzaXplKSAgICAgICAgICAgICAgaXRlbV9vcHNbbGVfa2V5X2tfdHlwZSAobGVfa2V5X3ZlcnNpb24gKGtleSksIGtleSldLT5pc19sZWZ0X21lcmdlYWJsZSAoa2V5LCBic2l6ZSkKKyNkZWZpbmUgb3BfcHJpbnRfaXRlbShpaCxpdGVtKSAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9vcHNbbGVfaWhfa190eXBlIChpaCldLT5wcmludF9pdGVtIChpaCwgaXRlbSkKKyNkZWZpbmUgb3BfY2hlY2tfaXRlbShpaCxpdGVtKSAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9vcHNbbGVfaWhfa190eXBlIChpaCldLT5jaGVja19pdGVtIChpaCwgaXRlbSkKKyNkZWZpbmUgb3BfY3JlYXRlX3ZpKHZuLHZpLGlzX2FmZmVjdGVkLGluc2VydF9zaXplKSAgaXRlbV9vcHNbbGVfaWhfa190eXBlICgodmkpLT52aV9paCldLT5jcmVhdGVfdmkgKHZuLHZpLGlzX2FmZmVjdGVkLGluc2VydF9zaXplKQorI2RlZmluZSBvcF9jaGVja19sZWZ0KHZpLGZyZWUsc3RhcnRfc2tpcCxlbmRfc2tpcCkgaXRlbV9vcHNbKHZpKS0+dmlfaW5kZXhdLT5jaGVja19sZWZ0ICh2aSwgZnJlZSwgc3RhcnRfc2tpcCwgZW5kX3NraXApCisjZGVmaW5lIG9wX2NoZWNrX3JpZ2h0KHZpLGZyZWUpICAgICAgICAgICAgICAgICAgICAgIGl0ZW1fb3BzWyh2aSktPnZpX2luZGV4XS0+Y2hlY2tfcmlnaHQgKHZpLCBmcmVlKQorI2RlZmluZSBvcF9wYXJ0X3NpemUodmksZnJvbSx0bykgICAgICAgICAgICAgICAgICAgICBpdGVtX29wc1sodmkpLT52aV9pbmRleF0tPnBhcnRfc2l6ZSAodmksIGZyb20sIHRvKQorI2RlZmluZSBvcF91bml0X251bSh2aSkJCQkJICAgICBpdGVtX29wc1sodmkpLT52aV9pbmRleF0tPnVuaXRfbnVtICh2aSkKKyNkZWZpbmUgb3BfcHJpbnRfdmkodmkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9vcHNbKHZpKS0+dmlfaW5kZXhdLT5wcmludF92aSAodmkpCisKKyNkZWZpbmUgQ09NUF9TSE9SVF9LRVlTIGNvbXBfc2hvcnRfa2V5cworCisvKiBudW1iZXIgb2YgYmxvY2tzIHBvaW50ZWQgdG8gYnkgdGhlIGluZGlyZWN0IGl0ZW0gKi8KKyNkZWZpbmUgSV9VTkZNX05VTShwX3NfaWgpCSggaWhfaXRlbV9sZW4ocF9zX2loKSAvIFVORk1fUF9TSVpFICkKKworLyogdGhlIHVzZWQgc3BhY2Ugd2l0aGluIHRoZSB1bmZvcm1hdHRlZCBub2RlIGNvcnJlc3BvbmRpbmcgdG8gcG9zIHdpdGhpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IGloICovCisjZGVmaW5lIElfUE9TX1VORk1fU0laRShpaCxwb3Msc2l6ZSkgKCgocG9zKSA9PSBJX1VORk1fTlVNKGloKSAtIDEgKSA/IChzaXplKSAtIGloX2ZyZWVfc3BhY2UoaWgpIDogKHNpemUpKQorCisvKiBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmVkIGJ5IHRoZSBkaXJlY3QgaXRlbSBvciB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgdGhlIGluZGlyZWN0IGl0ZW0gcG9pbnRzIHRvICovCisKKy8qIGdldCB0aGUgaXRlbSBoZWFkZXIgKi8KKyNkZWZpbmUgQl9OX1BJVEVNX0hFQUQoYmgsaXRlbV9udW0pICggKHN0cnVjdCBpdGVtX2hlYWQgKiApKChiaCktPmJfZGF0YSArIEJMS0hfU0laRSkgKyAoaXRlbV9udW0pICkKKworLyogZ2V0IGtleSAqLworI2RlZmluZSBCX05fUERFTElNX0tFWShiaCxpdGVtX251bSkgKCAoc3RydWN0IHJlaXNlcmZzX2tleSAqICkoKGJoKS0+Yl9kYXRhICsgQkxLSF9TSVpFKSArIChpdGVtX251bSkgKQorCisvKiBnZXQgdGhlIGtleSAqLworI2RlZmluZSBCX05fUEtFWShiaCxpdGVtX251bSkgKCAmKEJfTl9QSVRFTV9IRUFEKGJoLGl0ZW1fbnVtKS0+aWhfa2V5KSApCisKKy8qIGdldCBpdGVtIGJvZHkgKi8KKyNkZWZpbmUgQl9OX1BJVEVNKGJoLGl0ZW1fbnVtKSAoIChiaCktPmJfZGF0YSArIGloX2xvY2F0aW9uKEJfTl9QSVRFTV9IRUFEKChiaCksKGl0ZW1fbnVtKSkpKQorCisvKiBnZXQgdGhlIHN0YXQgZGF0YSBieSB0aGUgYnVmZmVyIGhlYWRlciBhbmQgdGhlIGl0ZW0gb3JkZXIgKi8KKyNkZWZpbmUgQl9OX1NUQVRfREFUQShiaCxucikgXAorKCAoc3RydWN0IHN0YXRfZGF0YSAqKSgoYmgpLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihCX05fUElURU1fSEVBRCgoYmgpLChucikpKSApICkKKworICAgIC8qIGZvbGxvd2luZyBkZWZpbmVzIHVzZSByZWlzZXJmcyBidWZmZXIgaGVhZGVyIGFuZCBpdGVtIGhlYWRlciAqLworCisvKiBnZXQgc3RhdC1kYXRhICovCisjZGVmaW5lIEJfSV9TVEFUX0RBVEEoYmgsIGloKSAoIChzdHJ1Y3Qgc3RhdF9kYXRhICogKSgoYmgpLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkpICkKKworLy8gdGhpcyBpcyAzOTc2IGZvciBzaXplPT00MDk2CisjZGVmaW5lIE1BWF9ESVJFQ1RfSVRFTV9MRU4oc2l6ZSkgKChzaXplKSAtIEJMS0hfU0laRSAtIDIqSUhfU0laRSAtIFNEX1NJWkUgLSBVTkZNX1BfU0laRSkKKworLyogaW5kaXJlY3QgaXRlbXMgY29uc2lzdCBvZiBlbnRyaWVzIHdoaWNoIGNvbnRhaW4gYmxvY2tucnMsIHBvcworICAgaW5kaWNhdGVzIHdoaWNoIGVudHJ5LCBhbmQgQl9JX1BPU19VTkZNX1BPSU5URVIgcmVzb2x2ZXMgdG8gdGhlCisgICBibG9ja25yIGNvbnRhaW5lZCBieSB0aGUgZW50cnkgcG9zIHBvaW50cyB0byAqLworI2RlZmluZSBCX0lfUE9TX1VORk1fUE9JTlRFUihiaCxpaCxwb3MpIGxlMzJfdG9fY3B1KCooKCh1bnBfdCAqKUJfSV9QSVRFTShiaCxpaCkpICsgKHBvcykpKQorI2RlZmluZSBQVVRfQl9JX1BPU19VTkZNX1BPSU5URVIoYmgsaWgscG9zLCB2YWwpIGRvIHsqKCgodW5wX3QgKilCX0lfUElURU0oYmgsaWgpKSArIChwb3MpKSA9IGNwdV90b19sZTMyKHZhbCk7IH0gd2hpbGUgKDApCisKK3N0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgeworCV9fdTMyIG9iamVjdGlkOworCV9fdTMyIGRpcmlkOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICBGVU5DVElPTiBERUNMQVJBVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiNpZmRlZiBfX0tFUk5FTF9fKi8KKyNkZWZpbmUgZ2V0X2pvdXJuYWxfZGVzY19tYWdpYyhiaCkgKGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplIC0gMTIpCisKKyNkZWZpbmUgam91cm5hbF90cmFuc19oYWxmKGJsb2Nrc2l6ZSkgXAorCSgoYmxvY2tzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjKSArIHNpemVvZiAoX191MzIpIC0gMTIpIC8gc2l6ZW9mIChfX3UzMikpCisKKy8qIGpvdXJuYWwuYyBzZWUgam91cm5hbC5jIGZvciBhbGwgdGhlIGNvbW1lbnRzIGhlcmUgKi8KKworLyogZmlyc3QgYmxvY2sgd3JpdHRlbiBpbiBhIGNvbW1pdC4gICovCitzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjIHsKKwlfX2xlMzIgal90cmFuc19pZDsJLyogaWQgb2YgY29tbWl0ICovCisJX19sZTMyIGpfbGVuOwkJLyogbGVuZ3RoIG9mIGNvbW1pdC4gbGVuICsxIGlzIHRoZSBjb21taXQgYmxvY2sgKi8KKwlfX2xlMzIgal9tb3VudF9pZDsJLyogbW91bnQgaWQgb2YgdGhpcyB0cmFucyAqLworCV9fbGUzMiBqX3JlYWxibG9ja1sxXTsJLyogcmVhbCBsb2NhdGlvbnMgZm9yIGVhY2ggYmxvY2sgKi8KK307CisKKyNkZWZpbmUgZ2V0X2Rlc2NfdHJhbnNfaWQoZCkgICBsZTMyX3RvX2NwdSgoZCktPmpfdHJhbnNfaWQpCisjZGVmaW5lIGdldF9kZXNjX3RyYW5zX2xlbihkKSAgbGUzMl90b19jcHUoKGQpLT5qX2xlbikKKyNkZWZpbmUgZ2V0X2Rlc2NfbW91bnRfaWQoZCkgICBsZTMyX3RvX2NwdSgoZCktPmpfbW91bnRfaWQpCisKKyNkZWZpbmUgc2V0X2Rlc2NfdHJhbnNfaWQoZCx2YWwpICAgICAgIGRvIHsgKGQpLT5qX3RyYW5zX2lkID0gY3B1X3RvX2xlMzIgKHZhbCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9kZXNjX3RyYW5zX2xlbihkLHZhbCkgICAgICBkbyB7IChkKS0+al9sZW4gPSBjcHVfdG9fbGUzMiAodmFsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2V0X2Rlc2NfbW91bnRfaWQoZCx2YWwpICAgICAgIGRvIHsgKGQpLT5qX21vdW50X2lkID0gY3B1X3RvX2xlMzIgKHZhbCk7IH0gd2hpbGUgKDApCisKKy8qIGxhc3QgYmxvY2sgd3JpdHRlbiBpbiBhIGNvbW1pdCAqLworc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0IHsKKwlfX2xlMzIgal90cmFuc19pZDsJLyogbXVzdCBtYXRjaCBqX3RyYW5zX2lkIGZyb20gdGhlIGRlc2MgYmxvY2sgKi8KKwlfX2xlMzIgal9sZW47CQkvKiBkaXR0byAqLworCV9fbGUzMiBqX3JlYWxibG9ja1sxXTsJLyogcmVhbCBsb2NhdGlvbnMgZm9yIGVhY2ggYmxvY2sgKi8KK307CisKKyNkZWZpbmUgZ2V0X2NvbW1pdF90cmFuc19pZChjKSBsZTMyX3RvX2NwdSgoYyktPmpfdHJhbnNfaWQpCisjZGVmaW5lIGdldF9jb21taXRfdHJhbnNfbGVuKGMpICAgICAgICBsZTMyX3RvX2NwdSgoYyktPmpfbGVuKQorI2RlZmluZSBnZXRfY29tbWl0X21vdW50X2lkKGMpIGxlMzJfdG9fY3B1KChjKS0+al9tb3VudF9pZCkKKworI2RlZmluZSBzZXRfY29tbWl0X3RyYW5zX2lkKGMsdmFsKSAgICAgZG8geyAoYyktPmpfdHJhbnNfaWQgPSBjcHVfdG9fbGUzMiAodmFsKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2V0X2NvbW1pdF90cmFuc19sZW4oYyx2YWwpICAgIGRvIHsgKGMpLT5qX2xlbiA9IGNwdV90b19sZTMyICh2YWwpOyB9IHdoaWxlICgwKQorCisvKiB0aGlzIGhlYWRlciBibG9jayBnZXRzIHdyaXR0ZW4gd2hlbmV2ZXIgYSB0cmFuc2FjdGlvbiBpcyBjb25zaWRlcmVkIGZ1bGx5IGZsdXNoZWQsIGFuZCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZQorKiogbGFzdCBmdWxseSBmbHVzaGVkIHRyYW5zYWN0aW9uLiAgZnVsbHkgZmx1c2hlZCBtZWFucyBhbGwgdGhlIGxvZyBibG9ja3MgYW5kIGFsbCB0aGUgcmVhbCBibG9ja3MgYXJlIG9uIGRpc2ssCisqKiBhbmQgdGhpcyB0cmFuc2FjdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlcGxheWVkLgorKi8KK3N0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciB7CisJX19sZTMyIGpfbGFzdF9mbHVzaF90cmFuc19pZDsJLyogaWQgb2YgbGFzdCBmdWxseSBmbHVzaGVkIHRyYW5zYWN0aW9uICovCisJX19sZTMyIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldDsJLyogb2Zmc2V0IGluIHRoZSBsb2cgb2Ygd2hlcmUgdG8gc3RhcnQgcmVwbGF5IGFmdGVyIGEgY3Jhc2ggKi8KKwlfX2xlMzIgal9tb3VudF9pZDsKKwkvKiAxMiAqLyBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgamhfam91cm5hbDsKK307CisKKy8qIGJpZ2dlc3QgdHVuYWJsZSBkZWZpbmVzIGFyZSByaWdodCBoZXJlICovCisjZGVmaW5lIEpPVVJOQUxfQkxPQ0tfQ09VTlQgODE5MgkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBqb3VybmFsICovCisjZGVmaW5lIEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgMTAyNAkvKiBiaWdnZXN0IHBvc3NpYmxlIHNpbmdsZSB0cmFuc2FjdGlvbiwgZG9uJ3QgY2hhbmdlIGZvciBub3cgKDgvMy85OSkgKi8KKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAyNTYKKyNkZWZpbmUgSk9VUk5BTF9NQVhfQkFUQ0hfREVGQVVMVCAgIDkwMAkvKiBtYXggYmxvY2tzIHRvIGJhdGNoIGludG8gb25lIHRyYW5zYWN0aW9uLCBkb24ndCBtYWtlIHRoaXMgYW55IGJpZ2dlciB0aGFuIDkwMCAqLworI2RlZmluZSBKT1VSTkFMX01JTl9SQVRJTyAyCisjZGVmaW5lIEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UgMzAKKyNkZWZpbmUgSk9VUk5BTF9NQVhfVFJBTlNfQUdFIDMwCisjZGVmaW5lIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICgzICogKE1BWF9IRUlHSFQtMikgKyA5KQorI2lmZGVmIENPTkZJR19RVU9UQQorLyogV2UgbmVlZCB0byB1cGRhdGUgZGF0YSBhbmQgaW5vZGUgKGF0aW1lKSAqLworI2RlZmluZSBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MocykgKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmICgxPDxSRUlTRVJGU19RVU9UQSkgPyAyIDogMCkKKy8qIDEgYmFsYW5jaW5nLCAxIGJpdG1hcCwgMSBkYXRhIHBlciB3cml0ZSArIHN0YXQgZGF0YSB1cGRhdGUgKi8KKyNkZWZpbmUgUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocykgKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmICgxPDxSRUlTRVJGU19RVU9UQSkgPyBcCisoRFFVT1RfSU5JVF9BTExPQyooSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQrMikrRFFVT1RfSU5JVF9SRVdSSVRFKzEpIDogMCkKKy8qIHNhbWUgYXMgd2l0aCBJTklUICovCisjZGVmaW5lIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MocykgKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmICgxPDxSRUlTRVJGU19RVU9UQSkgPyBcCisoRFFVT1RfREVMX0FMTE9DKihKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCsyKStEUVVPVF9ERUxfUkVXUklURSsxKSA6IDApCisjZWxzZQorI2RlZmluZSBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MocykgMAorI2RlZmluZSBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhzKSAwCisjZGVmaW5lIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MocykgMAorI2VuZGlmCisKKy8qIGJvdGggb2YgdGhlc2UgY2FuIGJlIGFzIGxvdyBhcyAxLCBvciBhcyBoaWdoIGFzIHlvdSB3YW50LiAgVGhlIG1pbiBpcyB0aGUKKyoqIG51bWJlciBvZiA0ayBiaXRtYXAgbm9kZXMgcHJlYWxsb2NhdGVkIG9uIG1vdW50LiBOZXcgbm9kZXMgYXJlIGFsbG9jYXRlZAorKiogYXMgbmVlZGVkLCBhbmQgcmVsZWFzZWQgd2hlbiB0cmFuc2FjdGlvbnMgYXJlIGNvbW1pdHRlZC4gIE9uIHJlbGVhc2UsIGlmIAorKiogdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vZGVzIGlzID4gbWF4LCB0aGUgbm9kZSBpcyBmcmVlZCwgb3RoZXJ3aXNlLCAKKyoqIGl0IGlzIHB1dCBvbiBhIGZyZWUgbGlzdCBmb3IgZmFzdGVyIHVzZSBsYXRlci4KKyovCisjZGVmaW5lIFJFSVNFUkZTX01JTl9CSVRNQVBfTk9ERVMgMTAKKyNkZWZpbmUgUkVJU0VSRlNfTUFYX0JJVE1BUF9OT0RFUyAxMDAKKworI2RlZmluZSBKQkhfSEFTSF9TSElGVCAxMwkvKiB0aGVzZSBhcmUgYmFzZWQgb24gam91cm5hbCBoYXNoIHNpemUgb2YgODE5MiAqLworI2RlZmluZSBKQkhfSEFTSF9NQVNLIDgxOTEKKworI2RlZmluZSBfamhhc2hmbihzYixibG9jaykJXAorCSgoKHVuc2lnbmVkIGxvbmcpc2I+PkwxX0NBQ0hFX1NISUZUKSBeIFwKKwkgKCgoYmxvY2spPDwoSkJIX0hBU0hfU0hJRlQgLSA2KSkgXiAoKGJsb2NrKSA+PiAxMykgXiAoKGJsb2NrKSA8PCAoSkJIX0hBU0hfU0hJRlQgLSAxMikpKSkKKyNkZWZpbmUgam91cm5hbF9oYXNoKHQsc2IsYmxvY2spICgodClbX2poYXNoZm4oKHNiKSwoYmxvY2spKSAmIEpCSF9IQVNIX01BU0tdKQorCisvLyBXZSBuZWVkIHRoZXNlIHRvIG1ha2Ugam91cm5hbC5jIGNvZGUgbW9yZSByZWFkYWJsZQorI2RlZmluZSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJsb2NrKSBfX2ZpbmRfZ2V0X2Jsb2NrKFNCX0pPVVJOQUwocyktPmpfZGV2X2JkLCBibG9jaywgcy0+c19ibG9ja3NpemUpCisjZGVmaW5lIGpvdXJuYWxfZ2V0YmxrKHMsIGJsb2NrKSBfX2dldGJsayhTQl9KT1VSTkFMKHMpLT5qX2Rldl9iZCwgYmxvY2ssIHMtPnNfYmxvY2tzaXplKQorI2RlZmluZSBqb3VybmFsX2JyZWFkKHMsIGJsb2NrKSBfX2JyZWFkKFNCX0pPVVJOQUwocyktPmpfZGV2X2JkLCBibG9jaywgcy0+c19ibG9ja3NpemUpCisKK2VudW0gcmVpc2VyZnNfYmhfc3RhdGVfYml0cyB7CisJQkhfSkRpcnR5ID0gQkhfUHJpdmF0ZVN0YXJ0LAkvKiBidWZmZXIgaXMgaW4gY3VycmVudCB0cmFuc2FjdGlvbiAqLworCUJIX0pEaXJ0eV93YWl0LAorCUJIX0pOZXcsCQkvKiBkaXNrIGJsb2NrIHdhcyB0YWtlbiBvZmYgZnJlZSBsaXN0IGJlZm9yZQorCQkJCSAqIGJlaW5nIGluIGEgZmluaXNoZWQgdHJhbnNhY3Rpb24sIG9yCisJCQkJICogd3JpdHRlbiB0byBkaXNrLiBDYW4gYmUgcmV1c2VkIGltbWVkLiAqLworCUJIX0pQcmVwYXJlZCwKKwlCSF9KUmVzdG9yZV9kaXJ0eSwKKwlCSF9KVGVzdCwJCS8vIGRlYnVnZ2luZyBvbmx5IHdpbGwgZ28gYXdheQorfTsKKworQlVGRkVSX0ZOUyhKRGlydHksIGpvdXJuYWxlZCk7CitUQVNfQlVGRkVSX0ZOUyhKRGlydHksIGpvdXJuYWxlZCk7CitCVUZGRVJfRk5TKEpEaXJ0eV93YWl0LCBqb3VybmFsX2RpcnR5KTsKK1RBU19CVUZGRVJfRk5TKEpEaXJ0eV93YWl0LCBqb3VybmFsX2RpcnR5KTsKK0JVRkZFUl9GTlMoSk5ldywgam91cm5hbF9uZXcpOworVEFTX0JVRkZFUl9GTlMoSk5ldywgam91cm5hbF9uZXcpOworQlVGRkVSX0ZOUyhKUHJlcGFyZWQsIGpvdXJuYWxfcHJlcGFyZWQpOworVEFTX0JVRkZFUl9GTlMoSlByZXBhcmVkLCBqb3VybmFsX3ByZXBhcmVkKTsKK0JVRkZFUl9GTlMoSlJlc3RvcmVfZGlydHksIGpvdXJuYWxfcmVzdG9yZV9kaXJ0eSk7CitUQVNfQlVGRkVSX0ZOUyhKUmVzdG9yZV9kaXJ0eSwgam91cm5hbF9yZXN0b3JlX2RpcnR5KTsKK0JVRkZFUl9GTlMoSlRlc3QsIGpvdXJuYWxfdGVzdCk7CitUQVNfQlVGRkVSX0ZOUyhKVGVzdCwgam91cm5hbF90ZXN0KTsKKworLyoKKyoqIHRyYW5zYWN0aW9uIGhhbmRsZSB3aGljaCBpcyBwYXNzZWQgYXJvdW5kIGZvciBhbGwgam91cm5hbCBjYWxscworKi8KK3N0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgeworCXN0cnVjdCBzdXBlcl9ibG9jayAqdF9zdXBlcjsJLyogc3VwZXIgZm9yIHRoaXMgRlMgd2hlbiBqb3VybmFsX2JlZ2luIHdhcworCQkJCQkgICBjYWxsZWQuIHNhdmVzIGNhbGxzIHRvIHJlaXNlcmZzX2dldF9zdXBlcgorCQkJCQkgICBhbHNvIHVzZWQgYnkgbmVzdGVkIHRyYW5zYWN0aW9ucyB0byBtYWtlCisJCQkJCSAgIHN1cmUgdGhleSBhcmUgbmVzdGluZyBvbiB0aGUgcmlnaHQgRlMKKwkJCQkJICAgX211c3RfIGJlIGZpcnN0IGluIHRoZSBoYW5kbGUKKwkJCQkJICovCisJaW50IHRfcmVmY291bnQ7CisJaW50IHRfYmxvY2tzX2xvZ2dlZDsJLyogbnVtYmVyIG9mIGJsb2NrcyB0aGlzIHdyaXRlciBoYXMgbG9nZ2VkICovCisJaW50IHRfYmxvY2tzX2FsbG9jYXRlZDsJLyogbnVtYmVyIG9mIGJsb2NrcyB0aGlzIHdyaXRlciBhbGxvY2F0ZWQgKi8KKwl1bnNpZ25lZCBsb25nIHRfdHJhbnNfaWQ7CS8qIHNhbml0eSBjaGVjaywgZXF1YWxzIHRoZSBjdXJyZW50IHRyYW5zIGlkICovCisJdm9pZCAqdF9oYW5kbGVfc2F2ZTsJLyogc2F2ZSBleGlzdGluZyBjdXJyZW50LT5qb3VybmFsX2luZm8gKi8KKwl1bnNpZ25lZCBkaXNwbGFjZV9uZXdfYmxvY2tzOjE7CS8qIGlmIG5ldyBibG9jayBhbGxvY2F0aW9uIG9jY3VycmVzLCB0aGF0IGJsb2NrCisJCQkJCSAgIHNob3VsZCBiZSBkaXNwbGFjZWQgZnJvbSBvdGhlcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHRfbGlzdDsKK307CisKKy8qIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBvcmRlcmVkIGFuZCB0YWlsIHdyaXRlcywgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcgorICogaGVhZCB0aHJvdWdoIGJfam91cm5hbF9oZWFkLgorICovCitzdHJ1Y3QgcmVpc2VyZnNfamggeworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKwordm9pZCByZWlzZXJmc19mcmVlX2poKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitpbnQgcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK2ludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChyZWlzZXJmc19kYXRhX2xvZyhpbm9kZS0+aV9zYikgfHwKKwkgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9kYXRhX2xvZykpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJaWYgKHRoICYmIHRoLT50X3N1cGVyID09IHMpCisJCXJldHVybiAxOworCWlmICh0aCAmJiB0aC0+dF9zdXBlciA9PSBOVUxMKQorCQlCVUcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2ZyZWVfc3BhY2Uoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCit7CisJcmV0dXJuIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgLSB0aC0+dF9ibG9ja3NfbG9nZ2VkOworfQorCitzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpyZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdAorCQkJCQkJCQkgICAgc3VwZXJfYmxvY2sKKwkJCQkJCQkJICAgICosCisJCQkJCQkJCSAgICBpbnQgY291bnQpOworaW50IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKik7CitpbnQgcmVpc2VyZnNfY29tbWl0X3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2ludCByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2ludCByZWlzZXJmc19pbm9kZV9uZWVkc19jb21taXQoc3RydWN0IGlub2RlICopOwordm9pZCByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICopOwordm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7Cit2b2lkIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCk7Cit2b2lkIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwordm9pZCByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqY2FsbGVyKTsKK2ludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSBpbnQgd2FpdCk7Cit2b2lkIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworaW50IGpvdXJuYWxfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqal9kZXZfbmFtZSwgaW50IG9sZF9mb3JtYXQsCisJCSB1bnNpZ25lZCBpbnQpOworaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2ludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitpbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJdW5zaWduZWQgbG9uZyk7CitpbnQgam91cm5hbF9lbmRfc3luYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkgICAgIHVuc2lnbmVkIGxvbmcpOworaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgYl9ibG9ja25yX3QgYmxvY2tucik7CitpbnQgam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgaW50KTsKK2ludCByZWlzZXJmc19pbl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBpbnQgYm1hcF9uciwKKwkJCWludCBiaXRfbnIsIGludCBzZWFyY2hhbGwsIGJfYmxvY2tucl90ICpuZXh0KTsKK2ludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyk7CitpbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgcmVpc2VyZnNfam91cm5hbF9hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pOwordm9pZCByZWlzZXJmc19hYm9ydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCByZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJCSAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqLCB1bnNpZ25lZCBpbnQpOworCit2b2lkIGFkZF9zYXZlX2xpbmsoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0cnVuY2F0ZSk7CitpbnQgcmVtb3ZlX3NhdmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHJ1bmNhdGUpOworCisvKiBvYmplY3RpZC5jICovCitfX3UzMiByZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKTsKK2ludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKKy8qIHN0cmVlLmMgKi8KK2ludCBCX0lTX0lOX1RSRUUoY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqcF92X3RvLAorCQkJICAgY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqcF92X2Zyb20pOworCisvLyBmaXJzdCBrZXkgaXMgaW4gY3B1IGZvcm0sIHNlY29uZCAtIGxlCitleHRlcm4gaW50IGNvbXBfc2hvcnRfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXksCisJCQkgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqY3B1X2tleSk7CitleHRlcm4gdm9pZCBsZV9rZXkyY3B1X2tleShzdHJ1Y3QgY3B1X2tleSAqdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmZyb20pOworCisvLyBib3RoIGFyZSBpbiBsZSBmb3JtCitleHRlcm4gaW50IGNvbXBfbGVfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICosCisJCQljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICopOworZXh0ZXJuIGludCBjb21wX3Nob3J0X2xlX2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqKTsKKworLy8KKy8vIGdldCBrZXkgdmVyc2lvbiBmcm9tIG9uIGRpc2sga2V5IC0ga2x1ZGdlCisvLworc3RhdGljIF9faW5saW5lX18gaW50IGxlX2tleV92ZXJzaW9uKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKK3sKKwlpbnQgdHlwZTsKKworCXR5cGUgPSBvZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSk7CisJaWYgKHR5cGUgIT0gVFlQRV9ESVJFQ1QgJiYgdHlwZSAhPSBUWVBFX0lORElSRUNUCisJICAgICYmIHR5cGUgIT0gVFlQRV9ESVJFTlRSWSkKKwkJcmV0dXJuIEtFWV9GT1JNQVRfM181OworCisJcmV0dXJuIEtFWV9GT1JNQVRfM182OworCit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY29weV9rZXkoc3RydWN0IHJlaXNlcmZzX2tleSAqdG8sCisJCQkgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZnJvbSkKK3sKKwltZW1jcHkodG8sIGZyb20sIEtFWV9TSVpFKTsKK30KKworaW50IGNvbXBfaXRlbXMoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgdHJlZXBhdGggKnBfc19wYXRoKTsKK2NvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmdldF9ya2V5KGNvbnN0IHN0cnVjdCB0cmVlcGF0aCAqcF9zX2Noa19wYXRoLAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYik7CitpbnQgc2VhcmNoX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwKKwkJICBzdHJ1Y3QgdHJlZXBhdGggKiwgaW50KTsKKyNkZWZpbmUgc2VhcmNoX2l0ZW0ocyxrZXkscGF0aCkgc2VhcmNoX2J5X2tleSAocywga2V5LCBwYXRoLCBESVNLX0xFQUZfTk9ERV9MRVZFTCkKK2ludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqcF9zX2NwdV9rZXksCisJCQkgICAgICAgc3RydWN0IHRyZWVwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOworZXh0ZXJuIHZvaWQgZGVjcmVtZW50X2Jjb3VudChzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaCk7Cit2b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHN0cnVjdCB0cmVlcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKK3ZvaWQgcGF0aHJlbHNlKHN0cnVjdCB0cmVlcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKK2ludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCB0cmVlcGF0aCAqcCk7Cit2b2lkIHBhdGhyZWxzZV9hbmRfcmVzdG9yZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCB0cmVlcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKKworaW50IHJlaXNlcmZzX2luc2VydF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJIHN0cnVjdCB0cmVlcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJIHN0cnVjdCBpdGVtX2hlYWQgKmloLAorCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKmJvZHkpOworCitpbnQgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICBzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJvZHksIGludCBwYXN0ZV9zaXplKTsKKworaW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsCisJCQkgICBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgbmV3X2ZpbGVfc2l6ZSk7CisKK2ludCByZWlzZXJmc19kZWxldGVfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSBzdHJ1Y3QgdHJlZXBhdGggKnBhdGgsCisJCQkgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc191bl9iaCk7CisKK3ZvaWQgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KTsKK2ludCByZWlzZXJmc19kZWxldGVfb2JqZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IGlub2RlICpwX3NfaW5vZGUpOworaW50IHJlaXNlcmZzX2RvX3RydW5jYXRlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCBzdHJ1Y3QgcGFnZSAqLAorCQkJIGludCB1cGRhdGVfdGltZXN0YW1wcyk7CisKKyNkZWZpbmUgaV9ibG9ja19zaXplKGlub2RlKSAoKGlub2RlKS0+aV9zYi0+c19ibG9ja3NpemUpCisjZGVmaW5lIGZpbGVfc2l6ZShpbm9kZSkgKChpbm9kZSktPmlfc2l6ZSkKKyNkZWZpbmUgdGFpbF9zaXplKGlub2RlKSAoZmlsZV9zaXplIChpbm9kZSkgJiAoaV9ibG9ja19zaXplIChpbm9kZSkgLSAxKSkKKworI2RlZmluZSB0YWlsX2hhc190b19iZV9wYWNrZWQoaW5vZGUpIChoYXZlX2xhcmdlX3RhaWxzICgoaW5vZGUpLT5pX3NiKT9cCishU1RPUkVfVEFJTF9JTl9VTkZNX1MxKGZpbGVfc2l6ZSAoaW5vZGUpLCB0YWlsX3NpemUoaW5vZGUpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOmhhdmVfc21hbGxfdGFpbHMgKChpbm9kZSktPmlfc2IpPyFTVE9SRV9UQUlMX0lOX1VORk1fUzIoZmlsZV9zaXplIChpbm9kZSksIHRhaWxfc2l6ZShpbm9kZSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk6MCApCisKK3ZvaWQgcGFkZF9pdGVtKGNoYXIgKml0ZW0sIGludCB0b3RhbF9sZW5ndGgsIGludCBsZW5ndGgpOworCisvKiBpbm9kZS5jICovCisvKiBhcmdzIGZvciB0aGUgY3JlYXRlIHBhcmFtZXRlciBvZiByZWlzZXJmc19nZXRfYmxvY2sgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX05PX0NSRUFURSAwCS8qIGRvbid0IGNyZWF0ZSBuZXcgYmxvY2tzIG9yIGNvbnZlcnQgdGFpbHMgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX0NSRUFURSAxCS8qIGFkZCBhbnl0aGluZyB5b3UgbmVlZCB0byBmaW5kIGJsb2NrICovCisjZGVmaW5lIEdFVF9CTE9DS19OT19IT0xFIDIJLyogcmV0dXJuIC1FTk9FTlQgZm9yIGZpbGUgaG9sZXMgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX1JFQURfRElSRUNUIDQJLyogcmVhZCB0aGUgdGFpbCBpZiBpbmRpcmVjdCBpdGVtIG5vdCBmb3VuZCAqLworI2RlZmluZSBHRVRfQkxPQ0tfTk9fSU1VWCAgICAgOAkvKiBpX211dGV4IGlzIG5vdCBoZWxkLCBkb24ndCBwcmVhbGxvY2F0ZSAqLworI2RlZmluZSBHRVRfQkxPQ0tfTk9fREFOR0xFICAgMTYJLyogZG9uJ3QgbGVhdmUgYW55IHRyYW5zYWN0aW9ucyBydW5uaW5nICovCisKK3ZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzKTsKK2ludCByZWlzZXJmc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnApOworaW50IHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnApOwordm9pZCByZWlzZXJmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50KTsKK2ludCByZWlzZXJmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSk7CitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19maF90b19kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZpZCAqZmlkLAorCQkJCSAgICAgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpOworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZmhfdG9fcGFyZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWQgKmZpZCwKKwkJCQkgICAgIGludCBmaF9sZW4sIGludCBmaF90eXBlKTsKK2ludCByZWlzZXJmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqIGRhdGEsIGludCAqbGVucCwKKwkJICAgICAgIGludCBjb25uZWN0YWJsZSk7CisKK2ludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpOwordm9pZCBtYWtlX2NwdV9rZXkoc3RydWN0IGNwdV9rZXkgKmNwdV9rZXksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCSAgaW50IHR5cGUsIGludCBrZXlfbGVuZ3RoKTsKK3ZvaWQgbWFrZV9sZV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCSAgICAgICBpbnQgdmVyc2lvbiwKKwkJICAgICAgIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoLCBpbnQgZW50cnlfY291bnQpOworc3RydWN0IGlub2RlICpyZWlzZXJmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSk7CisKK2ludCByZWlzZXJmc19uZXdfaW5vZGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUsCisJCSAgICAgICBjb25zdCBjaGFyICpzeW1uYW1lLCBsb2ZmX3QgaV9zaXplLAorCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKwordm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpOworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJlaXNlcmZzX3VwZGF0ZV9zZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJlaXNlcmZzX3VwZGF0ZV9zZF9zaXplKHRoLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7Cit9CisKK3ZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyhfX3UxNiBzZF9hdHRycywgc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIGlfYXR0cnNfdG9fc2RfYXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgX191MTYgKiBzZF9hdHRycyk7CitpbnQgcmVpc2VyZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cik7CisKKy8qIG5hbWVpLmMgKi8KK3ZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpOworaW50IHNlYXJjaF9ieV9lbnRyeV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCXN0cnVjdCB0cmVlcGF0aCAqcGF0aCwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpOworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICopOworLyogcHJvY2ZzLmMgKi8KKworI2lmIGRlZmluZWQoIENPTkZJR19QUk9DX0ZTICkgJiYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyApCisjZGVmaW5lIFJFSVNFUkZTX1BST0NfSU5GTworI2Vsc2UKKyN1bmRlZiBSRUlTRVJGU19QUk9DX0lORk8KKyNlbmRpZgorCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKGNoYXIgKm5hbWUsCisJCQkJCQkgICAgIHJlYWRfcHJvY190ICogZnVuYyk7Cit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KHZvaWQpOworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSh2b2lkKTsKK2ludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCisjaWYgZGVmaW5lZCggUkVJU0VSRlNfUFJPQ19JTkZPICkKKworI2RlZmluZSBQUk9DX0VYUCggZSApICAgZQorCisjZGVmaW5lIF9fUElORk8oIHNiICkgUkVJU0VSRlNfU0Ioc2IpIC0+IHNfcHJvY19pbmZvX2RhdGEKKyNkZWZpbmUgUFJPQ19JTkZPX01BWCggc2IsIGZpZWxkLCB2YWx1ZSApCQkJCQkJCQlcCisgICAgX19QSU5GTyggc2IgKS5maWVsZCA9CQkJCQkJCQkJCQkJXAorICAgICAgICBtYXgoIFJFSVNFUkZTX1NCKCBzYiApIC0+IHNfcHJvY19pbmZvX2RhdGEuZmllbGQsIHZhbHVlICkKKyNkZWZpbmUgUFJPQ19JTkZPX0lOQyggc2IsIGZpZWxkICkgKCArKyAoIF9fUElORk8oIHNiICkuZmllbGQgKSApCisjZGVmaW5lIFBST0NfSU5GT19BREQoIHNiLCBmaWVsZCwgdmFsICkgKCBfX1BJTkZPKCBzYiApLmZpZWxkICs9ICggdmFsICkgKQorI2RlZmluZSBQUk9DX0lORk9fQkhfU1RBVCggc2IsIGJoLCBsZXZlbCApCQkJCQkJCVwKKyAgICBQUk9DX0lORk9fSU5DKCBzYiwgc2JrX3JlYWRfYXRbICggbGV2ZWwgKSBdICk7CQkJCQkJXAorICAgIFBST0NfSU5GT19BREQoIHNiLCBmcmVlX2F0WyAoIGxldmVsICkgXSwgQl9GUkVFX1NQQUNFKCBiaCApICk7CVwKKyAgICBQUk9DX0lORk9fQUREKCBzYiwgaXRlbXNfYXRbICggbGV2ZWwgKSBdLCBCX05SX0lURU1TKCBiaCApICkKKyNlbHNlCisjZGVmaW5lIFBST0NfRVhQKCBlICkKKyNkZWZpbmUgVk9JRF9WICggKCB2b2lkICkgMCApCisjZGVmaW5lIFBST0NfSU5GT19NQVgoIHNiLCBmaWVsZCwgdmFsdWUgKSBWT0lEX1YKKyNkZWZpbmUgUFJPQ19JTkZPX0lOQyggc2IsIGZpZWxkICkgVk9JRF9WCisjZGVmaW5lIFBST0NfSU5GT19BREQoIHNiLCBmaWVsZCwgdmFsICkgVk9JRF9WCisjZGVmaW5lIFBST0NfSU5GT19CSF9TVEFUKCBwX3Nfc2IsIHBfc19iaCwgbl9ub2RlX2xldmVsICkgVk9JRF9WCisjZW5kaWYKKworLyogZGlyLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX29wZXJhdGlvbnM7CisKKy8qIHRhaWxfY29udmVyc2lvbi5jICovCitpbnQgZGlyZWN0MmluZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosCisJCSAgICBzdHJ1Y3QgdHJlZXBhdGggKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGxvZmZfdCk7CitpbnQgaW5kaXJlY3QyZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosCisJCSAgICBzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgdHJlZXBhdGggKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwKKwkJICAgIGxvZmZfdCwgY2hhciAqKTsKK3ZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKKworLyogZmlsZS5jICovCitleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworCisvKiBmaXhfbm9kZXMuYyAqLworCitpbnQgZml4X25vZGVzKGludCBuX29wX21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwKKwkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICpwX3NfaW5zX2loLCBjb25zdCB2b2lkICopOwordm9pZCB1bmZpeF9ub2RlcyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICopOworCisvKiBwcmludHMuYyAqLwordm9pZCByZWlzZXJmc19wYW5pYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwordm9pZCByZWlzZXJmc19pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCByZWlzZXJmc19kZWJ1ZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBwcmludF9pbmRpcmVjdF9pdGVtKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBpdGVtX251bSk7Cit2b2lkIHN0b3JlX3ByaW50X3RiKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKTsKK3ZvaWQgcHJpbnRfY3VyX3RiKGNoYXIgKm1lcyk7Cit2b2lkIHByaW50X2RlKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKTsKK3ZvaWQgcHJpbnRfYmkoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgY2hhciAqbWVzKTsKKyNkZWZpbmUgUFJJTlRfTEVBRl9JVEVNUyAxCS8qIHByaW50IGFsbCBpdGVtcyAqLworI2RlZmluZSBQUklOVF9ESVJFQ1RPUllfSVRFTVMgMgkvKiBwcmludCBkaXJlY3RvcnkgaXRlbXMgKi8KKyNkZWZpbmUgUFJJTlRfRElSRUNUX0lURU1TIDQJLyogcHJpbnQgY29udGVudHMgb2YgZGlyZWN0IGl0ZW1zICovCit2b2lkIHByaW50X2Jsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIC4uLik7Cit2b2lkIHByaW50X2JtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgc2lsZW50KTsKK3ZvaWQgcHJpbnRfYm1hcF9ibG9jayhpbnQgaSwgY2hhciAqZGF0YSwgaW50IHNpemUsIGludCBzaWxlbnQpOworLyp2b2lkIHByaW50X3N1cGVyX2Jsb2NrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjaGFyICogbWVzKTsqLwordm9pZCBwcmludF9vYmplY3RpZF9tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK3ZvaWQgcHJpbnRfYmxvY2tfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBjaGFyICptZXMpOwordm9pZCBjaGVja19sZWFmKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwordm9pZCBjaGVja19pbnRlcm5hbChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3ZvaWQgcHJpbnRfc3RhdGlzdGljcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOworY2hhciAqcmVpc2VyZnNfaGFzaG5hbWUoaW50IGNvZGUpOworCisvKiBsYmFsYW5jZS5jICovCitpbnQgbGVhZl9tb3ZlX2l0ZW1zKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IG1vdl9udW0sCisJCSAgICBpbnQgbW92X2J5dGVzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNuZXcpOworaW50IGxlYWZfc2hpZnRfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKTsKK2ludCBsZWFmX3NoaWZ0X3JpZ2h0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgc2hpZnRfbnVtLCBpbnQgc2hpZnRfYnl0ZXMpOwordm9pZCBsZWFmX2RlbGV0ZV9pdGVtcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmN1cl9iaSwgaW50IGxhc3RfZmlyc3QsIGludCBmaXJzdCwKKwkJICAgICAgIGludCBkZWxfbnVtLCBpbnQgZGVsX2J5dGVzKTsKK3ZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGJlZm9yZSwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWRfaXRlbV9paCwKKwkJCSAgY29uc3QgY2hhciAqaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpbnQgemVyb3NfbnVtYmVyKTsKK3ZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IHBhc3RlZF9pdGVtX251bSwKKwkJCSAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwgY29uc3QgY2hhciAqYm9keSwKKwkJCSAgaW50IHplcm9zX251bWJlcik7Cit2b2lkIGxlYWZfY3V0X2Zyb21fYnVmZmVyKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBjdXRfaXRlbV9udW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwgaW50IGN1dF9zaXplKTsKK3ZvaWQgbGVhZl9wYXN0ZV9lbnRyaWVzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBpdGVtX251bSwgaW50IGJlZm9yZSwKKwkJCWludCBuZXdfZW50cnlfY291bnQsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpuZXdfZGVocywKKwkJCWNvbnN0IGNoYXIgKnJlY29yZHMsIGludCBwYXN0ZV9zaXplKTsKKy8qIGliYWxhbmNlLmMgKi8KK2ludCBiYWxhbmNlX2ludGVybmFsKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiwgaW50LCBpbnQsIHN0cnVjdCBpdGVtX2hlYWQgKiwKKwkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworCisvKiBkb19iYWxhbmNlLmMgKi8KK3ZvaWQgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGZsYWcpOworI2RlZmluZSBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkKKyNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CisKK3ZvaWQgZG9fYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGl0ZW1faGVhZCAqaWgsCisJCWNvbnN0IGNoYXIgKmJvZHksIGludCBmbGFnKTsKK3ZvaWQgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CisKK2ludCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpOworaW50IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpOwordm9pZCByZXBsYWNlX2tleShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCwKKwkJIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwordm9pZCBtYWtlX2VtcHR5X25vZGUoc3RydWN0IGJ1ZmZlcl9pbmZvICopOworc3RydWN0IGJ1ZmZlcl9oZWFkICpnZXRfRkVCKHN0cnVjdCB0cmVlX2JhbGFuY2UgKik7CisKKy8qIGJpdG1hcC5jICovCisKKy8qIHN0cnVjdHVyZSBjb250YWlucyBoaW50cyBmb3IgYmxvY2sgYWxsb2NhdG9yLCBhbmQgaXQgaXMgYSBjb250YWluZXIgZm9yCisgKiBhcmd1bWVudHMsIHN1Y2ggYXMgbm9kZSwgc2VhcmNoIHBhdGgsIHRyYW5zYWN0aW9uX2hhbmRsZSwgZXRjLiAqLworc3RydWN0IF9fcmVpc2VyZnNfYmxvY2tucl9oaW50IHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwkvKiBpbm9kZSBwYXNzZWQgdG8gYWxsb2NhdG9yLCBpZiB3ZSBhbGxvY2F0ZSB1bmYuIG5vZGVzICovCisJc2VjdG9yX3QgYmxvY2s7CQkvKiBmaWxlIG9mZnNldCwgaW4gYmxvY2tzICovCisJc3RydWN0IGluX2NvcmVfa2V5IGtleTsKKwlzdHJ1Y3QgdHJlZXBhdGggKnBhdGg7CS8qIHNlYXJjaCBwYXRoLCB1c2VkIGJ5IGFsbG9jYXRvciB0byBkZXRlcm5pbmUgc2VhcmNoX3N0YXJ0IGJ5CisJCQkJICogdmFyaW91cyB3YXlzICovCisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGg7CS8qIHRyYW5zYWN0aW9uIGhhbmRsZSBpcyBuZWVkZWQgdG8gbG9nIHN1cGVyIGJsb2NrcyBhbmQKKwkJCQkJCSAqIGJpdG1hcCBibG9ja3MgY2hhbmdlcyAgKi8KKwliX2Jsb2NrbnJfdCBiZWcsIGVuZDsKKwliX2Jsb2NrbnJfdCBzZWFyY2hfc3RhcnQ7CS8qIGEgZmllbGQgdXNlZCB0byB0cmFuc2ZlciBzZWFyY2ggc3RhcnQgdmFsdWUgKGJsb2NrIG51bWJlcikKKwkJCQkJICogYmV0d2VlbiBkaWZmZXJlbnQgYmxvY2sgYWxsb2NhdG9yIHByb2NlZHVyZXMKKwkJCQkJICogKGRldGVybWluZV9zZWFyY2hfc3RhcnQoKSBhbmQgb3RoZXJzKSAqLworCWludCBwcmVhbGxvY19zaXplOwkvKiBpcyBzZXQgaW4gZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoKSBmdW5jdGlvbiwgdXNlZCBieSB1bmRlcmxheWVkCisJCQkJICogZnVuY3Rpb24gdGhhdCBkbyBhY3R1YWwgYWxsb2NhdGlvbiAqLworCisJdW5zaWduZWQgZm9ybWF0dGVkX25vZGU6MTsJLyogdGhlIGFsbG9jYXRvciB1c2VzIGRpZmZlcmVudCBwb2xpY2VzIGZvciBnZXR0aW5nIGRpc2sgc3BhY2UgZm9yCisJCQkJCSAqIGZvcm1hdHRlZC91bmZvcm1hdHRlZCBibG9ja3Mgd2l0aC93aXRob3V0IHByZWFsbG9jYXRpb24gKi8KKwl1bnNpZ25lZCBwcmVhbGxvY2F0ZToxOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX19yZWlzZXJmc19ibG9ja25yX2hpbnQgcmVpc2VyZnNfYmxvY2tucl9oaW50X3Q7CisKK2ludCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjaGFyICopOwordm9pZCByZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKKworLyoKKyAqIGdpdmVuIGEgZGlyZWN0b3J5LCB0aGlzIHdpbGwgdGVsbCB5b3Ugd2hhdCBwYWNraW5nIGxvY2FsaXR5CisgKiB0byB1c2UgZm9yIGEgbmV3IG9iamVjdCB1bmRlcm5lYXQgaXQuICBUaGUgbG9jYWxpdHkgaXMgcmV0dXJuZWQKKyAqIGluIGRpc2sgYnl0ZSBvcmRlciAobGUpLgorICovCitfX2xlMzIgcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoc3RydWN0IGlub2RlICpkaXIpOworCitpbnQgcmVpc2VyZnNfaW5pdF9iaXRtYXBfY2FjaGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Cit2b2lkIHJlaXNlcmZzX2ZyZWVfYml0bWFwX2NhY2hlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwordm9pZCByZWlzZXJmc19jYWNoZV9iaXRtYXBfbWV0YWRhdGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICppbmZvKTsKK3N0cnVjdCBidWZmZXJfaGVhZCAqcmVpc2VyZnNfcmVhZF9iaXRtYXBfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGJpdG1hcCk7CitpbnQgaXNfcmV1c2FibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSk7Cit2b2lkIHJlaXNlcmZzX2ZyZWVfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqLAorCQkJIGJfYmxvY2tucl90LCBpbnQgZm9yX3VuZm9ybWF0dGVkKTsKK2ludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqLCBiX2Jsb2NrbnJfdCAqLCBpbnQsCisJCQkgICAgICAgaW50KTsKK3N0YXRpYyBfX2lubGluZV9fIGludCByZWlzZXJmc19uZXdfZm9ybV9ibG9ja25ycyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkJICAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKKwkJCQkJICAgICBpbnQgYW1vdW50X25lZWRlZCkKK3sKKwlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0geworCQkudGggPSB0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLAorCQkucGF0aCA9IHRiLT50Yl9wYXRoLAorCQkuaW5vZGUgPSBOVUxMLAorCQkua2V5ID0gdGItPmtleSwKKwkJLmJsb2NrID0gMCwKKwkJLmZvcm1hdHRlZF9ub2RlID0gMQorCX07CisJcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQsCisJCQkJCSAgMCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKKwkJCQkJICAgICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkgICAgc3RydWN0IHRyZWVwYXRoICpwYXRoLAorCQkJCQkgICAgc2VjdG9yX3QgYmxvY2spCit7CisJcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKKwkJLnRoID0gdGgsCisJCS5wYXRoID0gcGF0aCwKKwkJLmlub2RlID0gaW5vZGUsCisJCS5ibG9jayA9IGJsb2NrLAorCQkuZm9ybWF0dGVkX25vZGUgPSAwLAorCQkucHJlYWxsb2NhdGUgPSAwCisJfTsKKwlyZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgMSwgMCk7Cit9CisKKyNpZmRlZiBSRUlTRVJGU19QUkVBTExPQ0FURQorc3RhdGljIF9faW5saW5lX18gaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUKKwkJCQkJICAgICAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSAgICAgc3RydWN0IHRyZWVwYXRoICpwYXRoLAorCQkJCQkgICAgIHNlY3Rvcl90IGJsb2NrKQoreworCXJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7CisJCS50aCA9IHRoLAorCQkucGF0aCA9IHBhdGgsCisJCS5pbm9kZSA9IGlub2RlLAorCQkuYmxvY2sgPSBibG9jaywKKwkJLmZvcm1hdHRlZF9ub2RlID0gMCwKKwkJLnByZWFsbG9jYXRlID0gMQorCX07CisJcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIDEsIDApOworfQorCit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2Moc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKTsKKyNlbmRpZgorCisvKiBoYXNoZXMuYyAqLworX191MzIga2V5ZWRfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKK19fdTMyIHl1cmFfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKK19fdTMyIHI1X2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7CisKKy8qIHRoZSBleHQyIGJpdCByb3V0aW5lcyBhZGp1c3QgZm9yIGJpZyBvciBsaXR0bGUgZW5kaWFuIGFzCisqKiBhcHByb3ByaWF0ZSBmb3IgdGhlIGFyY2gsIHNvIGluIG91ciBsYXppbmVzcyB3ZSB1c2UgdGhlbSByYXRoZXIKKyoqIHRoYW4gdXNpbmcgdGhlIGJpdCByb3V0aW5lcyB0aGV5IGNhbGwgbW9yZSBkaXJlY3RseS4gIFRoZXNlCisqKiByb3V0aW5lcyBtdXN0IGJlIHVzZWQgd2hlbiBjaGFuZ2luZyBvbiBkaXNrIGJpdG1hcHMuICAqLworI2RlZmluZSByZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0ICAgZXh0Ml9zZXRfYml0CisjZGVmaW5lIHJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdCBleHQyX2NsZWFyX2JpdAorI2RlZmluZSByZWlzZXJmc190ZXN0X2xlX2JpdCAgICAgICAgICAgZXh0Ml90ZXN0X2JpdAorI2RlZmluZSByZWlzZXJmc19maW5kX25leHRfemVyb19sZV9iaXQgZXh0Ml9maW5kX25leHRfemVyb19iaXQKKworLyogc29tZXRpbWVzIHJlaXNlcmZzX3RydW5jYXRlIG1heSByZXF1aXJlIHRvIGFsbG9jYXRlIGZldyBuZXcgYmxvY2tzCisgICB0byBwZXJmb3JtIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uLiBQZW9wbGUgcHJvYmFibHkgdXNlZCB0bworICAgdGhpbmssIHRoYXQgdHJ1bmNhdGUgc2hvdWxkIHdvcmsgd2l0aG91dCBwcm9ibGVtcyBvbiBhIGZpbGVzeXN0ZW0KKyAgIHdpdGhvdXQgZnJlZSBkaXNrIHNwYWNlLiBUaGV5IG1heSBjb21wbGFpbiB0aGF0IHRoZXkgY2FuIG5vdAorICAgdHJ1bmNhdGUgZHVlIHRvIGxhY2sgb2YgZnJlZSBkaXNrIHNwYWNlLiBUaGlzIHNwYXJlIHNwYWNlIGFsbG93cyB1cworICAgdG8gbm90IHdvcnJ5IGFib3V0IGl0LiA1MDAgaXMgcHJvYmFibHkgdG9vIG11Y2gsIGJ1dCBpdCBzaG91bGQgYmUKKyAgIGFic29sdXRlbHkgc2FmZSAqLworI2RlZmluZSBTUEFSRV9TUEFDRSA1MDAKKworLyogcHJvdG90eXBlcyBmcm9tIGlvY3RsLmMgKi8KK2ludCByZWlzZXJmc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworbG9uZyByZWlzZXJmc19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogaW9jdGwncyBjb21tYW5kICovCisjZGVmaW5lIFJFSVNFUkZTX0lPQ19VTlBBQ0sJCV9JT1coMHhDRCwxLGxvbmcpCisvKiBkZWZpbmUgZm9sbG93aW5nIGZsYWdzIHRvIGJlIHRoZSBzYW1lIGFzIGluIGV4dDIsIHNvIHRoYXQgY2hhdHRyKDEpLAorICAgbHNhdHRyKDEpIHdpbGwgd29yayB3aXRoIHVzLiAqLworI2RlZmluZSBSRUlTRVJGU19JT0NfR0VURkxBR1MJCUZTX0lPQ19HRVRGTEFHUworI2RlZmluZSBSRUlTRVJGU19JT0NfU0VURkxBR1MJCUZTX0lPQ19TRVRGTEFHUworI2RlZmluZSBSRUlTRVJGU19JT0NfR0VUVkVSU0lPTgkJRlNfSU9DX0dFVFZFUlNJT04KKyNkZWZpbmUgUkVJU0VSRlNfSU9DX1NFVFZFUlNJT04JCUZTX0lPQ19TRVRWRVJTSU9OCisKKy8qIHRoZSAzMiBiaXQgY29tcGF0IGRlZmluaXRpb25zIHdpdGggaW50IGFyZ3VtZW50ICovCisjZGVmaW5lIFJFSVNFUkZTX0lPQzMyX1VOUEFDSwkJX0lPVygweENELCAxLCBpbnQpCisjZGVmaW5lIFJFSVNFUkZTX0lPQzMyX0dFVEZMQUdTCQlGU19JT0MzMl9HRVRGTEFHUworI2RlZmluZSBSRUlTRVJGU19JT0MzMl9TRVRGTEFHUwkJRlNfSU9DMzJfU0VURkxBR1MKKyNkZWZpbmUgUkVJU0VSRlNfSU9DMzJfR0VUVkVSU0lPTglGU19JT0MzMl9HRVRWRVJTSU9OCisjZGVmaW5lIFJFSVNFUkZTX0lPQzMyX1NFVFZFUlNJT04JRlNfSU9DMzJfU0VUVkVSU0lPTgorCisvKiBMb2NraW5nIHByaW1pdGl2ZXMgKi8KKy8qIFJpZ2h0IG5vdyB3ZSBhcmUgc3RpbGwgZmFsbGluZyBiYWNrIHRvICh1bilsb2NrX2tlcm5lbCwgYnV0IGV2ZW50dWFsbHkgdGhhdAorICAgd291bGQgZXZvbHZlIGludG8gcmVhbCBwZXItZnMgbG9ja3MgKi8KKyNkZWZpbmUgcmVpc2VyZnNfd3JpdGVfbG9jayggc2IgKSBsb2NrX2tlcm5lbCgpCisjZGVmaW5lIHJlaXNlcmZzX3dyaXRlX3VubG9jayggc2IgKSB1bmxvY2tfa2VybmVsKCkKKworLyogeGF0dHIgc3R1ZmYgKi8KKyNkZWZpbmUgUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzKSAoUkVJU0VSRlNfU0IocyktPnhhdHRyX2Rpcl9zZW0pCisKKyNlbmRpZgkJCQkvKiBfTElOVVhfUkVJU0VSX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2E0YjczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgIEZpbGU6IGxpbnV4L3JlaXNlcmZzX3hhdHRyLmgKKyovCisKKyNpZm5kZWYgX0xJTlVYX1JFSVNFUkZTX1hBVFRSX0gKKyNkZWZpbmUgX0xJTlVYX1JFSVNFUkZTX1hBVFRSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIE1hZ2ljIHZhbHVlIGluIGhlYWRlciAqLworI2RlZmluZSBSRUlTRVJGU19YQVRUUl9NQUdJQyAweDUyNDY1ODQxCS8qICJSRlhBIiAqLworCitzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyIHsKKwlfX2xlMzIgaF9tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX2xlMzIgaF9oYXNoOwkJLyogaGFzaCBvZiB0aGUgdmFsdWUgKi8KK307CisKKworI2VuZGlmICAvKiAgX0xJTlVYX1JFSVNFUkZTX1hBVFRSX0ggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlYTRiNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaApAQCAtMCwwICsxLDc0IEBACisjaWZuZGVmIF9MSU5VWF9SRVNPVVJDRV9ICisjZGVmaW5lIF9MSU5VWF9SRVNPVVJDRV9ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKworLyoKKyAqIFJlc291cmNlIGNvbnRyb2wvYWNjb3VudGluZyBoZWFkZXIgZmlsZSBmb3IgbGludXgKKyAqLworCisvKgorICogRGVmaW5pdGlvbiBvZiBzdHJ1Y3QgcnVzYWdlIHRha2VuIGZyb20gQlNEIDQuMyBSZW5vCisgKiAKKyAqIFdlIGRvbid0IHN1cHBvcnQgYWxsIG9mIHRoZXNlIHlldCwgYnV0IHdlIG1pZ2h0IGFzIHdlbGwgaGF2ZSB0aGVtLi4uLgorICogT3RoZXJ3aXNlLCBlYWNoIHRpbWUgd2UgYWRkIG5ldyBpdGVtcywgcHJvZ3JhbXMgd2hpY2ggZGVwZW5kIG9uIHRoaXMKKyAqIHN0cnVjdHVyZSB3aWxsIGxvc2UuICBUaGlzIHJlZHVjZXMgdGhlIGNoYW5jZXMgb2YgdGhhdCBoYXBwZW5pbmcuCisgKi8KKyNkZWZpbmUJUlVTQUdFX1NFTEYJMAorI2RlZmluZQlSVVNBR0VfQ0hJTERSRU4JKC0xKQorI2RlZmluZSBSVVNBR0VfQk9USAkoLTIpCQkvKiBzeXNfd2FpdDQoKSB1c2VzIHRoaXMgKi8KKworc3RydWN0CXJ1c2FnZSB7CisJc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7CS8qIHVzZXIgdGltZSB1c2VkICovCisJc3RydWN0IHRpbWV2YWwgcnVfc3RpbWU7CS8qIHN5c3RlbSB0aW1lIHVzZWQgKi8KKwlsb25nCXJ1X21heHJzczsJCS8qIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgKi8KKwlsb25nCXJ1X2l4cnNzOwkJLyogaW50ZWdyYWwgc2hhcmVkIG1lbW9yeSBzaXplICovCisJbG9uZwlydV9pZHJzczsJCS8qIGludGVncmFsIHVuc2hhcmVkIGRhdGEgc2l6ZSAqLworCWxvbmcJcnVfaXNyc3M7CQkvKiBpbnRlZ3JhbCB1bnNoYXJlZCBzdGFjayBzaXplICovCisJbG9uZwlydV9taW5mbHQ7CQkvKiBwYWdlIHJlY2xhaW1zICovCisJbG9uZwlydV9tYWpmbHQ7CQkvKiBwYWdlIGZhdWx0cyAqLworCWxvbmcJcnVfbnN3YXA7CQkvKiBzd2FwcyAqLworCWxvbmcJcnVfaW5ibG9jazsJCS8qIGJsb2NrIGlucHV0IG9wZXJhdGlvbnMgKi8KKwlsb25nCXJ1X291YmxvY2s7CQkvKiBibG9jayBvdXRwdXQgb3BlcmF0aW9ucyAqLworCWxvbmcJcnVfbXNnc25kOwkJLyogbWVzc2FnZXMgc2VudCAqLworCWxvbmcJcnVfbXNncmN2OwkJLyogbWVzc2FnZXMgcmVjZWl2ZWQgKi8KKwlsb25nCXJ1X25zaWduYWxzOwkJLyogc2lnbmFscyByZWNlaXZlZCAqLworCWxvbmcJcnVfbnZjc3c7CQkvKiB2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyAqLworCWxvbmcJcnVfbml2Y3N3OwkJLyogaW52b2x1bnRhcnkgIiAqLworfTsKKworc3RydWN0IHJsaW1pdCB7CisJdW5zaWduZWQgbG9uZwlybGltX2N1cjsKKwl1bnNpZ25lZCBsb25nCXJsaW1fbWF4OworfTsKKworI2RlZmluZQlQUklPX01JTgkoLTIwKQorI2RlZmluZQlQUklPX01BWAkyMAorCisjZGVmaW5lCVBSSU9fUFJPQ0VTUwkwCisjZGVmaW5lCVBSSU9fUEdSUAkxCisjZGVmaW5lCVBSSU9fVVNFUgkyCisKKy8qCisgKiBMaW1pdCB0aGUgc3RhY2sgYnkgdG8gc29tZSBzYW5lIGRlZmF1bHQ6IHJvb3QgY2FuIGFsd2F5cworICogaW5jcmVhc2UgdGhpcyBsaW1pdCBpZiBuZWVkZWQuLiAgOE1CIHNlZW1zIHJlYXNvbmFibGUuCisgKi8KKyNkZWZpbmUgX1NUS19MSU0JKDgqMTAyNCoxMDI0KQorCisvKgorICogR1BHIHdhbnRzIDMya0Igb2YgbWxvY2tlZCBtZW1vcnksIHRvIG1ha2Ugc3VyZSBwYXNzIHBocmFzZXMKKyAqIGFuZCBvdGhlciBzZW5zaXRpdmUgaW5mb3JtYXRpb24gYXJlIG5ldmVyIHdyaXR0ZW4gdG8gZGlzay4KKyAqLworI2RlZmluZSBNTE9DS19MSU1JVAkoOCAqIFBBR0VfU0laRSkKKworLyoKKyAqIER1ZSB0byBiaW5hcnkgY29tcGF0aWJpbGl0eSwgdGhlIGFjdHVhbCByZXNvdXJjZSBudW1iZXJzCisgKiBtYXkgYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgbGludXggdmVyc2lvbnMuLgorICovCisjaW5jbHVkZSA8YXNtL3Jlc291cmNlLmg+CisKK2ludCBnZXRydXNhZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgd2hvLCBzdHJ1Y3QgcnVzYWdlICpydSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb21mc19mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb21mc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTBmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3JvbWZzX2ZzLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfX0xJTlVYX1JPTUZTX0ZTX0gKKyNkZWZpbmUgX19MSU5VWF9ST01GU19GU19ICisKKy8qIFRoZSBiYXNpYyBzdHJ1Y3R1cmVzIG9mIHRoZSByb21mcyBmaWxlc3lzdGVtICovCisKKyNkZWZpbmUgUk9NQlNJWkUgQkxPQ0tfU0laRQorI2RlZmluZSBST01CU0JJVFMgQkxPQ0tfU0laRV9CSVRTCisjZGVmaW5lIFJPTUJNQVNLIChST01CU0laRS0xKQorI2RlZmluZSBST01GU19NQUdJQyAweDcyNzUKKworI2RlZmluZSBST01GU19NQVhGTiAxMjgKKworI2RlZmluZSBfX21rdyhoLGwpICgoKGgpJjB4MDBmZik8PCA4fCgobCkmMHgwMGZmKSkKKyNkZWZpbmUgX19ta2woaCxsKSAoKChoKSYweGZmZmYpPDwxNnwoKGwpJjB4ZmZmZikpCisjZGVmaW5lIF9fbWs0KGEsYixjLGQpIGNwdV90b19iZTMyKF9fbWtsKF9fbWt3KGEsYiksX19ta3coYyxkKSkpCisjZGVmaW5lIFJPTVNCX1dPUkQwIF9fbWs0KCctJywncicsJ28nLCdtJykKKyNkZWZpbmUgUk9NU0JfV09SRDEgX19tazQoJzEnLCdmJywncycsJy0nKQorCisvKiBPbi1kaXNrICJzdXBlciBibG9jayIgKi8KKworc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrIHsKKwlfX2JlMzIgd29yZDA7CisJX19iZTMyIHdvcmQxOworCV9fYmUzMiBzaXplOworCV9fYmUzMiBjaGVja3N1bTsKKwljaGFyIG5hbWVbMF07CQkvKiB2b2x1bWUgbmFtZSAqLworfTsKKworLyogT24gZGlzayBpbm9kZSAqLworCitzdHJ1Y3Qgcm9tZnNfaW5vZGUgeworCV9fYmUzMiBuZXh0OwkJLyogbG93IDQgYml0cyBzZWUgUk9NRkhfICovCisJX19iZTMyIHNwZWM7CisJX19iZTMyIHNpemU7CisJX19iZTMyIGNoZWNrc3VtOworCWNoYXIgbmFtZVswXTsKK307CisKKyNkZWZpbmUgUk9NRkhfVFlQRSA3CisjZGVmaW5lIFJPTUZIX0hSRCAwCisjZGVmaW5lIFJPTUZIX0RJUiAxCisjZGVmaW5lIFJPTUZIX1JFRyAyCisjZGVmaW5lIFJPTUZIX1NZTSAzCisjZGVmaW5lIFJPTUZIX0JMSyA0CisjZGVmaW5lIFJPTUZIX0NIUiA1CisjZGVmaW5lIFJPTUZIX1NDSyA2CisjZGVmaW5lIFJPTUZIX0ZJRiA3CisjZGVmaW5lIFJPTUZIX0VYRUMgOAorCisvKiBBbGlnbm1lbnQgKi8KKworI2RlZmluZSBST01GSF9TSVpFIDE2CisjZGVmaW5lIFJPTUZIX1BBRCAoUk9NRkhfU0laRS0xKQorI2RlZmluZSBST01GSF9NQVNLICh+Uk9NRkhfUEFEKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm9zZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiNGIxOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm9zZS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHB1YmxpYyBlbGVtZW50cyBvZiB0aGUgTGludXgga2VybmVsIFJvc2UgaW1wbGVtZW50YXRpb24uCisgKiBGb3Iga2VybmVsIEFYLjI1IHNlZSB0aGUgZmlsZSBheDI1LmguIFRoaXMgZmlsZSByZXF1aXJlcyBheDI1LmggZm9yIHRoZQorICogZGVmaW5pdGlvbiBvZiB0aGUgYXgyNV9hZGRyZXNzIHN0cnVjdHVyZS4KKyAqLworCisjaWZuZGVmCVJPU0VfS0VSTkVMX0gKKyNkZWZpbmUJUk9TRV9LRVJORUxfSAorCisjZGVmaW5lIFJPU0VfTVRVCTI1MQorCisjZGVmaW5lIFJPU0VfTUFYX0RJR0lTIDYKKworI2RlZmluZQlST1NFX0RFRkVSCTEKKyNkZWZpbmUgUk9TRV9UMQkJMgorI2RlZmluZQlST1NFX1QyCQkzCisjZGVmaW5lCVJPU0VfVDMJCTQKKyNkZWZpbmUJUk9TRV9JRExFCTUKKyNkZWZpbmUJUk9TRV9RQklUSU5DTAk2CisjZGVmaW5lCVJPU0VfSE9MREJBQ0sJNworCisjZGVmaW5lCVNJT0NSU0dDQVVTRQkJKFNJT0NQUk9UT1BSSVZBVEUrMCkKKyNkZWZpbmUJU0lPQ1JTU0NBVVNFCQkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZQlTSU9DUlNMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lCVNJT0NSU1NMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lCVNJT0NSU0FDQ0VQVAkJKFNJT0NQUk9UT1BSSVZBVEUrMykKKyNkZWZpbmUJU0lPQ1JTQ0xSUlQJCShTSU9DUFJPVE9QUklWQVRFKzQpCisjZGVmaW5lCVNJT0NSU0dMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFKzUpCisjZGVmaW5lCVNJT0NSU0dGQUNJTElUSUVTCShTSU9DUFJPVE9QUklWQVRFKzYpCisKKyNkZWZpbmUJUk9TRV9EVEVfT1JJR0lOQVRFRAkweDAwCisjZGVmaW5lCVJPU0VfTlVNQkVSX0JVU1kJMHgwMQorI2RlZmluZQlST1NFX0lOVkFMSURfRkFDSUxJVFkJMHgwMworI2RlZmluZQlST1NFX05FVFdPUktfQ09OR0VTVElPTgkweDA1CisjZGVmaW5lCVJPU0VfT1VUX09GX09SREVSCTB4MDkKKyNkZWZpbmUJUk9TRV9BQ0NFU1NfQkFSUkVECTB4MEIKKyNkZWZpbmUJUk9TRV9OT1RfT0JUQUlOQUJMRQkweDBECisjZGVmaW5lCVJPU0VfUkVNT1RFX1BST0NFRFVSRQkweDExCisjZGVmaW5lCVJPU0VfTE9DQUxfUFJPQ0VEVVJFCTB4MTMKKyNkZWZpbmUJUk9TRV9TSElQX0FCU0VOVAkweDM5CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyCQlyb3NlX2FkZHJbNV07Cit9IHJvc2VfYWRkcmVzczsKKworc3RydWN0IHNvY2thZGRyX3Jvc2UgeworCXNhX2ZhbWlseV90CXNyb3NlX2ZhbWlseTsKKwlyb3NlX2FkZHJlc3MJc3Jvc2VfYWRkcjsKKwlheDI1X2FkZHJlc3MJc3Jvc2VfY2FsbDsKKwlpbnQJCXNyb3NlX25kaWdpczsKKwlheDI1X2FkZHJlc3MJc3Jvc2VfZGlnaTsKK307CisKK3N0cnVjdCBmdWxsX3NvY2thZGRyX3Jvc2UgeworCXNhX2ZhbWlseV90CXNyb3NlX2ZhbWlseTsKKwlyb3NlX2FkZHJlc3MJc3Jvc2VfYWRkcjsKKwlheDI1X2FkZHJlc3MJc3Jvc2VfY2FsbDsKKwl1bnNpZ25lZCBpbnQJc3Jvc2VfbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlzcm9zZV9kaWdpc1tST1NFX01BWF9ESUdJU107Cit9OworCitzdHJ1Y3Qgcm9zZV9yb3V0ZV9zdHJ1Y3QgeworCXJvc2VfYWRkcmVzcwlhZGRyZXNzOworCXVuc2lnbmVkIHNob3J0CW1hc2s7CisJYXgyNV9hZGRyZXNzCW5laWdoYm91cjsKKwljaGFyCQlkZXZpY2VbMTZdOworCXVuc2lnbmVkIGNoYXIJbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlkaWdpcGVhdGVyc1tBWDI1X01BWF9ESUdJU107Cit9OworCitzdHJ1Y3Qgcm9zZV9jYXVzZV9zdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIJY2F1c2U7CisJdW5zaWduZWQgY2hhcglkaWFnbm9zdGljOworfTsKKworc3RydWN0IHJvc2VfZmFjaWxpdGllc19zdHJ1Y3QgeworCXJvc2VfYWRkcmVzcwlzb3VyY2VfYWRkciwgICBkZXN0X2FkZHI7CisJYXgyNV9hZGRyZXNzCXNvdXJjZV9jYWxsLCAgIGRlc3RfY2FsbDsKKwl1bnNpZ25lZCBjaGFyCXNvdXJjZV9uZGlnaXMsIGRlc3RfbmRpZ2lzOworCWF4MjVfYWRkcmVzcwlzb3VyY2VfZGlnaXNbUk9TRV9NQVhfRElHSVNdOworCWF4MjVfYWRkcmVzcwlkZXN0X2RpZ2lzW1JPU0VfTUFYX0RJR0lTXTsKKwl1bnNpZ25lZCBpbnQJcmFuZDsKKwlyb3NlX2FkZHJlc3MJZmFpbF9hZGRyOworCWF4MjVfYWRkcmVzcwlmYWlsX2NhbGw7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm91dGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvcm91dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmY4ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9yb3V0ZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJR2xvYmFsIGRlZmluaXRpb25zIGZvciB0aGUgSVAgcm91dGVyIGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpcm91dGUuaAkxLjAuMwkwNS8yNy85MworICoKKyAqIEF1dGhvcnM6CU9yaWdpbmFsIHRha2VuIGZyb20gQmVya2VsZXkgVU5JWCA0LjMsIChjKSBVQ0IgMTk4Ni0xOTg4CisgKgkJZm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wYXRpYmlsaXR5IG9ubHkuCisgKgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoKKyAqIENoYW5nZXM6CisgKiAgICAgICAgICAgICAgTWlrZSBNY0xhZ2FuICAgIDogICAgICAgUm91dGluZyBieSBzb3VyY2UKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfUk9VVEVfSAorI2RlZmluZSBfTElOVVhfUk9VVEVfSAorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworLyogVGhpcyBzdHJ1Y3R1cmUgZ2V0cyBwYXNzZWQgYnkgdGhlIFNJT0NBRERSVCBhbmQgU0lPQ0RFTFJUIGNhbGxzLiAqLworc3RydWN0IHJ0ZW50cnkgCit7CisJdW5zaWduZWQgbG9uZwlydF9wYWQxOworCXN0cnVjdCBzb2NrYWRkcglydF9kc3Q7CQkvKiB0YXJnZXQgYWRkcmVzcwkJKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJcnRfZ2F0ZXdheTsJLyogZ2F0ZXdheSBhZGRyIChSVEZfR0FURVdBWSkJKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJcnRfZ2VubWFzazsJLyogdGFyZ2V0IG5ldHdvcmsgbWFzayAoSVApCSovCisJdW5zaWduZWQgc2hvcnQJcnRfZmxhZ3M7CisJc2hvcnQJCXJ0X3BhZDI7CisJdW5zaWduZWQgbG9uZwlydF9wYWQzOworCXZvaWQJCSpydF9wYWQ0OworCXNob3J0CQlydF9tZXRyaWM7CS8qICsxIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSEJKi8KKwljaGFyICpydF9kZXY7CS8qIGZvcmNpbmcgdGhlIGRldmljZSBhdCBhZGQJKi8KKwl1bnNpZ25lZCBsb25nCXJ0X210dTsJCS8qIHBlciByb3V0ZSBNVFUvV2luZG93IAkqLworI2RlZmluZSBydF9tc3MJcnRfbXR1CQkJLyogQ29tcGF0aWJpbGl0eSA6LSggICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcJcnRfd2luZG93OwkvKiBXaW5kb3cgY2xhbXBpbmcgCQkqLworCXVuc2lnbmVkIHNob3J0CXJ0X2lydHQ7CS8qIEluaXRpYWwgUlRUCQkJKi8KK307CisKKworI2RlZmluZQlSVEZfVVAJCTB4MDAwMQkJLyogcm91dGUgdXNhYmxlCQkgIAkqLworI2RlZmluZQlSVEZfR0FURVdBWQkweDAwMDIJCS8qIGRlc3RpbmF0aW9uIGlzIGEgZ2F0ZXdheQkqLworI2RlZmluZQlSVEZfSE9TVAkweDAwMDQJCS8qIGhvc3QgZW50cnkgKG5ldCBvdGhlcndpc2UpCSovCisjZGVmaW5lIFJURl9SRUlOU1RBVEUJMHgwMDA4CQkvKiByZWluc3RhdGUgcm91dGUgYWZ0ZXIgdG1vdXQJKi8KKyNkZWZpbmUJUlRGX0RZTkFNSUMJMHgwMDEwCQkvKiBjcmVhdGVkIGR5bi4gKGJ5IHJlZGlyZWN0KQkqLworI2RlZmluZQlSVEZfTU9ESUZJRUQJMHgwMDIwCQkvKiBtb2RpZmllZCBkeW4uIChieSByZWRpcmVjdCkJKi8KKyNkZWZpbmUgUlRGX01UVQkJMHgwMDQwCQkvKiBzcGVjaWZpYyBNVFUgZm9yIHRoaXMgcm91dGUJKi8KKyNkZWZpbmUgUlRGX01TUwkJUlRGX01UVQkJLyogQ29tcGF0aWJpbGl0eSA6LSgJCSovCisjZGVmaW5lIFJURl9XSU5ET1cJMHgwMDgwCQkvKiBwZXIgcm91dGUgd2luZG93IGNsYW1waW5nCSovCisjZGVmaW5lIFJURl9JUlRUCTB4MDEwMAkJLyogSW5pdGlhbCByb3VuZCB0cmlwIHRpbWUJKi8KKyNkZWZpbmUgUlRGX1JFSkVDVAkweDAyMDAJCS8qIFJlamVjdCByb3V0ZQkJCSovCisKKy8qCisgKgk8bGludXgvaXB2Nl9yb3V0ZS5oPiB1c2VzIFJURiB2YWx1ZXMgPj0gNjRrCisgKi8KKworCisKKyNlbmRpZgkvKiBfTElOVVhfUk9VVEVfSCAqLworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0Yy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFlODk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydGMuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIEdlbmVyaWMgUlRDIGludGVyZmFjZS4KKyAqIFRoaXMgdmVyc2lvbiBjb250YWlucyB0aGUgcGFydCBvZiB0aGUgdXNlciBpbnRlcmZhY2UgdG8gdGhlIFJlYWwgVGltZSBDbG9jaworICogc2VydmljZS4gSXQgaXMgdXNlZCB3aXRoIGJvdGggdGhlIGxlZ2FjeSBtYzE0NjgxOCBhbmQgYWxzbyAgRUZJCisgKiBTdHJ1Y3QgcnRjX3RpbWUgYW5kIGZpcnN0IDEyIGlvY3RsIGJ5IFBhdWwgR29ydG1ha2VyLCAxOTk2IC0gc2VwYXJhdGVkIG91dAorICogZnJvbSA8bGludXgvbWMxNDY4MThydGMuaD4gdG8gdGhpcyBmaWxlIGZvciAyLjQga2VybmVscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AaHBsLmhwLmNvbT4KKyAqLworI2lmbmRlZiBfTElOVVhfUlRDX0hfCisjZGVmaW5lIF9MSU5VWF9SVENfSF8KKworLyoKKyAqIFRoZSBzdHJ1Y3QgdXNlZCB0byBwYXNzIGRhdGEgdmlhIHRoZSBmb2xsb3dpbmcgaW9jdGwuIFNpbWlsYXIgdG8gdGhlCisgKiBzdHJ1Y3QgdG0gaW4gPHRpbWUuaD4sIGJ1dCBpdCBuZWVkcyB0byBiZSBoZXJlIHNvIHRoYXQgdGhlIGtlcm5lbAorICogc291cmNlIGlzIHNlbGYgY29udGFpbmVkLCBhbGxvd2luZyBjcm9zcy1jb21waWxlcywgZXRjLiBldGMuCisgKi8KKworc3RydWN0IHJ0Y190aW1lIHsKKwlpbnQgdG1fc2VjOworCWludCB0bV9taW47CisJaW50IHRtX2hvdXI7CisJaW50IHRtX21kYXk7CisJaW50IHRtX21vbjsKKwlpbnQgdG1feWVhcjsKKwlpbnQgdG1fd2RheTsKKwlpbnQgdG1feWRheTsKKwlpbnQgdG1faXNkc3Q7Cit9OworCisvKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBpbnNwaXJlZCBieSB0aGUgRUZJICh2MC45Mikgd2FrZXVwCisgKiBhbGFybSBBUEkuCisgKi8KK3N0cnVjdCBydGNfd2thbHJtIHsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7CS8qIDAgPSBhbGFybSBkaXNhYmxlZCwgMSA9IGFsYXJtIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHBlbmRpbmc7ICAvKiAwID0gYWxhcm0gbm90IHBlbmRpbmcsIDEgPSBhbGFybSBwZW5kaW5nICovCisJc3RydWN0IHJ0Y190aW1lIHRpbWU7CS8qIHRpbWUgdGhlIGFsYXJtIGlzIHNldCB0byAqLworfTsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIHRvIGNvbnRyb2wgUExMIGNvcnJlY3Rpb24gc29tZSBiZXR0ZXIgUlRDIGZlYXR1cmUKKyAqIHBsbF92YWx1ZSBpcyB1c2VkIHRvIGdldCBvciBzZXQgY3VycmVudCB2YWx1ZSBvZiBjb3JyZWN0aW9uLAorICogdGhlIHJlc3Qgb2YgdGhlIHN0cnVjdCBpcyB1c2VkIHRvIHF1ZXJ5IEhXIGNhcGFiaWxpdGllcy4KKyAqIFRoaXMgaXMgbW9kZWxlZCBhZnRlciB0aGUgUlRDIHVzZWQgaW4gUTQwL1E2MCBjb21wdXRlcnMgYnV0CisgKiBzaG91bGQgYmUgc3VmZmljaWVudGx5IGZsZXhpYmxlIGZvciBvdGhlciBkZXZpY2VzCisgKgorICogK3ZlIHBsbF92YWx1ZSBtZWFucyBjbG9jayB3aWxsIHJ1biBmYXN0ZXIgYnkKKyAqICAgcGxsX3ZhbHVlKnBsbF9wb3NtdWx0L3BsbF9jbG9jaworICogLXZlIHBsbF92YWx1ZSBtZWFucyBjbG9jayB3aWxsIHJ1biBzbG93ZXIgYnkKKyAqICAgcGxsX3ZhbHVlKnBsbF9uZWdtdWx0L3BsbF9jbG9jaworICovCisKK3N0cnVjdCBydGNfcGxsX2luZm8geworCWludCBwbGxfY3RybDsgICAgICAgLyogcGxhY2Vob2xkZXIgZm9yIGZhbmNpZXIgY29udHJvbCAqLworCWludCBwbGxfdmFsdWU7ICAgICAgLyogZ2V0L3NldCBjb3JyZWN0aW9uIHZhbHVlICovCisJaW50IHBsbF9tYXg7ICAgICAgICAvKiBtYXggK3ZlIChmYXN0ZXIpIGFkanVzdG1lbnQgdmFsdWUgKi8KKwlpbnQgcGxsX21pbjsgICAgICAgIC8qIG1heCAtdmUgKHNsb3dlcikgYWRqdXN0bWVudCB2YWx1ZSAqLworCWludCBwbGxfcG9zbXVsdDsgICAgLyogZmFjdG9yIGZvciArdmUgY29ycmVjdGlvbiAqLworCWludCBwbGxfbmVnbXVsdDsgICAgLyogZmFjdG9yIGZvciAtdmUgY29ycmVjdGlvbiAqLworCWxvbmcgcGxsX2Nsb2NrOyAgICAgLyogYmFzZSBQTEwgZnJlcXVlbmN5ICovCit9OworCisvKgorICogaW9jdGwgY2FsbHMgdGhhdCBhcmUgcGVybWl0dGVkIHRvIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2UsIGlmCisgKiBhbnkgb2YgdGhlIFJUQyBkcml2ZXJzIGFyZSBlbmFibGVkLgorICovCisKKyNkZWZpbmUgUlRDX0FJRV9PTglfSU8oJ3AnLCAweDAxKQkvKiBBbGFybSBpbnQuIGVuYWJsZSBvbgkJKi8KKyNkZWZpbmUgUlRDX0FJRV9PRkYJX0lPKCdwJywgMHgwMikJLyogLi4uIG9mZgkJCSovCisjZGVmaW5lIFJUQ19VSUVfT04JX0lPKCdwJywgMHgwMykJLyogVXBkYXRlIGludC4gZW5hYmxlIG9uCSovCisjZGVmaW5lIFJUQ19VSUVfT0ZGCV9JTygncCcsIDB4MDQpCS8qIC4uLiBvZmYJCQkqLworI2RlZmluZSBSVENfUElFX09OCV9JTygncCcsIDB4MDUpCS8qIFBlcmlvZGljIGludC4gZW5hYmxlIG9uCSovCisjZGVmaW5lIFJUQ19QSUVfT0ZGCV9JTygncCcsIDB4MDYpCS8qIC4uLiBvZmYJCQkqLworI2RlZmluZSBSVENfV0lFX09OCV9JTygncCcsIDB4MGYpICAvKiBXYXRjaGRvZyBpbnQuIGVuYWJsZSBvbgkqLworI2RlZmluZSBSVENfV0lFX09GRglfSU8oJ3AnLCAweDEwKSAgLyogLi4uIG9mZgkJCSovCisKKyNkZWZpbmUgUlRDX0FMTV9TRVQJX0lPVygncCcsIDB4MDcsIHN0cnVjdCBydGNfdGltZSkgLyogU2V0IGFsYXJtIHRpbWUgICovCisjZGVmaW5lIFJUQ19BTE1fUkVBRAlfSU9SKCdwJywgMHgwOCwgc3RydWN0IHJ0Y190aW1lKSAvKiBSZWFkIGFsYXJtIHRpbWUgKi8KKyNkZWZpbmUgUlRDX1JEX1RJTUUJX0lPUigncCcsIDB4MDksIHN0cnVjdCBydGNfdGltZSkgLyogUmVhZCBSVEMgdGltZSAgICovCisjZGVmaW5lIFJUQ19TRVRfVElNRQlfSU9XKCdwJywgMHgwYSwgc3RydWN0IHJ0Y190aW1lKSAvKiBTZXQgUlRDIHRpbWUgICAgKi8KKyNkZWZpbmUgUlRDX0lSUVBfUkVBRAlfSU9SKCdwJywgMHgwYiwgdW5zaWduZWQgbG9uZykJIC8qIFJlYWQgSVJRIHJhdGUgICAqLworI2RlZmluZSBSVENfSVJRUF9TRVQJX0lPVygncCcsIDB4MGMsIHVuc2lnbmVkIGxvbmcpCSAvKiBTZXQgSVJRIHJhdGUgICAgKi8KKyNkZWZpbmUgUlRDX0VQT0NIX1JFQUQJX0lPUigncCcsIDB4MGQsIHVuc2lnbmVkIGxvbmcpCSAvKiBSZWFkIGVwb2NoICAgICAgKi8KKyNkZWZpbmUgUlRDX0VQT0NIX1NFVAlfSU9XKCdwJywgMHgwZSwgdW5zaWduZWQgbG9uZykJIC8qIFNldCBlcG9jaCAgICAgICAqLworCisjZGVmaW5lIFJUQ19XS0FMTV9TRVQJX0lPVygncCcsIDB4MGYsIHN0cnVjdCBydGNfd2thbHJtKS8qIFNldCB3YWtldXAgYWxhcm0qLworI2RlZmluZSBSVENfV0tBTE1fUkQJX0lPUigncCcsIDB4MTAsIHN0cnVjdCBydGNfd2thbHJtKS8qIEdldCB3YWtldXAgYWxhcm0qLworCisjZGVmaW5lIFJUQ19QTExfR0VUCV9JT1IoJ3AnLCAweDExLCBzdHJ1Y3QgcnRjX3BsbF9pbmZvKSAgLyogR2V0IFBMTCBjb3JyZWN0aW9uICovCisjZGVmaW5lIFJUQ19QTExfU0VUCV9JT1coJ3AnLCAweDEyLCBzdHJ1Y3QgcnRjX3BsbF9pbmZvKSAgLyogU2V0IFBMTCBjb3JyZWN0aW9uICovCisKKy8qIGludGVycnVwdCBmbGFncyAqLworI2RlZmluZSBSVENfSVJRRiAweDgwIC8qIGFueSBvZiB0aGUgZm9sbG93aW5nIGlzIGFjdGl2ZSAqLworI2RlZmluZSBSVENfUEYgMHg0MAorI2RlZmluZSBSVENfQUYgMHgyMAorI2RlZmluZSBSVENfVUYgMHgxMAorCisKKyNlbmRpZiAvKiBfTElOVVhfUlRDX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2QwYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtMCwwICsxLDU5NCBAQAorI2lmbmRlZiBfX0xJTlVYX1JUTkVUTElOS19ICisjZGVmaW5lIF9fTElOVVhfUlRORVRMSU5LX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2luY2x1ZGUgPGxpbnV4L25laWdoYm91ci5oPgorCisvKioqKgorICoJCVJvdXRpbmcvbmVpZ2hib3VyIGRpc2NvdmVyeSBtZXNzYWdlcy4KKyAqKioqLworCisvKiBUeXBlcyBvZiBtZXNzYWdlcyAqLworCitlbnVtIHsKKwlSVE1fQkFTRQk9IDE2LAorI2RlZmluZSBSVE1fQkFTRQlSVE1fQkFTRQorCisJUlRNX05FV0xJTksJPSAxNiwKKyNkZWZpbmUgUlRNX05FV0xJTksJUlRNX05FV0xJTksKKwlSVE1fREVMTElOSywKKyNkZWZpbmUgUlRNX0RFTExJTksJUlRNX0RFTExJTksKKwlSVE1fR0VUTElOSywKKyNkZWZpbmUgUlRNX0dFVExJTksJUlRNX0dFVExJTksKKwlSVE1fU0VUTElOSywKKyNkZWZpbmUgUlRNX1NFVExJTksJUlRNX1NFVExJTksKKworCVJUTV9ORVdBRERSCT0gMjAsCisjZGVmaW5lIFJUTV9ORVdBRERSCVJUTV9ORVdBRERSCisJUlRNX0RFTEFERFIsCisjZGVmaW5lIFJUTV9ERUxBRERSCVJUTV9ERUxBRERSCisJUlRNX0dFVEFERFIsCisjZGVmaW5lIFJUTV9HRVRBRERSCVJUTV9HRVRBRERSCisKKwlSVE1fTkVXUk9VVEUJPSAyNCwKKyNkZWZpbmUgUlRNX05FV1JPVVRFCVJUTV9ORVdST1VURQorCVJUTV9ERUxST1VURSwKKyNkZWZpbmUgUlRNX0RFTFJPVVRFCVJUTV9ERUxST1VURQorCVJUTV9HRVRST1VURSwKKyNkZWZpbmUgUlRNX0dFVFJPVVRFCVJUTV9HRVRST1VURQorCisJUlRNX05FV05FSUdICT0gMjgsCisjZGVmaW5lIFJUTV9ORVdORUlHSAlSVE1fTkVXTkVJR0gKKwlSVE1fREVMTkVJR0gsCisjZGVmaW5lIFJUTV9ERUxORUlHSAlSVE1fREVMTkVJR0gKKwlSVE1fR0VUTkVJR0gsCisjZGVmaW5lIFJUTV9HRVRORUlHSAlSVE1fR0VUTkVJR0gKKworCVJUTV9ORVdSVUxFCT0gMzIsCisjZGVmaW5lIFJUTV9ORVdSVUxFCVJUTV9ORVdSVUxFCisJUlRNX0RFTFJVTEUsCisjZGVmaW5lIFJUTV9ERUxSVUxFCVJUTV9ERUxSVUxFCisJUlRNX0dFVFJVTEUsCisjZGVmaW5lIFJUTV9HRVRSVUxFCVJUTV9HRVRSVUxFCisKKwlSVE1fTkVXUURJU0MJPSAzNiwKKyNkZWZpbmUgUlRNX05FV1FESVNDCVJUTV9ORVdRRElTQworCVJUTV9ERUxRRElTQywKKyNkZWZpbmUgUlRNX0RFTFFESVNDCVJUTV9ERUxRRElTQworCVJUTV9HRVRRRElTQywKKyNkZWZpbmUgUlRNX0dFVFFESVNDCVJUTV9HRVRRRElTQworCisJUlRNX05FV1RDTEFTUwk9IDQwLAorI2RlZmluZSBSVE1fTkVXVENMQVNTCVJUTV9ORVdUQ0xBU1MKKwlSVE1fREVMVENMQVNTLAorI2RlZmluZSBSVE1fREVMVENMQVNTCVJUTV9ERUxUQ0xBU1MKKwlSVE1fR0VUVENMQVNTLAorI2RlZmluZSBSVE1fR0VUVENMQVNTCVJUTV9HRVRUQ0xBU1MKKworCVJUTV9ORVdURklMVEVSCT0gNDQsCisjZGVmaW5lIFJUTV9ORVdURklMVEVSCVJUTV9ORVdURklMVEVSCisJUlRNX0RFTFRGSUxURVIsCisjZGVmaW5lIFJUTV9ERUxURklMVEVSCVJUTV9ERUxURklMVEVSCisJUlRNX0dFVFRGSUxURVIsCisjZGVmaW5lIFJUTV9HRVRURklMVEVSCVJUTV9HRVRURklMVEVSCisKKwlSVE1fTkVXQUNUSU9OCT0gNDgsCisjZGVmaW5lIFJUTV9ORVdBQ1RJT04gICBSVE1fTkVXQUNUSU9OCisJUlRNX0RFTEFDVElPTiwKKyNkZWZpbmUgUlRNX0RFTEFDVElPTiAgIFJUTV9ERUxBQ1RJT04KKwlSVE1fR0VUQUNUSU9OLAorI2RlZmluZSBSVE1fR0VUQUNUSU9OICAgUlRNX0dFVEFDVElPTgorCisJUlRNX05FV1BSRUZJWAk9IDUyLAorI2RlZmluZSBSVE1fTkVXUFJFRklYCVJUTV9ORVdQUkVGSVgKKworCVJUTV9HRVRNVUxUSUNBU1QgPSA1OCwKKyNkZWZpbmUgUlRNX0dFVE1VTFRJQ0FTVCBSVE1fR0VUTVVMVElDQVNUCisKKwlSVE1fR0VUQU5ZQ0FTVAk9IDYyLAorI2RlZmluZSBSVE1fR0VUQU5ZQ0FTVAlSVE1fR0VUQU5ZQ0FTVAorCisJUlRNX05FV05FSUdIVEJMCT0gNjQsCisjZGVmaW5lIFJUTV9ORVdORUlHSFRCTAlSVE1fTkVXTkVJR0hUQkwKKwlSVE1fR0VUTkVJR0hUQkwJPSA2NiwKKyNkZWZpbmUgUlRNX0dFVE5FSUdIVEJMCVJUTV9HRVRORUlHSFRCTAorCVJUTV9TRVRORUlHSFRCTCwKKyNkZWZpbmUgUlRNX1NFVE5FSUdIVEJMCVJUTV9TRVRORUlHSFRCTAorCisJUlRNX05FV05EVVNFUk9QVCA9IDY4LAorI2RlZmluZSBSVE1fTkVXTkRVU0VST1BUIFJUTV9ORVdORFVTRVJPUFQKKworCV9fUlRNX01BWCwKKyNkZWZpbmUgUlRNX01BWAkJKCgoX19SVE1fTUFYICsgMykgJiB+MykgLSAxKQorfTsKKworI2RlZmluZSBSVE1fTlJfTVNHVFlQRVMJKFJUTV9NQVggKyAxIC0gUlRNX0JBU0UpCisjZGVmaW5lIFJUTV9OUl9GQU1JTElFUwkoUlRNX05SX01TR1RZUEVTID4+IDIpCisjZGVmaW5lIFJUTV9GQU0oY21kKQkoKChjbWQpIC0gUlRNX0JBU0UpID4+IDIpCisKKy8qIAorICAgR2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIGVuY2Fwc3VsYXRpb24gb2Ygb3B0aW9uYWwgcm91dGUgaW5mb3JtYXRpb24uCisgICBJdCBpcyByZW1pbmlzY2VudCBvZiBzb2NrYWRkciwgYnV0IHdpdGggc2FfZmFtaWx5IHJlcGxhY2VkCisgICB3aXRoIGF0dHJpYnV0ZSB0eXBlLgorICovCisKK3N0cnVjdCBydGF0dHIKK3sKKwl1bnNpZ25lZCBzaG9ydAlydGFfbGVuOworCXVuc2lnbmVkIHNob3J0CXJ0YV90eXBlOworfTsKKworLyogTWFjcm9zIHRvIGhhbmRsZSBydGF0dHJpYnV0ZXMgKi8KKworI2RlZmluZSBSVEFfQUxJR05UTwk0CisjZGVmaW5lIFJUQV9BTElHTihsZW4pICggKChsZW4pK1JUQV9BTElHTlRPLTEpICYgfihSVEFfQUxJR05UTy0xKSApCisjZGVmaW5lIFJUQV9PSyhydGEsbGVuKSAoKGxlbikgPj0gKGludClzaXplb2Yoc3RydWN0IHJ0YXR0cikgJiYgXAorCQkJIChydGEpLT5ydGFfbGVuID49IHNpemVvZihzdHJ1Y3QgcnRhdHRyKSAmJiBcCisJCQkgKHJ0YSktPnJ0YV9sZW4gPD0gKGxlbikpCisjZGVmaW5lIFJUQV9ORVhUKHJ0YSxhdHRybGVuKQkoKGF0dHJsZW4pIC09IFJUQV9BTElHTigocnRhKS0+cnRhX2xlbiksIFwKKwkJCQkgKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShydGEpKSArIFJUQV9BTElHTigocnRhKS0+cnRhX2xlbikpKQorI2RlZmluZSBSVEFfTEVOR1RIKGxlbikJKFJUQV9BTElHTihzaXplb2Yoc3RydWN0IHJ0YXR0cikpICsgKGxlbikpCisjZGVmaW5lIFJUQV9TUEFDRShsZW4pCVJUQV9BTElHTihSVEFfTEVOR1RIKGxlbikpCisjZGVmaW5lIFJUQV9EQVRBKHJ0YSkgICAoKHZvaWQqKSgoKGNoYXIqKShydGEpKSArIFJUQV9MRU5HVEgoMCkpKQorI2RlZmluZSBSVEFfUEFZTE9BRChydGEpICgoaW50KSgocnRhKS0+cnRhX2xlbikgLSBSVEFfTEVOR1RIKDApKQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJRGVmaW5pdGlvbnMgdXNlZCBpbiByb3V0aW5nIHRhYmxlIGFkbWluaXN0cmF0aW9uLgorICoqKiovCisKK3N0cnVjdCBydG1zZworeworCXVuc2lnbmVkIGNoYXIJCXJ0bV9mYW1pbHk7CisJdW5zaWduZWQgY2hhcgkJcnRtX2RzdF9sZW47CisJdW5zaWduZWQgY2hhcgkJcnRtX3NyY19sZW47CisJdW5zaWduZWQgY2hhcgkJcnRtX3RvczsKKworCXVuc2lnbmVkIGNoYXIJCXJ0bV90YWJsZTsJLyogUm91dGluZyB0YWJsZSBpZCAqLworCXVuc2lnbmVkIGNoYXIJCXJ0bV9wcm90b2NvbDsJLyogUm91dGluZyBwcm90b2NvbDsgc2VlIGJlbG93CSovCisJdW5zaWduZWQgY2hhcgkJcnRtX3Njb3BlOwkvKiBTZWUgYmVsb3cgKi8JCisJdW5zaWduZWQgY2hhcgkJcnRtX3R5cGU7CS8qIFNlZSBiZWxvdwkqLworCisJdW5zaWduZWQJCXJ0bV9mbGFnczsKK307CisKKy8qIHJ0bV90eXBlICovCisKK2VudW0KK3sKKwlSVE5fVU5TUEVDLAorCVJUTl9VTklDQVNULAkJLyogR2F0ZXdheSBvciBkaXJlY3Qgcm91dGUJKi8KKwlSVE5fTE9DQUwsCQkvKiBBY2NlcHQgbG9jYWxseQkJKi8KKwlSVE5fQlJPQURDQVNULAkJLyogQWNjZXB0IGxvY2FsbHkgYXMgYnJvYWRjYXN0LAorCQkJCSAgIHNlbmQgYXMgYnJvYWRjYXN0ICovCisJUlROX0FOWUNBU1QsCQkvKiBBY2NlcHQgbG9jYWxseSBhcyBicm9hZGNhc3QsCisJCQkJICAgYnV0IHNlbmQgYXMgdW5pY2FzdCAqLworCVJUTl9NVUxUSUNBU1QsCQkvKiBNdWx0aWNhc3Qgcm91dGUJCSovCisJUlROX0JMQUNLSE9MRSwJCS8qIERyb3AJCQkJKi8KKwlSVE5fVU5SRUFDSEFCTEUsCS8qIERlc3RpbmF0aW9uIGlzIHVucmVhY2hhYmxlICAgKi8KKwlSVE5fUFJPSElCSVQsCQkvKiBBZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQJKi8KKwlSVE5fVEhST1csCQkvKiBOb3QgaW4gdGhpcyB0YWJsZQkJKi8KKwlSVE5fTkFULAkJLyogVHJhbnNsYXRlIHRoaXMgYWRkcmVzcwkqLworCVJUTl9YUkVTT0xWRSwJCS8qIFVzZSBleHRlcm5hbCByZXNvbHZlcgkqLworCV9fUlROX01BWAorfTsKKworI2RlZmluZSBSVE5fTUFYIChfX1JUTl9NQVggLSAxKQorCisKKy8qIHJ0bV9wcm90b2NvbCAqLworCisjZGVmaW5lIFJUUFJPVF9VTlNQRUMJMAorI2RlZmluZSBSVFBST1RfUkVESVJFQ1QJMQkvKiBSb3V0ZSBpbnN0YWxsZWQgYnkgSUNNUCByZWRpcmVjdHM7CisJCQkJICAgbm90IHVzZWQgYnkgY3VycmVudCBJUHY0ICovCisjZGVmaW5lIFJUUFJPVF9LRVJORUwJMgkvKiBSb3V0ZSBpbnN0YWxsZWQgYnkga2VybmVsCQkqLworI2RlZmluZSBSVFBST1RfQk9PVAkzCS8qIFJvdXRlIGluc3RhbGxlZCBkdXJpbmcgYm9vdAkJKi8KKyNkZWZpbmUgUlRQUk9UX1NUQVRJQwk0CS8qIFJvdXRlIGluc3RhbGxlZCBieSBhZG1pbmlzdHJhdG9yCSovCisKKy8qIFZhbHVlcyBvZiBwcm90b2NvbCA+PSBSVFBST1RfU1RBVElDIGFyZSBub3QgaW50ZXJwcmV0ZWQgYnkga2VybmVsOworICAgdGhleSBhcmUganVzdCBwYXNzZWQgZnJvbSB1c2VyIGFuZCBiYWNrIGFzIGlzLgorICAgSXQgd2lsbCBiZSB1c2VkIGJ5IGh5cG90aGV0aWNhbCBtdWx0aXBsZSByb3V0aW5nIGRhZW1vbnMuCisgICBOb3RlIHRoYXQgcHJvdG9jb2wgdmFsdWVzIHNob3VsZCBiZSBzdGFuZGFyZGl6ZWQgaW4gb3JkZXIgdG8KKyAgIGF2b2lkIGNvbmZsaWN0cy4KKyAqLworCisjZGVmaW5lIFJUUFJPVF9HQVRFRAk4CS8qIEFwcGFyZW50bHksIEdhdGVEICovCisjZGVmaW5lIFJUUFJPVF9SQQk5CS8qIFJESVNDL05EIHJvdXRlciBhZHZlcnRpc2VtZW50cyAqLworI2RlZmluZSBSVFBST1RfTVJUCTEwCS8qIE1lcml0IE1SVCAqLworI2RlZmluZSBSVFBST1RfWkVCUkEJMTEJLyogWmVicmEgKi8KKyNkZWZpbmUgUlRQUk9UX0JJUkQJMTIJLyogQklSRCAqLworI2RlZmluZSBSVFBST1RfRE5ST1VURUQJMTMJLyogREVDbmV0IHJvdXRpbmcgZGFlbW9uICovCisjZGVmaW5lIFJUUFJPVF9YT1JQCTE0CS8qIFhPUlAgKi8KKyNkZWZpbmUgUlRQUk9UX05USwkxNQkvKiBOZXRzdWt1a3UgKi8KKworLyogcnRtX3Njb3BlCisKKyAgIFJlYWxseSBpdCBpcyBub3Qgc2NvcGUsIGJ1dCBzb3J0IG9mIGRpc3RhbmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgIE5PV0hFUkUgYXJlIHJlc2VydmVkIGZvciBub3QgZXhpc3RpbmcgZGVzdGluYXRpb25zLCBIT1NUIGlzIG91cgorICAgbG9jYWwgYWRkcmVzc2VzLCBMSU5LIGFyZSBkZXN0aW5hdGlvbnMsIGxvY2F0ZWQgb24gZGlyZWN0bHkgYXR0YWNoZWQKKyAgIGxpbmsgYW5kIFVOSVZFUlNFIGlzIGV2ZXJ5d2hlcmUgaW4gdGhlIFVuaXZlcnNlLgorCisgICBJbnRlcm1lZGlhdGUgdmFsdWVzIGFyZSBhbHNvIHBvc3NpYmxlIGYuZS4gaW50ZXJpb3Igcm91dGVzCisgICBjb3VsZCBiZSBhc3NpZ25lZCBhIHZhbHVlIGJldHdlZW4gVU5JVkVSU0UgYW5kIExJTksuCisqLworCitlbnVtIHJ0X3Njb3BlX3QKK3sKKwlSVF9TQ09QRV9VTklWRVJTRT0wLAorLyogVXNlciBkZWZpbmVkIHZhbHVlcyAgKi8KKwlSVF9TQ09QRV9TSVRFPTIwMCwKKwlSVF9TQ09QRV9MSU5LPTI1MywKKwlSVF9TQ09QRV9IT1NUPTI1NCwKKwlSVF9TQ09QRV9OT1dIRVJFPTI1NQorfTsKKworLyogcnRtX2ZsYWdzICovCisKKyNkZWZpbmUgUlRNX0ZfTk9USUZZCQkweDEwMAkvKiBOb3RpZnkgdXNlciBvZiByb3V0ZSBjaGFuZ2UJKi8KKyNkZWZpbmUgUlRNX0ZfQ0xPTkVECQkweDIwMAkvKiBUaGlzIHJvdXRlIGlzIGNsb25lZAkJKi8KKyNkZWZpbmUgUlRNX0ZfRVFVQUxJWkUJCTB4NDAwCS8qIE11bHRpcGF0aCBlcXVhbGl6ZXI6IE5JCSovCisjZGVmaW5lIFJUTV9GX1BSRUZJWAkJMHg4MDAJLyogUHJlZml4IGFkZHJlc3NlcwkJKi8KKworLyogUmVzZXJ2ZWQgdGFibGUgaWRlbnRpZmllcnMgKi8KKworZW51bSBydF9jbGFzc190Cit7CisJUlRfVEFCTEVfVU5TUEVDPTAsCisvKiBVc2VyIGRlZmluZWQgdmFsdWVzICovCisJUlRfVEFCTEVfREVGQVVMVD0yNTMsCisJUlRfVEFCTEVfTUFJTj0yNTQsCisJUlRfVEFCTEVfTE9DQUw9MjU1LAorCVJUX1RBQkxFX01BWD0weEZGRkZGRkZGCit9OworCisKKy8qIFJvdXRpbmcgbWVzc2FnZSBhdHRyaWJ1dGVzICovCisKK2VudW0gcnRhdHRyX3R5cGVfdAoreworCVJUQV9VTlNQRUMsCisJUlRBX0RTVCwKKwlSVEFfU1JDLAorCVJUQV9JSUYsCisJUlRBX09JRiwKKwlSVEFfR0FURVdBWSwKKwlSVEFfUFJJT1JJVFksCisJUlRBX1BSRUZTUkMsCisJUlRBX01FVFJJQ1MsCisJUlRBX01VTFRJUEFUSCwKKwlSVEFfUFJPVE9JTkZPLAorCVJUQV9GTE9XLAorCVJUQV9DQUNIRUlORk8sCisJUlRBX1NFU1NJT04sCisJUlRBX01QX0FMR08sIC8qIG5vIGxvbmdlciB1c2VkICovCisJUlRBX1RBQkxFLAorCV9fUlRBX01BWAorfTsKKworI2RlZmluZSBSVEFfTUFYIChfX1JUQV9NQVggLSAxKQorCisjZGVmaW5lIFJUTV9SVEEocikgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHIpKSArIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgcnRtc2cpKSkpCisjZGVmaW5lIFJUTV9QQVlMT0FEKG4pIE5MTVNHX1BBWUxPQUQobixzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKworLyogUlRNX01VTFRJUEFUSCAtLS0gYXJyYXkgb2Ygc3RydWN0IHJ0bmV4dGhvcC4KKyAqCisgKiAic3RydWN0IHJ0bmV4dGhvcCIgZGVzY3JpYmVzIGFsbCBuZWNlc3NhcnkgbmV4dGhvcCBpbmZvcm1hdGlvbiwKKyAqIGkuZS4gcGFyYW1ldGVycyBvZiBwYXRoIHRvIGEgZGVzdGluYXRpb24gdmlhIHRoaXMgbmV4dGhvcC4KKyAqCisgKiBBdCB0aGUgbW9tZW50IGl0IGlzIGltcG9zc2libGUgdG8gc2V0IGRpZmZlcmVudCBwcmVmc3JjLCBtdHUsIHdpbmRvdworICogYW5kIHJ0dCBmb3IgZGlmZmVyZW50IHBhdGhzIGZyb20gbXVsdGlwYXRoLgorICovCisKK3N0cnVjdCBydG5leHRob3AKK3sKKwl1bnNpZ25lZCBzaG9ydAkJcnRuaF9sZW47CisJdW5zaWduZWQgY2hhcgkJcnRuaF9mbGFnczsKKwl1bnNpZ25lZCBjaGFyCQlydG5oX2hvcHM7CisJaW50CQkJcnRuaF9pZmluZGV4OworfTsKKworLyogcnRuaF9mbGFncyAqLworCisjZGVmaW5lIFJUTkhfRl9ERUFECQkxCS8qIE5leHRob3AgaXMgZGVhZCAodXNlZCBieSBtdWx0aXBhdGgpCSovCisjZGVmaW5lIFJUTkhfRl9QRVJWQVNJVkUJMgkvKiBEbyByZWN1cnNpdmUgZ2F0ZXdheSBsb29rdXAJKi8KKyNkZWZpbmUgUlROSF9GX09OTElOSwkJNAkvKiBHYXRld2F5IGlzIGZvcmNlZCBvbiBsaW5rCSovCisKKy8qIE1hY3JvcyB0byBoYW5kbGUgaGV4dGhvcHMgKi8KKworI2RlZmluZSBSVE5IX0FMSUdOVE8JNAorI2RlZmluZSBSVE5IX0FMSUdOKGxlbikgKCAoKGxlbikrUlROSF9BTElHTlRPLTEpICYgfihSVE5IX0FMSUdOVE8tMSkgKQorI2RlZmluZSBSVE5IX09LKHJ0bmgsbGVuKSAoKHJ0bmgpLT5ydG5oX2xlbiA+PSBzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkgJiYgXAorCQkJICAgKChpbnQpKHJ0bmgpLT5ydG5oX2xlbikgPD0gKGxlbikpCisjZGVmaW5lIFJUTkhfTkVYVChydG5oKQkoKHN0cnVjdCBydG5leHRob3AqKSgoKGNoYXIqKShydG5oKSkgKyBSVE5IX0FMSUdOKChydG5oKS0+cnRuaF9sZW4pKSkKKyNkZWZpbmUgUlROSF9MRU5HVEgobGVuKSAoUlROSF9BTElHTihzaXplb2Yoc3RydWN0IHJ0bmV4dGhvcCkpICsgKGxlbikpCisjZGVmaW5lIFJUTkhfU1BBQ0UobGVuKQlSVE5IX0FMSUdOKFJUTkhfTEVOR1RIKGxlbikpCisjZGVmaW5lIFJUTkhfREFUQShydG5oKSAgICgoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopKHJ0bmgpKSArIFJUTkhfTEVOR1RIKDApKSkKKworLyogUlRNX0NBQ0hFSU5GTyAqLworCitzdHJ1Y3QgcnRhX2NhY2hlaW5mbworeworCV9fdTMyCXJ0YV9jbG50cmVmOworCV9fdTMyCXJ0YV9sYXN0dXNlOworCV9fczMyCXJ0YV9leHBpcmVzOworCV9fdTMyCXJ0YV9lcnJvcjsKKwlfX3UzMglydGFfdXNlZDsKKworI2RlZmluZSBSVE5FVExJTktfSEFWRV9QRUVSSU5GTyAxCisJX191MzIJcnRhX2lkOworCV9fdTMyCXJ0YV90czsKKwlfX3UzMglydGFfdHNhZ2U7Cit9OworCisvKiBSVE1fTUVUUklDUyAtLS0gYXJyYXkgb2Ygc3RydWN0IHJ0YXR0ciB3aXRoIHR5cGVzIG9mIFJUQVhfKiAqLworCitlbnVtCit7CisJUlRBWF9VTlNQRUMsCisjZGVmaW5lIFJUQVhfVU5TUEVDIFJUQVhfVU5TUEVDCisJUlRBWF9MT0NLLAorI2RlZmluZSBSVEFYX0xPQ0sgUlRBWF9MT0NLCisJUlRBWF9NVFUsCisjZGVmaW5lIFJUQVhfTVRVIFJUQVhfTVRVCisJUlRBWF9XSU5ET1csCisjZGVmaW5lIFJUQVhfV0lORE9XIFJUQVhfV0lORE9XCisJUlRBWF9SVFQsCisjZGVmaW5lIFJUQVhfUlRUIFJUQVhfUlRUCisJUlRBWF9SVFRWQVIsCisjZGVmaW5lIFJUQVhfUlRUVkFSIFJUQVhfUlRUVkFSCisJUlRBWF9TU1RIUkVTSCwKKyNkZWZpbmUgUlRBWF9TU1RIUkVTSCBSVEFYX1NTVEhSRVNICisJUlRBWF9DV05ELAorI2RlZmluZSBSVEFYX0NXTkQgUlRBWF9DV05ECisJUlRBWF9BRFZNU1MsCisjZGVmaW5lIFJUQVhfQURWTVNTIFJUQVhfQURWTVNTCisJUlRBWF9SRU9SREVSSU5HLAorI2RlZmluZSBSVEFYX1JFT1JERVJJTkcgUlRBWF9SRU9SREVSSU5HCisJUlRBWF9IT1BMSU1JVCwKKyNkZWZpbmUgUlRBWF9IT1BMSU1JVCBSVEFYX0hPUExJTUlUCisJUlRBWF9JTklUQ1dORCwKKyNkZWZpbmUgUlRBWF9JTklUQ1dORCBSVEFYX0lOSVRDV05ECisJUlRBWF9GRUFUVVJFUywKKyNkZWZpbmUgUlRBWF9GRUFUVVJFUyBSVEFYX0ZFQVRVUkVTCisJUlRBWF9SVE9fTUlOLAorI2RlZmluZSBSVEFYX1JUT19NSU4gUlRBWF9SVE9fTUlOCisJX19SVEFYX01BWAorfTsKKworI2RlZmluZSBSVEFYX01BWCAoX19SVEFYX01BWCAtIDEpCisKKyNkZWZpbmUgUlRBWF9GRUFUVVJFX0VDTgkweDAwMDAwMDAxCisjZGVmaW5lIFJUQVhfRkVBVFVSRV9TQUNLCTB4MDAwMDAwMDIKKyNkZWZpbmUgUlRBWF9GRUFUVVJFX1RJTUVTVEFNUAkweDAwMDAwMDA0CisjZGVmaW5lIFJUQVhfRkVBVFVSRV9BTExGUkFHCTB4MDAwMDAwMDgKKworc3RydWN0IHJ0YV9zZXNzaW9uCit7CisJX191OAlwcm90bzsKKwlfX3U4CXBhZDE7CisJX191MTYJcGFkMjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTE2CXNwb3J0OworCQkJX191MTYJZHBvcnQ7CisJCX0gcG9ydHM7CisKKwkJc3RydWN0IHsKKwkJCV9fdTgJdHlwZTsKKwkJCV9fdTgJY29kZTsKKwkJCV9fdTE2CWlkZW50OworCQl9IGljbXB0OworCisJCV9fdTMyCQlzcGk7CisJfSB1OworfTsKKworLyoqKioKKyAqCQlHZW5lcmFsIGZvcm0gb2YgYWRkcmVzcyBmYW1pbHkgZGVwZW5kZW50IG1lc3NhZ2UuCisgKioqKi8KKworc3RydWN0IHJ0Z2VubXNnCit7CisJdW5zaWduZWQgY2hhcgkJcnRnZW5fZmFtaWx5OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJTGluayBsYXllciBzcGVjaWZpYyBtZXNzYWdlcy4KKyAqKioqLworCisvKiBzdHJ1Y3QgaWZpbmZvbXNnCisgKiBwYXNzZXMgbGluayBsZXZlbCBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgbm90IGRlcGVuZGVudAorICogb24gbmV0d29yayBwcm90b2NvbC4KKyAqLworCitzdHJ1Y3QgaWZpbmZvbXNnCit7CisJdW5zaWduZWQgY2hhcglpZmlfZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJX19pZmlfcGFkOworCXVuc2lnbmVkIHNob3J0CWlmaV90eXBlOwkJLyogQVJQSFJEXyogKi8KKwlpbnQJCWlmaV9pbmRleDsJCS8qIExpbmsgaW5kZXgJKi8KKwl1bnNpZ25lZAlpZmlfZmxhZ3M7CQkvKiBJRkZfKiBmbGFncwkqLworCXVuc2lnbmVkCWlmaV9jaGFuZ2U7CQkvKiBJRkZfKiBjaGFuZ2UgbWFzayAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJcHJlZml4IGluZm9ybWF0aW9uIAorICoqKiovCisKK3N0cnVjdCBwcmVmaXhtc2cKK3sKKwl1bnNpZ25lZCBjaGFyCXByZWZpeF9mYW1pbHk7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAlwcmVmaXhfcGFkMjsKKwlpbnQJCXByZWZpeF9pZmluZGV4OworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3R5cGU7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfbGVuOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X2ZsYWdzOworCXVuc2lnbmVkIGNoYXIJcHJlZml4X3BhZDM7Cit9OworCitlbnVtIAoreworCVBSRUZJWF9VTlNQRUMsCisJUFJFRklYX0FERFJFU1MsCisJUFJFRklYX0NBQ0hFSU5GTywKKwlfX1BSRUZJWF9NQVgKK307CisKKyNkZWZpbmUgUFJFRklYX01BWAkoX19QUkVGSVhfTUFYIC0gMSkKKworc3RydWN0IHByZWZpeF9jYWNoZWluZm8KK3sKKwlfX3UzMglwcmVmZXJyZWRfdGltZTsKKwlfX3UzMgl2YWxpZF90aW1lOworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlUcmFmZmljIGNvbnRyb2wgbWVzc2FnZXMuCisgKioqKi8KKworc3RydWN0IHRjbXNnCit7CisJdW5zaWduZWQgY2hhcgl0Y21fZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJdGNtX19wYWQxOworCXVuc2lnbmVkIHNob3J0CXRjbV9fcGFkMjsKKwlpbnQJCXRjbV9pZmluZGV4OworCV9fdTMyCQl0Y21faGFuZGxlOworCV9fdTMyCQl0Y21fcGFyZW50OworCV9fdTMyCQl0Y21faW5mbzsKK307CisKK2VudW0KK3sKKwlUQ0FfVU5TUEVDLAorCVRDQV9LSU5ELAorCVRDQV9PUFRJT05TLAorCVRDQV9TVEFUUywKKwlUQ0FfWFNUQVRTLAorCVRDQV9SQVRFLAorCVRDQV9GQ05ULAorCVRDQV9TVEFUUzIsCisJX19UQ0FfTUFYCit9OworCisjZGVmaW5lIFRDQV9NQVggKF9fVENBX01BWCAtIDEpCisKKyNkZWZpbmUgVENBX1JUQShyKSAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocikpICsgTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCB0Y21zZykpKSkKKyNkZWZpbmUgVENBX1BBWUxPQUQobikgTkxNU0dfUEFZTE9BRChuLHNpemVvZihzdHJ1Y3QgdGNtc2cpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlOZWlnaGJvciBEaXNjb3ZlcnkgdXNlcmxhbmQgb3B0aW9ucworICoqKiovCisKK3N0cnVjdCBuZHVzZXJvcHRtc2cKK3sKKwl1bnNpZ25lZCBjaGFyCW5kdXNlcm9wdF9mYW1pbHk7CisJdW5zaWduZWQgY2hhcgluZHVzZXJvcHRfcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAluZHVzZXJvcHRfb3B0c19sZW47CS8qIFRvdGFsIGxlbmd0aCBvZiBvcHRpb25zICovCisJaW50CQluZHVzZXJvcHRfaWZpbmRleDsKKwlfX3U4CQluZHVzZXJvcHRfaWNtcF90eXBlOworCV9fdTgJCW5kdXNlcm9wdF9pY21wX2NvZGU7CisJdW5zaWduZWQgc2hvcnQJbmR1c2Vyb3B0X3BhZDI7CisJdW5zaWduZWQgaW50CW5kdXNlcm9wdF9wYWQzOworCS8qIEZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIE5EIG9wdGlvbnMgKi8KK307CisKK2VudW0KK3sKKwlORFVTRVJPUFRfVU5TUEVDLAorCU5EVVNFUk9QVF9TUkNBRERSLAorCV9fTkRVU0VST1BUX01BWAorfTsKKworI2RlZmluZSBORFVTRVJPUFRfTUFYCShfX05EVVNFUk9QVF9NQVggLSAxKQorCisvKiBSVG5ldGxpbmsgbXVsdGljYXN0IGdyb3VwcyAtIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB1c2Vyc3BhY2UgKi8KKyNkZWZpbmUgUlRNR1JQX0xJTksJCTEKKyNkZWZpbmUgUlRNR1JQX05PVElGWQkJMgorI2RlZmluZSBSVE1HUlBfTkVJR0gJCTQKKyNkZWZpbmUgUlRNR1JQX1RDCQk4CisKKyNkZWZpbmUgUlRNR1JQX0lQVjRfSUZBRERSCTB4MTAKKyNkZWZpbmUgUlRNR1JQX0lQVjRfTVJPVVRFCTB4MjAKKyNkZWZpbmUgUlRNR1JQX0lQVjRfUk9VVEUJMHg0MAorI2RlZmluZSBSVE1HUlBfSVBWNF9SVUxFCTB4ODAKKworI2RlZmluZSBSVE1HUlBfSVBWNl9JRkFERFIJMHgxMDAKKyNkZWZpbmUgUlRNR1JQX0lQVjZfTVJPVVRFCTB4MjAwCisjZGVmaW5lIFJUTUdSUF9JUFY2X1JPVVRFCTB4NDAwCisjZGVmaW5lIFJUTUdSUF9JUFY2X0lGSU5GTwkweDgwMAorCisjZGVmaW5lIFJUTUdSUF9ERUNuZXRfSUZBRERSICAgIDB4MTAwMAorI2RlZmluZSBSVE1HUlBfREVDbmV0X1JPVVRFICAgICAweDQwMDAKKworI2RlZmluZSBSVE1HUlBfSVBWNl9QUkVGSVgJMHgyMDAwMAorCisvKiBSVG5ldGxpbmsgbXVsdGljYXN0IGdyb3VwcyAqLworZW51bSBydG5ldGxpbmtfZ3JvdXBzIHsKKwlSVE5MR1JQX05PTkUsCisjZGVmaW5lIFJUTkxHUlBfTk9ORQkJUlROTEdSUF9OT05FCisJUlROTEdSUF9MSU5LLAorI2RlZmluZSBSVE5MR1JQX0xJTksJCVJUTkxHUlBfTElOSworCVJUTkxHUlBfTk9USUZZLAorI2RlZmluZSBSVE5MR1JQX05PVElGWQkJUlROTEdSUF9OT1RJRlkKKwlSVE5MR1JQX05FSUdILAorI2RlZmluZSBSVE5MR1JQX05FSUdICQlSVE5MR1JQX05FSUdICisJUlROTEdSUF9UQywKKyNkZWZpbmUgUlROTEdSUF9UQwkJUlROTEdSUF9UQworCVJUTkxHUlBfSVBWNF9JRkFERFIsCisjZGVmaW5lIFJUTkxHUlBfSVBWNF9JRkFERFIJUlROTEdSUF9JUFY0X0lGQUREUgorCVJUTkxHUlBfSVBWNF9NUk9VVEUsCisjZGVmaW5lCVJUTkxHUlBfSVBWNF9NUk9VVEUJUlROTEdSUF9JUFY0X01ST1VURQorCVJUTkxHUlBfSVBWNF9ST1VURSwKKyNkZWZpbmUgUlROTEdSUF9JUFY0X1JPVVRFCVJUTkxHUlBfSVBWNF9ST1VURQorCVJUTkxHUlBfSVBWNF9SVUxFLAorI2RlZmluZSBSVE5MR1JQX0lQVjRfUlVMRQlSVE5MR1JQX0lQVjRfUlVMRQorCVJUTkxHUlBfSVBWNl9JRkFERFIsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9JRkFERFIJUlROTEdSUF9JUFY2X0lGQUREUgorCVJUTkxHUlBfSVBWNl9NUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9NUk9VVEUJUlROTEdSUF9JUFY2X01ST1VURQorCVJUTkxHUlBfSVBWNl9ST1VURSwKKyNkZWZpbmUgUlROTEdSUF9JUFY2X1JPVVRFCVJUTkxHUlBfSVBWNl9ST1VURQorCVJUTkxHUlBfSVBWNl9JRklORk8sCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9JRklORk8JUlROTEdSUF9JUFY2X0lGSU5GTworCVJUTkxHUlBfREVDbmV0X0lGQUREUiwKKyNkZWZpbmUgUlROTEdSUF9ERUNuZXRfSUZBRERSCVJUTkxHUlBfREVDbmV0X0lGQUREUgorCVJUTkxHUlBfTk9QMiwKKwlSVE5MR1JQX0RFQ25ldF9ST1VURSwKKyNkZWZpbmUgUlROTEdSUF9ERUNuZXRfUk9VVEUJUlROTEdSUF9ERUNuZXRfUk9VVEUKKwlSVE5MR1JQX0RFQ25ldF9SVUxFLAorI2RlZmluZSBSVE5MR1JQX0RFQ25ldF9SVUxFCVJUTkxHUlBfREVDbmV0X1JVTEUKKwlSVE5MR1JQX05PUDQsCisJUlROTEdSUF9JUFY2X1BSRUZJWCwKKyNkZWZpbmUgUlROTEdSUF9JUFY2X1BSRUZJWAlSVE5MR1JQX0lQVjZfUFJFRklYCisJUlROTEdSUF9JUFY2X1JVTEUsCisjZGVmaW5lIFJUTkxHUlBfSVBWNl9SVUxFCVJUTkxHUlBfSVBWNl9SVUxFCisJUlROTEdSUF9ORF9VU0VST1BULAorI2RlZmluZSBSVE5MR1JQX05EX1VTRVJPUFQJUlROTEdSUF9ORF9VU0VST1BUCisJX19SVE5MR1JQX01BWAorfTsKKyNkZWZpbmUgUlROTEdSUF9NQVgJKF9fUlROTEdSUF9NQVggLSAxKQorCisvKiBUQyBhY3Rpb24gcGllY2UgKi8KK3N0cnVjdCB0Y2Ftc2cKK3sKKwl1bnNpZ25lZCBjaGFyCXRjYV9mYW1pbHk7CisJdW5zaWduZWQgY2hhcgl0Y2FfX3BhZDE7CisJdW5zaWduZWQgc2hvcnQJdGNhX19wYWQyOworfTsKKyNkZWZpbmUgVEFfUlRBKHIpICAoKHN0cnVjdCBydGF0dHIqKSgoKGNoYXIqKShyKSkgKyBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRjYW1zZykpKSkKKyNkZWZpbmUgVEFfUEFZTE9BRChuKSBOTE1TR19QQVlMT0FEKG4sc2l6ZW9mKHN0cnVjdCB0Y2Ftc2cpKQorI2RlZmluZSBUQ0FfQUNUX1RBQiAxIC8qIGF0dHIgdHlwZSBtdXN0IGJlID49MSAqLwkKKyNkZWZpbmUgVENBQV9NQVggMQorCisvKiBFbmQgb2YgaW5mb3JtYXRpb24gZXhwb3J0ZWQgdG8gdXNlciBsZXZlbCAqLworCisKKworI2VuZGlmCS8qIF9fTElOVVhfUlRORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2N2NjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NjYy5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiAkSWQ6IHNjYy5oLHYgMS4yOSAxOTk3LzA0LzAyIDE0OjU2OjQ1IGpyZXV0ZXIgRXhwIGpyZXV0ZXIgJCAqLworCisjaWZuZGVmCV9TQ0NfSAorI2RlZmluZQlfU0NDX0gKKworCisvKiBzZWxlY3Rpb24gb2YgaGFyZHdhcmUgdHlwZXMgKi8KKworI2RlZmluZSBQQTBIWlAJCTB4MDAJLyogaGFyZHdhcmUgdHlwZSBmb3IgUEEwSFpQIFNDQyBjYXJkIGFuZCBjb21wYXRpYmxlICovCisjZGVmaW5lIEVBR0xFCQkweDAxICAgIC8qIGhhcmR3YXJlIHR5cGUgZm9yIEVBR0xFIGNhcmQgKi8KKyNkZWZpbmUgUEMxMDAJCTB4MDIJLyogaGFyZHdhcmUgdHlwZSBmb3IgUEMxMDAgY2FyZCAqLworI2RlZmluZSBQUklNVVMJCTB4MDQJLyogaGFyZHdhcmUgdHlwZSBmb3IgUFJJTVVTLVBDIChERzlCTCkgY2FyZCAqLworI2RlZmluZSBEUlNJCQkweDA4CS8qIGhhcmR3YXJlIHR5cGUgZm9yIERSU0kgUEMqUGFja2V0IGNhcmQgKi8KKyNkZWZpbmUgQkFZQ09NCQkweDEwCS8qIGhhcmR3YXJlIHR5cGUgZm9yIEJheUNvbSAoVSlTQ0MgKi8KKworLyogREVWIGlvY3RsKCkgY29tbWFuZHMgKi8KKworZW51bSBTQ0NfaW9jdGxfY21kcyB7CisJU0lPQ1NDQ1JFU0VSVkVEID0gU0lPQ0RFVlBSSVZBVEUsCisJU0lPQ1NDQ0NGRywKKwlTSU9DU0NDSU5JLAorCVNJT0NTQ0NDSEFOSU5JLAorCVNJT0NTQ0NTTUVNLAorCVNJT0NTQ0NHS0lTUywKKwlTSU9DU0NDU0tJU1MsCisJU0lPQ1NDQ0dTVEFULAorCVNJT0NTQ0NDQUwKK307CisKKy8qIERldmljZSBwYXJhbWV0ZXIgY29udHJvbCAoZnJvbSBXQU1QRVMpICovCisKK2VudW0gTDFfcGFyYW1zIHsKKwlQQVJBTV9EQVRBLAorCVBBUkFNX1RYREVMQVksCisJUEFSQU1fUEVSU0lTVCwKKwlQQVJBTV9TTE9UVElNRSwKKwlQQVJBTV9UWFRBSUwsCisJUEFSQU1fRlVMTERVUCwKKwlQQVJBTV9TT0ZURENELAkJLyogd2FzOiBQQVJBTV9IVyAqLworCVBBUkFNX01VVEUsCQkvKiA/Pz8gKi8KKwlQQVJBTV9EVFIsCisJUEFSQU1fUlRTLAorCVBBUkFNX1NQRUVELAorCVBBUkFNX0VORERFTEFZLAkJLyogPz8/ICovCisJUEFSQU1fR1JPVVAsCisJUEFSQU1fSURMRSwKKwlQQVJBTV9NSU4sCisJUEFSQU1fTUFYS0VZLAorCVBBUkFNX1dBSVQsCisJUEFSQU1fTUFYREVGRVIsCisJUEFSQU1fVFgsCisJUEFSQU1fSFdFVkVOVCA9IDMxLAorCVBBUkFNX1JFVFVSTiA9IDI1NQkvKiByZXNldCBraXNzIG1vZGUgKi8KK307CisKKy8qIGZ1bGxkdXAgcGFyYW1ldGVyICovCisKK2VudW0gRlVMTERVUF9tb2RlcyB7CisJS0lTU19EVVBMRVhfSEFMRiwJLyogbm9ybWFsIENTTUEgb3BlcmF0aW9uICovCisJS0lTU19EVVBMRVhfRlVMTCwJLyogZnVsbGR1cGxleCwga2V5IGRvd24gdHJ4IGFmdGVyIHRyYW5zbWlzc2lvbiAqLworCUtJU1NfRFVQTEVYX0xJTkssCS8qIGZ1bGxkdXBsZXgsIGtleSBkb3duIHRyeCBhZnRlciAnaWRsZXRpbWUnIHNlYyAqLworCUtJU1NfRFVQTEVYX09QVElNQQkvKiBmdWxsZHVwbGV4LCBsZXQgdGhlIHByb3RvY29sIGxheWVyIGNvbnRyb2wgdGhlIGh3ICovCit9OworCisvKiBtaXNjLiBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgVElNRVJfT0ZGCTY1NTM1VQkvKiB0byBzd2l0Y2ggb2ZmIHRpbWVycyAqLworI2RlZmluZSBOT19TVUNIX1BBUkFNCTY1NTM0VQkvKiBwYXJhbSBub3QgaW1wbGVtZW50ZWQgKi8KKworLyogSFdFVkVOVCBwYXJhbWV0ZXIgKi8KKworZW51bSBIV0VWRU5UX29wdHMgeworCUhXRVZfRENEX09OLAorCUhXRVZfRENEX09GRiwKKwlIV0VWX0FMTF9TRU5UCit9OworCisvKiBjaGFubmVsIGdyb3VwaW5nICovCisKKyNkZWZpbmUgUlhHUk9VUAkJMDEwMAkvKiBpZiBzZXQsIG9ubHkgdHggd2hlbiBhbGwgY2hhbm5lbHMgY2xlYXIgKi8KKyNkZWZpbmUgVFhHUk9VUAkJMDIwMAkvKiBpZiBzZXQsIGRvbid0IHRyYW5zbWl0IHNpbXVsdGFuZW91c2x5ICovCisKKy8qIFR4L1J4IGNsb2NrIHNvdXJjZXMgKi8KKworZW51bSBDTE9DS19zb3VyY2VzIHsKKwlDTEtfRFBMTCwJLyogbm9ybWFsIGhhbGZkdXBsZXggb3BlcmF0aW9uICovCisJQ0xLX0VYVEVSTkFMLAkvKiBleHRlcm5hbCBjbG9ja2luZyAoRzNSVUgvREY5SUMgbW9kZW1zKSAqLworCUNMS19ESVZJREVSLAkvKiBSeCA9IERQTEwsIFR4ID0gZGl2aWRlciAoZnVsbGR1cGxleCB3aXRoICovCisJCQkvKiBtb2RlbXMgd2l0aG91dCBjbG9jayByZWdlbmVyYXRpb24gKi8KKwlDTEtfQlJHCQkvKiBleHBlcmltZW50YWwgZnVsbGR1cGxleCBtb2RlIHdpdGggRFBMTC9CUkcgZm9yICovCisJCQkvKiBNT0RFTXMgd2l0aG91dCBjbG9jayByZWNvdmVyeSAqLworfTsKKworLyogVHggc3RhdGUgKi8KKworZW51bSBUWF9zdGF0ZSB7CisJVFhTX0lETEUsCS8qIFRyYW5zbWl0dGVyIG9mZiwgbm8gZGF0YSBwZW5kaW5nICovCisJVFhTX0JVU1ksCS8qIHdhaXRpbmcgZm9yIHBlcm1pc3Npb24gdG8gc2VuZCAvIHRhaWx0aW1lICovCisJVFhTX0FDVElWRSwJLyogVHJhbnNtaXR0ZXIgb24sIHNlbmRpbmcgZGF0YSAqLworCVRYU19ORVdGUkFNRSwJLyogcmVzZXQgQ1JDIGFuZCBzZW5kIChuZXh0KSBmcmFtZSAqLworCVRYU19JRExFMiwJLyogVHJhbnNtaXR0ZXIgb24sIG5vIGRhdGEgcGVuZGluZyAqLworCVRYU19XQUlULAkvKiBXYWl0aW5nIGZvciBNaW50aW1lIHRvIGV4cGlyZSAqLworCVRYU19USU1FT1VUCS8qIFdlIGhhZCBhIHRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCit9OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW9fcG9ydDsJLyogdHlwZSBkZWZpbml0aW9uIGZvciBhbiAnaW8gcG9ydCBhZGRyZXNzJyAqLworCisvKiBTQ0Mgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gKi8KKworc3RydWN0IHNjY19zdGF0IHsKKyAgICAgICAgbG9uZyByeGludHM7ICAgICAgICAgICAgLyogUmVjZWl2ZXIgaW50ZXJydXB0cyAqLworICAgICAgICBsb25nIHR4aW50czsgICAgICAgICAgICAvKiBUcmFuc21pdHRlciBpbnRlcnJ1cHRzICovCisgICAgICAgIGxvbmcgZXhpbnRzOyAgICAgICAgICAgIC8qIEV4dGVybmFsL3N0YXR1cyBpbnRlcnJ1cHRzICovCisgICAgICAgIGxvbmcgc3BpbnRzOyAgICAgICAgICAgIC8qIFNwZWNpYWwgcmVjZWl2ZXIgaW50ZXJydXB0cyAqLworCisgICAgICAgIGxvbmcgdHhmcmFtZXM7ICAgICAgICAgIC8qIFBhY2tldHMgc2VudCAqLworICAgICAgICBsb25nIHJ4ZnJhbWVzOyAgICAgICAgICAvKiBOdW1iZXIgb2YgRnJhbWVzIEFjdHVhbGx5IFJlY2VpdmVkICovCisgICAgICAgIGxvbmcgcnhlcnJzOyAgICAgICAgICAgIC8qIENSQyBFcnJvcnMgKi8KKyAgICAgICAgbG9uZyB0eGVycnM7CQkvKiBLSVNTIGVycm9ycyAqLworICAgICAgICAKKwl1bnNpZ25lZCBpbnQgbm9zcGFjZTsJLyogIk91dCBvZiBidWZmZXJzIiAqLworCXVuc2lnbmVkIGludCByeF9vdmVyOwkvKiBSZWNlaXZlciBPdmVycnVucyAqLworCXVuc2lnbmVkIGludCB0eF91bmRlcjsJLyogVHJhbnNtaXR0ZXIgVW5kZXJydW5zICovCisKKwl1bnNpZ25lZCBpbnQgdHhfc3RhdGU7CS8qIFRyYW5zbWl0dGVyIHN0YXRlICovCisJaW50IHR4X3F1ZXVlZDsJCS8qIHR4IGZyYW1lcyBlbnF1ZXVlZCAqLworCisJdW5zaWduZWQgaW50IG1heHF1ZXVlOwkvKiBhbGxvY2F0ZWQgdHhfYnVmZmVycyAqLworCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiB1c2VkIGJ1ZmZlcnNpemUgKi8KK307CisKK3N0cnVjdCBzY2NfbW9kZW0geworCWxvbmcgc3BlZWQ7CQkvKiBMaW5lIHNwZWVkLCBicHMgKi8KKwljaGFyIGNsb2Nrc3JjOwkJLyogMCA9IERQTEwsIDEgPSBleHRlcm5hbCwgMiA9IGRpdmlkZXIgKi8KKwljaGFyIG5yejsJCS8qIE5SWiBpbnN0ZWFkIG9mIE5SWkkgKi8JCit9OworCitzdHJ1Y3Qgc2NjX2tpc3NfY21kIHsKKwlpbnQgIAkgY29tbWFuZDsJLyogb25lIG9mIHRoZSBLSVNTLUNvbW1hbmRzIGRlZmluZWQgYWJvdmUgKi8KKwl1bnNpZ25lZCBwYXJhbTsJCS8qIEtJU1MtUGFyYW0gKi8KK307CisKK3N0cnVjdCBzY2NfaHdfY29uZmlnIHsKKwlpb19wb3J0IGRhdGFfYTsJCS8qIGRhdGEgcG9ydCBjaGFubmVsIEEgKi8KKwlpb19wb3J0IGN0cmxfYTsJCS8qIGNvbnRyb2wgcG9ydCBjaGFubmVsIEEgKi8KKwlpb19wb3J0IGRhdGFfYjsJCS8qIGRhdGEgcG9ydCBjaGFubmVsIEIgKi8KKwlpb19wb3J0IGN0cmxfYjsJCS8qIGNvbnRyb2wgcG9ydCBjaGFubmVsIEIgKi8KKwlpb19wb3J0IHZlY3Rvcl9sYXRjaDsJLyogSU5UQUNLLUxhdGNoICgjKSAqLworCWlvX3BvcnQJc3BlY2lhbDsJLyogc3BlY2lhbCBmdW5jdGlvbiBwb3J0ICovCisKKwlpbnQJaXJxOwkJLyogaXJxICovCisJbG9uZwljbG9jazsJCS8qIGNsb2NrICovCisJY2hhcglvcHRpb247CQkvKiBjb21tYW5kIGZvciBmdW5jdGlvbiBwb3J0ICovCisKKwljaGFyIGJyYW5kOwkJLyogaGFyZHdhcmUgdHlwZSAqLworCWNoYXIgZXNjYzsJCS8qIHVzZSBleHQuIGZlYXR1cmVzIG9mIGEgODU4MC84NTE4MC84NTI4MCAqLworfTsKKworLyogKCMpIG9ubHkgb25lIElOVEFDSyBsYXRjaCBhbGxvd2VkLiAqLworCisKK3N0cnVjdCBzY2NfbWVtX2NvbmZpZyB7CisJdW5zaWduZWQgaW50IGR1bW15OworCXVuc2lnbmVkIGludCBidWZzaXplOworfTsKKworc3RydWN0IHNjY19jYWxpYnJhdGUgeworCXVuc2lnbmVkIGludCB0aW1lOworCXVuc2lnbmVkIGNoYXIgcGF0dGVybjsKK307CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9TQ0NfSCkgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ1NmE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0wLDAgKzEsNDIgQEAKKyNpZm5kZWYgX0xJTlVYX1NDSEVEX0gKKyNkZWZpbmUgX0xJTlVYX1NDSEVEX0gKKworLyoKKyAqIGNsb25pbmcgZmxhZ3M6CisgKi8KKyNkZWZpbmUgQ1NJR05BTAkJMHgwMDAwMDBmZgkvKiBzaWduYWwgbWFzayB0byBiZSBzZW50IGF0IGV4aXQgKi8KKyNkZWZpbmUgQ0xPTkVfVk0JMHgwMDAwMDEwMAkvKiBzZXQgaWYgVk0gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzICovCisjZGVmaW5lIENMT05FX0ZTCTB4MDAwMDAyMDAJLyogc2V0IGlmIGZzIGluZm8gc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzICovCisjZGVmaW5lIENMT05FX0ZJTEVTCTB4MDAwMDA0MDAJLyogc2V0IGlmIG9wZW4gZmlsZXMgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzICovCisjZGVmaW5lIENMT05FX1NJR0hBTkQJMHgwMDAwMDgwMAkvKiBzZXQgaWYgc2lnbmFsIGhhbmRsZXJzIGFuZCBibG9ja2VkIHNpZ25hbHMgc2hhcmVkICovCisjZGVmaW5lIENMT05FX1BUUkFDRQkweDAwMDAyMDAwCS8qIHNldCBpZiB3ZSB3YW50IHRvIGxldCB0cmFjaW5nIGNvbnRpbnVlIG9uIHRoZSBjaGlsZCB0b28gKi8KKyNkZWZpbmUgQ0xPTkVfVkZPUksJMHgwMDAwNDAwMAkvKiBzZXQgaWYgdGhlIHBhcmVudCB3YW50cyB0aGUgY2hpbGQgdG8gd2FrZSBpdCB1cCBvbiBtbV9yZWxlYXNlICovCisjZGVmaW5lIENMT05FX1BBUkVOVAkweDAwMDA4MDAwCS8qIHNldCBpZiB3ZSB3YW50IHRvIGhhdmUgdGhlIHNhbWUgcGFyZW50IGFzIHRoZSBjbG9uZXIgKi8KKyNkZWZpbmUgQ0xPTkVfVEhSRUFECTB4MDAwMTAwMDAJLyogU2FtZSB0aHJlYWQgZ3JvdXA/ICovCisjZGVmaW5lIENMT05FX05FV05TCTB4MDAwMjAwMDAJLyogTmV3IG5hbWVzcGFjZSBncm91cD8gKi8KKyNkZWZpbmUgQ0xPTkVfU1lTVlNFTQkweDAwMDQwMDAwCS8qIHNoYXJlIHN5c3RlbSBWIFNFTV9VTkRPIHNlbWFudGljcyAqLworI2RlZmluZSBDTE9ORV9TRVRUTFMJMHgwMDA4MDAwMAkvKiBjcmVhdGUgYSBuZXcgVExTIGZvciB0aGUgY2hpbGQgKi8KKyNkZWZpbmUgQ0xPTkVfUEFSRU5UX1NFVFRJRAkweDAwMTAwMDAwCS8qIHNldCB0aGUgVElEIGluIHRoZSBwYXJlbnQgKi8KKyNkZWZpbmUgQ0xPTkVfQ0hJTERfQ0xFQVJUSUQJMHgwMDIwMDAwMAkvKiBjbGVhciB0aGUgVElEIGluIHRoZSBjaGlsZCAqLworI2RlZmluZSBDTE9ORV9ERVRBQ0hFRAkJMHgwMDQwMDAwMAkvKiBVbnVzZWQsIGlnbm9yZWQgKi8KKyNkZWZpbmUgQ0xPTkVfVU5UUkFDRUQJCTB4MDA4MDAwMDAJLyogc2V0IGlmIHRoZSB0cmFjaW5nIHByb2Nlc3MgY2FuJ3QgZm9yY2UgQ0xPTkVfUFRSQUNFIG9uIHRoaXMgY2xvbmUgKi8KKyNkZWZpbmUgQ0xPTkVfQ0hJTERfU0VUVElECTB4MDEwMDAwMDAJLyogc2V0IHRoZSBUSUQgaW4gdGhlIGNoaWxkICovCisjZGVmaW5lIENMT05FX1NUT1BQRUQJCTB4MDIwMDAwMDAJLyogU3RhcnQgaW4gc3RvcHBlZCBzdGF0ZSAqLworI2RlZmluZSBDTE9ORV9ORVdVVFMJCTB4MDQwMDAwMDAJLyogTmV3IHV0c25hbWUgZ3JvdXA/ICovCisjZGVmaW5lIENMT05FX05FV0lQQwkJMHgwODAwMDAwMAkvKiBOZXcgaXBjcyAqLworI2RlZmluZSBDTE9ORV9ORVdVU0VSCQkweDEwMDAwMDAwCS8qIE5ldyB1c2VyIG5hbWVzcGFjZSAqLworI2RlZmluZSBDTE9ORV9ORVdQSUQJCTB4MjAwMDAwMDAJLyogTmV3IHBpZCBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgQ0xPTkVfTkVXTkVUCQkweDQwMDAwMDAwCS8qIE5ldyBuZXR3b3JrIG5hbWVzcGFjZSAqLworCisvKgorICogU2NoZWR1bGluZyBwb2xpY2llcworICovCisjZGVmaW5lIFNDSEVEX05PUk1BTAkJMAorI2RlZmluZSBTQ0hFRF9GSUZPCQkxCisjZGVmaW5lIFNDSEVEX1JSCQkyCisjZGVmaW5lIFNDSEVEX0JBVENICQkzCisvKiBTQ0hFRF9JU086IHJlc2VydmVkIGJ1dCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisjZGVmaW5lIFNDSEVEX0lETEUJCTUKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NyZWVuX2luZm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2NyZWVuX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg1OTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zY3JlZW5faW5mby5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX1NDUkVFTl9JTkZPX0gKKyNkZWZpbmUgX1NDUkVFTl9JTkZPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUaGVzZSBhcmUgc2V0IHVwIGJ5IHRoZSBzZXR1cC1yb3V0aW5lIGF0IGJvb3QtdGltZToKKyAqLworCitzdHJ1Y3Qgc2NyZWVuX2luZm8geworCV9fdTggIG9yaWdfeDsJCS8qIDB4MDAgKi8KKwlfX3U4ICBvcmlnX3k7CQkvKiAweDAxICovCisJX191MTYgZXh0X21lbV9rOwkvKiAweDAyICovCisJX191MTYgb3JpZ192aWRlb19wYWdlOwkvKiAweDA0ICovCisJX191OCAgb3JpZ192aWRlb19tb2RlOwkvKiAweDA2ICovCisJX191OCAgb3JpZ192aWRlb19jb2xzOwkvKiAweDA3ICovCisJX191MTYgdW51c2VkMjsJCS8qIDB4MDggKi8KKwlfX3UxNiBvcmlnX3ZpZGVvX2VnYV9ieDsvKiAweDBhICovCisJX191MTYgdW51c2VkMzsJCS8qIDB4MGMgKi8KKwlfX3U4ICBvcmlnX3ZpZGVvX2xpbmVzOwkvKiAweDBlICovCisJX191OCAgb3JpZ192aWRlb19pc1ZHQTsJLyogMHgwZiAqLworCV9fdTE2IG9yaWdfdmlkZW9fcG9pbnRzOy8qIDB4MTAgKi8KKworCS8qIFZFU0EgZ3JhcGhpYyBtb2RlIC0tIGxpbmVhciBmcmFtZSBidWZmZXIgKi8KKwlfX3UxNiBsZmJfd2lkdGg7CS8qIDB4MTIgKi8KKwlfX3UxNiBsZmJfaGVpZ2h0OwkvKiAweDE0ICovCisJX191MTYgbGZiX2RlcHRoOwkvKiAweDE2ICovCisJX191MzIgbGZiX2Jhc2U7CQkvKiAweDE4ICovCisJX191MzIgbGZiX3NpemU7CQkvKiAweDFjICovCisJX191MTYgY2xfbWFnaWMsIGNsX29mZnNldDsgLyogMHgyMCAqLworCV9fdTE2IGxmYl9saW5lbGVuZ3RoOwkvKiAweDI0ICovCisJX191OCAgcmVkX3NpemU7CQkvKiAweDI2ICovCisJX191OCAgcmVkX3BvczsJCS8qIDB4MjcgKi8KKwlfX3U4ICBncmVlbl9zaXplOwkvKiAweDI4ICovCisJX191OCAgZ3JlZW5fcG9zOwkvKiAweDI5ICovCisJX191OCAgYmx1ZV9zaXplOwkvKiAweDJhICovCisJX191OCAgYmx1ZV9wb3M7CQkvKiAweDJiICovCisJX191OCAgcnN2ZF9zaXplOwkvKiAweDJjICovCisJX191OCAgcnN2ZF9wb3M7CQkvKiAweDJkICovCisJX191MTYgdmVzYXBtX3NlZzsJLyogMHgyZSAqLworCV9fdTE2IHZlc2FwbV9vZmY7CS8qIDB4MzAgKi8KKwlfX3UxNiBwYWdlczsJCS8qIDB4MzIgKi8KKwlfX3UxNiB2ZXNhX2F0dHJpYnV0ZXM7CS8qIDB4MzQgKi8KKwlfX3UzMiBjYXBhYmlsaXRpZXM7ICAgICAvKiAweDM2ICovCisJX191OCAgX3Jlc2VydmVkWzZdOwkvKiAweDNhICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFZJREVPX1RZUEVfTURBCQkweDEwCS8qIE1vbm9jaHJvbWUgVGV4dCBEaXNwbGF5CSovCisjZGVmaW5lIFZJREVPX1RZUEVfQ0dBCQkweDExCS8qIENHQSBEaXNwbGF5IAkJCSovCisjZGVmaW5lIFZJREVPX1RZUEVfRUdBTQkJMHgyMAkvKiBFR0EvVkdBIGluIE1vbm9jaHJvbWUgTW9kZQkqLworI2RlZmluZSBWSURFT19UWVBFX0VHQUMJCTB4MjEJLyogRUdBIGluIENvbG9yIE1vZGUJCSovCisjZGVmaW5lIFZJREVPX1RZUEVfVkdBQwkJMHgyMgkvKiBWR0ErIGluIENvbG9yIE1vZGUJCSovCisjZGVmaW5lIFZJREVPX1RZUEVfVkxGQgkJMHgyMwkvKiBWRVNBIFZHQSBpbiBncmFwaGljIG1vZGUJKi8KKworI2RlZmluZSBWSURFT19UWVBFX1BJQ0FfUzMJMHgzMAkvKiBBQ0VSIFBJQ0EtNjEgbG9jYWwgUzMgdmlkZW8JKi8KKyNkZWZpbmUgVklERU9fVFlQRV9NSVBTX0czNjQJMHgzMSAgICAvKiBNSVBTIE1hZ251bSA0MDAwIEczNjQgdmlkZW8gICovCisjZGVmaW5lIFZJREVPX1RZUEVfU0dJICAgICAgICAgIDB4MzMgICAgLyogVmFyaW91cyBTR0kgZ3JhcGhpY3MgaGFyZHdhcmUgKi8KKworI2RlZmluZSBWSURFT19UWVBFX1RHQUMJCTB4NDAJLyogREVDIFRHQSAqLworCisjZGVmaW5lIFZJREVPX1RZUEVfU1VOICAgICAgICAgIDB4NTAgICAgLyogU3VuIGZyYW1lIGJ1ZmZlci4gKi8KKyNkZWZpbmUgVklERU9fVFlQRV9TVU5QQ0kgICAgICAgMHg1MSAgICAvKiBTdW4gUENJIGJhc2VkIGZyYW1lIGJ1ZmZlci4gKi8KKworI2RlZmluZSBWSURFT19UWVBFX1BNQUMJCTB4NjAJLyogUG93ZXJNYWNpbnRvc2ggZnJhbWUgYnVmZmVyLiAqLworCisjZGVmaW5lIFZJREVPX1RZUEVfRUZJCQkweDcwCS8qIEVGSSBncmFwaGljIG1vZGUJCSovCisKKworI2VuZGlmIC8qIF9TQ1JFRU5fSU5GT19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NkbGEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2RsYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2I0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NkbGEuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlHbG9iYWwgZGVmaW5pdGlvbnMgZm9yIHRoZSBGcmFtZSByZWxheSBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWlmX2lmcmFkLmgJMC4yMAkxMyBBcHIgOTYKKyAqCisgKiBBdXRob3I6CU1pa2UgTWNMYWdhbiA8bWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZz4KKyAqCisgKiBDaGFuZ2VzOgorICoJCTAuMTUJTWlrZSBNY0xhZ2FuCVN0cnVjdHVyZSBwYWNraW5nCisgKgorICoJCTAuMjAJTWlrZSBNY0xhZ2FuCU5ldyBmbGFncyBmb3IgUzUwOCBidWZmZXIgaGFuZGxpbmcKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFNETEFfSAorI2RlZmluZSBTRExBX0gKKworLyogYWRhcHRlciB0eXBlICovCisjZGVmaW5lIFNETEFfVFlQRVMKKyNkZWZpbmUgU0RMQV9TNTAyQQkJCTUwMjAKKyNkZWZpbmUgU0RMQV9TNTAyRQkJCTUwMjEKKyNkZWZpbmUgU0RMQV9TNTAzCQkJNTAzMAorI2RlZmluZSBTRExBX1M1MDcJCQk1MDcwCisjZGVmaW5lIFNETEFfUzUwOAkJCTUwODAKKyNkZWZpbmUgU0RMQV9TNTA5CQkJNTA5MAorI2RlZmluZSBTRExBX1VOS05PV04JCQktMQorCisvKiBwb3J0IHNlbGVjdGlvbiBmbGFncyBmb3IgdGhlIFM1MDggKi8KKyNkZWZpbmUgU0RMQV9TNTA4X1BPUlRfVjM1CQkweDAwCisjZGVmaW5lIFNETEFfUzUwOF9QT1JUX1JTMjMyCQkweDAyCisKKy8qIFo4MCBDUFUgc3BlZWRzICovCisjZGVmaW5lIFNETEFfQ1BVXzNNCQkJMHgwMAorI2RlZmluZSBTRExBX0NQVV81TQkJCTB4MDEKKyNkZWZpbmUgU0RMQV9DUFVfN00JCQkweDAyCisjZGVmaW5lIFNETEFfQ1BVXzhNCQkJMHgwMworI2RlZmluZSBTRExBX0NQVV8xME0JCQkweDA0CisjZGVmaW5lIFNETEFfQ1BVXzE2TQkJCTB4MDUKKyNkZWZpbmUgU0RMQV9DUFVfMTJNCQkJMHgwNgorCisvKiBzb21lIHByaXZhdGUgSU9DVExzICovCisjZGVmaW5lIFNETEFfSURFTlRJRlkJCQkoRlJBRF9MQVNUX0lPQ1RMICsgMSkKKyNkZWZpbmUgU0RMQV9DUFVTUEVFRAkJCShGUkFEX0xBU1RfSU9DVEwgKyAyKQorI2RlZmluZSBTRExBX1BST1RPQ09MCQkJKEZSQURfTEFTVF9JT0NUTCArIDMpCisKKyNkZWZpbmUgU0RMQV9DTEVBUk1FTQkJCShGUkFEX0xBU1RfSU9DVEwgKyA0KQorI2RlZmluZSBTRExBX1dSSVRFTUVNCQkJKEZSQURfTEFTVF9JT0NUTCArIDUpCisjZGVmaW5lIFNETEFfUkVBRE1FTQkJCShGUkFEX0xBU1RfSU9DVEwgKyA2KQorCitzdHJ1Y3Qgc2RsYV9tZW0geworICAgaW50ICBhZGRyOworICAgaW50ICBsZW47CisgICB2b2lkICpkYXRhOworfTsKKworI2RlZmluZSBTRExBX1NUQVJUCQkJKEZSQURfTEFTVF9JT0NUTCArIDcpCisjZGVmaW5lIFNETEFfU1RPUAkJCShGUkFEX0xBU1RfSU9DVEwgKyA4KQorCisvKiBzb21lIG9mZnNldHMgaW4gdGhlIFo4MCdzIG1lbW9yeSBzcGFjZSAqLworI2RlZmluZSBTRExBX05NSUFERFIJCQkweDAwMDAKKyNkZWZpbmUgU0RMQV9DT05GX0FERFIJCQkweDAwMTAKKyNkZWZpbmUgU0RMQV9TNTAyQV9OTUlBRERSCQkweDAwNjYKKyNkZWZpbmUgU0RMQV9DT0RFX0JBU0VBRERSCQkweDAxMDAKKyNkZWZpbmUgU0RMQV9XSU5ET1dfU0laRQkJMHgyMDAwCisjZGVmaW5lIFNETEFfQUREUl9NQVNLCQkJMHgxRkZGCisKKy8qIGxhcmdlc3QgaGFuZGxlYWJsZSBibG9jayBvZiBkYXRhICovCisjZGVmaW5lIFNETEFfTUFYX0RBVEEJCQk0MDgwCisjZGVmaW5lIFNETEFfTUFYX01UVQkJCTQwNzIJLyogTUFYX0RBVEEgLSBzaXplb2YoZnJhZGhkcikgKi8KKyNkZWZpbmUgU0RMQV9NQVhfRExDSQkJCTI0CisKKy8qIHRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZyYWRfY29uZiAqLworc3RydWN0IHNkbGFfY29uZiB7CisgICBzaG9ydCBzdGF0aW9uOworICAgc2hvcnQgY29uZmlnOworICAgc2hvcnQga2JhdWQ7CisgICBzaG9ydCBjbG9ja2luZzsKKyAgIHNob3J0IG1heF9mcm07CisgICBzaG9ydCBUMzkxOworICAgc2hvcnQgVDM5MjsKKyAgIHNob3J0IE4zOTE7CisgICBzaG9ydCBOMzkyOworICAgc2hvcnQgTjM5MzsKKyAgIHNob3J0IENJUl9md2Q7CisgICBzaG9ydCBCY19md2Q7CisgICBzaG9ydCBCZV9md2Q7CisgICBzaG9ydCBDSVJfYndkOworICAgc2hvcnQgQmNfYndkOworICAgc2hvcnQgQmVfYndkOworfTsKKworLyogdGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZGxjaV9jb25mICovCitzdHJ1Y3Qgc2RsYV9kbGNpX2NvbmYgeworICAgc2hvcnQgY29uZmlnOworICAgc2hvcnQgQ0lSX2Z3ZDsKKyAgIHNob3J0IEJjX2Z3ZDsKKyAgIHNob3J0IEJlX2Z3ZDsKKyAgIHNob3J0IENJUl9id2Q7CisgICBzaG9ydCBCY19id2Q7CisgICBzaG9ydCBCZV9id2Q7IAorICAgc2hvcnQgVGNfZndkOworICAgc2hvcnQgVGNfYndkOworICAgc2hvcnQgVGZfbWF4OworICAgc2hvcnQgVGJfbWF4OworfTsKKworCit2b2lkIHNkbGEodm9pZCAqY2ZnX2luZm8sIGNoYXIgKmRldiwgc3RydWN0IGZyYWRfY29uZiAqY29uZiwgaW50IHF1aWV0KTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VsaW51eF9uZXRsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbGludXhfbmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTE3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbGludXhfbmV0bGluay5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBOZXRsaW5rIGV2ZW50IG5vdGlmaWNhdGlvbnMgZm9yIFNFTGludXguCisgKgorICogQXV0aG9yOiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1NFTElOVVhfTkVUTElOS19ICisjZGVmaW5lIF9MSU5VWF9TRUxJTlVYX05FVExJTktfSAorCisvKiBNZXNzYWdlIHR5cGVzLiAqLworI2RlZmluZSBTRUxOTF9NU0dfQkFTRSAweDEwCitlbnVtIHsKKwlTRUxOTF9NU0dfU0VURU5GT1JDRSA9IFNFTE5MX01TR19CQVNFLAorCVNFTE5MX01TR19QT0xJQ1lMT0FELAorCVNFTE5MX01TR19NQVgKK307CisKKy8qIE11bHRpY2FzdCBncm91cHMgLSBiYWNrd2FyZHMgY29tcGF0aWJsaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBTRUxOTF9HUlBfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBTRUxOTF9HUlBfQVZDCQkweDAwMDAwMDAxCS8qIEFWQyBub3RpZmljYXRpb25zICovCisjZGVmaW5lIFNFTE5MX0dSUF9BTEwJCTB4ZmZmZmZmZmYKKworZW51bSBzZWxpbnV4X25sZ3JvdXBzIHsKKwlTRUxOTEdSUF9OT05FLAorI2RlZmluZSBTRUxOTEdSUF9OT05FCVNFTE5MR1JQX05PTkUKKwlTRUxOTEdSUF9BVkMsCisjZGVmaW5lIFNFTE5MR1JQX0FWQwlTRUxOTEdSUF9BVkMKKwlfX1NFTE5MR1JQX01BWAorfTsKKyNkZWZpbmUgU0VMTkxHUlBfTUFYCShfX1NFTE5MR1JQX01BWCAtIDEpCisKKy8qIE1lc3NhZ2Ugc3RydWN0dXJlcyAqLworc3RydWN0IHNlbG5sX21zZ19zZXRlbmZvcmNlIHsKKwlpbnQzMl90CQl2YWw7Cit9OworCitzdHJ1Y3Qgc2VsbmxfbXNnX3BvbGljeWxvYWQgeworCXVfaW50MzJfdAlzZXFubzsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfU0VMSU5VWF9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMTk3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlbS5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgX0xJTlVYX1NFTV9ICisjZGVmaW5lIF9MSU5VWF9TRU1fSAorCisjaW5jbHVkZSA8bGludXgvaXBjLmg+CisKKy8qIHNlbW9wIGZsYWdzICovCisjZGVmaW5lIFNFTV9VTkRPICAgICAgICAweDEwMDAgIC8qIHVuZG8gdGhlIG9wZXJhdGlvbiBvbiBleGl0ICovCisKKy8qIHNlbWN0bCBDb21tYW5kIERlZmluaXRpb25zLiAqLworI2RlZmluZSBHRVRQSUQgIDExICAgICAgIC8qIGdldCBzZW1waWQgKi8KKyNkZWZpbmUgR0VUVkFMICAxMiAgICAgICAvKiBnZXQgc2VtdmFsICovCisjZGVmaW5lIEdFVEFMTCAgMTMgICAgICAgLyogZ2V0IGFsbCBzZW12YWwncyAqLworI2RlZmluZSBHRVROQ05UIDE0ICAgICAgIC8qIGdldCBzZW1uY250ICovCisjZGVmaW5lIEdFVFpDTlQgMTUgICAgICAgLyogZ2V0IHNlbXpjbnQgKi8KKyNkZWZpbmUgU0VUVkFMICAxNiAgICAgICAvKiBzZXQgc2VtdmFsICovCisjZGVmaW5lIFNFVEFMTCAgMTcgICAgICAgLyogc2V0IGFsbCBzZW12YWwncyAqLworCisvKiBpcGNzIGN0bCBjbWRzICovCisjZGVmaW5lIFNFTV9TVEFUIDE4CisjZGVmaW5lIFNFTV9JTkZPIDE5CisKKy8qIE9ic29sZXRlLCB1c2VkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBsaWJjNSBjb21waWxlcyAqLworc3RydWN0IHNlbWlkX2RzIHsKKwlzdHJ1Y3QgaXBjX3Blcm0Jc2VtX3Blcm07CQkvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KKwlfX2tlcm5lbF90aW1lX3QJc2VtX290aW1lOwkJLyogbGFzdCBzZW1vcCB0aW1lICovCisJX19rZXJuZWxfdGltZV90CXNlbV9jdGltZTsJCS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwlzdHJ1Y3Qgc2VtCSpzZW1fYmFzZTsJCS8qIHB0ciB0byBmaXJzdCBzZW1hcGhvcmUgaW4gYXJyYXkgKi8KKwlzdHJ1Y3Qgc2VtX3F1ZXVlICpzZW1fcGVuZGluZzsJCS8qIHBlbmRpbmcgb3BlcmF0aW9ucyB0byBiZSBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3Qgc2VtX3F1ZXVlICoqc2VtX3BlbmRpbmdfbGFzdDsJLyogbGFzdCBwZW5kaW5nIG9wZXJhdGlvbiAqLworCXN0cnVjdCBzZW1fdW5kbwkqdW5kbzsJCQkvKiB1bmRvIHJlcXVlc3RzIG9uIHRoaXMgYXJyYXkgKi8KKwl1bnNpZ25lZCBzaG9ydAlzZW1fbnNlbXM7CQkvKiBuby4gb2Ygc2VtYXBob3JlcyBpbiBhcnJheSAqLworfTsKKworLyogSW5jbHVkZSB0aGUgZGVmaW5pdGlvbiBvZiBzZW1pZDY0X2RzICovCisjaW5jbHVkZSA8YXNtL3NlbWJ1Zi5oPgorCisvKiBzZW1vcCBzeXN0ZW0gY2FsbHMgdGFrZXMgYW4gYXJyYXkgb2YgdGhlc2UuICovCitzdHJ1Y3Qgc2VtYnVmIHsKKwl1bnNpZ25lZCBzaG9ydCAgc2VtX251bTsJLyogc2VtYXBob3JlIGluZGV4IGluIGFycmF5ICovCisJc2hvcnQJCXNlbV9vcDsJCS8qIHNlbWFwaG9yZSBvcGVyYXRpb24gKi8KKwlzaG9ydAkJc2VtX2ZsZzsJLyogb3BlcmF0aW9uIGZsYWdzICovCit9OworCisvKiBhcmcgZm9yIHNlbWN0bCBzeXN0ZW0gY2FsbHMuICovCit1bmlvbiBzZW11biB7CisJaW50IHZhbDsJCQkvKiB2YWx1ZSBmb3IgU0VUVkFMICovCisJc3RydWN0IHNlbWlkX2RzICpidWY7CS8qIGJ1ZmZlciBmb3IgSVBDX1NUQVQgJiBJUENfU0VUICovCisJdW5zaWduZWQgc2hvcnQgKmFycmF5OwkvKiBhcnJheSBmb3IgR0VUQUxMICYgU0VUQUxMICovCisJc3RydWN0IHNlbWluZm8gKl9fYnVmOwkvKiBidWZmZXIgZm9yIElQQ19JTkZPICovCisJdm9pZCAqX19wYWQ7Cit9OworCitzdHJ1Y3QgIHNlbWluZm8geworCWludCBzZW1tYXA7CisJaW50IHNlbW1uaTsKKwlpbnQgc2VtbW5zOworCWludCBzZW1tbnU7CisJaW50IHNlbW1zbDsKKwlpbnQgc2Vtb3BtOworCWludCBzZW11bWU7CisJaW50IHNlbXVzejsKKwlpbnQgc2Vtdm14OworCWludCBzZW1hZW07Cit9OworCisjZGVmaW5lIFNFTU1OSSAgMTI4ICAgICAgICAgICAgIC8qIDw9IElQQ01OSSAgbWF4ICMgb2Ygc2VtYXBob3JlIGlkZW50aWZpZXJzICovCisjZGVmaW5lIFNFTU1TTCAgMjUwICAgICAgICAgICAgIC8qIDw9IDggMDAwIG1heCBudW0gb2Ygc2VtYXBob3JlcyBwZXIgaWQgKi8KKyNkZWZpbmUgU0VNTU5TICAoU0VNTU5JKlNFTU1TTCkgLyogPD0gSU5UX01BWCBtYXggIyBvZiBzZW1hcGhvcmVzIGluIHN5c3RlbSAqLworI2RlZmluZSBTRU1PUE0gIDMyCSAgICAgICAgLyogPD0gMSAwMDAgbWF4IG51bSBvZiBvcHMgcGVyIHNlbW9wIGNhbGwgKi8KKyNkZWZpbmUgU0VNVk1YICAzMjc2NyAgICAgICAgICAgLyogPD0gMzI3Njcgc2VtYXBob3JlIG1heGltdW0gdmFsdWUgKi8KKyNkZWZpbmUgU0VNQUVNICBTRU1WTVggICAgICAgICAgLyogYWRqdXN0IG9uIGV4aXQgbWF4IHZhbHVlICovCisKKy8qIHVudXNlZCAqLworI2RlZmluZSBTRU1VTUUgIFNFTU9QTSAgICAgICAgICAvKiBtYXggbnVtIG9mIHVuZG8gZW50cmllcyBwZXIgcHJvY2VzcyAqLworI2RlZmluZSBTRU1NTlUgIFNFTU1OUyAgICAgICAgICAvKiBudW0gb2YgdW5kbyBzdHJ1Y3R1cmVzIHN5c3RlbSB3aWRlICovCisjZGVmaW5lIFNFTU1BUCAgU0VNTU5TICAgICAgICAgIC8qICMgb2YgZW50cmllcyBpbiBzZW1hcGhvcmUgbWFwICovCisjZGVmaW5lIFNFTVVTWiAgMjAJCS8qIHNpemVvZiBzdHJ1Y3Qgc2VtX3VuZG8gKi8KKworCisjZW5kaWYgLyogX0xJTlVYX1NFTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhhM2YyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWwuaApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvc2VyaWFsLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgYnkgVGhlb2RvcmUgVHMnby4KKyAqIAorICogUmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSAKKyAqIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKi8KKworI2lmbmRlZiBfTElOVVhfU0VSSUFMX0gKKyNkZWZpbmUgX0xJTlVYX1NFUklBTF9ICisKKworc3RydWN0IHNlcmlhbF9zdHJ1Y3QgeworCWludAl0eXBlOworCWludAlsaW5lOworCXVuc2lnbmVkIGludAlwb3J0OworCWludAlpcnE7CisJaW50CWZsYWdzOworCWludAl4bWl0X2ZpZm9fc2l6ZTsKKwlpbnQJY3VzdG9tX2Rpdmlzb3I7CisJaW50CWJhdWRfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAljbG9zZV9kZWxheTsKKwljaGFyCWlvX3R5cGU7CisJY2hhcglyZXNlcnZlZF9jaGFyWzFdOworCWludAlodWI2OworCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDsgLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0MjsgLyogbm8gbG9uZ2VyIHVzZWQuLi4gKi8KKwl1bnNpZ25lZCBjaGFyCSppb21lbV9iYXNlOworCXVuc2lnbmVkIHNob3J0CWlvbWVtX3JlZ19zaGlmdDsKKwl1bnNpZ25lZCBpbnQJcG9ydF9oaWdoOworCXVuc2lnbmVkIGxvbmcJaW9tYXBfYmFzZTsJLyogY29va2llIHBhc3NlZCBpbnRvIGlvcmVtYXAgKi8KK307CisKKy8qCisgKiBGb3IgdGhlIGNsb3NlIHdhaXQgdGltZXMsIDAgbWVhbnMgd2FpdCBmb3JldmVyIGZvciBzZXJpYWwgcG9ydCB0bworICogZmx1c2ggaXRzIG91dHB1dC4gIDY1NTM1IG1lYW5zIGRvbid0IHdhaXQgYXQgYWxsLgorICovCisjZGVmaW5lIEFTWU5DX0NMT1NJTkdfV0FJVF9JTkYJMAorI2RlZmluZSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORQk2NTUzNQorCisvKgorICogVGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgc2VyaWFsIHR5cGVzLgorICovCisjZGVmaW5lIFBPUlRfVU5LTk9XTgkwCisjZGVmaW5lIFBPUlRfODI1MAkxCisjZGVmaW5lIFBPUlRfMTY0NTAJMgorI2RlZmluZSBQT1JUXzE2NTUwCTMKKyNkZWZpbmUgUE9SVF8xNjU1MEEJNAorI2RlZmluZSBQT1JUX0NJUlJVUyAgICAgNQkvKiB1c3VycGVkIGJ5IGN5Y2xhZGVzLmMgKi8KKyNkZWZpbmUgUE9SVF8xNjY1MAk2CisjZGVmaW5lIFBPUlRfMTY2NTBWMgk3CisjZGVmaW5lIFBPUlRfMTY3NTAJOAorI2RlZmluZSBQT1JUX1NUQVJURUNICTkJLyogdXN1cnBlZCBieSBjeWNsYWRlcy5jICovCisjZGVmaW5lIFBPUlRfMTZDOTUwCTEwCS8qIE94Zm9yZCBTZW1pY29uZHVjdG9yICovCisjZGVmaW5lIFBPUlRfMTY2NTQJMTEKKyNkZWZpbmUgUE9SVF8xNjg1MAkxMgorI2RlZmluZSBQT1JUX1JTQQkxMwkvKiBSU0EtRFYgSUkvUyBjYXJkICovCisjZGVmaW5lIFBPUlRfTUFYCTEzCisKKyNkZWZpbmUgU0VSSUFMX0lPX1BPUlQJMAorI2RlZmluZSBTRVJJQUxfSU9fSFVCNgkxCisjZGVmaW5lIFNFUklBTF9JT19NRU0JMgorCitzdHJ1Y3Qgc2VyaWFsX3VhcnRfY29uZmlnIHsKKwljaGFyCSpuYW1lOworCWludAlkZmxfeG1pdF9maWZvX3NpemU7CisJaW50CWZsYWdzOworfTsKKworI2RlZmluZSBVQVJUX0NMRUFSX0ZJRk8JCTB4MDEKKyNkZWZpbmUgVUFSVF9VU0VfRklGTwkJMHgwMgorI2RlZmluZSBVQVJUX1NUQVJURUNICQkweDA0CisjZGVmaW5lIFVBUlRfTkFUU0VNSQkJMHgwOAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGFzeW5jX3N0cnVjdCAoYW5kIHNlcmlhbF9zdHJ1Y3QpIGZsYWdzIGZpZWxkCisgKi8KKyNkZWZpbmUgQVNZTkNfSFVQX05PVElGWSAweDAwMDEgLyogTm90aWZ5IGdldHR5IG9uIGhhbmd1cHMgYW5kIGNsb3NlcyAKKwkJCQkgICBvbiB0aGUgY2FsbG91dCBwb3J0ICovCisjZGVmaW5lIEFTWU5DX0ZPVVJQT1JUICAweDAwMDIJLyogU2V0IE9VMSwgT1VUMiBwZXIgQVNUIEZvdXJwb3J0IHNldHRpbmdzICovCisjZGVmaW5lIEFTWU5DX1NBSwkweDAwMDQJLyogU2VjdXJlIEF0dGVudGlvbiBLZXkgKE9yYW5nZSBib29rKSAqLworI2RlZmluZSBBU1lOQ19TUExJVF9URVJNSU9TIDB4MDAwOCAvKiBTZXBhcmF0ZSB0ZXJtaW9zIGZvciBkaWFsaW4vY2FsbG91dCAqLworCisjZGVmaW5lIEFTWU5DX1NQRF9NQVNLCTB4MTAzMAorI2RlZmluZSBBU1lOQ19TUERfSEkJMHgwMDEwCS8qIFVzZSA1NjAwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworCisjZGVmaW5lIEFTWU5DX1NQRF9WSEkJMHgwMDIwICAvKiBVc2UgMTE1MjAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCisjZGVmaW5lIEFTWU5DX1NQRF9DVVNUCTB4MDAzMCAgLyogVXNlIHVzZXItc3BlY2lmaWVkIGRpdmlzb3IgKi8KKworI2RlZmluZSBBU1lOQ19TS0lQX1RFU1QJMHgwMDQwIC8qIFNraXAgVUFSVCB0ZXN0IGR1cmluZyBhdXRvY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBU1lOQ19BVVRPX0lSUSAgMHgwMDgwIC8qIERvIGF1dG9tYXRpYyBJUlEgZHVyaW5nIGF1dG9jb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFTWU5DX1NFU1NJT05fTE9DS09VVCAweDAxMDAgLyogTG9jayBvdXQgY3VhIG9wZW5zIGJhc2VkIG9uIHNlc3Npb24gKi8KKyNkZWZpbmUgQVNZTkNfUEdSUF9MT0NLT1VUICAgIDB4MDIwMCAvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gcGdycCAqLworI2RlZmluZSBBU1lOQ19DQUxMT1VUX05PSFVQICAgMHgwNDAwIC8qIERvbid0IGRvIGhhbmd1cHMgZm9yIGN1YSBkZXZpY2UgKi8KKworI2RlZmluZSBBU1lOQ19IQVJEUFBTX0NECTB4MDgwMAkvKiBDYWxsIGhhcmRwcHMgd2hlbiBDRCBnb2VzIGhpZ2ggICovCisKKyNkZWZpbmUgQVNZTkNfU1BEX1NISQkweDEwMDAJLyogVXNlIDIzMDQwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ19TUERfV0FSUAkweDEwMTAJLyogVXNlIDQ2MDgwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworCisjZGVmaW5lIEFTWU5DX0xPV19MQVRFTkNZIDB4MjAwMCAvKiBSZXF1ZXN0IGxvdyBsYXRlbmN5IGJlaGF2aW91ciAqLworCisjZGVmaW5lIEFTWU5DX0JVR0dZX1VBUlQgIDB4NDAwMCAvKiBUaGlzIGlzIGEgYnVnZ3kgVUFSVCwgc2tpcCBzb21lIHNhZmV0eQorCQkJCSAgKiBjaGVja3MuICBOb3RlOiBjYW4gYmUgZGFuZ2Vyb3VzISAqLworCisjZGVmaW5lIEFTWU5DX0FVVE9QUk9CRQkgMHg4MDAwIC8qIFBvcnQgd2FzIGF1dG9wcm9iZWQgYnkgUENJIG9yIFBOUCBjb2RlICovCisKKyNkZWZpbmUgQVNZTkNfRkxBR1MJMHg3RkZGCS8qIFBvc3NpYmxlIGxlZ2FsIGFzeW5jIGZsYWdzICovCisjZGVmaW5lIEFTWU5DX1VTUl9NQVNLCTB4MzQzMAkvKiBMZWdhbCBmbGFncyB0aGF0IG5vbi1wcml2aWxlZ2VkCisJCQkJICogdXNlcnMgY2FuIHNldCBvciByZXNldCAqLworCisvKiBJbnRlcm5hbCBmbGFncyB1c2VkIG9ubHkgYnkga2VybmVsL2Nocl9kcnYvc2VyaWFsLmMgKi8KKyNkZWZpbmUgQVNZTkNfSU5JVElBTElaRUQJMHg4MDAwMDAwMCAvKiBTZXJpYWwgcG9ydCB3YXMgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgQVNZTkNfTk9STUFMX0FDVElWRQkweDIwMDAwMDAwIC8qIE5vcm1hbCBkZXZpY2UgaXMgYWN0aXZlICovCisjZGVmaW5lIEFTWU5DX0JPT1RfQVVUT0NPTkYJMHgxMDAwMDAwMCAvKiBBdXRvY29uZmlndXJlIHBvcnQgb24gYm9vdHVwICovCisjZGVmaW5lIEFTWU5DX0NMT1NJTkcJCTB4MDgwMDAwMDAgLyogU2VyaWFsIHBvcnQgaXMgY2xvc2luZyAqLworI2RlZmluZSBBU1lOQ19DVFNfRkxPVwkJMHgwNDAwMDAwMCAvKiBEbyBDVFMgZmxvdyBjb250cm9sICovCisjZGVmaW5lIEFTWU5DX0NIRUNLX0NECQkweDAyMDAwMDAwIC8qIGkuZS4sIENMT0NBTCAqLworI2RlZmluZSBBU1lOQ19TSEFSRV9JUlEJCTB4MDEwMDAwMDAgLyogZm9yIG11bHRpZnVuY3Rpb24gY2FyZHMKKwkJCQkJICAgICAtLS0gbm8gbG9uZ2VyIHVzZWQgKi8KKyNkZWZpbmUgQVNZTkNfQ09OU19GTE9XCQkweDAwODAwMDAwIC8qIGZsb3cgY29udHJvbCBmb3IgY29uc29sZSAgKi8KKworI2RlZmluZSBBU1lOQ19CT09UX09OTFlNQ0EJMHgwMDQwMDAwMCAvKiBQcm9iZSBvbmx5IGlmIE1DQSBidXMgKi8KKyNkZWZpbmUgQVNZTkNfSU5URVJOQUxfRkxBR1MJMHhGRkMwMDAwMCAvKiBJbnRlcm5hbCBmbGFncyAqLworCisvKgorICogTXVsdGlwb3J0IHNlcmlhbCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAtLS0gZXh0ZXJuYWwgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBzZXJpYWxfbXVsdGlwb3J0X3N0cnVjdCB7CisJaW50CQlpcnE7CisJaW50CQlwb3J0MTsKKwl1bnNpZ25lZCBjaGFyCW1hc2sxLCBtYXRjaDE7CisJaW50CQlwb3J0MjsKKwl1bnNpZ25lZCBjaGFyCW1hc2syLCBtYXRjaDI7CisJaW50CQlwb3J0MzsKKwl1bnNpZ25lZCBjaGFyCW1hc2szLCBtYXRjaDM7CisJaW50CQlwb3J0NDsKKwl1bnNpZ25lZCBjaGFyCW1hc2s0LCBtYXRjaDQ7CisJaW50CQlwb3J0X21vbml0b3I7CisJaW50CXJlc2VydmVkWzMyXTsKK307CisKKy8qCisgKiBTZXJpYWwgaW5wdXQgaW50ZXJydXB0IGxpbmUgY291bnRlcnMgLS0gZXh0ZXJuYWwgc3RydWN0dXJlCisgKiBGb3VyIGxpbmVzIGNhbiBpbnRlcnJ1cHQ6IENUUywgRFNSLCBSSSwgRENECisgKi8KK3N0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IHsKKwlpbnQgY3RzLCBkc3IsIHJuZywgZGNkOworCWludCByeCwgdHg7CisJaW50IGZyYW1lLCBvdmVycnVuLCBwYXJpdHksIGJyazsKKwlpbnQgYnVmX292ZXJydW47CisJaW50IHJlc2VydmVkWzldOworfTsKKworCisjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzNWJkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2NoYXIvc2VyaWFsX2NvcmUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIExJTlVYX1NFUklBTF9DT1JFX0gKKyNkZWZpbmUgTElOVVhfU0VSSUFMX0NPUkVfSAorCisvKgorICogVGhlIHR5cGUgZGVmaW5pdGlvbnMuICBUaGVzZSBhcmUgZnJvbSBUZWQgVHMnbydzIHNlcmlhbC5oCisgKi8KKyNkZWZpbmUgUE9SVF9VTktOT1dOCTAKKyNkZWZpbmUgUE9SVF84MjUwCTEKKyNkZWZpbmUgUE9SVF8xNjQ1MAkyCisjZGVmaW5lIFBPUlRfMTY1NTAJMworI2RlZmluZSBQT1JUXzE2NTUwQQk0CisjZGVmaW5lIFBPUlRfQ0lSUlVTCTUKKyNkZWZpbmUgUE9SVF8xNjY1MAk2CisjZGVmaW5lIFBPUlRfMTY2NTBWMgk3CisjZGVmaW5lIFBPUlRfMTY3NTAJOAorI2RlZmluZSBQT1JUX1NUQVJURUNICTkKKyNkZWZpbmUgUE9SVF8xNkM5NTAJMTAKKyNkZWZpbmUgUE9SVF8xNjY1NAkxMQorI2RlZmluZSBQT1JUXzE2ODUwCTEyCisjZGVmaW5lIFBPUlRfUlNBCTEzCisjZGVmaW5lIFBPUlRfTlMxNjU1MEEJMTQKKyNkZWZpbmUgUE9SVF9YU0NBTEUJMTUKKyNkZWZpbmUgUE9SVF9STTkwMDAJMTYJLyogUE1DLVNpZXJyYSBSTTl4eHggaW50ZXJuYWwgVUFSVCAqLworI2RlZmluZSBQT1JUX01BWF84MjUwCTE2CS8qIG1heCBwb3J0IElEICovCisKKy8qCisgKiBBUk0gc3BlY2lmaWMgdHlwZSBudW1iZXJzLiAgVGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgZ3VhcmFudGVlZAorICogdG8gYmUgaW1wbGVtZW50ZWQsIGFuZCB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLiAgVGhlc2UgYXJlCisgKiBzZXBhcmF0ZSBzbyBhbnkgYWRkaXRpb25zIHRvIHRoZSBvbGQgc2VyaWFsLmMgdGhhdCBvY2N1ciBiZWZvcmUKKyAqIHdlIGFyZSBtZXJnZWQgY2FuIGJlIGVhc2lseSBtZXJnZWQgaGVyZS4KKyAqLworI2RlZmluZSBQT1JUX1BYQQkzMQorI2RlZmluZSBQT1JUX0FNQkEJMzIKKyNkZWZpbmUgUE9SVF9DTFBTNzExWAkzMworI2RlZmluZSBQT1JUX1NBMTEwMAkzNAorI2RlZmluZSBQT1JUX1VBUlQwMAkzNQorI2RlZmluZSBQT1JUXzIxMjg1CTM3CisKKy8qIFNwYXJjIHR5cGUgbnVtYmVycy4gICovCisjZGVmaW5lIFBPUlRfU1VOWklMT0cJMzgKKyNkZWZpbmUgUE9SVF9TVU5TQUIJMzkKKworLyogTkVDIHY4NTAuICAqLworI2RlZmluZSBQT1JUX1Y4NTBFX1VBUlQJNDAKKworLyogREVDICovCisjZGVmaW5lIFBPUlRfRFoJCTQ2CisjZGVmaW5lIFBPUlRfWlMJCTQ3CisKKy8qIFBhcmlzYyB0eXBlIG51bWJlcnMuICovCisjZGVmaW5lIFBPUlRfTVVYCTQ4CisKKy8qIEF0bWVsIEFUOTEgLyBBVDMyIFNvQyAqLworI2RlZmluZSBQT1JUX0FUTUVMCTQ5CisKKy8qIE1hY2ludG9zaCBaaWxvZyB0eXBlIG51bWJlcnMgKi8KKyNkZWZpbmUgUE9SVF9NQUNfWklMT0cJNTAJLyogbTY4ayA6IG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUE9SVF9QTUFDX1pJTE9HCTUxCisKKy8qIFNILVNDSSAqLworI2RlZmluZSBQT1JUX1NDSQk1MgorI2RlZmluZSBQT1JUX1NDSUYJNTMKKyNkZWZpbmUgUE9SVF9JUkRBCTU0CisKKy8qIFNhbXN1bmcgUzNDMjQxMCBTb0MgYW5kIGRlcml2YXRpdmVzIHRoZXJlb2YgKi8KKyNkZWZpbmUgUE9SVF9TM0MyNDEwICAgIDU1CisKKy8qIFNHSSBJUDIyIGFrYSBJbmR5IC8gQ2hhbGxlbmdlIFMgLyBJbmRpZ28gMiAqLworI2RlZmluZSBQT1JUX0lQMjJaSUxPRwk1NgorCisvKiBTaGFycCBMSDdhNDB4IC0tIGFuIEFSTTkgU29DIHNlcmllcyAqLworI2RlZmluZSBQT1JUX0xIN0E0MFgJNTcKKworLyogUFBDIENQTSB0eXBlIG51bWJlciAqLworI2RlZmluZSBQT1JUX0NQTSAgICAgICAgNTgKKworLyogTVBDNTJ4eCB0eXBlIG51bWJlcnMgKi8KKyNkZWZpbmUgUE9SVF9NUEM1Mnh4CTU5CisKKy8qIElCTSBpY29tICovCisjZGVmaW5lIFBPUlRfSUNPTQk2MAorCisvKiBTYW1zdW5nIFMzQzI0NDAgU29DICovCisjZGVmaW5lIFBPUlRfUzNDMjQ0MAk2MQorCisvKiBNb3Rvcm9sYSBpLk1YIFNvQyAqLworI2RlZmluZSBQT1JUX0lNWAk2MgorCisvKiBNYXJ2ZWxsIE1QU0MgKi8KKyNkZWZpbmUgUE9SVF9NUFNDCTYzCisKKy8qIFRYWDkgdHlwZSBudW1iZXIgKi8KKyNkZWZpbmUgUE9SVF9UWFg5CTY0CisKKy8qIE5FQyBWUjQxMDAgc2VyaWVzIFNJVS9EU0lVICovCisjZGVmaW5lIFBPUlRfVlI0MVhYX1NJVQkJNjUKKyNkZWZpbmUgUE9SVF9WUjQxWFhfRFNJVQk2NgorCisvKiBTYW1zdW5nIFMzQzI0MDAgU29DICovCisjZGVmaW5lIFBPUlRfUzNDMjQwMAk2NworCisvKiBNMzJSIFNJTyAqLworI2RlZmluZSBQT1JUX00zMlJfU0lPCTY4CisKKy8qRGlnaSBqc20gKi8KKyNkZWZpbmUgUE9SVF9KU00gICAgICAgIDY5CisKKyNkZWZpbmUgUE9SVF9QTlg4WFhYCTcwCisKKy8qIEhpbHNjaGVyIG5ldHggKi8KKyNkZWZpbmUgUE9SVF9ORVRYCTcxCisKKy8qIFNVTjRWIEh5cGVydmlzb3IgQ29uc29sZSAqLworI2RlZmluZSBQT1JUX1NVTkhWCTcyCisKKyNkZWZpbmUgUE9SVF9TM0MyNDEyCTczCisKKy8qIFhpbGlueCB1YXJ0bGl0ZSAqLworI2RlZmluZSBQT1JUX1VBUlRMSVRFCTc0CisKKy8qIEJsYWNrZmluIGJmNXh4ICovCisjZGVmaW5lIFBPUlRfQkZJTgk3NQorCisvKiBNaWNyZWwgS1M4Njk1ICovCisjZGVmaW5lIFBPUlRfS1M4Njk1CTc2CisKKy8qIEJyb2FkY29tIFNCMTI1MCwgZXRjLiBTT0MgKi8KKyNkZWZpbmUgUE9SVF9TQjEyNTBfRFVBUlQJNzcKKworLyogRnJlZXNjYWxlIENvbGRGaXJlICovCisjZGVmaW5lIFBPUlRfTUNGCTc4CisKKworCisjZW5kaWYgLyogTElOVVhfU0VSSUFMX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NlcmlhbF9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmMwZDkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpYWxfcmVnLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3NlcmlhbF9yZWcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5NCBieSBUaGVvZG9yZSBUcydvLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIAorICogUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqIAorICogVGhlc2UgYXJlIHRoZSBVQVJUIHBvcnQgYXNzaWdubWVudHMsIGV4cHJlc3NlZCBhcyBvZmZzZXRzIGZyb20gdGhlIGJhc2UKKyAqIHJlZ2lzdGVyLiAgVGhlc2UgYXNzaWdubWVudHMgc2hvdWxkIGhvbGQgZm9yIGFueSBzZXJpYWwgcG9ydCBiYXNlZCBvbgorICogYSA4MjUwLCAxNjQ1MCwgb3IgMTY1NTAoQSkuCisgKi8KKworI2lmbmRlZiBfTElOVVhfU0VSSUFMX1JFR19ICisjZGVmaW5lIF9MSU5VWF9TRVJJQUxfUkVHX0gKKworLyoKKyAqIERMQUI9MAorICovCisjZGVmaW5lIFVBUlRfUlgJCTAJLyogSW46ICBSZWNlaXZlIGJ1ZmZlciAqLworI2RlZmluZSBVQVJUX1RYCQkwCS8qIE91dDogVHJhbnNtaXQgYnVmZmVyICovCisKKyNkZWZpbmUgVUFSVF9JRVIJMQkvKiBPdXQ6IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9JRVJfTVNJCQkweDA4IC8qIEVuYWJsZSBNb2RlbSBzdGF0dXMgaW50ZXJydXB0ICovCisjZGVmaW5lIFVBUlRfSUVSX1JMU0kJCTB4MDQgLyogRW5hYmxlIHJlY2VpdmVyIGxpbmUgc3RhdHVzIGludGVycnVwdCAqLworI2RlZmluZSBVQVJUX0lFUl9USFJJCQkweDAyIC8qIEVuYWJsZSBUcmFuc21pdHRlciBob2xkaW5nIHJlZ2lzdGVyIGludC4gKi8KKyNkZWZpbmUgVUFSVF9JRVJfUkRJCQkweDAxIC8qIEVuYWJsZSByZWNlaXZlciBkYXRhIGludGVycnVwdCAqLworLyoKKyAqIFNsZWVwIG1vZGUgZm9yIFNUMTY2NTAgYW5kIFRJMTY3NTAuICBGb3IgdGhlIFNUMTY2NTAsIEVGUls0XT0xCisgKi8KKyNkZWZpbmUgVUFSVF9JRVJYX1NMRUVQCQkweDEwIC8qIEVuYWJsZSBzbGVlcCBtb2RlICovCisKKyNkZWZpbmUgVUFSVF9JSVIJMgkvKiBJbjogIEludGVycnVwdCBJRCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0lJUl9OT19JTlQJCTB4MDEgLyogTm8gaW50ZXJydXB0cyBwZW5kaW5nICovCisjZGVmaW5lIFVBUlRfSUlSX0lECQkweDA2IC8qIE1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQgSUQgKi8KKyNkZWZpbmUgVUFSVF9JSVJfTVNJCQkweDAwIC8qIE1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVUFSVF9JSVJfVEhSSQkJMHgwMiAvKiBUcmFuc21pdHRlciBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lIFVBUlRfSUlSX1JESQkJMHgwNCAvKiBSZWNlaXZlciBkYXRhIGludGVycnVwdCAqLworI2RlZmluZSBVQVJUX0lJUl9STFNJCQkweDA2IC8qIFJlY2VpdmVyIGxpbmUgc3RhdHVzIGludGVycnVwdCAqLworCisjZGVmaW5lIFVBUlRfSUlSX0JVU1kJCTB4MDcgLyogRGVzaWduV2FyZSBBUEIgQnVzeSBEZXRlY3QgKi8KKworI2RlZmluZSBVQVJUX0ZDUgkyCS8qIE91dDogRklGTyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfRkNSX0VOQUJMRV9GSUZPCTB4MDEgLyogRW5hYmxlIHRoZSBGSUZPICovCisjZGVmaW5lIFVBUlRfRkNSX0NMRUFSX1JDVlIJMHgwMiAvKiBDbGVhciB0aGUgUkNWUiBGSUZPICovCisjZGVmaW5lIFVBUlRfRkNSX0NMRUFSX1hNSVQJMHgwNCAvKiBDbGVhciB0aGUgWE1JVCBGSUZPICovCisjZGVmaW5lIFVBUlRfRkNSX0RNQV9TRUxFQ1QJMHgwOCAvKiBGb3IgRE1BIGFwcGxpY2F0aW9ucyAqLworLyoKKyAqIE5vdGU6IFRoZSBGSUZPIHRyaWdnZXIgbGV2ZWxzIGFyZSBjaGlwIHNwZWNpZmljOgorICoJUlg6NzYgPSAwMCAgMDEgIDEwICAxMQlUWDo1NCA9IDAwICAwMSAgMTAgIDExCisgKiBQQzE2NTUwRDoJIDEgICA0ICAgOCAgMTQJCXh4ICB4eCAgeHggIHh4CisgKiBUSTE2QzU1MEE6CSAxICAgNCAgIDggIDE0ICAgICAgICAgIHh4ICB4eCAgeHggIHh4CisgKiBUSTE2QzU1MEM6CSAxICAgNCAgIDggIDE0ICAgICAgICAgIHh4ICB4eCAgeHggIHh4CisgKiBTVDE2QzU1MDoJIDEgICA0ICAgOCAgMTQJCXh4ICB4eCAgeHggIHh4CisgKiBTVDE2QzY1MDoJIDggIDE2ICAyNCAgMjgJCTE2ICAgOCAgMjQgIDMwCVBPUlRfMTY2NTBWMgorICogTlMxNkM1NTI6CSAxICAgNCAgIDggIDE0CQl4eCAgeHggIHh4ICB4eAorICogU1QxNkM2NTQ6CSA4ICAxNiAgNTYgIDYwCQkgOCAgMTYgIDMyICA1NglQT1JUXzE2NjU0CisgKiBUSTE2Qzc1MDoJIDEgIDE2ICAzMiAgNTYJCXh4ICB4eCAgeHggIHh4CVBPUlRfMTY3NTAKKyAqIFRJMTZDNzUyOgkgOCAgMTYgIDU2ICA2MAkJIDggIDE2ICAzMiAgNTYKKyAqLworI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMDAJMHgwMAorI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMDEJMHg0MAorI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMTAJMHg4MAorI2RlZmluZSBVQVJUX0ZDUl9SX1RSSUdfMTEJMHhjMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMDAJMHgwMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMDEJMHgxMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMTAJMHgyMAorI2RlZmluZSBVQVJUX0ZDUl9UX1RSSUdfMTEJMHgzMAorCisjZGVmaW5lIFVBUlRfRkNSX1RSSUdHRVJfTUFTSwkweEMwIC8qIE1hc2sgZm9yIHRoZSBGSUZPIHRyaWdnZXIgcmFuZ2UgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfVFJJR0dFUl8xCTB4MDAgLyogTWFzayBmb3IgdHJpZ2dlciBzZXQgYXQgMSAqLworI2RlZmluZSBVQVJUX0ZDUl9UUklHR0VSXzQJMHg0MCAvKiBNYXNrIGZvciB0cmlnZ2VyIHNldCBhdCA0ICovCisjZGVmaW5lIFVBUlRfRkNSX1RSSUdHRVJfOAkweDgwIC8qIE1hc2sgZm9yIHRyaWdnZXIgc2V0IGF0IDggKi8KKyNkZWZpbmUgVUFSVF9GQ1JfVFJJR0dFUl8xNAkweEMwIC8qIE1hc2sgZm9yIHRyaWdnZXIgc2V0IGF0IDE0ICovCisvKiAxNjY1MCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBVQVJUX0ZDUjZfUl9UUklHR0VSXzgJMHgwMCAvKiBNYXNrIGZvciByZWNlaXZlIHRyaWdnZXIgc2V0IGF0IDEgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1JfVFJJR0dFUl8xNgkweDQwIC8qIE1hc2sgZm9yIHJlY2VpdmUgdHJpZ2dlciBzZXQgYXQgNCAqLworI2RlZmluZSBVQVJUX0ZDUjZfUl9UUklHR0VSXzI0ICAweDgwIC8qIE1hc2sgZm9yIHJlY2VpdmUgdHJpZ2dlciBzZXQgYXQgOCAqLworI2RlZmluZSBVQVJUX0ZDUjZfUl9UUklHR0VSXzI4CTB4QzAgLyogTWFzayBmb3IgcmVjZWl2ZSB0cmlnZ2VyIHNldCBhdCAxNCAqLworI2RlZmluZSBVQVJUX0ZDUjZfVF9UUklHR0VSXzE2CTB4MDAgLyogTWFzayBmb3IgdHJhbnNtaXQgdHJpZ2dlciBzZXQgYXQgMTYgKi8KKyNkZWZpbmUgVUFSVF9GQ1I2X1RfVFJJR0dFUl84CTB4MTAgLyogTWFzayBmb3IgdHJhbnNtaXQgdHJpZ2dlciBzZXQgYXQgOCAqLworI2RlZmluZSBVQVJUX0ZDUjZfVF9UUklHR0VSXzI0ICAweDIwIC8qIE1hc2sgZm9yIHRyYW5zbWl0IHRyaWdnZXIgc2V0IGF0IDI0ICovCisjZGVmaW5lIFVBUlRfRkNSNl9UX1RSSUdHRVJfMzAJMHgzMCAvKiBNYXNrIGZvciB0cmFuc21pdCB0cmlnZ2VyIHNldCBhdCAzMCAqLworI2RlZmluZSBVQVJUX0ZDUjdfNjRCWVRFCTB4MjAgLyogR28gaW50byA2NCBieXRlIG1vZGUgKFRJMTZDNzUwKSAqLworCisjZGVmaW5lIFVBUlRfTENSCTMJLyogT3V0OiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KKy8qCisgKiBOb3RlOiBpZiB0aGUgd29yZCBsZW5ndGggaXMgNSBiaXRzIChVQVJUX0xDUl9XTEVONSksIHRoZW4gc2V0dGluZyAKKyAqIFVBUlRfTENSX1NUT1Agd2lsbCBzZWxlY3QgMS41IHN0b3AgYml0cywgbm90IDIgc3RvcCBiaXRzLgorICovCisjZGVmaW5lIFVBUlRfTENSX0RMQUIJCTB4ODAgLyogRGl2aXNvciBsYXRjaCBhY2Nlc3MgYml0ICovCisjZGVmaW5lIFVBUlRfTENSX1NCQwkJMHg0MCAvKiBTZXQgYnJlYWsgY29udHJvbCAqLworI2RlZmluZSBVQVJUX0xDUl9TUEFSCQkweDIwIC8qIFN0aWNrIHBhcml0eSAoPykgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfRVBBUgkJMHgxMCAvKiBFdmVuIHBhcml0eSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfUEFSSVRZCQkweDA4IC8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfU1RPUAkJMHgwNCAvKiBTdG9wIGJpdHM6IDA9MSBiaXQsIDE9MiBiaXRzICovCisjZGVmaW5lIFVBUlRfTENSX1dMRU41CQkweDAwIC8qIFdvcmRsZW5ndGg6IDUgYml0cyAqLworI2RlZmluZSBVQVJUX0xDUl9XTEVONgkJMHgwMSAvKiBXb3JkbGVuZ3RoOiA2IGJpdHMgKi8KKyNkZWZpbmUgVUFSVF9MQ1JfV0xFTjcJCTB4MDIgLyogV29yZGxlbmd0aDogNyBiaXRzICovCisjZGVmaW5lIFVBUlRfTENSX1dMRU44CQkweDAzIC8qIFdvcmRsZW5ndGg6IDggYml0cyAqLworCisjZGVmaW5lIFVBUlRfTUNSCTQJLyogT3V0OiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfTUNSX0NMS1NFTAkJMHg4MCAvKiBEaXZpZGUgY2xvY2sgYnkgNCAoVEkxNkM3NTIsIEVGUls0XT0xKSAqLworI2RlZmluZSBVQVJUX01DUl9UQ1JUTFIJCTB4NDAgLyogQWNjZXNzIFRDUi9UTFIgKFRJMTZDNzUyLCBFRlJbNF09MSkgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfWE9OQU5ZCQkweDIwIC8qIEVuYWJsZSBYb24gQW55IChUSTE2Qzc1MiwgRUZSWzRdPTEpICovCisjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMCAvKiBFbmFibGUgYXV0by1SVFMvQ1RTIChUSTE2QzU1MEMvVEkxNkM3NTApICovCisjZGVmaW5lIFVBUlRfTUNSX0xPT1AJCTB4MTAgLyogRW5hYmxlIGxvb3BiYWNrIHRlc3QgbW9kZSAqLworI2RlZmluZSBVQVJUX01DUl9PVVQyCQkweDA4IC8qIE91dDIgY29tcGxlbWVudCAqLworI2RlZmluZSBVQVJUX01DUl9PVVQxCQkweDA0IC8qIE91dDEgY29tcGxlbWVudCAqLworI2RlZmluZSBVQVJUX01DUl9SVFMJCTB4MDIgLyogUlRTIGNvbXBsZW1lbnQgKi8KKyNkZWZpbmUgVUFSVF9NQ1JfRFRSCQkweDAxIC8qIERUUiBjb21wbGVtZW50ICovCisKKyNkZWZpbmUgVUFSVF9MU1IJNQkvKiBJbjogIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfTFNSX1RFTVQJCTB4NDAgLyogVHJhbnNtaXR0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgVUFSVF9MU1JfVEhSRQkJMHgyMCAvKiBUcmFuc21pdC1ob2xkLXJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lIFVBUlRfTFNSX0JJCQkweDEwIC8qIEJyZWFrIGludGVycnVwdCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgVUFSVF9MU1JfRkUJCTB4MDggLyogRnJhbWUgZXJyb3IgaW5kaWNhdG9yICovCisjZGVmaW5lIFVBUlRfTFNSX1BFCQkweDA0IC8qIFBhcml0eSBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgVUFSVF9MU1JfT0UJCTB4MDIgLyogT3ZlcnJ1biBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgVUFSVF9MU1JfRFIJCTB4MDEgLyogUmVjZWl2ZXIgZGF0YSByZWFkeSAqLworI2RlZmluZSBVQVJUX0xTUl9CUktfRVJST1JfQklUUwkweDFFIC8qIEJJLCBGRSwgUEUsIE9FIGJpdHMgKi8KKworI2RlZmluZSBVQVJUX01TUgk2CS8qIEluOiAgTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfTVNSX0RDRAkJMHg4MCAvKiBEYXRhIENhcnJpZXIgRGV0ZWN0ICovCisjZGVmaW5lIFVBUlRfTVNSX1JJCQkweDQwIC8qIFJpbmcgSW5kaWNhdG9yICovCisjZGVmaW5lIFVBUlRfTVNSX0RTUgkJMHgyMCAvKiBEYXRhIFNldCBSZWFkeSAqLworI2RlZmluZSBVQVJUX01TUl9DVFMJCTB4MTAgLyogQ2xlYXIgdG8gU2VuZCAqLworI2RlZmluZSBVQVJUX01TUl9ERENECQkweDA4IC8qIERlbHRhIERDRCAqLworI2RlZmluZSBVQVJUX01TUl9URVJJCQkweDA0IC8qIFRyYWlsaW5nIGVkZ2UgcmluZyBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgVUFSVF9NU1JfRERTUgkJMHgwMiAvKiBEZWx0YSBEU1IgKi8KKyNkZWZpbmUgVUFSVF9NU1JfRENUUwkJMHgwMSAvKiBEZWx0YSBDVFMgKi8KKyNkZWZpbmUgVUFSVF9NU1JfQU5ZX0RFTFRBCTB4MEYgLyogQW55IG9mIHRoZSBkZWx0YSBiaXRzISAqLworCisjZGVmaW5lIFVBUlRfU0NSCTcJLyogSS9POiBTY3JhdGNoIFJlZ2lzdGVyICovCisKKy8qCisgKiBETEFCPTEKKyAqLworI2RlZmluZSBVQVJUX0RMTAkwCS8qIE91dDogRGl2aXNvciBMYXRjaCBMb3cgKi8KKyNkZWZpbmUgVUFSVF9ETE0JMQkvKiBPdXQ6IERpdmlzb3IgTGF0Y2ggSGlnaCAqLworCisvKgorICogTENSPTB4QkYgKG9yIERMQUI9MSBmb3IgMTZDNjYwKQorICovCisjZGVmaW5lIFVBUlRfRUZSCTIJLyogSS9POiBFeHRlbmRlZCBGZWF0dXJlcyBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0VGUl9DVFMJCTB4ODAgLyogQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBVQVJUX0VGUl9SVFMJCTB4NDAgLyogUlRTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBVQVJUX0VGUl9TQ0QJCTB4MjAgLyogU3BlY2lhbCBjaGFyYWN0ZXIgZGV0ZWN0ICovCisjZGVmaW5lIFVBUlRfRUZSX0VDQgkJMHgxMCAvKiBFbmhhbmNlZCBjb250cm9sIGJpdCAqLworLyoKKyAqIHRoZSBsb3cgZm91ciBiaXRzIGNvbnRyb2wgc29mdHdhcmUgZmxvdyBjb250cm9sCisgKi8KKworLyoKKyAqIExDUj0weEJGLCBUSTE2Qzc1MiwgU1QxNjY1MCwgU1QxNjY1MEEsIFNUMTY2NTQKKyAqLworI2RlZmluZSBVQVJUX1hPTjEJNAkvKiBJL086IFhvbiBjaGFyYWN0ZXIgMSAqLworI2RlZmluZSBVQVJUX1hPTjIJNQkvKiBJL086IFhvbiBjaGFyYWN0ZXIgMiAqLworI2RlZmluZSBVQVJUX1hPRkYxCTYJLyogSS9POiBYb2ZmIGNoYXJhY3RlciAxICovCisjZGVmaW5lIFVBUlRfWE9GRjIJNwkvKiBJL086IFhvZmYgY2hhcmFjdGVyIDIgKi8KKworLyoKKyAqIEVGUls0XT0xIE1DUls2XT0xLCBUSTE2Qzc1MgorICovCisjZGVmaW5lIFVBUlRfVEk3NTJfVENSCTYJLyogSS9POiB0cmFuc21pc3Npb24gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX1RJNzUyX1RMUgk3CS8qIEkvTzogdHJpZ2dlciBsZXZlbCByZWdpc3RlciAqLworCisvKgorICogTENSPTB4QkYsIFhSMTZDODV4CisgKi8KKyNkZWZpbmUgVUFSVF9UUkcJMAkvKiBGQ1RSIGJpdCA3IHNlbGVjdHMgUnggb3IgVHgKKwkJCQkgKiBJbjogRmlmbyBjb3VudAorCQkJCSAqIE91dDogRmlmbyBjdXN0b20gdHJpZ2dlciBsZXZlbHMgKi8KKy8qCisgKiBUaGVzZSBhcmUgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgUHJvZ3JhbW1hYmxlIFRyaWdnZXIgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBVQVJUX1RSR18xCQkweDAxCisjZGVmaW5lIFVBUlRfVFJHXzQJCTB4MDQKKyNkZWZpbmUgVUFSVF9UUkdfOAkJMHgwOAorI2RlZmluZSBVQVJUX1RSR18xNgkJMHgxMAorI2RlZmluZSBVQVJUX1RSR18zMgkJMHgyMAorI2RlZmluZSBVQVJUX1RSR182NAkJMHg0MAorI2RlZmluZSBVQVJUX1RSR185NgkJMHg2MAorI2RlZmluZSBVQVJUX1RSR18xMjAJCTB4NzgKKyNkZWZpbmUgVUFSVF9UUkdfMTI4CQkweDgwCisKKyNkZWZpbmUgVUFSVF9GQ1RSCTEJLyogRmVhdHVyZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfRkNUUl9SVFNfTk9ERUxBWQkweDAwICAvKiBSVFMgZmxvdyBjb250cm9sIGRlbGF5ICovCisjZGVmaW5lIFVBUlRfRkNUUl9SVFNfNERFTEFZCTB4MDEKKyNkZWZpbmUgVUFSVF9GQ1RSX1JUU182REVMQVkJMHgwMgorI2RlZmluZSBVQVJUX0ZDVFJfUlRTXzhERUxBWQkweDAzCisjZGVmaW5lIFVBUlRfRkNUUl9JUkRBCQkweDA0ICAvKiBJckRhIGRhdGEgZW5jb2RlIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfVFhfSU5UCTB4MDggIC8qIFR4IGludGVycnVwdCB0eXBlIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfVFJHQQkJMHgwMCAgLyogVHgvUnggNTUwIHRyaWdnZXIgdGFibGUgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9UUkdCCQkweDEwICAvKiBUeC9SeCA2NTAgdHJpZ2dlciB0YWJsZSBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9GQ1RSX1RSR0MJCTB4MjAgIC8qIFR4L1J4IDY1NCB0cmlnZ2VyIHRhYmxlIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfVFJHRAkJMHgzMCAgLyogVHgvUnggODUwIHByb2dyYW1tYWJsZSB0cmlnZ2VyIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX0ZDVFJfU0NSX1NXQVAJMHg0MCAgLyogU2NyYXRjaCBwYWQgcmVnaXN0ZXIgc3dhcCAqLworI2RlZmluZSBVQVJUX0ZDVFJfUlgJCTB4MDAgIC8qIFByb2dyYW1tYWJsZSB0cmlnZ2VyIG1vZGUgc2VsZWN0ICovCisjZGVmaW5lIFVBUlRfRkNUUl9UWAkJMHg4MCAgLyogUHJvZ3JhbW1hYmxlIHRyaWdnZXIgbW9kZSBzZWxlY3QgKi8KKworLyoKKyAqIExDUj0weEJGLCBGQ1RSWzZdPTEKKyAqLworI2RlZmluZSBVQVJUX0VNU1IJNwkvKiBFeHRlbmRlZCBNb2RlIFNlbGVjdCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0VNU1JfRklGT19DT1VOVAkweDAxICAvKiBSeC9UeCBzZWxlY3QgKi8KKyNkZWZpbmUgVUFSVF9FTVNSX0FMVF9DT1VOVAkweDAyICAvKiBBbHRlcm5hdGluZyBjb3VudCBzZWxlY3QgKi8KKworLyoKKyAqIFRoZSBJbnRlbCBYU2NhbGUgb24tY2hpcCBVQVJUcyBkZWZpbmUgdGhlc2UgYml0cworICovCisjZGVmaW5lIFVBUlRfSUVSX0RNQUUJMHg4MAkvKiBETUEgUmVxdWVzdHMgRW5hYmxlICovCisjZGVmaW5lIFVBUlRfSUVSX1VVRQkweDQwCS8qIFVBUlQgVW5pdCBFbmFibGUgKi8KKyNkZWZpbmUgVUFSVF9JRVJfTlJaRQkweDIwCS8qIE5SWiBjb2RpbmcgRW5hYmxlICovCisjZGVmaW5lIFVBUlRfSUVSX1JUT0lFCTB4MTAJLyogUmVjZWl2ZXIgVGltZSBPdXQgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIFVBUlRfSUlSX1RPRAkweDA4CS8qIENoYXJhY3RlciBUaW1lb3V0IEluZGljYXRpb24gRGV0ZWN0ZWQgKi8KKworI2RlZmluZSBVQVJUX0ZDUl9QWEFSMQkweDAwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDEgKi8KKyNkZWZpbmUgVUFSVF9GQ1JfUFhBUjgJMHg0MAkvKiByZWNlaXZlIEZJRk8gdHJlc2hvbGQgPSA4ICovCisjZGVmaW5lIFVBUlRfRkNSX1BYQVIxNgkweDgwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDE2ICovCisjZGVmaW5lIFVBUlRfRkNSX1BYQVIzMgkweGMwCS8qIHJlY2VpdmUgRklGTyB0cmVzaG9sZCA9IDMyICovCisKKworCisKKy8qCisgKiBUaGVzZSByZWdpc3RlciBkZWZpbml0aW9ucyBhcmUgZm9yIHRoZSAxNkM5NTAKKyAqLworI2RlZmluZSBVQVJUX0FTUgkweDAxCS8qIEFkZGl0aW9uYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfUkZMCTB4MDMJLyogUmVjZWl2ZXIgRklGTyBsZXZlbCAqLworI2RlZmluZSBVQVJUX1RGTCAJMHgwNAkvKiBUcmFuc21pdHRlciBGSUZPIGxldmVsICovCisjZGVmaW5lIFVBUlRfSUNSCTB4MDUJLyogSW5kZXggQ29udHJvbCBSZWdpc3RlciAqLworCisvKiBUaGUgMTY5NTAgSUNSIHJlZ2lzdGVycyAqLworI2RlZmluZSBVQVJUX0FDUgkweDAwCS8qIEFkZGl0aW9uYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0NQUgkweDAxCS8qIENsb2NrIFByZXNjYWxhciBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX1RDUgkweDAyCS8qIFRpbWVzIENsb2NrIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQ0tTCTB4MDMJLyogQ2xvY2sgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfVFRMCTB4MDQJLyogVHJhbnNtaXR0ZXIgSW50ZXJydXB0IFRyaWdnZXIgTGV2ZWwgKi8KKyNkZWZpbmUgVUFSVF9SVEwJMHgwNQkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgVHJpZ2dlciBMZXZlbCAqLworI2RlZmluZSBVQVJUX0ZDTAkweDA2CS8qIEZsb3cgQ29udHJvbCBMZXZlbCBMb3dlciAqLworI2RlZmluZSBVQVJUX0ZDSAkweDA3CS8qIEZsb3cgQ29udHJvbCBMZXZlbCBIaWdoZXIgKi8KKyNkZWZpbmUgVUFSVF9JRDEJMHgwOAkvKiBJRCAjMSAqLworI2RlZmluZSBVQVJUX0lEMgkweDA5CS8qIElEICMyICovCisjZGVmaW5lIFVBUlRfSUQzCTB4MEEJLyogSUQgIzMgKi8KKyNkZWZpbmUgVUFSVF9SRVYJMHgwQgkvKiBSZXZpc2lvbiAqLworI2RlZmluZSBVQVJUX0NTUgkweDBDCS8qIENoYW5uZWwgU29mdHdhcmUgUmVzZXQgKi8KKyNkZWZpbmUgVUFSVF9OTVIJMHgwRAkvKiBOaW5lLWJpdCBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQ1RSCTB4RkYKKworLyoKKyAqIFRoZSAxNkM5NTAgQWRkaXRpb25hbCBDb250cm9sIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfUlhESVMJMHgwMQkvKiBSZWNlaXZlciBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX1RYRElTCTB4MDIJLyogVHJhbnNtaXR0ZXIgZGlzYWJsZSAqLworI2RlZmluZSBVQVJUX0FDUl9EU1JGQwkweDA0CS8qIERTUiBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgVUFSVF9BQ1JfVExFTkIJMHgyMAkvKiA5NTAgdHJpZ2dlciBsZXZlbHMgZW5hYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX0lDUlJECTB4NDAJLyogSUNSIFJlYWQgZW5hYmxlICovCisjZGVmaW5lIFVBUlRfQUNSX0FTUkVOCTB4ODAJLyogQWRkaXRpb25hbCBzdGF0dXMgZW5hYmxlICovCisKKworCisvKgorICogVGhlc2UgZGVmaW5pdGlvbnMgYXJlIGZvciB0aGUgUlNBLURWIElJL1MgY2FyZCwgZnJvbQorICoKKyAqIEtpeW9rYXp1IFNVVE8gPHN1dG9Aa3MtYW5kLWtzLm5lLmpwPgorICovCisKKyNkZWZpbmUgVUFSVF9SU0FfQkFTRSAoLTgpCisKKyNkZWZpbmUgVUFSVF9SU0FfTVNSICgoVUFSVF9SU0FfQkFTRSkgKyAwKSAvKiBJL086IE1vZGUgU2VsZWN0IFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVUFSVF9SU0FfTVNSX1NXQVAgKDEgPDwgMCkgLyogU3dhcCBsb3cvaGlnaCA4IGJ5dGVzIGluIEkvTyBwb3J0IGFkZHIgKi8KKyNkZWZpbmUgVUFSVF9SU0FfTVNSX0ZJRk8gKDEgPDwgMikgLyogRW5hYmxlIHRoZSBleHRlcm5hbCBGSUZPICovCisjZGVmaW5lIFVBUlRfUlNBX01TUl9GTE9XICgxIDw8IDMpIC8qIEVuYWJsZSB0aGUgYXV0byBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBVQVJUX1JTQV9NU1JfSVRZUCAoMSA8PCA0KSAvKiBMZXZlbCAoMSkgLyBFZGdlIHRyaWdlciAoMCkgKi8KKworI2RlZmluZSBVQVJUX1JTQV9JRVIgKChVQVJUX1JTQV9CQVNFKSArIDEpIC8qIEkvTzogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFVBUlRfUlNBX0lFUl9SeF9GSUZPX0ggKDEgPDwgMCkgLyogRW5hYmxlIFJ4IEZJRk8gaGFsZiBmdWxsIGludC4gKi8KKyNkZWZpbmUgVUFSVF9SU0FfSUVSX1R4X0ZJRk9fSCAoMSA8PCAxKSAvKiBFbmFibGUgVHggRklGTyBoYWxmIGZ1bGwgaW50LiAqLworI2RlZmluZSBVQVJUX1JTQV9JRVJfVHhfRklGT19FICgxIDw8IDIpIC8qIEVuYWJsZSBUeCBGSUZPIGVtcHR5IGludC4gKi8KKyNkZWZpbmUgVUFSVF9SU0FfSUVSX1J4X1RPVVQgKDEgPDwgMykgLyogRW5hYmxlIGNoYXIgcmVjZWl2ZSB0aW1lb3V0IGludCAqLworI2RlZmluZSBVQVJUX1JTQV9JRVJfVElNRVIgKDEgPDwgNCkgLyogRW5hYmxlIHRpbWVyIGludGVycnVwdCAqLworCisjZGVmaW5lIFVBUlRfUlNBX1NSUiAoKFVBUlRfUlNBX0JBU0UpICsgMikgLyogSU46IFN0YXR1cyBSZWFkIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1R4X0ZJRk9fTkVNUCAoMSA8PCAwKSAvKiBUeCBGSUZPIGlzIG5vdCBlbXB0eSAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1R4X0ZJRk9fTkhGTCAoMSA8PCAxKSAvKiBUeCBGSUZPIGlzIG5vdCBoYWxmIGZ1bGwgKDEpICovCisjZGVmaW5lIFVBUlRfUlNBX1NSUl9UeF9GSUZPX05GVUwgKDEgPDwgMikgLyogVHggRklGTyBpcyBub3QgZnVsbCAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X0ZJRk9fTkVNUCAoMSA8PCAzKSAvKiBSeCBGSUZPIGlzIG5vdCBlbXB0eSAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X0ZJRk9fTkhGTCAoMSA8PCA0KSAvKiBSeCBGSUZPIGlzIG5vdCBoYWxmIGZ1bGwgKDEpICovCisjZGVmaW5lIFVBUlRfUlNBX1NSUl9SeF9GSUZPX05GVUwgKDEgPDwgNSkgLyogUnggRklGTyBpcyBub3QgZnVsbCAoMSkgKi8KKyNkZWZpbmUgVUFSVF9SU0FfU1JSX1J4X1RPVVQgKDEgPDwgNikgLyogQ2hhcmFjdGVyIHJlY2VwdGlvbiB0aW1lb3V0IG9jY3VycmVkICgxKSAqLworI2RlZmluZSBVQVJUX1JTQV9TUlJfVElNRVIgKDEgPDwgNykgLyogVGltZXIgaW50ZXJydXB0IG9jY3VycmVkICovCisKKyNkZWZpbmUgVUFSVF9SU0FfRlJSICgoVUFSVF9SU0FfQkFTRSkgKyAyKSAvKiBPVVQ6IEZJRk8gUmVzZXQgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBVQVJUX1JTQV9USVZTUiAoKFVBUlRfUlNBX0JBU0UpICsgMykgLyogSS9POiBUaW1lciBJbnRlcnZhbCBWYWx1ZSBTZXQgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBVQVJUX1JTQV9UQ1IgKChVQVJUX1JTQV9CQVNFKSArIDQpIC8qIE9VVDogVGltZXIgQ29udHJvbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFVBUlRfUlNBX1RDUl9TV0lUQ0ggKDEgPDwgMCkgLyogVGltZXIgb24gKi8KKworLyoKKyAqIFRoZSBSU0EgRFNWL0lJIGJvYXJkIGhhcyB0d28gZml4ZWQgY2xvY2sgZnJlcXVlbmNpZXMuICBPbmUgaXMgdGhlCisgKiBzdGFuZGFyZCByYXRlLCBhbmQgdGhlIG90aGVyIGlzIDggdGltZXMgZmFzdGVyLgorICovCisjZGVmaW5lIFNFUklBTF9SU0FfQkFVRF9CQVNFICg5MjE2MDApCisjZGVmaW5lIFNFUklBTF9SU0FfQkFVRF9CQVNFX0xPIChTRVJJQUxfUlNBX0JBVURfQkFTRSAvIDgpCisKKy8qCisgKiBFeHRyYSBzZXJpYWwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCBVQVJUcworICogaW4gVEkgT01BUCBwcm9jZXNzb3JzLgorICovCisjZGVmaW5lIFVBUlRfT01BUF9NRFIxCQkweDA4CS8qIE1vZGUgZGVmaW5pdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfTURSMgkJMHgwOQkvKiBNb2RlIGRlZmluaXRpb24gcmVnaXN0ZXIgMiAqLworI2RlZmluZSBVQVJUX09NQVBfU0NSCQkweDEwCS8qIFN1cHBsZW1lbnRhcnkgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfU1NSCQkweDExCS8qIFN1cHBsZW1lbnRhcnkgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfT01BUF9FQkxSCQkweDEyCS8qIEJPRiBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9PTUFQX09TQ18xMk1fU0VMCTB4MTMJLyogT01BUDE1MTAgMTJNSHogb3NjIHNlbGVjdCAqLworI2RlZmluZSBVQVJUX09NQVBfTVZFUgkJMHgxNAkvKiBNb2R1bGUgdmVyc2lvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfU1lTQwkJMHgxNQkvKiBTeXN0ZW0gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBVQVJUX09NQVBfU1lTUwkJMHgxNgkvKiBTeXN0ZW0gc3RhdHVzIHJlZ2lzdGVyICovCisKKyNlbmRpZiAvKiBfTElOVVhfU0VSSUFMX1JFR19IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2VyaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg3ZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zZXJpby5oCkBAIC0wLDAgKzEsNzIgQEAKKyNpZm5kZWYgX1NFUklPX0gKKyNkZWZpbmUgX1NFUklPX0gKKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIFNQSU9DU1RZUEUJX0lPVygncScsIDB4MDEsIHVuc2lnbmVkIGxvbmcpCisKKworLyoKKyAqIGJpdCBtYXNrcyBmb3IgdXNlIGluICJpbnRlcnJ1cHQiIGZsYWdzICgzcmQgYXJndW1lbnQpCisgKi8KKyNkZWZpbmUgU0VSSU9fVElNRU9VVAkxCisjZGVmaW5lIFNFUklPX1BBUklUWQkyCisjZGVmaW5lIFNFUklPX0ZSQU1FCTQKKworLyoKKyAqIFNlcmlvIHR5cGVzCisgKi8KKyNkZWZpbmUgU0VSSU9fWFQJMHgwMAorI2RlZmluZSBTRVJJT184MDQyCTB4MDEKKyNkZWZpbmUgU0VSSU9fUlMyMzIJMHgwMgorI2RlZmluZSBTRVJJT19ISUxfTUxDCTB4MDMKKyNkZWZpbmUgU0VSSU9fUFNfUFNUSFJVCTB4MDUKKyNkZWZpbmUgU0VSSU9fODA0Ml9YTAkweDA2CisKKy8qCisgKiBTZXJpbyB0eXBlcworICovCisjZGVmaW5lIFNFUklPX1VOS05PV04JMHgwMAorI2RlZmluZSBTRVJJT19NU0MJMHgwMQorI2RlZmluZSBTRVJJT19TVU4JMHgwMgorI2RlZmluZSBTRVJJT19NUwkweDAzCisjZGVmaW5lIFNFUklPX01QCTB4MDQKKyNkZWZpbmUgU0VSSU9fTVoJMHgwNQorI2RlZmluZSBTRVJJT19NWlAJMHgwNgorI2RlZmluZSBTRVJJT19NWlBQCTB4MDcKKyNkZWZpbmUgU0VSSU9fVlNYWFhBQQkweDA4CisjZGVmaW5lIFNFUklPX1NVTktCRAkweDEwCisjZGVmaW5lIFNFUklPX1dBUlJJT1IJMHgxOAorI2RlZmluZSBTRVJJT19TUEFDRU9SQgkweDE5CisjZGVmaW5lIFNFUklPX01BR0VMTEFOCTB4MWEKKyNkZWZpbmUgU0VSSU9fU1BBQ0VCQUxMCTB4MWIKKyNkZWZpbmUgU0VSSU9fR1VOWkUJMHgxYworI2RlZmluZSBTRVJJT19JRk9SQ0UJMHgxZAorI2RlZmluZSBTRVJJT19TVElOR0VSCTB4MWUKKyNkZWZpbmUgU0VSSU9fTkVXVE9OCTB4MWYKKyNkZWZpbmUgU0VSSU9fU1RPV0FXQVkJMHgyMAorI2RlZmluZSBTRVJJT19IMzYwMAkweDIxCisjZGVmaW5lIFNFUklPX1BTMlNFUgkweDIyCisjZGVmaW5lIFNFUklPX1RXSURLQkQJMHgyMworI2RlZmluZSBTRVJJT19UV0lESk9ZCTB4MjQKKyNkZWZpbmUgU0VSSU9fSElMCTB4MjUKKyNkZWZpbmUgU0VSSU9fU05FUzIzMgkweDI2CisjZGVmaW5lIFNFUklPX1NFTVRFQ0gJMHgyNworI2RlZmluZSBTRVJJT19MS0tCRAkweDI4CisjZGVmaW5lIFNFUklPX0VMTwkweDI5CisjZGVmaW5lIFNFUklPX01JQ1JPVE9VQ0gJMHgzMAorI2RlZmluZSBTRVJJT19QRU5NT1VOVAkweDMxCisjZGVmaW5lIFNFUklPX1RPVUNIUklHSFQJMHgzMgorI2RlZmluZSBTRVJJT19UT1VDSFdJTgkweDMzCisjZGVmaW5lIFNFUklPX1RBT1NFVk0JMHgzNAorI2RlZmluZSBTRVJJT19GVUpJVFNVCTB4MzUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NobS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zaG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGJmODc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zaG0uaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIF9MSU5VWF9TSE1fSF8KKyNkZWZpbmUgX0xJTlVYX1NITV9IXworCisjaW5jbHVkZSA8bGludXgvaXBjLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKgorICogU0hNTUFYLCBTSE1NTkkgYW5kIFNITUFMTCBhcmUgdXBwZXIgbGltaXRzIGFyZSBkZWZhdWx0cyB3aGljaCBjYW4KKyAqIGJlIGluY3JlYXNlZCBieSBzeXNjdGwKKyAqLworCisjZGVmaW5lIFNITU1BWCAweDIwMDAwMDAJCSAvKiBtYXggc2hhcmVkIHNlZyBzaXplIChieXRlcykgKi8KKyNkZWZpbmUgU0hNTUlOIDEJCQkgLyogbWluIHNoYXJlZCBzZWcgc2l6ZSAoYnl0ZXMpICovCisjZGVmaW5lIFNITU1OSSA0MDk2CQkJIC8qIG1heCBudW0gb2Ygc2VncyBzeXN0ZW0gd2lkZSAqLworI2RlZmluZSBTSE1BTEwgKFNITU1BWC9QQUdFX1NJWkUqKFNITU1OSS8xNikpIC8qIG1heCBzaG0gc3lzdGVtIHdpZGUgKHBhZ2VzKSAqLworI2RlZmluZSBTSE1TRUcgU0hNTU5JCQkJIC8qIG1heCBzaGFyZWQgc2VncyBwZXIgcHJvY2VzcyAqLworCisKKy8qIE9ic29sZXRlLCB1c2VkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBsaWJjNSBjb21waWxlcyAqLworc3RydWN0IHNobWlkX2RzIHsKKwlzdHJ1Y3QgaXBjX3Blcm0JCXNobV9wZXJtOwkvKiBvcGVyYXRpb24gcGVybXMgKi8KKwlpbnQJCQlzaG1fc2Vnc3o7CS8qIHNpemUgb2Ygc2VnbWVudCAoYnl0ZXMpICovCisJX19rZXJuZWxfdGltZV90CQlzaG1fYXRpbWU7CS8qIGxhc3QgYXR0YWNoIHRpbWUgKi8KKwlfX2tlcm5lbF90aW1lX3QJCXNobV9kdGltZTsJLyogbGFzdCBkZXRhY2ggdGltZSAqLworCV9fa2VybmVsX3RpbWVfdAkJc2htX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJX19rZXJuZWxfaXBjX3BpZF90CXNobV9jcGlkOwkvKiBwaWQgb2YgY3JlYXRvciAqLworCV9fa2VybmVsX2lwY19waWRfdAlzaG1fbHBpZDsJLyogcGlkIG9mIGxhc3Qgb3BlcmF0b3IgKi8KKwl1bnNpZ25lZCBzaG9ydAkJc2htX25hdHRjaDsJLyogbm8uIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCAJCXNobV91bnVzZWQ7CS8qIGNvbXBhdGliaWxpdHkgKi8KKwl2b2lkIAkJCSpzaG1fdW51c2VkMjsJLyogZGl0dG8gLSB1c2VkIGJ5IERJUEMgKi8KKwl2b2lkCQkJKnNobV91bnVzZWQzOwkvKiB1bnVzZWQgKi8KK307CisKKy8qIEluY2x1ZGUgdGhlIGRlZmluaXRpb24gb2Ygc2htaWQ2NF9kcyBhbmQgc2htaW5mbzY0ICovCisjaW5jbHVkZSA8YXNtL3NobWJ1Zi5oPgorCisvKiBwZXJtaXNzaW9uIGZsYWcgZm9yIHNobWdldCAqLworI2RlZmluZSBTSE1fUgkJMDQwMAkvKiBvciBTX0lSVUdPIGZyb20gPGxpbnV4L3N0YXQuaD4gKi8KKyNkZWZpbmUgU0hNX1cJCTAyMDAJLyogb3IgU19JV1VHTyBmcm9tIDxsaW51eC9zdGF0Lmg+ICovCisKKy8qIG1vZGUgZm9yIGF0dGFjaCAqLworI2RlZmluZQlTSE1fUkRPTkxZCTAxMDAwMAkvKiByZWFkLW9ubHkgYWNjZXNzICovCisjZGVmaW5lCVNITV9STkQJCTAyMDAwMAkvKiByb3VuZCBhdHRhY2ggYWRkcmVzcyB0byBTSE1MQkEgYm91bmRhcnkgKi8KKyNkZWZpbmUJU0hNX1JFTUFQCTA0MDAwMAkvKiB0YWtlLW92ZXIgcmVnaW9uIG9uIGF0dGFjaCAqLworI2RlZmluZQlTSE1fRVhFQwkwMTAwMDAwCS8qIGV4ZWN1dGlvbiBhY2Nlc3MgKi8KKworLyogc3VwZXIgdXNlciBzaG1jdGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgU0hNX0xPQ0sgCTExCisjZGVmaW5lIFNITV9VTkxPQ0sgCTEyCisKKy8qIGlwY3MgY3RsIGNvbW1hbmRzICovCisjZGVmaW5lIFNITV9TVEFUIAkxMworI2RlZmluZSBTSE1fSU5GTyAJMTQKKworLyogT2Jzb2xldGUsIHVzZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KK3N0cnVjdAlzaG1pbmZvIHsKKwlpbnQgc2htbWF4OworCWludCBzaG1taW47CisJaW50IHNobW1uaTsKKwlpbnQgc2htc2VnOworCWludCBzaG1hbGw7Cit9OworCitzdHJ1Y3Qgc2htX2luZm8geworCWludCB1c2VkX2lkczsKKwl1bnNpZ25lZCBsb25nIHNobV90b3Q7CS8qIHRvdGFsIGFsbG9jYXRlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHNobV9yc3M7CS8qIHRvdGFsIHJlc2lkZW50IHNobSAqLworCXVuc2lnbmVkIGxvbmcgc2htX3N3cDsJLyogdG90YWwgc3dhcHBlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHN3YXBfYXR0ZW1wdHM7CisJdW5zaWduZWQgbG9uZyBzd2FwX3N1Y2Nlc3NlczsKK307CisKKworI2VuZGlmIC8qIF9MSU5VWF9TSE1fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjY5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfTElOVVhfU0lHTkFMX0gKKyNkZWZpbmUgX0xJTlVYX1NJR05BTF9ICisKKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4KKworCisjZW5kaWYgLyogX0xJTlVYX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbGZkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NpZ25hbGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhMzJiNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc2lnbmFsZmQuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogIGluY2x1ZGUvbGludXgvc2lnbmFsZmQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfU0lHTkFMRkRfSAorI2RlZmluZSBfTElOVVhfU0lHTkFMRkRfSAorCisKK3N0cnVjdCBzaWduYWxmZF9zaWdpbmZvIHsKKwlfX3UzMiBzc2lfc2lnbm87CisJX19zMzIgc3NpX2Vycm5vOworCV9fczMyIHNzaV9jb2RlOworCV9fdTMyIHNzaV9waWQ7CisJX191MzIgc3NpX3VpZDsKKwlfX3MzMiBzc2lfZmQ7CisJX191MzIgc3NpX3RpZDsKKwlfX3UzMiBzc2lfYmFuZDsKKwlfX3UzMiBzc2lfb3ZlcnJ1bjsKKwlfX3UzMiBzc2lfdHJhcG5vOworCV9fczMyIHNzaV9zdGF0dXM7CisJX19zMzIgc3NpX2ludDsKKwlfX3U2NCBzc2lfcHRyOworCV9fdTY0IHNzaV91dGltZTsKKwlfX3U2NCBzc2lfc3RpbWU7CisJX191NjQgc3NpX2FkZHI7CisKKwkvKgorCSAqIFBhZCBzdHJjdHVyZSB0byAxMjggYnl0ZXMuIFJlbWVtYmVyIHRvIHVwZGF0ZSB0aGUKKwkgKiBwYWQgc2l6ZSB3aGVuIHlvdSBhZGQgbmV3IG1lbWViZXJzLiBXZSB1c2UgYSBmaXhlZAorCSAqIHNpemUgc3RydWN0dXJlIHRvIGF2b2lkIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aAorCSAqIGZ1dHVyZSB2ZXJzaW9ucywgYW5kIHdlIGxlYXZlIGV4dHJhIHNwYWNlIGZvciBhZGRpdGlvbmFsCisJICogbWVtYmVycy4gV2UgdXNlIGZpeGVkIHNpemUgbWVtYmVycyBiZWNhdXNlIHRoaXMgc3RyY3R1cmUKKwkgKiBjb21lcyBvdXQgb2YgYSByZWFkKDIpIGFuZCB3ZSByZWFsbHkgZG9uJ3Qgd2FudCB0byBoYXZlCisJICogYSBjb21wYXQgb24gcmVhZCgyKS4KKwkgKi8KKwlfX3U4IF9fcGFkWzQ4XTsKK307CisKKworCisjZW5kaWYgLyogX0xJTlVYX1NJR05BTEZEX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc21iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5NGFkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc21iLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBzbWIuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgUGFhbC1Lci4gRW5nc3RhZCBhbmQgVm9sa2VyIExlbmRlY2tlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9TTUJfSAorI2RlZmluZSBfTElOVVhfU01CX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworZW51bSBzbWJfcHJvdG9jb2wgeyAKKwlTTUJfUFJPVE9DT0xfTk9ORSwgCisJU01CX1BST1RPQ09MX0NPUkUsIAorCVNNQl9QUk9UT0NPTF9DT1JFUExVUywgCisJU01CX1BST1RPQ09MX0xBTk1BTjEsIAorCVNNQl9QUk9UT0NPTF9MQU5NQU4yLCAKKwlTTUJfUFJPVE9DT0xfTlQxIAorfTsKKworZW51bSBzbWJfY2FzZV9obmRsIHsKKwlTTUJfQ0FTRV9ERUZBVUxULAorCVNNQl9DQVNFX0xPV0VSLAorCVNNQl9DQVNFX1VQUEVSCit9OworCitzdHJ1Y3Qgc21iX2Rza2F0dHIgeworICAgICAgICBfX3UxNiB0b3RhbDsKKyAgICAgICAgX191MTYgYWxsb2NibG9ja3M7CisgICAgICAgIF9fdTE2IGJsb2Nrc2l6ZTsKKyAgICAgICAgX191MTYgZnJlZTsKK307CisKK3N0cnVjdCBzbWJfY29ubl9vcHQgeworCisgICAgICAgIC8qIFRoZSBzb2NrZXQgKi8KKwl1bnNpZ25lZCBpbnQgZmQ7CisKKwllbnVtIHNtYl9wcm90b2NvbCBwcm90b2NvbDsKKwllbnVtIHNtYl9jYXNlX2huZGwgY2FzZV9oYW5kbGluZzsKKworCS8qIENvbm5lY3Rpb24tT3B0aW9ucyAqLworCisJX191MzIgICAgICAgICAgICAgIG1heF94bWl0OworCV9fdTE2ICAgICAgICAgICAgICBzZXJ2ZXJfdWlkOworCV9fdTE2ICAgICAgICAgICAgICB0aWQ7CisKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgTEFOTUFOIDEuMCBvcHRpb25zICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICAgICBzZWNtb2RlOworICAgICAgICBfX3UxNiAgICAgICAgICAgICAgbWF4bXV4OworICAgICAgICBfX3UxNiAgICAgICAgICAgICAgbWF4dmNzOworICAgICAgICBfX3UxNiAgICAgICAgICAgICAgcmF3bW9kZTsKKyAgICAgICAgX191MzIgICAgICAgICAgICAgIHNlc3NrZXk7CisKKwkvKiBUaGUgZm9sbG93aW5nIGFyZSBOVCBMTSAwLjEyIG9wdGlvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgbWF4cmF3OworCV9fdTMyICAgICAgICAgICAgICBjYXBhYmlsaXRpZXM7CisJX19zMTYgICAgICAgICAgICAgIHNlcnZlcnpvbmU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc21iX2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NtYl9mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZTk0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NtYl9mcy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgc21iX2ZzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1IGJ5IFBhYWwtS3IuIEVuZ3N0YWQgYW5kIFZvbGtlciBMZW5kZWNrZQorICogIENvcHlyaWdodCAoQykgMTk5NyBieSBWb2xrZXIgTGVuZGVja2UKKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfU01CX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1NNQl9GU19ICisKKyNpbmNsdWRlIDxsaW51eC9zbWIuaD4KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJU01CX0lPQ19HRVRNT1VOVFVJRAkJX0lPUigndScsIDEsIF9fa2VybmVsX29sZF91aWRfdCkKKyNkZWZpbmUgU01CX0lPQ19ORVdDT05OICAgICAgICAgICAgICAgICBfSU9XKCd1JywgMiwgc3RydWN0IHNtYl9jb25uX29wdCkKKworLyogX19rZXJuZWxfdWlkX3QgY2FuIG5ldmVyIGNoYW5nZSwgc28gd2UgaGF2ZSB0byB1c2UgX19rZXJuZWxfdWlkMzJfdCAqLworI2RlZmluZQlTTUJfSU9DX0dFVE1PVU5UVUlEMzIJCV9JT1IoJ3UnLCAzLCBfX2tlcm5lbF91aWQzMl90KQorCisKKworI2VuZGlmIC8qIF9MSU5VWF9TTUJfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbWJfbW91bnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc21iX21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NTZiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc21iX21vdW50LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqICBzbWJfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgUGFhbC1Lci4gRW5nc3RhZCBhbmQgVm9sa2VyIExlbmRlY2tlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9TTUJfTU9VTlRfSAorI2RlZmluZSBfTElOVVhfU01CX01PVU5UX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgU01CX01PVU5UX1ZFUlNJT04JNgorCitzdHJ1Y3Qgc21iX21vdW50X2RhdGEgeworCWludCB2ZXJzaW9uOworCV9fa2VybmVsX3VpZF90IG1vdW50ZWRfdWlkOyAvKiBXaG8gbWF5IHVtb3VudCgpIHRoaXMgZmlsZXN5c3RlbT8gKi8KKwlfX2tlcm5lbF91aWRfdCB1aWQ7CisJX19rZXJuZWxfZ2lkX3QgZ2lkOworCV9fa2VybmVsX21vZGVfdCBmaWxlX21vZGU7CisJX19rZXJuZWxfbW9kZV90IGRpcl9tb2RlOworfTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbWJuby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbWJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWUwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NtYm5vLmgKQEAgLTAsMCArMSwzNjMgQEAKKyNpZm5kZWYgX1NNQk5PX0hfCisjZGVmaW5lIF9TTUJOT19IXworCisvKiB0aGVzZSBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBieXRlIGFzIHNlZW4gYnkgRE9TICovCisjZGVmaW5lIGFST05MWQkoMUw8PDApCisjZGVmaW5lIGFISURERU4JKDFMPDwxKQorI2RlZmluZSBhU1lTVEVNCSgxTDw8MikKKyNkZWZpbmUgYVZPTElECSgxTDw8MykKKyNkZWZpbmUgYURJUgkoMUw8PDQpCisjZGVmaW5lIGFBUkNICSgxTDw8NSkKKworLyogZXJyb3IgY2xhc3NlcyAqLworI2RlZmluZSBTVUNDRVNTIDAgIC8qIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLiAqLworI2RlZmluZSBFUlJET1MgMHgwMSAvKiAgRXJyb3IgaXMgZnJvbSB0aGUgY29yZSBET1Mgb3BlcmF0aW5nIHN5c3RlbSBzZXQuICovCisjZGVmaW5lIEVSUlNSViAweDAyIC8qIEVycm9yIGlzIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyIG5ldHdvcmsgZmlsZSBtYW5hZ2VyLiovCisjZGVmaW5lIEVSUkhSRCAweDAzICAvKiBFcnJvciBpcyBhbiBoYXJkd2FyZSBlcnJvci4gKi8KKyNkZWZpbmUgRVJSQ01EIDB4RkYgIC8qIENvbW1hbmQgd2FzIG5vdCBpbiB0aGUgIlNNQiIgZm9ybWF0LiAqLworCisvKiBTTUIgWC9PcGVuIGVycm9yIGNvZGVzIGZvciB0aGUgRVJSZG9zIGVycm9yIGNsYXNzICovCisKKyNkZWZpbmUgRVJSYmFkZnVuYyAxICAgICAgICAgICAgLyogSW52YWxpZCBmdW5jdGlvbiAob3Igc3lzdGVtIGNhbGwpICovCisjZGVmaW5lIEVSUmJhZGZpbGUgMiAgICAgICAgICAgIC8qIEZpbGUgbm90IGZvdW5kIChwYXRobmFtZSBlcnJvcikgKi8KKyNkZWZpbmUgRVJSYmFkcGF0aCAzICAgICAgICAgICAgLyogRGlyZWN0b3J5IG5vdCBmb3VuZCAqLworI2RlZmluZSBFUlJub2ZpZHMgNCAgICAgICAgICAgICAvKiBUb28gbWFueSBvcGVuIGZpbGVzICovCisjZGVmaW5lIEVSUm5vYWNjZXNzIDUgICAgICAgICAgIC8qIEFjY2VzcyBkZW5pZWQgKi8KKyNkZWZpbmUgRVJSYmFkZmlkIDYgICAgICAgICAgICAgLyogSW52YWxpZCBmaWQgKi8KKyNkZWZpbmUgRVJSYmFkbWNiIDcgICAgICAgICAgICAgLyogTWVtb3J5IGNvbnRyb2wgYmxvY2tzIGRlc3Ryb3llZCAqLworI2RlZmluZSBFUlJub21lbSA4ICAgICAgICAgICAgICAvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lIEVSUmJhZG1lbSA5ICAgICAgICAgICAgIC8qIEludmFsaWQgbWVtb3J5IGJsb2NrIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVJSYmFkZW52IDEwICAgICAgICAgICAgLyogSW52YWxpZCBlbnZpcm9ubWVudCAqLworI2RlZmluZSBFUlJiYWRmb3JtYXQgMTEgICAgICAgICAvKiBJbnZhbGlkIGZvcm1hdCAqLworI2RlZmluZSBFUlJiYWRhY2Nlc3MgMTIgICAgICAgICAvKiBJbnZhbGlkIG9wZW4gbW9kZSAqLworI2RlZmluZSBFUlJiYWRkYXRhIDEzICAgICAgICAgICAvKiBJbnZhbGlkIGRhdGEgKG9ubHkgZnJvbSBpb2N0bCBjYWxsKSAqLworI2RlZmluZSBFUlJyZXMgMTQgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworI2RlZmluZSBFUlJiYWRkcml2ZSAxNSAgICAgICAgICAvKiBJbnZhbGlkIGRyaXZlICovCisjZGVmaW5lIEVSUnJlbWNkIDE2ICAgICAgICAgICAgIC8qIEF0dGVtcHQgdG8gZGVsZXRlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisjZGVmaW5lIEVSUmRpZmZkZXZpY2UgMTcgICAgICAgIC8qIHJlbmFtZS9tb3ZlIGFjcm9zcyBkaWZmZXJlbnQgZmlsZXN5c3RlbXMgKi8KKyNkZWZpbmUgRVJSbm9maWxlcyAxOCAgICAgICAgICAgLyogbm8gbW9yZSBmaWxlcyBmb3VuZCBpbiBmaWxlIHNlYXJjaCAqLworI2RlZmluZSBFUlJiYWRzaGFyZSAzMiAgICAgICAgICAvKiBTaGFyZSBtb2RlIG9uIGZpbGUgY29uZmxpY3Qgd2l0aCBvcGVuIG1vZGUgKi8KKyNkZWZpbmUgRVJSbG9jayAzMyAgICAgICAgICAgICAgLyogTG9jayByZXF1ZXN0IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGxvY2sgKi8KKyNkZWZpbmUgRVJSZmlsZXhpc3RzIDgwICAgICAgICAgLyogRmlsZSBpbiBvcGVyYXRpb24gYWxyZWFkeSBleGlzdHMgKi8KKyNkZWZpbmUgRVJSYmFkcGlwZSAyMzAgICAgICAgICAgLyogTmFtZWQgcGlwZSBpbnZhbGlkICovCisjZGVmaW5lIEVSUnBpcGVidXN5IDIzMSAgICAgICAgIC8qIEFsbCBpbnN0YW5jZXMgb2YgcGlwZSBhcmUgYnVzeSAqLworI2RlZmluZSBFUlJwaXBlY2xvc2luZyAyMzIgICAgICAvKiBuYW1lZCBwaXBlIGNsb3NlIGluIHByb2dyZXNzICovCisjZGVmaW5lIEVSUm5vdGNvbm5lY3RlZCAyMzMgICAgIC8qIE5vIHByb2Nlc3Mgb24gb3RoZXIgZW5kIG9mIG5hbWVkIHBpcGUgKi8KKyNkZWZpbmUgRVJSbW9yZWRhdGEgMjM0ICAgICAgICAgLyogTW9yZSBkYXRhIHRvIGJlIHJldHVybmVkICovCisKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIJIDg3CisjZGVmaW5lIEVSUk9SX0RJU0tfRlVMTAkJMTEyCisjZGVmaW5lIEVSUk9SX0lOVkFMSURfTkFNRQkxMjMKKyNkZWZpbmUgRVJST1JfRElSX05PVF9FTVBUWQkxNDUKKyNkZWZpbmUgRVJST1JfTk9UX0xPQ0tFRAkxNTgKKyNkZWZpbmUgRVJST1JfQUxSRUFEWV9FWElTVFMJMTgzICAvKiBzZWUgYWxzbyA4MCA/ICovCisjZGVmaW5lIEVSUk9SX0VBU19ESUROVF9GSVQJMjc1IC8qIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZGlkbid0IGZpdCAqLworI2RlZmluZSBFUlJPUl9FQVNfTk9UX1NVUFBPUlRFRAkyODIgLyogRXh0ZW5kZWQgYXR0cmlidXRlcyBub3Qgc3VwcG9ydGVkICovCisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRVJSU1JWIGNsYXNzICovCisKKyNkZWZpbmUgRVJSZXJyb3IgMSAgICAgICAgICAgICAgLyogTm9uIHNwZWNpZmljIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgRVJSYmFkcHcgMiAgICAgICAgICAgICAgLyogQmFkIHBhc3N3b3JkICovCisjZGVmaW5lIEVSUmJhZHR5cGUgMyAgICAgICAgICAgIC8qIHJlc2VydmVkICovCisjZGVmaW5lIEVSUmFjY2VzcyA0ICAgICAgICAgIC8qIE5vIHBlcm1pc3Npb25zIHRvIGRvIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uICovCisjZGVmaW5lIEVSUmludm5pZCA1ICAgICAgICAgICAgIC8qIHRpZCBpbnZhbGlkICovCisjZGVmaW5lIEVSUmludm5ldG5hbWUgNiAgICAgICAgIC8qIEludmFsaWQgc2VydmVybmFtZSAqLworI2RlZmluZSBFUlJpbnZkZXZpY2UgNyAgICAgICAgICAvKiBJbnZhbGlkIGRldmljZSAqLworI2RlZmluZSBFUlJxZnVsbCA0OSAgICAgICAgICAgICAvKiBQcmludCBxdWV1ZSBmdWxsICovCisjZGVmaW5lIEVSUnF0b29iaWcgNTAgICAgICAgICAgIC8qIFF1ZXVlZCBpdGVtIHRvbyBiaWcgKi8KKyNkZWZpbmUgRVJSaW52cGZpZCA1MiAgICAgICAgICAgLyogSW52YWxpZCBwcmludCBmaWxlIGluIHNtYl9maWQgKi8KKyNkZWZpbmUgRVJSc21iY21kIDY0ICAgICAgICAgICAgLyogVW5yZWNvZ25pc2VkIGNvbW1hbmQgKi8KKyNkZWZpbmUgRVJSc3J2ZXJyb3IgNjUgICAgICAgICAgLyogc21iIHNlcnZlciBpbnRlcm5hbCBlcnJvciAqLworI2RlZmluZSBFUlJmaWxlc3BlY3MgNjcgICAgICAgICAvKiBmaWQgYW5kIHBhdGhuYW1lIGludmFsaWQgY29tYmluYXRpb24gKi8KKyNkZWZpbmUgRVJSYmFkbGluayA2OCAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRVJSYmFkcGVybWl0cyA2OSAgICAgICAgLyogQWNjZXNzIHNwZWNpZmllZCBmb3IgYSBmaWxlIGlzIG5vdCB2YWxpZCAqLworI2RlZmluZSBFUlJiYWRwaWQgNzAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworI2RlZmluZSBFUlJzZXRhdHRybW9kZSA3MSAgICAgICAvKiBhdHRyaWJ1dGUgbW9kZSBpbnZhbGlkICovCisjZGVmaW5lIEVSUnBhdXNlZCA4MSAgICAgICAgICAgIC8qIE1lc3NhZ2Ugc2VydmVyIHBhdXNlZCAqLworI2RlZmluZSBFUlJtc2dvZmYgODIgICAgICAgICAgICAvKiBOb3QgcmVjZWl2aW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIEVSUm5vcm9vbSA4MyAgICAgICAgICAgIC8qIE5vIHJvb20gZm9yIG1lc3NhZ2UgKi8KKyNkZWZpbmUgRVJScm11bnMgODcgICAgICAgICAgICAgLyogdG9vIG1hbnkgcmVtb3RlIHVzZXJuYW1lcyAqLworI2RlZmluZSBFUlJ0aW1lb3V0IDg4ICAgICAgICAgICAvKiBvcGVyYXRpb24gdGltZWQgb3V0ICovCisjZGVmaW5lIEVSUm5vcmVzb3VyY2UgIDg5ICAgLyogTm8gcmVzb3VyY2VzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHJlcXVlc3QuICovCisjZGVmaW5lIEVSUnRvb21hbnl1aWRzIDkwICAgICAgIC8qIHRvbyBtYW55IHVzZXJpZHMgKi8KKyNkZWZpbmUgRVJSYmFkdWlkIDkxICAgICAgICAgICAgLyogYmFkIHVzZXJpZCAqLworI2RlZmluZSBFUlJ1c2VNUFggMjUwICAgIC8qIHRlbXBvcmFyaWx5IHVuYWJsZSB0byB1c2UgcmF3IG1vZGUsIHVzZSBNUFggbW9kZSAqLworI2RlZmluZSBFUlJ1c2VTVEQgMjUxICAgIC8qIHRlbXBvcmFyaWx5IHVuYWJsZSB0byB1c2UgcmF3IG1vZGUsIHVzZSBzdGQubW9kZSAqLworI2RlZmluZSBFUlJjb250TVBYIDI1MiAgICAgICAgICAvKiByZXN1bWUgTVBYIG1vZGUgKi8KKyNkZWZpbmUgRVJSYmFkUFcgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRVJSbm9zdXBwb3J0IDB4RkZGRgorCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEVSUkhSRCBjbGFzcyAqLworCisjZGVmaW5lIEVSUm5vd3JpdGUgMTkgICAgICAgICAgIC8qIHJlYWQgb25seSBtZWRpYSAqLworI2RlZmluZSBFUlJiYWR1bml0IDIwICAgICAgICAgICAvKiBVbmtub3duIGRldmljZSAqLworI2RlZmluZSBFUlJub3RyZWFkeSAyMSAgICAgICAgICAvKiBEcml2ZSBub3QgcmVhZHkgKi8KKyNkZWZpbmUgRVJSYmFkY21kIDIyICAgICAgICAgICAgLyogVW5rbm93biBjb21tYW5kICovCisjZGVmaW5lIEVSUmRhdGEgMjMgICAgICAgICAgICAgIC8qIERhdGEgKENSQykgZXJyb3IgKi8KKyNkZWZpbmUgRVJSYmFkcmVxIDI0ICAgICAgICAgICAgLyogQmFkIHJlcXVlc3Qgc3RydWN0dXJlIGxlbmd0aCAqLworI2RlZmluZSBFUlJzZWVrIDI1CisjZGVmaW5lIEVSUmJhZG1lZGlhIDI2CisjZGVmaW5lIEVSUmJhZHNlY3RvciAyNworI2RlZmluZSBFUlJub3BhcGVyIDI4CisjZGVmaW5lIEVSUndyaXRlIDI5ICAgICAgICAgICAgIC8qIHdyaXRlIGZhdWx0ICovCisjZGVmaW5lIEVSUnJlYWQgMzAgICAgICAgICAgICAgIC8qIHJlYWQgZmF1bHQgKi8KKyNkZWZpbmUgRVJSZ2VuZXJhbCAzMSAgICAgICAgICAgLyogR2VuZXJhbCBoYXJkd2FyZSBmYWlsdXJlICovCisjZGVmaW5lIEVSUndyb25nZGlzayAzNAorI2RlZmluZSBFUlJGQ0J1bmF2YWlsIDM1CisjZGVmaW5lIEVSUnNoYXJlYnVmZXhjIDM2ICAgICAgIC8qIHNoYXJlIGJ1ZmZlciBleGNlZWRlZCAqLworI2RlZmluZSBFUlJkaXNrZnVsbCAzOQorCisvKgorICogQWNjZXNzIG1vZGVzIHdoZW4gb3BlbmluZyBhIGZpbGUKKyAqLworI2RlZmluZSBTTUJfQUNDTUFTSwkweDAwMDMKKyNkZWZpbmUgU01CX09fUkRPTkxZCTB4MDAwMAorI2RlZmluZSBTTUJfT19XUk9OTFkJMHgwMDAxCisjZGVmaW5lIFNNQl9PX1JEV1IJMHgwMDAyCisKKy8qIG9mZnNldHMgaW50byBtZXNzYWdlIGZvciBjb21tb24gaXRlbXMgKi8KKyNkZWZpbmUgc21iX2NvbSA4CisjZGVmaW5lIHNtYl9yY2xzIDkKKyNkZWZpbmUgc21iX3JlaCAxMAorI2RlZmluZSBzbWJfZXJyIDExCisjZGVmaW5lIHNtYl9mbGcgMTMKKyNkZWZpbmUgc21iX2ZsZzIgMTQKKyNkZWZpbmUgc21iX3JlYiAxMworI2RlZmluZSBzbWJfdGlkIDI4CisjZGVmaW5lIHNtYl9waWQgMzAKKyNkZWZpbmUgc21iX3VpZCAzMgorI2RlZmluZSBzbWJfbWlkIDM0CisjZGVmaW5lIHNtYl93Y3QgMzYKKyNkZWZpbmUgc21iX3Z3diAzNworI2RlZmluZSBzbWJfdnd2MCAzNworI2RlZmluZSBzbWJfdnd2MSAzOQorI2RlZmluZSBzbWJfdnd2MiA0MQorI2RlZmluZSBzbWJfdnd2MyA0MworI2RlZmluZSBzbWJfdnd2NCA0NQorI2RlZmluZSBzbWJfdnd2NSA0NworI2RlZmluZSBzbWJfdnd2NiA0OQorI2RlZmluZSBzbWJfdnd2NyA1MQorI2RlZmluZSBzbWJfdnd2OCA1MworI2RlZmluZSBzbWJfdnd2OSA1NQorI2RlZmluZSBzbWJfdnd2MTAgNTcKKyNkZWZpbmUgc21iX3Z3djExIDU5CisjZGVmaW5lIHNtYl92d3YxMiA2MQorI2RlZmluZSBzbWJfdnd2MTMgNjMKKyNkZWZpbmUgc21iX3Z3djE0IDY1CisKKy8qIHRoZXNlIGFyZSB0aGUgdHJhbnMyIHN1YiBmaWVsZHMgZm9yIHByaW1hcnkgcmVxdWVzdHMgKi8KKyNkZWZpbmUgc21iX3Rwc2NudCBzbWJfdnd2MAorI2RlZmluZSBzbWJfdGRzY250IHNtYl92d3YxCisjZGVmaW5lIHNtYl9tcHJjbnQgc21iX3Z3djIKKyNkZWZpbmUgc21iX21kcmNudCBzbWJfdnd2MworI2RlZmluZSBzbWJfbXNyY250IHNtYl92d3Y0CisjZGVmaW5lIHNtYl9mbGFncyBzbWJfdnd2NQorI2RlZmluZSBzbWJfdGltZW91dCBzbWJfdnd2NgorI2RlZmluZSBzbWJfcHNjbnQgc21iX3Z3djkKKyNkZWZpbmUgc21iX3Bzb2ZmIHNtYl92d3YxMAorI2RlZmluZSBzbWJfZHNjbnQgc21iX3Z3djExCisjZGVmaW5lIHNtYl9kc29mZiBzbWJfdnd2MTIKKyNkZWZpbmUgc21iX3N1d2NudCBzbWJfdnd2MTMKKyNkZWZpbmUgc21iX3NldHVwIHNtYl92d3YxNAorI2RlZmluZSBzbWJfc2V0dXAwIHNtYl9zZXR1cAorI2RlZmluZSBzbWJfc2V0dXAxIChzbWJfc2V0dXArMikKKyNkZWZpbmUgc21iX3NldHVwMiAoc21iX3NldHVwKzQpCisKKy8qIHRoZXNlIGFyZSBmb3IgdGhlIHNlY29uZGFyeSByZXF1ZXN0cyAqLworI2RlZmluZSBzbWJfc3BzY250IHNtYl92d3YyCisjZGVmaW5lIHNtYl9zcHNvZmYgc21iX3Z3djMKKyNkZWZpbmUgc21iX3Nwc2Rpc3Agc21iX3Z3djQKKyNkZWZpbmUgc21iX3Nkc2NudCBzbWJfdnd2NQorI2RlZmluZSBzbWJfc2Rzb2ZmIHNtYl92d3Y2CisjZGVmaW5lIHNtYl9zZHNkaXNwIHNtYl92d3Y3CisjZGVmaW5lIHNtYl9zZmlkIHNtYl92d3Y4CisKKy8qIGFuZCB0aGVzZSBmb3IgcmVzcG9uc2VzICovCisjZGVmaW5lIHNtYl90cHJjbnQgc21iX3Z3djAKKyNkZWZpbmUgc21iX3RkcmNudCBzbWJfdnd2MQorI2RlZmluZSBzbWJfcHJjbnQgc21iX3Z3djMKKyNkZWZpbmUgc21iX3Byb2ZmIHNtYl92d3Y0CisjZGVmaW5lIHNtYl9wcmRpc3Agc21iX3Z3djUKKyNkZWZpbmUgc21iX2RyY250IHNtYl92d3Y2CisjZGVmaW5lIHNtYl9kcm9mZiBzbWJfdnd2NworI2RlZmluZSBzbWJfZHJkaXNwIHNtYl92d3Y4CisKKy8qIHRoZSBjb21wbGV0ZSAqLworI2RlZmluZSBTTUJta2RpciAgICAgIDB4MDAgICAvKiBjcmVhdGUgZGlyZWN0b3J5ICovCisjZGVmaW5lIFNNQnJtZGlyICAgICAgMHgwMSAgIC8qIGRlbGV0ZSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgU01Cb3BlbiAgICAgICAweDAyICAgLyogb3BlbiBmaWxlICovCisjZGVmaW5lIFNNQmNyZWF0ZSAgICAgMHgwMyAgIC8qIGNyZWF0ZSBmaWxlICovCisjZGVmaW5lIFNNQmNsb3NlICAgICAgMHgwNCAgIC8qIGNsb3NlIGZpbGUgKi8KKyNkZWZpbmUgU01CZmx1c2ggICAgICAweDA1ICAgLyogZmx1c2ggZmlsZSAqLworI2RlZmluZSBTTUJ1bmxpbmsgICAgIDB4MDYgICAvKiBkZWxldGUgZmlsZSAqLworI2RlZmluZSBTTUJtdiAgICAgICAgIDB4MDcgICAvKiByZW5hbWUgZmlsZSAqLworI2RlZmluZSBTTUJnZXRhdHIgICAgIDB4MDggICAvKiBnZXQgZmlsZSBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNNQnNldGF0ciAgICAgMHgwOSAgIC8qIHNldCBmaWxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgU01CcmVhZCAgICAgICAweDBBICAgLyogcmVhZCBmcm9tIGZpbGUgKi8KKyNkZWZpbmUgU01Cd3JpdGUgICAgICAweDBCICAgLyogd3JpdGUgdG8gZmlsZSAqLworI2RlZmluZSBTTUJsb2NrICAgICAgIDB4MEMgICAvKiBsb2NrIGJ5dGUgcmFuZ2UgKi8KKyNkZWZpbmUgU01CdW5sb2NrICAgICAweDBEICAgLyogdW5sb2NrIGJ5dGUgcmFuZ2UgKi8KKyNkZWZpbmUgU01CY3RlbXAgICAgICAweDBFICAgLyogY3JlYXRlIHRlbXBvcmFyeSBmaWxlICovCisjZGVmaW5lIFNNQm1rbmV3ICAgICAgMHgwRiAgIC8qIG1ha2UgbmV3IGZpbGUgKi8KKyNkZWZpbmUgU01CY2hrcHRoICAgICAweDEwICAgLyogY2hlY2sgZGlyZWN0b3J5IHBhdGggKi8KKyNkZWZpbmUgU01CZXhpdCAgICAgICAweDExICAgLyogcHJvY2VzcyBleGl0ICovCisjZGVmaW5lIFNNQmxzZWVrICAgICAgMHgxMiAgIC8qIHNlZWsgKi8KKyNkZWZpbmUgU01CdGNvbiAgICAgICAweDcwICAgLyogdHJlZSBjb25uZWN0ICovCisjZGVmaW5lIFNNQnRjb25YICAgICAgMHg3NSAgIC8qIHRyZWUgY29ubmVjdCBhbmQgWCovCisjZGVmaW5lIFNNQnRkaXMgICAgICAgMHg3MSAgIC8qIHRyZWUgZGlzY29ubmVjdCAqLworI2RlZmluZSBTTUJuZWdwcm90ICAgIDB4NzIgICAvKiBuZWdvdGlhdGUgcHJvdG9jb2wgKi8KKyNkZWZpbmUgU01CZHNrYXR0ciAgICAweDgwICAgLyogZ2V0IGRpc2sgYXR0cmlidXRlcyAqLworI2RlZmluZSBTTUJzZWFyY2ggICAgIDB4ODEgICAvKiBzZWFyY2ggZGlyZWN0b3J5ICovCisjZGVmaW5lIFNNQnNwbG9wZW4gICAgMHhDMCAgIC8qIG9wZW4gcHJpbnQgc3Bvb2wgZmlsZSAqLworI2RlZmluZSBTTUJzcGx3ciAgICAgIDB4QzEgICAvKiB3cml0ZSB0byBwcmludCBzcG9vbCBmaWxlICovCisjZGVmaW5lIFNNQnNwbGNsb3NlICAgMHhDMiAgIC8qIGNsb3NlIHByaW50IHNwb29sIGZpbGUgKi8KKyNkZWZpbmUgU01Cc3BscmV0cSAgICAweEMzICAgLyogcmV0dXJuIHByaW50IHF1ZXVlICovCisjZGVmaW5lIFNNQnNlbmRzICAgICAgMHhEMCAgIC8qIHNlbmQgc2luZ2xlIGJsb2NrIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU01Cc2VuZGIgICAgICAweEQxICAgLyogc2VuZCBicm9hZGNhc3QgbWVzc2FnZSAqLworI2RlZmluZSBTTUJmd2RuYW1lICAgIDB4RDIgICAvKiBmb3J3YXJkIHVzZXIgbmFtZSAqLworI2RlZmluZSBTTUJjYW5jZWxmICAgIDB4RDMgICAvKiBjYW5jZWwgZm9yd2FyZCAqLworI2RlZmluZSBTTUJnZXRtYWMgICAgIDB4RDQgICAvKiBnZXQgbWFjaGluZSBuYW1lICovCisjZGVmaW5lIFNNQnNlbmRzdHJ0ICAgMHhENSAgIC8qIHNlbmQgc3RhcnQgb2YgbXVsdGktYmxvY2sgbWVzc2FnZSAqLworI2RlZmluZSBTTUJzZW5kZW5kICAgIDB4RDYgICAvKiBzZW5kIGVuZCBvZiBtdWx0aS1ibG9jayBtZXNzYWdlICovCisjZGVmaW5lIFNNQnNlbmR0eHQgICAgMHhENyAgIC8qIHNlbmQgdGV4dCBvZiBtdWx0aS1ibG9jayBtZXNzYWdlICovCisKKy8qIENvcmUrIHByb3RvY29sICovCisjZGVmaW5lIFNNQmxvY2tyZWFkCSAgMHgxMyAgIC8qIExvY2sgYSByYW5nZSBhbmQgcmVhZCAqLworI2RlZmluZSBTTUJ3cml0ZXVubG9jayAweDE0IC8qIFVubG9jayBhIHJhbmdlIHRoZW4gd3JpdGUgKi8KKyNkZWZpbmUgU01CcmVhZGJyYXcgICAweDFhICAvKiByZWFkIGEgYmxvY2sgb2YgZGF0YSB3aXRoIG5vIHNtYiBoZWFkZXIgKi8KKyNkZWZpbmUgU01Cd3JpdGVicmF3ICAweDFkICAvKiB3cml0ZSBhIGJsb2NrIG9mIGRhdGEgd2l0aCBubyBzbWIgaGVhZGVyICovCisjZGVmaW5lIFNNQndyaXRlYyAgICAgMHgyMCAgLyogc2Vjb25kYXJ5IHdyaXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUgU01Cd3JpdGVjbG9zZSAweDJjICAvKiB3cml0ZSBhIGZpbGUgdGhlbiBjbG9zZSBpdCAqLworCisvKiBkb3MgZXh0ZW5kZWQgcHJvdG9jb2wgKi8KKyNkZWZpbmUgU01CcmVhZEJyYXcgICAgICAweDFBICAgLyogcmVhZCBibG9jayByYXcgKi8KKyNkZWZpbmUgU01CcmVhZEJtcHggICAgICAweDFCICAgLyogcmVhZCBibG9jayBtdWx0aXBsZXhlZCAqLworI2RlZmluZSBTTUJyZWFkQnMgICAgICAgIDB4MUMgICAvKiByZWFkIGJsb2NrIChzZWNvbmRhcnkgcmVzcG9uc2UpICovCisjZGVmaW5lIFNNQndyaXRlQnJhdyAgICAgMHgxRCAgIC8qIHdyaXRlIGJsb2NrIHJhdyAqLworI2RlZmluZSBTTUJ3cml0ZUJtcHggICAgIDB4MUUgICAvKiB3cml0ZSBibG9jayBtdWx0aXBsZXhlZCAqLworI2RlZmluZSBTTUJ3cml0ZUJzICAgICAgIDB4MUYgICAvKiB3cml0ZSBibG9jayAoc2Vjb25kYXJ5IHJlcXVlc3QpICovCisjZGVmaW5lIFNNQndyaXRlQyAgICAgICAgMHgyMCAgIC8qIHdyaXRlIGNvbXBsZXRlIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQnNldGF0dHJFICAgICAgMHgyMiAgIC8qIHNldCBmaWxlIGF0dHJpYnV0ZXMgZXhwYW5kZWQgKi8KKyNkZWZpbmUgU01CZ2V0YXR0ckUgICAgICAweDIzICAgLyogZ2V0IGZpbGUgYXR0cmlidXRlcyBleHBhbmRlZCAqLworI2RlZmluZSBTTUJsb2NraW5nWCAgICAgIDB4MjQgICAvKiBsb2NrL3VubG9jayBieXRlIHJhbmdlcyBhbmQgWCAqLworI2RlZmluZSBTTUJ0cmFucyAgICAgICAgIDB4MjUgICAvKiB0cmFuc2FjdGlvbiAtIG5hbWUsIGJ5dGVzIGluL291dCAqLworI2RlZmluZSBTTUJ0cmFuc3MgICAgICAgIDB4MjYgICAvKiB0cmFuc2FjdGlvbiAoc2Vjb25kYXJ5IHJlcXVlc3QvcmVzcG9uc2UpICovCisjZGVmaW5lIFNNQmlvY3RsICAgICAgICAgMHgyNyAgIC8qIElPQ1RMICovCisjZGVmaW5lIFNNQmlvY3RscyAgICAgICAgMHgyOCAgIC8qIElPQ1RMICAoc2Vjb25kYXJ5IHJlcXVlc3QvcmVzcG9uc2UpICovCisjZGVmaW5lIFNNQmNvcHkgICAgICAgICAgMHgyOSAgIC8qIGNvcHkgKi8KKyNkZWZpbmUgU01CbW92ZSAgICAgICAgICAweDJBICAgLyogbW92ZSAqLworI2RlZmluZSBTTUJlY2hvICAgICAgICAgIDB4MkIgICAvKiBlY2hvICovCisjZGVmaW5lIFNNQm9wZW5YICAgICAgICAgMHgyRCAgIC8qIG9wZW4gYW5kIFggKi8KKyNkZWZpbmUgU01CcmVhZFggICAgICAgICAweDJFICAgLyogcmVhZCBhbmQgWCAqLworI2RlZmluZSBTTUJ3cml0ZVggICAgICAgIDB4MkYgICAvKiB3cml0ZSBhbmQgWCAqLworI2RlZmluZSBTTUJzZXNzc2V0dXBYICAgIDB4NzMgICAvKiBTZXNzaW9uIFNldCBVcCAmIFggKGluY2x1ZGluZyBVc2VyIExvZ29uKSAqLworI2RlZmluZSBTTUJ0Y29uWCAgICAgICAgIDB4NzUgICAvKiB0cmVlIGNvbm5lY3QgYW5kIFggKi8KKyNkZWZpbmUgU01CZmZpcnN0ICAgICAgICAweDgyICAgLyogZmluZCBmaXJzdCAqLworI2RlZmluZSBTTUJmdW5pcXVlICAgICAgIDB4ODMgICAvKiBmaW5kIHVuaXF1ZSAqLworI2RlZmluZSBTTUJmY2xvc2UgICAgICAgIDB4ODQgICAvKiBmaW5kIGNsb3NlICovCisjZGVmaW5lIFNNQmludmFsaWQgICAgICAgMHhGRSAgIC8qIGludmFsaWQgY29tbWFuZCAqLworCisKKy8qIEV4dGVuZGVkIDIuMCBwcm90b2NvbCAqLworI2RlZmluZSBTTUJ0cmFuczIgICAgICAgIDB4MzIgICAvKiBUUkFOUzIgcHJvdG9jb2wgc2V0ICovCisjZGVmaW5lIFNNQnRyYW5zczIgICAgICAgMHgzMyAgIC8qIFRSQU5TMiBwcm90b2NvbCBzZXQsIHNlY29uZGFyeSBjb21tYW5kICovCisjZGVmaW5lIFNNQmZpbmRjbG9zZSAgICAgMHgzNCAgIC8qIFRlcm1pbmF0ZSBhIFRSQU5TQUNUMl9GSU5ERklSU1QgKi8KKyNkZWZpbmUgU01CZmluZG5jbG9zZSAgICAweDM1ICAgLyogVGVybWluYXRlIGEgVFJBTlNBQ1QyX0ZJTkROT1RJRllGSVJTVCAqLworI2RlZmluZSBTTUJ1bG9nb2ZmWCAgICAgIDB4NzQgICAvKiB1c2VyIGxvZ29mZiAqLworCisvKiB0aGVzZSBhcmUgdGhlIFRSQU5TMiBzdWIgY29tbWFuZHMgKi8KKyNkZWZpbmUgVFJBTlNBQ1QyX09QRU4gICAgICAgICAgMAorI2RlZmluZSBUUkFOU0FDVDJfRklOREZJUlNUICAgICAxCisjZGVmaW5lIFRSQU5TQUNUMl9GSU5ETkVYVCAgICAgIDIKKyNkZWZpbmUgVFJBTlNBQ1QyX1FGU0lORk8gICAgICAgMworI2RlZmluZSBUUkFOU0FDVDJfU0VURlNJTkZPICAgICA0CisjZGVmaW5lIFRSQU5TQUNUMl9RUEFUSElORk8gICAgIDUKKyNkZWZpbmUgVFJBTlNBQ1QyX1NFVFBBVEhJTkZPICAgNgorI2RlZmluZSBUUkFOU0FDVDJfUUZJTEVJTkZPICAgICA3CisjZGVmaW5lIFRSQU5TQUNUMl9TRVRGSUxFSU5GTyAgIDgKKyNkZWZpbmUgVFJBTlNBQ1QyX0ZTQ1RMICAgICAgICAgOQorI2RlZmluZSBUUkFOU0FDVDJfSU9DVEwgICAgICAgICAgIDEwCisjZGVmaW5lIFRSQU5TQUNUMl9GSU5ETk9USUZZRklSU1QgMTEKKyNkZWZpbmUgVFJBTlNBQ1QyX0ZJTkROT1RJRllORVhUICAxMgorI2RlZmluZSBUUkFOU0FDVDJfTUtESVIgICAgICAgICAgIDEzCisKKy8qIEluZm9ybWF0aW9uIExldmVscyAtICBTaGFyZWQ/ICovCisjZGVmaW5lIFNNQl9JTkZPX1NUQU5EQVJECQkxCisjZGVmaW5lIFNNQl9JTkZPX1FVRVJZX0VBX1NJWkUJCTIKKyNkZWZpbmUgU01CX0lORk9fUVVFUllfRUFTX0ZST01fTElTVAkzCisjZGVmaW5lIFNNQl9JTkZPX1FVRVJZX0FMTF9FQVMJCTQKKyNkZWZpbmUgU01CX0lORk9fSVNfTkFNRV9WQUxJRAkJNgorCisvKiBJbmZvcm1hdGlvbiBMZXZlbHMgLSAgVFJBTlNBQ1QyX0ZJTkRGSVJTVCAqLworI2RlZmluZSBTTUJfRklORF9GSUxFX0RJUkVDVE9SWV9JTkZPCQkweDEwMQorI2RlZmluZSBTTUJfRklORF9GSUxFX0ZVTExfRElSRUNUT1JZX0lORk8JMHgxMDIKKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9OQU1FU19JTkZPCQkweDEwMworI2RlZmluZSBTTUJfRklORF9GSUxFX0JPVEhfRElSRUNUT1JZX0lORk8JMHgxMDQKKworLyogSW5mb3JtYXRpb24gTGV2ZWxzIC0gIFRSQU5TQUNUMl9RUEFUSElORk8gKi8KKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfQkFTSUNfSU5GTwkweDEwMQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9TVEFOREFSRF9JTkZPCTB4MTAyCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0VBX0lORk8JCTB4MTAzCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX05BTUVfSU5GTwkweDEwNAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9BTExfSU5GTwkJMHgxMDcKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfQUxUX05BTUVfSU5GTwkweDEwOAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9TVFJFQU1fSU5GTwkweDEwOQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9DT01QUkVTU0lPTl9JTkZPCTB4MTBiCisKKy8qIEluZm9ybWF0aW9uIExldmVscyAtIFRSQU5TQUNUMl9TRVRGSUxFSU5GTyAqLworI2RlZmluZSBTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTwkJMHgxMDEKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0RJU1BPU0lUSU9OX0lORk8JMHgxMDIKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTwkweDEwMworI2RlZmluZSBTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTwkweDEwNAorCisvKiBzbWJfZmxnIGZpZWxkIGZsYWdzICovCisjZGVmaW5lIFNNQl9GTEFHU19TVVBQT1JUX0xPQ0tSRUFECTB4MDEKKyNkZWZpbmUgU01CX0ZMQUdTX0NMSUVOVF9CVUZfQVZBSUwJMHgwMgorI2RlZmluZSBTTUJfRkxBR1NfUkVTRVJWRUQJCTB4MDQKKyNkZWZpbmUgU01CX0ZMQUdTX0NBU0VMRVNTX1BBVEhOQU1FUwkweDA4CisjZGVmaW5lIFNNQl9GTEFHU19DQU5PTklDQUxfUEFUSE5BTUVTCTB4MTAKKyNkZWZpbmUgU01CX0ZMQUdTX1JFUVVFU1RfT1BMT0NLCTB4MjAKKyNkZWZpbmUgU01CX0ZMQUdTX1JFUVVFU1RfQkFUQ0hfT1BMT0NLCTB4NDAKKyNkZWZpbmUgU01CX0ZMQUdTX1JFUExZCQkJMHg4MAorCisvKiBzbWJfZmxnMiBmaWVsZCBmbGFncyAoc2FtYmEtMi4yLjAvc291cmNlL2luY2x1ZGUvc21iLmgpICovCisjZGVmaW5lIFNNQl9GTEFHUzJfTE9OR19QQVRIX0NPTVBPTkVOVFMJCTB4MDAwMQorI2RlZmluZSBTTUJfRkxBR1MyX0VYVEVOREVEX0FUVFJJQlVURVMJCTB4MDAwMgorI2RlZmluZSBTTUJfRkxBR1MyX0RGU19QQVRITkFNRVMJCTB4MTAwMAorI2RlZmluZSBTTUJfRkxBR1MyX1JFQURfUEVSTUlUX05PX0VYRUNVVEUJMHgyMDAwCisjZGVmaW5lIFNNQl9GTEFHUzJfMzJfQklUX0VSUk9SX0NPREVTCQkweDQwMDAgCisjZGVmaW5lIFNNQl9GTEFHUzJfVU5JQ09ERV9TVFJJTkdTCQkweDgwMDAKKworCisvKgorICogVU5JWCBzdHVmZiAgKGZyb20gc2FtYmEgdHJhbnMyLmgpCisgKi8KKyNkZWZpbmUgTUlOX1VOSVhfSU5GT19MRVZFTAkJMHgyMDAKKyNkZWZpbmUgTUFYX1VOSVhfSU5GT19MRVZFTAkJMHgyRkYKKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9VTklYCQkweDIwMgorI2RlZmluZSBTTUJfUVVFUllfRklMRV9VTklYX0JBU0lDCTB4MjAwCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX1VOSVhfTElOSwkweDIwMQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9VTklYX0hMSU5LCTB4MjAyCisjZGVmaW5lIFNNQl9TRVRfRklMRV9VTklYX0JBU0lDCQkweDIwMAorI2RlZmluZSBTTUJfU0VUX0ZJTEVfVU5JWF9MSU5LCQkweDIwMQorI2RlZmluZSBTTUJfU0VUX0ZJTEVfVU5JWF9ITElOSwkJMHgyMDMKKyNkZWZpbmUgU01CX1FVRVJZX0NJRlNfVU5JWF9JTkZPCTB4MjAwCisKKy8qIHZhbHVlcyB3aGljaCBtZWFucyAiZG9uJ3QgY2hhbmdlIGl0IiAqLworI2RlZmluZSBTTUJfTU9ERV9OT19DSEFOR0UJCTB4RkZGRkZGRkYKKyNkZWZpbmUgU01CX1VJRF9OT19DSEFOR0UJCTB4RkZGRkZGRkYKKyNkZWZpbmUgU01CX0dJRF9OT19DSEFOR0UJCTB4RkZGRkZGRkYKKyNkZWZpbmUgU01CX1RJTUVfTk9fQ0hBTkdFCQkweEZGRkZGRkZGRkZGRkZGRkZVTEwKKyNkZWZpbmUgU01CX1NJWkVfTk9fQ0hBTkdFCQkweEZGRkZGRkZGRkZGRkZGRkZVTEwKKworLyogVU5JWCBmaWxldHlwZSBtYXBwaW5ncy4gKi8KKyNkZWZpbmUgVU5JWF9UWVBFX0ZJTEUJCTAKKyNkZWZpbmUgVU5JWF9UWVBFX0RJUgkJMQorI2RlZmluZSBVTklYX1RZUEVfU1lNTElOSwkyCisjZGVmaW5lIFVOSVhfVFlQRV9DSEFSREVWCTMKKyNkZWZpbmUgVU5JWF9UWVBFX0JMS0RFVgk0CisjZGVmaW5lIFVOSVhfVFlQRV9GSUZPCQk1CisjZGVmaW5lIFVOSVhfVFlQRV9TT0NLRVQJNgorI2RlZmluZSBVTklYX1RZUEVfVU5LTk9XTgkweEZGRkZGRkZGCisKKyNlbmRpZiAvKiBfU01CTk9fSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc25tcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zbm1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmMGMyYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc25tcC5oCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIE1JQnMKKyAqCisgKiBBdXRob3I6IEhpZGVha2kgWU9TSElGVUpJIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9TTk1QX0gKKyNkZWZpbmUgX0xJTlVYX1NOTVBfSAorCisvKiBpcHN0YXRzIG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAxMjEzOiAgTUlCLUlJCisgKiBSRkMgMjAxMSAodXBkYXRlcyAxMjEzKTogIFNOTVB2Mi1NSUItSVAKKyAqIFJGQyAyODYzOiAgSW50ZXJmYWNlcyBHcm91cCBNSUIKKyAqIFJGQyAyNDY1OiAgSVB2NiBNSUI6IEdlbmVyYWwgR3JvdXAKKyAqIGRyYWZ0LWlldGYtaXB2Ni1yZmMyMDExLXVwZGF0ZS0xMC50eHQ6IE1JQiBmb3IgSVA6IElQIFN0YXRpc3RpY3MgVGFibGVzCisgKi8KK2VudW0KK3sKKwlJUFNUQVRTX01JQl9OVU0gPSAwLAorCUlQU1RBVFNfTUlCX0lOUkVDRUlWRVMsCQkJLyogSW5SZWNlaXZlcyAqLworCUlQU1RBVFNfTUlCX0lOSERSRVJST1JTLAkJLyogSW5IZHJFcnJvcnMgKi8KKwlJUFNUQVRTX01JQl9JTlRPT0JJR0VSUk9SUywJCS8qIEluVG9vQmlnRXJyb3JzICovCisJSVBTVEFUU19NSUJfSU5OT1JPVVRFUywJCQkvKiBJbk5vUm91dGVzICovCisJSVBTVEFUU19NSUJfSU5BRERSRVJST1JTLAkJLyogSW5BZGRyRXJyb3JzICovCisJSVBTVEFUU19NSUJfSU5VTktOT1dOUFJPVE9TLAkJLyogSW5Vbmtub3duUHJvdG9zICovCisJSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTLAkJLyogSW5UcnVuY2F0ZWRQa3RzICovCisJSVBTVEFUU19NSUJfSU5ESVNDQVJEUywJCQkvKiBJbkRpc2NhcmRzICovCisJSVBTVEFUU19NSUJfSU5ERUxJVkVSUywJCQkvKiBJbkRlbGl2ZXJzICovCisJSVBTVEFUU19NSUJfT1VURk9SV0RBVEFHUkFNUywJCS8qIE91dEZvcndEYXRhZ3JhbXMgKi8KKwlJUFNUQVRTX01JQl9PVVRSRVFVRVNUUywJCS8qIE91dFJlcXVlc3RzICovCisJSVBTVEFUU19NSUJfT1VURElTQ0FSRFMsCQkvKiBPdXREaXNjYXJkcyAqLworCUlQU1RBVFNfTUlCX09VVE5PUk9VVEVTLAkJLyogT3V0Tm9Sb3V0ZXMgKi8KKwlJUFNUQVRTX01JQl9SRUFTTVRJTUVPVVQsCQkvKiBSZWFzbVRpbWVvdXQgKi8KKwlJUFNUQVRTX01JQl9SRUFTTVJFUURTLAkJCS8qIFJlYXNtUmVxZHMgKi8KKwlJUFNUQVRTX01JQl9SRUFTTU9LUywJCQkvKiBSZWFzbU9LcyAqLworCUlQU1RBVFNfTUlCX1JFQVNNRkFJTFMsCQkJLyogUmVhc21GYWlscyAqLworCUlQU1RBVFNfTUlCX0ZSQUdPS1MsCQkJLyogRnJhZ09LcyAqLworCUlQU1RBVFNfTUlCX0ZSQUdGQUlMUywJCQkvKiBGcmFnRmFpbHMgKi8KKwlJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUywJCS8qIEZyYWdDcmVhdGVzICovCisJSVBTVEFUU19NSUJfSU5NQ0FTVFBLVFMsCQkvKiBJbk1jYXN0UGt0cyAqLworCUlQU1RBVFNfTUlCX09VVE1DQVNUUEtUUywJCS8qIE91dE1jYXN0UGt0cyAqLworCUlQU1RBVFNfTUlCX0lOQkNBU1RQS1RTLAkJLyogSW5CY2FzdFBrdHMgKi8KKwlJUFNUQVRTX01JQl9PVVRCQ0FTVFBLVFMsCQkvKiBPdXRCY2FzdFBrdHMgKi8KKwlfX0lQU1RBVFNfTUlCX01BWAorfTsKKworLyogaWNtcCBtaWIgZGVmaW5pdGlvbnMgKi8KKy8qCisgKiBSRkMgMTIxMzogIE1JQi1JSSBJQ01QIEdyb3VwCisgKiBSRkMgMjAxMSAodXBkYXRlcyAxMjEzKTogIFNOTVB2MiBNSUIgZm9yIElQOiBJQ01QIGdyb3VwCisgKi8KK2VudW0KK3sKKwlJQ01QX01JQl9OVU0gPSAwLAorCUlDTVBfTUlCX0lOTVNHUywJCQkvKiBJbk1zZ3MgKi8KKwlJQ01QX01JQl9JTkVSUk9SUywJCQkvKiBJbkVycm9ycyAqLworCUlDTVBfTUlCX0lOREVTVFVOUkVBQ0hTLAkJLyogSW5EZXN0VW5yZWFjaHMgKi8KKwlJQ01QX01JQl9JTlRJTUVFWENEUywJCQkvKiBJblRpbWVFeGNkcyAqLworCUlDTVBfTUlCX0lOUEFSTVBST0JTLAkJCS8qIEluUGFybVByb2JzICovCisJSUNNUF9NSUJfSU5TUkNRVUVOQ0hTLAkJCS8qIEluU3JjUXVlbmNocyAqLworCUlDTVBfTUlCX0lOUkVESVJFQ1RTLAkJCS8qIEluUmVkaXJlY3RzICovCisJSUNNUF9NSUJfSU5FQ0hPUywJCQkvKiBJbkVjaG9zICovCisJSUNNUF9NSUJfSU5FQ0hPUkVQUywJCQkvKiBJbkVjaG9SZXBzICovCisJSUNNUF9NSUJfSU5USU1FU1RBTVBTLAkJCS8qIEluVGltZXN0YW1wcyAqLworCUlDTVBfTUlCX0lOVElNRVNUQU1QUkVQUywJCS8qIEluVGltZXN0YW1wUmVwcyAqLworCUlDTVBfTUlCX0lOQUREUk1BU0tTLAkJCS8qIEluQWRkck1hc2tzICovCisJSUNNUF9NSUJfSU5BRERSTUFTS1JFUFMsCQkvKiBJbkFkZHJNYXNrUmVwcyAqLworCUlDTVBfTUlCX09VVE1TR1MsCQkJLyogT3V0TXNncyAqLworCUlDTVBfTUlCX09VVEVSUk9SUywJCQkvKiBPdXRFcnJvcnMgKi8KKwlJQ01QX01JQl9PVVRERVNUVU5SRUFDSFMsCQkvKiBPdXREZXN0VW5yZWFjaHMgKi8KKwlJQ01QX01JQl9PVVRUSU1FRVhDRFMsCQkJLyogT3V0VGltZUV4Y2RzICovCisJSUNNUF9NSUJfT1VUUEFSTVBST0JTLAkJCS8qIE91dFBhcm1Qcm9icyAqLworCUlDTVBfTUlCX09VVFNSQ1FVRU5DSFMsCQkJLyogT3V0U3JjUXVlbmNocyAqLworCUlDTVBfTUlCX09VVFJFRElSRUNUUywJCQkvKiBPdXRSZWRpcmVjdHMgKi8KKwlJQ01QX01JQl9PVVRFQ0hPUywJCQkvKiBPdXRFY2hvcyAqLworCUlDTVBfTUlCX09VVEVDSE9SRVBTLAkJCS8qIE91dEVjaG9SZXBzICovCisJSUNNUF9NSUJfT1VUVElNRVNUQU1QUywJCQkvKiBPdXRUaW1lc3RhbXBzICovCisJSUNNUF9NSUJfT1VUVElNRVNUQU1QUkVQUywJCS8qIE91dFRpbWVzdGFtcFJlcHMgKi8KKwlJQ01QX01JQl9PVVRBRERSTUFTS1MsCQkJLyogT3V0QWRkck1hc2tzICovCisJSUNNUF9NSUJfT1VUQUREUk1BU0tSRVBTLAkJLyogT3V0QWRkck1hc2tSZXBzICovCisJX19JQ01QX01JQl9NQVgKK307CisKKyNkZWZpbmUgX19JQ01QTVNHX01JQl9NQVggNTEyCS8qIE91dCtJbiBmb3IgYWxsIDgtYml0IElDTVAgdHlwZXMgKi8KKworLyogaWNtcDYgbWliIGRlZmluaXRpb25zICovCisvKgorICogUkZDIDI0NjY6ICBJQ01QdjYtTUlCCisgKi8KK2VudW0KK3sKKwlJQ01QNl9NSUJfTlVNID0gMCwKKwlJQ01QNl9NSUJfSU5NU0dTLAkJCS8qIEluTXNncyAqLworCUlDTVA2X01JQl9JTkVSUk9SUywJCQkvKiBJbkVycm9ycyAqLworCUlDTVA2X01JQl9PVVRNU0dTLAkJCS8qIE91dE1zZ3MgKi8KKwlfX0lDTVA2X01JQl9NQVgKK307CisKKyNkZWZpbmUgX19JQ01QNk1TR19NSUJfTUFYIDUxMiAvKiBPdXQrSW4gZm9yIGFsbCA4LWJpdCBJQ01QdjYgdHlwZXMgKi8KKworLyogdGNwIG1pYiBkZWZpbml0aW9ucyAqLworLyoKKyAqIFJGQyAxMjEzOiAgTUlCLUlJIFRDUCBncm91cAorICogUkZDIDIwMTIgKHVwZGF0ZXMgMTIxMyk6ICBTTk1QdjItTUlCLVRDUAorICovCitlbnVtCit7CisJVENQX01JQl9OVU0gPSAwLAorCVRDUF9NSUJfUlRPQUxHT1JJVEhNLAkJCS8qIFJ0b0FsZ29yaXRobSAqLworCVRDUF9NSUJfUlRPTUlOLAkJCQkvKiBSdG9NaW4gKi8KKwlUQ1BfTUlCX1JUT01BWCwJCQkJLyogUnRvTWF4ICovCisJVENQX01JQl9NQVhDT05OLAkJCS8qIE1heENvbm4gKi8KKwlUQ1BfTUlCX0FDVElWRU9QRU5TLAkJCS8qIEFjdGl2ZU9wZW5zICovCisJVENQX01JQl9QQVNTSVZFT1BFTlMsCQkJLyogUGFzc2l2ZU9wZW5zICovCisJVENQX01JQl9BVFRFTVBURkFJTFMsCQkJLyogQXR0ZW1wdEZhaWxzICovCisJVENQX01JQl9FU1RBQlJFU0VUUywJCQkvKiBFc3RhYlJlc2V0cyAqLworCVRDUF9NSUJfQ1VSUkVTVEFCLAkJCS8qIEN1cnJFc3RhYiAqLworCVRDUF9NSUJfSU5TRUdTLAkJCQkvKiBJblNlZ3MgKi8KKwlUQ1BfTUlCX09VVFNFR1MsCQkJLyogT3V0U2VncyAqLworCVRDUF9NSUJfUkVUUkFOU1NFR1MsCQkJLyogUmV0cmFuc1NlZ3MgKi8KKwlUQ1BfTUlCX0lORVJSUywJCQkJLyogSW5FcnJzICovCisJVENQX01JQl9PVVRSU1RTLAkJCS8qIE91dFJzdHMgKi8KKwlfX1RDUF9NSUJfTUFYCit9OworCisvKiB1ZHAgbWliIGRlZmluaXRpb25zICovCisvKgorICogUkZDIDEyMTM6ICBNSUItSUkgVURQIGdyb3VwCisgKiBSRkMgMjAxMyAodXBkYXRlcyAxMjEzKTogIFNOTVB2Mi1NSUItVURQCisgKi8KK2VudW0KK3sKKwlVRFBfTUlCX05VTSA9IDAsCisJVURQX01JQl9JTkRBVEFHUkFNUywJCQkvKiBJbkRhdGFncmFtcyAqLworCVVEUF9NSUJfTk9QT1JUUywJCQkvKiBOb1BvcnRzICovCisJVURQX01JQl9JTkVSUk9SUywJCQkvKiBJbkVycm9ycyAqLworCVVEUF9NSUJfT1VUREFUQUdSQU1TLAkJCS8qIE91dERhdGFncmFtcyAqLworCVVEUF9NSUJfUkNWQlVGRVJST1JTLAkJCS8qIFJjdmJ1ZkVycm9ycyAqLworCVVEUF9NSUJfU05EQlVGRVJST1JTLAkJCS8qIFNuZGJ1ZkVycm9ycyAqLworCV9fVURQX01JQl9NQVgKK307CisKKy8qIGxpbnV4IG1pYiBkZWZpbml0aW9ucyAqLworZW51bQoreworCUxJTlVYX01JQl9OVU0gPSAwLAorCUxJTlVYX01JQl9TWU5DT09LSUVTU0VOVCwJCS8qIFN5bmNvb2tpZXNTZW50ICovCisJTElOVVhfTUlCX1NZTkNPT0tJRVNSRUNWLAkJLyogU3luY29va2llc1JlY3YgKi8KKwlMSU5VWF9NSUJfU1lOQ09PS0lFU0ZBSUxFRCwJCS8qIFN5bmNvb2tpZXNGYWlsZWQgKi8KKwlMSU5VWF9NSUJfRU1CUllPTklDUlNUUywJCS8qIEVtYnJ5b25pY1JzdHMgKi8KKwlMSU5VWF9NSUJfUFJVTkVDQUxMRUQsCQkJLyogUHJ1bmVDYWxsZWQgKi8KKwlMSU5VWF9NSUJfUkNWUFJVTkVELAkJCS8qIFJjdlBydW5lZCAqLworCUxJTlVYX01JQl9PRk9QUlVORUQsCQkJLyogT2ZvUHJ1bmVkICovCisJTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMsCQkvKiBPdXRPZldpbmRvd0ljbXBzICovCisJTElOVVhfTUlCX0xPQ0tEUk9QUEVESUNNUFMsCQkvKiBMb2NrRHJvcHBlZEljbXBzICovCisJTElOVVhfTUlCX0FSUEZJTFRFUiwJCQkvKiBBcnBGaWx0ZXIgKi8KKwlMSU5VWF9NSUJfVElNRVdBSVRFRCwJCQkvKiBUaW1lV2FpdGVkICovCisJTElOVVhfTUlCX1RJTUVXQUlUUkVDWUNMRUQsCQkvKiBUaW1lV2FpdFJlY3ljbGVkICovCisJTElOVVhfTUlCX1RJTUVXQUlUS0lMTEVELAkJLyogVGltZVdhaXRLaWxsZWQgKi8KKwlMSU5VWF9NSUJfUEFXU1BBU1NJVkVSRUpFQ1RFRCwJCS8qIFBBV1NQYXNzaXZlUmVqZWN0ZWQgKi8KKwlMSU5VWF9NSUJfUEFXU0FDVElWRVJFSkVDVEVELAkJLyogUEFXU0FjdGl2ZVJlamVjdGVkICovCisJTElOVVhfTUlCX1BBV1NFU1RBQlJFSkVDVEVELAkJLyogUEFXU0VzdGFiUmVqZWN0ZWQgKi8KKwlMSU5VWF9NSUJfREVMQVlFREFDS1MsCQkJLyogRGVsYXllZEFDS3MgKi8KKwlMSU5VWF9NSUJfREVMQVlFREFDS0xPQ0tFRCwJCS8qIERlbGF5ZWRBQ0tMb2NrZWQgKi8KKwlMSU5VWF9NSUJfREVMQVlFREFDS0xPU1QsCQkvKiBEZWxheWVkQUNLTG9zdCAqLworCUxJTlVYX01JQl9MSVNURU5PVkVSRkxPV1MsCQkvKiBMaXN0ZW5PdmVyZmxvd3MgKi8KKwlMSU5VWF9NSUJfTElTVEVORFJPUFMsCQkJLyogTGlzdGVuRHJvcHMgKi8KKwlMSU5VWF9NSUJfVENQUFJFUVVFVUVELAkJCS8qIFRDUFByZXF1ZXVlZCAqLworCUxJTlVYX01JQl9UQ1BESVJFQ1RDT1BZRlJPTUJBQ0tMT0csCS8qIFRDUERpcmVjdENvcHlGcm9tQmFja2xvZyAqLworCUxJTlVYX01JQl9UQ1BESVJFQ1RDT1BZRlJPTVBSRVFVRVVFLAkvKiBUQ1BEaXJlY3RDb3B5RnJvbVByZXF1ZXVlICovCisJTElOVVhfTUlCX1RDUFBSRVFVRVVFRFJPUFBFRCwJCS8qIFRDUFByZXF1ZXVlRHJvcHBlZCAqLworCUxJTlVYX01JQl9UQ1BIUEhJVFMsCQkJLyogVENQSFBIaXRzICovCisJTElOVVhfTUlCX1RDUEhQSElUU1RPVVNFUiwJCS8qIFRDUEhQSGl0c1RvVXNlciAqLworCUxJTlVYX01JQl9UQ1BQVVJFQUNLUywJCQkvKiBUQ1BQdXJlQWNrcyAqLworCUxJTlVYX01JQl9UQ1BIUEFDS1MsCQkJLyogVENQSFBBY2tzICovCisJTElOVVhfTUlCX1RDUFJFTk9SRUNPVkVSWSwJCS8qIFRDUFJlbm9SZWNvdmVyeSAqLworCUxJTlVYX01JQl9UQ1BTQUNLUkVDT1ZFUlksCQkvKiBUQ1BTYWNrUmVjb3ZlcnkgKi8KKwlMSU5VWF9NSUJfVENQU0FDS1JFTkVHSU5HLAkJLyogVENQU0FDS1JlbmVnaW5nICovCisJTElOVVhfTUlCX1RDUEZBQ0tSRU9SREVSLAkJLyogVENQRkFDS1Jlb3JkZXIgKi8KKwlMSU5VWF9NSUJfVENQU0FDS1JFT1JERVIsCQkvKiBUQ1BTQUNLUmVvcmRlciAqLworCUxJTlVYX01JQl9UQ1BSRU5PUkVPUkRFUiwJCS8qIFRDUFJlbm9SZW9yZGVyICovCisJTElOVVhfTUlCX1RDUFRTUkVPUkRFUiwJCQkvKiBUQ1BUU1Jlb3JkZXIgKi8KKwlMSU5VWF9NSUJfVENQRlVMTFVORE8sCQkJLyogVENQRnVsbFVuZG8gKi8KKwlMSU5VWF9NSUJfVENQUEFSVElBTFVORE8sCQkvKiBUQ1BQYXJ0aWFsVW5kbyAqLworCUxJTlVYX01JQl9UQ1BEU0FDS1VORE8sCQkJLyogVENQRFNBQ0tVbmRvICovCisJTElOVVhfTUlCX1RDUExPU1NVTkRPLAkJCS8qIFRDUExvc3NVbmRvICovCisJTElOVVhfTUlCX1RDUExPU1MsCQkJLyogVENQTG9zcyAqLworCUxJTlVYX01JQl9UQ1BMT1NUUkVUUkFOU01JVCwJCS8qIFRDUExvc3RSZXRyYW5zbWl0ICovCisJTElOVVhfTUlCX1RDUFJFTk9GQUlMVVJFUywJCS8qIFRDUFJlbm9GYWlsdXJlcyAqLworCUxJTlVYX01JQl9UQ1BTQUNLRkFJTFVSRVMsCQkvKiBUQ1BTYWNrRmFpbHVyZXMgKi8KKwlMSU5VWF9NSUJfVENQTE9TU0ZBSUxVUkVTLAkJLyogVENQTG9zc0ZhaWx1cmVzICovCisJTElOVVhfTUlCX1RDUEZBU1RSRVRSQU5TLAkJLyogVENQRmFzdFJldHJhbnMgKi8KKwlMSU5VWF9NSUJfVENQRk9SV0FSRFJFVFJBTlMsCQkvKiBUQ1BGb3J3YXJkUmV0cmFucyAqLworCUxJTlVYX01JQl9UQ1BTTE9XU1RBUlRSRVRSQU5TLAkJLyogVENQU2xvd1N0YXJ0UmV0cmFucyAqLworCUxJTlVYX01JQl9UQ1BUSU1FT1VUUywJCQkvKiBUQ1BUaW1lb3V0cyAqLworCUxJTlVYX01JQl9UQ1BSRU5PUkVDT1ZFUllGQUlMLAkJLyogVENQUmVub1JlY292ZXJ5RmFpbCAqLworCUxJTlVYX01JQl9UQ1BTQUNLUkVDT1ZFUllGQUlMLAkJLyogVENQU2Fja1JlY292ZXJ5RmFpbCAqLworCUxJTlVYX01JQl9UQ1BTQ0hFRFVMRVJGQUlMRUQsCQkvKiBUQ1BTY2hlZHVsZXJGYWlsZWQgKi8KKwlMSU5VWF9NSUJfVENQUkNWQ09MTEFQU0VELAkJLyogVENQUmN2Q29sbGFwc2VkICovCisJTElOVVhfTUlCX1RDUERTQUNLT0xEU0VOVCwJCS8qIFRDUERTQUNLT2xkU2VudCAqLworCUxJTlVYX01JQl9UQ1BEU0FDS09GT1NFTlQsCQkvKiBUQ1BEU0FDS09mb1NlbnQgKi8KKwlMSU5VWF9NSUJfVENQRFNBQ0tSRUNWLAkJCS8qIFRDUERTQUNLUmVjdiAqLworCUxJTlVYX01JQl9UQ1BEU0FDS09GT1JFQ1YsCQkvKiBUQ1BEU0FDS09mb1JlY3YgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTlNZTiwJCS8qIFRDUEFib3J0T25TeW4gKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTkRBVEEsCQkvKiBUQ1BBYm9ydE9uRGF0YSAqLworCUxJTlVYX01JQl9UQ1BBQk9SVE9OQ0xPU0UsCQkvKiBUQ1BBYm9ydE9uQ2xvc2UgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTk1FTU9SWSwJCS8qIFRDUEFib3J0T25NZW1vcnkgKi8KKwlMSU5VWF9NSUJfVENQQUJPUlRPTlRJTUVPVVQsCQkvKiBUQ1BBYm9ydE9uVGltZW91dCAqLworCUxJTlVYX01JQl9UQ1BBQk9SVE9OTElOR0VSLAkJLyogVENQQWJvcnRPbkxpbmdlciAqLworCUxJTlVYX01JQl9UQ1BBQk9SVEZBSUxFRCwJCS8qIFRDUEFib3J0RmFpbGVkICovCisJTElOVVhfTUlCX1RDUE1FTU9SWVBSRVNTVVJFUywJCS8qIFRDUE1lbW9yeVByZXNzdXJlcyAqLworCUxJTlVYX01JQl9UQ1BTQUNLRElTQ0FSRCwJCS8qIFRDUFNBQ0tEaXNjYXJkICovCisJTElOVVhfTUlCX1RDUERTQUNLSUdOT1JFRE9MRCwJCS8qIFRDUFNBQ0tJZ25vcmVkT2xkICovCisJTElOVVhfTUlCX1RDUERTQUNLSUdOT1JFRE5PVU5ETywJLyogVENQU0FDS0lnbm9yZWROb1VuZG8gKi8KKwlMSU5VWF9NSUJfVENQU1BVUklPVVNSVE9TLAkJLyogVENQU3B1cmlvdXNSVE9zICovCisJX19MSU5VWF9NSUJfTUFYCit9OworCisjZW5kaWYJLyogX0xJTlVYX1NOTVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyOGU4MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTAsMCArMSwyOTcgQEAKKyNpZm5kZWYgX0xJTlVYX1NPQ0tFVF9ICisjZGVmaW5lIF9MSU5VWF9TT0NLRVRfSAorCisvKgorICogRGVzaXJlZCBkZXNpZ24gb2YgbWF4aW11bSBzaXplIGFuZCBhbGlnbm1lbnQgKHNlZSBSRkMyNTUzKQorICovCisjZGVmaW5lIF9LX1NTX01BWFNJWkUJMTI4CS8qIEltcGxlbWVudGF0aW9uIHNwZWNpZmljIG1heCBzaXplICovCisjZGVmaW5lIF9LX1NTX0FMSUdOU0laRQkoX19hbGlnbm9mX18gKHN0cnVjdCBzb2NrYWRkciAqKSkKKwkJCQkvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkZXNpcmVkIGFsaWdubWVudCAqLworCitzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSB7CisJdW5zaWduZWQgc2hvcnQJc3NfZmFtaWx5OwkJLyogYWRkcmVzcyBmYW1pbHkgKi8KKwkvKiBGb2xsb3dpbmcgZmllbGQocykgYXJlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljICovCisJY2hhcgkJX19kYXRhW19LX1NTX01BWFNJWkUgLSBzaXplb2YodW5zaWduZWQgc2hvcnQpXTsKKwkJCQkvKiBzcGFjZSB0byBhY2hpZXZlIGRlc2lyZWQgc2l6ZSwgKi8KKwkJCQkvKiBfU1NfTUFYU0laRSB2YWx1ZSBtaW51cyBzaXplIG9mIHNzX2ZhbWlseSAqLworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChfS19TU19BTElHTlNJWkUpKSk7CS8qIGZvcmNlIGRlc2lyZWQgYWxpZ25tZW50ICovCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisKKyNpbmNsdWRlIDxhc20vc29ja2V0Lmg+CQkJLyogYXJjaC1kZXBlbmRlbnQgZGVmaW5lcwkqLworI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4JCS8qIHRoZSBTSU9DeHh4IEkvTyBjb250cm9scwkqLworI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgkJCS8qIGlvdmVjIHN1cHBvcnQJCSovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIHBpZF90CQkJKi8KKworZXh0ZXJuIGludCBzeXNjdGxfc29tYXhjb25uOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3Qgc2VxX2ZpbGU7CitleHRlcm4gdm9pZCBzb2NrZXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEpOworI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJc2FfZmFtaWx5X3Q7CisKKy8qCisgKgkxMDAzLjFnIHJlcXVpcmVzIHNhX2ZhbWlseV90IGFuZCB0aGF0IHNhX2RhdGEgaXMgY2hhci4KKyAqLworIAorc3RydWN0IHNvY2thZGRyIHsKKwlzYV9mYW1pbHlfdAlzYV9mYW1pbHk7CS8qIGFkZHJlc3MgZmFtaWx5LCBBRl94eHgJKi8KKwljaGFyCQlzYV9kYXRhWzE0XTsJLyogMTQgYnl0ZXMgb2YgcHJvdG9jb2wgYWRkcmVzcwkqLworfTsKKworc3RydWN0IGxpbmdlciB7CisJaW50CQlsX29ub2ZmOwkvKiBMaW5nZXIgYWN0aXZlCQkqLworCWludAkJbF9saW5nZXI7CS8qIEhvdyBsb25nIHRvIGxpbmdlciBmb3IJKi8KK307CisKKyNkZWZpbmUgc29ja2FkZHJfc3RvcmFnZSBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlCisKKy8qCisgKglBcyB3ZSBkbyA0LjRCU0QgbWVzc2FnZSBwYXNzaW5nIHdlIHVzZSBhIDQuNEJTRCBtZXNzYWdlIHBhc3NpbmcKKyAqCXN5c3RlbSwgbm90IDQuMy4gVGh1cyBtc2dfYWNjcmlnaHRzKGxlbikgYXJlIG5vdyBtaXNzaW5nLiBUaGV5CisgKgliZWxvbmcgaW4gYW4gb2JzY3VyZSBsaWJjIGVtdWxhdGlvbiBvciB0aGUgYmluLgorICovCisgCitzdHJ1Y3QgbXNnaGRyIHsKKwl2b2lkCSoJbXNnX25hbWU7CS8qIFNvY2tldCBuYW1lCQkJKi8KKwlpbnQJCW1zZ19uYW1lbGVuOwkvKiBMZW5ndGggb2YgbmFtZQkJKi8KKwlzdHJ1Y3QgaW92ZWMgKgltc2dfaW92OwkvKiBEYXRhIGJsb2NrcwkJCSovCisJX19rZXJuZWxfc2l6ZV90CW1zZ19pb3ZsZW47CS8qIE51bWJlciBvZiBibG9ja3MJCSovCisJdm9pZCAJKgltc2dfY29udHJvbDsJLyogUGVyIHByb3RvY29sIG1hZ2ljIChlZyBCU0QgZmlsZSBkZXNjcmlwdG9yIHBhc3NpbmcpICovCisJX19rZXJuZWxfc2l6ZV90CW1zZ19jb250cm9sbGVuOwkvKiBMZW5ndGggb2YgY21zZyBsaXN0ICovCisJdW5zaWduZWQJbXNnX2ZsYWdzOworfTsKKworLyoKKyAqCVBPU0lYIDEwMDMuMWcgLSBhbmNpbGxhcnkgZGF0YSBvYmplY3QgaW5mb3JtYXRpb24KKyAqCUFuY2lsbGFyeSBkYXRhIGNvbnNpdHMgb2YgYSBzZXF1ZW5jZSBvZiBwYWlycyBvZgorICoJKGNtc2doZHIsIGNtc2dfZGF0YVtdKQorICovCisKK3N0cnVjdCBjbXNnaGRyIHsKKwlfX2tlcm5lbF9zaXplX3QJY21zZ19sZW47CS8qIGRhdGEgYnl0ZSBjb3VudCwgaW5jbHVkaW5nIGhkciAqLworICAgICAgICBpbnQJCWNtc2dfbGV2ZWw7CS8qIG9yaWdpbmF0aW5nIHByb3RvY29sICovCisgICAgICAgIGludAkJY21zZ190eXBlOwkvKiBwcm90b2NvbC1zcGVjaWZpYyB0eXBlICovCit9OworCisvKgorICoJQW5jaWxsaWFyeSBkYXRhIG9iamVjdCBpbmZvcm1hdGlvbiBNQUNST1MKKyAqCVRhYmxlIDUtMTQgb2YgUE9TSVggMTAwMy4xZworICovCisKKyNkZWZpbmUgX19DTVNHX05YVEhEUihjdGwsIGxlbiwgY21zZykgX19jbXNnX254dGhkcigoY3RsKSwobGVuKSwoY21zZykpCisjZGVmaW5lIENNU0dfTlhUSERSKG1oZHIsIGNtc2cpIGNtc2dfbnh0aGRyKChtaGRyKSwgKGNtc2cpKQorCisjZGVmaW5lIENNU0dfQUxJR04obGVuKSAoICgobGVuKStzaXplb2YobG9uZyktMSkgJiB+KHNpemVvZihsb25nKS0xKSApCisKKyNkZWZpbmUgQ01TR19EQVRBKGNtc2cpCSgodm9pZCAqKSgoY2hhciAqKShjbXNnKSArIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkpKQorI2RlZmluZSBDTVNHX1NQQUNFKGxlbikgKENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkgKyBDTVNHX0FMSUdOKGxlbikpCisjZGVmaW5lIENNU0dfTEVOKGxlbikgKENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSkgKyAobGVuKSkKKworI2RlZmluZSBfX0NNU0dfRklSU1RIRFIoY3RsLGxlbikgKChsZW4pID49IHNpemVvZihzdHJ1Y3QgY21zZ2hkcikgPyBcCisJCQkJICAoc3RydWN0IGNtc2doZHIgKikoY3RsKSA6IFwKKwkJCQkgIChzdHJ1Y3QgY21zZ2hkciAqKU5VTEwpCisjZGVmaW5lIENNU0dfRklSU1RIRFIobXNnKQlfX0NNU0dfRklSU1RIRFIoKG1zZyktPm1zZ19jb250cm9sLCAobXNnKS0+bXNnX2NvbnRyb2xsZW4pCisjZGVmaW5lIENNU0dfT0sobWhkciwgY21zZykgKChjbXNnKS0+Y21zZ19sZW4gPj0gc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSAmJiBcCisJCQkgICAgIChjbXNnKS0+Y21zZ19sZW4gPD0gKHVuc2lnbmVkIGxvbmcpIFwKKwkJCSAgICAgKChtaGRyKS0+bXNnX2NvbnRyb2xsZW4gLSBcCisJCQkgICAgICAoKGNoYXIgKikoY21zZykgLSAoY2hhciAqKShtaGRyKS0+bXNnX2NvbnRyb2wpKSkKKworLyoKKyAqCVRoaXMgbWVzcyB3aWxsIGdvIGF3YXkgd2l0aCBnbGliYworICovCisgCisjaWYgICAgZGVmaW5lZChfX0dOVUNfXykgCisjZGVmaW5lIF9fS0lOTElORSBzdGF0aWMgX19pbmxpbmVfXworI2VsaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgX19LSU5MSU5FIHN0YXRpYyBpbmxpbmUKKyNlbHNlCisjZGVmaW5lIF9fS0lOTElORSBzdGF0aWMKKyNlbmRpZgorCisKKy8qCisgKglHZXQgdGhlIG5leHQgY21zZyBoZWFkZXIKKyAqCisgKglQTEVBU0UsIGRvIG5vdCB0b3VjaCB0aGlzIGZ1bmN0aW9uLiBJZiB5b3UgdGhpbmssIHRoYXQgaXQgaXMKKyAqCWluY29ycmVjdCwgZ3JlcCBrZXJuZWwgc291cmNlcyBhbmQgdGhpbmsgYWJvdXQgY29uc2VxdWVuY2VzCisgKgliZWZvcmUgdHJ5aW5nIHRvIGltcHJvdmUgaXQuCisgKgorICoJTm93IGl0IGFsd2F5cyByZXR1cm5zIHZhbGlkLCBub3QgdHJ1bmNhdGVkIGFuY2lsbGFyeSBvYmplY3QKKyAqCUhFQURFUi4gQnV0IGNhbGxlciBzdGlsbCBNVVNUIGNoZWNrLCB0aGF0IGNtc2ctPmNtc2dfbGVuIGlzCisgKglpbnNpZGUgcmFuZ2UsIGdpdmVuIGJ5IG1zZy0+bXNnX2NvbnRyb2xsZW4gYmVmb3JlIHVzaW5nCisgKglhbmNpbGxhcnkgb2JqZWN0IERBVEEuCQkJCS0tQU5LICg5ODA3MzEpCisgKi8KKyAKK19fS0lOTElORSBzdHJ1Y3QgY21zZ2hkciAqIF9fY21zZ19ueHRoZHIodm9pZCAqX19jdGwsIF9fa2VybmVsX3NpemVfdCBfX3NpemUsCisJCQkJCSAgICAgICBzdHJ1Y3QgY21zZ2hkciAqX19jbXNnKQoreworCXN0cnVjdCBjbXNnaGRyICogX19wdHI7CisKKwlfX3B0ciA9IChzdHJ1Y3QgY21zZ2hkciopKCgodW5zaWduZWQgY2hhciAqKSBfX2Ntc2cpICsgIENNU0dfQUxJR04oX19jbXNnLT5jbXNnX2xlbikpOworCWlmICgodW5zaWduZWQgbG9uZykoKGNoYXIqKShfX3B0cisxKSAtIChjaGFyICopIF9fY3RsKSA+IF9fc2l6ZSkKKwkJcmV0dXJuIChzdHJ1Y3QgY21zZ2hkciAqKTA7CisKKwlyZXR1cm4gX19wdHI7Cit9CisKK19fS0lOTElORSBzdHJ1Y3QgY21zZ2hkciAqIGNtc2dfbnh0aGRyIChzdHJ1Y3QgbXNnaGRyICpfX21zZywgc3RydWN0IGNtc2doZHIgKl9fY21zZykKK3sKKwlyZXR1cm4gX19jbXNnX254dGhkcihfX21zZy0+bXNnX2NvbnRyb2wsIF9fbXNnLT5tc2dfY29udHJvbGxlbiwgX19jbXNnKTsKK30KKworLyogIlNvY2tldCItbGV2ZWwgY29udHJvbCBtZXNzYWdlIHR5cGVzOiAqLworCisjZGVmaW5lCVNDTV9SSUdIVFMJMHgwMQkJLyogcnc6IGFjY2VzcyByaWdodHMgKGFycmF5IG9mIGludCkgKi8KKyNkZWZpbmUgU0NNX0NSRURFTlRJQUxTIDB4MDIJCS8qIHJ3OiBzdHJ1Y3QgdWNyZWQJCSovCisjZGVmaW5lIFNDTV9TRUNVUklUWQkweDAzCQkvKiBydzogc2VjdXJpdHkgbGFiZWwJCSovCisKK3N0cnVjdCB1Y3JlZCB7CisJX191MzIJcGlkOworCV9fdTMyCXVpZDsKKwlfX3UzMglnaWQ7Cit9OworCisvKiBTdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbGllcy4gKi8KKyNkZWZpbmUgQUZfVU5TUEVDCTAKKyNkZWZpbmUgQUZfVU5JWAkJMQkvKiBVbml4IGRvbWFpbiBzb2NrZXRzIAkJKi8KKyNkZWZpbmUgQUZfTE9DQUwJMQkvKiBQT1NJWCBuYW1lIGZvciBBRl9VTklYCSovCisjZGVmaW5lIEFGX0lORVQJCTIJLyogSW50ZXJuZXQgSVAgUHJvdG9jb2wgCSovCisjZGVmaW5lIEFGX0FYMjUJCTMJLyogQW1hdGV1ciBSYWRpbyBBWC4yNSAJCSovCisjZGVmaW5lIEFGX0lQWAkJNAkvKiBOb3ZlbGwgSVBYIAkJCSovCisjZGVmaW5lIEFGX0FQUExFVEFMSwk1CS8qIEFwcGxlVGFsayBERFAgCQkqLworI2RlZmluZSBBRl9ORVRST00JNgkvKiBBbWF0ZXVyIFJhZGlvIE5FVC9ST00gCSovCisjZGVmaW5lIEFGX0JSSURHRQk3CS8qIE11bHRpcHJvdG9jb2wgYnJpZGdlIAkqLworI2RlZmluZSBBRl9BVE1QVkMJOAkvKiBBVE0gUFZDcwkJCSovCisjZGVmaW5lIEFGX1gyNQkJOQkvKiBSZXNlcnZlZCBmb3IgWC4yNSBwcm9qZWN0IAkqLworI2RlZmluZSBBRl9JTkVUNgkxMAkvKiBJUCB2ZXJzaW9uIDYJCQkqLworI2RlZmluZSBBRl9ST1NFCQkxMQkvKiBBbWF0ZXVyIFJhZGlvIFguMjUgUExQCSovCisjZGVmaW5lIEFGX0RFQ25ldAkxMgkvKiBSZXNlcnZlZCBmb3IgREVDbmV0IHByb2plY3QJKi8KKyNkZWZpbmUgQUZfTkVUQkVVSQkxMwkvKiBSZXNlcnZlZCBmb3IgODAyLjJMTEMgcHJvamVjdCovCisjZGVmaW5lIEFGX1NFQ1VSSVRZCTE0CS8qIFNlY3VyaXR5IGNhbGxiYWNrIHBzZXVkbyBBRiAqLworI2RlZmluZSBBRl9LRVkJCTE1ICAgICAgLyogUEZfS0VZIGtleSBtYW5hZ2VtZW50IEFQSSAqLworI2RlZmluZSBBRl9ORVRMSU5LCTE2CisjZGVmaW5lIEFGX1JPVVRFCUFGX05FVExJTksgLyogQWxpYXMgdG8gZW11bGF0ZSA0LjRCU0QgKi8KKyNkZWZpbmUgQUZfUEFDS0VUCTE3CS8qIFBhY2tldCBmYW1pbHkJCSovCisjZGVmaW5lIEFGX0FTSAkJMTgJLyogQXNoCQkJCSovCisjZGVmaW5lIEFGX0VDT05FVAkxOQkvKiBBY29ybiBFY29uZXQJCQkqLworI2RlZmluZSBBRl9BVE1TVkMJMjAJLyogQVRNIFNWQ3MJCQkqLworI2RlZmluZSBBRl9TTkEJCTIyCS8qIExpbnV4IFNOQSBQcm9qZWN0IChudXR0ZXJzISkgKi8KKyNkZWZpbmUgQUZfSVJEQQkJMjMJLyogSVJEQSBzb2NrZXRzCQkJKi8KKyNkZWZpbmUgQUZfUFBQT1gJMjQJLyogUFBQb1ggc29ja2V0cwkJKi8KKyNkZWZpbmUgQUZfV0FOUElQRQkyNQkvKiBXYW5waXBlIEFQSSBTb2NrZXRzICovCisjZGVmaW5lIEFGX0xMQwkJMjYJLyogTGludXggTExDCQkJKi8KKyNkZWZpbmUgQUZfVElQQwkJMzAJLyogVElQQyBzb2NrZXRzCQkJKi8KKyNkZWZpbmUgQUZfQkxVRVRPT1RICTMxCS8qIEJsdWV0b290aCBzb2NrZXRzIAkJKi8KKyNkZWZpbmUgQUZfSVVDVgkJMzIJLyogSVVDViBzb2NrZXRzCQkJKi8KKyNkZWZpbmUgQUZfUlhSUEMJMzMJLyogUnhSUEMgc29ja2V0cyAJCSovCisjZGVmaW5lIEFGX01BWAkJMzQJLyogRm9yIG5vdy4uICovCisKKy8qIFByb3RvY29sIGZhbWlsaWVzLCBzYW1lIGFzIGFkZHJlc3MgZmFtaWxpZXMuICovCisjZGVmaW5lIFBGX1VOU1BFQwlBRl9VTlNQRUMKKyNkZWZpbmUgUEZfVU5JWAkJQUZfVU5JWAorI2RlZmluZSBQRl9MT0NBTAlBRl9MT0NBTAorI2RlZmluZSBQRl9JTkVUCQlBRl9JTkVUCisjZGVmaW5lIFBGX0FYMjUJCUFGX0FYMjUKKyNkZWZpbmUgUEZfSVBYCQlBRl9JUFgKKyNkZWZpbmUgUEZfQVBQTEVUQUxLCUFGX0FQUExFVEFMSworI2RlZmluZQlQRl9ORVRST00JQUZfTkVUUk9NCisjZGVmaW5lIFBGX0JSSURHRQlBRl9CUklER0UKKyNkZWZpbmUgUEZfQVRNUFZDCUFGX0FUTVBWQworI2RlZmluZSBQRl9YMjUJCUFGX1gyNQorI2RlZmluZSBQRl9JTkVUNglBRl9JTkVUNgorI2RlZmluZSBQRl9ST1NFCQlBRl9ST1NFCisjZGVmaW5lIFBGX0RFQ25ldAlBRl9ERUNuZXQKKyNkZWZpbmUgUEZfTkVUQkVVSQlBRl9ORVRCRVVJCisjZGVmaW5lIFBGX1NFQ1VSSVRZCUFGX1NFQ1VSSVRZCisjZGVmaW5lIFBGX0tFWQkJQUZfS0VZCisjZGVmaW5lIFBGX05FVExJTksJQUZfTkVUTElOSworI2RlZmluZSBQRl9ST1VURQlBRl9ST1VURQorI2RlZmluZSBQRl9QQUNLRVQJQUZfUEFDS0VUCisjZGVmaW5lIFBGX0FTSAkJQUZfQVNICisjZGVmaW5lIFBGX0VDT05FVAlBRl9FQ09ORVQKKyNkZWZpbmUgUEZfQVRNU1ZDCUFGX0FUTVNWQworI2RlZmluZSBQRl9TTkEJCUFGX1NOQQorI2RlZmluZSBQRl9JUkRBCQlBRl9JUkRBCisjZGVmaW5lIFBGX1BQUE9YCUFGX1BQUE9YCisjZGVmaW5lIFBGX1dBTlBJUEUJQUZfV0FOUElQRQorI2RlZmluZSBQRl9MTEMJCUFGX0xMQworI2RlZmluZSBQRl9USVBDCQlBRl9USVBDCisjZGVmaW5lIFBGX0JMVUVUT09USAlBRl9CTFVFVE9PVEgKKyNkZWZpbmUgUEZfSVVDVgkJQUZfSVVDVgorI2RlZmluZSBQRl9SWFJQQwlBRl9SWFJQQworI2RlZmluZSBQRl9NQVgJCUFGX01BWAorCisvKiBNYXhpbXVtIHF1ZXVlIGxlbmd0aCBzcGVjaWZpYWJsZSBieSBsaXN0ZW4uICAqLworI2RlZmluZSBTT01BWENPTk4JMTI4CisKKy8qIEZsYWdzIHdlIGNhbiB1c2Ugd2l0aCBzZW5kLyBhbmQgcmVjdi4gCisgICBBZGRlZCB0aG9zZSBmb3IgMTAwMy4xZyBub3QgYWxsIGFyZSBzdXBwb3J0ZWQgeWV0CisgKi8KKyAKKyNkZWZpbmUgTVNHX09PQgkJMQorI2RlZmluZSBNU0dfUEVFSwkyCisjZGVmaW5lIE1TR19ET05UUk9VVEUJNAorI2RlZmluZSBNU0dfVFJZSEFSRCAgICAgNCAgICAgICAvKiBTeW5vbnltIGZvciBNU0dfRE9OVFJPVVRFIGZvciBERUNuZXQgKi8KKyNkZWZpbmUgTVNHX0NUUlVOQwk4CisjZGVmaW5lIE1TR19QUk9CRQkweDEwCS8qIERvIG5vdCBzZW5kLiBPbmx5IHByb2JlIHBhdGggZi5lLiBmb3IgTVRVICovCisjZGVmaW5lIE1TR19UUlVOQwkweDIwCisjZGVmaW5lIE1TR19ET05UV0FJVAkweDQwCS8qIE5vbmJsb2NraW5nIGlvCQkgKi8KKyNkZWZpbmUgTVNHX0VPUiAgICAgICAgIDB4ODAJLyogRW5kIG9mIHJlY29yZCAqLworI2RlZmluZSBNU0dfV0FJVEFMTAkweDEwMAkvKiBXYWl0IGZvciBhIGZ1bGwgcmVxdWVzdCAqLworI2RlZmluZSBNU0dfRklOICAgICAgICAgMHgyMDAKKyNkZWZpbmUgTVNHX1NZTgkJMHg0MDAKKyNkZWZpbmUgTVNHX0NPTkZJUk0JMHg4MDAJLyogQ29uZmlybSBwYXRoIHZhbGlkaXR5ICovCisjZGVmaW5lIE1TR19SU1QJCTB4MTAwMAorI2RlZmluZSBNU0dfRVJSUVVFVUUJMHgyMDAwCS8qIEZldGNoIG1lc3NhZ2UgZnJvbSBlcnJvciBxdWV1ZSAqLworI2RlZmluZSBNU0dfTk9TSUdOQUwJMHg0MDAwCS8qIERvIG5vdCBnZW5lcmF0ZSBTSUdQSVBFICovCisjZGVmaW5lIE1TR19NT1JFCTB4ODAwMAkvKiBTZW5kZXIgd2lsbCBzZW5kIG1vcmUgKi8KKworI2RlZmluZSBNU0dfRU9GICAgICAgICAgTVNHX0ZJTgorCisjZGVmaW5lIE1TR19DTVNHX0NMT0VYRUMgMHg0MDAwMDAwMAkvKiBTZXQgY2xvc2Vfb25fZXhpdCBmb3IgZmlsZQorCQkJCQkgICBkZXNjcmlwdG9yIHJlY2VpdmVkIHRocm91Z2gKKwkJCQkJICAgU0NNX1JJR0hUUyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKKyNkZWZpbmUgTVNHX0NNU0dfQ09NUEFUCTB4ODAwMDAwMDAJLyogVGhpcyBtZXNzYWdlIG5lZWRzIDMyIGJpdCBmaXh1cHMgKi8KKyNlbHNlCisjZGVmaW5lIE1TR19DTVNHX0NPTVBBVAkwCQkvKiBXZSBuZXZlciBoYXZlIDMyIGJpdCBmaXh1cHMgKi8KKyNlbmRpZgorCisKKy8qIFNldHNvY2tvcHRpb25zKDIpIGxldmVsLiBUaGFua3MgdG8gQlNEIHRoZXNlIG11c3QgbWF0Y2ggSVBQUk9UT194eHggKi8KKyNkZWZpbmUgU09MX0lQCQkwCisvKiAjZGVmaW5lIFNPTF9JQ01QCTEJTm8tbm8tbm8hIER1ZSB0byBMaW51eCA6LSkgd2UgY2Fubm90IHVzZSBTT0xfSUNNUD0xICovCisjZGVmaW5lIFNPTF9UQ1AJCTYKKyNkZWZpbmUgU09MX1VEUAkJMTcKKyNkZWZpbmUgU09MX0lQVjYJNDEKKyNkZWZpbmUgU09MX0lDTVBWNgk1OAorI2RlZmluZSBTT0xfU0NUUAkxMzIKKyNkZWZpbmUgU09MX1VEUExJVEUJMTM2ICAgICAvKiBVRFAtTGl0ZSAoUkZDIDM4MjgpICovCisjZGVmaW5lIFNPTF9SQVcJCTI1NQorI2RlZmluZSBTT0xfSVBYCQkyNTYKKyNkZWZpbmUgU09MX0FYMjUJMjU3CisjZGVmaW5lIFNPTF9BVEFMSwkyNTgKKyNkZWZpbmUgU09MX05FVFJPTQkyNTkKKyNkZWZpbmUgU09MX1JPU0UJMjYwCisjZGVmaW5lIFNPTF9ERUNORVQJMjYxCisjZGVmaW5lCVNPTF9YMjUJCTI2MgorI2RlZmluZSBTT0xfUEFDS0VUCTI2MworI2RlZmluZSBTT0xfQVRNCQkyNjQJLyogQVRNIGxheWVyIChjZWxsIGxldmVsKSAqLworI2RlZmluZSBTT0xfQUFMCQkyNjUJLyogQVRNIEFkYXB0aW9uIExheWVyIChwYWNrZXQgbGV2ZWwpICovCisjZGVmaW5lIFNPTF9JUkRBICAgICAgICAyNjYKKyNkZWZpbmUgU09MX05FVEJFVUkJMjY3CisjZGVmaW5lIFNPTF9MTEMJCTI2OAorI2RlZmluZSBTT0xfRENDUAkyNjkKKyNkZWZpbmUgU09MX05FVExJTksJMjcwCisjZGVmaW5lIFNPTF9USVBDCTI3MQorI2RlZmluZSBTT0xfUlhSUEMJMjcyCisjZGVmaW5lIFNPTF9QUFBPTDJUUAkyNzMKKyNkZWZpbmUgU09MX0JMVUVUT09USAkyNzQKKworLyogSVBYIG9wdGlvbnMgKi8KKyNkZWZpbmUgSVBYX1RZUEUJMQorCisjZW5kaWYgLyogbm90IGtlcm5lbCBhbmQgbm90IGdsaWJjICovCisjZW5kaWYgLyogX0xJTlVYX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29ja2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWY3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvY2tpb3MuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlEZWZpbml0aW9ucyBvZiB0aGUgc29ja2V0LWxldmVsIEkvTyBjb250cm9sIGNhbGxzLgorICoKKyAqIFZlcnNpb246CUAoIylzb2NraW9zLmgJMS4wLjIJMDMvMDkvOTMKKyAqCisgKiBBdXRob3JzOglSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTElOVVhfU09DS0lPU19ICisjZGVmaW5lIF9MSU5VWF9TT0NLSU9TX0gKKworI2luY2x1ZGUgPGFzbS9zb2NraW9zLmg+CisKKy8qIExpbnV4LXNwZWNpZmljIHNvY2tldCBpb2N0bHMgKi8KKyNkZWZpbmUgU0lPQ0lOUQkJRklPTlJFQUQKKyNkZWZpbmUgU0lPQ09VVFEJVElPQ09VVFEKKworLyogUm91dGluZyB0YWJsZSBjYWxscy4gKi8KKyNkZWZpbmUgU0lPQ0FERFJUCTB4ODkwQgkJLyogYWRkIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0RFTFJUCTB4ODkwQwkJLyogZGVsZXRlIHJvdXRpbmcgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ1JUTVNHCTB4ODkwRAkJLyogY2FsbCB0byByb3V0aW5nIHN5c3RlbQkqLworCisvKiBTb2NrZXQgY29uZmlndXJhdGlvbiBjb250cm9scy4gKi8KKyNkZWZpbmUgU0lPQ0dJRk5BTUUJMHg4OTEwCQkvKiBnZXQgaWZhY2UgbmFtZQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkxJTksJMHg4OTExCQkvKiBzZXQgaWZhY2UgY2hhbm5lbAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPTkYJMHg4OTEyCQkvKiBnZXQgaWZhY2UgbGlzdAkJKi8KKyNkZWZpbmUgU0lPQ0dJRkZMQUdTCTB4ODkxMwkJLyogZ2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRkZMQUdTCTB4ODkxNAkJLyogc2V0IGZsYWdzCQkJKi8KKyNkZWZpbmUgU0lPQ0dJRkFERFIJMHg4OTE1CQkvKiBnZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ1NJRkFERFIJMHg4OTE2CQkvKiBzZXQgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRkRTVEFERFIJMHg4OTE3CQkvKiBnZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkRTVEFERFIJMHg4OTE4CQkvKiBzZXQgcmVtb3RlIFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRkJSREFERFIJMHg4OTE5CQkvKiBnZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSREFERFIJMHg4OTFhCQkvKiBzZXQgYnJvYWRjYXN0IFBBIGFkZHJlc3MJKi8KKyNkZWZpbmUgU0lPQ0dJRk5FVE1BU0sJMHg4OTFiCQkvKiBnZXQgbmV0d29yayBQQSBtYXNrCQkqLworI2RlZmluZSBTSU9DU0lGTkVUTUFTSwkweDg5MWMJCS8qIHNldCBuZXR3b3JrIFBBIG1hc2sJCSovCisjZGVmaW5lIFNJT0NHSUZNRVRSSUMJMHg4OTFkCQkvKiBnZXQgbWV0cmljCQkJKi8KKyNkZWZpbmUgU0lPQ1NJRk1FVFJJQwkweDg5MWUJCS8qIHNldCBtZXRyaWMJCQkqLworI2RlZmluZSBTSU9DR0lGTUVNCTB4ODkxZgkJLyogZ2V0IG1lbW9yeSBhZGRyZXNzIChCU0QpCSovCisjZGVmaW5lIFNJT0NTSUZNRU0JMHg4OTIwCQkvKiBzZXQgbWVtb3J5IGFkZHJlc3MgKEJTRCkJKi8KKyNkZWZpbmUgU0lPQ0dJRk1UVQkweDg5MjEJCS8qIGdldCBNVFUgc2l6ZQkJCSovCisjZGVmaW5lIFNJT0NTSUZNVFUJMHg4OTIyCQkvKiBzZXQgTVRVIHNpemUJCQkqLworI2RlZmluZSBTSU9DU0lGTkFNRQkweDg5MjMJCS8qIHNldCBpbnRlcmZhY2UgbmFtZSAqLworI2RlZmluZQlTSU9DU0lGSFdBRERSCTB4ODkyNAkJLyogc2V0IGhhcmR3YXJlIGFkZHJlc3MgCSovCisjZGVmaW5lIFNJT0NHSUZFTkNBUAkweDg5MjUJCS8qIGdldC9zZXQgZW5jYXBzdWxhdGlvbnMgICAgICAgKi8KKyNkZWZpbmUgU0lPQ1NJRkVOQ0FQCTB4ODkyNgkJCisjZGVmaW5lIFNJT0NHSUZIV0FERFIJMHg4OTI3CQkvKiBHZXQgaGFyZHdhcmUgYWRkcmVzcwkJKi8KKyNkZWZpbmUgU0lPQ0dJRlNMQVZFCTB4ODkyOQkJLyogRHJpdmVyIHNsYXZpbmcgc3VwcG9ydAkqLworI2RlZmluZSBTSU9DU0lGU0xBVkUJMHg4OTMwCisjZGVmaW5lIFNJT0NBRERNVUxUSQkweDg5MzEJCS8qIE11bHRpY2FzdCBhZGRyZXNzIGxpc3RzCSovCisjZGVmaW5lIFNJT0NERUxNVUxUSQkweDg5MzIKKyNkZWZpbmUgU0lPQ0dJRklOREVYCTB4ODkzMwkJLyogbmFtZSAtPiBpZl9pbmRleCBtYXBwaW5nCSovCisjZGVmaW5lIFNJT0dJRklOREVYCVNJT0NHSUZJTkRFWAkvKiBtaXNwcmludCBjb21wYXRpYmlsaXR5IDotKQkqLworI2RlZmluZSBTSU9DU0lGUEZMQUdTCTB4ODkzNAkJLyogc2V0L2dldCBleHRlbmRlZCBmbGFncyBzZXQJKi8KKyNkZWZpbmUgU0lPQ0dJRlBGTEFHUwkweDg5MzUKKyNkZWZpbmUgU0lPQ0RJRkFERFIJMHg4OTM2CQkvKiBkZWxldGUgUEEgYWRkcmVzcwkJKi8KKyNkZWZpbmUJU0lPQ1NJRkhXQlJPQURDQVNUCTB4ODkzNwkvKiBzZXQgaGFyZHdhcmUgYnJvYWRjYXN0IGFkZHIJKi8KKyNkZWZpbmUgU0lPQ0dJRkNPVU5UCTB4ODkzOAkJLyogZ2V0IG51bWJlciBvZiBkZXZpY2VzICovCisKKyNkZWZpbmUgU0lPQ0dJRkJSCTB4ODk0MAkJLyogQnJpZGdpbmcgc3VwcG9ydAkJKi8KKyNkZWZpbmUgU0lPQ1NJRkJSCTB4ODk0MQkJLyogU2V0IGJyaWRnaW5nIG9wdGlvbnMgCSovCisKKyNkZWZpbmUgU0lPQ0dJRlRYUUxFTgkweDg5NDIJCS8qIEdldCB0aGUgdHggcXVldWUgbGVuZ3RoCSovCisjZGVmaW5lIFNJT0NTSUZUWFFMRU4JMHg4OTQzCQkvKiBTZXQgdGhlIHR4IHF1ZXVlIGxlbmd0aCAJKi8KKworLyogU0lPQ0dJRkRJVkVSVCB3YXM6CTB4ODk0NAkJRnJhbWUgZGl2ZXJzaW9uIHN1cHBvcnQgKi8KKy8qIFNJT0NTSUZESVZFUlQgd2FzOgkweDg5NDUJCVNldCBmcmFtZSBkaXZlcnNpb24gb3B0aW9ucyAqLworCisjZGVmaW5lIFNJT0NFVEhUT09MCTB4ODk0NgkJLyogRXRodG9vbCBpbnRlcmZhY2UJCSovCisKKyNkZWZpbmUgU0lPQ0dNSUlQSFkJMHg4OTQ3CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKyNkZWZpbmUgU0lPQ0dNSUlSRUcJMHg4OTQ4CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuCSovCisjZGVmaW5lIFNJT0NTTUlJUkVHCTB4ODk0OQkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4JKi8KKworI2RlZmluZSBTSU9DV0FOREVWCTB4ODk0QQkJLyogZ2V0L3NldCBuZXRkZXYgcGFyYW1ldGVycwkqLworCisvKiBBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKwkJICAgIC8qICAweDg5NTAgLSAweDg5NTIgICogb2Jzb2xldGUgY2FsbHMsIGRvbid0IHJlLXVzZSAqLworI2RlZmluZSBTSU9DREFSUAkweDg5NTMJCS8qIGRlbGV0ZSBBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dBUlAJMHg4OTU0CQkvKiBnZXQgQVJQIHRhYmxlIGVudHJ5CQkqLworI2RlZmluZSBTSU9DU0FSUAkweDg5NTUJCS8qIHNldCBBUlAgdGFibGUgZW50cnkJCSovCisKKy8qIFJBUlAgY2FjaGUgY29udHJvbCBjYWxscy4gKi8KKyNkZWZpbmUgU0lPQ0RSQVJQCTB4ODk2MAkJLyogZGVsZXRlIFJBUlAgdGFibGUgZW50cnkJKi8KKyNkZWZpbmUgU0lPQ0dSQVJQCTB4ODk2MQkJLyogZ2V0IFJBUlAgdGFibGUgZW50cnkJCSovCisjZGVmaW5lIFNJT0NTUkFSUAkweDg5NjIJCS8qIHNldCBSQVJQIHRhYmxlIGVudHJ5CQkqLworCisvKiBEcml2ZXIgY29uZmlndXJhdGlvbiBjYWxscyAqLworCisjZGVmaW5lIFNJT0NHSUZNQVAJMHg4OTcwCQkvKiBHZXQgZGV2aWNlIHBhcmFtZXRlcnMJKi8KKyNkZWZpbmUgU0lPQ1NJRk1BUAkweDg5NzEJCS8qIFNldCBkZXZpY2UgcGFyYW1ldGVycwkqLworCisvKiBETENJIGNvbmZpZ3VyYXRpb24gY2FsbHMgKi8KKworI2RlZmluZSBTSU9DQURERExDSQkweDg5ODAJCS8qIENyZWF0ZSBuZXcgRExDSSBkZXZpY2UJKi8KKyNkZWZpbmUgU0lPQ0RFTERMQ0kJMHg4OTgxCQkvKiBEZWxldGUgRExDSSBkZXZpY2UJCSovCisKKyNkZWZpbmUgU0lPQ0dJRlZMQU4JMHg4OTgyCQkvKiA4MDIuMVEgVkxBTiBzdXBwb3J0CQkqLworI2RlZmluZSBTSU9DU0lGVkxBTgkweDg5ODMJCS8qIFNldCA4MDIuMVEgVkxBTiBvcHRpb25zIAkqLworCisvKiBib25kaW5nIGNhbGxzICovCisKKyNkZWZpbmUgU0lPQ0JPTkRFTlNMQVZFCTB4ODk5MAkJLyogZW5zbGF2ZSBhIGRldmljZSB0byB0aGUgYm9uZCAqLworI2RlZmluZSBTSU9DQk9ORFJFTEVBU0UgMHg4OTkxCQkvKiByZWxlYXNlIGEgc2xhdmUgZnJvbSB0aGUgYm9uZCovCisjZGVmaW5lIFNJT0NCT05EU0VUSFdBRERSICAgICAgMHg4OTkyCS8qIHNldCB0aGUgaHcgYWRkciBvZiB0aGUgYm9uZCAgKi8KKyNkZWZpbmUgU0lPQ0JPTkRTTEFWRUlORk9RVUVSWSAweDg5OTMgICAvKiBydG4gaW5mbyBhYm91dCBzbGF2ZSBzdGF0ZSAgICovCisjZGVmaW5lIFNJT0NCT05ESU5GT1FVRVJZICAgICAgMHg4OTk0CS8qIHJ0biBpbmZvIGFib3V0IGJvbmQgc3RhdGUgICAgKi8KKyNkZWZpbmUgU0lPQ0JPTkRDSEFOR0VBQ1RJVkUgICAweDg5OTUgICAvKiB1cGRhdGUgdG8gYSBuZXcgYWN0aXZlIHNsYXZlICovCisJCQkKKy8qIGJyaWRnZSBjYWxscyAqLworI2RlZmluZSBTSU9DQlJBRERCUiAgICAgMHg4OWEwCQkvKiBjcmVhdGUgbmV3IGJyaWRnZSBkZXZpY2UgICAgICovCisjZGVmaW5lIFNJT0NCUkRFTEJSICAgICAweDg5YTEJCS8qIHJlbW92ZSBicmlkZ2UgZGV2aWNlICAgICAgICAgKi8KKyNkZWZpbmUgU0lPQ0JSQURESUYJMHg4OWEyCQkvKiBhZGQgaW50ZXJmYWNlIHRvIGJyaWRnZSAgICAgICovCisjZGVmaW5lIFNJT0NCUkRFTElGCTB4ODlhMwkJLyogcmVtb3ZlIGludGVyZmFjZSBmcm9tIGJyaWRnZSAqLworCisvKiBEZXZpY2UgcHJpdmF0ZSBpb2N0bCBjYWxscyAqLworCisvKgorICoJVGhlc2UgMTYgaW9jdGxzIGFyZSBhdmFpbGFibGUgdG8gZGV2aWNlcyB2aWEgdGhlIGRvX2lvY3RsKCkgZGV2aWNlCisgKgl2ZWN0b3IuIEVhY2ggZGV2aWNlIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgcmVkZWZpbmUgdGhlc2UgbmFtZXMKKyAqCWFzIHRoZWlyIG93bi4gQmVjYXVzZSB0aGVzZSBhcmUgZGV2aWNlIGRlcGVuZGVudCBpdCBpcyBhIGdvb2QgaWRlYQorICoJX05PVF8gdG8gaXNzdWUgdGhlbSB0byByYW5kb20gb2JqZWN0cyBhbmQgaG9wZS4KKyAqCisgKglUSEVTRSBJT0NUTFMgQVJFIF9ERVBSRUNBVEVEXyBBTkQgV0lMTCBESVNBUFBFQVIgSU4gMi41LlggLURhdmVNCisgKi8KKyAKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUJMHg4OUYwCS8qIHRvIDg5RkYgKi8KKworLyoKKyAqCVRoZXNlIDE2IGlvY3RsIGNhbGxzIGFyZSBwcm90b2NvbCBwcml2YXRlCisgKi8KKyAKKyNkZWZpbmUgU0lPQ1BST1RPUFJJVkFURSAweDg5RTAgLyogdG8gODlFRiAqLworI2VuZGlmCS8qIF9MSU5VWF9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29tLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjU5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbS5oCkBAIC0wLDAgKzEsMTU0IEBACisjaWZuZGVmIF9MSU5VWF9TT01fSAorI2RlZmluZSBfTElOVVhfU09NX0gKKworLyogRmlsZSBmb3JtYXQgZGVmaW5pdGlvbiBmb3IgU09NIGV4ZWN1dGFibGVzIC8gc2hhcmVkIGxpYnJhcmllcyAqLworCisvKiB3ZSBuZWVkIHN0cnVjdCB0aW1lc3BlYyAqLworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2RlZmluZSBTT01fUEFHRVNJWkUgNDA5NgorCisvKiB0aGlzIGlzIHRoZSBTT00gaGVhZGVyICovCitzdHJ1Y3Qgc29tX2hkciB7CisJc2hvcnQJCXN5c3RlbV9pZDsJCS8qIG1hZ2ljIG51bWJlciAtIHN5c3RlbSAqLworCXNob3J0CQlhX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyIC0gZmlsZSB0eXBlICovCisJdW5zaWduZWQgaW50CXZlcnNpb25faWQ7CQkvKiB2ZXJzaW9kIElEOiBZWU1NRERISCAqLworCXN0cnVjdCB0aW1lc3BlYwlmaWxlX3RpbWU7CQkvKiBzeXN0ZW0gY2xvY2sgKi8KKwl1bnNpZ25lZCBpbnQJZW50cnlfc3BhY2U7CQkvKiBzcGFjZSBmb3IgZW50cnkgcG9pbnQgKi8KKwl1bnNpZ25lZCBpbnQJZW50cnlfc3Vic3BhY2U7CQkvKiBzdWJzcGFjZSBmb3IgZW50cnkgcG9pbnQgKi8KKwl1bnNpZ25lZCBpbnQJZW50cnlfb2Zmc2V0OwkJLyogb2Zmc2V0IG9mIGVudHJ5IHBvaW50ICovCisJdW5zaWduZWQgaW50CWF1eF9oZWFkZXJfbG9jYXRpb247CS8qIGF1eGlsaWFyeSBoZWFkZXIgbG9jYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJYXV4X2hlYWRlcl9zaXplOwkvKiBhdXhpbGlhcnkgaGVhZGVyIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQJc29tX2xlbmd0aDsJCS8qIGxlbmd0aCBvZiBlbnRpcmUgU09NICovCisJdW5zaWduZWQgaW50CXByZXN1bWVkX2RwOwkJLyogY29tcGlsZXIncyBEUCB2YWx1ZSAqLworCXVuc2lnbmVkIGludAlzcGFjZV9sb2NhdGlvbjsJCS8qIHNwYWNlIGRpY3Rpb25hcnkgbG9jYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJc3BhY2VfdG90YWw7CQkvKiBudW1iZXIgb2Ygc3BhY2UgZW50cmllcyAqLworCXVuc2lnbmVkIGludAlzdWJzcGFjZV9sb2NhdGlvbjsJLyogc3Vic3BhY2UgZW50cmllcyBsb2NhdGlvbiAqLworCXVuc2lnbmVkIGludAlzdWJzcGFjZV90b3RhbDsJCS8qIG51bWJlciBvZiBzdWJzcGFjZSBlbnRyaWVzICovCisJdW5zaWduZWQgaW50CWxvYWRlcl9maXh1cF9sb2NhdGlvbjsJLyogTVBFL2lYIGxvYWRlciBmaXh1cCAqLworCXVuc2lnbmVkIGludAlsb2FkZXJfZml4dXBfdG90YWw7CS8qIG51bWJlciBvZiBmaXh1cCByZWNvcmRzICovCisJdW5zaWduZWQgaW50CXNwYWNlX3N0cmluZ3NfbG9jYXRpb247CS8qIChzdWIpc3BhY2UgbmFtZXMgKi8KKwl1bnNpZ25lZCBpbnQJc3BhY2Vfc3RyaW5nc19zaXplOwkvKiBzaXplIG9mIHN0cmluZ3MgYXJlYSAqLworCXVuc2lnbmVkIGludAlpbml0X2FycmF5X2xvY2F0aW9uOwkvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIGludAlpbml0X2FycmF5X3RvdGFsOwkvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIGludAljb21waWxlcl9sb2NhdGlvbjsJLyogbW9kdWxlIGRpY3Rpb25hcnkgKi8KKwl1bnNpZ25lZCBpbnQJY29tcGlsZXJfdG90YWw7CQkvKiBudW1iZXIgb2YgbW9kdWxlcyAqLworCXVuc2lnbmVkIGludAlzeW1ib2xfbG9jYXRpb247CS8qIHN5bWJvbCBkaWN0aW9uYXJ5ICovCisJdW5zaWduZWQgaW50CXN5bWJvbF90b3RhbDsJCS8qIG51bWJlciBvZiBzeW1ib2xzICovCisJdW5zaWduZWQgaW50CWZpeHVwX3JlcXVlc3RfbG9jYXRpb247CS8qIGZpeHVwIHJlcXVlc3RzICovCisJdW5zaWduZWQgaW50CWZpeHVwX3JlcXVlc3RfdG90YWw7CS8qIG51bWJlciBvZiBmaXh1cCByZXF1ZXN0cyAqLworCXVuc2lnbmVkIGludAlzeW1ib2xfc3RyaW5nc19sb2NhdGlvbjsvKiBtb2R1bGUgJiBzeW1ib2wgbmFtZXMgYXJlYSAqLworCXVuc2lnbmVkIGludAlzeW1ib2xfc3RyaW5nc19zaXplOwkvKiBzaXplIG9mIHN0cmluZ3MgYXJlYSAqLworCXVuc2lnbmVkIGludAl1bmxvYWRhYmxlX3NwX2xvY2F0aW9uOwkvKiB1bmxvYWRhYmxlIHNwYWNlcyBsb2NhdGlvbiAqLworCXVuc2lnbmVkIGludAl1bmxvYWRhYmxlX3NwX3NpemU7CS8qIHNpemUgb2YgZGF0YSAqLworCXVuc2lnbmVkIGludAljaGVja3N1bTsKK307CisKKy8qIHZhbHVlcyBmb3Igc3lzdGVtX2lkICovCisKKyNkZWZpbmUgU09NX1NJRF9QQVJJU0NfMV8wCTB4MDIwYgorI2RlZmluZSBTT01fU0lEX1BBUklTQ18xXzEJMHgwMjEwCisjZGVmaW5lIFNPTV9TSURfUEFSSVNDXzJfMAkweDAyMTQKKworLyogdmFsdWVzIGZvciBhX21hZ2ljICovCisKKyNkZWZpbmUgU09NX0xJQl9FWEVDCQkweDAxMDQKKyNkZWZpbmUgU09NX1JFTE9DQVRBQkxFCQkweDAxMDYKKyNkZWZpbmUgU09NX0VYRUNfTk9OU0hBUkUJMHgwMTA3CisjZGVmaW5lIFNPTV9FWEVDX1NIQVJFCQkweDAxMDgKKyNkZWZpbmUgU09NX0VYRUNfREVNQU5ECQkweDAxMEIKKyNkZWZpbmUgU09NX0xJQl9EWU4JCTB4MDEwRAorI2RlZmluZSBTT01fTElCX1NIQVJFCQkweDAxMEUKKyNkZWZpbmUgU09NX0xJQl9SRUxPQwkJMHgwNjE5CisKKy8qIHZhbHVlcyBmb3IgdmVyc2lvbl9pZC4gIERlY2ltYWwgbm90IGhleCwgeWVzLiAgR3JyLiAqLworCisjZGVmaW5lIFNPTV9JRF9PTEQJCTg1MDgyMTEyCisjZGVmaW5lIFNPTV9JRF9ORVcJCTg3MTAyNDEyCisKK3N0cnVjdCBhdXhfaWQgeworCXVuc2lnbmVkIGludAltYW5kYXRvcnkgOjE7CS8qIHRoZSBsaW5rZXIgbXVzdCB1bmRlcnN0YW5kIHRoaXMgKi8KKwl1bnNpZ25lZCBpbnQJY29weQkgIDoxOwkvKiBNdXN0IGJlIGNvcGllZCBieSB0aGUgbGlua2VyICovCisJdW5zaWduZWQgaW50CWFwcGVuZAkgIDoxOwkvKiBNdXN0IGJlIG1lcmdlZCBieSB0aGUgbGlua2VyICovCisJdW5zaWduZWQgaW50CWlnbm9yZQkgIDoxOwkvKiBEaXNjYXJkIHNlY3Rpb24gaWYgdW5rbm93biAqLworCXVuc2lnbmVkIGludAlyZXNlcnZlZCAgOjEyOworCXVuc2lnbmVkIGludAl0eXBlCSAgOjE2OwkvKiBIZWFkZXIgdHlwZSAqLworCXVuc2lnbmVkIGludAlsZW5ndGg7CQkvKiBsZW5ndGggb2YgX2ZvbGxvd2luZ18gZGF0YSAqLworfTsKKworLyogVGhlIEV4ZWMgQXV4aWxpYXJ5IEhlYWRlci4gIENhbGxlZCBUaGUgSFAtVVggSGVhZGVyIHdpdGhpbiBIUCBhcHBhcmVudGx5LiAqLworc3RydWN0IHNvbV9leGVjX2F1eGhkciB7CisJc3RydWN0IGF1eF9pZAlzb21fYXV4aGRyOworCWludAkJZXhlY190c2l6ZTsJLyogVGV4dCBzaXplIGluIGJ5dGVzICovCisJaW50CQlleGVjX3RtZW07CS8qIEFkZHJlc3MgdG8gbG9hZCB0ZXh0IGF0ICovCisJaW50CQlleGVjX3RmaWxlOwkvKiBMb2NhdGlvbiBvZiB0ZXh0IGluIGZpbGUgKi8KKwlpbnQJCWV4ZWNfZHNpemU7CS8qIERhdGEgc2l6ZSBpbiBieXRlcyAqLworCWludAkJZXhlY19kbWVtOwkvKiBBZGRyZXNzIHRvIGxvYWQgZGF0YSBhdCAqLworCWludAkJZXhlY19kZmlsZTsJLyogTG9jYXRpb24gb2YgZGF0YSBpbiBmaWxlICovCisJaW50CQlleGVjX2JzaXplOwkvKiBVbmluaXRpYWxpc2VkIGRhdGEgKGJzcykgKi8KKwlpbnQJCWV4ZWNfZW50cnk7CS8qIEFkZHJlc3MgdG8gc3RhcnQgZXhlY3V0aW5nICovCisJaW50CQlleGVjX2ZsYWdzOwkvKiBsb2FkZXIgZmxhZ3MgKi8KKwlpbnQJCWV4ZWNfYmZpbGw7CS8qIGluaXRpYWxpc2F0aW9uIHZhbHVlIGZvciBic3MgKi8KK307CisKKy8qIE9oLCB0aGUgdGhpbmdzIHBlb3BsZSBkbyB0byBhdm9pZCBjYXN0cy4gIFNoYW1lIGl0J2xsIGJyZWFrIHdpdGggZ2NjJ3MKKyAqIG5ldyBhbGlhc2luZyBydWxlcyByZWFsbHkuCisgKi8KK3VuaW9uIG5hbWVfcHQgeworCWNoYXIgKgkJbl9uYW1lOworCXVuc2lnbmVkIGludAluX3N0cng7Cit9OworCisvKiBUaGUgU3BhY2UgRGljdGlvbmFyeSAqLworc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkIHsKKwl1bmlvbiBuYW1lX3B0CW5hbWU7CQkJLyogaW5kZXggdG8gc3Vic3BhY2UgbmFtZSAqLworCXVuc2lnbmVkIGludAlpc19sb2FkYWJsZQk6MTsJLyogbG9hZGFibGUgKi8KKwl1bnNpZ25lZCBpbnQJaXNfZGVmaW5lZAk6MTsJLyogZGVmaW5lZCB3aXRoaW4gZmlsZSAqLworCXVuc2lnbmVkIGludAlpc19wcml2YXRlCToxOwkvKiBub3Qgc2hhcmFibGUgKi8KKwl1bnNpZ25lZCBpbnQJaGFzX2ludGVybWVkaWF0ZV9jb2RlIDoxOyAvKiBjb250YWlucyBpbnRlcm1lZGlhdGUgY29kZSAqLworCXVuc2lnbmVkIGludAlpc190c3BlY2lmaWMJOjE7CS8qIHRocmVhZCBzcGVjaWZpYyAqLworCXVuc2lnbmVkIGludAlyZXNlcnZlZAk6MTE7CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisJdW5zaWduZWQgaW50CXNvcnRfa2V5CTo4OwkvKiBmb3IgbGlua2VyICovCisJdW5zaWduZWQgaW50CXJlc2VydmVkMgk6ODsJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKworCWludAkJc3BhY2VfbnVtYmVyOwkJLyogaW5kZXggKi8KKwlpbnQJCXN1YnNwYWNlX2luZGV4OwkJLyogaW5kZXggaW50byBzdWJzcGFjZSBkaWN0ICovCisJdW5zaWduZWQgaW50CXN1YnNwYWNlX3F1YW50aXR5OwkvKiBudW1iZXIgb2Ygc3Vic3BhY2VzICovCisJaW50CQlsb2FkZXJfZml4X2luZGV4OwkvKiBmb3IgbG9hZGVyICovCisJdW5zaWduZWQgaW50CWxvYWRlcl9maXhfcXVhbnRpdHk7CS8qIGZvciBsb2FkZXIgKi8KKwlpbnQJCWluaXRfcG9pbnRlcl9pbmRleDsJLyogZGF0YSBwb2ludGVyIGFycmF5IGluZGV4ICovCisJdW5zaWduZWQgaW50CWluaXRfcG9pbnRlcl9xdWFudGl0eTsJLyogbnVtYmVyIG9mIGRhdGEgcG9pbnRlcnMgKi8KK307CisKKy8qIFRoZSBTdWJzcGFjZSBEaWN0aW9uYXJ5ICovCitzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgeworCWludAkJc3BhY2VfaW5kZXg7CisJdW5zaWduZWQgaW50CWFjY2Vzc19jb250cm9sX2JpdHMgOjc7CisJdW5zaWduZWQgaW50CW1lbW9yeV9yZXNpZGVudAk6MTsKKwl1bnNpZ25lZCBpbnQJZHVwX2NvbW1vbgk6MTsKKwl1bnNpZ25lZCBpbnQJaXNfY29tbW9uCToxOworCXVuc2lnbmVkIGludAlxdWFkcmFudAk6MjsKKwl1bnNpZ25lZCBpbnQJaW5pdGlhbGx5X2Zyb3plbiA6MTsKKwl1bnNpZ25lZCBpbnQJaXNfZmlyc3QJOjE7CisJdW5zaWduZWQgaW50CWNvZGVfb25seQk6MTsKKwl1bnNpZ25lZCBpbnQJc29ydF9rZXkJOjg7CisJdW5zaWduZWQgaW50CXJlcGxpY2F0ZV9pbml0CToxOworCXVuc2lnbmVkIGludAljb250aW51YXRpb24JOjE7CisJdW5zaWduZWQgaW50CWlzX3RzcGVjaWZpYwk6MTsKKwl1bnNpZ25lZCBpbnQJaXNfY29tZGF0CToxOworCXVuc2lnbmVkIGludAlyZXNlcnZlZAk6NDsKKworCWludAkJZmlsZV9sb2NfaW5pdF92YWx1ZTsKKwl1bnNpZ25lZCBpbnQJaW5pdGlhbGl6YXRpb25fbGVuZ3RoOworCXVuc2lnbmVkIGludAlzdWJzcGFjZV9zdGFydDsKKwl1bnNpZ25lZCBpbnQJc3Vic3BhY2VfbGVuZ3RoOworCisJdW5zaWduZWQgaW50CXJlc2VydmVkMgk6NTsKKwl1bnNpZ25lZCBpbnQJYWxpZ25tZW50CToyNzsKKworCXVuaW9uIG5hbWVfcHQJbmFtZTsKKwlpbnQJCWZpeHVwX3JlcXVlc3RfaW5kZXg7CisJdW5zaWduZWQgaW50CWZpeHVwX3JlcXVlc3RfcXVhbnRpdHk7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1NPTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbmV0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4YTZhZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc29uZXQuaApAQCAtMCwwICsxLDYwIEBACisvKiBzb25ldC5oIC0gU09ORVQvU0hEIHBoeXNpY2FsIGxheWVyIGNvbnRyb2wgKi8KKyAKKy8qIFdyaXR0ZW4gMTk5NS0yMDAwIGJ5IFdlcm5lciBBbG1lc2JlcmdlciwgRVBGTCBMUkMvSUNBICovCisgCisKKyNpZm5kZWYgTElOVVhfU09ORVRfSAorI2RlZmluZSBMSU5VWF9TT05FVF9ICisKKyNkZWZpbmUgX19TT05FVF9JVEVNUyBcCisgICAgX19IQU5ETEVfSVRFTShzZWN0aW9uX2JpcCk7IAkvKiBzZWN0aW9uIHBhcml0eSBlcnJvcnMgKEIxKSAqLyBcCisgICAgX19IQU5ETEVfSVRFTShsaW5lX2JpcCk7CQkvKiBsaW5lIHBhcml0eSBlcnJvcnMgKEIyKSAqLyBcCisgICAgX19IQU5ETEVfSVRFTShwYXRoX2JpcCk7CQkvKiBwYXRoIHBhcml0eSBlcnJvcnMgKEIzKSAqLyBcCisgICAgX19IQU5ETEVfSVRFTShsaW5lX2ZlYmUpOwkJLyogbGluZSBwYXJpdHkgZXJyb3JzIGF0IHJlbW90ZSAqLyBcCisgICAgX19IQU5ETEVfSVRFTShwYXRoX2ZlYmUpOwkJLyogcGF0aCBwYXJpdHkgZXJyb3JzIGF0IHJlbW90ZSAqLyBcCisgICAgX19IQU5ETEVfSVRFTShjb3JyX2hjcyk7CQkvKiBjb3JyZWN0YWJsZSBoZWFkZXIgZXJyb3JzICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHVuY29ycl9oY3MpOwkJLyogdW5jb3JyZWN0YWJsZSBoZWFkZXIgZXJyb3JzICovIFwKKyAgICBfX0hBTkRMRV9JVEVNKHR4X2NlbGxzKTsJCS8qIGNlbGxzIHNlbnQgKi8gXAorICAgIF9fSEFORExFX0lURU0ocnhfY2VsbHMpOwkJLyogY2VsbHMgcmVjZWl2ZWQgKi8KKworc3RydWN0IHNvbmV0X3N0YXRzIHsKKyNkZWZpbmUgX19IQU5ETEVfSVRFTShpKSBpbnQgaQorCV9fU09ORVRfSVRFTVMKKyN1bmRlZiBfX0hBTkRMRV9JVEVNCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisjZGVmaW5lIFNPTkVUX0dFVFNUQVQJX0lPUignYScsQVRNSU9DX1BIWVRZUCxzdHJ1Y3Qgc29uZXRfc3RhdHMpCisJCQkJCS8qIGdldCBzdGF0aXN0aWNzICovCisjZGVmaW5lIFNPTkVUX0dFVFNUQVRaCV9JT1IoJ2EnLEFUTUlPQ19QSFlUWVArMSxzdHJ1Y3Qgc29uZXRfc3RhdHMpCisJCQkJCS8qIC4uLiBhbmQgemVybyBjb3VudGVycyAqLworI2RlZmluZSBTT05FVF9TRVRESUFHCV9JT1dSKCdhJyxBVE1JT0NfUEhZVFlQKzIsaW50KQorCQkJCQkvKiBzZXQgZXJyb3IgaW5zZXJ0aW9uICovCisjZGVmaW5lIFNPTkVUX0NMUkRJQUcJX0lPV1IoJ2EnLEFUTUlPQ19QSFlUWVArMyxpbnQpCisJCQkJCS8qIGNsZWFyIGVycm9yIGluc2VydGlvbiAqLworI2RlZmluZSBTT05FVF9HRVRESUFHCV9JT1IoJ2EnLEFUTUlPQ19QSFlUWVArNCxpbnQpCisJCQkJCS8qIHF1ZXJ5IGVycm9yIGluc2VydGlvbiAqLworI2RlZmluZSBTT05FVF9TRVRGUkFNSU5HIF9JTygnYScsQVRNSU9DX1BIWVRZUCs1KQorCQkJCQkvKiBzZXQgZnJhbWluZyBtb2RlIChTT05FVC9TREgpICovCisjZGVmaW5lIFNPTkVUX0dFVEZSQU1JTkcgX0lPUignYScsQVRNSU9DX1BIWVRZUCs2LGludCkKKwkJCQkJLyogZ2V0IGZyYW1pbmcgbW9kZSAqLworI2RlZmluZSBTT05FVF9HRVRGUlNFTlNFIF9JT1IoJ2EnLEFUTUlPQ19QSFlUWVArNywgXAorICB1bnNpZ25lZCBjaGFyW1NPTkVUX0ZSU0VOU0VfU0laRV0pCS8qIGdldCBmcmFtaW5nIHNlbnNlIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgU09ORVRfSU5TX1NCSVAJICAxCQkvKiBzZWN0aW9uIEJJUCAqLworI2RlZmluZSBTT05FVF9JTlNfTEJJUAkgIDIJCS8qIGxpbmUgQklQICovCisjZGVmaW5lIFNPTkVUX0lOU19QQklQCSAgNAkJLyogcGF0aCBCSVAgKi8KKyNkZWZpbmUgU09ORVRfSU5TX0ZSQU1FCSAgOAkJLyogb3V0IG9mIGZyYW1lICovCisjZGVmaW5lIFNPTkVUX0lOU19MT1MJIDE2CQkvKiBzZXQgbGluZSB0byB6ZXJvICovCisjZGVmaW5lIFNPTkVUX0lOU19MQUlTCSAzMgkJLyogbGluZSBhbGFybSBpbmRpY2F0aW9uIHNpZ25hbCAqLworI2RlZmluZSBTT05FVF9JTlNfUEFJUwkgNjQJCS8qIHBhdGggYWxhcm0gaW5kaWNhdGlvbiBzaWduYWwgKi8KKyNkZWZpbmUgU09ORVRfSU5TX0hDUwkxMjgJCS8qIGluc2VydCBIQ1MgZXJyb3IgKi8KKworI2RlZmluZSBTT05FVF9GUkFNRV9TT05FVCAwCQkvKiBTT05FVCBTVFMtMyBmcmFtaW5nICovCisjZGVmaW5lIFNPTkVUX0ZSQU1FX1NESCAgIDEJCS8qIFNESCBTVE0tMSBmcmFtaW5nICovCisKKyNkZWZpbmUgU09ORVRfRlJTRU5TRV9TSVpFIDYJCS8qIEMxWzNdLEgxWzNdICgweGZmIGZvciB1bmtub3duKSAqLworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb255cGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk2ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb255cGkuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIFNvbnkgUHJvZ3JhbW1hYmxlIEkvTyBDb250cm9sIERldmljZSBkcml2ZXIgZm9yIFZBSU8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOYXJheWFuYW4gUiBTIDxuYXJzQGthZGFtYmEub3JnPgorCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGPDtHZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWljaGFlbCBBc2hsZXkgPG0uYXNobGV5QHVuc3cuZWR1LmF1PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKdW5pY2hpIE1vcml0YSA8anVuMW1AbWFycy5kdGkubmUuanA+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUB2YWxpbnV4LmNvbT4KKyAqCisgKiBFYXJsaWVyIHdvcmsgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBQYXVsIGBSdXN0eScgUnVzc2VsbCBhbmQgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX1NPTllQSV9IXworI2RlZmluZSBfU09OWVBJX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBldmVudHMgdGhlIHVzZXIgYXBwbGljYXRpb24gcmVhZGluZyAvZGV2L3NvbnlwaSBjYW4gdXNlICovCisKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTgkJIDEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAJCQkgMgorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOX1BSRVNTRUQJIDMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRAkJIDQKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRAkJIDUKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfUkVMRUFTRUQJCSA2CS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQJCSA3CisjZGVmaW5lIFNPTllQSV9FVkVOVF9DQVBUVVJFX1JFTEVBU0VECQkgOAkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRAkgOQorI2RlZmluZSBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQJMTAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0VTQwkJCTExCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GMQkJCTEyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GMgkJCTEzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GMwkJCTE0CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GNAkJCTE1CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GNQkJCTE2CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GNgkJCTE3CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GNwkJCTE4CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GOAkJCTE5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GOQkJCTIwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9GMTAJCQkyMQorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRjExCQkJMjIKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMgkJCTIzCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV8xCQkJMjQKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZXzIJCQkyNQorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfRAkJCTI2CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9FCQkJMjcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX0YJCQkyOAorI2RlZmluZSBTT05ZUElfRVZFTlRfRk5LRVlfUwkJCTI5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9CCQkJMzAKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JMVUVUT09USF9QUkVTU0VECQkzMQorI2RlZmluZSBTT05ZUElfRVZFTlRfUEtFWV9QMQkJCTMyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9QS0VZX1AyCQkJMzMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX1BLRVlfUDMJCQkzNAorI2RlZmluZSBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VECQkzNQorI2RlZmluZSBTT05ZUElfRVZFTlRfTElEX0NMT1NFRAkJCTM2CisjZGVmaW5lIFNPTllQSV9FVkVOVF9MSURfT1BFTkVECQkJMzcKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTgkJMzgKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYJCTM5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQJCTQwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9PTkxZCQkJNDEKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOCQk0MgorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQCQk0MworI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV05fUFJFU1NFRAk0NAorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQJNDUKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTgkJNDYKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAJCTQ3CisjZGVmaW5lIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRAk0OAorI2RlZmluZSBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VECTQ5CisjZGVmaW5lIFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQJCTUwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VECTUxCisjZGVmaW5lIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UJCQk1MgorI2RlZmluZSBTT05ZUElfRVZFTlRfTUVZRV9PUFBPU0lURQkJNTMKKyNkZWZpbmUgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0lOU0VSVAkJNTQKKyNkZWZpbmUgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUCQk1NQorI2RlZmluZSBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VECQk1NgorI2RlZmluZSBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQJCTU3CisjZGVmaW5lIFNPTllQSV9FVkVOVF9CQVRURVJZX1JFTU9WRQkJNTgKKyNkZWZpbmUgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VECQk1OQorI2RlZmluZSBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04JCTYwCisjZGVmaW5lIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PRkYJCTYxCisKKy8qIGdldC9zZXQgYnJpZ2h0bmVzcyAqLworI2RlZmluZSBTT05ZUElfSU9DR0JSVAkJX0lPUigndicsIDAsIF9fdTgpCisjZGVmaW5lIFNPTllQSV9JT0NTQlJUCQlfSU9XKCd2JywgMCwgX191OCkKKworLyogZ2V0IGJhdHRlcnkgZnVsbCBjYXBhY2l0eS9yZW1haW5pbmcgY2FwYWNpdHkgKi8KKyNkZWZpbmUgU09OWVBJX0lPQ0dCQVQxQ0FQCV9JT1IoJ3YnLCAyLCBfX3UxNikKKyNkZWZpbmUgU09OWVBJX0lPQ0dCQVQxUkVNCV9JT1IoJ3YnLCAzLCBfX3UxNikKKyNkZWZpbmUgU09OWVBJX0lPQ0dCQVQyQ0FQCV9JT1IoJ3YnLCA0LCBfX3UxNikKKyNkZWZpbmUgU09OWVBJX0lPQ0dCQVQyUkVNCV9JT1IoJ3YnLCA1LCBfX3UxNikKKworLyogZ2V0IGJhdHRlcnkgZmxhZ3M6IGJhdHRlcnkxL2JhdHRlcnkyL2FjIGFkYXB0ZXIgcHJlc2VudCAqLworI2RlZmluZSBTT05ZUElfQkZMQUdTX0IxCTB4MDEKKyNkZWZpbmUgU09OWVBJX0JGTEFHU19CMgkweDAyCisjZGVmaW5lIFNPTllQSV9CRkxBR1NfQUMJMHgwNAorI2RlZmluZSBTT05ZUElfSU9DR0JBVEZMQUdTCV9JT1IoJ3YnLCA3LCBfX3U4KQorCisvKiBnZXQvc2V0IGJsdWV0b290aCBzdWJzeXN0ZW0gc3RhdGUgb24vb2ZmICovCisjZGVmaW5lIFNPTllQSV9JT0NHQkxVRQkJX0lPUigndicsIDgsIF9fdTgpCisjZGVmaW5lIFNPTllQSV9JT0NTQkxVRQkJX0lPVygndicsIDksIF9fdTgpCisKKy8qIGdldC9zZXQgZmFuIHN0YXRlIG9uL29mZiAqLworI2RlZmluZSBTT05ZUElfSU9DR0ZBTgkJX0lPUigndicsIDEwLCBfX3U4KQorI2RlZmluZSBTT05ZUElfSU9DU0ZBTgkJX0lPVygndicsIDExLCBfX3U4KQorCisvKiBnZXQgdGVtcGVyYXR1cmUgKEMpICovCisjZGVmaW5lIFNPTllQSV9JT0NHVEVNUAkJX0lPUigndicsIDEyLCBfX3U4KQorCisKKyNlbmRpZgkJCQkvKiBfU09OWVBJX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyYTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc291bmQuaApAQCAtMCwwICsxLDQyIEBACisKKy8qCisgKiBNaW5vciBudW1iZXJzIGZvciB0aGUgc291bmQgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjZGVmaW5lIFNORF9ERVZfQ1RMCQkwCS8qIENvbnRyb2wgcG9ydCAvZGV2L21peGVyICovCisjZGVmaW5lIFNORF9ERVZfU0VRCQkxCS8qIFNlcXVlbmNlciBvdXRwdXQgL2Rldi9zZXF1ZW5jZXIgKEZNCisJCQkJCQlzeW50aGVzaXplciBhbmQgTUlESSBvdXRwdXQpICovCisjZGVmaW5lIFNORF9ERVZfTUlESU4JCTIJLyogUmF3IG1pZGkgYWNjZXNzICovCisjZGVmaW5lIFNORF9ERVZfRFNQCQkzCS8qIERpZ2l0aXplZCB2b2ljZSAvZGV2L2RzcCAqLworI2RlZmluZSBTTkRfREVWX0FVRElPCQk0CS8qIFNwYXJjIGNvbXBhdGlibGUgL2Rldi9hdWRpbyAqLworI2RlZmluZSBTTkRfREVWX0RTUDE2CQk1CS8qIExpa2UgL2Rldi9kc3AgYnV0IDE2IGJpdHMvc2FtcGxlICovCisvKiAjZGVmaW5lIFNORF9ERVZfU1RBVFVTCTYgKi8JLyogL2Rldi9zbmRzdGF0IChvYnNvbGV0ZSkgKi8KKyNkZWZpbmUgU05EX0RFVl9VTlVTRUQJCTYKKyNkZWZpbmUgU05EX0RFVl9BV0ZNCQk3CS8qIFJlc2VydmVkICovCisjZGVmaW5lIFNORF9ERVZfU0VRMgkJOAkvKiAvZGV2L3NlcXVlbmNlciwgbGV2ZWwgMiBpbnRlcmZhY2UgKi8KKy8qICNkZWZpbmUgU05EX0RFVl9TTkRQUk9DCTkgKi8JLyogL2Rldi9zbmRwcm9jIGZvciBwcm9ncmFtbWFibGUgZGV2aWNlcyAobm90IHVzZWQpICovCisvKiAjZGVmaW5lIFNORF9ERVZfRE1NSURJCTkgKi8KKyNkZWZpbmUgU05EX0RFVl9TWU5USAkJOQkvKiBSYXcgc3ludGggYWNjZXNzIC9kZXYvc3ludGggKHNhbWUgYXMgL2Rldi9kbWZtKSAqLworI2RlZmluZSBTTkRfREVWX0RNRk0JCTEwCS8qIFJhdyBzeW50aCBhY2Nlc3MgL2Rldi9kbWZtICovCisjZGVmaW5lIFNORF9ERVZfVU5LTk9XTjExCTExCisjZGVmaW5lIFNORF9ERVZfQURTUAkJMTIJLyogTGlrZSAvZGV2L2RzcCAob2Jzb2xldGUpICovCisjZGVmaW5lIFNORF9ERVZfQU1JREkJCTEzCS8qIExpa2UgL2Rldi9taWRpIChvYnNvbGV0ZSkgKi8KKyNkZWZpbmUgU05EX0RFVl9BRE1NSURJCQkxNAkvKiBMaWtlIC9kZXYvZG1taWRpIChvbnNvbGV0ZSkgKi8KKworLyoKKyAqCVNvdW5kIGNvcmUgaW50ZXJmYWNlIGZ1bmN0aW9ucworICovCisgCitzdHJ1Y3QgZGV2aWNlOworZXh0ZXJuIGludCByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIGludCB1bml0KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfc291bmRfc3BlY2lhbF9kZXZpY2UoY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IHVuaXQsIHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHJlZ2lzdGVyX3NvdW5kX21peGVyKGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIGludCBkZXYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9zb3VuZF9taWRpKGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIGludCBkZXYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9zb3VuZF9kc3AoY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgaW50IGRldik7CisKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfc291bmRfc3BlY2lhbChpbnQgdW5pdCk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGludCB1bml0KTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfc291bmRfbWlkaShpbnQgdW5pdCk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3NvdW5kX2RzcChpbnQgdW5pdCk7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3NvdW5kY2FyZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZGNhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQzM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zb3VuZGNhcmQuaApAQCAtMCwwICsxLDEzMDYgQEAKKyNpZm5kZWYgU09VTkRDQVJEX0gKKyNkZWZpbmUgU09VTkRDQVJEX0gKKy8qCisgKiBDb3B5cmlnaHQgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gMi4KKyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKworLyoKKyAqIE9TUyBpbnRlcmZhY2UgdmVyc2lvbi4gV2l0aCB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMy42IHRoaXMgdmFsdWUgaXMKKyAqIGFuIGludGVnZXIgd2l0aCB2YWx1ZSBsZXNzIHRoYW4gMzYxLiBJbiB2ZXJzaW9ucyAzLjYgYW5kIGxhdGVyCisgKiBpdCdzIGEgc2l4IGRpZ2l0IGhleGFkZWNpbWFsIHZhbHVlLiBGb3IgZXhhbXBsZSB2YWx1ZQorICogb2YgMHgwMzA2MDAgcmVwcmVzZW50cyBPU1MgdmVyc2lvbiAzLjYuMC4KKyAqIFVzZSBpb2N0bChmZCwgT1NTX0dFVFZFUlNJT04sICZpbnQpIHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKyAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIGRyaXZlci4KKyAqLworI2RlZmluZSBTT1VORF9WRVJTSU9OCTB4MDMwODAyCisjZGVmaW5lIE9QRU5fU09VTkRfU1lTVEVNCisKKy8qIEluIExpbnV4IHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQgZm9yIGNyb3NzIGNvbXBpbGluZyAqLworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIEVuZGlhbiBtYWNyb3MuICovCisjICBpbmNsdWRlIDxlbmRpYW4uaD4KKworLyoKKyAqCVN1cHBvcnRlZCBjYXJkIElEIG51bWJlcnMgKFNob3VsZCBiZSBzb21ld2hlcmUgZWxzZT8pCisgKi8KKworI2RlZmluZSBTTkRDQVJEX0FETElCCQkxCisjZGVmaW5lIFNORENBUkRfU0IJCTIKKyNkZWZpbmUgU05EQ0FSRF9QQVMJCTMKKyNkZWZpbmUgU05EQ0FSRF9HVVMJCTQKKyNkZWZpbmUgU05EQ0FSRF9NUFU0MDEJCTUKKyNkZWZpbmUgU05EQ0FSRF9TQjE2CQk2CisjZGVmaW5lIFNORENBUkRfU0IxNk1JREkJNworI2RlZmluZSBTTkRDQVJEX1VBUlQ2ODUwCTgKKyNkZWZpbmUgU05EQ0FSRF9HVVMxNgkJOQorI2RlZmluZSBTTkRDQVJEX01TUwkJMTAKKyNkZWZpbmUgU05EQ0FSRF9QU1MgICAgIAkxMQorI2RlZmluZSBTTkRDQVJEX1NTQ0FQRQkJMTIKKyNkZWZpbmUgU05EQ0FSRF9QU1NfTVBVICAgICAJMTMKKyNkZWZpbmUgU05EQ0FSRF9QU1NfTVNTICAgICAJMTQKKyNkZWZpbmUgU05EQ0FSRF9TU0NBUEVfTVNTCTE1CisjZGVmaW5lIFNORENBUkRfVFJYUFJPCQkxNgorI2RlZmluZSBTTkRDQVJEX1RSWFBST19TQgkxNworI2RlZmluZSBTTkRDQVJEX1RSWFBST19NUFUJMTgKKyNkZWZpbmUgU05EQ0FSRF9NQUQxNgkJMTkKKyNkZWZpbmUgU05EQ0FSRF9NQUQxNl9NUFUJMjAKKyNkZWZpbmUgU05EQ0FSRF9DUzQyMzIJCTIxCisjZGVmaW5lIFNORENBUkRfQ1M0MjMyX01QVQkyMgorI2RlZmluZSBTTkRDQVJEX01BVUkJCTIzCisjZGVmaW5lIFNORENBUkRfUFNFVURPX01TUwkyNAorI2RlZmluZSBTTkRDQVJEX0dVU1BOUAkJMjUKKyNkZWZpbmUgU05EQ0FSRF9VQVJUNDAxCQkyNgorLyogU291bmQgY2FyZCBudW1iZXJzIDI3IHRvIE4gYXJlIHJlc2VydmVkLiBEb24ndCBhZGQgbW9yZSBudW1iZXJzIGhlcmUuICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU9DVEwgQ29tbWFuZHMgZm9yIC9kZXYvc2VxdWVuY2VyCisgKi8KKworI2lmbmRlZiBfU0lPV1IKKyNpZiBkZWZpbmVkKF9JT1dSKSAmJiAoZGVmaW5lZChfQUlYKSB8fCAoIWRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChzcGFyYykgJiYgIWRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX0lOQ2lvY3RsaCkgJiYgIWRlZmluZWQoX19MeW54X18pKSkKKy8qIFVzZSBhbHJlYWR5IGRlZmluZWQgaW9jdGwgZGVmaW5lcyBpZiB0aGV5IGV4aXN0IChleGNlcHQgd2l0aCBTdW4gb3IgU3BhcmMpICovCisjZGVmaW5lCVNJT0NQQVJNX01BU0sJSU9DUEFSTV9NQVNLCisjZGVmaW5lCVNJT0NfVk9JRAlJT0NfVk9JRAorI2RlZmluZQlTSU9DX09VVAlJT0NfT1VUCisjZGVmaW5lCVNJT0NfSU4JCUlPQ19JTgorI2RlZmluZQlTSU9DX0lOT1VUCUlPQ19JTk9VVAorI2RlZmluZSBfU0lPQ19TSVpFCV9JT0NfU0laRQorI2RlZmluZSBfU0lPQ19ESVIJX0lPQ19ESVIKKyNkZWZpbmUgX1NJT0NfTk9ORQlfSU9DX05PTkUKKyNkZWZpbmUgX1NJT0NfUkVBRAlfSU9DX1JFQUQKKyNkZWZpbmUgX1NJT0NfV1JJVEUJX0lPQ19XUklURQorI2RlZmluZQlfU0lPCQlfSU8KKyNkZWZpbmUJX1NJT1IJCV9JT1IKKyNkZWZpbmUJX1NJT1cJCV9JT1cKKyNkZWZpbmUJX1NJT1dSCQlfSU9XUgorI2Vsc2UKKworLyogSW9jdGwncyBoYXZlIHRoZSBjb21tYW5kIGVuY29kZWQgaW4gdGhlIGxvd2VyIHdvcmQsCisgKiBhbmQgdGhlIHNpemUgb2YgYW55IGluIG9yIG91dCBwYXJhbWV0ZXJzIGluIHRoZSB1cHBlcgorICogd29yZC4gIFRoZSBoaWdoIDIgYml0cyBvZiB0aGUgdXBwZXIgd29yZCBhcmUgdXNlZAorICogdG8gZW5jb2RlIHRoZSBpbi9vdXQgc3RhdHVzIG9mIHRoZSBwYXJhbWV0ZXI7IGZvciBub3cKKyAqIHdlIHJlc3RyaWN0IHBhcmFtZXRlcnMgdG8gYXQgbW9zdCA4MTkxIGJ5dGVzLgorICovCisvKiAjZGVmaW5lCVNJT0NUWVBFCQkoMHhmZjw8OCkgKi8KKyNkZWZpbmUJU0lPQ1BBUk1fTUFTSwkweDFmZmYJCS8qIHBhcmFtZXRlcnMgbXVzdCBiZSA8IDgxOTIgYnl0ZXMgKi8KKyNkZWZpbmUJU0lPQ19WT0lECTB4MDAwMDAwMDAJLyogbm8gcGFyYW1ldGVycyAqLworI2RlZmluZQlTSU9DX09VVAkweDIwMDAwMDAwCS8qIGNvcHkgb3V0IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUJU0lPQ19JTgkJMHg0MDAwMDAwMAkvKiBjb3B5IGluIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUJU0lPQ19JTk9VVAkoU0lPQ19JTnxTSU9DX09VVCkKKy8qIHRoZSAweDIwMDAwMDAwIGlzIHNvIHdlIGNhbiBkaXN0aW5ndWlzaCBuZXcgaW9jdGwncyBmcm9tIG9sZCAqLworI2RlZmluZQlfU0lPKHgseSkJKChpbnQpKFNJT0NfVk9JRHwoeDw8OCl8eSkpCisjZGVmaW5lCV9TSU9SKHgseSx0KQkoKGludCkoU0lPQ19PVVR8KChzaXplb2YodCkmU0lPQ1BBUk1fTUFTSyk8PDE2KXwoeDw8OCl8eSkpCisjZGVmaW5lCV9TSU9XKHgseSx0KQkoKGludCkoU0lPQ19JTnwoKHNpemVvZih0KSZTSU9DUEFSTV9NQVNLKTw8MTYpfCh4PDw4KXx5KSkKKy8qIHRoaXMgc2hvdWxkIGJlIF9TSU9SVywgYnV0IHN0ZGlvIGdvdCB0aGVyZSBmaXJzdCAqLworI2RlZmluZQlfU0lPV1IoeCx5LHQpCSgoaW50KShTSU9DX0lOT1VUfCgoc2l6ZW9mKHQpJlNJT0NQQVJNX01BU0spPDwxNil8KHg8PDgpfHkpKQorI2RlZmluZSBfU0lPQ19TSVpFKHgpCSgoeD4+MTYpJlNJT0NQQVJNX01BU0spCQorI2RlZmluZSBfU0lPQ19ESVIoeCkJKHggJiAweGYwMDAwMDAwKQorI2RlZmluZSBfU0lPQ19OT05FCVNJT0NfVk9JRAorI2RlZmluZSBfU0lPQ19SRUFECVNJT0NfT1VUCisjZGVmaW5lIF9TSU9DX1dSSVRFCVNJT0NfSU4KKyMgIGVuZGlmIC8qIF9JT1dSICovCisjZW5kaWYgIC8qICFfU0lPV1IgKi8KKworI2RlZmluZSBTTkRDVExfU0VRX1JFU0VUCQlfU0lPICAoJ1EnLCAwKQorI2RlZmluZSBTTkRDVExfU0VRX1NZTkMJCQlfU0lPICAoJ1EnLCAxKQorI2RlZmluZSBTTkRDVExfU1lOVEhfSU5GTwkJX1NJT1dSKCdRJywgMiwgc3RydWN0IHN5bnRoX2luZm8pCisjZGVmaW5lIFNORENUTF9TRVFfQ1RSTFJBVEUJCV9TSU9XUignUScsIDMsIGludCkJLyogU2V0L2dldCB0aW1lciByZXNvbHV0aW9uIChIWikgKi8KKyNkZWZpbmUgU05EQ1RMX1NFUV9HRVRPVVRDT1VOVAkJX1NJT1IgKCdRJywgNCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX0dFVElOQ09VTlQJCV9TSU9SICgnUScsIDUsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9QRVJDTU9ERQkJX1NJT1cgKCdRJywgNiwgaW50KQorI2RlZmluZSBTTkRDVExfRk1fTE9BRF9JTlNUUgkJX1NJT1cgKCdRJywgNywgc3RydWN0IHNiaV9pbnN0cnVtZW50KQkvKiBPYnNvbGV0ZS4gRG9uJ3QgdXNlISEhISEhICovCisjZGVmaW5lIFNORENUTF9TRVFfVEVTVE1JREkJCV9TSU9XICgnUScsIDgsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVMJCV9TSU9XICgnUScsIDksIGludCkKKyNkZWZpbmUgU05EQ1RMX1NFUV9OUlNZTlRIUwkJX1NJT1IgKCdRJywxMCwgaW50KQorI2RlZmluZSBTTkRDVExfU0VRX05STUlESVMJCV9TSU9SICgnUScsMTEsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JRElfSU5GTwkJX1NJT1dSKCdRJywxMiwgc3RydWN0IG1pZGlfaW5mbykKKyNkZWZpbmUgU05EQ1RMX1NFUV9USFJFU0hPTEQJCV9TSU9XICgnUScsMTMsIGludCkKKyNkZWZpbmUgU05EQ1RMX1NZTlRIX01FTUFWTAkJX1NJT1dSKCdRJywxNCwgaW50KQkvKiBpbj1kZXYjLCBvdXQ9bWVtc2l6ZSAqLworI2RlZmluZSBTTkRDVExfRk1fNE9QX0VOQUJMRQkJX1NJT1cgKCdRJywxNSwgaW50KQkvKiBpbj1kZXYjICovCisjZGVmaW5lIFNORENUTF9TRVFfUEFOSUMJCV9TSU8gICgnUScsMTcpCisjZGVmaW5lIFNORENUTF9TRVFfT1VUT0ZCQU5ECQlfU0lPVyAoJ1EnLDE4LCBzdHJ1Y3Qgc2VxX2V2ZW50X3JlYykKKyNkZWZpbmUgU05EQ1RMX1NFUV9HRVRUSU1FCQlfU0lPUiAoJ1EnLDE5LCBpbnQpCisjZGVmaW5lIFNORENUTF9TWU5USF9JRAkJCV9TSU9XUignUScsMjAsIHN0cnVjdCBzeW50aF9pbmZvKQorI2RlZmluZSBTTkRDVExfU1lOVEhfQ09OVFJPTAkJX1NJT1dSKCdRJywyMSwgc3RydWN0IHN5bnRoX2NvbnRyb2wpCisjZGVmaW5lIFNORENUTF9TWU5USF9SRU1PVkVTQU1QTEUJX1NJT1dSKCdRJywyMiwgc3RydWN0IHJlbW92ZV9zYW1wbGUpCisKK3R5cGVkZWYgc3RydWN0IHN5bnRoX2NvbnRyb2wKK3sKKwlpbnQgZGV2bm87CS8qIFN5bnRoZXNpemVyICMgKi8KKwljaGFyIGRhdGFbNDAwMF07IC8qIERldmljZSBzcGVzaWZpYyBjb21tYW5kL2RhdGEgcmVjb3JkICovCit9c3ludGhfY29udHJvbDsKKwordHlwZWRlZiBzdHJ1Y3QgcmVtb3ZlX3NhbXBsZQoreworCWludCBkZXZubzsJLyogU3ludGhlc2l6ZXIgIyAqLworCWludCBiYW5rbm87CS8qIE1JREkgYmFuayAjICgwPUdlbmVyYWwgTUlESSkgKi8KKwlpbnQgaW5zdHJubzsJLyogTUlESSBpbnN0cnVtZW50IG51bWJlciAqLworfSByZW1vdmVfc2FtcGxlOworCit0eXBlZGVmIHN0cnVjdCBzZXFfZXZlbnRfcmVjIHsKKwkJdW5zaWduZWQgY2hhciBhcnJbOF07Cit9IHNlcV9ldmVudF9yZWM7CisKKyNkZWZpbmUgU05EQ1RMX1RNUl9USU1FQkFTRQkJX1NJT1dSKCdUJywgMSwgaW50KQorI2RlZmluZSBTTkRDVExfVE1SX1NUQVJUCQlfU0lPICAoJ1QnLCAyKQorI2RlZmluZSBTTkRDVExfVE1SX1NUT1AJCQlfU0lPICAoJ1QnLCAzKQorI2RlZmluZSBTTkRDVExfVE1SX0NPTlRJTlVFCQlfU0lPICAoJ1QnLCA0KQorI2RlZmluZSBTTkRDVExfVE1SX1RFTVBPCQlfU0lPV1IoJ1QnLCA1LCBpbnQpCisjZGVmaW5lIFNORENUTF9UTVJfU09VUkNFCQlfU0lPV1IoJ1QnLCA2LCBpbnQpCisjCWRlZmluZSBUTVJfSU5URVJOQUwJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIFRNUl9FWFRFUk5BTAkJMHgwMDAwMDAwMgorIwkJZGVmaW5lIFRNUl9NT0RFX01JREkJMHgwMDAwMDAxMAorIwkJZGVmaW5lIFRNUl9NT0RFX0ZTSwkweDAwMDAwMDIwCisjCQlkZWZpbmUgVE1SX01PREVfQ0xTCTB4MDAwMDAwNDAKKyMJCWRlZmluZSBUTVJfTU9ERV9TTVBURQkweDAwMDAwMDgwCisjZGVmaW5lIFNORENUTF9UTVJfTUVUUk9OT01FCQlfU0lPVyAoJ1QnLCA3LCBpbnQpCisjZGVmaW5lIFNORENUTF9UTVJfU0VMRUNUCQlfU0lPVyAoJ1QnLCA4LCBpbnQpCisKKy8qCisgKiBTb21lIGJpZyBlbmRpYW4vbGl0dGxlIGVuZGlhbiBoYW5kbGluZyBtYWNyb3MKKyAqLworCisjZGVmaW5lIF9MSU5VWF9QQVRDSEtFWV9IX0lORElSRUNUCisjaW5jbHVkZSA8bGludXgvcGF0Y2hrZXkuaD4KKyN1bmRlZiBfTElOVVhfUEFUQ0hLRVlfSF9JTkRJUkVDVAorCisjaWYgICBkZWZpbmVkKF9fQllURV9PUkRFUikKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgICAgZGVmaW5lIEFGTVRfUzE2X05FIEFGTVRfUzE2X0JFCisjICBlbGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIEFGTVRfUzE2X05FIEFGTVRfUzE2X0xFCisjICBlbHNlCisjICAgIGVycm9yICJjb3VsZCBub3QgZGV0ZXJtaW5lIGJ5dGUgb3JkZXIiCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKglTYW1wbGUgbG9hZGluZyBtZWNoYW5pc20gZm9yIGludGVybmFsIHN5bnRoZXNpemVycyAoL2Rldi9zZXF1ZW5jZXIpCisgKglUaGUgZm9sbG93aW5nIHBhdGNoX2luZm8gc3RydWN0dXJlIGhhcyBiZWVuIGRlc2lnbmVkIHRvIHN1cHBvcnQKKyAqCUdyYXZpcyBVbHRyYVNvdW5kLiBJdCB0cmllcyB0byBiZSB1bml2ZXJzYWwgZm9ybWF0IGZvciB1cGxvYWRpbmcKKyAqCXNhbXBsZSBiYXNlZCBwYXRjaGVzIGJ1dCBpcyBwcm9iYWJseSB0b28gbGltaXRlZC4KKyAqCisgKiAgICAgIChQQkQpIEFzIEhhbm51IGd1ZXNzZWQsIHRoZSBHVVMgc3RydWN0dXJlIGlzIHRvbyBsaW1pdGVkIGZvciAKKyAqICAgICAgdGhlIFdhdmVGcm9udCwgYnV0IHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlIGZvciBhIGNvbnN0YW50IGRlZmluaXRpb24uCisgKi8KKworc3RydWN0IHBhdGNoX2luZm8geworCQl1bnNpZ25lZCBzaG9ydCBrZXk7CQkvKiBVc2UgV0FWRV9QQVRDSCBoZXJlICovCisjZGVmaW5lIFdBVkVfUEFUQ0gJICAgX1BBVENIS0VZKDB4MDQpCisjZGVmaW5lIEdVU19QQVRDSAkgICBXQVZFX1BBVENICisjZGVmaW5lIFdBVkVGUk9OVF9QQVRDSCAgICBfUEFUQ0hLRVkoMHgwNikKKworCQlzaG9ydCBkZXZpY2Vfbm87CS8qIFN5bnRoZXNpemVyIG51bWJlciAqLworCQlzaG9ydCBpbnN0cl9ubzsJCS8qIE1pZGkgcGdtIyAqLworCisJCXVuc2lnbmVkIGludCBtb2RlOworLyoKKyAqIFRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIGhhcyB0aGUgc2FtZSBmb3JtYXQgdGhhbiB0aGUgR1VTIC5QQVQKKyAqIGZpbGVzCisgKi8KKyNkZWZpbmUgV0FWRV8xNl9CSVRTCTB4MDEJLyogYml0IDAgPSA4IG9yIDE2IGJpdCB3YXZlIGRhdGEuICovCisjZGVmaW5lIFdBVkVfVU5TSUdORUQJMHgwMgkvKiBiaXQgMSA9IFNpZ25lZCAtIFVuc2lnbmVkIGRhdGEuICovCisjZGVmaW5lIFdBVkVfTE9PUElORwkweDA0CS8qIGJpdCAyID0gbG9vcGluZyBlbmFibGVkLTEuICovCisjZGVmaW5lIFdBVkVfQklESVJfTE9PUAkweDA4CS8qIGJpdCAzID0gU2V0IGlzIGJpZGlyZWN0aW9uYWwgbG9vcGluZy4gKi8KKyNkZWZpbmUgV0FWRV9MT09QX0JBQ0sJMHgxMAkvKiBiaXQgNCA9IFNldCBpcyBsb29waW5nIGJhY2t3YXJkLiAqLworI2RlZmluZSBXQVZFX1NVU1RBSU5fT04JMHgyMAkvKiBiaXQgNSA9IFR1cm4gc3VzdGFpbmluZyBvbi4gKEVudi4gcHRzLiAzKSovCisjZGVmaW5lIFdBVkVfRU5WRUxPUEVTCTB4NDAJLyogYml0IDYgPSBFbmFibGUgZW52ZWxvcGVzIC0gMSAqLworI2RlZmluZSBXQVZFX0ZBU1RfUkVMRUFTRSAweDgwCS8qIGJpdCA3ID0gU2h1dCBvZmYgaW1tZWRpYXRlbHkgYWZ0ZXIgbm90ZSBvZmYgKi8KKwkJCQkvKiAJKHVzZSB0aGUgZW52X3JhdGUvZW52X29mZnMgZmllbGRzKS4gKi8KKy8qIExpbnV4IHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgV0FWRV9WSUJSQVRPCTB4MDAwMTAwMDAJLyogVGhlIHZpYnJhdG8gaW5mbyBpcyB2YWxpZCAqLworI2RlZmluZSBXQVZFX1RSRU1PTE8JMHgwMDAyMDAwMAkvKiBUaGUgdHJlbW9sbyBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfU0NBTEUJMHgwMDA0MDAwMAkvKiBUaGUgc2NhbGluZyBpbmZvIGlzIHZhbGlkICovCisjZGVmaW5lIFdBVkVfRlJBQ1RJT05TCTB4MDAwODAwMDAJLyogRnJhY3Rpb24gaW5mb3JtYXRpb24gaXMgdmFsaWQgKi8KKy8qIFJlc2VydmVkIGJpdHMgKi8KKyNkZWZpbmUgV0FWRV9ST00JMHg0MDAwMDAwMAkvKiBGb3IgZnV0dXJlIHVzZSAqLworI2RlZmluZSBXQVZFX01VTEFXCTB4MjAwMDAwMDAJLyogRm9yIGZ1dHVyZSB1c2UgKi8KKy8qIE90aGVyIGJpdHMgbXVzdCBiZSB6ZXJvZWQgKi8KKworCQlpbnQgbGVuOwkvKiBTaXplIG9mIHRoZSB3YXZlIGRhdGEgaW4gYnl0ZXMgKi8KKwkJaW50IGxvb3Bfc3RhcnQsIGxvb3BfZW5kOyAvKiBCeXRlIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nICovCisKKy8qIAorICogVGhlIGJhc2VfZnJlcSBhbmQgYmFzZV9ub3RlIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGNvbXB1dGluZyB0aGUKKyAqIHBsYXliYWNrIHNwZWVkIGZvciBhIG5vdGUuIFRoZSBiYXNlX25vdGUgZGVmaW5lcyB0aGUgdG9uZSBmcmVxdWVuY3kKKyAqIHdoaWNoIGlzIGhlYXJkIGlmIHRoZSBzYW1wbGUgaXMgcGxheWVkIHVzaW5nIHRoZSBiYXNlX2ZyZXEgYXMgdGhlCisgKiBwbGF5YmFjayBzcGVlZC4KKyAqCisgKiBUaGUgbG93X25vdGUgYW5kIGhpZ2hfbm90ZSBmaWVsZHMgZGVmaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG5vdGUKKyAqIGZyZXF1ZW5jaWVzIGZvciB3aGljaCB0aGlzIHNhbXBsZSBpcyB2YWxpZC4gSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lCisgKiBtb3JlIHRoYW4gb25lIHNhbXBsZXMgZm9yIGFuIGluc3RydW1lbnQgbnVtYmVyIGF0IHRoZSBzYW1lIHRpbWUuIFRoZQorICogbG93X25vdGUgYW5kIGhpZ2hfbm90ZSBmaWVsZHMgYXJlIHVzZWQgdG8gc2VsZWN0IHRoZSBtb3N0IHN1aXRhYmxlIG9uZS4KKyAqCisgKiBUaGUgZmllbGRzIGJhc2Vfbm90ZSwgaGlnaF9ub3RlIGFuZCBsb3dfbm90ZSBzaG91bGQgY29udGFpbgorICogdGhlIG5vdGUgZnJlcXVlbmN5IG11bHRpcGxpZWQgYnkgMTAwMC4gRm9yIGV4YW1wbGUgdmFsdWUgZm9yIHRoZQorICogbWlkZGxlIEEgaXMgNDQwKjEwMDAuCisgKi8KKworCQl1bnNpZ25lZCBpbnQgYmFzZV9mcmVxOworCQl1bnNpZ25lZCBpbnQgYmFzZV9ub3RlOworCQl1bnNpZ25lZCBpbnQgaGlnaF9ub3RlOworCQl1bnNpZ25lZCBpbnQgbG93X25vdGU7CisJCWludCBwYW5uaW5nOwkvKiAtMTI4PWxlZnQsIDEyNz1yaWdodCAqLworCQlpbnQgZGV0dW5pbmc7CisKKy8qCU5ldyBmaWVsZHMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEuOTkuNQkqLworCisgICAgICAgLyogRW52ZWxvcGUuIEVuYWJsZWQgYnkgbW9kZSBiaXQgV0FWRV9FTlZFTE9QRVMJKi8KKwkJdW5zaWduZWQgY2hhcgllbnZfcmF0ZVsgNiBdOwkgLyogR1VTIEhXIHJhbXBpbmcgcmF0ZSAqLworCQl1bnNpZ25lZCBjaGFyCWVudl9vZmZzZXRbIDYgXTsgLyogMjU1ID09IDEwMCUgKi8KKworCS8qIAorCSAqIFRoZSB0cmVtb2xvLCB2aWJyYXRvIGFuZCBzY2FsZSBpbmZvIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KKwkgKiBFbmFibGUgYnkgc2V0dGluZyB0aGUgbW9kZSBiaXRzIFdBVkVfVFJFTU9MTywgV0FWRV9WSUJSQVRPIG9yCisJICogV0FWRV9TQ0FMRQorCSAqLworCisJCXVuc2lnbmVkIGNoYXIJdHJlbW9sb19zd2VlcDsKKwkJdW5zaWduZWQgY2hhcgl0cmVtb2xvX3JhdGU7CisJCXVuc2lnbmVkIGNoYXIJdHJlbW9sb19kZXB0aDsKKwkKKwkJdW5zaWduZWQgY2hhcgl2aWJyYXRvX3N3ZWVwOworCQl1bnNpZ25lZCBjaGFyCXZpYnJhdG9fcmF0ZTsKKwkJdW5zaWduZWQgY2hhcgl2aWJyYXRvX2RlcHRoOworCisJCWludAkJc2NhbGVfZnJlcXVlbmN5OworCQl1bnNpZ25lZCBpbnQJc2NhbGVfZmFjdG9yOwkJLyogZnJvbSAwIHRvIDIwNDggb3IgMCB0byAyICovCisJCisJICAgICAgICBpbnQJCXZvbHVtZTsKKwkJaW50CQlmcmFjdGlvbnM7CisJCWludAkJcmVzZXJ2ZWQxOworCSAgICAgICAgaW50CQlzcGFyZVsyXTsKKwkJY2hhciBkYXRhWzFdOwkvKiBUaGUgd2F2ZWZvcm0gZGF0YSBzdGFydHMgaGVyZSAqLworCX07CisKK3N0cnVjdCBzeXNleF9pbmZvIHsKKwkJc2hvcnQga2V5OwkJLyogVXNlIFNZU0VYX1BBVENIIG9yIE1BVUlfUEFUQ0ggaGVyZSAqLworI2RlZmluZSBTWVNFWF9QQVRDSAlfUEFUQ0hLRVkoMHgwNSkKKyNkZWZpbmUgTUFVSV9QQVRDSAlfUEFUQ0hLRVkoMHgwNikKKwkJc2hvcnQgZGV2aWNlX25vOwkvKiBTeW50aGVzaXplciBudW1iZXIgKi8KKwkJaW50IGxlbjsJLyogU2l6ZSBvZiB0aGUgc3lzZXggZGF0YSBpbiBieXRlcyAqLworCQl1bnNpZ25lZCBjaGFyIGRhdGFbMV07CS8qIFN5c2V4IGRhdGEgc3RhcnRzIGhlcmUgKi8KKwl9OworCisvKgorICogL2Rldi9zZXF1ZW5jZXIgaW5wdXQgZXZlbnRzLgorICoKKyAqIFRoZSBkYXRhIHdyaXR0ZW4gdG8gdGhlIC9kZXYvc2VxdWVuY2VyIGlzIGEgc3RyZWFtIG9mIGV2ZW50cy4gRXZlbnRzCisgKiBhcmUgcmVjb3JkcyBvZiA0IG9yIDggYnl0ZXMuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdGhlIHNpemUuIAorICogQW55IG51bWJlciBvZiBldmVudHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCBhIHdyaXRlIGNhbGwuIFRoZXJlCisgKiBpcyBhIHNldCBvZiBtYWNyb3MgZm9yIHNlbmRpbmcgdGhlc2UgZXZlbnRzLiBVc2UgdGhlc2UgbWFjcm9zIGlmIHlvdQorICogd2FudCB0byBtYXhpbWl6ZSBwb3J0YWJpbGl0eSBvZiB5b3VyIHByb2dyYW0uCisgKgorICogRXZlbnRzIFNFUV9XQUlULCBTRVFfTUlESVBVVEMgYW5kIFNFUV9FQ0hPLiBBcmUgYWxzbyBpbnB1dCBldmVudHMuCisgKiAoQWxsIGlucHV0IGV2ZW50cyBhcmUgY3VycmVudGx5IDQgYnl0ZXMgbG9uZy4gQmUgcHJlcGFyZWQgdG8gc3VwcG9ydAorICogOCBieXRlIGV2ZW50cyBhbHNvLiBJZiB5b3UgcmVjZWl2ZSBhbnkgZXZlbnQgaGF2aW5nIGZpcnN0IGJ5dGUgPj0gMTI4LAorICogaXQncyBhIDggYnl0ZSBldmVudC4KKyAqCisgKiBUaGUgZXZlbnRzIGFyZSBkb2N1bWVudGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIE5vcm1hbCBldmVudHMgKDQgYnl0ZXMpCisgKiBUaGVyZSBpcyBhbHNvIGEgOCBieXRlIHZlcnNpb24gb2YgbW9zdCBvZiB0aGUgNCBieXRlIGV2ZW50cy4gVGhlCisgKiA4IGJ5dGUgb25lIGlzIHJlY29tbWVuZGVkLgorICovCisjZGVmaW5lIFNFUV9OT1RFT0ZGCQkwCisjZGVmaW5lIFNFUV9GTU5PVEVPRkYJCVNFUV9OT1RFT0ZGCS8qIEp1c3Qgb2xkIG5hbWUgKi8KKyNkZWZpbmUgU0VRX05PVEVPTgkJMQorI2RlZmluZQlTRVFfRk1OT1RFT04JCVNFUV9OT1RFT04KKyNkZWZpbmUgU0VRX1dBSVQJCVRNUl9XQUlUX0FCUworI2RlZmluZSBTRVFfUEdNQ0hBTkdFCQkzCisjZGVmaW5lIFNFUV9GTVBHTUNIQU5HRQkJU0VRX1BHTUNIQU5HRQorI2RlZmluZSBTRVFfU1lOQ1RJTUVSCQlUTVJfU1RBUlQKKyNkZWZpbmUgU0VRX01JRElQVVRDCQk1CisjZGVmaW5lIFNFUV9EUlVNT04JCTYJLyoqKiBPQlNPTEVURSAqKiovCisjZGVmaW5lIFNFUV9EUlVNT0ZGCQk3CS8qKiogT0JTT0xFVEUgKioqLworI2RlZmluZSBTRVFfRUNITwkJVE1SX0VDSE8JLyogRm9yIHN5bmNoaW5nIHByb2dyYW1zIHdpdGggb3V0cHV0ICovCisjZGVmaW5lIFNFUV9BRlRFUlRPVUNICQk5CisjZGVmaW5lIFNFUV9DT05UUk9MTEVSCQkxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTWlkaSBjb250cm9sbGVyIG51bWJlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb250cm9sbGVycyAwIHRvIDMxICgweDAwIHRvIDB4MWYpIGFuZAorICogMzIgdG8gNjMgKDB4MjAgdG8gMHgzZikgYXJlIGNvbnRpbnVvdXMKKyAqIGNvbnRyb2xsZXJzLgorICogSW4gdGhlIE1JREkgMS4wIHRoZXNlIGNvbnRyb2xsZXJzIGFyZSBzZW50IHVzaW5nCisgKiB0d28gbWVzc2FnZXMuIENvbnRyb2xsZXIgbnVtYmVycyAwIHRvIDMxIGFyZSB1c2VkCisgKiB0byBzZW5kIHRoZSBNU0IgYW5kIHRoZSBjb250cm9sbGVyIG51bWJlcnMgMzIgdG8gNjMKKyAqIGFyZSBmb3IgdGhlIExTQi4gTm90ZSB0aGF0IGp1c3QgNyBiaXRzIGFyZSB1c2VkIGluIE1JREkgYnl0ZXMuCisgKi8KKworI2RlZmluZQkgICBDVExfQkFOS19TRUxFQ1QJCTB4MDAKKyNkZWZpbmUJICAgQ1RMX01PRFdIRUVMCQkJMHgwMQorI2RlZmluZSAgICBDVExfQlJFQVRICQkJMHgwMgorLyoJCXVuZGVmaW5lZAkJMHgwMyAqLworI2RlZmluZSAgICBDVExfRk9PVAkJCTB4MDQKKyNkZWZpbmUgICAgQ1RMX1BPUlRBTUVOVE9fVElNRQkJMHgwNQorI2RlZmluZSAgICBDVExfREFUQV9FTlRSWQkJMHgwNgorI2RlZmluZSAgICBDVExfTUFJTl9WT0xVTUUJCTB4MDcKKyNkZWZpbmUgICAgQ1RMX0JBTEFOQ0UJCQkweDA4CisvKgkJdW5kZWZpbmVkCQkweDA5ICovCisjZGVmaW5lICAgIENUTF9QQU4JCQkweDBhCisjZGVmaW5lICAgIENUTF9FWFBSRVNTSU9OCQkweDBiCisvKgkJdW5kZWZpbmVkCQkweDBjICovCisvKgkJdW5kZWZpbmVkCQkweDBkICovCisvKgkJdW5kZWZpbmVkCQkweDBlICovCisvKgkJdW5kZWZpbmVkCQkweDBmICovCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0UxCTB4MTAKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTIJMHgxMQorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFMwkweDEyCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U0CTB4MTMKKy8qCQl1bmRlZmluZWQJCTB4MTQgLSAweDFmICovCisKKy8qCQl1bmRlZmluZWQJCTB4MjAgKi8KKy8qIFRoZSBjb250cm9sbGVyIG51bWJlcnMgMHgyMSB0byAweDNmIGFyZSByZXNlcnZlZCBmb3IgdGhlICovCisvKiBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgY29udHJvbGxlcnMgMHgwMCB0byAweDFmLiAqLworLyogVGhlc2UgY29udHJvbGxlcnMgYXJlIG5vdCByZWNvZ25pc2VkIGJ5IHRoZSBkcml2ZXIuICovCisKKy8qIENvbnRyb2xsZXJzIDY0IHRvIDY5ICgweDQwIHRvIDB4NDUpIGFyZSBvbi9vZmYgc3dpdGNoZXMuICovCisvKiAwPU9GRiBhbmQgMTI3PU9OIChpbnRlcm1lZGlhdGUgdmFsdWVzIGFyZSBwb3NzaWJsZSkgKi8KKyNkZWZpbmUgICAgQ1RMX0RBTVBFUl9QRURBTAkJMHg0MAorI2RlZmluZSAgICBDVExfU1VTVEFJTgkJCTB4NDAJLyogQWxpYXMgKi8KKyNkZWZpbmUgICAgQ1RMX0hPTEQJCQkweDQwCS8qIEFsaWFzICovCisjZGVmaW5lICAgIENUTF9QT1JUQU1FTlRPCQkweDQxCisjZGVmaW5lICAgIENUTF9TT1NURU5VVE8JCTB4NDIKKyNkZWZpbmUgICAgQ1RMX1NPRlRfUEVEQUwJCTB4NDMKKy8qCQl1bmRlZmluZWQJCTB4NDQgKi8KKyNkZWZpbmUgICAgQ1RMX0hPTEQyCQkJMHg0NQorLyoJCXVuZGVmaW5lZAkJMHg0NiAtIDB4NGYgKi8KKworI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFNQkweDUwCisjZGVmaW5lICAgIENUTF9HRU5FUkFMX1BVUlBPU0U2CTB4NTEKKyNkZWZpbmUgICAgQ1RMX0dFTkVSQUxfUFVSUE9TRTcJMHg1MgorI2RlZmluZSAgICBDVExfR0VORVJBTF9QVVJQT1NFOAkweDUzCisvKgkJdW5kZWZpbmVkCQkweDU0IC0gMHg1YSAqLworI2RlZmluZSAgICBDVExfRVhUX0VGRl9ERVBUSAkJMHg1YgorI2RlZmluZSAgICBDVExfVFJFTU9MT19ERVBUSAkJMHg1YworI2RlZmluZSAgICBDVExfQ0hPUlVTX0RFUFRICQkweDVkCisjZGVmaW5lICAgIENUTF9ERVRVTkVfREVQVEgJCTB4NWUKKyNkZWZpbmUgICAgQ1RMX0NFTEVTVEVfREVQVEgJCTB4NWUJLyogQWxpYXMgZm9yIHRoZSBhYm92ZSBvbmUgKi8KKyNkZWZpbmUgICAgQ1RMX1BIQVNFUl9ERVBUSAkJMHg1ZgorI2RlZmluZSAgICBDVExfREFUQV9JTkNSRU1FTlQJCTB4NjAKKyNkZWZpbmUgICAgQ1RMX0RBVEFfREVDUkVNRU5UCQkweDYxCisjZGVmaW5lICAgIENUTF9OT05SRUdfUEFSTV9OVU1fTFNCCTB4NjIKKyNkZWZpbmUgICAgQ1RMX05PTlJFR19QQVJNX05VTV9NU0IJMHg2MworI2RlZmluZSAgICBDVExfUkVHSVNUX1BBUk1fTlVNX0xTQgkweDY0CisjZGVmaW5lICAgIENUTF9SRUdJU1RfUEFSTV9OVU1fTVNCCTB4NjUKKy8qCQl1bmRlZmluZWQJCTB4NjYgLSAweDc4ICovCisvKgkJcmVzZXJ2ZWQJCTB4NzkgLSAweDdmICovCisKKy8qIFBzZXVkbyBjb250cm9sbGVycyAobm90IG1pZGkgY29tcGF0aWJsZSkgKi8KKyNkZWZpbmUgICAgQ1RSTF9QSVRDSF9CRU5ERVIJCTI1NQorI2RlZmluZSAgICBDVFJMX1BJVENIX0JFTkRFUl9SQU5HRQkyNTQKKyNkZWZpbmUgICAgQ1RSTF9FWFBSRVNTSU9OCQkyNTMJLyogT2Jzb2xldGUgKi8KKyNkZWZpbmUgICAgQ1RSTF9NQUlOX1ZPTFVNRQkJMjUyCS8qIE9ic29sZXRlICovCisjZGVmaW5lIFNFUV9CQUxBTkNFCQkxMQorI2RlZmluZSBTRVFfVk9MTU9ERSAgICAgICAgICAgICAxMgorCisvKgorICogVm9sdW1lIG1vZGUgZGVjaWRlcyBob3cgdm9sdW1lcyBhcmUgdXNlZAorICovCisKKyNkZWZpbmUgVk9MX01FVEhPRF9BREFHSU8JMQorI2RlZmluZSBWT0xfTUVUSE9EX0xJTkVBUgkyCisKKy8qCisgKiBOb3RlISBTRVFfV0FJVCwgU0VRX01JRElQVVRDIGFuZCBTRVFfRUNITyBhcmUgdXNlZCBhbHNvIGFzCisgKgkgaW5wdXQgZXZlbnRzLgorICovCisKKy8qCisgKiBFdmVudCBjb2RlcyAweGYwIHRvIDB4ZmMgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKyAqLworCisjZGVmaW5lIFNFUV9GVUxMU0laRQkJMHhmZAkvKiBMb25nIGV2ZW50cyAqLworLyoKKyAqCVNFUV9GVUxMU0laRSBldmVudHMgYXJlIHVzZWQgZm9yIGxvYWRpbmcgcGF0Y2hlcy9zYW1wbGVzIHRvIHRoZQorICoJc3ludGhlc2l6ZXIgZGV2aWNlcy4gVGhlc2UgZXZlbnRzIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlcgorICoJb2YgdGhlIGFzc29jaWF0ZWQgc3ludGhlc2l6ZXIgZGV2aWNlLiBUaGVyZSBpcyBubyBsaW1pdCB0byB0aGUgc2l6ZQorICoJb2YgdGhlIGV4dGVuZGVkIGV2ZW50cy4gVGhlc2UgZXZlbnRzIGFyZSBub3QgcXVldWVkIGJ1dCBleGVjdXRlZAorICoJaW1tZWRpYXRlbHkgd2hlbiB0aGUgd3JpdGUoKSBpcyBjYWxsZWQgKGV4ZWN1dGlvbiBjYW4gdGFrZSBzZXZlcmFsCisgKglzZWNvbmRzIG9mIHRpbWUpLiAKKyAqCisgKglXaGVuIGEgU0VRX0ZVTExTSVpFIG1lc3NhZ2UgaXMgd3JpdHRlbiB0byB0aGUgZGV2aWNlLCBpdCBtdXN0CisgKgliZSB3cml0dGVuIHVzaW5nIGV4YWN0bHkgb25lIHdyaXRlKCkgY2FsbC4gT3RoZXIgZXZlbnRzIGNhbm5vdAorICoJYmUgbWl4ZWQgdG8gdGhlIHNhbWUgd3JpdGUuCisgKgkKKyAqCUZvciBGTSBzeW50aHMgKFlNMzgxMi9PUEwzKSB1c2Ugc3RydWN0IHNiaV9pbnN0cnVtZW50IGFuZCB3cml0ZSBpdCB0byB0aGUgCisgKgkvZGV2L3NlcXVlbmNlci4gRG9uJ3Qgd3JpdGUgb3RoZXIgZGF0YSB0b2dldGhlciB3aXRoIHRoZSBpbnN0cnVtZW50IHN0cnVjdHVyZQorICoJU2V0IHRoZSBrZXkgZmllbGQgb2YgdGhlIHN0cnVjdHVyZSB0byBGTV9QQVRDSC4gVGhlIGRldmljZSBmaWVsZCBpcyB1c2VkIHRvCisgKglyb3V0ZSB0aGUgcGF0Y2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlLgorICoKKyAqCUZvciB3YXZlIHRhYmxlIHVzZSBzdHJ1Y3QgcGF0Y2hfaW5mby4gSW5pdGlhbGl6ZSB0aGUga2V5IGZpZWxkCisgKiAgICAgIHRvIFdBVkVfUEFUQ0guCisgKi8KKyNkZWZpbmUgU0VRX1BSSVZBVEUJCTB4ZmUJLyogTG93IGxldmVsIEhXIGRlcGVuZGVudCBldmVudHMgKDggYnl0ZXMpICovCisjZGVmaW5lIFNFUV9FWFRFTkRFRAkJMHhmZgkvKiBFeHRlbmRlZCBldmVudHMgKDggYnl0ZXMpIE9CU09MRVRFICovCisKKy8qCisgKiBSZWNvcmQgZm9yIEZNIHBhdGNoZXMKKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc2JpX2luc3RyX2RhdGFbMzJdOworCitzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgeworCQl1bnNpZ25lZCBzaG9ydAlrZXk7CS8qIEZNX1BBVENIIG9yIE9QTDNfUEFUQ0ggKi8KKyNkZWZpbmUgRk1fUEFUQ0gJX1BBVENIS0VZKDB4MDEpCisjZGVmaW5lIE9QTDNfUEFUQ0gJX1BBVENIS0VZKDB4MDMpCisJCXNob3J0CQlkZXZpY2U7CQkvKglTeW50aCMgKDAtNCkJKi8KKwkJaW50IAkJY2hhbm5lbDsJLyoJUHJvZ3JhbSMgdG8gYmUgaW5pdGlhbGl6ZWQgCSovCisJCXNiaV9pbnN0cl9kYXRhCW9wZXJhdG9yczsJLyoJUmVnaXN0ZXIgc2V0dGluZ3MgZm9yIG9wZXJhdG9yIGNlbGxzICguU0JJIGZvcm1hdCkJKi8KKwl9OworCitzdHJ1Y3Qgc3ludGhfaW5mbyB7CS8qIFJlYWQgb25seSAqLworCQljaGFyCW5hbWVbMzBdOworCQlpbnQJZGV2aWNlOwkJLyogMC1OLiBJTklUSUFMSVpFIEJFRk9SRSBDQUxMSU5HICovCisJCWludAlzeW50aF90eXBlOworI2RlZmluZSBTWU5USF9UWVBFX0ZNCQkJMAorI2RlZmluZSBTWU5USF9UWVBFX1NBTVBMRQkJMQorI2RlZmluZSBTWU5USF9UWVBFX01JREkJCQkyCS8qIE1pZGkgaW50ZXJmYWNlICovCisKKwkJaW50CXN5bnRoX3N1YnR5cGU7CisjZGVmaW5lIEZNX1RZUEVfQURMSUIJCQkweDAwCisjZGVmaW5lIEZNX1RZUEVfT1BMMwkJCTB4MDEKKyNkZWZpbmUgTUlESV9UWVBFX01QVTQwMQkJMHg0MDEKKworI2RlZmluZSBTQU1QTEVfVFlQRV9CQVNJQwkJMHgxMAorI2RlZmluZSBTQU1QTEVfVFlQRV9HVVMJCQlTQU1QTEVfVFlQRV9CQVNJQworI2RlZmluZSBTQU1QTEVfVFlQRV9XQVZFRlJPTlQgICAgICAgICAgIDB4MTEKKworCQlpbnQJcGVyY19tb2RlOwkvKiBObyBsb25nZXIgc3VwcG9ydGVkICovCisJCWludAlucl92b2ljZXM7CisJCWludAlucl9kcnVtczsJLyogT2Jzb2xldGUgZmllbGQgKi8KKwkJaW50CWluc3RyX2Jhbmtfc2l6ZTsKKwkJdW5zaWduZWQgaW50CWNhcGFiaWxpdGllczsJCisjZGVmaW5lIFNZTlRIX0NBUF9QRVJDTU9ERQkJMHgwMDAwMDAwMSAvKiBObyBsb25nZXIgdXNlZCAqLworI2RlZmluZSBTWU5USF9DQVBfT1BMMwkJCTB4MDAwMDAwMDIgLyogU2V0IGlmIE9QTDMgc3VwcG9ydGVkICovCisjZGVmaW5lIFNZTlRIX0NBUF9JTlBVVAkJCTB4MDAwMDAwMDQgLyogSW5wdXQgKE1JREkpIGRldmljZSAqLworCQlpbnQJZHVtbWllc1sxOV07CS8qIFJlc2VydmUgc3BhY2UgKi8KKwl9OworCitzdHJ1Y3Qgc291bmRfdGltZXJfaW5mbyB7CisJCWNoYXIgbmFtZVszMl07CisJCWludCBjYXBzOworCX07CisKKyNkZWZpbmUgTUlESV9DQVBfTVBVNDAxCQkxCQkvKiBNUFUtNDAxIGludGVsbGlnZW50IG1vZGUgKi8KKworc3RydWN0IG1pZGlfaW5mbyB7CisJCWNoYXIJCW5hbWVbMzBdOworCQlpbnQJCWRldmljZTsJCS8qIDAtTi4gSU5JVElBTElaRSBCRUZPUkUgQ0FMTElORyAqLworCQl1bnNpZ25lZCBpbnQJY2FwYWJpbGl0aWVzOwkvKiBUbyBiZSBkZWZpbmVkIGxhdGVyICovCisJCWludAkJZGV2X3R5cGU7CisJCWludAkJZHVtbWllc1sxOF07CS8qIFJlc2VydmUgc3BhY2UgKi8KKwl9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlvY3RsIGNvbW1hbmRzIGZvciB0aGUgL2Rldi9taWRpIyMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGNtZDsKKwkJY2hhciBucl9hcmdzLCBucl9yZXR1cm5zOworCQl1bnNpZ25lZCBjaGFyIGRhdGFbMzBdOworCX0gbXB1X2NvbW1hbmRfcmVjOworCisjZGVmaW5lIFNORENUTF9NSURJX1BSRVRJTUUJCV9TSU9XUignbScsIDAsIGludCkKKyNkZWZpbmUgU05EQ1RMX01JRElfTVBVTU9ERQkJX1NJT1dSKCdtJywgMSwgaW50KQorI2RlZmluZSBTTkRDVExfTUlESV9NUFVDTUQJCV9TSU9XUignbScsIDIsIG1wdV9jb21tYW5kX3JlYykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBjb21tYW5kcyBmb3IgL2Rldi9kc3AgYW5kIC9kZXYvYXVkaW8KKyAqLworCisjZGVmaW5lIFNORENUTF9EU1BfUkVTRVQJCV9TSU8gICgnUCcsIDApCisjZGVmaW5lIFNORENUTF9EU1BfU1lOQwkJCV9TSU8gICgnUCcsIDEpCisjZGVmaW5lIFNORENUTF9EU1BfU1BFRUQJCV9TSU9XUignUCcsIDIsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9TVEVSRU8JCV9TSU9XUignUCcsIDMsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRCTEtTSVpFCQlfU0lPV1IoJ1AnLCA0LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0FNUExFU0laRQkJU05EQ1RMX0RTUF9TRVRGTVQKKyNkZWZpbmUgU05EQ1RMX0RTUF9DSEFOTkVMUwkJX1NJT1dSKCdQJywgNiwgaW50KQorI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMJU05EQ1RMX0RTUF9DSEFOTkVMUworI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSCQlfU0lPV1IoJ1AnLCA3LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfUE9TVAkJCV9TSU8gICgnUCcsIDgpCisjZGVmaW5lIFNORENUTF9EU1BfU1VCRElWSURFCQlfU0lPV1IoJ1AnLCA5LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VURlJBR01FTlQJCV9TSU9XUignUCcsMTAsIGludCkKKworLyoJQXVkaW8gZGF0YSBmb3JtYXRzIChOb3RlISBVOD04IGFuZCBTMTZfTEU9MTYgZm9yIGNvbXBhdGliaWxpdHkpICovCisjZGVmaW5lIFNORENUTF9EU1BfR0VURk1UUwkJX1NJT1IgKCdQJywxMSwgaW50KSAvKiBSZXR1cm5zIGEgbWFzayAqLworI2RlZmluZSBTTkRDVExfRFNQX1NFVEZNVAkJX1NJT1dSKCdQJyw1LCBpbnQpIC8qIFNlbGVjdHMgT05FIGZtdCovCisjCWRlZmluZSBBRk1UX1FVRVJZCQkweDAwMDAwMDAwCS8qIFJldHVybiBjdXJyZW50IGZtdCAqLworIwlkZWZpbmUgQUZNVF9NVV9MQVcJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIEFGTVRfQV9MQVcJCTB4MDAwMDAwMDIKKyMJZGVmaW5lIEFGTVRfSU1BX0FEUENNCQkweDAwMDAwMDA0CisjCWRlZmluZSBBRk1UX1U4CQkJMHgwMDAwMDAwOAorIwlkZWZpbmUgQUZNVF9TMTZfTEUJCTB4MDAwMDAwMTAJLyogTGl0dGxlIGVuZGlhbiBzaWduZWQgMTYqLworIwlkZWZpbmUgQUZNVF9TMTZfQkUJCTB4MDAwMDAwMjAJLyogQmlnIGVuZGlhbiBzaWduZWQgMTYgKi8KKyMJZGVmaW5lIEFGTVRfUzgJCQkweDAwMDAwMDQwCisjCWRlZmluZSBBRk1UX1UxNl9MRQkJMHgwMDAwMDA4MAkvKiBMaXR0bGUgZW5kaWFuIFUxNiAqLworIwlkZWZpbmUgQUZNVF9VMTZfQkUJCTB4MDAwMDAxMDAJLyogQmlnIGVuZGlhbiBVMTYgKi8KKyMJZGVmaW5lIEFGTVRfTVBFRwkJMHgwMDAwMDIwMAkvKiBNUEVHICgyKSBhdWRpbyAqLworIwlkZWZpbmUgQUZNVF9BQzMJCTB4MDAwMDA0MDAJLyogRG9sYnkgRGlnaXRhbCBBQzMgKi8KKworLyoKKyAqIEJ1ZmZlciBzdGF0dXMgcXVlcmllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fYnVmX2luZm8geworCQkJaW50IGZyYWdtZW50czsJLyogIyBvZiBhdmFpbGFibGUgZnJhZ21lbnRzIChwYXJ0aWFsbHkgdXNlbmQgb25lcyBub3QgY291bnRlZCkgKi8KKwkJCWludCBmcmFnc3RvdGFsOwkvKiBUb3RhbCAjIG9mIGZyYWdtZW50cyBhbGxvY2F0ZWQgKi8KKwkJCWludCBmcmFnc2l6ZTsJLyogU2l6ZSBvZiBhIGZyYWdtZW50IGluIGJ5dGVzICovCisKKwkJCWludCBieXRlczsJLyogQXZhaWxhYmxlIHNwYWNlIGluIGJ5dGVzIChpbmNsdWRlcyBwYXJ0aWFsbHkgdXNlZCBmcmFnbWVudHMpICovCisJCQkvKiBOb3RlISAnYnl0ZXMnIGNvdWxkIGJlIG1vcmUgdGhhbiBmcmFnbWVudHMqZnJhZ3NpemUgKi8KKwkJfSBhdWRpb19idWZfaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVE9TUEFDRQkJX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUSVNQQUNFCQlfU0lPUiAoJ1AnLDEzLCBhdWRpb19idWZfaW5mbykKKyNkZWZpbmUgU05EQ1RMX0RTUF9OT05CTE9DSwkJX1NJTyAgKCdQJywxNCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRDQVBTCQlfU0lPUiAoJ1AnLDE1LCBpbnQpCisjCWRlZmluZSBEU1BfQ0FQX1JFVklTSU9OCQkweDAwMDAwMGZmCS8qIEJpdHMgZm9yIHJldmlzaW9uIGxldmVsICgwIHRvIDI1NSkgKi8KKyMJZGVmaW5lIERTUF9DQVBfRFVQTEVYCQkweDAwMDAwMTAwCS8qIEZ1bGwgZHVwbGV4IHJlY29yZC9wbGF5YmFjayAqLworIwlkZWZpbmUgRFNQX0NBUF9SRUFMVElNRQkJMHgwMDAwMDIwMAkvKiBSZWFsIHRpbWUgY2FwYWJpbGl0eSAqLworIwlkZWZpbmUgRFNQX0NBUF9CQVRDSAkJMHgwMDAwMDQwMAkvKiBEZXZpY2UgaGFzIHNvbWUga2luZCBvZiAqLworCQkJCQkJCS8qIGludGVybmFsIGJ1ZmZlcnMgd2hpY2ggbWF5ICovCisJCQkJCQkJLyogY2F1c2Ugc29tZSBkZWxheXMgYW5kICovCisJCQkJCQkJLyogZGVjcmVhc2UgcHJlY2lzaW9uIG9mIHRpbWluZyAqLworIwlkZWZpbmUgRFNQX0NBUF9DT1BST0MJCTB4MDAwMDA4MDAJLyogSGFzIGEgY29wcm9jZXNzb3IgKi8KKwkJCQkJCQkvKiBTb21ldGltZXMgaXQncyBhIERTUCAqLworCQkJCQkJCS8qIGJ1dCB1c3VhbGx5IG5vdCAqLworIwlkZWZpbmUgRFNQX0NBUF9UUklHR0VSCQkweDAwMDAxMDAwCS8qIFN1cHBvcnRzIFNFVFRSSUdHRVIgKi8KKyMJZGVmaW5lIERTUF9DQVBfTU1BUAkJMHgwMDAwMjAwMAkvKiBTdXBwb3J0cyBtbWFwKCkgKi8KKyMJZGVmaW5lIERTUF9DQVBfTVVMVEkJCTB4MDAwMDQwMDAJLyogc3VwcG9ydCBtdWx0aXBsZSBvcGVuICovCisjCWRlZmluZSBEU1BfQ0FQX0JJTkQJCTB4MDAwMDgwMDAJLyogY2hhbm5lbCBiaW5kaW5nIHRvIGZyb250L3JlYXIvY25ldGVyL2xmZSAqLworCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRUUklHR0VSCQlfU0lPUiAoJ1AnLDE2LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfU0VUVFJJR0dFUgkJX1NJT1cgKCdQJywxNiwgaW50KQorIwlkZWZpbmUgUENNX0VOQUJMRV9JTlBVVAkJMHgwMDAwMDAwMQorIwlkZWZpbmUgUENNX0VOQUJMRV9PVVRQVVQJCTB4MDAwMDAwMDIKKwordHlwZWRlZiBzdHJ1Y3QgY291bnRfaW5mbyB7CisJCWludCBieXRlczsJLyogVG90YWwgIyBvZiBieXRlcyBwcm9jZXNzZWQgKi8KKwkJaW50IGJsb2NrczsJLyogIyBvZiBmcmFnbWVudCB0cmFuc2l0aW9ucyBzaW5jZSBsYXN0IHRpbWUgKi8KKwkJaW50IHB0cjsJLyogQ3VycmVudCBETUEgcG9pbnRlciB2YWx1ZSAqLworCX0gY291bnRfaW5mbzsKKworI2RlZmluZSBTTkRDVExfRFNQX0dFVElQVFIJCV9TSU9SICgnUCcsMTcsIGNvdW50X2luZm8pCisjZGVmaW5lIFNORENUTF9EU1BfR0VUT1BUUgkJX1NJT1IgKCdQJywxOCwgY291bnRfaW5mbykKKwordHlwZWRlZiBzdHJ1Y3QgYnVmZm1lbV9kZXNjIHsKKwkJdW5zaWduZWQgKmJ1ZmZlcjsKKwkJaW50IHNpemU7CisJfSBidWZmbWVtX2Rlc2M7CisjZGVmaW5lIFNORENUTF9EU1BfTUFQSU5CVUYJCV9TSU9SICgnUCcsIDE5LCBidWZmbWVtX2Rlc2MpCisjZGVmaW5lIFNORENUTF9EU1BfTUFQT1VUQlVGCQlfU0lPUiAoJ1AnLCAyMCwgYnVmZm1lbV9kZXNjKQorI2RlZmluZSBTTkRDVExfRFNQX1NFVFNZTkNSTwkJX1NJTyAgKCdQJywgMjEpCisjZGVmaW5lIFNORENUTF9EU1BfU0VURFVQTEVYCQlfU0lPICAoJ1AnLCAyMikKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRPREVMQVkJCV9TSU9SICgnUCcsIDIzLCBpbnQpCisKKyNkZWZpbmUgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSwkJX1NJT1dSKCdQJywgNjQsIGludCkKKyNkZWZpbmUgU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwJCV9TSU9XUignUCcsIDY1LCBpbnQpCisjCWRlZmluZSBEU1BfQklORF9RVUVSWQkJMHgwMDAwMDAwMAorIwlkZWZpbmUgRFNQX0JJTkRfRlJPTlQJCTB4MDAwMDAwMDEKKyMJZGVmaW5lIERTUF9CSU5EX1NVUlIJCTB4MDAwMDAwMDIKKyMJZGVmaW5lIERTUF9CSU5EX0NFTlRFUl9MRkUJMHgwMDAwMDAwNAorIwlkZWZpbmUgRFNQX0JJTkRfSEFORFNFVAkJMHgwMDAwMDAwOAorIwlkZWZpbmUgRFNQX0JJTkRfTUlDCQkweDAwMDAwMDEwCisjCWRlZmluZSBEU1BfQklORF9NT0RFTTEJCTB4MDAwMDAwMjAKKyMJZGVmaW5lIERTUF9CSU5EX01PREVNMgkJMHgwMDAwMDA0MAorIwlkZWZpbmUgRFNQX0JJTkRfSTJTCQkweDAwMDAwMDgwCisjCWRlZmluZSBEU1BfQklORF9TUERJRgkJMHgwMDAwMDEwMAorCisjZGVmaW5lIFNORENUTF9EU1BfU0VUU1BESUYJCV9TSU9XICgnUCcsIDY2LCBpbnQpCisjZGVmaW5lIFNORENUTF9EU1BfR0VUU1BESUYJCV9TSU9SICgnUCcsIDY3LCBpbnQpCisjCWRlZmluZSBTUERJRl9QUk8JMHgwMDAxCisjCWRlZmluZSBTUERJRl9OX0FVRAkweDAwMDIKKyMJZGVmaW5lIFNQRElGX0NPUFkJMHgwMDA0CisjCWRlZmluZSBTUERJRl9QUkUJMHgwMDA4CisjCWRlZmluZSBTUERJRl9DQwkJMHgwN2YwCisjCWRlZmluZSBTUERJRl9MCQkweDA4MDAKKyMJZGVmaW5lIFNQRElGX0RSUwkweDQwMDAKKyMJZGVmaW5lIFNQRElGX1YJCTB4ODAwMAorCisvKgorICogQXBwbGljYXRpb24ncyBwcm9maWxlIGRlZmluZXMgdGhlIHdheSBob3cgcGxheWJhY2sgdW5kZXJydW4gc2l0dWF0aW9ucyBzaG91bGQgYmUgaGFuZGxlZC4KKyAqIAorICoJQVBGX05PUk1BTCAodGhlIGRlZmF1bHQpIGFuZCBBUEZfTkVUV09SSyBtYWtlIHRoZSBkcml2ZXIgdG8gY2xlYW51cCB0aGUKKyAqCXBsYXliYWNrIGJ1ZmZlciB3aGVuZXZlciBhbiB1bmRlcnJ1biBvY2N1cnMuIFRoaXMgY29uc3VtZXMgc29tZSB0aW1lCisgKglwcmV2ZW50cyBsb29waW5nIHRoZSBleGlzdGluZyBidWZmZXIuCisgKglBUEZfQ1BVSU5URU5TIGlzIGludGVuZGVkIHRvIGJlIHNldCBieSBDUFUgaW50ZW5zaXZlIGFwcGxpY2F0aW9ucyB3aGljaAorICoJYXJlIGxpa2VseSB0byBydW4gb3V0IG9mIHRpbWUgb2NjYXNpb25hbGx5LiBJbiB0aGlzIG1vZGUgdGhlIGJ1ZmZlciBjbGVhbnVwIGlzCisgKglkaXNhYmxlZCB3aGljaCBzYXZlcyBDUFUgdGltZSBidXQgYWxzbyBsZXQncyB0aGUgcHJldmlvdXMgYnVmZmVyIGNvbnRlbnQgdG8KKyAqCWJlIHBsYXllZCBkdXJpbmcgdGhlICJwYXVzZSIgYWZ0ZXIgdGhlIHVuZGVycnVuLgorICovCisjZGVmaW5lIFNORENUTF9EU1BfUFJPRklMRQkJX1NJT1cgKCdQJywgMjMsIGludCkKKyNkZWZpbmUJICBBUEZfTk9STUFMCTAJLyogTm9ybWFsIGFwcGxpY2F0aW9ucyAqLworI2RlZmluZQkgIEFQRl9ORVRXT1JLCTEJLyogVW5kZXJydW5zIHByb2JhYmx5IGNhdXNlZCBieSBhbiAiZXh0ZXJuYWwiIGRlbGF5ICovCisjZGVmaW5lICAgQVBGX0NQVUlOVEVOUyAyCS8qIFVuZGVycnVucyBwcm9iYWJseSBjYXVzZWQgYnkgIm92ZXJoZWF0aW5nIiB0aGUgQ1BVICovCisKKyNkZWZpbmUgU09VTkRfUENNX1JFQURfUkFURQkJX1NJT1IgKCdQJywgMiwgaW50KQorI2RlZmluZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUwkJX1NJT1IgKCdQJywgNiwgaW50KQorI2RlZmluZSBTT1VORF9QQ01fUkVBRF9CSVRTCQlfU0lPUiAoJ1AnLCA1LCBpbnQpCisjZGVmaW5lIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUgkJX1NJT1IgKCdQJywgNywgaW50KQorCisvKiBTb21lIGFsaWFzIG5hbWVzICovCisjZGVmaW5lIFNPVU5EX1BDTV9XUklURV9CSVRTCQlTTkRDVExfRFNQX1NFVEZNVAorI2RlZmluZSBTT1VORF9QQ01fV1JJVEVfUkFURQkJU05EQ1RMX0RTUF9TUEVFRAorI2RlZmluZSBTT1VORF9QQ01fUE9TVAkJCVNORENUTF9EU1BfUE9TVAorI2RlZmluZSBTT1VORF9QQ01fUkVTRVQJCQlTTkRDVExfRFNQX1JFU0VUCisjZGVmaW5lIFNPVU5EX1BDTV9TWU5DCQkJU05EQ1RMX0RTUF9TWU5DCisjZGVmaW5lIFNPVU5EX1BDTV9TVUJESVZJREUJCVNORENUTF9EU1BfU1VCRElWSURFCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRGUkFHTUVOVAkJU05EQ1RMX0RTUF9TRVRGUkFHTUVOVAorI2RlZmluZSBTT1VORF9QQ01fR0VURk1UUwkJU05EQ1RMX0RTUF9HRVRGTVRTCisjZGVmaW5lIFNPVU5EX1BDTV9TRVRGTVQJCVNORENUTF9EU1BfU0VURk1UCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRPU1BBQ0UJCVNORENUTF9EU1BfR0VUT1NQQUNFCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRJU1BBQ0UJCVNORENUTF9EU1BfR0VUSVNQQUNFCisjZGVmaW5lIFNPVU5EX1BDTV9OT05CTE9DSwkJU05EQ1RMX0RTUF9OT05CTE9DSworI2RlZmluZSBTT1VORF9QQ01fR0VUQ0FQUwkJU05EQ1RMX0RTUF9HRVRDQVBTCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRUUklHR0VSCQlTTkRDVExfRFNQX0dFVFRSSUdHRVIKKyNkZWZpbmUgU09VTkRfUENNX1NFVFRSSUdHRVIJCVNORENUTF9EU1BfU0VUVFJJR0dFUgorI2RlZmluZSBTT1VORF9QQ01fU0VUU1lOQ1JPCQlTTkRDVExfRFNQX1NFVFNZTkNSTworI2RlZmluZSBTT1VORF9QQ01fR0VUSVBUUgkJU05EQ1RMX0RTUF9HRVRJUFRSCisjZGVmaW5lIFNPVU5EX1BDTV9HRVRPUFRSCQlTTkRDVExfRFNQX0dFVE9QVFIKKyNkZWZpbmUgU09VTkRfUENNX01BUElOQlVGCQlTTkRDVExfRFNQX01BUElOQlVGCisjZGVmaW5lIFNPVU5EX1BDTV9NQVBPVVRCVUYJCVNORENUTF9EU1BfTUFQT1VUQlVGCisKKy8qCisgKiBpb2N0bCBjYWxscyB0byBiZSB1c2VkIGluIGNvbW11bmljYXRpb24gd2l0aCBjb3Byb2Nlc3NvcnMgYW5kCisgKiBEU1AgY2hpcHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29wcl9idWZmZXIgeworCQlpbnQgY29tbWFuZDsJLyogU2V0IHRvIDAgaWYgbm90IHVzZWQgKi8KKwkJaW50IGZsYWdzOworI2RlZmluZSBDUEZfTk9ORQkJMHgwMDAwCisjZGVmaW5lIENQRl9GSVJTVAkJMHgwMDAxCS8qIEZpcnN0IGJsb2NrICovCisjZGVmaW5lIENQRl9MQVNUCQkweDAwMDIJLyogTGFzdCBibG9jayAqLworCQlpbnQgbGVuOworCQlpbnQgb2ZmczsJLyogSWYgcmVxdWlyZWQgYnkgdGhlIGRldmljZSAoMCBpZiBub3QgdXNlZCkgKi8KKworCQl1bnNpZ25lZCBjaGFyIGRhdGFbNDAwMF07IC8qIE5PVEUhIDQwMDAgaXMgbm90IDRrICovCisJfSBjb3ByX2J1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgY29wcl9kZWJ1Z19idWYgeworCQlpbnQgY29tbWFuZDsJLyogVXNlZCBpbnRlcm5hbGx5LiBTZXQgdG8gMCAqLworCQlpbnQgcGFybTE7CisJCWludCBwYXJtMjsKKwkJaW50IGZsYWdzOwkKKwkJaW50IGxlbjsJLyogTGVuZ3RoIG9mIGRhdGEgaW4gYnl0ZXMgKi8KKwl9IGNvcHJfZGVidWdfYnVmOworCit0eXBlZGVmIHN0cnVjdCBjb3ByX21zZyB7CisJCWludCBsZW47CisJCXVuc2lnbmVkIGNoYXIgZGF0YVs0MDAwXTsKKwl9IGNvcHJfbXNnOworCisjZGVmaW5lIFNORENUTF9DT1BSX1JFU0VUICAgICAgICAgICAgIF9TSU8gICgnQycsICAwKQorI2RlZmluZSBTTkRDVExfQ09QUl9MT0FECSAgICAgIF9TSU9XUignQycsICAxLCBjb3ByX2J1ZmZlcikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfUkRBVEEJICAgICAgX1NJT1dSKCdDJywgIDIsIGNvcHJfZGVidWdfYnVmKQorI2RlZmluZSBTTkRDVExfQ09QUl9SQ09ERQkgICAgICBfU0lPV1IoJ0MnLCAgMywgY29wcl9kZWJ1Z19idWYpCisjZGVmaW5lIFNORENUTF9DT1BSX1dEQVRBCSAgICAgIF9TSU9XICgnQycsICA0LCBjb3ByX2RlYnVnX2J1ZikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfV0NPREUJICAgICAgX1NJT1cgKCdDJywgIDUsIGNvcHJfZGVidWdfYnVmKQorI2RlZmluZSBTTkRDVExfQ09QUl9SVU4JCSAgICAgIF9TSU9XUignQycsICA2LCBjb3ByX2RlYnVnX2J1ZikKKyNkZWZpbmUgU05EQ1RMX0NPUFJfSEFMVAkgICAgICBfU0lPV1IoJ0MnLCAgNywgY29wcl9kZWJ1Z19idWYpCisjZGVmaW5lIFNORENUTF9DT1BSX1NFTkRNU0cJICAgICAgX1NJT1dSKCdDJywgIDgsIGNvcHJfbXNnKQorI2RlZmluZSBTTkRDVExfQ09QUl9SQ1ZNU0cJICAgICAgX1NJT1IgKCdDJywgIDksIGNvcHJfbXNnKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJT0NUTCBjb21tYW5kcyBmb3IgL2Rldi9taXhlcgorICovCisJCisvKiAKKyAqIE1peGVyIGRldmljZXMKKyAqCisgKiBUaGVyZSBjYW4gYmUgdXAgdG8gMjAgZGlmZmVyZW50IGFuYWxvZyBtaXhlciBjaGFubmVscy4gVGhlCisgKiBTT1VORF9NSVhFUl9OUkRFVklDRVMgZ2l2ZXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgbWF4aW11bS4gCisgKiBUaGUgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLIHJldHVybnMgYSBiaXRtYXNrIHdoaWNoIHRlbGxzCisgKiB0aGUgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgbWl4ZXIuCisgKi8KKworI2RlZmluZSBTT1VORF9NSVhFUl9OUkRFVklDRVMJMjUKKyNkZWZpbmUgU09VTkRfTUlYRVJfVk9MVU1FCTAKKyNkZWZpbmUgU09VTkRfTUlYRVJfQkFTUwkxCisjZGVmaW5lIFNPVU5EX01JWEVSX1RSRUJMRQkyCisjZGVmaW5lIFNPVU5EX01JWEVSX1NZTlRICTMKKyNkZWZpbmUgU09VTkRfTUlYRVJfUENNCQk0CisjZGVmaW5lIFNPVU5EX01JWEVSX1NQRUFLRVIJNQorI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FCTYKKyNkZWZpbmUgU09VTkRfTUlYRVJfTUlDCQk3CisjZGVmaW5lIFNPVU5EX01JWEVSX0NECQk4CisjZGVmaW5lIFNPVU5EX01JWEVSX0lNSVgJOQkvKiAgUmVjb3JkaW5nIG1vbml0b3IgICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0FMVFBDTQkxMAorI2RlZmluZSBTT1VORF9NSVhFUl9SRUNMRVYJMTEJLyogUmVjb3JkaW5nIGxldmVsICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0lHQUlOCTEyCS8qIElucHV0IGdhaW4gKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfT0dBSU4JMTMJLyogT3V0cHV0IGdhaW4gKi8KKy8qIAorICogVGhlIEFEMTg0OCBjb2RlYyBhbmQgY29tcGF0aWJsZXMgaGF2ZSB0aHJlZSBsaW5lIGxldmVsIGlucHV0cworICogKGxpbmUsIGF1eDEgYW5kIGF1eDIpLiBTaW5jZSBlYWNoIGNhcmQgbWFudWZhY3R1cmVyIGhhdmUgYXNzaWduZWQKKyAqIGRpZmZlcmVudCBtZWFuaW5ncyB0byB0aGVzZSBpbnB1dHMsIGl0J3MgaW5wcmFjdGljYWwgdG8gYXNzaWduCisgKiBzcGVjaWZpYyBtZWFuaW5ncyAobGluZSwgY2QsIHN5bnRoIGV0Yy4pIHRvIHRoZW0uCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfTElORTEJMTQJLyogSW5wdXQgc291cmNlIDEgIChhdXgxKSAqLworI2RlZmluZSBTT1VORF9NSVhFUl9MSU5FMgkxNQkvKiBJbnB1dCBzb3VyY2UgMiAgKGF1eDIpICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0xJTkUzCTE2CS8qIElucHV0IHNvdXJjZSAzICAobGluZSkgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDEJMTcJLyogRGlnaXRhbCAoaW5wdXQpIDEgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDIJMTgJLyogRGlnaXRhbCAoaW5wdXQpIDIgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfRElHSVRBTDMJMTkJLyogRGlnaXRhbCAoaW5wdXQpIDMgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfUEhPTkVJTgkyMAkvKiBQaG9uZSBpbnB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9QSE9ORU9VVAkyMQkvKiBQaG9uZSBvdXRwdXQgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfVklERU8JMjIJLyogVmlkZW8vVFYgKGF1ZGlvKSBpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9SQURJTwkyMwkvKiBSYWRpbyBpbiAqLworI2RlZmluZSBTT1VORF9NSVhFUl9NT05JVE9SCTI0CS8qIE1vbml0b3IgKHVzdWFsbHkgbWljKSB2b2x1bWUgKi8KKworLyogU29tZSBvbi9vZmYgc2V0dGluZ3MgKFNPVU5EX1NQRUNJQUxfTUlOIC0gU09VTkRfU1BFQ0lBTF9NQVgpICovCisvKiBOb3QgY291bnRlZCB0byBTT1VORF9NSVhFUl9OUkRFVklDRVMsIGJ1dCB1c2UgdGhlIHNhbWUgbnVtYmVyIHNwYWNlICovCisjZGVmaW5lIFNPVU5EX09OT0ZGX01JTgkJMjgKKyNkZWZpbmUgU09VTkRfT05PRkZfTUFYCQkzMAorCisvKiBOb3RlIQlOdW1iZXIgMzEgY2Fubm90IGJlIHVzZWQgc2luY2UgdGhlIHNpZ24gYml0IGlzIHJlc2VydmVkICovCisjZGVmaW5lIFNPVU5EX01JWEVSX05PTkUJMzEKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdW5zdXBwb3J0ZWQgbWFjcm9zIGFyZSBubyBsb25nZXIgZnVuY3Rpb25hbC4KKyAqIFVzZSBTT1VORF9NSVhFUl9QUklWQVRFIyBtYWNyb3MgaW4gZnV0dXJlLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX0VOSEFOQ0UJU09VTkRfTUlYRVJfTk9ORQorI2RlZmluZSBTT1VORF9NSVhFUl9NVVRFCVNPVU5EX01JWEVSX05PTkUKKyNkZWZpbmUgU09VTkRfTUlYRVJfTE9VRAlTT1VORF9NSVhFUl9OT05FCisKKworI2RlZmluZSBTT1VORF9ERVZJQ0VfTEFCRUxTCXsiVm9sICAiLCAiQmFzcyAiLCAiVHJlYmwiLCAiU3ludGgiLCAiUGNtICAiLCAiU3BrciAiLCAiTGluZSAiLCBcCisJCQkJICJNaWMgICIsICJDRCAgICIsICJNaXggICIsICJQY20yICIsICJSZWMgICIsICJJR2FpbiIsICJPR2FpbiIsIFwKKwkJCQkgIkxpbmUxIiwgIkxpbmUyIiwgIkxpbmUzIiwgIkRpZ2l0YWwxIiwgIkRpZ2l0YWwyIiwgIkRpZ2l0YWwzIiwgXAorCQkJCSAiUGhvbmVJbiIsICJQaG9uZU91dCIsICJWaWRlbyIsICJSYWRpbyIsICJNb25pdG9yIn0KKworI2RlZmluZSBTT1VORF9ERVZJQ0VfTkFNRVMJeyJ2b2wiLCAiYmFzcyIsICJ0cmVibGUiLCAic3ludGgiLCAicGNtIiwgInNwZWFrZXIiLCAibGluZSIsIFwKKwkJCQkgIm1pYyIsICJjZCIsICJtaXgiLCAicGNtMiIsICJyZWMiLCAiaWdhaW4iLCAib2dhaW4iLCBcCisJCQkJICJsaW5lMSIsICJsaW5lMiIsICJsaW5lMyIsICJkaWcxIiwgImRpZzIiLCAiZGlnMyIsIFwKKwkJCQkgInBoaW4iLCAicGhvdXQiLCAidmlkZW8iLCAicmFkaW8iLCAibW9uaXRvciJ9CisKKy8qCURldmljZSBiaXRtYXNrIGlkZW50aWZpZXJzCSovCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVDU1JDCTB4ZmYJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfREVWTUFTSwkweGZlCS8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQ01BU0sJMHhmZAkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfQ0FQUwkweGZjCisjCWRlZmluZSBTT1VORF9DQVBfRVhDTF9JTlBVVAkweDAwMDAwMDAxCS8qIE9ubHkgb25lIHJlY29yZGluZyBzb3VyY2UgYXQgYSB0aW1lICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1NURVJFT0RFVlMJMHhmYgkvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PVVRTUkMJMHhmYQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggaW5wdXQgc291cmNlIHRvIG91dHB1dCAqLworI2RlZmluZSBTT1VORF9NSVhFUl9PVVRNQVNLCTB4ZjkJLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCBpbnB1dCBzb3VyY2UgdG8gb3V0cHV0ICovCisKKy8qCURldmljZSBtYXNrIGJpdHMJKi8KKworI2RlZmluZSBTT1VORF9NQVNLX1ZPTFVNRQkoMSA8PCBTT1VORF9NSVhFUl9WT0xVTUUpCisjZGVmaW5lIFNPVU5EX01BU0tfQkFTUwkJKDEgPDwgU09VTkRfTUlYRVJfQkFTUykKKyNkZWZpbmUgU09VTkRfTUFTS19UUkVCTEUJKDEgPDwgU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NQVNLX1NZTlRICSgxIDw8IFNPVU5EX01JWEVSX1NZTlRIKQorI2RlZmluZSBTT1VORF9NQVNLX1BDTQkJKDEgPDwgU09VTkRfTUlYRVJfUENNKQorI2RlZmluZSBTT1VORF9NQVNLX1NQRUFLRVIJKDEgPDwgU09VTkRfTUlYRVJfU1BFQUtFUikKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FCQkoMSA8PCBTT1VORF9NSVhFUl9MSU5FKQorI2RlZmluZSBTT1VORF9NQVNLX01JQwkJKDEgPDwgU09VTkRfTUlYRVJfTUlDKQorI2RlZmluZSBTT1VORF9NQVNLX0NECQkoMSA8PCBTT1VORF9NSVhFUl9DRCkKKyNkZWZpbmUgU09VTkRfTUFTS19JTUlYCQkoMSA8PCBTT1VORF9NSVhFUl9JTUlYKQorI2RlZmluZSBTT1VORF9NQVNLX0FMVFBDTQkoMSA8PCBTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01BU0tfUkVDTEVWCSgxIDw8IFNPVU5EX01JWEVSX1JFQ0xFVikKKyNkZWZpbmUgU09VTkRfTUFTS19JR0FJTgkoMSA8PCBTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUFTS19PR0FJTgkoMSA8PCBTT1VORF9NSVhFUl9PR0FJTikKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FMQkoMSA8PCBTT1VORF9NSVhFUl9MSU5FMSkKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FMgkoMSA8PCBTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUFTS19MSU5FMwkoMSA8PCBTT1VORF9NSVhFUl9MSU5FMykKKyNkZWZpbmUgU09VTkRfTUFTS19ESUdJVEFMMQkoMSA8PCBTT1VORF9NSVhFUl9ESUdJVEFMMSkKKyNkZWZpbmUgU09VTkRfTUFTS19ESUdJVEFMMgkoMSA8PCBTT1VORF9NSVhFUl9ESUdJVEFMMikKKyNkZWZpbmUgU09VTkRfTUFTS19ESUdJVEFMMwkoMSA8PCBTT1VORF9NSVhFUl9ESUdJVEFMMykKKyNkZWZpbmUgU09VTkRfTUFTS19QSE9ORUlOCSgxIDw8IFNPVU5EX01JWEVSX1BIT05FSU4pCisjZGVmaW5lIFNPVU5EX01BU0tfUEhPTkVPVVQJKDEgPDwgU09VTkRfTUlYRVJfUEhPTkVPVVQpCisjZGVmaW5lIFNPVU5EX01BU0tfUkFESU8JKDEgPDwgU09VTkRfTUlYRVJfUkFESU8pCisjZGVmaW5lIFNPVU5EX01BU0tfVklERU8JKDEgPDwgU09VTkRfTUlYRVJfVklERU8pCisjZGVmaW5lIFNPVU5EX01BU0tfTU9OSVRPUgkoMSA8PCBTT1VORF9NSVhFUl9NT05JVE9SKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUFTS19NVVRFCQkoMSA8PCBTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NQVNLX0VOSEFOQ0UJKDEgPDwgU09VTkRfTUlYRVJfRU5IQU5DRSkKKyNkZWZpbmUgU09VTkRfTUFTS19MT1VECQkoMSA8PCBTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIE1JWEVSX1JFQUQoZGV2KQkJX1NJT1IoJ00nLCBkZXYsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUUJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfVk9MVU1FKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0JBU1MJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQkFTUykKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9UUkVCTEUJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1NZTlRICQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NZTlRIKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1BDTQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9QQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfU1BFQUtFUglNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NQRUFLRVIpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTElORQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX01JQwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9NSUMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQ0QJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfQ0QpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfSU1JWAkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9JTUlYKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0FMVFBDTQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDTEVWCQlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ0xFVikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9JR0FJTgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9PR0FJTgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9PR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FMQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FMgkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9MSU5FMwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMykKKworLyogT2Jzb2xldGUgbWFjcm9zICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfTVVURQkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9NVVRFKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0VOSEFOQ0UJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX0xPVUQJCU1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTE9VRCkKKworI2RlZmluZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNTUkMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSwlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0RFVk1BU0spCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSwlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ01BU0spCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUwlNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NURVJFT0RFVlMpCisjZGVmaW5lIFNPVU5EX01JWEVSX1JFQURfQ0FQUwkJTUlYRVJfUkVBRChTT1VORF9NSVhFUl9DQVBTKQorCisjZGVmaW5lIE1JWEVSX1dSSVRFKGRldikJCV9TSU9XUignTScsIGRldiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVk9MVU1FKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9CQVNTCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9CQVNTKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9UUkVCTEUJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVFJFQkxFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9TWU5USAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfU1lOVEgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1BDTQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUENNKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1NQRUFLRVIpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX01JQwkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTUlDKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9DRAkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfQ0QpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0lNSVgJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0lNSVgpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9BTFRQQ00pCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFVglNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNMRVYpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0lHQUlOCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9JR0FJTikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4JCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX09HQUlOKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTElORTEpCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUyCQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MSU5FMikKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTElORTMJCU1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKQorCisvKiBPYnNvbGV0ZSBtYWNyb3MgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfTVVURQkJTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfTVVURSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfRU5IQU5DRQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9FTkhBTkNFKQorI2RlZmluZSBTT1VORF9NSVhFUl9XUklURV9MT1VECQlNSVhFUl9XUklURShTT1VORF9NSVhFUl9MT1VEKQorCisjZGVmaW5lIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQwlNSVhFUl9XUklURShTT1VORF9NSVhFUl9SRUNTUkMpCisKK3R5cGVkZWYgc3RydWN0IG1peGVyX2luZm8KK3sKKyAgY2hhciBpZFsxNl07CisgIGNoYXIgbmFtZVszMl07CisgIGludCAgbW9kaWZ5X2NvdW50ZXI7CisgIGludCBmaWxsZXJzWzEwXTsKK30gbWl4ZXJfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgX29sZF9taXhlcl9pbmZvIC8qIE9ic29sZXRlICovCit7CisgIGNoYXIgaWRbMTZdOworICBjaGFyIG5hbWVbMzJdOworfSBfb2xkX21peGVyX2luZm87CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfSU5GTwkJX1NJT1IgKCdNJywgMTAxLCBtaXhlcl9pbmZvKQorI2RlZmluZSBTT1VORF9PTERfTUlYRVJfSU5GTwkJX1NJT1IgKCdNJywgMTAxLCBfb2xkX21peGVyX2luZm8pCisKKy8qCisgKiBBIG1lY2hhbmlzbSBmb3IgYWNjZXNzaW5nICJwcm9wcmlldGFyeSIgbWl4ZXIgZmVhdHVyZXMuIFRoaXMgbWV0aG9kCisgKiBwZXJtaXRzIHBhc3NpbmcgMTI4IGJ5dGVzIG9mIGFyYml0cmFyeSBkYXRhIGJldHdlZW4gYSBtaXhlciBhcHBsaWNhdGlvbgorICogYW5kIHRoZSBtaXhlciBkcml2ZXIuIEludGVycHJldGF0aW9uIG9mIHRoZSByZWNvcmQgaXMgZGVmaW5lZCBieQorICogdGhlIHBhcnRpY3VsYXIgbWl4ZXIgZHJpdmVyLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgbWl4ZXJfcmVjb3JkWzEyOF07CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfQUNDRVNTCQlfU0lPV1IoJ00nLCAxMDIsIG1peGVyX3JlY29yZCkKKworLyoKKyAqIFR3byBpb2N0bHMgZm9yIHNwZWNpYWwgc291bmNhcmQgZnVuY3Rpb24KKyAqLworI2RlZmluZSBTT1VORF9NSVhFUl9BR0MgIF9TSU9XUignTScsIDEwMywgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl8zRFNFICBfU0lPV1IoJ00nLCAxMDQsIGludCkKKworLyoKKyAqIFRoZSBTT1VORF9NSVhFUl9QUklWQVRFIyBjb21tYW5kcyBjYW4gYmUgcmVkZWZpbmVkIGJ5IGxvdyBsZXZlbCBkcml2ZXJzLgorICogVGhlc2UgZmVhdHVyZXMgY2FuIGJlIHVzZWQgd2hlbiBhY2Nlc3NpbmcgZGV2aWNlIHNwZWNpZmljIGZlYXR1cmVzLgorICovCisjZGVmaW5lIFNPVU5EX01JWEVSX1BSSVZBVEUxCQlfU0lPV1IoJ00nLCAxMTEsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTIJCV9TSU9XUignTScsIDExMiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9QUklWQVRFMwkJX1NJT1dSKCdNJywgMTEzLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX1BSSVZBVEU0CQlfU0lPV1IoJ00nLCAxMTQsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfUFJJVkFURTUJCV9TSU9XUignTScsIDExNSwgaW50KQorCisvKgorICogU09VTkRfTUlYRVJfR0VUTEVWRUxTIGFuZCBTT1VORF9NSVhFUl9TRVRMRVZFTFMgY2FsbHMgY2FuIGJlIHVzZWQKKyAqIGZvciBxdWVyeWluZyBjdXJyZW50IG1peGVyIHNldHRpbmdzIGZyb20gdGhlIGRyaXZlciBhbmQgZm9yIGxvYWRpbmcKKyAqIGRlZmF1bHQgdm9sdW1lIHNldHRpbmdzIF9wcmlvcl8gYWN0aXZhdGluZyB0aGUgbWl4ZXIgKGxvYWRpbmcKKyAqIGRvZXNuJ3QgYWZmZWN0IGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1peGVyIGhhcmR3YXJlKS4gVGhlc2UgY2FsbHMKKyAqIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfdm9sX3RhYmxlIHsKKyAgaW50IG51bTsJLyogSW5kZXggdG8gdm9sdW1lIHRhYmxlICovCisgIGNoYXIgbmFtZVszMl07CisgIGludCBsZXZlbHNbMzJdOworfSBtaXhlcl92b2xfdGFibGU7CisKKyNkZWZpbmUgU09VTkRfTUlYRVJfR0VUTEVWRUxTCQlfU0lPV1IoJ00nLCAxMTYsIG1peGVyX3ZvbF90YWJsZSkKKyNkZWZpbmUgU09VTkRfTUlYRVJfU0VUTEVWRUxTCQlfU0lPV1IoJ00nLCAxMTcsIG1peGVyX3ZvbF90YWJsZSkKKworLyogCisgKiBBbiBpb2N0bCBmb3IgaWRlbnRpZnlpbmcgdGhlIGRyaXZlciB2ZXJzaW9uLiBJdCB3aWxsIHJldHVybiB2YWx1ZQorICogb2YgdGhlIFNPVU5EX1ZFUlNJT04gbWFjcm8gdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgZHJpdmVyLgorICogVGhpcyBjYWxsIHdhcyBpbnRyb2R1Y2VkIGluIE9TUyB2ZXJzaW9uIDMuNiBhbmQgaXQgd2lsbCBub3Qgd29yaworICogd2l0aCBlYXJsaWVyIHZlcnNpb25zIChyZXR1cm5zIEVJTlZBTCkuCisgKi8KKyNkZWZpbmUgT1NTX0dFVFZFUlNJT04JCQlfU0lPUiAoJ00nLCAxMTgsIGludCkKKworLyoKKyAqIExldmVsIDIgZXZlbnQgdHlwZXMgZm9yIC9kZXYvc2VxdWVuY2VyCisgKi8KKworLyoKKyAqIFRoZSA0IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBieXRlIDAgc3BlY2lmeSB0aGUgY2xhc3Mgb2YKKyAqIHRoZSBldmVudDogCisgKgorICoJMHg4WCA9IHN5c3RlbSBsZXZlbCBldmVudHMsCisgKgkweDlYID0gZGV2aWNlL3BvcnQgc3BlY2lmaWMgZXZlbnRzLCBldmVudFsxXSA9IGRldmljZS9wb3J0LAorICoJCVRoZSBsYXN0IDQgYml0cyBnaXZlIHRoZSBzdWJ0eXBlOgorICoJCQkweDAyCT0gQ2hhbm5lbCBldmVudCAoZXZlbnRbM10gPSBjaG4pLgorICoJCQkweDAxCT0gbm90ZSBldmVudCAoZXZlbnRbNF0gPSBub3RlKS4KKyAqCQkJKDB4MDEgaXMgbm90IHVzZWQgYWxvbmUgYnV0IGFsd2F5cyB3aXRoIGJpdCAweDAyKS4KKyAqCSAgICAgICBldmVudFsyXSA9IE1JREkgbWVzc2FnZSBjb2RlICgweDgwPW5vdGUgb2ZmIGV0Yy4pCisgKgorICovCisKKyNkZWZpbmUgRVZfU0VRX0xPQ0FMCQkweDgwCisjZGVmaW5lIEVWX1RJTUlORwkJMHg4MQorI2RlZmluZSBFVl9DSE5fQ09NTU9OCQkweDkyCisjZGVmaW5lIEVWX0NITl9WT0lDRQkJMHg5MworI2RlZmluZSBFVl9TWVNFWAkJMHg5NAorLyoKKyAqIEV2ZW50IHR5cGVzIDIwMCB0byAyMjAgYXJlIHJlc2VydmVkIGZvciBhcHBsaWNhdGlvbiB1c2UuCisgKiBUaGVzZSBudW1iZXJzIHdpbGwgbm90IGJlIHVzZWQgYnkgdGhlIGRyaXZlci4KKyAqLworCisvKgorICogRXZlbnRzIGZvciBldmVudCB0eXBlIEVWX0NITl9WT0lDRQorICovCisKKyNkZWZpbmUgTUlESV9OT1RFT0ZGCQkweDgwCisjZGVmaW5lIE1JRElfTk9URU9OCQkweDkwCisjZGVmaW5lIE1JRElfS0VZX1BSRVNTVVJFCTB4QTAKKworLyoKKyAqIEV2ZW50cyBmb3IgZXZlbnQgdHlwZSBFVl9DSE5fQ09NTU9OCisgKi8KKworI2RlZmluZSBNSURJX0NUTF9DSEFOR0UJCTB4QjAKKyNkZWZpbmUgTUlESV9QR01fQ0hBTkdFCQkweEMwCisjZGVmaW5lIE1JRElfQ0hOX1BSRVNTVVJFCTB4RDAKKyNkZWZpbmUgTUlESV9QSVRDSF9CRU5ECQkweEUwCisKKyNkZWZpbmUgTUlESV9TWVNURU1fUFJFRklYCTB4RjAKKworLyoKKyAqIFRpbWVyIGV2ZW50IHR5cGVzCisgKi8KKyNkZWZpbmUgVE1SX1dBSVRfUkVMCQkxCS8qIFRpbWUgcmVsYXRpdmUgdG8gdGhlIHByZXYgdGltZSAqLworI2RlZmluZSBUTVJfV0FJVF9BQlMJCTIJLyogQWJzb2x1dGUgdGltZSBzaW5jZSBUTVJfU1RBUlQgKi8KKyNkZWZpbmUgVE1SX1NUT1AJCTMKKyNkZWZpbmUgVE1SX1NUQVJUCQk0CisjZGVmaW5lIFRNUl9DT05USU5VRQkJNQorI2RlZmluZSBUTVJfVEVNUE8JCTYKKyNkZWZpbmUgVE1SX0VDSE8JCTgKKyNkZWZpbmUgVE1SX0NMT0NLCQk5CS8qIE1JREkgY2xvY2sgKi8KKyNkZWZpbmUgVE1SX1NQUAkJCTEwCS8qIFNvbmcgcG9zaXRpb24gcG9pbnRlciAqLworI2RlZmluZSBUTVJfVElNRVNJRwkJMTEJLyogVGltZSBzaWduYXR1cmUgKi8KKworLyoKKyAqCUxvY2FsIGV2ZW50IHR5cGVzCisgKi8KKyNkZWZpbmUgTE9DTF9TVEFSVEFVRElPCQkxCisKKyNpZiAoIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoS0VSTkVMKSAmJiAhZGVmaW5lZChJTktFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkpIHx8IGRlZmluZWQoVVNFX1NFUV9NQUNST1MpIAorLyoKKyAqCVNvbWUgY29udmVuaWVuY2UgbWFjcm9zIHRvIHNpbXBsaWZ5IHByb2dyYW1taW5nIG9mIHRoZQorICoJL2Rldi9zZXF1ZW5jZXIgaW50ZXJmYWNlCisgKgorICoJVGhlc2UgbWFjcm9zIGRlZmluZSB0aGUgQVBJIHdoaWNoIHNob3VsZCBiZSB1c2VkIHdoZW4gcG9zc2libGUuCisgKi8KKyNkZWZpbmUgU0VRX0RFQ0xBUkVCVUYoKQkJU0VRX1VTRV9FWFRCVUYoKQorCit2b2lkIHNlcWJ1Zl9kdW1wKHZvaWQpOwkvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgYnkgcHJvZ3JhbXMgKi8KKworZXh0ZXJuIGludCBPU1NfaW5pdChpbnQgc2VxZmQsIGludCBidWZsZW4pOworZXh0ZXJuIHZvaWQgT1NTX3NlcWJ1Zl9kdW1wKGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK2V4dGVybiB2b2lkIE9TU19zZXFfYWR2YnVmKGludCBsZW4sIGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK2V4dGVybiB2b2lkIE9TU19zZXFfbmVlZGJ1ZihpbnQgbGVuLCBpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CitleHRlcm4gdm9pZCBPU1NfcGF0Y2hfY2FjaGluZyhpbnQgZGV2LCBpbnQgY2huLCBpbnQgcGF0Y2gsCisJCQkgICAgICBpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CitleHRlcm4gdm9pZCBPU1NfZHJ1bV9jYWNoaW5nKGludCBkZXYsIGludCBjaG4sIGludCBwYXRjaCwKKwkJCSAgICAgIGludCBmZCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK2V4dGVybiB2b2lkIE9TU193cml0ZV9wYXRjaChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitleHRlcm4gaW50IE9TU193cml0ZV9wYXRjaDIoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCisjZGVmaW5lIFNFUV9QTV9ERUZJTkVTIGludCBfX2Zvb19iYXJfX18KKyNpZmRlZiBPU1NMSUIKKyMgIGRlZmluZSBTRVFfVVNFX0VYVEJVRigpIFwKKwkJZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKl9zZXFidWY7IFwKKwkJZXh0ZXJuIGludCBfc2VxYnVmbGVuO2V4dGVybiBpbnQgX3NlcWJ1ZnB0cgorIyAgZGVmaW5lIFNFUV9ERUZJTkVCVUYobGVuKSBTRVFfVVNFX0VYVEJVRigpO3N0YXRpYyBpbnQgX3JlcXVlc3RlZF9zZXFidWZsZW49bGVuCisjICBkZWZpbmUgX1NFUV9BRFZCVUYobGVuKSBPU1Nfc2VxX2FkdmJ1ZihsZW4sIHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorIyAgZGVmaW5lIF9TRVFfTkVFREJVRihsZW4pIE9TU19zZXFfbmVlZGJ1ZihsZW4sIHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorIyAgZGVmaW5lIFNFUV9EVU1QQlVGKCkgT1NTX3NlcWJ1Zl9kdW1wKHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKQorCisjICBkZWZpbmUgU0VRX0xPQURfR01JTlNUUihkZXYsIGluc3RyKSBcCisJCU9TU19wYXRjaF9jYWNoaW5nKGRldiwgLTEsIGluc3RyLCBzZXFmZCwgX3NlcWJ1ZiwgX3NlcWJ1ZmxlbikKKyMgIGRlZmluZSBTRVFfTE9BRF9HTURSVU0oZGV2LCBkcnVtKSBcCisJCU9TU19kcnVtX2NhY2hpbmcoZGV2LCAtMSwgZHJ1bSwgc2VxZmQsIF9zZXFidWYsIF9zZXFidWZsZW4pCisjZWxzZSAvKiAhT1NTTElCICovCisKKyMgIGRlZmluZSBTRVFfTE9BRF9HTUlOU1RSKGRldiwgaW5zdHIpCisjICBkZWZpbmUgU0VRX0xPQURfR01EUlVNKGRldiwgZHJ1bSkKKworIyAgZGVmaW5lIFNFUV9VU0VfRVhUQlVGKCkgXAorCQlleHRlcm4gdW5zaWduZWQgY2hhciBfc2VxYnVmW107IFwKKwkJZXh0ZXJuIGludCBfc2VxYnVmbGVuO2V4dGVybiBpbnQgX3NlcWJ1ZnB0cgorCisjaWZuZGVmIFVTRV9TSU1QTEVfTUFDUk9TCisvKiBTYW1wbGUgc2VxYnVmX2R1bXAoKSBpbXBsZW1lbnRhdGlvbjoKKyAqCisgKglTRVFfREVGSU5FQlVGICgyMDQ4KTsJLS0gRGVmaW5lcyBhIGJ1ZmZlciBmb3IgMjA0OCBieXRlcworICoKKyAqCWludCBzZXFmZDsJCS0tIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIC9kZXYvc2VxdWVuY2VyLgorICoKKyAqCXZvaWQKKyAqCXNlcWJ1Zl9kdW1wICgpCisgKgl7CisgKgkgIGlmIChfc2VxYnVmcHRyKQorICoJICAgIGlmICh3cml0ZSAoc2VxZmQsIF9zZXFidWYsIF9zZXFidWZwdHIpID09IC0xKQorICoJICAgICAgeworICoJCXBlcnJvciAoIndyaXRlIC9kZXYvc2VxdWVuY2VyIik7CisgKgkJZXhpdCAoLTEpOworICoJICAgICAgfQorICoJICBfc2VxYnVmcHRyID0gMDsKKyAqCX0KKyAqLworCisjZGVmaW5lIFNFUV9ERUZJTkVCVUYobGVuKQkJdW5zaWduZWQgY2hhciBfc2VxYnVmW2xlbl07IGludCBfc2VxYnVmbGVuID0gbGVuO2ludCBfc2VxYnVmcHRyID0gMAorI2RlZmluZSBfU0VRX05FRURCVUYobGVuKQkJaWYgKChfc2VxYnVmcHRyKyhsZW4pKSA+IF9zZXFidWZsZW4pIHNlcWJ1Zl9kdW1wKCkKKyNkZWZpbmUgX1NFUV9BRFZCVUYobGVuKQkJX3NlcWJ1ZnB0ciArPSBsZW4KKyNkZWZpbmUgU0VRX0RVTVBCVUYJCQlzZXFidWZfZHVtcAorI2Vsc2UKKy8qCisgKiBUaGlzIHZhcmlhdGlvbiBvZiB0aGUgc2VxdWVuY2VyIG1hY3JvcyBpcyB1c2VkIGp1c3QgdG8gZm9ybWF0IG9uZSBldmVudAorICogdXNpbmcgZml4ZWQgYnVmZmVyLgorICogCisgKiBUaGUgcHJvZ3JhbSB1c2luZyB0aGUgbWFjcm8gbGlicmFyeSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBiZWZvcmUKKyAqIHVzaW5nIHRoaXMgbGlicmFyeS4KKyAqCisgKiAjZGVmaW5lIF9zZXFidWYgCQkgbmFtZSBvZiB0aGUgYnVmZmVyICh1bnNpZ25lZCBjaGFyW10pIAorICogI2RlZmluZSBfU0VRX0FEVkJVRihsZW4pCSBJZiB0aGUgYXBwbGljIG5lZWRzIHRvIGtub3cgdGhlIGV4YWN0CisgKgkJCQkgc2l6ZSBvZiB0aGUgZXZlbnQsIHRoaXMgbWFjcm8gY2FuIGJlIHVzZWQuCisgKgkJCQkgT3RoZXJ3aXNlIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGFzIGVtcHR5LgorICogI2RlZmluZSBfc2VxYnVmcHRyCQkgRGVmaW5lIHRoZSBuYW1lIG9mIGluZGV4IHZhcmlhYmxlIG9yIDAgaWYKKyAqCQkJCSBub3QgcmVxdWlyZWQuIAorICovCisjZGVmaW5lIF9TRVFfTkVFREJVRihsZW4pCS8qIGVtcHR5ICovCisjZW5kaWYKKyNlbmRpZiAvKiAhT1NTTElCICovCisKKyNkZWZpbmUgU0VRX1ZPTFVNRV9NT0RFKGRldiwgbW9kZSkJe19TRVFfTkVFREJVRig4KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBTRVFfRVhURU5ERUQ7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSBTRVFfVk9MTU9ERTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisyXSA9IChkZXYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKG1vZGUpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gMDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis1XSA9IDA7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAwO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworLyoKKyAqIE1pZGkgdm9pY2UgbWVzc2FnZXMKKyAqLworCisjZGVmaW5lIF9DSE5fVk9JQ0UoZGV2LCBldmVudCwgY2huLCBub3RlLCBwYXJtKSBcCisJCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gRVZfQ0hOX1ZPSUNFO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGRldik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZXZlbnQpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gKGNobik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAobm90ZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAocGFybSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNl0gPSAoMCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrN10gPSAwO1wKKwkJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9TVEFSVF9OT1RFKGRldiwgY2huLCBub3RlLCB2b2wpIFwKKwkJX0NITl9WT0lDRShkZXYsIE1JRElfTk9URU9OLCBjaG4sIG5vdGUsIHZvbCkKKworI2RlZmluZSBTRVFfU1RPUF9OT1RFKGRldiwgY2huLCBub3RlLCB2b2wpIFwKKwkJX0NITl9WT0lDRShkZXYsIE1JRElfTk9URU9GRiwgY2huLCBub3RlLCB2b2wpCisKKyNkZWZpbmUgU0VRX0tFWV9QUkVTU1VSRShkZXYsIGNobiwgbm90ZSwgcHJlc3N1cmUpIFwKKwkJX0NITl9WT0lDRShkZXYsIE1JRElfS0VZX1BSRVNTVVJFLCBjaG4sIG5vdGUsIHByZXNzdXJlKQorCisvKgorICogTWlkaSBjaGFubmVsIG1lc3NhZ2VzCisgKi8KKworI2RlZmluZSBfQ0hOX0NPTU1PTihkZXYsIGV2ZW50LCBjaG4sIHAxLCBwMiwgdzE0KSBcCisJCQkJCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gRVZfQ0hOX0NPTU1PTjtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChkZXYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gKGV2ZW50KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IChjaG4pO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHAxKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis1XSA9IChwMik7XAorCQkJCQkqKHNob3J0ICopJl9zZXFidWZbX3NlcWJ1ZnB0cis2XSA9ICh3MTQpO1wKKwkJCQkJX1NFUV9BRFZCVUYoOCk7fQorLyoKKyAqIFNFUV9TWVNFWCBwZXJtaXRzIHNlbmRpbmcgb2Ygc3lzZXggbWVzc2FnZXMuIChJdCBtYXkgbG9vayB0aGF0IGl0IHBlcm1pdHMKKyAqIHNlbmRpbmcgYW55IE1JREkgYnl0ZXMgYnV0IGl0J3MgYWJzb2x1dGVseSBub3QgcG9zc2libGUuIFRyeWluZyB0byBkbworICogc28gX3dpbGxfIGNhdXNlIHByb2JsZW1zIHdpdGggTVBVNDAxIGludGVsbGlnZW50IG1vZGUpLgorICoKKyAqIFN5c2V4IG1lc3NhZ2VzIGFyZSBzZW50IGluIGJsb2NrcyBvZiAxIHRvIDYgYnl0ZXMuIExvbmdlciBtZXNzYWdlcyBtdXN0IGJlIAorICogc2VudCBieSBjYWxsaW5nIFNFUV9TWVNFWCgpIHNldmVyYWwgdGltZXMgKHRoZXJlIG11c3QgYmUgbm8gb3RoZXIgZXZlbnRzCisgKiBiZXR3ZWVuIHRoZW0pLiBGaXJzdCBzeXNleCBmcmFnbWVudCBtdXN0IGhhdmUgMHhmMCBpbiB0aGUgZmlyc3QgYnl0ZQorICogYW5kIHRoZSBsYXN0IGJ5dGUgKGJ1ZltsZW4tMV0gb2YgdGhlIGxhc3QgZnJhZ21lbnQgbXVzdCBiZSAweGY3LiBObyBieXRlCisgKiBiZXR3ZWVuIHRoZXNlIHN5c2V4IHN0YXJ0IGFuZCBlbmQgbWFya2VycyBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gMHg3Zi4gQWxzbworICogbGVuZ3RocyBvZiBlYWNoIGZyYWdtZW50cyAoZXhjZXB0IHRoZSBsYXN0IG9uZSkgbXVzdCBiZSA2LgorICoKKyAqIEJyZWFraW5nIHRoZSBhYm92ZSBydWxlcyBtYXkgd29yayB3aXRoIHNvbWUgTUlESSBwb3J0cyBidXQgaXMgbGlrZWx5IHRvCisgKiBjYXVzZSBmYXRhbCBwcm9ibGVtcyB3aXRoIHNvbWUgb3RoZXIgZGV2aWNlcyAoc3VjaCBhcyBNUFU0MDEpLgorICovCisjZGVmaW5lIFNFUV9TWVNFWChkZXYsIGJ1ZiwgbGVuKSBcCisJCQkJCXtpbnQgaWksIGxsPShsZW4pOyBcCisJCQkJCSB1bnNpZ25lZCBjaGFyICpidWZwPWJ1ZjtcCisJCQkJCSBpZiAobGw+NilsbD02O1wKKwkJCQkJX1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyXSA9IEVWX1NZU0VYO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGRldik7XAorCQkJCQlmb3IoaWk9MDtpaTxsbDtpaSsrKVwKKwkJCQkJICAgX3NlcWJ1Zltfc2VxYnVmcHRyK2lpKzJdID0gYnVmcFtpaV07XAorCQkJCQlmb3IoaWk9bGw7aWk8NjtpaSsrKVwKKwkJCQkJICAgX3NlcWJ1Zltfc2VxYnVmcHRyK2lpKzJdID0gMHhmZjtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfQ0hOX1BSRVNTVVJFKGRldiwgY2huLCBwcmVzc3VyZSkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfQ0hOX1BSRVNTVVJFLCBjaG4sIHByZXNzdXJlLCAwLCAwKQorCisjZGVmaW5lIFNFUV9TRVRfUEFUQ0ggU0VRX1BHTV9DSEFOR0UKKyNpZmRlZiBPU1NMSUIKKyMgICBkZWZpbmUgU0VRX1BHTV9DSEFOR0UoZGV2LCBjaG4sIHBhdGNoKSBcCisJCXtPU1NfcGF0Y2hfY2FjaGluZyhkZXYsIGNobiwgcGF0Y2gsIHNlcWZkLCBfc2VxYnVmLCBfc2VxYnVmbGVuKTsgXAorCQkgX0NITl9DT01NT04oZGV2LCBNSURJX1BHTV9DSEFOR0UsIGNobiwgcGF0Y2gsIDAsIDApO30KKyNlbHNlCisjICAgZGVmaW5lIFNFUV9QR01fQ0hBTkdFKGRldiwgY2huLCBwYXRjaCkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfUEdNX0NIQU5HRSwgY2huLCBwYXRjaCwgMCwgMCkKKyNlbmRpZgorCisjZGVmaW5lIFNFUV9DT05UUk9MKGRldiwgY2huLCBjb250cm9sbGVyLCB2YWx1ZSkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfQ1RMX0NIQU5HRSwgY2huLCBjb250cm9sbGVyLCAwLCB2YWx1ZSkKKworI2RlZmluZSBTRVFfQkVOREVSKGRldiwgY2huLCB2YWx1ZSkgXAorCQlfQ0hOX0NPTU1PTihkZXYsIE1JRElfUElUQ0hfQkVORCwgY2huLCAwLCAwLCB2YWx1ZSkKKworCisjZGVmaW5lIFNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgY29udHJvbGxlciwgdmFsdWUpCXtfU0VRX05FRURCVUYoOCk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX0VYVEVOREVEO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gU0VRX0NPTlRST0xMRVI7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZGV2KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9ICh2b2ljZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAoY29udHJvbGxlcik7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrNV0gPSAoKHZhbHVlKSYweGZmKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cis2XSA9ICgodmFsdWU+PjgpJjB4ZmYpO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzddID0gMDtcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKy8qCisgKiBUaGUgZm9sbG93aW5nIDUgbWFjcm9zIGFyZSBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBhbmQgb2Jzb2xldGUuCisgKiBVc2UgU0VRX0JFTkRFUiBhbmQgU0VRX0NPTlRST0wgKHdpdGggcHJvcGVyIGNvbnRyb2xsZXIpIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgU0VRX1BJVENIQkVORChkZXYsIHZvaWNlLCB2YWx1ZSkgU0VRX1YyX1hfQ09OVFJPTChkZXYsIHZvaWNlLCBDVFJMX1BJVENIX0JFTkRFUiwgdmFsdWUpCisjZGVmaW5lIFNFUV9CRU5ERVJfUkFOR0UoZGV2LCB2b2ljZSwgdmFsdWUpIFNFUV9WMl9YX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RSTF9QSVRDSF9CRU5ERVJfUkFOR0UsIHZhbHVlKQorI2RlZmluZSBTRVFfRVhQUkVTU0lPTihkZXYsIHZvaWNlLCB2YWx1ZSkgU0VRX0NPTlRST0woZGV2LCB2b2ljZSwgQ1RMX0VYUFJFU1NJT04sIHZhbHVlKjEyOCkKKyNkZWZpbmUgU0VRX01BSU5fVk9MVU1FKGRldiwgdm9pY2UsIHZhbHVlKSBTRVFfQ09OVFJPTChkZXYsIHZvaWNlLCBDVExfTUFJTl9WT0xVTUUsICh2YWx1ZSoxNjM4MykvMTAwKQorI2RlZmluZSBTRVFfUEFOTklORyhkZXYsIHZvaWNlLCBwb3MpIFNFUV9DT05UUk9MKGRldiwgdm9pY2UsIENUTF9QQU4sIChwb3MrMTI4KSAvIDIpCisKKy8qCisgKiBUaW1pbmcgYW5kIHN5bmNyb25pemF0aW9uIG1hY3JvcworICovCisKKyNkZWZpbmUgX1RJTUVSX0VWRU5UKGV2LCBwYXJtKQkJe19TRVFfTkVFREJVRig4KTtcCisJCQkJIAlfc2VxYnVmW19zZXFidWZwdHIrMF0gPSBFVl9USU1JTkc7IFwKKwkJCQkgCV9zZXFidWZbX3NlcWJ1ZnB0cisxXSA9IChldik7IFwKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gMDtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IDA7XAorCQkJCSAJKih1bnNpZ25lZCBpbnQgKikmX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gKHBhcm0pOyBcCisJCQkJCV9TRVFfQURWQlVGKDgpO30KKworI2RlZmluZSBTRVFfU1RBUlRfVElNRVIoKQkJX1RJTUVSX0VWRU5UKFRNUl9TVEFSVCwgMCkKKyNkZWZpbmUgU0VRX1NUT1BfVElNRVIoKQkJX1RJTUVSX0VWRU5UKFRNUl9TVE9QLCAwKQorI2RlZmluZSBTRVFfQ09OVElOVUVfVElNRVIoKQkJX1RJTUVSX0VWRU5UKFRNUl9DT05USU5VRSwgMCkKKyNkZWZpbmUgU0VRX1dBSVRfVElNRSh0aWNrcykJCV9USU1FUl9FVkVOVChUTVJfV0FJVF9BQlMsIHRpY2tzKQorI2RlZmluZSBTRVFfREVMVEFfVElNRSh0aWNrcykJCV9USU1FUl9FVkVOVChUTVJfV0FJVF9SRUwsIHRpY2tzKQorI2RlZmluZSBTRVFfRUNIT19CQUNLKGtleSkJCV9USU1FUl9FVkVOVChUTVJfRUNITywga2V5KQorI2RlZmluZSBTRVFfU0VUX1RFTVBPKHZhbHVlKQkJX1RJTUVSX0VWRU5UKFRNUl9URU1QTywgdmFsdWUpCisjZGVmaW5lIFNFUV9TT05HUE9TKHBvcykJCV9USU1FUl9FVkVOVChUTVJfU1BQLCBwb3MpCisjZGVmaW5lIFNFUV9USU1FX1NJR05BVFVSRShzaWcpCQlfVElNRVJfRVZFTlQoVE1SX1RJTUVTSUcsIHNpZykKKworLyoKKyAqIExvY2FsIGNvbnRyb2wgZXZlbnRzCisgKi8KKworI2RlZmluZSBfTE9DQUxfRVZFTlQoZXYsIHBhcm0pCQl7X1NFUV9ORUVEQlVGKDgpO1wKKwkJCQkgCV9zZXFidWZbX3NlcWJ1ZnB0ciswXSA9IEVWX1NFUV9MT0NBTDsgXAorCQkJCSAJX3NlcWJ1Zltfc2VxYnVmcHRyKzFdID0gKGV2KTsgXAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAwO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gMDtcCisJCQkJIAkqKHVuc2lnbmVkIGludCAqKSZfc2VxYnVmW19zZXFidWZwdHIrNF0gPSAocGFybSk7IFwKKwkJCQkJX1NFUV9BRFZCVUYoOCk7fQorCisjZGVmaW5lIFNFUV9QTEFZQVVESU8oZGV2bWFzaykJCV9MT0NBTF9FVkVOVChMT0NMX1NUQVJUQVVESU8sIGRldm1hc2spCisvKgorICogRXZlbnRzIGZvciB0aGUgbGV2ZWwgMSBpbnRlcmZhY2Ugb25seSAKKyAqLworCisjZGVmaW5lIFNFUV9NSURJT1VUKGRldmljZSwgYnl0ZSkJe19TRVFfTkVFREJVRig0KTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0cl0gPSBTRVFfTUlESVBVVEM7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoYnl0ZSk7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMl0gPSAoZGV2aWNlKTtcCisJCQkJCV9zZXFidWZbX3NlcWJ1ZnB0ciszXSA9IDA7XAorCQkJCQlfU0VRX0FEVkJVRig0KTt9CisKKy8qCisgKiBQYXRjaCBsb2FkaW5nLgorICovCisjaWZkZWYgT1NTTElCCisjICAgZGVmaW5lIFNFUV9XUlBBVENIKHBhdGNoeCwgbGVuKSBcCisJCU9TU193cml0ZV9wYXRjaChzZXFmZCwgKGNoYXIqKShwYXRjaHgpLCBsZW4pCisjICAgZGVmaW5lIFNFUV9XUlBBVENIMihwYXRjaHgsIGxlbikgXAorCQlPU1Nfd3JpdGVfcGF0Y2gyKHNlcWZkLCAoY2hhciopKHBhdGNoeCksIGxlbikKKyNlbHNlCisjICAgZGVmaW5lIFNFUV9XUlBBVENIKHBhdGNoeCwgbGVuKSBcCisJCXtpZiAoX3NlcWJ1ZnB0cikgU0VRX0RVTVBCVUYoKTtcCisJCSBpZiAod3JpdGUoc2VxZmQsIChjaGFyKikocGF0Y2h4KSwgbGVuKT09LTEpIFwKKwkJICAgIHBlcnJvcigiV3JpdGUgcGF0Y2g6IC9kZXYvc2VxdWVuY2VyIik7fQorIyAgIGRlZmluZSBTRVFfV1JQQVRDSDIocGF0Y2h4LCBsZW4pIFwKKwkJKFNFUV9EVU1QQlVGKCksIHdyaXRlKHNlcWZkLCAoY2hhciopKHBhdGNoeCksIGxlbikpCisjZW5kaWYKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3BpL3NwaWRldi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zcGkvc3BpZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzZWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3BpL3NwaWRldi5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogaW5jbHVkZS9saW51eC9zcGkvc3BpZGV2LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU1dBUFAKKyAqCUFuZHJlYSBQYXRlcm5pYW5pIDxhLnBhdGVybmlhbmlAc3dhcHAtZW5nLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICAqLworCisjaWZuZGVmIFNQSURFVl9ICisjZGVmaW5lIFNQSURFVl9ICisKKworLyogVXNlciBzcGFjZSB2ZXJzaW9ucyBvZiBrZXJuZWwgc3ltYm9scyBmb3IgU1BJIGNsb2NraW5nIG1vZGVzLAorICogbWF0Y2hpbmcgPGxpbnV4L3NwaS9zcGkuaD4KKyAqLworCisjZGVmaW5lIFNQSV9DUEhBCQkweDAxCisjZGVmaW5lIFNQSV9DUE9MCQkweDAyCisKKyNkZWZpbmUgU1BJX01PREVfMAkJKDB8MCkKKyNkZWZpbmUgU1BJX01PREVfMQkJKDB8U1BJX0NQSEEpCisjZGVmaW5lIFNQSV9NT0RFXzIJCShTUElfQ1BPTHwwKQorI2RlZmluZSBTUElfTU9ERV8zCQkoU1BJX0NQT0x8U1BJX0NQSEEpCisKKyNkZWZpbmUgU1BJX0NTX0hJR0gJCTB4MDQKKyNkZWZpbmUgU1BJX0xTQl9GSVJTVAkJMHgwOAorI2RlZmluZSBTUElfM1dJUkUJCTB4MTAKKyNkZWZpbmUgU1BJX0xPT1AJCTB4MjAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBJT0NUTCBjb21tYW5kcyAqLworCisjZGVmaW5lIFNQSV9JT0NfTUFHSUMJCQknaycKKworLyoqCisgKiBzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciAtIGRlc2NyaWJlcyBhIHNpbmdsZSBTUEkgdHJhbnNmZXIKKyAqIEB0eF9idWY6IEhvbGRzIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGJ1ZmZlciB3aXRoIHRyYW5zbWl0IGRhdGEsIG9yIG51bGwuCisgKglJZiBubyBkYXRhIGlzIHByb3ZpZGVkLCB6ZXJvZXMgYXJlIHNoaWZ0ZWQgb3V0LgorICogQHJ4X2J1ZjogSG9sZHMgcG9pbnRlciB0byB1c2Vyc3BhY2UgYnVmZmVyIGZvciByZWNlaXZlIGRhdGEsIG9yIG51bGwuCisgKiBAbGVuOiBMZW5ndGggb2YgdHggYW5kIHJ4IGJ1ZmZlcnMsIGluIGJ5dGVzLgorICogQHNwZWVkX2h6OiBUZW1wb3Jhcnkgb3ZlcnJpZGUgb2YgdGhlIGRldmljZSdzIGJpdHJhdGUuCisgKiBAYml0c19wZXJfd29yZDogVGVtcG9yYXJ5IG92ZXJyaWRlIG9mIHRoZSBkZXZpY2UncyB3b3Jkc2l6ZS4KKyAqIEBkZWxheV91c2VjczogSWYgbm9uemVybywgaG93IGxvbmcgdG8gZGVsYXkgYWZ0ZXIgdGhlIGxhc3QgYml0IHRyYW5zZmVyCisgKgliZWZvcmUgb3B0aW9uYWxseSBkZXNlbGVjdGluZyB0aGUgZGV2aWNlIGJlZm9yZSB0aGUgbmV4dCB0cmFuc2Zlci4KKyAqIEBjc19jaGFuZ2U6IFRydWUgdG8gZGVzZWxlY3QgZGV2aWNlIGJlZm9yZSBzdGFydGluZyB0aGUgbmV4dCB0cmFuc2Zlci4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBtYXBwZWQgZGlyZWN0bHkgdG8gdGhlIGtlcm5lbCBzcGlfdHJhbnNmZXIgc3RydWN0dXJlOworICogdGhlIGZpZWxkcyBoYXZlIHRoZSBzYW1lIG1lYW5pbmdzLCBleGNlcHQgb2YgY291cnNlIHRoYXQgdGhlIHBvaW50ZXJzCisgKiBhcmUgaW4gYSBkaWZmZXJlbnQgYWRkcmVzcyBzcGFjZSAoYW5kIG1heSBiZSBvZiBkaWZmZXJlbnQgc2l6ZXMgaW4gc29tZQorICogY2FzZXMsIHN1Y2ggYXMgMzItYml0IGkzODYgdXNlcnNwYWNlIG92ZXIgYSA2NC1iaXQgeDg2XzY0IGtlcm5lbCkuCisgKiBaZXJvLWluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSwgaW5jbHVkaW5nIGN1cnJlbnRseSB1bnVzZWQgZmllbGRzLCB0bworICogYWNjb21vZGF0ZSBwb3RlbnRpYWwgZnV0dXJlIHVwZGF0ZXMuCisgKgorICogU1BJX0lPQ19NRVNTQUdFIGdpdmVzIHVzZXJzcGFjZSB0aGUgZXF1aXZhbGVudCBvZiBrZXJuZWwgc3BpX3N5bmMoKS4KKyAqIFBhc3MgaXQgYW4gYXJyYXkgb2YgcmVsYXRlZCB0cmFuc2ZlcnMsIHRoZXknbGwgZXhlY3V0ZSB0b2dldGhlci4KKyAqIEVhY2ggdHJhbnNmZXIgbWF5IGJlIGhhbGYgZHVwbGV4IChlaXRoZXIgZGlyZWN0aW9uKSBvciBmdWxsIGR1cGxleC4KKyAqCisgKglzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciBtZXNnWzRdOworICoJLi4uCisgKglzdGF0dXMgPSBpb2N0bChmZCwgU1BJX0lPQ19NRVNTQUdFKDQpLCBtZXNnKTsKKyAqCisgKiBTbyBmb3IgZXhhbXBsZSBvbmUgdHJhbnNmZXIgbWlnaHQgc2VuZCBhIG5pbmUgYml0IGNvbW1hbmQgKHJpZ2h0IGFsaWduZWQKKyAqIGluIGEgMTYtYml0IHdvcmQpLCB0aGUgbmV4dCBjb3VsZCByZWFkIGEgYmxvY2sgb2YgOC1iaXQgZGF0YSBiZWZvcmUKKyAqIHRlcm1pbmF0aW5nIHRoYXQgY29tbWFuZCBieSB0ZW1wb3JhcmlseSBkZXNlbGVjdGluZyB0aGUgY2hpcDsgdGhlIG5leHQKKyAqIGNvdWxkIHNlbmQgYSBkaWZmZXJlbnQgbmluZSBiaXQgY29tbWFuZCAocmUtc2VsZWN0aW5nIHRoZSBjaGlwKSwgYW5kIHRoZQorICogbGFzdCB0cmFuc2ZlciBtaWdodCB3cml0ZSBzb21lIHJlZ2lzdGVyIHZhbHVlcy4KKyAqLworc3RydWN0IHNwaV9pb2NfdHJhbnNmZXIgeworCV9fdTY0CQl0eF9idWY7CisJX191NjQJCXJ4X2J1ZjsKKworCV9fdTMyCQlsZW47CisJX191MzIJCXNwZWVkX2h6OworCisJX191MTYJCWRlbGF5X3VzZWNzOworCV9fdTgJCWJpdHNfcGVyX3dvcmQ7CisJX191OAkJY3NfY2hhbmdlOworCV9fdTMyCQlwYWQ7CisKKwkvKiBJZiB0aGUgY29udGVudHMgb2YgJ3N0cnVjdCBzcGlfaW9jX3RyYW5zZmVyJyBldmVyIGNoYW5nZQorCSAqIGluY29tcGF0aWJseSwgdGhlbiB0aGUgaW9jdGwgbnVtYmVyIChjdXJyZW50bHkgMCkgbXVzdCBjaGFuZ2U7CisJICogaW9jdGxzIHdpdGggY29uc3RhbnQgc2l6ZSBmaWVsZHMgZ2V0IGEgYml0IG1vcmUgaW4gdGhlIHdheSBvZgorCSAqIGVycm9yIGNoZWNraW5nIHRoYW4gb25lcyAobGlrZSB0aGlzKSB3aGVyZSB0aGF0IGZpZWxkIHZhcmllcy4KKwkgKgorCSAqIE5PVEU6IHN0cnVjdCBsYXlvdXQgaXMgdGhlIHNhbWUgaW4gNjRiaXQgYW5kIDMyYml0IHVzZXJzcGFjZS4KKwkgKi8KK307CisKKy8qIG5vdCBhbGwgcGxhdGZvcm1zIHVzZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4gb3IgX0lPQ19UWVBFQ0hFQ0soKSAuLi4gKi8KKyNkZWZpbmUgU1BJX01TR1NJWkUoTikgXAorCSgoKChOKSooc2l6ZW9mIChzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlcikpKSA8ICgxIDw8IF9JT0NfU0laRUJJVFMpKSBcCisJCT8gKChOKSooc2l6ZW9mIChzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlcikpKSA6IDApCisjZGVmaW5lIFNQSV9JT0NfTUVTU0FHRShOKSBfSU9XKFNQSV9JT0NfTUFHSUMsIDAsIGNoYXJbU1BJX01TR1NJWkUoTildKQorCisKKy8qIFJlYWQgLyBXcml0ZSBvZiBTUEkgbW9kZSAoU1BJX01PREVfMC4uU1BJX01PREVfMykgKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9NT0RFCQkJX0lPUihTUElfSU9DX01BR0lDLCAxLCBfX3U4KQorI2RlZmluZSBTUElfSU9DX1dSX01PREUJCQlfSU9XKFNQSV9JT0NfTUFHSUMsIDEsIF9fdTgpCisKKy8qIFJlYWQgLyBXcml0ZSBTUEkgYml0IGp1c3RpZmljYXRpb24gKi8KKyNkZWZpbmUgU1BJX0lPQ19SRF9MU0JfRklSU1QJCV9JT1IoU1BJX0lPQ19NQUdJQywgMiwgX191OCkKKyNkZWZpbmUgU1BJX0lPQ19XUl9MU0JfRklSU1QJCV9JT1coU1BJX0lPQ19NQUdJQywgMiwgX191OCkKKworLyogUmVhZCAvIFdyaXRlIFNQSSBkZXZpY2Ugd29yZCBsZW5ndGggKDEuLk4pICovCisjZGVmaW5lIFNQSV9JT0NfUkRfQklUU19QRVJfV09SRAlfSU9SKFNQSV9JT0NfTUFHSUMsIDMsIF9fdTgpCisjZGVmaW5lIFNQSV9JT0NfV1JfQklUU19QRVJfV09SRAlfSU9XKFNQSV9JT0NfTUFHSUMsIDMsIF9fdTgpCisKKy8qIFJlYWQgLyBXcml0ZSBTUEkgZGV2aWNlIGRlZmF1bHQgbWF4IHNwZWVkIGh6ICovCisjZGVmaW5lIFNQSV9JT0NfUkRfTUFYX1NQRUVEX0haCQlfSU9SKFNQSV9JT0NfTUFHSUMsIDQsIF9fdTMyKQorI2RlZmluZSBTUElfSU9DX1dSX01BWF9TUEVFRF9IWgkJX0lPVyhTUElfSU9DX01BR0lDLCA0LCBfX3UzMikKKworCisKKyNlbmRpZiAvKiBTUElERVZfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTlmMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGF0LmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBfTElOVVhfU1RBVF9ICisjZGVmaW5lIF9MSU5VWF9TVEFUX0gKKworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorCisjZGVmaW5lIFNfSUZNVCAgMDAxNzAwMDAKKyNkZWZpbmUgU19JRlNPQ0sgMDE0MDAwMAorI2RlZmluZSBTX0lGTE5LCSAwMTIwMDAwCisjZGVmaW5lIFNfSUZSRUcgIDAxMDAwMDAKKyNkZWZpbmUgU19JRkJMSyAgMDA2MDAwMAorI2RlZmluZSBTX0lGRElSICAwMDQwMDAwCisjZGVmaW5lIFNfSUZDSFIgIDAwMjAwMDAKKyNkZWZpbmUgU19JRklGTyAgMDAxMDAwMAorI2RlZmluZSBTX0lTVUlEICAwMDA0MDAwCisjZGVmaW5lIFNfSVNHSUQgIDAwMDIwMDAKKyNkZWZpbmUgU19JU1ZUWCAgMDAwMTAwMAorCisjZGVmaW5lIFNfSVNMTksobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCisjZGVmaW5lIFNfSVNSRUcobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZGVmaW5lIFNfSVNESVIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVNDSFIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZGVmaW5lIFNfSVNCTEsobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZCTEspCisjZGVmaW5lIFNfSVNGSUZPKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2RlZmluZSBTX0lTU09DSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisKKyNkZWZpbmUgU19JUldYVSAwMDcwMAorI2RlZmluZSBTX0lSVVNSIDAwNDAwCisjZGVmaW5lIFNfSVdVU1IgMDAyMDAKKyNkZWZpbmUgU19JWFVTUiAwMDEwMAorCisjZGVmaW5lIFNfSVJXWEcgMDAwNzAKKyNkZWZpbmUgU19JUkdSUCAwMDA0MAorI2RlZmluZSBTX0lXR1JQIDAwMDIwCisjZGVmaW5lIFNfSVhHUlAgMDAwMTAKKworI2RlZmluZSBTX0lSV1hPIDAwMDA3CisjZGVmaW5lIFNfSVJPVEggMDAwMDQKKyNkZWZpbmUgU19JV09USCAwMDAwMgorI2RlZmluZSBTX0lYT1RIIDAwMDAxCisKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdGRkZWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiYjM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfTElOVVhfU1REREVGX0gKKyNkZWZpbmUgX0xJTlVYX1NURERFRl9ICisKKworI3VuZGVmIE5VTEwKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBOVUxMIDAKKyNlbHNlCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC9zdHJpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlMTNiMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9MSU5VWF9TVFJJTkdfSF8KKyNkZWZpbmUgX0xJTlVYX1NUUklOR19IXworCisvKiBXZSBkb24ndCB3YW50IHN0cmluZ3MuaCBzdHVmZiBiZWluZyB1c2VyIGJ5IHVzZXIgc3R1ZmYgYnkgYWNjaWRlbnQgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmIC8qIF9MSU5VWF9TVFJJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N1bnJwYy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmM4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N1bnJwYy9kZWJ1Zy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L3N1bnJwYy9kZWJ1Zy5oCisgKgorICogRGVidWdnaW5nIHN1cHBvcnQgZm9yIHN1bnJwYyBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NVTlJQQ19ERUJVR19IXworI2RlZmluZSBfTElOVVhfU1VOUlBDX0RFQlVHX0hfCisKKy8qCisgKiBSUEMgZGVidWcgZmFjaWxpdGllcworICovCisjZGVmaW5lIFJQQ0RCR19YUFJUCQkweDAwMDEKKyNkZWZpbmUgUlBDREJHX0NBTEwJCTB4MDAwMgorI2RlZmluZSBSUENEQkdfREVCVUcJCTB4MDAwNAorI2RlZmluZSBSUENEQkdfTkZTCQkweDAwMDgKKyNkZWZpbmUgUlBDREJHX0FVVEgJCTB4MDAxMAorI2RlZmluZSBSUENEQkdfQklORAkJMHgwMDIwCisjZGVmaW5lIFJQQ0RCR19TQ0hFRAkJMHgwMDQwCisjZGVmaW5lIFJQQ0RCR19UUkFOUwkJMHgwMDgwCisjZGVmaW5lIFJQQ0RCR19TVkNTT0NLCQkweDAxMDAKKyNkZWZpbmUgUlBDREJHX1NWQ0RTUAkJMHgwMjAwCisjZGVmaW5lIFJQQ0RCR19NSVNDCQkweDA0MDAKKyNkZWZpbmUgUlBDREJHX0NBQ0hFCQkweDA4MDAKKyNkZWZpbmUgUlBDREJHX0FMTAkJMHg3ZmZmCisKKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgdGhlIHN5c2N0bCBkZWJ1ZyBpbnRlcmZhY2UsIHdoaWNoIGFsbG93cyB0byByZWFkIG9yCisgKiBjaGFuZ2UgdGhlIGRlYnVnIGZsYWdzIGZvciBycGMsIG5mcywgbmZzZCwgYW5kIGxvY2tkLiBTaW5jZSB0aGUgc3VucnBjCisgKiBtb2R1bGUgY3VycmVudGx5IHJlZ2lzdGVycyBpdHMgc3lzY3RsIHRhYmxlIGR5bmFtaWNhbGx5LCB0aGUgc3lzY3RsIHBhdGgKKyAqIGZvciBtb2R1bGUgRk9PIGlzIDxDVExfU1VOUlBDLCBDVExfRk9PREVCVUc+LgorICovCisKK2VudW0geworCUNUTF9SUENERUJVRyA9IDEsCisJQ1RMX05GU0RFQlVHLAorCUNUTF9ORlNEREVCVUcsCisJQ1RMX05MTURFQlVHLAorCUNUTF9TTE9UVEFCTEVfVURQLAorCUNUTF9TTE9UVEFCTEVfVENQLAorCUNUTF9NSU5fUkVTVlBPUlQsCisJQ1RMX01BWF9SRVNWUE9SVCwKK307CisKKyNlbmRpZiAvKiBfTElOVVhfU1VOUlBDX0RFQlVHX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2YWQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3luY2xpbmsuaApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIFN5bmNMaW5rIE11bHRpcHJvdG9jb2wgU2VyaWFsIEFkYXB0ZXIgRHJpdmVyCisgKgorICogJElkOiBzeW5jbGluay5oLHYgMy4xNCAyMDA2LzA3LzE3IDIwOjE1OjQzIHBhdWxrZiBFeHAgJAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIGJ5IE1pY3JvZ2F0ZSBDb3Jwb3JhdGlvbgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSBpcyBwZXJtaXR0ZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIChHUEwpCisgKi8KKworI2lmbmRlZiBfU1lOQ0xJTktfSF8KKyNkZWZpbmUgX1NZTkNMSU5LX0hfCisjZGVmaW5lIFNZTkNMSU5LX0hfVkVSU0lPTiAzLjYKKworI2RlZmluZSBCT09MRUFOIGludAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIEJJVDAJMHgwMDAxCisjZGVmaW5lIEJJVDEJMHgwMDAyCisjZGVmaW5lIEJJVDIJMHgwMDA0CisjZGVmaW5lIEJJVDMJMHgwMDA4CisjZGVmaW5lIEJJVDQJMHgwMDEwCisjZGVmaW5lIEJJVDUJMHgwMDIwCisjZGVmaW5lIEJJVDYJMHgwMDQwCisjZGVmaW5lIEJJVDcJMHgwMDgwCisjZGVmaW5lIEJJVDgJMHgwMTAwCisjZGVmaW5lIEJJVDkJMHgwMjAwCisjZGVmaW5lIEJJVDEwCTB4MDQwMAorI2RlZmluZSBCSVQxMQkweDA4MDAKKyNkZWZpbmUgQklUMTIJMHgxMDAwCisjZGVmaW5lIEJJVDEzCTB4MjAwMAorI2RlZmluZSBCSVQxNAkweDQwMDAKKyNkZWZpbmUgQklUMTUJMHg4MDAwCisjZGVmaW5lIEJJVDE2CTB4MDAwMTAwMDAKKyNkZWZpbmUgQklUMTcJMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOAkweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE5CTB4MDAwODAwMDAKKyNkZWZpbmUgQklUMjAJMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMQkweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIyCTB4MDA0MDAwMDAKKyNkZWZpbmUgQklUMjMJMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNAkweDAxMDAwMDAwCisjZGVmaW5lIEJJVDI1CTB4MDIwMDAwMDAKKyNkZWZpbmUgQklUMjYJMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNwkweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI4CTB4MTAwMDAwMDAKKyNkZWZpbmUgQklUMjkJMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMAkweDQwMDAwMDAwCisjZGVmaW5lIEJJVDMxCTB4ODAwMDAwMDAKKworCisjZGVmaW5lIEhETENfTUFYX0ZSQU1FX1NJWkUJNjU1MzUKKyNkZWZpbmUgTUFYX0FTWU5DX1RSQU5TTUlUCTQwOTYKKyNkZWZpbmUgTUFYX0FTWU5DX0JVRkZFUl9TSVpFCTQwOTYKKworI2RlZmluZSBBU1lOQ19QQVJJVFlfTk9ORQkJMAorI2RlZmluZSBBU1lOQ19QQVJJVFlfRVZFTgkJMQorI2RlZmluZSBBU1lOQ19QQVJJVFlfT0RECQkyCisjZGVmaW5lIEFTWU5DX1BBUklUWV9TUEFDRQkJMworCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9BQk9SVDcJMHgwMDAwCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9BQk9SVDE1CTB4MDAwMQorI2RlZmluZSBIRExDX0ZMQUdfVU5ERVJSVU5fRkxBRwkJMHgwMDAyCisjZGVmaW5lIEhETENfRkxBR19VTkRFUlJVTl9DUkMJCTB4MDAwNAorI2RlZmluZSBIRExDX0ZMQUdfU0hBUkVfWkVSTwkJMHgwMDEwCisjZGVmaW5lIEhETENfRkxBR19BVVRPX0NUUwkJMHgwMDIwCisjZGVmaW5lIEhETENfRkxBR19BVVRPX0RDRAkJMHgwMDQwCisjZGVmaW5lIEhETENfRkxBR19BVVRPX1JUUwkJMHgwMDgwCisjZGVmaW5lIEhETENfRkxBR19SWENfRFBMTAkJMHgwMTAwCisjZGVmaW5lIEhETENfRkxBR19SWENfQlJHCQkweDAyMDAKKyNkZWZpbmUgSERMQ19GTEFHX1JYQ19UWENQSU4JCTB4ODAwMAorI2RlZmluZSBIRExDX0ZMQUdfUlhDX1JYQ1BJTgkJMHgwMDAwCisjZGVmaW5lIEhETENfRkxBR19UWENfRFBMTAkJMHgwNDAwCisjZGVmaW5lIEhETENfRkxBR19UWENfQlJHCQkweDA4MDAKKyNkZWZpbmUgSERMQ19GTEFHX1RYQ19UWENQSU4JCTB4MDAwMAorI2RlZmluZSBIRExDX0ZMQUdfVFhDX1JYQ1BJTgkJMHgwMDA4CisjZGVmaW5lIEhETENfRkxBR19EUExMX0RJVjgJCTB4MTAwMAorI2RlZmluZSBIRExDX0ZMQUdfRFBMTF9ESVYxNgkJMHgyMDAwCisjZGVmaW5lIEhETENfRkxBR19EUExMX0RJVjMyCQkweDAwMDAKKyNkZWZpbmUgSERMQ19GTEFHX0hETENfTE9PUE1PREUJCTB4NDAwMAorCisjZGVmaW5lIEhETENfQ1JDX05PTkUJCQkwCisjZGVmaW5lIEhETENfQ1JDXzE2X0NDSVRUCQkxCisjZGVmaW5lIEhETENfQ1JDXzMyX0NDSVRUCQkyCisjZGVmaW5lIEhETENfQ1JDX01BU0sJCQkweDAwZmYKKyNkZWZpbmUgSERMQ19DUkNfUkVUVVJOX0VYCQkweDgwMDAKKworI2RlZmluZSBSWF9PSwkJCQkwCisjZGVmaW5lIFJYX0NSQ19FUlJPUgkJCTEKKworI2RlZmluZSBIRExDX1RYSURMRV9GTEFHUwkJMAorI2RlZmluZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUwkxCisjZGVmaW5lIEhETENfVFhJRExFX1pFUk9TCQkyCisjZGVmaW5lIEhETENfVFhJRExFX09ORVMJCTMKKyNkZWZpbmUgSERMQ19UWElETEVfQUxUX01BUktfU1BBQ0UJNAorI2RlZmluZSBIRExDX1RYSURMRV9TUEFDRQkJNQorI2RlZmluZSBIRExDX1RYSURMRV9NQVJLCQk2CisjZGVmaW5lIEhETENfVFhJRExFX0NVU1RPTV84ICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBIRExDX1RYSURMRV9DVVNUT01fMTYgICAgICAgICAgIDB4MjAwMDAwMDAKKworI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWgkJCTAKKyNkZWZpbmUgSERMQ19FTkNPRElOR19OUlpCCQkJMQorI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWklfTUFSSwkJCTIKKyNkZWZpbmUgSERMQ19FTkNPRElOR19OUlpJX1NQQUNFCQkzCisjZGVmaW5lIEhETENfRU5DT0RJTkdfTlJaSQkJCUhETENfRU5DT0RJTkdfTlJaSV9TUEFDRQorI2RlZmluZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfTUFSSwkJNAorI2RlZmluZSBIRExDX0VOQ09ESU5HX0JJUEhBU0VfU1BBQ0UJCTUKKyNkZWZpbmUgSERMQ19FTkNPRElOR19CSVBIQVNFX0xFVkVMCQk2CisjZGVmaW5lIEhETENfRU5DT0RJTkdfRElGRl9CSVBIQVNFX0xFVkVMCTcKKworI2RlZmluZSBIRExDX1BSRUFNQkxFX0xFTkdUSF84QklUUwkwCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzE2QklUUwkxCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzMyQklUUwkyCisjZGVmaW5lIEhETENfUFJFQU1CTEVfTEVOR1RIXzY0QklUUwkzCisKKyNkZWZpbmUgSERMQ19QUkVBTUJMRV9QQVRURVJOX05PTkUJMAorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fWkVST1MJMQorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fRkxBR1MJMgorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMTAJMworI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fMDEJNAorI2RlZmluZSBIRExDX1BSRUFNQkxFX1BBVFRFUk5fT05FUwk1CisKKyNkZWZpbmUgTUdTTF9NT0RFX0FTWU5DCQkxCisjZGVmaW5lIE1HU0xfTU9ERV9IRExDCQkyCisjZGVmaW5lIE1HU0xfTU9ERV9NT05PU1lOQwkzCisjZGVmaW5lIE1HU0xfTU9ERV9CSVNZTkMJNAorI2RlZmluZSBNR1NMX01PREVfUkFXCQk2CisKKyNkZWZpbmUgTUdTTF9CVVNfVFlQRV9JU0EJMQorI2RlZmluZSBNR1NMX0JVU19UWVBFX0VJU0EJMgorI2RlZmluZSBNR1NMX0JVU19UWVBFX1BDSQk1CisKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfTUFTSyAgICAgMHhmCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX0RJU0FCTEUgIDAKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfUlMyMzIgICAgMQorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9WMzUgICAgICAyCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JTNDIyICAgIDMKKyNkZWZpbmUgTUdTTF9JTlRFUkZBQ0VfUlRTX0VOICAgMHgxMAorI2RlZmluZSBNR1NMX0lOVEVSRkFDRV9MTCAgICAgICAweDIwCisjZGVmaW5lIE1HU0xfSU5URVJGQUNFX1JMICAgICAgIDB4NDAKKwordHlwZWRlZiBzdHJ1Y3QgX01HU0xfUEFSQU1TCit7CisJLyogQ29tbW9uICovCisKKwl1bnNpZ25lZCBsb25nCW1vZGU7CQkvKiBBc3luY2hyb25vdXMgb3IgSERMQyAqLworCXVuc2lnbmVkIGNoYXIJbG9vcGJhY2s7CS8qIGludGVybmFsIGxvb3BiYWNrIG1vZGUgKi8KKworCS8qIEhETEMgT25seSAqLworCisJdW5zaWduZWQgc2hvcnQJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgllbmNvZGluZzsJLyogTlJaLCBOUlpJLCBldGMuICovCisJdW5zaWduZWQgbG9uZwljbG9ja19zcGVlZDsJLyogZXh0ZXJuYWwgY2xvY2sgc3BlZWQgaW4gYml0cyBwZXIgc2Vjb25kICovCisJdW5zaWduZWQgY2hhcglhZGRyX2ZpbHRlcjsJLyogcmVjZWl2ZSBIRExDIGFkZHJlc3MgZmlsdGVyLCAweEZGID0gZGlzYWJsZSAqLworCXVuc2lnbmVkIHNob3J0CWNyY190eXBlOwkvKiBOb25lLCBDUkMxNi1DQ0lUVCwgb3IgQ1JDMzItQ0NJVFQgKi8KKwl1bnNpZ25lZCBjaGFyCXByZWFtYmxlX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyCXByZWFtYmxlOworCisJLyogQXN5bmMgT25seSAqLworCisJdW5zaWduZWQgbG9uZwlkYXRhX3JhdGU7CS8qIGJpdHMgcGVyIHNlY29uZCAqLworCXVuc2lnbmVkIGNoYXIJZGF0YV9iaXRzOwkvKiA3IG9yIDggZGF0YSBiaXRzICovCisJdW5zaWduZWQgY2hhcglzdG9wX2JpdHM7CS8qIDEgb3IgMiBzdG9wIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyCXBhcml0eTsJCS8qIG5vbmUsIGV2ZW4sIG9yIG9kZCAqLworCit9IE1HU0xfUEFSQU1TLCAqUE1HU0xfUEFSQU1TOworCisjZGVmaW5lIE1JQ1JPR0FURV9WRU5ET1JfSUQgMHgxM2MwCisjZGVmaW5lIFNZTkNMSU5LX0RFVklDRV9JRCAweDAwMTAKKyNkZWZpbmUgTUdTQ0NfREVWSUNFX0lEIDB4MDAyMAorI2RlZmluZSBTWU5DTElOS19TQ0FfREVWSUNFX0lEIDB4MDAzMAorI2RlZmluZSBTWU5DTElOS19HVF9ERVZJQ0VfSUQgMHgwMDcwCisjZGVmaW5lIFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQgMHgwMDgwCisjZGVmaW5lIFNZTkNMSU5LX0FDX0RFVklDRV9JRCAgMHgwMDkwCisjZGVmaW5lIFNZTkNMSU5LX0dUMl9ERVZJQ0VfSUQgMHgwMEEwCisjZGVmaW5lIE1HU0xfTUFYX1NFUklBTF9OVU1CRVIgMzAKKworLyoKKyoqIGRldmljZSBkaWFnbm9zdGljcyBzdGF0dXMKKyovCisKKyNkZWZpbmUgRGlhZ1N0YXR1c19PSwkJCQkwCisjZGVmaW5lIERpYWdTdGF0dXNfQWRkcmVzc0ZhaWx1cmUJCTEKKyNkZWZpbmUgRGlhZ1N0YXR1c19BZGRyZXNzQ29uZmxpY3QJCTIKKyNkZWZpbmUgRGlhZ1N0YXR1c19JcnFGYWlsdXJlCQkJMworI2RlZmluZSBEaWFnU3RhdHVzX0lycUNvbmZsaWN0CQkJNAorI2RlZmluZSBEaWFnU3RhdHVzX0RtYUZhaWx1cmUJCQk1CisjZGVmaW5lIERpYWdTdGF0dXNfRG1hQ29uZmxpY3QJCQk2CisjZGVmaW5lIERpYWdTdGF0dXNfUGNpQWRhcHRlck5vdEZvdW5kCQk3CisjZGVmaW5lIERpYWdTdGF0dXNfQ2FudEFzc2lnblBjaVJlc291cmNlcwk4CisjZGVmaW5lIERpYWdTdGF0dXNfQ2FudEFzc2lnblBjaU1lbUFkZHIJCTkKKyNkZWZpbmUgRGlhZ1N0YXR1c19DYW50QXNzaWduUGNpSW9BZGRyCQkxMAorI2RlZmluZSBEaWFnU3RhdHVzX0NhbnRBc3NpZ25QY2lJcnEJCTExCisjZGVmaW5lIERpYWdTdGF0dXNfTWVtb3J5RXJyb3IJCQkxMgorCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9EQ0QgICAgICAgICAgICAweDAxICAgICAvKiBEYXRhIENhcnJpZXIgRGV0ZWN0ICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9UWEQgICAgICAgICAgICAweDAyICAgICAvKiBUcmFuc21pdCBEYXRhICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9SSSAgICAgICAgICAgICAweDA0ICAgICAvKiBSaW5nIEluZGljYXRvciAqLworI2RlZmluZSBTZXJpYWxTaWduYWxfUlhEICAgICAgICAgICAgMHgwOCAgICAgLyogUmVjZWl2ZSBEYXRhICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9DVFMgICAgICAgICAgICAweDEwICAgICAvKiBDbGVhciB0byBTZW5kICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9SVFMgICAgICAgICAgICAweDIwICAgICAvKiBSZXF1ZXN0IHRvIFNlbmQgKi8KKyNkZWZpbmUgU2VyaWFsU2lnbmFsX0RTUiAgICAgICAgICAgIDB4NDAgICAgIC8qIERhdGEgU2V0IFJlYWR5ICovCisjZGVmaW5lIFNlcmlhbFNpZ25hbF9EVFIgICAgICAgICAgICAweDgwICAgICAvKiBEYXRhIFRlcm1pbmFsIFJlYWR5ICovCisKKworLyoKKyAqIENvdW50ZXJzIG9mIHRoZSBpbnB1dCBsaW5lcyAoQ1RTLCBEU1IsIFJJLCBDRCkgaW50ZXJydXB0cworICovCitzdHJ1Y3QgbWdzbF9pY291bnQgeworCV9fdTMyCWN0cywgZHNyLCBybmcsIGRjZCwgdHgsIHJ4OworCV9fdTMyCWZyYW1lLCBwYXJpdHksIG92ZXJydW4sIGJyazsKKwlfX3UzMglidWZfb3ZlcnJ1bjsKKwlfX3UzMgl0eG9rOworCV9fdTMyCXR4dW5kZXI7CisJX191MzIJdHhhYm9ydDsKKwlfX3UzMgl0eHRpbWVvdXQ7CisJX191MzIJcnhzaG9ydDsKKwlfX3UzMglyeGxvbmc7CisJX191MzIJcnhhYm9ydDsKKwlfX3UzMglyeG92ZXI7CisJX191MzIJcnhjcmM7CisJX191MzIJcnhvazsKKwlfX3UzMglleGl0aHVudDsKKwlfX3UzMglyeGlkbGU7Cit9OworCitzdHJ1Y3QgZ3Bpb19kZXNjIHsKKwlfX3UzMiBzdGF0ZTsKKwlfX3UzMiBzbWFzazsKKwlfX3UzMiBkaXI7CisJX191MzIgZG1hc2s7Cit9OworCisjZGVmaW5lIERFQlVHX0xFVkVMX0RBVEEJMQorI2RlZmluZSBERUJVR19MRVZFTF9FUlJPUiAJMgorI2RlZmluZSBERUJVR19MRVZFTF9JTkZPICAJMworI2RlZmluZSBERUJVR19MRVZFTF9CSCAgICAJNAorI2RlZmluZSBERUJVR19MRVZFTF9JU1IJCTUKKworLyoKKyoqIEV2ZW50IGJpdCBmbGFncyBmb3IgdXNlIHdpdGggTWdzbFdhaXRFdmVudAorKi8KKworI2RlZmluZSBNZ3NsRXZlbnRfRHNyQWN0aXZlCTB4MDAwMQorI2RlZmluZSBNZ3NsRXZlbnRfRHNySW5hY3RpdmUJMHgwMDAyCisjZGVmaW5lIE1nc2xFdmVudF9Ec3IJCTB4MDAwMworI2RlZmluZSBNZ3NsRXZlbnRfQ3RzQWN0aXZlCTB4MDAwNAorI2RlZmluZSBNZ3NsRXZlbnRfQ3RzSW5hY3RpdmUJMHgwMDA4CisjZGVmaW5lIE1nc2xFdmVudF9DdHMJCTB4MDAwYworI2RlZmluZSBNZ3NsRXZlbnRfRGNkQWN0aXZlCTB4MDAxMAorI2RlZmluZSBNZ3NsRXZlbnRfRGNkSW5hY3RpdmUJMHgwMDIwCisjZGVmaW5lIE1nc2xFdmVudF9EY2QJCTB4MDAzMAorI2RlZmluZSBNZ3NsRXZlbnRfUmlBY3RpdmUJMHgwMDQwCisjZGVmaW5lIE1nc2xFdmVudF9SaUluYWN0aXZlCTB4MDA4MAorI2RlZmluZSBNZ3NsRXZlbnRfUmkJCTB4MDBjMAorI2RlZmluZSBNZ3NsRXZlbnRfRXhpdEh1bnRNb2RlCTB4MDEwMAorI2RlZmluZSBNZ3NsRXZlbnRfSWRsZVJlY2VpdmVkCTB4MDIwMAorCisvKiBQcml2YXRlIElPQ1RMIGNvZGVzOgorICoKKyAqIE1HU0xfSU9DU1BBUkFNUwlzZXQgTUdTTF9QQVJBTVMgc3RydWN0dXJlIHZhbHVlcworICogTUdTTF9JT0NHUEFSQU1TCWdldCBjdXJyZW50IE1HU0xfUEFSQU1TIHN0cnVjdHVyZSB2YWx1ZXMKKyAqIE1HU0xfSU9DU1RYSURMRQlzZXQgY3VycmVudCB0cmFuc21pdCBpZGxlIG1vZGUKKyAqIE1HU0xfSU9DR1RYSURMRQlnZXQgY3VycmVudCB0cmFuc21pdCBpZGxlIG1vZGUKKyAqIE1HU0xfSU9DVFhFTkFCTEUJZW5hYmxlIG9yIGRpc2FibGUgdHJhbnNtaXR0ZXIKKyAqIE1HU0xfSU9DUlhFTkFCTEUJZW5hYmxlIG9yIGRpc2FibGUgcmVjZWl2ZXIKKyAqIE1HU0xfSU9DVFhBQk9SVAlhYm9ydCB0cmFuc21pdHRpbmcgZnJhbWUgKEhETEMpCisgKiBNR1NMX0lPQ0dTVEFUUwlyZXR1cm4gY3VycmVudCBzdGF0aXN0aWNzCisgKiBNR1NMX0lPQ1dBSVRFVkVOVAl3YWl0IGZvciBzcGVjaWZpZWQgZXZlbnQgdG8gb2NjdXIKKyAqIE1HU0xfTE9PUFRYRE9ORQl0cmFuc21pdCBpbiBIRExDIExvb3BNb2RlIGRvbmUKKyAqIE1HU0xfSU9DU0lGICAgICAgICAgIHNldCB0aGUgc2VyaWFsIGludGVyZmFjZSB0eXBlCisgKiBNR1NMX0lPQ0dJRiAgICAgICAgICBnZXQgdGhlIHNlcmlhbCBpbnRlcmZhY2UgdHlwZQorICovCisjZGVmaW5lIE1HU0xfTUFHSUNfSU9DCSdtJworI2RlZmluZSBNR1NMX0lPQ1NQQVJBTVMJCV9JT1coTUdTTF9NQUdJQ19JT0MsMCxzdHJ1Y3QgX01HU0xfUEFSQU1TKQorI2RlZmluZSBNR1NMX0lPQ0dQQVJBTVMJCV9JT1IoTUdTTF9NQUdJQ19JT0MsMSxzdHJ1Y3QgX01HU0xfUEFSQU1TKQorI2RlZmluZSBNR1NMX0lPQ1NUWElETEUJCV9JTyhNR1NMX01BR0lDX0lPQywyKQorI2RlZmluZSBNR1NMX0lPQ0dUWElETEUJCV9JTyhNR1NMX01BR0lDX0lPQywzKQorI2RlZmluZSBNR1NMX0lPQ1RYRU5BQkxFCV9JTyhNR1NMX01BR0lDX0lPQyw0KQorI2RlZmluZSBNR1NMX0lPQ1JYRU5BQkxFCV9JTyhNR1NMX01BR0lDX0lPQyw1KQorI2RlZmluZSBNR1NMX0lPQ1RYQUJPUlQJCV9JTyhNR1NMX01BR0lDX0lPQyw2KQorI2RlZmluZSBNR1NMX0lPQ0dTVEFUUwkJX0lPKE1HU0xfTUFHSUNfSU9DLDcpCisjZGVmaW5lIE1HU0xfSU9DV0FJVEVWRU5UCV9JT1dSKE1HU0xfTUFHSUNfSU9DLDgsaW50KQorI2RlZmluZSBNR1NMX0lPQ0NMUk1PRENPVU5UCV9JTyhNR1NMX01BR0lDX0lPQywxNSkKKyNkZWZpbmUgTUdTTF9JT0NMT09QVFhET05FCV9JTyhNR1NMX01BR0lDX0lPQyw5KQorI2RlZmluZSBNR1NMX0lPQ1NJRgkJX0lPKE1HU0xfTUFHSUNfSU9DLDEwKQorI2RlZmluZSBNR1NMX0lPQ0dJRgkJX0lPKE1HU0xfTUFHSUNfSU9DLDExKQorI2RlZmluZSBNR1NMX0lPQ1NHUElPCQlfSU9XKE1HU0xfTUFHSUNfSU9DLDE2LHN0cnVjdCBncGlvX2Rlc2MpCisjZGVmaW5lIE1HU0xfSU9DR0dQSU8JCV9JT1IoTUdTTF9NQUdJQ19JT0MsMTcsc3RydWN0IGdwaW9fZGVzYykKKyNkZWZpbmUgTUdTTF9JT0NXQUlUR1BJTwlfSU9XUihNR1NMX01BR0lDX0lPQywxOCxzdHJ1Y3QgZ3Bpb19kZXNjKQorCisKKyNlbmRpZiAvKiBfU1lOQ0xJTktfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvc3lzY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZjcwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC0wLDAgKzEsOTQwIEBACisvKgorICogc3lzY3RsLmg6IEdlbmVyYWwgbGludXggc3lzdGVtIGNvbnRyb2wgaW50ZXJmYWNlCisgKgorICogQmVndW4gMjQgTWFyY2ggMTk5NSwgU3RlcGhlbiBUd2VlZGllCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiAgV0FSTklORzoKKyAqKiAgVGhlIHZhbHVlcyBpbiB0aGlzIGZpbGUgYXJlIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UgdmlhIAorICoqICB0aGUgc3lzY3RsKCkgYmluYXJ5IGludGVyZmFjZS4gIERvICpOT1QqIGNoYW5nZSB0aGUKKyAqKiAgbnVtYmVyaW5nIG9mIGFueSBleGlzdGluZyB2YWx1ZXMgaGVyZSwgYW5kIGRvIG5vdCBjaGFuZ2UKKyAqKiAgYW55IG51bWJlcnMgd2l0aGluIGFueSBvbmUgc2V0IG9mIHZhbHVlcy4gIElmIHlvdSBoYXZlIHRvCisgKiogIHJlZGVmaW5lIGFuIGV4aXN0aW5nIGludGVyZmFjZSwgdXNlIGEgbmV3IG51bWJlciBmb3IgaXQuCisgKiogIFRoZSBrZXJuZWwgd2lsbCB0aGVuIHJldHVybiAtRU5PVERJUiB0byBhbnkgYXBwbGljYXRpb24gdXNpbmcKKyAqKiAgdGhlIG9sZCBiaW5hcnkgaW50ZXJmYWNlLgorICoqCisgKiogIEZvciBuZXcgaW50ZXJmYWNlcyB1bmxlc3MgeW91IHJlYWxseSBuZWVkIGEgYmluYXJ5IG51bWJlcgorICoqICBwbGVhc2UgdXNlIENUTF9VTk5VTUJFUkVELgorICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9MSU5VWF9TWVNDVExfSAorI2RlZmluZSBfTElOVVhfU1lTQ1RMX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBmaWxlOworc3RydWN0IGNvbXBsZXRpb247CisKKyNkZWZpbmUgQ1RMX01BWE5BTUUgMTAJCS8qIGhvdyBtYW55IHBhdGggY29tcG9uZW50cyBkbyB3ZSBhbGxvdyBpbiBhCisJCQkJICAgY2FsbCB0byBzeXNjdGw/ICAgSW4gb3RoZXIgd29yZHMsIHdoYXQgaXMKKwkJCQkgICB0aGUgbGFyZ2VzdCBhY2NlcHRhYmxlIHZhbHVlIGZvciB0aGUgbmxlbgorCQkJCSAgIG1lbWJlciBvZiBhIHN0cnVjdCBfX3N5c2N0bF9hcmdzIHRvIGhhdmU/ICovCisKK3N0cnVjdCBfX3N5c2N0bF9hcmdzIHsKKwlpbnQgKm5hbWU7CisJaW50IG5sZW47CisJdm9pZCAqb2xkdmFsOworCXNpemVfdCAqb2xkbGVucDsKKwl2b2lkICpuZXd2YWw7CisJc2l6ZV90IG5ld2xlbjsKKwl1bnNpZ25lZCBsb25nIF9fdW51c2VkWzRdOworfTsKKworLyogRGVmaW5lIHN5c2N0bCBuYW1lcyBmaXJzdCAqLworCisvKiBUb3AtbGV2ZWwgbmFtZXM6ICovCisKKy8qIEZvciBpbnRlcm5hbCBwYXR0ZXJuLW1hdGNoaW5nIHVzZSBvbmx5OiAqLworCitlbnVtCit7CisJQ1RMX0tFUk49MSwJCS8qIEdlbmVyYWwga2VybmVsIGluZm8gYW5kIGNvbnRyb2wgKi8KKwlDVExfVk09MiwJCS8qIFZNIG1hbmFnZW1lbnQgKi8KKwlDVExfTkVUPTMsCQkvKiBOZXR3b3JraW5nICovCisJQ1RMX1BST0M9NCwJCS8qIHJlbW92YWwgYnJlYWtzIHN0cmFjZSgxKSBjb21waWxhdGlvbiAqLworCUNUTF9GUz01LAkJLyogRmlsZXN5c3RlbXMgKi8KKwlDVExfREVCVUc9NiwJCS8qIERlYnVnZ2luZyAqLworCUNUTF9ERVY9NywJCS8qIERldmljZXMgKi8KKwlDVExfQlVTPTgsCQkvKiBCdXNzZXMgKi8KKwlDVExfQUJJPTksCQkvKiBCaW5hcnkgZW11bGF0aW9uICovCisJQ1RMX0NQVT0xMCwJCS8qIENQVSBzdHVmZiAoc3BlZWQgc2NhbGluZywgZXRjKSAqLworCUNUTF9BUkxBTj0yNTQsCQkvKiBhcmxhbiB3aXJlbGVzcyBkcml2ZXIgKi8KKwlDVExfUzM5MERCRj01Njc3LAkvKiBzMzkwIGRlYnVnICovCisJQ1RMX1NVTlJQQz03MjQ5LAkvKiBzdW5ycGMgZGVidWcgKi8KKwlDVExfUE09OTg5OSwJCS8qIGZydiBwb3dlciBtYW5hZ2VtZW50ICovCisJQ1RMX0ZSVj05ODk4LAkJLyogZnJ2IHNwZWNpZmljIHN5c2N0bHMgKi8KK307CisKKy8qIENUTF9CVVMgbmFtZXM6ICovCitlbnVtCit7CisJQ1RMX0JVU19JU0E9MQkJLyogSVNBICovCit9OworCisvKiAvcHJvYy9zeXMvZnMvaW5vdGlmeS8gKi8KK2VudW0KK3sKKwlJTk9USUZZX01BWF9VU0VSX0lOU1RBTkNFUz0xLAkvKiBtYXggaW5zdGFuY2VzIHBlciB1c2VyICovCisJSU5PVElGWV9NQVhfVVNFUl9XQVRDSEVTPTIsCS8qIG1heCB3YXRjaGVzIHBlciB1c2VyICovCisJSU5PVElGWV9NQVhfUVVFVUVEX0VWRU5UUz0zCS8qIG1heCBxdWV1ZWQgZXZlbnRzIHBlciBpbnN0YW5jZSAqLworfTsKKworLyogQ1RMX0tFUk4gbmFtZXM6ICovCitlbnVtCit7CisJS0VSTl9PU1RZUEU9MSwJCS8qIHN0cmluZzogc3lzdGVtIHZlcnNpb24gKi8KKwlLRVJOX09TUkVMRUFTRT0yLAkvKiBzdHJpbmc6IHN5c3RlbSByZWxlYXNlICovCisJS0VSTl9PU1JFVj0zLAkJLyogaW50OiBzeXN0ZW0gcmV2aXNpb24gKi8KKwlLRVJOX1ZFUlNJT049NCwJCS8qIHN0cmluZzogY29tcGlsZSB0aW1lIGluZm8gKi8KKwlLRVJOX1NFQ1VSRU1BU0s9NSwJLyogc3RydWN0OiBtYXhpbXVtIHJpZ2h0cyBtYXNrICovCisJS0VSTl9QUk9GPTYsCQkvKiB0YWJsZTogcHJvZmlsaW5nIGluZm9ybWF0aW9uICovCisJS0VSTl9OT0RFTkFNRT03LAorCUtFUk5fRE9NQUlOTkFNRT04LAorCisJS0VSTl9DQVBfQlNFVD0xNCwJLyogaW50OiBjYXBhYmlsaXR5IGJvdW5kaW5nIHNldCAqLworCUtFUk5fUEFOSUM9MTUsCQkvKiBpbnQ6IHBhbmljIHRpbWVvdXQgKi8KKwlLRVJOX1JFQUxST09UREVWPTE2LAkvKiByZWFsIHJvb3QgZGV2aWNlIHRvIG1vdW50IGFmdGVyIGluaXRyZCAqLworCisJS0VSTl9TUEFSQ19SRUJPT1Q9MjEsCS8qIHJlYm9vdCBjb21tYW5kIG9uIFNwYXJjICovCisJS0VSTl9DVExBTFRERUw9MjIsCS8qIGludDogYWxsb3cgY3RsLWFsdC1kZWwgdG8gcmVib290ICovCisJS0VSTl9QUklOVEs9MjMsCQkvKiBzdHJ1Y3Q6IGNvbnRyb2wgcHJpbnRrIGxvZ2dpbmcgcGFyYW1ldGVycyAqLworCUtFUk5fTkFNRVRSQU5TPTI0LAkvKiBOYW1lIHRyYW5zbGF0aW9uICovCisJS0VSTl9QUENfSFRBQlJFQ0xBSU09MjUsIC8qIHR1cm4gaHRhYiByZWNsYWltYXRpb24gb24vb2ZmIG9uIFBQQyAqLworCUtFUk5fUFBDX1pFUk9QQUdFRD0yNiwJLyogdHVybiBpZGxlIHBhZ2UgemVyb2luZyBvbi9vZmYgb24gUFBDICovCisJS0VSTl9QUENfUE9XRVJTQVZFX05BUD0yNywgLyogdXNlIG5hcCBtb2RlIGZvciBwb3dlciBzYXZpbmcgKi8KKwlLRVJOX01PRFBST0JFPTI4LAorCUtFUk5fU0dfQklHX0JVRkY9MjksCisJS0VSTl9BQ0NUPTMwLAkJLyogQlNEIHByb2Nlc3MgYWNjb3VudGluZyBwYXJhbWV0ZXJzICovCisJS0VSTl9QUENfTDJDUj0zMSwJLyogbDJjciByZWdpc3RlciBvbiBQUEMgKi8KKworCUtFUk5fUlRTSUdOUj0zMiwJLyogTnVtYmVyIG9mIHJ0IHNpZ3MgcXVldWVkICovCisJS0VSTl9SVFNJR01BWD0zMywJLyogTWF4IHF1ZXVhYmxlICovCisJCisJS0VSTl9TSE1NQVg9MzQsICAgICAgICAgLyogbG9uZzogTWF4aW11bSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgKi8KKwlLRVJOX01TR01BWD0zNSwgICAgICAgICAvKiBpbnQ6IE1heGltdW0gc2l6ZSBvZiBhIG1lc3NlZ2UgKi8KKwlLRVJOX01TR01OQj0zNiwgICAgICAgICAvKiBpbnQ6IE1heGltdW0gbWVzc2FnZSBxdWV1ZSBzaXplICovCisJS0VSTl9NU0dQT09MPTM3LCAgICAgICAgLyogaW50OiBNYXhpbXVtIHN5c3RlbSBtZXNzYWdlIHBvb2wgc2l6ZSAqLworCUtFUk5fU1lTUlE9MzgsCQkvKiBpbnQ6IFN5c3JlcSBlbmFibGUgKi8KKwlLRVJOX01BWF9USFJFQURTPTM5LAkvKiBpbnQ6IE1heGltdW0gbnIgb2YgdGhyZWFkcyBpbiB0aGUgc3lzdGVtICovCisgCUtFUk5fUkFORE9NPTQwLAkJLyogUmFuZG9tIGRyaXZlciAqLworIAlLRVJOX1NITUFMTD00MSwJCS8qIGludDogTWF4aW11bSBzaXplIG9mIHNoYXJlZCBtZW1vcnkgKi8KKyAJS0VSTl9NU0dNTkk9NDIsCQkvKiBpbnQ6IG1zZyBxdWV1ZSBpZGVudGlmaWVycyAqLworIAlLRVJOX1NFTT00MywJCS8qIHN0cnVjdDogc3lzdiBzZW1hcGhvcmUgbGltaXRzICovCisgCUtFUk5fU1BBUkNfU1RPUF9BPTQ0LAkvKiBpbnQ6IFNwYXJjIFN0b3AtQSBlbmFibGUgKi8KKyAJS0VSTl9TSE1NTkk9NDUsCQkvKiBpbnQ6IHNobSBhcnJheSBpZGVudGlmaWVycyAqLworCUtFUk5fT1ZFUkZMT1dVSUQ9NDYsCS8qIGludDogb3ZlcmZsb3cgVUlEICovCisJS0VSTl9PVkVSRkxPV0dJRD00NywJLyogaW50OiBvdmVyZmxvdyBHSUQgKi8KKwlLRVJOX1NITVBBVEg9NDgsCS8qIHN0cmluZzogcGF0aCB0byBzaG0gZnMgKi8KKwlLRVJOX0hPVFBMVUc9NDksCS8qIHN0cmluZzogcGF0aCB0byB1ZXZlbnQgaGVscGVyIChkZXByZWNhdGVkKSAqLworCUtFUk5fSUVFRV9FTVVMQVRJT05fV0FSTklOR1M9NTAsIC8qIGludDogdW5pbXBsZW1lbnRlZCBpZWVlIGluc3RydWN0aW9ucyAqLworCUtFUk5fUzM5MF9VU0VSX0RFQlVHX0xPR0dJTkc9NTEsICAvKiBpbnQ6IGR1bXBzIG9mIHVzZXIgZmF1bHRzICovCisJS0VSTl9DT1JFX1VTRVNfUElEPTUyLAkJLyogaW50OiB1c2UgY29yZSBvciBjb3JlLiVwaWQgKi8KKwlLRVJOX1RBSU5URUQ9NTMsCS8qIGludDogdmFyaW91cyBrZXJuZWwgdGFpbnRlZCBmbGFncyAqLworCUtFUk5fQ0FEUElEPTU0LAkJLyogaW50OiBQSUQgb2YgdGhlIHByb2Nlc3MgdG8gbm90aWZ5IG9uIENBRCAqLworCUtFUk5fUElETUFYPTU1LAkJLyogaW50OiBQSUQgIyBsaW1pdCAqLworICAJS0VSTl9DT1JFX1BBVFRFUk49NTYsCS8qIHN0cmluZzogcGF0dGVybiBmb3IgY29yZS1maWxlIG5hbWVzICovCisJS0VSTl9QQU5JQ19PTl9PT1BTPTU3LCAgLyogaW50OiB3aGV0aGVyIHdlIHdpbGwgcGFuaWMgb24gYW4gb29wcyAqLworCUtFUk5fSFBQQV9QV1JTVz01OCwJLyogaW50OiBocHBhIHNvZnQtcG93ZXIgZW5hYmxlICovCisJS0VSTl9IUFBBX1VOQUxJR05FRD01OSwJLyogaW50OiBocHBhIHVuYWxpZ25lZC10cmFwIGVuYWJsZSAqLworCUtFUk5fUFJJTlRLX1JBVEVMSU1JVD02MCwgLyogaW50OiB0dW5lIHByaW50ayByYXRlbGltaXRpbmcgKi8KKwlLRVJOX1BSSU5US19SQVRFTElNSVRfQlVSU1Q9NjEsCS8qIGludDogdHVuZSBwcmludGsgcmF0ZWxpbWl0aW5nICovCisJS0VSTl9QVFk9NjIsCQkvKiBkaXI6IHB0eSBkcml2ZXIgKi8KKwlLRVJOX05HUk9VUFNfTUFYPTYzLAkvKiBpbnQ6IE5HUk9VUFNfTUFYICovCisJS0VSTl9TUEFSQ19TQ09OU19QV1JPRkY9NjQsIC8qIGludDogc2VyaWFsIGNvbnNvbGUgcG93ZXItb2ZmIGhhbHQgKi8KKwlLRVJOX0haX1RJTUVSPTY1LAkvKiBpbnQ6IGh6IHRpbWVyIG9uIG9yIG9mZiAqLworCUtFUk5fVU5LTk9XTl9OTUlfUEFOSUM9NjYsIC8qIGludDogdW5rbm93biBubWkgcGFuaWMgZmxhZyAqLworCUtFUk5fQk9PVExPQURFUl9UWVBFPTY3LCAvKiBpbnQ6IGJvb3QgbG9hZGVyIHR5cGUgKi8KKwlLRVJOX1JBTkRPTUlaRT02OCwgLyogaW50OiByYW5kb21pemUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCisJS0VSTl9TRVRVSURfRFVNUEFCTEU9NjksIC8qIGludDogYmVoYXZpb3VyIG9mIGR1bXBzIGZvciBzZXR1aWQgY29yZSAqLworCUtFUk5fU1BJTl9SRVRSWT03MCwJLyogaW50OiBudW1iZXIgb2Ygc3BpbmxvY2sgcmV0cmllcyAqLworCUtFUk5fQUNQSV9WSURFT19GTEFHUz03MSwgLyogaW50OiBmbGFncyBmb3Igc2V0dGluZyB1cCB2aWRlbyBhZnRlciBBQ1BJIHNsZWVwICovCisJS0VSTl9JQTY0X1VOQUxJR05FRD03MiwgLyogaW50OiBpYTY0IHVuYWxpZ25lZCB1c2VybGFuZCB0cmFwIGVuYWJsZSAqLworCUtFUk5fQ09NUEFUX0xPRz03MywJLyogaW50OiBwcmludCBjb21wYXQgbGF5ZXIgIG1lc3NhZ2VzICovCisJS0VSTl9NQVhfTE9DS19ERVBUSD03NCwKKwlLRVJOX05NSV9XQVRDSERPRz03NSwgLyogaW50OiBlbmFibGUvZGlzYWJsZSBubWkgd2F0Y2hkb2cgKi8KKwlLRVJOX1BBTklDX09OX05NST03NiwgLyogaW50OiB3aGV0aGVyIHdlIHdpbGwgcGFuaWMgb24gYW4gdW5yZWNvdmVyZWQgKi8KK307CisKKworCisvKiBDVExfVk0gbmFtZXM6ICovCitlbnVtCit7CisJVk1fVU5VU0VEMT0xLAkJLyogd2FzOiBzdHJ1Y3Q6IFNldCB2bSBzd2FwcGluZyBjb250cm9sICovCisJVk1fVU5VU0VEMj0yLAkJLyogd2FzOyBpbnQ6IExpbmVhciBvciBzcXJ0KCkgc3dhcG91dCBmb3IgaG9ncyAqLworCVZNX1VOVVNFRDM9MywJCS8qIHdhczogc3RydWN0OiBTZXQgZnJlZSBwYWdlIHRocmVzaG9sZHMgKi8KKwlWTV9VTlVTRUQ0PTQsCQkvKiBTcGFyZSAqLworCVZNX09WRVJDT01NSVRfTUVNT1JZPTUsCS8qIFR1cm4gb2ZmIHRoZSB2aXJ0dWFsIG1lbW9yeSBzYWZldHkgbGltaXQgKi8KKwlWTV9VTlVTRUQ1PTYsCQkvKiB3YXM6IHN0cnVjdDogU2V0IGJ1ZmZlciBtZW1vcnkgdGhyZXNob2xkcyAqLworCVZNX1VOVVNFRDc9NywJCS8qIHdhczogc3RydWN0OiBTZXQgY2FjaGUgbWVtb3J5IHRocmVzaG9sZHMgKi8KKwlWTV9VTlVTRUQ4PTgsCQkvKiB3YXM6IHN0cnVjdDogQ29udHJvbCBrc3dhcGQgYmVoYXZpb3VyICovCisJVk1fVU5VU0VEOT05LAkJLyogd2FzOiBzdHJ1Y3Q6IFNldCBwYWdlIHRhYmxlIGNhY2hlIHBhcmFtZXRlcnMgKi8KKwlWTV9QQUdFX0NMVVNURVI9MTAsCS8qIGludDogc2V0IG51bWJlciBvZiBwYWdlcyB0byBzd2FwIHRvZ2V0aGVyICovCisJVk1fRElSVFlfQkFDS0dST1VORD0xMSwJLyogZGlydHlfYmFja2dyb3VuZF9yYXRpbyAqLworCVZNX0RJUlRZX1JBVElPPTEyLAkvKiBkaXJ0eV9yYXRpbyAqLworCVZNX0RJUlRZX1dCX0NTPTEzLAkvKiBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzICovCisJVk1fRElSVFlfRVhQSVJFX0NTPTE0LAkvKiBkaXJ0eV9leHBpcmVfY2VudGlzZWNzICovCisJVk1fTlJfUERGTFVTSF9USFJFQURTPTE1LCAvKiBucl9wZGZsdXNoX3RocmVhZHMgKi8KKwlWTV9PVkVSQ09NTUlUX1JBVElPPTE2LCAvKiBwZXJjZW50IG9mIFJBTSB0byBhbGxvdyBvdmVyY29tbWl0IGluICovCisJVk1fUEFHRUJVRj0xNywJCS8qIHN0cnVjdDogQ29udHJvbCBwYWdlYnVmIHBhcmFtZXRlcnMgKi8KKwlWTV9IVUdFVExCX1BBR0VTPTE4LAkvKiBpbnQ6IE51bWJlciBvZiBhdmFpbGFibGUgSHVnZSBQYWdlcyAqLworCVZNX1NXQVBQSU5FU1M9MTksCS8qIFRlbmRlbmN5IHRvIHN0ZWFsIG1hcHBlZCBtZW1vcnkgKi8KKwlWTV9MT1dNRU1fUkVTRVJWRV9SQVRJTz0yMCwvKiByZXNlcnZhdGlvbiByYXRpbyBmb3IgbG93ZXIgbWVtb3J5IHpvbmVzICovCisJVk1fTUlOX0ZSRUVfS0JZVEVTPTIxLAkvKiBNaW5pbXVtIGZyZWUga2lsb2J5dGVzIHRvIG1haW50YWluICovCisJVk1fTUFYX01BUF9DT1VOVD0yMiwJLyogaW50OiBNYXhpbXVtIG51bWJlciBvZiBtbWFwcy9hZGRyZXNzLXNwYWNlICovCisJVk1fTEFQVE9QX01PREU9MjMsCS8qIHZtIGxhcHRvcCBtb2RlICovCisJVk1fQkxPQ0tfRFVNUD0yNCwJLyogYmxvY2sgZHVtcCBtb2RlICovCisJVk1fSFVHRVRMQl9HUk9VUD0yNSwJLyogcGVybWl0dGVkIGh1Z2V0bGIgZ3JvdXAgKi8KKwlWTV9WRlNfQ0FDSEVfUFJFU1NVUkU9MjYsIC8qIGRjYWNoZS9pY2FjaGUgcmVjbGFpbSBwcmVzc3VyZSAqLworCVZNX0xFR0FDWV9WQV9MQVlPVVQ9MjcsIC8qIGxlZ2FjeS9jb21wYXRpYmlsaXR5IHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBsYXlvdXQgKi8KKwlWTV9TV0FQX1RPS0VOX1RJTUVPVVQ9MjgsIC8qIGRlZmF1bHQgdGltZSBmb3IgdG9rZW4gdGltZSBvdXQgKi8KKwlWTV9EUk9QX1BBR0VDQUNIRT0yOSwJLyogaW50OiBudWtlIGxvdHMgb2YgcGFnZWNhY2hlICovCisJVk1fUEVSQ1BVX1BBR0VMSVNUX0ZSQUNUSU9OPTMwLC8qIGludDogZnJhY3Rpb24gb2YgcGFnZXMgaW4gZWFjaCBwZXJjcHVfcGFnZWxpc3QgKi8KKwlWTV9aT05FX1JFQ0xBSU1fTU9ERT0zMSwgLyogcmVjbGFpbSBsb2NhbCB6b25lIG1lbW9yeSBiZWZvcmUgZ29pbmcgb2ZmIG5vZGUgKi8KKwlWTV9NSU5fVU5NQVBQRUQ9MzIsCS8qIFNldCBtaW4gcGVyY2VudCBvZiB1bm1hcHBlZCBwYWdlcyAqLworCVZNX1BBTklDX09OX09PTT0zMywJLyogcGFuaWMgYXQgb3V0LW9mLW1lbW9yeSAqLworCVZNX1ZEU09fRU5BQkxFRD0zNCwJLyogbWFwIFZEU08gaW50byBuZXcgcHJvY2Vzc2VzPyAqLworCVZNX01JTl9TTEFCPTM1LAkJIC8qIFBlcmNlbnQgcGFnZXMgaWdub3JlZCBieSB6b25lIHJlY2xhaW0gKi8KK307CisKKworLyogQ1RMX05FVCBuYW1lczogKi8KK2VudW0KK3sKKwlORVRfQ09SRT0xLAorCU5FVF9FVEhFUj0yLAorCU5FVF84MDI9MywKKwlORVRfVU5JWD00LAorCU5FVF9JUFY0PTUsCisJTkVUX0lQWD02LAorCU5FVF9BVEFMSz03LAorCU5FVF9ORVRST009OCwKKwlORVRfQVgyNT05LAorCU5FVF9CUklER0U9MTAsCisJTkVUX1JPU0U9MTEsCisJTkVUX0lQVjY9MTIsCisJTkVUX1gyNT0xMywKKwlORVRfVFI9MTQsCisJTkVUX0RFQ05FVD0xNSwKKwlORVRfRUNPTkVUPTE2LAorCU5FVF9TQ1RQPTE3LAorCU5FVF9MTEM9MTgsCisJTkVUX05FVEZJTFRFUj0xOSwKKwlORVRfRENDUD0yMCwKKwlORVRfSVJEQT00MTIsCit9OworCisvKiAvcHJvYy9zeXMva2VybmVsL3JhbmRvbSAqLworZW51bQoreworCVJBTkRPTV9QT09MU0laRT0xLAorCVJBTkRPTV9FTlRST1BZX0NPVU5UPTIsCisJUkFORE9NX1JFQURfVEhSRVNIPTMsCisJUkFORE9NX1dSSVRFX1RIUkVTSD00LAorCVJBTkRPTV9CT09UX0lEPTUsCisJUkFORE9NX1VVSUQ9NgorfTsKKworLyogL3Byb2Mvc3lzL2tlcm5lbC9wdHkgKi8KK2VudW0KK3sKKwlQVFlfTUFYPTEsCisJUFRZX05SPTIKK307CisKKy8qIC9wcm9jL3N5cy9idXMvaXNhICovCitlbnVtCit7CisJQlVTX0lTQV9NRU1fQkFTRT0xLAorCUJVU19JU0FfUE9SVF9CQVNFPTIsCisJQlVTX0lTQV9QT1JUX1NISUZUPTMKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvY29yZSAqLworZW51bQoreworCU5FVF9DT1JFX1dNRU1fTUFYPTEsCisJTkVUX0NPUkVfUk1FTV9NQVg9MiwKKwlORVRfQ09SRV9XTUVNX0RFRkFVTFQ9MywKKwlORVRfQ09SRV9STUVNX0RFRkFVTFQ9NCwKKy8qIHdhcwlORVRfQ09SRV9ERVNUUk9ZX0RFTEFZICovCisJTkVUX0NPUkVfTUFYX0JBQ0tMT0c9NiwKKwlORVRfQ09SRV9GQVNUUk9VVEU9NywKKwlORVRfQ09SRV9NU0dfQ09TVD04LAorCU5FVF9DT1JFX01TR19CVVJTVD05LAorCU5FVF9DT1JFX09QVE1FTV9NQVg9MTAsCisJTkVUX0NPUkVfSE9UX0xJU1RfTEVOR1RIPTExLAorCU5FVF9DT1JFX0RJVkVSVF9WRVJTSU9OPTEyLAorCU5FVF9DT1JFX05PX0NPTkdfVEhSRVNIPTEzLAorCU5FVF9DT1JFX05PX0NPTkc9MTQsCisJTkVUX0NPUkVfTE9fQ09ORz0xNSwKKwlORVRfQ09SRV9NT0RfQ09ORz0xNiwKKwlORVRfQ09SRV9ERVZfV0VJR0hUPTE3LAorCU5FVF9DT1JFX1NPTUFYQ09OTj0xOCwKKwlORVRfQ09SRV9CVURHRVQ9MTksCisJTkVUX0NPUkVfQUVWRU5UX0VUSU1FPTIwLAorCU5FVF9DT1JFX0FFVkVOVF9SU0VRVEg9MjEsCisJTkVUX0NPUkVfV0FSTklOR1M9MjIsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2V0aGVybmV0ICovCisKKy8qIC9wcm9jL3N5cy9uZXQvODAyICovCisKKy8qIC9wcm9jL3N5cy9uZXQvdW5peCAqLworCitlbnVtCit7CisJTkVUX1VOSVhfREVTVFJPWV9ERUxBWT0xLAorCU5FVF9VTklYX0RFTEVURV9ERUxBWT0yLAorCU5FVF9VTklYX01BWF9ER1JBTV9RTEVOPTMsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L25ldGZpbHRlciAqLworZW51bQoreworCU5FVF9ORl9DT05OVFJBQ0tfTUFYPTEsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fU0VOVD0yLAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1Y9MywKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX0VTVEFCTElTSEVEPTQsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9GSU5fV0FJVD01LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0VfV0FJVD02LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTEFTVF9BQ0s9NywKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9USU1FT1VUX1RJTUVfV0FJVD04LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0U9OSwKKwlORVRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUPTEwLAorCU5FVF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVRfU1RSRUFNPTExLAorCU5FVF9ORl9DT05OVFJBQ0tfSUNNUF9USU1FT1VUPTEyLAorCU5FVF9ORl9DT05OVFJBQ0tfR0VORVJJQ19USU1FT1VUPTEzLAorCU5FVF9ORl9DT05OVFJBQ0tfQlVDS0VUUz0xNCwKKwlORVRfTkZfQ09OTlRSQUNLX0xPR19JTlZBTElEPTE1LAorCU5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfTUFYX1JFVFJBTlM9MTYsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfTE9PU0U9MTcsCisJTkVUX05GX0NPTk5UUkFDS19UQ1BfQkVfTElCRVJBTD0xOCwKKwlORVRfTkZfQ09OTlRSQUNLX1RDUF9NQVhfUkVUUkFOUz0xOSwKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DTE9TRUQ9MjAsCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX1dBSVQ9MjEsCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfQ09PS0lFX0VDSE9FRD0yMiwKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9FU1RBQkxJU0hFRD0yMywKKwlORVRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9TSFVURE9XTl9TRU5UPTI0LAorCU5FVF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1JFQ0Q9MjUsCisJTkVUX05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fQUNLX1NFTlQ9MjYsCisJTkVUX05GX0NPTk5UUkFDS19DT1VOVD0yNywKKwlORVRfTkZfQ09OTlRSQUNLX0lDTVBWNl9USU1FT1VUPTI4LAorCU5FVF9ORl9DT05OVFJBQ0tfRlJBRzZfVElNRU9VVD0yOSwKKwlORVRfTkZfQ09OTlRSQUNLX0ZSQUc2X0xPV19USFJFU0g9MzAsCisJTkVUX05GX0NPTk5UUkFDS19GUkFHNl9ISUdIX1RIUkVTSD0zMSwKKwlORVRfTkZfQ09OTlRSQUNLX0NIRUNLU1VNPTMyLAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9pcHY0ICovCitlbnVtCit7CisJLyogdjIuMCBjb21wYXRpYmlsZSB2YXJpYWJsZXMgKi8KKwlORVRfSVBWNF9GT1JXQVJEPTgsCisJTkVUX0lQVjRfRFlOQUREUj05LAorCisJTkVUX0lQVjRfQ09ORj0xNiwKKwlORVRfSVBWNF9ORUlHSD0xNywKKwlORVRfSVBWNF9ST1VURT0xOCwKKwlORVRfSVBWNF9GSUJfSEFTSD0xOSwKKwlORVRfSVBWNF9ORVRGSUxURVI9MjAsCisKKwlORVRfSVBWNF9UQ1BfVElNRVNUQU1QUz0zMywKKwlORVRfSVBWNF9UQ1BfV0lORE9XX1NDQUxJTkc9MzQsCisJTkVUX0lQVjRfVENQX1NBQ0s9MzUsCisJTkVUX0lQVjRfVENQX1JFVFJBTlNfQ09MTEFQU0U9MzYsCisJTkVUX0lQVjRfREVGQVVMVF9UVEw9MzcsCisJTkVUX0lQVjRfQVVUT0NPTkZJRz0zOCwKKwlORVRfSVBWNF9OT19QTVRVX0RJU0M9MzksCisJTkVUX0lQVjRfVENQX1NZTl9SRVRSSUVTPTQwLAorCU5FVF9JUFY0X0lQRlJBR19ISUdIX1RIUkVTSD00MSwKKwlORVRfSVBWNF9JUEZSQUdfTE9XX1RIUkVTSD00MiwKKwlORVRfSVBWNF9JUEZSQUdfVElNRT00MywKKwlORVRfSVBWNF9UQ1BfTUFYX0tBX1BST0JFUz00NCwKKwlORVRfSVBWNF9UQ1BfS0VFUEFMSVZFX1RJTUU9NDUsCisJTkVUX0lQVjRfVENQX0tFRVBBTElWRV9QUk9CRVM9NDYsCisJTkVUX0lQVjRfVENQX1JFVFJJRVMxPTQ3LAorCU5FVF9JUFY0X1RDUF9SRVRSSUVTMj00OCwKKwlORVRfSVBWNF9UQ1BfRklOX1RJTUVPVVQ9NDksCisJTkVUX0lQVjRfSVBfTUFTUV9ERUJVRz01MCwKKwlORVRfVENQX1NZTkNPT0tJRVM9NTEsCisJTkVUX1RDUF9TVERVUkc9NTIsCisJTkVUX1RDUF9SRkMxMzM3PTUzLAorCU5FVF9UQ1BfU1lOX1RBSUxEUk9QPTU0LAorCU5FVF9UQ1BfTUFYX1NZTl9CQUNLTE9HPTU1LAorCU5FVF9JUFY0X0xPQ0FMX1BPUlRfUkFOR0U9NTYsCisJTkVUX0lQVjRfSUNNUF9FQ0hPX0lHTk9SRV9BTEw9NTcsCisJTkVUX0lQVjRfSUNNUF9FQ0hPX0lHTk9SRV9CUk9BRENBU1RTPTU4LAorCU5FVF9JUFY0X0lDTVBfU09VUkNFUVVFTkNIX1JBVEU9NTksCisJTkVUX0lQVjRfSUNNUF9ERVNUVU5SRUFDSF9SQVRFPTYwLAorCU5FVF9JUFY0X0lDTVBfVElNRUVYQ0VFRF9SQVRFPTYxLAorCU5FVF9JUFY0X0lDTVBfUEFSQU1QUk9CX1JBVEU9NjIsCisJTkVUX0lQVjRfSUNNUF9FQ0hPUkVQTFlfUkFURT02MywKKwlORVRfSVBWNF9JQ01QX0lHTk9SRV9CT0dVU19FUlJPUl9SRVNQT05TRVM9NjQsCisJTkVUX0lQVjRfSUdNUF9NQVhfTUVNQkVSU0hJUFM9NjUsCisJTkVUX1RDUF9UV19SRUNZQ0xFPTY2LAorCU5FVF9JUFY0X0FMV0FZU19ERUZSQUc9NjcsCisJTkVUX0lQVjRfVENQX0tFRVBBTElWRV9JTlRWTD02OCwKKwlORVRfSVBWNF9JTkVUX1BFRVJfVEhSRVNIT0xEPTY5LAorCU5FVF9JUFY0X0lORVRfUEVFUl9NSU5UVEw9NzAsCisJTkVUX0lQVjRfSU5FVF9QRUVSX01BWFRUTD03MSwKKwlORVRfSVBWNF9JTkVUX1BFRVJfR0NfTUlOVElNRT03MiwKKwlORVRfSVBWNF9JTkVUX1BFRVJfR0NfTUFYVElNRT03MywKKwlORVRfVENQX09SUEhBTl9SRVRSSUVTPTc0LAorCU5FVF9UQ1BfQUJPUlRfT05fT1ZFUkZMT1c9NzUsCisJTkVUX1RDUF9TWU5BQ0tfUkVUUklFUz03NiwKKwlORVRfVENQX01BWF9PUlBIQU5TPTc3LAorCU5FVF9UQ1BfTUFYX1RXX0JVQ0tFVFM9NzgsCisJTkVUX1RDUF9GQUNLPTc5LAorCU5FVF9UQ1BfUkVPUkRFUklORz04MCwKKwlORVRfVENQX0VDTj04MSwKKwlORVRfVENQX0RTQUNLPTgyLAorCU5FVF9UQ1BfTUVNPTgzLAorCU5FVF9UQ1BfV01FTT04NCwKKwlORVRfVENQX1JNRU09ODUsCisJTkVUX1RDUF9BUFBfV0lOPTg2LAorCU5FVF9UQ1BfQURWX1dJTl9TQ0FMRT04NywKKwlORVRfSVBWNF9OT05MT0NBTF9CSU5EPTg4LAorCU5FVF9JUFY0X0lDTVBfUkFURUxJTUlUPTg5LAorCU5FVF9JUFY0X0lDTVBfUkFURU1BU0s9OTAsCisJTkVUX1RDUF9UV19SRVVTRT05MSwKKwlORVRfVENQX0ZSVE89OTIsCisJTkVUX1RDUF9MT1dfTEFURU5DWT05MywKKwlORVRfSVBWNF9JUEZSQUdfU0VDUkVUX0lOVEVSVkFMPTk0LAorCU5FVF9JUFY0X0lHTVBfTUFYX01TRj05NiwKKwlORVRfVENQX05PX01FVFJJQ1NfU0FWRT05NywKKwlORVRfVENQX0RFRkFVTFRfV0lOX1NDQUxFPTEwNSwKKwlORVRfVENQX01PREVSQVRFX1JDVkJVRj0xMDYsCisJTkVUX1RDUF9UU09fV0lOX0RJVklTT1I9MTA3LAorCU5FVF9UQ1BfQklDX0JFVEE9MTA4LAorCU5FVF9JUFY0X0lDTVBfRVJST1JTX1VTRV9JTkJPVU5EX0lGQUREUj0xMDksCisJTkVUX1RDUF9DT05HX0NPTlRST0w9MTEwLAorCU5FVF9UQ1BfQUJDPTExMSwKKwlORVRfSVBWNF9JUEZSQUdfTUFYX0RJU1Q9MTEyLAorIAlORVRfVENQX01UVV9QUk9CSU5HPTExMywKKwlORVRfVENQX0JBU0VfTVNTPTExNCwKKwlORVRfSVBWNF9UQ1BfV09SS0FST1VORF9TSUdORURfV0lORE9XUz0xMTUsCisJTkVUX1RDUF9ETUFfQ09QWUJSRUFLPTExNiwKKwlORVRfVENQX1NMT1dfU1RBUlRfQUZURVJfSURMRT0xMTcsCisJTkVUX0NJUFNPVjRfQ0FDSEVfRU5BQkxFPTExOCwKKwlORVRfQ0lQU09WNF9DQUNIRV9CVUNLRVRfU0laRT0xMTksCisJTkVUX0NJUFNPVjRfUkJNX09QVEZNVD0xMjAsCisJTkVUX0NJUFNPVjRfUkJNX1NUUklDVFZBTElEPTEyMSwKKwlORVRfVENQX0FWQUlMX0NPTkdfQ09OVFJPTD0xMjIsCisJTkVUX1RDUF9BTExPV0VEX0NPTkdfQ09OVFJPTD0xMjMsCisJTkVUX1RDUF9NQVhfU1NUSFJFU0g9MTI0LAorCU5FVF9UQ1BfRlJUT19SRVNQT05TRT0xMjUsCit9OworCitlbnVtIHsKKwlORVRfSVBWNF9ST1VURV9GTFVTSD0xLAorCU5FVF9JUFY0X1JPVVRFX01JTl9ERUxBWT0yLAorCU5FVF9JUFY0X1JPVVRFX01BWF9ERUxBWT0zLAorCU5FVF9JUFY0X1JPVVRFX0dDX1RIUkVTSD00LAorCU5FVF9JUFY0X1JPVVRFX01BWF9TSVpFPTUsCisJTkVUX0lQVjRfUk9VVEVfR0NfTUlOX0lOVEVSVkFMPTYsCisJTkVUX0lQVjRfUk9VVEVfR0NfVElNRU9VVD03LAorCU5FVF9JUFY0X1JPVVRFX0dDX0lOVEVSVkFMPTgsCisJTkVUX0lQVjRfUk9VVEVfUkVESVJFQ1RfTE9BRD05LAorCU5FVF9JUFY0X1JPVVRFX1JFRElSRUNUX05VTUJFUj0xMCwKKwlORVRfSVBWNF9ST1VURV9SRURJUkVDVF9TSUxFTkNFPTExLAorCU5FVF9JUFY0X1JPVVRFX0VSUk9SX0NPU1Q9MTIsCisJTkVUX0lQVjRfUk9VVEVfRVJST1JfQlVSU1Q9MTMsCisJTkVUX0lQVjRfUk9VVEVfR0NfRUxBU1RJQ0lUWT0xNCwKKwlORVRfSVBWNF9ST1VURV9NVFVfRVhQSVJFUz0xNSwKKwlORVRfSVBWNF9ST1VURV9NSU5fUE1UVT0xNiwKKwlORVRfSVBWNF9ST1VURV9NSU5fQURWTVNTPTE3LAorCU5FVF9JUFY0X1JPVVRFX1NFQ1JFVF9JTlRFUlZBTD0xOCwKKwlORVRfSVBWNF9ST1VURV9HQ19NSU5fSU5URVJWQUxfTVM9MTksCit9OworCitlbnVtCit7CisJTkVUX1BST1RPX0NPTkZfQUxMPS0yLAorCU5FVF9QUk9UT19DT05GX0RFRkFVTFQ9LTMKKworCS8qIEFuZCBkZXZpY2UgaWZpbmRpY2VzIC4uLiAqLworfTsKKworZW51bQoreworCU5FVF9JUFY0X0NPTkZfRk9SV0FSRElORz0xLAorCU5FVF9JUFY0X0NPTkZfTUNfRk9SV0FSRElORz0yLAorCU5FVF9JUFY0X0NPTkZfUFJPWFlfQVJQPTMsCisJTkVUX0lQVjRfQ09ORl9BQ0NFUFRfUkVESVJFQ1RTPTQsCisJTkVUX0lQVjRfQ09ORl9TRUNVUkVfUkVESVJFQ1RTPTUsCisJTkVUX0lQVjRfQ09ORl9TRU5EX1JFRElSRUNUUz02LAorCU5FVF9JUFY0X0NPTkZfU0hBUkVEX01FRElBPTcsCisJTkVUX0lQVjRfQ09ORl9SUF9GSUxURVI9OCwKKwlORVRfSVBWNF9DT05GX0FDQ0VQVF9TT1VSQ0VfUk9VVEU9OSwKKwlORVRfSVBWNF9DT05GX0JPT1RQX1JFTEFZPTEwLAorCU5FVF9JUFY0X0NPTkZfTE9HX01BUlRJQU5TPTExLAorCU5FVF9JUFY0X0NPTkZfVEFHPTEyLAorCU5FVF9JUFY0X0NPTkZfQVJQRklMVEVSPTEzLAorCU5FVF9JUFY0X0NPTkZfTUVESVVNX0lEPTE0LAorCU5FVF9JUFY0X0NPTkZfTk9YRlJNPTE1LAorCU5FVF9JUFY0X0NPTkZfTk9QT0xJQ1k9MTYsCisJTkVUX0lQVjRfQ09ORl9GT1JDRV9JR01QX1ZFUlNJT049MTcsCisJTkVUX0lQVjRfQ09ORl9BUlBfQU5OT1VOQ0U9MTgsCisJTkVUX0lQVjRfQ09ORl9BUlBfSUdOT1JFPTE5LAorCU5FVF9JUFY0X0NPTkZfUFJPTU9URV9TRUNPTkRBUklFUz0yMCwKKwlORVRfSVBWNF9DT05GX0FSUF9BQ0NFUFQ9MjEsCisJX19ORVRfSVBWNF9DT05GX01BWAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9pcHY0L25ldGZpbHRlciAqLworZW51bQoreworCU5FVF9JUFY0X05GX0NPTk5UUkFDS19NQVg9MSwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1NFTlQ9MiwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1Y9MywKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRVNUQUJMSVNIRUQ9NCwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfRklOX1dBSVQ9NSwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0VfV0FJVD02LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9MQVNUX0FDSz03LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9USU1FX1dBSVQ9OCwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfQ0xPU0U9OSwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVURQX1RJTUVPVVQ9MTAsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1VEUF9USU1FT1VUX1NUUkVBTT0xMSwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfSUNNUF9USU1FT1VUPTEyLAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19HRU5FUklDX1RJTUVPVVQ9MTMsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0JVQ0tFVFM9MTQsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0xPR19JTlZBTElEPTE1LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9NQVhfUkVUUkFOUz0xNiwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX0xPT1NFPTE3LAorCU5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfQkVfTElCRVJBTD0xOCwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfVENQX01BWF9SRVRSQU5TPTE5LAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0NMT1NFRD0yMCwKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DT09LSUVfV0FJVD0yMSwKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9DT09LSUVfRUNIT0VEPTIyLAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX0VTVEFCTElTSEVEPTIzLAorIAlORVRfSVBWNF9ORl9DT05OVFJBQ0tfU0NUUF9USU1FT1VUX1NIVVRET1dOX1NFTlQ9MjQsCisgCU5FVF9JUFY0X05GX0NPTk5UUkFDS19TQ1RQX1RJTUVPVVRfU0hVVERPV05fUkVDRD0yNSwKKyAJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX1NDVFBfVElNRU9VVF9TSFVURE9XTl9BQ0tfU0VOVD0yNiwKKwlORVRfSVBWNF9ORl9DT05OVFJBQ0tfQ09VTlQ9MjcsCisJTkVUX0lQVjRfTkZfQ09OTlRSQUNLX0NIRUNLU1VNPTI4LAorfTsKKyAKKy8qIC9wcm9jL3N5cy9uZXQvaXB2NiAqLworZW51bSB7CisJTkVUX0lQVjZfQ09ORj0xNiwKKwlORVRfSVBWNl9ORUlHSD0xNywKKwlORVRfSVBWNl9ST1VURT0xOCwKKwlORVRfSVBWNl9JQ01QPTE5LAorCU5FVF9JUFY2X0JJTkRWNk9OTFk9MjAsCisJTkVUX0lQVjZfSVA2RlJBR19ISUdIX1RIUkVTSD0yMSwKKwlORVRfSVBWNl9JUDZGUkFHX0xPV19USFJFU0g9MjIsCisJTkVUX0lQVjZfSVA2RlJBR19USU1FPTIzLAorCU5FVF9JUFY2X0lQNkZSQUdfU0VDUkVUX0lOVEVSVkFMPTI0LAorCU5FVF9JUFY2X01MRF9NQVhfTVNGPTI1LAorfTsKKworZW51bSB7CisJTkVUX0lQVjZfUk9VVEVfRkxVU0g9MSwKKwlORVRfSVBWNl9ST1VURV9HQ19USFJFU0g9MiwKKwlORVRfSVBWNl9ST1VURV9NQVhfU0laRT0zLAorCU5FVF9JUFY2X1JPVVRFX0dDX01JTl9JTlRFUlZBTD00LAorCU5FVF9JUFY2X1JPVVRFX0dDX1RJTUVPVVQ9NSwKKwlORVRfSVBWNl9ST1VURV9HQ19JTlRFUlZBTD02LAorCU5FVF9JUFY2X1JPVVRFX0dDX0VMQVNUSUNJVFk9NywKKwlORVRfSVBWNl9ST1VURV9NVFVfRVhQSVJFUz04LAorCU5FVF9JUFY2X1JPVVRFX01JTl9BRFZNU1M9OSwKKwlORVRfSVBWNl9ST1VURV9HQ19NSU5fSU5URVJWQUxfTVM9MTAKK307CisKK2VudW0geworCU5FVF9JUFY2X0ZPUldBUkRJTkc9MSwKKwlORVRfSVBWNl9IT1BfTElNSVQ9MiwKKwlORVRfSVBWNl9NVFU9MywKKwlORVRfSVBWNl9BQ0NFUFRfUkE9NCwKKwlORVRfSVBWNl9BQ0NFUFRfUkVESVJFQ1RTPTUsCisJTkVUX0lQVjZfQVVUT0NPTkY9NiwKKwlORVRfSVBWNl9EQURfVFJBTlNNSVRTPTcsCisJTkVUX0lQVjZfUlRSX1NPTElDSVRTPTgsCisJTkVUX0lQVjZfUlRSX1NPTElDSVRfSU5URVJWQUw9OSwKKwlORVRfSVBWNl9SVFJfU09MSUNJVF9ERUxBWT0xMCwKKwlORVRfSVBWNl9VU0VfVEVNUEFERFI9MTEsCisJTkVUX0lQVjZfVEVNUF9WQUxJRF9MRlQ9MTIsCisJTkVUX0lQVjZfVEVNUF9QUkVGRVJFRF9MRlQ9MTMsCisJTkVUX0lQVjZfUkVHRU5fTUFYX1JFVFJZPTE0LAorCU5FVF9JUFY2X01BWF9ERVNZTkNfRkFDVE9SPTE1LAorCU5FVF9JUFY2X01BWF9BRERSRVNTRVM9MTYsCisJTkVUX0lQVjZfRk9SQ0VfTUxEX1ZFUlNJT049MTcsCisJTkVUX0lQVjZfQUNDRVBUX1JBX0RFRlJUUj0xOCwKKwlORVRfSVBWNl9BQ0NFUFRfUkFfUElORk89MTksCisJTkVUX0lQVjZfQUNDRVBUX1JBX1JUUl9QUkVGPTIwLAorCU5FVF9JUFY2X1JUUl9QUk9CRV9JTlRFUlZBTD0yMSwKKwlORVRfSVBWNl9BQ0NFUFRfUkFfUlRfSU5GT19NQVhfUExFTj0yMiwKKwlORVRfSVBWNl9QUk9YWV9ORFA9MjMsCisJTkVUX0lQVjZfQUNDRVBUX1NPVVJDRV9ST1VURT0yNSwKKwlfX05FVF9JUFY2X01BWAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9pcHY2L2ljbXAgKi8KK2VudW0geworCU5FVF9JUFY2X0lDTVBfUkFURUxJTUlUPTEKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvPHByb3RvY29sPi9uZWlnaC88ZGV2PiAqLworZW51bSB7CisJTkVUX05FSUdIX01DQVNUX1NPTElDSVQ9MSwKKwlORVRfTkVJR0hfVUNBU1RfU09MSUNJVD0yLAorCU5FVF9ORUlHSF9BUFBfU09MSUNJVD0zLAorCU5FVF9ORUlHSF9SRVRSQU5TX1RJTUU9NCwKKwlORVRfTkVJR0hfUkVBQ0hBQkxFX1RJTUU9NSwKKwlORVRfTkVJR0hfREVMQVlfUFJPQkVfVElNRT02LAorCU5FVF9ORUlHSF9HQ19TVEFMRV9USU1FPTcsCisJTkVUX05FSUdIX1VOUkVTX1FMRU49OCwKKwlORVRfTkVJR0hfUFJPWFlfUUxFTj05LAorCU5FVF9ORUlHSF9BTllDQVNUX0RFTEFZPTEwLAorCU5FVF9ORUlHSF9QUk9YWV9ERUxBWT0xMSwKKwlORVRfTkVJR0hfTE9DS1RJTUU9MTIsCisJTkVUX05FSUdIX0dDX0lOVEVSVkFMPTEzLAorCU5FVF9ORUlHSF9HQ19USFJFU0gxPTE0LAorCU5FVF9ORUlHSF9HQ19USFJFU0gyPTE1LAorCU5FVF9ORUlHSF9HQ19USFJFU0gzPTE2LAorCU5FVF9ORUlHSF9SRVRSQU5TX1RJTUVfTVM9MTcsCisJTkVUX05FSUdIX1JFQUNIQUJMRV9USU1FX01TPTE4LAorCV9fTkVUX05FSUdIX01BWAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9kY2NwICovCitlbnVtIHsKKwlORVRfRENDUF9ERUZBVUxUPTEsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2lweCAqLworZW51bSB7CisJTkVUX0lQWF9QUFJPUF9CUk9BRENBU1RJTkc9MSwKKwlORVRfSVBYX0ZPUldBUkRJTkc9MgorfTsKKworLyogL3Byb2Mvc3lzL25ldC9sbGMgKi8KK2VudW0geworCU5FVF9MTEMyPTEsCisJTkVUX0xMQ19TVEFUSU9OPTIsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2xsYy9sbGMyICovCitlbnVtIHsKKwlORVRfTExDMl9USU1FT1VUPTEsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2xsYy9zdGF0aW9uICovCitlbnVtIHsKKwlORVRfTExDX1NUQVRJT05fQUNLX1RJTUVPVVQ9MSwKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvbGxjL2xsYzIvdGltZW91dCAqLworZW51bSB7CisJTkVUX0xMQzJfQUNLX1RJTUVPVVQ9MSwKKwlORVRfTExDMl9QX1RJTUVPVVQ9MiwKKwlORVRfTExDMl9SRUpfVElNRU9VVD0zLAorCU5FVF9MTEMyX0JVU1lfVElNRU9VVD00LAorfTsKKworLyogL3Byb2Mvc3lzL25ldC9hcHBsZXRhbGsgKi8KK2VudW0geworCU5FVF9BVEFMS19BQVJQX0VYUElSWV9USU1FPTEsCisJTkVUX0FUQUxLX0FBUlBfVElDS19USU1FPTIsCisJTkVUX0FUQUxLX0FBUlBfUkVUUkFOU01JVF9MSU1JVD0zLAorCU5FVF9BVEFMS19BQVJQX1JFU09MVkVfVElNRT00Cit9OworCisKKy8qIC9wcm9jL3N5cy9uZXQvbmV0cm9tICovCitlbnVtIHsKKwlORVRfTkVUUk9NX0RFRkFVTFRfUEFUSF9RVUFMSVRZPTEsCisJTkVUX05FVFJPTV9PQlNPTEVTQ0VOQ0VfQ09VTlRfSU5JVElBTElTRVI9MiwKKwlORVRfTkVUUk9NX05FVFdPUktfVFRMX0lOSVRJQUxJU0VSPTMsCisJTkVUX05FVFJPTV9UUkFOU1BPUlRfVElNRU9VVD00LAorCU5FVF9ORVRST01fVFJBTlNQT1JUX01BWElNVU1fVFJJRVM9NSwKKwlORVRfTkVUUk9NX1RSQU5TUE9SVF9BQ0tOT1dMRURHRV9ERUxBWT02LAorCU5FVF9ORVRST01fVFJBTlNQT1JUX0JVU1lfREVMQVk9NywKKwlORVRfTkVUUk9NX1RSQU5TUE9SVF9SRVFVRVNURURfV0lORE9XX1NJWkU9OCwKKwlORVRfTkVUUk9NX1RSQU5TUE9SVF9OT19BQ1RJVklUWV9USU1FT1VUPTksCisJTkVUX05FVFJPTV9ST1VUSU5HX0NPTlRST0w9MTAsCisJTkVUX05FVFJPTV9MSU5LX0ZBSUxTX0NPVU5UPTExLAorCU5FVF9ORVRST01fUkVTRVQ9MTIKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvYXgyNSAqLworZW51bSB7CisJTkVUX0FYMjVfSVBfREVGQVVMVF9NT0RFPTEsCisJTkVUX0FYMjVfREVGQVVMVF9NT0RFPTIsCisJTkVUX0FYMjVfQkFDS09GRl9UWVBFPTMsCisJTkVUX0FYMjVfQ09OTkVDVF9NT0RFPTQsCisJTkVUX0FYMjVfU1RBTkRBUkRfV0lORE9XPTUsCisJTkVUX0FYMjVfRVhURU5ERURfV0lORE9XPTYsCisJTkVUX0FYMjVfVDFfVElNRU9VVD03LAorCU5FVF9BWDI1X1QyX1RJTUVPVVQ9OCwKKwlORVRfQVgyNV9UM19USU1FT1VUPTksCisJTkVUX0FYMjVfSURMRV9USU1FT1VUPTEwLAorCU5FVF9BWDI1X04yPTExLAorCU5FVF9BWDI1X1BBQ0xFTj0xMiwKKwlORVRfQVgyNV9QUk9UT0NPTD0xMywKKwlORVRfQVgyNV9EQU1BX1NMQVZFX1RJTUVPVVQ9MTQKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvcm9zZSAqLworZW51bSB7CisJTkVUX1JPU0VfUkVTVEFSVF9SRVFVRVNUX1RJTUVPVVQ9MSwKKwlORVRfUk9TRV9DQUxMX1JFUVVFU1RfVElNRU9VVD0yLAorCU5FVF9ST1NFX1JFU0VUX1JFUVVFU1RfVElNRU9VVD0zLAorCU5FVF9ST1NFX0NMRUFSX1JFUVVFU1RfVElNRU9VVD00LAorCU5FVF9ST1NFX0FDS19IT0xEX0JBQ0tfVElNRU9VVD01LAorCU5FVF9ST1NFX1JPVVRJTkdfQ09OVFJPTD02LAorCU5FVF9ST1NFX0xJTktfRkFJTF9USU1FT1VUPTcsCisJTkVUX1JPU0VfTUFYX1ZDUz04LAorCU5FVF9ST1NFX1dJTkRPV19TSVpFPTksCisJTkVUX1JPU0VfTk9fQUNUSVZJVFlfVElNRU9VVD0xMAorfTsKKworLyogL3Byb2Mvc3lzL25ldC94MjUgKi8KK2VudW0geworCU5FVF9YMjVfUkVTVEFSVF9SRVFVRVNUX1RJTUVPVVQ9MSwKKwlORVRfWDI1X0NBTExfUkVRVUVTVF9USU1FT1VUPTIsCisJTkVUX1gyNV9SRVNFVF9SRVFVRVNUX1RJTUVPVVQ9MywKKwlORVRfWDI1X0NMRUFSX1JFUVVFU1RfVElNRU9VVD00LAorCU5FVF9YMjVfQUNLX0hPTERfQkFDS19USU1FT1VUPTUsCisJTkVUX1gyNV9GT1JXQVJEPTYKK307CisKKy8qIC9wcm9jL3N5cy9uZXQvdG9rZW4tcmluZyAqLworZW51bQoreworCU5FVF9UUl9SSUZfVElNRU9VVD0xCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2RlY25ldC8gKi8KK2VudW0geworCU5FVF9ERUNORVRfTk9ERV9UWVBFID0gMSwKKwlORVRfREVDTkVUX05PREVfQUREUkVTUyA9IDIsCisJTkVUX0RFQ05FVF9OT0RFX05BTUUgPSAzLAorCU5FVF9ERUNORVRfREVGQVVMVF9ERVZJQ0UgPSA0LAorCU5FVF9ERUNORVRfVElNRV9XQUlUID0gNSwKKwlORVRfREVDTkVUX0ROX0NPVU5UID0gNiwKKwlORVRfREVDTkVUX0RJX0NPVU5UID0gNywKKwlORVRfREVDTkVUX0RSX0NPVU5UID0gOCwKKwlORVRfREVDTkVUX0RTVF9HQ19JTlRFUlZBTCA9IDksCisJTkVUX0RFQ05FVF9DT05GID0gMTAsCisJTkVUX0RFQ05FVF9OT19GQ19NQVhfQ1dORCA9IDExLAorCU5FVF9ERUNORVRfTUVNID0gMTIsCisJTkVUX0RFQ05FVF9STUVNID0gMTMsCisJTkVUX0RFQ05FVF9XTUVNID0gMTQsCisJTkVUX0RFQ05FVF9ERUJVR19MRVZFTCA9IDI1NQorfTsKKworLyogL3Byb2Mvc3lzL25ldC9kZWNuZXQvY29uZi88ZGV2PiAqLworZW51bSB7CisJTkVUX0RFQ05FVF9DT05GX0xPT1BCQUNLID0gLTIsCisJTkVUX0RFQ05FVF9DT05GX0REQ01QID0gLTMsCisJTkVUX0RFQ05FVF9DT05GX1BQUCA9IC00LAorCU5FVF9ERUNORVRfQ09ORl9YMjUgPSAtNSwKKwlORVRfREVDTkVUX0NPTkZfR1JFID0gLTYsCisJTkVUX0RFQ05FVF9DT05GX0VUSEVSID0gLTcKKworCS8qIC4uLiBhbmQgaWZpbmRleCBvZiBkZXZpY2VzICovCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2RlY25ldC9jb25mLzxkZXY+LyAqLworZW51bSB7CisJTkVUX0RFQ05FVF9DT05GX0RFVl9QUklPUklUWSA9IDEsCisJTkVUX0RFQ05FVF9DT05GX0RFVl9UMSA9IDIsCisJTkVUX0RFQ05FVF9DT05GX0RFVl9UMiA9IDMsCisJTkVUX0RFQ05FVF9DT05GX0RFVl9UMyA9IDQsCisJTkVUX0RFQ05FVF9DT05GX0RFVl9GT1JXQVJESU5HID0gNSwKKwlORVRfREVDTkVUX0NPTkZfREVWX0JMS1NJWkUgPSA2LAorCU5FVF9ERUNORVRfQ09ORl9ERVZfU1RBVEUgPSA3Cit9OworCisvKiAvcHJvYy9zeXMvbmV0L3NjdHAgKi8KK2VudW0geworCU5FVF9TQ1RQX1JUT19JTklUSUFMID0gMSwKKwlORVRfU0NUUF9SVE9fTUlOICAgICA9IDIsCisJTkVUX1NDVFBfUlRPX01BWCAgICAgPSAzLAorCU5FVF9TQ1RQX1JUT19BTFBIQSAgID0gNCwKKwlORVRfU0NUUF9SVE9fQkVUQSAgICA9IDUsCisJTkVUX1NDVFBfVkFMSURfQ09PS0lFX0xJRkUgICAgICAgPSAgNiwKKwlORVRfU0NUUF9BU1NPQ0lBVElPTl9NQVhfUkVUUkFOUyA9ICA3LAorCU5FVF9TQ1RQX1BBVEhfTUFYX1JFVFJBTlMgICAgICAgID0gIDgsCisJTkVUX1NDVFBfTUFYX0lOSVRfUkVUUkFOU01JVFMgICAgPSAgOSwKKwlORVRfU0NUUF9IQl9JTlRFUlZBTCAgICAgICAgICAgICA9IDEwLAorCU5FVF9TQ1RQX1BSRVNFUlZFX0VOQUJMRSAgICAgICAgID0gMTEsCisJTkVUX1NDVFBfTUFYX0JVUlNUICAgICAgICAgICAgICAgPSAxMiwKKwlORVRfU0NUUF9BRERJUF9FTkFCTEUJCSA9IDEzLAorCU5FVF9TQ1RQX1BSU0NUUF9FTkFCTEUJCSA9IDE0LAorCU5FVF9TQ1RQX1NOREJVRl9QT0xJQ1kJCSA9IDE1LAorCU5FVF9TQ1RQX1NBQ0tfVElNRU9VVAkJID0gMTYsCisJTkVUX1NDVFBfUkNWQlVGX1BPTElDWQkJID0gMTcsCit9OworCisvKiAvcHJvYy9zeXMvbmV0L2JyaWRnZSAqLworZW51bSB7CisJTkVUX0JSSURHRV9ORl9DQUxMX0FSUFRBQkxFUyA9IDEsCisJTkVUX0JSSURHRV9ORl9DQUxMX0lQVEFCTEVTID0gMiwKKwlORVRfQlJJREdFX05GX0NBTExfSVA2VEFCTEVTID0gMywKKwlORVRfQlJJREdFX05GX0ZJTFRFUl9WTEFOX1RBR0dFRCA9IDQsCisJTkVUX0JSSURHRV9ORl9GSUxURVJfUFBQT0VfVEFHR0VEID0gNSwKK307CisKKy8qIHByb2Mvc3lzL25ldC9pcmRhICovCitlbnVtIHsKKwlORVRfSVJEQV9ESVNDT1ZFUlk9MSwKKwlORVRfSVJEQV9ERVZOQU1FPTIsCisJTkVUX0lSREFfREVCVUc9MywKKwlORVRfSVJEQV9GQVNUX1BPTEw9NCwKKwlORVRfSVJEQV9ESVNDT1ZFUllfU0xPVFM9NSwKKwlORVRfSVJEQV9ESVNDT1ZFUllfVElNRU9VVD02LAorCU5FVF9JUkRBX1NMT1RfVElNRU9VVD03LAorCU5FVF9JUkRBX01BWF9CQVVEX1JBVEU9OCwKKwlORVRfSVJEQV9NSU5fVFhfVFVSTl9USU1FPTksCisJTkVUX0lSREFfTUFYX1RYX0RBVEFfU0laRT0xMCwKKwlORVRfSVJEQV9NQVhfVFhfV0lORE9XPTExLAorCU5FVF9JUkRBX01BWF9OT1JFUExZX1RJTUU9MTIsCisJTkVUX0lSREFfV0FSTl9OT1JFUExZX1RJTUU9MTMsCisJTkVUX0lSREFfTEFQX0tFRVBBTElWRV9USU1FPTE0LAorfTsKKworCisvKiBDVExfRlMgbmFtZXM6ICovCitlbnVtCit7CisJRlNfTlJJTk9ERT0xLAkvKiBpbnQ6Y3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIGlub2RlcyAqLworCUZTX1NUQVRJTk9ERT0yLAorCUZTX01BWElOT0RFPTMsCS8qIGludDptYXhpbXVtIG51bWJlciBvZiBpbm9kZXMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkICovCisJRlNfTlJEUVVPVD00LAkvKiBpbnQ6Y3VycmVudCBudW1iZXIgb2YgYWxsb2NhdGVkIGRxdW90cyAqLworCUZTX01BWERRVU9UPTUsCS8qIGludDptYXhpbXVtIG51bWJlciBvZiBkcXVvdHMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkICovCisJRlNfTlJGSUxFPTYsCS8qIGludDpjdXJyZW50IG51bWJlciBvZiBhbGxvY2F0ZWQgZmlsZWRlc2NyaXB0b3JzICovCisJRlNfTUFYRklMRT03LAkvKiBpbnQ6bWF4aW11bSBudW1iZXIgb2YgZmlsZWRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZCAqLworCUZTX0RFTlRSWT04LAorCUZTX05SU1VQRVI9OSwJLyogaW50OmN1cnJlbnQgbnVtYmVyIG9mIGFsbG9jYXRlZCBzdXBlcl9ibG9ja3MgKi8KKwlGU19NQVhTVVBFUj0xMCwJLyogaW50Om1heGltdW0gbnVtYmVyIG9mIHN1cGVyX2Jsb2NrcyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgKi8KKwlGU19PVkVSRkxPV1VJRD0xMSwJLyogaW50OiBvdmVyZmxvdyBVSUQgKi8KKwlGU19PVkVSRkxPV0dJRD0xMiwJLyogaW50OiBvdmVyZmxvdyBHSUQgKi8KKwlGU19MRUFTRVM9MTMsCS8qIGludDogbGVhc2VzIGVuYWJsZWQgKi8KKwlGU19ESVJfTk9USUZZPTE0LAkvKiBpbnQ6IGRpcmVjdG9yeSBub3RpZmljYXRpb24gZW5hYmxlZCAqLworCUZTX0xFQVNFX1RJTUU9MTUsCS8qIGludDogbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGEgbGVhc2UgYnJlYWsgKi8KKwlGU19EUVNUQVRTPTE2LAkvKiBkaXNjIHF1b3RhIHVzYWdlIHN0YXRpc3RpY3MgYW5kIGNvbnRyb2wgKi8KKwlGU19YRlM9MTcsCS8qIHN0cnVjdDogY29udHJvbCB4ZnMgcGFyYW1ldGVycyAqLworCUZTX0FJT19OUj0xOCwJLyogY3VycmVudCBzeXN0ZW0td2lkZSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCisJRlNfQUlPX01BWF9OUj0xOSwJLyogc3lzdGVtLXdpZGUgbWF4aW11bSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCisJRlNfSU5PVElGWT0yMCwJLyogaW5vdGlmeSBzdWJtZW51ICovCisJRlNfT0NGUzI9OTg4LAkvKiBvY2ZzMiAqLworfTsKKworLyogL3Byb2Mvc3lzL2ZzL3F1b3RhLyAqLworZW51bSB7CisJRlNfRFFfTE9PS1VQUyA9IDEsCisJRlNfRFFfRFJPUFMgPSAyLAorCUZTX0RRX1JFQURTID0gMywKKwlGU19EUV9XUklURVMgPSA0LAorCUZTX0RRX0NBQ0hFX0hJVFMgPSA1LAorCUZTX0RRX0FMTE9DQVRFRCA9IDYsCisJRlNfRFFfRlJFRSA9IDcsCisJRlNfRFFfU1lOQ1MgPSA4LAorCUZTX0RRX1dBUk5JTkdTID0gOSwKK307CisKKy8qIENUTF9ERUJVRyBuYW1lczogKi8KKworLyogQ1RMX0RFViBuYW1lczogKi8KK2VudW0geworCURFVl9DRFJPTT0xLAorCURFVl9IV01PTj0yLAorCURFVl9QQVJQT1JUPTMsCisJREVWX1JBSUQ9NCwKKwlERVZfTUFDX0hJRD01LAorCURFVl9TQ1NJPTYsCisJREVWX0lQTUk9NywKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvY2Ryb20gKi8KK2VudW0geworCURFVl9DRFJPTV9JTkZPPTEsCisJREVWX0NEUk9NX0FVVE9DTE9TRT0yLAorCURFVl9DRFJPTV9BVVRPRUpFQ1Q9MywKKwlERVZfQ0RST01fREVCVUc9NCwKKwlERVZfQ0RST01fTE9DSz01LAorCURFVl9DRFJPTV9DSEVDS19NRURJQT02Cit9OworCisvKiAvcHJvYy9zeXMvZGV2L3BhcnBvcnQgKi8KK2VudW0geworCURFVl9QQVJQT1JUX0RFRkFVTFQ9LTMKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvcmFpZCAqLworZW51bSB7CisJREVWX1JBSURfU1BFRURfTElNSVRfTUlOPTEsCisJREVWX1JBSURfU1BFRURfTElNSVRfTUFYPTIKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvcGFycG9ydC9kZWZhdWx0ICovCitlbnVtIHsKKwlERVZfUEFSUE9SVF9ERUZBVUxUX1RJTUVTTElDRT0xLAorCURFVl9QQVJQT1JUX0RFRkFVTFRfU1BJTlRJTUU9MgorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9wYXJwb3J0L3BhcnBvcnQgbiAqLworZW51bSB7CisJREVWX1BBUlBPUlRfU1BJTlRJTUU9MSwKKwlERVZfUEFSUE9SVF9CQVNFX0FERFI9MiwKKwlERVZfUEFSUE9SVF9JUlE9MywKKwlERVZfUEFSUE9SVF9ETUE9NCwKKwlERVZfUEFSUE9SVF9NT0RFUz01LAorCURFVl9QQVJQT1JUX0RFVklDRVM9NiwKKwlERVZfUEFSUE9SVF9BVVRPUFJPQkU9MTYKK307CisKKy8qIC9wcm9jL3N5cy9kZXYvcGFycG9ydC9wYXJwb3J0IG4vZGV2aWNlcy8gKi8KK2VudW0geworCURFVl9QQVJQT1JUX0RFVklDRVNfQUNUSVZFPS0zLAorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9wYXJwb3J0L3BhcnBvcnQgbi9kZXZpY2VzL2RldmljZSBuICovCitlbnVtIHsKKwlERVZfUEFSUE9SVF9ERVZJQ0VfVElNRVNMSUNFPTEsCit9OworCisvKiAvcHJvYy9zeXMvZGV2L21hY19oaWQgKi8KK2VudW0geworCURFVl9NQUNfSElEX0tFWUJPQVJEX1NFTkRTX0xJTlVYX0tFWUNPREVTPTEsCisJREVWX01BQ19ISURfS0VZQk9BUkRfTE9DS19LRVlDT0RFUz0yLAorCURFVl9NQUNfSElEX01PVVNFX0JVVFRPTl9FTVVMQVRJT049MywKKwlERVZfTUFDX0hJRF9NT1VTRV9CVVRUT04yX0tFWUNPREU9NCwKKwlERVZfTUFDX0hJRF9NT1VTRV9CVVRUT04zX0tFWUNPREU9NSwKKwlERVZfTUFDX0hJRF9BREJfTU9VU0VfU0VORFNfS0VZQ09ERVM9NgorfTsKKworLyogL3Byb2Mvc3lzL2Rldi9zY3NpICovCitlbnVtIHsKKwlERVZfU0NTSV9MT0dHSU5HX0xFVkVMPTEsCit9OworCisvKiAvcHJvYy9zeXMvZGV2L2lwbWkgKi8KK2VudW0geworCURFVl9JUE1JX1BPV0VST0ZGX1BPV0VSQ1lDTEU9MSwKK307CisKKy8qIC9wcm9jL3N5cy9hYmkgKi8KK2VudW0KK3sKKwlBQklfREVGSEFORExFUl9DT0ZGPTEsCS8qIGRlZmF1bHQgaGFuZGxlciBmb3IgY29mZiBiaW5hcmllcyAqLworCUFCSV9ERUZIQU5ETEVSX0VMRj0yLCAJLyogZGVmYXVsdCBoYW5kbGVyIGZvciBFTEYgYmluYXJpZXMgKi8KKwlBQklfREVGSEFORExFUl9MQ0FMTDc9MywvKiBkZWZhdWx0IGhhbmRsZXIgZm9yIHByb2NzIHVzaW5nIGxjYWxsNyAqLworCUFCSV9ERUZIQU5ETEVSX0xJQkNTTz00LC8qIGRlZmF1bHQgaGFuZGxlciBmb3IgYW4gbGliYy5zbyBFTEYgaW50ZXJwICovCisJQUJJX1RSQUNFPTUsCQkvKiB0cmFjaW5nIGZsYWdzICovCisJQUJJX0ZBS0VfVVRTTkFNRT02LAkvKiBmYWtlIHRhcmdldCB1dHNuYW1lIGluZm9ybWF0aW9uICovCit9OworCisKKworI2VuZGlmIC8qIF9MSU5VWF9TWVNDVExfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2OWMwNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qIHRhc2tzdGF0cy5oIC0gZXhwb3J0aW5nIHBlci10YXNrIHN0YXRpc3RpY3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFNoYWlsYWJoIE5hZ2FyLCBJQk0gQ29ycC4gMjAwNgorICogICAgICAgICAgIChDKSBCYWxiaXIgU2luZ2gsICAgSUJNIENvcnAuIDIwMDYKKyAqICAgICAgICAgICAoQykgSmF5IExhbiwgICAgICAgIFNHSSwgMjAwNgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9UQVNLU1RBVFNfSAorI2RlZmluZSBfTElOVVhfVEFTS1NUQVRTX0gKKworLyogRm9ybWF0IGZvciBwZXItdGFzayBkYXRhIHJldHVybmVkIHRvIHVzZXJsYW5kIHdoZW4KKyAqCS0gYSB0YXNrIGV4aXRzCisgKgktIGxpc3RlbmVyIHJlcXVlc3RzIHN0YXRzIGZvciBhIHRhc2sKKyAqCisgKiBUaGUgc3RydWN0IGlzIHZlcnNpb25lZC4gTmV3ZXIgdmVyc2lvbnMgc2hvdWxkIG9ubHkgYWRkIGZpZWxkcyB0bworICogdGhlIGJvdHRvbSBvZiB0aGUgc3RydWN0IHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKgorICoKKyAqIFRvIGFkZCBuZXcgZmllbGRzCisgKglhKSBidW1wIHVwIFRBU0tTVEFUU19WRVJTSU9OCisgKgliKSBhZGQgY29tbWVudCBpbmRpY2F0aW5nIG5ldyB2ZXJzaW9uIG51bWJlciBhdCBlbmQgb2Ygc3RydWN0CisgKgljKSBhZGQgbmV3IGZpZWxkcyBhZnRlciB2ZXJzaW9uIGNvbW1lbnQ7IG1haW50YWluIDY0LWJpdCBhbGlnbm1lbnQKKyAqLworCisKKyNkZWZpbmUgVEFTS1NUQVRTX1ZFUlNJT04JNgorI2RlZmluZSBUU19DT01NX0xFTgkJMzIJLyogc2hvdWxkIGJlID49IFRBU0tfQ09NTV9MRU4KKwkJCQkJICogaW4gbGludXgvc2NoZWQuaCAqLworCitzdHJ1Y3QgdGFza3N0YXRzIHsKKworCS8qIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdC4gVGhpcyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvCisJICogVEFLU1RBVFNfVkVSU0lPTiwgd2hpY2ggaXMgZGVmaW5lZCBpbiA8bGludXgvdGFza3N0YXRzLmg+LgorCSAqIEVhY2ggdGltZSB0aGUgc3RydWN0IGlzIGNoYW5nZWQsIHRoZSB2YWx1ZSBzaG91bGQgYmUgaW5jcmVtZW50ZWQuCisJICovCisJX191MTYJdmVyc2lvbjsKKwlfX3UzMglhY19leGl0Y29kZTsJCS8qIEV4aXQgc3RhdHVzICovCisKKwkvKiBUaGUgYWNjb3VudGluZyBmbGFncyBvZiBhIHRhc2sgYXMgZGVmaW5lZCBpbiA8bGludXgvYWNjdC5oPgorCSAqIERlZmluZWQgdmFsdWVzIGFyZSBBRk9SSywgQVNVLCBBQ09NUEFULCBBQ09SRSwgYW5kIEFYU0lHLgorCSAqLworCV9fdTgJYWNfZmxhZzsJCS8qIFJlY29yZCBmbGFncyAqLworCV9fdTgJYWNfbmljZTsJCS8qIHRhc2tfbmljZSAqLworCisJLyogRGVsYXkgYWNjb3VudGluZyBmaWVsZHMgc3RhcnQKKwkgKgorCSAqIEFsbCB2YWx1ZXMsIHVudGlsIGNvbW1lbnQgIkRlbGF5IGFjY291bnRpbmcgZmllbGRzIGVuZCIgYXJlCisJICogYXZhaWxhYmxlIG9ubHkgaWYgZGVsYXkgYWNjb3VudGluZyBpcyBlbmFibGVkLCBldmVuIHRob3VnaCB0aGUgbGFzdAorCSAqIGZldyBmaWVsZHMgYXJlIG5vdCBkZWxheXMKKwkgKgorCSAqIHh4eF9jb3VudCBpcyB0aGUgbnVtYmVyIG9mIGRlbGF5IHZhbHVlcyByZWNvcmRlZAorCSAqIHh4eF9kZWxheV90b3RhbCBpcyB0aGUgY29ycmVzcG9uZGluZyBjdW11bGF0aXZlIGRlbGF5IGluIG5hbm9zZWNvbmRzCisJICoKKwkgKiB4eHhfZGVsYXlfdG90YWwgd3JhcHMgYXJvdW5kIHRvIHplcm8gb24gb3ZlcmZsb3cKKwkgKiB4eHhfY291bnQgaW5jcmVtZW50ZWQgcmVnYXJkbGVzcyBvZiBvdmVyZmxvdworCSAqLworCisJLyogRGVsYXkgd2FpdGluZyBmb3IgY3B1LCB3aGlsZSBydW5uYWJsZQorCSAqIGNvdW50LCBkZWxheV90b3RhbCBOT1QgdXBkYXRlZCBhdG9taWNhbGx5CisJICovCisJX191NjQJY3B1X2NvdW50IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwlfX3U2NAljcHVfZGVsYXlfdG90YWw7CisKKwkvKiBGb2xsb3dpbmcgZm91ciBmaWVsZHMgYXRvbWljYWxseSB1cGRhdGVkIHVzaW5nIHRhc2stPmRlbGF5cy0+bG9jayAqLworCisJLyogRGVsYXkgd2FpdGluZyBmb3Igc3luY2hyb25vdXMgYmxvY2sgSS9PIHRvIGNvbXBsZXRlCisJICogZG9lcyBub3QgYWNjb3VudCBmb3IgZGVsYXlzIGluIEkvTyBzdWJtaXNzaW9uCisJICovCisJX191NjQJYmxraW9fY291bnQ7CisJX191NjQJYmxraW9fZGVsYXlfdG90YWw7CisKKwkvKiBEZWxheSB3YWl0aW5nIGZvciBwYWdlIGZhdWx0IEkvTyAoc3dhcCBpbiBvbmx5KSAqLworCV9fdTY0CXN3YXBpbl9jb3VudDsKKwlfX3U2NAlzd2FwaW5fZGVsYXlfdG90YWw7CisKKwkvKiBjcHUgIndhbGwtY2xvY2siIHJ1bm5pbmcgdGltZQorCSAqIE9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgdmFsdWUgd2lsbCBhZGp1c3QgZm9yIGNwdSB0aW1lIHN0b2xlbgorCSAqIGZyb20gdGhlIGtlcm5lbCBpbiBpbnZvbHVudGFyeSB3YWl0cyBkdWUgdG8gdmlydHVhbGl6YXRpb24uCisJICogVmFsdWUgaXMgY3VtdWxhdGl2ZSwgaW4gbmFub3NlY29uZHMsIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIGNvdW50CisJICogYW5kIHdyYXBzIGFyb3VuZCB0byB6ZXJvIHNpbGVudGx5IG9uIG92ZXJmbG93CisJICovCisJX191NjQJY3B1X3J1bl9yZWFsX3RvdGFsOworCisJLyogY3B1ICJ2aXJ0dWFsIiBydW5uaW5nIHRpbWUKKwkgKiBVc2VzIHRpbWUgaW50ZXJ2YWxzIHNlZW4gYnkgdGhlIGtlcm5lbCBpLmUuIG5vIGFkanVzdG1lbnQKKwkgKiBmb3Iga2VybmVsJ3MgaW52b2x1bnRhcnkgd2FpdHMgZHVlIHRvIHZpcnR1YWxpemF0aW9uLgorCSAqIFZhbHVlIGlzIGN1bXVsYXRpdmUsIGluIG5hbm9zZWNvbmRzLCB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBjb3VudAorCSAqIGFuZCB3cmFwcyBhcm91bmQgdG8gemVybyBzaWxlbnRseSBvbiBvdmVyZmxvdworCSAqLworCV9fdTY0CWNwdV9ydW5fdmlydHVhbF90b3RhbDsKKwkvKiBEZWxheSBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KKwkvKiB2ZXJzaW9uIDEgZW5kcyBoZXJlICovCisKKwkvKiBCYXNpYyBBY2NvdW50aW5nIEZpZWxkcyBzdGFydCAqLworCWNoYXIJYWNfY29tbVtUU19DT01NX0xFTl07CS8qIENvbW1hbmQgbmFtZSAqLworCV9fdTgJYWNfc2NoZWQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCQkJCQkvKiBTY2hlZHVsaW5nIGRpc2NpcGxpbmUgKi8KKwlfX3U4CWFjX3BhZFszXTsKKwlfX3UzMglhY191aWQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCQkJCQkvKiBVc2VyIElEICovCisJX191MzIJYWNfZ2lkOwkJCS8qIEdyb3VwIElEICovCisJX191MzIJYWNfcGlkOwkJCS8qIFByb2Nlc3MgSUQgKi8KKwlfX3UzMglhY19wcGlkOwkJLyogUGFyZW50IHByb2Nlc3MgSUQgKi8KKwlfX3UzMglhY19idGltZTsJCS8qIEJlZ2luIHRpbWUgW3NlYyBzaW5jZSAxOTcwXSAqLworCV9fdTY0CWFjX2V0aW1lIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKKwkJCQkJLyogRWxhcHNlZCB0aW1lIFt1c2VjXSAqLworCV9fdTY0CWFjX3V0aW1lOwkJLyogVXNlciBDUFUgdGltZSBbdXNlY10gKi8KKwlfX3U2NAlhY19zdGltZTsJCS8qIFNZc3RlbSBDUFUgdGltZSBbdXNlY10gKi8KKwlfX3U2NAlhY19taW5mbHQ7CQkvKiBNaW5vciBQYWdlIEZhdWx0IENvdW50ICovCisJX191NjQJYWNfbWFqZmx0OwkJLyogTWFqb3IgUGFnZSBGYXVsdCBDb3VudCAqLworCS8qIEJhc2ljIEFjY291bnRpbmcgRmllbGRzIGVuZCAqLworCisJLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgc3RhcnQgKi8KKwkvKiBBY2N1bXVsYXRlZCBSU1MgdXNhZ2UgaW4gZHVyYXRpb24gb2YgYSB0YXNrLCBpbiBNQnl0ZXMtdXNlY3MuCisJICogVGhlIGN1cnJlbnQgcnNzIHVzYWdlIGlzIGFkZGVkIHRvIHRoaXMgY291bnRlciBldmVyeSB0aW1lCisJICogYSB0aWNrIGlzIGNoYXJnZWQgdG8gYSB0YXNrJ3Mgc3lzdGVtIHRpbWUuIFNvLCBhdCB0aGUgZW5kIHdlCisJICogd2lsbCBoYXZlIG1lbW9yeSB1c2FnZSBtdWx0aXBsaWVkIGJ5IHN5c3RlbSB0aW1lLiBUaHVzIGFuCisJICogYXZlcmFnZSB1c2FnZSBwZXIgc3lzdGVtIHRpbWUgdW5pdCBjYW4gYmUgY2FsY3VsYXRlZC4KKwkgKi8KKwlfX3U2NAljb3JlbWVtOwkJLyogYWNjdW11bGF0ZWQgUlNTIHVzYWdlIGluIE1CLXVzZWMgKi8KKwkvKiBBY2N1bXVsYXRlZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSBpbiBkdXJhdGlvbiBvZiBhIHRhc2suCisJICogU2FtZSBhcyBhY2N0X3Jzc19tZW0xIGFib3ZlIGV4Y2VwdCB0aGF0IHdlIGtlZXAgdHJhY2sgb2YgVk0gdXNhZ2UuCisJICovCisJX191NjQJdmlydG1lbTsJCS8qIGFjY3VtdWxhdGVkIFZNICB1c2FnZSBpbiBNQi11c2VjICovCisKKwkvKiBIaWdoIHdhdGVybWFyayBvZiBSU1MgYW5kIHZpcnR1YWwgbWVtb3J5IHVzYWdlIGluIGR1cmF0aW9uIG9mCisJICogYSB0YXNrLCBpbiBLQnl0ZXMuCisJICovCisJX191NjQJaGl3YXRlcl9yc3M7CQkvKiBIaWdoLXdhdGVybWFyayBvZiBSU1MgdXNhZ2UsIGluIEtCICovCisJX191NjQJaGl3YXRlcl92bTsJCS8qIEhpZ2gtd2F0ZXIgVk0gdXNhZ2UsIGluIEtCICovCisKKwkvKiBUaGUgZm9sbG93aW5nIGZvdXIgZmllbGRzIGFyZSBJL08gc3RhdGlzdGljcyBvZiBhIHRhc2suICovCisJX191NjQJcmVhZF9jaGFyOwkJLyogYnl0ZXMgcmVhZCAqLworCV9fdTY0CXdyaXRlX2NoYXI7CQkvKiBieXRlcyB3cml0dGVuICovCisJX191NjQJcmVhZF9zeXNjYWxsczsJCS8qIHJlYWQgc3lzY2FsbHMgKi8KKwlfX3U2NAl3cml0ZV9zeXNjYWxsczsJCS8qIHdyaXRlIHN5c2NhbGxzICovCisJLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCisKKyNkZWZpbmUgVEFTS1NUQVRTX0hBU19JT19BQ0NPVU5USU5HCisJLyogUGVyLXRhc2sgc3RvcmFnZSBJL08gYWNjb3VudGluZyBzdGFydHMgKi8KKwlfX3U2NAlyZWFkX2J5dGVzOwkJLyogYnl0ZXMgb2YgcmVhZCBJL08gKi8KKwlfX3U2NAl3cml0ZV9ieXRlczsJCS8qIGJ5dGVzIG9mIHdyaXRlIEkvTyAqLworCV9fdTY0CWNhbmNlbGxlZF93cml0ZV9ieXRlczsJLyogYnl0ZXMgb2YgY2FuY2VsbGVkIHdyaXRlIEkvTyAqLworCisJX191NjQgIG52Y3N3OwkJCS8qIHZvbHVudGFyeV9jdHh0X3N3aXRjaGVzICovCisJX191NjQgIG5pdmNzdzsJCQkvKiBub252b2x1bnRhcnlfY3R4dF9zd2l0Y2hlcyAqLworCisJLyogdGltZSBhY2NvdW50aW5nIGZvciBTTVQgbWFjaGluZXMgKi8KKwlfX3U2NAlhY191dGltZXNjYWxlZDsJCS8qIHV0aW1lIHNjYWxlZCBvbiBmcmVxdWVuY3kgZXRjICovCisJX191NjQJYWNfc3RpbWVzY2FsZWQ7CQkvKiBzdGltZSBzY2FsZWQgb24gZnJlcXVlbmN5IGV0YyAqLworCV9fdTY0CWNwdV9zY2FsZWRfcnVuX3JlYWxfdG90YWw7IC8qIHNjYWxlZCBjcHVfcnVuX3JlYWxfdG90YWwgKi8KK307CisKKworLyoKKyAqIENvbW1hbmRzIHNlbnQgZnJvbSB1c2Vyc3BhY2UKKyAqIE5vdCB2ZXJzaW9uZWQuIE5ldyBjb21tYW5kcyBzaG91bGQgb25seSBiZSBpbnNlcnRlZCBhdCB0aGUgZW51bSdzIGVuZAorICogcHJpb3IgdG8gX19UQVNLU1RBVFNfQ01EX01BWAorICovCisKK2VudW0geworCVRBU0tTVEFUU19DTURfVU5TUEVDID0gMCwJLyogUmVzZXJ2ZWQgKi8KKwlUQVNLU1RBVFNfQ01EX0dFVCwJCS8qIHVzZXItPmtlcm5lbCByZXF1ZXN0L2dldC1yZXNwb25zZSAqLworCVRBU0tTVEFUU19DTURfTkVXLAkJLyoga2VybmVsLT51c2VyIGV2ZW50ICovCisJX19UQVNLU1RBVFNfQ01EX01BWCwKK307CisKKyNkZWZpbmUgVEFTS1NUQVRTX0NNRF9NQVggKF9fVEFTS1NUQVRTX0NNRF9NQVggLSAxKQorCitlbnVtIHsKKwlUQVNLU1RBVFNfVFlQRV9VTlNQRUMgPSAwLAkvKiBSZXNlcnZlZCAqLworCVRBU0tTVEFUU19UWVBFX1BJRCwJCS8qIFByb2Nlc3MgaWQgKi8KKwlUQVNLU1RBVFNfVFlQRV9UR0lELAkJLyogVGhyZWFkIGdyb3VwIGlkICovCisJVEFTS1NUQVRTX1RZUEVfU1RBVFMsCQkvKiB0YXNrc3RhdHMgc3RydWN0dXJlICovCisJVEFTS1NUQVRTX1RZUEVfQUdHUl9QSUQsCS8qIGNvbnRhaW5zIHBpZCArIHN0YXRzICovCisJVEFTS1NUQVRTX1RZUEVfQUdHUl9UR0lELAkvKiBjb250YWlucyB0Z2lkICsgc3RhdHMgKi8KKwlfX1RBU0tTVEFUU19UWVBFX01BWCwKK307CisKKyNkZWZpbmUgVEFTS1NUQVRTX1RZUEVfTUFYIChfX1RBU0tTVEFUU19UWVBFX01BWCAtIDEpCisKK2VudW0geworCVRBU0tTVEFUU19DTURfQVRUUl9VTlNQRUMgPSAwLAorCVRBU0tTVEFUU19DTURfQVRUUl9QSUQsCisJVEFTS1NUQVRTX0NNRF9BVFRSX1RHSUQsCisJVEFTS1NUQVRTX0NNRF9BVFRSX1JFR0lTVEVSX0NQVU1BU0ssCisJVEFTS1NUQVRTX0NNRF9BVFRSX0RFUkVHSVNURVJfQ1BVTUFTSywKKwlfX1RBU0tTVEFUU19DTURfQVRUUl9NQVgsCit9OworCisjZGVmaW5lIFRBU0tTVEFUU19DTURfQVRUUl9NQVggKF9fVEFTS1NUQVRTX0NNRF9BVFRSX01BWCAtIDEpCisKKy8qIE5FVExJTktfR0VORVJJQyByZWxhdGVkIGluZm8gKi8KKworI2RlZmluZSBUQVNLU1RBVFNfR0VOTF9OQU1FCSJUQVNLU1RBVFMiCisjZGVmaW5lIFRBU0tTVEFUU19HRU5MX1ZFUlNJT04JMHgxCisKKyNlbmRpZiAvKiBfTElOVVhfVEFTS1NUQVRTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2dhY3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2dhY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2EwM2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfZ2FjdC5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19HQUNUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19HQUNUX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX0dBQ1QgNQorc3RydWN0IHRjX2dhY3QKK3sKKwl0Y19nZW47CisKK307CisKK3N0cnVjdCB0Y19nYWN0X3AKK3sKKyNkZWZpbmUgUEdBQ1RfTk9ORSAgICAgICAgICAgICAgMAorI2RlZmluZSBQR0FDVF9ORVRSQU5EICAgICAgICAgICAxCisjZGVmaW5lIFBHQUNUX0RFVEVSTSAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFYX1JBTkQgICAgICAgICAgICAgICAgKFBHQUNUX0RFVEVSTSArIDEgKQorCV9fdTE2ICAgICAgICAgICAgICAgICBwdHlwZTsKKwlfX3UxNiAgICAgICAgICAgICAgICAgcHZhbDsKKwlpbnQgICAgICAgICAgICAgICAgICAgcGFjdGlvbjsKK307CisgCitlbnVtCit7CisJVENBX0dBQ1RfVU5TUEVDLAorCVRDQV9HQUNUX1RNLAorCVRDQV9HQUNUX1BBUk1TLAorCVRDQV9HQUNUX1BST0IsCisJX19UQ0FfR0FDVF9NQVgKK307CisjZGVmaW5lIFRDQV9HQUNUX01BWCAoX19UQ0FfR0FDVF9NQVggLSAxKQorIAorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19pcHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX2lwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmY3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19pcHQuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fTElOVVhfVENfSVBUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19JUFRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfSVBUIDYKKworZW51bQoreworCVRDQV9JUFRfVU5TUEVDLAorCVRDQV9JUFRfVEFCTEUsCisJVENBX0lQVF9IT09LLAorCVRDQV9JUFRfSU5ERVgsCisJVENBX0lQVF9DTlQsCisJVENBX0lQVF9UTSwKKwlUQ0FfSVBUX1RBUkcsCisJX19UQ0FfSVBUX01BWAorfTsKKyNkZWZpbmUgVENBX0lQVF9NQVggKF9fVENBX0lQVF9NQVggLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbWlycmVkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19taXJyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQ2MzQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbWlycmVkLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX01JUl9ICisjZGVmaW5lIF9fTElOVVhfVENfTUlSX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX01JUlJFRCA4CisjZGVmaW5lIFRDQV9FR1JFU1NfUkVESVIgMSAgLyogcGFja2V0IHJlZGlyZWN0IHRvIEVHUkVTUyovCisjZGVmaW5lIFRDQV9FR1JFU1NfTUlSUk9SIDIgLyogbWlycm9yIHBhY2tldCB0byBFR1JFU1MgKi8KKyNkZWZpbmUgVENBX0lOR1JFU1NfUkVESVIgMyAgLyogcGFja2V0IHJlZGlyZWN0IHRvIElOR1JFU1MqLworI2RlZmluZSBUQ0FfSU5HUkVTU19NSVJST1IgNCAvKiBtaXJyb3IgcGFja2V0IHRvIElOR1JFU1MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdHJ1Y3QgdGNfbWlycmVkCit7CisJdGNfZ2VuOworCWludCAgICAgICAgICAgICAgICAgICAgIGVhY3Rpb247ICAgLyogb25lIG9mIElOL0VHUkVTU19NSVJST1IvUkVESVIgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICBpZmluZGV4OyAgLyogaWZpbmRleCBvZiBlZ3Jlc3MgcG9ydCAqLworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitlbnVtCit7CisJVENBX01JUlJFRF9VTlNQRUMsCisJVENBX01JUlJFRF9UTSwKKwlUQ0FfTUlSUkVEX1BBUk1TLAorCV9fVENBX01JUlJFRF9NQVgKK307CisjZGVmaW5lIFRDQV9NSVJSRURfTUFYIChfX1RDQV9NSVJSRURfTUFYIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX25hdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19hY3QvdGNfbmF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjZjMxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX25hdC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19OQVRfSAorI2RlZmluZSBfX0xJTlVYX1RDX05BVF9ICisKKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBUQ0FfQUNUX05BVCA5CisKK2VudW0KK3sKKwlUQ0FfTkFUX1VOU1BFQywKKwlUQ0FfTkFUX1BBUk1TLAorCVRDQV9OQVRfVE0sCisJX19UQ0FfTkFUX01BWAorfTsKKyNkZWZpbmUgVENBX05BVF9NQVggKF9fVENBX05BVF9NQVggLSAxKQorCisjZGVmaW5lIFRDQV9OQVRfRkxBR19FR1JFU1MgMQorCitzdHJ1Y3QgdGNfbmF0Cit7CisJdGNfZ2VuOworCV9fYmUzMiBvbGRfYWRkcjsKKwlfX2JlMzIgbmV3X2FkZHI7CisJX19iZTMyIG1hc2s7CisJX191MzIgZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfYWN0L3RjX3BlZGl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19wZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTU2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2FjdC90Y19wZWRpdC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19QRURfSAorI2RlZmluZSBfX0xJTlVYX1RDX1BFRF9ICisKKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9QRURJVCA3CisKK2VudW0KK3sKKwlUQ0FfUEVESVRfVU5TUEVDLAorCVRDQV9QRURJVF9UTSwKKwlUQ0FfUEVESVRfUEFSTVMsCisJX19UQ0FfUEVESVRfTUFYCit9OworI2RlZmluZSBUQ0FfUEVESVRfTUFYIChfX1RDQV9QRURJVF9NQVggLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0cnVjdCB0Y19wZWRpdF9rZXkKK3sKKwlfX3UzMiAgICAgICAgICAgbWFzazsgIC8qIEFORCAqLworCV9fdTMyICAgICAgICAgICB2YWw7ICAgLypYT1IgKi8KKwlfX3UzMiAgICAgICAgICAgb2ZmOyAgLypvZmZzZXQgKi8KKwlfX3UzMiAgICAgICAgICAgYXQ7CisJX191MzIgICAgICAgICAgIG9mZm1hc2s7CisJX191MzIgICAgICAgICAgIHNoaWZ0OworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitzdHJ1Y3QgdGNfcGVkaXRfc2VsCit7CisJdGNfZ2VuOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIG5rZXlzOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGZsYWdzOworCXN0cnVjdCB0Y19wZWRpdF9rZXkgICAgIGtleXNbMF07Cit9OworI2RlZmluZSB0Y19wZWRpdCB0Y19wZWRpdF9zZWwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9jbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX2NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjRkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9jbXAuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIF9fTElOVVhfVENfRU1fQ01QX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19FTV9DTVBfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGNmX2VtX2NtcAoreworCV9fdTMyCQl2YWw7CisJX191MzIJCW1hc2s7CisJX191MTYJCW9mZjsKKwlfX3U4CQlhbGlnbjo0OworCV9fdTgJCWZsYWdzOjQ7CisJX191OAkJbGF5ZXI6NDsKKwlfX3U4CQlvcG5kOjQ7Cit9OworCitlbnVtCit7CisJVENGX0VNX0FMSUdOX1U4ICA9IDEsCisJVENGX0VNX0FMSUdOX1UxNiA9IDIsCisJVENGX0VNX0FMSUdOX1UzMiA9IDQKK307CisKKyNkZWZpbmUgVENGX0VNX0NNUF9UUkFOUwkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTkzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKQEAgLTAsMCArMSw5NCBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0VNX01FVEFfSAorI2RlZmluZSBfX0xJTlVYX1RDX0VNX01FVEFfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitlbnVtCit7CisJVENBX0VNX01FVEFfVU5TUEVDLAorCVRDQV9FTV9NRVRBX0hEUiwKKwlUQ0FfRU1fTUVUQV9MVkFMVUUsCisJVENBX0VNX01FVEFfUlZBTFVFLAorCV9fVENBX0VNX01FVEFfTUFYCit9OworI2RlZmluZSBUQ0FfRU1fTUVUQV9NQVggKF9fVENBX0VNX01FVEFfTUFYIC0gMSkKKworc3RydWN0IHRjZl9tZXRhX3ZhbAoreworCV9fdTE2CQkJa2luZDsKKwlfX3U4CQkJc2hpZnQ7CisJX191OAkJCW9wOworfTsKKworI2RlZmluZSBUQ0ZfTUVUQV9UWVBFX01BU0sJKDB4ZiA8PCAxMikKKyNkZWZpbmUgVENGX01FVEFfVFlQRShraW5kKQkoKChraW5kKSAmIFRDRl9NRVRBX1RZUEVfTUFTSykgPj4gMTIpCisjZGVmaW5lIFRDRl9NRVRBX0lEX01BU0sJMHg3ZmYKKyNkZWZpbmUgVENGX01FVEFfSUQoa2luZCkJKChraW5kKSAmIFRDRl9NRVRBX0lEX01BU0spCisKK2VudW0KK3sKKwlUQ0ZfTUVUQV9UWVBFX1ZBUiwKKwlUQ0ZfTUVUQV9UWVBFX0lOVCwKKwlfX1RDRl9NRVRBX1RZUEVfTUFYCit9OworI2RlZmluZSBUQ0ZfTUVUQV9UWVBFX01BWCAoX19UQ0ZfTUVUQV9UWVBFX01BWCAtIDEpCisKK2VudW0KK3sKKwlUQ0ZfTUVUQV9JRF9WQUxVRSwKKwlUQ0ZfTUVUQV9JRF9SQU5ET00sCisJVENGX01FVEFfSURfTE9BREFWR18wLAorCVRDRl9NRVRBX0lEX0xPQURBVkdfMSwKKwlUQ0ZfTUVUQV9JRF9MT0FEQVZHXzIsCisJVENGX01FVEFfSURfREVWLAorCVRDRl9NRVRBX0lEX1BSSU9SSVRZLAorCVRDRl9NRVRBX0lEX1BST1RPQ09MLAorCVRDRl9NRVRBX0lEX1BLVFRZUEUsCisJVENGX01FVEFfSURfUEtUTEVOLAorCVRDRl9NRVRBX0lEX0RBVEFMRU4sCisJVENGX01FVEFfSURfTUFDTEVOLAorCVRDRl9NRVRBX0lEX05GTUFSSywKKwlUQ0ZfTUVUQV9JRF9UQ0lOREVYLAorCVRDRl9NRVRBX0lEX1JUQ0xBU1NJRCwKKwlUQ0ZfTUVUQV9JRF9SVElJRiwKKwlUQ0ZfTUVUQV9JRF9TS19GQU1JTFksCisJVENGX01FVEFfSURfU0tfU1RBVEUsCisJVENGX01FVEFfSURfU0tfUkVVU0UsCisJVENGX01FVEFfSURfU0tfQk9VTkRfSUYsCisJVENGX01FVEFfSURfU0tfUkVGQ05ULAorCVRDRl9NRVRBX0lEX1NLX1NIVVRET1dOLAorCVRDRl9NRVRBX0lEX1NLX1BST1RPLAorCVRDRl9NRVRBX0lEX1NLX1RZUEUsCisJVENGX01FVEFfSURfU0tfUkNWQlVGLAorCVRDRl9NRVRBX0lEX1NLX1JNRU1fQUxMT0MsCisJVENGX01FVEFfSURfU0tfV01FTV9BTExPQywKKwlUQ0ZfTUVUQV9JRF9TS19PTUVNX0FMTE9DLAorCVRDRl9NRVRBX0lEX1NLX1dNRU1fUVVFVUVELAorCVRDRl9NRVRBX0lEX1NLX1JDVl9RTEVOLAorCVRDRl9NRVRBX0lEX1NLX1NORF9RTEVOLAorIAlUQ0ZfTUVUQV9JRF9TS19FUlJfUUxFTiwKKwlUQ0ZfTUVUQV9JRF9TS19GT1JXQVJEX0FMTE9DUywKKwlUQ0ZfTUVUQV9JRF9TS19TTkRCVUYsCisgCVRDRl9NRVRBX0lEX1NLX0FMTE9DUywKKyAJVENGX01FVEFfSURfU0tfUk9VVEVfQ0FQUywKKyAJVENGX01FVEFfSURfU0tfSEFTSCwKKyAJVENGX01FVEFfSURfU0tfTElOR0VSVElNRSwKKyAJVENGX01FVEFfSURfU0tfQUNLX0JBQ0tMT0csCisgCVRDRl9NRVRBX0lEX1NLX01BWF9BQ0tfQkFDS0xPRywKKyAJVENGX01FVEFfSURfU0tfUFJJTywKKyAJVENGX01FVEFfSURfU0tfUkNWTE9XQVQsCisgCVRDRl9NRVRBX0lEX1NLX1JDVlRJTUVPLAorIAlUQ0ZfTUVUQV9JRF9TS19TTkRUSU1FTywKKyAJVENGX01FVEFfSURfU0tfU0VORE1TR19PRkYsCisgCVRDRl9NRVRBX0lEX1NLX1dSSVRFX1BFTkRJTkcsCisJX19UQ0ZfTUVUQV9JRF9NQVgKK307CisjZGVmaW5lIFRDRl9NRVRBX0lEX01BWCAoX19UQ0ZfTUVUQV9JRF9NQVggLSAxKQorCitzdHJ1Y3QgdGNmX21ldGFfaGRyCit7CisJc3RydWN0IHRjZl9tZXRhX3ZhbAlsZWZ0OworCXN0cnVjdCB0Y2ZfbWV0YV92YWwJcmlnaHQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX25ieXRlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9uYnl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOWQxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9uYnl0ZS5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19FTV9OQllURV9ICisjZGVmaW5lIF9fTElOVVhfVENfRU1fTkJZVEVfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGNmX2VtX25ieXRlCit7CisJX191MTYJCW9mZjsKKwlfX3UxNgkJbGVuOjEyOworCV9fdTgJCWxheWVyOjQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX3RleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX3RleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Q0M2U5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fdGV4dC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX19MSU5VWF9UQ19FTV9URVhUX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19FTV9URVhUX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ19FTV9URVhUX0FMR09TSVoJMTYKKworc3RydWN0IHRjZl9lbV90ZXh0Cit7CisJY2hhcgkJYWxnb1tUQ19FTV9URVhUX0FMR09TSVpdOworCV9fdTE2CQlmcm9tX29mZnNldDsKKwlfX3UxNgkJdG9fb2Zmc2V0OworCV9fdTE2CQlwYXR0ZXJuX2xlbjsKKwlfX3U4CQlmcm9tX2xheWVyOjQ7CisJX191OAkJdG9fbGF5ZXI6NDsKKwlfX3U4CQlwYWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGNwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjk4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgVENQIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIyl0Y3AuaAkxLjAuMgkwNC8yOC85MworICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1RDUF9ICisjZGVmaW5lIF9MSU5VWF9UQ1BfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKK3N0cnVjdCB0Y3BoZHIgeworCV9fYmUxNglzb3VyY2U7CisJX19iZTE2CWRlc3Q7CisJX19iZTMyCXNlcTsKKwlfX2JlMzIJYWNrX3NlcTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3UxNglyZXMxOjQsCisJCWRvZmY6NCwKKwkJZmluOjEsCisJCXN5bjoxLAorCQlyc3Q6MSwKKwkJcHNoOjEsCisJCWFjazoxLAorCQl1cmc6MSwKKwkJZWNlOjEsCisJCWN3cjoxOworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJX191MTYJZG9mZjo0LAorCQlyZXMxOjQsCisJCWN3cjoxLAorCQllY2U6MSwKKwkJdXJnOjEsCisJCWFjazoxLAorCQlwc2g6MSwKKwkJcnN0OjEsCisJCXN5bjoxLAorCQlmaW46MTsKKyNlbHNlCisjZXJyb3IJIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCisjZW5kaWYJCisJX19iZTE2CXdpbmRvdzsKKwlfX3N1bTE2CWNoZWNrOworCV9fYmUxNgl1cmdfcHRyOworfTsKKworLyoKKyAqCVRoZSB1bmlvbiBjYXN0IHVzZXMgYSBnY2MgZXh0ZW5zaW9uIHRvIGF2b2lkIGFsaWFzaW5nIHByb2JsZW1zCisgKiAgKHVuaW9uIGlzIGNvbXBhdGlibGUgdG8gYW55IG9mIGl0cyBtZW1iZXJzKQorICogIFRoaXMgbWVhbnMgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGlzIC1mc3RyaWN0LWFsaWFzaW5nIHNhZmUgbm93LgorICovCit1bmlvbiB0Y3Bfd29yZF9oZHIgeyAKKwlzdHJ1Y3QgdGNwaGRyIGhkcjsKKwlfX2JlMzIgCQkgIHdvcmRzWzVdOworfTsgCisKKyNkZWZpbmUgdGNwX2ZsYWdfd29yZCh0cCkgKCAoKHVuaW9uIHRjcF93b3JkX2hkciAqKSh0cCkpLT53b3JkcyBbM10pIAorCitlbnVtIHsgCisJVENQX0ZMQUdfQ1dSID0gX19jb25zdGFudF9odG9ubCgweDAwODAwMDAwKSwgCisJVENQX0ZMQUdfRUNFID0gX19jb25zdGFudF9odG9ubCgweDAwNDAwMDAwKSwgCisJVENQX0ZMQUdfVVJHID0gX19jb25zdGFudF9odG9ubCgweDAwMjAwMDAwKSwgCisJVENQX0ZMQUdfQUNLID0gX19jb25zdGFudF9odG9ubCgweDAwMTAwMDAwKSwgCisJVENQX0ZMQUdfUFNIID0gX19jb25zdGFudF9odG9ubCgweDAwMDgwMDAwKSwgCisJVENQX0ZMQUdfUlNUID0gX19jb25zdGFudF9odG9ubCgweDAwMDQwMDAwKSwgCisJVENQX0ZMQUdfU1lOID0gX19jb25zdGFudF9odG9ubCgweDAwMDIwMDAwKSwgCisJVENQX0ZMQUdfRklOID0gX19jb25zdGFudF9odG9ubCgweDAwMDEwMDAwKSwKKwlUQ1BfUkVTRVJWRURfQklUUyA9IF9fY29uc3RhbnRfaHRvbmwoMHgwRjAwMDAwMCksCisJVENQX0RBVEFfT0ZGU0VUID0gX19jb25zdGFudF9odG9ubCgweEYwMDAwMDAwKQorfTsgCisKKy8qIFRDUCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBUQ1BfTk9ERUxBWQkJMQkvKiBUdXJuIG9mZiBOYWdsZSdzIGFsZ29yaXRobS4gKi8KKyNkZWZpbmUgVENQX01BWFNFRwkJMgkvKiBMaW1pdCBNU1MgKi8KKyNkZWZpbmUgVENQX0NPUksJCTMJLyogTmV2ZXIgc2VuZCBwYXJ0aWFsbHkgY29tcGxldGUgc2VnbWVudHMgKi8KKyNkZWZpbmUgVENQX0tFRVBJRExFCQk0CS8qIFN0YXJ0IGtlZXBsaXZlcyBhZnRlciB0aGlzIHBlcmlvZCAqLworI2RlZmluZSBUQ1BfS0VFUElOVFZMCQk1CS8qIEludGVydmFsIGJldHdlZW4ga2VlcGFsaXZlcyAqLworI2RlZmluZSBUQ1BfS0VFUENOVAkJNgkvKiBOdW1iZXIgb2Yga2VlcGFsaXZlcyBiZWZvcmUgZGVhdGggKi8KKyNkZWZpbmUgVENQX1NZTkNOVAkJNwkvKiBOdW1iZXIgb2YgU1lOIHJldHJhbnNtaXRzICovCisjZGVmaW5lIFRDUF9MSU5HRVIyCQk4CS8qIExpZmUgdGltZSBvZiBvcnBoYW5lZCBGSU4tV0FJVC0yIHN0YXRlICovCisjZGVmaW5lIFRDUF9ERUZFUl9BQ0NFUFQJOQkvKiBXYWtlIHVwIGxpc3RlbmVyIG9ubHkgd2hlbiBkYXRhIGFycml2ZSAqLworI2RlZmluZSBUQ1BfV0lORE9XX0NMQU1QCTEwCS8qIEJvdW5kIGFkdmVydGlzZWQgd2luZG93ICovCisjZGVmaW5lIFRDUF9JTkZPCQkxMQkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbm5lY3Rpb24uICovCisjZGVmaW5lIFRDUF9RVUlDS0FDSwkJMTIJLyogQmxvY2svcmVlbmFibGUgcXVpY2sgYWNrcyAqLworI2RlZmluZSBUQ1BfQ09OR0VTVElPTgkJMTMJLyogQ29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobSAqLworI2RlZmluZSBUQ1BfTUQ1U0lHCQkxNAkvKiBUQ1AgTUQ1IFNpZ25hdHVyZSAoUkZDMjM4NSkgKi8KKworI2RlZmluZSBUQ1BJX09QVF9USU1FU1RBTVBTCTEKKyNkZWZpbmUgVENQSV9PUFRfU0FDSwkJMgorI2RlZmluZSBUQ1BJX09QVF9XU0NBTEUJCTQKKyNkZWZpbmUgVENQSV9PUFRfRUNOCQk4CisKK2VudW0gdGNwX2NhX3N0YXRlCit7CisJVENQX0NBX09wZW4gPSAwLAorI2RlZmluZSBUQ1BGX0NBX09wZW4JKDE8PFRDUF9DQV9PcGVuKQorCVRDUF9DQV9EaXNvcmRlciA9IDEsCisjZGVmaW5lIFRDUEZfQ0FfRGlzb3JkZXIgKDE8PFRDUF9DQV9EaXNvcmRlcikKKwlUQ1BfQ0FfQ1dSID0gMiwKKyNkZWZpbmUgVENQRl9DQV9DV1IJKDE8PFRDUF9DQV9DV1IpCisJVENQX0NBX1JlY292ZXJ5ID0gMywKKyNkZWZpbmUgVENQRl9DQV9SZWNvdmVyeSAoMTw8VENQX0NBX1JlY292ZXJ5KQorCVRDUF9DQV9Mb3NzID0gNAorI2RlZmluZSBUQ1BGX0NBX0xvc3MJKDE8PFRDUF9DQV9Mb3NzKQorfTsKKworc3RydWN0IHRjcF9pbmZvCit7CisJX191OAl0Y3BpX3N0YXRlOworCV9fdTgJdGNwaV9jYV9zdGF0ZTsKKwlfX3U4CXRjcGlfcmV0cmFuc21pdHM7CisJX191OAl0Y3BpX3Byb2JlczsKKwlfX3U4CXRjcGlfYmFja29mZjsKKwlfX3U4CXRjcGlfb3B0aW9uczsKKwlfX3U4CXRjcGlfc25kX3dzY2FsZSA6IDQsIHRjcGlfcmN2X3dzY2FsZSA6IDQ7CisKKwlfX3UzMgl0Y3BpX3J0bzsKKwlfX3UzMgl0Y3BpX2F0bzsKKwlfX3UzMgl0Y3BpX3NuZF9tc3M7CisJX191MzIJdGNwaV9yY3ZfbXNzOworCisJX191MzIJdGNwaV91bmFja2VkOworCV9fdTMyCXRjcGlfc2Fja2VkOworCV9fdTMyCXRjcGlfbG9zdDsKKwlfX3UzMgl0Y3BpX3JldHJhbnM7CisJX191MzIJdGNwaV9mYWNrZXRzOworCisJLyogVGltZXMuICovCisJX191MzIJdGNwaV9sYXN0X2RhdGFfc2VudDsKKwlfX3UzMgl0Y3BpX2xhc3RfYWNrX3NlbnQ7ICAgICAvKiBOb3QgcmVtZW1iZXJlZCwgc29ycnkuICovCisJX191MzIJdGNwaV9sYXN0X2RhdGFfcmVjdjsKKwlfX3UzMgl0Y3BpX2xhc3RfYWNrX3JlY3Y7CisKKwkvKiBNZXRyaWNzLiAqLworCV9fdTMyCXRjcGlfcG10dTsKKwlfX3UzMgl0Y3BpX3Jjdl9zc3RocmVzaDsKKwlfX3UzMgl0Y3BpX3J0dDsKKwlfX3UzMgl0Y3BpX3J0dHZhcjsKKwlfX3UzMgl0Y3BpX3NuZF9zc3RocmVzaDsKKwlfX3UzMgl0Y3BpX3NuZF9jd25kOworCV9fdTMyCXRjcGlfYWR2bXNzOworCV9fdTMyCXRjcGlfcmVvcmRlcmluZzsKKworCV9fdTMyCXRjcGlfcmN2X3J0dDsKKwlfX3UzMgl0Y3BpX3Jjdl9zcGFjZTsKKworCV9fdTMyCXRjcGlfdG90YWxfcmV0cmFuczsKK307CisKKy8qIGZvciBUQ1BfTUQ1U0lHIHNvY2tldCBvcHRpb24gKi8KKyNkZWZpbmUgVENQX01ENVNJR19NQVhLRVlMRU4JODAKKworc3RydWN0IHRjcF9tZDVzaWcgeworCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIHRjcG1fYWRkcjsJLyogYWRkcmVzcyBhc3NvY2lhdGVkICovCisJX191MTYJX190Y3BtX3BhZDE7CQkJCS8qIHplcm8gKi8KKwlfX3UxNgl0Y3BtX2tleWxlbjsJCQkJLyoga2V5IGxlbmd0aCAqLworCV9fdTMyCV9fdGNwbV9wYWQyOwkJCQkvKiB6ZXJvICovCisJX191OAl0Y3BtX2tleVtUQ1BfTUQ1U0lHX01BWEtFWUxFTl07CQkvKiBrZXkgKGJpbmFyeSkgKi8KK307CisKKworI2VuZGlmCS8qIF9MSU5VWF9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90ZWxlcGhvbnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVsZXBob255LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwY2YyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVsZXBob255LmgKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJdGVsZXBob255LmgKKyAqCisgKgkJQmFzaWMgTGludXggVGVsZXBob255IEludGVyZmFjZQorICoKKyAqCQkoYykgQ29weXJpZ2h0IDE5OTktMjAwMSBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBBdXRob3JzOiAgICAgICBFZCBPa2Vyc29uLCA8ZW9rZXJzb25AcXVpY2tuZXQubmV0PgorICogICAgICAgICAgICAgICAgICAgR3JlZyBIZXJsZWluLCA8Z2hlcmxlaW5AcXVpY2tuZXQubmV0PgorICoKKyAqICAgIENvbnRyaWJ1dG9yczogIEFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICogICAgICAgICAgICAgICAgICAgRGF2aWQgVy4gRXJoYXJ0LCA8ZGVyaGFydEBxdWlja25ldC5uZXQ+CisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgUVVJQ0tORVQgVEVDSE5PTE9HSUVTLCBJTkMuIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SCisgKiBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT04sIEVWRU4gSUYgUVVJQ0tORVQKKyAqIFRFQ0hOT0xPR0lFUywgSU5DLiBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBRVUlDS05FVCBURUNITk9MT0dJRVMsIElOQy4gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUworICogT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIFFVSUNLTkVUIFRFQ0hOT0xPR0lFUywgSU5DLiBIQVMgTk8gT0JMSUdBVElPTgorICogVE8gUFJPVklERSBNQUlOVEVOQU5DRSwgU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorICoKKyAqIFZlcnNpb246ICAgICAgICRSZXZpc2lvbjogNC4yICQKKyAqCisgKiAkSWQ6IHRlbGVwaG9ueS5oLHYgNC4yIDIwMDEvMDgvMDYgMDc6MDk6NDMgY3JhaWdzIEV4cCAkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRFTEVQSE9OWV9ICisjZGVmaW5lIFRFTEVQSE9OWV9ICisKKyNkZWZpbmUgVEVMRVBIT05ZX1ZFUlNJT04gMzAxMworCisjZGVmaW5lIFBIT05FX1ZFTkRPUl9JWEogICAgICAgICAgMQorI2RlZmluZSBQSE9ORV9WRU5ET1JfUVVJQ0tORVQJICBQSE9ORV9WRU5ET1JfSVhKCisjZGVmaW5lIFBIT05FX1ZFTkRPUl9WT0lDRVRST05JWCAgMgorI2RlZmluZSBQSE9ORV9WRU5ET1JfQUNVTEFCICAgICAgIDMKKyNkZWZpbmUgUEhPTkVfVkVORE9SX0RJR0kgICAgICAgICA0CisjZGVmaW5lIFBIT05FX1ZFTkRPUl9GUkFOS0xJTiAgICAgNQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVmVuZG9yIFN1bW1hcnkgSW5mb3JtYXRpb24gQXJlYQorICoKKyAqICBRdWlja25ldCBUZWNobm9sb2dpZXMsIEluYy4gLSBtYWtlcyBsb3cgZGVuc2l0eSBhbmFsb2cgdGVsZXBob255IGNhcmRzCisgKiAgICB3aXRoIGF1ZGlvIGNvbXByZXNzaW9uLCBQT1RTIGFuZCBQU1ROIGludGVyZmFjZXMgKHd3dy5xdWlja25ldC5uZXQpCisgKgorICogIChvdGhlciB2ZW5kb3JzIGZvbGxvd2luZyB0aGlzIEFQSSBzaHVsZCBhZGQgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZgorICogIHRoZSB0ZWxlcGhvbnkgcHJvZHVjdHMgdGhleSBzdXBwb3J0IHVuZGVyIExpbnV4KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUVRJX1BIT05FSkFDSwkJMTAwCisjZGVmaW5lIFFUSV9MSU5FSkFDSwkJMzAwCisjZGVmaW5lIFFUSV9QSE9ORUpBQ0tfTElURQk0MDAKKyNkZWZpbmUgUVRJX1BIT05FSkFDS19QQ0kJNTAwCisjZGVmaW5lIFFUSV9QSE9ORUNBUkQJCTYwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZSBjYXBhYmlsaXRpZXMgaW9jdGxzIGNhbiBpbmZvcm0geW91IG9mIHRoZSBjYXBhYmlsaXRpZXMgb2YgZWFjaCBwaG9uZQorKiBkZXZpY2UgaW5zdGFsbGVkIGluIHlvdXIgc3lzdGVtLiAgVGhlIFBIT05FQ1RMX0NBUEFCSUxJVElFUyBpb2N0bAorKiByZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGNhcGFiaWxpdGllcyB0aGUgICAKKyogZGV2aWNlIGhhcy4gIFRoZSBQSE9ORUNUTF9DQVBBQklMSVRJRVNfTElTVCB3aWxsIGZpbGwgYW4gYXJyYXkgb2YgCisqIGNhcGFiaWxpdHkgc3RydWN0cyB3aXRoIGFsbCBvZiBpdHMgY2FwYWJpbGl0aWVzLiAgVGhlCisqIFBIT05FQ1RMX0NBUEFCSUxJVElFU19DSEVDSyB0YWtlcyBhIHNpbmdsZSBjYXBhYmlsaXR5IHN0cnVjdCBhbmQgcmV0dXJucworKiBhIFRSVUUgaWYgdGhlIGRldmljZSBoYXMgdGhhdCBjYXBhYmlsaXR5LCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCXZlbmRvciA9IDAsCisJZGV2aWNlLAorCXBvcnQsCisJY29kZWMsCisJZHNwCit9IHBob25lX2NhcDsKKworc3RydWN0IHBob25lX2NhcGFiaWxpdHkgeworCWNoYXIgZGVzY1s4MF07CisJcGhvbmVfY2FwIGNhcHR5cGU7CisJaW50IGNhcDsKKwlpbnQgaGFuZGxlOworfTsKKwordHlwZWRlZiBlbnVtIHsKKwlwb3RzID0gMCwKKwlwc3RuLAorCWhhbmRzZXQsCisJc3BlYWtlcgorfSBwaG9uZV9wb3J0czsKKworI2RlZmluZSBQSE9ORV9DQVBBQklMSVRJRVMgICAgICAgICAgICAgIF9JTyAgKCdxJywgMHg4MCkKKyNkZWZpbmUgUEhPTkVfQ0FQQUJJTElUSUVTX0xJU1QgICAgICAgICBfSU9SICgncScsIDB4ODEsIHN0cnVjdCBwaG9uZV9jYXBhYmlsaXR5ICopCisjZGVmaW5lIFBIT05FX0NBUEFCSUxJVElFU19DSEVDSyAgICAgICAgX0lPVyAoJ3EnLCAweDgyLCBzdHJ1Y3QgcGhvbmVfY2FwYWJpbGl0eSAqKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNoYXIgbW9udGhbM107CisgICAgICAgIGNoYXIgZGF5WzNdOworICAgICAgICBjaGFyIGhvdXJbM107CisgICAgICAgIGNoYXIgbWluWzNdOworICAgICAgICBpbnQgbnVtbGVuOworICAgICAgICBjaGFyIG51bWJlclsxMV07CisgICAgICAgIGludCBuYW1lbGVuOworICAgICAgICBjaGFyIG5hbWVbODBdOworfSBQSE9ORV9DSUQ7CisgCisjZGVmaW5lIFBIT05FX1JJTkcJCQlfSU8gICgncScsIDB4ODMpCisjZGVmaW5lIFBIT05FX0hPT0tTVEFURQkJCV9JTyAgKCdxJywgMHg4NCkKKyNkZWZpbmUgUEhPTkVfTUFYUklOR1MJCQlfSU9XICgncScsIDB4ODUsIGNoYXIpCisjZGVmaW5lIFBIT05FX1JJTkdfQ0FERU5DRQkJX0lPVyAoJ3EnLCAweDg2LCBzaG9ydCkKKyNkZWZpbmUgT0xEX1BIT05FX1JJTkdfU1RBUlQgICAgICAgICAgICBfSU8gICgncScsIDB4ODcpCisjZGVmaW5lIFBIT05FX1JJTkdfU1RBUlQJCV9JT1cgKCdxJywgMHg4NywgUEhPTkVfQ0lEICopCisjZGVmaW5lIFBIT05FX1JJTkdfU1RPUAkJCV9JTyAgKCdxJywgMHg4OCkKKworI2RlZmluZSBVU0FfUklOR19DQURFTkNFCSAweEMwQzAKKworI2RlZmluZSBQSE9ORV9SRUNfQ09ERUMJCQlfSU9XICgncScsIDB4ODksIGludCkKKyNkZWZpbmUgUEhPTkVfUkVDX1NUQVJUCQkJX0lPICAoJ3EnLCAweDhBKQorI2RlZmluZSBQSE9ORV9SRUNfU1RPUAkJCV9JTyAgKCdxJywgMHg4QikKKyNkZWZpbmUgUEhPTkVfUkVDX0RFUFRICQkJX0lPVyAoJ3EnLCAweDhDLCBpbnQpCisjZGVmaW5lIFBIT05FX0ZSQU1FCQkJX0lPVyAoJ3EnLCAweDhELCBpbnQpCisjZGVmaW5lIFBIT05FX1JFQ19WT0xVTUUJCV9JT1cgKCdxJywgMHg4RSwgaW50KQorI2RlZmluZSBQSE9ORV9SRUNfVk9MVU1FX0xJTkVBUgkJX0lPVyAoJ3EnLCAweERCLCBpbnQpCisjZGVmaW5lIFBIT05FX1JFQ19MRVZFTAkJCV9JTyAgKCdxJywgMHg4RikKKworI2RlZmluZSBQSE9ORV9QTEFZX0NPREVDCQlfSU9XICgncScsIDB4OTAsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9TVEFSVAkJX0lPICAoJ3EnLCAweDkxKQorI2RlZmluZSBQSE9ORV9QTEFZX1NUT1AJCQlfSU8gICgncScsIDB4OTIpCisjZGVmaW5lIFBIT05FX1BMQVlfREVQVEgJCV9JT1cgKCdxJywgMHg5MywgaW50KQorI2RlZmluZSBQSE9ORV9QTEFZX1ZPTFVNRQkJX0lPVyAoJ3EnLCAweDk0LCBpbnQpCisjZGVmaW5lIFBIT05FX1BMQVlfVk9MVU1FX0xJTkVBUglfSU9XICgncScsIDB4REMsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9MRVZFTAkJX0lPICAoJ3EnLCAweDk1KQorI2RlZmluZSBQSE9ORV9EVE1GX1JFQURZCQlfSU9SICgncScsIDB4OTYsIGludCkKKyNkZWZpbmUgUEhPTkVfR0VUX0RUTUYJCQlfSU9SICgncScsIDB4OTcsIGludCkKKyNkZWZpbmUgUEhPTkVfR0VUX0RUTUZfQVNDSUkJCV9JT1IgKCdxJywgMHg5OCwgaW50KQorI2RlZmluZSBQSE9ORV9EVE1GX09PQgkJCV9JT1cgKCdxJywgMHg5OSwgaW50KQorI2RlZmluZSBQSE9ORV9FWENFUFRJT04JCQlfSU9SICgncScsIDB4OUEsIGludCkKKyNkZWZpbmUgUEhPTkVfUExBWV9UT05FCQkJX0lPVyAoJ3EnLCAweDlCLCBjaGFyKQorI2RlZmluZSBQSE9ORV9TRVRfVE9ORV9PTl9USU1FCQlfSU9XICgncScsIDB4OUMsIGludCkKKyNkZWZpbmUgUEhPTkVfU0VUX1RPTkVfT0ZGX1RJTUUJCV9JT1cgKCdxJywgMHg5RCwgaW50KQorI2RlZmluZSBQSE9ORV9HRVRfVE9ORV9PTl9USU1FCQlfSU8gICgncScsIDB4OUUpCisjZGVmaW5lIFBIT05FX0dFVF9UT05FX09GRl9USU1FCQlfSU8gICgncScsIDB4OUYpCisjZGVmaW5lIFBIT05FX0dFVF9UT05FX1NUQVRFCQlfSU8gICgncScsIDB4QTApCisjZGVmaW5lIFBIT05FX0JVU1kJCQlfSU8gICgncScsIDB4QTEpCisjZGVmaW5lIFBIT05FX1JJTkdCQUNLCQkJX0lPICAoJ3EnLCAweEEyKQorI2RlZmluZSBQSE9ORV9ESUFMVE9ORQkJCV9JTyAgKCdxJywgMHhBMykKKyNkZWZpbmUgUEhPTkVfQ1BUX1NUT1AJCQlfSU8gICgncScsIDB4QTQpCisKKyNkZWZpbmUgUEhPTkVfUFNUTl9TRVRfU1RBVEUJCV9JT1cgKCdxJywgMHhBNCwgaW50KQorI2RlZmluZSBQSE9ORV9QU1ROX0dFVF9TVEFURQkJX0lPICAoJ3EnLCAweEE1KQorCisjZGVmaW5lIFBTVE5fT05fSE9PSwkJMAorI2RlZmluZSBQU1ROX1JJTkdJTkcJCTEKKyNkZWZpbmUgUFNUTl9PRkZfSE9PSwkJMgorI2RlZmluZSBQU1ROX1BVTFNFX0RJQUwJCTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhlIHdpbmsgZHVyYXRpb24gaXMgdHVuYWJsZSB3aXRoIHRoaXMgaW9jdGwuICBUaGUgZGVmYXVsdCB3aW5rIGR1cmF0aW9uICAKKyogaXMgMzIwbXMuICBZb3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgaW9jdGwgaWYgeW91IGRvIG5vdCByZXF1aXJlIGEKKyogZGlmZmVyZW50IHdpbmsgZHVyYXRpb24uCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSE9ORV9XSU5LX0RVUkFUSU9OCQlfSU9XICgncScsIDB4QTYsIGludCkKKyNkZWZpbmUgUEhPTkVfV0lOSwkJCV9JT1cgKCdxJywgMHhBQSwgaW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAorKiAgQ29kZWMgRGVmaW5pdGlvbnMKKyogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCUc3MjNfNjMgPSAxLAorCUc3MjNfNTMgPSAyLAorCVRTODUgPSAzLAorCVRTNDggPSA0LAorCVRTNDEgPSA1LAorCUc3MjggPSA2LAorCUc3MjkgPSA3LAorCVVMQVcgPSA4LAorCUFMQVcgPSA5LAorCUxJTkVBUjE2ID0gMTAsCisJTElORUFSOCA9IDExLAorCVdTUyA9IDEyLAorCUc3MjlCID0gMTMKK30gcGhvbmVfY29kZWM7CisKK3N0cnVjdCBwaG9uZV9jb2RlY19kYXRhCit7CisgICAgICAgIHBob25lX2NvZGVjIHR5cGU7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGJ1Zl9taW4sIGJ1Zl9vcHQsIGJ1Zl9tYXg7Cit9OworCisjZGVmaW5lIFBIT05FX1FVRVJZX0NPREVDICAgICAgICAgICAgICAgX0lPV1IgKCdxJywgMHhBNywgc3RydWN0IHBob25lX2NvZGVjX2RhdGEgKikKKyNkZWZpbmUgUEhPTkVfUFNUTl9MSU5FVEVTVCAgICAgICAgICAgICBfSU8gKCdxJywgMHhBOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogVGhpcyBjb250cm9scyB0aGUgVkFEL0NORyBmdW5jdGlvbmFsaXR5IG9mIEcuNzIzLjEuICBUaGUgZHJpdmVyIHdpbGwKKyogYWx3YXlzIHBhc3MgZnVsbCBzaXplIGZyYW1lcywgYW55IHVudXNlZCBieXRlcyB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zLAorKiBhbmQgZnJhbWVzIHBhc3NlZCB0byB0aGUgZHJpdmVyIHNob3VsZCBhbHNvIGJlIHBhZGRlZCB3aXRoIHplcm9zLiAgVGhlCisqIGZyYW1lIHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgdHdvIGJpdHMgb2YgdGhlIGZpcnN0CisqIFdPUkQgb2YgdGhlIGZyYW1lIGFzIGZvbGxvd3M6CisqCisqIGJpdHMgMS0wCUZyYW1lIFR5cGUJRGF0YSBSYXRlCQlTaWduaWZpY2FudCBXb3JkcworKiAwMAkJMAkJRy43MjMuMSA2LjMJCTEyCisqIDAxCQkxCQlHLjcyMy4xIDUuMwkJMTAKKyogMTAJCTIJCVZBRC9DTkcJCQkgMgorKiAxMQkJMwkJUmVwZWF0IGxhc3QgQ05HCQkgMiBiaXRzCisqIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQSE9ORV9WQUQJCQlfSU9XICgncScsIDB4QTksIGludCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoZSBleGNlcHRpb24gc3RydWN0dXJlIGFsbG93cyB1cyB0byBtdWx0aXBsZXggbXVsdGlwbGUgZXZlbnRzIG9udG8gdGhlCisqIHNlbGVjdCgpIGV4Y2VwdGlvbiBzZXQuICBJZiBhbnkgb2YgdGhlc2UgZmxhZ3MgYXJlIHNldCBzZWxlY3QoKSB3aWxsCisqIHJldHVybiB3aXRoIGEgcG9zaXRpdmUgaW5kaWNhdGlvbiBvbiB0aGUgZXhjZXB0aW9uIHNldC4gIFRoZSBkdG1mX3JlYWR5CisqIGJpdCBpbmRpY2F0ZXMgaWYgdGhlcmUgaXMgZGF0YSB3YWl0aW5nIGluIHRoZSBEVE1GIGJ1ZmZlci4gIFRoZQorKiBob29rc3RhdGUgYml0IGlzIHNldCBpZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBob29rc3RhdGUgc3RhdHVzLCBpdCBkb2VzIG5vdAorKiBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaG9va3N3aXRjaC4gIFRoZSBwc3RuX3JpbmcgYml0CisqIGluZGljYXRlcyB0aGF0IHRoZSBEQUEgb24gYSBMaW5lSkFDSyBjYXJkIGhhcyBkZXRlY3RlZCByaW5nIHZvbHRhZ2Ugb24KKyogdGhlIFBTVE4gcG9ydC4gIFRoZSBjYWxsZXJfaWQgYml0IGluZGljYXRlcyB0aGF0IGNhbGxlcl9pZCBkYXRhIGhhcyBiZWVuCisqIHJlY2VpdmVkIGFuZCBpcyBhdmFpbGFibGUuICBUaGUgcHN0bl93aW5rIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgREFBIG9uCisqIHRoZSBMaW5lSkFDSyBoYXMgcmVjZWl2ZWQgYSB3aW5rIGZyb20gdGhlIHRlbGNvIHN3aXRjaC4gIFRoZSBmMCwgZjEsIGYyCisqIGFuZCBmMyBiaXRzIGluZGljYXRlIHRoYXQgdGhlIGZpbHRlciBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgZGV0ZWN0aW5nIHRoZQorKiBmcmVxdWVuY3kgcHJvZ3JhbW1lZCBpbnRvIHRoYXQgZmlsdGVyLgorKgorKiBUaGUgcmVtYWluaW5nIGJpdHMgc2hvdWxkIGJlIHNldCB0byB6ZXJvLiBUaGV5IHdpbGwgYmVjb21lIGRlZmluZWQgb3ZlciB0aW1lCisqIGZvciBvdGhlciBpbnRlcmZhY2UgY2FyZHMgYW5kIHRoZWlyIG5lZWRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHBob25lX2V4Y2VwdAoreworCXVuc2lnbmVkIGludCBkdG1mX3JlYWR5OjE7CisJdW5zaWduZWQgaW50IGhvb2tzdGF0ZToxOworCXVuc2lnbmVkIGludCBwc3RuX3Jpbmc6MTsKKwl1bnNpZ25lZCBpbnQgY2FsbGVyX2lkOjE7CisJdW5zaWduZWQgaW50IHBzdG5fd2luazoxOworCXVuc2lnbmVkIGludCBmMDoxOworCXVuc2lnbmVkIGludCBmMToxOworCXVuc2lnbmVkIGludCBmMjoxOworCXVuc2lnbmVkIGludCBmMzoxOworCXVuc2lnbmVkIGludCBmbGFzaDoxOworCXVuc2lnbmVkIGludCBmYzA6MTsKKwl1bnNpZ25lZCBpbnQgZmMxOjE7CisJdW5zaWduZWQgaW50IGZjMjoxOworCXVuc2lnbmVkIGludCBmYzM6MTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6MTg7Cit9OworCit1bmlvbiB0ZWxlcGhvbnlfZXhjZXB0aW9uIHsKKwlzdHJ1Y3QgcGhvbmVfZXhjZXB0IGJpdHM7CisJdW5zaWduZWQgaW50IGJ5dGVzOworfTsKKworCisjZW5kaWYJCS8qIFRFTEVQSE9OWV9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVybWlvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4NjYyOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGVybWlvcy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfTElOVVhfVEVSTUlPU19ICisjZGVmaW5lIF9MSU5VWF9URVJNSU9TX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3Rlcm1pb3MuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjU1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIF9MSU5VWF9USU1FX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisjaWZuZGVmIF9TVFJVQ1RfVElNRVNQRUMKKyNkZWZpbmUgX1NUUlVDVF9USU1FU1BFQworc3RydWN0IHRpbWVzcGVjIHsKKwl0aW1lX3QJdHZfc2VjOwkJLyogc2Vjb25kcyAqLworCWxvbmcJdHZfbnNlYzsJLyogbmFub3NlY29uZHMgKi8KK307CisjZW5kaWYKKworc3RydWN0IHRpbWV2YWwgeworCXRpbWVfdAkJdHZfc2VjOwkJLyogc2Vjb25kcyAqLworCXN1c2Vjb25kc190CXR2X3VzZWM7CS8qIG1pY3Jvc2Vjb25kcyAqLworfTsKKworc3RydWN0IHRpbWV6b25lIHsKKwlpbnQJdHpfbWludXRlc3dlc3Q7CS8qIG1pbnV0ZXMgd2VzdCBvZiBHcmVlbndpY2ggKi8KKwlpbnQJdHpfZHN0dGltZTsJLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLworfTsKKworCisjZGVmaW5lIE5GREJJVFMJCQlfX05GREJJVFMKKworI2RlZmluZSBGRF9TRVRTSVpFCQlfX0ZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUKGZkLGZkc2V0cCkJX19GRF9TRVQoZmQsZmRzZXRwKQorI2RlZmluZSBGRF9DTFIoZmQsZmRzZXRwKQlfX0ZEX0NMUihmZCxmZHNldHApCisjZGVmaW5lIEZEX0lTU0VUKGZkLGZkc2V0cCkJX19GRF9JU1NFVChmZCxmZHNldHApCisjZGVmaW5lIEZEX1pFUk8oZmRzZXRwKQkJX19GRF9aRVJPKGZkc2V0cCkKKworLyoKKyAqIE5hbWVzIG9mIHRoZSBpbnRlcnZhbCB0aW1lcnMsIGFuZCBzdHJ1Y3R1cmUKKyAqIGRlZmluaW5nIGEgdGltZXIgc2V0dGluZzoKKyAqLworI2RlZmluZQlJVElNRVJfUkVBTAkJMAorI2RlZmluZQlJVElNRVJfVklSVFVBTAkJMQorI2RlZmluZQlJVElNRVJfUFJPRgkJMgorCitzdHJ1Y3QgaXRpbWVyc3BlYyB7CisJc3RydWN0IHRpbWVzcGVjIGl0X2ludGVydmFsOwkvKiB0aW1lciBwZXJpb2QgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgaXRfdmFsdWU7CS8qIHRpbWVyIGV4cGlyYXRpb24gKi8KK307CisKK3N0cnVjdCBpdGltZXJ2YWwgeworCXN0cnVjdCB0aW1ldmFsIGl0X2ludGVydmFsOwkvKiB0aW1lciBpbnRlcnZhbCAqLworCXN0cnVjdCB0aW1ldmFsIGl0X3ZhbHVlOwkvKiBjdXJyZW50IHZhbHVlICovCit9OworCisvKgorICogVGhlIElEcyBvZiB0aGUgdmFyaW91cyBzeXN0ZW0gY2xvY2tzIChmb3IgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXJzKToKKyAqLworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMworCisvKgorICogVGhlIElEcyBvZiB2YXJpb3VzIGhhcmR3YXJlIGNsb2NrczoKKyAqLworI2RlZmluZSBDTE9DS19TR0lfQ1lDTEUJCQkxMAorI2RlZmluZSBNQVhfQ0xPQ0tTCQkJMTYKKyNkZWZpbmUgQ0xPQ0tTX01BU0sJCQkoQ0xPQ0tfUkVBTFRJTUUgfCBDTE9DS19NT05PVE9OSUMpCisjZGVmaW5lIENMT0NLU19NT05PCQkJQ0xPQ0tfTU9OT1RPTklDCisKKy8qCisgKiBUaGUgdmFyaW91cyBmbGFncyBmb3Igc2V0dGluZyBQT1NJWC4xYiBpbnRlcnZhbCB0aW1lcnM6CisgKi8KKyNkZWZpbmUgVElNRVJfQUJTVElNRQkJCTB4MDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkMzAyMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXMuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9MSU5VWF9USU1FU19ICisjZGVmaW5lIF9MSU5VWF9USU1FU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgdG1zIHsKKwljbG9ja190IHRtc191dGltZTsKKwljbG9ja190IHRtc19zdGltZTsKKwljbG9ja190IHRtc19jdXRpbWU7CisJY2xvY2tfdCB0bXNfY3N0aW1lOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWV4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzNGZlZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGltZXguaApAQCAtMCwwICsxLDE4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoYykgRGF2aWQgTC4gTWlsbHMgMTk5MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgICAgICoKKyAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgKgorICogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGUgICAqCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nICAgICAgICAgICoKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUgbm90IGJlIHVzZWQgaW4gICAgKgorICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSAgICAgICAqCisgKiB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSAgICoKKyAqIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgdGhpcyBzb2Z0d2FyZSBmb3IgYW55ICAgICAgKgorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1vZGlmaWNhdGlvbiBoaXN0b3J5IHRpbWV4LmgKKyAqCisgKiAyOSBEZWMgOTcJUnVzc2VsbCBLaW5nCisgKglNb3ZlZCBDTE9DS19USUNLX1JBVEUsIENMT0NLX1RJQ0tfRkFDVE9SIGFuZCBGSU5FVFVORSB0byBhc20vdGltZXguaAorICoJZm9yIEFSTSBtYWNoaW5lcworICoKKyAqICA5IEphbiA5NyAgICBBZHJpYW4gU3VuCisgKiAgICAgIFNoaWZ0ZWQgTEFUQ0ggZGVmaW5lIHRvIGFsbG93IGFjY2VzcyB0byBhbHBoYSBtYWNoaW5lcy4KKyAqCisgKiAyNiBTZXAgOTQJRGF2aWQgTC4gTWlsbHMKKyAqCUFkZGVkIGRlZmluZXMgZm9yIGh5YnJpZCBwaGFzZS9mcmVxdWVuY3ktbG9jayBsb29wLgorICoKKyAqIDE5IE1hciA5NAlEYXZpZCBMLiBNaWxscworICoJTW92ZWQgZGVmaW5lcyBmcm9tIGtlcm5lbCByb3V0aW5lcyB0byBoZWFkZXIgZmlsZSBhbmQgYWRkZWQgbmV3CisgKglkZWZpbmVzIGZvciBQUFMgcGhhc2UtbG9jayBsb29wLgorICoKKyAqIDIwIEZlYiA5NAlEYXZpZCBMLiBNaWxscworICoJUmV2aXNlZCBzdGF0dXMgY29kZXMgYW5kIHN0cnVjdHVyZXMgZm9yIGV4dGVybmFsIGNsb2NrIGFuZCBQUFMKKyAqCXNpZ25hbCBkaXNjaXBsaW5lLgorICoKKyAqIDI4IE5vdiA5MwlEYXZpZCBMLiBNaWxscworICoJQWRqdXN0ZWQgcGFyYW1ldGVycyB0byBpbXByb3ZlIHN0YWJpbGl0eSBhbmQgaW5jcmVhc2UgcG9sbAorICoJaW50ZXJ2YWwuCisgKgorICogMTcgU2VwIDkzICAgIERhdmlkIEwuIE1pbGxzCisgKiAgICAgIENyZWF0ZWQgZmlsZSAkTlRQL2luY2x1ZGUvc3lzL3RpbWV4LmgKKyAqIDA3IE9jdCA5MyAgICBUb3JzdGVuIER1d2UKKyAqICAgICAgRGVyaXZlZCBsaW51eC90aW1leC5oCisgKiAxOTk1LTA4LTEzICAgIFRvcnN0ZW4gRHV3ZQorICogICAgICBrZXJuZWwgUExMIHVwZGF0ZWQgdG8gMTk5NC0xMi0xMyBzcGVjcyAocmZjLTE1ODkpCisgKiAxOTk3LTA4LTMwICAgIFVscmljaCBXaW5kbAorICogICAgICBBZGRlZCBuZXcgY29uc3RhbnQgTlRQX1BIQVNFX0xJTUlUCisgKiAyMDA0LTA4LTEyICAgIENocmlzdG9waCBMYW1ldGVyCisgKiAgICAgIFJld29ya2VkIHRpbWUgaW50ZXJwb2xhdGlvbiBsb2dpYworICovCisjaWZuZGVmIF9MSU5VWF9USU1FWF9ICisjZGVmaW5lIF9MSU5VWF9USU1FWF9ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKworLyoKKyAqIFNISUZUX0tHIGFuZCBTSElGVF9LRiBlc3RhYmxpc2ggdGhlIGRhbXBpbmcgb2YgdGhlIFBMTCBhbmQgYXJlIGNob3NlbgorICogZm9yIGEgc2xpZ2h0bHkgdW5kZXJkYW1wZWQgY29udmVyZ2VuY2UgY2hhcmFjdGVyaXN0aWMuIFNISUZUX0tICisgKiBlc3RhYmxpc2hlcyB0aGUgZGFtcGluZyBvZiB0aGUgRkxMIGFuZCBpcyBjaG9zZW4gYnkgd2lzZG9tIGFuZCBibGFjaworICogYXJ0LgorICoKKyAqIE1BWFRDIGVzdGFibGlzaGVzIHRoZSBtYXhpbXVtIHRpbWUgY29uc3RhbnQgb2YgdGhlIFBMTC4gV2l0aCB0aGUKKyAqIFNISUZUX0tHIGFuZCBTSElGVF9LRiB2YWx1ZXMgZ2l2ZW4gYW5kIGEgdGltZSBjb25zdGFudCByYW5nZSBmcm9tCisgKiB6ZXJvIHRvIE1BWFRDLCB0aGUgUExMIHdpbGwgY29udmVyZ2UgaW4gMTUgbWludXRlcyB0byAxNiBob3VycywKKyAqIHJlc3BlY3RpdmVseS4KKyAqLworI2RlZmluZSBTSElGVF9QTEwJNAkvKiBQTEwgZnJlcXVlbmN5IGZhY3RvciAoc2hpZnQpICovCisjZGVmaW5lIFNISUZUX0ZMTAkyCS8qIEZMTCBmcmVxdWVuY3kgZmFjdG9yIChzaGlmdCkgKi8KKyNkZWZpbmUgTUFYVEMJCTEwCS8qIG1heGltdW0gdGltZSBjb25zdGFudCAoc2hpZnQpICovCisKKy8qCisgKiBUaGUgU0hJRlRfVVBEQVRFIGRlZmluZSBlc3RhYmxpc2hlcyB0aGUgZGVjaW1hbCBwb2ludCBvZiB0aGUKKyAqIHRpbWVfb2Zmc2V0IHZhcmlhYmxlIHdoaWNoIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgb2Zmc2V0IHdpdGgKKyAqIHJlc3BlY3QgdG8gc3RhbmRhcmQgdGltZS4KKyAqCisgKiBTSElGVF9VU0VDIGRlZmluZXMgdGhlIHNjYWxpbmcgKHNoaWZ0KSBvZiB0aGUgdGltZV9mcmVxIGFuZAorICogdGltZV90b2xlcmFuY2UgdmFyaWFibGVzLCB3aGljaCByZXByZXNlbnQgdGhlIGN1cnJlbnQgZnJlcXVlbmN5CisgKiBvZmZzZXQgYW5kIG1heGltdW0gZnJlcXVlbmN5IHRvbGVyYW5jZS4KKyAqLworI2RlZmluZSBTSElGVF9VUERBVEUgKFNISUZUX0haICsgMSkgLyogdGltZSBvZmZzZXQgc2NhbGUgKHNoaWZ0KSAqLworI2RlZmluZSBTSElGVF9VU0VDIDE2CQkvKiBmcmVxdWVuY3kgb2Zmc2V0IHNjYWxlIChzaGlmdCkgKi8KKyNkZWZpbmUgU0hJRlRfTlNFQyAxMgkJLyoga2VybmVsIGZyZXF1ZW5jeSBvZmZzZXQgc2NhbGUgKi8KKworI2RlZmluZSBNQVhQSEFTRSA1MTIwMDBMICAgICAgICAvKiBtYXggcGhhc2UgZXJyb3IgKHVzKSAqLworI2RlZmluZSBNQVhGUkVRICg1MTJMIDw8IFNISUZUX1VTRUMpICAvKiBtYXggZnJlcXVlbmN5IGVycm9yIChwcG0pICovCisjZGVmaW5lIE1BWEZSRVFfTlNFQyAoNTEyMDAwTCA8PCBTSElGVF9OU0VDKSAvKiBtYXggZnJlcXVlbmN5IGVycm9yIChwcGIpICovCisjZGVmaW5lIE1JTlNFQyAyNTYJCS8qIG1pbiBpbnRlcnZhbCBiZXR3ZWVuIHVwZGF0ZXMgKHMpICovCisjZGVmaW5lIE1BWFNFQyAyMDQ4CQkvKiBtYXggaW50ZXJ2YWwgYmV0d2VlbiB1cGRhdGVzIChzKSAqLworI2RlZmluZQlOVFBfUEhBU0VfTElNSVQJKE1BWFBIQVNFIDw8IDUpCS8qIGJleW9uZCBtYXguIGRpc3BlcnNpb24gKi8KKworLyoKKyAqIHN5c2NhbGwgaW50ZXJmYWNlIC0gdXNlZCAobWFpbmx5IGJ5IE5UUCBkYWVtb24pCisgKiB0byBkaXNjaXBsaW5lIGtlcm5lbCBjbG9jayBvc2NpbGxhdG9yCisgKi8KK3N0cnVjdCB0aW1leCB7CisJdW5zaWduZWQgaW50IG1vZGVzOwkvKiBtb2RlIHNlbGVjdG9yICovCisJbG9uZyBvZmZzZXQ7CQkvKiB0aW1lIG9mZnNldCAodXNlYykgKi8KKwlsb25nIGZyZXE7CQkvKiBmcmVxdWVuY3kgb2Zmc2V0IChzY2FsZWQgcHBtKSAqLworCWxvbmcgbWF4ZXJyb3I7CQkvKiBtYXhpbXVtIGVycm9yICh1c2VjKSAqLworCWxvbmcgZXN0ZXJyb3I7CQkvKiBlc3RpbWF0ZWQgZXJyb3IgKHVzZWMpICovCisJaW50IHN0YXR1czsJCS8qIGNsb2NrIGNvbW1hbmQvc3RhdHVzICovCisJbG9uZyBjb25zdGFudDsJCS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisJbG9uZyBwcmVjaXNpb247CQkvKiBjbG9jayBwcmVjaXNpb24gKHVzZWMpIChyZWFkIG9ubHkpICovCisJbG9uZyB0b2xlcmFuY2U7CQkvKiBjbG9jayBmcmVxdWVuY3kgdG9sZXJhbmNlIChwcG0pCisJCQkJICogKHJlYWQgb25seSkKKwkJCQkgKi8KKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOwkvKiAocmVhZCBvbmx5KSAqLworCWxvbmcgdGljazsJCS8qIChtb2RpZmllZCkgdXNlY3MgYmV0d2VlbiBjbG9jayB0aWNrcyAqLworCisJbG9uZyBwcHNmcmVxOyAgICAgICAgICAgLyogcHBzIGZyZXF1ZW5jeSAoc2NhbGVkIHBwbSkgKHJvKSAqLworCWxvbmcgaml0dGVyOyAgICAgICAgICAgIC8qIHBwcyBqaXR0ZXIgKHVzKSAocm8pICovCisJaW50IHNoaWZ0OyAgICAgICAgICAgICAgLyogaW50ZXJ2YWwgZHVyYXRpb24gKHMpIChzaGlmdCkgKHJvKSAqLworCWxvbmcgc3RhYmlsOyAgICAgICAgICAgIC8qIHBwcyBzdGFiaWxpdHkgKHNjYWxlZCBwcG0pIChybykgKi8KKwlsb25nIGppdGNudDsgICAgICAgICAgICAvKiBqaXR0ZXIgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworCWxvbmcgY2FsY250OyAgICAgICAgICAgIC8qIGNhbGlicmF0aW9uIGludGVydmFscyAocm8pICovCisJbG9uZyBlcnJjbnQ7ICAgICAgICAgICAgLyogY2FsaWJyYXRpb24gZXJyb3JzIChybykgKi8KKwlsb25nIHN0YmNudDsgICAgICAgICAgICAvKiBzdGFiaWxpdHkgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworCisJaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7CisJaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7CisJaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7Cit9OworCisvKgorICogTW9kZSBjb2RlcyAodGltZXgubW9kZSkKKyAqLworI2RlZmluZSBBREpfT0ZGU0VUCQkweDAwMDEJLyogdGltZSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX0ZSRVFVRU5DWQkJMHgwMDAyCS8qIGZyZXF1ZW5jeSBvZmZzZXQgKi8KKyNkZWZpbmUgQURKX01BWEVSUk9SCQkweDAwMDQJLyogbWF4aW11bSB0aW1lIGVycm9yICovCisjZGVmaW5lIEFESl9FU1RFUlJPUgkJMHgwMDA4CS8qIGVzdGltYXRlZCB0aW1lIGVycm9yICovCisjZGVmaW5lIEFESl9TVEFUVVMJCTB4MDAxMAkvKiBjbG9jayBzdGF0dXMgKi8KKyNkZWZpbmUgQURKX1RJTUVDT05TVAkJMHgwMDIwCS8qIHBsbCB0aW1lIGNvbnN0YW50ICovCisjZGVmaW5lIEFESl9USUNLCQkweDQwMDAJLyogdGljayB2YWx1ZSAqLworI2RlZmluZSBBREpfT0ZGU0VUX1NJTkdMRVNIT1QJMHg4MDAxCS8qIG9sZC1mYXNoaW9uZWQgYWRqdGltZSAqLworI2RlZmluZSBBREpfT0ZGU0VUX1NTX1JFQUQJMHhhMDAxICAvKiByZWFkLW9ubHkgYWRqdGltZSAqLworCisvKiB4bnRwIDMuNCBjb21wYXRpYmlsaXR5IG5hbWVzICovCisjZGVmaW5lIE1PRF9PRkZTRVQJQURKX09GRlNFVAorI2RlZmluZSBNT0RfRlJFUVVFTkNZCUFESl9GUkVRVUVOQ1kKKyNkZWZpbmUgTU9EX01BWEVSUk9SCUFESl9NQVhFUlJPUgorI2RlZmluZSBNT0RfRVNURVJST1IJQURKX0VTVEVSUk9SCisjZGVmaW5lIE1PRF9TVEFUVVMJQURKX1NUQVRVUworI2RlZmluZSBNT0RfVElNRUNPTlNUCUFESl9USU1FQ09OU1QKKyNkZWZpbmUgTU9EX0NMS0IJQURKX1RJQ0sKKyNkZWZpbmUgTU9EX0NMS0EJQURKX09GRlNFVF9TSU5HTEVTSE9UIC8qIDB4ODAwMCBpbiBvcmlnaW5hbCAqLworCisKKy8qCisgKiBTdGF0dXMgY29kZXMgKHRpbWV4LnN0YXR1cykKKyAqLworI2RlZmluZSBTVEFfUExMCQkweDAwMDEJLyogZW5hYmxlIFBMTCB1cGRhdGVzIChydykgKi8KKyNkZWZpbmUgU1RBX1BQU0ZSRVEJMHgwMDAyCS8qIGVuYWJsZSBQUFMgZnJlcSBkaXNjaXBsaW5lIChydykgKi8KKyNkZWZpbmUgU1RBX1BQU1RJTUUJMHgwMDA0CS8qIGVuYWJsZSBQUFMgdGltZSBkaXNjaXBsaW5lIChydykgKi8KKyNkZWZpbmUgU1RBX0ZMTAkJMHgwMDA4CS8qIHNlbGVjdCBmcmVxdWVuY3ktbG9jayBtb2RlIChydykgKi8KKworI2RlZmluZSBTVEFfSU5TCQkweDAwMTAJLyogaW5zZXJ0IGxlYXAgKHJ3KSAqLworI2RlZmluZSBTVEFfREVMCQkweDAwMjAJLyogZGVsZXRlIGxlYXAgKHJ3KSAqLworI2RlZmluZSBTVEFfVU5TWU5DCTB4MDA0MAkvKiBjbG9jayB1bnN5bmNocm9uaXplZCAocncpICovCisjZGVmaW5lIFNUQV9GUkVRSE9MRAkweDAwODAJLyogaG9sZCBmcmVxdWVuY3kgKHJ3KSAqLworCisjZGVmaW5lIFNUQV9QUFNTSUdOQUwJMHgwMTAwCS8qIFBQUyBzaWduYWwgcHJlc2VudCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNKSVRURVIJMHgwMjAwCS8qIFBQUyBzaWduYWwgaml0dGVyIGV4Y2VlZGVkIChybykgKi8KKyNkZWZpbmUgU1RBX1BQU1dBTkRFUgkweDA0MDAJLyogUFBTIHNpZ25hbCB3YW5kZXIgZXhjZWVkZWQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTRVJST1IJMHgwODAwCS8qIFBQUyBzaWduYWwgY2FsaWJyYXRpb24gZXJyb3IgKHJvKSAqLworCisjZGVmaW5lIFNUQV9DTE9DS0VSUgkweDEwMDAJLyogY2xvY2sgaGFyZHdhcmUgZmF1bHQgKHJvKSAqLworCisjZGVmaW5lIFNUQV9ST05MWSAoU1RBX1BQU1NJR05BTCB8IFNUQV9QUFNKSVRURVIgfCBTVEFfUFBTV0FOREVSIHwgXAorICAgIFNUQV9QUFNFUlJPUiB8IFNUQV9DTE9DS0VSUikgLyogcmVhZC1vbmx5IGJpdHMgKi8KKworLyoKKyAqIENsb2NrIHN0YXRlcyAodGltZV9zdGF0ZSkKKyAqLworI2RlZmluZSBUSU1FX09LCQkwCS8qIGNsb2NrIHN5bmNocm9uaXplZCwgbm8gbGVhcCBzZWNvbmQgKi8KKyNkZWZpbmUgVElNRV9JTlMJMQkvKiBpbnNlcnQgbGVhcCBzZWNvbmQgKi8KKyNkZWZpbmUgVElNRV9ERUwJMgkvKiBkZWxldGUgbGVhcCBzZWNvbmQgKi8KKyNkZWZpbmUgVElNRV9PT1AJMwkvKiBsZWFwIHNlY29uZCBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBUSU1FX1dBSVQJNAkvKiBsZWFwIHNlY29uZCBoYXMgb2NjdXJyZWQgKi8KKyNkZWZpbmUgVElNRV9FUlJPUgk1CS8qIGNsb2NrIG5vdCBzeW5jaHJvbml6ZWQgKi8KKyNkZWZpbmUgVElNRV9CQUQJVElNRV9FUlJPUiAvKiBidyBjb21wYXQgKi8KKworCisjZW5kaWYgLyogTElOVVhfVElNRVhfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aW9jbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aW9jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NTY4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Rpb2NsLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfTElOVVhfVElPQ0xfSAorI2RlZmluZSBfTElOVVhfVElPQ0xfSAorCisjZGVmaW5lIFRJT0NMX1NFVFNFTAkyCS8qIHNldCBhIHNlbGVjdGlvbiAqLworI2RlZmluZSAJVElPQ0xfU0VMQ0hBUgkwCS8qIHNlbGVjdCBjaGFyYWN0ZXJzICovCisjZGVmaW5lIAlUSU9DTF9TRUxXT1JECTEJLyogc2VsZWN0IHdob2xlIHdvcmRzICovCisjZGVmaW5lIAlUSU9DTF9TRUxMSU5FCTIJLyogc2VsZWN0IHdob2xlIGxpbmVzICovCisjZGVmaW5lIAlUSU9DTF9TRUxQT0lOVEVSCTMJLyogc2hvdyB0aGUgcG9pbnRlciAqLworI2RlZmluZSAJVElPQ0xfU0VMQ0xFQVIJNAkvKiBjbGVhciB2aXNpYmlsaXR5IG9mIHNlbGVjdGlvbiAqLworI2RlZmluZSAJVElPQ0xfU0VMTU9VU0VSRVBPUlQJMTYJLyogcmVwb3J0IGJlZ2lubmluZyBvZiBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgCVRJT0NMX1NFTEJVVFRPTk1BU0sJMTUJLyogYnV0dG9uIG1hc2sgZm9yIHJlcG9ydCAqLworLyogc2VsZWN0aW9uIGV4dGVudCAqLworc3RydWN0IHRpb2NsX3NlbGVjdGlvbiB7CisJdW5zaWduZWQgc2hvcnQgeHM7CS8qIFggc3RhcnQgKi8KKwl1bnNpZ25lZCBzaG9ydCB5czsJLyogWSBzdGFydCAqLworCXVuc2lnbmVkIHNob3J0IHhlOwkvKiBYIGVuZCAqLworCXVuc2lnbmVkIHNob3J0IHllOwkvKiBZIGVuZCAqLworCXVuc2lnbmVkIHNob3J0IHNlbF9tb2RlOwkvKiBzZWxlY3Rpb24gbW9kZSAqLworfTsKKworI2RlZmluZSBUSU9DTF9QQVNURVNFTAkzCS8qIHBhc3RlIHByZXZpb3VzIHNlbGVjdGlvbiAqLworI2RlZmluZSBUSU9DTF9VTkJMQU5LU0NSRUVOCTQJLyogdW5ibGFuayBzY3JlZW4gKi8KKworI2RlZmluZSBUSU9DTF9TRUxMT0FETFVUCTUKKwkvKiBzZXQgY2hhcmFjdGVycyB0byBiZSBjb25zaWRlcmVkIGFscGhhYmV0aWMgd2hlbiBzZWxlY3RpbmcgKi8KKwkvKiB1MzJbOF0gYml0IGFycmF5LCA0IGJ5dGVzLWFsaWduZWQgd2l0aCB0eXBlICovCisKKy8qIHRoZXNlIHR3byBkb24ndCByZXR1cm4gYSB2YWx1ZTogdGhleSB3cml0ZSBpdCBiYWNrIGluIHRoZSB0eXBlICovCisjZGVmaW5lIFRJT0NMX0dFVFNISUZUU1RBVEUJNgkvKiB3cml0ZSBzaGlmdCBzdGF0ZSAqLworI2RlZmluZSBUSU9DTF9HRVRNT1VTRVJFUE9SVElORwk3CS8qIHdyaXRlIHdoZXRoZXIgbW91c2UgZXZlbnQgYXJlIHJlcG9ydGVkICovCisjZGVmaW5lIFRJT0NMX1NFVFZFU0FCTEFOSwkxMAkvKiBzZXQgdmVzYSBibGFua2luZyBtb2RlICovCisjZGVmaW5lIFRJT0NMX1NFVEtNU0dSRURJUkVDVAkxMQkvKiByZXN0cmljdCBrZXJuZWwgbWVzc2FnZXMgdG8gYSB2dCAqLworI2RlZmluZSBUSU9DTF9HRVRGR0NPTlNPTEUJMTIJLyogZ2V0IGZvcmVncm91bmQgdnQgKi8KKyNkZWZpbmUgVElPQ0xfU0NST0xMQ09OU09MRQkxMwkvKiBzY3JvbGwgY29uc29sZSAqLworI2RlZmluZSBUSU9DTF9CTEFOS1NDUkVFTgkxNAkvKiBrZWVwIHNjcmVlbiBibGFuayBldmVuIGlmIGEga2V5IGlzIHByZXNzZWQgKi8KKyNkZWZpbmUgVElPQ0xfQkxBTktFRFNDUkVFTgkxNQkvKiByZXR1cm4gd2hpY2ggdnQgd2FzIGJsYW5rZWQgKi8KKyNkZWZpbmUgVElPQ0xfR0VUS01TR1JFRElSRUNUCTE3CS8qIGdldCB0aGUgdnQgdGhlIGtlcm5lbCBtZXNzYWdlcyBhcmUgcmVzdHJpY3RlZCB0byAqLworCisjZW5kaWYgLyogX0xJTlVYX1RJT0NMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlwYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90aXBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmMDI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlwYy5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogaW5jbHVkZS9saW51eC90aXBjLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBzb2NrZXQgaW50ZXJmYWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RJUENfSF8KKyNkZWZpbmUgX0xJTlVYX1RJUENfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBUSVBDIGFkZHJlc3NpbmcgcHJpbWl0aXZlcworICovCisgCitzdHJ1Y3QgdGlwY19wb3J0aWQgeworCV9fdTMyIHJlZjsKKwlfX3UzMiBub2RlOworfTsKKworc3RydWN0IHRpcGNfbmFtZSB7CisJX191MzIgdHlwZTsKKwlfX3UzMiBpbnN0YW5jZTsKK307CisKK3N0cnVjdCB0aXBjX25hbWVfc2VxIHsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGxvd2VyOworCV9fdTMyIHVwcGVyOworfTsKKworc3RhdGljIF9faW5saW5lX18gX191MzIgdGlwY19hZGRyKHVuc2lnbmVkIGludCB6b25lLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNsdXN0ZXIsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4gKHpvbmUgPDwgMjQpIHwgKGNsdXN0ZXIgPDwgMTIpIHwgbm9kZTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHRpcGNfem9uZShfX3UzMiBhZGRyKQoreworCXJldHVybiBhZGRyID4+IDI0OworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgdGlwY19jbHVzdGVyKF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIChhZGRyID4+IDEyKSAmIDB4ZmZmOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgdGlwY19ub2RlKF9fdTMyIGFkZHIpCit7CisJcmV0dXJuIGFkZHIgJiAweGZmZjsKK30KKworLyoKKyAqIEFwcGxpY2F0aW9uLWFjY2Vzc2libGUgcG9ydCBuYW1lIHR5cGVzCisgKi8KKworI2RlZmluZSBUSVBDX0NGR19TUlYJCTAJLyogY29uZmlndXJhdGlvbiBzZXJ2aWNlIG5hbWUgdHlwZSAqLworI2RlZmluZSBUSVBDX1RPUF9TUlYJCTEJLyogdG9wb2xvZ3kgc2VydmljZSBuYW1lIHR5cGUgKi8KKyNkZWZpbmUgVElQQ19SRVNFUlZFRF9UWVBFUwk2NAkvKiBsb3dlc3QgdXNlci1wdWJsaXNoYWJsZSBuYW1lIHR5cGUgKi8KKworLyogCisgKiBQdWJsaWNhdGlvbiBzY29wZXMgd2hlbiBiaW5kaW5nIHBvcnQgbmFtZXMgYW5kIHBvcnQgbmFtZSBzZXF1ZW5jZXMKKyAqLworCisjZGVmaW5lIFRJUENfWk9ORV9TQ09QRQkJMQorI2RlZmluZSBUSVBDX0NMVVNURVJfU0NPUEUJMgorI2RlZmluZSBUSVBDX05PREVfU0NPUEUJCTMKKworLyoKKyAqIExpbWl0aW5nIHZhbHVlcyBmb3IgbWVzc2FnZXMKKyAqLworCisjZGVmaW5lIFRJUENfTUFYX1VTRVJfTVNHX1NJWkUJNjYwMDAKKworLyoKKyAqIE1lc3NhZ2UgaW1wb3J0YW5jZSBsZXZlbHMKKyAqLworCisjZGVmaW5lIFRJUENfTE9XX0lNUE9SVEFOQ0UJCTAgIC8qIGRlZmF1bHQgKi8KKyNkZWZpbmUgVElQQ19NRURJVU1fSU1QT1JUQU5DRQkJMQorI2RlZmluZSBUSVBDX0hJR0hfSU1QT1JUQU5DRQkJMgorI2RlZmluZSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UJMworCisvKiAKKyAqIE1zZyByZWplY3Rpb24vY29ubmVjdGlvbiBzaHV0ZG93biByZWFzb25zCisgKi8KKworI2RlZmluZSBUSVBDX09LCQkJMAorI2RlZmluZSBUSVBDX0VSUl9OT19OQU1FCTEKKyNkZWZpbmUgVElQQ19FUlJfTk9fUE9SVAkyCisjZGVmaW5lIFRJUENfRVJSX05PX05PREUJMworI2RlZmluZSBUSVBDX0VSUl9PVkVSTE9BRAk0CisjZGVmaW5lIFRJUENfQ09OTl9TSFVURE9XTgk1CisKKy8qCisgKiBUSVBDIHRvcG9sb2d5IHN1YnNjcmlwdGlvbiBzZXJ2aWNlIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBUSVBDX1NVQl9QT1JUUyAgICAgCTB4MDEgIAkvKiBmaWx0ZXIgZm9yIHBvcnQgYXZhaWxhYmlsaXR5ICovCisjZGVmaW5lIFRJUENfU1VCX1NFUlZJQ0UgICAgIAkweDAyICAJLyogZmlsdGVyIGZvciBzZXJ2aWNlIGF2YWlsYWJpbGl0eSAqLworI2RlZmluZSBUSVBDX1NVQl9DQU5DRUwgICAgICAgICAweDA0ICAgIC8qIGNhbmNlbCBhIHN1YnNjcmlwdGlvbiAqLworI2lmIDAKKy8qIFRoZSBmb2xsb3dpbmcgZmlsdGVyIG9wdGlvbnMgYXJlIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgVElQQ19TVUJfTk9fQklORF9FVlRTCTB4MDQJLyogZmlsdGVyIG91dCAicHVibGlzaCIgZXZlbnRzICovCisjZGVmaW5lIFRJUENfU1VCX05PX1VOQklORF9FVlRTCTB4MDgJLyogZmlsdGVyIG91dCAid2l0aGRyYXciIGV2ZW50cyAqLworI2RlZmluZSBUSVBDX1NVQl9TSU5HTEVfRVZUCTB4MTAJLyogZXhwaXJlIGFmdGVyIGZpcnN0IGV2ZW50ICovCisjZW5kaWYKKworI2RlZmluZSBUSVBDX1dBSVRfRk9SRVZFUgl+MAkvKiB0aW1lb3V0IGZvciBwZXJtYW5lbnQgc3Vic2NyaXB0aW9uICovCisKK3N0cnVjdCB0aXBjX3N1YnNjciB7CisJc3RydWN0IHRpcGNfbmFtZV9zZXEgc2VxOwkvKiBuYW1lIHNlcXVlbmNlIG9mIGludGVyZXN0ICovCisJX191MzIgdGltZW91dDsJCQkvKiBzdWJzY3JpcHRpb24gZHVyYXRpb24gKGluIG1zKSAqLworICAgICAgICBfX3UzMiBmaWx0ZXI7ICAgCQkvKiBiaXRtYXNrIG9mIGZpbHRlciBvcHRpb25zICovCisJY2hhciB1c3JfaGFuZGxlWzhdOwkJLyogYXZhaWxhYmxlIGZvciBzdWJzY3JpYmVyIHVzZSAqLworfTsKKworI2RlZmluZSBUSVBDX1BVQkxJU0hFRAkJMQkvKiBwdWJsaWNhdGlvbiBldmVudCAqLworI2RlZmluZSBUSVBDX1dJVEhEUkFXTgkJMgkvKiB3aXRoZHJhdyBldmVudCAqLworI2RlZmluZSBUSVBDX1NVQlNDUl9USU1FT1VUCTMJLyogc3Vic2NyaXB0aW9uIHRpbWVvdXQgZXZlbnQgKi8KKworc3RydWN0IHRpcGNfZXZlbnQgeworCV9fdTMyIGV2ZW50OwkJCS8qIGV2ZW50IHR5cGUgKi8KKwlfX3UzMiBmb3VuZF9sb3dlcjsJCS8qIG1hdGNoaW5nIG5hbWUgc2VxIGluc3RhbmNlcyAqLworCV9fdTMyIGZvdW5kX3VwcGVyOwkJLyogICAgIiAgICAgICIgICAgIiAgICAgIiAgICAgICovCisJc3RydWN0IHRpcGNfcG9ydGlkIHBvcnQ7CS8qIGFzc29jaWF0ZWQgcG9ydCAqLworCXN0cnVjdCB0aXBjX3N1YnNjciBzOwkJLyogYXNzb2NpYXRlZCBzdWJzY3JpcHRpb24gKi8KK307CisKKy8qCisgKiBTb2NrZXQgQVBJCisgKi8KKworI2lmbmRlZiBBRl9USVBDCisjZGVmaW5lIEFGX1RJUEMJCTMwCisjZW5kaWYKKworI2lmbmRlZiBQRl9USVBDCisjZGVmaW5lIFBGX1RJUEMJCUFGX1RJUEMKKyNlbmRpZgorCisjaWZuZGVmIFNPTF9USVBDCisjZGVmaW5lIFNPTF9USVBDCTI3MQorI2VuZGlmCisKKyNkZWZpbmUgVElQQ19BRERSX05BTUVTRVEJMQorI2RlZmluZSBUSVBDX0FERFJfTUNBU1QJCTEKKyNkZWZpbmUgVElQQ19BRERSX05BTUUJCTIKKyNkZWZpbmUgVElQQ19BRERSX0lECQkzCisKK3N0cnVjdCBzb2NrYWRkcl90aXBjIHsKKwl1bnNpZ25lZCBzaG9ydCBmYW1pbHk7CisJdW5zaWduZWQgY2hhciAgYWRkcnR5cGU7CisJc2lnbmVkICAgY2hhciAgc2NvcGU7CisJdW5pb24geworCQlzdHJ1Y3QgdGlwY19wb3J0aWQgaWQ7CisJCXN0cnVjdCB0aXBjX25hbWVfc2VxIG5hbWVzZXE7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgdGlwY19uYW1lIG5hbWU7CisJCQlfX3UzMiBkb21haW47IC8qIDA6IG93biB6b25lICovCisJCX0gbmFtZTsKKwl9IGFkZHI7Cit9OworCisvKgorICogQW5jaWxsYXJ5IGRhdGEgb2JqZWN0cyBzdXBwb3J0ZWQgYnkgcmVjdm1zZygpCisgKi8KKworI2RlZmluZSBUSVBDX0VSUklORk8JMQkvKiBlcnJvciBpbmZvICovCisjZGVmaW5lIFRJUENfUkVUREFUQQkyCS8qIHJldHVybmVkIGRhdGEgKi8KKyNkZWZpbmUgVElQQ19ERVNUTkFNRQkzCS8qIGRlc3RpbmF0aW9uIG5hbWUgKi8KKworLyoKKyAqIFRJUEMtc3BlY2lmaWMgc29ja2V0IG9wdGlvbiB2YWx1ZXMKKyAqLworCisjZGVmaW5lIFRJUENfSU1QT1JUQU5DRQkJMTI3CS8qIERlZmF1bHQ6IFRJUENfTE9XX0lNUE9SVEFOQ0UgKi8KKyNkZWZpbmUgVElQQ19TUkNfRFJPUFBBQkxFCTEyOAkvKiBEZWZhdWx0OiAwIChyZXNlbmQgY29uZ2VzdGVkIG1zZykgKi8KKyNkZWZpbmUgVElQQ19ERVNUX0RST1BQQUJMRQkxMjkJLyogRGVmYXVsdDogYmFzZWQgb24gc29ja2V0IHR5cGUgKi8KKyNkZWZpbmUgVElQQ19DT05OX1RJTUVPVVQJMTMwCS8qIERlZmF1bHQ6IDgwMDAgKG1zKSAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3RpcGNfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4Y2U2OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdGlwY19jb25maWcuaApAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgvdGlwY19jb25maWcuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCisgKiAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA2LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX0xJTlVYX1RJUENfQ09ORklHX0hfCisjZGVmaW5lIF9MSU5VWF9USVBDX0NPTkZJR19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBDb25maWd1cmF0aW9uCisgKgorICogQWxsIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBtZXNzYWdpbmcgaW52b2x2ZXMgc2VuZGluZyBhIHJlcXVlc3QgbWVzc2FnZQorICogdG8gdGhlIFRJUEMgY29uZmlndXJhdGlvbiBzZXJ2aWNlIG9uIGEgbm9kZSwgd2hpY2ggc2VuZHMgYSByZXBseSBtZXNzYWdlCisgKiBiYWNrLiAgKEluIHRoZSBmdXR1cmUgbXVsdGktbWVzc2FnZSByZXBsaWVzIG1heSBiZSBzdXBwb3J0ZWQuKQorICoKKyAqIEJvdGggcmVxdWVzdCBhbmQgcmVwbHkgbWVzc2FnZXMgY29uc2lzdCBvZiBhIHRyYW5zcG9ydCBoZWFkZXIgYW5kIHBheWxvYWQuCisgKiBUaGUgdHJhbnNwb3J0IGhlYWRlciBjb250YWlucyBpbmZvIGFib3V0IHRoZSBkZXNpcmVkIG9wZXJhdGlvbjsKKyAqIHRoZSBwYXlsb2FkIGNvbnNpc3RzIG9mIHplcm8gb3IgbW9yZSB0eXBlL2xlbmd0aC92YWx1ZSAoVExWKSBpdGVtcworICogd2hpY2ggc3BlY2lmeSBwYXJhbWV0ZXJzIG9yIHJlc3VsdHMgZm9yIHRoZSBvcGVyYXRpb24uCisgKgorICogRm9yIG1hbnkgb3BlcmF0aW9ucywgdGhlIHJlcXVlc3QgYW5kIHJlcGx5IG1lc3NhZ2VzIGhhdmUgYSBmaXhlZCBudW1iZXIKKyAqIG9mIFRMVnMgKHVzdWFsbHkgemVybyBvciBvbmUpOyBob3dldmVyLCBzb21lIHJlcGx5IG1lc3NhZ2VzIG1heSByZXR1cm4gCisgKiBhIHZhcmlhYmxlIG51bWJlciBvZiBUTFZzLiAgQSBmYWlsZWQgcmVxdWVzdCBpcyBkZW5vdGVkIGJ5IHRoZSBwcmVzZW5jZQorICogb2YgYW4gImVycm9yIHN0cmluZyIgVExWIGluIHRoZSByZXBseSBtZXNzYWdlIGluc3RlYWQgb2YgdGhlIFRMVihzKSB0aGUKKyAqIHJlcGx5IHNob3VsZCBjb250YWluIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgorICovCisgCisvKiAKKyAqIFB1YmxpYyBjb21tYW5kczoKKyAqIE1heSBiZSBpc3N1ZWQgYnkgYW55IHByb2Nlc3MuCisgKiBBY2NlcHRlZCBieSBvd24gbm9kZSwgb3IgYnkgcmVtb3RlIG5vZGUgb25seSBpZiByZW1vdGUgbWFuYWdlbWVudCBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKyAKKyNkZWZpbmUgIFRJUENfQ01EX05PT1AgICAJICAgIDB4MDAwMCAgICAvKiB0eCBub25lLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTk9ERVMgICAgICAgICAweDAwMDEgICAgLyogdHggbmV0X2FkZHIsIHJ4IG5vZGVfaW5mbyhzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01FRElBX05BTUVTICAgMHgwMDAyICAgIC8qIHR4IG5vbmUsIHJ4IG1lZGlhX25hbWUocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9CRUFSRVJfTkFNRVMgIDB4MDAwMyAgICAvKiB0eCBub25lLCByeCBiZWFyZXJfbmFtZShzKSAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX0xJTktTICAgICAgICAgMHgwMDA0ICAgIC8qIHR4IG5ldF9hZGRyLCByeCBsaW5rX2luZm8ocykgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfTkFNRV9UQUJMRSAgIDB4MDAwNSAgICAvKiB0eCBuYW1lX3RibF9xdWVyeSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX1BPUlRTICAgICAgICAweDAwMDYgICAgLyogdHggbm9uZSwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9TSE9XX0xJTktfU1RBVFMgICAweDAwMEIgICAgLyogdHggbGlua19uYW1lLCByeCB1bHRyYV9zdHJpbmcgKi8KKworI2lmIDAKKyNkZWZpbmUgIFRJUENfQ01EX1NIT1dfUE9SVF9TVEFUUyAgIDB4MDAwOCAgICAvKiB0eCBwb3J0X3JlZiwgcnggdWx0cmFfc3RyaW5nICovCisjZGVmaW5lICBUSVBDX0NNRF9SRVNFVF9QT1JUX1NUQVRTICAweDAwMDkgICAgLyogdHggcG9ydF9yZWYsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9ST1VURVMgICAgICAgIDB4MDAwQSAgICAvKiB0eCA/LCByeCA/ICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTElOS19QRUVSICAgICAweDAwMEQgICAgLyogdHggbGlua19uYW1lLCByeCA/ICovCisjZW5kaWYKKworLyogCisgKiBQcm90ZWN0ZWQgY29tbWFuZHM6CisgKiBNYXkgb25seSBiZSBpc3N1ZWQgYnkgIm5ldHdvcmsgYWRtaW5pc3RyYXRpb24gY2FwYWJsZSIgcHJvY2Vzcy4KKyAqIEFjY2VwdGVkIGJ5IG93biBub2RlLCBvciBieSByZW1vdGUgbm9kZSBvbmx5IGlmIHJlbW90ZSBtYW5hZ2VtZW50IGVuYWJsZWQKKyAqIGFuZCB0aGlzIG5vZGUgaXMgem9uZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKworI2RlZmluZSAgVElQQ19DTURfR0VUX1JFTU9URV9NTkcgICAgMHg0MDAzICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1BPUlRTICAgICAweDQwMDQgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfUFVCTCAgICAgIDB4NDAwNSAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9TVUJTQ1IgICAgMHg0MDA2ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1pPTkVTICAgICAweDQwMDcgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9NQVhfQ0xVU1RFUlMgIDB4NDAwOCAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworI2RlZmluZSAgVElQQ19DTURfR0VUX01BWF9OT0RFUyAgICAgMHg0MDA5ICAgIC8qIHR4IG5vbmUsIHJ4IHVuc2lnbmVkICovCisjZGVmaW5lICBUSVBDX0NNRF9HRVRfTUFYX1NMQVZFUyAgICAweDQwMEEgICAgLyogdHggbm9uZSwgcnggdW5zaWduZWQgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0dFVF9ORVRJRCAgICAgICAgIDB4NDAwQiAgICAvKiB0eCBub25lLCByeCB1bnNpZ25lZCAqLworCisjZGVmaW5lICBUSVBDX0NNRF9FTkFCTEVfQkVBUkVSICAgICAweDQxMDEgICAgLyogdHggYmVhcmVyX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfRElTQUJMRV9CRUFSRVIgICAgMHg0MTAyICAgIC8qIHR4IGJlYXJlcl9uYW1lLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTElOS19UT0wgICAgICAweDQxMDcgICAgLyogdHggbGlua19jb25maWcsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9MSU5LX1BSSSAgICAgIDB4NDEwOCAgICAvKiB0eCBsaW5rX2NvbmZpZywgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX0xJTktfV0lORE9XICAgMHg0MTA5ICAgIC8qIHR4IGxpbmtfY29uZmlnLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTE9HX1NJWkUgICAgICAweDQxMEEgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX0RVTVBfTE9HICAgICAgICAgIDB4NDEwQiAgICAvKiB0eCBub25lLCByeCB1bHRyYV9zdHJpbmcgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1JFU0VUX0xJTktfU1RBVFMgIDB4NDEwQyAgICAvKiB0eCBsaW5rX25hbWUsIHJ4IG5vbmUgKi8KKworI2lmIDAKKyNkZWZpbmUgIFRJUENfQ01EX0NSRUFURV9MSU5LICAgICAgIDB4NDEwMyAgICAvKiB0eCBsaW5rX2NyZWF0ZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfUkVNT1ZFX0xJTksgICAgICAgMHg0MTA0ICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfQkxPQ0tfTElOSyAgICAgICAgMHg0MTA1ICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfVU5CTE9DS19MSU5LICAgICAgMHg0MTA2ICAgIC8qIHR4IGxpbmtfbmFtZSwgcnggbm9uZSAqLworI2VuZGlmCisKKy8qIAorICogUHJpdmF0ZSBjb21tYW5kczoKKyAqIE1heSBvbmx5IGJlIGlzc3VlZCBieSAibmV0d29yayBhZG1pbmlzdHJhdGlvbiBjYXBhYmxlIiBwcm9jZXNzLgorICogQWNjZXB0ZWQgYnkgb3duIG5vZGUgb25seTsgY2Fubm90IGJlIHVzZWQgb24gYSByZW1vdGUgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgIAorICovCisKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9OT0RFX0FERFIgICAgIDB4ODAwMSAgICAvKiB0eCBuZXRfYWRkciwgcnggbm9uZSAqLworI2lmIDAKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9aT05FX01BU1RFUiAgIDB4ODAwMiAgICAvKiB0eCBub25lLCByeCBub25lICovCisjZW5kaWYKKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9SRU1PVEVfTU5HICAgIDB4ODAwMyAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9QT1JUUyAgICAgMHg4MDA0ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX1BVQkwgICAgICAweDgwMDUgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfU1VCU0NSICAgIDB4ODAwNiAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9aT05FUyAgICAgMHg4MDA3ICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTUFYX0NMVVNURVJTICAweDgwMDggICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKyNkZWZpbmUgIFRJUENfQ01EX1NFVF9NQVhfTk9ERVMgICAgIDB4ODAwOSAgICAvKiB0eCB1bnNpZ25lZCwgcnggbm9uZSAqLworI2RlZmluZSAgVElQQ19DTURfU0VUX01BWF9TTEFWRVMgICAgMHg4MDBBICAgIC8qIHR4IHVuc2lnbmVkLCByeCBub25lICovCisjZGVmaW5lICBUSVBDX0NNRF9TRVRfTkVUSUQgICAgICAgICAweDgwMEIgICAgLyogdHggdW5zaWduZWQsIHJ4IG5vbmUgKi8KKworLyoKKyAqIFRMViB0eXBlcyBkZWZpbmVkIGZvciBUSVBDCisgKi8KKworI2RlZmluZSBUSVBDX1RMVl9OT05FCQkwCS8qIG5vIFRMViBwcmVzZW50ICovCisjZGVmaW5lIFRJUENfVExWX1ZPSUQJCTEJLyogZW1wdHkgVExWICgwIGRhdGEgYnl0ZXMpKi8KKyNkZWZpbmUgVElQQ19UTFZfVU5TSUdORUQJMgkvKiAzMi1iaXQgaW50ZWdlciAqLworI2RlZmluZSBUSVBDX1RMVl9TVFJJTkcJCTMJLyogY2hhclsxMjhdIChtYXgpICovCisjZGVmaW5lIFRJUENfVExWX0xBUkdFX1NUUklORwk0CS8qIGNoYXJbMjA0OF0gKG1heCkgKi8KKyNkZWZpbmUgVElQQ19UTFZfVUxUUkFfU1RSSU5HCTUJLyogY2hhclszMjc2OF0gKG1heCkgKi8KKworI2RlZmluZSBUSVBDX1RMVl9FUlJPUl9TVFJJTkcJMTYJLyogY2hhclsxMjhdIGNvbnRhaW5pbmcgImVycm9yIGNvZGUiICovCisjZGVmaW5lIFRJUENfVExWX05FVF9BRERSICAgCTE3CS8qIDMyLWJpdCBpbnRlZ2VyIGRlbm90aW5nIDxaLkMuTj4gKi8KKyNkZWZpbmUgVElQQ19UTFZfTUVESUFfTkFNRQkxOAkvKiBjaGFyW1RJUENfTUFYX01FRElBX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX0JFQVJFUl9OQU1FCTE5CS8qIGNoYXJbVElQQ19NQVhfQkVBUkVSX05BTUVdICovCisjZGVmaW5lIFRJUENfVExWX0xJTktfTkFNRQkyMAkvKiBjaGFyW1RJUENfTUFYX0xJTktfTkFNRV0gKi8KKyNkZWZpbmUgVElQQ19UTFZfTk9ERV9JTkZPCTIxCS8qIHN0cnVjdCB0aXBjX25vZGVfaW5mbyAqLworI2RlZmluZSBUSVBDX1RMVl9MSU5LX0lORk8JMjIJLyogc3RydWN0IHRpcGNfbGlua19pbmZvICovCisjZGVmaW5lIFRJUENfVExWX0JFQVJFUl9DT05GSUcgIDIzCS8qIHN0cnVjdCB0aXBjX2JlYXJlcl9jb25maWcgKi8KKyNkZWZpbmUgVElQQ19UTFZfTElOS19DT05GSUcgICAgMjQJLyogc3RydWN0IHRpcGNfbGlua19jb25maWcgKi8KKyNkZWZpbmUgVElQQ19UTFZfTkFNRV9UQkxfUVVFUlkJMjUJLyogc3RydWN0IHRpcGNfbmFtZV90YWJsZV9xdWVyeSAqLworI2RlZmluZSBUSVBDX1RMVl9QT1JUX1JFRiAgIAkyNgkvKiAzMi1iaXQgcG9ydCByZWZlcmVuY2UgKi8KKworLyoKKyAqIE1heGltdW0gc2l6ZXMgb2YgVElQQyBiZWFyZXItcmVsYXRlZCBuYW1lcyAoaW5jbHVkaW5nIHRlcm1pbmF0aW5nIE5VTCkKKyAqLyAKKworI2RlZmluZSBUSVBDX01BWF9NRURJQV9OQU1FCTE2CS8qIGZvcm1hdCA9IG1lZGlhICovCisjZGVmaW5lIFRJUENfTUFYX0lGX05BTUUJMTYJLyogZm9ybWF0ID0gaW50ZXJmYWNlICovCisjZGVmaW5lIFRJUENfTUFYX0JFQVJFUl9OQU1FCTMyCS8qIGZvcm1hdCA9IG1lZGlhOmludGVyZmFjZSAqLworI2RlZmluZSBUSVBDX01BWF9MSU5LX05BTUUJNjAJLyogZm9ybWF0ID0gWi5DLk46aW50ZXJmYWNlLVouQy5OOmludGVyZmFjZSAqLworCisvKgorICogTGluayBwcmlvcml0eSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4LCBtZWRpYSBkZWZhdWx0KQorICovCisKKyNkZWZpbmUgVElQQ19NSU5fTElOS19QUkkJMAorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1BSSQkxMAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1BSSQkzMQorI2RlZmluZSBUSVBDX01FRElBX0xJTktfUFJJCShUSVBDX01BWF9MSU5LX1BSSSArIDEpCisKKy8qCisgKiBMaW5rIHRvbGVyYW5jZSBsaW1pdHMgKG1pbiwgZGVmYXVsdCwgbWF4KSwgaW4gbXMKKyAqLworCisjZGVmaW5lIFRJUENfTUlOX0xJTktfVE9MIDUwCisjZGVmaW5lIFRJUENfREVGX0xJTktfVE9MIDE1MDAKKyNkZWZpbmUgVElQQ19NQVhfTElOS19UT0wgMzAwMDAKKworLyoKKyAqIExpbmsgd2luZG93IGxpbWl0cyAobWluLCBkZWZhdWx0LCBtYXgpLCBpbiBwYWNrZXRzCisgKi8KKworI2RlZmluZSBUSVBDX01JTl9MSU5LX1dJTiAxNgorI2RlZmluZSBUSVBDX0RFRl9MSU5LX1dJTiA1MAorI2RlZmluZSBUSVBDX01BWF9MSU5LX1dJTiAxNTAKKworCitzdHJ1Y3QgdGlwY19ub2RlX2luZm8geworCV9fYmUzMiBhZGRyOwkJCS8qIG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlICovCisJX19iZTMyIHVwOwkJCS8qIDA9ZG93biwgMT0gdXAgKi8KK307CisKK3N0cnVjdCB0aXBjX2xpbmtfaW5mbyB7CisJX19iZTMyIGRlc3Q7CQkJLyogbmV0d29yayBhZGRyZXNzIG9mIHBlZXIgbm9kZSAqLworCV9fYmUzMiB1cDsJCQkvKiAwPWRvd24sIDE9dXAgKi8KKwljaGFyIHN0cltUSVBDX01BWF9MSU5LX05BTUVdOwkvKiBsaW5rIG5hbWUgKi8KK307CisKK3N0cnVjdCB0aXBjX2JlYXJlcl9jb25maWcgeworCV9fYmUzMiBwcmlvcml0eTsJCS8qIFJhbmdlIFsxLDMxXS4gT3ZlcnJpZGUgcGVyIGxpbmsgICovCisJX19iZTMyIGRldGVjdF9zY29wZTsKKwljaGFyIG5hbWVbVElQQ19NQVhfQkVBUkVSX05BTUVdOworfTsKKworc3RydWN0IHRpcGNfbGlua19jb25maWcgeworCV9fYmUzMiB2YWx1ZTsKKwljaGFyIG5hbWVbVElQQ19NQVhfTElOS19OQU1FXTsKK307CisKKyNkZWZpbmUgVElQQ19OVFFfQUxMVFlQRVMgMHg4MDAwMDAwMAorCitzdHJ1Y3QgdGlwY19uYW1lX3RhYmxlX3F1ZXJ5IHsKKwlfX2JlMzIgZGVwdGg7CS8qIDE6dHlwZSwgMjorbmFtZSBpbmZvLCAzOitwb3J0IGluZm8sIDQrOitkZWJ1ZyBpbmZvICovCisJX19iZTMyIHR5cGU7CS8qIHt0LGwsdX0gaW5mbyBpZ25vcmVkIGlmIGhpZ2ggYml0IG9mICJkZXB0aCIgaXMgc2V0ICovCisJX19iZTMyIGxvd2JvdW5kOyAvKiAoaS5lLiBkaXNwbGF5cyBhbGwgZW50cmllcyBvZiBuYW1lIHRhYmxlKSAqLworCV9fYmUzMiB1cGJvdW5kOworfTsKKworLyoKKyAqIFRoZSBlcnJvciBzdHJpbmcgVExWIGlzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjYXVzZSAKKyAqIG9mIHRoZSByZXF1ZXN0IGZhaWx1cmUuICBUbyBzaW1wbGlmeSBlcnJvciBwcm9jZXNzaW5nIChhbmQgdG8gc2F2ZSBzcGFjZSkKKyAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBjYW4gYmUgYSBzcGVjaWFsIGVycm9yIGNvZGUgY2hhcmFjdGVyCisgKiAobHlpbmcgYnkgdGhlIHJhbmdlIDB4ODAgdG8gMHhGRikgd2hpY2ggcmVwcmVzZW50cyBhIHByZS1kZWZpbmVkIHJlYXNvbi4KKyAqLworCisjZGVmaW5lIFRJUENfQ0ZHX1RMVl9FUlJPUiAgICAgICJceDgwIiAgLyogcmVxdWVzdCBjb250YWlucyBpbmNvcnJlY3QgVExWKHMpICovCisjZGVmaW5lIFRJUENfQ0ZHX05PVF9ORVRfQURNSU4gICJceDgxIgkvKiBtdXN0IGJlIG5ldHdvcmsgYWRtaW5pc3RyYXRvciAqLworI2RlZmluZSBUSVBDX0NGR19OT1RfWk9ORV9NU1RSCSJceDgyIgkvKiBtdXN0IGJlIHpvbmUgbWFzdGVyICovCisjZGVmaW5lIFRJUENfQ0ZHX05PX1JFTU9URQkiXHg4MyIJLyogcmVtb3RlIG1hbmFnZW1lbnQgbm90IGVuYWJsZWQgKi8KKyNkZWZpbmUgVElQQ19DRkdfTk9UX1NVUFBPUlRFRCAgIlx4ODQiCS8qIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZCBieSBUSVBDICovCisjZGVmaW5lIFRJUENfQ0ZHX0lOVkFMSURfVkFMVUUgICJceDg1IiAgLyogcmVxdWVzdCBoYXMgaW52YWxpZCBhcmd1bWVudCB2YWx1ZSAqLworCisjaWYgMAorLyogcHJvdG90eXBlcyBUTFYgc3RydWN0dXJlcyBmb3IgcHJvcG9zZWQgY29tbWFuZHMgKi8KK3N0cnVjdCB0aXBjX2xpbmtfY3JlYXRlIHsKKwlfX3UzMiAgIGRvbWFpbjsKKwlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIHBlZXJfYWRkcjsKKwljaGFyIGJlYXJlcl9uYW1lW1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKK307CisKK3N0cnVjdCB0aXBjX3JvdXRlX2luZm8geworCV9fdTMyIGRlc3Q7CisJX191MzIgcm91dGVyOworfTsKKyNlbmRpZgorCisvKgorICogQSBUTFYgY29uc2lzdHMgb2YgYSBkZXNjcmlwdG9yLCBmb2xsb3dlZCBieSB0aGUgVExWIHZhbHVlLgorICogVExWIGRlc2NyaXB0b3IgZmllbGRzIGFyZSBzdG9yZWQgaW4gbmV0d29yayBieXRlIG9yZGVyOyAKKyAqIFRMViB2YWx1ZXMgbXVzdCBhbHNvIGJlIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHdoZXJlIGFwcGxpY2FibGUpLgorICogVExWIGRlc2NyaXB0b3JzIG11c3QgYmUgYWxpZ25lZCB0byBhZGRyZXNzZXMgd2hpY2ggYXJlIG11bHRpcGxlIG9mIDQsCisgKiBzbyB1cCB0byAzIGJ5dGVzIG9mIHBhZGRpbmcgbWF5IGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIFRMViB2YWx1ZSBhcmVhLgorICogVGhlcmUgbXVzdCBub3QgYmUgYW55IHBhZGRpbmcgYmV0d2VlbiB0aGUgVExWIGRlc2NyaXB0b3IgYW5kIGl0cyB2YWx1ZS4KKyAqLworCitzdHJ1Y3QgdGx2X2Rlc2MgeworCV9fYmUxNiB0bHZfbGVuOwkJLyogVExWIGxlbmd0aCAoZGVzY3JpcHRvciArIHZhbHVlKSAqLworCV9fYmUxNiB0bHZfdHlwZTsJCS8qIFRMViBpZGVudGlmaWVyICovCit9OworCisjZGVmaW5lIFRMVl9BTElHTlRPIDQKKworI2RlZmluZSBUTFZfQUxJR04oZGF0YWxlbikgKCgoZGF0YWxlbikrKFRMVl9BTElHTlRPLTEpKSAmIH4oVExWX0FMSUdOVE8tMSkpCisjZGVmaW5lIFRMVl9MRU5HVEgoZGF0YWxlbikgKHNpemVvZihzdHJ1Y3QgdGx2X2Rlc2MpICsgKGRhdGFsZW4pKQorI2RlZmluZSBUTFZfU1BBQ0UoZGF0YWxlbikgKFRMVl9BTElHTihUTFZfTEVOR1RIKGRhdGFsZW4pKSkKKyNkZWZpbmUgVExWX0RBVEEodGx2KSAoKHZvaWQgKikoKGNoYXIgKikodGx2KSArIFRMVl9MRU5HVEgoMCkpKQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX09LKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UpCit7CisJLyoKKwkgKiBXb3VsZCBhbHNvIGxpa2UgdG8gY2hlY2sgdGhhdCAidGx2IiBpcyBhIG11bHRpcGxlIG9mIDQsCisJICogYnV0IGRvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXkuCisJICogLSBUcmllZCBkb2luZyAoISh0bHYgJiAoVExWX0FMSUdOVE8tMSkpKSwgYnV0IEdDQyBjb21waWxlcgorCSAqICAgd29uJ3QgYWxsb3cgYmluYXJ5ICImIiB3aXRoIGEgcG9pbnRlci4KKwkgKiAtIFRyaWVkIGNhc3RpbmcgInRsdiIgdG8gaW50ZWdlciB0eXBlLCBidXQgY2F1c2VzIHdhcm5pbmcgYWJvdXQgc2l6ZQorCSAqICAgbWlzbWF0Y2ggd2hlbiBwb2ludGVyIGlzIGJpZ2dlciB0aGFuIGNob3NlbiB0eXBlIChpbnQsIGxvbmcsIC4uLikuCisJICovCisKKwlyZXR1cm4gKHNwYWNlID49IFRMVl9TUEFDRSgwKSkgJiYKKwkJKG50b2hzKCgoc3RydWN0IHRsdl9kZXNjICopdGx2KS0+dGx2X2xlbikgPD0gc3BhY2UpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX0NIRUNLKGNvbnN0IHZvaWQgKnRsdiwgX191MTYgc3BhY2UsIF9fdTE2IGV4cF90eXBlKQoreworCXJldHVybiBUTFZfT0sodGx2LCBzcGFjZSkgJiYgCisJCShudG9ocygoKHN0cnVjdCB0bHZfZGVzYyAqKXRsdiktPnRsdl90eXBlKSA9PSBleHBfdHlwZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBUTFZfU0VUKHZvaWQgKnRsdiwgX191MTYgdHlwZSwgdm9pZCAqZGF0YSwgX191MTYgbGVuKQoreworCXN0cnVjdCB0bHZfZGVzYyAqdGx2X3B0cjsKKwlpbnQgdGx2X2xlbjsKKworCXRsdl9sZW4gPSBUTFZfTEVOR1RIKGxlbik7CisJdGx2X3B0ciA9IChzdHJ1Y3QgdGx2X2Rlc2MgKil0bHY7CisJdGx2X3B0ci0+dGx2X3R5cGUgPSBodG9ucyh0eXBlKTsKKwl0bHZfcHRyLT50bHZfbGVuICA9IGh0b25zKHRsdl9sZW4pOworCWlmIChsZW4gJiYgZGF0YSkKKwkJbWVtY3B5KFRMVl9EQVRBKHRsdl9wdHIpLCBkYXRhLCB0bHZfbGVuKTsKKwlyZXR1cm4gVExWX1NQQUNFKGxlbik7Cit9CisKKy8qCisgKiBBIFRMViBsaXN0IGRlc2NyaXB0b3Igc2ltcGxpZmllcyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2VzIAorICogY29udGFpbmluZyBtdWx0aXBsZSBUTFZzLgorICovCisKK3N0cnVjdCB0bHZfbGlzdF9kZXNjIHsKKwlzdHJ1Y3QgdGx2X2Rlc2MgKnRsdl9wdHI7CS8qIHB0ciB0byBjdXJyZW50IFRMViAqLworCV9fdTMyIHRsdl9zcGFjZTsJCS8qICMgYnl0ZXMgZnJvbSBjdXJyIFRMViB0byBsaXN0IGVuZCAqLworfTsKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBUTFZfTElTVF9JTklUKHN0cnVjdCB0bHZfbGlzdF9kZXNjICpsaXN0LCAKKwkJCQkgdm9pZCAqZGF0YSwgX191MzIgc3BhY2UpCit7CisJbGlzdC0+dGx2X3B0ciA9IChzdHJ1Y3QgdGx2X2Rlc2MgKilkYXRhOworCWxpc3QtPnRsdl9zcGFjZSA9IHNwYWNlOworfQorCSAgICAgCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX0xJU1RfRU1QVFkoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7IAorCXJldHVybiAobGlzdC0+dGx2X3NwYWNlID09IDApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgVExWX0xJU1RfQ0hFQ0soc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QsIF9fdTE2IGV4cF90eXBlKQoreworCXJldHVybiBUTFZfQ0hFQ0sobGlzdC0+dGx2X3B0ciwgbGlzdC0+dGx2X3NwYWNlLCBleHBfdHlwZSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgKlRMVl9MSVNUX0RBVEEoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7CisJcmV0dXJuIFRMVl9EQVRBKGxpc3QtPnRsdl9wdHIpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIFRMVl9MSVNUX1NURVAoc3RydWN0IHRsdl9saXN0X2Rlc2MgKmxpc3QpCit7CisJX191MTYgdGx2X3NwYWNlID0gVExWX0FMSUdOKG50b2hzKGxpc3QtPnRsdl9wdHItPnRsdl9sZW4pKTsKKworICAgICAgICBsaXN0LT50bHZfcHRyID0gKHN0cnVjdCB0bHZfZGVzYyAqKSgoY2hhciAqKWxpc3QtPnRsdl9wdHIgKyB0bHZfc3BhY2UpOworCWxpc3QtPnRsdl9zcGFjZSAtPSB0bHZfc3BhY2U7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgTkVUTElOS19HRU5FUklDIHVzZSB0aGUgZm9sbG93aW5nCisgKiBmYW1pbHkgaWQsIG5hbWUsIHZlcnNpb24gYW5kIGNvbW1hbmQuCisgKi8KKyNkZWZpbmUgVElQQ19HRU5MX05BTUUJCSJUSVBDIgorI2RlZmluZSBUSVBDX0dFTkxfVkVSU0lPTgkweDEKKyNkZWZpbmUgVElQQ19HRU5MX0NNRAkJMHgxCisKKy8qCisgKiBUSVBDIHNwZWNpZmljIGhlYWRlciB1c2VkIGluIE5FVExJTktfR0VORVJJQyByZXF1ZXN0cy4KKyAqLworc3RydWN0IHRpcGNfZ2VubG1zZ2hkciB7CisJX191MzIgZGVzdDsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlfX3UxNiBjbWQ7CQkvKiBDb21tYW5kICovCisJX191MTYgcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KK307CisKKyNkZWZpbmUgVElQQ19HRU5MX0hEUkxFTglOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHRpcGNfZ2VubG1zZ2hkcikpCisKKy8qCisgKiBDb25maWd1cmF0aW9uIG1lc3NhZ2VzIGV4Y2hhbmdlZCB2aWEgVElQQyBzb2NrZXRzIHVzZSB0aGUgVElQQyBjb25maWd1cmF0aW9uIAorICogbWVzc2FnZSBoZWFkZXIsIHdoaWNoIGlzIGRlZmluZWQgYmVsb3cuICBUaGlzIHN0cnVjdHVyZSBpcyBhbmFsb2dvdXMgCisgKiB0byB0aGUgTmV0bGluayBtZXNzYWdlIGhlYWRlciwgYnV0IGZpZWxkcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAKKyAqIGFuZCBubyBwYWRkaW5nIGlzIHBlcm1pdHRlZCBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kIHRoZSBtZXNzYWdlIGRhdGEgCisgKiB0aGF0IGZvbGxvd3MuCisgKi8KKworc3RydWN0IHRpcGNfY2ZnX21zZ19oZHIKK3sKKwlfX2JlMzIgdGNtX2xlbjsJCS8qIE1lc3NhZ2UgbGVuZ3RoIChpbmNsdWRpbmcgaGVhZGVyKSAqLworCV9fYmUxNiB0Y21fdHlwZTsJLyogQ29tbWFuZCB0eXBlICovCisJX19iZTE2IHRjbV9mbGFnczsJLyogQWRkaXRpb25hbCBmbGFncyAqLworCWNoYXIgIHRjbV9yZXNlcnZlZFs4XTsJLyogVW51c2VkICovCit9OworCisjZGVmaW5lIFRDTV9GX1JFUVVFU1QJMHgxCS8qIEZsYWc6IFJlcXVlc3QgbWVzc2FnZSAqLworI2RlZmluZSBUQ01fRl9NT1JFCTB4MgkvKiBGbGFnOiBNZXNzYWdlIHRvIGJlIGNvbnRpbnVlZCAqLworCisjZGVmaW5lIFRDTV9BTElHTihkYXRhbGVuKSAgKCgoZGF0YWxlbikrMykgJiB+MykKKyNkZWZpbmUgVENNX0xFTkdUSChkYXRhbGVuKSAoc2l6ZW9mKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyKSArIGRhdGFsZW4pCisjZGVmaW5lIFRDTV9TUEFDRShkYXRhbGVuKSAgKFRDTV9BTElHTihUQ01fTEVOR1RIKGRhdGFsZW4pKSkKKyNkZWZpbmUgVENNX0RBVEEodGNtX2hkcikgICAoKHZvaWQgKikoKGNoYXIgKikodGNtX2hkcikgKyBUQ01fTEVOR1RIKDApKSkKKworc3RhdGljIF9faW5saW5lX18gaW50IFRDTV9TRVQodm9pZCAqbXNnLCBfX3UxNiBjbWQsIF9fdTE2IGZsYWdzLAorCQkJICB2b2lkICpkYXRhLCBfX3UxNiBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgdGlwY19jZmdfbXNnX2hkciAqdGNtX2hkcjsKKwlpbnQgbXNnX2xlbjsKKworCW1zZ19sZW4gPSBUQ01fTEVOR1RIKGRhdGFfbGVuKTsKKwl0Y21faGRyID0gKHN0cnVjdCB0aXBjX2NmZ19tc2dfaGRyICopbXNnOworCXRjbV9oZHItPnRjbV9sZW4gICA9IGh0b25sKG1zZ19sZW4pOworCXRjbV9oZHItPnRjbV90eXBlICA9IGh0b25zKGNtZCk7CisJdGNtX2hkci0+dGNtX2ZsYWdzID0gaHRvbnMoZmxhZ3MpOworCWlmIChkYXRhX2xlbiAmJiBkYXRhKQorCQltZW1jcHkoVENNX0RBVEEobXNnKSwgZGF0YSwgZGF0YV9sZW4pOworCXJldHVybiBUQ01fU1BBQ0UoZGF0YV9sZW4pOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdG9zaGliYS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90b3NoaWJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3YzRlZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdG9zaGliYS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIHRvc2hpYmEuaCAtLSBMaW51eCBkcml2ZXIgZm9yIGFjY2Vzc2luZyB0aGUgU01NIG9uIFRvc2hpYmEgbGFwdG9wcyAKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwMCAgSm9uYXRoYW4gQS4gQnV6emFyZCAoam9uYXRoYW5AYnV6emFyZC5vcmcudWspCisgKgorICogVGhhbmtzIHRvIEp1ZXJnZW4gSGVpbnpsIDxqdWVyZ2VuQG1vbm9jZXJ1cy5kZW1vbi5jby51az4gZm9yIHRoZSBwb2ludGVycworICogb24gbWFraW5nIHN1cmUgdGhlIHN0cnVjdHVyZSBpcyBhbGlnbmVkIGFuZCBwYWNrZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9UT1NISUJBX0gKKyNkZWZpbmUgX0xJTlVYX1RPU0hJQkFfSAorCisjZGVmaW5lIFRPU0hfUFJPQyAiL3Byb2MvdG9zaGliYSIKKyNkZWZpbmUgVE9TSF9ERVZJQ0UgIi9kZXYvdG9zaGliYSIKKyNkZWZpbmUgVE9TSF9TTU0gX0lPV1IoJ3QnLCAweDkwLCBpbnQpCS8qIGJyb2tlbjogbWVhbnQgMjQgYnl0ZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBlYXg7CisJdW5zaWduZWQgaW50IGVieCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdW5zaWduZWQgaW50IGVjeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdW5zaWduZWQgaW50IGVkeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdW5zaWduZWQgaW50IGVzaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisJdW5zaWduZWQgaW50IGVkaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IFNNTVJlZ2lzdGVyczsKKworaW50IHRvc2hfc21tKFNNTVJlZ2lzdGVycyAqcmVncyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90dHkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdHR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5OTZiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdHR5LmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIF9MSU5VWF9UVFlfSAorI2RlZmluZSBfTElOVVhfVFRZX0gKKworLyoKKyAqICd0dHkuaCcgZGVmaW5lcyBzb21lIHN0cnVjdHVyZXMgdXNlZCBieSB0dHlfaW8uYyBhbmQgc29tZSBkZWZpbmVzLgorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyY2ZkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKQEAgLTAsMCArMSwxNzIgQEAKKyNpZm5kZWYgX0xJTlVYX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX1RZUEVTX0gKKworCisjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmbmRlZiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKwordHlwZWRlZiBfX3UzMiBfX2tlcm5lbF9kZXZfdDsKKwordHlwZWRlZiBfX2tlcm5lbF9mZF9zZXQJCWZkX3NldDsKK3R5cGVkZWYgX19rZXJuZWxfZGV2X3QJCWRldl90OwordHlwZWRlZiBfX2tlcm5lbF9pbm9fdAkJaW5vX3Q7Cit0eXBlZGVmIF9fa2VybmVsX21vZGVfdAkJbW9kZV90OwordHlwZWRlZiBfX2tlcm5lbF9ubGlua190CW5saW5rX3Q7Cit0eXBlZGVmIF9fa2VybmVsX29mZl90CQlvZmZfdDsKK3R5cGVkZWYgX19rZXJuZWxfcGlkX3QJCXBpZF90OwordHlwZWRlZiBfX2tlcm5lbF9kYWRkcl90CWRhZGRyX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2tleV90CQlrZXlfdDsKK3R5cGVkZWYgX19rZXJuZWxfc3VzZWNvbmRzX3QJc3VzZWNvbmRzX3Q7Cit0eXBlZGVmIF9fa2VybmVsX3RpbWVyX3QJdGltZXJfdDsKK3R5cGVkZWYgX19rZXJuZWxfY2xvY2tpZF90CWNsb2NraWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfbXFkX3QJCW1xZF90OworCit0eXBlZGVmIF9fa2VybmVsX3VpZF90CQl1aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkX3QJCWdpZF90OworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZiBfX2tlcm5lbF9sb2ZmX3QJCWxvZmZfdDsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgaW5kaXZpZHVhbCBpZmRlZnMgZm9yCisgKiBoaXN0b3JpY2FsIHJlYXNvbnM6CisgKi8KKyNpZm5kZWYgX1NJWkVfVAorI2RlZmluZSBfU0laRV9UCit0eXBlZGVmIF9fa2VybmVsX3NpemVfdAkJc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1NTSVpFX1QKKyNkZWZpbmUgX1NTSVpFX1QKK3R5cGVkZWYgX19rZXJuZWxfc3NpemVfdAlzc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1BUUkRJRkZfVAorI2RlZmluZSBfUFRSRElGRl9UCit0eXBlZGVmIF9fa2VybmVsX3B0cmRpZmZfdAlwdHJkaWZmX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfVElNRV9UCisjZGVmaW5lIF9USU1FX1QKK3R5cGVkZWYgX19rZXJuZWxfdGltZV90CQl0aW1lX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfQ0xPQ0tfVAorI2RlZmluZSBfQ0xPQ0tfVAordHlwZWRlZiBfX2tlcm5lbF9jbG9ja190CWNsb2NrX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfQ0FERFJfVAorI2RlZmluZSBfQ0FERFJfVAordHlwZWRlZiBfX2tlcm5lbF9jYWRkcl90CWNhZGRyX3Q7CisjZW5kaWYKKworLyogYnNkICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVfc2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdV9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCXVfbG9uZzsKKworLyogc3lzdiAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1bmNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQl1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJdWxvbmc7CisKKyNpZm5kZWYgX19CSVRfVFlQRVNfREVGSU5FRF9fCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXworCit0eXBlZGVmCQlfX3U4CQl1X2ludDhfdDsKK3R5cGVkZWYJCV9fczgJCWludDhfdDsKK3R5cGVkZWYJCV9fdTE2CQl1X2ludDE2X3Q7Cit0eXBlZGVmCQlfX3MxNgkJaW50MTZfdDsKK3R5cGVkZWYJCV9fdTMyCQl1X2ludDMyX3Q7Cit0eXBlZGVmCQlfX3MzMgkJaW50MzJfdDsKKworI2VuZGlmIC8qICEoX19CSVRfVFlQRVNfREVGSU5FRF9fKSAqLworCit0eXBlZGVmCQlfX3U4CQl1aW50OF90OwordHlwZWRlZgkJX191MTYJCXVpbnQxNl90OwordHlwZWRlZgkJX191MzIJCXVpbnQzMl90OworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZgkJX191NjQJCXVpbnQ2NF90OwordHlwZWRlZgkJX191NjQJCXVfaW50NjRfdDsKK3R5cGVkZWYJCV9fczY0CQlpbnQ2NF90OworI2VuZGlmCisKKy8qIHRoaXMgaXMgYSBzcGVjaWFsIDY0Yml0IGRhdGEgdHlwZSB0aGF0IGlzIDgtYnl0ZSBhbGlnbmVkICovCisjZGVmaW5lIGFsaWduZWRfdTY0IHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNkZWZpbmUgYWxpZ25lZF9iZTY0IF9fYmU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKyNkZWZpbmUgYWxpZ25lZF9sZTY0IF9fbGU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSkKKworLyoqCisgKiBUaGUgdHlwZSB1c2VkIGZvciBpbmRleGluZyBvbnRvIGEgZGlzYyBvciBkaXNjIHBhcnRpdGlvbi4KKyAqCisgKiBMaW51eCBhbHdheXMgY29uc2lkZXJzIHNlY3RvcnMgdG8gYmUgNTEyIGJ5dGVzIGxvbmcgaW5kZXBlbmRlbnRseQorICogb2YgdGhlIGRldmljZXMgcmVhbCBibG9jayBzaXplLgorICovCisjaWZkZWYgQ09ORklHX0xCRAordHlwZWRlZiB1NjQgc2VjdG9yX3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNlY3Rvcl90OworI2VuZGlmCisKKy8qCisgKiBUaGUgdHlwZSBvZiB0aGUgaW5vZGUncyBibG9jayBjb3VudC4KKyAqLworI2lmZGVmIENPTkZJR19MU0YKK3R5cGVkZWYgdTY0IGJsa2NudF90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBibGtjbnRfdDsKKyNlbmRpZgorCisvKgorICogVGhlIHR5cGUgb2YgYW4gaW5kZXggaW50byB0aGUgcGFnZWNhY2hlLiAgVXNlIGEgI2RlZmluZSBzbyBhc20vdHlwZXMuaAorICogY2FuIG92ZXJyaWRlIGl0LgorICovCisjaWZuZGVmIHBnb2ZmX3QKKyNkZWZpbmUgcGdvZmZfdCB1bnNpZ25lZCBsb25nCisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX1NUUklDVF9OQU1FUyAqLworCisvKgorICogQmVsb3cgYXJlIHRydWx5IExpbnV4LXNwZWNpZmljIHR5cGVzIHRoYXQgc2hvdWxkIG5ldmVyIGNvbGxpZGUgd2l0aAorICogYW55IGFwcGxpY2F0aW9uL2xpYnJhcnkgdGhhdCB3YW50cyBsaW51eC90eXBlcy5oLgorICovCisKKyNpZmRlZiBfX0NIRUNLRVJfXworI2RlZmluZSBfX2JpdHdpc2VfXyBfX2F0dHJpYnV0ZV9fKChiaXR3aXNlKSkKKyNlbHNlCisjZGVmaW5lIF9fYml0d2lzZV9fCisjZW5kaWYKKyNpZmRlZiBfX0NIRUNLX0VORElBTl9fCisjZGVmaW5lIF9fYml0d2lzZSBfX2JpdHdpc2VfXworI2Vsc2UKKyNkZWZpbmUgX19iaXR3aXNlCisjZW5kaWYKKwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19sZTE2OwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19iZTE2OwordHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19sZTMyOwordHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19iZTMyOworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fbGU2NDsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fYmU2NDsKKyNlbmRpZgordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19zdW0xNjsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fd3N1bTsKKworCitzdHJ1Y3QgdXN0YXQgeworCV9fa2VybmVsX2RhZGRyX3QJZl90ZnJlZTsKKwlfX2tlcm5lbF9pbm9fdAkJZl90aW5vZGU7CisJY2hhcgkJCWZfZm5hbWVbNl07CisJY2hhcgkJCWZfZnBhY2tbNl07Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWRmX2ZzX2kuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWRmX2ZzX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ4NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZGZfZnNfaS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiB1ZGZfZnNfaS5oCisgKgorICogVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciB0aGUgTGludXgga2VybmVsL21vZHVsZS4gCisgKgorICogQ09QWVJJR0hUCisgKglUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICoJCWZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICoJRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqLworCisjaWZuZGVmIF9VREZfRlNfSV9ICisjZGVmaW5lIF9VREZfRlNfSV9IIDEKKworCisvKiBleHBvcnRlZCBJT0NUTHMsIHdlIGhhdmUgJ2wnLCAweDQwLTB4N2YgKi8KKworI2RlZmluZSBVREZfR0VURUFTSVpFICAgX0lPUignbCcsIDB4NDAsIGludCkKKyNkZWZpbmUgVURGX0dFVEVBQkxPQ0sgIF9JT1IoJ2wnLCAweDQxLCB2b2lkICopCisjZGVmaW5lIFVERl9HRVRWT0xJREVOVCBfSU9SKCdsJywgMHg0Miwgdm9pZCAqKQorI2RlZmluZSBVREZfUkVMT0NBVEVfQkxPQ0tTIF9JT1dSKCdsJywgMHg0MywgbG9uZykKKworI2VuZGlmIC8qIF9VREZfRlNfSV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VkcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWZhMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZHAuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCURlZmluaXRpb25zIGZvciB0aGUgVURQIHByb3RvY29sLgorICoKKyAqIFZlcnNpb246CUAoIyl1ZHAuaAkxLjAuMgkwNC8yOC85MworICoKKyAqIEF1dGhvcjoJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0xJTlVYX1VEUF9ICisjZGVmaW5lIF9MSU5VWF9VRFBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHVkcGhkciB7CisJX19iZTE2CXNvdXJjZTsKKwlfX2JlMTYJZGVzdDsKKwlfX2JlMTYJbGVuOworCV9fc3VtMTYJY2hlY2s7Cit9OworCisKKy8qIFVEUCBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBVRFBfQ09SSwkxCS8qIE5ldmVyIHNlbmQgcGFydGlhbGx5IGNvbXBsZXRlIHNlZ21lbnRzICovCisjZGVmaW5lIFVEUF9FTkNBUAkxMDAJLyogU2V0IHRoZSBzb2NrZXQgdG8gYWNjZXB0IGVuY2Fwc3VsYXRlZCBwYWNrZXRzICovCisKKy8qIFVEUCBlbmNhcHN1bGF0aW9uIHR5cGVzICovCisjZGVmaW5lIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFCTEgLyogZHJhZnQtaWV0Zi1pcHNlYy1uYXQtdC1pa2UtMDAvMDEgKi8KKyNkZWZpbmUgVURQX0VOQ0FQX0VTUElOVURQCTIgLyogZHJhZnQtaWV0Zi1pcHNlYy11ZHAtZW5jYXBzLTA2ICovCisjZGVmaW5lIFVEUF9FTkNBUF9MMlRQSU5VRFAJMyAvKiByZmMyNjYxICovCisKKworI2VuZGlmCS8qIF9MSU5VWF9VRFBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91ZnNfZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzZjE3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKQEAgLTAsMCArMSw5NDYgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC91ZnNfZnMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NgorICogQWRyaWFuIFJvZHJpZ3VleiAoYWRyaWFuQGZyYW5rbGlucy10b3dlci5ydXRnZXJzLmVkdSkKKyAqIExhYm9yYXRvcnkgZm9yIENvbXB1dGVyIFNjaWVuY2UgUmVzZWFyY2ggQ29tcHV0aW5nIEZhY2lsaXR5CisgKiBSdXRnZXJzLCBUaGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgSmVyc2V5CisgKgorICogQ2xlYW4gc3dhYiBzdXBwb3J0IGJ5IEZhcmUgPGZhcmVAdHVuZXMub3JnPgorICoganVzdCBob3BlIG5vIG9uZSBpcyB1c2luZyBOTlVVWFhJIG9uIF9fPzY0IHN0cnVjdHVyZSBlbGVtZW50cworICogNjQtYml0IGNsZWFuIHRoYW5rcyB0byBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KKyAqCisgKiA0LjRCU0QgKEZyZWVCU0QpIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgMXN0IDE5OTggYnkKKyAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPiBwYXJ0aWFsbHkgYmFzZWQKKyAqIG9uIGNvZGUgYnkgTWFydGluIHZvbiBMb2V3aXMgPG1hcnRpbkBtaXJhLmlzZG4uY3MudHUtYmVybGluLmRlPi4KKyAqCisgKiBOZVhUc3RlcCBzdXBwb3J0IGFkZGVkIG9uIEZlYnJ1YXJ5IDV0aCAxOTk4IGJ5CisgKiBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4uCisgKgorICogV3JpdGUgc3VwcG9ydCBieSBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqCisgKiBIUC9VWCBoZnMgZmlsZXN5c3RlbSBzdXBwb3J0IGFkZGVkIGJ5CisgKiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1rcEBta3AubmV0PiwgQXVndXN0IDE5OTkKKyAqCisgKiBVRlMyIChvZiBGcmVlQlNEIDUueCkgc3VwcG9ydCBhZGRlZCBieQorICogTmlyYWogS3VtYXIgPG5pcmFqMTdAaWl0Ym9tYmF5Lm9yZz4gICwgSmFuIDIwMDQKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VGU19GU19ICisjZGVmaW5lIF9fTElOVVhfVUZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK3R5cGVkZWYgX191NjQgX19mczY0OwordHlwZWRlZiBfX3UzMiBfX2ZzMzI7Cit0eXBlZGVmIF9fdTE2IF9fZnMxNjsKKworI2RlZmluZSBVRlNfQkJMT0NLIDAKKyNkZWZpbmUgVUZTX0JCU0laRSA4MTkyCisjZGVmaW5lIFVGU19TQkxPQ0sgODE5MgorI2RlZmluZSBVRlNfU0JTSVpFIDgxOTIKKworI2RlZmluZSBVRlNfU0VDVE9SX1NJWkUgNTEyCisjZGVmaW5lIFVGU19TRUNUT1JfQklUUyA5CisjZGVmaW5lIFVGU19NQUdJQyAgMHgwMDAxMTk1NAorI2RlZmluZSBVRlMyX01BR0lDIDB4MTk1NDAxMTkKKyNkZWZpbmUgVUZTX0NJR0FNICAweDU0MTkwMTAwIC8qIGJ5dGVzd2FwcGVkIE1BR0lDICovCisKKy8qIENvcGllZCBmcm9tIEZyZWVCU0QgKi8KKy8qCisgKiBFYWNoIGRpc2sgZHJpdmUgY29udGFpbnMgc29tZSBudW1iZXIgb2YgZmlsZXN5c3RlbXMuCisgKiBBIGZpbGVzeXN0ZW0gY29uc2lzdHMgb2YgYSBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzLgorICogRWFjaCBjeWxpbmRlciBncm91cCBoYXMgaW5vZGVzIGFuZCBkYXRhLgorICoKKyAqIEEgZmlsZXN5c3RlbSBpcyBkZXNjcmliZWQgYnkgaXRzIHN1cGVyLWJsb2NrLCB3aGljaCBpbiB0dXJuCisgKiBkZXNjcmliZXMgdGhlIGN5bGluZGVyIGdyb3Vwcy4gIFRoZSBzdXBlci1ibG9jayBpcyBjcml0aWNhbAorICogZGF0YSBhbmQgaXMgcmVwbGljYXRlZCBpbiBlYWNoIGN5bGluZGVyIGdyb3VwIHRvIHByb3RlY3QgYWdhaW5zdAorICogY2F0YXN0cm9waGljIGxvc3MuICBUaGlzIGlzIGRvbmUgYXQgYG5ld2ZzJyB0aW1lIGFuZCB0aGUgY3JpdGljYWwKKyAqIHN1cGVyLWJsb2NrIGRhdGEgZG9lcyBub3QgY2hhbmdlLCBzbyB0aGUgY29waWVzIG5lZWQgbm90IGJlCisgKiByZWZlcmVuY2VkIGZ1cnRoZXIgdW5sZXNzIGRpc2FzdGVyIHN0cmlrZXMuCisgKgorICogRm9yIGZpbGVzeXN0ZW0gZnMsIHRoZSBvZmZzZXRzIG9mIHRoZSB2YXJpb3VzIGJsb2NrcyBvZiBpbnRlcmVzdAorICogYXJlIGdpdmVuIGluIHRoZSBzdXBlciBibG9jayBhczoKKyAqICAgICAgW2ZzLT5mc19zYmxrbm9dICAgICAgICAgU3VwZXItYmxvY2sKKyAqICAgICAgW2ZzLT5mc19jYmxrbm9dICAgICAgICAgQ3lsaW5kZXIgZ3JvdXAgYmxvY2sKKyAqICAgICAgW2ZzLT5mc19pYmxrbm9dICAgICAgICAgSW5vZGUgYmxvY2tzCisgKiAgICAgIFtmcy0+ZnNfZGJsa25vXSAgICAgICAgIERhdGEgYmxvY2tzCisgKiBUaGUgYmVnaW5uaW5nIG9mIGN5bGluZGVyIGdyb3VwIGNnIGluIGZzLCBpcyBnaXZlbiBieQorICogdGhlIGBgY2diYXNlKGZzLCBjZyknJyBtYWNyby4KKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIG1lZGlhLCB0aGUgc3VwZXJibG9jayBtYXkKKyAqIHJlc2lkZSBpbiBhbnkgb25lIG9mIGZvdXIgcGxhY2VzLiBGb3IgdGlueSBtZWRpYSB3aGVyZSBldmVyeSBibG9jaworICogY291bnRzLCBpdCBpcyBwbGFjZWQgYXQgdGhlIHZlcnkgZnJvbnQgb2YgdGhlIHBhcnRpdGlvbi4gSGlzdG9yaWNhbGx5LAorICogVUZTMSBwbGFjZWQgaXQgOEsgZnJvbSB0aGUgZnJvbnQgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIGRpc2sgbGFiZWwgYW5kCisgKiBhIHNtYWxsIGJvb3RzdHJhcC4gRm9yIFVGUzIgaXQgZ290IG1vdmVkIHRvIDY0SyBmcm9tIHRoZSBmcm9udCB0byBsZWF2ZQorICogcm9vbSBmb3IgdGhlIGRpc2sgbGFiZWwgYW5kIGEgYmlnZ2VyIGJvb3RzdHJhcCwgYW5kIGZvciByZWFsbHkgcGlnZ3kKKyAqIHN5c3RlbXMgd2UgY2hlY2sgYXQgMjU2SyBmcm9tIHRoZSBmcm9udCBpZiB0aGUgZmlyc3QgdGhyZWUgZmFpbC4gSW4KKyAqIGFsbCBjYXNlcyB0aGUgc2l6ZSBvZiB0aGUgc3VwZXJibG9jayB3aWxsIGJlIFNCTE9DS1NJWkUuIEFsbCB2YWx1ZXMgYXJlCisgKiBnaXZlbiBpbiBieXRlLW9mZnNldCBmb3JtLCBzbyB0aGV5IGRvIG5vdCBpbXBseSBhIHNlY3RvciBzaXplLiBUaGUKKyAqIFNCTE9DS1NFQVJDSCBzcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBsb2NhdGlvbnMgc2hvdWxkIGJlIHNlYXJjaGVkLgorICovCisjZGVmaW5lIFNCTE9DS19GTE9QUFkgICAgICAgIDAKKyNkZWZpbmUgU0JMT0NLX1VGUzEgICAgICAgODE5MgorI2RlZmluZSBTQkxPQ0tfVUZTMiAgICAgIDY1NTM2CisjZGVmaW5lIFNCTE9DS19QSUdHWSAgICAyNjIxNDQKKyNkZWZpbmUgU0JMT0NLU0laRSAgICAgICAgODE5MgorI2RlZmluZSBTQkxPQ0tTRUFSQ0ggXAorICAgICAgICB7IFNCTE9DS19VRlMyLCBTQkxPQ0tfVUZTMSwgU0JMT0NLX0ZMT1BQWSwgU0JMT0NLX1BJR0dZLCAtMSB9CisKKworLyogSFAgc3BlY2lmaWMgTUFHSUMgdmFsdWVzICovCisKKyNkZWZpbmUgVUZTX01BR0lDX0xGTiAgIDB4MDAwOTUwMTQgLyogZnMgc3VwcG9ydHMgZmlsZW5hbWVzID4gMTQgY2hhcnMgKi8KKyNkZWZpbmUgVUZTX0NJR0FNX0xGTiAgIDB4MTQ1MDA5MDAgLyogc3JhaGMgNDEgPCBzZW1hbmVsaWYgc3Ryb3BwdXMgc2YgKi8KKworI2RlZmluZSBVRlNfTUFHSUNfU0VDICAgMHgwMDYxMjE5NSAvKiBCMSBzZWN1cml0eSBmcyAqLworI2RlZmluZSBVRlNfQ0lHQU1fU0VDICAgMHg5NTIxNjEwMAorCisjZGVmaW5lIFVGU19NQUdJQ19GRUEgICAweDAwMTk1NjEyIC8qIGZzX2ZlYXR1cmViaXRzIHN1cHBvcnRlZCAqLworI2RlZmluZSBVRlNfQ0lHQU1fRkVBICAgMHgxMjU2MTkwMAorCisjZGVmaW5lIFVGU19NQUdJQ180R0IgICAweDA1MjMxOTk0IC8qIGZzID4gNCBHQiAmJiBmc19mZWF0dXJlYml0cyAqLworI2RlZmluZSBVRlNfQ0lHQU1fNEdCICAgMHg5NDE5MjMwNQorCisvKiBTZWVtcyBzb21lYm9keSBhdCBIUCBnb29mZWQgaGVyZS4gQjEgYW5kIGxmcyBhcmUgYm90aCAweDIgIT8hICovCisjZGVmaW5lIFVGU19GU0ZfTEZOICAgICAweDAwMDAwMDAxIC8qIGxvbmcgZmlsZSBuYW1lcyAqLworI2RlZmluZSBVRlNfRlNGX0IxICAgICAgMHgwMDAwMDAwMiAvKiBCMSBzZWN1cml0eSAqLworI2RlZmluZSBVRlNfRlNGX0xGUyAgICAgMHgwMDAwMDAwMiAvKiBsYXJnZSBmaWxlcyAqLworI2RlZmluZSBVRlNfRlNGX0xVSUQgICAgMHgwMDAwMDAwNCAvKiBsYXJnZSBVSURzICovCisKKy8qIEVuZCBvZiBIUCBzdHVmZiAqLworCisKKyNkZWZpbmUgVUZTX0JTSVpFCTgxOTIKKyNkZWZpbmUgVUZTX01JTkJTSVpFCTQwOTYKKyNkZWZpbmUgVUZTX0ZTSVpFCTEwMjQKKyNkZWZpbmUgVUZTX01BWEZSQUcJKFVGU19CU0laRSAvIFVGU19GU0laRSkKKworI2RlZmluZSBVRlNfTkRBRERSIDEyCisjZGVmaW5lIFVGU19OSU5ESVIgMworCisjZGVmaW5lIFVGU19JTkRfQkxPQ0sJKFVGU19OREFERFIgKyAwKQorI2RlZmluZSBVRlNfRElORF9CTE9DSwkoVUZTX05EQUREUiArIDEpCisjZGVmaW5lIFVGU19USU5EX0JMT0NLCShVRlNfTkRBRERSICsgMikKKworI2RlZmluZSBVRlNfTkRJUl9GUkFHTUVOVCAoVUZTX05EQUREUiA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSBVRlNfSU5EX0ZSQUdNRU5UIChVRlNfSU5EX0JMT0NLIDw8IHVzcGktPnNfZnBic2hpZnQpCisjZGVmaW5lIFVGU19ESU5EX0ZSQUdNRU5UIChVRlNfRElORF9CTE9DSyA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSBVRlNfVElORF9GUkFHTUVOVCAoVUZTX1RJTkRfQkxPQ0sgPDwgdXNwaS0+c19mcGJzaGlmdCkKKworI2RlZmluZSBVRlNfUk9PVElOTyAyCisjZGVmaW5lIFVGU19GSVJTVF9JTk8gKFVGU19ST09USU5PICsgMSkKKworI2RlZmluZSBVRlNfVVNFRUZUICAoKF9fdTE2KTY1NTM1KQorCisjZGVmaW5lIFVGU19GU09LICAgICAgMHg3YzI2OWQzOAorI2RlZmluZSBVRlNfRlNBQ1RJVkUgICgoX19zOCkweDAwKQorI2RlZmluZSBVRlNfRlNDTEVBTiAgICgoX19zOCkweDAxKQorI2RlZmluZSBVRlNfRlNTVEFCTEUgICgoX19zOCkweDAyKQorI2RlZmluZSBVRlNfRlNPU0YxICAgICgoX19zOCkweDAzKQkvKiBpcyB0aGlzIGNvcnJlY3QgZm9yIERFQyBPU0YvMT8gKi8KKyNkZWZpbmUgVUZTX0ZTQkFEICAgICAoKF9fczgpMHhmZikKKworLyogRnJvbSBoZXJlIHRvIG5leHQgYmxhbmsgbGluZSwgc19mbGFncyBmb3IgdWZzX3NiX2luZm8gKi8KKy8qIGRpcmVjdG9yeSBlbnRyeSBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfREVfTUFTSwkJMHgwMDAwMDAxMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFVGU19ERV9PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX0RFXzQ0QlNECQkweDAwMDAwMDEwCisvKiB1aWQgZW5jb2RpbmcgKi8KKyNkZWZpbmUgVUZTX1VJRF9NQVNLCQkweDAwMDAwMDYwCS8qIG1hc2sgZm9yIHRoZSBmb2xsb3dpbmcgKi8KKyNkZWZpbmUgVUZTX1VJRF9PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX1VJRF80NEJTRAkJMHgwMDAwMDAyMAorI2RlZmluZSBVRlNfVUlEX0VGVAkJMHgwMDAwMDA0MAorLyogc3VwZXJibG9jayBzdGF0ZSBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfU1RfTUFTSwkJMHgwMDAwMDcwMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFVGU19TVF9PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX1NUXzQ0QlNECQkweDAwMDAwMTAwCisjZGVmaW5lIFVGU19TVF9TVU4JCTB4MDAwMDAyMDAgLyogU29sYXJpcyAqLworI2RlZmluZSBVRlNfU1RfU1VOT1MJCTB4MDAwMDAzMDAKKyNkZWZpbmUgVUZTX1NUX1NVTng4NgkJMHgwMDAwMDQwMCAvKiBTb2xhcmlzIHg4NiAqLworLypjeWxpbmRlciBncm91cCBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfQ0dfTUFTSwkJMHgwMDAwMzAwMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFVGU19DR19PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX0NHXzQ0QlNECQkweDAwMDAyMDAwCisjZGVmaW5lIFVGU19DR19TVU4JCTB4MDAwMDEwMDAKKy8qIGZpbGVzeXN0ZW0gdHlwZSBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfVFlQRV9NQVNLCQkweDAwMDEwMDAwCS8qIG1hc2sgZm9yIHRoZSBmb2xsb3dpbmcgKi8KKyNkZWZpbmUgVUZTX1RZUEVfVUZTMQkJMHgwMDAwMDAwMAorI2RlZmluZSBVRlNfVFlQRV9VRlMyCQkweDAwMDEwMDAwCisKKworLyogZnNfaW5vZGVmbXQgb3B0aW9ucyAqLworI2RlZmluZSBVRlNfNDJJTk9ERUZNVAktMQorI2RlZmluZSBVRlNfNDRJTk9ERUZNVAkyCisKKy8qCisgKiBNSU5GUkVFIGdpdmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgcGVyY2VudGFnZSBvZiBmaWxlIHN5c3RlbQorICogYmxvY2tzIHdoaWNoIG1heSBiZSBmcmVlLiBJZiB0aGUgZnJlZWxpc3QgZHJvcHMgYmVsb3cgdGhpcyBsZXZlbAorICogb25seSB0aGUgc3VwZXJ1c2VyIG1heSBjb250aW51ZSB0byBhbGxvY2F0ZSBibG9ja3MuIFRoaXMgbWF5CisgKiBiZSBzZXQgdG8gMCBpZiBubyByZXNlcnZlIG9mIGZyZWUgYmxvY2tzIGlzIGRlZW1lZCBuZWNlc3NhcnksCisgKiBob3dldmVyIHRocm91Z2hwdXQgZHJvcHMgYnkgZmlmdHkgcGVyY2VudCBpZiB0aGUgZmlsZSBzeXN0ZW0KKyAqIGlzIHJ1biBhdCBiZXR3ZWVuIDk1JSBhbmQgMTAwJSBmdWxsOyB0aHVzIHRoZSBtaW5pbXVtIGRlZmF1bHQKKyAqIHZhbHVlIG9mIGZzX21pbmZyZWUgaXMgNSUuIEhvd2V2ZXIsIHRvIGdldCBnb29kIGNsdXN0ZXJpbmcKKyAqIHBlcmZvcm1hbmNlLCAxMCUgaXMgYSBiZXR0ZXIgY2hvaWNlLiBoZW5jZSB3ZSB1c2UgMTAlIGFzIG91cgorICogZGVmYXVsdCB2YWx1ZS4gV2l0aCAxMCUgZnJlZSBzcGFjZSwgZnJhZ21lbnRhdGlvbiBpcyBub3QgYQorICogcHJvYmxlbSwgc28gd2UgY2hvb3NlIHRvIG9wdGltaXplIGZvciB0aW1lLgorICovCisjZGVmaW5lIFVGU19NSU5GUkVFICAgICAgICAgNQorI2RlZmluZSBVRlNfREVGQVVMVE9QVCAgICAgIFVGU19PUFRUSU1FCisgICAgICAgICAgICAKKy8qCisgKiBUdXJuIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlcnMgaW50byBkaXNrIGJsb2NrIGFkZHJlc3Nlcy4KKyAqIFRoaXMgbWFwcyBmaWxlIHN5c3RlbSBibG9ja3MgdG8gZGV2aWNlIHNpemUgYmxvY2tzLgorICovCisjZGVmaW5lIHVmc19mc2J0b2RiKHVzcGksIGIpCSgoYikgPDwgKHVzcGkpLT5zX2ZzYnRvZGIpCisjZGVmaW5lCXVmc19kYnRvZnNiKHVzcGksIGIpCSgoYikgPj4gKHVzcGkpLT5zX2ZzYnRvZGIpCisKKy8qCisgKiBDeWxpbmRlciBncm91cCBtYWNyb3MgdG8gbG9jYXRlIHRoaW5ncyBpbiBjeWxpbmRlciBncm91cHMuCisgKiBUaGV5IGNhbGMgZmlsZSBzeXN0ZW0gYWRkcmVzc2VzIG9mIGN5bGluZGVyIGdyb3VwIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2RlZmluZQl1ZnNfY2diYXNlKGMpCSh1c3BpLT5zX2ZwZyAqIChjKSkKKyNkZWZpbmUgdWZzX2Nnc3RhcnQoYykJKCh1c3BpKS0+ZnNfbWFnaWMgPT0gVUZTMl9NQUdJQyA/ICB1ZnNfY2diYXNlKGMpIDogXAorCSh1ZnNfY2diYXNlKGMpICArIHVzcGktPnNfY2dvZmZzZXQgKiAoKGMpICYgfnVzcGktPnNfY2dtYXNrKSkpCisjZGVmaW5lCXVmc19jZ3NibG9jayhjKQkodWZzX2Nnc3RhcnQoYykgKyB1c3BpLT5zX3NibGtubykJLyogc3VwZXIgYmxrICovCisjZGVmaW5lCXVmc19jZ2NtaW4oYykJKHVmc19jZ3N0YXJ0KGMpICsgdXNwaS0+c19jYmxrbm8pCS8qIGNnIGJsb2NrICovCisjZGVmaW5lCXVmc19jZ2ltaW4oYykJKHVmc19jZ3N0YXJ0KGMpICsgdXNwaS0+c19pYmxrbm8pCS8qIGlub2RlIGJsayAqLworI2RlZmluZQl1ZnNfY2dkbWluKGMpCSh1ZnNfY2dzdGFydChjKSArIHVzcGktPnNfZGJsa25vKQkvKiAxc3QgZGF0YSAqLworCisvKgorICogTWFjcm9zIGZvciBoYW5kbGluZyBpbm9kZSBudW1iZXJzOgorICogICAgIGlub2RlIG51bWJlciB0byBmaWxlIHN5c3RlbSBibG9jayBvZmZzZXQuCisgKiAgICAgaW5vZGUgbnVtYmVyIHRvIGN5bGluZGVyIGdyb3VwIG51bWJlci4KKyAqICAgICBpbm9kZSBudW1iZXIgdG8gZmlsZSBzeXN0ZW0gYmxvY2sgYWRkcmVzcy4KKyAqLworI2RlZmluZQl1ZnNfaW5vdG9jZyh4KQkJKCh4KSAvIHVzcGktPnNfaXBnKQorI2RlZmluZQl1ZnNfaW5vdG9jZ29mZih4KQkoKHgpICUgdXNwaS0+c19pcGcpCisjZGVmaW5lCXVmc19pbm90b2ZzYmEoeCkJKCgodTY0KXVmc19jZ2ltaW4odWZzX2lub3RvY2coeCkpKSArIHVmc19pbm90b2Nnb2ZmKHgpIC8gdXNwaS0+c19pbm9wZikKKyNkZWZpbmUJdWZzX2lub3RvZnNibyh4KQkoKHgpICUgdXNwaS0+c19pbm9wZikKKworLyoKKyAqIENvbXB1dGUgdGhlIGN5bGluZGVyIGFuZCByb3RhdGlvbmFsIHBvc2l0aW9uIG9mIGEgY3lsIGJsb2NrIGFkZHIuCisgKi8KKyNkZWZpbmUgdWZzX2NidG9jeWxubyhibm8pIFwKKwkoKGJubykgKiB1c3BpLT5zX25zcGYgLyB1c3BpLT5zX3NwYykKKyNkZWZpbmUgdWZzX2NidG9ycG9zKGJubykgXAorCSgoKChibm8pICogdXNwaS0+c19uc3BmICUgdXNwaS0+c19zcGMgLyB1c3BpLT5zX25zZWN0IFwKKwkqIHVzcGktPnNfdHJhY2tza2V3ICsgKGJubykgKiB1c3BpLT5zX25zcGYgJSB1c3BpLT5zX3NwYyBcCisJJSB1c3BpLT5zX25zZWN0ICogdXNwaS0+c19pbnRlcmxlYXZlKSAlIHVzcGktPnNfbnNlY3QgXAorCSogdXNwaS0+c19ucnBvcykgLyB1c3BpLT5zX25wc2VjdCkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIG9wdGltaXplIGNlcnRhaW4gZnJlcXVlbnRseSBjYWxjdWxhdGVkCisgKiBxdWFudGl0aWVzIGJ5IHVzaW5nIHNoaWZ0cyBhbmQgbWFza3MgaW4gcGxhY2Ugb2YgZGl2aXNpb25zCisgKiBtb2R1bG9zIGFuZCBtdWx0aXBsaWNhdGlvbnMuCisgKi8KKyNkZWZpbmUgdWZzX2Jsa29mZihsb2MpCQkoKGxvYykgJiB1c3BpLT5zX3FibWFzaykKKyNkZWZpbmUgdWZzX2ZyYWdvZmYobG9jKQkoKGxvYykgJiB1c3BpLT5zX3FmbWFzaykKKyNkZWZpbmUgdWZzX2xibGt0b3NpemUoYmxrKQkoKGJsaykgPDwgdXNwaS0+c19ic2hpZnQpCisjZGVmaW5lIHVmc19sYmxrbm8obG9jKQkJKChsb2MpID4+IHVzcGktPnNfYnNoaWZ0KQorI2RlZmluZSB1ZnNfbnVtZnJhZ3MobG9jKQkoKGxvYykgPj4gdXNwaS0+c19mc2hpZnQpCisjZGVmaW5lIHVmc19ibGtyb3VuZHVwKHNpemUpCSgoKHNpemUpICsgdXNwaS0+c19xYm1hc2spICYgdXNwaS0+c19ibWFzaykKKyNkZWZpbmUgdWZzX2ZyYWdyb3VuZHVwKHNpemUpCSgoKHNpemUpICsgdXNwaS0+c19xZm1hc2spICYgdXNwaS0+c19mbWFzaykKKyNkZWZpbmUgdWZzX2ZyYWdzdG9ibGtzKGZyYWdzKQkoKGZyYWdzKSA+PiB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSB1ZnNfYmxrc3RvZnJhZ3MoYmxrcykJKChibGtzKSA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSB1ZnNfZnJhZ251bShmc2IpCSgoZnNiKSAmIHVzcGktPnNfZnBibWFzaykKKyNkZWZpbmUgdWZzX2Jsa251bShmc2IpCQkoKGZzYikgJiB+dXNwaS0+c19mcGJtYXNrKQorCisjZGVmaW5lCVVGU19NQVhOQU1MRU4gMjU1CisjZGVmaW5lIFVGU19NQVhNTlRMRU4gNTEyCisjZGVmaW5lIFVGUzJfTUFYTU5UTEVOIDQ2OAorI2RlZmluZSBVRlMyX01BWFZPTExFTiAzMgorI2RlZmluZSBVRlNfTUFYQ1NCVUZTIDMxCisjZGVmaW5lIFVGU19MSU5LX01BWCAzMjAwMAorLyoKKyNkZWZpbmUJVUZTMl9OT0NTUFRSUwkoKDEyOCAvIHNpemVvZih2b2lkICopKSAtIDQpCisqLworI2RlZmluZQlVRlMyX05PQ1NQVFJTCTI4CisKKy8qCisgKiBVRlNfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKiAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDQpCisgKi8KKyNkZWZpbmUgVUZTX0RJUl9QQUQJCQk0CisjZGVmaW5lIFVGU19ESVJfUk9VTkQJCQkoVUZTX0RJUl9QQUQgLSAxKQorI2RlZmluZSBVRlNfRElSX1JFQ19MRU4obmFtZV9sZW4pCSgoKG5hbWVfbGVuKSArIDEgKyA4ICsgVUZTX0RJUl9ST1VORCkgJiB+VUZTX0RJUl9ST1VORCkKKworc3RydWN0IHVmc190aW1ldmFsIHsKKwlfX2ZzMzIJdHZfc2VjOworCV9fZnMzMgl0dl91c2VjOworfTsKKworc3RydWN0IHVmc19kaXJfZW50cnkgeworCV9fZnMzMiAgZF9pbm87CQkJLyogaW5vZGUgbnVtYmVyIG9mIHRoaXMgZW50cnkgKi8KKwlfX2ZzMTYgIGRfcmVjbGVuOwkJLyogbGVuZ3RoIG9mIHRoaXMgZW50cnkgKi8KKwl1bmlvbiB7CisJCV9fZnMxNglkX25hbWxlbjsJCS8qIGFjdHVhbCBsZW5ndGggb2YgZF9uYW1lICovCisJCXN0cnVjdCB7CisJCQlfX3U4CWRfdHlwZTsJCS8qIGZpbGUgdHlwZSAqLworCQkJX191OAlkX25hbWxlbjsJLyogbGVuZ3RoIG9mIHN0cmluZyBpbiBkX25hbWUgKi8KKwkJfSBkXzQ0OworCX0gZF91OworCV9fdTgJZF9uYW1lW1VGU19NQVhOQU1MRU4gKyAxXTsJLyogZmlsZSBuYW1lICovCit9OworCitzdHJ1Y3QgdWZzX2NzdW0geworCV9fZnMzMgljc19uZGlyOwkvKiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgKi8KKwlfX2ZzMzIJY3NfbmJmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKwlfX2ZzMzIJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX2ZzMzIJY3NfbmZmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworfTsKK3N0cnVjdCB1ZnMyX2NzdW1fdG90YWwgeworCV9fZnM2NAljc19uZGlyOwkvKiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgKi8KKwlfX2ZzNjQJY3NfbmJmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKwlfX2ZzNjQJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX2ZzNjQJY3NfbmZmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworCV9fZnM2NCAgIGNzX251bWNsdXN0ZXJzOwkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLworCV9fZnM2NCAgIGNzX3NwYXJlWzNdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCit9OworCitzdHJ1Y3QgdWZzX2NzdW1fY29yZSB7CisJX191NjQJY3NfbmRpcjsJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzICovCisJX191NjQJY3NfbmJmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKwlfX3U2NAljc19uaWZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCV9fdTY0CWNzX25mZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KKwlfX3U2NCAgIGNzX251bWNsdXN0ZXJzOwkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLworfTsKKworLyoKKyAqIEZpbGUgc3lzdGVtIGZsYWdzCisgKi8KKyNkZWZpbmUgVUZTX1VOQ0xFQU4gICAgICAweDAxICAgIC8qIGZpbGUgc3lzdGVtIG5vdCBjbGVhbiBhdCBtb3VudCAodW51c2VkKSAqLworI2RlZmluZSBVRlNfRE9TT0ZUREVQICAgIDB4MDIgICAgLyogZmlsZSBzeXN0ZW0gdXNpbmcgc29mdCBkZXBlbmRlbmNpZXMgKi8KKyNkZWZpbmUgVUZTX05FRURTRlNDSyAgICAweDA0ICAgIC8qIG5lZWRzIHN5bmMgZnNjayAoRnJlZUJTRCBjb21wYXQsIHVudXNlZCkgKi8KKyNkZWZpbmUgVUZTX0lOREVYRElSUyAgICAweDA4ICAgIC8qIGtlcm5lbCBzdXBwb3J0cyBpbmRleGVkIGRpcmVjdG9yaWVzICovCisjZGVmaW5lIFVGU19BQ0xTICAgICAgICAgMHgxMCAgICAvKiBmaWxlIHN5c3RlbSBoYXMgQUNMcyBlbmFibGVkICovCisjZGVmaW5lIFVGU19NVUxUSUxBQkVMICAgMHgyMCAgICAvKiBmaWxlIHN5c3RlbSBpcyBNQUMgbXVsdGktbGFiZWwgKi8KKyNkZWZpbmUgVUZTX0ZMQUdTX1VQREFURUQgMHg4MCAgIC8qIGZsYWdzIGhhdmUgYmVlbiBtb3ZlZCB0byBuZXcgbG9jYXRpb24gKi8KKworI2lmIDAKKy8qCisgKiBUaGlzIGlzIHRoZSBhY3R1YWwgc3VwZXJibG9jaywgYXMgaXQgaXMgbGFpZCBvdXQgb24gdGhlIGRpc2suCisgKiBEbyBOT1QgdXNlIHRoaXMgc3RydWN0dXJlLCBiZWNhdXNlIG9mIHNpemVvZih1ZnNfc3VwZXJfYmxvY2spID4gNTEyIGFuZAorICogaXQgbWF5IG9jY3VweSBzZXZlcmFsIGJsb2NrcywgdXNlCisgKiBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrXyhmaXJzdCxzZWNvbmQsdGhpcmQpIGluc3RlYWQuCisgKi8KK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19saW5rOwkvKiBVTlVTRUQgKi8KKwkJfSBmc180MjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgZmxhZyAqLworCQl9IGZzX3N1bjsKKwl9IGZzX3UwOworCV9fZnMzMglmc19ybGluazsJLyogVU5VU0VEICovCisJX19mczMyCWZzX3NibGtubzsJLyogYWRkciBvZiBzdXBlci1ibG9jayBpbiBmaWxlc3lzICovCisJX19mczMyCWZzX2NibGtubzsJLyogb2Zmc2V0IG9mIGN5bC1ibG9jayBpbiBmaWxlc3lzICovCisJX19mczMyCWZzX2libGtubzsJLyogb2Zmc2V0IG9mIGlub2RlLWJsb2NrcyBpbiBmaWxlc3lzICovCisJX19mczMyCWZzX2RibGtubzsJLyogb2Zmc2V0IG9mIGZpcnN0IGRhdGEgYWZ0ZXIgY2cgKi8KKwlfX2ZzMzIJZnNfY2dvZmZzZXQ7CS8qIGN5bGluZGVyIGdyb3VwIG9mZnNldCBpbiBjeWxpbmRlciAqLworCV9fZnMzMglmc19jZ21hc2s7CS8qIHVzZWQgdG8gY2FsYyBtb2QgZnNfbnRyYWsgKi8KKwlfX2ZzMzIJZnNfdGltZTsJLyogbGFzdCB0aW1lIHdyaXR0ZW4gLS0gdGltZV90ICovCisJX19mczMyCWZzX3NpemU7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKwlfX2ZzMzIJZnNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCV9fZnMzMglmc19uY2c7CQkvKiBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzICovCisJX19mczMyCWZzX2JzaXplOwkvKiBzaXplIG9mIGJhc2ljIGJsb2NrcyBpbiBmcyAqLworCV9fZnMzMglmc19mc2l6ZTsJLyogc2l6ZSBvZiBmcmFnIGJsb2NrcyBpbiBmcyAqLworCV9fZnMzMglmc19mcmFnOwkvKiBudW1iZXIgb2YgZnJhZ3MgaW4gYSBibG9jayBpbiBmcyAqLworLyogdGhlc2UgYXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCV9fZnMzMglmc19taW5mcmVlOwkvKiBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2YgZnJlZSBibG9ja3MgKi8KKwlfX2ZzMzIJZnNfcm90ZGVsYXk7CS8qIG51bSBvZiBtcyBmb3Igb3B0aW1hbCBuZXh0IGJsb2NrICovCisJX19mczMyCWZzX3JwczsJCS8qIGRpc2sgcmV2b2x1dGlvbnMgcGVyIHNlY29uZCAqLworLyogdGhlc2UgZmllbGRzIGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBvdGhlcnMgKi8KKwlfX2ZzMzIJZnNfYm1hc2s7CS8qIGBgYmxrb2ZmJycgY2FsYyBvZiBibGsgb2Zmc2V0cyAqLworCV9fZnMzMglmc19mbWFzazsJLyogYGBmcmFnb2ZmJycgY2FsYyBvZiBmcmFnIG9mZnNldHMgKi8KKwlfX2ZzMzIJZnNfYnNoaWZ0OwkvKiBgYGxibGtubycnIGNhbGMgb2YgbG9naWNhbCBibGtubyAqLworCV9fZnMzMglmc19mc2hpZnQ7CS8qIGBgbnVtZnJhZ3MnJyBjYWxjIG51bWJlciBvZiBmcmFncyAqLworLyogdGhlc2UgYXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCV9fZnMzMglmc19tYXhjb250aWc7CS8qIG1heCBudW1iZXIgb2YgY29udGlndW91cyBibGtzICovCisJX19mczMyCWZzX21heGJwZzsJLyogbWF4IG51bWJlciBvZiBibGtzIHBlciBjeWwgZ3JvdXAgKi8KKy8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCisJX19mczMyCWZzX2ZyYWdzaGlmdDsJLyogYmxvY2sgdG8gZnJhZyBzaGlmdCAqLworCV9fZnMzMglmc19mc2J0b2RiOwkvKiBmc2J0b2RiIGFuZCBkYnRvZnNiIHNoaWZ0IGNvbnN0YW50ICovCisJX19mczMyCWZzX3Nic2l6ZTsJLyogYWN0dWFsIHNpemUgb2Ygc3VwZXIgYmxvY2sgKi8KKwlfX2ZzMzIJZnNfY3NtYXNrOwkvKiBjc3VtIGJsb2NrIG9mZnNldCAqLworCV9fZnMzMglmc19jc3NoaWZ0OwkvKiBjc3VtIGJsb2NrIG51bWJlciAqLworCV9fZnMzMglmc19uaW5kaXI7CS8qIHZhbHVlIG9mIE5JTkRJUiAqLworCV9fZnMzMglmc19pbm9wYjsJLyogdmFsdWUgb2YgSU5PUEIgKi8KKwlfX2ZzMzIJZnNfbnNwZjsJLyogdmFsdWUgb2YgTlNQRiAqLworLyogeWV0IGFub3RoZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKi8KKwlfX2ZzMzIJZnNfb3B0aW07CS8qIG9wdGltaXphdGlvbiBwcmVmZXJlbmNlLCBzZWUgYmVsb3cgKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBoYXJkd2FyZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19ucHNlY3Q7CS8qICMgc2VjdG9ycy90cmFjayBpbmNsdWRpbmcgc3BhcmVzICovCisJCX0gZnNfc3VuOworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCisJCX0gZnNfc3VueDg2OworCX0gZnNfdTE7CisJX19mczMyCWZzX2ludGVybGVhdmU7CS8qIGhhcmR3YXJlIHNlY3RvciBpbnRlcmxlYXZlICovCisJX19mczMyCWZzX3RyYWNrc2tldzsJLyogc2VjdG9yIDAgc2tldywgcGVyIHRyYWNrICovCisvKiBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBmaWxlc3lzdGVtIChjdXJyZW50bHkgdW51c2VkIGFuZCB1bm1haW50YWluZWQpICovCisvKiBJbiA0LjMgVGFob2UgdGhpcyBzcGFjZSBpcyB1c2VkIGJ5IGZzX2hlYWRzd2l0Y2ggYW5kIGZzX3Rya3NlZWsgKi8KKy8qIE5laXRoZXIgb2YgdGhvc2UgZmllbGRzIGlzIHVzZWQgaW4gdGhlIFRhaG9lIGNvZGUgcmlnaHQgbm93IGJ1dCAqLworLyogdGhlcmUgY291bGQgYmUgcHJvYmxlbXMgaWYgdGhleSBhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJX19mczMyCWZzX2lkWzJdOwkvKiBmaWxlIHN5c3RlbSBpZCAqLworLyogc2l6ZXMgZGV0ZXJtaW5lZCBieSBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzIGFuZCB0aGVpciBzaXplcyAqLworCV9fZnMzMglmc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJX19mczMyCWZzX2Nzc2l6ZTsJLyogc2l6ZSBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCV9fZnMzMglmc19jZ3NpemU7CS8qIGN5bGluZGVyIGdyb3VwIHNpemUgKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBoYXJkd2FyZSAqLworCV9fZnMzMglmc19udHJhazsJLyogdHJhY2tzIHBlciBjeWxpbmRlciAqLworCV9fZnMzMglmc19uc2VjdDsJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwlfX2ZzMzIJZnNfc3BjOwkJLyogc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKy8qIHRoaXMgY29tZXMgZnJvbSB0aGUgZGlzayBkcml2ZXIgcGFydGl0aW9uaW5nICovCisJX19mczMyCWZzX25jeWw7CS8qIGN5bGluZGVycyBpbiBmaWxlIHN5c3RlbSAqLworLyogdGhlc2UgZmllbGRzIGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBvdGhlcnMgKi8KKwlfX2ZzMzIJZnNfY3BnOwkJLyogY3lsaW5kZXJzIHBlciBncm91cCAqLworCV9fZnMzMglmc19pcGc7CQkvKiBpbm9kZXMgcGVyIGN5bGluZGVyIGdyb3VwICovCisJX19mczMyCWZzX2ZwZzsJCS8qIGJsb2NrcyBwZXIgZ3JvdXAgKiBmc19mcmFnICovCisvKiB0aGlzIGRhdGEgbXVzdCBiZSByZS1jb21wdXRlZCBhZnRlciBjcmFzaGVzICovCisJc3RydWN0IHVmc19jc3VtIGZzX2NzdG90YWw7CS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgY2xlYXJlZCBhdCBtb3VudCB0aW1lICovCisJX19zOAlmc19mbW9kOwkvKiBzdXBlciBibG9jayBtb2RpZmllZCBmbGFnICovCisJX19zOAlmc19jbGVhbjsJLyogZmlsZSBzeXN0ZW0gaXMgY2xlYW4gZmxhZyAqLworCV9fczgJZnNfcm9ubHk7CS8qIG1vdW50ZWQgcmVhZC1vbmx5IGZsYWcgKi8KKwlfX3M4CWZzX2ZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fczgJZnNfZnNtbnRbVUZTX01BWE1OVExFTl07LyogbmFtZSBtb3VudGVkIG9uICovCisJCQlfX2ZzMzIJZnNfY2dyb3RvcjsJLyogbGFzdCBjZyBzZWFyY2hlZCAqLworCQkJX19mczMyCWZzX2NzcFtVRlNfTUFYQ1NCVUZTXTsvKmxpc3Qgb2YgZnNfY3MgaW5mbyBidWZmZXJzICovCisJCQlfX2ZzMzIJZnNfbWF4Y2x1c3RlcjsKKwkJCV9fZnMzMglmc19jcGM7CQkvKiBjeWwgcGVyIGN5Y2xlIGluIHBvc3RibCAqLworCQkJX19mczE2CWZzX29wb3N0YmxbMTZdWzhdOyAvKiBvbGQgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJCX0gZnNfdTE7CisJCXN0cnVjdCB7CisJCQlfX3M4ICBmc19mc21udFtVRlMyX01BWE1OVExFTl07CS8qIG5hbWUgbW91bnRlZCBvbiAqLworCQkJX191OCAgIGZzX3ZvbG5hbWVbVUZTMl9NQVhWT0xMRU5dOyAvKiB2b2x1bWUgbmFtZSAqLworCQkJX19mczY0ICBmc19zd3VpZDsJCS8qIHN5c3RlbS13aWRlIHVpZCAqLworCQkJX19mczMyICBmc19wYWQ7CS8qIGR1ZSB0byBhbGlnbm1lbnQgb2YgZnNfc3d1aWQgKi8KKwkJCV9fZnMzMiAgIGZzX2Nncm90b3I7ICAgICAvKiBsYXN0IGNnIHNlYXJjaGVkICovCisJCQlfX2ZzMzIgICBmc19vY3NwW1VGUzJfTk9DU1BUUlNdOyAvKmxpc3Qgb2YgZnNfY3MgaW5mbyBidWZmZXJzICovCisJCQlfX2ZzMzIgICBmc19jb250aWdkaXJzOy8qIyBvZiBjb250aWd1b3VzbHkgYWxsb2NhdGVkIGRpcnMgKi8KKwkJCV9fZnMzMiAgIGZzX2NzcDsJLyogY2cgc3VtbWFyeSBpbmZvIGJ1ZmZlciBmb3IgZnNfY3MgKi8KKwkJCV9fZnMzMiAgIGZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIgICBmc19hY3RpdmU7LyogdXNlZCBieSBzbmFwc2hvdHMgdG8gdHJhY2sgZnMgKi8KKwkJCV9fZnMzMiAgIGZzX29sZF9jcGM7CS8qIGN5bCBwZXIgY3ljbGUgaW4gcG9zdGJsICovCisJCQlfX2ZzMzIgICBmc19tYXhic2l6ZTsvKm1heGltdW0gYmxvY2tpbmcgZmFjdG9yIHBlcm1pdHRlZCAqLworCQkJX19mczY0ICAgZnNfc3BhcmVjb242NFsxN107LypvbGQgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJCQlfX2ZzNjQgICBmc19zYmxvY2tsb2M7IC8qIGJ5dGUgb2Zmc2V0IG9mIHN0YW5kYXJkIHN1cGVyYmxvY2sgKi8KKwkJCXN0cnVjdCAgdWZzMl9jc3VtX3RvdGFsIGZzX2NzdG90YWw7LypjeWxpbmRlciBzdW1tYXJ5IGluZm9ybWF0aW9uKi8KKwkJCXN0cnVjdCAgdWZzX3RpbWV2YWwgICAgZnNfdGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuICovCisJCQlfX2ZzNjQgICAgZnNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKwkJCV9fZnM2NCAgICBmc19kc2l6ZTsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCisJCQlfX2ZzNjQgICBmc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJCQlfX2ZzNjQgICAgZnNfcGVuZGluZ2Jsb2NrczsvKiBibG9ja3MgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCQkJX19mczMyICAgIGZzX3BlbmRpbmdpbm9kZXM7Lyppbm9kZXMgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCQl9IGZzX3UyOworCX0gIGZzX3UxMTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCisJCQlfX2ZzMzIJZnNfcmVjbGFpbTsKKwkJCV9fZnMzMglmc19zcGFyZWNvbjJbMV07CisJCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIHRpbWUgc3RhbXAgKi8KKwkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KKwkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KKwkJfSBmc19zdW47CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCisJCQlfX2ZzMzIJZnNfcmVjbGFpbTsKKwkJCV9fZnMzMglmc19zcGFyZWNvbjJbMV07CisJCQlfX2ZzMzIJZnNfbnBzZWN0OwkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLworCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLworCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLworCQl9IGZzX3N1bng4NjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zcGFyZWNvbls1MF07LyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KKwkJCV9fZnMzMglmc19jb250aWdzdW1zaXplOy8qIHNpemUgb2YgY2x1c3RlciBzdW1tYXJ5IGFycmF5ICovCisJCQlfX2ZzMzIJZnNfbWF4c3ltbGlua2xlbjsvKiBtYXggbGVuZ3RoIG9mIGFuIGludGVybmFsIHN5bWxpbmsgKi8KKwkJCV9fZnMzMglmc19pbm9kZWZtdDsJLyogZm9ybWF0IG9mIG9uLWRpc2sgaW5vZGVzICovCisJCQlfX2ZzMzIJZnNfbWF4ZmlsZXNpemVbMl07CS8qIG1heCByZXByZXNlbnRhYmxlIGZpbGUgc2l6ZSAqLworCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLworCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLworCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCisJCX0gZnNfNDQ7CisJfSBmc191MjsKKwlfX2ZzMzIJZnNfcG9zdGJsZm9ybWF0OwkvKiBmb3JtYXQgb2YgcG9zaXRpb25hbCBsYXlvdXQgdGFibGVzICovCisJX19mczMyCWZzX25ycG9zOwkJLyogbnVtYmVyIG9mIHJvdGF0aW9uYWwgcG9zaXRpb25zICovCisJX19mczMyCWZzX3Bvc3RibG9mZjsJCS8qIChfX3MxNikgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJX19mczMyCWZzX3JvdGJsb2ZmOwkJLyogKF9fdTgpIGJsb2NrcyBmb3IgZWFjaCByb3RhdGlvbiAqLworCV9fZnMzMglmc19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLworCV9fdTgJZnNfc3BhY2VbMV07CQkvKiBsaXN0IG9mIGJsb2NrcyBmb3IgZWFjaCByb3RhdGlvbiAqLworfTsKKyNlbmRpZi8qc3RydWN0IHVmc19zdXBlcl9ibG9jayovCisKKy8qCisgKiBQcmVmZXJlbmNlIGZvciBvcHRpbWl6YXRpb24uCisgKi8KKyNkZWZpbmUgVUZTX09QVFRJTUUJMAkvKiBtaW5pbWl6ZSBhbGxvY2F0aW9uIHRpbWUgKi8KKyNkZWZpbmUgVUZTX09QVFNQQUNFCTEJLyogbWluaW1pemUgZGlzayBmcmFnbWVudGF0aW9uICovCisKKy8qCisgKiBSb3RhdGlvbmFsIGxheW91dCB0YWJsZSBmb3JtYXQgdHlwZXMKKyAqLworI2RlZmluZSBVRlNfNDJQT1NUQkxGTVQJCS0xCS8qIDQuMkJTRCByb3RhdGlvbmFsIHRhYmxlIGZvcm1hdCAqLworI2RlZmluZSBVRlNfRFlOQU1JQ1BPU1RCTEZNVAkxCS8qIGR5bmFtaWMgcm90YXRpb25hbCB0YWJsZSBmb3JtYXQgKi8KKworLyoKKyAqIENvbnZlcnQgY3lsaW5kZXIgZ3JvdXAgdG8gYmFzZSBhZGRyZXNzIG9mIGl0cyBnbG9iYWwgc3VtbWFyeSBpbmZvLgorICovCisjZGVmaW5lIGZzX2NzKGluZHgpIHNfY3NwWyhpbmR4KV0KKworLyoKKyAqIEN5bGluZGVyIGdyb3VwIGJsb2NrIGZvciBhIGZpbGUgc3lzdGVtLgorICoKKyAqIFdyaXRhYmxlIGZpZWxkcyBpbiB0aGUgY3lsaW5kZXIgZ3JvdXAgYXJlIHByb3RlY3RlZCBieSB0aGUgYXNzb2NpYXRlZAorICogc3VwZXIgYmxvY2sgbG9jayBmcy0+ZnNfbG9jay4KKyAqLworI2RlZmluZQlDR19NQUdJQwkweDA5MDI1NQorI2RlZmluZSB1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykgXAorCShmczMyX3RvX2NwdSgoc2IpLCAodWNnKS0+Y2dfbWFnaWMpID09IENHX01BR0lDKQorLyoKKyAqIE1hY3JvcyBmb3IgYWNjZXNzIHRvIG9sZCBjeWxpbmRlciBncm91cCBhcnJheSBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgdWZzX29jZ19ibGt0b3Qoc2IsIHVjZykgICAgICBmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19idG90KQorI2RlZmluZSB1ZnNfb2NnX2Jsa3Moc2IsIHVjZywgY3lsbm8pIGZzMzJfdG9fY3B1KChzYiksICgoc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgKikodWNnKSktPmNnX2JbY3lsbm9dKQorI2RlZmluZSB1ZnNfb2NnX2lub3N1c2VkKHNiLCB1Y2cpICAgIGZzMzJfdG9fY3B1KChzYiksICgoc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgKikodWNnKSktPmNnX2l1c2VkKQorI2RlZmluZSB1ZnNfb2NnX2Jsa3NmcmVlKHNiLCB1Y2cpICAgIGZzMzJfdG9fY3B1KChzYiksICgoc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgKikodWNnKSktPmNnX2ZyZWUpCisjZGVmaW5lIHVmc19vY2dfY2hrbWFnaWMoc2IsIHVjZykgXAorCShmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19tYWdpYykgPT0gQ0dfTUFHSUMpCisKKy8qCisgKiBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGlzIDE3MiBCCisgKi8KK3N0cnVjdAl1ZnNfY3lsaW5kZXJfZ3JvdXAgeworCV9fZnMzMgljZ19saW5rOwkJLyogbGlua2VkIGxpc3Qgb2YgY3lsIGdyb3VwcyAqLworCV9fZnMzMgljZ19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLworCV9fZnMzMgljZ190aW1lOwkJLyogdGltZSBsYXN0IHdyaXR0ZW4gKi8KKwlfX2ZzMzIJY2dfY2d4OwkJCS8qIHdlIGFyZSB0aGUgY2d4J3RoIGN5bGluZGVyIGdyb3VwICovCisJX19mczE2CWNnX25jeWw7CQkvKiBudW1iZXIgb2YgY3lsJ3MgdGhpcyBjZyAqLworCV9fZnMxNgljZ19uaWJsazsJCS8qIG51bWJlciBvZiBpbm9kZSBibG9ja3MgdGhpcyBjZyAqLworCV9fZnMzMgljZ19uZGJsazsJCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyB0aGlzIGNnICovCisJc3RydWN0CXVmc19jc3VtIGNnX2NzOwkJLyogY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworCV9fZnMzMgljZ19yb3RvcjsJCS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBibG9jayAqLworCV9fZnMzMgljZ19mcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgZnJhZyAqLworCV9fZnMzMgljZ19pcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgaW5vZGUgKi8KKwlfX2ZzMzIJY2dfZnJzdW1bVUZTX01BWEZSQUddOwkvKiBjb3VudHMgb2YgYXZhaWxhYmxlIGZyYWdzICovCisJX19mczMyCWNnX2J0b3RvZmY7CQkvKiAoX191MzIpIGJsb2NrIHRvdGFscyBwZXIgY3lsaW5kZXIgKi8KKwlfX2ZzMzIJY2dfYm9mZjsJCS8qIChzaG9ydCkgZnJlZSBibG9jayBwb3NpdGlvbnMgKi8KKwlfX2ZzMzIJY2dfaXVzZWRvZmY7CQkvKiAoY2hhcikgdXNlZCBpbm9kZSBtYXAgKi8KKwlfX2ZzMzIJY2dfZnJlZW9mZjsJCS8qICh1X2NoYXIpIGZyZWUgYmxvY2sgbWFwICovCisJX19mczMyCWNnX25leHRmcmVlb2ZmOwkJLyogKHVfY2hhcikgbmV4dCBhdmFpbGFibGUgc3BhY2UgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJY2dfY2x1c3RlcnN1bW9mZjsJLyogKHVfaW50MzIpIGNvdW50cyBvZiBhdmFpbCBjbHVzdGVycyAqLworCQkJX19mczMyCWNnX2NsdXN0ZXJvZmY7CQkvKiAodV9pbnQ4KSBmcmVlIGNsdXN0ZXIgbWFwICovCisJCQlfX2ZzMzIJY2dfbmNsdXN0ZXJibGtzOwkvKiBudW1iZXIgb2YgY2x1c3RlcnMgdGhpcyBjZyAqLworCQkJX19mczMyCWNnX3NwYXJlY29uWzEzXTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwkJfSBjZ180NDsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMgljZ19jbHVzdGVyc3Vtb2ZmOy8qICh1X2ludDMyKSBjb3VudHMgb2YgYXZhaWwgY2x1c3RlcnMgKi8KKwkJCV9fZnMzMgljZ19jbHVzdGVyb2ZmOwkvKiAodV9pbnQ4KSBmcmVlIGNsdXN0ZXIgbWFwICovCisJCQlfX2ZzMzIJY2dfbmNsdXN0ZXJibGtzOy8qIG51bWJlciBvZiBjbHVzdGVycyB0aGlzIGNnICovCisJCQlfX2ZzMzIgICBjZ19uaWJsazsgLyogbnVtYmVyIG9mIGlub2RlIGJsb2NrcyB0aGlzIGNnICovCisJCQlfX2ZzMzIgICBjZ19pbml0ZWRpYmxrOwkvKiBsYXN0IGluaXRpYWxpemVkIGlub2RlICovCisJCQlfX2ZzMzIgICBjZ19zcGFyZWNvbjMyWzNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJCQlfX2ZzNjQgICBjZ190aW1lOwkvKiB0aW1lIGxhc3Qgd3JpdHRlbiAqLworCQkJX19mczY0CWNnX3NwYXJlY29uWzNdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCQl9IGNnX3UyOworCQlfX2ZzMzIJY2dfc3BhcmVjb25bMTZdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCX0gY2dfdTsKKwlfX3U4CWNnX3NwYWNlWzFdOwkJLyogc3BhY2UgZm9yIGN5bGluZGVyIGdyb3VwIG1hcHMgKi8KKy8qIGFjdHVhbGx5IGxvbmdlciAqLworfTsKKworLyogSGlzdG9yaWMgQ3lsaW5kZXIgZ3JvdXAgaW5mbyAqLworc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgeworCV9fZnMzMgljZ19saW5rOwkJLyogbGlua2VkIGxpc3Qgb2YgY3lsIGdyb3VwcyAqLworCV9fZnMzMgljZ19ybGluazsJCS8qIGZvciBpbmNvcmUgY3lsIGdyb3VwcyAgICAgKi8KKwlfX2ZzMzIJY2dfdGltZTsJCS8qIHRpbWUgbGFzdCB3cml0dGVuICovCisJX19mczMyCWNnX2NneDsJCQkvKiB3ZSBhcmUgdGhlIGNneCd0aCBjeWxpbmRlciBncm91cCAqLworCV9fZnMxNgljZ19uY3lsOwkJLyogbnVtYmVyIG9mIGN5bCdzIHRoaXMgY2cgKi8KKwlfX2ZzMTYJY2dfbmlibGs7CQkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KKwlfX2ZzMzIJY2dfbmRibGs7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdGhpcyBjZyAqLworCXN0cnVjdAl1ZnNfY3N1bSBjZ19jczsJCS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKwlfX2ZzMzIJY2dfcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgYmxvY2sgKi8KKwlfX2ZzMzIJY2dfZnJvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGZyYWcgKi8KKwlfX2ZzMzIJY2dfaXJvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGlub2RlICovCisJX19mczMyCWNnX2Zyc3VtWzhdOwkJLyogY291bnRzIG9mIGF2YWlsYWJsZSBmcmFncyAqLworCV9fZnMzMgljZ19idG90WzMyXTsJCS8qIGJsb2NrIHRvdGFscyBwZXIgY3lsaW5kZXIgKi8KKwlfX2ZzMTYJY2dfYlszMl1bOF07CQkvKiBwb3NpdGlvbnMgb2YgZnJlZSBibG9ja3MgKi8KKwlfX3U4CWNnX2l1c2VkWzI1Nl07CQkvKiB1c2VkIGlub2RlIG1hcCAqLworCV9fZnMzMgljZ19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLworCV9fdTgJY2dfZnJlZVsxXTsJCS8qIGZyZWUgYmxvY2sgbWFwICovCisvKiBhY3R1YWxseSBsb25nZXIgKi8KK307CisKKy8qCisgKiBzdHJ1Y3R1cmUgb2YgYW4gb24tZGlzayBpbm9kZQorICovCitzdHJ1Y3QgdWZzX2lub2RlIHsKKwlfX2ZzMTYJdWlfbW9kZTsJCS8qICAweDAgKi8KKwlfX2ZzMTYJdWlfbmxpbms7CQkvKiAgMHgyICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczE2CXVpX3N1aWQ7CS8qICAweDQgKi8KKwkJCV9fZnMxNgl1aV9zZ2lkOwkvKiAgMHg2ICovCisJCX0gb2xkaWRzOworCQlfX2ZzMzIJdWlfaW51bWJlcjsJCS8qICAweDQgbHNmOiBpbm9kZSBudW1iZXIgKi8KKwkJX19mczMyCXVpX2F1dGhvcjsJCS8qICAweDQgR05VIEhVUkQ6IGF1dGhvciAqLworCX0gdWlfdTE7CisJX19mczY0CXVpX3NpemU7CQkvKiAgMHg4ICovCisJc3RydWN0IHVmc190aW1ldmFsIHVpX2F0aW1lOwkvKiAweDEwIGFjY2VzcyAqLworCXN0cnVjdCB1ZnNfdGltZXZhbCB1aV9tdGltZTsJLyogMHgxOCBtb2RpZmljYXRpb24gKi8KKwlzdHJ1Y3QgdWZzX3RpbWV2YWwgdWlfY3RpbWU7CS8qIDB4MjAgY3JlYXRpb24gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJdWlfZGJbVUZTX05EQUREUl07LyogMHgyOCBkYXRhIGJsb2NrcyAqLworCQkJX19mczMyCXVpX2liW1VGU19OSU5ESVJdOy8qIDB4NTggaW5kaXJlY3QgYmxvY2tzICovCisJCX0gdWlfYWRkcjsKKwkJX191OAl1aV9zeW1saW5rWzQqKFVGU19OREFERFIrVUZTX05JTkRJUildOy8qIDB4MjggZmFzdCBzeW1saW5rICovCisJfSB1aV91MjsKKwlfX2ZzMzIJdWlfZmxhZ3M7CQkvKiAweDY0IGltbXV0YWJsZSwgYXBwZW5kLW9ubHkuLi4gKi8KKwlfX2ZzMzIJdWlfYmxvY2tzOwkJLyogMHg2OCBibG9ja3MgaW4gdXNlICovCisJX19mczMyCXVpX2dlbjsJCQkvKiAweDZjIGxpa2UgZXh0MiBpX3ZlcnNpb24sIGZvciBORlMgc3VwcG9ydCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMgl1aV9zaGFkb3c7CS8qIDB4NzAgc2hhZG93IGlub2RlIHdpdGggc2VjdXJpdHkgZGF0YSAqLworCQkJX19mczMyCXVpX3VpZDsJCS8qIDB4NzQgbG9uZyBFRlQgdmVyc2lvbiBvZiB1aWQgKi8KKwkJCV9fZnMzMgl1aV9naWQ7CQkvKiAweDc4IGxvbmcgRUZUIHZlcnNpb24gb2YgZ2lkICovCisJCQlfX2ZzMzIJdWlfb2VmdGZsYWc7CS8qIDB4N2MgcmVzZXJ2ZWQgKi8KKwkJfSB1aV9zdW47CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJdWlfdWlkOwkJLyogMHg3MCBGaWxlIG93bmVyICovCisJCQlfX2ZzMzIJdWlfZ2lkOwkJLyogMHg3NCBGaWxlIGdyb3VwICovCisJCQlfX2ZzMzIJdWlfc3BhcmVbMl07CS8qIDB4NzggcmVzZXJ2ZWQgKi8KKwkJfSB1aV80NDsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMgl1aV91aWQ7CQkvKiAweDcwICovCisJCQlfX2ZzMzIJdWlfZ2lkOwkJLyogMHg3NCAqLworCQkJX19mczE2CXVpX21vZGVoOwkvKiAweDc4IG1vZGUgaGlnaCBiaXRzICovCisJCQlfX2ZzMTYJdWlfc3BhcmU7CS8qIDB4N0EgdW51c2VkICovCisJCQlfX2ZzMzIJdWlfdHJhbnM7CS8qIDB4N2MgZmlsZXN5c3RlbSB0cmFuc2xhdG9yICovCisJCX0gdWlfaHVyZDsKKwl9IHVpX3UzOworfTsKKworI2RlZmluZSBVRlNfTlhBRERSICAyICAgICAgICAgICAgLyogRXh0ZXJuYWwgYWRkcmVzc2VzIGluIGlub2RlLiAqLworc3RydWN0IHVmczJfaW5vZGUgeworCV9fZnMxNiAgICAgdWlfbW9kZTsgICAgICAgIC8qICAgMDogSUZNVCwgcGVybWlzc2lvbnM7IHNlZSBiZWxvdy4gKi8KKwlfX2ZzMTYgICAgIHVpX25saW5rOyAgICAgICAvKiAgIDI6IEZpbGUgbGluayBjb3VudC4gKi8KKwlfX2ZzMzIgICAgIHVpX3VpZDsgICAgICAgICAvKiAgIDQ6IEZpbGUgb3duZXIuICovCisJX19mczMyICAgICB1aV9naWQ7ICAgICAgICAgLyogICA4OiBGaWxlIGdyb3VwLiAqLworCV9fZnMzMiAgICAgdWlfYmxrc2l6ZTsgICAgIC8qICAxMjogSW5vZGUgYmxvY2tzaXplLiAqLworCV9fZnM2NCAgICAgdWlfc2l6ZTsgICAgICAgIC8qICAxNjogRmlsZSBieXRlIGNvdW50LiAqLworCV9fZnM2NCAgICAgdWlfYmxvY2tzOyAgICAgIC8qICAyNDogQnl0ZXMgYWN0dWFsbHkgaGVsZC4gKi8KKwlfX2ZzNjQgICB1aV9hdGltZTsgICAgICAgLyogIDMyOiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCV9fZnM2NCAgIHVpX210aW1lOyAgICAgICAvKiAgNDA6IExhc3QgbW9kaWZpZWQgdGltZS4gKi8KKwlfX2ZzNjQgICB1aV9jdGltZTsgICAgICAgLyogIDQ4OiBMYXN0IGlub2RlIGNoYW5nZSB0aW1lLiAqLworCV9fZnM2NCAgIHVpX2JpcnRodGltZTsgICAvKiAgNTY6IElub2RlIGNyZWF0aW9uIHRpbWUuICovCisJX19mczMyICAgICB1aV9tdGltZW5zZWM7ICAgLyogIDY0OiBMYXN0IG1vZGlmaWVkIHRpbWUuICovCisJX19mczMyICAgICB1aV9hdGltZW5zZWM7ICAgLyogIDY4OiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCV9fZnMzMiAgICAgdWlfY3RpbWVuc2VjOyAgIC8qICA3MjogTGFzdCBpbm9kZSBjaGFuZ2UgdGltZS4gKi8KKwlfX2ZzMzIgICAgIHVpX2JpcnRobnNlYzsgICAvKiAgNzY6IElub2RlIGNyZWF0aW9uIHRpbWUuICovCisJX19mczMyICAgICB1aV9nZW47ICAgICAgICAgLyogIDgwOiBHZW5lcmF0aW9uIG51bWJlci4gKi8KKwlfX2ZzMzIgICAgIHVpX2tlcm5mbGFnczsgICAvKiAgODQ6IEtlcm5lbCBmbGFncy4gKi8KKwlfX2ZzMzIgICAgIHVpX2ZsYWdzOyAgICAgICAvKiAgODg6IFN0YXR1cyBmbGFncyAoY2hmbGFncykuICovCisJX19mczMyICAgICB1aV9leHRzaXplOyAgICAgLyogIDkyOiBFeHRlcm5hbCBhdHRyaWJ1dGVzIGJsb2NrLiAqLworCV9fZnM2NCAgICAgdWlfZXh0YltVRlNfTlhBRERSXTsvKiAgOTY6IEV4dGVybmFsIGF0dHJpYnV0ZXMgYmxvY2suICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczY0ICAgICB1aV9kYltVRlNfTkRBRERSXTsgLyogMTEyOiBEaXJlY3QgZGlzayBibG9ja3MuICovCisJCQlfX2ZzNjQgICAgIHVpX2liW1VGU19OSU5ESVJdOy8qIDIwODogSW5kaXJlY3QgZGlzayBibG9ja3MuKi8KKwkJfSB1aV9hZGRyOworCV9fdTgJdWlfc3ltbGlua1syKjQqKFVGU19OREFERFIrVUZTX05JTkRJUildOy8qIDB4MjggZmFzdCBzeW1saW5rICovCisJfSB1aV91MjsKKwlfX2ZzNjQgICAgIHVpX3NwYXJlWzNdOyAgICAvKiAyMzI6IFJlc2VydmVkOyBjdXJyZW50bHkgdW51c2VkICovCit9OworCisKKy8qIEZyZWVCU0QgaGFzIHRoZXNlIGluIHN5cy9zdGF0LmggKi8KKy8qIHVpX2ZsYWdzIHRoYXQgY2FuIGJlIHNldCBieSBhIGZpbGUgb3duZXIgKi8KKyNkZWZpbmUgVUZTX1VGX1NFVFRBQkxFICAgMHgwMDAwZmZmZgorI2RlZmluZSBVRlNfVUZfTk9EVU1QICAgICAweDAwMDAwMDAxICAvKiBkbyBub3QgZHVtcCAqLworI2RlZmluZSBVRlNfVUZfSU1NVVRBQkxFICAweDAwMDAwMDAyICAvKiBpbW11dGFibGUgKGNhbid0ICJjaGFuZ2UiKSAqLworI2RlZmluZSBVRlNfVUZfQVBQRU5EICAgICAweDAwMDAwMDA0ICAvKiBhcHBlbmQtb25seSAqLworI2RlZmluZSBVRlNfVUZfT1BBUVVFICAgICAweDAwMDAwMDA4ICAvKiBkaXJlY3RvcnkgaXMgb3BhcXVlICh1bmlvbmZzKSAqLworI2RlZmluZSBVRlNfVUZfTk9VTkxJTksgICAweDAwMDAwMDEwICAvKiBjYW4ndCBiZSByZW1vdmVkIG9yIHJlbmFtZWQgKi8KKy8qIHVpX2ZsYWdzIHRoYXQgb25seSByb290IGNhbiBzZXQgKi8KKyNkZWZpbmUgVUZTX1NGX1NFVFRBQkxFICAgMHhmZmZmMDAwMAorI2RlZmluZSBVRlNfU0ZfQVJDSElWRUQgICAweDAwMDEwMDAwICAvKiBhcmNoaXZlZCAqLworI2RlZmluZSBVRlNfU0ZfSU1NVVRBQkxFICAweDAwMDIwMDAwICAvKiBpbW11dGFibGUgKGNhbid0ICJjaGFuZ2UiKSAqLworI2RlZmluZSBVRlNfU0ZfQVBQRU5EICAgICAweDAwMDQwMDAwICAvKiBhcHBlbmQtb25seSAqLworI2RlZmluZSBVRlNfU0ZfTk9VTkxJTksgICAweDAwMTAwMDAwICAvKiBjYW4ndCBiZSByZW1vdmVkIG9yIHJlbmFtZWQgKi8KKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHJlYWRpbmcgZGlzayBzdHJ1Y3R1cmVzIGxhcmdlcgorICogdGhhbiB0aGUgc2l6ZSBvZiBmcmFnbWVudC4KKyAqLworc3RydWN0IHVmc19idWZmZXJfaGVhZCB7CisJX191NjQgZnJhZ21lbnQ7CQkJLyogZmlyc3QgZnJhZ21lbnQgKi8KKwlfX3U2NCBjb3VudDsJCQkJLyogbnVtYmVyIG9mIGZyYWdtZW50cyAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoW1VGU19NQVhGUkFHXTsJLyogYnVmZmVycyAqLworfTsKKworc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8geworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgY191Ymg7CisJX191MzIJY19jZ3g7CQkvKiBudW1iZXIgb2YgY3lsaWRuZXIgZ3JvdXAgKi8KKwlfX3UxNgljX25jeWw7CQkvKiBudW1iZXIgb2YgY3lsJ3MgdGhpcyBjZyAqLworCV9fdTE2CWNfbmlibGs7CS8qIG51bWJlciBvZiBpbm9kZSBibG9ja3MgdGhpcyBjZyAqLworCV9fdTMyCWNfbmRibGs7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyB0aGlzIGNnICovCisJX191MzIJY19yb3RvcjsJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGJsb2NrICovCisJX191MzIJY19mcm90b3I7CS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBmcmFnICovCisJX191MzIJY19pcm90b3I7CS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBpbm9kZSAqLworCV9fdTMyCWNfYnRvdG9mZjsJLyogKF9fdTMyKSBibG9jayB0b3RhbHMgcGVyIGN5bGluZGVyICovCisJX191MzIJY19ib2ZmOwkJLyogKHNob3J0KSBmcmVlIGJsb2NrIHBvc2l0aW9ucyAqLworCV9fdTMyCWNfaXVzZWRvZmY7CS8qIChjaGFyKSB1c2VkIGlub2RlIG1hcCAqLworCV9fdTMyCWNfZnJlZW9mZjsJLyogKHVfY2hhcikgZnJlZSBibG9jayBtYXAgKi8KKwlfX3UzMgljX25leHRmcmVlb2ZmOwkvKiAodV9jaGFyKSBuZXh0IGF2YWlsYWJsZSBzcGFjZSAqLworCV9fdTMyCWNfY2x1c3RlcnN1bW9mZjsvKiAodV9pbnQzMikgY291bnRzIG9mIGF2YWlsIGNsdXN0ZXJzICovCisJX191MzIJY19jbHVzdGVyb2ZmOwkvKiAodV9pbnQ4KSBmcmVlIGNsdXN0ZXIgbWFwICovCisJX191MzIJY19uY2x1c3RlcmJsa3M7CS8qIG51bWJlciBvZiBjbHVzdGVycyB0aGlzIGNnICovCit9OwkKKworCitzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyB7CisJc3RydWN0IHVmc19idWZmZXJfaGVhZCBzX3ViaDsgLyogYnVmZmVyIGNvbnRhaW5pbmcgc3VwZXIgYmxvY2sgKi8KKwlzdHJ1Y3QgdWZzX2NzdW1fY29yZSBjc190b3RhbDsKKwlfX3UzMglzX3NibGtubzsJLyogb2Zmc2V0IG9mIHN1cGVyLWJsb2NrcyBpbiBmaWxlc3lzICovCisJX191MzIJc19jYmxrbm87CS8qIG9mZnNldCBvZiBjZy1ibG9jayBpbiBmaWxlc3lzICovCisJX191MzIJc19pYmxrbm87CS8qIG9mZnNldCBvZiBpbm9kZS1ibG9ja3MgaW4gZmlsZXN5cyAqLworCV9fdTMyCXNfZGJsa25vOwkvKiBvZmZzZXQgb2YgZmlyc3QgZGF0YSBhZnRlciBjZyAqLworCV9fdTMyCXNfY2dvZmZzZXQ7CS8qIGN5bGluZGVyIGdyb3VwIG9mZnNldCBpbiBjeWxpbmRlciAqLworCV9fdTMyCXNfY2dtYXNrOwkvKiB1c2VkIHRvIGNhbGMgbW9kIGZzX250cmFrICovCisJX191MzIJc19zaXplOwkJLyogbnVtYmVyIG9mIGJsb2NrcyAoZnJhZ21lbnRzKSBpbiBmcyAqLworCV9fdTMyCXNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCV9fdTY0CXNfdTJfc2l6ZTsJLyogdWZzMjogbnVtYmVyIG9mIGJsb2NrcyAoZnJhZ21lbnRzKSBpbiBmcyAqLworCV9fdTY0CXNfdTJfZHNpemU7CS8qdWZzMjogIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCV9fdTMyCXNfbmNnOwkJLyogbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyAqLworCV9fdTMyCXNfYnNpemU7CS8qIHNpemUgb2YgYmFzaWMgYmxvY2tzICovCisJX191MzIJc19mc2l6ZTsJLyogc2l6ZSBvZiBmcmFnbWVudHMgKi8KKwlfX3UzMglzX2ZwYjsJCS8qIGZyYWdtZW50cyBwZXIgYmxvY2sgKi8KKwlfX3UzMglzX21pbmZyZWU7CS8qIG1pbmltdW0gcGVyY2VudGFnZSBvZiBmcmVlIGJsb2NrcyAqLworCV9fdTMyCXNfYm1hc2s7CS8qIGBibGtvZmYnJyBjYWxjIG9mIGJsayBvZmZzZXRzICovCisJX191MzIJc19mbWFzazsJLyogc19mc2l6ZSBtYXNrICovCisJX191MzIJc19ic2hpZnQ7CS8qIGBsYmxrbm8nJyBjYWxjIG9mIGxvZ2ljYWwgYmxrbm8gKi8KKwlfX3UzMiAgIHNfZnNoaWZ0OwkvKiBzX2ZzaXplIHNoaWZ0ICovCisJX191MzIJc19mcGJzaGlmdDsJLyogZnJhZ21lbnRzIHBlciBibG9jayBzaGlmdCAqLworCV9fdTMyCXNfZnNidG9kYjsJLyogZnNidG9kYiBhbmQgZGJ0b2ZzYiBzaGlmdCBjb25zdGFudCAqLworCV9fdTMyCXNfc2JzaXplOwkvKiBhY3R1YWwgc2l6ZSBvZiBzdXBlciBibG9jayAqLworCV9fdTMyICAgc19jc21hc2s7CS8qIGNzdW0gYmxvY2sgb2Zmc2V0ICovCisJX191MzIJc19jc3NoaWZ0OwkvKiBjc3VtIGJsb2NrIG51bWJlciAqLworCV9fdTMyCXNfbmluZGlyOwkvKiB2YWx1ZSBvZiBOSU5ESVIgKi8KKwlfX3UzMglzX2lub3BiOwkvKiB2YWx1ZSBvZiBJTk9QQiAqLworCV9fdTMyCXNfbnNwZjsJCS8qIHZhbHVlIG9mIE5TUEYgKi8KKwlfX3UzMglzX25wc2VjdDsJLyogIyBzZWN0b3JzL3RyYWNrIGluY2x1ZGluZyBzcGFyZXMgKi8KKwlfX3UzMglzX2ludGVybGVhdmU7CS8qIGhhcmR3YXJlIHNlY3RvciBpbnRlcmxlYXZlICovCisJX191MzIJc190cmFja3NrZXc7CS8qIHNlY3RvciAwIHNrZXcsIHBlciB0cmFjayAqLworCV9fdTY0CXNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCV9fdTMyCXNfY3NzaXplOwkvKiBzaXplIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJX191MzIJc19jZ3NpemU7CS8qIGN5bGluZGVyIGdyb3VwIHNpemUgKi8KKwlfX3UzMglzX250cmFrOwkvKiB0cmFja3MgcGVyIGN5bGluZGVyICovCisJX191MzIJc19uc2VjdDsJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwlfX3UzMglzX3NwYzsJCS8qIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisJX191MzIJc19pcGc7CQkvKiBpbm9kZXMgcGVyIGN5bGluZGVyIGdyb3VwICovCisJX191MzIJc19mcGc7CQkvKiBmcmFnbWVudHMgcGVyIGdyb3VwICovCisJX191MzIJc19jcGM7CQkvKiBjeWwgcGVyIGN5Y2xlIGluIHBvc3RibCAqLworCV9fczMyCXNfY29udGlnc3Vtc2l6ZTsvKiBzaXplIG9mIGNsdXN0ZXIgc3VtbWFyeSBhcnJheSwgNDRic2QgKi8KKwlfX3M2NAlzX3FibWFzazsJLyogfnVzYl9ibWFzayAqLworCV9fczY0CXNfcWZtYXNrOwkvKiB+dXNiX2ZtYXNrICovCisJX19zMzIJc19wb3N0Ymxmb3JtYXQ7CS8qIGZvcm1hdCBvZiBwb3NpdGlvbmFsIGxheW91dCB0YWJsZXMgKi8KKwlfX3MzMglzX25ycG9zOwkvKiBudW1iZXIgb2Ygcm90YXRpb25hbCBwb3NpdGlvbnMgKi8KKyAgICAgICAgX19zMzIJc19wb3N0YmxvZmY7CS8qIChfX3MxNikgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJX19zMzIJc19yb3RibG9mZjsJLyogKF9fdTgpIGJsb2NrcyBmb3IgZWFjaCByb3RhdGlvbiAqLworCisJX191MzIJc19mcGJtYXNrOwkvKiBmcmFnbWVudHMgcGVyIGJsb2NrIG1hc2sgKi8KKwlfX3UzMglzX2FwYjsJCS8qIGFkZHJlc3MgcGVyIGJsb2NrICovCisJX191MzIJc18yYXBiOwkJLyogYWRkcmVzcyBwZXIgYmxvY2teMiAqLworCV9fdTMyCXNfM2FwYjsJCS8qIGFkZHJlc3MgcGVyIGJsb2NrXjMgKi8KKwlfX3UzMglzX2FwYm1hc2s7CS8qIGFkZHJlc3MgcGVyIGJsb2NrIG1hc2sgKi8KKwlfX3UzMglzX2FwYnNoaWZ0OwkvKiBhZGRyZXNzIHBlciBibG9jayBzaGlmdCAqLworCV9fdTMyCXNfMmFwYnNoaWZ0OwkvKiBhZGRyZXNzIHBlciBibG9jayBzaGlmdCAqIDIgKi8KKwlfX3UzMglzXzNhcGJzaGlmdDsJLyogYWRkcmVzcyBwZXIgYmxvY2sgc2hpZnQgKiAzICovCisJX191MzIJc19uc3Bmc2hpZnQ7CS8qIG51bWJlciBvZiBzZWN0b3IgcGVyIGZyYWdtZW50IHNoaWZ0ICovCisJX191MzIJc19uc3BiOwkJLyogbnVtYmVyIG9mIHNlY3RvciBwZXIgYmxvY2sgKi8KKwlfX3UzMglzX2lub3BmOwkvKiBpbm9kZXMgcGVyIGZyYWdtZW50ICovCisJX191MzIJc19zYmJhc2U7CS8qIG9mZnNldCBvZiBOZVhUc3RlcCBzdXBlcmJsb2NrICovCisJX191MzIJc19icGY7CQkvKiBiaXRzIHBlciBmcmFnbWVudCAqLworCV9fdTMyCXNfYnBmc2hpZnQ7CS8qIGJpdHMgcGVyIGZyYWdtZW50IHNoaWZ0Ki8KKwlfX3UzMglzX2JwZm1hc2s7CS8qIGJpdHMgcGVyIGZyYWdtZW50IG1hc2sgKi8KKworCV9fdTMyCXNfbWF4c3ltbGlua2xlbjsvKiB1cHBlciBsaW1pdCBvbiBmYXN0IHN5bWxpbmtzJyBzaXplICovCisJX19zMzIJZnNfbWFnaWM7ICAgICAgIC8qIGZpbGVzeXN0ZW0gbWFnaWMgKi8KKwl1bnNpZ25lZCBpbnQgc19kaXJibGtzaXplOworfTsKKworLyoKKyAqIFNpemVzIG9mIHRoaXMgc3RydWN0dXJlcyBhcmU6CisgKgl1ZnNfc3VwZXJfYmxvY2tfZmlyc3QJNTEyCisgKgl1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kCTUxMgorICoJdWZzX3N1cGVyX2Jsb2NrX3RoaXJkCTM1NgorICovCitzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0IHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfbGluazsJLyogVU5VU0VEICovCisJCX0gZnNfNDI7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIGZsYWcgKi8KKwkJfSBmc19zdW47CisJfSBmc191MDsKKwlfX2ZzMzIJZnNfcmxpbms7CisJX19mczMyCWZzX3NibGtubzsKKwlfX2ZzMzIJZnNfY2Jsa25vOworCV9fZnMzMglmc19pYmxrbm87CisJX19mczMyCWZzX2RibGtubzsKKwlfX2ZzMzIJZnNfY2dvZmZzZXQ7CisJX19mczMyCWZzX2NnbWFzazsKKwlfX2ZzMzIJZnNfdGltZTsKKwlfX2ZzMzIJZnNfc2l6ZTsKKwlfX2ZzMzIJZnNfZHNpemU7CisJX19mczMyCWZzX25jZzsKKwlfX2ZzMzIJZnNfYnNpemU7CisJX19mczMyCWZzX2ZzaXplOworCV9fZnMzMglmc19mcmFnOworCV9fZnMzMglmc19taW5mcmVlOworCV9fZnMzMglmc19yb3RkZWxheTsKKwlfX2ZzMzIJZnNfcnBzOworCV9fZnMzMglmc19ibWFzazsKKwlfX2ZzMzIJZnNfZm1hc2s7CisJX19mczMyCWZzX2JzaGlmdDsKKwlfX2ZzMzIJZnNfZnNoaWZ0OworCV9fZnMzMglmc19tYXhjb250aWc7CisJX19mczMyCWZzX21heGJwZzsKKwlfX2ZzMzIJZnNfZnJhZ3NoaWZ0OworCV9fZnMzMglmc19mc2J0b2RiOworCV9fZnMzMglmc19zYnNpemU7CisJX19mczMyCWZzX2NzbWFzazsKKwlfX2ZzMzIJZnNfY3NzaGlmdDsKKwlfX2ZzMzIJZnNfbmluZGlyOworCV9fZnMzMglmc19pbm9wYjsKKwlfX2ZzMzIJZnNfbnNwZjsKKwlfX2ZzMzIJZnNfb3B0aW07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX25wc2VjdDsKKwkJfSBmc19zdW47CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3RhdGU7CisJCX0gZnNfc3VueDg2OworCX0gZnNfdTE7CisJX19mczMyCWZzX2ludGVybGVhdmU7CisJX19mczMyCWZzX3RyYWNrc2tldzsKKwlfX2ZzMzIJZnNfaWRbMl07CisJX19mczMyCWZzX2NzYWRkcjsKKwlfX2ZzMzIJZnNfY3NzaXplOworCV9fZnMzMglmc19jZ3NpemU7CisJX19mczMyCWZzX250cmFrOworCV9fZnMzMglmc19uc2VjdDsKKwlfX2ZzMzIJZnNfc3BjOworCV9fZnMzMglmc19uY3lsOworCV9fZnMzMglmc19jcGc7CisJX19mczMyCWZzX2lwZzsKKwlfX2ZzMzIJZnNfZnBnOworCXN0cnVjdCB1ZnNfY3N1bSBmc19jc3RvdGFsOworCV9fczgJZnNfZm1vZDsKKwlfX3M4CWZzX2NsZWFuOworCV9fczgJZnNfcm9ubHk7CisJX19zOAlmc19mbGFnczsKKwlfX3M4CWZzX2ZzbW50W1VGU19NQVhNTlRMRU4gLSAyMTJdOworCit9OworCitzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19zOAlmc19mc21udFsyMTJdOworCQkJX19mczMyCWZzX2Nncm90b3I7CisJCQlfX2ZzMzIJZnNfY3NwW1VGU19NQVhDU0JVRlNdOworCQkJX19mczMyCWZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIJZnNfY3BjOworCQkJX19mczE2CWZzX29wb3N0YmxbODJdOworCQl9IGZzX3UxOworCQlzdHJ1Y3QgeworCQkJX19zOCAgZnNfZnNtbnRbVUZTMl9NQVhNTlRMRU4gLSBVRlNfTUFYTU5UTEVOICsgMjEyXTsKKwkJCV9fdTggICBmc192b2xuYW1lW1VGUzJfTUFYVk9MTEVOXTsKKwkJCV9fZnM2NCAgZnNfc3d1aWQ7CisJCQlfX2ZzMzIgIGZzX3BhZDsKKwkJCV9fZnMzMiAgIGZzX2Nncm90b3I7CisJCQlfX2ZzMzIgICBmc19vY3NwW1VGUzJfTk9DU1BUUlNdOworCQkJX19mczMyICAgZnNfY29udGlnZGlyczsKKwkJCV9fZnMzMiAgIGZzX2NzcDsKKwkJCV9fZnMzMiAgIGZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIgICBmc19hY3RpdmU7CisJCQlfX2ZzMzIgICBmc19vbGRfY3BjOworCQkJX19mczMyICAgZnNfbWF4YnNpemU7CisJCQlfX2ZzNjQgICBmc19zcGFyZWNvbjY0WzE3XTsKKwkJCV9fZnM2NCAgIGZzX3NibG9ja2xvYzsKKwkJCV9fZnM2NAljc19uZGlyOworCQkJX19mczY0CWNzX25iZnJlZTsKKwkJfSBmc191MjsKKwl9IGZzX3VuOworfTsKKworc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczE2CWZzX29wb3N0YmxbNDZdOworCQl9IGZzX3UxOworCQlzdHJ1Y3QgeworCQkJX19mczY0CWNzX25pZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCisJCQlfX2ZzNjQJY3NfbmZmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworCQkJX19mczY0ICAgY3NfbnVtY2x1c3RlcnM7CS8qIG51bWJlciBvZiBmcmVlIGNsdXN0ZXJzICovCisJCQlfX2ZzNjQgICBjc19zcGFyZVszXTsJLyogZnV0dXJlIGV4cGFuc2lvbiAqLworCQkJc3RydWN0ICB1ZnNfdGltZXZhbCAgICBmc190aW1lOwkJLyogbGFzdCB0aW1lIHdyaXR0ZW4gKi8KKwkJCV9fZnM2NCAgICBmc19zaXplOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBmcyAqLworCQkJX19mczY0ICAgIGZzX2RzaXplOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KKwkJCV9fZnM2NCAgIGZzX2NzYWRkcjsJLyogYmxrIGFkZHIgb2YgY3lsIGdycCBzdW1tYXJ5IGFyZWEgKi8KKwkJCV9fZnM2NCAgICBmc19wZW5kaW5nYmxvY2tzOy8qIGJsb2NrcyBpbiBwcm9jZXNzIG9mIGJlaW5nIGZyZWVkICovCisJCQlfX2ZzMzIgICAgZnNfcGVuZGluZ2lub2RlczsvKmlub2RlcyBpbiBwcm9jZXNzIG9mIGJlaW5nIGZyZWVkICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGZzX3UyOworCX0gZnNfdW4xOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zcGFyZWNvbls1M107LyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KKwkJCV9fZnMzMglmc19yZWNsYWltOworCQkJX19mczMyCWZzX3NwYXJlY29uMlsxXTsKKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLworCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLworCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLworCQl9IGZzX3N1bjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zcGFyZWNvbls1M107LyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KKwkJCV9fZnMzMglmc19yZWNsYWltOworCQkJX19mczMyCWZzX3NwYXJlY29uMlsxXTsKKwkJCV9fZnMzMglmc19ucHNlY3Q7CS8qICMgc2VjdG9ycy90cmFjayBpbmNsdWRpbmcgc3BhcmVzICovCisJCQlfX2ZzMzIJZnNfcWJtYXNrWzJdOwkvKiB+dXNiX2JtYXNrICovCisJCQlfX2ZzMzIJZnNfcWZtYXNrWzJdOwkvKiB+dXNiX2ZtYXNrICovCisJCX0gZnNfc3VueDg2OworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3NwYXJlY29uWzUwXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLworCQkJX19mczMyCWZzX2NvbnRpZ3N1bXNpemU7Lyogc2l6ZSBvZiBjbHVzdGVyIHN1bW1hcnkgYXJyYXkgKi8KKwkJCV9fZnMzMglmc19tYXhzeW1saW5rbGVuOy8qIG1heCBsZW5ndGggb2YgYW4gaW50ZXJuYWwgc3ltbGluayAqLworCQkJX19mczMyCWZzX2lub2RlZm10OwkvKiBmb3JtYXQgb2Ygb24tZGlzayBpbm9kZXMgKi8KKwkJCV9fZnMzMglmc19tYXhmaWxlc2l6ZVsyXTsJLyogbWF4IHJlcHJlc2VudGFibGUgZmlsZSBzaXplICovCisJCQlfX2ZzMzIJZnNfcWJtYXNrWzJdOwkvKiB+dXNiX2JtYXNrICovCisJCQlfX2ZzMzIJZnNfcWZtYXNrWzJdOwkvKiB+dXNiX2ZtYXNrICovCisJCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIHRpbWUgc3RhbXAgKi8KKwkJfSBmc180NDsKKwl9IGZzX3VuMjsKKwlfX2ZzMzIJZnNfcG9zdGJsZm9ybWF0OworCV9fZnMzMglmc19ucnBvczsKKwlfX2ZzMzIJZnNfcG9zdGJsb2ZmOworCV9fZnMzMglmc19yb3RibG9mZjsKKwlfX2ZzMzIJZnNfbWFnaWM7CisJX191OAlmc19zcGFjZVsxXTsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1VGU19GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VpbnB1dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91aW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZkN2RhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91aW5wdXQuaApAQCAtMCwwICsxLDEzNiBAQAorI2lmbmRlZiBfX1VJTlBVVF9IXworI2RlZmluZSBfX1VJTlBVVF9IXworLyoKKyAqICBVc2VyIGxldmVsIGRyaXZlciBzdXBwb3J0IGZvciBpbnB1dCBzdWJzeXN0ZW0KKyAqCisgKiBIZWF2aWx5IGJhc2VkIG9uIGV2ZGV2LmMgYnkgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEF1dGhvcjogQXJpc3RldSBTZXJnaW8gUm96YW5za2kgRmlsaG8gPGFyaXNAY2F0aGVkcmFsbGFicy5vcmc+CisgKgorICogQ2hhbmdlcy9SZXZpc2lvbnM6CisgKgkwLjMJMjQvMDUvMjAwNiAoQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYWdtYWlsLmNvbT4pCisgKgkJLSB1cGRhdGUgZmYgc3VwcG9ydCBmb3IgdGhlIGNoYW5nZXMgaW4ga2VybmVsIGludGVyZmFjZQorICoJCS0gYWRkIFVJTlBVVF9WRVJTSU9OCisgKgkwLjIJMTYvMTAvMjAwNCAoTWljYWggRG93dHkgPG1pY2FoQG5hdmkuY3g+KQorICoJCS0gYWRkZWQgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydAorICogICAgICAgICAgICAgLSBhZGRlZCBVSV9TRVRfUEhZUworICoJMC4xCTIwLzA2LzIwMDIKKyAqCQktIGZpcnN0IHB1YmxpYyB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNkZWZpbmUgVUlOUFVUX1ZFUlNJT04JCTMKKworCitzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCB7CisJaW50CQkJcmVxdWVzdF9pZDsKKwlpbnQJCQlyZXR2YWw7CisJc3RydWN0IGZmX2VmZmVjdAllZmZlY3Q7CisJc3RydWN0IGZmX2VmZmVjdAlvbGQ7Cit9OworCitzdHJ1Y3QgdWlucHV0X2ZmX2VyYXNlIHsKKwlpbnQJCQlyZXF1ZXN0X2lkOworCWludAkJCXJldHZhbDsKKwlpbnQJCQllZmZlY3RfaWQ7Cit9OworCisvKiBpb2N0bCAqLworI2RlZmluZSBVSU5QVVRfSU9DVExfQkFTRQknVScKKyNkZWZpbmUgVUlfREVWX0NSRUFURQkJX0lPKFVJTlBVVF9JT0NUTF9CQVNFLCAxKQorI2RlZmluZSBVSV9ERVZfREVTVFJPWQkJX0lPKFVJTlBVVF9JT0NUTF9CQVNFLCAyKQorCisjZGVmaW5lIFVJX1NFVF9FVkJJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTAwLCBpbnQpCisjZGVmaW5lIFVJX1NFVF9LRVlCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwMSwgaW50KQorI2RlZmluZSBVSV9TRVRfUkVMQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDIsIGludCkKKyNkZWZpbmUgVUlfU0VUX0FCU0JJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTAzLCBpbnQpCisjZGVmaW5lIFVJX1NFVF9NU0NCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwNCwgaW50KQorI2RlZmluZSBVSV9TRVRfTEVEQklUCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDUsIGludCkKKyNkZWZpbmUgVUlfU0VUX1NOREJJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTA2LCBpbnQpCisjZGVmaW5lIFVJX1NFVF9GRkJJVAkJX0lPVyhVSU5QVVRfSU9DVExfQkFTRSwgMTA3LCBpbnQpCisjZGVmaW5lIFVJX1NFVF9QSFlTCQlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAxMDgsIGNoYXIqKQorI2RlZmluZSBVSV9TRVRfU1dCSVQJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDEwOSwgaW50KQorCisjZGVmaW5lIFVJX0JFR0lOX0ZGX1VQTE9BRAlfSU9XUihVSU5QVVRfSU9DVExfQkFTRSwgMjAwLCBzdHJ1Y3QgdWlucHV0X2ZmX3VwbG9hZCkKKyNkZWZpbmUgVUlfRU5EX0ZGX1VQTE9BRAlfSU9XKFVJTlBVVF9JT0NUTF9CQVNFLCAyMDEsIHN0cnVjdCB1aW5wdXRfZmZfdXBsb2FkKQorI2RlZmluZSBVSV9CRUdJTl9GRl9FUkFTRQlfSU9XUihVSU5QVVRfSU9DVExfQkFTRSwgMjAyLCBzdHJ1Y3QgdWlucHV0X2ZmX2VyYXNlKQorI2RlZmluZSBVSV9FTkRfRkZfRVJBU0UJCV9JT1coVUlOUFVUX0lPQ1RMX0JBU0UsIDIwMywgc3RydWN0IHVpbnB1dF9mZl9lcmFzZSkKKworLyoKKyAqIFRvIHdyaXRlIGEgZm9yY2UtZmVlZGJhY2stY2FwYWJsZSBkcml2ZXIsIHRoZSB1cGxvYWRfZWZmZWN0CisgKiBhbmQgZXJhc2VfZWZmZWN0IGNhbGxiYWNrcyBpbiBpbnB1dF9kZXYgbXVzdCBiZSBpbXBsZW1lbnRlZC4KKyAqIFRoZSB1aW5wdXQgZHJpdmVyIHdpbGwgZ2VuZXJhdGUgYSBmYWtlIGlucHV0IGV2ZW50IHdoZW4gb25lIG9mCisgKiB0aGVzZSBjYWxsYmFja3MgYXJlIGludm9rZWQuIFRoZSB1c2Vyc3BhY2UgY29kZSB0aGVuIHVzZXMKKyAqIGlvY3RscyB0byByZXRyaWV2ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYW5kIHNlbmQgdGhlIHJldHVybiBjb2RlLgorICogVGhlIGNhbGxiYWNrIGJsb2NrcyB1bnRpbCB0aGlzIHJldHVybiBjb2RlIGlzIHNlbnQuCisgKgorICogVGhlIGRlc2NyaWJlZCBjYWxsYmFjayBtZWNoYW5pc20gaXMgb25seSB1c2VkIGlmIGZmX2VmZmVjdHNfbWF4CisgKiBpcyBzZXQuCisgKgorICogVG8gaW1wbGVtZW50IHVwbG9hZF9lZmZlY3QoKToKKyAqICAgMS4gV2FpdCBmb3IgYW4gZXZlbnQgd2l0aCB0eXBlID09IEVWX1VJTlBVVCBhbmQgY29kZSA9PSBVSV9GRl9VUExPQUQuCisgKiAgICAgIEEgcmVxdWVzdCBJRCB3aWxsIGJlIGdpdmVuIGluICd2YWx1ZScuCisgKiAgIDIuIEFsbG9jYXRlIGEgdWlucHV0X2ZmX3VwbG9hZCBzdHJ1Y3QsIGZpbGwgaW4gcmVxdWVzdF9pZCB3aXRoCisgKiAgICAgIHRoZSAndmFsdWUnIGZyb20gdGhlIEVWX1VJTlBVVCBldmVudC4KKyAqICAgMy4gSXNzdWUgYSBVSV9CRUdJTl9GRl9VUExPQUQgaW9jdGwsIGdpdmluZyBpdCB0aGUKKyAqICAgICAgdWlucHV0X2ZmX3VwbG9hZCBzdHJ1Y3QuIEl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlCisgKiAgICAgIGZmX2VmZmVjdHMgcGFzc2VkIHRvIHVwbG9hZF9lZmZlY3QoKS4KKyAqICAgNC4gUGVyZm9ybSB0aGUgZWZmZWN0IHVwbG9hZCwgYW5kIHBsYWNlIGEgcmV0dXJuIGNvZGUgYmFjayBpbnRvCisgICAgICAgIHRoZSB1aW5wdXRfZmZfdXBsb2FkIHN0cnVjdC4KKyAqICAgNS4gSXNzdWUgYSBVSV9FTkRfRkZfVVBMT0FEIGlvY3RsLCBhbHNvIGdpdmluZyBpdCB0aGUKKyAqICAgICAgdWlucHV0X2ZmX3VwbG9hZF9lZmZlY3Qgc3RydWN0LiBUaGlzIHdpbGwgY29tcGxldGUgZXhlY3V0aW9uCisgKiAgICAgIG9mIG91ciB1cGxvYWRfZWZmZWN0KCkgaGFuZGxlci4KKyAqCisgKiBUbyBpbXBsZW1lbnQgZXJhc2VfZWZmZWN0KCk6CisgKiAgIDEuIFdhaXQgZm9yIGFuIGV2ZW50IHdpdGggdHlwZSA9PSBFVl9VSU5QVVQgYW5kIGNvZGUgPT0gVUlfRkZfRVJBU0UuCisgKiAgICAgIEEgcmVxdWVzdCBJRCB3aWxsIGJlIGdpdmVuIGluICd2YWx1ZScuCisgKiAgIDIuIEFsbG9jYXRlIGEgdWlucHV0X2ZmX2VyYXNlIHN0cnVjdCwgZmlsbCBpbiByZXF1ZXN0X2lkIHdpdGgKKyAqICAgICAgdGhlICd2YWx1ZScgZnJvbSB0aGUgRVZfVUlOUFVUIGV2ZW50LgorICogICAzLiBJc3N1ZSBhIFVJX0JFR0lOX0ZGX0VSQVNFIGlvY3RsLCBnaXZpbmcgaXQgdGhlCisgKiAgICAgIHVpbnB1dF9mZl9lcmFzZSBzdHJ1Y3QuIEl0IHdpbGwgYmUgZmlsbGVkIGluIHdpdGggdGhlCisgKiAgICAgIGVmZmVjdCBJRCBwYXNzZWQgdG8gZXJhc2VfZWZmZWN0KCkuCisgKiAgIDQuIFBlcmZvcm0gdGhlIGVmZmVjdCBlcmFzdXJlLCBhbmQgcGxhY2UgYSByZXR1cm4gY29kZSBiYWNrCisgKiAgICAgIGludG8gdGhlIHVpbnB1dF9mZl9lcmFzZSBzdHJ1Y3QuCisgKiAgIDUuIElzc3VlIGEgVUlfRU5EX0ZGX0VSQVNFIGlvY3RsLCBhbHNvIGdpdmluZyBpdCB0aGUKKyAqICAgICAgdWlucHV0X2ZmX2VyYXNlX2VmZmVjdCBzdHJ1Y3QuIFRoaXMgd2lsbCBjb21wbGV0ZSBleGVjdXRpb24KKyAqICAgICAgb2Ygb3VyIGVyYXNlX2VmZmVjdCgpIGhhbmRsZXIuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIG5ldyBldmVudCB0eXBlLCB1c2VkIG9ubHkgYnkgdWlucHV0LgorICogJ2NvZGUnIGlzIFVJX0ZGX1VQTE9BRCBvciBVSV9GRl9FUkFTRSwgYW5kICd2YWx1ZScKKyAqIGlzIHRoZSB1bmlxdWUgcmVxdWVzdCBJRC4gVGhpcyBudW1iZXIgd2FzIHBpY2tlZAorICogYXJiaXRyYXJpbHksIGFib3ZlIEVWX01BWCAoc2luY2UgdGhlIGlucHV0IHN5c3RlbQorICogbmV2ZXIgc2VlcyBpdCkgYnV0IGluIHRoZSByYW5nZSBvZiBhIDE2LWJpdCBpbnQuCisgKi8KKyNkZWZpbmUgRVZfVUlOUFVUCQkweDAxMDEKKyNkZWZpbmUgVUlfRkZfVVBMT0FECQkxCisjZGVmaW5lIFVJX0ZGX0VSQVNFCQkyCisKKyNkZWZpbmUgVUlOUFVUX01BWF9OQU1FX1NJWkUJODAKK3N0cnVjdCB1aW5wdXRfdXNlcl9kZXYgeworCWNoYXIgbmFtZVtVSU5QVVRfTUFYX05BTUVfU0laRV07CisJc3RydWN0IGlucHV0X2lkIGlkOworICAgICAgICBpbnQgZmZfZWZmZWN0c19tYXg7CisgICAgICAgIGludCBhYnNtYXhbQUJTX01BWCArIDFdOworICAgICAgICBpbnQgYWJzbWluW0FCU19NQVggKyAxXTsKKyAgICAgICAgaW50IGFic2Z1enpbQUJTX01BWCArIDFdOworICAgICAgICBpbnQgYWJzZmxhdFtBQlNfTUFYICsgMV07Cit9OworI2VuZGlmCS8qIF9fVUlOUFVUX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTEzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Vpby5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgX19MSU5VWF9VSU9fSAorI2RlZmluZSBfX0xJTlVYX1VJT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICoJQmVya2VsZXkgc3R5bGUgVUlPIHN0cnVjdHVyZXMJLQlBbGFuIENveCAxOTk0LgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK3N0cnVjdCBpb3ZlYworeworCXZvaWQgKmlvdl9iYXNlOwkvKiBCU0QgdXNlcyBjYWRkcl90ICgxMDAzLjFnIHJlcXVpcmVzIHZvaWQgKikgKi8KKwlfX2tlcm5lbF9zaXplX3QgaW92X2xlbjsgLyogTXVzdCBiZSBzaXplX3QgKDEwMDMuMWcpICovCit9OworCisKKy8qCisgKglVSU9fTUFYSU9WIHNoYWxsIGJlIGF0IGxlYXN0IDE2IDEwMDMuMWcgKDUuNC4xLjEpCisgKi8KKyAKKyNkZWZpbmUgVUlPX0ZBU1RJT1YJOAorI2RlZmluZSBVSU9fTUFYSU9WCTEwMjQKKworLyoKKyAqIFRvdGFsIG51bWJlciBvZiBieXRlcyBjb3ZlcmVkIGJ5IGFuIGlvdmVjLgorICoKKyAqIE5PVEUgdGhhdCBpdCBpcyBub3Qgc2FmZSB0byB1c2UgdGhpcyBmdW5jdGlvbiB1bnRpbCBhbGwgdGhlIGlvdmVjJ3MKKyAqIHNlZ21lbnQgbGVuZ3RocyBoYXZlIGJlZW4gdmFsaWRhdGVkLiAgQmVjYXVzZSB0aGUgaW5kaXZpZHVhbCBsZW5ndGhzIGNhbgorICogb3ZlcmZsb3cgYSBzaXplX3Qgd2hlbiBhZGRlZCB0b2dldGhlci4KKyAqLworc3RhdGljIF9faW5saW5lX18gc2l6ZV90IGlvdl9sZW5ndGgoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwl1bnNpZ25lZCBsb25nIHNlZzsKKwlzaXplX3QgcmV0ID0gMDsKKworCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspCisJCXJldCArPSBpb3Zbc2VnXS5pb3ZfbGVuOworCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgaW92X3Nob3J0ZW4oc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2Vncywgc2l6ZV90IHRvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VsdHJhc291bmQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdWx0cmFzb3VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzcwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VsdHJhc291bmQuaApAQCAtMCwwICsxLDEwMyBAQAorI2lmbmRlZiBfVUxUUkFTT1VORF9IXworI2RlZmluZSBfVUxUUkFTT1VORF9IXworLyoKKyAqCXVsdHJhc291bmQuaCAtIE1hY3JvcyBmb3IgcHJvZ3JhbW1pbmcgdGhlIEdyYXZpcyBVbHRyYXNvdW5kCisgKgkJCVRoZXNlIG1hY3JvcyBhcmUgZXh0cmVtZWx5IGRldmljZSBkZXBlbmRlbnQKKyAqCQkJYW5kIG5vdCBwb3J0YWJsZS4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisKKworLyoKKyAqCVByaXZhdGUgZXZlbnRzIGZvciBHcmF2aXMgVWx0cmFzb3VuZCAoR1VTKQorICoKKyAqCUZvcm1hdDoKKyAqCQlieXRlIDAgCQktIFNFUV9QUklWQVRFICgweGZlKQorICoJCWJ5dGUgMSAJCS0gU3ludGhlc2l6ZXIgZGV2aWNlIG51bWJlciAoMC1OKQorICoJCWJ5dGUgMiAJCS0gQ29tbWFuZCAoc2VlIGJlbG93KQorICoJCWJ5dGUgMyAJCS0gVm9pY2UgbnVtYmVyICgwLTMxKQorICoJCWJ5dGVzIDQgYW5kIDUJLSBwYXJhbWV0ZXIgUDEgKHVuc2lnbmVkIHNob3J0KQorICoJCWJ5dGVzIDYgYW5kIDcJLSBwYXJhbWV0ZXIgUDIgKHVuc2lnbmVkIHNob3J0KQorICoKKyAqCUNvbW1hbmRzOgorICoJCUVhY2ggY29tbWFuZCBhZmZlY3RzIG9uZSB2b2ljZSBkZWZpbmVkIGluIGJ5dGUgMy4KKyAqCQlVbnVzZWQgcGFyYW1ldGVycyAoUDEgYW5kL29yIFAyICpNVVNUKiBiZSBpbml0aWFsaXplZCB0byB6ZXJvKS4KKyAqCQlfR1VTX05VTVZPSUNFUwktIFNldHMgbWF4LiBudW1iZXIgb2YgY29uY3VycmVudCB2b2ljZXMgKFAxPTE0LTMxLCBkZWZhdWx0IDE2KQorICoJCV9HVVNfVk9JQ0VTQU1QTEUtICoqKioqKioqKioqKiBPQlNPTEVURSAqKioqKioqKioqKioqCisgKgkJX0dVU19WT0lDRU9OCS0gU3RhcnRzIHZvaWNlIChQMT12b2ljZSBtb2RlKQorICoJCV9HVVNfVk9JQ0VPRkYJLSBTdG9wcyB2b2ljZSAobm8gcGFyYW1ldGVycykKKyAqCQlfR1VTX1ZPSUNFRkFERQktIFN0b3BzIHRoZSB2b2ljZSBzbW9vdGhseS4KKyAqCQlfR1VTX1ZPSUNFTU9ERQktIEFsdGVycyB0aGUgdm9pY2UgbW9kZSwgZG9uJ3Qgc3RhcnQgb3Igc3RvcCB2b2ljZSAoUDE9dm9pY2UgbW9kZSkKKyAqCQlfR1VTX1ZPSUNFQkFMQQktIFNldHMgdm9pY2UgYmFsZW5jZSAoUDEsIDA9bGVmdCwgNz1taWRkbGUgYW5kIDE1PXJpZ2h0LCBkZWZhdWx0IDcpCisgKgkJX0dVU19WT0lDRUZSRVEJLSBTZXRzIHZvaWNlIChzYW1wbGUpIHBsYXliYWNrIGZyZXF1ZW5jeSAoUDE9SHopCisgKgkJX0dVU19WT0lDRVZPTAktIFNldHMgdm9pY2Ugdm9sdW1lIChQMT12b2x1bWUsIDB4ZmZmPW1heCwgMHhlZmY9aGFsZiwgMHgwMDA9b2ZmKQorICoJCV9HVVNfVk9JQ0VWT0wyCS0gU2V0cyB2b2ljZSB2b2x1bWUgKFAxPXZvbHVtZSwgMHhmZmY9bWF4LCAweGVmZj1oYWxmLCAweDAwMD1vZmYpCisgKgkJCQkgIChMaWtlIEdVU19WT0lDRVZPTCBidXQgZG9lc24ndCBjaGFuZ2UgdGhlIGh3CisgKgkJCQkgIHZvbHVtZS4gSXQganVzdCB1cGRhdGVzIHZvbHVtZSBpbiB0aGUgdm9pY2UgdGFibGUpLgorICoKKyAqCQlfR1VTX1JBTVBSQU5HRQktIFNldHMgbGltaXRzIGZvciB2b2x1bWUgcmFtcGluZyAoUDE9bG93IHZvbHVtZSwgUDI9aGlnaCB2b2x1bWUpCisgKgkJX0dVU19SQU1QUkFURQktIFNldHMgdGhlIHNwZWVkIGZvciB2b2x1bWUgcmFtcGluZyAoUDE9c2NhbGUsIFAyPXJhdGUpCisgKgkJX0dVU19SQU1QTU9ERQktIFNldHMgdGhlIHZvbHVtZSByYW1waW5nIG1vZGUgKFAxPXJhbXBpbmcgbW9kZSkKKyAqCQlfR1VTX1JBTVBPTgktIFN0YXJ0cyB2b2x1bWUgcmFtcGluZyAobm8gcGFyYW1ldGVycykKKyAqCQlfR1VTX1JBTVBPRkYJLSBTdG9wcyB2b2x1bWUgcmFtcGluZyAobm8gcGFyYW1ldGVycykKKyAqCQlfR1VTX1ZPTFVNRV9TQ0FMRSAtIENoYW5nZXMgdGhlIHZvbHVtZSBjYWxjdWxhdGlvbiBjb25zdGFudHMKKyAqCQkJCSAgZm9yIGFsbCB2b2ljZXMuCisgKi8KKworI2RlZmluZSBfR1VTX05VTVZPSUNFUwkJMHgwMAorI2RlZmluZSBfR1VTX1ZPSUNFU0FNUExFCTB4MDEJLyogT0JTT0xFVEUgKi8KKyNkZWZpbmUgX0dVU19WT0lDRU9OCQkweDAyCisjZGVmaW5lIF9HVVNfVk9JQ0VPRkYJCTB4MDMKKyNkZWZpbmUgX0dVU19WT0lDRU1PREUJCTB4MDQKKyNkZWZpbmUgX0dVU19WT0lDRUJBTEEJCTB4MDUKKyNkZWZpbmUgX0dVU19WT0lDRUZSRVEJCTB4MDYKKyNkZWZpbmUgX0dVU19WT0lDRVZPTAkJMHgwNworI2RlZmluZSBfR1VTX1JBTVBSQU5HRQkJMHgwOAorI2RlZmluZSBfR1VTX1JBTVBSQVRFCQkweDA5CisjZGVmaW5lIF9HVVNfUkFNUE1PREUJCTB4MGEKKyNkZWZpbmUgX0dVU19SQU1QT04JCTB4MGIKKyNkZWZpbmUgX0dVU19SQU1QT0ZGCQkweDBjCisjZGVmaW5lIF9HVVNfVk9JQ0VGQURFCQkweDBkCisjZGVmaW5lIF9HVVNfVk9MVU1FX1NDQUxFCTB4MGUKKyNkZWZpbmUgX0dVU19WT0lDRVZPTDIJCTB4MGYKKyNkZWZpbmUgX0dVU19WT0lDRV9QT1MJCTB4MTAKKworLyoKKyAqCUdVUyBBUEkgbWFjcm9zCisgKi8KKworI2RlZmluZSBfR1VTX0NNRChjaG4sIHZvaWNlLCBjbWQsIHAxLCBwMikgXAorCQkJCQl7X1NFUV9ORUVEQlVGKDgpOyBfc2VxYnVmW19zZXFidWZwdHJdID0gU0VRX1BSSVZBVEU7XAorCQkJCQlfc2VxYnVmW19zZXFidWZwdHIrMV0gPSAoY2huKTsgX3NlcWJ1Zltfc2VxYnVmcHRyKzJdID0gY21kO1wKKwkJCQkJX3NlcWJ1Zltfc2VxYnVmcHRyKzNdID0gdm9pY2U7XAorCQkJCQkqKHVuc2lnbmVkIHNob3J0KikmX3NlcWJ1Zltfc2VxYnVmcHRyKzRdID0gcDE7XAorCQkJCQkqKHVuc2lnbmVkIHNob3J0KikmX3NlcWJ1Zltfc2VxYnVmcHRyKzZdID0gcDI7XAorCQkJCQlfU0VRX0FEVkJVRig4KTt9CisKKyNkZWZpbmUgR1VTX05VTVZPSUNFUyhjaG4sIHAxKQkJCV9HVVNfQ01EKGNobiwgMCwgX0dVU19OVU1WT0lDRVMsIChwMSksIDApCisjZGVmaW5lIEdVU19WT0lDRVNBTVBMRShjaG4sIHZvaWNlLCBwMSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VTQU1QTEUsIChwMSksIDApCS8qIE9CU09MRVRFICovCisjZGVmaW5lIEdVU19WT0lDRU9OKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRU9OLCAocDEpLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VPRkYoY2huLCB2b2ljZSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VPRkYsIDAsIDApCisjZGVmaW5lIEdVU19WT0lDRUZBREUoY2huLCB2b2ljZSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9JQ0VGQURFLCAwLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VNT0RFKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRU1PREUsIChwMSksIDApCisjZGVmaW5lIEdVU19WT0lDRUJBTEEoY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFQkFMQSwgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1ZPSUNFRlJFUShjaG4sIHZvaWNlLCBwKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRUZSRVEsIFwKKwkJCQkJCQkocCkgJiAweGZmZmYsICgocCkgPj4gMTYpICYgMHhmZmZmKQorI2RlZmluZSBHVVNfVk9JQ0VWT0woY2huLCB2b2ljZSwgcDEpCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFVk9MLCAocDEpLCAwKQorI2RlZmluZSBHVVNfVk9JQ0VWT0wyKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19WT0lDRVZPTDIsIChwMSksIDApCisjZGVmaW5lIEdVU19SQU1QUkFOR0UoY2huLCB2b2ljZSwgbG93LCBoaWdoKQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1JBTVBSQU5HRSwgKGxvdyksIChoaWdoKSkKKyNkZWZpbmUgR1VTX1JBTVBSQVRFKGNobiwgdm9pY2UsIHAxLCBwMikJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19SQU1QUkFURSwgKHAxKSwgKHAyKSkKKyNkZWZpbmUgR1VTX1JBTVBNT0RFKGNobiwgdm9pY2UsIHAxKQkJX0dVU19DTUQoY2huLCB2b2ljZSwgX0dVU19SQU1QTU9ERSwgKHAxKSwgMCkKKyNkZWZpbmUgR1VTX1JBTVBPTihjaG4sIHZvaWNlLCBwMSkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfUkFNUE9OLCAocDEpLCAwKQorI2RlZmluZSBHVVNfUkFNUE9GRihjaG4sIHZvaWNlKQkJCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfUkFNUE9GRiwgMCwgMCkKKyNkZWZpbmUgR1VTX1ZPTFVNRV9TQ0FMRShjaG4sIHZvaWNlLCBwMSwgcDIpCV9HVVNfQ01EKGNobiwgdm9pY2UsIF9HVVNfVk9MVU1FX1NDQUxFLCAocDEpLCAocDIpKQorI2RlZmluZSBHVVNfVk9JQ0VfUE9TKGNobiwgdm9pY2UsIHApCQlfR1VTX0NNRChjaG4sIHZvaWNlLCBfR1VTX1ZPSUNFX1BPUywgXAorCQkJCQkJCShwKSAmIDB4ZmZmZiwgKChwKSA+PiAxNikgJiAweGZmZmYpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfTElOVVhfVU5fSAorI2RlZmluZSBfTElOVVhfVU5fSAorCisjZGVmaW5lIFVOSVhfUEFUSF9NQVgJMTA4CisKK3N0cnVjdCBzb2NrYWRkcl91biB7CisJc2FfZmFtaWx5X3Qgc3VuX2ZhbWlseTsJLyogQUZfVU5JWCAqLworCWNoYXIgc3VuX3BhdGhbVU5JWF9QQVRIX01BWF07CS8qIHBhdGhuYW1lICovCit9OworCisjZW5kaWYgLyogX0xJTlVYX1VOX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdW5pc3RkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuaXN0ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGQ1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VuaXN0ZC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfTElOVVhfVU5JU1REX0hfCisjZGVmaW5lIF9MSU5VWF9VTklTVERfSF8KKworLyoKKyAqIEluY2x1ZGUgbWFjaGluZSBzcGVjaWZpYyBzeXNjYWxsIG51bWJlcnMKKyAqLworI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9VTklTVERfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2F1ZGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDIzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiA8bGludXgvdXNiL2F1ZGlvLmg+IC0tIFVTQiBBdWRpbyBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGh1bXRyb25pY3MgUHR5IEx0ZC4KKyAqIERldmVsb3BlZCBmb3IgVGh1bXRyb25pY3MgYnkgR3JleSBJbm5vdmF0aW9uCisgKiBCZW4gV2lsbGlhbXNvbiA8YmVuLndpbGxpYW1zb25AZ3JleWlubm92YXRpb24uY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBob2xkcyBVU0IgY29uc3RhbnRzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluZWQKKyAqIGJ5IHRoZSBVU0IgRGV2aWNlIENsYXNzIERlZmluaXRpb24gZm9yIEF1ZGlvIERldmljZXMuCisgKiBDb21tZW50cyBiZWxvdyByZWZlcmVuY2UgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhhdCBkb2N1bWVudDoKKyAqCisgKiBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kZXZjbGFzc19kb2NzL2F1ZGlvMTAucGRmCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9BVURJT19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0FVRElPX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEEuMiBBdWRpbyBJbnRlcmZhY2UgU3ViY2xhc3MgQ29kZXMgKi8KKyNkZWZpbmUgVVNCX1NVQkNMQVNTX0FVRElPQ09OVFJPTAkweDAxCisjZGVmaW5lIFVTQl9TVUJDTEFTU19BVURJT1NUUkVBTUlORwkweDAyCisjZGVmaW5lIFVTQl9TVUJDTEFTU19NSURJU1RSRUFNSU5HCTB4MDMKKworLyogNC4zLjIgIENsYXNzLVNwZWNpZmljIEFDIEludGVyZmFjZSBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX2FjX2hlYWRlcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOwkJCS8vIDgrbgorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8vIFVTQl9EVF9DU19JTlRFUkZBQ0UKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8vIFVTQl9NU19IRUFERVIKKwlfX2xlMTYgYmNkQURDOwkJCS8vIDB4MDEwMAorCV9fbGUxNiB3VG90YWxMZW5ndGg7CQkvLyBpbmNsdWRlcyBVbml0IGFuZCBUZXJtaW5hbCBkZXNjLgorCV9fdTggIGJJbkNvbGxlY3Rpb247CQkvLyBuCisJX191OCAgYmFJbnRlcmZhY2VOcltdOwkJLy8gW25dCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfQUNfSEVBREVSX1NJWkUobikJKDgrKG4pKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VU0JfQUNfSEVBREVSX0RFU0NSSVBUT1IobikgCQkJXAorc3RydWN0IHVzYl9hY19oZWFkZXJfZGVzY3JpcHRvcl8jI24gewkJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fbGUxNiBiY2RBREM7CQkJCQkJXAorCV9fbGUxNiB3VG90YWxMZW5ndGg7CQkJCQlcCisJX191OCAgYkluQ29sbGVjdGlvbjsJCQkJCVwKKwlfX3U4ICBiYUludGVyZmFjZU5yW25dOwkJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDRhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYi9jZGMuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIFVTQiBDb21tdW5pY2F0aW9ucyBEZXZpY2UgQ2xhc3MgKENEQykgZGVmaW5pdGlvbnMKKyAqCisgKiBDREMgc2F5cyBob3cgdG8gdGFsayB0byBsb3RzIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBuZXR3b3JrIGFkYXB0ZXJzLAorICogbm90YWJseSBldGhlcm5ldCBhZGFwdGVycyBhbmQgdmFyaW91cyBtb2RlbXMuICBJdCdzIHVzZWQgbW9zdGx5IHdpdGgKKyAqIGZpcm13YXJlIGJhc2VkIFVTQiBwZXJpcGhlcmFscy4KKyAqLworCisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfQUNNCQkJMHgwMgorI2RlZmluZSBVU0JfQ0RDX1NVQkNMQVNTX0VUSEVSTkVUCQkweDA2CisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfV0hDTQkJCTB4MDgKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19ETU0JCQkweDA5CisjZGVmaW5lIFVTQl9DRENfU1VCQ0xBU1NfTURMTQkJCTB4MGEKKyNkZWZpbmUgVVNCX0NEQ19TVUJDTEFTU19PQkVYCQkJMHgwYgorCisjZGVmaW5lIFVTQl9DRENfUFJPVE9fTk9ORQkJCTAKKworI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19BVF9WMjVURVIJCTEKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fQVRfUENDQTEwMQkJMgorI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19BVF9QQ0NBMTAxX1dBS0UJMworI2RlZmluZSBVU0JfQ0RDX0FDTV9QUk9UT19BVF9HU00JCTQKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fQVRfM0cJCQk1CisjZGVmaW5lIFVTQl9DRENfQUNNX1BST1RPX0FUX0NETUEJCTYKKyNkZWZpbmUgVVNCX0NEQ19BQ01fUFJPVE9fVkVORE9SCQkweGZmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDbGFzcy1TcGVjaWZpYyBkZXNjcmlwdG9ycyAuLi4gdGhlcmUgYXJlIGEgY291cGxlIGRvemVuIG9mIHRoZW0KKyAqLworCisjZGVmaW5lIFVTQl9DRENfSEVBREVSX1RZUEUJCTB4MDAJCS8qIGhlYWRlcl9kZXNjICovCisjZGVmaW5lIFVTQl9DRENfQ0FMTF9NQU5BR0VNRU5UX1RZUEUJMHgwMQkJLyogY2FsbF9tZ210X2Rlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVVNCX0NEQ19BQ01fVFlQRQkJMHgwMgkJLyogYWNtX2Rlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVVNCX0NEQ19VTklPTl9UWVBFCQkweDA2CQkvKiB1bmlvbl9kZXNjICovCisjZGVmaW5lIFVTQl9DRENfQ09VTlRSWV9UWVBFCQkweDA3CisjZGVmaW5lIFVTQl9DRENfTkVUV09SS19URVJNSU5BTF9UWVBFCTB4MGEJCS8qIG5ldHdvcmtfdGVybWluYWxfZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX0VUSEVSTkVUX1RZUEUJCTB4MGYJCS8qIGV0aGVyX2Rlc2MgKi8KKyNkZWZpbmUgVVNCX0NEQ19XSENNX1RZUEUJCTB4MTEKKyNkZWZpbmUgVVNCX0NEQ19NRExNX1RZUEUJCTB4MTIJCS8qIG1kbG1fZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX01ETE1fREVUQUlMX1RZUEUJMHgxMwkJLyogbWRsbV9kZXRhaWxfZGVzYyAqLworI2RlZmluZSBVU0JfQ0RDX0RNTV9UWVBFCQkweDE0CisjZGVmaW5lIFVTQl9DRENfT0JFWF9UWVBFCQkweDE1CisKKy8qICJIZWFkZXIgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjICA1LjIuMy4xICovCitzdHJ1Y3QgdXNiX2NkY19oZWFkZXJfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX19sZTE2CWJjZENEQzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiQ2FsbCBNYW5hZ2VtZW50IERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgIDUuMi4zLjIgKi8KK3N0cnVjdCB1c2JfY2RjX2NhbGxfbWdtdF9kZXNjcmlwdG9yIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWJtQ2FwYWJpbGl0aWVzOworI2RlZmluZSBVU0JfQ0RDX0NBTExfTUdNVF9DQVBfQ0FMTF9NR01UCQkweDAxCisjZGVmaW5lIFVTQl9DRENfQ0FMTF9NR01UX0NBUF9EQVRBX0lOVEYJCTB4MDIKKworCV9fdTgJYkRhdGFJbnRlcmZhY2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIkFic3RyYWN0IENvbnRyb2wgTWFuYWdlbWVudCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjICA1LjIuMy4zICovCitzdHJ1Y3QgdXNiX2NkY19hY21fZGVzY3JpcHRvciB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAlibUNhcGFiaWxpdGllczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBjYXBhYmlsaXRpZXMgZnJvbSA1LjIuMy4zICovCisKKyNkZWZpbmUgVVNCX0NEQ19DT01NX0ZFQVRVUkUJMHgwMQorI2RlZmluZSBVU0JfQ0RDX0NBUF9MSU5FCTB4MDIKKyNkZWZpbmUgVVNCX0NEQ19DQVBfQlJLCTB4MDQKKyNkZWZpbmUgVVNCX0NEQ19DQVBfTk9USUZZCTB4MDgKKworLyogIlVuaW9uIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgc3BlYyA1LjIuMy44ICovCitzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWJNYXN0ZXJJbnRlcmZhY2UwOworCV9fdTgJYlNsYXZlSW50ZXJmYWNlMDsKKwkvKiAuLi4gYW5kIHRoZXJlIGNvdWxkIGJlIG90aGVyIHNsYXZlIGludGVyZmFjZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiQ291bnRyeSBTZWxlY3Rpb24gRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjkgKi8KK3N0cnVjdCB1c2JfY2RjX2NvdW50cnlfZnVuY3Rpb25hbF9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWlDb3VudHJ5Q29kZVJlbERhdGU7CisJX19sZTE2CXdDb3VudHlDb2RlMDsKKwkvKiAuLi4gYW5kIHRoZXJlIGNhbiBiZSBhIGxvdCBvZiBjb3VudHJ5IGNvZGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIk5ldHdvcmsgQ2hhbm5lbCBUZXJtaW5hbCBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgNS4yLjMuMTEgKi8KK3N0cnVjdCB1c2JfY2RjX25ldHdvcmtfdGVybWluYWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAliRW50aXR5SWQ7CisJX191OAlpTmFtZTsKKwlfX3U4CWJDaGFubmVsSW5kZXg7CisJX191OAliUGh5c2ljYWxJbnRlcmZhY2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIkV0aGVybmV0IE5ldHdvcmtpbmcgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjE2ICovCitzdHJ1Y3QgdXNiX2NkY19ldGhlcl9kZXNjIHsKKwlfX3U4CWJMZW5ndGg7CisJX191OAliRGVzY3JpcHRvclR5cGU7CisJX191OAliRGVzY3JpcHRvclN1YlR5cGU7CisKKwlfX3U4CWlNQUNBZGRyZXNzOworCV9fbGUzMglibUV0aGVybmV0U3RhdGlzdGljczsKKwlfX2xlMTYJd01heFNlZ21lbnRTaXplOworCV9fbGUxNgl3TnVtYmVyTUNGaWx0ZXJzOworCV9fdTgJYk51bWJlclBvd2VyRmlsdGVyczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiAiTURMTSBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIFdNQyBzcGVjIDYuNy4yLjMgKi8KK3N0cnVjdCB1c2JfY2RjX21kbG1fZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX19sZTE2CWJjZFZlcnNpb247CisJX191OAliR1VJRFsxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogIk1ETE0gRGV0YWlsIEZ1bmN0aW9uYWwgRGVzY3JpcHRvciIgZnJvbSBDREMgV01DIHNwZWMgNi43LjIuNCAqLworc3RydWN0IHVzYl9jZGNfbWRsbV9kZXRhaWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJLyogdHlwZSBpcyBhc3NvY2lhdGVkIHdpdGggbWRsbV9kZXNjLmJHVUlEICovCisJX191OAliR3VpZERlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRldGFpbERhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIENsYXNzLVNwZWNpZmljIENvbnRyb2wgUmVxdWVzdHMgKDYuMikKKyAqCisgKiBzZWN0aW9uIDMuNi4yLjEgdGFibGUgNCBoYXMgdGhlIEFDTSBwcm9maWxlLCBmb3IgbW9kZW1zLgorICogc2VjdGlvbiAzLjguMiB0YWJsZSAxMCBoYXMgdGhlIGV0aGVybmV0IHByb2ZpbGUuCisgKgorICogTWljcm9zb2Z0J3MgUk5ESVMgc3RhY2sgZm9yIEV0aGVybmV0IGlzIGEgdmVuZG9yLXNwZWNpZmljIENEQyBBQ00gdmFyaWFudCwKKyAqIGhlYXZpbHkgZGVwZW5kZW50IG9uIHRoZSBlbmNhcHN1bGF0ZWQgKHByb3ByaWV0YXJ5KSBjb21tYW5kIG1lY2hhbmlzbS4KKyAqLworCisjZGVmaW5lIFVTQl9DRENfU0VORF9FTkNBUFNVTEFURURfQ09NTUFORAkweDAwCisjZGVmaW5lIFVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRQkweDAxCisjZGVmaW5lIFVTQl9DRENfUkVRX1NFVF9MSU5FX0NPRElORwkJMHgyMAorI2RlZmluZSBVU0JfQ0RDX1JFUV9HRVRfTElORV9DT0RJTkcJCTB4MjEKKyNkZWZpbmUgVVNCX0NEQ19SRVFfU0VUX0NPTlRST0xfTElORV9TVEFURQkweDIyCisjZGVmaW5lIFVTQl9DRENfUkVRX1NFTkRfQlJFQUsJCQkweDIzCisjZGVmaW5lIFVTQl9DRENfU0VUX0VUSEVSTkVUX01VTFRJQ0FTVF9GSUxURVJTCTB4NDAKKyNkZWZpbmUgVVNCX0NEQ19TRVRfRVRIRVJORVRfUE1fUEFUVEVSTl9GSUxURVIJMHg0MQorI2RlZmluZSBVU0JfQ0RDX0dFVF9FVEhFUk5FVF9QTV9QQVRURVJOX0ZJTFRFUgkweDQyCisjZGVmaW5lIFVTQl9DRENfU0VUX0VUSEVSTkVUX1BBQ0tFVF9GSUxURVIJMHg0MworI2RlZmluZSBVU0JfQ0RDX0dFVF9FVEhFUk5FVF9TVEFUSVNUSUMJCTB4NDQKKworLyogTGluZSBDb2RpbmcgU3RydWN0dXJlIGZyb20gQ0RDIHNwZWMgNi4yLjEzICovCitzdHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZyB7CisJX19sZTMyCWR3RFRFUmF0ZTsKKwlfX3U4CWJDaGFyRm9ybWF0OworI2RlZmluZSBVU0JfQ0RDXzFfU1RPUF9CSVRTCQkJMAorI2RlZmluZSBVU0JfQ0RDXzFfNV9TVE9QX0JJVFMJCQkxCisjZGVmaW5lIFVTQl9DRENfMl9TVE9QX0JJVFMJCQkyCisKKwlfX3U4CWJQYXJpdHlUeXBlOworI2RlZmluZSBVU0JfQ0RDX05PX1BBUklUWQkJCTAKKyNkZWZpbmUgVVNCX0NEQ19PRERfUEFSSVRZCQkJMQorI2RlZmluZSBVU0JfQ0RDX0VWRU5fUEFSSVRZCQkJMgorI2RlZmluZSBVU0JfQ0RDX01BUktfUEFSSVRZCQkJMworI2RlZmluZSBVU0JfQ0RDX1NQQUNFX1BBUklUWQkJCTQKKworCV9fdTgJYkRhdGFCaXRzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIHRhYmxlIDYyOyBiaXRzIGluIG11bHRpY2FzdCBmaWx0ZXIgKi8KKyNkZWZpbmUJVVNCX0NEQ19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUwkJKDEgPDwgMCkKKyNkZWZpbmUJVVNCX0NEQ19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUCSgxIDw8IDEpIC8qIG5vIGZpbHRlciAqLworI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkoMSA8PCAyKQorI2RlZmluZQlVU0JfQ0RDX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVAkJKDEgPDwgMykKKyNkZWZpbmUJVVNCX0NEQ19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCSgxIDw8IDQpIC8qIGZpbHRlcmVkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIENsYXNzLVNwZWNpZmljIE5vdGlmaWNhdGlvbnMgKDYuMykgc2VudCBieSBpbnRlcnJ1cHQgdHJhbnNmZXJzCisgKgorICogc2VjdGlvbiAzLjguMiB0YWJsZSAxMSBvZiB0aGUgQ0RDIHNwZWMgbGlzdHMgRXRoZXJuZXQgbm90aWZpY2F0aW9ucworICogc2VjdGlvbiAzLjYuMi4xIHRhYmxlIDUgc3BlY2lmaWVzIEFDTSBub3RpZmljYXRpb25zLCBhY2NlcHRlZCBieSBSTkRJUworICogUk5ESVMgYWxzbyBkZWZpbmVzIGl0cyBvd24gYml0LWluY29tcGF0aWJsZSBub3RpZmljYXRpb25zCisgKi8KKworI2RlZmluZSBVU0JfQ0RDX05PVElGWV9ORVRXT1JLX0NPTk5FQ1RJT04JMHgwMAorI2RlZmluZSBVU0JfQ0RDX05PVElGWV9SRVNQT05TRV9BVkFJTEFCTEUJMHgwMQorI2RlZmluZSBVU0JfQ0RDX05PVElGWV9TRVJJQUxfU1RBVEUJCTB4MjAKKyNkZWZpbmUgVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFCQkweDJhCisKK3N0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbiB7CisJX191OAlibVJlcXVlc3RUeXBlOworCV9fdTgJYk5vdGlmaWNhdGlvblR5cGU7CisJX19sZTE2CXdWYWx1ZTsKKwlfX2xlMTYJd0luZGV4OworCV9fbGUxNgl3TGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvY2g5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2OTQzOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogVGhpcyBmaWxlIGhvbGRzIFVTQiBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgdGhhdCBhcmUgbmVlZGVkIGZvcgorICogVVNCIGRldmljZSBBUElzLiAgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIFVTQiBkZXZpY2UgbW9kZWwsIHdoaWNoIGlzCisgKiBkZWZpbmVkIGluIGNoYXB0ZXIgOSBvZiB0aGUgVVNCIDIuMCBzcGVjaWZpY2F0aW9uIGFuZCBpbiB0aGUKKyAqIFdpcmVsZXNzIFVTQiAxLjAgKHNwcmVhZCBhcm91bmQpLiAgTGludXggaGFzIHNldmVyYWwgQVBJcyBpbiBDIHRoYXQKKyAqIG5lZWQgdGhlc2U6CisgKgorICogLSB0aGUgbWFzdGVyL2hvc3Qgc2lkZSBMaW51eC1VU0Iga2VybmVsIGRyaXZlciBBUEk7CisgKiAtIHRoZSAidXNiZnMiIHVzZXIgc3BhY2UgQVBJOyBhbmQKKyAqIC0gdGhlIExpbnV4ICJnYWRnZXQiIHNsYXZlL2RldmljZS9wZXJpcGhlcmFsIHNpZGUgZHJpdmVyIEFQSS4KKyAqCisgKiBVU0IgMi4wIGFkZHMgYW4gYWRkaXRpb25hbCAiT24gVGhlIEdvIiAoT1RHKSBtb2RlLCB3aGljaCBsZXRzIHN5c3RlbXMKKyAqIGFjdCBlaXRoZXIgYXMgYSBVU0IgbWFzdGVyL2hvc3Qgb3IgYXMgYSBVU0Igc2xhdmUvZGV2aWNlLiAgVGhhdCBtZWFucworICogdGhlIG1hc3RlciBhbmQgc2xhdmUgc2lkZSBBUElzIGJlbmVmaXQgZnJvbSB3b3JraW5nIHdlbGwgdG9nZXRoZXIuCisgKgorICogVGhlcmUncyBhbHNvICJXaXJlbGVzcyBVU0IiLCB1c2luZyBsb3cgcG93ZXIgc2hvcnQgcmFuZ2UgcmFkaW9zIGZvcgorICogcGVyaXBoZXJhbCBpbnRlcmNvbm5lY3Rpb24gYnV0IG90aGVyd2lzZSBidWlsZGluZyBvbiB0aGUgVVNCIGZyYW1ld29yay4KKyAqCisgKiBOb3RlIGFsbCBkZXNjcmlwdG9ycyBhcmUgZGVjbGFyZWQgJ19fYXR0cmlidXRlX18oKHBhY2tlZCkpJyBzbyB0aGF0OgorICoKKyAqIFthXSB0aGV5IG5ldmVyIGdldCBwYWRkZWQsIGVpdGhlciBpbnRlcm5hbGx5IChVU0Igc3BlYyB3cml0ZXJzCisgKiAgICAgcHJvYmFibHkgaGFuZGxlZCB0aGF0KSBvciBleHRlcm5hbGx5OworICoKKyAqIFtiXSBzbyB0aGF0IGFjY2Vzc2luZyBiaWdnZXItdGhhbi1hLWJ5dGVzIGZpZWxkcyB3aWxsIG5ldmVyCisgKiAgICAgZ2VuZXJhdGUgYnVzIGVycm9ycyBvbiBhbnkgcGxhdGZvcm0sIGV2ZW4gd2hlbiB0aGUgbG9jYXRpb24gb2YKKyAqICAgICBpdHMgZGVzY3JpcHRvciBpbnNpZGUgYSBidW5kbGUgaXNuJ3QgIm5hdHVyYWxseSBhbGlnbmVkIiwgYW5kCisgKgorICogW2NdIGZvciBjb25zaXN0ZW5jeSwgcmVtb3ZpbmcgYWxsIGRvdWJ0IGV2ZW4gd2hlbiBpdCBhcHBlYXJzIHRvCisgKiAgICAgc29tZW9uZSB0aGF0IHRoZSB0d28gb3RoZXIgcG9pbnRzIGFyZSBub24taXNzdWVzIGZvciB0aGF0CisgKiAgICAgcGFydGljdWxhciBkZXNjcmlwdG9yIHR5cGUuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9DSDlfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9DSDlfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogX191OCBldGMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ09OVFJPTCBSRVFVRVNUIFNVUFBPUlQgKi8KKworLyoKKyAqIFVTQiBkaXJlY3Rpb25zCisgKgorICogVGhpcyBiaXQgZmxhZyBpcyB1c2VkIGluIGVuZHBvaW50IGRlc2NyaXB0b3JzJyBiRW5kcG9pbnRBZGRyZXNzIGZpZWxkLgorICogSXQncyBhbHNvIG9uZSBvZiB0aHJlZSBmaWVsZHMgaW4gY29udHJvbCByZXF1ZXN0cyBiUmVxdWVzdFR5cGUuCisgKi8KKyNkZWZpbmUgVVNCX0RJUl9PVVQJCQkwCQkvKiB0byBkZXZpY2UgKi8KKyNkZWZpbmUgVVNCX0RJUl9JTgkJCTB4ODAJCS8qIHRvIGhvc3QgKi8KKworLyoKKyAqIFVTQiB0eXBlcywgdGhlIHNlY29uZCBvZiB0aHJlZSBiUmVxdWVzdFR5cGUgZmllbGRzCisgKi8KKyNkZWZpbmUgVVNCX1RZUEVfTUFTSwkJCSgweDAzIDw8IDUpCisjZGVmaW5lIFVTQl9UWVBFX1NUQU5EQVJECQkoMHgwMCA8PCA1KQorI2RlZmluZSBVU0JfVFlQRV9DTEFTUwkJCSgweDAxIDw8IDUpCisjZGVmaW5lIFVTQl9UWVBFX1ZFTkRPUgkJCSgweDAyIDw8IDUpCisjZGVmaW5lIFVTQl9UWVBFX1JFU0VSVkVECQkoMHgwMyA8PCA1KQorCisvKgorICogVVNCIHJlY2lwaWVudHMsIHRoZSB0aGlyZCBvZiB0aHJlZSBiUmVxdWVzdFR5cGUgZmllbGRzCisgKi8KKyNkZWZpbmUgVVNCX1JFQ0lQX01BU0sJCQkweDFmCisjZGVmaW5lIFVTQl9SRUNJUF9ERVZJQ0UJCTB4MDAKKyNkZWZpbmUgVVNCX1JFQ0lQX0lOVEVSRkFDRQkJMHgwMQorI2RlZmluZSBVU0JfUkVDSVBfRU5EUE9JTlQJCTB4MDIKKyNkZWZpbmUgVVNCX1JFQ0lQX09USEVSCQkJMHgwMworLyogRnJvbSBXaXJlbGVzcyBVU0IgMS4wICovCisjZGVmaW5lIFVTQl9SRUNJUF9QT1JUIAkJCTB4MDQKKyNkZWZpbmUgVVNCX1JFQ0lQX1JQSVBFIAkJMHgwNQorCisvKgorICogU3RhbmRhcmQgcmVxdWVzdHMsIGZvciB0aGUgYlJlcXVlc3QgZmllbGQgb2YgYSBTRVRVUCBwYWNrZXQuCisgKgorICogVGhlc2UgYXJlIHF1YWxpZmllZCBieSB0aGUgYlJlcXVlc3RUeXBlIGZpZWxkLCBzbyB0aGF0IGZvciBleGFtcGxlCisgKiBUWVBFX0NMQVNTIG9yIFRZUEVfVkVORE9SIHNwZWNpZmljIGZlYXR1cmUgZmxhZ3MgY291bGQgYmUgcmV0cmlldmVkCisgKiBieSBhIEdFVF9TVEFUVVMgcmVxdWVzdC4KKyAqLworI2RlZmluZSBVU0JfUkVRX0dFVF9TVEFUVVMJCTB4MDAKKyNkZWZpbmUgVVNCX1JFUV9DTEVBUl9GRUFUVVJFCQkweDAxCisjZGVmaW5lIFVTQl9SRVFfU0VUX0ZFQVRVUkUJCTB4MDMKKyNkZWZpbmUgVVNCX1JFUV9TRVRfQUREUkVTUwkJMHgwNQorI2RlZmluZSBVU0JfUkVRX0dFVF9ERVNDUklQVE9SCQkweDA2CisjZGVmaW5lIFVTQl9SRVFfU0VUX0RFU0NSSVBUT1IJCTB4MDcKKyNkZWZpbmUgVVNCX1JFUV9HRVRfQ09ORklHVVJBVElPTgkweDA4CisjZGVmaW5lIFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04JMHgwOQorI2RlZmluZSBVU0JfUkVRX0dFVF9JTlRFUkZBQ0UJCTB4MEEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfSU5URVJGQUNFCQkweDBCCisjZGVmaW5lIFVTQl9SRVFfU1lOQ0hfRlJBTUUJCTB4MEMKKworI2RlZmluZSBVU0JfUkVRX1NFVF9FTkNSWVBUSU9OCQkweDBECS8qIFdpcmVsZXNzIFVTQiAqLworI2RlZmluZSBVU0JfUkVRX0dFVF9FTkNSWVBUSU9OCQkweDBFCisjZGVmaW5lIFVTQl9SRVFfUlBJUEVfQUJPUlQJCTB4MEUKKyNkZWZpbmUgVVNCX1JFUV9TRVRfSEFORFNIQUtFCQkweDBGCisjZGVmaW5lIFVTQl9SRVFfUlBJUEVfUkVTRVQJCTB4MEYKKyNkZWZpbmUgVVNCX1JFUV9HRVRfSEFORFNIQUtFCQkweDEwCisjZGVmaW5lIFVTQl9SRVFfU0VUX0NPTk5FQ1RJT04JCTB4MTEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfU0VDVVJJVFlfREFUQQkweDEyCisjZGVmaW5lIFVTQl9SRVFfR0VUX1NFQ1VSSVRZX0RBVEEJMHgxMworI2RlZmluZSBVU0JfUkVRX1NFVF9XVVNCX0RBVEEJCTB4MTQKKyNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1dSSVRFCTB4MTUKKyNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1JFQUQJMHgxNgorI2RlZmluZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0VfRFMJMHgxNworCisvKgorICogVVNCIGZlYXR1cmUgZmxhZ3MgYXJlIHdyaXR0ZW4gdXNpbmcgVVNCX1JFUV97Q0xFQVIsU0VUfV9GRUFUVVJFLCBhbmQKKyAqIGFyZSByZWFkIGFzIGEgYml0IGFycmF5IHJldHVybmVkIGJ5IFVTQl9SRVFfR0VUX1NUQVRVUy4gIChTbyB0aGVyZQorICogYXJlIGF0IG1vc3Qgc2l4dGVlbiBmZWF0dXJlcyBvZiBlYWNoIHR5cGUuKQorICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVECQkwCS8qIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUAkxCS8qIGRldiBtYXkgaW5pdGlhdGUgd2FrZXVwICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfVEVTVF9NT0RFCQkyCS8qICh3aXJlZCBoaWdoIHNwZWVkIG9ubHkpICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQkFUVEVSWQkJMgkvKiAod2lyZWxlc3MpICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQl9ITlBfRU5BQkxFCQkzCS8qIChvdGcpIGRldiBtYXkgaW5pdGlhdGUgSE5QICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfV1VTQl9ERVZJQ0UJCTMJLyogKHdpcmVsZXNzKSovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQV9ITlBfU1VQUE9SVAk0CS8qIChvdGcpIFJIIHBvcnQgc3VwcG9ydHMgSE5QICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfQV9BTFRfSE5QX1NVUFBPUlQJNQkvKiAob3RnKSBvdGhlciBSSCBwb3J0IGRvZXMgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9ERUJVR19NT0RFCQk2CS8qIChzcGVjaWFsIGRldmljZXMgb25seSkgKi8KKworI2RlZmluZSBVU0JfRU5EUE9JTlRfSEFMVAkJMAkvKiBJTi9PVVQgd2lsbCBTVEFMTCAqLworCisKKy8qKgorICogc3RydWN0IHVzYl9jdHJscmVxdWVzdCAtIFNFVFVQIGRhdGEgZm9yIGEgVVNCIGRldmljZSBjb250cm9sIHJlcXVlc3QKKyAqIEBiUmVxdWVzdFR5cGU6IG1hdGNoZXMgdGhlIFVTQiBibVJlcXVlc3RUeXBlIGZpZWxkCisgKiBAYlJlcXVlc3Q6IG1hdGNoZXMgdGhlIFVTQiBiUmVxdWVzdCBmaWVsZAorICogQHdWYWx1ZTogbWF0Y2hlcyB0aGUgVVNCIHdWYWx1ZSBmaWVsZCAobGUxNiBieXRlIG9yZGVyKQorICogQHdJbmRleDogbWF0Y2hlcyB0aGUgVVNCIHdJbmRleCBmaWVsZCAobGUxNiBieXRlIG9yZGVyKQorICogQHdMZW5ndGg6IG1hdGNoZXMgdGhlIFVTQiB3TGVuZ3RoIGZpZWxkIChsZTE2IGJ5dGUgb3JkZXIpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gYSBVU0IgZGV2aWNlLiAgSXQgbWF0Y2hlcworICogdGhlIGRpZmZlcmVudCBmaWVsZHMgb2YgdGhlIFVTQiAyLjAgU3BlYyBzZWN0aW9uIDkuMywgdGFibGUgOS0yLiAgU2VlIHRoZQorICogVVNCIHNwZWMgZm9yIGEgZnVsbGVyIGRlc2NyaXB0aW9uIG9mIHRoZSBkaWZmZXJlbnQgZmllbGRzLCBhbmQgd2hhdCB0aGV5IGFyZQorICogdXNlZCBmb3IuCisgKgorICogTm90ZSB0aGF0IHRoZSBkcml2ZXIgZm9yIGFueSBpbnRlcmZhY2UgY2FuIGlzc3VlIGNvbnRyb2wgcmVxdWVzdHMuCisgKiBGb3IgbW9zdCBkZXZpY2VzLCBpbnRlcmZhY2VzIGRvbid0IGNvb3JkaW5hdGUgd2l0aCBlYWNoIG90aGVyLCBzbworICogc3VjaCByZXF1ZXN0cyBtYXkgYmUgbWFkZSBhdCBhbnkgdGltZS4KKyAqLworc3RydWN0IHVzYl9jdHJscmVxdWVzdCB7CisJX191OCBiUmVxdWVzdFR5cGU7CisJX191OCBiUmVxdWVzdDsKKwlfX2xlMTYgd1ZhbHVlOworCV9fbGUxNiB3SW5kZXg7CisJX19sZTE2IHdMZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFNUQU5EQVJEIERFU0NSSVBUT1JTIC4uLiBhcyByZXR1cm5lZCBieSBHRVRfREVTQ1JJUFRPUiwgb3IKKyAqIChyYXJlbHkpIGFjY2VwdGVkIGJ5IFNFVF9ERVNDUklQVE9SLgorICoKKyAqIE5vdGUgdGhhdCBhbGwgbXVsdGktYnl0ZSB2YWx1ZXMgaGVyZSBhcmUgZW5jb2RlZCBpbiBsaXR0bGUgZW5kaWFuCisgKiBieXRlIG9yZGVyICJvbiB0aGUgd2lyZSIuICBCdXQgd2hlbiBleHBvc2VkIHRocm91Z2ggTGludXgtVVNCIEFQSXMsCisgKiB0aGV5J3ZlIGJlZW4gY29udmVydGVkIHRvIGNwdSBieXRlIG9yZGVyLgorICovCisKKy8qCisgKiBEZXNjcmlwdG9yIHR5cGVzIC4uLiBVU0IgMi4wIHNwZWMgdGFibGUgOS41CisgKi8KKyNkZWZpbmUgVVNCX0RUX0RFVklDRQkJCTB4MDEKKyNkZWZpbmUgVVNCX0RUX0NPTkZJRwkJCTB4MDIKKyNkZWZpbmUgVVNCX0RUX1NUUklORwkJCTB4MDMKKyNkZWZpbmUgVVNCX0RUX0lOVEVSRkFDRQkJMHgwNAorI2RlZmluZSBVU0JfRFRfRU5EUE9JTlQJCQkweDA1CisjZGVmaW5lIFVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSCQkweDA2CisjZGVmaW5lIFVTQl9EVF9PVEhFUl9TUEVFRF9DT05GSUcJMHgwNworI2RlZmluZSBVU0JfRFRfSU5URVJGQUNFX1BPV0VSCQkweDA4CisvKiB0aGVzZSBhcmUgZnJvbSBhIG1pbm9yIHVzYiAyLjAgcmV2aXNpb24gKEVDTikgKi8KKyNkZWZpbmUgVVNCX0RUX09URwkJCTB4MDkKKyNkZWZpbmUgVVNCX0RUX0RFQlVHCQkJMHgwYQorI2RlZmluZSBVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OCTB4MGIKKy8qIHRoZXNlIGFyZSBmcm9tIHRoZSBXaXJlbGVzcyBVU0Igc3BlYyAqLworI2RlZmluZSBVU0JfRFRfU0VDVVJJVFkJCQkweDBjCisjZGVmaW5lIFVTQl9EVF9LRVkJCQkweDBkCisjZGVmaW5lIFVTQl9EVF9FTkNSWVBUSU9OX1RZUEUJCTB4MGUKKyNkZWZpbmUgVVNCX0RUX0JPUwkJCTB4MGYKKyNkZWZpbmUgVVNCX0RUX0RFVklDRV9DQVBBQklMSVRZCTB4MTAKKyNkZWZpbmUgVVNCX0RUX1dJUkVMRVNTX0VORFBPSU5UX0NPTVAJMHgxMQorI2RlZmluZSBVU0JfRFRfV0lSRV9BREFQVEVSCQkweDIxCisjZGVmaW5lIFVTQl9EVF9SUElQRQkJCTB4MjIKKworLyogQ29udmVudGlvbmFsIGNvZGVzIGZvciBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9ycy4gIFRoZSBjb252ZW50aW9uIGlzCisgKiBkZWZpbmVkIGluIHRoZSBVU0IgIkNvbW1vbiBDbGFzcyIgU3BlYyAoMy4xMSkuICBJbmRpdmlkdWFsIGNsYXNzIHNwZWNzCisgKiBhcmUgYXV0aG9yaXRhdGl2ZSBmb3IgdGhlaXIgdXNhZ2UsIG5vdCB0aGUgImNvbW1vbiBjbGFzcyIgd3JpdGV1cC4KKyAqLworI2RlZmluZSBVU0JfRFRfQ1NfREVWSUNFCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfREVWSUNFKQorI2RlZmluZSBVU0JfRFRfQ1NfQ09ORklHCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfQ09ORklHKQorI2RlZmluZSBVU0JfRFRfQ1NfU1RSSU5HCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfU1RSSU5HKQorI2RlZmluZSBVU0JfRFRfQ1NfSU5URVJGQUNFCQkoVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRFRfSU5URVJGQUNFKQorI2RlZmluZSBVU0JfRFRfQ1NfRU5EUE9JTlQJCShVU0JfVFlQRV9DTEFTUyB8IFVTQl9EVF9FTkRQT0lOVCkKKworLyogQWxsIHN0YW5kYXJkIGRlc2NyaXB0b3JzIGhhdmUgdGhlc2UgMiBmaWVsZHMgYXQgdGhlIGJlZ2lubmluZyAqLworc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfREVWSUNFOiBEZXZpY2UgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgYmNkVVNCOworCV9fdTggIGJEZXZpY2VDbGFzczsKKwlfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7CisJX191OCAgYkRldmljZVByb3RvY29sOworCV9fdTggIGJNYXhQYWNrZXRTaXplMDsKKwlfX2xlMTYgaWRWZW5kb3I7CisJX19sZTE2IGlkUHJvZHVjdDsKKwlfX2xlMTYgYmNkRGV2aWNlOworCV9fdTggIGlNYW51ZmFjdHVyZXI7CisJX191OCAgaVByb2R1Y3Q7CisJX191OCAgaVNlcmlhbE51bWJlcjsKKwlfX3U4ICBiTnVtQ29uZmlndXJhdGlvbnM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfREVWSUNFX1NJWkUJCTE4CisKKworLyoKKyAqIERldmljZSBhbmQvb3IgSW50ZXJmYWNlIENsYXNzIGNvZGVzCisgKiBhcyBmb3VuZCBpbiBiRGV2aWNlQ2xhc3Mgb3IgYkludGVyZmFjZUNsYXNzCisgKiBhbmQgZGVmaW5lZCBieSB3d3cudXNiLm9yZyBkb2N1bWVudHMKKyAqLworI2RlZmluZSBVU0JfQ0xBU1NfUEVSX0lOVEVSRkFDRQkJMAkvKiBmb3IgRGV2aWNlQ2xhc3MgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX0FVRElPCQkJMQorI2RlZmluZSBVU0JfQ0xBU1NfQ09NTQkJCTIKKyNkZWZpbmUgVVNCX0NMQVNTX0hJRAkJCTMKKyNkZWZpbmUgVVNCX0NMQVNTX1BIWVNJQ0FMCQk1CisjZGVmaW5lIFVTQl9DTEFTU19TVElMTF9JTUFHRQkJNgorI2RlZmluZSBVU0JfQ0xBU1NfUFJJTlRFUgkJNworI2RlZmluZSBVU0JfQ0xBU1NfTUFTU19TVE9SQUdFCQk4CisjZGVmaW5lIFVTQl9DTEFTU19IVUIJCQk5CisjZGVmaW5lIFVTQl9DTEFTU19DRENfREFUQQkJMHgwYQorI2RlZmluZSBVU0JfQ0xBU1NfQ1NDSUQJCQkweDBiCS8qIGNoaXArIHNtYXJ0IGNhcmQgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX0NPTlRFTlRfU0VDCQkweDBkCS8qIGNvbnRlbnQgc2VjdXJpdHkgKi8KKyNkZWZpbmUgVVNCX0NMQVNTX1ZJREVPCQkJMHgwZQorI2RlZmluZSBVU0JfQ0xBU1NfV0lSRUxFU1NfQ09OVFJPTExFUgkweGUwCisjZGVmaW5lIFVTQl9DTEFTU19NSVNDCQkJMHhlZgorI2RlZmluZSBVU0JfQ0xBU1NfQVBQX1NQRUMJCTB4ZmUKKyNkZWZpbmUgVVNCX0NMQVNTX1ZFTkRPUl9TUEVDCQkweGZmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9DT05GSUc6IENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBpbmZvcm1hdGlvbi4KKyAqCisgKiBVU0JfRFRfT1RIRVJfU1BFRURfQ09ORklHIGlzIHRoZSBzYW1lIGRlc2NyaXB0b3IsIGV4Y2VwdCB0aGF0IHRoZQorICogZGVzY3JpcHRvciB0eXBlIGlzIGRpZmZlcmVudC4gIEhpZ2hzcGVlZC1jYXBhYmxlIGRldmljZXMgY2FuIGxvb2sKKyAqIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hhdCBzcGVlZCB0aGV5J3JlIGN1cnJlbnRseSBydW5uaW5nLiAgT25seQorICogZGV2aWNlcyB3aXRoIGEgVVNCX0RUX0RFVklDRV9RVUFMSUZJRVIgaGF2ZSBhbnkgT1RIRVJfU1BFRURfQ09ORklHCisgKiBkZXNjcmlwdG9ycy4KKyAqLworc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJOdW1JbnRlcmZhY2VzOworCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7CisJX191OCAgaUNvbmZpZ3VyYXRpb247CisJX191OCAgYm1BdHRyaWJ1dGVzOworCV9fdTggIGJNYXhQb3dlcjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9DT05GSUdfU0laRQkJOQorCisvKiBmcm9tIGNvbmZpZyBkZXNjcmlwdG9yIGJtQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfQ09ORklHX0FUVF9PTkUJCSgxIDw8IDcpCS8qIG11c3QgYmUgc2V0ICovCisjZGVmaW5lIFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUgkoMSA8PCA2KQkvKiBzZWxmIHBvd2VyZWQgKi8KKyNkZWZpbmUgVVNCX0NPTkZJR19BVFRfV0FLRVVQCQkoMSA8PCA1KQkvKiBjYW4gd2FrZXVwICovCisjZGVmaW5lIFVTQl9DT05GSUdfQVRUX0JBVFRFUlkJCSgxIDw8IDQpCS8qIGJhdHRlcnkgcG93ZXJlZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfU1RSSU5HOiBTdHJpbmcgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd0RhdGFbMV07CQkvKiBVVEYtMTZMRSBlbmNvZGVkICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogbm90ZSB0aGF0ICJzdHJpbmciIHplcm8gaXMgc3BlY2lhbCwgaXQgaG9sZHMgbGFuZ3VhZ2UgY29kZXMgdGhhdAorICogdGhlIGRldmljZSBzdXBwb3J0cywgbm90IFVuaWNvZGUgY2hhcmFjdGVycy4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfSU5URVJGQUNFOiBJbnRlcmZhY2UgZGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiSW50ZXJmYWNlTnVtYmVyOworCV9fdTggIGJBbHRlcm5hdGVTZXR0aW5nOworCV9fdTggIGJOdW1FbmRwb2ludHM7CisJX191OCAgYkludGVyZmFjZUNsYXNzOworCV9fdTggIGJJbnRlcmZhY2VTdWJDbGFzczsKKwlfX3U4ICBiSW50ZXJmYWNlUHJvdG9jb2w7CisJX191OCAgaUludGVyZmFjZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9JTlRFUkZBQ0VfU0laRQkJOQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfRU5EUE9JTlQ6IEVuZHBvaW50IGRlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiRW5kcG9pbnRBZGRyZXNzOworCV9fdTggIGJtQXR0cmlidXRlczsKKwlfX2xlMTYgd01heFBhY2tldFNpemU7CisJX191OCAgYkludGVydmFsOworCisJLyogTk9URTogIHRoZXNlIHR3byBhcmUgX29ubHlfIGluIGF1ZGlvIGVuZHBvaW50cy4gKi8KKwkvKiB1c2UgVVNCX0RUX0VORFBPSU5UKl9TSVpFIGluIGJMZW5ndGgsIG5vdCBzaXplb2YuICovCisJX191OCAgYlJlZnJlc2g7CisJX191OCAgYlN5bmNoQWRkcmVzczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9FTkRQT0lOVF9TSVpFCQk3CisjZGVmaW5lIFVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFCTkJLyogQXVkaW8gZXh0ZW5zaW9uICovCisKKworLyoKKyAqIEVuZHBvaW50cworICovCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSwkweDBmCS8qIGluIGJFbmRwb2ludEFkZHJlc3MgKi8KKyNkZWZpbmUgVVNCX0VORFBPSU5UX0RJUl9NQVNLCQkweDgwCisKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0sJMHgwMwkvKiBpbiBibUF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTAkwCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MJCTEKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfQlVMSwkJMgorI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQJCTMKKyNkZWZpbmUgVVNCX0VORFBPSU5UX01BWF9BREpVU1RBQkxFCTB4ODAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfREVWSUNFX1FVQUxJRklFUjogRGV2aWNlIFF1YWxpZmllciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX3F1YWxpZmllcl9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiBiY2RVU0I7CisJX191OCAgYkRldmljZUNsYXNzOworCV9fdTggIGJEZXZpY2VTdWJDbGFzczsKKwlfX3U4ICBiRGV2aWNlUHJvdG9jb2w7CisJX191OCAgYk1heFBhY2tldFNpemUwOworCV9fdTggIGJOdW1Db25maWd1cmF0aW9uczsKKwlfX3U4ICBiUkVTRVJWRUQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfT1RHIChmcm9tIE9URyAxLjBhIHN1cHBsZW1lbnQpICovCitzdHJ1Y3QgdXNiX290Z19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIGJtQXR0cmlidXRlczsJLyogc3VwcG9ydCBmb3IgSE5QLCBTUlAsIGV0YyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIGZyb20gdXNiX290Z19kZXNjcmlwdG9yLmJtQXR0cmlidXRlcyAqLworI2RlZmluZSBVU0JfT1RHX1NSUAkJKDEgPDwgMCkKKyNkZWZpbmUgVVNCX09UR19ITlAJCSgxIDw8IDEpCS8qIHN3YXAgaG9zdC9kZXZpY2Ugcm9sZXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0RFQlVHOiAgZm9yIHNwZWNpYWwgaGlnaHNwZWVkIGRldmljZXMsIHJlcGxhY2luZyBzZXJpYWwgY29uc29sZSAqLworc3RydWN0IHVzYl9kZWJ1Z19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCS8qIGJ1bGsgZW5kcG9pbnRzIHdpdGggOCBieXRlIG1heHBhY2tldCAqLworCV9fdTggIGJEZWJ1Z0luRW5kcG9pbnQ7CisJX191OCAgYkRlYnVnT3V0RW5kcG9pbnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OOiBncm91cHMgaW50ZXJmYWNlcyAqLworc3RydWN0IHVzYl9pbnRlcmZhY2VfYXNzb2NfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiRmlyc3RJbnRlcmZhY2U7CisJX191OCAgYkludGVyZmFjZUNvdW50OworCV9fdTggIGJGdW5jdGlvbkNsYXNzOworCV9fdTggIGJGdW5jdGlvblN1YkNsYXNzOworCV9fdTggIGJGdW5jdGlvblByb3RvY29sOworCV9fdTggIGlGdW5jdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9TRUNVUklUWTogIGdyb3VwIG9mIHdpcmVsZXNzIHNlY3VyaXR5IGRlc2NyaXB0b3JzLCBpbmNsdWRpbmcKKyAqIGVuY3J5cHRpb24gdHlwZXMgYXZhaWxhYmxlIGZvciBzZXR0aW5nIHVwIGEgQ0MvYXNzb2NpYXRpb24uCisgKi8KK3N0cnVjdCB1c2Jfc2VjdXJpdHlfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJOdW1FbmNyeXB0aW9uVHlwZXM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfS0VZOiAgdXNlZCB3aXRoIHtHRVQsU0VUfV9TRUNVUklUWV9EQVRBOyBvbmx5IHB1YmxpYyBrZXlzCisgKiBtYXkgYmUgcmV0cmlldmVkLgorICovCitzdHJ1Y3QgdXNiX2tleV9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fdTggIHRUS0lEWzNdOworCV9fdTggIGJSZXNlcnZlZDsKKwlfX3U4ICBiS2V5RGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9FTkNSWVBUSU9OX1RZUEU6ICBidW5kbGVkIGluIERUX1NFQ1VSSVRZIGdyb3VwcyAqLworc3RydWN0IHVzYl9lbmNyeXB0aW9uX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgYkVuY3J5cHRpb25UeXBlOworI2RlZmluZQlVU0JfRU5DX1RZUEVfVU5TRUNVUkUJCTAKKyNkZWZpbmUJVVNCX0VOQ19UWVBFX1dJUkVECQkxCS8qIG5vbi13aXJlbGVzcyBtb2RlICovCisjZGVmaW5lCVVTQl9FTkNfVFlQRV9DQ01fMQkJMgkvKiBhZXMxMjgvY2JjIHNlc3Npb24gKi8KKyNkZWZpbmUJVVNCX0VOQ19UWVBFX1JTQV8xCQkzCS8qIHJzYTMwNzIvc2hhMSBhdXRoICovCisJX191OCAgYkVuY3J5cHRpb25WYWx1ZTsJCS8qIHVzZSBpbiBTRVRfRU5DUllQVElPTiAqLworCV9fdTggIGJBdXRoS2V5SW5kZXg7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9CT1M6ICBncm91cCBvZiB3aXJlbGVzcyBjYXBhYmlsaXRpZXMgKi8KK3N0cnVjdCB1c2JfYm9zX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX19sZTE2IHdUb3RhbExlbmd0aDsKKwlfX3U4ICBiTnVtRGV2aWNlQ2FwczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9ERVZJQ0VfQ0FQQUJJTElUWTogIGdyb3VwZWQgd2l0aCBCT1MgKi8KK3N0cnVjdCB1c2JfZGV2X2NhcF9oZWFkZXIgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUJVVNCX0NBUF9UWVBFX1dJUkVMRVNTX1VTQgkxCisKK3N0cnVjdCB1c2Jfd2lyZWxlc3NfY2FwX2Rlc2NyaXB0b3IgewkvKiBVbHRyYSBXaWRlIEJhbmQgKi8KKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3U4ICBiRGV2Q2FwYWJpbGl0eVR5cGU7CisKKwlfX3U4ICBibUF0dHJpYnV0ZXM7CisjZGVmaW5lCVVTQl9XSVJFTEVTU19QMlBfRFJECQkoMSA8PCAxKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX01BU0sJKDMgPDwgMikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9TRUxGCSgxIDw8IDIpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19CRUFDT05fRElSRUNURUQJKDIgPDwgMikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9OT05FCSgzIDw8IDIpCisJX19sZTE2IHdQSFlSYXRlczsJLyogYml0IHJhdGVzLCBNYnBzICovCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfNTMJCSgxIDw8IDApCS8qIGFsd2F5cyBzZXQgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV84MAkJKDEgPDwgMSkKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8xMDcJCSgxIDw8IDIpCS8qIGFsd2F5cyBzZXQgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8xNjAJCSgxIDw8IDMpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfMjAwCQkoMSA8PCA0KQkvKiBhbHdheXMgc2V0ICovCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfMzIwCQkoMSA8PCA1KQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzQwMAkJKDEgPDwgNikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV80ODAJCSgxIDw8IDcpCisJX191OCAgYm1URklUWFBvd2VySW5mbzsJLyogVEZJIHBvd2VyIGxldmVscyAqLworCV9fdTggIGJtRkZJVFhQb3dlckluZm87CS8qIEZGSSBwb3dlciBsZXZlbHMgKi8KKwlfX2xlMTYgYm1CYW5kR3JvdXA7CisJX191OCAgYlJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX1dJUkVMRVNTX0VORFBPSU5UX0NPTVA6ICBjb21wYW5pb24gZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGgKKyAqIGVhY2ggZW5kcG9pbnQgZGVzY3JpcHRvciBmb3IgYSB3aXJlbGVzcyBkZXZpY2UKKyAqLworc3RydWN0IHVzYl93aXJlbGVzc19lcF9jb21wX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgYk1heEJ1cnN0OworCV9fdTggIGJNYXhTZXF1ZW5jZTsKKwlfX2xlMTYgd01heFN0cmVhbURlbGF5OworCV9fbGUxNiB3T3ZlclRoZUFpclBhY2tldFNpemU7CisJX191OCAgYk92ZXJUaGVBaXJJbnRlcnZhbDsKKwlfX3U4ICBibUNvbXBBdHRyaWJ1dGVzOworI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX01BU0sJMHgwMwkvKiBpbiBibUNvbXBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TV0lUQ0hfTk8JCTAKKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9TV0lUQ0gJMQorI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX1NDQUxFCTIKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9SRVFfU0VUX0hBTkRTSEFLRSBpcyBhIGZvdXItd2F5IGhhbmRzaGFrZSB1c2VkIGJldHdlZW4gYSB3aXJlbGVzcworICogaG9zdCBhbmQgYSBkZXZpY2UgZm9yIGNvbm5lY3Rpb24gc2V0IHVwLCBtdXR1YWwgYXV0aGVudGljYXRpb24sIGFuZAorICogZXhjaGFuZ2luZyBzaG9ydCBsaXZlZCBzZXNzaW9uIGtleXMuICBUaGUgaGFuZHNoYWtlIGRlcGVuZHMgb24gYSBDQy4KKyAqLworc3RydWN0IHVzYl9oYW5kc2hha2UgeworCV9fdTggYk1lc3NhZ2VOdW1iZXI7CisJX191OCBiU3RhdHVzOworCV9fdTggdFRLSURbM107CisJX191OCBiUmVzZXJ2ZWQ7CisJX191OCBDRElEWzE2XTsKKwlfX3U4IG5vbmNlWzE2XTsKKwlfX3U4IE1JQ1s4XTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9SRVFfU0VUX0NPTk5FQ1RJT04gbW9kaWZpZXMgb3IgcmV2b2tlcyBhIGNvbm5lY3Rpb24gY29udGV4dCAoQ0MpLgorICogQSBDQyBtYXkgYWxzbyBiZSBzZXQgdXAgdXNpbmcgbm9uLXdpcmVsZXNzIHNlY3VyZSBjaGFubmVscyAoaW5jbHVkaW5nCisgKiB3aXJlZCBVU0IhKSwgYW5kIHNvbWUgZGV2aWNlcyBtYXkgc3VwcG9ydCBDQ3Mgd2l0aCBtdWx0aXBsZSBob3N0cy4KKyAqLworc3RydWN0IHVzYl9jb25uZWN0aW9uX2NvbnRleHQgeworCV9fdTggQ0hJRFsxNl07CQkvKiBwZXJzaXN0ZW50IGhvc3QgaWQgKi8KKwlfX3U4IENESURbMTZdOwkJLyogZGV2aWNlIGlkICh1bmlxdWUgdy9pbiBob3N0IGNvbnRleHQpICovCisJX191OCBDS1sxNl07CQkvKiBjb25uZWN0aW9uIGtleSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCIDIuMCBkZWZpbmVzIHRocmVlIHNwZWVkcywgaGVyZSdzIGhvdyBMaW51eCBpZGVudGlmaWVzIHRoZW0gKi8KKworZW51bSB1c2JfZGV2aWNlX3NwZWVkIHsKKwlVU0JfU1BFRURfVU5LTk9XTiA9IDAsCQkJLyogZW51bWVyYXRpbmcgKi8KKwlVU0JfU1BFRURfTE9XLCBVU0JfU1BFRURfRlVMTCwJCS8qIHVzYiAxLjEgKi8KKwlVU0JfU1BFRURfSElHSCwJCQkJLyogdXNiIDIuMCAqLworCVVTQl9TUEVFRF9WQVJJQUJMRSwJCQkvKiB3aXJlbGVzcyAodXNiIDIuNSkgKi8KK307CisKK2VudW0gdXNiX2RldmljZV9zdGF0ZSB7CisJLyogTk9UQVRUQUNIRUQgaXNuJ3QgaW4gdGhlIFVTQiBzcGVjLCBhbmQgdGhpcyBzdGF0ZSBhY3RzCisJICogdGhlIHNhbWUgYXMgQVRUQUNIRUQgLi4uIGJ1dCBpdCdzIGNsZWFyZXIgdGhpcyB3YXkuCisJICovCisJVVNCX1NUQVRFX05PVEFUVEFDSEVEID0gMCwKKworCS8qIGNoYXB0ZXIgOSBhbmQgYXV0aGVudGljYXRpb24gKHdpcmVsZXNzKSBkZXZpY2Ugc3RhdGVzICovCisJVVNCX1NUQVRFX0FUVEFDSEVELAorCVVTQl9TVEFURV9QT1dFUkVELAkJCS8qIHdpcmVkICovCisJVVNCX1NUQVRFX1VOQVVUSEVOVElDQVRFRCwJCS8qIGF1dGggKi8KKwlVU0JfU1RBVEVfUkVDT05ORUNUSU5HLAkJCS8qIGF1dGggKi8KKwlVU0JfU1RBVEVfREVGQVVMVCwJCQkvKiBsaW1pdGVkIGZ1bmN0aW9uICovCisJVVNCX1NUQVRFX0FERFJFU1MsCisJVVNCX1NUQVRFX0NPTkZJR1VSRUQsCQkJLyogbW9zdCBmdW5jdGlvbnMgKi8KKworCVVTQl9TVEFURV9TVVNQRU5ERUQKKworCS8qIE5PVEU6ICB0aGVyZSBhcmUgYWN0dWFsbHkgZm91ciBkaWZmZXJlbnQgU1VTUEVOREVECisJICogc3RhdGVzLCByZXR1cm5pbmcgdG8gUE9XRVJFRCwgREVGQVVMVCwgQUREUkVTUywgb3IKKwkgKiBDT05GSUdVUkVEIHJlc3BlY3RpdmVseSB3aGVuIFNPRiB0b2tlbnMgZmxvdyBhZ2Fpbi4KKwkgKi8KK307CisKKyNlbmRpZgkvKiBfX0xJTlVYX1VTQl9DSDlfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2NTRjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldGZzLmgKQEAgLTAsMCArMSw4MSBAQAorI2lmbmRlZiBfX0xJTlVYX1VTQl9HQURHRVRGU19ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVEZTX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCisvKgorICogRmlsZXN5c3RlbSBiYXNlZCB1c2VyLW1vZGUgQVBJIHRvIFVTQiBHYWRnZXQgY29udHJvbGxlciBoYXJkd2FyZQorICoKKyAqIE90aGVyIHRoYW4gZXAwIG9wZXJhdGlvbnMsIG1vc3QgdGhpbmdzIGFyZSBkb25lIGJ5IHJlYWQoKSBhbmQgd3JpdGUoKQorICogb24gZW5kcG9pbnQgZmlsZXMgZm91bmQgaW4gb25lIGRpcmVjdG9yeS4gIFRoZXkgYXJlIGNvbmZpZ3VyZWQgYnkKKyAqIHdyaXRpbmcgZGVzY3JpcHRvcnMsIGFuZCB0aGVuIG1heSBiZSB1c2VkIGZvciBub3JtYWwgc3RyZWFtIHN0eWxlCisgKiBpL28gcmVxdWVzdHMuICBXaGVuIGVwMCBpcyBjb25maWd1cmVkLCB0aGUgZGV2aWNlIGNhbiBlbnVtZXJhdGU7CisgKiB3aGVuIGl0J3MgY2xvc2VkLCB0aGUgZGV2aWNlIGRpc2Nvbm5lY3RzIGZyb20gdXNiLiAgT3BlcmF0aW9ucyBvbgorICogZXAwIHJlcXVpcmUgaW9jdGwoKSBvcGVyYXRpb25zLgorICoKKyAqIENvbmZpZ3VyYXRpb24gYW5kIGRldmljZSBkZXNjcmlwdG9ycyBnZXQgd3JpdHRlbiB0byAvZGV2L2dhZGdldC8kQ0hJUCwKKyAqIHdoaWNoIG1heSB0aGVuIGJlIHVzZWQgdG8gcmVhZCB1c2JfZ2FkZ2V0ZnNfZXZlbnQgc3RydWN0cy4gIFRoZSBkcml2ZXIKKyAqIG1heSBhY3RpdmF0ZSBlbmRwb2ludHMgYXMgaXQgaGFuZGxlcyBTRVRfQ09ORklHVVJBVElPTiBzZXR1cCBldmVudHMsCisgKiBvciBlYXJsaWVyOyB3cml0aW5nIGVuZHBvaW50IGRlc2NyaXB0b3JzIHRvIC9kZXYvZ2FkZ2V0LyRFTkRQT0lOVAorICogdGhlbiBwZXJmb3JtaW5nIGRhdGEgdHJhbnNmZXJzIGJ5IHJlYWRpbmcgb3Igd3JpdGluZy4KKyAqLworCisvKgorICogRXZlbnRzIGFyZSBkZWxpdmVyZWQgb24gdGhlIGVwMCBmaWxlIGRlc2NyaXB0b3IsIHdoZW4gdGhlIHVzZXIgbW9kZSBkcml2ZXIKKyAqIHJlYWRzIGZyb20gdGhpcyBmaWxlIGRlc2NyaXB0b3IgYWZ0ZXIgd3JpdGluZyB0aGUgZGVzY3JpcHRvcnMuICBEb24ndAorICogc3RvcCBwb2xsaW5nIHRoaXMgZGVzY3JpcHRvci4KKyAqLworCitlbnVtIHVzYl9nYWRnZXRmc19ldmVudF90eXBlIHsKKwlHQURHRVRGU19OT1AgPSAwLAorCisJR0FER0VURlNfQ09OTkVDVCwKKwlHQURHRVRGU19ESVNDT05ORUNULAorCUdBREdFVEZTX1NFVFVQLAorCUdBREdFVEZTX1NVU1BFTkQsCisJLy8gYW5kIGxpa2VseSBtb3JlICEKK307CisKKy8qIE5PVEU6ICB0aGlzIHN0cnVjdHVyZSBtdXN0IHN0YXkgdGhlIHNhbWUgc2l6ZSBhbmQgbGF5b3V0IG9uCisgKiBib3RoIDMyLWJpdCBhbmQgNjQtYml0IGtlcm5lbHMuCisgKi8KK3N0cnVjdCB1c2JfZ2FkZ2V0ZnNfZXZlbnQgeworCXVuaW9uIHsKKwkJLy8gTk9QLCBESVNDT05ORUNULCBTVVNQRU5EOiBub3RoaW5nCisJCS8vIC4uLiBzb21lIGhhcmR3YXJlIGNhbid0IHJlcG9ydCBkaXNjb25uZWN0aW9uCisKKwkJLy8gQ09OTkVDVDoganVzdCB0aGUgc3BlZWQKKwkJZW51bSB1c2JfZGV2aWNlX3NwZWVkCXNwZWVkOworCisJCS8vIFNFVFVQOiBwYWNrZXQ7IERBVEEgcGhhc2UgaS9vIHByZWNlZGVzIG5leHQgZXZlbnQKKwkJLy8gKHNldHVwLmJtUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSBmbGFncyBkaXJlY3Rpb24KKwkJLy8gLi4uIGluY2x1ZGVzIFNFVF9DT05GSUdVUkFUSU9OLCBTRVRfSU5URVJGQUNFCisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJc2V0dXA7CisJfSB1OworCWVudW0gdXNiX2dhZGdldGZzX2V2ZW50X3R5cGUJdHlwZTsKK307CisKKworLyogZW5kcG9pbnQgaW9jdGxzICovCisKKy8qIElOIHRyYW5zZmVycyBtYXkgYmUgcmVwb3J0ZWQgdG8gdGhlIGdhZGdldCBkcml2ZXIgYXMgY29tcGxldGUKKyAqCXdoZW4gdGhlIGZpZm8gaXMgbG9hZGVkLCBiZWZvcmUgdGhlIGhvc3QgcmVhZHMgdGhlIGRhdGE7CisgKiBPVVQgdHJhbnNmZXJzIG1heSBiZSByZXBvcnRlZCB0byB0aGUgaG9zdCdzICJjbGllbnQiIGRyaXZlciBhcworICoJY29tcGxldGUgd2hlbiB0aGV5J3JlIHNpdHRpbmcgaW4gdGhlIEZJRk8gdW5yZWFkLgorICogVEhJUyByZXR1cm5zIGhvdyBtYW55IGJ5dGVzIGFyZSAidW5jbGFpbWVkIiBpbiB0aGUgZW5kcG9pbnQgZmlmbworICogKG5lZWRlZCBmb3IgcHJlY2lzZSBmYXVsdCBoYW5kbGluZywgd2hlbiB0aGUgaGFyZHdhcmUgYWxsb3dzIGl0KQorICovCisjZGVmaW5lCUdBREdFVEZTX0ZJRk9fU1RBVFVTCV9JTygnZycsMSkKKworLyogZGlzY2FyZHMgYW55IHVuY2xhaW1lZCBkYXRhIGluIHRoZSBmaWZvLiAqLworI2RlZmluZQlHQURHRVRGU19GSUZPX0ZMVVNICV9JTygnZycsMikKKworLyogcmVzZXRzIGVuZHBvaW50IGhhbHQrdG9nZ2xlOyB1c2VkIHRvIGltcGxlbWVudCBzZXRfaW50ZXJmYWNlLgorICogc29tZSBoYXJkd2FyZSAobGlrZSBweGEyeHgpIGNhbid0IHN1cHBvcnQgdGhpcy4KKyAqLworI2RlZmluZQlHQURHRVRGU19DTEVBUl9IQUxUCV9JTygnZycsMykKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0dBREdFVEZTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL21pZGkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNiL21pZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE5N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogPGxpbnV4L3VzYi9taWRpLmg+IC0tIFVTQiBNSURJIGRlZmluaXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaHVtdHJvbmljcyBQdHkgTHRkLgorICogRGV2ZWxvcGVkIGZvciBUaHVtdHJvbmljcyBieSBHcmV5IElubm92YXRpb24KKyAqIEJlbiBXaWxsaWFtc29uIDxiZW4ud2lsbGlhbXNvbkBncmV5aW5ub3ZhdGlvbi5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGhvbGRzIFVTQiBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgZGVmaW5lZAorICogYnkgdGhlIFVTQiBEZXZpY2UgQ2xhc3MgRGVmaW5pdGlvbiBmb3IgTUlESSBEZXZpY2VzLgorICogQ29tbWVudHMgYmVsb3cgcmVmZXJlbmNlIHJlbGV2YW50IHNlY3Rpb25zIG9mIHRoYXQgZG9jdW1lbnQ6CisgKgorICogaHR0cDovL3d3dy51c2Iub3JnL2RldmVsb3BlcnMvZGV2Y2xhc3NfZG9jcy9taWRpMTAucGRmCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VTQl9NSURJX0gKKyNkZWZpbmUgX19MSU5VWF9VU0JfTUlESV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBBLjEgIE1TIENsYXNzLVNwZWNpZmljIEludGVyZmFjZSBEZXNjcmlwdG9yIFN1YnR5cGVzICovCisjZGVmaW5lIFVTQl9NU19IRUFERVIJCTB4MDEKKyNkZWZpbmUgVVNCX01TX01JRElfSU5fSkFDSwkweDAyCisjZGVmaW5lIFVTQl9NU19NSURJX09VVF9KQUNLCTB4MDMKKyNkZWZpbmUgVVNCX01TX0VMRU1FTlQJCTB4MDQKKworLyogQS4yICBNUyBDbGFzcy1TcGVjaWZpYyBFbmRwb2ludCBEZXNjcmlwdG9yIFN1YnR5cGVzICovCisjZGVmaW5lIFVTQl9NU19HRU5FUkFMCQkweDAxCisKKy8qIEEuMyAgTVMgTUlESSBJTiBhbmQgT1VUIEphY2sgVHlwZXMgKi8KKyNkZWZpbmUgVVNCX01TX0VNQkVEREVECQkweDAxCisjZGVmaW5lIFVTQl9NU19FWFRFUk5BTAkJMHgwMgorCisvKiA2LjEuMi4xICBDbGFzcy1TcGVjaWZpYyBNUyBJbnRlcmZhY2UgSGVhZGVyIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfbXNfaGVhZGVyX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsKKwlfX2xlMTYgYmNkTVNDOworCV9fbGUxNiB3VG90YWxMZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfTVNfSEVBREVSX1NJWkUJNworCisvKiA2LjEuMi4yICBNSURJIElOIEphY2sgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9taWRpX2luX2phY2tfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvLyBVU0JfRFRfQ1NfSU5URVJGQUNFCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvLyBVU0JfTVNfTUlESV9JTl9KQUNLCisJX191OCAgYkphY2tUeXBlOwkJLy8gVVNCX01TX0VNQkVEREVEL0VYVEVSTkFMCisJX191OCAgYkphY2tJRDsKKwlfX3U4ICBpSmFjazsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9NSURJX0lOX1NJWkUJNgorCitzdHJ1Y3QgdXNiX21pZGlfc291cmNlX3BpbiB7CisJX191OCAgYmFTb3VyY2VJRDsKKwlfX3U4ICBiYVNvdXJjZVBpbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiA2LjEuMi4zICBNSURJIE9VVCBKYWNrIERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfbWlkaV9vdXRfamFja19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8vIFVTQl9EVF9DU19JTlRFUkZBQ0UKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8vIFVTQl9NU19NSURJX09VVF9KQUNLCisJX191OCAgYkphY2tUeXBlOwkJLy8gVVNCX01TX0VNQkVEREVEL0VYVEVSTkFMCisJX191OCAgYkphY2tJRDsKKwlfX3U4ICBiTnJJbnB1dFBpbnM7CQkvLyBwCisJc3RydWN0IHVzYl9taWRpX3NvdXJjZV9waW4gcGluc1tdOyAvLyBbcF0KKwkvKl9fdTggIGlKYWNrOyAgLS0gb21taXR0ZWQgZHVlIHRvIHZhcmlhYmxlLXNpemVkIHBpbnNbXSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX01JRElfT1VUX1NJWkUocCkJKDcgKyAyICogKHApKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VU0JfTUlESV9PVVRfSkFDS19ERVNDUklQVE9SKHApCQkJXAorc3RydWN0IHVzYl9taWRpX291dF9qYWNrX2Rlc2NyaXB0b3JfIyNwIHsJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fdTggIGJKYWNrVHlwZTsJCQkJCVwKKwlfX3U4ICBiSmFja0lEOwkJCQkJCVwKKwlfX3U4ICBiTnJJbnB1dFBpbnM7CQkJCQlcCisJc3RydWN0IHVzYl9taWRpX3NvdXJjZV9waW4gcGluc1twXTsJCQlcCisJX191OCAgaUphY2s7CQkJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworLyogNi4yLjIgIENsYXNzLVNwZWNpZmljIE1TIEJ1bGsgRGF0YSBFbmRwb2ludCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX21zX2VuZHBvaW50X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CQkJLy8gNCtuCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLy8gVVNCX0RUX0NTX0VORFBPSU5UCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvLyBVU0JfTVNfR0VORVJBTAorCV9fdTggIGJOdW1FbWJNSURJSmFjazsJCS8vIG4KKwlfX3U4ICBiYUFzc29jSmFja0lEW107CQkvLyBbbl0KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9NU19FTkRQT0lOVF9TSVpFKG4pCSg0ICsgKG4pKQorCisvKiBBcyBhYm92ZSwgYnV0IG1vcmUgdXNlZnVsIGZvciBkZWZpbmluZyB5b3VyIG93biBkZXNjcmlwdG9yczogKi8KKyNkZWZpbmUgREVDTEFSRV9VU0JfTVNfRU5EUE9JTlRfREVTQ1JJUFRPUihuKQkJCVwKK3N0cnVjdCB1c2JfbXNfZW5kcG9pbnRfZGVzY3JpcHRvcl8jI24gewkJCQlcCisJX191OCAgYkxlbmd0aDsJCQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJCQkJXAorCV9fdTggIGJOdW1FbWJNSURJSmFjazsJCQkJCVwKKwlfX3U4ICBiYUFzc29jSmFja0lEW25dOwkJCQkJXAorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzYmRldmljZV9mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg4ZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91c2JkZXZpY2VfZnMuaApAQCAtMCwwICsxLDE1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJdXNiZGV2aWNlX2ZzLmggIC0tICBVU0IgZGV2aWNlIGZpbGUgc3lzdGVtLgorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMAorICogICAgICAgICAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIDA0LjAxLjIwMDAgIENyZWF0ZWQKKyAqCisgKiAgJElkOiB1c2JkZXZpY2VfZnMuaCx2IDEuMSAyMDAwLzAxLzA2IDE4OjQwOjQxIHRvbSBFeHAgJAorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfTElOVVhfVVNCREVWSUNFX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX1VTQkRFVklDRV9GU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB1c2JkZXZmcyBpb2N0bCBjb2RlcyAqLworCitzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyIHsKKwlfX3U4IGJSZXF1ZXN0VHlwZTsKKwlfX3U4IGJSZXF1ZXN0OworCV9fdTE2IHdWYWx1ZTsKKwlfX3UxNiB3SW5kZXg7CisJX191MTYgd0xlbmd0aDsKKwlfX3UzMiB0aW1lb3V0OyAgLyogaW4gbWlsbGlzZWNvbmRzICovCisgCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyIHsKKwl1bnNpZ25lZCBpbnQgZXA7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsgLyogaW4gbWlsbGlzZWNvbmRzICovCisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCB1c2JkZXZmc19zZXRpbnRlcmZhY2UgeworCXVuc2lnbmVkIGludCBpbnRlcmZhY2U7CisJdW5zaWduZWQgaW50IGFsdHNldHRpbmc7Cit9OworCitzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbCB7CisJdW5zaWduZWQgaW50IHNpZ25yOworCXZvaWQgKmNvbnRleHQ7Cit9OworCisjZGVmaW5lIFVTQkRFVkZTX01BWERSSVZFUk5BTUUgMjU1CisKK3N0cnVjdCB1c2JkZXZmc19nZXRkcml2ZXIgeworCXVuc2lnbmVkIGludCBpbnRlcmZhY2U7CisJY2hhciBkcml2ZXJbVVNCREVWRlNfTUFYRFJJVkVSTkFNRSArIDFdOworfTsKKworc3RydWN0IHVzYmRldmZzX2Nvbm5lY3RpbmZvIHsKKwl1bnNpZ25lZCBpbnQgZGV2bnVtOworCXVuc2lnbmVkIGNoYXIgc2xvdzsKK307CisKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1NIT1JUX05PVF9PSyAgICAgICAgICAxCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9JU09fQVNBUCAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFVTQkRFVkZTX1VSQl9UWVBFX0lTTwkJICAgMAorI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9JTlRFUlJVUFQJICAgMQorI2RlZmluZSBVU0JERVZGU19VUkJfVFlQRV9DT05UUk9MCSAgIDIKKyNkZWZpbmUgVVNCREVWRlNfVVJCX1RZUEVfQlVMSwkJICAgMworCitzdHJ1Y3QgdXNiZGV2ZnNfaXNvX3BhY2tldF9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGludCBhY3R1YWxfbGVuZ3RoOworCXVuc2lnbmVkIGludCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgdXNiZGV2ZnNfdXJiIHsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciBlbmRwb2ludDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl2b2lkICpidWZmZXI7CisJaW50IGJ1ZmZlcl9sZW5ndGg7CisJaW50IGFjdHVhbF9sZW5ndGg7CisJaW50IHN0YXJ0X2ZyYW1lOworCWludCBudW1iZXJfb2ZfcGFja2V0czsKKwlpbnQgZXJyb3JfY291bnQ7CisJdW5zaWduZWQgaW50IHNpZ25yOwkvKiBzaWduYWwgdG8gYmUgc2VudCBvbiBjb21wbGV0aW9uLAorCQkJCSAgb3IgMCBpZiBub25lIHNob3VsZCBiZSBzZW50LiAqLworCXZvaWQgKnVzZXJjb250ZXh0OworCXN0cnVjdCB1c2JkZXZmc19pc29fcGFja2V0X2Rlc2MgaXNvX2ZyYW1lX2Rlc2NbMF07Cit9OworCisvKiBpb2N0bHMgZm9yIHRhbGtpbmcgZGlyZWN0bHkgdG8gZHJpdmVycyAqLworc3RydWN0IHVzYmRldmZzX2lvY3RsIHsKKwlpbnQJaWZubzsJCS8qIGludGVyZmFjZSAwLi5OIDsgbmVnYXRpdmUgbnVtYmVycyByZXNlcnZlZCAqLworCWludAlpb2N0bF9jb2RlOwkvKiBNVVNUIGVuY29kZSBzaXplICsgZGlyZWN0aW9uIG9mIGRhdGEgc28gdGhlCisJCQkJICogbWFjcm9zIGluIDxhc20vaW9jdGwuaD4gZ2l2ZSBjb3JyZWN0IHZhbHVlcyAqLworCXZvaWQgKmRhdGE7CS8qIHBhcmFtIGJ1ZmZlciAoaW4sIG9yIG91dCkgKi8KK307CisKKy8qIFlvdSBjYW4gZG8gbW9zdCB0aGluZ3Mgd2l0aCBodWJzIGp1c3QgdGhyb3VnaCBjb250cm9sIG1lc3NhZ2VzLAorICogZXhjZXB0IGZpbmQgb3V0IHdoYXQgZGV2aWNlIGNvbm5lY3RzIHRvIHdoYXQgcG9ydC4gKi8KK3N0cnVjdCB1c2JkZXZmc19odWJfcG9ydGluZm8geworCWNoYXIgbnBvcnRzOwkJLyogbnVtYmVyIG9mIGRvd25zdHJlYW0gcG9ydHMgaW4gdGhpcyBodWIgKi8KKwljaGFyIHBvcnQgWzEyN107CS8qIGUuZy4gcG9ydCAzIGNvbm5lY3RzIHRvIGRldmljZSAyNyAqLworfTsKKworCisjZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wgICAgICAgICAgIF9JT1dSKCdVJywgMCwgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcikKKyNkZWZpbmUgVVNCREVWRlNfQlVMSyAgICAgICAgICAgICAgX0lPV1IoJ1UnLCAyLCBzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyKQorI2RlZmluZSBVU0JERVZGU19SRVNFVEVQICAgICAgICAgICBfSU9SKCdVJywgMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBVU0JERVZGU19TRVRJTlRFUkZBQ0UgICAgICBfSU9SKCdVJywgNCwgc3RydWN0IHVzYmRldmZzX3NldGludGVyZmFjZSkKKyNkZWZpbmUgVVNCREVWRlNfU0VUQ09ORklHVVJBVElPTiAgX0lPUignVScsIDUsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVVNCREVWRlNfR0VURFJJVkVSICAgICAgICAgX0lPVygnVScsIDgsIHN0cnVjdCB1c2JkZXZmc19nZXRkcml2ZXIpCisjZGVmaW5lIFVTQkRFVkZTX1NVQk1JVFVSQiAgICAgICAgIF9JT1IoJ1UnLCAxMCwgc3RydWN0IHVzYmRldmZzX3VyYikKKyNkZWZpbmUgVVNCREVWRlNfU1VCTUlUVVJCMzIgICAgICAgX0lPUignVScsIDEwLCBzdHJ1Y3QgdXNiZGV2ZnNfdXJiMzIpCisjZGVmaW5lIFVTQkRFVkZTX0RJU0NBUkRVUkIgICAgICAgIF9JTygnVScsIDExKQorI2RlZmluZSBVU0JERVZGU19SRUFQVVJCICAgICAgICAgICBfSU9XKCdVJywgMTIsIHZvaWQgKikKKyNkZWZpbmUgVVNCREVWRlNfUkVBUFVSQjMyICAgICAgICAgX0lPVygnVScsIDEyLCBfX3UzMikKKyNkZWZpbmUgVVNCREVWRlNfUkVBUFVSQk5ERUxBWSAgICAgX0lPVygnVScsIDEzLCB2b2lkICopCisjZGVmaW5lIFVTQkRFVkZTX1JFQVBVUkJOREVMQVkzMiAgIF9JT1coJ1UnLCAxMywgX191MzIpCisjZGVmaW5lIFVTQkRFVkZTX0RJU0NTSUdOQUwgICAgICAgIF9JT1IoJ1UnLCAxNCwgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwpCisjZGVmaW5lIFVTQkRFVkZTX0NMQUlNSU5URVJGQUNFICAgIF9JT1IoJ1UnLCAxNSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBVU0JERVZGU19SRUxFQVNFSU5URVJGQUNFICBfSU9SKCdVJywgMTYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVVNCREVWRlNfQ09OTkVDVElORk8gICAgICAgX0lPVygnVScsIDE3LCBzdHJ1Y3QgdXNiZGV2ZnNfY29ubmVjdGluZm8pCisjZGVmaW5lIFVTQkRFVkZTX0lPQ1RMICAgICAgICAgICAgIF9JT1dSKCdVJywgMTgsIHN0cnVjdCB1c2JkZXZmc19pb2N0bCkKKyNkZWZpbmUgVVNCREVWRlNfSU9DVEwzMiAgICAgICAgICAgX0lPV1IoJ1UnLCAxOCwgc3RydWN0IHVzYmRldmZzX2lvY3RsMzIpCisjZGVmaW5lIFVTQkRFVkZTX0hVQl9QT1JUSU5GTyAgICAgIF9JT1IoJ1UnLCAxOSwgc3RydWN0IHVzYmRldmZzX2h1Yl9wb3J0aW5mbykKKyNkZWZpbmUgVVNCREVWRlNfUkVTRVQgICAgICAgICAgICAgX0lPKCdVJywgMjApCisjZGVmaW5lIFVTQkRFVkZTX0NMRUFSX0hBTFQgICAgICAgIF9JT1IoJ1UnLCAyMSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBVU0JERVZGU19ESVNDT05ORUNUICAgICAgICBfSU8oJ1UnLCAyMikKKyNkZWZpbmUgVVNCREVWRlNfQ09OTkVDVCAgICAgICAgICAgX0lPKCdVJywgMjMpCisjZW5kaWYgLyogX0xJTlVYX1VTQkRFVklDRV9GU19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZGFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3VzZXIuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXRpbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDBiZTZhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC91dGltZS5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX0xJTlVYX1VUSU1FX0gKKyNkZWZpbmUgX0xJTlVYX1VUSU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB1dGltYnVmIHsKKwl0aW1lX3QgYWN0aW1lOworCXRpbWVfdCBtb2R0aW1lOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzFhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9MSU5VWF9VVFNOQU1FX0gKKyNkZWZpbmUgX0xJTlVYX1VUU05BTUVfSAorCisjZGVmaW5lIF9fT0xEX1VUU19MRU4gOAorCitzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgeworCWNoYXIgc3lzbmFtZVs5XTsKKwljaGFyIG5vZGVuYW1lWzldOworCWNoYXIgcmVsZWFzZVs5XTsKKwljaGFyIHZlcnNpb25bOV07CisJY2hhciBtYWNoaW5lWzldOworfTsKKworI2RlZmluZSBfX05FV19VVFNfTEVOIDY0CisKK3N0cnVjdCBvbGRfdXRzbmFtZSB7CisJY2hhciBzeXNuYW1lWzY1XTsKKwljaGFyIG5vZGVuYW1lWzY1XTsKKwljaGFyIHJlbGVhc2VbNjVdOworCWNoYXIgdmVyc2lvbls2NV07CisJY2hhciBtYWNoaW5lWzY1XTsKK307CisKK3N0cnVjdCBuZXdfdXRzbmFtZSB7CisJY2hhciBzeXNuYW1lWzY1XTsKKwljaGFyIG5vZGVuYW1lWzY1XTsKKwljaGFyIHJlbGVhc2VbNjVdOworCWNoYXIgdmVyc2lvbls2NV07CisJY2hhciBtYWNoaW5lWzY1XTsKKwljaGFyIGRvbWFpbm5hbWVbNjVdOworfTsKKworCisjZW5kaWYgLyogX0xJTlVYX1VUU05BTUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2FhODhmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92ZXJzaW9uLmgKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIExJTlVYX1ZFUlNJT05fQ09ERSAxMzI2MzIKKyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZldGguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTRjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZldGguaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9fTkVUX1ZFVEhfSF8KKyNkZWZpbmUgX19ORVRfVkVUSF9IXworCitlbnVtIHsKKwlWRVRIX0lORk9fVU5TUEVDLAorCVZFVEhfSU5GT19QRUVSLAorCisJX19WRVRIX0lORk9fTUFYCisjZGVmaW5lIFZFVEhfSU5GT19NQVgJKF9fVkVUSF9JTkZPX01BWCAtIDEpCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9fZGVjb2Rlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aWRlb19kZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxZTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9fZGVjb2Rlci5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJREVPX0RFQ09ERVJfSAorI2RlZmluZSBfTElOVVhfVklERU9fREVDT0RFUl9ICisKKyNkZWZpbmUgSEFWRV9WSURFT19ERUNPREVSIDEKKworc3RydWN0IHZpZGVvX2RlY29kZXJfY2FwYWJpbGl0eSB7IC8qIHRoaXMgbmFtZSBpcyB0b28gbG9uZyAqLworCV9fdTMyCWZsYWdzOworI2RlZmluZQlWSURFT19ERUNPREVSX1BBTAkxCS8qIGNhbiBkZWNvZGUgUEFMIHNpZ25hbCAqLworI2RlZmluZQlWSURFT19ERUNPREVSX05UU0MJMgkvKiBjYW4gZGVjb2RlIE5UU0MgKi8KKyNkZWZpbmUJVklERU9fREVDT0RFUl9TRUNBTQk0CS8qIGNhbiBkZWNvZGUgU0VDQU0gKi8KKyNkZWZpbmUJVklERU9fREVDT0RFUl9BVVRPCTgJLyogY2FuIGF1dG9zZW5zZSBub3JtICovCisjZGVmaW5lCVZJREVPX0RFQ09ERVJfQ0NJUgkxNgkvKiBDQ0lSLTYwMSBwaXhlbCByYXRlICg3MjAgcGl4ZWxzIHBlciBsaW5lKSBpbnN0ZWFkIG9mIHNxdWFyZSBwaXhlbCByYXRlICovCisJaW50CWlucHV0czsJCQkvKiBudW1iZXIgb2YgaW5wdXRzICovCisJaW50CW91dHB1dHM7CQkvKiBudW1iZXIgb2Ygb3V0cHV0cyAqLworfTsKKworLyoKK0RFQ09ERVJfR0VUX1NUQVRVUyByZXR1cm5zIHRoZSBmb2xsb3dpbmcgZmxhZ3MuICBUaGUgb25seSBvbmUgeW91IG5lZWQgaXMKK0RFQ09ERVJfU1RBVFVTX0dPT0QsIHRoZSBvdGhlcnMgYXJlIGp1c3QgbmljZSB0aGluZ3MgdG8ga25vdy4KKyovCisjZGVmaW5lCURFQ09ERVJfU1RBVFVTX0dPT0QJMQkvKiByZWNlaXZpbmcgYWNjZXB0YWJsZSBpbnB1dCAqLworI2RlZmluZQlERUNPREVSX1NUQVRVU19DT0xPUgkyCS8qIHJlY2VpdmluZyBjb2xvciBpbmZvcm1hdGlvbiAqLworI2RlZmluZQlERUNPREVSX1NUQVRVU19QQUwJNAkvKiBhdXRvIGRldGVjdGVkICovCisjZGVmaW5lCURFQ09ERVJfU1RBVFVTX05UU0MJOAkvKiBhdXRvIGRldGVjdGVkICovCisjZGVmaW5lCURFQ09ERVJfU1RBVFVTX1NFQ0FNCTE2CS8qIGF1dG8gZGV0ZWN0ZWQgKi8KKworc3RydWN0IHZpZGVvX2RlY29kZXJfaW5pdCB7CisJdW5zaWduZWQgY2hhciBsZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKK307CisKKyNkZWZpbmUJREVDT0RFUl9HRVRfQ0FQQUJJTElUSUVTIF9JT1IoJ2QnLCAxLCBzdHJ1Y3QgdmlkZW9fZGVjb2Rlcl9jYXBhYmlsaXR5KQorI2RlZmluZQlERUNPREVSX0dFVF9TVEFUVVMgICAgCV9JT1IoJ2QnLCAyLCBpbnQpCisjZGVmaW5lCURFQ09ERVJfU0VUX05PUk0JX0lPVygnZCcsIDMsIGludCkKKyNkZWZpbmUJREVDT0RFUl9TRVRfSU5QVVQJX0lPVygnZCcsIDQsIGludCkJLyogMCA8PSBpbnB1dCA8ICNpbnB1dHMgKi8KKyNkZWZpbmUJREVDT0RFUl9TRVRfT1VUUFVUCV9JT1coJ2QnLCA1LCBpbnQpCS8qIDAgPD0gb3V0cHV0IDwgI291dHB1dHMgKi8KKyNkZWZpbmUJREVDT0RFUl9FTkFCTEVfT1VUUFVUCV9JT1coJ2QnLCA2LCBpbnQpCS8qIGJvb2xlYW4gb3V0cHV0IGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lCURFQ09ERVJfU0VUX1BJQ1RVUkUgICAJX0lPVygnZCcsIDcsIHN0cnVjdCB2aWRlb19waWN0dXJlKQorI2RlZmluZQlERUNPREVSX1NFVF9HUElPCV9JT1coJ2QnLCA4LCBpbnQpCS8qIHN3aXRjaCBnZW5lcmFsIHB1cnBvc2UgcGluICovCisjZGVmaW5lCURFQ09ERVJfSU5JVAkJX0lPVygnZCcsIDksIHN0cnVjdCB2aWRlb19kZWNvZGVyX2luaXQpCS8qIGluaXQgaW50ZXJuYWwgcmVnaXN0ZXJzIGF0IG9uY2UgKi8KKyNkZWZpbmUJREVDT0RFUl9TRVRfVkJJX0JZUEFTUwlfSU9XKCdkJywgMTAsIGludCkJLyogc3dpdGNoIHZiaSBieXBhc3MgKi8KKworI2RlZmluZQlERUNPREVSX0RVTVAJCV9JTygnZCcsIDE5MikJCS8qIGRlYnVnIGhvb2sgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9fZW5jb2Rlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aWRlb19lbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwZTY5MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9fZW5jb2Rlci5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJREVPX0VOQ09ERVJfSAorI2RlZmluZSBfTElOVVhfVklERU9fRU5DT0RFUl9ICisKK3N0cnVjdCB2aWRlb19lbmNvZGVyX2NhcGFiaWxpdHkgeyAvKiB0aGlzIG5hbWUgaXMgdG9vIGxvbmcgKi8KKwlfX3UzMglmbGFnczsKKyNkZWZpbmUJVklERU9fRU5DT0RFUl9QQUwJMQkvKiBjYW4gZW5jb2RlIFBBTCBzaWduYWwgKi8KKyNkZWZpbmUJVklERU9fRU5DT0RFUl9OVFNDCTIJLyogY2FuIGVuY29kZSBOVFNDICovCisjZGVmaW5lCVZJREVPX0VOQ09ERVJfU0VDQU0JNAkvKiBjYW4gZW5jb2RlIFNFQ0FNICovCisjZGVmaW5lCVZJREVPX0VOQ09ERVJfQ0NJUgkxNgkvKiBDQ0lSLTYwMSBwaXhlbCByYXRlICg3MjAgcGl4ZWxzIHBlciBsaW5lKSBpbnN0ZWFkIG9mIHNxdWFyZSBwaXhlbCByYXRlICovCisJaW50CWlucHV0czsJCQkvKiBudW1iZXIgb2YgaW5wdXRzICovCisJaW50CW91dHB1dHM7CQkvKiBudW1iZXIgb2Ygb3V0cHV0cyAqLworfTsKKworI2RlZmluZQlFTkNPREVSX0dFVF9DQVBBQklMSVRJRVMgX0lPUignZScsIDEsIHN0cnVjdCB2aWRlb19lbmNvZGVyX2NhcGFiaWxpdHkpCisjZGVmaW5lCUVOQ09ERVJfU0VUX05PUk0JX0lPVygnZScsIDIsIGludCkKKyNkZWZpbmUJRU5DT0RFUl9TRVRfSU5QVVQJX0lPVygnZScsIDMsIGludCkJLyogMCA8PSBpbnB1dCA8ICNpbnB1dHMgKi8KKyNkZWZpbmUJRU5DT0RFUl9TRVRfT1VUUFVUCV9JT1coJ2UnLCA0LCBpbnQpCS8qIDAgPD0gb3V0cHV0IDwgI291dHB1dHMgKi8KKyNkZWZpbmUJRU5DT0RFUl9FTkFCTEVfT1VUUFVUCV9JT1coJ2UnLCA1LCBpbnQpCS8qIGJvb2xlYW4gb3V0cHV0IGVuYWJsZSBjb250cm9sICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqCVZpZGVvIGZvciBMaW51eCB2ZXJzaW9uIDEgLSBPQlNPTEVURQorICoKKyAqCUhlYWRlciBmaWxlIGZvciB2NGwxIGRyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucywgZm9yCisgKglMaW51eCBrZXJuZWxzIDIuMi54IG9yIDIuNC54LgorICoKKyAqCVByb3ZpZGVzIGhlYWRlciBmb3IgbGVnYWN5IGRyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucworICoKKyAqCVNlZSBodHRwOi8vbGludXh0di5vcmcgZm9yIG1vcmUgaW5mbworICoKKyAqLworI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWX0gKKyNkZWZpbmUgX19MSU5VWF9WSURFT0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUKSB8fCAhZGVmaW5lZCAoX19LRVJORUxfXykKKworc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkKK3sKKwljaGFyIG5hbWVbMzJdOworCWludCB0eXBlOworCWludCBjaGFubmVsczsJLyogTnVtIGNoYW5uZWxzICovCisJaW50IGF1ZGlvczsJLyogTnVtIGF1ZGlvIGRldmljZXMgKi8KKwlpbnQgbWF4d2lkdGg7CS8qIFN1cHBvcnRlZCB3aWR0aCAqLworCWludCBtYXhoZWlnaHQ7CS8qIEFuZCBoZWlnaHQgKi8KKwlpbnQgbWlud2lkdGg7CS8qIFN1cHBvcnRlZCB3aWR0aCAqLworCWludCBtaW5oZWlnaHQ7CS8qIEFuZCBoZWlnaHQgKi8KK307CisKKworc3RydWN0IHZpZGVvX2NoYW5uZWwKK3sKKwlpbnQgY2hhbm5lbDsKKwljaGFyIG5hbWVbMzJdOworCWludCB0dW5lcnM7CisJX191MzIgIGZsYWdzOworI2RlZmluZSBWSURFT19WQ19UVU5FUgkJMQkvKiBDaGFubmVsIGhhcyBhIHR1bmVyICovCisjZGVmaW5lIFZJREVPX1ZDX0FVRElPCQkyCS8qIENoYW5uZWwgaGFzIGF1ZGlvICovCisJX191MTYgIHR5cGU7CisjZGVmaW5lIFZJREVPX1RZUEVfVFYJCTEKKyNkZWZpbmUgVklERU9fVFlQRV9DQU1FUkEJMgorCV9fdTE2IG5vcm07CQkJLyogTm9ybSBzZXQgYnkgY2hhbm5lbCAqLworfTsKKworc3RydWN0IHZpZGVvX3R1bmVyCit7CisJaW50IHR1bmVyOworCWNoYXIgbmFtZVszMl07CisJdW5zaWduZWQgbG9uZyByYW5nZWxvdywgcmFuZ2VoaWdoOwkvKiBUdW5lciByYW5nZSAqLworCV9fdTMyIGZsYWdzOworI2RlZmluZSBWSURFT19UVU5FUl9QQUwJCTEKKyNkZWZpbmUgVklERU9fVFVORVJfTlRTQwkyCisjZGVmaW5lIFZJREVPX1RVTkVSX1NFQ0FNCTQKKyNkZWZpbmUgVklERU9fVFVORVJfTE9XCQk4CS8qIFVzZXMgS0h6IG5vdCBNSHogKi8KKyNkZWZpbmUgVklERU9fVFVORVJfTk9STQkxNgkvKiBUdW5lciBjYW4gc2V0IG5vcm0gKi8KKyNkZWZpbmUgVklERU9fVFVORVJfU1RFUkVPX09OCTEyOAkvKiBUdW5lciBpcyBzZWVpbmcgc3RlcmVvICovCisjZGVmaW5lIFZJREVPX1RVTkVSX1JEU19PTiAgICAgIDI1NiAgICAgLyogVHVuZXIgaXMgc2VlaW5nIGFuIFJEUyBkYXRhc3RyZWFtICovCisjZGVmaW5lIFZJREVPX1RVTkVSX01CU19PTiAgICAgIDUxMiAgICAgLyogVHVuZXIgaXMgc2VlaW5nIGFuIE1CUyBkYXRhc3RyZWFtICovCisJX191MTYgbW9kZTsJCQkvKiBQQUwvTlRTQy9TRUNBTS9PVEhFUiAqLworI2RlZmluZSBWSURFT19NT0RFX1BBTAkJMAorI2RlZmluZSBWSURFT19NT0RFX05UU0MJCTEKKyNkZWZpbmUgVklERU9fTU9ERV9TRUNBTQkyCisjZGVmaW5lIFZJREVPX01PREVfQVVUTwkJMworCV9fdTE2IHNpZ25hbDsJCQkvKiBTaWduYWwgc3RyZW5ndGggMTZiaXQgc2NhbGUgKi8KK307CisKK3N0cnVjdCB2aWRlb19waWN0dXJlCit7CisJX191MTYJYnJpZ2h0bmVzczsKKwlfX3UxNglodWU7CisJX191MTYJY29sb3VyOworCV9fdTE2CWNvbnRyYXN0OworCV9fdTE2CXdoaXRlbmVzczsJLyogQmxhY2sgYW5kIHdoaXRlIG9ubHkgKi8KKwlfX3UxNglkZXB0aDsJCS8qIENhcHR1cmUgZGVwdGggKi8KKwlfX3UxNiAgIHBhbGV0dGU7CS8qIFBhbGV0dGUgaW4gdXNlICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfR1JFWQkxCS8qIExpbmVhciBncmV5c2NhbGUgKi8KKyNkZWZpbmUgVklERU9fUEFMRVRURV9ISTI0MAkyCS8qIEhpZ2ggMjQwIGN1YmUgKEJUODQ4KSAqLworI2RlZmluZSBWSURFT19QQUxFVFRFX1JHQjU2NQkzCS8qIDU2NSAxNiBiaXQgUkdCICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfUkdCMjQJNAkvKiAyNGJpdCBSR0IgKi8KKyNkZWZpbmUgVklERU9fUEFMRVRURV9SR0IzMgk1CS8qIDMyYml0IFJHQiAqLworI2RlZmluZSBWSURFT19QQUxFVFRFX1JHQjU1NQk2CS8qIDU1NSAxNWJpdCBSR0IgKi8KKyNkZWZpbmUgVklERU9fUEFMRVRURV9ZVVY0MjIJNwkvKiBZVVY0MjIgY2FwdHVyZSAqLworI2RlZmluZSBWSURFT19QQUxFVFRFX1lVWVYJOAorI2RlZmluZSBWSURFT19QQUxFVFRFX1VZVlkJOQkvKiBUaGUgZ3JlYXQgdGhpbmcgYWJvdXQgc3RhbmRhcmRzIGlzIC4uLiAqLworI2RlZmluZSBWSURFT19QQUxFVFRFX1lVVjQyMAkxMAorI2RlZmluZSBWSURFT19QQUxFVFRFX1lVVjQxMQkxMQkvKiBZVVY0MTEgY2FwdHVyZSAqLworI2RlZmluZSBWSURFT19QQUxFVFRFX1JBVwkxMgkvKiBSQVcgY2FwdHVyZSAoQlQ4NDgpICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfWVVWNDIyUAkxMwkvKiBZVVYgNDoyOjIgUGxhbmFyICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfWVVWNDExUAkxNAkvKiBZVVYgNDoxOjEgUGxhbmFyICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfWVVWNDIwUAkxNQkvKiBZVVYgNDoyOjAgUGxhbmFyICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfWVVWNDEwUAkxNgkvKiBZVVYgNDoxOjAgUGxhbmFyICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfUExBTkFSCTEzCS8qIHN0YXJ0IG9mIHBsYW5hciBlbnRyaWVzICovCisjZGVmaW5lIFZJREVPX1BBTEVUVEVfQ09NUE9ORU5UIDcJLyogc3RhcnQgb2YgY29tcG9uZW50IGVudHJpZXMgKi8KK307CisKK3N0cnVjdCB2aWRlb19hdWRpbworeworCWludAlhdWRpbzsJCS8qIEF1ZGlvIGNoYW5uZWwgKi8KKwlfX3UxNgl2b2x1bWU7CQkvKiBJZiBzZXR0YWJsZSAqLworCV9fdTE2CWJhc3MsIHRyZWJsZTsKKwlfX3UzMglmbGFnczsKKyNkZWZpbmUgVklERU9fQVVESU9fTVVURQkxCisjZGVmaW5lIFZJREVPX0FVRElPX01VVEFCTEUJMgorI2RlZmluZSBWSURFT19BVURJT19WT0xVTUUJNAorI2RlZmluZSBWSURFT19BVURJT19CQVNTCTgKKyNkZWZpbmUgVklERU9fQVVESU9fVFJFQkxFCTE2CisjZGVmaW5lIFZJREVPX0FVRElPX0JBTEFOQ0UJMzIKKwljaGFyICAgIG5hbWVbMTZdOworI2RlZmluZSBWSURFT19TT1VORF9NT05PCTEKKyNkZWZpbmUgVklERU9fU09VTkRfU1RFUkVPCTIKKyNkZWZpbmUgVklERU9fU09VTkRfTEFORzEJNAorI2RlZmluZSBWSURFT19TT1VORF9MQU5HMgk4CisJX191MTYgICBtb2RlOworCV9fdTE2CWJhbGFuY2U7CS8qIFN0ZXJlbyBiYWxhbmNlICovCisJX191MTYJc3RlcDsJCS8qIFN0ZXAgYWN0dWFsIHZvbHVtZSB1c2VzICovCit9OworCitzdHJ1Y3QgdmlkZW9fY2xpcAoreworCV9fczMyCXgseTsKKwlfX3MzMgl3aWR0aCwgaGVpZ2h0OworCXN0cnVjdAl2aWRlb19jbGlwICpuZXh0OwkvKiBGb3IgdXNlciB1c2UvZHJpdmVyIHVzZSBvbmx5ICovCit9OworCitzdHJ1Y3QgdmlkZW9fd2luZG93Cit7CisJX191MzIJeCx5OwkJCS8qIFBvc2l0aW9uIG9mIHdpbmRvdyAqLworCV9fdTMyCXdpZHRoLGhlaWdodDsJCS8qIEl0cyBzaXplICovCisJX191MzIJY2hyb21ha2V5OworCV9fdTMyCWZsYWdzOworCXN0cnVjdAl2aWRlb19jbGlwICpjbGlwczsJLyogU2V0IG9ubHkgKi8KKwlpbnQJY2xpcGNvdW50OworI2RlZmluZSBWSURFT19XSU5ET1dfSU5URVJMQUNFCTEKKyNkZWZpbmUgVklERU9fV0lORE9XX0NIUk9NQUtFWQkxNgkvKiBPdmVybGF5IGJ5IGNocm9tYWtleSAqLworI2RlZmluZSBWSURFT19DTElQX0JJVE1BUAktMQorLyogYml0bWFwIGlzIDEwMjR4NjI1LCBhICcxJyBiaXQgcmVwcmVzZW50cyBhIGNsaXBwZWQgcGl4ZWwgKi8KKyNkZWZpbmUgVklERU9fQ0xJUE1BUF9TSVpFCSgxMjggKiA2MjUpCit9OworCitzdHJ1Y3QgdmlkZW9fY2FwdHVyZQoreworCV9fdTMyIAl4LHk7CQkJLyogT2Zmc2V0cyBpbnRvIGltYWdlICovCisJX191MzIJd2lkdGgsIGhlaWdodDsJCS8qIEFyZWEgdG8gY2FwdHVyZSAqLworCV9fdTE2CWRlY2ltYXRpb247CQkvKiBEZWNpbWF0aW9uIGRpdmlkZXIgKi8KKwlfX3UxNglmbGFnczsJCQkvKiBGbGFncyBmb3IgY2FwdHVyZSAqLworI2RlZmluZSBWSURFT19DQVBUVVJFX09ERAkJMAkvKiBUZW1wb3JhbCAqLworI2RlZmluZSBWSURFT19DQVBUVVJFX0VWRU4JCTEKK307CisKK3N0cnVjdCB2aWRlb19idWZmZXIKK3sKKwl2b2lkCSpiYXNlOworCWludAloZWlnaHQsd2lkdGg7CisJaW50CWRlcHRoOworCWludAlieXRlc3BlcmxpbmU7Cit9OworCitzdHJ1Y3QgdmlkZW9fbW1hcAoreworCXVuc2lnbmVkCWludCBmcmFtZTsJCS8qIEZyYW1lICgwIC0gbikgZm9yIGRvdWJsZSBidWZmZXIgKi8KKwlpbnQJCWhlaWdodCx3aWR0aDsKKwl1bnNpZ25lZAlpbnQgZm9ybWF0OwkJLyogc2hvdWxkIGJlIFZJREVPX1BBTEVUVEVfKiAqLworfTsKKworc3RydWN0IHZpZGVvX2tleQoreworCV9fdTgJa2V5WzhdOworCV9fdTMyCWZsYWdzOworfTsKKworc3RydWN0IHZpZGVvX21idWYKK3sKKwlpbnQJc2l6ZTsJCS8qIFRvdGFsIG1lbW9yeSB0byBtYXAgKi8KKwlpbnQJZnJhbWVzOwkJLyogRnJhbWVzICovCisJaW50CW9mZnNldHNbVklERU9fTUFYX0ZSQU1FXTsKK307CisKKyNkZWZpbmUgCVZJREVPX05PX1VOSVQJKC0xKQorCitzdHJ1Y3QgdmlkZW9fdW5pdAoreworCWludCAJdmlkZW87CQkvKiBWaWRlbyBtaW5vciAqLworCWludAl2Ymk7CQkvKiBWQkkgbWlub3IgKi8KKwlpbnQJcmFkaW87CQkvKiBSYWRpbyBtaW5vciAqLworCWludAlhdWRpbzsJCS8qIEF1ZGlvIG1pbm9yICovCisJaW50CXRlbGV0ZXh0OwkvKiBUZWxldGV4dCBtaW5vciAqLworfTsKKworc3RydWN0IHZiaV9mb3JtYXQgeworCV9fdTMyCXNhbXBsaW5nX3JhdGU7CS8qIGluIEh6ICovCisJX191MzIJc2FtcGxlc19wZXJfbGluZTsKKwlfX3UzMglzYW1wbGVfZm9ybWF0OwkvKiBWSURFT19QQUxFVFRFX1JBVyBvbmx5ICgxIGJ5dGUpICovCisJX19zMzIJc3RhcnRbMl07CS8qIHN0YXJ0aW5nIGxpbmUgZm9yIGVhY2ggZnJhbWUgKi8KKwlfX3UzMgljb3VudFsyXTsJLyogY291bnQgb2YgbGluZXMgZm9yIGVhY2ggZnJhbWUgKi8KKwlfX3UzMglmbGFnczsKKyNkZWZpbmUJVkJJX1VOU1lOQwkxCS8qIGNhbiBkaXN0aW5ndWVzIGJldHdlZW4gdG9wL2JvdHRvbSBmaWVsZCAqLworI2RlZmluZQlWQklfSU5URVJMQUNFRAkyCS8qIGxpbmVzIGFyZSBpbnRlcmxhY2VkICovCit9OworCisvKiB2aWRlb19pbmZvIGlzIGJpYXNlZCB0b3dhcmRzIGhhcmR3YXJlIG1wZWcgZW5jb2RlL2RlY29kZSAqLworLyogYnV0IGl0IGNvdWxkIGFwcGx5IGdlbmVyaWNhbGx5IHRvIGFueSBoYXJkd2FyZSBjb21wcmVzc29yL2RlY29tcHJlc3NvciAqLworc3RydWN0IHZpZGVvX2luZm8KK3sKKwlfX3UzMglmcmFtZV9jb3VudDsJLyogZnJhbWVzIG91dHB1dCBzaW5jZSBkZWNvZGUvZW5jb2RlIGJlZ2FuICovCisJX191MzIJaF9zaXplOwkJLyogY3VycmVudCB1bnNjYWxlZCBob3Jpem9udGFsIHNpemUgKi8KKwlfX3UzMgl2X3NpemU7CQkvKiBjdXJyZW50IHVuc2NhbGVkIHZlcml0Y2FsIHNpemUgKi8KKwlfX3UzMglzbXB0ZV90aW1lY29kZTsJLyogY3VycmVudCBTTVBURSB0aW1lY29kZSAoZm9yIGN1cnJlbnQgR09QKSAqLworCV9fdTMyCXBpY3R1cmVfdHlwZTsJLyogY3VycmVudCBwaWN0dXJlIHR5cGUgKi8KKwlfX3UzMgl0ZW1wb3JhbF9yZWZlcmVuY2U7CS8qIGN1cnJlbnQgdGVtcG9yYWwgcmVmZXJlbmNlICovCisJX191OAl1c2VyX2RhdGFbMjU2XTsJLyogdXNlciBkYXRhIGxhc3QgZm91bmQgaW4gY29tcHJlc3NlZCBzdHJlYW0gKi8KKwkvKiB1c2VyX2RhdGFbMF0gY29udGFpbnMgdXNlciBkYXRhIGZsYWdzLCB1c2VyX2RhdGFbMV0gaGFzIGNvdW50ICovCit9OworCisvKiBnZW5lcmljIHN0cnVjdHVyZSBmb3Igc2V0dGluZyBwbGF5YmFjayBtb2RlcyAqLworc3RydWN0IHZpZGVvX3BsYXlfbW9kZQoreworCWludAltb2RlOworCWludAlwMTsKKwlpbnQJcDI7Cit9OworCisvKiBmb3IgbG9hZGluZyBtaWNyb2NvZGUgLyBmcGdhIHByb2dyYW1taW5nICovCitzdHJ1Y3QgdmlkZW9fY29kZQoreworCWNoYXIJbG9hZHdoYXRbMTZdOwkvKiBuYW1lIG9yIHRhZyBvZiBmaWxlIGJlaW5nIHBhc3NlZCAqLworCWludAlkYXRhc2l6ZTsKKwlfX3U4CSpkYXRhOworfTsKKworI2RlZmluZSBWSURJT0NHQ0FQCQlfSU9SKCd2JywxLHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5KQkvKiBHZXQgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFZJRElPQ0dDSEFOCQlfSU9XUigndicsMixzdHJ1Y3QgdmlkZW9fY2hhbm5lbCkJLyogR2V0IGNoYW5uZWwgaW5mbyAoc291cmNlcykgKi8KKyNkZWZpbmUgVklESU9DU0NIQU4JCV9JT1coJ3YnLDMsc3RydWN0IHZpZGVvX2NoYW5uZWwpCS8qIFNldCBjaGFubmVsIAkqLworI2RlZmluZSBWSURJT0NHVFVORVIJCV9JT1dSKCd2Jyw0LHN0cnVjdCB2aWRlb190dW5lcikJCS8qIEdldCB0dW5lciBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgVklESU9DU1RVTkVSCQlfSU9XKCd2Jyw1LHN0cnVjdCB2aWRlb190dW5lcikJCS8qIFR1bmUgdGhlIHR1bmVyIGZvciB0aGUgY3VycmVudCBjaGFubmVsICovCisjZGVmaW5lIFZJRElPQ0dQSUNUCQlfSU9SKCd2Jyw2LHN0cnVjdCB2aWRlb19waWN0dXJlKQkvKiBHZXQgcGljdHVyZSBwcm9wZXJ0aWVzICovCisjZGVmaW5lIFZJRElPQ1NQSUNUCQlfSU9XKCd2Jyw3LHN0cnVjdCB2aWRlb19waWN0dXJlKQkvKiBTZXQgcGljdHVyZSBwcm9wZXJ0aWVzICovCisjZGVmaW5lIFZJRElPQ0NBUFRVUkUJCV9JT1coJ3YnLDgsaW50KQkJCQkvKiBTdGFydCwgZW5kIGNhcHR1cmUgKi8KKyNkZWZpbmUgVklESU9DR1dJTgkJX0lPUigndicsOSwgc3RydWN0IHZpZGVvX3dpbmRvdykJLyogR2V0IHRoZSB2aWRlbyBvdmVybGF5IHdpbmRvdyAqLworI2RlZmluZSBWSURJT0NTV0lOCQlfSU9XKCd2JywxMCwgc3RydWN0IHZpZGVvX3dpbmRvdykJLyogU2V0IHRoZSB2aWRlbyBvdmVybGF5IHdpbmRvdyAtIHBhc3NlcyBjbGlwIGxpc3QgZm9yIGhhcmR3YXJlIHNtYXJ0cyAsIGNocm9tYWtleSBldGMgKi8KKyNkZWZpbmUgVklESU9DR0ZCVUYJCV9JT1IoJ3YnLDExLCBzdHJ1Y3QgdmlkZW9fYnVmZmVyKQkvKiBHZXQgZnJhbWUgYnVmZmVyICovCisjZGVmaW5lIFZJRElPQ1NGQlVGCQlfSU9XKCd2JywxMiwgc3RydWN0IHZpZGVvX2J1ZmZlcikJLyogU2V0IGZyYW1lIGJ1ZmZlciAtIHJvb3Qgb25seSAqLworI2RlZmluZSBWSURJT0NLRVkJCV9JT1IoJ3YnLDEzLCBzdHJ1Y3QgdmlkZW9fa2V5KQkJLyogVmlkZW8ga2V5IGV2ZW50IC0gdG8gZGV2IDI1NSBpcyB0byBhbGwgLSBjdXRzIGNhcHR1cmUgb24gYWxsIERNQSB3aW5kb3dzIHdpdGggdGhpcyBrZXkgKDB4RkZGRkZGRkYgPT0gYWxsKSAqLworI2RlZmluZSBWSURJT0NHRlJFUQkJX0lPUigndicsMTQsIHVuc2lnbmVkIGxvbmcpCQkvKiBTZXQgdHVuZXIgKi8KKyNkZWZpbmUgVklESU9DU0ZSRVEJCV9JT1coJ3YnLDE1LCB1bnNpZ25lZCBsb25nKQkJLyogU2V0IHR1bmVyICovCisjZGVmaW5lIFZJRElPQ0dBVURJTwkJX0lPUigndicsMTYsIHN0cnVjdCB2aWRlb19hdWRpbykJLyogR2V0IGF1ZGlvIGluZm8gKi8KKyNkZWZpbmUgVklESU9DU0FVRElPCQlfSU9XKCd2JywxNywgc3RydWN0IHZpZGVvX2F1ZGlvKQkvKiBBdWRpbyBzb3VyY2UsIG11dGUgZXRjICovCisjZGVmaW5lIFZJRElPQ1NZTkMJCV9JT1coJ3YnLDE4LCBpbnQpCQkJLyogU3luYyB3aXRoIG1tYXAgZ3JhYmJpbmcgKi8KKyNkZWZpbmUgVklESU9DTUNBUFRVUkUJCV9JT1coJ3YnLDE5LCBzdHJ1Y3QgdmlkZW9fbW1hcCkJCS8qIEdyYWIgZnJhbWVzICovCisjZGVmaW5lIFZJRElPQ0dNQlVGCQlfSU9SKCd2JywyMCwgc3RydWN0IHZpZGVvX21idWYpCQkvKiBNZW1vcnkgbWFwIGJ1ZmZlciBpbmZvICovCisjZGVmaW5lIFZJRElPQ0dVTklUCQlfSU9SKCd2JywyMSwgc3RydWN0IHZpZGVvX3VuaXQpCQkvKiBHZXQgYXR0YWNoZWQgdW5pdHMgKi8KKyNkZWZpbmUgVklESU9DR0NBUFRVUkUJCV9JT1IoJ3YnLDIyLCBzdHJ1Y3QgdmlkZW9fY2FwdHVyZSkJLyogR2V0IHN1YmNhcHR1cmUgKi8KKyNkZWZpbmUgVklESU9DU0NBUFRVUkUJCV9JT1coJ3YnLDIzLCBzdHJ1Y3QgdmlkZW9fY2FwdHVyZSkJLyogU2V0IHN1YmNhcHR1cmUgKi8KKyNkZWZpbmUgVklESU9DU1BMQVlNT0RFCQlfSU9XKCd2JywyNCwgc3RydWN0IHZpZGVvX3BsYXlfbW9kZSkJLyogU2V0IG91dHB1dCB2aWRlbyBtb2RlL2ZlYXR1cmUgKi8KKyNkZWZpbmUgVklESU9DU1dSSVRFTU9ERQlfSU9XKCd2JywyNSwgaW50KQkJCS8qIFNldCB3cml0ZSBtb2RlICovCisjZGVmaW5lIFZJRElPQ0dQTEFZSU5GTwkJX0lPUigndicsMjYsIHN0cnVjdCB2aWRlb19pbmZvKQkJLyogR2V0IGN1cnJlbnQgcGxheWJhY2sgaW5mbyBmcm9tIGhhcmR3YXJlICovCisjZGVmaW5lIFZJRElPQ1NNSUNST0NPREUJX0lPVygndicsMjcsIHN0cnVjdCB2aWRlb19jb2RlKQkJLyogTG9hZCBtaWNyb2NvZGUgaW50byBoYXJkd2FyZSAqLworI2RlZmluZQlWSURJT0NHVkJJRk1UCQlfSU9SKCd2JywyOCwgc3RydWN0IHZiaV9mb3JtYXQpCQkvKiBHZXQgVkJJIGluZm9ybWF0aW9uICovCisjZGVmaW5lCVZJRElPQ1NWQklGTVQJCV9JT1coJ3YnLDI5LCBzdHJ1Y3QgdmJpX2Zvcm1hdCkJCS8qIFNldCBWQkkgaW5mb3JtYXRpb24gKi8KKworCisjZGVmaW5lIEJBU0VfVklESU9DUFJJVkFURQkxOTIJCS8qIDE5Mi0yNTUgYXJlIHByaXZhdGUgKi8KKworLyogVklESU9DU1dSSVRFTU9ERSAqLworI2RlZmluZSBWSURfV1JJVEVfTVBFR19BVUQJCTAKKyNkZWZpbmUgVklEX1dSSVRFX01QRUdfVklECQkxCisjZGVmaW5lIFZJRF9XUklURV9PU0QJCQkyCisjZGVmaW5lIFZJRF9XUklURV9UVFgJCQkzCisjZGVmaW5lIFZJRF9XUklURV9DQwkJCTQKKyNkZWZpbmUgVklEX1dSSVRFX01KUEVHCQkJNQorCisvKiBWSURJT0NTUExBWU1PREUgKi8KKyNkZWZpbmUgVklEX1BMQVlfVklEX09VVF9NT0RFCQkwCisJLyogcDE6ID0gVklERU9fTU9ERV9QQUwsIFZJREVPX01PREVfTlRTQywgZXRjIC4uLiAqLworI2RlZmluZSBWSURfUExBWV9HRU5MT0NLCQkxCisJLyogcDE6IDAgPSBPRkYsIDEgPSBPTiAqLworCS8qIHAyOiBHRU5MT0NLIEZJTkUgREVMQVkgdmFsdWUgKi8KKyNkZWZpbmUgVklEX1BMQVlfTk9STUFMCQkJMgorI2RlZmluZSBWSURfUExBWV9QQVVTRQkJCTMKKyNkZWZpbmUgVklEX1BMQVlfU0lOR0xFX0ZSQU1FCQk0CisjZGVmaW5lIFZJRF9QTEFZX0ZBU1RfRk9SV0FSRAkJNQorI2RlZmluZSBWSURfUExBWV9TTE9XX01PVElPTgkJNgorI2RlZmluZSBWSURfUExBWV9JTU1FRElBVEVfTk9STUFMCTcKKyNkZWZpbmUgVklEX1BMQVlfU1dJVENIX0NIQU5ORUxTCTgKKyNkZWZpbmUgVklEX1BMQVlfRlJFRVpFX0ZSQU1FCQk5CisjZGVmaW5lIFZJRF9QTEFZX1NUSUxMX01PREUJCTEwCisjZGVmaW5lIFZJRF9QTEFZX01BU1RFUl9NT0RFCQkxMQorCS8qIHAxOiBzZWUgYmVsb3cgKi8KKyNkZWZpbmUJCVZJRF9QTEFZX01BU1RFUl9OT05FCTEKKyNkZWZpbmUJCVZJRF9QTEFZX01BU1RFUl9WSURFTwkyCisjZGVmaW5lCQlWSURfUExBWV9NQVNURVJfQVVESU8JMworI2RlZmluZSBWSURfUExBWV9BQ1RJVkVfU0NBTkxJTkVTCTEyCisJLyogcDEgPSBmaXJzdCBhY3RpdmU7IHAyID0gbGFzdCBhY3RpdmUgKi8KKyNkZWZpbmUgVklEX1BMQVlfUkVTRVQJCQkxMworI2RlZmluZSBWSURfUExBWV9FTkRfTUFSSwkJMTQKKworI2VuZGlmIC8qIENPTkZJR19WSURFT19WNEwxX0NPTVBBVCAqLworCisjZW5kaWYgLyogX19MSU5VWF9WSURFT0RFVl9IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFjY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtMCwwICsxLDE0MTIgQEAKKy8qCisgKiAgVmlkZW8gZm9yIExpbnV4IFR3byBoZWFkZXIgZmlsZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyB0aGUgY29udHJpYnV0b3JzCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZWRpc3RyaWJ1dGUgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBCU0QgbGljZW5zZSBhcyBzdGF0ZWQgYmVsb3c6CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgICBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKglIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zCisgKiB3aXRoIHB1YmxpYyBBUEkuCisgKiBBbGwga2VybmVsLXNwZWNpZmljIHN0dWZmIHdlcmUgbW92ZWQgdG8gbWVkaWEvdjRsMi1kZXYuaCwgc28KKyAqIG5vICNpZiBfX0tFUk5FTCB0ZXN0cyBhcmUgYWxsb3dlZCBoZXJlCisgKgorICoJU2VlIGh0dHA6Ly9saW51eHR2Lm9yZyBmb3IgbW9yZSBpbmZvCisgKgorICoJQXV0aG9yOiBCaWxsIERpcmtzIDxiaWxsQHRoZWRpcmtzLm9yZz4KKyAqCQlKdXN0aW4gU2Nob2VtYW4KKyAqICAgICAgICAgICAgICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqCQlldCBhbC4KKyAqLworI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWMl9ICisjZGVmaW5lIF9fTElOVVhfVklERU9ERVYyX0gKKyNkZWZpbmUgX191c2VyCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogQ29tbW9uIHN0dWZmIGZvciBib3RoIFY0TDEgYW5kIFY0TDIKKyAqIE1vdmVkIGZyb20gdmlkZW9kZXYuaAorICovCisjZGVmaW5lIFZJREVPX01BWF9GUkFNRSAgICAgICAgICAgICAgIDMyCisKKyNkZWZpbmUgVklEX1RZUEVfQ0FQVFVSRQkxCS8qIENhbiBjYXB0dXJlICovCisjZGVmaW5lIFZJRF9UWVBFX1RVTkVSCQkyCS8qIENhbiB0dW5lICovCisjZGVmaW5lIFZJRF9UWVBFX1RFTEVURVhUCTQJLyogRG9lcyB0ZWxldGV4dCAqLworI2RlZmluZSBWSURfVFlQRV9PVkVSTEFZCTgJLyogT3ZlcmxheSBvbnRvIGZyYW1lIGJ1ZmZlciAqLworI2RlZmluZSBWSURfVFlQRV9DSFJPTUFLRVkJMTYJLyogT3ZlcmxheSBieSBjaHJvbWFrZXkgKi8KKyNkZWZpbmUgVklEX1RZUEVfQ0xJUFBJTkcJMzIJLyogQ2FuIGNsaXAgKi8KKyNkZWZpbmUgVklEX1RZUEVfRlJBTUVSQU0JNjQJLyogVXNlcyB0aGUgZnJhbWUgYnVmZmVyIG1lbW9yeSAqLworI2RlZmluZSBWSURfVFlQRV9TQ0FMRVMJCTEyOAkvKiBTY2FsYWJsZSAqLworI2RlZmluZSBWSURfVFlQRV9NT05PQ0hST01FCTI1NgkvKiBNb25vY2hyb21lIG9ubHkgKi8KKyNkZWZpbmUgVklEX1RZUEVfU1VCQ0FQVFVSRQk1MTIJLyogQ2FuIGNhcHR1cmUgc3ViYXJlYXMgb2YgdGhlIGltYWdlICovCisjZGVmaW5lIFZJRF9UWVBFX01QRUdfREVDT0RFUgkxMDI0CS8qIENhbiBkZWNvZGUgTVBFRyBzdHJlYW1zICovCisjZGVmaW5lIFZJRF9UWVBFX01QRUdfRU5DT0RFUgkyMDQ4CS8qIENhbiBlbmNvZGUgTVBFRyBzdHJlYW1zICovCisjZGVmaW5lIFZJRF9UWVBFX01KUEVHX0RFQ09ERVIJNDA5NgkvKiBDYW4gZGVjb2RlIE1KUEVHIHN0cmVhbXMgKi8KKyNkZWZpbmUgVklEX1RZUEVfTUpQRUdfRU5DT0RFUgk4MTkyCS8qIENhbiBlbmNvZGUgTUpQRUcgc3RyZWFtcyAqLworCisvKgorICoJTSBJIFMgQyBFIEwgTCBBIE4gRSBPIFUgUworICovCisKKy8qICBGb3VyLWNoYXJhY3Rlci1jb2RlIChGT1VSQ0MpICovCisjZGVmaW5lIHY0bDJfZm91cmNjKGEsYixjLGQpXAorCSgoKF9fdTMyKShhKTw8MCl8KChfX3UzMikoYik8PDgpfCgoX191MzIpKGMpPDwxNil8KChfX3UzMikoZCk8PDI0KSkKKworLyoKKyAqCUUgTiBVIE0gUworICovCitlbnVtIHY0bDJfZmllbGQgeworCVY0TDJfRklFTERfQU5ZICAgICAgICAgICA9IDAsIC8qIGRyaXZlciBjYW4gY2hvb3NlIGZyb20gbm9uZSwKKwkJCQkJIHRvcCwgYm90dG9tLCBpbnRlcmxhY2VkCisJCQkJCSBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgaXQgdGhpbmtzCisJCQkJCSBpcyBhcHByb3hpbWF0ZSAuLi4gKi8KKwlWNEwyX0ZJRUxEX05PTkUgICAgICAgICAgPSAxLCAvKiB0aGlzIGRldmljZSBoYXMgbm8gZmllbGRzIC4uLiAqLworCVY0TDJfRklFTERfVE9QICAgICAgICAgICA9IDIsIC8qIHRvcCBmaWVsZCBvbmx5ICovCisJVjRMMl9GSUVMRF9CT1RUT00gICAgICAgID0gMywgLyogYm90dG9tIGZpZWxkIG9ubHkgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgICAgPSA0LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkICovCisJVjRMMl9GSUVMRF9TRVFfVEIgICAgICAgID0gNSwgLyogYm90aCBmaWVsZHMgc2VxdWVudGlhbCBpbnRvIG9uZQorCQkJCQkgYnVmZmVyLCB0b3AtYm90dG9tIG9yZGVyICovCisJVjRMMl9GSUVMRF9TRVFfQlQgICAgICAgID0gNiwgLyogc2FtZSBhcyBhYm92ZSArIGJvdHRvbS10b3Agb3JkZXIgKi8KKwlWNEwyX0ZJRUxEX0FMVEVSTkFURSAgICAgPSA3LCAvKiBib3RoIGZpZWxkcyBhbHRlcm5hdGluZyBpbnRvCisJCQkJCSBzZXBhcmF0ZSBidWZmZXJzICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCID0gOCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCisJCQkJCSBmaXJzdCBhbmQgdGhlIHRvcCBmaWVsZCBpcworCQkJCQkgdHJhbnNtaXR0ZWQgZmlyc3QgKi8KKwlWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgPSA5LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkLCB0b3AgZmllbGQKKwkJCQkJIGZpcnN0IGFuZCB0aGUgYm90dG9tIGZpZWxkIGlzCisJCQkJCSB0cmFuc21pdHRlZCBmaXJzdCAqLworfTsKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfVE9QKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9UT1AgCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQorI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19CT1RUT00oZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0JPVFRPTSAJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIJfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCisjZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpCVwKKwkoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKKworZW51bSB2NGwyX2J1Zl90eXBlIHsKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgICAgICAgID0gMSwKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAgICAgICAgID0gMiwKKwlWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgICAgICAgID0gMywKKwlWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFICAgICAgICAgID0gNCwKKwlWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQgICAgICAgICAgID0gNSwKKwlWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRSAgID0gNiwKKwlWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUICAgID0gNywKKyNpZiAxCisJLyogRXhwZXJpbWVudGFsICovCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWSA9IDgsCisjZW5kaWYKKwlWNEwyX0JVRl9UWVBFX1BSSVZBVEUgICAgICAgICAgICAgID0gMHg4MCwKK307CisKK2VudW0gdjRsMl9jdHJsX3R5cGUgeworCVY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIJICAgICA9IDEsCisJVjRMMl9DVFJMX1RZUEVfQk9PTEVBTgkgICAgID0gMiwKKwlWNEwyX0NUUkxfVFlQRV9NRU5VCSAgICAgPSAzLAorCVY0TDJfQ1RSTF9UWVBFX0JVVFRPTgkgICAgID0gNCwKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgICAgID0gNSwKKwlWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICAgID0gNiwKK307CisKK2VudW0gdjRsMl90dW5lcl90eXBlIHsKKwlWNEwyX1RVTkVSX1JBRElPCSAgICAgPSAxLAorCVY0TDJfVFVORVJfQU5BTE9HX1RWCSAgICAgPSAyLAorCVY0TDJfVFVORVJfRElHSVRBTF9UVgkgICAgID0gMywKK307CisKK2VudW0gdjRsMl9tZW1vcnkgeworCVY0TDJfTUVNT1JZX01NQVAgICAgICAgICAgICAgPSAxLAorCVY0TDJfTUVNT1JZX1VTRVJQVFIgICAgICAgICAgPSAyLAorCVY0TDJfTUVNT1JZX09WRVJMQVkgICAgICAgICAgPSAzLAorfTsKKworLyogc2VlIGFsc28gaHR0cDovL3Zla3Rvci50aGVvcmVtLmNhL2dyYXBoaWNzL3ljYmNyLyAqLworZW51bSB2NGwyX2NvbG9yc3BhY2UgeworCS8qIElUVS1SIDYwMSAtLSBicm9hZGNhc3QgTlRTQy9QQUwgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNICAgICA9IDEsCisKKwkvKiAxMTI1LUxpbmUgKFVTKSBIRFRWICovCisJVjRMMl9DT0xPUlNQQUNFX1NNUFRFMjQwTSAgICAgPSAyLAorCisJLyogSEQgYW5kIG1vZGVybiBjYXB0dXJlcy4gKi8KKwlWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5ICAgICAgICA9IDMsCisKKwkvKiBicm9rZW4gQlQ4NzggZXh0ZW50cyAoNjAxLCBsdW1hIHJhbmdlIDE2LTI1MyBpbnN0ZWFkIG9mIDE2LTIzNSkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfQlQ4NzggICAgICAgICA9IDQsCisKKwkvKiBUaGVzZSBzaG91bGQgYmUgdXNlZnVsLiAgQXNzdW1lIDYwMSBleHRlbnRzLiAqLworCVY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX00gID0gNSwKKwlWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRyA9IDYsCisKKwkvKiBJIGtub3cgdGhlcmUgd2lsbCBiZSBjYW1lcmFzIHRoYXQgc2VuZCB0aGlzLiAgU28sIHRoaXMgaXMKKwkgKiB1bnNwZWNpZmllZCBjaHJvbWF0aWNpdGllcyBhbmQgZnVsbCAwLTI1NSBvbiBlYWNoIG9mIHRoZQorCSAqIFknQ2JDciBjb21wb25lbnRzCisJICovCisJVjRMMl9DT0xPUlNQQUNFX0pQRUcgICAgICAgICAgPSA3LAorCisJLyogRm9yIFJHQiBjb2xvdXJzcGFjZXMsIHRoaXMgaXMgcHJvYmFibHkgYSBnb29kIHN0YXJ0LiAqLworCVY0TDJfQ09MT1JTUEFDRV9TUkdCICAgICAgICAgID0gOCwKK307CisKK2VudW0gdjRsMl9wcmlvcml0eSB7CisJVjRMMl9QUklPUklUWV9VTlNFVCAgICAgICA9IDAsICAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KKwlWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQgID0gMSwKKwlWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFID0gMiwKKwlWNEwyX1BSSU9SSVRZX1JFQ09SRCAgICAgID0gMywKKwlWNEwyX1BSSU9SSVRZX0RFRkFVTFQgICAgID0gVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSwKK307CisKK3N0cnVjdCB2NGwyX3JlY3QgeworCV9fczMyICAgbGVmdDsKKwlfX3MzMiAgIHRvcDsKKwlfX3MzMiAgIHdpZHRoOworCV9fczMyICAgaGVpZ2h0OworfTsKKworc3RydWN0IHY0bDJfZnJhY3QgeworCV9fdTMyICAgbnVtZXJhdG9yOworCV9fdTMyICAgZGVub21pbmF0b3I7Cit9OworCisvKgorICoJRCBSIEkgViBFIFIgICBDIEEgUCBBIEIgSSBMIEkgVCBJIEUgUworICovCitzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5Cit7CisJX191OAlkcml2ZXJbMTZdOwkvKiBpLmUuICJidHR2IiAqLworCV9fdTgJY2FyZFszMl07CS8qIGkuZS4gIkhhdXBwYXVnZSBXaW5UViIgKi8KKwlfX3U4CWJ1c19pbmZvWzMyXTsJLyogIlBDSToiICsgcGNpX25hbWUocGNpX2RldikgKi8KKwlfX3UzMiAgIHZlcnNpb247ICAgICAgICAvKiBzaG91bGQgdXNlIEtFUk5FTF9WRVJTSU9OKCkgKi8KKwlfX3UzMgljYXBhYmlsaXRpZXM7CS8qIERldmljZSBjYXBhYmlsaXRpZXMgKi8KKwlfX3UzMglyZXNlcnZlZFs0XTsKK307CisKKy8qIFZhbHVlcyBmb3IgJ2NhcGFiaWxpdGllcycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fQ0FQVFVSRQkJMHgwMDAwMDAwMSAgLyogSXMgYSB2aWRlbyBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVQJCTB4MDAwMDAwMDIgIC8qIElzIGEgdmlkZW8gb3V0cHV0IGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVkVSTEFZCQkweDAwMDAwMDA0ICAvKiBDYW4gZG8gdmlkZW8gb3ZlcmxheSAqLworI2RlZmluZSBWNEwyX0NBUF9WQklfQ0FQVFVSRQkJMHgwMDAwMDAxMCAgLyogSXMgYSByYXcgVkJJIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZCSV9PVVRQVVQJCTB4MDAwMDAwMjAgIC8qIElzIGEgcmF3IFZCSSBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRQkweDAwMDAwMDQwICAvKiBJcyBhIHNsaWNlZCBWQkkgY2FwdHVyZSBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfU0xJQ0VEX1ZCSV9PVVRQVVQJMHgwMDAwMDA4MCAgLyogSXMgYSBzbGljZWQgVkJJIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkRTX0NBUFRVUkUJCTB4MDAwMDAxMDAgIC8qIFJEUyBkYXRhIGNhcHR1cmUgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUX09WRVJMQVkJMHgwMDAwMDIwMCAgLyogQ2FuIGRvIHZpZGVvIG91dHB1dCBvdmVybGF5ICovCisKKyNkZWZpbmUgVjRMMl9DQVBfVFVORVIJCQkweDAwMDEwMDAwICAvKiBoYXMgYSB0dW5lciAqLworI2RlZmluZSBWNEwyX0NBUF9BVURJTwkJCTB4MDAwMjAwMDAgIC8qIGhhcyBhdWRpbyBzdXBwb3J0ICovCisjZGVmaW5lIFY0TDJfQ0FQX1JBRElPCQkJMHgwMDA0MDAwMCAgLyogaXMgYSByYWRpbyBkZXZpY2UgKi8KKworI2RlZmluZSBWNEwyX0NBUF9SRUFEV1JJVEUgICAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIHJlYWQvd3JpdGUgc3lzdGVtY2FsbHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfQVNZTkNJTyAgICAgICAgICAgICAgICAweDAyMDAwMDAwICAvKiBhc3luYyBJL08gKi8KKyNkZWZpbmUgVjRMMl9DQVBfU1RSRUFNSU5HICAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBzdHJlYW1pbmcgSS9PIGlvY3RscyAqLworCisvKgorICoJViBJIEQgRSBPICAgSSBNIEEgRyBFICAgRiBPIFIgTSBBIFQKKyAqLworc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAoreworCV9fdTMyICAgICAgICAgCQl3aWR0aDsKKwlfX3UzMgkJCWhlaWdodDsKKwlfX3UzMgkJCXBpeGVsZm9ybWF0OworCWVudW0gdjRsMl9maWVsZCAgCWZpZWxkOworCV9fdTMyICAgICAgICAgICAgCWJ5dGVzcGVybGluZTsJLyogZm9yIHBhZGRpbmcsIHplcm8gaWYgdW51c2VkICovCisJX191MzIgICAgICAgICAgCQlzaXplaW1hZ2U7CisJZW51bSB2NGwyX2NvbG9yc3BhY2UJY29sb3JzcGFjZTsKKwlfX3UzMgkJCXByaXY7CQkvKiBwcml2YXRlIGRhdGEsIGRlcGVuZHMgb24gcGl4ZWxmb3JtYXQgKi8KK307CisKKy8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzMyICB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I0NDQgIHY0bDJfZm91cmNjKCdSJywnNCcsJzQnLCc0JykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTUgIHY0bDJfZm91cmNjKCdSJywnRycsJ0InLCdPJykgLyogMTYgIFJHQi01LTUtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NSAgdjRsMl9mb3VyY2MoJ1InLCdHJywnQicsJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTU1WCB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnUScpIC8qIDE2ICBSR0ItNS01LTUgQkUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NjVYIHY0bDJfZm91cmNjKCdSJywnRycsJ0InLCdSJykgLyogMTYgIFJHQi01LTYtNSBCRSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjI0ICAgdjRsMl9mb3VyY2MoJ0InLCdHJywnUicsJzMnKSAvKiAyNCAgQkdSLTgtOC04ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMjQgICB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnMycpIC8qIDI0ICBSR0ItOC04LTggICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1IzMiAgIHY0bDJfZm91cmNjKCdCJywnRycsJ1InLCc0JykgLyogMzIgIEJHUi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjMyICAgdjRsMl9mb3VyY2MoJ1InLCdHJywnQicsJzQnKSAvKiAzMiAgUkdCLTgtOC04LTggICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfR1JFWSAgICB2NGwyX2ZvdXJjYygnRycsJ1InLCdFJywnWScpIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QQUw4ICAgIHY0bDJfZm91cmNjKCdQJywnQScsJ0wnLCc4JykgLyogIDggIDgtYml0IHBhbGV0dGUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQxMCAgdjRsMl9mb3VyY2MoJ1knLCdWJywnVScsJzknKSAvKiAgOSAgWVZVIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDIwICB2NGwyX2ZvdXJjYygnWScsJ1YnLCcxJywnMicpIC8qIDEyICBZVlUgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVlWICAgIHY0bDJfZm91cmNjKCdZJywnVScsJ1knLCdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1VZVlkgICAgdjRsMl9mb3VyY2MoJ1UnLCdZJywnVicsJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIyUCB2NGwyX2ZvdXJjYygnNCcsJzInLCcyJywnUCcpIC8qIDE2ICBZVlU0MjIgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MTFQIHY0bDJfZm91cmNjKCc0JywnMScsJzEnLCdQJykgLyogMTYgIFlWVTQxMSBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k0MVAgICAgdjRsMl9mb3VyY2MoJ1knLCc0JywnMScsJ1AnKSAvKiAxMiAgWVVWIDQ6MToxICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDQ0ICB2NGwyX2ZvdXJjYygnWScsJzQnLCc0JywnNCcpIC8qIDE2ICB4eHh4eXl5eSB1dXV1dnZ2diAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNTU1ICB2NGwyX2ZvdXJjYygnWScsJ1UnLCdWJywnTycpIC8qIDE2ICBZVVYtNS01LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY1NjUgIHY0bDJfZm91cmNjKCdZJywnVScsJ1YnLCdQJykgLyogMTYgIFlVVi01LTYtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjMyICAgdjRsMl9mb3VyY2MoJ1knLCdVJywnVicsJzQnKSAvKiAzMiAgWVVWLTgtOC04LTggICAqLworCisvKiB0d28gcGxhbmVzIC0tIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTIgICAgdjRsMl9mb3VyY2MoJ04nLCdWJywnMScsJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyMSAgICB2NGwyX2ZvdXJjYygnTicsJ1YnLCcyJywnMScpIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCisKKy8qICBUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIG5vdCBkZWZpbmVkIGluIHRoZSBWNEwyIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQxMCAgdjRsMl9mb3VyY2MoJ1knLCdVJywnVicsJzknKSAvKiAgOSAgWVVWIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwICB2NGwyX2ZvdXJjYygnWScsJ1UnLCcxJywnMicpIC8qIDEyICBZVVYgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZWVVWICAgIHY0bDJfZm91cmNjKCdZJywnWScsJ1UnLCdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hJMjQwICAgdjRsMl9mb3VyY2MoJ0gnLCdJJywnMicsJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSE0xMiAgICB2NGwyX2ZvdXJjYygnSCcsJ00nLCcxJywnMicpIC8qICA4ICBZVVYgNDoyOjAgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKworLyogc2VlIGh0dHA6Ly93d3cuc2lsaWNvbmltYWdpbmcuY29tL1JHQiUyMEJheWVyLmh0bSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1I4ICB2NGwyX2ZvdXJjYygnQicsJ0EnLCc4JywnMScpIC8qICA4ICBCR0JHLi4gR1JHUi4uICovCisKKy8qIGNvbXByZXNzZWQgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTUpQRUcgICAgdjRsMl9mb3VyY2MoJ00nLCdKJywnUCcsJ0cnKSAvKiBNb3Rpb24tSlBFRyAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEVHICAgICB2NGwyX2ZvdXJjYygnSicsJ1AnLCdFJywnRycpIC8qIEpGSUYgSlBFRyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0RWICAgICAgIHY0bDJfZm91cmNjKCdkJywndicsJ3MnLCdkJykgLyogMTM5NCAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRyAgICAgdjRsMl9mb3VyY2MoJ00nLCdQJywnRScsJ0cnKSAvKiBNUEVHLTEvMi80ICAgICovCisKKy8qICBWZW5kb3Itc3BlY2lmaWMgZm9ybWF0cyAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9XTlZBICAgICB2NGwyX2ZvdXJjYygnVycsJ04nLCdWJywnQScpIC8qIFdpbm5vdiBodyBjb21wcmVzcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU045QzEwWCAgdjRsMl9mb3VyY2MoJ1MnLCc5JywnMScsJzAnKSAvKiBTTjlDMTB4IGNvbXByZXNzaW9uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QV0MxICAgICB2NGwyX2ZvdXJjYygnUCcsJ1cnLCdDJywnMScpIC8qIHB3YyBvbGRlciB3ZWJjYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzIgICAgIHY0bDJfZm91cmNjKCdQJywnVycsJ0MnLCcyJykgLyogcHdjIG5ld2VyIHdlYmNhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfRVQ2MVgyNTEgdjRsMl9mb3VyY2MoJ0UnLCc2JywnMicsJzUnKSAvKiBFVDYxWDI1MSBjb21wcmVzc2lvbiAqLworCisvKgorICoJRiBPIFIgTSBBIFQgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworc3RydWN0IHY0bDJfZm10ZGVzYworeworCV9fdTMyCQkgICAgaW5kZXg7ICAgICAgICAgICAgIC8qIEZvcm1hdCBudW1iZXIgICAgICAqLworCWVudW0gdjRsMl9idWZfdHlwZSAgdHlwZTsgICAgICAgICAgICAgIC8qIGJ1ZmZlciB0eXBlICAgICAgICAqLworCV9fdTMyICAgICAgICAgICAgICAgZmxhZ3M7CisJX191OAkJICAgIGRlc2NyaXB0aW9uWzMyXTsgICAvKiBEZXNjcmlwdGlvbiBzdHJpbmcgKi8KKwlfX3UzMgkJICAgIHBpeGVsZm9ybWF0OyAgICAgICAvKiBGb3JtYXQgZm91cmNjICAgICAgKi8KKwlfX3UzMgkJICAgIHJlc2VydmVkWzRdOworfTsKKworI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQgMHgwMDAxCisKKyNpZiAxCisJLyogRXhwZXJpbWVudGFsIEZyYW1lIFNpemUgYW5kIGZyYW1lIHJhdGUgZW51bWVyYXRpb24gKi8KKy8qCisgKglGIFIgQSBNIEUgICBTIEkgWiBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK2VudW0gdjRsMl9mcm1zaXpldHlwZXMKK3sKKwlWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURQk9IDEsCisJVjRMMl9GUk1TSVpFX1RZUEVfQ09OVElOVU9VUwk9IDIsCisJVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0UJPSAzLAorfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZV9kaXNjcmV0ZQoreworCV9fdTMyCQkJd2lkdGg7CQkvKiBGcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQloZWlnaHQ7CQkvKiBGcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZV9zdGVwd2lzZQoreworCV9fdTMyCQkJbWluX3dpZHRoOwkvKiBNaW5pbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KKwlfX3UzMgkJCW1heF93aWR0aDsJLyogTWF4aW11bSBmcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQlzdGVwX3dpZHRoOwkvKiBGcmFtZSB3aWR0aCBzdGVwIHNpemUgW3BpeGVsXSAqLworCV9fdTMyCQkJbWluX2hlaWdodDsJLyogTWluaW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJbWF4X2hlaWdodDsJLyogTWF4aW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJc3RlcF9oZWlnaHQ7CS8qIEZyYW1lIGhlaWdodCBzdGVwIHNpemUgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0KK3sKKwlfX3UzMgkJCWluZGV4OwkJLyogRnJhbWUgc2l6ZSBudW1iZXIgKi8KKwlfX3UzMgkJCXBpeGVsX2Zvcm1hdDsJLyogUGl4ZWwgZm9ybWF0ICovCisJX191MzIJCQl0eXBlOwkJLyogRnJhbWUgc2l6ZSB0eXBlIHRoZSBkZXZpY2Ugc3VwcG9ydHMuICovCisKKwl1bmlvbiB7CQkJCQkvKiBGcmFtZSBzaXplICovCisJCXN0cnVjdCB2NGwyX2ZybXNpemVfZGlzY3JldGUJZGlzY3JldGU7CisJCXN0cnVjdCB2NGwyX2ZybXNpemVfc3RlcHdpc2UJc3RlcHdpc2U7CisJfTsKKworCV9fdTMyICAgcmVzZXJ2ZWRbMl07CQkJLyogUmVzZXJ2ZWQgc3BhY2UgZm9yIGZ1dHVyZSB1c2UgKi8KK307CisKKy8qCisgKglGIFIgQSBNIEUgICBSIEEgVCBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK2VudW0gdjRsMl9mcm1pdmFsdHlwZXMKK3sKKwlWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURQk9IDEsCisJVjRMMl9GUk1JVkFMX1RZUEVfQ09OVElOVU9VUwk9IDIsCisJVjRMMl9GUk1JVkFMX1RZUEVfU1RFUFdJU0UJPSAzLAorfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbF9zdGVwd2lzZQoreworCXN0cnVjdCB2NGwyX2ZyYWN0CW1pbjsJCS8qIE1pbmltdW0gZnJhbWUgaW50ZXJ2YWwgW3NdICovCisJc3RydWN0IHY0bDJfZnJhY3QJbWF4OwkJLyogTWF4aW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdAlzdGVwOwkJLyogRnJhbWUgaW50ZXJ2YWwgc3RlcCBzaXplIFtzXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbGVudW0KK3sKKwlfX3UzMgkJCWluZGV4OwkJLyogRnJhbWUgZm9ybWF0IGluZGV4ICovCisJX191MzIJCQlwaXhlbF9mb3JtYXQ7CS8qIFBpeGVsIGZvcm1hdCAqLworCV9fdTMyCQkJd2lkdGg7CQkvKiBGcmFtZSB3aWR0aCAqLworCV9fdTMyCQkJaGVpZ2h0OwkJLyogRnJhbWUgaGVpZ2h0ICovCisJX191MzIJCQl0eXBlOwkJLyogRnJhbWUgaW50ZXJ2YWwgdHlwZSB0aGUgZGV2aWNlIHN1cHBvcnRzLiAqLworCisJdW5pb24gewkJCQkJLyogRnJhbWUgaW50ZXJ2YWwgKi8KKwkJc3RydWN0IHY0bDJfZnJhY3QJCWRpc2NyZXRlOworCQlzdHJ1Y3QgdjRsMl9mcm1pdmFsX3N0ZXB3aXNlCXN0ZXB3aXNlOworCX07CisKKwlfX3UzMglyZXNlcnZlZFsyXTsJCQkvKiBSZXNlcnZlZCBzcGFjZSBmb3IgZnV0dXJlIHVzZSAqLworfTsKKyNlbmRpZgorCisvKgorICoJVCBJIE0gRSBDIE8gRCBFCisgKi8KK3N0cnVjdCB2NGwyX3RpbWVjb2RlCit7CisJX191MzIJdHlwZTsKKwlfX3UzMglmbGFnczsKKwlfX3U4CWZyYW1lczsKKwlfX3U4CXNlY29uZHM7CisJX191OAltaW51dGVzOworCV9fdTgJaG91cnM7CisJX191OAl1c2VyYml0c1s0XTsKK307CisKKy8qICBUeXBlICAqLworI2RlZmluZSBWNEwyX1RDX1RZUEVfMjRGUFMJCTEKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzI1RlBTCQkyCisjZGVmaW5lIFY0TDJfVENfVFlQRV8zMEZQUwkJMworI2RlZmluZSBWNEwyX1RDX1RZUEVfNTBGUFMJCTQKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzYwRlBTCQk1CisKKy8qICBGbGFncyAgKi8KKyNkZWZpbmUgVjRMMl9UQ19GTEFHX0RST1BGUkFNRQkJMHgwMDAxIC8qICJkcm9wLWZyYW1lIiBtb2RlICovCisjZGVmaW5lIFY0TDJfVENfRkxBR19DT0xPUkZSQU1FCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU19maWVsZAkJMHgwMDBDCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfVVNFUkRFRklORUQJMHgwMDAwCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfOEJJVENIQVJTCTB4MDAwOAorLyogVGhlIGFib3ZlIGlzIGJhc2VkIG9uIFNNUFRFIHRpbWVjb2RlcyAqLworCitzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24KK3sKKwlpbnQgcXVhbGl0eTsKKworCWludCAgQVBQbjsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBBUFAgc2VnbWVudCB0byBiZSB3cml0dGVuLAorCQkJCSAqIG11c3QgYmUgMC4uMTUgKi8KKwlpbnQgIEFQUF9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIEFQUG4gc2VnbWVudCAqLworCWNoYXIgQVBQX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gdGhlIEpQRUcgQVBQbiBzZWdtZW50LiAqLworCisJaW50ICBDT01fbGVuOyAgICAgICAgICAgLyogTGVuZ3RoIG9mIGRhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCWNoYXIgQ09NX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCisJX191MzIganBlZ19tYXJrZXJzOyAgICAgLyogV2hpY2ggbWFya2VycyBzaG91bGQgZ28gaW50byB0aGUgSlBFRworCQkJCSAqIG91dHB1dC4gVW5sZXNzIHlvdSBleGFjdGx5IGtub3cgd2hhdAorCQkJCSAqIHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCisJCQkJICogSW5sdWRpbmcgbGVzcyBtYXJrZXJzIHdpbGwgbWFrZSB0aGUKKwkJCQkgKiByZXN1bHRpbmcgY29kZSBzbWFsbGVyLCBidXQgdGhlcmUgd2lsbAorCQkJCSAqIGJlIGZld2VyIGFwbGljYXRpb25zIHdoaWNoIGNhbiByZWFkIGl0LgorCQkJCSAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgQVBQIGFuZCBDT00gbWFya2VyCisJCQkJICogaXMgaW5mbHVlbmNlZCBieSBBUFBfbGVuIGFuZCBDT01fbGVuCisJCQkJICogT05MWSwgbm90IGJ5IHRoaXMgcHJvcGVydHkhICovCisKKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9ESFQgKDE8PDMpICAgIC8qIERlZmluZSBIdWZmbWFuIFRhYmxlcyAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0RRVCAoMTw8NCkgICAgLyogRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZXMgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUkkgKDE8PDUpICAgIC8qIERlZmluZSBSZXN0YXJ0IEludGVydmFsICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQ09NICgxPDw2KSAgICAvKiBDb21tZW50IHNlZ21lbnQgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9BUFAgKDE8PDcpICAgIC8qIEFwcCBzZWdtZW50LCBkcml2ZXIgd2lsbAorCQkJCQkqIGFsbHdheXMgdXNlIEFQUDAgKi8KK307CisKKy8qCisgKglNIEUgTSBPIFIgWSAtIE0gQSBQIFAgSSBOIEcgICBCIFUgRiBGIEUgUiBTCisgKi8KK3N0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzCit7CisJX191MzIJCQljb3VudDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwlfX3UzMgkJCXJlc2VydmVkWzJdOworfTsKKworc3RydWN0IHY0bDJfYnVmZmVyCit7CisJX191MzIJCQlpbmRleDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCV9fdTMyCQkJYnl0ZXN1c2VkOworCV9fdTMyCQkJZmxhZ3M7CisJZW51bSB2NGwyX2ZpZWxkCQlmaWVsZDsKKwlzdHJ1Y3QgdGltZXZhbAkJdGltZXN0YW1wOworCXN0cnVjdCB2NGwyX3RpbWVjb2RlCXRpbWVjb2RlOworCV9fdTMyCQkJc2VxdWVuY2U7CisKKwkvKiBtZW1vcnkgbG9jYXRpb24gKi8KKwllbnVtIHY0bDJfbWVtb3J5ICAgICAgICBtZW1vcnk7CisJdW5pb24geworCQlfX3UzMiAgICAgICAgICAgb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nICAgdXNlcnB0cjsKKwl9IG07CisJX191MzIJCQlsZW5ndGg7CisJX191MzIJCQlpbnB1dDsKKwlfX3UzMgkJCXJlc2VydmVkOworfTsKKworLyogIEZsYWdzIGZvciAnZmxhZ3MnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTUFQUEVECTB4MDAwMSAgLyogQnVmZmVyIGlzIG1hcHBlZCAoZmxhZykgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19RVUVVRUQJMHgwMDAyCS8qIEJ1ZmZlciBpcyBxdWV1ZWQgZm9yIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19ET05FCTB4MDAwNAkvKiBCdWZmZXIgaXMgcmVhZHkgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19LRVlGUkFNRQkweDAwMDgJLyogSW1hZ2UgaXMgYSBrZXlmcmFtZSAoSS1mcmFtZSkgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19QRlJBTUUJMHgwMDEwCS8qIEltYWdlIGlzIGEgUC1mcmFtZSAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX0JGUkFNRQkweDAwMjAJLyogSW1hZ2UgaXMgYSBCLWZyYW1lICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVElNRUNPREUJMHgwMTAwCS8qIHRpbWVjb2RlIGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfSU5QVVQgICAgIDB4MDIwMCAgLyogaW5wdXQgZmllbGQgaXMgdmFsaWQgKi8KKworLyoKKyAqCU8gViBFIFIgTCBBIFkgICBQIFIgRSBWIEkgRSBXCisgKi8KK3N0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyCit7CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJZmxhZ3M7CisvKiBGSVhNRTogaW4gdGhlb3J5IHdlIHNob3VsZCBwYXNzIHNvbWV0aGluZyBsaWtlIFBDSSBkZXZpY2UgKyBtZW1vcnkKKyAqIHJlZ2lvbiArIG9mZnNldCBpbnN0ZWFkIG9mIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyAqLworCXZvaWQqICAgICAgICAgICAgICAgICAgIGJhc2U7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAlmbXQ7Cit9OworLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkLiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9FWFRFUk5PVkVSTEFZCTB4MDAwMQorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0NIUk9NQUtFWQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTElTVF9DTElQUElORyAgICAgMHgwMDA0CisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfQklUTUFQX0NMSVBQSU5HCTB4MDAwOAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0FMUEhBCTB4MDAxMAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0dMT0JBTF9BTFBIQQkweDAwMjAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9JTlZfQUxQSEEJMHgwMDQwCisvKiAgRmxhZ3MgZm9yIHRoZSAnZmxhZ3MnIGZpZWxkLiAqLworI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19QUklNQVJZCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0NIUk9NQUtFWQkweDAwMDQKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEJMHgwMDA4CisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX0dMT0JBTF9BTFBIQQkweDAwMTAKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfSU5WX0FMUEhBCTB4MDAyMAorCitzdHJ1Y3QgdjRsMl9jbGlwCit7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYzsKKwlzdHJ1Y3QgdjRsMl9jbGlwICpuZXh0OworfTsKKworc3RydWN0IHY0bDJfd2luZG93Cit7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgdzsKKwllbnVtIHY0bDJfZmllbGQgIAlmaWVsZDsKKwlfX3UzMgkJCWNocm9tYWtleTsKKwlzdHJ1Y3QgdjRsMl9jbGlwICpjbGlwczsKKwlfX3UzMgkJCWNsaXBjb3VudDsKKwl2b2lkCQkgKmJpdG1hcDsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBnbG9iYWxfYWxwaGE7Cit9OworCisvKgorICoJQyBBIFAgVCBVIFIgRSAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKKyAqLworc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0KK3sKKwlfX3UzMgkJICAgY2FwYWJpbGl0eTsJICAvKiAgU3VwcG9ydGVkIG1vZGVzICovCisJX191MzIJCSAgIGNhcHR1cmVtb2RlOwkgIC8qICBDdXJyZW50IG1vZGUgKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgdGltZXBlcmZyYW1lOyAgLyogIFRpbWUgcGVyIGZyYW1lIGluIC4xdXMgdW5pdHMgKi8KKwlfX3UzMgkJICAgZXh0ZW5kZWRtb2RlOyAgLyogIERyaXZlci1zcGVjaWZpYyBleHRlbnNpb25zICovCisJX191MzIgICAgICAgICAgICAgIHJlYWRidWZmZXJzOyAgIC8qICAjIG9mIGJ1ZmZlcnMgZm9yIHJlYWQgKi8KKwlfX3UzMgkJICAgcmVzZXJ2ZWRbNF07Cit9OworCisvKiAgRmxhZ3MgZm9yICdjYXBhYmlsaXR5JyBhbmQgJ2NhcHR1cmVtb2RlJyBmaWVsZHMgKi8KKyNkZWZpbmUgVjRMMl9NT0RFX0hJR0hRVUFMSVRZCTB4MDAwMQkvKiAgSGlnaCBxdWFsaXR5IGltYWdpbmcgbW9kZSAqLworI2RlZmluZSBWNEwyX0NBUF9USU1FUEVSRlJBTUUJMHgxMDAwCS8qICB0aW1lcGVyZnJhbWUgZmllbGQgaXMgc3VwcG9ydGVkICovCisKK3N0cnVjdCB2NGwyX291dHB1dHBhcm0KK3sKKwlfX3UzMgkJICAgY2FwYWJpbGl0eTsJIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KKwlfX3UzMgkJICAgb3V0cHV0bW9kZTsJIC8qICBDdXJyZW50IG1vZGUgKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgdGltZXBlcmZyYW1lOyAvKiAgVGltZSBwZXIgZnJhbWUgaW4gc2Vjb25kcyAqLworCV9fdTMyCQkgICBleHRlbmRlZG1vZGU7IC8qICBEcml2ZXItc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLworCV9fdTMyICAgICAgICAgICAgICB3cml0ZWJ1ZmZlcnM7IC8qICAjIG9mIGJ1ZmZlcnMgZm9yIHdyaXRlICovCisJX191MzIJCSAgIHJlc2VydmVkWzRdOworfTsKKworLyoKKyAqCUkgTiBQIFUgVCAgIEkgTSBBIEcgRSAgIEMgUiBPIFAgUCBJIE4gRworICovCitzdHJ1Y3QgdjRsMl9jcm9wY2FwIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGJvdW5kczsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBkZWZyZWN0OworCXN0cnVjdCB2NGwyX2ZyYWN0ICAgICAgIHBpeGVsYXNwZWN0OworfTsKKworc3RydWN0IHY0bDJfY3JvcCB7CisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgdHlwZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBjOworfTsKKworLyoKKyAqICAgICAgQSBOIEEgTCBPIEcgICBWIEkgRCBFIE8gICBTIFQgQSBOIEQgQSBSIEQKKyAqLworCit0eXBlZGVmIF9fdTY0IHY0bDJfc3RkX2lkOworCisvKiBvbmUgYml0IGZvciBlYWNoICovCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwMSkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0IxICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDAyKQorI2RlZmluZSBWNEwyX1NURF9QQUxfRyAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDQpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9IICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwOCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0kgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDEwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfRCAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMjApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9EMSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDA0MCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0sgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDgwKQorCisjZGVmaW5lIFY0TDJfU1REX1BBTF9NICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDEwMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX04gICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMjAwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfTmMgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA0MDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF82MCAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDgwMCkKKworI2RlZmluZSBWNEwyX1NURF9OVFNDX00gICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDEwMDApCisjZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ180NDMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA0MDAwKQorI2RlZmluZSBWNEwyX1NURF9OVFNDX01fS1IgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDgwMDApCisKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fQiAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDEwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9EICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMjAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0cgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDgwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAxMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0sxICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDIwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwNDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9MQyAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDA4MDAwMDApCisKKy8qIEFUU0MvSERUViAqLworI2RlZmluZSBWNEwyX1NURF9BVFNDXzhfVlNCICAgICAoKHY0bDJfc3RkX2lkKTB4MDEwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX0FUU0NfMTZfVlNCICAgICgodjRsMl9zdGRfaWQpMHgwMjAwMDAwMCkKKworLyogRklYTUU6CisgICBBbHRob3VnaCBzdGRfaWQgaXMgNjQgYml0cywgdGhlcmUgaXMgYW4gaXNzdWUgb24gUFBDMzIgYXJjaGl0ZWN0dXJlIHRoYXQKKyAgIG1ha2VzIHN3aXRjaChfX3U2NCkgdG8gYnJlYWsuIFNvLCB0aGVyZSdzIGEgaGFjayBvbiB2NGwyLWNvbW1vbi5jIHJvdW5kaW5nCisgICB0aGlzIHZhbHVlIHRvIDMyIGJpdHMuCisgICBBcywgY3VycmVudGx5LCB0aGUgbWF4IHZhbHVlIGlzIGZvciBWNEwyX1NURF9BVFNDXzE2X1ZTQiAoMzAgYml0cyB3aWRlKSwKKyAgIGl0IHNob3VsZCB3b3JrIGZpbmUuIEhvd2V2ZXIsIGlmIG5lZWRlZCB0byBhZGQgbW9yZSB0aGFuIHR3byBzdGFuZGFyZHMsCisgICB2NGwyLWNvbW1vbi5jIHNob3VsZCBiZSBmaXhlZC4KKyAqLworCisvKiBzb21lIG1lcmdlZCBzdGFuZGFyZHMgKi8KKyNkZWZpbmUgVjRMMl9TVERfTU4JKFY0TDJfU1REX1BBTF9NfFY0TDJfU1REX1BBTF9OfFY0TDJfU1REX1BBTF9OY3xWNEwyX1NURF9OVFNDKQorI2RlZmluZSBWNEwyX1NURF9CCShWNEwyX1NURF9QQUxfQnxWNEwyX1NURF9QQUxfQjF8VjRMMl9TVERfU0VDQU1fQikKKyNkZWZpbmUgVjRMMl9TVERfR0gJKFY0TDJfU1REX1BBTF9HfFY0TDJfU1REX1BBTF9IfFY0TDJfU1REX1NFQ0FNX0d8VjRMMl9TVERfU0VDQU1fSCkKKyNkZWZpbmUgVjRMMl9TVERfREsJKFY0TDJfU1REX1BBTF9ES3xWNEwyX1NURF9TRUNBTV9ESykKKworLyogc29tZSBjb21tb24gbmVlZGVkIHN0dWZmICovCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CRwkJKFY0TDJfU1REX1BBTF9CCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfQjEJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0cpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9ESwkJKFY0TDJfU1REX1BBTF9ECQl8XAorCQkJCSBWNEwyX1NURF9QQUxfRDEJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0spCisjZGVmaW5lIFY0TDJfU1REX1BBTAkJKFY0TDJfU1REX1BBTF9CRwl8XAorCQkJCSBWNEwyX1NURF9QQUxfREsJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0gJCXxcCisJCQkJIFY0TDJfU1REX1BBTF9JKQorI2RlZmluZSBWNEwyX1NURF9OVFNDICAgICAgICAgICAoVjRMMl9TVERfTlRTQ19NCXxcCisJCQkJIFY0TDJfU1REX05UU0NfTV9KUCAgICAgfFwKKwkJCQkgVjRMMl9TVERfTlRTQ19NX0tSKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9ESyAgICAgIAkoVjRMMl9TVERfU0VDQU1fRAl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9LCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0sxKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTQkJKFY0TDJfU1REX1NFQ0FNX0IJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fRwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9ICXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0RLCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fTEMpCisKKyNkZWZpbmUgVjRMMl9TVERfNTI1XzYwCQkoVjRMMl9TVERfUEFMX00JCXxcCisJCQkJIFY0TDJfU1REX1BBTF82MAl8XAorCQkJCSBWNEwyX1NURF9OVFNDCQl8XAorCQkJCSBWNEwyX1NURF9OVFNDXzQ0MykKKyNkZWZpbmUgVjRMMl9TVERfNjI1XzUwCQkoVjRMMl9TVERfUEFMCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfTgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX05jCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNKQorI2RlZmluZSBWNEwyX1NURF9BVFNDICAgICAgICAgICAoVjRMMl9TVERfQVRTQ184X1ZTQiAgICB8XAorCQkJCSBWNEwyX1NURF9BVFNDXzE2X1ZTQikKKworI2RlZmluZSBWNEwyX1NURF9VTktOT1dOICAgICAgICAwCisjZGVmaW5lIFY0TDJfU1REX0FMTCAgICAgICAgICAgIChWNEwyX1NURF81MjVfNjAJfFwKKwkJCQkgVjRMMl9TVERfNjI1XzUwKQorCitzdHJ1Y3QgdjRsMl9zdGFuZGFyZAoreworCV9fdTMyCQkgICAgIGluZGV4OworCXY0bDJfc3RkX2lkICAgICAgICAgIGlkOworCV9fdTgJCSAgICAgbmFtZVsyNF07CisJc3RydWN0IHY0bDJfZnJhY3QgICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLworCV9fdTMyCQkgICAgIGZyYW1lbGluZXM7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbNF07Cit9OworCisvKgorICoJViBJIEQgRSBPICAgSSBOIFAgVSBUIFMKKyAqLworc3RydWN0IHY0bDJfaW5wdXQKK3sKKwlfX3UzMgkgICAgIGluZGV4OwkJLyogIFdoaWNoIGlucHV0ICovCisJX191OAkgICAgIG5hbWVbMzJdOwkJLyogIExhYmVsICovCisJX191MzIJICAgICB0eXBlOwkJLyogIFR5cGUgb2YgaW5wdXQgKi8KKwlfX3UzMgkgICAgIGF1ZGlvc2V0OwkJLyogIEFzc29jaWF0ZWQgYXVkaW9zIChiaXRmaWVsZCkgKi8KKwlfX3UzMiAgICAgICAgdHVuZXI7ICAgICAgICAgICAgIC8qICBBc3NvY2lhdGVkIHR1bmVyICovCisJdjRsMl9zdGRfaWQgIHN0ZDsKKwlfX3UzMgkgICAgIHN0YXR1czsKKwlfX3UzMgkgICAgIHJlc2VydmVkWzRdOworfTsKKworLyogIFZhbHVlcyBmb3IgdGhlICd0eXBlJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfVFVORVIJCTEKKyNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX0NBTUVSQQkJMgorCisvKiBmaWVsZCAnc3RhdHVzJyAtIGdlbmVyYWwgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19QT1dFUiAgICAweDAwMDAwMDAxICAvKiBBdHRhY2hlZCBkZXZpY2UgaXMgb2ZmICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU0lHTkFMICAgMHgwMDAwMDAwMgorI2RlZmluZSBWNEwyX0lOX1NUX05PX0NPTE9SICAgIDB4MDAwMDAwMDQKKworLyogZmllbGQgJ3N0YXR1cycgLSBhbmFsb2cgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19IX0xPQ0sgICAweDAwMDAwMTAwICAvKiBObyBob3Jpem9udGFsIHN5bmMgbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX0NPTE9SX0tJTEwgIDB4MDAwMDAyMDAgIC8qIENvbG9yIGtpbGxlciBpcyBhY3RpdmUgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBkaWdpdGFsICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fU1lOQyAgICAgMHgwMDAxMDAwMCAgLyogTm8gc3luY2hyb25pemF0aW9uIGxvY2sgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19FUVUgICAgICAweDAwMDIwMDAwICAvKiBObyBlcXVhbGl6ZXIgbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0NBUlJJRVIgIDB4MDAwNDAwMDAgIC8qIENhcnJpZXIgcmVjb3ZlcnkgZmFpbGVkICovCisKKy8qIGZpZWxkICdzdGF0dXMnIC0gVkNSIGFuZCBzZXQtdG9wIGJveCAqLworI2RlZmluZSBWNEwyX0lOX1NUX01BQ1JPVklTSU9OIDB4MDEwMDAwMDAgIC8qIE1hY3JvdmlzaW9uIGRldGVjdGVkICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQUNDRVNTICAgMHgwMjAwMDAwMCAgLyogQ29uZGl0aW9uYWwgYWNjZXNzIGRlbmllZCAqLworI2RlZmluZSBWNEwyX0lOX1NUX1ZUUiAgICAgICAgIDB4MDQwMDAwMDAgIC8qIFZUUiB0aW1lIGNvbnN0YW50ICovCisKKy8qCisgKglWIEkgRCBFIE8gICBPIFUgVCBQIFUgVCBTCisgKi8KK3N0cnVjdCB2NGwyX291dHB1dAoreworCV9fdTMyCSAgICAgaW5kZXg7CQkvKiAgV2hpY2ggb3V0cHV0ICovCisJX191OAkgICAgIG5hbWVbMzJdOwkJLyogIExhYmVsICovCisJX191MzIJICAgICB0eXBlOwkJLyogIFR5cGUgb2Ygb3V0cHV0ICovCisJX191MzIJICAgICBhdWRpb3NldDsJCS8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCisJX191MzIJICAgICBtb2R1bGF0b3I7ICAgICAgICAgLyogIEFzc29jaWF0ZWQgbW9kdWxhdG9yICovCisJdjRsMl9zdGRfaWQgIHN0ZDsKKwlfX3UzMgkgICAgIHJlc2VydmVkWzRdOworfTsKKy8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9NT0RVTEFUT1IJCTEKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0cJCQkyCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HVkdBT1ZFUkxBWQkzCisKKy8qCisgKglDIE8gTiBUIFIgTyBMIFMKKyAqLworc3RydWN0IHY0bDJfY29udHJvbAoreworCV9fdTMyCQkgICAgIGlkOworCV9fczMyCQkgICAgIHZhbHVlOworfTsKKworc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wKK3sKKwlfX3UzMiBpZDsKKwlfX3UzMiByZXNlcnZlZDJbMl07CisJdW5pb24geworCQlfX3MzMiB2YWx1ZTsKKwkJX19zNjQgdmFsdWU2NDsKKwkJdm9pZCAqcmVzZXJ2ZWQ7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMKK3sKKwlfX3UzMiBjdHJsX2NsYXNzOworCV9fdTMyIGNvdW50OworCV9fdTMyIGVycm9yX2lkeDsKKwlfX3UzMiByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY29udHJvbHM7Cit9OworCisvKiAgVmFsdWVzIGZvciBjdHJsX2NsYXNzIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19VU0VSIDB4MDA5ODAwMDAJLyogT2xkLXN0eWxlICd1c2VyJyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfTVBFRyAweDAwOTkwMDAwCS8qIE1QRUctY29tcHJlc3Npb24gY29udHJvbHMgKi8KKworI2RlZmluZSBWNEwyX0NUUkxfSURfTUFTSyAgICAgIAkgICgweDBmZmZmZmZmKQorI2RlZmluZSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpICAgICgoaWQpICYgMHgwZmZmMDAwMFVMKQorI2RlZmluZSBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoaWQpICgoKGlkKSAmIDB4ZmZmZikgPj0gMHgxMDAwKQorCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgY29udHJvbHMgKi8KK3N0cnVjdCB2NGwyX3F1ZXJ5Y3RybAoreworCV9fdTMyCQkgICAgIGlkOworCWVudW0gdjRsMl9jdHJsX3R5cGUgIHR5cGU7CisJX191OAkJICAgICBuYW1lWzMyXTsJLyogV2hhdGV2ZXIgKi8KKwlfX3MzMgkJICAgICBtaW5pbXVtOwkvKiBOb3RlIHNpZ25lZG5lc3MgKi8KKwlfX3MzMgkJICAgICBtYXhpbXVtOworCV9fczMyCQkgICAgIHN0ZXA7CisJX19zMzIJCSAgICAgZGVmYXVsdF92YWx1ZTsKKwlfX3UzMiAgICAgICAgICAgICAgICBmbGFnczsKKwlfX3UzMgkJICAgICByZXNlcnZlZFsyXTsKK307CisKKy8qICBVc2VkIGluIHRoZSBWSURJT0NfUVVFUllNRU5VIGlvY3RsIGZvciBxdWVyeWluZyBtZW51IGl0ZW1zICovCitzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUKK3sKKwlfX3UzMgkJaWQ7CisJX191MzIJCWluZGV4OworCV9fdTgJCW5hbWVbMzJdOwkvKiBXaGF0ZXZlciAqLworCV9fdTMyCQlyZXNlcnZlZDsKK307CisKKy8qICBDb250cm9sIGZsYWdzICAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRAkJMHgwMDAxCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQJCTB4MDAwMgorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkgCTB4MDAwNAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKKworLyogIFF1ZXJ5IGZsYWcsIHRvIGJlIE9SZWQgd2l0aCB0aGUgY29udHJvbCBJRCAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwJMHg4MDAwMDAwMAorCisvKiAgVXNlci1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfQkFTRQkJCShWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9VU0VSX0JBU0UgCQlWNEwyX0NJRF9CQVNFCisvKiAgSURzIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9CQVNFCQkweDA4MDAwMDAwCisKKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9DTEFTUyAJCShWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDEpCisjZGVmaW5lIFY0TDJfQ0lEX0JSSUdIVE5FU1MJCShWNEwyX0NJRF9CQVNFKzApCisjZGVmaW5lIFY0TDJfQ0lEX0NPTlRSQVNUCQkoVjRMMl9DSURfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9TQVRVUkFUSU9OCQkoVjRMMl9DSURfQkFTRSsyKQorI2RlZmluZSBWNEwyX0NJRF9IVUUJCQkoVjRMMl9DSURfQkFTRSszKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19WT0xVTUUJCShWNEwyX0NJRF9CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0JBU1MJCShWNEwyX0NJRF9CQVNFKzcpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX1RSRUJMRQkJKFY0TDJfQ0lEX0JBU0UrOCkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fTVVURQkJKFY0TDJfQ0lEX0JBU0UrOSkKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fTE9VRE5FU1MJCShWNEwyX0NJRF9CQVNFKzEwKQorI2RlZmluZSBWNEwyX0NJRF9CTEFDS19MRVZFTAkJKFY0TDJfQ0lEX0JBU0UrMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMikKKyNkZWZpbmUgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfUkVEX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE0KQorI2RlZmluZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE1KQorI2RlZmluZSBWNEwyX0NJRF9HQU1NQQkJCShWNEwyX0NJRF9CQVNFKzE2KQorI2RlZmluZSBWNEwyX0NJRF9XSElURU5FU1MJCShWNEwyX0NJRF9HQU1NQSkgLyogPyBOb3Qgc3VyZSAqLworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRQkJKFY0TDJfQ0lEX0JBU0UrMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9HQUlOCQkoVjRMMl9DSURfQkFTRSsxOCkKKyNkZWZpbmUgVjRMMl9DSURfR0FJTgkJCShWNEwyX0NJRF9CQVNFKzE5KQorI2RlZmluZSBWNEwyX0NJRF9IRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIwKQorI2RlZmluZSBWNEwyX0NJRF9WRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIxKQorI2RlZmluZSBWNEwyX0NJRF9IQ0VOVEVSCQkoVjRMMl9DSURfQkFTRSsyMikKKyNkZWZpbmUgVjRMMl9DSURfVkNFTlRFUgkJKFY0TDJfQ0lEX0JBU0UrMjMpCisjZGVmaW5lIFY0TDJfQ0lEX0xBU1RQMQkJCShWNEwyX0NJRF9CQVNFKzI0KSAvKiBsYXN0IENJRCArIDEgKi8KKworLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQkFTRSAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DTEFTUyAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAxKQorCisvKiAgTVBFRyBzdHJlYW1zICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzApCitlbnVtIHY0bDJfbXBlZ19zdHJlYW1fdHlwZSB7CisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTICAgPSAwLCAvKiBNUEVHLTIgcHJvZ3JhbSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfVFMgICA9IDEsIC8qIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1NTICAgPSAyLCAvKiBNUEVHLTEgc3lzdGVtIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQgID0gMywgLyogTVBFRy0yIERWRC1jb21wYXRpYmxlIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9WQ0QgID0gNCwgLyogTVBFRy0xIFZDRC1jb21wYXRpYmxlIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNEID0gNSwgLyogTVBFRy0yIFNWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU8gCShWNEwyX0NJRF9NUEVHX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPIAkoVjRMMl9DSURfTVBFR19CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQgCQkoVjRMMl9DSURfTVBFR19CQVNFKzcpCitlbnVtIHY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdCB7CisJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX05PTkUgPSAwLCAgLyogTm8gVkJJIGluIHRoZSBNUEVHIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWID0gMSwgIC8qIFZCSSBpbiBwcml2YXRlIHBhY2tldHMsIElWVFYgZm9ybWF0ICovCit9OworCisvKiAgTVBFRyBhdWRpbyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEgCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAwKQorZW51bSB2NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcSB7CisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAgPSAwLAorCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwID0gMSwKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV8zMjAwMCA9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDEpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19lbmNvZGluZyB7CisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzEgPSAwLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yID0gMSwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMyA9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wxX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzY0SyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzk2SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzEyOEsgPSAzLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE2MEsgPSA0LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE5MksgPSA1LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzIyNEsgPSA2LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NksgPSA3LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI4OEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMyMEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM1MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zODRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDE2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQ0OEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAzKQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNDhLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNTZLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNjRLICA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfODBLICA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfOTZLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTEySyA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTI4SyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTYwSyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTkySyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0SyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzI1NksgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMjBLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDQpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80MEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80OEsgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV81NksgID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV82NEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV84MEsgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV85NksgID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMTJLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMjhLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xNjBLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xOTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMjI0SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzI1NksgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMjBLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGUgeworCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyAgICAgICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX01PREVfSk9JTlRfU1RFUkVPID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9EVUFMICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19BVURJT19NT0RFX01PTk8gICAgICAgICA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwNikKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uIHsKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCAgPSAwLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF84ICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzEyID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTYgPSAzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA3KQorZW51bSB2NGwyX21wZWdfYXVkaW9fZW1waGFzaXMgeworCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FICAgICAgICAgPSAwLAorCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU181MF9ESVZfMTVfdVMgPSAxLAorCVY0TDJfTVBFR19BVURJT19FTVBIQVNJU19DQ0lUVF9KMTcgICAgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19DUkMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwOCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2NyYyB7CisJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0NSQ19DUkMxNiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwOSkKKworLyogIE1QRUcgdmlkZW8gKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQorZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgPSAwLAorCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB7CisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MyAgICAgPSAxLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OSAgICA9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSID0gMCwKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDI1ODR4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSswKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgICAgICAgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiAgICAgICAgICAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfVkVSVCAgICAgICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9IVl9TRVBBUkFCTEUgICAgICA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX1NZTV9OT05fU0VQQVJBQkxFID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs0KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzYpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRiAgICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SICAgICAgPSAxLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9WRVJUICAgICA9IDIsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUl9WRVJUID0gMywKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfRElBRyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00gCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00JKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMSkKKworLyoKKyAqCVQgVSBOIEkgTiBHCisgKi8KK3N0cnVjdCB2NGwyX3R1bmVyCit7CisJX191MzIgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJX191OAkJCW5hbWVbMzJdOworCWVudW0gdjRsMl90dW5lcl90eXBlICAgIHR5cGU7CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJcmFuZ2Vsb3c7CisJX191MzIJCQlyYW5nZWhpZ2g7CisJX191MzIJCQlyeHN1YmNoYW5zOworCV9fdTMyCQkJYXVkbW9kZTsKKwlfX3MzMgkJCXNpZ25hbDsKKwlfX3MzMgkJCWFmYzsKKwlfX3UzMgkJCXJlc2VydmVkWzRdOworfTsKKworc3RydWN0IHY0bDJfbW9kdWxhdG9yCit7CisJX191MzIJCQlpbmRleDsKKwlfX3U4CQkJbmFtZVszMl07CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJcmFuZ2Vsb3c7CisJX191MzIJCQlyYW5nZWhpZ2g7CisJX191MzIJCQl0eHN1YmNoYW5zOworCV9fdTMyCQkJcmVzZXJ2ZWRbNF07Cit9OworCisvKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTE9XCQkweDAwMDEKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTk9STQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1NURVJFTwkJMHgwMDEwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xBTkcyCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfU0FQCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTEFORzEJCTB4MDA0MAorCisvKiAgRmxhZ3MgZm9yIHRoZSAncnhzdWJjaGFucycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTU9OTwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX1NURVJFTwkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX0xBTkcyCQkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU0FQCQkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzEJCTB4MDAwOAorCisvKiAgVmFsdWVzIGZvciB0aGUgJ2F1ZG1vZGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9NT05PCQkweDAwMDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX1NURVJFTwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMgkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9TQVAJCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzEJCTB4MDAwMworI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzIJMHgwMDA0CisKK3N0cnVjdCB2NGwyX2ZyZXF1ZW5jeQoreworCV9fdTMyCQkgICAgICB0dW5lcjsKKwllbnVtIHY0bDJfdHVuZXJfdHlwZSAgdHlwZTsKKwlfX3UzMgkJICAgICAgZnJlcXVlbmN5OworCV9fdTMyCQkgICAgICByZXNlcnZlZFs4XTsKK307CisKKy8qCisgKglBIFUgRCBJIE8KKyAqLworc3RydWN0IHY0bDJfYXVkaW8KK3sKKwlfX3UzMglpbmRleDsKKwlfX3U4CW5hbWVbMzJdOworCV9fdTMyCWNhcGFiaWxpdHk7CisJX191MzIJbW9kZTsKKwlfX3UzMglyZXNlcnZlZFsyXTsKK307CisKKy8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0FVRENBUF9TVEVSRU8JCTB4MDAwMDEKKyNkZWZpbmUgVjRMMl9BVURDQVBfQVZMCQkJMHgwMDAwMgorCisvKiAgRmxhZ3MgZm9yIHRoZSAnbW9kZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9BVURNT0RFX0FWTAkJMHgwMDAwMQorCitzdHJ1Y3QgdjRsMl9hdWRpb291dAoreworCV9fdTMyCWluZGV4OworCV9fdTgJbmFtZVszMl07CisJX191MzIJY2FwYWJpbGl0eTsKKwlfX3UzMgltb2RlOworCV9fdTMyCXJlc2VydmVkWzJdOworfTsKKworLyoKKyAqCU0gUCBFIEcgICBTIEUgUiBWIEkgQyBFIFMKKyAqCisgKglOT1RFOiBFWFBFUklNRU5UQUwgQVBJCisgKi8KKyNpZiAxCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9JICAgICgwKQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfUCAgICAoMSkKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX0IgICAgKDIpCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9NQVNLICgweGYpCisKK3N0cnVjdCB2NGwyX2VuY19pZHhfZW50cnkgeworCV9fdTY0IG9mZnNldDsKKwlfX3U2NCBwdHM7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzJdOworfTsKKworI2RlZmluZSBWNEwyX0VOQ19JRFhfRU5UUklFUyAoNjQpCitzdHJ1Y3QgdjRsMl9lbmNfaWR4IHsKKwlfX3UzMiBlbnRyaWVzOworCV9fdTMyIGVudHJpZXNfY2FwOworCV9fdTMyIHJlc2VydmVkWzRdOworCXN0cnVjdCB2NGwyX2VuY19pZHhfZW50cnkgZW50cnlbVjRMMl9FTkNfSURYX0VOVFJJRVNdOworfTsKKworCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9TVEFSVCAgICAgICgwKQorI2RlZmluZSBWNEwyX0VOQ19DTURfU1RPUCAgICAgICAoMSkKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1BBVVNFICAgICAgKDIpCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9SRVNVTUUgICAgICgzKQorCisvKiBGbGFncyBmb3IgVjRMMl9FTkNfQ01EX1NUT1AgKi8KKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUT1BfQVRfR09QX0VORCAgICAoMSA8PCAwKQorCitzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCB7CisJX191MzIgY21kOworCV9fdTMyIGZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGRhdGFbOF07CisJCX0gcmF3OworCX07Cit9OworCisjZW5kaWYKKworCisvKgorICoJRCBBIFQgQSAgIFMgRSBSIFYgSSBDIEUgUyAgICggViBCIEkgKQorICoKKyAqCURhdGEgc2VydmljZXMgQVBJIGJ5IE1pY2hhZWwgU2NoaW1laworICovCisKKy8qIFJhdyBWQkkgKi8KK3N0cnVjdCB2NGwyX3ZiaV9mb3JtYXQKK3sKKwlfX3UzMglzYW1wbGluZ19yYXRlOwkJLyogaW4gMSBIeiAqLworCV9fdTMyCW9mZnNldDsKKwlfX3UzMglzYW1wbGVzX3Blcl9saW5lOworCV9fdTMyCXNhbXBsZV9mb3JtYXQ7CQkvKiBWNEwyX1BJWF9GTVRfKiAqLworCV9fczMyCXN0YXJ0WzJdOworCV9fdTMyCWNvdW50WzJdOworCV9fdTMyCWZsYWdzOwkJCS8qIFY0TDJfVkJJXyogKi8KKwlfX3UzMglyZXNlcnZlZFsyXTsJCS8qIG11c3QgYmUgemVybyAqLworfTsKKworLyogIFZCSSBmbGFncyAgKi8KKyNkZWZpbmUgVjRMMl9WQklfVU5TWU5DCQkoMTw8IDApCisjZGVmaW5lIFY0TDJfVkJJX0lOVEVSTEFDRUQJKDE8PCAxKQorCisvKiBTbGljZWQgVkJJCisgKgorICogICAgVGhpcyBpbXBsZW1lbnRzIGlzIGEgcHJvcG9zYWwgVjRMMiBBUEkgdG8gYWxsb3cgU0xJQ0VEIFZCSQorICogcmVxdWlyZWQgZm9yIHNvbWUgaGFyZHdhcmUgZW5jb2RlcnMuIEl0IHNob3VsZCBjaGFuZ2Ugd2l0aG91dAorICogbm90aWNlIGluIHRoZSBkZWZpbml0aXZlIGltcGxlbWVudGF0aW9uLgorICovCisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0Cit7CisJX191MTYgICBzZXJ2aWNlX3NldDsKKwkvKiBzZXJ2aWNlX2xpbmVzWzBdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIGZpcnN0IGZpZWxkCisJICAgc2VydmljZV9saW5lc1sxXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBzZWNvbmQgZmllbGQKKwkJCQkgKGVxdWFscyBmcmFtZSBsaW5lcyAzMTMtMzM2IGZvciA2MjUgbGluZSB2aWRlbworCQkJCSAgc3RhbmRhcmRzLCAyNjMtMjg2IGZvciA1MjUgbGluZSBzdGFuZGFyZHMpICovCisJX191MTYgICBzZXJ2aWNlX2xpbmVzWzJdWzI0XTsKKwlfX3UzMiAgIGlvX3NpemU7CisJX191MzIgICByZXNlcnZlZFsyXTsgICAgICAgICAgICAvKiBtdXN0IGJlIHplcm8gKi8KK307CisKKy8qIFRlbGV0ZXh0IFdvcmxkIFN5c3RlbSBUZWxldGV4dAorICAgKFdTVCksIGRlZmluZWQgb24gSVRVLVIgQlQuNjUzLTIgKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfVEVMRVRFWFRfQiAgICAgICAgICAoMHgwMDAxKQorLyogVmlkZW8gUHJvZ3JhbSBTeXN0ZW0sIGRlZmluZWQgb24gRVRTIDMwMCAyMzEqLworI2RlZmluZSBWNEwyX1NMSUNFRF9WUFMgICAgICAgICAgICAgICAgICgweDA0MDApCisvKiBDbG9zZWQgQ2FwdGlvbiwgZGVmaW5lZCBvbiBFSUEtNjA4ICovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1ICAgICAgICAgKDB4MTAwMCkKKy8qIFdpZGUgU2NyZWVuIFN5c3RlbSwgZGVmaW5lZCBvbiBJVFUtUiBCVDExMTkuMSAqLworI2RlZmluZSBWNEwyX1NMSUNFRF9XU1NfNjI1ICAgICAgICAgICAgICgweDQwMDApCisKKyNkZWZpbmUgVjRMMl9TTElDRURfVkJJXzUyNSAgICAgICAgICAgICAoVjRMMl9TTElDRURfQ0FQVElPTl81MjUpCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1ZCSV82MjUgICAgICAgICAgICAgKFY0TDJfU0xJQ0VEX1RFTEVURVhUX0IgfCBWNEwyX1NMSUNFRF9WUFMgfCBWNEwyX1NMSUNFRF9XU1NfNjI1KQorCitzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcAoreworCV9fdTE2ICAgc2VydmljZV9zZXQ7CisJLyogc2VydmljZV9saW5lc1swXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBmaXJzdCBmaWVsZAorCSAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCisJCQkJIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KKwkJCQkgIHN0YW5kYXJkcywgMjYzLTI4NiBmb3IgNTI1IGxpbmUgc3RhbmRhcmRzKSAqLworCV9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJX191MzIgICByZXNlcnZlZFszXTsgICAgLyogbXVzdCBiZSAwICovCit9OworCitzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2RhdGEKK3sKKwlfX3UzMiAgIGlkOworCV9fdTMyICAgZmllbGQ7ICAgICAgICAgIC8qIDA6IGZpcnN0IGZpZWxkLCAxOiBzZWNvbmQgZmllbGQgKi8KKwlfX3UzMiAgIGxpbmU7ICAgICAgICAgICAvKiAxLTIzICovCisJX191MzIgICByZXNlcnZlZDsgICAgICAgLyogbXVzdCBiZSAwICovCisJX191OCAgICBkYXRhWzQ4XTsKK307CisKKy8qCisgKglBIEcgRyBSIEUgRyBBIFQgRSAgIFMgVCBSIFUgQyBUIFUgUiBFIFMKKyAqLworCisvKglTdHJlYW0gZGF0YSBmb3JtYXQKKyAqLworc3RydWN0IHY0bDJfZm9ybWF0Cit7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJdW5pb24KKwl7CisJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQJCXBpeDsgICAgIC8vIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRQorCQlzdHJ1Y3QgdjRsMl93aW5kb3cJCXdpbjsgICAgIC8vIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWQorCQlzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0CQl2Ymk7ICAgICAvLyBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFCisJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0CXNsaWNlZDsgIC8vIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFCisJCV9fdTgJcmF3X2RhdGFbMjAwXTsgICAgICAgICAgICAgICAgICAgLy8gdXNlci1kZWZpbmVkCisJfSBmbXQ7Cit9OworCisKKy8qCVN0cmVhbSB0eXBlLWRlcGVuZGVudCBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCB2NGwyX3N0cmVhbXBhcm0KK3sKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwl1bmlvbgorCXsKKwkJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0JY2FwdHVyZTsKKwkJc3RydWN0IHY0bDJfb3V0cHV0cGFybQlvdXRwdXQ7CisJCV9fdTgJcmF3X2RhdGFbMjAwXTsgIC8qIHVzZXItZGVmaW5lZCAqLworCX0gcGFybTsKK307CisKKy8qCisgKglBIEQgViBBIE4gQyBFIEQgICBEIEUgQiBVIEcgRyBJIE4gRworICoKKyAqCU5PVEU6IEVYUEVSSU1FTlRBTCBBUEkKKyAqLworCisvKiBWSURJT0NfREJHX0dfUkVHSVNURVIgYW5kIFZJRElPQ19EQkdfU19SRUdJU1RFUiAqLworCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9IT1NUICAgICAgIDAgIC8qIE1hdGNoIGFnYWluc3QgY2hpcCBJRCBvbiBob3N0ICgwIGZvciB0aGUgaG9zdCkgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIgMSAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgZHJpdmVyIElEICovCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiAgIDIgIC8qIE1hdGNoIGFnYWluc3QgSTJDIDctYml0IGFkZHJlc3MgKi8KKworc3RydWN0IHY0bDJfcmVnaXN0ZXIgeworCV9fdTMyIG1hdGNoX3R5cGU7IC8qIE1hdGNoIHR5cGUgKi8KKwlfX3UzMiBtYXRjaF9jaGlwOyAvKiBNYXRjaCB0aGlzIGNoaXAsIG1lYW5pbmcgZGV0ZXJtaW5lZCBieSBtYXRjaF90eXBlICovCisJX191NjQgcmVnOworCV9fdTY0IHZhbDsKK307CisKKy8qIFZJRElPQ19HX0NISVBfSURFTlQgKi8KK3N0cnVjdCB2NGwyX2NoaXBfaWRlbnQgeworCV9fdTMyIG1hdGNoX3R5cGU7ICAvKiBNYXRjaCB0eXBlICovCisJX191MzIgbWF0Y2hfY2hpcDsgIC8qIE1hdGNoIHRoaXMgY2hpcCwgbWVhbmluZyBkZXRlcm1pbmVkIGJ5IG1hdGNoX3R5cGUgKi8KKwlfX3UzMiBpZGVudDsgICAgICAgLyogY2hpcCBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+ICovCisJX191MzIgcmV2aXNpb247ICAgIC8qIGNoaXAgcmV2aXNpb24sIGNoaXAgc3BlY2lmaWMgKi8KK307CisKKy8qCisgKglJIE8gQyBUIEwgICBDIE8gRCBFIFMgICBGIE8gUiAgIFYgSSBEIEUgTyAgIEQgRSBWIEkgQyBFIFMKKyAqCisgKi8KKyNkZWZpbmUgVklESU9DX1FVRVJZQ0FQCQlfSU9SICAoJ1YnLCAgMCwgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSkKKyNkZWZpbmUgVklESU9DX1JFU0VSVkVECQlfSU8gICAoJ1YnLCAgMSkKKyNkZWZpbmUgVklESU9DX0VOVU1fRk1UICAgICAgICAgX0lPV1IgKCdWJywgIDIsIHN0cnVjdCB2NGwyX2ZtdGRlc2MpCisjZGVmaW5lIFZJRElPQ19HX0ZNVAkJX0lPV1IgKCdWJywgIDQsIHN0cnVjdCB2NGwyX2Zvcm1hdCkKKyNkZWZpbmUgVklESU9DX1NfRk1UCQlfSU9XUiAoJ1YnLCAgNSwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfUkVRQlVGUwkJX0lPV1IgKCdWJywgIDgsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKQorI2RlZmluZSBWSURJT0NfUVVFUllCVUYJCV9JT1dSICgnVicsICA5LCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19HX0ZCVUYJCV9JT1IgICgnVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcikKKyNkZWZpbmUgVklESU9DX1NfRkJVRgkJX0lPVyAgKCdWJywgMTEsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyKQorI2RlZmluZSBWSURJT0NfT1ZFUkxBWQkJX0lPVyAgKCdWJywgMTQsIGludCkKKyNkZWZpbmUgVklESU9DX1FCVUYJCV9JT1dSICgnVicsIDE1LCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19EUUJVRgkJX0lPV1IgKCdWJywgMTcsIHN0cnVjdCB2NGwyX2J1ZmZlcikKKyNkZWZpbmUgVklESU9DX1NUUkVBTU9OCQlfSU9XICAoJ1YnLCAxOCwgaW50KQorI2RlZmluZSBWSURJT0NfU1RSRUFNT0ZGCV9JT1cgICgnVicsIDE5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX1BBUk0JCV9JT1dSICgnVicsIDIxLCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKQorI2RlZmluZSBWSURJT0NfU19QQVJNCQlfSU9XUiAoJ1YnLCAyMiwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSkKKyNkZWZpbmUgVklESU9DX0dfU1RECQlfSU9SICAoJ1YnLCAyMywgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19TX1NURAkJX0lPVyAgKCdWJywgMjQsIHY0bDJfc3RkX2lkKQorI2RlZmluZSBWSURJT0NfRU5VTVNURAkJX0lPV1IgKCdWJywgMjUsIHN0cnVjdCB2NGwyX3N0YW5kYXJkKQorI2RlZmluZSBWSURJT0NfRU5VTUlOUFVUCV9JT1dSICgnVicsIDI2LCBzdHJ1Y3QgdjRsMl9pbnB1dCkKKyNkZWZpbmUgVklESU9DX0dfQ1RSTAkJX0lPV1IgKCdWJywgMjcsIHN0cnVjdCB2NGwyX2NvbnRyb2wpCisjZGVmaW5lIFZJRElPQ19TX0NUUkwJCV9JT1dSICgnVicsIDI4LCBzdHJ1Y3QgdjRsMl9jb250cm9sKQorI2RlZmluZSBWSURJT0NfR19UVU5FUgkJX0lPV1IgKCdWJywgMjksIHN0cnVjdCB2NGwyX3R1bmVyKQorI2RlZmluZSBWSURJT0NfU19UVU5FUgkJX0lPVyAgKCdWJywgMzAsIHN0cnVjdCB2NGwyX3R1bmVyKQorI2RlZmluZSBWSURJT0NfR19BVURJTwkJX0lPUiAgKCdWJywgMzMsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfU19BVURJTwkJX0lPVyAgKCdWJywgMzQsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfUVVFUllDVFJMCV9JT1dSICgnVicsIDM2LCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpCisjZGVmaW5lIFZJRElPQ19RVUVSWU1FTlUJX0lPV1IgKCdWJywgMzcsIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSkKKyNkZWZpbmUgVklESU9DX0dfSU5QVVQJCV9JT1IgICgnVicsIDM4LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TX0lOUFVUCQlfSU9XUiAoJ1YnLCAzOSwgaW50KQorI2RlZmluZSBWSURJT0NfR19PVVRQVVQJCV9JT1IgICgnVicsIDQ2LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TX09VVFBVVAkJX0lPV1IgKCdWJywgNDcsIGludCkKKyNkZWZpbmUgVklESU9DX0VOVU1PVVRQVVQJX0lPV1IgKCdWJywgNDgsIHN0cnVjdCB2NGwyX291dHB1dCkKKyNkZWZpbmUgVklESU9DX0dfQVVET1VUCQlfSU9SICAoJ1YnLCA0OSwgc3RydWN0IHY0bDJfYXVkaW9vdXQpCisjZGVmaW5lIFZJRElPQ19TX0FVRE9VVAkJX0lPVyAgKCdWJywgNTAsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfR19NT0RVTEFUT1IJX0lPV1IgKCdWJywgNTQsIHN0cnVjdCB2NGwyX21vZHVsYXRvcikKKyNkZWZpbmUgVklESU9DX1NfTU9EVUxBVE9SCV9JT1cgICgnVicsIDU1LCBzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IpCisjZGVmaW5lIFZJRElPQ19HX0ZSRVFVRU5DWQlfSU9XUiAoJ1YnLCA1Niwgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfU19GUkVRVUVOQ1kJX0lPVyAgKCdWJywgNTcsIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSkKKyNkZWZpbmUgVklESU9DX0NST1BDQVAJCV9JT1dSICgnVicsIDU4LCBzdHJ1Y3QgdjRsMl9jcm9wY2FwKQorI2RlZmluZSBWSURJT0NfR19DUk9QCQlfSU9XUiAoJ1YnLCA1OSwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX1NfQ1JPUAkJX0lPVyAgKCdWJywgNjAsIHN0cnVjdCB2NGwyX2Nyb3ApCisjZGVmaW5lIFZJRElPQ19HX0pQRUdDT01QCV9JT1IgICgnVicsIDYxLCBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24pCisjZGVmaW5lIFZJRElPQ19TX0pQRUdDT01QCV9JT1cgICgnVicsIDYyLCBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24pCisjZGVmaW5lIFZJRElPQ19RVUVSWVNURCAgICAgIAlfSU9SICAoJ1YnLCA2MywgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19UUllfRk1UICAgICAgCV9JT1dSICgnVicsIDY0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCisjZGVmaW5lIFZJRElPQ19FTlVNQVVESU8JX0lPV1IgKCdWJywgNjUsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfRU5VTUFVRE9VVAlfSU9XUiAoJ1YnLCA2Niwgc3RydWN0IHY0bDJfYXVkaW9vdXQpCisjZGVmaW5lIFZJRElPQ19HX1BSSU9SSVRZICAgICAgIF9JT1IgICgnVicsIDY3LCBlbnVtIHY0bDJfcHJpb3JpdHkpCisjZGVmaW5lIFZJRElPQ19TX1BSSU9SSVRZICAgICAgIF9JT1cgICgnVicsIDY4LCBlbnVtIHY0bDJfcHJpb3JpdHkpCisjZGVmaW5lIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIF9JT1dSICgnVicsIDY5LCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCkKKyNkZWZpbmUgVklESU9DX0xPR19TVEFUVVMgICAgICAgX0lPICAgKCdWJywgNzApCisjZGVmaW5lIFZJRElPQ19HX0VYVF9DVFJMUwlfSU9XUiAoJ1YnLCA3MSwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfU19FWFRfQ1RSTFMJX0lPV1IgKCdWJywgNzIsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scykKKyNkZWZpbmUgVklESU9DX1RSWV9FWFRfQ1RSTFMJX0lPV1IgKCdWJywgNzMsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scykKKyNpZiAxCisjZGVmaW5lIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMJX0lPV1IgKCdWJywgNzQsIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKQorI2RlZmluZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUwlfSU9XUiAoJ1YnLCA3NSwgc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pCisjZGVmaW5lIFZJRElPQ19HX0VOQ19JTkRFWCAgICAgIF9JT1IgICgnVicsIDc2LCBzdHJ1Y3QgdjRsMl9lbmNfaWR4KQorI2RlZmluZSBWSURJT0NfRU5DT0RFUl9DTUQgICAgICBfSU9XUiAoJ1YnLCA3Nywgc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQpCisjZGVmaW5lIFZJRElPQ19UUllfRU5DT0RFUl9DTUQgIF9JT1dSICgnVicsIDc4LCBzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCkKKworLyogRXhwZXJpbWVudGFsLCBvbmx5IGltcGxlbWVudGVkIGlmIENPTkZJR19WSURFT19BRFZfREVCVUcgaXMgZGVmaW5lZCAqLworI2RlZmluZQlWSURJT0NfREJHX1NfUkVHSVNURVIgCV9JT1cgICgnVicsIDc5LCBzdHJ1Y3QgdjRsMl9yZWdpc3RlcikKKyNkZWZpbmUJVklESU9DX0RCR19HX1JFR0lTVEVSIAlfSU9XUiAoJ1YnLCA4MCwgc3RydWN0IHY0bDJfcmVnaXN0ZXIpCisKKyNkZWZpbmUgVklESU9DX0dfQ0hJUF9JREVOVCAgICAgX0lPV1IgKCdWJywgODEsIHN0cnVjdCB2NGwyX2NoaXBfaWRlbnQpCisjZW5kaWYKKworI2lmZGVmIF9fT0xEX1ZJRElPQ18KKy8qIGZvciBjb21wYXRpYmlsaXR5LCB3aWxsIGdvIGF3YXkgc29tZSBkYXkgKi8KKyNkZWZpbmUgVklESU9DX09WRVJMQVlfT0xEICAgICAJX0lPV1IgKCdWJywgMTQsIGludCkKKyNkZWZpbmUgVklESU9DX1NfUEFSTV9PTEQgICAgICAJX0lPVyAgKCdWJywgMjIsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19TX0NUUkxfT0xEICAgICAgCV9JT1cgICgnVicsIDI4LCBzdHJ1Y3QgdjRsMl9jb250cm9sKQorI2RlZmluZSBWSURJT0NfR19BVURJT19PTEQgICAgIAlfSU9XUiAoJ1YnLCAzMywgc3RydWN0IHY0bDJfYXVkaW8pCisjZGVmaW5lIFZJRElPQ19HX0FVRE9VVF9PTEQgICAgCV9JT1dSICgnVicsIDQ5LCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKKyNkZWZpbmUgVklESU9DX0NST1BDQVBfT0xEICAgICAJX0lPUiAgKCdWJywgNTgsIHN0cnVjdCB2NGwyX2Nyb3BjYXApCisjZW5kaWYKKworI2RlZmluZSBCQVNFX1ZJRElPQ19QUklWQVRFCTE5MgkJLyogMTkyLTI1NSBhcmUgcHJpdmF0ZSAqLworCisjZW5kaWYgLyogX19MSU5VWF9WSURFT0RFVjJfSCAqLworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aWRlb3RleHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW90ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwYjQxMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlkZW90ZXh0LmgKQEAgLTAsMCArMSwxMjUgQEAKKyNpZm5kZWYgX1ZUWF9ICisjZGVmaW5lIF9WVFhfSAorCisvKgorICogVGVsZXRleHQgKD1WaWRlb3RleHQpIGhhcmR3YXJlIGRlY29kZXJzIHVzaW5nIGludGVyZmFjZSAvZGV2L3Z0eAorICogRG8gbm90IGNvbmZ1c2Ugd2l0aCBkcml2ZXJzIHVzaW5nIC9kZXYvdmJpIHdoaWNoIGRlY29kZSB2aWRlb3RleHQgYnkgc29mdHdhcmUKKyAqCisgKiBWaWRlb3RleHQgSU9DVExzIGNoYW5nZWQgaW4gb3JkZXIgdG8gdXNlIF9JTygpIG1hY3JvcyBkZWZpbmVkIGluIDxsaW51eC9pb2N0bC5oPiwKKyAqIHVudXNlZCB0dW5lciBJT0NUTHMgY2xlYW5lZCB1cCBieQorICogTWljaGFlbCBHZW5nIDxsaW51eEBNaWNoYWVsR2VuZy5kZT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtOTcgTWFydGluIEJ1Y2sgIDxtYXJ0aW4tMi5idWNrQHN0dWRlbnQudW5pLXVsbS5kZT4KKyAqIFJlYWQgQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoKKyAqLworCisKKy8qCisgKglWaWRlb3RleHQgaW9jdGxzCisgKi8KKyNkZWZpbmUgVlRYSU9DR0VUSU5GTwlfSU9SICAoMHg4MSwgIDEsIHZ0eF9pbmZvX3QpCisjZGVmaW5lIFZUWElPQ0NMUlBBR0UJX0lPVyAgKDB4ODEsICAyLCB2dHhfcGFnZXJlcV90KQorI2RlZmluZSBWVFhJT0NDTFJGT1VORAlfSU9XICAoMHg4MSwgIDMsIHZ0eF9wYWdlcmVxX3QpCisjZGVmaW5lIFZUWElPQ1BBR0VSRVEJX0lPVyAgKDB4ODEsICA0LCB2dHhfcGFnZXJlcV90KQorI2RlZmluZSBWVFhJT0NHRVRTVEFUCV9JT1cgICgweDgxLCAgNSwgdnR4X3BhZ2VyZXFfdCkKKyNkZWZpbmUgVlRYSU9DR0VUUEFHRQlfSU9XICAoMHg4MSwgIDYsIHZ0eF9wYWdlcmVxX3QpCisjZGVmaW5lIFZUWElPQ1NUT1BEQVUJX0lPVyAgKDB4ODEsICA3LCB2dHhfcGFnZXJlcV90KQorI2RlZmluZSBWVFhJT0NQVVRQQUdFCV9JTyAgICgweDgxLCAgOCkKKyNkZWZpbmUgVlRYSU9DU0VURElTUAlfSU8gICAoMHg4MSwgIDkpCisjZGVmaW5lIFZUWElPQ1BVVFNUQVQJX0lPICAgKDB4ODEsIDEwKQorI2RlZmluZSBWVFhJT0NDTFJDQUNIRQlfSU8gICAoMHg4MSwgMTEpCisjZGVmaW5lIFZUWElPQ1NFVFZJUlQJX0lPVyAgKDB4ODEsIDEyLCBsb25nKQorCisvKiBmb3IgY29tcGF0aWJpbGl0eSwgd2lsbCBnbyBhd2F5IHNvbWUgZGF5ICovCisjZGVmaW5lIFZUWElPQ0dFVElORk9fT0xEICAweDcxMDEgIC8qIGdldCB2ZXJzaW9uIG9mIGRyaXZlciAmIGNhcGFiaWxpdGllcyBvZiB2dHgtY2hpcHNldCAqLworI2RlZmluZSBWVFhJT0NDTFJQQUdFX09MRCAgMHg3MTAyICAvKiBjbGVhciBwYWdlLWJ1ZmZlciAqLworI2RlZmluZSBWVFhJT0NDTFJGT1VORF9PTEQgMHg3MTAzICAvKiBjbGVhciBiaXRzIGluZGljYXRpbmcgdGhhdCBwYWdlIHdhcyBmb3VuZCAqLworI2RlZmluZSBWVFhJT0NQQUdFUkVRX09MRCAgMHg3MTA0ICAvKiBzZWFyY2ggZm9yIHBhZ2UgKi8KKyNkZWZpbmUgVlRYSU9DR0VUU1RBVF9PTEQgIDB4NzEwNSAgLyogZ2V0IHN0YXR1cyBvZiBwYWdlLWJ1ZmZlciAqLworI2RlZmluZSBWVFhJT0NHRVRQQUdFX09MRCAgMHg3MTA2ICAvKiBnZXQgY29udGVudHMgb2YgcGFnZS1idWZmZXIgKi8KKyNkZWZpbmUgVlRYSU9DU1RPUERBVV9PTEQgIDB4NzEwNyAgLyogc3RvcCBkYXRhIGFjcXVpc2l0aW9uIHVuaXQgKi8KKyNkZWZpbmUgVlRYSU9DUFVUUEFHRV9PTEQgIDB4NzEwOCAgLyogZGlzcGxheSBwYWdlIG9uIFRWLXNjcmVlbiAqLworI2RlZmluZSBWVFhJT0NTRVRESVNQX09MRCAgMHg3MTA5ICAvKiBzZXQgVFYtbW9kZSAqLworI2RlZmluZSBWVFhJT0NQVVRTVEFUX09MRCAgMHg3MTBhICAvKiBzZXQgc3RhdHVzIG9mIFRWLW91dHB1dC1idWZmZXIgKi8KKyNkZWZpbmUgVlRYSU9DQ0xSQ0FDSEVfT0xEIDB4NzEwYiAgLyogY2xlYXIgY2FjaGUgb24gVlRYLWludGVyZmFjZSAoaWYgYXZhaWwuKSAqLworI2RlZmluZSBWVFhJT0NTRVRWSVJUX09MRCAgMHg3MTBjICAvKiB0dXJuIG9uIHZpcnR1YWwgbW9kZSAodGhpcyBkaXNhYmxlcyBUVi1kaXNwbGF5KSAqLworCisvKiAKKyAqCURlZmluaXRpb25zIGZvciBWVFhJT0NHRVRJTkZPCisgKi8KKyAKKyNkZWZpbmUgU0FBNTI0MyAwCisjZGVmaW5lIFNBQTUyNDYgMQorI2RlZmluZSBTQUE1MjQ5IDIKKyNkZWZpbmUgU0FBNTI0OCAzCisjZGVmaW5lIFhTVFY1MzQ2IDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yOwkvKiB2ZXJzaW9uIG9mIGRyaXZlcjsgaWYgdmVyc2lvbl9tYWpvciBjaGFuZ2VzLCBkcml2ZXIgKi8KKwkJCQkJCS8qIGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlISEhIENIRUNLIFRISVMhISEgKi8gIAorCWludCBudW1wYWdlczsJCQkJLyogbnVtYmVyIG9mIHBhZ2UtYnVmZmVycyBvZiB2dHgtY2hpcHNldCAqLworCWludCBjY3RfdHlwZTsJCQkJLyogdHlwZSBvZiB2dHgtY2hpcHNldCAoU0FBNTI0MywgU0FBNTI0NiwgU0FBNTI0OCBvcgorICAJCQkJCQkgKiBTQUE1MjQ5KSAqLworfQordnR4X2luZm9fdDsKKworCisvKgorICoJRGVmaW5pdGlvbnMgZm9yIFZUWElPQ3tDTFJQQUdFLENMUkZPVU5ELFBBR0VSRVEsR0VUU1RBVCxHRVRQQUdFLFNUT1BEQVUsUFVUUEFHRSxTRVRESVNQfQorICovCisKKyNkZWZpbmUgTUlOX1VOSVQgICAoMTw8MCkKKyNkZWZpbmUgTUlOX1RFTiAgICAoMTw8MSkKKyNkZWZpbmUgSFJfVU5JVCAgICAoMTw8MikKKyNkZWZpbmUgSFJfVEVOICAgICAoMTw8MykKKyNkZWZpbmUgUEdfVU5JVCAgICAoMTw8NCkKKyNkZWZpbmUgUEdfVEVOICAgICAoMTw8NSkKKyNkZWZpbmUgUEdfSFVORCAgICAoMTw8NikKKyNkZWZpbmUgUEdNQVNLX01BWCAoMTw8NykKKyNkZWZpbmUgUEdNQVNLX1BBR0UgKFBHX0hVTkQgfCBQR19URU4gfCBQR19VTklUKQorI2RlZmluZSBQR01BU0tfSE9VUiAoSFJfVEVOIHwgSFJfVU5JVCkKKyNkZWZpbmUgUEdNQVNLX01JTlVURSAoTUlOX1RFTiB8IE1JTl9VTklUKQorCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlpbnQgcGFnZTsJLyogbnVtYmVyIG9mIHJlcXVlc3RlZCBwYWdlIChoZXhhZGVjaW1hbCkgKi8KKwlpbnQgaG91cjsJLyogcmVxdWVzdGVkIGhvdXIgKGhleGFkZWNpbWFsKSAqLworCWludCBtaW51dGU7CS8qIHJlcXVlc3RlZCBtaW51dGUgKGhleGFkZWNpbWFsKSAqLworCWludCBwYWdlbWFzazsJLyogbWFzayBkZWZpbmluZyB3aGljaCB2YWx1ZXMgb2YgdGhlIGFib3ZlIGFyZSBzZXQgKi8KKwlpbnQgcGdidWY7CS8qIGJ1ZmZlciB3aGVyZSBwYWdlIHdpbGwgYmUgc3RvcmVkICovCisJaW50IHN0YXJ0OwkvKiBzdGFydCBvZiByZXF1ZXN0ZWQgcGFydCBvZiBwYWdlICovCisJaW50IGVuZDsJLyogZW5kIG9mIHJlcXVlc3RlZCBwYXJ0IG9mIHBhZ2UgKi8KKwl2b2lkICpidWZmZXI7CS8qIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLworfQordnR4X3BhZ2VyZXFfdDsKKworCisvKgorICoJRGVmaW5pdGlvbnMgZm9yIFZUWElPQ3tHRVRTVEFULFBVVFNUQVR9CisgKi8KKyAKKyNkZWZpbmUgVlRYX1BBR0VTSVpFICg0MCAqIDI0KQorI2RlZmluZSBWVFhfVklSVFVBTFNJWkUgKDQwICogNDkpCisKK3R5cGVkZWYgc3RydWN0IAoreworCWludCBwYWdlbnVtOwkJCS8qIG51bWJlciBvZiBwYWdlIChoZXhhZGVjaW1hbCkgKi8KKwlpbnQgaG91cjsJCQkvKiBob3VyIChoZXhhZGVjaW1hbCkgKi8KKwlpbnQgbWludXRlOwkJCS8qIG1pbnV0ZSAoaGV4YWRlY2ltYWwpICovCisJaW50IGNoYXJzZXQ7CQkJLyogbmF0aW9uYWwgY2hhcnNldCAqLworCXVuc2lnbmVkIGRlbGV0ZSA6IDE7CQkvKiBkZWxldGUgcGFnZSAoQzQpICovCisJdW5zaWduZWQgaGVhZGxpbmUgOiAxOwkJLyogaW5zZXJ0IGhlYWRsaW5lIChDNSkgKi8KKwl1bnNpZ25lZCBzdWJ0aXRsZSA6IDE7CQkvKiBpbnNlcnQgc3VidGl0bGUgKEM2KSAqLworCXVuc2lnbmVkIHN1cHBfaGVhZGVyIDogMTsJLyogc3VwcHJlc3MgaGVhZGVyIChDNykgKi8KKwl1bnNpZ25lZCB1cGRhdGUgOiAxOwkJLyogdXBkYXRlIHBhZ2UgKEM4KSAqLworCXVuc2lnbmVkIGludGVyX3NlcSA6IDE7CQkvKiBpbnRlcnJ1cHRlZCBzZXF1ZW5jZSAoQzkpICovCisJdW5zaWduZWQgZGlzX2Rpc3AgOiAxOwkJLyogZGlzYWJsZS9zdXBwcmVzcyBkaXNwbGF5IChDMTApICovCisJdW5zaWduZWQgc2VyaWFsIDogMTsJCS8qIHNlcmlhbCBtb2RlIChDMTEpICovCisJdW5zaWduZWQgbm90Zm91bmQgOiAxOwkJLyogL0ZPVU5EICovCisJdW5zaWduZWQgcGJsZiA6IDE7CQkvKiBQQkxGICovCisJdW5zaWduZWQgaGFtbWluZyA6IDE7CQkvKiBoYW1taW5nLWVycm9yIG9jY3VycmVkICovCit9Cit2dHhfcGFnZWluZm9fdDsKKyAKKyNlbmRpZiAvKiBfVlRYX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fYmxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhMGIxMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCkBAIC0wLDAgKzEsNTMgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19CTEtfSAorI2RlZmluZSBfTElOVVhfVklSVElPX0JMS19ICisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorCisvKiBUaGUgSUQgZm9yIHZpcnRpb19ibG9jayAqLworI2RlZmluZSBWSVJUSU9fSURfQkxPQ0sJMgorCisvKiBGZWF0dXJlIGJpdHMgKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX0JBUlJJRVIJMAkvKiBEb2VzIGhvc3Qgc3VwcG9ydCBiYXJyaWVycz8gKi8KKyNkZWZpbmUgVklSVElPX0JMS19GX1NJWkVfTUFYCTEJLyogSW5kaWNhdGVzIG1heGltdW0gc2VnbWVudCBzaXplICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9TRUdfTUFYCTIJLyogSW5kaWNhdGVzIG1heGltdW0gIyBvZiBzZWdtZW50cyAqLworCitzdHJ1Y3QgdmlydGlvX2Jsa19jb25maWcKK3sKKwkvKiBUaGUgY2FwYWNpdHkgKGluIDUxMi1ieXRlIHNlY3RvcnMpLiAqLworCV9fbGU2NCBjYXBhY2l0eTsKKwkvKiBUaGUgbWF4aW11bSBzZWdtZW50IHNpemUgKGlmIFZJUlRJT19CTEtfRl9TSVpFX01BWCkgKi8KKwlfX2xlMzIgc2l6ZV9tYXg7CisJLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIChpZiBWSVJUSU9fQkxLX0ZfU0VHX01BWCkgKi8KKwlfX2xlMzIgc2VnX21heDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFRoZXNlIHR3byBkZWZpbmUgZGlyZWN0aW9uLiAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfSU4JCTAKKyNkZWZpbmUgVklSVElPX0JMS19UX09VVAkxCisKKy8qIFRoaXMgYml0IHNheXMgaXQncyBhIHNjc2kgY29tbWFuZCwgbm90IGFuIGFjdHVhbCByZWFkIG9yIHdyaXRlLiAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfU0NTSV9DTUQJMgorCisvKiBCYXJyaWVyIGJlZm9yZSB0aGlzIG9wLiAqLworI2RlZmluZSBWSVJUSU9fQkxLX1RfQkFSUklFUgkweDgwMDAwMDAwCisKKy8qIFRoaXMgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHJlYWQgc2NhdHRlci1nYXRoZXIgbGlzdC4gKi8KK3N0cnVjdCB2aXJ0aW9fYmxrX291dGhkcgoreworCS8qIFZJUlRJT19CTEtfVCogKi8KKwlfX3UzMiB0eXBlOworCS8qIGlvIHByaW9yaXR5LiAqLworCV9fdTMyIGlvcHJpbzsKKwkvKiBTZWN0b3IgKGllLiA1MTIgYnl0ZSBvZmZzZXQpICovCisJX191NjQgc2VjdG9yOworfTsKKworI2RlZmluZSBWSVJUSU9fQkxLX1NfT0sJCTAKKyNkZWZpbmUgVklSVElPX0JMS19TX0lPRVJSCTEKKyNkZWZpbmUgVklSVElPX0JMS19TX1VOU1VQUAkyCisKKy8qIFRoaXMgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHdyaXRlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgKi8KK3N0cnVjdCB2aXJ0aW9fYmxrX2luaGRyCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7Cit9OworI2VuZGlmIC8qIF9MSU5VWF9WSVJUSU9fQkxLX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhMTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX2NvbmZpZy5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19DT05GSUdfSAorI2RlZmluZSBfTElOVVhfVklSVElPX0NPTkZJR19ICisvKiBWaXJ0aW8gZGV2aWNlcyB1c2UgYSBzdGFuZGFyZGl6ZWQgY29uZmlndXJhdGlvbiBzcGFjZSB0byBkZWZpbmUgdGhlaXIKKyAqIGZlYXR1cmVzIGFuZCBwYXNzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIGJ1dCBlYWNoIGltcGxlbWVudGF0aW9uIGNhbgorICogc3RvcmUgYW5kIGFjY2VzcyB0aGF0IHNwYWNlIGRpZmZlcmVudGx5LiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFN0YXR1cyBieXRlIGZvciBndWVzdCB0byByZXBvcnQgcHJvZ3Jlc3MsIGFuZCBzeW5jaHJvbml6ZSBmZWF0dXJlcy4gKi8KKy8qIFdlIGhhdmUgc2VlbiBkZXZpY2UgYW5kIHByb2Nlc3NlZCBnZW5lcmljIGZpZWxkcyAoVklSVElPX0NPTkZJR19GX1ZJUlRJTykgKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TX0FDS05PV0xFREdFCTEKKy8qIFdlIGhhdmUgZm91bmQgYSBkcml2ZXIgZm9yIHRoZSBkZXZpY2UuICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19EUklWRVIJCTIKKy8qIERyaXZlciBoYXMgdXNlZCBpdHMgcGFydHMgb2YgdGhlIGNvbmZpZywgYW5kIGlzIGhhcHB5ICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19EUklWRVJfT0sJNAorLyogV2UndmUgZ2l2ZW4gdXAgb24gdGhpcyBkZXZpY2UuICovCisjZGVmaW5lIFZJUlRJT19DT05GSUdfU19GQUlMRUQJCTB4ODAKKworI2VuZGlmIC8qIF9MSU5VWF9WSVJUSU9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92aXJ0aW9fbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMzM1MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvdmlydGlvX25ldC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0xJTlVYX1ZJUlRJT19ORVRfSAorI2RlZmluZSBfTElOVVhfVklSVElPX05FVF9ICisjaW5jbHVkZSA8bGludXgvdmlydGlvX2NvbmZpZy5oPgorCisvKiBUaGUgSUQgZm9yIHZpcnRpb19uZXQgKi8KKyNkZWZpbmUgVklSVElPX0lEX05FVAkxCisKKy8qIFRoZSBmZWF0dXJlIGJpdG1hcCBmb3IgdmlydGlvIG5ldCAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfQ1NVTQkwCS8qIENhbiBoYW5kbGUgcGt0cyB3LyBwYXJ0aWFsIGNzdW0gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX01BQwk1CS8qIEhvc3QgaGFzIGdpdmVuIE1BQyBhZGRyZXNzLiAqLworI2RlZmluZSBWSVJUSU9fTkVUX0ZfR1NPCTYJLyogQ2FuIGhhbmRsZSBwa3RzIHcvIGFueSBHU08gdHlwZSAqLworCitzdHJ1Y3QgdmlydGlvX25ldF9jb25maWcKK3sKKwkvKiBUaGUgY29uZmlnIGRlZmluaW5nIG1hYyBhZGRyZXNzIChpZiBWSVJUSU9fTkVUX0ZfTUFDKSAqLworCV9fdTggbWFjWzZdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC4gIElmIHlvdSBkb24ndAorICogc3BlY2lmeSBHU08gb3IgQ1NVTSBmZWF0dXJlcywgeW91IGNhbiBzaW1wbHkgaWdub3JlIHRoZSBoZWFkZXIuICovCitzdHJ1Y3QgdmlydGlvX25ldF9oZHIKK3sKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfRl9ORUVEU19DU1VNCTEJLy8gVXNlIGNzdW1fc3RhcnQsIGNzdW1fb2Zmc2V0CisJX191OCBmbGFnczsKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX05PTkUJCTAJLy8gTm90IGEgR1NPIGZyYW1lCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNAkxCS8vIEdTTyBmcmFtZSwgSVB2NCBUQ1AgKFRTTykKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX1VEUAkJMwkvLyBHU08gZnJhbWUsIElQdjQgVURQIChVRk8pCisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0dTT19UQ1BWNgk0CS8vIEdTTyBmcmFtZSwgSVB2NiBUQ1AKKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX0VDTgkJMHg4MAkvLyBUQ1AgaGFzIEVDTiBzZXQKKwlfX3U4IGdzb190eXBlOworCV9fdTE2IGhkcl9sZW47CQkvKiBFdGhlcm5ldCArIElQICsgdGNwL3VkcCBoZHJzICovCisJX191MTYgZ3NvX3NpemU7CQkvKiBCeXRlcyB0byBhcHBlbmQgdG8gZ3NvX2hkcl9sZW4gcGVyIGZyYW1lICovCisJX191MTYgY3N1bV9zdGFydDsJLyogUG9zaXRpb24gdG8gc3RhcnQgY2hlY2tzdW1taW5nIGZyb20gKi8KKwlfX3UxNiBjc3VtX29mZnNldDsJLyogT2Zmc2V0IGFmdGVyIHRoYXQgdG8gcGxhY2UgY2hlY2tzdW0gKi8KK307CisjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19ORVRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC92dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzFjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3Z0LmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBfTElOVVhfVlRfSAorI2RlZmluZSBfTElOVVhfVlRfSAorCisjaWZkZWYgX19LRVJORUxfXworc3RydWN0IG5vdGlmaWVyX2Jsb2NrOworCitzdHJ1Y3QgdnRfbm90aWZpZXJfcGFyYW0geworCXN0cnVjdCB2Y19kYXRhICp2YzsJLyogVkMgb24gd2hpY2ggdGhlIHVwZGF0ZSBoYXBwZW5lZCAqLworCXVuc2lnbmVkIGludCBjOwkJLyogUHJpbnRlZCBjaGFyICovCit9OworCitleHRlcm4gaW50IHJlZ2lzdGVyX3Z0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3Z0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworI2VuZGlmCisKKy8qCisgKiBUaGVzZSBjb25zdGFudHMgYXJlIGFsc28gdXNlZnVsIGZvciB1c2VyLWxldmVsIGFwcHMgKGUuZy4sIFZDCisgKiByZXNpemluZykuCisgKi8KKyNkZWZpbmUgTUlOX05SX0NPTlNPTEVTIDEgICAgICAgLyogbXVzdCBiZSBhdCBsZWFzdCAxICovCisjZGVmaW5lIE1BWF9OUl9DT05TT0xFUwk2MwkvKiBzZXJpYWwgbGluZXMgc3RhcnQgYXQgNjQgKi8KKyNkZWZpbmUgTUFYX05SX1VTRVJfQ09OU09MRVMgNjMJLyogbXVzdCBiZSByb290IHRvIGFsbG9jYXRlIGFib3ZlIHRoaXMgKi8KKwkJLyogTm90ZTogdGhlIGlvY3RsIFZUX0dFVFNUQVRFIGRvZXMgbm90IHdvcmsgZm9yCisJCSAgIGNvbnNvbGVzIDE2IGFuZCBoaWdoZXIgKHNpbmNlIGl0IHJldHVybnMgYSBzaG9ydCkgKi8KKworLyogMHg1NiBpcyAnVicsIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIHRlcm1pb3MgYW5kIGtkICovCisKKyNkZWZpbmUgVlRfT1BFTlFSWQkweDU2MDAJLyogZmluZCBhdmFpbGFibGUgdnQgKi8KKworc3RydWN0IHZ0X21vZGUgeworCWNoYXIgbW9kZTsJCS8qIHZ0IG1vZGUgKi8KKwljaGFyIHdhaXR2OwkJLyogaWYgc2V0LCBoYW5nIG9uIHdyaXRlcyBpZiBub3QgYWN0aXZlICovCisJc2hvcnQgcmVsc2lnOwkJLyogc2lnbmFsIHRvIHJhaXNlIG9uIHJlbGVhc2UgcmVxICovCisJc2hvcnQgYWNxc2lnOwkJLyogc2lnbmFsIHRvIHJhaXNlIG9uIGFjcXVpc2l0aW9uICovCisJc2hvcnQgZnJzaWc7CQkvKiB1bnVzZWQgKHNldCB0byAwKSAqLworfTsKKyNkZWZpbmUgVlRfR0VUTU9ERQkweDU2MDEJLyogZ2V0IG1vZGUgb2YgYWN0aXZlIHZ0ICovCisjZGVmaW5lIFZUX1NFVE1PREUJMHg1NjAyCS8qIHNldCBtb2RlIG9mIGFjdGl2ZSB2dCAqLworI2RlZmluZQkJVlRfQVVUTwkJMHgwMAkvKiBhdXRvIHZ0IHN3aXRjaGluZyAqLworI2RlZmluZQkJVlRfUFJPQ0VTUwkweDAxCS8qIHByb2Nlc3MgY29udHJvbHMgc3dpdGNoaW5nICovCisjZGVmaW5lCQlWVF9BQ0tBQ1EJMHgwMgkvKiBhY2tub3dsZWRnZSBzd2l0Y2ggKi8KKworc3RydWN0IHZ0X3N0YXQgeworCXVuc2lnbmVkIHNob3J0IHZfYWN0aXZlOwkvKiBhY3RpdmUgdnQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3NpZ25hbDsJLyogc2lnbmFsIHRvIHNlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3N0YXRlOwkJLyogdnQgYml0bWFzayAqLworfTsKKyNkZWZpbmUgVlRfR0VUU1RBVEUJMHg1NjAzCS8qIGdldCBnbG9iYWwgdnQgc3RhdGUgaW5mbyAqLworI2RlZmluZSBWVF9TRU5EU0lHCTB4NTYwNAkvKiBzaWduYWwgdG8gc2VuZCB0byBiaXRtYXNrIG9mIHZ0cyAqLworCisjZGVmaW5lIFZUX1JFTERJU1AJMHg1NjA1CS8qIHJlbGVhc2UgZGlzcGxheSAqLworCisjZGVmaW5lIFZUX0FDVElWQVRFCTB4NTYwNgkvKiBtYWtlIHZ0IGFjdGl2ZSAqLworI2RlZmluZSBWVF9XQUlUQUNUSVZFCTB4NTYwNwkvKiB3YWl0IGZvciB2dCBhY3RpdmUgKi8KKyNkZWZpbmUgVlRfRElTQUxMT0NBVEUJMHg1NjA4ICAvKiBmcmVlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHZ0ICovCisKK3N0cnVjdCB2dF9zaXplcyB7CisJdW5zaWduZWQgc2hvcnQgdl9yb3dzOwkJLyogbnVtYmVyIG9mIHJvd3MgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X2NvbHM7CQkvKiBudW1iZXIgb2YgY29sdW1ucyAqLworCXVuc2lnbmVkIHNob3J0IHZfc2Nyb2xsc2l6ZTsJLyogbnVtYmVyIG9mIGxpbmVzIG9mIHNjcm9sbGJhY2sgKi8KK307CisjZGVmaW5lIFZUX1JFU0laRQkweDU2MDkJLyogc2V0IGtlcm5lbCdzIGlkZWEgb2Ygc2NyZWVuc2l6ZSAqLworCitzdHJ1Y3QgdnRfY29uc2l6ZSB7CisJdW5zaWduZWQgc2hvcnQgdl9yb3dzOwkvKiBudW1iZXIgb2Ygcm93cyAqLworCXVuc2lnbmVkIHNob3J0IHZfY29sczsJLyogbnVtYmVyIG9mIGNvbHVtbnMgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3ZsaW47CS8qIG51bWJlciBvZiBwaXhlbCByb3dzIG9uIHNjcmVlbiAqLworCXVuc2lnbmVkIHNob3J0IHZfY2xpbjsJLyogbnVtYmVyIG9mIHBpeGVsIHJvd3MgcGVyIGNoYXJhY3RlciAqLworCXVuc2lnbmVkIHNob3J0IHZfdmNvbDsJLyogbnVtYmVyIG9mIHBpeGVsIGNvbHVtbnMgb24gc2NyZWVuICovCisJdW5zaWduZWQgc2hvcnQgdl9jY29sOwkvKiBudW1iZXIgb2YgcGl4ZWwgY29sdW1ucyBwZXIgY2hhcmFjdGVyICovCit9OworI2RlZmluZSBWVF9SRVNJWkVYICAgICAgMHg1NjBBICAvKiBzZXQga2VybmVsJ3MgaWRlYSBvZiBzY3JlZW5zaXplICsgbW9yZSAqLworI2RlZmluZSBWVF9MT0NLU1dJVENIICAgMHg1NjBCICAvKiBkaXNhbGxvdyB2dCBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgVlRfVU5MT0NLU1dJVENIIDB4NTYwQyAgLyogYWxsb3cgdnQgc3dpdGNoaW5nICovCisjZGVmaW5lIFZUX0dFVEhJRk9OVE1BU0sgMHg1NjBEICAvKiByZXR1cm4gaGkgZm9udCBtYXNrICovCisKKyNlbmRpZiAvKiBfTElOVVhfVlRfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YWl0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RiZGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93YWl0LmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfTElOVVhfV0FJVF9ICisjZGVmaW5lIF9MSU5VWF9XQUlUX0gKKworI2RlZmluZSBXTk9IQU5HCQkweDAwMDAwMDAxCisjZGVmaW5lIFdVTlRSQUNFRAkweDAwMDAwMDAyCisjZGVmaW5lIFdTVE9QUEVECVdVTlRSQUNFRAorI2RlZmluZSBXRVhJVEVECQkweDAwMDAwMDA0CisjZGVmaW5lIFdDT05USU5VRUQJMHgwMDAwMDAwOAorI2RlZmluZSBXTk9XQUlUCQkweDAxMDAwMDAwCS8qIERvbid0IHJlYXAsIGp1c3QgcG9sbCBzdGF0dXMuICAqLworCisjZGVmaW5lIF9fV05PVEhSRUFECTB4MjAwMDAwMDAJLyogRG9uJ3Qgd2FpdCBvbiBjaGlsZHJlbiBvZiBvdGhlciB0aHJlYWRzIGluIHRoaXMgZ3JvdXAgKi8KKyNkZWZpbmUgX19XQUxMCQkweDQwMDAwMDAwCS8qIFdhaXQgb24gYWxsIGNoaWxkcmVuLCByZWdhcmRsZXNzIG9mIHR5cGUgKi8KKyNkZWZpbmUgX19XQ0xPTkUJMHg4MDAwMDAwMAkvKiBXYWl0IG9ubHkgb24gbm9uLVNJR0NITEQgY2hpbGRyZW4gKi8KKworLyogRmlyc3QgYXJndW1lbnQgdG8gd2FpdGlkOiAqLworI2RlZmluZSBQX0FMTAkJMAorI2RlZmluZSBQX1BJRAkJMQorI2RlZmluZSBQX1BHSUQJCTIKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NjE1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCkBAIC0wLDAgKzEsNDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogd2Fucm91dGVyLmgJRGVmaW5pdGlvbnMgZm9yIHRoZSBXQU4gTXVsdGlwcm90b2NvbCBSb3V0ZXIgTW9kdWxlLgorKgkJVGhpcyBtb2R1bGUgcHJvdmlkZXMgQVBJIGFuZCBjb21tb24gc2VydmljZXMgZm9yIFdBTiBMaW5rCisqCQlEcml2ZXJzIGFuZCBpcyBjb21wbGV0ZWx5IGhhcmR3YXJlLWluZGVwZW5kZW50LgorKgorKiBBdXRob3I6IAlOZW5hZCBDb3JiaWMgPG5jb3JiaWNAc2FuZ29tYS5jb20+CisqCQlHaWRlb24gSGFjayAJCisqIEFkZGl0aW9uczoJQXJuYWxkbyBNZWxvCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEp1bCAyMSwgMjAwMCAgTmVuYWQgQ29yYmljCUFkZGVkIFdBTl9GVDFfUkVBRFkgU3RhdGUKKyogRmViIDI0LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgc3VwcG9ydCBmb3Igc29ja2V0IGJhc2VkIHgyNWFwaQorKiBKYW4gMjgsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgQVNZTkMgcHJvdG9jb2wuCisqIE9jdCAwNCwgMTk5OSAgTmVuYWQgQ29yYmljIAlVcGRhdGVkIGZvciAyLjEuMCByZWxlYXNlCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sJQWRkZWQgc3VwcG9ydCBmb3IgdGhlIFM1MTQgYWRhcHRlci4KKyogTWF5IDIzLCAxOTk5CUFybmFsZG8gTWVsbwlBZGRlZCBsb2NhbF9hZGRyIHRvIHdhbmlmX2NvbmZfdAorKgkJCQlXQU5fRElTQ09OTkVDVElORyBzdGF0ZSBhZGRlZAorKiBKdWwgMjAsIDE5OTgJRGF2aWQgRm9uZwlBZGRlZCBJbnZlcnNlIEFSUCBvcHRpb25zIHRvICd3YW5pZl9jb25mX3QnCisqIEp1biAxMiwgMTk5OAlEYXZpZCBGb25nCUFkZGVkIENpc2NvIEhETEMgc3VwcG9ydC4KKyogRGVjIDE2LCAxOTk3CUphc3ByZWV0IFNpbmdoCU1vdmVkICdlbmFibGVfSVBYJyBhbmQgJ25ldHdvcmtfbnVtYmVyJyB0bworKgkJCQknd2FuaWZfY29uZl90JworKiBEZWMgMDUsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ3BhcCcsICdjaGFwJyB0byAnd2FuaWZfY29uZl90JworKgkJCQlBZGRlZCAnYXV0aGVudGljYXRvcicgdG8gJ3dhbl9wcHBfY29uZl90JworKiBOb3YgMDYsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQ2hhbmdlZCBSb3V0ZXIgRHJpdmVyIHZlcnNpb24gdG8gMS4xIGZyb20gMS4wCisqIE9jdCAyMCwgMTk5NwlKYXNwcmVldCBTaW5naAlBZGRlZCAnY2lyJywnYmMnLCdiZScgYW5kICdtYycgdG8gJ3dhbmlmX2NvbmZfdCcKKyoJCQkJQWRkZWQgJ2VuYWJsZV9JUFgnIGFuZCAnbmV0d29ya19udW1iZXInIHRvIAorKgkJCQknd2FuX2RldmljZV90Jy4gIEFsc28gYWRkZWQgZGVmaW5lcyBmb3IKKyoJCQkJVURQIFBBQ0tFVCBUWVBFLCBJbnRlcnJ1cHQgdGVzdCwgY3JpdGljYWwgdmFsdWVzCisqCQkJCWZvciBSQUNFIGNvbmRpdGlvbnMuCisqIE9jdCAwNSwgMTk5NwlKYXNwcmVldCBTaW5naAlBZGRlZCAnZGxjaV9udW0nIGFuZCAnZGxjaVsxMDBdJyB0byAKKyoJCQkJJ3dhbl9mcl9jb25mX3QnIHRvIGNvbmZpZ3VyZSBhIGxpc3Qgb2YgZGxjaShzKQorKgkJCQlmb3IgYSBOT0RFIAorKiBKdWwgMDcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJQWRkZWQgJ3R0bCcgdG8gJ3dhbmRldl9jb25mX3QnICYgJ3dhbl9kZXZpY2VfdCcKKyogTWF5IDI5LCAxOTk3IAlKYXNwcmVldCBTaW5naAlBZGRlZCAndHhfaW50X2VuYWJsZWQnIHRvICd3YW5fZGV2aWNlX3QnCisqIE1heSAyMSwgMTk5NwlKYXNwcmVldCBTaW5naAlBZGRlZCAndWRwX3BvcnQnIHRvICd3YW5fZGV2aWNlX3QnCisqIEFwciAyNSwgMTk5NyAgRmFyaGFuIFRoYXdhciAgIEFkZGVkICd1ZHBfcG9ydCcgdG8gJ3dhbmRldl9jb25mX3QnCisqIEphbiAxNiwgMTk5NwlHZW5lIEtvemluCXJvdXRlcl9kZXZsaXN0IG1hZGUgcHVibGljCisqIEphbiAwMiwgMTk5NwlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbiAoYmFzZWQgb24gd2FucGlwZS5oKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9ST1VURVJfSAorI2RlZmluZQlfUk9VVEVSX0gKKworI2RlZmluZQlST1VURVJfTkFNRQkid2Fucm91dGVyIgkvKiBpbiBjYXNlIHdlIGV2ZXIgY2hhbmdlIGl0ICovCisjZGVmaW5lCVJPVVRFUl9WRVJTSU9OCTEJCS8qIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lCVJPVVRFUl9SRUxFQVNFCTEJCS8qIHJlbGVhc2UgKG1pbm9yIHZlcnNpb24pIG51bWJlciAqLworI2RlZmluZQlST1VURVJfSU9DVEwJJ1cnCQkvKiBmb3IgSU9DVEwgY2FsbHMgKi8KKyNkZWZpbmUJUk9VVEVSX01BR0lDCTB4NTI0RDQxNTdMCS8qIHNpZ25hdHVyZTogJ1dBTlInIHJldmVyc2VkICovCisKKy8qIElPQ1RMIGNvZGVzIGZvciAvcHJvYy9yb3V0ZXIvPGRldmljZT4gZW50cmllcyAodXAgdG8gMjU1KSAqLworZW51bSByb3V0ZXJfaW9jdGxzCit7CisJUk9VVEVSX1NFVFVQCT0gUk9VVEVSX0lPQ1RMPDw4LAkvKiBjb25maWd1cmUgZGV2aWNlICovCisJUk9VVEVSX0RPV04sCQkJCS8qIHNodXQgZG93biBkZXZpY2UgKi8KKwlST1VURVJfU1RBVCwJCQkJLyogZ2V0IGRldmljZSBzdGF0dXMgKi8KKwlST1VURVJfSUZORVcsCQkJCS8qIGFkZCBpbnRlcmZhY2UgKi8KKwlST1VURVJfSUZERUwsCQkJCS8qIGRlbGV0ZSBpbnRlcmZhY2UgKi8KKwlST1VURVJfSUZTVEFULAkJCQkvKiBnZXQgaW50ZXJmYWNlIHN0YXR1cyAqLworCVJPVVRFUl9VU0VSCT0gKFJPVVRFUl9JT0NUTDw8OCkrMTYsCS8qIGRyaXZlci1zcGVjaWZpYyBjYWxscyAqLworCVJPVVRFUl9VU0VSX01BWAk9IChST1VURVJfSU9DVEw8PDgpKzMxCit9OworCisvKiBpZGVudGlmaWVycyBmb3IgZGlzcGxheWluZyBwcm9jIGZpbGUgZGF0YSBmb3IgZHVhbCBwb3J0IGFkYXB0ZXJzICovCisjZGVmaW5lIFBST0NfREFUQV9QT1JUXzAgMHg4MDAwCS8qIHRoZSBkYXRhIGlzIGZvciBwb3J0IDAgKi8KKyNkZWZpbmUgUFJPQ19EQVRBX1BPUlRfMSAweDgwMDEJLyogdGhlIGRhdGEgaXMgZm9yIHBvcnQgMSAqLworCisvKiBOTFBJRCBmb3IgcGFja2V0IGVuY2Fwc3VsYXRpb24gKElTTy9JRUMgVFIgOTU3NykgKi8KKyNkZWZpbmUJTkxQSURfSVAJMHhDQwkvKiBJbnRlcm5ldCBQcm90b2NvbCBEYXRhZ3JhbSAqLworI2RlZmluZQlOTFBJRF9TTkFQCTB4ODAJLyogSUVFRSBTdWJuZXR3b3JrIEFjY2VzcyBQcm90b2NvbCAqLworI2RlZmluZQlOTFBJRF9DTE5QCTB4ODEJLyogSVNPL0lFQyA4NDczICovCisjZGVmaW5lCU5MUElEX0VTSVMJMHg4MgkvKiBJU08vSUVDIDk1NDIgKi8KKyNkZWZpbmUJTkxQSURfSVNJUwkweDgzCS8qIElTTy9JRUMgSVNJUyAqLworI2RlZmluZQlOTFBJRF9ROTMzCTB4MDgJLyogQ0NJVFQgUS45MzMgKi8KKworLyogTWlzY2VsbGFuZW91cyAqLworI2RlZmluZQlXQU5fSUZOQU1FX1NaCTE1CS8qIG1heCBsZW5ndGggb2YgdGhlIGludGVyZmFjZSBuYW1lICovCisjZGVmaW5lCVdBTl9EUlZOQU1FX1NaCTE1CS8qIG1heCBsZW5ndGggb2YgdGhlIGxpbmsgZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUJV0FOX0FERFJFU1NfU1oJMzEJLyogbWF4IGxlbmd0aCBvZiB0aGUgV0FOIG1lZGlhIGFkZHJlc3MgKi8KKyNkZWZpbmUgVVNFRF9CWV9GSUVMRAk4CS8qIG1heCBsZW5ndGggb2YgdGhlIHVzZWQgYnkgZmllbGQgKi8KKworLyogRGVmaW5lcyBmb3IgVURQIFBBQ0tFVCBUWVBFICovCisjZGVmaW5lIFVEUF9QVFBJUEVfVFlQRSAJMHgwMQorI2RlZmluZSBVRFBfRlBJUEVfVFlQRQkJMHgwMgorI2RlZmluZSBVRFBfQ1BJUEVfVFlQRQkJMHgwMworI2RlZmluZSBVRFBfRFJWU1RBVFNfVFlQRSAJMHgwNAorI2RlZmluZSBVRFBfSU5WQUxJRF9UWVBFICAJMHgwNQorCisvKiBDb21tYW5kIHJldHVybiBjb2RlICovCisjZGVmaW5lIENNRF9PSwkJMAkJLyogbm9ybWFsIGZpcm13YXJlIHJldHVybiBjb2RlICovCisjZGVmaW5lIENNRF9USU1FT1VUCTB4RkYJCS8qIGZpcm13YXJlIGNvbW1hbmQgdGltZWQgb3V0ICovCisKKy8qIFVEUCBQYWNrZXQgTWFuYWdlbWVudCAqLworI2RlZmluZSBVRFBfUEtUX0ZSTV9TVEFDSwkweDAwCisjZGVmaW5lIFVEUF9QS1RfRlJNX05FVFdPUksJMHgwMQorCisvKiBNYXhpbXVtIGludGVycnVwdCB0ZXN0IGNvdW50ZXIgKi8KKyNkZWZpbmUgTUFYX0lOVFJfVEVTVF9DT1VOVEVSCTEwMAorCisvKiBDcml0aWNhbCBWYWx1ZXMgZm9yIFJBQ0UgY29uZGl0aW9ucyovCisjZGVmaW5lIENSSVRJQ0FMX0lOX0lTUgkJMHhBMQorI2RlZmluZSBDUklUSUNBTF9JTlRSX0hBTkRMRUQJMHhCMQorCisvKioqKioqIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBYLjI1LXNwZWNpZmljIGxpbmstbGV2ZWwgY29uZmlndXJhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd2FuX3gyNV9jb25mCit7CisJdW5zaWduZWQgbG9fcHZjOwkvKiBsb3dlc3QgcGVybWFuZW50IGNpcmN1aXQgbnVtYmVyICovCisJdW5zaWduZWQgaGlfcHZjOwkvKiBoaWdoZXN0IHBlcm1hbmVudCBjaXJjdWl0IG51bWJlciAqLworCXVuc2lnbmVkIGxvX3N2YzsJLyogbG93ZXN0IHN3aXRjaGVkIGNpcmN1aXQgbnVtYmVyICovCisJdW5zaWduZWQgaGlfc3ZjOwkvKiBoaWdoZXN0IHN3aXRjaGVkIGNpcmN1aXQgbnVtYmVyICovCisJdW5zaWduZWQgaGRsY193aW5kb3c7CS8qIEhETEMgd2luZG93IHNpemUgKDEuLjcpICovCisJdW5zaWduZWQgcGt0X3dpbmRvdzsJLyogWC4yNSBwYWNrZXQgd2luZG93IHNpemUgKDEuLjcpICovCisJdW5zaWduZWQgdDE7CQkvKiBIRExDIHRpbWVyIFQxLCBzZWMgKDEuLjMwKSAqLworCXVuc2lnbmVkIHQyOwkJLyogSERMQyB0aW1lciBUMiwgc2VjICgwLi4yOSkgKi8KKwl1bnNpZ25lZCB0NDsJCS8qIEhETEMgc3VwZXJ2aXNvcnkgZnJhbWUgdGltZXIgPSBUNCAqIFQxICovCisJdW5zaWduZWQgbjI7CQkvKiBIRExDIHJldHJhbnNtaXNzaW9uIGxpbWl0ICgxLi4zMCkgKi8KKwl1bnNpZ25lZCB0MTBfdDIwOwkvKiBYLjI1IFJFU1RBUlQgdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgdDExX3QyMTsJLyogWC4yNSBDQUxMIHRpbWVvdXQsIHNlYyAoMS4uMjU1KSAqLworCXVuc2lnbmVkIHQxMl90MjI7CS8qIFguMjUgUkVTRVQgdGltZW91dCwgc2VjICgxLi4yNTUpICovCisJdW5zaWduZWQgdDEzX3QyMzsJLyogWC4yNSBDTEVBUiB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCB0MTZfdDI2OwkvKiBYLjI1IElOVEVSUlVQVCB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCB0Mjg7CQkvKiBYLjI1IFJFR0lTVFJBVElPTiB0aW1lb3V0LCBzZWMgKDEuLjI1NSkgKi8KKwl1bnNpZ25lZCByMTBfcjIwOwkvKiBSRVNUQVJUIHJldHJhbnNtaXNzaW9uIGxpbWl0ICgwLi4yNTApICovCisJdW5zaWduZWQgcjEyX3IyMjsJLyogUkVTRVQgcmV0cmFuc21pc3Npb24gbGltaXQgKDAuLjI1MCkgKi8KKwl1bnNpZ25lZCByMTNfcjIzOwkvKiBDTEVBUiByZXRyYW5zbWlzc2lvbiBsaW1pdCAoMC4uMjUwKSAqLworCXVuc2lnbmVkIGNjaXR0X2NvbXBhdDsJLyogY29tcGF0aWJpbGl0eSBtb2RlOiAxOTg4LzE5ODQvMTk4MCAqLworCXVuc2lnbmVkIHgyNV9jb25mX29wdDsgICAvKiBVc2VyIGRlZmluZWQgeDI1IGNvbmZpZyBvcHRvaW5zICovCisJdW5zaWduZWQgY2hhciBMQVBCX2hkbGNfb25seTsgLyogUnVuIGluIEhETEMgb25seSBtb2RlICovCisJdW5zaWduZWQgY2hhciBsb2dnaW5nOyAgIC8qIENvbnRyb2wgY29ubmVjdGlvbiBsb2dnaW5nICovICAKKwl1bnNpZ25lZCBjaGFyIG9vYl9vbl9tb2RlbTsgLyogV2hldGhlciB0byBzZW5kIG1vZGVtIHN0YXR1cyB0byB0aGUgdXNlciBhcHAgKi8KK30gd2FuX3gyNV9jb25mX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnJhbWUgcmVsYXkgc3BlY2lmaWMgbGluay1sZXZlbCBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5fZnJfY29uZgoreworCXVuc2lnbmVkIHNpZ25hbGxpbmc7CS8qIGxvY2FsIGluLWNoYW5uZWwgc2lnbmFsbGluZyB0eXBlICovCisJdW5zaWduZWQgdDM5MTsJCS8qIGxpbmsgaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiB0aW1lciAqLworCXVuc2lnbmVkIHQzOTI7CQkvKiBwb2xsaW5nIHZlcmlmaWNhdGlvbiB0aW1lciAqLworCXVuc2lnbmVkIG4zOTE7CQkvKiBmdWxsIHN0YXR1cyBwb2xsaW5nIGN5Y2xlIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBuMzkyOwkJLyogZXJyb3IgdGhyZXNob2xkIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBuMzkzOwkJLyogbW9uaXRvcmVkIGV2ZW50cyBjb3VudGVyICovCisJdW5zaWduZWQgZGxjaV9udW07CS8qIG51bWJlciBvZiBETENzIChhY2Nlc3Mgbm9kZSkgKi8KKwl1bnNpZ25lZCAgZGxjaVsxMDBdOyAgICAvKiBMaXN0IG9mIGFsbCBETENJcyAqLworfSB3YW5fZnJfY29uZl90OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBQUC1zcGVjaWZpYyBsaW5rLWxldmVsIGNvbmZpZ3VyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbl9wcHBfY29uZgoreworCXVuc2lnbmVkIHJlc3RhcnRfdG1yOwkvKiByZXN0YXJ0IHRpbWVyICovCisJdW5zaWduZWQgYXV0aF9yc3J0X3RtcjsJLyogYXV0aGVudGljYXRpb24gdGltZXIgKi8KKwl1bnNpZ25lZCBhdXRoX3dhaXRfdG1yOwkvKiBhdXRoZW50aWNhdGlvbiB0aW1lciAqLworCXVuc2lnbmVkIG1kbV9mYWlsX3RtcjsJLyogbW9kZW0gZmFpbHVyZSB0aW1lciAqLworCXVuc2lnbmVkIGR0cl9kcm9wX3RtcjsJLyogRFRSIGRyb3AgdGltZXIgKi8KKwl1bnNpZ25lZCBjb25uZWN0X3Rtb3V0OwkvKiBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKwl1bnNpZ25lZCBjb25mX3JldHJ5OwkvKiBtYXguIHJldHJ5ICovCisJdW5zaWduZWQgdGVybV9yZXRyeTsJLyogbWF4LiByZXRyeSAqLworCXVuc2lnbmVkIGZhaWxfcmV0cnk7CS8qIG1heC4gcmV0cnkgKi8KKwl1bnNpZ25lZCBhdXRoX3JldHJ5OwkvKiBtYXguIHJldHJ5ICovCisJdW5zaWduZWQgYXV0aF9vcHRpb25zOwkvKiBhdXRoZW50aWNhdGlvbiBvcHQuICovCisJdW5zaWduZWQgaXBfb3B0aW9uczsJLyogSVAgb3B0aW9ucyAqLworCWNoYXIJYXV0aGVudGljYXRvcjsJLyogQVVUSEVOVElDQVRPUiBvciBub3QgKi8KKwljaGFyCWlwX21vZGU7CS8qIFN0YXRpYy9Ib3N0L1BlZXIgKi8KK30gd2FuX3BwcF9jb25mX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ0hETEMtc3BlY2lmaWMgbGluay1sZXZlbCBjb25maWd1cmF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5fY2hkbGNfY29uZgoreworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2RjZDsJLyogUHJvdG9jb2wgb3B0aW9uczoJCSovCisJdW5zaWduZWQgY2hhciBpZ25vcmVfY3RzOwkvKiAgSWdub3JlIHRoZXNlIHRvIGRldGVybWluZQkqLworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2tlZXBhbGl2ZTsJLyogIGxpbmsgc3RhdHVzIChZZXMgb3IgTm8pCSovCisJdW5zaWduZWQgY2hhciBoZGxjX3N0cmVhbWluZzsJLyogIGhkbGNfc3RyZWFtaW5nIG1vZGUgKFkvTikgKi8KKwl1bnNpZ25lZCBjaGFyIHJlY2VpdmVfb25seTsJLyogIG5vIHRyYW5zbWl0IGJ1ZmZlcmluZyAoWS9OKSAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV90eF90bXI7CS8qIHRyYW5zbWl0IGtlZXBhbGl2ZSB0aW1lciAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV9yeF90bXI7CS8qIHJlY2VpdmUgIGtlZXBhbGl2ZSB0aW1lciAqLworCXVuc2lnbmVkIGtlZXBhbGl2ZV9lcnJfbWFyZ2luOwkvKiBrZWVwYWxpdmVfZXJyb3JfdG9sZXJhbmNlICovCisJdW5zaWduZWQgc2xhcnBfdGltZXI7CQkvKiBTTEFSUCByZXF1ZXN0IHRpbWVyICovCit9IHdhbl9jaGRsY19jb25mX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXQU4gZGV2aWNlIGNvbmZpZ3VyYXRpb24uIFBhc3NlZCB0byBST1VURVJfU0VUVVAgSU9DVEwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbmRldl9jb25mCit7CisJdW5zaWduZWQgbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKGZvciB2ZXJpZmljYXRpb24pICovCisJdW5zaWduZWQgY29uZmlnX2lkOwkvKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpZGVudGlmaWVyICovCisJCQkJLyoqKioqKiBoYXJkd2FyZSBjb25maWd1cmF0aW9uICoqKioqKi8KKwl1bnNpZ25lZCBpb3BvcnQ7CS8qIGFkYXB0ZXIgSS9PIHBvcnQgYmFzZSAqLworCXVuc2lnbmVkIGxvbmcgbWFkZHI7CS8qIGR1YWwtcG9ydCBtZW1vcnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIG1zaXplOwkJLyogZHVhbC1wb3J0IG1lbW9yeSBzaXplICovCisJaW50IGlycTsJCS8qIGludGVycnVwdCByZXF1ZXN0IGxldmVsICovCisJaW50IGRtYTsJCS8qIERNQSByZXF1ZXN0IGxldmVsICovCisgICAgICAgIGNoYXIgUzUxNF9DUFVfbm9bMV07CS8qIFM1MTQgUENJIGFkYXB0ZXIgQ1BVIG51bWJlciAoJ0EnIG9yICdCJykgKi8KKyAgICAgICAgdW5zaWduZWQgUENJX3Nsb3Rfbm87CS8qIFM1MTQgUENJIGFkYXB0ZXIgc2xvdCBudW1iZXIgKi8KKwljaGFyIGF1dG9fcGNpX2NmZzsJLyogUzUxNSBQQ0kgYXV0b21hdGljIHNsb3QgZGV0ZWN0aW9uICovCisJY2hhciBjb21tX3BvcnQ7CQkvKiBDb21tdW5pY2F0aW9uIFBvcnQgKFBSST0wLCBTRUM9MSkgKi8gCisJdW5zaWduZWQgYnBzOwkJLyogZGF0YSB0cmFuc2ZlciByYXRlICovCisJdW5zaWduZWQgbXR1OwkJLyogbWF4aW11bSB0cmFuc21pdCB1bml0IHNpemUgKi8KKyAgICAgICAgdW5zaWduZWQgdWRwX3BvcnQ7ICAgICAgLyogVURQIHBvcnQgZm9yIG1hbmFnZW1lbnQgKi8KKwl1bnNpZ25lZCBjaGFyIHR0bDsJLyogVGltZSBUbyBMaXZlIGZvciBVRFAgc2VjdXJpdHkgKi8KKwl1bnNpZ25lZCBjaGFyIGZ0MTsJLyogRlQxIENvbmZpZ3VyYXRvciBPcHRpb24gKi8KKyAgICAgICAgY2hhciBpbnRlcmZhY2U7CQkvKiBSUy0yMzIvVi4zNSwgZXRjLiAqLworCWNoYXIgY2xvY2tpbmc7CQkvKiBleHRlcm5hbC9pbnRlcm5hbCAqLworCWNoYXIgbGluZV9jb2Rpbmc7CS8qIE5SWi9OUlpJL0ZNMC9GTTEsIGV0Yy4gKi8KKwljaGFyIHN0YXRpb247CQkvKiBEVEUvRENFLCBwcmltYXJ5L3NlY29uZGFyeSwgZXRjLiAqLworCWNoYXIgY29ubmVjdGlvbjsJLyogcGVybWFuZW50L3N3aXRjaGVkL29uLWRlbWFuZCAqLworCWNoYXIgcmVhZF9tb2RlOwkJLyogcmVhZCBtb2RlOiBQb2xsaW5nIG9yIGludGVycnVwdCAqLworCWNoYXIgcmVjZWl2ZV9vbmx5OwkvKiBkaXNhYmxlIHR4IGJ1ZmZlcnMgKi8KKwljaGFyIHR0eTsJCS8qIENyZWF0ZSBhIGZha2UgdHR5IGRldmljZSAqLworCXVuc2lnbmVkIHR0eV9tYWpvcjsJLyogTWFqb3IgbnVtYmVyIGZvciB3YW5waXBlIHR0eSBkZXZpY2UgKi8KKwl1bnNpZ25lZCB0dHlfbWlub3I7IAkvKiBNaW5vciBudW1iZXIgZm9yIHdhbnBpcGUgdHR5IGRldmljZSAqLworCXVuc2lnbmVkIHR0eV9tb2RlOwkvKiBUVFkgb3BlcmF0aW9uIG1vZGUgU1lOQyBvciBBU1lOQyAqLworCWNoYXIgYmFja3VwOwkJLyogQmFja3VwIE1vZGUgKi8KKwl1bnNpZ25lZCBod19vcHRbNF07CS8qIG90aGVyIGhhcmR3YXJlIG9wdGlvbnMgKi8KKwl1bnNpZ25lZCByZXNlcnZlZFs0XTsKKwkJCQkvKioqKioqIGFyYml0cmFyeSBkYXRhICoqKioqKioqKioqKioqKi8KKwl1bnNpZ25lZCBkYXRhX3NpemU7CS8qIGRhdGEgYnVmZmVyIHNpemUgKi8KKwl2b2lkKiBkYXRhOwkJLyogZGF0YSBidWZmZXIsIGUuZy4gZmlybXdhcmUgKi8KKwl1bmlvbgkJCS8qKioqKiogcHJvdG9jb2wtc3BlY2lmaWMgKioqKioqKioqKioqLworCXsKKwkJd2FuX3gyNV9jb25mX3QgeDI1OwkvKiBYLjI1IGNvbmZpZ3VyYXRpb24gKi8KKwkJd2FuX3BwcF9jb25mX3QgcHBwOwkvKiBQUFAgY29uZmlndXJhdGlvbiAqLworCQl3YW5fZnJfY29uZl90IGZyOwkvKiBmcmFtZSByZWxheSBjb25maWd1cmF0aW9uICovCisJCXdhbl9jaGRsY19jb25mX3QgY2hkbGM7CS8qIENpc2NvIEhETEMgY29uZmlndXJhdGlvbiAqLworCX0gdTsKK30gd2FuZGV2X2NvbmZfdDsKKworLyogJ2NvbmZpZ19pZCcgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJV0FOQ09ORklHX1gyNQkxMDEJLyogWC4yNSBsaW5rICovCisjZGVmaW5lCVdBTkNPTkZJR19GUgkxMDIJLyogZnJhbWUgcmVsYXkgbGluayAqLworI2RlZmluZQlXQU5DT05GSUdfUFBQCTEwMwkvKiBzeW5jaHJvbm91cyBQUFAgbGluayAqLworI2RlZmluZSBXQU5DT05GSUdfQ0hETEMJMTA0CS8qIENpc2NvIEhETEMgTGluayAqLworI2RlZmluZSBXQU5DT05GSUdfQlNDCTEwNQkvKiBCaVN5bmMgU3RyZWFtaW5nICovCisjZGVmaW5lIFdBTkNPTkZJR19IRExDCTEwNgkvKiBIRExDIFN1cHBvcnQgKi8KKyNkZWZpbmUgV0FOQ09ORklHX01QUFAgIDEwNwkvKiBNdWx0aSBQb3J0IFBQUCBvdmVyIFJBVyBDSERMQyAqLworCisvKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGRlZmluZXMuCisgKi8KKy8qIGdlbmVyYWwgb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfT0ZGCTAKKyNkZWZpbmUJV0FOT1BUX09OCTEKKyNkZWZpbmUJV0FOT1BUX05PCTAKKyNkZWZpbmUJV0FOT1BUX1lFUwkxCisKKy8qIGludGVyY2FjZSBvcHRpb25zICovCisjZGVmaW5lCVdBTk9QVF9SUzIzMgkwCisjZGVmaW5lCVdBTk9QVF9WMzUJMQorCisvKiBkYXRhIGVuY29kaW5nIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX05SWgkwCisjZGVmaW5lCVdBTk9QVF9OUlpJCTEKKyNkZWZpbmUJV0FOT1BUX0ZNMAkyCisjZGVmaW5lCVdBTk9QVF9GTTEJMworCisvKiBsaW5rIHR5cGUgb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUE9JTlRUT1BPSU5UCTAJLyogUlRTIGFsd2F5cyBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOT1BUX01VTFRJRFJPUAkxCS8qIFJUUyBpcyBhY3RpdmUgd2hlbiB0cmFuc21pdHRpbmcgKi8KKworLyogY2xvY2tpbmcgb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfRVhURVJOQUwJMAorI2RlZmluZQlXQU5PUFRfSU5URVJOQUwJMQorCisvKiBzdGF0aW9uIG9wdGlvbnMgKi8KKyNkZWZpbmUJV0FOT1BUX0RURQkJMAorI2RlZmluZQlXQU5PUFRfRENFCQkxCisjZGVmaW5lCVdBTk9QVF9DUEUJCTAKKyNkZWZpbmUJV0FOT1BUX05PREUJCTEKKyNkZWZpbmUJV0FOT1BUX1NFQ09OREFSWQkwCisjZGVmaW5lCVdBTk9QVF9QUklNQVJZCQkxCisKKy8qIGNvbm5lY3Rpb24gb3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUEVSTUFORU5UCTAJLyogRFRSIGFsd2F5cyBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOT1BUX1NXSVRDSEVECQkxCS8qIHVzZSBEVFIgdG8gc2V0dXAgbGluayAoZGlhbC11cCkgKi8KKyNkZWZpbmUJV0FOT1BUX09OREVNQU5ECQkyCS8qIGFjdGl2YXRlIERUUiBvbmx5IGJlZm9yZSBzZW5kaW5nICovCisKKy8qIGZyYW1lIHJlbGF5IGluLWNoYW5uZWwgc2lnbmFsbGluZyAqLworI2RlZmluZQlXQU5PUFRfRlJfQU5TSQkJMQkvKiBBTlNJIFQxLjYxNyBBbm5leCBEICovCisjZGVmaW5lCVdBTk9QVF9GUl9ROTMzCQkyCS8qIElUVSBRLjkzM0EgKi8KKyNkZWZpbmUJV0FOT1BUX0ZSX0xNSQkJMwkvKiBMTUkgKi8KKworLyogUFBQIElQIE1vZGUgT3B0aW9ucyAqLworI2RlZmluZQlXQU5PUFRfUFBQX1NUQVRJQwkwCisjZGVmaW5lCVdBTk9QVF9QUFBfSE9TVAkJMQorI2RlZmluZQlXQU5PUFRfUFBQX1BFRVIJCTIKKworLyogQVNZIE1vZGUgT3B0aW9ucyAqLworI2RlZmluZSBXQU5PUFRfT05FIAkJMQorI2RlZmluZSBXQU5PUFRfVFdPCQkyCisjZGVmaW5lIFdBTk9QVF9PTkVfQU5EX0hBTEYJMworCisjZGVmaW5lIFdBTk9QVF9OT05FCTAKKyNkZWZpbmUgV0FOT1BUX09ERCAgICAgIDEKKyNkZWZpbmUgV0FOT1BUX0VWRU4JMgorCisvKiBDSERMQyBQcm90b2NvbCBPcHRpb25zICovCisvKiBERiBDb21tbWVudGVkIG91dCBmb3Igbm93LgorCisjZGVmaW5lIFdBTk9QVF9DSERMQ19OT19EQ0QJCUlHTk9SRV9EQ0RfRk9SX0xJTktfU1RBVAorI2RlZmluZSBXQU5PUFRfQ0hETENfTk9fQ1RTCQlJR05PUkVfQ1RTX0ZPUl9MSU5LX1NUQVQKKyNkZWZpbmUgV0FOT1BUX0NIRExDX05PX0tFRVBBTElWRQlJR05PUkVfS1BBTFZfRk9SX0xJTktfU1RBVAorKi8KKworLyogUG9ydCBvcHRpb25zICovCisjZGVmaW5lIFdBTk9QVF9QUkkgMAorI2RlZmluZSBXQU5PUFRfU0VDIDEKKy8qIHJlYWQgbW9kZSAqLworI2RlZmluZQlXQU5PUFRfSU5UUgkwCisjZGVmaW5lIFdBTk9QVF9QT0xMCTEKKworCisjZGVmaW5lIFdBTk9QVF9UVFlfU1lOQyAgMAorI2RlZmluZSBXQU5PUFRfVFRZX0FTWU5DIDEKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV0FOIExpbmsgU3RhdHVzIEluZm8gKGZvciBST1VURVJfU1RBVCBJT0NUTCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHdhbmRldl9zdGF0Cit7CisJdW5zaWduZWQgc3RhdGU7CQkvKiBsaW5rIHN0YXRlICovCisJdW5zaWduZWQgbmRldjsJCS8qIG51bWJlciBvZiBjb25maWd1cmVkIGludGVyZmFjZXMgKi8KKworCS8qIGxpbmsvaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gKi8KKwl1bnNpZ25lZCBjb25uZWN0aW9uOwkvKiBwZXJtYW5lbnQvc3dpdGNoZWQvb24tZGVtYW5kICovCisJdW5zaWduZWQgbWVkaWFfdHlwZTsJLyogRnJhbWUgcmVsYXkvUFBQL1guMjUvU0RMQywgZXRjLiAqLworCXVuc2lnbmVkIG10dTsJCS8qIG1heC4gdHJhbnNtaXQgdW5pdCBmb3IgdGhpcyBkZXZpY2UgKi8KKworCS8qIHBoeXNpY2FsIGxldmVsIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCBtb2RlbV9zdGF0dXM7CS8qIG1vZGVtIHN0YXR1cyAqLworCXVuc2lnbmVkIHJ4X2ZyYW1lczsJLyogcmVjZWl2ZWQgZnJhbWVzIGNvdW50ICovCisJdW5zaWduZWQgcnhfb3ZlcnJ1bnM7CS8qIHJlY2VpdmVyIG92ZXJydW4gZXJyb3IgY291bnQgKi8KKwl1bnNpZ25lZCByeF9jcmNfZXJyOwkvKiByZWNlaXZlIENSQyBlcnJvciBjb3VudCAqLworCXVuc2lnbmVkIHJ4X2Fib3J0czsJLyogcmVjZWl2ZWQgYWJvcnRlZCBmcmFtZXMgY291bnQgKi8KKwl1bnNpZ25lZCByeF9iYWRfbGVuZ3RoOwkvKiB1bmV4cGV0ZWRseSBsb25nL3Nob3J0IGZyYW1lcyBjb3VudCAqLworCXVuc2lnbmVkIHJ4X2Ryb3BwZWQ7CS8qIGZyYW1lcyBkaXNjYXJkZWQgYXQgZGV2aWNlIGxldmVsICovCisJdW5zaWduZWQgdHhfZnJhbWVzOwkvKiB0cmFuc21pdHRlZCBmcmFtZXMgY291bnQgKi8KKwl1bnNpZ25lZCB0eF91bmRlcnJ1bnM7CS8qIGFib3J0ZWQgdHJhbnNtaXNzaW9ucyAodW5kZXJydW5zKSBjb3VudCAqLworCXVuc2lnbmVkIHR4X3RpbWVvdXRzOwkvKiB0cmFuc21pc3Npb24gdGltZW91dHMgKi8KKwl1bnNpZ25lZCB0eF9yZWplY3RzOwkvKiBvdGhlciB0cmFuc21pdCBlcnJvcnMgKi8KKworCS8qIG1lZGlhIGxldmVsIHN0YXRpc3RpY3MgKi8KKwl1bnNpZ25lZCByeF9iYWRfZm9ybWF0OwkvKiBmcmFtZXMgd2l0aCBpbnZhbGlkIGZvcm1hdCAqLworCXVuc2lnbmVkIHJ4X2JhZF9hZGRyOwkvKiBmcmFtZXMgd2l0aCBpbnZhbGlkIG1lZGlhIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCB0eF9yZXRyaWVzOwkvKiBmcmFtZXMgcmUtdHJhbnNtaXR0ZWQgKi8KKwl1bnNpZ25lZCByZXNlcnZlZFsxNl07CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHdhbmRldl9zdGF0X3Q7CisKKy8qICdzdGF0ZScgZGVmaW5lcyAqLworZW51bSB3YW5fc3RhdGVzCit7CisJV0FOX1VOQ09ORklHVVJFRCwJLyogbGluay9jaGFubmVsIGlzIG5vdCBjb25maWd1cmVkICovCisJV0FOX0RJU0NPTk5FQ1RFRCwJLyogbGluay9jaGFubmVsIGlzIGRpc2Nvbm5lY3RlZCAqLworCVdBTl9DT05ORUNUSU5HLAkJLyogY29ubmVjdGlvbiBpcyBpbiBwcm9ncmVzcyAqLworCVdBTl9DT05ORUNURUQsCQkvKiBsaW5rL2NoYW5uZWwgaXMgb3BlcmF0aW9uYWwgKi8KKwlXQU5fTElNSVQsCQkvKiBmb3IgdmVyaWZpY2F0aW9uIG9ubHkgKi8KKwlXQU5fRFVBTFBPUlQsCQkvKiBmb3IgRHVhbCBQb3J0IGNhcmRzICovCisJV0FOX0RJU0NPTk5FQ1RJTkcsCisJV0FOX0ZUMV9SRUFEWQkJLyogRlQxIENvbmZpZ3VyYXRvciBSZWFkeSAqLworfTsKKworZW51bSB7CisJV0FOX0xPQ0FMX0lQLAorCVdBTl9QT0lOVE9QT0lOVF9JUCwKKwlXQU5fTkVUTUFTS19JUCwKKwlXQU5fQlJPQURDQVNUX0lQCit9OworCisvKiAnbW9kZW1fc3RhdHVzJyBtYXNrcyAqLworI2RlZmluZQlXQU5fTU9ERU1fQ1RTCTB4MDAwMQkvKiBDVFMgbGluZSBhY3RpdmUgKi8KKyNkZWZpbmUJV0FOX01PREVNX0RDRAkweDAwMDIJLyogRENEIGxpbmUgYWN0aXZlICovCisjZGVmaW5lCVdBTl9NT0RFTV9EVFIJMHgwMDEwCS8qIERUUiBsaW5lIGFjdGl2ZSAqLworI2RlZmluZQlXQU5fTU9ERU1fUlRTCTB4MDAyMAkvKiBSVFMgbGluZSBhY3RpdmUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXQU4gaW50ZXJmYWNlIChsb2dpY2FsIGNoYW5uZWwpIGNvbmZpZ3VyYXRpb24gKGZvciBST1VURVJfSUZORVcgSU9DVEwpLgorICovCit0eXBlZGVmIHN0cnVjdCB3YW5pZl9jb25mCit7CisJdW5zaWduZWQgbWFnaWM7CQkJLyogbWFnaWMgbnVtYmVyICovCisJdW5zaWduZWQgY29uZmlnX2lkOwkJLyogY29uZmlndXJhdGlvbiBpZGVudGlmaWVyICovCisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwljaGFyIGFkZHJbV0FOX0FERFJFU1NfU1orMV07CS8qIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCWNoYXIgdXNlZGJ5W1VTRURfQllfRklFTERdOwkvKiB1c2VkIGJ5IEFQSSBvciBXQU5QSVBFICovCisJdW5zaWduZWQgaWRsZV90aW1lb3V0OwkJLyogc2VjLCBiZWZvcmUgZGlzY29ubmVjdGluZyAqLworCXVuc2lnbmVkIGhvbGRfdGltZW91dDsJCS8qIHNlYywgYmVmb3JlIHJlLWNvbm5lY3RpbmcgKi8KKwl1bnNpZ25lZCBjaXI7CQkJLyogQ29tbWl0dGVkIEluZm9ybWF0aW9uIFJhdGUgZndkLGJ3ZCovCisJdW5zaWduZWQgYmM7CQkJLyogQ29tbWl0dGVkIEJ1cnN0IFNpemUgZndkLCBid2QgKi8KKwl1bnNpZ25lZCBiZTsJCQkvKiBFeGNlc3MgQnVyc3QgU2l6ZSBmd2QsIGJ3ZCAqLyAKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFg7CS8qIEVuYWJsZSBvciBEaXNhYmxlIElQWCAqLworCXVuc2lnbmVkIGNoYXIgaW5hcnA7CQkvKiBTZW5kIEludmVyc2UgQVJQIHJlcXVlc3RzIFkvTiAqLworCXVuc2lnbmVkIGluYXJwX2ludGVydmFsOwkvKiBzZWMsIGJldHdlZW4gSW5BUlAgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyOwkvKiBOZXR3b3JrIE51bWJlciBmb3IgSVBYICovCisJY2hhciBtYzsJCQkvKiBNdWx0aWNhc3Qgb24gb3Igb2ZmICovCisJY2hhciBsb2NhbF9hZGRyW1dBTl9BRERSRVNTX1NaKzFdOy8qIGxvY2FsIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCXVuc2lnbmVkIGNoYXIgcG9ydDsJCS8qIGJvYXJkIHBvcnQgKi8KKwl1bnNpZ25lZCBjaGFyIHByb3RvY29sOwkJLyogcHJvY29jb2wgdXNlZCBpbiB0aGlzIGNoYW5uZWwgKFRDUE9YMjUgb3IgWDI1KSAqLworCWNoYXIgcGFwOwkJCS8qIFBBUCBlbmFibGVkIG9yIGRpc2FibGVkICovCisJY2hhciBjaGFwOwkJCS8qIENIQVAgZW5hYmxlZCBvciBkaXNhYmxlZCAqLworCXVuc2lnbmVkIGNoYXIgdXNlcmlkWzUxMV07CS8qIExpc3Qgb2YgVXNlciBJZCAqLworCXVuc2lnbmVkIGNoYXIgcGFzc3dkWzUxMV07CS8qIExpc3Qgb2YgcGFzc3dvcmRzICovCisJdW5zaWduZWQgY2hhciBzeXNuYW1lWzMxXTsJLyogTmFtZSBvZiB0aGUgc3lzdGVtICovCisJdW5zaWduZWQgY2hhciBpZ25vcmVfZGNkOwkvKiBQcm90b2NvbCBvcHRpb25zOiAqLworCXVuc2lnbmVkIGNoYXIgaWdub3JlX2N0czsJLyogIElnbm9yZSB0aGVzZSB0byBkZXRlcm1pbmUgKi8KKwl1bnNpZ25lZCBjaGFyIGlnbm9yZV9rZWVwYWxpdmU7CS8qICBsaW5rIHN0YXR1cyAoWWVzIG9yIE5vKSAqLworCXVuc2lnbmVkIGNoYXIgaGRsY19zdHJlYW1pbmc7CS8qICBIZGxjIHN0cmVhbWluZyBtb2RlIChZL04pICovCisJdW5zaWduZWQga2VlcGFsaXZlX3R4X3RtcjsJLyogdHJhbnNtaXQga2VlcGFsaXZlIHRpbWVyICovCisJdW5zaWduZWQga2VlcGFsaXZlX3J4X3RtcjsJLyogcmVjZWl2ZSAga2VlcGFsaXZlIHRpbWVyICovCisJdW5zaWduZWQga2VlcGFsaXZlX2Vycl9tYXJnaW47CS8qIGtlZXBhbGl2ZV9lcnJvcl90b2xlcmFuY2UgKi8KKwl1bnNpZ25lZCBzbGFycF90aW1lcjsJCS8qIFNMQVJQIHJlcXVlc3QgdGltZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHR0bDsJCS8qIFRpbWUgVG8gTGl2ZSBmb3IgVURQIHNlY3VyaXR5ICovCisJY2hhciBpbnRlcmZhY2U7CQkJLyogUlMtMjMyL1YuMzUsIGV0Yy4gKi8KKwljaGFyIGNsb2NraW5nOwkJCS8qIGV4dGVybmFsL2ludGVybmFsICovCisJdW5zaWduZWQgYnBzOwkJCS8qIGRhdGEgdHJhbnNmZXIgcmF0ZSAqLworCXVuc2lnbmVkIG10dTsJCQkvKiBtYXhpbXVtIHRyYW5zbWl0IHVuaXQgc2l6ZSAqLworCXVuc2lnbmVkIGNoYXIgaWZfZG93bjsJCS8qIGJyaW5kIGRvd24gaW50ZXJmYWNlIHdoZW4gZGlzY29ubmVjdGVkICovCisJdW5zaWduZWQgY2hhciBnYXRld2F5OwkJLyogSXMgdGhpcyBpbnRlcmZhY2UgYSBnYXRld2F5ICovCisJdW5zaWduZWQgY2hhciB0cnVlX2lmX2VuY29kaW5nOwkvKiBTZXQgdGhlIGRldi0+dHlwZSB0byB0cnVlIGJvYXJkIHByb3RvY29sICovCisKKwl1bnNpZ25lZCBjaGFyIGFzeV9kYXRhX3RyYW5zOyAgICAgLyogYXN5bmMgQVBJIG9wdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBydHNfaHNfZm9yX3JlY2VpdmU7IC8qIGFzeW5jIFByb3RvY29sIG9wdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciB4b25feG9mZl9oc19mb3JfcmVjZWl2ZTsKKwl1bnNpZ25lZCBjaGFyIHhvbl94b2ZmX2hzX2Zvcl90cmFuc21pdDsKKwl1bnNpZ25lZCBjaGFyIGRjZF9oc19mb3JfdHJhbnNtaXQ7CisJdW5zaWduZWQgY2hhciBjdHNfaHNfZm9yX3RyYW5zbWl0OworCXVuc2lnbmVkIGNoYXIgYXN5bmNfbW9kZTsKKwl1bnNpZ25lZCB0eF9iaXRzX3Blcl9jaGFyOworCXVuc2lnbmVkIHJ4X2JpdHNfcGVyX2NoYXI7CisJdW5zaWduZWQgc3RvcF9iaXRzOyAgCisJdW5zaWduZWQgY2hhciBwYXJpdHk7CisgCXVuc2lnbmVkIGJyZWFrX3RpbWVyOworICAgICAgICB1bnNpZ25lZCBpbnRlcl9jaGFyX3RpbWVyOworCXVuc2lnbmVkIHJ4X2NvbXBsZXRlX2xlbmd0aDsKKwl1bnNpZ25lZCB4b25fY2hhcjsKKwl1bnNpZ25lZCB4b2ZmX2NoYXI7CisJdW5zaWduZWQgY2hhciByZWNlaXZlX29ubHk7CS8qICBubyB0cmFuc21pdCBidWZmZXJpbmcgKFkvTikgKi8KK30gd2FuaWZfY29uZl90OworCisjZW5kaWYJLyogX1JPVVRFUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjMGM2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaApAQCAtMCwwICsxLDU1IEBACisvKgorICoJR2VuZXJpYyB3YXRjaGRvZyBkZWZpbmVzLiBEZXJpdmVkIGZyb20uLgorICoKKyAqIEJlcmtzaGlyZSBQQyBXYXRjaGRvZyBEZWZpbmVzCisgKiBieSBLZW4gSG9sbGlzIDxraG9sbGlzQGJpdGdhdGUuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9XQVRDSERPR19ICisjZGVmaW5lIF9MSU5VWF9XQVRDSERPR19ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUJV0FUQ0hET0dfSU9DVExfQkFTRQknVycKKworc3RydWN0IHdhdGNoZG9nX2luZm8geworCV9fdTMyIG9wdGlvbnM7CQkvKiBPcHRpb25zIHRoZSBjYXJkL2RyaXZlciBzdXBwb3J0cyAqLworCV9fdTMyIGZpcm13YXJlX3ZlcnNpb247CS8qIEZpcm13YXJlIHZlcnNpb24gb2YgdGhlIGNhcmQgKi8KKwlfX3U4ICBpZGVudGl0eVszMl07CS8qIElkZW50aXR5IG9mIHRoZSBib2FyZCAqLworfTsKKworI2RlZmluZQlXRElPQ19HRVRTVVBQT1JUCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMCwgc3RydWN0IHdhdGNoZG9nX2luZm8pCisjZGVmaW5lCVdESU9DX0dFVFNUQVRVUwkJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCAxLCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVEJPT1RTVEFUVVMJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCAyLCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVFRFTVAJCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgMywgaW50KQorI2RlZmluZQlXRElPQ19TRVRPUFRJT05TCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNCwgaW50KQorI2RlZmluZQlXRElPQ19LRUVQQUxJVkUJCV9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNSwgaW50KQorI2RlZmluZQlXRElPQ19TRVRUSU1FT1VUICAgICAgICBfSU9XUihXQVRDSERPR19JT0NUTF9CQVNFLCA2LCBpbnQpCisjZGVmaW5lCVdESU9DX0dFVFRJTUVPVVQgICAgICAgIF9JT1IoV0FUQ0hET0dfSU9DVExfQkFTRSwgNywgaW50KQorI2RlZmluZQlXRElPQ19TRVRQUkVUSU1FT1VUCV9JT1dSKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDgsIGludCkKKyNkZWZpbmUJV0RJT0NfR0VUUFJFVElNRU9VVAlfSU9SKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDksIGludCkKKyNkZWZpbmUJV0RJT0NfR0VUVElNRUxFRlQJX0lPUihXQVRDSERPR19JT0NUTF9CQVNFLCAxMCwgaW50KQorCisjZGVmaW5lCVdESU9GX1VOS05PV04JCS0xCS8qIFVua25vd24gZmxhZyBlcnJvciAqLworI2RlZmluZQlXRElPU19VTktOT1dOCQktMQkvKiBVbmtub3duIHN0YXR1cyBlcnJvciAqLworCisjZGVmaW5lCVdESU9GX09WRVJIRUFUCQkweDAwMDEJLyogUmVzZXQgZHVlIHRvIENQVSBvdmVyaGVhdCAqLworI2RlZmluZQlXRElPRl9GQU5GQVVMVAkJMHgwMDAyCS8qIEZhbiBmYWlsZWQgKi8KKyNkZWZpbmUJV0RJT0ZfRVhURVJOMQkJMHgwMDA0CS8qIEV4dGVybmFsIHJlbGF5IDEgKi8KKyNkZWZpbmUJV0RJT0ZfRVhURVJOMgkJMHgwMDA4CS8qIEV4dGVybmFsIHJlbGF5IDIgKi8KKyNkZWZpbmUJV0RJT0ZfUE9XRVJVTkRFUgkweDAwMTAJLyogUG93ZXIgYmFkL3Bvd2VyIGZhdWx0ICovCisjZGVmaW5lCVdESU9GX0NBUkRSRVNFVAkJMHgwMDIwCS8qIENhcmQgcHJldmlvdXNseSByZXNldCB0aGUgQ1BVICovCisjZGVmaW5lCVdESU9GX1BPV0VST1ZFUgkJMHgwMDQwCS8qIFBvd2VyIG92ZXIgdm9sdGFnZSAqLworI2RlZmluZQlXRElPRl9TRVRUSU1FT1VUCTB4MDA4MCAgLyogU2V0IHRpbWVvdXQgKGluIHNlY29uZHMpICovCisjZGVmaW5lCVdESU9GX01BR0lDQ0xPU0UJMHgwMTAwCS8qIFN1cHBvcnRzIG1hZ2ljIGNsb3NlIGNoYXIgKi8KKyNkZWZpbmUJV0RJT0ZfUFJFVElNRU9VVAkweDAyMDAgIC8qIFByZXRpbWVvdXQgKGluIHNlY29uZHMpLCBnZXQvc2V0ICovCisjZGVmaW5lCVdESU9GX0tFRVBBTElWRVBJTkcJMHg4MDAwCS8qIEtlZXAgYWxpdmUgcGluZyByZXBseSAqLworCisjZGVmaW5lCVdESU9TX0RJU0FCTEVDQVJECTB4MDAwMQkvKiBUdXJuIG9mZiB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKyNkZWZpbmUJV0RJT1NfRU5BQkxFQ0FSRAkweDAwMDIJLyogVHVybiBvbiB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKyNkZWZpbmUJV0RJT1NfVEVNUFBBTklDCQkweDAwMDQJLyogS2VybmVsIHBhbmljIG9uIHRlbXBlcmF0dXJlIHRyaXAgKi8KKworCisjZW5kaWYgIC8qIGlmbmRlZiBfTElOVVhfV0FUQ0hET0dfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC93aXJlbGVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDQ0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3dpcmVsZXNzLmgKQEAgLTAsMCArMSwxMTExIEBACisvKgorICogVGhpcyBmaWxlIGRlZmluZSBhIHNldCBvZiBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb25zCisgKgorICogVmVyc2lvbiA6CTIyCTE2LjMuMDcKKyAqCisgKiBBdXRob3JzIDoJSmVhbiBUb3VycmlsaGVzIC0gSFBMIC0gPGp0QGhwbC5ocC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNyBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfTElOVVhfV0lSRUxFU1NfSAorI2RlZmluZSBfTElOVVhfV0lSRUxFU1NfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBJbml0aWFsIEFQSXMgKDE5OTYgLT4gb253YXJkKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmFzaWNhbGx5LCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyBhcmUgZm9yIG5vdyBhIHNldCBvZiBzdGFuZGFyZCBpb2N0bAorICogY2FsbCArIC9wcm9jL25ldC93aXJlbGVzcworICoKKyAqIFRoZSBlbnRyeSAvcHJvYy9uZXQvd2lyZWxlc3MgZ2l2ZSBzdGF0aXN0aWNzIGFuZCBpbmZvcm1hdGlvbiBvbiB0aGUKKyAqIGRyaXZlci4KKyAqIFRoaXMgaXMgYmV0dGVyIHRoYW4gaGF2aW5nIGVhY2ggZHJpdmVyIGhhdmluZyBpdHMgZW50cnkgYmVjYXVzZQorICogaXRzIGNlbnRyYWxpc2VkIGFuZCB3ZSBtYXkgcmVtb3ZlIHRoZSBkcml2ZXIgbW9kdWxlIHNhZmVseS4KKyAqCisgKiBJb2N0bCBhcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGRyaXZlciBhbmQgaXNzdWUgY29tbWFuZHMuICBUaGlzIGlzCisgKiBiZXR0ZXIgdGhhbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBvZiBpbnNtb2QgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworICogY2hhbmdlIGR5bmFtaWNhbGx5ICh3aGlsZSB0aGUgZHJpdmVyIGlzIHJ1bm5pbmcpIHNvbWUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGUgaW9jdGwgbWVjaGFuaW1zbSBhcmUgY29waWVkIGZyb20gc3RhbmRhcmQgZGV2aWNlcyBpb2N0bC4KKyAqIFdlIGhhdmUgdGhlIGxpc3Qgb2YgY29tbWFuZCBwbHVzIGEgc3RydWN0dXJlIGRlc2NpYmluZyB0aGUKKyAqIGRhdGEgZXhjaGFuZ2VkLi4uCisgKiBOb3RlIHRoYXQgdG8gYWRkIHRoZXNlIGlvY3RsLCBJIHdhcyBvYmxpZ2VkIHRvIG1vZGlmeSA6CisgKgkjIG5ldC9jb3JlL2Rldi5jICh0d28gcGxhY2UgKyBhZGQgaW5jbHVkZSkKKyAqCSMgbmV0L2lwdjQvYWZfaW5ldC5jIChvbmUgcGxhY2UgKyBhZGQgaW5jbHVkZSkKKyAqCisgKiAvcHJvYy9uZXQvd2lyZWxlc3MgaXMgYSBjb3B5IG9mIC9wcm9jL25ldC9kZXYuCisgKiBXZSBoYXZlIGEgc3RydWN0dXJlIGZvciBkYXRhIHBhc3NlZCBmcm9tIHRoZSBkcml2ZXIgdG8gL3Byb2MvbmV0L3dpcmVsZXNzCisgKiBUb28gYWRkIHRoaXMsIEkndmUgbW9kaWZpZWQgOgorICoJIyBuZXQvY29yZS9kZXYuYyAodHdvIG90aGVyIHBsYWNlcykKKyAqCSMgaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCAob25lIHBsYWNlKQorICoJIyBpbmNsdWRlL2xpbnV4L3Byb2NfZnMuaCAob25lIHBsYWNlKQorICoKKyAqIE5ldyBkcml2ZXIgQVBJICgyMDAyIC0+IG9ud2FyZCkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmaWxlIGlzIG9ubHkgY29uY2VybmVkIHdpdGggdGhlIHVzZXIgc3BhY2UgQVBJIGFuZCBjb21tb24gZGVmaW5pdGlvbnMuCisgKiBUaGUgbmV3IGRyaXZlciBBUEkgaXMgZGVmaW5lZCBhbmQgZG9jdW1lbnRlZCBpbiA6CisgKgkjIGluY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaAorICoKKyAqIE5vdGUgYXMgd2VsbCB0aGF0IC9wcm9jL25ldC93aXJlbGVzcyBpbXBsZW1lbnRhdGlvbiBoYXMgbm93IG1vdmVkIGluIDoKKyAqCSMgbmV0L2NvcmUvd2lyZWxlc3MuYworICoKKyAqIFdpcmVsZXNzIEV2ZW50cyAoMjAwMiAtPiBvbndhcmQpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFdmVudHMgYXJlIGRlZmluZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUsIGFuZCBpbXBsZW1lbnRlZCBpbiA6CisgKgkjIG5ldC9jb3JlL3dpcmVsZXNzLmMKKyAqCisgKiBPdGhlciBjb21tZW50cyA6CisgKiAtLS0tLS0tLS0tLS0tLQorICogRG8gbm90IGFkZCBoZXJlIHRoaW5ncyB0aGF0IGFyZSByZWR1bmRhbnQgd2l0aCBvdGhlciBtZWNoYW5pc21zCisgKiAoZHJpdmVycyBpbml0LCBpZmNvbmZpZywgL3Byb2MvbmV0L2RldiwgLi4uKSBhbmQgd2l0aCBhcmUgbm90CisgKiB3aXJlbGVzcyBzcGVjaWZpYy4KKyAqCisgKiBUaGVzZSB3aXJlbGVzcyBleHRlbnNpb25zIGFyZSBub3QgbWFnaWMgOiBlYWNoIGRyaXZlciBoYXMgdG8gcHJvdmlkZQorICogc3VwcG9ydCBmb3IgdGhlbS4uLgorICoKKyAqIElNUE9SVEFOVCBOT1RFIDogQXMgZXZlcnl0aGluZyBpbiB0aGUga2VybmVsLCB0aGlzIGlzIHZlcnkgbXVjaCBhCisgKiB3b3JrIGluIHByb2dyZXNzLiBDb250YWN0IG1lIGlmIHlvdSBoYXZlIGlkZWFzIG9mIGltcHJvdmVtZW50cy4uLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBoZWFkZXIgaXMgdXNlZCBpbiB1c2VyLXNwYWNlLCB0aGVyZWZvcmUgbmVlZCB0byBiZSBzYW5pdGlzZWQKKyAqIGZvciB0aGF0IHB1cnBvc2UuIFRob3NlIGluY2x1ZGVzIGFyZSB1c3VhbGx5IG5vdCBjb21wYXRpYmxlIHdpdGggZ2xpYmMuCisgKiBUbyBrbm93IHdoaWNoIGluY2x1ZGVzIHRvIHVzZSBpbiB1c2VyLXNwYWNlLCBjaGVjayBpd2xpYi5oLiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkVSU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgdG8ga25vdyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSB3aXJlbGVzcworICogZXh0ZW5zaW9ucyBhbmQgdG8ga25vdyB3aGljaCB2ZXJzaW9uIG9mIHdpcmVsZXNzIGV4dGVuc2lvbnMgaXQgaXMKKyAqICh0aGVyZSBpcyBzb21lIHN0dWZmIHRoYXQgd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLi4uKQorICogSSBqdXN0IHBsYW4gdG8gaW5jcmVtZW50IHdpdGggZWFjaCBuZXcgdmVyc2lvbi4KKyAqLworI2RlZmluZSBXSVJFTEVTU19FWFQJMjIKKworLyoKKyAqIENoYW5nZXMgOgorICoKKyAqIFYyIHRvIFYzCisgKiAtLS0tLS0tLQorICoJQWxhbiBDb3ggc3RhcnQgc29tZSBpbmNvbXBhdGlibGVzIGNoYW5nZXMuIEkndmUgaW50ZWdyYXRlZCBhIGJpdCBtb3JlLgorICoJLSBFbmNyeXB0aW9uIHJlbmFtZWQgdG8gRW5jb2RlIHRvIGF2b2lkIFVTIHJlZ3VsYXRpb24gcHJvYmxlbXMKKyAqCS0gRnJlcXVlbmN5IGNoYW5nZWQgZnJvbSBmbG9hdCB0byBzdHJ1Y3QgdG8gYXZvaWQgcHJvYmxlbXMgb24gb2xkIDM4NgorICoKKyAqIFYzIHRvIFY0CisgKiAtLS0tLS0tLQorICoJLSBBZGQgc2Vuc2l0aXZpdHkKKyAqCisgKiBWNCB0byBWNQorICogLS0tLS0tLS0KKyAqCS0gTWlzc2luZyBlbmNvZGluZyBkZWZpbml0aW9ucyBpbiByYW5nZQorICoJLSBBY2Nlc3MgcG9pbnRzIHN0dWZmCisgKgorICogVjUgdG8gVjYKKyAqIC0tLS0tLS0tCisgKgktIDgwMi4xMSBzdXBwb3J0IChFU1NJRCBpb2N0bHMpCisgKgorICogVjYgdG8gVjcKKyAqIC0tLS0tLS0tCisgKgktIGRlZmluZSBJV19FU1NJRF9NQVhfU0laRSBhbmQgSVdfTUFYX0FQCisgKgorICogVjcgdG8gVjgKKyAqIC0tLS0tLS0tCisgKgktIENoYW5nZWQgbXkgZS1tYWlsIGFkZHJlc3MKKyAqCS0gTW9yZSA4MDIuMTEgc3VwcG9ydCAobmlja25hbWUsIHJhdGUsIHJ0cywgZnJhZykKKyAqCS0gTGlzdCBpbmRleCBpbiBmcmVxdWVuY2llcworICoKKyAqIFY4IHRvIFY5CisgKiAtLS0tLS0tLQorICoJLSBTdXBwb3J0IGZvciAnbW9kZSBvZiBvcGVyYXRpb24nIChhZC1ob2MsIG1hbmFnZWQuLi4pCisgKgktIFN1cHBvcnQgZm9yIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBwb3dlciBzYXZpbmcKKyAqCS0gQ2hhbmdlIGVuY29kaW5nIHRvIHN1cHBvcnQgbGFyZ2VyIHRva2VucyAoPjY0IGJpdHMpCisgKgktIFVwZGF0ZWQgaXdfcGFyYW1zIChkaXNhYmxlLCBmbGFncykgYW5kIHVzZSBpdCBmb3IgTldJRAorICoJLSBFeHRyYWN0ZWQgaXdfcG9pbnQgZnJvbSBpd3JlcSBmb3IgY2xhcml0eQorICoKKyAqIFY5IHRvIFYxMAorICogLS0tLS0tLS0tCisgKgktIEFkZCBQTSBjYXBhYmlsaXR5IHRvIHJhbmdlIHN0cnVjdHVyZQorICoJLSBBZGQgUE0gbW9kaWZpZXIgOiBNQVgvTUlOL1JFTEFUSVZFCisgKgktIEFkZCBlbmNvZGluZyBvcHRpb24gOiBJV19FTkNPREVfTk9LRVkKKyAqCS0gQWRkIFR4UG93ZXIgaW9jdGxzICh3b3JrIGxpa2UgVHhSYXRlKQorICoKKyAqIFYxMCB0byBWMTEKKyAqIC0tLS0tLS0tLS0KKyAqCS0gQWRkIFdFIHZlcnNpb24gaW4gcmFuZ2UgKGhlbHAgYmFja3dhcmQvZm9yd2FyZCBjb21wYXRpYmlsaXR5KQorICoJLSBBZGQgcmV0cnkgaW9jdGxzICh3b3JrIGxpa2UgUE0pCisgKgorICogVjExIHRvIFYxMgorICogLS0tLS0tLS0tLQorICoJLSBBZGQgU0lPQ1NJV1NUQVRTIHRvIGdldCAvcHJvYy9uZXQvd2lyZWxlc3MgcHJvZ3JhbWF0aWNhbGx5CisgKgktIEFkZCBERVYgUFJJVkFURSBJT0NUTCB0byBhdm9pZCBjb2xsaXNpb25zIGluIFNJT0NERVZQUklWQVRFIHNwYWNlCisgKgktIEFkZCBuZXcgc3RhdGlzdGljcyAoZnJhZywgcmV0cnksIGJlYWNvbikKKyAqCS0gQWRkIGF2ZXJhZ2UgcXVhbGl0eSAoZm9yIHVzZXIgc3BhY2UgY2FsaWJyYXRpb24pCisgKgorICogVjEyIHRvIFYxMworICogLS0tLS0tLS0tLQorICoJLSBEb2N1bWVudCBjcmVhdGlvbiBvZiBuZXcgZHJpdmVyIEFQSS4KKyAqCS0gRXh0cmFjdCB1bmlvbiBpd3JlcV9kYXRhIGZyb20gc3RydWN0IGl3cmVxIChmb3IgbmV3IGRyaXZlciBBUEkpLgorICoJLSBSZW5hbWUgU0lPQ1NJV05BTUUgYXMgU0lPQ1NJV0NPTU1JVAorICoKKyAqIFYxMyB0byBWMTQKKyAqIC0tLS0tLS0tLS0KKyAqCS0gV2lyZWxlc3MgRXZlbnRzIHN1cHBvcnQgOiBkZWZpbmUgc3RydWN0IGl3X2V2ZW50CisgKgktIERlZmluZSBhZGRpdGlvbmFsIHNwZWNpZmljIGV2ZW50IG51bWJlcnMKKyAqCS0gQWRkICJhZGRyIiBhbmQgInBhcmFtIiBmaWVsZHMgaW4gdW5pb24gaXdyZXFfZGF0YQorICoJLSBBUCBzY2FubmluZyBzdHVmZiAoU0lPQ1NJV1NDQU4gYW5kIGZyaWVuZHMpCisgKgorICogVjE0IHRvIFYxNQorICogLS0tLS0tLS0tLQorICoJLSBBZGQgSVdfUFJJVl9UWVBFX0FERFIgZm9yIHN0cnVjdCBzb2NrYWRkciBwcml2YXRlIGFyZworICoJLSBNYWtlIHN0cnVjdCBpd19mcmVxIHNpZ25lZCAoYm90aCBtICYgZSksIGFkZCBleHBsaWNpdCBwYWRkaW5nCisgKgktIEFkZCBJV0VWQ1VTVE9NIGZvciBkcml2ZXIgc3BlY2lmaWMgZXZlbnQvc2Nhbm5pbmcgdG9rZW4KKyAqCS0gQWRkIElXX01BWF9HRVRfU1BZIGZvciBkcml2ZXIgcmV0dXJuaW5nIGEgbG90IG9mIGFkZHJlc3NlcworICoJLSBBZGQgSVdfVFhQT1dfUkFOR0UgZm9yIHJhbmdlIG9mIFR4IFBvd2VycworICoJLSBBZGQgSVdFVlJFR0lTVEVSRUQgJiBJV0VWRVhQSVJFRCBldmVudHMgZm9yIEFjY2VzcyBQb2ludHMKKyAqCS0gQWRkIElXX01PREVfTU9OSVRPUiBmb3IgcGFzc2l2ZSBtb25pdG9yCisgKgorICogVjE1IHRvIFYxNgorICogLS0tLS0tLS0tLQorICoJLSBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGJpdHJhdGVzIGluIGl3X3JhbmdlIHRvIDMyIChmb3IgODAyLjExZykKKyAqCS0gSW5jcmVhc2UgdGhlIG51bWJlciBvZiBmcmVxdWVuY2llcyBpbiBpd19yYW5nZSB0byAzMiAoZm9yIDgwMi4xMWIrYSkKKyAqCS0gUmVzaHVmZmxlIHN0cnVjdCBpd19yYW5nZSBmb3IgaW5jcmVhc2VzLCBhZGQgZmlsbGVyCisgKgktIEluY3JlYXNlIElXX01BWF9BUCB0byA2NCBmb3IgZHJpdmVyIHJldHVybmluZyBhIGxvdCBvZiBhZGRyZXNzZXMKKyAqCS0gUmVtb3ZlIElXX01BWF9HRVRfU1BZIGJlY2F1c2UgY29uZmxpY3Qgd2l0aCBlbmhhbmNlZCBzcHkgc3VwcG9ydAorICoJLSBBZGQgU0lPQ1NJV1RIUlNQWS9TSU9DR0lXVEhSU1BZIGFuZCAic3RydWN0IGl3X3RocnNweSIKKyAqCS0gQWRkIElXX0VOQ09ERV9URU1QIGFuZCBpd19yYW5nZS0+ZW5jb2RpbmdfbG9naW5faW5kZXgKKyAqCisgKiBWMTYgdG8gVjE3CisgKiAtLS0tLS0tLS0tCisgKgktIEFkZCBmbGFncyB0byBmcmVxdWVuY3kgLT4gYXV0by9maXhlZAorICoJLSBEb2N1bWVudCAoc3RydWN0IGl3X3F1YWxpdHkgKiktPnVwZGF0ZWQsIGFkZCBuZXcgZmxhZ3MgKElOVkFMSUQpCisgKgktIFdpcmVsZXNzIEV2ZW50IGNhcGFiaWxpdHkgaW4gc3RydWN0IGl3X3JhbmdlCisgKgktIEFkZCBzdXBwb3J0IGZvciByZWxhdGl2ZSBUeFBvd2VyICh5aWNrICEpCisgKgorICogVjE3IHRvIFYxOCAoRnJvbSBKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPikKKyAqIC0tLS0tLS0tLS0KKyAqCS0gQWRkIHN1cHBvcnQgZm9yIFdQQS9XUEEyCisgKgktIEFkZCBleHRlbmRlZCBlbmNvZGluZyBjb25maWd1cmF0aW9uIChTSU9DU0lXRU5DT0RFRVhUIGFuZAorICoJICBTSU9DR0lXRU5DT0RFRVhUKQorICoJLSBBZGQgU0lPQ1NJV0dFTklFL1NJT0NHSVdHRU5JRQorICoJLSBBZGQgU0lPQ1NJV01MTUUKKyAqCS0gQWRkIFNJT0NTSVdQTUtTQQorICoJLSBBZGQgc3RydWN0IGl3X3JhbmdlIGJpdCBmaWVsZCBmb3Igc3VwcG9ydGVkIGVuY29kaW5nIGNhcGFiaWxpdGllcworICoJLSBBZGQgb3B0aW9uYWwgc2NhbiByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIFNJT0NTSVdTQ0FOCisgKgktIEFkZCBTSU9DU0lXQVVUSC9TSU9DR0lXQVVUSCBmb3Igc2V0dGluZyBhdXRoZW50aWNhdGlvbiBhbmQgV1BBCisgKgkgIHJlbGF0ZWQgcGFyYW1ldGVycyAoZXh0ZW5zaWJsZSB1cCB0byA0MDk2IHBhcmFtZXRlciB2YWx1ZXMpCisgKgktIEFkZCB3aXJlbGVzcyBldmVudHM6IElXRVZHRU5JRSwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLAorICoJICBJV0VWQVNTT0NSRVFJRSwgSVdFVkFTU09DUkVTUElFLCBJV0VWUE1LSURDQU5ECisgKgorICogVjE4IHRvIFYxOQorICogLS0tLS0tLS0tLQorICoJLSBSZW1vdmUgKHN0cnVjdCBpd19wb2ludCAqKS0+cG9pbnRlciBmcm9tIGV2ZW50cyBhbmQgc3RyZWFtcworICoJLSBSZW1vdmUgaGVhZGVyIGluY2x1ZGVzIHRvIGhlbHAgdXNlciBzcGFjZQorICoJLSBJbmNyZWFzZSBJV19FTkNPRElOR19UT0tFTl9NQVggZnJvbSAzMiB0byA2NAorICoJLSBBZGQgSVdfUVVBTF9BTExfVVBEQVRFRCBhbmQgSVdfUVVBTF9BTExfSU5WQUxJRCBtYWNyb3MKKyAqCS0gQWRkIGV4cGxpY2l0IGZsYWcgdG8gdGVsbCBzdGF0cyBhcmUgaW4gZEJtIDogSVdfUVVBTF9EQk0KKyAqCS0gQWRkIElXX0lPQ1RMX0lEWCgpIGFuZCBJV19FVkVOVF9JRFgoKSBtYWNyb3MKKyAqCisgKiBWMTkgdG8gVjIwCisgKiAtLS0tLS0tLS0tCisgKgktIFJ0TmV0bGluayByZXF1ZXN0cyBzdXBwb3J0IChTRVQvR0VUKQorICoKKyAqIFYyMCB0byBWMjEKKyAqIC0tLS0tLS0tLS0KKyAqCS0gUmVtb3ZlIChzdHJ1Y3QgbmV0X2RldmljZSAqKS0+Z2V0X3dpcmVsZXNzX3N0YXRzKCkKKyAqCS0gQ2hhbmdlIGxlbmd0aCBpbiBFU1NJRCBhbmQgTklDSyB0byBzdHJsZW4oKSBpbnN0ZWFkIG9mIHN0cmxlbigpKzEKKyAqCS0gQWRkIElXX1JFVFJZX1NIT1JUL0lXX1JFVFJZX0xPTkcgcmV0cnkgbW9kaWZpZXJzCisgKgktIFBvd2VyL1JldHJ5IHJlbGF0aXZlIHZhbHVlcyBubyBsb25nZXIgKiAxMDAwMDAKKyAqCS0gQWRkIGV4cGxpY2l0IGZsYWcgdG8gdGVsbCBzdGF0cyBhcmUgaW4gODAyLjExayBSQ1BJIDogSVdfUVVBTF9SQ1BJCisgKgorICogVjIxIHRvIFYyMgorICogLS0tLS0tLS0tLQorICoJLSBQcmV2ZW50IGxlYWtpbmcgb2Yga2VybmVsIHNwYWNlIGluIHN0cmVhbSBvbiA2NCBiaXRzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBMSVNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFdpcmVsZXNzIElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIFNJT0NTSVdDT01NSVQJMHg4QjAwCQkvKiBDb21taXQgcGVuZGluZyBjaGFuZ2VzIHRvIGRyaXZlciAqLworI2RlZmluZSBTSU9DR0lXTkFNRQkweDhCMDEJCS8qIGdldCBuYW1lID09IHdpcmVsZXNzIHByb3RvY29sICovCisvKiBTSU9DR0lXTkFNRSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgV2lyZWxlc3MgRXh0ZW5zaW9ucy4KKyAqIENvbW1vbiB2YWx1ZXMgOiAiSUVFRSA4MDIuMTEtRFMiLCAiSUVFRSA4MDIuMTEtRkgiLCAiSUVFRSA4MDIuMTFiIi4uLgorICogRG9uJ3QgcHV0IHRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyIHRoZXJlLCBpdCdzIHVzZWxlc3MuICovCisKKy8qIEJhc2ljIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgU0lPQ1NJV05XSUQJMHg4QjAyCQkvKiBzZXQgbmV0d29yayBpZCAocHJlLTgwMi4xMSkgKi8KKyNkZWZpbmUgU0lPQ0dJV05XSUQJMHg4QjAzCQkvKiBnZXQgbmV0d29yayBpZCAodGhlIGNlbGwpICovCisjZGVmaW5lIFNJT0NTSVdGUkVRCTB4OEIwNAkJLyogc2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikgKi8KKyNkZWZpbmUgU0lPQ0dJV0ZSRVEJMHg4QjA1CQkvKiBnZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KSAqLworI2RlZmluZSBTSU9DU0lXTU9ERQkweDhCMDYJCS8qIHNldCBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBTSU9DR0lXTU9ERQkweDhCMDcJCS8qIGdldCBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBTSU9DU0lXU0VOUwkweDhCMDgJCS8qIHNldCBzZW5zaXRpdml0eSAoZEJtKSAqLworI2RlZmluZSBTSU9DR0lXU0VOUwkweDhCMDkJCS8qIGdldCBzZW5zaXRpdml0eSAoZEJtKSAqLworCisvKiBJbmZvcm1hdGl2ZSBzdHVmZiAqLworI2RlZmluZSBTSU9DU0lXUkFOR0UJMHg4QjBBCQkvKiBVbnVzZWQgKi8KKyNkZWZpbmUgU0lPQ0dJV1JBTkdFCTB4OEIwQgkJLyogR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU0lPQ1NJV1BSSVYJMHg4QjBDCQkvKiBVbnVzZWQgKi8KKyNkZWZpbmUgU0lPQ0dJV1BSSVYJMHg4QjBECQkvKiBnZXQgcHJpdmF0ZSBpb2N0bCBpbnRlcmZhY2UgaW5mbyAqLworI2RlZmluZSBTSU9DU0lXU1RBVFMJMHg4QjBFCQkvKiBVbnVzZWQgKi8KKyNkZWZpbmUgU0lPQ0dJV1NUQVRTCTB4OEIwRgkJLyogR2V0IC9wcm9jL25ldC93aXJlbGVzcyBzdGF0cyAqLworLyogU0lPQ0dJV1NUQVRTIGlzIHN0cmljdGx5IHVzZWQgYmV0d2VlbiB1c2VyIHNwYWNlIGFuZCB0aGUga2VybmVsLCBhbmQKKyAqIGlzIG5ldmVyIHBhc3NlZCB0byB0aGUgZHJpdmVyIChpLmUuIHRoZSBkcml2ZXIgd2lsbCBuZXZlciBzZWUgaXQpLiAqLworCisvKiBTcHkgc3VwcG9ydCAoc3RhdGlzdGljcyBwZXIgTUFDIGFkZHJlc3MgLSB1c2VkIGZvciBNb2JpbGUgSVAgc3VwcG9ydCkgKi8KKyNkZWZpbmUgU0lPQ1NJV1NQWQkweDhCMTAJCS8qIHNldCBzcHkgYWRkcmVzc2VzICovCisjZGVmaW5lIFNJT0NHSVdTUFkJMHg4QjExCQkvKiBnZXQgc3B5IGluZm8gKHF1YWxpdHkgb2YgbGluaykgKi8KKyNkZWZpbmUgU0lPQ1NJV1RIUlNQWQkweDhCMTIJCS8qIHNldCBzcHkgdGhyZXNob2xkIChzcHkgZXZlbnQpICovCisjZGVmaW5lIFNJT0NHSVdUSFJTUFkJMHg4QjEzCQkvKiBnZXQgc3B5IHRocmVzaG9sZCAqLworCisvKiBBY2Nlc3MgUG9pbnQgbWFuaXB1bGF0aW9uICovCisjZGVmaW5lIFNJT0NTSVdBUAkweDhCMTQJCS8qIHNldCBhY2Nlc3MgcG9pbnQgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTSU9DR0lXQVAJMHg4QjE1CQkvKiBnZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0lPQ0dJV0FQTElTVAkweDhCMTcJCS8qIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygc2Nhbm5pbmcgKi8KKyNkZWZpbmUgU0lPQ1NJV1NDQU4JMHg4QjE4CQkvKiB0cmlnZ2VyIHNjYW5uaW5nIChsaXN0IGNlbGxzKSAqLworI2RlZmluZSBTSU9DR0lXU0NBTgkweDhCMTkJCS8qIGdldCBzY2FubmluZyByZXN1bHRzICovCisKKy8qIDgwMi4xMSBzcGVjaWZpYyBzdXBwb3J0ICovCisjZGVmaW5lIFNJT0NTSVdFU1NJRAkweDhCMUEJCS8qIHNldCBFU1NJRCAobmV0d29yayBuYW1lKSAqLworI2RlZmluZSBTSU9DR0lXRVNTSUQJMHg4QjFCCQkvKiBnZXQgRVNTSUQgKi8KKyNkZWZpbmUgU0lPQ1NJV05JQ0tOCTB4OEIxQwkJLyogc2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLworI2RlZmluZSBTSU9DR0lXTklDS04JMHg4QjFECQkvKiBnZXQgbm9kZSBuYW1lL25pY2tuYW1lICovCisvKiBBcyB0aGUgRVNTSUQgYW5kIE5JQ0tOIGFyZSBzdHJpbmdzIHVwIHRvIDMyIGJ5dGVzIGxvbmcsIGl0IGRvZXNuJ3QgZml0CisgKiB3aXRoaW4gdGhlICdpd3JlcScgc3RydWN0dXJlLCBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgJ2RhdGEnIG1lbWJlciB0bworICogcG9pbnQgdG8gYSBzdHJpbmcgaW4gdXNlciBzcGFjZSwgbGlrZSBpdCBpcyBkb25lIGZvciBSQU5HRS4uLiAqLworCisvKiBPdGhlciBwYXJhbWV0ZXJzIHVzZWZ1bCBpbiA4MDIuMTEgYW5kIHNvbWUgb3RoZXIgZGV2aWNlcyAqLworI2RlZmluZSBTSU9DU0lXUkFURQkweDhCMjAJCS8qIHNldCBkZWZhdWx0IGJpdCByYXRlIChicHMpICovCisjZGVmaW5lIFNJT0NHSVdSQVRFCTB4OEIyMQkJLyogZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykgKi8KKyNkZWZpbmUgU0lPQ1NJV1JUUwkweDhCMjIJCS8qIHNldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpICovCisjZGVmaW5lIFNJT0NHSVdSVFMJMHg4QjIzCQkvKiBnZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKSAqLworI2RlZmluZSBTSU9DU0lXRlJBRwkweDhCMjQJCS8qIHNldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpICovCisjZGVmaW5lIFNJT0NHSVdGUkFHCTB4OEIyNQkJLyogZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykgKi8KKyNkZWZpbmUgU0lPQ1NJV1RYUE9XCTB4OEIyNgkJLyogc2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pICovCisjZGVmaW5lIFNJT0NHSVdUWFBPVwkweDhCMjcJCS8qIGdldCB0cmFuc21pdCBwb3dlciAoZEJtKSAqLworI2RlZmluZSBTSU9DU0lXUkVUUlkJMHg4QjI4CQkvKiBzZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZSAqLworI2RlZmluZSBTSU9DR0lXUkVUUlkJMHg4QjI5CQkvKiBnZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZSAqLworCisvKiBFbmNvZGluZyBzdHVmZiAoc2NyYW1ibGluZywgaGFyZHdhcmUgc2VjdXJpdHksIFdFUC4uLikgKi8KKyNkZWZpbmUgU0lPQ1NJV0VOQ09ERQkweDhCMkEJCS8qIHNldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KKyNkZWZpbmUgU0lPQ0dJV0VOQ09ERQkweDhCMkIJCS8qIGdldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUgKi8KKy8qIFBvd2VyIHNhdmluZyBzdHVmZiAocG93ZXIgbWFuYWdlbWVudCwgdW5pY2FzdCBhbmQgbXVsdGljYXN0KSAqLworI2RlZmluZSBTSU9DU0lXUE9XRVIJMHg4QjJDCQkvKiBzZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncyAqLworI2RlZmluZSBTSU9DR0lXUE9XRVIJMHg4QjJECQkvKiBnZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncyAqLworCisvKiBXUEEgOiBHZW5lcmljIElFRUUgODAyLjExIGluZm9ybWF0aW9tIGVsZW1lbnQgKGUuZy4sIGZvciBXUEEvUlNOL1dNTSkuCisgKiBUaGlzIGlvY3RsIHVzZXMgc3RydWN0IGl3X3BvaW50IGFuZCBkYXRhIGJ1ZmZlciB0aGF0IGluY2x1ZGVzIElFIGlkIGFuZCBsZW4KKyAqIGZpZWxkcy4gTW9yZSB0aGFuIG9uZSBJRSBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QuIFNldHRpbmcgdGhlIGdlbmVyaWMKKyAqIElFIHRvIGVtcHR5IGJ1ZmZlciAobGVuPTApIHJlbW92ZXMgdGhlIGdlbmVyaWMgSUUgZnJvbSB0aGUgZHJpdmVyLiBEcml2ZXJzCisgKiBhcmUgYWxsb3dlZCB0byBnZW5lcmF0ZSB0aGVpciBvd24gV1BBL1JTTiBJRXMsIGJ1dCBpbiB0aGVzZSBjYXNlcywgZHJpdmVycworICogYXJlIHJlcXVpcmVkIHRvIHJlcG9ydCB0aGUgdXNlZCBJRSBhcyBhIHdpcmVsZXNzIGV2ZW50LCBlLmcuLCB3aGVuCisgKiBhc3NvY2lhdGluZyB3aXRoIGFuIEFQLiAqLworI2RlZmluZSBTSU9DU0lXR0VOSUUJMHg4QjMwCQkvKiBzZXQgZ2VuZXJpYyBJRSAqLworI2RlZmluZSBTSU9DR0lXR0VOSUUJMHg4QjMxCQkvKiBnZXQgZ2VuZXJpYyBJRSAqLworCisvKiBXUEEgOiBJRUVFIDgwMi4xMSBNTE1FIHJlcXVlc3RzICovCisjZGVmaW5lIFNJT0NTSVdNTE1FCTB4OEIxNgkJLyogcmVxdWVzdCBNTE1FIG9wZXJhdGlvbjsgdXNlcworCQkJCQkgKiBzdHJ1Y3QgaXdfbWxtZSAqLworLyogV1BBIDogQXV0aGVudGljYXRpb24gbW9kZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNJT0NTSVdBVVRICTB4OEIzMgkJLyogc2V0IGF1dGhlbnRpY2F0aW9uIG1vZGUgcGFyYW1zICovCisjZGVmaW5lIFNJT0NHSVdBVVRICTB4OEIzMwkJLyogZ2V0IGF1dGhlbnRpY2F0aW9uIG1vZGUgcGFyYW1zICovCisKKy8qIFdQQSA6IEV4dGVuZGVkIHZlcnNpb24gb2YgZW5jb2RpbmcgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTSU9DU0lXRU5DT0RFRVhUIDB4OEIzNAkJLyogc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworI2RlZmluZSBTSU9DR0lXRU5DT0RFRVhUIDB4OEIzNQkJLyogZ2V0IGVuY29kaW5nIHRva2VuICYgbW9kZSAqLworCisvKiBXUEEyIDogUE1LU0EgY2FjaGUgbWFuYWdlbWVudCAqLworI2RlZmluZSBTSU9DU0lXUE1LU0EJMHg4QjM2CQkvKiBQTUtTQSBjYWNoZSBvcGVyYXRpb24gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVWIFBSSVZBVEUgSU9DVEwgTElTVCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGVzZSAzMiBpb2N0bCBhcmUgd2lyZWxlc3MgZGV2aWNlIHByaXZhdGUsIGZvciAxNiBjb21tYW5kcy4KKyAqIEVhY2ggZHJpdmVyIGlzIGZyZWUgdG8gdXNlIHRoZW0gZm9yIHdoYXRldmVyIHB1cnBvc2UgaXQgY2hvb3NlcywKKyAqIGhvd2V2ZXIgdGhlIGRyaXZlciAqbXVzdCogZXhwb3J0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZSBpb2N0bHMKKyAqIHdpdGggU0lPQ0dJV1BSSVYgYW5kICptdXN0KiB1c2UgYXJndW1lbnRzIGFzIGRlZmluZWQgYmVsb3cuCisgKiBJZiB5b3UgZG9uJ3QgZm9sbG93IHRob3NlIHJ1bGVzLCBEYXZlTSBpcyBnb2luZyB0byBoYXRlIHlvdSAocmVhc29uIDoKKyAqIGl0IG1ha2UgbWl4ZWQgMzIvNjRiaXQgb3BlcmF0aW9uIGltcG9zc2libGUpLgorICovCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVgkweDhCRTAKKyNkZWZpbmUgU0lPQ0lXTEFTVFBSSVYJMHg4QkZGCisvKiBQcmV2aW91c2x5LCB3ZSB3ZXJlIHVzaW5nIFNJT0NERVZQUklWQVRFLCBidXQgd2Ugbm93IGhhdmUgb3VyCisgKiBzZXBhcmF0ZSByYW5nZSBiZWNhdXNlIG9mIGNvbGxpc2lvbnMgd2l0aCBvdGhlciB0b29scyBzdWNoIGFzCisgKiAnbWlpLXRvb2wnLgorICogV2Ugbm93IGhhdmUgMzIgY29tbWFuZHMsIHNvIGEgYml0IG1vcmUgc3BhY2UgOy0pLgorICogQWxzbywgYWxsICdldmVuJyBjb21tYW5kcyBhcmUgb25seSB1c2FibGUgYnkgcm9vdCBhbmQgZG9uJ3QgcmV0dXJuIHRoZQorICogY29udGVudCBvZiBpZnIvaXdyIHRvIHVzZXIgKGJ1dCB5b3UgYXJlIG5vdCBvYmxpZ2VkIHRvIHVzZSB0aGUgc2V0L2dldAorICogY29udmVudGlvbiwganVzdCB1c2UgZXZlcnkgb3RoZXIgdHdvIGNvbW1hbmQpLiBNb3JlIGRldGFpbHMgaW4gaXdwcml2LmMuCisgKiBBbmQgSSByZXBlYXQgOiB5b3UgYXJlIG5vdCBmb3JjZWQgdG8gdXNlIHRoZW0gd2l0aCBpd3ByaXYsIGJ1dCB5b3UKKyAqIG11c3QgYmUgY29tcGxpYW50IHdpdGggaXQuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJT0NUTCBTVFVGRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgKHJhbmdlKSAqLworI2RlZmluZSBTSU9DSVdGSVJTVAkweDhCMDAKKyNkZWZpbmUgU0lPQ0lXTEFTVAlTSU9DSVdMQVNUUFJJVgkJLyogMHg4QkZGICovCisjZGVmaW5lIElXX0lPQ1RMX0lEWChjbWQpCSgoY21kKSAtIFNJT0NJV0ZJUlNUKQorCisvKiBPZGQgOiBnZXQgKHdvcmxkIGFjY2VzcyksIGV2ZW4gOiBzZXQgKHJvb3QgYWNjZXNzKSAqLworI2RlZmluZSBJV19JU19TRVQoY21kKQkoISgoY21kKSAmIDB4MSkpCisjZGVmaW5lIElXX0lTX0dFVChjbWQpCSgoY21kKSAmIDB4MSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVZFTlRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaG9zZSBhcmUgKk5PVCogaW9jdGxzLCBkbyBub3QgaXNzdWUgcmVxdWVzdCBvbiB0aGVtICEhISAqLworLyogTW9zdCBldmVudHMgdXNlIHRoZSBzYW1lIGlkZW50aWZpZXIgYXMgaW9jdGwgcmVxdWVzdHMgKi8KKworI2RlZmluZSBJV0VWVFhEUk9QCTB4OEMwMAkJLyogUGFja2V0IGRyb3BwZWQgdG8gZXhjZXNzaXZlIHJldHJ5ICovCisjZGVmaW5lIElXRVZRVUFMCTB4OEMwMQkJLyogUXVhbGl0eSBwYXJ0IG9mIHN0YXRpc3RpY3MgKHNjYW4pICovCisjZGVmaW5lIElXRVZDVVNUT00JMHg4QzAyCQkvKiBEcml2ZXIgc3BlY2lmaWMgYXNjaWkgc3RyaW5nICovCisjZGVmaW5lIElXRVZSRUdJU1RFUkVECTB4OEMwMwkJLyogRGlzY292ZXJlZCBhIG5ldyBub2RlIChBUCBtb2RlKSAqLworI2RlZmluZSBJV0VWRVhQSVJFRAkweDhDMDQJCS8qIEV4cGlyZWQgYSBub2RlIChBUCBtb2RlKSAqLworI2RlZmluZSBJV0VWR0VOSUUJMHg4QzA1CQkvKiBHZW5lcmljIElFIChXUEEsIFJTTiwgV01NLCAuLikKKwkJCQkJICogKHNjYW4gcmVzdWx0cyk7IFRoaXMgaW5jbHVkZXMgaWQgYW5kCisJCQkJCSAqIGxlbmd0aCBmaWVsZHMuIE9uZSBJV0VWR0VOSUUgbWF5CisJCQkJCSAqIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBJRS4gU2NhbgorCQkJCQkgKiByZXN1bHRzIG1heSBjb250YWluIG9uZSBvciBtb3JlCisJCQkJCSAqIElXRVZHRU5JRSBldmVudHMuICovCisjZGVmaW5lIElXRVZNSUNIQUVMTUlDRkFJTFVSRSAweDhDMDYJLyogTWljaGFlbCBNSUMgZmFpbHVyZQorCQkJCQkgKiAoc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlKQorCQkJCQkgKi8KKyNkZWZpbmUgSVdFVkFTU09DUkVRSUUJMHg4QzA3CQkvKiBJRXMgdXNlZCBpbiAoUmUpQXNzb2NpYXRpb24gUmVxdWVzdC4KKwkJCQkJICogVGhlIGRhdGEgaW5jbHVkZXMgaWQgYW5kIGxlbmd0aAorCQkJCQkgKiBmaWVsZHMgYW5kIG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUKKwkJCQkJICogSUUuIFRoaXMgZXZlbnQgaXMgcmVxdWlyZWQgaW4KKwkJCQkJICogTWFuYWdlZCBtb2RlIGlmIHRoZSBkcml2ZXIKKwkJCQkJICogZ2VuZXJhdGVzIGl0cyBvd24gV1BBL1JTTiBJRS4gVGhpcworCQkJCQkgKiBzaG91bGQgYmUgc2VudCBqdXN0IGJlZm9yZQorCQkJCQkgKiBJV0VWUkVHSVNURVJFRCBldmVudCBmb3IgdGhlCisJCQkJCSAqIGFzc29jaWF0aW9uLiAqLworI2RlZmluZSBJV0VWQVNTT0NSRVNQSUUJMHg4QzA4CQkvKiBJRXMgdXNlZCBpbiAoUmUpQXNzb2NpYXRpb24KKwkJCQkJICogUmVzcG9uc2UuIFRoZSBkYXRhIGluY2x1ZGVzIGlkIGFuZAorCQkJCQkgKiBsZW5ndGggZmllbGRzIGFuZCBtYXkgY29udGFpbiBtb3JlCisJCQkJCSAqIHRoYW4gb25lIElFLiBUaGlzIG1heSBiZSBzZW50CisJCQkJCSAqIGJldHdlZW4gSVdFVkFTU09DUkVRSUUgYW5kCisJCQkJCSAqIElXRVZSRUdJU1RFUkVEIGV2ZW50cyBmb3IgdGhlCisJCQkJCSAqIGFzc29jaWF0aW9uLiAqLworI2RlZmluZSBJV0VWUE1LSURDQU5ECTB4OEMwOQkJLyogUE1LSUQgY2FuZGlkYXRlIGZvciBSU04KKwkJCQkJICogcHJlLWF1dGhlbnRpY2F0aW9uCisJCQkJCSAqIChzdHJ1Y3QgaXdfcG1raWRfY2FuZCkgKi8KKworI2RlZmluZSBJV0VWRklSU1QJMHg4QzAwCisjZGVmaW5lIElXX0VWRU5UX0lEWChjbWQpCSgoY21kKSAtIElXRVZGSVJTVCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUklWQVRFIElORk8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCB3aXRoIFNJT0NHSVdQUklWLiBJdCBhbGxvdyBhIGRyaXZlciB0byBkZWZpbmUKKyAqIHRoZSBpbnRlcmZhY2UgKG5hbWUsIHR5cGUgb2YgZGF0YSkgZm9yIGl0cyBwcml2YXRlIGlvY3RsLgorICogUHJpdmF0ZXMgaW9jdGwgYXJlIFNJT0NJV0ZJUlNUUFJJViAtPiBTSU9DSVdMQVNUUFJJVgorICovCisKKyNkZWZpbmUgSVdfUFJJVl9UWVBFX01BU0sJMHg3MDAwCS8qIFR5cGUgb2YgYXJndW1lbnRzICovCisjZGVmaW5lIElXX1BSSVZfVFlQRV9OT05FCTB4MDAwMAorI2RlZmluZSBJV19QUklWX1RZUEVfQllURQkweDEwMDAJLyogQ2hhciBhcyBudW1iZXIgKi8KKyNkZWZpbmUgSVdfUFJJVl9UWVBFX0NIQVIJMHgyMDAwCS8qIENoYXIgYXMgY2hhcmFjdGVyICovCisjZGVmaW5lIElXX1BSSVZfVFlQRV9JTlQJMHg0MDAwCS8qIDMyIGJpdHMgaW50ICovCisjZGVmaW5lIElXX1BSSVZfVFlQRV9GTE9BVAkweDUwMDAJLyogc3RydWN0IGl3X2ZyZXEgKi8KKyNkZWZpbmUgSVdfUFJJVl9UWVBFX0FERFIJMHg2MDAwCS8qIHN0cnVjdCBzb2NrYWRkciAqLworCisjZGVmaW5lIElXX1BSSVZfU0laRV9GSVhFRAkweDA4MDAJLyogVmFyaWFibGUgb3IgZml4ZWQgbnVtYmVyIG9mIGFyZ3MgKi8KKworI2RlZmluZSBJV19QUklWX1NJWkVfTUFTSwkweDA3RkYJLyogTWF4IG51bWJlciBvZiB0aG9zZSBhcmdzICovCisKKy8qCisgKiBOb3RlIDogaWYgdGhlIG51bWJlciBvZiBhcmdzIGlzIGZpeGVkIGFuZCB0aGUgc2l6ZSA8IDE2IG9jdGV0cywKKyAqIGluc3RlYWQgb2YgcGFzc2luZyBhIHBvaW50ZXIgd2Ugd2lsbCBwdXQgYXJncyBpbiB0aGUgaXdyZXEgc3RydWN0Li4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1RIRVIgQ09OU1RBTlRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE1heGltdW0gZnJlcXVlbmNpZXMgaW4gdGhlIHJhbmdlIHN0cnVjdCAqLworI2RlZmluZSBJV19NQVhfRlJFUVVFTkNJRVMJMzIKKy8qIE5vdGUgOiBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZSA4MCBmcmVxdWVuY2llcywKKyAqIGRvbid0IGluY3JlYXNlIHRoaXMgY29uc3RhbnQgYW5kIGRvbid0IGZpbGwgdGhlIGZyZXF1ZW5jeSBsaXN0LgorICogVGhlIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNldCBieSBjaGFubmVsIGFueXdheS4uLiAqLworCisvKiBNYXhpbXVtIGJpdCByYXRlcyBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisjZGVmaW5lIElXX01BWF9CSVRSQVRFUwkJMzIKKworLyogTWF4aW11bSB0eCBwb3dlcnMgaW4gdGhlIHJhbmdlIHN0cnVjdCAqLworI2RlZmluZSBJV19NQVhfVFhQT1dFUgkJOAorLyogTm90ZSA6IGlmIHlvdSBtb3JlIHRoYW4gOCBUWFBvd2VycywganVzdCBzZXQgdGhlIG1heCBhbmQgbWluIG9yCisgKiBhIGZldyBvZiB0aGVtIGluIHRoZSBzdHJ1Y3QgaXdfcmFuZ2UuICovCisKKy8qIE1heGltdW0gb2YgYWRkcmVzcyB0aGF0IHlvdSBtYXkgc2V0IHdpdGggU1BZICovCisjZGVmaW5lIElXX01BWF9TUFkJCTgKKworLyogTWF4aW11bSBvZiBhZGRyZXNzIHRoYXQgeW91IG1heSBnZXQgaW4gdGhlCisgICBsaXN0IG9mIGFjY2VzcyBwb2ludHMgaW4gcmFuZ2UgKi8KKyNkZWZpbmUgSVdfTUFYX0FQCQk2NAorCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIEVTU0lEIGFuZCBOSUNLTiBzdHJpbmdzICovCisjZGVmaW5lIElXX0VTU0lEX01BWF9TSVpFCTMyCisKKy8qIE1vZGVzIG9mIG9wZXJhdGlvbiAqLworI2RlZmluZSBJV19NT0RFX0FVVE8JMAkvKiBMZXQgdGhlIGRyaXZlciBkZWNpZGVzICovCisjZGVmaW5lIElXX01PREVfQURIT0MJMQkvKiBTaW5nbGUgY2VsbCBuZXR3b3JrICovCisjZGVmaW5lIElXX01PREVfSU5GUkEJMgkvKiBNdWx0aSBjZWxsIG5ldHdvcmssIHJvYW1pbmcsIC4uLiAqLworI2RlZmluZSBJV19NT0RFX01BU1RFUgkzCS8qIFN5bmNocm9uaXNhdGlvbiBtYXN0ZXIgb3IgQWNjZXNzIFBvaW50ICovCisjZGVmaW5lIElXX01PREVfUkVQRUFUCTQJLyogV2lyZWxlc3MgUmVwZWF0ZXIgKGZvcndhcmRlcikgKi8KKyNkZWZpbmUgSVdfTU9ERV9TRUNPTkQJNQkvKiBTZWNvbmRhcnkgbWFzdGVyL3JlcGVhdGVyIChiYWNrdXApICovCisjZGVmaW5lIElXX01PREVfTU9OSVRPUgk2CS8qIFBhc3NpdmUgbW9uaXRvciAobGlzdGVuIG9ubHkpICovCisKKy8qIFN0YXRpc3RpY3MgZmxhZ3MgKGJpdG1hc2sgaW4gdXBkYXRlZCkgKi8KKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQJMHgwMQkvKiBWYWx1ZSB3YXMgdXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVECTB4MDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVECTB4MDQKKyNkZWZpbmUgSVdfUVVBTF9BTExfVVBEQVRFRAkweDA3CisjZGVmaW5lIElXX1FVQUxfREJNCQkweDA4CS8qIExldmVsICsgTm9pc2UgYXJlIGRCbSAqLworI2RlZmluZSBJV19RVUFMX1FVQUxfSU5WQUxJRAkweDEwCS8qIERyaXZlciBkb2Vzbid0IHByb3ZpZGUgdmFsdWUgKi8KKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9JTlZBTElECTB4MjAKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9JTlZBTElECTB4NDAKKyNkZWZpbmUgSVdfUVVBTF9SQ1BJCQkweDgwCS8qIExldmVsICsgTm9pc2UgYXJlIDgwMi4xMWsgUkNQSSAqLworI2RlZmluZSBJV19RVUFMX0FMTF9JTlZBTElECTB4NzAKKworLyogRnJlcXVlbmN5IGZsYWdzICovCisjZGVmaW5lIElXX0ZSRVFfQVVUTwkJMHgwMAkvKiBMZXQgdGhlIGRyaXZlciBkZWNpZGVzICovCisjZGVmaW5lIElXX0ZSRVFfRklYRUQJCTB4MDEJLyogRm9yY2UgYSBzcGVjaWZpYyB2YWx1ZSAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBzaXplIG9mIGVuY29kaW5nIHRva2VuIGF2YWlsYWJsZQorICogdGhleSBhcmUgbGlzdGVkIGluIHRoZSByYW5nZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgSVdfTUFYX0VOQ09ESU5HX1NJWkVTCTgKKworLyogTWF4aW11bSBzaXplIG9mIHRoZSBlbmNvZGluZyB0b2tlbiBpbiBieXRlcyAqLworI2RlZmluZSBJV19FTkNPRElOR19UT0tFTl9NQVgJNjQJLyogNTEyIGJpdHMgKGZvciBub3cpICovCisKKy8qIEZsYWdzIGZvciBlbmNvZGluZyAoYWxvbmcgd2l0aCB0aGUgdG9rZW4pICovCisjZGVmaW5lIElXX0VOQ09ERV9JTkRFWAkJMHgwMEZGCS8qIFRva2VuIGluZGV4IChpZiBuZWVkZWQpICovCisjZGVmaW5lIElXX0VOQ09ERV9GTEFHUwkJMHhGRjAwCS8qIEZsYWdzIGRlZmluZWQgYmVsb3cgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX01PREUJCTB4RjAwMAkvKiBNb2RlcyBkZWZpbmVkIGJlbG93ICovCisjZGVmaW5lIElXX0VOQ09ERV9ESVNBQkxFRAkweDgwMDAJLyogRW5jb2RpbmcgZGlzYWJsZWQgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX0VOQUJMRUQJMHgwMDAwCS8qIEVuY29kaW5nIGVuYWJsZWQgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX1JFU1RSSUNURUQJMHg0MDAwCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzICovCisjZGVmaW5lIElXX0VOQ09ERV9PUEVOCQkweDIwMDAJLyogQWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX05PS0VZCQkweDA4MDAgIC8qIEtleSBpcyB3cml0ZSBvbmx5LCBzbyBub3QgcHJlc2VudCAqLworI2RlZmluZSBJV19FTkNPREVfVEVNUAkJMHgwNDAwICAvKiBUZW1wb3Jhcnkga2V5ICovCisKKy8qIFBvd2VyIG1hbmFnZW1lbnQgZmxhZ3MgYXZhaWxhYmxlIChhbG9uZyB3aXRoIHRoZSB2YWx1ZSwgaWYgYW55KSAqLworI2RlZmluZSBJV19QT1dFUl9PTgkJMHgwMDAwCS8qIE5vIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUgSVdfUE9XRVJfVFlQRQkJMHhGMDAwCS8qIFR5cGUgb2YgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1BPV0VSX1BFUklPRAkJMHgxMDAwCS8qIFZhbHVlIGlzIGEgcGVyaW9kL2R1cmF0aW9uIG9mICAqLworI2RlZmluZSBJV19QT1dFUl9USU1FT1VUCTB4MjAwMAkvKiBWYWx1ZSBpcyBhIHRpbWVvdXQgKHRvIGdvIGFzbGVlcCkgKi8KKyNkZWZpbmUgSVdfUE9XRVJfTU9ERQkJMHgwRjAwCS8qIFBvd2VyIE1hbmFnZW1lbnQgbW9kZSAqLworI2RlZmluZSBJV19QT1dFUl9VTklDQVNUX1IJMHgwMTAwCS8qIFJlY2VpdmUgb25seSB1bmljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIElXX1BPV0VSX01VTFRJQ0FTVF9SCTB4MDIwMAkvKiBSZWNlaXZlIG9ubHkgbXVsdGljYXN0IG1lc3NhZ2VzICovCisjZGVmaW5lIElXX1BPV0VSX0FMTF9SCQkweDAzMDAJLyogUmVjZWl2ZSBhbGwgbWVzc2FnZXMgdGhvdWdoIFBNICovCisjZGVmaW5lIElXX1BPV0VSX0ZPUkNFX1MJMHgwNDAwCS8qIEZvcmNlIFBNIHByb2NlZHVyZSBmb3Igc2VuZGluZyB1bmljYXN0ICovCisjZGVmaW5lIElXX1BPV0VSX1JFUEVBVEVSCTB4MDgwMAkvKiBSZXBlYXQgYnJvYWRjYXN0IG1lc3NhZ2VzIGluIFBNIHBlcmlvZCAqLworI2RlZmluZSBJV19QT1dFUl9NT0RJRklFUgkweDAwMEYJLyogTW9kaWZ5IGEgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1BPV0VSX01JTgkJMHgwMDAxCS8qIFZhbHVlIGlzIGEgbWluaW11bSAgKi8KKyNkZWZpbmUgSVdfUE9XRVJfTUFYCQkweDAwMDIJLyogVmFsdWUgaXMgYSBtYXhpbXVtICovCisjZGVmaW5lIElXX1BPV0VSX1JFTEFUSVZFCTB4MDAwNAkvKiBWYWx1ZSBpcyBub3QgaW4gc2Vjb25kcy9tcy91cyAqLworCisvKiBUcmFuc21pdCBQb3dlciBmbGFncyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgSVdfVFhQT1dfVFlQRQkJMHgwMEZGCS8qIFR5cGUgb2YgdmFsdWUgKi8KKyNkZWZpbmUgSVdfVFhQT1dfREJNCQkweDAwMDAJLyogVmFsdWUgaXMgaW4gZEJtICovCisjZGVmaW5lIElXX1RYUE9XX01XQVRUCQkweDAwMDEJLyogVmFsdWUgaXMgaW4gbVcgKi8KKyNkZWZpbmUgSVdfVFhQT1dfUkVMQVRJVkUJMHgwMDAyCS8qIFZhbHVlIGlzIGluIGFyYml0cmFyeSB1bml0cyAqLworI2RlZmluZSBJV19UWFBPV19SQU5HRQkJMHgxMDAwCS8qIFJhbmdlIG9mIHZhbHVlIGJldHdlZW4gbWluL21heCAqLworCisvKiBSZXRyeSBsaW1pdHMgYW5kIGxpZmV0aW1lIGZsYWdzIGF2YWlsYWJsZSAqLworI2RlZmluZSBJV19SRVRSWV9PTgkJMHgwMDAwCS8qIE5vIGRldGFpbHMuLi4gKi8KKyNkZWZpbmUgSVdfUkVUUllfVFlQRQkJMHhGMDAwCS8qIFR5cGUgb2YgcGFyYW1ldGVyICovCisjZGVmaW5lIElXX1JFVFJZX0xJTUlUCQkweDEwMDAJLyogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyovCisjZGVmaW5lIElXX1JFVFJZX0xJRkVUSU1FCTB4MjAwMAkvKiBNYXhpbXVtIGR1cmF0aW9uIG9mIHJldHJpZXMgaW4gdXMgKi8KKyNkZWZpbmUgSVdfUkVUUllfTU9ESUZJRVIJMHgwMEZGCS8qIE1vZGlmeSBhIHBhcmFtZXRlciAqLworI2RlZmluZSBJV19SRVRSWV9NSU4JCTB4MDAwMQkvKiBWYWx1ZSBpcyBhIG1pbmltdW0gICovCisjZGVmaW5lIElXX1JFVFJZX01BWAkJMHgwMDAyCS8qIFZhbHVlIGlzIGEgbWF4aW11bSAqLworI2RlZmluZSBJV19SRVRSWV9SRUxBVElWRQkweDAwMDQJLyogVmFsdWUgaXMgbm90IGluIHNlY29uZHMvbXMvdXMgKi8KKyNkZWZpbmUgSVdfUkVUUllfU0hPUlQJCTB4MDAxMAkvKiBWYWx1ZSBpcyBmb3Igc2hvcnQgcGFja2V0cyAgKi8KKyNkZWZpbmUgSVdfUkVUUllfTE9ORwkJMHgwMDIwCS8qIFZhbHVlIGlzIGZvciBsb25nIHBhY2tldHMgKi8KKworLyogU2Nhbm5pbmcgcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBJV19TQ0FOX0RFRkFVTFQJCTB4MDAwMAkvKiBEZWZhdWx0IHNjYW4gb2YgdGhlIGRyaXZlciAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9FU1NJRAkweDAwMDEJLyogU2NhbiBhbGwgRVNTSURzICovCisjZGVmaW5lIElXX1NDQU5fVEhJU19FU1NJRAkweDAwMDIJLyogU2NhbiBvbmx5IHRoaXMgRVNTSUQgKi8KKyNkZWZpbmUgSVdfU0NBTl9BTExfRlJFUQkweDAwMDQJLyogU2NhbiBhbGwgRnJlcXVlbmNpZXMgKi8KKyNkZWZpbmUgSVdfU0NBTl9USElTX0ZSRVEJMHgwMDA4CS8qIFNjYW4gb25seSB0aGlzIEZyZXF1ZW5jeSAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9NT0RFCTB4MDAxMAkvKiBTY2FuIGFsbCBNb2RlcyAqLworI2RlZmluZSBJV19TQ0FOX1RISVNfTU9ERQkweDAwMjAJLyogU2NhbiBvbmx5IHRoaXMgTW9kZSAqLworI2RlZmluZSBJV19TQ0FOX0FMTF9SQVRFCTB4MDA0MAkvKiBTY2FuIGFsbCBCaXQtUmF0ZXMgKi8KKyNkZWZpbmUgSVdfU0NBTl9USElTX1JBVEUJMHgwMDgwCS8qIFNjYW4gb25seSB0aGlzIEJpdC1SYXRlICovCisvKiBzdHJ1Y3QgaXdfc2Nhbl9yZXEgc2Nhbl90eXBlICovCisjZGVmaW5lIElXX1NDQU5fVFlQRV9BQ1RJVkUgMAorI2RlZmluZSBJV19TQ0FOX1RZUEVfUEFTU0lWRSAxCisvKiBNYXhpbXVtIHNpemUgb2YgcmV0dXJuZWQgZGF0YSAqLworI2RlZmluZSBJV19TQ0FOX01BWF9EQVRBCTQwOTYJLyogSW4gYnl0ZXMgKi8KKworLyogU2NhbiBjYXBhYmlsaXR5IGZsYWdzIC0gaW4gKHN0cnVjdCBpd19yYW5nZSAqKS0+c2Nhbl9jYXBhICovCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9OT05FCQkweDAwCisjZGVmaW5lIElXX1NDQU5fQ0FQQV9FU1NJRAkJMHgwMQorI2RlZmluZSBJV19TQ0FOX0NBUEFfQlNTSUQJCTB4MDIKKyNkZWZpbmUgSVdfU0NBTl9DQVBBX0NIQU5ORUwJMHgwNAorI2RlZmluZSBJV19TQ0FOX0NBUEFfTU9ERQkJMHgwOAorI2RlZmluZSBJV19TQ0FOX0NBUEFfUkFURQkJMHgxMAorI2RlZmluZSBJV19TQ0FOX0NBUEFfVFlQRQkJMHgyMAorI2RlZmluZSBJV19TQ0FOX0NBUEFfVElNRQkJMHg0MAorCisvKiBNYXggbnVtYmVyIG9mIGNoYXIgaW4gY3VzdG9tIGV2ZW50IC0gdXNlIG11bHRpcGxlIG9mIHRoZW0gaWYgbmVlZGVkICovCisjZGVmaW5lIElXX0NVU1RPTV9NQVgJCTI1NgkvKiBJbiBieXRlcyAqLworCisvKiBHZW5lcmljIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KKyNkZWZpbmUgSVdfR0VORVJJQ19JRV9NQVgJMTAyNAorCisvKiBNTE1FIHJlcXVlc3RzIChTSU9DU0lXTUxNRSAvIHN0cnVjdCBpd19tbG1lKSAqLworI2RlZmluZSBJV19NTE1FX0RFQVVUSAkJMAorI2RlZmluZSBJV19NTE1FX0RJU0FTU09DCTEKKyNkZWZpbmUgSVdfTUxNRV9BVVRICQkyCisjZGVmaW5lIElXX01MTUVfQVNTT0MJCTMKKworLyogU0lPQ1NJV0FVVEgvU0lPQ0dJV0FVVEggc3RydWN0IGl3X3BhcmFtIGZsYWdzICovCisjZGVmaW5lIElXX0FVVEhfSU5ERVgJCTB4MEZGRgorI2RlZmluZSBJV19BVVRIX0ZMQUdTCQkweEYwMDAKKy8qIFNJT0NTSVdBVVRIL1NJT0NHSVdBVVRIIHBhcmFtZXRlcnMgKDAgLi4gNDA5NSkKKyAqIChJV19BVVRIX0lOREVYIG1hc2sgaW4gc3RydWN0IGl3X3BhcmFtIGZsYWdzOyB0aGlzIGlzIHRoZSBpbmRleCBvZiB0aGUKKyAqIHBhcmFtZXRlciB0aGF0IGlzIGJlaW5nIHNldC9nZXQgdG87IHZhbHVlIHdpbGwgYmUgcmVhZC93cml0dGVuIHRvCisgKiBzdHJ1Y3QgaXdfcGFyYW0gdmFsdWUgZmllbGQpICovCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT04JCTAKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0UJCTEKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfR1JPVVAJCTIKKyNkZWZpbmUgSVdfQVVUSF9LRVlfTUdNVAkJMworI2RlZmluZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTCTQKKyNkZWZpbmUgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVECTUKKyNkZWZpbmUgSVdfQVVUSF84MDIxMV9BVVRIX0FMRwkJNgorI2RlZmluZSBJV19BVVRIX1dQQV9FTkFCTEVECQk3CisjZGVmaW5lIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0wJOAorI2RlZmluZSBJV19BVVRIX1JPQU1JTkdfQ09OVFJPTAkJOQorI2RlZmluZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRAkJMTAKKworLyogSVdfQVVUSF9XUEFfVkVSU0lPTiB2YWx1ZXMgKGJpdCBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9XUEFfVkVSU0lPTl9ESVNBQkxFRAkweDAwMDAwMDAxCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBCQkweDAwMDAwMDAyCisjZGVmaW5lIElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMgkweDAwMDAwMDA0CisKKy8qIElXX0FVVEhfUEFJUldJU0VfQ0lQSEVSIGFuZCBJV19BVVRIX0dST1VQX0NJUEhFUiB2YWx1ZXMgKGJpdCBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfTk9ORQkweDAwMDAwMDAxCisjZGVmaW5lIElXX0FVVEhfQ0lQSEVSX1dFUDQwCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVdfQVVUSF9DSVBIRVJfVEtJUAkweDAwMDAwMDA0CisjZGVmaW5lIElXX0FVVEhfQ0lQSEVSX0NDTVAJMHgwMDAwMDAwOAorI2RlZmluZSBJV19BVVRIX0NJUEhFUl9XRVAxMDQJMHgwMDAwMDAxMAorCisvKiBJV19BVVRIX0tFWV9NR01UIHZhbHVlcyAoYml0IGZpZWxkKSAqLworI2RlZmluZSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWAkxCisjZGVmaW5lIElXX0FVVEhfS0VZX01HTVRfUFNLCTIKKworLyogSVdfQVVUSF84MDIxMV9BVVRIX0FMRyB2YWx1ZXMgKGJpdCBmaWVsZCkgKi8KKyNkZWZpbmUgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0JMHgwMDAwMDAwMQorI2RlZmluZSBJV19BVVRIX0FMR19TSEFSRURfS0VZCTB4MDAwMDAwMDIKKyNkZWZpbmUgSVdfQVVUSF9BTEdfTEVBUAkweDAwMDAwMDA0CisKKy8qIElXX0FVVEhfUk9BTUlOR19DT05UUk9MIHZhbHVlcyAqLworI2RlZmluZSBJV19BVVRIX1JPQU1JTkdfRU5BQkxFCTAJLyogZHJpdmVyL2Zpcm13YXJlIGJhc2VkIHJvYW1pbmcgKi8KKyNkZWZpbmUgSVdfQVVUSF9ST0FNSU5HX0RJU0FCTEUJMQkvKiB1c2VyIHNwYWNlIHByb2dyYW0gdXNlZCBmb3Igcm9hbWluZworCQkJCQkgKiBjb250cm9sICovCisKKy8qIFNJT0NTSVdFTkNPREVFWFQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX1NFUV9NQVhfU0laRQk4CisvKiBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAtPmFsZyAqLworI2RlZmluZSBJV19FTkNPREVfQUxHX05PTkUJMAorI2RlZmluZSBJV19FTkNPREVfQUxHX1dFUAkxCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfVEtJUAkyCisjZGVmaW5lIElXX0VOQ09ERV9BTEdfQ0NNUAkzCisvKiBzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAtPmV4dF9mbGFncyAqLworI2RlZmluZSBJV19FTkNPREVfRVhUX1RYX1NFUV9WQUxJRAkweDAwMDAwMDAxCisjZGVmaW5lIElXX0VOQ09ERV9FWFRfUlhfU0VRX1ZBTElECTB4MDAwMDAwMDIKKyNkZWZpbmUgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZCTB4MDAwMDAwMDgKKworLyogSVdFVk1JQ0hBRUxNSUNGQUlMVVJFIDogc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlIC0+ZmxhZ3MgKi8KKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9LRVlfSUQJMHgwMDAwMDAwMyAvKiBLZXkgSUQgMC4uMyAqLworI2RlZmluZSBJV19NSUNGQUlMVVJFX0dST1VQCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9QQUlSV0lTRQkweDAwMDAwMDA4CisjZGVmaW5lIElXX01JQ0ZBSUxVUkVfU1RBS0VZCTB4MDAwMDAwMTAKKyNkZWZpbmUgSVdfTUlDRkFJTFVSRV9DT1VOVAkweDAwMDAwMDYwIC8qIDEgb3IgMiAoMCA9IGNvdW50IG5vdCBzdXBwb3J0ZWQpCisJCQkJCSAgICAqLworCisvKiBCaXQgZmllbGQgdmFsdWVzIGZvciBlbmNfY2FwYSBpbiBzdHJ1Y3QgaXdfcmFuZ2UgKi8KKyNkZWZpbmUgSVdfRU5DX0NBUEFfV1BBCQkweDAwMDAwMDAxCisjZGVmaW5lIElXX0VOQ19DQVBBX1dQQTIJMHgwMDAwMDAwMgorI2RlZmluZSBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUAkweDAwMDAwMDA0CisjZGVmaW5lIElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QCTB4MDAwMDAwMDgKKworLyogRXZlbnQgY2FwYWJpbGl0eSBtYWNyb3MgLSBpbiAoc3RydWN0IGl3X3JhbmdlICopLT5ldmVudF9jYXBhCisgKiBCZWNhdXNlIHdlIGhhdmUgbW9yZSB0aGFuIDMyIHBvc3NpYmxlIGV2ZW50cywgd2UgdXNlIGFuIGFycmF5IG9mCisgKiAzMiBiaXQgYml0bWFza3MuIE5vdGUgOiAzMiBiaXRzID0gMHgyMCA9IDJeNS4gKi8KKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9CQVNFKGNtZCkJCSgoY21kID49IFNJT0NJV0ZJUlNUUFJJVikgPyBcCisJCQkJCSAoY21kIC0gU0lPQ0lXRklSU1RQUklWICsgMHg2MCkgOiBcCisJCQkJCSAoY21kIC0gU0lPQ1NJV0NPTU1JVCkpCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfSU5ERVgoY21kKQkoSVdfRVZFTlRfQ0FQQV9CQVNFKGNtZCkgPj4gNSkKKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9NQVNLKGNtZCkJCSgxIDw8IChJV19FVkVOVF9DQVBBX0JBU0UoY21kKSAmIDB4MUYpKQorLyogRXZlbnQgY2FwYWJpbGl0eSBjb25zdGFudHMgLSBldmVudCBhdXRvZ2VuZXJhdGVkIGJ5IHRoZSBrZXJuZWwKKyAqIFRoaXMgbGlzdCBpcyB2YWxpZCBmb3IgbW9zdCA4MDIuMTEgZGV2aWNlcywgY3VzdG9taXNlIGFzIG5lZWRlZC4uLiAqLworI2RlZmluZSBJV19FVkVOVF9DQVBBX0tfMAkoSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNCkgfCBcCisJCQkJIElXX0VWRU5UX0NBUEFfTUFTSygweDhCMDYpIHwgXAorCQkJCSBJV19FVkVOVF9DQVBBX01BU0soMHg4QjFBKSkKKyNkZWZpbmUgSVdfRVZFTlRfQ0FQQV9LXzEJKElXX0VWRU5UX0NBUEFfTUFTSygweDhCMkEpKQorLyogIkVhc3kiIG1hY3JvIHRvIHNldCBldmVudHMgaW4gaXdfcmFuZ2UgKGxlc3MgZWZmaWNpZW50KSAqLworI2RlZmluZSBJV19FVkVOVF9DQVBBX1NFVChldmVudF9jYXBhLCBjbWQpIChldmVudF9jYXBhW0lXX0VWRU5UX0NBUEFfSU5ERVgoY21kKV0gfD0gSVdfRVZFTlRfQ0FQQV9NQVNLKGNtZCkpCisjZGVmaW5lIElXX0VWRU5UX0NBUEFfU0VUX0tFUk5FTChldmVudF9jYXBhKSB7ZXZlbnRfY2FwYVswXSB8PSBJV19FVkVOVF9DQVBBX0tfMDsgZXZlbnRfY2FwYVsxXSB8PSBJV19FVkVOVF9DQVBBX0tfMTsgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1VCVFlQRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICoJR2VuZXJpYyBmb3JtYXQgZm9yIG1vc3QgcGFyYW1ldGVycyB0aGF0IGZpdCBpbiBhbiBpbnQKKyAqLworc3RydWN0CWl3X3BhcmFtCit7CisgIF9fczMyCQl2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIGl0c2VsZiAqLworICBfX3U4CQlmaXhlZDsJCS8qIEhhcmR3YXJlIHNob3VsZCBub3QgdXNlIGF1dG8gc2VsZWN0ICovCisgIF9fdTgJCWRpc2FibGVkOwkvKiBEaXNhYmxlIHRoZSBmZWF0dXJlICovCisgIF9fdTE2CQlmbGFnczsJCS8qIFZhcmlvdXMgc3BlY2lmYyBmbGFncyAoaWYgYW55KSAqLworfTsKKworLyoKKyAqCUZvciBhbGwgZGF0YSBsYXJnZXIgdGhhbiAxNiBvY3RldHMsIHdlIG5lZWQgdG8gdXNlIGEKKyAqCXBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBpbiB1c2VyIHNwYWNlLgorICovCitzdHJ1Y3QJaXdfcG9pbnQKK3sKKyAgdm9pZCAqcG9pbnRlcjsJLyogUG9pbnRlciB0byB0aGUgZGF0YSAgKGluIHVzZXIgc3BhY2UpICovCisgIF9fdTE2CQlsZW5ndGg7CQkvKiBudW1iZXIgb2YgZmllbGRzIG9yIHNpemUgaW4gYnl0ZXMgKi8KKyAgX191MTYJCWZsYWdzOwkJLyogT3B0aW9uYWwgcGFyYW1zICovCit9OworCisvKgorICoJQSBmcmVxdWVuY3kKKyAqCUZvciBudW1iZXJzIGxvd2VyIHRoYW4gMTBeOSwgd2UgZW5jb2RlIHRoZSBudW1iZXIgaW4gJ20nIGFuZAorICoJc2V0ICdlJyB0byAwCisgKglGb3IgbnVtYmVyIGdyZWF0ZXIgdGhhbiAxMF45LCB3ZSBkaXZpZGUgaXQgYnkgdGhlIGxvd2VzdCBwb3dlcgorICoJb2YgMTAgdG8gZ2V0ICdtJyBsb3dlciB0aGFuIDEwXjksIHdpdGggJ20nPSBmIC8gKDEwXidlJykuLi4KKyAqCVRoZSBwb3dlciBvZiAxMCBpcyBpbiAnZScsIHRoZSByZXN1bHQgb2YgdGhlIGRpdmlzaW9uIGlzIGluICdtJy4KKyAqLworc3RydWN0CWl3X2ZyZXEKK3sKKwlfX3MzMgkJbTsJCS8qIE1hbnRpc3NhICovCisJX19zMTYJCWU7CQkvKiBFeHBvbmVudCAqLworCV9fdTgJCWk7CQkvKiBMaXN0IGluZGV4ICh3aGVuIGluIHJhbmdlIHN0cnVjdCkgKi8KKwlfX3U4CQlmbGFnczsJCS8qIEZsYWdzIChmaXhlZC9hdXRvKSAqLworfTsKKworLyoKKyAqCVF1YWxpdHkgb2YgdGhlIGxpbmsKKyAqLworc3RydWN0CWl3X3F1YWxpdHkKK3sKKwlfX3U4CQlxdWFsOwkJLyogbGluayBxdWFsaXR5ICglcmV0cmllcywgU05SLAorCQkJCQkgICAlbWlzc2VkIGJlYWNvbnMgb3IgYmV0dGVyLi4uKSAqLworCV9fdTgJCWxldmVsOwkJLyogc2lnbmFsIGxldmVsIChkQm0pICovCisJX191OAkJbm9pc2U7CQkvKiBub2lzZSBsZXZlbCAoZEJtKSAqLworCV9fdTgJCXVwZGF0ZWQ7CS8qIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZCAqLworfTsKKworLyoKKyAqCVBhY2tldCBkaXNjYXJkZWQgaW4gdGhlIHdpcmVsZXNzIGFkYXB0ZXIgZHVlIHRvCisgKgkid2lyZWxlc3MiIHNwZWNpZmljIHByb2JsZW1zLi4uCisgKglOb3RlIDogdGhlIGxpc3Qgb2YgY291bnRlciBhbmQgc3RhdGlzdGljcyBpbiBuZXRfZGV2aWNlX3N0YXRzCisgKglpcyBhbHJlYWR5IHByZXR0eSBleGhhdXN0aXZlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhhdCBmaXJzdC4KKyAqCVRoaXMgaXMgb25seSBhZGRpdGlvbmFsIHN0YXRzLi4uCisgKi8KK3N0cnVjdAlpd19kaXNjYXJkZWQKK3sKKwlfX3UzMgkJbndpZDsJCS8qIFJ4IDogV3JvbmcgbndpZC9lc3NpZCAqLworCV9fdTMyCQljb2RlOwkJLyogUnggOiBVbmFibGUgdG8gY29kZS9kZWNvZGUgKFdFUCkgKi8KKwlfX3UzMgkJZnJhZ21lbnQ7CS8qIFJ4IDogQ2FuJ3QgcGVyZm9ybSBNQUMgcmVhc3NlbWJseSAqLworCV9fdTMyCQlyZXRyaWVzOwkvKiBUeCA6IE1heCBNQUMgcmV0cmllcyBudW0gcmVhY2hlZCAqLworCV9fdTMyCQltaXNjOwkJLyogT3RoZXJzIGNhc2VzICovCit9OworCisvKgorICoJUGFja2V0L1RpbWUgcGVyaW9kIG1pc3NlZCBpbiB0aGUgd2lyZWxlc3MgYWRhcHRlciBkdWUgdG8KKyAqCSJ3aXJlbGVzcyIgc3BlY2lmaWMgcHJvYmxlbXMuLi4KKyAqLworc3RydWN0CWl3X21pc3NlZAoreworCV9fdTMyCQliZWFjb247CQkvKiBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lICovCit9OworCisvKgorICoJUXVhbGl0eSByYW5nZSAoZm9yIHNweSB0aHJlc2hvbGQpCisgKi8KK3N0cnVjdAlpd190aHJzcHkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIJCWFkZHI7CQkvKiBTb3VyY2UgYWRkcmVzcyAoaHcvbWFjKSAqLworCXN0cnVjdCBpd19xdWFsaXR5CXF1YWw7CQkvKiBRdWFsaXR5IG9mIHRoZSBsaW5rICovCisJc3RydWN0IGl3X3F1YWxpdHkJbG93OwkJLyogTG93IHRocmVzaG9sZCAqLworCXN0cnVjdCBpd19xdWFsaXR5CWhpZ2g7CQkvKiBIaWdoIHRocmVzaG9sZCAqLworfTsKKworLyoKKyAqCU9wdGlvbmFsIGRhdGEgZm9yIHNjYW4gcmVxdWVzdAorICoKKyAqCU5vdGU6IHRoZXNlIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGNvbnRyb2xsaW5nIHBhcmFtZXRlcnMgZm9yIHRoZQorICoJc2Nhbm5pbmcgYmVoYXZpb3IsIHRoZXNlIGRvIG5vdCBhcHBseSB0byBnZXR0aW5nIHNjYW4gcmVzdWx0cworICoJKFNJT0NHSVdTQ0FOKS4gRHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8ga2VlcCBhIGxvY2FsIEJTUyB0YWJsZSBhbmQKKyAqCXByb3ZpZGUgYSBtZXJnZWQgcmVzdWx0cyB3aXRoIGFsbCBCU1NlcyBldmVuIGlmIHRoZSBwcmV2aW91cyBzY2FuCisgKglyZXF1ZXN0IGxpbWl0ZWQgc2Nhbm5pbmcgdG8gYSBzdWJzZXQsIGUuZy4sIGJ5IHNwZWNpZnlpbmcgYW4gU1NJRC4KKyAqCUVzcGVjaWFsbHksIHNjYW4gcmVzdWx0cyBhcmUgcmVxdWlyZWQgdG8gaW5jbHVkZSBhbiBlbnRyeSBmb3IgdGhlCisgKgljdXJyZW50IEJTUyBpZiB0aGUgZHJpdmVyIGlzIGluIE1hbmFnZWQgbW9kZSBhbmQgYXNzb2NpYXRlZCB3aXRoIGFuIEFQLgorICovCitzdHJ1Y3QJaXdfc2Nhbl9yZXEKK3sKKwlfX3U4CQlzY2FuX3R5cGU7IC8qIElXX1NDQU5fVFlQRV97QUNUSVZFLFBBU1NJVkV9ICovCisJX191OAkJZXNzaWRfbGVuOworCV9fdTgJCW51bV9jaGFubmVsczsgLyogbnVtIGVudHJpZXMgaW4gY2hhbm5lbF9saXN0OworCQkJCSAgICAgICAqIDAgPSBzY2FuIGFsbCBhbGxvd2VkIGNoYW5uZWxzICovCisJX191OAkJZmxhZ3M7IC8qIHJlc2VydmVkIGFzIHBhZGRpbmc7IHVzZSB6ZXJvLCB0aGlzIG1heQorCQkJCSogYmUgdXNlZCBpbiB0aGUgZnV0dXJlIGZvciBhZGRpbmcgZmxhZ3MKKwkJCQkqIHRvIHJlcXVlc3QgZGlmZmVyZW50IHNjYW4gYmVoYXZpb3IgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJYnNzaWQ7IC8qIGZmOmZmOmZmOmZmOmZmOmZmIGZvciBicm9hZGNhc3QgQlNTSUQgb3IKKwkJCQkqIGluZGl2aWR1YWwgYWRkcmVzcyBvZiBhIHNwZWNpZmljIEJTUyAqLworCisJLyoKKwkgKiBVc2UgdGhpcyBFU1NJRCBpZiBJV19TQ0FOX1RISVNfRVNTSUQgZmxhZyBpcyB1c2VkIGluc3RlYWQgb2YgdXNpbmcKKwkgKiB0aGUgY3VycmVudCBFU1NJRC4gVGhpcyBhbGxvd3Mgc2NhbiByZXF1ZXN0cyBmb3Igc3BlY2lmaWMgRVNTSUQKKwkgKiB3aXRob3V0IGhhdmluZyB0byBjaGFuZ2UgdGhlIGN1cnJlbnQgRVNTSUQgYW5kIHBvdGVudGlhbGx5IGJyZWFraW5nCisJICogdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24uCisJICovCisJX191OAkJZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOworCisJLyoKKwkgKiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzY2FubmluZyBiZWhhdmlvci4KKwkgKiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIE1MTUUtU0NBTi5yZXF1ZXN0IGZyb20gSUVFRSBTdGQgODAyLjExLgorCSAqIFRVIGlzIDEuMDI0IG1zLiBJZiB0aGVzZSBhcmUgc2V0IHRvIDAsIGRyaXZlciBpcyBleHBlY3RlZCB0byB1c2UKKwkgKiByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzLiBtaW5fY2hhbm5lbF90aW1lIGRlZmluZXMgdGhlIHRpbWUgdGhhdAorCSAqIHdpbGwgYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgZmlyc3QgcmVwbHkgb24gZWFjaCBjaGFubmVsLiBJZiBubworCSAqIHJlcGxpZXMgYXJlIHJlY2VpdmVkLCBuZXh0IGNoYW5uZWwgd2lsbCBiZSBzY2FubmVkIGFmdGVyIHRoaXMuIElmCisJICogcmVwbGllcyBhcmUgcmVjZWl2ZWQsIHRvdGFsIHRpbWUgd2FpdGVkIG9uIHRoZSBjaGFubmVsIGlzIGRlZmluZWQgYnkKKwkgKiBtYXhfY2hhbm5lbF90aW1lLgorCSAqLworCV9fdTMyCQltaW5fY2hhbm5lbF90aW1lOyAvKiBpbiBUVSAqLworCV9fdTMyCQltYXhfY2hhbm5lbF90aW1lOyAvKiBpbiBUVSAqLworCisJc3RydWN0IGl3X2ZyZXEJY2hhbm5lbF9saXN0W0lXX01BWF9GUkVRVUVOQ0lFU107Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdQQSBTVVBQT1JUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCUV4dGVuZGVkIGRhdGEgc3RydWN0dXJlIGZvciBnZXQvc2V0IGVuY29kaW5nICh0aGlzIGlzIHVzZWQgd2l0aAorICoJU0lPQ1NJV0VOQ09ERUVYVC9TSU9DR0lXRU5DT0RFRVhULiBzdHJ1Y3QgaXdfcG9pbnQgYW5kIElXX0VOQ09ERV8qCisgKglmbGFncyBhcmUgdXNlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2l0aCBTSU9DU0lXRU5DT0RFL1NJT0NHSVdFTkNPREUgYW5kCisgKglvbmx5IHRoZSBkYXRhIGNvbnRlbnRzIGNoYW5nZXMgKGtleSBkYXRhIC0+IHRoaXMgc3RydWN0dXJlLCBpbmNsdWRpbmcKKyAqCWtleSBkYXRhKS4KKyAqCisgKglJZiB0aGUgbmV3IGtleSBpcyB0aGUgZmlyc3QgZ3JvdXAga2V5LCBpdCB3aWxsIGJlIHNldCBhcyB0aGUgZGVmYXVsdAorICoJVFgga2V5LiBPdGhlcndpc2UsIGRlZmF1bHQgVFgga2V5IGluZGV4IGlzIG9ubHkgY2hhbmdlZCBpZgorICoJSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZIGZsYWcgaXMgc2V0LgorICoKKyAqCUtleSB3aWxsIGJlIGNoYW5nZWQgd2l0aCBTSU9DU0lXRU5DT0RFRVhUIGluIGFsbCBjYXNlcyBleGNlcHQgZm9yCisgKglzcGVjaWFsICJjaGFuZ2UgVFgga2V5IGluZGV4IiBvcGVyYXRpb24gd2hpY2ggaXMgaW5kaWNhdGVkIGJ5IHNldHRpbmcKKyAqCWtleV9sZW4gPSAwIGFuZCBleHRfZmxhZ3MgfD0gSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZLgorICoKKyAqCXR4X3NlcS9yeF9zZXEgYXJlIG9ubHkgdXNlZCB3aGVuIHJlc3BlY3RpdmUKKyAqCUlXX0VOQ09ERV9FWFRfe1RYLFJYfV9TRVFfVkFMSUQgZmxhZyBpcyBzZXQgaW4gZXh0X2ZsYWdzLiBOb3JtYWwKKyAqCVRLSVAvQ0NNUCBvcGVyYXRpb24gaXMgdG8gc2V0IFJYIHNlcSB3aXRoIFNJT0NTSVdFTkNPREVFWFQgYW5kIHN0YXJ0CisgKglUWCBzZXEgZnJvbSB6ZXJvIHdoZW5ldmVyIGtleSBpcyBjaGFuZ2VkLiBTSU9DR0lXRU5DT0RFRVhUIGlzIG5vcm1hbGx5CisgKgl1c2VkIG9ubHkgYnkgYW4gQXV0aGVudGljYXRvciAoQVAgb3IgYW4gSUJTUyBzdGF0aW9uKSB0byBnZXQgdGhlCisgKgljdXJyZW50IFRYIHNlcXVlbmNlIG51bWJlci4gVXNpbmcgVFhfU0VRX1ZBTElEIGZvciBTSU9DU0lXRU5DT0RFRVhUIGFuZAorICoJUlhfU0VRX1ZBTElEIGZvciBTSU9DR0lXRU5DT0RFRVhUIGFyZSBvcHRpb25hbCwgYnV0IGNhbiBiZSB1c2VmdWwgZm9yCisgKglkZWJ1Z2dpbmcvdGVzdGluZy4KKyAqLworc3RydWN0CWl3X2VuY29kZV9leHQKK3sKKwlfX3UzMgkJZXh0X2ZsYWdzOyAvKiBJV19FTkNPREVfRVhUXyogKi8KKwlfX3U4CQl0eF9zZXFbSVdfRU5DT0RFX1NFUV9NQVhfU0laRV07IC8qIExTQiBmaXJzdCAqLworCV9fdTgJCXJ4X3NlcVtJV19FTkNPREVfU0VRX01BWF9TSVpFXTsgLyogTFNCIGZpcnN0ICovCisJc3RydWN0IHNvY2thZGRyCWFkZHI7IC8qIGZmOmZmOmZmOmZmOmZmOmZmIGZvciBicm9hZGNhc3QvbXVsdGljYXN0CisJCQkgICAgICAgKiAoZ3JvdXApIGtleXMgb3IgdW5pY2FzdCBhZGRyZXNzIGZvcgorCQkJICAgICAgICogaW5kaXZpZHVhbCBrZXlzICovCisJX191MTYJCWFsZzsgLyogSVdfRU5DT0RFX0FMR18qICovCisJX191MTYJCWtleV9sZW47CisJX191OAkJa2V5WzBdOworfTsKKworLyogU0lPQ1NJV01MTUUgZGF0YSAqLworc3RydWN0CWl3X21sbWUKK3sKKwlfX3UxNgkJY21kOyAvKiBJV19NTE1FXyogKi8KKwlfX3UxNgkJcmVhc29uX2NvZGU7CisJc3RydWN0IHNvY2thZGRyCWFkZHI7Cit9OworCisvKiBTSU9DU0lXUE1LU0EgZGF0YSAqLworI2RlZmluZSBJV19QTUtTQV9BREQJCTEKKyNkZWZpbmUgSVdfUE1LU0FfUkVNT1ZFCQkyCisjZGVmaW5lIElXX1BNS1NBX0ZMVVNICQkzCisKKyNkZWZpbmUgSVdfUE1LSURfTEVOCTE2CisKK3N0cnVjdAlpd19wbWtzYQoreworCV9fdTMyCQljbWQ7IC8qIElXX1BNS1NBXyogKi8KKwlzdHJ1Y3Qgc29ja2FkZHIJYnNzaWQ7CisJX191OAkJcG1raWRbSVdfUE1LSURfTEVOXTsKK307CisKKy8qIElXRVZNSUNIQUVMTUlDRkFJTFVSRSBkYXRhICovCitzdHJ1Y3QJaXdfbWljaGFlbG1pY2ZhaWx1cmUKK3sKKwlfX3UzMgkJZmxhZ3M7CisJc3RydWN0IHNvY2thZGRyCXNyY19hZGRyOworCV9fdTgJCXRzY1tJV19FTkNPREVfU0VRX01BWF9TSVpFXTsgLyogTFNCIGZpcnN0ICovCit9OworCisvKiBJV0VWUE1LSURDQU5EIGRhdGEgKi8KKyNkZWZpbmUgSVdfUE1LSURfQ0FORF9QUkVBVVRICTB4MDAwMDAwMDEgLyogUk5TIHByZS1hdXRoZW50aWNhdGlvbiBlbmFibGVkICovCitzdHJ1Y3QJaXdfcG1raWRfY2FuZAoreworCV9fdTMyCQlmbGFnczsgLyogSVdfUE1LSURfQ0FORF8qICovCisJX191MzIJCWluZGV4OyAvKiB0aGUgc21hbGxlciB0aGUgaW5kZXgsIHRoZSBoaWdoZXIgdGhlCisJCQkJKiBwcmlvcml0eSAqLworCXN0cnVjdCBzb2NrYWRkcglic3NpZDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBTVEFUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBXaXJlbGVzcyBzdGF0aXN0aWNzICh1c2VkIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MpCisgKi8KK3N0cnVjdAlpd19zdGF0aXN0aWNzCit7CisJX191MTYJCXN0YXR1czsJCS8qIFN0YXR1cworCQkJCQkgKiAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdyAqLworCisJc3RydWN0IGl3X3F1YWxpdHkJcXVhbDsJCS8qIFF1YWxpdHkgb2YgdGhlIGxpbmsKKwkJCQkJCSAqIChpbnN0YW50L21lYW4vbWF4KSAqLworCXN0cnVjdCBpd19kaXNjYXJkZWQJZGlzY2FyZDsJLyogUGFja2V0IGRpc2NhcmRlZCBjb3VudHMgKi8KKwlzdHJ1Y3QgaXdfbWlzc2VkCW1pc3M7CQkvKiBQYWNrZXQgbWlzc2VkIGNvdW50cyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMIFJFUVVFU1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcGF5bG9hZCBvZiBhbiBpb2N0bCwgYW5kIGlzIHVzZWQgCisgKiBiZWxvdy4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGZpdCBvbiB0aGUgbWVtb3J5IGZvb3RwcmludAorICogb2YgaXdyZXEgKHdoaWNoIGlzIHRoZSBzYW1lIGFzIGlmcmVxKSwgd2hpY2ggbWVhbiBhIG1heCBzaXplIG9mCisgKiAxNiBvY3RldHMgPSAxMjggYml0cy4gV2FybmluZywgcG9pbnRlcnMgbWlnaHQgYmUgNjQgYml0cyB3aWRlLi4uCisgKiBZb3Ugc2hvdWxkIGNoZWNrIHRoaXMgd2hlbiBpbmNyZWFzaW5nIHRoZSBzdHJ1Y3R1cmVzIGRlZmluZWQKKyAqIGFib3ZlIGluIHRoaXMgZmlsZS4uLgorICovCit1bmlvbglpd3JlcV9kYXRhCit7CisJLyogQ29uZmlnIC0gZ2VuZXJpYyAqLworCWNoYXIJCW5hbWVbSUZOQU1TSVpdOworCS8qIE5hbWUgOiB1c2VkIHRvIHZlcmlmeSB0aGUgcHJlc2VuY2Ugb2YgIHdpcmVsZXNzIGV4dGVuc2lvbnMuCisJICogTmFtZSBvZiB0aGUgcHJvdG9jb2wvcHJvdmlkZXIuLi4gKi8KKworCXN0cnVjdCBpd19wb2ludAllc3NpZDsJCS8qIEV4dGVuZGVkIG5ldHdvcmsgbmFtZSAqLworCXN0cnVjdCBpd19wYXJhbQlud2lkOwkJLyogbmV0d29yayBpZCAob3IgZG9tYWluIC0gdGhlIGNlbGwpICovCisJc3RydWN0IGl3X2ZyZXEJZnJlcTsJCS8qIGZyZXF1ZW5jeSBvciBjaGFubmVsIDoKKwkJCQkJICogMC0xMDAwID0gY2hhbm5lbAorCQkJCQkgKiA+IDEwMDAgPSBmcmVxdWVuY3kgaW4gSHogKi8KKworCXN0cnVjdCBpd19wYXJhbQlzZW5zOwkJLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCAqLworCXN0cnVjdCBpd19wYXJhbQliaXRyYXRlOwkvKiBkZWZhdWx0IGJpdCByYXRlICovCisJc3RydWN0IGl3X3BhcmFtCXR4cG93ZXI7CS8qIGRlZmF1bHQgdHJhbnNtaXQgcG93ZXIgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JcnRzOwkJLyogUlRTIHRocmVzaG9sZCB0aHJlc2hvbGQgKi8KKwlzdHJ1Y3QgaXdfcGFyYW0JZnJhZzsJCS8qIEZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCisJX191MzIJCW1vZGU7CQkvKiBPcGVyYXRpb24gbW9kZSAqLworCXN0cnVjdCBpd19wYXJhbQlyZXRyeTsJCS8qIFJldHJ5IGxpbWl0cyAmIGxpZmV0aW1lICovCisKKwlzdHJ1Y3QgaXdfcG9pbnQJZW5jb2Rpbmc7CS8qIEVuY29kaW5nIHN0dWZmIDogdG9rZW5zICovCisJc3RydWN0IGl3X3BhcmFtCXBvd2VyOwkJLyogUE0gZHVyYXRpb24vdGltZW91dCAqLworCXN0cnVjdCBpd19xdWFsaXR5IHF1YWw7CQkvKiBRdWFsaXR5IHBhcnQgb2Ygc3RhdGlzdGljcyAqLworCisJc3RydWN0IHNvY2thZGRyCWFwX2FkZHI7CS8qIEFjY2VzcyBwb2ludCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyCWFkZHI7CQkvKiBEZXN0aW5hdGlvbiBhZGRyZXNzIChody9tYWMpICovCisKKwlzdHJ1Y3QgaXdfcGFyYW0JcGFyYW07CQkvKiBPdGhlciBzbWFsbCBwYXJhbWV0ZXJzICovCisJc3RydWN0IGl3X3BvaW50CWRhdGE7CQkvKiBPdGhlciBsYXJnZSBwYXJhbWV0ZXJzICovCit9OworCisvKgorICogVGhlIHN0cnVjdHVyZSB0byBleGNoYW5nZSBkYXRhIGZvciBpb2N0bC4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBzYW1lIGFzICdzdHJ1Y3QgaWZyZXEnLCBidXQgKHJlKWRlZmluZWQgZm9yCisgKiBjb252ZW5pZW5jZS4uLgorICogRG8gSSBuZWVkIHRvIHJlbWluZCB5b3UgYWJvdXQgc3RydWN0dXJlIHNpemUgKDMyIG9jdGV0cykgPworICovCitzdHJ1Y3QJaXdyZXEgCit7CisJdW5pb24KKwl7CisJCWNoYXIJaWZybl9uYW1lW0lGTkFNU0laXTsJLyogaWYgbmFtZSwgZS5nLiAiZXRoMCIgKi8KKwl9IGlmcl9pZnJuOworCisJLyogRGF0YSBwYXJ0IChkZWZpbmVkIGp1c3QgYWJvdmUpICovCisJdW5pb24JaXdyZXFfZGF0YQl1OworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwgREFUQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqCUZvciB0aG9zZSBpb2N0bCB3aGljaCB3YW50IHRvIGV4Y2hhbmdlIG1vZGUgZGF0YSB0aGF0IHdoYXQgY291bGQKKyAqCWZpdCBpbiB0aGUgYWJvdmUgc3RydWN0dXJlLi4uCisgKi8KKworLyoKKyAqCVJhbmdlIG9mIHBhcmFtZXRlcnMKKyAqLworCitzdHJ1Y3QJaXdfcmFuZ2UKK3sKKwkvKiBJbmZvcm1hdGl2ZSBzdHVmZiAodG8gY2hvb3NlIGJldHdlZW4gZGlmZmVyZW50IGludGVyZmFjZSkgKi8KKwlfX3UzMgkJdGhyb3VnaHB1dDsJLyogVG8gZ2l2ZSBhbiBpZGVhLi4uICovCisJLyogSW4gdGhlb3J5IHRoaXMgdmFsdWUgc2hvdWxkIGJlIHRoZSBtYXhpbXVtIGJlbmNobWFya2VkCisJICogVENQL0lQIHRocm91Z2hwdXQsIGJlY2F1c2Ugd2l0aCBtb3N0IG9mIHRoZXNlIGRldmljZXMgdGhlCisJICogYml0IHJhdGUgaXMgbWVhbmluZ2xlc3MgKG92ZXJoZWFkIGFuIGNvKSB0byBlc3RpbWF0ZSBob3cKKwkgKiBmYXN0IHRoZSBjb25uZWN0aW9uIHdpbGwgZ28gYW5kIHBpY2sgdGhlIGZhc3Rlc3Qgb25lLgorCSAqIEkgc3VnZ2VzdCBwZW9wbGUgdG8gcGxheSB3aXRoIE5ldHBlcmYgb3IgYW55IGJlbmNobWFyay4uLgorCSAqLworCisJLyogTldJRCAob3IgZG9tYWluIGlkKSAqLworCV9fdTMyCQltaW5fbndpZDsJLyogTWluaW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCV9fdTMyCQltYXhfbndpZDsJLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCisJLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworCV9fdTE2CQlvbGRfbnVtX2NoYW5uZWxzOworCV9fdTgJCW9sZF9udW1fZnJlcXVlbmN5OworCisJLyogU2NhbiBjYXBhYmlsaXRpZXMgKi8KKwlfX3U4CQlzY2FuX2NhcGE7IAkvKiBJV19TQ0FOX0NBUEFfKiBiaXQgZmllbGQgKi8KKworCS8qIFdpcmVsZXNzIGV2ZW50IGNhcGFiaWxpdHkgYml0bWFza3MgKi8KKwlfX3UzMgkJZXZlbnRfY2FwYVs2XTsKKworCS8qIHNpZ25hbCBsZXZlbCB0aHJlc2hvbGQgcmFuZ2UgKi8KKwlfX3MzMgkJc2Vuc2l0aXZpdHk7CisKKwkvKiBRdWFsaXR5IG9mIGxpbmsgJiBTTlIgc3R1ZmYgKi8KKwkvKiBRdWFsaXR5IHJhbmdlIChsaW5rLCBsZXZlbCwgbm9pc2UpCisJICogSWYgdGhlIHF1YWxpdHkgaXMgYWJzb2x1dGUsIGl0IHdpbGwgYmUgaW4gdGhlIHJhbmdlIFswIDsgbWF4X3F1YWxdLAorCSAqIGlmIHRoZSBxdWFsaXR5IGlzIGRCbSwgaXQgd2lsbCBiZSBpbiB0aGUgcmFuZ2UgW21heF9xdWFsIDsgMF0uCisJICogRG9uJ3QgZm9yZ2V0IHRoYXQgd2UgdXNlIDggYml0IGFyaXRobWV0aWNzLi4uICovCisJc3RydWN0IGl3X3F1YWxpdHkJbWF4X3F1YWw7CS8qIFF1YWxpdHkgb2YgdGhlIGxpbmsgKi8KKwkvKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBhdmVyYWdlL3R5cGljYWwgdmFsdWVzIG9mIHRoZSBxdWFsaXR5CisJICogaW5kaWNhdG9yLiBUaGlzIHNob3VsZCBiZSB0aGUgdGhyZXNob2xkIGJldHdlZW4gYSAiZ29vZCIgYW5kCisJICogYSAiYmFkIiBsaW5rIChleGFtcGxlIDogbW9uaXRvciBnb2luZyBmcm9tIGdyZWVuIHRvIG9yYW5nZSkuCisJICogQ3VycmVudGx5LCB1c2VyIHNwYWNlIGFwcHMgbGlrZSBxdWFsaXR5IG1vbml0b3JzIGRvbid0IGhhdmUgYW55CisJICogd2F5IHRvIGNhbGlicmF0ZSB0aGUgbWVhc3VyZW1lbnQuIFdpdGggdGhpcywgdGhleSBjYW4gc3BsaXQKKwkgKiB0aGUgcmFuZ2UgYmV0d2VlbiAwIGFuZCBtYXhfcXVhbCBpbiBkaWZmZXJlbnQgcXVhbGl0eSBsZXZlbAorCSAqICh1c2luZyBhIGdlb21ldHJpYyBzdWJkaXZpc2lvbiBjZW50ZXJlZCBvbiB0aGUgYXZlcmFnZSkuCisJICogSSBleHBlY3QgdGhhdCBwZW9wbGUgZG9pbmcgdGhlIHVzZXIgc3BhY2UgYXBwcyB3aWxsIGZlZWRiYWNrCisJICogdXMgb24gd2hpY2ggdmFsdWUgd2UgbmVlZCB0byBwdXQgaW4gZWFjaCBkcml2ZXIuLi4gKi8KKwlzdHJ1Y3QgaXdfcXVhbGl0eQlhdmdfcXVhbDsJLyogUXVhbGl0eSBvZiB0aGUgbGluayAqLworCisJLyogUmF0ZXMgKi8KKwlfX3U4CQludW1fYml0cmF0ZXM7CS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsaXN0ICovCisJX19zMzIJCWJpdHJhdGVbSVdfTUFYX0JJVFJBVEVTXTsJLyogbGlzdCwgaW4gYnBzICovCisKKwkvKiBSVFMgdGhyZXNob2xkICovCisJX19zMzIJCW1pbl9ydHM7CS8qIE1pbmltYWwgUlRTIHRocmVzaG9sZCAqLworCV9fczMyCQltYXhfcnRzOwkvKiBNYXhpbWFsIFJUUyB0aHJlc2hvbGQgKi8KKworCS8qIEZyYWcgdGhyZXNob2xkICovCisJX19zMzIJCW1pbl9mcmFnOwkvKiBNaW5pbWFsIGZyYWcgdGhyZXNob2xkICovCisJX19zMzIJCW1heF9mcmFnOwkvKiBNYXhpbWFsIGZyYWcgdGhyZXNob2xkICovCisKKwkvKiBQb3dlciBNYW5hZ2VtZW50IGR1cmF0aW9uICYgdGltZW91dCAqLworCV9fczMyCQltaW5fcG1wOwkvKiBNaW5pbWFsIFBNIHBlcmlvZCAqLworCV9fczMyCQltYXhfcG1wOwkvKiBNYXhpbWFsIFBNIHBlcmlvZCAqLworCV9fczMyCQltaW5fcG10OwkvKiBNaW5pbWFsIFBNIHRpbWVvdXQgKi8KKwlfX3MzMgkJbWF4X3BtdDsJLyogTWF4aW1hbCBQTSB0aW1lb3V0ICovCisJX191MTYJCXBtcF9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIFBNIHBlcmlvZCAqLworCV9fdTE2CQlwbXRfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiBQTSB0aW1lb3V0ICovCisJX191MTYJCXBtX2NhcGE7CS8qIFdoYXQgUE0gb3B0aW9ucyBhcmUgc3VwcG9ydGVkICovCisKKwkvKiBFbmNvZGVyIHN0dWZmICovCisJX191MTYJZW5jb2Rpbmdfc2l6ZVtJV19NQVhfRU5DT0RJTkdfU0laRVNdOwkvKiBEaWZmZXJlbnQgdG9rZW4gc2l6ZXMgKi8KKwlfX3U4CW51bV9lbmNvZGluZ19zaXplczsJLyogTnVtYmVyIG9mIGVudHJ5IGluIHRoZSBsaXN0ICovCisJX191OAltYXhfZW5jb2RpbmdfdG9rZW5zOwkvKiBNYXggbnVtYmVyIG9mIHRva2VucyAqLworCS8qIEZvciBkcml2ZXJzIHRoYXQgbmVlZCBhICJsb2dpbi9wYXNzd2QiIGZvcm0gKi8KKwlfX3U4CWVuY29kaW5nX2xvZ2luX2luZGV4OwkvKiB0b2tlbiBpbmRleCBmb3IgbG9naW4gdG9rZW4gKi8KKworCS8qIFRyYW5zbWl0IHBvd2VyICovCisJX191MTYJCXR4cG93ZXJfY2FwYTsJLyogV2hhdCBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KKwlfX3U4CQludW1fdHhwb3dlcjsJLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QgKi8KKwlfX3MzMgkJdHhwb3dlcltJV19NQVhfVFhQT1dFUl07CS8qIGxpc3QsIGluIGJwcyAqLworCisJLyogV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb24gaW5mbyAqLworCV9fdTgJCXdlX3ZlcnNpb25fY29tcGlsZWQ7CS8qIE11c3QgYmUgV0lSRUxFU1NfRVhUICovCisJX191OAkJd2VfdmVyc2lvbl9zb3VyY2U7CS8qIExhc3QgdXBkYXRlIG9mIHNvdXJjZSAqLworCisJLyogUmV0cnkgbGltaXRzIGFuZCBsaWZldGltZSAqLworCV9fdTE2CQlyZXRyeV9jYXBhOwkvKiBXaGF0IHJldHJ5IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworCV9fdTE2CQlyZXRyeV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpbWl0ICovCisJX191MTYJCXJfdGltZV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpZmUgKi8KKwlfX3MzMgkJbWluX3JldHJ5OwkvKiBNaW5pbWFsIG51bWJlciBvZiByZXRyaWVzICovCisJX19zMzIJCW1heF9yZXRyeTsJLyogTWF4aW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLworCV9fczMyCQltaW5fcl90aW1lOwkvKiBNaW5pbWFsIHJldHJ5IGxpZmV0aW1lICovCisJX19zMzIJCW1heF9yX3RpbWU7CS8qIE1heGltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKworCS8qIEZyZXF1ZW5jeSAqLworCV9fdTE2CQludW1fY2hhbm5lbHM7CS8qIE51bWJlciBvZiBjaGFubmVscyBbMDsgbnVtIC0gMV0gKi8KKwlfX3U4CQludW1fZnJlcXVlbmN5OwkvKiBOdW1iZXIgb2YgZW50cnkgaW4gdGhlIGxpc3QgKi8KKwlzdHJ1Y3QgaXdfZnJlcQlmcmVxW0lXX01BWF9GUkVRVUVOQ0lFU107CS8qIGxpc3QgKi8KKwkvKiBOb3RlIDogdGhpcyBmcmVxdWVuY3kgbGlzdCBkb2Vzbid0IG5lZWQgdG8gZml0IGNoYW5uZWwgbnVtYmVycywKKwkgKiBiZWNhdXNlIGVhY2ggZW50cnkgY29udGFpbiBpdHMgY2hhbm5lbCBpbmRleCAqLworCisJX191MzIJCWVuY19jYXBhOwkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLworfTsKKworLyoKKyAqIFByaXZhdGUgaW9jdGwgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKi8KKyAKK3N0cnVjdAlpd19wcml2X2FyZ3MKK3sKKwlfX3UzMgkJY21kOwkJLyogTnVtYmVyIG9mIHRoZSBpb2N0bCB0byBpc3N1ZSAqLworCV9fdTE2CQlzZXRfYXJnczsJLyogVHlwZSBhbmQgbnVtYmVyIG9mIGFyZ3MgKi8KKwlfX3UxNgkJZ2V0X2FyZ3M7CS8qIFR5cGUgYW5kIG51bWJlciBvZiBhcmdzICovCisJY2hhcgkJbmFtZVtJRk5BTVNJWl07CS8qIE5hbWUgb2YgdGhlIGV4dGVuc2lvbiAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVZFTlRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogV2lyZWxlc3MgZXZlbnRzIGFyZSBjYXJyaWVkIHRocm91Z2ggdGhlIHJ0bmV0bGluayBzb2NrZXQgdG8gdXNlcgorICogc3BhY2UuIFRoZXkgYXJlIGVuY2Fwc3VsYXRlZCBpbiB0aGUgSUZMQV9XSVJFTEVTUyBmaWVsZCBvZgorICogYSBSVE1fTkVXTElOSyBtZXNzYWdlLgorICovCisKKy8qCisgKiBBIFdpcmVsZXNzIEV2ZW50LiBDb250YWlucyBiYXNpY2FsbHkgdGhlIHNhbWUgZGF0YSBhcyB0aGUgaW9jdGwuLi4KKyAqLworc3RydWN0IGl3X2V2ZW50Cit7CisJX191MTYJCWxlbjsJCQkvKiBSZWFsIGxlbmdodCBvZiB0aGlzIHN0dWZmICovCisJX191MTYJCWNtZDsJCQkvKiBXaXJlbGVzcyBJT0NUTCAqLworCXVuaW9uIGl3cmVxX2RhdGEJdTsJCS8qIElPQ1RMIGZpeGVkIHBheWxvYWQgKi8KK307CisKKy8qIFNpemUgb2YgdGhlIEV2ZW50IHByZWZpeCAoaW5jbHVkaW5nIHBhZGRpbmcgYW5kIGFsaWduZW1lbnQganVuaykgKi8KKyNkZWZpbmUgSVdfRVZfTENQX0xFTgkoc2l6ZW9mKHN0cnVjdCBpd19ldmVudCkgLSBzaXplb2YodW5pb24gaXdyZXFfZGF0YSkpCisvKiBTaXplIG9mIHRoZSB2YXJpb3VzIGV2ZW50cyAqLworI2RlZmluZSBJV19FVl9DSEFSX0xFTgkoSVdfRVZfTENQX0xFTiArIElGTkFNU0laKQorI2RlZmluZSBJV19FVl9VSU5UX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihfX3UzMikpCisjZGVmaW5lIElXX0VWX0ZSRVFfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19mcmVxKSkKKyNkZWZpbmUgSVdfRVZfUEFSQU1fTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19wYXJhbSkpCisjZGVmaW5lIElXX0VWX0FERFJfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpCisjZGVmaW5lIElXX0VWX1FVQUxfTEVOCShJV19FVl9MQ1BfTEVOICsgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSkKKworLyogaXdfcG9pbnQgZXZlbnRzIGFyZSBzcGVjaWFsLiBGaXJzdCwgdGhlIHBheWxvYWQgKGV4dHJhIGRhdGEpIGNvbWUgYXQKKyAqIHRoZSBlbmQgb2YgdGhlIGV2ZW50LCBzbyB0aGV5IGFyZSBiaWdnZXIgdGhhbiBJV19FVl9QT0lOVF9MRU4uIFNlY29uZCwKKyAqIHdlIG9taXQgdGhlIHBvaW50ZXIsIHNvIHN0YXJ0IGF0IGFuIG9mZnNldC4gKi8KKyNkZWZpbmUgSVdfRVZfUE9JTlRfT0ZGICgoKGNoYXIgKikgJigoKHN0cnVjdCBpd19wb2ludCAqKSBOVUxMKS0+bGVuZ3RoKSkgLSBcCisJCQkgIChjaGFyICopIE5VTEwpCisjZGVmaW5lIElXX0VWX1BPSU5UX0xFTgkoSVdfRVZfTENQX0xFTiArIHNpemVvZihzdHJ1Y3QgaXdfcG9pbnQpIC0gXAorCQkJIElXX0VWX1BPSU5UX09GRikKKworLyogU2l6ZSBvZiB0aGUgRXZlbnQgcHJlZml4IHdoZW4gcGFja2VkIGluIHN0cmVhbSAqLworI2RlZmluZSBJV19FVl9MQ1BfUEtfTEVOCSg0KQorLyogU2l6ZSBvZiB0aGUgdmFyaW91cyBldmVudHMgd2hlbiBwYWNrZWQgaW4gc3RyZWFtICovCisjZGVmaW5lIElXX0VWX0NIQVJfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgSUZOQU1TSVopCisjZGVmaW5lIElXX0VWX1VJTlRfUEtfTEVOCShJV19FVl9MQ1BfUEtfTEVOICsgc2l6ZW9mKF9fdTMyKSkKKyNkZWZpbmUgSVdfRVZfRlJFUV9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IGl3X2ZyZXEpKQorI2RlZmluZSBJV19FVl9QQVJBTV9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3BhcmFtKSkKKyNkZWZpbmUgSVdfRVZfQUREUl9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkKKyNkZWZpbmUgSVdfRVZfUVVBTF9QS19MRU4JKElXX0VWX0xDUF9QS19MRU4gKyBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKQorI2RlZmluZSBJV19FVl9QT0lOVF9QS19MRU4JKElXX0VWX0xDUF9MRU4gKyA0KQorCisjZW5kaWYJLyogX0xJTlVYX1dJUkVMRVNTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgveDI1LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3gyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzVlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3gyNS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogVGhlc2UgYXJlIHRoZSBwdWJsaWMgZWxlbWVudHMgb2YgdGhlIExpbnV4IGtlcm5lbCBYLjI1IGltcGxlbWVudGF0aW9uLgorICoKKyAqIAlIaXN0b3J5CisgKgltYXIvMjAvMDAJRGFuaWVsYSBTcXVhc3NvbmkgRGlzYWJsaW5nL2VuYWJsaW5nIG9mIGZhY2lsaXRpZXMgCisgKgkJCQkJICBuZWdvdGlhdGlvbi4KKyAqCWFwci8wMi8wNQlTaGF1biBQZXJlaXJhIFNlbGVjdGl2ZSBzdWIgYWRkcmVzcyBtYXRjaGluZyB3aXRoCisgKgkJCQkJY2FsbCB1c2VyIGRhdGEKKyAqLworCisjaWZuZGVmCVgyNV9LRVJORUxfSAorI2RlZmluZQlYMjVfS0VSTkVMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUJU0lPQ1gyNUdTVUJTQ1JJUAkoU0lPQ1BST1RPUFJJVkFURSArIDApCisjZGVmaW5lCVNJT0NYMjVTU1VCU0NSSVAJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZQlTSU9DWDI1R0ZBQ0lMSVRJRVMJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZQlTSU9DWDI1U0ZBQ0lMSVRJRVMJKFNJT0NQUk9UT1BSSVZBVEUgKyAzKQorI2RlZmluZQlTSU9DWDI1R0NBTExVU0VSREFUQQkoU0lPQ1BST1RPUFJJVkFURSArIDQpCisjZGVmaW5lCVNJT0NYMjVTQ0FMTFVTRVJEQVRBCShTSU9DUFJPVE9QUklWQVRFICsgNSkKKyNkZWZpbmUJU0lPQ1gyNUdDQVVTRURJQUcJKFNJT0NQUk9UT1BSSVZBVEUgKyA2KQorI2RlZmluZSBTSU9DWDI1U0NVRE1BVENITEVOCShTSU9DUFJPVE9QUklWQVRFICsgNykKKyNkZWZpbmUgU0lPQ1gyNUNBTExBQ0NQVEFQUFJWICAgKFNJT0NQUk9UT1BSSVZBVEUgKyA4KQorI2RlZmluZSBTSU9DWDI1U0VORENBTExBQ0NQVCAgICAoU0lPQ1BST1RPUFJJVkFURSArIDkpCisjZGVmaW5lIFNJT0NYMjVHRFRFRkFDSUxJVElFUyAoU0lPQ1BST1RPUFJJVkFURSArIDEwKQorI2RlZmluZSBTSU9DWDI1U0RURUZBQ0lMSVRJRVMgKFNJT0NQUk9UT1BSSVZBVEUgKyAxMSkKKworLyoKKyAqCVZhbHVlcyBmb3Ige2dldCxzZXR9c29ja29wdC4KKyAqLworI2RlZmluZQlYMjVfUUJJVElOQ0wJCTEKKworLyoKKyAqCVguMjUgUGFja2V0IFNpemUgdmFsdWVzLgorICovCisjZGVmaW5lCVgyNV9QUzE2CQk0CisjZGVmaW5lCVgyNV9QUzMyCQk1CisjZGVmaW5lCVgyNV9QUzY0CQk2CisjZGVmaW5lCVgyNV9QUzEyOAkJNworI2RlZmluZQlYMjVfUFMyNTYJCTgKKyNkZWZpbmUJWDI1X1BTNTEyCQk5CisjZGVmaW5lCVgyNV9QUzEwMjQJCTEwCisjZGVmaW5lCVgyNV9QUzIwNDgJCTExCisjZGVmaW5lCVgyNV9QUzQwOTYJCTEyCisKKy8qCisgKiBBbiBYLjEyMSBhZGRyZXNzLCBpdCBpcyBoZWxkIGFzIEFTQ0lJIHRleHQsIG51bGwgdGVybWluYXRlZCwgdXAgdG8gMTUKKyAqIGRpZ2l0cyBhbmQgYSBudWxsIHRlcm1pbmF0b3IuCisgKi8KK3N0cnVjdCB4MjVfYWRkcmVzcyB7CisJY2hhciB4MjVfYWRkclsxNl07Cit9OworCisvKgorICoJTGludXggWC4yNSBBZGRyZXNzIHN0cnVjdHVyZSwgdXNlZCBmb3IgYmluZCwgYW5kIGNvbm5lY3QgbW9zdGx5LgorICovCitzdHJ1Y3Qgc29ja2FkZHJfeDI1IHsKKwlzYV9mYW1pbHlfdAkgICBzeDI1X2ZhbWlseTsJCS8qIE11c3QgYmUgQUZfWDI1ICovCisJc3RydWN0IHgyNV9hZGRyZXNzIHN4MjVfYWRkcjsJCS8qIFguMTIxIEFkZHJlc3MgKi8KK307CisKKy8qCisgKglEVEUvRENFIHN1YnNjcmlwdGlvbiBvcHRpb25zLgorICoKKyAqICAgICAgQXMgdGhpcyBpcyBtaXNzaW5nIGxvdHMgb2Ygb3B0aW9ucywgdXNlciBzaG91bGQgZXhwZWN0IG1ham9yCisgKgljaGFuZ2VzIG9mIHRoaXMgc3RydWN0dXJlIGluIDIuNS54IHdoaWNoIG1pZ2h0IGJyZWFrIGNvbXBhdGliaWx0eS4KKyAqICAgICAgVGhlIHNvbWV3aGF0IHVnbHkgZGltZW5zaW9uIDIwMC1zaXplb2YoKSBpcyBuZWVkZWQgdG8gbWFpbnRhaW4KKyAqCWJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KK3N0cnVjdCB4MjVfc3Vic2NyaXBfc3RydWN0IHsKKwljaGFyIGRldmljZVsyMDAtc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKwl1bnNpZ25lZCBsb25nCWdsb2JhbF9mYWNpbF9tYXNrOwkvKiAwIHRvIGRpc2FibGUgbmVnb3RpYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJZXh0ZW5kZWQ7Cit9OworCisvKiB2YWx1ZXMgZm9yIGFib3ZlIGdsb2JhbF9mYWNpbF9tYXNrICovCisKKyNkZWZpbmUJWDI1X01BU0tfUkVWRVJTRQkweDAxCQorI2RlZmluZQlYMjVfTUFTS19USFJPVUdIUFVUCTB4MDIKKyNkZWZpbmUJWDI1X01BU0tfUEFDS0VUX1NJWkUJMHgwNAorI2RlZmluZQlYMjVfTUFTS19XSU5ET1dfU0laRQkweDA4CisKKyNkZWZpbmUgWDI1X01BU0tfQ0FMTElOR19BRSAweDEwCisjZGVmaW5lIFgyNV9NQVNLX0NBTExFRF9BRSAweDIwCisKKworLyoKKyAqCVJvdXRpbmcgdGFibGUgY29udHJvbCBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB4MjVfcm91dGVfc3RydWN0IHsKKwlzdHJ1Y3QgeDI1X2FkZHJlc3MgYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJICAgc2lnZGlnaXRzOworCWNoYXIJCSAgIGRldmljZVsyMDBdOworfTsKKworLyoKKyAqCUZhY2lsaXRpZXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgeDI1X2ZhY2lsaXRpZXMgeworCXVuc2lnbmVkIGludAl3aW5zaXplX2luLCB3aW5zaXplX291dDsKKwl1bnNpZ25lZCBpbnQJcGFjc2l6ZV9pbiwgcGFjc2l6ZV9vdXQ7CisJdW5zaWduZWQgaW50CXRocm91Z2hwdXQ7CisJdW5zaWduZWQgaW50CXJldmVyc2U7Cit9OworCisvKgorKiBJVFUgRFRFIGZhY2lsaXRpZXMKKyogT25seSB0aGUgY2FsbGVkIGFuZCBjYWxsaW5nIGFkZHJlc3MKKyogZXh0ZW5zaW9uIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisqIFRoZSByZXN0IGFyZSBpbiBwbGFjZSB0byBhdm9pZCB0aGUgc3RydWN0CisqIGNoYW5naW5nIHNpemUgaWYgc29tZW9uZSBuZWVkcyB0aGVtIGxhdGVyCisqLworCitzdHJ1Y3QgeDI1X2R0ZV9mYWNpbGl0aWVzIHsKKwlfX3UxNiBkZWxheV9jdW11bDsKKwlfX3UxNiBkZWxheV90YXJnZXQ7CisJX191MTYgZGVsYXlfbWF4OworCV9fdTggbWluX3Rocm91Z2hwdXQ7CisJX191OCBleHBlZGl0ZWQ7CisJX191OCBjYWxsaW5nX2xlbjsKKwlfX3U4IGNhbGxlZF9sZW47CisJX191OCBjYWxsaW5nX2FlWzIwXTsKKwlfX3U4IGNhbGxlZF9hZVsyMF07Cit9OworCisvKgorICoJQ2FsbCBVc2VyIERhdGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgeDI1X2NhbGx1c2VyZGF0YSB7CisJdW5zaWduZWQgaW50CWN1ZGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyCWN1ZGRhdGFbMTI4XTsKK307CisKKy8qCisgKglDYWxsIGNsZWFyaW5nIENhdXNlIGFuZCBEaWFnbm9zdGljIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHgyNV9jYXVzZWRpYWcgeworCXVuc2lnbmVkIGNoYXIJY2F1c2U7CisJdW5zaWduZWQgY2hhcglkaWFnbm9zdGljOworfTsKKworLyoKKyAqCUZ1cnRoZXIgb3B0aW9uYWwgY2FsbCB1c2VyIGRhdGEgbWF0Y2ggbGVuZ3RoIHNlbGVjdGlvbgorICovCitzdHJ1Y3QgeDI1X3N1YmFkZHIgeworCXVuc2lnbmVkIGludCBjdWRtYXRjaGxlbmd0aDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94YXR0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2EzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAgRmlsZTogbGludXgveGF0dHIuaAorCisgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgaGFuZGxpbmcuCisKKyAgQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgR3J1ZW5iYWNoZXIgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBDb3B5cmlnaHQgKGMpIDIwMDQgUmVkIEhhdCwgSW5jLiwgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+CisqLworI2lmbmRlZiBfTElOVVhfWEFUVFJfSAorI2RlZmluZSBfTElOVVhfWEFUVFJfSAorCisjZGVmaW5lIFhBVFRSX0NSRUFURQkweDEJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgYWxyZWFkeSBleGlzdHMgKi8KKyNkZWZpbmUgWEFUVFJfUkVQTEFDRQkweDIJLyogc2V0IHZhbHVlLCBmYWlsIGlmIGF0dHIgZG9lcyBub3QgZXhpc3QgKi8KKworCisjZW5kaWYJLyogX0xJTlVYX1hBVFRSX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgveGZybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9saW51eC94ZnJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhYTA0MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbGludXgveGZybS5oCkBAIC0wLDAgKzEsNDQ1IEBACisjaWZuZGVmIF9MSU5VWF9YRlJNX0gKKyNkZWZpbmUgX0xJTlVYX1hGUk1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQWxsIG9mIHRoZSBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZSBtYXkgbm90IGNoYW5nZSBzaXplIGFzIHRoZXkgYXJlCisgKiBwYXNzZWQgaW50byB0aGUga2VybmVsIGZyb20gdXNlcnNwYWNlIHZpYSBuZXRsaW5rIHNvY2tldHMuCisgKi8KKworLyogU3RydWN0dXJlIHRvIGVuY2Fwc3VsYXRlIGFkZHJlc3Nlcy4gSSBkbyBub3Qgd2FudCB0byB1c2UKKyAqICJzdGFuZGFyZCIgc3RydWN0dXJlLiBNeSBhcG9sb2dpZXMuCisgKi8KK3R5cGVkZWYgdW5pb24KK3sKKwlfX2JlMzIJCWE0OworCV9fYmUzMgkJYTZbNF07Cit9IHhmcm1fYWRkcmVzc190OworCisvKiBJZGVudCBvZiBhIHNwZWNpZmljIHhmcm1fc3RhdGUuIEl0IGlzIHVzZWQgb24gaW5wdXQgdG8gbG9va3VwCisgKiB0aGUgc3RhdGUgYnkgKHNwaSxkYWRkcixhaC9lc3ApIG9yIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0CisgKiBzcGksIHByb3RvY29sIGFuZCB0dW5uZWwgYWRkcmVzcyBvbiBvdXRwdXQuCisgKi8KK3N0cnVjdCB4ZnJtX2lkCit7CisJeGZybV9hZGRyZXNzX3QJZGFkZHI7CisJX19iZTMyCQlzcGk7CisJX191OAkJcHJvdG87Cit9OworCitzdHJ1Y3QgeGZybV9zZWNfY3R4IHsKKwlfX3U4CWN0eF9kb2k7CisJX191OAljdHhfYWxnOworCV9fdTE2CWN0eF9sZW47CisJX191MzIJY3R4X3NpZDsKKwljaGFyCWN0eF9zdHJbMF07Cit9OworCisvKiBTZWN1cml0eSBDb250ZXh0IERvbWFpbnMgb2YgSW50ZXJwcmV0YXRpb24gKi8KKyNkZWZpbmUgWEZSTV9TQ19ET0lfUkVTRVJWRUQgMAorI2RlZmluZSBYRlJNX1NDX0RPSV9MU00gMQorCisvKiBTZWN1cml0eSBDb250ZXh0IEFsZ29yaXRobXMgKi8KKyNkZWZpbmUgWEZSTV9TQ19BTEdfUkVTRVJWRUQgMAorI2RlZmluZSBYRlJNX1NDX0FMR19TRUxJTlVYIDEKKworLyogU2VsZWN0b3IsIHVzZWQgYXMgc2VsZWN0b3IgYm90aCBvbiBwb2xpY3kgcnVsZXMgKFNQRCkgYW5kIFNBcy4gKi8KKworc3RydWN0IHhmcm1fc2VsZWN0b3IKK3sKKwl4ZnJtX2FkZHJlc3NfdAlkYWRkcjsKKwl4ZnJtX2FkZHJlc3NfdAlzYWRkcjsKKwlfX2JlMTYJZHBvcnQ7CisJX19iZTE2CWRwb3J0X21hc2s7CisJX19iZTE2CXNwb3J0OworCV9fYmUxNglzcG9ydF9tYXNrOworCV9fdTE2CWZhbWlseTsKKwlfX3U4CXByZWZpeGxlbl9kOworCV9fdTgJcHJlZml4bGVuX3M7CisJX191OAlwcm90bzsKKwlpbnQJaWZpbmRleDsKKwl1aWRfdAl1c2VyOworfTsKKworI2RlZmluZSBYRlJNX0lORiAofihfX3U2NCkwKQorCitzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcKK3sKKwlfX3U2NAlzb2Z0X2J5dGVfbGltaXQ7CisJX191NjQJaGFyZF9ieXRlX2xpbWl0OworCV9fdTY0CXNvZnRfcGFja2V0X2xpbWl0OworCV9fdTY0CWhhcmRfcGFja2V0X2xpbWl0OworCV9fdTY0CXNvZnRfYWRkX2V4cGlyZXNfc2Vjb25kczsKKwlfX3U2NAloYXJkX2FkZF9leHBpcmVzX3NlY29uZHM7CisJX191NjQJc29mdF91c2VfZXhwaXJlc19zZWNvbmRzOworCV9fdTY0CWhhcmRfdXNlX2V4cGlyZXNfc2Vjb25kczsKK307CisKK3N0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1cgoreworCV9fdTY0CWJ5dGVzOworCV9fdTY0CXBhY2tldHM7CisJX191NjQJYWRkX3RpbWU7CisJX191NjQJdXNlX3RpbWU7Cit9OworCitzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGUKK3sKKwlfX3UzMglvc2VxOworCV9fdTMyCXNlcTsKKwlfX3UzMgliaXRtYXA7Cit9OworCitzdHJ1Y3QgeGZybV9hbGdvIHsKKwljaGFyCWFsZ19uYW1lWzY0XTsKKwlpbnQJYWxnX2tleV9sZW47ICAgIC8qIGluIGJpdHMgKi8KKwljaGFyCWFsZ19rZXlbMF07Cit9OworCitzdHJ1Y3QgeGZybV9zdGF0cyB7CisJX191MzIJcmVwbGF5X3dpbmRvdzsKKwlfX3UzMglyZXBsYXk7CisJX191MzIJaW50ZWdyaXR5X2ZhaWxlZDsKK307CisKK2VudW0KK3sKKwlYRlJNX1BPTElDWV9UWVBFX01BSU4JPSAwLAorCVhGUk1fUE9MSUNZX1RZUEVfU1VCCT0gMSwKKwlYRlJNX1BPTElDWV9UWVBFX01BWAk9IDIKK307CisKK2VudW0KK3sKKwlYRlJNX1BPTElDWV9JTgk9IDAsCisJWEZSTV9QT0xJQ1lfT1VUCT0gMSwKKwlYRlJNX1BPTElDWV9GV0QJPSAyLAorCVhGUk1fUE9MSUNZX01BWAk9IDMKK307CisKK2VudW0KK3sKKwlYRlJNX1NIQVJFX0FOWSwJCS8qIE5vIGxpbWl0YXRpb25zICovCisJWEZSTV9TSEFSRV9TRVNTSU9OLAkvKiBGb3IgdGhpcyBzZXNzaW9uIG9ubHkgKi8KKwlYRlJNX1NIQVJFX1VTRVIsCS8qIEZvciB0aGlzIHVzZXIgb25seSAqLworCVhGUk1fU0hBUkVfVU5JUVVFCS8qIFVzZSBvbmNlICovCit9OworCisjZGVmaW5lIFhGUk1fTU9ERV9UUkFOU1BPUlQgMAorI2RlZmluZSBYRlJNX01PREVfVFVOTkVMIDEKKyNkZWZpbmUgWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIDIKKyNkZWZpbmUgWEZSTV9NT0RFX0lOX1RSSUdHRVIgMworI2RlZmluZSBYRlJNX01PREVfQkVFVCA0CisjZGVmaW5lIFhGUk1fTU9ERV9NQVggNQorCisvKiBOZXRsaW5rIGNvbmZpZ3VyYXRpb24gbWVzc2FnZXMuICAqLworZW51bSB7CisJWEZSTV9NU0dfQkFTRSA9IDB4MTAsCisKKwlYRlJNX01TR19ORVdTQSA9IDB4MTAsCisjZGVmaW5lIFhGUk1fTVNHX05FV1NBIFhGUk1fTVNHX05FV1NBCisJWEZSTV9NU0dfREVMU0EsCisjZGVmaW5lIFhGUk1fTVNHX0RFTFNBIFhGUk1fTVNHX0RFTFNBCisJWEZSTV9NU0dfR0VUU0EsCisjZGVmaW5lIFhGUk1fTVNHX0dFVFNBIFhGUk1fTVNHX0dFVFNBCisKKwlYRlJNX01TR19ORVdQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX05FV1BPTElDWSBYRlJNX01TR19ORVdQT0xJQ1kKKwlYRlJNX01TR19ERUxQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX0RFTFBPTElDWSBYRlJNX01TR19ERUxQT0xJQ1kKKwlYRlJNX01TR19HRVRQT0xJQ1ksCisjZGVmaW5lIFhGUk1fTVNHX0dFVFBPTElDWSBYRlJNX01TR19HRVRQT0xJQ1kKKworCVhGUk1fTVNHX0FMTE9DU1BJLAorI2RlZmluZSBYRlJNX01TR19BTExPQ1NQSSBYRlJNX01TR19BTExPQ1NQSQorCVhGUk1fTVNHX0FDUVVJUkUsCisjZGVmaW5lIFhGUk1fTVNHX0FDUVVJUkUgWEZSTV9NU0dfQUNRVUlSRQorCVhGUk1fTVNHX0VYUElSRSwKKyNkZWZpbmUgWEZSTV9NU0dfRVhQSVJFIFhGUk1fTVNHX0VYUElSRQorCisJWEZSTV9NU0dfVVBEUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19VUERQT0xJQ1kgWEZSTV9NU0dfVVBEUE9MSUNZCisJWEZSTV9NU0dfVVBEU0EsCisjZGVmaW5lIFhGUk1fTVNHX1VQRFNBIFhGUk1fTVNHX1VQRFNBCisKKwlYRlJNX01TR19QT0xFWFBJUkUsCisjZGVmaW5lIFhGUk1fTVNHX1BPTEVYUElSRSBYRlJNX01TR19QT0xFWFBJUkUKKworCVhGUk1fTVNHX0ZMVVNIU0EsCisjZGVmaW5lIFhGUk1fTVNHX0ZMVVNIU0EgWEZSTV9NU0dfRkxVU0hTQQorCVhGUk1fTVNHX0ZMVVNIUE9MSUNZLAorI2RlZmluZSBYRlJNX01TR19GTFVTSFBPTElDWSBYRlJNX01TR19GTFVTSFBPTElDWQorCisJWEZSTV9NU0dfTkVXQUUsCisjZGVmaW5lIFhGUk1fTVNHX05FV0FFIFhGUk1fTVNHX05FV0FFCisJWEZSTV9NU0dfR0VUQUUsCisjZGVmaW5lIFhGUk1fTVNHX0dFVEFFIFhGUk1fTVNHX0dFVEFFCisKKwlYRlJNX01TR19SRVBPUlQsCisjZGVmaW5lIFhGUk1fTVNHX1JFUE9SVCBYRlJNX01TR19SRVBPUlQKKworCVhGUk1fTVNHX01JR1JBVEUsCisjZGVmaW5lIFhGUk1fTVNHX01JR1JBVEUgWEZSTV9NU0dfTUlHUkFURQorCisJWEZSTV9NU0dfTkVXU0FESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfTkVXU0FESU5GTyBYRlJNX01TR19ORVdTQURJTkZPCisJWEZSTV9NU0dfR0VUU0FESU5GTywKKyNkZWZpbmUgWEZSTV9NU0dfR0VUU0FESU5GTyBYRlJNX01TR19HRVRTQURJTkZPCisKKwlYRlJNX01TR19ORVdTUERJTkZPLAorI2RlZmluZSBYRlJNX01TR19ORVdTUERJTkZPIFhGUk1fTVNHX05FV1NQRElORk8KKwlYRlJNX01TR19HRVRTUERJTkZPLAorI2RlZmluZSBYRlJNX01TR19HRVRTUERJTkZPIFhGUk1fTVNHX0dFVFNQRElORk8KKwlfX1hGUk1fTVNHX01BWAorfTsKKyNkZWZpbmUgWEZSTV9NU0dfTUFYIChfX1hGUk1fTVNHX01BWCAtIDEpCisKKyNkZWZpbmUgWEZSTV9OUl9NU0dUWVBFUyAoWEZSTV9NU0dfTUFYICsgMSAtIFhGUk1fTVNHX0JBU0UpCisKKy8qCisgKiBHZW5lcmljIExTTSBzZWN1cml0eSBjb250ZXh0IGZvciBjb211bmljYXRpbmcgdG8gdXNlciBzcGFjZQorICogTk9URTogU2FtZSBmb3JtYXQgYXMgc2FkYl94X3NlY19jdHgKKyAqLworc3RydWN0IHhmcm1fdXNlcl9zZWNfY3R4IHsKKwlfX3UxNgkJCWxlbjsKKwlfX3UxNgkJCWV4dHR5cGU7CisJX191OAkJCWN0eF9hbGc7ICAvKiBMU01zOiBlLmcuLCBzZWxpbnV4ID09IDEgKi8KKwlfX3U4CQkJY3R4X2RvaTsKKwlfX3UxNgkJCWN0eF9sZW47Cit9OworCitzdHJ1Y3QgeGZybV91c2VyX3RtcGwgeworCXN0cnVjdCB4ZnJtX2lkCQlpZDsKKwlfX3UxNgkJCWZhbWlseTsKKwl4ZnJtX2FkZHJlc3NfdAkJc2FkZHI7CisJX191MzIJCQlyZXFpZDsKKwlfX3U4CQkJbW9kZTsKKwlfX3U4CQkJc2hhcmU7CisJX191OAkJCW9wdGlvbmFsOworCV9fdTMyCQkJYWFsZ29zOworCV9fdTMyCQkJZWFsZ29zOworCV9fdTMyCQkJY2FsZ29zOworfTsKKworc3RydWN0IHhmcm1fZW5jYXBfdG1wbCB7CisJX191MTYJCWVuY2FwX3R5cGU7CisJX19iZTE2CQllbmNhcF9zcG9ydDsKKwlfX2JlMTYJCWVuY2FwX2Rwb3J0OworCXhmcm1fYWRkcmVzc190CWVuY2FwX29hOworfTsKKworLyogQUVWRU5UIGZsYWdzICAqLworZW51bSB4ZnJtX2FlX2Z0eXBlX3QgeworCVhGUk1fQUVfVU5TUEVDLAorCVhGUk1fQUVfUlRIUj0xLAkvKiByZXBsYXkgdGhyZXNob2xkKi8KKwlYRlJNX0FFX1JWQUw9MiwgLyogcmVwbGF5IHZhbHVlICovCisJWEZSTV9BRV9MVkFMPTQsIC8qIGxpZmV0aW1lIHZhbHVlICovCisJWEZSTV9BRV9FVEhSPTgsIC8qIGV4cGlyeSB0aW1lciB0aHJlc2hvbGQgKi8KKwlYRlJNX0FFX0NSPTE2LCAvKiBFdmVudCBjYXVzZSBpcyByZXBsYXkgdXBkYXRlICovCisJWEZSTV9BRV9DRT0zMiwgLyogRXZlbnQgY2F1c2UgaXMgdGltZXIgZXhwaXJ5ICovCisJWEZSTV9BRV9DVT02NCwgLyogRXZlbnQgY2F1c2UgaXMgcG9saWN5IHVwZGF0ZSAqLworCV9fWEZSTV9BRV9NQVgKKworI2RlZmluZSBYRlJNX0FFX01BWCAoX19YRlJNX0FFX01BWCAtIDEpCit9OworCitzdHJ1Y3QgeGZybV91c2VycG9saWN5X3R5cGUgeworCV9fdTgJCXR5cGU7CisJX191MTYJCXJlc2VydmVkMTsKKwlfX3U4CQlyZXNlcnZlZDI7Cit9OworCisvKiBOZXRsaW5rIG1lc3NhZ2UgYXR0cmlidXRlcy4gICovCitlbnVtIHhmcm1fYXR0cl90eXBlX3QgeworCVhGUk1BX1VOU1BFQywKKwlYRlJNQV9BTEdfQVVUSCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKi8KKwlYRlJNQV9BTEdfQ1JZUFQsCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKi8KKwlYRlJNQV9BTEdfQ09NUCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKi8KKwlYRlJNQV9FTkNBUCwJCS8qIHN0cnVjdCB4ZnJtX2FsZ28gKyBzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICovCisJWEZSTUFfVE1QTCwJCS8qIDEgb3IgbW9yZSBzdHJ1Y3QgeGZybV91c2VyX3RtcGwgKi8KKwlYRlJNQV9TQSwKKwlYRlJNQV9QT0xJQ1ksCisJWEZSTUFfU0VDX0NUWCwJCS8qIHN0cnVjdCB4ZnJtX3NlY19jdHggKi8KKwlYRlJNQV9MVElNRV9WQUwsCisJWEZSTUFfUkVQTEFZX1ZBTCwKKwlYRlJNQV9SRVBMQVlfVEhSRVNILAorCVhGUk1BX0VUSU1FUl9USFJFU0gsCisJWEZSTUFfU1JDQUREUiwJCS8qIHhmcm1fYWRkcmVzc190ICovCisJWEZSTUFfQ09BRERSLAkJLyogeGZybV9hZGRyZXNzX3QgKi8KKwlYRlJNQV9MQVNUVVNFRCwKKwlYRlJNQV9QT0xJQ1lfVFlQRSwJLyogc3RydWN0IHhmcm1fdXNlcnBvbGljeV90eXBlICovCisJWEZSTUFfTUlHUkFURSwKKwlfX1hGUk1BX01BWAorCisjZGVmaW5lIFhGUk1BX01BWCAoX19YRlJNQV9NQVggLSAxKQorfTsKKworZW51bSB4ZnJtX3NhZGF0dHJfdHlwZV90IHsKKwlYRlJNQV9TQURfVU5TUEVDLAorCVhGUk1BX1NBRF9DTlQsCisJWEZSTUFfU0FEX0hJTkZPLAorCV9fWEZSTUFfU0FEX01BWAorCisjZGVmaW5lIFhGUk1BX1NBRF9NQVggKF9fWEZSTUFfU0FEX01BWCAtIDEpCit9OworCitzdHJ1Y3QgeGZybXVfc2FkaGluZm8geworCV9fdTMyIHNhZGhjbnQ7IC8qIGN1cnJlbnQgaGFzaCBia3RzICovCisJX191MzIgc2FkaG1jbnQ7IC8qIG1heCBhbGxvd2VkIGhhc2ggYmt0cyAqLworfTsKKworZW51bSB4ZnJtX3NwZGF0dHJfdHlwZV90IHsKKwlYRlJNQV9TUERfVU5TUEVDLAorCVhGUk1BX1NQRF9JTkZPLAorCVhGUk1BX1NQRF9ISU5GTywKKwlfX1hGUk1BX1NQRF9NQVgKKworI2RlZmluZSBYRlJNQV9TUERfTUFYIChfX1hGUk1BX1NQRF9NQVggLSAxKQorfTsKKworc3RydWN0IHhmcm11X3NwZGluZm8geworCV9fdTMyIGluY250OworCV9fdTMyIG91dGNudDsKKwlfX3UzMiBmd2RjbnQ7CisJX191MzIgaW5zY250OworCV9fdTMyIG91dHNjbnQ7CisJX191MzIgZndkc2NudDsKK307CisKK3N0cnVjdCB4ZnJtdV9zcGRoaW5mbyB7CisJX191MzIgc3BkaGNudDsKKwlfX3UzMiBzcGRobWNudDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvIHsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCXN0cnVjdCB4ZnJtX2lkCQkJaWQ7CisJeGZybV9hZGRyZXNzX3QJCQlzYWRkcjsKKwlzdHJ1Y3QgeGZybV9saWZldGltZV9jZmcJbGZ0OworCXN0cnVjdCB4ZnJtX2xpZmV0aW1lX2N1cgljdXJsZnQ7CisJc3RydWN0IHhmcm1fc3RhdHMJCXN0YXRzOworCV9fdTMyCQkJCXNlcTsKKwlfX3UzMgkJCQlyZXFpZDsKKwlfX3UxNgkJCQlmYW1pbHk7CisJX191OAkJCQltb2RlOwkJLyogWEZSTV9NT0RFX3h4eCAqLworCV9fdTgJCQkJcmVwbGF5X3dpbmRvdzsKKwlfX3U4CQkJCWZsYWdzOworI2RlZmluZSBYRlJNX1NUQVRFX05PRUNOCTEKKyNkZWZpbmUgWEZSTV9TVEFURV9ERUNBUF9EU0NQCTIKKyNkZWZpbmUgWEZSTV9TVEFURV9OT1BNVFVESVNDCTQKKyNkZWZpbmUgWEZSTV9TVEFURV9XSUxEUkVDVgk4Cit9OworCitzdHJ1Y3QgeGZybV91c2Vyc2FfaWQgeworCXhmcm1fYWRkcmVzc190CQkJZGFkZHI7CisJX19iZTMyCQkJCXNwaTsKKwlfX3UxNgkJCQlmYW1pbHk7CisJX191OAkJCQlwcm90bzsKK307CisKK3N0cnVjdCB4ZnJtX2FldmVudF9pZCB7CisJc3RydWN0IHhmcm1fdXNlcnNhX2lkCQlzYV9pZDsKKwl4ZnJtX2FkZHJlc3NfdAkJCXNhZGRyOworCV9fdTMyCQkJCWZsYWdzOworCV9fdTMyCQkJCXJlcWlkOworfTsKKworc3RydWN0IHhmcm1fdXNlcnNwaV9pbmZvIHsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbwkJaW5mbzsKKwlfX3UzMgkJCQltaW47CisJX191MzIJCQkJbWF4OworfTsKKworc3RydWN0IHhmcm1fdXNlcnBvbGljeV9pbmZvIHsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCXN0cnVjdCB4ZnJtX2xpZmV0aW1lX2NmZwlsZnQ7CisJc3RydWN0IHhmcm1fbGlmZXRpbWVfY3VyCWN1cmxmdDsKKwlfX3UzMgkJCQlwcmlvcml0eTsKKwlfX3UzMgkJCQlpbmRleDsKKwlfX3U4CQkJCWRpcjsKKwlfX3U4CQkJCWFjdGlvbjsKKyNkZWZpbmUgWEZSTV9QT0xJQ1lfQUxMT1cJMAorI2RlZmluZSBYRlJNX1BPTElDWV9CTE9DSwkxCisJX191OAkJCQlmbGFnczsKKyNkZWZpbmUgWEZSTV9QT0xJQ1lfTE9DQUxPSwkxCS8qIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgZ2xvYmFsIHBvbGljeSAqLworCV9fdTgJCQkJc2hhcmU7Cit9OworCitzdHJ1Y3QgeGZybV91c2VycG9saWN5X2lkIHsKKwlzdHJ1Y3QgeGZybV9zZWxlY3RvcgkJc2VsOworCV9fdTMyCQkJCWluZGV4OworCV9fdTgJCQkJZGlyOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9hY3F1aXJlIHsKKwlzdHJ1Y3QgeGZybV9pZAkJCWlkOworCXhmcm1fYWRkcmVzc190CQkJc2FkZHI7CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKKwlzdHJ1Y3QgeGZybV91c2VycG9saWN5X2luZm8JcG9saWN5OworCV9fdTMyCQkJCWFhbGdvczsKKwlfX3UzMgkJCQllYWxnb3M7CisJX191MzIJCQkJY2FsZ29zOworCV9fdTMyCQkJCXNlcTsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfZXhwaXJlIHsKKwlzdHJ1Y3QgeGZybV91c2Vyc2FfaW5mbwkJc3RhdGU7CisJX191OAkJCQloYXJkOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9wb2xleHBpcmUgeworCXN0cnVjdCB4ZnJtX3VzZXJwb2xpY3lfaW5mbwlwb2w7CisJX191OAkJCQloYXJkOworfTsKKworc3RydWN0IHhmcm1fdXNlcnNhX2ZsdXNoIHsKKwlfX3U4CQkJCXByb3RvOworfTsKKworc3RydWN0IHhmcm1fdXNlcl9yZXBvcnQgeworCV9fdTgJCQkJcHJvdG87CisJc3RydWN0IHhmcm1fc2VsZWN0b3IJCXNlbDsKK307CisKK3N0cnVjdCB4ZnJtX3VzZXJfbWlncmF0ZSB7CisJeGZybV9hZGRyZXNzX3QJCQlvbGRfZGFkZHI7CisJeGZybV9hZGRyZXNzX3QJCQlvbGRfc2FkZHI7CisJeGZybV9hZGRyZXNzX3QJCQluZXdfZGFkZHI7CisJeGZybV9hZGRyZXNzX3QJCQluZXdfc2FkZHI7CisJX191OAkJCQlwcm90bzsKKwlfX3U4CQkJCW1vZGU7CisJX191MTYJCQkJcmVzZXJ2ZWQ7CisJX191MzIJCQkJcmVxaWQ7CisJX191MTYJCQkJb2xkX2ZhbWlseTsKKwlfX3UxNgkJCQluZXdfZmFtaWx5OworfTsKKworLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHVzZXJzcGFjZSAqLworI2RlZmluZSBYRlJNR1JQX0FDUVVJUkUJCTEKKyNkZWZpbmUgWEZSTUdSUF9FWFBJUkUJCTIKKyNkZWZpbmUgWEZSTUdSUF9TQQkJNAorI2RlZmluZSBYRlJNR1JQX1BPTElDWQkJOAorI2RlZmluZSBYRlJNR1JQX1JFUE9SVAkJMHgyMAorCitlbnVtIHhmcm1fbmxncm91cHMgeworCVhGUk1OTEdSUF9OT05FLAorI2RlZmluZSBYRlJNTkxHUlBfTk9ORQkJWEZSTU5MR1JQX05PTkUKKwlYRlJNTkxHUlBfQUNRVUlSRSwKKyNkZWZpbmUgWEZSTU5MR1JQX0FDUVVJUkUJWEZSTU5MR1JQX0FDUVVJUkUKKwlYRlJNTkxHUlBfRVhQSVJFLAorI2RlZmluZSBYRlJNTkxHUlBfRVhQSVJFCVhGUk1OTEdSUF9FWFBJUkUKKwlYRlJNTkxHUlBfU0EsCisjZGVmaW5lIFhGUk1OTEdSUF9TQQkJWEZSTU5MR1JQX1NBCisJWEZSTU5MR1JQX1BPTElDWSwKKyNkZWZpbmUgWEZSTU5MR1JQX1BPTElDWQlYRlJNTkxHUlBfUE9MSUNZCisJWEZSTU5MR1JQX0FFVkVOVFMsCisjZGVmaW5lIFhGUk1OTEdSUF9BRVZFTlRTCVhGUk1OTEdSUF9BRVZFTlRTCisJWEZSTU5MR1JQX1JFUE9SVCwKKyNkZWZpbmUgWEZSTU5MR1JQX1JFUE9SVAlYRlJNTkxHUlBfUkVQT1JUCisJWEZSTU5MR1JQX01JR1JBVEUsCisjZGVmaW5lIFhGUk1OTEdSUF9NSUdSQVRFCVhGUk1OTEdSUF9NSUdSQVRFCisJX19YRlJNTkxHUlBfTUFYCit9OworI2RlZmluZSBYRlJNTkxHUlBfTUFYCShfX1hGUk1OTEdSUF9NQVggLSAxKQorCisjZW5kaWYgLyogX0xJTlVYX1hGUk1fSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9sb2NhbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmYzUzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbG9jYWxlLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTUtMjAwMiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xMSBMb2NhbGl6YXRpb24JPGxvY2FsZS5oPgorICovCisKKyNpZm5kZWYJX0xPQ0FMRV9ICisjZGVmaW5lCV9MT0NBTEVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGUuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUaGVzZSBhcmUgdGhlIHBvc3NpYmlsaXRpZXMgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRsb2NhbGUuCisgICBUaGUgY29kZSBhc3N1bWVzIHRoYXQgdGhlIGxvd2VzdCBMQ18qIHN5bWJvbCBoYXMgdGhlIHZhbHVlIHplcm8uICAqLworI2RlZmluZSBMQ19DVFlQRSAgICAgICAgICBfX0xDX0NUWVBFCisjZGVmaW5lIExDX05VTUVSSUMgICAgICAgIF9fTENfTlVNRVJJQworI2RlZmluZSBMQ19USU1FICAgICAgICAgICBfX0xDX1RJTUUKKyNkZWZpbmUgTENfQ09MTEFURSAgICAgICAgX19MQ19DT0xMQVRFCisjZGVmaW5lIExDX01PTkVUQVJZICAgICAgIF9fTENfTU9ORVRBUlkKKyNkZWZpbmUgTENfTUVTU0FHRVMgICAgICAgX19MQ19NRVNTQUdFUworI2RlZmluZQlMQ19BTEwJCSAgX19MQ19BTEwKKyNkZWZpbmUgTENfUEFQRVIJICBfX0xDX1BBUEVSCisjZGVmaW5lIExDX05BTUUJCSAgX19MQ19OQU1FCisjZGVmaW5lIExDX0FERFJFU1MJICBfX0xDX0FERFJFU1MKKyNkZWZpbmUgTENfVEVMRVBIT05FCSAgX19MQ19URUxFUEhPTkUKKyNkZWZpbmUgTENfTUVBU1VSRU1FTlQJICBfX0xDX01FQVNVUkVNRU5UCisjZGVmaW5lIExDX0lERU5USUZJQ0FUSU9OIF9fTENfSURFTlRJRklDQVRJT04KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKworLyogU3RydWN0dXJlIGdpdmluZyBpbmZvcm1hdGlvbiBhYm91dCBudW1lcmljIGFuZCBtb25ldGFyeSBub3RhdGlvbi4gICovCitzdHJ1Y3QgbGNvbnYKK3sKKyAgLyogTnVtZXJpYyAobm9uLW1vbmV0YXJ5KSBpbmZvcm1hdGlvbi4gICovCisKKyAgY2hhciAqZGVjaW1hbF9wb2ludDsJCS8qIERlY2ltYWwgcG9pbnQgY2hhcmFjdGVyLiAgKi8KKyAgY2hhciAqdGhvdXNhbmRzX3NlcDsJCS8qIFRob3VzYW5kcyBzZXBhcmF0b3IuICAqLworICAvKiBFYWNoIGVsZW1lbnQgaXMgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gZWFjaCBncm91cDsKKyAgICAgZWxlbWVudHMgd2l0aCBoaWdoZXIgaW5kaWNlcyBhcmUgZmFydGhlciBsZWZ0LgorICAgICBBbiBlbGVtZW50IHdpdGggdmFsdWUgQ0hBUl9NQVggbWVhbnMgdGhhdCBubyBmdXJ0aGVyIGdyb3VwaW5nIGlzIGRvbmUuCisgICAgIEFuIGVsZW1lbnQgd2l0aCB2YWx1ZSAwIG1lYW5zIHRoYXQgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgdXNlZAorICAgICBmb3IgYWxsIGdyb3VwcyBmYXJ0aGVyIGxlZnQuICAqLworICBjaGFyICpncm91cGluZzsKKworICAvKiBNb25ldGFyeSBpbmZvcm1hdGlvbi4gICovCisKKyAgLyogRmlyc3QgdGhyZWUgY2hhcnMgYXJlIGEgY3VycmVuY3kgc3ltYm9sIGZyb20gSVNPIDQyMTcuCisgICAgIEZvdXJ0aCBjaGFyIGlzIHRoZSBzZXBhcmF0b3IuICBGaWZ0aCBjaGFyIGlzICdcMCcuICAqLworICBjaGFyICppbnRfY3Vycl9zeW1ib2w7CisgIGNoYXIgKmN1cnJlbmN5X3N5bWJvbDsJLyogTG9jYWwgY3VycmVuY3kgc3ltYm9sLiAgKi8KKyAgY2hhciAqbW9uX2RlY2ltYWxfcG9pbnQ7CS8qIERlY2ltYWwgcG9pbnQgY2hhcmFjdGVyLiAgKi8KKyAgY2hhciAqbW9uX3Rob3VzYW5kc19zZXA7CS8qIFRob3VzYW5kcyBzZXBhcmF0b3IuICAqLworICBjaGFyICptb25fZ3JvdXBpbmc7CQkvKiBMaWtlIGBncm91cGluZycgZWxlbWVudCAoYWJvdmUpLiAgKi8KKyAgY2hhciAqcG9zaXRpdmVfc2lnbjsJCS8qIFNpZ24gZm9yIHBvc2l0aXZlIHZhbHVlcy4gICovCisgIGNoYXIgKm5lZ2F0aXZlX3NpZ247CQkvKiBTaWduIGZvciBuZWdhdGl2ZSB2YWx1ZXMuICAqLworICBjaGFyIGludF9mcmFjX2RpZ2l0czsJCS8qIEludCdsIGZyYWN0aW9uYWwgZGlnaXRzLiAgKi8KKyAgY2hhciBmcmFjX2RpZ2l0czsJCS8qIExvY2FsIGZyYWN0aW9uYWwgZGlnaXRzLiAgKi8KKyAgLyogMSBpZiBjdXJyZW5jeV9zeW1ib2wgcHJlY2VkZXMgYSBwb3NpdGl2ZSB2YWx1ZSwgMCBpZiBzdWNjZWVkcy4gICovCisgIGNoYXIgcF9jc19wcmVjZWRlczsKKyAgLyogMSBpZmYgYSBzcGFjZSBzZXBhcmF0ZXMgY3VycmVuY3lfc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4gICovCisgIGNoYXIgcF9zZXBfYnlfc3BhY2U7CisgIC8qIDEgaWYgY3VycmVuY3lfc3ltYm9sIHByZWNlZGVzIGEgbmVnYXRpdmUgdmFsdWUsIDAgaWYgc3VjY2VlZHMuICAqLworICBjaGFyIG5fY3NfcHJlY2VkZXM7CisgIC8qIDEgaWZmIGEgc3BhY2Ugc2VwYXJhdGVzIGN1cnJlbmN5X3N5bWJvbCBmcm9tIGEgbmVnYXRpdmUgdmFsdWUuICAqLworICBjaGFyIG5fc2VwX2J5X3NwYWNlOworICAvKiBQb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2lnbiBwb3NpdGlvbnM6CisgICAgIDAgUGFyZW50aGVzZXMgc3Vycm91bmQgdGhlIHF1YW50aXR5IGFuZCBjdXJyZW5jeV9zeW1ib2wuCisgICAgIDEgVGhlIHNpZ24gc3RyaW5nIHByZWNlZGVzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3lfc3ltYm9sLgorICAgICAyIFRoZSBzaWduIHN0cmluZyBmb2xsb3dzIHRoZSBxdWFudGl0eSBhbmQgY3VycmVuY3lfc3ltYm9sLgorICAgICAzIFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGUgY3VycmVuY3lfc3ltYm9sLgorICAgICA0IFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBjdXJyZW5jeV9zeW1ib2wuICAqLworICBjaGFyIHBfc2lnbl9wb3NuOworICBjaGFyIG5fc2lnbl9wb3NuOworI2lmZGVmIF9fVVNFX0lTT0M5OQorICAvKiAxIGlmIGludF9jdXJyX3N5bWJvbCBwcmVjZWRlcyBhIHBvc2l0aXZlIHZhbHVlLCAwIGlmIHN1Y2NlZWRzLiAgKi8KKyAgY2hhciBpbnRfcF9jc19wcmVjZWRlczsKKyAgLyogMSBpZmYgYSBzcGFjZSBzZXBhcmF0ZXMgaW50X2N1cnJfc3ltYm9sIGZyb20gYSBwb3NpdGl2ZSB2YWx1ZS4gICovCisgIGNoYXIgaW50X3Bfc2VwX2J5X3NwYWNlOworICAvKiAxIGlmIGludF9jdXJyX3N5bWJvbCBwcmVjZWRlcyBhIG5lZ2F0aXZlIHZhbHVlLCAwIGlmIHN1Y2NlZWRzLiAgKi8KKyAgY2hhciBpbnRfbl9jc19wcmVjZWRlczsKKyAgLyogMSBpZmYgYSBzcGFjZSBzZXBhcmF0ZXMgaW50X2N1cnJfc3ltYm9sIGZyb20gYSBuZWdhdGl2ZSB2YWx1ZS4gICovCisgIGNoYXIgaW50X25fc2VwX2J5X3NwYWNlOworICAvKiBQb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2lnbiBwb3NpdGlvbnM6CisgICAgIDAgUGFyZW50aGVzZXMgc3Vycm91bmQgdGhlIHF1YW50aXR5IGFuZCBpbnRfY3Vycl9zeW1ib2wuCisgICAgIDEgVGhlIHNpZ24gc3RyaW5nIHByZWNlZGVzIHRoZSBxdWFudGl0eSBhbmQgaW50X2N1cnJfc3ltYm9sLgorICAgICAyIFRoZSBzaWduIHN0cmluZyBmb2xsb3dzIHRoZSBxdWFudGl0eSBhbmQgaW50X2N1cnJfc3ltYm9sLgorICAgICAzIFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBwcmVjZWRlcyB0aGUgaW50X2N1cnJfc3ltYm9sLgorICAgICA0IFRoZSBzaWduIHN0cmluZyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBpbnRfY3Vycl9zeW1ib2wuICAqLworICBjaGFyIGludF9wX3NpZ25fcG9zbjsKKyAgY2hhciBpbnRfbl9zaWduX3Bvc247CisjZWxzZQorICBjaGFyIF9faW50X3BfY3NfcHJlY2VkZXM7CisgIGNoYXIgX19pbnRfcF9zZXBfYnlfc3BhY2U7CisgIGNoYXIgX19pbnRfbl9jc19wcmVjZWRlczsKKyAgY2hhciBfX2ludF9uX3NlcF9ieV9zcGFjZTsKKyAgY2hhciBfX2ludF9wX3NpZ25fcG9zbjsKKyAgY2hhciBfX2ludF9uX3NpZ25fcG9zbjsKKyNlbmRpZgorfTsKKworCisvKiBTZXQgYW5kL29yIHJldHVybiB0aGUgY3VycmVudCBsb2NhbGUuICAqLworZXh0ZXJuIGNoYXIgKnNldGxvY2FsZSAoaW50IF9fY2F0ZWdvcnksIF9fY29uc3QgY2hhciAqX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgbnVtZXJpYy9tb25ldGFyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbGNvbnYgKmxvY2FsZWNvbnYgKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisjaWZkZWYJX19VU0VfR05VCisvKiBUaGUgY29uY2VwdCBvZiBvbmUgc3RhdGljIGxvY2FsZSBwZXIgY2F0ZWdvcnkgaXMgbm90IHZlcnkgd2VsbAorICAgdGhvdWdodCBvdXQuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgdG8gcHJvY2VzcyBpdHMgZGF0YSB1c2luZworICAgaW5mb3JtYXRpb24gZnJvbSBzZXZlcmFsIGRpZmZlcmVudCBsb2NhbGVzLiAgQW5vdGhlciBhcHBsaWNhdGlvbiBpcworICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBoYW5kbGluZyBpbiB0aGUKKyAgIHVwY29taW5nIElTTyBDKysgc3RhbmRhcmQgbGlicmFyeS4gIFRvIHN1cHBvcnQgdGhpcyBhbm90aGVyIHNldCBvZgorICAgdGhlIGZ1bmN0aW9ucyB1c2luZyBsb2NhbGUgZGF0YSBleGlzdCB3aGljaCBoYXZlIGFuIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50LgorCisgICBBdHRlbnRpb246IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlICpub3QqIHN0YW5kYXJkaXplZCBpbiBhbnkgZm9ybS4KKyAgIFRoaXMgaXMgYSBwcm9vZi1vZi1jb25jZXB0IGltcGxlbWVudGF0aW9uLiAgKi8KKworLyogR2V0IGxvY2FsZSBkYXRhdHlwZSBkZWZpbml0aW9uLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCit0eXBlZGVmIF9fbG9jYWxlX3QgbG9jYWxlX3Q7CisKKy8qIFJldHVybiBhIHJlZmVyZW5jZSB0byBhIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNldCBvZiBsb2NhbGUKKyAgIGRhdGFzZXRzLiAgVW5saWtlIGZvciB0aGUgQ0FURUdPUlkgcGFyYW1ldGVyIGZvciBgc2V0bG9jYWxlJyB0aGUKKyAgIENBVEVHT1JZX01BU0sgcGFyYW1ldGVyIGhlcmUgdXNlcyBhIHNpbmdsZSBiaXQgZm9yIGVhY2ggY2F0ZWdvcnksCisgICBtYWRlIGJ5IE9SJ2luZyB0b2dldGhlciBMQ18qX01BU0sgYml0cyBhYm92ZS4gICovCitleHRlcm4gX19sb2NhbGVfdCBuZXdsb2NhbGUgKGludCBfX2NhdGVnb3J5X21hc2ssIF9fY29uc3QgY2hhciAqX19sb2NhbGUsCisJCQkgICAgIF9fbG9jYWxlX3QgX19iYXNlKSBfX1RIUk9XOworCisvKiBUaGVzZSBhcmUgdGhlIGJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSBDQVRFR09SWV9NQVNLIGFyZ3VtZW50IHRvCisgICBgbmV3bG9jYWxlJy4gIEluIHRoZSBHTlUgaW1wbGVtZW50YXRpb24sIExDX0ZPT19NQVNLIGhhcyB0aGUgdmFsdWUKKyAgIG9mICgxIDw8IExDX0ZPTyksIGJ1dCB0aGlzIGlzIG5vdCBhIHBhcnQgb2YgdGhlIGludGVyZmFjZSB0aGF0CisgICBjYWxsZXJzIGNhbiBhc3N1bWUgd2lsbCBiZSB0cnVlLiAgKi8KKyMgZGVmaW5lIExDX0NUWVBFX01BU0sJCSgxIDw8IF9fTENfQ1RZUEUpCisjIGRlZmluZSBMQ19OVU1FUklDX01BU0sJKDEgPDwgX19MQ19OVU1FUklDKQorIyBkZWZpbmUgTENfVElNRV9NQVNLCQkoMSA8PCBfX0xDX1RJTUUpCisjIGRlZmluZSBMQ19DT0xMQVRFX01BU0sJKDEgPDwgX19MQ19DT0xMQVRFKQorIyBkZWZpbmUgTENfTU9ORVRBUllfTUFTSwkoMSA8PCBfX0xDX01PTkVUQVJZKQorIyBkZWZpbmUgTENfTUVTU0FHRVNfTUFTSwkoMSA8PCBfX0xDX01FU1NBR0VTKQorIyBkZWZpbmUgTENfUEFQRVJfTUFTSwkJKDEgPDwgX19MQ19QQVBFUikKKyMgZGVmaW5lIExDX05BTUVfTUFTSwkJKDEgPDwgX19MQ19OQU1FKQorIyBkZWZpbmUgTENfQUREUkVTU19NQVNLCSgxIDw8IF9fTENfQUREUkVTUykKKyMgZGVmaW5lIExDX1RFTEVQSE9ORV9NQVNLCSgxIDw8IF9fTENfVEVMRVBIT05FKQorIyBkZWZpbmUgTENfTUVBU1VSRU1FTlRfTUFTSwkoMSA8PCBfX0xDX01FQVNVUkVNRU5UKQorIyBkZWZpbmUgTENfSURFTlRJRklDQVRJT05fTUFTSwkoMSA8PCBfX0xDX0lERU5USUZJQ0FUSU9OKQorIyBkZWZpbmUgTENfQUxMX01BU0sJCShMQ19DVFlQRV9NQVNLIFwKKwkJCQkgfCBMQ19OVU1FUklDX01BU0sgXAorCQkJCSB8IExDX1RJTUVfTUFTSyBcCisJCQkJIHwgTENfQ09MTEFURV9NQVNLIFwKKwkJCQkgfCBMQ19NT05FVEFSWV9NQVNLIFwKKwkJCQkgfCBMQ19NRVNTQUdFU19NQVNLIFwKKwkJCQkgfCBMQ19QQVBFUl9NQVNLIFwKKwkJCQkgfCBMQ19OQU1FX01BU0sgXAorCQkJCSB8IExDX0FERFJFU1NfTUFTSyBcCisJCQkJIHwgTENfVEVMRVBIT05FX01BU0sgXAorCQkJCSB8IExDX01FQVNVUkVNRU5UX01BU0sgXAorCQkJCSB8IExDX0lERU5USUZJQ0FUSU9OX01BU0sgXAorCQkJCSApCisKKy8qIFJldHVybiBhIGR1cGxpY2F0ZSBvZiB0aGUgc2V0IG9mIGxvY2FsZSBpbiBEQVRBU0VULiAgQWxsIHVzYWdlCisgICBjb3VudGVycyBhcmUgaW5jcmVhc2VkIGlmIG5lY2Vzc2FyeS4gICovCitleHRlcm4gX19sb2NhbGVfdCBkdXBsb2NhbGUgKF9fbG9jYWxlX3QgX19kYXRhc2V0KSBfX1RIUk9XOworCisvKiBGcmVlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsZSBkYXRhc2V0IHByZXZpb3VzbHkgcmV0dXJuZWQKKyAgIGJ5IGEgY2FsbCB0byBgc2V0bG9jYWxlX3InLiAgKi8KK2V4dGVybiB2b2lkIGZyZWVsb2NhbGUgKF9fbG9jYWxlX3QgX19kYXRhc2V0KSBfX1RIUk9XOworCisvKiBTd2l0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkJ3MgbG9jYWxlIHRvIERBVEFTRVQuCisgICBJZiBEQVRBU0VUIGlzIG51bGwsIGluc3RlYWQganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZy4KKyAgIFRoZSBzcGVjaWFsIHZhbHVlIExDX0dMT0JBTF9MT0NBTEUgaXMgdGhlIGluaXRpYWwgc2V0dGluZworICAgZm9yIGFsbCB0aHJlYWRzIGFuZCBjYW4gYWxzbyBiZSBpbnN0YWxsZWQgYW55IHRpbWUsIG1lYW5pbmcKKyAgIHRoZSB0aHJlYWQgdXNlcyB0aGUgZ2xvYmFsIHNldHRpbmdzIGNvbnRyb2xsZWQgYnkgYHNldGxvY2FsZScuICAqLworZXh0ZXJuIF9fbG9jYWxlX3QgdXNlbG9jYWxlIChfX2xvY2FsZV90IF9fZGF0YXNldCkgX19USFJPVzsKKworLyogVGhpcyB2YWx1ZSBjYW4gYmUgcGFzc2VkIHRvIGB1c2Vsb2NhbGUnIGFuZCBtYXkgYmUgcmV0dXJuZWQgYnkgaXQuCisgICBQYXNzaW5nIHRoaXMgdmFsdWUgdG8gYW55IG90aGVyIGZ1bmN0aW9uIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IuICAqLworIyBkZWZpbmUgTENfR0xPQkFMX0xPQ0FMRQkoKF9fbG9jYWxlX3QpIC0xTCkKKworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBsb2NhbGUuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWFsbG9jLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDdhOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL21hbGxvYy5oCkBAIC0wLDAgKzEsMTc0IEBACisvKiBQcm90b3R5cGVzIGFuZCBkZWZpbml0aW9uIGZvciBtYWxsb2MgaW1wbGVtZW50YXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDItMjAwNCwgMjAwNSwgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01BTExPQ19ICisjZGVmaW5lIF9NQUxMT0NfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorIyBkZWZpbmUgX19tYWxsb2NfcHRyX3QgIHZvaWQgKgorCisvKiBVc2VkIGJ5IEdOVSBsaWJjIGludGVybmFscy4gKi8KKyNkZWZpbmUgX19tYWxsb2Nfc2l6ZV90IHNpemVfdAorI2RlZmluZSBfX21hbGxvY19wdHJkaWZmX3QgcHRyZGlmZl90CisKKyNpZmRlZiBfX0dOVUNfXworCisjIGRlZmluZSBfX01BTExPQ19QKGFyZ3MpCWFyZ3MgX19USFJPVworLyogVGhpcyBtYWNybyB3aWxsIGJlIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBtaWdodCB0YWtlIEMrKyBjYWxsYmFjaworICAgZnVuY3Rpb25zLiAgKi8KKyMgZGVmaW5lIF9fTUFMTE9DX1BNVChhcmdzKQlhcmdzCisKKyNlbHNlCS8qIE5vdCBHQ0MuICAqLworCisjIGRlZmluZSBfX01BTExPQ19QKGFyZ3MpCWFyZ3MKKyMgZGVmaW5lIF9fTUFMTE9DX1BNVChhcmdzKQlhcmdzCisKKyNlbmRpZgkvKiBHQ0MuICAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogQWxsb2NhdGUgU0laRSBieXRlcyBvZiBtZW1vcnkuICAqLworZXh0ZXJuIHZvaWQgKm1hbGxvYyBfX01BTExPQ19QICgoc2l6ZV90IF9fc2l6ZSkpIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworCisvKiBBbGxvY2F0ZSBOTUVNQiBlbGVtZW50cyBvZiBTSVpFIGJ5dGVzIGVhY2gsIGFsbCBpbml0aWFsaXplZCB0byAwLiAgKi8KK2V4dGVybiB2b2lkICpjYWxsb2MgX19NQUxMT0NfUCAoKHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19zaXplKSkKKyAgICAgICBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogUmUtYWxsb2NhdGUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJsb2NrIGluIF9fcHRyLCBtYWtpbmcgdGhlIG5ldworICAgYmxvY2sgU0laRSBieXRlcyBsb25nLiAgKi8KKy8qIF9fYXR0cmlidXRlX21hbGxvY19fIGlzIG5vdCB1c2VkLCBiZWNhdXNlIGlmIHJlYWxsb2MgcmV0dXJucworICAgdGhlIHNhbWUgcG9pbnRlciB0aGF0IHdhcyBwYXNzZWQgdG8gaXQsIGFsaWFzaW5nIG5lZWRzIHRvIGJlIGFsbG93ZWQKKyAgIGJldHdlZW4gb2JqZWN0cyBwb2ludGVkIGJ5IHRoZSBvbGQgYW5kIG5ldyBwb2ludGVycy4gICovCitleHRlcm4gdm9pZCAqcmVhbGxvYyBfX01BTExPQ19QICgodm9pZCAqX19wdHIsIHNpemVfdCBfX3NpemUpKQorICAgICAgIF9fYXR0cmlidXRlX3dhcm5fdW51c2VkX3Jlc3VsdF9fOworCisvKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IGBtYWxsb2MnLCBgcmVhbGxvYycgb3IgYGNhbGxvYycuICAqLworZXh0ZXJuIHZvaWQgZnJlZSBfX01BTExPQ19QICgodm9pZCAqX19wdHIpKTsKKworLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBgY2FsbG9jJy4gKi8KK2V4dGVybiB2b2lkIGNmcmVlIF9fTUFMTE9DX1AgKCh2b2lkICpfX3B0cikpOworCisvKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIGFsbG9jYXRlZCB0byBBTElHTk1FTlQgYnl0ZXMuICAqLworZXh0ZXJuIHZvaWQgKm1lbWFsaWduIF9fTUFMTE9DX1AgKChzaXplX3QgX19hbGlnbm1lbnQsIHNpemVfdCBfX3NpemUpKQorICAgICAgIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworCisvKiBBbGxvY2F0ZSBTSVpFIGJ5dGVzIG9uIGEgcGFnZSBib3VuZGFyeS4gICovCitleHRlcm4gdm9pZCAqdmFsbG9jIF9fTUFMTE9DX1AgKChzaXplX3QgX19zaXplKSkKKyAgICAgICBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKworLyogRXF1aXZhbGVudCB0byB2YWxsb2MobWluaW11bS1wYWdlLXRoYXQtaG9sZHMobikpLCB0aGF0IGlzLCByb3VuZCB1cAorICAgX19zaXplIHRvIG5lYXJlc3QgcGFnZXNpemUuICovCitleHRlcm4gdm9pZCAqIHB2YWxsb2MgX19NQUxMT0NfUCAoKHNpemVfdCBfX3NpemUpKQorICAgICAgIF9fYXR0cmlidXRlX21hbGxvY19fIF9fd3VyOworCisvKiBVbmRlcmx5aW5nIGFsbG9jYXRpb24gZnVuY3Rpb247IHN1Y2Nlc3NpdmUgY2FsbHMgc2hvdWxkIHJldHVybgorICAgY29udGlndW91cyBwaWVjZXMgb2YgbWVtb3J5LiAgKi8KK2V4dGVybiB2b2lkICooKl9fbW9yZWNvcmUpIF9fTUFMTE9DX1BNVCAoKHB0cmRpZmZfdCBfX3NpemUpKTsKKworLyogRGVmYXVsdCB2YWx1ZSBvZiBgX19tb3JlY29yZScuICAqLworZXh0ZXJuIHZvaWQgKl9fZGVmYXVsdF9tb3JlY29yZSBfX01BTExPQ19QICgocHRyZGlmZl90IF9fc2l6ZSkpCisgICAgICAgX19hdHRyaWJ1dGVfbWFsbG9jX187CisKKy8qIFNWSUQyL1hQRyBtYWxsaW5mbyBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IG1hbGxpbmZvIHsKKyAgaW50IGFyZW5hOyAgICAvKiBub24tbW1hcHBlZCBzcGFjZSBhbGxvY2F0ZWQgZnJvbSBzeXN0ZW0gKi8KKyAgaW50IG9yZGJsa3M7ICAvKiBudW1iZXIgb2YgZnJlZSBjaHVua3MgKi8KKyAgaW50IHNtYmxrczsgICAvKiBudW1iZXIgb2YgZmFzdGJpbiBibG9ja3MgKi8KKyAgaW50IGhibGtzOyAgICAvKiBudW1iZXIgb2YgbW1hcHBlZCByZWdpb25zICovCisgIGludCBoYmxraGQ7ICAgLyogc3BhY2UgaW4gbW1hcHBlZCByZWdpb25zICovCisgIGludCB1c21ibGtzOyAgLyogbWF4aW11bSB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKi8KKyAgaW50IGZzbWJsa3M7ICAvKiBzcGFjZSBhdmFpbGFibGUgaW4gZnJlZWQgZmFzdGJpbiBibG9ja3MgKi8KKyAgaW50IHVvcmRibGtzOyAvKiB0b3RhbCBhbGxvY2F0ZWQgc3BhY2UgKi8KKyAgaW50IGZvcmRibGtzOyAvKiB0b3RhbCBmcmVlIHNwYWNlICovCisgIGludCBrZWVwY29zdDsgLyogdG9wLW1vc3QsIHJlbGVhc2FibGUgKHZpYSBtYWxsb2NfdHJpbSkgc3BhY2UgKi8KK307CisKKy8qIFJldHVybnMgYSBjb3B5IG9mIHRoZSB1cGRhdGVkIGN1cnJlbnQgbWFsbGluZm8uICovCitleHRlcm4gc3RydWN0IG1hbGxpbmZvIG1hbGxpbmZvIF9fTUFMTE9DX1AgKCh2b2lkKSk7CisKKy8qIFNWSUQyL1hQRyBtYWxsb3B0IG9wdGlvbnMgKi8KKyNpZm5kZWYgTV9NWEZBU1QKKyMgZGVmaW5lIE1fTVhGQVNUICAxCS8qIG1heGltdW0gcmVxdWVzdCBzaXplIGZvciAiZmFzdGJpbnMiICovCisjZW5kaWYKKyNpZm5kZWYgTV9OTEJMS1MKKyMgZGVmaW5lIE1fTkxCTEtTICAyCS8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2VuZGlmCisjaWZuZGVmIE1fR1JBSU4KKyMgZGVmaW5lIE1fR1JBSU4gICAzCS8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2VuZGlmCisjaWZuZGVmIE1fS0VFUAorIyBkZWZpbmUgTV9LRUVQICAgIDQJLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZW5kaWYKKworLyogbWFsbG9wdCBvcHRpb25zIHRoYXQgYWN0dWFsbHkgZG8gc29tZXRoaW5nICovCisjZGVmaW5lIE1fVFJJTV9USFJFU0hPTEQgICAgLTEKKyNkZWZpbmUgTV9UT1BfUEFEICAgICAgICAgICAtMgorI2RlZmluZSBNX01NQVBfVEhSRVNIT0xEICAgIC0zCisjZGVmaW5lIE1fTU1BUF9NQVggICAgICAgICAgLTQKKyNkZWZpbmUgTV9DSEVDS19BQ1RJT04gICAgICAtNQorI2RlZmluZSBNX1BFUlRVUkIJICAgIC02CisKKy8qIEdlbmVyYWwgU1ZJRC9YUEcgaW50ZXJmYWNlIHRvIHR1bmFibGUgcGFyYW1ldGVycy4gKi8KK2V4dGVybiBpbnQgbWFsbG9wdCBfX01BTExPQ19QICgoaW50IF9fcGFyYW0sIGludCBfX3ZhbCkpOworCisvKiBSZWxlYXNlIGFsbCBidXQgX19wYWQgYnl0ZXMgb2YgZnJlZWQgdG9wLW1vc3QgbWVtb3J5IGJhY2sgdG8gdGhlCisgICBzeXN0ZW0uIFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgMC4gKi8KK2V4dGVybiBpbnQgbWFsbG9jX3RyaW0gX19NQUxMT0NfUCAoKHNpemVfdCBfX3BhZCkpOworCisvKiBSZXBvcnQgdGhlIG51bWJlciBvZiB1c2FibGUgYWxsb2NhdGVkIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCBhbGxvY2F0ZWQKKyAgIGNodW5rIF9fcHRyLiAqLworZXh0ZXJuIHNpemVfdCBtYWxsb2NfdXNhYmxlX3NpemUgX19NQUxMT0NfUCAoKHZvaWQgKl9fcHRyKSk7CisKKy8qIFByaW50cyBicmllZiBzdW1tYXJ5IHN0YXRpc3RpY3Mgb24gc3RkZXJyLiAqLworZXh0ZXJuIHZvaWQgbWFsbG9jX3N0YXRzIF9fTUFMTE9DX1AgKCh2b2lkKSk7CisKKy8qIFJlY29yZCB0aGUgc3RhdGUgb2YgYWxsIG1hbGxvYyB2YXJpYWJsZXMgaW4gYW4gb3BhcXVlIGRhdGEgc3RydWN0dXJlLiAqLworZXh0ZXJuIHZvaWQgKm1hbGxvY19nZXRfc3RhdGUgX19NQUxMT0NfUCAoKHZvaWQpKTsKKworLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgYWxsIG1hbGxvYyB2YXJpYWJsZXMgZnJvbSBkYXRhIG9idGFpbmVkIHdpdGgKKyAgIG1hbGxvY19nZXRfc3RhdGUoKS4gKi8KK2V4dGVybiBpbnQgbWFsbG9jX3NldF9zdGF0ZSBfX01BTExPQ19QICgodm9pZCAqX19wdHIpKTsKKworLyogQ2FsbGVkIG9uY2Ugd2hlbiBtYWxsb2MgaXMgaW5pdGlhbGl6ZWQ7IHJlZGVmaW5pbmcgdGhpcyB2YXJpYWJsZSBpbgorICAgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIHNldCB1cCB0aGUgaG9vaworICAgcG9pbnRlcnMuICovCitleHRlcm4gdm9pZCAoKl9fbWFsbG9jX2luaXRpYWxpemVfaG9vaykgX19NQUxMT0NfUE1UICgodm9pZCkpOworLyogSG9va3MgZm9yIGRlYnVnZ2luZyBhbmQgdXNlci1kZWZpbmVkIHZlcnNpb25zLiAqLworZXh0ZXJuIHZvaWQgKCpfX2ZyZWVfaG9vaykgX19NQUxMT0NfUE1UICgodm9pZCAqX19wdHIsCisJCQkJCV9fY29uc3QgX19tYWxsb2NfcHRyX3QpKTsKK2V4dGVybiB2b2lkICooKl9fbWFsbG9jX2hvb2spIF9fTUFMTE9DX1BNVCAoKHNpemVfdCBfX3NpemUsCisJCQkJCSAgICAgX19jb25zdCBfX21hbGxvY19wdHJfdCkpOworZXh0ZXJuIHZvaWQgKigqX19yZWFsbG9jX2hvb2spIF9fTUFMTE9DX1BNVCAoKHZvaWQgKl9fcHRyLCBzaXplX3QgX19zaXplLAorCQkJCQkgICAgICBfX2NvbnN0IF9fbWFsbG9jX3B0cl90KSk7CitleHRlcm4gdm9pZCAqKCpfX21lbWFsaWduX2hvb2spIF9fTUFMTE9DX1BNVCAoKHNpemVfdCBfX2FsaWdubWVudCwKKwkJCQkJICAgICAgIHNpemVfdCBfX3NpemUsCisJCQkJCSAgICAgICBfX2NvbnN0IF9fbWFsbG9jX3B0cl90KSk7CitleHRlcm4gdm9pZCAoKl9fYWZ0ZXJfbW9yZWNvcmVfaG9vaykgX19NQUxMT0NfUE1UICgodm9pZCkpOworCisvKiBBY3RpdmF0ZSBhIHN0YW5kYXJkIHNldCBvZiBkZWJ1Z2dpbmcgaG9va3MuICovCitleHRlcm4gdm9pZCBfX21hbGxvY19jaGVja19pbml0IF9fTUFMTE9DX1AgKCh2b2lkKSk7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG1hbGxvYy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL21hdGguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MGIyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL21hdGguaApAQCAtMCwwICsxLDQ2OCBAQAorLyogRGVjbGFyYXRpb25zIGZvciBtYXRoIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLCAxOTk1LTE5OTksIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDYKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4xMiBNYXRoZW1hdGljcwk8bWF0aC5oPgorICovCisKKyNpZm5kZWYJX01BVEhfSAorI2RlZmluZQlfTUFUSF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IEhVR0VfVkFMIHZhbHVlIChyZXR1cm5lZCBvbiBvdmVyZmxvdykuCisgICBPbiBhbGwgSUVFRTc1NCBtYWNoaW5lcywgdGhpcyBpcyArSW5maW5pdHkuICAqLworI2luY2x1ZGUgPGJpdHMvaHVnZV92YWwuaD4KKyNpZmRlZiBfX1VTRV9JU09DOTkKKyMgaW5jbHVkZSA8Yml0cy9odWdlX3ZhbGYuaD4KKyMgaW5jbHVkZSA8Yml0cy9odWdlX3ZhbGwuaD4KKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IElORklOSVRZIHZhbHVlLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9pbmYuaD4KKworLyogR2V0IG1hY2hpbmUtZGVwZW5kZW50IE5BTiB2YWx1ZSAocmV0dXJuZWQgZm9yIHNvbWUgZG9tYWluIGVycm9ycykuICAqLworIyBpbmNsdWRlIDxiaXRzL25hbi5oPgorI2VuZGlmIC8qIF9fVVNFX0lTT0M5OSAqLworCisvKiBHZXQgZ2VuZXJhbCBhbmQgSVNPIEM5OSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCisjaW5jbHVkZSA8Yml0cy9tYXRoZGVmLmg+CisKKy8qIFRoZSBmaWxlIDxiaXRzL21hdGhjYWxscy5oPiBjb250YWlucyB0aGUgcHJvdG90eXBlcyBmb3IgYWxsIHRoZQorICAgYWN0dWFsIG1hdGggZnVuY3Rpb25zLiAgVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGZvciB0aG9zZSBwcm90b3R5cGVzLAorICAgc28gd2UgY2FuIGVhc2lseSBkZWNsYXJlIGVhY2ggZnVuY3Rpb24gYXMgYm90aCBgbmFtZScgYW5kIGBfX25hbWUnLAorICAgYW5kIGNhbiBkZWNsYXJlIHRoZSBmbG9hdCB2ZXJzaW9ucyBgbmFtZWYnIGFuZCBgX19uYW1lZicuICAqLworCisjZGVmaW5lIF9fTUFUSENBTEwoZnVuY3Rpb24sc3VmZml4LCBhcmdzKQlcCisgIF9fTUFUSERFQ0wgKF9NZG91YmxlXyxmdW5jdGlvbixzdWZmaXgsIGFyZ3MpCisjZGVmaW5lIF9fTUFUSERFQ0wodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKSBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MpOyBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBfX0NPTkNBVChfXyxmdW5jdGlvbiksc3VmZml4LCBhcmdzKQorI2RlZmluZSBfX01BVEhDQUxMWChmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIGF0dHJpYikJXAorICBfX01BVEhERUNMWCAoX01kb3VibGVfLGZ1bmN0aW9uLHN1ZmZpeCwgYXJncywgYXR0cmliKQorI2RlZmluZSBfX01BVEhERUNMWCh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIGF0dHJpYikgXAorICBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKSBfX2F0dHJpYnV0ZV9fIChhdHRyaWIpOyBcCisgIF9fTUFUSERFQ0xfMSh0eXBlLCBfX0NPTkNBVChfXyxmdW5jdGlvbiksc3VmZml4LCBhcmdzKSBfX2F0dHJpYnV0ZV9fIChhdHRyaWIpCisjZGVmaW5lIF9fTUFUSERFQ0xfMSh0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MpIFwKKyAgZXh0ZXJuIHR5cGUgX19NQVRIX1BSRUNOQU1FKGZ1bmN0aW9uLHN1ZmZpeCkgYXJncyBfX1RIUk9XCisKKyNkZWZpbmUgX01kb3VibGVfIAkJZG91YmxlCisjZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpCV9fQ09OQ0FUKG5hbWUscikKKyMgZGVmaW5lIF9NZG91YmxlX0JFR0lOX05BTUVTUEFDRSBfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UgICBfX0VORF9OQU1FU1BBQ0VfU1RECisjaW5jbHVkZSA8Yml0cy9tYXRoY2FsbHMuaD4KKyN1bmRlZglfTWRvdWJsZV8KKyN1bmRlZiBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UKKyN1bmRlZiBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisjdW5kZWYJX19NQVRIX1BSRUNOQU1FCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9JU09DOTkKKworCisvKiBJbmNsdWRlIHRoZSBmaWxlIG9mIGRlY2xhcmF0aW9ucyBhZ2FpbiwgdGhpcyB0aW1lIHVzaW5nIGBmbG9hdCcKKyAgIGluc3RlYWQgb2YgYGRvdWJsZScgYW5kIGFwcGVuZGluZyBmIHRvIGVhY2ggZnVuY3Rpb24gbmFtZS4gICovCisKKyMgaWZuZGVmIF9NZmxvYXRfCisjICBkZWZpbmUgX01mbG9hdF8JCWZsb2F0CisjIGVuZGlmCisjIGRlZmluZSBfTWRvdWJsZV8gCQlfTWZsb2F0XworIyBpZmRlZiBfX1NURENfXworIyAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpIG5hbWUjI2YjI3IKKyMgZWxzZQorIyAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpIG5hbWUvKiovZi8qKi9yCisjIGVuZGlmCisjIGRlZmluZSBfTWRvdWJsZV9CRUdJTl9OQU1FU1BBQ0UgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFICAgX19FTkRfTkFNRVNQQUNFX0M5OQorIyBpbmNsdWRlIDxiaXRzL21hdGhjYWxscy5oPgorIyB1bmRlZglfTWRvdWJsZV8KKyMgdW5kZWYgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFCisjIHVuZGVmIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UKKyMgdW5kZWYJX19NQVRIX1BSRUNOQU1FCisKKyMgaWYgKF9fU1REQ19fIC0gMCB8fCBfX0dOVUNfXyAtIDApIFwKKyAgICAgJiYgKCFkZWZpbmVkIF9fTk9fTE9OR19ET1VCTEVfTUFUSCB8fCBkZWZpbmVkIF9fTERCTF9DT01QQVQpCisjICBpZmRlZiBfX0xEQkxfQ09NUEFUCisKKyMgICBpZmRlZiBfX1VTRV9JU09DOTkgCitleHRlcm4gZmxvYXQgX19ubGRibF9uZXh0dG93YXJkZiAoZmxvYXQgX194LCBsb25nIGRvdWJsZSBfX3kpCisJCQkJICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyMgICAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBmbG9hdCBfX1JFRElSRUNUX05USCAobmV4dHRvd2FyZGYsIChmbG9hdCBfX3gsIGxvbmcgZG91YmxlIF9feSksCisJCQkgICAgIF9fbmxkYmxfbmV4dHRvd2FyZGYpCisgICAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK2V4dGVybiBkb3VibGUgX19SRURJUkVDVF9OVEggKG5leHR0b3dhcmQsIChkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpLAorCQkJICAgICAgbmV4dGFmdGVyKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitleHRlcm4gbG9uZyBkb3VibGUgX19SRURJUkVDVF9OVEggKG5leHR0b3dhcmRsLAorCQkJCSAgIChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSksCisJCQkJICAgbmV4dGFmdGVyKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKworLyogSW5jbHVkZSB0aGUgZmlsZSBvZiBkZWNsYXJhdGlvbnMgYWdhaW4sIHRoaXMgdGltZSB1c2luZyBgbG9uZyBkb3VibGUnCisgICBpbnN0ZWFkIG9mIGBkb3VibGUnIGFuZCBhcHBlbmRpbmcgbCB0byBlYWNoIGZ1bmN0aW9uIG5hbWUuICAqLworCisjICAgdW5kZWYgX19NQVRIREVDTF8xCisjICAgZGVmaW5lIF9fTUFUSERFQ0xfMih0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIGFsaWFzKSBcCisgIGV4dGVybiB0eXBlIF9fUkVESVJFQ1RfTlRIKF9fTUFUSF9QUkVDTkFNRShmdW5jdGlvbixzdWZmaXgpLCBcCisJCQkgICAgIGFyZ3MsIGFsaWFzKQorIyAgIGRlZmluZSBfX01BVEhERUNMXzEodHlwZSwgZnVuY3Rpb24sc3VmZml4LCBhcmdzKSBcCisgIF9fTUFUSERFQ0xfMih0eXBlLCBmdW5jdGlvbixzdWZmaXgsIGFyZ3MsIF9fQ09OQ0FUKGZ1bmN0aW9uLHN1ZmZpeCkpCisjICBlbmRpZgorCisjICBpZm5kZWYgX01sb25nX2RvdWJsZV8KKyMgICBkZWZpbmUgX01sb25nX2RvdWJsZV8JbG9uZyBkb3VibGUKKyMgIGVuZGlmCisjICBkZWZpbmUgX01kb3VibGVfIAkJX01sb25nX2RvdWJsZV8KKyMgIGlmZGVmIF9fU1REQ19fCisjICAgZGVmaW5lIF9fTUFUSF9QUkVDTkFNRShuYW1lLHIpIG5hbWUjI2wjI3IKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19NQVRIX1BSRUNOQU1FKG5hbWUscikgbmFtZS8qKi9sLyoqL3IKKyMgIGVuZGlmCisjICBkZWZpbmUgX01kb3VibGVfQkVHSU5fTkFNRVNQQUNFIF9fQkVHSU5fTkFNRVNQQUNFX0M5OQorIyAgZGVmaW5lIF9NZG91YmxlX0VORF9OQU1FU1BBQ0UgICBfX0VORF9OQU1FU1BBQ0VfQzk5CisjICBpbmNsdWRlIDxiaXRzL21hdGhjYWxscy5oPgorIyAgdW5kZWYgX01kb3VibGVfCisjIHVuZGVmIF9NZG91YmxlX0JFR0lOX05BTUVTUEFDRQorIyB1bmRlZiBfTWRvdWJsZV9FTkRfTkFNRVNQQUNFCisjICB1bmRlZiBfX01BVEhfUFJFQ05BTUUKKworIyBlbmRpZiAvKiBfX1NURENfXyB8fCBfX0dOVUNfXyAqLworCisjZW5kaWYJLyogVXNlIG1pc2Mgb3IgSVNPIEM5OS4gICovCisjdW5kZWYJX19NQVRIREVDTF8xCisjdW5kZWYJX19NQVRIREVDTAorI3VuZGVmCV9fTUFUSENBTEwKKworCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSBgZ2FtbWEnIGFuZCBgbGdhbW1hJy4gICovCitleHRlcm4gaW50IHNpZ25nYW07CisjZW5kaWYKKworCisvKiBJU08gQzk5IGRlZmluZXMgc29tZSBnZW5lcmljIG1hY3JvcyB3aGljaCB3b3JrIG9uIGFueSBkYXRhIHR5cGUuICAqLworI2lmZGVmIF9fVVNFX0lTT0M5OQorCisvKiBHZXQgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB2YWx1ZXMgZGVzY3JpYmluZyB0aGUgZmxvYXRpbmctcG9pbnQKKyAgIGV2YWx1YXRpb24uICBUaGUgZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBnZXQgZGVmaW5lZDoKKworICAgIGZsb2F0X3QJZmxvYXRpbmctcG9pbnQgdHlwZSBhdCBsZWFzdCBhcyB3aWRlIGFzIGBmbG9hdCcgdXNlZAorCQl0byBldmFsdWF0ZSBgZmxvYXQnIGV4cHJlc3Npb25zCisgICAgZG91YmxlX3QJZmxvYXRpbmctcG9pbnQgdHlwZSBhdCBsZWFzdCBhcyB3aWRlIGFzIGBkb3VibGUnIHVzZWQKKwkJdG8gZXZhbHVhdGUgYGRvdWJsZScgZXhwcmVzc2lvbnMKKworICAgIEZMVF9FVkFMX01FVEhPRAorCQlEZWZpbmVkIHRvCisJCSAgMAlpZiBgZmxvYXRfdCcgaXMgYGZsb2F0JyBhbmQgYGRvdWJsZV90JyBpcyBgZG91YmxlJworCQkgIDEJaWYgYGZsb2F0X3QnIGFuZCBgZG91YmxlX3QnIGFyZSBgZG91YmxlJworCQkgIDIJaWYgYGZsb2F0X3QnIGFuZCBgZG91YmxlX3QnIGFyZSBgbG9uZyBkb3VibGUnCisJCSAgZWxzZQlgZmxvYXRfdCcgYW5kIGBkb3VibGVfdCcgYXJlIHVuc3BlY2lmaWVkCisKKyAgICBJTkZJTklUWQlyZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5maW5pdHkgdmFsdWUgb2YgdHlwZSBgZmxvYXQnCisKKyAgICBGUF9GQVNUX0ZNQQorICAgIEZQX0ZBU1RfRk1BRgorICAgIEZQX0ZBU1RfRk1BTAorCQlJZiBkZWZpbmVkIGl0IGluZGljYXRlcyB0aGF0IHRoZSBgZm1hJyBmdW5jdGlvbgorCQlnZW5lcmFsbHkgZXhlY3V0ZXMgYWJvdXQgYXMgZmFzdCBhcyBhIG11bHRpcGx5IGFuZCBhbiBhZGQuCisJCVRoaXMgbWFjcm8gaXMgZGVmaW5lZCBvbmx5IGlmZiB0aGUgYGZtYScgZnVuY3Rpb24gaXMKKwkJaW1wbGVtZW50ZWQgZGlyZWN0bHkgd2l0aCBhIGhhcmR3YXJlIG11bHRpcGx5LWFkZCBpbnN0cnVjdGlvbnMuCisKKyAgICBGUF9JTE9HQjAJRXhwYW5kcyB0byBhIHZhbHVlIHJldHVybmVkIGJ5IGBpbG9nYiAoMC4wKScuCisgICAgRlBfSUxPR0JOQU4JRXhwYW5kcyB0byBhIHZhbHVlIHJldHVybmVkIGJ5IGBpbG9nYiAoTkFOKScuCisKKyAgICBERUNJTUFMX0RJRwlOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgc3VwcG9ydGVkIGJ5IGNvbnZlcnNpb24gYmV0d2VlbgorCQlkZWNpbWFsIGFuZCBhbGwgaW50ZXJuYWwgZmxvYXRpbmctcG9pbnQgZm9ybWF0cy4KKworKi8KKworLyogQWxsIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgY2FuIGJlIHB1dCBpbiBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy4gICovCitlbnVtCisgIHsKKyAgICBGUF9OQU4sCisjIGRlZmluZSBGUF9OQU4gRlBfTkFOCisgICAgRlBfSU5GSU5JVEUsCisjIGRlZmluZSBGUF9JTkZJTklURSBGUF9JTkZJTklURQorICAgIEZQX1pFUk8sCisjIGRlZmluZSBGUF9aRVJPIEZQX1pFUk8KKyAgICBGUF9TVUJOT1JNQUwsCisjIGRlZmluZSBGUF9TVUJOT1JNQUwgRlBfU1VCTk9STUFMCisgICAgRlBfTk9STUFMCisjIGRlZmluZSBGUF9OT1JNQUwgRlBfTk9STUFMCisgIH07CisKKy8qIFJldHVybiBudW1iZXIgb2YgY2xhc3NpZmljYXRpb24gYXBwcm9wcmlhdGUgZm9yIFguICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBmcGNsYXNzaWZ5KHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkgPyBfX2ZwY2xhc3NpZnlmICh4KSA6IF9fZnBjbGFzc2lmeSAoeCkpCisjIGVsc2UKKyMgIGRlZmluZSBmcGNsYXNzaWZ5KHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkJCQkJCSAgICAgIFwKKyAgICAgID8gX19mcGNsYXNzaWZ5ZiAoeCkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9fZnBjbGFzc2lmeSAoeCkgOiBfX2ZwY2xhc3NpZnlsICh4KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgc2lnbiBvZiBYIGlzIG5lZ2F0aXZlLiAgKi8KKyMgaWZkZWYgX19OT19MT05HX0RPVUJMRV9NQVRICisjICBkZWZpbmUgc2lnbmJpdCh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19zaWduYml0ZiAoeCkgOiBfX3NpZ25iaXQgKHgpKQorIyBlbHNlCisjICBkZWZpbmUgc2lnbmJpdCh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9fc2lnbmJpdGYgKHgpCQkJCQkJCSAgICAgIFwKKyAgICAgIDogc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkJCQkJCSAgICAgIFwKKyAgICAgID8gX19zaWduYml0ICh4KSA6IF9fc2lnbmJpdGwgKHgpKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIG5vdCArLUluZiBvciBOYU4uICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBpc2Zpbml0ZSh4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19maW5pdGVmICh4KSA6IF9fZmluaXRlICh4KSkKKyMgZWxzZQorIyAgZGVmaW5lIGlzZmluaXRlKHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkJCQkJCSAgICAgIFwKKyAgICAgID8gX19maW5pdGVmICh4KQkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9fZmluaXRlICh4KSA6IF9fZmluaXRlbCAoeCkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIFggaXMgbmVpdGhlciB6ZXJvLCBzdWJub3JtYWwsIEluZiwgbm9yIE5hTi4gICovCisjIGRlZmluZSBpc25vcm1hbCh4KSAoZnBjbGFzc2lmeSAoeCkgPT0gRlBfTk9STUFMKQorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGEgTmFOLiAgV2UgY291bGQgdXNlIGBmcGNsYXNzaWZ5JyBidXQKKyAgIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGZ1bmN0aW9ucyBgX19pc25hbicgYW5kIGl0IGlzIGZhc3Rlci4gICovCisjIGlmZGVmIF9fTk9fTE9OR19ET1VCTEVfTUFUSAorIyAgZGVmaW5lIGlzbmFuKHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkgPyBfX2lzbmFuZiAoeCkgOiBfX2lzbmFuICh4KSkKKyMgZWxzZQorIyAgZGVmaW5lIGlzbmFuKHgpIFwKKyAgICAgKHNpemVvZiAoeCkgPT0gc2l6ZW9mIChmbG9hdCkJCQkJCSAgICAgIFwKKyAgICAgID8gX19pc25hbmYgKHgpCQkJCQkJCSAgICAgIFwKKyAgICAgIDogc2l6ZW9mICh4KSA9PSBzaXplb2YgKGRvdWJsZSkJCQkJCSAgICAgIFwKKyAgICAgID8gX19pc25hbiAoeCkgOiBfX2lzbmFubCAoeCkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlzIFggaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHkuICAqLworIyBpZmRlZiBfX05PX0xPTkdfRE9VQkxFX01BVEgKKyMgIGRlZmluZSBpc2luZih4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpID8gX19pc2luZmYgKHgpIDogX19pc2luZiAoeCkpCisjIGVsc2UKKyMgIGRlZmluZSBpc2luZih4KSBcCisgICAgIChzaXplb2YgKHgpID09IHNpemVvZiAoZmxvYXQpCQkJCQkgICAgICBcCisgICAgICA/IF9faXNpbmZmICh4KQkJCQkJCQkgICAgICBcCisgICAgICA6IHNpemVvZiAoeCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJCQkgICAgICBcCisgICAgICA/IF9faXNpbmYgKHgpIDogX19pc2luZmwgKHgpKQorIyBlbmRpZgorCisvKiBCaXRtYXNrcyBmb3IgdGhlIG1hdGhfZXJyaGFuZGxpbmcgbWFjcm8uICAqLworIyBkZWZpbmUgTUFUSF9FUlJOTwkxCS8qIGVycm5vIHNldCBieSBtYXRoIGZ1bmN0aW9ucy4gICovCisjIGRlZmluZSBNQVRIX0VSUkVYQ0VQVAkyCS8qIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IG1hdGggZnVuY3Rpb25zLiAgKi8KKworI2VuZGlmIC8qIFVzZSBJU08gQzk5LiAgKi8KKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFN1cHBvcnQgZm9yIHZhcmlvdXMgZGlmZmVyZW50IHN0YW5kYXJkIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9ycy4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgX0lFRUVfID0gLTEsCS8qIEFjY29yZGluZyB0byBJRUVFIDc1NC9JRUVFIDg1NC4gICovCisgIF9TVklEXywJLyogQWNjb3JkaW5nIHRvIFN5c3RlbSBWLCByZWxlYXNlIDQuICAqLworICBfWE9QRU5fLAkvKiBOb3dhZGF5cyBhbHNvIFVuaXg5OC4gICovCisgIF9QT1NJWF8sCisgIF9JU09DXwkvKiBBY3R1YWxseSB0aGlzIGlzIElTTyBDOTkuICAqLworfSBfTElCX1ZFUlNJT05fVFlQRTsKKworLyogVGhpcyB2YXJpYWJsZSBjYW4gYmUgY2hhbmdlZCBhdCBydW4tdGltZSB0byBhbnkgb2YgdGhlIHZhbHVlcyBhYm92ZSB0bworICAgYWZmZWN0IGZsb2F0aW5nIHBvaW50IGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yIChpdCBtYXkgYWxzbyBiZSBuZWNlc3NhcnkKKyAgIHRvIGNoYW5nZSB0aGUgaGFyZHdhcmUgRlBVIGV4Y2VwdGlvbiBzZXR0aW5ncykuICAqLworZXh0ZXJuIF9MSUJfVkVSU0lPTl9UWVBFIF9MSUJfVkVSU0lPTjsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9TVklECisvKiBJbiBTVklEIGVycm9yIGhhbmRsaW5nLCBgbWF0aGVycicgaXMgY2FsbGVkIHdpdGggdGhpcyBkZXNjcmlwdGlvbgorICAgb2YgdGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi4KKworICAgV2UgaGF2ZSBhIHByb2JsZW0gd2hlbiB1c2luZyBDKysgc2luY2UgYGV4Y2VwdGlvbicgaXMgYSByZXNlcnZlZAorICAgbmFtZSBpbiBDKysuICAqLworIyBpZmRlZiBfX2NwbHVzcGx1cworc3RydWN0IF9fZXhjZXB0aW9uCisjIGVsc2UKK3N0cnVjdCBleGNlcHRpb24KKyMgZW5kaWYKKyAgeworICAgIGludCB0eXBlOworICAgIGNoYXIgKm5hbWU7CisgICAgZG91YmxlIGFyZzE7CisgICAgZG91YmxlIGFyZzI7CisgICAgZG91YmxlIHJldHZhbDsKKyAgfTsKKworIyBpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIGludCBtYXRoZXJyIChzdHJ1Y3QgX19leGNlcHRpb24gKl9fZXhjKSB0aHJvdyAoKTsKKyMgZWxzZQorZXh0ZXJuIGludCBtYXRoZXJyIChzdHJ1Y3QgZXhjZXB0aW9uICpfX2V4Yyk7CisjIGVuZGlmCisKKyMgZGVmaW5lIFhfVExPU1MJMS40MTQ4NDc1NTA0MDU2ODgwMDAwMGUrMTYKKworLyogVHlwZXMgb2YgZXhjZXB0aW9ucyBpbiB0aGUgYHR5cGUnIGZpZWxkLiAgKi8KKyMgZGVmaW5lIERPTUFJTgkJMQorIyBkZWZpbmUgU0lORwkJMgorIyBkZWZpbmUgT1ZFUkZMT1cJMworIyBkZWZpbmUgVU5ERVJGTE9XCTQKKyMgZGVmaW5lIFRMT1NTCQk1CisjIGRlZmluZSBQTE9TUwkJNgorCisvKiBTVklEIG1vZGUgc3BlY2lmaWVzIHJldHVybmluZyB0aGlzIGxhcmdlIHZhbHVlIGluc3RlYWQgb2YgaW5maW5pdHkuICAqLworIyBkZWZpbmUgSFVHRQkJMy40MDI4MjM0N2UrMzhGCisKKyNlbHNlCS8qICFTVklEICovCisKKyMgaWZkZWYgX19VU0VfWE9QRU4KKy8qIFgvT3BlbiB3YW50cyBhbm90aGVyIHN0cmFuZ2UgY29uc3RhbnQuICAqLworIyAgZGVmaW5lIE1BWEZMT0FUCTMuNDAyODIzNDdlKzM4RgorIyBlbmRpZgorCisjZW5kaWYJLyogU1ZJRCAqLworCisKKy8qIFNvbWUgdXNlZnVsIGNvbnN0YW50cy4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgTV9FCQkyLjcxODI4MTgyODQ1OTA0NTIzNTQJLyogZSAqLworIyBkZWZpbmUgTV9MT0cyRQkxLjQ0MjY5NTA0MDg4ODk2MzQwNzQJLyogbG9nXzIgZSAqLworIyBkZWZpbmUgTV9MT0cxMEUJMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NQkvKiBsb2dfMTAgZSAqLworIyBkZWZpbmUgTV9MTjIJCTAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIJLyogbG9nX2UgMiAqLworIyBkZWZpbmUgTV9MTjEwCQkyLjMwMjU4NTA5Mjk5NDA0NTY4NDAyCS8qIGxvZ19lIDEwICovCisjIGRlZmluZSBNX1BJCQkzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CS8qIHBpICovCisjIGRlZmluZSBNX1BJXzIJCTEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMJLyogcGkvMiAqLworIyBkZWZpbmUgTV9QSV80CQkwLjc4NTM5ODE2MzM5NzQ0ODMwOTYyCS8qIHBpLzQgKi8KKyMgZGVmaW5lIE1fMV9QSQkJMC4zMTgzMDk4ODYxODM3OTA2NzE1NAkvKiAxL3BpICovCisjIGRlZmluZSBNXzJfUEkJCTAuNjM2NjE5NzcyMzY3NTgxMzQzMDgJLyogMi9waSAqLworIyBkZWZpbmUgTV8yX1NRUlRQSQkxLjEyODM3OTE2NzA5NTUxMjU3MzkwCS8qIDIvc3FydChwaSkgKi8KKyMgZGVmaW5lIE1fU1FSVDIJMS40MTQyMTM1NjIzNzMwOTUwNDg4MAkvKiBzcXJ0KDIpICovCisjIGRlZmluZSBNX1NRUlQxXzIJMC43MDcxMDY3ODExODY1NDc1MjQ0MAkvKiAxL3NxcnQoMikgKi8KKyNlbmRpZgorCisvKiBUaGUgYWJvdmUgY29uc3RhbnRzIGFyZSBub3QgYWRlcXVhdGUgZm9yIGNvbXB1dGF0aW9uIHVzaW5nIGBsb25nIGRvdWJsZSdzLgorICAgVGhlcmVmb3JlIHdlIHByb3ZpZGUgYXMgYW4gZXh0ZW5zaW9uIGNvbnN0YW50cyB3aXRoIHNpbWlsYXIgbmFtZXMgYXMgYQorICAgR05VIGV4dGVuc2lvbi4gIFByb3ZpZGUgZW5vdWdoIGRpZ2l0cyBmb3IgdGhlIDEyOC1iaXQgSUVFRSBxdWFkLiAgKi8KKyNpZmRlZiBfX1VTRV9HTlUKKyMgZGVmaW5lIE1fRWwJCTIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNUwgIC8qIGUgKi8KKyMgZGVmaW5lIE1fTE9HMkVsCTEuNDQyNjk1MDQwODg4OTYzNDA3MzU5OTI0NjgxMDAxODkyMUwgIC8qIGxvZ18yIGUgKi8KKyMgZGVmaW5lIE1fTE9HMTBFbAkwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTFMICAvKiBsb2dfMTAgZSAqLworIyBkZWZpbmUgTV9MTjJsCQkwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjZMICAvKiBsb2dfZSAyICovCisjIGRlZmluZSBNX0xOMTBsCTIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MkwgIC8qIGxvZ19lIDEwICovCisjIGRlZmluZSBNX1BJbAkJMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TCAgLyogcGkgKi8KKyMgZGVmaW5lIE1fUElfMmwJMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TCAgLyogcGkvMiAqLworIyBkZWZpbmUgTV9QSV80bAkwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMICAvKiBwaS80ICovCisjIGRlZmluZSBNXzFfUElsCTAuMzE4MzA5ODg2MTgzNzkwNjcxNTM3NzY3NTI2NzQ1MDI4N0wgIC8qIDEvcGkgKi8KKyMgZGVmaW5lIE1fMl9QSWwJMC42MzY2MTk3NzIzNjc1ODEzNDMwNzU1MzUwNTM0OTAwNTc0TCAgLyogMi9waSAqLworIyBkZWZpbmUgTV8yX1NRUlRQSWwJMS4xMjgzNzkxNjcwOTU1MTI1NzM4OTYxNTg5MDMxMjE1NDUyTCAgLyogMi9zcXJ0KHBpKSAqLworIyBkZWZpbmUgTV9TUVJUMmwJMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODg3MjQyMDk2OTgxTCAgLyogc3FydCgyKSAqLworIyBkZWZpbmUgTV9TUVJUMV8ybAkwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OTBMICAvKiAxL3NxcnQoMikgKi8KKyNlbmRpZgorCisKKy8qIFdoZW4gY29tcGlsaW5nIGluIHN0cmljdCBJU08gQyBjb21wYXRpYmxlIG1vZGUgd2UgbXVzdCBub3QgdXNlIHRoZQorICAgaW5saW5lIGZ1bmN0aW9ucyBzaW5jZSB0aGV5LCBhbW9uZyBvdGhlciB0aGluZ3MsIGRvIG5vdCBzZXQgdGhlCisgICBgZXJybm8nIHZhcmlhYmxlIGNvcnJlY3RseS4gICovCisjaWYgZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gJiYgIWRlZmluZWQgX19OT19NQVRIX0lOTElORVMKKyMgZGVmaW5lIF9fTk9fTUFUSF9JTkxJTkVTCTEKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgX19HTlVDX1BSRVJFUSgyLDk3KQorLyogSVNPIEM5OSBkZWZpbmVzIHNvbWUgbWFjcm9zIHRvIGNvbXBhcmUgbnVtYmVyIHdoaWxlIHRha2luZyBjYXJlIGZvcgorICAgdW5vcmRlcmVkIG51bWJlcnMuICBNYW55IEZQVXMgcHJvdmlkZSBzcGVjaWFsIGluc3RydWN0aW9ucyB0byBzdXBwb3J0CisgICB0aGVzZSBvcGVyYXRpb25zLiAgR2VuZXJpYyBzdXBwb3J0IGluIEdDQyBmb3IgdGhlc2UgYXMgYnVpbHRpbnMgd2VudAorICAgaW4gYmVmb3JlIDMuMC4wLCBidXQgbm90IGFsbCBjcHVzIGFkZGVkIHRoZWlyIHBhdHRlcm5zLiAgV2UgZGVmaW5lCisgICB2ZXJzaW9ucyB0aGF0IHVzZSB0aGUgYnVpbHRpbnMgaGVyZSwgYW5kIDxiaXRzL21hdGhpbmxpbmUuaD4gd2lsbAorICAgdW5kZWYvcmVkZWZpbmUgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpYyBHQ0MgdmVyc2lvbiBpbiB1c2UuICAqLworIyBkZWZpbmUgaXNncmVhdGVyKHgsIHkpCV9fYnVpbHRpbl9pc2dyZWF0ZXIoeCwgeSkKKyMgZGVmaW5lIGlzZ3JlYXRlcmVxdWFsKHgsIHkpCV9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbCh4LCB5KQorIyBkZWZpbmUgaXNsZXNzKHgsIHkpCQlfX2J1aWx0aW5faXNsZXNzKHgsIHkpCisjIGRlZmluZSBpc2xlc3NlcXVhbCh4LCB5KQlfX2J1aWx0aW5faXNsZXNzZXF1YWwoeCwgeSkKKyMgZGVmaW5lIGlzbGVzc2dyZWF0ZXIoeCwgeSkJX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoeCwgeSkKKyMgZGVmaW5lIGlzdW5vcmRlcmVkKHUsIHYpCV9fYnVpbHRpbl9pc3Vub3JkZXJlZCh1LCB2KQorI2VuZGlmCisKKy8qIEdldCBtYWNoaW5lLWRlcGVuZGVudCBpbmxpbmUgdmVyc2lvbnMgKGlmIHRoZXJlIGFyZSBhbnkpLiAgKi8KKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworIyBpbmNsdWRlIDxiaXRzL21hdGhpbmxpbmUuaD4KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfSVNPQzk5CisvKiBJZiB3ZSd2ZSBzdGlsbCBnb3QgdW5kZWZpbmVkIGNvbXBhcmlzb24gbWFjcm9zLCBwcm92aWRlIGRlZmF1bHRzLiAgKi8KKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgWCBpcyBncmVhdGVyIHRoYW4gWS4gICovCisjIGlmbmRlZiBpc2dyZWF0ZXIKKyMgIGRlZmluZSBpc2dyZWF0ZXIoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgX194ID4gX195OyB9KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgWCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gWS4gICovCisjIGlmbmRlZiBpc2dyZWF0ZXJlcXVhbAorIyAgZGVmaW5lIGlzZ3JlYXRlcmVxdWFsKHgsIHkpIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgKHsgX190eXBlb2ZfXyh4KSBfX3ggPSAoeCk7IF9fdHlwZW9mX18oeSkgX195ID0gKHkpOwkJCSAgICAgIFwKKyAgICAgICFpc3Vub3JkZXJlZCAoX194LCBfX3kpICYmIF9feCA+PSBfX3k7IH0pKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGxlc3MgdGhhbiBZLiAgKi8KKyMgaWZuZGVmIGlzbGVzcworIyAgZGVmaW5lIGlzbGVzcyh4LCB5KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18oeCkgX194ID0gKHgpOyBfX3R5cGVvZl9fKHkpIF9feSA9ICh5KTsJCQkgICAgICBcCisgICAgICAhaXN1bm9yZGVyZWQgKF9feCwgX195KSAmJiBfX3ggPCBfX3k7IH0pKQorIyBlbmRpZgorCisvKiBSZXR1cm4gbm9uemVybyB2YWx1ZSBpZiBYIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBZLiAgKi8KKyMgaWZuZGVmIGlzbGVzc2VxdWFsCisjICBkZWZpbmUgaXNsZXNzZXF1YWwoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgX194IDw9IF9feTsgfSkpCisjIGVuZGlmCisKKy8qIFJldHVybiBub256ZXJvIHZhbHVlIGlmIGVpdGhlciBYIGlzIGxlc3MgdGhhbiBZIG9yIFkgaXMgbGVzcyB0aGFuIFguICAqLworIyBpZm5kZWYgaXNsZXNzZ3JlYXRlcgorIyAgZGVmaW5lIGlzbGVzc2dyZWF0ZXIoeCwgeSkgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAoeyBfX3R5cGVvZl9fKHgpIF9feCA9ICh4KTsgX190eXBlb2ZfXyh5KSBfX3kgPSAoeSk7CQkJICAgICAgXAorICAgICAgIWlzdW5vcmRlcmVkIChfX3gsIF9feSkgJiYgKF9feCA8IF9feSB8fCBfX3kgPCBfX3gpOyB9KSkKKyMgZW5kaWYKKworLyogUmV0dXJuIG5vbnplcm8gdmFsdWUgaWYgYXJndW1lbnRzIGFyZSB1bm9yZGVyZWQuICAqLworIyBpZm5kZWYgaXN1bm9yZGVyZWQKKyMgIGRlZmluZSBpc3Vub3JkZXJlZCh1LCB2KSBcCisgIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKKyAgICh7IF9fdHlwZW9mX18odSkgX191ID0gKHUpOyBfX3R5cGVvZl9fKHYpIF9fdiA9ICh2KTsJCQkgICAgICBcCisgICAgICBmcGNsYXNzaWZ5IChfX3UpID09IEZQX05BTiB8fCBmcGNsYXNzaWZ5IChfX3YpID09IEZQX05BTjsgfSkpCisjIGVuZGlmCisKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBtYXRoLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL21jaGVjay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjVmMjFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tY2hlY2suaApAQCAtMCwwICsxLDYyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01DSEVDS19ICisjZGVmaW5lIF9NQ0hFQ0tfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiB2YWx1ZXMgZm9yIGBtcHJvYmUnOiB0aGVzZSBhcmUgdGhlIGtpbmRzIG9mIGluY29uc2lzdGVuY2llcyB0aGF0CisgICBgbWNoZWNrJyBlbmFibGVzIGRldGVjdGlvbiBvZi4gICovCitlbnVtIG1jaGVja19zdGF0dXMKKyAgeworICAgIE1DSEVDS19ESVNBQkxFRCA9IC0xLCAgICAgICAvKiBDb25zaXN0ZW5jeSBjaGVja2luZyBpcyBub3QgdHVybmVkIG9uLiAgKi8KKyAgICBNQ0hFQ0tfT0ssICAgICAgICAgICAgICAgICAgLyogQmxvY2sgaXMgZmluZS4gICovCisgICAgTUNIRUNLX0ZSRUUsICAgICAgICAgICAgICAgIC8qIEJsb2NrIGZyZWVkIHR3aWNlLiAgKi8KKyAgICBNQ0hFQ0tfSEVBRCwgICAgICAgICAgICAgICAgLyogTWVtb3J5IGJlZm9yZSB0aGUgYmxvY2sgd2FzIGNsb2JiZXJlZC4gICovCisgICAgTUNIRUNLX1RBSUwgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhZnRlciB0aGUgYmxvY2sgd2FzIGNsb2JiZXJlZC4gICovCisgIH07CisKKworLyogQWN0aXZhdGUgYSBzdGFuZGFyZCBjb2xsZWN0aW9uIG9mIGRlYnVnZ2luZyBob29rcy4gIFRoaXMgbXVzdCBiZSBjYWxsZWQKKyAgIGJlZm9yZSBgbWFsbG9jJyBpcyBldmVyIGNhbGxlZC4gIEFCT1JURlVOQyBpcyBjYWxsZWQgd2l0aCBhbiBlcnJvciBjb2RlCisgICAoc2VlIGVudW0gYWJvdmUpIHdoZW4gYW4gaW5jb25zaXN0ZW5jeSBpcyBkZXRlY3RlZC4gIElmIEFCT1JURlVOQyBpcworICAgbnVsbCwgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uIHByaW50cyBvbiBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgYGFib3J0Jy4gICovCitleHRlcm4gaW50IG1jaGVjayAodm9pZCAoKl9fYWJvcnRmdW5jKSAoZW51bSBtY2hlY2tfc3RhdHVzKSkgX19USFJPVzsKKworLyogU2ltaWxhciB0byBgbWNoZWNrtCBidXQgcGVyZm9ybXMgY2hlY2tzIGZvciBhbGwgYmxvY2sgd2hlbmV2ZXIgb25lIG9mCisgICB0aGUgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucyBpcyBjYWxsZWQuICBUaGlzIGNhbiBiZSB2ZXJ5IHNsb3cuICAqLworZXh0ZXJuIGludCBtY2hlY2tfcGVkYW50aWMgKHZvaWQgKCpfX2Fib3J0ZnVuYykgKGVudW0gbWNoZWNrX3N0YXR1cykpIF9fVEhST1c7CisKKy8qIEZvcmNlIGNoZWNrIG9mIGFsbCBibG9ja3Mgbm93LiAgKi8KK2V4dGVybiB2b2lkIG1jaGVja19jaGVja19hbGwgKHZvaWQpOworCisvKiBDaGVjayBmb3IgYWJlcnJhdGlvbnMgaW4gYSBwYXJ0aWN1bGFyIG1hbGxvYydkIGJsb2NrLiAgWW91IG11c3QgaGF2ZQorICAgY2FsbGVkIGBtY2hlY2snIGFscmVhZHkuICBUaGVzZSBhcmUgdGhlIHNhbWUgY2hlY2tzIHRoYXQgYG1jaGVjaycgZG9lcworICAgd2hlbiB5b3UgZnJlZSBvciByZWFsbG9jYXRlIGEgYmxvY2suICAqLworZXh0ZXJuIGVudW0gbWNoZWNrX3N0YXR1cyBtcHJvYmUgKHZvaWQgKl9fcHRyKSBfX1RIUk9XOworCisvKiBBY3RpdmF0ZSBhIHN0YW5kYXJkIGNvbGxlY3Rpb24gb2YgdHJhY2luZyBob29rcy4gICovCitleHRlcm4gdm9pZCBtdHJhY2UgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBtdW50cmFjZSAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG1jaGVjay5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL21lbW9yeS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNmYTZhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW1vcnkuaApAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBTVklECisgKi8KKworI2lmbmRlZglfTUVNT1JZX0gKKyNkZWZpbmUJX01FTU9SWV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKworI2lmbmRlZglfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYJLyogc3RyaW5nLmggICovCisKKworI2VuZGlmCS8qIG1lbW9yeS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW51LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL21lbnUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDM1MmViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9tZW51LmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMywyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIEF1dGhvcjogIEp1ZXJnZW4gUGZlaWZlciwgMTk5NSwxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogbWVudS5oLHYgMS4xOSAyMDA3LzAyLzI0IDE3OjMyOjEzIHRvbSBFeHAgJCAqLworCisjaWZuZGVmIEVUSV9NRU5VCisjZGVmaW5lIEVUSV9NRU5VCisKKyNpZmRlZiBBTUlHQQorI2RlZmluZSBURVhUIFRFWFRfbmN1cnNlcworI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpbmNsdWRlIDxldGkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGludCBNZW51X09wdGlvbnM7Cit0eXBlZGVmIGludCBJdGVtX09wdGlvbnM7CisKKy8qIE1lbnUgb3B0aW9uczogKi8KKyNkZWZpbmUgT19PTkVWQUxVRSAgICAgICgweDAxKQorI2RlZmluZSBPX1NIT1dERVNDICAgICAgKDB4MDIpCisjZGVmaW5lIE9fUk9XTUFKT1IgICAgICAoMHgwNCkKKyNkZWZpbmUgT19JR05PUkVDQVNFICAgICgweDA4KQorI2RlZmluZSBPX1NIT1dNQVRDSCAgICAgKDB4MTApCisjZGVmaW5lIE9fTk9OQ1lDTElDICAgICAoMHgyMCkKKworLyogSXRlbSBvcHRpb25zOiAqLworI2RlZmluZSBPX1NFTEVDVEFCTEUgICAgKDB4MDEpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGNvbnN0IGNoYXIqIHN0cjsKKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworfSBURVhUOworCit0eXBlZGVmIHN0cnVjdCB0YWdJVEVNIAoreworICBURVhUICAgICAgICAgICBuYW1lOyAgICAgICAgLyogbmFtZSBvZiBtZW51IGl0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgVEVYVCAgICAgICAgICAgZGVzY3JpcHRpb247IC8qIGRlc2NyaXB0aW9uIG9mIGl0ZW0sIG9wdGlvbmFsIGluIGRpc3BsYXkgICovIAorICBzdHJ1Y3QgdGFnTUVOVSAqaW1lbnU7ICAgICAgLyogUG9pbnRlciB0byBwYXJlbnQgbWVudSAgICAgICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAgICAgICAgICAgKnVzZXJwdHI7ICAgIC8qIFBvaW50ZXIgdG8gdXNlciBkZWZpbmVkIHBlciBpdGVtIGRhdGEgICAgICovIAorICBJdGVtX09wdGlvbnMgICBvcHQ7ICAgICAgICAgLyogSXRlbSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisgIHNob3J0ICAgICAgICAgIGluZGV4OyAgICAgICAvKiBJdGVtIG51bWJlciBpZiBjb25uZWN0ZWQgdG8gYSBtZW51ICAgICAgICAqLworICBzaG9ydCAgICAgICAgICB5OyAgICAgICAgICAgLyogeSBhbmQgeCBsb2NhdGlvbiBvZiBpdGVtIGluIG1lbnUgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgeDsKKyAgYm9vbCAgICAgICAgICAgdmFsdWU7ICAgICAgIC8qIFNlbGVjdGlvbiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzdHJ1Y3QgdGFnSVRFTSAqbGVmdDsgICAgICAgLyogbmVpZ2hib3IgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RydWN0IHRhZ0lURU0gKnJpZ2h0OworICBzdHJ1Y3QgdGFnSVRFTSAqdXA7CisgIHN0cnVjdCB0YWdJVEVNICpkb3duOworCit9IElURU07CisKK3R5cGVkZWYgdm9pZCAoKk1lbnVfSG9vaykoc3RydWN0IHRhZ01FTlUgKik7CisKK3R5cGVkZWYgc3RydWN0IHRhZ01FTlUgCit7CisgIHNob3J0ICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyogTnIuIG9mIGNoYXJzIGhpZ2ggICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBjaGFycyB3aWRlICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgcm93czsgICAgICAgICAgICAgICAgICAvKiBOci4gb2YgaXRlbXMgaGlnaCAgICAgICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIGNvbHM7ICAgICAgICAgICAgICAgICAgLyogTnIuIG9mIGl0ZW1zIHdpZGUgICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBmcm93czsgICAgICAgICAgICAgICAgIC8qIE5yLiBvZiBmb3JtYXR0ZWQgaXRlbXMgaGlnaCAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgZmNvbHM7ICAgICAgICAgICAgICAgICAvKiBOci4gb2YgZm9ybWF0dGVkIGl0ZW1zIHdpZGUgICAgICovCisgIHNob3J0ICAgICAgICAgIGFyb3dzOyAgICAgICAgICAgICAgICAgLyogTnIuIG9mIGl0ZW1zIGhpZ2ggKGFjdHVhbCkgICAgICAqLworICBzaG9ydCAgICAgICAgICBuYW1lbGVuOyAgICAgICAgICAgICAgIC8qIE1heC4gbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgZGVzY2xlbjsgICAgICAgICAgICAgICAvKiBNYXguIGRlc2NyaXB0aW9uIGxlbmd0aCAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIG1hcmtsZW47ICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIG1hcmssIGlmIGFueSAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBpdGVtbGVuOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiBvbmUgaXRlbSAgICAgICAgICAgICAgKi8KKyAgc2hvcnQgICAgICAgICAgc3BjX2Rlc2M7ICAgICAgICAgICAgICAvKiBTcGFjaW5nIGZvciBkZXNjcmlwdG9yICAgICAgICAgICovCisgIHNob3J0ICAgICAgICAgIHNwY19jb2xzOyAgICAgICAgICAgICAgLyogU3BhY2luZyBmb3IgY29sdW1ucyAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICBzcGNfcm93czsgICAgICAgICAgICAgIC8qIFNwYWNpbmcgZm9yIHJvd3MgICAgICAgICAgICAgICAgKi8gCisgIGNoYXIgICAgICAgICAgKnBhdHRlcm47ICAgICAgICAgICAgICAgLyogQnVmZmVyIHRvIHN0b3JlIG1hdGNoIGNoYXJzICAgICAqLworICBzaG9ydCAgICAgICAgICBwaW5kZXg7ICAgICAgICAgICAgICAgIC8qIEluZGV4IGludG8gcGF0dGVybiBidWZmZXIgICAgICAgKi8KKyAgV0lORE9XICAgICAgICAqd2luOyAgICAgICAgICAgICAgICAgICAvKiBXaW5kb3cgY29udGFpbmluZyBtZW51ICAgICAgICAgICovCisgIFdJTkRPVyAgICAgICAgKnN1YjsgICAgICAgICAgICAgICAgICAgLyogU3Vid2luZG93IGZvciBtZW51IGRpc3BsYXkgICAgICAqLworICBXSU5ET1cgICAgICAgICp1c2Vyd2luOyAgICAgICAgICAgICAgIC8qIFVzZXIncyB3aW5kb3cgICAgICAgICAgICAgICAgICAgKi8KKyAgV0lORE9XICAgICAgICAqdXNlcnN1YjsgICAgICAgICAgICAgICAvKiBVc2VyJ3Mgc3Vid2luZG93ICAgICAgICAgICAgICAgICovCisgIElURU0gICAgICAgICAgKippdGVtczsgICAgICAgICAgICAgICAgLyogYXJyYXkgb2YgaXRlbXMgICAgICAgICAgICAgICAgICAqLyAKKyAgc2hvcnQgICAgICAgICAgbml0ZW1zOyAgICAgICAgICAgICAgICAvKiBOci4gb2YgaXRlbXMgaW4gbWVudSAgICAgICAgICAgICovCisgIElURU0gICAgICAgICAgKmN1cml0ZW07ICAgICAgICAgICAgICAgLyogQ3VycmVudCBpdGVtICAgICAgICAgICAgICAgICAgICAqLworICBzaG9ydCAgICAgICAgICB0b3Byb3c7ICAgICAgICAgICAgICAgIC8qIFRvcCByb3cgb2YgbWVudSAgICAgICAgICAgICAgICAgKi8KKyAgY2h0eXBlICAgICAgICAgZm9yZTsgICAgICAgICAgICAgICAgICAvKiBTZWxlY3Rpb24gYXR0cmlidXRlICAgICAgICAgICAgICovCisgIGNodHlwZSAgICAgICAgIGJhY2s7ICAgICAgICAgICAgICAgICAgLyogTm9uc2VsZWN0aW9uIGF0dHJpYnV0ZSAgICAgICAgICAqLworICBjaHR5cGUgICAgICAgICBncmV5OyAgICAgICAgICAgICAgICAgIC8qIEluYWN0aXZlIGF0dHJpYnV0ZSAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgY2hhciAgcGFkOyAgICAgICAgICAgICAgICAgICAvKiBQYWQgY2hhcmFjdGVyICAgICAgICAgICAgICAgICAgICovCisKKyAgTWVudV9Ib29rICAgICAgbWVudWluaXQ7ICAgICAgICAgICAgICAvKiBVc2VyIGhvb2tzICAgICAgICAgICAgICAgICAgICAgICovCisgIE1lbnVfSG9vayAgICAgIG1lbnV0ZXJtOworICBNZW51X0hvb2sgICAgICBpdGVtaW5pdDsKKyAgTWVudV9Ib29rICAgICAgaXRlbXRlcm07CisKKyAgdm9pZCAgICAgICAgICAqdXNlcnB0cjsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIG1lbnVzIHVzZXIgZGF0YSAgICAgICovCisgIGNoYXIgICAgICAgICAgKm1hcms7ICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBtYXJrZXIgc3RyaW5nICAgICAgICAqLworCisgIE1lbnVfT3B0aW9ucyAgIG9wdDsgICAgICAgICAgICAgICAgICAgLyogTWVudSBvcHRpb25zICAgICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7ICAgICAgICAgICAgICAgIC8qIEludGVybmFsIHN0YXRlIG9mIG1lbnUgICAgICAgICAgKi8KKworfSBNRU5VOworCisKKy8qIERlZmluZSBrZXlzICovCisKKyNkZWZpbmUgUkVRX0xFRlRfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxKQorI2RlZmluZSBSRVFfUklHSFRfSVRFTSAgICAgICAgICAoS0VZX01BWCArIDIpCisjZGVmaW5lIFJFUV9VUF9JVEVNICAgICAgICAgICAgIChLRVlfTUFYICsgMykKKyNkZWZpbmUgUkVRX0RPV05fSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyA0KQorI2RlZmluZSBSRVFfU0NSX1VMSU5FICAgICAgICAgICAoS0VZX01BWCArIDUpCisjZGVmaW5lIFJFUV9TQ1JfRExJTkUgICAgICAgICAgIChLRVlfTUFYICsgNikKKyNkZWZpbmUgUkVRX1NDUl9EUEFHRSAgICAgICAgICAgKEtFWV9NQVggKyA3KQorI2RlZmluZSBSRVFfU0NSX1VQQUdFICAgICAgICAgICAoS0VZX01BWCArIDgpCisjZGVmaW5lIFJFUV9GSVJTVF9JVEVNICAgICAgICAgIChLRVlfTUFYICsgOSkKKyNkZWZpbmUgUkVRX0xBU1RfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxMCkKKyNkZWZpbmUgUkVRX05FWFRfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxMSkKKyNkZWZpbmUgUkVRX1BSRVZfSVRFTSAgICAgICAgICAgKEtFWV9NQVggKyAxMikKKyNkZWZpbmUgUkVRX1RPR0dMRV9JVEVNICAgICAgICAgKEtFWV9NQVggKyAxMykKKyNkZWZpbmUgUkVRX0NMRUFSX1BBVFRFUk4gICAgICAgKEtFWV9NQVggKyAxNCkKKyNkZWZpbmUgUkVRX0JBQ0tfUEFUVEVSTiAgICAgICAgKEtFWV9NQVggKyAxNSkKKyNkZWZpbmUgUkVRX05FWFRfTUFUQ0ggICAgICAgICAgKEtFWV9NQVggKyAxNikKKyNkZWZpbmUgUkVRX1BSRVZfTUFUQ0ggICAgICAgICAgKEtFWV9NQVggKyAxNykKKworI2RlZmluZSBNSU5fTUVOVV9DT01NQU5EICAgICAgICAoS0VZX01BWCArIDEpCisjZGVmaW5lIE1BWF9NRU5VX0NPTU1BTkQgICAgICAgIChLRVlfTUFYICsgMTcpCisKKy8qCisgKiBTb21lIEFUJlQgY29kZSBleHBlY3RzIE1BWF9DT01NQU5EIHRvIGJlIG91dC1vZi1iYW5kIG5vdAorICoganVzdCBmb3IgbWVudSBjb21tYW5kcyBidXQgZm9yIGZvcm1zIG9uZXMgYXMgd2VsbC4KKyAqLworI2lmIGRlZmluZWQoTUFYX0NPTU1BTkQpCisjICBpZiAoTUFYX01FTlVfQ09NTUFORCA+IE1BWF9DT01NQU5EKQorIyAgICBlcnJvciBTb21ldGhpbmcgaXMgd3JvbmcgLS0gTUFYX01FTlVfQ09NTUFORCBpcyBncmVhdGVyIHRoYW4gTUFYX0NPTU1BTkQKKyMgIGVsaWYgKE1BWF9DT01NQU5EICE9IChLRVlfTUFYICsgMTI4KSkKKyMgICAgZXJyb3IgU29tZXRoaW5nIGlzIHdyb25nIC0tIE1BWF9DT01NQU5EIGlzIGFscmVhZHkgaW5jb25zaXN0ZW50bHkgZGVmaW5lZC4KKyMgIGVuZGlmCisjZWxzZQorIyAgZGVmaW5lIE1BWF9DT01NQU5EIChLRVlfTUFYICsgMTI4KQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tIHByb3RvdHlwZXMgZm9yIGxpYm1lbnUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChJVEVNICoqKQltZW51X2l0ZW1zIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKElURU0gKikJY3VycmVudF9pdGVtIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKElURU0gKikJbmV3X2l0ZW0gKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoTUVOVSAqKQluZXdfbWVudSAoSVRFTSAqKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChJdGVtX09wdGlvbnMpCWl0ZW1fb3B0cyAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChNZW51X09wdGlvbnMpCW1lbnVfb3B0cyAoY29uc3QgTUVOVSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJaXRlbV9pbml0IChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJaXRlbV90ZXJtIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJbWVudV9pbml0IChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKE1lbnVfSG9vaykJbWVudV90ZXJtIChjb25zdCBNRU5VICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoV0lORE9XICopCW1lbnVfc3ViIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFdJTkRPVyAqKQltZW51X3dpbiAoY29uc3QgTUVOVSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikJaXRlbV9kZXNjcmlwdGlvbiAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCWl0ZW1fbmFtZSAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCW1lbnVfbWFyayAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopCW1lbnVfcmVxdWVzdF9uYW1lIChpbnQpOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKQltZW51X3BhdHRlcm4gKGNvbnN0IE1FTlUgKik7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCW1lbnVfdXNlcnB0ciAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkICopCWl0ZW1fdXNlcnB0ciAoY29uc3QgSVRFTSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJbWVudV9iYWNrIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJbWVudV9mb3JlIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNodHlwZSkJbWVudV9ncmV5IChjb25zdCBNRU5VICopOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX2l0ZW0gKElURU0gKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlmcmVlX21lbnUgKE1FTlUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlpdGVtX2NvdW50IChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJaXRlbV9pbmRleCAoY29uc3QgSVRFTSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCWl0ZW1fb3B0c19vZmYgKElURU0gKixJdGVtX09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJaXRlbV9vcHRzX29uIChJVEVNICosSXRlbV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfZHJpdmVyIChNRU5VICosaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfb3B0c19vZmYgKE1FTlUgKixNZW51X09wdGlvbnMpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbWVudV9vcHRzX29uIChNRU5VICosTWVudV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCW1lbnVfcGFkIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJcG9zX21lbnVfY3Vyc29yIChjb25zdCBNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJcG9zdF9tZW51IChNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2NhbGVfbWVudSAoY29uc3QgTUVOVSAqLGludCAqLGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9jdXJyZW50X2l0ZW0gKE1FTlUgKm1lbnUsSVRFTSAqaXRlbSk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV9pbml0IChNRU5VICosIE1lbnVfSG9vayk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfaXRlbV9vcHRzIChJVEVNICosSXRlbV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9pdGVtX3Rlcm0gKE1FTlUgKiwgTWVudV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9pdGVtX3VzZXJwdHIgKElURU0gKiwgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9pdGVtX3ZhbHVlIChJVEVNICosYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9iYWNrIChNRU5VICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2ZvcmUgKE1FTlUgKixjaHR5cGUpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfZm9ybWF0IChNRU5VICosaW50LGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9ncmV5IChNRU5VICosY2h0eXBlKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2luaXQgKE1FTlUgKiwgTWVudV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X2l0ZW1zIChNRU5VICosSVRFTSAqKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9tYXJrIChNRU5VICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9vcHRzIChNRU5VICosTWVudV9PcHRpb25zKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3BhZCAoTUVOVSAqLGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9wYXR0ZXJuIChNRU5VICosY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3N1YiAoTUVOVSAqLFdJTkRPVyAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3Rlcm0gKE1FTlUgKiwgTWVudV9Ib29rKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXNldF9tZW51X3VzZXJwdHIgKE1FTlUgKix2b2lkICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X21lbnVfd2luIChNRU5VICosV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJc2V0X3RvcF9yb3cgKE1FTlUgKixpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJdG9wX3JvdyAoY29uc3QgTUVOVSAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpCXVucG9zdF9tZW51IChNRU5VICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbWVudV9yZXF1ZXN0X2J5X25hbWUgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KQlzZXRfbWVudV9zcGFjaW5nIChNRU5VICosaW50LGludCxpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkJbWVudV9zcGFjaW5nIChjb25zdCBNRU5VICosaW50ICosaW50ICosaW50ICopOworCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKQlpdGVtX3ZhbHVlIChjb25zdCBJVEVNICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpCWl0ZW1fdmlzaWJsZSAoY29uc3QgSVRFTSAqKTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpCW1lbnVfZm9ybWF0IChjb25zdCBNRU5VICosaW50ICosaW50ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBFVElfTUVOVSAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9tbnRlbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbW50ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyZTk1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbW50ZW50LmgKQEAgLTAsMCArMSw5OCBAQAorLyogVXRpbGl0aWVzIGZvciByZWFkaW5nL3dyaXRpbmcgZnN0YWIsIG10YWIsIGV0Yy4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfTU5URU5UX0gKKyNkZWZpbmUJX01OVEVOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9GSUxFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorCisKKy8qIEZpbGUgbGlzdGluZyBjYW5vbmljYWwgaW50ZXJlc3RpbmcgbW91bnQgcG9pbnRzLiAgKi8KKyNkZWZpbmUJTU5UVEFCCQlfUEFUSF9NTlRUQUIJLyogRGVwcmVjYXRlZCBhbGlhcy4gICovCisKKy8qIEZpbGUgbGlzdGluZyBjdXJyZW50bHkgYWN0aXZlIG1vdW50IHBvaW50cy4gICovCisjZGVmaW5lCU1PVU5URUQJCV9QQVRIX01PVU5URUQJLyogRGVwcmVjYXRlZCBhbGlhcy4gICovCisKKworLyogR2VuZXJhbCBmaWxlc3lzdGVtIHR5cGVzLiAgKi8KKyNkZWZpbmUgTU5UVFlQRV9JR05PUkUJImlnbm9yZSIJLyogSWdub3JlIHRoaXMgZW50cnkuICAqLworI2RlZmluZSBNTlRUWVBFX05GUwkibmZzIgkJLyogTmV0d29yayBmaWxlIHN5c3RlbS4gICovCisjZGVmaW5lIE1OVFRZUEVfU1dBUAkic3dhcCIJCS8qIFN3YXAgZGV2aWNlLiAgKi8KKworCisvKiBHZW5lcmljIG1vdW50IG9wdGlvbnMuICAqLworI2RlZmluZSBNTlRPUFRfREVGQVVMVFMJImRlZmF1bHRzIgkvKiBVc2UgYWxsIGRlZmF1bHQgb3B0aW9ucy4gICovCisjZGVmaW5lIE1OVE9QVF9STwkicm8iCQkvKiBSZWFkIG9ubHkuICAqLworI2RlZmluZSBNTlRPUFRfUlcJInJ3IgkJLyogUmVhZC93cml0ZS4gICovCisjZGVmaW5lIE1OVE9QVF9TVUlECSJzdWlkIgkJLyogU2V0IHVpZCBhbGxvd2VkLiAgKi8KKyNkZWZpbmUgTU5UT1BUX05PU1VJRAkibm9zdWlkIgkvKiBObyBzZXQgdWlkIGFsbG93ZWQuICAqLworI2RlZmluZSBNTlRPUFRfTk9BVVRPCSJub2F1dG8iCS8qIERvIG5vdCBhdXRvIG1vdW50LiAgKi8KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGEgbW91bnQgdGFibGUgZW50cnkuICAqLworc3RydWN0IG1udGVudAorICB7CisgICAgY2hhciAqbW50X2ZzbmFtZTsJCS8qIERldmljZSBvciBzZXJ2ZXIgZm9yIGZpbGVzeXN0ZW0uICAqLworICAgIGNoYXIgKm1udF9kaXI7CQkvKiBEaXJlY3RvcnkgbW91bnRlZCBvbi4gICovCisgICAgY2hhciAqbW50X3R5cGU7CQkvKiBUeXBlIG9mIGZpbGVzeXN0ZW06IHVmcywgbmZzLCBldGMuICAqLworICAgIGNoYXIgKm1udF9vcHRzOwkJLyogQ29tbWEtc2VwYXJhdGVkIG9wdGlvbnMgZm9yIGZzLiAgKi8KKyAgICBpbnQgbW50X2ZyZXE7CQkvKiBEdW1wIGZyZXF1ZW5jeSAoaW4gZGF5cykuICAqLworICAgIGludCBtbnRfcGFzc25vOwkJLyogUGFzcyBudW1iZXIgZm9yIGBmc2NrJy4gICovCisgIH07CisKKworLyogUHJlcGFyZSB0byBiZWdpbiByZWFkaW5nIGFuZC9vciB3cml0aW5nIG1vdW50IHRhYmxlIGVudHJpZXMgZnJvbSB0aGUKKyAgIGJlZ2lubmluZyBvZiBGSUxFLiAgTU9ERSBpcyBhcyBmb3IgYGZvcGVuJy4gICovCitleHRlcm4gRklMRSAqc2V0bW50ZW50IChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19jb25zdCBjaGFyICpfX21vZGUpIF9fVEhST1c7CisKKy8qIFJlYWQgb25lIG1vdW50IHRhYmxlIGVudHJ5IGZyb20gU1RSRUFNLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gc3RvcmFnZQorICAgcmV1c2VkIG9uIHRoZSBuZXh0IGNhbGwsIG9yIG51bGwgZm9yIEVPRiBvciBlcnJvciAodXNlIGZlb2YvZmVycm9yIHRvCisgICBjaGVjaykuICAqLworZXh0ZXJuIHN0cnVjdCBtbnRlbnQgKmdldG1udGVudCAoRklMRSAqX19zdHJlYW0pIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbiBvZiB0aGUgYWJvdmUgZnVuY3Rpb24uICAqLworZXh0ZXJuIHN0cnVjdCBtbnRlbnQgKmdldG1udGVudF9yIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJCSAgIHN0cnVjdCBtbnRlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkJICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwKKwkJCQkgICBpbnQgX19idWZzaXplKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIFdyaXRlIHRoZSBtb3VudCB0YWJsZSBlbnRyeSBkZXNjcmliZWQgYnkgTU5UIHRvIFNUUkVBTS4KKyAgIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4gICovCitleHRlcm4gaW50IGFkZG1udGVudCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgbW50ZW50ICpfX3Jlc3RyaWN0IF9fbW50KSBfX1RIUk9XOworCisvKiBDbG9zZSBhIHN0cmVhbSBvcGVuZWQgd2l0aCBgc2V0bW50ZW50Jy4gICovCitleHRlcm4gaW50IGVuZG1udGVudCAoRklMRSAqX19zdHJlYW0pIF9fVEhST1c7CisKKy8qIFNlYXJjaCBNTlQtPm1udF9vcHRzIGZvciBhbiBvcHRpb24gbWF0Y2hpbmcgT1BULgorICAgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3Vic3RyaW5nLCBvciBudWxsIGlmIG5vbmUgZm91bmQuICAqLworZXh0ZXJuIGNoYXIgKmhhc21udG9wdCAoX19jb25zdCBzdHJ1Y3QgbW50ZW50ICpfX21udCwKKwkJCV9fY29uc3QgY2hhciAqX19vcHQpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG1udGVudC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL21vbmV0YXJ5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL21vbmV0YXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyMzRjYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbW9uZXRhcnkuaApAQCAtMCwwICsxLDYwIEBACisvKiBIZWFkZXIgZmlsZSBmb3IgbW9uZXRhcnkgdmFsdWUgZm9ybWF0dGluZyBmdW5jdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk4LDE5OTksMjAwMCwyMDAyLDIwMDYKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfTU9ORVRBUllfSAorI2RlZmluZQlfTU9ORVRBUllfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgbmVlZGVkIHR5cGVzLiAgKi8KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworI2lmbmRlZglfX3NzaXplX3RfZGVmaW5lZAordHlwZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKKyMgZGVmaW5lIF9fc3NpemVfdF9kZWZpbmVkCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEZvcm1hdHRpbmcgYSBtb25ldGFyeSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLiAgKi8KK2V4dGVybiBzc2l6ZV90IHN0cmZtb24gKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X3N0cmZtb25fXyAoMywgNCk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBGb3JtYXR0aW5nIGEgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGxvY2FsZS4gICovCitleHRlcm4gc3NpemVfdCBzdHJmbW9uX2wgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJICBfX2xvY2FsZV90IGxvYywKKwkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZm9ybWF0X3N0cmZtb25fXyAoNCwgNSk7CisjZW5kaWYKKworI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy9tb25ldGFyeS1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG1vbmV0YXJ5LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbXF1ZXVlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL21xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzNlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL21xdWV1ZS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX01RVUVVRV9ICisjZGVmaW5lIF9NUVVFVUVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjZGVmaW5lIF9fbmVlZF9zaWdldmVudF90CisjaW5jbHVkZSA8Yml0cy9zaWdpbmZvLmg+CisjZGVmaW5lIF9fbmVlZF90aW1lc3BlYworI2luY2x1ZGUgPHRpbWUuaD4KKy8qIEdldCB0aGUgZGVmaW5pdGlvbiBvZiBtcWRfdCBhbmQgc3RydWN0IG1xX2F0dHIuICAqLworI2luY2x1ZGUgPGJpdHMvbXF1ZXVlLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogRXN0YWJsaXNoIGNvbm5lY3Rpb24gYmV0d2VlbiBhIHByb2Nlc3MgYW5kIGEgbWVzc2FnZSBxdWV1ZSBOQU1FIGFuZAorICAgcmV0dXJuIG1lc3NhZ2UgcXVldWUgZGVzY3JpcHRvciBvciAobXFkX3QpIC0xIG9uIGVycm9yLiAgT0ZMQUcgZGV0ZXJtaW5lcworICAgdGhlIHR5cGUgb2YgYWNjZXNzIHVzZWQuICBJZiBPX0NSRUFUIGlzIG9uIE9GTEFHLCB0aGUgdGhpcmQgYXJndW1lbnQgaXMKKyAgIHRha2VuIGFzIGEgYG1vZGVfdCcsIHRoZSBtb2RlIG9mIHRoZSBjcmVhdGVkIG1lc3NhZ2UgcXVldWUsIGFuZCB0aGUgZm91cnRoCisgICBhcmd1bWVudCBpcyB0YWtlbiBhcyBgc3RydWN0IG1xX2F0dHIgKicsIHBvaW50ZXIgdG8gbWVzc2FnZSBxdWV1ZQorICAgYXR0cmlidXRlcy4gIElmIHRoZSBmb3VydGggYXJndW1lbnQgaXMgTlVMTCwgZGVmYXVsdCBhdHRyaWJ1dGVzIGFyZQorICAgdXNlZC4gICovCitleHRlcm4gbXFkX3QgbXFfb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pCisgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIG1lc3NhZ2UgcXVldWUgZGVzY3JpcHRvciBNUURFUyBhbmQgaXRzCisgICBtZXNzYWdlIHF1ZXVlLiAgKi8KK2V4dGVybiBpbnQgbXFfY2xvc2UgKG1xZF90IF9fbXFkZXMpIF9fVEhST1c7CisKKy8qIFF1ZXJ5IHN0YXR1cyBhbmQgYXR0cmlidXRlcyBvZiBtZXNzYWdlIHF1ZXVlIE1RREVTLiAgKi8KK2V4dGVybiBpbnQgbXFfZ2V0YXR0ciAobXFkX3QgX19tcWRlcywgc3RydWN0IG1xX2F0dHIgKl9fbXFzdGF0KQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogU2V0IGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIG1lc3NhZ2UgcXVldWUgTVFERVMgYW5kIGlmIE9NUVNUQVQgaXMKKyAgIG5vdCBOVUxMIGFsc28gcXVlcnkgaXRzIG9sZCBhdHRyaWJ1dGVzLiAgKi8KK2V4dGVybiBpbnQgbXFfc2V0YXR0ciAobXFkX3QgX19tcWRlcywKKwkJICAgICAgIF9fY29uc3Qgc3RydWN0IG1xX2F0dHIgKl9fcmVzdHJpY3QgX19tcXN0YXQsCisJCSAgICAgICBzdHJ1Y3QgbXFfYXR0ciAqX19yZXN0cmljdCBfX29tcXN0YXQpCisgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBSZW1vdmUgbWVzc2FnZSBxdWV1ZSBuYW1lZCBOQU1FLiAgKi8KK2V4dGVybiBpbnQgbXFfdW5saW5rIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJlZ2lzdGVyIG5vdGlmaWNhdGlvbiBpc3N1ZWQgdXBvbiBtZXNzYWdlIGFycml2YWwgdG8gYW4gZW1wdHkKKyAgIG1lc3NhZ2UgcXVldWUgTVFERVMuICAqLworZXh0ZXJuIGludCBtcV9ub3RpZnkgKG1xZF90IF9fbXFkZXMsIF9fY29uc3Qgc3RydWN0IHNpZ2V2ZW50ICpfX25vdGlmaWNhdGlvbikKKyAgICAgX19USFJPVzsKKworLyogUmVjZWl2ZSB0aGUgb2xkZXN0IGZyb20gaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlcyBpbiBtZXNzYWdlIHF1ZXVlCisgICBNUURFUy4gICovCitleHRlcm4gc3NpemVfdCBtcV9yZWNlaXZlIChtcWRfdCBfX21xZGVzLCBjaGFyICpfX21zZ19wdHIsIHNpemVfdCBfX21zZ19sZW4sCisJCQkgICB1bnNpZ25lZCBpbnQgKl9fbXNnX3ByaW8pIF9fbm9ubnVsbCAoKDIpKTsKKworLyogQWRkIG1lc3NhZ2UgcG9pbnRlZCBieSBNU0dfUFRSIHRvIG1lc3NhZ2UgcXVldWUgTVFERVMuICAqLworZXh0ZXJuIGludCBtcV9zZW5kIChtcWRfdCBfX21xZGVzLCBfX2NvbnN0IGNoYXIgKl9fbXNnX3B0ciwgc2l6ZV90IF9fbXNnX2xlbiwKKwkJICAgIHVuc2lnbmVkIGludCBfX21zZ19wcmlvKSBfX25vbm51bGwgKCgyKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBSZWNlaXZlIHRoZSBvbGRlc3QgZnJvbSBoaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2VzIGluIG1lc3NhZ2UgcXVldWUKKyAgIE1RREVTLCBzdG9wIHdhaXRpbmcgaWYgQUJTX1RJTUVPVVQgZXhwaXJlcy4gICovCitleHRlcm4gc3NpemVfdCBtcV90aW1lZHJlY2VpdmUgKG1xZF90IF9fbXFkZXMsIGNoYXIgKl9fcmVzdHJpY3QgX19tc2dfcHRyLAorCQkJCXNpemVfdCBfX21zZ19sZW4sCisJCQkJdW5zaWduZWQgaW50ICpfX3Jlc3RyaWN0IF9fbXNnX3ByaW8sCisJCQkJX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX19hYnNfdGltZW91dCkKKyAgX19ub25udWxsICgoMiwgNSkpOworCisvKiBBZGQgbWVzc2FnZSBwb2ludGVkIGJ5IE1TR19QVFIgdG8gbWVzc2FnZSBxdWV1ZSBNUURFUywgc3RvcCBibG9ja2luZworICAgb24gZnVsbCBtZXNzYWdlIHF1ZXVlIGlmIEFCU19USU1FT1VUIGV4cGlyZXMuICAqLworZXh0ZXJuIGludCBtcV90aW1lZHNlbmQgKG1xZF90IF9fbXFkZXMsIF9fY29uc3QgY2hhciAqX19tc2dfcHRyLAorCQkJIHNpemVfdCBfX21zZ19sZW4sIHVuc2lnbmVkIGludCBfX21zZ19wcmlvLAorCQkJIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX2Fic190aW1lb3V0KQorICBfX25vbm51bGwgKCgyLCA1KSk7CisjZW5kaWYKKworLyogRGVmaW5lIHNvbWUgaW5saW5lcyBoZWxwaW5nIHRvIGNhdGNoIGNvbW1vbiBwcm9ibGVtcy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgICAmJiBkZWZpbmVkIF9fdmFfYXJnX3BhY2tfbGVuCisjIGluY2x1ZGUgPGJpdHMvbXF1ZXVlMi5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBtcXVldWUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uY190cGFybS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uY190cGFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDc2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25jX3RwYXJtLmgKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFRob21hcyBFLiBEaWNrZXkgICAgICAgICAgICAgICAgICAgICAgICAyMDA2ICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiBuY190cGFybS5oLHYgMS40IDIwMDYvMTEvMjYgMDA6NDk6MjUgdG9tIEV4cCAkICovCisKKy8qCisgKiBDYXN0IHBhcmFtZXRlcnMgcGFzdCB0aGUgZm9ybWF0dGluZy1zdHJpbmcgZm9yIHRwYXJtKCkgdG8gbWF0Y2ggdGhlCisgKiBhc3N1bXB0aW9uIG9mIHRoZSB2YXJhcmdzIGNvZGUuCisgKi8KKyNkZWZpbmUgVFBBUk1fQVJHIGxvbmcKKyNkZWZpbmUgVFBBUk1fTihuKSAoVFBBUk1fQVJHKShuKQorCisjZGVmaW5lIFRQQVJNXzkoYSxiLGMsZCxlLGYsZyxoLGksaikgdHBhcm0oYSxUUEFSTV9OKGIpLFRQQVJNX04oYyksVFBBUk1fTihkKSxUUEFSTV9OKGUpLFRQQVJNX04oZiksVFBBUk1fTihnKSxUUEFSTV9OKGgpLFRQQVJNX04oaSksVFBBUk1fTihqKSkKKworI2lmIE5DVVJTRVNfVFBBUk1fVkFSQVJHUworI2RlZmluZSBUUEFSTV84KGEsYixjLGQsZSxmLGcsaCxpKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSxUUEFSTV9OKGcpLFRQQVJNX04oaCksVFBBUk1fTihpKSkKKyNkZWZpbmUgVFBBUk1fNyhhLGIsYyxkLGUsZixnLGgpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSxUUEFSTV9OKGYpLFRQQVJNX04oZyksVFBBUk1fTihoKSkKKyNkZWZpbmUgVFBBUk1fNihhLGIsYyxkLGUsZixnKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSxUUEFSTV9OKGcpKQorI2RlZmluZSBUUEFSTV81KGEsYixjLGQsZSxmKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpLFRQQVJNX04oZSksVFBBUk1fTihmKSkKKyNkZWZpbmUgVFBBUk1fNChhLGIsYyxkLGUpIHRwYXJtKGEsVFBBUk1fTihiKSxUUEFSTV9OKGMpLFRQQVJNX04oZCksVFBBUk1fTihlKSkKKyNkZWZpbmUgVFBBUk1fMyhhLGIsYyxkKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSxUUEFSTV9OKGQpKQorI2RlZmluZSBUUEFSTV8yKGEsYixjKSB0cGFybShhLFRQQVJNX04oYiksVFBBUk1fTihjKSkKKyNkZWZpbmUgVFBBUk1fMShhLGIpIHRwYXJtKGEsVFBBUk1fTihiKSkKKyNkZWZpbmUgVFBBUk1fMChhKSB0cGFybShhKQorI2Vsc2UKKyNkZWZpbmUgVFBBUk1fOChhLGIsYyxkLGUsZixnLGgsaSkgVFBBUk1fOShhLGIsYyxkLGUsZixnLGgsaSwwKQorI2RlZmluZSBUUEFSTV83KGEsYixjLGQsZSxmLGcsaCkgVFBBUk1fOChhLGIsYyxkLGUsZixnLGgsMCkKKyNkZWZpbmUgVFBBUk1fNihhLGIsYyxkLGUsZixnKSBUUEFSTV83KGEsYixjLGQsZSxmLGcsMCkKKyNkZWZpbmUgVFBBUk1fNShhLGIsYyxkLGUsZikgVFBBUk1fNihhLGIsYyxkLGUsZiwwKQorI2RlZmluZSBUUEFSTV80KGEsYixjLGQsZSkgVFBBUk1fNShhLGIsYyxkLGUsMCkKKyNkZWZpbmUgVFBBUk1fMyhhLGIsYyxkKSBUUEFSTV80KGEsYixjLGQsMCkKKyNkZWZpbmUgVFBBUk1fMihhLGIsYykgVFBBUk1fMyhhLGIsYywwKQorI2RlZmluZSBUUEFSTV8xKGEsYikgVFBBUk1fMihhLGIsMCkKKyNkZWZpbmUgVFBBUk1fMShhLGIpIFRQQVJNXzIoYSxiLDApCisjZGVmaW5lIFRQQVJNXzAoYSkgVFBBUk1fMShhLDApCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTQ5ZGU2YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmN1cnNlcy5oCkBAIC0wLDAgKzEgQEAKK2N1cnNlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzX2RsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uY3Vyc2VzX2RsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGZlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25jdXJzZXNfZGxsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRJZDogbmN1cnNlc19kbGwuaCx2IDEuNiAyMDA3LzAzLzEwIDE5OjIxOjQ5IHRvbSBFeHAgJCAqLworCisjaWZuZGVmIE5DVVJTRVNfRExMX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX0RMTF9IX2luY2wgMQorCisvKiBubyBsb25nZXIgbmVlZGVkIG9uIGN5Z3dpbiBvciBtaW5ndywgdGhhbmtzIHRvIGF1dG8taW1wb3J0ICAgICAgICovCisvKiBidXQgdGhpcyBzdHJ1Y3R1cmUgbWF5IGJlIHVzZWZ1bCBhdCBzb21lIHBvaW50IGZvciBhbiBNU1ZDIGJ1aWxkICovCisvKiBzbywgZm9yIG5vdyB1bmNvbmRpdGlvbmFsbHkgZGVmaW5lIHRoZSBpbXBvcnRhbnQgZmxhZ3MgICAgICAgICAgICovCisvKiAidGhlIHJpZ2h0IHdheSIgZm9yIHByb3BlciBzdGF0aWMgYW5kIGRsbCthdXRvLWltcG9ydCBiZWhhdmlvciAgICovCisjdW5kZWYgTkNVUlNFU19ETEwKKyNkZWZpbmUgTkNVUlNFU19TVEFUSUMKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmIGRlZmluZWQoTkNVUlNFU19ETEwpCisjICAgIGlmIGRlZmluZWQoTkNVUlNFU19TVEFUSUMpCisjICAgICAgdW5kZWYgTkNVUlNFU19TVEFUSUMKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICB1bmRlZiBOQ1VSU0VTX0lNUEVYUAorIyAgdW5kZWYgTkNVUlNFU19BUEkKKyMgIHVuZGVmIE5DVVJTRVNfRVhQT1JUCisjICB1bmRlZiBOQ1VSU0VTX0VYUE9SVF9WQVIKKyMgIGlmIGRlZmluZWQoTkNVUlNFU19ETEwpCisvKiBidWlsZGluZyBhIERMTCAqLworIyAgICBkZWZpbmUgTkNVUlNFU19JTVBFWFAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICBlbGlmIGRlZmluZWQoTkNVUlNFU19TVEFUSUMpCisvKiBidWlsZGluZyBvciBsaW5raW5nIHRvIGEgc3RhdGljIGxpYnJhcnkgKi8KKyMgICAgZGVmaW5lIE5DVVJTRVNfSU1QRVhQIC8qIG5vdGhpbmcgKi8KKyMgIGVsc2UKKy8qIGxpbmtpbmcgdG8gdGhlIERMTCAqLworIyAgICBkZWZpbmUgTkNVUlNFU19JTVBFWFAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICBlbmRpZgorIyAgZGVmaW5lIE5DVVJTRVNfQVBJIF9fY2RlY2wKKyMgIGRlZmluZSBOQ1VSU0VTX0VYUE9SVCh0eXBlKSBOQ1VSU0VTX0lNUEVYUCB0eXBlIE5DVVJTRVNfQVBJCisjICBkZWZpbmUgTkNVUlNFU19FWFBPUlRfVkFSKHR5cGUpIE5DVVJTRVNfSU1QRVhQIHR5cGUKKyNlbmRpZgorCisvKiBUYWtlIGNhcmUgb2Ygbm9uLWN5Z3dpbiBwbGF0Zm9ybXMgKi8KKyNpZiAhZGVmaW5lZChOQ1VSU0VTX0lNUEVYUCkKKyMgIGRlZmluZSBOQ1VSU0VTX0lNUEVYUCAvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiAhZGVmaW5lZChOQ1VSU0VTX0FQSSkKKyMgIGRlZmluZSBOQ1VSU0VTX0FQSSAvKiBub3RoaW5nICovCisjZW5kaWYKKyNpZiAhZGVmaW5lZChOQ1VSU0VTX0VYUE9SVCkKKyMgIGRlZmluZSBOQ1VSU0VTX0VYUE9SVCh0eXBlKSBOQ1VSU0VTX0lNUEVYUCB0eXBlIE5DVVJTRVNfQVBJCisjZW5kaWYKKyNpZiAhZGVmaW5lZChOQ1VSU0VTX0VYUE9SVF9WQVIpCisjICBkZWZpbmUgTkNVUlNFU19FWFBPUlRfVkFSKHR5cGUpIE5DVVJTRVNfSU1QRVhQIHR5cGUKKyNlbmRpZgorCisvKgorICogRm9yIHJlZW50cmFudCBjb2RlLCB3ZSBtYXAgdGhlIHZhcmlvdXMgZ2xvYmFsIHZhcmlhYmxlcyBpbnRvIFNDUkVFTiBieQorICogdXNpbmcgZnVuY3Rpb25zIHRvIGFjY2VzcyB0aGVtLgorICovCisjZGVmaW5lIE5DVVJTRVNfUFVCTElDX1ZBUihuYW1lKSBfbmNfIyNuYW1lCisjZGVmaW5lIE5DVVJTRVNfV1JBUFBFRF9WQVIodHlwZSxuYW1lKSBleHRlcm4gdHlwZSBOQ1VSU0VTX1BVQkxJQ19WQVIobmFtZSkodm9pZCkKKworI2VuZGlmIC8qIE5DVVJTRVNfRExMX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvZXRoZXJuZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2V0aGVybmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhOGU4MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2V0aGVybmV0LmgKQEAgLTAsMCArMSw3NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBCYXNlZCBvbiB0aGUgRnJlZUJTRCB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gQ3VyaW91c2x5LCB0aGF0IGZpbGUKKyAgIGxhY2tzIGEgY29weXJpZ2h0IGluIHRoZSBoZWFkZXIuICovCisKKyNpZm5kZWYgX19ORVRfRVRIRVJORVRfSAorI2RlZmluZSBfX05FVF9FVEhFUk5FVF9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+ICAgICAvKiBJRUVFIDgwMi4zIEV0aGVybmV0IGNvbnN0YW50cyAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgaXMgYSBuYW1lIGZvciB0aGUgNDggYml0IGV0aGVybmV0IGFkZHJlc3MgYXZhaWxhYmxlIG9uIG1hbnkKKyAgIHN5c3RlbXMuICAqLworc3RydWN0IGV0aGVyX2FkZHIKK3sKKyAgdV9pbnQ4X3QgZXRoZXJfYWRkcl9vY3RldFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qIDEwTWIvcyBldGhlcm5ldCBoZWFkZXIgKi8KK3N0cnVjdCBldGhlcl9oZWFkZXIKK3sKKyAgdV9pbnQ4X3QgIGV0aGVyX2Rob3N0W0VUSF9BTEVOXTsJLyogZGVzdGluYXRpb24gZXRoIGFkZHIJKi8KKyAgdV9pbnQ4X3QgIGV0aGVyX3Nob3N0W0VUSF9BTEVOXTsJLyogc291cmNlIGV0aGVyIGFkZHIJKi8KKyAgdV9pbnQxNl90IGV0aGVyX3R5cGU7CQkgICAgICAgIC8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qIEV0aGVybmV0IHByb3RvY29sIElEJ3MgKi8KKyNkZWZpbmUJRVRIRVJUWVBFX1BVUAkJMHgwMjAwICAgICAgICAgIC8qIFhlcm94IFBVUCAqLworI2RlZmluZQlFVEhFUlRZUEVfSVAJCTB4MDgwMAkJLyogSVAgKi8KKyNkZWZpbmUJRVRIRVJUWVBFX0FSUAkJMHgwODA2CQkvKiBBZGRyZXNzIHJlc29sdXRpb24gKi8KKyNkZWZpbmUJRVRIRVJUWVBFX1JFVkFSUAkweDgwMzUJCS8qIFJldmVyc2UgQVJQICovCisKKyNkZWZpbmUJRVRIRVJfQUREUl9MRU4JRVRIX0FMRU4gICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgZXRoZXJuZXQgYWRkciAqLworI2RlZmluZQlFVEhFUl9UWVBFX0xFTgkyICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gdHlwZSBmaWVsZCAqLworI2RlZmluZQlFVEhFUl9DUkNfTEVOCTQgICAgICAgICAgICAgICAgICAgICAgICAvKiBieXRlcyBpbiBDUkMgZmllbGQgKi8KKyNkZWZpbmUJRVRIRVJfSERSX0xFTglFVEhfSExFTiAgICAgICAgICAgICAgICAgLyogdG90YWwgb2N0ZXRzIGluIGhlYWRlciAqLworI2RlZmluZQlFVEhFUl9NSU5fTEVOCShFVEhfWkxFTiArIEVUSEVSX0NSQ19MRU4pIC8qIG1pbiBwYWNrZXQgbGVuZ3RoICovCisjZGVmaW5lCUVUSEVSX01BWF9MRU4JKEVUSF9GUkFNRV9MRU4gKyBFVEhFUl9DUkNfTEVOKSAvKiBtYXggcGFja2V0IGxlbmd0aCAqLworCisvKiBtYWtlIHN1cmUgZXRoZW5ldCBsZW5ndGggaXMgdmFsaWQgKi8KKyNkZWZpbmUJRVRIRVJfSVNfVkFMSURfTEVOKGZvbykJXAorCSgoZm9vKSA+PSBFVEhFUl9NSU5fTEVOICYmIChmb28pIDw9IEVUSEVSX01BWF9MRU4pCisKKy8qCisgKiBUaGUgRVRIRVJUWVBFX05UUkFJTEVSIHBhY2tldCB0eXBlcyBzdGFydGluZyBhdCBFVEhFUlRZUEVfVFJBSUwgaGF2ZQorICogKHR5cGUtRVRIRVJUWVBFX1RSQUlMKSo1MTIgYnl0ZXMgb2YgZGF0YSBmb2xsb3dlZAorICogYnkgYW4gRVRIRVIgdHlwZSAoYXMgZ2l2ZW4gYWJvdmUpIGFuZCB0aGVuIHRoZSAodmFyaWFibGUtbGVuZ3RoKSBoZWFkZXIuCisgKi8KKyNkZWZpbmUJRVRIRVJUWVBFX1RSQUlMCQkweDEwMDAJCS8qIFRyYWlsZXIgcGFja2V0ICovCisjZGVmaW5lCUVUSEVSVFlQRV9OVFJBSUxFUgkxNgorCisjZGVmaW5lCUVUSEVSTVRVCUVUSF9EQVRBX0xFTgorI2RlZmluZQlFVEhFUk1JTgkoRVRIRVJfTUlOX0xFTiAtIEVUSEVSX0hEUl9MRU4gLSBFVEhFUl9DUkNfTEVOKQorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbmV0L2V0aGVybmV0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjNlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZi5oCkBAIC0wLDAgKzEsMjA1IEBACisvKiBuZXQvaWYuaCAtLSBkZWNsYXJhdGlvbnMgZm9yIGlucXVpcmluZyBhYm91dCBuZXR3b3JrIGludGVyZmFjZXMKKyAgIENvcHlyaWdodCAoQykgMTk5Nyw5OCw5OSwyMDAwLDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVF9JRl9ICisjZGVmaW5lIF9ORVRfSUZfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaWZkZWYgX19VU0VfTUlTQworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisKKworLyogTGVuZ3RoIG9mIGludGVyZmFjZSBuYW1lLiAgKi8KKyNkZWZpbmUgSUZfTkFNRVNJWkUJMTYKKworc3RydWN0IGlmX25hbWVpbmRleAorICB7CisgICAgdW5zaWduZWQgaW50IGlmX2luZGV4OwkvKiAxLCAyLCAuLi4gKi8KKyAgICBjaGFyICppZl9uYW1lOwkJLyogbnVsbCB0ZXJtaW5hdGVkIG5hbWU6ICJldGgwIiwgLi4uICovCisgIH07CisKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFN0YW5kYXJkIGludGVyZmFjZSBmbGFncy4gKi8KK2VudW0KKyAgeworICAgIElGRl9VUCA9IDB4MSwJCS8qIEludGVyZmFjZSBpcyB1cC4gICovCisjIGRlZmluZSBJRkZfVVAJSUZGX1VQCisgICAgSUZGX0JST0FEQ0FTVCA9IDB4MiwJLyogQnJvYWRjYXN0IGFkZHJlc3MgdmFsaWQuICAqLworIyBkZWZpbmUgSUZGX0JST0FEQ0FTVAlJRkZfQlJPQURDQVNUCisgICAgSUZGX0RFQlVHID0gMHg0LAkJLyogVHVybiBvbiBkZWJ1Z2dpbmcuICAqLworIyBkZWZpbmUgSUZGX0RFQlVHCUlGRl9ERUJVRworICAgIElGRl9MT09QQkFDSyA9IDB4OCwJCS8qIElzIGEgbG9vcGJhY2sgbmV0LiAgKi8KKyMgZGVmaW5lIElGRl9MT09QQkFDSwlJRkZfTE9PUEJBQ0sKKyAgICBJRkZfUE9JTlRPUE9JTlQgPSAweDEwLAkvKiBJbnRlcmZhY2UgaXMgcG9pbnQtdG8tcG9pbnQgbGluay4gICovCisjIGRlZmluZSBJRkZfUE9JTlRPUE9JTlQgSUZGX1BPSU5UT1BPSU5UCisgICAgSUZGX05PVFJBSUxFUlMgPSAweDIwLAkvKiBBdm9pZCB1c2Ugb2YgdHJhaWxlcnMuICAqLworIyBkZWZpbmUgSUZGX05PVFJBSUxFUlMJSUZGX05PVFJBSUxFUlMKKyAgICBJRkZfUlVOTklORyA9IDB4NDAsCQkvKiBSZXNvdXJjZXMgYWxsb2NhdGVkLiAgKi8KKyMgZGVmaW5lIElGRl9SVU5OSU5HCUlGRl9SVU5OSU5HCisgICAgSUZGX05PQVJQID0gMHg4MCwJCS8qIE5vIGFkZHJlc3MgcmVzb2x1dGlvbiBwcm90b2NvbC4gICovCisjIGRlZmluZSBJRkZfTk9BUlAJSUZGX05PQVJQCisgICAgSUZGX1BST01JU0MgPSAweDEwMCwJLyogUmVjZWl2ZSBhbGwgcGFja2V0cy4gICovCisjIGRlZmluZSBJRkZfUFJPTUlTQwlJRkZfUFJPTUlTQworCisgICAgLyogTm90IHN1cHBvcnRlZCAqLworICAgIElGRl9BTExNVUxUSSA9IDB4MjAwLAkvKiBSZWNlaXZlIGFsbCBtdWx0aWNhc3QgcGFja2V0cy4gICovCisjIGRlZmluZSBJRkZfQUxMTVVMVEkJSUZGX0FMTE1VTFRJCisKKyAgICBJRkZfTUFTVEVSID0gMHg0MDAsCQkvKiBNYXN0ZXIgb2YgYSBsb2FkIGJhbGFuY2VyLiAgKi8KKyMgZGVmaW5lIElGRl9NQVNURVIJSUZGX01BU1RFUgorICAgIElGRl9TTEFWRSA9IDB4ODAwLAkJLyogU2xhdmUgb2YgYSBsb2FkIGJhbGFuY2VyLiAgKi8KKyMgZGVmaW5lIElGRl9TTEFWRQlJRkZfU0xBVkUKKworICAgIElGRl9NVUxUSUNBU1QgPSAweDEwMDAsCS8qIFN1cHBvcnRzIG11bHRpY2FzdC4gICovCisjIGRlZmluZSBJRkZfTVVMVElDQVNUCUlGRl9NVUxUSUNBU1QKKworICAgIElGRl9QT1JUU0VMID0gMHgyMDAwLAkvKiBDYW4gc2V0IG1lZGlhIHR5cGUuICAqLworIyBkZWZpbmUgSUZGX1BPUlRTRUwJSUZGX1BPUlRTRUwKKyAgICBJRkZfQVVUT01FRElBID0gMHg0MDAwLAkvKiBBdXRvIG1lZGlhIHNlbGVjdCBhY3RpdmUuICAqLworIyBkZWZpbmUgSUZGX0FVVE9NRURJQQlJRkZfQVVUT01FRElBCisgICAgSUZGX0RZTkFNSUMgPSAweDgwMDAJLyogRGlhbHVwIGRldmljZSB3aXRoIGNoYW5naW5nIGFkZHJlc3Nlcy4gICovCisjIGRlZmluZSBJRkZfRFlOQU1JQwlJRkZfRFlOQU1JQworICB9OworCisvKiBUaGUgaWZhZGRyIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgYWRkcmVzcyBvZiBhbgorICAgaW50ZXJmYWNlLiAgVGhleSBhcmUgbWFpbnRhaW5lZCBieSB0aGUgZGlmZmVyZW50IGFkZHJlc3MgZmFtaWxpZXMsCisgICBhcmUgYWxsb2NhdGVkIGFuZCBhdHRhY2hlZCB3aGVuIGFuIGFkZHJlc3MgaXMgc2V0LCBhbmQgYXJlIGxpbmtlZAorICAgdG9nZXRoZXIgc28gYWxsIGFkZHJlc3NlcyBmb3IgYW4gaW50ZXJmYWNlIGNhbiBiZSBsb2NhdGVkLiAgKi8KKworc3RydWN0IGlmYWRkcgorICB7CisgICAgc3RydWN0IHNvY2thZGRyIGlmYV9hZGRyOwkvKiBBZGRyZXNzIG9mIGludGVyZmFjZS4gICovCisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJaWZ1X2Jyb2FkYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIJaWZ1X2RzdGFkZHI7CisgICAgICB9IGlmYV9pZnU7CisgICAgc3RydWN0IGlmYWNlICppZmFfaWZwOwkvKiBCYWNrLXBvaW50ZXIgdG8gaW50ZXJmYWNlLiAgKi8KKyAgICBzdHJ1Y3QgaWZhZGRyICppZmFfbmV4dDsJLyogTmV4dCBhZGRyZXNzIGZvciBpbnRlcmZhY2UuICAqLworICB9OworCisjIGRlZmluZSBpZmFfYnJvYWRhZGRyCWlmYV9pZnUuaWZ1X2Jyb2FkYWRkcgkvKiBicm9hZGNhc3QgYWRkcmVzcwkqLworIyBkZWZpbmUgaWZhX2RzdGFkZHIJaWZhX2lmdS5pZnVfZHN0YWRkcgkvKiBvdGhlciBlbmQgb2YgbGluawkqLworCisvKiBEZXZpY2UgbWFwcGluZyBzdHJ1Y3R1cmUuIEknZCBqdXN0IGdvbmUgb2ZmIGFuZCBkZXNpZ25lZCBhCisgICBiZWF1dGlmdWwgc2NoZW1lIHVzaW5nIG9ubHkgbG9hZGFibGUgbW9kdWxlcyB3aXRoIGFyZ3VtZW50cyBmb3IKKyAgIGRyaXZlciBvcHRpb25zIGFuZCBhbG9uZyBjb21lIHRoZSBQQ01DSUEgcGVvcGxlIDgpCisKKyAgIEFoIHdlbGwuIFRoZSBnZXQoKSBzaWRlIG9mIHRoaXMgaXMgZ29vZCBmb3IgV0RTRVRVUCwgYW5kIGl0J2xsIGJlCisgICBoYW5keSBmb3IgZGVidWdnaW5nIHRoaW5ncy4gVGhlIHNldCBzaWRlIGlzIGZpbmUgZm9yIG5vdyBhbmQgYmVpbmcKKyAgIHZlcnkgc21hbGwgbWlnaHQgYmUgd29ydGgga2VlcGluZyBmb3IgY2xlYW4gY29uZmlndXJhdGlvbi4gICovCisKK3N0cnVjdCBpZm1hcAorICB7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgbWVtX3N0YXJ0OworICAgIHVuc2lnbmVkIGxvbmcgaW50IG1lbV9lbmQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IGJhc2VfYWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIGlycTsKKyAgICB1bnNpZ25lZCBjaGFyIGRtYTsKKyAgICB1bnNpZ25lZCBjaGFyIHBvcnQ7CisgICAgLyogMyBieXRlcyBzcGFyZSAqLworICB9OworCisvKiBJbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3R1cmUgdXNlZCBmb3Igc29ja2V0IGlvY3RsJ3MuICBBbGwgaW50ZXJmYWNlCisgICBpb2N0bCdzIG11c3QgaGF2ZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgd2hpY2ggYmVnaW4gd2l0aCBpZnJfbmFtZS4KKyAgIFRoZSByZW1haW5kZXIgbWF5IGJlIGludGVyZmFjZSBzcGVjaWZpYy4gICovCisKK3N0cnVjdCBpZnJlcQorICB7CisjIGRlZmluZSBJRkhXQUREUkxFTgk2CisjIGRlZmluZSBJRk5BTVNJWglJRl9OQU1FU0laRQorICAgIHVuaW9uCisgICAgICB7CisJY2hhciBpZnJuX25hbWVbSUZOQU1TSVpdOwkvKiBJbnRlcmZhY2UgbmFtZSwgZS5nLiAiZW4wIi4gICovCisgICAgICB9IGlmcl9pZnJuOworCisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3Qgc29ja2FkZHIgaWZydV9hZGRyOworCXN0cnVjdCBzb2NrYWRkciBpZnJ1X2RzdGFkZHI7CisJc3RydWN0IHNvY2thZGRyIGlmcnVfYnJvYWRhZGRyOworCXN0cnVjdCBzb2NrYWRkciBpZnJ1X25ldG1hc2s7CisJc3RydWN0IHNvY2thZGRyIGlmcnVfaHdhZGRyOworCXNob3J0IGludCBpZnJ1X2ZsYWdzOworCWludCBpZnJ1X2l2YWx1ZTsKKwlpbnQgaWZydV9tdHU7CisJc3RydWN0IGlmbWFwIGlmcnVfbWFwOworCWNoYXIgaWZydV9zbGF2ZVtJRk5BTVNJWl07CS8qIEp1c3QgZml0cyB0aGUgc2l6ZSAqLworCWNoYXIgaWZydV9uZXduYW1lW0lGTkFNU0laXTsKKwlfX2NhZGRyX3QgaWZydV9kYXRhOworICAgICAgfSBpZnJfaWZydTsKKyAgfTsKKyMgZGVmaW5lIGlmcl9uYW1lCWlmcl9pZnJuLmlmcm5fbmFtZQkvKiBpbnRlcmZhY2UgbmFtZSAJKi8KKyMgZGVmaW5lIGlmcl9od2FkZHIJaWZyX2lmcnUuaWZydV9od2FkZHIJLyogTUFDIGFkZHJlc3MgCQkqLworIyBkZWZpbmUgaWZyX2FkZHIJaWZyX2lmcnUuaWZydV9hZGRyCS8qIGFkZHJlc3MJCSovCisjIGRlZmluZSBpZnJfZHN0YWRkcglpZnJfaWZydS5pZnJ1X2RzdGFkZHIJLyogb3RoZXIgZW5kIG9mIHAtcCBsbmsJKi8KKyMgZGVmaW5lIGlmcl9icm9hZGFkZHIJaWZyX2lmcnUuaWZydV9icm9hZGFkZHIJLyogYnJvYWRjYXN0IGFkZHJlc3MJKi8KKyMgZGVmaW5lIGlmcl9uZXRtYXNrCWlmcl9pZnJ1LmlmcnVfbmV0bWFzawkvKiBpbnRlcmZhY2UgbmV0IG1hc2sJKi8KKyMgZGVmaW5lIGlmcl9mbGFncwlpZnJfaWZydS5pZnJ1X2ZsYWdzCS8qIGZsYWdzCQkqLworIyBkZWZpbmUgaWZyX21ldHJpYwlpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBtZXRyaWMJCSovCisjIGRlZmluZSBpZnJfbXR1CWlmcl9pZnJ1LmlmcnVfbXR1CS8qIG10dQkJCSovCisjIGRlZmluZSBpZnJfbWFwCWlmcl9pZnJ1LmlmcnVfbWFwCS8qIGRldmljZSBtYXAJCSovCisjIGRlZmluZSBpZnJfc2xhdmUJaWZyX2lmcnUuaWZydV9zbGF2ZQkvKiBzbGF2ZSBkZXZpY2UJCSovCisjIGRlZmluZSBpZnJfZGF0YQlpZnJfaWZydS5pZnJ1X2RhdGEJLyogZm9yIHVzZSBieSBpbnRlcmZhY2UJKi8KKyMgZGVmaW5lIGlmcl9pZmluZGV4CWlmcl9pZnJ1LmlmcnVfaXZhbHVlICAgIC8qIGludGVyZmFjZSBpbmRleCAgICAgICovCisjIGRlZmluZSBpZnJfYmFuZHdpZHRoCWlmcl9pZnJ1LmlmcnVfaXZhbHVlCS8qIGxpbmsgYmFuZHdpZHRoCSovCisjIGRlZmluZSBpZnJfcWxlbglpZnJfaWZydS5pZnJ1X2l2YWx1ZQkvKiBxdWV1ZSBsZW5ndGgJCSovCisjIGRlZmluZSBpZnJfbmV3bmFtZQlpZnJfaWZydS5pZnJ1X25ld25hbWUJLyogTmV3IG5hbWUJCSovCisjIGRlZmluZSBfSU9UX2lmcmVxCV9JT1QoX0lPVFMoY2hhciksSUZOQU1TSVosX0lPVFMoY2hhciksMTYsMCwwKQorIyBkZWZpbmUgX0lPVF9pZnJlcV9zaG9ydCBfSU9UKF9JT1RTKGNoYXIpLElGTkFNU0laLF9JT1RTKHNob3J0KSwxLDAsMCkKKyMgZGVmaW5lIF9JT1RfaWZyZXFfaW50CV9JT1QoX0lPVFMoY2hhciksSUZOQU1TSVosX0lPVFMoaW50KSwxLDAsMCkKKworCisvKiBTdHJ1Y3R1cmUgdXNlZCBpbiBTSU9DR0lGQ09ORiByZXF1ZXN0LiAgVXNlZCB0byByZXRyaWV2ZSBpbnRlcmZhY2UKKyAgIGNvbmZpZ3VyYXRpb24gZm9yIG1hY2hpbmUgKHVzZWZ1bCBmb3IgcHJvZ3JhbXMgd2hpY2ggbXVzdCBrbm93IGFsbAorICAgbmV0d29ya3MgYWNjZXNzaWJsZSkuICAqLworCitzdHJ1Y3QgaWZjb25mCisgIHsKKyAgICBpbnQJaWZjX2xlbjsJCQkvKiBTaXplIG9mIGJ1ZmZlci4gICovCisgICAgdW5pb24KKyAgICAgIHsKKwlfX2NhZGRyX3QgaWZjdV9idWY7CisJc3RydWN0IGlmcmVxICppZmN1X3JlcTsKKyAgICAgIH0gaWZjX2lmY3U7CisgIH07CisjIGRlZmluZSBpZmNfYnVmCWlmY19pZmN1LmlmY3VfYnVmCS8qIEJ1ZmZlciBhZGRyZXNzLiAgKi8KKyMgZGVmaW5lIGlmY19yZXEJaWZjX2lmY3UuaWZjdV9yZXEJLyogQXJyYXkgb2Ygc3RydWN0dXJlcy4gICovCisjIGRlZmluZSBfSU9UX2lmY29uZiBfSU9UKF9JT1RTKHN0cnVjdCBpZmNvbmYpLDEsMCwwLDAsMCkgLyogbm90IHJpZ2h0ICovCisjZW5kaWYJLyogTWlzYy4gICovCisKK19fQkVHSU5fREVDTFMKKworLyogQ29udmVydCBhbiBpbnRlcmZhY2UgbmFtZSB0byBhbiBpbmRleCwgYW5kIHZpY2UgdmVyc2EuICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBpZl9uYW1ldG9pbmRleCAoX19jb25zdCBjaGFyICpfX2lmbmFtZSkgX19USFJPVzsKK2V4dGVybiBjaGFyICppZl9pbmRleHRvbmFtZSAodW5zaWduZWQgaW50IF9faWZpbmRleCwgY2hhciAqX19pZm5hbWUpIF9fVEhST1c7CisKKy8qIFJldHVybiBhIGxpc3Qgb2YgYWxsIGludGVyZmFjZXMgYW5kIHRoZWlyIGluZGljZXMuICAqLworZXh0ZXJuIHN0cnVjdCBpZl9uYW1laW5kZXggKmlmX25hbWVpbmRleCAodm9pZCkgX19USFJPVzsKKworLyogRnJlZSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIGlmX25hbWVpbmRleC4gICovCitleHRlcm4gdm9pZCBpZl9mcmVlbmFtZWluZGV4IChzdHJ1Y3QgaWZfbmFtZWluZGV4ICpfX3B0cikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5ldC9pZi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX2FycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDg2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaApAQCAtMCwwICsxLDE4MiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbC4KKyAgIENvcHlyaWdodCAoQykgMTk5NywxOTk5LDIwMDEsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTcuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBCYXNlZCBvbiB0aGUgNC40QlNEIGFuZCBMaW51eCB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gICovCisKKyNpZm5kZWYgX05FVF9JRl9BUlBfSAorCisjZGVmaW5lIF9ORVRfSUZfQVJQX0ggMQorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNvbWUgaW50ZXJuYWxzIGZyb20gZGVlcCBkb3duIGluIHRoZSBrZXJuZWwuICAqLworI2RlZmluZSBNQVhfQUREUl9MRU4JNworCisKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZXRoZXJuZXQgYXJwIGhlYWRlci4gICovCisKKy8qIEFSUCBwcm90b2NvbCBvcGNvZGVzLiAqLworI2RlZmluZQlBUlBPUF9SRVFVRVNUCTEJCS8qIEFSUCByZXF1ZXN0LiAgKi8KKyNkZWZpbmUJQVJQT1BfUkVQTFkJMgkJLyogQVJQIHJlcGx5LiAgKi8KKyNkZWZpbmUJQVJQT1BfUlJFUVVFU1QJMwkJLyogUkFSUCByZXF1ZXN0LiAgKi8KKyNkZWZpbmUJQVJQT1BfUlJFUExZCTQJCS8qIFJBUlAgcmVwbHkuICAqLworI2RlZmluZQlBUlBPUF9JblJFUVVFU1QJOAkJLyogSW5BUlAgcmVxdWVzdC4gICovCisjZGVmaW5lCUFSUE9QX0luUkVQTFkJOQkJLyogSW5BUlAgcmVwbHkuICAqLworI2RlZmluZQlBUlBPUF9OQUsJMTAJCS8qIChBVE0pQVJQIE5BSy4gICovCisKKy8qIFNlZSBSRkMgODI2IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4gIEFSUCBwYWNrZXRzIGFyZSB2YXJpYWJsZQorICAgaW4gc2l6ZTsgdGhlIGFycGhkciBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24uCisgICBQcm90b2NvbCB0eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgZm9yIDEwIE1iL3MgRXRoZXJuZXQuCisgICBJdCBpcyBmb2xsb3dlZCBieSB0aGUgdmFyaWFibGUtc2l6ZWQgZmllbGRzIGFyX3NoYSwgYXJwX3NwYSwKKyAgIGFycF90aGEgYW5kIGFycF90cGEgaW4gdGhhdCBvcmRlciwgYWNjb3JkaW5nIHRvIHRoZSBsZW5ndGhzCisgICBzcGVjaWZpZWQuICBGaWVsZCBuYW1lcyB1c2VkIGNvcnJlc3BvbmQgdG8gUkZDIDgyNi4gICovCisKK3N0cnVjdCBhcnBoZHIKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBhcl9ocmQ7CQkvKiBGb3JtYXQgb2YgaGFyZHdhcmUgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IGFyX3BybzsJCS8qIEZvcm1hdCBvZiBwcm90b2NvbCBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFyX2hsbjsJCS8qIExlbmd0aCBvZiBoYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGFyX3BsbjsJCS8qIExlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgYXJfb3A7CQkvKiBBUlAgb3Bjb2RlIChjb21tYW5kKS4gICovCisjaWYgMAorICAgIC8qIEV0aGVybmV0IGxvb2tzIGxpa2UgdGhpcyA6IFRoaXMgYml0IGlzIHZhcmlhYmxlIHNpemVkCisgICAgICAgaG93ZXZlci4uLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fYXJfc2hhW0VUSF9BTEVOXTsJLyogU2VuZGVyIGhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX19hcl9zaXBbNF07CQkvKiBTZW5kZXIgSVAgYWRkcmVzcy4gICovCisgICAgdW5zaWduZWQgY2hhciBfX2FyX3RoYVtFVEhfQUxFTl07CS8qIFRhcmdldCBoYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIF9fYXJfdGlwWzRdOwkJLyogVGFyZ2V0IElQIGFkZHJlc3MuICAqLworI2VuZGlmCisgIH07CisKKworLyogQVJQIHByb3RvY29sIEhBUkRXQVJFIGlkZW50aWZpZXJzLiAqLworI2RlZmluZSBBUlBIUkRfTkVUUk9NCTAJCS8qIEZyb20gS0E5UTogTkVUL1JPTSBwc2V1ZG8uICovCisjZGVmaW5lIEFSUEhSRF9FVEhFUiAJMQkJLyogRXRoZXJuZXQgMTAvMTAwTWJwcy4gICovCisjZGVmaW5lCUFSUEhSRF9FRVRIRVIJMgkJLyogRXhwZXJpbWVudGFsIEV0aGVybmV0LiAgKi8KKyNkZWZpbmUJQVJQSFJEX0FYMjUJMwkJLyogQVguMjUgTGV2ZWwgMi4gICovCisjZGVmaW5lCUFSUEhSRF9QUk9ORVQJNAkJLyogUFJPbmV0IHRva2VuIHJpbmcuICAqLworI2RlZmluZQlBUlBIUkRfQ0hBT1MJNQkJLyogQ2hhb3NuZXQuICAqLworI2RlZmluZQlBUlBIUkRfSUVFRTgwMgk2CQkvKiBJRUVFIDgwMi4yIEV0aGVybmV0L1RSL1RCLiAgKi8KKyNkZWZpbmUJQVJQSFJEX0FSQ05FVAk3CQkvKiBBUkNuZXQuICAqLworI2RlZmluZQlBUlBIUkRfQVBQTEVUTEsJOAkJLyogQVBQTEV0YWxrLiAgKi8KKyNkZWZpbmUJQVJQSFJEX0RMQ0kJMTUJCS8qIEZyYW1lIFJlbGF5IERMQ0kuICAqLworI2RlZmluZQlBUlBIUkRfQVRNCTE5CQkvKiBBVE0uICAqLworI2RlZmluZQlBUlBIUkRfTUVUUklDT00JMjMJCS8qIE1ldHJpY29tIFNUUklQIChuZXcgSUFOQSBpZCkuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTEzOTQJMjQJCS8qIElFRUUgMTM5NCBJUHY0IC0gUkZDIDI3MzQuICAqLworI2RlZmluZSBBUlBIUkRfRVVJNjQJCTI3CQkvKiBFVUktNjQuICAqLworI2RlZmluZSBBUlBIUkRfSU5GSU5JQkFORAkzMgkJLyogSW5maW5pQmFuZC4gICovCisKKy8qIER1bW15IHR5cGVzIGZvciBub24gQVJQIGhhcmR3YXJlICovCisjZGVmaW5lIEFSUEhSRF9TTElQCTI1NgorI2RlZmluZSBBUlBIUkRfQ1NMSVAJMjU3CisjZGVmaW5lIEFSUEhSRF9TTElQNgkyNTgKKyNkZWZpbmUgQVJQSFJEX0NTTElQNgkyNTkKKyNkZWZpbmUgQVJQSFJEX1JTUlZECTI2MAkJLyogTm90aW9uYWwgS0lTUyB0eXBlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0FEQVBUCTI2NAorI2RlZmluZSBBUlBIUkRfUk9TRQkyNzAKKyNkZWZpbmUgQVJQSFJEX1gyNQkyNzEJCS8qIENDSVRUIFguMjUuICAqLworI2RlZmluZSBBUlBIUkRfSFdYMjUJMjcyCQkvKiBCb2FyZHMgd2l0aCBYLjI1IGluIGZpcm13YXJlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1BQUAk1MTIKKyNkZWZpbmUgQVJQSFJEX0NJU0NPCTUxMwkJLyogQ2lzY28gSERMQy4gICovCisjZGVmaW5lIEFSUEhSRF9IRExDCUFSUEhSRF9DSVNDTworI2RlZmluZSBBUlBIUkRfTEFQQgk1MTYJCS8qIExBUEIuICAqLworI2RlZmluZSBBUlBIUkRfRERDTVAJNTE3CQkvKiBEaWdpdGFsJ3MgRERDTVAuICAqLworI2RlZmluZQlBUlBIUkRfUkFXSERMQwk1MTgJCS8qIFJhdyBIRExDLiAgKi8KKworI2RlZmluZSBBUlBIUkRfVFVOTkVMCTc2OAkJLyogSVBJUCB0dW5uZWwuICAqLworI2RlZmluZSBBUlBIUkRfVFVOTkVMNgk3NjkJCS8qIElQSVA2IHR1bm5lbC4gICovCisjZGVmaW5lIEFSUEhSRF9GUkFECTc3MCAgICAgICAgICAgICAvKiBGcmFtZSBSZWxheSBBY2Nlc3MgRGV2aWNlLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1NLSVAJNzcxCQkvKiBTS0lQIHZpZi4gICovCisjZGVmaW5lIEFSUEhSRF9MT09QQkFDSwk3NzIJCS8qIExvb3BiYWNrIGRldmljZS4gICovCisjZGVmaW5lIEFSUEhSRF9MT0NBTFRMSyA3NzMJCS8qIExvY2FsdGFsayBkZXZpY2UuICAqLworI2RlZmluZSBBUlBIUkRfRkRESQk3NzQJCS8qIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlLiAqLworI2RlZmluZSBBUlBIUkRfQklGCTc3NSAgICAgICAgICAgICAvKiBBUDEwMDAgQklGLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1NJVAk3NzYJCS8qIHNpdDAgZGV2aWNlIC0gSVB2Ni1pbi1JUHY0LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lQRERQCTc3NwkJLyogSVAtaW4tRERQIHR1bm5lbC4gICovCisjZGVmaW5lIEFSUEhSRF9JUEdSRQk3NzgJCS8qIEdSRSBvdmVyIElQLiAgKi8KKyNkZWZpbmUgQVJQSFJEX1BJTVJFRwk3NzkJCS8qIFBJTVNNIHJlZ2lzdGVyIGludGVyZmFjZS4gICovCisjZGVmaW5lIEFSUEhSRF9ISVBQSQk3ODAJCS8qIEhpZ2ggUGVyZm9ybWFuY2UgUGFyYWxsZWwgSSdmYWNlLiAqLworI2RlZmluZSBBUlBIUkRfQVNICTc4MQkJLyogKE5leHVzIEVsZWN0cm9uaWNzKSBBc2guICAqLworI2RlZmluZSBBUlBIUkRfRUNPTkVUCTc4MgkJLyogQWNvcm4gRWNvbmV0LiAgKi8KKyNkZWZpbmUgQVJQSFJEX0lSREEJNzgzCQkvKiBMaW51eC1JckRBLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUFAJNzg0CQkvKiBQb2ludCB0byBwb2ludCBmaWJyZWNoYW5lbC4gICovCisjZGVmaW5lIEFSUEhSRF9GQ0FMCTc4NQkJLyogRmlicmVjaGFuZWwgYXJiaXRyYXRlZCBsb29wLiAgKi8KKyNkZWZpbmUgQVJQSFJEX0ZDUEwJNzg2CQkvKiBGaWJyZWNoYW5lbCBwdWJsaWMgbG9vcC4gICovCisjZGVmaW5lIEFSUEhSRF9GQ0ZBQlJJQyA3ODcJCS8qIEZpYnJlY2hhbmVsIGZhYnJpYy4gICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyX1RSIDgwMAkJLyogTWFnaWMgdHlwZSBpZGVudCBmb3IgVFIuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExIDgwMQkJLyogSUVFRSA4MDIuMTEuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNIDgwMgkvKiBJRUVFIDgwMi4xMSArIFByaXNtMiBoZWFkZXIuICAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQIDgwMwkvKiBJRUVFIDgwMi4xMSArIHJhZGlvdGFwIGhlYWRlci4gICovCisKKyNkZWZpbmUgQVJQSFJEX1ZPSUQJICAweEZGRkYJLyogVm9pZCB0eXBlLCBub3RoaW5nIGlzIGtub3duLiAgKi8KKyNkZWZpbmUgQVJQSFJEX05PTkUJICAweEZGRkUJLyogWmVybyBoZWFkZXIgbGVuZ3RoLiAgKi8KKworCisvKiBBUlAgaW9jdGwgcmVxdWVzdC4gICovCitzdHJ1Y3QgYXJwcmVxCisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYXJwX3BhOwkJLyogUHJvdG9jb2wgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyIGFycF9oYTsJCS8qIEhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIGludCBhcnBfZmxhZ3M7CQkJLyogRmxhZ3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciBhcnBfbmV0bWFzazsJLyogTmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykuICAqLworICAgIGNoYXIgYXJwX2RldlsxNl07CisgIH07CisKK3N0cnVjdCBhcnByZXFfb2xkCisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYXJwX3BhOwkJLyogUHJvdG9jb2wgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyIGFycF9oYTsJCS8qIEhhcmR3YXJlIGFkZHJlc3MuICAqLworICAgIGludCBhcnBfZmxhZ3M7CQkJLyogRmxhZ3MuICAqLworICAgIHN0cnVjdCBzb2NrYWRkciBhcnBfbmV0bWFzazsJLyogTmV0bWFzayAob25seSBmb3IgcHJveHkgYXJwcykuICAqLworICB9OworCisvKiBBUlAgRmxhZyB2YWx1ZXMuICAqLworI2RlZmluZSBBVEZfQ09NCQkweDAyCQkvKiBDb21wbGV0ZWQgZW50cnkgKGhhIHZhbGlkKS4gICovCisjZGVmaW5lCUFURl9QRVJNCTB4MDQJCS8qIFBlcm1hbmVudCBlbnRyeS4gICovCisjZGVmaW5lCUFURl9QVUJMCTB4MDgJCS8qIFB1Ymxpc2ggZW50cnkuICAqLworI2RlZmluZQlBVEZfVVNFVFJBSUxFUlMJMHgxMAkJLyogSGFzIHJlcXVlc3RlZCB0cmFpbGVycy4gICovCisjZGVmaW5lIEFURl9ORVRNQVNLICAgICAweDIwICAgICAgICAgICAgLyogV2FudCB0byB1c2UgYSBuZXRtYXNrIChvbmx5CisJCQkJCSAgIGZvciBwcm94eSBlbnRyaWVzKS4gICovCisjZGVmaW5lIEFURl9ET05UUFVCCTB4NDAJCS8qIERvbid0IGFuc3dlciB0aGlzIGFkZHJlc3Nlcy4gICovCisjZGVmaW5lIEFURl9NQUdJQwkweDgwCQkvKiBBdXRvbWF0aWNhbGx5IGFkZGVkIGVudHJ5LiAgKi8KKworCisvKiBTdXBwb3J0IGZvciB0aGUgdXNlciBzcGFjZSBhcnAgZGFlbW9uLCBhcnBkLiAgKi8KKyNkZWZpbmUgQVJQRF9VUERBVEUJMHgwMQorI2RlZmluZSBBUlBEX0xPT0tVUAkweDAyCisjZGVmaW5lIEFSUERfRkxVU0gJMHgwMworCitzdHJ1Y3QgYXJwZF9yZXF1ZXN0CisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcmVxOwkJLyogUmVxdWVzdCB0eXBlLiAgKi8KKyAgICB1X2ludDMyX3QgaXA7CQkJLyogSVAgYWRkcmVzcyBvZiBlbnRyeS4gICovCisgICAgdW5zaWduZWQgbG9uZyBpbnQgZGV2OwkJLyogRGV2aWNlIGVudHJ5IGlzIHRpZWQgdG8uICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHN0YW1wOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHVwZGF0ZWQ7CisgICAgdW5zaWduZWQgY2hhciBoYVtNQVhfQUREUl9MRU5dOwkvKiBIYXJkd2FyZSBhZGRyZXNzLiAgKi8KKyAgfTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIG5ldC9pZl9hcnAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcGFja2V0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9pZl9wYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTE4NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcGFja2V0LmgKQEAgLTAsMCArMSwzNyBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIExpbnV4IFNPQ0tfUEFDS0VUIHNvY2tldHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19JRl9QQUNLRVRfSAorI2RlZmluZSBfX0lGX1BBQ0tFVF9ICisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworLyogVGhpcyBpcyB0aGUgU09DS19QQUNLRVQgYWRkcmVzcyBzdHJ1Y3R1cmUgYXMgdXNlZCBpbiBMaW51eCAyLjAuCisgICBGcm9tIExpbnV4IDIuMSB0aGUgQUZfUEFDS0VUIGludGVyZmFjZSBpcyBwcmVmZXJyZWQgYW5kIHlvdSBzaG91bGQKKyAgIGNvbnNpZGVyIHVzaW5nIGl0IGluIHBsYWNlIG9mIHRoaXMgb25lLiAgKi8KKworc3RydWN0IHNvY2thZGRyX3BrdAorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNwa3RfKTsKKyAgICB1bnNpZ25lZCBjaGFyIHNwa3RfZGV2aWNlWzE0XTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzcGt0X3Byb3RvY29sOworICB9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BwcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfcHBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZWM4MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3BwcC5oCkBAIC0wLDAgKzEsMTY5IEBACisvKglGcm9tOiBpZl9wcHAuaCx2IDEuMyAxOTk1LzA2LzEyIDExOjM2OjUwIHBhdWx1cyBFeHAgKi8KKworLyoKKyAqIGlmX3BwcC5oIC0gUG9pbnQtdG8tUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQ0FSTkVHSUUgTUVMTE9OIFVOSVZFUlNJVFkgQU5ECisgKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgVU5JVkVSU0lUWSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKgorICogID09RklMRVZFUlNJT04gOTYwOTI2PT0KKyAqCisgKiAgTk9URSBUTyBNQUlOVEFJTkVSUzoKKyAqICAgICBJZiB5b3UgbW9kaWZ5IHRoaXMgZmlsZSBhdCBhbGwsIHBsZWFzZSBzZXQgdGhlIGFib3ZlIGRhdGUuCisgKiAgICAgaWZfcHBwLmggaXMgc2hpcHBlZCB3aXRoIGEgUFBQIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHdpdGggdGhlIGtlcm5lbDsKKyAqICAgICBpZiBldmVyeW9uZSBpbmNyZWFzZXMgdGhlIEZJTEVWRVJTSU9OIG51bWJlciBhYm92ZSwgdGhlbiBzY3JpcHRzCisgKiAgICAgY2FuIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5zdGFsbCBhIG5ldyBpZl9wcHAuaAorICogICAgIGZpbGUuICBEb24ndCBjaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGF0IGxpbmUgb3RoZXJ3aXNlLCBzbyB0aGUKKyAqICAgICBpbnN0YWxsYXRpb24gc2NyaXB0IGNhbiByZWNvZ25pemUgaXQuCisgKi8KKworCisjaWZuZGVmIF9fTkVUX0lGX1BQUF9ICisjZGVmaW5lIF9fTkVUX0lGX1BQUF9IIDEKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bmV0L3BwcF9kZWZzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFBhY2tldCBzaXplcworICovCisKKyNkZWZpbmUJUFBQX01UVQkJMTUwMAkvKiBEZWZhdWx0IE1UVSAoc2l6ZSBvZiBJbmZvIGZpZWxkKSAqLworI2RlZmluZSBQUFBfTUFYTVJVCTY1MDAwCS8qIExhcmdlc3QgTVJVIHdlIGFsbG93ICovCisjZGVmaW5lIFBQUF9WRVJTSU9OCSIyLjIuMCIKKyNkZWZpbmUgUFBQX01BR0lDCTB4NTAwMgkvKiBNYWdpYyB2YWx1ZSBmb3IgdGhlIHBwcCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUFJPVE9fSVBYCTB4MDAyYgkvKiBwcm90b2NvbCBudW1iZXJzICovCisjZGVmaW5lIFBST1RPX0ROQV9SVCAgICAweDAwMjcgIC8qIEROQSBSb3V0aW5nICovCisKKworLyoKKyAqIEJpdCBkZWZpbml0aW9ucyBmb3IgZmxhZ3MuCisgKi8KKworI2RlZmluZSBTQ19DT01QX1BST1QJMHgwMDAwMDAwMQkvKiBwcm90b2NvbCBjb21wcmVzc2lvbiAob3V0cHV0KSAqLworI2RlZmluZSBTQ19DT01QX0FDCTB4MDAwMDAwMDIJLyogaGVhZGVyIGNvbXByZXNzaW9uIChvdXRwdXQpICovCisjZGVmaW5lCVNDX0NPTVBfVENQCTB4MDAwMDAwMDQJLyogVENQIChWSikgY29tcHJlc3Npb24gKG91dHB1dCkgKi8KKyNkZWZpbmUgU0NfTk9fVENQX0NDSUQJMHgwMDAwMDAwOAkvKiBkaXNhYmxlIFZKIGNvbm5lY3Rpb24taWQgY29tcC4gKi8KKyNkZWZpbmUgU0NfUkVKX0NPTVBfQUMJMHgwMDAwMDAxMAkvKiByZWplY3QgYWRycy9jdHJsIGNvbXAuIG9uIGlucHV0ICovCisjZGVmaW5lIFNDX1JFSl9DT01QX1RDUAkweDAwMDAwMDIwCS8qIHJlamVjdCBUQ1AgKFZKKSBjb21wLiBvbiBpbnB1dCAqLworI2RlZmluZSBTQ19DQ1BfT1BFTgkweDAwMDAwMDQwCS8qIExvb2sgYXQgQ0NQIHBhY2tldHMgKi8KKyNkZWZpbmUgU0NfQ0NQX1VQCTB4MDAwMDAwODAJLyogTWF5IHNlbmQvcmVjdiBjb21wcmVzc2VkIHBhY2tldHMgKi8KKyNkZWZpbmUgU0NfRU5BQkxFX0lQCTB4MDAwMDAxMDAJLyogSVAgcGFja2V0cyBtYXkgYmUgZXhjaGFuZ2VkICovCisjZGVmaW5lIFNDX0NPTVBfUlVOCTB4MDAwMDEwMDAJLyogY29tcHJlc3NvciBoYXMgYmVlbiBpbml0ZWQgKi8KKyNkZWZpbmUgU0NfREVDT01QX1JVTgkweDAwMDAyMDAwCS8qIGRlY29tcHJlc3NvciBoYXMgYmVlbiBpbml0ZWQgKi8KKyNkZWZpbmUgU0NfREVCVUcJMHgwMDAxMDAwMAkvKiBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgU0NfTE9HX0lOUEtUCTB4MDAwMjAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIGdvb2QgcGt0cyByZWN2ZCAqLworI2RlZmluZSBTQ19MT0dfT1VUUEtUCTB4MDAwNDAwMDAJLyogbG9nIGNvbnRlbnRzIG9mIHBrdHMgc2VudCAqLworI2RlZmluZSBTQ19MT0dfUkFXSU4JMHgwMDA4MDAwMAkvKiBsb2cgYWxsIGNoYXJzIHJlY2VpdmVkICovCisjZGVmaW5lIFNDX0xPR19GTFVTSAkweDAwMTAwMDAwCS8qIGxvZyBhbGwgY2hhcnMgZmx1c2hlZCAqLworI2RlZmluZQlTQ19NQVNLCQkweDBmRTBmZmZmCS8qIGJpdHMgdGhhdCB1c2VyIGNhbiBjaGFuZ2UgKi8KKworLyogc3RhdGUgYml0cyAqLworI2RlZmluZQlTQ19FU0NBUEVECTB4ODAwMDAwMDAJLyogc2F3IGEgUFBQX0VTQ0FQRSAqLworI2RlZmluZQlTQ19GTFVTSAkweDQwMDAwMDAwCS8qIGZsdXNoIGlucHV0IHVudGlsIG5leHQgUFBQX0ZMQUcgKi8KKyNkZWZpbmUgU0NfVkpfUkVTRVQJMHgyMDAwMDAwMAkvKiBOZWVkIHRvIHJlc2V0IHRoZSBWSiBkZWNvbXByZXNzb3IgKi8KKyNkZWZpbmUgU0NfWE1JVF9CVVNZCTB4MTAwMDAwMDAJLyogcHBwX3dyaXRlX3dha2V1cCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgU0NfUkNWX09ERFAJMHgwODAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIG9kZCBwYXJpdHkgKi8KKyNkZWZpbmUgU0NfUkNWX0VWTlAJMHgwNDAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lIFNDX1JDVl9CN18xCTB4MDIwMDAwMDAJLyogaGF2ZSByY3ZkIGNoYXIgd2l0aCBiaXQgNyA9IDEgKi8KKyNkZWZpbmUgU0NfUkNWX0I3XzAJMHgwMTAwMDAwMAkvKiBoYXZlIHJjdmQgY2hhciB3aXRoIGJpdCA3ID0gMCAqLworI2RlZmluZSBTQ19EQ19GRVJST1IJMHgwMDgwMDAwMAkvKiBmYXRhbCBkZWNvbXAgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgU0NfRENfRVJST1IJMHgwMDQwMDAwMAkvKiBub24tZmF0YWwgZGVjb21wIGVycm9yIGRldGVjdGVkICovCisKKy8qCisgKiBJb2N0bCBkZWZpbml0aW9ucy4KKyAqLworCitzdHJ1Y3QgbnBpb2N0bCB7CisgICAgaW50CQlwcm90b2NvbDsJLyogUFBQIHByb3RvY29sLCBlLmcuIFBQUF9JUCAqLworICAgIGVudW0gTlBtb2RlCW1vZGU7Cit9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIENDUCBjb25maWd1cmF0aW9uIG9wdGlvbiwgZm9yIFBQUElPQ1NDT01QUkVTUyAqLworc3RydWN0IHBwcF9vcHRpb25fZGF0YSB7CisJdV9pbnQ4X3QgICpwdHI7CisJdV9pbnQzMl90IGxlbmd0aDsKKwlpbnQJICB0cmFuc21pdDsKK307CisKK3N0cnVjdCBpZnBwcHN0YXRzcmVxIHsKKyAgc3RydWN0IGlmcmVxCSAgIGI7CisgIHN0cnVjdCBwcHBfc3RhdHMgc3RhdHM7CQkJLyogc3RhdGlzdGljIGluZm9ybWF0aW9uICovCit9OworCitzdHJ1Y3QgaWZwcHBjc3RhdHNyZXEgeworICBzdHJ1Y3QgaWZyZXEJCWI7CisgIHN0cnVjdCBwcHBfY29tcF9zdGF0cyBzdGF0czsKK307CisKKyNkZWZpbmUgaWZyX19uYW1lICAgICAgIGIuaWZyX2lmcm4uaWZybl9uYW1lCisjZGVmaW5lIHN0YXRzX3B0ciAgICAgICBiLmlmcl9pZnJ1LmlmcnVfZGF0YQorCisvKgorICogSW9jdGwgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZQlQUFBJT0NHRkxBR1MJX0lPUigndCcsIDkwLCBpbnQpCS8qIGdldCBjb25maWd1cmF0aW9uIGZsYWdzICovCisjZGVmaW5lCVBQUElPQ1NGTEFHUwlfSU9XKCd0JywgODksIGludCkJLyogc2V0IGNvbmZpZ3VyYXRpb24gZmxhZ3MgKi8KKyNkZWZpbmUJUFBQSU9DR0FTWU5DTUFQCV9JT1IoJ3QnLCA4OCwgaW50KQkvKiBnZXQgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ1NBU1lOQ01BUAlfSU9XKCd0JywgODcsIGludCkJLyogc2V0IGFzeW5jIG1hcCAqLworI2RlZmluZQlQUFBJT0NHVU5JVAlfSU9SKCd0JywgODYsIGludCkJLyogZ2V0IHBwcCB1bml0IG51bWJlciAqLworI2RlZmluZQlQUFBJT0NHUkFTWU5DTUFQIF9JT1IoJ3QnLCA4NSwgaW50KQkvKiBnZXQgcmVjZWl2ZSBhc3luYyBtYXAgKi8KKyNkZWZpbmUJUFBQSU9DU1JBU1lOQ01BUCBfSU9XKCd0JywgODQsIGludCkJLyogc2V0IHJlY2VpdmUgYXN5bmMgbWFwICovCisjZGVmaW5lCVBQUElPQ0dNUlUJX0lPUigndCcsIDgzLCBpbnQpCS8qIGdldCBtYXggcmVjZWl2ZSB1bml0ICovCisjZGVmaW5lCVBQUElPQ1NNUlUJX0lPVygndCcsIDgyLCBpbnQpCS8qIHNldCBtYXggcmVjZWl2ZSB1bml0ICovCisjZGVmaW5lCVBQUElPQ1NNQVhDSUQJX0lPVygndCcsIDgxLCBpbnQpCS8qIHNldCBWSiBtYXggc2xvdCBJRCAqLworI2RlZmluZSBQUFBJT0NHWEFTWU5DTUFQIF9JT1IoJ3QnLCA4MCwgZXh0X2FjY20pIC8qIGdldCBleHRlbmRlZCBBQ0NNICovCisjZGVmaW5lIFBQUElPQ1NYQVNZTkNNQVAgX0lPVygndCcsIDc5LCBleHRfYWNjbSkgLyogc2V0IGV4dGVuZGVkIEFDQ00gKi8KKyNkZWZpbmUgUFBQSU9DWEZFUlVOSVQJX0lPKCd0JywgNzgpCQkvKiB0cmFuc2ZlciBQUFAgdW5pdCAqLworI2RlZmluZSBQUFBJT0NTQ09NUFJFU1MJX0lPVygndCcsIDc3LCBzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhKQorI2RlZmluZSBQUFBJT0NHTlBNT0RFCV9JT1dSKCd0JywgNzYsIHN0cnVjdCBucGlvY3RsKSAvKiBnZXQgTlAgbW9kZSAqLworI2RlZmluZSBQUFBJT0NTTlBNT0RFCV9JT1coJ3QnLCA3NSwgc3RydWN0IG5waW9jdGwpICAvKiBzZXQgTlAgbW9kZSAqLworI2RlZmluZSBQUFBJT0NHREVCVUcJX0lPUigndCcsIDY1LCBpbnQpCS8qIFJlYWQgZGVidWcgbGV2ZWwgKi8KKyNkZWZpbmUgUFBQSU9DU0RFQlVHCV9JT1coJ3QnLCA2NCwgaW50KQkvKiBTZXQgZGVidWcgbGV2ZWwgKi8KKyNkZWZpbmUgUFBQSU9DR0lETEUJX0lPUigndCcsIDYzLCBzdHJ1Y3QgcHBwX2lkbGUpIC8qIGdldCBpZGxlIHRpbWUgKi8KKworI2RlZmluZSBTSU9DR1BQUFNUQVRTICAgKFNJT0NERVZQUklWQVRFICsgMCkKKyNkZWZpbmUgU0lPQ0dQUFBWRVIgICAgIChTSU9DREVWUFJJVkFURSArIDEpICAvKiBORVZFUiBjaGFuZ2UgdGhpcyEhICovCisjZGVmaW5lIFNJT0NHUFBQQ1NUQVRTICAoU0lPQ0RFVlBSSVZBVEUgKyAyKQorCisjaWYgIWRlZmluZWQoaWZyX210dSkKKyNkZWZpbmUgaWZyX210dQlpZnJfaWZydS5pZnJ1X21ldHJpYworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXQvaWZfcHBwLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NoYXBlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfc2hhcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MGFmMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NoYXBlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUX0lGX1NIQVBFUl9ICisjZGVmaW5lIF9ORVRfSUZfU0hBUEVSX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIFNIQVBFUl9RTEVOCTEwCisvKgorICoJVGhpcyBpcyBhIGJpdCBzcGVlZCBkZXBlbmRhbnQgKHJlYWQgaXQgc2hvdWxkbnQgYmUgYSBjb25zdGFudCEpCisgKgorICoJNSBpcyBhYm91dCByaWdodCBmb3IgMjguOCB1cHdhcmRzLiBCZWxvdyB0aGF0IGRvdWJsZSBmb3IgZXZlcnkKKyAqCWhhbHZpbmcgb2Ygc3BlZWQgb3Igc28uIC0gaWUgYWJvdXQgMjAgZm9yIDk2MDAgYmF1ZC4KKyAqLworI2RlZmluZSBTSEFQRVJfTEFURU5DWQkoNSAqIEhaKQorI2RlZmluZSBTSEFQRVJfTUFYU0xJUAkyCisjZGVmaW5lIFNIQVBFUl9CVVJTVAkoSFogLyA1MCkJLyogR29vZCBmb3IgPjEyOEsgdGhlbiAqLworCisjZGVmaW5lIFNIQVBFUl9TRVRfREVWCQkweDAwMDEKKyNkZWZpbmUgU0hBUEVSX1NFVF9TUEVFRAkweDAwMDIKKyNkZWZpbmUgU0hBUEVSX0dFVF9ERVYJCTB4MDAwMworI2RlZmluZSBTSEFQRVJfR0VUX1NQRUVECTB4MDAwNAorCitzdHJ1Y3Qgc2hhcGVyY29uZgoreworICB1X2ludDE2X3Qgc3NfY21kOworICB1bmlvbgorICB7CisgICAgY2hhciBzc3VfbmFtZVsxNF07CisgICAgdV9pbnQzMl90IHNzdV9zcGVlZDsKKyAgfSBzc191OworI2RlZmluZSBzc19zcGVlZCBzc191LnNzdV9zcGVlZAorI2RlZmluZSBzc19uYW1lIHNzX3Uuc3N1X25hbWUKK307CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXQvaWZfc2hhcGVyLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NsaXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L2lmX3NsaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmJkN2YzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvaWZfc2xpcC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUX0lGX1NMSVBfSAorI2RlZmluZSBfTkVUX0lGX1NMSVBfSCAxCisKKy8qIFdlIGNhbiB1c2UgdGhlIGtlcm5lbCBoZWFkZXIuICAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3NsaXAuaD4KKworI2VuZGlmCS8qIG5ldC9pZl9zbGlwLmguICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwLWNvbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcC1jb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5OTJkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3BwcC1jb21wLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGxpbnV4L3BwcC1jb21wLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9wcHBfZGVmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODkyNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXQvcHBwX2RlZnMuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9ORVRfUFBQX0RFRlNfSAorI2RlZmluZSBfTkVUX1BQUF9ERUZTX0ggMQorCisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorCisjZW5kaWYgLyogbmV0L3BwcF9kZWZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0L3JvdXRlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWM4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIEJhc2VkIG9uIHRoZSA0LjRCU0QgYW5kIExpbnV4IHZlcnNpb24gb2YgdGhpcyBmaWxlLiAgKi8KKworI2lmbmRlZiBfTkVUX1JPVVRFX0gKKyNkZWZpbmUgX05FVF9ST1VURV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworLyogVGhpcyBzdHJ1Y3R1cmUgZ2V0cyBwYXNzZWQgYnkgdGhlIFNJT0NBRERSVCBhbmQgU0lPQ0RFTFJUIGNhbGxzLiAqLworc3RydWN0IHJ0ZW50cnkKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0X3BhZDE7CisgICAgc3RydWN0IHNvY2thZGRyIHJ0X2RzdDsJCS8qIFRhcmdldCBhZGRyZXNzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgcnRfZ2F0ZXdheTsJCS8qIEdhdGV3YXkgYWRkciAoUlRGX0dBVEVXQVkpLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgcnRfZ2VubWFzazsJCS8qIFRhcmdldCBuZXR3b3JrIG1hc2sgKElQKS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHJ0X2ZsYWdzOworICAgIHNob3J0IGludCBydF9wYWQyOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0X3BhZDM7CisgICAgdW5zaWduZWQgY2hhciBydF90b3M7CisgICAgdW5zaWduZWQgY2hhciBydF9jbGFzczsKKyNpZiBfX1dPUkRTSVpFID09IDY0CisgICAgc2hvcnQgaW50IHJ0X3BhZDRbM107CisjZWxzZQorICAgIHNob3J0IGludCBydF9wYWQ0OworI2VuZGlmCisgICAgc2hvcnQgaW50IHJ0X21ldHJpYzsJCS8qICsxIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSEgICovCisgICAgY2hhciAqcnRfZGV2OwkJCS8qIEZvcmNpbmcgdGhlIGRldmljZSBhdCBhZGQuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHJ0X210dTsJCS8qIFBlciByb3V0ZSBNVFUvV2luZG93LiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBydF93aW5kb3c7CS8qIFdpbmRvdyBjbGFtcGluZy4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHJ0X2lydHQ7CQkvKiBJbml0aWFsIFJUVC4gICovCisgIH07CisvKiBDb21wYXRpYmlsaXR5IGhhY2suICAqLworI2RlZmluZSBydF9tc3MJcnRfbXR1CisKKworc3RydWN0IGluNl9ydG1zZworICB7CisgICAgc3RydWN0IGluNl9hZGRyIHJ0bXNnX2RzdDsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgcnRtc2dfc3JjOworICAgIHN0cnVjdCBpbjZfYWRkciBydG1zZ19nYXRld2F5OworICAgIHVfaW50MzJfdCBydG1zZ190eXBlOworICAgIHVfaW50MTZfdCBydG1zZ19kc3RfbGVuOworICAgIHVfaW50MTZfdCBydG1zZ19zcmNfbGVuOworICAgIHVfaW50MzJfdCBydG1zZ19tZXRyaWM7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgcnRtc2dfaW5mbzsKKyAgICB1X2ludDMyX3QgcnRtc2dfZmxhZ3M7CisgICAgaW50IHJ0bXNnX2lmaW5kZXg7CisgIH07CisKKworI2RlZmluZQlSVEZfVVAJCTB4MDAwMQkJLyogUm91dGUgdXNhYmxlLiAgKi8KKyNkZWZpbmUJUlRGX0dBVEVXQVkJMHgwMDAyCQkvKiBEZXN0aW5hdGlvbiBpcyBhIGdhdGV3YXkuICAqLworCisjZGVmaW5lCVJURl9IT1NUCTB4MDAwNAkJLyogSG9zdCBlbnRyeSAobmV0IG90aGVyd2lzZSkuICAqLworI2RlZmluZSBSVEZfUkVJTlNUQVRFCTB4MDAwOAkJLyogUmVpbnN0YXRlIHJvdXRlIGFmdGVyIHRpbWVvdXQuICAqLworI2RlZmluZQlSVEZfRFlOQU1JQwkweDAwMTAJCS8qIENyZWF0ZWQgZHluLiAoYnkgcmVkaXJlY3QpLiAgKi8KKyNkZWZpbmUJUlRGX01PRElGSUVECTB4MDAyMAkJLyogTW9kaWZpZWQgZHluLiAoYnkgcmVkaXJlY3QpLiAgKi8KKyNkZWZpbmUgUlRGX01UVQkJMHgwMDQwCQkvKiBTcGVjaWZpYyBNVFUgZm9yIHRoaXMgcm91dGUuICAqLworI2RlZmluZSBSVEZfTVNTCQlSVEZfTVRVCQkvKiBDb21wYXRpYmlsaXR5LiAgKi8KKyNkZWZpbmUgUlRGX1dJTkRPVwkweDAwODAJCS8qIFBlciByb3V0ZSB3aW5kb3cgY2xhbXBpbmcuICAqLworI2RlZmluZSBSVEZfSVJUVAkweDAxMDAJCS8qIEluaXRpYWwgcm91bmQgdHJpcCB0aW1lLiAgKi8KKyNkZWZpbmUgUlRGX1JFSkVDVAkweDAyMDAJCS8qIFJlamVjdCByb3V0ZS4gICovCisjZGVmaW5lCVJURl9TVEFUSUMJMHgwNDAwCQkvKiBNYW51YWxseSBpbmplY3RlZCByb3V0ZS4gICovCisjZGVmaW5lCVJURl9YUkVTT0xWRQkweDA4MDAJCS8qIEV4dGVybmFsIHJlc29sdmVyLiAgKi8KKyNkZWZpbmUgUlRGX05PRk9SV0FSRCAgIDB4MTAwMAkJLyogRm9yd2FyZGluZyBpbmhpYml0ZWQuICAqLworI2RlZmluZSBSVEZfVEhST1cJMHgyMDAwCQkvKiBHbyB0byBuZXh0IGNsYXNzLiAgKi8KKyNkZWZpbmUgUlRGX05PUE1UVURJU0MgIDB4NDAwMAkJLyogRG8gbm90IHNlbmQgcGFja2V0cyB3aXRoIERGLiAgKi8KKworLyogZm9yIElQdjYgKi8KKyNkZWZpbmUgUlRGX0RFRkFVTFQJMHgwMDAxMDAwMAkvKiBkZWZhdWx0IC0gbGVhcm5lZCB2aWEgTkQJKi8KKyNkZWZpbmUgUlRGX0FMTE9OTElOSwkweDAwMDIwMDAwCS8qIGZhbGxiYWNrLCBubyByb3V0ZXJzIG9uIGxpbmsJKi8KKyNkZWZpbmUgUlRGX0FERFJDT05GCTB4MDAwNDAwMDAJLyogYWRkcmNvbmYgcm91dGUgLSBSQQkJKi8KKworI2RlZmluZSBSVEZfTElOS1JUCTB4MDAxMDAwMDAJLyogbGluayBzcGVjaWZpYyAtIGRldmljZSBtYXRjaAkqLworI2RlZmluZSBSVEZfTk9ORVhUSE9QCTB4MDAyMDAwMDAJLyogcm91dGUgd2l0aCBubyBuZXh0aG9wCSovCisKKyNkZWZpbmUgUlRGX0NBQ0hFCTB4MDEwMDAwMDAJLyogY2FjaGUgZW50cnkJCQkqLworI2RlZmluZSBSVEZfRkxPVwkweDAyMDAwMDAwCS8qIGZsb3cgc2lnbmlmaWNhbnQgcm91dGUJKi8KKyNkZWZpbmUgUlRGX1BPTElDWQkweDA0MDAwMDAwCS8qIHBvbGljeSByb3V0ZQkJCSovCisKKyNkZWZpbmUgUlRDRl9WQUxWRQkweDAwMjAwMDAwCisjZGVmaW5lIFJUQ0ZfTUFTUQkweDAwNDAwMDAwCisjZGVmaW5lIFJUQ0ZfTkFUCTB4MDA4MDAwMDAKKyNkZWZpbmUgUlRDRl9ET1JFRElSRUNUIDB4MDEwMDAwMDAKKyNkZWZpbmUgUlRDRl9MT0cJMHgwMjAwMDAwMAorI2RlZmluZSBSVENGX0RJUkVDVFNSQwkweDA0MDAwMDAwCisKKyNkZWZpbmUgUlRGX0xPQ0FMCTB4ODAwMDAwMDAKKyNkZWZpbmUgUlRGX0lOVEVSRkFDRQkweDQwMDAwMDAwCisjZGVmaW5lIFJURl9NVUxUSUNBU1QJMHgyMDAwMDAwMAorI2RlZmluZSBSVEZfQlJPQURDQVNUCTB4MTAwMDAwMDAKKyNkZWZpbmUgUlRGX05BVAkJMHgwODAwMDAwMAorCisjZGVmaW5lIFJURl9BRERSQ0xBU1NNQVNLCTB4RjgwMDAwMDAKKyNkZWZpbmUgUlRfQUREUkNMQVNTKGZsYWdzKQkoKF9fdV9pbnQzMl90KSBmbGFncyA+PiAyMykKKworI2RlZmluZSBSVF9UT1ModG9zKQkJKCh0b3MpICYgSVBUT1NfVE9TX01BU0spCisKKyNkZWZpbmUgUlRfTE9DQUxBRERSKGZsYWdzKQkoKGZsYWdzICYgUlRGX0FERFJDTEFTU01BU0spIFwKKwkJCQkgPT0gKFJURl9MT0NBTHxSVEZfSU5URVJGQUNFKSkKKworI2RlZmluZSBSVF9DTEFTU19VTlNQRUMJCTAKKyNkZWZpbmUgUlRfQ0xBU1NfREVGQVVMVAkyNTMKKworI2RlZmluZSBSVF9DTEFTU19NQUlOCQkyNTQKKyNkZWZpbmUgUlRfQ0xBU1NfTE9DQUwJCTI1NQorI2RlZmluZSBSVF9DTEFTU19NQVgJCTI1NQorCisKKyNkZWZpbmUgUlRNU0dfQUNLCQlOTE1TR19BQ0sKKyNkZWZpbmUgUlRNU0dfT1ZFUlJVTgkJTkxNU0dfT1ZFUlJVTgorCisjZGVmaW5lIFJUTVNHX05FV0RFVklDRQkJMHgxMQorI2RlZmluZSBSVE1TR19ERUxERVZJQ0UJCTB4MTIKKyNkZWZpbmUgUlRNU0dfTkVXUk9VVEUJCTB4MjEKKyNkZWZpbmUgUlRNU0dfREVMUk9VVEUJCTB4MjIKKyNkZWZpbmUgUlRNU0dfTkVXUlVMRQkJMHgzMQorI2RlZmluZSBSVE1TR19ERUxSVUxFCQkweDMyCisjZGVmaW5lIFJUTVNHX0NPTlRST0wJCTB4NDAKKworI2RlZmluZSBSVE1TR19BUl9GQUlMRUQJCTB4NTEJLyogQWRkcmVzcyBSZXNvbHV0aW9uIGZhaWxlZC4gICovCisKKyNlbmRpZiAvKiBuZXQvcm91dGUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhc2gvYXNoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGFzaC9hc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJjMGFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhc2gvYXNoLmgKQEAgLTAsMCArMSw0MCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIExpbnV4IEFGX0FTSCBzb2NrZXRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRBU0hfQVNIX0gKKyNkZWZpbmUgX05FVEFTSF9BU0hfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworc3RydWN0IHNvY2thZGRyX2FzaAorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNhc2hfKTsJCS8qIENvbW1vbiBkYXRhOiBhZGRyZXNzIGZhbWlseSBldGMuICAqLworICAgIGludCBzYXNoX2lmaW5kZXg7CQkJLyogSW50ZXJmYWNlIHRvIHVzZS4gICovCisgICAgdW5zaWduZWQgY2hhciBzYXNoX2NoYW5uZWw7CQkvKiBSZWFsdGltZSBvciBjb250cm9sLiAgKi8KKyAgICB1bnNpZ25lZCBpbnQgc2FzaF9wbGVuOworICAgIHVuc2lnbmVkIGNoYXIgc2FzaF9wcmVmaXhbMTZdOworICB9OworCisvKiBWYWx1ZXMgZm9yIGBjaGFubmVsJyBtZW1iZXIuICAqLworI2RlZmluZSBBU0hfQ0hBTk5FTF9BTlkJCTAKKyNkZWZpbmUgQVNIX0NIQU5ORUxfQ09OVFJPTAkxCisjZGVmaW5lIEFTSF9DSEFOTkVMX1JFQUxUSU1FCTIKKworI2VuZGlmCS8qIG5ldGFzaC9hc2guaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhdGFsay9hdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRhdGFsay9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjhmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF0YWxrL2F0LmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk1LCAxOTk2LCAxOTk3LCAyMDA0CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUQVRBTEtfQVRfSAorI2RlZmluZSBfTkVUQVRBTEtfQVRfSCAxCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNkZWZpbmUgU09MX0FUQUxLICAgICAgIDI1OCAgICAgLyogc29ja29wdCBsZXZlbCBmb3IgYXRhbGsgKi8KKworI2VuZGlmCS8qIG5ldGF0YWxrL2F0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0YXgyNS9heDI1LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF4MjUvYXgyNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2M3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGF4MjUvYXgyNS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVEFYMjVfQVgyNV9ICisjZGVmaW5lIF9ORVRBWDI1X0FYMjVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworLyogU2V0c29ja29wdGlvbnMoMikgbGV2ZWwuICBUaGFua3MgdG8gQlNEIHRoZXNlIG11c3QgbWF0Y2ggSVBQUk9UT194eHguICAqLworI2RlZmluZSBTT0xfQVgyNQkyNTcKKworLyogQVguMjUgZmxhZ3M6ICovCisjZGVmaW5lIEFYMjVfV0lORE9XCTEKKyNkZWZpbmUgQVgyNV9UMQkJMgorI2RlZmluZSBBWDI1X1QyCQk1CisjZGVmaW5lIEFYMjVfVDMJCTQKKyNkZWZpbmUgQVgyNV9OMgkJMworI2RlZmluZSBBWDI1X0JBQ0tPRkYJNgorI2RlZmluZSBBWDI1X0VYVFNFUQk3CisjZGVmaW5lIEFYMjVfUElESU5DTAk4CisjZGVmaW5lIEFYMjVfSURMRQk5CisjZGVmaW5lCUFYMjVfUEFDTEVOCTEwCisjZGVmaW5lIEFYMjVfSVBNQVhRVUVVRSAxMQorI2RlZmluZSBBWDI1X0lBTURJR0kJMTIKKyNkZWZpbmUgQVgyNV9LSUxMCTk5CisKKy8qIEFYLjI1IHNvY2tldCBpb2N0bHM6ICovCisjZGVmaW5lIFNJT0NBWDI1R0VUVUlECQkoU0lPQ1BST1RPUFJJVkFURSkKKyNkZWZpbmUgU0lPQ0FYMjVBRERVSUQJCShTSU9DUFJPVE9QUklWQVRFKzEpCisjZGVmaW5lIFNJT0NBWDI1REVMVUlECQkoU0lPQ1BST1RPUFJJVkFURSsyKQorI2RlZmluZSBTSU9DQVgyNU5PVUlECQkoU0lPQ1BST1RPUFJJVkFURSszKQorI2RlZmluZSBTSU9DQVgyNUJQUUFERFIJCShTSU9DUFJPVE9QUklWQVRFKzQpCisjZGVmaW5lIFNJT0NBWDI1R0VUUEFSTVMJKFNJT0NQUk9UT1BSSVZBVEUrNSkKKyNkZWZpbmUgU0lPQ0FYMjVTRVRQQVJNUwkoU0lPQ1BST1RPUFJJVkFURSs2KQorI2RlZmluZSBTSU9DQVgyNU9QVFJUCQkoU0lPQ1BST1RPUFJJVkFURSs3KQorI2RlZmluZSBTSU9DQVgyNUNUTENPTgkJKFNJT0NQUk9UT1BSSVZBVEUrOCkKKyNkZWZpbmUgU0lPQ0FYMjVHRVRJTkZPCQkoU0lPQ1BST1RPUFJJVkFURSs5KQorI2RlZmluZSBTSU9DQVgyNUFEREZXRAkJKFNJT0NQUk9UT1BSSVZBVEUrMTApCisjZGVmaW5lIFNJT0NBWDI1REVMRldECQkoU0lPQ1BST1RPUFJJVkFURSsxMSkKKworLyogdW5rbm93bjogKi8KKyNkZWZpbmUgQVgyNV9OT1VJRF9ERUZBVUxUCTAKKyNkZWZpbmUgQVgyNV9OT1VJRF9CTE9DSwkxCisjZGVmaW5lIEFYMjVfU0VUX1JUX0lQTU9ERQkyCisKKy8qIERpZ2lwZWF0aW5nIGZsYWdzOiAqLworI2RlZmluZSBBWDI1X0RJR0lfSU5CQU5ECTB4MDEJLyogQWxsb3cgZGlnaXBlYXRpbmcgd2l0aGluIHBvcnQgKi8KKyNkZWZpbmUgQVgyNV9ESUdJX1hCQU5ECQkweDAyCS8qIEFsbG93IGRpZ2lwZWF0aW5nIGFjcm9zcyBwb3J0cyAqLworCisvKiBNYXhpbWltIG51bWJlciBvZiBkaWdpcGVhdGVyczogKi8KKyNkZWZpbmUgQVgyNV9NQVhfRElHSVMgOAorCisKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBjaGFyIGF4MjVfY2FsbFs3XTsJCS8qIDYgY2FsbCArIFNTSUQgKHNoaWZ0ZWQgYXNjaWkpICovCisgIH0KK2F4MjVfYWRkcmVzczsKKworc3RydWN0IHNvY2thZGRyX2F4MjUKKyAgeworICAgIHNhX2ZhbWlseV90IHNheDI1X2ZhbWlseTsKKyAgICBheDI1X2FkZHJlc3Mgc2F4MjVfY2FsbDsKKyAgICBpbnQgc2F4MjVfbmRpZ2lzOworICB9OworCisvKgorICogVGhlIHNvY2thZGRyIHN0cnVjdCB3aXRoIHRoZSBkaWdpcGVhdGVyIGFkcmVzc2VzOgorICovCitzdHJ1Y3QgZnVsbF9zb2NrYWRkcl9heDI1CisgIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfYXgyNSBmc2FfYXgyNTsKKyAgICBheDI1X2FkZHJlc3MgZnNhX2RpZ2lwZWF0ZXJbQVgyNV9NQVhfRElHSVNdOworICB9OworI2RlZmluZSBzYXgyNV91aWQJc2F4MjVfbmRpZ2lzCisKK3N0cnVjdCBheDI1X3JvdXRlc19zdHJ1Y3QKKyAgeworICAgIGF4MjVfYWRkcmVzcyBwb3J0X2FkZHI7CisgICAgYXgyNV9hZGRyZXNzIGRlc3RfYWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIGRpZ2lfY291bnQ7CisgICAgYXgyNV9hZGRyZXNzIGRpZ2lfYWRkcltBWDI1X01BWF9ESUdJU107CisgIH07CisKKy8qIFRoZSBBWC4yNSBpb2N0bCBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgYXgyNV9jdGxfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIGF4MjVfYWRkcmVzcyBzb3VyY2VfYWRkcjsKKyAgICBheDI1X2FkZHJlc3MgZGVzdF9hZGRyOworICAgIHVuc2lnbmVkIGludCBjbWQ7CisgICAgdW5zaWduZWQgbG9uZyBhcmc7CisgICAgdW5zaWduZWQgY2hhciBkaWdpX2NvdW50OworICAgIGF4MjVfYWRkcmVzcyBkaWdpX2FkZHJbQVgyNV9NQVhfRElHSVNdOworICB9OworCitzdHJ1Y3QgYXgyNV9pbmZvX3N0cnVjdAorICB7CisgICAgdW5zaWduZWQgaW50ICBuMiwgbjJjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgdDEsIHQxdGltZXI7CisgICAgdW5zaWduZWQgaW50IHQyLCB0MnRpbWVyOworICAgIHVuc2lnbmVkIGludCB0MywgdDN0aW1lcjsKKyAgICB1bnNpZ25lZCBpbnQgaWRsZSwgaWRsZXRpbWVyOworICAgIHVuc2lnbmVkIGludCBzdGF0ZTsKKyAgICB1bnNpZ25lZCBpbnQgcmN2X3EsIHNuZF9xOworICB9OworCitzdHJ1Y3QgYXgyNV9md2Rfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9mcm9tOworICAgIGF4MjVfYWRkcmVzcyBwb3J0X3RvOworICB9OworCisvKiBBWC4yNSByb3V0ZSBzdHJ1Y3R1cmU6ICovCitzdHJ1Y3QgYXgyNV9yb3V0ZV9vcHRfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIGF4MjVfYWRkcmVzcyBkZXN0X2FkZHI7CisgICAgaW50IGNtZDsKKyAgICBpbnQgYXJnOworICB9OworCisvKiBBWC4yNSBCUFEgc3R1ZmY6ICovCitzdHJ1Y3QgYXgyNV9icHFhZGRyX3N0cnVjdAorICB7CisgICAgY2hhciBkZXZbMTZdOworICAgIGF4MjVfYWRkcmVzcyBhZGRyOworICB9OworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIEFYLjI1IGB2YWx1ZXMnIGZpZWxkczogKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfSVBERUZNT0RFCTAJLyogJ0QnPURHICdWJz1WQyAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19BWERFRk1PREUJMQkvKiA4PU5vcm1hbCAxMjg9RXh0ZW5kZWQgU2VxIE5vcyAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19ORVRST00JMgkvKiBBbGxvdyBORVQvUk9NICAtIDA9Tm8gMT1ZZXMgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfVEVYVAkzCS8qIEFsbG93IFBJRD1UZXh0IC0gMD1ObyAxPVllcyAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19CQUNLT0ZGCTQJLyogJ0UnPUV4cG9uZW50aWFsICdMJz1MaW5lYXIgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfQ09OTU9ERQk1CS8qIEFsbG93IGNvbm5lY3RlZCBtb2RlcyAtIDA9Tm8gMT1ZZXMgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfV0lORE9XCTYJLyogRGVmYXVsdCB3aW5kb3cgc2l6ZSBmb3Igc3RhbmRhcmQgQVguMjUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfRVdJTkRPVwk3CS8qIERlZmF1bHQgd2luZG93IHNpemUgZm9yIGV4dGVuZGVkIEFYLjI1ICovCisjZGVmaW5lCUFYMjVfVkFMVUVTX1QxCQk4CS8qIERlZmF1bHQgVDEgdGltZW91dCB2YWx1ZSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19UMgkJOQkvKiBEZWZhdWx0IFQyIHRpbWVvdXQgdmFsdWUgKi8KKyNkZWZpbmUJQVgyNV9WQUxVRVNfVDMJCTEwCS8qIERlZmF1bHQgVDMgdGltZW91dCB2YWx1ZSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19OMgkJMTEJLyogRGVmYXVsdCBOMiB2YWx1ZSAqLworI2RlZmluZQlBWDI1X1ZBTFVFU19ESUdJCTEyCS8qIERpZ2lwZWF0IG1vZGUgKi8KKyNkZWZpbmUgQVgyNV9WQUxVRVNfSURMRQkxMwkvKiBtb2RlIHZjIGlkbGUgdGltZXIgKi8KKyNkZWZpbmUgQVgyNV9WQUxVRVNfUEFDTEVOCTE0CS8qIEFYLjI1IE1UVSAqLworI2RlZmluZSBBWDI1X1ZBTFVFU19JUE1BWFFVRVVFICAxNQkvKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGVucXVldWVkICovCisjZGVmaW5lCUFYMjVfTUFYX1ZBTFVFUwkJMjAKKworc3RydWN0IGF4MjVfcGFybXNfc3RydWN0CisgIHsKKyAgICBheDI1X2FkZHJlc3MgcG9ydF9hZGRyOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlc1tBWDI1X01BWF9WQUxVRVNdOworICB9OworCisjZW5kaWYgLyogbmV0YXgyNS9heDI1LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZGIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0ZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzVjOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRkYi5oCkBAIC0wLDAgKzEsNjg0IEBACisgIC8qIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyLCAyMDAzLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBBbGwgZGF0YSByZXR1cm5lZCBieSB0aGUgbmV0d29yayBkYXRhIGJhc2UgbGlicmFyeSBhcmUgc3VwcGxpZWQgaW4KKyAgIGhvc3Qgb3JkZXIgYW5kIHJldHVybmVkIGluIG5ldHdvcmsgb3JkZXIgKHN1aXRhYmxlIGZvciB1c2UgaW4KKyAgIHN5c3RlbSBjYWxscykuICAqLworCisjaWZuZGVmCV9ORVREQl9ICisjZGVmaW5lCV9ORVREQl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWZkZWYgX19VU0VfTUlTQworLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSB0aGlzIGluY2x1ZGUgZmlsZSBwcm9wZXJseSByZXBsYWNlIHRoZQorICAgU3VuIHZlcnNpb24uICAqLworIyBpbmNsdWRlIDxycGMvbmV0ZGIuaD4KKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfc2lnZXZlbnRfdAorIyBpbmNsdWRlIDxiaXRzL3NpZ2luZm8uaD4KKyMgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvbmV0ZGIuaD4KKworLyogQWJzb2x1dGUgZmlsZSBuYW1lIGZvciBuZXR3b3JrIGRhdGEgYmFzZSBmaWxlcy4gICovCisjZGVmaW5lCV9QQVRIX0hFUVVJVgkJIi9ldGMvaG9zdHMuZXF1aXYiCisjZGVmaW5lCV9QQVRIX0hPU1RTCQkiL2V0Yy9ob3N0cyIKKyNkZWZpbmUJX1BBVEhfTkVUV09SS1MJCSIvZXRjL25ldHdvcmtzIgorI2RlZmluZQlfUEFUSF9OU1NXSVRDSF9DT05GCSIvZXRjL25zc3dpdGNoLmNvbmYiCisjZGVmaW5lCV9QQVRIX1BST1RPQ09MUwkJIi9ldGMvcHJvdG9jb2xzIgorI2RlZmluZQlfUEFUSF9TRVJWSUNFUwkJIi9ldGMvc2VydmljZXMiCisKKworX19CRUdJTl9ERUNMUworCisvKiBFcnJvciBzdGF0dXMgZm9yIG5vbi1yZWVudHJhbnQgbG9va3VwIGZ1bmN0aW9ucy4KKyAgIFdlIHVzZSBhIG1hY3JvIHRvIGFjY2VzcyBhbHdheXMgdGhlIHRocmVhZC1zcGVjaWZpYyBgaF9lcnJubycgdmFyaWFibGUuICAqLworI2RlZmluZSBoX2Vycm5vICgqX19oX2Vycm5vX2xvY2F0aW9uICgpKQorCisvKiBGdW5jdGlvbiB0byBnZXQgYWRkcmVzcyBvZiBnbG9iYWwgYGhfZXJybm8nIHZhcmlhYmxlLiAgKi8KK2V4dGVybiBpbnQgKl9faF9lcnJub19sb2NhdGlvbiAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKworLyogUG9zc2libGUgdmFsdWVzIGxlZnQgaW4gYGhfZXJybm8nLiAgKi8KKyNkZWZpbmUJTkVUREJfSU5URVJOQUwJLTEJLyogU2VlIGVycm5vLiAgKi8KKyNkZWZpbmUJTkVUREJfU1VDQ0VTUwkwCS8qIE5vIHByb2JsZW0uICAqLworI2RlZmluZQlIT1NUX05PVF9GT1VORAkxCS8qIEF1dGhvcml0YXRpdmUgQW5zd2VyIEhvc3Qgbm90IGZvdW5kLiAgKi8KKyNkZWZpbmUJVFJZX0FHQUlOCTIJLyogTm9uLUF1dGhvcml0YXRpdmUgSG9zdCBub3QgZm91bmQsCisJCQkJICAgb3IgU0VSVkVSRkFJTC4gICovCisjZGVmaW5lCU5PX1JFQ09WRVJZCTMJLyogTm9uIHJlY292ZXJhYmxlIGVycm9ycywgRk9STUVSUiwgUkVGVVNFRCwKKwkJCQkgICBOT1RJTVAuICAqLworI2RlZmluZQlOT19EQVRBCQk0CS8qIFZhbGlkIG5hbWUsIG5vIGRhdGEgcmVjb3JkIG9mIHJlcXVlc3RlZAorCQkJCSAgIHR5cGUuICAqLworI2RlZmluZQlOT19BRERSRVNTCU5PX0RBVEEJLyogTm8gYWRkcmVzcywgbG9vayBmb3IgTVggcmVjb3JkLiAgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEhpZ2hlc3QgcmVzZXJ2ZWQgSW50ZXJuZXQgcG9ydCBudW1iZXIuICAqLworIyBkZWZpbmUgSVBQT1JUX1JFU0VSVkVECTEwMjQKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBTY29wZSBkZWxpbWl0ZXIgZm9yIGdldGFkZHJpbmZvKCksIGdldG5hbWVpbmZvKCkuICAqLworIyBkZWZpbmUgU0NPUEVfREVMSU1JVEVSCSclJworI2VuZGlmCisKKy8qIFByaW50IGVycm9yIGluZGljYXRlZCBieSBgaF9lcnJubycgdmFyaWFibGUgb24gc3RhbmRhcmQgZXJyb3IuICBTVFIKKyAgIGlmIG5vbi1udWxsIGlzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvciBzdHJpbmcuICAqLworZXh0ZXJuIHZvaWQgaGVycm9yIChfX2NvbnN0IGNoYXIgKl9fc3RyKSBfX1RIUk9XOworCisvKiBSZXR1cm4gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBlcnJvciBFUlJfTlVNLiAgKi8KK2V4dGVybiBfX2NvbnN0IGNoYXIgKmhzdHJlcnJvciAoaW50IF9fZXJyX251bSkgX19USFJPVzsKKworCisKKy8qIERlc2NyaXB0aW9uIG9mIGRhdGEgYmFzZSBlbnRyeSBmb3IgYSBzaW5nbGUgaG9zdC4gICovCitzdHJ1Y3QgaG9zdGVudAoreworICBjaGFyICpoX25hbWU7CQkJLyogT2ZmaWNpYWwgbmFtZSBvZiBob3N0LiAgKi8KKyAgY2hhciAqKmhfYWxpYXNlczsJCS8qIEFsaWFzIGxpc3QuICAqLworICBpbnQgaF9hZGRydHlwZTsJCS8qIEhvc3QgYWRkcmVzcyB0eXBlLiAgKi8KKyAgaW50IGhfbGVuZ3RoOwkJCS8qIExlbmd0aCBvZiBhZGRyZXNzLiAgKi8KKyAgY2hhciAqKmhfYWRkcl9saXN0OwkJLyogTGlzdCBvZiBhZGRyZXNzZXMgZnJvbSBuYW1lIHNlcnZlci4gICovCisjZGVmaW5lCWhfYWRkcgloX2FkZHJfbGlzdFswXQkvKiBBZGRyZXNzLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gICovCit9OworCisvKiBPcGVuIGhvc3QgZGF0YSBiYXNlIGZpbGVzIGFuZCBtYXJrIHRoZW0gYXMgc3RheWluZyBvcGVuIGV2ZW4gYWZ0ZXIKKyAgIGEgbGF0ZXIgc2VhcmNoIGlmIFNUQVlfT1BFTiBpcyBub24temVyby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRob3N0ZW50IChpbnQgX19zdGF5X29wZW4pOworCisvKiBDbG9zZSBob3N0IGRhdGEgYmFzZSBmaWxlcyBhbmQgY2xlYXIgYHN0YXkgb3BlbicgZmxhZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRob3N0ZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBob3N0IGRhdGEgYmFzZSBmaWxlLiAgT3BlbiBkYXRhIGJhc2UgaWYKKyAgIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGhvc3RlbnQgKHZvaWQpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBob3N0IGRhdGEgYmFzZSB3aGljaCBhZGRyZXNzIG1hdGNoIEFERFIgd2l0aAorICAgbGVuZ3RoIExFTiBhbmQgdHlwZSBUWVBFLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGJ5YWRkciAoX19jb25zdCB2b2lkICpfX2FkZHIsIF9fc29ja2xlbl90IF9fbGVuLAorCQkJCSAgICAgIGludCBfX3R5cGUpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBob3N0IGRhdGEgYmFzZSBmb3IgaG9zdCB3aXRoIE5BTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRob3N0YnluYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZXR1cm4gZW50cnkgZnJvbSBob3N0IGRhdGEgYmFzZSBmb3IgaG9zdCB3aXRoIE5BTUUuICBBRiBtdXN0IGJlCisgICBzZXQgdG8gdGhlIGFkZHJlc3MgdHlwZSB3aGljaCBpcyBgQUZfSU5FVCcgZm9yIElQdjQgb3IgYEFGX0lORVQ2JworICAgZm9yIElQdjYuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGJ5bmFtZTIgKF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19hZik7CisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAgVGhlIGFkZGl0aW9uYWwKKyAgIGFyZ3VtZW50cyBzcGVjaWZ5IGEgYnVmZmVyIG9mIEJVRkxFTiBzdGFydGluZyBhdCBCVUYuICBUaGUgbGFzdAorICAgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgdmFyaWFibGUgd2hpY2ggZ2V0cyB0aGUgdmFsdWUgd2hpY2gKKyAgIHdvdWxkIGJlIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGBoZXJybm8nIGJ5IHRoZQorICAgbm9uLXJlZW50cmFudCBmdW5jdGlvbnMuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRob3N0ZW50X3IgKHN0cnVjdCBob3N0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgc3RydWN0IGhvc3RlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0LAorCQkJIGludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKworZXh0ZXJuIGludCBnZXRob3N0YnlhZGRyX3IgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX2FkZHIsIF9fc29ja2xlbl90IF9fbGVuLAorCQkJICAgIGludCBfX3R5cGUsCisJCQkgICAgc3RydWN0IGhvc3RlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICBzdHJ1Y3QgaG9zdGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9faF9lcnJub3ApOworCitleHRlcm4gaW50IGdldGhvc3RieW5hbWVfciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgICBzdHJ1Y3QgaG9zdGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgIHN0cnVjdCBob3N0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisKK2V4dGVybiBpbnQgZ2V0aG9zdGJ5bmFtZTJfciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwgaW50IF9fYWYsCisJCQkgICAgIHN0cnVjdCBob3N0ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgICBzdHJ1Y3QgaG9zdGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkgICAgIGludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKyNlbmRpZgkvKiBtaXNjICovCisKKworLyogT3BlbiBuZXR3b3JrIGRhdGEgYmFzZSBmaWxlcyBhbmQgbWFyayB0aGVtIGFzIHN0YXlpbmcgb3BlbiBldmVuCisgICBhZnRlciBhIGxhdGVyIHNlYXJjaCBpZiBTVEFZX09QRU4gaXMgbm9uLXplcm8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0bmV0ZW50IChpbnQgX19zdGF5X29wZW4pOworCisvKiBDbG9zZSBuZXR3b3JrIGRhdGEgYmFzZSBmaWxlcyBhbmQgY2xlYXIgYHN0YXkgb3BlbicgZmxhZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRuZXRlbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIG5ldHdvcmsgZGF0YSBiYXNlIGZpbGUuICBPcGVuIGRhdGEgYmFzZSBpZgorICAgbmVjZXNzYXJ5LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbmV0ZW50ICpnZXRuZXRlbnQgKHZvaWQpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBuZXR3b3JrIGRhdGEgYmFzZSB3aGljaCBhZGRyZXNzIG1hdGNoIE5FVCBhbmQKKyAgIHR5cGUgVFlQRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IG5ldGVudCAqZ2V0bmV0YnlhZGRyICh1aW50MzJfdCBfX25ldCwgaW50IF9fdHlwZSk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIG5ldHdvcmsgZGF0YSBiYXNlIGZvciBuZXR3b3JrIHdpdGggTkFNRS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IG5ldGVudCAqZ2V0bmV0YnluYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gIFRoZSBhZGRpdGlvbmFsCisgICBhcmd1bWVudHMgc3BlY2lmeSBhIGJ1ZmZlciBvZiBCVUZMRU4gc3RhcnRpbmcgYXQgQlVGLiAgVGhlIGxhc3QKKyAgIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIHZhcmlhYmxlIHdoaWNoIGdldHMgdGhlIHZhbHVlIHdoaWNoCisgICB3b3VsZCBiZSBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSBgaGVycm5vJyBieSB0aGUKKyAgIG5vbi1yZWVudHJhbnQgZnVuY3Rpb25zLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0bmV0ZW50X3IgKHN0cnVjdCBuZXRlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IG5ldGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQlpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisKK2V4dGVybiBpbnQgZ2V0bmV0YnlhZGRyX3IgKHVpbnQzMl90IF9fbmV0LCBpbnQgX190eXBlLAorCQkJICAgc3RydWN0IG5ldGVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICBzdHJ1Y3QgbmV0ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCwKKwkJCSAgIGludCAqX19yZXN0cmljdCBfX2hfZXJybm9wKTsKKworZXh0ZXJuIGludCBnZXRuZXRieW5hbWVfciAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCSAgIHN0cnVjdCBuZXRlbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICAgc3RydWN0IG5ldGVudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQsCisJCQkgICBpbnQgKl9fcmVzdHJpY3QgX19oX2Vycm5vcCk7CisjZW5kaWYJLyogbWlzYyAqLworCisKKy8qIERlc2NyaXB0aW9uIG9mIGRhdGEgYmFzZSBlbnRyeSBmb3IgYSBzaW5nbGUgc2VydmljZS4gICovCitzdHJ1Y3Qgc2VydmVudAoreworICBjaGFyICpzX25hbWU7CQkJLyogT2ZmaWNpYWwgc2VydmljZSBuYW1lLiAgKi8KKyAgY2hhciAqKnNfYWxpYXNlczsJCS8qIEFsaWFzIGxpc3QuICAqLworICBpbnQgc19wb3J0OwkJCS8qIFBvcnQgbnVtYmVyLiAgKi8KKyAgY2hhciAqc19wcm90bzsJCS8qIFByb3RvY29sIHRvIHVzZS4gICovCit9OworCisvKiBPcGVuIHNlcnZpY2UgZGF0YSBiYXNlIGZpbGVzIGFuZCBtYXJrIHRoZW0gYXMgc3RheWluZyBvcGVuIGV2ZW4KKyAgIGFmdGVyIGEgbGF0ZXIgc2VhcmNoIGlmIFNUQVlfT1BFTiBpcyBub24temVyby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRzZXJ2ZW50IChpbnQgX19zdGF5X29wZW4pOworCisvKiBDbG9zZSBzZXJ2aWNlIGRhdGEgYmFzZSBmaWxlcyBhbmQgY2xlYXIgYHN0YXkgb3BlbicgZmxhZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRzZXJ2ZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBzZXJ2aWNlIGRhdGEgYmFzZSBmaWxlLiAgT3BlbiBkYXRhIGJhc2UgaWYKKyAgIG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNlcnZlbnQgKmdldHNlcnZlbnQgKHZvaWQpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBuZXR3b3JrIGRhdGEgYmFzZSBmb3IgbmV0d29yayB3aXRoIE5BTUUgYW5kCisgICBwcm90b2NvbCBQUk9UTy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHNlcnZlbnQgKmdldHNlcnZieW5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkJCSAgICAgIF9fY29uc3QgY2hhciAqX19wcm90byk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIHNlcnZpY2UgZGF0YSBiYXNlIHdoaWNoIG1hdGNoZXMgcG9ydCBQT1JUIGFuZAorICAgcHJvdG9jb2wgUFJPVE8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzZXJ2ZW50ICpnZXRzZXJ2Ynlwb3J0IChpbnQgX19wb3J0LCBfX2NvbnN0IGNoYXIgKl9fcHJvdG8pOworCisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gIFRoZSBhZGRpdGlvbmFsCisgICBhcmd1bWVudHMgc3BlY2lmeSBhIGJ1ZmZlciBvZiBCVUZMRU4gc3RhcnRpbmcgYXQgQlVGLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0c2VydmVudF9yIChzdHJ1Y3Qgc2VydmVudCAqX19yZXN0cmljdCBfX3Jlc3VsdF9idWYsCisJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJIHN0cnVjdCBzZXJ2ZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKK2V4dGVybiBpbnQgZ2V0c2VydmJ5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3Byb3RvLAorCQkJICAgIHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc3RydWN0IHNlcnZlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRzZXJ2Ynlwb3J0X3IgKGludCBfX3BvcnQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3Byb3RvLAorCQkJICAgIHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgc3RydWN0IHNlcnZlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKyNlbmRpZgkvKiBtaXNjICovCisKKworLyogRGVzY3JpcHRpb24gb2YgZGF0YSBiYXNlIGVudHJ5IGZvciBhIHNpbmdsZSBzZXJ2aWNlLiAgKi8KK3N0cnVjdCBwcm90b2VudAoreworICBjaGFyICpwX25hbWU7CQkJLyogT2ZmaWNpYWwgcHJvdG9jb2wgbmFtZS4gICovCisgIGNoYXIgKipwX2FsaWFzZXM7CQkvKiBBbGlhcyBsaXN0LiAgKi8KKyAgaW50IHBfcHJvdG87CQkJLyogUHJvdG9jb2wgbnVtYmVyLiAgKi8KK307CisKKy8qIE9wZW4gcHJvdG9jb2wgZGF0YSBiYXNlIGZpbGVzIGFuZCBtYXJrIHRoZW0gYXMgc3RheWluZyBvcGVuIGV2ZW4KKyAgIGFmdGVyIGEgbGF0ZXIgc2VhcmNoIGlmIFNUQVlfT1BFTiBpcyBub24temVyby4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzZXRwcm90b2VudCAoaW50IF9fc3RheV9vcGVuKTsKKworLyogQ2xvc2UgcHJvdG9jb2wgZGF0YSBiYXNlIGZpbGVzIGFuZCBjbGVhciBgc3RheSBvcGVuJyBmbGFnLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHByb3RvZW50ICh2b2lkKTsKKworLyogR2V0IG5leHQgZW50cnkgZnJvbSBwcm90b2NvbCBkYXRhIGJhc2UgZmlsZS4gIE9wZW4gZGF0YSBiYXNlIGlmCisgICBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwcm90b2VudCAqZ2V0cHJvdG9lbnQgKHZvaWQpOworCisvKiBSZXR1cm4gZW50cnkgZnJvbSBwcm90b2NvbCBkYXRhIGJhc2UgZm9yIG5ldHdvcmsgd2l0aCBOQU1FLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcHJvdG9lbnQgKmdldHByb3RvYnluYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSk7CisKKy8qIFJldHVybiBlbnRyeSBmcm9tIHByb3RvY29sIGRhdGEgYmFzZSB3aGljaCBudW1iZXIgaXMgUFJPVE8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwcm90b2VudCAqZ2V0cHJvdG9ieW51bWJlciAoaW50IF9fcHJvdG8pOworCisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZS4gIFRoZSBhZGRpdGlvbmFsCisgICBhcmd1bWVudHMgc3BlY2lmeSBhIGJ1ZmZlciBvZiBCVUZMRU4gc3RhcnRpbmcgYXQgQlVGLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHJvdG9lbnRfciAoc3RydWN0IHByb3RvZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuLAorCQkJICBzdHJ1Y3QgcHJvdG9lbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KTsKKworZXh0ZXJuIGludCBnZXRwcm90b2J5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19uYW1lLAorCQkJICAgICBzdHJ1Y3QgcHJvdG9lbnQgKl9fcmVzdHJpY3QgX19yZXN1bHRfYnVmLAorCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgIHN0cnVjdCBwcm90b2VudCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHByb3RvYnludW1iZXJfciAoaW50IF9fcHJvdG8sCisJCQkgICAgICAgc3RydWN0IHByb3RvZW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0X2J1ZiwKKwkJCSAgICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19idWZsZW4sCisJCQkgICAgICAgc3RydWN0IHByb3RvZW50ICoqX19yZXN0cmljdCBfX3Jlc3VsdCk7CisKKworLyogRXN0YWJsaXNoIG5ldHdvcmsgZ3JvdXAgTkVUR1JPVVAgZm9yIGVudW1lcmF0aW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHNldG5ldGdyZW50IChfX2NvbnN0IGNoYXIgKl9fbmV0Z3JvdXApOworCisvKiBGcmVlIGFsbCBzcGFjZSBhbGxvY2F0ZWQgYnkgcHJldmlvdXMgYHNldG5ldGdyZW50JyBjYWxsLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBlbmRuZXRncmVudCAodm9pZCk7CisKKy8qIEdldCBuZXh0IG1lbWJlciBvZiBuZXRncm91cCBlc3RhYmxpc2hlZCBieSBsYXN0IGBzZXRuZXRncmVudCcgY2FsbAorICAgYW5kIHJldHVybiBwb2ludGVycyB0byBlbGVtZW50cyBpbiBIT1NUUCwgVVNFUlAsIGFuZCBET01BSU5QLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldG5ldGdyZW50IChjaGFyICoqX19yZXN0cmljdCBfX2hvc3RwLAorCQkJY2hhciAqKl9fcmVzdHJpY3QgX191c2VycCwKKwkJCWNoYXIgKipfX3Jlc3RyaWN0IF9fZG9tYWlucCk7CisKKworLyogVGVzdCB3aGV0aGVyIE5FVEdST1VQIGNvbnRhaW5zIHRoZSB0cmlwbGUgKEhPU1QsVVNFUixET01BSU4pLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGlubmV0Z3IgKF9fY29uc3QgY2hhciAqX19uZXRncm91cCwgX19jb25zdCBjaGFyICpfX2hvc3QsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fdXNlciwgX19jb25zdCBjaGFyICpkb21haW4pOworCisvKiBSZWVudHJhbnQgdmVyc2lvbiBvZiBgZ2V0bmV0Z3JlbnQnIHdoZXJlIHJlc3VsdCBpcyBwbGFjZWQgaW4gQlVGRkVSLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldG5ldGdyZW50X3IgKGNoYXIgKipfX3Jlc3RyaWN0IF9faG9zdHAsCisJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fdXNlcnAsCisJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZG9tYWlucCwKKwkJCSAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuKTsKKyNlbmRpZgkvKiBtaXNjICovCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ2FsbCBgcnNoZCcgYXQgcG9ydCBSUE9SVCBvbiByZW1vdGUgbWFjaGluZSAqQUhPU1QgdG8gZXhlY3V0ZSBDTUQuCisgICBUaGUgbG9jYWwgdXNlciBpcyBMT0NVU0VSLCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgdGhlIGNvbW1hbmQgaXMKKyAgIGV4ZWN1dGVkIGFzIFJFTVVTRVIuICBJbiAqRkQyUCB0aGUgZGVzY3JpcHRvciB0byB0aGUgc29ja2V0IGZvciB0aGUKKyAgIGNvbm5lY3Rpb24gaXMgcmV0dXJuZWQuICBUaGUgY2FsbGVyIG11c3QgaGF2ZSB0aGUgcmlnaHQgdG8gdXNlIGEKKyAgIHJlc2VydmVkIHBvcnQuICBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zICpBSE9TVCBjb250YWlucyB0aGUKKyAgIG9mZmljaWFsIGhvc3QgbmFtZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCByY21kIChjaGFyICoqX19yZXN0cmljdCBfX2Fob3N0LCB1bnNpZ25lZCBzaG9ydCBpbnQgX19ycG9ydCwKKwkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2xvY3VzZXIsCisJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19yZW11c2VyLAorCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fY21kLCBpbnQgKl9fcmVzdHJpY3QgX19mZDJwKTsKKworLyogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBmdW5jdGlvbiB3aGVyZSB0aGUgcHJvdG9jb2wgY2FuIGJlIHNlbGVjdGVkCisgICBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbiBiZSB1c2VkIGZvciBJUHY2LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJjbWRfYWYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYWhvc3QsIHVuc2lnbmVkIHNob3J0IGludCBfX3Jwb3J0LAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbG9jdXNlciwKKwkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3JlbXVzZXIsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jbWQsIGludCAqX19yZXN0cmljdCBfX2ZkMnAsCisJCSAgICBzYV9mYW1pbHlfdCBfX2FmKTsKKworLyogQ2FsbCBgcmV4ZWNkJyBhdCBwb3J0IFJQT1JUIG9uIHJlbW90ZSBtYWNoaW5lICpBSE9TVCB0byBleGVjdXRlCisgICBDTUQuICBUaGUgcHJvY2VzcyBydW5zIGF0IHRoZSByZW1vdGUgbWFjaGluZSB1c2luZyB0aGUgSUQgb2YgdXNlcgorICAgTkFNRSB3aG9zZSBjbGVhcnRleHQgcGFzc3dvcmQgaXMgUEFTU1dELiAgSW4gKkZEMlAgdGhlIGRlc2NyaXB0b3IKKyAgIHRvIHRoZSBzb2NrZXQgZm9yIHRoZSBjb25uZWN0aW9uIGlzIHJldHVybmVkLiAgV2hlbiB0aGUgZnVuY3Rpb24KKyAgIHJldHVybnMgKkFIT1NUIGNvbnRhaW5zIHRoZSBvZmZpY2lhbCBob3N0IG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmV4ZWMgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYWhvc3QsIGludCBfX3Jwb3J0LAorCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGFzcywKKwkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jbWQsIGludCAqX19yZXN0cmljdCBfX2ZkMnApOworCisvKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHdoZXJlIHRoZSBwcm90b2NvbCBjYW4gYmUgc2VsZWN0ZWQKKyAgIGFuZCB3aGljaCB0aGVyZWZvcmUgY2FuIGJlIHVzZWQgZm9yIElQdjYuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcmV4ZWNfYWYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fYWhvc3QsIGludCBfX3Jwb3J0LAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGFzcywKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19jbWQsIGludCAqX19yZXN0cmljdCBfX2ZkMnAsCisJCSAgICAgc2FfZmFtaWx5X3QgX19hZik7CisKKy8qIENoZWNrIHdoZXRoZXIgdXNlciBSRU1VU0VSIG9uIHN5c3RlbSBSSE9TVCBpcyBhbGxvd2VkIHRvIGxvZ2luIGFzIExPQ1VTRVIuCisgICBJZiBTVVNFUiBpcyBub3QgemVybyB0aGUgdXNlciB0cmllcyB0byBiZWNvbWUgc3VwZXJ1c2VyLiAgUmV0dXJuIDAgaWYKKyAgIGl0IGlzIHBvc3NpYmxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJ1c2Vyb2sgKF9fY29uc3QgY2hhciAqX19yaG9zdCwgaW50IF9fc3VzZXIsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVtdXNlciwgX19jb25zdCBjaGFyICpfX2xvY3VzZXIpOworCisvKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IGZ1bmN0aW9uIHdoZXJlIHRoZSBwcm90b2NvbCBjYW4gYmUgc2VsZWN0ZWQKKyAgIGFuZCB3aGljaCB0aGVyZWZvcmUgY2FuIGJlIHVzZWQgZm9yIElQdjYuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcnVzZXJva19hZiAoX19jb25zdCBjaGFyICpfX3Job3N0LCBpbnQgX19zdXNlciwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZW11c2VyLCBfX2NvbnN0IGNoYXIgKl9fbG9jdXNlciwKKwkJICAgICAgIHNhX2ZhbWlseV90IF9fYWYpOworCisvKiBUcnkgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgcG9ydCwgcmV0dXJuaW5nIGEgZGVzY3JpcHRvciBmb3IgYSBzb2NrZXQgb3BlbmVkCisgICBhdCB0aGlzIHBvcnQgb3IgLTEgaWYgdW5zdWNjZXNzZnVsLiAgVGhlIHNlYXJjaCBmb3IgYW4gYXZhaWxhYmxlIHBvcnQKKyAgIHdpbGwgc3RhcnQgYXQgQUxQT1JUIGFuZCBjb250aW51ZXMgd2l0aCBsb3dlciBudW1iZXJzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHJyZXN2cG9ydCAoaW50ICpfX2FscG9ydCk7CisKKy8qIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgZnVuY3Rpb24gd2hlcmUgdGhlIHByb3RvY29sIGNhbiBiZSBzZWxlY3RlZAorICAgYW5kIHdoaWNoIHRoZXJlZm9yZSBjYW4gYmUgdXNlZCBmb3IgSVB2Ni4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBycmVzdnBvcnRfYWYgKGludCAqX19hbHBvcnQsIHNhX2ZhbWlseV90IF9fYWYpOworI2VuZGlmCisKKworLyogRXh0ZW5zaW9uIGZyb20gUE9TSVguMWcuICAqLworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBTdHJ1Y3R1cmUgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhZGRyZXNzIG9mIGEgc2VydmljZSBwcm92aWRlci4gICovCitzdHJ1Y3QgYWRkcmluZm8KK3sKKyAgaW50IGFpX2ZsYWdzOwkJCS8qIElucHV0IGZsYWdzLiAgKi8KKyAgaW50IGFpX2ZhbWlseTsJCS8qIFByb3RvY29sIGZhbWlseSBmb3Igc29ja2V0LiAgKi8KKyAgaW50IGFpX3NvY2t0eXBlOwkJLyogU29ja2V0IHR5cGUuICAqLworICBpbnQgYWlfcHJvdG9jb2w7CQkvKiBQcm90b2NvbCBmb3Igc29ja2V0LiAgKi8KKyAgc29ja2xlbl90IGFpX2FkZHJsZW47CQkvKiBMZW5ndGggb2Ygc29ja2V0IGFkZHJlc3MuICAqLworICBzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7CS8qIFNvY2tldCBhZGRyZXNzIGZvciBzb2NrZXQuICAqLworICBjaGFyICphaV9jYW5vbm5hbWU7CQkvKiBDYW5vbmljYWwgbmFtZSBmb3Igc2VydmljZSBsb2NhdGlvbi4gICovCisgIHN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogUG9pbnRlciB0byBuZXh0IGluIGxpc3QuICAqLworfTsKKworIyBpZmRlZiBfX1VTRV9HTlUKKy8qIFN0cnVjdHVyZSB1c2VkIGFzIGNvbnRyb2wgYmxvY2sgZm9yIGFzeW5jaHJvbm91cyBsb29rdXAuICAqLworc3RydWN0IGdhaWNiCit7CisgIGNvbnN0IGNoYXIgKmFyX25hbWU7CQkvKiBOYW1lIHRvIGxvb2sgdXAuICAqLworICBjb25zdCBjaGFyICphcl9zZXJ2aWNlOwkvKiBTZXJ2aWNlIG5hbWUuICAqLworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmFyX3JlcXVlc3Q7IC8qIEFkZGl0aW9uYWwgcmVxdWVzdCBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgc3RydWN0IGFkZHJpbmZvICphcl9yZXN1bHQ7CS8qIFBvaW50ZXIgdG8gcmVzdWx0LiAgKi8KKyAgLyogVGhlIGZvbGxvd2luZyBhcmUgaW50ZXJuYWwgZWxlbWVudHMuICAqLworICBpbnQgX19yZXR1cm47CisgIGludCBfX3VudXNlZFs1XTsKK307CisKKy8qIExvb2t1cCBtb2RlLiAgKi8KKyMgIGRlZmluZSBHQUlfV0FJVAkwCisjICBkZWZpbmUgR0FJX05PV0FJVAkxCisjIGVuZGlmCisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgYGFpX2ZsYWdzJyBmaWVsZCBpbiBgYWRkcmluZm8nIHN0cnVjdHVyZS4gICovCisjIGRlZmluZSBBSV9QQVNTSVZFCTB4MDAwMQkvKiBTb2NrZXQgYWRkcmVzcyBpcyBpbnRlbmRlZCBmb3IgYGJpbmQnLiAgKi8KKyMgZGVmaW5lIEFJX0NBTk9OTkFNRQkweDAwMDIJLyogUmVxdWVzdCBmb3IgY2Fub25pY2FsIG5hbWUuICAqLworIyBkZWZpbmUgQUlfTlVNRVJJQ0hPU1QJMHgwMDA0CS8qIERvbid0IHVzZSBuYW1lIHJlc29sdXRpb24uICAqLworIyBkZWZpbmUgQUlfVjRNQVBQRUQJMHgwMDA4CS8qIElQdjQgbWFwcGVkIGFkZHJlc3NlcyBhcmUgYWNjZXB0YWJsZS4gICovCisjIGRlZmluZSBBSV9BTEwJCTB4MDAxMAkvKiBSZXR1cm4gSVB2NCBtYXBwZWQgYW5kIElQdjYgYWRkcmVzc2VzLiAgKi8KKyMgZGVmaW5lIEFJX0FERFJDT05GSUcJMHgwMDIwCS8qIFVzZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgaG9zdCB0byBjaG9vc2UKKwkJCQkgICByZXR1cm5lZCBhZGRyZXNzIHR5cGUuLiAgKi8KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgQUlfSUROCTB4MDA0MAkvKiBJRE4gZW5jb2RlIGlucHV0IChhc3N1bWluZyBpdCBpcyBlbmNvZGVkCisJCQkJICAgaW4gdGhlIGN1cnJlbnQgbG9jYWxlJ3MgY2hhcmFjdGVyIHNldCkKKwkJCQkgICBiZWZvcmUgbG9va2luZyBpdCB1cC4gKi8KKyMgIGRlZmluZSBBSV9DQU5PTklETgkweDAwODAJLyogVHJhbnNsYXRlIGNhbm9uaWNhbCBuYW1lIGZyb20gSUROIGZvcm1hdC4gKi8KKyMgIGRlZmluZSBBSV9JRE5fQUxMT1dfVU5BU1NJR05FRCAweDAxMDAgLyogRG9uJ3QgcmVqZWN0IHVuYXNzaWduZWQgVW5pY29kZQorCQkJCQkgICAgY29kZSBwb2ludHMuICAqLworIyAgZGVmaW5lIEFJX0lETl9VU0VfU1REM19BU0NJSV9SVUxFUyAweDAyMDAgLyogVmFsaWRhdGUgc3RyaW5ncyBhY2NvcmRpbmcgdG8KKwkJCQkJCVNURDMgcnVsZXMuICAqLworIyBlbmRpZgorIyBkZWZpbmUgQUlfTlVNRVJJQ1NFUlYJMHgwNDAwCS8qIERvbid0IHVzZSBuYW1lIHJlc29sdXRpb24uICAqLworCisvKiBFcnJvciB2YWx1ZXMgZm9yIGBnZXRhZGRyaW5mbycgZnVuY3Rpb24uICAqLworIyBkZWZpbmUgRUFJX0JBREZMQUdTCSAgLTEJLyogSW52YWxpZCB2YWx1ZSBmb3IgYGFpX2ZsYWdzJyBmaWVsZC4gICovCisjIGRlZmluZSBFQUlfTk9OQU1FCSAgLTIJLyogTkFNRSBvciBTRVJWSUNFIGlzIHVua25vd24uICAqLworIyBkZWZpbmUgRUFJX0FHQUlOCSAgLTMJLyogVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiAgKi8KKyMgZGVmaW5lIEVBSV9GQUlMCSAgLTQJLyogTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXMuICAqLworIyBkZWZpbmUgRUFJX05PREFUQQkgIC01CS8qIE5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIE5BTUUuICAqLworIyBkZWZpbmUgRUFJX0ZBTUlMWQkgIC02CS8qIGBhaV9mYW1pbHknIG5vdCBzdXBwb3J0ZWQuICAqLworIyBkZWZpbmUgRUFJX1NPQ0tUWVBFCSAgLTcJLyogYGFpX3NvY2t0eXBlJyBub3Qgc3VwcG9ydGVkLiAgKi8KKyMgZGVmaW5lIEVBSV9TRVJWSUNFCSAgLTgJLyogU0VSVklDRSBub3Qgc3VwcG9ydGVkIGZvciBgYWlfc29ja3R5cGUnLiAgKi8KKyMgZGVmaW5lIEVBSV9BRERSRkFNSUxZCSAgLTkJLyogQWRkcmVzcyBmYW1pbHkgZm9yIE5BTUUgbm90IHN1cHBvcnRlZC4gICovCisjIGRlZmluZSBFQUlfTUVNT1JZCSAgLTEwCS8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuICAqLworIyBkZWZpbmUgRUFJX1NZU1RFTQkgIC0xMQkvKiBTeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gYGVycm5vJy4gICovCisjIGRlZmluZSBFQUlfT1ZFUkZMT1cJICAtMTIJLyogQXJndW1lbnQgYnVmZmVyIG92ZXJmbG93LiAgKi8KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgRUFJX0lOUFJPR1JFU1MgIC0xMDAJLyogUHJvY2Vzc2luZyByZXF1ZXN0IGluIHByb2dyZXNzLiAgKi8KKyMgIGRlZmluZSBFQUlfQ0FOQ0VMRUQJICAtMTAxCS8qIFJlcXVlc3QgY2FuY2VsZWQuICAqLworIyAgZGVmaW5lIEVBSV9OT1RDQU5DRUxFRCAtMTAyCS8qIFJlcXVlc3Qgbm90IGNhbmNlbGVkLiAgKi8KKyMgIGRlZmluZSBFQUlfQUxMRE9ORQkgIC0xMDMJLyogQWxsIHJlcXVlc3RzIGRvbmUuICAqLworIyAgZGVmaW5lIEVBSV9JTlRSCSAgLTEwNAkvKiBJbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4gICovCisjICBkZWZpbmUgRUFJX0lETl9FTkNPREUgIC0xMDUJLyogSUROIGVuY29kaW5nIGZhaWxlZC4gICovCisjIGVuZGlmCisKKyMgZGVmaW5lIE5JX01BWEhPU1QgICAgICAxMDI1CisjIGRlZmluZSBOSV9NQVhTRVJWICAgICAgMzIKKworIyBkZWZpbmUgTklfTlVNRVJJQ0hPU1QJMQkvKiBEb24ndCB0cnkgdG8gbG9vayB1cCBob3N0bmFtZS4gICovCisjIGRlZmluZSBOSV9OVU1FUklDU0VSViAyCS8qIERvbid0IGNvbnZlcnQgcG9ydCBudW1iZXIgdG8gbmFtZS4gICovCisjIGRlZmluZSBOSV9OT0ZRRE4JNAkvKiBPbmx5IHJldHVybiBub2RlbmFtZSBwb3J0aW9uLiAgKi8KKyMgZGVmaW5lIE5JX05BTUVSRVFECTgJLyogRG9uJ3QgcmV0dXJuIG51bWVyaWMgYWRkcmVzc2VzLiAgKi8KKyMgZGVmaW5lIE5JX0RHUkFNCTE2CS8qIExvb2sgdXAgVURQIHNlcnZpY2UgcmF0aGVyIHRoYW4gVENQLiAgKi8KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgTklfSUROCTMyCS8qIENvbnZlcnQgbmFtZSBmcm9tIElETiBmb3JtYXQuICAqLworIyAgZGVmaW5lIE5JX0lETl9BTExPV19VTkFTU0lHTkVEIDY0IC8qIERvbid0IHJlamVjdCB1bmFzc2lnbmVkIFVuaWNvZGUKKwkJCQkJY29kZSBwb2ludHMuICAqLworIyAgZGVmaW5lIE5JX0lETl9VU0VfU1REM19BU0NJSV9SVUxFUyAxMjggLyogVmFsaWRhdGUgc3RyaW5ncyBhY2NvcmRpbmcgdG8KKwkJCQkJICAgICBTVEQzIHJ1bGVzLiAgKi8KKyMgZW5kaWYKKworLyogVHJhbnNsYXRlIG5hbWUgb2YgYSBzZXJ2aWNlIGxvY2F0aW9uIGFuZC9vciBhIHNlcnZpY2UgbmFtZSB0byBzZXQgb2YKKyAgIHNvY2tldCBhZGRyZXNzZXMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRhZGRyaW5mbyAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NlcnZpY2UsCisJCQlfX2NvbnN0IHN0cnVjdCBhZGRyaW5mbyAqX19yZXN0cmljdCBfX3JlcSwKKwkJCXN0cnVjdCBhZGRyaW5mbyAqKl9fcmVzdHJpY3QgX19wYWkpOworCisvKiBGcmVlIGBhZGRyaW5mbycgc3RydWN0dXJlIEFJIGluY2x1ZGluZyBhc3NvY2lhdGVkIHN0b3JhZ2UuICAqLworZXh0ZXJuIHZvaWQgZnJlZWFkZHJpbmZvIChzdHJ1Y3QgYWRkcmluZm8gKl9fYWkpIF9fVEhST1c7CisKKy8qIENvbnZlcnQgZXJyb3IgcmV0dXJuIGZyb20gZ2V0YWRkcmluZm8oKSB0byBhIHN0cmluZy4gICovCitleHRlcm4gX19jb25zdCBjaGFyICpnYWlfc3RyZXJyb3IgKGludCBfX2Vjb2RlKSBfX1RIUk9XOworCisvKiBUcmFuc2xhdGUgYSBzb2NrZXQgYWRkcmVzcyB0byBhIGxvY2F0aW9uIGFuZCBzZXJ2aWNlIG5hbWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRuYW1laW5mbyAoX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKl9fcmVzdHJpY3QgX19zYSwKKwkJCXNvY2tsZW5fdCBfX3NhbGVuLCBjaGFyICpfX3Jlc3RyaWN0IF9faG9zdCwKKwkJCXNvY2tsZW5fdCBfX2hvc3RsZW4sIGNoYXIgKl9fcmVzdHJpY3QgX19zZXJ2LAorCQkJc29ja2xlbl90IF9fc2VydmxlbiwgdW5zaWduZWQgaW50IF9fZmxhZ3MpOworI2VuZGlmCS8qIFBPU0lYICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEVucXVldWUgRU5UIHJlcXVlc3RzIGZyb20gdGhlIExJU1QuICBJZiBNT0RFIGlzIEdBSV9XQUlUIHdhaXQgdW50aWwgYWxsCisgICByZXF1ZXN0cyBhcmUgaGFuZGxlZC4gIElmIFdBSVQgaXMgR0FJX05PV0FJVCByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIKKyAgIHF1ZXVlaW5nIHRoZSByZXF1ZXN0cyBhbmQgc2lnbmFsIGNvbXBsZXRpb24gYWNjb3JkaW5nIHRvIFNJRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRhZGRyaW5mb19hIChpbnQgX19tb2RlLCBzdHJ1Y3QgZ2FpY2IgKl9fbGlzdFtfX3Jlc3RyaWN0X2Fycl0sCisJCQkgIGludCBfX2VudCwgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fc2lnKTsKKworLyogU3VzcGVuZCBleGVjdXRpb24gb2YgdGhlIHRocmVhZCB1bnRpbCBhdCBsZWFzdCBvbmUgb2YgdGhlIEVOVCByZXF1ZXN0cworICAgaW4gTElTVCBpcyBoYW5kbGVkLiAgSWYgVElNRU9VVCBpcyBub3QgYSBudWxsIHBvaW50ZXIgaXQgc3BlY2lmaWVzIHRoZQorICAgbG9uZ2VzdCB0aW1lIHRoZSBmdW5jdGlvbiBrZWVwcyB3YWl0aW5nIGJlZm9yZSByZXR1cm5pbmcgd2l0aCBhbiBlcnJvci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnYWlfc3VzcGVuZCAoX19jb25zdCBzdHJ1Y3QgZ2FpY2IgKl9fY29uc3QgX19saXN0W10sIGludCBfX2VudCwKKwkJCV9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQpOworCisvKiBHZXQgdGhlIGVycm9yIHN0YXR1cyBvZiB0aGUgcmVxdWVzdCBSRVEuICAqLworZXh0ZXJuIGludCBnYWlfZXJyb3IgKHN0cnVjdCBnYWljYiAqX19yZXEpIF9fVEhST1c7CisKKy8qIENhbmNlbCB0aGUgcmVxdWVzdHMgYXNzb2NpYXRlZCB3aXRoIEdBSUNCUC4gICovCitleHRlcm4gaW50IGdhaV9jYW5jZWwgKHN0cnVjdCBnYWljYiAqX19nYWljYnApIF9fVEhST1c7CisjZW5kaWYJLyogR05VICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBuZXRkYi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGVjb25ldC9lYy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRlY29uZXQvZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjE2MDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRlY29uZXQvZWMuaApAQCAtMCwwICsxLDUyIEBACisvKiBEZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggTGludXggQUZfRUNPTkVUIHNvY2tldHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVEVDT05FVF9FQ19ICisjZGVmaW5lIF9ORVRFQ09ORVRfRUNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPGJpdHMvc29ja2FkZHIuaD4KKworc3RydWN0IGVjX2FkZHIKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgc3RhdGlvbjsJCS8qIFN0YXRpb24gbnVtYmVyLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG5ldDsJCQkvKiBOZXR3b3JrIG51bWJlci4gICovCisgIH07CisKK3N0cnVjdCBzb2NrYWRkcl9lYworICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNlY18pOworICAgIHVuc2lnbmVkIGNoYXIgcG9ydDsJCQkvKiBQb3J0IG51bWJlci4gICovCisgICAgdW5zaWduZWQgY2hhciBjYjsJCQkvKiBDb250cm9sL2ZsYWcgYnl0ZS4gICovCisgICAgdW5zaWduZWQgY2hhciB0eXBlOwkJCS8qIFR5cGUgb2YgbWVzc2FnZS4gICovCisgICAgc3RydWN0IGVjX2FkZHIgYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIGNvb2tpZTsKKyAgfTsKKworI2RlZmluZSBFQ1RZUEVfUEFDS0VUX1JFQ0VJVkVECQkwCS8qIFBhY2tldCByZWNlaXZlZCAqLworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfU1RBVFVTCQkweDEwCS8qIFRyYW5zbWl0IGNvbXBsZXRlZCAqLworCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9PSwkJMQorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9UX0xJU1RFTklORwkyCisjZGVmaW5lIEVDVFlQRV9UUkFOU01JVF9ORVRfRVJST1IJMworI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9fQ0xPQ0sJNAorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTElORV9KQU1NRUQJNQorI2RlZmluZSBFQ1RZUEVfVFJBTlNNSVRfTk9UX1BSRVNFTlQJNgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9ldGhlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ODBlMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9ldGhlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIEZ1bmN0aW9ucyBmb3Igc3RvcmluZyBFdGhlcm5ldCBhZGRyZXNzZXMgaW4gQVNDSUkgYW5kIG1hcHBpbmcgdG8gaG9zdG5hbWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRJTkVUX0VUSEVSX0gKKyNkZWZpbmUgX05FVElORVRfRVRIRVJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgZGVmaW5pdGlvbiBvZiBgc3RydWN0IGV0aGVyX2FkZHInLiAgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogQ29udmVydCA0OCBiaXQgRXRoZXJuZXQgQUREUmVzcyB0byBBU0NJSS4gICovCitleHRlcm4gY2hhciAqZXRoZXJfbnRvYSAoX19jb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqX19hZGRyKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKmV0aGVyX250b2FfciAoX19jb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqX19hZGRyLCBjaGFyICpfX2J1ZikKKyAgICAgX19USFJPVzsKKworLyogQ29udmVydCBBU0NJSSBzdHJpbmcgUyB0byA0OCBiaXQgRXRoZXJuZXQgYWRkcmVzcy4gICovCitleHRlcm4gc3RydWN0IGV0aGVyX2FkZHIgKmV0aGVyX2F0b24gKF9fY29uc3QgY2hhciAqX19hc2MpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IGV0aGVyX2FkZHIgKmV0aGVyX2F0b25fciAoX19jb25zdCBjaGFyICpfX2FzYywKKwkJCQkJc3RydWN0IGV0aGVyX2FkZHIgKl9fYWRkcikgX19USFJPVzsKKworLyogTWFwIDQ4IGJpdCBFdGhlcm5ldCBudW1iZXIgQUREUiB0byBIT1NUTkFNRS4gICovCitleHRlcm4gaW50IGV0aGVyX250b2hvc3QgKGNoYXIgKl9faG9zdG5hbWUsIF9fY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKl9fYWRkcikKKyAgICAgX19USFJPVzsKKworLyogTWFwIEhPU1ROQU1FIHRvIDQ4IGJpdCBFdGhlcm5ldCBhZGRyZXNzLiAgKi8KK2V4dGVybiBpbnQgZXRoZXJfaG9zdHRvbiAoX19jb25zdCBjaGFyICpfX2hvc3RuYW1lLCBzdHJ1Y3QgZXRoZXJfYWRkciAqX19hZGRyKQorICAgICBfX1RIUk9XOworCisvKiBTY2FuIExJTkUgYW5kIHNldCBBRERSIGFuZCBIT1NUTkFNRS4gICovCitleHRlcm4gaW50IGV0aGVyX2xpbmUgKF9fY29uc3QgY2hhciAqX19saW5lLCBzdHJ1Y3QgZXRoZXJfYWRkciAqX19hZGRyLAorCQkgICAgICAgY2hhciAqX19ob3N0bmFtZSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5ldGluZXQvZXRoZXIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2ljbXA2LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWNtcDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2IxYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2ljbXA2LmgKQEAgLTAsMCArMSwzNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LDIwMDAsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JQ01QNl9ICisjZGVmaW5lIF9ORVRJTkVUX0lDTVA2X0ggMQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNkZWZpbmUgSUNNUDZfRklMVEVSIDEKKworI2RlZmluZSBJQ01QNl9GSUxURVJfQkxPQ0sJCTEKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1BBU1MJCTIKKyNkZWZpbmUgSUNNUDZfRklMVEVSX0JMT0NLT1RIRVJTCTMKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1BBU1NPTkxZCQk0CisKK3N0cnVjdCBpY21wNl9maWx0ZXIKKyAgeworICAgIHVpbnQzMl90IGljbXA2X2ZpbHRbOF07CisgIH07CisKK3N0cnVjdCBpY21wNl9oZHIKKyAgeworICAgIHVpbnQ4X3QgICAgIGljbXA2X3R5cGU7ICAgLyogdHlwZSBmaWVsZCAqLworICAgIHVpbnQ4X3QgICAgIGljbXA2X2NvZGU7ICAgLyogY29kZSBmaWVsZCAqLworICAgIHVpbnQxNl90ICAgIGljbXA2X2Nrc3VtOyAgLyogY2hlY2tzdW0gZmllbGQgKi8KKyAgICB1bmlvbgorICAgICAgeworCXVpbnQzMl90ICBpY21wNl91bl9kYXRhMzJbMV07IC8qIHR5cGUtc3BlY2lmaWMgZmllbGQgKi8KKwl1aW50MTZfdCAgaWNtcDZfdW5fZGF0YTE2WzJdOyAvKiB0eXBlLXNwZWNpZmljIGZpZWxkICovCisJdWludDhfdCAgIGljbXA2X3VuX2RhdGE4WzRdOyAgLyogdHlwZS1zcGVjaWZpYyBmaWVsZCAqLworICAgICAgfSBpY21wNl9kYXRhdW47CisgIH07CisKKyNkZWZpbmUgaWNtcDZfZGF0YTMyICAgIGljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhMzIKKyNkZWZpbmUgaWNtcDZfZGF0YTE2ICAgIGljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhMTYKKyNkZWZpbmUgaWNtcDZfZGF0YTggICAgIGljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhOAorI2RlZmluZSBpY21wNl9wcHRyICAgICAgaWNtcDZfZGF0YTMyWzBdICAvKiBwYXJhbWV0ZXIgcHJvYiAqLworI2RlZmluZSBpY21wNl9tdHUgICAgICAgaWNtcDZfZGF0YTMyWzBdICAvKiBwYWNrZXQgdG9vIGJpZyAqLworI2RlZmluZSBpY21wNl9pZCAgICAgICAgaWNtcDZfZGF0YTE2WzBdICAvKiBlY2hvIHJlcXVlc3QvcmVwbHkgKi8KKyNkZWZpbmUgaWNtcDZfc2VxICAgICAgIGljbXA2X2RhdGExNlsxXSAgLyogZWNobyByZXF1ZXN0L3JlcGx5ICovCisjZGVmaW5lIGljbXA2X21heGRlbGF5ICBpY21wNl9kYXRhMTZbMF0gIC8qIG1jYXN0IGdyb3VwIG1lbWJlcnNoaXAgKi8KKworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSCAgICAgICAgICAgICAxCisjZGVmaW5lIElDTVA2X1BBQ0tFVF9UT09fQklHICAgICAgICAgIDIKKyNkZWZpbmUgSUNNUDZfVElNRV9FWENFRURFRCAgICAgICAgICAgMworI2RlZmluZSBJQ01QNl9QQVJBTV9QUk9CICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgSUNNUDZfSU5GT01TR19NQVNLICAweDgwICAgIC8qIGFsbCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgSUNNUDZfRUNIT19SRVFVRVNUICAgICAgICAgIDEyOAorI2RlZmluZSBJQ01QNl9FQ0hPX1JFUExZICAgICAgICAgICAgMTI5CisjZGVmaW5lIE1MRF9MSVNURU5FUl9RVUVSWSAgICAgICAgICAxMzAKKyNkZWZpbmUgTUxEX0xJU1RFTkVSX1JFUE9SVCAgICAgICAgIDEzMQorI2RlZmluZSBNTERfTElTVEVORVJfUkVEVUNUSU9OICAgICAgMTMyCisKKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURSAgICAgMCAvKiBubyByb3V0ZSB0byBkZXN0aW5hdGlvbiAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTiAgICAgICAxIC8qIGNvbW11bmljYXRpb24gd2l0aCBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkbWluaXN0cmF0aXZlbHkgcHJvaGliaXRlZCAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9CRVlPTkRTQ09QRSAyIC8qIGJleW9uZCBzY29wZSBvZiBzb3VyY2UgYWRkcmVzcyAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9BRERSICAgICAgICAzIC8qIGFkZHJlc3MgdW5yZWFjaGFibGUgKi8KKyNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUICAgICAgNCAvKiBiYWQgcG9ydCAqLworCisjZGVmaW5lIElDTVA2X1RJTUVfRVhDRUVEX1RSQU5TSVQgICAgIDAgLyogSG9wIExpbWl0ID09IDAgaW4gdHJhbnNpdCAqLworI2RlZmluZSBJQ01QNl9USU1FX0VYQ0VFRF9SRUFTU0VNQkxZICAxIC8qIFJlYXNzZW1ibHkgdGltZSBvdXQgKi8KKworI2RlZmluZSBJQ01QNl9QQVJBTVBST0JfSEVBREVSICAgICAgICAwIC8qIGVycm9uZW91cyBoZWFkZXIgZmllbGQgKi8KKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX05FWFRIRUFERVIgICAgMSAvKiB1bnJlY29nbml6ZWQgTmV4dCBIZWFkZXIgKi8KKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX09QVElPTiAgICAgICAgMiAvKiB1bnJlY29nbml6ZWQgSVB2NiBvcHRpb24gKi8KKworI2RlZmluZSBJQ01QNl9GSUxURVJfV0lMTFBBU1ModHlwZSwgZmlsdGVycCkgXAorCSgoKChmaWx0ZXJwKS0+aWNtcDZfZmlsdFsodHlwZSkgPj4gNV0pICYgKDEgPDwgKCh0eXBlKSAmIDMxKSkpID09IDApCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1dJTExCTE9DSyh0eXBlLCBmaWx0ZXJwKSBcCisJKCgoKGZpbHRlcnApLT5pY21wNl9maWx0Wyh0eXBlKSA+PiA1XSkgJiAoMSA8PCAoKHR5cGUpICYgMzEpKSkgIT0gMCkKKworI2RlZmluZSBJQ01QNl9GSUxURVJfU0VUUEFTUyh0eXBlLCBmaWx0ZXJwKSBcCisJKCgoKGZpbHRlcnApLT5pY21wNl9maWx0Wyh0eXBlKSA+PiA1XSkgJj0gfigxIDw8ICgodHlwZSkgJiAzMSkpKSkKKworI2RlZmluZSBJQ01QNl9GSUxURVJfU0VUQkxPQ0sodHlwZSwgZmlsdGVycCkgXAorCSgoKChmaWx0ZXJwKS0+aWNtcDZfZmlsdFsodHlwZSkgPj4gNV0pIHw9ICAoMSA8PCAoKHR5cGUpICYgMzEpKSkpCisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVFBBU1NBTEwoZmlsdGVycCkgXAorCW1lbXNldCAoZmlsdGVycCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaWNtcDZfZmlsdGVyKSk7CisKKyNkZWZpbmUgSUNNUDZfRklMVEVSX1NFVEJMT0NLQUxMKGZpbHRlcnApIFwKKwltZW1zZXQgKGZpbHRlcnAsIDB4RkYsIHNpemVvZiAoc3RydWN0IGljbXA2X2ZpbHRlcikpOworCisjZGVmaW5lIE5EX1JPVVRFUl9TT0xJQ0lUICAgICAgICAgICAxMzMKKyNkZWZpbmUgTkRfUk9VVEVSX0FEVkVSVCAgICAgICAgICAgIDEzNAorI2RlZmluZSBORF9ORUlHSEJPUl9TT0xJQ0lUICAgICAgICAgMTM1CisjZGVmaW5lIE5EX05FSUdIQk9SX0FEVkVSVCAgICAgICAgICAxMzYKKyNkZWZpbmUgTkRfUkVESVJFQ1QgICAgICAgICAgICAgICAgIDEzNworCitzdHJ1Y3QgbmRfcm91dGVyX3NvbGljaXQgICAgICAvKiByb3V0ZXIgc29saWNpdGF0aW9uICovCisgIHsKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICBuZF9yc19oZHI7CisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX3JzX3R5cGUgICAgICAgICAgICAgICBuZF9yc19oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9yc19jb2RlICAgICAgICAgICAgICAgbmRfcnNfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfcnNfY2tzdW0gICAgICAgICAgICAgIG5kX3JzX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9yc19yZXNlcnZlZCAgICAgICAgICAgbmRfcnNfaGRyLmljbXA2X2RhdGEzMlswXQorCitzdHJ1Y3QgbmRfcm91dGVyX2FkdmVydCAgICAgICAvKiByb3V0ZXIgYWR2ZXJ0aXNlbWVudCAqLworICB7CisgICAgc3RydWN0IGljbXA2X2hkciAgbmRfcmFfaGRyOworICAgIHVpbnQzMl90ICAgbmRfcmFfcmVhY2hhYmxlOyAgIC8qIHJlYWNoYWJsZSB0aW1lICovCisgICAgdWludDMyX3QgICBuZF9yYV9yZXRyYW5zbWl0OyAgLyogcmV0cmFuc21pdCB0aW1lciAqLworICAgIC8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworI2RlZmluZSBuZF9yYV90eXBlICAgICAgICAgICAgICAgbmRfcmFfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmRfcmFfY29kZSAgICAgICAgICAgICAgIG5kX3JhX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JhX2Nrc3VtICAgICAgICAgICAgICBuZF9yYV9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfcmFfY3VyaG9wbGltaXQgICAgICAgIG5kX3JhX2hkci5pY21wNl9kYXRhOFswXQorI2RlZmluZSBuZF9yYV9mbGFnc19yZXNlcnZlZCAgICAgbmRfcmFfaGRyLmljbXA2X2RhdGE4WzFdCisjZGVmaW5lIE5EX1JBX0ZMQUdfTUFOQUdFRCAgICAgICAweDgwCisjZGVmaW5lIE5EX1JBX0ZMQUdfT1RIRVIgICAgICAgICAweDQwCisjZGVmaW5lIE5EX1JBX0ZMQUdfSE9NRV9BR0VOVCAgICAweDIwCisjZGVmaW5lIG5kX3JhX3JvdXRlcl9saWZldGltZSAgICBuZF9yYV9oZHIuaWNtcDZfZGF0YTE2WzFdCisKK3N0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0ICAgIC8qIG5laWdoYm9yIHNvbGljaXRhdGlvbiAqLworICB7CisgICAgc3RydWN0IGljbXA2X2hkciAgbmRfbnNfaGRyOworICAgIHN0cnVjdCBpbjZfYWRkciAgIG5kX25zX3RhcmdldDsgLyogdGFyZ2V0IGFkZHJlc3MgKi8KKyAgICAvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCisgIH07CisKKyNkZWZpbmUgbmRfbnNfdHlwZSAgICAgICAgICAgICAgIG5kX25zX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX25zX2NvZGUgICAgICAgICAgICAgICBuZF9uc19oZHIuaWNtcDZfY29kZQorI2RlZmluZSBuZF9uc19ja3N1bSAgICAgICAgICAgICAgbmRfbnNfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIG5kX25zX3Jlc2VydmVkICAgICAgICAgICBuZF9uc19oZHIuaWNtcDZfZGF0YTMyWzBdCisKK3N0cnVjdCBuZF9uZWlnaGJvcl9hZHZlcnQgICAgIC8qIG5laWdoYm9yIGFkdmVydGlzZW1lbnQgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgIG5kX25hX2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICBuZF9uYV90YXJnZXQ7IC8qIHRhcmdldCBhZGRyZXNzICovCisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX25hX3R5cGUgICAgICAgICAgICAgICBuZF9uYV9oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9uYV9jb2RlICAgICAgICAgICAgICAgbmRfbmFfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfbmFfY2tzdW0gICAgICAgICAgICAgIG5kX25hX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9uYV9mbGFnc19yZXNlcnZlZCAgICAgbmRfbmFfaGRyLmljbXA2X2RhdGEzMlswXQorI2lmICAgICBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKyNkZWZpbmUgTkRfTkFfRkxBR19ST1VURVIgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTkRfTkFfRkxBR19TT0xJQ0lURUQgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTkRfTkFfRkxBR19PVkVSUklERSAgICAgIDB4MjAwMDAwMDAKKyNlbHNlICAgLyogQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOICovCisjZGVmaW5lIE5EX05BX0ZMQUdfUk9VVEVSICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE5EX05BX0ZMQUdfU09MSUNJVEVEICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5EX05BX0ZMQUdfT1ZFUlJJREUgICAgICAweDAwMDAwMDIwCisjZW5kaWYKKworc3RydWN0IG5kX3JlZGlyZWN0ICAgICAgICAgICAgLyogcmVkaXJlY3QgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgIG5kX3JkX2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICBuZF9yZF90YXJnZXQ7IC8qIHRhcmdldCBhZGRyZXNzICovCisgICAgc3RydWN0IGluNl9hZGRyICAgbmRfcmRfZHN0OyAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgICAgLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisjZGVmaW5lIG5kX3JkX3R5cGUgICAgICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9yZF9jb2RlICAgICAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmRfcmRfY2tzdW0gICAgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9yZF9yZXNlcnZlZCAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2RhdGEzMlswXQorCitzdHJ1Y3QgbmRfb3B0X2hkciAgICAgICAgICAgICAvKiBOZWlnaGJvciBkaXNjb3Zlcnkgb3B0aW9uIGhlYWRlciAqLworICB7CisgICAgdWludDhfdCAgbmRfb3B0X3R5cGU7CisgICAgdWludDhfdCAgbmRfb3B0X2xlbjsgICAgICAgIC8qIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgLyogZm9sbG93ZWQgYnkgb3B0aW9uIHNwZWNpZmljIGRhdGEgKi8KKyAgfTsKKworI2RlZmluZSBORF9PUFRfU09VUkNFX0xJTktBRERSCQkxCisjZGVmaW5lIE5EX09QVF9UQVJHRVRfTElOS0FERFIJCTIKKyNkZWZpbmUgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTgkzCisjZGVmaW5lIE5EX09QVF9SRURJUkVDVEVEX0hFQURFUgk0CisjZGVmaW5lIE5EX09QVF9NVFUJCQk1CisjZGVmaW5lIE5EX09QVF9SVFJfQURWX0lOVEVSVkFMCQk3CisjZGVmaW5lIE5EX09QVF9IT01FX0FHRU5UX0lORk8JCTgKKworc3RydWN0IG5kX29wdF9wcmVmaXhfaW5mbyAgICAgLyogcHJlZml4IGluZm9ybWF0aW9uICovCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X3BpX3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9waV9sZW47CisgICAgdWludDhfdCAgIG5kX29wdF9waV9wcmVmaXhfbGVuOworICAgIHVpbnQ4X3QgICBuZF9vcHRfcGlfZmxhZ3NfcmVzZXJ2ZWQ7CisgICAgdWludDMyX3QgIG5kX29wdF9waV92YWxpZF90aW1lOworICAgIHVpbnQzMl90ICBuZF9vcHRfcGlfcHJlZmVycmVkX3RpbWU7CisgICAgdWludDMyX3QgIG5kX29wdF9waV9yZXNlcnZlZDI7CisgICAgc3RydWN0IGluNl9hZGRyICBuZF9vcHRfcGlfcHJlZml4OworICB9OworCisjZGVmaW5lIE5EX09QVF9QSV9GTEFHX09OTElOSwkweDgwCisjZGVmaW5lIE5EX09QVF9QSV9GTEFHX0FVVE8JMHg0MAorI2RlZmluZSBORF9PUFRfUElfRkxBR19SQUREUgkweDIwCisKK3N0cnVjdCBuZF9vcHRfcmRfaGRyICAgICAgICAgIC8qIHJlZGlyZWN0ZWQgaGVhZGVyICovCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X3JoX3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9yaF9sZW47CisgICAgdWludDE2X3QgIG5kX29wdF9yaF9yZXNlcnZlZDE7CisgICAgdWludDMyX3QgIG5kX29wdF9yaF9yZXNlcnZlZDI7CisgICAgLyogZm9sbG93ZWQgYnkgSVAgaGVhZGVyIGFuZCBkYXRhICovCisgIH07CisKK3N0cnVjdCBuZF9vcHRfbXR1ICAgICAgICAgICAgIC8qIE1UVSBvcHRpb24gKi8KKyAgeworICAgIHVpbnQ4X3QgICBuZF9vcHRfbXR1X3R5cGU7CisgICAgdWludDhfdCAgIG5kX29wdF9tdHVfbGVuOworICAgIHVpbnQxNl90ICBuZF9vcHRfbXR1X3Jlc2VydmVkOworICAgIHVpbnQzMl90ICBuZF9vcHRfbXR1X210dTsKKyAgfTsKKworc3RydWN0IG1sZF9oZHIKKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgICAgbWxkX2ljbXA2X2hkcjsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICAgIG1sZF9hZGRyOyAvKiBtdWx0aWNhc3QgYWRkcmVzcyAqLworICB9OworCisjZGVmaW5lIG1sZF90eXBlICAgICAgICBtbGRfaWNtcDZfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbWxkX2NvZGUgICAgICAgIG1sZF9pY21wNl9oZHIuaWNtcDZfY29kZQorI2RlZmluZSBtbGRfY2tzdW0gICAgICAgbWxkX2ljbXA2X2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBtbGRfbWF4ZGVsYXkgICAgbWxkX2ljbXA2X2hkci5pY21wNl9kYXRhMTZbMF0KKyNkZWZpbmUgbWxkX3Jlc2VydmVkICAgIG1sZF9pY21wNl9oZHIuaWNtcDZfZGF0YTE2WzFdCisKKyNkZWZpbmUgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HICAgIDEzOAorCitzdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtICAgIC8qIHJvdXRlciByZW51bWJlcmluZyBoZWFkZXIgKi8KKyAgeworICAgIHN0cnVjdCBpY21wNl9oZHIgICAgcnJfaGRyOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnJfc2VnbnVtOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnJfZmxhZ3M7CisgICAgdWludDE2X3QgICAgICAgICAgICBycl9tYXhkZWxheTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJyX3Jlc2VydmVkOworICB9OworCisjZGVmaW5lIHJyX3R5cGUJCXJyX2hkci5pY21wNl90eXBlCisjZGVmaW5lIHJyX2NvZGUgICAgICAgICBycl9oZHIuaWNtcDZfY29kZQorI2RlZmluZSBycl9ja3N1bSAgICAgICAgcnJfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIHJyX3NlcW51bSAgICAgICBycl9oZHIuaWNtcDZfZGF0YTMyWzBdCisKKy8qIFJvdXRlciByZW51bWJlcmluZyBmbGFncyAqLworI2RlZmluZSBJQ01QNl9SUl9GTEFHU19URVNUICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfUkVRUkVTVUxUICAgICAgICAweDQwCisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX0ZPUkNFQVBQTFkgICAgICAgMHgyMAorI2RlZmluZSBJQ01QNl9SUl9GTEFHU19TUEVDU0lURSAgICAgICAgIDB4MTAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfUFJFVkRPTkUgICAgICAgICAweDA4CisKK3N0cnVjdCBycl9wY29fbWF0Y2ggICAgLyogbWF0Y2ggcHJlZml4IHBhcnQgKi8KKyAgeworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX2NvZGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBycG1fbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX29yZGluYWw7CisgICAgdWludDhfdCAgICAgICAgICAgICBycG1fbWF0Y2hsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICBycG1fbWlubGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnBtX21heGxlbjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHJwbV9yZXNlcnZlZDsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICAgIHJwbV9wcmVmaXg7CisgIH07CisKKy8qIFBDTyBjb2RlIHZhbHVlcyAqLworI2RlZmluZSBSUE1fUENPX0FERCAgICAgICAgICAgICAxCisjZGVmaW5lIFJQTV9QQ09fQ0hBTkdFICAgICAgICAgIDIKKyNkZWZpbmUgUlBNX1BDT19TRVRHTE9CQUwgICAgICAgMworCitzdHJ1Y3QgcnJfcGNvX3VzZSAgICAgIC8qIHVzZSBwcmVmaXggcGFydCAqLworICB7CisgICAgdWludDhfdCAgICAgICAgICAgICBycHVfdXNlbGVuOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnB1X2tlZXBsZW47CisgICAgdWludDhfdCAgICAgICAgICAgICBycHVfcmFtYXNrOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgcnB1X3JhZmxhZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICBycHVfdmx0aW1lOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnB1X3BsdGltZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJwdV9mbGFnczsKKyAgICBzdHJ1Y3QgaW42X2FkZHIgICAgIHJwdV9wcmVmaXg7CisgIH07CisKKyNkZWZpbmUgSUNNUDZfUlJfUENPVVNFX1JBRkxBR1NfT05MSU5LICAweDIwCisjZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9SQUZMQUdTX0FVVE8gICAgMHgxMAorCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlZMVElNRSAweDgwMDAwMDAwCisjIGRlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlBMVElNRSAweDQwMDAwMDAwCisjZWxpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9GTEFHU19ERUNSVkxUSU1FIDB4ODAKKyMgZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9GTEFHU19ERUNSUExUSU1FIDB4NDAKKyNlbmRpZgorCitzdHJ1Y3QgcnJfcmVzdWx0ICAgICAgIC8qIHJvdXRlciByZW51bWJlcmluZyByZXN1bHQgbWVzc2FnZSAqLworICB7CisgICAgdWludDE2X3QgICAgICAgICAgICBycnJfZmxhZ3M7CisgICAgdWludDhfdCAgICAgICAgICAgICBycnJfb3JkaW5hbDsKKyAgICB1aW50OF90ICAgICAgICAgICAgIHJycl9tYXRjaGVkbGVuOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnJyX2lmaWQ7CisgICAgc3RydWN0IGluNl9hZGRyICAgICBycnJfcHJlZml4OworICB9OworCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJQ01QNl9SUl9SRVNVTFRfRkxBR1NfT09CICAgICAgIDB4MDAwMgorIyBkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX0ZPUkJJRERFTiAweDAwMDEKKyNlbGlmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorIyBkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX09PQiAgICAgICAweDAyMDAKKyMgZGVmaW5lIElDTVA2X1JSX1JFU1VMVF9GTEFHU19GT1JCSURERU4gMHgwMTAwCisjZW5kaWYKKworLyogTW9iaWxlIElQdjYgZXh0ZW5zaW9uOiBBZHZlcnRpc2VtZW50IEludGVydmFsLiAgKi8KK3N0cnVjdCBuZF9vcHRfYWR2X2ludGVydmFsCisgIHsKKyAgICB1aW50OF90ICAgbmRfb3B0X2Fkdl9pbnRlcnZhbF90eXBlOworICAgIHVpbnQ4X3QgICBuZF9vcHRfYWR2X2ludGVydmFsX2xlbjsKKyAgICB1aW50MTZfdCAgbmRfb3B0X2Fkdl9pbnRlcnZhbF9yZXNlcnZlZDsKKyAgICB1aW50MzJfdCAgbmRfb3B0X2Fkdl9pbnRlcnZhbF9pdmFsOworICB9OworCisvKiBNb2JpbGUgSVB2NiBleHRlbnNpb246IEhvbWUgQWdlbnQgSW5mby4gICovCitzdHJ1Y3QgbmRfb3B0X2hvbWVfYWdlbnRfaW5mbworICB7CisgICAgdWludDhfdCAgIG5kX29wdF9ob21lX2FnZW50X2luZm9fdHlwZTsKKyAgICB1aW50OF90ICAgbmRfb3B0X2hvbWVfYWdlbnRfaW5mb19sZW47CisgICAgdWludDE2X3QgIG5kX29wdF9ob21lX2FnZW50X2luZm9fcmVzZXJ2ZWQ7CisgICAgaW50MTZfdCAgIG5kX29wdF9ob21lX2FnZW50X2luZm9fcHJlZmVyZW5jZTsKKyAgICB1aW50MTZfdCAgbmRfb3B0X2hvbWVfYWdlbnRfaW5mb19saWZldGltZTsKKyAgfTsKKworI2VuZGlmIC8qIG5ldGluZXQvaWNtcHY2LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkYjU5YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZl9ldGhlci5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRJTkVUX0lGX0VUSEVSX0gKKworI2RlZmluZSBfX05FVElORVRfSUZfRVRIRVJfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogR2V0IGRlZmluaXRpb25zIGZyb20ga2VybmVsIGhlYWRlciBmaWxlLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorCisjaWZkZWYgX19VU0VfQlNECisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlmX2V0aGVyLmgJOC4zIChCZXJrZWxleSkgNS8yLzk1CisgKgkkRnJlZUJTRCQKKyAqLworCisjaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCitfX0JFR0lOX0RFQ0xTCisvKgorICogRXRoZXJuZXQgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sLgorICoKKyAqIFNlZSBSRkMgODI2IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4gIFN0cnVjdHVyZSBiZWxvdyBpcyBhZGFwdGVkCisgKiB0byByZXNvbHZpbmcgaW50ZXJuZXQgYWRkcmVzc2VzLiAgRmllbGQgbmFtZXMgdXNlZCBjb3JyZXNwb25kIHRvCisgKiBSRkMgODI2LgorICovCitzdHJ1Y3QJZXRoZXJfYXJwIHsKKwlzdHJ1Y3QJYXJwaGRyIGVhX2hkcjsJCS8qIGZpeGVkLXNpemUgaGVhZGVyICovCisJdV9pbnQ4X3QgYXJwX3NoYVtFVEhfQUxFTl07CS8qIHNlbmRlciBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9pbnQ4X3QgYXJwX3NwYVs0XTsJCS8qIHNlbmRlciBwcm90b2NvbCBhZGRyZXNzICovCisJdV9pbnQ4X3QgYXJwX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9pbnQ4X3QgYXJwX3RwYVs0XTsJCS8qIHRhcmdldCBwcm90b2NvbCBhZGRyZXNzICovCit9OworI2RlZmluZQlhcnBfaHJkCWVhX2hkci5hcl9ocmQKKyNkZWZpbmUJYXJwX3BybwllYV9oZHIuYXJfcHJvCisjZGVmaW5lCWFycF9obG4JZWFfaGRyLmFyX2hsbgorI2RlZmluZQlhcnBfcGxuCWVhX2hkci5hcl9wbG4KKyNkZWZpbmUJYXJwX29wCWVhX2hkci5hcl9vcAorCisvKgorICogTWFjcm8gdG8gbWFwIGFuIElQIG11bHRpY2FzdCBhZGRyZXNzIHRvIGFuIEV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzLgorICogVGhlIGhpZ2gtb3JkZXIgMjUgYml0cyBvZiB0aGUgRXRoZXJuZXQgYWRkcmVzcyBhcmUgc3RhdGljYWxseSBhc3NpZ25lZCwKKyAqIGFuZCB0aGUgbG93LW9yZGVyIDIzIGJpdHMgYXJlIHRha2VuIGZyb20gdGhlIGxvdyBlbmQgb2YgdGhlIElQIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgRVRIRVJfTUFQX0lQX01VTFRJQ0FTVChpcGFkZHIsIGVuYWRkcikgXAorCS8qIHN0cnVjdCBpbl9hZGRyICppcGFkZHI7ICovIFwKKwkvKiB1X2NoYXIgZW5hZGRyW0VUSF9BTEVOXTsJICAgKi8gXAoreyBcCisJKGVuYWRkcilbMF0gPSAweDAxOyBcCisJKGVuYWRkcilbMV0gPSAweDAwOyBcCisJKGVuYWRkcilbMl0gPSAweDVlOyBcCisJKGVuYWRkcilbM10gPSAoKHVfaW50OF90ICopaXBhZGRyKVsxXSAmIDB4N2Y7IFwKKwkoZW5hZGRyKVs0XSA9ICgodV9pbnQ4X3QgKilpcGFkZHIpWzJdOyBcCisJKGVuYWRkcilbNV0gPSAoKHVfaW50OF90ICopaXBhZGRyKVszXTsgXAorfQorCitfX0VORF9ERUNMUworI2VuZGlmIC8qIF9fVVNFX0JTRCAqLworCisjZW5kaWYgLyogbmV0aW5ldC9pZl9ldGhlci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWZfZmRkaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2ZkZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ1ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2ZkZGkuaApAQCAtMCwwICsxLDM4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSUZfRkRESV9ICisjZGVmaW5lCV9ORVRJTkVUX0lGX0ZERElfSCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZmRkaS5oPgorCisjaWZkZWYgX19VU0VfQlNECisKK3N0cnVjdCBmZGRpX2hlYWRlciB7CisgIHVfaW50OF90IGZkZGlfZmM7ICAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBDb250cm9sIChGQykgdmFsdWUgKi8KKyAgdV9pbnQ4X3QgZmRkaV9kaG9zdFtGRERJX0tfQUxFTl07ICAgIC8qIERlc3RpbmF0aW9uIGhvc3QgKi8KKyAgdV9pbnQ4X3QgZmRkaV9zaG9zdFtGRERJX0tfQUxFTl07ICAgIC8qIFNvdXJjZSBob3N0ICovCit9OworI2VuZGlmCisKKyNlbmRpZgkvKiBuZXRpbmV0L2lmX2ZkZGkuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX3RyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaWZfdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWMzOTExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX3RyLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JRl9UUl9ICisjZGVmaW5lCV9ORVRJTkVUX0lGX1RSX0ggMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIElFRUUgODAyLjUgVG9rZW4tUmluZyBtYWdpYyBjb25zdGFudHMuICBUaGUgZnJhbWUgc2l6ZXMgb21pdCB0aGUgcHJlYW1ibGUKKyAgIGFuZCBGQ1MvQ1JDIChmcmFtZSBjaGVjayBzZXF1ZW5jZSkuICovCisjZGVmaW5lIFRSX0FMRU4JCTYJCS8qIE9jdGV0cyBpbiBvbmUgdG9rZW4tcmluZyBhZGRyICovCisjZGVmaW5lIFRSX0hMRU4gCShzaXplb2YgKHN0cnVjdCB0cmhfaGRyKSArIHNpemVvZiAoc3RydWN0IHRybGxjKSkKKyNkZWZpbmUgQUMJCTB4MTAKKyNkZWZpbmUgTExDX0ZSQU1FIAkweDQwCisKKy8qIExMQyBhbmQgU05BUCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRVhURU5ERURfU0FQIAkweEFBCisjZGVmaW5lIFVJX0NNRCAgICAgICAJMHgwMworCisvKiBUaGlzIGlzIGFuIFRva2VuLVJpbmcgZnJhbWUgaGVhZGVyLiAqLworc3RydWN0IHRyaF9oZHIKK3sKKyAgdV9pbnQ4X3QgIGFjOwkJCS8qIGFjY2VzcyBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90ICBmYzsJCQkvKiBmcmFtZSBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90ICBkYWRkcltUUl9BTEVOXTsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworICB1X2ludDhfdCAgc2FkZHJbVFJfQUxFTl07CS8qIHNvdXJjZSBhZGRyZXNzICovCisgIHVfaW50MTZfdCByY2Y7CQkvKiByb3V0ZSBjb250cm9sIGZpZWxkICovCisgIHVfaW50MTZfdCByc2VnWzhdOwkJLyogcm91dGluZyByZWdpc3RlcnMgKi8KK307CisKKy8qIFRoaXMgaXMgYW4gVG9rZW4tUmluZyBMTEMgc3RydWN0dXJlICovCitzdHJ1Y3QgdHJsbGMKK3sKKyAgdV9pbnQ4X3QgIGRzYXA7CQkvKiBkZXN0aW5hdGlvbiBTQVAgKi8KKyAgdV9pbnQ4X3QgIHNzYXA7CQkvKiBzb3VyY2UgU0FQICovCisgIHVfaW50OF90ICBsbGM7CQkvKiBMTEMgY29udHJvbCBmaWVsZCAqLworICB1X2ludDhfdCAgcHJvdGlkWzNdOwkJLyogcHJvdG9jb2wgaWQgKi8KKyAgdV9pbnQxNl90IGV0aGVydHlwZTsJCS8qIGV0aGVyIHR5cGUgZmllbGQgKi8KK307CisKKy8qIFRva2VuLVJpbmcgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGRhdGEuICovCitzdHJ1Y3QgdHJfc3RhdGlzdGljcworeworICB1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7ICAgICAvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisgIHVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworICB1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwkvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgIAkqLworICB1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwkvKiB0b3RhbCBieXRlcyB0cmFuc21pdHRlZAkqLworICB1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQJCSovCisgIHVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOwkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMJKi8KKyAgdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzCSovCisgIHVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4CSovCisgIHVuc2lnbmVkIGxvbmcgbXVsdGljYXN0OwkvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAkqLworICB1bnNpZ25lZCBsb25nIHRyYW5zbWl0X2NvbGxpc2lvbjsKKworICAvKiBkZXRhaWxlZCBUb2tlbi1SaW5nIGVycm9ycy4gU2VlIElCTSBUb2tlbi1SaW5nIE5ldHdvcmsKKyAgICAgQXJjaGl0ZWN0dXJlIGZvciBtb3JlIGluZm8gKi8KKworICB1bnNpZ25lZCBsb25nIGxpbmVfZXJyb3JzOworICB1bnNpZ25lZCBsb25nIGludGVybmFsX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBidXJzdF9lcnJvcnM7CisgIHVuc2lnbmVkIGxvbmcgQV9DX2Vycm9yczsKKyAgdW5zaWduZWQgbG9uZyBhYm9ydF9kZWxpbWl0ZXJzOworICB1bnNpZ25lZCBsb25nIGxvc3RfZnJhbWVzOworICB1bnNpZ25lZCBsb25nIHJlY3ZfY29uZ2VzdF9jb3VudDsKKyAgdW5zaWduZWQgbG9uZyBmcmFtZV9jb3BpZWRfZXJyb3JzOworICB1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeV9lcnJvcnM7CisgIHVuc2lnbmVkIGxvbmcgdG9rZW5fZXJyb3JzOworICB1bnNpZ25lZCBsb25nIGR1bW15MTsKK307CisKKy8qIHNvdXJjZSByb3V0aW5nIHN0dWZmICovCisjZGVmaW5lIFRSX1JJSSAJCQkweDgwCisjZGVmaW5lIFRSX1JDRl9ESVJfQklUIAkJMHg4MAorI2RlZmluZSBUUl9SQ0ZfTEVOX01BU0sgCTB4MWYwMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUIAkweDgwMDAJLyogYWxsLXJvdXRlcyBicm9hZGNhc3QgKi8KKyNkZWZpbmUgVFJfUkNGX0xJTUlURURfQlJPQURDQVNUIDB4QzAwMAkvKiBzaW5nbGUtcm91dGUgYnJvYWRjYXN0ICovCisjZGVmaW5lIFRSX1JDRl9GUkFNRTJLIAkJMHgyMAorI2RlZmluZSBUUl9SQ0ZfQlJPQURDQVNUX01BU0sgCTB4QzAwMAorI2RlZmluZSBUUl9NQVhSSUZMRU4gCQkxOAorCisjaWZkZWYgX19VU0VfQlNECisKK3N0cnVjdCB0cm5faGRyCit7CisgIHVfaW50OF90IHRybl9hYzsgICAgICAgICAgICAgICAgLyogYWNjZXNzIGNvbnRyb2wgZmllbGQgKi8KKyAgdV9pbnQ4X3QgdHJuX2ZjOyAgICAgICAgICAgICAgICAvKiBmaWVsZCBjb250cm9sIGZpZWxkICovCisgIHVfaW50OF90IHRybl9kaG9zdFtUUl9BTEVOXTsgICAgLyogZGVzdGluYXRpb24gaG9zdCAqLworICB1X2ludDhfdCB0cm5fc2hvc3RbVFJfQUxFTl07ICAgIC8qIHNvdXJjZSBob3N0ICovCisgIHVfaW50MTZfdCB0cm5fcmNmOyAgICAgICAgICAgICAgLyogcm91dGUgY29udHJvbCBmaWVsZCAqLworICB1X2ludDE2X3QgdHJuX3JzZWdbOF07ICAgICAgICAgIC8qIHJvdXRpbmcgcmVnaXN0ZXJzICovCit9OworCisjZW5kaWYKKworI2VuZGlmCS8qIG5ldGluZXQvaWZfdHIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lnbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZ21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczOTZiYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pZ21wLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUSU5FVF9JR01QX0gKKyNkZWZpbmUJX05FVElORVRfSUdNUF9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19VU0VfQlNECisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCBTdGVwaGVuIERlZXJpbmcuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIFN0ZXBoZW4gRGVlcmluZyBvZiBTdGFuZm9yZCBVbml2ZXJzaXR5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaWdtcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqCSRGcmVlQlNEJAorICovCisKK3N0cnVjdCBpZ21wIHsKKyAgdV9pbnQ4X3QgaWdtcF90eXBlOyAgICAgICAgICAgICAvKiBJR01QIHR5cGUgKi8KKyAgdV9pbnQ4X3QgaWdtcF9jb2RlOyAgICAgICAgICAgICAvKiByb3V0aW5nIGNvZGUgKi8KKyAgdV9pbnQxNl90IGlnbXBfY2tzdW07ICAgICAgICAgICAvKiBjaGVja3N1bSAqLworICBzdHJ1Y3QgaW5fYWRkciBpZ21wX2dyb3VwOyAgICAgIC8qIGdyb3VwIGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUgSUdNUF9NSU5MRU4JCQk4CisKKy8qCisgKiBNZXNzYWdlIHR5cGVzLCBpbmNsdWRpbmcgdmVyc2lvbiBudW1iZXIuCisgKi8KKyNkZWZpbmUgSUdNUF9NRU1CRVJTSElQX1FVRVJZICAgCTB4MTEJLyogbWVtYmVyc2hpcCBxdWVyeSAgICAgICAgICovCisjZGVmaW5lIElHTVBfVjFfTUVNQkVSU0hJUF9SRVBPUlQJMHgxMgkvKiBWZXIuIDEgbWVtYmVyc2hpcCByZXBvcnQgKi8KKyNkZWZpbmUgSUdNUF9WMl9NRU1CRVJTSElQX1JFUE9SVAkweDE2CS8qIFZlci4gMiBtZW1iZXJzaGlwIHJlcG9ydCAqLworI2RlZmluZSBJR01QX1YyX0xFQVZFX0dST1VQCQkweDE3CS8qIExlYXZlLWdyb3VwIG1lc3NhZ2UJICAgICovCisKKyNkZWZpbmUgSUdNUF9EVk1SUAkJCTB4MTMJLyogRFZNUlAgcm91dGluZyBtZXNzYWdlICAgICovCisjZGVmaW5lIElHTVBfUElNCQkJMHgxNAkvKiBQSU0gcm91dGluZyBtZXNzYWdlICAgICAgKi8KKyNkZWZpbmUgSUdNUF9UUkFDRQkJCTB4MTUKKworI2RlZmluZSBJR01QX01UUkFDRV9SRVNQCQkweDFlCS8qIHRyYWNlcm91dGUgcmVzcC4odG8gc2VuZGVyKSovCisjZGVmaW5lIElHTVBfTVRSQUNFCQkJMHgxZgkvKiBtY2FzdCB0cmFjZXJvdXRlIG1lc3NhZ2VzICAqLworCisjZGVmaW5lIElHTVBfTUFYX0hPU1RfUkVQT1JUX0RFTEFZCTEwCS8qIG1heCBkZWxheSBmb3IgcmVzcG9uc2UgdG8gICAgICovCisJCQkJCQkvKiAgcXVlcnkgKGluIHNlY29uZHMpIGFjY29yZGluZyAqLworCQkJCQkJLyogIHRvIFJGQzExMTIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUdNUF9USU1FUl9TQ0FMRQkJMTAJLyogZGVub3RlcyB0aGF0IHRoZSBpZ21wIGNvZGUgZmllbGQgKi8KKwkJCQkJCS8qIHNwZWNpZmllcyB0aW1lIGluIDEwdGggb2Ygc2Vjb25kcyovCisKKy8qCisgKiBTdGF0ZXMgZm9yIHRoZSBJR01QIHYyIHN0YXRlIHRhYmxlLgorICovCisjZGVmaW5lIElHTVBfREVMQVlJTkdfTUVNQkVSCTEKKyNkZWZpbmUgSUdNUF9JRExFX01FTUJFUgkyCisjZGVmaW5lIElHTVBfTEFaWV9NRU1CRVIJMworI2RlZmluZSBJR01QX1NMRUVQSU5HX01FTUJFUgk0CisjZGVmaW5lIElHTVBfQVdBS0VOSU5HX01FTUJFUgk1CisKKy8qCisgKiBTdGF0ZXMgZm9yIElHTVAgcm91dGVyIHZlcnNpb24gY2FjaGUuCisgKi8KKyNkZWZpbmUgSUdNUF92MV9ST1VURVIJCTEKKyNkZWZpbmUgSUdNUF92Ml9ST1VURVIJCTIKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZm91ciBkZWZpbmluaXRpb25zIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKiBUaGV5IHNob3VsZCBiZSByZW1vdmVkIGFzIHNvb24gYXMgYWxsIGFwcGxpY2F0aW9ucyBhcmUgdXBkYXRlZCB0bworICogdXNlIHRoZSBuZXcgY29uc3RhbnQgbmFtZXMuCisgKi8KKyNkZWZpbmUgSUdNUF9IT1NUX01FTUJFUlNISVBfUVVFUlkJSUdNUF9NRU1CRVJTSElQX1FVRVJZCisjZGVmaW5lIElHTVBfSE9TVF9NRU1CRVJTSElQX1JFUE9SVAlJR01QX1YxX01FTUJFUlNISVBfUkVQT1JUCisjZGVmaW5lIElHTVBfSE9TVF9ORVdfTUVNQkVSU0hJUF9SRVBPUlQJSUdNUF9WMl9NRU1CRVJTSElQX1JFUE9SVAorI2RlZmluZSBJR01QX0hPU1RfTEVBVkVfTUVTU0FHRQkJSUdNUF9WMl9MRUFWRV9HUk9VUAorCitfX0VORF9ERUNMUworCisjZW5kaWYKKworI2VuZGlmCS8qIG5ldGluZXQvaWdtcC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjYxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApAQCAtMCwwICsxLDU1MSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDEsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9ORVRJTkVUX0lOX0gKKyNkZWZpbmUJX05FVElORVRfSU5fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBTdGFuZGFyZCB3ZWxsLWRlZmluZWQgSVAgcHJvdG9jb2xzLiAgKi8KK2VudW0KKyAgeworICAgIElQUFJPVE9fSVAgPSAwLAkgICAvKiBEdW1teSBwcm90b2NvbCBmb3IgVENQLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JUAkJSVBQUk9UT19JUAorICAgIElQUFJPVE9fSE9QT1BUUyA9IDAsICAgLyogSVB2NiBIb3AtYnktSG9wIG9wdGlvbnMuICAqLworI2RlZmluZSBJUFBST1RPX0hPUE9QVFMJCUlQUFJPVE9fSE9QT1BUUworICAgIElQUFJPVE9fSUNNUCA9IDEsCSAgIC8qIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fSUNNUAkJSVBQUk9UT19JQ01QCisgICAgSVBQUk9UT19JR01QID0gMiwJICAgLyogSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbC4gKi8KKyNkZWZpbmUgSVBQUk9UT19JR01QCQlJUFBST1RPX0lHTVAKKyAgICBJUFBST1RPX0lQSVAgPSA0LAkgICAvKiBJUElQIHR1bm5lbHMgKG9sZGVyIEtBOVEgdHVubmVscyB1c2UgOTQpLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19JUElQCQlJUFBST1RPX0lQSVAKKyAgICBJUFBST1RPX1RDUCA9IDYsCSAgIC8qIFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19UQ1AJCUlQUFJPVE9fVENQCisgICAgSVBQUk9UT19FR1AgPSA4LAkgICAvKiBFeHRlcmlvciBHYXRld2F5IFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19FR1AJCUlQUFJPVE9fRUdQCisgICAgSVBQUk9UT19QVVAgPSAxMiwJICAgLyogUFVQIHByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19QVVAJCUlQUFJPVE9fUFVQCisgICAgSVBQUk9UT19VRFAgPSAxNywJICAgLyogVXNlciBEYXRhZ3JhbSBQcm90b2NvbC4gICovCisjZGVmaW5lIElQUFJPVE9fVURQCQlJUFBST1RPX1VEUAorICAgIElQUFJPVE9fSURQID0gMjIsCSAgIC8qIFhOUyBJRFAgcHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX0lEUAkJSVBQUk9UT19JRFAKKyAgICBJUFBST1RPX1RQID0gMjksCSAgIC8qIFNPIFRyYW5zcG9ydCBQcm90b2NvbCBDbGFzcyA0LiAgKi8KKyNkZWZpbmUgSVBQUk9UT19UUAkJSVBQUk9UT19UUAorICAgIElQUFJPVE9fSVBWNiA9IDQxLCAgICAgLyogSVB2NiBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX0lQVjYJCUlQUFJPVE9fSVBWNgorICAgIElQUFJPVE9fUk9VVElORyA9IDQzLCAgLyogSVB2NiByb3V0aW5nIGhlYWRlci4gICovCisjZGVmaW5lIElQUFJPVE9fUk9VVElORwkJSVBQUk9UT19ST1VUSU5HCisgICAgSVBQUk9UT19GUkFHTUVOVCA9IDQ0LCAvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19GUkFHTUVOVAlJUFBST1RPX0ZSQUdNRU5UCisgICAgSVBQUk9UT19SU1ZQID0gNDYsCSAgIC8qIFJlc2VydmF0aW9uIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19SU1ZQCQlJUFBST1RPX1JTVlAKKyAgICBJUFBST1RPX0dSRSA9IDQ3LAkgICAvKiBHZW5lcmFsIFJvdXRpbmcgRW5jYXBzdWxhdGlvbi4gICovCisjZGVmaW5lIElQUFJPVE9fR1JFCQlJUFBST1RPX0dSRQorICAgIElQUFJPVE9fRVNQID0gNTAsICAgICAgLyogZW5jYXBzdWxhdGluZyBzZWN1cml0eSBwYXlsb2FkLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19FU1AJCUlQUFJPVE9fRVNQCisgICAgSVBQUk9UT19BSCA9IDUxLCAgICAgICAvKiBhdXRoZW50aWNhdGlvbiBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX0FICQlJUFBST1RPX0FICisgICAgSVBQUk9UT19JQ01QVjYgPSA1OCwgICAvKiBJQ01QdjYuICAqLworI2RlZmluZSBJUFBST1RPX0lDTVBWNgkJSVBQUk9UT19JQ01QVjYKKyAgICBJUFBST1RPX05PTkUgPSA1OSwgICAgIC8qIElQdjYgbm8gbmV4dCBoZWFkZXIuICAqLworI2RlZmluZSBJUFBST1RPX05PTkUJCUlQUFJPVE9fTk9ORQorICAgIElQUFJPVE9fRFNUT1BUUyA9IDYwLCAgLyogSVB2NiBkZXN0aW5hdGlvbiBvcHRpb25zLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19EU1RPUFRTCQlJUFBST1RPX0RTVE9QVFMKKyAgICBJUFBST1RPX01UUCA9IDkyLAkgICAvKiBNdWx0aWNhc3QgVHJhbnNwb3J0IFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19NVFAJCUlQUFJPVE9fTVRQCisgICAgSVBQUk9UT19FTkNBUCA9IDk4LAkgICAvKiBFbmNhcHN1bGF0aW9uIEhlYWRlci4gICovCisjZGVmaW5lIElQUFJPVE9fRU5DQVAJCUlQUFJPVE9fRU5DQVAKKyAgICBJUFBST1RPX1BJTSA9IDEwMywJICAgLyogUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0LiAgKi8KKyNkZWZpbmUgSVBQUk9UT19QSU0JCUlQUFJPVE9fUElNCisgICAgSVBQUk9UT19DT01QID0gMTA4LAkgICAvKiBDb21wcmVzc2lvbiBIZWFkZXIgUHJvdG9jb2wuICAqLworI2RlZmluZSBJUFBST1RPX0NPTVAJCUlQUFJPVE9fQ09NUAorICAgIElQUFJPVE9fU0NUUCA9IDEzMiwJICAgLyogU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19TQ1RQCQlJUFBST1RPX1NDVFAKKyAgICBJUFBST1RPX1JBVyA9IDI1NSwJICAgLyogUmF3IElQIHBhY2tldHMuICAqLworI2RlZmluZSBJUFBST1RPX1JBVwkJSVBQUk9UT19SQVcKKyAgICBJUFBST1RPX01BWAorICB9OworCisKKy8qIFR5cGUgdG8gcmVwcmVzZW50IGEgcG9ydC4gICovCit0eXBlZGVmIHVpbnQxNl90IGluX3BvcnRfdDsKKworLyogU3RhbmRhcmQgd2VsbC1rbm93biBwb3J0cy4gICovCitlbnVtCisgIHsKKyAgICBJUFBPUlRfRUNITyA9IDcsCQkvKiBFY2hvIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9ESVNDQVJEID0gOSwJCS8qIERpc2NhcmQgdHJhbnNtaXNzaW9ucyBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfU1lTVEFUID0gMTEsCQkvKiBTeXN0ZW0gc3RhdHVzIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9EQVlUSU1FID0gMTMsCS8qIFRpbWUgb2YgZGF5IHNlcnZpY2UuICAqLworICAgIElQUE9SVF9ORVRTVEFUID0gMTUsCS8qIE5ldHdvcmsgc3RhdHVzIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9GVFAgPSAyMSwJCS8qIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wuICAqLworICAgIElQUE9SVF9URUxORVQgPSAyMywJCS8qIFRlbG5ldCBwcm90b2NvbC4gICovCisgICAgSVBQT1JUX1NNVFAgPSAyNSwJCS8qIFNpbXBsZSBNYWlsIFRyYW5zZmVyIFByb3RvY29sLiAgKi8KKyAgICBJUFBPUlRfVElNRVNFUlZFUiA9IDM3LAkvKiBUaW1lc2VydmVyIHNlcnZpY2UuICAqLworICAgIElQUE9SVF9OQU1FU0VSVkVSID0gNDIsCS8qIERvbWFpbiBOYW1lIFNlcnZpY2UuICAqLworICAgIElQUE9SVF9XSE9JUyA9IDQzLAkJLyogSW50ZXJuZXQgV2hvaXMgc2VydmljZS4gICovCisgICAgSVBQT1JUX01UUCA9IDU3LAorCisgICAgSVBQT1JUX1RGVFAgPSA2OSwJCS8qIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbC4gICovCisgICAgSVBQT1JUX1JKRSA9IDc3LAorICAgIElQUE9SVF9GSU5HRVIgPSA3OSwJCS8qIEZpbmdlciBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfVFRZTElOSyA9IDg3LAorICAgIElQUE9SVF9TVVBEVVAgPSA5NSwJCS8qIFNVUERVUCBwcm90b2NvbC4gICovCisKKworICAgIElQUE9SVF9FWEVDU0VSVkVSID0gNTEyLAkvKiBleGVjZCBzZXJ2aWNlLiAgKi8KKyAgICBJUFBPUlRfTE9HSU5TRVJWRVIgPSA1MTMsCS8qIHJsb2dpbmQgc2VydmljZS4gICovCisgICAgSVBQT1JUX0NNRFNFUlZFUiA9IDUxNCwKKyAgICBJUFBPUlRfRUZTU0VSVkVSID0gNTIwLAorCisgICAgLyogVURQIHBvcnRzLiAgKi8KKyAgICBJUFBPUlRfQklGRlVEUCA9IDUxMiwKKyAgICBJUFBPUlRfV0hPU0VSVkVSID0gNTEzLAorICAgIElQUE9SVF9ST1VURVNFUlZFUiA9IDUyMCwKKworICAgIC8qIFBvcnRzIGxlc3MgdGhhbiB0aGlzIHZhbHVlIGFyZSByZXNlcnZlZCBmb3IgcHJpdmlsZWdlZCBwcm9jZXNzZXMuICAqLworICAgIElQUE9SVF9SRVNFUlZFRCA9IDEwMjQsCisKKyAgICAvKiBQb3J0cyBncmVhdGVyIHRoaXMgdmFsdWUgYXJlIHJlc2VydmVkIGZvciAobm9uLXByaXZpbGVnZWQpIHNlcnZlcnMuICAqLworICAgIElQUE9SVF9VU0VSUkVTRVJWRUQgPSA1MDAwCisgIH07CisKKworLyogSW50ZXJuZXQgYWRkcmVzcy4gICovCit0eXBlZGVmIHVpbnQzMl90IGluX2FkZHJfdDsKK3N0cnVjdCBpbl9hZGRyCisgIHsKKyAgICBpbl9hZGRyX3Qgc19hZGRyOworICB9OworCisKKy8qIERlZmluaXRpb25zIG9mIHRoZSBiaXRzIGluIGFuIEludGVybmV0IGFkZHJlc3MgaW50ZWdlci4KKworICAgT24gc3VibmV0cywgaG9zdCBhbmQgbmV0d29yayBwYXJ0cyBhcmUgZm91bmQgYWNjb3JkaW5nIHRvCisgICB0aGUgc3VibmV0IG1hc2ssIG5vdCB0aGVzZSBtYXNrcy4gICovCisKKyNkZWZpbmUJSU5fQ0xBU1NBKGEpCQkoKCgoaW5fYWRkcl90KShhKSkgJiAweDgwMDAwMDAwKSA9PSAwKQorI2RlZmluZQlJTl9DTEFTU0FfTkVUCQkweGZmMDAwMDAwCisjZGVmaW5lCUlOX0NMQVNTQV9OU0hJRlQJMjQKKyNkZWZpbmUJSU5fQ0xBU1NBX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQV9ORVQpCisjZGVmaW5lCUlOX0NMQVNTQV9NQVgJCTEyOAorCisjZGVmaW5lCUlOX0NMQVNTQihhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NCX05FVAkJMHhmZmZmMDAwMAorI2RlZmluZQlJTl9DTEFTU0JfTlNISUZUCTE2CisjZGVmaW5lCUlOX0NMQVNTQl9IT1NUCQkoMHhmZmZmZmZmZiAmIH5JTl9DTEFTU0JfTkVUKQorI2RlZmluZQlJTl9DTEFTU0JfTUFYCQk2NTUzNgorCisjZGVmaW5lCUlOX0NMQVNTQyhhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKKyNkZWZpbmUJSU5fQ0xBU1NDX05FVAkJMHhmZmZmZmYwMAorI2RlZmluZQlJTl9DTEFTU0NfTlNISUZUCTgKKyNkZWZpbmUJSU5fQ0xBU1NDX0hPU1QJCSgweGZmZmZmZmZmICYgfklOX0NMQVNTQ19ORVQpCisKKyNkZWZpbmUJSU5fQ0xBU1NEKGEpCQkoKCgoaW5fYWRkcl90KShhKSkgJiAweGYwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2RlZmluZQlJTl9NVUxUSUNBU1QoYSkJCUlOX0NMQVNTRChhKQorCisjZGVmaW5lCUlOX0VYUEVSSU1FTlRBTChhKQkoKCgoaW5fYWRkcl90KShhKSkgJiAweGUwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2RlZmluZQlJTl9CQURDTEFTUyhhKQkJKCgoKGluX2FkZHJfdCkoYSkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKKworLyogQWRkcmVzcyB0byBhY2NlcHQgYW55IGluY29taW5nIG1lc3NhZ2VzLiAgKi8KKyNkZWZpbmUJSU5BRERSX0FOWQkJKChpbl9hZGRyX3QpIDB4MDAwMDAwMDApCisvKiBBZGRyZXNzIHRvIHNlbmQgdG8gYWxsIGhvc3RzLiAgKi8KKyNkZWZpbmUJSU5BRERSX0JST0FEQ0FTVAkoKGluX2FkZHJfdCkgMHhmZmZmZmZmZikKKy8qIEFkZHJlc3MgaW5kaWNhdGluZyBhbiBlcnJvciByZXR1cm4uICAqLworI2RlZmluZQlJTkFERFJfTk9ORQkJKChpbl9hZGRyX3QpIDB4ZmZmZmZmZmYpCisKKy8qIE5ldHdvcmsgbnVtYmVyIGZvciBsb2NhbCBob3N0IGxvb3BiYWNrLiAgKi8KKyNkZWZpbmUJSU5fTE9PUEJBQ0tORVQJCTEyNworLyogQWRkcmVzcyB0byBsb29wYmFjayBpbiBzb2Z0d2FyZSB0byBsb2NhbCBob3N0LiAgKi8KKyNpZm5kZWYgSU5BRERSX0xPT1BCQUNLCisjIGRlZmluZSBJTkFERFJfTE9PUEJBQ0sJKChpbl9hZGRyX3QpIDB4N2YwMDAwMDEpIC8qIEluZXQgMTI3LjAuMC4xLiAgKi8KKyNlbmRpZgorCisvKiBEZWZpbmVzIGZvciBNdWx0aWNhc3QgSU5BRERSLiAgKi8KKyNkZWZpbmUgSU5BRERSX1VOU1BFQ19HUk9VUAkoKGluX2FkZHJfdCkgMHhlMDAwMDAwMCkgLyogMjI0LjAuMC4wICovCisjZGVmaW5lIElOQUREUl9BTExIT1NUU19HUk9VUAkoKGluX2FkZHJfdCkgMHhlMDAwMDAwMSkgLyogMjI0LjAuMC4xICovCisjZGVmaW5lIElOQUREUl9BTExSVFJTX0dST1VQICAgICgoaW5fYWRkcl90KSAweGUwMDAwMDAyKSAvKiAyMjQuMC4wLjIgKi8KKyNkZWZpbmUgSU5BRERSX01BWF9MT0NBTF9HUk9VUCAgKChpbl9hZGRyX3QpIDB4ZTAwMDAwZmYpIC8qIDIyNC4wLjAuMjU1ICovCisKKworLyogSVB2NiBhZGRyZXNzICovCitzdHJ1Y3QgaW42X2FkZHIKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJdWludDhfdAl1Nl9hZGRyOFsxNl07CisJdWludDE2X3QgdTZfYWRkcjE2WzhdOworCXVpbnQzMl90IHU2X2FkZHIzMls0XTsKKyAgICAgIH0gaW42X3U7CisjZGVmaW5lIHM2X2FkZHIJCQlpbjZfdS51Nl9hZGRyOAorI2RlZmluZSBzNl9hZGRyMTYJCWluNl91LnU2X2FkZHIxNgorI2RlZmluZSBzNl9hZGRyMzIJCWluNl91LnU2X2FkZHIzMgorICB9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGluNl9hZGRyIGluNmFkZHJfYW55OyAgICAgICAgLyogOjogKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgaW42YWRkcl9sb29wYmFjazsgICAvKiA6OjEgKi8KKyNkZWZpbmUgSU42QUREUl9BTllfSU5JVCB7IHsgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0gfSB9CisjZGVmaW5lIElONkFERFJfTE9PUEJBQ0tfSU5JVCB7IHsgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxIH0gfSB9CisKKyNkZWZpbmUgSU5FVF9BRERSU1RSTEVOIDE2CisjZGVmaW5lIElORVQ2X0FERFJTVFJMRU4gNDYKKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBJbnRlcm5ldCBzb2NrZXQgYWRkcmVzcy4gICovCitzdHJ1Y3Qgc29ja2FkZHJfaW4KKyAgeworICAgIF9fU09DS0FERFJfQ09NTU9OIChzaW5fKTsKKyAgICBpbl9wb3J0X3Qgc2luX3BvcnQ7CQkJLyogUG9ydCBudW1iZXIuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIHNpbl9hZGRyOwkJLyogSW50ZXJuZXQgYWRkcmVzcy4gICovCisKKyAgICAvKiBQYWQgdG8gc2l6ZSBvZiBgc3RydWN0IHNvY2thZGRyJy4gICovCisgICAgdW5zaWduZWQgY2hhciBzaW5femVyb1tzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikgLQorCQkJICAgX19TT0NLQUREUl9DT01NT05fU0laRSAtCisJCQkgICBzaXplb2YgKGluX3BvcnRfdCkgLQorCQkJICAgc2l6ZW9mIChzdHJ1Y3QgaW5fYWRkcildOworICB9OworCisvKiBEaXR0bywgZm9yIElQdjYuICAqLworc3RydWN0IHNvY2thZGRyX2luNgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNpbjZfKTsKKyAgICBpbl9wb3J0X3Qgc2luNl9wb3J0OwkvKiBUcmFuc3BvcnQgbGF5ZXIgcG9ydCAjICovCisgICAgdWludDMyX3Qgc2luNl9mbG93aW5mbzsJLyogSVB2NiBmbG93IGluZm9ybWF0aW9uICovCisgICAgc3RydWN0IGluNl9hZGRyIHNpbjZfYWRkcjsJLyogSVB2NiBhZGRyZXNzICovCisgICAgdWludDMyX3Qgc2luNl9zY29wZV9pZDsJLyogSVB2NiBzY29wZS1pZCAqLworICB9OworCisKKy8qIElQdjQgbXVsdGljYXN0IHJlcXVlc3QuICAqLworc3RydWN0IGlwX21yZXEKKyAgeworICAgIC8qIElQIG11bHRpY2FzdCBhZGRyZXNzIG9mIGdyb3VwLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfbXVsdGlhZGRyOworCisgICAgLyogTG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9pbnRlcmZhY2U7CisgIH07CisKK3N0cnVjdCBpcF9tcmVxX3NvdXJjZQorICB7CisgICAgLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltcl9tdWx0aWFkZHI7CisKKyAgICAvKiBJUCBhZGRyZXNzIG9mIHNvdXJjZS4gICovCisgICAgc3RydWN0IGluX2FkZHIgaW1yX2ludGVyZmFjZTsKKworICAgIC8qIElQIGFkZHJlc3Mgb2YgaW50ZXJmYWNlLiAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpbXJfc291cmNlYWRkcjsKKyAgfTsKKworLyogTGlrZXdpc2UsIGZvciBJUHY2LiAgKi8KK3N0cnVjdCBpcHY2X21yZXEKKyAgeworICAgIC8qIElQdjYgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAgKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgaXB2Nm1yX211bHRpYWRkcjsKKworICAgIC8qIGxvY2FsIGludGVyZmFjZSAqLworICAgIHVuc2lnbmVkIGludCBpcHY2bXJfaW50ZXJmYWNlOworICB9OworCisKKy8qIE11bHRpY2FzdCBncm91cCByZXF1ZXN0LiAgKi8KK3N0cnVjdCBncm91cF9yZXEKKyAgeworICAgIC8qIEludGVyZmFjZSBpbmRleC4gICovCisgICAgdWludDMyX3QgZ3JfaW50ZXJmYWNlOworCisgICAgLyogR3JvdXAgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ3JfZ3JvdXA7CisgIH07CisKK3N0cnVjdCBncm91cF9zb3VyY2VfcmVxCisgIHsKKyAgICAvKiBJbnRlcmZhY2UgaW5kZXguICAqLworICAgIHVpbnQzMl90IGdzcl9pbnRlcmZhY2U7CisKKyAgICAvKiBHcm91cCBhZGRyZXNzLiAgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBnc3JfZ3JvdXA7CisKKyAgICAvKiBTb3VyY2UgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ3NyX3NvdXJjZTsKKyAgfTsKKworCisvKiBGdWxsLXN0YXRlIGZpbHRlciBvcGVyYXRpb25zLiAgKi8KK3N0cnVjdCBpcF9tc2ZpbHRlcgorICB7CisgICAgLyogSVAgbXVsdGljYXN0IGFkZHJlc3Mgb2YgZ3JvdXAuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltc2ZfbXVsdGlhZGRyOworCisgICAgLyogTG9jYWwgSVAgYWRkcmVzcyBvZiBpbnRlcmZhY2UuICAqLworICAgIHN0cnVjdCBpbl9hZGRyIGltc2ZfaW50ZXJmYWNlOworCisgICAgLyogRmlsdGVyIG1vZGUuICAqLworICAgIHVpbnQzMl90IGltc2ZfZm1vZGU7CisKKyAgICAvKiBOdW1iZXIgb2Ygc291cmNlIGFkZHJlc3Nlcy4gICovCisgICAgdWludDMyX3QgaW1zZl9udW1zcmM7CisgICAgLyogU291cmNlIGFkZHJlc3Nlcy4gICovCisgICAgc3RydWN0IGluX2FkZHIgaW1zZl9zbGlzdFsxXTsKKyAgfTsKKworI2RlZmluZSBJUF9NU0ZJTFRFUl9TSVpFKG51bXNyYykgKHNpemVvZiAoc3RydWN0IGlwX21zZmlsdGVyKSBcCisJCQkJICAtIHNpemVvZiAoc3RydWN0IGluX2FkZHIpCQkgICAgICBcCisJCQkJICArIChudW1zcmMpICogc2l6ZW9mIChzdHJ1Y3QgaW5fYWRkcikpCisKK3N0cnVjdCBncm91cF9maWx0ZXIKKyAgeworICAgIC8qIEludGVyZmFjZSBpbmRleC4gICovCisgICAgdWludDMyX3QgZ2ZfaW50ZXJmYWNlOworCisgICAgLyogR3JvdXAgYWRkcmVzcy4gICovCisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZ2ZfZ3JvdXA7CisKKyAgICAvKiBGaWx0ZXIgbW9kZS4gICovCisgICAgdWludDMyX3QgZ2ZfZm1vZGU7CisKKyAgICAvKiBOdW1iZXIgb2Ygc291cmNlIGFkZHJlc3Nlcy4gICovCisgICAgdWludDMyX3QgZ2ZfbnVtc3JjOworICAgIC8qIFNvdXJjZSBhZGRyZXNzZXMuICAqLworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGdmX3NsaXN0WzFdOworfTsKKworI2RlZmluZSBHUk9VUF9GSUxURVJfU0laRShudW1zcmMpIChzaXplb2YgKHN0cnVjdCBncm91cF9maWx0ZXIpIFwKKwkJCQkgICAtIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpCSAgICAgIFwKKwkJCQkgICArICgobnVtc3JjKQkJCQkgICAgICBcCisJCQkJICAgICAgKiBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSkpCisKKworLyogR2V0IHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCisjaW5jbHVkZSA8Yml0cy9pbi5oPgorCisvKiBGdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIGhvc3QgYW5kIG5ldHdvcmsgYnl0ZSBvcmRlci4KKworICAgUGxlYXNlIG5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgbm9ybWFsbHkgdGFrZSBgdW5zaWduZWQgbG9uZyBpbnQnIG9yCisgICBgdW5zaWduZWQgc2hvcnQgaW50JyB2YWx1ZXMgYXMgYXJndW1lbnRzIGFuZCBhbHNvIHJldHVybiB0aGVtLiAgQnV0CisgICB0aGlzIHdhcyBhIHNob3J0LXNpZ2h0ZWQgZGVjaXNpb24gc2luY2Ugb24gZGlmZmVyZW50IHN5c3RlbXMgdGhlIHR5cGVzCisgICBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIGJ1dCB0aGUgdmFsdWVzIGFyZSBhbHdheXMgdGhlIHNhbWUuICAqLworCitleHRlcm4gdWludDMyX3QgbnRvaGwgKHVpbnQzMl90IF9fbmV0bG9uZykgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CitleHRlcm4gdWludDE2X3QgbnRvaHMgKHVpbnQxNl90IF9fbmV0c2hvcnQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworZXh0ZXJuIHVpbnQzMl90IGh0b25sICh1aW50MzJfdCBfX2hvc3Rsb25nKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKK2V4dGVybiB1aW50MTZfdCBodG9ucyAodWludDE2X3QgX19ob3N0c2hvcnQpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKy8qIEdldCBtYWNoaW5lIGRlcGVuZGVudCBvcHRpbWl6ZWQgdmVyc2lvbnMgb2YgYnl0ZSBzd2FwcGluZyBmdW5jdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvYnl0ZXN3YXAuaD4KKworI2lmZGVmIF9fT1BUSU1JWkVfXworLyogV2UgY2FuIG9wdGltaXplIGNhbGxzIHRvIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIEVpdGhlciBub3RoaW5nIGhhcworICAgdG8gYmUgZG9uZSBvciB3ZSBhcmUgdXNpbmcgZGlyZWN0bHkgdGhlIGJ5dGUtc3dhcHBpbmcgZnVuY3Rpb25zIHdoaWNoCisgICBvZnRlbiBjYW4gYmUgaW5saW5lZC4gICovCisjIGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKy8qIFRoZSBob3N0IGJ5dGUgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbmV0d29yayBieXRlIG9yZGVyLAorICAgc28gdGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwganVzdCBpZGVudGl0eS4gICovCisjIGRlZmluZSBudG9obCh4KQkoeCkKKyMgZGVmaW5lIG50b2hzKHgpCSh4KQorIyBkZWZpbmUgaHRvbmwoeCkJKHgpCisjIGRlZmluZSBodG9ucyh4KQkoeCkKKyMgZWxzZQorIyAgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgIGRlZmluZSBudG9obCh4KQlfX2Jzd2FwXzMyICh4KQorIyAgIGRlZmluZSBudG9ocyh4KQlfX2Jzd2FwXzE2ICh4KQorIyAgIGRlZmluZSBodG9ubCh4KQlfX2Jzd2FwXzMyICh4KQorIyAgIGRlZmluZSBodG9ucyh4KQlfX2Jzd2FwXzE2ICh4KQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpIFwKKwkoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gPT0gMAkJCQkgICAgICBcCisJICYmICgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzFdID09IDAJCQkJICAgICAgXAorCSAmJiAoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsyXSA9PSAwCQkJCSAgICAgIFwKKwkgJiYgKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbM10gPT0gMCkKKworI2RlZmluZSBJTjZfSVNfQUREUl9MT09QQkFDSyhhKSBcCisJKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzBdID09IDAJCQkJICAgICAgXAorCSAmJiAoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsxXSA9PSAwCQkJCSAgICAgIFwKKwkgJiYgKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMl0gPT0gMAkJCQkgICAgICBcCisJICYmICgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzNdID09IGh0b25sICgxKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkgKCgoX19jb25zdCB1aW50OF90ICopIChhKSlbMF0gPT0gMHhmZikKKworI2RlZmluZSBJTjZfSVNfQUREUl9MSU5LTE9DQUwoYSkgXAorCSgoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpCQkgICAgICBcCisJID09IGh0b25sICgweGZlODAwMDAwKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9TSVRFTE9DQUwoYSkgXAorCSgoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpCQkgICAgICBcCisJID09IGh0b25sICgweGZlYzAwMDAwKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCisJKCgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSA9PSAwKQkJCQkgICAgICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsxXSA9PSAwKQkJCSAgICAgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzJdID09IGh0b25sICgweGZmZmYpKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9WNENPTVBBVChhKSBcCisJKCgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVswXSA9PSAwKQkJCQkgICAgICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsxXSA9PSAwKQkJCSAgICAgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzJdID09IDApCQkJICAgICAgXAorCSAmJiAobnRvaGwgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzNdKSA+IDEpKQorCisjZGVmaW5lIElONl9BUkVfQUREUl9FUVVBTChhLGIpIFwKKwkoKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzBdID09ICgoX19jb25zdCB1aW50MzJfdCAqKSAoYikpWzBdKSAgICAgXAorCSAmJiAoKChfX2NvbnN0IHVpbnQzMl90ICopIChhKSlbMV0gPT0gKChfX2NvbnN0IHVpbnQzMl90ICopIChiKSlbMV0pICBcCisJICYmICgoKF9fY29uc3QgdWludDMyX3QgKikgKGEpKVsyXSA9PSAoKF9fY29uc3QgdWludDMyX3QgKikgKGIpKVsyXSkgIFwKKwkgJiYgKCgoX19jb25zdCB1aW50MzJfdCAqKSAoYSkpWzNdID09ICgoX19jb25zdCB1aW50MzJfdCAqKSAoYikpWzNdKSkKKworLyogQmluZCBzb2NrZXQgdG8gYSBwcml2aWxlZ2VkIElQIHBvcnQuICAqLworZXh0ZXJuIGludCBiaW5kcmVzdnBvcnQgKGludCBfX3NvY2tmZCwgc3RydWN0IHNvY2thZGRyX2luICpfX3NvY2tfaW4pIF9fVEhST1c7CisKKy8qIFRoZSBJUHY2IHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbi4gICovCitleHRlcm4gaW50IGJpbmRyZXN2cG9ydDYgKGludCBfX3NvY2tmZCwgc3RydWN0IHNvY2thZGRyX2luNiAqX19zb2NrX2luKQorICAgICBfX1RIUk9XOworCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTUNfTk9ERUxPQ0FMKGEpIFwKKwkoSU42X0lTX0FERFJfTVVMVElDQVNUKGEpCQkJCQkgICAgICBcCisJICYmICgoKChfX2NvbnN0IHVpbnQ4X3QgKikgKGEpKVsxXSAmIDB4ZikgPT0gMHgxKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSkgXAorCShJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkJCQkJCSAgICAgIFwKKwkgJiYgKCgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzFdICYgMHhmKSA9PSAweDIpKQorCisjZGVmaW5lIElONl9JU19BRERSX01DX1NJVEVMT0NBTChhKSBcCisJKElONl9JU19BRERSX01VTFRJQ0FTVChhKQkJCQkJICAgICAgXAorCSAmJiAoKCgoX19jb25zdCB1aW50OF90ICopIChhKSlbMV0gJiAweGYpID09IDB4NSkpCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTUNfT1JHTE9DQUwoYSkgXAorCShJTjZfSVNfQUREUl9NVUxUSUNBU1QoYSkJCQkJCSAgICAgIFwKKwkgJiYgKCgoKF9fY29uc3QgdWludDhfdCAqKSAoYSkpWzFdICYgMHhmKSA9PSAweDgpKQorCisjZGVmaW5lIElONl9JU19BRERSX01DX0dMT0JBTChhKSBcCisJKElONl9JU19BRERSX01VTFRJQ0FTVChhKQkJCQkJICAgICAgXAorCSAmJiAoKCgoX19jb25zdCB1aW50OF90ICopIChhKSlbMV0gJiAweGYpID09IDB4ZSkpCisKKy8qIElQdjYgcGFja2V0IGluZm9ybWF0aW9uLiAgKi8KK3N0cnVjdCBpbjZfcGt0aW5mbworICB7CisgICAgc3RydWN0IGluNl9hZGRyIGlwaTZfYWRkcjsJLyogc3JjL2RzdCBJUHY2IGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgaXBpNl9pZmluZGV4OwkvKiBzZW5kL3JlY3YgaW50ZXJmYWNlIGluZGV4ICovCisgIH07CisKKy8qIElQdjYgTVRVIGluZm9ybWF0aW9uLiAgKi8KK3N0cnVjdCBpcDZfbXR1aW5mbworICB7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBpcDZtX2FkZHI7IC8qIGRzdCBhZGRyZXNzIGluY2x1ZGluZyB6b25lIElEICovCisgICAgdWludDMyX3QgaXA2bV9tdHU7CQkgICAvKiBwYXRoIE1UVSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KKyAgfTsKKworCisjaWZkZWYgX19VU0VfR05VCisvKiBPYnNvbGV0ZSBob3AtYnktaG9wIGFuZCBEZXN0aW5hdGlvbiBPcHRpb25zIFByb2Nlc3NpbmcgKFJGQyAyMjkyKS4gICovCitleHRlcm4gaW50IGluZXQ2X29wdGlvbl9zcGFjZSAoaW50IF9fbmJ5dGVzKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX2luaXQgKHZvaWQgKl9fYnAsIHN0cnVjdCBjbXNnaGRyICoqX19jbXNncCwKKwkJCSAgICAgIGludCBfX3R5cGUpIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIGludCBpbmV0Nl9vcHRpb25fYXBwZW5kIChzdHJ1Y3QgY21zZ2hkciAqX19jbXNnLAorCQkJCV9fY29uc3QgdWludDhfdCAqX190eXBlcCwgaW50IF9fbXVsdHgsCisJCQkJaW50IF9fcGx1c3kpIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworZXh0ZXJuIHVpbnQ4X3QgKmluZXQ2X29wdGlvbl9hbGxvYyAoc3RydWN0IGNtc2doZHIgKl9fY21zZywgaW50IF9fZGF0YWxlbiwKKwkJCQkgICAgaW50IF9fbXVsdHgsIGludCBfX3BsdXN5KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX25leHQgKF9fY29uc3Qgc3RydWN0IGNtc2doZHIgKl9fY21zZywKKwkJCSAgICAgIHVpbnQ4X3QgKipfX3RwdHJwKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0aW9uX2ZpbmQgKF9fY29uc3Qgc3RydWN0IGNtc2doZHIgKl9fY21zZywKKwkJCSAgICAgIHVpbnQ4X3QgKipfX3RwdHJwLCBpbnQgX190eXBlKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKworCisvKiBIb3AtYnktSG9wIGFuZCBEZXN0aW5hdGlvbiBPcHRpb25zIFByb2Nlc3NpbmcgKFJGQyAzNTQyKS4gICovCitleHRlcm4gaW50IGluZXQ2X29wdF9pbml0ICh2b2lkICpfX2V4dGJ1Ziwgc29ja2xlbl90IF9fZXh0bGVuKSBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9vcHRfYXBwZW5kICh2b2lkICpfX2V4dGJ1Ziwgc29ja2xlbl90IF9fZXh0bGVuLCBpbnQgX19vZmZzZXQsCisJCQkgICAgIHVpbnQ4X3QgX190eXBlLCBzb2NrbGVuX3QgX19sZW4sIHVpbnQ4X3QgX19hbGlnbiwKKwkJCSAgICAgdm9pZCAqKl9fZGF0YWJ1ZnApIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X29wdF9maW5pc2ggKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4sIGludCBfX29mZnNldCkKKyAgICAgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X3NldF92YWwgKHZvaWQgKl9fZGF0YWJ1ZiwgaW50IF9fb2Zmc2V0LCB2b2lkICpfX3ZhbCwKKwkJCSAgICAgIHNvY2tsZW5fdCBfX3ZhbGxlbikgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X25leHQgKHZvaWQgKl9fZXh0YnVmLCBzb2NrbGVuX3QgX19leHRsZW4sIGludCBfX29mZnNldCwKKwkJCSAgIHVpbnQ4X3QgKl9fdHlwZXAsIHNvY2tsZW5fdCAqX19sZW5wLAorCQkJICAgdm9pZCAqKl9fZGF0YWJ1ZnApIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X29wdF9maW5kICh2b2lkICpfX2V4dGJ1Ziwgc29ja2xlbl90IF9fZXh0bGVuLCBpbnQgX19vZmZzZXQsCisJCQkgICB1aW50OF90IF9fdHlwZSwgc29ja2xlbl90ICpfX2xlbnAsCisJCQkgICB2b2lkICoqX19kYXRhYnVmcCkgX19USFJPVzsKK2V4dGVybiBpbnQgaW5ldDZfb3B0X2dldF92YWwgKHZvaWQgKl9fZGF0YWJ1ZiwgaW50IF9fb2Zmc2V0LCB2b2lkICpfX3ZhbCwKKwkJCSAgICAgIHNvY2tsZW5fdCBfX3ZhbGxlbikgX19USFJPVzsKKworCisvKiBSb3V0aW5nIEhlYWRlciBPcHRpb24gKFJGQyAzNTQyKS4gICovCitleHRlcm4gc29ja2xlbl90IGluZXQ2X3J0aF9zcGFjZSAoaW50IF9fdHlwZSwgaW50IF9fc2VnbWVudHMpIF9fVEhST1c7CitleHRlcm4gdm9pZCAqaW5ldDZfcnRoX2luaXQgKHZvaWQgKl9fYnAsIHNvY2tsZW5fdCBfX2JwX2xlbiwgaW50IF9fdHlwZSwKKwkJCSAgICAgaW50IF9fc2VnbWVudHMpIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X3J0aF9hZGQgKHZvaWQgKl9fYnAsIF9fY29uc3Qgc3RydWN0IGluNl9hZGRyICpfX2FkZHIpIF9fVEhST1c7CitleHRlcm4gaW50IGluZXQ2X3J0aF9yZXZlcnNlIChfX2NvbnN0IHZvaWQgKl9faW4sIHZvaWQgKl9fb3V0KSBfX1RIUk9XOworZXh0ZXJuIGludCBpbmV0Nl9ydGhfc2VnbWVudHMgKF9fY29uc3Qgdm9pZCAqX19icCkgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgaW42X2FkZHIgKmluZXQ2X3J0aF9nZXRhZGRyIChfX2NvbnN0IHZvaWQgKl9fYnAsIGludCBfX2luZGV4KQorICAgICBfX1RIUk9XOworCisKKy8qIE11bHRpY2FzdCBzb3VyY2UgZmlsdGVyIHN1cHBvcnQuICAqLworCisvKiBHZXQgSVB2NCBzb3VyY2UgZmlsdGVyLiAgKi8KK2V4dGVybiBpbnQgZ2V0aXB2NHNvdXJjZWZpbHRlciAoaW50IF9fcywgc3RydWN0IGluX2FkZHIgX19pbnRlcmZhY2VfYWRkciwKKwkJCQlzdHJ1Y3QgaW5fYWRkciBfX2dyb3VwLCB1aW50MzJfdCAqX19mbW9kZSwKKwkJCQl1aW50MzJfdCAqX19udW1zcmMsIHN0cnVjdCBpbl9hZGRyICpfX3NsaXN0KQorICAgICBfX1RIUk9XOworCisvKiBTZXQgSVB2NCBzb3VyY2UgZmlsdGVyLiAgKi8KK2V4dGVybiBpbnQgc2V0aXB2NHNvdXJjZWZpbHRlciAoaW50IF9fcywgc3RydWN0IGluX2FkZHIgX19pbnRlcmZhY2VfYWRkciwKKwkJCQlzdHJ1Y3QgaW5fYWRkciBfX2dyb3VwLCB1aW50MzJfdCBfX2Ztb2RlLAorCQkJCXVpbnQzMl90IF9fbnVtc3JjLAorCQkJCV9fY29uc3Qgc3RydWN0IGluX2FkZHIgKl9fc2xpc3QpCisgICAgIF9fVEhST1c7CisKKworLyogR2V0IHNvdXJjZSBmaWx0ZXIuICAqLworZXh0ZXJuIGludCBnZXRzb3VyY2VmaWx0ZXIgKGludCBfX3MsIHVpbnQzMl90IF9faW50ZXJmYWNlX2FkZHIsCisJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKl9fZ3JvdXAsCisJCQkgICAgc29ja2xlbl90IF9fZ3JvdXBsZW4sIHVpbnQzMl90ICpfX2Ztb2RlLAorCQkJICAgIHVpbnQzMl90ICpfX251bXNyYywKKwkJCSAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqX19zbGlzdCkgX19USFJPVzsKKworLyogU2V0IHNvdXJjZSBmaWx0ZXIuICAqLworZXh0ZXJuIGludCBzZXRzb3VyY2VmaWx0ZXIgKGludCBfX3MsIHVpbnQzMl90IF9faW50ZXJmYWNlX2FkZHIsCisJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKl9fZ3JvdXAsCisJCQkgICAgc29ja2xlbl90IF9fZ3JvdXBsZW4sIHVpbnQzMl90IF9fZm1vZGUsCisJCQkgICAgdWludDMyX3QgX19udW1zcmMsCisJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqX19zbGlzdCkgX19USFJPVzsKKyNlbmRpZgkvKiB1c2UgR05VICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBuZXRpbmV0L2luLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbl9zeXN0bS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2luX3N5c3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhMDhlMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbl9zeXN0bS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIFN5c3RlbSBzcGVjaWZpYyB0eXBlIGRlZmluaXRpb25zIGZvciBuZXR3b3JraW5nIGNvZGUuCisgICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX05FVElORVRfSU5fU1lTVE1fSAorI2RlZmluZSBfTkVUSU5FVF9JTl9TWVNUTV9IIDEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBOZXR3b3JrIG9yZGVyIHZlcnNpb25zIG9mIHZhcmlvdXMgZGF0YSB0eXBlcy4gVW5mb3J0dW5hdGVseSwgQlNECisgKiBhc3N1bWVzIHNwZWNpZmljIHNpemVzIGZvciBzaG9ydHMgKDE2IGJpdCkgYW5kIGxvbmdzICgzMiBiaXQpIHdoaWNoCisgKiBkb24ndCBob2xkIGluIGdlbmVyYWwuIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBuZXR3b3JrIG9yZGVyIHZlcnNpb25zCisgKiBtYXkgbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBuYXRpdmUgZGF0YSB0eXBlcy4KKyAqLworCit0eXBlZGVmIHVfaW50MTZfdCBuX3Nob3J0OyAgICAgIC8qIHNob3J0IGFzIHJlY2VpdmVkIGZyb20gdGhlIG5ldCAqLwordHlwZWRlZiB1X2ludDMyX3Qgbl9sb25nOyAgICAgICAvKiBsb25nIGFzIHJlY2VpdmVkIGZyb20gdGhlIG5ldCAgKi8KK3R5cGVkZWYgdV9pbnQzMl90IG5fdGltZTsgICAgICAgLyogbXMgc2luY2UgMDA6MDAgR01ULCBieXRlIHJldiAgICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpbmV0L2luX3N5c3RtLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5MTQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcC5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTMsOTUsOTYsOTcsOTgsOTksMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX05FVElORVRfSVBfSAorI2RlZmluZSBfX05FVElORVRfSVBfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3N0cnVjdCB0aW1lc3RhbXAKKyAgeworICAgIHVfaW50OF90IGxlbjsKKyAgICB1X2ludDhfdCBwdHI7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorICAgIHVuc2lnbmVkIGludCBmbGFnczo0OworICAgIHVuc2lnbmVkIGludCBvdmVyZmxvdzo0OworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVuc2lnbmVkIGludCBvdmVyZmxvdzo0OworICAgIHVuc2lnbmVkIGludCBmbGFnczo0OworI2Vsc2UKKyMgZXJyb3IJIlBsZWFzZSBmaXggPGJpdHMvZW5kaWFuLmg+IgorI2VuZGlmCisgICAgdV9pbnQzMl90IGRhdGFbOV07CisgIH07CisKK3N0cnVjdCBpcGhkcgorICB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorICAgIHVuc2lnbmVkIGludCBpaGw6NDsKKyAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjo0OworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOjQ7CisgICAgdW5zaWduZWQgaW50IGlobDo0OworI2Vsc2UKKyMgZXJyb3IJIlBsZWFzZSBmaXggPGJpdHMvZW5kaWFuLmg+IgorI2VuZGlmCisgICAgdV9pbnQ4X3QgdG9zOworICAgIHVfaW50MTZfdCB0b3RfbGVuOworICAgIHVfaW50MTZfdCBpZDsKKyAgICB1X2ludDE2X3QgZnJhZ19vZmY7CisgICAgdV9pbnQ4X3QgdHRsOworICAgIHVfaW50OF90IHByb3RvY29sOworICAgIHVfaW50MTZfdCBjaGVjazsKKyAgICB1X2ludDMyX3Qgc2FkZHI7CisgICAgdV9pbnQzMl90IGRhZGRyOworICAgIC8qVGhlIG9wdGlvbnMgc3RhcnQgaGVyZS4gKi8KKyAgfTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGludGVybmV0IHByb3RvY29sIHZlcnNpb24gNC4KKyAqIFBlciBSRkMgNzkxLCBTZXB0ZW1iZXIgMTk4MS4KKyAqLworCisvKgorICogU3RydWN0dXJlIG9mIGFuIGludGVybmV0IGhlYWRlciwgbmFrZWQgb2Ygb3B0aW9ucy4KKyAqLworc3RydWN0IGlwCisgIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IGlwX2hsOjQ7CQkvKiBoZWFkZXIgbGVuZ3RoICovCisgICAgdW5zaWduZWQgaW50IGlwX3Y6NDsJCS8qIHZlcnNpb24gKi8KKyNlbmRpZgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgaXBfdjo0OwkJLyogdmVyc2lvbiAqLworICAgIHVuc2lnbmVkIGludCBpcF9obDo0OwkJLyogaGVhZGVyIGxlbmd0aCAqLworI2VuZGlmCisgICAgdV9pbnQ4X3QgaXBfdG9zOwkJCS8qIHR5cGUgb2Ygc2VydmljZSAqLworICAgIHVfc2hvcnQgaXBfbGVuOwkJCS8qIHRvdGFsIGxlbmd0aCAqLworICAgIHVfc2hvcnQgaXBfaWQ7CQkJLyogaWRlbnRpZmljYXRpb24gKi8KKyAgICB1X3Nob3J0IGlwX29mZjsJCQkvKiBmcmFnbWVudCBvZmZzZXQgZmllbGQgKi8KKyNkZWZpbmUJSVBfUkYgMHg4MDAwCQkJLyogcmVzZXJ2ZWQgZnJhZ21lbnQgZmxhZyAqLworI2RlZmluZQlJUF9ERiAweDQwMDAJCQkvKiBkb250IGZyYWdtZW50IGZsYWcgKi8KKyNkZWZpbmUJSVBfTUYgMHgyMDAwCQkJLyogbW9yZSBmcmFnbWVudHMgZmxhZyAqLworI2RlZmluZQlJUF9PRkZNQVNLIDB4MWZmZgkJLyogbWFzayBmb3IgZnJhZ21lbnRpbmcgYml0cyAqLworICAgIHVfaW50OF90IGlwX3R0bDsJCQkvKiB0aW1lIHRvIGxpdmUgKi8KKyAgICB1X2ludDhfdCBpcF9wOwkJCS8qIHByb3RvY29sICovCisgICAgdV9zaG9ydCBpcF9zdW07CQkJLyogY2hlY2tzdW0gKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpcF9zcmMsIGlwX2RzdDsJLyogc291cmNlIGFuZCBkZXN0IGFkZHJlc3MgKi8KKyAgfTsKKworLyoKKyAqIFRpbWUgc3RhbXAgb3B0aW9uIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGlwX3RpbWVzdGFtcAorICB7CisgICAgdV9pbnQ4X3QgaXB0X2NvZGU7CQkJLyogSVBPUFRfVFMgKi8KKyAgICB1X2ludDhfdCBpcHRfbGVuOwkJCS8qIHNpemUgb2Ygc3RydWN0dXJlICh2YXJpYWJsZSkgKi8KKyAgICB1X2ludDhfdCBpcHRfcHRyOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgZW50cnkgKi8KKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisgICAgdW5zaWduZWQgaW50IGlwdF9mbGc6NDsJCS8qIGZsYWdzLCBzZWUgYmVsb3cgKi8KKyAgICB1bnNpZ25lZCBpbnQgaXB0X29mbHc6NDsJCS8qIG92ZXJmbG93IGNvdW50ZXIgKi8KKyNlbmRpZgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyAgICB1bnNpZ25lZCBpbnQgaXB0X29mbHc6NDsJCS8qIG92ZXJmbG93IGNvdW50ZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgaXB0X2ZsZzo0OwkJLyogZmxhZ3MsIHNlZSBiZWxvdyAqLworI2VuZGlmCisgICAgdV9pbnQzMl90IGRhdGFbOV07CisgIH07CisjZW5kaWYgLyogX19VU0VfQlNEICovCisKKyNkZWZpbmUJSVBWRVJTSU9OCTQgICAgICAgICAgICAgICAvKiBJUCB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZQlJUF9NQVhQQUNLRVQJNjU1MzUJCS8qIG1heGltdW0gcGFja2V0IHNpemUgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBJUCB0eXBlIG9mIHNlcnZpY2UgKGlwX3RvcykKKyAqLworI2RlZmluZQlJUFRPU19UT1NfTUFTSwkJMHgxRQorI2RlZmluZQlJUFRPU19UT1ModG9zKQkJKCh0b3MpICYgSVBUT1NfVE9TX01BU0spCisjZGVmaW5lCUlQVE9TX0xPV0RFTEFZCQkweDEwCisjZGVmaW5lCUlQVE9TX1RIUk9VR0hQVVQJMHgwOAorI2RlZmluZQlJUFRPU19SRUxJQUJJTElUWQkweDA0CisjZGVmaW5lCUlQVE9TX0xPV0NPU1QJCTB4MDIKKyNkZWZpbmUJSVBUT1NfTUlOQ09TVAkJSVBUT1NfTE9XQ09TVAorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIElQIHByZWNlZGVuY2UgKGFsc28gaW4gaXBfdG9zKSAoaG9wZWZ1bGx5IHVudXNlZCkKKyAqLworI2RlZmluZQlJUFRPU19QUkVDX01BU0sJCQkweGUwCisjZGVmaW5lCUlQVE9TX1BSRUModG9zKSAgICAgICAgICAgICAgICAoKHRvcykgJiBJUFRPU19QUkVDX01BU0spCisjZGVmaW5lCUlQVE9TX1BSRUNfTkVUQ09OVFJPTAkJMHhlMAorI2RlZmluZQlJUFRPU19QUkVDX0lOVEVSTkVUQ09OVFJPTAkweGMwCisjZGVmaW5lCUlQVE9TX1BSRUNfQ1JJVElDX0VDUAkJMHhhMAorI2RlZmluZQlJUFRPU19QUkVDX0ZMQVNIT1ZFUlJJREUJMHg4MAorI2RlZmluZQlJUFRPU19QUkVDX0ZMQVNICQkweDYwCisjZGVmaW5lCUlQVE9TX1BSRUNfSU1NRURJQVRFCQkweDQwCisjZGVmaW5lCUlQVE9TX1BSRUNfUFJJT1JJVFkJCTB4MjAKKyNkZWZpbmUJSVBUT1NfUFJFQ19ST1VUSU5FCQkweDAwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3Igb3B0aW9ucy4KKyAqLworI2RlZmluZQlJUE9QVF9DT1BZCQkweDgwCisjZGVmaW5lCUlQT1BUX0NMQVNTX01BU0sJMHg2MAorI2RlZmluZQlJUE9QVF9OVU1CRVJfTUFTSwkweDFmCisKKyNkZWZpbmUJSVBPUFRfQ09QSUVEKG8pCQkoKG8pICYgSVBPUFRfQ09QWSkKKyNkZWZpbmUJSVBPUFRfQ0xBU1MobykJCSgobykgJiBJUE9QVF9DTEFTU19NQVNLKQorI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykgJiBJUE9QVF9OVU1CRVJfTUFTSykKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9ERUJNRUFTCQkweDQwCisjZGVmaW5lCUlQT1BUX01FQVNVUkVNRU5UICAgICAgIElQT1BUX0RFQk1FQVMKKyNkZWZpbmUJSVBPUFRfUkVTRVJWRUQyCQkweDYwCisKKyNkZWZpbmUJSVBPUFRfRU9MCQkwCQkvKiBlbmQgb2Ygb3B0aW9uIGxpc3QgKi8KKyNkZWZpbmUJSVBPUFRfRU5ECQlJUE9QVF9FT0wKKyNkZWZpbmUJSVBPUFRfTk9QCQkxCQkvKiBubyBvcGVyYXRpb24gKi8KKyNkZWZpbmUJSVBPUFRfTk9PUAkJSVBPUFRfTk9QCisKKyNkZWZpbmUJSVBPUFRfUlIJCTcJCS8qIHJlY29yZCBwYWNrZXQgcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfVFMJCTY4CQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSVBPUFRfVElNRVNUQU1QCQlJUE9QVF9UUworI2RlZmluZQlJUE9QVF9TRUNVUklUWQkJMTMwCQkvKiBwcm92aWRlIHMsYyxoLHRjYyAqLworI2RlZmluZQlJUE9QVF9TRUMJCUlQT1BUX1NFQ1VSSVRZCisjZGVmaW5lCUlQT1BUX0xTUlIJCTEzMQkJLyogbG9vc2Ugc291cmNlIHJvdXRlICovCisjZGVmaW5lCUlQT1BUX1NBVElECQkxMzYJCS8qIHNhdG5ldCBpZCAqLworI2RlZmluZQlJUE9QVF9TSUQJCUlQT1BUX1NBVElECisjZGVmaW5lCUlQT1BUX1NTUlIJCTEzNwkJLyogc3RyaWN0IHNvdXJjZSByb3V0ZSAqLworI2RlZmluZQlJUE9QVF9SQQkJMTQ4CQkvKiByb3V0ZXIgYWxlcnQgKi8KKworLyoKKyAqIE9mZnNldHMgdG8gZmllbGRzIGluIG9wdGlvbnMgb3RoZXIgdGhhbiBFT0wgYW5kIE5PUC4KKyAqLworI2RlZmluZQlJUE9QVF9PUFRWQUwJCTAJCS8qIG9wdGlvbiBJRCAqLworI2RlZmluZQlJUE9QVF9PTEVOCQkxCQkvKiBvcHRpb24gbGVuZ3RoICovCisjZGVmaW5lCUlQT1BUX09GRlNFVAkJMgkJLyogb2Zmc2V0IHdpdGhpbiBvcHRpb24gKi8KKyNkZWZpbmUJSVBPUFRfTUlOT0ZGCQk0CQkvKiBtaW4gdmFsdWUgb2YgYWJvdmUgKi8KKworI2RlZmluZQlNQVhfSVBPUFRMRU4JCTQwCisKKy8qIGZsYWcgYml0cyBmb3IgaXB0X2ZsZyAqLworI2RlZmluZQlJUE9QVF9UU19UU09OTFkJCTAJCS8qIHRpbWVzdGFtcHMgb25seSAqLworI2RlZmluZQlJUE9QVF9UU19UU0FOREFERFIJMQkJLyogdGltZXN0YW1wcyBhbmQgYWRkcmVzc2VzICovCisjZGVmaW5lCUlQT1BUX1RTX1BSRVNQRUMJMwkJLyogc3BlY2lmaWVkIG1vZHVsZXMgb25seSAqLworCisvKiBiaXRzIGZvciBzZWN1cml0eSAobm90IGJ5dGUgc3dhcHBlZCkgKi8KKyNkZWZpbmUJSVBPUFRfU0VDVVJfVU5DTEFTUwkweDAwMDAKKyNkZWZpbmUJSVBPUFRfU0VDVVJfQ09ORklECTB4ZjEzNQorI2RlZmluZQlJUE9QVF9TRUNVUl9FRlRPCTB4Nzg5YQorI2RlZmluZQlJUE9QVF9TRUNVUl9NTU1NCTB4YmM0ZAorI2RlZmluZQlJUE9QVF9TRUNVUl9SRVNUUgkweGFmMTMKKyNkZWZpbmUJSVBPUFRfU0VDVVJfU0VDUkVUCTB4ZDc4OAorI2RlZmluZQlJUE9QVF9TRUNVUl9UT1BTRUNSRVQJMHg2YmM1CisKKy8qCisgKiBJbnRlcm5ldCBpbXBsZW1lbnRhdGlvbiBwYXJhbWV0ZXJzLgorICovCisjZGVmaW5lCU1BWFRUTAkJMjU1CQkvKiBtYXhpbXVtIHRpbWUgdG8gbGl2ZSAoc2Vjb25kcykgKi8KKyNkZWZpbmUJSVBERUZUVEwJNjQJCS8qIGRlZmF1bHQgdHRsLCBmcm9tIFJGQyAxMzQwICovCisjZGVmaW5lCUlQRlJBR1RUTAk2MAkJLyogdGltZSB0byBsaXZlIGZvciBmcmFncywgc2xvd2h6ICovCisjZGVmaW5lCUlQVFRMREVDCTEJCS8qIHN1YnRyYWN0ZWQgd2hlbiBmb3J3YXJkaW5nICovCisKKyNkZWZpbmUJSVBfTVNTCQk1NzYJCS8qIGRlZmF1bHQgbWF4aW11bSBzZWdtZW50IHNpemUgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5ldGluZXQvaXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwNi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjJhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvaXA2LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCAyMDAxLCAyMDAzLCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lQNl9ICisjZGVmaW5lIF9ORVRJTkVUX0lQNl9IIDEKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCitzdHJ1Y3QgaXA2X2hkcgorICB7CisgICAgdW5pb24KKyAgICAgIHsKKwlzdHJ1Y3QgaXA2X2hkcmN0bAorCSAgeworCSAgICB1aW50MzJfdCBpcDZfdW4xX2Zsb3c7ICAgLyogNCBiaXRzIHZlcnNpb24sIDggYml0cyBUQywKKwkJCQkJMjAgYml0cyBmbG93LUlEICovCisJICAgIHVpbnQxNl90IGlwNl91bjFfcGxlbjsgICAvKiBwYXlsb2FkIGxlbmd0aCAqLworCSAgICB1aW50OF90ICBpcDZfdW4xX254dDsgICAgLyogbmV4dCBoZWFkZXIgKi8KKwkgICAgdWludDhfdCAgaXA2X3VuMV9obGltOyAgIC8qIGhvcCBsaW1pdCAqLworCSAgfSBpcDZfdW4xOworCXVpbnQ4X3QgaXA2X3VuMl92ZmM7ICAgICAgIC8qIDQgYml0cyB2ZXJzaW9uLCB0b3AgNCBiaXRzIHRjbGFzcyAqLworICAgICAgfSBpcDZfY3RsdW47CisgICAgc3RydWN0IGluNl9hZGRyIGlwNl9zcmM7ICAgICAgLyogc291cmNlIGFkZHJlc3MgKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgaXA2X2RzdDsgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisgIH07CisKKyNkZWZpbmUgaXA2X3ZmYyAgIGlwNl9jdGx1bi5pcDZfdW4yX3ZmYworI2RlZmluZSBpcDZfZmxvdyAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9mbG93CisjZGVmaW5lIGlwNl9wbGVuICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX3BsZW4KKyNkZWZpbmUgaXA2X254dCAgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfbnh0CisjZGVmaW5lIGlwNl9obGltICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2hsaW0KKyNkZWZpbmUgaXA2X2hvcHMgIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfaGxpbQorCisvKiBHZW5lcmljIGV4dGVuc2lvbiBoZWFkZXIuICAqLworc3RydWN0IGlwNl9leHQKKyAgeworICAgIHVpbnQ4X3QgIGlwNmVfbnh0OwkJLyogbmV4dCBoZWFkZXIuICAqLworICAgIHVpbnQ4X3QgIGlwNmVfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzLiAgKi8KKyAgfTsKKworLyogSG9wLWJ5LUhvcCBvcHRpb25zIGhlYWRlci4gICovCitzdHJ1Y3QgaXA2X2hiaAorICB7CisgICAgdWludDhfdCAgaXA2aF9ueHQ7CQkvKiBuZXh0IGhlYWRlci4gICovCisgICAgdWludDhfdCAgaXA2aF9sZW47CQkvKiBsZW5ndGggaW4gdW5pdHMgb2YgOCBvY3RldHMuICAqLworICAgIC8qIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KKyAgfTsKKworLyogRGVzdGluYXRpb24gb3B0aW9ucyBoZWFkZXIgKi8KK3N0cnVjdCBpcDZfZGVzdAorICB7CisgICAgdWludDhfdCAgaXA2ZF9ueHQ7CQkvKiBuZXh0IGhlYWRlciAqLworICAgIHVpbnQ4X3QgIGlwNmRfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgLyogZm9sbG93ZWQgYnkgb3B0aW9ucyAqLworICB9OworCisvKiBSb3V0aW5nIGhlYWRlciAqLworc3RydWN0IGlwNl9ydGhkcgorICB7CisgICAgdWludDhfdCAgaXA2cl9ueHQ7CQkvKiBuZXh0IGhlYWRlciAqLworICAgIHVpbnQ4X3QgIGlwNnJfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisgICAgdWludDhfdCAgaXA2cl90eXBlOwkJLyogcm91dGluZyB0eXBlICovCisgICAgdWludDhfdCAgaXA2cl9zZWdsZWZ0OwkvKiBzZWdtZW50cyBsZWZ0ICovCisgICAgLyogZm9sbG93ZWQgYnkgcm91dGluZyB0eXBlIHNwZWNpZmljIGRhdGEgKi8KKyAgfTsKKworLyogVHlwZSAwIFJvdXRpbmcgaGVhZGVyICovCitzdHJ1Y3QgaXA2X3J0aGRyMAorICB7CisgICAgdWludDhfdCAgaXA2cjBfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKyAgICB1aW50OF90ICBpcDZyMF9sZW47CQkvKiBsZW5ndGggaW4gdW5pdHMgb2YgOCBvY3RldHMgKi8KKyAgICB1aW50OF90ICBpcDZyMF90eXBlOwkvKiBhbHdheXMgemVybyAqLworICAgIHVpbnQ4X3QgIGlwNnIwX3NlZ2xlZnQ7CS8qIHNlZ21lbnRzIGxlZnQgKi8KKyAgICB1aW50OF90ICBpcDZyMF9yZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZmllbGQgKi8KKyAgICB1aW50OF90ICBpcDZyMF9zbG1hcFszXTsJLyogc3RyaWN0L2xvb3NlIGJpdCBtYXAgKi8KKyAgICAvKiBmb2xsb3dlZCBieSB1cCB0byAxMjcgc3RydWN0IGluNl9hZGRyICovCisgICAgc3RydWN0IGluNl9hZGRyIGlwNnIwX2FkZHJbMF07CisgIH07CisKKy8qIEZyYWdtZW50IGhlYWRlciAqLworc3RydWN0IGlwNl9mcmFnCisgIHsKKyAgICB1aW50OF90ICAgaXA2Zl9ueHQ7CQkvKiBuZXh0IGhlYWRlciAqLworICAgIHVpbnQ4X3QgICBpcDZmX3Jlc2VydmVkOwkvKiByZXNlcnZlZCBmaWVsZCAqLworICAgIHVpbnQxNl90ICBpcDZmX29mZmxnOwkvKiBvZmZzZXQsIHJlc2VydmVkLCBhbmQgZmxhZyAqLworICAgIHVpbnQzMl90ICBpcDZmX2lkZW50OwkvKiBpZGVudGlmaWNhdGlvbiAqLworICB9OworCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJUDZGX09GRl9NQVNLICAgICAgIDB4ZmZmOCAgLyogbWFzayBvdXQgb2Zmc2V0IGZyb20gX29mZmxnICovCisjIGRlZmluZSBJUDZGX1JFU0VSVkVEX01BU0sgIDB4MDAwNiAgLyogcmVzZXJ2ZWQgYml0cyBpbiBpcDZmX29mZmxnICovCisjIGRlZmluZSBJUDZGX01PUkVfRlJBRyAgICAgIDB4MDAwMSAgLyogbW9yZS1mcmFnbWVudHMgZmxhZyAqLworI2Vsc2UgICAvKiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4gKi8KKyMgZGVmaW5lIElQNkZfT0ZGX01BU0sgICAgICAgMHhmOGZmICAvKiBtYXNrIG91dCBvZmZzZXQgZnJvbSBfb2ZmbGcgKi8KKyMgZGVmaW5lIElQNkZfUkVTRVJWRURfTUFTSyAgMHgwNjAwICAvKiByZXNlcnZlZCBiaXRzIGluIGlwNmZfb2ZmbGcgKi8KKyMgZGVmaW5lIElQNkZfTU9SRV9GUkFHICAgICAgMHgwMTAwICAvKiBtb3JlLWZyYWdtZW50cyBmbGFnICovCisjZW5kaWYKKworLyogSVB2NiBvcHRpb25zICovCitzdHJ1Y3QgaXA2X29wdAorICB7CisgICAgdWludDhfdCAgaXA2b190eXBlOworICAgIHVpbnQ4X3QgIGlwNm9fbGVuOworICB9OworCisvKiBUaGUgaGlnaC1vcmRlciAzIGJpdHMgb2YgdGhlIG9wdGlvbiB0eXBlIGRlZmluZSB0aGUgYmVoYXZpb3IKKyAqIHdoZW4gcHJvY2Vzc2luZyBhbiB1bmtub3duIG9wdGlvbiBhbmQgd2hldGhlciBvciBub3QgdGhlIG9wdGlvbgorICogY29udGVudCBjaGFuZ2VzIGluIGZsaWdodC4KKyAqLworI2RlZmluZSBJUDZPUFRfVFlQRShvKQkJKChvKSAmIDB4YzApCisjZGVmaW5lIElQNk9QVF9UWVBFX1NLSVAJMHgwMAorI2RlZmluZSBJUDZPUFRfVFlQRV9ESVNDQVJECTB4NDAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfRk9SQ0VJQ01QCTB4ODAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfSUNNUAkweGMwCisjZGVmaW5lIElQNk9QVF9UWVBFX01VVEFCTEUJMHgyMAorCisvKiBTcGVjaWFsIG9wdGlvbiB0eXBlcyBmb3IgcGFkZGluZy4gICovCisjZGVmaW5lIElQNk9QVF9QQUQxCTAKKyNkZWZpbmUgSVA2T1BUX1BBRE4JMQorCisjZGVmaW5lIElQNk9QVF9KVU1CTwkJMHhjMgorI2RlZmluZSBJUDZPUFRfTlNBUF9BRERSCTB4YzMKKyNkZWZpbmUgSVA2T1BUX1RVTk5FTF9MSU1JVAkweDA0CisjZGVmaW5lIElQNk9QVF9ST1VURVJfQUxFUlQJMHgwNQorCisvKiBKdW1ibyBQYXlsb2FkIE9wdGlvbiAqLworc3RydWN0IGlwNl9vcHRfanVtYm8KKyAgeworICAgIHVpbnQ4X3QgIGlwNm9qX3R5cGU7CisgICAgdWludDhfdCAgaXA2b2pfbGVuOworICAgIHVpbnQ4X3QgIGlwNm9qX2p1bWJvX2xlbls0XTsKKyAgfTsKKyNkZWZpbmUgSVA2T1BUX0pVTUJPX0xFTgk2CisKKy8qIE5TQVAgQWRkcmVzcyBPcHRpb24gKi8KK3N0cnVjdCBpcDZfb3B0X25zYXAKKyAgeworICAgIHVpbnQ4X3QgIGlwNm9uX3R5cGU7CisgICAgdWludDhfdCAgaXA2b25fbGVuOworICAgIHVpbnQ4X3QgIGlwNm9uX3NyY19uc2FwX2xlbjsKKyAgICB1aW50OF90ICBpcDZvbl9kc3RfbnNhcF9sZW47CisgICAgICAvKiBmb2xsb3dlZCBieSBzb3VyY2UgTlNBUCAqLworICAgICAgLyogZm9sbG93ZWQgYnkgZGVzdGluYXRpb24gTlNBUCAqLworICB9OworCisvKiBUdW5uZWwgTGltaXQgT3B0aW9uICovCitzdHJ1Y3QgaXA2X29wdF90dW5uZWwKKyAgeworICAgIHVpbnQ4X3QgIGlwNm90X3R5cGU7CisgICAgdWludDhfdCAgaXA2b3RfbGVuOworICAgIHVpbnQ4X3QgIGlwNm90X2VuY2FwX2xpbWl0OworICB9OworCisvKiBSb3V0ZXIgQWxlcnQgT3B0aW9uICovCitzdHJ1Y3QgaXA2X29wdF9yb3V0ZXIKKyAgeworICAgIHVpbnQ4X3QgIGlwNm9yX3R5cGU7CisgICAgdWludDhfdCAgaXA2b3JfbGVuOworICAgIHVpbnQ4X3QgIGlwNm9yX3ZhbHVlWzJdOworICB9OworCisvKiBSb3V0ZXIgYWxlcnQgdmFsdWVzIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpICovCisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBJUDZfQUxFUlRfTUxECTB4MDAwMAorIyBkZWZpbmUgSVA2X0FMRVJUX1JTVlAJMHgwMDAxCisjIGRlZmluZSBJUDZfQUxFUlRfQU4JMHgwMDAyCisjZWxzZSAvKiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJTkcgKi8KKyMgZGVmaW5lIElQNl9BTEVSVF9NTEQJMHgwMDAwCisjIGRlZmluZSBJUDZfQUxFUlRfUlNWUAkweDAxMDAKKyMgZGVmaW5lIElQNl9BTEVSVF9BTgkweDAyMDAKKyNlbmRpZgorCisjZW5kaWYgLyogbmV0aW5ldC9pcDYuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L2lwX2ljbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcF9pY21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjOGU5YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcF9pY21wLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfX05FVElORVRfSVBfSUNNUF9ICisjZGVmaW5lIF9fTkVUSU5FVF9JUF9JQ01QX0ggICAgMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK19fQkVHSU5fREVDTFMKKworc3RydWN0IGljbXBoZHIKK3sKKyAgdV9pbnQ4X3QgdHlwZTsJCS8qIG1lc3NhZ2UgdHlwZSAqLworICB1X2ludDhfdCBjb2RlOwkJLyogdHlwZSBzdWItY29kZSAqLworICB1X2ludDE2X3QgY2hlY2tzdW07CisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1X2ludDE2X3QJaWQ7CisgICAgICB1X2ludDE2X3QJc2VxdWVuY2U7CisgICAgfSBlY2hvOwkJCS8qIGVjaG8gZGF0YWdyYW0gKi8KKyAgICB1X2ludDMyX3QJZ2F0ZXdheTsJLyogZ2F0ZXdheSBhZGRyZXNzICovCisgICAgc3RydWN0CisgICAgeworICAgICAgdV9pbnQxNl90CV9fdW51c2VkOworICAgICAgdV9pbnQxNl90CW10dTsKKyAgICB9IGZyYWc7CQkJLyogcGF0aCBtdHUgZGlzY292ZXJ5ICovCisgIH0gdW47Cit9OworCisjZGVmaW5lIElDTVBfRUNIT1JFUExZCQkwCS8qIEVjaG8gUmVwbHkJCQkqLworI2RlZmluZSBJQ01QX0RFU1RfVU5SRUFDSAkzCS8qIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlCSovCisjZGVmaW5lIElDTVBfU09VUkNFX1FVRU5DSAk0CS8qIFNvdXJjZSBRdWVuY2gJCSovCisjZGVmaW5lIElDTVBfUkVESVJFQ1QJCTUJLyogUmVkaXJlY3QgKGNoYW5nZSByb3V0ZSkJKi8KKyNkZWZpbmUgSUNNUF9FQ0hPCQk4CS8qIEVjaG8gUmVxdWVzdAkJCSovCisjZGVmaW5lIElDTVBfVElNRV9FWENFRURFRAkxMQkvKiBUaW1lIEV4Y2VlZGVkCQkqLworI2RlZmluZSBJQ01QX1BBUkFNRVRFUlBST0IJMTIJLyogUGFyYW1ldGVyIFByb2JsZW0JCSovCisjZGVmaW5lIElDTVBfVElNRVNUQU1QCQkxMwkvKiBUaW1lc3RhbXAgUmVxdWVzdAkJKi8KKyNkZWZpbmUgSUNNUF9USU1FU1RBTVBSRVBMWQkxNAkvKiBUaW1lc3RhbXAgUmVwbHkJCSovCisjZGVmaW5lIElDTVBfSU5GT19SRVFVRVNUCTE1CS8qIEluZm9ybWF0aW9uIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfSU5GT19SRVBMWQkJMTYJLyogSW5mb3JtYXRpb24gUmVwbHkJCSovCisjZGVmaW5lIElDTVBfQUREUkVTUwkJMTcJLyogQWRkcmVzcyBNYXNrIFJlcXVlc3QJCSovCisjZGVmaW5lIElDTVBfQUREUkVTU1JFUExZCTE4CS8qIEFkZHJlc3MgTWFzayBSZXBseQkJKi8KKyNkZWZpbmUgTlJfSUNNUF9UWVBFUwkJMTgKKworCisvKiBDb2RlcyBmb3IgVU5SRUFDSC4gKi8KKyNkZWZpbmUgSUNNUF9ORVRfVU5SRUFDSAkwCS8qIE5ldHdvcmsgVW5yZWFjaGFibGUJCSovCisjZGVmaW5lIElDTVBfSE9TVF9VTlJFQUNICTEJLyogSG9zdCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9QUk9UX1VOUkVBQ0gJMgkvKiBQcm90b2NvbCBVbnJlYWNoYWJsZQkJKi8KKyNkZWZpbmUgSUNNUF9QT1JUX1VOUkVBQ0gJMwkvKiBQb3J0IFVucmVhY2hhYmxlCQkqLworI2RlZmluZSBJQ01QX0ZSQUdfTkVFREVECTQJLyogRnJhZ21lbnRhdGlvbiBOZWVkZWQvREYgc2V0CSovCisjZGVmaW5lIElDTVBfU1JfRkFJTEVECQk1CS8qIFNvdXJjZSBSb3V0ZSBmYWlsZWQJCSovCisjZGVmaW5lIElDTVBfTkVUX1VOS05PV04JNgorI2RlZmluZSBJQ01QX0hPU1RfVU5LTk9XTgk3CisjZGVmaW5lIElDTVBfSE9TVF9JU09MQVRFRAk4CisjZGVmaW5lIElDTVBfTkVUX0FOTwkJOQorI2RlZmluZSBJQ01QX0hPU1RfQU5PCQkxMAorI2RlZmluZSBJQ01QX05FVF9VTlJfVE9TCTExCisjZGVmaW5lIElDTVBfSE9TVF9VTlJfVE9TCTEyCisjZGVmaW5lIElDTVBfUEtUX0ZJTFRFUkVECTEzCS8qIFBhY2tldCBmaWx0ZXJlZCAqLworI2RlZmluZSBJQ01QX1BSRUNfVklPTEFUSU9OCTE0CS8qIFByZWNlZGVuY2UgdmlvbGF0aW9uICovCisjZGVmaW5lIElDTVBfUFJFQ19DVVRPRkYJMTUJLyogUHJlY2VkZW5jZSBjdXQgb2ZmICovCisjZGVmaW5lIE5SX0lDTVBfVU5SRUFDSAkJMTUJLyogaW5zdGVhZCBvZiBoYXJkY29kaW5nIGltbWVkaWF0ZSB2YWx1ZSAqLworCisvKiBDb2RlcyBmb3IgUkVESVJFQ1QuICovCisjZGVmaW5lIElDTVBfUkVESVJfTkVUCQkwCS8qIFJlZGlyZWN0IE5ldAkJCSovCisjZGVmaW5lIElDTVBfUkVESVJfSE9TVAkJMQkvKiBSZWRpcmVjdCBIb3N0CQkqLworI2RlZmluZSBJQ01QX1JFRElSX05FVFRPUwkyCS8qIFJlZGlyZWN0IE5ldCBmb3IgVE9TCQkqLworI2RlZmluZSBJQ01QX1JFRElSX0hPU1RUT1MJMwkvKiBSZWRpcmVjdCBIb3N0IGZvciBUT1MJKi8KKworLyogQ29kZXMgZm9yIFRJTUVfRVhDRUVERUQuICovCisjZGVmaW5lIElDTVBfRVhDX1RUTAkJMAkvKiBUVEwgY291bnQgZXhjZWVkZWQJCSovCisjZGVmaW5lIElDTVBfRVhDX0ZSQUdUSU1FCTEJLyogRnJhZ21lbnQgUmVhc3MgdGltZSBleGNlZWRlZAkqLworCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXBfaWNtcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKworLyoKKyAqIEludGVybmFsIG9mIGFuIElDTVAgUm91dGVyIEFkdmVydGlzZW1lbnQKKyAqLworc3RydWN0IGljbXBfcmFfYWRkcgoreworICB1X2ludDMyX3QgaXJhX2FkZHI7CisgIHVfaW50MzJfdCBpcmFfcHJlZmVyZW5jZTsKK307CisKK3N0cnVjdCBpY21wCit7CisgIHVfaW50OF90ICBpY21wX3R5cGU7CS8qIHR5cGUgb2YgbWVzc2FnZSwgc2VlIGJlbG93ICovCisgIHVfaW50OF90ICBpY21wX2NvZGU7CS8qIHR5cGUgc3ViIGNvZGUgKi8KKyAgdV9pbnQxNl90IGljbXBfY2tzdW07CS8qIG9uZXMgY29tcGxlbWVudCBjaGVja3N1bSBvZiBzdHJ1Y3QgKi8KKyAgdW5pb24KKyAgeworICAgIHVfY2hhciBpaF9wcHRyOwkJLyogSUNNUF9QQVJBTVBST0IgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpaF9nd2FkZHI7CS8qIGdhdGV3YXkgYWRkcmVzcyAqLworICAgIHN0cnVjdCBpaF9pZHNlcQkJLyogZWNobyBkYXRhZ3JhbSAqLworICAgIHsKKyAgICAgIHVfaW50MTZfdCBpY2RfaWQ7CisgICAgICB1X2ludDE2X3QgaWNkX3NlcTsKKyAgICB9IGloX2lkc2VxOworICAgIHVfaW50MzJfdCBpaF92b2lkOworCisgICAgLyogSUNNUF9VTlJFQUNIX05FRURGUkFHIC0tIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgKi8KKyAgICBzdHJ1Y3QgaWhfcG10dQorICAgIHsKKyAgICAgIHVfaW50MTZfdCBpcG1fdm9pZDsKKyAgICAgIHVfaW50MTZfdCBpcG1fbmV4dG10dTsKKyAgICB9IGloX3BtdHU7CisKKyAgICBzdHJ1Y3QgaWhfcnRyYWR2CisgICAgeworICAgICAgdV9pbnQ4X3QgaXJ0X251bV9hZGRyczsKKyAgICAgIHVfaW50OF90IGlydF93cGE7CisgICAgICB1X2ludDE2X3QgaXJ0X2xpZmV0aW1lOworICAgIH0gaWhfcnRyYWR2OworICB9IGljbXBfaHVuOworI2RlZmluZQlpY21wX3BwdHIJaWNtcF9odW4uaWhfcHB0cgorI2RlZmluZQlpY21wX2d3YWRkcglpY21wX2h1bi5paF9nd2FkZHIKKyNkZWZpbmUJaWNtcF9pZAkJaWNtcF9odW4uaWhfaWRzZXEuaWNkX2lkCisjZGVmaW5lCWljbXBfc2VxCWljbXBfaHVuLmloX2lkc2VxLmljZF9zZXEKKyNkZWZpbmUJaWNtcF92b2lkCWljbXBfaHVuLmloX3ZvaWQKKyNkZWZpbmUJaWNtcF9wbXZvaWQJaWNtcF9odW4uaWhfcG10dS5pcG1fdm9pZAorI2RlZmluZQlpY21wX25leHRtdHUJaWNtcF9odW4uaWhfcG10dS5pcG1fbmV4dG10dQorI2RlZmluZQlpY21wX251bV9hZGRycwlpY21wX2h1bi5paF9ydHJhZHYuaXJ0X251bV9hZGRycworI2RlZmluZQlpY21wX3dwYQlpY21wX2h1bi5paF9ydHJhZHYuaXJ0X3dwYQorI2RlZmluZQlpY21wX2xpZmV0aW1lCWljbXBfaHVuLmloX3J0cmFkdi5pcnRfbGlmZXRpbWUKKyAgdW5pb24KKyAgeworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHVfaW50MzJfdCBpdHNfb3RpbWU7CisgICAgICB1X2ludDMyX3QgaXRzX3J0aW1lOworICAgICAgdV9pbnQzMl90IGl0c190dGltZTsKKyAgICB9IGlkX3RzOworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHN0cnVjdCBpcCBpZGlfaXA7CisgICAgICAvKiBvcHRpb25zIGFuZCB0aGVuIDY0IGJpdHMgb2YgZGF0YSAqLworICAgIH0gaWRfaXA7CisgICAgc3RydWN0IGljbXBfcmFfYWRkciBpZF9yYWR2OworICAgIHVfaW50MzJfdCAgIGlkX21hc2s7CisgICAgdV9pbnQ4X3QgICAgaWRfZGF0YVsxXTsKKyAgfSBpY21wX2R1bjsKKyNkZWZpbmUJaWNtcF9vdGltZQlpY21wX2R1bi5pZF90cy5pdHNfb3RpbWUKKyNkZWZpbmUJaWNtcF9ydGltZQlpY21wX2R1bi5pZF90cy5pdHNfcnRpbWUKKyNkZWZpbmUJaWNtcF90dGltZQlpY21wX2R1bi5pZF90cy5pdHNfdHRpbWUKKyNkZWZpbmUJaWNtcF9pcAkJaWNtcF9kdW4uaWRfaXAuaWRpX2lwCisjZGVmaW5lCWljbXBfcmFkdglpY21wX2R1bi5pZF9yYWR2CisjZGVmaW5lCWljbXBfbWFzawlpY21wX2R1bi5pZF9tYXNrCisjZGVmaW5lCWljbXBfZGF0YQlpY21wX2R1bi5pZF9kYXRhCit9OworCisvKgorICogTG93ZXIgYm91bmRzIG9uIHBhY2tldCBsZW5ndGhzIGZvciB2YXJpb3VzIHR5cGVzLgorICogRm9yIHRoZSBlcnJvciBhZHZpY2UgcGFja2V0cyBtdXN0IGZpcnN0IGluc3VyZSB0aGF0IHRoZQorICogcGFja2V0IGlzIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSByZXR1cm5lZCBpcCBoZWFkZXIuCisgKiBPbmx5IHRoZW4gY2FuIHdlIGRvIHRoZSBjaGVjayB0byBzZWUgaWYgNjQgYml0cyBvZiBwYWNrZXQKKyAqIGRhdGEgaGF2ZSBiZWVuIHJldHVybmVkLCBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm5lZAorICogaXAgaGVhZGVyIGxlbmd0aC4KKyAqLworI2RlZmluZQlJQ01QX01JTkxFTgk4CQkJCS8qIGFicyBtaW5pbXVtICovCisjZGVmaW5lCUlDTVBfVFNMRU4JKDggKyAzICogc2l6ZW9mIChuX3RpbWUpKQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSUNNUF9NQVNLTEVOCTEyCQkJCS8qIGFkZHJlc3MgbWFzayAqLworI2RlZmluZQlJQ01QX0FEVkxFTk1JTgkoOCArIHNpemVvZiAoc3RydWN0IGlwKSArIDgpCS8qIG1pbiAqLworI2lmbmRlZiBfSVBfVkhMCisjZGVmaW5lCUlDTVBfQURWTEVOKHApCSg4ICsgKChwKS0+aWNtcF9pcC5pcF9obCA8PCAyKSArIDgpCisJLyogTi5CLjogbXVzdCBzZXBhcmF0ZWx5IGNoZWNrIHRoYXQgaXBfaGwgPj0gNSAqLworI2Vsc2UKKyNkZWZpbmUJSUNNUF9BRFZMRU4ocCkJKDggKyAoSVBfVkhMX0hMKChwKS0+aWNtcF9pcC5pcF92aGwpIDw8IDIpICsgOCkKKwkvKiBOLkIuOiBtdXN0IHNlcGFyYXRlbHkgY2hlY2sgdGhhdCBoZWFkZXIgbGVuZ3RoID49IDUgKi8KKyNlbmRpZgorCisvKiBEZWZpbml0aW9uIG9mIHR5cGUgYW5kIGNvZGUgZmllbGRzLiAqLworLyogZGVmaW5lZCBhYm92ZTogSUNNUF9FQ0hPUkVQTFksIElDTVBfUkVESVJFQ1QsIElDTVBfRUNITyAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0gJCTMJCS8qIGRlc3QgdW5yZWFjaGFibGUsIGNvZGVzOiAqLworI2RlZmluZQlJQ01QX1NPVVJDRVFVRU5DSAk0CQkvKiBwYWNrZXQgbG9zdCwgc2xvdyBkb3duICovCisjZGVmaW5lCUlDTVBfUk9VVEVSQURWRVJUCTkJCS8qIHJvdXRlciBhZHZlcnRpc2VtZW50ICovCisjZGVmaW5lCUlDTVBfUk9VVEVSU09MSUNJVAkxMAkJLyogcm91dGVyIHNvbGljaXRhdGlvbiAqLworI2RlZmluZQlJQ01QX1RJTVhDRUVECQkxMQkJLyogdGltZSBleGNlZWRlZCwgY29kZTogKi8KKyNkZWZpbmUJSUNNUF9QQVJBTVBST0IJCTEyCQkvKiBpcCBoZWFkZXIgYmFkICovCisjZGVmaW5lCUlDTVBfVFNUQU1QCQkxMwkJLyogdGltZXN0YW1wIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9UU1RBTVBSRVBMWQkxNAkJLyogdGltZXN0YW1wIHJlcGx5ICovCisjZGVmaW5lCUlDTVBfSVJFUQkJMTUJCS8qIGluZm9ybWF0aW9uIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9JUkVRUkVQTFkJCTE2CQkvKiBpbmZvcm1hdGlvbiByZXBseSAqLworI2RlZmluZQlJQ01QX01BU0tSRVEJCTE3CQkvKiBhZGRyZXNzIG1hc2sgcmVxdWVzdCAqLworI2RlZmluZQlJQ01QX01BU0tSRVBMWQkJMTgJCS8qIGFkZHJlc3MgbWFzayByZXBseSAqLworCisjZGVmaW5lCUlDTVBfTUFYVFlQRQkJMTgKKworLyogVU5SRUFDSCBjb2RlcyAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfTkVUCSAgICAgICAgMAkvKiBiYWQgbmV0ICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9IT1NUCSAgICAgICAgMQkvKiBiYWQgaG9zdCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfUFJPVE9DT0wJICAgICAgICAyCS8qIGJhZCBwcm90b2NvbCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfUE9SVAkgICAgICAgIDMJLyogYmFkIHBvcnQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX05FRURGUkFHCSAgICAgICAgNAkvKiBJUF9ERiBjYXVzZWQgZHJvcCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfU1JDRkFJTAkgICAgICAgIDUJLyogc3JjIHJvdXRlIGZhaWxlZCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV04gICAgICAgIDYJLyogdW5rbm93biBuZXQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTiAgICAgICA3CS8qIHVua25vd24gaG9zdCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfSVNPTEFURUQJICAgICAgICA4CS8qIHNyYyBob3N0IGlzb2xhdGVkICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9ORVRfUFJPSElCCSAgICAgICAgOQkvKiBuZXQgZGVuaWVkICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSF9IT1NUX1BST0hJQiAgICAgICAgMTAJLyogaG9zdCBkZW5pZWQgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX1RPU05FVAkgICAgICAgIDExCS8qIGJhZCB0b3MgZm9yIG5ldCAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfVE9TSE9TVAkgICAgICAgIDEyCS8qIGJhZCB0b3MgZm9yIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUIgICAgICAxMwkvKiBhZG1pbiBwcm9oaWIgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRSAgICAxNAkvKiBob3N0IHByZWMgdmlvLiAqLworI2RlZmluZQlJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkYgIDE1CS8qIHByZWMgY3V0b2ZmICovCisKKy8qIFJFRElSRUNUIGNvZGVzICovCisjZGVmaW5lCUlDTVBfUkVESVJFQ1RfTkVUCTAJCS8qIGZvciBuZXR3b3JrICovCisjZGVmaW5lCUlDTVBfUkVESVJFQ1RfSE9TVAkxCQkvKiBmb3IgaG9zdCAqLworI2RlZmluZQlJQ01QX1JFRElSRUNUX1RPU05FVAkyCQkvKiBmb3IgdG9zIGFuZCBuZXQgKi8KKyNkZWZpbmUJSUNNUF9SRURJUkVDVF9UT1NIT1NUCTMJCS8qIGZvciB0b3MgYW5kIGhvc3QgKi8KKworLyogVElNRVhDRUVEIGNvZGVzICovCisjZGVmaW5lCUlDTVBfVElNWENFRURfSU5UUkFOUwkwCQkvKiB0dGw9PTAgaW4gdHJhbnNpdCAqLworI2RlZmluZQlJQ01QX1RJTVhDRUVEX1JFQVNTCTEJCS8qIHR0bD09MCBpbiByZWFzcyAqLworCisvKiBQQVJBTVBST0IgY29kZSAqLworI2RlZmluZQlJQ01QX1BBUkFNUFJPQl9PUFRBQlNFTlQgMQkJLyogcmVxLiBvcHQuIGFic2VudCAqLworCisjZGVmaW5lCUlDTVBfSU5GT1RZUEUodHlwZSkgXAorCSgodHlwZSkgPT0gSUNNUF9FQ0hPUkVQTFkgfHwgKHR5cGUpID09IElDTVBfRUNITyB8fCBcCisJKHR5cGUpID09IElDTVBfUk9VVEVSQURWRVJUIHx8ICh0eXBlKSA9PSBJQ01QX1JPVVRFUlNPTElDSVQgfHwgXAorCSh0eXBlKSA9PSBJQ01QX1RTVEFNUCB8fCAodHlwZSkgPT0gSUNNUF9UU1RBTVBSRVBMWSB8fCBcCisJKHR5cGUpID09IElDTVBfSVJFUSB8fCAodHlwZSkgPT0gSUNNUF9JUkVRUkVQTFkgfHwgXAorCSh0eXBlKSA9PSBJQ01QX01BU0tSRVEgfHwgKHR5cGUpID09IElDTVBfTUFTS1JFUExZKQorCisjZW5kaWYgLyogX19VU0VfQlNEICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBuZXRpbmV0L2lwX2ljbXAuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3RjcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTg0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvdGNwLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICovCisKKyNpZm5kZWYgX05FVElORVRfVENQX0gKKyNkZWZpbmUgX05FVElORVRfVENQX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyoKKyAqIFVzZXItc2V0dGFibGUgb3B0aW9ucyAodXNlZCB3aXRoIHNldHNvY2tvcHQpLgorICovCisjZGVmaW5lCVRDUF9OT0RFTEFZCSAxCS8qIERvbid0IGRlbGF5IHNlbmQgdG8gY29hbGVzY2UgcGFja2V0cyAgKi8KKyNkZWZpbmUJVENQX01BWFNFRwkgMgkvKiBTZXQgbWF4aW11bSBzZWdtZW50IHNpemUgICovCisjZGVmaW5lIFRDUF9DT1JLCSAzCS8qIENvbnRyb2wgc2VuZGluZyBvZiBwYXJ0aWFsIGZyYW1lcyAgKi8KKyNkZWZpbmUgVENQX0tFRVBJRExFCSA0CS8qIFN0YXJ0IGtlZXBsaXZlcyBhZnRlciB0aGlzIHBlcmlvZCAqLworI2RlZmluZSBUQ1BfS0VFUElOVFZMCSA1CS8qIEludGVydmFsIGJldHdlZW4ga2VlcGFsaXZlcyAqLworI2RlZmluZSBUQ1BfS0VFUENOVAkgNgkvKiBOdW1iZXIgb2Yga2VlcGFsaXZlcyBiZWZvcmUgZGVhdGggKi8KKyNkZWZpbmUgVENQX1NZTkNOVAkgNwkvKiBOdW1iZXIgb2YgU1lOIHJldHJhbnNtaXRzICovCisjZGVmaW5lIFRDUF9MSU5HRVIyCSA4CS8qIExpZmUgdGltZSBvZiBvcnBoYW5lZCBGSU4tV0FJVC0yIHN0YXRlICovCisjZGVmaW5lIFRDUF9ERUZFUl9BQ0NFUFQgOQkvKiBXYWtlIHVwIGxpc3RlbmVyIG9ubHkgd2hlbiBkYXRhIGFycml2ZSAqLworI2RlZmluZSBUQ1BfV0lORE9XX0NMQU1QIDEwCS8qIEJvdW5kIGFkdmVydGlzZWQgd2luZG93ICovCisjZGVmaW5lIFRDUF9JTkZPCSAxMQkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbm5lY3Rpb24uICovCisjZGVmaW5lCVRDUF9RVUlDS0FDSwkgMTIJLyogQm9jay9yZWVuYWJsZSBxdWljayBBQ0tzLiAgKi8KKyNkZWZpbmUgVENQX0NPTkdFU1RJT04JIDEzCS8qIENvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0uICAqLworI2RlZmluZSBUQ1BfTUQ1U0lHCSAxNAkvKiBUQ1AgTUQ1IFNpZ25hdHVyZSAoUkZDMjM4NSkgKi8KKworI2lmZGVmIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworIyBpZmRlZiBfX0ZBVk9SX0JTRAordHlwZWRlZgl1X2ludDMyX3QgdGNwX3NlcTsKKy8qCisgKiBUQ1AgaGVhZGVyLgorICogUGVyIFJGQyA3OTMsIFNlcHRlbWJlciwgMTk4MS4KKyAqLworc3RydWN0IHRjcGhkcgorICB7CisgICAgdV9pbnQxNl90IHRoX3Nwb3J0OwkJLyogc291cmNlIHBvcnQgKi8KKyAgICB1X2ludDE2X3QgdGhfZHBvcnQ7CQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCisgICAgdGNwX3NlcSB0aF9zZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB0Y3Bfc2VxIHRoX2FjazsJCS8qIGFja25vd2xlZGdlbWVudCBudW1iZXIgKi8KKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1X2ludDhfdCB0aF94Mjo0OwkJLyogKHVudXNlZCkgKi8KKyAgICB1X2ludDhfdCB0aF9vZmY6NDsJCS8qIGRhdGEgb2Zmc2V0ICovCisjICBlbmRpZgorIyAgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVfaW50OF90IHRoX29mZjo0OwkJLyogZGF0YSBvZmZzZXQgKi8KKyAgICB1X2ludDhfdCB0aF94Mjo0OwkJLyogKHVudXNlZCkgKi8KKyMgIGVuZGlmCisgICAgdV9pbnQ4X3QgdGhfZmxhZ3M7CisjICBkZWZpbmUgVEhfRklOCTB4MDEKKyMgIGRlZmluZSBUSF9TWU4JMHgwMgorIyAgZGVmaW5lIFRIX1JTVAkweDA0CisjICBkZWZpbmUgVEhfUFVTSAkweDA4CisjICBkZWZpbmUgVEhfQUNLCTB4MTAKKyMgIGRlZmluZSBUSF9VUkcJMHgyMAorICAgIHVfaW50MTZfdCB0aF93aW47CQkvKiB3aW5kb3cgKi8KKyAgICB1X2ludDE2X3QgdGhfc3VtOwkJLyogY2hlY2tzdW0gKi8KKyAgICB1X2ludDE2X3QgdGhfdXJwOwkJLyogdXJnZW50IHBvaW50ZXIgKi8KK307CisKKyMgZWxzZSAvKiAhX19GQVZPUl9CU0QgKi8KK3N0cnVjdCB0Y3BoZHIKKyAgeworICAgIHVfaW50MTZfdCBzb3VyY2U7CisgICAgdV9pbnQxNl90IGRlc3Q7CisgICAgdV9pbnQzMl90IHNlcTsKKyAgICB1X2ludDMyX3QgYWNrX3NlcTsKKyMgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB1X2ludDE2X3QgcmVzMTo0OworICAgIHVfaW50MTZfdCBkb2ZmOjQ7CisgICAgdV9pbnQxNl90IGZpbjoxOworICAgIHVfaW50MTZfdCBzeW46MTsKKyAgICB1X2ludDE2X3QgcnN0OjE7CisgICAgdV9pbnQxNl90IHBzaDoxOworICAgIHVfaW50MTZfdCBhY2s6MTsKKyAgICB1X2ludDE2X3QgdXJnOjE7CisgICAgdV9pbnQxNl90IHJlczI6MjsKKyMgIGVsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHVfaW50MTZfdCBkb2ZmOjQ7CisgICAgdV9pbnQxNl90IHJlczE6NDsKKyAgICB1X2ludDE2X3QgcmVzMjoyOworICAgIHVfaW50MTZfdCB1cmc6MTsKKyAgICB1X2ludDE2X3QgYWNrOjE7CisgICAgdV9pbnQxNl90IHBzaDoxOworICAgIHVfaW50MTZfdCByc3Q6MTsKKyAgICB1X2ludDE2X3Qgc3luOjE7CisgICAgdV9pbnQxNl90IGZpbjoxOworIyAgZWxzZQorIyAgIGVycm9yICJBZGp1c3QgeW91ciA8Yml0cy9lbmRpYW4uaD4gZGVmaW5lcyIKKyMgIGVuZGlmCisgICAgdV9pbnQxNl90IHdpbmRvdzsKKyAgICB1X2ludDE2X3QgY2hlY2s7CisgICAgdV9pbnQxNl90IHVyZ19wdHI7Cit9OworIyBlbmRpZiAvKiBfX0ZBVk9SX0JTRCAqLworCitlbnVtCit7CisgIFRDUF9FU1RBQkxJU0hFRCA9IDEsCisgIFRDUF9TWU5fU0VOVCwKKyAgVENQX1NZTl9SRUNWLAorICBUQ1BfRklOX1dBSVQxLAorICBUQ1BfRklOX1dBSVQyLAorICBUQ1BfVElNRV9XQUlULAorICBUQ1BfQ0xPU0UsCisgIFRDUF9DTE9TRV9XQUlULAorICBUQ1BfTEFTVF9BQ0ssCisgIFRDUF9MSVNURU4sCisgIFRDUF9DTE9TSU5HICAgLyogbm93IGEgdmFsaWQgc3RhdGUgKi8KK307CisKKyMgZGVmaW5lIFRDUE9QVF9FT0wJCTAKKyMgZGVmaW5lIFRDUE9QVF9OT1AJCTEKKyMgZGVmaW5lIFRDUE9QVF9NQVhTRUcJCTIKKyMgZGVmaW5lIFRDUE9MRU5fTUFYU0VHCQk0CisjIGRlZmluZSBUQ1BPUFRfV0lORE9XCQkzCisjIGRlZmluZSBUQ1BPTEVOX1dJTkRPVwkJMworIyBkZWZpbmUgVENQT1BUX1NBQ0tfUEVSTUlUVEVECTQJCS8qIEV4cGVyaW1lbnRhbCAqLworIyBkZWZpbmUgVENQT0xFTl9TQUNLX1BFUk1JVFRFRAkyCisjIGRlZmluZSBUQ1BPUFRfU0FDSwkJNQkJLyogRXhwZXJpbWVudGFsICovCisjIGRlZmluZSBUQ1BPUFRfVElNRVNUQU1QCTgKKyMgZGVmaW5lIFRDUE9MRU5fVElNRVNUQU1QCTEwCisjIGRlZmluZSBUQ1BPTEVOX1RTVEFNUF9BUFBBCShUQ1BPTEVOX1RJTUVTVEFNUCsyKSAvKiBhcHBlbmRpeCBBICovCisKKyMgZGVmaW5lIFRDUE9QVF9UU1RBTVBfSERSCVwKKyAgICAoVENQT1BUX05PUDw8MjR8VENQT1BUX05PUDw8MTZ8VENQT1BUX1RJTUVTVEFNUDw8OHxUQ1BPTEVOX1RJTUVTVEFNUCkKKworLyoKKyAqIERlZmF1bHQgbWF4aW11bSBzZWdtZW50IHNpemUgZm9yIFRDUC4KKyAqIFdpdGggYW4gSVAgTVNTIG9mIDU3NiwgdGhpcyBpcyA1MzYsCisgKiBidXQgNTEyIGlzIHByb2JhYmx5IG1vcmUgY29udmVuaWVudC4KKyAqIFRoaXMgc2hvdWxkIGJlIGRlZmluZWQgYXMgTUlOKDUxMiwgSVBfTVNTIC0gc2l6ZW9mIChzdHJ1Y3QgdGNwaXBoZHIpKS4KKyAqLworIyBkZWZpbmUgVENQX01TUwk1MTIKKworIyBkZWZpbmUgVENQX01BWFdJTgk2NTUzNQkvKiBsYXJnZXN0IHZhbHVlIGZvciAodW5zY2FsZWQpIHdpbmRvdyAqLworCisjIGRlZmluZSBUQ1BfTUFYX1dJTlNISUZUCTE0CS8qIG1heGltdW0gd2luZG93IHNoaWZ0ICovCisKKyMgZGVmaW5lIFNPTF9UQ1AJCTYJLyogVENQIGxldmVsICovCisKKworIyBkZWZpbmUgVENQSV9PUFRfVElNRVNUQU1QUwkxCisjIGRlZmluZSBUQ1BJX09QVF9TQUNLCQkyCisjIGRlZmluZSBUQ1BJX09QVF9XU0NBTEUJNAorIyBkZWZpbmUgVENQSV9PUFRfRUNOCQk4CisKKy8qIFZhbHVlcyBmb3IgdGNwaV9zdGF0ZS4gICovCitlbnVtIHRjcF9jYV9zdGF0ZQoreworICBUQ1BfQ0FfT3BlbiA9IDAsCisgIFRDUF9DQV9EaXNvcmRlciA9IDEsCisgIFRDUF9DQV9DV1IgPSAyLAorICBUQ1BfQ0FfUmVjb3ZlcnkgPSAzLAorICBUQ1BfQ0FfTG9zcyA9IDQKK307CisKK3N0cnVjdCB0Y3BfaW5mbworeworICB1X2ludDhfdAl0Y3BpX3N0YXRlOworICB1X2ludDhfdAl0Y3BpX2NhX3N0YXRlOworICB1X2ludDhfdAl0Y3BpX3JldHJhbnNtaXRzOworICB1X2ludDhfdAl0Y3BpX3Byb2JlczsKKyAgdV9pbnQ4X3QJdGNwaV9iYWNrb2ZmOworICB1X2ludDhfdAl0Y3BpX29wdGlvbnM7CisgIHVfaW50OF90CXRjcGlfc25kX3dzY2FsZSA6IDQsIHRjcGlfcmN2X3dzY2FsZSA6IDQ7CisKKyAgdV9pbnQzMl90CXRjcGlfcnRvOworICB1X2ludDMyX3QJdGNwaV9hdG87CisgIHVfaW50MzJfdAl0Y3BpX3NuZF9tc3M7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9tc3M7CisKKyAgdV9pbnQzMl90CXRjcGlfdW5hY2tlZDsKKyAgdV9pbnQzMl90CXRjcGlfc2Fja2VkOworICB1X2ludDMyX3QJdGNwaV9sb3N0OworICB1X2ludDMyX3QJdGNwaV9yZXRyYW5zOworICB1X2ludDMyX3QJdGNwaV9mYWNrZXRzOworCisgIC8qIFRpbWVzLiAqLworICB1X2ludDMyX3QJdGNwaV9sYXN0X2RhdGFfc2VudDsKKyAgdV9pbnQzMl90CXRjcGlfbGFzdF9hY2tfc2VudDsJLyogTm90IHJlbWVtYmVyZWQsIHNvcnJ5LiAgKi8KKyAgdV9pbnQzMl90CXRjcGlfbGFzdF9kYXRhX3JlY3Y7CisgIHVfaW50MzJfdAl0Y3BpX2xhc3RfYWNrX3JlY3Y7CisKKyAgLyogTWV0cmljcy4gKi8KKyAgdV9pbnQzMl90CXRjcGlfcG10dTsKKyAgdV9pbnQzMl90CXRjcGlfcmN2X3NzdGhyZXNoOworICB1X2ludDMyX3QJdGNwaV9ydHQ7CisgIHVfaW50MzJfdAl0Y3BpX3J0dHZhcjsKKyAgdV9pbnQzMl90CXRjcGlfc25kX3NzdGhyZXNoOworICB1X2ludDMyX3QJdGNwaV9zbmRfY3duZDsKKyAgdV9pbnQzMl90CXRjcGlfYWR2bXNzOworICB1X2ludDMyX3QJdGNwaV9yZW9yZGVyaW5nOworCisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9ydHQ7CisgIHVfaW50MzJfdAl0Y3BpX3Jjdl9zcGFjZTsKKworICB1X2ludDMyX3QJdGNwaV90b3RhbF9yZXRyYW5zOworfTsKKworCisvKiBGb3IgVENQX01ENVNJRyBzb2NrZXQgb3B0aW9uLiAgKi8KKyNkZWZpbmUgVENQX01ENVNJR19NQVhLRVlMRU4JODAKKworc3RydWN0IHRjcF9tZDVzaWcKK3sKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgdGNwbV9hZGRyOwkJLyogQWRkcmVzcyBhc3NvY2lhdGVkLiAgKi8KKyAgdV9pbnQxNl90CV9fdGNwbV9wYWQxOwkJCS8qIFplcm8uICAqLworICB1X2ludDE2X3QJdGNwbV9rZXlsZW47CQkJLyogS2V5IGxlbmd0aC4gICovCisgIHVfaW50MzJfdAlfX3RjcG1fcGFkMjsJCQkvKiBaZXJvLiAgKi8KKyAgdV9pbnQ4X3QJdGNwbV9rZXlbVENQX01ENVNJR19NQVhLRVlMRU5dOwkvKiBLZXkgKGJpbmFyeSkuICAqLworfTsKKworI2VuZGlmIC8qIE1pc2MuICAqLworCisjZW5kaWYgLyogbmV0aW5ldC90Y3AuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YjY5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGluZXQvdWRwLmgKQEAgLTAsMCArMSw3OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5ODIsIDE5ODYgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX05FVElORVRfVURQX0gKKyNkZWZpbmUgX19ORVRJTkVUX1VEUF9IICAgIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworLyogVURQIGhlYWRlciBhcyBzcGVjaWZpZWQgYnkgUkZDIDc2OCwgQXVndXN0IDE5ODAuICovCisjaWZkZWYgX19GQVZPUl9CU0QKKworc3RydWN0IHVkcGhkcgoreworICB1X2ludDE2X3QgdWhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworICB1X2ludDE2X3QgdWhfZHBvcnQ7CQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCisgIHVfaW50MTZfdCB1aF91bGVuOwkJLyogdWRwIGxlbmd0aCAqLworICB1X2ludDE2X3QgdWhfc3VtOwkJLyogdWRwIGNoZWNrc3VtICovCit9OworCisjZWxzZQorCitzdHJ1Y3QgdWRwaGRyCit7CisgIHVfaW50MTZfdCBzb3VyY2U7CisgIHVfaW50MTZfdCBkZXN0OworICB1X2ludDE2X3QgbGVuOworICB1X2ludDE2X3QgY2hlY2s7Cit9OworI2VuZGlmCisKKyNkZWZpbmUgU09MX1VEUCAgICAgICAgICAgIDE3ICAgICAgLyogc29ja29wdCBsZXZlbCBmb3IgVURQICovCisKKyNlbmRpZiAvKiBuZXRpbmV0L3VkcC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldGlweC9pcHguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0aXB4L2lweC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjQyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldGlweC9pcHguaApAQCAtMCwwICsxLDExMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NiwgOTcsIDk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9fTkVUSVBYX0lQWF9ICisjZGVmaW5lIF9fTkVUSVBYX0lQWF9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NvY2thZGRyLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBTT0xfSVBYICAgIDI1NiAgICAgICAgICAvKiBzb2Nrb3B0IGxldmVsICovCisKKyNkZWZpbmUgSVBYX1RZUEUgICAgICAgIDEKKyNkZWZpbmUgSVBYX05PREVfTEVOCTYKKyNkZWZpbmUgSVBYX01UVQkJNTc2CisKK3N0cnVjdCBzb2NrYWRkcl9pcHgKKyAgeworICAgIHNhX2ZhbWlseV90IHNpcHhfZmFtaWx5OworICAgIHVfaW50MTZfdCBzaXB4X3BvcnQ7CisgICAgdV9pbnQzMl90IHNpcHhfbmV0d29yazsKKyAgICB1bnNpZ25lZCBjaGFyIHNpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOworICAgIHVfaW50OF90IHNpcHhfdHlwZTsKKyAgICB1bnNpZ25lZCBjaGFyIHNpcHhfemVybzsJLyogMTYgYnl0ZSBmaWxsICovCisgIH07CisKKy8qCisgKglTbyB3ZSBjYW4gZml0IHRoZSBleHRyYSBpbmZvIGZvciBTSU9DU0lGQUREUiBpbnRvIHRoZSBhZGRyZXNzIG5pY2VseQorICovCisKKyNkZWZpbmUgc2lweF9zcGVjaWFsCXNpcHhfcG9ydAorI2RlZmluZSBzaXB4X2FjdGlvbglzaXB4X3plcm8KKyNkZWZpbmUgSVBYX0RMVElURgkwCisjZGVmaW5lIElQWF9DUlRJVEYJMQorCit0eXBlZGVmIHN0cnVjdCBpcHhfcm91dGVfZGVmaW5pdGlvbgorICB7CisgICAgdW5zaWduZWQgbG9uZyBpcHhfbmV0d29yazsKKyAgICB1bnNpZ25lZCBsb25nIGlweF9yb3V0ZXJfbmV0d29yazsKKyAgICB1bnNpZ25lZCBjaGFyIGlweF9yb3V0ZXJfbm9kZVtJUFhfTk9ERV9MRU5dOworICB9CitpcHhfcm91dGVfZGVmaW5pdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uCisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGlweF9uZXR3b3JrOworICAgIHVuc2lnbmVkIGNoYXIgaXB4X2RldmljZVsxNl07CisgICAgdW5zaWduZWQgY2hhciBpcHhfZGxpbmtfdHlwZTsKKyNkZWZpbmUgSVBYX0ZSQU1FX05PTkUJCTAKKyNkZWZpbmUgSVBYX0ZSQU1FX1NOQVAJCTEKKyNkZWZpbmUgSVBYX0ZSQU1FXzgwMjIJCTIKKyNkZWZpbmUgSVBYX0ZSQU1FX0VUSEVSSUkJMworI2RlZmluZSBJUFhfRlJBTUVfODAyMwkJNAorI2RlZmluZSBJUFhfRlJBTUVfVFJfODAyMgk1CisgICAgdW5zaWduZWQgY2hhciBpcHhfc3BlY2lhbDsKKyNkZWZpbmUgSVBYX1NQRUNJQUxfTk9ORQkwCisjZGVmaW5lIElQWF9QUklNQVJZCQkxCisjZGVmaW5lIElQWF9JTlRFUk5BTAkJMgorICAgIHVuc2lnbmVkIGNoYXIgaXB4X25vZGVbSVBYX05PREVfTEVOXTsKKyAgfQoraXB4X2ludGVyZmFjZV9kZWZpbml0aW9uOworCit0eXBlZGVmIHN0cnVjdCBpcHhfY29uZmlnX2RhdGEKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CisgICAgdW5zaWduZWQgY2hhciBpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKKyAgfQoraXB4X2NvbmZpZ19kYXRhOworCisvKgorICogT0xEIFJvdXRlIERlZmluaXRpb24gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KKworc3RydWN0IGlweF9yb3V0ZV9kZWYKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaXB4X25ldHdvcms7CisgICAgdW5zaWduZWQgbG9uZyBpcHhfcm91dGVyX25ldHdvcms7CisjZGVmaW5lIElQWF9ST1VURV9OT19ST1VURVIJMAorICAgIHVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CisgICAgdW5zaWduZWQgY2hhciBpcHhfZGV2aWNlWzE2XTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpcHhfZmxhZ3M7CisjZGVmaW5lIElQWF9SVF9TTkFQCQk4CisjZGVmaW5lIElQWF9SVF84MDIyCQk0CisjZGVmaW5lIElQWF9SVF9CTFVFQk9PSwkJMgorI2RlZmluZSBJUFhfUlRfUk9VVEVECQkxCisgIH07CisKKyNkZWZpbmUgU0lPQ0FJUFhJVEZDUlQJCShTSU9DUFJPVE9QUklWQVRFKQorI2RlZmluZSBTSU9DQUlQWFBSSVNMVAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DSVBYQ0ZHREFUQQkJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZSBTSU9DSVBYTkNQQ09OTgkJKFNJT0NQUk9UT1BSSVZBVEUgKyAzKQorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbmV0aXB4L2lweC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldHBhY2tldC9wYWNrZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cGFja2V0L3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjM0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL25ldHBhY2tldC9wYWNrZXQuaApAQCAtMCwwICsxLDY0IEBACisvKiBEZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggTGludXggQUZfUEFDS0VUIHNvY2tldHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX19ORVRQQUNLRVRfUEFDS0VUX0gKKyNkZWZpbmUgX19ORVRQQUNLRVRfUEFDS0VUX0gJMQorCitzdHJ1Y3Qgc29ja2FkZHJfbGwKKyAgeworICAgIHVuc2lnbmVkIHNob3J0IGludCBzbGxfZmFtaWx5OworICAgIHVuc2lnbmVkIHNob3J0IGludCBzbGxfcHJvdG9jb2w7CisgICAgaW50IHNsbF9pZmluZGV4OworICAgIHVuc2lnbmVkIHNob3J0IGludCBzbGxfaGF0eXBlOworICAgIHVuc2lnbmVkIGNoYXIgc2xsX3BrdHR5cGU7CisgICAgdW5zaWduZWQgY2hhciBzbGxfaGFsZW47CisgICAgdW5zaWduZWQgY2hhciBzbGxfYWRkcls4XTsKKyAgfTsKKworLyogUGFja2V0IHR5cGVzLiAgKi8KKworI2RlZmluZSBQQUNLRVRfSE9TVAkJMAkJLyogVG8gdXMuICAqLworI2RlZmluZSBQQUNLRVRfQlJPQURDQVNUCTEJCS8qIFRvIGFsbC4gICovCisjZGVmaW5lIFBBQ0tFVF9NVUxUSUNBU1QJMgkJLyogVG8gZ3JvdXAuICAqLworI2RlZmluZSBQQUNLRVRfT1RIRVJIT1NUCTMJCS8qIFRvIHNvbWVvbmUgZWxzZS4gICovCisjZGVmaW5lIFBBQ0tFVF9PVVRHT0lORwkJNAkJLyogT3JpZ2luYXRlZCBieSB1cyAuICovCisjZGVmaW5lIFBBQ0tFVF9MT09QQkFDSwkJNQorI2RlZmluZSBQQUNLRVRfRkFTVFJPVVRFCTYKKworLyogUGFja2V0IHNvY2tldCBvcHRpb25zLiAgKi8KKworI2RlZmluZSBQQUNLRVRfQUREX01FTUJFUlNISVAJCTEKKyNkZWZpbmUgUEFDS0VUX0RST1BfTUVNQkVSU0hJUAkJMgorI2RlZmluZQlQQUNLRVRfUkVDVl9PVVRQVVQJCTMKKyNkZWZpbmUJUEFDS0VUX1JYX1JJTkcJCQk1CisjZGVmaW5lCVBBQ0tFVF9TVEFUSVNUSUNTCQk2CisKK3N0cnVjdCBwYWNrZXRfbXJlcQorICB7CisgICAgaW50IG1yX2lmaW5kZXg7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IG1yX3R5cGU7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IG1yX2FsZW47CisgICAgdW5zaWduZWQgY2hhciBtcl9hZGRyZXNzWzhdOworICB9OworCisjZGVmaW5lIFBBQ0tFVF9NUl9NVUxUSUNBU1QJMAorI2RlZmluZSBQQUNLRVRfTVJfUFJPTUlTQwkxCisjZGVmaW5lIFBBQ0tFVF9NUl9BTExNVUxUSQkyCisKKyNlbmRpZgkvKiBuZXRwYWNrZXQvcGFja2V0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cm9tL25ldHJvbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRyb20vbmV0cm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4NDc3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmV0cm9tL25ldHJvbS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkVUUk9NX05FVFJPTV9ICisjZGVmaW5lIF9ORVRST01fTkVUUk9NX0gJMQorCisjaW5jbHVkZSA8bmV0YXgyNS9heDI1Lmg+CisKKy8qIFNldHNvY2tvcHRpb25zKDIpIGxldmVsLiAgVGhhbmtzIHRvIEJTRCB0aGVzZSBtdXN0IG1hdGNoIElQUFJPVE9feHh4LiAgKi8KKyNkZWZpbmUgU09MX05FVFJPTQkyNTkKKworLyogTmV0Um9tIGNvbnRyb2wgdmFsdWVzOiAqLworI2RlZmluZSBORVRST01fVDEJMQorI2RlZmluZSBORVRST01fVDIJMgorI2RlZmluZSBORVRST01fTjIJMworI2RlZmluZSBORVRST01fUEFDTEVOCTUKKyNkZWZpbmUJTkVUUk9NX1Q0CTYKKyNkZWZpbmUgTkVUUk9NX0lETEUJNworCisjZGVmaW5lIE5FVFJPTV9LSUxMCTk5CisKKy8qIFR5cGUgb2Ygcm91dGU6ICovCisjZGVmaW5lIE5FVFJPTV9ORUlHSCAgICAwCisjZGVmaW5lIE5FVFJPTV9OT0RFICAgICAxCisKK3N0cnVjdCBucl9yb3V0ZV9zdHJ1Y3QKKyAgeworICAgIGludCB0eXBlOworICAgIGF4MjVfYWRkcmVzcyBjYWxsc2lnbjsKKyAgICBjaGFyIGRldmljZVsxNl07CisgICAgdW5zaWduZWQgaW50IHF1YWxpdHk7CisgICAgY2hhciBtbmVtb25pY1s3XTsKKyAgICBheDI1X2FkZHJlc3MgbmVpZ2hib3VyOworICAgIHVuc2lnbmVkIGludCBvYnNfY291bnQ7CisgICAgdW5zaWduZWQgaW50IG5kaWdpczsKKyAgICBheDI1X2FkZHJlc3MgZGlnaXBlYXRlcnNbQVgyNV9NQVhfRElHSVNdOworICB9OworCisvKiBOZXRSb20gc29ja2V0IGlvY3RsczogKi8KKyNkZWZpbmUJU0lPQ05SR0VUUEFSTVMJCShTSU9DUFJPVE9QUklWQVRFKzApCisjZGVmaW5lCVNJT0NOUlNFVFBBUk1TCQkoU0lPQ1BST1RPUFJJVkFURSsxKQorI2RlZmluZQlTSU9DTlJERUNPQlMJCShTSU9DUFJPVE9QUklWQVRFKzIpCisjZGVmaW5lCVNJT0NOUlJUQ1RMCQkoU0lPQ1BST1RPUFJJVkFURSszKQorI2RlZmluZQlTSU9DTlJDVExDT04JCShTSU9DUFJPVE9QUklWQVRFKzQpCisKKy8qIE5ldFJvbSBwYXJhbWV0ZXIgc3RydWN0dXJlOiAqLworc3RydWN0IG5yX3Bhcm1zX3N0cnVjdAorICB7CisgICAgdW5zaWduZWQgaW50IHF1YWxpdHk7CisgICAgdW5zaWduZWQgaW50IG9ic19jb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgdHRsOworICAgIHVuc2lnbmVkIGludCB0aW1lb3V0OworICAgIHVuc2lnbmVkIGludCBhY2tfZGVsYXk7CisgICAgdW5zaWduZWQgaW50IGJ1c3lfZGVsYXk7CisgICAgdW5zaWduZWQgaW50IHRyaWVzOworICAgIHVuc2lnbmVkIGludCB3aW5kb3c7CisgICAgdW5zaWduZWQgaW50IHBhY2xlbjsKKyAgfTsKKworLyogTmV0Um9tIGNvbnRyb2wgc3RydWN0dXJlOiAqLworc3RydWN0IG5yX2N0bF9zdHJ1Y3QKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgaW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBpZDsKKyAgICB1bnNpZ25lZCBpbnQgY21kOworICAgIHVuc2lnbmVkIGxvbmcgYXJnOworICB9OworCisjZW5kaWYgLyogbmV0cm9tL25ldHJvbS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25ldHJvc2Uvcm9zZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRyb3NlL3Jvc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGJhN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZXRyb3NlL3Jvc2UuaApAQCAtMCwwICsxLDExNiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIFJvc2UgcGFja2V0IHJhZGlvIGFkZHJlc3MgZmFtaWx5LgorICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBXaGF0IGZvbGxvd3MgaXMgY29waWVkIGZyb20gdGhlIDIuMS45MyA8bGludXgvcm9zZS5oPi4gICovCisKKyNpZm5kZWYgX05FVFJPU0VfUk9TRV9ICisjZGVmaW5lIF9ORVRST1NFX1JPU0VfSCAxCisKKy8qIFNvY2tldCBsZXZlbCB2YWx1ZXMuICAqLworI2RlZmluZSBTT0xfUk9TRSAgICAgICAgMjYwCisKKworLyogVGhlc2UgYXJlIHRoZSBwdWJsaWMgZWxlbWVudHMgb2YgdGhlIExpbnV4IGtlcm5lbCBSb3NlCisgICBpbXBsZW1lbnRhdGlvbi4gIEZvciBrZXJuZWwgQVguMjUgc2VlIHRoZSBmaWxlIGF4MjUuaC4gVGhpcyBmaWxlCisgICByZXF1aXJlcyBheDI1LmggZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBheDI1X2FkZHJlc3Mgc3RydWN0dXJlLiAgKi8KKyNkZWZpbmUgUk9TRV9NVFUJMjUxCisKKyNkZWZpbmUgUk9TRV9NQVhfRElHSVMJNgorCisjZGVmaW5lCVJPU0VfREVGRVIJMQorI2RlZmluZQlST1NFX1QxCQkyCisjZGVmaW5lCVJPU0VfVDIJCTMKKyNkZWZpbmUJUk9TRV9UMwkJNAorI2RlZmluZQlST1NFX0lETEUJNQorI2RlZmluZQlST1NFX1FCSVRJTkNMCTYKKyNkZWZpbmUJUk9TRV9IT0xEQkFDSwk3CisKKyNkZWZpbmUJU0lPQ1JTR0NBVVNFCQkoU0lPQ1BST1RPUFJJVkFURSArIDApCisjZGVmaW5lCVNJT0NSU1NDQVVTRQkJKFNJT0NQUk9UT1BSSVZBVEUgKyAxKQorI2RlZmluZQlTSU9DUlNMMkNBTEwJCShTSU9DUFJPVE9QUklWQVRFICsgMikKKyNkZWZpbmUJU0lPQ1JTU0wyQ0FMTAkJKFNJT0NQUk9UT1BSSVZBVEUgKyAyKQorI2RlZmluZQlTSU9DUlNBQ0NFUFQJCShTSU9DUFJPVE9QUklWQVRFICsgMykKKyNkZWZpbmUJU0lPQ1JTQ0xSUlQJCShTSU9DUFJPVE9QUklWQVRFICsgNCkKKyNkZWZpbmUJU0lPQ1JTR0wyQ0FMTAkJKFNJT0NQUk9UT1BSSVZBVEUgKyA1KQorI2RlZmluZQlTSU9DUlNHRkFDSUxJVElFUwkoU0lPQ1BST1RPUFJJVkFURSArIDYpCisKKyNkZWZpbmUJUk9TRV9EVEVfT1JJR0lOQVRFRAkweDAwCisjZGVmaW5lCVJPU0VfTlVNQkVSX0JVU1kJMHgwMQorI2RlZmluZQlST1NFX0lOVkFMSURfRkFDSUxJVFkJMHgwMworI2RlZmluZQlST1NFX05FVFdPUktfQ09OR0VTVElPTgkweDA1CisjZGVmaW5lCVJPU0VfT1VUX09GX09SREVSCTB4MDkKKyNkZWZpbmUJUk9TRV9BQ0NFU1NfQkFSUkVECTB4MEIKKyNkZWZpbmUJUk9TRV9OT1RfT0JUQUlOQUJMRQkweDBECisjZGVmaW5lCVJPU0VfUkVNT1RFX1BST0NFRFVSRQkweDExCisjZGVmaW5lCVJPU0VfTE9DQUxfUFJPQ0VEVVJFCTB4MTMKKyNkZWZpbmUJUk9TRV9TSElQX0FCU0VOVAkweDM5CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY2hhciByb3NlX2FkZHJbNV07Cit9IHJvc2VfYWRkcmVzczsKKworc3RydWN0IHNvY2thZGRyX3Jvc2UKK3sKKyAgc2FfZmFtaWx5X3Qgc3Jvc2VfZmFtaWx5OworICByb3NlX2FkZHJlc3Mgc3Jvc2VfYWRkcjsKKyAgYXgyNV9hZGRyZXNzIHNyb3NlX2NhbGw7CisgIGludCBzcm9zZV9uZGlnaXM7CisgIGF4MjVfYWRkcmVzcwlzcm9zZV9kaWdpOworfTsKKworc3RydWN0IGZ1bGxfc29ja2FkZHJfcm9zZQoreworICBzYV9mYW1pbHlfdCBzcm9zZV9mYW1pbHk7CisgIHJvc2VfYWRkcmVzcyBzcm9zZV9hZGRyOworICBheDI1X2FkZHJlc3Mgc3Jvc2VfY2FsbDsKKyAgdW5zaWduZWQgaW50IHNyb3NlX25kaWdpczsKKyAgYXgyNV9hZGRyZXNzIHNyb3NlX2RpZ2lzW1JPU0VfTUFYX0RJR0lTXTsKK307CisKK3N0cnVjdCByb3NlX3JvdXRlX3N0cnVjdAoreworICByb3NlX2FkZHJlc3MgYWRkcmVzczsKKyAgdW5zaWduZWQgc2hvcnQgaW50IG1hc2s7CisgIGF4MjVfYWRkcmVzcwluZWlnaGJvdXI7CisgIGNoYXIgZGV2aWNlWzE2XTsKKyAgdW5zaWduZWQgY2hhcgluZGlnaXM7CisgIGF4MjVfYWRkcmVzcyBkaWdpcGVhdGVyc1tBWDI1X01BWF9ESUdJU107Cit9OworCitzdHJ1Y3Qgcm9zZV9jYXVzZV9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhcgljYXVzZTsKKyAgdW5zaWduZWQgY2hhcglkaWFnbm9zdGljOworfTsKKworc3RydWN0IHJvc2VfZmFjaWxpdGllc19zdHJ1Y3QKK3sKKyAgcm9zZV9hZGRyZXNzIHNvdXJjZV9hZGRyLCAgIGRlc3RfYWRkcjsKKyAgYXgyNV9hZGRyZXNzIHNvdXJjZV9jYWxsLCAgIGRlc3RfY2FsbDsKKyAgdW5zaWduZWQgY2hhciBzb3VyY2VfbmRpZ2lzLCBkZXN0X25kaWdpczsKKyAgYXgyNV9hZGRyZXNzIHNvdXJjZV9kaWdpc1tST1NFX01BWF9ESUdJU107CisgIGF4MjVfYWRkcmVzcyBkZXN0X2RpZ2lzW1JPU0VfTUFYX0RJR0lTXTsKKyAgdW5zaWduZWQgaW50IHJhbmQ7CisgIHJvc2VfYWRkcmVzcyBmYWlsX2FkZHI7CisgIGF4MjVfYWRkcmVzcyBmYWlsX2NhbGw7Cit9OworCisjZW5kaWYJLyogbmV0cm9zZS9yb3NlLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmZzL25mcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uZnMvbmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlNGI2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmZzL25mcy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmxfdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvbmxfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE5MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ubF90eXBlcy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfTkxfVFlQRVNfSAorI2RlZmluZSBfTkxfVFlQRVNfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBUaGUgZGVmYXVsdCBtZXNzYWdlIHNldCB1c2VkIGJ5IHRoZSBnZW5jYXQgcHJvZ3JhbS4gICovCisjZGVmaW5lIE5MX1NFVEQgMQorCisvKiBWYWx1ZSBmb3IgRkxBRyBwYXJhbWV0ZXIgb2YgYGNhdGdldHMnIHRvIHNheSB3ZSB3YW50IFhQRzQgY29tcGxpYW5jZS4gICovCisjZGVmaW5lIE5MX0NBVF9MT0NBTEUgMQorCisKK19fQkVHSU5fREVDTFMKKworLyogTWVzc2FnZSBjYXRhbG9nIGRlc2NyaXB0b3IgdHlwZS4gICovCit0eXBlZGVmIHZvaWQgKm5sX2NhdGQ7CisKKy8qIFR5cGUgdXNlZCBieSBgbmxfbGFuZ2luZm8nLiAgKi8KK3R5cGVkZWYgaW50IG5sX2l0ZW07CisKKy8qIE9wZW4gbWVzc2FnZSBjYXRhbG9nIGZvciBsYXRlciB1c2UsIHJldHVybmluZyBkZXNjcmlwdG9yLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBubF9jYXRkIGNhdG9wZW4gKF9fY29uc3QgY2hhciAqX19jYXRfbmFtZSwgaW50IF9fZmxhZykgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gdHJhbnNsYXRpb24gd2l0aCBOVU1CRVIgaW4gU0VUIG9mIENBVEFMT0c7IGlmIG5vdCBmb3VuZAorICAgcmV0dXJuIFNUUklORy4gICovCitleHRlcm4gY2hhciAqY2F0Z2V0cyAobmxfY2F0ZCBfX2NhdGFsb2csIGludCBfX3NldCwgaW50IF9fbnVtYmVyLAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQ2xvc2UgbWVzc2FnZSBDQVRBTE9HLiAgKi8KK2V4dGVybiBpbnQgY2F0Y2xvc2UgKG5sX2NhdGQgX19jYXRhbG9nKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5sX3R5cGVzLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL25zcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWMxMmFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9uc3MuaApAQCAtMCwwICsxLDUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIERlZmluZSBpbnRlcmZhY2UgdG8gTlNTLiAgVGhpcyBpcyBtZWFudCBmb3IgdGhlIGludGVyZmFjZSBmdW5jdGlvbnMKKyAgIGFuZCBmb3IgaW1wbGVtZW50b3JzIG9mIG5ldyBzZXJ2aWNlcy4gICovCisKKyNpZm5kZWYgX05TU19ICisjZGVmaW5lIF9OU1NfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogUG9zc2libGUgcmVzdWx0cyBvZiBsb29rdXAgdXNpbmcgYSBuc3NfKiBmdW5jdGlvbi4gICovCitlbnVtIG5zc19zdGF0dXMKK3sKKyAgTlNTX1NUQVRVU19UUllBR0FJTiA9IC0yLAorICBOU1NfU1RBVFVTX1VOQVZBSUwsCisgIE5TU19TVEFUVVNfTk9URk9VTkQsCisgIE5TU19TVEFUVVNfU1VDQ0VTUywKKyAgTlNTX1NUQVRVU19SRVRVUk4KK307CisKKworLyogT3ZlcndyaXRlIHNlcnZpY2Ugc2VsZWN0aW9uIGZvciBkYXRhYmFzZSBEQk5BTUUgdXNpbmcgc3BlY2lmaWNhdGlvbgorICAgaW4gU1RSSU5HLgorICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHN5c3RlbSBwcm9ncmFtcyB3aGljaCBoYXZlIHRvCisgICB3b3JrIGFyb3VuZCBub24tZXhpc3Rpbmcgc2VydmljZXMgKGUuZS4sIHdoaWxlIGJvb3RpbmcpLgorICAgQXR0ZW50aW9uOiBVc2luZyB0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkgd2lsbCBzbG93bHkgZWF0IHVwIHRoZQorICAgd2hvbGUgbWVtb3J5IHNpbmNlIHByZXZpb3VzIHNlbGVjdGlvbiBkYXRhIGNhbm5vdCBiZSBmcmVlZC4gICovCitleHRlcm4gaW50IF9fbnNzX2NvbmZpZ3VyZV9sb29rdXAgKF9fY29uc3QgY2hhciAqX19kYm5hbWUsCisJCQkJICAgX19jb25zdCBjaGFyICpfX3N0cmluZykgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIG5zcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL29ic3RhY2suaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvb2JzdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmZlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL29ic3RhY2suaApAQCAtMCwwICsxLDUwOSBAQAorLyogb2JzdGFjay5oIC0gb2JqZWN0IHN0YWNrIG1hY3JvcworICAgQ29weXJpZ2h0IChDKSAxOTg4LTE5OTQsMTk5Ni0xOTk5LDIwMDMsMjAwNCwyMDA1CisJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisKKy8qIFN1bW1hcnk6CisKK0FsbCB0aGUgYXBwYXJlbnQgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSBhcmUgbWFjcm9zLiBUaGUgaWRlYQoraXMgdGhhdCB5b3Ugd291bGQgdXNlIHRoZXNlIHByZS10ZXN0ZWQgbWFjcm9zIHRvIHNvbHZlIGEKK3Zlcnkgc3BlY2lmaWMgc2V0IG9mIHByb2JsZW1zLCBhbmQgdGhleSB3b3VsZCBydW4gZmFzdC4KK0NhdXRpb246IG5vIHNpZGUtZWZmZWN0cyBpbiBhcmd1bWVudHMgcGxlYXNlISEgVGhleSBtYXkgYmUKK2V2YWx1YXRlZCBNQU5ZIHRpbWVzISEKKworVGhlc2UgbWFjcm9zIG9wZXJhdGUgYSBzdGFjayBvZiBvYmplY3RzLiAgRWFjaCBvYmplY3Qgc3RhcnRzIGxpZmUKK3NtYWxsLCBhbmQgbWF5IGdyb3cgdG8gbWF0dXJpdHkuICAoQ29uc2lkZXIgYnVpbGRpbmcgYSB3b3JkIHN5bGxhYmxlCitieSBzeWxsYWJsZS4pICBBbiBvYmplY3QgY2FuIG1vdmUgd2hpbGUgaXQgaXMgZ3Jvd2luZy4gIE9uY2UgaXQgaGFzCitiZWVuICJmaW5pc2hlZCIgaXQgbmV2ZXIgY2hhbmdlcyBhZGRyZXNzIGFnYWluLiAgU28gdGhlICJ0b3Agb2YgdGhlCitzdGFjayIgaXMgdHlwaWNhbGx5IGFuIGltbWF0dXJlIGdyb3dpbmcgb2JqZWN0LCB3aGlsZSB0aGUgcmVzdCBvZiB0aGUKK3N0YWNrIGlzIG9mIG1hdHVyZSwgZml4ZWQgc2l6ZSBhbmQgZml4ZWQgYWRkcmVzcyBvYmplY3RzLgorCitUaGVzZSByb3V0aW5lcyBncmFiIGxhcmdlIGNodW5rcyBvZiBtZW1vcnksIHVzaW5nIGEgZnVuY3Rpb24geW91CitzdXBwbHksIGNhbGxlZCBgb2JzdGFja19jaHVua19hbGxvYycuICBPbiBvY2Nhc2lvbiwgdGhleSBmcmVlIGNodW5rcywKK2J5IGNhbGxpbmcgYG9ic3RhY2tfY2h1bmtfZnJlZScuICBZb3UgbXVzdCBkZWZpbmUgdGhlbSBhbmQgZGVjbGFyZQordGhlbSBiZWZvcmUgdXNpbmcgYW55IG9ic3RhY2sgbWFjcm9zLgorCitFYWNoIGluZGVwZW5kZW50IHN0YWNrIGlzIHJlcHJlc2VudGVkIGJ5IGEgYHN0cnVjdCBvYnN0YWNrJy4KK0VhY2ggb2YgdGhlIG9ic3RhY2sgbWFjcm9zIGV4cGVjdHMgYSBwb2ludGVyIHRvIHN1Y2ggYSBzdHJ1Y3R1cmUKK2FzIHRoZSBmaXJzdCBhcmd1bWVudC4KKworT25lIG1vdGl2YXRpb24gZm9yIHRoaXMgcGFja2FnZSBpcyB0aGUgcHJvYmxlbSBvZiBncm93aW5nIGNoYXIgc3RyaW5ncworaW4gc3ltYm9sIHRhYmxlcy4gIFVubGVzcyB5b3UgYXJlICJmYXNjaXN0IHBpZyB3aXRoIGEgcmVhZC1vbmx5IG1pbmQiCistLUdvc3BlcidzIGltbW9ydGFsIHF1b3RlIGZyb20gSEFLTUVNIGl0ZW0gMTU0LCBvdXQgb2YgY29udGV4dC0teW91Cit3b3VsZCBub3QgbGlrZSB0byBwdXQgYW55IGFyYml0cmFyeSB1cHBlciBsaW1pdCBvbiB0aGUgbGVuZ3RoIG9mIHlvdXIKK3N5bWJvbHMuCisKK0luIHByYWN0aWNlIHRoaXMgb2Z0ZW4gbWVhbnMgeW91IHdpbGwgYnVpbGQgbWFueSBzaG9ydCBzeW1ib2xzIGFuZCBhCitmZXcgbG9uZyBzeW1ib2xzLiAgQXQgdGhlIHRpbWUgeW91IGFyZSByZWFkaW5nIGEgc3ltYm9sIHlvdSBkb24ndCBrbm93Citob3cgbG9uZyBpdCBpcy4gIE9uZSB0cmFkaXRpb25hbCBtZXRob2QgaXMgdG8gcmVhZCBhIHN5bWJvbCBpbnRvIGEKK2J1ZmZlciwgcmVhbGxvYygpYXRpbmcgdGhlIGJ1ZmZlciBldmVyeSB0aW1lIHlvdSB0cnkgdG8gcmVhZCBhIHN5bWJvbAordGhhdCBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyBiZWF1dCwgYnV0IHlvdSBzdGlsbCB3aWxsCit3YW50IHRvIGNvcHkgdGhlIHN5bWJvbCBmcm9tIHRoZSBidWZmZXIgdG8gYSBtb3JlIHBlcm1hbmVudAorc3ltYm9sLXRhYmxlIGVudHJ5IHNheSBhYm91dCBoYWxmIHRoZSB0aW1lLgorCitXaXRoIG9ic3RhY2tzLCB5b3UgY2FuIHdvcmsgZGlmZmVyZW50bHkuICBVc2Ugb25lIG9ic3RhY2sgZm9yIGFsbCBzeW1ib2wKK25hbWVzLiAgQXMgeW91IHJlYWQgYSBzeW1ib2wsIGdyb3cgdGhlIG5hbWUgaW4gdGhlIG9ic3RhY2sgZ3JhZHVhbGx5LgorV2hlbiB0aGUgbmFtZSBpcyBjb21wbGV0ZSwgZmluYWxpemUgaXQuICBUaGVuLCBpZiB0aGUgc3ltYm9sIGV4aXN0cyBhbHJlYWR5LAorZnJlZSB0aGUgbmV3bHkgcmVhZCBuYW1lLgorCitUaGUgd2F5IHdlIGRvIHRoaXMgaXMgdG8gdGFrZSBhIGxhcmdlIGNodW5rLCBhbGxvY2F0aW5nIG1lbW9yeSBmcm9tCitsb3cgYWRkcmVzc2VzLiAgV2hlbiB5b3Ugd2FudCB0byBidWlsZCBhIHN5bWJvbCBpbiB0aGUgY2h1bmsgeW91IGp1c3QKK2FkZCBjaGFycyBhYm92ZSB0aGUgY3VycmVudCAiaGlnaCB3YXRlciBtYXJrIiBpbiB0aGUgY2h1bmsuICBXaGVuIHlvdQoraGF2ZSBmaW5pc2hlZCBhZGRpbmcgY2hhcnMsIGJlY2F1c2UgeW91IGdvdCB0byB0aGUgZW5kIG9mIHRoZSBzeW1ib2wsCit5b3Uga25vdyBob3cgbG9uZyB0aGUgY2hhcnMgYXJlLCBhbmQgeW91IGNhbiBjcmVhdGUgYSBuZXcgb2JqZWN0LgorTW9zdGx5IHRoZSBjaGFycyB3aWxsIG5vdCBidXJzdCBvdmVyIHRoZSBoaWdoZXN0IGFkZHJlc3Mgb2YgdGhlIGNodW5rLAorYmVjYXVzZSB5b3Ugd291bGQgdHlwaWNhbGx5IGV4cGVjdCBhIGNodW5rIHRvIGJlIChzYXkpIDEwMCB0aW1lcyBhcworbG9uZyBhcyBhbiBhdmVyYWdlIG9iamVjdC4KKworSW4gY2FzZSB0aGF0IGlzbid0IGNsZWFyLCB3aGVuIHdlIGhhdmUgZW5vdWdoIGNoYXJzIHRvIG1ha2UgdXAKK3RoZSBvYmplY3QsIFRIRVkgQVJFIEFMUkVBRFkgQ09OVElHVU9VUyBJTiBUSEUgQ0hVTksgKGd1YXJhbnRlZWQpCitzbyB3ZSBqdXN0IHBvaW50IHRvIGl0IHdoZXJlIGl0IGxpZXMuICBObyBtb3Zpbmcgb2YgY2hhcnMgaXMKK25lZWRlZCBhbmQgdGhpcyBpcyB0aGUgc2Vjb25kIHdpbjogcG90ZW50aWFsbHkgbG9uZyBzdHJpbmdzIG5lZWQKK25ldmVyIGJlIGV4cGxpY2l0bHkgc2h1ZmZsZWQuIE9uY2UgYW4gb2JqZWN0IGlzIGZvcm1lZCwgaXQgZG9lcyBub3QKK2NoYW5nZSBpdHMgYWRkcmVzcyBkdXJpbmcgaXRzIGxpZmV0aW1lLgorCitXaGVuIHRoZSBjaGFycyBidXJzdCBvdmVyIGEgY2h1bmsgYm91bmRhcnksIHdlIGFsbG9jYXRlIGEgbGFyZ2VyCitjaHVuaywgYW5kIHRoZW4gY29weSB0aGUgcGFydGx5IGZvcm1lZCBvYmplY3QgZnJvbSB0aGUgZW5kIG9mIHRoZSBvbGQKK2NodW5rIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBsYXJnZXIgY2h1bmsuICBXZSB0aGVuIGNhcnJ5IG9uCithY2NyZXRpbmcgY2hhcmFjdGVycyB0byB0aGUgZW5kIG9mIHRoZSBvYmplY3QgYXMgd2Ugbm9ybWFsbHkgd291bGQuCisKK0Egc3BlY2lhbCBtYWNybyBpcyBwcm92aWRlZCB0byBhZGQgYSBzaW5nbGUgY2hhciBhdCBhIHRpbWUgdG8gYQorZ3Jvd2luZyBvYmplY3QuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIHJlZ2lzdGVyIHZhcmlhYmxlcywgd2hpY2gKK2JyZWFrIHRoZSBvcmRpbmFyeSAnZ3Jvd3RoJyBtYWNyby4KKworU3VtbWFyeToKKwlXZSBhbGxvY2F0ZSBsYXJnZSBjaHVua3MuCisJV2UgY2FydmUgb3V0IG9uZSBvYmplY3QgYXQgYSB0aW1lIGZyb20gdGhlIGN1cnJlbnQgY2h1bmsuCisJT25jZSBjYXJ2ZWQsIGFuIG9iamVjdCBuZXZlciBtb3Zlcy4KKwlXZSBhcmUgZnJlZSB0byBhcHBlbmQgZGF0YSBvZiBhbnkgc2l6ZSB0byB0aGUgY3VycmVudGx5CisJICBncm93aW5nIG9iamVjdC4KKwlFeGFjdGx5IG9uZSBvYmplY3QgaXMgZ3Jvd2luZyBpbiBhbiBvYnN0YWNrIGF0IGFueSBvbmUgdGltZS4KKwlZb3UgY2FuIHJ1biBvbmUgb2JzdGFjayBwZXIgY29udHJvbCBibG9jay4KKwlZb3UgbWF5IGhhdmUgYXMgbWFueSBjb250cm9sIGJsb2NrcyBhcyB5b3UgZGFyZS4KKwlCZWNhdXNlIG9mIHRoZSB3YXkgd2UgZG8gaXQsIHlvdSBjYW4gYHVud2luZCcgYW4gb2JzdGFjaworCSAgYmFjayB0byBhIHByZXZpb3VzIHN0YXRlLiAoWW91IG1heSByZW1vdmUgb2JqZWN0cyBtdWNoCisJICBhcyB5b3Ugd291bGQgd2l0aCBhIHN0YWNrLikKKyovCisKKworLyogRG9uJ3QgZG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtb3JlIHRoYW4gb25jZS4gICovCisKKyNpZm5kZWYgX09CU1RBQ0tfSAorI2RlZmluZSBfT0JTVEFDS19IIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorDAorLyogV2UgbmVlZCB0aGUgdHlwZSBvZiBhIHBvaW50ZXIgc3VidHJhY3Rpb24uICBJZiBfX1BUUkRJRkZfVFlQRV9fIGlzCisgICBkZWZpbmVkLCBhcyB3aXRoIEdOVSBDLCB1c2UgdGhhdDsgdGhhdCB3YXkgd2UgZG9uJ3QgcG9sbHV0ZSB0aGUKKyAgIG5hbWVzcGFjZSB3aXRoIDxzdGRkZWYuaD4ncyBzeW1ib2xzLiAgT3RoZXJ3aXNlLCBpbmNsdWRlIDxzdGRkZWYuaD4KKyAgIGFuZCB1c2UgcHRyZGlmZl90LiAgKi8KKworI2lmZGVmIF9fUFRSRElGRl9UWVBFX18KKyMgZGVmaW5lIFBUUl9JTlRfVFlQRSBfX1BUUkRJRkZfVFlQRV9fCisjZWxzZQorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgZGVmaW5lIFBUUl9JTlRfVFlQRSBwdHJkaWZmX3QKKyNlbmRpZgorCisvKiBJZiBCIGlzIHRoZSBiYXNlIG9mIGFuIG9iamVjdCBhZGRyZXNzZWQgYnkgUCwgcmV0dXJuIHRoZSByZXN1bHQgb2YKKyAgIGFsaWduaW5nIFAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgQSArIDEuICBCIGFuZCBQIG11c3QgYmUgb2YgdHlwZQorICAgY2hhciAqLiAgQSArIDEgbXVzdCBiZSBhIHBvd2VyIG9mIDIuICAqLworCisjZGVmaW5lIF9fQlBUUl9BTElHTihCLCBQLCBBKSAoKEIpICsgKCgoUCkgLSAoQikgKyAoQSkpICYgfihBKSkpCisKKy8qIFNpbWlsaWFyIHRvIF9CUFRSX0FMSUdOIChCLCBQLCBBKSwgZXhjZXB0IG9wdGltaXplIHRoZSBjb21tb24gY2FzZQorICAgd2hlcmUgcG9pbnRlcnMgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnRlZ2VycywgYWxpZ25lZCBhcyBpbnRlZ2VycywKKyAgIGFuZCBjb252ZXJ0ZWQgYmFjayBhZ2Fpbi4gIElmIFBUUl9JTlRfVFlQRSBpcyBuYXJyb3dlciB0aGFuIGEKKyAgIHBvaW50ZXIgKGUuZy4sIHRoZSBBUy80MDApLCBwbGF5IGl0IHNhZmUgYW5kIGNvbXB1dGUgdGhlIGFsaWdubWVudAorICAgcmVsYXRpdmUgdG8gQi4gIE90aGVyd2lzZSwgdXNlIHRoZSBmYXN0ZXIgc3RyYXRlZ3kgb2YgY29tcHV0aW5nIHRoZQorICAgYWxpZ25tZW50IHJlbGF0aXZlIHRvIDAuICAqLworCisjZGVmaW5lIF9fUFRSX0FMSUdOKEIsIFAsIEEpCQkJCQkJICAgIFwKKyAgX19CUFRSX0FMSUdOIChzaXplb2YgKFBUUl9JTlRfVFlQRSkgPCBzaXplb2YgKHZvaWQgKikgPyAoQikgOiAoY2hhciAqKSAwLCBcCisJCVAsIEEpCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RydWN0IF9vYnN0YWNrX2NodW5rCQkvKiBMaXZlcyBhdCBmcm9udCBvZiBlYWNoIGNodW5rLiAqLworeworICBjaGFyICAqbGltaXQ7CQkJLyogMSBwYXN0IGVuZCBvZiB0aGlzIGNodW5rICovCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcHJldjsJLyogYWRkcmVzcyBvZiBwcmlvciBjaHVuayBvciBOVUxMICovCisgIGNoYXIJY29udGVudHNbNF07CQkvKiBvYmplY3RzIGJlZ2luIGhlcmUgKi8KK307CisKK3N0cnVjdCBvYnN0YWNrCQkvKiBjb250cm9sIGN1cnJlbnQgb2JqZWN0IGluIGN1cnJlbnQgY2h1bmsgKi8KK3sKKyAgbG9uZwljaHVua19zaXplOwkJLyogcHJlZmVycmVkIHNpemUgdG8gYWxsb2NhdGUgY2h1bmtzIGluICovCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7CS8qIGFkZHJlc3Mgb2YgY3VycmVudCBzdHJ1Y3Qgb2JzdGFja19jaHVuayAqLworICBjaGFyCSpvYmplY3RfYmFzZTsJCS8qIGFkZHJlc3Mgb2Ygb2JqZWN0IHdlIGFyZSBidWlsZGluZyAqLworICBjaGFyCSpuZXh0X2ZyZWU7CQkvKiB3aGVyZSB0byBhZGQgbmV4dCBjaGFyIHRvIGN1cnJlbnQgb2JqZWN0ICovCisgIGNoYXIJKmNodW5rX2xpbWl0OwkJLyogYWRkcmVzcyBvZiBjaGFyIGFmdGVyIGN1cnJlbnQgY2h1bmsgKi8KKyAgdW5pb24KKyAgeworICAgIFBUUl9JTlRfVFlQRSB0ZW1waW50OworICAgIHZvaWQgKnRlbXBwdHI7CisgIH0gdGVtcDsJCQkvKiBUZW1wb3JhcnkgZm9yIHNvbWUgbWFjcm9zLiAgKi8KKyAgaW50ICAgYWxpZ25tZW50X21hc2s7CQkvKiBNYXNrIG9mIGFsaWdubWVudCBmb3IgZWFjaCBvYmplY3QuICovCisgIC8qIFRoZXNlIHByb3RvdHlwZXMgdmFyeSBiYXNlZCBvbiBgdXNlX2V4dHJhX2FyZycsIGFuZCB3ZSB1c2UKKyAgICAgY2FzdHMgdG8gdGhlIHByb3RvdHlwZWxlc3MgZnVuY3Rpb24gdHlwZSBpbiBhbGwgYXNzaWdubWVudHMsCisgICAgIGJ1dCBoYXZpbmcgcHJvdG90eXBlcyBoZXJlIHF1aWV0cyAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyAgc3RydWN0IF9vYnN0YWNrX2NodW5rICooKmNodW5rZnVuKSAodm9pZCAqLCBsb25nKTsKKyAgdm9pZCAoKmZyZWVmdW4pICh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKTsKKyAgdm9pZCAqZXh0cmFfYXJnOwkJLyogZmlyc3QgYXJnIGZvciBjaHVuayBhbGxvYy9kZWFsbG9jIGZ1bmNzICovCisgIHVuc2lnbmVkIHVzZV9leHRyYV9hcmc6MTsJLyogY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyB0YWtlIGV4dHJhIGFyZyAqLworICB1bnNpZ25lZCBtYXliZV9lbXB0eV9vYmplY3Q6MTsvKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGN1cnJlbnQKKwkJCQkgICBjaHVuayBjb250YWlucyBhIHplcm8tbGVuZ3RoIG9iamVjdC4gIFRoaXMKKwkJCQkgICBwcmV2ZW50cyBmcmVlaW5nIHRoZSBjaHVuayBpZiB3ZSBhbGxvY2F0ZQorCQkJCSAgIGEgYmlnZ2VyIGNodW5rIHRvIHJlcGxhY2UgaXQuICovCisgIHVuc2lnbmVkIGFsbG9jX2ZhaWxlZDoxOwkvKiBObyBsb25nZXIgdXNlZCwgYXMgd2Ugbm93IGNhbGwgdGhlIGZhaWxlZAorCQkJCSAgIGhhbmRsZXIgb24gZXJyb3IsIGJ1dCByZXRhaW5lZCBmb3IgYmluYXJ5CisJCQkJICAgY29tcGF0aWJpbGl0eS4gICovCit9OworCisvKiBEZWNsYXJlIHRoZSBleHRlcm5hbCBmdW5jdGlvbnMgd2UgdXNlOyB0aGV5IGFyZSBpbiBvYnN0YWNrLmMuICAqLworCitleHRlcm4gdm9pZCBfb2JzdGFja19uZXdjaHVuayAoc3RydWN0IG9ic3RhY2sgKiwgaW50KTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW4gKHN0cnVjdCBvYnN0YWNrICosIGludCwgaW50LAorCQkJICAgIHZvaWQgKigqKSAobG9uZyksIHZvaWQgKCopICh2b2lkICopKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCisJCQkgICAgIHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSwKKwkJCSAgICAgdm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK2V4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICopOworCit2b2lkIG9ic3RhY2tfZnJlZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmJsb2NrKTsKKworDAorLyogRXJyb3IgaGFuZGxlciBjYWxsZWQgd2hlbiBgb2JzdGFja19jaHVua19hbGxvYycgZmFpbGVkIHRvIGFsbG9jYXRlCisgICBtb3JlIG1lbW9yeS4gIFRoaXMgY2FuIGJlIHNldCB0byBhIHVzZXIgZGVmaW5lZCBmdW5jdGlvbiB3aGljaAorICAgc2hvdWxkIGVpdGhlciBhYm9ydCBncmFjZWZ1bGx5IG9yIHVzZSBsb25nanVtcCAtIGJ1dCBzaG91bGRuJ3QKKyAgIHJldHVybi4gIFRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCBhIG1lc3NhZ2UgYW5kIGFib3J0LiAgKi8KK2V4dGVybiB2b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpOworCisvKiBFeGl0IHZhbHVlIHVzZWQgd2hlbiBgcHJpbnRfYW5kX2Fib3J0JyBpcyB1c2VkLiAgKi8KK2V4dGVybiBpbnQgb2JzdGFja19leGl0X2ZhaWx1cmU7CisMCisvKiBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiBvYmplY3QgYmVpbmcgYWxsb2NhdGVkIG9yIHRvIGJlIGFsbG9jYXRlZCBuZXh0LgorICAgTm90ZSB0aGF0IHRoaXMgbWlnaHQgbm90IGJlIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZSBvYmplY3QKKyAgIGJlY2F1c2UgYSBuZXcgY2h1bmsgbWlnaHQgYmUgbmVlZGVkIHRvIGhvbGQgdGhlIGZpbmFsIHNpemUuICAqLworCisjZGVmaW5lIG9ic3RhY2tfYmFzZShoKSAoKHZvaWQgKikgKGgpLT5vYmplY3RfYmFzZSkKKworLyogU2l6ZSBmb3IgYWxsb2NhdGluZyBvcmRpbmFyeSBjaHVua3MuICAqLworCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtfc2l6ZShoKSAoKGgpLT5jaHVua19zaXplKQorCisvKiBQb2ludGVyIHRvIG5leHQgYnl0ZSBub3QgeWV0IGFsbG9jYXRlZCBpbiBjdXJyZW50IGNodW5rLiAgKi8KKworI2RlZmluZSBvYnN0YWNrX25leHRfZnJlZShoKQkoKGgpLT5uZXh0X2ZyZWUpCisKKy8qIE1hc2sgc3BlY2lmeWluZyBsb3cgYml0cyB0aGF0IHNob3VsZCBiZSBjbGVhciBpbiBhZGRyZXNzIG9mIGFuIG9iamVjdC4gICovCisKKyNkZWZpbmUgb2JzdGFja19hbGlnbm1lbnRfbWFzayhoKSAoKGgpLT5hbGlnbm1lbnRfbWFzaykKKworLyogVG8gcHJldmVudCBwcm90b3R5cGUgd2FybmluZ3MgcHJvdmlkZSBjb21wbGV0ZSBhcmd1bWVudCBsaXN0LiAgKi8KKyNkZWZpbmUgb2JzdGFja19pbml0KGgpCQkJCQkJXAorICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLAkJCQkJXAorCQkgICh2b2lkICooKikgKGxvbmcpKSBvYnN0YWNrX2NodW5rX2FsbG9jLAlcCisJCSAgKHZvaWQgKCopICh2b2lkICopKSBvYnN0YWNrX2NodW5rX2ZyZWUpCisKKyNkZWZpbmUgb2JzdGFja19iZWdpbihoLCBzaXplKQkJCQkJXAorICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIDAsCQkJCVwKKwkJICAodm9pZCAqKCopIChsb25nKSkgb2JzdGFja19jaHVua19hbGxvYywJXAorCQkgICh2b2lkICgqKSAodm9pZCAqKSkgb2JzdGFja19jaHVua19mcmVlKQorCisjZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pICBcCisgIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgKGFsaWdubWVudCksCQkJCSAgIFwKKwkJICAodm9pZCAqKCopIChsb25nKSkgKGNodW5rZnVuKSwJCQkgICBcCisJCSAgKHZvaWQgKCopICh2b2lkICopKSAoZnJlZWZ1bikpCisKKyNkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCisgIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwJCQkJXAorCQkgICAgKHZvaWQgKigqKSAodm9pZCAqLCBsb25nKSkgKGNodW5rZnVuKSwJCVwKKwkJICAgICh2b2lkICgqKSAodm9pZCAqLCB2b2lkICopKSAoZnJlZWZ1biksIChhcmcpKQorCisjZGVmaW5lIG9ic3RhY2tfY2h1bmtmdW4oaCwgbmV3Y2h1bmtmdW4pIFwKKyAgKChoKSAtPiBjaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSh2b2lkICosIGxvbmcpKSAobmV3Y2h1bmtmdW4pKQorCisjZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCisgICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgKG5ld2ZyZWVmdW4pKQorCisjZGVmaW5lIG9ic3RhY2tfMWdyb3dfZmFzdChoLGFjaGFyKSAoKigoaCktPm5leHRfZnJlZSkrKyA9IChhY2hhcikpCisKKyNkZWZpbmUgb2JzdGFja19ibGFua19mYXN0KGgsbikgKChoKS0+bmV4dF9mcmVlICs9IChuKSkKKworI2RlZmluZSBvYnN0YWNrX21lbW9yeV91c2VkKGgpIF9vYnN0YWNrX21lbW9yeV91c2VkIChoKQorDAorI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworLyogTmV4dFN0ZXAgMi4wIGNjIGlzIHJlYWxseSBnY2MgMS45MyBidXQgaXQgZGVmaW5lcyBfX0dOVUNfXyA9IDIgYW5kCisgICBkb2VzIG5vdCBpbXBsZW1lbnQgX19leHRlbnNpb25fXy4gIEJ1dCB0aGF0IGNvbXBpbGVyIGRvZXNuJ3QgZGVmaW5lCisgICBfX0dOVUNfTUlOT1JfXy4gICovCisjIGlmIF9fR05VQ19fIDwgMiB8fCAoX19OZVhUX18gJiYgIV9fR05VQ19NSU5PUl9fKQorIyAgZGVmaW5lIF9fZXh0ZW5zaW9uX18KKyMgZW5kaWYKKworLyogRm9yIEdOVSBDLCBpZiBub3QgLXRyYWRpdGlvbmFsLAorICAgd2UgY2FuIGRlZmluZSB0aGVzZSBtYWNyb3MgdG8gY29tcHV0ZSBhbGwgYXJncyBvbmx5IG9uY2UKKyAgIHdpdGhvdXQgdXNpbmcgYSBnbG9iYWwgdmFyaWFibGUuCisgICBBbHNvLCB3ZSBjYW4gYXZvaWQgdXNpbmcgdGhlIGB0ZW1wJyBzbG90LCB0byBtYWtlIGZhc3RlciBjb2RlLiAgKi8KKworIyBkZWZpbmUgb2JzdGFja19vYmplY3Rfc2l6ZShPQlNUQUNLKQkJCQkJXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisgICh7IHN0cnVjdCBvYnN0YWNrIGNvbnN0ICpfX28gPSAoT0JTVEFDSyk7CQkJCVwKKyAgICAgKHVuc2lnbmVkKSAoX19vLT5uZXh0X2ZyZWUgLSBfX28tPm9iamVjdF9iYXNlKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19yb29tKE9CU1RBQ0spCQkJCQkJXAorICBfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisgICh7IHN0cnVjdCBvYnN0YWNrIGNvbnN0ICpfX28gPSAoT0JTVEFDSyk7CQkJCVwKKyAgICAgKHVuc2lnbmVkKSAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlKTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19tYWtlX3Jvb20oT0JTVEFDSyxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICBpZiAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbik7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKE9CU1RBQ0spCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgY29uc3QgKl9fbyA9IChPQlNUQUNLKTsJCQkJXAorICAgICAoX19vLT5jaHVuay0+cHJldiA9PSAwCQkJCQkJXAorICAgICAgJiYgX19vLT5uZXh0X2ZyZWUgPT0gX19QVFJfQUxJR04gKChjaGFyICopIF9fby0+Y2h1bmssCQlcCisJCQkJCV9fby0+Y2h1bmstPmNvbnRlbnRzLAkJXAorCQkJCQlfX28tPmFsaWdubWVudF9tYXNrKSk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfZ3JvdyhPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgIGlmIChfX28tPm5leHRfZnJlZSArIF9fbGVuID4gX19vLT5jaHVua19saW1pdCkJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKKyAgIG1lbWNweSAoX19vLT5uZXh0X2ZyZWUsIHdoZXJlLCBfX2xlbik7CQkJCVwKKyAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2dyb3cwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAorICAgaWYgKF9fby0+bmV4dF9mcmVlICsgX19sZW4gKyAxID4gX19vLT5jaHVua19saW1pdCkJCQlcCisgICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuICsgMSk7CQkJCVwKKyAgIG1lbWNweSAoX19vLT5uZXh0X2ZyZWUsIHdoZXJlLCBfX2xlbik7CQkJCVwKKyAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKKyAgICooX19vLT5uZXh0X2ZyZWUpKysgPSAwOwkJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrXzFncm93KE9CU1RBQ0ssZGF0dW0pCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaWYgKF9fby0+bmV4dF9mcmVlICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgMSk7CQkJCQlcCisgICBvYnN0YWNrXzFncm93X2Zhc3QgKF9fbywgZGF0dW0pOwkJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKy8qIFRoZXNlIGFzc3VtZSB0aGF0IHRoZSBvYnN0YWNrIGFsaWdubWVudCBpcyBnb29kIGVub3VnaCBmb3IgcG9pbnRlcnMKKyAgIG9yIGludHMsIGFuZCB0aGF0IHRoZSBkYXRhIGFkZGVkIHNvIGZhciB0byB0aGUgY3VycmVudCBvYmplY3QKKyAgIHNoYXJlcyB0aGF0IG11Y2ggYWxpZ25tZW50LiAgKi8KKworIyBkZWZpbmUgb2JzdGFja19wdHJfZ3JvdyhPQlNUQUNLLGRhdHVtKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaWYgKF9fby0+bmV4dF9mcmVlICsgc2l6ZW9mICh2b2lkICopID4gX19vLT5jaHVua19saW1pdCkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgc2l6ZW9mICh2b2lkICopKTsJCQkJXAorICAgb2JzdGFja19wdHJfZ3Jvd19mYXN0IChfX28sIGRhdHVtKTsgfSkJCQkJXAorCisjIGRlZmluZSBvYnN0YWNrX2ludF9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpZiAoX19vLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGludCkgPiBfX28tPmNodW5rX2xpbWl0KQkJXAorICAgICBfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKGludCkpOwkJCQlcCisgICBvYnN0YWNrX2ludF9ncm93X2Zhc3QgKF9fbywgZGF0dW0pOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93X2Zhc3QoT0JTVEFDSyxhcHRyKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKKyAgICooY29uc3Qgdm9pZCAqKikgX19vMS0+bmV4dF9mcmVlID0gKGFwdHIpOwkJCQlcCisgICBfX28xLT5uZXh0X2ZyZWUgKz0gc2l6ZW9mIChjb25zdCB2b2lkICopOwkJCQlcCisgICAodm9pZCkgMDsgfSkKKworIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KE9CU1RBQ0ssYWludCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbzEgPSAoT0JTVEFDSyk7CQkJCQlcCisgICAqKGludCAqKSBfX28xLT5uZXh0X2ZyZWUgPSAoYWludCk7CQkJCQlcCisgICBfX28xLT5uZXh0X2ZyZWUgKz0gc2l6ZW9mIChpbnQpOwkJCQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAorICAgaWYgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSA8IF9fbGVuKQkJCVwKKyAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAorICAgb2JzdGFja19ibGFua19mYXN0IChfX28sIF9fbGVuKTsJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2FsbG9jKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIG9ic3RhY2tfYmxhbmsgKF9faCwgKGxlbmd0aCkpOwkJCQkJXAorICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCisKKyMgZGVmaW5lIG9ic3RhY2tfY29weShPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9faCA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIG9ic3RhY2tfZ3JvdyAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKKyAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQorCisjIGRlZmluZSBvYnN0YWNrX2NvcHkwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAorICAgb2JzdGFja19ncm93MCAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKKyAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQorCisvKiBUaGUgbG9jYWwgdmFyaWFibGUgaXMgbmFtZWQgX19vMSB0byBhdm9pZCBhIG5hbWUgY29uZmxpY3QKKyAgIHdoZW4gb2JzdGFja19ibGFuayBpcyBjYWxsZWQuICAqLworIyBkZWZpbmUgb2JzdGFja19maW5pc2goT0JTVEFDSykJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28xID0gKE9CU1RBQ0spOwkJCQkJXAorICAgdm9pZCAqX192YWx1ZSA9ICh2b2lkICopIF9fbzEtPm9iamVjdF9iYXNlOwkJCQlcCisgICBpZiAoX19vMS0+bmV4dF9mcmVlID09IF9fdmFsdWUpCQkJCQlcCisgICAgIF9fbzEtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7CQkJCQlcCisgICBfX28xLT5uZXh0X2ZyZWUJCQkJCQkJXAorICAgICA9IF9fUFRSX0FMSUdOIChfX28xLT5vYmplY3RfYmFzZSwgX19vMS0+bmV4dF9mcmVlLAkJCVwKKwkJICAgIF9fbzEtPmFsaWdubWVudF9tYXNrKTsJCQkJXAorICAgaWYgKF9fbzEtPm5leHRfZnJlZSAtIChjaGFyICopX19vMS0+Y2h1bmsJCQkJXAorICAgICAgID4gX19vMS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKV9fbzEtPmNodW5rKQkJCVwKKyAgICAgX19vMS0+bmV4dF9mcmVlID0gX19vMS0+Y2h1bmtfbGltaXQ7CQkJCVwKKyAgIF9fbzEtPm9iamVjdF9iYXNlID0gX19vMS0+bmV4dF9mcmVlOwkJCQkJXAorICAgX192YWx1ZTsgfSkKKworIyBkZWZpbmUgb2JzdGFja19mcmVlKE9CU1RBQ0ssIE9CSikJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICB2b2lkICpfX29iaiA9IChPQkopOwkJCQkJCQlcCisgICBpZiAoX19vYmogPiAodm9pZCAqKV9fby0+Y2h1bmsgJiYgX19vYmogPCAodm9pZCAqKV9fby0+Y2h1bmtfbGltaXQpICBcCisgICAgIF9fby0+bmV4dF9mcmVlID0gX19vLT5vYmplY3RfYmFzZSA9IChjaGFyICopX19vYmo7CQkJXAorICAgZWxzZSAob2JzdGFja19mcmVlKSAoX19vLCBfX29iaik7IH0pCisMCisjZWxzZSAvKiBub3QgX19HTlVDX18gb3Igbm90IF9fU1REQ19fICovCisKKyMgZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoaCkgXAorICh1bnNpZ25lZCkgKChoKS0+bmV4dF9mcmVlIC0gKGgpLT5vYmplY3RfYmFzZSkKKworIyBkZWZpbmUgb2JzdGFja19yb29tKGgpCQlcCisgKHVuc2lnbmVkKSAoKGgpLT5jaHVua19saW1pdCAtIChoKS0+bmV4dF9mcmVlKQorCisjIGRlZmluZSBvYnN0YWNrX2VtcHR5X3AoaCkgXAorICgoaCktPmNodW5rLT5wcmV2ID09IDAJCQkJCQkJXAorICAmJiAoaCktPm5leHRfZnJlZSA9PSBfX1BUUl9BTElHTiAoKGNoYXIgKikgKGgpLT5jaHVuaywJCVwKKwkJCQkgICAgKGgpLT5jaHVuay0+Y29udGVudHMsCQlcCisJCQkJICAgIChoKS0+YWxpZ25tZW50X21hc2spKQorCisvKiBOb3RlIHRoYXQgdGhlIGNhbGwgdG8gX29ic3RhY2tfbmV3Y2h1bmsgaXMgZW5jbG9zZWQgaW4gKC4uLiwgMCkKKyAgIHNvIHRoYXQgd2UgY2FuIGF2b2lkIGhhdmluZyB2b2lkIGV4cHJlc3Npb25zCisgICBpbiB0aGUgYXJtcyBvZiB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4KKyAgIENhc3RpbmcgdGhlIHRoaXJkIG9wZXJhbmQgdG8gdm9pZCB3YXMgdHJpZWQgYmVmb3JlLAorICAgYnV0IHNvbWUgY29tcGlsZXJzIHdvbid0IGFjY2VwdCBpdC4gICovCisKKyMgZGVmaW5lIG9ic3RhY2tfbWFrZV9yb29tKGgsbGVuZ3RoKQkJCQkJXAorKCAoaCktPnRlbXAudGVtcGludCA9IChsZW5ndGgpLAkJCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcC50ZW1waW50ID4gKGgpLT5jaHVua19saW1pdCkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcC50ZW1waW50KSwgMCkgOiAwKSkKKworIyBkZWZpbmUgb2JzdGFja19ncm93KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorKCAoaCktPnRlbXAudGVtcGludCA9IChsZW5ndGgpLAkJCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcC50ZW1waW50ID4gKGgpLT5jaHVua19saW1pdCkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcC50ZW1waW50KSwgMCkgOiAwKSwJCVwKKyAgbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgd2hlcmUsIChoKS0+dGVtcC50ZW1waW50KSwJCQlcCisgIChoKS0+bmV4dF9mcmVlICs9IChoKS0+dGVtcC50ZW1waW50KQorCisjIGRlZmluZSBvYnN0YWNrX2dyb3cwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorKCAoaCktPnRlbXAudGVtcGludCA9IChsZW5ndGgpLAkJCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcC50ZW1waW50ICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXAudGVtcGludCArIDEpLCAwKSA6IDApLAkJXAorICBtZW1jcHkgKChoKS0+bmV4dF9mcmVlLCB3aGVyZSwgKGgpLT50ZW1wLnRlbXBpbnQpLAkJCVwKKyAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wLnRlbXBpbnQsCQkJCQlcCisgICooKGgpLT5uZXh0X2ZyZWUpKysgPSAwKQorCisjIGRlZmluZSBvYnN0YWNrXzFncm93KGgsZGF0dW0pCQkJCQkJXAorKCAoKChoKS0+bmV4dF9mcmVlICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIDEpLCAwKSA6IDApLAkJCQlcCisgIG9ic3RhY2tfMWdyb3dfZmFzdCAoaCwgZGF0dW0pKQorCisjIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93KGgsZGF0dW0pCQkJCQlcCisoICgoKGgpLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGNoYXIgKikgPiAoaCktPmNodW5rX2xpbWl0KQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgc2l6ZW9mIChjaGFyICopKSwgMCkgOiAwKSwJCVwKKyAgb2JzdGFja19wdHJfZ3Jvd19mYXN0IChoLCBkYXR1bSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coaCxkYXR1bSkJCQkJCVwKKyggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgc2l6ZW9mIChpbnQpKSwgMCkgOiAwKSwJCQlcCisgIG9ic3RhY2tfaW50X2dyb3dfZmFzdCAoaCwgZGF0dW0pKQorCisjIGRlZmluZSBvYnN0YWNrX3B0cl9ncm93X2Zhc3QoaCxhcHRyKQkJCQkJXAorICAoKChjb25zdCB2b2lkICoqKSAoKGgpLT5uZXh0X2ZyZWUgKz0gc2l6ZW9mICh2b2lkICopKSlbLTFdID0gKGFwdHIpKQorCisjIGRlZmluZSBvYnN0YWNrX2ludF9ncm93X2Zhc3QoaCxhaW50KQkJCQkJXAorICAoKChpbnQgKikgKChoKS0+bmV4dF9mcmVlICs9IHNpemVvZiAoaW50KSkpWy0xXSA9IChhaW50KSkKKworIyBkZWZpbmUgb2JzdGFja19ibGFuayhoLGxlbmd0aCkJCQkJCVwKKyggKGgpLT50ZW1wLnRlbXBpbnQgPSAobGVuZ3RoKSwJCQkJCQlcCisgICgoKGgpLT5jaHVua19saW1pdCAtIChoKS0+bmV4dF9mcmVlIDwgKGgpLT50ZW1wLnRlbXBpbnQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXAudGVtcGludCksIDApIDogMCksCQlcCisgIG9ic3RhY2tfYmxhbmtfZmFzdCAoaCwgKGgpLT50ZW1wLnRlbXBpbnQpKQorCisjIGRlZmluZSBvYnN0YWNrX2FsbG9jKGgsbGVuZ3RoKQkJCQkJXAorIChvYnN0YWNrX2JsYW5rICgoaCksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfY29weShoLHdoZXJlLGxlbmd0aCkJCQkJCVwKKyAob2JzdGFja19ncm93ICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCisKKyMgZGVmaW5lIG9ic3RhY2tfY29weTAoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCisgKG9ic3RhY2tfZ3JvdzAgKChoKSwgKHdoZXJlKSwgKGxlbmd0aCkpLCBvYnN0YWNrX2ZpbmlzaCAoKGgpKSkKKworIyBkZWZpbmUgb2JzdGFja19maW5pc2goaCkJCQkJCQlcCisoICgoaCktPm5leHRfZnJlZSA9PSAoaCktPm9iamVjdF9iYXNlCQkJCQlcCisgICA/ICgoKGgpLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxKSwgMCkJCQkJCVwKKyAgIDogMCksCQkJCQkJCQlcCisgIChoKS0+dGVtcC50ZW1wcHRyID0gKGgpLT5vYmplY3RfYmFzZSwJCQkJCVwKKyAgKGgpLT5uZXh0X2ZyZWUJCQkJCQkJXAorICAgID0gX19QVFJfQUxJR04gKChoKS0+b2JqZWN0X2Jhc2UsIChoKS0+bmV4dF9mcmVlLAkJCVwKKwkJICAgKGgpLT5hbGlnbm1lbnRfbWFzayksCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSAtIChjaGFyICopIChoKS0+Y2h1bmsJCQkJXAorICAgID4gKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspCQkJCVwKKyAgID8gKChoKS0+bmV4dF9mcmVlID0gKGgpLT5jaHVua19saW1pdCkgOiAwKSwJCQkJXAorICAoaCktPm9iamVjdF9iYXNlID0gKGgpLT5uZXh0X2ZyZWUsCQkJCQlcCisgIChoKS0+dGVtcC50ZW1wcHRyKQorCisjIGRlZmluZSBvYnN0YWNrX2ZyZWUoaCxvYmopCQkJCQkJXAorKCAoaCktPnRlbXAudGVtcGludCA9IChjaGFyICopIChvYmopIC0gKGNoYXIgKikgKGgpLT5jaHVuaywJCVwKKyAgKCgoKGgpLT50ZW1wLnRlbXBpbnQgPiAwCQkJCQkJXAorICAgICYmIChoKS0+dGVtcC50ZW1waW50IDwgKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspKQlcCisgICA/IChpbnQpICgoaCktPm5leHRfZnJlZSA9IChoKS0+b2JqZWN0X2Jhc2UJCQkJXAorCSAgICA9IChoKS0+dGVtcC50ZW1waW50ICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQlcCisgICA6ICgoKG9ic3RhY2tfZnJlZSkgKChoKSwgKGgpLT50ZW1wLnRlbXBpbnQgKyAoY2hhciAqKSAoaCktPmNodW5rKSwgMCksIDApKSkKKworI2VuZGlmIC8qIG5vdCBfX0dOVUNfXyBvciBub3QgX19TVERDX18gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CS8qIEMrKyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBvYnN0YWNrLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGFuZWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGFuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAyMDkxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wYW5lbC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSwyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5NSAgICAgICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IHBhbmVsLmgsdiAxLjEwIDIwMDYvMDUvMjcgMTk6NDk6NDAgdG9tIEV4cCAkICovCisKKy8qIHBhbmVsLmggLS0gaW50ZXJmYWNlIGZpbGUgZm9yIHBhbmVscyBsaWJyYXJ5ICovCisKKyNpZm5kZWYgTkNVUlNFU19QQU5FTF9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19QQU5FTF9IX2luY2wgMQorCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisKK3R5cGVkZWYgc3RydWN0IHBhbmVsCit7CisgIFdJTkRPVyAqd2luOworICBzdHJ1Y3QgcGFuZWwgKmJlbG93OworICBzdHJ1Y3QgcGFuZWwgKmFib3ZlOworICBOQ1VSU0VTX0NPTlNUIHZvaWQgKnVzZXI7Cit9IFBBTkVMOworCisjaWYJZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChXSU5ET1cqKSBwYW5lbF93aW5kb3cgKGNvbnN0IFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpICAgIHVwZGF0ZV9wYW5lbHMgKHZvaWQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIGhpZGVfcGFuZWwgKFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIHNob3dfcGFuZWwgKFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgICAgIGRlbF9wYW5lbCAoUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgdG9wX3BhbmVsIChQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBib3R0b21fcGFuZWwgKFBBTkVMICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFBBTkVMKikgIG5ld19wYW5lbCAoV0lORE9XICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFBBTkVMKikgIHBhbmVsX2Fib3ZlIChjb25zdCBQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChQQU5FTCopICBwYW5lbF9iZWxvdyAoY29uc3QgUEFORUwgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgc2V0X3BhbmVsX3VzZXJwdHIgKFBBTkVMICosIE5DVVJTRVNfQ09OU1Qgdm9pZCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChOQ1VSU0VTX0NPTlNUIHZvaWQqKSBwYW5lbF91c2VycHRyIChjb25zdCBQQU5FTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpICAgICBtb3ZlX3BhbmVsIChQQU5FTCAqLCBpbnQsIGludCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgcmVwbGFjZV9wYW5lbCAoUEFORUwgKixXSU5ET1cgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgICAgcGFuZWxfaGlkZGVuIChjb25zdCBQQU5FTCAqKTsKKworI2lmCWRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfUEFORUxfSF9pbmNsICovCisKKy8qIGVuZCBvZiBwYW5lbC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3BhdGhzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3BhdGhzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3Y2M2ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcGF0aHMuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXBhdGhzLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfUEFUSFNfSF8KKyNkZWZpbmUJX1BBVEhTX0hfCisKKy8qIERlZmF1bHQgc2VhcmNoIHBhdGguICovCisjZGVmaW5lCV9QQVRIX0RFRlBBVEgJIi91c3IvYmluOi9iaW4iCisvKiBBbGwgc3RhbmRhcmQgdXRpbGl0aWVzIHBhdGguICovCisjZGVmaW5lCV9QQVRIX1NURFBBVEggXAorCSIvdXNyL2JpbjovYmluOi91c3Ivc2Jpbjovc2JpbiIKKworI2RlZmluZQlfUEFUSF9CU0hFTEwJIi9iaW4vc2giCisjZGVmaW5lCV9QQVRIX0NPTlNPTEUJIi9kZXYvY29uc29sZSIKKyNkZWZpbmUJX1BBVEhfQ1NIRUxMCSIvYmluL2NzaCIKKyNkZWZpbmUJX1BBVEhfREVWREIJIi92YXIvcnVuL2Rldi5kYiIKKyNkZWZpbmUJX1BBVEhfREVWTlVMTAkiL2Rldi9udWxsIgorI2RlZmluZQlfUEFUSF9EUlVNCSIvZGV2L2RydW0iCisjZGVmaW5lCV9QQVRIX0tMT0cJIi9wcm9jL2ttc2ciCisjZGVmaW5lCV9QQVRIX0tNRU0JIi9kZXYva21lbSIKKyNkZWZpbmUJX1BBVEhfTEFTVExPRwkiL3Zhci9sb2cvbGFzdGxvZyIKKyNkZWZpbmUJX1BBVEhfTUFJTERJUgkiL3Zhci9tYWlsIgorI2RlZmluZQlfUEFUSF9NQU4JIi91c3Ivc2hhcmUvbWFuIgorI2RlZmluZQlfUEFUSF9NRU0JIi9kZXYvbWVtIgorI2RlZmluZQlfUEFUSF9NTlRUQUIJIi9ldGMvZnN0YWIiCisjZGVmaW5lCV9QQVRIX01PVU5URUQJIi9ldGMvbXRhYiIKKyNkZWZpbmUJX1BBVEhfTk9MT0dJTgkiL2V0Yy9ub2xvZ2luIgorI2RlZmluZQlfUEFUSF9QUkVTRVJWRQkiL3Zhci9saWIiCisjZGVmaW5lCV9QQVRIX1JXSE9ESVIJIi92YXIvc3Bvb2wvcndobyIKKyNkZWZpbmUJX1BBVEhfU0VORE1BSUwJIi91c3Ivc2Jpbi9zZW5kbWFpbCIKKyNkZWZpbmUJX1BBVEhfU0hBRE9XCSIvZXRjL3NoYWRvdyIKKyNkZWZpbmUJX1BBVEhfU0hFTExTCSIvZXRjL3NoZWxscyIKKyNkZWZpbmUJX1BBVEhfVFRZCSIvZGV2L3R0eSIKKyNkZWZpbmUJX1BBVEhfVU5JWAkiL2Jvb3Qvdm1saW51eCIKKyNkZWZpbmUgX1BBVEhfVVRNUAkiL3Zhci9ydW4vdXRtcCIKKyNkZWZpbmUJX1BBVEhfVkkJIi91c3IvYmluL3ZpIgorI2RlZmluZSBfUEFUSF9XVE1QCSIvdmFyL2xvZy93dG1wIgorCisvKiBQcm92aWRlIHRyYWlsaW5nIHNsYXNoLCBzaW5jZSBtb3N0bHkgdXNlZCBmb3IgYnVpbGRpbmcgcGF0aG5hbWVzLiAqLworI2RlZmluZQlfUEFUSF9ERVYJIi9kZXYvIgorI2RlZmluZQlfUEFUSF9UTVAJIi90bXAvIgorI2RlZmluZQlfUEFUSF9WQVJEQgkiL3Zhci9saWIvbWlzYy8iCisjZGVmaW5lCV9QQVRIX1ZBUlJVTgkiL3Zhci9ydW4vIgorI2RlZmluZQlfUEFUSF9WQVJUTVAJIi92YXIvdG1wLyIKKworI2VuZGlmIC8qICFfUEFUSFNfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmYjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcG9sbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wcmludGYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJpbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwY2RjYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJpbnRmLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLDE5OTUtMTk5OSwyMDAwLDIwMDEsMjAwNgorCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9QUklOVEZfSAorCisjZGVmaW5lCV9QUklOVEZfSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lCV9fbmVlZF9GSUxFCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2RlZmluZSBfX25lZWRfd2NoYXJfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKK3N0cnVjdCBwcmludGZfaW5mbworeworICBpbnQgcHJlYzsJCQkvKiBQcmVjaXNpb24uICAqLworICBpbnQgd2lkdGg7CQkJLyogV2lkdGguICAqLworICB3Y2hhcl90IHNwZWM7CQkJLyogRm9ybWF0IGxldHRlci4gICovCisgIHVuc2lnbmVkIGludCBpc19sb25nX2RvdWJsZToxOy8qIEwgZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBpc19zaG9ydDoxOwkvKiBoIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgaXNfbG9uZzoxOwkvKiBsIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgYWx0OjE7CQkvKiAjIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgc3BhY2U6MTsJCS8qIFNwYWNlIGZsYWcuICAqLworICB1bnNpZ25lZCBpbnQgbGVmdDoxOwkJLyogLSBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IHNob3dzaWduOjE7CS8qICsgZmxhZy4gICovCisgIHVuc2lnbmVkIGludCBncm91cDoxOwkJLyogJyBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IGV4dHJhOjE7CQkvKiBGb3Igc3BlY2lhbCB1c2UuICAqLworICB1bnNpZ25lZCBpbnQgaXNfY2hhcjoxOwkvKiBoaCBmbGFnLiAgKi8KKyAgdW5zaWduZWQgaW50IHdpZGU6MTsJCS8qIE5vbnplcm8gZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmVhbXMuICAqLworICB1bnNpZ25lZCBpbnQgaTE4bjoxOwkJLyogSSBmbGFnLiAgKi8KKyAgd2NoYXJfdCBwYWQ7CQkJLyogUGFkZGluZyBjaGFyYWN0ZXIuICAqLworfTsKKworCisvKiBUeXBlIG9mIGEgcHJpbnRmIHNwZWNpZmllci1oYW5kbGVyIGZ1bmN0aW9uLgorICAgU1RSRUFNIGlzIHRoZSBGSUxFIG9uIHdoaWNoIHRvIHdyaXRlIG91dHB1dC4KKyAgIElORk8gZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uLgorICAgQVJHUyBpcyBhIHZlY3RvciBvZiBwb2ludGVycyB0byB0aGUgYXJndW1lbnQgZGF0YTsKKyAgIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgd2lsbCBiZSB0aGUgbnVtYmVyIHJldHVybmVkCisgICBieSB0aGUgYXNzb2NpYXRlZCBhcmdpbmZvIGZ1bmN0aW9uIGZvciB0aGUgc2FtZSBJTkZPLgorCisgICBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwKKyAgIG9yIC0xIGZvciBlcnJvcnMuICAqLworCit0eXBlZGVmIGludCBwcmludGZfZnVuY3Rpb24gKEZJTEUgKl9fc3RyZWFtLAorCQkJICAgICBfX2NvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqX19pbmZvLAorCQkJICAgICBfX2NvbnN0IHZvaWQgKl9fY29uc3QgKl9fYXJncyk7CisKKy8qIFR5cGUgb2YgYSBwcmludGYgc3BlY2lmaWVyLWFyZ2luZm8gZnVuY3Rpb24uCisgICBJTkZPIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAgIE4sIEFSR1RZUEVTLCBhbmQgcmV0dXJuIHZhbHVlIGFyZSBhcyBmb3IgcGFyc2VfcHJpbnRmX2Zvcm1hdC4gICovCisKK3R5cGVkZWYgaW50IHByaW50Zl9hcmdpbmZvX2Z1bmN0aW9uIChfX2NvbnN0IHN0cnVjdCBwcmludGZfaW5mbyAqX19pbmZvLAorCQkJCSAgICAgc2l6ZV90IF9fbiwgaW50ICpfX2FyZ3R5cGVzKTsKKworCisvKiBSZWdpc3RlciBGVU5DIHRvIGJlIGNhbGxlZCB0byBmb3JtYXQgU1BFQyBzcGVjaWZpZXJzOyBBUkdJTkZPIG11c3QgYmUKKyAgIHNwZWNpZmllZCB0byBkZXRlcm1pbmUgaG93IG1hbnkgYXJndW1lbnRzIGEgU1BFQyBjb252ZXJzaW9uIHJlcXVpcmVzIGFuZAorICAgd2hhdCB0aGVpciB0eXBlcyBhcmUuICAqLworCitleHRlcm4gaW50IHJlZ2lzdGVyX3ByaW50Zl9mdW5jdGlvbiAoaW50IF9fc3BlYywgcHJpbnRmX2Z1bmN0aW9uIF9fZnVuYywKKwkJCQkgICAgIHByaW50Zl9hcmdpbmZvX2Z1bmN0aW9uIF9fYXJnaW5mbyk7CisKKworLyogUGFyc2UgRk1ULCBhbmQgZmlsbCBpbiBOIGVsZW1lbnRzIG9mIEFSR1RZUEVTIHdpdGggdGhlCisgICB0eXBlcyBuZWVkZWQgZm9yIHRoZSBjb252ZXJzaW9ucyBGTVQgc3BlY2lmaWVzLiAgUmV0dXJucworICAgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVxdWlyZWQgYnkgRk1ULgorCisgICBUaGUgQVJHSU5GTyBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggYSB1c2VyLWRlZmluZWQgZm9ybWF0IGlzIHBhc3NlZCBhCisgICBgc3RydWN0IHByaW50Zl9pbmZvJyBkZXNjcmliaW5nIHRoZSBmb3JtYXQgc3BlYyBiZWluZyBwYXJzZWQuICBBIHdpZHRoCisgICBvciBwcmVjaXNpb24gb2YgSU5UX01JTiBtZWFucyBhIGAqJyB3YXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICAgd2lkdGgvcHJlY2lzaW9uIHdpbGwgY29tZSBmcm9tIGFuIGFyZy4gIFRoZSBmdW5jdGlvbiBzaG91bGQgZmlsbCBpbiB0aGUKKyAgIGFycmF5IGl0IGlzIHBhc3NlZCB3aXRoIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGl0IHdhbnRzLCBhbmQgcmV0dXJuCisgICB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCB3YW50cy4gICovCisKK2V4dGVybiBzaXplX3QgcGFyc2VfcHJpbnRmX2Zvcm1hdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCBzaXplX3QgX19uLAorCQkJCSAgIGludCAqX19yZXN0cmljdCBfX2FyZ3R5cGVzKSBfX1RIUk9XOworCisKKy8qIENvZGVzIHJldHVybmVkIGJ5IGBwYXJzZV9wcmludGZfZm9ybWF0JyBmb3IgYmFzaWMgdHlwZXMuCisKKyAgIFRoZXNlIHZhbHVlcyBjb3ZlciBhbGwgdGhlIHN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpY2F0aW9ucy4KKyAgIFVzZXJzIGNhbiBhZGQgbmV3IHZhbHVlcyBhZnRlciBQQV9MQVNUIGZvciB0aGVpciBvd24gdHlwZXMuICAqLworCitlbnVtCit7CQkJCS8qIEMgdHlwZTogKi8KKyAgUEFfSU5ULAkJCS8qIGludCAqLworICBQQV9DSEFSLAkJCS8qIGludCwgY2FzdCB0byBjaGFyICovCisgIFBBX1dDSEFSLAkJCS8qIHdpZGUgY2hhciAqLworICBQQV9TVFJJTkcsCQkJLyogY29uc3QgY2hhciAqLCBhICdcMCctdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgUEFfV1NUUklORywJCQkvKiBjb25zdCB3Y2hhcl90ICosIHdpZGUgY2hhcmFjdGVyIHN0cmluZyAqLworICBQQV9QT0lOVEVSLAkJCS8qIHZvaWQgKiAqLworICBQQV9GTE9BVCwJCQkvKiBmbG9hdCAqLworICBQQV9ET1VCTEUsCQkJLyogZG91YmxlICovCisgIFBBX0xBU1QKK307CisKKy8qIEZsYWcgYml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYSB0eXBlIHJldHVybmVkIGJ5IGBwYXJzZV9wcmludGZfZm9ybWF0Jy4gICovCisjZGVmaW5lCVBBX0ZMQUdfTUFTSwkJMHhmZjAwCisjZGVmaW5lCVBBX0ZMQUdfTE9OR19MT05HCSgxIDw8IDgpCisjZGVmaW5lCVBBX0ZMQUdfTE9OR19ET1VCTEUJUEFfRkxBR19MT05HX0xPTkcKKyNkZWZpbmUJUEFfRkxBR19MT05HCQkoMSA8PCA5KQorI2RlZmluZQlQQV9GTEFHX1NIT1JUCQkoMSA8PCAxMCkKKyNkZWZpbmUJUEFfRkxBR19QVFIJCSgxIDw8IDExKQorCisKKworLyogRnVuY3Rpb24gd2hpY2ggY2FuIGJlIHJlZ2lzdGVyZWQgYXMgYHByaW50ZictaGFuZGxlcnMuICAqLworCisvKiBQcmludCBmbG9hdGluZyBwb2ludCB2YWx1ZSB1c2luZyB1c2luZyBhYmJyZXZpYXRpb25zIGZvciB0aGUgb3JkZXJzCisgICBvZiBtYWduaXR1ZGUgdXNlZCBmb3IgbnVtYmVycyAoJ2snIGZvciBraWxvLCAnbScgZm9yIG1lZ2EgZXRjKS4gIElmCisgICB0aGUgZm9ybWF0IHNwZWNpZmllciBpcyBhIHVwcGVyY2FzZSBjaGFyYWN0ZXIgcG93ZXJzIG9mIDEwMDAgYXJlCisgICB1c2VkLiAgT3RoZXJ3aXNlIHBvd2VycyBvZiAxMDI0LiAgKi8KK2V4dGVybiBpbnQgcHJpbnRmX3NpemUgKEZJTEUgKl9fcmVzdHJpY3QgX19mcCwKKwkJCV9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX2luZm8sCisJCQlfX2NvbnN0IHZvaWQgKl9fY29uc3QgKl9fcmVzdHJpY3QgX19hcmdzKSBfX1RIUk9XOworCisvKiBUaGlzIGlzIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudCBpbmZvcm1hdGlvbiBmdW5jdGlvbiBmb3IgYHByaW50Zl9zaXplJy4gICovCitleHRlcm4gaW50IHByaW50Zl9zaXplX2luZm8gKF9fY29uc3Qgc3RydWN0IHByaW50Zl9pbmZvICpfX3Jlc3RyaWN0CisJCQkgICAgIF9faW5mbywgc2l6ZV90IF9fbiwgaW50ICpfX3Jlc3RyaWN0IF9fYXJndHlwZXMpCisgICAgIF9fVEhST1c7CisKKyNpZmRlZiBfX0xEQkxfQ09NUEFUCisjIGluY2x1ZGUgPGJpdHMvcHJpbnRmLWxkYmwuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcHJpbnRmLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yb3V0ZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3JvdXRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmQ4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy9yb3V0ZWQuaApAQCAtMCwwICsxLDEwMSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcm91dGVkLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfUFJPVE9DT0xTX1JPVVRFRF9ICisjZGVmaW5lCV9QUk9UT0NPTFNfUk9VVEVEX0ggMQorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorLyoKKyAqIFJvdXRpbmcgSW5mb3JtYXRpb24gUHJvdG9jb2wKKyAqCisgKiBEZXJpdmVkIGZyb20gWGVyb3ggTlMgUm91dGluZyBJbmZvcm1hdGlvbiBQcm90b2NvbAorICogYnkgY2hhbmdpbmcgMzItYml0IG5ldCBudW1iZXJzIHRvIHNvY2thZGRyJ3MgYW5kCisgKiBwYWRkaW5nIHN0dWZmIHRvIDMyLWJpdCBib3VuZGFyaWVzLgorICovCisjZGVmaW5lCVJJUFZFUlNJT04JMQorCitzdHJ1Y3QgbmV0aW5mbyB7CisJc3RydWN0CXNvY2thZGRyIHJpcF9kc3Q7CS8qIGRlc3RpbmF0aW9uIG5ldC9ob3N0ICovCisJaW50CXJpcF9tZXRyaWM7CQkvKiBjb3N0IG9mIHJvdXRlICovCit9OworCitzdHJ1Y3QgcmlwIHsKKwl1X2NoYXIJcmlwX2NtZDsJCS8qIHJlcXVlc3QvcmVzcG9uc2UgKi8KKwl1X2NoYXIJcmlwX3ZlcnM7CQkvKiBwcm90b2NvbCB2ZXJzaW9uICMgKi8KKwl1X2NoYXIJcmlwX3JlczFbMl07CQkvKiBwYWQgdG8gMzItYml0IGJvdW5kYXJ5ICovCisJdW5pb24geworCQlzdHJ1Y3QJbmV0aW5mbyBydV9uZXRzWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGguLi4gKi8KKwkJY2hhcglydV90cmFjZWZpbGVbMV07CS8qIGRpdHRvIC4uLiAqLworCX0gcmlwdW47CisjZGVmaW5lCXJpcF9uZXRzCXJpcHVuLnJ1X25ldHMKKyNkZWZpbmUJcmlwX3RyYWNlZmlsZQlyaXB1bi5ydV90cmFjZWZpbGUKK307CisKKy8qCisgKiBQYWNrZXQgdHlwZXMuCisgKi8KKyNkZWZpbmUJUklQQ01EX1JFUVVFU1QJCTEJLyogd2FudCBpbmZvICovCisjZGVmaW5lCVJJUENNRF9SRVNQT05TRQkJMgkvKiByZXNwb25kaW5nIHRvIHJlcXVlc3QgKi8KKyNkZWZpbmUJUklQQ01EX1RSQUNFT04JCTMJLyogdHVybiB0cmFjaW5nIG9uICovCisjZGVmaW5lCVJJUENNRF9UUkFDRU9GRgkJNAkvKiB0dXJuIGl0IG9mZiAqLworCisjZGVmaW5lCVJJUENNRF9NQVgJCTUKKyNpZmRlZiBSSVBDTURTCitjaGFyICpyaXBjbWRzW1JJUENNRF9NQVhdID0KKyAgeyAiIzAiLCAiUkVRVUVTVCIsICJSRVNQT05TRSIsICJUUkFDRU9OIiwgIlRSQUNFT0ZGIiB9OworI2VuZGlmCisKKyNkZWZpbmUJSE9QQ05UX0lORklOSVRZCQkxNgkvKiBwZXIgWGVyb3ggTlMgKi8KKyNkZWZpbmUJTUFYUEFDS0VUU0laRQkJNTEyCS8qIG1heCBicm9hZGNhc3Qgc2l6ZSAqLworCisvKgorICogVGltZXIgdmFsdWVzIHVzZWQgaW4gbWFuYWdpbmcgdGhlIHJvdXRpbmcgdGFibGUuCisgKiBDb21wbGV0ZSB0YWJsZXMgYXJlIGJyb2FkY2FzdCBldmVyeSBTVVBQTFlfSU5URVJWQUwgc2Vjb25kcy4KKyAqIElmIGNoYW5nZXMgb2NjdXIgYmV0d2VlbiB1cGRhdGVzLCBkeW5hbWljIHVwZGF0ZXMgY29udGFpbmluZyBvbmx5IGNoYW5nZXMKKyAqIG1heSBiZSBzZW50LiAgV2hlbiB0aGVzZSBhcmUgc2VudCwgYSB0aW1lciBpcyBzZXQgZm9yIGEgcmFuZG9tIHZhbHVlCisgKiBiZXR3ZWVuIE1JTl9XQUlUVElNRSBhbmQgTUFYX1dBSVRUSU1FLCBhbmQgbm8gYWRkaXRpb25hbCBkeW5hbWljIHVwZGF0ZXMKKyAqIGFyZSBzZW50IHVudGlsIHRoZSB0aW1lciBleHBpcmVzLgorICoKKyAqIEV2ZXJ5IHVwZGF0ZSBvZiBhIHJvdXRpbmcgZW50cnkgZm9yY2VzIGFuIGVudHJ5J3MgdGltZXIgdG8gYmUgcmVzZXQuCisgKiBBZnRlciBFWFBJUkVfVElNRSB3aXRob3V0IHVwZGF0ZXMsIHRoZSBlbnRyeSBpcyBtYXJrZWQgaW52YWxpZCwKKyAqIGJ1dCBoZWxkIG9udG8gdW50aWwgR0FSQkFHRV9USU1FIHNvIHRoYXQgb3RoZXJzIG1heQorICogc2VlIGl0ICJiZSBkZWxldGVkIi4KKyAqLworI2RlZmluZQlUSU1FUl9SQVRFCQkzMAkvKiBhbGFybSBjbG9ja3MgZXZlcnkgMzAgc2Vjb25kcyAqLworCisjZGVmaW5lCVNVUFBMWV9JTlRFUlZBTAkJMzAJLyogdGltZSB0byBzdXBwbHkgdGFibGVzICovCisjZGVmaW5lCU1JTl9XQUlUVElNRQkJMgkvKiBtaW4uIGludGVydmFsIHRvIGJyb2FkY2FzdCBjaGFuZ2VzICovCisjZGVmaW5lCU1BWF9XQUlUVElNRQkJNQkvKiBtYXguIHRpbWUgdG8gZGVsYXkgY2hhbmdlcyAqLworCisjZGVmaW5lCUVYUElSRV9USU1FCQkxODAJLyogdGltZSB0byBtYXJrIGVudHJ5IGludmFsaWQgKi8KKyNkZWZpbmUJR0FSQkFHRV9USU1FCQkyNDAJLyogdGltZSB0byBnYXJiYWdlIGNvbGxlY3QgKi8KKworI2VuZGlmIC8qIHByb3RvY29scy9yb3V0ZWQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvcndob2QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3J3aG9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2ZDZmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3J3aG9kLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyd2hvZC5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICovCisKKyNpZm5kZWYgX1BST1RPQ09MU19SV0hPRF9ICisjZGVmaW5lCV9QUk9UT0NPTFNfUldIT0RfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoKKyAqIHJ3aG8gcHJvdG9jb2wgcGFja2V0IGZvcm1hdC4KKyAqLworc3RydWN0CW91dG1wIHsKKwljaGFyCW91dF9saW5lWzhdOwkJLyogdHR5IG5hbWUgKi8KKwljaGFyCW91dF9uYW1lWzhdOwkJLyogdXNlciBpZCAqLworCWludDMyX3QJb3V0X3RpbWU7CQkvKiB0aW1lIG9uICovCit9OworCitzdHJ1Y3QJd2hvZCB7CisJY2hhcgl3ZF92ZXJzOwkJLyogcHJvdG9jb2wgdmVyc2lvbiAjICovCisJY2hhcgl3ZF90eXBlOwkJLyogcGFja2V0IHR5cGUsIHNlZSBiZWxvdyAqLworCWNoYXIJd2RfcGFkWzJdOworCWludAl3ZF9zZW5kdGltZTsJCS8qIHRpbWUgc3RhbXAgYnkgc2VuZGVyICovCisJaW50CXdkX3JlY3Z0aW1lOwkJLyogdGltZSBzdGFtcCBhcHBsaWVkIGJ5IHJlY2VpdmVyICovCisJY2hhcgl3ZF9ob3N0bmFtZVszMl07CS8qIGhvc3RzJ3MgbmFtZSAqLworCWludAl3ZF9sb2FkYXZbM107CQkvKiBsb2FkIGF2ZXJhZ2UgYXMgaW4gdXB0aW1lICovCisJaW50CXdkX2Jvb3R0aW1lOwkJLyogdGltZSBzeXN0ZW0gYm9vdGVkICovCisJc3RydWN0CXdob2VudCB7CisJCXN0cnVjdAlvdXRtcCB3ZV91dG1wOwkvKiBhY3RpdmUgdHR5IGluZm8gKi8KKwkJaW50CXdlX2lkbGU7CS8qIHR0eSBpZGxlIHRpbWUgKi8KKwl9IHdkX3dlWzEwMjQgLyBzaXplb2YgKHN0cnVjdCB3aG9lbnQpXTsKK307CisKKyNkZWZpbmUJV0hPRFZFUlNJT04JMQorI2RlZmluZQlXSE9EVFlQRV9TVEFUVVMJMQkJLyogaG9zdCBzdGF0dXMgKi8KKworLyogV2UgdXNlZCB0byBkZWZpbmUgX1BBVEhfUldIT0RJUiBoZXJlIGJ1dCBpdCdzIG5vdyBpbiA8cGF0aHMuaD4uICAqLworI2luY2x1ZGUgPHBhdGhzLmg+CisKKyNlbmRpZiAvKiBwcm90b2NvbHMvcndob2QuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wcm90b2NvbHMvdGFsa2QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RhbGtkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmMzNiMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RhbGtkLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGFsa2QuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9QUk9UT0NPTFNfVEFMS0RfSAorI2RlZmluZQlfUFJPVE9DT0xTX1RBTEtEX0ggMQorCisvKgorICogVGhpcyBkZXNjcmliZXMgdGhlIHByb3RvY29sIHVzZWQgYnkgdGhlIHRhbGsgc2VydmVyIGFuZCBjbGllbnRzLgorICoKKyAqIFRoZSB0YWxrIHNlcnZlciBhY3RzIGEgcmVwb3NpdG9yeSBvZiBpbnZpdGF0aW9ucywgcmVzcG9uZGluZyB0bworICogcmVxdWVzdHMgYnkgY2xpZW50cyB3aXNoaW5nIHRvIHJlbmRlenZvdXMgZm9yIHRoZSBwdXJwb3NlIG9mCisgKiBob2xkaW5nIGEgY29udmVyc2F0aW9uLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgYSBjbGllbnQsIHRoZSBjYWxsZXIsCisgKiBpbml0aWF0ZXMgYSByZW5kZXp2b3VzIGJ5IHNlbmRpbmcgYSBDVExfTVNHIHRvIHRoZSBzZXJ2ZXIgb2YKKyAqIHR5cGUgTE9PS19VUC4gIFRoaXMgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gc2VhcmNoIGl0cyBpbnZpdGF0aW9uCisgKiB0YWJsZXMgdG8gY2hlY2sgaWYgYW4gaW52aXRhdGlvbiBjdXJyZW50bHkgZXhpc3RzIGZvciB0aGUgY2FsbGVyCisgKiAodG8gc3BlYWsgdG8gdGhlIGNhbGxlZSBzcGVjaWZpZWQgaW4gdGhlIG1lc3NhZ2UpLiAgSWYgdGhlIGxvb2t1cAorICogZmFpbHMsIHRoZSBjYWxsZXIgdGhlbiBzZW5kcyBhbiBBTk5PVU5DRSBtZXNzYWdlIGNhdXNpbmcgdGhlIHNlcnZlcgorICogdG8gYnJvYWRjYXN0IGFuIGFubm91bmNlbWVudCBvbiB0aGUgY2FsbGVlJ3MgbG9naW4gcG9ydHMgcmVxdWVzdGluZworICogY29udGFjdC4gIFdoZW4gdGhlIGNhbGxlZSByZXNwb25kcywgdGhlIGxvY2FsIHNlcnZlciB1c2VzIHRoZQorICogcmVjb3JkZWQgaW52aXRhdGlvbiB0byByZXNwb25kIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJlbmRlenZvdXMKKyAqIGFkZHJlc3MgYW5kIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBjbGllbnQgcHJvZ3JhbXMgZXN0YWJsaXNoIGEKKyAqIHN0cmVhbSBjb25uZWN0aW9uIHRocm91Z2ggd2hpY2ggdGhlIGNvbnZlcnNhdGlvbiB0YWtlcyBwbGFjZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisvKgorICogQ2xpZW50LT5zZXJ2ZXIgcmVxdWVzdCBtZXNzYWdlIGZvcm1hdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVfY2hhcgl2ZXJzOwkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCXVfY2hhcgl0eXBlOwkJLyogcmVxdWVzdCB0eXBlLCBzZWUgYmVsb3cgKi8KKwl1X2NoYXIJYW5zd2VyOwkJLyogbm90IHVzZWQgKi8KKwl1X2NoYXIJcGFkOworCXVfaW50MzJfdCBpZF9udW07CS8qIG1lc3NhZ2UgaWQgKi8KKwlzdHJ1Y3QJb3NvY2thZGRyIGFkZHI7CQkvKiBvbGQgKDQuMykgc3R5bGUgKi8KKwlzdHJ1Y3QJb3NvY2thZGRyIGN0bF9hZGRyOwkvKiBvbGQgKDQuMykgc3R5bGUgKi8KKwlpbnQzMl90CXBpZDsJCS8qIGNhbGxlcidzIHByb2Nlc3MgaWQgKi8KKyNkZWZpbmUJTkFNRV9TSVpFCTEyCisJY2hhcglsX25hbWVbTkFNRV9TSVpFXTsvKiBjYWxsZXIncyBuYW1lICovCisJY2hhcglyX25hbWVbTkFNRV9TSVpFXTsvKiBjYWxsZWUncyBuYW1lICovCisjZGVmaW5lCVRUWV9TSVpFCTE2CisJY2hhcglyX3R0eVtUVFlfU0laRV07LyogY2FsbGVlJ3MgdHR5IG5hbWUgKi8KK30gQ1RMX01TRzsKKworLyoKKyAqIFNlcnZlci0+Y2xpZW50IHJlc3BvbnNlIG1lc3NhZ2UgZm9ybWF0LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdV9jaGFyCXZlcnM7CQkvKiBwcm90b2NvbCB2ZXJzaW9uICovCisJdV9jaGFyCXR5cGU7CQkvKiB0eXBlIG9mIHJlcXVlc3QgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCWFuc3dlcjsJCS8qIHJlc3BvbnNlIHRvIHJlcXVlc3QgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCXBhZDsKKwl1X2ludDMyX3QgaWRfbnVtOwkvKiBtZXNzYWdlIGlkICovCisJc3RydWN0CW9zb2NrYWRkciBhZGRyOwkvKiBhZGRyZXNzIGZvciBlc3RhYmxpc2hpbmcgY29udmVyc2F0aW9uICovCit9IENUTF9SRVNQT05TRTsKKworI2RlZmluZQlUQUxLX1ZFUlNJT04JMQkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCisvKiBtZXNzYWdlIHR5cGUgdmFsdWVzICovCisjZGVmaW5lIExFQVZFX0lOVklURQkwCS8qIGxlYXZlIGludml0YXRpb24gd2l0aCBzZXJ2ZXIgKi8KKyNkZWZpbmUgTE9PS19VUAkJMQkvKiBjaGVjayBmb3IgaW52aXRhdGlvbiBieSBjYWxsZWUgKi8KKyNkZWZpbmUgREVMRVRFCQkyCS8qIGRlbGV0ZSBpbnZpdGF0aW9uIGJ5IGNhbGxlciAqLworI2RlZmluZSBBTk5PVU5DRQkzCS8qIGFubm91bmNlIGludml0YXRpb24gYnkgY2FsbGVyICovCisKKy8qIGFuc3dlciB2YWx1ZXMgKi8KKyNkZWZpbmUgU1VDQ0VTUwkJMAkvKiBvcGVyYXRpb24gY29tcGxldGVkIHByb3Blcmx5ICovCisjZGVmaW5lIE5PVF9IRVJFCTEJLyogY2FsbGVlIG5vdCBsb2dnZWQgaW4gKi8KKyNkZWZpbmUgRkFJTEVECQkyCS8qIG9wZXJhdGlvbiBmYWlsZWQgZm9yIHVuZXhwbGFpbmVkIHJlYXNvbiAqLworI2RlZmluZSBNQUNISU5FX1VOS05PV04JMwkvKiBjYWxsZXIncyBtYWNoaW5lIG5hbWUgdW5rbm93biAqLworI2RlZmluZSBQRVJNSVNTSU9OX0RFTklFRCA0CS8qIGNhbGxlZSdzIHR0eSBkb2Vzbid0IHBlcm1pdCBhbm5vdW5jZSAqLworI2RlZmluZSBVTktOT1dOX1JFUVVFU1QJNQkvKiByZXF1ZXN0IGhhcyBpbnZhbGlkIHR5cGUgdmFsdWUgKi8KKyNkZWZpbmUJQkFEVkVSU0lPTgk2CS8qIHJlcXVlc3QgaGFzIGludmFsaWQgcHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZQlCQURBRERSCQk3CS8qIHJlcXVlc3QgaGFzIGludmFsaWQgYWRkciB2YWx1ZSAqLworI2RlZmluZQlCQURDVExBRERSCTgJLyogcmVxdWVzdCBoYXMgaW52YWxpZCBjdGxfYWRkciB2YWx1ZSAqLworCisvKgorICogT3BlcmF0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworI2RlZmluZSBNQVhfTElGRQk2MAkvKiBtYXggdGltZSBkYWVtb24gc2F2ZXMgaW52aXRhdGlvbnMgKi8KKy8qIFJJTkdfV0FJVCBzaG91bGQgYmUgMTAncyBvZiBzZWNvbmRzIGxlc3MgdGhhbiBNQVhfTElGRSAqLworI2RlZmluZSBSSU5HX1dBSVQJMzAJLyogdGltZSB0byB3YWl0IGJlZm9yZSByZXNlbmRpbmcgaW52aXRhdGlvbiAqLworCisjZW5kaWYgLyogcHJvdG9jb2xzL3RhbGtkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3RpbWVkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90aW1lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDViZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Byb3RvY29scy90aW1lZC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGltZWQuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmCV9QUk9UT0NPTFNfVElNRURfSAorI2RlZmluZQlfUFJPVE9DT0xTX1RJTUVEX0ggMQorCisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisKKy8qCisgKiBUaW1lIFN5bmNocm9uaXphdGlvbiBQcm90b2NvbAorICovCisKKyNkZWZpbmUJVFNQVkVSU0lPTgkxCisjZGVmaW5lIEFOWUFERFIgCU5VTEwKKworc3RydWN0IHRzcCB7CisJdV9jaGFyCXRzcF90eXBlOworCXVfY2hhcgl0c3BfdmVyczsKKwl1X3Nob3J0CXRzcF9zZXE7CisJdW5pb24geworCQlzdHJ1Y3QgdGltZXZhbCB0c3B1X3RpbWU7CisJCWNoYXIgdHNwdV9ob3BjbnQ7CisJfSB0c3BfdTsKKwljaGFyIHRzcF9uYW1lW01BWEhPU1ROQU1FTEVOXTsKK307CisKKyNkZWZpbmUJdHNwX3RpbWUJdHNwX3UudHNwdV90aW1lCisjZGVmaW5lCXRzcF9ob3BjbnQJdHNwX3UudHNwdV9ob3BjbnQKKworLyoKKyAqIENvbW1hbmQgdHlwZXMuCisgKi8KKyNkZWZpbmUJVFNQX0FOWQkJCTAJLyogbWF0Y2ggYW55IHR5cGVzICovCisjZGVmaW5lCVRTUF9BREpUSU1FCQkxCS8qIHNlbmQgYWRqdGltZSAqLworI2RlZmluZQlUU1BfQUNLCQkJMgkvKiBnZW5lcmljIGFja25vd2xlZGdlbWVudCAqLworI2RlZmluZQlUU1BfTUFTVEVSUkVRCQkzCS8qIGFzayBmb3IgbWFzdGVyJ3MgbmFtZSAqLworI2RlZmluZQlUU1BfTUFTVEVSQUNLCQk0CS8qIGFja25vd2xlZGdlIG1hc3RlciByZXF1ZXN0ICovCisjZGVmaW5lCVRTUF9TRVRUSU1FCQk1CS8qIHNlbmQgbmV0d29yayB0aW1lICovCisjZGVmaW5lCVRTUF9NQVNURVJVUAkJNgkvKiBpbmZvcm0gc2xhdmVzIHRoYXQgbWFzdGVyIGlzIHVwICovCisjZGVmaW5lCVRTUF9TTEFWRVVQCQk3CS8qIHNsYXZlIGlzIHVwIGJ1dCBub3QgcG9sbGVkICovCisjZGVmaW5lCVRTUF9FTEVDVElPTgkJOAkvKiBhZHZhbmNlIGNhbmRpZGF0dXJlIGZvciBtYXN0ZXIgKi8KKyNkZWZpbmUJVFNQX0FDQ0VQVAkJOQkvKiBzdXBwb3J0IGNhbmRpZGF0dXJlIG9mIG1hc3RlciAqLworI2RlZmluZQlUU1BfUkVGVVNFCQkxMAkvKiByZWplY3QgY2FuZGlkYXR1cmUgb2YgbWFzdGVyICovCisjZGVmaW5lCVRTUF9DT05GTElDVAkJMTEJLyogdHdvIG9yIG1vcmUgbWFzdGVycyBwcmVzZW50ICovCisjZGVmaW5lCVRTUF9SRVNPTFZFCQkxMgkvKiBtYXN0ZXJzJyBjb25mbGljdCByZXNvbHV0aW9uICovCisjZGVmaW5lCVRTUF9RVUlUCQkxMwkvKiByZWplY3QgY2FuZGlkYXR1cmUgaWYgbWFzdGVyIGlzIHVwICovCisjZGVmaW5lCVRTUF9EQVRFCQkxNAkvKiByZXNldCB0aGUgdGltZSAoZGF0ZSBjb21tYW5kKSAqLworI2RlZmluZQlUU1BfREFURVJFUQkJMTUJLyogcmVtb3RlIHJlcXVlc3QgdG8gcmVzZXQgdGhlIHRpbWUgKi8KKyNkZWZpbmUJVFNQX0RBVEVBQ0sJCTE2CS8qIGFja25vd2xlZGdlIHRpbWUgc2V0dGluZyAgKi8KKyNkZWZpbmUJVFNQX1RSQUNFT04JCTE3CS8qIHR1cm4gdHJhY2luZyBvbiAqLworI2RlZmluZQlUU1BfVFJBQ0VPRkYJCTE4CS8qIHR1cm4gdHJhY2luZyBvZmYgKi8KKyNkZWZpbmUJVFNQX01TSVRFCQkxOQkvKiBmaW5kIG91dCBtYXN0ZXIncyBzaXRlICovCisjZGVmaW5lCVRTUF9NU0lURVJFUQkJMjAJLyogcmVtb3RlIG1hc3RlcidzIHNpdGUgcmVxdWVzdCAqLworI2RlZmluZQlUU1BfVEVTVAkJMjEJLyogZm9yIHRlc3RpbmcgZWxlY3Rpb24gYWxnbyAqLworI2RlZmluZQlUU1BfU0VUREFURQkJMjIJLyogTmV3IGZyb20gZGF0ZSBjb21tYW5kICovCisjZGVmaW5lCVRTUF9TRVREQVRFUkVRCQkyMwkvKiBOZXcgcmVtb3RlIGZvciBhYm92ZSAqLworI2RlZmluZQlUU1BfTE9PUAkJMjQJLyogbG9vcCBkZXRlY3Rpb24gcGFja2V0ICovCisKKyNkZWZpbmUJVFNQVFlQRU5VTUJFUgkJMjUKKworI2lmZGVmIFRTUFRZUEVTCitjaGFyICp0c3B0eXBlW1RTUFRZUEVOVU1CRVJdID0KKyAgeyAiQU5ZIiwgIkFESlRJTUUiLCAiQUNLIiwgIk1BU1RFUlJFUSIsICJNQVNURVJBQ0siLCAiU0VUVElNRSIsICJNQVNURVJVUCIsCisgICJTTEFWRVVQIiwgIkVMRUNUSU9OIiwgIkFDQ0VQVCIsICJSRUZVU0UiLCAiQ09ORkxJQ1QiLCAiUkVTT0xWRSIsICJRVUlUIiwKKyAgIkRBVEUiLCAiREFURVJFUSIsICJEQVRFQUNLIiwgIlRSQUNFT04iLCAiVFJBQ0VPRkYiLCAiTVNJVEUiLCAiTVNJVEVSRVEiLAorICAiVEVTVCIsICJTRVREQVRFIiwgIlNFVERBVEVSRVEiLCAiTE9PUCIgfTsKKyNlbmRpZgorCisjZW5kaWYgLyogcHJvdG9jb2xzL3RpbWVkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHRocmVhZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NWYzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHRocmVhZC5oCkBAIC0wLDAgKzEsMTExOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFRIUkVBRF9ICisjZGVmaW5lIF9QVEhSRUFEX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2RlZmluZSBfX25lZWRfc2lnc2V0X3QKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxiaXRzL3B0aHJlYWR0eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc2V0am1wLmg+CisjaW5jbHVkZSA8Yml0cy93b3Jkc2l6ZS5oPgorCisKKy8qIERldGFjaCBzdGF0ZS4gICovCitlbnVtCit7CisgIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFLAorI2RlZmluZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRQlQVEhSRUFEX0NSRUFURV9KT0lOQUJMRQorICBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRAorI2RlZmluZSBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRAlQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRAorfTsKKworCisvKiBNdXRleCB0eXBlcy4gICovCitlbnVtCit7CisgIFBUSFJFQURfTVVURVhfVElNRURfTlAsCisgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLAorICBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0tfTlAsCisgIFBUSFJFQURfTVVURVhfQURBUFRJVkVfTlAKKyNpZmRlZiBfX1VTRV9VTklYOTgKKyAgLAorICBQVEhSRUFEX01VVEVYX05PUk1BTCA9IFBUSFJFQURfTVVURVhfVElNRURfTlAsCisgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsCisgIFBUSFJFQURfTVVURVhfRVJST1JDSEVDSyA9IFBUSFJFQURfTVVURVhfRVJST1JDSEVDS19OUCwKKyAgUFRIUkVBRF9NVVRFWF9ERUZBVUxUID0gUFRIUkVBRF9NVVRFWF9OT1JNQUwKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0dOVQorICAvKiBGb3IgY29tcGF0aWJpbGl0eS4gICovCisgICwgUFRIUkVBRF9NVVRFWF9GQVNUX05QID0gUFRIUkVBRF9NVVRFWF9USU1FRF9OUAorI2VuZGlmCit9OworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJvYnVzdCBtdXRleCBvciBub3QgZmxhZ3MuICAqLworZW51bQoreworICBQVEhSRUFEX01VVEVYX1NUQUxMRURfTlAsCisgIFBUSFJFQURfTVVURVhfUk9CVVNUX05QCit9OworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogTXV0ZXggcHJvdG9jb2xzLiAgKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9QUklPX05PTkUsCisgIFBUSFJFQURfUFJJT19JTkhFUklULAorICBQVEhSRUFEX1BSSU9fUFJPVEVDVAorfTsKKyNlbmRpZgorCisKKy8qIE11dGV4IGluaXRpYWxpemVycy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBkZWZpbmUgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDAgfSB9IH0KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsIDAsIHsgMCwgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0tfTlAsIDAsIHsgMCwgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCwgMCwgeyAwLCAwIH0gfSB9CisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCB7IDAgfSB9IH0KKyMgaWZkZWYgX19VU0VfR05VCisjICBkZWZpbmUgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsIDAsIHsgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0tfTlAsIDAsIHsgMCB9IH0gfQorIyAgZGVmaW5lIFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgUFRIUkVBRF9NVVRFWF9BREFQVElWRV9OUCwgMCwgeyAwIH0gfSB9CisjIGVuZGlmCisjZW5kaWYKKworCisvKiBSZWFkLXdyaXRlIGxvY2sgdHlwZXMuICAqLworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4IHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworZW51bQoreworICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfUkVBREVSX05QLAorICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05QLAorICBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCwKKyAgUFRIUkVBRF9SV0xPQ0tfREVGQVVMVF9OUCA9IFBUSFJFQURfUldMT0NLX1BSRUZFUl9SRUFERVJfTlAKK307CisKKy8qIFJlYWQtd3JpdGUgbG9jayBpbml0aWFsaXplcnMuICAqLworIyBkZWZpbmUgUFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVIgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9IH0KKyMgaWZkZWYgX19VU0VfR05VCisjICBpZiBfX1dPUkRTSVpFID09IDY0CisjICAgZGVmaW5lIFBUSFJFQURfUldMT0NLX1dSSVRFUl9OT05SRUNVUlNJVkVfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJCQkJCSAgICAgIFwKKyAgICAgIFBUSFJFQURfUldMT0NLX1BSRUZFUl9XUklURVJfTk9OUkVDVVJTSVZFX05QIH0gfQorIyAgZWxzZQorIyAgIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgICAgZGVmaW5lIFBUSFJFQURfUldMT0NLX1dSSVRFUl9OT05SRUNVUlNJVkVfSU5JVElBTElaRVJfTlAgXAorICB7IHsgMCwgMCwgMCwgMCwgMCwgMCwgUFRIUkVBRF9SV0xPQ0tfUFJFRkVSX1dSSVRFUl9OT05SRUNVUlNJVkVfTlAsIFwKKyAgICAgIDAsIDAsIDAsIDAgfSB9CisjICAgZWxzZQorIyAgICBkZWZpbmUgUFRIUkVBRF9SV0xPQ0tfV1JJVEVSX05PTlJFQ1VSU0lWRV9JTklUSUFMSVpFUl9OUCBcCisgIHsgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBQVEhSRUFEX1JXTE9DS19QUkVGRVJfV1JJVEVSX05PTlJFQ1VSU0lWRV9OUCxcCisgICAgICAwIH0gfQorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmICAvKiBVbml4OTggb3IgWE9wZW4ySyAqLworCisKKy8qIFNjaGVkdWxlciBpbmhlcml0YW5jZS4gICovCitlbnVtCit7CisgIFBUSFJFQURfSU5IRVJJVF9TQ0hFRCwKKyNkZWZpbmUgUFRIUkVBRF9JTkhFUklUX1NDSEVEICAgUFRIUkVBRF9JTkhFUklUX1NDSEVECisgIFBUSFJFQURfRVhQTElDSVRfU0NIRUQKKyNkZWZpbmUgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRCAgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRAorfTsKKworCisvKiBTY29wZSBoYW5kbGluZy4gICovCitlbnVtCit7CisgIFBUSFJFQURfU0NPUEVfU1lTVEVNLAorI2RlZmluZSBQVEhSRUFEX1NDT1BFX1NZU1RFTSAgICBQVEhSRUFEX1NDT1BFX1NZU1RFTQorICBQVEhSRUFEX1NDT1BFX1BST0NFU1MKKyNkZWZpbmUgUFRIUkVBRF9TQ09QRV9QUk9DRVNTICAgUFRIUkVBRF9TQ09QRV9QUk9DRVNTCit9OworCisKKy8qIFByb2Nlc3Mgc2hhcmVkIG9yIHByaXZhdGUgZmxhZy4gICovCitlbnVtCit7CisgIFBUSFJFQURfUFJPQ0VTU19QUklWQVRFLAorI2RlZmluZSBQVEhSRUFEX1BST0NFU1NfUFJJVkFURSBQVEhSRUFEX1BST0NFU1NfUFJJVkFURQorICBQVEhSRUFEX1BST0NFU1NfU0hBUkVECisjZGVmaW5lIFBUSFJFQURfUFJPQ0VTU19TSEFSRUQgIFBUSFJFQURfUFJPQ0VTU19TSEFSRUQKK307CisKKworCisvKiBDb25kaXRpb25hbCB2YXJpYWJsZSBoYW5kbGluZy4gICovCisjZGVmaW5lIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiB7IHsgMCwgMCwgMCwgMCwgMCwgKHZvaWQgKikgMCwgMCwgMCB9IH0KKworCisvKiBDbGVhbnVwIGJ1ZmZlcnMgKi8KK3N0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlcgoreworICB2b2lkICgqX19yb3V0aW5lKSAodm9pZCAqKTsgICAgICAgICAgICAgLyogRnVuY3Rpb24gdG8gY2FsbC4gICovCisgIHZvaWQgKl9fYXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdHMgYXJndW1lbnQuICAqLworICBpbnQgX19jYW5jZWx0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgY2FuY2VsbGF0aW9uIHR5cGUuICovCisgIHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19wcmV2OyAvKiBDaGFpbmluZyBvZiBjbGVhbnVwIGZ1bmN0aW9ucy4gICovCit9OworCisvKiBDYW5jZWxsYXRpb24gKi8KK2VudW0KK3sKKyAgUFRIUkVBRF9DQU5DRUxfRU5BQkxFLAorI2RlZmluZSBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgICBQVEhSRUFEX0NBTkNFTF9FTkFCTEUKKyAgUFRIUkVBRF9DQU5DRUxfRElTQUJMRQorI2RlZmluZSBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFICBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFCit9OworZW51bQoreworICBQVEhSRUFEX0NBTkNFTF9ERUZFUlJFRCwKKyNkZWZpbmUgUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQJUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQKKyAgUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTCisjZGVmaW5lIFBUSFJFQURfQ0FOQ0VMX0FTWU5DSFJPTk9VUwlQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVMKK307CisjZGVmaW5lIFBUSFJFQURfQ0FOQ0VMRUQgKCh2b2lkICopIC0xKQorCisKKy8qIFNpbmdsZSBleGVjdXRpb24gaGFuZGxpbmcuICAqLworI2RlZmluZSBQVEhSRUFEX09OQ0VfSU5JVCAwCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFZhbHVlIHJldHVybmVkIGJ5ICdwdGhyZWFkX2JhcnJpZXJfd2FpdCcgZm9yIG9uZSBvZiB0aGUgdGhyZWFkcyBhZnRlcgorICAgdGhlIHJlcXVpcmVkIG51bWJlciBvZiB0aHJlYWRzIGhhdmUgY2FsbGVkIHRoaXMgZnVuY3Rpb24uCisgICAtMSBpcyBkaXN0aW5jdCBmcm9tIDAgYW5kIGFsbCBlcnJubyBjb25zdGFudHMgKi8KKyMgZGVmaW5lIFBUSFJFQURfQkFSUklFUl9TRVJJQUxfVEhSRUFEIC0xCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBhIG5ldyB0aHJlYWQsIHN0YXJ0aW5nIHdpdGggZXhlY3V0aW9uIG9mIFNUQVJULVJPVVRJTkUKKyAgIGdldHRpbmcgcGFzc2VkIEFSRy4gIENyZWF0aW9uIGF0dHJpYnV0ZWQgY29tZSBmcm9tIEFUVFIuICBUaGUgbmV3CisgICBoYW5kbGUgaXMgc3RvcmVkIGluICpORVdUSFJFQUQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NyZWF0ZSAocHRocmVhZF90ICpfX3Jlc3RyaWN0IF9fbmV3dGhyZWFkLAorCQkJICAgX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdCBfX2F0dHIsCisJCQkgICB2b2lkICooKl9fc3RhcnRfcm91dGluZSkgKHZvaWQgKiksCisJCQkgICB2b2lkICpfX3Jlc3RyaWN0IF9fYXJnKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworLyogVGVybWluYXRlIGNhbGxpbmcgdGhyZWFkLgorCisgICBUaGUgcmVnaXN0ZXJlZCBjbGVhbnVwIGhhbmRsZXJzIGFyZSBjYWxsZWQgdmlhIGV4Y2VwdGlvbiBoYW5kbGluZworICAgc28gd2UgY2Fubm90IG1hcmsgdGhpcyBmdW5jdGlvbiB3aXRoIF9fVEhST1cuKi8KK2V4dGVybiB2b2lkIHB0aHJlYWRfZXhpdCAodm9pZCAqX19yZXR2YWwpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworLyogTWFrZSBjYWxsaW5nIHRocmVhZCB3YWl0IGZvciB0ZXJtaW5hdGlvbiBvZiB0aGUgdGhyZWFkIFRILiAgVGhlCisgICBleGl0IHN0YXR1cyBvZiB0aGUgdGhyZWFkIGlzIHN0b3JlZCBpbiAqVEhSRUFEX1JFVFVSTiwgaWYgVEhSRUFEX1JFVFVSTgorICAgaXMgbm90IE5VTEwuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2pvaW4gKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKTsKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQ2hlY2sgd2hldGhlciB0aHJlYWQgVEggaGFzIHRlcm1pbmF0ZWQuICBJZiB5ZXMgcmV0dXJuIHRoZSBzdGF0dXMgb2YKKyAgIHRoZSB0aHJlYWQgaW4gKlRIUkVBRF9SRVRVUk4sIGlmIFRIUkVBRF9SRVRVUk4gaXMgbm90IE5VTEwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3RyeWpvaW5fbnAgKHB0aHJlYWRfdCBfX3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKSBfX1RIUk9XOworCisvKiBNYWtlIGNhbGxpbmcgdGhyZWFkIHdhaXQgZm9yIHRlcm1pbmF0aW9uIG9mIHRoZSB0aHJlYWQgVEgsIGJ1dCBvbmx5CisgICB1bnRpbCBUSU1FT1VULiAgVGhlIGV4aXQgc3RhdHVzIG9mIHRoZSB0aHJlYWQgaXMgc3RvcmVkIGluCisgICAqVEhSRUFEX1JFVFVSTiwgaWYgVEhSRUFEX1JFVFVSTiBpcyBub3QgTlVMTC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfdGltZWRqb2luX25wIChwdGhyZWFkX3QgX190aCwgdm9pZCAqKl9fdGhyZWFkX3JldHVybiwKKwkJCQkgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fYWJzdGltZSk7CisjZW5kaWYKKworLyogSW5kaWNhdGUgdGhhdCB0aGUgdGhyZWFkIFRIIGlzIG5ldmVyIHRvIGJlIGpvaW5lZCB3aXRoIFBUSFJFQURfSk9JTi4KKyAgIFRoZSByZXNvdXJjZXMgb2YgVEggd2lsbCB0aGVyZWZvcmUgYmUgZnJlZWQgaW1tZWRpYXRlbHkgd2hlbiBpdAorICAgdGVybWluYXRlcywgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBhbm90aGVyIHRocmVhZCB0byBwZXJmb3JtIFBUSFJFQURfSk9JTgorICAgb24gaXQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2RldGFjaCAocHRocmVhZF90IF9fdGgpIF9fVEhST1c7CisKKworLyogT2J0YWluIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitleHRlcm4gcHRocmVhZF90IHB0aHJlYWRfc2VsZiAodm9pZCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIENvbXBhcmUgdHdvIHRocmVhZCBpZGVudGlmaWVycy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZXF1YWwgKHB0aHJlYWRfdCBfX3RocmVhZDEsIHB0aHJlYWRfdCBfX3RocmVhZDIpIF9fVEhST1c7CisKKworLyogVGhyZWFkIGF0dHJpYnV0ZSBoYW5kbGluZy4gICovCisKKy8qIEluaXRpYWxpemUgdGhyZWFkIGF0dHJpYnV0ZSAqQVRUUiB3aXRoIGRlZmF1bHQgYXR0cmlidXRlcworICAgKGRldGFjaHN0YXRlIGlzIFBUSFJFQURfSk9JTkFCTEUsIHNjaGVkdWxpbmcgcG9saWN5IGlzIFNDSEVEX09USEVSLAorICAgIG5vIHVzZXItcHJvdmlkZWQgc3RhY2spLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2luaXQgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IHRocmVhZCBhdHRyaWJ1dGUgKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZGVzdHJveSAocHRocmVhZF9hdHRyX3QgKl9fYXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEdldCBkZXRhY2ggc3RhdGUgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGRldGFjaHN0YXRlIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCWludCAqX19kZXRhY2hzdGF0ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCBkZXRhY2ggc3RhdGUgYXR0cmlidXRlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlIChwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCQlpbnQgX19kZXRhY2hzdGF0ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogR2V0IHRoZSBzaXplIG9mIHRoZSBndWFyZCBhcmVhIGNyZWF0ZWQgZm9yIHN0YWNrIG92ZXJmbG93IHByb3RlY3Rpb24uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0Z3VhcmRzaXplIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJICAgICAgc2l6ZV90ICpfX2d1YXJkc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgZ3VhcmQgYXJlYSBjcmVhdGVkIGZvciBzdGFjayBvdmVyZmxvdyBwcm90ZWN0aW9uLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldGd1YXJkc2l6ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICBzaXplX3QgX19ndWFyZHNpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFJldHVybiBpbiAqUEFSQU0gdGhlIHNjaGVkdWxpbmcgcGFyYW1ldGVycyBvZiAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJICAgICAgIF9fYXR0ciwKKwkJCQkgICAgICAgc3RydWN0IHNjaGVkX3BhcmFtICpfX3Jlc3RyaWN0IF9fcGFyYW0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIChwcmlvcml0eSwgZXRjKSBpbiAqQVRUUiBhY2NvcmRpbmcgdG8gUEFSQU0uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSAocHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19yZXN0cmljdAorCQkJCSAgICAgICBfX3BhcmFtKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogUmV0dXJuIGluICpQT0xJQ1kgdGhlIHNjaGVkdWxpbmcgcG9saWN5IG9mICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldHNjaGVkcG9saWN5IChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJCV9fYXR0ciwgaW50ICpfX3Jlc3RyaWN0IF9fcG9saWN5KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHNjaGVkdWxpbmcgcG9saWN5IGluICpBVFRSIGFjY29yZGluZyB0byBQT0xJQ1kuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCBfX3BvbGljeSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBpbiAqSU5IRVJJVCB0aGUgc2NoZWR1bGluZyBpbmhlcml0YW5jZSBtb2RlIG9mICpBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19yZXN0cmljdAorCQkJCQkgX19hdHRyLCBpbnQgKl9fcmVzdHJpY3QgX19pbmhlcml0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHNjaGVkdWxpbmcgaW5oZXJpdGFuY2UgbW9kZSBpbiAqQVRUUiBhY2NvcmRpbmcgdG8gSU5IRVJJVC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCSBpbnQgX19pbmhlcml0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBSZXR1cm4gaW4gKlNDT1BFIHRoZSBzY2hlZHVsaW5nIGNvbnRlbnRpb24gc2NvcGUgb2YgKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NvcGUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgaW50ICpfX3Jlc3RyaWN0IF9fc2NvcGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgc2NoZWR1bGluZyBjb250ZW50aW9uIHNjb3BlIGluICpBVFRSIGFjY29yZGluZyB0byBTQ09QRS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY29wZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgaW50IF9fc2NvcGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gdGhlIHByZXZpb3VzbHkgc2V0IGFkZHJlc3MgZm9yIHRoZSBzdGFjay4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzdGFja2FkZHIgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICBfX2F0dHIsIHZvaWQgKipfX3Jlc3RyaWN0IF9fc3RhY2thZGRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKy8qIFNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgc3RhY2sgb2YgdGhlIHRocmVhZCB0byBiZSBjcmVhdGVkLgorICAgRGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHN0YWNrIGdyb3dzIHVwIG9yIGRvd24gdGhlIHZhbHVlIG11c3QgZWl0aGVyCisgICBiZSBoaWdoZXIgb3IgbG93ZXIgdGhhbiBhbGwgdGhlIGFkZHJlc3MgaW4gdGhlIG1lbW9yeSBibG9jay4gIFRoZQorICAgbWluaW1hbCBzaXplIG9mIHRoZSBibG9jayBtdXN0IGJlIFBUSFJFQURfU1RBQ0tfTUlOLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrYWRkciAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICB2b2lkICpfX3N0YWNrYWRkcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnRseSB1c2VkIG1pbmltYWwgc3RhY2sgc2l6ZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICBfX2F0dHIsIHNpemVfdCAqX19yZXN0cmljdCBfX3N0YWNrc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEFkZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWluaW11bSBzdGFjayBzaXplIG5lZWRlZCBmb3IgdGhlIHRocmVhZAorICAgdG8gYmUgc3RhcnRlZC4gIFRoaXMgc2l6ZSBtdXN0IG5ldmVyIGJlIGxlc3MgdGhhbiBQVEhSRUFEX1NUQUNLX01JTgorICAgYW5kIG11c3QgYWxzbyBub3QgZXhjZWVkIHRoZSBzeXN0ZW0gbGltaXRzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICBzaXplX3QgX19zdGFja3NpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogUmV0dXJuIHRoZSBwcmV2aW91c2x5IHNldCBhZGRyZXNzIGZvciB0aGUgc3RhY2suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c3RhY2sgKF9fY29uc3QgcHRocmVhZF9hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCSAgdm9pZCAqKl9fcmVzdHJpY3QgX19zdGFja2FkZHIsCisJCQkJICBzaXplX3QgKl9fcmVzdHJpY3QgX19zdGFja3NpemUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMiwgMykpOworCisvKiBUaGUgZm9sbG93aW5nIHR3byBpbnRlcmZhY2VzIGFyZSBpbnRlbmRlZCB0byByZXBsYWNlIHRoZSBsYXN0IHR3by4gIFRoZXkKKyAgIHJlcXVpcmUgc2V0dGluZyB0aGUgYWRkcmVzcyBhcyB3ZWxsIGFzIHRoZSBzaXplIHNpbmNlIG9ubHkgc2V0dGluZyB0aGUKKyAgIGFkZHJlc3Mgd2lsbCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBvbiBzb21lIGFyY2hpdGVjdHVyZXMgaW1wb3NzaWJsZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzdGFjayAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwgdm9pZCAqX19zdGFja2FkZHIsCisJCQkJICBzaXplX3QgX19zdGFja3NpemUpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRocmVhZCBjcmVhdGVkIHdpdGggYXR0cmlidXRlIEFUVFIgd2lsbCBiZSBsaW1pdGVkIHRvIHJ1biBvbmx5IG9uCisgICB0aGUgcHJvY2Vzc29ycyByZXByZXNlbnRlZCBpbiBDUFVTRVQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfc2V0YWZmaW5pdHlfbnAgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCisJCQkJCXNpemVfdCBfX2NwdXNldHNpemUsCisJCQkJCV9fY29uc3QgY3B1X3NldF90ICpfX2NwdXNldCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSk7CisKKy8qIEdldCBiaXQgc2V0IGluIENQVVNFVCByZXByZXNlbnRpbmcgdGhlIHByb2Nlc3NvcnMgdGhyZWFkcyBjcmVhdGVkIHdpdGgKKyAgIEFUVFIgY2FuIHJ1biBvbi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9nZXRhZmZpbml0eV9ucCAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyLAorCQkJCQlzaXplX3QgX19jcHVzZXRzaXplLAorCQkJCQljcHVfc2V0X3QgKl9fY3B1c2V0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKworCisvKiBJbml0aWFsaXplIHRocmVhZCBhdHRyaWJ1dGUgKkFUVFIgd2l0aCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBhbHJlYWR5IHJ1bm5pbmcgdGhyZWFkIFRILiAgSXQgc2hhbGwgYmUgY2FsbGVkIG9uIHVuaXRpYWxpemVkIEFUVFIKKyAgIGFuZCBkZXN0cm95ZWQgd2l0aCBwdGhyZWFkX2F0dHJfZGVzdHJveSB3aGVuIG5vIGxvbmdlciBuZWVkZWQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2dldGF0dHJfbnAgKHB0aHJlYWRfdCBfX3RoLCBwdGhyZWFkX2F0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisKKy8qIEZ1bmN0aW9ucyBmb3Igc2NoZWR1bGluZyBjb250cm9sLiAgKi8KKworLyogU2V0IHRoZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgZm9yIFRBUkdFVF9USFJFQUQgYWNjb3JkaW5nIHRvIFBPTElDWQorICAgYW5kICpQQVJBTS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0c2NoZWRwYXJhbSAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwgaW50IF9fcG9saWN5LAorCQkJCSAgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworCisvKiBSZXR1cm4gaW4gKlBPTElDWSBhbmQgKlBBUkFNIHRoZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgZm9yIFRBUkdFVF9USFJFQUQuICovCitleHRlcm4gaW50IHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSAocHRocmVhZF90IF9fdGFyZ2V0X3RocmVhZCwKKwkJCQkgIGludCAqX19yZXN0cmljdCBfX3BvbGljeSwKKwkJCQkgIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19yZXN0cmljdCBfX3BhcmFtKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKworLyogU2V0IHRoZSBzY2hlZHVsaW5nIHByaW9yaXR5IGZvciBUQVJHRVRfVEhSRUFELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zZXRzY2hlZHByaW8gKHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsIGludCBfX3ByaW8pCisgICAgIF9fVEhST1c7CisKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogRGV0ZXJtaW5lIGxldmVsIG9mIGNvbmN1cnJlbmN5LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRjb25jdXJyZW5jeSAodm9pZCkgX19USFJPVzsKKworLyogU2V0IG5ldyBjb25jdXJyZW5jeSBsZXZlbCB0byBMRVZFTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0Y29uY3VycmVuY3kgKGludCBfX2xldmVsKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFlpZWxkIHRoZSBwcm9jZXNzb3IgdG8gYW5vdGhlciB0aHJlYWQgb3IgcHJvY2Vzcy4KKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgUE9TSVggYHNjaGVkX3lpZWxkJyBmdW5jdGlvbiBidXQKKyAgIG1pZ2h0IGJlIGRpZmZlcmVudGx5IGltcGxlbWVudGVkIGluIHRoZSBjYXNlIG9mIGEgbS1vbi1uIHRocmVhZAorICAgaW1wbGVtZW50YXRpb24uICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3lpZWxkICh2b2lkKSBfX1RIUk9XOworCisKKy8qIExpbWl0IHNwZWNpZmllZCB0aHJlYWQgVEggdG8gcnVuIG9ubHkgb24gdGhlIHByb2Nlc3NvcnMgcmVwcmVzZW50ZWQKKyAgIGluIENQVVNFVC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0YWZmaW5pdHlfbnAgKHB0aHJlYWRfdCBfX3RoLCBzaXplX3QgX19jcHVzZXRzaXplLAorCQkJCSAgIF9fY29uc3QgY3B1X3NldF90ICpfX2NwdXNldCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CisKKy8qIEdldCBiaXQgc2V0IGluIENQVVNFVCByZXByZXNlbnRpbmcgdGhlIHByb2Nlc3NvcnMgVEggY2FuIHJ1biBvbi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfZ2V0YWZmaW5pdHlfbnAgKHB0aHJlYWRfdCBfX3RoLCBzaXplX3QgX19jcHVzZXRzaXplLAorCQkJCSAgIGNwdV9zZXRfdCAqX19jcHVzZXQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMykpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBpbml0aWFsaXphdGlvbi4gICovCisKKy8qIEd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBJTklUX1JPVVRJTkUgd2lsbCBiZSBjYWxsZWQKKyAgIG9ubHkgb25jZSwgZXZlbiBpZiBwdGhyZWFkX29uY2UgaXMgZXhlY3V0ZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIHRoZQorICAgc2FtZSBPTkNFX0NPTlRST0wgYXJndW1lbnQuIE9OQ0VfQ09OVFJPTCBtdXN0IHBvaW50IHRvIGEgc3RhdGljIG9yCisgICBleHRlcm4gdmFyaWFibGUgaW5pdGlhbGl6ZWQgdG8gUFRIUkVBRF9PTkNFX0lOSVQuCisKKyAgIFRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgbWlnaHQgdGhyb3cgZXhjZXB0aW9uIHdoaWNoIGlzIHdoeQorICAgdGhpcyBmdW5jdGlvbiBpcyBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfb25jZSAocHRocmVhZF9vbmNlX3QgKl9fb25jZV9jb250cm9sLAorCQkJIHZvaWQgKCpfX2luaXRfcm91dGluZSkgKHZvaWQpKSBfX25vbm51bGwgKCgxLCAyKSk7CisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBjYW5jZWxsYXRpb24uCisKKyAgIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cGxpY2l0bHkgbm90IG1hcmtlZCB0byBub3QgdGhyb3cgYW4KKyAgIGV4Y2VwdGlvbiBpbiBDKysgY29kZS4gIElmIGNhbmNlbGxhdGlvbiBpcyBpbXBsZW1lbnRlZCBieSB1bndpbmRpbmcKKyAgIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgdGhlIGNvbXBpbGVyIGdlbmVyYXRlIHRoZSB1bndpbmQgaW5mb3JtYXRpb24uICAqLworCisvKiBTZXQgY2FuY2VsYWJpbGl0eSBzdGF0ZSBvZiBjdXJyZW50IHRocmVhZCB0byBTVEFURSwgcmV0dXJuaW5nIG9sZAorICAgc3RhdGUgaW4gKk9MRFNUQVRFIGlmIE9MRFNUQVRFIGlzIG5vdCBOVUxMLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAoaW50IF9fc3RhdGUsIGludCAqX19vbGRzdGF0ZSk7CisKKy8qIFNldCBjYW5jZWxsYXRpb24gc3RhdGUgb2YgY3VycmVudCB0aHJlYWQgdG8gVFlQRSwgcmV0dXJuaW5nIHRoZSBvbGQKKyAgIHR5cGUgaW4gKk9MRFRZUEUgaWYgT0xEVFlQRSBpcyBub3QgTlVMTC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoaW50IF9fdHlwZSwgaW50ICpfX29sZHR5cGUpOworCisvKiBDYW5jZWwgVEhSRUFEIGltbWVkaWF0ZWx5IG9yIGF0IHRoZSBuZXh0IHBvc3NpYmlsaXR5LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jYW5jZWwgKHB0aHJlYWRfdCBfX3RoKTsKKworLyogVGVzdCBmb3IgcGVuZGluZyBjYW5jZWxsYXRpb24gZm9yIHRoZSBjdXJyZW50IHRocmVhZCBhbmQgdGVybWluYXRlCisgICB0aGUgdGhyZWFkIGFzIHBlciBwdGhyZWFkX2V4aXQoUFRIUkVBRF9DQU5DRUxFRCkgaWYgaXQgaGFzIGJlZW4KKyAgIGNhbmNlbGxlZC4gICovCitleHRlcm4gdm9pZCBwdGhyZWFkX3Rlc3RjYW5jZWwgKHZvaWQpOworCisKKy8qIENhbmNlbGxhdGlvbiBoYW5kbGluZyB3aXRoIGludGVncmF0aW9uIGludG8gZXhjZXB0aW9uIGhhbmRsaW5nLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc3RydWN0CisgIHsKKyAgICBfX2ptcF9idWYgX19jYW5jZWxfam1wX2J1ZjsKKyAgICBpbnQgX19tYXNrX3dhc19zYXZlZDsKKyAgfSBfX2NhbmNlbF9qbXBfYnVmWzFdOworICB2b2lkICpfX3BhZFs0XTsKK30gX19wdGhyZWFkX3Vud2luZF9idWZfdCBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18pKTsKKworLyogTm8gc3BlY2lhbCBhdHRyaWJ1dGVzIGJ5IGRlZmF1bHQuICAqLworI2lmbmRlZiBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZQorIyBkZWZpbmUgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGUKKyNlbmRpZgorCisKKy8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBjbGVhbnVwIGhhbmRsZXIgaW5mb3JtYXRpb24uICAqLworc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lCit7CisgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKTsKKyAgdm9pZCAqX19jYW5jZWxfYXJnOworICBpbnQgX19kb19pdDsKKyAgaW50IF9fY2FuY2VsX3R5cGU7Cit9OworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fRVhDRVBUSU9OUworIyBpZmRlZiBfX2NwbHVzcGx1cworLyogQ2xhc3MgdG8gaGFuZGxlIGNhbmNlbGxhdGlvbiBoYW5kbGVyIGludm9jYXRpb24uICAqLworY2xhc3MgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MKK3sKKyAgdm9pZCAoKl9fY2FuY2VsX3JvdXRpbmUpICh2b2lkICopOworICB2b2lkICpfX2NhbmNlbF9hcmc7CisgIGludCBfX2RvX2l0OworICBpbnQgX19jYW5jZWxfdHlwZTsKKworIHB1YmxpYzoKKyAgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MgKHZvaWQgKCpfX2ZjdCkgKHZvaWQgKiksIHZvaWQgKl9fYXJnKQorICAgIDogX19jYW5jZWxfcm91dGluZSAoX19mY3QpLCBfX2NhbmNlbF9hcmcgKF9fYXJnKSwgX19kb19pdCAoMSkgeyB9CisgIH5fX3B0aHJlYWRfY2xlYW51cF9jbGFzcyAoKSB7IGlmIChfX2RvX2l0KSBfX2NhbmNlbF9yb3V0aW5lIChfX2NhbmNlbF9hcmcpOyB9CisgIHZvaWQgX19zZXRkb2l0IChpbnQgX19uZXd2YWwpIHsgX19kb19pdCA9IF9fbmV3dmFsOyB9CisgIHZvaWQgX19kZWZlciAoKSB7IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsCisJCQkJCSAgICZfX2NhbmNlbF90eXBlKTsgfQorICB2b2lkIF9fcmVzdG9yZSAoKSBjb25zdCB7IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoX19jYW5jZWxfdHlwZSwgMCk7IH0KK307CisKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXI6IFJPVVRJTkUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHCisgICB3aGVuIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgb3IgY2FsbHMgcHRocmVhZF9leGl0LiAgUk9VVElORSB3aWxsIGFsc28KKyAgIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBBUkcgd2hlbiB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3BvcAorICAgaXMgZXhlY3V0ZWQgd2l0aCBub24temVybyBFWEVDVVRFIGFyZ3VtZW50LgorCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaCBhbmQgcHRocmVhZF9jbGVhbnVwX3BvcCBhcmUgbWFjcm9zIGFuZCBtdXN0IGFsd2F5cworICAgYmUgdXNlZCBpbiBtYXRjaGluZyBwYWlycyBhdCB0aGUgc2FtZSBuZXN0aW5nIGxldmVsIG9mIGJyYWNlcy4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgX19wdGhyZWFkX2NsZWFudXBfY2xhc3MgX19jbGZyYW1lIChyb3V0aW5lLCBhcmcpCisKKy8qIFJlbW92ZSBhIGNsZWFudXAgaGFuZGxlciBpbnN0YWxsZWQgYnkgdGhlIG1hdGNoaW5nIHB0aHJlYWRfY2xlYW51cF9wdXNoLgorICAgSWYgRVhFQ1VURSBpcyBub24temVybywgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworIyAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wb3AoZXhlY3V0ZSkgXAorICAgIF9fY2xmcmFtZS5fX3NldGRvaXQgKGV4ZWN1dGUpOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjICBpZmRlZiBfX1VTRV9HTlUKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3B1c2ggZG9lcywgYnV0IGFsc28KKyAgIHNhdmVzIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiB0eXBlIGFuZCBzZXRzIGl0IHRvIGRlZmVycmVkCisgICBjYW5jZWxsYXRpb24uICAqLworIyAgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcl9ucChyb3V0aW5lLCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfY2xlYW51cF9jbGFzcyBfX2NsZnJhbWUgKHJvdXRpbmUsIGFyZyk7CQkJICAgICAgXAorICAgIF9fY2xmcmFtZS5fX2RlZmVyICgpCisKKy8qIFJlbW92ZSBhIGNsZWFudXAgaGFuZGxlciBhcyBwdGhyZWFkX2NsZWFudXBfcG9wIGRvZXMsIGJ1dCBhbHNvCisgICByZXN0b3JlcyB0aGUgY2FuY2VsbGF0aW9uIHR5cGUgdGhhdCB3YXMgaW4gZWZmZWN0IHdoZW4gdGhlIG1hdGNoaW5nCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlciB3YXMgY2FsbGVkLiAgKi8KKyMgICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlX25wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19yZXN0b3JlICgpOwkJCQkJCSAgICAgIFwKKyAgICBfX2NsZnJhbWUuX19zZXRkb2l0IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVsc2UKKy8qIEZ1bmN0aW9uIGNhbGxlZCB0byBjYWxsIHRoZSBjbGVhbnVwIGhhbmRsZXIuICBBcyBhbiBleHRlcm4gaW5saW5lCisgICBmdW5jdGlvbiB0aGUgY29tcGlsZXIgaXMgZnJlZSB0byBkZWNpZGUgaW5saW5pbmcgdGhlIGNoYW5nZSB3aGVuCisgICBuZWVkZWQgb3IgZmFsbCBiYWNrIG9uIHRoZSBjb3B5IHdoaWNoIG11c3QgZXhpc3Qgc29tZXdoZXJlCisgICBlbHNlLiAgKi8KK19fZXh0ZXJuX2lubGluZSB2b2lkCitfX3B0aHJlYWRfY2xlYW51cF9yb3V0aW5lIChzdHJ1Y3QgX19wdGhyZWFkX2NsZWFudXBfZnJhbWUgKl9fZnJhbWUpCit7CisgIGlmIChfX2ZyYW1lLT5fX2RvX2l0KQorICAgIF9fZnJhbWUtPl9fY2FuY2VsX3JvdXRpbmUgKF9fZnJhbWUtPl9fY2FuY2VsX2FyZyk7Cit9CisKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXI6IFJPVVRJTkUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHCisgICB3aGVuIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgb3IgY2FsbHMgcHRocmVhZF9leGl0LiAgUk9VVElORSB3aWxsIGFsc28KKyAgIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBBUkcgd2hlbiB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3BvcAorICAgaXMgZXhlY3V0ZWQgd2l0aCBub24temVybyBFWEVDVVRFIGFyZ3VtZW50LgorCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaCBhbmQgcHRocmVhZF9jbGVhbnVwX3BvcCBhcmUgbWFjcm9zIGFuZCBtdXN0IGFsd2F5cworICAgYmUgdXNlZCBpbiBtYXRjaGluZyBwYWlycyBhdCB0aGUgc2FtZSBuZXN0aW5nIGxldmVsIG9mIGJyYWNlcy4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lIF9fY2xmcmFtZQkJCQkgICAgICBcCisgICAgICBfX2F0dHJpYnV0ZV9fICgoX19jbGVhbnVwX18gKF9fcHRocmVhZF9jbGVhbnVwX3JvdXRpbmUpKSkJCSAgICAgIFwKKyAgICAgID0geyAuX19jYW5jZWxfcm91dGluZSA9IChyb3V0aW5lKSwgLl9fY2FuY2VsX2FyZyA9IChhcmcpLAkgCSAgICAgIFwKKwkgIC5fX2RvX2l0ID0gMSB9OworCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgaW5zdGFsbGVkIGJ5IHRoZSBtYXRjaGluZyBwdGhyZWFkX2NsZWFudXBfcHVzaC4KKyAgIElmIEVYRUNVVEUgaXMgbm9uLXplcm8sIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKi8KKyMgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICBfX2NsZnJhbWUuX19kb19pdCA9IChleGVjdXRlKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworIyAgaWZkZWYgX19VU0VfR05VCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wdXNoIGRvZXMsIGJ1dCBhbHNvCisgICBzYXZlcyB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gdHlwZSBhbmQgc2V0cyBpdCB0byBkZWZlcnJlZAorICAgY2FuY2VsbGF0aW9uLiAgKi8KKyMgICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXJfbnAocm91dGluZSwgYXJnKSBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IF9fcHRocmVhZF9jbGVhbnVwX2ZyYW1lIF9fY2xmcmFtZQkJCQkgICAgICBcCisgICAgICBfX2F0dHJpYnV0ZV9fICgoX19jbGVhbnVwX18gKF9fcHRocmVhZF9jbGVhbnVwX3JvdXRpbmUpKSkJCSAgICAgIFwKKyAgICAgID0geyAuX19jYW5jZWxfcm91dGluZSA9IChyb3V0aW5lKSwgLl9fY2FuY2VsX2FyZyA9IChhcmcpLAkJICAgICAgXAorCSAgLl9fZG9faXQgPSAxIH07CQkJCQkJICAgICAgXAorICAgICh2b2lkKSBwdGhyZWFkX3NldGNhbmNlbHR5cGUgKFBUSFJFQURfQ0FOQ0VMX0RFRkVSUkVELAkJICAgICAgXAorCQkJCSAgJl9fY2xmcmFtZS5fX2NhbmNlbF90eXBlKQorCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3BvcCBkb2VzLCBidXQgYWxzbworICAgcmVzdG9yZXMgdGhlIGNhbmNlbGxhdGlvbiB0eXBlIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIHRoZSBtYXRjaGluZworICAgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIgd2FzIGNhbGxlZC4gICovCisjICAgZGVmaW5lIHB0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZV9ucChleGVjdXRlKSBcCisgICAgKHZvaWQpIHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSAoX19jbGZyYW1lLl9fY2FuY2VsX3R5cGUsIE5VTEwpOwkgICAgICBcCisgICAgX19jbGZyYW1lLl9fZG9faXQgPSAoZXhlY3V0ZSk7CQkJCQkgICAgICBcCisgIH0gd2hpbGUgKDApCisjICBlbmRpZgorIyBlbmRpZgorI2Vsc2UKKy8qIEluc3RhbGwgYSBjbGVhbnVwIGhhbmRsZXI6IFJPVVRJTkUgd2lsbCBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHMgQVJHCisgICB3aGVuIHRoZSB0aHJlYWQgaXMgY2FuY2VsZWQgb3IgY2FsbHMgcHRocmVhZF9leGl0LiAgUk9VVElORSB3aWxsIGFsc28KKyAgIGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50cyBBUkcgd2hlbiB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3BvcAorICAgaXMgZXhlY3V0ZWQgd2l0aCBub24temVybyBFWEVDVVRFIGFyZ3VtZW50LgorCisgICBwdGhyZWFkX2NsZWFudXBfcHVzaCBhbmQgcHRocmVhZF9jbGVhbnVwX3BvcCBhcmUgbWFjcm9zIGFuZCBtdXN0IGFsd2F5cworICAgYmUgdXNlZCBpbiBtYXRjaGluZyBwYWlycyBhdCB0aGUgc2FtZSBuZXN0aW5nIGxldmVsIG9mIGJyYWNlcy4gICovCisjIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcHVzaChyb3V0aW5lLCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfdW53aW5kX2J1Zl90IF9fY2FuY2VsX2J1ZjsJCQkJICAgICAgXAorICAgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKSA9IChyb3V0aW5lKTsJCQkgICAgICBcCisgICAgdm9pZCAqX19jYW5jZWxfYXJnID0gKGFyZyk7CQkJCQkJICAgICAgXAorICAgIGludCBub3RfZmlyc3RfY2FsbCA9IF9fc2lnc2V0am1wICgoc3RydWN0IF9fam1wX2J1Zl90YWcgKikJCSAgICAgIFwKKwkJCQkgICAgICBfX2NhbmNlbF9idWYuX19jYW5jZWxfam1wX2J1ZiwgMCk7ICAgICAgXAorICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChub3RfZmlyc3RfY2FsbCwgMCkpCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF91bndpbmRfbmV4dCAoJl9fY2FuY2VsX2J1Zik7CQkJCSAgICAgIFwKKwkvKiBOT1RSRUFDSEVEICovCQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfcmVnaXN0ZXJfY2FuY2VsICgmX19jYW5jZWxfYnVmKTsJCQkJICAgICAgXAorICAgIGRvIHsKK2V4dGVybiB2b2lkIF9fcHRocmVhZF9yZWdpc3Rlcl9jYW5jZWwgKF9fcHRocmVhZF91bndpbmRfYnVmX3QgKl9fYnVmKQorICAgICBfX2NsZWFudXBfZmN0X2F0dHJpYnV0ZTsKKworLyogUmVtb3ZlIGEgY2xlYW51cCBoYW5kbGVyIGluc3RhbGxlZCBieSB0aGUgbWF0Y2hpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2guCisgICBJZiBFWEVDVVRFIGlzIG5vbi16ZXJvLCB0aGUgaGFuZGxlciBmdW5jdGlvbiBpcyBjYWxsZWQuICovCisjIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcG9wKGV4ZWN1dGUpIFwKKyAgICB9IHdoaWxlICgwKTsJCQkJCQkJICAgICAgXAorICAgIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbCAoJl9fY2FuY2VsX2J1Zik7CQkJICAgICAgXAorICAgIGlmIChleGVjdXRlKQkJCQkJCQkgICAgICBcCisgICAgICBfX2NhbmNlbF9yb3V0aW5lIChfX2NhbmNlbF9hcmcpOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorZXh0ZXJuIHZvaWQgX19wdGhyZWFkX3VucmVnaXN0ZXJfY2FuY2VsIChfX3B0aHJlYWRfdW53aW5kX2J1Zl90ICpfX2J1ZikKKyAgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGU7CisKKyMgaWZkZWYgX19VU0VfR05VCisvKiBJbnN0YWxsIGEgY2xlYW51cCBoYW5kbGVyIGFzIHB0aHJlYWRfY2xlYW51cF9wdXNoIGRvZXMsIGJ1dCBhbHNvCisgICBzYXZlcyB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gdHlwZSBhbmQgc2V0cyBpdCB0byBkZWZlcnJlZAorICAgY2FuY2VsbGF0aW9uLiAgKi8KKyMgIGRlZmluZSBwdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcl9ucChyb3V0aW5lLCBhcmcpIFwKKyAgZG8gewkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfdW53aW5kX2J1Zl90IF9fY2FuY2VsX2J1ZjsJCQkJICAgICAgXAorICAgIHZvaWQgKCpfX2NhbmNlbF9yb3V0aW5lKSAodm9pZCAqKSA9IChyb3V0aW5lKTsJCQkgICAgICBcCisgICAgdm9pZCAqX19jYW5jZWxfYXJnID0gKGFyZyk7CQkJCQkJICAgICAgXAorICAgIGludCBub3RfZmlyc3RfY2FsbCA9IF9fc2lnc2V0am1wICgoc3RydWN0IF9fam1wX2J1Zl90YWcgKikJCSAgICAgIFwKKwkJCQkgICAgICBfX2NhbmNlbF9idWYuX19jYW5jZWxfam1wX2J1ZiwgMCk7ICAgICAgXAorICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChub3RfZmlyc3RfY2FsbCwgMCkpCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJICAgICAgXAorCV9fcHRocmVhZF91bndpbmRfbmV4dCAoJl9fY2FuY2VsX2J1Zik7CQkJCSAgICAgIFwKKwkvKiBOT1RSRUFDSEVEICovCQkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKyAgICBfX3B0aHJlYWRfcmVnaXN0ZXJfY2FuY2VsX2RlZmVyICgmX19jYW5jZWxfYnVmKTsJCQkgICAgICBcCisgICAgZG8geworZXh0ZXJuIHZvaWQgX19wdGhyZWFkX3JlZ2lzdGVyX2NhbmNlbF9kZWZlciAoX19wdGhyZWFkX3Vud2luZF9idWZfdCAqX19idWYpCisgICAgIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlOworCisvKiBSZW1vdmUgYSBjbGVhbnVwIGhhbmRsZXIgYXMgcHRocmVhZF9jbGVhbnVwX3BvcCBkb2VzLCBidXQgYWxzbworICAgcmVzdG9yZXMgdGhlIGNhbmNlbGxhdGlvbiB0eXBlIHRoYXQgd2FzIGluIGVmZmVjdCB3aGVuIHRoZSBtYXRjaGluZworICAgcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIgd2FzIGNhbGxlZC4gICovCisjICBkZWZpbmUgcHRocmVhZF9jbGVhbnVwX3BvcF9yZXN0b3JlX25wKGV4ZWN1dGUpIFwKKyAgICB9IHdoaWxlICgwKTsJCQkJCQkJICAgICAgXAorICAgIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbF9yZXN0b3JlICgmX19jYW5jZWxfYnVmKTsJCSAgICAgIFwKKyAgICBpZiAoZXhlY3V0ZSkJCQkJCQkJICAgICAgXAorICAgICAgX19jYW5jZWxfcm91dGluZSAoX19jYW5jZWxfYXJnKTsJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKK2V4dGVybiB2b2lkIF9fcHRocmVhZF91bnJlZ2lzdGVyX2NhbmNlbF9yZXN0b3JlIChfX3B0aHJlYWRfdW53aW5kX2J1Zl90ICpfX2J1ZikKKyAgX19jbGVhbnVwX2ZjdF9hdHRyaWJ1dGU7CisjIGVuZGlmCisKKy8qIEludGVybmFsIGludGVyZmFjZSB0byBpbml0aWF0ZSBjbGVhbnVwLiAgKi8KK2V4dGVybiB2b2lkIF9fcHRocmVhZF91bndpbmRfbmV4dCAoX19wdGhyZWFkX3Vud2luZF9idWZfdCAqX19idWYpCisgICAgIF9fY2xlYW51cF9mY3RfYXR0cmlidXRlIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorIyBpZm5kZWYgU0hBUkVECisgICAgIF9fYXR0cmlidXRlX18gKChfX3dlYWtfXykpCisjIGVuZGlmCisgICAgIDsKKyNlbmRpZgorCisvKiBGdW5jdGlvbiB1c2VkIGluIHRoZSBtYWNyb3MuICAqLworc3RydWN0IF9fam1wX2J1Zl90YWc7CitleHRlcm4gaW50IF9fc2lnc2V0am1wIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyAqX19lbnYsIGludCBfX3NhdmVtYXNrKSBfX1RIUk9XOworCisKKy8qIE11dGV4IGhhbmRsaW5nLiAgKi8KKworLyogSW5pdGlhbGl6ZSBhIG11dGV4LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9pbml0IChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICAgICAgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4YXR0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgYSBtdXRleC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IGxvY2tpbmcgYSBtdXRleC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayAocHRocmVhZF9tdXRleF90ICpfX211dGV4KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogTG9jayBhIG11dGV4LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9sb2NrIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogV2FpdCB1bnRpbCBsb2NrIGJlY29tZXMgYXZhaWxhYmxlLCBvciBzcGVjaWZpZWQgdGltZSBwYXNzZXMuICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChwdGhyZWFkX211dGV4X3QgKl9fcmVzdHJpY3QgX19tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Fic3RpbWUpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2VuZGlmCisKKy8qIFVubG9jayBhIG11dGV4LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF91bmxvY2sgKHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogR2V0IHRoZSBwcmlvcml0eSBjZWlsaW5nIG9mIE1VVEVYLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9nZXRwcmlvY2VpbGluZyAoX19jb25zdCBwdGhyZWFkX211dGV4X3QgKgorCQkJCQkgX19yZXN0cmljdCBfX211dGV4LAorCQkJCQkgaW50ICpfX3Jlc3RyaWN0IF9fcHJpb2NlaWxpbmcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIHByaW9yaXR5IGNlaWxpbmcgb2YgTVVURVggdG8gUFJJT0NFSUxJTkcsIHJldHVybiBvbGQKKyAgIHByaW9yaXR5IGNlaWxpbmcgdmFsdWUgaW4gKk9MRF9DRUlMSU5HLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9zZXRwcmlvY2VpbGluZyAocHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgsCisJCQkJCSBpbnQgX19wcmlvY2VpbGluZywKKwkJCQkJIGludCAqX19yZXN0cmljdCBfX29sZF9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKTsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIERlY2xhcmUgdGhlIHN0YXRlIHByb3RlY3RlZCBieSBNVVRFWCBhcyBjb25zaXN0ZW50LiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleF9jb25zaXN0ZW50X25wIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyBtdXRleCBhdHRyaWJ1dGVzLiAgKi8KKworLyogSW5pdGlhbGl6ZSBtdXRleCBhdHRyaWJ1dGUgb2JqZWN0IEFUVFIgd2l0aCBkZWZhdWx0IGF0dHJpYnV0ZXMKKyAgIChraW5kIGlzIFBUSFJFQURfTVVURVhfVElNRURfTlApLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfaW5pdCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBtdXRleCBhdHRyaWJ1dGUgb2JqZWN0IEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIG11dGV4IGF0dHJpYnV0ZSBBVFRSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfZ2V0cHNoYXJlZCAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICoKKwkJCQkJIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgaW50ICpfX3Jlc3RyaWN0IF9fcHNoYXJlZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgcHJvY2Vzcy1zaGFyZWQgZmxhZyBvZiB0aGUgbXV0ZXggYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsCisJCQkJCSBpbnQgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogUmV0dXJuIGluICpLSU5EIHRoZSBtdXRleCBraW5kIGF0dHJpYnV0ZSBpbiAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUgKF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19yZXN0cmljdAorCQkJCSAgICAgIF9fYXR0ciwgaW50ICpfX3Jlc3RyaWN0IF9fa2luZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgbXV0ZXgga2luZCBhdHRyaWJ1dGUgaW4gKkFUVFIgdG8gS0lORCAoZWl0aGVyIFBUSFJFQURfTVVURVhfTk9STUFMLAorICAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUsIFBUSFJFQURfTVVURVhfRVJST1JDSEVDSywgb3IKKyAgIFBUSFJFQURfTVVURVhfREVGQVVMVCkuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIChwdGhyZWFkX211dGV4YXR0cl90ICpfX2F0dHIsIGludCBfX2tpbmQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gaW4gKlBST1RPQ09MIHRoZSBtdXRleCBwcm90b2NvbCBhdHRyaWJ1dGUgaW4gKkFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXRwcm90b2NvbCAoX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19wcm90b2NvbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgbXV0ZXggcHJvdG9jb2wgYXR0cmlidXRlIGluICpBVFRSIHRvIFBST1RPQ09MIChlaXRoZXIKKyAgIFBUSFJFQURfUFJJT19OT05FLCBQVEhSRUFEX1BSSU9fSU5IRVJJVCwgb3IgUFRIUkVBRF9QUklPX1BST1RFQ1QpLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfc2V0cHJvdG9jb2wgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0ciwKKwkJCQkJICBpbnQgX19wcm90b2NvbCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiBpbiAqUFJJT0NFSUxJTkcgdGhlIG11dGV4IHByaW9jZWlsaW5nIGF0dHJpYnV0ZSBpbiAqQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX2dldHByaW9jZWlsaW5nIChfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKgorCQkJCQkgICAgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgICAgIGludCAqX19yZXN0cmljdCBfX3ByaW9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHRoZSBtdXRleCBwcmlvY2VpbGluZyBhdHRyaWJ1dGUgaW4gKkFUVFIgdG8gUFJJT0NFSUxJTkcuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9zZXRwcmlvY2VpbGluZyAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgICAgIGludCBfX3ByaW9jZWlsaW5nKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBHZXQgdGhlIHJvYnVzdG5lc3MgZmxhZyBvZiB0aGUgbXV0ZXggYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9nZXRyb2J1c3RfbnAgKF9fY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgICBpbnQgKl9fcm9idXN0bmVzcykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgcm9idXN0bmVzcyBmbGFnIG9mIHRoZSBtdXRleCBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHJvYnVzdF9ucCAocHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyLAorCQkJCQkgICBpbnQgX19yb2J1c3RuZXNzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcmVhZC13cml0ZSBsb2Nrcy4gICovCisKKy8qIEluaXRpYWxpemUgcmVhZC13cml0ZSBsb2NrIFJXTE9DSyB1c2luZyBhdHRyaWJ1dGVzIEFUVFIsIG9yIHVzZQorICAgdGhlIGRlZmF1bHQgdmFsdWVzIGlmIGxhdGVyIGlzIE5VTEwuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19pbml0IChwdGhyZWFkX3J3bG9ja190ICpfX3Jlc3RyaWN0IF9fcndsb2NrLAorCQkJCV9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQlfX2F0dHIpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IHJlYWQtd3JpdGUgbG9jayBSV0xPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19kZXN0cm95IChwdGhyZWFkX3J3bG9ja190ICpfX3J3bG9jaykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEFjcXVpcmUgcmVhZCBsb2NrIGZvciBSV0xPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja19yZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogVHJ5IHRvIGFjcXVpcmUgcmVhZCBsb2NrIGZvciBSV0xPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKQorICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUcnkgdG8gYWNxdWlyZSByZWFkIGxvY2sgZm9yIFJXTE9DSyBvciByZXR1cm4gYWZ0ZXIgc3BlY2ZpZWQgdGltZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3RpbWVkcmRsb2NrIChwdGhyZWFkX3J3bG9ja190ICpfX3Jlc3RyaWN0IF9fcndsb2NrLAorCQkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXN0cmljdAorCQkJCSAgICAgICBfX2Fic3RpbWUpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgorCisvKiBBY3F1aXJlIHdyaXRlIGxvY2sgZm9yIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3dybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBUcnkgdG8gYWNxdWlyZSB3cml0ZSBsb2NrIGZvciBSV0xPQ0suICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2sgKHB0aHJlYWRfcndsb2NrX3QgKl9fcndsb2NrKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUcnkgdG8gYWNxdWlyZSB3cml0ZSBsb2NrIGZvciBSV0xPQ0sgb3IgcmV0dXJuIGFmdGVyIHNwZWNmaWVkIHRpbWUuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3J3bG9ja190aW1lZHdybG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yZXN0cmljdCBfX3J3bG9jaywKKwkJCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QKKwkJCQkgICAgICAgX19hYnN0aW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZW5kaWYKKworLyogVW5sb2NrIFJXTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrX3VubG9jayAocHRocmVhZF9yd2xvY2tfdCAqX19yd2xvY2spCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcmVhZC13cml0ZSBsb2NrIGF0dHJpYnV0ZXMuICAqLworCisvKiBJbml0aWFsaXplIGF0dHJpYnV0ZSBvYmplY3QgQVRUUiB3aXRoIGRlZmF1bHQgdmFsdWVzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGF0dHJpYnV0ZSBvYmplY3QgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95IChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIGN1cnJlbnQgc2V0dGluZyBvZiBwcm9jZXNzLXNoYXJlZCBhdHRyaWJ1dGUgb2YgQVRUUiBpbiBQU0hBUkVELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX2dldHBzaGFyZWQgKF9fY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKgorCQkJCQkgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgIGludCAqX19yZXN0cmljdCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgcHJvY2Vzcy1zaGFyZWQgYXR0cmlidXRlIG9mIEFUVFIgdG8gUFNIQVJFRC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9zZXRwc2hhcmVkIChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqX19hdHRyLAorCQkJCQkgIGludCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gY3VycmVudCBzZXR0aW5nIG9mIHJlYWRlci93cml0ZXIgcHJlZmVyZW5jZS4gICovCitleHRlcm4gaW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRraW5kX25wIChfX2NvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICoKKwkJCQkJICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBpbnQgKl9fcmVzdHJpY3QgX19wcmVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2V0IHJlYWRlci93cml0ZSBwcmVmZXJlbmNlLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9yd2xvY2thdHRyX3NldGtpbmRfbnAgKHB0aHJlYWRfcndsb2NrYXR0cl90ICpfX2F0dHIsCisJCQkJCSAgaW50IF9fcHJlZikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbmRpdGlvbmFsIHZhcmlhYmxlcy4gICovCisKKy8qIEluaXRpYWxpemUgY29uZGl0aW9uIHZhcmlhYmxlIENPTkQgdXNpbmcgYXR0cmlidXRlcyBBVFRSLCBvciB1c2UKKyAgIHRoZSBkZWZhdWx0IHZhbHVlcyBpZiBsYXRlciBpcyBOVUxMLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kX2luaXQgKHB0aHJlYWRfY29uZF90ICpfX3Jlc3RyaWN0IF9fY29uZCwKKwkJCSAgICAgIF9fY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkgICAgICBfX2NvbmRfYXR0cikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIERlc3Ryb3kgY29uZGl0aW9uIHZhcmlhYmxlIENPTkQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfZGVzdHJveSAocHRocmVhZF9jb25kX3QgKl9fY29uZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFdha2UgdXAgb25lIHRocmVhZCB3YWl0aW5nIGZvciBjb25kaXRpb24gdmFyaWFibGUgQ09ORC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZF9zaWduYWwgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIGNvbmRpdGlvbiB2YXJpYWJsZXMgQ09ORC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBXYWl0IGZvciBjb25kaXRpb24gdmFyaWFibGUgQ09ORCB0byBiZSBzaWduYWxlZCBvciBicm9hZGNhc3QuCisgICBNVVRFWCBpcyBhc3N1bWVkIHRvIGJlIGxvY2tlZCBiZWZvcmUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfd2FpdCAocHRocmVhZF9jb25kX3QgKl9fcmVzdHJpY3QgX19jb25kLAorCQkJICAgICAgcHRocmVhZF9tdXRleF90ICpfX3Jlc3RyaWN0IF9fbXV0ZXgpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogV2FpdCBmb3IgY29uZGl0aW9uIHZhcmlhYmxlIENPTkQgdG8gYmUgc2lnbmFsZWQgb3IgYnJvYWRjYXN0IHVudGlsCisgICBBQlNUSU1FLiAgTVVURVggaXMgYXNzdW1lZCB0byBiZSBsb2NrZWQgYmVmb3JlLiAgQUJTVElNRSBpcyBhbgorICAgYWJzb2x1dGUgdGltZSBzcGVjaWZpY2F0aW9uOyB6ZXJvIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVwb2NoCisgICAoMDA6MDA6MDAgR01ULCBKYW51YXJ5IDEsIDE5NzApLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdCAocHRocmVhZF9jb25kX3QgKl9fcmVzdHJpY3QgX19jb25kLAorCQkJCSAgIHB0aHJlYWRfbXV0ZXhfdCAqX19yZXN0cmljdCBfX211dGV4LAorCQkJCSAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3Jlc3RyaWN0CisJCQkJICAgX19hYnN0aW1lKSBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKKy8qIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29uZGl0aW9uIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAqLworCisvKiBJbml0aWFsaXplIGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdCAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveSAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfZ2V0cHNoYXJlZCAoX19jb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVzdHJpY3QgX19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqX19yZXN0cmljdCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfc2V0cHNoYXJlZCAocHRocmVhZF9jb25kYXR0cl90ICpfX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9fcHNoYXJlZCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBHZXQgdGhlIGNsb2NrIHNlbGVjdGVkIGZvciB0aGUgY29uZGl0b24gdmFyaWFibGUgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRhdHRyX2dldGNsb2NrIChfX2NvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqCisJCQkJICAgICAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJICAgICAgX19jbG9ja2lkX3QgKl9fcmVzdHJpY3QgX19jbG9ja19pZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNldCB0aGUgY2xvY2sgc2VsZWN0ZWQgZm9yIHRoZSBjb25kaXRvbiB2YXJpYWJsZSBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfc2V0Y2xvY2sgKHB0aHJlYWRfY29uZGF0dHJfdCAqX19hdHRyLAorCQkJCSAgICAgIF9fY2xvY2tpZF90IF9fY2xvY2tfaWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgc3BpbmxvY2tzLiAgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgc3BpbmxvY2sgTE9DSy4gIElmIFBTSEFSRUQgaXMgbm9uemVybyB0aGUgc3BpbmxvY2sgY2FuCisgICBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgcHJvY2Vzc2VzLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zcGluX2luaXQgKHB0aHJlYWRfc3BpbmxvY2tfdCAqX19sb2NrLCBpbnQgX19wc2hhcmVkKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSB0aGUgc3BpbmxvY2sgTE9DSy4gICovCitleHRlcm4gaW50IHB0aHJlYWRfc3Bpbl9kZXN0cm95IChwdGhyZWFkX3NwaW5sb2NrX3QgKl9fbG9jaykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFdhaXQgdW50aWwgc3BpbmxvY2sgTE9DSyBpcyByZXRyaWV2ZWQuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NwaW5fbG9jayAocHRocmVhZF9zcGlubG9ja190ICpfX2xvY2spCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBUcnkgdG8gbG9jayBzcGlubG9jayBMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zcGluX3RyeWxvY2sgKHB0aHJlYWRfc3BpbmxvY2tfdCAqX19sb2NrKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmVsZWFzZSBzcGlubG9jayBMT0NLLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9zcGluX3VubG9jayAocHRocmVhZF9zcGlubG9ja190ICpfX2xvY2spCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgYmFycmllcnMuICAqLworCisvKiBJbml0aWFsaXplIEJBUlJJRVIgd2l0aCB0aGUgYXR0cmlidXRlcyBpbiBBVFRSLiAgVGhlIGJhcnJpZXIgaXMKKyAgIG9wZW5lZCB3aGVuIENPVU5UIHdhaXRlcnMgYXJyaXZlZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcl9pbml0IChwdGhyZWFkX2JhcnJpZXJfdCAqX19yZXN0cmljdCBfX2JhcnJpZXIsCisJCQkJIF9fY29uc3QgcHRocmVhZF9iYXJyaWVyYXR0cl90ICpfX3Jlc3RyaWN0CisJCQkJIF9fYXR0ciwgdW5zaWduZWQgaW50IF9fY291bnQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IGEgcHJldmlvdXNseSBkeW5hbWljYWxseSBpbml0aWFsaXplZCBiYXJyaWVyIEJBUlJJRVIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJfZGVzdHJveSAocHRocmVhZF9iYXJyaWVyX3QgKl9fYmFycmllcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFdhaXQgb24gYmFycmllciBCQVJSSUVSLiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9iYXJyaWVyX3dhaXQgKHB0aHJlYWRfYmFycmllcl90ICpfX2JhcnJpZXIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIEluaXRpYWxpemUgYmFycmllciBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcmF0dHJfaW5pdCAocHRocmVhZF9iYXJyaWVyYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBEZXN0cm95IHByZXZpb3VzbHkgZHluYW1pY2FsbHkgaW5pdGlhbGl6ZWQgYmFycmllciBhdHRyaWJ1dGUgQVRUUi4gICovCitleHRlcm4gaW50IHB0aHJlYWRfYmFycmllcmF0dHJfZGVzdHJveSAocHRocmVhZF9iYXJyaWVyYXR0cl90ICpfX2F0dHIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIGJhcnJpZXIgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJhdHRyX2dldHBzaGFyZWQgKF9fY29uc3QgcHRocmVhZF9iYXJyaWVyYXR0cl90ICoKKwkJCQkJICAgX19yZXN0cmljdCBfX2F0dHIsCisJCQkJCSAgIGludCAqX19yZXN0cmljdCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgdGhlIHByb2Nlc3Mtc2hhcmVkIGZsYWcgb2YgdGhlIGJhcnJpZXIgYXR0cmlidXRlIEFUVFIuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2JhcnJpZXJhdHRyX3NldHBzaGFyZWQgKHB0aHJlYWRfYmFycmllcmF0dHJfdCAqX19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfX3BzaGFyZWQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworLyogRnVuY3Rpb25zIGZvciBoYW5kbGluZyB0aHJlYWQtc3BlY2lmaWMgZGF0YS4gICovCisKKy8qIENyZWF0ZSBhIGtleSB2YWx1ZSBpZGVudGlmeWluZyBhIGxvY2F0aW9uIGluIHRoZSB0aHJlYWQtc3BlY2lmaWMKKyAgIGRhdGEgYXJlYS4gIEVhY2ggdGhyZWFkIG1haW50YWlucyBhIGRpc3RpbmN0IHRocmVhZC1zcGVjaWZpYyBkYXRhCisgICBhcmVhLiAgREVTVFJfRlVOQ1RJT04sIGlmIG5vbi1OVUxMLCBpcyBjYWxsZWQgd2l0aCB0aGUgdmFsdWUKKyAgIGFzc29jaWF0ZWQgdG8gdGhhdCBrZXkgd2hlbiB0aGUga2V5IGlzIGRlc3Ryb3llZC4KKyAgIERFU1RSX0ZVTkNUSU9OIGlzIG5vdCBjYWxsZWQgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgaXMgTlVMTCB3aGVuCisgICB0aGUga2V5IGlzIGRlc3Ryb3llZC4gICovCitleHRlcm4gaW50IHB0aHJlYWRfa2V5X2NyZWF0ZSAocHRocmVhZF9rZXlfdCAqX19rZXksCisJCQkgICAgICAgdm9pZCAoKl9fZGVzdHJfZnVuY3Rpb24pICh2b2lkICopKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRGVzdHJveSBLRVkuICAqLworZXh0ZXJuIGludCBwdGhyZWFkX2tleV9kZWxldGUgKHB0aHJlYWRfa2V5X3QgX19rZXkpIF9fVEhST1c7CisKKy8qIFJldHVybiBjdXJyZW50IHZhbHVlIG9mIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YSBzbG90IGlkZW50aWZpZWQgYnkgS0VZLiAgKi8KK2V4dGVybiB2b2lkICpwdGhyZWFkX2dldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5KSBfX1RIUk9XOworCisvKiBTdG9yZSBQT0lOVEVSIGluIHRoZSB0aHJlYWQtc3BlY2lmaWMgZGF0YSBzbG90IGlkZW50aWZpZWQgYnkgS0VZLiAqLworZXh0ZXJuIGludCBwdGhyZWFkX3NldHNwZWNpZmljIChwdGhyZWFkX2tleV90IF9fa2V5LAorCQkJCV9fY29uc3Qgdm9pZCAqX19wb2ludGVyKSBfX1RIUk9XIDsKKworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogR2V0IElEIG9mIENQVS10aW1lIGNsb2NrIGZvciB0aHJlYWQgVEhSRUFEX0lELiAgKi8KK2V4dGVybiBpbnQgcHRocmVhZF9nZXRjcHVjbG9ja2lkIChwdGhyZWFkX3QgX190aHJlYWRfaWQsCisJCQkJICBfX2Nsb2NraWRfdCAqX19jbG9ja19pZCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworCisvKiBJbnN0YWxsIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB3aGVuIGEgbmV3IHByb2Nlc3MgaXMgY3JlYXRlZCB3aXRoIEZPUksuCisgICBUaGUgUFJFUEFSRSBoYW5kbGVyIGlzIGNhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3MganVzdCBiZWZvcmUgcGVyZm9ybWluZworICAgRk9SSy4gVGhlIFBBUkVOVCBoYW5kbGVyIGlzIGNhbGxlZCBpbiB0aGUgcGFyZW50IHByb2Nlc3MganVzdCBhZnRlciBGT1JLLgorICAgVGhlIENISUxEIGhhbmRsZXIgaXMgY2FsbGVkIGluIHRoZSBjaGlsZCBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgdGhyZWUKKyAgIGhhbmRsZXJzIGNhbiBiZSBOVUxMLCBtZWFuaW5nIHRoYXQgbm8gaGFuZGxlciBuZWVkcyB0byBiZSBjYWxsZWQgYXQgdGhhdAorICAgcG9pbnQuCisgICBQVEhSRUFEX0FURk9SSyBjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMsIGluIHdoaWNoIGNhc2UgdGhlIFBSRVBBUkUKKyAgIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gTElGTyBvcmRlciAobGFzdCBhZGRlZCB3aXRoIFBUSFJFQURfQVRGT1JLLAorICAgZmlyc3QgY2FsbGVkIGJlZm9yZSBGT1JLKSwgYW5kIHRoZSBQQVJFTlQgYW5kIENISUxEIGhhbmRsZXJzIGFyZSBjYWxsZWQKKyAgIGluIEZJRk8gKGZpcnN0IGFkZGVkLCBmaXJzdCBjYWxsZWQpLiAgKi8KKworZXh0ZXJuIGludCBwdGhyZWFkX2F0Zm9yayAodm9pZCAoKl9fcHJlcGFyZSkgKHZvaWQpLAorCQkJICAgdm9pZCAoKl9fcGFyZW50KSAodm9pZCksCisJCQkgICB2b2lkICgqX19jaGlsZCkgKHZvaWQpKSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworLyogT3B0aW1pemF0aW9ucy4gICovCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAocHRocmVhZF9lcXVhbCAocHRocmVhZF90IF9fdGhyZWFkMSwgcHRocmVhZF90IF9fdGhyZWFkMikpCit7CisgIHJldHVybiBfX3RocmVhZDEgPT0gX190aHJlYWQyOworfQorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBwdGhyZWFkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGI1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B0eS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qIEZ1bmN0aW9ucyBmb3IgcHNldWRvIFRUWSBoYW5kbGluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUFRZX0gKKyNkZWZpbmUgX1BUWV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGUgcHNldWRvIHR0eSBtYXN0ZXIgc2xhdmUgcGFpciB3aXRoIE5BTUUgYW5kIHNldCB0ZXJtaW5hbAorICAgYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gVEVSTVAgYW5kIFdJTlAgYW5kIHJldHVybiBoYW5kbGVzIGZvciBib3RoCisgICBlbmRzIGluIEFNQVNURVIgYW5kIEFTTEFWRS4gICovCitleHRlcm4gaW50IG9wZW5wdHkgKGludCAqX19hbWFzdGVyLCBpbnQgKl9fYXNsYXZlLCBjaGFyICpfX25hbWUsCisJCSAgICBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtcCwgc3RydWN0IHdpbnNpemUgKl9fd2lucCkgX19USFJPVzsKKworLyogQ3JlYXRlIGNoaWxkIHByb2Nlc3MgYW5kIGVzdGFibGlzaCB0aGUgc2xhdmUgcHNldWRvIHRlcm1pbmFsIGFzIHRoZQorICAgY2hpbGQncyBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gaW50IGZvcmtwdHkgKGludCAqX19hbWFzdGVyLCBjaGFyICpfX25hbWUsCisJCSAgICBzdHJ1Y3QgdGVybWlvcyAqX190ZXJtcCwgc3RydWN0IHdpbnNpemUgKl9fd2lucCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHB0eS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Jyb3dzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvYnJvd3Nlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4M2QzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Jyb3dzZXIuaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBmb29icm93c2VyaGZvbworI2RlZmluZSBmb29icm93c2VyaGZvbworCisvKiAkSWQ6IGJyb3dzZXIuaCAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9jaGFubmVsbWFwLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxmaWxlCisgKiBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIFplcm9jb25mIGJyb3dzaW5nIG9mIFB1bHNlQXVkaW8gc2VydmVycyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIEFuIG9wYXF1ZSBaZXJvY29uZiBzZXJ2aWNlIGJyb3dzZXIgb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV9icm93c2VyIHBhX2Jyb3dzZXI7CisKKy8qKiBPcGNvZGVzIGZvciBwYV9icm93c2VyX2NiX3QgY2FsbGJhY2tzICovCit0eXBlZGVmIGVudW0gcGFfYnJvd3NlX29wY29kZSB7CisgICAgUEFfQlJPV1NFX05FV19TRVJWRVIgPSAwLCAvKio8IE5ldyBzZXJ2ZXIgZm91bmQgKi8KKyAgICBQQV9CUk9XU0VfTkVXX1NJTkssICAgICAgIC8qKjwgTmV3IHNpbmsgZm91bmQgKi8KKyAgICBQQV9CUk9XU0VfTkVXX1NPVVJDRSwgICAgIC8qKjwgTmV3IHNvdXJjZSBmb3VuZCAqLworICAgIFBBX0JST1dTRV9SRU1PVkVfU0VSVkVSLCAgLyoqPCBTZXJ2ZXIgZGlzYXBwZWFyZWQgKi8KKyAgICBQQV9CUk9XU0VfUkVNT1ZFX1NJTkssICAgIC8qKjwgU2luayBkaXNhcHBlYXJlZCAqLworICAgIFBBX0JST1dTRV9SRU1PVkVfU09VUkNFICAgLyoqPCBTb3VyY2UgZGlzYXBwZWFyZWQgKi8KK30gcGFfYnJvd3NlX29wY29kZV90OworCit0eXBlZGVmIGVudW0gcGFfYnJvd3NlX2ZsYWdzIHsKKyAgICBQQV9CUk9XU0VfRk9SX1NFUlZFUlMgPSAxLCAvKio8IEJyb3dzZSBmb3Igc2VydmVycyAqLworICAgIFBBX0JST1dTRV9GT1JfU0lOS1MgPSAyLCAvKio8IEJyb3dzZSBmb3Igc2lua3MgKi8KKyAgICBQQV9CUk9XU0VfRk9SX1NPVVJDRVMgPSA0IC8qKiBCcm93c2UgZm9yIHNvdXJjZXMgKi8KK30gcGFfYnJvd3NlX2ZsYWdzX3Q7CisKKy8qKiBDcmVhdGUgYSBuZXcgYnJvd3NlciBvYmplY3Qgb24gdGhlIHNwZWNpZmllZCBtYWluIGxvb3AgKi8KK3BhX2Jyb3dzZXIgKnBhX2Jyb3dzZXJfbmV3KHBhX21haW5sb29wX2FwaSAqbWFpbmxvb3ApOworCisvKiogU2FtZSBwYV9icm93c2VyX25ldywgYnV0IHBhc3MgYWRkaXRpb25hbCBmbGFncyBwYXJhbWV0ZXIuICovCitwYV9icm93c2VyICpwYV9icm93c2VyX25ld19mdWxsKHBhX21haW5sb29wX2FwaSAqbWFpbmxvb3AsIHBhX2Jyb3dzZV9mbGFnc190IGZsYWdzLCBjb25zdCBjaGFyICoqZXJyb3Jfc3RyaW5nKTsKKworLyoqIEluY3JlYXNlIHJlZmVyZW5jZSBjb3VudGVyIG9mIHRoZSBzcGVjaWZpZWQgYnJvd3NlciBvYmplY3QgKi8KK3BhX2Jyb3dzZXIgKnBhX2Jyb3dzZXJfcmVmKHBhX2Jyb3dzZXIgKnopOworCisvKiogRGVjcmVhc2UgcmVmZXJlbmNlIGNvdW50ZXIgb2YgdGhlIHNwZWNpZmllZCBicm93c2VyIG9iamVjdCAqLwordm9pZCBwYV9icm93c2VyX3VucmVmKHBhX2Jyb3dzZXIgKnopOworCisvKiogSW5mb3JtYXRpb24gYWJvdXQgYSBzaW5rL3NvdXJjZS9zZXJ2ZXIgZm91bmQgd2l0aCBaZXJvY29uZiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfYnJvd3NlX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAvKio8IFVuaXF1ZSBzZXJ2aWNlIG5hbWU7IGFsd2F5cyBhdmFpbGFibGUgKi8KKworICAgIGNvbnN0IGNoYXIgKnNlcnZlcjsgLyoqPCBTZXJ2ZXIgbmFtZTsgYWx3YXlzIGF2YWlsYWJsZSAqLworICAgIGNvbnN0IGNoYXIgKnNlcnZlcl92ZXJzaW9uOyAvKio8IFNlcnZlciB2ZXJzaW9uIHN0cmluZzsgb3B0aW9uYWwgKi8KKyAgICBjb25zdCBjaGFyICp1c2VyX25hbWU7IC8qKjwgVXNlciBuYW1lIG9mIHRoZSBzZXJ2ZXIgcHJvY2Vzczsgb3B0aW9uYWwgKi8KKyAgICBjb25zdCBjaGFyICpmcWRuOyAvKiBTZXJ2ZXIgdmVyc2lvbjsgb3B0aW9uYWwgKi8KKyAgICBjb25zdCB1aW50MzJfdCAqY29va2llOyAgLyogU2VydmVyIGNvb2tpZTsgb3B0aW9uYWwgKi8KKworICAgIGNvbnN0IGNoYXIgKmRldmljZTsgLyogRGV2aWNlIG5hbWU7IGFsd2F5cyBhdmFpbGFibGUgd2hlbiB0aGlzIGluZm9ybWF0aW9uIGlzIG9mIGEgc2luay9zb3VyY2UgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgIC8qIERldmljZSBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgKi8KKyAgICBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc2FtcGxlX3NwZWM7ICAvKiBTYW1wbGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZGV2aWNlOyBvcHRpb25hbCAqLworfSBwYV9icm93c2VfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSAqLwordHlwZWRlZiB2b2lkICgqcGFfYnJvd3NlX2NiX3QpKHBhX2Jyb3dzZXIgKnosIHBhX2Jyb3dzZV9vcGNvZGVfdCBjLCBjb25zdCBwYV9icm93c2VfaW5mbyAqaSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBwb2ludGVyIGZvciB0aGUgYnJvd3NlciBvYmplY3QgKi8KK3ZvaWQgcGFfYnJvd3Nlcl9zZXRfY2FsbGJhY2socGFfYnJvd3NlciAqeiwgcGFfYnJvd3NlX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgZXJyb3JzICovCit0eXBlZGVmIHZvaWQgKCpwYV9icm93c2VyX2Vycm9yX2NiX3QpKHBhX2Jyb3dzZXIgKnosIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZywgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGJyb3dzZXIgb2JqZWN0CisgKiBiZWNvbWVzIGludmFsaWQgZHVlIHRvIGFuIGVycm9yLiBBZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuCisgKiBjYWxsZWQgdGhlIGJyb3dzZXIgb2JqZWN0IGhhcyBiZWNvbWUgaW52YWxpZCBhbmQgc2hvdWxkIGJlCisgKiBmcmVlZC4gKi8KK3ZvaWQgcGFfYnJvd3Nlcl9zZXRfZXJyb3JfY2FsbGJhY2socGFfYnJvd3NlciAqeiwgcGFfYnJvd3Nlcl9lcnJvcl9jYl90LCB2b2lkICp1c2VyZGF0YSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NkZWNsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NkZWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmMTkxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvY2RlY2wuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIGZvb3B1bHNlY2RlY2xoZm9vCisjZGVmaW5lIGZvb3B1bHNlY2RlY2xoZm9vCisKKy8qICRJZDogY2RlY2wuaCAxOTcxIDIwMDctMTAtMjggMTk6MTM6NTBaIGxlbm5hcnQgJCAqLworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisvKiogXGZpbGUKKyAqIEMrKyBjb21wYXRpYmlsaXR5IHN1cHBvcnQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisvKiogSWYgdXNpbmcgQysrIHRoaXMgbWFjcm8gZW5hYmxlcyBDIG1vZGUsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcgKi8KKyNkZWZpbmUgUEFfQ19ERUNMX0JFR0lOIGV4dGVybiAiQyIgeworLyoqIElmIHVzaW5nIEMrKyB0aGlzIG1hY3JvcyBzd2l0Y2hlcyBiYWNrIHRvIEMrKyBtb2RlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nICovCisjZGVmaW5lIFBBX0NfREVDTF9FTkQgfQorCisjZWxzZQorLyoqIElmIHVzaW5nIEMrKyB0aGlzIG1hY3JvIGVuYWJsZXMgQyBtb2RlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nICovCisjZGVmaW5lIFBBX0NfREVDTF9CRUdJTgorLyoqIElmIHVzaW5nIEMrKyB0aGlzIG1hY3JvcyBzd2l0Y2hlcyBiYWNrIHRvIEMrKyBtb2RlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nICovCisjZGVmaW5lIFBBX0NfREVDTF9FTkQKKworI2VuZGlmCisKKyNpZm5kZWYgUEFfR0NDX1BVUkUKKyNpZmRlZiBfX0dOVUNDX18KKyNkZWZpbmUgUEFfR0NDX1BVUkUgX19hdHRyaWJ1dGVfXyAoKHB1cmUpKQorI2Vsc2UKKy8qKiBUaGlzIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGRlcGVuZHMgb25seSB0aGUgYXJndW1lbnRzIGxpc3QgYW5kIGdsb2JhbCBzdGF0ZSAqKi8KKyNkZWZpbmUgUEFfR0NDX1BVUkUKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgUEFfR0NDX0NPTlNUCisjaWZkZWYgX19HTlVDQ19fCisjZGVmaW5lIFBBX0dDQ19DT05TVCBfX2F0dHJpYnV0ZV9fICgocHVyZSkpCisjZWxzZQorLyoqIFRoaXMgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbmx5IHRoZSBhcmd1bWVudHMgbGlzdCAoc3RyaWN0ZXIgdmVyc2lvbiBvZiBQQV9HQ0NfQ09OU1QpICoqLworI2RlZmluZSBQQV9HQ0NfQ09OU1QKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jaGFubmVsbWFwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NoYW5uZWxtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjhkMmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jaGFubmVsbWFwLmgKQEAgLTAsMCArMSwxOTcgQEAKKyNpZm5kZWYgZm9vY2hhbm5lbG1hcGhmb28KKyNkZWZpbmUgZm9vY2hhbm5lbG1hcGhmb28KKworLyogJElkOiBjaGFubmVsbWFwLmggMTk3MSAyMDA3LTEwLTI4IDE5OjEzOjUwWiBsZW5uYXJ0ICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA1LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxwYWdlIGNoYW5uZWxtYXAgQ2hhbm5lbCBNYXBzCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogQ2hhbm5lbCBtYXBzIHByb3ZpZGUgYSB3YXkgdG8gYXNzb2NpYXRlIGNoYW5uZWxzIGluIGEgc3RyZWFtIHdpdGggYQorICogc3BlY2lmaWMgc3BlYWtlciBwb3NpdGlvbi4gVGhpcyByZWxpZXZlcyBhcHBsaWNhdGlvbnMgb2YgaGF2aW5nIHRvCisgKiBtYWtlIHN1cmUgdGhlaXIgY2hhbm5lbCBvcmRlciBpcyBpZGVudGljYWwgdG8gdGhlIGZpbmFsIG91dHB1dC4KKyAqCisgKiBcc2VjdGlvbiBpbml0X3NlYyBJbml0aWFsaXNhdGlvbgorICoKKyAqIEEgY2hhbm5lbCBtYXAgY29uc2lzdHMgb2YgYW4gYXJyYXkgb2YgXHJlZiBwYV9jaGFubmVsX3Bvc2l0aW9uIHZhbHVlcywKKyAqIG9uZSBmb3IgZWFjaCBjaGFubmVsLiBUaGlzIGFycmF5IGlzIHN0b3JlZCB0b2dldGhlciB3aXRoIGEgY2hhbm5lbCBjb3VudAorICogaW4gYSBwYV9jaGFubmVsX21hcCBzdHJ1Y3R1cmUuCisgKgorICogQmVmb3JlIGZpbGxpbmcgdGhlIHN0cnVjdHVyZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGlzZSBpdCB1c2luZworICogcGFfY2hhbm5lbF9tYXBfaW5pdCgpLiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAqIGZvciBzdGFuZGFyZCBjaGFubmVsIG1hcHBpbmdzOgorICoKKyAqIFxsaSBwYV9jaGFubmVsX21hcF9pbml0X21vbm8oKSAtIENyZWF0ZSBhIGNoYW5uZWwgbWFwIHdpdGggb25seSBtb25vIGF1ZGlvLgorICogXGxpIHBhX2NoYW5uZWxfbWFwX2luaXRfc3RlcmVvKCkgLSBDcmVhdGUgYSBzdGFuZGFyZCBzdGVyZW8gbWFwcGluZy4KKyAqIFxsaSBwYV9jaGFubmVsX21hcF9pbml0X2F1dG8oKSAtIENyZWF0ZSBhIHN0YW5kYXJkIGNoYW5uZWwgbWFwIGZvciB1cCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l4IGNoYW5uZWxzLgorICoKKyAqIFxzZWN0aW9uIGNvbnZfc2VjIENvbnZlbmllbmNlIEZ1bmN0aW9ucworICoKKyAqIFRoZSBsaWJyYXJ5IGNvbnRhaW5zIGEgbnVtYmVyIG9mIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoCisgKiBjaGFubmVsIG1hcHM6CisgKgorICogXGxpIHBhX2NoYW5uZWxfbWFwX3ZhbGlkKCkgLSBUZXN0cyBpZiBhIGNoYW5uZWwgbWFwIGlzIHZhbGlkLgorICogXGxpIHBhX2NoYW5uZWxfbWFwX2VxdWFsKCkgLSBUZXN0cyBpZiB0d28gY2hhbm5lbCBtYXBzIGFyZSBpZGVudGljYWwuCisgKiBcbGkgcGFfY2hhbm5lbF9tYXBfc25wcmludCgpIC0gQ3JlYXRlcyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLgorICovCisKKy8qKiBcZmlsZQorICogQ29uc3RhbnRzIGFuZCByb3V0aW5lcyBmb3IgY2hhbm5lbCBtYXBwaW5nIGhhbmRsaW5nICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQSBsaXN0IG9mIGNoYW5uZWwgbGFiZWxzICovCit0eXBlZGVmIGVudW0gcGFfY2hhbm5lbF9wb3NpdGlvbiB7CisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9JTlZBTElEID0gLTEsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9NT05PID0gMCwKKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fTEVGVCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1JJR0hULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQ0VOVEVSLAorCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9GUk9OVF9MRUZUID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9MRUZULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFQgPSBQQV9DSEFOTkVMX1BPU0lUSU9OX1JJR0hULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfQ0VOVEVSID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9DRU5URVIsCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1JFQVJfQ0VOVEVSLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9MRUZULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fUkVBUl9SSUdIVCwKKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fTEZFLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fU1VCV09PRkVSID0gUEFfQ0hBTk5FTF9QT1NJVElPTl9MRkUsCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0ZST05UX0xFRlRfT0ZfQ0VOVEVSLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fRlJPTlRfUklHSFRfT0ZfQ0VOVEVSLAorCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX0xFRlQsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9TSURFX1JJR0hULAorCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgwLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgzLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDUsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg2LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYNywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDgsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVg5LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTAsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxMSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDEyLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTMsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE1LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTYsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgxNywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDE4LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMTksCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDIxLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjIsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyMywKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI0LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjUsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyNiwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDI3LAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMjgsCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9BVVgyOSwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX0FVWDMwLAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fQVVYMzEsCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9DRU5URVIsCisKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9GUk9OVF9MRUZULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX1JJR0hULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX0ZST05UX0NFTlRFUiwKKworICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfTEVGVCwKKyAgICBQQV9DSEFOTkVMX1BPU0lUSU9OX1RPUF9SRUFSX1JJR0hULAorICAgIFBBX0NIQU5ORUxfUE9TSVRJT05fVE9QX1JFQVJfQ0VOVEVSLAorCisgICAgUEFfQ0hBTk5FTF9QT1NJVElPTl9NQVgKK30gcGFfY2hhbm5lbF9wb3NpdGlvbl90OworCisvKiogQSBsaXN0IG9mIGNoYW5uZWwgbWFwcGluZyBkZWZpbml0aW9ucyBmb3IgcGFfY2hhbm5lbF9tYXBfaW5pdF9hdXRvKCkgKi8KK3R5cGVkZWYgZW51bSBwYV9jaGFubmVsX21hcF9kZWYgeworICAgIFBBX0NIQU5ORUxfTUFQX0FJRkYsICAgLyoqPCBUaGUgbWFwcGluZyBmcm9tIFJGQzM1NTEsIHdoaWNoIGlzIGJhc2VkIG9uIEFJRkYtQyAqLworICAgIFBBX0NIQU5ORUxfTUFQX0FMU0EsICAgLyoqPCBUaGUgZGVmYXVsdCBtYXBwaW5nIHVzZWQgYnkgQUxTQSAqLworICAgIFBBX0NIQU5ORUxfTUFQX0FVWCwgICAgLyoqPCBPbmx5IGF1eCBjaGFubmVscyAqLworICAgIFBBX0NIQU5ORUxfTUFQX1dBVkVFWCwgLyoqPCBNaWNyb3NvZnQncyBXQVZFRk9STUFURVhURU5TSUJMRSBtYXBwaW5nICovCisgICAgUEFfQ0hBTk5FTF9NQVBfT1NTLCAgICAvKio8IFRoZSBkZWZhdWx0IGNoYW5uZWwgbWFwcGluZyB1c2VkIGJ5IE9TUyBhcyBkZWZpbmVkIGluIHRoZSBPU1MgNC4wIEFQSSBzcGVjcyAqLworCisgICAgUEFfQ0hBTk5FTF9NQVBfREVGQVVMVCA9IFBBX0NIQU5ORUxfTUFQX0FJRkYgLyoqPCBUaGUgZGVmYXVsdCBjaGFubmVsIG1hcCAqLworfSBwYV9jaGFubmVsX21hcF9kZWZfdDsKKworLyoqIEEgY2hhbm5lbCBtYXAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGxhYmVscyB0byBzcGVjaWZpYworICogY2hhbm5lbHMgb2YgYSBzdHJlYW0uIFRoZXNlIHZhbHVlcyBhcmUgcmVsZXZhbnQgZm9yIGNvbnZlcnNpb24gYW5kCisgKiBtaXhpbmcgb2Ygc3RyZWFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY2hhbm5lbF9tYXAgeworICAgIHVpbnQ4X3QgY2hhbm5lbHM7IC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgcGFfY2hhbm5lbF9wb3NpdGlvbl90IG1hcFtQQV9DSEFOTkVMU19NQVhdOyAvKio8IENoYW5uZWwgbGFiZWxzICovCit9IHBhX2NoYW5uZWxfbWFwOworCisvKiogSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgbWFwIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0ICovCitwYV9jaGFubmVsX21hcCogcGFfY2hhbm5lbF9tYXBfaW5pdChwYV9jaGFubmVsX21hcCAqbSk7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgZm9yIG1vbm9hdXJhbCBhdWRpbyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdCAqLworcGFfY2hhbm5lbF9tYXAqIHBhX2NoYW5uZWxfbWFwX2luaXRfbW9ubyhwYV9jaGFubmVsX21hcCAqbSk7CisKKy8qKiBJbml0aWFsaXplIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgZm9yIHN0ZXJlb3Bob25pYyBhdWRpbyBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdCAqLworcGFfY2hhbm5lbF9tYXAqIHBhX2NoYW5uZWxfbWFwX2luaXRfc3RlcmVvKHBhX2NoYW5uZWxfbWFwICptKTsKKworLyoqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIKKyAqIG9mIGNoYW5uZWxzIHVzaW5nIGRlZmF1bHQgbGFiZWxzIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAqLworcGFfY2hhbm5lbF9tYXAqIHBhX2NoYW5uZWxfbWFwX2luaXRfYXV0byhwYV9jaGFubmVsX21hcCAqbSwgdW5zaWduZWQgY2hhbm5lbHMsIHBhX2NoYW5uZWxfbWFwX2RlZl90IGRlZik7CisKKy8qKiBSZXR1cm4gYSB0ZXh0IGxhYmVsIGZvciB0aGUgc3BlY2lmaWVkIGNoYW5uZWwgcG9zaXRpb24gKi8KK2NvbnN0IGNoYXIqIHBhX2NoYW5uZWxfcG9zaXRpb25fdG9fc3RyaW5nKHBhX2NoYW5uZWxfcG9zaXRpb25fdCBwb3MpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgdGV4dCBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsIHBvc2l0aW9uLiBcc2luY2UgMC45LjcgKi8KK2NvbnN0IGNoYXIqIHBhX2NoYW5uZWxfcG9zaXRpb25fdG9fcHJldHR5X3N0cmluZyhwYV9jaGFubmVsX3Bvc2l0aW9uX3QgcG9zKTsKKworLyoqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzdHJpbmdzIHJldHVybmVkIGJ5IHBhX2NoYW5uZWxfbWFwX3NucHJpbnQoKSAqLworI2RlZmluZSBQQV9DSEFOTkVMX01BUF9TTlBSSU5UX01BWCAzMzYKKworLyoqIE1ha2UgYSBodW1hbmQgcmVhZGFibGUgc3RyaW5nIGZyb20gdGhlIHNwZWNpZmllZCBjaGFubmVsIG1hcCAqLworY2hhciogcGFfY2hhbm5lbF9tYXBfc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCk7CisKKy8qKiBQYXJzZSBhIGNoYW5uZWwgcG9zaXRpb24gbGlzdCBpbnRvIGEgY2hhbm5lbCBtYXAgc3RydWN0dXJlLiBcc2luY2UgMC44LjEgKi8KK3BhX2NoYW5uZWxfbWFwICpwYV9jaGFubmVsX21hcF9wYXJzZShwYV9jaGFubmVsX21hcCAqbWFwLCBjb25zdCBjaGFyICpzKTsKKworLyoqIENvbXBhcmUgdHdvIGNoYW5uZWwgbWFwcy4gUmV0dXJuIDEgaWYgYm90aCBtYXRjaC4gKi8KK2ludCBwYV9jaGFubmVsX21hcF9lcXVhbChjb25zdCBwYV9jaGFubmVsX21hcCAqYSwgY29uc3QgcGFfY2hhbm5lbF9tYXAgKmIpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIG5vbi16ZXJvIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBtYXAgaXMgY29uc2lkZXJlZCB2YWxpZCAqLworaW50IHBhX2NoYW5uZWxfbWFwX3ZhbGlkKGNvbnN0IHBhX2NoYW5uZWxfbWFwICptYXApIFBBX0dDQ19QVVJFOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jb250ZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU5OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9jb250ZXh0LmgKQEAgLTAsMCArMSwyMzMgQEAKKyNpZm5kZWYgZm9vY29udGV4dGhmb28KKyNkZWZpbmUgZm9vY29udGV4dGhmb28KKworLyogJElkOiBjb250ZXh0LmggMTQyNiAyMDA3LTAyLTEzIDE1OjM1OjE5WiBvc3NtYW4gJCAqLworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorCisvKiogXHBhZ2UgYXN5bmMgQXN5bmNocm9ub3VzIEFQSQorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBhc3luY2hyb25vdXMgQVBJIGlzIHRoZSBuYXRpdmUgaW50ZXJmYWNlIHRvIHRoZSBQdWxzZUF1ZGlvIGxpYnJhcnkuCisgKiBJdCBhbGxvd3MgZnVsbCBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBmdW5jdGlvbnMuIFRoaXMgYWxzbyBtZWFucyB0aGF0CisgKiBpdCBpcyByYXRoZXIgY29tcGxleCBhbmQgY2FuIHRha2Ugc29tZSB0aW1lIHRvIGZ1bGx5IG1hc3Rlci4KKyAqCisgKiBcc2VjdGlvbiBtYWlubG9vcF9zZWMgTWFpbiBMb29wIEFic3RyYWN0aW9uCisgKgorICogVGhlIEFQSSBpcyBiYXNlZCBhcm91bmQgYW4gYXN5bmNocm9ub3VzIGV2ZW50IGxvb3AsIG9yIG1haW4gbG9vcCwKKyAqIGFic3RyYWN0aW9uLiBUaGlzIGFic3RyYWN0aW9uIGNvbnRhaW5zIHRocmVlIGJhc2ljIGVsZW1lbnRzOgorICoKKyAqIFxsaSBEZWZlcnJlZCBldmVudHMgLSBFdmVudHMgdGhhdCB3aWxsIHRyaWdnZXIgYXMgc29vbiBhcyBwb3NzaWJsZS4gTm90ZQorICogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgc29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGJsb2NrIGFsbCBvdGhlciBldmVudHMKKyAqICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgZGVmZXJyZWQgZXZlbnQgaXMgYWN0aXZlLgorICogXGxpIEkvTyBldmVudHMgLSBFdmVudHMgdGhhdCB0cmlnZ2VyIG9uIGZpbGUgZGVzY3JpcHRvciBhY3Rpdml0aWVzLgorICogXGxpIFRpbWVzIGV2ZW50cyAtIEV2ZW50cyB0aGF0IHRyaWdnZXIgYWZ0ZXIgYSBmaXhlZCBhbW1vdW50IG9mIHRpbWUuCisgKgorICogVGhlIGFic3RyYWN0aW9uIGlzIHJlcHJlc2VudGVkIGFzIGEgbnVtYmVyIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGluIHRoZQorICogcGFfbWFpbmxvb3BfYXBpIHN0cnVjdHVyZS4KKyAqCisgKiBUbyBhY3R1YWxseSBiZSBhYmxlIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMsIGFuIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvCisgKiBiZSBjb3VwbGVkIHRvIHRoZSBhYnN0cmFjdGlvbi4gVGhlcmUgYXJlIHRocmVlIG9mIHRoZXNlIHNoaXBwZWQgd2l0aAorICogUHVsc2VBdWRpbywgYnV0IGFueSBvdGhlciBjYW4gYmUgdXNlZCB3aXRoIGEgbWluaW1hbCBhbW1vdW50IG9mIHdvcmssCisgKiBwcm92aWRlZCBpdCBzdXBwb3J0cyB0aGUgdGhyZWUgYmFzaWMgZXZlbnRzIGxpc3RlZCBhYm92ZS4KKyAqCisgKiBUaGUgaW1wbGVtZW50YXRpb25zIHNoaXBwZWQgd2l0aCBQdWxzZUF1ZGlvIGFyZToKKyAqCisgKiBcbGkgXHN1YnBhZ2UgbWFpbmxvb3AgLSBBIG1pbmltYWwgYnV0IGZhc3QgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gcG9sbCgpLgorICogXGxpIFxzdWJwYWdlIHRocmVhZGVkX21haW5sb29wIC0gQSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHByZXZpb3VzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgb2YgUHVsc2VBdWRpbydzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBoYW5kbGluZyBydW5zIGluIGEgc2VwYXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC4KKyAqIFxsaSBcc3VicGFnZSBnbGliLW1haW5sb29wIC0gQSB3cmFwcGVyIGFyb3VuZCBHTElCJ3MgbWFpbiBsb29wLiBBdmFpbGFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGJvdGggR0xJQiAxLjIgYW5kIEdMSUIgMi54LgorICoKKyAqIFVOSVggc2lnbmFscyBtYXkgYmUgaG9va2VkIHRvIGEgbWFpbiBsb29wIHVzaW5nIHRoZSBmdW5jdGlvbnMgZnJvbQorICogXHJlZiBtYWlubG9vcC1zaWduYWwuaC4gVGhlc2UgcmVseSBvbmx5IG9uIHRoZSBtYWluIGxvb3AgYWJzdHJhY3Rpb24KKyAqIGFuZCBjYW4gdGhlcmVmb3JlIGJlIHVzZWQgd2l0aCBhbnkgb2YgdGhlIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBcc2VjdGlvbiByZWZjbnRfc2VjIFJlZmVyZW5jZSBDb3VudGluZworICoKKyAqIEFsbW9zdCBhbGwgb2JqZWN0cyBpbiBQdWxzZUF1ZGlvIGFyZSByZWZlcmVuY2UgY291bnRlZC4gV2hhdCB0aGF0IG1lYW5zCisgKiBpcyB0aGF0IHlvdSByYXJlbHkgbWFsbG9jKCkgb3IgZnJlZSgpIGFueSBvYmplY3RzLiBJbnN0ZWFkIHlvdSBpbmNyZWFzZQorICogYW5kIGRlY3JlYXNlIHRoZWlyIHJlZmVyZW5jZSBjb3VudHMuIFdoZW5ldmVyIGFuIG9iamVjdCdzIHJlZmVyZW5jZQorICogY291bnQgcmVhY2hlcyB6ZXJvLCB0aGF0IG9iamVjdCBnZXRzIGRlc3Ryb3kgYW5kIGFueSByZXNvdXJjZXMgaXQgdXNlcworICogZ2V0IGZyZWVkLgorICoKKyAqIFRoZSBiZW5lZml0IG9mIHRoaXMgZGVzaWduIGlzIHRoYXQgYW4gYXBwbGljYXRpb24gbmVlZCBub3Qgd29ycnkgYWJvdXQKKyAqIHdoZXRoZXIgb3Igbm90IGl0IG5lZWRzIHRvIGtlZXAgYW4gb2JqZWN0IGFyb3VuZCBpbiBjYXNlIHRoZSBsaWJyYXJ5IGlzCisgKiB1c2luZyBpdCBpbnRlcm5hbGx5LiBJZiBpdCBpcywgdGhlbiBpdCBoYXMgbWFkZSBzdXJlIGl0IGhhcyBpdHMgb3duCisgKiByZWZlcmVuY2UgdG8gaXQuCisgKgorICogV2hlbmV2ZXIgdGhlIGxpYnJhcnkgY3JlYXRlcyBhbiBvYmplY3QsIGl0IHdpbGwgaGF2ZSBhbiBpbml0aWFsCisgKiByZWZlcmVuY2UgY291bnQgb2Ygb25lLiBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIHNpbmdsZSByZWZlcmVuY2Ugd2lsbCBiZQorICogc3VmZmljaWVudCBmb3IgdGhlIGFwcGxpY2F0aW9uLCBzbyBhbGwgcmVxdWlyZWQgcmVmZXJlbmNlIGNvdW50CisgKiBpbnRlcmFjdGlvbiB3aWxsIGJlIGEgc2luZ2xlIGNhbGwgdG8gdGhlIG9iamVjdHMgdW5yZWYgZnVuY3Rpb24uCisgKgorICogXHNlY3Rpb24gY29udGV4dF9zZWMgQ29udGV4dAorICoKKyAqIEEgY29udGV4dCBpcyB0aGUgYmFzaWMgb2JqZWN0IGZvciBhIGNvbm5lY3Rpb24gdG8gYSBQdWxzZUF1ZGlvIHNlcnZlci4KKyAqIEl0IG11bHRpcGxleGVzIGNvbW1hbmRzLCBkYXRhIHN0cmVhbXMgYW5kIGV2ZW50cyB0aHJvdWdoIGEgc2luZ2xlCisgKiBjaGFubmVsLgorICoKKyAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIG1vcmUgdGhhbiBvbmUgY29udGV4dCBwZXIgYXBwbGljYXRpb24sIHVubGVzcworICogY29ubmVjdGlvbnMgdG8gbXVsdGlwbGUgc2VydmVycyBhcmUgbmVlZGVkLgorICoKKyAqIFxzdWJzZWN0aW9uIG9wc19zdWJzZWMgT3BlcmF0aW9ucworICoKKyAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSBjb250ZXh0IGFyZSBwZXJmb3JtZWQgYXN5bmNocm9ub3VzbHkuIEkuZS4gdGhlCisgKiBjbGllbnQgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIHNlcnZlciB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdC4gVG8ga2VlcAorICogdHJhY2sgb2YgYWxsIHRoZXNlIGluLWZsaWdodCBvcGVyYXRpb25zLCB0aGUgYXBwbGljYXRpb24gaXMgZ2l2ZW4gYQorICogcGFfb3BlcmF0aW9uIG9iamVjdCBmb3IgZWFjaCBhc3luY2hyb25vdXMgb3BlcmF0aW9uLgorICoKKyAqIFRoZXJlIGFyZSBvbmx5IHR3byBhY3Rpb25zIChiZXNpZGVzIHJlZmVyZW5jZSBjb3VudGluZykgdGhhdCBjYW4gYmUKKyAqIHBlcmZvcm1lZCBvbiBhIHBhX29wZXJhdGlvbjogcXVlcnlpbmcgaXRzIHN0YXRlIHdpdGgKKyAqIHBhX29wZXJhdGlvbl9nZXRfc3RhdGUoKSBhbmQgYWJvcnRpbmcgaXQgd2l0aCBwYV9vcGVyYXRpb25fY2FuY2VsKCkuCisgKgorICogQSBwYV9vcGVyYXRpb24gb2JqZWN0IGlzIHJlZmVyZW5jZSBjb3VudGVkLCBzbyBhbiBhcHBsaWNhdGlvbiBtdXN0CisgKiBtYWtlIHN1cmUgdG8gdW5yZWZlcmVuY2UgaXQsIGV2ZW4gaWYgaXQgaGFzIG5vIGludGVudGlvbiBvZiB1c2luZyBpdC4KKyAqCisgKiBcc3Vic2VjdGlvbiBjb25uX3N1YnNlYyBDb25uZWN0aW5nCisgKgorICogQSBjb250ZXh0IG11c3QgYmUgY29ubmVjdGVkIHRvIGEgc2VydmVyIGJlZm9yZSBhbnkgb3BlcmF0aW9uIGNhbiBiZQorICogaXNzdWVkLiBDYWxsaW5nIHBhX2NvbnRleHRfY29ubmVjdCgpIHdpbGwgaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24KKyAqIHByb2NlZHVyZS4gVW5saWtlIG1vc3QgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIGNvbm5lY3RpbmcgZG9lcyBub3QKKyAqIHJlc3VsdCBpbiBhIHBhX29wZXJhdGlvbiBvYmplY3QuIEluc3RlYWQsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKKyAqIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdXNpbmcgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2soKS4KKyAqCisgKiBcc3Vic2VjdGlvbiBkaXNjX3N1YnNlYyBEaXNjb25uZWN0aW5nCisgKgorICogV2hlbiB0aGUgc291bmQgc3VwcG9ydCBpcyBubyBsb25nZXIgbmVlZGVkLCB0aGUgY29ubmVjdGlvbiBuZWVkcyB0byBiZQorICogY2xvc2VkIHVzaW5nIHBhX2NvbnRleHRfZGlzY29ubmVjdCgpLiBUaGlzIGlzIGFuIGltbWVkaWF0ZSBmdW5jdGlvbiB0aGF0CisgKiB3b3JrcyBzeW5jaHJvbm91c2x5LgorICoKKyAqIFNpbmNlIHRoZSBjb250ZXh0IG9iamVjdCBoYXMgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzIGl0IG11c3QgYmUKKyAqIGRpc2Nvbm5lY3RlZCBhZnRlciB1c2Ugb3IgdGhlcmUgaXMgYSBoaWdoIHJpc2sgb2YgbWVtb3J5IGxlYWtzLiBJZiB0aGUKKyAqIGNvbm5lY3Rpb24gaGFzIHRlcm1pbmF0ZWQgYnkgaXRzZWxmLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXhwbGljaXRseQorICogZGlzY29ubmVjdCB0aGUgY29udGV4dCB1c2luZyBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QoKS4KKyAqCisgKiBcc2VjdGlvbiBGdW5jdGlvbnMKKyAqCisgKiBUaGUgc291bmQgc2VydmVyJ3MgZnVuY3Rpb25hbGl0eSBjYW4gYmUgZGl2aWRlZCBpbnRvIGEgbnVtYmVyIG9mCisgKiBzdWJzZWN0aW9uczoKKyAqCisgKiBcbGkgXHN1YnBhZ2Ugc3RyZWFtcworICogXGxpIFxzdWJwYWdlIHNjYWNoZQorICogXGxpIFxzdWJwYWdlIGludHJvc3BlY3QKKyAqIFxsaSBcc3VicGFnZSBzdWJzY3JpYmUKKyAqLworCisvKiogXGZpbGUKKyAqIENvbm5lY3Rpb24gY29udGV4dHMgZm9yIGFzeW5jaHJvbm9ub3VzIGNvbW11bmljYXRpb24gd2l0aCBhCisgKiBzZXJ2ZXIuIEEgcGFfY29udGV4dCBvYmplY3Qgd3JhcHMgYSBjb25uZWN0aW9uIHRvIGEgUHVsc2VBdWRpbworICogc2VydmVyIHVzaW5nIGl0cyBuYXRpdmUgcHJvdG9jb2wuICovCisKKy8qKiBcZXhhbXBsZSBwYWNhdC5jCisgKiBBIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgdG9vbCB1c2luZyB0aGUgYXN5bmNocm9ub3VzIEFQSSAqLworCisvKiogXGV4YW1wbGUgcGFwbGF5LmMKKyAqIEEgc291bmQgZmlsZSBwbGF5YmFjayB0b29sIHVzaW5nIHRoZSBhc3luY2hyb25vdXMgQVBJLCBiYXNlZCBvbiBsaWJzbmRmaWxlICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQW4gb3BhcXVlIGNvbm5lY3Rpb24gY29udGV4dCB0byBhIGRhZW1vbiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY29udGV4dCBwYV9jb250ZXh0OworCisvKiogR2VuZXJpYyBub3RpZmljYXRpb24gY2FsbGJhY2sgcHJvdG90eXBlICovCit0eXBlZGVmIHZvaWQgKCpwYV9jb250ZXh0X25vdGlmeV9jYl90KShwYV9jb250ZXh0ICpjLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBIGdlbmVyaWMgY2FsbGJhY2sgZm9yIG9wZXJhdGlvbiBjb21wbGV0aW9uICovCit0eXBlZGVmIHZvaWQgKCpwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCkgKHBhX2NvbnRleHQgKmMsIGludCBzdWNjZXNzLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBJbnN0YW50aWF0ZSBhIG5ldyBjb25uZWN0aW9uIGNvbnRleHQgd2l0aCBhbiBhYnN0cmFjdCBtYWlubG9vcCBBUEkKKyAqIGFuZCBhbiBhcHBsaWNhdGlvbiBuYW1lICovCitwYV9jb250ZXh0ICpwYV9jb250ZXh0X25ldyhwYV9tYWlubG9vcF9hcGkgKm1haW5sb29wLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqIERlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlciBvZiB0aGUgY29udGV4dCBieSBvbmUgKi8KK3ZvaWQgcGFfY29udGV4dF91bnJlZihwYV9jb250ZXh0ICpjKTsKKworLyoqIEluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlciBvZiB0aGUgY29udGV4dCBieSBvbmUgKi8KK3BhX2NvbnRleHQqIHBhX2NvbnRleHRfcmVmKHBhX2NvbnRleHQgKmMpOworCisvKiogU2V0IGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbnRleHQgc3RhdHVzIGNoYW5nZXMgKi8KK3ZvaWQgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2socGFfY29udGV4dCAqYywgcGFfY29udGV4dF9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIHRoZSBlcnJvciBudW1iZXIgb2YgdGhlIGxhc3QgZmFpbGVkIG9wZXJhdGlvbiAqLworaW50IHBhX2NvbnRleHRfZXJybm8ocGFfY29udGV4dCAqYyk7CisKKy8qKiBSZXR1cm4gbm9uLXplcm8gaWYgc29tZSBkYXRhIGlzIHBlbmRpbmcgdG8gYmUgd3JpdHRlbiB0byB0aGUgY29ubmVjdGlvbiAqLworaW50IHBhX2NvbnRleHRfaXNfcGVuZGluZyhwYV9jb250ZXh0ICpjKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBjb250ZXh0IHN0YXR1cyAqLworcGFfY29udGV4dF9zdGF0ZV90IHBhX2NvbnRleHRfZ2V0X3N0YXRlKHBhX2NvbnRleHQgKmMpOworCisvKiogQ29ubmVjdCB0aGUgY29udGV4dCB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4gSWYgc2VydmVyIGlzIE5VTEwsCitjb25uZWN0IHRvIHRoZSBkZWZhdWx0IHNlcnZlci4gVGhpcyByb3V0aW5lIG1heSBidXQgd2lsbCBub3QgYWx3YXlzCityZXR1cm4gc3luY2hyb25vdXNseSBvbiBlcnJvci4gVXNlIHBhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKCkgdG8KK2JlIG5vdGlmaWVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGZsYWdzIGRvZXNuJ3QgaGF2ZQorUEFfTk9BVVRPU1BBV04gc2V0IGFuZCBubyBzcGVjaWZpYyBzZXJ2ZXIgaXMgc3BlY2lmaWVkIG9yIGFjY2Vzc2libGUgYQorbmV3IGRhZW1vbiBpcyBzcGF3bmVkLiBJZiBhcGkgaXMgbm9uLU5VTEwsIHRoZSBmdW5jdGlvbnMgc3BlY2lmaWVkIGluCit0aGUgc3RydWN0dXJlIGFyZSB1c2VkIHdoZW4gZm9ya2luZyBhIG5ldyBjaGlsZCBwcm9jZXNzLiAqLworaW50IHBhX2NvbnRleHRfY29ubmVjdChwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpzZXJ2ZXIsIHBhX2NvbnRleHRfZmxhZ3NfdCBmbGFncywgY29uc3QgcGFfc3Bhd25fYXBpICphcGkpOworCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgKi8KK3ZvaWQgcGFfY29udGV4dF9kaXNjb25uZWN0KHBhX2NvbnRleHQgKmMpOworCisvKiogRHJhaW4gdGhlIGNvbnRleHQuIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZHJhaW4sIHRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9kcmFpbihwYV9jb250ZXh0ICpjLCBwYV9jb250ZXh0X25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBUZWxsIHRoZSBkYWVtb24gdG8gZXhpdC4gVGhlIHJldHVybmVkIG9wZXJhdGlvbiBpcyB1bmxpa2VseSB0bworICogY29tcGxldGUgc3VjY2VzZnVsbHksIHNpbmNlIHRoZSBkYWVtb24gcHJvYmFibHkgZGllZCBiZWZvcmUKKyAqIHJldHVybmluZyBhIHN1Y2Nlc3Mgbm90aWZpY2F0aW9uICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZXhpdF9kYWVtb24ocGFfY29udGV4dCAqYywgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBzaW5rLiBcc2luY2UgMC40ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X2RlZmF1bHRfc2luayhwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNvdXJjZS4gXHNpbmNlIDAuNCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9kZWZhdWx0X3NvdXJjZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJucyAxIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdG8gYSBsb2NhbCBkYWVtb24uIFJldHVybnMgbmVnYXRpdmUgd2hlbiBubyBjb25uZWN0aW9uIGhhcyBiZWVuIG1hZGUgeWV0LiBcc2luY2UgMC41ICovCitpbnQgcGFfY29udGV4dF9pc19sb2NhbChwYV9jb250ZXh0ICpjKTsKKworLyoqIFNldCBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBuYW1lIGZvciBjb250ZXh0IG9uIHRoZSBzZXJ2ZXIuIFxzaW5jZSAwLjUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIHRoZSBzZXJ2ZXIgbmFtZSB0aGlzIGNvbnRleHQgaXMgY29ubmVjdGVkIHRvLiBcc2luY2UgMC43ICovCitjb25zdCBjaGFyKiBwYV9jb250ZXh0X2dldF9zZXJ2ZXIocGFfY29udGV4dCAqYyk7CisKKy8qKiBSZXR1cm4gdGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFxzaW5jZSAwLjggKi8KK3VpbnQzMl90IHBhX2NvbnRleHRfZ2V0X3Byb3RvY29sX3ZlcnNpb24ocGFfY29udGV4dCAqYyk7CisKKy8qKiBSZXR1cm4gdGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RlZCBzZXJ2ZXIuIFxzaW5jZSAwLjggKi8KK3VpbnQzMl90IHBhX2NvbnRleHRfZ2V0X3NlcnZlcl9wcm90b2NvbF92ZXJzaW9uKHBhX2NvbnRleHQgKmMpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9kZWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhZDg2MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZGVmLmgKQEAgLTAsMCArMSwzOTcgQEAKKyNpZm5kZWYgZm9vZGVmaGZvbworI2RlZmluZSBmb29kZWZoZm9vCisKKy8qICRJZDogZGVmLmggMjA2NyAyMDA3LTExLTIxIDAxOjMwOjQwWiBsZW5uYXJ0ICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUKKyAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisKKy8qKiBcZmlsZQorICogR2xvYmFsIGRlZmluaXRpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogVGhlIHN0YXRlIG9mIGEgY29ubmVjdGlvbiBjb250ZXh0ICovCit0eXBlZGVmIGVudW0gcGFfY29udGV4dF9zdGF0ZSB7CisgICAgUEFfQ09OVEVYVF9VTkNPTk5FQ1RFRCwgICAgLyoqPCBUaGUgY29udGV4dCBoYXNuJ3QgYmVlbiBjb25uZWN0ZWQgeWV0ICovCisgICAgUEFfQ09OVEVYVF9DT05ORUNUSU5HLCAgICAgLyoqPCBBIGNvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQgKi8KKyAgICBQQV9DT05URVhUX0FVVEhPUklaSU5HLCAgICAvKio8IFRoZSBjbGllbnQgaXMgYXV0aG9yaXppbmcgaXRzZWxmIHRvIHRoZSBkYWVtb24gKi8KKyAgICBQQV9DT05URVhUX1NFVFRJTkdfTkFNRSwgICAvKio8IFRoZSBjbGllbnQgaXMgcGFzc2luZyBpdHMgYXBwbGljYXRpb24gbmFtZSB0byB0aGUgZGFlbW9uICovCisgICAgUEFfQ09OVEVYVF9SRUFEWSwgICAgICAgICAgLyoqPCBUaGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgdGhlIGNvbnRleHQgaXMgcmVhZHkgdG8gZXhlY3V0ZSBvcGVyYXRpb25zICovCisgICAgUEFfQ09OVEVYVF9GQUlMRUQsICAgICAgICAgLyoqPCBUaGUgY29ubmVjdGlvbiBmYWlsZWQgb3Igd2FzIGRpc2Nvbm5lY3RlZCAqLworICAgIFBBX0NPTlRFWFRfVEVSTUlOQVRFRCAgICAgIC8qKjwgVGhlIGNvbm5lY3Rpb24gd2FzIHRlcm1pbmF0ZWQgY2xlYW5seSAqLworfSBwYV9jb250ZXh0X3N0YXRlX3Q7CisKKy8qKiBUaGUgc3RhdGUgb2YgYSBzdHJlYW0gKi8KK3R5cGVkZWYgZW51bSBwYV9zdHJlYW1fc3RhdGUgeworICAgIFBBX1NUUkVBTV9VTkNPTk5FQ1RFRCwgLyoqPCBUaGUgc3RyZWFtIGlzIG5vdCB5ZXQgY29ubmVjdGVkIHRvIGFueSBzaW5rIG9yIHNvdXJjZSAqLworICAgIFBBX1NUUkVBTV9DUkVBVElORywgICAgIC8qKjwgVGhlIHN0cmVhbSBpcyBiZWluZyBjcmVhdGVkICovCisgICAgUEFfU1RSRUFNX1JFQURZLCAgICAgICAgLyoqPCBUaGUgc3RyZWFtIGlzIGVzdGFibGlzaGVkLCB5b3UgbWF5IHBhc3MgYXVkaW8gZGF0YSB0byBpdCBub3cgKi8KKyAgICBQQV9TVFJFQU1fRkFJTEVELCAgICAgICAvKio8IEFuIGVycm9yIG9jY3VyZWQgdGhhdCBtYWRlIHRoZSBzdHJlYW0gaW52YWxpZCAqLworICAgIFBBX1NUUkVBTV9URVJNSU5BVEVEICAgIC8qKjwgVGhlIHN0cmVhbSBoYXMgYmVlbiB0ZXJtaW5hdGVkIGNsZWFubHkgKi8KK30gcGFfc3RyZWFtX3N0YXRlX3Q7CisKKy8qKiBUaGUgc3RhdGUgb2YgYW4gb3BlcmF0aW9uICovCit0eXBlZGVmIGVudW0gcGFfb3BlcmF0aW9uX3N0YXRlIHsKKyAgICBQQV9PUEVSQVRJT05fUlVOTklORywgICAgICAvKio8IFRoZSBvcGVyYXRpb24gaXMgc3RpbGwgcnVubmluZyAqLworICAgIFBBX09QRVJBVElPTl9ET05FLCAgICAgICAgIC8qKjwgVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgKi8KKyAgICBQQV9PUEVSQVRJT05fQ0FOQ0VMRUQgICAgICAvKio8IFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsZWQgKi8KK30gcGFfb3BlcmF0aW9uX3N0YXRlX3Q7CisKKy8qKiBBbiBpbnZhbGlkIGluZGV4ICovCisjZGVmaW5lIFBBX0lOVkFMSURfSU5ERVggKCh1aW50MzJfdCkgLTEpCisKKy8qKiBTb21lIHNwZWNpYWwgZmxhZ3MgZm9yIGNvbnRleHRzLiBcc2luY2UgMC44ICovCit0eXBlZGVmIGVudW0gcGFfY29udGV4dF9mbGFncyB7CisgICAgUEFfQ09OVEVYVF9OT0FVVE9TUEFXTiA9IDEgLyoqPCBEaXNhYmxlZCBhdXRvc3Bhd25pbmcgb2YgdGhlIFB1bHNlQXVkaW8gZGFlbW9uIGlmIHJlcXVpcmVkICovCit9IHBhX2NvbnRleHRfZmxhZ3NfdDsKKworLyoqIFRoZSBkaXJlY3Rpb24gb2YgYSBwYV9zdHJlYW0gb2JqZWN0ICovCit0eXBlZGVmIGVudW0gcGFfc3RyZWFtX2RpcmVjdGlvbiB7CisgICAgUEFfU1RSRUFNX05PRElSRUNUSU9OLCAgIC8qKjwgSW52YWxpZCBkaXJlY3Rpb24gKi8KKyAgICBQQV9TVFJFQU1fUExBWUJBQ0ssICAgICAgLyoqPCBQbGF5YmFjayBzdHJlYW0gKi8KKyAgICBQQV9TVFJFQU1fUkVDT1JELCAgICAgICAgLyoqPCBSZWNvcmQgc3RyZWFtICovCisgICAgUEFfU1RSRUFNX1VQTE9BRCAgICAgICAgIC8qKjwgU2FtcGxlIHVwbG9hZCBzdHJlYW0gKi8KK30gcGFfc3RyZWFtX2RpcmVjdGlvbl90OworCisvKiogU29tZSBzcGVjaWFsIGZsYWdzIGZvciBzdHJlYW0gY29ubmVjdGlvbnMuIFxzaW5jZSAwLjYgKi8KK3R5cGVkZWYgZW51bSBwYV9zdHJlYW1fZmxhZ3MgeworICAgIFBBX1NUUkVBTV9TVEFSVF9DT1JLRUQgPSAxLCAgICAgICAvKio8IENyZWF0ZSB0aGUgc3RyZWFtIGNvcmtlZCwgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IHBhX3N0cmVhbV9jb3JrKCkgY2FsbCB0byB1bmNvcmsgaXQuICovCisgICAgUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyA9IDIsIC8qKjwgSW50ZXJwb2xhdGUgdGhlIGxhdGVuY3kgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgc3RyZWFtLiBXaGVuIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYV9zdHJlYW1fZ2V0X3RpbWUoKSB3aWxsIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBlc3RpbWF0ZSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWNvcmQvcGxheWJhY2sgdGltZSBiYXNlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgbG9jYWwgdGltZSB0aGF0IHBhc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSB0aGUgbGFzdCB0aW1pbmcgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1cGRhdGUuICBVc2luZyB0aGlzIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVxdWlyaW5nIGEgd2hvbGUgcm91bmR0cmlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGxheWJhY2svcmVjb3JkaW5nIHRpbWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmVlZGVkLiBDb25zaWRlciB1c2luZyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9wdGlvbiB3aGVuIHJlcXVlc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGF0ZW5jeSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmcmVxdWVudGx5LiBUaGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGVzcGVjaWFsbHkgdXNlZnVsIG9uIGxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGF0ZW5jeSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbm5lY3Rpb25zLiBJdCBtYWtlcyBhIGxvdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBzZW5zZSB0byBjb21iaW5lIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3B0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURS4gKi8KKyAgICBQQV9TVFJFQU1fTk9UX01PTk9UT05PVVMgPSA0LCAgICAvKio8IERvbid0IGZvcmNlIHRoZSB0aW1lIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5jcmVhc2UgbW9ub3RvbmljYWxseS4gSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhX3N0cmVhbV9nZXRfdGltZSgpIHdpbGwgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmVjZXNzYXJpbHkgcmV0dXJuIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsdWVzIG9uIGVhY2ggY2FsbC4gVGhpcyBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb25mdXNlIGFwcGxpY2F0aW9ucyB3aGljaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbm5vdCBkZWFsIHdpdGggdGltZSBnb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdiYWNrd2FyZHMnLCBidXQgaGFzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkdmFudGFnZSB0aGF0IGJhZCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsYXRlbmN5IGVzdGltYXRpb25zIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXVzZWQgdGhlIHRpbWUgdG8gdG8ganVtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFoZWFkIGNhbiBiZSBjb3JyZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBxdWlja2x5LCB3aXRob3V0IHRoZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2FpdC4gKi8KKyAgICBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFID0gOCwgLyoqPCBJZiBzZXQgdGltaW5nIHVwZGF0ZSByZXF1ZXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgaXNzdWVkIHBlcmlvZGljYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5LiBDb21iaW5lZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBBX1NUUkVBTV9JTlRFUlBPTEFURV9USU1JTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogeW91IHdpbGwgYmUgYWJsZSB0byBxdWVyeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3VycmVudCB0aW1lIGFuZCBsYXRlbmN5IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFfc3RyZWFtX2dldF90aW1lKCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbCB0aW1lcyB3aXRob3V0IGEgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJvdW5kIHRyaXAuKi8KKyAgICBQQV9TVFJFQU1fTk9fUkVNQVBfQ0hBTk5FTFMgPSAxNiwgLyoqPCBEb24ndCByZW1hcCBjaGFubmVscyBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGVpciBuYW1lLCBpbnN0ZWFkIG1hcCB0aGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbXBseSBieSB0aGVpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRleC4gSW1wbGllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQQV9TVFJFQU1fTk9fUkVNSVhfQ0hBTk5FTFMuIE9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3VwcG9ydGVkIHdoZW4gdGhlIHNlcnZlciBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdCBsZWFzdCBQQSAwLjkuOC4gSXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWdub3JlZCBvbiBvbGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXJ2ZXJzLlxzaW5jZSAwLjkuOCAqLworICAgIFBBX1NUUkVBTV9OT19SRU1JWF9DSEFOTkVMUyA9IDMyLCAvKio8IFdoZW4gcmVtYXBwaW5nIGNoYW5uZWxzIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5hbWUsIGRvbid0IHVwbWl4IG9yIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlbSB0byByZWxhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzLiBDb3B5IHRoZW0gaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYXRjaGluZyBjaGFubmVscyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV2aWNlIDE6MS4gT25seSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hlbiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBBIDAuOS44LiBJdCBpcyBpZ25vcmVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9sZGVyIHNlcnZlcnMuIFxzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwLjkuOCAqLworICAgIFBBX1NUUkVBTV9GSVhfRk9STUFUID0gNjQsIC8qKjwgVXNlIHRoZSBzYW1wbGUgZm9ybWF0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmsvZGV2aWNlIHRoaXMgc3RyZWFtIGlzIGJlaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29ubmVjdGVkIHRvLCBhbmQgcG9zc2libHkgaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZvcm1hdCB0aGUgc2FtcGxlIHNwZWMgY29udGFpbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAtLSBidXQgeW91IHN0aWxsIGhhdmUgdG8gcGFzcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsaWQgdmFsdWUgaW4gaXQgYXMgYSBoaW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHVsc2VBdWRpbyB3aGF0IHdvdWxkIHN1aXQgeW91cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0cmVhbSBiZXN0LiBJZiB0aGlzIGlzIHVzZWQgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2hvdWxkIHF1ZXJ5IHRoZSB1c2VkIHNhbXBsZSBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZnRlciBjcmVhdGluZyB0aGUgc3RyZWFtIGJ5IHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFfc3RyZWFtX2dldF9zYW1wbGVfc3BlYygpLiBBbHNvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIHlvdSBzcGVjaWZpZWQgbWFudWFsIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1ldHJpY3MgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlbSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFfc3RyZWFtX3NldF9idWZmZXJfYXR0cigpIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY29tcGVuc2F0ZSBmb3IgdGhlIGNoYW5nZWQgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplcy4gT25seSBzdXBwb3J0ZWQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXJ2ZXIgaXMgYXQgbGVhc3QgUEEgMC45LjguIEl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWdub3JlZCBvbiBvbGRlciBzZXJ2ZXJzLiBcc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwLjkuOCAqLworCisgICAgUEFfU1RSRUFNX0ZJWF9SQVRFID0gMTI4LCAvKio8IFVzZSB0aGUgc2FtcGxlIHJhdGUgb2YgdGhlIHNpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgcG9zc2libHkgaWdub3JlIHRoZSByYXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2FtcGxlIHNwZWMgY29udGFpbnMuIFVzYWdlIHNpbWlsYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIFBBX1NUUkVBTV9GSVhfRk9STUFULk9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBBIDAuOS44LiBJdCBpcyBpZ25vcmVkIG9uIG9sZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXJ2ZXJzLiBcc2luY2UgMC45LjggKi8KKworICAgIFBBX1NUUkVBTV9GSVhfQ0hBTk5FTFMgPSAyNTYsIC8qKjwgVXNlIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY2hhbm5lbCBtYXAgb2YgdGhlIHNpbmssIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcG9zc2libHkgaWdub3JlIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzIGFuZCB0aGUgbWFwIHRoZSBzYW1wbGUgc3BlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHRoZSBwYXNzZWQgY2hhbm5lbCBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbnRhaW5zLiBVc2FnZSBzaW1pbGFyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQQV9TVFJFQU1fRklYX0ZPUk1BVC4gT25seSBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gdGhlIHNlcnZlciBpcyBhdCBsZWFzdCBQQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMC45LjguIEl0IGlzIGlnbm9yZWQgb24gb2xkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlcnZlcnMuIFxzaW5jZSAwLjkuOCAqLworICAgIFBBX1NUUkVBTV9ET05UX01PVkUgPSA1MTIsIC8qKjwgRG9uJ3QgYWxsb3cgbW92aW5nIG9mIHRoaXMgc3RyZWFtIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFub3RoZXIgc2luay9kZXZpY2UuIFVzZWZ1bCBpZiB5b3UgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFueSBvZiB0aGUgUEFfU1RSRUFNX0ZJWF8gZmxhZ3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZXZlciB0YWtlcyBwbGFjZSAtLSB3aGljaCBtaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBoYXBwZW4gaWYgdGhlIHN0cmVhbSBpcyBtb3ZlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbm90aGVyIHNpbmsvc291cmNlIHdoaXRoIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNhbXBsZSBzcGVjL2NoYW5uZWwgbWFwLiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1cHBvcnRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUEEgMC45LjguIEl0IGlzIGlnbm9yZWQgb24gb2xkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VydmVycy4gXHNpbmNlIDAuOS44ICovCisgICAgUEFfU1RSRUFNX1ZBUklBQkxFX1JBVEUgPSAxMDI0LCAvKio8IEFsbG93IGR5bmFtaWMgY2hhbmdpbmcgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzYW1wbGluZyByYXRlIGR1cmluZyBwbGF5YmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFfc3RyZWFtX3VwZGF0ZV9zYW1wbGVfcmF0ZSgpLiBPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdXBwb3J0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsZWFzdCBQQSAwLjkuOC4gSXQgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb24gb2xkZXIgc2VydmVycy4gXHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwLjkuOCAqLworfSBwYV9zdHJlYW1fZmxhZ3NfdDsKKworLyoqIFBsYXliYWNrIGFuZCByZWNvcmQgYnVmZmVyIG1ldHJpY3MgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2J1ZmZlcl9hdHRyIHsKKyAgICB1aW50MzJfdCBtYXhsZW5ndGg7ICAgICAgLyoqPCBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgYnVmZmVyICovCisgICAgdWludDMyX3QgdGxlbmd0aDsgICAgICAgIC8qKjwgUGxheWJhY2sgb25seTogdGFyZ2V0IGxlbmd0aCBvZiB0aGUgYnVmZmVyLiBUaGUgc2VydmVyIHRyaWVzIHRvIGFzc3VyZSB0aGF0IGF0IGxlYXN0IHRsZW5ndGggYnl0ZXMgYXJlIGFsd2F5cyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IHByZWJ1ZjsgICAgICAgICAvKio8IFBsYXliYWNrIG9ubHk6IHByZS1idWZmZXJpbmcuIFRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3RhcnQgd2l0aCBwbGF5YmFjayBiZWZvcmUgYXQgbGVhc3QgcHJlYnVnIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IG1pbnJlcTsgICAgICAgICAvKio8IFBsYXliYWNrIG9ubHk6IG1pbmltdW0gcmVxdWVzdC4gVGhlIHNlcnZlciBkb2VzIG5vdCByZXF1ZXN0IGxlc3MgdGhhbiBtaW5yZXEgYnl0ZXMgZnJvbSB0aGUgY2xpZW50LCBpbnN0ZWFkIHdhaW50cyB1bnRpbCB0aGUgYnVmZmVyIGlzIGZyZWUgZW5vdWdoIHRvIHJlcXVlc3QgbW9yZSBieXRlcyBhdCBvbmNlICovCisgICAgdWludDMyX3QgZnJhZ3NpemU7ICAgICAgIC8qKjwgUmVjb3JkaW5nIG9ubHk6IGZyYWdtZW50IHNpemUuIFRoZSBzZXJ2ZXIgc2VuZHMgZGF0YSBpbiBibG9ja3Mgb2YgZnJhZ3NpemUgYnl0ZXMgc2l6ZS4gTGFyZ2UgdmFsdWVzIGRlbWluaXNoIGludGVyYWN0aXZpdHkgd2l0aCBvdGhlciBvcGVyYXRpb25zIG9uIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgYnV0IGRlY3JlYXNlIGNvbnRyb2wgb3ZlcmhlYWQuICovCit9IHBhX2J1ZmZlcl9hdHRyOworCisvKiogRXJyb3IgdmFsdWVzIGFzIHVzZWQgYnkgcGFfY29udGV4dF9lcnJubygpLiBVc2UgcGFfc3RyZXJyb3IoKSB0byBjb252ZXJ0IHRoZXNlIHZhbHVlcyB0byBodW1hbiByZWFkYWJsZSBzdHJpbmdzICovCitlbnVtIHsKKyAgICBQQV9PSyA9IDAsICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBlcnJvciAqLworICAgIFBBX0VSUl9BQ0NFU1MsICAgICAgICAgICAgICAgICAvKio8IEFjY2VzcyBmYWlsdXJlICovCisgICAgUEFfRVJSX0NPTU1BTkQsICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93biBjb21tYW5kICovCisgICAgUEFfRVJSX0lOVkFMSUQsICAgICAgICAgICAgICAgIC8qKjwgSW52YWxpZCBhcmd1bWVudCAqLworICAgIFBBX0VSUl9FWElTVCwgICAgICAgICAgICAgICAgICAvKio8IEVudGl0eSBleGlzdHMgKi8KKyAgICBQQV9FUlJfTk9FTlRJVFksICAgICAgICAgICAgICAgLyoqPCBObyBzdWNoIGVudGl0eSAqLworICAgIFBBX0VSUl9DT05ORUNUSU9OUkVGVVNFRCwgICAgICAvKio8IENvbm5lY3Rpb24gcmVmdXNlZCAqLworICAgIFBBX0VSUl9QUk9UT0NPTCwgICAgICAgICAgICAgICAvKio8IFByb3RvY29sIGVycm9yICovCisgICAgUEFfRVJSX1RJTUVPVVQsICAgICAgICAgICAgICAgIC8qKjwgVGltZW91dCAqLworICAgIFBBX0VSUl9BVVRIS0VZLCAgICAgICAgICAgICAgICAvKio8IE5vIGF1dGhvcml6YXRpb24ga2V5ICovCisgICAgUEFfRVJSX0lOVEVSTkFMLCAgICAgICAgICAgICAgIC8qKjwgSW50ZXJuYWwgZXJyb3IgKi8KKyAgICBQQV9FUlJfQ09OTkVDVElPTlRFUk1JTkFURUQsICAgLyoqPCBDb25uZWN0aW9uIHRlcm1pbmF0ZWQgKi8KKyAgICBQQV9FUlJfS0lMTEVELCAgICAgICAgICAgICAgICAgLyoqPCBFbnRpdHkga2lsbGVkICovCisgICAgUEFfRVJSX0lOVkFMSURTRVJWRVIsICAgICAgICAgIC8qKjwgSW52YWxpZCBzZXJ2ZXIgKi8KKyAgICBQQV9FUlJfTU9ESU5JVEZBSUxFRCwgICAgICAgICAgLyoqPCBNb2R1bGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCisgICAgUEFfRVJSX0JBRFNUQVRFLCAgICAgICAgICAgICAgIC8qKjwgQmFkIHN0YXRlICovCisgICAgUEFfRVJSX05PREFUQSwgICAgICAgICAgICAgICAgIC8qKjwgTm8gZGF0YSAqLworICAgIFBBX0VSUl9WRVJTSU9OLCAgICAgICAgICAgICAgICAvKio8IEluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uIFxzaW5jZSAwLjggKi8KKyAgICBQQV9FUlJfVE9PTEFSR0UsICAgICAgICAgICAgICAgLyoqPCBEYXRhIHRvbyBsYXJnZSBcc2luY2UgMC44LjEgKi8KKyAgICBQQV9FUlJfTk9UU1VQUE9SVEVELCAgICAgICAgICAgLyoqPCBPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBcc2luY2UgMC45LjUgKi8KKyAgICBQQV9FUlJfTUFYICAgICAgICAgICAgICAgICAgICAgLyoqPCBOb3QgcmVhbGx5IGFuIGVycm9yIGJ1dCB0aGUgZmlyc3QgaW52YWxpZCBlcnJvciBjb2RlICovCit9OworCisvKiogU3Vic2NyaXB0aW9uIGV2ZW50IG1hc2ssIGFzIHVzZWQgYnkgcGFfY29udGV4dF9zdWJzY3JpYmUoKSAqLwordHlwZWRlZiBlbnVtIHBhX3N1YnNjcmlwdGlvbl9tYXNrIHsKKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19OVUxMID0gMCwgICAgICAgICAgICAgICAvKio8IE5vIGV2ZW50cyAqLworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NJTksgPSAxLCAgICAgICAgICAgICAgIC8qKjwgU2luayBldmVudHMgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TT1VSQ0UgPSAyLCAgICAgICAgICAgICAvKio8IFNvdXJjZSBldmVudHMgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19TSU5LX0lOUFVUID0gNCwgICAgICAgICAvKio8IFNpbmsgaW5wdXQgZXZlbnRzICovCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfU09VUkNFX09VVFBVVCA9IDgsICAgICAgLyoqPCBTb3VyY2Ugb3V0cHV0IGV2ZW50cyAqLworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX01PRFVMRSA9IDE2LCAgICAgICAgICAgIC8qKjwgTW9kdWxlIGV2ZW50cyAqLworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX0NMSUVOVCA9IDMyLCAgICAgICAgICAgIC8qKjwgQ2xpZW50IGV2ZW50cyAqLworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NBTVBMRV9DQUNIRSA9IDY0LCAgICAgIC8qKjwgU2FtcGxlIGNhY2hlIGV2ZW50cyAqLworICAgIFBBX1NVQlNDUklQVElPTl9NQVNLX1NFUlZFUiA9IDEyOCwgICAgICAgICAgIC8qKjwgT3RoZXIgZ2xvYmFsIHNlcnZlciBjaGFuZ2VzLiBcc2luY2UgMC40ICovCisgICAgUEFfU1VCU0NSSVBUSU9OX01BU0tfQVVUT0xPQUQgPSAyNTYsICAgICAgICAgLyoqPCBBdXRvbG9hZCB0YWJsZSBldmVudHMuIFxzaW5jZSAwLjUgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fTUFTS19BTEwgPSA1MTEgICAgICAgICAgICAgICAvKio8IENhdGNoIGFsbCBldmVudHMgXHNpbmNlIDAuOCAqLworfSBwYV9zdWJzY3JpcHRpb25fbWFza190OworCisvKiogU3Vic2NyaXB0aW9uIGV2ZW50IHR5cGVzLCBhcyB1c2VkIGJ5IHBhX2NvbnRleHRfc3Vic2NyaWJlKCkgKi8KK3R5cGVkZWYgZW51bSBwYV9zdWJzY3JpcHRpb25fZXZlbnRfdHlwZSB7CisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NJTksgPSAwLCAgICAgICAgICAgLyoqPCBFdmVudCB0eXBlOiBTaW5rICovCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NPVVJDRSA9IDEsICAgICAgICAgLyoqPCBFdmVudCB0eXBlOiBTb3VyY2UgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU0lOS19JTlBVVCA9IDIsICAgICAvKio8IEV2ZW50IHR5cGU6IFNpbmsgaW5wdXQgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfU09VUkNFX09VVFBVVCA9IDMsICAvKio8IEV2ZW50IHR5cGU6IFNvdXJjZSBvdXRwdXQgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfTU9EVUxFID0gNCwgICAgICAgICAvKio8IEV2ZW50IHR5cGU6IE1vZHVsZSAqLworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9DTElFTlQgPSA1LCAgICAgICAgIC8qKjwgRXZlbnQgdHlwZTogQ2xpZW50ICovCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX1NBTVBMRV9DQUNIRSA9IDYsICAgLyoqPCBFdmVudCB0eXBlOiBTYW1wbGUgY2FjaGUgaXRlbSAqLworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9TRVJWRVIgPSA3LCAgICAgICAgIC8qKjwgRXZlbnQgdHlwZTogR2xvYmFsIHNlcnZlciBjaGFuZ2UsIG9ubHkgb2NjdXJpbmcgd2l0aCBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0hBTkdFLiBcc2luY2UgMC40ICAqLworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9BVVRPTE9BRCA9IDgsICAgICAgIC8qKjwgRXZlbnQgdHlwZTogQXV0b2xvYWQgdGFibGUgY2hhbmdlcy4gXHNpbmNlIDAuNSAqLworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9GQUNJTElUWV9NQVNLID0gMTUsIC8qKjwgQSBtYXNrIHRvIGV4dHJhY3QgdGhlIGV2ZW50IHR5cGUgZnJvbSBhbiBldmVudCB2YWx1ZSAqLworCisgICAgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX05FVyA9IDAsICAgICAgICAgICAgLyoqPCBBIG5ldyBvYmplY3Qgd2FzIGNyZWF0ZWQgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfQ0hBTkdFID0gMTYsICAgICAgICAvKio8IEEgcHJvcGVydHkgb2YgdGhlIG9iamVjdCB3YXMgbW9kaWZpZWQgKi8KKyAgICBQQV9TVUJTQ1JJUFRJT05fRVZFTlRfUkVNT1ZFID0gMzIsICAgICAgICAvKio8IEFuIG9iamVjdCB3YXMgcmVtb3ZlZCAqLworICAgIFBBX1NVQlNDUklQVElPTl9FVkVOVF9UWVBFX01BU0sgPSAxNiszMiAgIC8qKjwgQSBtYXNrIHRvIGV4dHJhY3QgdGhlIGV2ZW50IG9wZXJhdGlvbiBmcm9tIGFuIGV2ZW50IHZhbHVlICovCit9IHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3Q7CisKKy8qKiBSZXR1cm4gb25lIGlmIGFuIGV2ZW50IHR5cGUgdCBtYXRjaGVzIGFuIGV2ZW50IG1hc2sgYml0ZmllbGQgKi8KKyNkZWZpbmUgcGFfc3Vic2NyaXB0aW9uX21hdGNoX2ZsYWdzKG0sIHQpICghISgobSkgJiAoMSA8PCAoKHQpICYgUEFfU1VCU0NSSVBUSU9OX0VWRU5UX0ZBQ0lMSVRZX01BU0spKSkpCisKKy8qKiBBIHN0cnVjdHVyZSBmb3IgYWxsIGtpbmRzIG9mIHRpbWluZyBpbmZvcm1hdGlvbiBvZiBhIHN0cmVhbS4gU2VlCisgKiBwYV9zdHJlYW1fdXBkYXRlX3RpbWluZ19pbmZvKCkgYW5kIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKS4gVGhlCisgKiB0b3RhbCBvdXRwdXQgbGF0ZW5jeSBhIHNhbXBsZSB0aGF0IGlzIHdyaXR0ZW4gd2l0aAorICogcGFfc3RyZWFtX3dyaXRlKCkgdGFrZXMgdG8gYmUgcGxheWVkIG1heSBiZSBlc3RpbWF0ZWQgYnkKKyAqIHNpbmtfdXNlYytidWZmZXJfdXNlYyt0cmFuc3BvcnRfdXNlYy4gKHdoZXJlIGJ1ZmZlcl91c2VjIGlzIGRlZmluZWQKKyAqIGFzIHBhX2J5dGVzX3RvX3VzZWMod3JpdGVfaW5kZXgtcmVhZF9pbmRleCkpIFRoZSBvdXRwdXQgYnVmZmVyCisgKiB3aGljaCBidWZmZXJfdXNlYyByZWxhdGVzIHRvIG1heSBiZSBtYW5pcHVsYXRlZCBmcmVlbHkgKHdpdGgKKyAqIHBhX3N0cmVhbV93cml0ZSgpJ3Mgc2VlayBhcmd1bWVudCwgcGFfc3RyZWFtX2ZsdXNoKCkgYW5kIGZyaWVuZHMpLAorICogdGhlIGJ1ZmZlcnMgc2lua191c2VjIGFuZCBzb3VyY2VfdXNlYyByZWxhdGUgdG8gYXJlIGZpcnN0LWluCisgKiBmaXJzdC1vdXQgKEZJRk8pIGJ1ZmZlcnMgd2hpY2ggY2Fubm90IGJlIGZsdXNoZWQgb3IgbWFuaXB1bGF0ZWQgaW4KKyAqIGFueSB3YXkuIFRoZSB0b3RhbCBpbnB1dCBsYXRlbmN5IGEgc2FtcGxlIHRoYXQgaXMgcmVjb3JkZWQgdGFrZXMgdG8KKyAqIGJlIGRlbGl2ZXJlZCB0byB0aGUgYXBwbGljYXRpb24gaXM6CisgKiBzb3VyY2VfdXNlYytidWZmZXJfdXNlYyt0cmFuc3BvcnRfdXNlYy1zaW5rX3VzZWMuIChUYWtlIGNhcmUgb2YKKyAqIHNpZ24gaXNzdWVzISkgV2hlbiBjb25uZWN0ZWQgdG8gYSBtb25pdG9yIHNvdXJjZSBzaW5rX3VzZWMgY29udGFpbnMKKyAqIHRoZSBsYXRlbmN5IG9mIHRoZSBvd25pbmcgc2luay4gVGhlIHR3byBsYXRlbmN5IGVzdGltYXRpb25zCisgKiBkZXNjcmliZWQgaGVyZSBhcmUgaW1wbGVtZW50ZWQgaW4gcGFfc3RyZWFtX2dldF9sYXRlbmN5KCkuKi8KK3R5cGVkZWYgc3RydWN0IHBhX3RpbWluZ19pbmZvIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lc3RhbXA7IC8qKjwgVGhlIHRpbWUgd2hlbiB0aGlzIHRpbWluZyBpbmZvIHN0cnVjdHVyZSB3YXMgY3VycmVudCAqLworICAgIGludCBzeW5jaHJvbml6ZWRfY2xvY2tzOyAgLyoqPCBOb24temVybyBpZiB0aGUgbG9jYWwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVtb3RlIG1hY2hpbmUgaGF2ZSBzeW5jaHJvbml6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNsb2Nrcy4gSWYgc3luY2hyb25pemVkIGNsb2NrcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRldGVjdGVkIHRyYW5zcG9ydF91c2VjIGJlY29tZXMgbXVjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbW9yZSByZWxpYWJsZS4gSG93ZXZlciwgdGhlIGNvZGUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGV0ZWN0cyBzeW5jaHJvbml6ZWQgY2xvY2tzIGlzIHZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxpbWl0ZWQgdW5kIHVucmVsaWFibGUgaXRzZWxmLiBcc2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAuNSAqLworCisgICAgcGFfdXNlY190IHNpbmtfdXNlYzsgICAgICAvKio8IFRpbWUgaW4gdXNlY3MgYSBzYW1wbGUgdGFrZXMgdG8gYmUgcGxheWVkIG9uIHRoZSBzaW5rLiBGb3IgcGxheWJhY2sgc3RyZWFtcyBhbmQgcmVjb3JkIHN0cmVhbXMgY29ubmVjdGVkIHRvIGEgbW9uaXRvciBzb3VyY2UuICovCisgICAgcGFfdXNlY190IHNvdXJjZV91c2VjOyAgICAvKio8IFRpbWUgaW4gdXNlY3MgYSBzYW1wbGUgdGFrZXMgZnJvbSBiZWluZyByZWNvcmRlZCB0byBiZWluZyBkZWxpdmVyZWQgdG8gdGhlIGFwcGxpY2F0aW9uLiBPbmx5IGZvciByZWNvcmQgc3RyZWFtcy4gXHNpbmNlIDAuNSovCisgICAgcGFfdXNlY190IHRyYW5zcG9ydF91c2VjOyAvKio8IEVzdGltYXRlZCB0aW1lIGluIHVzZWNzIGEgc2FtcGxlIHRha2VzIHRvIGJlIHRyYW5zZmVycmVkIHRvL2Zyb20gdGhlIGRhZW1vbi4gRm9yIGJvdGggcGxheWJhY2sgYW5kIHJlY29yZCBzdHJlYW1zLiBcc2luY2UgMC41ICovCisKKyAgICBpbnQgcGxheWluZzsgICAgICAgICAgICAgIC8qKjwgTm9uLXplcm8gd2hlbiB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBwbGF5aW5nLiBPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zLiAqLworCisgICAgaW50IHdyaXRlX2luZGV4X2NvcnJ1cHQ7ICAvKio8IE5vbi16ZXJvIGlmIHdyaXRlX2luZGV4IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXAtdG8tZGF0ZSBiZWNhdXNlIGEgbG9jYWwgd3JpdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbW1hbmQgdGhhdCBjb3JydXB0ZWQgaXQgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzc3VlZCBpbiB0aGUgdGltZSBzaW5jZSB0aGlzIGxhdGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluZm8gd2FzIGN1cnJlbnQgLiBPbmx5IHdyaXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21tYW5kcyB3aXRoIFNFRUtfUkVMQVRJVkVfT05fUkVBRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIFNFRUtfUkVMQVRJVkVfRU5EIGNhbiBjb3JydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cml0ZV9pbmRleC4gXHNpbmNlIDAuOCAqLworICAgIGludDY0X3Qgd3JpdGVfaW5kZXg7ICAgICAgLyoqPCBDdXJyZW50IHdyaXRlIGluZGV4IGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwbGF5YmFjayBidWZmZXIgaW4gYnl0ZXMuIFRoaW5rIHR3aWNlIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNpbmcgdGhpcyBmb3Igc2Vla2luZyBwdXJwb3NlczogaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1pZ2h0IGJlIG91dCBvZiBkYXRlIGEgdGhlIHRpbWUgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3YW50IHRvIHVzZSBpdC4gQ29uc2lkZXIgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBBX1NFRUtfUkVMQVRJVkUgaW5zdGVhZC4gXHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwLjggKi8KKworICAgIGludCByZWFkX2luZGV4X2NvcnJ1cHQ7ICAgLyoqPCBOb24temVybyBpZiByZWFkX2luZGV4IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXAtdG8tZGF0ZSBiZWNhdXNlIGEgbG9jYWwgcGF1c2Ugb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZsdXNoIHJlcXVlc3QgdGhhdCBjb3JydXB0ZWQgaXQgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGlzc3VlZCBpbiB0aGUgdGltZSBzaW5jZSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsYXRlbmN5IGluZm8gd2FzIGN1cnJlbnQuIFxzaW5jZSAwLjggICovCisKKyAgICBpbnQ2NF90IHJlYWRfaW5kZXg7ICAgICAgIC8qKjwgQ3VycmVudCByZWFkIGluZGV4IGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwbGF5YmFjayBidWZmZXIgaW4gYnl0ZXMuIFRoaW5rIHR3aWNlIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNpbmcgdGhpcyBmb3Igc2Vla2luZyBwdXJwb3NlczogaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1pZ2h0IGJlIG91dCBvZiBkYXRlIGEgdGhlIHRpbWUgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3YW50IHRvIHVzZSBpdC4gQ29uc2lkZXIgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBBX1NFRUtfUkVMQVRJVkVfT05fUkVBRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5zdGVhZC4gXHNpbmNlIDAuOCAqLworfSBwYV90aW1pbmdfaW5mbzsKKworLyoqIEEgc3RydWN0dXJlIGZvciB0aGUgc3Bhd24gYXBpLiBUaGlzIG1heSBiZSB1c2VkIHRvIGludGVncmF0ZSBhdXRvCisgKiBzcGF3bmVkIGRhZW1vbnMgaW50byB5b3VyIGFwcGxpY2F0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUKKyAqIHBhX2NvbnRleHRfY29ubmVjdCgpLiBXaGVuIHNwYXduaW5nIGEgbmV3IGNoaWxkIHByb2Nlc3MgdGhlCisgKiB3YWl0cGlkKCkgaXMgdXNlZCBvbiB0aGUgY2hpbGQncyBQSUQuIFRoZSBzcGF3biByb3V0aW5lIHdpbGwgbm90CisgKiBibG9jayBvciBpZ25vcmUgU0lHQ0hMRCBzaWduYWxzLCBzaW5jZSB0aGlzIGNhbm5vdCBiZSBkb25lIGluIGEKKyAqIHRocmVhZCBjb21wYXRpYmxlIHdheS4gWW91IG1pZ2h0IGhhdmUgdG8gZG8gdGhpcyBpbgorICogcHJlZm9yay9wb3N0Zm9yay4gXHNpbmNlIDAuNCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc3Bhd25fYXBpIHsKKyAgICB2b2lkICgqcHJlZm9yaykodm9pZCk7ICAgICAvKio8IElzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZm9yayBpbiB0aGUgcGFyZW50IHByb2Nlc3MuIE1heSBiZSBOVUxMLiAqLworICAgIHZvaWQgKCpwb3N0Zm9yaykodm9pZCk7ICAgIC8qKjwgSXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmb3JrIGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gTWF5IGJlIE5VTEwuKi8KKyAgICB2b2lkICgqYXRmb3JrKSh2b2lkKTsgICAgICAvKio8IElzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb3JrIGluIHRoZSBjaGlsZCBwcm9jZXNzLiBNYXkgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBOVUxMLiBJdCBpcyBub3Qgc2FmZSB0byBjbG9zZSBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWxlIGRlc2NyaXB0b3JzIGluIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1bmNvbmRpdGlvbmFsbHksIHNpbmNlIGEgVU5JWCBzb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoY3JlYXRlZCB1c2luZyBzb2NrZXRwYWlyKCkpIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc2VkIHRvIHRoZSBuZXcgcHJvY2Vzcy4gKi8KK30gcGFfc3Bhd25fYXBpOworCisvKiogU2VlayB0eXBlIGZvciBwYV9zdHJlYW1fd3JpdGUoKS4gXHNpbmNlIDAuOCovCit0eXBlZGVmIGVudW0gcGFfc2Vla19tb2RlIHsKKyAgICBQQV9TRUVLX1JFTEFUSVZFID0gMCwgICAgICAgICAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSB3cml0ZSBpbmRleCAqLworICAgIFBBX1NFRUtfQUJTT0xVVEUgPSAxLCAgICAgICAgICAgLyoqPCBTZWVrIHJlbGF0aXZlbHkgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgcXVldWUgKi8KKyAgICBQQV9TRUVLX1JFTEFUSVZFX09OX1JFQUQgPSAyLCAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSByZWFkIGluZGV4LiAgKi8KKyAgICBQQV9TRUVLX1JFTEFUSVZFX0VORCA9IDMgICAgICAgIC8qKjwgU2VlayByZWxhdGl2ZWx5IHRvIHRoZSBjdXJyZW50IGVuZCBvZiB0aGUgYnVmZmVyIHF1ZXVlLiAqLworfSBwYV9zZWVrX21vZGVfdDsKKworLyoqIFNwZWNpYWwgc2luayBmbGFncy4gXHNpbmNlIDAuOCAgKi8KK3R5cGVkZWYgZW51bSBwYV9zaW5rX2ZsYWdzIHsKKyAgICBQQV9TSU5LX0hXX1ZPTFVNRV9DVFJMID0gMSwgICAvKio8IFN1cHBvcnRzIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sICovCisgICAgUEFfU0lOS19MQVRFTkNZID0gMiwgICAgICAgICAgLyoqPCBTdXBwb3J0cyBsYXRlbmN5IHF1ZXJ5aW5nICovCisgICAgUEFfU0lOS19IQVJEV0FSRSA9IDQsICAgICAgICAgLyoqPCBJcyBhIGhhcmR3YXJlIHNpbmsgb2Ygc29tZSBraW5kLCBpbiBjb250cmFzdCB0byAidmlydHVhbCIvc29mdHdhcmUgc2lua3MgXHNpbmNlIDAuOS4zICovCisgICAgUEFfU0lOS19ORVRXT1JLID0gOCAgICAgICAgICAgLyoqPCBJcyBhIG5ldHdvcmtlZCBzaW5rIG9mIHNvbWUga2luZC4gXHNpbmNlIDAuOS43ICovCit9IHBhX3NpbmtfZmxhZ3NfdDsKKworLyoqIFNwZWNpYWwgc291cmNlIGZsYWdzLiBcc2luY2UgMC44ICAqLwordHlwZWRlZiBlbnVtIHBhX3NvdXJjZV9mbGFncyB7CisgICAgUEFfU09VUkNFX0hXX1ZPTFVNRV9DVFJMID0gMSwgIC8qKjwgU3VwcG9ydHMgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wgKi8KKyAgICBQQV9TT1VSQ0VfTEFURU5DWSA9IDIsICAgICAgICAgLyoqPCBTdXBwb3J0cyBsYXRlbmN5IHF1ZXJ5aW5nICovCisgICAgUEFfU09VUkNFX0hBUkRXQVJFID0gNCwgICAgICAgIC8qKjwgSXMgYSBoYXJkd2FyZSBzb3VyY2Ugb2Ygc29tZSBraW5kLCBpbiBjb250cmFzdCB0byAidmlydHVhbCIvc29mdHdhcmUgc291cmNlIFxzaW5jZSAwLjkuMyAqLworICAgIFBBX1NPVVJDRV9ORVRXT1JLID0gOCAgICAgICAgICAvKio8IElzIGEgbmV0d29ya2VkIHNpbmsgb2Ygc29tZSBraW5kLiBcc2luY2UgMC45LjcgKi8KK30gcGFfc291cmNlX2ZsYWdzX3Q7CisKKy8qKiBBIGdlbmVyaWMgZnJlZSgpIGxpa2UgY2FsbGJhY2sgcHJvdG90eXBlICovCit0eXBlZGVmIHZvaWQgKCpwYV9mcmVlX2NiX3QpKHZvaWQgKnApOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9lcnJvci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTQxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2Vycm9yLmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBmb29lcnJvcmhmb28KKyNkZWZpbmUgZm9vZXJyb3JoZm9vCisKKy8qICRJZDogZXJyb3IuaCAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxmaWxlCisgKiBFcnJvciBtYW5hZ2VtZW50ICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBudW1lcmljIGVycm9yIGNvZGUgKi8KK2NvbnN0IGNoYXIqIHBhX3N0cmVycm9yKGludCBlcnJvcik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2dsaWItbWFpbmxvb3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvZ2xpYi1tYWlubG9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNGMwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2dsaWItbWFpbmxvb3AuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIGZvb2dsaWJtYWlubG9vcGhmb28KKyNkZWZpbmUgZm9vZ2xpYm1haW5sb29waGZvbworCisvKiAkSWQ6IGdsaWItbWFpbmxvb3AuaCAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLWFwaS5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisKKy8qKiBccGFnZSBnbGliLW1haW5sb29wIEdMSUIgTWFpbiBMb29wIEJpbmRpbmdzCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogVGhlIEdMSUIgbWFpbiBsb29wIGJpbmRpbmdzIGFyZSBleHRyZW1lbHkgZWFzeSB0byB1c2UuIEFsbCB0aGF0IGlzCisgKiByZXF1aXJlZCBpcyB0byBjcmVhdGUgYSBwYV9nbGliX21haW5sb29wIG9iamVjdCB1c2luZworICogcGFfZ2xpYl9tYWlubG9vcF9uZXcoKS4gV2hlbiB0aGUgbWFpbiBsb29wIGFic3RyYWN0aW9uIGlzIG5lZWRlZCwgaXQgaXMKKyAqIHByb3ZpZGVkIGJ5IHBhX2dsaWJfbWFpbmxvb3BfZ2V0X2FwaSgpLgorICoKKyAqLworCisvKiogXGZpbGUKKyAqIEdMSUIgbWFpbiBsb29wIHN1cHBvcnQgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBBbiBvcGFxdWUgR0xJQiBtYWluIGxvb3Agb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV9nbGliX21haW5sb29wIHBhX2dsaWJfbWFpbmxvb3A7CisKKy8qKiBDcmVhdGUgYSBuZXcgR0xJQiBtYWluIGxvb3Agb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIEdMSUIgbWFpbgorICogbG9vcCBjb250ZXh0LiBUYWtlcyBhbiBhcmd1bWVudCBjIGZvciB0aGUKKyAqIEdNYWluQ29udGV4dCB0byB1c2UuIElmIGMgaXMgTlVMTCB0aGUgZGVmYXVsdCBjb250ZXh0IGlzIHVzZWQuICovCitwYV9nbGliX21haW5sb29wICpwYV9nbGliX21haW5sb29wX25ldyhHTWFpbkNvbnRleHQgKmMpOworCisvKiogRnJlZSB0aGUgR0xJQiBtYWluIGxvb3Agb2JqZWN0ICovCit2b2lkIHBhX2dsaWJfbWFpbmxvb3BfZnJlZShwYV9nbGliX21haW5sb29wKiBnKTsKKworLyoqIFJldHVybiB0aGUgYWJzdHJhY3QgbWFpbiBsb29wIEFQSSB2dGFibGUgZm9yIHRoZSBHTElCIG1haW4gbG9vcCBvYmplY3QgKi8KK3BhX21haW5sb29wX2FwaSogcGFfZ2xpYl9tYWlubG9vcF9nZXRfYXBpKHBhX2dsaWJfbWFpbmxvb3AgKmcpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9pbnRyb3NwZWN0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL2ludHJvc3BlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2IzNjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9pbnRyb3NwZWN0LmgKQEAgLTAsMCArMSw1MjAgQEAKKyNpZm5kZWYgZm9vaW50cm9zcGVjdGhmb28KKyNkZWZpbmUgZm9vaW50cm9zcGVjdGhmb28KKworLyogJElkOiBpbnRyb3NwZWN0LmggMTk3MSAyMDA3LTEwLTI4IDE5OjEzOjUwWiBsZW5uYXJ0ICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorI2luY2x1ZGUgPHB1bHNlL2NvbnRleHQuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2NoYW5uZWxtYXAuaD4KKyNpbmNsdWRlIDxwdWxzZS92b2x1bWUuaD4KKworLyoqIFxwYWdlIGludHJvc3BlY3QgU2VydmVyIFF1ZXJ5IGFuZCBDb250cm9sCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBxdWVyeSBhbmQgbW9kaWZ5IGdsb2JhbCBzZXR0aW5ncyBpbiB0aGUKKyAqIHNlcnZlci4gRm9yIHRoaXMsIFB1bHNlQXVkaW8gaGFzIHRoZSBpbnRyb3NwZWN0aW9uIEFQSS4gSXQgY2FuIGxpc3Qgc2lua3MsCisgKiBzb3VyY2VzLCBzYW1wbGVzIGFuZCBvdGhlciBhc3BlY3RzIG9mIHRoZSBzZXJ2ZXIuIEl0IGNhbiBhbHNvIG1vZGlmeSB0aGUKKyAqIGF0dHJpYnV0ZXMgb2YgdGhlIHNlcnZlciB0aGF0IHdpbGwgYWZmZWN0IG9wZXJhdGlvbnMgb24gYSBnbG9iYWwgbGV2ZWwsCisgKiBhbmQgbm90IGp1c3QgdGhlIGFwcGxpY2F0aW9uJ3MgY29udGV4dC4KKyAqCisgKiBcc2VjdGlvbiBxdWVyeV9zZWMgUXVlcnlpbmcKKyAqCisgKiBBbGwgcXVlcnlpbmcgaXMgZG9uZSB0aHJvdWdoIGNhbGxiYWNrcy4gVGhpcyBkZXNpZ24gaXMgbmVjZXNzYXJ5IHRvCisgKiBtYWludGFpbiBhbiBhc3luY2hyb25vdXMgZGVzaWduLiBUaGUgY2xpZW50IHdpbGwgcmVxdWVzdCB0aGUgaW5mb3JtYXRpb24KKyAqIGFuZCBzb21lIHRpbWUgbGF0ZXIsIHRoZSBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggdGhlIGRlc2lyZWQgZGF0YS4KKyAqCisgKiBTb21lIG9iamVjdHMgY2FuIGhhdmUgbXVsdGlwbGUgZW50cmllcyBhdCB0aGUgc2VydmVyLiBXaGVuIHJlcXVlc3RpbmcgYWxsCisgKiBvZiB0aGVzZSBhdCBvbmNlLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yCisgKiBlYWNoIG9iamVjdC4gV2hlbiB0aGUgbGlzdCBoYXMgYmVlbiBleGhhdXN0ZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZAorICogd2l0aG91dCBhbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgYW5kIHRoZSBlb2wgcGFyYW1ldGVyIHNldCB0byBhIG5vbi16ZXJvCisgKiB2YWx1ZS4KKyAqCisgKiBOb3RlIHRoYXQgZXZlbiBpZiBhIHNpbmdsZSBvYmplY3QgaXMgcmVxdWVzdGVkLCBhbmQgbm90IHRoZSBlbnRpcmUgbGlzdCwKKyAqIHRoZSB0ZXJtaW5hdGluZyBjYWxsIHdpbGwgc3RpbGwgYmUgbWFkZS4KKyAqCisgKiBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IGFuZCBpbmZvcm1hdGlvbgorICogc3RydWN0dXJlIGFuZCBlb2wgc2V0IHRvIHplcm8uCisgKgorICogRGF0YSBtZW1iZXJzIGluIHRoZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFyZSBvbmx5IHZhbGlkIGR1cmluZyB0aGUKKyAqIGR1cmF0aW9uIG9mIHRoZSBjYWxsYmFjay4gSWYgdGhleSBhcmUgcmVxdWlyZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIGlzCisgKiBmaW5pc2hlZCwgYSBkZWVwIGNvcHkgbXVzdCBiZSBwZXJmb3JtZWQuCisgKgorICogXHN1YnNlY3Rpb24gc2VydmVyX3N1YnNlYyBTZXJ2ZXIgSW5mb3JtYXRpb24KKyAqCisgKiBUaGUgc2VydmVyIGNhbiBiZSBxdWVyaWVkIGFib3V0IGl0cyBuYW1lLCB0aGUgZW52aXJvbm1lbnQgaXQncyBydW5uaW5nIG9uCisgKiBhbmQgdGhlIGN1cnJlbnRseSBhY3RpdmUgZ2xvYmFsIGRlZmF1bHRzLiBDYWxsaW5nCisgKiBwYV9jb250ZXh0X2dldF9zZXJ2ZXJfaW5mbygpIHdpbGwgZ2V0IGFjY2VzcyB0byBhIHBhX3NlcnZlcl9pbmZvIHN0cnVjdHVyZQorICogY29udGFpbmluZyBhbGwgb2YgdGhlc2UuCisgKgorICogXHN1YnNlY3Rpb24gbWVtc3RhdF9zdWJzZWMgTWVtb3J5IFVzYWdlCisgKgorICogU3RhdGlzdGljcyBhYm91dCBtZW1vcnkgdXNhZ2UgY2FuIGJlIGZldGNoZWQgdXNpbmcgcGFfY29udGV4dF9zdGF0KCksCisgKiBnaXZpbmcgYSBwYV9zdGF0X2luZm8gc3RydWN0dXJlLgorICoKKyAqIFxzdWJzZWN0aW9uIHNpbmtzcmNfc3Vic2VjIFNpbmtzIGFuZCBTb3VyY2VzCisgKgorICogVGhlIHNlcnZlciBjYW4gaGF2ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHNpbmtzIGFuZCBzb3VyY2VzLiBFYWNoIHNpbmsKKyAqIGFuZCBzb3VyY2UgaGF2ZSBib3RoIGFuIGluZGV4IGFuZCBhIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0LiBBcyBzdWNoCisgKiB0aGVyZSBhcmUgdGhyZWUgd2F5cyB0byBnZXQgYWNjZXNzIHRvIHRoZW06CisgKgorICogXGxpIEJ5IGluZGV4IC0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X2luZGV4KCkgLworICogICAgICAgICAgICAgICAgcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfaW5kZXgoKQorICogXGxpIEJ5IG5hbWUgLSBwYV9jb250ZXh0X2dldF9zaW5rX2luZm9fYnlfbmFtZSgpIC8KKyAqICAgICAgICAgICAgICAgcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfbmFtZSgpCisgKiBcbGkgQWxsIC0gcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2xpc3QoKSAvCisgKiAgICAgICAgICAgcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fbGlzdCgpCisgKgorICogQWxsIHRocmVlIG1ldGhvZCB1c2UgdGhlIHNhbWUgY2FsbGJhY2sgYW5kIHdpbGwgcHJvdmlkZSBhIHBhX3NpbmtfaW5mbyBvcgorICogcGFfc291cmNlX2luZm8gc3RydWN0dXJlLgorICoKKyAqIFxzdWJzZWN0aW9uIHNpc29fc3Vic2VjIFNpbmsgSW5wdXRzIGFuZCBTb3VyY2UgT3V0cHV0cworICoKKyAqIFNpbmsgaW5wdXRzIGFuZCBzb3VyY2Ugb3V0cHV0cyBhcmUgdGhlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgY2xpZW50IGVuZHMKKyAqIG9mIHN0cmVhbXMgaW5zaWRlIHRoZSBzZXJ2ZXIuIEkuZS4gdGhleSBjb25uZWN0IGEgY2xpZW50IHN0cmVhbSB0byBvbmUgb2YKKyAqIHRoZSBnbG9iYWwgc2lua3Mgb3Igc291cmNlcy4KKyAqCisgKiBTaW5rIGlucHV0cyBhbmQgc291cmNlIG91dHB1dHMgb25seSBoYXZlIGFuIGluZGV4IHRvIGlkZW50aWZ5IHRoZW0uIEFzCisgKiBzdWNoLCB0aGVyZSBhcmUgb25seSB0d28gd2F5cyB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlbToKKyAqCisgKiBcbGkgQnkgaW5kZXggLSBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8oKSAvCisgKiAgICAgICAgICAgICAgICBwYV9jb250ZXh0X2dldF9zb3VyY2Vfb3V0cHV0X2luZm8oKQorICogXGxpIEFsbCAtIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5wdXRfaW5mb19saXN0KCkgLworICogICAgICAgICAgIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mb19saXN0KCkKKyAqCisgKiBUaGUgc3RydWN0dXJlIHJldHVybmVkIGlzIHRoZSBwYV9zaW5rX2lucHV0X2luZm8gb3IgcGFfc291cmNlX291dHB1dF9pbmZvCisgKiBzdHJ1Y3R1cmUuCisgKgorICogXHN1YnNlY3Rpb24gc2FtcGxlc19zdWJzZWMgU2FtcGxlcworICoKKyAqIFRoZSBsaXN0IG9mIGNhY2hlZCBzYW1wbGVzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2VydmVyLiBUaHJlZSBtZXRob2RzCisgKiBleGlzdCBmb3IgcXVlcnlpbmcgdGhlIHNhbXBsZSBjYWNoZSBsaXN0OgorICoKKyAqIFxsaSBCeSBpbmRleCAtIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2J5X2luZGV4KCkKKyAqIFxsaSBCeSBuYW1lIC0gcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fYnlfbmFtZSgpCisgKiBcbGkgQWxsIC0gcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fbGlzdCgpCisgKgorICogTm90ZSB0aGF0IHRoaXMgb25seSByZXRyaWV2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbXBsZSwgbm90IHRoZSBzYW1wbGUKKyAqIGRhdGEgaXRzZWxmLgorICoKKyAqIFxzdWJzZWN0aW9uIG1vZHVsZV9zdWJzZWMgRHJpdmVyIE1vZHVsZXMKKyAqCisgKiBQdWxzZUF1ZGlvIGRyaXZlciBtb2R1bGVzIGFyZSBpZGVudGlmaWVkIGJ5IGluZGV4IGFuZCBhcmUgcmV0cmlldmVkIHVzaW5nIGVpdGhlcgorICogcGFfY29udGV4dF9nZXRfbW9kdWxlX2luZm8oKSBvciBwYV9jb250ZXh0X2dldF9tb2R1bGVfaW5mb19saXN0KCkuIFRoZQorICogaW5mb3JtYXRpb24gc3RydWN0dXJlIGlzIGNhbGxlZCBwYV9tb2R1bGVfaW5mby4KKyAqCisgKiBcc3Vic2VjdGlvbiBhdXRvbG9hZF9zdWJzZWMgQXV0b2xvYWQgRW50cmllcworICoKKyAqIE1vZHVsZXMgY2FuIGJlIGF1dG9sb2FkZWQgYXMgYSByZXN1bHQgb2YgYSBjbGllbnQgcmVxdWVzdGluZyBhIGNlcnRhaW4KKyAqIHNpbmsgb3Igc291cmNlLiBUaGlzIG1hcHBpbmcgYmV0d2VlbiBzaW5rL3NvdXJjZSBuYW1lcyBhbmQgbW9kdWxlcyBjYW4gYmUKKyAqIHF1ZXJpZWQgZnJvbSB0aGUgc2VydmVyOgorICoKKyAqIFxsaSBCeSBpbmRleCAtIHBhX2NvbnRleHRfZ2V0X2F1dG9sb2FkX2luZm9fYnlfaW5kZXgoKQorICogXGxpIEJ5IHNpbmsvc291cmNlIG5hbWUgLSBwYV9jb250ZXh0X2dldF9hdXRvbG9hZF9pbmZvX2J5X25hbWUoKQorICogXGxpIEFsbCAtIHBhX2NvbnRleHRfZ2V0X2F1dG9sb2FkX2luZm9fbGlzdCgpCisgKgorICogXHN1YnNlY3Rpb24gY2xpZW50X3N1YnNlYyBDbGllbnRzCisgKgorICogUHVsc2VBdWRpbyBjbGllbnRzIGFyZSBhbHNvIGlkZW50aWZpZWQgYnkgaW5kZXggYW5kIGFyZSByZXRyaWV2ZWQgdXNpbmcKKyAqIGVpdGhlciBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mbygpIG9yIHBhX2NvbnRleHRfZ2V0X2NsaWVudF9pbmZvX2xpc3QoKS4KKyAqIFRoZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgaXMgY2FsbGVkIHBhX2NsaWVudF9pbmZvLgorICoKKyAqIFxzZWN0aW9uIGN0cmxfc2VjIENvbnRyb2wKKyAqCisgKiBTb21lIHBhcnRzIG9mIHRoZSBzZXJ2ZXIgYXJlIG9ubHkgcG9zc2libGUgdG8gcmVhZCwgYnV0IG1vc3QgY2FuIGFsc28gYmUKKyAqIG1vZGlmaWVkIGluIGRpZmZlcmVudCB3YXlzLiBOb3RlIHRoYXQgdGhlc2UgY2hhbmdlcyB3aWxsIGFmZmVjdCBhbGwKKyAqIGNvbm5lY3RlZCBjbGllbnRzIGFuZCBub3QganVzdCB0aGUgb25lIGlzc3VpbmcgdGhlIHJlcXVlc3QuCisgKgorICogXHN1YnNlY3Rpb24gc2lua3NyY19zdWJzZWMgU2lua3MgYW5kIFNvdXJjZXMKKyAqCisgKiBUaGUgbW9zdCBjb21tb24gY2hhbmdlIG9uZSB3b3VsZCB3YW50IHRvIGRvIHRvIHNpbmtzIGFuZCBzb3VyY2VzIGlzIHRvCisgKiBtb2RpZnkgdGhlIHZvbHVtZSBvZiB0aGUgYXVkaW8uIElkZW50aWNhbCB0byBob3cgc2lua3MgYW5kIHNvdXJjZXMgY2FuCisgKiBiZSBxdWVyaWVkLCB0aGVyZSBhcmUgdHdvIHdheXMgb2YgaWRlbnRpZnlpbmcgdGhlbToKKyAqCisgKiBcbGkgQnkgaW5kZXggLSBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9pbmRleCgpIC8KKyAqICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfaW5kZXgoKQorICogXGxpIEJ5IG5hbWUgLSBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9uYW1lKCkgLworICogICAgICAgICAgICAgICBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X25hbWUoKQorICoKKyAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gbXV0ZSBhIHNpbmsgb3Igc291cmNlOgorICoKKyAqIFxsaSBCeSBpbmRleCAtIHBhX2NvbnRleHRfc2V0X3NpbmtfbXV0ZV9ieV9pbmRleCgpIC8KKyAqICAgICAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X2luZGV4KCkKKyAqIFxsaSBCeSBuYW1lIC0gcGFfY29udGV4dF9zZXRfc2lua19tdXRlX2J5X25hbWUoKSAvCisgKiAgICAgICAgICAgICAgIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X25hbWUoKQorICoKKyAqIFxzdWJzZWN0aW9uIHNpc29fc3Vic2VjIFNpbmsgSW5wdXRzIGFuZCBTb3VyY2UgT3V0cHV0cworICoKKyAqIElmIGFuIGFwcGxpY2F0aW9uIGRlc2lyZXMgdG8gbW9kaWZ5IHRoZSB2b2x1bWUgb2YganVzdCBhIHNpbmdsZSBzdHJlYW0KKyAqIChjb21tb25seSBvbmUgb2YgaXRzIG93biBzdHJlYW1zKSwgdGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHRoZSB2b2x1bWUKKyAqIG9mIGl0cyBhc3NvY2lhdGVkIHNpbmsgaW5wdXQsIHVzaW5nIHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lKCkuCisgKgorICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgbW9kaWZ5aW5nIHRoZSB2b2x1bWUgb2Ygc291cmNlIG91dHB1dHMuCisgKgorICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZW1vdmUgc2luayBpbnB1dHMgYW5kIHNvdXJjZSBvdXRwdXRzLCB0ZXJtaW5hdGluZworICogdGhlIHN0cmVhbXMgYXNzb2NpYXRlZCB3aXRoIHRoZW06CisgKgorICogXGxpIFNpbmsgaW5wdXQgLSBwYV9jb250ZXh0X2tpbGxfc2lua19pbnB1dCgpCisgKiBcbGkgU291cmNlIG91dHB1dCAtIHBhX2NvbnRleHRfa2lsbF9zb3VyY2Vfb3V0cHV0KCkKKyAqCisgKiBcc3Vic2VjdGlvbiBtb2R1bGVfc3Vic2VjIE1vZHVsZXMKKyAqCisgKiBTZXJ2ZXIgbW9kdWxlcyBjYW4gYmUgcmVtb3RlbHkgbG9hZGVkIGFuZCB1bmxvYWRlZCB1c2luZworICogcGFfY29udGV4dF9sb2FkX21vZHVsZSgpIGFuZCBwYV9jb250ZXh0X3VubG9hZF9tb2R1bGUoKS4KKyAqCisgKiBcc3Vic2VjdGlvbiBhdXRvbG9hZF9zdWJzZWMgQXV0b2xvYWQgRW50cmllcworICoKKyAqIE5ldyBtb2R1bGUgYXV0b2xvYWRpbmcgcnVsZXMgY2FuIGJlIGFkZGVkLCBhbmQgZXhpc3RpbmcgY2FuIGJlIHJlbW92ZWQKKyAqIHVzaW5nIHBhX2NvbnRleHRfYWRkX2F1dG9sb2FkKCkgYW5kIHBhX2NvbnRleHRfcmVtb3ZlX2F1dG9sb2FkX2J5X2luZGV4KCkKKyAqIC8gcGFfY29udGV4dF9yZW1vdmVfYXV0b2xvYWRfYnlfbmFtZSgpLgorICoKKyAqIFxzdWJzZWN0aW9uIGNsaWVudF9zdWJzZWMgQ2xpZW50cworICoKKyAqIFRoZSBvbmx5IG9wZXJhdGlvbiBzdXBwb3J0ZWQgb24gY2xpZW50cywgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGtpY2tpbmcKKyAqIHRoZW0gb2ZmIHRoZSBzZXJ2ZXIgdXNpbmcgcGFfY29udGV4dF9raWxsX2NsaWVudCgpLgorICovCisKKy8qKiBcZmlsZQorICoKKyAqIFJvdXRpbmVzIGZvciBkYWVtb24gaW50cm9zcGVjdGlvbi4KKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzaW5rcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2lua19pbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2luayAqLworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgc2luayAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHNpbmsgKi8KKyAgICBwYV9zYW1wbGVfc3BlYyBzYW1wbGVfc3BlYzsgICAgICAgIC8qKjwgU2FtcGxlIHNwZWMgb2YgdGhpcyBzaW5rICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAgICAgICAvKio8IENoYW5uZWwgbWFwIFxzaW5jZSAwLjggKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG93bmluZyBtb2R1bGUgb2YgdGhpcyBzaW5rLCBvciBQQV9JTlZBTElEX0lOREVYICovCisgICAgcGFfY3ZvbHVtZSB2b2x1bWU7ICAgICAgICAgICAgICAgICAvKio8IFZvbHVtZSBvZiB0aGUgc2luayAqLworICAgIGludCBtdXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNdXRlIHN3aXRjaCBvZiB0aGUgc2luayBcc2luY2UgMC44ICovCisgICAgdWludDMyX3QgbW9uaXRvcl9zb3VyY2U7ICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBtb25pdG9yIHNvdXJjZSBjb25uZWN0ZWQgdG8gdGhpcyBzaW5rICovCisgICAgY29uc3QgY2hhciAqbW9uaXRvcl9zb3VyY2VfbmFtZTsgICAvKio8IFRoZSBuYW1lIG9mIHRoZSBtb25pdG9yIHNvdXJjZSAqLworICAgIHBhX3VzZWNfdCBsYXRlbmN5OyAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgZmlsbGVkIHBsYXliYWNrIGJ1ZmZlciBvZiB0aGlzIHNpbmsgKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUuIFxzaW5jZSAwLjggKi8KKyAgICBwYV9zaW5rX2ZsYWdzX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgRmxhZ3MgXHNpbmNlIDAuOCAqLworfSBwYV9zaW5rX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9uYW1lKCkgYW5kIGZyaWVuZHMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NpbmtfaW5mb19jYl90KShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zaW5rX2luZm8gKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmsgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfc2lua19pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmsgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZCwgcGFfc2lua19pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgc2luayBsaXN0ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX3NpbmtfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgc291cmNlcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc291cmNlX2luZm8geworICAgIGNvbnN0IGNoYXIgKm5hbWUgOyAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc291cmNlICovCisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgc291cmNlICovCisgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb247ICAgICAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHNvdXJjZSAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgIC8qKjwgU2FtcGxlIHNwZWMgb2YgdGhpcyBzb3VyY2UgKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgICAgICAgICAvKio8IENoYW5uZWwgbWFwIFxzaW5jZSAwLjggKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgICAvKio8IE93bmluZyBtb2R1bGUgaW5kZXgsIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBwYV9jdm9sdW1lIHZvbHVtZTsgICAgICAgICAgICAgICAgICAvKio8IFZvbHVtZSBvZiB0aGUgc291cmNlIFxzaW5jZSAwLjggKi8KKyAgICBpbnQgbXV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE11dGUgc3dpdGNoIG9mIHRoZSBzaW5rIFxzaW5jZSAwLjggKi8KKyAgICB1aW50MzJfdCBtb25pdG9yX29mX3Npbms7ICAgICAgICAgICAvKio8IElmIHRoaXMgaXMgYSBtb25pdG9yIHNvdXJjZSB0aGUgaW5kZXggb2YgdGhlIG93bmluZyBzaW5rLCBvdGhlcndpc2UgUEFfSU5WQUxJRF9JTkRFWCAqLworICAgIGNvbnN0IGNoYXIgKm1vbml0b3Jfb2Zfc2lua19uYW1lOyAgIC8qKjwgTmFtZSBvZiB0aGUgb3duaW5nIHNpbmssIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBwYV91c2VjX3QgbGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBmaWxsZWQgcmVjb3JkIGJ1ZmZlciBvZiB0aGlzIHNvdXJjZS4gXHNpbmNlIDAuNSAqLworICAgIGNvbnN0IGNoYXIgKmRyaXZlcjsgICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUgXHNpbmNlIDAuOCAqLworICAgIHBhX3NvdXJjZV9mbGFnc190IGZsYWdzOyAgICAgICAgICAgIC8qKjwgRmxhZ3MgXHNpbmNlIDAuOCAqLworfSBwYV9zb3VyY2VfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfbmFtZSgpIGFuZCBmcmllbmRzICovCit0eXBlZGVmIHZvaWQgKCpwYV9zb3VyY2VfaW5mb19jYl90KShwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zb3VyY2VfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc291cmNlIGJ5IGl0cyBuYW1lICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9pbmZvX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfc291cmNlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc291cmNlIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZCwgcGFfc291cmNlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBzb3VyY2UgbGlzdCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX3NvdXJjZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNlcnZlciBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2VydmVyX2luZm8geworICAgIGNvbnN0IGNoYXIgKnVzZXJfbmFtZTsgICAgICAgICAgICAgIC8qKjwgVXNlciBuYW1lIG9mIHRoZSBkYWVtb24gcHJvY2VzcyAqLworICAgIGNvbnN0IGNoYXIgKmhvc3RfbmFtZTsgICAgICAgICAgICAgIC8qKjwgSG9zdCBuYW1lIHRoZSBkYWVtb24gaXMgcnVubmluZyBvbiAqLworICAgIGNvbnN0IGNoYXIgKnNlcnZlcl92ZXJzaW9uOyAgICAgICAgIC8qKjwgVmVyc2lvbiBzdHJpbmcgb2YgdGhlIGRhZW1vbiAqLworICAgIGNvbnN0IGNoYXIgKnNlcnZlcl9uYW1lOyAgICAgICAgICAgIC8qKjwgU2VydmVyIHBhY2thZ2UgbmFtZSAodXN1YWxseSAicHVsc2VhdWRpbyIpICovCisgICAgcGFfc2FtcGxlX3NwZWMgc2FtcGxlX3NwZWM7ICAgICAgICAgLyoqPCBEZWZhdWx0IHNhbXBsZSBzcGVjaWZpY2F0aW9uICovCisgICAgY29uc3QgY2hhciAqZGVmYXVsdF9zaW5rX25hbWU7ICAgICAgLyoqPCBOYW1lIG9mIGRlZmF1bHQgc2luay4gXHNpbmNlIDAuNCAqLworICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfc291cmNlX25hbWU7ICAgIC8qKjwgTmFtZSBvZiBkZWZhdWx0IHNpbmsuIFxzaW5jZSAwLjQqLworICAgIHVpbnQzMl90IGNvb2tpZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQSByYW5kb20gY29va2llIGZvciBpZGVudGlmeWluZyB0aGlzIGluc3RhbmNlIG9mIFB1bHNlQXVkaW8uIFxzaW5jZSAwLjggKi8KK30gcGFfc2VydmVyX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X3NlcnZlcl9pbmZvKCkgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NlcnZlcl9pbmZvX2NiX3QpIChwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zZXJ2ZXJfaW5mbyppLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NlcnZlcl9pbmZvKHBhX2NvbnRleHQgKmMsIHBhX3NlcnZlcl9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBtb2R1bGVzICovCit0eXBlZGVmIHN0cnVjdCBwYV9tb2R1bGVfaW5mbyB7CisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgbW9kdWxlICovCisgICAgY29uc3QgY2hhcipuYW1lLCAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBtb2R1bGUgKi8KKyAgICAgICAgKmFyZ3VtZW50OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEFyZ3VtZW50IHN0cmluZyBvZiB0aGUgbW9kdWxlICovCisgICAgdWludDMyX3Qgbl91c2VkOyAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2FnZSBjb3VudGVyIG9yIFBBX0lOVkFMSURfSU5ERVggKi8KKyAgICBpbnQgYXV0b191bmxvYWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vbi16ZXJvIGlmIHRoaXMgaXMgYW4gYXV0b2xvYWRlZCBtb2R1bGUgKi8KK30gcGFfbW9kdWxlX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X21vZHVsZV9pbmZvKCkgYW5kIGZpcmVuZHMqLwordHlwZWRlZiB2b2lkICgqcGFfbW9kdWxlX2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX21vZHVsZV9pbmZvKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBzb21lIGluZm9ybWF0aW9uIGFib3V0IGEgbW9kdWxlIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9tb2R1bGVfaW5mbyhwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX21vZHVsZV9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXMgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfbW9kdWxlX2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9tb2R1bGVfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY2xpZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfY2xpZW50X2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoaXMgY2xpZW50ICovCisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGlzIGNsaWVudCAqLworICAgIHVpbnQzMl90IG93bmVyX21vZHVsZTsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBvd25pbmcgbW9kdWxlLCBvciBQQV9JTlZBTElEX0lOREVYICovCisgICAgY29uc3QgY2hhciAqZHJpdmVyOyAgICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUgXHNpbmNlIDAuOCAqLworfSBwYV9jbGllbnRfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfY2xpZW50X2luZm8oKSBhbmQgZmlyZW5kcyovCit0eXBlZGVmIHZvaWQgKCpwYV9jbGllbnRfaW5mb19jYl90KSAocGFfY29udGV4dCAqYywgY29uc3QgcGFfY2xpZW50X2luZm8qaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgY2xpZW50IGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9jbGllbnRfaW5mbyhwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2NsaWVudF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCB0aGUgY29tcGxldGUgY2xpZW50IGxpc3QgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfY2xpZW50X2luZm9fbGlzdChwYV9jb250ZXh0ICpjLCBwYV9jbGllbnRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgc2luayBpbnB1dHMgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NpbmtfaW5wdXRfaW5mbyB7CisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIHNpbmsgaW5wdXQgKi8KKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzaW5rIGlucHV0ICovCisgICAgdWludDMyX3Qgb3duZXJfbW9kdWxlOyAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIG1vZHVsZSB0aGlzIHNpbmsgaW5wdXQgYmVsb25ncyB0bywgb3IgUEFfSU5WQUxJRF9JTkRFWCB3aGVuIGl0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgbW9kdWxlICovCisgICAgdWludDMyX3QgY2xpZW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGNsaWVudCB0aGlzIHNpbmsgaW5wdXQgYmVsb25ncyB0bywgb3IgUEFfSU5WQUxJRF9JTkRFWCB3aGVuIGl0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgY2xpZW50ICovCisgICAgdWludDMyX3Qgc2luazsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGNvbm5lY3RlZCBzaW5rICovCisgICAgcGFfc2FtcGxlX3NwZWMgc2FtcGxlX3NwZWM7ICAgICAgICAgIC8qKjwgVGhlIHNhbXBsZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzaW5rIGlucHV0ICovCisgICAgcGFfY2hhbm5lbF9tYXAgY2hhbm5lbF9tYXA7ICAgICAgICAgIC8qKjwgQ2hhbm5lbCBtYXAgKi8KKyAgICBwYV9jdm9sdW1lIHZvbHVtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdm9sdW1lIG9mIHRoaXMgc2luayBpbnB1dCAqLworICAgIHBhX3VzZWNfdCBidWZmZXJfdXNlYzsgICAgICAgICAgICAgICAvKio8IExhdGVuY3kgZHVlIHRvIGJ1ZmZlcmluZyBpbiBzaW5rIGlucHV0LCBzZWUgcGFfbGF0ZW5jeV9pbmZvIGZvciBkZXRhaWxzICovCisgICAgcGFfdXNlY190IHNpbmtfdXNlYzsgICAgICAgICAgICAgICAgIC8qKjwgTGF0ZW5jeSBvZiB0aGUgc2luayBkZXZpY2UsIHNlZSBwYV9sYXRlbmN5X2luZm8gZm9yIGRldGFpbHMgKi8KKyAgICBjb25zdCBjaGFyICpyZXNhbXBsZV9tZXRob2Q7ICAgICAgICAgLyoqPCBUaHJlIHJlc2FtcGxpbmcgbWV0aG9kIHVzZWQgYnkgdGhpcyBzaW5rIGlucHV0LiBcc2luY2UgMC43ICovCisgICAgY29uc3QgY2hhciAqZHJpdmVyOyAgICAgICAgICAgICAgICAgIC8qKjwgRHJpdmVyIG5hbWUgXHNpbmNlIDAuOCAqLworICAgIGludCBtdXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0cmVhbSBtdXRlZCBcc2luY2UgMC45LjcgKi8KK30gcGFfc2lua19pbnB1dF9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8oKSBhbmQgZmlyZW5kcyovCit0eXBlZGVmIHZvaWQgKCpwYV9zaW5rX2lucHV0X2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NpbmtfaW5wdXRfaW5mbyAqaSwgaW50IGVvbCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5rIGlucHV0IGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2dldF9zaW5rX2lucHV0X2luZm8ocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9zaW5rX2lucHV0X2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBzaW5rIGlucHV0IGxpc3QgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvX2xpc3QocGFfY29udGV4dCAqYywgcGFfc2lua19pbnB1dF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzb3VyY2Ugb3V0cHV0cyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc291cmNlX291dHB1dF9pbmZvIHsKKyAgICB1aW50MzJfdCBpbmRleDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgc2luayBpbnB1dCAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNpbmsgaW5wdXQgKi8KKyAgICB1aW50MzJfdCBvd25lcl9tb2R1bGU7ICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgbW9kdWxlIHRoaXMgc2luayBpbnB1dCBiZWxvbmdzIHRvLCBvciBQQV9JTlZBTElEX0lOREVYIHdoZW4gaXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBtb2R1bGUgKi8KKyAgICB1aW50MzJfdCBjbGllbnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgY2xpZW50IHRoaXMgc2luayBpbnB1dCBiZWxvbmdzIHRvLCBvciBQQV9JTlZBTElEX0lOREVYIHdoZW4gaXQgZG9lcyBub3QgYmVsb25nIHRvIGFueSBjbGllbnQgKi8KKyAgICB1aW50MzJfdCBzb3VyY2U7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgY29ubmVjdGVkIHNvdXJjZSAqLworICAgIHBhX3NhbXBsZV9zcGVjIHNhbXBsZV9zcGVjOyAgICAgICAgICAvKio8IFRoZSBzYW1wbGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc291cmNlIG91dHB1dCAqLworICAgIHBhX2NoYW5uZWxfbWFwIGNoYW5uZWxfbWFwOyAgICAgICAgICAvKio8IENoYW5uZWwgbWFwICovCisgICAgcGFfdXNlY190IGJ1ZmZlcl91c2VjOyAgICAgICAgICAgICAgIC8qKjwgTGF0ZW5jeSBkdWUgdG8gYnVmZmVyaW5nIGluIHRoZSBzb3VyY2Ugb3V0cHV0LCBzZWUgcGFfbGF0ZW5jeV9pbmZvIGZvciBkZXRhaWxzLiBcc2luY2UgMC41ICovCisgICAgcGFfdXNlY190IHNvdXJjZV91c2VjOyAgICAgICAgICAgICAgIC8qKjwgTGF0ZW5jeSBvZiB0aGUgc291cmNlIGRldmljZSwgc2VlIHBhX2xhdGVuY3lfaW5mbyBmb3IgZGV0YWlscy4gXHNpbmNlIDAuNSAqLworICAgIGNvbnN0IGNoYXIgKnJlc2FtcGxlX21ldGhvZDsgICAgICAgICAvKio8IFRocmUgcmVzYW1wbGluZyBtZXRob2QgdXNlZCBieSB0aGlzIHNvdXJjZSBvdXRwdXQuIFxzaW5jZSAwLjcgKi8KKyAgICBjb25zdCBjaGFyICpkcml2ZXI7ICAgICAgICAgICAgICAgICAgLyoqPCBEcml2ZXIgbmFtZSBcc2luY2UgMC44ICovCit9IHBhX3NvdXJjZV9vdXRwdXRfaW5mbzsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvKCkgYW5kIGZpcmVuZHMqLwordHlwZWRlZiB2b2lkICgqcGFfc291cmNlX291dHB1dF9pbmZvX2NiX3QpIChwYV9jb250ZXh0ICpjLCBjb25zdCBwYV9zb3VyY2Vfb3V0cHV0X2luZm8gKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNvdXJjZSBvdXRwdXQgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbyhwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX3NvdXJjZV9vdXRwdXRfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc291cmNlIG91dHB1dHMgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc291cmNlX291dHB1dF9pbmZvX2xpc3QocGFfY29udGV4dCAqYywgcGFfc291cmNlX291dHB1dF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIGEgc2luayBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBpbmRleCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX3ZvbHVtZV9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGNvbnN0IHBhX2N2b2x1bWUgKnZvbHVtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIGEgc2luayBkZXZpY2Ugc3BlY2lmaWVkIGJ5IGl0cyBuYW1lICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3Npbmtfdm9sdW1lX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBtdXRlIHN3aXRjaCBvZiBhIHNpbmsgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgaW5kZXggXHNpbmNlIDAuOCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX211dGVfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgbXV0ZSBzd2l0Y2ggb2YgYSBzaW5rIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIG5hbWUgXHNpbmNlIDAuOCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX211dGVfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIGEgc2luayBpbnB1dCBzdHJlYW0gKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc2luayBpbnB1dCBzdHJlYW0gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZShwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGludCBtdXRlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYSBzb3VyY2UgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgaW5kZXggXHNpbmNlIDAuOCAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYSBzb3VyY2UgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgbmFtZSBcc2luY2UgMC44ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBwYV9jdm9sdW1lICp2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIG11dGUgc3dpdGNoIG9mIGEgc291cmNlIGRldmljZSBzcGVjaWZpZWQgYnkgaXRzIGluZGV4IFxzaW5jZSAwLjggKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgbXV0ZSBzd2l0Y2ggb2YgYSBzb3VyY2UgZGV2aWNlIHNwZWNpZmllZCBieSBpdHMgbmFtZSBcc2luY2UgMC44ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBNZW1vcnkgYmxvY2sgc3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc3RhdF9pbmZvIHsKKyAgICB1aW50MzJfdCBtZW1ibG9ja190b3RhbDsgICAgICAgICAgIC8qKjwgQ3VycmVudGx5IGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzICovCisgICAgdWludDMyX3QgbWVtYmxvY2tfdG90YWxfc2l6ZTsgICAgICAvKio8IEN1cnJlbnRsIHRvdGFsIHNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgKi8KKyAgICB1aW50MzJfdCBtZW1ibG9ja19hbGxvY2F0ZWQ7ICAgICAgIC8qKjwgQWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgZHVyaW5nIHRoZSB3aG9sZSBsaWZldGltZSBvZiB0aGUgZGFlbW9uICovCisgICAgdWludDMyX3QgbWVtYmxvY2tfYWxsb2NhdGVkX3NpemU7ICAvKio8IFRvdGFsIHNpemUgb2YgYWxsIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGR1cmluZyB0aGUgd2hvbGUgbGlmZXRpbWUgb2YgdGhlIGRhZW1vbiAqLworICAgIHVpbnQzMl90IHNjYWNoZV9zaXplOyAgICAgICAgICAgICAgLyoqPCBUb3RhbCBzaXplIG9mIGFsbCBzYW1wbGUgY2FjaGUgZW50cmllcy4gXHNpbmNlIDAuNCAqLworfSBwYV9zdGF0X2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfc3RhdCgpICovCit0eXBlZGVmIHZvaWQgKCpwYV9zdGF0X2luZm9fY2JfdCkgKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3N0YXRfaW5mbyAqaSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IGRhZW1vbiBtZW1vcnkgYmxvY2sgc3RhdGlzdGljcyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3N0YXQocGFfY29udGV4dCAqYywgcGFfc3RhdF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBzYW1wbGUgY2FjaGUgZW50cmllcyAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2FtcGxlX2luZm8geworICAgIHVpbnQzMl90IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGlzIGVudHJ5ICovCisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhpcyBlbnRyeSAqLworICAgIHBhX2N2b2x1bWUgdm9sdW1lOyAgICAgICAgICAgICAgICAgICAgLyoqPCBEZWZhdWx0IHZvbHVtZSBvZiB0aGlzIGVudHJ5ICovCisgICAgcGFfc2FtcGxlX3NwZWMgc2FtcGxlX3NwZWM7ICAgICAgICAgICAvKio8IFNhbXBsZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzYW1wbGUgKi8KKyAgICBwYV9jaGFubmVsX21hcCBjaGFubmVsX21hcDsgICAgICAgICAgIC8qKjwgVGhlIGNoYW5uZWwgbWFwICovCisgICAgcGFfdXNlY190IGR1cmF0aW9uOyAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoaXMgZW50cnkgKi8KKyAgICB1aW50MzJfdCBieXRlczsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHRoaXMgc2FtcGxlIGluIGJ5dGVzLiBcc2luY2UgMC40ICovCisgICAgaW50IGxhenk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vbi16ZXJvIHdoZW4gdGhpcyBpcyBhIGxhenkgY2FjaGUgZW50cnkuIFxzaW5jZSAwLjUgKi8KKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgIC8qKjwgSW4gY2FzZSB0aGlzIGlzIGEgbGF6eSBjYWNoZSBlbnRyeSwgdGhlIGZpbGVuYW1lIGZvciB0aGUgc291bmQgZmlsZSB0byBiZSBsb2FkZWQgb24gZGVtYW5kLiBcc2luY2UgMC41ICovCit9IHBhX3NhbXBsZV9pbmZvOworCisvKiogQ2FsbGJhY2sgcHJvdG90eXBlIGZvciBwYV9jb250ZXh0X2dldF9zYW1wbGVfaW5mb19ieV9uYW1lKCkgYW5kIGZpcmVuZHMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3NhbXBsZV9pbmZvX2NiX3QpKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX3NhbXBsZV9pbmZvICppLCBpbnQgZW9sLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzYW1wbGUgYnkgaXRzIG5hbWUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfc2FtcGxlX2luZm9fYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjb25zdCBjaGFyICpuYW1lLCBwYV9zYW1wbGVfaW5mb19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzYW1wbGUgYnkgaXRzIGluZGV4ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfc2FtcGxlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIHNhbXBsZXMgc3RvcmVkIGluIHRoZSBkYWVtb24uICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfZ2V0X3NhbXBsZV9pbmZvX2xpc3QocGFfY29udGV4dCAqYywgcGFfc2FtcGxlX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogS2lsbCBhIGNsaWVudC4gXHNpbmNlIDAuNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2tpbGxfY2xpZW50KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEtpbGwgYSBzaW5rIGlucHV0LiBcc2luY2UgMC41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfa2lsbF9zaW5rX2lucHV0KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEtpbGwgYSBzb3VyY2Ugb3V0cHV0LiBcc2luY2UgMC41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfa2lsbF9zb3VyY2Vfb3V0cHV0KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIENhbGxiYWNrIHByb3RvdHlwZSBmb3IgcGFfY29udGV4dF9sb2FkX21vZHVsZSgpIGFuZCBwYV9jb250ZXh0X2FkZF9hdXRvbG9hZCgpICovCit0eXBlZGVmIHZvaWQgKCpwYV9jb250ZXh0X2luZGV4X2NiX3QpKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogTG9hZCBhIG1vZHVsZS4gXHNpbmNlIDAuNSAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X2xvYWRfbW9kdWxlKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhciAqYXJndW1lbnQsIHBhX2NvbnRleHRfaW5kZXhfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogVW5sb2FkIGEgbW9kdWxlLiBcc2luY2UgMC41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfdW5sb2FkX21vZHVsZShwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBUeXBlIG9mIGFuIGF1dG9sb2FkIGVudHJ5LiBcc2luY2UgMC41ICovCit0eXBlZGVmIGVudW0gcGFfYXV0b2xvYWRfdHlwZSB7CisgICAgUEFfQVVUT0xPQURfU0lOSyA9IDAsCisgICAgUEFfQVVUT0xPQURfU09VUkNFID0gMQorfSBwYV9hdXRvbG9hZF90eXBlX3Q7CisKKy8qKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYXV0b2xvYWQgZW50cmllcy4gXHNpbmNlIDAuNSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfYXV0b2xvYWRfaW5mbyB7CisgICAgdWludDMyX3QgaW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGlzIGF1dG9sb2FkIGVudHJ5ICovCisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzaW5rIG9yIHNvdXJjZSAqLworICAgIHBhX2F1dG9sb2FkX3R5cGVfdCB0eXBlOyAgIC8qKjwgVHlwZSBvZiB0aGUgYXV0b2xvYWQgZW50cnkgKi8KKyAgICBjb25zdCBjaGFyICptb2R1bGU7ICAgICAgICAgICAvKio8IE1vZHVsZSBuYW1lIHRvIGxvYWQgKi8KKyAgICBjb25zdCBjaGFyICphcmd1bWVudDsgICAgICAgICAvKio8IEFyZ3VtZW50IHN0cmluZyBmb3IgbW9kdWxlICovCit9IHBhX2F1dG9sb2FkX2luZm87CisKKy8qKiBDYWxsYmFjayBwcm90b3R5cGUgZm9yIHBhX2NvbnRleHRfZ2V0X2F1dG9sb2FkX2luZm9fYnlfbmFtZSgpIGFuZCBmaXJlbmRzICovCit0eXBlZGVmIHZvaWQgKCpwYV9hdXRvbG9hZF9pbmZvX2NiX3QpKHBhX2NvbnRleHQgKmMsIGNvbnN0IHBhX2F1dG9sb2FkX2luZm8gKmksIGludCBlb2wsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvIGFib3V0IGEgc3BlY2lmaWMgYXV0b2xvYWQgZW50cnkuIFxzaW5jZSAwLjYgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfYXV0b2xvYWRfaW5mb19ieV9uYW1lKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2F1dG9sb2FkX3R5cGVfdCB0eXBlLCBwYV9hdXRvbG9hZF9pbmZvX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEdldCBpbmZvIGFib3V0IGEgc3BlY2lmaWMgYXV0b2xvYWQgZW50cnkuIFxzaW5jZSAwLjYgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfYXV0b2xvYWRfaW5mb19ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIHBhX2F1dG9sb2FkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGF1dG9sb2FkIGVudHJpZXMuIFxzaW5jZSAwLjUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9nZXRfYXV0b2xvYWRfaW5mb19saXN0KHBhX2NvbnRleHQgKmMsIHBhX2F1dG9sb2FkX2luZm9fY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQWRkIGEgbmV3IGF1dG9sb2FkIGVudHJ5LiBcc2luY2UgMC41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfYWRkX2F1dG9sb2FkKHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIHBhX2F1dG9sb2FkX3R5cGVfdCB0eXBlLCBjb25zdCBjaGFyICptb2R1bGUsIGNvbnN0IGNoYXIqYXJndW1lbnQsIHBhX2NvbnRleHRfaW5kZXhfY2JfdCwgdm9pZCogdXNlcmRhdGEpOworCisvKiogUmVtb3ZlIGFuIGF1dG9sb2FkIGVudHJ5LiBcc2luY2UgMC42ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfcmVtb3ZlX2F1dG9sb2FkX2J5X25hbWUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfYXV0b2xvYWRfdHlwZV90IHR5cGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBSZW1vdmUgYW4gYXV0b2xvYWQgZW50cnkuIFxzaW5jZSAwLjYgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9yZW1vdmVfYXV0b2xvYWRfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCogdXNlcmRhdGEpOworCisvKiogTW92ZSB0aGUgc3BlY2lmaWVkIHNpbmsgaW5wdXQgdG8gYSBkaWZmZXJlbnQgc2luay4gXHNpbmNlIDAuOS41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfbW92ZV9zaW5rX2lucHV0X2J5X25hbWUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjaGFyICpzaW5rX25hbWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBNb3ZlIHRoZSBzcGVjaWZpZWQgc2luayBpbnB1dCB0byBhIGRpZmZlcmVudCBzaW5rLiBcc2luY2UgMC45LjUgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9tb3ZlX3NpbmtfaW5wdXRfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCB1aW50MzJfdCBzaW5rX2lkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIE1vdmUgdGhlIHNwZWNpZmllZCBzb3VyY2Ugb3V0cHV0IHRvIGEgZGlmZmVyZW50IHNvdXJjZS4gXHNpbmNlIDAuOS41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfbW92ZV9zb3VyY2Vfb3V0cHV0X2J5X25hbWUocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBjaGFyICpzb3VyY2VfbmFtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIE1vdmUgdGhlIHNwZWNpZmllZCBzb3VyY2Ugb3V0cHV0IHRvIGEgZGlmZmVyZW50IHNvdXJjZS4gXHNpbmNlIDAuOS41ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfbW92ZV9zb3VyY2Vfb3V0cHV0X2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgdWludDMyX3Qgc291cmNlX2lkeCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIFN1c3BlbmQvUmVzdW1lIGEgc2luay4gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3VzcGVuZF9zaW5rX2J5X25hbWUocGFfY29udGV4dCAqYywgY2hhciAqc2lua19uYW1lLCBpbnQgc3VzcGVuZCwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQqIHVzZXJkYXRhKTsKKworLyoqIFN1c3BlbmQvUmVzdW1lIGEgc2luay4gSWYgaWR4IGlzIFBBX0lOVkFMSURfSU5ERVggYWxsIHNpbmtzIHdpbGwgYmUgc3VzcGVuZGVkLiBcc2luY2UgMC45LjcgKi8KK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zdXNwZW5kX3NpbmtfYnlfaW5kZXgocGFfY29udGV4dCAqYywgdWludDMyX3QgaWR4LCBpbnQgc3VzcGVuZCwgIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBTdXNwZW5kL1Jlc3VtZSBhIHNvdXJjZS4gXHNpbmNlIDAuOS43ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3VzcGVuZF9zb3VyY2VfYnlfbmFtZShwYV9jb250ZXh0ICpjLCBjaGFyICpzb3VyY2VfbmFtZSwgaW50IHN1c3BlbmQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qKiBTdXNwZW5kL1Jlc3VtZSBhIHNvdXJjZS4gSWYgaWR4IGlzIFBBX0lOVkFMSURfSU5ERVggYWxsIHNvdXJjZXMgd2lsbCBiZSBzdXNwZW5kZWQuIFxzaW5jZSAwLjkuNyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3N1c3BlbmRfc291cmNlX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgaW50IHN1c3BlbmQsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkKiB1c2VyZGF0YSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLWFwaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTIxZTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1hcGkuaApAQCAtMCwwICsxLDEyNCBAQAorI2lmbmRlZiBmb29tYWlubG9vcGFwaWhmb28KKyNkZWZpbmUgZm9vbWFpbmxvb3BhcGloZm9vCisKKy8qICRJZDogbWFpbmxvb3AtYXBpLmggMTQyNiAyMDA3LTAyLTEzIDE1OjM1OjE5WiBvc3NtYW4gJCAqLworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisKKy8qKiBcZmlsZQorICoKKyAqIE1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllci4gQm90aCB0aGUgUHVsc2VBdWRpbyBjb3JlIGFuZCB0aGUKKyAqIFB1bHNlQXVkaW8gY2xpZW50IGxpYnJhcnkgdXNlIGEgbWFpbiBsb29wIGFic3RyYWN0aW9uIGxheWVyLiBEdWUgdG8KKyAqIHRoaXMgaXQgaXMgcG9zc2libGUgdG8gZW1iZWQgUHVsc2VBdWRpbyBpbnRvIG90aGVyCisgKiBhcHBsaWNhdGlvbnMgZWFzaWx5LiBUd28gbWFpbiBsb29wIGltcGxlbWVuYXRpb25zIGFyZQorICogY3VycmVudGx5IGF2YWlsYWJsZToKKyAqIFxsaSBBIG1pbmltYWwgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIEMgbGlicmFyeSdzIHBvbGwoKSBmdW5jdGlvbiAoU2VlIFxyZWYgbWFpbmxvb3AuaCkKKyAqIFxsaSBBIHdyYXBwZXIgYXJvdW5kIHRoZSBHTElCIG1haW4gbG9vcC4gVXNlIHRoaXMgdG8gZW1iZWQgUHVsc2VBdWRpbyBpbnRvIHlvdXIgR0xJQi9HVEsrL0dOT01FIHByb2dyYW1zIChTZWUgXHJlZiBnbGliLW1haW5sb29wLmgpCisgKgorICogVGhlIHN0cnVjdHVyZSBwYV9tYWlubG9vcF9hcGkgaXMgdXNlZCBhcyB2dGFibGUgZm9yIHRoZSBtYWluIGxvb3AgYWJzdHJhY3Rpb24uCisgKgorICogVGhpcyBtYWlubG9vcCBhYnN0cmFjdGlvbiBsYXllciBoYXMgbm8gZGlyZWN0IHN1cHBvcnQgZm9yIFVOSVggc2lnbmFscy4gR2VuZXJpYywgbWFpbmxvb3AgaW1wbGVtZW50YXRpb24gYWdub3N0aWMgc3VwcG9ydCBpcyBhdmFpbGFibGUgdGhyb3VnaHQgXHJlZiBtYWlubG9vcC1zaWduYWwuaC4KKyAqICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQW4gYWJzdHJhY3QgbWFpbmxvb3AgQVBJIHZ0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfbWFpbmxvb3BfYXBpIHBhX21haW5sb29wX2FwaTsKKworLyoqIEEgYml0bWFzayBmb3IgSU8gZXZlbnRzICovCit0eXBlZGVmIGVudW0gcGFfaW9fZXZlbnRfZmxhZ3MgeworICAgIFBBX0lPX0VWRU5UX05VTEwgPSAwLCAgICAgLyoqPCBObyBldmVudCAqLworICAgIFBBX0lPX0VWRU5UX0lOUFVUID0gMSwgICAgLyoqPCBJbnB1dCBldmVudCAqLworICAgIFBBX0lPX0VWRU5UX09VVFBVVCA9IDIsICAgLyoqPCBPdXRwdXQgZXZlbnQgKi8KKyAgICBQQV9JT19FVkVOVF9IQU5HVVAgPSA0LCAgIC8qKjwgSGFuZ3VwIGV2ZW50ICovCisgICAgUEFfSU9fRVZFTlRfRVJST1IgPSA4ICAgICAvKio8IEVycm9yIGV2ZW50ICovCit9IHBhX2lvX2V2ZW50X2ZsYWdzX3Q7CisKKy8qKiBBbiBvcGFxdWUgSU8gZXZlbnQgc291cmNlIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfaW9fZXZlbnQgcGFfaW9fZXZlbnQ7CisvKiogQW4gSU8gZXZlbnQgY2FsbGJhY2sgcHJvdG95cGUgXHNpbmNlIDAuOS4zICovCit0eXBlZGVmIHZvaWQgKCpwYV9pb19ldmVudF9jYl90KShwYV9tYWlubG9vcF9hcGkqZWEsIHBhX2lvX2V2ZW50KiBlLCBpbnQgZmQsIHBhX2lvX2V2ZW50X2ZsYWdzX3QgZXZlbnRzLCB2b2lkICp1c2VyZGF0YSk7CisvKiogQSBJTyBldmVudCBkZXN0cm95IGNhbGxiYWNrIHByb3RvdHlwZSBcIHNpbmNlIDAuOS4zICovCit0eXBlZGVmIHZvaWQgKCpwYV9pb19ldmVudF9kZXN0cm95X2NiX3QpKHBhX21haW5sb29wX2FwaSphLCBwYV9pb19ldmVudCAqZSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQW4gb3BhcXVlIHRpbWVyIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3RpbWVfZXZlbnQgcGFfdGltZV9ldmVudDsKKy8qKiBBIHRpbWUgZXZlbnQgY2FsbGJhY2sgcHJvdG90eXBlIFxzaW5jZSAwLjkuMyAqLwordHlwZWRlZiB2b2lkICgqcGFfdGltZV9ldmVudF9jYl90KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfdGltZV9ldmVudCogZSwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2LCB2b2lkICp1c2VyZGF0YSk7CisvKiogQSB0aW1lIGV2ZW50IGRlc3Ryb3kgY2FsbGJhY2sgcHJvdG90eXBlIFwgc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3RpbWVfZXZlbnRfZGVzdHJveV9jYl90KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfdGltZV9ldmVudCAqZSwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQW4gb3BhcXVlIGRlZmVycmVkIGV2ZW50IHNvdXJjZSBvYmplY3QuIEV2ZW50cyBvZiB0aGlzIHR5cGUgYXJlIHRyaWdnZXJlZCBvbmNlIGluIGV2ZXJ5IG1haW4gbG9vcCBpdGVyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IHBhX2RlZmVyX2V2ZW50IHBhX2RlZmVyX2V2ZW50OworLyoqIEEgZGVmZXIgZXZlbnQgY2FsbGJhY2sgcHJvdG95cGUgXHNpbmNlIDAuOS4zICovCit0eXBlZGVmIHZvaWQgKCpwYV9kZWZlcl9ldmVudF9jYl90KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfZGVmZXJfZXZlbnQqIGUsIHZvaWQgKnVzZXJkYXRhKTsKKy8qKiBBIGRlZmVyIGV2ZW50IGRlc3Ryb3kgY2FsbGJhY2sgcHJvdG90eXBlIFwgc2luY2UgMC45LjMgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2RlZmVyX2V2ZW50X2Rlc3Ryb3lfY2JfdCkocGFfbWFpbmxvb3BfYXBpKmEsIHBhX2RlZmVyX2V2ZW50ICplLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBbiBhYnN0cmFjdCBtYWlubG9vcCBBUEkgdnRhYmxlICovCitzdHJ1Y3QgcGFfbWFpbmxvb3BfYXBpICB7CisgICAgLyoqIEEgcG9pbnRlciB0byBzb21lIHByaXZhdGUsIGFyYml0cmFyeSBkYXRhIG9mIHRoZSBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gKi8KKyAgICB2b2lkICp1c2VyZGF0YTsKKworICAgIC8qKiBDcmVhdGUgYSBuZXcgSU8gZXZlbnQgc291cmNlIG9iamVjdCAqLworICAgIHBhX2lvX2V2ZW50KiAoKmlvX25ldykocGFfbWFpbmxvb3BfYXBpKmEsIGludCBmZCwgcGFfaW9fZXZlbnRfZmxhZ3NfdCBldmVudHMsIHBhX2lvX2V2ZW50X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKyAgICAvKiogRW5hYmxlIG9yIGRpc2FibGUgSU8gZXZlbnRzIG9uIHRoaXMgb2JqZWN0ICovCisgICAgdm9pZCAoKmlvX2VuYWJsZSkocGFfaW9fZXZlbnQqIGUsIHBhX2lvX2V2ZW50X2ZsYWdzX3QgZXZlbnRzKTsKKyAgICAvKiogRnJlZSBhIElPIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KKyAgICB2b2lkICgqaW9fZnJlZSkocGFfaW9fZXZlbnQqIGUpOworICAgIC8qKiBTZXQgYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBJTyBldmVudCBzb3VyY2UgaXMgZGVzdHJveWVkLiBVc2UgdGhpcyB0byBmcmVlIHRoZSB1c2VyZGF0YSBhcmd1bWVudCBpZiByZXF1aXJlZCAqLworICAgIHZvaWQgKCppb19zZXRfZGVzdHJveSkocGFfaW9fZXZlbnQgKmUsIHBhX2lvX2V2ZW50X2Rlc3Ryb3lfY2JfdCBjYik7CisKKyAgICAvKiogQ3JlYXRlIGEgbmV3IHRpbWVyIGV2ZW50IHNvdXJjZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVW5peCB0aW1lICovCisgICAgcGFfdGltZV9ldmVudCogKCp0aW1lX25ldykocGFfbWFpbmxvb3BfYXBpKmEsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0diwgcGFfdGltZV9ldmVudF9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisgICAgLyoqIFJlc3RhcnQgYSBydW5uaW5nIG9yIGV4cGlyZWQgdGltZXIgZXZlbnQgc291cmNlIHdpdGggYSBuZXcgVW5peCB0aW1lICovCisgICAgdm9pZCAoKnRpbWVfcmVzdGFydCkocGFfdGltZV9ldmVudCogZSwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2KTsKKyAgICAvKiogRnJlZSBhIGRlZmVycmVkIHRpbWVyIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KKyAgICB2b2lkICgqdGltZV9mcmVlKShwYV90aW1lX2V2ZW50KiBlKTsKKyAgICAvKiogU2V0IGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdGltZXIgZXZlbnQgc291cmNlIGlzIGRlc3Ryb3llZC4gVXNlIHRoaXMgdG8gZnJlZSB0aGUgdXNlcmRhdGEgYXJndW1lbnQgaWYgcmVxdWlyZWQgKi8KKyAgICB2b2lkICgqdGltZV9zZXRfZGVzdHJveSkocGFfdGltZV9ldmVudCAqZSwgcGFfdGltZV9ldmVudF9kZXN0cm95X2NiX3QgY2IpOworCisgICAgLyoqIENyZWF0ZSBhIG5ldyBkZWZlcnJlZCBldmVudCBzb3VyY2Ugb2JqZWN0ICovCisgICAgcGFfZGVmZXJfZXZlbnQqICgqZGVmZXJfbmV3KShwYV9tYWlubG9vcF9hcGkqYSwgcGFfZGVmZXJfZXZlbnRfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworICAgIC8qKiBFbmFibGUgb3IgZGlzYWJsZSBhIGRlZmVycmVkIGV2ZW50IHNvdXJjZSB0ZW1wb3JhcmlseSAqLworICAgIHZvaWQgKCpkZWZlcl9lbmFibGUpKHBhX2RlZmVyX2V2ZW50KiBlLCBpbnQgYik7CisgICAgLyoqIEZyZWUgYSBkZWZlcnJlZCBldmVudCBzb3VyY2Ugb2JqZWN0ICovCisgICAgdm9pZCAoKmRlZmVyX2ZyZWUpKHBhX2RlZmVyX2V2ZW50KiBlKTsKKyAgICAvKiogU2V0IGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZGVmZXJyZWQgZXZlbnQgc291cmNlIGlzIGRlc3Ryb3llZC4gVXNlIHRoaXMgdG8gZnJlZSB0aGUgdXNlcmRhdGEgYXJndW1lbnQgaWYgcmVxdWlyZWQgKi8KKyAgICB2b2lkICgqZGVmZXJfc2V0X2Rlc3Ryb3kpKHBhX2RlZmVyX2V2ZW50ICplLCBwYV9kZWZlcl9ldmVudF9kZXN0cm95X2NiX3QgY2IpOworCisgICAgLyoqIEV4aXQgdGhlIG1haW4gbG9vcCBhbmQgcmV0dXJuIHRoZSBzcGVjZmllZCByZXR2YWwqLworICAgIHZvaWQgKCpxdWl0KShwYV9tYWlubG9vcF9hcGkqYSwgaW50IHJldHZhbCk7Cit9OworCisvKiogUnVuIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2sgZnVuY3Rpb24gb25jZSBmcm9tIHRoZSBtYWluIGxvb3AgdXNpbmcgYW4gYW5vbnltb3VzIGRlZmVyIGV2ZW50LiAqLwordm9pZCBwYV9tYWlubG9vcF9hcGlfb25jZShwYV9tYWlubG9vcF9hcGkqbSwgdm9pZCAoKmNhbGxiYWNrKShwYV9tYWlubG9vcF9hcGkqbSwgdm9pZCAqdXNlcmRhdGEpLCB2b2lkICp1c2VyZGF0YSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL21haW5sb29wLXNpZ25hbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJmNmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC1zaWduYWwuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIGZvb21haW5sb29wc2lnbmFsaGZvbworI2RlZmluZSBmb29tYWlubG9vcHNpZ25hbGhmb28KKworLyogJElkOiBtYWlubG9vcC1zaWduYWwuaCAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLWFwaS5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogXGZpbGUKKyAqIFVOSVggc2lnbmFsIHN1cHBvcnQgZm9yIG1haW4gbG9vcHMuIEluIGNvbnRyYXN0IHRvIG90aGVyCisgKiBtYWluIGxvb3AgZXZlbnQgc291cmNlcyBzdWNoIGFzIHRpbWVyIGFuZCBJTyBldmVudHMsIFVOSVggc2lnbmFsCisgKiBzdXBwb3J0IHJlcXVpcmVzIG1vZGlmaWNhdGlvbiBvZiB0aGUgZ2xvYmFsIHByb2Nlc3MKKyAqIGVudmlyb25tZW50LiBEdWUgdG8gdGhpcyB0aGUgZ2VuZXJpYyBtYWluIGxvb3AgYWJzdHJhY3Rpb24gbGF5ZXIgYXMKKyAqIGRlZmluZWQgaW4gXHJlZiBtYWlubG9vcC1hcGkuaCBkb2Vzbid0IGhhdmUgZGlyZWN0IHN1cHBvcnQgZm9yIFVOSVgKKyAqIHNpZ25hbHMuIEhvd2V2ZXIsIHlvdSBtYXkgaG9vayBzaWduYWwgc3VwcG9ydCBpbnRvIGFuIGFic3RyYWN0IG1haW4gbG9vcCB2aWEgdGhlIHJvdXRpbmVzIGRlZmluZWQgaGVyZWluLgorICovCisKKy8qKiBJbml0aWFsaXplIHRoZSBVTklYIHNpZ25hbCBzdWJzeXN0ZW0gYW5kIGJpbmQgaXQgdG8gdGhlIHNwZWNpZmllZCBtYWluIGxvb3AgKi8KK2ludCBwYV9zaWduYWxfaW5pdChwYV9tYWlubG9vcF9hcGkgKmFwaSk7CisKKy8qKiBDbGVhbnVwIHRoZSBzaWduYWwgc3Vic3lzdGVtICovCit2b2lkIHBhX3NpZ25hbF9kb25lKHZvaWQpOworCisvKiogQW4gb3BhcXVlIFVOSVggc2lnbmFsIGV2ZW50IHNvdXJjZSBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX3NpZ25hbF9ldmVudCBwYV9zaWduYWxfZXZlbnQ7CisKKy8qKiBDcmVhdGUgYSBuZXcgVU5JWCBzaWduYWwgZXZlbnQgc291cmNlIG9iamVjdCAqLworcGFfc2lnbmFsX2V2ZW50KiBwYV9zaWduYWxfbmV3KGludCBzaWcsIHZvaWQgKCpjYWxsYmFjaykgKHBhX21haW5sb29wX2FwaSAqYXBpLCBwYV9zaWduYWxfZXZlbnQqZSwgaW50IHNpZywgdm9pZCAqdXNlcmRhdGEpLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBGcmVlIGEgVU5JWCBzaWduYWwgZXZlbnQgc291cmNlIG9iamVjdCAqLwordm9pZCBwYV9zaWduYWxfZnJlZShwYV9zaWduYWxfZXZlbnQgKmUpOworCisvKiogU2V0IGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgc2lnbmFsIGV2ZW50IHNvdXJjZSBpcyBkZXN0cm95ZWQuIFVzZSB0aGlzIHRvIGZyZWUgdGhlIHVzZXJkYXRhIGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCit2b2lkIHBhX3NpZ25hbF9zZXRfZGVzdHJveShwYV9zaWduYWxfZXZlbnQgKmUsIHZvaWQgKCpjYWxsYmFjaykgKHBhX21haW5sb29wX2FwaSAqYXBpLCBwYV9zaWduYWxfZXZlbnQqZSwgdm9pZCAqdXNlcmRhdGEpKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvbWFpbmxvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVlODVhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9tYWlubG9vcC5oCkBAIC0wLDAgKzEsMTMwIEBACisjaWZuZGVmIGZvb21haW5sb29waGZvbworI2RlZmluZSBmb29tYWlubG9vcGhmb28KKworLyogJElkOiBtYWlubG9vcC5oIDE0MjYgMjAwNy0wMi0xMyAxNTozNToxOVogb3NzbWFuICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3AtYXBpLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworUEFfQ19ERUNMX0JFR0lOCisKK3N0cnVjdCBwb2xsZmQ7CisKKy8qKiBccGFnZSBtYWlubG9vcCBNYWluIExvb3AKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgYnVpbHQtaW4gbWFpbiBsb29wIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBwb2xsKCkgc3lzdGVtIGNhbGwuCisgKiBJdCBzdXBwb3J0cyB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1haW4gbG9vcCBhYnN0cmFjdGlvbiBhbmQgdmVyeQorICogbGl0dGxlIGVsc2UuCisgKgorICogVGhlIG1haW4gbG9vcCBpcyBjcmVhdGVkIHVzaW5nIHBhX21haW5sb29wX25ldygpIGFuZCBkZXN0cm95ZWQgdXNpbmcKKyAqIHBhX21haW5sb29wX2ZyZWUoKS4gVG8gZ2V0IGFjY2VzcyB0byB0aGUgbWFpbiBsb29wIGFic3RyYWN0aW9uLAorICogcGFfbWFpbmxvb3BfZ2V0X2FwaSgpIGlzIHVzZWQuCisgKgorICogXHNlY3Rpb24gaXRlcl9zZWMgSXRlcmF0aW9uCisgKgorICogVGhlIG1haW4gbG9vcCBpcyBkZXNpZ25lZCBhcm91bmQgdGhlIGNvbmNlcHQgb2YgaXRlcmF0aW9ucy4gRWFjaCBpdGVyYXRpb24KKyAqIGNvbnNpc3RzIG9mIHRocmVlIHN0ZXBzIHRoYXQgcmVwZWF0IGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBlbnRpcmUKKyAqIGxpZmV0aW1lOgorICoKKyAqIC0jIFByZXBhcmUgLSBCdWlsZCBhIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycworICogICAgICAgICAgICAgICB0aGF0IG5lZWQgdG8gYmUgbW9uaXRvcmVkIGFuZCBjYWxjdWxhdGUgdGhlIG5leHQgdGltZW91dC4KKyAqIC0jIFBvbGwgLSBFeGVjdXRlIHRoZSBhY3R1YWxsIHBvbGwoKSBzeXN0ZW0gY2FsbC4KKyAqIC0jIERpc3BhdGNoIC0gRGlzcGF0Y2ggYW55IGV2ZW50cyB0aGF0IGhhdmUgZmlyZWQuCisgKgorICogV2hlbiB1c2luZyB0aGUgbWFpbiBsb29wLCB0aGUgYXBwbGljYXRpb24gY2FuIGVpdGhlciBleGVjdXRlIGVhY2gKKyAqIGl0ZXJhdGlvbiwgb25lIGF0IGEgdGltZSwgdXNpbmcgcGFfbWFpbmxvb3BfaXRlcmF0ZSgpLCBvciBsZXQgdGhlIGxpYnJhcnkKKyAqIGl0ZXJhdGUgYXV0b21hdGljYWxseSB1c2luZyBwYV9tYWlubG9vcF9ydW4oKS4KKyAqCisgKiBcc2VjdGlvbiB0aHJlYWRfc2VjIFRocmVhZHMKKyAqCisgKiBUaGUgbWFpbiBsb29wIGZ1bmN0aW9ucyBhcmUgZGVzaWduZWQgdG8gYmUgdGhyZWFkIHNhZmUsIGJ1dCB0aGUgb2JqZWN0cworICogYXJlIG5vdC4gV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgbXVsdGlwbGUgbWFpbiBsb29wcyBjYW4gYmUgdXNlZCwgYnV0IG9ubHkKKyAqIG9uZSBvYmplY3QgcGVyIHRocmVhZC4KKyAqCisgKi8KKworLyoqIFxmaWxlCisgKgorICogQSBtaW5pbWFsIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiB0aGUgQyBsaWJyYXJ5J3MgcG9sbCgpCisgKiBmdW5jdGlvbi4gVXNpbmcgdGhlIHJvdXRpbmVzIGRlZmluZWQgaGVyZWluIHlvdSBtYXkgY3JlYXRlIGEgc2ltcGxlCisgKiBtYWluIGxvb3Agc3VwcG9ydGluZyB0aGUgZ2VuZXJpYyBtYWluIGxvb3AgYWJzdHJhY3Rpb24gbGF5ZXIgYXMKKyAqIGRlZmluZWQgaW4gXHJlZiBtYWlubG9vcC1hcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0aHJlYWQgc2FmZQorICogYXMgbG9uZyBhcyB5b3UgYWNjZXNzIHRoZSBtYWluIGxvb3Agb2JqZWN0IGZyb20gYSBzaW5nbGUgdGhyZWFkIG9ubHkuKi8KKworLyoqIEFuIG9wYXF1ZSBtYWluIGxvb3Agb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBwYV9tYWlubG9vcCBwYV9tYWlubG9vcDsKKworLyoqIEFsbG9jYXRlIGEgbmV3IG1haW4gbG9vcCBvYmplY3QgKi8KK3BhX21haW5sb29wICpwYV9tYWlubG9vcF9uZXcodm9pZCk7CisKKy8qKiBGcmVlIGEgbWFpbiBsb29wIG9iamVjdCAqLwordm9pZCBwYV9tYWlubG9vcF9mcmVlKHBhX21haW5sb29wKiBtKTsKKworLyoqIFByZXBhcmUgZm9yIGEgc2luZ2xlIGl0ZXJhdGlvbiBvZiB0aGUgbWFpbiBsb29wLiBSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUKK29uIGVycm9yIG9yIGV4aXQgcmVxdWVzdC4gdGltZW91dCBzcGVjaWZpZXMgYSBtYXhpbXVtIHRpbWVvdXQgZm9yIHRoZSBzdWJzZXF1ZW50Citwb2xsLCBvciAtMSBmb3IgYmxvY2tpbmcgYmVoYXZpb3VyLiAuKi8KK2ludCBwYV9tYWlubG9vcF9wcmVwYXJlKHBhX21haW5sb29wICptLCBpbnQgdGltZW91dCk7CisKKy8qKiBFeGVjdXRlIHRoZSBwcmV2aW91c2x5IHByZXBhcmVkIHBvbGwuIFJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4qLworaW50IHBhX21haW5sb29wX3BvbGwocGFfbWFpbmxvb3AgKm0pOworCisvKiogRGlzcGF0Y2ggdGltZW91dCwgaW8gYW5kIGRlZmVycmVkIGV2ZW50cyBmcm9tIHRoZSBwcmV2aW91c2x5IGV4ZWN1dGVkIHBvbGwuIFJldHVybnMKK2EgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuIE9uIHN1Y2Nlc3MgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNvdXJjZSBkaXNwYXRjaGVkLiAqLworaW50IHBhX21haW5sb29wX2Rpc3BhdGNoKHBhX21haW5sb29wICptKTsKKworLyoqIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIGFzIHNwZWNpZmllZCB3aXRoIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZS4gKi8KK2ludCBwYV9tYWlubG9vcF9nZXRfcmV0dmFsKHBhX21haW5sb29wICptKTsKKworLyoqIFJ1biBhIHNpbmdsZSBpdGVyYXRpb24gb2YgdGhlIG1haW4gbG9vcC4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uCitmb3IgcGFfbWFpbmxvb3BfcHJlcGFyZSgpLCBwYV9tYWlubG9vcF9wb2xsKCkgYW5kIHBhX21haW5sb29wX2Rpc3BhdGNoKCkuCitSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3Igb3IgZXhpdCByZXF1ZXN0LiBJZiBibG9jayBpcyBub256ZXJvLAorYmxvY2sgZm9yIGV2ZW50cyBpZiBub25lIGFyZSBxdWV1ZWQuIE9wdGlvbmFsbHkgcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgYXMKK3NwZWNpZmllZCB3aXRoIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZSBpbiB0aGUgaW50ZWdlciB2YXJpYWJsZSByZXR2YWwgcG9pbnRzCit0by4gT24gc3VjY2VzcyByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc291cmNlcyBkaXNwYXRjaGVkIGluIHRoaXMgaXRlcmF0aW9uLiAqLworaW50IHBhX21haW5sb29wX2l0ZXJhdGUocGFfbWFpbmxvb3AgKm0sIGludCBibG9jaywgaW50ICpyZXR2YWwpOworCisvKiogUnVuIHVubGltaXRlZCBpdGVyYXRpb25zIG9mIHRoZSBtYWluIGxvb3Agb2JqZWN0IHVudGlsIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZSBpcyBjYWxsZWQuICovCitpbnQgcGFfbWFpbmxvb3BfcnVuKHBhX21haW5sb29wICptLCBpbnQgKnJldHZhbCk7CisKKy8qKiBSZXR1cm4gdGhlIGFic3RyYWN0IG1haW4gbG9vcCBhYnN0cmFjdGlvbiBsYXllciB2dGFibGUgZm9yIHRoaXMgbWFpbiBsb29wLiAqLworcGFfbWFpbmxvb3BfYXBpKiBwYV9tYWlubG9vcF9nZXRfYXBpKHBhX21haW5sb29wKm0pOworCisvKiogU2h1dGRvd24gdGhlIG1haW4gbG9vcCAqLwordm9pZCBwYV9tYWlubG9vcF9xdWl0KHBhX21haW5sb29wICptLCBpbnQgcik7CisKKy8qKiBJbnRlcnJ1cHQgYSBydW5uaW5nIHBvbGwgKGZvciB0aHJlYWRlZCBzeXN0ZW1zKSAqLwordm9pZCBwYV9tYWlubG9vcF93YWtldXAocGFfbWFpbmxvb3AgKm0pOworCisvKiogR2VuZXJpYyBwcm90b3R5cGUgb2YgYSBwb2xsKCkgbGlrZSBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCpwYV9wb2xsX2Z1bmMpKHN0cnVjdCBwb2xsZmQgKnVmZHMsIHVuc2lnbmVkIGxvbmcgbmZkcywgaW50IHRpbWVvdXQsIHZvaWQqdXNlcmRhdGEpOworCisvKiogQ2hhbmdlIHRoZSBwb2xsKCkgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQgcGFfbWFpbmxvb3Bfc2V0X3BvbGxfZnVuYyhwYV9tYWlubG9vcCAqbSwgcGFfcG9sbF9mdW5jIHBvbGxfZnVuYywgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9vcGVyYXRpb24uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvb3BlcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ZDA0NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvb3BlcmF0aW9uLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBmb29vcGVyYXRpb25oZm9vCisjZGVmaW5lIGZvb29wZXJhdGlvbmhmb28KKworLyogJElkOiBvcGVyYXRpb24uaCAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL2RlZi5oPgorCisvKiogXGZpbGUKKyAqIEFzeW5jaHJvbm91cyBvcGVyYXRpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHBhX29wZXJhdGlvbiBwYV9vcGVyYXRpb247CisKKy8qKiBJbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSAqLworcGFfb3BlcmF0aW9uICpwYV9vcGVyYXRpb25fcmVmKHBhX29wZXJhdGlvbiAqbyk7CisKKy8qKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSAqLwordm9pZCBwYV9vcGVyYXRpb25fdW5yZWYocGFfb3BlcmF0aW9uICpvKTsKKworLyoqIENhbmNlbCB0aGUgb3BlcmF0aW9uLiBCZXdhcmUhIFRoaXMgd2lsbCBub3QgbmVjZXNzYXJpbHkgY2FuY2VsIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUuICovCit2b2lkIHBhX29wZXJhdGlvbl9jYW5jZWwocGFfb3BlcmF0aW9uICpvKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbiAqLworcGFfb3BlcmF0aW9uX3N0YXRlX3QgcGFfb3BlcmF0aW9uX2dldF9zdGF0ZShwYV9vcGVyYXRpb24gKm8pOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wdWxzZWF1ZGlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3B1bHNlYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk3Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9wdWxzZWF1ZGlvLmgKQEAgLTAsMCArMSwxMTcgQEAKKyNpZm5kZWYgZm9vcHVsc2VhdWRpb2hmb28KKyNkZWZpbmUgZm9vcHVsc2VhdWRpb2hmb28KKworLyogJElkOiBwdWxzZWF1ZGlvLmggMTQyNiAyMDA3LTAyLTEzIDE1OjM1OjE5WiBvc3NtYW4gJCAqLworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9zYW1wbGUuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2Uvc3RyZWFtLmg+CisjaW5jbHVkZSA8cHVsc2UvaW50cm9zcGVjdC5oPgorI2luY2x1ZGUgPHB1bHNlL3N1YnNjcmliZS5oPgorI2luY2x1ZGUgPHB1bHNlL3NjYWNoZS5oPgorI2luY2x1ZGUgPHB1bHNlL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwdWxzZS9lcnJvci5oPgorI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorI2luY2x1ZGUgPHB1bHNlL2NoYW5uZWxtYXAuaD4KKyNpbmNsdWRlIDxwdWxzZS92b2x1bWUuaD4KKyNpbmNsdWRlIDxwdWxzZS94bWFsbG9jLmg+CisjaW5jbHVkZSA8cHVsc2UvdXRmOC5oPgorI2luY2x1ZGUgPHB1bHNlL3RocmVhZC1tYWlubG9vcC5oPgorI2luY2x1ZGUgPHB1bHNlL21haW5sb29wLmg+CisjaW5jbHVkZSA8cHVsc2UvbWFpbmxvb3Atc2lnbmFsLmg+CisjaW5jbHVkZSA8cHVsc2UvdXRpbC5oPgorI2luY2x1ZGUgPHB1bHNlL3RpbWV2YWwuaD4KKworLyoqIFxmaWxlCisgKiBJbmNsdWRlIGFsbCBsaWJwdWxzZSBoZWFkZXIgZmlsZXMgYXQgb25jZS4gVGhlIGZvbGxvd2luZworICogZmlsZXMgYXJlIGluY2x1ZGVkOiBccmVmIG1haW5sb29wLWFwaS5oLCBccmVmIHNhbXBsZS5oLCBccmVmIGRlZi5oLAorICogXHJlZiBjb250ZXh0LmgsIFxyZWYgc3RyZWFtLmgsIFxyZWYgaW50cm9zcGVjdC5oLCBccmVmIHN1YnNjcmliZS5oLAorICogXHJlZiBzY2FjaGUuaCwgXHJlZiB2ZXJzaW9uLmgsIFxyZWYgZXJyb3IuaCwgXHJlZiBjaGFubmVsbWFwLmgsCisgKiBccmVmIG9wZXJhdGlvbi5oLFxyZWYgdm9sdW1lLmgsIFxyZWYgeG1hbGxvYy5oLCBccmVmIHV0ZjguaCwgXHJlZgorICogdGhyZWFkLW1haW5sb29wLmgsIFxyZWYgbWFpbmxvb3AuaCwgXHJlZiB1dGlsLmgsIFxyZWYgdGltZXZhbC5oIGFuZAorICogXHJlZiBtYWlubG9vcC1zaWduYWwuaCBhdCBvbmNlICovCisKKy8qKiBcbWFpbnBhZ2UKKyAqCisgKiBcc2VjdGlvbiBpbnRyb19zZWMgSW50cm9kdWN0aW9uCisgKgorICogVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNsaWVudCBBUEkgZm9yIHRoZSBQdWxzZUF1ZGlvIHNvdW5kCisgKiBzZXJ2ZXIuIFRoZSBBUEkgY29tZXMgaW4gdHdvIGZsYXZvdXJzIHRvIGFjY29tb2RhdGUgZGlmZmVyZW50IHN0eWxlcworICogb2YgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgbmVlZHMgaW4gY29tcGxleGl0eToKKyAqCisgKiBcbGkgVGhlIGNvbXBsZXRlIGJ1dCBzb21ld2hhdCBjb21wbGljYXRlZCB0byB1c2UgYXN5bmNocm9ub3VzIEFQSQorICogXGxpIFRoZSBzaW1wbGlmaWVkLCBlYXN5IHRvIHVzZSwgYnV0IGxpbWl0ZWQgc3luY2hyb25vdXMgQVBJCisgKgorICogQWxsIHN0cmluZ3MgaW4gUHVsc2VBdWRpbyBhcmUgaW4gdGhlIFVURi04IGVuY29kaW5nLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQKKyAqIGxvY2FsZS4gU29tZSBmdW5jdGlvbnMgd2lsbCBmaWx0ZXIgaW52YWxpZCBzZXF1ZW5jZXMgZnJvbSB0aGUgc3RyaW5nLCBzb21lCisgKiB3aWxsIHNpbXBseSBmYWlsLiBUbyBlbnN1cmUgcmVsaWFibGUgYmVoYXZpb3VyLCBtYWtlIHN1cmUgZXZlcnl0aGluZyB5b3UKKyAqIHBhc3MgdG8gdGhlIEFQSSBpcyBhbHJlYWR5IGluIFVURi04LgorCisgKiBcc2VjdGlvbiBzaW1wbGVfc2VjIFNpbXBsZSBBUEkKKyAqCisgKiBVc2UgdGhpcyBpZiB5b3UgZGV2ZWxvcCB5b3VyIHByb2dyYW0gaW4gc3luY2hyb25vdXMgc3R5bGUgYW5kIGp1c3QKKyAqIG5lZWQgYSB3YXkgdG8gcGxheSBvciByZWNvcmQgZGF0YSBvbiB0aGUgc291bmQgc2VydmVyLiBTZWUKKyAqIFxzdWJwYWdlIHNpbXBsZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFxzZWN0aW9uIGFzeW5jX3NlYyBBc3luY2hyb25vdXMgQVBJCisgKgorICogVXNlIHRoaXMgaWYgeW91IGRldmVsb3AgeW91ciBwcm9ncmFtcyBpbiBhc3luY2hyb25vdXMsIGV2ZW50IGxvb3AKKyAqIGJhc2VkIHN0eWxlIG9yIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgYWR2YW5jZWQgZmVhdHVyZXMgb2YgdGhlCisgKiBQdWxzZUF1ZGlvIEFQSS4gQSBndWlkZSBjYW4gYmUgZm91bmQgaW4gXHN1YnBhZ2UgYXN5bmMuCisgKgorICogQnkgdXNpbmcgdGhlIGJ1aWx0LWluIHRocmVhZGVkIG1haW4gbG9vcCwgaXQgaXMgcG9zc2libGUgdG8gYWNoZWl2ZSBhCisgKiBwc2V1ZG8tc3luY2hyb25vdXMgQVBJLCB3aGljaCBjYW4gYmUgdXNlZnVsIGluIHN5bmNocm9ub3VzIGFwcGxpY2F0aW9ucworICogd2hlcmUgdGhlIHNpbXBsZSBBUEkgaXMgaW5zdWZmaWNpZW50LiBTZWUgdGhlIFxyZWYgYXN5bmMgcGFnZSBmb3IKKyAqIGRldGFpbHMuCisgKgorICogXHNlY3Rpb24gdGhyZWFkX3NlYyBUaHJlYWRzCisgKgorICogVGhlIFB1bHNlQXVkaW8gY2xpZW50IGxpYnJhcmllcyBhcmUgbm90IGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gYQorICogaGVhdmlseSB0aHJlYWRlZCBlbnZpcm9ubWVudC4gVGhleSBhcmUgaG93ZXZlciBkZXNpZ25lZCB0byBiZSByZWVudHJhbnQKKyAqIHNhZmUuCisgKgorICogVG8gdXNlIGEgdGhlIGxpYnJhcmllcyBpbiBhIHRocmVhZGVkIGVudmlyb25tZW50LCB5b3UgbXVzdCBhc3N1cmUgdGhhdAorICogYWxsIG9iamVjdHMgYXJlIG9ubHkgdXNlZCBpbiBvbmUgdGhyZWFkIGF0IGEgdGltZS4gTm9ybWFsbHksIHRoaXMgbWVhbnMKKyAqIHRoYXQgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIGEgc2luZ2xlIGNvbnRleHQgbXVzdCBiZSBhY2Nlc3NlZCBmcm9tIHRoZQorICogc2FtZSB0aHJlYWQuCisgKgorICogVGhlIGluY2x1ZGVkIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIG5vdCB0aHJlYWQgc2FmZS4gVGFrZSBjYXJlCisgKiB0byBtYWtlIHN1cmUgZXZlbnQgbGlzdHMgYXJlIG5vdCBtYW5pcHVsYXRlZCB3aGVuIGFueSBvdGhlciBjb2RlIGlzCisgKiB1c2luZyB0aGUgbWFpbiBsb29wLgorICoKKyAqIFxzZWN0aW9uIHBrZ2NvbmZpZyBwa2ctY29uZmlnCisgKgorICogVGhlIFB1bHNlQXVkaW8gbGlicmFyaWVzIHByb3ZpZGUgcGtnLWNvbmZpZyBzbmlwcGV0cyBmb3IgdGhlIGRpZmZlcmVudAorICogbW9kdWxlczoKKyAqCisgKiBcbGkgbGlicHVsc2UgLSBUaGUgYXN5bmNocm9ub3VzIEFQSSBhbmQgdGhlIGludGVybmFsIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbi4KKyAqIFxsaSBsaWJwdWxzZS1tYWlubG9vcC1nbGliMTIgLSBHTElCIDEuMiBtYWluIGxvb3AgYmluZGluZ3MuCisgKiBcbGkgbGlicHVsc2UtbWFpbmxvb3AtZ2xpYiAtIEdMSUIgMi54IG1haW4gbG9vcCBiaW5kaW5ncy4KKyAqIFxsaSBsaWJwdWxzZS1zaW1wbGUgLSBUaGUgc2ltcGxlIFB1bHNlQXVkaW8gQVBJLgorICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zYW1wbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2FtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmN2UyYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2FtcGxlLmgKQEAgLTAsMCArMSwyMTYgQEAKKyNpZm5kZWYgZm9vc2FtcGxlaGZvbworI2RlZmluZSBmb29zYW1wbGVoZm9vCisKKy8qICRJZDogc2FtcGxlLmggMjE1NyAyMDA4LTAzLTI3IDIzOjI1OjA4WiBsZW5uYXJ0ICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorCisvKiogXHBhZ2Ugc2FtcGxlIFNhbXBsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbnMKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBQdWxzZUF1ZGlvIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgYSBtdWx0aXR1ZGUgb2Ygc2FtcGxlIGZvcm1hdHMsIHJhdGVzCisgKiBhbmQgY2hhbm5lbHMsIHRyYW5zcGFyZW50bHkgY29udmVydGluZyBhbmQgbWl4aW5nIHRoZW0gYXMgbmVlZGVkLgorICoKKyAqIFxzZWN0aW9uIGZvcm1hdF9zZWMgU2FtcGxlIEZvcm1hdAorICoKKyAqIFB1bHNlQXVkaW8gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzYW1wbGUgZm9ybWF0czoKKyAqCisgKiBcbGkgUEFfU0FNUExFX1U4IC0gVW5zaWduZWQgOCBiaXQgaW50ZWdlciBQQ00uCisgKiBcbGkgUEFfU0FNUExFX1MxNkxFIC0gU2lnbmVkIDE2IGludGVnZXIgYml0IFBDTSwgbGl0dGxlIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfUzE2QkUgLSBTaWduZWQgMTYgaW50ZWdlciBiaXQgUENNLCBiaWcgZW5kaWFuLgorICogXGxpIFBBX1NBTVBMRV9GTE9BVDMyTEUgLSAzMiBiaXQgSUVFRSBmbG9hdGluZyBwb2ludCBQQ00sIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX0ZMT0FUMzJCRSAtIDMyIGJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IFBDTSwgYmlnIGVuZGlhbi4KKyAqIFxsaSBQQV9TQU1QTEVfQUxBVyAtIDggYml0IGEtTGF3LgorICogXGxpIFBBX1NBTVBMRV9VTEFXIC0gOCBiaXQgbXUtTGF3LgorICogXGxpIFBBX1NBTVBMRV9TMzJMRSAtIFNpZ25lZCAzMiBiaXQgaW50ZWdlciBQQ00sIGxpdHRsZSBlbmRpYW4uCisgKiBcbGkgUEFfU0FNUExFX1MzMkJFIC0gU2lnbmVkIDMyIGJpdCBpbnRlZ2VyIFBDTSwgYmlnIGVuZGlhbi4KKyAqCisgKiBUaGUgZmxvYXRpbmcgcG9pbnQgc2FtcGxlIGZvcm1hdHMgaGF2ZSB0aGUgcmFuZ2UgZnJvbSAtMSB0byAxLgorICoKKyAqIFRoZSBzYW1wbGUgZm9ybWF0cyB0aGF0IGFyZSBzZW5zaXRpdmUgdG8gZW5kaWFubmVzcyBoYXZlIGNvbnZlbmllbmNlCisgKiBtYWNyb3MgZm9yIG5hdGl2ZSBlbmRpYW4gKE5FKSwgYW5kIHJldmVyc2UgZW5kaWFuIChSRSkuCisgKgorICogXHNlY3Rpb24gcmF0ZV9zZWMgU2FtcGxlIFJhdGVzCisgKgorICogUHVsc2VBdWRpbyBzdXBwb3J0cyBhbnkgc2FtcGxlIHJhdGUgYmV0d2VlbiAxIEh6IGFuZCA0IEdIei4gVGhlcmUgaXMgbm8KKyAqIHBvaW50IHRyeWluZyB0byBleGNlZWQgdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBvdXRwdXQgZGV2aWNlIHRob3VnaCBhcyB0aGUKKyAqIHNpZ25hbCB3aWxsIG9ubHkgZ2V0IGRvd25zYW1wbGVkLCBjb25zdW1pbmcgQ1BVIG9uIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlCisgKiBzZXJ2ZXIuCisgKgorICogXHNlY3Rpb24gY2hhbl9zZWMgQ2hhbm5lbHMKKyAqCisgKiBQdWxzZUF1ZGlvIHN1cHBvcnRzIHVwIHRvIDE2IGluZGl2aWRpdWFsIGNoYW5uZWxzLiBUaGUgb3JkZXIgb2YgdGhlCisgKiBjaGFubmVscyBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24sIGJ1dCB0aGV5IG11c3QgYmUgY29udGlub3VzLiBUbyBtYXAKKyAqIGNoYW5uZWxzIHRvIHNwZWFrZXJzLCBzZWUgXHJlZiBjaGFubmVsbWFwLgorICoKKyAqIFxzZWN0aW9uIGNhbGNfc2VjIENhbGN1bGF0aW9ucworICoKKyAqIFRoZSBQdWxzZUF1ZGlvIGxpYnJhcnkgY29udGFpbnMgYSBudW1iZXIgb2YgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGRvCisgKiBjYWxjdWxhdGlvbnMgb24gc2FtcGxlIGZvcm1hdHM6CisgKgorICogXGxpIHBhX2J5dGVzX3Blcl9zZWNvbmQoKSAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgb25lIHNlY29uZCBvZiBhdWRpbyB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSBnaXZlbiBhIHNhbXBsZSBmb3JtYXQuCisgKiBcbGkgcGFfZnJhbWVfc2l6ZSgpIC0gVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBvbmUgZnJhbWUgKGkuZS4gb25lIHNldCBvZgorICogICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIG9uZSBmb3IgZWFjaCBjaGFubmVsKS4KKyAqIFxsaSBwYV9zYW1wbGVfc2l6ZSgpIC0gVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBvbmUgc2FtcGxlLgorICogXGxpIHBhX2J5dGVzX3RvX3VzZWMoKSAtIENhbGN1bGF0ZSB0aGUgdGltZSBpdCB3b3VsZCB0YWtlIHRvIHBsYXkgYSBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhIGNlcnRhaW4gc2l6ZS4KKyAqCisgKiBcc2VjdGlvbiB1dGlsX3NlYyBDb252ZW5pZW5jZSBGdW5jdGlvbnMKKyAqCisgKiBUaGUgbGlicmFyeSBhbHNvIGNvbnRhaW5zIGEgY291cGxlIG9mIG90aGVyIGNvbnZlbmllbmNlIGZ1bmN0aW9uczoKKyAqCisgKiBcbGkgcGFfc2FtcGxlX3NwZWNfdmFsaWQoKSAtIFRlc3RzIGlmIGEgc2FtcGxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkLgorICogXGxpIHBhX3NhbXBsZV9zcGVjX2VxdWFsKCkgLSBUZXN0cyBpZiB0aGUgc2FtcGxlIGZvcm1hdCBzcGVjaWZpY2F0aW9ucyBhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsLgorICogXGxpIHBhX3NhbXBsZV9mb3JtYXRfdG9fc3RyaW5nKCkgLSBSZXR1cm4gYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlIGZvcm1hdC4KKyAqIFxsaSBwYV9wYXJzZV9zYW1wbGVfZm9ybWF0KCkgLSBQYXJzZSBhIHRleHQgc3RyaW5nIGludG8gYSBzYW1wbGUgZm9ybWF0LgorICogXGxpIHBhX3NhbXBsZV9zcGVjX3NucHJpbnQoKSAtIENyZWF0ZSBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBjb21wbGV0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgZm9ybWF0IHNwZWNpZmljYXRpb24uCisgKiBcbGkgcGFfYnl0ZXNfc25wcmludCgpIC0gUHJldHR5IHByaW50IGEgYnl0ZSB2YWx1ZSAoZS5nLiAyLjUgTWlCKS4KKyAqLworCisvKiogXGZpbGUKKyAqIENvbnN0YW50cyBhbmQgcm91dGluZXMgZm9yIHNhbXBsZSB0eXBlIGhhbmRsaW5nICovCisKK1BBX0NfREVDTF9CRUdJTgorCisjaWYgIWRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorI2lmIGRlZmluZWQoX19CWVRFX09SREVSKQorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisjZGVmaW5lIFBBX0NIQU5ORUxTX01BWCAzMgorCisvKiogTWF4aW11bSBhbGxvd2VkIHNhbXBsZSByYXRlICovCisjZGVmaW5lIFBBX1JBVEVfTUFYICg0ODAwMCo0KQorCisvKiogU2FtcGxlIGZvcm1hdCAqLwordHlwZWRlZiBlbnVtIHBhX3NhbXBsZV9mb3JtYXQgeworICAgIFBBX1NBTVBMRV9VOCwgICAgICAgICAgICAgIC8qKjwgVW5zaWduZWQgOCBCaXQgUENNICovCisgICAgUEFfU0FNUExFX0FMQVcsICAgICAgICAgICAgLyoqPCA4IEJpdCBhLUxhdyAqLworICAgIFBBX1NBTVBMRV9VTEFXLCAgICAgICAgICAgIC8qKjwgOCBCaXQgbXUtTGF3ICovCisgICAgUEFfU0FNUExFX1MxNkxFLCAgICAgICAgICAgLyoqPCBTaWduZWQgMTYgQml0IFBDTSwgbGl0dGxlIGVuZGlhbiAoUEMpICovCisgICAgUEFfU0FNUExFX1MxNkJFLCAgICAgICAgICAgLyoqPCBTaWduZWQgMTYgQml0IFBDTSwgYmlnIGVuZGlhbiAqLworICAgIFBBX1NBTVBMRV9GTE9BVDMyTEUsICAgICAgIC8qKjwgMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIGxpdHRsZSBlbmRpYW4sIHJhbmdlIC0xIHRvIDEgKi8KKyAgICBQQV9TQU1QTEVfRkxPQVQzMkJFLCAgICAgICAvKio8IDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCBiaWcgZW5kaWFuLCByYW5nZSAtMSB0byAxICovCisgICAgUEFfU0FNUExFX1MzMkxFLCAgICAgICAgICAgLyoqPCBTaWduZWQgMzIgQml0IFBDTSwgbGl0dGxlIGVuZGlhbiAoUEMpICovCisgICAgUEFfU0FNUExFX1MzMkJFLCAgICAgICAgICAgLyoqPCBTaWduZWQgMzIgQml0IFBDTSwgYmlnIGVuZGlhbiAoUEMpICovCisgICAgUEFfU0FNUExFX01BWCwgICAgICAgICAgICAgLyoqPCBVcHBlciBsaW1pdCBvZiB2YWxpZCBzYW1wbGUgdHlwZXMgKi8KKyAgICBQQV9TQU1QTEVfSU5WQUxJRCA9IC0xICAgICAvKio8IEFuIGludmFsaWQgdmFsdWUgKi8KK30gcGFfc2FtcGxlX2Zvcm1hdF90OworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisvKiogU2lnbmVkIDE2IEJpdCBQQ00sIG5hdGl2ZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MxNk5FIFBBX1NBTVBMRV9TMTZCRQorLyoqIDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyTkUgUEFfU0FNUExFX0ZMT0FUMzJCRQorLyoqIFNpZ25lZCAzMiBCaXQgUENNLCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJORSBQQV9TQU1QTEVfUzMyQkUKKy8qKiBTaWduZWQgMTYgQml0IFBDTSByZXZlcnNlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzE2UkUgUEFfU0FNUExFX1MxNkxFCisvKiogMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyUkUgUEFfU0FNUExFX0ZMT0FUMzJMRQorLyoqIFNpZ25lZCAzMiBCaXQgUENNIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJSRSBQQV9TQU1QTEVfUzMyTEUKKyNlbHNlCisvKiogU2lnbmVkIDE2IEJpdCBQQ00sIG5hdGl2ZSBlbmRpYW4gKi8KKyNkZWZpbmUgUEFfU0FNUExFX1MxNk5FIFBBX1NBTVBMRV9TMTZMRQorLyoqIDMyIEJpdCBJRUVFIGZsb2F0aW5nIHBvaW50LCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyTkUgUEFfU0FNUExFX0ZMT0FUMzJMRQorLyoqIFNpZ25lZCAzMiBCaXQgUENNLCBuYXRpdmUgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJORSBQQV9TQU1QTEVfUzMyTEUKKy8qKiBTaWduZWQgMTYgQml0IFBDTSByZXZlcnNlIGVuZGlhbiAqLworI2RlZmluZSBQQV9TQU1QTEVfUzE2UkUgUEFfU0FNUExFX1MxNkJFCisvKiogMzIgQml0IElFRUUgZmxvYXRpbmcgcG9pbnQsIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9GTE9BVDMyUkUgUEFfU0FNUExFX0ZMT0FUMzJCRQorLyoqIFNpZ25lZCAzMiBCaXQgUENNIHJldmVyc2UgZW5kaWFuICovCisjZGVmaW5lIFBBX1NBTVBMRV9TMzJSRSBQQV9TQU1QTEVfUzMyQkUKKyNlbmRpZgorCisvKiogQSBTaG9ydGN1dCBmb3IgUEFfU0FNUExFX0ZMT0FUMzJORSAqLworI2RlZmluZSBQQV9TQU1QTEVfRkxPQVQzMiBQQV9TQU1QTEVfRkxPQVQzMk5FCisKKy8qKiBBIHNhbXBsZSBmb3JtYXQgYW5kIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdCBwYV9zYW1wbGVfc3BlYyB7CisgICAgcGFfc2FtcGxlX2Zvcm1hdF90IGZvcm1hdDsgICAgIC8qKjwgVGhlIHNhbXBsZSBmb3JtYXQgKi8KKyAgICB1aW50MzJfdCByYXRlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgc2FtcGxlIHJhdGUuIChlLmcuIDQ0MTAwKSAqLworICAgIHVpbnQ4X3QgY2hhbm5lbHM7ICAgICAgICAgICAgICAvKio8IEF1ZGlvIGNoYW5uZWxzLiAoMSBmb3IgbW9ubywgMiBmb3Igc3RlcmVvLCAuLi4pICovCit9IHBhX3NhbXBsZV9zcGVjOworCisvKiogVHlwZSBmb3IgdXNlYyBzcGVjaWZpY2F0aW9ucyAodW5zaWduZWQpLiBNYXkgYmUgZWl0aGVyIDMyIG9yIDY0IGJpdCwgZGVwZW5kaW5nIG9uIHRoZSBhcmNoaXRlY3R1cmUgKi8KK3R5cGVkZWYgdWludDY0X3QgcGFfdXNlY190OworCisvKiogUmV0dXJuIHRoZSBhbW91bnQgb2YgYnl0ZXMgcGxheWJhY2sgb2YgYSBzZWNvbmQgb2YgYXVkaW8gd2l0aCB0aGUgc3BlY2lmaWVkIHNhbXBsZSB0eXBlIHRha2VzICovCitzaXplX3QgcGFfYnl0ZXNfcGVyX3NlY29uZChjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYykgUEFfR0NDX1BVUkU7CisKKy8qKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBmcmFtZSB3aXRoIHRoZSBzcGVjaWZpYyBzYW1wbGUgdHlwZSAqLworc2l6ZV90IHBhX2ZyYW1lX3NpemUoY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSBzaXplIG9mIGEgc2FtcGxlIHdpdGggdGhlIHNwZWNpZmljIHNhbXBsZSB0eXBlICovCitzaXplX3QgcGFfc2FtcGxlX3NpemUoY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpIFBBX0dDQ19QVVJFOworCisvKiogQ2FsY3VsYXRlIHRoZSB0aW1lIHRoZSBzcGVjaWZpZWQgYnl0ZXMgdGFrZSB0byBwbGF5IHdpdGggdGhlIHNwZWNpZmllZCBzYW1wbGUgdHlwZSAqLworcGFfdXNlY190IHBhX2J5dGVzX3RvX3VzZWModWludDY0X3QgbGVuZ3RoLCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYykgUEFfR0NDX1BVUkU7CisKKy8qKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQgdGltZS4gXHNpbmNlIDAuOSAqLworc2l6ZV90IHBhX3VzZWNfdG9fYnl0ZXMocGFfdXNlY190IHQsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcGVjKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBub24temVybyB3aGVuIHRoZSBzYW1wbGUgdHlwZSBzcGVjaWZpY2F0aW9uIGlzIHZhbGlkICovCitpbnQgcGFfc2FtcGxlX3NwZWNfdmFsaWQoY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIG5vbi16ZXJvIHdoZW4gdGhlIHR3byBzYW1wbGUgdHlwZSBzcGVjaWZpY2F0aW9ucyBtYXRjaCAqLworaW50IHBhX3NhbXBsZV9zcGVjX2VxdWFsKGNvbnN0IHBhX3NhbXBsZV9zcGVjKmEsIGNvbnN0IHBhX3NhbXBsZV9zcGVjKmIpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIGEgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIHNhbXBsZSBmb3JtYXQuIFxzaW5jZSAwLjggKi8KK2NvbnN0IGNoYXIgKnBhX3NhbXBsZV9mb3JtYXRfdG9fc3RyaW5nKHBhX3NhbXBsZV9mb3JtYXRfdCBmKSBQQV9HQ0NfUFVSRTsKKworLyoqIFBhcnNlIGEgc2FtcGxlIGZvcm1hdCB0ZXh0LiBJbnZlcnNlIG9mIHBhX3NhbXBsZV9mb3JtYXRfdG9fc3RyaW5nKCkgKi8KK3BhX3NhbXBsZV9mb3JtYXRfdCBwYV9wYXJzZV9zYW1wbGVfZm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCkgUEFfR0NDX1BVUkU7CisKKy8qKiBNYXhpbXVtIHJlcXVpcmVkIHN0cmluZyBsZW5ndGggZm9yIHBhX3NhbXBsZV9zcGVjX3NucHJpbnQoKSAqLworI2RlZmluZSBQQV9TQU1QTEVfU1BFQ19TTlBSSU5UX01BWCAzMgorCisvKiogUHJldHR5IHByaW50IGEgc2FtcGxlIHR5cGUgc3BlY2lmaWNhdGlvbiB0byBhIHN0cmluZyAqLworY2hhciogcGFfc2FtcGxlX3NwZWNfc25wcmludChjaGFyICpzLCBzaXplX3QgbCwgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNwZWMpOworCisvKiogUHJldHR5IHByaW50IGEgYnl0ZSBzaXplIHZhbHVlLiAoaS5lLiAiMi41IE1pQiIpICovCitjaGFyKiBwYV9ieXRlc19zbnByaW50KGNoYXIgKnMsIHNpemVfdCBsLCB1bnNpZ25lZCB2KTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2NhY2hlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjJjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NjYWNoZS5oCkBAIC0wLDAgKzEsMTAzIEBACisjaWZuZGVmIGZvb3NjYWNoZWhmb28KKyNkZWZpbmUgZm9vc2NhY2hlaGZvbworCisvKiAkSWQ6IHNjYWNoZS5oIDE0MjYgMjAwNy0wMi0xMyAxNTozNToxOVogb3NzbWFuICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2Uvc3RyZWFtLmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxwYWdlIHNjYWNoZSBTYW1wbGUgQ2FjaGUKKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgc2FtcGxlIGNhY2hlIHByb3ZpZGVzIGEgc2ltcGxlIHdheSBvZiBvdmVyY29taW5nIGhpZ2ggbmV0d29yayBsYXRlbmNpZXMKKyAqIGFuZCByZWR1Y2luZyBiYW5kd2lkdGguIEluc3RlYWQgb2Ygc3RyZWFtaW5nIGEgc291bmQgcHJlY2lzZWx5IHdoZW4gaXQKKyAqIHNob3VsZCBiZSBwbGF5ZWQsIGl0IGlzIHN0b3JlZCBvbiB0aGUgc2VydmVyIGFuZCBvbmx5IHRoZSBjb21tYW5kIHRvIHN0YXJ0CisgKiBwbGF5aW5nIGl0IG5lZWRzIHRvIGJlIHNlbnQuCisgKgorICogXHNlY3Rpb24gY3JlYXRlX3NlYyBDcmVhdGlvbgorICoKKyAqIFRvIGNyZWF0ZSBhIHNhbXBsZSwgdGhlIG5vcm1hbCBzdHJlYW0gQVBJIGlzIHVzZWQgKHNlZSBccmVmIHN0cmVhbXMpLiBUaGUKKyAqIGZ1bmN0aW9uIHBhX3N0cmVhbV9jb25uZWN0X3VwbG9hZCgpIHdpbGwgbWFrZSBzdXJlIHRoZSBzdHJlYW0gaXMgc3RvcmVkIGFzCisgKiBhIHNhbXBsZSBvbiB0aGUgc2VydmVyLgorICoKKyAqIFRvIGNvbXBsZXRlIHRoZSB1cGxvYWQsIHBhX3N0cmVhbV9maW5pc2hfdXBsb2FkKCkgaXMgY2FsbGVkIGFuZCB0aGUgc2FtcGxlCisgKiB3aWxsIHJlY2VpdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgc3RyZWFtLiBJZiB0aGUgdXBsb2FkIHNob3VsZCBiZSBhYm9ydGVkLAorICogc2ltcGx5IGNhbGwgcGFfc3RyZWFtX2Rpc2Nvbm5lY3QoKS4KKyAqCisgKiBcc2VjdGlvbiBwbGF5X3NlYyBQbGF5aW5nIHNhbXBsZXMKKyAqCisgKiBUbyBwbGF5IGJhY2sgYSBzYW1wbGUsIHNpbXBseSBjYWxsIHBhX2NvbnRleHRfcGxheV9zYW1wbGUoKToKKyAqCisgKiBcY29kZQorICogcGFfb3BlcmF0aW9uICpvOworICoKKyAqIG8gPSBwYV9jb250ZXh0X3BsYXlfc2FtcGxlKG15X2NvbnRleHQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlMiIsICAgICAgIC8vIE5hbWUgb2YgbXkgc2FtcGxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IHNpbmsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBX1ZPTFVNRV9OT1JNLCAgLy8gRnVsbCB2b2x1bWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCBhIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICogaWYgKG8pCisgKiAgICAgcGFfb3BlcmF0aW9uX3VucmVmKG8pOworICogXGVuZGNvZGUKKyAqCisgKiBcc2VjdGlvbiByZW1fc2VjIFJlbW92aW5nIHNhbXBsZXMKKyAqCisgKiBXaGVuIGEgc2FtcGxlIGlzIG5vIGxvbmdlciBuZWVkZWQsIGl0IHNob3VsZCBiZSByZW1vdmVkIG9uIHRoZSBzZXJ2ZXIgdG8KKyAqIHNhdmUgcmVzb3VyY2VzLiBUaGUgc2FtcGxlIGlzIGRlbGV0ZWQgdXNpbmcgcGFfY29udGV4dF9yZW1vdmVfc2FtcGxlKCkuCisgKi8KKworLyoqIFxmaWxlCisgKiBBbGwgc2FtcGxlIGNhY2hlIHJlbGF0ZWQgcm91dGluZXMgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBNYWtlIHRoaXMgc3RyZWFtIGEgc2FtcGxlIHVwbG9hZCBzdHJlYW0gKi8KK2ludCBwYV9zdHJlYW1fY29ubmVjdF91cGxvYWQocGFfc3RyZWFtICpzLCBzaXplX3QgbGVuZ3RoKTsKKworLyoqIEZpbmlzaCB0aGUgc2FtcGxlIHVwbG9hZCwgdGhlIHN0cmVhbSBuYW1lIHdpbGwgYmVjb21lIHRoZSBzYW1wbGUgbmFtZS4gWW91IGNhbmNlbCBhIHNhbXAKKyAqIGxlIHVwbG9hZCBieSBpc3N1aW5nIHBhX3N0cmVhbV9kaXNjb25uZWN0KCkgKi8KK2ludCBwYV9zdHJlYW1fZmluaXNoX3VwbG9hZChwYV9zdHJlYW0gKnMpOworCisvKiogUGxheSBhIHNhbXBsZSBmcm9tIHRoZSBzYW1wbGUgY2FjaGUgdG8gdGhlIHNwZWNpZmllZCBkZXZpY2UuIElmIHRoZSBsYXR0ZXIgaXMgTlVMTCB1c2UgdGhlIGRlZmF1bHQgc2luay4gUmV0dXJucyBhbiBvcGVyYXRpb24gb2JqZWN0ICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfcGxheV9zYW1wbGUoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAvKio8IENvbnRleHQgKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgICAgICAgICAgICAvKio8IE5hbWUgb2YgdGhlIHNhbXBsZSB0byBwbGF5ICovLAorICAgICAgICBjb25zdCBjaGFyICpkZXYgICAgICAgICAgICAgLyoqPCBTaW5rIHRvIHBsYXkgdGhpcyBzYW1wbGUgb24gKi8sCisgICAgICAgIHBhX3ZvbHVtZV90IHZvbHVtZSAgICAgICAgICAvKio8IFZvbHVtZSB0byBwbGF5IHRoaXMgc2FtcGxlIHdpdGggKi8gLAorICAgICAgICBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiAgLyoqPCBDYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHN0YXJ0aW5nIHBsYXliYWNrLCBvciBOVUxMICovLAorICAgICAgICB2b2lkICp1c2VyZGF0YSAgICAgICAgICAgICAgLyoqPCBVc2VyZGF0YSB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayAqLyk7CisKKy8qKiBSZW1vdmUgYSBzYW1wbGUgZnJvbSB0aGUgc2FtcGxlIGNhY2hlLiBSZXR1cm5zIGFuIG9wZXJhdGlvbiBvYmplY3Qgd2hpY2ggbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBvcGVyYXRpb24gd2hpbGUgaXQgaXMgcnVubmluZyAqLworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3JlbW92ZV9zYW1wbGUocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqbmFtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QsIHZvaWQgKnVzZXJkYXRhKTsKKworUEFfQ19ERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc2ltcGxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NpbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTliMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3NpbXBsZS5oCkBAIC0wLDAgKzEsMTQ5IEBACisjaWZuZGVmIGZvb3NpbXBsZWhmb28KKyNkZWZpbmUgZm9vc2ltcGxlaGZvbworCisvKiAkSWQ6IHNpbXBsZS5oIDE5OTkgMjAwNy0xMC0zMCAxNDoxNzo0MVogbGVubmFydCAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisjaW5jbHVkZSA8cHVsc2UvY2hhbm5lbG1hcC5oPgorI2luY2x1ZGUgPHB1bHNlL2RlZi5oPgorI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisKKy8qKiBccGFnZSBzaW1wbGUgU2ltcGxlIEFQSQorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSBzaW1wbGUgQVBJIGlzIGRlc2lnbmVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCB2ZXJ5IGJhc2ljIHNvdW5kCisgKiBwbGF5YmFjayBvciBjYXB0dXJlIG5lZWRzLiBJdCBjYW4gb25seSBzdXBwb3J0IGEgc2luZ2xlIHN0cmVhbSBwZXIKKyAqIGNvbm5lY3Rpb24gYW5kIGhhcyBubyBoYW5kbGluZyBvZiBjb21wbGV4IGZlYXR1cmVzIGxpa2UgZXZlbnRzLCBjaGFubmVsCisgKiBtYXBwaW5ncyBhbmQgdm9sdW1lIGNvbnRyb2wuIEl0IGlzLCBob3dldmVyLCB2ZXJ5IHNpbXBsZSB0byB1c2UgYW5kCisgKiBxdWl0ZSBzdWZmaWNlbnQgZm9yIG1hbnkgcHJvZ3JhbXMuCisgKgorICogXHNlY3Rpb24gY29ubl9zZWMgQ29ubmVjdGluZworICoKKyAqIFRoZSBmaXJzdCBzdGVwIGJlZm9yZSB1c2luZyB0aGUgc291bmQgc3lzdGVtIGlzIHRvIGNvbm5lY3QgdG8gdGhlCisgKiBzZXJ2ZXIuIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSB0aGlzIHdheToKKyAqCisgKiBcY29kZQorICogcGFfc2ltcGxlICpzOworICogcGFfc2FtcGxlX3NwZWMgc3M7CisgKgorICogc3MuZm9ybWF0ID0gUEFfU0FNUExFX1MxNk5FOworICogc3MuY2hhbm5lbHMgPSAyOworICogc3MucmF0ZSA9IDQ0MTAwOworICoKKyAqIHMgPSBwYV9zaW1wbGVfbmV3KE5VTEwsICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNlcnZlci4KKyAqICAgICAgICAgICAgICAgICAgICJGb29hcHAiLCAgICAgICAgICAgLy8gT3VyIGFwcGxpY2F0aW9uJ3MgbmFtZS4KKyAqICAgICAgICAgICAgICAgICAgIFBBX1NUUkVBTV9QTEFZQkFDSywKKyAqICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGRldmljZS4KKyAqICAgICAgICAgICAgICAgICAgICJNdXNpYyIsICAgICAgICAgICAgLy8gRGVzY3JpcHRpb24gb2Ygb3VyIHN0cmVhbS4KKyAqICAgICAgICAgICAgICAgICAgICZzcywgICAgICAgICAgICAgICAgLy8gT3VyIHNhbXBsZSBmb3JtYXQuCisgKiAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IGNoYW5uZWwgbWFwCisgKiAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IGJ1ZmZlcmluZyBhdHRyaWJ1dGVzLgorICogICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3IgY29kZS4KKyAqICAgICAgICAgICAgICAgICAgICk7CisgKiBcZW5kY29kZQorICoKKyAqIEF0IHRoaXMgcG9pbnQgYSBjb25uZWN0ZWQgb2JqZWN0IGlzIHJldHVybmVkLCBvciBOVUxMIGlmIHRoZXJlIHdhcyBhCisgKiBwcm9ibGVtIGNvbm5lY3RpbmcuCisgKgorICogXHNlY3Rpb24gdHJhbnNmZXJfc2VjIFRyYW5zZmVycmluZyBkYXRhCisgKgorICogT25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB0byB0aGUgc2VydmVyLCBkYXRhIGNhbiBzdGFydCBmbG93aW5nLgorICogVXNpbmcgdGhlIGNvbm5lY3Rpb24gaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBub3JtYWwgcmVhZCgpIGFuZCB3cml0ZSgpCisgKiBzeXN0ZW0gY2FsbHMuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGV5J3JlIGNhbGwgcGFfc2ltcGxlX3JlYWQoKQorICogYW5kIHBhX3NpbXBsZV93cml0ZSgpLiBOb3RlIHRoYXQgdGhlc2Ugb3BlcmF0aW9ucyBhbHdheXMgYmxvY2suCisgKgorICogXHNlY3Rpb24gY3RybF9zZWMgQnVmZmVyIGNvbnRyb2wKKyAqCisgKiBJZiBhIHBsYXliYWNrIHN0cmVhbSBpcyB1c2VkIHRoZW4gYSBmZXcgb3RoZXIgb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlOgorICoKKyAqIFxsaSBwYV9zaW1wbGVfZHJhaW4oKSAtIFdpbGwgd2FpdCBmb3IgYWxsIHNlbnQgZGF0YSB0byBmaW5pc2ggcGxheWluZy4KKyAqIFxsaSBwYV9zaW1wbGVfZmx1c2goKSAtIFdpbGwgdGhyb3cgYXdheSBhbGwgZGF0YSBjdXJyZW50bHkgaW4gYnVmZmVycy4KKyAqIFxsaSBwYV9zaW1wbGVfZ2V0X3BsYXliYWNrX2xhdGVuY3koKSAtIFdpbGwgcmV0dXJuIHRoZSB0b3RhbCBsYXRlbmN5IG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGxheWJhY2sgcGlwZWxpbmUuCisgKgorICogXHNlY3Rpb24gY2xlYW51cF9zZWMgQ2xlYW51cAorICoKKyAqIE9uY2UgcGxheWJhY2sgb3IgY2FwdHVyZSBpcyBjb21wbGV0ZSwgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGNsb3NlZAorICogYW5kIHJlc291cmNlcyBmcmVlZC4gVGhpcyBpcyBkb25lIHRocm91Z2g6CisgKgorICogXGNvZGUKKyAqIHBhX3NpbXBsZV9mcmVlKHMpOworICogXGVuZGNvZGUKKyAqLworCisvKiogXGZpbGUKKyAqIEEgc2ltcGxlIGJ1dCBsaW1pdGVkIHN5bmNocm9ub3VzIHBsYXliYWNrIGFuZCByZWNvcmRpbmcKKyAqIEFQSS4gVGhpcyBpcyBhIHN5bmNocm9ub3VzLCBzaW1wbGlmaWVkIHdyYXBwZXIgYXJvdW5kIHRoZSBzdGFuZGFyZAorICogYXN5bmNocm9ub3VzIEFQSS4gKi8KKworLyoqIFxleGFtcGxlIHBhY2F0LXNpbXBsZS5jCisgKiBBIHNpbXBsZSBwbGF5YmFjayB0b29sIHVzaW5nIHRoZSBzaW1wbGUgQVBJICovCisKKy8qKiBcZXhhbXBsZSBwYXJlYy1zaW1wbGUuYworICogQSBzaW1wbGUgcmVjb3JkaW5nIHRvb2wgdXNpbmcgdGhlIHNpbXBsZSBBUEkgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBcc3RydWN0IHBhX3NpbXBsZQorICogQW4gb3BhcXVlIHNpbXBsZSBjb25uZWN0aW9uIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfc2ltcGxlIHBhX3NpbXBsZTsKKworLyoqIENyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgKi8KK3BhX3NpbXBsZSogcGFfc2ltcGxlX25ldygKKyAgICBjb25zdCBjaGFyICpzZXJ2ZXIsICAgICAgICAgICAgICAgICAvKio8IFNlcnZlciBuYW1lLCBvciBOVUxMIGZvciBkZWZhdWx0ICovCisgICAgY29uc3QgY2hhciAqbmFtZSwgICAgICAgICAgICAgICAgICAgLyoqPCBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoaXMgY2xpZW50IChhcHBsaWNhdGlvbiBuYW1lLCAuLi4pICovCisgICAgcGFfc3RyZWFtX2RpcmVjdGlvbl90IGRpciwgICAgICAgICAgLyoqPCBPcGVuIHRoaXMgc3RyZWFtIGZvciByZWNvcmRpbmcgb3IgcGxheWJhY2s/ICovCisgICAgY29uc3QgY2hhciAqZGV2LCAgICAgICAgICAgICAgICAgICAgLyoqPCBTaW5rIChyZXNwLiBzb3VyY2UpIG5hbWUsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJlYW1fbmFtZSwgICAgICAgICAgICAvKio8IEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhpcyBjbGllbnQgKGFwcGxpY2F0aW9uIG5hbWUsIHNvbmcgdGl0bGUsIC4uLikgKi8KKyAgICBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3MsICAgICAgICAgICAvKio8IFRoZSBzYW1wbGUgdHlwZSB0byB1c2UgKi8KKyAgICBjb25zdCBwYV9jaGFubmVsX21hcCAqbWFwLCAgICAgICAgICAvKio8IFRoZSBjaGFubmVsIG1hcCB0byB1c2UsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8KKyAgICBjb25zdCBwYV9idWZmZXJfYXR0ciAqYXR0ciwgICAgICAgICAvKio8IEJ1ZmZlcmluZyBhdHRyaWJ1dGVzLCBvciBOVUxMIGZvciBkZWZhdWx0ICovCisgICAgaW50ICplcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBIHBvaW50ZXIgd2hlcmUgdGhlIGVycm9yIGNvZGUgaXMgc3RvcmVkIHdoZW4gdGhlIHJvdXRpbmUgcmV0dXJucyBOVUxMLiBJdCBpcyBPSyB0byBwYXNzIE5VTEwgaGVyZS4gKi8KKyAgICApOworCisvKiogQ2xvc2UgYW5kIGZyZWUgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4gVGhlIGNvbm5lY3Rpb24gb2JqZWN0cyBiZWNvbWVzIGludmFsaWQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gKi8KK3ZvaWQgcGFfc2ltcGxlX2ZyZWUocGFfc2ltcGxlICpzKTsKKworLyoqIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc2VydmVyICovCitpbnQgcGFfc2ltcGxlX3dyaXRlKHBhX3NpbXBsZSAqcywgY29uc3Qgdm9pZCpkYXRhLCBzaXplX3QgYnl0ZXMsIGludCAqZXJyb3IpOworCisvKiogV2FpdCB1bnRpbCBhbGwgZGF0YSBhbHJlYWR5IHdyaXR0ZW4gaXMgcGxheWVkIGJ5IHRoZSBkYWVtb24gKi8KK2ludCBwYV9zaW1wbGVfZHJhaW4ocGFfc2ltcGxlICpzLCBpbnQgKmVycm9yKTsKKworLyoqIFJlYWQgc29tZSBkYXRhIGZyb20gdGhlIHNlcnZlciAqLworaW50IHBhX3NpbXBsZV9yZWFkKHBhX3NpbXBsZSAqcywgdm9pZCpkYXRhLCBzaXplX3QgYnl0ZXMsIGludCAqZXJyb3IpOworCisvKiogUmV0dXJuIHRoZSBwbGF5YmFjayBsYXRlbmN5LiBcc2luY2UgMC41ICovCitwYV91c2VjX3QgcGFfc2ltcGxlX2dldF9sYXRlbmN5KHBhX3NpbXBsZSAqcywgaW50ICplcnJvcik7CisKKy8qKiBGbHVzaCB0aGUgcGxheWJhY2sgYnVmZmVyLiBcc2luY2UgMC41ICovCitpbnQgcGFfc2ltcGxlX2ZsdXNoKHBhX3NpbXBsZSAqcywgaW50ICplcnJvcik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3N0cmVhbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI0MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdHJlYW0uaApAQCAtMCwwICsxLDUxNSBAQAorI2lmbmRlZiBmb29zdHJlYW1oZm9vCisjZGVmaW5lIGZvb3N0cmVhbWhmb28KKworLyogJElkOiBzdHJlYW0uaCAyMDY3IDIwMDctMTEtMjEgMDE6MzA6NDBaIGxlbm5hcnQgJCAqLworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHB1bHNlL3NhbXBsZS5oPgorI2luY2x1ZGUgPHB1bHNlL2NoYW5uZWxtYXAuaD4KKyNpbmNsdWRlIDxwdWxzZS92b2x1bWUuaD4KKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL29wZXJhdGlvbi5oPgorCisvKiogXHBhZ2Ugc3RyZWFtcyBBdWRpbyBTdHJlYW1zCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogQXVkaW8gc3RyZWFtcyBmb3JtIHRoZSBjZW50cmFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHNvdW5kIHNlcnZlci4gRGF0YSBpcworICogcm91dGVkLCBjb252ZXJ0ZWQgYW5kIG1peGVkIGZyb20gc2V2ZXJhbCBzb3VyY2VzIGJlZm9yZSBpdCBpcyBwYXNzZWQgYWxvbmcKKyAqIHRvIGEgZmluYWwgb3V0cHV0LiBDdXJyZW50bHksIHRoZXJlIGFyZSB0aHJlZSBmb3JtcyBvZiBhdWRpbyBzdHJlYW1zOgorICoKKyAqIFxsaSBQbGF5YmFjayBzdHJlYW1zIC0gRGF0YSBmbG93cyBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4KKyAqIFxsaSBSZWNvcmQgc3RyZWFtcyAtIERhdGEgZmxvd3MgZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuCisgKiBcbGkgVXBsb2FkIHN0cmVhbXMgLSBTaW1pbGFyIHRvIHBsYXliYWNrIHN0cmVhbXMsIGJ1dCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1wbGUgY2FjaGUuIFNlZSBccmVmIHNjYWNoZSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgYWJvdXQgY29udHJvbGxpbmcgdGhlIHNhbXBsZSBjYWNoZS4KKyAqCisgKiBcc2VjdGlvbiBjcmVhdGVfc2VjIENyZWF0aW5nCisgKgorICogVG8gYWNjZXNzIGEgc3RyZWFtLCBhIHBhX3N0cmVhbSBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisgKiBwYV9zdHJlYW1fbmV3KCkuIEF0IHRoaXMgcG9pbnQgdGhlIGF1ZGlvIHNhbXBsZSBmb3JtYXQgYW5kIG1hcHBpbmcgb2YKKyAqIGNoYW5uZWxzIG11c3QgYmUgc3BlY2lmaWVkLiBTZWUgXHJlZiBzYW1wbGUgYW5kIFxyZWYgY2hhbm5lbG1hcCBmb3IgbW9yZQorICogaW5mb3JtYXRpb24gYWJvdXQgdGhvc2Ugc3RydWN0dXJlcy4KKyAqCisgKiBUaGlzIGZpcnN0IHN0ZXAgd2lsbCBvbmx5IGNyZWF0ZSBhIGNsaWVudC1zaWRlIG9iamVjdCwgcmVwcmVzZW50aW5nIHRoZQorICogc3RyZWFtLiBUbyB1c2UgdGhlIHN0cmVhbSwgYSBzZXJ2ZXItc2lkZSBvYmplY3QgbXVzdCBiZSBjcmVhdGVkIGFuZAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NhbCBvYmplY3QuIERlcGVuZGluZyBvbiB3aGljaCB0eXBlIG9mIHN0cmVhbSBpcworICogZGVzaXJlZCwgYSBkaWZmZXJlbnQgZnVuY3Rpb24gaXMgbmVlZGVkOgorICoKKyAqIFxsaSBQbGF5YmFjayBzdHJlYW0gLSBwYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaygpCisgKiBcbGkgUmVjb3JkIHN0cmVhbSAtIHBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCgpCisgKiBcbGkgVXBsb2FkIHN0cmVhbSAtIHBhX3N0cmVhbV9jb25uZWN0X3VwbG9hZCgpIChzZWUgXHJlZiBzY2FjaGUpCisgKgorICogU2ltaWxhciB0byBob3cgY29ubmVjdGlvbnMgYXJlIGRvbmUgaW4gY29udGV4dHMsIGNvbm5lY3RpbmcgYSBzdHJlYW0gd2lsbAorICogbm90IGdlbmVyYXRlIGEgcGFfb3BlcmF0aW9uIG9iamVjdC4gQWxzbyBsaWtlIGNvbnRleHRzLCB0aGUgYXBwbGljYXRpb24KKyAqIHNob3VsZCByZWdpc3RlciBhIHN0YXRlIGNoYW5nZSBjYWxsYmFjaywgdXNpbmcKKyAqIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2soKSwgYW5kIHdhaXQgZm9yIHRoZSBzdHJlYW0gdG8gZW50ZXIgYW4gYWN0aXZlCisgKiBzdGF0ZS4KKyAqCisgKiBcc3Vic2VjdGlvbiBidWZhdHRyX3N1YnNlYyBCdWZmZXIgQXR0cmlidXRlcworICoKKyAqIFBsYXliYWNrIGFuZCByZWNvcmQgc3RyZWFtcyBhbHdheXMgaGF2ZSBhIHNlcnZlciBzaWRlIGJ1ZmZlciBhcworICogcGFydCBvZiB0aGUgZGF0YSBmbG93LiAgVGhlIHNpemUgb2YgdGhpcyBidWZmZXIgc3RyaWtlcyBhCisgKiBjb21wcm9taXNlIGJldHdlZW4gbG93IGxhdGVuY3kgYW5kIHNlbnNpdGl2aXR5IGZvciBidWZmZXIKKyAqIG92ZXJmbG93cy91bmRlcnJ1bnMuCisgKgorICogVGhlIGJ1ZmZlciBtZXRyaWNzIG1heSBiZSBjb250cm9sbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhleSBhcmUKKyAqIGRlc2NyaWJlZCB3aXRoIGEgcGFfYnVmZmVyX2F0dHIgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGEgbnVtYmVyCisgKiBvZiBmaWVsZHM6CisgKgorICogXGxpIG1heGxlbmd0aCAtIFRoZSBhYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4KKyAqICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyLiBJZiB0aGlzIHZhbHVlIGlzIGV4Y2VlZGVkIHRoZW4gZGF0YSB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgbG9zdC4KKyAqIFxsaSB0bGVuZ3RoIC0gVGhlIHRhcmdldCBsZW5ndGggb2YgYSBwbGF5YmFjayBidWZmZXIuIFRoZSBzZXJ2ZXIgd2lsbCBvbmx5CisgKiAgICAgICAgICAgICAgIHNlbmQgcmVxdWVzdHMgZm9yIG1vcmUgZGF0YSBhcyBsb25nIGFzIHRoZSBidWZmZXIgaGFzIGxlc3MKKyAqICAgICAgICAgICAgICAgdGhhbiB0aGlzIG51bWJlciBvZiBieXRlcyBvZiBkYXRhLgorICogXGxpIHByZWJ1ZiAtIE51bWJlciBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgaW4gdGhlIGJ1ZmZlciBiZWZvcmUKKyAqIHBsYXliYWNrIHdpbGwgY29tbWVuY2UuIFN0YXJ0IG9mIHBsYXliYWNrIGNhbiBiZSBmb3JjZWQgdXNpbmcKKyAqIHBhX3N0cmVhbV90cmlnZ2VyKCkgZXZlbiB0aG91Z2ggdGhlIHByZWJ1ZmZlciBzaXplIGhhc24ndCBiZWVuCisgKiByZWFjaGVkLiBJZiBhIGJ1ZmZlciB1bmRlcnJ1biBvY2N1cnMsIHRoaXMgcHJlYnVmZmVyaW5nIHdpbGwgYmUKKyAqIGFnYWluIGVuYWJsZWQuIElmIHRoZSBwbGF5YmFjayBzaGFsbCBuZXZlciBzdG9wIGluIGNhc2Ugb2YgYSBidWZmZXIKKyAqIHVuZGVycnVuLCB0aGlzIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gMC4gSW4gdGhhdCBjYXNlIHRoZSByZWFkCisgKiBpbmRleCBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBvdmVydGFrZXMgdGhlIHdyaXRlIGluZGV4LCBhbmQgaGVuY2UgdGhlCisgKiBmaWxsIGxldmVsIG9mIHRoZSBidWZmZXIgaXMgbmVnYXRpdmUuCisgKiBcbGkgbWlucmVxIC0gTWluaW11bSBmcmVlIG51bWJlciBvZiB0aGUgYnl0ZXMgaW4gdGhlIHBsYXliYWNrIGJ1ZmZlciBiZWZvcmUKKyAqICAgICAgICAgICAgICB0aGUgc2VydmVyIHdpbGwgcmVxdWVzdCBtb3JlIGRhdGEuCisgKiBcbGkgZnJhZ3NpemUgLSBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBwdXNoIGluIG9uZQorICogICAgICAgICAgICAgICAgY2h1bmsgZm9yIHJlY29yZCBzdHJlYW1zLgorICoKKyAqIFRoZSBzZXJ2ZXIgc2lkZSBwbGF5YmFjayBidWZmZXJzIGFyZSBpbmRleGVkIGJ5IGEgd3JpdGUgYW5kIGEgcmVhZAorICogaW5kZXguIFRoZSBhcHBsaWNhdGlvbiB3cml0ZXMgdG8gdGhlIHdyaXRlIGluZGV4IGFuZCB0aGUgc291bmQKKyAqIGRldmljZSByZWFkcyBmcm9tIHRoZSByZWFkIGluZGV4LiBUaGUgcmVhZCBpbmRleCBpcyBpbmNyZWFzZWQKKyAqIG1vbm90b25pY2FsbHksIHdoaWxlIHRoZSB3cml0ZSBpbmRleCBtYXkgYmUgZnJlZWx5IGNvbnRyb2xsZWQgYnkKKyAqIHRoZSBhcHBsaWNhdGlvbi4gU3Vic3RyYWN0aW5nIHRoZSByZWFkIGluZGV4IGZyb20gdGhlIHdyaXRlIGluZGV4CisgKiB3aWxsIGdpdmUgeW91IHRoZSBjdXJyZW50IGZpbGwgbGV2ZWwgb2YgdGhlIGJ1ZmZlci4gVGhlIHJlYWQvd3JpdGUKKyAqIGluZGV4ZXMgYXJlIDY0Yml0IHZhbHVlcyBhbmQgbWVhc3VyZWQgaW4gYnl0ZXMsIHRoZXkgd2lsbCBuZXZlcgorICogd3JhcC4gVGhlIGN1cnJlbnQgcmVhZC93cml0ZSBpbmRleCBtYXkgYmUgcXVlcmllZCB1c2luZworICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpIChzZWUgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24pLiBJbgorICogY2FzZSBvZiBhIGJ1ZmZlciB1bmRlcnJ1biB0aGUgcmVhZCBpbmRleCBpcyBlcXVhbCBvciBsYXJnZXIgdGhhbgorICogdGhlIHdyaXRlIGluZGV4LiBVbmxlc3MgdGhlIHByZWJ1ZiB2YWx1ZSBpcyAwLCBQdWxzZUF1ZGlvIHdpbGwKKyAqIHRlbXBvcmFyaWx5IHBhdXNlIHBsYXliYWNrIGluIHN1Y2ggYSBjYXNlLCBhbmQgd2FpdCB1bnRpbCB0aGUKKyAqIGJ1ZmZlciBpcyBmaWxsZWQgdXAgdG8gcHJlYnVmIGJ5dGVzIGFnYWluLiBJZiBwcmVidWYgaXMgMCwgdGhlCisgKiByZWFkIGluZGV4IG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgd3JpdGUgaW5kZXgsIGluIHdoaWNoIGNhc2UKKyAqIHNpbGVuY2UgaXMgcGxheWVkLiBJZiB0aGUgYXBwbGljYXRpb24gd3JpdGVzIGRhdGEgdG8gaW5kZXhlcyBsb3dlcgorICogdGhhbiB0aGUgcmVhZCBpbmRleCwgdGhlIGRhdGEgaXMgaW1tZWRpYXRlbHkgbG9zdC4KKyAqCisgKiBcc2VjdGlvbiB0cmFuc2Zlcl9zZWMgVHJhbnNmZXJyaW5nIERhdGEKKyAqCisgKiBPbmNlIHRoZSBzdHJlYW0gaXMgdXAsIGRhdGEgY2FuIHN0YXJ0IGZsb3dpbmcgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUKKyAqIHNlcnZlci4gVHdvIGRpZmZlcmVudCBhY2Nlc3MgbW9kZWxzIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBkYXRhOgorICoKKyAqIFxsaSBBc3luY2hyb25vdXMgLSBUaGUgYXBwbGljYXRpb24gcmVnaXN0ZXIgYSBjYWxsYmFjayB1c2luZworICogICAgICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2soKSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICBwYV9zdHJlYW1fc2V0X3JlYWRfY2FsbGJhY2soKSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICB0aGF0IGRhdGEgY2FuIGVpdGhlciBiZSB3cml0dGVuIG9yIHJlYWQuCisgKiBcbGkgUG9sbGVkIC0gUXVlcnkgdGhlIGxpYnJhcnkgZm9yIGF2YWlsYWJsZSBkYXRhL3NwYWNlIHVzaW5nCisgKiAgICAgICAgICAgICAgcGFfc3RyZWFtX3dyaXRhYmxlX3NpemUoKSBhbmQgcGFfc3RyZWFtX3JlYWRhYmxlX3NpemUoKSBhbmQKKyAqICAgICAgICAgICAgICB0cmFuc2ZlciBkYXRhIGFzIG5lZWRlZC4gVGhlIHNpemVzIGFyZSBzdG9yZWQgbG9jYWxseSwgaW4gdGhlCisgKiAgICAgICAgICAgICAgY2xpZW50IGVuZCwgc28gdGhlcmUgaXMgbm8gZGVsYXkgd2hlbiByZWFkaW5nIHRoZW0uCisgKgorICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtaXggdGhlIHR3byBtb2RlbHMgZnJlZWx5LgorICoKKyAqIE9uY2UgdGhlcmUgaXMgZGF0YS9zcGFjZSBhdmFpbGFibGUsIGl0IGNhbiBiZSB0cmFuc2ZlcnJlZCB1c2luZyBlaXRoZXIKKyAqIHBhX3N0cmVhbV93cml0ZSgpIGZvciBwbGF5YmFjaywgb3IgcGFfc3RyZWFtX3BlZWsoKSAvIHBhX3N0cmVhbV9kcm9wKCkgZm9yCisgKiByZWNvcmQuIE1ha2Ugc3VyZSB5b3UgZG8gbm90IG92ZXJmbG93IHRoZSBwbGF5YmFjayBidWZmZXJzIGFzIGRhdGEgd2lsbCBiZQorICogZHJvcHBlZC4KKyAqCisgKiBcc2VjdGlvbiBidWZjdGxfc2VjIEJ1ZmZlciBDb250cm9sCisgKgorICogVGhlIHRyYW5zZmVyIGJ1ZmZlcnMgY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhIG51bWJlciBvZiBvcGVyYXRpb25zOgorICoKKyAqIFxsaSBwYV9zdHJlYW1fY29yaygpIC0gU3RhcnQgb3Igc3RvcCB0aGUgcGxheWJhY2sgb3IgcmVjb3JkaW5nLgorICogXGxpIHBhX3N0cmVhbV90cmlnZ2VyKCkgLSBTdGFydCBwbGF5YmFjayBpbW1lZGlhdGx5IGFuZCBkbyBub3Qgd2FpdCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBmaWxsIHVwIHRvIHRoZSBzZXQgdHJpZ2dlciBsZXZlbC4KKyAqIFxsaSBwYV9zdHJlYW1fcHJlYnVmKCkgLSBSZWVuYWJsZSB0aGUgcGxheWJhY2sgdHJpZ2dlciBsZXZlbC4KKyAqIFxsaSBwYV9zdHJlYW1fZHJhaW4oKSAtIFdhaXQgZm9yIHRoZSBwbGF5YmFjayBidWZmZXIgdG8gZ28gZW1wdHkuIFdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIHBhX29wZXJhdGlvbiBvYmplY3QgdGhhdCB3aWxsIGluZGljYXRlIHdoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXIgaXMgY29tcGxldGVseSBkcmFpbmVkLgorICogXGxpIHBhX3N0cmVhbV9mbHVzaCgpIC0gRHJvcCBhbGwgZGF0YSBmcm9tIHRoZSBwbGF5YmFjayBidWZmZXIgYW5kIGRvIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCBmb3IgaXQgdG8gZmluaXNoIHBsYXlpbmcuCisgKgorICogXHNlY3Rpb24gc2Vla19tb2RlcyBTZWVraW5nIGluIHRoZSBQbGF5YmFjayBCdWZmZXIKKyAqCisgKiBBIGNsaWVudCBhcHBsaWNhdGlvbiBtYXkgZnJlZWx5IHNlZWsgaW4gdGhlIHBsYXliYWNrIGJ1ZmZlci4gVG8KKyAqIGFjY29tcGxpc2ggdGhhdCB0aGUgcGFfc3RyZWFtX3dyaXRlKCkgZnVuY3Rpb24gdGFrZXMgYSBzZWVrIG1vZGUKKyAqIGFuZCBhbiBvZmZzZXQgYXJndW1lbnQuIFRoZSBzZWVrIG1vZGUgaXMgb25lIG9mOgorICoKKyAqIFxsaSBQQV9TRUVLX1JFTEFUSVZFIC0gc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3cml0ZSBpbmRleAorICogXGxpIFBBX1NFRUtfQUJTT0xVVEUgLSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBsYXliYWNrIGJ1ZmZlciwgKGkuZS4gdGhlIGZpcnN0IHRoYXQgd2FzIGV2ZXIgcGxheWVkIGluIHRoZSBzdHJlYW0pCisgKiBcbGkgUEFfU0VFS19SRUxBVElWRV9PTl9SRUFEIC0gc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudCByZWFkIGluZGV4LiBVc2UgdGhpcyB0byB3cml0ZSBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIHBsYXllZCBhcyBzb29uIGFzIHBvc3NpYmxlCisgKiBcbGkgUEFfU0VFS19SRUxBVElWRV9FTkQgLSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBsYXN0IGJ5dGUgZXZlciB3cml0dGVuLgorICoKKyAqIElmIGFuIGFwcGxpY2F0aW9uIGp1c3Qgd2FudHMgdG8gYXBwZW5kIHNvbWUgZGF0YSB0byB0aGUgb3V0cHV0CisgKiBidWZmZXIsIFBBX1NFRUtfUkVMQVRJVkUgYW5kIGFuIG9mZnNldCBvZiAwIHNob3VsZCBiZSB1c2VkLgorICoKKyAqIEFmdGVyIGEgY2FsbCB0byBwYV9zdHJlYW1fd3JpdGUoKSB0aGUgd3JpdGUgaW5kZXggd2lsbCBiZSBsZWZ0IGF0CisgKiB0aGUgcG9zaXRpb24gcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgd3JpdHRlbiBkYXRhLgorICoKKyAqIFxzZWN0aW9uIGxhdGVuY3lfc2VjIExhdGVuY3kKKyAqCisgKiBBIG1ham9yIHByb2JsZW0gd2l0aCBuZXR3b3JrZWQgYXVkaW8gaXMgdGhlIGluY3JlYXNlZCBsYXRlbmN5IGNhdXNlZCBieQorICogdGhlIG5ldHdvcmsuIFRvIHJlbWVkeSB0aGlzLCBQdWxzZUF1ZGlvIHN1cHBvcnRzIGFuIGFkdmFuY2VkIHN5c3RlbSBvZgorICogbW9uaXRvcmluZyB0aGUgY3VycmVudCBsYXRlbmN5LgorICoKKyAqIFRvIGdldCB0aGUgcmF3IGRhdGEgbmVlZGVkIHRvIGNhbGN1bGF0ZSBsYXRlbmNpZXMsIGNhbGwKKyAqIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8oKS4gVGhpcyB3aWxsIGdpdmUgeW91IGEgcGFfdGltaW5nX2luZm8KKyAqIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBpcyBrbm93biBhYm91dCB0aGUgc2VydmVyCisgKiBzaWRlIGJ1ZmZlciB0cmFuc3BvcnQgZGVsYXlzIGFuZCB0aGUgYmFja2VuZCBhY3RpdmUgaW4gdGhlCisgKiBzZXJ2ZXIuIChCZXNpZGVzIG90aGVyIHRoaW5ncyBpdCBjb250YWlucyB0aGUgd3JpdGUgYW5kIHJlYWQgaW5kZXgKKyAqIHZhbHVlcyBtZW50aW9uZWQgYWJvdmUuKQorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVwZGF0ZWQgZXZlcnkgdGltZSBhCisgKiBwYV9zdHJlYW1fdXBkYXRlX3RpbWluZ19pbmZvKCkgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkLiAoaS5lLiBiZWZvcmUKKyAqIHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgaXMKKyAqIG5vdCBhdmFpbGFibGUhKSBTaW5jZSBpdCBpcyBhIGxvdCBvZiB3b3JrIHRvIGtlZXAgdGhpcyBzdHJ1Y3R1cmUKKyAqIHVwLXRvLWRhdGUgbWFudWFsbHksIFB1bHNlQXVkaW8gY2FuIGRvIHRoYXQgYXV0b21hdGljYWxseSBmb3IgeW91OgorICogaWYgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSBpcyBwYXNzZWQgd2hlbiBjb25uZWN0aW5nIHRoZQorICogc3RyZWFtIFB1bHNlQXVkaW8gd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgc3RydWN0dXJlIGV2ZXJ5CisgKiAxMDBtcyBhbmQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGF0IG1pZ2h0IGludmFsaWRhdGUgdGhlCisgKiBwcmV2aW91c2x5IGtub3duIHRpbWluZyBkYXRhIChzdWNoIGFzIHBhX3N0cmVhbV93cml0ZSgpIG9yCisgKiBwYV9zdHJlYW1fZmx1c2goKSkuIFBsZWFzZSBub3RlIGhvd2V2ZXIsIHRoYXQgdGhlcmUgYWx3YXlzIGlzIGEKKyAqIHNob3J0IHRpbWUgd2luZG93IHdoZW4gdGhlIGRhdGEgaW4gdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqIGlzIG91dC1vZi1kYXRlLiBQdWxzZUF1ZGlvIHRyaWVzIHRvIG1hcmsgdGhlc2Ugc2l0dWF0aW9ucyBieQorICogc2V0dGluZyB0aGUgd3JpdGVfaW5kZXhfY29ycnVwdCBhbmQgcmVhZF9pbmRleF9jb3JydXB0IGZpZWxkcworICogYWNjb3JkaW5nbHkuCisgKgorICogVGhlIHJhdyB0aW1pbmcgZGF0YSBpbiB0aGUgcGFfdGltaW5nX2luZm8gc3RydWN0dXJlIGlzIHVzdWFsbHkgaGFyZAorICogdG8gZGVhbCB3aXRoLiBUaGVyZWZvcmUgYSBtb3JlIHNpbXBsaXN0aWMgaW50ZXJmYWNlIGlzIGF2YWlsYWJsZToKKyAqIHlvdSBjYW4gY2FsbCBwYV9zdHJlYW1fZ2V0X3RpbWUoKSBvciBwYV9zdHJlYW1fZ2V0X2xhdGVuY3koKS4gVGhlCisgKiBmb3JtZXIgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZSBvZiB0aGUgaGFyZHdhcmUgc2luY2UKKyAqIHRoZSBzdHJlYW0gaGFzIGJlZW4gc3RhcnRlZC4gVGhlIGxhdHRlciByZXR1cm5zIHRoZSB0aW1lIGEgc2FtcGxlCisgKiB0aGF0IHlvdSB3cml0ZSBub3cgdGFrZXMgdG8gYmUgcGxheWVkIGJ5IHRoZSBoYXJkd2FyZS4gVGhlc2UgdHdvCisgKiBmdW5jdGlvbnMgYmFzZSB0aGVpciBjYWxjdWxhdGlvbnMgb24gdGhlIHNhbWUgZGF0YSB0aGF0IGlzIHJldHVybmVkCisgKiBieSBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkuIEhlbmNlIHRoZSBzYW1lIHJ1bGVzIGZvciBrZWVwaW5nCisgKiB0aGUgdGltaW5nIGRhdGEgdXAtdG8tZGF0ZSBhcHBseSBoZXJlLiBJbiBjYXNlIHRoZSB3cml0ZSBvciByZWFkCisgKiBpbmRleCBpcyBjb3JydXB0ZWQsIHRoZXNlIHR3byBmdW5jdGlvbnMgd2lsbCBmYWlsIHdpdGgKKyAqIFBBX0VSUl9OT0RBVEEgc2V0LgorICoKKyAqIFNpbmNlIHVwZGF0aW5nIHRoZSB0aW1pbmcgaW5mbyBzdHJ1Y3R1cmUgdXN1YWxseSByZXF1aXJlcyBhIGZ1bGwKKyAqIG5ldHdvcmsgcm91bmQgdHJpcCBhbmQgc29tZSBhcHBsaWNhdGlvbnMgbW9uaXRvciB0aGUgdGltaW5nIHZlcnkKKyAqIG9mdGVuIFB1bHNlQXVkaW8gb2ZmZXJzIGEgdGltaW5nIGludGVycG9sYXRpb24gc3lzdGVtLiBJZgorICogUEFfU1RSRUFNX0lOVEVSUE9MQVRFX1RJTUlORyBpcyBwYXNzZWQgd2hlbiBjb25uZWN0aW5nIHRoZSBzdHJlYW0sCisgKiBwYV9zdHJlYW1fZ2V0X3RpbWUoKSBhbmQgcGFfc3RyZWFtX2dldF9sYXRlbmN5KCkgd2lsbCB0cnkgdG8KKyAqIGludGVycG9sYXRlIHRoZSBjdXJyZW50IHBsYXliYWNrIHRpbWUvbGF0ZW5jeSBieSBlc3RpbWF0aW5nIHRoZQorICogbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBoYXZlIGJlZW4gcGxheWVkIGJhY2sgYnkgdGhlIGhhcmR3YXJlIHNpbmNlCisgKiB0aGUgbGFzdCByZWd1bGFyIHRpbWluZyB1cGRhdGUuIEl0IGlzIGVzcGNpYWxseSB1c2VmdWwgdG8gY29tYmluZQorICogdGhpcyBvcHRpb24gd2l0aCBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFLCB3aGljaCB3aWxsIGVuYWJsZQorICogeW91IHRvIG1vbml0b3IgdGhlIGN1cnJlbnQgcGxheWJhY2sgdGltZS9sYXRlbmN5IHZlcnkgcHJlY2lzZWx5IGFuZAorICogdmVyeSBmcmVxdWVudGx5IHdpdGhvdXQgcmVxdWlyaW5nIGEgbmV0d29yayByb3VuZCB0cmlwIGV2ZXJ5IHRpbWUuCisgKgorICogXHNlY3Rpb24gZmxvd19zZWMgT3ZlcmZsb3cgYW5kIHVuZGVyZmxvdworICoKKyAqIEV2ZW4gd2l0aCB0aGUgYmVzdCBwcmVjYXV0aW9ucywgYnVmZmVycyB3aWxsIHNvbWV0aW1lIG92ZXIgLSBvcgorICogdW5kZXJmbG93LiAgVG8gaGFuZGxlIHRoaXMgZ3JhY2VmdWxseSwgdGhlIGFwcGxpY2F0aW9uIGNhbiBiZQorICogbm90aWZpZWQgd2hlbiB0aGlzIGhhcHBlbnMuIENhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZCB1c2luZworICogcGFfc3RyZWFtX3NldF9vdmVyZmxvd19jYWxsYmFjaygpIGFuZAorICogcGFfc3RyZWFtX3NldF91bmRlcmZsb3dfY2FsbGJhY2soKS4KKyAqCisgKiBcc2VjdGlvbiBzeW5jX3N0cmVhbXMgU3ljaHJvbml6aW5nIE11bHRpcGxlIFBsYXliYWNrIFN0cmVhbXMKKyAqCisgKiBQdWxzZUF1ZGlvIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gZnVsbHkgc3luY2hyb25pemUgbXVsdGlwbGUKKyAqIHBsYXliYWNrIHN0cmVhbXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSBzYW1lIG91dHB1dCBkZXZpY2UuIFRoYXQKKyAqIG1lYW5zIHRoZSBzdHJlYW1zIHdpbGwgYWx3YXlzIGJlIHBsYXllZCBiYWNrIHNhbXBsZS1ieS1zYW1wbGUKKyAqIHN5bmNocm9ub3VzbHkuIElmIHN0cmVhbSBvcGVyYXRpb25zIGxpa2UgcGFfc3RyZWFtX2NvcmsoKSBhcmUKKyAqIGlzc3VlZCBvbiBvbmUgb2YgdGhlIHN5bmNocm9uaXplZCBzdHJlYW1zLCB0aGV5IGFyZSBzaW11bHRhbmVvdXNseQorICogaXNzdWVkIG9uIHRoZSBvdGhlcnMuCisgKgorICogVG8gc3luY2hyb25pemUgYSBzdHJlYW0gdG8gYW5vdGhlciwganVzdCBwYXNzIHRoZSAibWFzdGVyIiBzdHJlYW0KKyAqIGFzIGxhc3QgYXJndW1lbnQgdG8gcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWFjaygpLiBUbyBtYWtlIHN1cmUgdGhhdAorICogdGhlIGZyZXNobHkgY3JlYXRlZCBzdHJlYW0gZG9lc24ndCBzdGFydCBwbGF5YmFjayByaWdodC1hd2F5LCBtYWtlCisgKiBzdXJlIHRvIHBhc3MgUEFfU1RSRUFNX1NUQVJUX0NPUktFRCBhbmQgLSBhZnRlciBhbGwgc3RyZWFtcyBoYXZlCisgKiBiZWVuIGNyZWF0ZWQgLSB1bmNvcmsgdGhlbSBhbGwgd2l0aCBhIHNpbmdsZSBjYWxsIHRvCisgKiBwYV9zdHJlYW1fY29yaygpIGZvciB0aGUgbWFzdGVyIHN0cmVhbS4KKyAqCisgKiBUbyBtYWtlIHN1cmUgdGhhdCBhIHBhcnRpY3VsYXIgc3RyZWFtIGRvZXNuJ3Qgc3RvcCB0byBwbGF5IHdoZW4gYQorICogc2VydmVyIHNpZGUgYnVmZmVyIHVuZGVycnVuIGhhcHBlbnMgb24gaXQgd2hpbGUgdGhlIG90aGVyCisgKiBzeW5jaHJvbml6ZWQgc3RyZWFtcyBjb250aW51ZSBwbGF5aW5nIGFuZCBoZW5jZSBkZXZpYXRlIHlvdSBuZWVkIHRvCisgKiBwYXNzIGEgInByZWJ1ZiIgcGFfYnVmZmVyX2F0dHIgb2YgMCB3aGVuIGNvbm5lY3RpbmcgaXQuCisgKgorICogXHNlY3Rpb24gZGlzY19zZWMgRGlzY29ubmVjdGluZworICoKKyAqIFdoZW4gYSBzdHJlYW0gaGFzIHNlcnZlZCBpcyBwdXJwb3NlIGl0IG11c3QgYmUgZGlzY29ubmVjdGVkIHdpdGgKKyAqIHBhX3N0cmVhbV9kaXNjb25uZWN0KCkuIElmIHlvdSBvbmx5IHVucmVmZXJlbmNlIGl0LCB0aGVuIGl0IHdpbGwgbGl2ZSBvbgorICogYW5kIGVhdCByZXNvdXJjZXMgYm90aCBsb2NhbGx5IGFuZCBvbiB0aGUgc2VydmVyIHVudGlsIHlvdSBkaXNjb25uZWN0IHRoZQorICogY29udGV4dC4KKyAqCisgKi8KKworLyoqIFxmaWxlCisgKiBBdWRpbyBzdHJlYW1zIGZvciBpbnB1dCwgb3V0cHV0IGFuZCBzYW1wbGUgdXBsb2FkICovCisKK1BBX0NfREVDTF9CRUdJTgorCisvKiogQW4gb3BhcXVlIHN0cmVhbSBmb3IgcGxheWJhY2sgb3IgcmVjb3JkaW5nICovCit0eXBlZGVmIHN0cnVjdCBwYV9zdHJlYW0gcGFfc3RyZWFtOworCisvKiogQSBnZW5lcmljIGNhbGxiYWNrIGZvciBvcGVyYXRpb24gY29tcGxldGlvbiAqLwordHlwZWRlZiB2b2lkICgqcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCkgKHBhX3N0cmVhbSpzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQSBnZW5lcmljIHJlcXVlc3QgY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QpKHBhX3N0cmVhbSAqcCwgc2l6ZV90IGJ5dGVzLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBBIGdlbmVyaWMgbm90aWZpY2F0aW9uIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKCpwYV9zdHJlYW1fbm90aWZ5X2NiX3QpKHBhX3N0cmVhbSAqcCwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogQ3JlYXRlIGEgbmV3LCB1bmNvbm5lY3RlZCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHNhbXBsZSB0eXBlICovCitwYV9zdHJlYW0qIHBhX3N0cmVhbV9uZXcoCisgICAgICAgIHBhX2NvbnRleHQgKmMgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBjb250ZXh0IHRvIGNyZWF0ZSB0aGlzIHN0cmVhbSBpbiAqLywKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgICAgICAgICAgICAgIC8qKjwgQSBuYW1lIGZvciB0aGlzIHN0cmVhbSAqLywKKyAgICAgICAgY29uc3QgcGFfc2FtcGxlX3NwZWMgKnNzICAgICAgICAgIC8qKjwgVGhlIGRlc2lyZWQgc2FtcGxlIGZvcm1hdCAqLywKKyAgICAgICAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCAgICAgICAgIC8qKjwgVGhlIGRlc2lyZWQgY2hhbm5lbCBtYXAsIG9yIE5VTEwgZm9yIGRlZmF1bHQgKi8pOworCisvKiogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGJ5IG9uZSAqLwordm9pZCBwYV9zdHJlYW1fdW5yZWYocGFfc3RyZWFtICpzKTsKKworLyoqIEluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnRlciBieSBvbmUgKi8KK3BhX3N0cmVhbSAqcGFfc3RyZWFtX3JlZihwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdHJlYW0gKi8KK3BhX3N0cmVhbV9zdGF0ZV90IHBhX3N0cmVhbV9nZXRfc3RhdGUocGFfc3RyZWFtICpwKTsKKworLyoqIFJldHVybiB0aGUgY29udGV4dCB0aGlzIHN0cmVhbSBpcyBhdHRhY2hlZCB0byAqLworcGFfY29udGV4dCogcGFfc3RyZWFtX2dldF9jb250ZXh0KHBhX3N0cmVhbSAqcCk7CisKKy8qKiBSZXR1cm4gdGhlIHNpbmsgaW5wdXQgcmVzcC4gc291cmNlIG91dHB1dCBpbmRleCB0aGlzIHN0cmVhbSBpcworICogaWRlbnRpZmllZCBpbiB0aGUgc2VydmVyIHdpdGguIFRoaXMgaXMgdXNlZnVsIGZvciB1c2FnZSB3aXRoIHRoZQorICogaW50cm9zcGVjdGlvbiBmdW5jdGlvbnMsIHN1Y2ggYXMgcGFfY29udGV4dF9nZXRfc2lua19pbnB1dF9pbmZvKCkKKyAqIHJlc3AuIHBhX2NvbnRleHRfZ2V0X3NvdXJjZV9vdXRwdXRfaW5mbygpLiAqLwordWludDMyX3QgcGFfc3RyZWFtX2dldF9pbmRleChwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2luayBvciBzb3VyY2UgdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvCisgKiBpbiB0aGUgc2VydmVyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNhZ2Ugd2l0aCB0aGUgaW50cm9zcGVjdGlvbgorICogZnVuY3Rpb25zLCBzdWNoIGFzIHBhX2NvbnRleHRfZ2V0X3NpbmtfaW5mb19ieV9pbmRleCgpCisgKiByZXNwLiBwYV9jb250ZXh0X2dldF9zb3VyY2VfaW5mb19ieV9pbmRleCgpLiBQbGVhc2Ugbm90ZSB0aGF0CisgKiBzdHJlYW1zIG1heSBiZSBtb3ZlZCBiZXR3ZWVuIHNpbmtzL3NvdXJjZXMgYW5kIHRodXMgaXQgaXMKKyAqIHJlY29tbWVuZGVkIHRvIHVzZSBwYV9zdHJlYW1fc2V0X21vdmVkX2NhbGxiYWNrKCkgdG8gYmUgbm90aWZpZWQKKyAqIGFib3V0IHRoaXMuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCBQQV9FUlJfTk9UU1VQUE9SVEVEIHdoZW4gdGhlCisgKiBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCit1aW50MzJfdCBwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleChwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzaW5rIG9yIHNvdXJjZSB0aGlzIHN0cmVhbSBpcyBjb25uZWN0ZWQgdG8KKyAqIGluIHRoZSBzZXJ2ZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB1c2FnZSB3aXRoIHRoZSBpbnRyb3NwZWN0aW9uCisgKiBmdW5jdGlvbnMsIHN1Y2ggYXMgcGFfY29udGV4dF9nZXRfc2lua19pbmZvX2J5X25hbWUoKQorICogcmVzcC4gcGFfY29udGV4dF9nZXRfc291cmNlX2luZm9fYnlfbmFtZSgpLiBQbGVhc2Ugbm90ZSB0aGF0CisgKiBzdHJlYW1zIG1heSBiZSBtb3ZlZCBiZXR3ZWVuIHNpbmtzL3NvdXJjZXMgYW5kIHRodXMgaXQgaXMKKyAqIHJlY29tbWVuZGVkIHRvIHVzZSBwYV9zdHJlYW1fc2V0X21vdmVkX2NhbGxiYWNrKCkgdG8gYmUgbm90aWZpZWQKKyAqIGFib3V0IHRoaXMuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCBQQV9FUlJfTk9UU1VQUE9SVEVEIHdoZW4gdGhlCisgKiBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCitjb25zdCBjaGFyICpwYV9zdHJlYW1fZ2V0X2RldmljZV9uYW1lKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gMSBpZiB0aGUgc2luayBvciBzb3VyY2UgdGhpcyBzdHJlYW0gaXMgY29ubmVjdGVkIHRvIGhhcworICogYmVlbiBzdXNwZW5kZWQuIFRoaXMgd2lsbCByZXR1cm4gMCBpZiBub3QsIGFuZCBuZWdhdGl2ZSBvbgorICogZXJyb3IuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gd2l0aCBQQV9FUlJfTk9UU1VQUE9SVEVEIHdoZW4gdGhlCisgKiBzZXJ2ZXIgaXMgb2xkZXIgdGhhbiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCitpbnQgcGFfc3RyZWFtX2lzX3N1c3BlbmRlZChwYV9zdHJlYW0gKnMpOworCisvKiogQ29ubmVjdCB0aGUgc3RyZWFtIHRvIGEgc2luayAqLworaW50IHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKAorICAgICAgICBwYV9zdHJlYW0gKnMgICAgICAgICAgICAgICAgICAvKio8IFRoZSBzdHJlYW0gdG8gY29ubmVjdCB0byBhIHNpbmsgKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKmRldiAgICAgICAgICAgICAgIC8qKjwgTmFtZSBvZiB0aGUgc2luayB0byBjb25uZWN0IHRvLCBvciBOVUxMIGZvciBkZWZhdWx0ICovICwKKyAgICAgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIgICAgLyoqPCBCdWZmZXJpbmcgYXR0cmlidXRlcywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MgICAgICAgLyoqPCBBZGRpdGlvbmFsIGZsYWdzLCBvciAwIGZvciBkZWZhdWx0ICovLAorICAgICAgICBwYV9jdm9sdW1lICp2b2x1bWUgICAgICAgICAgICAvKio8IEluaXRpYWwgdm9sdW1lLCBvciBOVUxMIGZvciBkZWZhdWx0ICovLAorICAgICAgICBwYV9zdHJlYW0gKnN5bmNfc3RyZWFtICAgICAgICAvKio8IFN5bmNocm9uaXplIHRoaXMgc3RyZWFtIHdpdGggdGhlIHNwZWNpZmllZCBvbmUsIG9yIE5VTEwgZm9yIGEgc3RhbmRhbG9uZSBzdHJlYW0qLyk7CisKKy8qKiBDb25uZWN0IHRoZSBzdHJlYW0gdG8gYSBzb3VyY2UgKi8KK2ludCBwYV9zdHJlYW1fY29ubmVjdF9yZWNvcmQoCisgICAgICAgIHBhX3N0cmVhbSAqcyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHN0cmVhbSB0byBjb25uZWN0IHRvIGEgc291cmNlICovICwKKyAgICAgICAgY29uc3QgY2hhciAqZGV2ICAgICAgICAgICAgICAgLyoqPCBOYW1lIG9mIHRoZSBzb3VyY2UgdG8gY29ubmVjdCB0bywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIgICAgLyoqPCBCdWZmZXIgYXR0cmlidXRlcywgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLywKKyAgICAgICAgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MgICAgICAgLyoqPCBBZGRpdGlvbmFsIGZsYWdzLCBvciAwIGZvciBkZWZhdWx0ICovKTsKKworLyoqIERpc2Nvbm5lY3QgYSBzdHJlYW0gZnJvbSBhIHNvdXJjZS9zaW5rICovCitpbnQgcGFfc3RyZWFtX2Rpc2Nvbm5lY3QocGFfc3RyZWFtICpzKTsKKworLyoqIFdyaXRlIHNvbWUgZGF0YSB0byB0aGUgc2VydmVyIChmb3IgcGxheWJhY2sgc2lua3MpLCBpZiBmcmVlX2NiIGlzCisgKiBub24tTlVMTCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBvdXQKKyAqIGFuZCBhbiBpbnRlcm5hbCByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCBkYXRhIGlzIGtlcHQsIHRoZSBkYXRhCisgKiBpcyBub3QgY29waWVkLiBJZiBOVUxMLCB0aGUgZGF0YSBpcyBjb3BpZWQgaW50byBhbiBpbnRlcm5hbAorICogYnVmZmVyLiBUaGUgY2xpZW50IG15IGZyZWVseSBzZWVrIGFyb3VuZCBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gRm9yCisgKiBtb3N0IGFwcGxpY2F0aW9ucyBwYXNzaW5nIDAgYW5kIFBBX1NFRUtfUkVMQVRJVkUgYXMgYXJndW1lbnRzIGZvcgorICogb2Zmc2V0IGFuZCBzZWVrIHNob3VsZCBiZSB1c2VmdWwuKi8KK2ludCBwYV9zdHJlYW1fd3JpdGUoCisgICAgICAgIHBhX3N0cmVhbSAqcCAgICAgICAgICAgICAvKio8IFRoZSBzdHJlYW0gdG8gdXNlICovLAorICAgICAgICBjb25zdCB2b2lkICpkYXRhICAgICAgICAgLyoqPCBUaGUgZGF0YSB0byB3cml0ZSAqLywKKyAgICAgICAgc2l6ZV90IGJ5dGVzICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byB3cml0ZSBpbiBieXRlcyovLAorICAgICAgICBwYV9mcmVlX2NiX3QgZnJlZV9jYiAgICAgLyoqPCBBIGNsZWFudXAgcm91dGluZSBmb3IgdGhlIGRhdGEgb3IgTlVMTCB0byByZXF1ZXN0IGFuIGludGVybmFsIGNvcHkgKi8sCisgICAgICAgIGludDY0X3Qgb2Zmc2V0LCAgICAgICAgICAvKio8IE9mZnNldCBmb3Igc2Vla2luZywgbXVzdCBiZSAwIGZvciB1cGxvYWQgc3RyZWFtcyAqLworICAgICAgICBwYV9zZWVrX21vZGVfdCBzZWVrICAgICAgLyoqPCBTZWVrIG1vZGUsIG11c3QgYmUgUEFfU0VFS19SRUxBVElWRSBmb3IgdXBsb2FkIHN0cmVhbXMgKi8pOworCisvKiogUmVhZCB0aGUgbmV4dCBmcmFnbWVudCBmcm9tIHRoZSBidWZmZXIgKGZvciByZWNvcmRpbmcpLgorICogZGF0YSB3aWxsIHBvaW50IHRvIHRoZSBhY3R1YWwgZGF0YSBhbmQgbGVuZ3RoIHdpbGwgY29udGFpbiB0aGUgc2l6ZQorICogb2YgdGhlIGRhdGEgaW4gYnl0ZXMgKHdoaWNoIGNhbiBiZSBsZXNzIHRoYW4gYSBjb21wbGV0ZSBmcmFtZ25ldCkuCisgKiBVc2UgcGFfc3RyZWFtX2Ryb3AoKSB0byBhY3R1YWxseSByZW1vdmUgdGhlIGRhdGEgZnJvbSB0aGUKKyAqIGJ1ZmZlci4gSWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgd2lsbCByZXR1cm4gYSBOVUxMIHBvaW50ZXIgIFxzaW5jZSAwLjggKi8KK2ludCBwYV9zdHJlYW1fcGVlaygKKyAgICAgICAgcGFfc3RyZWFtICpwICAgICAgICAgICAgICAgICAvKio8IFRoZSBzdHJlYW0gdG8gdXNlICovLAorICAgICAgICBjb25zdCB2b2lkICoqZGF0YSAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBwb2ludGVyIHRoYXQgd2lsbCBwb2ludCB0byBkYXRhICovLAorICAgICAgICBzaXplX3QgKmJ5dGVzICAgICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSByZWFkIGluIGJ5dGVzICovKTsKKworLyoqIFJlbW92ZSB0aGUgY3VycmVudCBmcmFnbWVudCBvbiByZWNvcmQgc3RyZWFtcy4gSXQgaXMgaW52YWxpZCB0byBkbyB0aGlzIHdpdGhvdXQgZmlyc3QKKyAqIGNhbGxpbmcgcGFfc3RyZWFtX3BlZWsoKS4gXHNpbmNlIDAuOCAqLworaW50IHBhX3N0cmVhbV9kcm9wKHBhX3N0cmVhbSAqcCk7CisKKy8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1heSBiZSB3cml0dGVuIHVzaW5nIHBhX3N0cmVhbV93cml0ZSgpICovCitzaXplX3QgcGFfc3RyZWFtX3dyaXRhYmxlX3NpemUocGFfc3RyZWFtICpwKTsKKworLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5IGJlIHJlYWQgdXNpbmcgcGFfc3RyZWFtX3JlYWQoKSBcc2luY2UgMC44ICovCitzaXplX3QgcGFfc3RyZWFtX3JlYWRhYmxlX3NpemUocGFfc3RyZWFtICpwKTsKKworLyoqIERyYWluIGEgcGxheWJhY2sgc3RyZWFtLiBVc2UgdGhpcyBmb3Igbm90aWZpY2F0aW9uIHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eSAqLworcGFfb3BlcmF0aW9uKiBwYV9zdHJlYW1fZHJhaW4ocGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZXF1ZXN0IGEgdGltaW5nIGluZm8gc3RydWN0dXJlIHVwZGF0ZSBmb3IgYSBzdHJlYW0uIFVzZQorICogcGFfc3RyZWFtX2dldF90aW1pbmdfaW5mbygpIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHJhdyB0aW1pbmcgZGF0YSwKKyAqIG9yIHBhX3N0cmVhbV9nZXRfdGltZSgpIG9yIHBhX3N0cmVhbV9nZXRfbGF0ZW5jeSgpIHRvIGdldCBjbGVhbmVkCisgKiB1cCB2YWx1ZXMuICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8ocGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZiB0aGUgc3RyZWFtIGNoYW5nZXMgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayhwYV9zdHJlYW0gKnMsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG5ldyBkYXRhIG1heSBiZQorICogd3JpdHRlbiB0byB0aGUgc3RyZWFtLiAqLwordm9pZCBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX3JlcXVlc3RfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBzdHJlYW0uCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBcc2luY2UgMC44ICovCit2b2lkIHBhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGJ1ZmZlciBvdmVyZmxvdyBoYXBwZW5zLiAoT25seSBmb3IgcGxheWJhY2sgc3RyZWFtcykgXHNpbmNlIDAuOCAqLwordm9pZCBwYV9zdHJlYW1fc2V0X292ZXJmbG93X2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBidWZmZXIgdW5kZXJmbG93IGhhcHBlbnMuIChPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zKSBcc2luY2UgMC44ICovCit2b2lkIHBhX3N0cmVhbV9zZXRfdW5kZXJmbG93X2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBTZXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbGF0ZW5jeQorICogaW5mb3JtYXRpb24gdXBkYXRlIGhhcHBlbnMuIFVzZWZ1bCBvbiBQQV9TVFJFQU1fQVVUT19USU1JTkdfVVBEQVRFCisgKiBzdHJlYW1zIG9ubHkuIChPbmx5IGZvciBwbGF5YmFjayBzdHJlYW1zKSBcc2luY2UgMC44LjIgKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9sYXRlbmN5X3VwZGF0ZV9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RyZWFtIGlzCisgKiBtb3ZlZCB0byBhIGRpZmZlcmVudCBzaW5rL3NvdXJjZS4gVXNlIHBhX3N0cmVhbV9nZXRfZGV2aWNlX25hbWUoKW9yCisgKiBwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleCgpIHRvIHF1ZXJ5IHRoZSBuZXcgc2luay9zb3VyY2UuIFRoaXMKKyAqIG5vdGlmaWNhdGlvbiBpcyBvbmx5IGdlbmVyYXRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXQgbGVhc3QKKyAqIDAuOS44LiBcc2luY2UgMC45LjggKi8KK3ZvaWQgcGFfc3RyZWFtX3NldF9tb3ZlZF9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogU2V0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc2luay9zb3VyY2UKKyAqIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0byBpcyBzdXNwZW5kZWQgb3IgcmVzdW1lZC4gVXNlCisgKiBwYV9zdHJlYW1faXNfc3VzcGVuZGVkKCkgdG8gcXVlcnkgdGhlIG5ldyBzdXNwZW5kIHN0YXR1cy4gUGxlYXNlCisgKiBub3RlIHRoYXQgdGhlIHN1c3BlbmQgc3RhdHVzIG1pZ2h0IGFsc28gY2hhbmdlIHdoZW4gdGhlIHN0cmVhbSBpcworICogbW92ZWQgYmV0d2VlbiBkZXZpY2VzLiBUaHVzIGlmIHlvdSBjYWxsIHRoaXMgZnVuY3Rpb24geW91IHZlcnkKKyAqIGxpa2VseSB3YW50IHRvIGNhbGwgcGFfc3RyZWFtX3NldF9tb3ZlZF9jYWxsYmFjaywgdG9vLiBUaGlzCisgKiBub3RpZmljYXRpb24gaXMgb25seSBnZW5lcmF0ZWQgd2hlbiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0CisgKiAwLjkuOC4gXHNpbmNlIDAuOS44ICovCit2b2lkIHBhX3N0cmVhbV9zZXRfc3VzcGVuZGVkX2NhbGxiYWNrKHBhX3N0cmVhbSAqcCwgcGFfc3RyZWFtX25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBQYXVzZSAob3IgcmVzdW1lKSBwbGF5YmFjayBvZiB0aGlzIHN0cmVhbSB0ZW1wb3JhcmlseS4gQXZhaWxhYmxlIG9uIGJvdGggcGxheWJhY2sgYW5kIHJlY29yZGluZyBzdHJlYW1zLiBcc2luY2UgMC4zICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV9jb3JrKHBhX3N0cmVhbSAqcywgaW50IGIsIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIEZsdXNoIHRoZSBwbGF5YmFjayBidWZmZXIgb2YgdGhpcyBzdHJlYW0uIE1vc3Qgb2YgdGhlIHRpbWUgeW91J3JlCisgKiBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBwYXJhbWV0ZXIgZGVsdGEgb2YgcGFfc3RyZWFtX3dyaXRlKCkgaW5zdGVhZCBvZiB0aGlzCisgKiBmdW5jdGlvbi4gQXZhaWxhYmxlIG9uIGJvdGggcGxheWJhY2sgYW5kIHJlY29yZGluZyBzdHJlYW1zLiBcc2luY2UgMC4zICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV9mbHVzaChwYV9zdHJlYW0gKnMsIHBhX3N0cmVhbV9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFJlZW5hYmxlIHByZWJ1ZmZlcmluZyBhcyBzcGVjaWZpZWQgaW4gdGhlIHBhX2J1ZmZlcl9hdHRyCisgKiBzdHJ1Y3R1cmUuIEF2YWlsYWJsZSBmb3IgcGxheWJhY2sgc3RyZWFtcyBvbmx5LiBcc2luY2UgMC42ICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV9wcmVidWYocGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBSZXF1ZXN0IGltbWVkaWF0ZSBzdGFydCBvZiBwbGF5YmFjayBvbiB0aGlzIHN0cmVhbS4gVGhpcyBkaXNhYmxlcworICogcHJlYnVmZmVyaW5nIGFzIHNwZWNpZmllZCBpbiB0aGUgcGFfYnVmZmVyX2F0dHIKKyAqIHN0cnVjdHVyZSwgdGVtcG9yYXJpbHkuIEF2YWlsYWJsZSBmb3IgcGxheWJhY2sgc3RyZWFtcyBvbmx5LiBcc2luY2UgMC4zICovCitwYV9vcGVyYXRpb24qIHBhX3N0cmVhbV90cmlnZ2VyKHBhX3N0cmVhbSAqcywgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmVuYW1lIHRoZSBzdHJlYW0uIFxzaW5jZSAwLjUgKi8KK3BhX29wZXJhdGlvbiogcGFfc3RyZWFtX3NldF9uYW1lKHBhX3N0cmVhbSAqcywgY29uc3QgY2hhciAqbmFtZSwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCisvKiogUmV0dXJuIHRoZSBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyB0aW1lLiBUaGlzIGlzIGJhc2VkIG9uIHRoZQorICogZGF0YSBpbiB0aGUgdGltaW5nIGluZm8gc3RydWN0dXJlIHJldHVybmVkIGJ5CisgKiBwYV9zdHJlYW1fZ2V0X3RpbWluZ19pbmZvKCkuIFRoaXMgZnVuY3Rpb24gd2lsbCB1c3VhbGx5IG9ubHkgcmV0dXJuCisgKiBuZXcgZGF0YSBpZiBhIHRpbWluZyBpbmZvIHVwZGF0ZSBoYXMgYmVlbiByZWNpZXZlZC4gT25seSBpZiB0aW1pbmcKKyAqIGludGVycG9sYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkIChQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HKQorICogdGhlIGRhdGEgZnJvbSB0aGUgbGFzdCB0aW1pbmcgdXBkYXRlIGlzIHVzZWQgZm9yIGFuIGVzdGltYXRpb24gb2YKKyAqIHRoZSBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyB0aW1lIGJhc2VkIG9uIHRoZSBsb2NhbCB0aW1lIHRoYXQKKyAqIHBhc3NlZCBzaW5jZSB0aGUgdGltaW5nIGluZm8gc3RydWN0dXJlIGhhcyBiZWVuIGFjcXVpcmVkLiBUaGUgdGltZQorICogdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGluY3JlYXNlCisgKiBtb25vdG9uaWNhbGx5LiAodGhhdCBtZWFuczogdGhlIHJldHVybmVkIHZhbHVlIGlzIGFsd2F5cyBncmVhdGVyIG9yCisgKiBlcXVhbCB0byB0aGUgdmFsdWUgcmV0dXJuZWQgb24gdGhlIGxhc3QgY2FsbCkgVGhpcyBiZWhhdmlvdXIgY2FuCisgKiBiZSBkaXNhYmxlZCBieSB1c2luZyBQQV9TVFJFQU1fTk9UX01PTk9UT05PVVMuIFRoaXMgbWF5IGJlCisgKiBkZXNpcmFibGUgdG8gZGVhbCBiZXR0ZXIgd2l0aCBiYWQgZXN0aW1hdGlvbnMgb2YgdHJhbnNwb3J0CisgKiBsYXRlbmNpZXMsIGJ1dCBtYXkgaGF2ZSBzdHJhbmdlIGVmZmVjdHMgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdAorICogYWJsZSB0byBkZWFsIHdpdGggdGltZSBnb2luZyAnYmFja3dhcmRzJy4gXHNpbmNlIDAuNiAqLworaW50IHBhX3N0cmVhbV9nZXRfdGltZShwYV9zdHJlYW0gKnMsIHBhX3VzZWNfdCAqcl91c2VjKTsKKworLyoqIFJldHVybiB0aGUgdG90YWwgc3RyZWFtIGxhdGVuY3kuIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24KKyAqIHBhX3N0cmVhbV9nZXRfdGltZSgpLiBJbiBjYXNlIHRoZSBzdHJlYW0gaXMgYSBtb25pdG9yaW5nIHN0cmVhbSB0aGUKKyAqIHJlc3VsdCBjYW4gYmUgbmVnYXRpdmUsIGkuZS4gdGhlIGNhcHR1cmVkIHNhbXBsZXMgYXJlIG5vdCB5ZXQKKyAqIHBsYXllZC4gSW4gdGhpcyBjYXNlICpuZWdhdGl2ZSBpcyBzZXQgdG8gMS4gXHNpbmNlIDAuNiAqLworaW50IHBhX3N0cmVhbV9nZXRfbGF0ZW5jeShwYV9zdHJlYW0gKnMsIHBhX3VzZWNfdCAqcl91c2VjLCBpbnQgKm5lZ2F0aXZlKTsKKworLyoqIFJldHVybiB0aGUgbGF0ZXN0IHJhdyB0aW1pbmcgZGF0YSBzdHJ1Y3R1cmUuIFRoZSByZXR1cm5lZCBwb2ludGVyCisgKiBwb2ludHMgdG8gYW4gaW50ZXJuYWwgcmVhZC1vbmx5IGluc3RhbmNlIG9mIHRoZSB0aW1pbmcKKyAqIHN0cnVjdHVyZS4gVGhlIHVzZXIgc2hvdWxkIG1ha2UgYSBjb3B5IG9mIHRoaXMgc3RydWN0dXJlIGlmIGhlCisgKiB3YW50cyB0byBtb2RpZnkgaXQuIEFuIGluLXBsYWNlIHVwZGF0ZSB0byB0aGlzIGRhdGEgc3RydWN0dXJlIG1heQorICogYmUgcmVxdWVzdGVkIHVzaW5nIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8oKS4gSWYgbm8KKyAqIHBhX3N0cmVhbV91cGRhdGVfdGltaW5nX2luZm8oKSBjYWxsIHdhcyBpc3N1ZWQgYmVmb3JlLCB0aGlzCisgKiBmdW5jdGlvbiB3aWxsIGZhaWwgd2l0aCBQQV9FUlJfTk9EQVRBLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZQorICogd3JpdGVfaW5kZXggbWVtYmVyIGZpZWxkIChhbmQgb25seSB0aGlzIGZpZWxkKSBpcyB1cGRhdGVkIG9uIGVhY2gKKyAqIHBhX3N0cmVhbV93cml0ZSgpIGNhbGwsIG5vdCBqdXN0IHdoZW4gYSB0aW1pbmcgdXBkYXRlIGhhcyBiZWVuCisgKiByZWNpZXZlZC4gXHNpbmNlIDAuOCAqLworY29uc3QgcGFfdGltaW5nX2luZm8qIHBhX3N0cmVhbV9nZXRfdGltaW5nX2luZm8ocGFfc3RyZWFtICpzKTsKKworLyoqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSdzIHNhbXBsZSBzcGVjaWZpY2F0aW9uLiBcc2luY2UgMC42ICovCitjb25zdCBwYV9zYW1wbGVfc3BlYyogcGFfc3RyZWFtX2dldF9zYW1wbGVfc3BlYyhwYV9zdHJlYW0gKnMpOworCisvKiogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyZWFtJ3MgY2hhbm5lbCBtYXAuIFxzaW5jZSAwLjggKi8KK2NvbnN0IHBhX2NoYW5uZWxfbWFwKiBwYV9zdHJlYW1fZ2V0X2NoYW5uZWxfbWFwKHBhX3N0cmVhbSAqcyk7CisKKy8qKiBSZXR1cm4gdGhlIGJ1ZmZlciBtZXRyaWNzIG9mIHRoZSBzdHJlYW0uIE9ubHkgdmFsaWQgYWZ0ZXIgdGhlCisgKiBzdHJlYW0gaGFzIGJlZW4gY29ubmVjdGVkIHN1Y2Nlc3NmdWx5IGFuZCBpZiB0aGUgc2VydmVyIGlzIGF0IGxlYXN0CisgKiBQdWxzZUF1ZGlvIDAuOS4gXHNpbmNlIDAuOS4wICovCitjb25zdCBwYV9idWZmZXJfYXR0ciogcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0cihwYV9zdHJlYW0gKnMpOworCisvKiogQ2hhbmdlIHRoZSBidWZmZXIgbWV0cmljcyBvZiB0aGUgc3RyZWFtIGR1cmluZyBwbGF5YmFjay4gVGhlCisgKiBzZXJ2ZXIgbWlnaHQgaGF2ZSBjaG9zZW4gZGlmZmVyZW50IGJ1ZmZlciBtZXRyaWNzIHRoZW4KKyAqIHJlcXVlc3RlZC4gVGhlIHNlbGVjdGVkIG1ldHJpY3MgbWF5IGJlIHF1ZXJpZWQgd2l0aAorICogcGFfc3RyZWFtX2dldF9idWZmZXJfYXR0cigpIGFzIHNvb24gYXMgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC4gT25seQorICogdmFsaWQgYWZ0ZXIgdGhlIHN0cmVhbSBoYXMgYmVlbiBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBpZiB0aGUKKyAqIHNlcnZlciBpcyBhdCBsZWFzdCBQdWxzZUF1ZGlvIDAuOS44LiBcc2luY2UgMC45LjggKi8KK3BhX29wZXJhdGlvbiAqcGFfc3RyZWFtX3NldF9idWZmZXJfYXR0cihwYV9zdHJlYW0gKnMsIGNvbnN0IHBhX2J1ZmZlcl9hdHRyICphdHRyLCBwYV9zdHJlYW1fc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CisKKy8qIENoYW5nZSB0aGUgc3RyZWFtIHNhbXBsaW5nIHJhdGUgZHVyaW5nIHBsYXliYWNrLiBZb3UgbmVlZCB0byBwYXNzCisgKiBQQV9TVFJFQU1fVkFSSUFCTEVfUkFURSBpbiB0aGUgZmxhZ3MgcGFyYW1ldGVyIG9mCisgKiBwYV9zdHJlYW1fY29ubmVjdCgpIGlmIHlvdSBwbGFuIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLiBPbmx5IHZhbGlkCisgKiBhZnRlciB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkgYW5kIGlmIHRoZSBzZXJ2ZXIKKyAqIGlzIGF0IGxlYXN0IFB1bHNlQXVkaW8gMC45LjguIFxzaW5jZSAwLjkuOCAqLworcGFfb3BlcmF0aW9uICpwYV9zdHJlYW1fdXBkYXRlX3NhbXBsZV9yYXRlKHBhX3N0cmVhbSAqcywgdWludDMyX3QgcmF0ZSwgcGFfc3RyZWFtX3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS9zdWJzY3JpYmUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc3Vic2NyaWJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0YjU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvc3Vic2NyaWJlLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBmb29zdWJzY3JpYmVoZm9vCisjZGVmaW5lIGZvb3N1YnNjcmliZWhmb28KKworLyogJElkOiBzdWJzY3JpYmUuaCAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxwdWxzZS9kZWYuaD4KKyNpbmNsdWRlIDxwdWxzZS9jb250ZXh0Lmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxwYWdlIHN1YnNjcmliZSBFdmVudCBTdWJzY3JpcHRpb24KKyAqCisgKiBcc2VjdGlvbiBvdmVydl9zZWMgT3ZlcnZpZXcKKyAqCisgKiBUaGUgYXBwbGljYXRpb24gY2FuIGJlIG5vdGlmaWVkLCBhc3luY2hyb25vdXNseSwgd2hlbmV2ZXIgdGhlIGludGVybmFsCisgKiBsYXlvdXQgb2YgdGhlIHNlcnZlciBjaGFuZ2VzLiBQb3NzaWJsZSBub3RpZmljYXRpb25zIGFyZSBkZXNyaWJlZCBpbiB0aGUKKyAqIFxyZWYgcGFfc3Vic2NyaXB0aW9uX2V2ZW50X3R5cGUgYW5kIFxyZWYgcGFfc3Vic2NyaXB0aW9uX21hc2sKKyAqIGVudW1lcmF0aW9ucy4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24gc2V0cyB0aGUgbm90aWZpY2F0aW9uIG1hc2sgdXNpbmcgcGFfY29udGV4dF9zdWJzY3JpYmUoKQorICogYW5kIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbm90aWZpY2F0aW9uIG9jY3VycyB1c2luZworICogcGFfY29udGV4dF9zZXRfc3Vic2NyaWJlX2NhbGxiYWNrKCkuCisgKi8KKworLyoqIFxmaWxlCisgKiBEYWVtb24gaW50cm9zcGVjdGlvbiBldmVudCBzdWJzY3JpcHRpb24gc3Vic3lzdGVtLiAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFN1YnNjcmlwdGlvbiBldmVudCBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgdm9pZCAoKnBhX2NvbnRleHRfc3Vic2NyaWJlX2NiX3QpKHBhX2NvbnRleHQgKmMsIHBhX3N1YnNjcmlwdGlvbl9ldmVudF90eXBlX3QgdCwgdWludDMyX3QgaWR4LCB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBFbmFibGUgZXZlbnQgbm90aWZpY2F0aW9uICovCitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc3Vic2NyaWJlKHBhX2NvbnRleHQgKmMsIHBhX3N1YnNjcmlwdGlvbl9tYXNrX3QgbSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIFNldCB0aGUgY29udGV4dCBzcGVjaWZpYyBjYWxsIGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHN0YXRlIG9mIHRoZSBkYWVtb24gY2hhbmdlcyAqLwordm9pZCBwYV9jb250ZXh0X3NldF9zdWJzY3JpYmVfY2FsbGJhY2socGFfY29udGV4dCAqYywgcGFfY29udGV4dF9zdWJzY3JpYmVfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS90aHJlYWQtbWFpbmxvb3AuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdGhyZWFkLW1haW5sb29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjMTQyMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdGhyZWFkLW1haW5sb29wLmgKQEAgLTAsMCArMSwzMDUgQEAKKyNpZm5kZWYgZm9vdGhyZWFkbWFpbmxvb3BoZm9vCisjZGVmaW5lIGZvb3RocmVhZG1haW5sb29waGZvbworCisvKiAkSWQ6IHRocmVhZC1tYWlubG9vcC5oIDE5NzEgMjAwNy0xMC0yOCAxOToxMzo1MFogbGVubmFydCAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBQdWxzZUF1ZGlvIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9tYWlubG9vcC1hcGkuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFxwYWdlIHRocmVhZGVkX21haW5sb29wIFRocmVhZGVkIE1haW4gTG9vcAorICoKKyAqIFxzZWN0aW9uIG92ZXJ2X3NlYyBPdmVydmlldworICoKKyAqIFRoZSB0aHJlYWRlZCBtYWluIGxvb3AgaW1wbGVtZW50YXRpb24gaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHByaW1hcnkKKyAqIG1haW4gbG9vcCBpbXBsZW1lbnRhdGlvbiAoc2VlIFxyZWYgbWFpbmxvb3ApLiBGb3IgdGhlIGJhc2ljIGRlc2lnbiwgc2VlCisgKiBpdHMgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBUaGUgYWRkZWQgZmVhdHVyZSBpbiB0aGUgdGhyZWFkZWQgbWFpbiBsb29wIGlzIHRoYXQgaXQgc3Bhd25zIGEgbmV3IHRocmVhZAorICogdGhhdCBydW5zIHRoZSByZWFsIG1haW4gbG9vcC4gVGhpcyBhbGxvd3MgYSBzeW5jaHJvbm91cyBhcHBsaWNhdGlvbiB0byB1c2UKKyAqIHRoZSBhc3luY2hyb25vdXMgQVBJIHdpdGhvdXQgcmlza2luZyB0byBzdGFsbCB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5LgorICoKKyAqIFxzZWN0aW9uIGNyZWF0X3NlYyBDcmVhdGlvbgorICoKKyAqIEEgcGFfdGhyZWFkZWRfbWFpbmxvb3Agb2JqZWN0IGlzIGNyZWF0ZWQgdXNpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3KCkuCisgKiBUaGlzIHdpbGwgb25seSBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgc3RydWN0dXJlcyB0aG91Z2gsIHNvIHRvIHVzZSBpdCB0aGUKKyAqIHRocmVhZCBtdXN0IGFsc28gYmUgc3RhcnRlZC4gVGhpcyBpcyBkb25lIHRocm91Z2gKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0KCksIGFmdGVyIHdoaWNoIHlvdSBjYW4gc3RhcnQgdXNpbmcgdGhlIG1haW4gbG9vcC4KKyAqCisgKiBcc2VjdGlvbiBkZXN0cl9zZWMgRGVzdHJ1Y3Rpb24KKyAqCisgKiBXaGVuIHRoZSBQdWxzZUF1ZGlvIGNvbm5lY3Rpb24gaGFzIGJlZW4gdGVybWluYXRlZCwgdGhlIHRocmVhZCBtdXN0IGJlCisgKiBzdG9wcGVkIGFuZCB0aGUgcmVzb3VyY2VzIGZyZWVkLiBTdG9wcGluZyB0aGUgdGhyZWFkIGlzIGRvbmUgdXNpbmcKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AoKSwgd2hpY2ggbXVzdCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgbG9jayAoc2VlCisgKiBiZWxvdykgaGVsZC4gV2hlbiB0aGF0IGZ1bmN0aW9uIHJldHVybnMsIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCBhbmQgdGhlCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcCBvYmplY3QgY2FuIGJlIGZyZWVkIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUoKS4KKyAqCisgKiBcc2VjdGlvbiBsb2NrX3NlYyBMb2NraW5nCisgKgorICogU2luY2UgdGhlIFB1bHNlQXVkaW8gQVBJIGRvZXNuJ3QgYWxsb3cgY29uY3VycmVudCBhY2Nlc3NlcyB0byBvYmplY3RzLAorICogYSBsb2NraW5nIHNjaGVtZSBtdXN0IGJlIHVzZWQgdG8gZ3VhcmFudGVlIHNhZmUgdXNhZ2UuIFRoZSB0aHJlYWRlZCBtYWluCisgKiBsb29wIEFQSSBwcm92aWRlcyBzdWNoIGEgc2NoZW1lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucworICogcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpIGFuZCBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2soKS4KKyAqCisgKiBUaGUgbG9jayBpcyByZWN1cnNpdmUsIHNvIGl0J3Mgc2FmZSB0byB1c2UgaXQgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUgc2FtZQorICogdGhyZWFkLiBKdXN0IG1ha2Ugc3VyZSB5b3UgY2FsbCBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2soKSB0aGUgc2FtZQorICogbnVtYmVyIG9mIHRpbWVzIHlvdSBjYWxsZWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpLgorICoKKyAqIFRoZSBsb2NrIG5lZWRzIHRvIGJlIGhlbGQgd2hlbmV2ZXIgeW91IGNhbGwgYW55IFB1bHNlQXVkaW8gZnVuY3Rpb24gdGhhdAorICogdXNlcyBhbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFpbiBsb29wLiBNYWtlIHN1cmUgeW91IGRvIG5vdCBob2xkCisgKiBvbiB0byB0aGUgbG9jayBtb3JlIHRoYW4gbmVjZXNzYXJ5IHRob3VnaCwgYXMgdGhlIHRocmVhZGVkIG1haW4gbG9vcCBzdG9wcworICogd2hpbGUgdGhlIGxvY2sgaXMgaGVsZC4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqIFxjb2RlCisgKiB2b2lkIG15X2NoZWNrX3N0cmVhbV9mdW5jKHBhX3RocmVhZGVkX21haW5sb29wICptLCBwYV9zdHJlYW0gKnMpIHsKKyAqICAgICBwYV9zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhtKTsKKyAqCisgKiAgICAgc3RhdGUgPSBwYV9zdHJlYW1fZ2V0X3N0YXRlKHMpOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sobSk7CisgKgorICogICAgIGlmIChzdGF0ZSA9PSBQQV9TVFJFQU1fUkVBRFkpCisgKiAgICAgICAgIHByaW50ZigiU3RyZWFtIGlzIHJlYWR5ISIpOworICogICAgIGVsc2UKKyAqICAgICAgICAgcHJpbnRmKCJTdHJlYW0gaXMgbm90IHJlYWR5ISIpOworICogfQorICogXGVuZGNvZGUKKyAqCisgKiBcc2VjdGlvbiBjYl9zZWMgQ2FsbGJhY2tzCisgKgorICogQ2FsbGJhY2tzIGluIFB1bHNlQXVkaW8gYXJlIGFzeW5jaHJvbm91cywgc28gdGhleSByZXF1aXJlIGV4dHJhIGNhcmUgd2hlbgorICogdXNpbmcgdGhlbSB0b2dldGhlciB3aXRoIGEgdGhyZWFkZWQgbWFpbiBsb29wLgorICoKKyAqIFRoZSBlYXNpZXN0IHdheSB0byB0dXJuIHRoZSBjYWxsYmFjayBiYXNlZCBvcGVyYXRpb25zIGludG8gc3luY2hyb25vdXMKKyAqIG9uZXMsIGlzIHRvIHNpbXBseSB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFuZCBjb250aW51ZSBmcm9tCisgKiB0aGVyZS4gVGhpcyBpcyB0aGUgYXBwcm9hY2ggY2hvc2VuIGluIFB1bHNlQXVkaW8ncyB0aHJlYWRlZCBBUEkuCisgKgorICogXHN1YnNlY3Rpb24gYmFzaWNfc3Vic2VjIEJhc2ljIGNhbGxiYWNrcworICoKKyAqIEZvciB0aGUgYmFzaWMgY2FzZSwgd2hlcmUgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdG8gd2FpdCBmb3IgdGhlIGNhbGxiYWNrCisgKiB0byBiZSBpbnZva2VkLCB0aGUgY29kZSBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorICoKKyAqIEV4YW1wbGU6CisgKgorICogXGNvZGUKKyAqIHN0YXRpYyB2b2lkIG15X2RyYWluX2NhbGxiYWNrKHBhX3N0cmVhbSpzLCBpbnQgc3VjY2Vzcywgdm9pZCAqdXNlcmRhdGEpIHsKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcCAqbTsKKyAqCisgKiAgICAgbSA9IChwYV90aHJlYWRlZF9tYWlubG9vcCopdXNlcmRhdGE7CisgKiAgICAgYXNzZXJ0KG0pOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwobSwgMCk7CisgKiB9CisgKgorICogdm9pZCBteV9kcmFpbl9zdHJlYW1fZnVuYyhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSwgcGFfc3RyZWFtICpzKSB7CisgKiAgICAgcGFfb3BlcmF0aW9uICpvOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKG0pOworICoKKyAqICAgICBvID0gcGFfc3RyZWFtX2RyYWluKHMsIG15X2RyYWluX2NhbGxiYWNrLCBtKTsKKyAqICAgICBhc3NlcnQobyk7CisgKgorICogICAgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlKG8pICE9IE9QRVJBVElPTl9ET05FKQorICogICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KG0pOworICoKKyAqICAgICBwYV9vcGVyYXRpb25fdW5yZWYobyk7CisgKgorICogICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhtKTsKKyAqIH0KKyAqIFxlbmRjb2RlCisgKgorICogVGhlIG1haW4gZnVuY3Rpb24sIG15X2RyYWluX3N0cmVhbV9mdW5jKCksIHdpbGwgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvCisgKiBiZSBjYWxsZWQgdXNpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCgpLgorICoKKyAqIElmIHlvdXIgYXBwbGljYXRpb24gaXMgbXVsdGktdGhyZWFkZWQsIHRoZW4gdGhpcyB3YWl0aW5nIG11c3QgYmUgZG9uZQorICogaW5zaWRlIGEgd2hpbGUgbG9vcC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IG11bHRpcGxlIHRocmVhZHMgbWlnaHQgYmUKKyAqIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQoKSBhdCB0aGUgc2FtZSB0aW1lLiBFYWNoIHRocmVhZCBtdXN0CisgKiB0aGVyZWZvcmUgdmVyaWZ5IHRoYXQgaXQgd2FzIGl0cyBjYWxsYmFjayB0aGF0IHdhcyBpbnZva2VkLgorICoKKyAqIFRoZSBjYWxsYmFjaywgbXlfZHJhaW5fY2FsbGJhY2soKSwgaW5kaWNhdGVzIHRvIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgaXQKKyAqIGhhcyBiZWVuIGNhbGxlZCB1c2luZyBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKS4KKyAqCisgKiBBcyB5b3UgY2FuIHNlZSwgYm90aCBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkgbWF5IG9ubHkgYmUgY2FsbGVkIHdpdGgKKyAqIHRoZSBsb2NrIGhlbGQuIFRoZSBzYW1lIHRoaW5nIGlzIHRydWUgZm9yIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpLAorICogYnV0IGFzIHRoZSBsb2NrIGlzIGhlbGQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLCB5b3UgZG8gbm90IGhhdmUgdG8KKyAqIGRlYWwgd2l0aCB0aGF0LgorICoKKyAqIFRoZSBmdW5jdGlvbnMgd2lsbCBub3QgZGVhZCBsb2NrIGJlY2F1c2UgdGhlIHdhaXQgZnVuY3Rpb24gd2lsbCByZWxlYXNlCisgKiB0aGUgbG9jayBiZWZvcmUgd2FpdGluZyBhbmQgdGhlbiByZWdyYWIgaXQgb25jZSBpdCBoYXMgYmVlbiBzaWduYWxlZC4KKyAqIEZvciB0aG9zZSBvZiB5b3UgZmFtaWxpYXIgd2l0aCB0aHJlYWRzLCB0aGUgYmVoYXZpb3VyIGlzIHRoYXQgb2YgYQorICogY29uZGl0aW9uIHZhcmlhYmxlLgorICoKKyAqIFxzdWJzZWN0aW9uIGRhdGFfc3Vic2VjIERhdGEgY2FsbGJhY2tzCisgKgorICogRm9yIG1hbnkgY2FsbGJhY2tzLCBzaW1wbHkga25vd2luZyB0aGF0IHRoZXkgaGF2ZSBiZWVuIGNhbGxlZCBpcworICogaW5zdWZmaWNpZW50LiBUaGUgY2FsbGJhY2sgYWxzbyByZWNlaXZlcyBzb21lIGRhdGEgdGhhdCBpcyBkZXNpcmVkLiBUbworICogYWNjZXNzIHRoaXMgZGF0YSBzYWZlbHksIHdlIG11c3QgZXh0ZW5kIG91ciBleGFtcGxlIGEgYml0OgorICoKKyAqIFxjb2RlCisgKiBzdGF0aWMgaW50ICpkcmFpbl9yZXN1bHQ7CisgKgorICogc3RhdGljIHZvaWQgbXlfZHJhaW5fY2FsbGJhY2socGFfc3RyZWFtKnMsIGludCBzdWNjZXNzLCB2b2lkICp1c2VyZGF0YSkgeworICogICAgIHBhX3RocmVhZGVkX21haW5sb29wICptOworICoKKyAqICAgICBtID0gKHBhX3RocmVhZGVkX21haW5sb29wKil1c2VyZGF0YTsKKyAqICAgICBhc3NlcnQobSk7CisgKgorICogICAgIGRyYWluX3Jlc3VsdCA9ICZzdWNjZXNzOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwobSwgMSk7CisgKiB9CisgKgorICogdm9pZCBteV9kcmFpbl9zdHJlYW1fZnVuYyhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSwgcGFfc3RyZWFtICpzKSB7CisgKiAgICAgcGFfb3BlcmF0aW9uICpvOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKG0pOworICoKKyAqICAgICBvID0gcGFfc3RyZWFtX2RyYWluKHMsIG15X2RyYWluX2NhbGxiYWNrLCBtKTsKKyAqICAgICBhc3NlcnQobyk7CisgKgorICogICAgIHdoaWxlIChwYV9vcGVyYXRpb25fZ2V0X3N0YXRlKG8pICE9IE9QRVJBVElPTl9ET05FKQorICogICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KG0pOworICoKKyAqICAgICBwYV9vcGVyYXRpb25fdW5yZWYobyk7CisgKgorICogICAgIGlmICgqZHJhaW5fcmVzdWx0KQorICogICAgICAgICBwcmludGYoIlN1Y2Nlc3MhIik7CisgKiAgICAgZWxzZQorICogICAgICAgICBwcmludGYoIkJpdHRlciBkZWZlYXQuLi4iKTsKKyAqCisgKiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KG0pOworICoKKyAqICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sobSk7CisgKiB9CisgKiBcZW5kY29kZQorICoKKyAqIFRoZSBleGFtcGxlIGlzIGEgYml0IHNpbGx5IGFzIGl0IHdvdWxkIHByb2JhYmx5IGhhdmUgYmVlbiBlYXNpZXIgdG8ganVzdAorICogY29weSB0aGUgY29udGVudHMgb2Ygc3VjY2VzcywgYnV0IGZvciBsYXJnZXIgZGF0YSBzdHJ1Y3R1cmVzIHRoaXMgY2FuIGJlCisgKiB3YXN0ZWZ1bC4KKyAqCisgKiBUaGUgZGlmZmVyZW5jZSBoZXJlIGNvbXBhcmVkIHRvIHRoZSBiYXNpYyBjYWxsYmFjayBpcyB0aGUgMSBzZW50IHRvCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwoKSBhbmQgdGhlIGNhbGwgdG8KKyAqIHBhX3RocmVhZGVkX21haW5sb29wX2FjY2VwdCgpLiBXaGF0IHdpbGwgaGFwcGVuIGlzIHRoYXQKKyAqIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpIHdpbGwgc2lnbmFsIHRoZSBtYWluIGZ1bmN0aW9uIGFuZCB0aGVuIHN0b3AuCisgKiBUaGUgbWFpbiBmdW5jdGlvbiBpcyB0aGVuIGZyZWUgdG8gdXNlIHRoZSBkYXRhIGluIHRoZSBjYWxsYmFjayB1bnRpbAorICogcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KCkgaXMgY2FsbGVkLCB3aGljaCB3aWxsIGFsbG93IHRoZSBjYWxsYmFjaworICogdG8gY29udGludWUuCisgKgorICogTm90ZSB0aGF0IHBhX3RocmVhZGVkX21haW5sb29wX2FjY2VwdCgpIG11c3QgYmUgY2FsbGVkIHNvbWUgdGltZSBiZXR3ZWVuCisgKiBleGl0aW5nIHRoZSB3aGlsZSBsb29wIGFuZCB1bmxvY2tpbmcgdGhlIG1haW4gbG9vcCEgRmFpbHVyZSB0byBkbyBzbyB3aWxsCisgKiByZXN1bHQgaW4gYSByYWNlIGNvbmRpdGlvbi4gSS5lLiBpdCBpcyBub3Qgb2sgdG8gcmVsZWFzZSB0aGUgbG9jayBhbmQKKyAqIHJlZ3JhYiBpdCBiZWZvcmUgY2FsbGluZyBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQoKS4KKyAqCisgKiBcc3Vic2VjdGlvbiBhc3luY19zdWJzZWMgQXN5bmNocm9ub3VzIGNhbGxiYWNrcworICoKKyAqIFB1bHNlQXVkaW8gYWxzbyBoYXMgY2FsbGJhY2tzIHRoYXQgYXJlIGNvbXBsZXRlbHkgYXN5bmNocm9ub3VzLCBtZWFuaW5nCisgKiB0aGF0IHRoZXkgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZS4gVGhlIHRocmVhZGluZyBtYWluIGxvb3AgQVBJIHByb3ZpZGVzCisgKiB0aGUgbG9ja2luZyBtZWNoYW5pc20gdG8gaGFuZGxlIGNvbmN1cnJlbnQgYWNjZXNzZXMsIGJ1dCBub3RoaW5nIGVsc2UuCisgKiBBcHBsaWNhdGlvbnMgd2lsbCBoYXZlIHRvIGhhbmRsZSBjb21tdW5pY2F0aW9uIGZyb20gdGhlIGNhbGxiYWNrIHRvIHRoZQorICogbWFpbiBwcm9ncmFtIHRocm91Z2ggc29tZSBvd24gc3lzdGVtLgorICoKKyAqIFRoZSBjYWxsYmFja3MgdGhhdCBhcmUgY29tcGxldGVseSBhc3luY2hyb25vdXMgYXJlOgorICoKKyAqIFxsaSBTdGF0ZSBjYWxsYmFja3MgZm9yIGNvbnRleHRzLCBzdHJlYW1zLCBldGMuCisgKiBcbGkgU3Vic2NyaXB0aW9uIG5vdGlmaWNhdGlvbnMKKyAqLworCisvKiogXGZpbGUKKyAqCisgKiBBIHRocmVhZCBiYXNlZCBldmVudCBsb29wIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIHBhX21haW5sb29wLiBUaGUKKyAqIGV2ZW50IGxvb3AgaXMgcnVuIGluIGEgaGVscGVyIHRocmVhZCBpbiB0aGUgYmFja2dyb3VuZC4gQSBmZXcKKyAqIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzIGFyZSBhdmFpbGFibGUgdG8gYWNjZXNzIHRoZSBvYmplY3RzCisgKiBhdHRhY2hlZCB0byB0aGUgZXZlbnQgbG9vcCBzYWZlbHkuICovCisKKy8qKiBBbiBvcGFxdWUgdGhyZWFkZWQgbWFpbiBsb29wIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgcGFfdGhyZWFkZWRfbWFpbmxvb3AgcGFfdGhyZWFkZWRfbWFpbmxvb3A7CisKKy8qKiBBbGxvY2F0ZSBhIG5ldyB0aHJlYWRlZCBtYWluIGxvb3Agb2JqZWN0LiBZb3UgaGF2ZSB0byBjYWxsCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCgpIGJlZm9yZSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgc3RhcnRzCisgKiBydW5uaW5nLiAqLworcGFfdGhyZWFkZWRfbWFpbmxvb3AgKnBhX3RocmVhZGVkX21haW5sb29wX25ldyh2b2lkKTsKKworLyoqIEZyZWUgYSB0aHJlYWRlZCBtYWluIGxvb3Agb2JqZWN0LiBJZiB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgaXMKKyAqIHN0aWxsIHJ1bm5pbmcsIGl0IGlzIHRlcm1pbmF0ZWQgdXNpbmcgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RvcCgpCisgKiBmaXJzdC4gKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShwYV90aHJlYWRlZF9tYWlubG9vcCogbSk7CisKKy8qKiBTdGFydCB0aGUgZXZlbnQgbG9vcCB0aHJlYWQuICovCitpbnQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCisvKiogVGVybWluYXRlIHRoZSBldmVudCBsb29wIHRocmVhZCBjbGVhbmx5LiBNYWtlIHN1cmUgdG8gdW5sb2NrIHRoZQorICogbWFpbmxvb3Agb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOworCisvKiogTG9jayB0aGUgZXZlbnQgbG9vcCBvYmplY3QsIGVmZmVjdGl2ZWx5IGJsb2NraW5nIHRoZSBldmVudCBsb29wCisgKiB0aHJlYWQgZnJvbSBwcm9jZXNzaW5nIGV2ZW50cy4gWW91IGNhbiB1c2UgdGhpcyB0byBlbmZvcmNlCisgKiBleGNsdXNpdmUgYWNjZXNzIHRvIGFsbCBvYmplY3RzIGF0dGFjaGVkIHRvIHRoZSBldmVudCBsb29wLiBUaGlzCisgKiBsb2NrIGlzIHJlY3Vyc2l2ZS4gVGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIGNhbGxlZCBpbnNpZGUgdGhlIGV2ZW50CisgKiBsb29wIHRocmVhZC4gRXZlbnRzIHRoYXQgYXJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQKKyAqIGFyZSBleGVjdXRlZCB3aXRoIHRoaXMgbG9jayBoZWxkLiAqLwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFVubG9jayB0aGUgZXZlbnQgbG9vcCBvYmplY3QsIGludmVyc2Ugb2YgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jaygpICovCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBXYWl0IGZvciBhbiBldmVudCB0byBiZSBzaWduYWxsZWQgYnkgdGhlIGV2ZW50IGxvb3AgdGhyZWFkLiBZb3UKKyAqIGNhbiB1c2UgdGhpcyB0byBwYXNzIGRhdGEgZnJvbSB0aGUgZXZlbnQgbG9vcCB0aHJlYWQgdG8gdGhlIG1haW4KKyAqIHRocmVhZCBpbiBzeW5jaHJvbml6ZWQgZmFzaGlvbi4gVGhpcyBmdW5jdGlvbiBtYXkgbm90IGJlIGNhbGxlZAorICogaW5zaWRlIHRoZSBldmVudCBsb29wIHRocmVhZC4gUHJpb3IgdG8gdGhpcyBjYWxsIHRoZSBldmVudCBsb29wCisgKiBvYmplY3QgbmVlZHMgdG8gYmUgbG9ja2VkIHVzaW5nIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2soKS4gV2hpbGUKKyAqIHdhaXRpbmcgdGhlIGxvY2sgd2lsbCBiZSByZWxlYXNlZCwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHVybmluZyBpdAorICogd2lsbCBiZSBhY3F1aXJlZCBhZ2Fpbi4gKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKKy8qKiBTaWduYWwgYWxsIHRocmVhZHMgd2FpdGluZyBmb3IgYSBzaWduYWxsaW5nIGV2ZW50IGluCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KCkuIElmIHdhaXRfZm9yX3JlbGVhc2UgaXMgbm9uLXplcm8sIGRvCisgKiBub3QgcmV0dXJuIGJlZm9yZSB0aGUgc2lnbmFsIHdhcyBhY2NlcHRlZCBieSBhCisgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9hY2NlcHQoKSBjYWxsLiBXaGlsZSB3YWl0aW5nIGZvciB0aGF0IGNvbmRpdGlvbgorICogdGhlIGV2ZW50IGxvb3Agb2JqZWN0IGlzIHVubG9ja2VkLiAqLwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0sIGludCB3YWl0X2Zvcl9hY2NlcHQpOworCisvKiogQWNjZXB0IGEgc2lnbmFsIGZyb20gdGhlIGV2ZW50IHRocmVhZCBpc3N1ZWQgd2l0aAorICogcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKCkuIFRoaXMgY2FsbCBzaG91bGQgb25seSBiZSB1c2VkIGluCisgKiBjb25qdW5jdGlvbiB3aXRoIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbCgpIHdpdGggYSBub24temVybworICogd2FpdF9mb3JfYWNjZXB0IHZhbHVlLiAgKi8KK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfYWNjZXB0KHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFJldHVybiB0aGUgcmV0dXJuIHZhbHVlIGFzIHNwZWNpZmllZCB3aXRoIHRoZSBtYWluIGxvb3AncyBxdWl0KCkgcm91dGluZS4gKi8KK2ludCBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfcmV0dmFsKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKKworLyoqIFJldHVybiB0aGUgYWJzdHJhY3QgbWFpbiBsb29wIGFic3RyYWN0aW9uIGxheWVyIHZ0YWJsZSBmb3IgdGhpcyBtYWluIGxvb3AuICovCitwYV9tYWlubG9vcF9hcGkqIHBhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkocGFfdGhyZWFkZWRfbWFpbmxvb3AqbSk7CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIHdoZW4gY2FsbGVkIGZyb20gd2l0aGluZyB0aGUgZXZlbnQgbG9vcCB0aHJlYWQuIFxzaW5jZSAwLjkuNyAqLworaW50IHBhX3RocmVhZGVkX21haW5sb29wX2luX3RocmVhZChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3RpbWV2YWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdGltZXZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGI5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3RpbWV2YWwuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIGZvb3RpbWV2YWxoZm9vCisjZGVmaW5lIGZvb3RpbWV2YWxoZm9vCisKKy8qICRJZDogdGltZXZhbC5oIDE5NzEgMjAwNy0xMC0yOCAxOToxMzo1MFogbGVubmFydCAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHB1bHNlL2NkZWNsLmg+CisjaW5jbHVkZSA8cHVsc2Uvc2FtcGxlLmg+CisKKy8qKiBcZmlsZQorICogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHRpbWV2YWwgY2FsY3VsYXRpb25zICovCisKK1BBX0NfREVDTF9CRUdJTgorCisjZGVmaW5lIFBBX01TRUNfUEVSX1NFQyAxMDAwCisjZGVmaW5lIFBBX1VTRUNfUEVSX1NFQyAxMDAwMDAwCisjZGVmaW5lIFBBX05TRUNfUEVSX1NFQyAxMDAwMDAwMDAwCisjZGVmaW5lIFBBX1VTRUNfUEVSX01TRUMgMTAwMAorCitzdHJ1Y3QgdGltZXZhbDsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCB0aW1lc3RhbXAsIGp1c3QgbGlrZSBVTklYIGdldHRpbWVvZmRheSgpICovCitzdHJ1Y3QgdGltZXZhbCAqcGFfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dik7CisKKy8qKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCB0aW1ldmFsCisgKiBzdHJ1Y3RzLiAqLworcGFfdXNlY190IHBhX3RpbWV2YWxfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCAqYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKmIpIFBBX0dDQ19QVVJFOworCisvKiogQ29tcGFyZSB0aGUgdHdvIHRpbWV2YWwgc3RydWN0cyBhbmQgcmV0dXJuIDAgd2hlbiBlcXVhbCwgbmVnYXRpdmUgd2hlbiBhIDwgYiwgcG9zaXRpdmUgb3RoZXJ3c2UgKi8KK2ludCBwYV90aW1ldmFsX2NtcChjb25zdCBzdHJ1Y3QgdGltZXZhbCAqYSwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKmIpIFBBX0dDQ19QVVJFOworCisvKiogUmV0dXJuIHRoZSB0aW1lIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wICovCitwYV91c2VjX3QgcGFfdGltZXZhbF9hZ2UoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2KTsKKworLyoqIEFkZCB0aGUgc3BlY2lmaWVkIHRpbWUgaW5taWNyb3NlY29uZHMgdG8gdGhlIHNwZWNpZmllZCB0aW1ldmFsIHN0cnVjdHVyZSAqLworc3RydWN0IHRpbWV2YWwqIHBhX3RpbWV2YWxfYWRkKHN0cnVjdCB0aW1ldmFsICp0diwgcGFfdXNlY190IHYpIFBBX0dDQ19QVVJFOworCisvKiogU3RvcmUgdGhlIHNwZWNpZmllZCB1ZWMgdmFsdWUgaW4gdGhlIHRpbWV2YWwgc3RydWN0LiBcc2luY2UgMC45LjcgKi8KK3N0cnVjdCB0aW1ldmFsKiBwYV90aW1ldmFsX3N0b3JlKHN0cnVjdCB0aW1ldmFsICp0diwgcGFfdXNlY190IHYpOworCisvKiogTG9hZCB0aGUgc3BlY2lmaWVkIHR2IHZhbHVlIGFuZCByZXR1cm4gaXQgaW4gdXNlYy4gXHNpbmNlIDAuOS43ICovCitwYV91c2VjX3QgcGFfdGltZXZhbF9sb2FkKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0ZjguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRmOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzk4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0ZjguaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIGZvb3V0ZjhoZm9vCisjZGVmaW5lIGZvb3V0ZjhoZm9vCisKKy8qICRJZDogdXRmOC5oIDE5NzEgMjAwNy0xMC0yOCAxOToxMzo1MFogbGVubmFydCAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAgQ29weXJpZ2h0IDIwMDYgUGllcnJlIE9zc21hbiA8b3NzbWFuQGNlbmRpby5zZT4gZm9yIENlbmRpbyBBQgorCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQorICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFB1bHNlQXVkaW8gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgTGljZW5zZSBhbG9uZyB3aXRoIFB1bHNlQXVkaW87IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICBVU0EuCisqKiovCisKKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorCisvKiogXGZpbGUKKyAqIFVURjggVmFsaWRhdGlvbiBmdW5jdGlvbnMKKyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFRlc3QgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHF1YWxpZmllcyBhcyB2YWxpZCBVVEY4LiBSZXR1cm4gdGhlIHN0cmluZyBpZiBzbywgb3RoZXJ3aXNlIE5VTEwgKi8KK2NoYXIgKnBhX3V0ZjhfdmFsaWQoY29uc3QgY2hhciAqc3RyKSBQQV9HQ0NfUFVSRTsKKworLyoqIEZpbHRlciBhbGwgaW52YWxpZCBVVEY4IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmV0dXJuaW5nIGEgbmV3IGZ1bGx5IFVURjggdmFsaWQgc3RyaW5nLiBEb24ndCBmb3JnZXQgdG8gZnJlZSB0aGUgcmV0dXJuZWQgc3RyaW5nIHdpdGggcGFfeGZyZWUoKSAqLworY2hhciAqcGFfdXRmOF9maWx0ZXIoY29uc3QgY2hhciAqc3RyKTsKKworLyoqIENvbnZlcnQgYSBVVEYtOCBzdHJpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLiBGcmVlIHRoZSBzdHJpbmcgdXNpbmcgcGFfeGZyZWUoKS4gKi8KK2NoYXIqIHBhX3V0ZjhfdG9fbG9jYWxlIChjb25zdCBjaGFyICpzdHIpOworCisvKiogQ29udmVydCBhIHN0cmluZyBpbiB0aGUgY3VycmVudCBsb2NhbGUgdG8gVVRGLTguIEZyZWUgdGhlIHN0cmluZyB1c2luZyBwYV94ZnJlZSgpLiAqLworY2hhciogcGFfbG9jYWxlX3RvX3V0ZjggKGNvbnN0IGNoYXIgKnN0cik7CisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0aWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YWViOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3V0aWwuaApAQCAtMCwwICsxLDYyIEBACisjaWZuZGVmIGZvb3V0aWxoZm9vCisjZGVmaW5lIGZvb3V0aWxoZm9vCisKKy8qICRJZDogdXRpbC5oIDE5NzEgMjAwNy0xMC0yOCAxOToxMzo1MFogbGVubmFydCAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisKKyAgUHVsc2VBdWRpbyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlCisgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxmaWxlCisgKiBBc3NvcnRlZCB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCitQQV9DX0RFQ0xfQkVHSU4KKworLyoqIFJldHVybiB0aGUgY3VycmVudCB1c2VybmFtZSBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuICovCitjaGFyICpwYV9nZXRfdXNlcl9uYW1lKGNoYXIgKnMsIHNpemVfdCBsKTsKKworLyoqIFJldHVybiB0aGUgY3VycmVudCBob3N0bmFtZSBpbiB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gKi8KK2NoYXIgKnBhX2dldF9ob3N0X25hbWUoY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgaW4gcyAqLworY2hhciAqcGFfZ2V0X2ZxZG4oY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyICovCitjaGFyICpwYV9nZXRfaG9tZV9kaXIoY2hhciAqcywgc2l6ZV90IGwpOworCisvKiogUmV0dXJuIHRoZSBiaW5hcnkgZmlsZSBuYW1lIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuIFRoaXMgaXMgbm90CisgKiBzdXBwb3J0ZWQgb24gYWxsIGFyY2hpdGVjdHVyZXMsIGluIHdoaWNoIGNhc2UgTlVMTCBpcyByZXR1cm5lZC4gKi8KK2NoYXIgKnBhX2dldF9iaW5hcnlfbmFtZShjaGFyICpzLCBzaXplX3QgbCk7CisKKy8qKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaWxlbmFtZSBpbnNpZGUgYSBwYXRoICh3aGljaCBpcyB0aGUgbGFzdAorICogY29tcG9uZW50KS4gKi8KK2NoYXIgKnBhX3BhdGhfZ2V0X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnApOworCisvKiogV2FpdCB0IG1pbGxpc2Vjb25kcyAqLworaW50IHBhX21zbGVlcCh1bnNpZ25lZCBsb25nIHQpOworCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS92ZXJzaW9uLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGVhYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS92ZXJzaW9uLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBmb292ZXJzaW9uaGZvbyAvKi0qLUMtKi0qLworI2RlZmluZSBmb292ZXJzaW9uaGZvbworCisvKiAkSWQ6IHZlcnNpb24uaC5pbiAxNDI2IDIwMDctMDItMTMgMTU6MzU6MTlaIG9zc21hbiAkICovCisKKy8qKioKKyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgUHVsc2VBdWRpby4KKworICBDb3B5cmlnaHQgMjAwNC0yMDA2IExlbm5hcnQgUG9ldHRlcmluZworICBDb3B5cmlnaHQgMjAwNiBQaWVycmUgT3NzbWFuIDxvc3NtYW5AY2VuZGlvLnNlPiBmb3IgQ2VuZGlvIEFCCisgCisgIFB1bHNlQXVkaW8gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggUHVsc2VBdWRpbzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3CisgIFVTQS4KKyoqKi8KKworLyogV0FSTklORzogTWFrZSBzdXJlIHRvIGVkaXQgdGhlIHJlYWwgc291cmNlIGZpbGUgdmVyc2lvbi5oLmluISAqLworCisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxmaWxlCisgKiBEZWZpbmUgaGVhZGVyIHZlcnNpb24gKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlcy4gS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBpcworYSBtYWNybyBhbmQgbm90IGEgZnVuY3Rpb24sIHNvIGl0IGlzIGltcG9zc2libGUgdG8gZ2V0IHRoZSBwb2ludGVyIG9mCitpdC4gKi8KKyNkZWZpbmUgcGFfZ2V0X2hlYWRlcnNfdmVyc2lvbigpICgiMC45LjEwIikKKworLyoqIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBpcyBsaW5rZWQgdG8uICovCitjb25zdCBjaGFyKiBwYV9nZXRfbGlicmFyeV92ZXJzaW9uKHZvaWQpOworCisvKiogVGhlIGN1cnJlbnQgQVBJIHZlcnNpb24uIFZlcnNpb24gNiByZWxhdGVzIHRvIFBvbHlwYXVkaW8KKyAqIDAuNi4gUHJpb3IgdmVyc2lvbnMgKGkuZS4gUG9seXBhdWRpbyAwLjUuMSBhbmQgb2xkZXIpIGhhdmUKKyAqIFBBX0FQSV9WRVJTSU9OIHVuZGVmaW5lZC4gICovCisjZGVmaW5lIFBBX0FQSV9WRVJTSU9OIDExCisKKy8qKiBUaGUgY3VycmVudCBwcm90b2NvbCB2ZXJzaW9uLiBWZXJzaW9uIDggcmVsYXRlcyB0byBQb2x5cGF1ZGlvIDAuOC9QdWxzZUF1ZGlvIDAuOS4KKyAqIFxzaW5jZSAwLjggKi8KKyNkZWZpbmUgUEFfUFJPVE9DT0xfVkVSU0lPTiAxMgorCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wdWxzZS92b2x1bWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvdm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NTc4NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2Uvdm9sdW1lLmgKQEAgLTAsMCArMSwxNzUgQEAKKyNpZm5kZWYgZm9vdm9sdW1laGZvbworI2RlZmluZSBmb292b2x1bWVoZm9vCisKKy8qICRJZDogdm9sdW1lLmggMTk3MSAyMDA3LTEwLTI4IDE5OjEzOjUwWiBsZW5uYXJ0ICQgKi8KKworLyoqKgorICBUaGlzIGZpbGUgaXMgcGFydCBvZiBQdWxzZUF1ZGlvLgorCisgIENvcHlyaWdodCAyMDA0LTIwMDYgTGVubmFydCBQb2V0dGVyaW5nCisgIENvcHlyaWdodCAyMDA2IFBpZXJyZSBPc3NtYW4gPG9zc21hbkBjZW5kaW8uc2U+IGZvciBDZW5kaW8gQUIKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdWxzZS9jZGVjbC5oPgorI2luY2x1ZGUgPHB1bHNlL3NhbXBsZS5oPgorCisvKiogXHBhZ2Ugdm9sdW1lIFZvbHVtZSBDb250cm9sCisgKgorICogXHNlY3Rpb24gb3ZlcnZfc2VjIE92ZXJ2aWV3CisgKgorICogU2lua3MsIHNvdXJjZXMsIHNpbmsgaW5wdXRzIGFuZCBzYW1wbGVzIGNhbiBhbGwgaGF2ZSB0aGVpciBvd24gdm9sdW1lcy4KKyAqIFRvIGRlYWwgd2l0aCB0aGVzZSwgVGhlIFB1bHNlQXVkaW8gbGlicmF5IGNvbnRhaW5zIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucworICogdGhhdCBlYXNlIGhhbmRsaW5nLgorICoKKyAqIFRoZSBiYXNpYyB2b2x1bWUgdHlwZSBpbiBQdWxzZUF1ZGlvIGlzIHRoZSBccmVmIHBhX3ZvbHVtZV90IHR5cGUuIE1vc3Qgb2YKKyAqIHRoZSB0aW1lLCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgdGhlIGFnZ3JlZ2F0ZWQgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUgdGhhdAorICogY2FuIHN0b3JlIHRoZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzIGF0IG9uY2UuCisgKgorICogVm9sdW1lcyBjb21tb25seSBzcGFuIGJldHdlZW4gbXV0ZWQgKDAlKSwgYW5kIG5vcm1hbCAoMTAwJSkuIEl0IGlzIHBvc3NpYmxlCisgKiB0byBzZXQgdm9sdW1lcyB0byBoaWdoZXIgdGhhbiAxMDAlLCBidXQgY2xpcHBpbmcgbWlnaHQgb2NjdXIuCisgKgorICogXHNlY3Rpb24gY2FsY19zZWMgQ2FsY3VsYXRpb25zCisgKgorICogVGhlIHZvbHVtZXMgaW4gUHVsc2VBdWRpbyBhcmUgbG9nYXJpdGhtaWMgaW4gbmF0dXJlIGFuZCBhcHBsaWNhdGlvbnMKKyAqIHNob3VsZG4ndCBwZXJmb3JtIGNhbGN1bGF0aW9ucyB3aXRoIHRoZW0gZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkCisgKiBiZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gZWl0aGVyIGRCIG9yIGEgbGluZWFyIHNjYWxlOgorICoKKyAqIFxsaSBkQiAtIHBhX3N3X3ZvbHVtZV9mcm9tX2RCKCkgLyBwYV9zd192b2x1bWVfdG9fZEIoKQorICogXGxpIExpbmVhciAtIHBhX3N3X3ZvbHVtZV9mcm9tX2xpbmVhcigpIC8gcGFfc3dfdm9sdW1lX3RvX2xpbmVhcigpCisgKgorICogRm9yIHNpbXBsZSBtdWx0aXBsaWNhdGlvbiwgcGFfc3dfdm9sdW1lX211bHRpcGx5KCkgYW5kCisgKiBwYV9zd19jdm9sdW1lX211bHRpcGx5KCkgY2FuIGJlIHVzZWQuCisgKgorICogQ2FsY3VsYXRpb25zIGNhbiBvbmx5IGJlIHJlbGlhYmx5IHBlcmZvcm1lZCBvbiBzb2Z0d2FyZSB2b2x1bWVzCisgKiBhcyBpdCBpcyBjb21tb25seSB1bmtub3duIHdoYXQgc2NhbGUgaGFyZHdhcmUgdm9sdW1lcyByZWxhdGUgdG8uCisgKgorICogVGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQgYWJvdmUgYXJlIG9ubHkgdmFsaWQgd2hlbiB1c2VkIHdpdGgKKyAqIHNvZnR3YXJlIHZvbHVtZXMuIEhlbmNlIGl0IGlzIHVzdWFsbHkgYSBiZXR0ZXIgaWRlYSB0byB0cmVhdCBhbGwKKyAqIHZvbHVtZSB2YWx1ZXMgYXMgb3BhcXVlIHdpdGggYSByYW5nZSBmcm9tIFBBX1ZPTFVNRV9NVVRFICgwJSkgdG8KKyAqIFBBX1ZPTFVNRV9OT1JNICgxMDAlKSBhbmQgdG8gcmVmcmFpbiBmcm9tIGFueSBjYWxjdWxhdGlvbnMgd2l0aAorICogdGhlbS4KKyAqCisgKiBcc2VjdGlvbiBjb252X3NlYyBDb252ZW5pZW5jZSBGdW5jdGlvbnMKKyAqCisgKiBUbyBoYW5kbGUgdGhlIHBhX2N2b2x1bWUgc3RydWN0dXJlLCB0aGUgUHVsc2VBdWRpbyBsaWJyYXJ5IHByb3ZpZGVzIGEKKyAqIG51bWJlciBvZiBjb252ZW5pZW5jIGZ1bmN0aW9uczoKKyAqCisgKiBcbGkgcGFfY3ZvbHVtZV92YWxpZCgpIC0gVGVzdHMgaWYgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZSBpcyB2YWxpZC4KKyAqIFxsaSBwYV9jdm9sdW1lX2VxdWFsKCkgLSBUZXN0cyBpZiB0d28gcGFfY3ZvbHVtZSBzdHJ1Y3R1cmVzIGFyZSBpZGVudGljYWwuCisgKiBcbGkgcGFfY3ZvbHVtZV9jaGFubmVsc19lcXVhbF90bygpIC0gVGVzdHMgaWYgYWxsIGNoYW5uZWxzIG9mIGEgcGFfY3ZvbHVtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBoYXZlIGEgZ2l2ZW4gdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfaXNfbXV0ZWQoKSAtIFRlc3RzIGlmIGFsbCBjaGFubmVscyBvZiBhIHBhX2N2b2x1bWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgYXJlIG11dGVkLgorICogXGxpIHBhX2N2b2x1bWVfaXNfbm9ybSgpIC0gVGVzdHMgaWYgYWxsIGNoYW5uZWxzIG9mIGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdCBhIG5vcm1hbCB2b2x1bWUuCisgKiBcbGkgcGFfY3ZvbHVtZV9zZXQoKSAtIFNldCBhbGwgY2hhbm5lbHMgb2YgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZSB0byBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gdm9sdW1lLgorICogXGxpIHBhX2N2b2x1bWVfcmVzZXQoKSAtIFNldCBhbGwgY2hhbm5lbHMgb2YgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZSB0byBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIHZvbHVtZS4KKyAqIFxsaSBwYV9jdm9sdW1lX211dGUoKSAtIFNldCBhbGwgY2hhbm5lbHMgb2YgYSBwYV9jdm9sdW1lIHN0cnVjdHVyZSB0byBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlZCB2b2x1bWUuCisgKiBcbGkgcGFfY3ZvbHVtZV9hdmcoKSAtIFJldHVybiB0aGUgYXZlcmFnZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzLgorICogXGxpIHBhX2N2b2x1bWVfc25wcmludCgpIC0gUHJldHR5IHByaW50IGEgcGFfY3ZvbHVtZSBzdHJ1Y3R1cmUuCisgKi8KKworLyoqIFxmaWxlCisgKiBDb25zdGFudHMgYW5kIHJvdXRpbmVzIGZvciB2b2x1bWUgaGFuZGxpbmcgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBWb2x1bWUgc3BlY2lmaWNhdGlvbjoKKyAqICBQQV9WT0xVTUVfTVVURUQ6IHNpbGVuY2U7CisgKiA8IFBBX1ZPTFVNRV9OT1JNOiBkZWNyZWFzZWQgdm9sdW1lOworICogICBQQV9WT0xVTUVfTk9STTogbm9ybWFsIHZvbHVtZTsKKyAqID4gUEFfVk9MVU1FX05PUk06IGluY3JlYXNlZCB2b2x1bWUgKi8KK3R5cGVkZWYgdWludDMyX3QgcGFfdm9sdW1lX3Q7CisKKy8qKiBOb3JtYWwgdm9sdW1lICgxMDAlKSAqLworI2RlZmluZSBQQV9WT0xVTUVfTk9STSAoMHgxMDAwMCkKKworLyoqIE11dGVkIHZvbHVtZSAoMCUpICovCisjZGVmaW5lIFBBX1ZPTFVNRV9NVVRFRCAoMCkKKworLyoqIEEgc3RydWN0dXJlIGVuY2Fwc3VsYXRpbmcgYSBwZXItY2hhbm5lbCB2b2x1bWUgKi8KK3R5cGVkZWYgc3RydWN0IHBhX2N2b2x1bWUgeworICAgIHVpbnQ4X3QgY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBwYV92b2x1bWVfdCB2YWx1ZXNbUEFfQ0hBTk5FTFNfTUFYXTsgIC8qKjwgUGVyLWNoYW5uZWwgdm9sdW1lICAqLworfSBwYV9jdm9sdW1lOworCisvKiogUmV0dXJuIG5vbi16ZXJvIHdoZW4gKmEgPT0gKmIgKi8KK2ludCBwYV9jdm9sdW1lX2VxdWFsKGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2N2b2x1bWUgKmIpIFBBX0dDQ19QVVJFOworCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzIHRvIFBBX1ZPTFVNRV9OT1JNICovCisjZGVmaW5lIHBhX2N2b2x1bWVfcmVzZXQoYSwgbikgcGFfY3ZvbHVtZV9zZXQoKGEpLCAobiksIFBBX1ZPTFVNRV9OT1JNKQorCisvKiogU2V0IHRoZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzIHRvIFBBX1ZPTFVNRV9NVVRFRCAqLworI2RlZmluZSBwYV9jdm9sdW1lX211dGUoYSwgbikgcGFfY3ZvbHVtZV9zZXQoKGEpLCAobiksIFBBX1ZPTFVNRV9NVVRFRCkKKworLyoqIFNldCB0aGUgdm9sdW1lIG9mIGFsbCBjaGFubmVscyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciAqLworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9zZXQocGFfY3ZvbHVtZSAqYSwgdW5zaWduZWQgY2hhbm5lbHMsIHBhX3ZvbHVtZV90IHYpOworCisvKiogTWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkgcGFfY3ZvbHVtZV9zbnByaW50KCkgKi8KKyNkZWZpbmUgUEFfQ1ZPTFVNRV9TTlBSSU5UX01BWCA2NAorCisvKiogUHJldHR5IHByaW50IGEgdm9sdW1lIHN0cnVjdHVyZSAqLworY2hhciAqcGFfY3ZvbHVtZV9zbnByaW50KGNoYXIgKnMsIHNpemVfdCBsLCBjb25zdCBwYV9jdm9sdW1lICpjKTsKKworLyoqIFJldHVybiB0aGUgYXZlcmFnZSB2b2x1bWUgb2YgYWxsIGNoYW5uZWxzICovCitwYV92b2x1bWVfdCBwYV9jdm9sdW1lX2F2Zyhjb25zdCBwYV9jdm9sdW1lICphKSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBUUlVFIHdoZW4gdGhlIHBhc3NlZCBjdm9sdW1lIHN0cnVjdHVyZSBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlICovCitpbnQgcGFfY3ZvbHVtZV92YWxpZChjb25zdCBwYV9jdm9sdW1lICp2KSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiBub24temVybyBpZiB0aGUgdm9sdW1lIG9mIGFsbCBjaGFubmVscyBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlICovCitpbnQgcGFfY3ZvbHVtZV9jaGFubmVsc19lcXVhbF90byhjb25zdCBwYV9jdm9sdW1lICphLCBwYV92b2x1bWVfdCB2KSBQQV9HQ0NfUFVSRTsKKworLyoqIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQgdm9sdW1lIGhhcyBhbGwgY2hhbm5lbHMgbXV0ZWQgKi8KKyNkZWZpbmUgcGFfY3ZvbHVtZV9pc19tdXRlZChhKSBwYV9jdm9sdW1lX2NoYW5uZWxzX2VxdWFsX3RvKChhKSwgUEFfVk9MVU1FX01VVEVEKQorCisvKiogUmV0dXJuIDEgaWYgdGhlIHNwZWNpZmllZCB2b2x1bWUgaGFzIGFsbCBjaGFubmVscyBvbiBub3JtYWwgbGV2ZWwgKi8KKyNkZWZpbmUgcGFfY3ZvbHVtZV9pc19ub3JtKGEpIHBhX2N2b2x1bWVfY2hhbm5lbHNfZXF1YWxfdG8oKGEpLCBQQV9WT0xVTUVfTk9STSkKKworLyoqIE11bHRpcGx5IHR3byB2b2x1bWVzIHNwZWNpZmljYXRpb25zLCByZXR1cm4gdGhlIHJlc3VsdC4gVGhpcyB1c2VzIFBBX1ZPTFVNRV9OT1JNIGFzIG5ldXRyYWwgZWxlbWVudCBvZiBtdWx0aXBsaWNhdGlvbi4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISAqLworcGFfdm9sdW1lX3QgcGFfc3dfdm9sdW1lX211bHRpcGx5KHBhX3ZvbHVtZV90IGEsIHBhX3ZvbHVtZV90IGIpIFBBX0dDQ19DT05TVDsKKworLyoqIE11bHRpcGx5IHRvIHBlci1jaGFubmVsIHZvbHVtZXMgYW5kIHJldHVybiB0aGUgcmVzdWx0IGluICpkZXN0LiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhICovCitwYV9jdm9sdW1lICpwYV9zd19jdm9sdW1lX211bHRpcGx5KHBhX2N2b2x1bWUgKmRlc3QsIGNvbnN0IHBhX2N2b2x1bWUgKmEsIGNvbnN0IHBhX2N2b2x1bWUgKmIpIFBBX0dDQ19QVVJFOworCisvKiogQ29udmVydCBhIGRlY2liZWwgdmFsdWUgdG8gYSB2b2x1bWUuIFRoaXMgaXMgb25seSB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgXHNpbmNlIDAuNCAqLworcGFfdm9sdW1lX3QgcGFfc3dfdm9sdW1lX2Zyb21fZEIoZG91YmxlIGYpIFBBX0dDQ19DT05TVDsKKworLyoqIENvbnZlcnQgYSB2b2x1bWUgdG8gYSBkZWNpYmVsIHZhbHVlLiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNvZnR3YXJlIHZvbHVtZXMhIFxzaW5jZSAwLjQgKi8KK2RvdWJsZSBwYV9zd192b2x1bWVfdG9fZEIocGFfdm9sdW1lX3QgdikgUEFfR0NDX0NPTlNUOworCisvKiogQ29udmVydCBhIGxpbmVhciBmYWN0b3IgdG8gYSB2b2x1bWUuIFRoaXMgaXMgb25seSB2YWxpZCBmb3Igc29mdHdhcmUgdm9sdW1lcyEgXHNpbmNlIDAuOCAqLworcGFfdm9sdW1lX3QgcGFfc3dfdm9sdW1lX2Zyb21fbGluZWFyKGRvdWJsZSB2KSBQQV9HQ0NfQ09OU1Q7CisKKy8qKiBDb252ZXJ0IGEgdm9sdW1lIHRvIGEgbGluZWFyIGZhY3Rvci4gVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzb2Z0d2FyZSB2b2x1bWVzISBcc2luY2UgMC44ICovCitkb3VibGUgcGFfc3dfdm9sdW1lX3RvX2xpbmVhcihwYV92b2x1bWVfdCB2KSBQQV9HQ0NfQ09OU1Q7CisKKyNpZmRlZiBJTkZJTklUWQorI2RlZmluZSBQQV9ERUNJQkVMX01JTklORlRZICgtSU5GSU5JVFkpCisjZWxzZQorLyoqIFRoaXMgdmFsdWUgaXMgdXNlZCBhcyBtaW51cyBpbmZpbml0eSB3aGVuIHVzaW5nIHBhX3ZvbHVtZV97dG8sZnJvbX1fZEIoKS4gXHNpbmNlIDAuNCAqLworI2RlZmluZSBQQV9ERUNJQkVMX01JTklORlRZICgtMjAwKQorI2VuZGlmCisKK1BBX0NfREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3htYWxsb2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHVsc2UveG1hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWZlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3B1bHNlL3htYWxsb2MuaApAQCAtMCwwICsxLDg5IEBACisjaWZuZGVmIGZvb21lbW9yeWhmb28KKyNkZWZpbmUgZm9vbWVtb3J5aGZvbworCisvKiAkSWQ6IHhtYWxsb2MuaCAxOTcxIDIwMDctMTAtMjggMTk6MTM6NTBaIGxlbm5hcnQgJCAqLworCisvKioqCisgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFB1bHNlQXVkaW8uCisKKyAgQ29weXJpZ2h0IDIwMDQtMjAwNiBMZW5uYXJ0IFBvZXR0ZXJpbmcKKworICBQdWxzZUF1ZGlvIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgUHVsc2VBdWRpbyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCBQdWxzZUF1ZGlvOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAgVVNBLgorKioqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8cHVsc2UvY2RlY2wuaD4KKworLyoqIFxmaWxlCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisgKi8KKworUEFfQ19ERUNMX0JFR0lOCisKKy8qKiBBbGxvY2F0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcywganVzdCBsaWtlIG1hbGxvYygpIGRvZXMuIEhvd2V2ZXIsIGluIGNhc2Ugb2YgT09NLCB0ZXJtaW5hdGUgKi8KK3ZvaWQqIHBhX3htYWxsb2Moc2l6ZV90IGwpOworCisvKiogU2FtZSBhcyBwYV94bWFsbG9jKCksIGJ1dCBpbml0aWFsaXplIGFsbG9jYXRlZCBtZW1vcnkgdG8gMCAqLwordm9pZCAqcGFfeG1hbGxvYzAoc2l6ZV90IGwpOworCisvKiogIFRoZSBjb21iaW5hdGlvbiBvZiBwYV94bWFsbG9jKCkgYW5kIHJlYWxsb2MoKSAqLwordm9pZCAqcGFfeHJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KK3ZvaWQgcGFfeGZyZWUodm9pZCAqcCk7CisKKy8qKiBEdXBsaWNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcsIGFsbG9jYXRpbmcgbWVtb3J5IHdpdGggcGFfeG1hbGxvYygpICovCitjaGFyICpwYV94c3RyZHVwKGNvbnN0IGNoYXIgKnMpOworCisvKiogRHVwbGljYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBidXQgdHJ1bmNhdGUgYWZ0ZXIgbCBjaGFyYWN0ZXJzICovCitjaGFyICpwYV94c3RybmR1cChjb25zdCBjaGFyICpzLCBzaXplX3QgbCk7CisKKy8qKiBEdXBsaWNhdGUgdGhlIHNwZWNpZmllZCBtZW1vcnkgYmxvY2sgKi8KK3ZvaWQqIHBhX3htZW1kdXAoY29uc3Qgdm9pZCAqcCwgc2l6ZV90IGwpOworCisvKiogSW50ZXJuYWwgaGVscGVyIGZvciBwYV94bmV3KCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCogcGFfeG5ld19pbnRlcm5hbCh1bnNpZ25lZCBuLCBzaXplX3QgaykgeworICAgIGFzc2VydChuIDwgSU5UX01BWC9rKTsKKyAgICByZXR1cm4gcGFfeG1hbGxvYyhuKmspOworfQorCisvKiogQWxsb2NhdGUgbiBuZXcgc3RydWN0dXJlcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuICovCisjZGVmaW5lIHBhX3huZXcodHlwZSwgbikgKCh0eXBlKikgcGFfeG5ld19pbnRlcm5hbCgobiksIHNpemVvZih0eXBlKSkpCisKKy8qKiBJbnRlcm5hbCBoZWxwZXIgZm9yIHBhX3huZXcwKCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCogcGFfeG5ldzBfaW50ZXJuYWwodW5zaWduZWQgbiwgc2l6ZV90IGspIHsKKyAgICBhc3NlcnQobiA8IElOVF9NQVgvayk7CisgICAgcmV0dXJuIHBhX3htYWxsb2MwKG4qayk7Cit9CisKKy8qKiBTYW1lIGFzIHBhX3huZXcoKSBidXQgc2V0IHRoZSBtZW1vcnkgdG8gemVybyAqLworI2RlZmluZSBwYV94bmV3MCh0eXBlLCBuKSAoKHR5cGUqKSBwYV94bmV3MF9pbnRlcm5hbCgobiksIHNpemVvZih0eXBlKSkpCisKKy8qKiBJbnRlcm5hbCBoZWxwZXIgZm9yIHBhX3huZXcwKCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCogcGFfeG5ld2R1cF9pbnRlcm5hbChjb25zdCB2b2lkICpwLCB1bnNpZ25lZCBuLCBzaXplX3QgaykgeworICAgIGFzc2VydChuIDwgSU5UX01BWC9rKTsKKyAgICByZXR1cm4gcGFfeG1lbWR1cChwLCBuKmspOworfQorCisvKiogU2FtZSBhcyBwYV94bmV3KCkgYnV0IHNldCB0aGUgbWVtb3J5IHRvIHplcm8gKi8KKyNkZWZpbmUgcGFfeG5ld2R1cCh0eXBlLCBwLCBuKSAoKHR5cGUqKSBwYV94bmV3ZHVwX2ludGVybmFsKChwKSwgKG4pLCBzaXplb2YodHlwZSkpKQorCitQQV9DX0RFQ0xfRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9wd2QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHdkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NDEzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcHdkLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTUtMjAwMSwyMDAzLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogOS4yLjIgVXNlciBEYXRhYmFzZSBBY2Nlc3MJPHB3ZC5oPgorICovCisKKyNpZm5kZWYJX1BXRF9ICisjZGVmaW5lCV9QV0RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBzb21lIG1vcmUgdHlwZXMgYXJlCisgICBhdmFpbGFibGUgaGVyZS4gICovCisjIGlmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjICBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworLyogVGhlIHBhc3N3ZCBzdHJ1Y3R1cmUuICAqLworc3RydWN0IHBhc3N3ZAoreworICBjaGFyICpwd19uYW1lOwkJLyogVXNlcm5hbWUuICAqLworICBjaGFyICpwd19wYXNzd2Q7CQkvKiBQYXNzd29yZC4gICovCisgIF9fdWlkX3QgcHdfdWlkOwkJLyogVXNlciBJRC4gICovCisgIF9fZ2lkX3QgcHdfZ2lkOwkJLyogR3JvdXAgSUQuICAqLworICBjaGFyICpwd19nZWNvczsJCS8qIFJlYWwgbmFtZS4gICovCisgIGNoYXIgKnB3X2RpcjsJCQkvKiBIb21lIGRpcmVjdG9yeS4gICovCisgIGNoYXIgKnB3X3NoZWxsOwkJLyogU2hlbGwgcHJvZ3JhbS4gICovCit9OworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fbmVlZF9GSUxFCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBSZXdpbmQgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHNldHB3ZW50ICh2b2lkKTsKKworLyogQ2xvc2UgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHB3ZW50ICh2b2lkKTsKKworLyogUmVhZCBhbiBlbnRyeSBmcm9tIHRoZSBwYXNzd29yZC1maWxlIHN0cmVhbSwgb3BlbmluZyBpdCBpZiBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmdldHB3ZW50ICh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfU1ZJRAorLyogUmVhZCBhbiBlbnRyeSBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBwYXNzd2QgKmZnZXRwd2VudCAoRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSB0aGUgZ2l2ZW4gZW50cnkgb250byB0aGUgZ2l2ZW4gc3RyZWFtLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dHB3ZW50IChfX2NvbnN0IHN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19wLAorCQkgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19mKTsKKyNlbmRpZgorCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IHdpdGggYSBtYXRjaGluZyB1c2VyIElELgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd3VpZCAoX191aWRfdCBfX3VpZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIHVzZXJuYW1lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbSAoX19jb25zdCBjaGFyICpfX25hbWUpOworCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBSZWFzb25hYmxlIHZhbHVlIGZvciB0aGUgYnVmZmVyIHNpemVkIHVzZWQgaW4gdGhlIHJlZW50cmFudAorICAgZnVuY3Rpb25zIGJlbG93LiAgQnV0IGJldHRlciB1c2UgYHN5c2NvbmYnLiAgKi8KKyMgIGRlZmluZSBOU1NfQlVGTEVOX1BBU1NXRAkxMDI0CisjIGVuZGlmCisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuCisKKyAgIFBMRUFTRSBOT1RFOiB0aGUgYGdldHB3ZW50X3InIGZ1bmN0aW9uIGlzIG5vdCAoeWV0KSBzdGFuZGFyZGl6ZWQuCisgICBUaGUgaW50ZXJmYWNlIG1heSBjaGFuZ2UgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5LiAgQnV0CisgICB0aGUgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIGZvbGxvd2luZyB0aGUgcHJpbmNpcGFscyB1c2VkIGZvciB0aGUKKyAgIG90aGVyIHJlZW50cmFudCBmdW5jdGlvbnMgc28gdGhlIGNoYW5jZXMgYXJlIGdvb2QgdGhpcyBpcyB3aGF0IHRoZQorICAgUE9TSVggcGVvcGxlIHdvdWxkIGNob29zZS4gICovCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBnZXRwd2VudF9yIChzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworIyBlbmRpZgorCitleHRlcm4gaW50IGdldHB3dWlkX3IgKF9fdWlkX3QgX191aWQsCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHB3bmFtX3IgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCSAgICAgICBzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkgICAgICAgY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkgICAgICAgc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCisKKyMgaWZkZWYJX19VU0VfU1ZJRAorLyogUmVhZCBhbiBlbnRyeSBmcm9tIFNUUkVBTS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHN0YW5kYXJkaXplZCBhbmQKKyAgIHByb2JhYmx5IG5ldmVyIHdpbGwuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldHB3ZW50X3IgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQlzdHJ1Y3QgcGFzc3dkICpfX3Jlc3RyaWN0IF9fcmVzdWx0YnVmLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1ZmZlciwgc2l6ZV90IF9fYnVmbGVuLAorCQkJc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworIyBlbmRpZgorCisjZW5kaWYJLyogUE9TSVggb3IgcmVlbnRyYW50ICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFJlLWNvbnN0cnVjdCB0aGUgcGFzc3dvcmQtZmlsZSBsaW5lIGZvciB0aGUgZ2l2ZW4gdWlkCisgICBpbiB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhpcyBrbm93cyB0aGUgZm9ybWF0IHRoYXQgdGhlIGNhbGxlcgorICAgd2lsbCBleHBlY3QsIGJ1dCB0aGlzIG5lZWQgbm90IGJlIHRoZSBmb3JtYXQgb2YgdGhlIHBhc3N3b3JkIGZpbGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0cHcgKF9fdWlkX3QgX191aWQsIGNoYXIgKl9fYnVmZmVyKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcHdkLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JlX2NvbXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVfY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTE0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JlX2NvbXAuaApAQCAtMCwwICsxLDI2IEBACisvKiAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9SRV9DT01QX0gKKyNkZWZpbmUgX1JFX0NPTVBfSAkxCisKKy8qIFRoaXMgaXMgb25seSBhIHdyYXBwZXIgYXJvdW5kIHRoZSA8cmVnZXguaD4gZmlsZS4gIFhQRzQuMiBtZW50aW9ucworICAgdGhpcyBuYW1lLiAgKi8KKyNpbmNsdWRlIDxyZWdleC5oPgorCisjZW5kaWYgLyogcmVfY29tcC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3YzQwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVnZXguaApAQCAtMCwwICsxLDU1NiBAQAorLyogRGVmaW5pdGlvbnMgZm9yIGRhdGEgc3RydWN0dXJlcyBhbmQgcm91dGluZXMgZm9yIHRoZSByZWd1bGFyCisgICBleHByZXNzaW9uIGxpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5ODUsMTk4OS05MywxOTk1LTk4LDIwMDAsMjAwMSwyMDAyLDIwMDMsMjAwNSwyMDA2CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUkVHRVhfSAorI2RlZmluZSBfUkVHRVhfSCAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQWxsb3cgdGhlIHVzZSBpbiBDKysgY29kZS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGhhdmUgdG8gYmUgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUKKyAgIHdpZGUgZW5vdWdoIHRvIGhvbGQgYSB2YWx1ZSBvZiBhIHBvaW50ZXIuICBGb3IgbW9zdCBBTlNJIGNvbXBpbGVycworICAgcHRyZGlmZl90IGFuZCBzaXplX3Qgc2hvdWxkIGJlIGxpa2VseSBPSy4gIFN0aWxsIHNpemUgb2YgdGhlc2UgdHdvCisgICB0eXBlcyBpcyAyIGZvciBNaWNyb3NvZnQgQy4gIFVnaC4uLiAqLwordHlwZWRlZiBsb25nIGludCBzX3JlZ190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBhY3RpdmVfcmVnX3Q7CisKKy8qIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlZ2V4cCBzeW50YXggd2UKKyAgIHJlY29nbml6ZS4gIFRoZSBzZXQvbm90LXNldCBtZWFuaW5ncyBhcmUgY2hvc2VuIHNvIHRoYXQgRW1hY3Mgc3ludGF4CisgICByZW1haW5zIHRoZSB2YWx1ZSAwLiAgVGhlIGJpdHMgYXJlIGdpdmVuIGluIGFscGhhYmV0aWNhbCBvcmRlciwgYW5kCisgICB0aGUgZGVmaW5pdGlvbnMgc2hpZnRlZCBieSBvbmUgZnJvbSB0aGUgcHJldmlvdXMgYml0OyB0aHVzLCB3aGVuIHdlCisgICBhZGQgb3IgcmVtb3ZlIGEgYml0LCBvbmx5IG9uZSBvdGhlciBkZWZpbml0aW9uIG5lZWQgY2hhbmdlLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgcmVnX3N5bnRheF90OworCisvKiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGVuIFwgaW5zaWRlIGEgYnJhY2tldCBleHByZXNzaW9uIGlzIGxpdGVyYWwuCisgICBJZiBzZXQsIHRoZW4gc3VjaCBhIFwgcXVvdGVzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAgKi8KKyNkZWZpbmUgUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUyAoKHVuc2lnbmVkIGxvbmcgaW50KSAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGVuICsgYW5kID8gYXJlIG9wZXJhdG9ycywgYW5kIFwrIGFuZCBcPyBhcmUKKyAgICAgbGl0ZXJhbHMuCisgICBJZiBzZXQsIHRoZW4gXCsgYW5kIFw/IGFyZSBvcGVyYXRvcnMgYW5kICsgYW5kID8gYXJlIGxpdGVyYWxzLiAgKi8KKyNkZWZpbmUgUkVfQktfUExVU19RTSAoUkVfQkFDS1NMQVNIX0VTQ0FQRV9JTl9MSVNUUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gY2hhcmFjdGVyIGNsYXNzZXMgYXJlIHN1cHBvcnRlZC4gIFRoZXkgYXJlOgorICAgICBbOmFscGhhOl0sIFs6dXBwZXI6XSwgWzpsb3dlcjpdLCAgWzpkaWdpdDpdLCBbOmFsbnVtOl0sIFs6eGRpZ2l0Ol0sCisgICAgIFs6c3BhY2U6XSwgWzpwcmludDpdLCBbOnB1bmN0Ol0sIFs6Z3JhcGg6XSwgYW5kIFs6Y250cmw6XS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gY2hhcmFjdGVyIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLworI2RlZmluZSBSRV9DSEFSX0NMQVNTRVMgKFJFX0JLX1BMVVNfUU0gPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIF4gYW5kICQgYXJlIGFsd2F5cyBhbmNob3JzIChvdXRzaWRlIGJyYWNrZXQKKyAgICAgZXhwcmVzc2lvbnMsIG9mIGNvdXJzZSkuCisgICBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGVuIGl0IGRlcGVuZHM6CisgICAgICAgIF4gIGlzIGFuIGFuY2hvciBpZiBpdCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVndWxhcgorICAgICAgICAgICBleHByZXNzaW9uIG9yIGFmdGVyIGFuIG9wZW4tZ3JvdXAgb3IgYW4gYWx0ZXJuYXRpb24gb3BlcmF0b3I7CisgICAgICAgICQgIGlzIGFuIGFuY2hvciBpZiBpdCBpcyBhdCB0aGUgZW5kIG9mIGEgcmVndWxhciBleHByZXNzaW9uLCBvcgorICAgICAgICAgICBiZWZvcmUgYSBjbG9zZS1ncm91cCBvciBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvci4KKworICAgVGhpcyBiaXQgY291bGQgYmUgKHJlKWNvbWJpbmVkIHdpdGggUkVfQ09OVEVYVF9JTkRFUF9PUFMsIGJlY2F1c2UKKyAgIFBPU0lYIGRyYWZ0IDExLjIgc2F5cyB0aGF0ICogZXRjLiBpbiBsZWFkaW5nIHBvc2l0aW9ucyBpcyB1bmRlZmluZWQuCisgICBXZSBhbHJlYWR5IGltcGxlbWVudGVkIGEgcHJldmlvdXMgZHJhZnQgd2hpY2ggbWFkZSB0aG9zZSBjb25zdHJ1Y3RzCisgICBpbnZhbGlkLCB0aG91Z2gsIHNvIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgY29kZSBiYWNrLiAgKi8KKyNkZWZpbmUgUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTIChSRV9DSEFSX0NMQVNTRVMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgYWx3YXlzIHNwZWNpYWwKKyAgICAgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IGFyZSBpbiB0aGUgcGF0dGVybi4KKyAgIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZW4gc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBzcGVjaWFsIG9ubHkgaW4KKyAgICAgc29tZSBjb250ZXh0czsgb3RoZXJ3aXNlIHRoZXkgYXJlIG9yZGluYXJ5LiAgU3BlY2lmaWNhbGx5LAorICAgICAqICsgPyBhbmQgaW50ZXJ2YWxzIGFyZSBvbmx5IHNwZWNpYWwgd2hlbiBub3QgYWZ0ZXIgdGhlIGJlZ2lubmluZywKKyAgICAgb3Blbi1ncm91cCwgb3IgYWx0ZXJuYXRpb24gb3BlcmF0b3IuICAqLworI2RlZmluZSBSRV9DT05URVhUX0lOREVQX09QUyAoUkVfQ09OVEVYVF9JTkRFUF9BTkNIT1JTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiAqLCArLCA/LCBhbmQgeyBjYW5ub3QgYmUgZmlyc3QgaW4gYW4gcmUgb3IKKyAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gYWx0ZXJuYXRpb24gb3IgYmVnaW4tZ3JvdXAgb3BlcmF0b3IuICAqLworI2RlZmluZSBSRV9DT05URVhUX0lOVkFMSURfT1BTIChSRV9DT05URVhUX0lOREVQX09QUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gLiBtYXRjaGVzIG5ld2xpbmUuCisgICBJZiBub3Qgc2V0LCB0aGVuIGl0IGRvZXNuJ3QuICAqLworI2RlZmluZSBSRV9ET1RfTkVXTElORSAoUkVfQ09OVEVYVF9JTlZBTElEX09QUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gLiBkb2Vzbid0IG1hdGNoIE5VTC4KKyAgIElmIG5vdCBzZXQsIHRoZW4gaXQgZG9lcy4gICovCisjZGVmaW5lIFJFX0RPVF9OT1RfTlVMTCAoUkVfRE9UX05FV0xJTkUgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBub25tYXRjaGluZyBsaXN0cyBbXi4uLl0gZG8gbm90IG1hdGNoIG5ld2xpbmUuCisgICBJZiBub3Qgc2V0LCB0aGV5IGRvLiAgKi8KKyNkZWZpbmUgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FIChSRV9ET1RfTk9UX05VTEwgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBlaXRoZXIgXHsuLi5cfSBvciB7Li4ufSBkZWZpbmVzIGFuCisgICAgIGludGVydmFsLCBkZXBlbmRpbmcgb24gUkVfTk9fQktfQlJBQ0VTLgorICAgSWYgbm90IHNldCwgXHssIFx9LCB7LCBhbmQgfSBhcmUgbGl0ZXJhbHMuICAqLworI2RlZmluZSBSRV9JTlRFUlZBTFMgKFJFX0hBVF9MSVNUU19OT1RfTkVXTElORSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsICssID8gYW5kIHwgYXJlbid0IHJlY29nbml6ZWQgYXMgb3BlcmF0b3JzLgorICAgSWYgbm90IHNldCwgdGhleSBhcmUuICAqLworI2RlZmluZSBSRV9MSU1JVEVEX09QUyAoUkVfSU5URVJWQUxTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgbmV3bGluZSBpcyBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvci4KKyAgIElmIG5vdCBzZXQsIG5ld2xpbmUgaXMgbGl0ZXJhbC4gICovCisjZGVmaW5lIFJFX05FV0xJTkVfQUxUIChSRV9MSU1JVEVEX09QUyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gYHsuLi59JyBkZWZpbmVzIGFuIGludGVydmFsLCBhbmQgXHsgYW5kIFx9CisgICAgIGFyZSBsaXRlcmFscy4KKyAgSWYgbm90IHNldCwgdGhlbiBgXHsuLi5cfScgZGVmaW5lcyBhbiBpbnRlcnZhbC4gICovCisjZGVmaW5lIFJFX05PX0JLX0JSQUNFUyAoUkVfTkVXTElORV9BTFQgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCAoLi4uKSBkZWZpbmVzIGEgZ3JvdXAsIGFuZCBcKCBhbmQgXCkgYXJlIGxpdGVyYWxzLgorICAgSWYgbm90IHNldCwgXCguLi5cKSBkZWZpbmVzIGEgZ3JvdXAsIGFuZCAoIGFuZCApIGFyZSBsaXRlcmFscy4gICovCisjZGVmaW5lIFJFX05PX0JLX1BBUkVOUyAoUkVfTk9fQktfQlJBQ0VTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBcPGRpZ2l0PiBtYXRjaGVzIDxkaWdpdD4uCisgICBJZiBub3Qgc2V0LCB0aGVuIFw8ZGlnaXQ+IGlzIGEgYmFjay1yZWZlcmVuY2UuICAqLworI2RlZmluZSBSRV9OT19CS19SRUZTIChSRV9OT19CS19QQVJFTlMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHwgaXMgYW4gYWx0ZXJuYXRpb24gb3BlcmF0b3IsIGFuZCBcfCBpcyBsaXRlcmFsLgorICAgSWYgbm90IHNldCwgdGhlbiBcfCBpcyBhbiBhbHRlcm5hdGlvbiBvcGVyYXRvciwgYW5kIHwgaXMgbGl0ZXJhbC4gICovCisjZGVmaW5lIFJFX05PX0JLX1ZCQVIgKFJFX05PX0JLX1JFRlMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGFuIGVuZGluZyByYW5nZSBwb2ludCBjb2xsYXRpbmcgaGlnaGVyCisgICAgIHRoYW4gdGhlIHN0YXJ0aW5nIHJhbmdlIHBvaW50LCBhcyBpbiBbei1hXSwgaXMgaW52YWxpZC4KKyAgIElmIG5vdCBzZXQsIHRoZW4gd2hlbiBlbmRpbmcgcmFuZ2UgcG9pbnQgY29sbGF0ZXMgaGlnaGVyIHRoYW4gdGhlCisgICAgIHN0YXJ0aW5nIHJhbmdlIHBvaW50LCB0aGUgcmFuZ2UgaXMgaWdub3JlZC4gICovCisjZGVmaW5lIFJFX05PX0VNUFRZX1JBTkdFUyAoUkVfTk9fQktfVkJBUiA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gYW4gdW5tYXRjaGVkICkgaXMgb3JkaW5hcnkuCisgICBJZiBub3Qgc2V0LCB0aGVuIGFuIHVubWF0Y2hlZCApIGlzIGludmFsaWQuICAqLworI2RlZmluZSBSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEIChSRV9OT19FTVBUWV9SQU5HRVMgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCBzdWNjZWVkIGFzIHNvb24gYXMgd2UgbWF0Y2ggdGhlIHdob2xlIHBhdHRlcm4sCisgICB3aXRob3V0IGZ1cnRoZXIgYmFja3RyYWNraW5nLiAgKi8KKyNkZWZpbmUgUkVfTk9fUE9TSVhfQkFDS1RSQUNLSU5HIChSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgZG8gbm90IHByb2Nlc3MgdGhlIEdOVSByZWdleCBvcGVyYXRvcnMuCisgICBJZiBub3Qgc2V0LCB0aGVuIHRoZSBHTlUgcmVnZXggb3BlcmF0b3JzIGFyZSByZWNvZ25pemVkLiAqLworI2RlZmluZSBSRV9OT19HTlVfT1BTIChSRV9OT19QT1NJWF9CQUNLVFJBQ0tJTkcgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0dXJuIG9uIGludGVybmFsIHJlZ2V4IGRlYnVnZ2luZy4KKyAgIElmIG5vdCBzZXQsIGFuZCBkZWJ1Z2dpbmcgd2FzIG9uLCB0dXJuIGl0IG9mZi4KKyAgIFRoaXMgb25seSB3b3JrcyBpZiByZWdleC5jIGlzIGNvbXBpbGVkIC1EREVCVUcuCisgICBXZSBkZWZpbmUgdGhpcyBiaXQgYWx3YXlzLCBzbyB0aGF0IGFsbCB0aGF0J3MgbmVlZGVkIHRvIHR1cm4gb24KKyAgIGRlYnVnZ2luZyBpcyB0byByZWNvbXBpbGUgcmVnZXguYzsgdGhlIGNhbGxpbmcgY29kZSBjYW4gYWx3YXlzIGhhdmUKKyAgIHRoaXMgYml0IHNldCwgYW5kIGl0IHdvbid0IGFmZmVjdCBhbnl0aGluZyBpbiB0aGUgbm9ybWFsIGNhc2UuICovCisjZGVmaW5lIFJFX0RFQlVHIChSRV9OT19HTlVfT1BTIDw8IDEpCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgYSBzeW50YWN0aWNhbGx5IGludmFsaWQgaW50ZXJ2YWwgaXMgdHJlYXRlZCBhcworICAgYSBzdHJpbmcgb2Ygb3JkaW5hcnkgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlLCB0aGUgRVJFICdhezEnIGlzCisgICB0cmVhdGVkIGFzICdhXHsxJy4gICovCisjZGVmaW5lIFJFX0lOVkFMSURfSU5URVJWQUxfT1JEIChSRV9ERUJVRyA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZy4KKyAgIElmIG5vdCBzZXQsIHRoZW4gY2FzZSBpcyBzaWduaWZpY2FudC4gICovCisjZGVmaW5lIFJFX0lDQVNFIChSRV9JTlZBTElEX0lOVEVSVkFMX09SRCA8PCAxKQorCisvKiBUaGlzIGJpdCBpcyB1c2VkIGludGVybmFsbHkgbGlrZSBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMgYnV0IG9ubHkKKyAgIGZvciBeLCBiZWNhdXNlIGl0IGlzIGRpZmZpY3VsdCB0byBzY2FuIHRoZSByZWdleCBiYWNrd2FyZHMgdG8gZmluZAorICAgd2hldGhlciBeIHNob3VsZCBiZSBzcGVjaWFsLiAgKi8KKyNkZWZpbmUgUkVfQ0FSRVRfQU5DSE9SU19IRVJFIChSRV9JQ0FTRSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gXHsgY2Fubm90IGJlIGZpcnN0IGluIGFuIGJyZSBvcgorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gYWx0ZXJuYXRpb24gb3IgYmVnaW4tZ3JvdXAgb3BlcmF0b3IuICAqLworI2RlZmluZSBSRV9DT05URVhUX0lOVkFMSURfRFVQIChSRV9DQVJFVF9BTkNIT1JTX0hFUkUgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIG5vX3N1YiB3aWxsIGJlIHNldCB0byAxIGR1cmluZworICAgcmVfY29tcGlsZV9wYXR0ZXJuLiAgKi8KKyNkZWZpbmUgUkVfTk9fU1VCIChSRV9DT05URVhUX0lOVkFMSURfRFVQIDw8IDEpCisKKy8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGRlZmluZXMgdGhlIHBhcnRpY3VsYXIgcmVnZXhwIHN5bnRheCB0byB1c2UgKGZvcgorICAgc29tZSBpbnRlcmZhY2VzKS4gIFdoZW4gYSByZWdleHAgaXMgY29tcGlsZWQsIHRoZSBzeW50YXggdXNlZCBpcworICAgc3RvcmVkIGluIHRoZSBwYXR0ZXJuIGJ1ZmZlciwgc28gY2hhbmdpbmcgdGhpcyBkb2VzIG5vdCBhZmZlY3QKKyAgIGFscmVhZHktY29tcGlsZWQgcmVnZXhwcy4gICovCitleHRlcm4gcmVnX3N5bnRheF90IHJlX3N5bnRheF9vcHRpb25zOworDAorLyogRGVmaW5lIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYml0cyBmb3IgdGhlIHN0YW5kYXJkIHBvc3NpYmlsaXRpZXMuCisgICAoVGhlIFtbWyBjb21tZW50cyBkZWxpbWl0IHdoYXQgZ2V0cyBwdXQgaW50byB0aGUgVGV4aW5mbyBmaWxlLCBzbworICAgZG9uJ3QgZGVsZXRlIHRoZW0hKSAgKi8KKy8qIFtbW2JlZ2luIHN5bnRheGVzXV1dICovCisjZGVmaW5lIFJFX1NZTlRBWF9FTUFDUyAwCisKKyNkZWZpbmUgUkVfU1lOVEFYX0FXSwkJCQkJCQlcCisgIChSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTICAgfCBSRV9ET1RfTk9UX05VTEwJCQlcCisgICB8IFJFX05PX0JLX1BBUkVOUyAgICAgICAgICAgICAgfCBSRV9OT19CS19SRUZTCQkJXAorICAgfCBSRV9OT19CS19WQkFSICAgICAgICAgICAgICAgIHwgUkVfTk9fRU1QVFlfUkFOR0VTCQkJXAorICAgfCBSRV9ET1RfTkVXTElORQkJICB8IFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUwkJXAorICAgfCBSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEIHwgUkVfTk9fR05VX09QUykKKworI2RlZmluZSBSRV9TWU5UQVhfR05VX0FXSwkJCQkJCVwKKyAgKChSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQgfCBSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTIHwgUkVfREVCVUcpCVwKKyAgICYgfihSRV9ET1RfTk9UX05VTEwgfCBSRV9JTlRFUlZBTFMgfCBSRV9DT05URVhUX0lOREVQX09QUwkJXAorICAgICAgIHwgUkVfQ09OVEVYVF9JTlZBTElEX09QUyApKQorCisjZGVmaW5lIFJFX1NZTlRBWF9QT1NJWF9BV0sJCQkJCQlcCisgIChSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQgfCBSRV9CQUNLU0xBU0hfRVNDQVBFX0lOX0xJU1RTCQlcCisgICB8IFJFX0lOVEVSVkFMUwkgICAgfCBSRV9OT19HTlVfT1BTKQorCisjZGVmaW5lIFJFX1NZTlRBWF9HUkVQCQkJCQkJCVwKKyAgKFJFX0JLX1BMVVNfUU0gICAgICAgICAgICAgIHwgUkVfQ0hBUl9DTEFTU0VTCQkJCVwKKyAgIHwgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FIHwgUkVfSU5URVJWQUxTCQkJCVwKKyAgIHwgUkVfTkVXTElORV9BTFQpCisKKyNkZWZpbmUgUkVfU1lOVEFYX0VHUkVQCQkJCQkJCVwKKyAgKFJFX0NIQVJfQ0xBU1NFUyAgICAgICAgfCBSRV9DT05URVhUX0lOREVQX0FOQ0hPUlMJCQlcCisgICB8IFJFX0NPTlRFWFRfSU5ERVBfT1BTIHwgUkVfSEFUX0xJU1RTX05PVF9ORVdMSU5FCQkJXAorICAgfCBSRV9ORVdMSU5FX0FMVCAgICAgICB8IFJFX05PX0JLX1BBUkVOUwkJCQlcCisgICB8IFJFX05PX0JLX1ZCQVIpCisKKyNkZWZpbmUgUkVfU1lOVEFYX1BPU0lYX0VHUkVQCQkJCQkJXAorICAoUkVfU1lOVEFYX0VHUkVQIHwgUkVfSU5URVJWQUxTIHwgUkVfTk9fQktfQlJBQ0VTCQkJXAorICAgfCBSRV9JTlZBTElEX0lOVEVSVkFMX09SRCkKKworLyogUDEwMDMuMi9EMTEuMiwgc2VjdGlvbiA0LjIwLjcuMSwgbGluZXMgNTA3OGZmLiAgKi8KKyNkZWZpbmUgUkVfU1lOVEFYX0VEIFJFX1NZTlRBWF9QT1NJWF9CQVNJQworCisjZGVmaW5lIFJFX1NZTlRBWF9TRUQgUkVfU1lOVEFYX1BPU0lYX0JBU0lDCisKKy8qIFN5bnRheCBiaXRzIGNvbW1vbiB0byBib3RoIGJhc2ljIGFuZCBleHRlbmRlZCBQT1NJWCByZWdleCBzeW50YXguICAqLworI2RlZmluZSBfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTgkJCQkJCVwKKyAgKFJFX0NIQVJfQ0xBU1NFUyB8IFJFX0RPVF9ORVdMSU5FICAgICAgfCBSRV9ET1RfTk9UX05VTEwJCVwKKyAgIHwgUkVfSU5URVJWQUxTICB8IFJFX05PX0VNUFRZX1JBTkdFUykKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfQkFTSUMJCQkJCQlcCisgIChfUkVfU1lOVEFYX1BPU0lYX0NPTU1PTiB8IFJFX0JLX1BMVVNfUU0gfCBSRV9DT05URVhUX0lOVkFMSURfRFVQKQorCisvKiBEaWZmZXJzIGZyb20gLi4uX1BPU0lYX0JBU0lDIG9ubHkgaW4gdGhhdCBSRV9CS19QTFVTX1FNIGJlY29tZXMKKyAgIFJFX0xJTUlURURfT1BTLCBpLmUuLCBcPyBcKyBcfCBhcmUgbm90IHJlY29nbml6ZWQuICBBY3R1YWxseSwgdGhpcworICAgaXNuJ3QgbWluaW1hbCwgc2luY2Ugb3RoZXIgb3BlcmF0b3JzLCBzdWNoIGFzIFxgLCBhcmVuJ3QgZGlzYWJsZWQuICAqLworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfTUlOSU1BTF9CQVNJQwkJCQkJXAorICAoX1JFX1NZTlRBWF9QT1NJWF9DT01NT04gfCBSRV9MSU1JVEVEX09QUykKKworI2RlZmluZSBSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQJCQkJCVwKKyAgKF9SRV9TWU5UQVhfUE9TSVhfQ09NTU9OICB8IFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUwkJCVwKKyAgIHwgUkVfQ09OVEVYVF9JTkRFUF9PUFMgICB8IFJFX05PX0JLX0JSQUNFUwkJCQlcCisgICB8IFJFX05PX0JLX1BBUkVOUyAgICAgICAgfCBSRV9OT19CS19WQkFSCQkJCVwKKyAgIHwgUkVfQ09OVEVYVF9JTlZBTElEX09QUyB8IFJFX1VOTUFUQ0hFRF9SSUdIVF9QQVJFTl9PUkQpCisKKy8qIERpZmZlcnMgZnJvbSAuLi5fUE9TSVhfRVhURU5ERUQgaW4gdGhhdCBSRV9DT05URVhUX0lOREVQX09QUyBpcworICAgcmVtb3ZlZCBhbmQgUkVfTk9fQktfUkVGUyBpcyBhZGRlZC4gICovCisjZGVmaW5lIFJFX1NZTlRBWF9QT1NJWF9NSU5JTUFMX0VYVEVOREVECQkJCVwKKyAgKF9SRV9TWU5UQVhfUE9TSVhfQ09NTU9OICB8IFJFX0NPTlRFWFRfSU5ERVBfQU5DSE9SUwkJCVwKKyAgIHwgUkVfQ09OVEVYVF9JTlZBTElEX09QUyB8IFJFX05PX0JLX0JSQUNFUwkJCQlcCisgICB8IFJFX05PX0JLX1BBUkVOUyAgICAgICAgfCBSRV9OT19CS19SRUZTCQkJCVwKKyAgIHwgUkVfTk9fQktfVkJBUgkgICAgfCBSRV9VTk1BVENIRURfUklHSFRfUEFSRU5fT1JEKQorLyogW1tbZW5kIHN5bnRheGVzXV1dICovCisMCisvKiBNYXhpbXVtIG51bWJlciBvZiBkdXBsaWNhdGVzIGFuIGludGVydmFsIGNhbiBhbGxvdy4gIFNvbWUgc3lzdGVtcworICAgKGVycm9uZW91c2x5KSBkZWZpbmUgdGhpcyBpbiBvdGhlciBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSB3YW50IG91cgorICAgdmFsdWUsIHNvIHJlbW92ZSBhbnkgcHJldmlvdXMgZGVmaW5lLiAgKi8KKyNpZmRlZiBSRV9EVVBfTUFYCisjIHVuZGVmIFJFX0RVUF9NQVgKKyNlbmRpZgorLyogSWYgc2l6ZW9mKGludCkgPT0gMiwgdGhlbiAoKDEgPDwgMTUpIC0gMSkgb3ZlcmZsb3dzLiAgKi8KKyNkZWZpbmUgUkVfRFVQX01BWCAoMHg3ZmZmKQorCisKKy8qIFBPU0lYIGBjZmxhZ3MnIGJpdHMgKGkuZS4sIGluZm9ybWF0aW9uIGZvciBgcmVnY29tcCcpLiAgKi8KKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHVzZSBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4LgorICAgSWYgbm90IHNldCwgdGhlbiB1c2UgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIHN5bnRheC4gICovCisjZGVmaW5lIFJFR19FWFRFTkRFRCAxCisKKy8qIElmIHRoaXMgYml0IGlzIHNldCwgdGhlbiBpZ25vcmUgY2FzZSB3aGVuIG1hdGNoaW5nLgorICAgSWYgbm90IHNldCwgdGhlbiBjYXNlIGlzIHNpZ25pZmljYW50LiAgKi8KKyNkZWZpbmUgUkVHX0lDQVNFIChSRUdfRVhURU5ERUQgPDwgMSkKKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIGFuY2hvcnMgZG8gbm90IG1hdGNoIGF0IG5ld2xpbmUKKyAgICAgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLgorICAgSWYgbm90IHNldCwgdGhlbiBhbmNob3JzIGRvIG1hdGNoIGF0IG5ld2xpbmVzLiAgKi8KKyNkZWZpbmUgUkVHX05FV0xJTkUgKFJFR19JQ0FTRSA8PCAxKQorCisvKiBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZW4gcmVwb3J0IG9ubHkgc3VjY2VzcyBvciBmYWlsIGluIHJlZ2V4ZWMuCisgICBJZiBub3Qgc2V0LCB0aGVuIHJldHVybnMgZGlmZmVyIGJldHdlZW4gbm90IG1hdGNoaW5nIGFuZCBlcnJvcnMuICAqLworI2RlZmluZSBSRUdfTk9TVUIgKFJFR19ORVdMSU5FIDw8IDEpCisKKworLyogUE9TSVggYGVmbGFncycgYml0cyAoaS5lLiwgaW5mb3JtYXRpb24gZm9yIHJlZ2V4ZWMpLiAgKi8KKworLyogSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGVuIHRoZSBiZWdpbm5pbmctb2YtbGluZSBvcGVyYXRvciBkb2Vzbid0IG1hdGNoCisgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyAocHJlc3VtYWJseSBiZWNhdXNlIGl0J3Mgbm90IHRoZQorICAgICBiZWdpbm5pbmcgb2YgYSBsaW5lKS4KKyAgIElmIG5vdCBzZXQsIHRoZW4gdGhlIGJlZ2lubmluZy1vZi1saW5lIG9wZXJhdG9yIGRvZXMgbWF0Y2ggdGhlCisgICAgIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiAgKi8KKyNkZWZpbmUgUkVHX05PVEJPTCAxCisKKy8qIExpa2UgUkVHX05PVEJPTCwgZXhjZXB0IGZvciB0aGUgZW5kLW9mLWxpbmUuICAqLworI2RlZmluZSBSRUdfTk9URU9MICgxIDw8IDEpCisKKy8qIFVzZSBQTUFUQ0hbMF0gdG8gZGVsaW1pdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc2VhcmNoIGluIHRoZQorICAgYnVmZmVyLiAgKi8KKyNkZWZpbmUgUkVHX1NUQVJURU5EICgxIDw8IDIpCisKKworLyogSWYgYW55IGVycm9yIGNvZGVzIGFyZSByZW1vdmVkLCBjaGFuZ2VkLCBvciBhZGRlZCwgdXBkYXRlIHRoZQorICAgYHJlX2Vycm9yX21zZycgdGFibGUgaW4gcmVnZXguYy4gICovCit0eXBlZGVmIGVudW0KK3sKKyNpZmRlZiBfWE9QRU5fU09VUkNFCisgIFJFR19FTk9TWVMgPSAtMSwJLyogVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4gICovCisjZW5kaWYKKworICBSRUdfTk9FUlJPUiA9IDAsCS8qIFN1Y2Nlc3MuICAqLworICBSRUdfTk9NQVRDSCwJCS8qIERpZG4ndCBmaW5kIGEgbWF0Y2ggKGZvciByZWdleGVjKS4gICovCisKKyAgLyogUE9TSVggcmVnY29tcCByZXR1cm4gZXJyb3IgY29kZXMuICAoSW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUKKyAgICAgc3RhbmRhcmQuKSAgKi8KKyAgUkVHX0JBRFBBVCwJCS8qIEludmFsaWQgcGF0dGVybi4gICovCisgIFJFR19FQ09MTEFURSwJCS8qIEluYWxpZCBjb2xsYXRpbmcgZWxlbWVudC4gICovCisgIFJFR19FQ1RZUEUsCQkvKiBJbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAgKi8KKyAgUkVHX0VFU0NBUEUsCQkvKiBUcmFpbGluZyBiYWNrc2xhc2guICAqLworICBSRUdfRVNVQlJFRywJCS8qIEludmFsaWQgYmFjayByZWZlcmVuY2UuICAqLworICBSRUdfRUJSQUNLLAkJLyogVW5tYXRjaGVkIGxlZnQgYnJhY2tldC4gICovCisgIFJFR19FUEFSRU4sCQkvKiBQYXJlbnRoZXNpcyBpbWJhbGFuY2UuICAqLworICBSRUdfRUJSQUNFLAkJLyogVW5tYXRjaGVkIFx7LiAgKi8KKyAgUkVHX0JBREJSLAkJLyogSW52YWxpZCBjb250ZW50cyBvZiBce1x9LiAgKi8KKyAgUkVHX0VSQU5HRSwJCS8qIEludmFsaWQgcmFuZ2UgZW5kLiAgKi8KKyAgUkVHX0VTUEFDRSwJCS8qIFJhbiBvdXQgb2YgbWVtb3J5LiAgKi8KKyAgUkVHX0JBRFJQVCwJCS8qIE5vIHByZWNlZGluZyByZSBmb3IgcmVwZXRpdGlvbiBvcC4gICovCisKKyAgLyogRXJyb3IgY29kZXMgd2UndmUgYWRkZWQuICAqLworICBSRUdfRUVORCwJCS8qIFByZW1hdHVyZSBlbmQuICAqLworICBSRUdfRVNJWkUsCQkvKiBDb21waWxlZCBwYXR0ZXJuIGJpZ2dlciB0aGFuIDJeMTYgYnl0ZXMuICAqLworICBSRUdfRVJQQVJFTgkJLyogVW5tYXRjaGVkICkgb3IgXCk7IG5vdCByZXR1cm5lZCBmcm9tIHJlZ2NvbXAuICAqLworfSByZWdfZXJyY29kZV90OworDAorLyogVGhpcyBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgY29tcGlsZWQgcGF0dGVybi4gIEJlZm9yZSBjYWxsaW5nCisgICB0aGUgcGF0dGVybiBjb21waWxlciwgdGhlIGZpZWxkcyBgYnVmZmVyJywgYGFsbG9jYXRlZCcsIGBmYXN0bWFwJywKKyAgIGB0cmFuc2xhdGUnLCBhbmQgYG5vX3N1YicgY2FuIGJlIHNldC4gIEFmdGVyIHRoZSBwYXR0ZXJuIGhhcyBiZWVuCisgICBjb21waWxlZCwgdGhlIGByZV9uc3ViJyBmaWVsZCBpcyBhdmFpbGFibGUuICBBbGwgb3RoZXIgZmllbGRzIGFyZQorICAgcHJpdmF0ZSB0byB0aGUgcmVnZXggcm91dGluZXMuICAqLworCisjaWZuZGVmIFJFX1RSQU5TTEFURV9UWVBFCisjIGRlZmluZSBSRV9UUkFOU0xBVEVfVFlQRSB1bnNpZ25lZCBjaGFyICoKKyNlbmRpZgorCitzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIKK3sKKyAgLyogU3BhY2UgdGhhdCBob2xkcyB0aGUgY29tcGlsZWQgcGF0dGVybi4gIEl0IGlzIGRlY2xhcmVkIGFzCisgICAgIGB1bnNpZ25lZCBjaGFyIConIGJlY2F1c2UgaXRzIGVsZW1lbnRzIGFyZSBzb21ldGltZXMgdXNlZCBhcworICAgICBhcnJheSBpbmRleGVzLiAgKi8KKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisgIC8qIE51bWJlciBvZiBieXRlcyB0byB3aGljaCBgYnVmZmVyJyBwb2ludHMuICAqLworICB1bnNpZ25lZCBsb25nIGludCBhbGxvY2F0ZWQ7CisKKyAgLyogTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHVzZWQgaW4gYGJ1ZmZlcicuICAqLworICB1bnNpZ25lZCBsb25nIGludCB1c2VkOworCisgIC8qIFN5bnRheCBzZXR0aW5nIHdpdGggd2hpY2ggdGhlIHBhdHRlcm4gd2FzIGNvbXBpbGVkLiAgKi8KKyAgcmVnX3N5bnRheF90IHN5bnRheDsKKworICAvKiBQb2ludGVyIHRvIGEgZmFzdG1hcCwgaWYgYW55LCBvdGhlcndpc2UgemVyby4gIHJlX3NlYXJjaCB1c2VzIHRoZQorICAgICBmYXN0bWFwLCBpZiB0aGVyZSBpcyBvbmUsIHRvIHNraXAgb3ZlciBpbXBvc3NpYmxlIHN0YXJ0aW5nIHBvaW50cworICAgICBmb3IgbWF0Y2hlcy4gICovCisgIGNoYXIgKmZhc3RtYXA7CisKKyAgLyogRWl0aGVyIGEgdHJhbnNsYXRlIHRhYmxlIHRvIGFwcGx5IHRvIGFsbCBjaGFyYWN0ZXJzIGJlZm9yZQorICAgICBjb21wYXJpbmcgdGhlbSwgb3IgemVybyBmb3Igbm8gdHJhbnNsYXRpb24uICBUaGUgdHJhbnNsYXRpb24gaXMKKyAgICAgYXBwbGllZCB0byBhIHBhdHRlcm4gd2hlbiBpdCBpcyBjb21waWxlZCBhbmQgdG8gYSBzdHJpbmcgd2hlbiBpdAorICAgICBpcyBtYXRjaGVkLiAgKi8KKyAgUkVfVFJBTlNMQVRFX1RZUEUgdHJhbnNsYXRlOworCisgIC8qIE51bWJlciBvZiBzdWJleHByZXNzaW9ucyBmb3VuZCBieSB0aGUgY29tcGlsZXIuICAqLworICBzaXplX3QgcmVfbnN1YjsKKworICAvKiBaZXJvIGlmIHRoaXMgcGF0dGVybiBjYW5ub3QgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZywgb25lIGVsc2UuCisgICAgIFdlbGwsIGluIHRydXRoIGl0J3MgdXNlZCBvbmx5IGluIGByZV9zZWFyY2hfMicsIHRvIHNlZSB3aGV0aGVyIG9yCisgICAgIG5vdCB3ZSBzaG91bGQgdXNlIHRoZSBmYXN0bWFwLCBzbyB3ZSBkb24ndCBzZXQgdGhpcyBhYnNvbHV0ZWx5CisgICAgIHBlcmZlY3RseTsgc2VlIGByZV9jb21waWxlX2Zhc3RtYXAnICh0aGUgYGR1cGxpY2F0ZScgY2FzZSkuICAqLworICB1bnNpZ25lZCBjYW5fYmVfbnVsbCA6IDE7CisKKyAgLyogSWYgUkVHU19VTkFMTE9DQVRFRCwgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGByZWdzJyBzdHJ1Y3R1cmUKKyAgICAgZm9yIGBtYXggKFJFX05SRUdTLCByZV9uc3ViICsgMSknIGdyb3Vwcy4KKyAgICAgSWYgUkVHU19SRUFMTE9DQVRFLCByZWFsbG9jYXRlIHNwYWNlIGlmIG5lY2Vzc2FyeS4KKyAgICAgSWYgUkVHU19GSVhFRCwgdXNlIHdoYXQncyB0aGVyZS4gICovCisjZGVmaW5lIFJFR1NfVU5BTExPQ0FURUQgMAorI2RlZmluZSBSRUdTX1JFQUxMT0NBVEUgMQorI2RlZmluZSBSRUdTX0ZJWEVEIDIKKyAgdW5zaWduZWQgcmVnc19hbGxvY2F0ZWQgOiAyOworCisgIC8qIFNldCB0byB6ZXJvIHdoZW4gYHJlZ2V4X2NvbXBpbGUnIGNvbXBpbGVzIGEgcGF0dGVybjsgc2V0IHRvIG9uZQorICAgICBieSBgcmVfY29tcGlsZV9mYXN0bWFwJyBpZiBpdCB1cGRhdGVzIHRoZSBmYXN0bWFwLiAgKi8KKyAgdW5zaWduZWQgZmFzdG1hcF9hY2N1cmF0ZSA6IDE7CisKKyAgLyogSWYgc2V0LCBgcmVfbWF0Y2hfMicgZG9lcyBub3QgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0CisgICAgIHN1YmV4cHJlc3Npb25zLiAgKi8KKyAgdW5zaWduZWQgbm9fc3ViIDogMTsKKworICAvKiBJZiBzZXQsIGEgYmVnaW5uaW5nLW9mLWxpbmUgYW5jaG9yIGRvZXNuJ3QgbWF0Y2ggYXQgdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc3RyaW5nLiAgKi8KKyAgdW5zaWduZWQgbm90X2JvbCA6IDE7CisKKyAgLyogU2ltaWxhcmx5IGZvciBhbiBlbmQtb2YtbGluZSBhbmNob3IuICAqLworICB1bnNpZ25lZCBub3RfZW9sIDogMTsKKworICAvKiBJZiB0cnVlLCBhbiBhbmNob3IgYXQgYSBuZXdsaW5lIG1hdGNoZXMuICAqLworICB1bnNpZ25lZCBuZXdsaW5lX2FuY2hvciA6IDE7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciByZWdleF90OworDAorLyogVHlwZSBmb3IgYnl0ZSBvZmZzZXRzIHdpdGhpbiB0aGUgc3RyaW5nLiAgUE9TSVggbWFuZGF0ZXMgdGhpcy4gICovCit0eXBlZGVmIGludCByZWdvZmZfdDsKKworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2Ugc3RvcmUgcmVnaXN0ZXIgbWF0Y2ggZGF0YSBpbi4gIFNlZQorICAgcmVnZXgudGV4aW5mbyBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHdoYXQgcmVnaXN0ZXJzIG1hdGNoLiAgKi8KK3N0cnVjdCByZV9yZWdpc3RlcnMKK3sKKyAgdW5zaWduZWQgbnVtX3JlZ3M7CisgIHJlZ29mZl90ICpzdGFydDsKKyAgcmVnb2ZmX3QgKmVuZDsKK307CisKKworLyogSWYgYHJlZ3NfYWxsb2NhdGVkJyBpcyBSRUdTX1VOQUxMT0NBVEVEIGluIHRoZSBwYXR0ZXJuIGJ1ZmZlciwKKyAgIGByZV9tYXRjaF8yJyByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGF0IGxlYXN0IHRoaXMgbWFueSByZWdpc3RlcnMKKyAgIHRoZSBmaXJzdCB0aW1lIGEgYHJlZ3MnIHN0cnVjdHVyZSBpcyBwYXNzZWQuICAqLworI2lmbmRlZiBSRV9OUkVHUworIyBkZWZpbmUgUkVfTlJFR1MgMzAKKyNlbmRpZgorCisKKy8qIFBPU0lYIHNwZWNpZmljYXRpb24gZm9yIHJlZ2lzdGVycy4gIEFzaWRlIGZyb20gdGhlIGRpZmZlcmVudCBuYW1lcyB0aGFuCisgICBgcmVfcmVnaXN0ZXJzJywgUE9TSVggdXNlcyBhbiBhcnJheSBvZiBzdHJ1Y3R1cmVzLCBpbnN0ZWFkIG9mIGEKKyAgIHN0cnVjdHVyZSBvZiBhcnJheXMuICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgcmVnb2ZmX3Qgcm1fc287ICAvKiBCeXRlIG9mZnNldCBmcm9tIHN0cmluZydzIHN0YXJ0IHRvIHN1YnN0cmluZydzIHN0YXJ0LiAgKi8KKyAgcmVnb2ZmX3Qgcm1fZW87ICAvKiBCeXRlIG9mZnNldCBmcm9tIHN0cmluZydzIHN0YXJ0IHRvIHN1YnN0cmluZydzIGVuZC4gICovCit9IHJlZ21hdGNoX3Q7CisMCisvKiBEZWNsYXJhdGlvbnMgZm9yIHJvdXRpbmVzLiAgKi8KKworLyogU2V0cyB0aGUgY3VycmVudCBkZWZhdWx0IHN5bnRheCB0byBTWU5UQVgsIGFuZCByZXR1cm4gdGhlIG9sZCBzeW50YXguCisgICBZb3UgY2FuIGFsc28gc2ltcGx5IGFzc2lnbiB0byB0aGUgYHJlX3N5bnRheF9vcHRpb25zJyB2YXJpYWJsZS4gICovCitleHRlcm4gcmVnX3N5bnRheF90IHJlX3NldF9zeW50YXggKHJlZ19zeW50YXhfdCBfX3N5bnRheCk7CisKKy8qIENvbXBpbGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBQQVRURVJOLCB3aXRoIGxlbmd0aCBMRU5HVEgKKyAgIGFuZCBzeW50YXggZ2l2ZW4gYnkgdGhlIGdsb2JhbCBgcmVfc3ludGF4X29wdGlvbnMnLCBpbnRvIHRoZSBidWZmZXIKKyAgIEJVRkZFUi4gIFJldHVybiBOVUxMIGlmIHN1Y2Nlc3NmdWwsIGFuZCBhbiBlcnJvciBzdHJpbmcgaWYgbm90LiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICpyZV9jb21waWxlX3BhdHRlcm4gKGNvbnN0IGNoYXIgKl9fcGF0dGVybiwgc2l6ZV90IF9fbGVuZ3RoLAorCQkJCSAgICAgICBzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyKTsKKworCisvKiBDb21waWxlIGEgZmFzdG1hcCBmb3IgdGhlIGNvbXBpbGVkIHBhdHRlcm4gaW4gQlVGRkVSOyB1c2VkIHRvCisgICBhY2NlbGVyYXRlIHNlYXJjaGVzLiAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCBhbmQgLTIgaWYgd2FzIGFuCisgICBpbnRlcm5hbCBlcnJvci4gICovCitleHRlcm4gaW50IHJlX2NvbXBpbGVfZmFzdG1hcCAoc3RydWN0IHJlX3BhdHRlcm5fYnVmZmVyICpfX2J1ZmZlcik7CisKKworLyogU2VhcmNoIGluIHRoZSBzdHJpbmcgU1RSSU5HICh3aXRoIGxlbmd0aCBMRU5HVEgpIGZvciB0aGUgcGF0dGVybgorICAgY29tcGlsZWQgaW50byBCVUZGRVIuICBTdGFydCBzZWFyY2hpbmcgYXQgcG9zaXRpb24gU1RBUlQsIGZvciBSQU5HRQorICAgY2hhcmFjdGVycy4gIFJldHVybiB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1hdGNoLCAtMSBmb3Igbm8KKyAgIG1hdGNoLCBvciAtMiBmb3IgYW4gaW50ZXJuYWwgZXJyb3IuICBBbHNvIHJldHVybiByZWdpc3RlcgorICAgaW5mb3JtYXRpb24gaW4gUkVHUyAoaWYgUkVHUyBhbmQgQlVGRkVSLT5ub19zdWIgYXJlIG5vbnplcm8pLiAgKi8KK2V4dGVybiBpbnQgcmVfc2VhcmNoIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLCBjb25zdCBjaGFyICpfX3N0cmluZywKKwkJICAgICAgaW50IF9fbGVuZ3RoLCBpbnQgX19zdGFydCwgaW50IF9fcmFuZ2UsCisJCSAgICAgIHN0cnVjdCByZV9yZWdpc3RlcnMgKl9fcmVncyk7CisKKworLyogTGlrZSBgcmVfc2VhcmNoJywgYnV0IHNlYXJjaCBpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBTVFJJTkcxIGFuZAorICAgU1RSSU5HMi4gIEFsc28sIHN0b3Agc2VhcmNoaW5nIGF0IGluZGV4IFNUQVJUICsgU1RPUC4gICovCitleHRlcm4gaW50IHJlX3NlYXJjaF8yIChzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgKl9fYnVmZmVyLAorCQkJY29uc3QgY2hhciAqX19zdHJpbmcxLCBpbnQgX19sZW5ndGgxLAorCQkJY29uc3QgY2hhciAqX19zdHJpbmcyLCBpbnQgX19sZW5ndGgyLCBpbnQgX19zdGFydCwKKwkJCWludCBfX3JhbmdlLCBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpfX3JlZ3MsIGludCBfX3N0b3ApOworCisKKy8qIExpa2UgYHJlX3NlYXJjaCcsIGJ1dCByZXR1cm4gaG93IG1hbnkgY2hhcmFjdGVycyBpbiBTVFJJTkcgdGhlIHJlZ2V4cAorICAgaW4gQlVGRkVSIG1hdGNoZWQsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIFNUQVJULiAgKi8KK2V4dGVybiBpbnQgcmVfbWF0Y2ggKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIsIGNvbnN0IGNoYXIgKl9fc3RyaW5nLAorCQkgICAgIGludCBfX2xlbmd0aCwgaW50IF9fc3RhcnQsIHN0cnVjdCByZV9yZWdpc3RlcnMgKl9fcmVncyk7CisKKworLyogUmVsYXRlcyB0byBgcmVfbWF0Y2gnIGFzIGByZV9zZWFyY2hfMicgcmVsYXRlcyB0byBgcmVfc2VhcmNoJy4gICovCitleHRlcm4gaW50IHJlX21hdGNoXzIgKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIsCisJCSAgICAgICBjb25zdCBjaGFyICpfX3N0cmluZzEsIGludCBfX2xlbmd0aDEsCisJCSAgICAgICBjb25zdCBjaGFyICpfX3N0cmluZzIsIGludCBfX2xlbmd0aDIsIGludCBfX3N0YXJ0LAorCQkgICAgICAgc3RydWN0IHJlX3JlZ2lzdGVycyAqX19yZWdzLCBpbnQgX19zdG9wKTsKKworCisvKiBTZXQgUkVHUyB0byBob2xkIE5VTV9SRUdTIHJlZ2lzdGVycywgc3RvcmluZyB0aGVtIGluIFNUQVJUUyBhbmQKKyAgIEVORFMuICBTdWJzZXF1ZW50IG1hdGNoZXMgdXNpbmcgQlVGRkVSIGFuZCBSRUdTIHdpbGwgdXNlIHRoaXMgbWVtb3J5CisgICBmb3IgcmVjb3JkaW5nIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAgU1RBUlRTIGFuZCBFTkRTIG11c3QgYmUKKyAgIGFsbG9jYXRlZCB3aXRoIG1hbGxvYywgYW5kIG11c3QgZWFjaCBiZSBhdCBsZWFzdCBgTlVNX1JFR1MgKiBzaXplb2YKKyAgIChyZWdvZmZfdCknIGJ5dGVzIGxvbmcuCisKKyAgIElmIE5VTV9SRUdTID09IDAsIHRoZW4gc3Vic2VxdWVudCBtYXRjaGVzIHNob3VsZCBhbGxvY2F0ZSB0aGVpciBvd24KKyAgIHJlZ2lzdGVyIGRhdGEuCisKKyAgIFVubGVzcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIGZpcnN0IHNlYXJjaCBvciBtYXRjaCB1c2luZworICAgUEFUVEVSTl9CVUZGRVIgd2lsbCBhbGxvY2F0ZSBpdHMgb3duIHJlZ2lzdGVyIGRhdGEsIHdpdGhvdXQKKyAgIGZyZWVpbmcgdGhlIG9sZCBkYXRhLiAgKi8KK2V4dGVybiB2b2lkIHJlX3NldF9yZWdpc3RlcnMgKHN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciAqX19idWZmZXIsCisJCQkgICAgICBzdHJ1Y3QgcmVfcmVnaXN0ZXJzICpfX3JlZ3MsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgX19udW1fcmVncywKKwkJCSAgICAgIHJlZ29mZl90ICpfX3N0YXJ0cywgcmVnb2ZmX3QgKl9fZW5kcyk7CisKKyNpZiBkZWZpbmVkIF9SRUdFWF9SRV9DT01QIHx8IGRlZmluZWQgX0xJQkMKKyMgaWZuZGVmIF9DUkFZCisvKiA0LjIgYnNkIGNvbXBhdGliaWxpdHkuICAqLworZXh0ZXJuIGNoYXIgKnJlX2NvbXAgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IHJlX2V4ZWMgKGNvbnN0IGNoYXIgKik7CisjIGVuZGlmCisjZW5kaWYKKworLyogR0NDIDIuOTUgYW5kIGxhdGVyIGhhdmUgIl9fcmVzdHJpY3QiOyBDOTkgY29tcGlsZXJzIGhhdmUKKyAgICJyZXN0cmljdCIsIGFuZCAiY29uZmlndXJlIiBtYXkgaGF2ZSBkZWZpbmVkICJyZXN0cmljdCIuICAqLworI2lmbmRlZiBfX3Jlc3RyaWN0CisjIGlmICEgKDIgPCBfX0dOVUNfXyB8fCAoMiA9PSBfX0dOVUNfXyAmJiA5NSA8PSBfX0dOVUNfTUlOT1JfXykpCisjICBpZiBkZWZpbmVkIHJlc3RyaWN0IHx8IDE5OTkwMUwgPD0gX19TVERDX1ZFUlNJT05fXworIyAgIGRlZmluZSBfX3Jlc3RyaWN0IHJlc3RyaWN0CisjICBlbHNlCisjICAgZGVmaW5lIF9fcmVzdHJpY3QKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKy8qIGdjYyAzLjEgYW5kIHVwIHN1cHBvcnQgdGhlIFtyZXN0cmljdF0gc3ludGF4LiAgKi8KKyNpZm5kZWYgX19yZXN0cmljdF9hcnIKKyMgaWYgKF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSkgXAorICAgICAmJiAhZGVmaW5lZCBfX0dOVUdfXworIyAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyIF9fcmVzdHJpY3QKKyMgZWxzZQorIyAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCisjIGVuZGlmCisjZW5kaWYKKworLyogUE9TSVggY29tcGF0aWJpbGl0eS4gICovCitleHRlcm4gaW50IHJlZ2NvbXAgKHJlZ2V4X3QgKl9fcmVzdHJpY3QgX19wcmVnLAorCQkgICAgY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdHRlcm4sCisJCSAgICBpbnQgX19jZmxhZ3MpOworCitleHRlcm4gaW50IHJlZ2V4ZWMgKGNvbnN0IHJlZ2V4X3QgKl9fcmVzdHJpY3QgX19wcmVnLAorCQkgICAgY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywgc2l6ZV90IF9fbm1hdGNoLAorCQkgICAgcmVnbWF0Y2hfdCBfX3BtYXRjaFtfX3Jlc3RyaWN0X2Fycl0sCisJCSAgICBpbnQgX19lZmxhZ3MpOworCitleHRlcm4gc2l6ZV90IHJlZ2Vycm9yIChpbnQgX19lcnJjb2RlLCBjb25zdCByZWdleF90ICpfX3Jlc3RyaWN0IF9fcHJlZywKKwkJCWNoYXIgKl9fcmVzdHJpY3QgX19lcnJidWYsIHNpemVfdCBfX2VycmJ1Zl9zaXplKTsKKworZXh0ZXJuIHZvaWQgcmVnZnJlZSAocmVnZXhfdCAqX19wcmVnKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBDKysgKi8KKworI2VuZGlmIC8qIHJlZ2V4LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcmVnZXhwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjUwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JlZ2V4cC5oCkBAIC0wLDAgKzEsMjIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUkVHRVhQX0gKKyNkZWZpbmUgX1JFR0VYUF9ICTEKKworLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgaGVhZGVyIGZpbGUgd2FzIGZpcnN0IHN0YW5kYXJkaXplZCBpbiBYL09wZW4KKyAgIFN5c3RlbSBJbnRlcmZhY2UgYW5kIEhlYWRlcnMgSXNzdWUgMiwgb3JpZ2luYWxseSBjb21pbmcgZnJvbSBTeXNWLgorICAgSW4gaXNzdWUgNCwgdmVyc2lvbiAyLCBpdCBpcyBtYXJrZWQgYXMgVE8gQkUgV0lURFJBV04sIGFuZCBpdCBoYXMKKyAgIGJlZW4gd2l0aGRyYXduIGluIFNVU3YzLgorCisgICBUaGlzIGNvZGUgc2hvdWxkbid0IGJlIHVzZWQgaW4gYW55IG5ld2x5IHdyaXR0ZW4gY29kZS4gIEl0IGlzCisgICBpbmNsdWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICBVc2UgdGhlIFBPU0lYIGRlZmluaXRpb24KKyAgIGluIDxyZWdleC5oPiBmb3IgcG9ydGFibGUgYXBwbGljYXRpb25zIGFuZCBhIHJlYXNvbmFibGUgaW50ZXJmYWNlLiAgKi8KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGhlcmUgZW11bGF0ZXMgdGhlIG5lZWRlZCBmdW5jdGlvbmFsaXR5CisgICBieSBtYXBwaW5nIHRvIHRoZSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlci4gIFRoZSBpbnRlcmZhY2UKKyAgIGZvciB0aGUgaGVyZSBpbmNsdWRlZCBmdW5jdGlvbiBpcyB3ZWlyZCAodGhpcyByZWFsbHkgaXMgYSBoYXJtbGVzcworICAgd29yZCkuCisKKyAgIFRoZSB1c2VyIGhhcyB0byBwcm92aWRlIHNpeCBtYWNyb3MgYmVmb3JlIHRoaXMgaGVhZGVyIGZpbGUgY2FuIGJlCisgICBpbmNsdWRlZDoKKworICAgSU5JVAkJRGVjbGFyYXRpb25zIHZvciB2YXJpYWJsZXMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlCisJCW90aGVyIG1hY3Jvcy4KKworICAgR0VUQygpCVJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSByZWd1bGFyCisJCWV4cHJlc3Npb24gcGF0dGVybi4gIFN1Y2Nlc3NpdmUgY2FsbHMgc2hvdWxkIHJldHVybgorCQlzdWNjZXNzaXZlIGNoYXJhY3RlcnMuCisKKyAgIFBFRUtDKCkJUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHJlZ3VsYXIKKwkJZXhwcmVzc2lvbiBwYXR0ZXJuLiAgSW1tZWRpYXRlbHkgc3VjY2Vzc2l2ZSBjYWxscyB0bworCQlQRUVLQygpIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgY2hhcmFjdGVyIHdoaWNoIHNob3VsZAorCQlhbHNvIGJlIHRoZSBuZXh0IGNoYXJhY3RlciByZXR1cm5lZCBieSBHRVRDKCkuCisKKyAgIFVOR0VUQyhjKQlDYXVzZSBgYycgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG5leHQgY2FsbCB0byBHRVRDKCkgYW5kCisJCVBFRUtDKCkuCisKKyAgIFJFVFVSTihwdHIpCVVzZWQgZm9yIG5vcm1hbCBleGl0IG9mIHRoZSBgY29tcGlsZScgZnVuY3Rpb24uICBgcHRyJworCQlpcyBhIHBvaW50ZXIgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YKKwkJdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKworICAgRVJST1IodmFsKQlVc2VkIGZvciBhYm5vcm1hbCByZXR1cm4gZnJvbSBgY29tcGlsZScuICBgdmFsJyBpcyB0aGUKKwkJZXJyb3IgbnVtYmVyLiAgVGhlIGVycm9yIGNvZGVzIGFyZToKKwkJMTEJUmFuZ2UgZW5kcG9pbnQgdG9vIGxhcmdlLgorCQkxNglCYWQgbnVtYmVyLgorCQkyNQlcZGlnaXQgb3V0IG9mIHJhbmdlLgorCQkzNglJbGxlZ2FsIG9yIG1pc3NpbmcgZGVsaW1pdGVyLgorCQk0MQlObyByZW1lbWJlcmVkIHNlYXJjaCBzdHJpbmcuCisJCTQyCVwoIFwpIGltYmFsYW5jZS4KKwkJNDMJVG9vIG1hbnkgXCguCisJCTQ0CU1vcmUgdGFuIHR3byBudW1iZXJzIGdpdmVuIGluIFx7IFx9LgorCQk0NQl9IGV4cGVjdGVkIGFmdGVyIFwuCisJCTQ2CUZpcnN0IG51bWJlciBleGNlZWRzIHNlY29uZCBpbiBceyBcfS4KKwkJNDkJWyBdIGltYmFsYW5jZS4KKwkJNTAJUmVndWxhciBleHByZXNzaW9uIG92ZXJmbG93LgorCisgICovCisKK19fQkVHSU5fREVDTFMKKworLyogSW50ZXJmYWNlIHZhcmlhYmxlcy4gIFRoZXkgY29udGFpbiB0aGUgcmVzdWx0cyBvZiB0aGUgc3VjY2Vzc2Z1bAorICAgY2FsbHMgdG8gYHNldHAnIGFuZCBgYWR2YW5jZScuICAqLworZXh0ZXJuIGNoYXIgKmxvYzE7CitleHRlcm4gY2hhciAqbG9jMjsKKworLyogVGhlIHVzZSBvZiB0aGlzIHZhcmlhYmxlIGluIHRoZSBgYWR2YW5jZScgZnVuY3Rpb24gaXMgbm90CisgICBzdXBwb3J0ZWQuICAqLworZXh0ZXJuIGNoYXIgKmxvY3M7CisKKworI2lmbmRlZiBfX0RPX05PVF9ERUZJTkVfQ09NUElMRQorLyogR2V0IGFuZCBjb21waWxlIHRoZSB1c2VyIHN1cHBsaWVkIHBhdHRlcm4gdXAgdG8gZW5kIG9mIGxpbmUgb3IKKyAgIHN0cmluZyBvciB1bnRpbCBFT0YgaXMgc2Vlbiwgd2hhdGV2ZXIgaGFwcGVucyBmaXJzdC4gIFRoZSByZXN1bHQgaXMKKyAgIHBsYWNlZCBpbiB0aGUgYnVmZmVyIHN0YXJ0aW5nIGF0IEVYUEJVRiBhbmQgZGVsaW1pdGVkIGJ5IEVOREJVRi4KKworICAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgZGVmaW5lZCBpbiB0aGUgbGliYyBpdHNlbGYgc2luY2UgaXQgZGVwZW5kcworICAgb24gdGhlIG1hY3Jvcy4gICovCitjaGFyICoKK2NvbXBpbGUgKGNoYXIgKl9fcmVzdHJpY3QgaW5zdHJpbmcsIGNoYXIgKl9fcmVzdHJpY3QgZXhwYnVmLAorCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgZW5kYnVmLCBpbnQgZW9mKQoreworICBjaGFyICpfX2lucHV0X2J1ZmZlciA9IE5VTEw7CisgIHNpemVfdCBfX2lucHV0X3NpemUgPSAwOworICBzaXplX3QgX19jdXJyZW50X3NpemUgPSAwOworICBpbnQgX19jaDsKKyAgaW50IF9fZXJyb3I7CisgIElOSVQKKworICAvKiBBbGlnbiB0aGUgZXhwcmVzc2lvbiBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBuZWVkcyBmb3IgYW4gb2JqZWN0CisgICAgIG9mIHR5cGUgYHJlZ2V4X3QnLiAgVGhlbiBjaGVjayBmb3IgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIgZm9yCisgICAgIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24uICAqLworICByZWdleF90ICpfX2V4cHJfcHRyOworIyBpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyAgY29uc3Qgc2l6ZV90IF9fcmVxID0gX19hbGlnbm9mX18gKHJlZ2V4X3QgKik7CisjIGVsc2UKKyAgLyogSG93IHNoYWxsIHdlIGZpbmQgb3V0PyAgV2Ugc2ltcGx5IGd1ZXNzIGl0IGFuZCBjYW4gY2hhbmdlIGl0IGlzCisgICAgIHRoaXMgcmVhbGx5IHByb29mcyB0byBiZSB3cm9uZy4gICovCisgIGNvbnN0IHNpemVfdCBfX3JlcSA9IDg7CisjIGVuZGlmCisgIGV4cGJ1ZiArPSBfX3JlcTsKKyAgZXhwYnVmIC09IChleHBidWYgLSAoKGNoYXIgKikgMCkpICUgX19yZXE7CisgIGlmIChlbmRidWYgPCBleHBidWYgKyBzaXplb2YgKHJlZ2V4X3QpKQorICAgIHsKKyAgICAgIEVSUk9SICg1MCk7CisgICAgfQorICBfX2V4cHJfcHRyID0gKHJlZ2V4X3QgKikgZXhwYnVmOworICAvKiBUaGUgcmVtYWluaW5nIHNwYWNlIGluIHRoZSBidWZmZXIgY2FuIGJlIHVzZWQgZm9yIHRoZSBjb21waWxlZAorICAgICBwYXR0ZXJuLiAgKi8KKyAgX19leHByX3B0ci0+YnVmZmVyID0gZXhwYnVmICsgc2l6ZW9mIChyZWdleF90KTsKKyAgX19leHByX3B0ci0+YWxsb2NhdGVkID0gZW5kYnVmIC0gIChjaGFyICopIF9fZXhwcl9wdHItPmJ1ZmZlcjsKKworICB3aGlsZSAoKF9fY2ggPSAoR0VUQyAoKSkpICE9IGVvZikKKyAgICB7CisgICAgICBpZiAoX19jaCA9PSAnXDAnIHx8IF9fY2ggPT0gJ1xuJykKKwl7CisJICBVTkdFVEMgKF9fY2gpOworCSAgYnJlYWs7CisJfQorCisgICAgICBpZiAoX19jdXJyZW50X3NpemUgKyAxID49IF9faW5wdXRfc2l6ZSkKKwl7CisJICBzaXplX3QgX19uZXdfc2l6ZSA9IF9faW5wdXRfc2l6ZSA/IDIgKiBfX2lucHV0X3NpemUgOiAxMjg7CisJICBjaGFyICpfX25ld19yb29tID0gKGNoYXIgKikgYWxsb2NhIChfX25ld19zaXplKTsKKwkgIC8qIFNlZSB3aGV0aGVyIHdlIGNhbiB1c2UgdGhlIG9sZCBidWZmZXIuICAqLworCSAgaWYgKF9fbmV3X3Jvb20gKyBfX25ld19zaXplID09IF9faW5wdXRfYnVmZmVyKQorCSAgICB7CisJICAgICAgX19pbnB1dF9zaXplICs9IF9fbmV3X3NpemU7CisJICAgICAgX19pbnB1dF9idWZmZXIgPSAoY2hhciAqKSBtZW1jcHkgKF9fbmV3X3Jvb20sIF9faW5wdXRfYnVmZmVyLAorCQkJCQkgICAgICAgX19jdXJyZW50X3NpemUpOworCSAgICB9CisJICBlbHNlIGlmIChfX2lucHV0X2J1ZmZlciArIF9faW5wdXRfc2l6ZSA9PSBfX25ld19yb29tKQorCSAgICBfX2lucHV0X3NpemUgKz0gX19uZXdfc2l6ZTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9faW5wdXRfc2l6ZSA9IF9fbmV3X3NpemU7CisJICAgICAgX19pbnB1dF9idWZmZXIgPSAoY2hhciAqKSBtZW1jcHkgKF9fbmV3X3Jvb20sIF9faW5wdXRfYnVmZmVyLAorCQkJCQkJX19jdXJyZW50X3NpemUpOworCSAgICB9CisJfQorICAgICAgX19pbnB1dF9idWZmZXJbX19jdXJyZW50X3NpemUrK10gPSBfX2NoOworICAgIH0KKyAgX19pbnB1dF9idWZmZXJbX19jdXJyZW50X3NpemUrK10gPSAnXDAnOworCisgIC8qIE5vdyBjb21waWxlIHRoZSBwYXR0ZXJuLiAgKi8KKyAgX19lcnJvciA9IHJlZ2NvbXAgKF9fZXhwcl9wdHIsIF9faW5wdXRfYnVmZmVyLCBSRUdfTkVXTElORSk7CisgIGlmIChfX2Vycm9yICE9IDApCisgICAgLyogT2ggd2VsbCwgd2UgaGF2ZSB0byB0cmFuc2xhdGUgUE9TSVggZXJyb3IgY29kZXMuICAqLworICAgIHN3aXRjaCAoX19lcnJvcikKKyAgICAgIHsKKyAgICAgIGNhc2UgUkVHX0JBRFBBVDoKKyAgICAgIGNhc2UgUkVHX0VDT0xMQVRFOgorICAgICAgY2FzZSBSRUdfRUNUWVBFOgorICAgICAgY2FzZSBSRUdfRUVTQ0FQRToKKyAgICAgIGNhc2UgUkVHX0JBRFJQVDoKKyAgICAgIGNhc2UgUkVHX0VFTkQ6CisgICAgICBjYXNlIFJFR19FUlBBUkVOOgorICAgICAgZGVmYXVsdDoKKwkvKiBUaGVyZSBpcyBubyBtYXRjaGluZyBlcnJvciBjb2RlLiAgKi8KKwlSRVRVUk4gKDM2KTsKKyAgICAgIGNhc2UgUkVHX0VTVUJSRUc6CisJUkVUVVJOICgyNSk7CisgICAgICBjYXNlIFJFR19FQlJBQ0s6CisJUkVUVVJOICg0OSk7CisgICAgICBjYXNlIFJFR19FUEFSRU46CisJUkVUVVJOICg0Mik7CisgICAgICBjYXNlIFJFR19FQlJBQ0U6CisJUkVUVVJOICg0NCk7CisgICAgICBjYXNlIFJFR19CQURCUjoKKwlSRVRVUk4gKDQ2KTsKKyAgICAgIGNhc2UgUkVHX0VSQU5HRToKKwlSRVRVUk4gKDExKTsKKyAgICAgIGNhc2UgUkVHX0VTUEFDRToKKyAgICAgIGNhc2UgUkVHX0VTSVpFOgorCUVSUk9SICg1MCk7CisgICAgICB9CisKKyAgLyogRXZlcnl0aGluZyBpcyBvay4gICovCisgIFJFVFVSTiAoKGNoYXIgKikgKF9fZXhwcl9wdHItPmJ1ZmZlciArIF9fZXhwcl9wdHItPnVzZWQpKTsKK30KKyNlbmRpZgorCisKKy8qIEZpbmQgdGhlIG5leHQgbWF0Y2ggaW4gU1RSSU5HLiAgVGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcworICAgZm91bmQgaW4gdGhlIGJ1ZmZlciBzdGFydGluZyBhdCBFWFBCVUYuICBgbG9jMScgd2lsbCByZXR1cm4gdGhlCisgICBmaXJzdCBjaGFyYWN0ZXIgbWF0Y2hlZCBhbmQgYGxvYzInIHBvaW50cyB0byB0aGUgbmV4dCB1bm1hdGNoZWQKKyAgIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IHN0ZXAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3N0cmluZywKKwkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2V4cGJ1ZikgX19USFJPVzsKKworLyogTWF0Y2ggdGhlIGJlZ2lubmluZyBvZiBTVFJJTkcgd2l0aCB0aGUgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uCisgICBpbiBFWFBCVUYuICBJZiB0aGUgbWF0Y2ggaXMgc3VjY2Vzc2Z1bCBgbG9jMicgd2lsbCBjb250YWluIHRoZQorICAgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHVubWF0Y2hlZCBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBhZHZhbmNlIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsCisJCSAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19leHBidWYpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJlZ2V4cC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Jlc29sdi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZXNvbHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU2MzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9yZXNvbHYuaApAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk4NywgMTk4OQorICogICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSU5URVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBESVNDTEFJTVMKKyAqIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgSU5URVJORVQgU09GVFdBUkUKKyAqIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworICogQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqLworCisvKgorICoJQCgjKXJlc29sdi5oCTguMSAoQmVya2VsZXkpIDYvMi85MworICoJJEJJTkRJZDogcmVzb2x2LmgsdiA4LjMxIDIwMDAvMDMvMzAgMjA6MTY6NTAgdml4aWUgRXhwICQKKyAqLworCisjaWZuZGVmIF9SRVNPTFZfSF8KKworLyogVGhlc2UgaGVhZGVycyBhcmUgbmVlZGVkIGZvciB0eXBlcyB1c2VkIGluIHRoZSBgc3RydWN0IHJlc19zdGF0ZScKKyAgIGRlY2xhcmF0aW9uLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpZm5kZWYgX19uZWVkX3Jlc19zdGF0ZQorIyBkZWZpbmUgX1JFU09MVl9IXworCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyBpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyMgaW5jbHVkZSA8c3RkaW8uaD4KKyMgaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisjZW5kaWYKKworI2lmbmRlZiBfX3Jlc19zdGF0ZV9kZWZpbmVkCisjIGRlZmluZSBfX3Jlc19zdGF0ZV9kZWZpbmVkCisKK3R5cGVkZWYgZW51bSB7IHJlc19nb2FoZWFkLCByZXNfbmV4dG5zLCByZXNfbW9kaWZpZWQsIHJlc19kb25lLCByZXNfZXJyb3IgfQorCXJlc19zZW5kaG9va2FjdDsKKwordHlwZWRlZiByZXNfc2VuZGhvb2thY3QgKCpyZXNfc2VuZF9xaG9vaykgKHN0cnVjdCBzb2NrYWRkcl9pbiAqIGNvbnN0ICpucywKKwkJCQkJICAgY29uc3QgdV9jaGFyICoqcXVlcnksCisJCQkJCSAgIGludCAqcXVlcnlsZW4sCisJCQkJCSAgIHVfY2hhciAqYW5zLAorCQkJCQkgICBpbnQgYW5zc2l6LAorCQkJCQkgICBpbnQgKnJlc3BsZW4pOworCit0eXBlZGVmIHJlc19zZW5kaG9va2FjdCAoKnJlc19zZW5kX3Job29rKSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpucywKKwkJCQkJICAgY29uc3QgdV9jaGFyICpxdWVyeSwKKwkJCQkJICAgaW50IHF1ZXJ5bGVuLAorCQkJCQkgICB1X2NoYXIgKmFucywKKwkJCQkJICAgaW50IGFuc3NpeiwKKwkJCQkJICAgaW50ICpyZXNwbGVuKTsKKworLyoKKyAqIEdsb2JhbCBkZWZpbmVzIGFuZCB2YXJpYWJsZXMgZm9yIHJlc29sdmVyIHN0dWIuCisgKi8KKyMgZGVmaW5lIE1BWE5TCQkJMwkvKiBtYXggIyBuYW1lIHNlcnZlcnMgd2UnbGwgdHJhY2sgKi8KKyMgZGVmaW5lIE1BWERGTFNSQ0gJCTMJLyogIyBkZWZhdWx0IGRvbWFpbiBsZXZlbHMgdG8gdHJ5ICovCisjIGRlZmluZSBNQVhETlNSQ0gJCTYJLyogbWF4ICMgZG9tYWlucyBpbiBzZWFyY2ggcGF0aCAqLworIyBkZWZpbmUgTE9DQUxET01BSU5QQVJUUwkyCS8qIG1pbiBsZXZlbHMgaW4gbmFtZSB0aGF0IGlzICJsb2NhbCIgKi8KKworIyBkZWZpbmUgUkVTX1RJTUVPVVQJCTUJLyogbWluLiBzZWNvbmRzIGJldHdlZW4gcmV0cmllcyAqLworIyBkZWZpbmUgTUFYUkVTT0xWU09SVAkJMTAJLyogbnVtYmVyIG9mIG5ldCB0byBzb3J0IG9uICovCisjIGRlZmluZSBSRVNfTUFYTkRPVFMJCTE1CS8qIHNob3VsZCByZWZsZWN0IGJpdCBmaWVsZCBzaXplICovCisjIGRlZmluZSBSRVNfTUFYUkVUUkFOUwkJMzAJLyogb25seSBmb3IgcmVzb2x2LmNvbmYvUkVTX09QVElPTlMgKi8KKyMgZGVmaW5lIFJFU19NQVhSRVRSWQkJNQkvKiBvbmx5IGZvciByZXNvbHYuY29uZi9SRVNfT1BUSU9OUyAqLworIyBkZWZpbmUgUkVTX0RGTFJFVFJZCQkyCS8qIERlZmF1bHQgIy90cmllcy4gKi8KKyMgZGVmaW5lIFJFU19NQVhUSU1FCQk2NTUzNQkvKiBJbmZpbml0eSwgaW4gbWlsbGlzZWNvbmRzLiAqLworCitzdHJ1Y3QgX19yZXNfc3RhdGUgeworCWludAlyZXRyYW5zOwkgCS8qIHJldHJhbnNtaXRpb24gdGltZSBpbnRlcnZhbCAqLworCWludAlyZXRyeTsJCQkvKiBudW1iZXIgb2YgdGltZXMgdG8gcmV0cmFuc21pdCAqLworCXVfbG9uZwlvcHRpb25zOwkJLyogb3B0aW9uIGZsYWdzIC0gc2VlIGJlbG93LiAqLworCWludAluc2NvdW50OwkJLyogbnVtYmVyIG9mIG5hbWUgc2VydmVycyAqLworCXN0cnVjdCBzb2NrYWRkcl9pbgorCQluc2FkZHJfbGlzdFtNQVhOU107CS8qIGFkZHJlc3Mgb2YgbmFtZSBzZXJ2ZXIgKi8KKyMgZGVmaW5lIG5zYWRkcgluc2FkZHJfbGlzdFswXQkJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwl1X3Nob3J0CWlkOwkJCS8qIGN1cnJlbnQgbWVzc2FnZSBpZCAqLworCS8qIDIgYnl0ZSBob2xlIGhlcmUuICAqLworCWNoYXIJKmRuc3JjaFtNQVhETlNSQ0grMV07CS8qIGNvbXBvbmVudHMgb2YgZG9tYWluIHRvIHNlYXJjaCAqLworCWNoYXIJZGVmZG5hbWVbMjU2XTsJCS8qIGRlZmF1bHQgZG9tYWluIChkZXByZWNhdGVkKSAqLworCXVfbG9uZwlwZmNvZGU7CQkJLyogUkVTX1BSRl8gZmxhZ3MgLSBzZWUgYmVsb3cuICovCisJdW5zaWduZWQgbmRvdHM6NDsJCS8qIHRocmVzaG9sZCBmb3IgaW5pdGlhbCBhYnMuIHF1ZXJ5ICovCisJdW5zaWduZWQgbnNvcnQ6NDsJCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBzb3J0X2xpc3RbXSAqLworCXVuc2lnbmVkIGlwdjZfdW5hdmFpbDoxOwkvKiBjb25uZWN0aW5nIHRvIElQdjYgc2VydmVyIGZhaWxlZCAqLworCXVuc2lnbmVkIHVudXNlZDoyMzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaW5fYWRkcglhZGRyOworCQl1X2ludDMyX3QJbWFzazsKKwl9IHNvcnRfbGlzdFtNQVhSRVNPTFZTT1JUXTsKKwkvKiA0IGJ5dGUgaG9sZSBoZXJlIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKwlyZXNfc2VuZF9xaG9vayBxaG9vazsJCS8qIHF1ZXJ5IGhvb2sgKi8KKwlyZXNfc2VuZF9yaG9vayByaG9vazsJCS8qIHJlc3BvbnNlIGhvb2sgKi8KKwlpbnQJcmVzX2hfZXJybm87CQkvKiBsYXN0IG9uZSBzZXQgZm9yIHRoaXMgY29udGV4dCAqLworCWludAlfdmNzb2NrOwkJLyogUFJJVkFURTogZm9yIHJlc19zZW5kIFZDIGkvbyAqLworCXVfaW50CV9mbGFnczsJCQkvKiBQUklWQVRFOiBzZWUgYmVsb3cgKi8KKwkvKiA0IGJ5dGUgaG9sZSBoZXJlIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKwl1bmlvbiB7CisJCWNoYXIJcGFkWzUyXTsJLyogT24gYW4gaTM4NiB0aGlzIG1lYW5zIDUxMmIgdG90YWwuICovCisJCXN0cnVjdCB7CisJCQl1X2ludDE2X3QJCW5zY291bnQ7CisJCQl1X2ludDE2X3QJCW5zbWFwW01BWE5TXTsKKwkJCWludAkJCW5zc29ja3NbTUFYTlNdOworCQkJdV9pbnQxNl90CQluc2NvdW50NjsKKwkJCXVfaW50MTZfdAkJbnNpbml0OworCQkJc3RydWN0IHNvY2thZGRyX2luNgkqbnNhZGRyc1tNQVhOU107CisjaWZkZWYgX0xJQkMKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJaW5pdHN0YW1wCisJCQkgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2Vsc2UKKwkJCXVuc2lnbmVkIGludAkJX2luaXRzdGFtcFsyXTsKKyNlbmRpZgorCQl9IF9leHQ7CisJfSBfdTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fcmVzX3N0YXRlICpyZXNfc3RhdGU7CisjIHVuZGVmIF9fbmVlZF9yZXNfc3RhdGUKKyNlbmRpZgorCisjaWZkZWYgX1JFU09MVl9IXworLyoKKyAqIFJldmlzaW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpcyB0aGUgcmVsZWFzZSBkYXRlIGluIFlZWVlNTUREIGZvcm1hdC4KKyAqIEl0IGNhbiBjaGFuZ2UgZXZlcnkgZGF5IHNvIHRoZSByaWdodCB0aGluZyB0byBkbyB3aXRoIGl0IGlzIHVzZSBpdAorICogaW4gcHJlcHJvY2Vzc29yIGNvbW1hbmRzIHN1Y2ggYXMgIiNpZiAoX19SRVMgPiAxOTkzMTEwNCkiLiAgRG8gbm90CisgKiBjb21wYXJlIGZvciBlcXVhbGl0eTsgcmF0aGVyLCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgeW91ciByZXNvbHZlcgorICogaXMgbmV3IGVub3VnaCB0byBjb250YWluIGEgY2VydGFpbiBmZWF0dXJlLgorICovCisKKyNkZWZpbmUJX19SRVMJMTk5OTEwMDYKKworLyoKKyAqIFJlc29sdmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIE5vcm1hbGx5IG5vdCBwcmVzZW50LCBidXQgbWF5IGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlCisgKiBpbml0YWwgbmFtZSBzZXJ2ZXIocykgdG8gcXVlcnkgYW5kIHRoZSBkb21haW4gc2VhcmNoIGxpc3QuCisgKi8KKworI2lmbmRlZiBfUEFUSF9SRVNDT05GCisjZGVmaW5lIF9QQVRIX1JFU0NPTkYgICAgICAgICIvZXRjL3Jlc29sdi5jb25mIgorI2VuZGlmCisKK3N0cnVjdCByZXNfc3ltIHsKKwlpbnQJbnVtYmVyOwkJLyogSWRlbnRpZnlpbmcgbnVtYmVyLCBsaWtlIFRfTVggKi8KKwljaGFyICoJbmFtZTsJCS8qIEl0cyBzeW1ib2xpYyBuYW1lLCBsaWtlICJNWCIgKi8KKwljaGFyICoJaHVtYW5uYW1lOwkvKiBJdHMgZnVuIG5hbWUsIGxpa2UgIm1haWwgZXhjaGFuZ2VyIiAqLworfTsKKworLyoKKyAqIFJlc29sdmVyIGZsYWdzICh1c2VkIHRvIGJlIGRpc2NyZXRlIHBlci1tb2R1bGUgc3RhdGljcyBpbnRzKS4KKyAqLworI2RlZmluZQlSRVNfRl9WQwkweDAwMDAwMDAxCS8qIHNvY2tldCBpcyBUQ1AgKi8KKyNkZWZpbmUJUkVTX0ZfQ09OTgkweDAwMDAwMDAyCS8qIHNvY2tldCBpcyBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgUkVTX0ZfRUROUzBFUlIJMHgwMDAwMDAwNAkvKiBFRE5TMCBjYXVzZWQgZXJyb3JzICovCisKKy8qIHJlc19maW5kem9uZWN1dCgpIG9wdGlvbnMgKi8KKyNkZWZpbmUJUkVTX0VYSEFVU1RJVkUJMHgwMDAwMDAwMQkvKiBhbHdheXMgZG8gYWxsIHF1ZXJpZXMgKi8KKworLyoKKyAqIFJlc29sdmVyIG9wdGlvbnMgKGtlZXAgdGhlc2UgaW4gc3luY2ggd2l0aCByZXNfZGVidWcuYywgcGxlYXNlKQorICovCisjZGVmaW5lIFJFU19JTklUCTB4MDAwMDAwMDEJLyogYWRkcmVzcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBSRVNfREVCVUcJMHgwMDAwMDAwMgkvKiBwcmludCBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBSRVNfQUFPTkxZCTB4MDAwMDAwMDQJLyogYXV0aG9yaXRhdGl2ZSBhbnN3ZXJzIG9ubHkgKCFJTVBMKSovCisjZGVmaW5lIFJFU19VU0VWQwkweDAwMDAwMDA4CS8qIHVzZSB2aXJ0dWFsIGNpcmN1aXQgKi8KKyNkZWZpbmUgUkVTX1BSSU1BUlkJMHgwMDAwMDAxMAkvKiBxdWVyeSBwcmltYXJ5IHNlcnZlciBvbmx5ICghSU1QTCkgKi8KKyNkZWZpbmUgUkVTX0lHTlRDCTB4MDAwMDAwMjAJLyogaWdub3JlIHRydWNhdGlvbiBlcnJvcnMgKi8KKyNkZWZpbmUgUkVTX1JFQ1VSU0UJMHgwMDAwMDA0MAkvKiByZWN1cnNpb24gZGVzaXJlZCAqLworI2RlZmluZSBSRVNfREVGTkFNRVMJMHgwMDAwMDA4MAkvKiB1c2UgZGVmYXVsdCBkb21haW4gbmFtZSAqLworI2RlZmluZSBSRVNfU1RBWU9QRU4JMHgwMDAwMDEwMAkvKiBLZWVwIFRDUCBzb2NrZXQgb3BlbiAqLworI2RlZmluZSBSRVNfRE5TUkNICTB4MDAwMDAyMDAJLyogc2VhcmNoIHVwIGxvY2FsIGRvbWFpbiB0cmVlICovCisjZGVmaW5lCVJFU19JTlNFQ1VSRTEJMHgwMDAwMDQwMAkvKiB0eXBlIDEgc2VjdXJpdHkgZGlzYWJsZWQgKi8KKyNkZWZpbmUJUkVTX0lOU0VDVVJFMgkweDAwMDAwODAwCS8qIHR5cGUgMiBzZWN1cml0eSBkaXNhYmxlZCAqLworI2RlZmluZQlSRVNfTk9BTElBU0VTCTB4MDAwMDEwMDAJLyogc2h1dHMgb2ZmIEhPU1RBTElBU0VTIGZlYXR1cmUgKi8KKyNkZWZpbmUJUkVTX1VTRV9JTkVUNgkweDAwMDAyMDAwCS8qIHVzZS9tYXAgSVB2NiBpbiBnZXRob3N0YnluYW1lKCkgKi8KKyNkZWZpbmUgUkVTX1JPVEFURQkweDAwMDA0MDAwCS8qIHJvdGF0ZSBucyBsaXN0IGFmdGVyIGVhY2ggcXVlcnkgKi8KKyNkZWZpbmUJUkVTX05PQ0hFQ0tOQU1FCTB4MDAwMDgwMDAJLyogZG8gbm90IGNoZWNrIG5hbWVzIGZvciBzYW5pdHkuICovCisjZGVmaW5lCVJFU19LRUVQVFNJRwkweDAwMDEwMDAwCS8qIGRvIG5vdCBzdHJpcCBUU0lHIHJlY29yZHMgKi8KKyNkZWZpbmUJUkVTX0JMQVNUCTB4MDAwMjAwMDAJLyogYmxhc3QgYWxsIHJlY3Vyc2l2ZSBzZXJ2ZXJzICovCisjZGVmaW5lIFJFU19VU0VCU1RSSU5HCTB4MDAwNDAwMDAJLyogSVB2NiByZXZlcnNlIGxvb2t1cCB3aXRoIGJ5dGUKKwkJCQkJICAgc3RyaW5ncyAqLworI2RlZmluZSBSRVNfTk9JUDZET1RJTlQJMHgwMDA4MDAwMAkvKiBEbyBub3QgdXNlIC5pcDYuaW50IGluIElQdjYKKwkJCQkJICAgcmV2ZXJzZSBsb29rdXAgKi8KKyNkZWZpbmUgUkVTX1VTRV9FRE5TMAkweDAwMTAwMDAwCS8qIFVzZSBFRE5TMC4gICovCisKKyNkZWZpbmUgUkVTX0RFRkFVTFQJKFJFU19SRUNVUlNFfFJFU19ERUZOQU1FU3xSRVNfRE5TUkNIfFJFU19OT0lQNkRPVElOVCkKKworLyoKKyAqIFJlc29sdmVyICJwZmNvZGUiIHZhbHVlcy4gIFVzZWQgYnkgZGlnLgorICovCisjZGVmaW5lIFJFU19QUkZfU1RBVFMJMHgwMDAwMDAwMQorI2RlZmluZSBSRVNfUFJGX1VQREFURQkweDAwMDAwMDAyCisjZGVmaW5lIFJFU19QUkZfQ0xBU1MgICAweDAwMDAwMDA0CisjZGVmaW5lIFJFU19QUkZfQ01ECTB4MDAwMDAwMDgKKyNkZWZpbmUgUkVTX1BSRl9RVUVTCTB4MDAwMDAwMTAKKyNkZWZpbmUgUkVTX1BSRl9BTlMJMHgwMDAwMDAyMAorI2RlZmluZSBSRVNfUFJGX0FVVEgJMHgwMDAwMDA0MAorI2RlZmluZSBSRVNfUFJGX0FERAkweDAwMDAwMDgwCisjZGVmaW5lIFJFU19QUkZfSEVBRDEJMHgwMDAwMDEwMAorI2RlZmluZSBSRVNfUFJGX0hFQUQyCTB4MDAwMDAyMDAKKyNkZWZpbmUgUkVTX1BSRl9UVExJRAkweDAwMDAwNDAwCisjZGVmaW5lIFJFU19QUkZfSEVBRFgJMHgwMDAwMDgwMAorI2RlZmluZSBSRVNfUFJGX1FVRVJZCTB4MDAwMDEwMDAKKyNkZWZpbmUgUkVTX1BSRl9SRVBMWQkweDAwMDAyMDAwCisjZGVmaW5lIFJFU19QUkZfSU5JVAkweDAwMDA0MDAwCisvKgkJCTB4MDAwMDgwMDAJKi8KKworLyogVGhpbmdzIGludm9sdmluZyBhbiBpbnRlcm5hbCAoc3RhdGljKSByZXNvbHZlciBjb250ZXh0LiAqLworX19CRUdJTl9ERUNMUworZXh0ZXJuIHN0cnVjdCBfX3Jlc19zdGF0ZSAqX19yZXNfc3RhdGUodm9pZCkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworX19FTkRfREVDTFMKKyNkZWZpbmUgX3JlcyAoKl9fcmVzX3N0YXRlKCkpCisKKyNpZm5kZWYgX19CSU5EX05PU1RBVElDCisjZGVmaW5lIGZwX25xdWVyeQkJX19mcF9ucXVlcnkKKyNkZWZpbmUgZnBfcXVlcnkJCV9fZnBfcXVlcnkKKyNkZWZpbmUgaG9zdGFsaWFzCQlfX2hvc3RhbGlhcworI2RlZmluZSBwX3F1ZXJ5CQkJX19wX3F1ZXJ5CisjZGVmaW5lIHJlc19jbG9zZQkJX19yZXNfY2xvc2UKKyNkZWZpbmUgcmVzX2luaXQJCV9fcmVzX2luaXQKKyNkZWZpbmUgcmVzX2lzb3Vyc2VydmVyCQlfX3Jlc19pc291cnNlcnZlcgorI2RlZmluZSByZXNfbWtxdWVyeQkJX19yZXNfbWtxdWVyeQorI2RlZmluZSByZXNfcXVlcnkJCV9fcmVzX3F1ZXJ5CisjZGVmaW5lIHJlc19xdWVyeWRvbWFpbgkJX19yZXNfcXVlcnlkb21haW4KKyNkZWZpbmUgcmVzX3NlYXJjaAkJX19yZXNfc2VhcmNoCisjZGVmaW5lIHJlc19zZW5kCQlfX3Jlc19zZW5kCisKK19fQkVHSU5fREVDTFMKK3ZvaWQJCWZwX25xdWVyeSAoY29uc3QgdV9jaGFyICosIGludCwgRklMRSAqKSBfX1RIUk9XOwordm9pZAkJZnBfcXVlcnkgKGNvbnN0IHVfY2hhciAqLCBGSUxFICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJaG9zdGFsaWFzIChjb25zdCBjaGFyICopIF9fVEhST1c7Cit2b2lkCQlwX3F1ZXJ5IChjb25zdCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCXJlc19jbG9zZSAodm9pZCkgX19USFJPVzsKK2ludAkJcmVzX2luaXQgKHZvaWQpIF9fVEhST1c7CitpbnQJCXJlc19pc291cnNlcnZlciAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIF9fVEhST1c7CitpbnQJCXJlc19ta3F1ZXJ5IChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGNvbnN0IHVfY2hhciAqLAorCQkJICAgICBpbnQsIGNvbnN0IHVfY2hhciAqLCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfcXVlcnkgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIHVfY2hhciAqLCBpbnQpIF9fVEhST1c7CitpbnQJCXJlc19xdWVyeWRvbWFpbiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LAorCQkJCSB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfc2VhcmNoIChjb25zdCBjaGFyICosIGludCwgaW50LCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfc2VuZCAoY29uc3QgdV9jaGFyICosIGludCwgdV9jaGFyICosIGludCkgX19USFJPVzsKK19fRU5EX0RFQ0xTCisjZW5kaWYKKworI2RlZmluZSBiNjRfbnRvcAkJX19iNjRfbnRvcAorI2RlZmluZSBiNjRfcHRvbgkJX19iNjRfcHRvbgorI2RlZmluZSBkbl9jb21wCQkJX19kbl9jb21wCisjZGVmaW5lIGRuX2NvdW50X2xhYmVscwkJX19kbl9jb3VudF9sYWJlbHMKKyNkZWZpbmUgZG5fZXhwYW5kCQlfX2RuX2V4cGFuZAorI2RlZmluZSBkbl9za2lwbmFtZQkJX19kbl9za2lwbmFtZQorI2RlZmluZSBmcF9yZXNzdGF0CQlfX2ZwX3Jlc3N0YXQKKyNkZWZpbmUgbG9jX2F0b24JCV9fbG9jX2F0b24KKyNkZWZpbmUgbG9jX250b2EJCV9fbG9jX250b2EKKyNkZWZpbmUgcF9jZG5hbWUJCV9fcF9jZG5hbWUKKyNkZWZpbmUgcF9jZG5uYW1lCQlfX3BfY2RubmFtZQorI2RlZmluZSBwX2NsYXNzCQkJX19wX2NsYXNzCisjZGVmaW5lIHBfZnFuYW1lCQlfX3BfZnFuYW1lCisjZGVmaW5lIHBfZnFubmFtZQkJX19wX2Zxbm5hbWUKKyNkZWZpbmUgcF9vcHRpb24JCV9fcF9vcHRpb24KKyNkZWZpbmUgcF9zZWNzdG9kYXRlCQlfX3Bfc2Vjc3RvZGF0ZQorI2RlZmluZSBwX3NlY3Rpb24JCV9fcF9zZWN0aW9uCisjZGVmaW5lIHBfdGltZQkJCV9fcF90aW1lCisjZGVmaW5lIHBfdHlwZQkJCV9fcF90eXBlCisjZGVmaW5lIHBfcmNvZGUJCQlfX3BfcmNvZGUKKyNkZWZpbmUgcHV0bG9uZwkJCV9fcHV0bG9uZworI2RlZmluZSBwdXRzaG9ydAkJX19wdXRzaG9ydAorI2RlZmluZSByZXNfZG5vawkJX19yZXNfZG5vaworI2RlZmluZSByZXNfaG5vawkJX19yZXNfaG5vaworI2RlZmluZSByZXNfaG9zdGFsaWFzCQlfX3Jlc19ob3N0YWxpYXMKKyNkZWZpbmUgcmVzX21haWxvawkJX19yZXNfbWFpbG9rCisjZGVmaW5lIHJlc19uYW1laW5xdWVyeQkJX19yZXNfbmFtZWlucXVlcnkKKyNkZWZpbmUgcmVzX25jbG9zZQkJX19yZXNfbmNsb3NlCisjZGVmaW5lIHJlc19uaW5pdAkJX19yZXNfbmluaXQKKyNkZWZpbmUgcmVzX25ta3F1ZXJ5CQlfX3Jlc19ubWtxdWVyeQorI2RlZmluZSByZXNfbnBxdWVyeQkJX19yZXNfbnBxdWVyeQorI2RlZmluZSByZXNfbnF1ZXJ5CQlfX3Jlc19ucXVlcnkKKyNkZWZpbmUgcmVzX25xdWVyeWRvbWFpbglfX3Jlc19ucXVlcnlkb21haW4KKyNkZWZpbmUgcmVzX25zZWFyY2gJCV9fcmVzX25zZWFyY2gKKyNkZWZpbmUgcmVzX25zZW5kCQlfX3Jlc19uc2VuZAorI2RlZmluZSByZXNfbmlzb3Vyc2VydmVyCV9fcmVzX25pc291cnNlcnZlcgorI2RlZmluZSByZXNfb3dub2sJCV9fcmVzX293bm9rCisjZGVmaW5lIHJlc19xdWVyaWVzbWF0Y2gJX19yZXNfcXVlcmllc21hdGNoCisjZGVmaW5lIHJlc19yYW5kb21pZAkJX19yZXNfcmFuZG9taWQKKyNkZWZpbmUgc3ltX250b3AJCV9fc3ltX250b3AKKyNkZWZpbmUgc3ltX250b3MJCV9fc3ltX250b3MKKyNkZWZpbmUgc3ltX3N0b24JCV9fc3ltX3N0b24KK19fQkVHSU5fREVDTFMKK2ludAkJcmVzX2hub2sgKGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJcmVzX293bm9rIChjb25zdCBjaGFyICopIF9fVEhST1c7CitpbnQJCXJlc19tYWlsb2sgKGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJcmVzX2Rub2sgKGNvbnN0IGNoYXIgKikgX19USFJPVzsKK2ludAkJc3ltX3N0b24gKGNvbnN0IHN0cnVjdCByZXNfc3ltICosIGNvbnN0IGNoYXIgKiwgaW50ICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJc3ltX250b3MgKGNvbnN0IHN0cnVjdCByZXNfc3ltICosIGludCwgaW50ICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJc3ltX250b3AgKGNvbnN0IHN0cnVjdCByZXNfc3ltICosIGludCwgaW50ICopIF9fVEhST1c7CitpbnQJCWI2NF9udG9wICh1X2NoYXIgY29uc3QgKiwgc2l6ZV90LCBjaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJYjY0X3B0b24gKGNoYXIgY29uc3QgKiwgdV9jaGFyICosIHNpemVfdCkgX19USFJPVzsKK2ludAkJbG9jX2F0b24gKGNvbnN0IGNoYXIgKmFzY2lpLCB1X2NoYXIgKmJpbmFyeSkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglsb2NfbnRvYSAoY29uc3QgdV9jaGFyICpiaW5hcnksIGNoYXIgKmFzY2lpKSBfX1RIUk9XOworaW50CQlkbl9za2lwbmFtZSAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOwordm9pZAkJcHV0bG9uZyAodV9pbnQzMl90LCB1X2NoYXIgKikgX19USFJPVzsKK3ZvaWQJCXB1dHNob3J0ICh1X2ludDE2X3QsIHVfY2hhciAqKSBfX1RIUk9XOworY29uc3QgY2hhciAqCXBfY2xhc3MgKGludCkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3RpbWUgKHVfaW50MzJfdCkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3R5cGUgKGludCkgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX3Jjb2RlIChpbnQpIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2Nkbm5hbWUgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgaW50LCBGSUxFICopCisgICAgIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2NkbmFtZSAoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBGSUxFICopIF9fVEhST1c7Citjb25zdCB1X2NoYXIgKglwX2Zxbm5hbWUgKGNvbnN0IHVfY2hhciAqY3AsIGNvbnN0IHVfY2hhciAqbXNnLAorCQkJICAgaW50LCBjaGFyICosIGludCkgX19USFJPVzsKK2NvbnN0IHVfY2hhciAqCXBfZnFuYW1lIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIEZJTEUgKikgX19USFJPVzsKK2NvbnN0IGNoYXIgKglwX29wdGlvbiAodV9sb25nIG9wdGlvbikgX19USFJPVzsKK2NoYXIgKgkJcF9zZWNzdG9kYXRlICh1X2xvbmcpIF9fVEhST1c7CitpbnQJCWRuX2NvdW50X2xhYmVscyAoY29uc3QgY2hhciAqKSBfX1RIUk9XOworaW50CQlkbl9jb21wIChjb25zdCBjaGFyICosIHVfY2hhciAqLCBpbnQsIHVfY2hhciAqKiwgdV9jaGFyICoqKQorICAgICBfX1RIUk9XOworaW50CQlkbl9leHBhbmQgKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosCisJCQkgICBjaGFyICosIGludCkgX19USFJPVzsKK3VfaW50CQlyZXNfcmFuZG9taWQgKHZvaWQpIF9fVEhST1c7CitpbnQJCXJlc19uYW1laW5xdWVyeSAoY29uc3QgY2hhciAqLCBpbnQsIGludCwKKwkJCQkgY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKSBfX1RIUk9XOworaW50CQlyZXNfcXVlcmllc21hdGNoIChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosCisJCQkJICBjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopIF9fVEhST1c7Citjb25zdCBjaGFyICoJcF9zZWN0aW9uIChpbnQgc2VjdGlvbiwgaW50IG9wY29kZSkgX19USFJPVzsKKy8qIFRoaW5ncyBpbnZvbHZpbmcgYSByZXNvbHZlciBjb250ZXh0LiAqLworaW50CQlyZXNfbmluaXQgKHJlc19zdGF0ZSkgX19USFJPVzsKK2ludAkJcmVzX25pc291cnNlcnZlciAoY29uc3QgcmVzX3N0YXRlLAorCQkJCSAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIF9fVEhST1c7Cit2b2lkCQlmcF9yZXNzdGF0IChjb25zdCByZXNfc3RhdGUsIEZJTEUgKikgX19USFJPVzsKK3ZvaWQJCXJlc19ucHF1ZXJ5IChjb25zdCByZXNfc3RhdGUsIGNvbnN0IHVfY2hhciAqLCBpbnQsIEZJTEUgKikKKyAgICAgX19USFJPVzsKK2NvbnN0IGNoYXIgKglyZXNfaG9zdGFsaWFzIChjb25zdCByZXNfc3RhdGUsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzaXplX3QpCisgICAgIF9fVEhST1c7CitpbnQJCXJlc19ucXVlcnkgKHJlc19zdGF0ZSwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkKKyAgICAgX19USFJPVzsKK2ludAkJcmVzX25zZWFyY2ggKHJlc19zdGF0ZSwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgdV9jaGFyICosIGludCkKKyAgICAgX19USFJPVzsKK2ludAkJcmVzX25xdWVyeWRvbWFpbiAocmVzX3N0YXRlLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAorCQkJCSAgaW50LCB1X2NoYXIgKiwgaW50KSBfX1RIUk9XOworaW50CQlyZXNfbm1rcXVlcnkgKHJlc19zdGF0ZSwgaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LAorCQkJICAgICAgY29uc3QgdV9jaGFyICosIGludCwgY29uc3QgdV9jaGFyICosIHVfY2hhciAqLAorCQkJICAgICAgaW50KSBfX1RIUk9XOworaW50CQlyZXNfbnNlbmQgKHJlc19zdGF0ZSwgY29uc3QgdV9jaGFyICosIGludCwgdV9jaGFyICosIGludCkKKyAgICAgX19USFJPVzsKK3ZvaWQJCXJlc19uY2xvc2UgKHJlc19zdGF0ZSkgX19USFJPVzsKK19fRU5EX0RFQ0xTCisjZW5kaWYKKworI2VuZGlmIC8qICFfUkVTT0xWX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MzFkOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGguaApAQCAtMCwwICsxLDIxMyBAQAorLyogQCgjKWF1dGguaAkyLjMgODgvMDgvMDcgNC4wIFJQQ1NSQzsgZnJvbSAxLjE3IDg4LzAyLzA4IFNNSSAqLworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisKKy8qCisgKiBhdXRoLmgsIEF1dGhlbnRpY2F0aW9uIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb21wbGV0ZWx5IG9wYXF1ZSB0byB0aGUgY2xpZW50LiAgVGhlIGNsaWVudAorICogaXMgcmVxdWlyZWQgdG8gcGFzcyBhIEFVVEggKiB0byByb3V0aW5lcyB0aGF0IGNyZWF0ZSBycGMKKyAqICJzZXNzaW9ucyIuCisgKi8KKworI2lmbmRlZiBfUlBDX0FVVEhfSAorCisjZGVmaW5lIF9SUENfQVVUSF9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIE1BWF9BVVRIX0JZVEVTCTQwMAorI2RlZmluZSBNQVhORVROQU1FTEVOCTI1NQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBuZXR3b3JrIHVzZXIncyBuYW1lICovCisKKy8qCisgKiBTdGF0dXMgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdGlvbiBjaGVjaworICovCitlbnVtIGF1dGhfc3RhdCB7CisJQVVUSF9PSz0wLAorCS8qCisJICogZmFpbGVkIGF0IHJlbW90ZSBlbmQKKwkgKi8KKwlBVVRIX0JBRENSRUQ9MSwJCQkvKiBib2d1cyBjcmVkZW50aWFscyAoc2VhbCBicm9rZW4pICovCisJQVVUSF9SRUpFQ1RFRENSRUQ9MiwJCS8qIGNsaWVudCBzaG91bGQgYmVnaW4gbmV3IHNlc3Npb24gKi8KKwlBVVRIX0JBRFZFUkY9MywJCQkvKiBib2d1cyB2ZXJpZmllciAoc2VhbCBicm9rZW4pICovCisJQVVUSF9SRUpFQ1RFRFZFUkY9NCwJCS8qIHZlcmlmaWVyIGV4cGlyZWQgb3Igd2FzIHJlcGxheWVkICovCisJQVVUSF9UT09XRUFLPTUsCQkJLyogcmVqZWN0ZWQgZHVlIHRvIHNlY3VyaXR5IHJlYXNvbnMgKi8KKwkvKgorCSAqIGZhaWxlZCBsb2NhbGx5CisJKi8KKwlBVVRIX0lOVkFMSURSRVNQPTYsCQkvKiBib2d1cyByZXNwb25zZSB2ZXJpZmllciAqLworCUFVVEhfRkFJTEVEPTcJCQkvKiBzb21lIHVua25vd24gcmVhc29uICovCit9OworCit1bmlvbiBkZXNfYmxvY2sgeworCXN0cnVjdCB7CisJCXVfaW50MzJfdCBoaWdoOworCQl1X2ludDMyX3QgbG93OworCX0ga2V5OworCWNoYXIgY1s4XTsKK307Cit0eXBlZGVmIHVuaW9uIGRlc19ibG9jayBkZXNfYmxvY2s7CitleHRlcm4gYm9vbF90IHhkcl9kZXNfYmxvY2sgKFhEUiAqX194ZHJzLCBkZXNfYmxvY2sgKl9fYmxrcCkgX19USFJPVzsKKworLyoKKyAqIEF1dGhlbnRpY2F0aW9uIGluZm8uICBPcGFxdWUgdG8gY2xpZW50LgorICovCitzdHJ1Y3Qgb3BhcXVlX2F1dGggeworCWVudW1fdAlvYV9mbGF2b3I7CQkvKiBmbGF2b3Igb2YgYXV0aCAqLworCWNhZGRyX3QJb2FfYmFzZTsJCS8qIGFkZHJlc3Mgb2YgbW9yZSBhdXRoIHN0dWZmICovCisJdV9pbnQJb2FfbGVuZ3RoOwkJLyogbm90IHRvIGV4Y2VlZCBNQVhfQVVUSF9CWVRFUyAqLworfTsKKworLyoKKyAqIEF1dGggaGFuZGxlLCBpbnRlcmZhY2UgdG8gY2xpZW50IHNpZGUgYXV0aGVudGljYXRvcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFVVEggQVVUSDsKK3N0cnVjdCBBVVRIIHsKKyAgc3RydWN0IG9wYXF1ZV9hdXRoIGFoX2NyZWQ7CisgIHN0cnVjdCBvcGFxdWVfYXV0aCBhaF92ZXJmOworICB1bmlvbiBkZXNfYmxvY2sgYWhfa2V5OworICBzdHJ1Y3QgYXV0aF9vcHMgeworICAgIHZvaWQgKCphaF9uZXh0dmVyZikgKEFVVEggKik7CisgICAgaW50ICAoKmFoX21hcnNoYWwpIChBVVRIICosIFhEUiAqKTsJCS8qIG5leHR2ZXJmICYgc2VyaWFsaXplICovCisgICAgaW50ICAoKmFoX3ZhbGlkYXRlKSAoQVVUSCAqLCBzdHJ1Y3Qgb3BhcXVlX2F1dGggKik7CisJCQkJCQkvKiB2YWxpZGF0ZSB2ZXJpZmllciAqLworICAgIGludCAgKCphaF9yZWZyZXNoKSAoQVVUSCAqKTsJCS8qIHJlZnJlc2ggY3JlZGVudGlhbHMgKi8KKyAgICB2b2lkICgqYWhfZGVzdHJveSkgKEFVVEggKik7IAkgICAgCS8qIGRlc3Ryb3kgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgfSAqYWhfb3BzOworICBjYWRkcl90IGFoX3ByaXZhdGU7Cit9OworCisKKy8qCisgKiBBdXRoZW50aWNhdGlvbiBvcHMuCisgKiBUaGUgb3BzIGFuZCB0aGUgYXV0aCBoYW5kbGUgcHJvdmlkZSB0aGUgaW50ZXJmYWNlIHRvIHRoZSBhdXRoZW50aWNhdG9ycy4KKyAqCisgKiBBVVRICSphdXRoOworICogWERSCSp4ZHJzOworICogc3RydWN0IG9wYXF1ZV9hdXRoIHZlcmY7CisgKi8KKyNkZWZpbmUgQVVUSF9ORVhUVkVSRihhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX25leHR2ZXJmKSkoYXV0aCkpCisjZGVmaW5lIGF1dGhfbmV4dHZlcmYoYXV0aCkJCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9uZXh0dmVyZikpKGF1dGgpKQorCisjZGVmaW5lIEFVVEhfTUFSU0hBTEwoYXV0aCwgeGRycykJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX21hcnNoYWwpKShhdXRoLCB4ZHJzKSkKKyNkZWZpbmUgYXV0aF9tYXJzaGFsbChhdXRoLCB4ZHJzKQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfbWFyc2hhbCkpKGF1dGgsIHhkcnMpKQorCisjZGVmaW5lIEFVVEhfVkFMSURBVEUoYXV0aCwgdmVyZnApCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF92YWxpZGF0ZSkpKChhdXRoKSwgdmVyZnApKQorI2RlZmluZSBhdXRoX3ZhbGlkYXRlKGF1dGgsIHZlcmZwKQlcCisJCSgoKigoYXV0aCktPmFoX29wcy0+YWhfdmFsaWRhdGUpKSgoYXV0aCksIHZlcmZwKSkKKworI2RlZmluZSBBVVRIX1JFRlJFU0goYXV0aCkJCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9yZWZyZXNoKSkoYXV0aCkpCisjZGVmaW5lIGF1dGhfcmVmcmVzaChhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX3JlZnJlc2gpKShhdXRoKSkKKworI2RlZmluZSBBVVRIX0RFU1RST1koYXV0aCkJCVwKKwkJKCgqKChhdXRoKS0+YWhfb3BzLT5haF9kZXN0cm95KSkoYXV0aCkpCisjZGVmaW5lIGF1dGhfZGVzdHJveShhdXRoKQkJXAorCQkoKCooKGF1dGgpLT5haF9vcHMtPmFoX2Rlc3Ryb3kpKShhdXRoKSkKKworCitleHRlcm4gc3RydWN0IG9wYXF1ZV9hdXRoIF9udWxsX2F1dGg7CisKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMgb2YgY2xpZW50IHNpZGUgYXV0aGVudGljYXRvcnMuCisgKi8KKworLyoKKyAqIFVuaXggc3R5bGUgYXV0aGVudGljYXRpb24KKyAqIEFVVEggKmF1dGh1bml4X2NyZWF0ZShtYWNobmFtZSwgdWlkLCBnaWQsIGxlbiwgYXVwX2dpZHMpCisgKgljaGFyICptYWNobmFtZTsKKyAqCWludCB1aWQ7CisgKglpbnQgZ2lkOworICoJaW50IGxlbjsKKyAqCWludCAqYXVwX2dpZHM7CisgKi8KK2V4dGVybiBBVVRIICphdXRodW5peF9jcmVhdGUgKGNoYXIgKl9fbWFjaG5hbWUsIF9fdWlkX3QgX191aWQsIF9fZ2lkX3QgX19naWQsCisJCQkgICAgICBpbnQgX19sZW4sIF9fZ2lkX3QgKl9fYXVwX2dpZHMpOworZXh0ZXJuIEFVVEggKmF1dGh1bml4X2NyZWF0ZV9kZWZhdWx0ICh2b2lkKTsKK2V4dGVybiBBVVRIICphdXRobm9uZV9jcmVhdGUgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gQVVUSCAqYXV0aGRlc19jcmVhdGUgKGNvbnN0IGNoYXIgKl9fc2VydmVybmFtZSwgdV9pbnQgX193aW5kb3csCisJCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqX19zeW5jYWRkciwgZGVzX2Jsb2NrICpfX2NrZXkpCisgICAgIF9fVEhST1c7CitleHRlcm4gQVVUSCAqYXV0aGRlc19wa19jcmVhdGUgKGNvbnN0IGNoYXIgKiwgbmV0b2JqICosIHVfaW50LAorCQkJCXN0cnVjdCBzb2NrYWRkciAqLCBkZXNfYmxvY2sgKikgX19USFJPVzsKKworCisjZGVmaW5lIEFVVEhfTk9ORQkwCQkvKiBubyBhdXRoZW50aWNhdGlvbiAqLworI2RlZmluZQlBVVRIX05VTEwJMAkJLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlBVVRIX1NZUwkxCQkvKiB1bml4IHN0eWxlICh1aWQsIGdpZHMpICovCisjZGVmaW5lCUFVVEhfVU5JWAlBVVRIX1NZUworI2RlZmluZQlBVVRIX1NIT1JUCTIJCS8qIHNob3J0IGhhbmQgdW5peCBzdHlsZSAqLworI2RlZmluZSBBVVRIX0RFUwkzCQkvKiBkZXMgc3R5bGUgKGVuY3J5cHRlZCB0aW1lc3RhbXBzKSAqLworI2RlZmluZSBBVVRIX0RICQlBVVRIX0RFUwkvKiBEaWZmaWUtSGVsbG1hbiAodGhpcyBpcyBERVMpICovCisjZGVmaW5lIEFVVEhfS0VSQiAgICAgICA0ICAgICAgICAgICAgICAgLyoga2VyYmVyb3Mgc3R5bGUgKi8KKworLyoKKyAqICBOZXRuYW1lIG1hbmlwdWxhdGluZyBmdW5jdGlvbnMKKyAqCisgKi8KK2V4dGVybiBpbnQgZ2V0bmV0bmFtZSAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIGludCBob3N0Mm5ldG5hbWUgKGNoYXIgKiwgX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB1c2VyMm5ldG5hbWUgKGNoYXIgKiwgX19jb25zdCB1aWRfdCwgX19jb25zdCBjaGFyICopIF9fVEhST1c7CitleHRlcm4gaW50IG5ldG5hbWUydXNlciAoX19jb25zdCBjaGFyICosIHVpZF90ICosIGdpZF90ICosIGludCAqLCBnaWRfdCAqKQorICAgICBfX1RIUk9XOworZXh0ZXJuIGludCBuZXRuYW1lMmhvc3QgKF9fY29uc3QgY2hhciAqLCBjaGFyICosIF9fY29uc3QgaW50KSBfX1RIUk9XOworCisvKgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGludGVyZmFjZSB0byB0aGUga2V5c2VydiBkYWVtb24KKyAqCisgKi8KK2V4dGVybiBpbnQga2V5X2RlY3J5cHRzZXNzaW9uIChjaGFyICosIGRlc19ibG9jayAqKTsKK2V4dGVybiBpbnQga2V5X2RlY3J5cHRzZXNzaW9uX3BrIChjaGFyICosIG5ldG9iaiAqLCBkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9lbmNyeXB0c2Vzc2lvbiAoY2hhciAqLCBkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9lbmNyeXB0c2Vzc2lvbl9wayAoY2hhciAqLCBuZXRvYmogKiwgZGVzX2Jsb2NrICopOworZXh0ZXJuIGludCBrZXlfZ2VuZGVzIChkZXNfYmxvY2sgKik7CitleHRlcm4gaW50IGtleV9zZXRzZWNyZXQgKGNoYXIgKik7CitleHRlcm4gaW50IGtleV9zZWNyZXRrZXlfaXNfc2V0ICh2b2lkKTsKK2V4dGVybiBpbnQga2V5X2dldF9jb252IChjaGFyICosIGRlc19ibG9jayAqKTsKKworLyoKKyAqIFhEUiBhbiBvcGFxdWUgYXV0aGVudGljYXRpb24gc3RydWN0LgorICovCitleHRlcm4gYm9vbF90IHhkcl9vcGFxdWVfYXV0aCAoWERSICosIHN0cnVjdCBvcGFxdWVfYXV0aCAqKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL2F1dGguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF9kZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhZGE4NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfZGVzLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfUlBDX0FVVEhfREVTX0gKKyNkZWZpbmUgX1JQQ19BVVRIX0RFU19ICTEKKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHJwYy9hdXRoLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiAibmFtZXMiOiBmdWxsbmFtZXMgYW5kIG5pY2tuYW1lcyAqLworZW51bSBhdXRoZGVzX25hbWVraW5kCisgIHsKKyAgICBBRE5fRlVMTE5BTUUsCisgICAgQUROX05JQ0tOQU1FCisgIH07CisKKy8qIEEgZnVsbG5hbWUgY29udGFpbnMgdGhlIG5ldHdvcmsgbmFtZSBvZiB0aGUgY2xpZW50LAorICAgYSBjb252ZXJzYXRpb24ga2V5IGFuZCB0aGUgd2luZG93ICovCitzdHJ1Y3QgYXV0aGRlc19mdWxsbmFtZQorICB7CisgICAgY2hhciAqbmFtZTsJCS8qIG5ldHdvcmsgbmFtZSBvZiBjbGllbnQsIHVwIHRvIE1BWE5FVE5BTUVMRU4gKi8KKyAgICBkZXNfYmxvY2sga2V5OwkvKiBjb252ZXJzYXRpb24ga2V5ICovCisgICAgdWludDMyX3Qgd2luZG93OwkvKiBhc3NvY2lhdGVkIHdpbmRvdyAqLworICB9OworCisvKiBBIGNyZWRlbnRpYWwgKi8KK3N0cnVjdCBhdXRoZGVzX2NyZWQKKyAgeworICAgIGVudW0gYXV0aGRlc19uYW1la2luZCBhZGNfbmFtZWtpbmQ7CisgICAgc3RydWN0IGF1dGhkZXNfZnVsbG5hbWUgYWRjX2Z1bGxuYW1lOworICAgIHVpbnQzMl90IGFkY19uaWNrbmFtZTsKKyAgfTsKKworLyogQSB0aW1ldmFsIHJlcGxhY2VtZW50IGZvciAhMzJiaXQgcGxhdGZvcm1zICovCitzdHJ1Y3QgcnBjX3RpbWV2YWwKKyAgeworICAgIHVpbnQzMl90IHR2X3NlYzsgICAgICAgICAgICAvKiBTZWNvbmRzLiAgKi8KKyAgICB1aW50MzJfdCB0dl91c2VjOyAgICAgICAgICAgLyogTWljcm9zZWNvbmRzLiAgKi8KKyAgfTsKKworLyogQSBkZXMgYXV0aGVudGljYXRpb24gdmVyaWZpZXIgKi8KK3N0cnVjdCBhdXRoZGVzX3ZlcmYKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJc3RydWN0IHJwY190aW1ldmFsIGFkdl9jdGltZTsJLyogY2xlYXIgdGltZSAqLworCWRlc19ibG9jayBhZHZfeHRpbWU7CQkvKiBjcnlwdCB0aW1lICovCisgICAgICB9CisgICAgYWR2X3RpbWVfdTsKKyAgICB1aW50MzJfdCBhZHZfaW50X3U7CisgIH07CisKKy8qIGRlcyBhdXRoZW50aWNhdGlvbiB2ZXJpZmllcjogY2xpZW50IHZhcmlldHkKKworICAgYWR2X3RpbWVzdGFtcCBpcyB0aGUgY3VycmVudCB0aW1lLgorICAgYWR2X3dpbnZlcmYgaXMgdGhlIGNyZWRlbnRpYWwgd2luZG93ICsgMS4KKyAgIEJvdGggYXJlIGVuY3J5cHRlZCB1c2luZyB0aGUgY29udmVyc2F0aW9uIGtleS4gKi8KKyNkZWZpbmUgYWR2X3RpbWVzdGFtcCAgYWR2X3RpbWVfdS5hZHZfY3RpbWUKKyNkZWZpbmUgYWR2X3h0aW1lc3RhbXAgYWR2X3RpbWVfdS5hZHZfeHRpbWUKKyNkZWZpbmUgYWR2X3dpbnZlcmYgICAgYWR2X2ludF91CisKKy8qIGRlcyBhdXRoZW50aWNhdGlvbiB2ZXJpZmllcjogc2VydmVyIHZhcmlldHkKKworICAgYWR2X3RpbWV2ZXJmIGlzIHRoZSBjbGllbnQncyB0aW1lc3RhbXAgKyBjbGllbnQncyB3aW5kb3cKKyAgIGFkdl9uaWNrbmFtZSBpcyB0aGUgc2VydmVyJ3Mgbmlja25hbWUgZm9yIHRoZSBjbGllbnQuCisgICBhZHZfdGltZXZlcmYgaXMgZW5jcnlwdGVkIHVzaW5nIHRoZSBjb252ZXJzYXRpb24ga2V5LiAqLworI2RlZmluZSBhZHZfdGltZXZlcmYgICBhZHZfdGltZV91LmFkdl9jdGltZQorI2RlZmluZSBhZHZfeHRpbWV2ZXJmICBhZHZfdGltZV91LmFkdl94dGltZQorI2RlZmluZSBhZHZfbmlja25hbWUgICBhZHZfaW50X3UKKworLyogTWFwIGEgZGVzIGNyZWRlbnRpYWwgaW50byBhIHVuaXggY3JlZC4gKi8KK2V4dGVybiBpbnQgYXV0aGRlc19nZXR1Y3JlZCAoX19jb25zdCBzdHJ1Y3QgYXV0aGRlc19jcmVkICogX19hZGMsCisJCQkgICAgIHVpZF90ICogX191aWQsIGdpZF90ICogX19naWQsCisJCQkgICAgIHNob3J0ICpfX2dyb3VwbGVuLCBnaWRfdCAqIF9fZ3JvdXBzKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIHB1YmxpYyBrZXkgZm9yIE5BTUUgYW5kIHBsYWNlIGl0IGluIEtFWS4gIE5BTUUgY2FuIG9ubHkgYmUKKyAgIHVwIHRvIE1BWE5FVE5BTUVMRU4gYnl0ZXMgbG9uZyBhbmQgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBLRVkgc2hvdWxkCisgICBoYXZlIEhFWEtFWUJZVEVTICsgMSBieXRlcyBsb25nIHRvIGZpdCBhbGwgY2hhcmFjdGVycyBmcm9tIHRoZSBrZXkuICAqLworZXh0ZXJuIGludCBnZXRwdWJsaWNrZXkgKF9fY29uc3QgY2hhciAqX19uYW1lLCBjaGFyICpfX2tleSkgX19USFJPVzsKKworLyogR2V0IHRoZSBzZWNyZXQga2V5IGZvciBOQU1FIGFuZCBwbGFjZSBpdCBpbiBLRVkuICBQQVNTV0QgaXMgdXNlZCB0bworICAgZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiAgTkFNRSBjYW4gb25seSBiZQorICAgdXAgdG8gTUFYTkVUTkFNRUxFTiBieXRlcyBsb25nIGFuZCB0aGUgZGVzdGluYXRpb24gYnVmZmVyIEtFWQorICAgc2hvdWxkIGhhdmUgSEVYS0VZQllURVMgKyAxIGJ5dGVzIGxvbmcgdG8gZml0IGFsbCBjaGFyYWN0ZXJzIGZyb20KKyAgIHRoZSBrZXkuICAqLworZXh0ZXJuIGludCBnZXRzZWNyZXRrZXkgKF9fY29uc3QgY2hhciAqX19uYW1lLCBjaGFyICpfX2tleSwKKwkJCSBfX2NvbnN0IGNoYXIgKl9fcGFzc3dkKSBfX1RIUk9XOworCitleHRlcm4gaW50IHJ0aW1lIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fYWRkcnAsIHN0cnVjdCBycGNfdGltZXZhbCAqX190aW1lcCwKKwkJICBzdHJ1Y3QgcnBjX3RpbWV2YWwgKl9fdGltZW91dCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworCisjZW5kaWYgLyogcnBjL2F1dGhfZGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfdW5peC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvYXV0aF91bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0NjYxZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2F1dGhfdW5peC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qIEAoIylhdXRoX3VuaXguaAkyLjIgODgvMDcvMjkgNC4wIFJQQ1NSQzsgZnJvbSAxLjggODgvMDIvMDggU01JICovCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKy8qICAgICAgQCgjKWF1dGhfdW5peC5oIDEuNSA4Ni8wNy8xNiBTTUkgICAgICAqLworCisvKgorICogYXV0aF91bml4LmgsIFByb3RvY29sIGZvciBVTklYIHN0eWxlIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMgZm9yIFJQQworICoKKyAqIENvcHlyaWdodCAoQykgMTk4NCwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICovCisKKy8qCisgKiBUaGUgc3lzdGVtIGlzIHZlcnkgd2Vhay4gIFRoZSBjbGllbnQgdXNlcyBubyBlbmNyeXB0aW9uIGZvciAgaXQKKyAqIGNyZWRlbnRpYWxzIGFuZCBvbmx5IHNlbmRzIG51bGwgdmVyaWZpZXJzLiAgVGhlIHNlcnZlciBzZW5kcyBiYWNrcworICogbnVsbCB2ZXJpZmllcnMgb3Igb3B0aW9uYWxseSBhIHZlcmlmaWVyIHRoYXQgc3VnZ2VzdHMgYSBuZXcgc2hvcnQgaGFuZAorICogZm9yIHRoZSBjcmVkZW50aWFscy4KKyAqLworCisjaWZuZGVmIF9SUENfQVVUSF9VTklYX0gKKyNkZWZpbmUgX1JQQ19BVVRIX1VOSVhfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy9hdXRoLmg+CisjaW5jbHVkZSA8cnBjL3hkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBtYWNoaW5lIG5hbWUgaXMgcGFydCBvZiBhIGNyZWRlbnRpYWw7IGl0IG1heSBub3QgZXhjZWVkIDI1NSBieXRlcyAqLworI2RlZmluZSBNQVhfTUFDSElORV9OQU1FIDI1NQorCisvKiBnaWRzIGNvbXBvc2UgcGFydCBvZiBhIGNyZWRlbnRpYWw7IHRoZXJlIG1heSBub3QgYmUgbW9yZSB0aGFuIDE2IG9mIHRoZW0gKi8KKyNkZWZpbmUgTkdSUFMgMTYKKworLyoKKyAqIFVuaXggc3R5bGUgY3JlZGVudGlhbHMuCisgKi8KK3N0cnVjdCBhdXRodW5peF9wYXJtcworICB7CisgICAgdV9sb25nIGF1cF90aW1lOworICAgIGNoYXIgKmF1cF9tYWNobmFtZTsKKyAgICBfX3VpZF90IGF1cF91aWQ7CisgICAgX19naWRfdCBhdXBfZ2lkOworICAgIHVfaW50IGF1cF9sZW47CisgICAgX19naWRfdCAqYXVwX2dpZHM7CisgIH07CisKK2V4dGVybiBib29sX3QgeGRyX2F1dGh1bml4X3Bhcm1zIChYRFIgKl9feGRycywgc3RydWN0IGF1dGh1bml4X3Bhcm1zICpfX3ApCisgICAgIF9fVEhST1c7CisKKy8qCisgKiBJZiBhIHJlc3BvbnNlIHZlcmlmaWVyIGhhcyBmbGF2b3IgQVVUSF9TSE9SVCwKKyAqIHRoZW4gdGhlIGJvZHkgb2YgdGhlIHJlc3BvbnNlIHZlcmlmaWVyIGVuY2Fwc3VsYXRlcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTsKKyAqIGFnYWluIGl0IGlzIHNlcmlhbGl6ZWQgaW4gdGhlIG9idmlvdXMgZmFzaGlvbi4KKyAqLworc3RydWN0IHNob3J0X2hhbmRfdmVyZgorICB7CisgICAgc3RydWN0IG9wYXF1ZV9hdXRoIG5ld19jcmVkOworICB9OworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL2F1dGhfdW5peC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9jbG50LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9jbG50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNzFjNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2NsbnQuaApAQCAtMCwwICsxLDQyMSBAQAorLyogQCgjKWNsbnQuaAkyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQzsgZnJvbSAxLjMxIDg4LzAyLzA4IFNNSSovCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIGNsbnQuaCAtIENsaWVudCBzaWRlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2lmbmRlZiBfUlBDX0NMTlRfSAorI2RlZmluZSBfUlBDX0NMTlRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy9hdXRoLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFJwYyBjYWxscyByZXR1cm4gYW4gZW51bSBjbG50X3N0YXQuICBUaGlzIHNob3VsZCBiZSBsb29rZWQgYXQgbW9yZSwKKyAqIHNpbmNlIGVhY2ggaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQgdG8gbGl2ZSB3aXRoIHRoaXMgKGltcGxlbWVudGF0aW9uCisgKiBpbmRlcGVuZGVudCkgbGlzdCBvZiBlcnJvcnMuCisgKi8KK2VudW0gY2xudF9zdGF0IHsKKwlSUENfU1VDQ0VTUz0wLAkJCS8qIGNhbGwgc3VjY2VlZGVkICovCisJLyoKKwkgKiBsb2NhbCBlcnJvcnMKKwkgKi8KKwlSUENfQ0FOVEVOQ09ERUFSR1M9MSwJCS8qIGNhbid0IGVuY29kZSBhcmd1bWVudHMgKi8KKwlSUENfQ0FOVERFQ09ERVJFUz0yLAkJLyogY2FuJ3QgZGVjb2RlIHJlc3VsdHMgKi8KKwlSUENfQ0FOVFNFTkQ9MywJCQkvKiBmYWlsdXJlIGluIHNlbmRpbmcgY2FsbCAqLworCVJQQ19DQU5UUkVDVj00LAkJCS8qIGZhaWx1cmUgaW4gcmVjZWl2aW5nIHJlc3VsdCAqLworCVJQQ19USU1FRE9VVD01LAkJCS8qIGNhbGwgdGltZWQgb3V0ICovCisJLyoKKwkgKiByZW1vdGUgZXJyb3JzCisJICovCisJUlBDX1ZFUlNNSVNNQVRDSD02LAkJLyogcnBjIHZlcnNpb25zIG5vdCBjb21wYXRpYmxlICovCisJUlBDX0FVVEhFUlJPUj03LAkJLyogYXV0aGVudGljYXRpb24gZXJyb3IgKi8KKwlSUENfUFJPR1VOQVZBSUw9OCwJCS8qIHByb2dyYW0gbm90IGF2YWlsYWJsZSAqLworCVJQQ19QUk9HVkVSU01JU01BVENIPTksCQkvKiBwcm9ncmFtIHZlcnNpb24gbWlzbWF0Y2hlZCAqLworCVJQQ19QUk9DVU5BVkFJTD0xMCwJCS8qIHByb2NlZHVyZSB1bmF2YWlsYWJsZSAqLworCVJQQ19DQU5UREVDT0RFQVJHUz0xMSwJCS8qIGRlY29kZSBhcmd1bWVudHMgZXJyb3IgKi8KKwlSUENfU1lTVEVNRVJST1I9MTIsCQkvKiBnZW5lcmljICJvdGhlciBwcm9ibGVtIiAqLworCVJQQ19OT0JST0FEQ0FTVCA9IDIxLAkJLyogQnJvYWRjYXN0aW5nIG5vdCBzdXBwb3J0ZWQgKi8KKwkvKgorCSAqIGNhbGxycGMgJiBjbG50X2NyZWF0ZSBlcnJvcnMKKwkgKi8KKwlSUENfVU5LTk9XTkhPU1Q9MTMsCQkvKiB1bmtub3duIGhvc3QgbmFtZSAqLworCVJQQ19VTktOT1dOUFJPVE89MTcsCQkvKiB1bmtub3duIHByb3RvY29sICovCisJUlBDX1VOS05PV05BRERSID0gMTksCQkvKiBSZW1vdGUgYWRkcmVzcyB1bmtub3duICovCisKKwkvKgorCSAqIHJwY2JpbmQgZXJyb3JzCisJICovCisJUlBDX1JQQ0JGQUlMVVJFPTE0LAkJLyogcG9ydG1hcHBlciBmYWlsZWQgaW4gaXRzIGNhbGwgKi8KKyNkZWZpbmUgUlBDX1BNQVBGQUlMVVJFIFJQQ19SUENCRkFJTFVSRQorCVJQQ19QUk9HTk9UUkVHSVNURVJFRD0xNSwJLyogcmVtb3RlIHByb2dyYW0gaXMgbm90IHJlZ2lzdGVyZWQgKi8KKwlSUENfTjJBWExBVEVGQUlMVVJFID0gMjIsCS8qIE5hbWUgdG8gYWRkciB0cmFuc2xhdGlvbiBmYWlsZWQgKi8KKwkvKgorCSAqIHVuc3BlY2lmaWVkIGVycm9yCisJICovCisJUlBDX0ZBSUxFRD0xNiwKKwlSUENfSU5UUj0xOCwKKwlSUENfVExJRVJST1I9MjAsCisJUlBDX1VERVJST1I9MjMsCisgICAgICAgIC8qCisgICAgICAgICAqIGFzeW5jaHJvbm91cyBlcnJvcnMKKyAgICAgICAgICovCisgICAgICAgIFJQQ19JTlBST0dSRVNTID0gMjQsCisgICAgICAgIFJQQ19TVEFMRVJBQ0hBTkRMRSA9IDI1Cit9OworCisKKy8qCisgKiBFcnJvciBpbmZvLgorICovCitzdHJ1Y3QgcnBjX2VyciB7CisgIGVudW0gY2xudF9zdGF0IHJlX3N0YXR1czsKKyAgdW5pb24geworICAgIGludCBSRV9lcnJubzsJCS8qIHJlbGF0ZWQgc3lzdGVtIGVycm9yICovCisgICAgZW51bSBhdXRoX3N0YXQgUkVfd2h5OwkvKiB3aHkgdGhlIGF1dGggZXJyb3Igb2NjdXJyZWQgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgdV9sb25nIGxvdzsJCS8qIGxvd2VzdCB2ZXJpb24gc3VwcG9ydGVkICovCisgICAgICB1X2xvbmcgaGlnaDsJCS8qIGhpZ2hlc3QgdmVyaW9uIHN1cHBvcnRlZCAqLworICAgIH0gUkVfdmVyczsKKyAgICBzdHJ1Y3QgewkJCS8qIG1heWJlIG1lYW5pbmdmdWwgaWYgUlBDX0ZBSUxFRCAqLworICAgICAgbG9uZyBzMTsKKyAgICAgIGxvbmcgczI7CisgICAgfSBSRV9sYjsJCQkvKiBsaWZlIGJvb3QgJiBkZWJ1Z2dpbmcgb25seSAqLworICB9IHJ1OworI2RlZmluZQlyZV9lcnJubwlydS5SRV9lcnJubworI2RlZmluZQlyZV93aHkJCXJ1LlJFX3doeQorI2RlZmluZQlyZV92ZXJzCQlydS5SRV92ZXJzCisjZGVmaW5lCXJlX2xiCQlydS5SRV9sYgorfTsKKworCisvKgorICogQ2xpZW50IHJwYyBoYW5kbGUuCisgKiBDcmVhdGVkIGJ5IGluZGl2aWR1YWwgaW1wbGVtZW50YXRpb25zLCBzZWUgZS5nLiBycGNfdWRwLmMuCisgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyBhdXRoLCBzZWUgZS5nLiBhdXRoX25vbmUuYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ0xJRU5UIENMSUVOVDsKK3N0cnVjdCBDTElFTlQgeworICBBVVRICSpjbF9hdXRoOwkJIC8qIGF1dGhlbnRpY2F0b3IgKi8KKyAgc3RydWN0IGNsbnRfb3BzIHsKKyAgICBlbnVtIGNsbnRfc3RhdCAoKmNsX2NhbGwpIChDTElFTlQgKiwgdV9sb25nLCB4ZHJwcm9jX3QsIGNhZGRyX3QsIHhkcnByb2NfdCwKKwkJCSAgICAgICBjYWRkcl90LCBzdHJ1Y3QgdGltZXZhbCk7CisJCQkgICAgICAgCS8qIGNhbGwgcmVtb3RlIHByb2NlZHVyZSAqLworICAgIHZvaWQgKCpjbF9hYm9ydCkgKHZvaWQpOwkvKiBhYm9ydCBhIGNhbGwgKi8KKyAgICB2b2lkICgqY2xfZ2V0ZXJyKSAoQ0xJRU5UICosIHN0cnVjdCBycGNfZXJyICopOworCQkJCS8qIGdldCBzcGVjaWZpYyBlcnJvciBjb2RlICovCisgICAgYm9vbF90ICgqY2xfZnJlZXJlcykgKENMSUVOVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCQkJCS8qIGZyZWVzIHJlc3VsdHMgKi8KKyAgICB2b2lkICgqY2xfZGVzdHJveSkgKENMSUVOVCAqKTsgLyogZGVzdHJveSB0aGlzIHN0cnVjdHVyZSAqLworICAgIGJvb2xfdCAoKmNsX2NvbnRyb2wpIChDTElFTlQgKiwgaW50LCBjaGFyICopOworCQkJCS8qIHRoZSBpb2N0bCgpIG9mIHJwYyAqLworICB9ICpjbF9vcHM7CisgIGNhZGRyX3QgY2xfcHJpdmF0ZTsJCS8qIHByaXZhdGUgc3R1ZmYgKi8KK307CisKKworLyoKKyAqIGNsaWVudCBzaWRlIHJwYyBpbnRlcmZhY2Ugb3BzCisgKgorICogUGFyYW1ldGVyIHR5cGVzIGFyZToKKyAqCisgKi8KKworLyoKKyAqIGVudW0gY2xudF9zdGF0CisgKiBDTE5UX0NBTEwocmgsIHByb2MsIHhhcmdzLCBhcmdzcCwgeHJlcywgcmVzcCwgdGltZW91dCkKKyAqIAlDTElFTlQgKnJoOworICoJdV9sb25nIHByb2M7CisgKgl4ZHJwcm9jX3QgeGFyZ3M7CisgKgljYWRkcl90IGFyZ3NwOworICoJeGRycHJvY190IHhyZXM7CisgKgljYWRkcl90IHJlc3A7CisgKglzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICovCisjZGVmaW5lCUNMTlRfQ0FMTChyaCwgcHJvYywgeGFyZ3MsIGFyZ3NwLCB4cmVzLCByZXNwLCBzZWNzKQlcCisJKCgqKHJoKS0+Y2xfb3BzLT5jbF9jYWxsKShyaCwgcHJvYywgeGFyZ3MsIGFyZ3NwLCB4cmVzLCByZXNwLCBzZWNzKSkKKyNkZWZpbmUJY2xudF9jYWxsKHJoLCBwcm9jLCB4YXJncywgYXJnc3AsIHhyZXMsIHJlc3AsIHNlY3MpCVwKKwkoKCoocmgpLT5jbF9vcHMtPmNsX2NhbGwpKHJoLCBwcm9jLCB4YXJncywgYXJnc3AsIHhyZXMsIHJlc3AsIHNlY3MpKQorCisvKgorICogdm9pZAorICogQ0xOVF9BQk9SVChyaCk7CisgKiAJQ0xJRU5UICpyaDsKKyAqLworI2RlZmluZQlDTE5UX0FCT1JUKHJoKQkoKCoocmgpLT5jbF9vcHMtPmNsX2Fib3J0KShyaCkpCisjZGVmaW5lCWNsbnRfYWJvcnQocmgpCSgoKihyaCktPmNsX29wcy0+Y2xfYWJvcnQpKHJoKSkKKworLyoKKyAqIHN0cnVjdCBycGNfZXJyCisgKiBDTE5UX0dFVEVSUihyaCk7CisgKiAJQ0xJRU5UICpyaDsKKyAqLworI2RlZmluZQlDTE5UX0dFVEVSUihyaCxlcnJwKQkoKCoocmgpLT5jbF9vcHMtPmNsX2dldGVycikocmgsIGVycnApKQorI2RlZmluZQljbG50X2dldGVycihyaCxlcnJwKQkoKCoocmgpLT5jbF9vcHMtPmNsX2dldGVycikocmgsIGVycnApKQorCisKKy8qCisgKiBib29sX3QKKyAqIENMTlRfRlJFRVJFUyhyaCwgeHJlcywgcmVzcCk7CisgKiAJQ0xJRU5UICpyaDsKKyAqCXhkcnByb2NfdCB4cmVzOworICoJY2FkZHJfdCByZXNwOworICovCisjZGVmaW5lCUNMTlRfRlJFRVJFUyhyaCx4cmVzLHJlc3ApICgoKihyaCktPmNsX29wcy0+Y2xfZnJlZXJlcykocmgseHJlcyxyZXNwKSkKKyNkZWZpbmUJY2xudF9mcmVlcmVzKHJoLHhyZXMscmVzcCkgKCgqKHJoKS0+Y2xfb3BzLT5jbF9mcmVlcmVzKShyaCx4cmVzLHJlc3ApKQorCisvKgorICogYm9vbF90CisgKiBDTE5UX0NPTlRST0woY2wsIHJlcXVlc3QsIGluZm8pCisgKiAgICAgIENMSUVOVCAqY2w7CisgKiAgICAgIHVfaW50IHJlcXVlc3Q7CisgKiAgICAgIGNoYXIgKmluZm87CisgKi8KKyNkZWZpbmUJQ0xOVF9DT05UUk9MKGNsLHJxLGluKSAoKCooY2wpLT5jbF9vcHMtPmNsX2NvbnRyb2wpKGNsLHJxLGluKSkKKyNkZWZpbmUJY2xudF9jb250cm9sKGNsLHJxLGluKSAoKCooY2wpLT5jbF9vcHMtPmNsX2NvbnRyb2wpKGNsLHJxLGluKSkKKworLyoKKyAqIGNvbnRyb2wgb3BlcmF0aW9ucyB0aGF0IGFwcGx5IHRvIGFsbCB0cmFuc3BvcnRzCisgKgorICogTm90ZTogb3B0aW9ucyBtYXJrZWQgWFhYIGFyZSBuby1vcHMgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBSUEMuCisgKiBUaGUgYXJlIHByZXNlbnQgaW4gVEktUlBDIGJ1dCBjYW4ndCBiZSBpbXBsZW1lbnRlZCBoZXJlIHNpbmNlIHRoZXkKKyAqIGRlcGVuZCBvbiB0aGUgcHJlc2VuY2Ugb2YgU1RSRUFNUy9UTEksIHdoaWNoIHdlIGRvbid0IGhhdmUuCisgKi8KKyNkZWZpbmUgQ0xTRVRfVElNRU9VVCAgICAgICAgMSAgICAvKiBzZXQgdGltZW91dCAodGltZXZhbCkgKi8KKyNkZWZpbmUgQ0xHRVRfVElNRU9VVCAgICAgICAgMiAgICAvKiBnZXQgdGltZW91dCAodGltZXZhbCkgKi8KKyNkZWZpbmUgQ0xHRVRfU0VSVkVSX0FERFIgICAgMyAgICAvKiBnZXQgc2VydmVyJ3MgYWRkcmVzcyAoc29ja2FkZHIpICovCisjZGVmaW5lIENMR0VUX0ZEICAgICAgICAgICAgIDYgICAgLyogZ2V0IGNvbm5lY3Rpb25zIGZpbGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBDTEdFVF9TVkNfQUREUiAgICAgICA3ICAgIC8qIGdldCBzZXJ2ZXIncyBhZGRyZXNzIChuZXRidWYpICAgICAgWFhYICovCisjZGVmaW5lIENMU0VUX0ZEX0NMT1NFICAgICAgIDggICAgLyogY2xvc2UgZmQgd2hpbGUgY2xudF9kZXN0cm95ICovCisjZGVmaW5lIENMU0VUX0ZEX05DTE9TRSAgICAgIDkgICAgLyogRG8gbm90IGNsb3NlIGZkIHdoaWxlIGNsbnRfZGVzdHJveSovCisjZGVmaW5lIENMR0VUX1hJRCAgICAgICAgICAgIDEwICAgLyogR2V0IHhpZCAqLworI2RlZmluZSBDTFNFVF9YSUQgICAgICAgICAgICAxMSAgIC8qIFNldCB4aWQgKi8KKyNkZWZpbmUgQ0xHRVRfVkVSUyAgICAgICAgICAgMTIgICAvKiBHZXQgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgQ0xTRVRfVkVSUyAgICAgICAgICAgMTMgICAvKiBTZXQgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgQ0xHRVRfUFJPRyAgICAgICAgICAgMTQgICAvKiBHZXQgcHJvZ3JhbSBudW1iZXIgKi8KKyNkZWZpbmUgQ0xTRVRfUFJPRyAgICAgICAgICAgMTUgICAvKiBTZXQgcHJvZ3JhbSBudW1iZXIgKi8KKyNkZWZpbmUgQ0xTRVRfU1ZDX0FERFIgICAgICAgMTYgICAvKiBnZXQgc2VydmVyJ3MgYWRkcmVzcyAobmV0YnVmKSAgICAgIFhYWCAqLworI2RlZmluZSBDTFNFVF9QVVNIX1RJTU9EICAgICAxNyAgIC8qIHB1c2ggdGltb2QgaWYgbm90IGFscmVhZHkgcHJlc2VudCAgWFhYICovCisjZGVmaW5lIENMU0VUX1BPUF9USU1PRCAgICAgIDE4ICAgLyogcG9wIHRpbW9kICAgICAgICAgICAgICAgICAgICAgICAgICBYWFggKi8KKy8qCisgKiBDb25uZWN0aW9ubGVzcyBvbmx5IGNvbnRyb2wgb3BlcmF0aW9ucworICovCisjZGVmaW5lIENMU0VUX1JFVFJZX1RJTUVPVVQJNAkvKiBzZXQgcmV0cnkgdGltZW91dCAodGltZXZhbCkgKi8KKyNkZWZpbmUgQ0xHRVRfUkVUUllfVElNRU9VVAk1CS8qIGdldCByZXRyeSB0aW1lb3V0ICh0aW1ldmFsKSAqLworCisvKgorICogdm9pZAorICogQ0xOVF9ERVNUUk9ZKHJoKTsKKyAqIAlDTElFTlQgKnJoOworICovCisjZGVmaW5lCUNMTlRfREVTVFJPWShyaCkJKCgqKHJoKS0+Y2xfb3BzLT5jbF9kZXN0cm95KShyaCkpCisjZGVmaW5lCWNsbnRfZGVzdHJveShyaCkJKCgqKHJoKS0+Y2xfb3BzLT5jbF9kZXN0cm95KShyaCkpCisKKworLyoKKyAqIFJQQ1RFU1QgaXMgYSB0ZXN0IHByb2dyYW0gd2hpY2ggaXMgYWNjZXNzaWJsZSBvbiBldmVyeSBycGMKKyAqIHRyYW5zcG9ydC9wb3J0LiAgSXQgaXMgdXNlZCBmb3IgdGVzdGluZywgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiwKKyAqIGFuZCBuZXR3b3JrIGFkbWluaXN0cmF0aW9uLgorICovCisKKyNkZWZpbmUgUlBDVEVTVF9QUk9HUkFNCQkoKHVfbG9uZykxKQorI2RlZmluZSBSUENURVNUX1ZFUlNJT04JCSgodV9sb25nKTEpCisjZGVmaW5lIFJQQ1RFU1RfTlVMTF9QUk9DCSgodV9sb25nKTIpCisjZGVmaW5lIFJQQ1RFU1RfTlVMTF9CQVRDSF9QUk9DCSgodV9sb25nKTMpCisKKy8qCisgKiBCeSBjb252ZW50aW9uLCBwcm9jZWR1cmUgMCB0YWtlcyBudWxsIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGVtCisgKi8KKworI2RlZmluZSBOVUxMUFJPQyAoKHVfbG9uZykwKQorCisvKgorICogQmVsb3cgYXJlIHRoZSBjbGllbnQgaGFuZGxlIGNyZWF0aW9uIHJvdXRpbmVzIGZvciB0aGUgdmFyaW91cworICogaW1wbGVtZW50YXRpb25zIG9mIGNsaWVudCBzaWRlIHJwYy4gIFRoZXkgY2FuIHJldHVybiBOVUxMIGlmIGEKKyAqIGNyZWF0aW9uIGZhaWx1cmUgb2NjdXJzLgorICovCisKKy8qCisgKiBNZW1vcnkgYmFzZWQgcnBjIChmb3Igc3BlZWQgY2hlY2sgYW5kIHRlc3RpbmcpCisgKiBDTElFTlQgKgorICogY2xudHJhd19jcmVhdGUocHJvZywgdmVycykKKyAqCXVfbG9uZyBwcm9nOworICoJdV9sb25nIHZlcnM7CisgKi8KK2V4dGVybiBDTElFTlQgKmNsbnRyYXdfY3JlYXRlIChfX2NvbnN0IHVfbG9uZyBfX3Byb2csIF9fY29uc3QgdV9sb25nIF9fdmVycykKKyAgICAgX19USFJPVzsKKworCisvKgorICogR2VuZXJpYyBjbGllbnQgY3JlYXRpb24gcm91dGluZS4gU3VwcG9ydGVkIHByb3RvY29scyBhcmUgInVkcCIsICJ0Y3AiIGFuZAorICogInVuaXgiCisgKiBDTElFTlQgKgorICogY2xudF9jcmVhdGUoaG9zdCwgcHJvZywgdmVycywgcHJvdCkKKyAqCWNoYXIgKmhvc3Q7IAktLSBob3N0bmFtZQorICoJdV9sb25nIHByb2c7CS0tIHByb2dyYW0gbnVtYmVyCisgKgl1X29uZyB2ZXJzOwktLSB2ZXJzaW9uIG51bWJlcgorICoJY2hhciAqcHJvdDsJLS0gcHJvdG9jb2wKKyAqLworZXh0ZXJuIENMSUVOVCAqY2xudF9jcmVhdGUgKF9fY29uc3QgY2hhciAqX19ob3N0LCBfX2NvbnN0IHVfbG9uZyBfX3Byb2csCisJCQkgICAgX19jb25zdCB1X2xvbmcgX192ZXJzLCBfX2NvbnN0IGNoYXIgKl9fcHJvdCkKKyAgICAgX19USFJPVzsKKworCisvKgorICogVENQIGJhc2VkIHJwYworICogQ0xJRU5UICoKKyAqIGNsbnR0Y3BfY3JlYXRlKHJhZGRyLCBwcm9nLCB2ZXJzLCBzb2NrcCwgc2VuZHN6LCByZWN2c3opCisgKglzdHJ1Y3Qgc29ja2FkZHJfaW4gKnJhZGRyOworICoJdV9sb25nIHByb2c7CisgKgl1X2xvbmcgdmVyc2lvbjsKKyAqCXJlZ2lzdGVyIGludCAqc29ja3A7CisgKgl1X2ludCBzZW5kc3o7CisgKgl1X2ludCByZWN2c3o7CisgKi8KK2V4dGVybiBDTElFTlQgKmNsbnR0Y3BfY3JlYXRlIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fcmFkZHIsIHVfbG9uZyBfX3Byb2csCisJCQkgICAgICAgdV9sb25nIF9fdmVyc2lvbiwgaW50ICpfX3NvY2twLCB1X2ludCBfX3NlbmRzeiwKKwkJCSAgICAgICB1X2ludCBfX3JlY3ZzeikgX19USFJPVzsKKworLyoKKyAqIFVEUCBiYXNlZCBycGMuCisgKiBDTElFTlQgKgorICogY2xudHVkcF9jcmVhdGUocmFkZHIsIHByb2dyYW0sIHZlcnNpb24sIHdhaXQsIHNvY2twKQorICoJc3RydWN0IHNvY2thZGRyX2luICpyYWRkcjsKKyAqCXVfbG9uZyBwcm9ncmFtOworICoJdV9sb25nIHZlcnNpb247CisgKglzdHJ1Y3QgdGltZXZhbCB3YWl0X3Jlc2VuZDsKKyAqCWludCAqc29ja3A7CisgKgorICogU2FtZSBhcyBhYm92ZSwgYnV0IHlvdSBzcGVjaWZ5IG1heCBwYWNrZXQgc2l6ZXMuCisgKiBDTElFTlQgKgorICogY2xudHVkcF9idWZjcmVhdGUocmFkZHIsIHByb2dyYW0sIHZlcnNpb24sIHdhaXQsIHNvY2twLCBzZW5kc3osIHJlY3ZzeikKKyAqCXN0cnVjdCBzb2NrYWRkcl9pbiAqcmFkZHI7CisgKgl1X2xvbmcgcHJvZ3JhbTsKKyAqCXVfbG9uZyB2ZXJzaW9uOworICoJc3RydWN0IHRpbWV2YWwgd2FpdF9yZXNlbmQ7CisgKglpbnQgKnNvY2twOworICoJdV9pbnQgc2VuZHN6OworICoJdV9pbnQgcmVjdnN6OworICovCitleHRlcm4gQ0xJRU5UICpjbG50dWRwX2NyZWF0ZSAoc3RydWN0IHNvY2thZGRyX2luICpfX3JhZGRyLCB1X2xvbmcgX19wcm9ncmFtLAorCQkJICAgICAgIHVfbG9uZyBfX3ZlcnNpb24sIHN0cnVjdCB0aW1ldmFsIF9fd2FpdF9yZXNlbmQsCisJCQkgICAgICAgaW50ICpfX3NvY2twKSBfX1RIUk9XOworZXh0ZXJuIENMSUVOVCAqY2xudHVkcF9idWZjcmVhdGUgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19yYWRkciwKKwkJCQkgIHVfbG9uZyBfX3Byb2dyYW0sIHVfbG9uZyBfX3ZlcnNpb24sCisJCQkJICBzdHJ1Y3QgdGltZXZhbCBfX3dhaXRfcmVzZW5kLCBpbnQgKl9fc29ja3AsCisJCQkJICB1X2ludCBfX3NlbmRzeiwgdV9pbnQgX19yZWN2c3opIF9fVEhST1c7CisKKworCisKKy8qCisgKiBBRl9VTklYIGJhc2VkIHJwYworICogQ0xJRU5UICoKKyAqIGNsbnR1bml4X2NyZWF0ZShyYWRkciwgcHJvZywgdmVycywgc29ja3AsIHNlbmRzeiwgcmVjdnN6KQorICogICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gKnJhZGRyOworICogICAgICB1X2xvbmcgcHJvZzsKKyAqICAgICAgdV9sb25nIHZlcnNpb247CisgKiAgICAgIHJlZ2lzdGVyIGludCAqc29ja3A7CisgKiAgICAgIHVfaW50IHNlbmRzejsKKyAqICAgICAgdV9pbnQgcmVjdnN6OworICovCitleHRlcm4gQ0xJRU5UICpjbG50dW5peF9jcmVhdGUgIChzdHJ1Y3Qgc29ja2FkZHJfdW4gKl9fcmFkZHIsIHVfbG9uZyBfX3Byb2dyYW0sCisJCQkJIHVfbG9uZyBfX3ZlcnNpb24sIGludCAqX19zb2NrcCwKKwkJCQkgdV9pbnQgX19zZW5kc3osIHVfaW50IF9fcmVjdnN6KSBfX1RIUk9XOworCisKK2V4dGVybiBpbnQgY2FsbHJwYyAoX19jb25zdCBjaGFyICpfX2hvc3QsIF9fY29uc3QgdV9sb25nIF9fcHJvZ251bSwKKwkJICAgIF9fY29uc3QgdV9sb25nIF9fdmVyc251bSwgX19jb25zdCB1X2xvbmcgX19wcm9jbnVtLAorCQkgICAgX19jb25zdCB4ZHJwcm9jX3QgX19pbnByb2MsIF9fY29uc3QgY2hhciAqX19pbiwKKwkJICAgIF9fY29uc3QgeGRycHJvY190IF9fb3V0cHJvYywgY2hhciAqX19vdXQpIF9fVEhST1c7CitleHRlcm4gaW50IF9ycGNfZHRhYmxlc2l6ZSAodm9pZCkgX19USFJPVzsKKworLyoKKyAqIFByaW50IHdoeSBjcmVhdGlvbiBmYWlsZWQKKyAqLworZXh0ZXJuIHZvaWQgY2xudF9wY3JlYXRlZXJyb3IgKF9fY29uc3QgY2hhciAqX19tc2cpOwkvKiBzdGRlcnIgKi8KK2V4dGVybiBjaGFyICpjbG50X3NwY3JlYXRlZXJyb3IoX19jb25zdCBjaGFyICpfX21zZykgX19USFJPVzsJLyogc3RyaW5nICovCisKKy8qCisgKiBMaWtlIGNsbnRfcGVycm9yKCksIGJ1dCBpcyBtb3JlIHZlcmJvc2UgaW4gaXRzIG91dHB1dAorICovCitleHRlcm4gdm9pZCBjbG50X3BlcnJubyAoZW51bSBjbG50X3N0YXQgX19udW0pOwkJLyogc3RkZXJyICovCisKKy8qCisgKiBQcmludCBhbiBFbmdsaXNoIGVycm9yIG1lc3NhZ2UsIGdpdmVuIHRoZSBjbGllbnQgZXJyb3IgY29kZQorICovCitleHRlcm4gdm9pZCBjbG50X3BlcnJvciAoQ0xJRU5UICpfX2NsbnQsIF9fY29uc3QgY2hhciAqX19tc2cpOworCQkJCQkJCS8qIHN0ZGVyciAqLworZXh0ZXJuIGNoYXIgKmNsbnRfc3BlcnJvciAoQ0xJRU5UICpfX2NsbnQsIF9fY29uc3QgY2hhciAqX19tc2cpIF9fVEhST1c7CisJCQkJCQkJLyogc3RyaW5nICovCisKKy8qCisgKiBJZiBhIGNyZWF0aW9uIGZhaWxzLCB0aGUgZm9sbG93aW5nIGFsbG93cyB0aGUgdXNlciB0byBmaWd1cmUgb3V0IHdoeS4KKyAqLworc3RydWN0IHJwY19jcmVhdGVlcnIgeworCWVudW0gY2xudF9zdGF0IGNmX3N0YXQ7CisJc3RydWN0IHJwY19lcnIgY2ZfZXJyb3I7IC8qIHVzZWZ1bCB3aGVuIGNmX3N0YXQgPT0gUlBDX1BNQVBGQUlMVVJFICovCit9OworCitleHRlcm4gc3RydWN0IHJwY19jcmVhdGVlcnIgcnBjX2NyZWF0ZWVycjsKKworCisKKy8qCisgKiBDb3B5IGVycm9yIG1lc3NhZ2UgdG8gYnVmZmVyLgorICovCitleHRlcm4gY2hhciAqY2xudF9zcGVycm5vIChlbnVtIGNsbnRfc3RhdCBfX251bSkgX19USFJPVzsJLyogc3RyaW5nICovCisKKy8qCisgKiBnZXQgdGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBob3N0IGZvciB0aGUgcnBjIHByb2dyYW0sdmVyc2lvbiBhbmQgcHJvdG8KKyAqLworZXh0ZXJuIGludCBnZXRycGNwb3J0IChfX2NvbnN0IGNoYXIgKiBfX2hvc3QsIHVfbG9uZyBfX3Byb2dudW0sCisJCSAgICAgICB1X2xvbmcgX192ZXJzbnVtLCB1X2ludCBwcm90bykgX19USFJPVzsKKworLyoKKyAqIGdldCB0aGUgbG9jYWwgaG9zdCdzIElQIGFkZHJlc3Mgd2l0aG91dCBjb25zdWx0aW5nCisgKiBuYW1lIHNlcnZpY2UgbGlicmFyeSBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIHZvaWQgZ2V0X215YWRkcmVzcyAoc3RydWN0IHNvY2thZGRyX2luICopIF9fVEhST1c7CisKKyNkZWZpbmUgVURQTVNHU0laRQk4ODAwCS8qIHJwYyBpbXBvc2VkIGxpbWl0IG9uIHVkcCBtc2cgc2l6ZSAqLworI2RlZmluZSBSUENTTUFMTE1TR1NJWkUJNDAwCS8qIGEgbW9yZSByZWFzb25hYmxlIHBhY2tldCBzaXplICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvY2xudC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9kZXNfY3J5cHQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL2Rlc19jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjU4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9kZXNfY3J5cHQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQCgjKWRlc19jcnlwdC5oCTIuMSA4OC8wOC8xMSA0LjAgUlBDU1JDOwlmcm9tIDEuNCA4OC8wMi8wOCAoQykgMTk4NiBTTUkKKyAqCisgKiBkZXNfY3J5cHQuaCwgZGVzIGxpYnJhcnkgcm91dGluZSBpbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk4NiwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICovCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworI2lmbmRlZiBfX0RFU19DUllQVF9IX18KKyNkZWZpbmUgX19ERVNfQ1JZUFRfSF9fIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBERVNfTUFYREFUQSA4MTkyCS8qIG1heCBieXRlcyBlbmNyeXB0ZWQgaW4gb25lIGNhbGwgKi8KKyNkZWZpbmUgREVTX0RJUk1BU0sgKDEgPDwgMCkKKyNkZWZpbmUgREVTX0VOQ1JZUFQgKDAqREVTX0RJUk1BU0spCS8qIEVuY3J5cHQgKi8KKyNkZWZpbmUgREVTX0RFQ1JZUFQgKDEqREVTX0RJUk1BU0spCS8qIERlY3J5cHQgKi8KKworCisjZGVmaW5lIERFU19ERVZNQVNLICgxIDw8IDEpCisjZGVmaW5lCURFU19IVyAoMCpERVNfREVWTUFTSykJLyogVXNlIGhhcmR3YXJlIGRldmljZSAqLworI2RlZmluZSBERVNfU1cgKDEqREVTX0RFVk1BU0spCS8qIFVzZSBzb2Z0d2FyZSBkZXZpY2UgKi8KKworCisjZGVmaW5lIERFU0VSUl9OT05FIDAJLyogc3VjY2VlZGVkICovCisjZGVmaW5lIERFU0VSUl9OT0hXREVWSUNFIDEJLyogc3VjY2VlZGVkLCBidXQgaHcgZGV2aWNlIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgREVTRVJSX0hXRVJST1IgMgkvKiBmYWlsZWQsIGhhcmR3YXJlL2RyaXZlciBlcnJvciAqLworI2RlZmluZSBERVNFUlJfQkFEUEFSQU0gMwkvKiBmYWlsZWQsIGJhZCBwYXJhbWV0ZXIgdG8gY2FsbCAqLworCisjZGVmaW5lIERFU19GQUlMRUQoZXJyKSBcCisJKChlcnIpID4gREVTRVJSX05PSFdERVZJQ0UpCisKKy8qCisgKiBjYmNfY3J5cHQoKQorICogZWNiX2NyeXB0KCkKKyAqCisgKiBFbmNyeXB0IChvciBkZWNyeXB0KSBsZW4gYnl0ZXMgb2YgYSBidWZmZXIgYnVmLgorICogVGhlIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZWlnaHQuCisgKiBUaGUga2V5IHNob3VsZCBoYXZlIG9kZCBwYXJpdHkgaW4gdGhlIGxvdyBiaXQgb2YgZWFjaCBieXRlLgorICogaXZlYyBpcyB0aGUgaW5wdXQgdmVjdG9yLCBhbmQgaXMgdXBkYXRlZCB0byB0aGUgbmV3IG9uZSAoY2JjIG9ubHkpLgorICogVGhlIG1vZGUgaXMgY3JlYXRlZCBieSBvcmluZyB0b2dldGhlciB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KKyAqIERFU0VSUl9OT0hXREVWSUNFIGlzIHJldHVybmVkIGlmIERFU19IVyB3YXMgc3BlY2lmaWVkIGJ1dAorICogdGhlcmUgd2FzIG5vIGhhcmR3YXJlIHRvIGRvIGl0IG9uICh0aGUgZGF0YSB3aWxsIHN0aWxsIGJlCisgKiBlbmNyeXB0ZWQgdGhvdWdoLCBpbiBzb2Z0d2FyZSkuCisgKi8KKworCisvKgorICogQ2lwaGVyIEJsb2NrIENoYWluaW5nIG1vZGUKKyAqLworZXh0ZXJuIGludCBjYmNfY3J5cHQgKGNoYXIgKl9fa2V5LCBjaGFyICpfX2J1ZiwgdW5zaWduZWQgX19sZW4sCisJCSAgICAgIHVuc2lnbmVkIF9fbW9kZSwgY2hhciAqX19pdmVjKSBfX1RIUk9XOworCisvKgorICogRWxlY3Ryb25pYyBDb2RlIEJvb2sgbW9kZQorICovCitleHRlcm4gaW50IGVjYl9jcnlwdCAoY2hhciAqX19rZXksIGNoYXIgKl9fYnVmLCB1bnNpZ25lZCBfX2xlbiwKKwkJICAgICAgdW5zaWduZWQgX19tb2RlKSBfX1RIUk9XOworCisvKgorICogU2V0IGRlcyBwYXJpdHkgZm9yIGEga2V5LgorICogREVTIHBhcml0eSBpcyBvZGQgYW5kIGluIHRoZSBsb3cgYml0IG9mIGVhY2ggYnl0ZQorICovCitleHRlcm4gdm9pZCBkZXNfc2V0cGFyaXR5IChjaGFyICpfX2tleSkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9rZXlfcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMva2V5X3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJlYjcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMva2V5X3Byb3QuaApAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9LRVlfUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfS0VZX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisjaWYgMAorI3ByYWdtYSBpZGVudAkiQCgjKWtleV9wcm90LngJMS43CTk0LzA0LzI5IFNNSSIKKyNlbmRpZgorLyogQ29weXJpZ2h0IChjKSAgMTk5MCwgMTk5MSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICovCisKKy8qIAorICogQ29tcGlsZWQgZnJvbSBrZXlfcHJvdC54IHVzaW5nIHJwY2dlbi4KKyAqIERPIE5PVCBFRElUIFRISVMgRklMRSEKKyAqIFRoaXMgaXMgTk9UIHNvdXJjZSBjb2RlIQorICovCisjZGVmaW5lIFBST09UIDMKKyNkZWZpbmUgSEVYTU9EVUxVUyAiZDRhMGJhMDI1MGI2ZmQyZWM2MjZlN2VmZDYzN2RmNzZjNzE2ZTIyZDA5NDRiODhiIgorI2RlZmluZSBIRVhLRVlCWVRFUyA0OAorI2RlZmluZSBLRVlTSVpFIDE5MgorI2RlZmluZSBLRVlCWVRFUyAyNAorI2RlZmluZSBLRVlDSEVDS1NVTVNJWkUgMTYKKworZW51bSBrZXlzdGF0dXMgeworCUtFWV9TVUNDRVNTID0gMCwKKwlLRVlfTk9TRUNSRVQgPSAxLAorCUtFWV9VTktOT1dOID0gMiwKKwlLRVlfU1lTVEVNRVJSID0gMywKK307Cit0eXBlZGVmIGVudW0ga2V5c3RhdHVzIGtleXN0YXR1czsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9rZXlzdGF0dXMoWERSICosIGtleXN0YXR1cyopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5c3RhdHVzKFhEUiAqLCBrZXlzdGF0dXMqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9rZXlzdGF0dXMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCit0eXBlZGVmIGNoYXIga2V5YnVmW0hFWEtFWUJZVEVTXTsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9rZXlidWYoWERSICosIGtleWJ1Zik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlidWYoWERSICosIGtleWJ1Zik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfa2V5YnVmKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKwordHlwZWRlZiBjaGFyICpuZXRuYW1lc3RyOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX25ldG5hbWVzdHIoWERSICosIG5ldG5hbWVzdHIqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX25ldG5hbWVzdHIoWERSICosIG5ldG5hbWVzdHIqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9uZXRuYW1lc3RyKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGNyeXB0a2V5YXJnIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleWFyZyBjcnlwdGtleWFyZzsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9jcnlwdGtleWFyZyhYRFIgKiwgY3J5cHRrZXlhcmcqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX2NyeXB0a2V5YXJnKFhEUiAqLCBjcnlwdGtleWFyZyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX2NyeXB0a2V5YXJnKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGNyeXB0a2V5YXJnMiB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCW5ldG9iaiByZW1vdGVrZXk7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307Cit0eXBlZGVmIHN0cnVjdCBjcnlwdGtleWFyZzIgY3J5cHRrZXlhcmcyOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2NyeXB0a2V5YXJnMihYRFIgKiwgY3J5cHRrZXlhcmcyKik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9jcnlwdGtleWFyZzIoWERSICosIGNyeXB0a2V5YXJnMiopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX2NyeXB0a2V5YXJnMigpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKK3N0cnVjdCBjcnlwdGtleXJlcyB7CisJa2V5c3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCWRlc19ibG9jayBkZXNrZXk7CisJfSBjcnlwdGtleXJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGNyeXB0a2V5cmVzIGNyeXB0a2V5cmVzOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2NyeXB0a2V5cmVzKFhEUiAqLCBjcnlwdGtleXJlcyopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlyZXMoWERSICosIGNyeXB0a2V5cmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfY3J5cHRrZXlyZXMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworI2RlZmluZSBNQVhHSURTIDE2CisKK3N0cnVjdCB1bml4Y3JlZCB7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwlzdHJ1Y3QgeworCQl1X2ludCBnaWRzX2xlbjsKKwkJdV9pbnQgKmdpZHNfdmFsOworCX0gZ2lkczsKK307Cit0eXBlZGVmIHN0cnVjdCB1bml4Y3JlZCB1bml4Y3JlZDsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl91bml4Y3JlZChYRFIgKiwgdW5peGNyZWQqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3VuaXhjcmVkKFhEUiAqLCB1bml4Y3JlZCopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3VuaXhjcmVkKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGdldGNyZWRyZXMgeworCWtleXN0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQl1bml4Y3JlZCBjcmVkOworCX0gZ2V0Y3JlZHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGdldGNyZWRyZXMgZ2V0Y3JlZHJlczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9nZXRjcmVkcmVzKFhEUiAqLCBnZXRjcmVkcmVzKik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9nZXRjcmVkcmVzKFhEUiAqLCBnZXRjcmVkcmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfZ2V0Y3JlZHJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKK3N0cnVjdCBrZXlfbmV0c3RhcmcgeworCWtleWJ1ZiBzdF9wcml2X2tleTsKKwlrZXlidWYgc3RfcHViX2tleTsKKwluZXRuYW1lc3RyIHN0X25ldG5hbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2V5X25ldHN0YXJnIGtleV9uZXRzdGFyZzsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9rZXlfbmV0c3RhcmcoWERSICosIGtleV9uZXRzdGFyZyopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5X25ldHN0YXJnKFhEUiAqLCBrZXlfbmV0c3RhcmcqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9rZXlfbmV0c3RhcmcoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3Qga2V5X25ldHN0cmVzIHsKKwlrZXlzdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJa2V5X25ldHN0YXJnIGtuZXQ7CisJfSBrZXlfbmV0c3RyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBrZXlfbmV0c3RyZXMga2V5X25ldHN0cmVzOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2tleV9uZXRzdHJlcyhYRFIgKiwga2V5X25ldHN0cmVzKik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlfbmV0c3RyZXMoWERSICosIGtleV9uZXRzdHJlcyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX2tleV9uZXRzdHJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKKyNpZm5kZWYgb3BhcXVlCisjZGVmaW5lIG9wYXF1ZSBjaGFyCisjZW5kaWYKKworCisjZGVmaW5lIEtFWV9QUk9HICgodV9sb25nKTEwMDAyOSkKKyNkZWZpbmUgS0VZX1ZFUlMgKCh1X2xvbmcpMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEtFWV9TRVQgKCh1X2xvbmcpMSkKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X3NldF8xKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVCAoKHVfbG9uZykyKQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVCAoKHVfbG9uZykzKQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VOICgodV9sb25nKTQpCitleHRlcm4gIkMiIGRlc19ibG9jayAqIGtleV9nZW5fMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUQ1JFRCAoKHVfbG9uZyk1KQorZXh0ZXJuICJDIiBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMShuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKKyNlbGlmIF9fU1REQ19fCisjZGVmaW5lIEtFWV9TRVQgKCh1X2xvbmcpMSkKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMV9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVCAoKHVfbG9uZykyKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVCAoKHVfbG9uZykzKQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VOICgodV9sb25nKTQpCitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUQ1JFRCAoKHVfbG9uZyk1KQorZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMShuZXRuYW1lc3RyICosIENMSUVOVCAqKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKG5ldG5hbWVzdHIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorI2RlZmluZSBLRVlfU0VUICgodV9sb25nKTEpCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMSgpOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9FTkNSWVBUICgodV9sb25nKTIpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMSgpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9ERUNSWVBUICgodV9sb25nKTMpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMSgpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9HRU4gKCh1X2xvbmcpNCkKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xKCk7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0dFVENSRUQgKCh1X2xvbmcpNSkKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzEoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzFfc3ZjKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisjZGVmaW5lIEtFWV9WRVJTMiAoKHVfbG9uZykyKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X3NldF8yKG9wYXF1ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGtleXN0YXR1cyAqIGtleV9zZXRfMl9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzIoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0XzJfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzIoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzJfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuICJDIiBkZXNfYmxvY2sgKiBrZXlfZ2VuXzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGRlc19ibG9jayAqIGtleV9nZW5fMl9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAiQyIgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzIobmV0bmFtZXN0ciAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yX3N2YyhuZXRuYW1lc3RyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfRU5DUllQVF9QSyAoKHVfbG9uZyk2KQorZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ERUNSWVBUX1BLICgodV9sb25nKTcpCitleHRlcm4gIkMiIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMihjcnlwdGtleWFyZzIgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzJfc3ZjKGNyeXB0a2V5YXJnMiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX05FVF9QVVQgKCh1X2xvbmcpOCkKK2V4dGVybiAiQyIga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMihrZXlfbmV0c3RhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBrZXlzdGF0dXMgKiBrZXlfbmV0X3B1dF8yX3N2YyhrZXlfbmV0c3RhcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfR0VUICgodV9sb25nKTkpCitleHRlcm4gIkMiIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRVRfQ09OViAoKHVfbG9uZykxMCkKK2V4dGVybiAiQyIgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMihvcGFxdWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yX3N2YyhvcGFxdWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisKKyNlbGlmIF9fU1REQ19fCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMihvcGFxdWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzJfc3ZjKG9wYXF1ZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMl9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFRfUEsgKCh1X2xvbmcpNikKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yKGNyeXB0a2V5YXJnMiAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMl9zdmMoY3J5cHRrZXlhcmcyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfREVDUllQVF9QSyAoKHVfbG9uZyk3KQorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ORVRfUFVUICgodV9sb25nKTgpCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoa2V5X25ldHN0YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoa2V5X25ldHN0YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfTkVUX0dFVCAoKHVfbG9uZyk5KQorZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VUX0NPTlYgKCh1X2xvbmcpMTApCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIob3BhcXVlICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMob3BhcXVlICosIHN0cnVjdCBzdmNfcmVxICopOworCisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yKCk7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMl9zdmMoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMl9zdmMoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMl9zdmMoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yKCk7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMl9zdmMoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzIoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9FTkNSWVBUX1BLICgodV9sb25nKTYpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ERUNSWVBUX1BLICgodV9sb25nKTcpCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMigpOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9ORVRfUFVUICgodV9sb25nKTgpCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX05FVF9HRVQgKCh1X2xvbmcpOSkKK2V4dGVybiAga2V5X25ldHN0cmVzICoga2V5X25ldF9nZXRfMigpOworZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yX3N2YygpOworI2RlZmluZSBLRVlfR0VUX0NPTlYgKCh1X2xvbmcpMTApCitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZ2V0X2NvbnZfMl9zdmMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworI2VuZGlmIC8qICFfS0VZX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL25ldGRiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9uZXRkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWQ4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9uZXRkYi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qIEAoIyluZXRkYi5oCTIuMSA4OC8wNy8yOSAzLjkgUlBDU1JDICovCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKy8qCUAoIylycGMuaCAxLjggODcvMDcvMjQgU01JCSovCisKKy8qIENsZWFuZWQgdXAgZm9yIEdOVSBDIGxpYnJhcnkgcm9sYW5kQGdudS5haS5taXQuZWR1OgorICAgYWRkZWQgbXVsdGlwbGUgaW5jbHVzaW9uIHByb3RlY3Rpb24gYW5kIHVzZSBvZiA8c3lzL2NkZWZzLmg+LgorICAgSW4gR05VIHRoaXMgZmlsZSBpcyAjaW5jbHVkZSdkIGJ5IDxuZXRkYi5oPi4gICovCisKKyNpZm5kZWYgX1JQQ19ORVREQl9ICisjZGVmaW5lIF9SUENfTkVUREJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19CRUdJTl9ERUNMUworCitzdHJ1Y3QgcnBjZW50Cit7CisgIGNoYXIgKnJfbmFtZTsJCS8qIE5hbWUgb2Ygc2VydmVyIGZvciB0aGlzIHJwYyBwcm9ncmFtLiAgKi8KKyAgY2hhciAqKnJfYWxpYXNlczsJLyogQWxpYXMgbGlzdC4gICovCisgIGludCByX251bWJlcjsJCS8qIFJQQyBwcm9ncmFtIG51bWJlci4gICovCit9OworCitleHRlcm4gdm9pZCBzZXRycGNlbnQgKGludCBfX3N0YXlvcGVuKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgZW5kcnBjZW50ICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIHN0cnVjdCBycGNlbnQgKmdldHJwY2J5bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IHJwY2VudCAqZ2V0cnBjYnludW1iZXIgKGludCBfX251bWJlcikgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgcnBjZW50ICpnZXRycGNlbnQgKHZvaWQpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9NSVNDCitleHRlcm4gaW50IGdldHJwY2J5bmFtZV9yIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgc3RydWN0IHJwY2VudCAqX19yZXN1bHRfYnVmLAorCQkJICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgIHN0cnVjdCBycGNlbnQgKipfX3Jlc3VsdCkgX19USFJPVzsKKworZXh0ZXJuIGludCBnZXRycGNieW51bWJlcl9yIChpbnQgX19udW1iZXIsIHN0cnVjdCBycGNlbnQgKl9fcmVzdWx0X2J1ZiwKKwkJCSAgICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCSAgICAgc3RydWN0IHJwY2VudCAqKl9fcmVzdWx0KSBfX1RIUk9XOworCitleHRlcm4gaW50IGdldHJwY2VudF9yIChzdHJ1Y3QgcnBjZW50ICpfX3Jlc3VsdF9idWYsIGNoYXIgKl9fYnVmZmVyLAorCQkJc2l6ZV90IF9fYnVmbGVuLCBzdHJ1Y3QgcnBjZW50ICoqX19yZXN1bHQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9uZXRkYi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX2NsbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3BtYXBfY2xudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWM0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX2NsbnQuaApAQCAtMCwwICsxLDk4IEBACisvKiBAKCMpcG1hcF9jbG50LmgJMi4xIDg4LzA3LzI5IDQuMCBSUENTUkM7IGZyb20gMS4xMSA4OC8wMi8wOCBTTUkgKi8KKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogcG1hcF9jbG50LmgKKyAqIFN1cHBsaWVzIEMgcm91dGluZXMgdG8gZ2V0IHRvIHBvcnRtYXAgc2VydmljZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2lmbmRlZiBfUlBDX1BNQVBfQ0xOVF9ICisjZGVmaW5lIF9SUENfUE1BUF9DTE5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMveGRyLmg+CisjaW5jbHVkZSA8cnBjL2NsbnQuaD4KKworX19CRUdJTl9ERUNMUworCit0eXBlZGVmIGJvb2xfdCAoKnJlc3VsdHByb2NfdCkgKGNhZGRyX3QgcmVzcCwgc3RydWN0IHNvY2thZGRyX2luICpyYWRkcik7CisKKy8qCisgKiBVc2FnZToKKyAqCXN1Y2Nlc3MgPSBwbWFwX3NldChwcm9ncmFtLCB2ZXJzaW9uLCBwcm90b2NvbCwgcG9ydCk7CisgKglzdWNjZXNzID0gcG1hcF91bnNldChwcm9ncmFtLCB2ZXJzaW9uKTsKKyAqCXBvcnQgPSBwbWFwX2dldHBvcnQoYWRkcmVzcywgcHJvZ3JhbSwgdmVyc2lvbiwgcHJvdG9jb2wpOworICoJaGVhZCA9IHBtYXBfZ2V0bWFwcyhhZGRyZXNzKTsKKyAqCWNsbnRfc3RhdCA9IHBtYXBfcm10Y2FsbChhZGRyZXNzLCBwcm9ncmFtLCB2ZXJzaW9uLCBwcm9jZWR1cmUsCisgKgkJeGRyYXJncywgYXJnc3AsIHhkcnJlcywgcmVzcCwgdG91dCwgcG9ydF9wdHIpCisgKgkJKHdvcmtzIGZvciB1ZHAgb25seS4pCisgKiAJY2xudF9zdGF0ID0gY2xudF9icm9hZGNhc3QocHJvZ3JhbSwgdmVyc2lvbiwgcHJvY2VkdXJlLAorICoJCXhkcmFyZ3MsIGFyZ3NwLAl4ZHJyZXMsIHJlc3AsIGVhY2hyZXN1bHQpCisgKgkJKGxpa2UgcG1hcF9ybXRjYWxsLCBleGNlcHQgdGhlIGNhbGwgaXMgYnJvYWRjYXN0ZWQgdG8gYWxsCisgKgkJbG9jYWxseSBjb25uZWN0ZWQgbmV0cy4gIEZvciBlYWNoIHZhbGlkIHJlc3BvbnNlIHJlY2VpdmVkLAorICoJCXRoZSBwcm9jZWR1cmUgZWFjaHJlc3VsdCBpcyBjYWxsZWQuICBJdHMgZm9ybSBpczoKKyAqCWRvbmUgPSBlYWNocmVzdWx0KHJlc3AsIHJhZGRyKQorICoJCWJvb2xfdCBkb25lOworICoJCWNhZGRyX3QgcmVzcDsKKyAqCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gcmFkZHI7CisgKgkJd2hlcmUgcmVzcCBwb2ludHMgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGwgYW5kIHJhZGRyIGlzIHRoZQorICoJCWFkZHJlc3MgaWYgdGhlIHJlc3BvbmRlciB0byB0aGUgYnJvYWRjYXN0LgorICovCisKK2V4dGVybiBib29sX3QgcG1hcF9zZXQgKF9fY29uc3QgdV9sb25nIF9fcHJvZ3JhbSwgX19jb25zdCB1X2xvbmcgX192ZXJzLAorCQkJaW50IF9fcHJvdG9jb2wsIHVfc2hvcnQgX19wb3J0KSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCBwbWFwX3Vuc2V0IChfX2NvbnN0IHVfbG9uZyBfX3Byb2dyYW0sIF9fY29uc3QgdV9sb25nIF9fdmVycykKKyAgICAgX19USFJPVzsKK2V4dGVybiBzdHJ1Y3QgcG1hcGxpc3QgKnBtYXBfZ2V0bWFwcyAoc3RydWN0IHNvY2thZGRyX2luICpfX2FkZHJlc3MpIF9fVEhST1c7CitleHRlcm4gZW51bSBjbG50X3N0YXQgcG1hcF9ybXRjYWxsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKl9fYWRkciwKKwkJCQkgICAgX19jb25zdCB1X2xvbmcgX19wcm9nLAorCQkJCSAgICBfX2NvbnN0IHVfbG9uZyBfX3ZlcnMsCisJCQkJICAgIF9fY29uc3QgdV9sb25nIF9fcHJvYywKKwkJCQkgICAgeGRycHJvY190IF9feGRyYXJncywKKwkJCQkgICAgY2FkZHJfdCBfX2FyZ3NwLCB4ZHJwcm9jX3QgX194ZHJyZXMsCisJCQkJICAgIGNhZGRyX3QgX19yZXNwLCBzdHJ1Y3QgdGltZXZhbCBfX3RvdXQsCisJCQkJICAgIHVfbG9uZyAqX19wb3J0X3B0cikgX19USFJPVzsKK2V4dGVybiBlbnVtIGNsbnRfc3RhdCBjbG50X2Jyb2FkY2FzdCAoX19jb25zdCB1X2xvbmcgX19wcm9nLAorCQkJCSAgICAgIF9fY29uc3QgdV9sb25nIF9fdmVycywKKwkJCQkgICAgICBfX2NvbnN0IHVfbG9uZyBfX3Byb2MsIHhkcnByb2NfdCBfX3hhcmdzLAorCQkJCSAgICAgIGNhZGRyX3QgX19hcmdzcCwgeGRycHJvY190IF9feHJlc3VsdHMsCisJCQkJICAgICAgY2FkZHJfdCBfX3Jlc3VsdHNwLAorCQkJCSAgICAgIHJlc3VsdHByb2NfdCBfX2VhY2hyZXN1bHQpIF9fVEhST1c7CitleHRlcm4gdV9zaG9ydCBwbWFwX2dldHBvcnQgKHN0cnVjdCBzb2NrYWRkcl9pbiAqX19hZGRyZXNzLAorCQkJICAgICBfX2NvbnN0IHVfbG9uZyBfX3Byb2dyYW0sCisJCQkgICAgIF9fY29uc3QgdV9sb25nIF9fdmVyc2lvbiwgdV9pbnQgX19wcm90b2NvbCkKKyAgICAgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHJwYy9wbWFwX2NsbnQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9wcm90LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY0ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9wcm90LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qIEAoIylwbWFwX3Byb3QuaAkyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQzsgZnJvbSAxLjE0IDg4LzAyLzA4IFNNSSAqLworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisKKy8qCisgKiBwbWFwX3Byb3QuaAorICogUHJvdG9jb2wgZm9yIHRoZSBsb2NhbCBiaW5kZXIgc2VydmljZSwgb3IgcG1hcC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqLworCisjaWZuZGVmIF9SUENfUE1BUF9QUk9UX0gKKyNkZWZpbmUgX1JQQ19QTUFQX1BST1RfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8cnBjL3hkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBwcm90b2NvbDoKKyAqCisgKiBQTUFQUFJPQ19OVUxMKCkgcmV0dXJucyAoKQorICogCXRha2VzIG5vdGhpbmcsIHJldHVybnMgbm90aGluZworICoKKyAqIFBNQVBQUk9DX1NFVChzdHJ1Y3QgcG1hcCkgcmV0dXJucyAoYm9vbF90KQorICogCVRSVUUgaXMgc3VjY2VzcywgRkFMU0UgaXMgZmFpbHVyZS4gIFJlZ2lzdGVycyB0aGUgdHVwbGUKKyAqCVtwcm9nLCB2ZXJzLCBwcm90LCBwb3J0XS4KKyAqCisgKiBQTUFQUFJPQ19VTlNFVChzdHJ1Y3QgcG1hcCkgcmV0dXJucyAoYm9vbF90KQorICoJVFJVRSBpcyBzdWNjZXNzLCBGQUxTRSBpcyBmYWlsdXJlLiAgVW4tcmVnaXN0ZXJzIHBhaXIKKyAqCVtwcm9nLCB2ZXJzXS4gIHByb3QgYW5kIHBvcnQgYXJlIGlnbm9yZWQuCisgKgorICogUE1BUFBST0NfR0VUUE9SVChzdHJ1Y3QgcG1hcCkgcmV0dXJucyAobG9uZyB1bnNpZ25lZCkuCisgKgkwIGlzIGZhaWx1cmUuICBPdGhlcndpc2UgcmV0dXJucyB0aGUgcG9ydCBudW1iZXIgd2hlcmUgdGhlIHBhaXIKKyAqCVtwcm9nLCB2ZXJzXSBpcyByZWdpc3RlcmVkLiAgSXQgbWF5IGxpZSEKKyAqCisgKiBQTUFQUFJPQ19EVU1QKCkgUkVUVVJOUyAoc3RydWN0IHBtYXBsaXN0ICopCisgKgorICogUE1BUFBST0NfQ0FMTElUKHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQsIHN0cmluZzw+KQorICogCVJFVFVSTlMgKHBvcnQsIHN0cmluZzw+KTsKKyAqIHVzYWdlOiBlbmNhcHN1bGF0ZWRyZXN1bHRzID0gUE1BUFBST0NfQ0FMTElUKHByb2csIHZlcnMsIHByb2MsIGVuY2Fwc3VsYXRlZGFyZ3MpOworICogCUNhbGxzIHRoZSBwcm9jZWR1cmUgb24gdGhlIGxvY2FsIG1hY2hpbmUuICBJZiBpdCBpcyBub3QgcmVnaXN0ZXJlZCwKKyAqCXRoaXMgcHJvY2VkdXJlIGlzIHF1aXRlOyBpZSBpdCBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW5mb3JtYXRpb24hISEKKyAqCVRoaXMgcHJvY2VkdXJlIG9ubHkgaXMgc3VwcG9ydGVkIG9uIHJwYy91ZHAgYW5kIGNhbGxzIHZpYQorICoJcnBjL3VkcC4gIFRoaXMgcm91dGluZSBvbmx5IHBhc3NlcyBudWxsIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMuCisgKglUaGlzIGZpbGUgaGFzIG5vIGludGVyZmFjZSB0byB4ZHIgcm91dGluZXMgZm9yIFBNQVBQUk9DX0NBTExJVC4KKyAqCisgKiBUaGUgc2VydmljZSBzdXBwb3J0cyByZW1vdGUgcHJvY2VkdXJlIGNhbGxzIG9uIHVkcC9pcCBvciB0Y3AvaXAgc29ja2V0IDExMS4KKyAqLworCisjZGVmaW5lIFBNQVBQT1JUCQkoKHVfc2hvcnQpMTExKQorI2RlZmluZSBQTUFQUFJPRwkJKCh1X2xvbmcpMTAwMDAwKQorI2RlZmluZSBQTUFQVkVSUwkJKCh1X2xvbmcpMikKKyNkZWZpbmUgUE1BUFZFUlNfUFJPVE8JCSgodV9sb25nKTIpCisjZGVmaW5lIFBNQVBWRVJTX09SSUcJCSgodV9sb25nKTEpCisjZGVmaW5lIFBNQVBQUk9DX05VTEwJCSgodV9sb25nKTApCisjZGVmaW5lIFBNQVBQUk9DX1NFVAkJKCh1X2xvbmcpMSkKKyNkZWZpbmUgUE1BUFBST0NfVU5TRVQJCSgodV9sb25nKTIpCisjZGVmaW5lIFBNQVBQUk9DX0dFVFBPUlQJKCh1X2xvbmcpMykKKyNkZWZpbmUgUE1BUFBST0NfRFVNUAkJKCh1X2xvbmcpNCkKKyNkZWZpbmUgUE1BUFBST0NfQ0FMTElUCQkoKHVfbG9uZyk1KQorCitzdHJ1Y3QgcG1hcCB7CisJbG9uZyB1bnNpZ25lZCBwbV9wcm9nOworCWxvbmcgdW5zaWduZWQgcG1fdmVyczsKKwlsb25nIHVuc2lnbmVkIHBtX3Byb3Q7CisJbG9uZyB1bnNpZ25lZCBwbV9wb3J0OworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfcG1hcCAoWERSICpfX3hkcnMsIHN0cnVjdCBwbWFwICpfX3JlZ3MpIF9fVEhST1c7CisKK3N0cnVjdCBwbWFwbGlzdCB7CisJc3RydWN0IHBtYXAJcG1sX21hcDsKKwlzdHJ1Y3QgcG1hcGxpc3QgKnBtbF9uZXh0OworfTsKKworZXh0ZXJuIGJvb2xfdCB4ZHJfcG1hcGxpc3QgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgcG1hcGxpc3QgKipfX3JwKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3BtYXBfcHJvdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9wbWFwX3JtdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9ybXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTM4YjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcG1hcF9ybXQuaApAQCAtMCwwICsxLDY4IEBACisvKiBAKCMpcG1hcF9ybXQuaAkyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQzsgZnJvbSAxLjIgODgvMDIvMDggU01JICovCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIFN0cnVjdHVyZXMgYW5kIFhEUiByb3V0aW5lcyBmb3IgcGFyYW1ldGVycyB0byBhbmQgcmVwbGllcyBmcm9tCisgKiB0aGUgcG9ydG1hcHBlciByZW1vdGUtY2FsbC1zZXJ2aWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk4NiwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICovCisKKyNpZm5kZWYgX1JQQ19QTUFQX1JNVF9ICisjZGVmaW5lIF9SUENfUE1BUF9STVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworX19CRUdJTl9ERUNMUworCitzdHJ1Y3Qgcm10Y2FsbGFyZ3MgeworCXVfbG9uZyBwcm9nLCB2ZXJzLCBwcm9jLCBhcmdsZW47CisJY2FkZHJfdCBhcmdzX3B0cjsKKwl4ZHJwcm9jX3QgeGRyX2FyZ3M7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl9ybXRjYWxsX2FyZ3MgKFhEUiAqX194ZHJzLCBzdHJ1Y3Qgcm10Y2FsbGFyZ3MgKl9fY3JwKQorICAgICBfX1RIUk9XOworCitzdHJ1Y3Qgcm10Y2FsbHJlcyB7CisJdV9sb25nICpwb3J0X3B0cjsKKwl1X2xvbmcgcmVzdWx0c2xlbjsKKwljYWRkcl90IHJlc3VsdHNfcHRyOworCXhkcnByb2NfdCB4ZHJfcmVzdWx0czsKK307CisKK2V4dGVybiBib29sX3QgeGRyX3JtdGNhbGxyZXMgKFhEUiAqX194ZHJzLCBzdHJ1Y3Qgcm10Y2FsbHJlcyAqX19jcnApIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvcG1hcF9ybXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU0Mzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjLmgKQEAgLTAsMCArMSw5NyBAQAorLyogQCgjKXJwYy5oCTIuMyA4OC8wOC8xMCA0LjAgUlBDU1JDOyBmcm9tIDEuOSA4OC8wMi8wOCBTTUkgKi8KKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogcnBjLmgsIEp1c3QgaW5jbHVkZXMgdGhlIGJpbGxpb25zIG9mIHJwYyBoZWFkZXIgZmlsZXMgbmVjZXNzYXJ5IHRvCisgKiBkbyByZW1vdGUgcHJvY2VkdXJlIGNhbGxpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2lmbmRlZiBfUlBDX1JQQ19ICisjZGVmaW5lIF9SUENfUlBDX0ggMQorCisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CQkvKiBzb21lIHR5cGVkZWZzICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisvKiBleHRlcm5hbCBkYXRhIHJlcHJlc2VudGF0aW9uIGludGVyZmFjZXMgKi8KKyNpbmNsdWRlIDxycGMveGRyLmg+CQkvKiBnZW5lcmljIChkZSlzZXJpYWxpemVyICovCisKKy8qIENsaWVudCBzaWRlIG9ubHkgYXV0aGVudGljYXRpb24gKi8KKyNpbmNsdWRlIDxycGMvYXV0aC5oPgkJLyogZ2VuZXJpYyBhdXRoZW50aWNhdG9yIChjbGllbnQgc2lkZSkgKi8KKworLyogQ2xpZW50IHNpZGUgKG1vc3RseSkgcmVtb3RlIHByb2NlZHVyZSBjYWxsICovCisjaW5jbHVkZSA8cnBjL2NsbnQuaD4JCS8qIGdlbmVyaWMgcnBjIHN0dWZmICovCisKKy8qIHNlbWktcHJpdmF0ZSBwcm90b2NvbCBoZWFkZXJzICovCisjaW5jbHVkZSA8cnBjL3JwY19tc2cuaD4JLyogcHJvdG9jb2wgZm9yIHJwYyBtZXNzYWdlcyAqLworI2luY2x1ZGUgPHJwYy9hdXRoX3VuaXguaD4JLyogcHJvdG9jb2wgZm9yIHVuaXggc3R5bGUgY3JlZCAqLworI2luY2x1ZGUgPHJwYy9hdXRoX2Rlcy5oPgkvKiBwcm90b2NvbCBmb3IgZGVzIHN0eWxlIGNyZWQgKi8KKworLyogU2VydmVyIHNpZGUgb25seSByZW1vdGUgcHJvY2VkdXJlIGNhbGxlZSAqLworI2luY2x1ZGUgPHJwYy9zdmMuaD4JCS8qIHNlcnZpY2UgbWFuYWdlciBhbmQgbXVsdGlwbGV4ZXIgKi8KKyNpbmNsdWRlIDxycGMvc3ZjX2F1dGguaD4JLyogc2VydmljZSBzaWRlIGF1dGhlbnRpY2F0b3IgKi8KKworLyoKKyAqIENPTU1FTlQgT1VUIFRIRSBORVhUIElOQ0xVREUgSUYgUlVOTklORyBPTiBTVU4gT1MgT1IgT04gQSBWRVJTSU9OCisgKiBPRiBVTklYIEJBU0VEIE9OIE5GU1NSQy4gIFRoZXNlIHN5c3RlbXMgd2lsbCBhbHJlYWR5IGhhdmUgdGhlIHN0cnVjdHVyZXMKKyAqIGRlZmluZWQgYnkgPHJwYy9uZXRkYi5oPiBpbmNsdWRlZCBpbiA8bmV0ZGIuaD4uCisgKi8KKy8qIHJvdXRpbmVzIGZvciBwYXJzaW5nIC9ldGMvcnBjICovCisjaW5jbHVkZSA8cnBjL25ldGRiLmg+CQkvKiBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcyB0byBwYXJzZSAvZXRjL3JwYyAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMsIHByb3RlY3RlZCBmb3IgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KK2V4dGVybiBmZF9zZXQgKl9fcnBjX3RocmVhZF9zdmNfZmRzZXQgKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyNkZWZpbmUgc3ZjX2Zkc2V0ICgqX19ycGNfdGhyZWFkX3N2Y19mZHNldCAoKSkKKworZXh0ZXJuIHN0cnVjdCBycGNfY3JlYXRlZXJyICpfX3JwY190aHJlYWRfY3JlYXRlZXJyICh2b2lkKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjZGVmaW5lIGdldF9ycGNfY3JlYXRlZXJyKCkgKCpfX3JwY190aHJlYWRfY3JlYXRlZXJyICgpKQorLyogVGhlIHBlb3BsZSB3aG8gImVuZ2luZWVyZWQiIFJQQyBzaG91bGQgYmVlIHB1bmlzaGVkIGZvciBuYW1pbmcgdGhlCisgICBkYXRhIHN0cnVjdHVyZSBhbmQgdGhlIHZhcmlhYmxlIHRoZSBzYW1lLiAgV2UgY2Fubm90IGFsd2F5cyBkZWZpbmUgdGhlCisgICBtYWNybyAncnBjX2NyZWF0ZWVycicgYmVjYXVzZSB0aGlzIHdvdWxkIHByZXZlbnQgcGVvcGxlIGZyb20gZGVmaW5pbmcKKyAgIG9iamVjdCBvZiB0eXBlICdzdHJ1Y3QgcnBjX2NyZWF0ZWVycicuICBTbyB3ZSBsZWF2ZSBpdCB1cCB0byB0aGUgdXNlcgorICAgdG8gc2VsZWN0IHRyYW5zcGFyZW50IHJlcGxhY2VtZW50IGFsc28gb2YgdGhpcyB2YXJpYWJsZS4gICovCisjaWZkZWYgX1JQQ19NVF9WQVJTCisjIGRlZmluZSBycGNfY3JlYXRlZXJyICgqX19ycGNfdGhyZWFkX2NyZWF0ZWVyciAoKSkKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHBvbGxmZCAqKl9fcnBjX3RocmVhZF9zdmNfcG9sbGZkICh2b2lkKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjZGVmaW5lIHN2Y19wb2xsZmQgKCpfX3JwY190aHJlYWRfc3ZjX3BvbGxmZCAoKSkKKworZXh0ZXJuIGludCAqX19ycGNfdGhyZWFkX3N2Y19tYXhfcG9sbGZkICh2b2lkKSBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjZGVmaW5lIHN2Y19tYXhfcG9sbGZkICgqX19ycGNfdGhyZWFkX3N2Y19tYXhfcG9sbGZkICgpKQorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3JwYy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfZGVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNmQxNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3JwY19kZXMuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKiAKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICogCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqIAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICogCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKiAKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworLyoKKyAqIEdlbmVyaWMgREVTIGRyaXZlciBpbnRlcmZhY2UKKyAqIEtlZXAgdGhpcyBmaWxlIGhhcmR3YXJlIGluZGVwZW5kZW50IQorICogQ29weXJpZ2h0IChjKSAxOTg2IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqLworCisjaWZuZGVmIF9ERVNfSAorI2RlZmluZSBfREVTX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjZGVmaW5lIERFU19NQVhMRU4gCTY1NTM2CS8qIG1heGltdW0gIyBvZiBieXRlcyB0byBlbmNyeXB0ICAqLworI2RlZmluZSBERVNfUVVJQ0tMRU4JMTYJLyogbWF4aW11bSAjIG9mIGJ5dGVzIHRvIGVuY3J5cHQgcXVpY2tseSAqLworCitlbnVtIGRlc2RpcgorICB7CisgICAgRU5DUllQVCwgREVDUllQVAorICB9OworZW51bSBkZXNtb2RlCisgIHsKKyAgICBDQkMsIEVDQgorICB9OworCisvKgorICogcGFyYW1ldGVycyB0byBpb2N0bCBjYWxsCisgKi8KK3N0cnVjdCBkZXNwYXJhbXMKKyAgeworICAgIHVfY2hhciBkZXNfa2V5WzhdOwkJLyoga2V5ICh3aXRoIGxvdyBiaXQgcGFyaXR5KSAqLworICAgIGVudW0gZGVzZGlyIGRlc19kaXI7CS8qIGRpcmVjdGlvbiAqLworICAgIGVudW0gZGVzbW9kZSBkZXNfbW9kZTsJLyogbW9kZSAqLworICAgIHVfY2hhciBkZXNfaXZlY1s4XTsJCS8qIGlucHV0IHZlY3RvciAqLworICAgIHVuc2lnbmVkIGRlc19sZW47CQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gY3J5cHQgKi8KKyAgICB1bmlvbgorICAgICAgeworCXVfY2hhciBVREVTX2RhdGFbREVTX1FVSUNLTEVOXTsKKwl1X2NoYXIgKlVERVNfYnVmOworICAgICAgfQorICAgIFVERVM7CisjZGVmaW5lIGRlc19kYXRhIFVERVMuVURFU19kYXRhCS8qIGRpcmVjdCBkYXRhIGhlcmUgaWYgcXVpY2sgKi8KKyNkZWZpbmUgZGVzX2J1ZglVREVTLlVERVNfYnVmCS8qIG90aGVyd2lzZSwgcG9pbnRlciB0byBkYXRhICovCisgIH07CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjX21zZy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvcnBjX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNmQ2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9ycGNfbXNnLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qIEAoIylycGNfbXNnLmgJMi4xIDg4LzA3LzI5IDQuMCBSUENTUkMgKi8KKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworLyogICAgICBAKCMpcnBjX21zZy5oIDEuNyA4Ni8wNy8xNiBTTUkgICAgICAqLworCisjaWZuZGVmIF9SUENfTVNHX0gKKyNkZWZpbmUgX1JQQ19NU0dfSCAxCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgPHJwYy94ZHIuaD4KKyNpbmNsdWRlIDxycGMvY2xudC5oPgorCisvKgorICogcnBjX21zZy5oCisgKiBycGMgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2RlZmluZSBSUENfTVNHX1ZFUlNJT04JCSgodV9sb25nKSAyKQorI2RlZmluZSBSUENfU0VSVklDRV9QT1JUCSgodV9zaG9ydCkgMjA0OCkKKworX19CRUdJTl9ERUNMUworCisvKgorICogQm90dG9tIHVwIGRlZmluaXRpb24gb2YgYW4gcnBjIG1lc3NhZ2UuCisgKiBOT1RFOiBjYWxsIGFuZCByZXBseSB1c2UgdGhlIHNhbWUgb3ZlcmFsbCBzdHJ1Y3QgYnV0CisgKiBkaWZmZXJlbnQgcGFydHMgb2YgdW5pb25zIHdpdGhpbiBpdC4KKyAqLworCitlbnVtIG1zZ190eXBlIHsKKwlDQUxMPTAsCisJUkVQTFk9MQorfTsKKworZW51bSByZXBseV9zdGF0IHsKKwlNU0dfQUNDRVBURUQ9MCwKKwlNU0dfREVOSUVEPTEKK307CisKK2VudW0gYWNjZXB0X3N0YXQgeworCVNVQ0NFU1M9MCwKKwlQUk9HX1VOQVZBSUw9MSwKKwlQUk9HX01JU01BVENIPTIsCisJUFJPQ19VTkFWQUlMPTMsCisJR0FSQkFHRV9BUkdTPTQsCisJU1lTVEVNX0VSUj01Cit9OworCitlbnVtIHJlamVjdF9zdGF0IHsKKwlSUENfTUlTTUFUQ0g9MCwKKwlBVVRIX0VSUk9SPTEKK307CisKKy8qCisgKiBSZXBseSBwYXJ0IG9mIGFuIHJwYyBleGNoYW5nZQorICovCisKKy8qCisgKiBSZXBseSB0byBhbiBycGMgcmVxdWVzdCB0aGF0IHdhcyBhY2NlcHRlZCBieSB0aGUgc2VydmVyLgorICogTm90ZTogdGhlcmUgY291bGQgYmUgYW4gZXJyb3IgZXZlbiB0aG91Z2ggdGhlIHJlcXVlc3Qgd2FzCisgKiBhY2NlcHRlZC4KKyAqLworc3RydWN0IGFjY2VwdGVkX3JlcGx5IHsKKwlzdHJ1Y3Qgb3BhcXVlX2F1dGgJYXJfdmVyZjsKKwllbnVtIGFjY2VwdF9zdGF0CWFyX3N0YXQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9sb25nCWxvdzsKKwkJCXVfbG9uZwloaWdoOworCQl9IEFSX3ZlcnNpb25zOworCQlzdHJ1Y3QgeworCQkJY2FkZHJfdAl3aGVyZTsKKwkJCXhkcnByb2NfdCBwcm9jOworCQl9IEFSX3Jlc3VsdHM7CisJCS8qIGFuZCBtYW55IG90aGVyIG51bGwgY2FzZXMgKi8KKwl9IHJ1OworI2RlZmluZQlhcl9yZXN1bHRzCXJ1LkFSX3Jlc3VsdHMKKyNkZWZpbmUJYXJfdmVycwkJcnUuQVJfdmVyc2lvbnMKK307CisKKy8qCisgKiBSZXBseSB0byBhbiBycGMgcmVxdWVzdCB0aGF0IHdhcyByZWplY3RlZCBieSB0aGUgc2VydmVyLgorICovCitzdHJ1Y3QgcmVqZWN0ZWRfcmVwbHkgeworCWVudW0gcmVqZWN0X3N0YXQgcmpfc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2xvbmcgbG93OworCQkJdV9sb25nIGhpZ2g7CisJCX0gUkpfdmVyc2lvbnM7CisJCWVudW0gYXV0aF9zdGF0IFJKX3doeTsgIC8qIHdoeSBhdXRoZW50aWNhdGlvbiBkaWQgbm90IHdvcmsgKi8KKwl9IHJ1OworI2RlZmluZQlyal92ZXJzCXJ1LlJKX3ZlcnNpb25zCisjZGVmaW5lCXJqX3doeQlydS5SSl93aHkKK307CisKKy8qCisgKiBCb2R5IG9mIGEgcmVwbHkgdG8gYW4gcnBjIHJlcXVlc3QuCisgKi8KK3N0cnVjdCByZXBseV9ib2R5IHsKKwllbnVtIHJlcGx5X3N0YXQgcnBfc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCBhY2NlcHRlZF9yZXBseSBSUF9hcjsKKwkJc3RydWN0IHJlamVjdGVkX3JlcGx5IFJQX2RyOworCX0gcnU7CisjZGVmaW5lCXJwX2FjcHQJcnUuUlBfYXIKKyNkZWZpbmUJcnBfcmpjdAlydS5SUF9kcgorfTsKKworLyoKKyAqIEJvZHkgb2YgYW4gcnBjIHJlcXVlc3QgY2FsbC4KKyAqLworc3RydWN0IGNhbGxfYm9keSB7CisJdV9sb25nIGNiX3JwY3ZlcnM7CS8qIG11c3QgYmUgZXF1YWwgdG8gdHdvICovCisJdV9sb25nIGNiX3Byb2c7CisJdV9sb25nIGNiX3ZlcnM7CisJdV9sb25nIGNiX3Byb2M7CisJc3RydWN0IG9wYXF1ZV9hdXRoIGNiX2NyZWQ7CisJc3RydWN0IG9wYXF1ZV9hdXRoIGNiX3ZlcmY7IC8qIHByb3RvY29sIHNwZWNpZmljIC0gcHJvdmlkZWQgYnkgY2xpZW50ICovCit9OworCisvKgorICogVGhlIHJwYyBtZXNzYWdlCisgKi8KK3N0cnVjdCBycGNfbXNnIHsKKwl1X2xvbmcJCQlybV94aWQ7CisJZW51bSBtc2dfdHlwZQkJcm1fZGlyZWN0aW9uOworCXVuaW9uIHsKKwkJc3RydWN0IGNhbGxfYm9keSBSTV9jbWI7CisJCXN0cnVjdCByZXBseV9ib2R5IFJNX3JtYjsKKwl9IHJ1OworI2RlZmluZQlybV9jYWxsCQlydS5STV9jbWIKKyNkZWZpbmUJcm1fcmVwbHkJcnUuUk1fcm1iCit9OworI2RlZmluZQlhY3B0ZWRfcnBseQlydS5STV9ybWIucnUuUlBfYXIKKyNkZWZpbmUJcmpjdGVkX3JwbHkJcnUuUk1fcm1iLnJ1LlJQX2RyCisKKworLyoKKyAqIFhEUiByb3V0aW5lIHRvIGhhbmRsZSBhIHJwYyBtZXNzYWdlLgorICogeGRyX2NhbGxtc2coeGRycywgY21zZykKKyAqIAlYRFIgKnhkcnM7CisgKiAJc3RydWN0IHJwY19tc2cgKmNtc2c7CisgKi8KK2V4dGVybiBib29sX3QJeGRyX2NhbGxtc2cgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgcnBjX21zZyAqX19jbXNnKSBfX1RIUk9XOworCisvKgorICogWERSIHJvdXRpbmUgdG8gcHJlLXNlcmlhbGl6ZSB0aGUgc3RhdGljIHBhcnQgb2YgYSBycGMgbWVzc2FnZS4KKyAqIHhkcl9jYWxsaGRyKHhkcnMsIGNtc2cpCisgKiAJWERSICp4ZHJzOworICogCXN0cnVjdCBycGNfbXNnICpjbXNnOworICovCitleHRlcm4gYm9vbF90CXhkcl9jYWxsaGRyIChYRFIgKl9feGRycywgc3RydWN0IHJwY19tc2cgKl9fY21zZykgX19USFJPVzsKKworLyoKKyAqIFhEUiByb3V0aW5lIHRvIGhhbmRsZSBhIHJwYyByZXBseS4KKyAqIHhkcl9yZXBseW1zZyh4ZHJzLCBybXNnKQorICogCVhEUiAqeGRyczsKKyAqIAlzdHJ1Y3QgcnBjX21zZyAqcm1zZzsKKyAqLworZXh0ZXJuIGJvb2xfdAl4ZHJfcmVwbHltc2cgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgcnBjX21zZyAqX19ybXNnKSBfX1RIUk9XOworCisvKgorICogRmlsbHMgaW4gdGhlIGVycm9yIHBhcnQgb2YgYSByZXBseSBtZXNzYWdlLgorICogX3NldGVycl9yZXBseShtc2csIGVycm9yKQorICogCXN0cnVjdCBycGNfbXNnICptc2c7CisgKiAJc3RydWN0IHJwY19lcnIgKmVycm9yOworICovCitleHRlcm4gdm9pZAlfc2V0ZXJyX3JlcGx5IChzdHJ1Y3QgcnBjX21zZyAqX19tc2csIHN0cnVjdCBycGNfZXJyICpfX2Vycm9yKQorICAgICBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3JwY19tc2cuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9zdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZjYTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjLmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogc3ZjLmgsIFNlcnZlci1zaWRlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBpbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2lmbmRlZiBfUlBDX1NWQ19ICisjZGVmaW5lIF9SUENfU1ZDX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvcnBjX21zZy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBUaGlzIGludGVyZmFjZSBtdXN0IG1hbmFnZSB0d28gaXRlbXMgY29uY2VybmluZyByZW1vdGUgcHJvY2VkdXJlIGNhbGxpbmc6CisgKgorICogMSkgQW4gYXJiaXRyYXJ5IG51bWJlciBvZiB0cmFuc3BvcnQgY29ubmVjdGlvbnMgdXBvbiB3aGljaCBycGMgcmVxdWVzdHMKKyAqIGFyZSByZWNlaXZlZC4gIFRoZSB0d28gbW9zdCBub3RhYmxlIHRyYW5zcG9ydHMgYXJlIFRDUCBhbmQgVURQOyAgdGhleSBhcmUKKyAqIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgYnkgcm91dGluZXMgaW4gc3ZjX3RjcC5jIGFuZCBzdmNfdWRwLmMsIHJlc3BlY3RpdmVseTsKKyAqIHRoZXkgaW4gdHVybiBjYWxsIHhwcnRfcmVnaXN0ZXIgYW5kIHhwcnRfdW5yZWdpc3Rlci4KKyAqCisgKiAyKSBBbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGxvY2FsbHkgcmVnaXN0ZXJlZCBzZXJ2aWNlcy4gIFNlcnZpY2VzIGFyZQorICogZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgZm91ciBkYXRhOiBwcm9ncmFtIG51bWJlciwgdmVyc2lvbiBudW1iZXIsCisgKiAic2VydmljZSBkaXNwYXRjaCIgZnVuY3Rpb24sIGEgdHJhbnNwb3J0IGhhbmRsZSwgYW5kIGEgYm9vbGVhbiB0aGF0CisgKiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGV4cG9ydGVkIHByb2dyYW0gc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCBhCisgKiBsb2NhbCBiaW5kZXIgc2VydmljZTsgIGlmIHRydWUgdGhlIHByb2dyYW0ncyBudW1iZXIgYW5kIHZlcnNpb24gYW5kIHRoZQorICogcG9ydCBudW1iZXIgZnJvbSB0aGUgdHJhbnNwb3J0IGhhbmRsZSBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBiaW5kZXIuCisgKiBUaGVzZSBkYXRhIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIHJwYyBzdmMgc3lzdGVtIHZpYSBzdmNfcmVnaXN0ZXIuCisgKgorICogQSBzZXJ2aWNlJ3MgZGlzcGF0Y2ggZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGFuIHJwYyByZXF1ZXN0IGNvbWVzIGluCisgKiBvbiBhIHRyYW5zcG9ydC4gIFRoZSByZXF1ZXN0J3MgcHJvZ3JhbSBhbmQgdmVyc2lvbiBudW1iZXJzIG11c3QgbWF0Y2gKKyAqIHRob3NlIG9mIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UuICBUaGUgZGlzcGF0Y2ggZnVuY3Rpb24gaXMgcGFzc2VkIHR3bworICogcGFyYW1ldGVycywgc3RydWN0IHN2Y19yZXEgKiBhbmQgU1ZDWFBSVCAqLCBkZWZpbmVkIGJlbG93LgorICovCisKK2VudW0geHBydF9zdGF0IHsKKwlYUFJUX0RJRUQsCisJWFBSVF9NT1JFUkVRUywKKwlYUFJUX0lETEUKK307CisKKy8qCisgKiBTZXJ2ZXIgc2lkZSB0cmFuc3BvcnQgaGFuZGxlCisgKi8KK3R5cGVkZWYgc3RydWN0IFNWQ1hQUlQgU1ZDWFBSVDsKK3N0cnVjdCBTVkNYUFJUIHsKKyAgaW50IHhwX3NvY2s7CisgIHVfc2hvcnQgeHBfcG9ydDsJCS8qIGFzc29jaWF0ZWQgcG9ydCBudW1iZXIgKi8KKyAgY29uc3Qgc3RydWN0IHhwX29wcyB7CisgICAgYm9vbF90CSgqeHBfcmVjdikgKFNWQ1hQUlQgKl9feHBydCwgc3RydWN0IHJwY19tc2cgKl9fbXNnKTsKKwkJCQkvKiByZWNlaXZlIGluY29taW5nIHJlcXVlc3RzICovCisgICAgZW51bSB4cHJ0X3N0YXQgKCp4cF9zdGF0KSAoU1ZDWFBSVCAqX194cHJ0KTsKKwkJCQkvKiBnZXQgdHJhbnNwb3J0IHN0YXR1cyAqLworICAgIGJvb2xfdAkoKnhwX2dldGFyZ3MpIChTVkNYUFJUICpfX3hwcnQsIHhkcnByb2NfdCBfX3hkcl9hcmdzLAorCQkJICAgICAgIGNhZGRyX3QgYXJnc19wdHIpOyAvKiBnZXQgYXJndW1lbnRzICovCisgICAgYm9vbF90CSgqeHBfcmVwbHkpIChTVkNYUFJUICpfX3hwcnQsIHN0cnVjdCBycGNfbXNnICpfX21zZyk7CisJCQkJLyogc2VuZCByZXBseSAqLworICAgIGJvb2xfdAkoKnhwX2ZyZWVhcmdzKSAoU1ZDWFBSVCAqX194cHJ0LCB4ZHJwcm9jX3QgX194ZHJfYXJncywKKwkJCQljYWRkcl90IGFyZ3NfcHRyKTsKKwkJCQkvKiBmcmVlIG1lbSBhbGxvY2F0ZWQgZm9yIGFyZ3MgKi8KKyAgICB2b2lkCSgqeHBfZGVzdHJveSkgKFNWQ1hQUlQgKl9feHBydCk7CisJCQkJLyogZGVzdHJveSB0aGlzIHN0cnVjdCAqLworICB9ICp4cF9vcHM7CisgIGludAkJeHBfYWRkcmxlbjsJIC8qIGxlbmd0aCBvZiByZW1vdGUgYWRkcmVzcyAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4geHBfcmFkZHI7CSAvKiByZW1vdGUgYWRkcmVzcyAqLworICBzdHJ1Y3Qgb3BhcXVlX2F1dGggeHBfdmVyZjsJIC8qIHJhdyByZXNwb25zZSB2ZXJpZmllciAqLworICBjYWRkcl90CQl4cF9wMTsJCSAvKiBwcml2YXRlICovCisgIGNhZGRyX3QJCXhwX3AyOwkJIC8qIHByaXZhdGUgKi8KKyAgY2hhcgkJeHBfcGFkIFsyNTZdOwkvKiBwYWRkaW5nLCBpbnRlcm5hbCB1c2UgKi8KK307CisKKy8qCisgKiAgQXBwcm92ZWQgd2F5IG9mIGdldHRpbmcgYWRkcmVzcyBvZiBjYWxsZXIKKyAqLworI2RlZmluZSBzdmNfZ2V0Y2FsbGVyKHgpICgmKHgpLT54cF9yYWRkcikKKworLyoKKyAqIE9wZXJhdGlvbnMgZGVmaW5lZCBvbiBhbiBTVkNYUFJUIGhhbmRsZQorICoKKyAqIFNWQ1hQUlQJCSp4cHJ0OworICogc3RydWN0IHJwY19tc2cJKm1zZzsKKyAqIHhkcnByb2NfdAkJIHhhcmdzOworICogY2FkZHJfdAkJIGFyZ3NwOworICovCisjZGVmaW5lIFNWQ19SRUNWKHhwcnQsIG1zZykJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX3JlY3YpKCh4cHJ0KSwgKG1zZykpCisjZGVmaW5lIHN2Y19yZWN2KHhwcnQsIG1zZykJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX3JlY3YpKCh4cHJ0KSwgKG1zZykpCisKKyNkZWZpbmUgU1ZDX1NUQVQoeHBydCkJCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9zdGF0KSh4cHJ0KQorI2RlZmluZSBzdmNfc3RhdCh4cHJ0KQkJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX3N0YXQpKHhwcnQpCisKKyNkZWZpbmUgU1ZDX0dFVEFSR1MoeHBydCwgeGFyZ3MsIGFyZ3NwKQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9nZXRhcmdzKSgoeHBydCksICh4YXJncyksIChhcmdzcCkpCisjZGVmaW5lIHN2Y19nZXRhcmdzKHhwcnQsIHhhcmdzLCBhcmdzcCkJCQlcCisJKCooeHBydCktPnhwX29wcy0+eHBfZ2V0YXJncykoKHhwcnQpLCAoeGFyZ3MpLCAoYXJnc3ApKQorCisjZGVmaW5lIFNWQ19SRVBMWSh4cHJ0LCBtc2cpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9yZXBseSkgKCh4cHJ0KSwgKG1zZykpCisjZGVmaW5lIHN2Y19yZXBseSh4cHJ0LCBtc2cpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9yZXBseSkgKCh4cHJ0KSwgKG1zZykpCisKKyNkZWZpbmUgU1ZDX0ZSRUVBUkdTKHhwcnQsIHhhcmdzLCBhcmdzcCkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9mcmVlYXJncykoKHhwcnQpLCAoeGFyZ3MpLCAoYXJnc3ApKQorI2RlZmluZSBzdmNfZnJlZWFyZ3MoeHBydCwgeGFyZ3MsIGFyZ3NwKQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX2ZyZWVhcmdzKSgoeHBydCksICh4YXJncyksIChhcmdzcCkpCisKKyNkZWZpbmUgU1ZDX0RFU1RST1koeHBydCkJCQkJXAorCSgqKHhwcnQpLT54cF9vcHMtPnhwX2Rlc3Ryb3kpKHhwcnQpCisjZGVmaW5lIHN2Y19kZXN0cm95KHhwcnQpCQkJCVwKKwkoKih4cHJ0KS0+eHBfb3BzLT54cF9kZXN0cm95KSh4cHJ0KQorCisKKy8qCisgKiBTZXJ2aWNlIHJlcXVlc3QKKyAqLworc3RydWN0IHN2Y19yZXEgeworICBycGNwcm9nX3QgcnFfcHJvZzsgICAgICAgICAgICAvKiBzZXJ2aWNlIHByb2dyYW0gbnVtYmVyICovCisgIHJwY3ZlcnNfdCBycV92ZXJzOyAgICAgICAgICAgIC8qIHNlcnZpY2UgcHJvdG9jb2wgdmVyc2lvbiAqLworICBycGNwcm9jX3QgcnFfcHJvYzsgICAgICAgICAgICAvKiB0aGUgZGVzaXJlZCBwcm9jZWR1cmUgKi8KKyAgc3RydWN0IG9wYXF1ZV9hdXRoIHJxX2NyZWQ7ICAgLyogcmF3IGNyZWRzIGZyb20gdGhlIHdpcmUgKi8KKyAgY2FkZHJfdCBycV9jbG50Y3JlZDsgICAgICAgICAgLyogcmVhZCBvbmx5IGNvb2tlZCBjcmVkICovCisgIFNWQ1hQUlQgKnJxX3hwcnQ7ICAgICAgICAgICAgIC8qIGFzc29jaWF0ZWQgdHJhbnNwb3J0ICovCit9OworCisjaWZuZGVmIF9fRElTUEFUQ0hfRk5fVAorI2RlZmluZSBfX0RJU1BBVENIX0ZOX1QKK3R5cGVkZWYgdm9pZCAoKl9fZGlzcGF0Y2hfZm5fdCkgKHN0cnVjdCBzdmNfcmVxKiwgU1ZDWFBSVCopOworI2VuZGlmCisKKy8qCisgKiBTZXJ2aWNlIHJlZ2lzdHJhdGlvbgorICoKKyAqIHN2Y19yZWdpc3Rlcih4cHJ0LCBwcm9nLCB2ZXJzLCBkaXNwYXRjaCwgcHJvdG9jb2wpCisgKglTVkNYUFJUICp4cHJ0OworICoJcnBjcHJvZ190IHByb2c7CisgKglycGN2ZXJzX3QgdmVyczsKKyAqCXZvaWQgKCpkaXNwYXRjaCkoc3RydWN0IHN2Y19yZXEqLCBTVkNYUFJUKik7CisgKglycGNwcm90X3QgcHJvdG9jb2w7ICBsaWtlIFRDUCBvciBVRFAsIHplcm8gbWVhbnMgZG8gbm90IHJlZ2lzdGVyCisgKi8KK2V4dGVybiBib29sX3Qgc3ZjX3JlZ2lzdGVyIChTVkNYUFJUICpfX3hwcnQsIHJwY3Byb2dfdCBfX3Byb2csCisJCQkgICAgcnBjdmVyc190IF9fdmVycywgX19kaXNwYXRjaF9mbl90IF9fZGlzcGF0Y2gsCisJCQkgICAgcnBjcHJvdF90IF9fcHJvdG9jb2wpIF9fVEhST1c7CisKKy8qCisgKiBTZXJ2aWNlIHVuLXJlZ2lzdHJhdGlvbgorICoKKyAqIHN2Y191bnJlZ2lzdGVyKHByb2csIHZlcnMpCisgKglycGNwcm9nX3QgcHJvZzsKKyAqCXJwY3ZlcnNfdCB2ZXJzOworICovCitleHRlcm4gdm9pZCBzdmNfdW5yZWdpc3RlciAocnBjcHJvZ190IF9fcHJvZywgcnBjdmVyc190IF9fdmVycykgX19USFJPVzsKKworLyoKKyAqIFRyYW5zcG9ydCByZWdpc3RyYXRpb24uCisgKgorICogeHBydF9yZWdpc3Rlcih4cHJ0KQorICoJU1ZDWFBSVCAqeHBydDsKKyAqLworZXh0ZXJuIHZvaWQgeHBydF9yZWdpc3RlciAoU1ZDWFBSVCAqX194cHJ0KSBfX1RIUk9XOworCisvKgorICogVHJhbnNwb3J0IHVuLXJlZ2lzdGVyCisgKgorICogeHBydF91bnJlZ2lzdGVyKHhwcnQpCisgKglTVkNYUFJUICp4cHJ0OworICovCitleHRlcm4gdm9pZCB4cHJ0X3VucmVnaXN0ZXIgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworCisvKgorICogV2hlbiB0aGUgc2VydmljZSByb3V0aW5lIGlzIGNhbGxlZCwgaXQgbXVzdCBmaXJzdCBjaGVjayB0byBzZWUgaWYgaXQKKyAqIGtub3dzIGFib3V0IHRoZSBwcm9jZWR1cmU7ICBpZiBub3QsIGl0IHNob3VsZCBjYWxsIHN2Y2Vycl9ub3Byb2MKKyAqIGFuZCByZXR1cm4uICBJZiBzbywgaXQgc2hvdWxkIGRlc2VyaWFsaXplIGl0cyBhcmd1bWVudHMgdmlhCisgKiBTVkNfR0VUQVJHUyAoZGVmaW5lZCBhYm92ZSkuICBJZiB0aGUgZGVzZXJpYWxpemF0aW9uIGRvZXMgbm90IHdvcmssCisgKiBzdmNlcnJfZGVjb2RlIHNob3VsZCBiZSBjYWxsZWQgZm9sbG93ZWQgYnkgYSByZXR1cm4uICBTdWNjZXNzZnVsCisgKiBkZWNvZGluZyBvZiB0aGUgYXJndW1lbnRzIHNob3VsZCBiZSBmb2xsb3dlZCB0aGUgZXhlY3V0aW9uIG9mIHRoZQorICogcHJvY2VkdXJlJ3MgY29kZSBhbmQgYSBjYWxsIHRvIHN2Y19zZW5kcmVwbHkuCisgKgorICogQWxzbywgaWYgdGhlIHNlcnZpY2UgcmVmdXNlcyB0byBleGVjdXRlIHRoZSBwcm9jZWR1cmUgZHVlIHRvIHRvby0KKyAqIHdlYWsgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycywgc3ZjZXJyX3dlYWthdXRoIHNob3VsZCBiZSBjYWxsZWQuCisgKiBOb3RlOiBkbyBub3QgY29uZnVzZSBhY2Nlc3MtY29udHJvbCBmYWlsdXJlIHdpdGggd2VhayBhdXRoZW50aWNhdGlvbiEKKyAqCisgKiBOQjogSW4gcHVyZSBpbXBsZW1lbnRhdGlvbnMgb2YgcnBjLCB0aGUgY2FsbGVyIGFsd2F5cyB3YWl0cyBmb3IgYSByZXBseQorICogbXNnLiAgVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiBzdmNfc2VuZHJlcGx5IGlzIGNhbGxlZC4KKyAqIFRoZXJlZm9yZSBwdXJlIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIHNob3VsZCBhbHdheXMgY2FsbAorICogc3ZjX3NlbmRyZXBseSBldmVuIGlmIHRoZSBmdW5jdGlvbiBsb2dpY2FsbHkgcmV0dXJucyB2b2lkOyAgdXNlCisgKiB4ZHIuaCAtIHhkcl92b2lkIGZvciB0aGUgeGRyIHJvdXRpbmUuICBIT1dFVkVSLCB0Y3AgYmFzZWQgcnBjIGFsbG93cworICogZm9yIHRoZSBhYnVzZSBvZiBwdXJlIHJwYyB2aWEgYmF0Y2hlZCBjYWxsaW5nIG9yIHBpcGVsaW5pbmcuICBJbiB0aGUKKyAqIGNhc2Ugb2YgYSBiYXRjaGVkIGNhbGwsIHN2Y19zZW5kcmVwbHkgc2hvdWxkIE5PVCBiZSBjYWxsZWQgc2luY2UKKyAqIHRoaXMgd291bGQgc2VuZCBhIHJldHVybiBtZXNzYWdlLCB3aGljaCBpcyB3aGF0IGJhdGNoaW5nIHRyaWVzIHRvIGF2b2lkLgorICogSXQgaXMgdGhlIHNlcnZpY2UvcHJvdG9jb2wgd3JpdGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8ga25vdyB3aGljaCBjYWxscyBhcmUKKyAqIGJhdGNoZWQgYW5kIHdoaWNoIGFyZSBub3QuICBXYXJuaW5nOiByZXNwb25kaW5nIHRvIGJhdGNoIGNhbGxzIG1heQorICogZGVhZGxvY2sgdGhlIGNhbGxlciBhbmQgc2VydmVyIHByb2Nlc3NlcyEKKyAqLworCitleHRlcm4gYm9vbF90CXN2Y19zZW5kcmVwbHkgKFNWQ1hQUlQgKnhwcnQsIHhkcnByb2NfdCBfX3hkcl9yZXN1bHRzLAorCQkJICAgICAgIGNhZGRyX3QgX194ZHJfbG9jYXRpb24pIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9kZWNvZGUgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX3dlYWthdXRoIChTVkNYUFJUICpfX3hwcnQpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9ub3Byb2MgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworZXh0ZXJuIHZvaWQJc3ZjZXJyX3Byb2d2ZXJzIChTVkNYUFJUICpfX3hwcnQsIHJwY3ZlcnNfdCBfX2xvd192ZXJzLAorCQkJCSBycGN2ZXJzX3QgX19oaWdoX3ZlcnMpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9hdXRoIChTVkNYUFJUICpfX3hwcnQsIGVudW0gYXV0aF9zdGF0IF9fd2h5KSBfX1RIUk9XOworCitleHRlcm4gdm9pZAlzdmNlcnJfbm9wcm9nIChTVkNYUFJUICpfX3hwcnQpIF9fVEhST1c7CisKK2V4dGVybiB2b2lkCXN2Y2Vycl9zeXN0ZW1lcnIgKFNWQ1hQUlQgKl9feHBydCkgX19USFJPVzsKKworLyoKKyAqIExvd2VzdCBsZXZlbCBkaXNwYXRjaGluZyAtT1ItIHdobyBvd25zIHRoaXMgcHJvY2VzcyBhbnl3YXkuCisgKiBTb21lYm9keSBoYXMgdG8gd2FpdCBmb3IgaW5jb21pbmcgcmVxdWVzdHMgYW5kIHRoZW4gY2FsbCB0aGUgY29ycmVjdAorICogc2VydmljZSByb3V0aW5lLiAgVGhlIHJvdXRpbmUgc3ZjX3J1biBkb2VzIGluZmluaXRlIHdhaXRpbmc7IGkuZS4sCisgKiBzdmNfcnVuIG5ldmVyIHJldHVybnMuCisgKiBTaW5jZSBhbm90aGVyIChjb2V4aXN0ZW50KSBwYWNrYWdlIG1heSB3aXNoIHRvIHNlbGVjdGl2ZWx5IHdhaXQgZm9yCisgKiBpbmNvbWluZyBjYWxscyBvciBvdGhlciBldmVudHMgb3V0c2lkZSBvZiB0aGUgcnBjIGFyY2hpdGVjdHVyZSwgdGhlCisgKiByb3V0aW5lIHN2Y19nZXRyZXEgaXMgcHJvdmlkZWQuICBJdCBtdXN0IGJlIHBhc3NlZCByZWFkZmRzLCB0aGUKKyAqICJpbi1wbGFjZSIgcmVzdWx0cyBvZiBhIHNlbGVjdCBzeXN0ZW0gY2FsbCAoc2VlIHNlbGVjdCwgc2VjdGlvbiAyKS4KKyAqLworCisvKgorICogR2xvYmFsIGtlZXBlciBvZiBycGMgc2VydmljZSBkZXNjcmlwdG9ycyBpbiB1c2UKKyAqIGR5bmFtaWM7IG11c3QgYmUgaW5zcGVjdGVkIGJlZm9yZSBlYWNoIGNhbGwgdG8gc2VsZWN0CisgKi8KKworZXh0ZXJuIHN0cnVjdCBwb2xsZmQgKnN2Y19wb2xsZmQ7CitleHRlcm4gaW50IHN2Y19tYXhfcG9sbGZkOworZXh0ZXJuIGZkX3NldCBzdmNfZmRzZXQ7CisjZGVmaW5lIHN2Y19mZHMgc3ZjX2Zkc2V0LmZkc19iaXRzWzBdCS8qIGNvbXBhdGliaWxpdHkgKi8KKworLyoKKyAqIGEgc21hbGwgcHJvZ3JhbSBpbXBsZW1lbnRlZCBieSB0aGUgc3ZjX3JwYyBpbXBsZW1lbnRhdGlvbiBpdHNlbGY7CisgKiBhbHNvIHNlZSBjbG50LmggZm9yIHByb3RvY29sIG51bWJlcnMuCisgKi8KK2V4dGVybiB2b2lkIHN2Y19nZXRyZXEgKGludCBfX3JkZmRzKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgc3ZjX2dldHJlcV9jb21tb24gKGNvbnN0IGludCBfX2ZkKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgc3ZjX2dldHJlcXNldCAoZmRfc2V0ICpfX3JlYWRmZHMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfZ2V0cmVxX3BvbGwgKHN0cnVjdCBwb2xsZmQgKiwgY29uc3QgaW50KSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgc3ZjX2V4aXQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gdm9pZCBzdmNfcnVuICh2b2lkKSBfX1RIUk9XOworCisvKgorICogU29ja2V0IHRvIHVzZSBvbiBzdmN4eHhfY3JlYXRlIGNhbGwgdG8gZ2V0IGRlZmF1bHQgc29ja2V0CisgKi8KKyNkZWZpbmUJUlBDX0FOWVNPQ0sJLTEKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZXhpc3Rpbmcgc2VydmljZSBzaWRlIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMKKyAqLworCisvKgorICogTWVtb3J5IGJhc2VkIHJwYyBmb3IgdGVzdGluZyBhbmQgdGltaW5nLgorICovCitleHRlcm4gU1ZDWFBSVCAqc3ZjcmF3X2NyZWF0ZSAodm9pZCkgX19USFJPVzsKKworLyoKKyAqIFVkcCBiYXNlZCBycGMuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmN1ZHBfY3JlYXRlIChpbnQgX19zb2NrKSBfX1RIUk9XOworZXh0ZXJuIFNWQ1hQUlQgKnN2Y3VkcF9idWZjcmVhdGUgKGludCBfX3NvY2ssIHVfaW50IF9fc2VuZHN6LCB1X2ludCBfX3JlY3ZzeikKKyAgICAgX19USFJPVzsKKworLyoKKyAqIFRjcCBiYXNlZCBycGMuCisgKi8KK2V4dGVybiBTVkNYUFJUICpzdmN0Y3BfY3JlYXRlIChpbnQgX19zb2NrLCB1X2ludCBfX3NlbmRzaXplLCB1X2ludCBfX3JlY3ZzaXplKQorICAgICBfX1RIUk9XOworCisKKy8qCisgKiBVbml4IGJhc2VkIHJwYy4KKyAqLworZXh0ZXJuIFNWQ1hQUlQgKnN2Y3VuaXhfY3JlYXRlIChpbnQgX19zb2NrLCB1X2ludCBfX3NlbmRzaXplLCB1X2ludCBfX3JlY3ZzaXplLAorCQkJCWNoYXIgKl9fcGF0aCkgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3N2Yy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy9zdmNfYXV0aC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjX2F1dGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzFhNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvc3ZjX2F1dGguaApAQCAtMCwwICsxLDU0IEBACisvKiBAKCMpc3ZjX2F1dGguaAkyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQyAqLworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisvKiAgICAgIEAoIylzdmNfYXV0aC5oIDEuNiA4Ni8wNy8xNiBTTUkgICAgICAqLworCisvKgorICogc3ZjX2F1dGguaCwgU2VydmljZSBzaWRlIG9mIHJwYyBhdXRoZW50aWNhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqLworCisjaWZuZGVmIF9SUENfU1ZDX0FVVEhfSAorI2RlZmluZSBfUlBDX1NWQ19BVVRIX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvc3ZjLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFNlcnZlciBzaWRlIGF1dGhlbnRpY2F0b3IKKyAqLworZXh0ZXJuIGVudW0gYXV0aF9zdGF0IF9hdXRoZW50aWNhdGUgKHN0cnVjdCBzdmNfcmVxICpfX3Jxc3QsCisJCQkJICAgICBzdHJ1Y3QgcnBjX21zZyAqX19tc2cpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBycGMvc3ZjX2F1dGguaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMvdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxZjNmZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjL3R5cGVzLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisvKiBmaXhpbmNsdWRlcyBzaG91bGQgbm90IGFkZCBleHRlcm4gIkMiIHRvIHRoaXMgZmlsZSAqLworLyoKKyAqIFJwYyBhZGRpdGlvbnMgdG8gPHN5cy90eXBlcy5oPgorICovCisjaWZuZGVmIF9SUENfVFlQRVNfSAorI2RlZmluZSBfUlBDX1RZUEVTX0ggMQorCit0eXBlZGVmIGludCBib29sX3Q7Cit0eXBlZGVmIGludCBlbnVtX3Q7CisvKiBUaGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gdWludDMyX3QgaW4gdGhlIGZ1dHVyZSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHJwY3Byb2dfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBycGN2ZXJzX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcnBjcHJvY190OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHJwY3Byb3RfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBycGNwb3J0X3Q7CisKKyNkZWZpbmUgICAgICAgIF9fZG9udGNhcmVfXyAgICAtMQorCisjaWZuZGVmIEZBTFNFCisjICAgICAgZGVmaW5lICBGQUxTRSAgICgwKQorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorIyAgICAgIGRlZmluZSAgVFJVRSAgICAoMSkKKyNlbmRpZgorCisjaWZuZGVmIE5VTEwKKyMgICAgICBkZWZpbmUgIE5VTEwgMAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEZvciBtYWxsb2MgZGVjbC4gICovCisjZGVmaW5lIG1lbV9hbGxvYyhic2l6ZSkJbWFsbG9jKGJzaXplKQorLyoKKyAqIFhYWDogVGhpcyBtdXN0IG5vdCB1c2UgdGhlIHNlY29uZCBhcmd1bWVudCwgb3IgY29kZSBpbiB4ZHJfYXJyYXkuYyBuZWVkcworICogdG8gYmUgbW9kaWZpZWQuCisgKi8KKyNkZWZpbmUgbWVtX2ZyZWUocHRyLCBic2l6ZSkJZnJlZShwdHIpCisKKyNpZm5kZWYgbWFrZWRldiAvKiBpZSwgd2UgaGF2ZW4ndCBhbHJlYWR5IGluY2x1ZGVkIGl0ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfX3VfY2hhcl9kZWZpbmVkCit0eXBlZGVmIF9fdV9jaGFyIHVfY2hhcjsKK3R5cGVkZWYgX191X3Nob3J0IHVfc2hvcnQ7Cit0eXBlZGVmIF9fdV9pbnQgdV9pbnQ7Cit0eXBlZGVmIF9fdV9sb25nIHVfbG9uZzsKK3R5cGVkZWYgX19xdWFkX3QgcXVhZF90OwordHlwZWRlZiBfX3VfcXVhZF90IHVfcXVhZF90OwordHlwZWRlZiBfX2ZzaWRfdCBmc2lkX3Q7CisjIGRlZmluZSBfX3VfY2hhcl9kZWZpbmVkCisjZW5kaWYKKyNpZm5kZWYgX19kYWRkcl90X2RlZmluZWQKK3R5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7Cit0eXBlZGVmIF9fY2FkZHJfdCBjYWRkcl90OworIyBkZWZpbmUgX19kYWRkcl90X2RlZmluZWQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2lmbmRlZiBJTkFERFJfTE9PUEJBQ0sKKyNkZWZpbmUgICAgICAgSU5BRERSX0xPT1BCQUNLICAgICAgICAgKHVfbG9uZykweDdGMDAwMDAxCisjZW5kaWYKKyNpZm5kZWYgTUFYSE9TVE5BTUVMRU4KKyNkZWZpbmUgICAgICAgIE1BWEhPU1ROQU1FTEVOICA2NAorI2VuZGlmCisKKyNlbmRpZiAvKiBycGMvdHlwZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMveGRyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwYy94ZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk2OTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGMveGRyLmgKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogeGRyLmgsIEV4dGVybmFsIERhdGEgUmVwcmVzZW50YXRpb24gU2VyaWFsaXphdGlvbiBSb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqLworCisjaWZuZGVmIF9SUENfWERSX0gKKyNkZWZpbmUgX1JQQ19YRFJfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorCisvKiBXZSBuZWVkIEZJTEUuICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFhEUiBwcm92aWRlcyBhIGNvbnZlbnRpb25hbCB3YXkgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGRhdGEKKyAqIHR5cGVzIGFuZCBhbiBleHRlcm5hbCBiaXQtc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAgTGlicmFyeSBzdXBwbGllZAorICogcm91dGluZXMgcHJvdmlkZSBmb3IgdGhlIGNvbnZlcnNpb24gb24gYnVpbHQtaW4gQyBkYXRhIHR5cGVzLiAgVGhlc2UKKyAqIHJvdXRpbmVzIGFuZCB1dGlsaXR5IHJvdXRpbmVzIGRlZmluZWQgaGVyZSBhcmUgdXNlZCB0byBoZWxwIGltcGxlbWVudAorICogYSB0eXBlIGVuY29kZS9kZWNvZGUgcm91dGluZSBmb3IgZWFjaCB1c2VyLWRlZmluZWQgdHlwZS4KKyAqCisgKiBFYWNoIGRhdGEgdHlwZSBwcm92aWRlcyBhIHNpbmdsZSBwcm9jZWR1cmUgd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czoKKyAqCisgKiAgICAgIGJvb2xfdAorICogICAgICB4ZHJwcm9jKHhkcnMsIGFyZ3Jlc3ApCisgKiAgICAgICAgICAgICAgWERSICp4ZHJzOworICogICAgICAgICAgICAgIDx0eXBlPiAqYXJncmVzcDsKKyAqCisgKiB4ZHJzIGlzIGFuIGluc3RhbmNlIG9mIGEgWERSIGhhbmRsZSwgdG8gd2hpY2ggb3IgZnJvbSB3aGljaCB0aGUgZGF0YQorICogdHlwZSBpcyB0byBiZSBjb252ZXJ0ZWQuICBhcmdyZXNwIGlzIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHRvIGJlCisgKiBjb252ZXJ0ZWQuICBUaGUgWERSIGhhbmRsZSBjb250YWlucyBhbiBvcGVyYXRpb24gZmllbGQgd2hpY2ggaW5kaWNhdGVzCisgKiB3aGljaCBvZiB0aGUgb3BlcmF0aW9ucyAoRU5DT0RFLCBERUNPREUgKiBvciBGUkVFKSBpcyB0byBiZSBwZXJmb3JtZWQuCisgKgorICogWERSX0RFQ09ERSBtYXkgYWxsb2NhdGUgc3BhY2UgaWYgdGhlIHBvaW50ZXIgYXJncmVzcCBpcyBudWxsLiAgVGhpcworICogZGF0YSBjYW4gYmUgZnJlZWQgd2l0aCB0aGUgWERSX0ZSRUUgb3BlcmF0aW9uLgorICoKKyAqIFdlIHdyaXRlIG9ubHkgb25lIHByb2NlZHVyZSBwZXIgZGF0YSB0eXBlIHRvIG1ha2UgaXQgZWFzeQorICogdG8ga2VlcCB0aGUgZW5jb2RlIGFuZCBkZWNvZGUgcHJvY2VkdXJlcyBmb3IgYSBkYXRhIHR5cGUgY29uc2lzdGVudC4KKyAqIEluIG1hbnkgY2FzZXMgdGhlIHNhbWUgY29kZSBwZXJmb3JtcyBhbGwgb3BlcmF0aW9ucyBvbiBhIHVzZXIgZGVmaW5lZCB0eXBlLAorICogYmVjYXVzZSBhbGwgdGhlIGhhcmQgd29yayBpcyBkb25lIGluIHRoZSBjb21wb25lbnQgdHlwZSByb3V0aW5lcy4KKyAqIGRlY29kZSBhcyBhIHNlcmllcyBvZiBjYWxscyBvbiB0aGUgbmVzdGVkIGRhdGEgdHlwZXMuCisgKi8KKworLyoKKyAqIFhkciBvcGVyYXRpb25zLiAgWERSX0VOQ09ERSBjYXVzZXMgdGhlIHR5cGUgdG8gYmUgZW5jb2RlZCBpbnRvIHRoZQorICogc3RyZWFtLiAgWERSX0RFQ09ERSBjYXVzZXMgdGhlIHR5cGUgdG8gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHN0cmVhbS4KKyAqIFhEUl9GUkVFIGNhbiBiZSB1c2VkIHRvIHJlbGVhc2UgdGhlIHNwYWNlIGFsbG9jYXRlZCBieSBhbiBYRFJfREVDT0RFCisgKiByZXF1ZXN0LgorICovCitlbnVtIHhkcl9vcCB7CisgIFhEUl9FTkNPREUgPSAwLAorICBYRFJfREVDT0RFID0gMSwKKyAgWERSX0ZSRUUgPSAyCit9OworCisvKgorICogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciB1bml0IG9mIGV4dGVybmFsIGRhdGEuCisgKi8KKyNkZWZpbmUgQllURVNfUEVSX1hEUl9VTklUCSg0KQorLyoKKyAqIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgYWJvdmUgaXMgYSBwb3dlciBvZiAyLiAgQnV0IGl0J3MgZGVmaW5lZCB0byBiZQorICogNCBieSB0aGUgYXBwcm9wcmlhdGUgUkZDcy4gIFNvIGl0IHdpbGwgd29yay4gIEFuZCBpdCdzIG5vcm1hbGx5IHF1aWNrZXIKKyAqIHRoYW4gdGhlIG9sZCByb3V0aW5lLgorICovCisjaWYgMQorI2RlZmluZSBSTkRVUCh4KSAgKCgoeCkgKyBCWVRFU19QRVJfWERSX1VOSVQgLSAxKSAmIH4oQllURVNfUEVSX1hEUl9VTklUIC0gMSkpCisjZWxzZSAvKiB0aGlzIGlzIHRoZSBvbGQgcm91dGluZSAqLworI2RlZmluZSBSTkRVUCh4KSAgKCgoKHgpICsgQllURVNfUEVSX1hEUl9VTklUIC0gMSkgLyBCWVRFU19QRVJfWERSX1VOSVQpIFwKKwkJICAgICogQllURVNfUEVSX1hEUl9VTklUKQorI2VuZGlmCisKKy8qCisgKiBUaGUgWERSIGhhbmRsZS4KKyAqIENvbnRhaW5zIG9wZXJhdGlvbiB3aGljaCBpcyBiZWluZyBhcHBsaWVkIHRvIHRoZSBzdHJlYW0sCisgKiBhbiBvcGVyYXRpb25zIHZlY3RvciBmb3IgdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gKGUuZy4gc2VlIHhkcl9tZW0uYyksCisgKiBhbmQgdHdvIHByaXZhdGUgZmllbGRzIGZvciB0aGUgdXNlIG9mIHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBYRFIgWERSOworc3RydWN0IFhEUgorICB7CisgICAgZW51bSB4ZHJfb3AgeF9vcDsJCS8qIG9wZXJhdGlvbjsgZmFzdCBhZGRpdGlvbmFsIHBhcmFtICovCisgICAgc3RydWN0IHhkcl9vcHMKKyAgICAgIHsKKwlib29sX3QgKCp4X2dldGxvbmcpIChYRFIgKl9feGRycywgbG9uZyAqX19scCk7CisJLyogZ2V0IGEgbG9uZyBmcm9tIHVuZGVybHlpbmcgc3RyZWFtICovCisJYm9vbF90ICgqeF9wdXRsb25nKSAoWERSICpfX3hkcnMsIF9fY29uc3QgbG9uZyAqX19scCk7CisJLyogcHV0IGEgbG9uZyB0byAiICovCisJYm9vbF90ICgqeF9nZXRieXRlcykgKFhEUiAqX194ZHJzLCBjYWRkcl90IF9fYWRkciwgdV9pbnQgX19sZW4pOworCS8qIGdldCBzb21lIGJ5dGVzIGZyb20gIiAqLworCWJvb2xfdCAoKnhfcHV0Ynl0ZXMpIChYRFIgKl9feGRycywgX19jb25zdCBjaGFyICpfX2FkZHIsIHVfaW50IF9fbGVuKTsKKwkvKiBwdXQgc29tZSBieXRlcyB0byAiICovCisJdV9pbnQgKCp4X2dldHBvc3RuKSAoX19jb25zdCBYRFIgKl9feGRycyk7CisJLyogcmV0dXJucyBieXRlcyBvZmYgZnJvbSBiZWdpbm5pbmcgKi8KKwlib29sX3QgKCp4X3NldHBvc3RuKSAoWERSICpfX3hkcnMsIHVfaW50IF9fcG9zKTsKKwkvKiBsZXRzIHlvdSByZXBvc2l0aW9uIHRoZSBzdHJlYW0gKi8KKwlpbnQzMl90ICooKnhfaW5saW5lKSAoWERSICpfX3hkcnMsIHVfaW50IF9fbGVuKTsKKwkvKiBidWYgcXVpY2sgcHRyIHRvIGJ1ZmZlcmVkIGRhdGEgKi8KKwl2b2lkICgqeF9kZXN0cm95KSAoWERSICpfX3hkcnMpOworCS8qIGZyZWUgcHJpdmF0ZXMgb2YgdGhpcyB4ZHJfc3RyZWFtICovCisJYm9vbF90ICgqeF9nZXRpbnQzMikgKFhEUiAqX194ZHJzLCBpbnQzMl90ICpfX2lwKTsKKwkvKiBnZXQgYSBpbnQgZnJvbSB1bmRlcmx5aW5nIHN0cmVhbSAqLworCWJvb2xfdCAoKnhfcHV0aW50MzIpIChYRFIgKl9feGRycywgX19jb25zdCBpbnQzMl90ICpfX2lwKTsKKwkvKiBwdXQgYSBpbnQgdG8gIiAqLworICAgICAgfQorICAgICAqeF9vcHM7CisgICAgY2FkZHJfdCB4X3B1YmxpYzsJCS8qIHVzZXJzJyBkYXRhICovCisgICAgY2FkZHJfdCB4X3ByaXZhdGU7CQkvKiBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLworICAgIGNhZGRyX3QgeF9iYXNlOwkJLyogcHJpdmF0ZSB1c2VkIGZvciBwb3NpdGlvbiBpbmZvICovCisgICAgdV9pbnQgeF9oYW5keTsJCS8qIGV4dHJhIHByaXZhdGUgd29yZCAqLworICB9OworCisvKgorICogQSB4ZHJwcm9jX3QgZXhpc3RzIGZvciBlYWNoIGRhdGEgdHlwZSB3aGljaCBpcyB0byBiZSBlbmNvZGVkIG9yIGRlY29kZWQuCisgKgorICogVGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgeGRycHJvY190IGlzIGEgcG9pbnRlciB0byBhbiBvcGFxdWUgcG9pbnRlci4KKyAqIFRoZSBvcGFxdWUgcG9pbnRlciBnZW5lcmFsbHkgcG9pbnRzIHRvIGEgc3RydWN0dXJlIG9mIHRoZSBkYXRhIHR5cGUKKyAqIHRvIGJlIGRlY29kZWQuICBJZiB0aGlzIHBvaW50ZXIgaXMgMCwgdGhlbiB0aGUgdHlwZSByb3V0aW5lcyBzaG91bGQKKyAqIGFsbG9jYXRlIGR5bmFtaWMgc3RvcmFnZSBvZiB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmV0dXJuIGl0LgorICogYm9vbF90ICAgICAgICgqeGRycHJvY190KShYRFIgKiwgY2FkZHJfdCAqKTsKKyAqLwordHlwZWRlZiBib29sX3QgKCp4ZHJwcm9jX3QpIChYRFIgKiwgdm9pZCAqLC4uLik7CisKKworLyoKKyAqIE9wZXJhdGlvbnMgZGVmaW5lZCBvbiBhIFhEUiBoYW5kbGUKKyAqCisgKiBYRFIgICAgICAgICAgKnhkcnM7CisgKiBpbnQzMl90ICAgICAgKmludDMycDsKKyAqIGxvbmcgICAgICAgICAqbG9uZ3A7CisgKiBjYWRkcl90ICAgICAgIGFkZHI7CisgKiB1X2ludCAgICAgICAgIGxlbjsKKyAqIHVfaW50ICAgICAgICAgcG9zOworICovCisjZGVmaW5lIFhEUl9HRVRJTlQzMih4ZHJzLCBpbnQzMnApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCooeGRycyktPnhfb3BzLT54X2dldGludDMyKSh4ZHJzLCBpbnQzMnApCisjZGVmaW5lIHhkcl9nZXRpbnQzMih4ZHJzLCBpbnQzMnApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCooeGRycyktPnhfb3BzLT54X2dldGludDMyKSh4ZHJzLCBpbnQzMnApCisKKyNkZWZpbmUgWERSX1BVVElOVDMyKHhkcnMsIGludDMycCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKih4ZHJzKS0+eF9vcHMtPnhfcHV0aW50MzIpKHhkcnMsIGludDMycCkKKyNkZWZpbmUgeGRyX3B1dGludDMyKHhkcnMsIGludDMycCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKih4ZHJzKS0+eF9vcHMtPnhfcHV0aW50MzIpKHhkcnMsIGludDMycCkKKworI2RlZmluZSBYRFJfR0VUTE9ORyh4ZHJzLCBsb25ncCkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGxvbmcpKHhkcnMsIGxvbmdwKQorI2RlZmluZSB4ZHJfZ2V0bG9uZyh4ZHJzLCBsb25ncCkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGxvbmcpKHhkcnMsIGxvbmdwKQorCisjZGVmaW5lIFhEUl9QVVRMT05HKHhkcnMsIGxvbmdwKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfcHV0bG9uZykoeGRycywgbG9uZ3ApCisjZGVmaW5lIHhkcl9wdXRsb25nKHhkcnMsIGxvbmdwKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfcHV0bG9uZykoeGRycywgbG9uZ3ApCisKKyNkZWZpbmUgWERSX0dFVEJZVEVTKHhkcnMsIGFkZHIsIGxlbikJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2dldGJ5dGVzKSh4ZHJzLCBhZGRyLCBsZW4pCisjZGVmaW5lIHhkcl9nZXRieXRlcyh4ZHJzLCBhZGRyLCBsZW4pCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9nZXRieXRlcykoeGRycywgYWRkciwgbGVuKQorCisjZGVmaW5lIFhEUl9QVVRCWVRFUyh4ZHJzLCBhZGRyLCBsZW4pCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9wdXRieXRlcykoeGRycywgYWRkciwgbGVuKQorI2RlZmluZSB4ZHJfcHV0Ynl0ZXMoeGRycywgYWRkciwgbGVuKQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfcHV0Ynl0ZXMpKHhkcnMsIGFkZHIsIGxlbikKKworI2RlZmluZSBYRFJfR0VUUE9TKHhkcnMpCQkJCVwKKwkoKih4ZHJzKS0+eF9vcHMtPnhfZ2V0cG9zdG4pKHhkcnMpCisjZGVmaW5lIHhkcl9nZXRwb3MoeGRycykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9nZXRwb3N0bikoeGRycykKKworI2RlZmluZSBYRFJfU0VUUE9TKHhkcnMsIHBvcykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9zZXRwb3N0bikoeGRycywgcG9zKQorI2RlZmluZSB4ZHJfc2V0cG9zKHhkcnMsIHBvcykJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9zZXRwb3N0bikoeGRycywgcG9zKQorCisjZGVmaW5lCVhEUl9JTkxJTkUoeGRycywgbGVuKQkJCQlcCisJKCooeGRycyktPnhfb3BzLT54X2lubGluZSkoeGRycywgbGVuKQorI2RlZmluZQl4ZHJfaW5saW5lKHhkcnMsIGxlbikJCQkJXAorCSgqKHhkcnMpLT54X29wcy0+eF9pbmxpbmUpKHhkcnMsIGxlbikKKworI2RlZmluZQlYRFJfREVTVFJPWSh4ZHJzKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoKHhkcnMpLT54X29wcy0+eF9kZXN0cm95KQkJCVwKKwkJCSgqKHhkcnMpLT54X29wcy0+eF9kZXN0cm95KSh4ZHJzKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lCXhkcl9kZXN0cm95KHhkcnMpCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICgoeGRycyktPnhfb3BzLT54X2Rlc3Ryb3kpCQkJXAorCQkJKCooeGRycyktPnhfb3BzLT54X2Rlc3Ryb3kpKHhkcnMpOwlcCisJfSB3aGlsZSAoMCkKKworLyoKKyAqIFN1cHBvcnQgc3RydWN0IGZvciBkaXNjcmltaW5hdGVkIHVuaW9ucy4KKyAqIFlvdSBjcmVhdGUgYW4gYXJyYXkgb2YgeGRyZGlzY3JpbSBzdHJ1Y3R1cmVzLCB0ZXJtaW5hdGVkIHdpdGgKKyAqIGEgZW50cnkgd2l0aCBhIG51bGwgcHJvY2VkdXJlIHBvaW50ZXIuICBUaGUgeGRyX3VuaW9uIHJvdXRpbmUgZ2V0cworICogdGhlIGRpc2NyaW1pbmFudCB2YWx1ZSBhbmQgdGhlbiBzZWFyY2hlcyB0aGUgYXJyYXkgb2Ygc3RydWN0dXJlcworICogZm9yIGEgbWF0Y2hpbmcgdmFsdWUuICBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoZSBhc3NvY2lhdGVkIHhkciByb3V0aW5lCisgKiBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoYXQgcGFydCBvZiB0aGUgdW5pb24uICBJZiB0aGVyZSBpcworICogbm8gbWF0Y2gsIHRoZW4gYSBkZWZhdWx0IHJvdXRpbmUgbWF5IGJlIGNhbGxlZC4KKyAqIElmIHRoZXJlIGlzIG5vIG1hdGNoIGFuZCBubyBkZWZhdWx0IHJvdXRpbmUgaXQgaXMgYW4gZXJyb3IuCisgKi8KKyNkZWZpbmUgTlVMTF94ZHJwcm9jX3QgKCh4ZHJwcm9jX3QpMCkKK3N0cnVjdCB4ZHJfZGlzY3JpbQoreworICBpbnQgdmFsdWU7CisgIHhkcnByb2NfdCBwcm9jOworfTsKKworLyoKKyAqIElubGluZSByb3V0aW5lcyBmb3IgZmFzdCBlbmNvZGUvZGVjb2RlIG9mIHByaW1pdGl2ZSBkYXRhIHR5cGVzLgorICogQ2F2ZWF0IGVtcHRvcjogdGhlc2UgdXNlIHNpbmdsZSBtZW1vcnkgY3ljbGVzIHRvIGdldCB0aGUKKyAqIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBidWZmZXIsIGFuZCB3aWxsIGZhaWwgdG8gb3BlcmF0ZQorICogcHJvcGVybHkgaWYgdGhlIGRhdGEgaXMgbm90IGFsaWduZWQuICBUaGUgc3RhbmRhcmQgd2F5IHRvIHVzZSB0aGVzZQorICogaXMgdG8gc2F5OgorICogICAgICBpZiAoKGJ1ZiA9IFhEUl9JTkxJTkUoeGRycywgY291bnQpKSA9PSBOVUxMKQorICogICAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOworICogICAgICA8PDwgbWFjcm8gY2FsbHMgPj4+CisgKiB3aGVyZSBgYGNvdW50JycgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIG9jY3VwaWVkCisgKiBieSB0aGUgcHJpbWl0aXZlIGRhdGEgdHlwZXMuCisgKgorICogTi5CLiBhbmQgZnJvemVuIGZvciBhbGwgdGltZTogZWFjaCBkYXRhIHR5cGUgaGVyZSB1c2VzIDQgYnl0ZXMKKyAqIG9mIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLgorICovCisKKyNkZWZpbmUgSVhEUl9HRVRfSU5UMzIoYnVmKSAgICAgICAgICAgKChpbnQzMl90KW50b2hsKCh1aW50MzJfdCkqKGJ1ZikrKykpCisjZGVmaW5lIElYRFJfUFVUX0lOVDMyKGJ1ZiwgdikgICAgICAgICgqKGJ1ZikrKyA9IChpbnQzMl90KWh0b25sKCh1aW50MzJfdCkodikpKQorI2RlZmluZSBJWERSX0dFVF9VX0lOVDMyKGJ1ZikgICAgICAgICAoKHVpbnQzMl90KUlYRFJfR0VUX0lOVDMyKGJ1ZikpCisjZGVmaW5lIElYRFJfUFVUX1VfSU5UMzIoYnVmLCB2KSAgICAgIElYRFJfUFVUX0lOVDMyKGJ1ZiwgKGludDMyX3QpKHYpKQorCisvKiBXQVJOSU5HOiBUaGUgSVhEUl8qX0xPTkcgZGVmaW5lcyBhcmUgcmVtb3ZlZCBieSBTdW4gZm9yIG5ldyBwbGF0Zm9ybXMKKyAqIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBhbnkgbG9uZ2VyLiBDb2RlIHdoaWNoIHVzZSB0aGlzIGRlZmluZXMgb3IgbG9uZ3MKKyAqIGluIHRoZSBSUEMgY29kZSB3aWxsIG5vdCB3b3JrIG9uIDY0Yml0IFNvbGFyaXMgcGxhdGZvcm1zICEKKyAqLworI2RlZmluZSBJWERSX0dFVF9MT05HKGJ1ZikgKChsb25nKUlYRFJfR0VUX1VfSU5UMzIoYnVmKSkKKyNkZWZpbmUgSVhEUl9QVVRfTE9ORyhidWYsIHYpICgobG9uZylJWERSX1BVVF9JTlQzMihidWYsIChsb25nKSh2KSkpCisjZGVmaW5lIElYRFJfR0VUX1VfTE9ORyhidWYpCSAgICAgICgodV9sb25nKUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9QVVRfVV9MT05HKGJ1ZiwgdikJICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKworCisjZGVmaW5lIElYRFJfR0VUX0JPT0woYnVmKSAgICAgICAgICAgICgoYm9vbF90KUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9HRVRfRU5VTShidWYsIHQpICAgICAgICAgKCh0KUlYRFJfR0VUX0xPTkcoYnVmKSkKKyNkZWZpbmUgSVhEUl9HRVRfU0hPUlQoYnVmKSAgICAgICAgICAgKChzaG9ydClJWERSX0dFVF9MT05HKGJ1ZikpCisjZGVmaW5lIElYRFJfR0VUX1VfU0hPUlQoYnVmKSAgICAgICAgICgodV9zaG9ydClJWERSX0dFVF9MT05HKGJ1ZikpCisKKyNkZWZpbmUgSVhEUl9QVVRfQk9PTChidWYsIHYpICAgICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKyNkZWZpbmUgSVhEUl9QVVRfRU5VTShidWYsIHYpICAgICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKyNkZWZpbmUgSVhEUl9QVVRfU0hPUlQoYnVmLCB2KSAgICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKyNkZWZpbmUgSVhEUl9QVVRfVV9TSE9SVChidWYsIHYpICAgICAgSVhEUl9QVVRfTE9ORyhidWYsIChsb25nKSh2KSkKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgImdlbmVyaWMiIHhkciByb3V0aW5lcy4KKyAqIE5vbmUgb2YgdGhlc2UgY2FuIGhhdmUgY29uc3QgYXBwbGllZCBiZWNhdXNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvCisgKiBrbm93IHdoZXRoZXIgdGhlIGNhbGwgaXMgYSByZWFkIG9yIGEgd3JpdGUgdG8gdGhlIHBhc3NlZCBwYXJhbWV0ZXIKKyAqIGFsc28sIHRoZSBYRFIgc3RydWN0dXJlIGlzIGFsd2F5cyB1cGRhdGVkIGJ5IHNvbWUgb2YgdGhlc2UgY2FsbHMuCisgKi8KK2V4dGVybiBib29sX3QgeGRyX3ZvaWQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9zaG9ydCAoWERSICpfX3hkcnMsIHNob3J0ICpfX3NwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9zaG9ydCAoWERSICpfX3hkcnMsIHVfc2hvcnQgKl9fdXNwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfaW50IChYRFIgKl9feGRycywgaW50ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9pbnQgKFhEUiAqX194ZHJzLCB1X2ludCAqX191cCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2xvbmcgKFhEUiAqX194ZHJzLCBsb25nICpfX2xwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdV9sb25nIChYRFIgKl9feGRycywgdV9sb25nICpfX3VscCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2h5cGVyIChYRFIgKl9feGRycywgcXVhZF90ICpfX2xscCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VfaHlwZXIgKFhEUiAqX194ZHJzLCB1X3F1YWRfdCAqX191bGxwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfbG9uZ2xvbmdfdCAoWERSICpfX3hkcnMsIHF1YWRfdCAqX19sbHApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X2xvbmdsb25nX3QgKFhEUiAqX194ZHJzLCB1X3F1YWRfdCAqX191bGxwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfaW50OF90IChYRFIgKl9feGRycywgaW50OF90ICpfX2lwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfdWludDhfdCAoWERSICpfX3hkcnMsIHVpbnQ4X3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQxNl90IChYRFIgKl9feGRycywgaW50MTZfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VpbnQxNl90IChYRFIgKl9feGRycywgdWludDE2X3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQzMl90IChYRFIgKl9feGRycywgaW50MzJfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VpbnQzMl90IChYRFIgKl9feGRycywgdWludDMyX3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9pbnQ2NF90IChYRFIgKl9feGRycywgaW50NjRfdCAqX19pcCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3VpbnQ2NF90IChYRFIgKl9feGRycywgdWludDY0X3QgKl9fdXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9xdWFkX3QgKFhEUiAqX194ZHJzLCBxdWFkX3QgKl9faXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X3F1YWRfdCAoWERSICpfX3hkcnMsIHVfcXVhZF90ICpfX3VwKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfYm9vbCAoWERSICpfX3hkcnMsIGJvb2xfdCAqX19icCkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2VudW0gKFhEUiAqX194ZHJzLCBlbnVtX3QgKl9fZXApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9hcnJheSAoWERSICogX3hkcnMsIGNhZGRyX3QgKl9fYWRkcnAsIHVfaW50ICpfX3NpemVwLAorCQkJIHVfaW50IF9fbWF4c2l6ZSwgdV9pbnQgX19lbHNpemUsIHhkcnByb2NfdCBfX2VscHJvYykKKyAgICAgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2J5dGVzIChYRFIgKl9feGRycywgY2hhciAqKl9fY3BwLCB1X2ludCAqX19zaXplcCwKKwkJCSB1X2ludCBfX21heHNpemUpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9vcGFxdWUgKFhEUiAqX194ZHJzLCBjYWRkcl90IF9fY3AsIHVfaW50IF9fY250KSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RyaW5nIChYRFIgKl9feGRycywgY2hhciAqKl9fY3BwLCB1X2ludCBfX21heHNpemUpIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91bmlvbiAoWERSICpfX3hkcnMsIGVudW1fdCAqX19kc2NtcCwgY2hhciAqX191bnAsCisJCQkgX19jb25zdCBzdHJ1Y3QgeGRyX2Rpc2NyaW0gKl9fY2hvaWNlcywKKwkJCSB4ZHJwcm9jX3QgZGZhdWx0KSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfY2hhciAoWERSICpfX3hkcnMsIGNoYXIgKl9fY3ApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl91X2NoYXIgKFhEUiAqX194ZHJzLCB1X2NoYXIgKl9fY3ApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl92ZWN0b3IgKFhEUiAqX194ZHJzLCBjaGFyICpfX2Jhc2VwLCB1X2ludCBfX25lbGVtLAorCQkJICB1X2ludCBfX2VsZW1zaXplLCB4ZHJwcm9jX3QgX194ZHJfZWxlbSkgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX2Zsb2F0IChYRFIgKl9feGRycywgZmxvYXQgKl9fZnApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9kb3VibGUgKFhEUiAqX194ZHJzLCBkb3VibGUgKl9fZHApIF9fVEhST1c7CitleHRlcm4gYm9vbF90IHhkcl9yZWZlcmVuY2UgKFhEUiAqX194ZHJzLCBjYWRkcl90ICpfX3hwcCwgdV9pbnQgX19zaXplLAorCQkJICAgICB4ZHJwcm9jX3QgX19wcm9jKSBfX1RIUk9XOworZXh0ZXJuIGJvb2xfdCB4ZHJfcG9pbnRlciAoWERSICpfX3hkcnMsIGNoYXIgKipfX29ianBwLAorCQkJICAgdV9pbnQgX19vYmpfc2l6ZSwgeGRycHJvY190IF9feGRyX29iaikgX19USFJPVzsKK2V4dGVybiBib29sX3QgeGRyX3dyYXBzdHJpbmcgKFhEUiAqX194ZHJzLCBjaGFyICoqX19jcHApIF9fVEhST1c7CitleHRlcm4gdV9sb25nIHhkcl9zaXplb2YgKHhkcnByb2NfdCwgdm9pZCAqKSBfX1RIUk9XOworCisvKgorICogQ29tbW9uIG9wYXF1ZSBieXRlcyBvYmplY3RzIHVzZWQgYnkgbWFueSBycGMgcHJvdG9jb2xzOworICogZGVjbGFyZWQgaGVyZSBkdWUgdG8gY29tbW9uYWxpdHkuCisgKi8KKyNkZWZpbmUgTUFYX05FVE9CSl9TWiAxMDI0CitzdHJ1Y3QgbmV0b2JqCit7CisgIHVfaW50IG5fbGVuOworICBjaGFyICpuX2J5dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IG5ldG9iaiBuZXRvYmo7CitleHRlcm4gYm9vbF90IHhkcl9uZXRvYmogKFhEUiAqX194ZHJzLCBzdHJ1Y3QgbmV0b2JqICpfX25wKSBfX1RIUk9XOworCisvKgorICogVGhlc2UgYXJlIHRoZSBwdWJsaWMgcm91dGluZXMgZm9yIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyBvZgorICogeGRyIHN0cmVhbXMuCisgKi8KKworLyogWERSIHVzaW5nIG1lbW9yeSBidWZmZXJzICovCitleHRlcm4gdm9pZCB4ZHJtZW1fY3JlYXRlIChYRFIgKl9feGRycywgX19jb25zdCBjYWRkcl90IF9fYWRkciwKKwkJCSAgIHVfaW50IF9fc2l6ZSwgZW51bSB4ZHJfb3AgX194b3ApIF9fVEhST1c7CisKKy8qIFhEUiB1c2luZyBzdGRpbyBsaWJyYXJ5ICovCitleHRlcm4gdm9pZCB4ZHJzdGRpb19jcmVhdGUgKFhEUiAqX194ZHJzLCBGSUxFICpfX2ZpbGUsIGVudW0geGRyX29wIF9feG9wKQorICAgICBfX1RIUk9XOworCisvKiBYRFIgcHNldWRvIHJlY29yZHMgZm9yIHRjcCAqLworZXh0ZXJuIHZvaWQgeGRycmVjX2NyZWF0ZSAoWERSICpfX3hkcnMsIHVfaW50IF9fc2VuZHNpemUsCisJCQkgICB1X2ludCBfX3JlY3ZzaXplLCBjYWRkcl90IF9fdGNwX2hhbmRsZSwKKwkJCSAgIGludCAoKl9fcmVhZGl0KSAoY2hhciAqLCBjaGFyICosIGludCksCisJCQkgICBpbnQgKCpfX3dyaXRlaXQpIChjaGFyICosIGNoYXIgKiwgaW50KSkgX19USFJPVzsKKworLyogbWFrZSBlbmQgb2YgeGRyIHJlY29yZCAqLworZXh0ZXJuIGJvb2xfdCB4ZHJyZWNfZW5kb2ZyZWNvcmQgKFhEUiAqX194ZHJzLCBib29sX3QgX19zZW5kbm93KSBfX1RIUk9XOworCisvKiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBuZXh0IHJlY29yZCAqLworZXh0ZXJuIGJvb2xfdCB4ZHJyZWNfc2tpcHJlY29yZCAoWERSICpfX3hkcnMpIF9fVEhST1c7CisKKy8qIHRydWUgaWYgbm8gbW9yZSBpbnB1dCAqLworZXh0ZXJuIGJvb2xfdCB4ZHJyZWNfZW9mIChYRFIgKl9feGRycykgX19USFJPVzsKKworLyogZnJlZSBtZW1vcnkgYnVmZmVycyBmb3IgeGRyICovCitleHRlcm4gdm9pZCB4ZHJfZnJlZSAoeGRycHJvY190IF9fcHJvYywgY2hhciAqX19vYmpwKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcnBjL3hkci5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMGZhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW0uaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1JQQ1NWQ19CT09UUEFSQU1fSAorI2RlZmluZSBfUlBDU1ZDX0JPT1RQQVJBTV9ICisKKyNpbmNsdWRlIDxycGNzdmMvYm9vdHBhcmFtX3Byb3QuaD4KKworI2VuZGlmICAvKiBfUlBDU1ZDX0JPT1RQQVJBTV9IICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2Jvb3RwYXJhbV9wcm90LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW1fcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZWQ0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW1fcHJvdC5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX0JPT1RQQVJBTV9QUk9UX0hfUlBDR0VOCisjZGVmaW5lIF9CT09UUEFSQU1fUFJPVF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8bmZzL25mcy5oPgorI2RlZmluZSBNQVhfTUFDSElORV9OQU1FIDI1NQorI2RlZmluZSBNQVhfUEFUSF9MRU4gMTAyNAorI2RlZmluZSBNQVhfRklMRUlEIDMyCisjZGVmaW5lIElQX0FERFJfVFlQRSAxCisKK3R5cGVkZWYgY2hhciAqYnBfbWFjaGluZV9uYW1lX3Q7CisKK3R5cGVkZWYgY2hhciAqYnBfcGF0aF90OworCit0eXBlZGVmIGNoYXIgKmJwX2ZpbGVpZF90OworCitzdHJ1Y3QgaXBfYWRkcl90IHsKKwljaGFyIG5ldDsKKwljaGFyIGhvc3Q7CisJY2hhciBsaDsKKwljaGFyIGltcG5vOworfTsKK3R5cGVkZWYgc3RydWN0IGlwX2FkZHJfdCBpcF9hZGRyX3Q7CisKK3N0cnVjdCBicF9hZGRyZXNzIHsKKwlpbnQgYWRkcmVzc190eXBlOworCXVuaW9uIHsKKwkJaXBfYWRkcl90IGlwX2FkZHI7CisJfSBicF9hZGRyZXNzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYnBfYWRkcmVzcyBicF9hZGRyZXNzOworCitzdHJ1Y3QgYnBfd2hvYW1pX2FyZyB7CisJYnBfYWRkcmVzcyBjbGllbnRfYWRkcmVzczsKK307Cit0eXBlZGVmIHN0cnVjdCBicF93aG9hbWlfYXJnIGJwX3dob2FtaV9hcmc7CisKK3N0cnVjdCBicF93aG9hbWlfcmVzIHsKKwlicF9tYWNoaW5lX25hbWVfdCBjbGllbnRfbmFtZTsKKwlicF9tYWNoaW5lX25hbWVfdCBkb21haW5fbmFtZTsKKwlicF9hZGRyZXNzIHJvdXRlcl9hZGRyZXNzOworfTsKK3R5cGVkZWYgc3RydWN0IGJwX3dob2FtaV9yZXMgYnBfd2hvYW1pX3JlczsKKworc3RydWN0IGJwX2dldGZpbGVfYXJnIHsKKwlicF9tYWNoaW5lX25hbWVfdCBjbGllbnRfbmFtZTsKKwlicF9maWxlaWRfdCBmaWxlX2lkOworfTsKK3R5cGVkZWYgc3RydWN0IGJwX2dldGZpbGVfYXJnIGJwX2dldGZpbGVfYXJnOworCitzdHJ1Y3QgYnBfZ2V0ZmlsZV9yZXMgeworCWJwX21hY2hpbmVfbmFtZV90IHNlcnZlcl9uYW1lOworCWJwX2FkZHJlc3Mgc2VydmVyX2FkZHJlc3M7CisJYnBfcGF0aF90IHNlcnZlcl9wYXRoOworfTsKK3R5cGVkZWYgc3RydWN0IGJwX2dldGZpbGVfcmVzIGJwX2dldGZpbGVfcmVzOworCisjZGVmaW5lIEJPT1RQQVJBTVBST0cgMTAwMDI2CisjZGVmaW5lIEJPT1RQQVJBTVZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgQk9PVFBBUkFNUFJPQ19XSE9BTUkgMQorZXh0ZXJuICBicF93aG9hbWlfcmVzICogYm9vdHBhcmFtcHJvY193aG9hbWlfMShicF93aG9hbWlfYXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgYnBfd2hvYW1pX3JlcyAqIGJvb3RwYXJhbXByb2Nfd2hvYW1pXzFfc3ZjKGJwX3dob2FtaV9hcmcgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEJPT1RQQVJBTVBST0NfR0VURklMRSAyCitleHRlcm4gIGJwX2dldGZpbGVfcmVzICogYm9vdHBhcmFtcHJvY19nZXRmaWxlXzEoYnBfZ2V0ZmlsZV9hcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBicF9nZXRmaWxlX3JlcyAqIGJvb3RwYXJhbXByb2NfZ2V0ZmlsZV8xX3N2YyhicF9nZXRmaWxlX2FyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgYm9vdHBhcmFtcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgQk9PVFBBUkFNUFJPQ19XSE9BTUkgMQorZXh0ZXJuICBicF93aG9hbWlfcmVzICogYm9vdHBhcmFtcHJvY193aG9hbWlfMSgpOworZXh0ZXJuICBicF93aG9hbWlfcmVzICogYm9vdHBhcmFtcHJvY193aG9hbWlfMV9zdmMoKTsKKyNkZWZpbmUgQk9PVFBBUkFNUFJPQ19HRVRGSUxFIDIKK2V4dGVybiAgYnBfZ2V0ZmlsZV9yZXMgKiBib290cGFyYW1wcm9jX2dldGZpbGVfMSgpOworZXh0ZXJuICBicF9nZXRmaWxlX3JlcyAqIGJvb3RwYXJhbXByb2NfZ2V0ZmlsZV8xX3N2YygpOworZXh0ZXJuIGludCBib290cGFyYW1wcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9icF9tYWNoaW5lX25hbWVfdCAoWERSICosIGJwX21hY2hpbmVfbmFtZV90Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfcGF0aF90IChYRFIgKiwgYnBfcGF0aF90Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfZmlsZWlkX3QgKFhEUiAqLCBicF9maWxlaWRfdCopOworZXh0ZXJuICBib29sX3QgeGRyX2lwX2FkZHJfdCAoWERSICosIGlwX2FkZHJfdCopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX2FkZHJlc3MgKFhEUiAqLCBicF9hZGRyZXNzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYnBfd2hvYW1pX2FyZyAoWERSICosIGJwX3dob2FtaV9hcmcqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF93aG9hbWlfcmVzIChYRFIgKiwgYnBfd2hvYW1pX3JlcyopOworZXh0ZXJuICBib29sX3QgeGRyX2JwX2dldGZpbGVfYXJnIChYRFIgKiwgYnBfZ2V0ZmlsZV9hcmcqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9icF9nZXRmaWxlX3JlcyAoWERSICosIGJwX2dldGZpbGVfcmVzKik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9icF9tYWNoaW5lX25hbWVfdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX3BhdGhfdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX2ZpbGVpZF90ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfaXBfYWRkcl90ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfYWRkcmVzcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2JwX3dob2FtaV9hcmcgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF93aG9hbWlfcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYnBfZ2V0ZmlsZV9hcmcgKCk7CitleHRlcm4gYm9vbF90IHhkcl9icF9nZXRmaWxlX3JlcyAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX0JPT1RQQVJBTV9QUk9UX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ib290cGFyYW1fcHJvdC54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtX3Byb3QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJjMGRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvYm9vdHBhcmFtX3Byb3QueApAQCAtMCwwICsxLDk3IEBACisvKiBAKCMpYm9vdHBhcmFtX3Byb3QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworLyogQCgjKWJvb3RwYXJhbV9wcm90LnggMS4yIDg3LzA2LzI0IENvcHlyIDE5ODcgU3VuIE1pY3JvICovCisKKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqIAorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKiAKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICogCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKiAKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqIAorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisKKy8qCisgKiBSUEMgZm9yIGJvb3RwYXJtcyBzZXJ2aWNlLgorICogVGhlcmUgYXJlIHR3byBwcm9jZWR1cmVzOgorICogICBXSE9BTUkgdGFrZXMgYSBuZXQgYWRkcmVzcyBhbmQgcmV0dXJucyBhIGNsaWVudCBuYW1lIGFuZCBhbHNvIGEKKyAqCWxpa2VseSBuZXQgYWRkcmVzcyBmb3Igcm91dGluZworICogICBHRVRGSUxFIHRha2VzIGEgY2xpZW50IG5hbWUgYW5kIGZpbGUgaWRlbnRpZmllciBhbmQgcmV0dXJucyB0aGUKKyAqCXNlcnZlciBuYW1lLCBzZXJ2ZXIgbmV0IGFkZHJlc3MgYW5kIHBhdGhuYW1lIGZvciB0aGUgZmlsZS4KKyAqICAgZmlsZSBpZGVudGlmaWVycyB0eXBpY2FsbHkgaW5jbHVkZSByb290LCBzd2FwLCBwdWIgYW5kIGR1bXAKKyAqLworCisjaWZkZWYgUlBDX0hEUgorJSNpbmNsdWRlIDxycGMvdHlwZXMuaD4KKyUjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyUjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CislI2luY2x1ZGUgPG5mcy9uZnMuaD4KKyNlbmRpZgorCitjb25zdCBNQVhfTUFDSElORV9OQU1FICA9IDI1NTsKK2NvbnN0IE1BWF9QQVRIX0xFTgk9IDEwMjQ7Citjb25zdCBNQVhfRklMRUlECT0gMzI7Citjb25zdCBJUF9BRERSX1RZUEUJPSAxOworCit0eXBlZGVmCXN0cmluZwlicF9tYWNoaW5lX25hbWVfdDxNQVhfTUFDSElORV9OQU1FPjsKK3R5cGVkZWYJc3RyaW5nCWJwX3BhdGhfdDxNQVhfUEFUSF9MRU4+OwordHlwZWRlZglzdHJpbmcJYnBfZmlsZWlkX3Q8TUFYX0ZJTEVJRD47CisKK3N0cnVjdAlpcF9hZGRyX3QgeworCWNoYXIJbmV0OworCWNoYXIJaG9zdDsKKwljaGFyCWxoOworCWNoYXIJaW1wbm87Cit9OworCit1bmlvbiBicF9hZGRyZXNzIHN3aXRjaCAoaW50IGFkZHJlc3NfdHlwZSkgeworCWNhc2UgSVBfQUREUl9UWVBFOgorCQlpcF9hZGRyX3QJaXBfYWRkcjsKK307CisKK3N0cnVjdCBicF93aG9hbWlfYXJnIHsKKwlicF9hZGRyZXNzCQljbGllbnRfYWRkcmVzczsKK307CisKK3N0cnVjdCBicF93aG9hbWlfcmVzIHsKKwlicF9tYWNoaW5lX25hbWVfdAljbGllbnRfbmFtZTsKKwlicF9tYWNoaW5lX25hbWVfdAlkb21haW5fbmFtZTsKKwlicF9hZGRyZXNzCQlyb3V0ZXJfYWRkcmVzczsKK307CisKK3N0cnVjdCBicF9nZXRmaWxlX2FyZyB7CisJYnBfbWFjaGluZV9uYW1lX3QJY2xpZW50X25hbWU7CisJYnBfZmlsZWlkX3QJCWZpbGVfaWQ7Cit9OworCQorc3RydWN0IGJwX2dldGZpbGVfcmVzIHsKKwlicF9tYWNoaW5lX25hbWVfdAlzZXJ2ZXJfbmFtZTsKKwlicF9hZGRyZXNzCQlzZXJ2ZXJfYWRkcmVzczsKKwlicF9wYXRoX3QJCXNlcnZlcl9wYXRoOworfTsKKworcHJvZ3JhbSBCT09UUEFSQU1QUk9HIHsKKwl2ZXJzaW9uIEJPT1RQQVJBTVZFUlMgeworCQlicF93aG9hbWlfcmVzCUJPT1RQQVJBTVBST0NfV0hPQU1JKGJwX3dob2FtaV9hcmcpID0gMTsKKwkJYnBfZ2V0ZmlsZV9yZXMJQk9PVFBBUkFNUFJPQ19HRVRGSUxFKGJwX2dldGZpbGVfYXJnKSA9IDI7CisJfSA9IDE7Cit9ID0gMTAwMDI2OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2V5X3Byb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tleV9wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiM2M3ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tleV9wcm90LmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfS0VZX1BST1RfSF9SUENHRU4KKyNkZWZpbmUgX0tFWV9QUk9UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKyNpZiAwCisjcHJhZ21hIGlkZW50ICJAKCMpa2V5X3Byb3QueAkxLjcJOTQvMDQvMjkgU01JIgorI2VuZGlmCisKKy8qIENvcHlyaWdodCAoYykgIDE5OTAsIDE5OTEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAqLworCisvKiAKKyAqIENvbXBpbGVkIGZyb20ga2V5X3Byb3QueCB1c2luZyBycGNnZW4uCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUhCisgKiBUaGlzIGlzIE5PVCBzb3VyY2UgY29kZSEKKyAqLworI2RlZmluZSBQUk9PVCAzCisjZGVmaW5lIEhFWE1PRFVMVVMgImQ0YTBiYTAyNTBiNmZkMmVjNjI2ZTdlZmQ2MzdkZjc2YzcxNmUyMmQwOTQ0Yjg4YiIKKyNkZWZpbmUgSEVYS0VZQllURVMgNDgKKyNkZWZpbmUgS0VZU0laRSAxOTIKKyNkZWZpbmUgS0VZQllURVMgMjQKKyNkZWZpbmUgS0VZQ0hFQ0tTVU1TSVpFIDE2CisKK2VudW0ga2V5c3RhdHVzIHsKKwlLRVlfU1VDQ0VTUyA9IDAsCisJS0VZX05PU0VDUkVUID0gMSwKKwlLRVlfVU5LTk9XTiA9IDIsCisJS0VZX1NZU1RFTUVSUiA9IDMsCit9OwordHlwZWRlZiBlbnVtIGtleXN0YXR1cyBrZXlzdGF0dXM7CisKK3R5cGVkZWYgY2hhciBrZXlidWZbSEVYS0VZQllURVNdOworCit0eXBlZGVmIGNoYXIgKm5ldG5hbWVzdHI7CisKK3N0cnVjdCBjcnlwdGtleWFyZyB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCWRlc19ibG9jayBkZXNrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRrZXlhcmcgY3J5cHRrZXlhcmc7CisKK3N0cnVjdCBjcnlwdGtleWFyZzIgeworCW5ldG5hbWVzdHIgcmVtb3RlbmFtZTsKKwluZXRvYmogcmVtb3Rla2V5OworCWRlc19ibG9jayBkZXNrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRrZXlhcmcyIGNyeXB0a2V5YXJnMjsKKworc3RydWN0IGNyeXB0a2V5cmVzIHsKKwlrZXlzdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJZGVzX2Jsb2NrIGRlc2tleTsKKwl9IGNyeXB0a2V5cmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRrZXlyZXMgY3J5cHRrZXlyZXM7CisjZGVmaW5lIE1BWEdJRFMgMTYKKworc3RydWN0IHVuaXhjcmVkIHsKKwl1X2ludCB1aWQ7CisJdV9pbnQgZ2lkOworCXN0cnVjdCB7CisJCXVfaW50IGdpZHNfbGVuOworCQl1X2ludCAqZ2lkc192YWw7CisJfSBnaWRzOworfTsKK3R5cGVkZWYgc3RydWN0IHVuaXhjcmVkIHVuaXhjcmVkOworCitzdHJ1Y3QgZ2V0Y3JlZHJlcyB7CisJa2V5c3RhdHVzIHN0YXR1czsKKwl1bmlvbiB7CisJCXVuaXhjcmVkIGNyZWQ7CisJfSBnZXRjcmVkcmVzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ2V0Y3JlZHJlcyBnZXRjcmVkcmVzOworCitzdHJ1Y3Qga2V5X25ldHN0YXJnIHsKKwlrZXlidWYgc3RfcHJpdl9rZXk7CisJa2V5YnVmIHN0X3B1Yl9rZXk7CisJbmV0bmFtZXN0ciBzdF9uZXRuYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGtleV9uZXRzdGFyZyBrZXlfbmV0c3Rhcmc7CisKK3N0cnVjdCBrZXlfbmV0c3RyZXMgeworCWtleXN0YXR1cyBzdGF0dXM7CisJdW5pb24geworCQlrZXlfbmV0c3Rhcmcga25ldDsKKwl9IGtleV9uZXRzdHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGtleV9uZXRzdHJlcyBrZXlfbmV0c3RyZXM7CisKKyNpZm5kZWYgb3BhcXVlCisjZGVmaW5lIG9wYXF1ZSBjaGFyCisjZW5kaWYKKworCisjZGVmaW5lIEtFWV9QUk9HIDEwMDAyOQorI2RlZmluZSBLRVlfVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBLRVlfU0VUIDEKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8xKGNoYXIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzFfc3ZjKGNoYXIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9FTkNSWVBUIDIKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8xKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8xX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFQgMworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoY3J5cHRrZXlhcmcgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzFfc3ZjKGNyeXB0a2V5YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfR0VOIDQKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRVRDUkVEIDUKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzEobmV0bmFtZXN0ciAqLCBDTElFTlQgKik7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8xX3N2YyhuZXRuYW1lc3RyICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBrZXlfcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgS0VZX1NFVCAxCitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMSgpOworZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzFfc3ZjKCk7CisjZGVmaW5lIEtFWV9FTkNSWVBUIDIKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8xKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFQgMworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0XzEoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8xX3N2YygpOworI2RlZmluZSBLRVlfR0VOIDQKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8xKCk7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMV9zdmMoKTsKKyNkZWZpbmUgS0VZX0dFVENSRUQgNQorZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMSgpOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMV9zdmMoKTsKK2V4dGVybiBpbnQga2V5X3Byb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisjZGVmaW5lIEtFWV9WRVJTMiAyCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBrZXlzdGF0dXMgKiBrZXlfc2V0XzIoY2hhciAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMl9zdmMoY2hhciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKGNyeXB0a2V5YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yX3N2YyhjcnlwdGtleWFyZyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkZXNfYmxvY2sgKiBrZXlfZ2VuXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIGdldGNyZWRyZXMgKiBrZXlfZ2V0Y3JlZF8yKG5ldG5hbWVzdHIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRjcmVkcmVzICoga2V5X2dldGNyZWRfMl9zdmMobmV0bmFtZXN0ciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgS0VZX0VOQ1JZUFRfUEsgNgorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9lbmNyeXB0X3BrXzIoY3J5cHRrZXlhcmcyICosIENMSUVOVCAqKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yX3N2YyhjcnlwdGtleWFyZzIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9ERUNSWVBUX1BLIDcKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yKGNyeXB0a2V5YXJnMiAqLCBDTElFTlQgKik7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfcGtfMl9zdmMoY3J5cHRrZXlhcmcyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfTkVUX1BVVCA4CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoa2V5X25ldHN0YXJnICosIENMSUVOVCAqKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoa2V5X25ldHN0YXJnICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLRVlfTkVUX0dFVCA5CitleHRlcm4gIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIEtFWV9HRVRfQ09OViAxMAorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yKGNoYXIgKiwgQ0xJRU5UICopOworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yX3N2YyhjaGFyICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBrZXlfcHJvZ18yX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiAga2V5c3RhdHVzICoga2V5X3NldF8yKCk7CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9zZXRfMl9zdmMoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfMl9zdmMoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2RlY3J5cHRfMl9zdmMoKTsKK2V4dGVybiAgZGVzX2Jsb2NrICoga2V5X2dlbl8yKCk7CitleHRlcm4gIGRlc19ibG9jayAqIGtleV9nZW5fMl9zdmMoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzIoKTsKK2V4dGVybiAgZ2V0Y3JlZHJlcyAqIGtleV9nZXRjcmVkXzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9FTkNSWVBUX1BLIDYKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZW5jcnlwdF9wa18yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2VuY3J5cHRfcGtfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX0RFQ1JZUFRfUEsgNworZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9kZWNyeXB0X3BrXzIoKTsKK2V4dGVybiAgY3J5cHRrZXlyZXMgKiBrZXlfZGVjcnlwdF9wa18yX3N2YygpOworI2RlZmluZSBLRVlfTkVUX1BVVCA4CitleHRlcm4gIGtleXN0YXR1cyAqIGtleV9uZXRfcHV0XzIoKTsKK2V4dGVybiAga2V5c3RhdHVzICoga2V5X25ldF9wdXRfMl9zdmMoKTsKKyNkZWZpbmUgS0VZX05FVF9HRVQgOQorZXh0ZXJuICBrZXlfbmV0c3RyZXMgKiBrZXlfbmV0X2dldF8yKCk7CitleHRlcm4gIGtleV9uZXRzdHJlcyAqIGtleV9uZXRfZ2V0XzJfc3ZjKCk7CisjZGVmaW5lIEtFWV9HRVRfQ09OViAxMAorZXh0ZXJuICBjcnlwdGtleXJlcyAqIGtleV9nZXRfY29udl8yKCk7CitleHRlcm4gIGNyeXB0a2V5cmVzICoga2V5X2dldF9jb252XzJfc3ZjKCk7CitleHRlcm4gaW50IGtleV9wcm9nXzJfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlzdGF0dXMgKFhEUiAqLCBrZXlzdGF0dXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlidWYgKFhEUiAqLCBrZXlidWYpOworZXh0ZXJuICBib29sX3QgeGRyX25ldG5hbWVzdHIgKFhEUiAqLCBuZXRuYW1lc3RyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfY3J5cHRrZXlhcmcgKFhEUiAqLCBjcnlwdGtleWFyZyopOworZXh0ZXJuICBib29sX3QgeGRyX2NyeXB0a2V5YXJnMiAoWERSICosIGNyeXB0a2V5YXJnMiopOworZXh0ZXJuICBib29sX3QgeGRyX2NyeXB0a2V5cmVzIChYRFIgKiwgY3J5cHRrZXlyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl91bml4Y3JlZCAoWERSICosIHVuaXhjcmVkKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ2V0Y3JlZHJlcyAoWERSICosIGdldGNyZWRyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlfbmV0c3RhcmcgKFhEUiAqLCBrZXlfbmV0c3RhcmcqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9rZXlfbmV0c3RyZXMgKFhEUiAqLCBrZXlfbmV0c3RyZXMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX2tleXN0YXR1cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tleWJ1ZiAoKTsKK2V4dGVybiBib29sX3QgeGRyX25ldG5hbWVzdHIgKCk7CitleHRlcm4gYm9vbF90IHhkcl9jcnlwdGtleWFyZyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2NyeXB0a2V5YXJnMiAoKTsKK2V4dGVybiBib29sX3QgeGRyX2NyeXB0a2V5cmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfdW5peGNyZWQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9nZXRjcmVkcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2V5X25ldHN0YXJnICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2V5X25ldHN0cmVzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfS0VZX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tleV9wcm90LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rZXlfcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MjcyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rZXlfcHJvdC54CkBAIC0wLDAgKzEsMjg2IEBACislLyoKKyUgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyUgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyUgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworJSAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCislICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorJSAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorJSAqCislICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorJSAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorJSAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyUgKgorJSAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorJSAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyUgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCislICoKKyUgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyUgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCislICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyUgKgorJSAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyUgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyUgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorJSAqCislICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorJSAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorJSAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCislICovCisvKgorICogS2V5IHNlcnZlciBwcm90b2NvbCBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICoKKyAqIFRoZSBrZXlzZXJ2ZXIgaXMgYSBwdWJsaWMga2V5IHN0b3JhZ2UvZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHNlcnZpY2UKKyAqIFRoZSBlbmNyeXB0aW9uIG1ldGhvZCB1c2VkIGlzIGJhc2VkIG9uIHRoZSBEaWZmaWUtSGVsbG1hbiBleHBvbmVudGlhbAorICoga2V5IGV4Y2hhbmdlIHRlY2hub2xvZ3kuCisgKgorICogVGhlIGtleSBzZXJ2ZXIgaXMgbG9jYWwgdG8gZWFjaCBtYWNoaW5lLCBha2luIHRvIHRoZSBwb3J0bWFwcGVyLgorICogVW5kZXIgVEktUlBDLCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGtleXNlcnZlciBpcyB0aHJvdWdoIHRoZQorICogbG9vcGJhY2sgdHJhbnNwb3J0LgorICoKKyAqIE5PVEU6IFRoaXMgLnggZmlsZSBnZW5lcmF0ZXMgdGhlIFVTRVIgbGV2ZWwgaGVhZGVycyBmb3IgdGhlIGtleXNlcnZlci4KKyAqIHRoZSBLRVJORUwgbGV2ZWwgaGVhZGVycyBhcmUgY3JlYXRlZCBieSBoYW5kIGFzIHRoZXkga2VybmVsIGhhcyBzcGVjaWFsCisgKiByZXF1aXJlbWVudHMuCisgKi8KKworJSNpZiAwCislI3ByYWdtYSBpZGVudAkiQCgjKWtleV9wcm90LngJMS43CTk0LzA0LzI5IFNNSSIKKyUjZW5kaWYKKyUKKyUvKiBDb3B5cmlnaHQgKGMpICAxOTkwLCAxOTkxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gKi8KKyUKKyUvKiAKKyUgKiBDb21waWxlZCBmcm9tIGtleV9wcm90LnggdXNpbmcgcnBjZ2VuLgorJSAqIERPIE5PVCBFRElUIFRISVMgRklMRSEKKyUgKiBUaGlzIGlzIE5PVCBzb3VyY2UgY29kZSEKKyUgKi8KKworLyoKKyAqIFBST09UIGFuZCBNT0RVTFVTIGRlZmluZSB0aGUgd2F5IHRoZSBEaWZmaWUtSGVsbG1hbiBrZXkgaXMgZ2VuZXJhdGVkLgorICoKKyAqIE1PRFVMVVMgc2hvdWxkIGJlIGNob3NlbiBhcyBhIHByaW1lIG9mIHRoZSBmb3JtOiBNT0RVTFVTID09IDIqcCArIDEsCisgKiB3aGVyZSBwIGlzIGFsc28gcHJpbWUuCisgKgorICogUFJPT1Qgc2F0aXNmaWVzIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnM6CisgKiAoMSkgKFBST09UICoqIDIpICUgTU9EVUxVUyAhPSAxCisgKiAoMikgKFBST09UICoqIHApICUgTU9EVUxVUyAhPSAxCisgKgorICovCisKK2NvbnN0IFBST09UID0gMzsKK2NvbnN0IEhFWE1PRFVMVVMgPSAiZDRhMGJhMDI1MGI2ZmQyZWM2MjZlN2VmZDYzN2RmNzZjNzE2ZTIyZDA5NDRiODhiIjsKKworY29uc3QgSEVYS0VZQllURVMgPSA0ODsJCS8qIEhFWEtFWUJZVEVTID09IHN0cmxlbihIRVhNT0RVTFVTKSAqLworY29uc3QgS0VZU0laRSA9IDE5MjsJCS8qIEtFWVNJWkUgPT0gYml0IGxlbmd0aCBvZiBrZXkgKi8KK2NvbnN0IEtFWUJZVEVTID0gMjQ7CQkvKiBieXRlIGxlbmd0aCBvZiBrZXkgKi8KKworLyoKKyAqIFRoZSBmaXJzdCAxNiBoZXggZGlnaXRzIG9mIHRoZSBlbmNyeXB0ZWQgc2VjcmV0IGtleSBhcmUgdXNlZCBhcworICogYSBjaGVja3N1bSBpbiB0aGUgZGF0YWJhc2UuCisgKi8KK2NvbnN0IEtFWUNIRUNLU1VNU0laRSA9IDE2OworCisvKgorICogc3RhdHVzIG9mIG9wZXJhdGlvbgorICovCitlbnVtIGtleXN0YXR1cyB7CisJS0VZX1NVQ0NFU1MsCS8qIG5vIHByb2JsZW1zICovCisJS0VZX05PU0VDUkVULAkvKiBubyBzZWNyZXQga2V5IHN0b3JlZCAqLworCUtFWV9VTktOT1dOLAkvKiB1bmtub3duIG5ldG5hbWUgKi8KKwlLRVlfU1lTVEVNRVJSIAkvKiBzeXN0ZW0gZXJyb3IgKG91dCBvZiBtZW1vcnksIGVuY3J5cHRpb24gZmFpbHVyZSkgKi8KK307CisKK3R5cGVkZWYgb3BhcXVlIGtleWJ1ZltIRVhLRVlCWVRFU107CS8qIHN0b3JlIGtleSBpbiBoZXggKi8KKwordHlwZWRlZiBzdHJpbmcgbmV0bmFtZXN0cjxNQVhORVROQU1FTEVOPjsKKworLyoKKyAqIEFyZ3VtZW50IHRvIEVOQ1JZUFQgb3IgREVDUllQVCAKKyAqLworc3RydWN0IGNyeXB0a2V5YXJnIHsKKwluZXRuYW1lc3RyIHJlbW90ZW5hbWU7CisJZGVzX2Jsb2NrIGRlc2tleTsKK307CisKKy8qCisgKiBBcmd1bWVudCB0byBFTkNSWVBUX1BLIG9yIERFQ1JZUFRfUEsKKyAqLworc3RydWN0IGNyeXB0a2V5YXJnMiB7CisJbmV0bmFtZXN0ciByZW1vdGVuYW1lOworCW5ldG9iaglyZW1vdGVrZXk7CS8qIENvbnRhaW5zIGEgbGVuZ3RoIHVwIHRvIDEwMjQgYnl0ZXMgKi8KKwlkZXNfYmxvY2sgZGVza2V5OworfTsKKworCisvKgorICogUmVzdWx0IG9mIEVOQ1JZUFQsIERFQ1JZUFQsIEVOQ1JZUFRfUEssIGFuZCBERUNSWVBUX1BLCisgKi8KK3VuaW9uIGNyeXB0a2V5cmVzIHN3aXRjaCAoa2V5c3RhdHVzIHN0YXR1cykgeworY2FzZSBLRVlfU1VDQ0VTUzoKKwlkZXNfYmxvY2sgZGVza2V5OworZGVmYXVsdDoKKwl2b2lkOworfTsKKworY29uc3QgTUFYR0lEUyAgPSAxNjsJLyogbWF4IG51bWJlciBvZiBnaWRzIGluIGdpZCBsaXN0ICovCisKKy8qCisgKiBVbml4IGNyZWRlbnRpYWwgCisgKi8JCitzdHJ1Y3QgdW5peGNyZWQgeworCXVfaW50IHVpZDsKKwl1X2ludCBnaWQ7CisJdV9pbnQgZ2lkczxNQVhHSURTPjsJCit9OworCisvKgorICogUmVzdWx0IHJldHVybmVkIGZyb20gR0VUQ1JFRAorICovCit1bmlvbiBnZXRjcmVkcmVzIHN3aXRjaCAoa2V5c3RhdHVzIHN0YXR1cykgeworY2FzZSBLRVlfU1VDQ0VTUzoKKwl1bml4Y3JlZCBjcmVkOworZGVmYXVsdDoKKwl2b2lkOworfTsKKy8qCisgKiBrZXlfbmV0c3Rhcmc7CisgKi8KKworc3RydWN0IGtleV9uZXRzdGFyZyB7CisJa2V5YnVmIHN0X3ByaXZfa2V5OworCWtleWJ1ZiBzdF9wdWJfa2V5OworCW5ldG5hbWVzdHIgc3RfbmV0bmFtZTsKK307CisKK3VuaW9uIGtleV9uZXRzdHJlcyBzd2l0Y2ggKGtleXN0YXR1cyBzdGF0dXMpeworY2FzZSBLRVlfU1VDQ0VTUzoKKwlrZXlfbmV0c3Rhcmcga25ldDsKK2RlZmF1bHQ6CisJdm9pZDsKK307CQorCisjaWZkZWYgUlBDX0hEUgorJQorJSNpZm5kZWYgb3BhcXVlCislI2RlZmluZSBvcGFxdWUgY2hhcgorJSNlbmRpZgorJQorI2VuZGlmCitwcm9ncmFtIEtFWV9QUk9HIHsKKwl2ZXJzaW9uIEtFWV9WRVJTIHsKKworCQkvKgorCQkgKiBUaGlzIGlzIG15IHNlY3JldCBrZXkuCisJIAkgKiBTdG9yZSBpdCBmb3IgbWUuCisJCSAqLworCQlrZXlzdGF0dXMgCisJCUtFWV9TRVQoa2V5YnVmKSA9IDE7CQorCQorCQkvKgorCQkgKiBJIHdhbnQgdG8gdGFsayB0byBYLgorCQkgKiBFbmNyeXB0IGEgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJIAkgKi8KKwkJY3J5cHRrZXlyZXMKKwkJS0VZX0VOQ1JZUFQoY3J5cHRrZXlhcmcpID0gMjsJCisKKwkJLyoKKwkJICogWCBqdXN0IHNlbnQgbWUgYSBtZXNzYWdlLgorCQkgKiBEZWNyeXB0IHRoZSBjb252ZXJzYXRpb24ga2V5IGZvciBtZS4KKwkJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9ERUNSWVBUKGNyeXB0a2V5YXJnKSA9IDM7CisKKwkJLyoKKwkJICogR2VuZXJhdGUgYSBzZWN1cmUgY29udmVyc2F0aW9uIGtleSBmb3IgbWUKKwkJICovCisJCWRlc19ibG9jayAKKwkJS0VZX0dFTih2b2lkKSA9IDQ7CisKKwkJLyoKKwkJICogR2V0IG1lIHRoZSB1aWQsIGdpZCBhbmQgZ3JvdXAtYWNjZXNzLWxpc3QgYXNzb2NpYXRlZAorCQkgKiB3aXRoIHRoaXMgbmV0bmFtZSAoZm9yIGtlcm5lbCB3aGljaCBjYW5ub3QgdXNlIE5JUykKKwkJICovCisJCWdldGNyZWRyZXMKKwkJS0VZX0dFVENSRUQobmV0bmFtZXN0cikgPSA1OworCX0gPSAxOworCXZlcnNpb24gS0VZX1ZFUlMyIHsKKworCQkvKgorCQkgKiAjIyMjIyMjCisJCSAqIFByb2NlZHVyZXMgMS01IGFyZSBpZGVudGljYWwgdG8gdmVyc2lvbiAxCisJCSAqICMjIyMjIyMKKwkJICovCisKKwkJLyoKKwkJICogVGhpcyBpcyBteSBzZWNyZXQga2V5LgorCSAJICogU3RvcmUgaXQgZm9yIG1lLgorCQkgKi8KKwkJa2V5c3RhdHVzIAorCQlLRVlfU0VUKGtleWJ1ZikgPSAxOwkKKwkKKwkJLyoKKwkJICogSSB3YW50IHRvIHRhbGsgdG8gWC4KKwkJICogRW5jcnlwdCBhIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lLgorCSAJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9FTkNSWVBUKGNyeXB0a2V5YXJnKSA9IDI7CQorCisJCS8qCisJCSAqIFgganVzdCBzZW50IG1lIGEgbWVzc2FnZS4KKwkJICogRGVjcnlwdCB0aGUgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJCSAqLworCQljcnlwdGtleXJlcworCQlLRVlfREVDUllQVChjcnlwdGtleWFyZykgPSAzOworCisJCS8qCisJCSAqIEdlbmVyYXRlIGEgc2VjdXJlIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lCisJCSAqLworCQlkZXNfYmxvY2sgCisJCUtFWV9HRU4odm9pZCkgPSA0OworCisJCS8qCisJCSAqIEdldCBtZSB0aGUgdWlkLCBnaWQgYW5kIGdyb3VwLWFjY2Vzcy1saXN0IGFzc29jaWF0ZWQKKwkJICogd2l0aCB0aGlzIG5ldG5hbWUgKGZvciBrZXJuZWwgd2hpY2ggY2Fubm90IHVzZSBOSVMpCisJCSAqLworCQlnZXRjcmVkcmVzCisJCUtFWV9HRVRDUkVEKG5ldG5hbWVzdHIpID0gNTsKKwkJCisJCS8qCisJCSAqIEkgd2FudCB0byB0YWxrIHRvIFguIGFuZCBJIGtub3cgWCdzIHB1YmxpYyBrZXkKKwkJICogRW5jcnlwdCBhIGNvbnZlcnNhdGlvbiBrZXkgZm9yIG1lLgorCSAJICovCisJCWNyeXB0a2V5cmVzCisJCUtFWV9FTkNSWVBUX1BLKGNyeXB0a2V5YXJnMikgPSA2OwkKKworCQkvKgorCQkgKiBYIGp1c3Qgc2VudCBtZSBhIG1lc3NhZ2UuIGFuZCBJIGtub3cgWCdzIHB1YmxpYyBrZXkKKwkJICogRGVjcnlwdCB0aGUgY29udmVyc2F0aW9uIGtleSBmb3IgbWUuCisJCSAqLworCQljcnlwdGtleXJlcworCQlLRVlfREVDUllQVF9QSyhjcnlwdGtleWFyZzIpID0gNzsKKwkJCisJCS8qIAorCQkgKiBTdG9yZSBteSBwdWJsaWMga2V5LCBuZXRuYW1lIGFuZCBwcml2YXRlIGtleS4gCisJCSAqLworCQlrZXlzdGF0dXMKKwkJS0VZX05FVF9QVVQoa2V5X25ldHN0YXJnKSA9IDg7CisJCQorCQkvKgorCQkgKiBSZXRyaWV2ZSBteSBwdWJsaWMga2V5LCBuZXRuYW1lIGFuZCBwcml2YXRlIGtleS4gCisJCSAqLworIAkJa2V5X25ldHN0cmVzCisJCUtFWV9ORVRfR0VUKHZvaWQpID0gOTsKKwkJCisJCS8qCisJCSAqIFJldHVybiBtZSB0aGUgY29udmVyc2F0aW9uIGtleSB0aGF0IGlzIGNvbnN0cnVjdGVkIAorCQkgKiBmcm9tIG15IHNlY3JldCBrZXkgYW5kIHRoaXMgcHVibGlja2V5LiAKKwkJICovCisKKwkJY3J5cHRrZXlyZXMgCisJCUtFWV9HRVRfQ09OVihrZXlidWYpID0gMTA7IAorCisJCQorCX0gPSAyOworfSA9IDEwMDAyOTsKKworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9rbG1fcHJvdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWMyODFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9LTE1fUFJPVF9IX1JQQ0dFTgorI2RlZmluZSBfS0xNX1BST1RfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTE1fTUFYU1RSTEVOIDEwMjQKKworZW51bSBrbG1fc3RhdHMgeworCWtsbV9ncmFudGVkID0gMCwKKwlrbG1fZGVuaWVkID0gMSwKKwlrbG1fZGVuaWVkX25vbG9ja3MgPSAyLAorCWtsbV93b3JraW5nID0gMywKK307Cit0eXBlZGVmIGVudW0ga2xtX3N0YXRzIGtsbV9zdGF0czsKKworc3RydWN0IGtsbV9sb2NrIHsKKwljaGFyICpzZXJ2ZXJfbmFtZTsKKwluZXRvYmogZmg7CisJaW50IHBpZDsKKwl1X2ludCBsX29mZnNldDsKKwl1X2ludCBsX2xlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fbG9jayBrbG1fbG9jazsKKworc3RydWN0IGtsbV9ob2xkZXIgeworCWJvb2xfdCBleGNsdXNpdmU7CisJaW50IHN2aWQ7CisJdV9pbnQgbF9vZmZzZXQ7CisJdV9pbnQgbF9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3Qga2xtX2hvbGRlciBrbG1faG9sZGVyOworCitzdHJ1Y3Qga2xtX3N0YXQgeworCWtsbV9zdGF0cyBzdGF0OworfTsKK3R5cGVkZWYgc3RydWN0IGtsbV9zdGF0IGtsbV9zdGF0OworCitzdHJ1Y3Qga2xtX3Rlc3RycGx5IHsKKwlrbG1fc3RhdHMgc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCBrbG1faG9sZGVyIGhvbGRlcjsKKwl9IGtsbV90ZXN0cnBseV91OworfTsKK3R5cGVkZWYgc3RydWN0IGtsbV90ZXN0cnBseSBrbG1fdGVzdHJwbHk7CisKK3N0cnVjdCBrbG1fbG9ja2FyZ3MgeworCWJvb2xfdCBibG9jazsKKwlib29sX3QgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fbG9ja2FyZ3Mga2xtX2xvY2thcmdzOworCitzdHJ1Y3Qga2xtX3Rlc3RhcmdzIHsKKwlib29sX3QgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fdGVzdGFyZ3Mga2xtX3Rlc3RhcmdzOworCitzdHJ1Y3Qga2xtX3VubG9ja2FyZ3MgeworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBrbG1fdW5sb2NrYXJncyBrbG1fdW5sb2NrYXJnczsKKworI2RlZmluZSBLTE1fUFJPRyAxMDAwMjAKKyNkZWZpbmUgS0xNX1ZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgS0xNX1RFU1QgMQorZXh0ZXJuICBrbG1fdGVzdHJwbHkgKiBrbG1fdGVzdF8xKHN0cnVjdCBrbG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBrbG1fdGVzdHJwbHkgKiBrbG1fdGVzdF8xX3N2YyhzdHJ1Y3Qga2xtX3Rlc3RhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLTE1fTE9DSyAyCitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2xvY2tfMShzdHJ1Y3Qga2xtX2xvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fbG9ja18xX3N2YyhzdHJ1Y3Qga2xtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLTE1fQ0FOQ0VMIDMKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fY2FuY2VsXzEoc3RydWN0IGtsbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2NhbmNlbF8xX3N2YyhzdHJ1Y3Qga2xtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBLTE1fVU5MT0NLIDQKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fdW5sb2NrXzEoc3RydWN0IGtsbV91bmxvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAga2xtX3N0YXQgKiBrbG1fdW5sb2NrXzFfc3ZjKHN0cnVjdCBrbG1fdW5sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQga2xtX3Byb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIEtMTV9URVNUIDEKK2V4dGVybiAga2xtX3Rlc3RycGx5ICoga2xtX3Rlc3RfMSgpOworZXh0ZXJuICBrbG1fdGVzdHJwbHkgKiBrbG1fdGVzdF8xX3N2YygpOworI2RlZmluZSBLTE1fTE9DSyAyCitleHRlcm4gIGtsbV9zdGF0ICoga2xtX2xvY2tfMSgpOworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9sb2NrXzFfc3ZjKCk7CisjZGVmaW5lIEtMTV9DQU5DRUwgMworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9jYW5jZWxfMSgpOworZXh0ZXJuICBrbG1fc3RhdCAqIGtsbV9jYW5jZWxfMV9zdmMoKTsKKyNkZWZpbmUgS0xNX1VOTE9DSyA0CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX3VubG9ja18xKCk7CitleHRlcm4gIGtsbV9zdGF0ICoga2xtX3VubG9ja18xX3N2YygpOworZXh0ZXJuIGludCBrbG1fcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfa2xtX3N0YXRzIChYRFIgKiwga2xtX3N0YXRzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2xtX2xvY2sgKFhEUiAqLCBrbG1fbG9jayopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV9ob2xkZXIgKFhEUiAqLCBrbG1faG9sZGVyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2xtX3N0YXQgKFhEUiAqLCBrbG1fc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV90ZXN0cnBseSAoWERSICosIGtsbV90ZXN0cnBseSopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV9sb2NrYXJncyAoWERSICosIGtsbV9sb2NrYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV90ZXN0YXJncyAoWERSICosIGtsbV90ZXN0YXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2tsbV91bmxvY2thcmdzIChYRFIgKiwga2xtX3VubG9ja2FyZ3MqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX2tsbV9zdGF0cyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV9sb2NrICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX2hvbGRlciAoKTsKK2V4dGVybiBib29sX3QgeGRyX2tsbV9zdGF0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX3Rlc3RycGx5ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX2xvY2thcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX3Rlc3RhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfa2xtX3VubG9ja2FyZ3MgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9LTE1fUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMva2xtX3Byb3QueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzZTEyZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL2tsbV9wcm90LngKQEAgLTAsMCArMSwxMzQgQEAKKy8qIEAoIylrbG1fcHJvdC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisvKiBAKCMpa2xtX3Byb3QueCAxLjcgODcvMDcvMDggQ29weXIgMTk4NyBTdW4gTWljcm8gKi8KKworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICogCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqIAorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKiAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqIAorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICogCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIEtlcm5lbC9sb2NrIG1hbmFnZXIgcHJvdG9jb2wgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTg2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBwcm90b2NvbCB1c2VkIGJldHdlZW4gdGhlIFVOSVgga2VybmVsICh0aGUgImNsaWVudCIpIGFuZCB0aGUKKyAqIGxvY2FsIGxvY2sgbWFuYWdlci4gIFRoZSBsb2NhbCBsb2NrIG1hbmFnZXIgaXMgYSBkZWFtb24gcnVubmluZworICogYWJvdmUgdGhlIGtlcm5lbC4KKyAqLworCitjb25zdAlMTV9NQVhTVFJMRU4gPSAxMDI0OworCisvKgorICogbG9jayBtYW5hZ2VyIHN0YXR1cyByZXR1cm5zCisgKi8KK2VudW0ga2xtX3N0YXRzIHsKKwlrbG1fZ3JhbnRlZCA9IDAsCS8qIGxvY2sgaXMgZ3JhbnRlZCAqLworCWtsbV9kZW5pZWQgPSAxLAkJLyogbG9jayBpcyBkZW5pZWQgKi8KKwlrbG1fZGVuaWVkX25vbG9ja3MgPSAyLCAvKiBubyBsb2NrIGVudHJ5IGF2YWlsYWJsZSAqLworCWtsbV93b3JraW5nID0gMyAJLyogbG9jayBpcyBiZWluZyBwcm9jZXNzZWQgKi8KK307CisKKy8qCisgKiBsb2NrIG1hbmFnZXIgbG9jayBpZGVudGlmaWVyCisgKi8KK3N0cnVjdCBrbG1fbG9jayB7CisJc3RyaW5nIHNlcnZlcl9uYW1lPExNX01BWFNUUkxFTj47CisJbmV0b2JqIGZoOwkJLyogYSBjb3VudGVkIGZpbGUgaGFuZGxlICovCisJaW50IHBpZDsJCS8qIGhvbGRlciBvZiB0aGUgbG9jayAqLworCXVuc2lnbmVkIGxfb2Zmc2V0OwkvKiBiZWdpbm5pbmcgb2Zmc2V0IG9mIHRoZSBsb2NrICovCisJdW5zaWduZWQgbF9sZW47CQkvKiBieXRlIGxlbmd0aCBvZiB0aGUgbG9jazsKKwkJCQkgKiB6ZXJvIG1lYW5zIHRocm91Z2ggZW5kIG9mIGZpbGUgKi8KK307CisKKy8qCisgKiBsb2NrIGhvbGRlciBpZGVudGlmaWVyCisgKi8KK3N0cnVjdCBrbG1faG9sZGVyIHsKKwlib29sIGV4Y2x1c2l2ZTsJCS8qIEZBTFNFIGlmIHNoYXJlZCBsb2NrICovCisJaW50IHN2aWQ7CQkvKiBob2xkZXIgb2YgdGhlIGxvY2sgKHBpZCkgKi8KKwl1bnNpZ25lZCBsX29mZnNldDsJLyogYmVnaW5uaW5nIG9mZnNldCBvZiB0aGUgbG9jayAqLworCXVuc2lnbmVkIGxfbGVuOwkJLyogYnl0ZSBsZW5ndGggb2YgdGhlIGxvY2s7CisJCQkJICogemVybyBtZWFucyB0aHJvdWdoIGVuZCBvZiBmaWxlICovCit9OworCisvKgorICogcmVwbHkgdG8gS0xNX0xPQ0sgLyBLTE1fVU5MT0NLIC8gS0xNX0NBTkNFTAorICovCitzdHJ1Y3Qga2xtX3N0YXQgeworCWtsbV9zdGF0cyBzdGF0OworfTsKKworLyoKKyAqIHJlcGx5IHRvIGEgS0xNX1RFU1QgY2FsbAorICovCit1bmlvbiBrbG1fdGVzdHJwbHkgc3dpdGNoIChrbG1fc3RhdHMgc3RhdCkgeworCWNhc2Uga2xtX2RlbmllZDoKKwkJc3RydWN0IGtsbV9ob2xkZXIgaG9sZGVyOworCWRlZmF1bHQ6IC8qIEFsbCBvdGhlciBjYXNlcyByZXR1cm4gbm8gYXJndW1lbnRzICovCisJCXZvaWQ7Cit9OworCisKKy8qCisgKiBhcmd1bWVudHMgdG8gS0xNX0xPQ0sKKyAqLworc3RydWN0IGtsbV9sb2NrYXJncyB7CisJYm9vbCBibG9jazsKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3Qga2xtX2xvY2sgYWxvY2s7Cit9OworCisvKgorICogYXJndW1lbnRzIHRvIEtMTV9URVNUCisgKi8KK3N0cnVjdCBrbG1fdGVzdGFyZ3MgeworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307CisKKy8qCisgKiBhcmd1bWVudHMgdG8gS0xNX1VOTE9DSworICovCitzdHJ1Y3Qga2xtX3VubG9ja2FyZ3MgeworCXN0cnVjdCBrbG1fbG9jayBhbG9jazsKK307CisKK3Byb2dyYW0gS0xNX1BST0cgeworCXZlcnNpb24gS0xNX1ZFUlMgeworCisJCWtsbV90ZXN0cnBseQlLTE1fVEVTVCAoc3RydWN0IGtsbV90ZXN0YXJncykgPQkxOworCisJCWtsbV9zdGF0CUtMTV9MT0NLIChzdHJ1Y3Qga2xtX2xvY2thcmdzKSA9CTI7CisKKwkJa2xtX3N0YXQJS0xNX0NBTkNFTCAoc3RydWN0IGtsbV9sb2NrYXJncykgPQkzOworCQkvKiBrbG1fZ3JhbnRlZD0+IHRoZSBjYW5jZWwgcmVxdWVzdCBmYWlscyBkdWUgdG8gbG9jayBpcyBhbHJlYWR5IGdyYW50ZWQgKi8KKwkJLyoga2xtX2RlbmllZD0+IHRoZSBjYW5jZWwgcmVxdWVzdCBzdWNjZXNzZnVsbHkgYWJvcnRzCitsb2NrIHJlcXVlc3QgICovCisKKwkJa2xtX3N0YXQJS0xNX1VOTE9DSyAoc3RydWN0IGtsbV91bmxvY2thcmdzKSA9CTQ7CisJfSA9IDE7Cit9ID0gMTAwMDIwOworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9tb3VudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTIyZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9NT1VOVF9IX1JQQ0dFTgorI2RlZmluZSBfTU9VTlRfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgTU5UUEFUSExFTiAxMDI0CisjZGVmaW5lIE1OVE5BTUxFTiAyNTUKKyNkZWZpbmUgRkhTSVpFIDMyCisKK3R5cGVkZWYgY2hhciBmaGFuZGxlW0ZIU0laRV07CisKK3N0cnVjdCBmaHN0YXR1cyB7CisJdV9pbnQgZmhzX3N0YXR1czsKKwl1bmlvbiB7CisJCWZoYW5kbGUgZmhzX2ZoYW5kbGU7CisJfSBmaHN0YXR1c191OworfTsKK3R5cGVkZWYgc3RydWN0IGZoc3RhdHVzIGZoc3RhdHVzOworCit0eXBlZGVmIGNoYXIgKmRpcnBhdGg7CisKK3R5cGVkZWYgY2hhciAqbmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgbW91bnRib2R5ICptb3VudGxpc3Q7CisKK3N0cnVjdCBtb3VudGJvZHkgeworCW5hbWUgbWxfaG9zdG5hbWU7CisJZGlycGF0aCBtbF9kaXJlY3Rvcnk7CisJbW91bnRsaXN0IG1sX25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW91bnRib2R5IG1vdW50Ym9keTsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBub2RlICpncm91cHM7CisKK3N0cnVjdCBncm91cG5vZGUgeworCW5hbWUgZ3JfbmFtZTsKKwlncm91cHMgZ3JfbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBncm91cG5vZGUgZ3JvdXBub2RlOworCit0eXBlZGVmIHN0cnVjdCBleHBvcnRub2RlICpleHBvcnRzOworCitzdHJ1Y3QgZXhwb3J0bm9kZSB7CisJZGlycGF0aCBleF9kaXI7CisJZ3JvdXBzIGV4X2dyb3VwczsKKwlleHBvcnRzIGV4X25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZXhwb3J0bm9kZSBleHBvcnRub2RlOworCisjZGVmaW5lIE1PVU5UUFJPRyAxMDAwMDUKKyNkZWZpbmUgTU9VTlRWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE1PVU5UUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY19udWxsXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfbnVsbF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfTU5UIDEKK2V4dGVybiAgZmhzdGF0dXMgKiBtb3VudHByb2NfbW50XzEoZGlycGF0aCAqLCBDTElFTlQgKik7CitleHRlcm4gIGZoc3RhdHVzICogbW91bnRwcm9jX21udF8xX3N2YyhkaXJwYXRoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfRFVNUCAyCitleHRlcm4gIG1vdW50bGlzdCAqIG1vdW50cHJvY19kdW1wXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIG1vdW50bGlzdCAqIG1vdW50cHJvY19kdW1wXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UIDMKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50XzEoZGlycGF0aCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udF8xX3N2YyhkaXJwYXRoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBNT1VOVFBST0NfVU1OVEFMTCA0CitleHRlcm4gIHZvaWQgKiBtb3VudHByb2NfdW1udGFsbF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbW91bnRwcm9jX3VtbnRhbGxfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTU9VTlRQUk9DX0VYUE9SVCA1CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0XzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0XzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlRBTEwgNgorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBtb3VudHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIE1PVU5UUFJPQ19OVUxMIDAKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY19udWxsXzEoKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY19udWxsXzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19NTlQgMQorZXh0ZXJuICBmaHN0YXR1cyAqIG1vdW50cHJvY19tbnRfMSgpOworZXh0ZXJuICBmaHN0YXR1cyAqIG1vdW50cHJvY19tbnRfMV9zdmMoKTsKKyNkZWZpbmUgTU9VTlRQUk9DX0RVTVAgMgorZXh0ZXJuICBtb3VudGxpc3QgKiBtb3VudHByb2NfZHVtcF8xKCk7CitleHRlcm4gIG1vdW50bGlzdCAqIG1vdW50cHJvY19kdW1wXzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UIDMKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50XzEoKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50XzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19VTU5UQUxMIDQKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50YWxsXzEoKTsKK2V4dGVybiAgdm9pZCAqIG1vdW50cHJvY191bW50YWxsXzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlQgNQorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydF8xKCk7CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0XzFfc3ZjKCk7CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlRBTEwgNgorZXh0ZXJuICBleHBvcnRzICogbW91bnRwcm9jX2V4cG9ydGFsbF8xKCk7CitleHRlcm4gIGV4cG9ydHMgKiBtb3VudHByb2NfZXhwb3J0YWxsXzFfc3ZjKCk7CitleHRlcm4gaW50IG1vdW50cHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfZmhhbmRsZSAoWERSICosIGZoYW5kbGUpOworZXh0ZXJuICBib29sX3QgeGRyX2Zoc3RhdHVzIChYRFIgKiwgZmhzdGF0dXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9kaXJwYXRoIChYRFIgKiwgZGlycGF0aCopOworZXh0ZXJuICBib29sX3QgeGRyX25hbWUgKFhEUiAqLCBuYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbW91bnRsaXN0IChYRFIgKiwgbW91bnRsaXN0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbW91bnRib2R5IChYRFIgKiwgbW91bnRib2R5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ3JvdXBzIChYRFIgKiwgZ3JvdXBzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ3JvdXBub2RlIChYRFIgKiwgZ3JvdXBub2RlKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZXhwb3J0cyAoWERSICosIGV4cG9ydHMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9leHBvcnRub2RlIChYRFIgKiwgZXhwb3J0bm9kZSopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfZmhhbmRsZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX2Zoc3RhdHVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZGlycGF0aCAoKTsKK2V4dGVybiBib29sX3QgeGRyX25hbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9tb3VudGxpc3QgKCk7CitleHRlcm4gYm9vbF90IHhkcl9tb3VudGJvZHkgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ncm91cHMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ncm91cG5vZGUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9leHBvcnRzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZXhwb3J0bm9kZSAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX01PVU5UX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9tb3VudC54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTBiNGNhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbW91bnQueApAQCAtMCwwICsxLDE2MSBAQAorLyogQCgjKW1vdW50LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKy8qIEAoIyltb3VudC54IDEuMiA4Ny8wOS8xOCBDb3B5ciAxOTg3IFN1biBNaWNybyAqLworCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIFByb3RvY29sIGRlc2NyaXB0aW9uIGZvciB0aGUgbW91bnQgcHJvZ3JhbQorICovCisKKworY29uc3QgTU5UUEFUSExFTiA9IDEwMjQ7CS8qIG1heGltdW0gYnl0ZXMgaW4gYSBwYXRobmFtZSBhcmd1bWVudCAqLworY29uc3QgTU5UTkFNTEVOID0gMjU1OwkJLyogbWF4aW11bSBieXRlcyBpbiBhIG5hbWUgYXJndW1lbnQgKi8KK2NvbnN0IEZIU0laRSA9IDMyOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBhIGZpbGUgaGFuZGxlICovCisKKy8qCisgKiBUaGUgZmhhbmRsZSBpcyB0aGUgZmlsZSBoYW5kbGUgdGhhdCB0aGUgc2VydmVyIHBhc3NlcyB0byB0aGUgY2xpZW50LgorICogQWxsIGZpbGUgb3BlcmF0aW9ucyBhcmUgZG9uZSB1c2luZyB0aGUgZmlsZSBoYW5kbGVzIHRvIHJlZmVyIHRvIGEgZmlsZQorICogb3IgYSBkaXJlY3RvcnkuIFRoZSBmaWxlIGhhbmRsZSBjYW4gY29udGFpbiB3aGF0ZXZlciBpbmZvcm1hdGlvbiB0aGUKKyAqIHNlcnZlciBuZWVkcyB0byBkaXN0aW5ndWlzaCBhbiBpbmRpdmlkdWFsIGZpbGUuCisgKi8KK3R5cGVkZWYgb3BhcXVlIGZoYW5kbGVbRkhTSVpFXTsKKworLyoKKyAqIElmIGEgc3RhdHVzIG9mIHplcm8gaXMgcmV0dXJuZWQsIHRoZSBjYWxsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGFuZAorICogYSBmaWxlIGhhbmRsZSBmb3IgdGhlIGRpcmVjdG9yeSBmb2xsb3dzLiBBIG5vbi16ZXJvIHN0YXR1cyBpbmRpY2F0ZXMKKyAqIHNvbWUgc29ydCBvZiBlcnJvci4gVGhlIHN0YXR1cyBjb3JyZXNwb25kcyB3aXRoIFVOSVggZXJyb3IgbnVtYmVycy4KKyAqLwordW5pb24gZmhzdGF0dXMgc3dpdGNoICh1bnNpZ25lZCBmaHNfc3RhdHVzKSB7CitjYXNlIDA6CisJZmhhbmRsZSBmaHNfZmhhbmRsZTsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKKy8qCisgKiBUaGUgdHlwZSBkaXJwYXRoIGlzIHRoZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeQorICovCit0eXBlZGVmIHN0cmluZyBkaXJwYXRoPE1OVFBBVEhMRU4+OworCisvKgorICogVGhlIHR5cGUgbmFtZSBpcyB1c2VkIGZvciBhcmJpdHJhcnkgbmFtZXMgKGhvc3RuYW1lcywgZ3JvdXBuYW1lcykKKyAqLwordHlwZWRlZiBzdHJpbmcgbmFtZTxNTlROQU1MRU4+OworCisvKgorICogQSBsaXN0IG9mIHdobyBoYXMgd2hhdCBtb3VudGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSAqbW91bnRsaXN0Oworc3RydWN0IG1vdW50Ym9keSB7CisJbmFtZSBtbF9ob3N0bmFtZTsKKwlkaXJwYXRoIG1sX2RpcmVjdG9yeTsKKwltb3VudGxpc3QgbWxfbmV4dDsKK307CisKKy8qCisgKiBBIGxpc3Qgb2YgbmV0Z3JvdXBzCisgKi8KK3R5cGVkZWYgc3RydWN0IGdyb3Vwbm9kZSAqZ3JvdXBzOworc3RydWN0IGdyb3Vwbm9kZSB7CisJbmFtZSBncl9uYW1lOworCWdyb3VwcyBncl9uZXh0OworfTsKKworLyoKKyAqIEEgbGlzdCBvZiB3aGF0IGlzIGV4cG9ydGVkIGFuZCB0byB3aG9tCisgKi8KK3R5cGVkZWYgc3RydWN0IGV4cG9ydG5vZGUgKmV4cG9ydHM7CitzdHJ1Y3QgZXhwb3J0bm9kZSB7CisJZGlycGF0aCBleF9kaXI7CisJZ3JvdXBzIGV4X2dyb3VwczsKKwlleHBvcnRzIGV4X25leHQ7Cit9OworCitwcm9ncmFtIE1PVU5UUFJPRyB7CisJLyoKKwkgKiBWZXJzaW9uIG9uZSBvZiB0aGUgbW91bnQgcHJvdG9jb2wgY29tbXVuaWNhdGVzIHdpdGggdmVyc2lvbiB0d28KKwkgKiBvZiB0aGUgTkZTIHByb3RvY29sLiBUaGUgb25seSBjb25uZWN0aW5nIHBvaW50IGlzIHRoZSBmaGFuZGxlCisJICogc3RydWN0dXJlLCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYm90aCBwcm90b2NvbHMuCisJICovCisJdmVyc2lvbiBNT1VOVFZFUlMgeworCQkvKgorCQkgKiBEb2VzIG5vIHdvcmsuIEl0IGlzIG1hZGUgYXZhaWxhYmxlIGluIGFsbCBSUEMgc2VydmljZXMKKwkJICogdG8gYWxsb3cgc2VydmVyIHJlc3BvbnNlIHRlc3RpbmcgYW5kIHRpbWluZworCQkgKi8KKwkJdm9pZAorCQlNT1VOVFBST0NfTlVMTCh2b2lkKSA9IDA7CisKKwkJLyoKKwkJICogSWYgZmhzX3N0YXR1cyBpcyAwLCB0aGVuIGZoc19maGFuZGxlIGNvbnRhaW5zIHRoZQorCSAJICogZmlsZSBoYW5kbGUgZm9yIHRoZSBkaXJlY3RvcnkuIFRoaXMgZmlsZSBoYW5kbGUgbWF5CisJCSAqIGJlIHVzZWQgaW4gdGhlIE5GUyBwcm90b2NvbC4gVGhpcyBwcm9jZWR1cmUgYWxzbyBhZGRzCisJCSAqIGEgbmV3IGVudHJ5IHRvIHRoZSBtb3VudCBsaXN0IGZvciB0aGlzIGNsaWVudCBtb3VudGluZworCQkgKiB0aGUgZGlyZWN0b3J5LgorCQkgKiBVbml4IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLgorCQkgKi8KKwkJZmhzdGF0dXMKKwkJTU9VTlRQUk9DX01OVChkaXJwYXRoKSA9IDE7CisKKwkJLyoKKwkJICogUmV0dXJucyB0aGUgbGlzdCBvZiByZW1vdGVseSBtb3VudGVkIGZpbGVzeXN0ZW1zLiBUaGUKKwkJICogbW91bnRsaXN0IGNvbnRhaW5zIG9uZSBlbnRyeSBmb3IgZWFjaCBob3N0bmFtZSBhbmQKKwkJICogZGlyZWN0b3J5IHBhaXIuCisJCSAqLworCQltb3VudGxpc3QKKwkJTU9VTlRQUk9DX0RVTVAodm9pZCkgPSAyOworCisJCS8qCisJCSAqIFJlbW92ZXMgdGhlIG1vdW50IGxpc3QgZW50cnkgZm9yIHRoZSBkaXJlY3RvcnkKKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX1VNTlQoZGlycGF0aCkgPSAzOworCisJCS8qCisJCSAqIFJlbW92ZXMgYWxsIG9mIHRoZSBtb3VudCBsaXN0IGVudHJpZXMgZm9yIHRoaXMgY2xpZW50CisJCSAqIFVuaXggYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisJCSAqLworCQl2b2lkCisJCU1PVU5UUFJPQ19VTU5UQUxMKHZvaWQpID0gNDsKKworCQkvKgorCQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGV4cG9ydGVkIGZpbGVzeXN0ZW1zLCBhbmQgd2hpY2gKKwkJICogbWFjaGluZXMgYXJlIGFsbG93ZWQgdG8gaW1wb3J0IGl0LgorCQkgKi8KKwkJZXhwb3J0cworCQlNT1VOVFBST0NfRVhQT1JUKHZvaWQpICA9IDU7CisKKwkJLyoKKwkJICogSWRlbnRpY2FsIHRvIE1PVU5UUFJPQ19FWFBPUlQgYWJvdmUKKwkJICovCisJCWV4cG9ydHMKKwkJTU9VTlRQUk9DX0VYUE9SVEFMTCh2b2lkKSA9IDY7CisJfSA9IDE7Cit9ID0gMTAwMDA1OwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmZzX3Byb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmNjI2YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LmgKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfTkZTX1BST1RfSF9SUENHRU4KKyNkZWZpbmUgX05GU19QUk9UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE5GU19QT1JUIDIwNDkKKyNkZWZpbmUgTkZTX01BWERBVEEgODE5MgorI2RlZmluZSBORlNfTUFYUEFUSExFTiAxMDI0CisjZGVmaW5lIE5GU19NQVhOQU1MRU4gMjU1CisjZGVmaW5lIE5GU19GSFNJWkUgMzIKKyNkZWZpbmUgTkZTX0NPT0tJRVNJWkUgNAorI2RlZmluZSBORlNfRklGT19ERVYgLTEKKyNkZWZpbmUgTkZTTU9ERV9GTVQgMDE3MDAwMAorI2RlZmluZSBORlNNT0RFX0RJUiAwMDQwMDAwCisjZGVmaW5lIE5GU01PREVfQ0hSIDAwMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9CTEsgMDA2MDAwMAorI2RlZmluZSBORlNNT0RFX1JFRyAwMTAwMDAwCisjZGVmaW5lIE5GU01PREVfTE5LIDAxMjAwMDAKKyNkZWZpbmUgTkZTTU9ERV9TT0NLIDAxNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9GSUZPIDAwMTAwMDAKKworZW51bSBuZnNzdGF0IHsKKwlORlNfT0sgPSAwLAorCU5GU0VSUl9QRVJNID0gMSwKKwlORlNFUlJfTk9FTlQgPSAyLAorCU5GU0VSUl9JTyA9IDUsCisJTkZTRVJSX05YSU8gPSA2LAorCU5GU0VSUl9BQ0NFUyA9IDEzLAorCU5GU0VSUl9FWElTVCA9IDE3LAorCU5GU0VSUl9OT0RFViA9IDE5LAorCU5GU0VSUl9OT1RESVIgPSAyMCwKKwlORlNFUlJfSVNESVIgPSAyMSwKKwlORlNFUlJfRkJJRyA9IDI3LAorCU5GU0VSUl9OT1NQQyA9IDI4LAorCU5GU0VSUl9ST0ZTID0gMzAsCisJTkZTRVJSX05BTUVUT09MT05HID0gNjMsCisJTkZTRVJSX05PVEVNUFRZID0gNjYsCisJTkZTRVJSX0RRVU9UID0gNjksCisJTkZTRVJSX1NUQUxFID0gNzAsCisJTkZTRVJSX1dGTFVTSCA9IDk5LAorfTsKK3R5cGVkZWYgZW51bSBuZnNzdGF0IG5mc3N0YXQ7CisKK2VudW0gZnR5cGUgeworCU5GTk9OID0gMCwKKwlORlJFRyA9IDEsCisJTkZESVIgPSAyLAorCU5GQkxLID0gMywKKwlORkNIUiA9IDQsCisJTkZMTksgPSA1LAorCU5GU09DSyA9IDYsCisJTkZCQUQgPSA3LAorCU5GRklGTyA9IDgsCit9OwordHlwZWRlZiBlbnVtIGZ0eXBlIGZ0eXBlOworCitzdHJ1Y3QgbmZzX2ZoIHsKKwljaGFyIGRhdGFbTkZTX0ZIU0laRV07Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmZzX2ZoIG5mc19maDsKKworc3RydWN0IG5mc3RpbWUgeworCXVfaW50IHNlY29uZHM7CisJdV9pbnQgdXNlY29uZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmZzdGltZSBuZnN0aW1lOworCitzdHJ1Y3QgZmF0dHIgeworCWZ0eXBlIHR5cGU7CisJdV9pbnQgbW9kZTsKKwl1X2ludCBubGluazsKKwl1X2ludCB1aWQ7CisJdV9pbnQgZ2lkOworCXVfaW50IHNpemU7CisJdV9pbnQgYmxvY2tzaXplOworCXVfaW50IHJkZXY7CisJdV9pbnQgYmxvY2tzOworCXVfaW50IGZzaWQ7CisJdV9pbnQgZmlsZWlkOworCW5mc3RpbWUgYXRpbWU7CisJbmZzdGltZSBtdGltZTsKKwluZnN0aW1lIGN0aW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGZhdHRyIGZhdHRyOworCitzdHJ1Y3Qgc2F0dHIgeworCXVfaW50IG1vZGU7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwl1X2ludCBzaXplOworCW5mc3RpbWUgYXRpbWU7CisJbmZzdGltZSBtdGltZTsKK307Cit0eXBlZGVmIHN0cnVjdCBzYXR0ciBzYXR0cjsKKwordHlwZWRlZiBjaGFyICpmaWxlbmFtZTsKKwordHlwZWRlZiBjaGFyICpuZnNwYXRoOworCitzdHJ1Y3QgYXR0cnN0YXQgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJZmF0dHIgYXR0cmlidXRlczsKKwl9IGF0dHJzdGF0X3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYXR0cnN0YXQgYXR0cnN0YXQ7CisKK3N0cnVjdCBzYXR0cmFyZ3MgeworCW5mc19maCBmaWxlOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc2F0dHJhcmdzIHNhdHRyYXJnczsKKworc3RydWN0IGRpcm9wYXJncyB7CisJbmZzX2ZoIGRpcjsKKwlmaWxlbmFtZSBuYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wYXJncyBkaXJvcGFyZ3M7CisKK3N0cnVjdCBkaXJvcG9rcmVzIHsKKwluZnNfZmggZmlsZTsKKwlmYXR0ciBhdHRyaWJ1dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wb2tyZXMgZGlyb3Bva3JlczsKKworc3RydWN0IGRpcm9wcmVzIHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCWRpcm9wb2tyZXMgZGlyb3ByZXM7CisJfSBkaXJvcHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wcmVzIGRpcm9wcmVzOworCitzdHJ1Y3QgcmVhZGxpbmtyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJbmZzcGF0aCBkYXRhOworCX0gcmVhZGxpbmtyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkbGlua3JlcyByZWFkbGlua3JlczsKKworc3RydWN0IHJlYWRhcmdzIHsKKwluZnNfZmggZmlsZTsKKwl1X2ludCBvZmZzZXQ7CisJdV9pbnQgY291bnQ7CisJdV9pbnQgdG90YWxjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkYXJncyByZWFkYXJnczsKKworc3RydWN0IHJlYWRva3JlcyB7CisJZmF0dHIgYXR0cmlidXRlczsKKwlzdHJ1Y3QgeworCQl1X2ludCBkYXRhX2xlbjsKKwkJY2hhciAqZGF0YV92YWw7CisJfSBkYXRhOworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRva3JlcyByZWFkb2tyZXM7CisKK3N0cnVjdCByZWFkcmVzIHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCXJlYWRva3JlcyByZXBseTsKKwl9IHJlYWRyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkcmVzIHJlYWRyZXM7CisKK3N0cnVjdCB3cml0ZWFyZ3MgeworCW5mc19maCBmaWxlOworCXVfaW50IGJlZ2lub2Zmc2V0OworCXVfaW50IG9mZnNldDsKKwl1X2ludCB0b3RhbGNvdW50OworCXN0cnVjdCB7CisJCXVfaW50IGRhdGFfbGVuOworCQljaGFyICpkYXRhX3ZhbDsKKwl9IGRhdGE7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgd3JpdGVhcmdzIHdyaXRlYXJnczsKKworc3RydWN0IGNyZWF0ZWFyZ3MgeworCWRpcm9wYXJncyB3aGVyZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IGNyZWF0ZWFyZ3MgY3JlYXRlYXJnczsKKworc3RydWN0IHJlbmFtZWFyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCWRpcm9wYXJncyB0bzsKK307Cit0eXBlZGVmIHN0cnVjdCByZW5hbWVhcmdzIHJlbmFtZWFyZ3M7CisKK3N0cnVjdCBsaW5rYXJncyB7CisJbmZzX2ZoIGZyb207CisJZGlyb3BhcmdzIHRvOworfTsKK3R5cGVkZWYgc3RydWN0IGxpbmthcmdzIGxpbmthcmdzOworCitzdHJ1Y3Qgc3ltbGlua2FyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCW5mc3BhdGggdG87CisJc2F0dHIgYXR0cmlidXRlczsKK307Cit0eXBlZGVmIHN0cnVjdCBzeW1saW5rYXJncyBzeW1saW5rYXJnczsKKwordHlwZWRlZiBjaGFyIG5mc2Nvb2tpZVtORlNfQ09PS0lFU0laRV07CisKK3N0cnVjdCByZWFkZGlyYXJncyB7CisJbmZzX2ZoIGRpcjsKKwluZnNjb29raWUgY29va2llOworCXVfaW50IGNvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRkaXJhcmdzIHJlYWRkaXJhcmdzOworCitzdHJ1Y3QgZW50cnkgeworCXVfaW50IGZpbGVpZDsKKwlmaWxlbmFtZSBuYW1lOworCW5mc2Nvb2tpZSBjb29raWU7CisJc3RydWN0IGVudHJ5ICpuZXh0ZW50cnk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZW50cnkgZW50cnk7CisKK3N0cnVjdCBkaXJsaXN0IHsKKwllbnRyeSAqZW50cmllczsKKwlib29sX3QgZW9mOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcmxpc3QgZGlybGlzdDsKKworc3RydWN0IHJlYWRkaXJyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJZGlybGlzdCByZXBseTsKKwl9IHJlYWRkaXJyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkZGlycmVzIHJlYWRkaXJyZXM7CisKK3N0cnVjdCBzdGF0ZnNva3JlcyB7CisJdV9pbnQgdHNpemU7CisJdV9pbnQgYnNpemU7CisJdV9pbnQgYmxvY2tzOworCXVfaW50IGJmcmVlOworCXVfaW50IGJhdmFpbDsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0ZnNva3JlcyBzdGF0ZnNva3JlczsKKworc3RydWN0IHN0YXRmc3JlcyB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQlzdGF0ZnNva3JlcyByZXBseTsKKwl9IHN0YXRmc3Jlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRmc3JlcyBzdGF0ZnNyZXM7CisKKyNkZWZpbmUgTkZTX1BST0dSQU0gMTAwMDAzCisjZGVmaW5lIE5GU19WRVJTSU9OIDIKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5GU1BST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX251bGxfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2NfbnVsbF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0dFVEFUVFIgMQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKG5mc19maCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSIDIKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMihzYXR0cmFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfc2V0YXR0cl8yX3N2YyhzYXR0cmFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUk9PVCAzCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3Jvb3RfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0xPT0tVUCA0CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19sb29rdXBfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFETElOSyA1CitleHRlcm4gIHJlYWRsaW5rcmVzICogbmZzcHJvY19yZWFkbGlua18yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIHJlYWRsaW5rcmVzICogbmZzcHJvY19yZWFkbGlua18yX3N2YyhuZnNfZmggKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUkVBRCA2CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMihyZWFkYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMl9zdmMocmVhZGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfV1JJVEVDQUNIRSA3CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfd3JpdGVjYWNoZV8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1dSSVRFIDgKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3dyaXRlXzIod3JpdGVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3dyaXRlXzJfc3ZjKHdyaXRlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19DUkVBVEUgOQorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfY3JlYXRlXzIoY3JlYXRlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMl9zdmMoY3JlYXRlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU1PVkUgMTAKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzIoZGlyb3BhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgMTEKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzIocmVuYW1lYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbmFtZV8yX3N2YyhyZW5hbWVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX0xJTksgMTIKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfbGlua18yKGxpbmthcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfbGlua18yX3N2YyhsaW5rYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TWU1MSU5LIDEzCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMihzeW1saW5rYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoc3ltbGlua2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTUtESVIgMTQKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX21rZGlyXzIoY3JlYXRlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19ta2Rpcl8yX3N2YyhjcmVhdGVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JNRElSIDE1CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JtZGlyXzIoZGlyb3BhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMl9zdmMoZGlyb3BhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFQURESVIgMTYKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yKHJlYWRkaXJhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YyhyZWFkZGlyYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TVEFURlMgMTcKK2V4dGVybiAgc3RhdGZzcmVzICogbmZzcHJvY19zdGF0ZnNfMihuZnNfZmggKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdGF0ZnNyZXMgKiBuZnNwcm9jX3N0YXRmc18yX3N2YyhuZnNfZmggKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IG5mc19wcm9ncmFtXzJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBORlNQUk9DX05VTEwgMAorZXh0ZXJuICB2b2lkICogbmZzcHJvY19udWxsXzIoKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2NfbnVsbF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX0dFVEFUVFIgMQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKCk7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfU0VUQVRUUiAyCitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19zZXRhdHRyXzIoKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19ST09UIDMKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yKCk7CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3Jvb3RfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19MT09LVVAgNAorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzIoKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2xvb2t1cF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFQURMSU5LIDUKK2V4dGVybiAgcmVhZGxpbmtyZXMgKiBuZnNwcm9jX3JlYWRsaW5rXzIoKTsKK2V4dGVybiAgcmVhZGxpbmtyZXMgKiBuZnNwcm9jX3JlYWRsaW5rXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVBRCA2CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMigpOworZXh0ZXJuICByZWFkcmVzICogbmZzcHJvY19yZWFkXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfV1JJVEVDQUNIRSA3CitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMigpOworZXh0ZXJuICB2b2lkICogbmZzcHJvY193cml0ZWNhY2hlXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfV1JJVEUgOAorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfd3JpdGVfMigpOworZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfd3JpdGVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19DUkVBVEUgOQorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfY3JlYXRlXzIoKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2NyZWF0ZV8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFTU9WRSAxMAorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMigpOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgMTEKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVuYW1lXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfTElOSyAxMgorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfbGlua18yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1NZTUxJTksgMTMKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfc3ltbGlua18yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19NS0RJUiAxNAorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMigpOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19STURJUiAxNQorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19ybWRpcl8yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JtZGlyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVBRERJUiAxNgorZXh0ZXJuICByZWFkZGlycmVzICogbmZzcHJvY19yZWFkZGlyXzIoKTsKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1NUQVRGUyAxNworZXh0ZXJuICBzdGF0ZnNyZXMgKiBuZnNwcm9jX3N0YXRmc18yKCk7CitleHRlcm4gIHN0YXRmc3JlcyAqIG5mc3Byb2Nfc3RhdGZzXzJfc3ZjKCk7CitleHRlcm4gaW50IG5mc19wcm9ncmFtXzJfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNzdGF0IChYRFIgKiwgbmZzc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX2Z0eXBlIChYRFIgKiwgZnR5cGUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNfZmggKFhEUiAqLCBuZnNfZmgqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZnN0aW1lIChYRFIgKiwgbmZzdGltZSopOworZXh0ZXJuICBib29sX3QgeGRyX2ZhdHRyIChYRFIgKiwgZmF0dHIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zYXR0ciAoWERSICosIHNhdHRyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZmlsZW5hbWUgKFhEUiAqLCBmaWxlbmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX25mc3BhdGggKFhEUiAqLCBuZnNwYXRoKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfYXR0cnN0YXQgKFhEUiAqLCBhdHRyc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3NhdHRyYXJncyAoWERSICosIHNhdHRyYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2Rpcm9wYXJncyAoWERSICosIGRpcm9wYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX2Rpcm9wb2tyZXMgKFhEUiAqLCBkaXJvcG9rcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlyb3ByZXMgKFhEUiAqLCBkaXJvcHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3JlYWRsaW5rcmVzIChYRFIgKiwgcmVhZGxpbmtyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkYXJncyAoWERSICosIHJlYWRhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVhZG9rcmVzIChYRFIgKiwgcmVhZG9rcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmVhZHJlcyAoWERSICosIHJlYWRyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl93cml0ZWFyZ3MgKFhEUiAqLCB3cml0ZWFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9jcmVhdGVhcmdzIChYRFIgKiwgY3JlYXRlYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX3JlbmFtZWFyZ3MgKFhEUiAqLCByZW5hbWVhcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbGlua2FyZ3MgKFhEUiAqLCBsaW5rYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX3N5bWxpbmthcmdzIChYRFIgKiwgc3ltbGlua2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNjb29raWUgKFhEUiAqLCBuZnNjb29raWUpOworZXh0ZXJuICBib29sX3QgeGRyX3JlYWRkaXJhcmdzIChYRFIgKiwgcmVhZGRpcmFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9lbnRyeSAoWERSICosIGVudHJ5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZGlybGlzdCAoWERSICosIGRpcmxpc3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkZGlycmVzIChYRFIgKiwgcmVhZGRpcnJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXRmc29rcmVzIChYRFIgKiwgc3RhdGZzb2tyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0ZnNyZXMgKFhEUiAqLCBzdGF0ZnNyZXMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX25mc3N0YXQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9mdHlwZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc19maCAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc3RpbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9mYXR0ciAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NhdHRyICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZmlsZW5hbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9uZnNwYXRoICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfYXR0cnN0YXQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zYXR0cmFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJvcGFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJvcG9rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZGlyb3ByZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZWFkbGlua3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlYWRhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZG9rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZHJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3dyaXRlYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2NyZWF0ZWFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZW5hbWVhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbGlua2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zeW1saW5rYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25mc2Nvb2tpZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JlYWRkaXJhcmdzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZW50cnkgKCk7CitleHRlcm4gYm9vbF90IHhkcl9kaXJsaXN0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmVhZGRpcnJlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXRmc29rcmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdGZzcmVzICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfTkZTX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uZnNfcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGRhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uZnNfcHJvdC54CkBAIC0wLDAgKzEsMzU0IEBACisvKiBAKCMpbmZzX3Byb3QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIG5mc19wcm90LnggMS4yIDg3LzEwLzEyCisgKiBDb3B5cmlnaHQgMTk4NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KK2NvbnN0IE5GU19QT1JUICAgICAgICAgID0gMjA0OTsKK2NvbnN0IE5GU19NQVhEQVRBICAgICAgID0gODE5MjsKK2NvbnN0IE5GU19NQVhQQVRITEVOICAgID0gMTAyNDsKK2NvbnN0IE5GU19NQVhOQU1MRU4JPSAyNTU7Citjb25zdCBORlNfRkhTSVpFCT0gMzI7Citjb25zdCBORlNfQ09PS0lFU0laRQk9IDQ7Citjb25zdCBORlNfRklGT19ERVYJPSAtMTsJLyogc2l6ZSBrbHVkZ2UgZm9yIG5hbWVkIHBpcGVzICovCisKKy8qCisgKiBGaWxlIHR5cGVzCisgKi8KK2NvbnN0IE5GU01PREVfRk1UICA9IDAxNzAwMDA7CS8qIHR5cGUgb2YgZmlsZSAqLworY29uc3QgTkZTTU9ERV9ESVIgID0gMDA0MDAwMDsJLyogZGlyZWN0b3J5ICovCitjb25zdCBORlNNT0RFX0NIUiAgPSAwMDIwMDAwOwkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworY29uc3QgTkZTTU9ERV9CTEsgID0gMDA2MDAwMDsJLyogYmxvY2sgc3BlY2lhbCAqLworY29uc3QgTkZTTU9ERV9SRUcgID0gMDEwMDAwMDsJLyogcmVndWxhciAqLworY29uc3QgTkZTTU9ERV9MTksgID0gMDEyMDAwMDsJLyogc3ltYm9saWMgbGluayAqLworY29uc3QgTkZTTU9ERV9TT0NLID0gMDE0MDAwMDsJLyogc29ja2V0ICovCitjb25zdCBORlNNT0RFX0ZJRk8gPSAwMDEwMDAwOwkvKiBmaWZvICovCisKKy8qCisgKiBFcnJvciBzdGF0dXMKKyAqLworZW51bSBuZnNzdGF0IHsKKwlORlNfT0s9IDAsCQkvKiBubyBlcnJvciAqLworCU5GU0VSUl9QRVJNPTEsCQkvKiBOb3Qgb3duZXIgKi8KKwlORlNFUlJfTk9FTlQ9MiwJCS8qIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKwlORlNFUlJfSU89NSwJCS8qIEkvTyBlcnJvciAqLworCU5GU0VSUl9OWElPPTYsCQkvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzICovCisJTkZTRVJSX0FDQ0VTPTEzLAkvKiBQZXJtaXNzaW9uIGRlbmllZCAqLworCU5GU0VSUl9FWElTVD0xNywJLyogRmlsZSBleGlzdHMgKi8KKwlORlNFUlJfTk9ERVY9MTksCS8qIE5vIHN1Y2ggZGV2aWNlICovCisJTkZTRVJSX05PVERJUj0yMCwJLyogTm90IGEgZGlyZWN0b3J5Ki8KKwlORlNFUlJfSVNESVI9MjEsCS8qIElzIGEgZGlyZWN0b3J5ICovCisJTkZTRVJSX0ZCSUc9MjcsCQkvKiBGaWxlIHRvbyBsYXJnZSAqLworCU5GU0VSUl9OT1NQQz0yOCwJLyogTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UgKi8KKwlORlNFUlJfUk9GUz0zMCwJCS8qIFJlYWQtb25seSBmaWxlIHN5c3RlbSAqLworCU5GU0VSUl9OQU1FVE9PTE9ORz02MywJLyogRmlsZSBuYW1lIHRvbyBsb25nICovCisJTkZTRVJSX05PVEVNUFRZPTY2LAkvKiBEaXJlY3Rvcnkgbm90IGVtcHR5ICovCisJTkZTRVJSX0RRVU9UPTY5LAkvKiBEaXNjIHF1b3RhIGV4Y2VlZGVkICovCisJTkZTRVJSX1NUQUxFPTcwLAkvKiBTdGFsZSBORlMgZmlsZSBoYW5kbGUgKi8KKwlORlNFUlJfV0ZMVVNIPTk5CS8qIHdyaXRlIGNhY2hlIGZsdXNoZWQgKi8KK307CisKKy8qCisgKiBGaWxlIHR5cGVzCisgKi8KK2VudW0gZnR5cGUgeworCU5GTk9OID0gMCwJLyogbm9uLWZpbGUgKi8KKwlORlJFRyA9IDEsCS8qIHJlZ3VsYXIgZmlsZSAqLworCU5GRElSID0gMiwJLyogZGlyZWN0b3J5ICovCisJTkZCTEsgPSAzLAkvKiBibG9jayBzcGVjaWFsICovCisJTkZDSFIgPSA0LAkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworCU5GTE5LID0gNSwJLyogc3ltYm9saWMgbGluayAqLworCU5GU09DSyA9IDYsCS8qIHVuaXggZG9tYWluIHNvY2tldHMgKi8KKwlORkJBRCA9IDcsCS8qIHVudXNlZCAqLworCU5GRklGTyA9IDggCS8qIG5hbWVkIHBpcGUgKi8KK307CisKKy8qCisgKiBGaWxlIGFjY2VzcyBoYW5kbGUKKyAqLworc3RydWN0IG5mc19maCB7CisJb3BhcXVlIGRhdGFbTkZTX0ZIU0laRV07Cit9OworCisvKgorICogVGltZXZhbAorICovCitzdHJ1Y3QgbmZzdGltZSB7CisJdW5zaWduZWQgc2Vjb25kczsKKwl1bnNpZ25lZCB1c2Vjb25kczsKK307CisKKworLyoKKyAqIEZpbGUgYXR0cmlidXRlcworICovCitzdHJ1Y3QgZmF0dHIgeworCWZ0eXBlIHR5cGU7CQkvKiBmaWxlIHR5cGUgKi8KKwl1bnNpZ25lZCBtb2RlOwkJLyogcHJvdGVjdGlvbiBtb2RlIGJpdHMgKi8KKwl1bnNpZ25lZCBubGluazsJCS8qICMgaGFyZCBsaW5rcyAqLworCXVuc2lnbmVkIHVpZDsJCS8qIG93bmVyIHVzZXIgaWQgKi8KKwl1bnNpZ25lZCBnaWQ7CQkvKiBvd25lciBncm91cCBpZCAqLworCXVuc2lnbmVkIHNpemU7CQkvKiBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBibG9ja3NpemU7CS8qIHByZWZlcnJlZCBibG9jayBzaXplICovCisJdW5zaWduZWQgcmRldjsJCS8qIHNwZWNpYWwgZGV2aWNlICMgKi8KKwl1bnNpZ25lZCBibG9ja3M7CS8qIEtiIG9mIGRpc2sgdXNlZCBieSBmaWxlICovCisJdW5zaWduZWQgZnNpZDsJCS8qIGRldmljZSAjICovCisJdW5zaWduZWQgZmlsZWlkOwkvKiBpbm9kZSAjICovCisJbmZzdGltZQlhdGltZTsJCS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KKwluZnN0aW1lCW10aW1lOwkJLyogdGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiAqLworCW5mc3RpbWUJY3RpbWU7CQkvKiB0aW1lIG9mIGxhc3QgY2hhbmdlICovCit9OworCisvKgorICogRmlsZSBhdHRyaWJ1dGVzIHdoaWNoIGNhbiBiZSBzZXQKKyAqLworc3RydWN0IHNhdHRyIHsKKwl1bnNpZ25lZCBtb2RlOwkvKiBwcm90ZWN0aW9uIG1vZGUgYml0cyAqLworCXVuc2lnbmVkIHVpZDsJLyogb3duZXIgdXNlciBpZCAqLworCXVuc2lnbmVkIGdpZDsJLyogb3duZXIgZ3JvdXAgaWQgKi8KKwl1bnNpZ25lZCBzaXplOwkvKiBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwluZnN0aW1lCWF0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJbmZzdGltZQltdGltZTsJLyogdGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiAqLworfTsKKworCit0eXBlZGVmIHN0cmluZyBmaWxlbmFtZTxORlNfTUFYTkFNTEVOPjsKK3R5cGVkZWYgc3RyaW5nIG5mc3BhdGg8TkZTX01BWFBBVEhMRU4+OworCisvKgorICogUmVwbHkgc3RhdHVzIHdpdGggZmlsZSBhdHRyaWJ1dGVzCisgKi8KK3VuaW9uIGF0dHJzdGF0IHN3aXRjaCAobmZzc3RhdCBzdGF0dXMpIHsKK2Nhc2UgTkZTX09LOgorCWZhdHRyIGF0dHJpYnV0ZXM7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCitzdHJ1Y3Qgc2F0dHJhcmdzIHsKKwluZnNfZmggZmlsZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKKworLyoKKyAqIEFyZ3VtZW50cyBmb3IgZGlyZWN0b3J5IG9wZXJhdGlvbnMKKyAqLworc3RydWN0IGRpcm9wYXJncyB7CisJbmZzX2ZoCWRpcjsJLyogZGlyZWN0b3J5IGZpbGUgaGFuZGxlICovCisJZmlsZW5hbWUgbmFtZTsJCS8qIG5hbWUgKHVwIHRvIE5GU19NQVhOQU1MRU4gYnl0ZXMpICovCit9OworCitzdHJ1Y3QgZGlyb3Bva3JlcyB7CisJbmZzX2ZoIGZpbGU7CisJZmF0dHIgYXR0cmlidXRlczsKK307CisKKy8qCisgKiBSZXN1bHRzIGZyb20gZGlyZWN0b3J5IG9wZXJhdGlvbgorICovCit1bmlvbiBkaXJvcHJlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlkaXJvcG9rcmVzIGRpcm9wcmVzOworZGVmYXVsdDoKKwl2b2lkOworfTsKKwordW5pb24gcmVhZGxpbmtyZXMgc3dpdGNoIChuZnNzdGF0IHN0YXR1cykgeworY2FzZSBORlNfT0s6CisJbmZzcGF0aCBkYXRhOworZGVmYXVsdDoKKwl2b2lkOworfTsKKworLyoKKyAqIEFyZ3VtZW50cyB0byByZW1vdGUgcmVhZAorICovCitzdHJ1Y3QgcmVhZGFyZ3MgeworCW5mc19maCBmaWxlOwkJLyogaGFuZGxlIGZvciBmaWxlICovCisJdW5zaWduZWQgb2Zmc2V0OwkvKiBieXRlIG9mZnNldCBpbiBmaWxlICovCisJdW5zaWduZWQgY291bnQ7CQkvKiBpbW1lZGlhdGUgcmVhZCBjb3VudCAqLworCXVuc2lnbmVkIHRvdGFsY291bnQ7CS8qIHRvdGFsIHJlYWQgY291bnQgKGZyb20gdGhpcyBvZmZzZXQpKi8KK307CisKKy8qCisgKiBTdGF0dXMgT0sgcG9ydGlvbiBvZiByZW1vdGUgcmVhZCByZXBseQorICovCitzdHJ1Y3QgcmVhZG9rcmVzIHsKKwlmYXR0cglhdHRyaWJ1dGVzOwkvKiBhdHRyaWJ1dGVzLCBuZWVkIGZvciBwYWdpbiovCisJb3BhcXVlIGRhdGE8TkZTX01BWERBVEE+OworfTsKKwordW5pb24gcmVhZHJlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlyZWFkb2tyZXMgcmVwbHk7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCisvKgorICogQXJndW1lbnRzIHRvIHJlbW90ZSB3cml0ZQorICovCitzdHJ1Y3Qgd3JpdGVhcmdzIHsKKwluZnNfZmgJZmlsZTsJCS8qIGhhbmRsZSBmb3IgZmlsZSAqLworCXVuc2lnbmVkIGJlZ2lub2Zmc2V0OwkvKiBiZWdpbm5pbmcgYnl0ZSBvZmZzZXQgaW4gZmlsZSAqLworCXVuc2lnbmVkIG9mZnNldDsJLyogY3VycmVudCBieXRlIG9mZnNldCBpbiBmaWxlICovCisJdW5zaWduZWQgdG90YWxjb3VudDsJLyogdG90YWwgd3JpdGUgY291bnQgKHRvIHRoaXMgb2Zmc2V0KSovCisJb3BhcXVlIGRhdGE8TkZTX01BWERBVEE+OworfTsKKworc3RydWN0IGNyZWF0ZWFyZ3MgeworCWRpcm9wYXJncyB3aGVyZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKKworc3RydWN0IHJlbmFtZWFyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCWRpcm9wYXJncyB0bzsKK307CisKK3N0cnVjdCBsaW5rYXJncyB7CisJbmZzX2ZoIGZyb207CisJZGlyb3BhcmdzIHRvOworfTsKKworc3RydWN0IHN5bWxpbmthcmdzIHsKKwlkaXJvcGFyZ3MgZnJvbTsKKwluZnNwYXRoIHRvOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OworCisKK3R5cGVkZWYgb3BhcXVlIG5mc2Nvb2tpZVtORlNfQ09PS0lFU0laRV07CisKKy8qCisgKiBBcmd1bWVudHMgdG8gcmVhZGRpcgorICovCitzdHJ1Y3QgcmVhZGRpcmFyZ3MgeworCW5mc19maCBkaXI7CQkvKiBkaXJlY3RvcnkgaGFuZGxlICovCisJbmZzY29va2llIGNvb2tpZTsKKwl1bnNpZ25lZCBjb3VudDsJCS8qIG51bWJlciBvZiBkaXJlY3RvcnkgYnl0ZXMgdG8gcmVhZCAqLworfTsKKworc3RydWN0IGVudHJ5IHsKKwl1bnNpZ25lZCBmaWxlaWQ7CisJZmlsZW5hbWUgbmFtZTsKKwluZnNjb29raWUgY29va2llOworCWVudHJ5ICpuZXh0ZW50cnk7Cit9OworCitzdHJ1Y3QgZGlybGlzdCB7CisJZW50cnkgKmVudHJpZXM7CisJYm9vbCBlb2Y7Cit9OworCit1bmlvbiByZWFkZGlycmVzIHN3aXRjaCAobmZzc3RhdCBzdGF0dXMpIHsKK2Nhc2UgTkZTX09LOgorCWRpcmxpc3QgcmVwbHk7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCitzdHJ1Y3Qgc3RhdGZzb2tyZXMgeworCXVuc2lnbmVkIHRzaXplOwkvKiBwcmVmZXJyZWQgdHJhbnNmZXIgc2l6ZSBpbiBieXRlcyAqLworCXVuc2lnbmVkIGJzaXplOwkvKiBmdW5kYW1lbnRhbCBmaWxlIHN5c3RlbSBibG9jayBzaXplICovCisJdW5zaWduZWQgYmxvY2tzOwkvKiB0b3RhbCBibG9ja3MgaW4gZmlsZSBzeXN0ZW0gKi8KKwl1bnNpZ25lZCBiZnJlZTsJLyogZnJlZSBibG9ja3MgaW4gZnMgKi8KKwl1bnNpZ25lZCBiYXZhaWw7CS8qIGZyZWUgYmxvY2tzIGF2YWlsIHRvIG5vbi1zdXBlcnVzZXIgKi8KK307CisKK3VuaW9uIHN0YXRmc3JlcyBzd2l0Y2ggKG5mc3N0YXQgc3RhdHVzKSB7CitjYXNlIE5GU19PSzoKKwlzdGF0ZnNva3JlcyByZXBseTsKK2RlZmF1bHQ6CisJdm9pZDsKK307CisKKy8qCisgKiBSZW1vdGUgZmlsZSBzZXJ2aWNlIHJvdXRpbmVzCisgKi8KK3Byb2dyYW0gTkZTX1BST0dSQU0geworCXZlcnNpb24gTkZTX1ZFUlNJT04geworCQl2b2lkCisJCU5GU1BST0NfTlVMTCh2b2lkKSA9IDA7CisKKwkJYXR0cnN0YXQKKwkJTkZTUFJPQ19HRVRBVFRSKG5mc19maCkgPQkxOworCisJCWF0dHJzdGF0CisJCU5GU1BST0NfU0VUQVRUUihzYXR0cmFyZ3MpID0gMjsKKworCQl2b2lkCisJCU5GU1BST0NfUk9PVCh2b2lkKSA9IDM7CisKKwkJZGlyb3ByZXMKKwkJTkZTUFJPQ19MT09LVVAoZGlyb3BhcmdzKSA9IDQ7CisKKwkJcmVhZGxpbmtyZXMKKwkJTkZTUFJPQ19SRUFETElOSyhuZnNfZmgpID0gNTsKKworCQlyZWFkcmVzCisJCU5GU1BST0NfUkVBRChyZWFkYXJncykgPSA2OworCisJCXZvaWQKKwkJTkZTUFJPQ19XUklURUNBQ0hFKHZvaWQpID0gNzsKKworCQlhdHRyc3RhdAorCQlORlNQUk9DX1dSSVRFKHdyaXRlYXJncykgPSA4OworCisJCWRpcm9wcmVzCisJCU5GU1BST0NfQ1JFQVRFKGNyZWF0ZWFyZ3MpID0gOTsKKworCQluZnNzdGF0CisJCU5GU1BST0NfUkVNT1ZFKGRpcm9wYXJncykgPSAxMDsKKworCQluZnNzdGF0CisJCU5GU1BST0NfUkVOQU1FKHJlbmFtZWFyZ3MpID0gMTE7CisKKwkJbmZzc3RhdAorCQlORlNQUk9DX0xJTksobGlua2FyZ3MpID0gMTI7CisKKwkJbmZzc3RhdAorCQlORlNQUk9DX1NZTUxJTksoc3ltbGlua2FyZ3MpID0gMTM7CisKKwkJZGlyb3ByZXMKKwkJTkZTUFJPQ19NS0RJUihjcmVhdGVhcmdzKSA9IDE0OworCisJCW5mc3N0YXQKKwkJTkZTUFJPQ19STURJUihkaXJvcGFyZ3MpID0gMTU7CisKKwkJcmVhZGRpcnJlcworCQlORlNQUk9DX1JFQURESVIocmVhZGRpcmFyZ3MpID0gMTY7CisKKwkJc3RhdGZzcmVzCisJCU5GU1BST0NfU1RBVEZTKG5mc19maCkgPSAxNzsKKwl9ID0gMjsKK30gPSAxMDAwMDM7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OTU0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXMuaApAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyIG9yIHdpdGggdGhlIGV4cHJlc3Mgd3JpdHRlbiBjb25zZW50IG9mCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworI2lmbmRlZiBfUlBDU1ZDX05JU19ICisjZGVmaW5lIF9SUENTVkNfTklTX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjc3ZjL25pc190YWdzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqCW5pcy5oCisgKgorICoJVGhpcyBmaWxlIGlzIHRoZSBtYWluIGluY2x1ZGUgZmlsZSBmb3IgTklTIGNsaWVudHMuIEl0IGNvbnRhaW5zCisgKglib3RoIHRoZSBjbGllbnQgbGlicmFyeSBmdW5jdGlvbiBkZWZpbmVzIGFuZCB0aGUgdmFyaW91cyBkYXRhCisgKiAJc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBOSVMgc2VydmljZS4gSXQgaW5jbHVkZXMgdGhlIGZpbGUgbmlzX3RhZ3MuaAorICoJd2hpY2ggZGVmaW5lcyB0aGUgdGFnIHZhbHVlcy4gVGhpcyBhbGxvd3MgdGhlIHRhZ3MgdG8gY2hhbmdlIHdpdGhvdXQKKyAqCWhhdmluZyB0byBjaGFuZ2UgdGhlIG5pcy54IGZpbGUuCisgKgorICoJTk9URSA6IFRISVMgRklMRSBJUyBOT1QgR0VORVJBVEVEIFdJVEggUlBDR0VOICEgU08gWU9VIEhBVkUgVE8KKyAqICAgICAgICAgICAgIEFERCBBTEwgVEhFIENIQU5HRVMgT04gbmlzXyoueCBGSUxFUyBIRVJFIEFHQUlOICEKKyAqCisgKiAgICAgIEkgaGF2ZSByZW1vdmVkIGFsbCB0aGUgU29sYXJpcyBpbnRlcm5hbCBzdHJ1Y3RzIGFuZCB2YXJpYWJsZXMsCisgKiAgICAgIGJlY2F1c2UgdGhleSBhcmUgbm90IHN1cHBvcnRlZCwgU3VuIGNoYW5nZWQgdGhlbSBiZXR3ZWVuIHZhcmlvdXMKKyAqICAgICAgcmVsZWFzZXMgYW5kIHRoZXkgc2hvdWxkbid0IGJlIHVzZWQgaW4gdXNlciBwcm9ncmFtcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxrdWt1a0BzdXNlLmRlPgorICovCisKKworI2lmbmRlZiBfX25pc19vYmplY3RfaAorI2RlZmluZSBfX25pc19vYmplY3RfaAorCisjZGVmaW5lIE5JU19NQVhTVFJJTkdMRU4gMjU1CisjZGVmaW5lIE5JU19NQVhOQU1FTEVOIDEwMjQKKyNkZWZpbmUgTklTX01BWEFUVFJOQU1FIDMyCisjZGVmaW5lIE5JU19NQVhBVFRSVkFMIDIwNDgKKyNkZWZpbmUgTklTX01BWENPTFVNTlMgNjQKKyNkZWZpbmUgTklTX01BWEFUVFIgMTYKKyNkZWZpbmUgTklTX01BWFBBVEggMTAyNAorI2RlZmluZSBOSVNfTUFYUkVQTElDQVMgMTI4CisjZGVmaW5lIE5JU19NQVhMSU5LUyAxNgorI2RlZmluZSBOSVNfUEtfTk9ORSAwCisjZGVmaW5lIE5JU19QS19ESCAxCisjZGVmaW5lIE5JU19QS19SU0EgMgorI2RlZmluZSBOSVNfUEtfS0VSQiAzCisjZGVmaW5lIE5JU19QS19ESEVYVCA0CisKK3N0cnVjdCBuaXNfYXR0ciB7CisJY2hhciAqemF0dHJfbmR4OworCXN0cnVjdCB7CisJCXVfaW50IHphdHRyX3ZhbF9sZW47CisJCWNoYXIgKnphdHRyX3ZhbF92YWw7CisJfSB6YXR0cl92YWw7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2F0dHIgbmlzX2F0dHI7CisKK3R5cGVkZWYgY2hhciAqbmlzX25hbWU7CisKK2VudW0gem90eXBlcyB7CisJQk9HVVNfT0JKID0gMCwKKwlOT19PQkogPSAxLAorCURJUkVDVE9SWV9PQkogPSAyLAorCUdST1VQX09CSiA9IDMsCisJVEFCTEVfT0JKID0gNCwKKwlFTlRSWV9PQkogPSA1LAorCUxJTktfT0JKID0gNiwKKwlQUklWQVRFX09CSiA9IDcsCisJTklTX0JPR1VTX09CSiA9IDAsCisJTklTX05PX09CSiA9IDEsCisJTklTX0RJUkVDVE9SWV9PQkogPSAyLAorCU5JU19HUk9VUF9PQkogPSAzLAorCU5JU19UQUJMRV9PQkogPSA0LAorCU5JU19FTlRSWV9PQkogPSA1LAorCU5JU19MSU5LX09CSiA9IDYsCisJTklTX1BSSVZBVEVfT0JKID0gNworfTsKK3R5cGVkZWYgZW51bSB6b3R5cGVzIHpvdHlwZXM7CisKK2VudW0gbnN0eXBlIHsKKwlVTktOT1dOID0gMCwKKwlOSVMgPSAxLAorCVNVTllQID0gMiwKKwlJVlkgPSAzLAorCUROUyA9IDQsCisJWDUwMCA9IDUsCisJRE5BTlMgPSA2LAorCVhDSFMgPSA3LAorCUNEUyA9IDgsCit9OwordHlwZWRlZiBlbnVtIG5zdHlwZSBuc3R5cGU7CisKK3N0cnVjdCBvYXJfbWFzayB7CisgICAgICAgIHVpbnQzMl90IG9hX3JpZ2h0czsKKyAgICAgICAgem90eXBlcyBvYV9vdHlwZTsKK307Cit0eXBlZGVmIHN0cnVjdCBvYXJfbWFzayBvYXJfbWFzazsKKworc3RydWN0IGVuZHBvaW50IHsKKwljaGFyICp1YWRkcjsKKwljaGFyICpmYW1pbHk7CisJY2hhciAqcHJvdG87Cit9OwordHlwZWRlZiBzdHJ1Y3QgZW5kcG9pbnQgZW5kcG9pbnQ7CisKK3N0cnVjdCBuaXNfc2VydmVyIHsKKwluaXNfbmFtZSBuYW1lOworCXN0cnVjdCB7CisJCXVfaW50IGVwX2xlbjsKKwkJZW5kcG9pbnQgKmVwX3ZhbDsKKwl9IGVwOworCXVpbnQzMl90IGtleV90eXBlOworCW5ldG9iaiBwa2V5OworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19zZXJ2ZXIgbmlzX3NlcnZlcjsKKworc3RydWN0IGRpcmVjdG9yeV9vYmogeworCW5pc19uYW1lIGRvX25hbWU7CisJbnN0eXBlIGRvX3R5cGU7CisJc3RydWN0IHsKKwkJdV9pbnQgZG9fc2VydmVyc19sZW47CisJCW5pc19zZXJ2ZXIgKmRvX3NlcnZlcnNfdmFsOworCX0gZG9fc2VydmVyczsKKwl1aW50MzJfdCBkb190dGw7CisJc3RydWN0IHsKKwkJdV9pbnQgZG9fYXJtYXNrX2xlbjsKKwkJb2FyX21hc2sgKmRvX2FybWFza192YWw7CisJfSBkb19hcm1hc2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGlyZWN0b3J5X29iaiBkaXJlY3Rvcnlfb2JqOworCisjZGVmaW5lIEVOX0JJTkFSWSAxCisjZGVmaW5lIEVOX0NSWVBUIDIKKyNkZWZpbmUgRU5fWERSIDQKKyNkZWZpbmUgRU5fTU9ESUZJRUQgOAorI2RlZmluZSBFTl9BU04xIDY0CisKK3N0cnVjdCBlbnRyeV9jb2wgeworCXVpbnQzMl90IGVjX2ZsYWdzOworCXN0cnVjdCB7CisJCXVfaW50IGVjX3ZhbHVlX2xlbjsKKwkJY2hhciAqZWNfdmFsdWVfdmFsOworCX0gZWNfdmFsdWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZW50cnlfY29sIGVudHJ5X2NvbDsKKworc3RydWN0IGVudHJ5X29iaiB7CisJY2hhciAqZW5fdHlwZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBlbl9jb2xzX2xlbjsKKwkJZW50cnlfY29sICplbl9jb2xzX3ZhbDsKKwl9IGVuX2NvbHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZW50cnlfb2JqIGVudHJ5X29iajsKKworc3RydWN0IGdyb3VwX29iaiB7CisJdWludDMyX3QgZ3JfZmxhZ3M7CisJc3RydWN0IHsKKwkJdV9pbnQgZ3JfbWVtYmVyc19sZW47CisJCW5pc19uYW1lICpncl9tZW1iZXJzX3ZhbDsKKwl9IGdyX21lbWJlcnM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBfb2JqIGdyb3VwX29iajsKKworc3RydWN0IGxpbmtfb2JqIHsKKwl6b3R5cGVzIGxpX3J0eXBlOworCXN0cnVjdCB7CisJCXVfaW50IGxpX2F0dHJzX2xlbjsKKwkJbmlzX2F0dHIgKmxpX2F0dHJzX3ZhbDsKKwl9IGxpX2F0dHJzOworCW5pc19uYW1lIGxpX25hbWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbGlua19vYmogbGlua19vYmo7CisKKyNkZWZpbmUgVEFfQklOQVJZIDEKKyNkZWZpbmUgVEFfQ1JZUFQgMgorI2RlZmluZSBUQV9YRFIgNAorI2RlZmluZSBUQV9TRUFSQ0hBQkxFIDgKKyNkZWZpbmUgVEFfQ0FTRSAxNgorI2RlZmluZSBUQV9NT0RJRklFRCAzMgorI2RlZmluZSBUQV9BU04xIDY0CisKK3N0cnVjdCB0YWJsZV9jb2wgeworCWNoYXIgKnRjX25hbWU7CisJdWludDMyX3QgdGNfZmxhZ3M7CisJdWludDMyX3QgdGNfcmlnaHRzOworfTsKK3R5cGVkZWYgc3RydWN0IHRhYmxlX2NvbCB0YWJsZV9jb2w7CisKK3N0cnVjdCB0YWJsZV9vYmogeworCWNoYXIgKnRhX3R5cGU7CisJaW50IHRhX21heGNvbDsKKwl1X2NoYXIgdGFfc2VwOworCXN0cnVjdCB7CisJCXVfaW50IHRhX2NvbHNfbGVuOworCQl0YWJsZV9jb2wgKnRhX2NvbHNfdmFsOworCX0gdGFfY29sczsKKwljaGFyICp0YV9wYXRoOworfTsKK3R5cGVkZWYgc3RydWN0IHRhYmxlX29iaiB0YWJsZV9vYmo7CisKK3N0cnVjdCBvYmpkYXRhIHsKKwl6b3R5cGVzIHpvX3R5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgZGlyZWN0b3J5X29iaiBkaV9kYXRhOworCQlzdHJ1Y3QgZ3JvdXBfb2JqIGdyX2RhdGE7CisJCXN0cnVjdCB0YWJsZV9vYmogdGFfZGF0YTsKKwkJc3RydWN0IGVudHJ5X29iaiBlbl9kYXRhOworCQlzdHJ1Y3QgbGlua19vYmogbGlfZGF0YTsKKwkJc3RydWN0IHsKKwkJCXVfaW50IHBvX2RhdGFfbGVuOworCQkJY2hhciAqcG9fZGF0YV92YWw7CisJCX0gcG9fZGF0YTsKKwl9IG9iamRhdGFfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBvYmpkYXRhIG9iamRhdGE7CisKK3N0cnVjdCBuaXNfb2lkIHsKKwl1aW50MzJfdCBjdGltZTsKKwl1aW50MzJfdCBtdGltZTsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfb2lkIG5pc19vaWQ7CisKK3N0cnVjdCBuaXNfb2JqZWN0IHsKKwluaXNfb2lkIHpvX29pZDsKKwluaXNfbmFtZSB6b19uYW1lOworCW5pc19uYW1lIHpvX293bmVyOworCW5pc19uYW1lIHpvX2dyb3VwOworCW5pc19uYW1lIHpvX2RvbWFpbjsKKwl1aW50MzJfdCB6b19hY2Nlc3M7CisJdWludDMyX3Qgem9fdHRsOworCW9iamRhdGEgem9fZGF0YTsKK307Cit0eXBlZGVmIHN0cnVjdCBuaXNfb2JqZWN0IG5pc19vYmplY3Q7CisKKyNlbmRpZiAvKiBpZiBfX25pc19vYmplY3RfaCAqLworCitlbnVtIG5pc19lcnJvciB7CisJTklTX1NVQ0NFU1MgPSAwLAorCU5JU19TX1NVQ0NFU1MgPSAxLAorCU5JU19OT1RGT1VORCA9IDIsCisJTklTX1NfTk9URk9VTkQgPSAzLAorCU5JU19DQUNIRUVYUElSRUQgPSA0LAorCU5JU19OQU1FVU5SRUFDSEFCTEUgPSA1LAorCU5JU19VTktOT1dOT0JKID0gNiwKKwlOSVNfVFJZQUdBSU4gPSA3LAorCU5JU19TWVNURU1FUlJPUiA9IDgsCisJTklTX0NIQUlOQlJPS0VOID0gOSwKKwlOSVNfUEVSTUlTU0lPTiA9IDEwLAorCU5JU19OT1RPV05FUiA9IDExLAorCU5JU19OT1RfTUUgPSAxMiwKKwlOSVNfTk9NRU1PUlkgPSAxMywKKwlOSVNfTkFNRUVYSVNUUyA9IDE0LAorCU5JU19OT1RNQVNURVIgPSAxNSwKKwlOSVNfSU5WQUxJRE9CSiA9IDE2LAorCU5JU19CQUROQU1FID0gMTcsCisJTklTX05PQ0FMTEJBQ0sgPSAxOCwKKwlOSVNfQ0JSRVNVTFRTID0gMTksCisJTklTX05PU1VDSE5BTUUgPSAyMCwKKwlOSVNfTk9UVU5JUVVFID0gMjEsCisJTklTX0lCTU9ERVJST1IgPSAyMiwKKwlOSVNfTk9TVUNIVEFCTEUgPSAyMywKKwlOSVNfVFlQRU1JU01BVENIID0gMjQsCisJTklTX0xJTktOQU1FRVJST1IgPSAyNSwKKwlOSVNfUEFSVElBTCA9IDI2LAorCU5JU19UT09NQU5ZQVRUUlMgPSAyNywKKwlOSVNfUlBDRVJST1IgPSAyOCwKKwlOSVNfQkFEQVRUUklCVVRFID0gMjksCisJTklTX05PVFNFQVJDSEFCTEUgPSAzMCwKKwlOSVNfQ0JFUlJPUiA9IDMxLAorCU5JU19GT1JFSUdOTlMgPSAzMiwKKwlOSVNfQkFET0JKRUNUID0gMzMsCisJTklTX05PVFNBTUVPQkogPSAzNCwKKwlOSVNfTU9ERkFJTCA9IDM1LAorCU5JU19CQURSRVFVRVNUID0gMzYsCisJTklTX05PVEVNUFRZID0gMzcsCisJTklTX0NPTERTVEFSVF9FUlIgPSAzOCwKKwlOSVNfUkVTWU5DID0gMzksCisJTklTX0ZBSUwgPSA0MCwKKwlOSVNfVU5BVkFJTCA9IDQxLAorCU5JU19SRVMyQklHID0gNDIsCisJTklTX1NSVkFVVEggPSA0MywKKwlOSVNfQ0xOVEFVVEggPSA0NCwKKwlOSVNfTk9GSUxFU1BBQ0UgPSA0NSwKKwlOSVNfTk9QUk9DID0gNDYsCisJTklTX0RVTVBMQVRFUiA9IDQ3LAorfTsKK3R5cGVkZWYgZW51bSBuaXNfZXJyb3IgbmlzX2Vycm9yOworCitzdHJ1Y3QgbmlzX3Jlc3VsdCB7CisJbmlzX2Vycm9yIHN0YXR1czsKKwlzdHJ1Y3QgeworCQl1X2ludCBvYmplY3RzX2xlbjsKKwkJbmlzX29iamVjdCAqb2JqZWN0c192YWw7CisJfSBvYmplY3RzOworCW5ldG9iaiBjb29raWU7CisJdWludDMyX3QgenRpY2tzOworCXVpbnQzMl90IGR0aWNrczsKKwl1aW50MzJfdCBhdGlja3M7CisJdWludDMyX3QgY3RpY2tzOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19yZXN1bHQgbmlzX3Jlc3VsdDsKKworc3RydWN0IG5zX3JlcXVlc3QgeworCW5pc19uYW1lIG5zX25hbWU7CisJc3RydWN0IHsKKwkJdV9pbnQgbnNfb2JqZWN0X2xlbjsKKwkJbmlzX29iamVjdCAqbnNfb2JqZWN0X3ZhbDsKKwl9IG5zX29iamVjdDsKK307Cit0eXBlZGVmIHN0cnVjdCBuc19yZXF1ZXN0IG5zX3JlcXVlc3Q7CisKK3N0cnVjdCBpYl9yZXF1ZXN0IHsKKwluaXNfbmFtZSBpYnJfbmFtZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBpYnJfc3JjaF9sZW47CisJCW5pc19hdHRyICppYnJfc3JjaF92YWw7CisJfSBpYnJfc3JjaDsKKwl1aW50MzJfdCBpYnJfZmxhZ3M7CisJc3RydWN0IHsKKwkJdV9pbnQgaWJyX29ial9sZW47CisJCW5pc19vYmplY3QgKmlicl9vYmpfdmFsOworCX0gaWJyX29iajsKKwlzdHJ1Y3QgeworCQl1X2ludCBpYnJfY2Job3N0X2xlbjsKKwkJbmlzX3NlcnZlciAqaWJyX2NiaG9zdF92YWw7CisJfSBpYnJfY2Job3N0OworCXVfaW50IGlicl9idWZzaXplOworCW5ldG9iaiBpYnJfY29va2llOworfTsKK3R5cGVkZWYgc3RydWN0IGliX3JlcXVlc3QgaWJfcmVxdWVzdDsKKworc3RydWN0IHBpbmdfYXJncyB7CisJbmlzX25hbWUgZGlyOworCXVpbnQzMl90IHN0YW1wOworfTsKK3R5cGVkZWYgc3RydWN0IHBpbmdfYXJncyBwaW5nX2FyZ3M7CisKK2VudW0gbG9nX2VudHJ5X3QgeworCUxPR19OT1AgPSAwLAorCUFERF9OQU1FID0gMSwKKwlSRU1fTkFNRSA9IDIsCisJTU9EX05BTUVfT0xEID0gMywKKwlNT0RfTkFNRV9ORVcgPSA0LAorCUFERF9JQkFTRSA9IDUsCisJUkVNX0lCQVNFID0gNiwKKwlNT0RfSUJBU0UgPSA3LAorCVVQRF9TVEFNUCA9IDgsCit9OwordHlwZWRlZiBlbnVtIGxvZ19lbnRyeV90IGxvZ19lbnRyeV90OworCitzdHJ1Y3QgbG9nX2VudHJ5IHsKKwl1aW50MzJfdCBsZV90aW1lOworCWxvZ19lbnRyeV90IGxlX3R5cGU7CisJbmlzX25hbWUgbGVfcHJpbmNwOworCW5pc19uYW1lIGxlX25hbWU7CisJc3RydWN0IHsKKwkJdV9pbnQgbGVfYXR0cnNfbGVuOworCQluaXNfYXR0ciAqbGVfYXR0cnNfdmFsOworCX0gbGVfYXR0cnM7CisJbmlzX29iamVjdCBsZV9vYmplY3Q7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbG9nX2VudHJ5IGxvZ19lbnRyeTsKKworc3RydWN0IGxvZ19yZXN1bHQgeworCW5pc19lcnJvciBscl9zdGF0dXM7CisJbmV0b2JqIGxyX2Nvb2tpZTsKKwlzdHJ1Y3QgeworCQl1X2ludCBscl9lbnRyaWVzX2xlbjsKKwkJbG9nX2VudHJ5ICpscl9lbnRyaWVzX3ZhbDsKKwl9IGxyX2VudHJpZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbG9nX3Jlc3VsdCBsb2dfcmVzdWx0OworCitzdHJ1Y3QgY3BfcmVzdWx0IHsKKwluaXNfZXJyb3IgY3Bfc3RhdHVzOworCXVpbnQzMl90IGNwX3p0aWNrczsKKwl1aW50MzJfdCBjcF9kdGlja3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3BfcmVzdWx0IGNwX3Jlc3VsdDsKKworc3RydWN0IG5pc190YWcgeworCXVpbnQzMl90IHRhZ190eXBlOworCWNoYXIgKnRhZ192YWw7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX3RhZyBuaXNfdGFnOworCitzdHJ1Y3QgbmlzX3RhZ2xpc3QgeworCXN0cnVjdCB7CisJCXVfaW50IHRhZ3NfbGVuOworCQluaXNfdGFnICp0YWdzX3ZhbDsKKwl9IHRhZ3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX3RhZ2xpc3QgbmlzX3RhZ2xpc3Q7CisKK3N0cnVjdCBkdW1wX2FyZ3MgeworCW5pc19uYW1lIGRhX2RpcjsKKwl1aW50MzJfdCBkYV90aW1lOworCXN0cnVjdCB7CisJCXVfaW50IGRhX2NiaG9zdF9sZW47CisJCW5pc19zZXJ2ZXIgKmRhX2NiaG9zdF92YWw7CisJfSBkYV9jYmhvc3Q7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZHVtcF9hcmdzIGR1bXBfYXJnczsKKworc3RydWN0IGZkX2FyZ3MgeworCW5pc19uYW1lIGRpcl9uYW1lOworCW5pc19uYW1lIHJlcXVlc3RlcjsKK307Cit0eXBlZGVmIHN0cnVjdCBmZF9hcmdzIGZkX2FyZ3M7CisKK3N0cnVjdCBmZF9yZXN1bHQgeworCW5pc19lcnJvciBzdGF0dXM7CisJbmlzX25hbWUgc291cmNlOworCXN0cnVjdCB7CisJCXVfaW50IGRpcl9kYXRhX2xlbjsKKwkJY2hhciAqZGlyX2RhdGFfdmFsOworCX0gZGlyX2RhdGE7CisJc3RydWN0IHsKKwkJdV9pbnQgc2lnbmF0dXJlX2xlbjsKKwkJY2hhciAqc2lnbmF0dXJlX3ZhbDsKKwl9IHNpZ25hdHVyZTsKK307Cit0eXBlZGVmIHN0cnVjdCBmZF9yZXN1bHQgZmRfcmVzdWx0OworCisvKiBHZW5lcmljIGNsaWVudCBjcmVhdGluZyBmbGFncyAqLworI2RlZmluZSBaTUhfVkMJCTEKKyNkZWZpbmUgWk1IX0RHCQkyCisjZGVmaW5lIFpNSF9BVVRICTQKKworLyogVGVzdGluZyBBY2Nlc3MgcmlnaHRzIGZvciBvYmplY3RzICovCisKKyNkZWZpbmUgTklTX1JFQURfQUNDCQkxCisjZGVmaW5lIE5JU19NT0RJRllfQUNDCQkyCisjZGVmaW5lIE5JU19DUkVBVEVfQUNDCQk0CisjZGVmaW5lIE5JU19ERVNUUk9ZX0FDQwk4CisvKiBUZXN0IG1hY3Jvcy4gYSA9PSBhY2Nlc3MgcmlnaHRzLCBtID09IGRlc2lyZWQgcmlnaHRzLiAqLworI2RlZmluZSBOSVNfV09STEQoYSwgbSkgICAgICAgICgoKGEpICYgKG0pKSAhPSAwKQorI2RlZmluZSBOSVNfR1JPVVAoYSwgbSkgICAgICAgICgoKGEpICYgKChtKSA8PCA4KSkgIT0gMCkKKyNkZWZpbmUgTklTX09XTkVSKGEsIG0pICAgICAgICAoKChhKSAmICgobSkgPDwgMTYpKSAhPSAwKQorI2RlZmluZSBOSVNfTk9CT0RZKGEsIG0pICAgICAgICgoKGEpICYgKChtKSA8PCAyNCkpICE9IDApCisvKgorICogRU9MIEFsZXJ0IC0gVGhlIGZvbGxvd2luZyBub24tcHJlZml4ZWQgdGVzdCBtYWNyb3MgYXJlCisgKiBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5LCBhbmQgd2lsbCBiZSBub3QgYmUgcHJlc2VudAorICogaW4gZnV0dXJlIHJlbGVhc2VzIC0gdXNlIHRoZSBOSVNfKigpIG1hY3JvcyBhYm92ZS4KKyAqLworI2RlZmluZSBXT1JMRChhLCBtKQkoKChhKSAmIChtKSkgIT0gMCkKKyNkZWZpbmUgR1JPVVAoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDgpKSAhPSAwKQorI2RlZmluZSBPV05FUihhLCBtKQkoKChhKSAmICgobSkgPDwgMTYpKSAhPSAwKQorI2RlZmluZSBOT0JPRFkoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDI0KSkgIT0gMCkKKworI2RlZmluZSBPQVRZUEUoZCwgbikgKCgoZCktPmRvX2FybWFzay5kb19hcm1hc2tfdmFsK24pLT5vYV9vdHlwZSkKKyNkZWZpbmUgT0FSSUdIVFMoZCwgbikgKCgoZCktPmRvX2FybWFzay5kb19hcm1hc2tfdmFsK24pLT5vYV9yaWdodHMpCisjZGVmaW5lIFdPUkxEX0RFRkFVTFQgKE5JU19SRUFEX0FDQykKKyNkZWZpbmUgR1JPVVBfREVGQVVMVCAoTklTX1JFQURfQUNDIDw8IDgpCisjZGVmaW5lIE9XTkVSX0RFRkFVTFQgKChOSVNfUkVBRF9BQ0MgKyBOSVNfTU9ESUZZX0FDQyArIE5JU19DUkVBVEVfQUNDICtcCisJCQlOSVNfREVTVFJPWV9BQ0MpIDw8IDE2KQorI2RlZmluZSBERUZBVUxUX1JJR0hUUyAoV09STERfREVGQVVMVCB8IEdST1VQX0RFRkFVTFQgfCBPV05FUl9ERUZBVUxUKQorCisvKiBSZXN1bHQgbWFuaXB1bGF0aW9uIGRlZmluZXMgLi4uICovCisjZGVmaW5lIE5JU19SRVNfTlVNT0JKKHgpCSgoeCktPm9iamVjdHMub2JqZWN0c19sZW4pCisjZGVmaW5lIE5JU19SRVNfT0JKRUNUKHgpCSgoeCktPm9iamVjdHMub2JqZWN0c192YWwpCisjZGVmaW5lIE5JU19SRVNfQ09PS0lFKHgpCSgoeCktPmNvb2tpZSkKKyNkZWZpbmUgTklTX1JFU19TVEFUVVMoeCkJKCh4KS0+c3RhdHVzKQorCisvKiBUaGVzZSBkZWZpbmVzIG1ha2UgZ2V0dGluZyBhdCB0aGUgdmFyaWFudCBwYXJ0IG9mIHRoZSBvYmplY3QgZWFzaWVyLiAqLworI2RlZmluZSBUQV9kYXRhIHpvX2RhdGEub2JqZGF0YV91LnRhX2RhdGEKKyNkZWZpbmUgRU5fZGF0YSB6b19kYXRhLm9iamRhdGFfdS5lbl9kYXRhCisjZGVmaW5lIERJX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UuZGlfZGF0YQorI2RlZmluZSBMSV9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmxpX2RhdGEKKyNkZWZpbmUgR1JfZGF0YSB6b19kYXRhLm9iamRhdGFfdS5ncl9kYXRhCisKKyNkZWZpbmUgX190eXBlX29mKG8pICgobyktPnpvX2RhdGEuem9fdHlwZSkKKworLyogRGVjbGFyYXRpb25zIGZvciB0aGUgaW50ZXJuYWwgc3Vicm91dGluZXMgaW4gbmlzbGliLmMgKi8KK2VudW0gbmFtZV9wb3Mge1NBTUVfTkFNRSwgSElHSEVSX05BTUUsIExPV0VSX05BTUUsIE5PVF9TRVFVRU5USUFMLCBCQURfTkFNRX07Cit0eXBlZGVmIGVudW0gbmFtZV9wb3MgbmFtZV9wb3M7CisKKy8qCisgKiBEZWZpbmVzIGZvciBnZXR0aW5nIGF0IGNvbHVtbiBkYXRhIGluIGVudHJ5IG9iamVjdHMuIEJlY2F1c2UgUlBDR0VOCisgKiBnZW5lcmF0ZXMgc29tZSByYXRoZXIgd29yZHkgc3RydWN0dXJlcywgd2UgY3JlYXRlIHNvbWUgZGVmaW5lcyB0aGF0CisgKiBjb2xsYXBzZSB0aGUgbmVlZGVkIGtleXN0cm9rZXMgdG8gYWNjZXNzIGEgcGFydGljdWxhciB2YWx1ZSB1c2luZworICogdGhlc2UgZGVmaW5pdGlvbnMgdGhleSB0YWtlIGFuIG5pc19vYmplY3QgKiwgYW5kIGFuIGludCBhbmQgcmV0dXJuCisgKiBhIHVfY2hhciAqIGZvciBWYWx1ZSwgYW5kIGFuIGludCBmb3IgbGVuZ3RoLgorICovCisjZGVmaW5lIEVOVFJZX1ZBTChvYmosIGNvbCkgKG9iaiktPkVOX2RhdGEuZW5fY29scy5lbl9jb2xzX3ZhbFtjb2xdLmVjX3ZhbHVlLmVjX3ZhbHVlX3ZhbAorI2RlZmluZSBFTlRSWV9MRU4ob2JqLCBjb2wpIChvYmopLT5FTl9kYXRhLmVuX2NvbHMuZW5fY29sc192YWxbY29sXS5lY192YWx1ZS5lY192YWx1ZV9sZW4KKworCisvKiBQcm90b3R5cGVzLCBhbmQgZXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgdGhlIE5JUyBsaWJyYXJ5IGZ1bmN0aW9ucy4gKi8KKyNpbmNsdWRlIDxycGNzdmMvbmlzbGliLmg+CisjZW5kaWYKKworLyoKKyAqIG5pc18zLmgKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgdGhhdCBhcmUgb25seSBvZiBpbnRlcmVzdCB0byB0aGUgYWN0dWFsCisgKiBzZXJ2aWNlIGRhZW1vbiBhbmQgY2xpZW50IHN0dWJzLiBOb3JtYWwgdXNlcnMgb2YgTklTIHdpbGwgbm90IGluY2x1ZGUKKyAqIHRoaXMgZmlsZS4KKyAqCisgKiBOT1RFIDogVGhpcyBpbmNsdWRlIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IGEgY29tYmluYXRpb24KKyAqIG9mIHJwY2dlbiBhbmQgc2VkLiBETyBOT1QgRURJVCBJVCwgY2hhbmdlIHRoZSBuaXMueCBmaWxlIGluc3RlYWQKKyAqIGFuZCB0aGVuIHJlbWFrZSB0aGlzIGZpbGUuCisgKi8KKyNpZm5kZWYgX19uaXNfM19oCisjZGVmaW5lIF9fbmlzXzNfaAorCisjZGVmaW5lIE5JU19QUk9HIDEwMDMwMAorI2RlZmluZSBOSVNfVkVSU0lPTiAzCisKKyNkZWZpbmUgTklTX0xPT0tVUCAxCitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfbG9va3VwXzMgKG5zX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfbG9va3VwXzNfc3ZjIChuc19yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19BREQgMgorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2FkZF8zIChuc19yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2FkZF8zX3N2YyAobnNfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfTU9ESUZZIDMKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19tb2RpZnlfMyAobnNfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19tb2RpZnlfM19zdmMgKG5zX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX1JFTU9WRSA0CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfcmVtb3ZlXzMgKG5zX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfcmVtb3ZlXzNfc3ZjIChuc19yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19JQkxJU1QgNQorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2libGlzdF8zIChpYl9yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2libGlzdF8zX3N2YyAoaWJfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfSUJBREQgNgorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2liYWRkXzMgKGliX3JlcXVlc3QgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJhZGRfM19zdmMgKGliX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX0lCTU9ESUZZIDcKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYm1vZGlmeV8zIChpYl9yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2libW9kaWZ5XzNfc3ZjIChpYl9yZXF1ZXN0ICosIHN0cnVjdCBzdmNfcmVxICopCisgICAgIF9fVEhST1c7CisjZGVmaW5lIE5JU19JQlJFTU9WRSA4CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJyZW1vdmVfMyAoaWJfcmVxdWVzdCAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX3Jlc3VsdCAqIG5pc19pYnJlbW92ZV8zX3N2YyAoaWJfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKQorICAgICBfX1RIUk9XOworI2RlZmluZSBOSVNfSUJGSVJTVCA5CitleHRlcm4gIG5pc19yZXN1bHQgKiBuaXNfaWJmaXJzdF8zIChpYl9yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2liZmlyc3RfM19zdmMgKGliX3JlcXVlc3QgKiwgc3RydWN0IHN2Y19yZXEgKikKKyAgICAgX19USFJPVzsKKyNkZWZpbmUgTklTX0lCTkVYVCAxMAorZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2libmV4dF8zIChpYl9yZXF1ZXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfcmVzdWx0ICogbmlzX2libmV4dF8zX3N2YyAoaWJfcmVxdWVzdCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfRklORERJUkVDVE9SWSAxMgorZXh0ZXJuICBmZF9yZXN1bHQgKiBuaXNfZmluZGRpcmVjdG9yeV8zIChmZF9hcmdzICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBmZF9yZXN1bHQgKiBuaXNfZmluZGRpcmVjdG9yeV8zX3N2YyAoZmRfYXJncyAqLAorCQkJCQkgICAgIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19TVEFUVVMgMTQKK2V4dGVybiAgbmlzX3RhZ2xpc3QgKiBuaXNfc3RhdHVzXzMgKG5pc190YWdsaXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfdGFnbGlzdCAqIG5pc19zdGF0dXNfM19zdmMgKG5pc190YWdsaXN0ICosIHN0cnVjdCBzdmNfcmVxICopCisgICAgIF9fVEhST1c7CisjZGVmaW5lIE5JU19EVU1QTE9HIDE1CitleHRlcm4gIGxvZ19yZXN1bHQgKiBuaXNfZHVtcGxvZ18zIChkdW1wX2FyZ3MgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIGxvZ19yZXN1bHQgKiBuaXNfZHVtcGxvZ18zX3N2YyAoZHVtcF9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19EVU1QIDE2CitleHRlcm4gIGxvZ19yZXN1bHQgKiBuaXNfZHVtcF8zIChkdW1wX2FyZ3MgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIGxvZ19yZXN1bHQgKiBuaXNfZHVtcF8zX3N2YyAoZHVtcF9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19DQUxMQkFDSyAxNworZXh0ZXJuICBib29sX3QgKiBuaXNfY2FsbGJhY2tfMyAobmV0b2JqICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBib29sX3QgKiBuaXNfY2FsbGJhY2tfM19zdmMgKG5ldG9iaiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfQ1BUSU1FIDE4CitleHRlcm4gIHVpbnQzMl90ICogbmlzX2NwdGltZV8zIChuaXNfbmFtZSAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgdWludDMyX3QgKiBuaXNfY3B0aW1lXzNfc3ZjIChuaXNfbmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfQ0hFQ0tQT0lOVCAxOQorZXh0ZXJuICBjcF9yZXN1bHQgKiBuaXNfY2hlY2twb2ludF8zIChuaXNfbmFtZSAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgY3BfcmVzdWx0ICogbmlzX2NoZWNrcG9pbnRfM19zdmMgKG5pc19uYW1lICosIHN0cnVjdCBzdmNfcmVxICopCisgICAgIF9fVEhST1c7CisjZGVmaW5lIE5JU19QSU5HIDIwCitleHRlcm4gIHZvaWQgKiBuaXNfcGluZ18zIChwaW5nX2FyZ3MgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIHZvaWQgKiBuaXNfcGluZ18zX3N2YyAocGluZ19hcmdzICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19TRVJWU1RBVEUgMjEKK2V4dGVybiAgbmlzX3RhZ2xpc3QgKiBuaXNfc2VydnN0YXRlXzMgKG5pc190YWdsaXN0ICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBuaXNfdGFnbGlzdCAqIG5pc19zZXJ2c3RhdGVfM19zdmMgKG5pc190YWdsaXN0ICosCisJCQkJCSAgIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisjZGVmaW5lIE5JU19NS0RJUiAyMgorZXh0ZXJuICBuaXNfZXJyb3IgKiBuaXNfbWtkaXJfMyAobmlzX25hbWUgKiwgQ0xJRU5UICopIF9fVEhST1c7CitleHRlcm4gIG5pc19lcnJvciAqIG5pc19ta2Rpcl8zX3N2YyAobmlzX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKKyNkZWZpbmUgTklTX1JNRElSIDIzCitleHRlcm4gIG5pc19lcnJvciAqIG5pc19ybWRpcl8zIChuaXNfbmFtZSAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX2Vycm9yICogbmlzX3JtZGlyXzNfc3ZjIChuaXNfbmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworI2RlZmluZSBOSVNfVVBES0VZUyAyNAorZXh0ZXJuICBuaXNfZXJyb3IgKiBuaXNfdXBka2V5c18zIChuaXNfbmFtZSAqLCBDTElFTlQgKikgX19USFJPVzsKK2V4dGVybiAgbmlzX2Vycm9yICogbmlzX3VwZGtleXNfM19zdmMgKG5pc19uYW1lICosIHN0cnVjdCBzdmNfcmVxICopIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiAhIF9SUENTVkNfTklTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pcy54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkZGIwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pcy54CkBAIC0wLDAgKzEsNDczIEBACislLyoKKyUgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyUgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyUgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworJSAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCislICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorJSAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyIG9yIHdpdGggdGhlIGV4cHJlc3Mgd3JpdHRlbiBjb25zZW50IG9mCislICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorJSAqCislICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorJSAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorJSAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyUgKgorJSAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorJSAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyUgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCislICoKKyUgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyUgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCislICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyUgKgorJSAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyUgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyUgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorJSAqCislICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorJSAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorJSAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCislICovCisKKyNpZmRlZiBSUENfSERSCislLyoKKyUgKgluaXMuaAorJSAqCislICoJVGhpcyBmaWxlIGlzIHRoZSBtYWluIGluY2x1ZGUgZmlsZSBmb3IgTklTIGNsaWVudHMuIEl0IGNvbnRhaW5zCislICoJYm90aCB0aGUgY2xpZW50IGxpYnJhcnkgZnVuY3Rpb24gZGVmaW5lcyBhbmQgdGhlIHZhcmlvdXMgZGF0YQorJSAqIAlzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIE5JUyBzZXJ2aWNlLiBJdCBpbmNsdWRlcyB0aGUgZmlsZSBuaXNfdGFncy5oCislICoJd2hpY2ggZGVmaW5lcyB0aGUgdGFnIHZhbHVlcy4gVGhpcyBhbGxvd3MgdGhlIHRhZ3MgdG8gY2hhbmdlIHdpdGhvdXQKKyUgKgloYXZpbmcgdG8gY2hhbmdlIHRoZSBuaXMueCBmaWxlLgorJSAqCislICoJTk9URSA6IERPIE5PVCBFRElUIFRISVMgRklMRSEgSXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbgorJSAqCSAgICAgICBycGNnZW4gaXMgcnVuIG9uIHRoZSBuaXMueCBmaWxlLiBOb3RlIHRoYXQgdGhlcmUgaXMgYQorJSAqCSAgICAgICBzaW1wbGUgc2VkIHNjcmlwdCB0byByZW1vdmUgc29tZSB1bm5lZWRlZCBsaW5lcy4gKFNlZSB0aGUKKyUgKgkgICAgICAgTWFrZWZpbGUgdGFyZ2V0IG5pcy5oKQorJSAqCislICovCislI2luY2x1ZGUgPHJwY3N2Yy9uaXNfdGFncy5oPgorI2VuZGlmCisKKy8qIFRoaXMgZ2V0cyBzdHVmZmVkIGludG8gdGhlIHNvdXJjZSBmaWxlcy4gKi8KKyNpZiBSUENfSERSCislI2luY2x1ZGUgPHJwYy94ZHIuaD4KKyNlbmRpZgorCisvKiBJbmNsdWRlIHRoZSBSUEMgTGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgTklTIG9iamVjdHMgKi8KKyNpbmNsdWRlICJuaXNfb2JqZWN0LngiCisKKy8qIEVycm9ycyAgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIHNlcnZpY2UgKi8KK2VudW0gbmlzX2Vycm9yIHsKKwlOSVNfU1VDQ0VTUyA9IDAsCS8qIEEtb2ssIGxldCdzIHJvY2sgbiByb2xsIAkqLworCU5JU19TX1NVQ0NFU1MgPSAxLAkvKiBOYW1lIGZvdW5kIChtYXliZSkJICAgCSovCisJTklTX05PVEZPVU5EID0gMiwJLyogTmFtZSBkZWZpbml0ZWx5IG5vdCBmb3VuZCAJKi8KKwlOSVNfU19OT1RGT1VORCA9IDMsCS8qIE5hbWUgbWF5YmUgbm90IGZvdW5kIAkqLworCU5JU19DQUNIRUVYUElSRUQgPSA0LAkvKiBOYW1lIGV4aXN0cyBidXQgY2FjaGUgb3V0IG9mIGRhdGUgKi8KKwlOSVNfTkFNRVVOUkVBQ0hBQkxFID0gNSwgLyogQ2FuJ3QgZ2V0IHRoZXJlIGZyb20gaGVyZSAqLworCU5JU19VTktOT1dOT0JKID0gNiwJLyogT2JqZWN0IHR5cGUgaXMgYm9ndXMgKi8KKwlOSVNfVFJZQUdBSU4gPSA3LAkvKiBJJ20gYnVzeSwgY2FsbCBiYWNrICovCisJTklTX1NZU1RFTUVSUk9SID0gOCwJLyogR2VuZXJpYyBzeXN0ZW0gZXJyb3IgKi8KKwlOSVNfQ0hBSU5CUk9LRU4gPSA5LAkvKiBGaXJzdC9OZXh0IHdhcm5pbmcgKi8KKwlOSVNfUEVSTUlTU0lPTiA9IDEwLAkvKiBOb3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gYWNjZXNzICovCisJTklTX05PVE9XTkVSID0gMTEsCS8qIFlvdSBkb24ndCBvd24gaXQsIHNvcnJ5ICovCisJTklTX05PVF9NRSA9IDEyLAkvKiBJIGRvbid0IHNlcnZlIHRoaXMgbmFtZSAqLworCU5JU19OT01FTU9SWSA9IDEzLAkvKiBPdXR0YSBWTSEgSGVscCEgKi8KKwlOSVNfTkFNRUVYSVNUUyA9IDE0LAkvKiBDYW4ndCBjcmVhdGUgb3ZlciBhbm90aGVyIG5hbWUgKi8KKwlOSVNfTk9UTUFTVEVSID0gMTUsCS8qIEknbSBqdXN0YSBzZWNvbmRhcmF5LCBkb24ndCBhc2sgbWUgKi8KKwlOSVNfSU5WQUxJRE9CSiA9IDE2LAkvKiBPYmplY3QgaXMgYnJva2VuIHNvbWVob3cgKi8KKwlOSVNfQkFETkFNRSA9IDE3LAkvKiBVbnBhcnNhYmxlIG5hbWUgKi8KKwlOSVNfTk9DQUxMQkFDSyA9IDE4LAkvKiBDb3VsZG4ndCB0YWxrIHRvIGNhbGwgYmFjayBwcm9jICovCisJTklTX0NCUkVTVUxUUyA9IDE5LAkvKiBSZXN1bHRzIGJlaW5nIGNhbGxlZCBiYWNrIHRvIHlvdSAqLworCU5JU19OT1NVQ0hOQU1FID0gMjAsCS8qIE5hbWUgdW5rbm93biAqLworCU5JU19OT1RVTklRVUUgPSAyMSwJLyogVmFsdWUgaXMgbm90IHVuaXF1ZXMgKGVudHJ5KSAqLworCU5JU19JQk1PREVSUk9SID0gMjIsCS8qIEluZi4gQmFzZS4gTW9kaWZ5IGVycm9yLiAqLworCU5JU19OT1NVQ0hUQUJMRSA9IDIzLAkvKiBOYW1lIGZvciB0YWJsZSB3YXMgd3JvbmcgKi8KKwlOSVNfVFlQRU1JU01BVENIID0gMjQsIAkvKiBFbnRyeSBhbmQgdGFibGUgdHlwZSBtaXNtYXRjaCAqLworCU5JU19MSU5LTkFNRUVSUk9SID0gMjUsCS8qIExpbmsgcG9pbnRzIHRvIGJvZ3VzIG5hbWUgKi8KKwlOSVNfUEFSVElBTCA9IDI2LAkvKiBQYXJ0aWFsIHN1Y2Nlc3MsIGZvdW5kIHRhYmxlICovCisJTklTX1RPT01BTllBVFRSUyA9IDI3LAkvKiBUb28gbWFueSBhdHRyaWJ1dGVzICovCisJTklTX1JQQ0VSUk9SID0gMjgsCS8qIFJQQyBlcnJvciBlbmNvdW50ZXJlZCAqLworCU5JU19CQURBVFRSSUJVVEUgPSAyOSwJLyogQmFkIG9yIGludmFsaWQgYXR0cmlidXRlICovCisJTklTX05PVFNFQVJDSEFCTEUgPSAzMCwJLyogTm9uLXNlYXJjaGFibGUgb2JqZWN0IHNlYXJjaGVkICovCisJTklTX0NCRVJST1IgPSAzMSwJLyogRXJyb3IgZHVyaW5nIGNhbGxiYWNrIChzdmMgY3Jhc2gpICovCisJTklTX0ZPUkVJR05OUyA9IDMyLAkvKiBGb3JlaWduIE5hbWVzcGFjZSAqLworCU5JU19CQURPQkpFQ1QgPSAzMywJLyogTWFsZm9ybWVkIG9iamVjdCBzdHJ1Y3R1cmUgKi8KKwlOSVNfTk9UU0FNRU9CSiA9IDM0LAkvKiBPYmplY3Qgc3dhcHBlZCBkdXJpbmcgZGVsZXRpb24gKi8KKwlOSVNfTU9ERkFJTCA9IDM1LAkvKiBGYWlsdXJlIGR1cmluZyBhIE1vZGlmeS4gKi8KKwlOSVNfQkFEUkVRVUVTVCA9IDM2LAkvKiBJbGxlZ2FsIHF1ZXJ5IGZvciB0YWJsZSAqLworCU5JU19OT1RFTVBUWSA9IDM3LAkvKiBBdHRlbXB0IHRvIHJlbW92ZSBhIG5vbi1lbXB0eSB0YmwgKi8KKwlOSVNfQ09MRFNUQVJUX0VSUiA9IDM4LCAvKiBFcnJvciBhY2Nlc2luZyB0aGUgY29sZCBzdGFydCBmaWxlICovCisJTklTX1JFU1lOQyA9IDM5LAkvKiBUcmFuc2FjdGlvbiBsb2cgdG9vIGZhciBvdXQgb2YgZGF0ZSAqLworCU5JU19GQUlMID0gNDAsCQkvKiBOSVMgb3BlcmF0aW9uIGZhaWxlZC4gKi8KKwlOSVNfVU5BVkFJTCA9IDQxLAkvKiBOSVMrIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgKGNsaWVudCkgKi8KKwlOSVNfUkVTMkJJRyA9IDQyLAkvKiBOSVMrIHJlc3VsdCB0b28gYmlnIGZvciBkYXRhZ3JhbSAqLworCU5JU19TUlZBVVRIID0gNDMsCS8qIE5JUysgc2VydmVyIHdhc24ndCBhdXRoZW50aWNhdGVkLiAqLworCU5JU19DTE5UQVVUSCA9IDQ0LAkvKiBOSVMrIENsaWVudCB3YXNuJ3QgYXV0aGVudGljYXRlZC4gKi8KKwlOSVNfTk9GSUxFU1BBQ0UgPSA0NSwJLyogTklTKyBzZXJ2ZXIgcmFuIG91dCBvZiBkaXNrIHNwYWNlICovCisJTklTX05PUFJPQyA9IDQ2LAkvKiBOSVMrIHNlcnZlciBjb3VsZG4ndCBjcmVhdGUgbmV3IHByb2MgKi8KKwlOSVNfRFVNUExBVEVSID0gNDcJLyogTklTKyBzZXJ2ZXIgYWxyZWFkeSBoYXMgZHVtcCBjaGlsZCAqLworfTsKKworCisvKgorICogU3RydWN0dXJlIGRlZmluaXRpb25zIGZvciB0aGUgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBvZiB0aGUgYWN0dWFsCisgKiBOSVMgUlBDIGNhbGxzLgorICoKKyAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHJlc3VsdCAoaW4gdGhlIHByb3RvY29sKSBvZiBtb3N0IG9mIHRoZSBuaXMKKyAqIHJlcXVlc3RzLgorICovCisKK3N0cnVjdCBuaXNfcmVzdWx0IHsKKwluaXNfZXJyb3IJc3RhdHVzOwkJLyogU3RhdHVzIG9mIHRoZSByZXNwb25zZSAqLworCW5pc19vYmplY3QJb2JqZWN0czw+OwkvKiBvYmplY3RzIGZvdW5kIAkgICovCisJbmV0b2JqCQljb29raWU7CQkvKiBDb29raWUgRGF0YSAJCSAgKi8KKwl1aW50MzJfdAl6dGlja3M7CQkvKiBzZXJ2ZXIgdGlja3MJIAkgICovCisJdWludDMyX3QJZHRpY2tzOwkJLyogREJNIHRpY2tzLgkJICAqLworCXVpbnQzMl90CWF0aWNrczsJCS8qIENhY2hlIChhY2NlbCkgdGlja3MJICAqLworCXVpbnQzMl90CWN0aWNrczsJCS8qIENsaWVudCB0aWNrcwkJICAqLworfTsKKworLyoKKyAqIEEgTmFtZSBTZXJ2aWNlIHJlcXVlc3QKKyAqIFRoaXMgcmVxdWVzdCBpcyB1c2VkIHRvIGFjY2VzcyB0aGUgbmFtZSBzcGFjZSwgbnNfbmFtZSBpcyB0aGUgbmFtZQorICogb2YgdGhlIG9iamVjdCB3aXRoaW4gdGhlIG5hbWVzcGFjZSBhbmQgdGhlIG9iamVjdCBpcyBpdCdzIHZhbHVlLCBmb3IKKyAqIGFkZC9tb2RpZnksIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZm9yIHJlbW92ZS4KKyAqLworCitzdHJ1Y3QgbnNfcmVxdWVzdCB7CisJbmlzX25hbWUJbnNfbmFtZTsJLyogTmFtZSBpbiB0aGUgTklTIG5hbWUgc3BhY2UJKi8KKwluaXNfb2JqZWN0CW5zX29iamVjdDwxPjsJLyogT3B0aW9uYWwgT2JqZWN0IChhZGQvcmVtb3ZlKQkqLworfTsKKworLyoKKyAqIEFuIGluZm9ybWF0aW9uIGJhc2UgcmVxdWVzdAorICogVGhpcyByZXF1ZXN0IGluY2x1ZGVzIHRoZSBOSVMgbmFtZSBvZiB0aGUgdGFibGUgd2Ugd2lzaCB0byBzZWFyY2gsIHRoZQorICogc2VhcmNoIGNyaXRlcmlhIGluIHRoZSBmb3JtIG9mIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBhbmQgYW4gb3B0aW9uYWwKKyAqIGNhbGxiYWNrIHByb2dyYW0gbnVtYmVyLiBJZiB0aGUgY2FsbGJhY2sgcHJvZ3JhbSBudW1iZXIgaXMgcHJvdmlkZWQKKyAqIHRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGJhY2sgb2JqZWN0cyBvbmUgYXQgYSB0aW1lLCBvdGhlcndpc2UgaXQgd2lsbAorICogcmV0dXJuIHRoZW0gYWxsIGluIHRoZSByZXNwb25zZS4KKyAqLworCitzdHJ1Y3QgaWJfcmVxdWVzdCB7CisJbmlzX25hbWUgIAlpYnJfbmFtZTsJLyogVGhlIG5hbWUgb2YgdGhlIFRhYmxlIAkqLworCW5pc19hdHRyICAJaWJyX3NyY2g8PjsgCS8qIFRoZSBzZWFyY2ggY3JpdGVyZWlhIAkqLworCXVpbnQzMl90CWlicl9mbGFnczsJLyogT3B0aW9uYWwgZmxhZ3MgCQkqLworCW5pc19vYmplY3QJaWJyX29iajwxPjsJLyogb3B0aW9uYWwgb2JqZWN0IChhZGQvbW9kaWZ5KSAqLworCW5pc19zZXJ2ZXIJaWJyX2NiaG9zdDwxPjsJLyogT3B0aW9uYWwgY2FsbGJhY2sgaW5mbwkqLworCXVfaW50CQlpYnJfYnVmc2l6ZTsJLyogT3B0aW9uYWwgZmlyc3QvbmV4dCBidWZzaXplCSovCisJbmV0b2JqCQlpYnJfY29va2llOwkvKiBUaGUgZmlyc3QvbmV4dCBjb29raWUJKi8KK307CisKKy8qCisgKiBUaGlzIGFyZ3VtZW50IHRvIHRoZSBQSU5HIGNhbGwgbm90aWZpZXMgdGhlIHJlcGxpY2FzIHRoYXQgc29tZXRoaW5nIGluCisgKiBhIGRpcmVjdG9yeSBoYXMgY2hhbmdlZCBhbmQgdGhpcyBpcyBpdCdzIHRpbWVzdGFtcC4gVGhlIHJlcGxpY2Egd2lsbCB1c2UKKyAqIHRoZSB0aW1lc3RhbXAgdG8gZGV0ZXJtaW5lIGlmIGl0cyByZXN5bmMgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitzdHJ1Y3QgcGluZ19hcmdzIHsKKwluaXNfbmFtZQlkaXI7CS8qIERpcmVjdG9yeSB0aGF0IGhhZCB0aGUgY2hhbmdlICovCisJdWludDMyX3QJc3RhbXA7CS8qIHRpbWVzdGFtcCBvZiB0aGUgdHJhbnNhY3Rpb24gICovCit9OworCisvKgorICogVGhlc2UgYXJlIHRoZSB0eXBlIG9mIGVudHJpZXMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSB0cmFuc2FjdGlvbiBsb2csCisgKiBub3RlIHRoYXQgbW9kaWZpY2F0aW9ucyB3aWxsIGFwcGVhciBhcyB0d28gZW50cmllcywgZm9yIG5hbWVzLCB0aGV5IGhhdmUKKyAqIGEgIk9MRCIgZW50cnkgZm9sbG93ZWQgYnkgYSAiTkVXIiBlbnRyeS4gRm9yIGVudHJpZXMgaW4gdGFibGVzLCB0aGVyZQorICogaXMgYSByZW1vdmUgZm9sbG93ZWQgYnkgYW4gYWRkLiBJdCBpcyBkb25lIHRoaXMgd2F5IHNvIHRoYXQgd2UgY2FuIHJlYWQKKyAqIHRoZSBsb2cgYmFja3dhcmRzIHRvIGJhY2sgb3V0IHRyYW5zYWN0aW9ucyBhbmQgZm9yd2FyZHMgdG8gcHJvcG9nYXRlCisgKiB1cGRhdGVkLgorICovCitlbnVtIGxvZ19lbnRyeV90IHsKKwlMT0dfTk9QID0gMCwKKwlBRERfTkFNRSA9IDEsCQkvKiBOYW1lIEFkZGVkIHRvIG5hbWUgc3BhY2UgCQkgICovCisJUkVNX05BTUUgPSAyLAkJLyogTmFtZSByZW1vdmVkIGZyb20gbmFtZSBzcGFjZSAJICAqLworCU1PRF9OQU1FX09MRCA9IDMsCS8qIE5hbWUgd2FzIG1vZGlmaWVkIGluIHRoZSBuYW1lIHNwYWNlIAkgICovCisJTU9EX05BTUVfTkVXID0gNCwJLyogTmFtZSB3YXMgbW9kaWZpZWQgaW4gdGhlIG5hbWUgc3BhY2UgCSAgKi8KKwlBRERfSUJBU0UgPSA1LAkJLyogRW50cnkgYWRkZWQgdG8gaW5mb3JtYXRpb24gYmFzZSAJICAqLworCVJFTV9JQkFTRSA9IDYsCQkvKiBFbnRyeSByZW1vdmVkIGZyb20gaW5mb3JtYXRpb24gYmFzZSAgICAqLworCU1PRF9JQkFTRSA9IDcsCQkvKiBFbnRyeSB3YXMgbW9kaWZpZWQgaW4gaW5mb3JtYXRpb24gYmFzZSAqLworCVVQRF9TVEFNUCA9IDgJCS8qIFVwZGF0ZSB0aW1lc3RhbXAgKHVzZWQgYXMgZmVuY2Vwb3N0cykgICovCit9OworCisvKgorICogVGhpcyByZXN1bHQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgbmFtZSBzZXJ2aWNlIHdoZW4gaXQgaXMgcmVxdWVzdGVkIHRvCisgKiBkdW1wIGxvZ2dlZCBlbnRyaWVzIGZyb20gaXRzIHRyYW5zYWN0aW9uIGxvZy4gSW5mb3JtYXRpb24gYmFzZSB1cGRhdGVzCisgKiB3aWxsIGhhdmUgdGhlIG5hbWUgb2YgdGhlIGluZm9ybWF0aW9uIGJhc2UgaW4gdGhlIGxlX25hbWUgZmllbGQgYW5kCisgKiBhIGNhbm9uaWNhbCBzZXQgb2YgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIHRvIGZ1bGx5IHNwZWNpZnkgdGhlIGVudHJ5J3MKKyAqICduYW1lJy4KKyAqLworc3RydWN0IGxvZ19lbnRyeSB7CisJdWludDMyX3QJbGVfdGltZTsJLyogVGltZSBpbiBzZWNvbmRzIAkJKi8KKwlsb2dfZW50cnlfdAlsZV90eXBlOwkvKiBUeXBlIG9mIGxvZyBlbnRyeSAJCSovCisJbmlzX25hbWUJbGVfcHJpbmNwOwkvKiBQcmluY2lwYWwgbWFraW5nIHRoZSBjaGFuZ2UJKi8KKwluaXNfbmFtZQlsZV9uYW1lOwkvKiBOYW1lIG9mIHRhYmxlL2RpciBpbnZvbHZlZCAJKi8KKwluaXNfYXR0cglsZV9hdHRyczw+OwkvKiBMaXN0IG9mIEFWIHBhaXJzLgkJKi8KKwluaXNfb2JqZWN0CWxlX29iamVjdDsJLyogQWN0dWFsIG9iamVjdCB2YWx1ZSAJCSovCit9OworCitzdHJ1Y3QgbG9nX3Jlc3VsdCB7CisJbmlzX2Vycm9yIAlscl9zdGF0dXM7CS8qIFRoZSBzdGF0dXMgaXRzZWxmIAkgCSovCisJbmV0b2JqCQlscl9jb29raWU7CS8qIFVzZWQgYnkgdGhlIGR1bXAgY2FsbGJhY2sJKi8KKwlsb2dfZW50cnkJbHJfZW50cmllczw+OwkvKiB6ZXJvIG9yIG1vcmUgZW50cmllcyAJKi8KK307CisKK3N0cnVjdCBjcF9yZXN1bHQgeworCW5pc19lcnJvcgljcF9zdGF0dXM7CS8qIFN0YXR1cyBvZiB0aGUgY2hlY2twb2ludCAJKi8KKwl1aW50MzJfdAljcF96dGlja3M7CS8qIFNlcnZpY2UgJ3RpY2tzJyAJICAgIAkqLworCXVpbnQzMl90CWNwX2R0aWNrczsJLyogRGF0YWJhc2UgJ3RpY2tzJwkgICAgCSovCit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGdlbmVyaWMgTklTIHRhZyBsaXN0LiBUaGUgdGFnbGlzdCBjb250YWlucworICogemVybyBvciB0YWdzLCBlYWNoIG9mIHdoaWNoIGlzIGEgdHlwZSBhbmQgYSB2YWx1ZS4gKHVfaW50KS4KKyAqIFRoZXNlIGFyZSB1c2VkIHRvIHJlcG9ydCBzdGF0aXN0aWNzIChzZWUgdGFnIGRlZmluaXRpb25zIGJlbG93KQorICogYW5kIHRvIHNldCBvciByZXNldCBzdGF0ZSB2YXJpYWJsZXMuCisgKi8KK3N0cnVjdCBuaXNfdGFnIHsKKwl1aW50MzJfdAl0YWdfdHlwZTsJLyogU3RhdGlzdGljIHRhZyAobWF5IHZhcnkpIAkgKi8KKwlzdHJpbmcJCXRhZ192YWw8PjsJLyogU3RhdGlzdGljIHZhbHVlIG1heSBhbHNvIHZhcnkgKi8KK307CisKK3N0cnVjdCBuaXNfdGFnbGlzdCB7CisJbmlzX3RhZyB0YWdzPD47CQkJLyogTGlzdCBvZiB0YWdzICovCit9OworCitzdHJ1Y3QgZHVtcF9hcmdzIHsKKwluaXNfbmFtZQlkYV9kaXI7CQkvKiBEaXJlY3RvcnkgdG8gZHVtcCAJKi8KKwl1aW50MzJfdAlkYV90aW1lOwkvKiBGcm9tIHRoaXMgdGltZXN0YW1wCSovCisJbmlzX3NlcnZlcglkYV9jYmhvc3Q8MT47CS8qIENhbGxiYWNrIHRvIHVzZS4JKi8KK307CisKK3N0cnVjdCBmZF9hcmdzIHsKKwluaXNfbmFtZQlkaXJfbmFtZTsgIC8qIFRoZSBkaXJlY3Rvcnkgd2UncmUgbG9va2luZyBmb3IgKi8KKwluaXNfbmFtZQlyZXF1ZXN0ZXI7IC8qIEhvc3QgcHJpbmNpcGFsIG5hbWUgZm9yIHNpZ25hdHVyZSAqLworfTsKKworc3RydWN0IGZkX3Jlc3VsdCB7CisJbmlzX2Vycm9yCXN0YXR1czsJCS8qIFN0YXR1cyByZXR1cm5lZCBieSBmdW5jdGlvbgkqLworCW5pc19uYW1lCXNvdXJjZTsJCS8qIFNvdXJjZSBvZiB0aGlzIGFuc3dlciAgIAkqLworCW9wYXF1ZQkJZGlyX2RhdGE8PjsJLyogRGlyZWN0b3J5IERhdGEgKFhEUidlZCkgCSovCisJb3BhcXVlCQlzaWduYXR1cmU8PjsJLyogU2lnbmF0dXJlIG9mIHRoZSBzb3VyY2UgCSovCit9OworCislLyoKKyUgKiBTdHJ1Y3R1cmVzIHVzZWQgZm9yIHNlcnZlciBiaW5kaW5nLgorJSAqLworc3RydWN0IG5pc19ib3VuZF9lbmRwb2ludCB7CisJZW5kcG9pbnQgZXA7CisJaW50IGdlbmVyYXRpb247CisJaW50IHJhbms7CisJdWludDMyX3QgZmxhZ3M7CisJaW50IGhvc3RudW07CisJaW50IGVwbnVtOworCW5pc19uYW1lIHVhZGRyOworCWVuZHBvaW50IGNiZXA7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2JvdW5kX2VuZHBvaW50IG5pc19ib3VuZF9lbmRwb2ludDsKKworc3RydWN0IG5pc19ib3VuZF9kaXJlY3RvcnkgeworCWludCBnZW5lcmF0aW9uOworCWludCBtaW5fcmFuazsgICAgICAgICAgIC8qIG1pbmltdW0gcmFuayBvZiBib3VuZCBlbmRwb2ludHMgKi8KKwlpbnQgb3B0aW1hbF9yYW5rOyAgICAgICAvKiBiZXN0IHBvc3NpYmxlIHJhbmsgb2YgYWxsIGVuZHBvaW50cyAqLworCWRpcmVjdG9yeV9vYmogZG9iajsKKwluaXNfYm91bmRfZW5kcG9pbnQgQkVQPD47Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmlzX2JvdW5kX2RpcmVjdG9yeSBuaXNfYm91bmRfZGlyZWN0b3J5OworJSNkZWZpbmUgYmVwX2xlbiBCRVAuQkVQX2xlbgorJSNkZWZpbmUgYmVwX3ZhbCBCRVAuQkVQX3ZhbAorCitzdHJ1Y3QgbmlzX2FjdGl2ZV9lbmRwb2ludCB7CisJZW5kcG9pbnQgZXA7CisJbmlzX25hbWUgaG9zdG5hbWU7CisJaW50IHJhbms7CisJaW50IHVhZGRyX2dlbmVyYXRpb247CisJbmlzX25hbWUgdWFkZHI7CisJaW50IGNiZXBfZ2VuZXJhdGlvbjsKKwllbmRwb2ludCBjYmVwOworfTsKK3R5cGVkZWYgc3RydWN0IG5pc19hY3RpdmVfZW5kcG9pbnQgbmlzX2FjdGl2ZV9lbmRwb2ludDsKKworJS8qIGRlZmluZXMgZm9yIG5pc19ib3VuZF9lbmRwb2ludC5mbGFncyAqLworJSNkZWZpbmUgTklTX0JPVU5EIDB4MQorJSNkZWZpbmUgTklTX1RSQU5TSUVOVF9FUlJPUlMgMHgyCisKK3Byb2dyYW0gIE5JU19QUk9HIHsKKworCS8qIFJQQyBMYW5ndWFnZSBkZXNjcmlwdGlvbiBvZiB0aGUgTklTKyBwcm90b2NvbCAqLworCXZlcnNpb24gTklTX1ZFUlNJT04geworCQkvKiBUaGUgbmFtZSBzZXJ2aWNlIGZ1bmN0aW9ucyAqLworCQluaXNfcmVzdWx0ICBOSVNfTE9PS1VQKG5zX3JlcXVlc3QpID0gMTsKKwkJbmlzX3Jlc3VsdCAgTklTX0FERChuc19yZXF1ZXN0KSA9IDI7CisJCW5pc19yZXN1bHQgIE5JU19NT0RJRlkobnNfcmVxdWVzdCkgPSAzOworCQluaXNfcmVzdWx0ICBOSVNfUkVNT1ZFKG5zX3JlcXVlc3QpID0gNDsKKworCQkvKiBUaGUgaW5mb3JtYXRpb24gYmFzZSBmdW5jdGlvbnMgKi8KKwkJbmlzX3Jlc3VsdCAgTklTX0lCTElTVChpYl9yZXF1ZXN0KSA9IDU7CisJCW5pc19yZXN1bHQgIE5JU19JQkFERChpYl9yZXF1ZXN0KSA9IDY7CisJCW5pc19yZXN1bHQgIE5JU19JQk1PRElGWShpYl9yZXF1ZXN0KSA9IDc7CisJCW5pc19yZXN1bHQgIE5JU19JQlJFTU9WRShpYl9yZXF1ZXN0KSA9IDg7CisJCW5pc19yZXN1bHQgIE5JU19JQkZJUlNUKGliX3JlcXVlc3QpID0gOTsKKwkJbmlzX3Jlc3VsdCAgTklTX0lCTkVYVChpYl9yZXF1ZXN0KSA9IDEwOworCisJCS8qIE5JUyBBZG1pbmlzdHJhdGl2ZSBmdW5jdGlvbnMgKi8KKwkJZmRfcmVzdWx0ICAgTklTX0ZJTkRESVJFQ1RPUlkoZmRfYXJncykgPSAxMjsKKworCQkvKiBJZiBmZXRjaCBhbmQgb3B0aW9uYWxseSByZXNldCBzdGF0aXN0aWNzICovCisJCW5pc190YWdsaXN0ICBOSVNfU1RBVFVTKG5pc190YWdsaXN0KSA9IDE0OworCisJCS8qIER1bXAgY2hhbmdlcyB0byBkaXJlY3Rvcnkgc2luY2UgdGltZSBpbiBkYV90aW1lICovCisJCWxvZ19yZXN1bHQgIE5JU19EVU1QTE9HKGR1bXBfYXJncykgPSAxNTsKKworCQkvKiBEdW1wIGNvbnRlbnRzIG9mIGRpcmVjdG9yeSBuYW1lZCAqLworCQlsb2dfcmVzdWx0ICBOSVNfRFVNUChkdW1wX2FyZ3MpID0gMTY7CisKKwkJLyogQ2hlY2sgc3RhdHVzIG9mIGNhbGxiYWNrIHRocmVhZCAqLworCQlib29sCSAgICBOSVNfQ0FMTEJBQ0sobmV0b2JqKSA9IDE3OworCisJCS8qIFJldHVybiBsYXN0IHVwZGF0ZSB0aW1lIGZvciBuYW1lZCBkaXIgKi8KKwkJdWludDMyX3QgICAgTklTX0NQVElNRShuaXNfbmFtZSkgPSAxODsKKworCQkvKiBDaGVja3BvaW50IGRpcmVjdG9yeSBvciB0YWJsZSBuYW1lZCAqLworCQljcF9yZXN1bHQgICBOSVNfQ0hFQ0tQT0lOVChuaXNfbmFtZSkgPSAxOTsKKworCQkvKiBTZW5kICdzdGF0dXMgY2hhbmdlZCcgcGluZyB0byByZXBsaWNhdGVzICovCisJCXZvaWQJICAgIE5JU19QSU5HKHBpbmdfYXJncykgPSAyMDsKKworCQkvKiBNb2RpZnkgc2VydmVyIGJlaGF2aW91ciAoc3VjaCBhcyBkZWJ1Z2dpbmcpICovCisJCW5pc190YWdsaXN0IE5JU19TRVJWU1RBVEUobmlzX3RhZ2xpc3QpID0gMjE7CisKKwkJLyogQ3JlYXRlIGEgRGlyZWN0b3J5ICovCisJCW5pc19lcnJvciAgIE5JU19NS0RJUihuaXNfbmFtZSkgPSAyMjsKKworCQkvKiBSZW1vdmUgYSBEaXJlY3RvcnkgKi8KKwkJbmlzX2Vycm9yICAgTklTX1JNRElSKG5pc19uYW1lKSA9IDIzOworCisJCS8qIFVwZGF0ZSBwdWJsaWMga2V5cyBvZiBhIGRpcmVjdG9yeSBvYmplY3QgKi8KKwkJbmlzX2Vycm9yICAgTklTX1VQREtFWVMobmlzX25hbWUpID0gMjQ7CisJfSA9IDM7Cit9ID0gMTAwMzAwOworCisvKgorICogSW5jbHVkZWQgYmVsb3cgYXJlIHRoZSBkZWZpbmVzIHRoYXQgYmVjb21lIHBhcnQgb2YgbmlzLmgsCisgKiB0aGV5IGFyZSB0ZWNobmljYWxseSBub3QgcGFydCBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkbyBkZWZpbmUKKyAqIGtleSBhc3BlY3RzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgYXJlIHRoZXJlZm9yZSB1c2VmdWwKKyAqIGluIGJ1aWxkaW5nIGEgY29uZm9ybWluZyBzZXJ2ZXIgb3IgY2xpZW50LgorICovCisjaWYgUlBDX0hEUgorJS8qCislICogR2VuZXJpYyAiaGFzaCIgZGF0YXN0cnVjdHVyZXMsIHVzZWQgYnkgYWxsIHR5cGVzIG9mIGhhc2hlZCBkYXRhLgorJSAqLworJXN0cnVjdCBuaXNfaGFzaF9kYXRhIHsKKyUJbmlzX25hbWUJCW5hbWU7CSAgIC8qIE5JUyBuYW1lIG9mIGhhc2hlZCBpdGVtICAgICAgKi8KKyUJaW50CQkJa2V5Y2hhaW47ICAvKiBJdCdzIGhhc2gga2V5IChmb3IgcG9wKSAgICAgICovCislCXN0cnVjdCBuaXNfaGFzaF9kYXRhCSpuZXh0OwkgICAvKiBIYXNoIGNvbGxpc2lvbiBwb2ludGVyICAgICAgICovCislCXN0cnVjdCBuaXNfaGFzaF9kYXRhCSpwcnZfaXRlbTsgLyogQSBzZXJpYWwsIGRvdWJseSBsaW5rZWQgbGlzdCAqLworJQlzdHJ1Y3QgbmlzX2hhc2hfZGF0YQkqbnh0X2l0ZW07IC8qIG9mIGl0ZW1zIGluIHRoZSBoYXNoIHRhYmxlICAgKi8KKyV9OworJXR5cGVkZWYgc3RydWN0IG5pc19oYXNoX2RhdGEgTklTX0hBU0hfSVRFTTsKKyUKKyVzdHJ1Y3QgbmlzX2hhc2hfdGFibGUgeworJQlOSVNfSEFTSF9JVEVNCSprZXlzWzY0XTsJLyogQSBoYXNoIHRhYmxlIG9mIGl0ZW1zICAgICAgICAgICAqLworJQlOSVNfSEFTSF9JVEVNCSpmaXJzdDsJCS8qIFRoZSBmaXJzdCAiaXRlbSIgaW4gc2VyaWFsIGxpc3QgKi8KKyV9OworJXR5cGVkZWYgc3RydWN0IG5pc19oYXNoX3RhYmxlIE5JU19IQVNIX1RBQkxFOworJQorJS8qIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RhdGljIGRhdGEgKi8KKyVzdHJ1Y3QgbmlzX3NkYXRhIHsKKyUJdm9pZAkqYnVmOwkvKiBNZW1vcnkgYWxsb2NhdGlvbiBwb2ludGVyIAkqLworJQl1X2ludAlzaXplOwkvKiBCdWZmZXIgc2l6ZQkJCSovCislfTsKKyUKKyUvKiBHZW5lcmljIGNsaWVudCBjcmVhdGluZyBmbGFncyAqLworJSNkZWZpbmUgWk1IX1ZDCQkxCislI2RlZmluZSBaTUhfREcJCTIKKyUjZGVmaW5lIFpNSF9BVVRICTQKKyUKKyUvKiBUZXN0aW5nIEFjY2VzcyByaWdodHMgZm9yIG9iamVjdHMgKi8KKyUKKyUjZGVmaW5lIE5JU19SRUFEX0FDQwkJMQorJSNkZWZpbmUgTklTX01PRElGWV9BQ0MJCTIKKyUjZGVmaW5lIE5JU19DUkVBVEVfQUNDCQk0CislI2RlZmluZSBOSVNfREVTVFJPWV9BQ0MJOAorJS8qIFRlc3QgbWFjcm9zLiBhID09IGFjY2VzcyByaWdodHMsIG0gPT0gZGVzaXJlZCByaWdodHMuICovCislI2RlZmluZSBOSVNfV09STEQoYSwgbSkJKCgoYSkgJiAobSkpICE9IDApCislI2RlZmluZSBOSVNfR1JPVVAoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDgpKSAhPSAwKQorJSNkZWZpbmUgTklTX09XTkVSKGEsIG0pCSgoKGEpICYgKChtKSA8PCAxNikpICE9IDApCislI2RlZmluZSBOSVNfTk9CT0RZKGEsIG0pCSgoKGEpICYgKChtKSA8PCAyNCkpICE9IDApCislLyoKKyUgKiBFT0wgQWxlcnQgLSBUaGUgZm9sbG93aW5nIG5vbi1wcmVmaXhlZCB0ZXN0IG1hY3JvcyBhcmUKKyUgKiBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5LCBhbmQgd2lsbCBiZSBub3QgYmUgcHJlc2VudAorJSAqIGluIGZ1dHVyZSByZWxlYXNlcyAtIHVzZSB0aGUgTklTXyooKSBtYWNyb3MgYWJvdmUuCislICovCislI2RlZmluZSBXT1JMRChhLCBtKQkoKChhKSAmIChtKSkgIT0gMCkKKyUjZGVmaW5lIEdST1VQKGEsIG0pCSgoKGEpICYgKChtKSA8PCA4KSkgIT0gMCkKKyUjZGVmaW5lIE9XTkVSKGEsIG0pCSgoKGEpICYgKChtKSA8PCAxNikpICE9IDApCislI2RlZmluZSBOT0JPRFkoYSwgbSkJKCgoYSkgJiAoKG0pIDw8IDI0KSkgIT0gMCkKKyUKKyUjZGVmaW5lIE9BVFlQRShkLCBuKSAoKChkKS0+ZG9fYXJtYXNrLmRvX2FybWFza192YWwrbiktPm9hX290eXBlKQorJSNkZWZpbmUgT0FSSUdIVFMoZCwgbikgKCgoZCktPmRvX2FybWFzay5kb19hcm1hc2tfdmFsK24pLT5vYV9yaWdodHMpCislI2RlZmluZSBXT1JMRF9ERUZBVUxUIChOSVNfUkVBRF9BQ0MpCislI2RlZmluZSBHUk9VUF9ERUZBVUxUIChOSVNfUkVBRF9BQ0MgPDwgOCkKKyUjZGVmaW5lIE9XTkVSX0RFRkFVTFQgKChOSVNfUkVBRF9BQ0MgK1wKKwkJCSBOSVNfTU9ESUZZX0FDQyArXAorCQkJIE5JU19DUkVBVEVfQUNDICtcCisJCQkgTklTX0RFU1RST1lfQUNDKSA8PCAxNikKKyUjZGVmaW5lIERFRkFVTFRfUklHSFRTIChXT1JMRF9ERUZBVUxUIHwgR1JPVVBfREVGQVVMVCB8IE9XTkVSX0RFRkFVTFQpCislCislLyogUmVzdWx0IG1hbmlwdWxhdGlvbiBkZWZpbmVzIC4uLiAqLworJSNkZWZpbmUgTklTX1JFU19OVU1PQkooeCkJKCh4KS0+b2JqZWN0cy5vYmplY3RzX2xlbikKKyUjZGVmaW5lIE5JU19SRVNfT0JKRUNUKHgpCSgoeCktPm9iamVjdHMub2JqZWN0c192YWwpCislI2RlZmluZSBOSVNfUkVTX0NPT0tJRSh4KQkoKHgpLT5jb29raWUpCislI2RlZmluZSBOSVNfUkVTX1NUQVRVUyh4KQkoKHgpLT5zdGF0dXMpCislCislLyogVGhlc2UgZGVmaW5lcyBtYWtlIGdldHRpbmcgYXQgdGhlIHZhcmlhbnQgcGFydCBvZiB0aGUgb2JqZWN0IGVhc2llci4gKi8KKyUjZGVmaW5lIFRBX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UudGFfZGF0YQorJSNkZWZpbmUgRU5fZGF0YSB6b19kYXRhLm9iamRhdGFfdS5lbl9kYXRhCislI2RlZmluZSBESV9kYXRhIHpvX2RhdGEub2JqZGF0YV91LmRpX2RhdGEKKyUjZGVmaW5lIExJX2RhdGEgem9fZGF0YS5vYmpkYXRhX3UubGlfZGF0YQorJSNkZWZpbmUgR1JfZGF0YSB6b19kYXRhLm9iamRhdGFfdS5ncl9kYXRhCislCislI2RlZmluZSBfX3R5cGVfb2YobykgKChvKS0+em9fZGF0YS56b190eXBlKQorJQorJS8qIERlY2xhcmF0aW9ucyBmb3IgdGhlIGludGVybmFsIHN1YnJvdXRpbmVzIGluIG5pc2xpYi5jICovCislZW51bSBuYW1lX3BvcyB7U0FNRV9OQU1FLCBISUdIRVJfTkFNRSwgTE9XRVJfTkFNRSwgTk9UX1NFUVVFTlRJQUwsIEJBRF9OQU1FfTsKKyV0eXBlZGVmIGVudW0gbmFtZV9wb3MgbmFtZV9wb3M7CislCislLyoKKyUgKiBEZWZpbmVzIGZvciBnZXR0aW5nIGF0IGNvbHVtbiBkYXRhIGluIGVudHJ5IG9iamVjdHMuIEJlY2F1c2UgUlBDR0VOCislICogZ2VuZXJhdGVzIHNvbWUgcmF0aGVyIHdvcmR5IHN0cnVjdHVyZXMsIHdlIGNyZWF0ZSBzb21lIGRlZmluZXMgdGhhdAorJSAqIGNvbGxhcHNlIHRoZSBuZWVkZWQga2V5c3Ryb2tlcyB0byBhY2Nlc3MgYSBwYXJ0aWN1bGFyIHZhbHVlIHVzaW5nCislICogdGhlc2UgZGVmaW5pdGlvbnMgdGhleSB0YWtlIGFuIG5pc19vYmplY3QgKiwgYW5kIGFuIGludCBhbmQgcmV0dXJuCislICogYSB1X2NoYXIgKiBmb3IgVmFsdWUsIGFuZCBhbiBpbnQgZm9yIGxlbmd0aC4KKyUgKi8KKyUjZGVmaW5lIEVOVFJZX1ZBTChvYmosIGNvbCkgXAorJQkob2JqKS0+RU5fZGF0YS5lbl9jb2xzLmVuX2NvbHNfdmFsW2NvbF0uZWNfdmFsdWUuZWNfdmFsdWVfdmFsCislI2RlZmluZSBFTlRSWV9MRU4ob2JqLCBjb2wpIFwKKyUJKG9iaiktPkVOX2RhdGEuZW5fY29scy5lbl9jb2xzX3ZhbFtjb2xdLmVjX3ZhbHVlLmVjX3ZhbHVlX2xlbgorJQorJQorJQorJSNpZmRlZiBfX2NwbHVzcGx1cworJX0KKyUjZW5kaWYKKyUKKyUvKiBQcm90b3R5cGVzLCBhbmQgZXh0ZXJuIGRlY2xhcmF0aW9ucyBmb3IgdGhlIE5JUyBsaWJyYXJ5IGZ1bmN0aW9ucy4gKi8KKyUjaW5jbHVkZSA8cnBjc3ZjL25pc2xpYi5oPgorJSNlbmRpZiAvKiBfX05JU19SUENHRU5fSCAqLworJS8qIEVESVRfU1RBUlQgKi8KKyUKKyUvKgorJSAqIG5pc18zLmgKKyUgKgorJSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyB0aGF0IGFyZSBvbmx5IG9mIGludGVyZXN0IHRvIHRoZSBhY3R1YWwKKyUgKiBzZXJ2aWNlIGRhZW1vbiBhbmQgY2xpZW50IHN0dWJzLiBOb3JtYWwgdXNlcnMgb2YgTklTIHdpbGwgbm90IGluY2x1ZGUKKyUgKiB0aGlzIGZpbGUuCislICoKKyUgKiBOT1RFIDogVGhpcyBpbmNsdWRlIGZpbGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IGEgY29tYmluYXRpb24KKyUgKiBvZiBycGNnZW4gYW5kIHNlZC4gRE8gTk9UIEVESVQgSVQsIGNoYW5nZSB0aGUgbmlzLnggZmlsZSBpbnN0ZWFkCislICogYW5kIHRoZW4gcmVtYWtlIHRoaXMgZmlsZS4KKyUgKi8KKyUjaWZuZGVmIF9fbmlzXzNfaAorJSNkZWZpbmUgX19uaXNfM19oCislI2lmZGVmIF9fY3BsdXNwbHVzCislZXh0ZXJuICJDIiB7CislI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhNGVkOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlciBvciB3aXRoIHRoZSBleHByZXNzIHdyaXR0ZW4gY29uc2VudCBvZgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisjaWZuZGVmIF9SUENTVkNfTklTX0NBTExCQUNLX0gKKyNkZWZpbmUgX1JQQ1NWQ19OSVNfQ0FMTEJBQ0tfSCAxCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjc3ZjL25pcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgbmlzX29iamVjdCAqb2JqX3A7CisKK3N0cnVjdCBjYmFja19kYXRhIHsKKwlzdHJ1Y3QgeworCQl1X2ludCBlbnRyaWVzX2xlbjsKKwkJb2JqX3AgKmVudHJpZXNfdmFsOworCX0gZW50cmllczsKK307Cit0eXBlZGVmIHN0cnVjdCBjYmFja19kYXRhIGNiYWNrX2RhdGE7CisKKyNkZWZpbmUgQ0JfUFJPRyAxMDAzMDIKKyNkZWZpbmUgQ0JfVkVSUyAxCisKKyNkZWZpbmUgQ0JQUk9DX1JFQ0VJVkUgMQorZXh0ZXJuICBib29sX3QgKiBjYnByb2NfcmVjZWl2ZV8xIChjYmFja19kYXRhICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICBib29sX3QgKiBjYnByb2NfcmVjZWl2ZV8xX3N2YyAoY2JhY2tfZGF0YSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworCisjZGVmaW5lIENCUFJPQ19GSU5JU0ggMgorZXh0ZXJuICB2b2lkICogY2Jwcm9jX2ZpbmlzaF8xICh2b2lkICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICB2b2lkICogY2Jwcm9jX2ZpbmlzaF8xX3N2YyAodm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSBfX1RIUk9XOworCisjZGVmaW5lIENCUFJPQ19FUlJPUiAzCitleHRlcm4gIHZvaWQgKiBjYnByb2NfZXJyb3JfMSAobmlzX2Vycm9yICosIENMSUVOVCAqKSBfX1RIUk9XOworZXh0ZXJuICB2b2lkICogY2Jwcm9jX2Vycm9yXzFfc3ZjIChuaXNfZXJyb3IgKiwgc3RydWN0IHN2Y19yZXEgKikgX19USFJPVzsKK2V4dGVybiBpbnQgY2JfcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KSBfX1RIUk9XOworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCitleHRlcm4gIGJvb2xfdCB4ZHJfb2JqX3AgKFhEUiAqLCBvYmpfcCopIF9fVEhST1c7CitleHRlcm4gIGJvb2xfdCB4ZHJfY2JhY2tfZGF0YSAoWERSICosIGNiYWNrX2RhdGEqKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogIV9SUENWU0NfTklTX0NBTExCQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX2NhbGxiYWNrLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNzg2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19jYWxsYmFjay54CkBAIC0wLDAgKzEsNjUgQEAKKyUvKgorJSAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorJSAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorJSAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCislICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyUgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCislICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIgb3Igd2l0aCB0aGUgZXhwcmVzcyB3cml0dGVuIGNvbnNlbnQgb2YKKyUgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCislICoKKyUgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCislICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCislICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorJSAqCislICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCislICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorJSAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyUgKgorJSAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorJSAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyUgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorJSAqCislICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorJSAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorJSAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCislICoKKyUgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCislICogMjU1MCBHYXJjaWEgQXZlbnVlCislICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyUgKi8KKworLyoKKyAqCW5pc19jYWxsYmFjay54CisgKgorICoJQ29weXJpZ2h0IChjKSAxOTg4LTE5OTIgU3VuIE1pY3Jvc3lzdGVtcyBJbmMKKyAqCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworJSNwcmFnbWEgaWRlbnQJIkAoIyluaXNfY2FsbGJhY2sueAkxLjcJOTQvMDUvMDMgU01JIgorCisvKgorICogIkAoIyl6bnNfY2JhY2sueCAxLjIgOTAvMDkvMTAgQ29weXIgMTk5MCBTdW4gTWljcm8iIAorICoKKyAqIFJQQ0wgZGVzY3JpcHRpb24gb2YgdGhlIENhbGxiYWNrIFNlcnZpY2UuCisgKi8KKworI2lmZGVmIFJQQ19IRFIKKyUjaW5jbHVkZSA8cnBjc3ZjL25pcy5oPgorI2VuZGlmCisjaWZkZWYgUlBDX1hEUgorJSNpbmNsdWRlICJuaXNfY2xudC5oIgorI2VuZGlmCisKK3R5cGVkZWYgbmlzX29iamVjdAkqb2JqX3A7CisKK3N0cnVjdCBjYmFja19kYXRhIHsKKwlvYmpfcAkJZW50cmllczw+OwkvKiBMaXN0IG9mIG9iamVjdHMgKi8KK307CisKK3Byb2dyYW0gQ0JfUFJPRyB7CisJdmVyc2lvbiBDQl9WRVJTIHsKKwkJYm9vbAlDQlBST0NfUkVDRUlWRShjYmFja19kYXRhKSA9IDE7CisJCXZvaWQJQ0JQUk9DX0ZJTklTSCh2b2lkKSA9IDI7CisJCXZvaWQJQ0JQUk9DX0VSUk9SKG5pc19lcnJvcikgPSAzOworCX0gPSAxOworfSA9IDEwMDMwMjsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19vYmplY3QueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc19vYmplY3QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2U3Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX29iamVjdC54CkBAIC0wLDAgKzEsMzAyIEBACisvKgorICoJbmlzX29iamVjdC54CisgKgorICoJQ29weXJpZ2h0IChjKSAxOTg4LTE5OTIgU3VuIE1pY3Jvc3lzdGVtcyBJbmMKKyAqCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworJSNwcmFnbWEgaWRlbnQJIkAoIyluaXNfb2JqZWN0LngJMS4xMgk5Ny8xMS8xOSBTTUkiCisKKyNpZiBSUENfSERSCislCislI2lmbmRlZiBfX25pc19vYmplY3RfaAorJSNkZWZpbmUgX19uaXNfb2JqZWN0X2gKKyUKKyNlbmRpZgorLyoKKyAqIAlUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZm9ybWF0IGZvciBhIE5JUyBvYmplY3QgaW4gUlBDIGxhbmd1YWdlLgorICogSXQgaXMgaW5jbHVkZWQgYnkgdGhlIG1haW4gLnggZmlsZSBhbmQgdGhlIGRhdGFiYXNlIGFjY2VzcyBwcm90b2NvbAorICogZmlsZS4gSXQgaXMgY29tbW9uIGJlY2F1c2UgYm90aCBvZiB0aGVtIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBzYW1lCisgKiB0eXBlIG9mIG9iamVjdC4gR2VuZXJhdGluZyB0aGUgYWN0dWFsIGNvZGUgdGhvdWdoIGlzIGEgYml0IG1lc3N5IGJlY2F1c2UKKyAqIHRoZSBuaXMueCBmaWxlIGFuZCB0aGUgbmlzX2RiYS54IGZpbGUgd2lsbCBnZW5lcmF0ZSB4ZHIgcm91dGluZXMgdG8KKyAqIGVuY29kZS9kZWNvZGUgb2JqZWN0cyB3aGVuIG9ubHkgb25lIHNldCBpcyBuZWVkZWQuIFN1Y2ggaXMgbGlmZSB3aGVuCisgKiBvbmUgaXMgdXNpbmcgcnBjZ2VuLgorICoKKyAqIE5vdGUsIHRoZSBwcm90b2NvbCBkb2Vzbid0IHNwZWNpZnkgYW55IGxpbWl0cyBvbiBzdWNoIHRoaW5ncyBhcworICogbWF4aW11bSBuYW1lIGxlbmd0aCwgbnVtYmVyIG9mIGF0dHJpYnV0ZXMsIGV0Yy4gVGhlc2UgYXJlIGVuZm9yY2VkCisgKiBieSB0aGUgZGF0YWJhc2UgYmFja2VuZC4gV2hlbiB5b3UgaGl0IHRoZW0geW91IHdpbGwgbm8uIEFsc28gc2VlCisgKiB0aGUgZGJfZ2V0bGltaXRzKCkgZnVuY3Rpb24gZm9yIGZldGNoaW5nIHRoZSBsaW1pdCB2YWx1ZXMuCisgKgorICovCisKKy8qIFNvbWUgbWFuaWZlc3QgY29uc3RhbnRzLCBjaG9zZW4gdG8gbWF4aW1pemUgZmxleGliaWxpdHkgd2l0aG91dAorICogcGx1Z2dpbmcgdGhlIHdpcmUgZnVsbCBvZiBkYXRhLgorICovCitjb25zdCBOSVNfTUFYU1RSSU5HTEVOID0gMjU1OworY29uc3QgTklTX01BWE5BTUVMRU4gICA9IDEwMjQ7Citjb25zdCBOSVNfTUFYQVRUUk5BTUUgID0gMzI7Citjb25zdCBOSVNfTUFYQVRUUlZBTCAgID0gMjA0ODsKK2NvbnN0IE5JU19NQVhDT0xVTU5TICAgPSA2NDsKK2NvbnN0IE5JU19NQVhBVFRSICAgICAgPSAxNjsKK2NvbnN0IE5JU19NQVhQQVRIICAgICAgPSAxMDI0OworY29uc3QgTklTX01BWFJFUExJQ0FTICA9IDEyODsKK2NvbnN0IE5JU19NQVhMSU5LUyAgICAgPSAxNjsKKworY29uc3QgTklTX1BLX05PTkUgICAgICA9IDA7CS8qIG5vIHB1YmxpYyBrZXkgKHVuaXgvc3lzIGF1dGgpICovCitjb25zdCBOSVNfUEtfREgJICAgICAgID0gMTsJLyogUHVibGljIGtleSBpcyBEaWZmaWUtSGVsbG1hbiB0eXBlICovCitjb25zdCBOSVNfUEtfUlNBICAgICAgID0gMjsJLyogUHVibGljIGtleSBpZiBSU0EgdHlwZSAqLworY29uc3QgTklTX1BLX0tFUkIgICAgICA9IDM7CS8qIFVzZSBrZXJiZXJvcyBzdHlsZSBhdXRoZW50aWNhdGlvbiAqLworY29uc3QgTklTX1BLX0RIRVhUICAgICA9IDQ7CS8qIEV4dGVuZGVkIERpZmZpZS1IZWxsbWFuIGZvciBSUEMtR1NTICovCisKKy8qCisgKiBUaGUgZnVuZGFtZW50YWwgbmFtZSB0eXBlIG9mIE5JUy4gVGhlIG5hbWUgbWF5IGNvbnNpc3Qgb2YgdHdvIHBhcnRzLAorICogdGhlIGZpcnN0IGJlaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYW5kIHRoZSBzZWNvbmQgYmVpbmcgYW4KKyAqIG9wdGlvbmFsIHNldCBvZiBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMuCisgKi8KK3N0cnVjdCBuaXNfYXR0ciB7CisJc3RyaW5nCXphdHRyX25keDw+OwkvKiBuYW1lIG9mIHRoZSBpbmRleCAJCSovCisJb3BhcXVlCXphdHRyX3ZhbDw+OwkvKiBWYWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gCSovCit9OworCit0eXBlZGVmIHN0cmluZyBuaXNfbmFtZTw+OwkvKiBUaGUgTklTIG5hbWUgaXRzZWxmLiAqLworCisvKiBOSVMgb2JqZWN0IHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24uIFRoZSBudW1iZXJzCisgKiB0aGV5IHVzZSBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzY2hlbWUgOgorICoJCSAgICAgMCAtIDEwMjMgYXJlIHJlc2VydmVkIGZvciBTdW4sCisgKiAJCTEwMjQgLSAyMDQ3IGFyZSBkZWZpbmVkIHRvIGJlIHByaXZhdGUgdG8gYSBwYXJ0aWN1bGFyIHRyZWUuCisgKgkJMjA0OCAtIDQwOTUgYXJlIGRlZmluZWQgdG8gYmUgdXNlciBkZWZpbmVkLgorICoJCTQwOTYgLSAuLi4gIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqCisgKiBFT0wgQWxlcnQgLSBUaGUgbm9uLXByZWZpeGVkIG5hbWVzIGFyZSBwcmVzZW50IGZvciBiYWNrd2FyZAorICogY29tcGF0YWJpbGl0eSBvbmx5LCBhbmQgd2lsbCBub3QgZXhpc3QgaW4gZnV0dXJlIHJlbGVhc2VzLiBVc2UKKyAqIHRoZSBOSVNfKiBuYW1lcyBmb3IgZnV0dXJlIGNvbXBhdGFiaWxpdHkuCisgKi8KKworZW51bSB6b3R5cGVzIHsKKworCUJPR1VTX09CSiAgCT0gMCwJLyogVW5pbml0aWFsaXplZCBvYmplY3Qgc3RydWN0dXJlIAkqLworCU5PX09CSiAgIAk9IDEsCS8qIE5VTEwgb2JqZWN0IChubyBkYXRhKQkgCSovCisJRElSRUNUT1JZX09CSiAJPSAyLAkvKiBEaXJlY3Rvcnkgb2JqZWN0IGRlc2NyaWJpbmcgZG9tYWluIAkqLworCUdST1VQX09CSiAgCT0gMywJLyogR3JvdXAgb2JqZWN0IChhIGxpc3Qgb2YgbmFtZXMpIAkqLworCVRBQkxFX09CSiAgCT0gNCwJLyogVGFibGUgb2JqZWN0IChhIGRhdGFiYXNlIHNjaGVtYSkgCSovCisJRU5UUllfT0JKICAJPSA1LAkvKiBFbnRyeSBvYmplY3QgKGEgZGF0YWJhc2UgcmVjb3JkKSAJKi8KKwlMSU5LX09CSiAgIAk9IDYsIAkvKiBBIG5hbWUgbGluay4JCQkJKi8KKwlQUklWQVRFX09CSiAgCT0gNywgCS8qIFByaXZhdGUgb2JqZWN0IChhbGwgb3BhcXVlIGRhdGEpIAkqLworCisJTklTX0JPR1VTX09CSiAgCT0gMCwJLyogVW5pbml0aWFsaXplZCBvYmplY3Qgc3RydWN0dXJlIAkqLworCU5JU19OT19PQkogICAJPSAxLAkvKiBOVUxMIG9iamVjdCAobm8gZGF0YSkJIAkqLworCU5JU19ESVJFQ1RPUllfT0JKID0gMiwgLyogRGlyZWN0b3J5IG9iamVjdCBkZXNjcmliaW5nIGRvbWFpbiAJKi8KKwlOSVNfR1JPVVBfT0JKICAJPSAzLAkvKiBHcm91cCBvYmplY3QgKGEgbGlzdCBvZiBuYW1lcykgCSovCisJTklTX1RBQkxFX09CSiAgCT0gNCwJLyogVGFibGUgb2JqZWN0IChhIGRhdGFiYXNlIHNjaGVtYSkgCSovCisJTklTX0VOVFJZX09CSiAgCT0gNSwJLyogRW50cnkgb2JqZWN0IChhIGRhdGFiYXNlIHJlY29yZCkgCSovCisJTklTX0xJTktfT0JKCT0gNiwgCS8qIEEgbmFtZSBsaW5rLgkJCQkqLworCU5JU19QUklWQVRFX09CSiAgPSA3IC8qIFByaXZhdGUgb2JqZWN0IChhbGwgb3BhcXVlIGRhdGEpICovCit9OworCisvKgorICogVGhlIHR5cGVzIG9mIE5hbWUgc2VydmljZXMgTklTIGtub3dzIGFib3V0LiBUaGV5IGFyZSBlbnVtZXJhdGVkCisgKiBoZXJlLiBUaGUgQmluZGVyIGNvZGUgd2lsbCB1c2UgdGhpcyB0eXBlIHRvIGRldGVybWluZSBpZiBpdCBoYXMKKyAqIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgdGhhdCB3aWxsIGFjY2VzcyB0aGUgaW5kaWNhdGVkIG5hbWUgc2VydmljZS4KKyAqLworZW51bSBuc3R5cGUgeworCVVOS05PV04gPSAwLAorCU5JUyA9IDEsCS8qIE5pcyBQbHVzIFNlcnZpY2UJCSovCisJU1VOWVAgPSAyLAkvKiBPbGQgTklTIFNlcnZpY2UJCSovCisJSVZZID0gMywJLyogTmlzIFBsdXMgUGx1cyBTZXJ2aWNlCSovCisJRE5TID0gNCwJLyogRG9tYWluIE5hbWUgU2VydmljZQkJKi8KKwlYNTAwID0gNSwJLyogSVNPL0NDQ0lUIFguNTAwIFNlcnZpY2UJKi8KKwlETkFOUyA9IDYsCS8qIERpZ2l0YWwgREVDTmV0IE5hbWUgU2VydmljZQkqLworCVhDSFMgPSA3LAkvKiBYZXJveCBDbGVhcmluZ0hvdXNlIFNlcnZpY2UJKi8KKwlDRFM9IDgKK307CisKKy8qCisgKiBESVJFQ1RPUlkgLSBUaGUgbmFtZSBzZXJ2aWNlIG9iamVjdC4gVGhlc2Ugb2JqZWN0cyBpZGVudGlmeSBvdGhlciBuYW1lCisgKiBzZXJ2ZXJzIHRoYXQgYXJlIHNlcnZpbmcgc29tZSBwb3J0aW9uIG9mIHRoZSBuYW1lIHNwYWNlLiBFYWNoIGhhcyBhCisgKiB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIHJlc29sdmVyIGxpYnJhcnkgd2lsbCBub3RlIHdoZXRoZXIgb3Igbm90CisgKiBpcyBoYXMgdGhlIG5lZWRlZCByb3V0aW5lcyB0byBhY2Nlc3MgdGhhdCB0eXBlIG9mIHNlcnZpY2UuCisgKiBUaGUgb2FybWFzayBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhY2Nlc3MgcmlnaHRzIG1hc2sgb24gYSBwZXIgb2JqZWN0CisgKiB0eXBlIGJhc2lzIGZvciB0aGUgbmFtZSBzcGFjZXMuIFRoZSBvbmx5IGJpdHMgY3VycmVudGx5IHVzZWQgYXJlCisgKiBjcmVhdGUgYW5kIGRlc3Ryb3kuIEJ5IGVuYWJsaW5nIG9yIGRpc2FibGluZyB0aGVzZSBhY2Nlc3MgcmlnaHRzIGZvcgorICogYSBzcGVjaWZpYyBvYmplY3QgdHlwZSBmb3IgYSBvbmUgb2YgdGhlIGFjY2Vzc29yIGVudGl0aWVzIChvd25lciwKKyAqIGdyb3VwLCB3b3JsZCkgdGhlIGFkbWluaXN0cmF0b3IgY2FuIGNvbnRyb2wgd2hhdCB0eXBlcyBvZiBvYmplY3RzCisgKiBtYXkgYmUgZnJlZWx5IGFkZGVkIHRvIHRoZSBuYW1lIHNwYWNlIGFuZCB3aGljaCByZXF1aXJlIHRoZQorICogYWRtaW5pc3RyYXRvcidzIGFwcHJvdmFsLgorICovCitzdHJ1Y3Qgb2FyX21hc2sgeworCXVpbnQzMl90CW9hX3JpZ2h0czsJLyogQWNjZXNzIHJpZ2h0cyBtYXNrIAkqLworCXpvdHlwZXMJCW9hX290eXBlOwkvKiBPYmplY3QgdHlwZSAJCSovCit9OworCitzdHJ1Y3QgZW5kcG9pbnQgeworCXN0cmluZwkJdWFkZHI8PjsKKwlzdHJpbmcJCWZhbWlseTw+OyAgIC8qIFRyYW5zcG9ydCBmYW1pbHkgKElORVQsIE9TSSwgZXRjKSAqLworCXN0cmluZwkJcHJvdG88PjsgICAgLyogUHJvdG9jb2wgKFRDUCwgVURQLCBDTE5QLCAgZXRjKSAgICovCit9OworCisvKgorICogTm90ZTogcGtleSBpcyBhIG5ldG9iaiB3aGljaCBpcyBsaW1pdGVkIHRvIDEwMjQgYnl0ZXMgd2hpY2ggbGltaXRzIHRoZQorICoga2V5c2l6ZSB0byA4MTkyIGJpdHMuIFRoaXMgaXMgY29uc2lkZXIgdG8gYmUgYSByZWFzb25hYmxlIGxpbWl0IGZvcgorICogdGhlIGV4cGVjdGVkIGxpZmV0aW1lIG9mIHRoaXMgc2VydmljZS4KKyAqLworc3RydWN0IG5pc19zZXJ2ZXIgeworCW5pc19uYW1lCW5hbWU7IAkgCS8qIFByaW5jaXBhbCBuYW1lIG9mIHRoZSBzZXJ2ZXIgICovCisJZW5kcG9pbnQJZXA8PjsgIAkJLyogVW5pdmVyc2FsIGFkZHIocykgZm9yIHNlcnZlciAgKi8KKwl1aW50MzJfdAlrZXlfdHlwZTsJLyogUHVibGljIGtleSB0eXBlCQkgKi8KKwluZXRvYmoJCXBrZXk7CQkvKiBzZXJ2ZXIncyBwdWJsaWMga2V5ICAJICovCit9OworCitzdHJ1Y3QgZGlyZWN0b3J5X29iaiB7CisJbmlzX25hbWUgICBkb19uYW1lOwkgLyogTmFtZSBvZiB0aGUgZGlyZWN0b3J5IGJlaW5nIHNlcnZlZCAgICovCisJbnN0eXBlCSAgIGRvX3R5cGU7CSAvKiBvbmUgb2YgTklTLCBETlMsIElWWSwgWVAsIG9yIFguNTAwIAkgKi8KKwluaXNfc2VydmVyIGRvX3NlcnZlcnM8PjsgLyogPDA+ID09IFByaW1hcnkgbmFtZSBzZXJ2ZXIgICAgIAkgKi8KKwl1aW50MzJfdCAgIGRvX3R0bDsJIC8qIFRpbWUgVG8gTGl2ZSAoZm9yIGNhY2hlcykgCQkgKi8KKwlvYXJfbWFzayAgIGRvX2FybWFzazw+OyAgLyogQ3JlYXRlL0Rlc3Ryb3kgcmlnaHRzIGJ5IG9iamVjdCB0eXBlICovCit9OworCisvKgorICogRU5UUlkgLSBUaGlzIGlzIG9uZSByb3cgb2YgZGF0YSBmcm9tIGFuIGluZm9ybWF0aW9uIGJhc2UuCisgKiBUaGUgdHlwZSB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBjbGllbnQgbGlicmFyeSB0byBjb252ZXJ0IHRoZSBlbnRyeSB0bworICogaXQncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgcmVwcmVzZW50YXRpb24uIFRoZSBUYWJsZSBuYW1lIGlzIGEgYmFjayBwb2ludGVyCisgKiB0byB0aGUgdGFibGUgd2hlcmUgdGhlIGVudHJ5IGlzIHN0b3JlZC4gVGhpcyBhbGxvd3MgdGhlIGNsaWVudCBsaWJyYXJ5CisgKiB0byBkZXRlcm1pbmUgd2hlcmUgdG8gc2VuZCBhIHJlcXVlc3QgaWYgdGhlIGNsaWVudCB3aXNoZXMgdG8gY2hhbmdlIHRoaXMKKyAqIGVudHJ5IGJ1dCBnb3QgdG8gaXQgdGhyb3VnaCBhIExJTksgcmF0aGVyIHRoYW4gZGlyZWN0bHkuCisgKiBJZiB0aGUgZW50cnkgaXMgYSAic3RhbmRhbG9uZSIgZW50cnkgdGhlbiB0aGlzIGZpZWxkIGlzIHZvaWQuCisgKi8KK2NvbnN0IEVOX0JJTkFSWSAgID0gMTsJLyogSW5kaWNhdGVzIHZhbHVlIGlzIGJpbmFyeSBkYXRhIAkqLworY29uc3QgRU5fQ1JZUFQgICAgPSAyOwkvKiBJbmRpY2F0ZXMgdGhlIHZhbHVlIGlzIGVuY3J5cHRlZAkqLworY29uc3QgRU5fWERSICAgICAgPSA0OwkvKiBJbmRpY2F0ZXMgdGhlIHZhbHVlIGlzIFhEUiBlbmNvZGVkCSovCitjb25zdCBFTl9NT0RJRklFRCA9IDg7CS8qIEluZGljYXRlcyBlbnRyeSBpcyBtb2RpZmllZC4gCSovCitjb25zdCBFTl9BU04xICAgICA9IDY0OwkvKiBNZWFucyBjb250ZW50cyB1c2UgQVNOLjEgZW5jb2RpbmcgICAgKi8KKworc3RydWN0IGVudHJ5X2NvbCB7CisJdWludDMyX3QJZWNfZmxhZ3M7CS8qIEZsYWdzIGZvciB0aGlzIHZhbHVlICovCisJb3BhcXVlCQllY192YWx1ZTw+OwkvKiBJdCdzIHRleHR1YWwgdmFsdWUJKi8KK307CisKK3N0cnVjdCBlbnRyeV9vYmogeworCXN0cmluZyAJZW5fdHlwZTw+OwkvKiBUeXBlIG9mIGVudHJ5IHN1Y2ggYXMgInBhc3N3ZCIgKi8KKwllbnRyeV9jb2wgZW5fY29sczw+OwkvKiBWYWx1ZSBmb3IgdGhlIGVudHJ5CQkgICovCit9OworCisvKgorICogR1JPVVAgLSBUaGUgZ3JvdXAgb2JqZWN0IGNvbnRhaW5zIGEgbGlzdCBvZiBOSVMgcHJpbmNpcGFsIG5hbWVzLiBHcm91cHMKKyAqIGFyZSB1c2VkIHRvIGF1dGhvcml6ZSBwcmluY2lwYWxzLiBFYWNoIG9iamVjdCBoYXMgYSBzZXQgb2YgYWNjZXNzIHJpZ2h0cworICogZm9yIG1lbWJlcnMgb2YgaXRzIGdyb3VwLiBQcmluY2lwYWwgbmFtZXMgaW4gZ3JvdXBzIGFyZSBpbiB0aGUgZm9ybQorICogbmFtZS5kaXJlY3RvcnkgYW5kIHJlY3Vyc2l2ZSBncm91cHMgYXJlIGV4cHJlc3NlZCBhcyBAZ3JvdXBuYW1lLmRpcmVjdG9yeQorICovCitzdHJ1Y3QgZ3JvdXBfb2JqIHsKKwl1aW50MzJfdAlncl9mbGFnczsJLyogRmxhZ3MgY29udHJvbGxpbmcgZ3JvdXAJKi8KKwluaXNfbmFtZQlncl9tZW1iZXJzPD47ICAJLyogTGlzdCBvZiBuYW1lcyBpbiBncm91cCAJKi8KK307CisKKy8qCisgKiBMSU5LIC0gVGhpcyBpcyB0aGUgTElOSyBvYmplY3QuIEl0IGlzIHF1aXRlIHNpbWlsYXIgdG8gYSBzeW1ib2xpYyBsaW5rCisgKiBpbiB0aGUgVU5JWCBmaWxlc3lzdGVtLiBUaGUgYXR0cmlidXRlcyBpbiB0aGUgbWFpbiBvYmplY3Qgc3RydWN0dXJlIGFyZQorICogcmVsYXRpdmUgdG8gdGhlIExJTksgZGF0YSBhbmQgbm90IHdoYXQgaXQgcG9pbnRzIHRvIChsaWtlIHRoZSBmaWxlIHN5c3RlbSkKKyAqICJtb2RpZnkiIHByaXZsZWdlcyBoZXJlIGluZGljYXRlIHRoZSByaWdodCB0byBtb2RpZnkgd2hhdCB0aGUgbGluayBwb2ludHMKKyAqIGF0IGFuZCBub3QgdG8gbW9kaWZ5IHRoYXQgYWN0dWFsIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBsaW5rLgorICovCitzdHJ1Y3QgbGlua19vYmogeworCXpvdHlwZXMJIGxpX3J0eXBlOwkvKiBSZWFsIHR5cGUgb2YgdGhlIG9iamVjdAkqLworCW5pc19hdHRyIGxpX2F0dHJzPD47CS8qIEF0dHJpYnV0ZS9WYWx1ZXMgZm9yIHRhYmxlcwkqLworCW5pc19uYW1lIGxpX25hbWU7IAkvKiBUaGUgb2JqZWN0J3MgcmVhbCBOSVMgbmFtZQkqLworfTsKKworLyoKKyAqIFRBQkxFIC0gVGhpcyBpcyB0aGUgdGFibGUgb2JqZWN0LiBJdCBpbXBsZW1lbnRzIGEgc2ltcGxlCisgKiBkYXRhIGJhc2UgdGhhdCBhcHBsaWNhdGlvbnMgYW5kIHVzZSBmb3IgY29uZmlndXJhdGlvbiBvcgorICogYWRtaW5pc3RyYXRpb24gcHVycG9zZXMuIFRoZSByb2xlIG9mIHRoZSB0YWJsZSBpcyB0byBncm91cCB0b2dldGhlcgorICogYSBzZXQgb2YgcmVsYXRlZCBlbnRyaWVzLiBUYWJsZXMgYXJlIHRoZSBzaW1wbGUgZGF0YWJhc2UgY29tcG9uZW50CisgKiBvZiBOSVMuIExpa2UgbWFueSBkYXRhYmFzZXMsIHRhYmxlcyBhcmUgbG9naWNhbGx5IGRpdmlkZWQgaW50byBjb2x1bW5zCisgKiBhbmQgcm93cy4gVGhlIGNvbHVtbnMgYXJlIGxhYmVsZWQgd2l0aCBpbmRleGVzIGFuZCBlYWNoIEVOVFJZIG1ha2VzCisgKiB1cCBhIHJvdy4gUm93cyBtYXkgYmUgYWRkcmVzc2VkIHdpdGhpbiB0aGUgdGFibGUgYnkgc2VsZWN0aW5nIG9uZQorICogb3IgbW9yZSBpbmRleGVzLCBhbmQgdmFsdWVzIGZvciB0aG9zZSBpbmRleGVzLiBFYWNoIHJvdyB3aGljaCBoYXMKKyAqIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIGRlc2lyZWQgdmFsdWUgaXMgcmV0dXJuZWQuCisgKiBXaXRoaW4gdGhlIGRlZmluaXRpb24gb2YgZWFjaCBjb2x1bW4gdGhlcmUgaXMgYSBmbGFncyB2YXJpYWJsZSwgdGhpcworICogdmFyaWFibGUgY29udGFpbnMgZmxhZ3Mgd2hpY2ggZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBjb2x1bW4gaXMKKyAqIHNlYXJjaGFibGUsIGNvbnRhaW5zIGJpbmFyeSBkYXRhLCBhbmQgYWNjZXNzIHJpZ2h0cyBmb3IgdGhlIGVudHJ5IG9iamVjdHMKKyAqIGNvbHVtbiB2YWx1ZS4KKyAqLworCitjb25zdCBUQV9CSU5BUlkgICAgID0gMTsJLyogTWVhbnMgdGFibGUgZGF0YSBpcyBiaW5hcnkgCQkqLworY29uc3QgVEFfQ1JZUFQgICAgICA9IDI7CS8qIE1lYW5zIHZhbHVlIHNob3VsZCBiZSBlbmNyeXB0ZWQgCSovCitjb25zdCBUQV9YRFIgICAgICAgID0gNDsJLyogTWVhbnMgdmFsdWUgaXMgWERSIGVuY29kZWQJCSovCitjb25zdCBUQV9TRUFSQ0hBQkxFID0gODsJLyogTWVhbnMgdGhpcyBjb2x1bW4gaXMgc2VhcmNoYWJsZQkqLworY29uc3QgVEFfQ0FTRSAgICAgICA9IDE2OwkvKiBNZWFucyB0aGlzIGNvbHVtbiBpcyBDYXNlIFNlbnNpdGl2ZQkqLworY29uc3QgVEFfTU9ESUZJRUQgICA9IDMyOwkvKiBNZWFucyB0aGlzIGNvbHVtbnMgYXR0cnMgYXJlIG1vZGlmaWVkKi8KK2NvbnN0IFRBX0FTTjEgICAgICAgPSA2NDsJLyogTWVhbnMgY29udGVudHMgdXNlIEFTTi4xIGVuY29kaW5nICAgICAqLworCitzdHJ1Y3QgdGFibGVfY29sIHsKKwlzdHJpbmcJCXRjX25hbWU8NjQ+OwkvKiBDb2x1bW4gTmFtZSAJIAkgICAqLworCXVpbnQzMl90CXRjX2ZsYWdzOwkvKiBjb250cm9sIGZsYWdzCSAgICovCisJdWludDMyX3QJdGNfcmlnaHRzOwkvKiBBY2Nlc3MgcmlnaHRzIG1hc2sJICAgKi8KK307CisKK3N0cnVjdCB0YWJsZV9vYmogeworCXN0cmluZyAJICB0YV90eXBlPDY0PjsJIC8qIFRhYmxlIHR5cGUgc3VjaCBhcyAicGFzc3dkIgkqLworCWludAkgIHRhX21heGNvbDsJIC8qIFRvdGFsIG51bWJlciBvZiBjb2x1bW5zCSovCisJdV9jaGFyCSAgdGFfc2VwOwkgLyogU2VwYXJhdG9yIGNoYXJhY3RlciAJKi8KKwl0YWJsZV9jb2wgdGFfY29sczw+OyAJIC8qIFRoZSBudW1iZXIgb2YgdGFibGUgaW5kZXhlcyAqLworCXN0cmluZwkgIHRhX3BhdGg8PjsJIC8qIEEgc2VhcmNoIHBhdGggZm9yIHRoaXMgdGFibGUgKi8KK307CisKKy8qCisgKiBUaGlzIHVuaW9uIGpvaW5zIHRvZ2V0aGVyIGFsbCBvZiB0aGUgY3VycmVudGx5IGtub3duIG9iamVjdHMuCisgKi8KK3VuaW9uIG9iamRhdGEgc3dpdGNoICh6b3R5cGVzIHpvX3R5cGUpIHsKKyAgICAgICAgY2FzZSBOSVNfRElSRUNUT1JZX09CSiA6CisgICAgICAgICAgICAgICAgc3RydWN0IGRpcmVjdG9yeV9vYmogZGlfZGF0YTsKKyAgICAgICAgY2FzZSBOSVNfR1JPVVBfT0JKIDoKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JvdXBfb2JqIGdyX2RhdGE7CisgICAgICAgIGNhc2UgTklTX1RBQkxFX09CSiA6CisgICAgICAgICAgICAgICAgc3RydWN0IHRhYmxlX29iaiB0YV9kYXRhOworICAgICAgICBjYXNlIE5JU19FTlRSWV9PQko6CisgICAgICAgICAgICAgICAgc3RydWN0IGVudHJ5X29iaiBlbl9kYXRhOworICAgICAgICBjYXNlIE5JU19MSU5LX09CSiA6CisgICAgICAgICAgICAgICAgc3RydWN0IGxpbmtfb2JqIGxpX2RhdGE7CisgICAgICAgIGNhc2UgTklTX1BSSVZBVEVfT0JKIDoKKyAgICAgICAgICAgICAgICBvcGFxdWUJcG9fZGF0YTw+OworCWNhc2UgTklTX05PX09CSiA6CisJCXZvaWQ7CisgICAgICAgIGNhc2UgTklTX0JPR1VTX09CSiA6CisJCXZvaWQ7CisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIHZvaWQ7Cit9OworCisvKgorICogVGhpcyBpcyB0aGUgYmFzaWMgTklTIG9iamVjdCBkYXRhIHR5cGUuIEl0IGNvbnNpc3RzIG9mIGEgZ2VuZXJpYyBwYXJ0CisgKiB3aGljaCBhbGwgb2JqZWN0cyBjb250YWluLCBhbmQgYSBzcGVjaWFsaXplZCBwYXJ0IHdoaWNoIHZhcmllcyBkZXBlbmRpbmcKKyAqIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuIEFsbCBvZiB0aGUgc3BlY2lhbGl6ZWQgc2VjdGlvbnMgaGF2ZSBiZWVuCisgKiBkZXNjcmliZWQgYWJvdmUuIFlvdSBtaWdodCBoYXZlIHdvbmRlcmVkIHdoeSB0aGV5IGFsbCBzdGFydCB3aXRoIGFuCisgKiBpbnRlZ2VyIHNpemUsIGZvbGxvd2VkIGJ5IHRoZSB1c2VmdWwgZGF0YS4gVGhlIGFuc3dlciBpcywgd2hlbiB0aGUKKyAqIHNlcnZlciBkb2Vzbid0IHJlY29nbml6ZSB0aGUgdHlwZSByZXR1cm5lZCBpdCB0cmVhdHMgaXQgYXMgb3BhcXVlIGRhdGEuCisgKiBBbmQgdGhlIGRlZmluaXRpb24gZm9yIG9wYXF1ZSBkYXRhIGlzIHtpbnQgc2l6ZTsgY2hhciAqZGF0YTt9LiBJbiB0aGlzCisgKiB3YXksIHNlcnZlcnMgYW5kIHV0aWxpdHkgcm91dGluZXMgdGhhdCBkbyBub3QgdW5kZXJzdGFuZCBhIGdpdmVuIHR5cGUKKyAqIG1heSBzdGlsbCBwYXNzIGl0IGFyb3VuZC4gT25lIGhhcyB0byBiZSBjYXJlZnVsIGluIHNldHRpbmcKKyAqIHRoaXMgdmFyaWFibGUgYWNjdXJhdGVseSwgaXQgbXVzdCB0YWtlIGludG8gYWNjb3VudCBzdWNoIHRoaW5ncyBhcworICogWERSIHBhZGRpbmcgb2Ygc3RydWN0dXJlcyBldGMuIFRoZSBiZXN0IHdheSB0byBzZXQgaXQgaXMgdG8gbm90ZSBvbmUncworICogcG9zaXRpb24gaW4gdGhlIFhEUiBlbmNvZGluZyBzdHJlYW0sIGVuY29kZSB0aGUgc3RydWN0dXJlLCBsb29rIGF0IHRoZQorICogbmV3IHBvc2l0aW9uIGFuZCBjYWxjdWxhdGUgdGhlIHNpemUuCisgKi8KK3N0cnVjdCBuaXNfb2lkIHsKKwl1aW50MzJfdCBjdGltZTsJCS8qIFRpbWUgb2Ygb2JqZWN0cyBjcmVhdGlvbiAJKi8KKwl1aW50MzJfdCBtdGltZTsJCS8qIFRpbWUgb2Ygb2JqZWN0cyBtb2RpZmljYXRpb24gKi8KK307CisKK3N0cnVjdCBuaXNfb2JqZWN0IHsKKwluaXNfb2lkCSB6b19vaWQ7CS8qIG9iamVjdCBpZGVudGl0eSB2ZXJpZmllci4JCSovCisJbmlzX25hbWUgem9fbmFtZTsJLyogVGhlIE5JUyBuYW1lIGZvciB0aGlzIG9iamVjdAkJKi8KKwluaXNfbmFtZSB6b19vd25lcjsJLyogTklTIG5hbWUgb2Ygb2JqZWN0IG93bmVyLgkJKi8KKwluaXNfbmFtZSB6b19ncm91cDsJLyogTklTIG5hbWUgb2YgYWNjZXNzIGdyb3VwLgkJKi8KKwluaXNfbmFtZSB6b19kb21haW47CS8qIFRoZSBhZG1pbmlzdHJhdG9yIGZvciB0aGUgb2JqZWN0CSovCisJdWludDMyX3Qgem9fYWNjZXNzOwkvKiBBY2Nlc3MgcmlnaHRzIChvd25lciwgZ3JvdXAsIHdvcmxkKQkqLworCXVpbnQzMl90IHpvX3R0bDsJLyogT2JqZWN0J3MgdGltZSB0byBsaXZlIGluIHNlY29uZHMuCSovCisJb2JqZGF0YQkgem9fZGF0YTsJLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIHRoaXMgdHlwZSAJKi8KK307CisjaWYgUlBDX0hEUgorJQorJSNlbmRpZiAvKiBpZiBfX25pc19vYmplY3RfaCAqLworJQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9uaXNfdGFncy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX3RhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI0MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzX3RhZ3MuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgU3VuIE1pY3Jvc3lzdGVtcyBJbmMuCisgKi8KKworLyoKKyAqCW5pc190YWdzLmgKKyAqCisgKglUaGlzIGZpbGUgY29udGFpbnMgdGhlIHRhZ3MgYW5kIHN0YXRpc3RpY3MgZGVmaW5pdGlvbnMuIEl0IGlzCisgKglhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGJ5IG5pcy5oCisgKi8KKworI2lmbmRlZglfUlBDU1ZDX05JU19UQUdTX0gKKyNkZWZpbmUJX1JQQ1NWQ19OSVNfVEFHU19ICisKKyNpZiAwCisjcHJhZ21hIGlkZW50CSJAKCMpbmlzX3RhZ3MuaAkxLjE2CTk2LzEwLzI1IFNNSSIKKyNlbmRpZgorLyogZnJvbSBmaWxlOiB6bnNfdGFncy5oCTEuNyBDb3B5cmlnaHQgKGMpIDE5OTAgU3VuIE1pY3Jvc3lzdGVtcyAqLworCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZQlOSVNfRElSCSJkYXRhIgorCisvKiBMb29rdXAgYW5kIExpc3QgZnVuY3Rpb24gZmxhZ3MgKi8KKyNkZWZpbmUJRk9MTE9XX0xJTktTCSgxPDwwKQkvKiBGb2xsb3cgbGluayBvYmplY3RzIAkJCSovCisjZGVmaW5lCUZPTExPV19QQVRICSgxPDwxKQkvKiBGb2xsb3cgdGhlIHBhdGggaW4gYSB0YWJsZSAJCSovCisjZGVmaW5lCUhBUkRfTE9PS1VQCSgxPDwyKQkvKiBCbG9jayB1bnRpbCBzdWNjZXNzZnVsIAkJKi8KKyNkZWZpbmUJQUxMX1JFU1VMVFMJKDE8PDMpCS8qIFJldHJpZXZlIGFsbCByZXN1bHRzIAkJKi8KKyNkZWZpbmUJTk9fQ0FDSEUJKDE8PDQpCS8qIERvIG5vdCByZXR1cm4gJ2NhY2hlZCcgcmVzdWx0cyAJKi8KKyNkZWZpbmUJTUFTVEVSX09OTFkJKDE8PDUpCS8qIEdldCB2YWx1ZSBvbmx5IGZyb20gbWFzdGVyIHNlcnZlcgkqLworI2RlZmluZQlFWFBBTkRfTkFNRQkoMTw8NikJLyogRXhwYW5kIHBhcnRpdGlhbGx5IHF1YWxpZmllZCBuYW1lcwkqLworCisvKiBTZW1hbnRpYyBtb2RpZmljYXRpb24gZm9yIHRhYmxlIG9wZXJhdGlvbnMgZmxhZ3MgKi8KKyNkZWZpbmUJUkVUVVJOX1JFU1VMVAkoMTw8NykJLyogUmV0dXJuIHJlc3VsdGluZyBvYmplY3QgdG8gY2xpZW50ICAgICovCisjZGVmaW5lCUFERF9PVkVSV1JJVEUJKDE8PDgpCS8qIEFsbG93IG92ZXJ3cml0ZXMgb24gQURECQkqLworI2RlZmluZQlSRU1fTVVMVElQTEUJKDE8PDkpCS8qIEFsbG93IHdpbGRjYXJkIGRlbGV0ZXMJCSovCisjZGVmaW5lCU1PRF9TQU1FT0JKCSgxPDwxMCkJLyogQ2hlY2sgbW9kaWZpZWQgb2JqZWN0IGJlZm9yZSB3cml0ZQkqLworI2RlZmluZQlBRERfUkVTRVJWRUQJKDE8PDExKQkvKiBTcGFyZSBBREQgc2VtYW50aWMJCQkqLworI2RlZmluZQlSRU1fUkVTRVJWRUQJKDE8PDEyKQkvKiBTcGFyZSBSRU0gc2VtYW50aWMJCQkqLworI2RlZmluZQlNT0RfRVhDTFVTSVZFCSgxPDwxMykJLyogTW9kaWZ5IG5vIG92ZXJ3cml0ZSBvbiBtb2RpZmllZCBrZXlzICovCisKKy8qIExvb2t1cCBhbmQgTGlzdCBmdW5jdGlvbiBmbGFncyAoY29udGludWVkKSAqLworI2RlZmluZQlTT0ZUX0xPT0tVUAkoMTw8MTQpCS8qIFRoZSAib2xkIGRlZmF1bHQiIHJldHVybiBvbiBmYWlsdXJlICAqLworCisvKiBUcmFuc3BvcnQgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0byB0aGUgb3BlcmF0aW9uICovCisjZGVmaW5lCVVTRV9ER1JBTQkoMTw8MTYpIC8qIFVzZSBhIGRhdGFncmFtIHRyYW5zcG9ydCAJCSovCisjZGVmaW5lCU5PX0FVVEhJTkZPCSgxPDwxNykgLyogRG9uJ3QgYm90aGVyIGF0dGFjaGluZyBhdXRoIGluZm8JKi8KKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgInN0YW5kYXJkIiBOSVMrIHRhZ3MKKyAqIFN0YXRlIHZhcmlhYmxlIHRhZ3MgaGF2ZSB2YWx1ZXMJMCAtIDIwNDcKKyAqIFN0YXRpc3RpYyB0YWdzIGhhdmUgdmFsdWVzCQkyMDQ4IC0gNjU1MzUKKyAqIFVzZXIgVGFncyBoYXZlIHZhbHVlcwkJPjJeMTYKKyAqLworI2RlZmluZQlUQUdfREVCVUcJMQkvKiBzZXQgZGVidWcgbGV2ZWwgCQkqLworI2RlZmluZQlUQUdfU1RBVFMJMgkvKiBFbmFibGUvZGlzYWJsZSBzdGF0aXN0aWNzIAkqLworI2RlZmluZQlUQUdfR0NBQ0hFCTMJLyogRmx1c2ggdGhlIEdyb3VwIENhY2hlCSovCisjZGVmaW5lCVRBR19HQ0FDSEVfQUxMCVRBR19HQ0FDSEUKKyNkZWZpbmUJVEFHX0RDQUNIRQk0CS8qIEZsdXNoIHRoZSBkaXJlY3RvcnkgY2FjaGUJKi8KKyNkZWZpbmUJVEFHX0RDQUNIRV9PTkUJVEFHX0RDQUNIRQorI2RlZmluZQlUQUdfT0NBQ0hFCTUJLyogRmx1c2ggdGhlIE9iamVjdCBDYWNoZQkqLworI2RlZmluZQlUQUdfU0VDVVJFCTYJLyogU2V0IHRoZSBzZWN1cml0eSBsZXZlbCAJKi8KKyNkZWZpbmUJVEFHX1RDQUNIRV9PTkUJNwkvKiBGbHVzaCB0aGUgdGFibGUgY2FjaGUJKi8KKyNkZWZpbmUJVEFHX0RDQUNIRV9BTEwJOAkvKiBGbHVzaCBlbnRpcmUgZGlyZWN0b3J5IGNhY2hlCSovCisjZGVmaW5lCVRBR19UQ0FDSEVfQUxMCTkJLyogRmx1c2ggZW50aXJlIHRhYmxlIGNhY2hlCSovCisjZGVmaW5lCVRBR19HQ0FDSEVfT05FCTEwCS8qIEZsdXNoIG9uZSBncm91cCBvYmplY3QJKi8KKyNkZWZpbmUJVEFHX0RDQUNIRV9PTkVfUkVGUkVTSCAxMSAvKiBGbHVzaCBhbmQgcmVmcmVzaCBvbmUgRE8JKi8KKyNkZWZpbmUJVEFHX1JFQURPTkxZCTEyCS8qIFNldCByZWFkIG9ubHkgbW9kZQkJKi8KKyNkZWZpbmUJVEFHX1JFQURXUklURQkxNAkvKiBSZXNldCByZWFkLXdyaXRlIG1vZGUJKi8KKworI2RlZmluZQlUQUdfT1BTVEFUUwkyMDQ4CS8qIE5JUysgb3BlcmF0aW9ucyBzdGF0aXN0aWNzICAgKi8KKyNkZWZpbmUJVEFHX1RIUkVBRFMJMjA0OQkvKiBDaGlsZCBwcm9jZXNzL3RocmVhZCBzdGF0dXMgICovCisjZGVmaW5lCVRBR19IRUFQCTIwNTAJLyogSGVhcCB1c2FnZSBzdGF0aXN0aWNzCSovCisjZGVmaW5lCVRBR19VUERBVEVTCTIwNTEJLyogVXBkYXRlcyB0byB0aGlzIHNlcnZpY2UJKi8KKyNkZWZpbmUJVEFHX1ZJU0lCTEUJMjA1MgkvKiBGaXJzdCB1cGRhdGUgdGhhdCBpc24ndCByZXBsaWNhdGVkICovCisjZGVmaW5lCVRBR19TX0RDQUNIRQkyMDUzCS8qIERpcmVjdG9yeSBjYWNoZSBzdGF0aXN0aWNzCSovCisjZGVmaW5lCVRBR19TX09DQUNIRQkyMDU0CS8qIE9iamVjdCBjYWNoZSBzdGF0aXN0aWNzCSovCisjZGVmaW5lCVRBR19TX0dDQUNIRQkyMDU1CS8qIEdyb3VwIGNhY2hlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1NfU1RPUkFHRQkyMDU2CS8qIEdyb3VwIGNhY2hlIHN0YXRpc3RpY3MJKi8KKyNkZWZpbmUJVEFHX1VQVElNRQkyMDU3CS8qIFRpbWUgdGhhdCBzZXJ2ZXIgaGFzIGJlZW4gdXAgKi8KKyNkZWZpbmUJVEFHX0RJUkxJU1QJMjA1OAkvKiBEaXIgc2VydmVkIGJ5IHRoaXMgc2VydmVyICAgICovCisjZGVmaW5lCVRBR19OSVNDT01QQVQJMjA1OQkvKiBXaGV0aGVyIHN1cHBvcnRzIE5JUyBjb21wYXQgbW9kZSAqLworI2RlZmluZQlUQUdfRE5TRk9SV0FSRElORyAyMDYwCS8qIFdoZXRoZXIgRE5TIGZvcndhcmRpbmcgc3VwcG9ydGVkICovCisjZGVmaW5lCVRBR19TRUNVUklUWV9MRVZFTCAyMDYxCS8qIFNlY3VyaXR5IGxldmVsIG9mIHRoZSBzZXJ2ZXIJKi8KKyNkZWZpbmUJVEFHX1JPT1RTRVJWRVIJMjA2MgkvKiBXaGV0aGVyIHJvb3Qgc2VydmVyCQkqLworCisvKgorICogRGVjbGFyYXRpb25zIGZvciB0aGUgR3JvdXAgb2JqZWN0IGZsYWdzLiBDdXJyZW50bHkKKyAqIHRoZXJlIGFyZSBvbmx5IDMuCisgKi8KKyNkZWZpbmUJSU1QTUVNX0dST1VQUyAgMQkvKiBJbXBsaWNpdCBNZW1iZXJzaGlwIGFsbG93ZWQgCSovCisjZGVmaW5lCVJFQ1VSU19HUk9VUFMgIDIJLyogUmVjdXJzaXZlIEdyb3VwcyBhbGxvd2VkIAkqLworI2RlZmluZQlORUdNRU1fR1JPVVBTICA0CS8qIE5lZ2F0aXZlIEdyb3VwcyBhbGxvd2VkCSovCisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgkvKiBfUlBDU1ZDX05JU19UQUdTX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc2xpYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvbmlzbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5MjdlYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25pc2xpYi5oCkBAIC0wLDAgKzEsMjg3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDYsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFRob3JzdGVuIEt1a3VrIDxrdWt1a0BzdXNlLmRlPiwgMTk5Ny4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX19SUENTVkNfTklTTElCX0hfXworI2RlZmluZQlfX1JQQ1NWQ19OSVNMSUJfSF9fCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKK3R5cGVkZWYgY29uc3QgY2hhciAqY29uc3RfbmlzX25hbWU7CisKKy8qIG5pc19uYW1lczogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGxvY2F0ZSBhbmQgbWFuaXB1bGF0ZSBhbGwgTklTKworICogb2JqZWN0cyBleGNlcHQgdGhlIE5JUysgZW50cnkgb2JqZWN0cy4KKyAqCisgKiBuaXNfbG9va3VwIChuYW1lLCBmbGFncykgcmVzb2x2ZXMgYSBOSVMrIG5hbWUgYW5kIHJldHVybnMgYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBvYmplY3QgIGZyb20gYSBOSVMrIHNlcnZlci4KKyAqICAgIGNvbnN0IG5pc19uYW1lIG5hbWU6IG5hbWUgb2YgdGhlIG9iamVjdCB0byBiZSByZXNvbHZlZAorICogICAgdW5zaWduZWQgaW50IGZsYWdzOiBsb2dpY2FsbHkgT1JpbmcgemVybyBvciBtb3JlIGZsYWdzIChGT0xMT1dfTElOS1MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSEFSRF9MT09LVVAsIFtOT19DQUNIRV0sIE1BU1RFUl9PTkxZLCBFWFBBTkRfTkFNRSkKKyAqCisgKiBuaXNfYWRkIChuYW1lLCBvYmopIGFkZHMgb2JqZWN0cyB0byB0aGUgTklTKyBuYW1lc3BhY2UuCisgKiAgICBjb25zdCBuaXNfbmFtZSBuYW1lOiBmdWxseSBxdWFsaWZpZWQgTklTKyBuYW1lLgorICogICAgY29uc3QgbmlzX29iamVjdCAqb2JqOiBvYmplY3QgbWVtYmVycyB6b19uYW1lIGFuZCB6b19kb21haW4gd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RlZCBmcm9tIG5hbWUuCisgKgorICogbmlzX3JlbW92ZSAobmFtZSwgb2JqKSByZW1vdmVzIG9iamVjdHMgZnJvbSB0aGUgTklTKyBuYW1lc3BhY2UuCisgKiAgICBjb25zdCBuaXNfbmFtZSBuYW1lOiBmdWxseSBxdWFsaWZpZWQgTklTKyBuYW1lLgorICogICAgY29uc3QgbmlzX29iamVjdCAqb2JqOiBpZiBub3QgTlVMTCwgaXQgaXMgYXNzdW1lZCB0byBwb2ludCB0byBhIGNvcHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG9iamVjdCBiZWluZyByZW1vdmVkLiBJbiB0aGlzIGNhc2UsIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvYmplY3Qgb24gdGhlIHNlcnZlciBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpZGVudGlmaWVyIGFzIHRoZSAgb2JqZWN0ICBiZWluZyAgcGFzc2VkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCB3aXRoIHRoZSBOSVNfTk9UU0FNRU9CSgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci4KKyAqCisgKiBuaXNfbW9kaWZ5IChuYW1lLCBvYmopIGNhbiBjaGFuZ2Ugc3BlY2lmaWMgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbmFtZXNwYWNlLgorICovCitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX2xvb2t1cCAoY29uc3RfbmlzX25hbWUgbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzKQorICAgICBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19hZGQgKGNvbnN0X25pc19uYW1lIG5hbWUsIGNvbnN0IG5pc19vYmplY3QgKm9iaikKKyAgICAgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfcmVtb3ZlIChjb25zdF9uaXNfbmFtZSBuYW1lLAorCQkJICAgICAgIGNvbnN0IG5pc19vYmplY3QgKm9iaikgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfbW9kaWZ5IChjb25zdF9uaXNfbmFtZSBuYW1lLAorCQkJICAgICAgIGNvbnN0IG5pc19vYmplY3QgKm9iaikgX19USFJPVzsKKworLyogbmlzX3RhYmxlczogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHNlYXJjaCBhbmQgbW9kaWZ5IE5JUysgdGFibGVzLgorICoKKyAqIG5pc19saXN0ICh0YWJsZV9uYW1lLCBmbGFncywgY2FsbGJhY2sodGFibGVfbmFtZSwgb2JqLCB1c2VyZGF0YSksIHVzZXJkYXRhKQorICogICAgICAgICAgIHNlYXJjaCBhIHRhYmxlIGluIHRoZSBOSVMrIG5hbWVzcGFjZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIHRhYmxlX25hbWU6IGluZGV4ZWQgbmFtZSAoW3h4PXl5XSx0YWJsZS5kaXIpCisgKiAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6IGxvZ2ljYWxseSBPUmluZyBvbmUgb3IgbW9yZSBmbGFncyAoRk9MTE9XX0xJTktTLAorICogICAgICAgICAgICAgICAgICAgICAgW0ZPTExPV19QQVRIXSwgSEFSRF9MT09LVVAsIFtBTExfUkVTVUxUU10sIFtOT19DQUNIRV0sCisgKiAgICAgICAgICAgICAgICAgICAgICBNQVNURVJfT05MWSwgRVhQQU5EX05BTUUsIFJFVFVSTl9SRVNVTFQpCisgKiAgICBjYWxsYmFjaygpOiBjYWxsYmFjayBpcyBhbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsCisgKiAgICAgICAgICAgICAgICBwcm9jZXNzIHRoZSBFTlRSWSB0eXBlIG9iamVjdHMgdGhhdCBhcmUgcmV0dXJuZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgIHNlYXJjaC4gSWYgdGhpcyBwb2ludGVyIGlzIE5VTEwsIHRoZW4gYWxsIGVudHJpZXMgdGhhdCBtYXRjaAorICogICAgICAgICAgICAgICAgdGhlIHNlYXJjaCBjcml0ZXJpYSBhcmUgcmV0dXJuZWQgaW4gdGhlIG5pc19yZXN1bHQgc3RydWN0dXJlLAorICogICAgICAgICAgICAgICAgb3RoZXJ3aXNlICB0aGlzICBmdW5jdGlvbiAgd2lsbCAgYmUgIGNhbGxlZCBvbmNlIGZvciBlYWNoCisgKiAgICAgICAgICAgICAgICBlbnRyeSByZXR1cm5lZC4KKyAqICAgIHZvaWQgKnVzZXJkYXRhOiBwYXNzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24gYWxvbmcgd2l0aCB0aGUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICAgICAgICBlbnRyeSBvYmplY3QuCisgKgorICogbmlzX2FkZF9lbnRyeSAodGFibGVfbmFtZSwgb2JqLCBmbGFncykgd2lsbCBhZGQgdGhlIE5JUysgb2JqZWN0IHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklTKyB0YWJsZV9uYW1lLgorICogICAgY29uc3QgbmlzX25hbWUgdGFibGVfbmFtZQorICogICAgY29uc3QgbmlzX29iamVjdCAqb2JqCisgKiAgICB1bnNpZ25lZCBpbnQgZmxhZ3M6IDAsIEFERF9PVkVSV1JJVEUsIFJFVFVSTl9SRVNVTFQKKyAqCisgKiBuaXNfbW9kaWZ5X2VudHJ5IChuYW1lLCBvYmosIGZsYWdzKSBtb2RpZmllcyBhbiBvYmplY3QgaWRlbnRpZmllZCBieSBuYW1lLgorICogICAgY29uc3QgbmlzX25hbWUgbmFtZTogb2JqZWN0IGlkZW50aWZpZXIKKyAqICAgIGNvbnN0IG5pc19vYmplY3QgKm9iajogc2hvdWxkIHBvaW50IHRvIGFuIGVudHJ5IHdpdGggdGhlIEVOX01PRElGSUVECisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgc2V0IGluIGVhY2ggY29sdW1uIHRoYXQgY29udGFpbnMgbmV3CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLgorICogICAgdW5zaWduZWQgaW50IGZsYWdzOiAwLCBNT0RfU0FNRU9CSiwgUkVUVVJOX1JFU1VMVAorICoKKyAqIG5pc19yZW1vdmVfZW50cnkgKHRhYmxlX25hbWUsIG9iaiwgZmxhZ3MpIHJlbW92ZXMgYSBzZXQgb2YgZW50cmllcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IHRhYmxlX25hbWUgZnJvbSB0aGUgdGFibGUuCisgKiAgICBjb25zdCBuaXNfbmFtZSB0YWJsZV9uYW1lOiBpbmRleGVkIE5JUysgbmFtZQorICogICAgY29uc3QgbmlzX29iamVjdCAqb2JqOiBpZiBvYmogaXMgbm9uLW51bGwsIGl0IGlzIHByZXN1bWVkIHRvIHBvaW50IHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY2FjaGVkIGNvcHkgb2YgdGhlIGVudHJ5LiBXaGVuIHRoZSByZW1vdmFsIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZCwgYW5kIHRoZSBvYmplY3QgdGhhdCB3b3VsZCBiZSByZW1vdmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY2FjaGVkIG9iamVjdCBwb2ludGVkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IG9iamVjdCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIHdpdGggYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgTklTX05PVFNBTUVPQkogZXJyb3IKKyAqICAgIHVuc2lnbmVkIGludCBmbGFnczogMCwgUkVNX01VTFRJUExFCisgKgorICogbmlzX2ZpcnN0X2VudHJ5ICh0YWJsZV9uYW1lKSBmZXRjaGVzIGVudHJpZXMgZnJvbSBhIHRhYmxlIG9uZSBhdCBhIHRpbWUuCisgKiAgICBjb25zdCBuaXNfbmFtZSB0YWJsZV9uYW1lCisgKgorICogbmlzX25leHRfZW50cnkgKHRhYmxlX25hbWUsIGNvb2tpZSkgcmV0cmlldmVzIHRoZSAibmV4dCIgZW50cnkgZnJvbSBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSBzcGVjaWZpZWQgYnkgdGFibGVfbmFtZS4KKyAqICAgIGNvbnN0IG5pc19uYW1lIHRhYmxlX25hbWU6CisgKiAgICBjb25zdCBuZXRvYmogKmNvb2tpZTogVGhlIHZhbHVlIG9mIGNvb2tpZSBmcm9tIHRoZSBuaXNfcmVzdWx0IHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0gdGhlIHByZXZpb3VzIGNhbGwuCisgKi8KK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfbGlzdCAoY29uc3RfbmlzX25hbWUgbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJICAgICBpbnQgKCpjYWxsYmFjaykoY29uc3RfbmlzX25hbWUgdGFibGVfbmFtZSwKKwkJCQkJICAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmosCisJCQkJCSAgICAgY29uc3Qgdm9pZCAqdXNlcmRhdGEpLAorCQkJICAgICBjb25zdCB2b2lkICp1c2VyZGF0YSkgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfYWRkX2VudHJ5IChjb25zdF9uaXNfbmFtZSB0YWJsZV9uYW1lLAorCQkJCSAgY29uc3QgbmlzX29iamVjdCAqb2JqLAorCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19tb2RpZnlfZW50cnkgKGNvbnN0X25pc19uYW1lIG5hbWUsCisJCQkJICAgICBjb25zdCBuaXNfb2JqZWN0ICpvYmosCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX3JlbW92ZV9lbnRyeSAoY29uc3RfbmlzX25hbWUgdGFibGVfbmFtZSwKKwkJCQkgICAgIGNvbnN0IG5pc19vYmplY3QgKm9iaiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfZmlyc3RfZW50cnkgKGNvbnN0X25pc19uYW1lIHRhYmxlX25hbWUpIF9fVEhST1c7CitleHRlcm4gbmlzX3Jlc3VsdCAqbmlzX25leHRfZW50cnkgKGNvbnN0X25pc19uYW1lIHRhYmxlX25hbWUsCisJCQkJICAgY29uc3QgbmV0b2JqICpjb29raWUpIF9fVEhST1c7CisvKgorKiogbmlzX3NlcnZlcgorKi8KK2V4dGVybiBuaXNfZXJyb3IgbmlzX21rZGlyIChjb25zdF9uaXNfbmFtZSBkaXJuYW1lLAorCQkJICAgIGNvbnN0IG5pc19zZXJ2ZXIgKm1hY2hpbmUpIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc19ybWRpciAoY29uc3RfbmlzX25hbWUgZGlybmFtZSwKKwkJCSAgICBjb25zdCBuaXNfc2VydmVyICptYWNoaW5lKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfc2VydnN0YXRlIChjb25zdCBuaXNfc2VydmVyICptYWNoaW5lLAorCQkJCWNvbnN0IG5pc190YWcgKnRhZ3MsIGludCBudW10YWdzLAorCQkJCW5pc190YWcgKipyZXN1bHQpIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc19zdGF0cyAoY29uc3QgbmlzX3NlcnZlciAqbWFjaGluZSwKKwkJCSAgICBjb25zdCBuaXNfdGFnICp0YWdzLCBpbnQgbnVtdGFncywKKwkJCSAgICBuaXNfdGFnICoqcmVzdWx0KSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWV0YWdzIChuaXNfdGFnICp0YWdzLCBpbnQgbnVtdGFncykgX19USFJPVzsKK2V4dGVybiBuaXNfc2VydmVyICoqbmlzX2dldHNlcnZsaXN0IChjb25zdF9uaXNfbmFtZSBkaXJuYW1lKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVzZXJ2bGlzdCAobmlzX3NlcnZlciAqKm1hY2hpbmVzKSBfX1RIUk9XOworCisvKgorKiogbmlzX3N1YnIKKyovCitleHRlcm4gbmlzX25hbWUgbmlzX2xlYWZfb2YgKGNvbnN0X25pc19uYW1lIG5hbWUpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2xlYWZfb2ZfciAoY29uc3RfbmlzX25hbWUgbmFtZSwgY2hhciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBidWZsZW4pIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX25hbWVfb2YgKGNvbnN0X25pc19uYW1lIG5hbWUpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX25hbWVfb2ZfciAoY29uc3RfbmlzX25hbWUgbmFtZSwgY2hhciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBidWZsZW4pIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2RvbWFpbl9vZiAoY29uc3RfbmlzX25hbWUgbmFtZSkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfZG9tYWluX29mX3IgKGNvbnN0X25pc19uYW1lIG5hbWUsIGNoYXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGJ1ZmxlbikgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSAqbmlzX2dldG5hbWVzIChjb25zdF9uaXNfbmFtZSBuYW1lKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVuYW1lcyAobmlzX25hbWUgKm5hbWVsaXN0KSBfX1RIUk9XOworZXh0ZXJuIG5hbWVfcG9zIG5pc19kaXJfY21wIChjb25zdF9uaXNfbmFtZSBuMSwgY29uc3RfbmlzX25hbWUgbjIpIF9fVEhST1c7CitleHRlcm4gbmlzX29iamVjdCAqbmlzX2Nsb25lX29iamVjdCAoY29uc3QgbmlzX29iamVjdCAqc3JjLAorCQkJCSAgICAgbmlzX29iamVjdCAqZGVzdCkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19kZXN0cm95X29iamVjdCAobmlzX29iamVjdCAqb2JqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X29iamVjdCAoY29uc3QgbmlzX29iamVjdCAqb2JqKSBfX1RIUk9XOworCisvKgorKiogbmlzX2xvY2FsX25hbWVzCisqLworZXh0ZXJuIG5pc19uYW1lIG5pc19sb2NhbF9ncm91cCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBuaXNfbmFtZSBuaXNfbG9jYWxfZGlyZWN0b3J5ICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIG5pc19sb2NhbF9wcmluY2lwYWwgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gbmlzX25hbWUgbmlzX2xvY2FsX2hvc3QgKHZvaWQpIF9fVEhST1c7CisKKy8qCisqKiBuaXNfZXJyb3IKKyovCitleHRlcm4gY29uc3QgY2hhciAqbmlzX3NwZXJybm8gKGNvbnN0IG5pc19lcnJvciBzdGF0dXMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcGVycm9yIChjb25zdCBuaXNfZXJyb3Igc3RhdHVzLCBjb25zdCBjaGFyICpsYWJlbCkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19sZXJyb3IgKGNvbnN0IG5pc19lcnJvciBzdGF0dXMsIGNvbnN0IGNoYXIgKmxhYmVsKSBfX1RIUk9XOworZXh0ZXJuIGNoYXIgKm5pc19zcGVycm9yIChjb25zdCBuaXNfZXJyb3Igc3RhdHVzLCBjb25zdCBjaGFyICpsYWJlbCkgX19USFJPVzsKK2V4dGVybiBjaGFyICpuaXNfc3BlcnJvcl9yIChjb25zdCBuaXNfZXJyb3Igc3RhdHVzLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCSAgICBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4pIF9fVEhST1c7CisvKgorKiogbmlzX2dyb3VwcworKi8KK2V4dGVybiBib29sX3QgbmlzX2lzbWVtYmVyIChjb25zdF9uaXNfbmFtZSBwcmluY2lwYWwsCisJCQkgICAgY29uc3RfbmlzX25hbWUgZ3JvdXApIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc19hZGRtZW1iZXIgKGNvbnN0X25pc19uYW1lIG1lbWJlciwKKwkJCQljb25zdF9uaXNfbmFtZSBncm91cCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgbmlzX3JlbW92ZW1lbWJlciAoY29uc3RfbmlzX25hbWUgbWVtYmVyLAorCQkJCSAgIGNvbnN0X25pc19uYW1lIGdyb3VwKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfY3JlYXRlZ3JvdXAgKGNvbnN0X25pc19uYW1lIGdyb3VwLAorCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzKSBfX1RIUk9XOworZXh0ZXJuIG5pc19lcnJvciBuaXNfZGVzdHJveWdyb3VwIChjb25zdF9uaXNfbmFtZSBncm91cCkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF9ncm91cF9lbnRyeSAoY29uc3RfbmlzX25hbWUgZ3JvdXApIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIG5pc192ZXJpZnlncm91cCAoY29uc3RfbmlzX25hbWUgZ3JvdXApIF9fVEhST1c7CisKKy8qCisqKiBuaXNfcGluZworKi8KK2V4dGVybiB2b2lkIG5pc19waW5nIChjb25zdF9uaXNfbmFtZSBkaXJuYW1lLCB1aW50MzJfdCB1dGltZSwKKwkJICAgICAgY29uc3QgbmlzX29iamVjdCAqZGlyb2JqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19yZXN1bHQgKm5pc19jaGVja3BvaW50IChjb25zdF9uaXNfbmFtZSBkaXJuYW1lKSBfX1RIUk9XOworCisvKgorKiogbmlzX3ByaW50IChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBTSE9VTEQgTk9UIEJFIFVTRUQgISEpCisqLworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X3Jlc3VsdCAoY29uc3QgbmlzX3Jlc3VsdCAqcmVzdWx0KSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X3JpZ2h0cyAodW5zaWduZWQgaW50IHJpZ2h0cykgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF9kaXJlY3RvcnkgKGNvbnN0IGRpcmVjdG9yeV9vYmogKmRpcm9iaikgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19wcmludF9ncm91cCAoY29uc3QgZ3JvdXBfb2JqICpncnBvYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfdGFibGUgKGNvbnN0IHRhYmxlX29iaiAqdGJsb2JqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX3ByaW50X2xpbmsgKGNvbnN0IGxpbmtfb2JqICpsbmtvYmopIF9fVEhST1c7CitleHRlcm4gdm9pZCBuaXNfcHJpbnRfZW50cnkgKGNvbnN0IGVudHJ5X29iaiAqZW5vYmopIF9fVEhST1c7CisKKy8qCisqKiBuaXNfZmlsZSAoWFhYIElOVEVSTkFMIEZVTkNUSU9OUywgU0hPVUxEIE5PVCBCRSBVU0VEICEhKQorKi8KK2V4dGVybiBkaXJlY3Rvcnlfb2JqICpyZWFkQ29sZFN0YXJ0RmlsZSAodm9pZCkgX19USFJPVzsKK2V4dGVybiBib29sX3Qgd3JpdGVDb2xkU3RhcnRGaWxlIChjb25zdCBkaXJlY3Rvcnlfb2JqICpkaXJvYmopIF9fVEhST1c7CitleHRlcm4gbmlzX29iamVjdCAqbmlzX3JlYWRfb2JqIChjb25zdCBjaGFyICpvYmopIF9fVEhST1c7CitleHRlcm4gYm9vbF90IG5pc193cml0ZV9vYmogKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IG5pc19vYmplY3QgKm9iaikgX19USFJPVzsKKworLyoKKyoqIG5pc19jbG9uZSAtIChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBTSE9VTEQgTk9UIEJFIFVTRUQgISEpCisqLworZXh0ZXJuIGRpcmVjdG9yeV9vYmogKm5pc19jbG9uZV9kaXJlY3RvcnkgKGNvbnN0IGRpcmVjdG9yeV9vYmogKnNyYywKKwkJCQkJICAgZGlyZWN0b3J5X29iaiAqZGVzdCkgX19USFJPVzsKK2V4dGVybiBuaXNfcmVzdWx0ICpuaXNfY2xvbmVfcmVzdWx0IChjb25zdCBuaXNfcmVzdWx0ICpzcmMsCisJCQkJICAgICBuaXNfcmVzdWx0ICpkZXN0KSBfX1RIUk9XOworCisvKiBuaXNfZnJlZSAtIG5pc19mcmVlcmVzdWx0ICovCitleHRlcm4gdm9pZCBuaXNfZnJlZXJlc3VsdCAobmlzX3Jlc3VsdCAqcmVzdWx0KSBfX1RIUk9XOworLyogKFhYWCBUSEUgRk9MTE9XSU5HIEFSRSBJTlRFUk5BTCBGVU5DVElPTlMsIFNIT1VMRCBOT1QgQkUgVVNFRCAhISkgKi8KK2V4dGVybiB2b2lkIG5pc19mcmVlX3JlcXVlc3QgKGliX3JlcXVlc3QgKnJlcSkgX19USFJPVzsKK2V4dGVybiB2b2lkIG5pc19mcmVlX2RpcmVjdG9yeSAoZGlyZWN0b3J5X29iaiAqZGlyb2JqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgbmlzX2ZyZWVfb2JqZWN0IChuaXNfb2JqZWN0ICpvYmopIF9fVEhST1c7CisKKy8qIChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBTSE9VTEQgTk9UIEJFIFVTRUQgISEpICovCitleHRlcm4gbmlzX25hbWUgX19uaXNfZGVmYXVsdF9vd25lciAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIG5pc19uYW1lIF9fbmlzX2RlZmF1bHRfZ3JvdXAgKGNoYXIgKikgX19USFJPVzsKK2V4dGVybiB1aW50MzJfdCBfX25pc19kZWZhdWx0X3R0bCAoY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX25pc19kZWZhdWx0X2FjY2VzcyAoY2hhciAqLCB1bnNpZ25lZCBpbnQpIF9fVEhST1c7CitleHRlcm4gZmRfcmVzdWx0ICpfX25pc19maW5kZGlyZWN0b3J5IChkaXJlY3Rvcnlfb2JqICosIGNvbnN0X25pc19uYW1lKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgX19mcmVlX2ZkcmVzdWx0IChmZF9yZXN1bHQgKikgX19USFJPVzsKK2V4dGVybiB1aW50MzJfdCBfX25pc19oYXNoIChjb25zdCB2b2lkICprZXlhcmcsIHJlZ2lzdGVyIHNpemVfdCBsZW4pIF9fVEhST1c7CisKKy8qIE5JUysgY2FjaGUgbG9ja2luZyAqLworZXh0ZXJuIGludCBfX25pc19sb2NrX2NhY2hlICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIGludCBfX25pc191bmxvY2tfY2FjaGUgKHZvaWQpIF9fVEhST1c7CisKKy8qIChYWFggSU5URVJOQUwgRlVOQ1RJT05TLCBPTkxZIEZPUiBycGMubmlzZCBBTkQgZ2xpYmMgISEpICovCisjaWYgZGVmaW5lZCAoTklTX0lOVEVSTkFMKSB8fCBkZWZpbmVkIChfTElCQykKKworc3RydWN0IGRpcl9iaW5kaW5nCit7CisgIENMSUVOVCAqY2xudDsgICAgICAgICAgICAgICAgICAvKiBSUEMgQ0xJRU5UIGhhbmRsZSAqLworICBuaXNfc2VydmVyICpzZXJ2ZXJfdmFsOyAgICAgICAgLyogTGlzdCBvZiBzZXJ2ZXJzICovCisgIHVuc2lnbmVkIGludCBzZXJ2ZXJfbGVuOyAgICAgICAvKiAjIG9mIHNlcnZlcnMgKi8KKyAgdW5zaWduZWQgaW50IHNlcnZlcl91c2VkOyAgICAgIC8qIFdoaWNoIHNlcnZlciB3ZSBhcmUgYmluZCBpbiB0aGUgbW9tZW50ID8gKi8KKyAgdW5zaWduZWQgaW50IGN1cnJlbnRfZXA7ICAgICAgIC8qIFdoaWNoIGVuZHBvaW50IG9mIHRoZSBzZXJ2ZXIgYXJlIGluIHVzZT8gKi8KKyAgdW5zaWduZWQgaW50IHRyeXM7ICAgICAgICAgICAgIC8qIEhvdyBtYW55IHNlcnZlciBoYXZlIHdlIHRyaWVkID8gKi8KKyAgdW5zaWduZWQgaW50IGNsYXNzOyAgICAgICAgICAgIC8qIEZyb20gd2hpY2ggY2xhc3MgaXMgc2VydmVyX3ZhbCA/ICovCisgIGJvb2xfdCBtYXN0ZXJfb25seTsgICAgICAgICAgICAvKiBJcyBvbmx5IGJpbmRlZCB0byB0aGUgbWFzdGVyICovCisgIGJvb2xfdCB1c2VfYXV0aDsgICAgICAgICAgICAgICAvKiBEbyB3ZSB1c2UgQVVUSCA/ICovCisgIGJvb2xfdCB1c2VfdWRwOyAgICAgICAgICAgICAgICAvKiBEbyB3ZSB1c2UgVURQID8gKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7ICAgICAgIC8qIFNlcnZlcidzIElQIGFkZHJlc3MgKi8KKyAgaW50IHNvY2tldDsgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZlcidzIGxvY2FsIHNvY2tldCAqLworfTsKK3R5cGVkZWYgc3RydWN0IGRpcl9iaW5kaW5nIGRpcl9iaW5kaW5nOworCitleHRlcm4gbmlzX2Vycm9yIF9fbmlzYmluZF9jcmVhdGUgKGRpcl9iaW5kaW5nICosIGNvbnN0IG5pc19zZXJ2ZXIgKiwKKwkJCQkgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAorCQkJCSAgIHVuc2lnbmVkIGludCkgX19USFJPVzsKK2V4dGVybiBuaXNfZXJyb3IgX19uaXNiaW5kX2Nvbm5lY3QgKGRpcl9iaW5kaW5nICopIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIF9fbmlzYmluZF9uZXh0IChkaXJfYmluZGluZyAqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgX19uaXNiaW5kX2Rlc3Ryb3kgKGRpcl9iaW5kaW5nICopIF9fVEhST1c7CitleHRlcm4gbmlzX2Vycm9yIF9fbmlzZmluZF9zZXJ2ZXIgKGNvbnN0X25pc19uYW1lLCBpbnQsIGRpcmVjdG9yeV9vYmogKiosCisJCQkJICAgZGlyX2JpbmRpbmcgKiwgdW5zaWduZWQgaW50KSBfX1RIUk9XOworCisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9fUlBDU1ZDX05JU0xJQl9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25sbV9wcm90LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjBhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC5oCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX05MTV9QUk9UX0hfUlBDR0VOCisjZGVmaW5lIF9OTE1fUFJPVF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBMTV9NQVhTVFJMRU4gMTAyNAorI2RlZmluZSBNQVhOQU1FTEVOIExNX01BWFNUUkxFTisxCisKK2VudW0gbmxtX3N0YXRzIHsKKwlubG1fZ3JhbnRlZCA9IDAsCisJbmxtX2RlbmllZCA9IDEsCisJbmxtX2RlbmllZF9ub2xvY2tzID0gMiwKKwlubG1fYmxvY2tlZCA9IDMsCisJbmxtX2RlbmllZF9ncmFjZV9wZXJpb2QgPSA0LAorfTsKK3R5cGVkZWYgZW51bSBubG1fc3RhdHMgbmxtX3N0YXRzOworCitzdHJ1Y3QgbmxtX2hvbGRlciB7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlpbnQgc3ZpZDsKKwluZXRvYmogb2g7CisJdV9pbnQgbF9vZmZzZXQ7CisJdV9pbnQgbF9sZW47Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX2hvbGRlciBubG1faG9sZGVyOworCitzdHJ1Y3QgbmxtX3Rlc3RycGx5IHsKKwlubG1fc3RhdHMgc3RhdDsKKwl1bmlvbiB7CisJCXN0cnVjdCBubG1faG9sZGVyIGhvbGRlcjsKKwl9IG5sbV90ZXN0cnBseV91OworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV90ZXN0cnBseSBubG1fdGVzdHJwbHk7CisKK3N0cnVjdCBubG1fc3RhdCB7CisJbmxtX3N0YXRzIHN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3N0YXQgbmxtX3N0YXQ7CisKK3N0cnVjdCBubG1fcmVzIHsKKwluZXRvYmogY29va2llOworCW5sbV9zdGF0IHN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3JlcyBubG1fcmVzOworCitzdHJ1Y3QgbmxtX3Rlc3RyZXMgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3Rlc3RycGx5IHN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3Rlc3RyZXMgbmxtX3Rlc3RyZXM7CisKK3N0cnVjdCBubG1fbG9jayB7CisJY2hhciAqY2FsbGVyX25hbWU7CisJbmV0b2JqIGZoOworCW5ldG9iaiBvaDsKKwlpbnQgc3ZpZDsKKwl1X2ludCBsX29mZnNldDsKKwl1X2ludCBsX2xlbjsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fbG9jayBubG1fbG9jazsKKworc3RydWN0IG5sbV9sb2NrYXJncyB7CisJbmV0b2JqIGNvb2tpZTsKKwlib29sX3QgYmxvY2s7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7CisJYm9vbF90IHJlY2xhaW07CisJaW50IHN0YXRlOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9sb2NrYXJncyBubG1fbG9ja2FyZ3M7CisKK3N0cnVjdCBubG1fY2FuY2FyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbF90IGJsb2NrOworCWJvb2xfdCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9jYW5jYXJncyBubG1fY2FuY2FyZ3M7CisKK3N0cnVjdCBubG1fdGVzdGFyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbF90IGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3Rlc3RhcmdzIG5sbV90ZXN0YXJnczsKKworc3RydWN0IG5sbV91bmxvY2thcmdzIHsKKwluZXRvYmogY29va2llOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fdW5sb2NrYXJncyBubG1fdW5sb2NrYXJnczsKKy8qCisgKiBUaGUgZm9sbG93aW5nIGVudW1zIGFyZSBhY3R1YWxseSBiaXQgZW5jb2RlZCBmb3IgZWZmaWNpZW50CisgKiBib29sZWFuIGFsZ2VicmEuLi4uIERPTidUIGNoYW5nZSB0aGVtLi4uLi4KKyAqLworCitlbnVtIGZzaF9tb2RlIHsKKwlmc21fRE4gPSAwLAorCWZzbV9EUiA9IDEsCisJZnNtX0RXID0gMiwKKwlmc21fRFJXID0gMywKK307Cit0eXBlZGVmIGVudW0gZnNoX21vZGUgZnNoX21vZGU7CisKK2VudW0gZnNoX2FjY2VzcyB7CisJZnNhX05PTkUgPSAwLAorCWZzYV9SID0gMSwKKwlmc2FfVyA9IDIsCisJZnNhX1JXID0gMywKK307Cit0eXBlZGVmIGVudW0gZnNoX2FjY2VzcyBmc2hfYWNjZXNzOworCitzdHJ1Y3QgbmxtX3NoYXJlIHsKKwljaGFyICpjYWxsZXJfbmFtZTsKKwluZXRvYmogZmg7CisJbmV0b2JqIG9oOworCWZzaF9tb2RlIG1vZGU7CisJZnNoX2FjY2VzcyBhY2Nlc3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3NoYXJlIG5sbV9zaGFyZTsKKworc3RydWN0IG5sbV9zaGFyZWFyZ3MgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3NoYXJlIHNoYXJlOworCWJvb2xfdCByZWNsYWltOworfTsKK3R5cGVkZWYgc3RydWN0IG5sbV9zaGFyZWFyZ3MgbmxtX3NoYXJlYXJnczsKKworc3RydWN0IG5sbV9zaGFyZXJlcyB7CisJbmV0b2JqIGNvb2tpZTsKKwlubG1fc3RhdHMgc3RhdDsKKwlpbnQgc2VxdWVuY2U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmxtX3NoYXJlcmVzIG5sbV9zaGFyZXJlczsKKworc3RydWN0IG5sbV9ub3RpZnkgeworCWNoYXIgKm5hbWU7CisJbG9uZyBzdGF0ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBubG1fbm90aWZ5IG5sbV9ub3RpZnk7CisKKyNkZWZpbmUgTkxNX1BST0cgMTAwMDIxCisjZGVmaW5lIE5MTV9WRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5MTV9URVNUIDEKK2V4dGVybiAgbmxtX3Rlc3RyZXMgKiBubG1fdGVzdF8xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fdGVzdHJlcyAqIG5sbV90ZXN0XzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9MT0NLIDIKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9sb2NrXzEoc3RydWN0IG5sbV9sb2NrYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fbG9ja18xX3N2YyhzdHJ1Y3QgbmxtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fQ0FOQ0VMIDMKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9jYW5jZWxfMShzdHJ1Y3QgbmxtX2NhbmNhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9jYW5jZWxfMV9zdmMoc3RydWN0IG5sbV9jYW5jYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOTE9DSyA0CitleHRlcm4gIG5sbV9yZXMgKiBubG1fdW5sb2NrXzEoc3RydWN0IG5sbV91bmxvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV91bmxvY2tfMV9zdmMoc3RydWN0IG5sbV91bmxvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fR1JBTlRFRCA1CitleHRlcm4gIG5sbV9yZXMgKiBubG1fZ3JhbnRlZF8xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fcmVzICogbmxtX2dyYW50ZWRfMV9zdmMoc3RydWN0IG5sbV90ZXN0YXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1RFU1RfTVNHIDYKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X21zZ18xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfbXNnXzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9MT0NLX01TRyA3CitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19tc2dfMShzdHJ1Y3QgbmxtX2xvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX21zZ18xX3N2YyhzdHJ1Y3QgbmxtX2xvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fQ0FOQ0VMX01TRyA4CitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX21zZ18xKHN0cnVjdCBubG1fY2FuY2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9tc2dfMV9zdmMoc3RydWN0IG5sbV9jYW5jYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOTE9DS19NU0cgOQorZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19tc2dfMShzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19tc2dfMV9zdmMoc3RydWN0IG5sbV91bmxvY2thcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fR1JBTlRFRF9NU0cgMTAKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX21zZ18xKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfbXNnXzFfc3ZjKHN0cnVjdCBubG1fdGVzdGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9URVNUX1JFUyAxMQorZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfcmVzXzEobmxtX3Rlc3RyZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfcmVzXzFfc3ZjKG5sbV90ZXN0cmVzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fTE9DS19SRVMgMTIKK2V4dGVybiAgdm9pZCAqIG5sbV9sb2NrX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfcmVzXzFfc3ZjKG5sbV9yZXMgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5MTV9DQU5DRUxfUkVTIDEzCitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2NhbmNlbF9yZXNfMV9zdmMobmxtX3JlcyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOTE9DS19SRVMgMTQKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfcmVzXzEobmxtX3JlcyAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBubG1fdW5sb2NrX3Jlc18xX3N2YyhubG1fcmVzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBOTE1fR1JBTlRFRF9SRVMgMTUKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX3Jlc18xKG5sbV9yZXMgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfcmVzXzFfc3ZjKG5sbV9yZXMgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IG5sbV9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBOTE1fVEVTVCAxCitleHRlcm4gIG5sbV90ZXN0cmVzICogbmxtX3Rlc3RfMSgpOworZXh0ZXJuICBubG1fdGVzdHJlcyAqIG5sbV90ZXN0XzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9MT0NLIDIKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9sb2NrXzEoKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9sb2NrXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9DQU5DRUwgMworZXh0ZXJuICBubG1fcmVzICogbmxtX2NhbmNlbF8xKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fY2FuY2VsXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9VTkxPQ0sgNAorZXh0ZXJuICBubG1fcmVzICogbmxtX3VubG9ja18xKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fdW5sb2NrXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9HUkFOVEVEIDUKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ncmFudGVkXzEoKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ncmFudGVkXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9URVNUX01TRyA2CitleHRlcm4gIHZvaWQgKiBubG1fdGVzdF9tc2dfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX3Rlc3RfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9MT0NLX01TRyA3CitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19tc2dfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9DQU5DRUxfTVNHIDgKK2V4dGVybiAgdm9pZCAqIG5sbV9jYW5jZWxfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9jYW5jZWxfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9VTkxPQ0tfTVNHIDkKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV91bmxvY2tfbXNnXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9HUkFOVEVEX01TRyAxMAorZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfbXNnXzEoKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9ncmFudGVkX21zZ18xX3N2YygpOworI2RlZmluZSBOTE1fVEVTVF9SRVMgMTEKK2V4dGVybiAgdm9pZCAqIG5sbV90ZXN0X3Jlc18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fdGVzdF9yZXNfMV9zdmMoKTsKKyNkZWZpbmUgTkxNX0xPQ0tfUkVTIDEyCitleHRlcm4gIHZvaWQgKiBubG1fbG9ja19yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2xvY2tfcmVzXzFfc3ZjKCk7CisjZGVmaW5lIE5MTV9DQU5DRUxfUkVTIDEzCitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX3Jlc18xKCk7CitleHRlcm4gIHZvaWQgKiBubG1fY2FuY2VsX3Jlc18xX3N2YygpOworI2RlZmluZSBOTE1fVU5MT0NLX1JFUyAxNAorZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX3VubG9ja19yZXNfMV9zdmMoKTsKKyNkZWZpbmUgTkxNX0dSQU5URURfUkVTIDE1CitleHRlcm4gIHZvaWQgKiBubG1fZ3JhbnRlZF9yZXNfMSgpOworZXh0ZXJuICB2b2lkICogbmxtX2dyYW50ZWRfcmVzXzFfc3ZjKCk7CitleHRlcm4gaW50IG5sbV9wcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworI2RlZmluZSBOTE1fVkVSU1ggMworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgTkxNX1NIQVJFIDIwCitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV9zaGFyZV8zKG5sbV9zaGFyZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fc2hhcmVfM19zdmMobmxtX3NoYXJlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX1VOU0hBUkUgMjEKK2V4dGVybiAgbmxtX3NoYXJlcmVzICogbmxtX3Vuc2hhcmVfMyhubG1fc2hhcmVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3NoYXJlcmVzICogbmxtX3Vuc2hhcmVfM19zdmMobmxtX3NoYXJlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX05NX0xPQ0sgMjIKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ubV9sb2NrXzMobmxtX2xvY2thcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmxtX3JlcyAqIG5sbV9ubV9sb2NrXzNfc3ZjKG5sbV9sb2NrYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkxNX0ZSRUVfQUxMIDIzCitleHRlcm4gIHZvaWQgKiBubG1fZnJlZV9hbGxfMyhubG1fbm90aWZ5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5sbV9mcmVlX2FsbF8zX3N2YyhubG1fbm90aWZ5ICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBubG1fcHJvZ18zX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgTkxNX1NIQVJFIDIwCitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV9zaGFyZV8zKCk7CitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV9zaGFyZV8zX3N2YygpOworI2RlZmluZSBOTE1fVU5TSEFSRSAyMQorZXh0ZXJuICBubG1fc2hhcmVyZXMgKiBubG1fdW5zaGFyZV8zKCk7CitleHRlcm4gIG5sbV9zaGFyZXJlcyAqIG5sbV91bnNoYXJlXzNfc3ZjKCk7CisjZGVmaW5lIE5MTV9OTV9MT0NLIDIyCitleHRlcm4gIG5sbV9yZXMgKiBubG1fbm1fbG9ja18zKCk7CitleHRlcm4gIG5sbV9yZXMgKiBubG1fbm1fbG9ja18zX3N2YygpOworI2RlZmluZSBOTE1fRlJFRV9BTEwgMjMKK2V4dGVybiAgdm9pZCAqIG5sbV9mcmVlX2FsbF8zKCk7CitleHRlcm4gIHZvaWQgKiBubG1fZnJlZV9hbGxfM19zdmMoKTsKK2V4dGVybiBpbnQgbmxtX3Byb2dfM19mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX25sbV9zdGF0cyAoWERSICosIG5sbV9zdGF0cyopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9ob2xkZXIgKFhEUiAqLCBubG1faG9sZGVyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3Rlc3RycGx5IChYRFIgKiwgbmxtX3Rlc3RycGx5Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3N0YXQgKFhEUiAqLCBubG1fc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9yZXMgKFhEUiAqLCBubG1fcmVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3Rlc3RyZXMgKFhEUiAqLCBubG1fdGVzdHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX25sbV9sb2NrIChYRFIgKiwgbmxtX2xvY2sqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fbG9ja2FyZ3MgKFhEUiAqLCBubG1fbG9ja2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fY2FuY2FyZ3MgKFhEUiAqLCBubG1fY2FuY2FyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fdGVzdGFyZ3MgKFhEUiAqLCBubG1fdGVzdGFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fdW5sb2NrYXJncyAoWERSICosIG5sbV91bmxvY2thcmdzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZnNoX21vZGUgKFhEUiAqLCBmc2hfbW9kZSopOworZXh0ZXJuICBib29sX3QgeGRyX2ZzaF9hY2Nlc3MgKFhEUiAqLCBmc2hfYWNjZXNzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3NoYXJlIChYRFIgKiwgbmxtX3NoYXJlKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbmxtX3NoYXJlYXJncyAoWERSICosIG5sbV9zaGFyZWFyZ3MqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fc2hhcmVyZXMgKFhEUiAqLCBubG1fc2hhcmVyZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9ubG1fbm90aWZ5IChYRFIgKiwgbmxtX25vdGlmeSopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3N0YXRzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX2hvbGRlciAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV90ZXN0cnBseSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9zdGF0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV90ZXN0cmVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfbmxtX2xvY2sgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fbG9ja2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fY2FuY2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fdGVzdGFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fdW5sb2NrYXJncyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2ZzaF9tb2RlICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZnNoX2FjY2VzcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9zaGFyZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX25sbV9zaGFyZWFyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fc2hhcmVyZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ubG1fbm90aWZ5ICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfTkxNX1BST1RfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL25sbV9wcm90LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGM5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ubG1fcHJvdC54CkBAIC0wLDAgKzEsMTc5IEBACisvKiBAKCMpbmxtX3Byb3QueAkyLjEgODgvMDgvMDEgNC4wIFJQQ1NSQyAqLworLyogQCgjKW5sbV9wcm90LnggMS44IDg3LzA5LzIxIENvcHlyIDE5ODcgU3VuIE1pY3JvICovCisKKy8qCisgKiBOZXR3b3JrIGxvY2sgbWFuYWdlciBwcm90b2NvbCBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5ODYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICoKKyAqIHByb3RvY29sIHVzZWQgYmV0d2VlbiBsb2NhbCBsb2NrIG1hbmFnZXIgYW5kIHJlbW90ZSBsb2NrIG1hbmFnZXIKKyAqLworCisjaWZkZWYgUlBDX0hEUgorJSNkZWZpbmUgTE1fTUFYU1RSTEVOCTEwMjQKKyUjZGVmaW5lIE1BWE5BTUVMRU4JTE1fTUFYU1RSTEVOKzEKKyNlbmRpZgorCisvKgorICogc3RhdHVzIG9mIGEgY2FsbCB0byB0aGUgbG9jayBtYW5hZ2VyCisgKi8KK2VudW0gbmxtX3N0YXRzIHsKKwlubG1fZ3JhbnRlZCA9IDAsCisJbmxtX2RlbmllZCA9IDEsCisJbmxtX2RlbmllZF9ub2xvY2tzID0gMiwKKwlubG1fYmxvY2tlZCA9IDMsCisJbmxtX2RlbmllZF9ncmFjZV9wZXJpb2QgPSA0Cit9OworCitzdHJ1Y3QgbmxtX2hvbGRlciB7CisJYm9vbCBleGNsdXNpdmU7CisJaW50IHN2aWQ7CisJbmV0b2JqIG9oOworCXVuc2lnbmVkIGxfb2Zmc2V0OworCXVuc2lnbmVkIGxfbGVuOworfTsKKwordW5pb24gbmxtX3Rlc3RycGx5IHN3aXRjaCAobmxtX3N0YXRzIHN0YXQpIHsKKwljYXNlIG5sbV9kZW5pZWQ6CisJCXN0cnVjdCBubG1faG9sZGVyIGhvbGRlcjsKKwlkZWZhdWx0OgorCQl2b2lkOworfTsKKworc3RydWN0IG5sbV9zdGF0IHsKKwlubG1fc3RhdHMgc3RhdDsKK307CisKK3N0cnVjdCBubG1fcmVzIHsKKwluZXRvYmogY29va2llOworCW5sbV9zdGF0IHN0YXQ7Cit9OworCitzdHJ1Y3QgbmxtX3Rlc3RyZXMgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3Rlc3RycGx5IHN0YXQ7Cit9OworCitzdHJ1Y3QgbmxtX2xvY2sgeworCXN0cmluZyBjYWxsZXJfbmFtZTxMTV9NQVhTVFJMRU4+OworCW5ldG9iaiBmaDsJCS8qIGlkZW50aWZ5IGEgZmlsZSAqLworCW5ldG9iaiBvaDsJCS8qIGlkZW50aWZ5IG93bmVyIG9mIGEgbG9jayAqLworCWludCBzdmlkOwkJLyogZ2VuZXJhdGVkIGZyb20gcGlkIGZvciBzdmlkICovCisJdW5zaWduZWQgbF9vZmZzZXQ7CisJdW5zaWduZWQgbF9sZW47Cit9OworCitzdHJ1Y3QgbmxtX2xvY2thcmdzIHsKKwluZXRvYmogY29va2llOworCWJvb2wgYmxvY2s7CisJYm9vbCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworCWJvb2wgcmVjbGFpbTsJCS8qIHVzZWQgZm9yIHJlY292ZXJpbmcgbG9ja3MgKi8KKwlpbnQgc3RhdGU7CQkvKiBzcGVjaWZ5IGxvY2FsIHN0YXR1cyBtb25pdG9yIHN0YXRlICovCit9OworCitzdHJ1Y3QgbmxtX2NhbmNhcmdzIHsKKwluZXRvYmogY29va2llOwkJCisJYm9vbCBibG9jazsKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OworCitzdHJ1Y3QgbmxtX3Rlc3RhcmdzIHsKKwluZXRvYmogY29va2llOwkJCisJYm9vbCBleGNsdXNpdmU7CisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworfTsKKworc3RydWN0IG5sbV91bmxvY2thcmdzIHsKKwluZXRvYmogY29va2llOwkJCisJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworfTsKKworCisjaWZkZWYgUlBDX0hEUgorJS8qCislICogVGhlIGZvbGxvd2luZyBlbnVtcyBhcmUgYWN0dWFsbHkgYml0IGVuY29kZWQgZm9yIGVmZmljaWVudAorJSAqIGJvb2xlYW4gYWxnZWJyYS4uLi4gRE9OJ1QgY2hhbmdlIHRoZW0uLi4uLgorJSAqLworI2VuZGlmCitlbnVtCWZzaF9tb2RlIHsKKwlmc21fRE4gID0gMCwJLyogZGVueSBub25lICovCisJZnNtX0RSICA9IDEsCS8qIGRlbnkgcmVhZCAqLworCWZzbV9EVyAgPSAyLAkvKiBkZW55IHdyaXRlICovCisJZnNtX0RSVyA9IDMJLyogZGVueSByZWFkL3dyaXRlICovCit9OworCitlbnVtCWZzaF9hY2Nlc3MgeworCWZzYV9OT05FID0gMCwJLyogZm9yIGNvbXBsZXRlbmVzcyAqLworCWZzYV9SICAgID0gMSwJLyogcmVhZCBvbmx5ICovCisJZnNhX1cgICAgPSAyLAkvKiB3cml0ZSBvbmx5ICovCisJZnNhX1JXICAgPSAzCS8qIHJlYWQvd3JpdGUgKi8KK307CisKK3N0cnVjdAlubG1fc2hhcmUgeworCXN0cmluZyBjYWxsZXJfbmFtZTxMTV9NQVhTVFJMRU4+OworCW5ldG9iaglmaDsKKwluZXRvYmoJb2g7CisJZnNoX21vZGUJbW9kZTsKKwlmc2hfYWNjZXNzCWFjY2VzczsKK307CisKK3N0cnVjdAlubG1fc2hhcmVhcmdzIHsKKwluZXRvYmoJY29va2llOworCW5sbV9zaGFyZQlzaGFyZTsKKwlib29sCXJlY2xhaW07Cit9OworCitzdHJ1Y3QJbmxtX3NoYXJlcmVzIHsKKwluZXRvYmoJY29va2llOworCW5sbV9zdGF0cwlzdGF0OworCWludAlzZXF1ZW5jZTsKK307CisKK3N0cnVjdAlubG1fbm90aWZ5IHsKKwlzdHJpbmcgbmFtZTxNQVhOQU1FTEVOPjsKKwlsb25nIHN0YXRlOworfTsKKworLyoKKyAqIE92ZXItdGhlLXdpcmUgcHJvdG9jb2wgdXNlZCBiZXR3ZWVuIHRoZSBuZXR3b3JrIGxvY2sgbWFuYWdlcnMKKyAqLworCitwcm9ncmFtIE5MTV9QUk9HIHsKKwl2ZXJzaW9uIE5MTV9WRVJTIHsKKworCQlubG1fdGVzdHJlcwlOTE1fVEVTVChzdHJ1Y3QgbmxtX3Rlc3RhcmdzKSA9CTE7CisKKwkJbmxtX3JlcwkJTkxNX0xPQ0soc3RydWN0IG5sbV9sb2NrYXJncykgPQkyOworCisJCW5sbV9yZXMJCU5MTV9DQU5DRUwoc3RydWN0IG5sbV9jYW5jYXJncykgPSAzOworCQlubG1fcmVzCQlOTE1fVU5MT0NLKHN0cnVjdCBubG1fdW5sb2NrYXJncykgPQk0OworCisJCS8qCisJCSAqIHJlbW90ZSBsb2NrIG1hbmFnZXIgY2FsbC1iYWNrIHRvIGdyYW50IGxvY2sKKwkJICovCisJCW5sbV9yZXMJCU5MTV9HUkFOVEVEKHN0cnVjdCBubG1fdGVzdGFyZ3MpPSA1OworCQkvKgorCQkgKiBtZXNzYWdlIHBhc3Npbmcgc3R5bGUgb2YgcmVxdWVzdGluZyBsb2NrCisJCSAqLworCQl2b2lkCQlOTE1fVEVTVF9NU0coc3RydWN0IG5sbV90ZXN0YXJncykgPSA2OworCQl2b2lkCQlOTE1fTE9DS19NU0coc3RydWN0IG5sbV9sb2NrYXJncykgPSA3OworCQl2b2lkCQlOTE1fQ0FOQ0VMX01TRyhzdHJ1Y3QgbmxtX2NhbmNhcmdzKSA9ODsKKwkJdm9pZAkJTkxNX1VOTE9DS19NU0coc3RydWN0IG5sbV91bmxvY2thcmdzKSA9IDk7CisJCXZvaWQJCU5MTV9HUkFOVEVEX01TRyhzdHJ1Y3QgbmxtX3Rlc3RhcmdzKSA9IDEwOworCQl2b2lkCQlOTE1fVEVTVF9SRVMobmxtX3Rlc3RyZXMpID0gMTE7CisJCXZvaWQJCU5MTV9MT0NLX1JFUyhubG1fcmVzKSA9IDEyOworCQl2b2lkCQlOTE1fQ0FOQ0VMX1JFUyhubG1fcmVzKSA9IDEzOworCQl2b2lkCQlOTE1fVU5MT0NLX1JFUyhubG1fcmVzKSA9IDE0OworCQl2b2lkCQlOTE1fR1JBTlRFRF9SRVMobmxtX3JlcykgPSAxNTsKKwl9ID0gMTsKKworCXZlcnNpb24gTkxNX1ZFUlNYIHsKKwkJbmxtX3NoYXJlcmVzCU5MTV9TSEFSRShubG1fc2hhcmVhcmdzKSA9IDIwOworCQlubG1fc2hhcmVyZXMJTkxNX1VOU0hBUkUobmxtX3NoYXJlYXJncykgPSAyMTsKKwkJbmxtX3JlcwkJTkxNX05NX0xPQ0sobmxtX2xvY2thcmdzKSA9IDIyOworCQl2b2lkCQlOTE1fRlJFRV9BTEwobmxtX25vdGlmeSkgPSAyMzsKKwl9ID0gMzsKKworfSA9IDEwMDAyMTsKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcmV4LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzgwY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcmV4LmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfUkVYX0hfUlBDR0VOCisjZGVmaW5lIF9SRVhfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU1RSSU5HU0laRSAxMDI0CisKK3R5cGVkZWYgY2hhciAqcmV4c3RyaW5nOworI2RlZmluZSBTSUdJTlQgMgorI2RlZmluZSBSRVhfSU5URVJBQ1RJVkUgMQorCitzdHJ1Y3QgcmV4X3N0YXJ0IHsKKwlzdHJ1Y3QgeworCQl1X2ludCByc3RfY21kX2xlbjsKKwkJcmV4c3RyaW5nICpyc3RfY21kX3ZhbDsKKwl9IHJzdF9jbWQ7CisJcmV4c3RyaW5nIHJzdF9ob3N0OworCXJleHN0cmluZyByc3RfZnNuYW1lOworCXJleHN0cmluZyByc3RfZGlyd2l0aGluOworCXN0cnVjdCB7CisJCXVfaW50IHJzdF9lbnZfbGVuOworCQlyZXhzdHJpbmcgKnJzdF9lbnZfdmFsOworCX0gcnN0X2VudjsKKwl1X2ludCByc3RfcG9ydDA7CisJdV9pbnQgcnN0X3BvcnQxOworCXVfaW50IHJzdF9wb3J0MjsKKwl1X2ludCByc3RfZmxhZ3M7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmV4X3N0YXJ0IHJleF9zdGFydDsKKworc3RydWN0IHJleF9yZXN1bHQgeworCWludCBybHRfc3RhdDsKKwlyZXhzdHJpbmcgcmx0X21lc3NhZ2U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcmV4X3Jlc3VsdCByZXhfcmVzdWx0OworCitzdHJ1Y3Qgc2d0dHliIHsKKwl1X2ludCBmb3VyOworCWNoYXIgY2hhcnNbNF07CisJdV9pbnQgZmxhZ3M7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc2d0dHliIHNndHR5YjsKKyNkZWZpbmUgQjAgMAorI2RlZmluZSBCNTAgMQorI2RlZmluZSBCNzUgMgorI2RlZmluZSBCMTEwIDMKKyNkZWZpbmUgQjEzNCA0CisjZGVmaW5lIEIxNTAgNQorI2RlZmluZSBCMjAwIDYKKyNkZWZpbmUgQjMwMCA3CisjZGVmaW5lIEI2MDAgOAorI2RlZmluZSBCMTIwMCA5CisjZGVmaW5lIEIxODAwIDEwCisjZGVmaW5lIEIyNDAwIDExCisjZGVmaW5lIEI0ODAwIDEyCisjZGVmaW5lIEI5NjAwIDEzCisjZGVmaW5lIEIxOTIwMCAxNAorI2RlZmluZSBCMzg0MDAgMTUKKyNkZWZpbmUgVEFOREVNIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0JSRUFLIDB4MDAwMDAwMDIKKyNkZWZpbmUgTENBU0UgMHgwMDAwMDAwNAorI2RlZmluZSBFQ0hPIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ1JNT0QgMHgwMDAwMDAxMAorI2RlZmluZSBSQVcgMHgwMDAwMDAyMAorI2RlZmluZSBPRERQIDB4MDAwMDAwNDAKKyNkZWZpbmUgRVZFTlAgMHgwMDAwMDA4MAorI2RlZmluZSBBTllQIDB4MDAwMDAwYzAKKyNkZWZpbmUgTkxERUxBWSAweDAwMDAwMzAwCisjZGVmaW5lIE5MMCAweDAwMDAwMDAwCisjZGVmaW5lIE5MMSAweDAwMDAwMTAwCisjZGVmaW5lIE5MMiAweDAwMDAwMjAwCisjZGVmaW5lIE5MMyAweDAwMDAwMzAwCisjZGVmaW5lIFRCREVMQVkgMHgwMDAwMGMwMAorI2RlZmluZSBUQUIwIDB4MDAwMDAwMDAKKyNkZWZpbmUgVEFCMSAweDAwMDAwNDAwCisjZGVmaW5lIFRBQjIgMHgwMDAwMDgwMAorI2RlZmluZSBYVEFCUyAweDAwMDAwYzAwCisjZGVmaW5lIENSREVMQVkgMHgwMDAwMzAwMAorI2RlZmluZSBDUjAgMHgwMDAwMDAwMAorI2RlZmluZSBDUjEgMHgwMDAwMTAwMAorI2RlZmluZSBDUjIgMHgwMDAwMjAwMAorI2RlZmluZSBDUjMgMHgwMDAwMzAwMAorI2RlZmluZSBWVERFTEFZIDB4MDAwMDQwMDAKKyNkZWZpbmUgRkYwIDB4MDAwMDAwMDAKKyNkZWZpbmUgRkYxIDB4MDAwMDQwMDAKKyNkZWZpbmUgQlNERUxBWSAweDAwMDA4MDAwCisjZGVmaW5lIEJTMCAweDAwMDAwMDAwCisjZGVmaW5lIEJTMSAweDAwMDA4MDAwCisjZGVmaW5lIENSVEJTIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFJURVJBIDB4MDAwMjAwMDAKKyNkZWZpbmUgQ1JURVJBIDB4MDAwNDAwMDAKKyNkZWZpbmUgVElMREUgMHgwMDA4MDAwMAorI2RlZmluZSBNRE1CVUYgMHgwMDEwMDAwMAorI2RlZmluZSBMSVRPVVQgMHgwMDIwMDAwMAorI2RlZmluZSBUT1NUT1AgMHgwMDQwMDAwMAorI2RlZmluZSBGTFVTSE8gMHgwMDgwMDAwMAorI2RlZmluZSBOT0hBTkcgMHgwMTAwMDAwMAorI2RlZmluZSBMMDAxMDAwIDB4MDIwMDAwMDAKKyNkZWZpbmUgQ1JUS0lMIDB4MDQwMDAwMDAKKyNkZWZpbmUgUEFTUzggMHgwODAwMDAwMAorI2RlZmluZSBDVExFQ0ggMHgxMDAwMDAwMAorI2RlZmluZSBQRU5ESU4gMHgyMDAwMDAwMAorI2RlZmluZSBERUNDVFEgMHg0MDAwMDAwMAorI2RlZmluZSBOT0ZMU0ggMHg4MDAwMDAwMAorCitzdHJ1Y3QgdGNoYXJzIHsKKwl1X2ludCBzaXg7CisJY2hhciBjaGFyc1s2XTsKK307Cit0eXBlZGVmIHN0cnVjdCB0Y2hhcnMgdGNoYXJzOworCitzdHJ1Y3QgbHRjaGFycyB7CisJdV9pbnQgc2l4OworCWNoYXIgY2hhcnNbNl07CisJdV9pbnQgbW9kZTsKK307Cit0eXBlZGVmIHN0cnVjdCBsdGNoYXJzIGx0Y2hhcnM7CisKK3N0cnVjdCByZXhfdHR5c2l6ZSB7CisJaW50IHRzX2xpbmVzOworCWludCB0c19jb2xzOworfTsKK3R5cGVkZWYgc3RydWN0IHJleF90dHlzaXplIHJleF90dHlzaXplOworCitzdHJ1Y3QgcmV4X3R0eW1vZGUgeworCXNndHR5YiBiYXNpYzsKKwl0Y2hhcnMgbW9yZTsKKwlsdGNoYXJzIHlldG1vcmU7CisJdV9pbnQgYW5kbW9yZTsKK307Cit0eXBlZGVmIHN0cnVjdCByZXhfdHR5bW9kZSByZXhfdHR5bW9kZTsKKyNkZWZpbmUgTENSVEJTIDB4MDAwMQorI2RlZmluZSBMUFJURVJBIDB4MDAwMgorI2RlZmluZSBMQ1JURVJBIDB4MDAwNAorI2RlZmluZSBMVElMREUgMHgwMDA4CisjZGVmaW5lIExNRE1CVUYgMHgwMDEwCisjZGVmaW5lIExMSVRPVVQgMHgwMDIwCisjZGVmaW5lIExUT1NUT1AgMHgwMDQwCisjZGVmaW5lIExGTFVTSE8gMHgwMDgwCisjZGVmaW5lIExOT0hBTkcgMHgwMTAwCisjZGVmaW5lIExMMDAxMDAwIDB4MDIwMAorI2RlZmluZSBMQ1JUS0lMIDB4MDQwMAorI2RlZmluZSBMUEFTUzggMHgwODAwCisjZGVmaW5lIExDVExFQ0ggMHgxMDAwCisjZGVmaW5lIExQRU5ESU4gMHgyMDAwCisjZGVmaW5lIExERUNDVFEgMHg0MDAwCisjZGVmaW5lIExOT0ZMU0ggMHg4MDAwCisKKyNkZWZpbmUgUkVYUFJPRyAxMDAwMTcKKyNkZWZpbmUgUkVYVkVSUyAxCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBSRVhQUk9DX1NUQVJUIDEKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfc3RhcnRfMShyZXhfc3RhcnQgKiwgQ0xJRU5UICopOworZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY19zdGFydF8xX3N2YyhyZXhfc3RhcnQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJFWFBST0NfV0FJVCAyCitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3dhaXRfMSh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmV4X3Jlc3VsdCAqIHJleHByb2Nfd2FpdF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSRVhQUk9DX01PREVTIDMKK2V4dGVybiAgdm9pZCAqIHJleHByb2NfbW9kZXNfMShyZXhfdHR5bW9kZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX21vZGVzXzFfc3ZjKHJleF90dHltb2RlICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSRVhQUk9DX1dJTkNIIDQKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfd2luY2hfMShyZXhfdHR5c2l6ZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3dpbmNoXzFfc3ZjKHJleF90dHlzaXplICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBSRVhQUk9DX1NJR05BTCA1CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3NpZ25hbF8xKGludCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3NpZ25hbF8xX3N2YyhpbnQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJleHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKyNlbHNlIC8qIEsmUiBDICovCisjZGVmaW5lIFJFWFBST0NfU1RBUlQgMQorZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY19zdGFydF8xKCk7CitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3N0YXJ0XzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfV0FJVCAyCitleHRlcm4gIHJleF9yZXN1bHQgKiByZXhwcm9jX3dhaXRfMSgpOworZXh0ZXJuICByZXhfcmVzdWx0ICogcmV4cHJvY193YWl0XzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfTU9ERVMgMworZXh0ZXJuICB2b2lkICogcmV4cHJvY19tb2Rlc18xKCk7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX21vZGVzXzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfV0lOQ0ggNAorZXh0ZXJuICB2b2lkICogcmV4cHJvY193aW5jaF8xKCk7CitleHRlcm4gIHZvaWQgKiByZXhwcm9jX3dpbmNoXzFfc3ZjKCk7CisjZGVmaW5lIFJFWFBST0NfU0lHTkFMIDUKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfc2lnbmFsXzEoKTsKK2V4dGVybiAgdm9pZCAqIHJleHByb2Nfc2lnbmFsXzFfc3ZjKCk7CitleHRlcm4gaW50IHJleHByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3JleHN0cmluZyAoWERSICosIHJleHN0cmluZyopOworZXh0ZXJuICBib29sX3QgeGRyX3JleF9zdGFydCAoWERSICosIHJleF9zdGFydCopOworZXh0ZXJuICBib29sX3QgeGRyX3JleF9yZXN1bHQgKFhEUiAqLCByZXhfcmVzdWx0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc2d0dHliIChYRFIgKiwgc2d0dHliKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfdGNoYXJzIChYRFIgKiwgdGNoYXJzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbHRjaGFycyAoWERSICosIGx0Y2hhcnMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9yZXhfdHR5c2l6ZSAoWERSICosIHJleF90dHlzaXplKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfcmV4X3R0eW1vZGUgKFhEUiAqLCByZXhfdHR5bW9kZSopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4c3RyaW5nICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4X3N0YXJ0ICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfcmV4X3Jlc3VsdCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NndHR5YiAoKTsKK2V4dGVybiBib29sX3QgeGRyX3RjaGFycyAoKTsKK2V4dGVybiBib29sX3QgeGRyX2x0Y2hhcnMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZXhfdHR5c2l6ZSAoKTsKK2V4dGVybiBib29sX3QgeGRyX3JleF90dHltb2RlICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfUkVYX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXgueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JleC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWQ5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yZXgueApAQCAtMCwwICsxLDIyOSBAQAorLyogQCgjKXJleC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisvKiBAKCMpcmV4LnggMS4zIDg3LzA5LzE4IENvcHlyIDE5ODcgU3VuIE1pY3JvICovCisKKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogUmVtb3RlIGV4ZWN1dGlvbiAocmV4KSBwcm90b2NvbCBzcGVjaWZpY2F0aW9uCisgKi8KKworY29uc3QgU1RSSU5HU0laRSA9IDEwMjQ7Cit0eXBlZGVmIHN0cmluZyByZXhzdHJpbmc8MTAyND47CisKKy8qCisgKiB2YWx1ZXMgdG8gcGFzcyB0byBSRVhQUk9DX1NJR05BTAorICovCitjb25zdCBTSUdJTlQgPSAyOwkvKiBpbnRlcnJ1cHQgKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgcnN0X2ZsYWdzLCBiZWxvdworICovCitjb25zdCBSRVhfSU5URVJBQ1RJVkUgPSAxOwkvKiBpbnRlcmFjdGl2ZSBtb2RlICovCisKK3N0cnVjdCByZXhfc3RhcnQgeworCXJleHN0cmluZyByc3RfY21kPD47CS8qIGxpc3Qgb2YgY29tbWFuZCBhbmQgYXJncyAqLworCXJleHN0cmluZyByc3RfaG9zdDsJLyogd29ya2luZyBkaXJlY3RvcnkgaG9zdCBuYW1lICovCisJcmV4c3RyaW5nIHJzdF9mc25hbWU7CS8qIHdvcmtpbmcgZGlyZWN0b3J5IGZpbGUgc3lzdGVtIG5hbWUgKi8KKwlyZXhzdHJpbmcgcnN0X2RpcndpdGhpbjsvKiB3b3JraW5nIGRpcmVjdG9yeSB3aXRoaW4gZmlsZSBzeXN0ZW0gKi8KKwlyZXhzdHJpbmcgcnN0X2Vudjw+OwkvKiBsaXN0IG9mIGVudmlyb25tZW50ICovCisJdW5zaWduZWQgaW50IHJzdF9wb3J0MDsJLyogcG9ydCBmb3Igc3RkaW4gKi8KKwl1bnNpZ25lZCBpbnQgcnN0X3BvcnQxOwkvKiBwb3J0IGZvciBzdGRvdXQgKi8KKwl1bnNpZ25lZCBpbnQgcnN0X3BvcnQyOwkvKiBwb3J0IGZvciBzdGRlcnIgKi8KKwl1bnNpZ25lZCBpbnQgcnN0X2ZsYWdzOwkvKiBvcHRpb25zIC0gc2VlIGNvbnN0IGFib3ZlICovCit9OworCitzdHJ1Y3QgcmV4X3Jlc3VsdCB7CisgICAJaW50IHJsdF9zdGF0OwkJLyogaW50ZWdlciBzdGF0dXMgY29kZSAqLworCXJleHN0cmluZyBybHRfbWVzc2FnZTsJLyogc3RyaW5nIG1lc3NhZ2UgZm9yIGh1bWFuIGNvbnN1bXB0aW9uICovCit9OworCisKK3N0cnVjdCBzZ3R0eWIgeworCXVuc2lnbmVkIGZvdXI7CS8qIGFsd2F5cyBlcXVhbHMgNCAqLworCW9wYXF1ZSBjaGFyc1s0XTsKKwkvKiBjaGFyc1swXSA9PSBpbnB1dCBzcGVlZCAqLworCS8qIGNoYXJzWzFdID09IG91dHB1dCBzcGVlZCAqLworCS8qIGNoYXJzWzJdID09IGtpbGwgY2hhcmFjdGVyICovCisJLyogY2hhcnNbM10gPT0gZXJhc2UgY2hhcmFjdGVyICovCisJdW5zaWduZWQgZmxhZ3M7Cit9OworLyogdmFsdWVzIGZvciBzcGVlZHMgYWJvdmUgKGJhdWQgcmF0ZXMpICAqLworY29uc3QgQjAgID0gMDsKK2NvbnN0IEI1MCA9IDE7Citjb25zdCBCNzUgPSAyOworY29uc3QgQjExMCA9IDM7Citjb25zdCBCMTM0ID0gNDsKK2NvbnN0IEIxNTAgPSA1OworY29uc3QgQjIwMCA9IDY7Citjb25zdCBCMzAwID0gNzsKK2NvbnN0IEI2MDAgPSA4OworY29uc3QgQjEyMDAgPSA5OworY29uc3QgQjE4MDAgPSAxMDsKK2NvbnN0IEIyNDAwID0gMTE7Citjb25zdCBCNDgwMCA9IDEyOworY29uc3QgQjk2MDAgPSAxMzsKK2NvbnN0IEIxOTIwMCA9IDE0OworY29uc3QgQjM4NDAwID0gMTU7CisKKy8qIHZhbHVlcyBmb3IgZmxhZ3MgYWJvdmUgKi8KK2NvbnN0IFRBTkRFTSA9IDB4MDAwMDAwMDE7IC8qIHNlbmQgc3RvcGMgb24gb3V0IHEgZnVsbCAqLworY29uc3QgQ0JSRUFLID0gMHgwMDAwMDAwMjsgLyogaGFsZi1jb29rZWQgbW9kZSAqLworY29uc3QgTENBU0UgPSAweDAwMDAwMDA0OyAvKiBzaW11bGF0ZSBsb3dlciBjYXNlICovCitjb25zdCBFQ0hPID0gMHgwMDAwMDAwODsgLyogZWNobyBpbnB1dCAqLworY29uc3QgQ1JNT0QgPSAweDAwMDAwMDEwOyAvKiBtYXAgXHIgdG8gXHJcbiBvbiBvdXRwdXQgKi8KK2NvbnN0IFJBVyA9IDB4MDAwMDAwMjA7IC8qIG5vIGkvbyBwcm9jZXNzaW5nICovCitjb25zdCBPRERQID0gMHgwMDAwMDA0MDsgLyogZ2V0L3NlbmQgb2RkIHBhcml0eSAqLworY29uc3QgRVZFTlAgPSAweDAwMDAwMDgwOyAvKiBnZXQvc2VuZCBldmVuIHBhcml0eSAqLworY29uc3QgQU5ZUCA9IDB4MDAwMDAwYzA7IC8qIGdldCBhbnkgcGFyaXR5L3NlbmQgbm9uZSAqLworY29uc3QgTkxERUxBWSA9IDB4MDAwMDAzMDA7IC8qIFxuIGRlbGF5ICovCitjb25zdCAgTkwwID0gMHgwMDAwMDAwMDsKK2NvbnN0ICBOTDEgPSAweDAwMDAwMTAwOyAvKiB0dHkgMzcgKi8KK2NvbnN0ICBOTDIgPSAweDAwMDAwMjAwOyAvKiB2dDA1ICovCitjb25zdCAgTkwzID0gMHgwMDAwMDMwMDsKK2NvbnN0IFRCREVMQVkgPSAweDAwMDAwYzAwOyAvKiBob3Jpem9udGFsIHRhYiBkZWxheSAqLworY29uc3QgIFRBQjAgPSAweDAwMDAwMDAwOworY29uc3QgIFRBQjEgPSAweDAwMDAwNDAwOyAvKiB0dHkgMzcgKi8KK2NvbnN0ICBUQUIyID0gMHgwMDAwMDgwMDsKK2NvbnN0IFhUQUJTID0gMHgwMDAwMGMwMDsgLyogZXhwYW5kIHRhYnMgb24gb3V0cHV0ICovCitjb25zdCBDUkRFTEFZID0gMHgwMDAwMzAwMDsgLyogXHIgZGVsYXkgKi8KK2NvbnN0ICBDUjAgPSAweDAwMDAwMDAwOworY29uc3QgIENSMSA9IDB4MDAwMDEwMDA7IC8qIHRuIDMwMCAqLworY29uc3QgIENSMiA9IDB4MDAwMDIwMDA7IC8qIHR0eSAzNyAqLworY29uc3QgIENSMyA9IDB4MDAwMDMwMDA7IC8qIGNvbmNlcHQgMTAwICovCitjb25zdCBWVERFTEFZID0gMHgwMDAwNDAwMDsgLyogdmVydGljYWwgdGFiIGRlbGF5ICovCitjb25zdCAgRkYwID0gMHgwMDAwMDAwMDsKK2NvbnN0ICBGRjEgPSAweDAwMDA0MDAwOyAvKiB0dHkgMzcgKi8KK2NvbnN0IEJTREVMQVkgPSAweDAwMDA4MDAwOyAvKiBcYiBkZWxheSAqLworY29uc3QgIEJTMCA9IDB4MDAwMDAwMDA7Citjb25zdCAgQlMxID0gMHgwMDAwODAwMDsKK2NvbnN0IENSVEJTID0gMHgwMDAxMDAwMDsgLyogZG8gYmFja3NwYWNpbmcgZm9yIGNydCAqLworY29uc3QgUFJURVJBID0gMHgwMDAyMDAwMDsgLyogXCAuLi4gLyBlcmFzZSAqLworY29uc3QgQ1JURVJBID0gMHgwMDA0MDAwMDsgLyogIiBcYiAiIHRvIHdpcGUgb3V0IGNoYXIgKi8KK2NvbnN0IFRJTERFID0gMHgwMDA4MDAwMDsgLyogaGF6ZWx0aW5lIHRpbGRlIGtsdWRnZSAqLworY29uc3QgTURNQlVGID0gMHgwMDEwMDAwMDsgLyogc3RhcnQvc3RvcCBvdXRwdXQgb24gY2FycmllciBpbnRyICovCitjb25zdCBMSVRPVVQgPSAweDAwMjAwMDAwOyAvKiBsaXRlcmFsIG91dHB1dCAqLworY29uc3QgVE9TVE9QID0gMHgwMDQwMDAwMDsgLyogU0lHVFRPVSBvbiBiYWNrZ3JvdW5kIG91dHB1dCAqLworY29uc3QgRkxVU0hPID0gMHgwMDgwMDAwMDsgLyogZmx1c2ggb3V0cHV0IHRvIHRlcm1pbmFsICovCitjb25zdCBOT0hBTkcgPSAweDAxMDAwMDAwOyAvKiBubyBTSUdIVVAgb24gY2FycmllciBkcm9wICovCitjb25zdCBMMDAxMDAwID0gMHgwMjAwMDAwMDsKK2NvbnN0IENSVEtJTCA9IDB4MDQwMDAwMDA7IC8qIGtpbGwgbGluZSB3aXRoICIgXGIgIiAqLworY29uc3QgUEFTUzggPSAweDA4MDAwMDAwOworY29uc3QgQ1RMRUNIID0gMHgxMDAwMDAwMDsgLyogZWNobyBjb250cm9sIGNoYXJzIGFzIF5YICovCitjb25zdCBQRU5ESU4gPSAweDIwMDAwMDAwOyAvKiB0cC0+dF9yYXdxIG5lZWRzIHJlcmVhZCAqLworY29uc3QgREVDQ1RRID0gMHg0MDAwMDAwMDsgLyogb25seSBeUSBzdGFydHMgYWZ0ZXIgXlMgKi8KK2NvbnN0IE5PRkxTSCA9IDB4ODAwMDAwMDA7IC8qIG5vIG91dHB1dCBmbHVzaCBvbiBzaWduYWwgKi8KKworc3RydWN0IHRjaGFycyB7CisJdW5zaWduZWQgc2l4OwkvKiBhbHdheXMgZXF1YWxzIDYgKi8KKwlvcGFxdWUgY2hhcnNbNl07CisJLyogY2hhcnNbMF0gPT0gaW50ZXJydXB0IGNoYXIgKi8KKwkvKiBjaGFyc1sxXSA9PSBxdWl0IGNoYXIgKi8KKwkvKiBjaGFyc1syXSA9PSBzdGFydCBvdXRwdXQgY2hhciAqLworCS8qIGNoYXJzWzNdID09IHN0b3Agb3V0cHV0IGNoYXIgKi8KKwkvKiBjaGFyc1s0XSA9PSBlbmQtb2YtZmlsZSBjaGFyICovCisJLyogY2hhcnNbNV0gPT0gaW5wdXQgZGVsaW1pdGVyIChsaWtlIG5sKSAqLworfTsKKworc3RydWN0IGx0Y2hhcnMgeworCXVuc2lnbmVkIHNpeDsJLyogYWx3YXlzIGVxdWFscyA2ICovCisJb3BhcXVlIGNoYXJzWzZdOworCS8qIGNoYXJzWzBdID09IHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwkvKiBjaGFyc1sxXSA9PSBkZWxheWVkIHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwkvKiBjaGFyc1syXSA9PSByZXByaW50IGxpbmUgKi8KKwkvKiBjaGFyc1szXSA9PSBmbHVzaCBvdXRwdXQgKi8KKwkvKiBjaGFyc1s0XSA9PSB3b3JkIGVyYXNlICovCisJLyogY2hhcnNbNV0gPT0gbGl0ZXJhbCBuZXh0IGNoYXJhY3RlciAqLworCXVuc2lnbmVkIG1vZGU7Cit9OworCitzdHJ1Y3QgcmV4X3R0eXNpemUgeworCWludCB0c19saW5lczsKKwlpbnQgdHNfY29sczsKK307CisKK3N0cnVjdCByZXhfdHR5bW9kZSB7CisgICAgc2d0dHliIGJhc2ljOyAgICAvKiBzdGFuZGFyZCB1bml4IHR0eSBmbGFncyAqLworICAgIHRjaGFycyBtb3JlOyAvKiBpbnRlcnJ1cHQsIGtpbGwgY2hhcmFjdGVycywgZXRjLiAqLworICAgIGx0Y2hhcnMgeWV0bW9yZTsgLyogc3BlY2lhbCBCZXJrZWxleSBjaGFyYWN0ZXJzICovCisgICAgdW5zaWduZWQgYW5kbW9yZTsgICAgIC8qIGFuZCBCZXJrZWxleSBtb2RlcyAqLworfTsKKworLyogdmFsdWVzIGZvciBhbmRtb3JlIGFib3ZlICovCitjb25zdCBMQ1JUQlMgPSAweDAwMDE7CS8qIGRvIGJhY2tzcGFjaW5nIGZvciBjcnQgKi8KK2NvbnN0IExQUlRFUkEgPSAweDAwMDI7CS8qIFwgLi4uIC8gZXJhc2UgKi8KK2NvbnN0IExDUlRFUkEgPSAweDAwMDQ7CS8qICIgXGIgIiB0byB3aXBlIG91dCBjaGFyICovCitjb25zdCBMVElMREUgPSAweDAwMDg7CS8qIGhhemVsdGluZSB0aWxkZSBrbHVkZ2UgKi8KK2NvbnN0IExNRE1CVUYgPSAweDAwMTA7CS8qIHN0YXJ0L3N0b3Agb3V0cHV0IG9uIGNhcnJpZXIgaW50ciAqLworY29uc3QgTExJVE9VVCA9IDB4MDAyMDsJLyogbGl0ZXJhbCBvdXRwdXQgKi8KK2NvbnN0IExUT1NUT1AgPSAweDAwNDA7CS8qIFNJR1RUT1Ugb24gYmFja2dyb3VuZCBvdXRwdXQgKi8KK2NvbnN0IExGTFVTSE8gPSAweDAwODA7CS8qIGZsdXNoIG91dHB1dCB0byB0ZXJtaW5hbCAqLworY29uc3QgTE5PSEFORyA9IDB4MDEwMDsJLyogbm8gU0lHSFVQIG9uIGNhcnJpZXIgZHJvcCAqLworY29uc3QgTEwwMDEwMDAgPSAweDAyMDA7Citjb25zdCBMQ1JUS0lMID0gMHgwNDAwOwkvKiBraWxsIGxpbmUgd2l0aCAiIFxiICIgKi8KK2NvbnN0IExQQVNTOCA9IDB4MDgwMDsKK2NvbnN0IExDVExFQ0ggPSAweDEwMDA7CS8qIGVjaG8gY29udHJvbCBjaGFycyBhcyBeWCAqLworY29uc3QgTFBFTkRJTiA9IDB4MjAwMDsJLyogbmVlZHMgcmVyZWFkICovCitjb25zdCBMREVDQ1RRID0gMHg0MDAwOwkvKiBvbmx5IF5RIHN0YXJ0cyBhZnRlciBeUyAqLworY29uc3QgTE5PRkxTSCA9IDB4ODAwMDsJLyogbm8gb3V0cHV0IGZsdXNoIG9uIHNpZ25hbCAqLworCitwcm9ncmFtIFJFWFBST0cgeworCXZlcnNpb24gUkVYVkVSUyB7CisKKwkJLyoKKwkJICogU3RhcnQgcmVtb3RlIGV4ZWN1dGlvbgorCQkgKi8KKwkJcmV4X3Jlc3VsdAorCQlSRVhQUk9DX1NUQVJUKHJleF9zdGFydCkgPSAxOworCisJCS8qCisJCSAqIFdhaXQgZm9yIHJlbW90ZSBleGVjdXRpb24gdG8gdGVybWluYXRlCisJCSAqLworCQlyZXhfcmVzdWx0CisJCVJFWFBST0NfV0FJVCh2b2lkKSA9IDI7CisKKwkJLyoKKwkJICogU2VuZCB0dHkgbW9kZXMKKwkJICovCisJCXZvaWQKKwkJUkVYUFJPQ19NT0RFUyhyZXhfdHR5bW9kZSkgPSAzOworCisJCS8qCisJCSAqIFNlbmQgd2luZG93IHNpemUgY2hhbmdlCisJCSAqLworCQl2b2lkCisJCVJFWFBST0NfV0lOQ0gocmV4X3R0eXNpemUpID0gNDsKKworCQkvKgorCQkgKiBTZW5kIG90aGVyIHNpZ25hbAorCQkgKi8KKwkJdm9pZAorCQlSRVhQUk9DX1NJR05BTChpbnQpID0gNTsKKwl9ID0gMTsKK30gPSAxMDAwMTc7CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ycXVvdGEuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JxdW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDY0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ycXVvdGEuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX1JRVU9UQV9IX1JQQ0dFTgorI2RlZmluZSBfUlFVT1RBX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFJRX1BBVEhMRU4gMTAyNAorCitzdHJ1Y3QgZ2V0cXVvdGFfYXJncyB7CisJY2hhciAqZ3FhX3BhdGhwOworCWludCBncWFfdWlkOworfTsKK3R5cGVkZWYgc3RydWN0IGdldHF1b3RhX2FyZ3MgZ2V0cXVvdGFfYXJnczsKKworc3RydWN0IHJxdW90YSB7CisJaW50IHJxX2JzaXplOworCWJvb2xfdCBycV9hY3RpdmU7CisJdV9pbnQgcnFfYmhhcmRsaW1pdDsKKwl1X2ludCBycV9ic29mdGxpbWl0OworCXVfaW50IHJxX2N1cmJsb2NrczsKKwl1X2ludCBycV9maGFyZGxpbWl0OworCXVfaW50IHJxX2Zzb2Z0bGltaXQ7CisJdV9pbnQgcnFfY3VyZmlsZXM7CisJdV9pbnQgcnFfYnRpbWVsZWZ0OworCXVfaW50IHJxX2Z0aW1lbGVmdDsKK307Cit0eXBlZGVmIHN0cnVjdCBycXVvdGEgcnF1b3RhOworCitlbnVtIGdxcl9zdGF0dXMgeworCVFfT0sgPSAxLAorCVFfTk9RVU9UQSA9IDIsCisJUV9FUEVSTSA9IDMsCit9OwordHlwZWRlZiBlbnVtIGdxcl9zdGF0dXMgZ3FyX3N0YXR1czsKKworc3RydWN0IGdldHF1b3RhX3JzbHQgeworCWdxcl9zdGF0dXMgc3RhdHVzOworCXVuaW9uIHsKKwkJcnF1b3RhIGdxcl9ycXVvdGE7CisJfSBnZXRxdW90YV9yc2x0X3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ2V0cXVvdGFfcnNsdCBnZXRxdW90YV9yc2x0OworCisjZGVmaW5lIFJRVU9UQVBST0cgMTAwMDExCisjZGVmaW5lIFJRVU9UQVZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgUlFVT1RBUFJPQ19HRVRRVU9UQSAxCitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldHF1b3RhXzEoZ2V0cXVvdGFfYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGdldHF1b3RhX3JzbHQgKiBycXVvdGFwcm9jX2dldHF1b3RhXzFfc3ZjKGdldHF1b3RhX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJRVU9UQVBST0NfR0VUQUNUSVZFUVVPVEEgMgorZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRhY3RpdmVxdW90YV8xKGdldHF1b3RhX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRhY3RpdmVxdW90YV8xX3N2YyhnZXRxdW90YV9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBycXVvdGFwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBSUVVPVEFQUk9DX0dFVFFVT1RBIDEKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0cXVvdGFfMSgpOworZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRxdW90YV8xX3N2YygpOworI2RlZmluZSBSUVVPVEFQUk9DX0dFVEFDVElWRVFVT1RBIDIKK2V4dGVybiAgZ2V0cXVvdGFfcnNsdCAqIHJxdW90YXByb2NfZ2V0YWN0aXZlcXVvdGFfMSgpOworZXh0ZXJuICBnZXRxdW90YV9yc2x0ICogcnF1b3RhcHJvY19nZXRhY3RpdmVxdW90YV8xX3N2YygpOworZXh0ZXJuIGludCBycXVvdGFwcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9nZXRxdW90YV9hcmdzIChYRFIgKiwgZ2V0cXVvdGFfYXJncyopOworZXh0ZXJuICBib29sX3QgeGRyX3JxdW90YSAoWERSICosIHJxdW90YSopOworZXh0ZXJuICBib29sX3QgeGRyX2dxcl9zdGF0dXMgKFhEUiAqLCBncXJfc3RhdHVzKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfZ2V0cXVvdGFfcnNsdCAoWERSICosIGdldHF1b3RhX3JzbHQqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX2dldHF1b3RhX2FyZ3MgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ycXVvdGEgKCk7CitleHRlcm4gYm9vbF90IHhkcl9ncXJfc3RhdHVzICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfZ2V0cXVvdGFfcnNsdCAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1JRVU9UQV9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnF1b3RhLnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ycXVvdGEueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg4OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnF1b3RhLngKQEAgLTAsMCArMSw2MSBAQAorLyogQCgjKXJxdW90YS54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisvKiBAKCMpcnF1b3RhLnggMS4yIDg3LzA5LzIwIENvcHlyIDE5ODcgU3VuIE1pY3JvICovCisKKy8qCisgKiBSZW1vdGUgcXVvdGEgcHJvdG9jb2wKKyAqIFJlcXVpcmVzIHVuaXggYXV0aGVudGljYXRpb24KKyAqLworCitjb25zdCBSUV9QQVRITEVOID0gMTAyNDsKKworc3RydWN0IGdldHF1b3RhX2FyZ3MgeworCXN0cmluZyBncWFfcGF0aHA8UlFfUEFUSExFTj47ICAJLyogcGF0aCB0byBmaWxlc3lzdGVtIG9mIGludGVyZXN0ICovCisJaW50IGdxYV91aWQ7CSAgICAgICAgCS8qIGlucXVpcmUgYWJvdXQgcXVvdGEgZm9yIHVpZCAqLworfTsKKworLyoKKyAqIHJlbW90ZSBxdW90YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IHJxdW90YSB7CisJaW50IHJxX2JzaXplOwkJCS8qIGJsb2NrIHNpemUgZm9yIGJsb2NrIGNvdW50cyAqLworCWJvb2wgcnFfYWN0aXZlOyAgCQkvKiBpbmRpY2F0ZXMgd2hldGhlciBxdW90YSBpcyBhY3RpdmUgKi8KKwl1bnNpZ25lZCBpbnQgcnFfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBibGtzIGFsbG9jICovCisJdW5zaWduZWQgaW50IHJxX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKwl1bnNpZ25lZCBpbnQgcnFfY3VyYmxvY2tzOwkvKiBjdXJyZW50IGJsb2NrIGNvdW50ICovCisJdW5zaWduZWQgaW50IHJxX2ZoYXJkbGltaXQ7CS8qIGFic29sdXRlIGxpbWl0IG9uIGFsbG9jYXRlZCBmaWxlcyAqLworCXVuc2lnbmVkIGludCBycV9mc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgZmlsZSBsaW1pdCAqLworCXVuc2lnbmVkIGludCBycV9jdXJmaWxlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBmaWxlcyAqLworCXVuc2lnbmVkIGludCBycV9idGltZWxlZnQ7CS8qIHRpbWUgbGVmdCBmb3IgZXhjZXNzaXZlIGRpc2sgdXNlICovCisJdW5zaWduZWQgaW50IHJxX2Z0aW1lbGVmdDsJLyogdGltZSBsZWZ0IGZvciBleGNlc3NpdmUgZmlsZXMgKi8KK307CQorCitlbnVtIGdxcl9zdGF0dXMgeworCVFfT0sgPSAxLAkJLyogcXVvdGEgcmV0dXJuZWQgKi8KKwlRX05PUVVPVEEgPSAyLCAgCS8qIG5vcXVvdGEgZm9yIHVpZCAqLworCVFfRVBFUk0gPSAzCQkvKiBubyBwZXJtaXNzaW9uIHRvIGFjY2VzcyBxdW90YSAqLworfTsKKwordW5pb24gZ2V0cXVvdGFfcnNsdCBzd2l0Y2ggKGdxcl9zdGF0dXMgc3RhdHVzKSB7CitjYXNlIFFfT0s6CisJcnF1b3RhIGdxcl9ycXVvdGE7CS8qIHZhbGlkIGlmIHN0YXR1cyA9PSBRX09LICovCitjYXNlIFFfTk9RVU9UQToKKwl2b2lkOworY2FzZSBRX0VQRVJNOgorCXZvaWQ7Cit9OworCitwcm9ncmFtIFJRVU9UQVBST0cgeworCXZlcnNpb24gUlFVT1RBVkVSUyB7CisJCS8qCisJCSAqIEdldCBhbGwgcXVvdGFzCisJCSAqLworCQlnZXRxdW90YV9yc2x0CisJCVJRVU9UQVBST0NfR0VUUVVPVEEoZ2V0cXVvdGFfYXJncykgPSAxOworCisJCS8qCisJIAkgKiBHZXQgYWN0aXZlIHF1b3RhcyBvbmx5CisJCSAqLworCQlnZXRxdW90YV9yc2x0CisJCVJRVU9UQVBST0NfR0VUQUNUSVZFUVVPVEEoZ2V0cXVvdGFfYXJncykgPSAyOworCX0gPSAxOworfSA9IDEwMDAxMTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JzdGF0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzBiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9yc3RhdC5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX1JTVEFUX0hfUlBDR0VOCisjZGVmaW5lIF9SU1RBVF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBGU0NBTEUKKy8qCisgKiBTY2FsZSBmYWN0b3IgZm9yIHNjYWxlZCBpbnRlZ2VycyB1c2VkIHRvIGNvdW50IGxvYWQgYXZlcmFnZXMuCisgKi8KKyNkZWZpbmUgRlNISUZUIDggLyogYml0cyB0byByaWdodCBvZiBmaXhlZCBiaW5hcnkgcG9pbnQgKi8KKyNkZWZpbmUgRlNDQUxFICgxPDxGU0hJRlQpCisKKyNlbmRpZiAvKiBuZGVmIEZTQ0FMRSAqLworI2RlZmluZSBDUFVTVEFURVMgNAorI2RlZmluZSBES19ORFJJVkUgNAorCitzdHJ1Y3QgcnN0YXRfdGltZXZhbCB7CisJdV9pbnQgdHZfc2VjOworCXVfaW50IHR2X3VzZWM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgcnN0YXRfdGltZXZhbCByc3RhdF90aW1ldmFsOworCitzdHJ1Y3Qgc3RhdHN0aW1lIHsKKwlpbnQgY3BfdGltZVtDUFVTVEFURVNdOworCWludCBka194ZmVyW0RLX05EUklWRV07CisJdV9pbnQgdl9wZ3BnaW47CisJdV9pbnQgdl9wZ3Bnb3V0OworCXVfaW50IHZfcHN3cGluOworCXVfaW50IHZfcHN3cG91dDsKKwl1X2ludCB2X2ludHI7CisJaW50IGlmX2lwYWNrZXRzOworCWludCBpZl9pZXJyb3JzOworCWludCBpZl9vZXJyb3JzOworCWludCBpZl9jb2xsaXNpb25zOworCXVfaW50IHZfc3d0Y2g7CisJaW50IGF2ZW5ydW5bM107CisJcnN0YXRfdGltZXZhbCBib290dGltZTsKKwlyc3RhdF90aW1ldmFsIGN1cnRpbWU7CisJaW50IGlmX29wYWNrZXRzOworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRzdGltZSBzdGF0c3RpbWU7CisKK3N0cnVjdCBzdGF0c3N3dGNoIHsKKwlpbnQgY3BfdGltZVtDUFVTVEFURVNdOworCWludCBka194ZmVyW0RLX05EUklWRV07CisJdV9pbnQgdl9wZ3BnaW47CisJdV9pbnQgdl9wZ3Bnb3V0OworCXVfaW50IHZfcHN3cGluOworCXVfaW50IHZfcHN3cG91dDsKKwl1X2ludCB2X2ludHI7CisJaW50IGlmX2lwYWNrZXRzOworCWludCBpZl9pZXJyb3JzOworCWludCBpZl9vZXJyb3JzOworCWludCBpZl9jb2xsaXNpb25zOworCXVfaW50IHZfc3d0Y2g7CisJdV9pbnQgYXZlbnJ1blszXTsKKwlyc3RhdF90aW1ldmFsIGJvb3R0aW1lOworCWludCBpZl9vcGFja2V0czsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0c3N3dGNoIHN0YXRzc3d0Y2g7CisKK3N0cnVjdCBzdGF0cyB7CisJaW50IGNwX3RpbWVbQ1BVU1RBVEVTXTsKKwlpbnQgZGtfeGZlcltES19ORFJJVkVdOworCXVfaW50IHZfcGdwZ2luOworCXVfaW50IHZfcGdwZ291dDsKKwl1X2ludCB2X3Bzd3BpbjsKKwl1X2ludCB2X3Bzd3BvdXQ7CisJdV9pbnQgdl9pbnRyOworCWludCBpZl9pcGFja2V0czsKKwlpbnQgaWZfaWVycm9yczsKKwlpbnQgaWZfb2Vycm9yczsKKwlpbnQgaWZfY29sbGlzaW9uczsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3RhdHMgc3RhdHM7CisKKyNkZWZpbmUgUlNUQVRQUk9HIDEwMDAwMQorI2RlZmluZSBSU1RBVFZFUlNfVElNRSAzCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2RlZmluZSBSU1RBVFBST0NfU1RBVFMgMQorZXh0ZXJuICBzdGF0c3RpbWUgKiByc3RhdHByb2Nfc3RhdHNfMyh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgc3RhdHN0aW1lICogcnN0YXRwcm9jX3N0YXRzXzNfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJTVEFUUFJPQ19IQVZFRElTSyAyCitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzModm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzNfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJzdGF0cHJvZ18zX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgUlNUQVRQUk9DX1NUQVRTIDEKK2V4dGVybiAgc3RhdHN0aW1lICogcnN0YXRwcm9jX3N0YXRzXzMoKTsKK2V4dGVybiAgc3RhdHN0aW1lICogcnN0YXRwcm9jX3N0YXRzXzNfc3ZjKCk7CisjZGVmaW5lIFJTVEFUUFJPQ19IQVZFRElTSyAyCitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzMoKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfM19zdmMoKTsKK2V4dGVybiBpbnQgcnN0YXRwcm9nXzNfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworI2RlZmluZSBSU1RBVFZFUlNfU1dUQ0ggMgorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgc3RhdHNzd3RjaCAqIHJzdGF0cHJvY19zdGF0c18yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdGF0c3N3dGNoICogcnN0YXRwcm9jX3N0YXRzXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzIodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJzdGF0cHJvZ18yX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiAgc3RhdHNzd3RjaCAqIHJzdGF0cHJvY19zdGF0c18yKCk7CitleHRlcm4gIHN0YXRzc3d0Y2ggKiByc3RhdHByb2Nfc3RhdHNfMl9zdmMoKTsKK2V4dGVybiAgdV9pbnQgKiByc3RhdHByb2NfaGF2ZWRpc2tfMigpOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18yX3N2YygpOworZXh0ZXJuIGludCByc3RhdHByb2dfMl9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisjZGVmaW5lIFJTVEFUVkVSU19PUklHIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIHN0YXRzICogcnN0YXRwcm9jX3N0YXRzXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0YXRzICogcnN0YXRwcm9jX3N0YXRzXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzFfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHJzdGF0cHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiAgc3RhdHMgKiByc3RhdHByb2Nfc3RhdHNfMSgpOworZXh0ZXJuICBzdGF0cyAqIHJzdGF0cHJvY19zdGF0c18xX3N2YygpOworZXh0ZXJuICB1X2ludCAqIHJzdGF0cHJvY19oYXZlZGlza18xKCk7CitleHRlcm4gIHVfaW50ICogcnN0YXRwcm9jX2hhdmVkaXNrXzFfc3ZjKCk7CitleHRlcm4gaW50IHJzdGF0cHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfcnN0YXRfdGltZXZhbCAoWERSICosIHJzdGF0X3RpbWV2YWwqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0c3RpbWUgKFhEUiAqLCBzdGF0c3RpbWUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0c3N3dGNoIChYRFIgKiwgc3RhdHNzd3RjaCopOworZXh0ZXJuICBib29sX3QgeGRyX3N0YXRzIChYRFIgKiwgc3RhdHMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX3JzdGF0X3RpbWV2YWwgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zdGF0c3RpbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zdGF0c3N3dGNoICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3RhdHMgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9SU1RBVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnN0YXQueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JzdGF0LngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2N2M0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3JzdGF0LngKQEAgLTAsMCArMSwxNDUgQEAKKy8qIEAoIylyc3RhdC54CTIuMiA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisvKiBAKCMpcnN0YXQueCAxLjIgODcvMDkvMTggQ29weXIgMTk4NyBTdW4gTWljcm8gKi8KKworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICogCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqIAorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKiAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqIAorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICogCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIEdhdGhlciBzdGF0aXN0aWNzIG9uIHJlbW90ZSBtYWNoaW5lcworICovCisKKyNpZmRlZiBSUENfSERSCisKKyUjaWZuZGVmIEZTQ0FMRQorJS8qCislICogU2NhbGUgZmFjdG9yIGZvciBzY2FsZWQgaW50ZWdlcnMgdXNlZCB0byBjb3VudCBsb2FkIGF2ZXJhZ2VzLgorJSAqLworJSNkZWZpbmUgRlNISUZUICA4ICAgICAgICAgICAgICAgLyogYml0cyB0byByaWdodCBvZiBmaXhlZCBiaW5hcnkgcG9pbnQgKi8KKyUjZGVmaW5lIEZTQ0FMRSAgKDE8PEZTSElGVCkKKyUKKyUjZW5kaWYgLyogbmRlZiBGU0NBTEUgKi8KKworI2VuZGlmIC8qIGRlZiBSUENfSERSICovCisKK2NvbnN0IENQVVNUQVRFUyA9IDQ7Citjb25zdCBES19ORFJJVkUgPSA0OworCisvKgorICogR01UIHNpbmNlIDA6MDAsIEphbnVhcnkgMSwgMTk3MAorICovCitzdHJ1Y3QgcnN0YXRfdGltZXZhbCB7CisJdW5zaWduZWQgaW50IHR2X3NlYzsJLyogc2Vjb25kcyAqLworCXVuc2lnbmVkIGludCB0dl91c2VjOwkvKiBhbmQgbWljcm9zZWNvbmRzICovCit9OworCitzdHJ1Y3Qgc3RhdHN0aW1lIHsJCQkJLyogUlNUQVRWRVJTX1RJTUUgKi8KKwlpbnQgY3BfdGltZVtDUFVTVEFURVNdOworCWludCBka194ZmVyW0RLX05EUklWRV07CisJdW5zaWduZWQgaW50IHZfcGdwZ2luOwkvKiB0aGVzZSBhcmUgY3VtdWxhdGl2ZSBzdW0gKi8KKwl1bnNpZ25lZCBpbnQgdl9wZ3Bnb3V0OworCXVuc2lnbmVkIGludCB2X3Bzd3BpbjsKKwl1bnNpZ25lZCBpbnQgdl9wc3dwb3V0OworCXVuc2lnbmVkIGludCB2X2ludHI7CisJaW50IGlmX2lwYWNrZXRzOworCWludCBpZl9pZXJyb3JzOworCWludCBpZl9vZXJyb3JzOworCWludCBpZl9jb2xsaXNpb25zOworCXVuc2lnbmVkIGludCB2X3N3dGNoOworCWludCBhdmVucnVuWzNdOyAgICAgICAgIC8qIHNjYWxlZCBieSBGU0NBTEUgKi8KKwlyc3RhdF90aW1ldmFsIGJvb3R0aW1lOworCXJzdGF0X3RpbWV2YWwgY3VydGltZTsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OworCitzdHJ1Y3Qgc3RhdHNzd3RjaCB7CQkJLyogUlNUQVRWRVJTX1NXVENIICovCisJaW50IGNwX3RpbWVbQ1BVU1RBVEVTXTsKKwlpbnQgZGtfeGZlcltES19ORFJJVkVdOworCXVuc2lnbmVkIGludCB2X3BncGdpbjsJLyogdGhlc2UgYXJlIGN1bXVsYXRpdmUgc3VtICovCisJdW5zaWduZWQgaW50IHZfcGdwZ291dDsKKwl1bnNpZ25lZCBpbnQgdl9wc3dwaW47CisJdW5zaWduZWQgaW50IHZfcHN3cG91dDsKKwl1bnNpZ25lZCBpbnQgdl9pbnRyOworCWludCBpZl9pcGFja2V0czsKKwlpbnQgaWZfaWVycm9yczsKKwlpbnQgaWZfb2Vycm9yczsKKwlpbnQgaWZfY29sbGlzaW9uczsKKwl1bnNpZ25lZCBpbnQgdl9zd3RjaDsKKwl1bnNpZ25lZCBpbnQgYXZlbnJ1blszXTsvKiBzY2FsZWQgYnkgRlNDQUxFICovCisJcnN0YXRfdGltZXZhbCBib290dGltZTsKKwlpbnQgaWZfb3BhY2tldHM7Cit9OworCitzdHJ1Y3Qgc3RhdHMgewkJCQkvKiBSU1RBVFZFUlNfT1JJRyAqLworCWludCBjcF90aW1lW0NQVVNUQVRFU107CisJaW50IGRrX3hmZXJbREtfTkRSSVZFXTsKKwl1bnNpZ25lZCBpbnQgdl9wZ3BnaW47CS8qIHRoZXNlIGFyZSBjdW11bGF0aXZlIHN1bSAqLworCXVuc2lnbmVkIGludCB2X3BncGdvdXQ7CisJdW5zaWduZWQgaW50IHZfcHN3cGluOworCXVuc2lnbmVkIGludCB2X3Bzd3BvdXQ7CisJdW5zaWduZWQgaW50IHZfaW50cjsKKwlpbnQgaWZfaXBhY2tldHM7CisJaW50IGlmX2llcnJvcnM7CisJaW50IGlmX29lcnJvcnM7CisJaW50IGlmX2NvbGxpc2lvbnM7CisJaW50IGlmX29wYWNrZXRzOworfTsKKworCitwcm9ncmFtIFJTVEFUUFJPRyB7CisJLyoKKwkgKiBOZXdlc3QgdmVyc2lvbiBpbmNsdWRlcyBjdXJyZW50IHRpbWUgYW5kIGNvbnRleHQgc3dpdGNoaW5nIGluZm8KKwkgKi8KKwl2ZXJzaW9uIFJTVEFUVkVSU19USU1FIHsKKwkJc3RhdHN0aW1lCisJCVJTVEFUUFJPQ19TVEFUUyh2b2lkKSA9IDE7CisKKwkJdW5zaWduZWQgaW50CisJCVJTVEFUUFJPQ19IQVZFRElTSyh2b2lkKSA9IDI7CisJfSA9IDM7CisJLyoKKwkgKiBEb2VzIG5vdCBoYXZlIGN1cnJlbnQgdGltZQorCSAqLworCXZlcnNpb24gUlNUQVRWRVJTX1NXVENIIHsKKwkJc3RhdHNzd3RjaAorCQlSU1RBVFBST0NfU1RBVFModm9pZCkgPSAxOworCisJCXVuc2lnbmVkIGludAorCQlSU1RBVFBST0NfSEFWRURJU0sodm9pZCkgPSAyOworCX0gPSAyOworCS8qCisJICogT2xkIHZlcnNpb24gaGFzIG5vIGluZm8gYWJvdXQgY3VycmVudCB0aW1lIG9yIGNvbnRleHQgc3dpdGNoaW5nCisJICovCisJdmVyc2lvbiBSU1RBVFZFUlNfT1JJRyB7CisJCXN0YXRzCisJCVJTVEFUUFJPQ19TVEFUUyh2b2lkKSA9IDE7CisKKwkJdW5zaWduZWQgaW50CisJCVJTVEFUUFJPQ19IQVZFRElTSyh2b2lkKSA9IDI7CisJfSA9IDE7Cit9ID0gMTAwMDAxOwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9ydXNlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJkM2IwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfUlVTRVJTX0hfUlBDR0VOCisjZGVmaW5lIF9SVVNFUlNfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBGaW5kIG91dCBhYm91dCByZW1vdGUgdXNlcnMKKyAqLworI2RlZmluZSBSVVNFUlNfTUFYVVNFUkxFTiAzMgorI2RlZmluZSBSVVNFUlNfTUFYTElORUxFTiAzMgorI2RlZmluZSBSVVNFUlNfTUFYSE9TVExFTiAyNTcKKworc3RydWN0IHJ1c2Vyc191dG1wIHsKKwljaGFyICp1dF91c2VyOworCWNoYXIgKnV0X2xpbmU7CisJY2hhciAqdXRfaG9zdDsKKwlpbnQgdXRfdHlwZTsKKwlpbnQgdXRfdGltZTsKKwl1X2ludCB1dF9pZGxlOworfTsKK3R5cGVkZWYgc3RydWN0IHJ1c2Vyc191dG1wIHJ1c2Vyc191dG1wOworCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQgdXRtcF9hcnJheV9sZW47CisJcnVzZXJzX3V0bXAgKnV0bXBfYXJyYXlfdmFsOworfSB1dG1wX2FycmF5OworCisvKgorICogVmFsdWVzIGZvciB1dF90eXBlIGZpZWxkIGFib3ZlLgorICovCisjZGVmaW5lIFJVU0VSU19FTVBUWSAwCisjZGVmaW5lIFJVU0VSU19SVU5fTFZMIDEKKyNkZWZpbmUgUlVTRVJTX0JPT1RfVElNRSAyCisjZGVmaW5lIFJVU0VSU19PTERfVElNRSAzCisjZGVmaW5lIFJVU0VSU19ORVdfVElNRSA0CisjZGVmaW5lIFJVU0VSU19JTklUX1BST0NFU1MgNQorI2RlZmluZSBSVVNFUlNfTE9HSU5fUFJPQ0VTUyA2CisjZGVmaW5lIFJVU0VSU19VU0VSX1BST0NFU1MgNworI2RlZmluZSBSVVNFUlNfREVBRF9QUk9DRVNTIDgKKyNkZWZpbmUgUlVTRVJTX0FDQ09VTlRJTkcgOQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHJwYy94ZHIuaD4KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBhcmUgdXNlZCBieSB2ZXJzaW9uIDIgb2YgdGhlIHJ1c2Vyc2QgcHJvdG9jb2wuCisgKiBUaGV5IHdlcmUgbm90IGRldmVsb3BlZCB3aXRoIHJwY2dlbiwgc28gdGhleSBkbyBub3QgYXBwZWFyIGFzIFJQQ0wuCisgKi8KKworI2RlZmluZSBSVVNFUlNWRVJTX0lETEUgMgorI2RlZmluZSBSVVNFUlNWRVJTIDMgLyogY3VycmVudCB2ZXJzaW9uICovCisjZGVmaW5lIE1BWFVTRVJTIDEwMAorCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgaW4gdmVyc2lvbiAyIG9mIHRoZSBydXNlcnNkIFJQQyBzZXJ2aWNlLgorICogSXQgY29ycmVzcG9uZHMgdG8gdGhlIHV0bXAgc3RydWN0dXJlIGZvciBCU0Qgc3lzdGVtcy4KKyAqLworc3RydWN0IHJ1X3V0bXAgeworIGNoYXIgdXRfbGluZVs4XTsgLyogdHR5IG5hbWUgKi8KKyBjaGFyIHV0X25hbWVbOF07IC8qIHVzZXIgaWQgKi8KKyBjaGFyIHV0X2hvc3RbMTZdOyAvKiBob3N0IG5hbWUsIGlmIHJlbW90ZSAqLworIGxvbmcgaW50IHV0X3RpbWU7IC8qIHRpbWUgb24gKi8KK307CisKK3N0cnVjdCB1dG1wYXJyIHsKKyBzdHJ1Y3QgcnVfdXRtcCAqKnV0YV9hcnI7CisgaW50IHV0YV9jbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgdXRtcGFyciB1dG1wYXJyOworCitleHRlcm4gYm9vbF90IHhkcl91dG1wYXJyIChYRFIgKnhkcnMsIHN0cnVjdCB1dG1wYXJyICpvYmpwKSBfX1RIUk9XOworCitzdHJ1Y3QgdXRtcGlkbGUgeworIHN0cnVjdCBydV91dG1wIHVpX3V0bXA7CisgdW5zaWduZWQgaW50IHVpX2lkbGU7Cit9OworCitzdHJ1Y3QgdXRtcGlkbGVhcnIgeworIHN0cnVjdCB1dG1waWRsZSAqKnVpYV9hcnI7CisgaW50IHVpYV9jbnQ7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl91dG1waWRsZWFyciAoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGVhcnIgKm9ianApIF9fVEhST1c7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNkZWZpbmUgUlVTRVJTUFJPRyAxMDAwMDIKKyNkZWZpbmUgUlVTRVJTVkVSU18zIDMKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFJVU0VSU1BST0NfTlVNIDEKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fMyh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fM19zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19OQU1FUyAyCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX25hbWVzXzModm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX25hbWVzXzNfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFJVU0VSU1BST0NfQUxMTkFNRVMgMworZXh0ZXJuICB1dG1wX2FycmF5ICogcnVzZXJzcHJvY19hbGxuYW1lc18zKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1dG1wX2FycmF5ICogcnVzZXJzcHJvY19hbGxuYW1lc18zX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBydXNlcnNwcm9nXzNfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBSVVNFUlNQUk9DX05VTSAxCitleHRlcm4gIGludCAqIHJ1c2Vyc3Byb2NfbnVtXzMoKTsKK2V4dGVybiAgaW50ICogcnVzZXJzcHJvY19udW1fM19zdmMoKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19OQU1FUyAyCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX25hbWVzXzMoKTsKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfbmFtZXNfM19zdmMoKTsKKyNkZWZpbmUgUlVTRVJTUFJPQ19BTExOQU1FUyAzCitleHRlcm4gIHV0bXBfYXJyYXkgKiBydXNlcnNwcm9jX2FsbG5hbWVzXzMoKTsKK2V4dGVybiAgdXRtcF9hcnJheSAqIHJ1c2Vyc3Byb2NfYWxsbmFtZXNfM19zdmMoKTsKK2V4dGVybiBpbnQgcnVzZXJzcHJvZ18zX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfcnVzZXJzX3V0bXAgKFhEUiAqLCBydXNlcnNfdXRtcCopOworZXh0ZXJuICBib29sX3QgeGRyX3V0bXBfYXJyYXkgKFhEUiAqLCB1dG1wX2FycmF5Kik7CisKKyNlbHNlIC8qIEsmUiBDICovCitleHRlcm4gYm9vbF90IHhkcl9ydXNlcnNfdXRtcCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3V0bXBfYXJyYXkgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9SVVNFUlNfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3J1c2Vycy54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvcnVzZXJzLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyYzI5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3J1c2Vycy54CkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworJS8qCislICogRmluZCBvdXQgYWJvdXQgcmVtb3RlIHVzZXJzCislICovCisKK2NvbnN0IFJVU0VSU19NQVhVU0VSTEVOID0gMzI7Citjb25zdCBSVVNFUlNfTUFYTElORUxFTiA9IDMyOworY29uc3QgUlVTRVJTX01BWEhPU1RMRU4gPSAyNTc7CisKK3N0cnVjdCBydXNlcnNfdXRtcCB7CisJc3RyaW5nIHV0X3VzZXI8UlVTRVJTX01BWFVTRVJMRU4+OwkvKiBha2EgdXRfbmFtZSAqLworCXN0cmluZyB1dF9saW5lPFJVU0VSU19NQVhMSU5FTEVOPjsJLyogZGV2aWNlICovCisJc3RyaW5nIHV0X2hvc3Q8UlVTRVJTX01BWEhPU1RMRU4+OwkvKiBob3N0IHVzZXIgbG9nZ2VkIG9uIGZyb20gKi8KKwlpbnQgdXRfdHlwZTsJCQkJLyogdHlwZSBvZiBlbnRyeSAqLworCWludCB1dF90aW1lOwkJCQkvKiB0aW1lIGVudHJ5IHdhcyBtYWRlICovCisJdW5zaWduZWQgaW50IHV0X2lkbGU7CQkJLyogbWludXRlcyBpZGxlICovCit9OworCit0eXBlZGVmIHJ1c2Vyc191dG1wIHV0bXBfYXJyYXk8PjsKKworI2lmZGVmIFJQQ19IRFIKKyUKKyUvKgorJSAqIFZhbHVlcyBmb3IgdXRfdHlwZSBmaWVsZCBhYm92ZS4KKyUgKi8KKyNlbmRpZgorY29uc3QJUlVTRVJTX0VNUFRZID0gMDsKK2NvbnN0CVJVU0VSU19SVU5fTFZMID0gMTsKK2NvbnN0CVJVU0VSU19CT09UX1RJTUUgPSAyOworY29uc3QJUlVTRVJTX09MRF9USU1FID0gMzsKK2NvbnN0CVJVU0VSU19ORVdfVElNRSA9IDQ7Citjb25zdAlSVVNFUlNfSU5JVF9QUk9DRVNTID0gNTsKK2NvbnN0CVJVU0VSU19MT0dJTl9QUk9DRVNTID0gNjsKK2NvbnN0CVJVU0VSU19VU0VSX1BST0NFU1MgPSA3OworY29uc3QJUlVTRVJTX0RFQURfUFJPQ0VTUyA9IDg7Citjb25zdAlSVVNFUlNfQUNDT1VOVElORyA9IDk7CisKK3Byb2dyYW0gUlVTRVJTUFJPRyB7CisKKwl2ZXJzaW9uIFJVU0VSU1ZFUlNfMyB7CisJCWludAorCQlSVVNFUlNQUk9DX05VTSh2b2lkKSA9IDE7CisKKwkJdXRtcF9hcnJheQorCQlSVVNFUlNQUk9DX05BTUVTKHZvaWQpID0gMjsKKworCQl1dG1wX2FycmF5CisJCVJVU0VSU1BST0NfQUxMTkFNRVModm9pZCkgPSAzOworCX0gPSAzOworCit9ID0gMTAwMDAyOworCisjaWZkZWYgUlBDX0hEUgorJQorJQorJSNpZmRlZglfX2NwbHVzcGx1cworJWV4dGVybiAiQyIgeworJSNlbmRpZgorJQorJSNpbmNsdWRlIDxycGMveGRyLmg+CislCislLyoKKyUgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgYXJlIHVzZWQgYnkgdmVyc2lvbiAyIG9mIHRoZSBydXNlcnNkIHByb3RvY29sLgorJSAqIFRoZXkgd2VyZSBub3QgZGV2ZWxvcGVkIHdpdGggcnBjZ2VuLCBzbyB0aGV5IGRvIG5vdCBhcHBlYXIgYXMgUlBDTC4KKyUgKi8KKyUKKyUjZGVmaW5lCVJVU0VSU1ZFUlNfSURMRSAyCislI2RlZmluZQlSVVNFUlNWRVJTIDMJCS8qIGN1cnJlbnQgdmVyc2lvbiAqLworJSNkZWZpbmUJTUFYVVNFUlMgMTAwCislCislLyoKKyUgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCBpbiB2ZXJzaW9uIDIgb2YgdGhlIHJ1c2Vyc2QgUlBDIHNlcnZpY2UuCislICogSXQgY29ycmVzcG9uZHMgdG8gdGhlIHV0bXAgc3RydWN0dXJlIGZvciBCU0Qgc3lzdGVtcy4KKyUgKi8KKyVzdHJ1Y3QgcnVfdXRtcCB7CislCWNoYXIJdXRfbGluZVs4XTsJCS8qIHR0eSBuYW1lICovCislCWNoYXIJdXRfbmFtZVs4XTsJCS8qIHVzZXIgaWQgKi8KKyUJY2hhcgl1dF9ob3N0WzE2XTsJCS8qIGhvc3QgbmFtZSwgaWYgcmVtb3RlICovCislCWxvbmcgaW50IHV0X3RpbWU7CQkvKiB0aW1lIG9uICovCislfTsKKyUKKyVzdHJ1Y3QgdXRtcGFyciB7CislICAgICAgIHN0cnVjdCBydV91dG1wICoqdXRhX2FycjsKKyUgICAgICAgaW50IHV0YV9jbnQ7CislfTsKKyV0eXBlZGVmIHN0cnVjdCB1dG1wYXJyIHV0bXBhcnI7CislCislZXh0ZXJuIGJvb2xfdCB4ZHJfdXRtcGFyciAoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGFyciAqb2JqcCkgX19USFJPVzsKKyUKKyVzdHJ1Y3QgdXRtcGlkbGUgeworJQlzdHJ1Y3QgcnVfdXRtcCB1aV91dG1wOworJQl1bnNpZ25lZCBpbnQgdWlfaWRsZTsKKyV9OworJQorJXN0cnVjdCB1dG1waWRsZWFyciB7CislCXN0cnVjdCB1dG1waWRsZSAqKnVpYV9hcnI7CislCWludCB1aWFfY250OworJX07CislCislZXh0ZXJuIGJvb2xfdCB4ZHJfdXRtcGlkbGVhcnIgKFhEUiAqeGRycywgc3RydWN0IHV0bXBpZGxlYXJyICpvYmpwKSBfX1RIUk9XOworJQorJSNpZmRlZglfX2NwbHVzcGx1cworJX0KKyUjZW5kaWYKKyNlbmRpZgorCisKKyNpZmRlZglSUENfWERSCislYm9vbF90IHhkcl91dG1wIChYRFIgKnhkcnMsIHN0cnVjdCBydV91dG1wICpvYmpwKTsKKyUKKyVib29sX3QKKyV4ZHJfdXRtcCh4ZHJzLCBvYmpwKQorJQlYRFIgKnhkcnM7CislCXN0cnVjdCBydV91dG1wICpvYmpwOworJXsKKyUJLyogU2luY2UgdGhlIGZpZWxkcyBhcmUgY2hhciBmb28gW3h4eF0sIHdlIHNob3VsZCBub3QgZnJlZSB0aGVtLiAqLworJQlpZiAoeGRycy0+eF9vcCAhPSBYRFJfRlJFRSkKKyUJeworJQkJY2hhciAqcHRyOworJQkJdW5zaWduZWQgaW50IHNpemU7CislCQlwdHIgPSBvYmpwLT51dF9saW5lOworJQkJc2l6ZSA9IHNpemVvZiAob2JqcC0+dXRfbGluZSk7CislCQlpZiAoIXhkcl9ieXRlcyAoeGRycywgJnB0ciwgJnNpemUsIHNpemUpKSB7CislCQkJcmV0dXJuIChGQUxTRSk7CislCQl9CislCQlwdHIgPSBvYmpwLT51dF9uYW1lOworJQkJc2l6ZSA9IHNpemVvZiAob2JqcC0+dXRfbmFtZSk7CislCQlpZiAoIXhkcl9ieXRlcyAoeGRycywgJnB0ciwgJnNpemUsIHNpemUpKSB7CislCQkJcmV0dXJuIChGQUxTRSk7CislCQl9CislCQlwdHIgPSBvYmpwLT51dF9ob3N0OworJQkJc2l6ZSA9IHNpemVvZiAob2JqcC0+dXRfaG9zdCk7CislCQlpZiAoIXhkcl9ieXRlcyAoeGRycywgJnB0ciwgJnNpemUsIHNpemUpKSB7CislCQkJcmV0dXJuIChGQUxTRSk7CislCQl9CislCX0KKyUJaWYgKCF4ZHJfbG9uZyh4ZHJzLCAmb2JqcC0+dXRfdGltZSkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdCB4ZHJfdXRtcHB0cihYRFIgKnhkcnMsIHN0cnVjdCBydV91dG1wICoqb2JqcHApOworJQorJWJvb2xfdAorJXhkcl91dG1wcHRyKHhkcnMsIG9ianBwKQorJQlYRFIgKnhkcnM7CislCXN0cnVjdCBydV91dG1wICoqb2JqcHA7CisleworJQlpZiAoIXhkcl9yZWZlcmVuY2UoeGRycywgKGNoYXIgKiopIG9ianBwLCBzaXplb2YgKHN0cnVjdCBydV91dG1wKSwKKyUJCQkgICAoeGRycHJvY190KSB4ZHJfdXRtcCkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdAorJXhkcl91dG1wYXJyKHhkcnMsIG9ianApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBhcnIgKm9ianA7CisleworJQlpZiAoIXhkcl9hcnJheSh4ZHJzLCAoY2hhciAqKikmb2JqcC0+dXRhX2FyciwgKHVfaW50ICopJm9ianAtPnV0YV9jbnQsCislCQkgICAgICAgTUFYVVNFUlMsIHNpemVvZihzdHJ1Y3QgcnVfdXRtcCAqKSwKKyUJCSAgICAgICAoeGRycHJvY190KSB4ZHJfdXRtcHB0cikpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdCB4ZHJfdXRtcGlkbGUoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGUgKm9ianApOworJQorJWJvb2xfdAorJXhkcl91dG1waWRsZSh4ZHJzLCBvYmpwKQorJQlYRFIgKnhkcnM7CislCXN0cnVjdCB1dG1waWRsZSAqb2JqcDsKKyV7CislCWlmICgheGRyX3V0bXAoeGRycywgJm9ianAtPnVpX3V0bXApKSB7CislCQlyZXR1cm4gKEZBTFNFKTsKKyUJfQorJQlpZiAoIXhkcl91X2ludCh4ZHJzLCAmb2JqcC0+dWlfaWRsZSkpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorJQorJWJvb2xfdCB4ZHJfdXRtcGlkbGVwdHIoWERSICp4ZHJzLCBzdHJ1Y3QgdXRtcGlkbGUgKipvYmpwKTsKKyUKKyVib29sX3QKKyV4ZHJfdXRtcGlkbGVwdHIoeGRycywgb2JqcHApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBpZGxlICoqb2JqcHA7CisleworJQlpZiAoIXhkcl9yZWZlcmVuY2UoeGRycywgKGNoYXIgKiopIG9ianBwLCBzaXplb2YgKHN0cnVjdCB1dG1waWRsZSksCislCQkJICAgKHhkcnByb2NfdCkgeGRyX3V0bXBpZGxlKSkgeworJQkJcmV0dXJuIChGQUxTRSk7CislCX0KKyUJcmV0dXJuIChUUlVFKTsKKyV9CislCislYm9vbF90CisleGRyX3V0bXBpZGxlYXJyKHhkcnMsIG9ianApCislCVhEUiAqeGRyczsKKyUJc3RydWN0IHV0bXBpZGxlYXJyICpvYmpwOworJXsKKyUJaWYgKCF4ZHJfYXJyYXkoeGRycywgKGNoYXIgKiopJm9ianAtPnVpYV9hcnIsICh1X2ludCAqKSZvYmpwLT51aWFfY250LAorJQkJICAgICAgIE1BWFVTRVJTLCBzaXplb2Yoc3RydWN0IHV0bXBpZGxlICopLAorJQkJICAgICAgICh4ZHJwcm9jX3QpIHhkcl91dG1waWRsZXB0cikpIHsKKyUJCXJldHVybiAoRkFMU0UpOworJQl9CislCXJldHVybiAoVFJVRSk7CislfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJjM2UxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCisgKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KKyAqLworCisjaWZuZGVmIF9TTV9JTlRFUl9IX1JQQ0dFTgorI2RlZmluZSBfU01fSU5URVJfSF9SUENHRU4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU01fTUFYU1RSTEVOIDEwMjQKKworc3RydWN0IHNtX25hbWUgeworCWNoYXIgKm1vbl9uYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IHNtX25hbWUgc21fbmFtZTsKKworc3RydWN0IG15X2lkIHsKKwljaGFyICpteV9uYW1lOworCWludCBteV9wcm9nOworCWludCBteV92ZXJzOworCWludCBteV9wcm9jOworfTsKK3R5cGVkZWYgc3RydWN0IG15X2lkIG15X2lkOworCitzdHJ1Y3QgbW9uX2lkIHsKKwljaGFyICptb25fbmFtZTsKKwlzdHJ1Y3QgbXlfaWQgbXlfaWQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW9uX2lkIG1vbl9pZDsKKworc3RydWN0IG1vbiB7CisJc3RydWN0IG1vbl9pZCBtb25faWQ7CisJY2hhciBwcml2WzE2XTsKK307Cit0eXBlZGVmIHN0cnVjdCBtb24gbW9uOworCitzdHJ1Y3Qgc21fc3RhdCB7CisJaW50IHN0YXRlOworfTsKK3R5cGVkZWYgc3RydWN0IHNtX3N0YXQgc21fc3RhdDsKKworZW51bSByZXMgeworCXN0YXRfc3VjYyA9IDAsCisJc3RhdF9mYWlsID0gMSwKK307Cit0eXBlZGVmIGVudW0gcmVzIHJlczsKKworc3RydWN0IHNtX3N0YXRfcmVzIHsKKwlyZXMgcmVzX3N0YXQ7CisJaW50IHN0YXRlOworfTsKK3R5cGVkZWYgc3RydWN0IHNtX3N0YXRfcmVzIHNtX3N0YXRfcmVzOworCitzdHJ1Y3Qgc3RhdHVzIHsKKwljaGFyICptb25fbmFtZTsKKwlpbnQgc3RhdGU7CisJY2hhciBwcml2WzE2XTsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0dXMgc3RhdHVzOworCisjZGVmaW5lIFNNX1BST0cgMTAwMDI0CisjZGVmaW5lIFNNX1ZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgU01fU1RBVCAxCitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX3N0YXRfMShzdHJ1Y3Qgc21fbmFtZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX3N0YXRfMV9zdmMoc3RydWN0IHNtX25hbWUgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNNX01PTiAyCitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX21vbl8xKHN0cnVjdCBtb24gKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdF9yZXMgKiBzbV9tb25fMV9zdmMoc3RydWN0IG1vbiAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU01fVU5NT04gMworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uXzEoc3RydWN0IG1vbl9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fMV9zdmMoc3RydWN0IG1vbl9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgU01fVU5NT05fQUxMIDQKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl9hbGxfMShzdHJ1Y3QgbXlfaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uX2FsbF8xX3N2YyhzdHJ1Y3QgbXlfaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNNX1NJTVVfQ1JBU0ggNQorZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCBzbV9wcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBTTV9TVEFUIDEKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fc3RhdF8xKCk7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0X3JlcyAqIHNtX3N0YXRfMV9zdmMoKTsKKyNkZWZpbmUgU01fTU9OIDIKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fbW9uXzEoKTsKK2V4dGVybiAgc3RydWN0IHNtX3N0YXRfcmVzICogc21fbW9uXzFfc3ZjKCk7CisjZGVmaW5lIFNNX1VOTU9OIDMKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl8xKCk7CitleHRlcm4gIHN0cnVjdCBzbV9zdGF0ICogc21fdW5tb25fMV9zdmMoKTsKKyNkZWZpbmUgU01fVU5NT05fQUxMIDQKK2V4dGVybiAgc3RydWN0IHNtX3N0YXQgKiBzbV91bm1vbl9hbGxfMSgpOworZXh0ZXJuICBzdHJ1Y3Qgc21fc3RhdCAqIHNtX3VubW9uX2FsbF8xX3N2YygpOworI2RlZmluZSBTTV9TSU1VX0NSQVNIIDUKK2V4dGVybiAgdm9pZCAqIHNtX3NpbXVfY3Jhc2hfMSgpOworZXh0ZXJuICB2b2lkICogc21fc2ltdV9jcmFzaF8xX3N2YygpOworZXh0ZXJuIGludCBzbV9wcm9nXzFfZnJlZXJlc3VsdCAoKTsKKyNlbmRpZiAvKiBLJlIgQyAqLworCisvKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAgYm9vbF90IHhkcl9zbV9uYW1lIChYRFIgKiwgc21fbmFtZSopOworZXh0ZXJuICBib29sX3QgeGRyX215X2lkIChYRFIgKiwgbXlfaWQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9tb25faWQgKFhEUiAqLCBtb25faWQqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9tb24gKFhEUiAqLCBtb24qKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zbV9zdGF0IChYRFIgKiwgc21fc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3JlcyAoWERSICosIHJlcyopOworZXh0ZXJuICBib29sX3QgeGRyX3NtX3N0YXRfcmVzIChYRFIgKiwgc21fc3RhdF9yZXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9zdGF0dXMgKFhEUiAqLCBzdGF0dXMqKTsKKworI2Vsc2UgLyogSyZSIEMgKi8KK2V4dGVybiBib29sX3QgeGRyX3NtX25hbWUgKCk7CitleHRlcm4gYm9vbF90IHhkcl9teV9pZCAoKTsKK2V4dGVybiBib29sX3QgeGRyX21vbl9pZCAoKTsKK2V4dGVybiBib29sX3QgeGRyX21vbiAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NtX3N0YXQgKCk7CitleHRlcm4gYm9vbF90IHhkcl9yZXMgKCk7CitleHRlcm4gYm9vbF90IHhkcl9zbV9zdGF0X3JlcyAoKTsKK2V4dGVybiBib29sX3QgeGRyX3N0YXR1cyAoKTsKKworI2VuZGlmIC8qIEsmUiBDICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1NNX0lOVEVSX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zbV9pbnRlci54IGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JiNzAxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMvc21faW50ZXIueApAQCAtMCwwICsxLDExNiBAQAorLyogQCgjKXNtX2ludGVyLngJMi4yIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKy8qIEAoIylzbV9pbnRlci54IDEuNyA4Ny8wNi8yNCBDb3B5ciAxOTg3IFN1biBNaWNybyAqLworCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIFN0YXR1cyBtb25pdG9yIHByb3RvY29sIHNwZWNpZmljYXRpb24KKyAqIENvcHlyaWdodCAoQykgMTk4NiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKgorICovCisKKworcHJvZ3JhbSBTTV9QUk9HIHsKKwl2ZXJzaW9uIFNNX1ZFUlMgIHsKKwkJLyogcmVzX3N0YXQgPSBzdGF0X3N1Y2MgaWYgc3RhdHVzIG1vbml0b3IgYWdyZWVzIHRvIG1vbml0b3IgKi8KKwkJLyogcmVzX3N0YXQgPSBzdGF0X2ZhaWwgaWYgc3RhdHVzIG1vbml0b3IgY2Fubm90IG1vbml0b3IgKi8KKwkJLyogaWYgcmVzX3N0YXQgPT0gc3RhdF9zdWNjLCBzdGF0ZSA9IHN0YXRlIG51bWJlciBvZiBzaXRlIHNtX25hbWUgKi8KKwkJc3RydWN0IHNtX3N0YXRfcmVzCQkJIFNNX1NUQVQoc3RydWN0IHNtX25hbWUpID0gMTsKKworCQkvKiByZXNfc3RhdCA9IHN0YXRfc3VjYyBpZiBzdGF0dXMgbW9uaXRvciBhZ3JlZXMgdG8gbW9uaXRvciAqLworCQkvKiByZXNfc3RhdCA9IHN0YXRfZmFpbCBpZiBzdGF0dXMgbW9uaXRvciBjYW5ub3QgbW9uaXRvciAqLworCQkvKiBzdGF0IGNvbnNpc3RzIG9mIHN0YXRlIG51bWJlciBvZiBsb2NhbCBzaXRlICovCisJCXN0cnVjdCBzbV9zdGF0X3JlcwkJCSBTTV9NT04oc3RydWN0IG1vbikgPSAyOworCisJCS8qIHN0YXQgY29uc2lzdHMgb2Ygc3RhdGUgbnVtYmVyIG9mIGxvY2FsIHNpdGUgKi8KKwkJc3RydWN0IHNtX3N0YXQJCQkJIFNNX1VOTU9OKHN0cnVjdCBtb25faWQpID0gMzsKKworCQkvKiBzdGF0IGNvbnNpc3RzIG9mIHN0YXRlIG51bWJlciBvZiBsb2NhbCBzaXRlICovCisJCXN0cnVjdCBzbV9zdGF0CQkJCSBTTV9VTk1PTl9BTEwoc3RydWN0IG15X2lkKSA9IDQ7CisKKwkJdm9pZAkJCQkJIFNNX1NJTVVfQ1JBU0godm9pZCkgPSA1OworCisJfSA9IDE7Cit9ID0gMTAwMDI0OworCitjb25zdAlTTV9NQVhTVFJMRU4gPSAxMDI0OworCitzdHJ1Y3Qgc21fbmFtZSB7CisJc3RyaW5nIG1vbl9uYW1lPFNNX01BWFNUUkxFTj47Cit9OworCitzdHJ1Y3QgbXlfaWQgeworCXN0cmluZwkgbXlfbmFtZTxTTV9NQVhTVFJMRU4+OwkJLyogbmFtZSBvZiB0aGUgc2l0ZSBpbml0aWF0aW5nIHRoZSBtb25pdG9yaW5nIHJlcXVlc3QqLworCWludAlteV9wcm9nOwkJCS8qIHJwYyBwcm9ncmFtICMgb2YgdGhlIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworCWludAlteV92ZXJzOwkJCS8qIHJwYyB2ZXJzaW9uICMgb2YgdGhlIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworCWludAlteV9wcm9jOwkJCS8qIHJwYyBwcm9jZWR1cmUgIyBvZiB0aGUgcmVxdWVzdGluZyBwcm9jZXNzICovCit9OworCitzdHJ1Y3QgbW9uX2lkIHsKKwlzdHJpbmcJbW9uX25hbWU8U01fTUFYU1RSTEVOPjsJCS8qIG5hbWUgb2YgdGhlIHNpdGUgdG8gYmUgbW9uaXRvcmVkICovCisJc3RydWN0IG15X2lkIG15X2lkOworfTsKKworCitzdHJ1Y3QgbW9ueworCXN0cnVjdCBtb25faWQgbW9uX2lkOworCW9wYXF1ZSBwcml2WzE2XTsgCQkvKiBwcml2YXRlIGluZm9ybWF0aW9uIHRvIHN0b3JlIGF0IG1vbml0b3IgZm9yIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworfTsKKworCisvKgorICogc3RhdGUgIyBvZiBzdGF0dXMgbW9uaXRvciBtb25vdG9uaWNhbGx5IGluY3JlYXNlcyBlYWNoIHRpbWUKKyAqIHN0YXR1cyBvZiB0aGUgc2l0ZSBjaGFuZ2VzOgorICogYW4gZXZlbiBudW1iZXIgKD49IDApIGluZGljYXRlcyB0aGUgc2l0ZSBpcyBkb3duIGFuZAorICogYW4gb2RkIG51bWJlciAoPiAwKSBpbmRpY2F0ZXMgdGhlIHNpdGUgaXMgdXA7CisgKi8KK3N0cnVjdCBzbV9zdGF0IHsKKwlpbnQgc3RhdGU7CQkvKiBzdGF0ZSAjIG9mIHN0YXR1cyBtb25pdG9yICovCit9OworCitlbnVtIHJlcyB7CisJc3RhdF9zdWNjID0gMCwJCS8qIHN0YXR1cyBtb25pdG9yIGFncmVlcyB0byBtb25pdG9yICovCisJc3RhdF9mYWlsID0gMQkJLyogc3RhdHVzIG1vbml0b3IgY2Fubm90IG1vbml0b3IgKi8KK307CisKK3N0cnVjdCBzbV9zdGF0X3JlcyB7CisJcmVzIHJlc19zdGF0OworCWludCBzdGF0ZTsKK307CisKKy8qCisgKiBzdHJ1Y3R1cmUgb2YgdGhlIHN0YXR1cyBtZXNzYWdlIHNlbnQgYmFjayBieSB0aGUgc3RhdHVzIG1vbml0b3IKKyAqIHdoZW4gbW9uaXRvciBzaXRlIHN0YXR1cyBjaGFuZ2VzCisgKi8KK3N0cnVjdCBzdGF0dXMgeworCXN0cmluZyBtb25fbmFtZTxTTV9NQVhTVFJMRU4+OworCWludCBzdGF0ZTsKKwlvcGFxdWUgcHJpdlsxNl07CQkvKiBzdG9yZWQgcHJpdmF0ZSBpbmZvcm1hdGlvbiAqLworfTsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOWU0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfU1BSQVlfSF9SUENHRU4KKyNkZWZpbmUgX1NQUkFZX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNQUkFZTUFYIDg4NDUKKworc3RydWN0IHNwcmF5dGltZXZhbCB7CisJdV9pbnQgc2VjOworCXVfaW50IHVzZWM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3ByYXl0aW1ldmFsIHNwcmF5dGltZXZhbDsKKworc3RydWN0IHNwcmF5Y3VtdWwgeworCXVfaW50IGNvdW50ZXI7CisJc3ByYXl0aW1ldmFsIGNsb2NrOworfTsKK3R5cGVkZWYgc3RydWN0IHNwcmF5Y3VtdWwgc3ByYXljdW11bDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50IHNwcmF5YXJyX2xlbjsKKwljaGFyICpzcHJheWFycl92YWw7Cit9IHNwcmF5YXJyOworCisjZGVmaW5lIFNQUkFZUFJPRyAxMDAwMTIKKyNkZWZpbmUgU1BSQVlWRVJTIDEKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIFNQUkFZUFJPQ19TUFJBWSAxCitleHRlcm4gIHZvaWQgKiBzcHJheXByb2Nfc3ByYXlfMShzcHJheWFyciAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBzcHJheXByb2Nfc3ByYXlfMV9zdmMoc3ByYXlhcnIgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFNQUkFZUFJPQ19HRVQgMgorZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBTUFJBWVBST0NfQ0xFQVIgMworZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX2NsZWFyXzEodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKiBzcHJheXByb2NfY2xlYXJfMV9zdmModm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgc3ByYXlwcm9nXzFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisjZWxzZSAvKiBLJlIgQyAqLworI2RlZmluZSBTUFJBWVBST0NfU1BSQVkgMQorZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX3NwcmF5XzEoKTsKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19zcHJheV8xX3N2YygpOworI2RlZmluZSBTUFJBWVBST0NfR0VUIDIKK2V4dGVybiAgc3ByYXljdW11bCAqIHNwcmF5cHJvY19nZXRfMSgpOworZXh0ZXJuICBzcHJheWN1bXVsICogc3ByYXlwcm9jX2dldF8xX3N2YygpOworI2RlZmluZSBTUFJBWVBST0NfQ0xFQVIgMworZXh0ZXJuICB2b2lkICogc3ByYXlwcm9jX2NsZWFyXzEoKTsKK2V4dGVybiAgdm9pZCAqIHNwcmF5cHJvY19jbGVhcl8xX3N2YygpOworZXh0ZXJuIGludCBzcHJheXByb2dfMV9mcmVlcmVzdWx0ICgpOworI2VuZGlmIC8qIEsmUiBDICovCisKKy8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCisKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICBib29sX3QgeGRyX3NwcmF5dGltZXZhbCAoWERSICosIHNwcmF5dGltZXZhbCopOworZXh0ZXJuICBib29sX3QgeGRyX3NwcmF5Y3VtdWwgKFhEUiAqLCBzcHJheWN1bXVsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfc3ByYXlhcnIgKFhEUiAqLCBzcHJheWFyciopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfc3ByYXl0aW1ldmFsICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfc3ByYXljdW11bCAoKTsKK2V4dGVybiBib29sX3QgeGRyX3NwcmF5YXJyICgpOworCisjZW5kaWYgLyogSyZSIEMgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFfU1BSQVlfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3NwcmF5LnggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDJmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy9zcHJheS54CkBAIC0wLDAgKzEsODQgQEAKKy8qIEAoIylzcHJheS54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisvKiBAKCMpc3ByYXkueCAxLjIgODcvMDkvMTggQ29weXIgMTk4NyBTdW4gTWljcm8gKi8KKworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICogCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqIAorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKiAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqIAorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICogCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworLyoKKyAqIFNwcmF5IGEgc2VydmVyIHdpdGggcGFja2V0cworICogVXNlZnVsIGZvciB0ZXN0aW5nIGZsYWtpbmVzcyBvZiBuZXR3b3JrIGludGVyZmFjZXMKKyAqLworCitjb25zdCBTUFJBWU1BWCA9IDg4NDU7CS8qIG1heCBhbW91bnQgY2FuIHNwcmF5ICovCisKKy8qCisgKiBHTVQgc2luY2UgMDowMCwgMSBKYW51YXJ5IDE5NzAKKyAqLworc3RydWN0IHNwcmF5dGltZXZhbCB7CisJdW5zaWduZWQgaW50IHNlYzsKKwl1bnNpZ25lZCBpbnQgdXNlYzsKK307CisKKy8qCisgKiBzcHJheSBzdGF0aXN0aWNzCisgKi8KK3N0cnVjdCBzcHJheWN1bXVsIHsKKwl1bnNpZ25lZCBpbnQgY291bnRlcjsKKwlzcHJheXRpbWV2YWwgY2xvY2s7Cit9OworCisvKgorICogc3ByYXkgZGF0YQorICovCit0eXBlZGVmIG9wYXF1ZSBzcHJheWFycjxTUFJBWU1BWD47CisKK3Byb2dyYW0gU1BSQVlQUk9HIHsKKwl2ZXJzaW9uIFNQUkFZVkVSUyB7CisJCS8qCisJCSAqIEp1c3QgdGhyb3cgYXdheSB0aGUgZGF0YSBhbmQgaW5jcmVtZW50IHRoZSBjb3VudGVyCisJCSAqIFRoaXMgY2FsbCBuZXZlciByZXR1cm5zLCBzbyB0aGUgY2xpZW50IHNob3VsZCBhbHdheXMgCisJCSAqIHRpbWUgaXQgb3V0LgorCQkgKi8KKwkJdm9pZAorCQlTUFJBWVBST0NfU1BSQVkoc3ByYXlhcnIpID0gMTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGFuZCBlbGFwc2VkIHRpbWUgIHNpbmNlCisJCSAqIGxhc3QgQ0xFQVIuCisJCSAqLworCQlzcHJheWN1bXVsCQorCQlTUFJBWVBST0NfR0VUKHZvaWQpID0gMjsKKworCQkvKgorCQkgKiBDbGVhciB0aGUgY291bnRlciBhbmQgcmVzZXQgdGhlIGVsYXBzZWQgdGltZQorCQkgKi8KKwkJdm9pZAorCQlTUFJBWVBST0NfQ0xFQVIodm9pZCkgPSAzOworCX0gPSAxOworfSA9IDEwMDAxMjsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzEzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cC5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKi8KKworI2lmbmRlZiBfX1JQQ1NWQ19ZUF9IX18KKyNkZWZpbmUgX19SUENTVkNfWVBfSF9fCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworI2RlZmluZSBZUE1BWFJFQ09SRCAxMDI0CisjZGVmaW5lIFlQTUFYRE9NQUlOIDY0CisjZGVmaW5lIFlQTUFYTUFQIDY0CisjZGVmaW5lIFlQTUFYUEVFUiA2NAorCitlbnVtIHlwc3RhdCB7CisJWVBfVFJVRSA9IDEsCisJWVBfTk9NT1JFID0gMiwKKwlZUF9GQUxTRSA9IDAsCisJWVBfTk9NQVAgPSAtMSwKKwlZUF9OT0RPTSA9IC0yLAorCVlQX05PS0VZID0gLTMsCisJWVBfQkFET1AgPSAtNCwKKwlZUF9CQUREQiA9IC01LAorCVlQX1lQRVJSID0gLTYsCisJWVBfQkFEQVJHUyA9IC03LAorCVlQX1ZFUlMgPSAtOCwKK307Cit0eXBlZGVmIGVudW0geXBzdGF0IHlwc3RhdDsKKworZW51bSB5cHhmcnN0YXQgeworCVlQWEZSX1NVQ0MgPSAxLAorCVlQWEZSX0FHRSA9IDIsCisJWVBYRlJfTk9NQVAgPSAtMSwKKwlZUFhGUl9OT0RPTSA9IC0yLAorCVlQWEZSX1JTUkMgPSAtMywKKwlZUFhGUl9SUEMgPSAtNCwKKwlZUFhGUl9NQUREUiA9IC01LAorCVlQWEZSX1lQRVJSID0gLTYsCisJWVBYRlJfQkFEQVJHUyA9IC03LAorCVlQWEZSX0RCTSA9IC04LAorCVlQWEZSX0ZJTEUgPSAtOSwKKwlZUFhGUl9TS0VXID0gLTEwLAorCVlQWEZSX0NMRUFSID0gLTExLAorCVlQWEZSX0ZPUkNFID0gLTEyLAorCVlQWEZSX1hGUkVSUiA9IC0xMywKKwlZUFhGUl9SRUZVU0VEID0gLTE0LAorfTsKK3R5cGVkZWYgZW51bSB5cHhmcnN0YXQgeXB4ZnJzdGF0OworCit0eXBlZGVmIGNoYXIgKmRvbWFpbm5hbWU7Cit0eXBlZGVmIGNoYXIgKm1hcG5hbWU7Cit0eXBlZGVmIGNoYXIgKnBlZXJuYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVfaW50IGtleWRhdF9sZW47CisgIGNoYXIgKmtleWRhdF92YWw7Cit9IGtleWRhdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1X2ludCB2YWxkYXRfbGVuOworICBjaGFyICp2YWxkYXRfdmFsOworfSB2YWxkYXQ7CisKK3N0cnVjdCB5cG1hcF9wYXJtcyB7CisgIGRvbWFpbm5hbWUgZG9tYWluOworICBtYXBuYW1lIG1hcDsKKyAgdV9pbnQgb3JkZXJudW07CisgIHBlZXJuYW1lIHBlZXI7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBtYXBfcGFybXMgeXBtYXBfcGFybXM7CisKK3N0cnVjdCB5cHJlcV9rZXkgeworICBkb21haW5uYW1lIGRvbWFpbjsKKyAgbWFwbmFtZSBtYXA7CisgIGtleWRhdCBrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXFfa2V5IHlwcmVxX2tleTsKKworc3RydWN0IHlwcmVxX25va2V5IHsKKyAgZG9tYWlubmFtZSBkb21haW47CisgIG1hcG5hbWUgbWFwOworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVxX25va2V5IHlwcmVxX25va2V5OworCitzdHJ1Y3QgeXByZXFfeGZyIHsKKyAgeXBtYXBfcGFybXMgbWFwX3Bhcm1zOworICB1X2ludCB0cmFuc2lkOworICB1X2ludCBwcm9nOworICB1X2ludCBwb3J0OworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVxX3hmciB5cHJlcV94ZnI7CisKK3N0cnVjdCB5cHJlc3BfdmFsIHsKKyAgeXBzdGF0IHN0YXQ7CisgIHZhbGRhdCB2YWw7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX3ZhbCB5cHJlc3BfdmFsOworCitzdHJ1Y3QgeXByZXNwX2tleV92YWwgeworICB5cHN0YXQgc3RhdDsKKyNpZmRlZiBTVFVQSURfU1VOX0JVRworICAvKiBUaGlzIGlzIHRoZSBmb3JtIGFzIGRpc3RyaWJ1dGVkIGJ5IFN1bi4gIEJ1dCBldmVuIHRoZSBTdW4gTklTCisgICAgIHNlcnZlcnMgZXhwZWN0IHRoZSB2YWx1ZXMgaW4gdGhlIG90aGVyIG9yZGVyLiAgU28gdGhlaXIKKyAgICAgaW1wbGVtZW50YXRpb24gc29tZWhvdyBtdXN0IGNoYW5nZSB0aGUgb3JkZXIgaW50ZXJuYWxseS4gIFdlCisgICAgIGRvbid0IHdhbnQgdG8gZm9sbG93IHRoaXMgYmFkIGV4YW1wbGUgc2luY2UgdGhlIHVzZXIgc2hvdWxkIGJlCisgICAgIGFibGUgdG8gdXNlIHJwY2dlbiBvbiB0aGlzIGZpbGUuICAqLworICBrZXlkYXQga2V5OworICB2YWxkYXQgdmFsOworI2Vsc2UKKyAgdmFsZGF0IHZhbDsKKyAga2V5ZGF0IGtleTsKKyNlbmRpZgorfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF9rZXlfdmFsIHlwcmVzcF9rZXlfdmFsOworCitzdHJ1Y3QgeXByZXNwX21hc3RlciB7CisgIHlwc3RhdCBzdGF0OworICBwZWVybmFtZSBwZWVyOworfTsKK3R5cGVkZWYgc3RydWN0IHlwcmVzcF9tYXN0ZXIgeXByZXNwX21hc3RlcjsKKworc3RydWN0IHlwcmVzcF9vcmRlciB7CisgIHlwc3RhdCBzdGF0OworICB1X2ludCBvcmRlcm51bTsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3Bfb3JkZXIgeXByZXNwX29yZGVyOworCitzdHJ1Y3QgeXByZXNwX2FsbCB7CisgIGJvb2xfdCBtb3JlOworICB1bmlvbiB7CisgICAgeXByZXNwX2tleV92YWwgdmFsOworICB9IHlwcmVzcF9hbGxfdTsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3BfYWxsIHlwcmVzcF9hbGw7CisKK3N0cnVjdCB5cHJlc3BfeGZyIHsKKyAgdV9pbnQgdHJhbnNpZDsKKyAgeXB4ZnJzdGF0IHhmcnN0YXQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXByZXNwX3hmciB5cHJlc3BfeGZyOworCitzdHJ1Y3QgeXBtYXBsaXN0IHsKKyAgbWFwbmFtZSBtYXA7CisgIHN0cnVjdCB5cG1hcGxpc3QgKm5leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBtYXBsaXN0IHlwbWFwbGlzdDsKKworc3RydWN0IHlwcmVzcF9tYXBsaXN0IHsKKyAgeXBzdGF0IHN0YXQ7CisgIHlwbWFwbGlzdCAqbWFwczsKK307Cit0eXBlZGVmIHN0cnVjdCB5cHJlc3BfbWFwbGlzdCB5cHJlc3BfbWFwbGlzdDsKKworZW51bSB5cHB1c2hfc3RhdHVzIHsKKyAgWVBQVVNIX1NVQ0MgPSAxLAorICBZUFBVU0hfQUdFID0gMiwKKyAgWVBQVVNIX05PTUFQID0gLTEsCisgIFlQUFVTSF9OT0RPTSA9IC0yLAorICBZUFBVU0hfUlNSQyA9IC0zLAorICBZUFBVU0hfUlBDID0gLTQsCisgIFlQUFVTSF9NQUREUiA9IC01LAorICBZUFBVU0hfWVBFUlIgPSAtNiwKKyAgWVBQVVNIX0JBREFSR1MgPSAtNywKKyAgWVBQVVNIX0RCTSA9IC04LAorICBZUFBVU0hfRklMRSA9IC05LAorICBZUFBVU0hfU0tFVyA9IC0xMCwKKyAgWVBQVVNIX0NMRUFSID0gLTExLAorICBZUFBVU0hfRk9SQ0UgPSAtMTIsCisgIFlQUFVTSF9YRlJFUlIgPSAtMTMsCisgIFlQUFVTSF9SRUZVU0VEID0gLTE0LAorfTsKK3R5cGVkZWYgZW51bSB5cHB1c2hfc3RhdHVzIHlwcHVzaF9zdGF0dXM7CisKK3N0cnVjdCB5cHB1c2hyZXNwX3hmciB7CisgIHVfaW50IHRyYW5zaWQ7CisgIHlwcHVzaF9zdGF0dXMgc3RhdHVzOworfTsKK3R5cGVkZWYgc3RydWN0IHlwcHVzaHJlc3BfeGZyIHlwcHVzaHJlc3BfeGZyOworCitlbnVtIHlwYmluZF9yZXNwdHlwZSB7CisgIFlQQklORF9TVUNDX1ZBTCA9IDEsCisgIFlQQklORF9GQUlMX1ZBTCA9IDIsCit9OwordHlwZWRlZiBlbnVtIHlwYmluZF9yZXNwdHlwZSB5cGJpbmRfcmVzcHR5cGU7CisKK3N0cnVjdCB5cGJpbmRfYmluZGluZyB7CisgIGNoYXIgeXBiaW5kX2JpbmRpbmdfYWRkcls0XTsKKyAgY2hhciB5cGJpbmRfYmluZGluZ19wb3J0WzJdOworfTsKK3R5cGVkZWYgc3RydWN0IHlwYmluZF9iaW5kaW5nIHlwYmluZF9iaW5kaW5nOworCitzdHJ1Y3QgeXBiaW5kX3Jlc3AgeworICB5cGJpbmRfcmVzcHR5cGUgeXBiaW5kX3N0YXR1czsKKyAgdW5pb24geworICAgIHVfaW50IHlwYmluZF9lcnJvcjsKKyAgICB5cGJpbmRfYmluZGluZyB5cGJpbmRfYmluZGluZm87CisgIH0geXBiaW5kX3Jlc3BfdTsKK307Cit0eXBlZGVmIHN0cnVjdCB5cGJpbmRfcmVzcCB5cGJpbmRfcmVzcDsKKworI2RlZmluZSBZUEJJTkRfRVJSX0VSUiAxCisjZGVmaW5lIFlQQklORF9FUlJfTk9TRVJWIDIKKyNkZWZpbmUgWVBCSU5EX0VSUl9SRVNDIDMKKworc3RydWN0IHlwYmluZF9zZXRkb20geworICBkb21haW5uYW1lIHlwc2V0ZG9tX2RvbWFpbjsKKyAgeXBiaW5kX2JpbmRpbmcgeXBzZXRkb21fYmluZGluZzsKKyAgdV9pbnQgeXBzZXRkb21fdmVyczsKK307Cit0eXBlZGVmIHN0cnVjdCB5cGJpbmRfc2V0ZG9tIHlwYmluZF9zZXRkb207CisKK19fQkVHSU5fREVDTFMKKworI2RlZmluZSBZUFBST0cgMTAwMDA0CisjZGVmaW5lIFlQVkVSUyAyCisKKyNkZWZpbmUgWVBQUk9DX05VTEwgMAorZXh0ZXJuICB2b2lkICp5cHByb2NfbnVsbF8yICh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqeXBwcm9jX251bGxfMl9zdmMgKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19ET01BSU4gMQorZXh0ZXJuICBib29sX3QgKnlwcHJvY19kb21haW5fMiAoZG9tYWlubmFtZSAqLCBDTElFTlQgKik7CitleHRlcm4gIGJvb2xfdCAqeXBwcm9jX2RvbWFpbl8yX3N2YyAoZG9tYWlubmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX0RPTUFJTl9OT05BQ0sgMgorZXh0ZXJuICBib29sX3QgKnlwcHJvY19kb21haW5fbm9uYWNrXzIgKGRvbWFpbm5hbWUgKiwgQ0xJRU5UICopOworZXh0ZXJuICBib29sX3QgKnlwcHJvY19kb21haW5fbm9uYWNrXzJfc3ZjIChkb21haW5uYW1lICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfTUFUQ0ggMworZXh0ZXJuICB5cHJlc3BfdmFsICp5cHByb2NfbWF0Y2hfMiAoeXByZXFfa2V5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX3ZhbCAqeXBwcm9jX21hdGNoXzJfc3ZjICh5cHJlcV9rZXkgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQUFJPQ19GSVJTVCA0CitleHRlcm4gIHlwcmVzcF9rZXlfdmFsICp5cHByb2NfZmlyc3RfMiAoeXByZXFfa2V5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX2tleV92YWwgKnlwcHJvY19maXJzdF8yX3N2YyAoeXByZXFfa2V5ICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfTkVYVCA1CitleHRlcm4gIHlwcmVzcF9rZXlfdmFsICp5cHByb2NfbmV4dF8yICh5cHJlcV9rZXkgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3Bfa2V5X3ZhbCAqeXBwcm9jX25leHRfMl9zdmMgKHlwcmVxX2tleSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX1hGUiA2CitleHRlcm4gIHlwcmVzcF94ZnIgKnlwcHJvY194ZnJfMiAoeXByZXFfeGZyICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX3hmciAqeXBwcm9jX3hmcl8yX3N2YyAoeXByZXFfeGZyICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfQ0xFQVIgNworZXh0ZXJuICB2b2lkICp5cHByb2NfY2xlYXJfMiAodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKnlwcHJvY19jbGVhcl8yX3N2YyAodm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX0FMTCA4CitleHRlcm4gIHlwcmVzcF9hbGwgKnlwcHJvY19hbGxfMiAoeXByZXFfbm9rZXkgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3BfYWxsICp5cHByb2NfYWxsXzJfc3ZjICh5cHJlcV9ub2tleSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX01BU1RFUiA5CitleHRlcm4gIHlwcmVzcF9tYXN0ZXIgKnlwcHJvY19tYXN0ZXJfMiAoeXByZXFfbm9rZXkgKiwgQ0xJRU5UICopOworZXh0ZXJuICB5cHJlc3BfbWFzdGVyICp5cHByb2NfbWFzdGVyXzJfc3ZjICh5cHJlcV9ub2tleSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBQUk9DX09SREVSIDEwCitleHRlcm4gIHlwcmVzcF9vcmRlciAqeXBwcm9jX29yZGVyXzIgKHlwcmVxX25va2V5ICosIENMSUVOVCAqKTsKK2V4dGVybiAgeXByZXNwX29yZGVyICp5cHByb2Nfb3JkZXJfMl9zdmMgKHlwcmVxX25va2V5ICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBST0NfTUFQTElTVCAxMQorZXh0ZXJuICB5cHJlc3BfbWFwbGlzdCAqeXBwcm9jX21hcGxpc3RfMiAoZG9tYWlubmFtZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwcmVzcF9tYXBsaXN0ICp5cHByb2NfbWFwbGlzdF8yX3N2YyAoZG9tYWlubmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKK2V4dGVybiBpbnQgeXBwcm9nXzJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOworCisKKyNkZWZpbmUgWVBQVVNIX1hGUlJFU1BQUk9HICgweDQwMDAwMDAwKQorI2RlZmluZSBZUFBVU0hfWEZSUkVTUFZFUlMgMQorCisjZGVmaW5lIFlQUFVTSFBST0NfTlVMTCAwCitleHRlcm4gIHZvaWQgKnlwcHVzaHByb2NfbnVsbF8xICh2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqeXBwdXNocHJvY19udWxsXzFfc3ZjICh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFBVU0hQUk9DX1hGUlJFU1AgMQorZXh0ZXJuICB2b2lkICp5cHB1c2hwcm9jX3hmcnJlc3BfMSAoeXBwdXNocmVzcF94ZnIgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICp5cHB1c2hwcm9jX3hmcnJlc3BfMV9zdmMgKHlwcHVzaHJlc3BfeGZyICosIHN0cnVjdCBzdmNfcmVxICopOworZXh0ZXJuIGludCB5cHB1c2hfeGZycmVzcHByb2dfMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKworI2RlZmluZSBZUEJJTkRQUk9HIDEwMDAwNworI2RlZmluZSBZUEJJTkRWRVJTIDIKKworI2RlZmluZSBZUEJJTkRQUk9DX05VTEwgMAorZXh0ZXJuICB2b2lkICp5cGJpbmRwcm9jX251bGxfMiAodm9pZCAqLCBDTElFTlQgKik7CitleHRlcm4gIHZvaWQgKnlwYmluZHByb2NfbnVsbF8yX3N2YyAodm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBCSU5EUFJPQ19ET01BSU4gMQorZXh0ZXJuICB5cGJpbmRfcmVzcCAqeXBiaW5kcHJvY19kb21haW5fMiAoZG9tYWlubmFtZSAqLCBDTElFTlQgKik7CitleHRlcm4gIHlwYmluZF9yZXNwICp5cGJpbmRwcm9jX2RvbWFpbl8yX3N2YyAoZG9tYWlubmFtZSAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBCSU5EUFJPQ19TRVRET00gMgorZXh0ZXJuICB2b2lkICp5cGJpbmRwcm9jX3NldGRvbV8yICh5cGJpbmRfc2V0ZG9tICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqeXBiaW5kcHJvY19zZXRkb21fMl9zdmMgKHlwYmluZF9zZXRkb20gKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHlwYmluZHByb2dfMl9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7CisKKworZXh0ZXJuICBib29sX3QgeGRyX3lwc3RhdCAoWERSICosIHlwc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX3lweGZyc3RhdCAoWERSICosIHlweGZyc3RhdCopOworZXh0ZXJuICBib29sX3QgeGRyX2RvbWFpbm5hbWUgKFhEUiAqLCBkb21haW5uYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfbWFwbmFtZSAoWERSICosIG1hcG5hbWUqKTsKK2V4dGVybiAgYm9vbF90IHhkcl9wZWVybmFtZSAoWERSICosIHBlZXJuYW1lKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfa2V5ZGF0IChYRFIgKiwga2V5ZGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfdmFsZGF0IChYRFIgKiwgdmFsZGF0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBtYXBfcGFybXMgKFhEUiAqLCB5cG1hcF9wYXJtcyopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVxX2tleSAoWERSICosIHlwcmVxX2tleSopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVxX25va2V5IChYRFIgKiwgeXByZXFfbm9rZXkqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlcV94ZnIgKFhEUiAqLCB5cHJlcV94ZnIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3BfdmFsIChYRFIgKiwgeXByZXNwX3ZhbCopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF9rZXlfdmFsIChYRFIgKiwgeXByZXNwX2tleV92YWwqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3BfbWFzdGVyIChYRFIgKiwgeXByZXNwX21hc3RlciopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF9vcmRlciAoWERSICosIHlwcmVzcF9vcmRlciopOworZXh0ZXJuICBib29sX3QgeGRyX3lwcmVzcF9hbGwgKFhEUiAqLCB5cHJlc3BfYWxsKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXByZXNwX3hmciAoWERSICosIHlwcmVzcF94ZnIqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cG1hcGxpc3QgKFhEUiAqLCB5cG1hcGxpc3QqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHJlc3BfbWFwbGlzdCAoWERSICosIHlwcmVzcF9tYXBsaXN0Kik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBwdXNoX3N0YXR1cyAoWERSICosIHlwcHVzaF9zdGF0dXMqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cHB1c2hyZXNwX3hmciAoWERSICosIHlwcHVzaHJlc3BfeGZyKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBiaW5kX3Jlc3B0eXBlIChYRFIgKiwgeXBiaW5kX3Jlc3B0eXBlKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBiaW5kX2JpbmRpbmcgKFhEUiAqLCB5cGJpbmRfYmluZGluZyopOworZXh0ZXJuICBib29sX3QgeGRyX3lwYmluZF9yZXNwIChYRFIgKiwgeXBiaW5kX3Jlc3AqKTsKK2V4dGVybiAgYm9vbF90IHhkcl95cGJpbmRfc2V0ZG9tIChYRFIgKiwgeXBiaW5kX3NldGRvbSopOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogIV9fUlBDU1ZDX1lQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXAueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiMjU2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwLngKQEAgLTAsMCArMSwzMDkgQEAKKy8qIEAoIyl5cC54CTIuMSA4OC8wOC8wMSA0LjAgUlBDU1JDICovCisKKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogUHJvdG9jb2wgZGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIFllbGxvdyBQYWdlcyBTZXJ2aWNlCisgKi8KKworY29uc3QgWVBNQVhSRUNPUkQgPSAxMDI0OworY29uc3QgWVBNQVhET01BSU4gPSA2NDsKK2NvbnN0IFlQTUFYTUFQID0gNjQ7Citjb25zdCBZUE1BWFBFRVIgPSA2NDsKKworCitlbnVtIHlwc3RhdCB7CisJWVBfVFJVRQkJPSAgMSwKKwlZUF9OT01PUkUJPSAgMiwKKwlZUF9GQUxTRQk9ICAwLAorCVlQX05PTUFQCT0gLTEsCisJWVBfTk9ET00JPSAtMiwKKwlZUF9OT0tFWQk9IC0zLAorCVlQX0JBRE9QCT0gLTQsCisJWVBfQkFEREIJPSAtNSwKKwlZUF9ZUEVSUgk9IC02LAorCVlQX0JBREFSR1MJPSAtNywKKwlZUF9WRVJTCQk9IC04Cit9OworCisKK2VudW0geXB4ZnJzdGF0IHsKKwlZUFhGUl9TVUNDCT0gIDEsCisJWVBYRlJfQUdFCT0gIDIsCisJWVBYRlJfTk9NQVAJPSAtMSwKKwlZUFhGUl9OT0RPTQk9IC0yLAorCVlQWEZSX1JTUkMJPSAtMywKKwlZUFhGUl9SUEMJPSAtNCwKKwlZUFhGUl9NQUREUgk9IC01LAorCVlQWEZSX1lQRVJSCT0gLTYsCisJWVBYRlJfQkFEQVJHUwk9IC03LAorCVlQWEZSX0RCTQk9IC04LAorCVlQWEZSX0ZJTEUJPSAtOSwKKwlZUFhGUl9TS0VXCT0gLTEwLAorCVlQWEZSX0NMRUFSCT0gLTExLAorCVlQWEZSX0ZPUkNFCT0gLTEyLAorCVlQWEZSX1hGUkVSUgk9IC0xMywKKwlZUFhGUl9SRUZVU0VECT0gLTE0Cit9OworCisKK3R5cGVkZWYgc3RyaW5nIGRvbWFpbm5hbWU8WVBNQVhET01BSU4+OwordHlwZWRlZiBzdHJpbmcgbWFwbmFtZTxZUE1BWE1BUD47Cit0eXBlZGVmIHN0cmluZyBwZWVybmFtZTxZUE1BWFBFRVI+OwordHlwZWRlZiBvcGFxdWUga2V5ZGF0PFlQTUFYUkVDT1JEPjsKK3R5cGVkZWYgb3BhcXVlIHZhbGRhdDxZUE1BWFJFQ09SRD47CisKKworc3RydWN0IHlwbWFwX3Bhcm1zIHsKKwlkb21haW5uYW1lIGRvbWFpbjsKKwltYXBuYW1lIG1hcDsKKwl1bnNpZ25lZCBpbnQgb3JkZXJudW07CisJcGVlcm5hbWUgcGVlcjsKK307CisKK3N0cnVjdCB5cHJlcV9rZXkgeworCWRvbWFpbm5hbWUgZG9tYWluOworCW1hcG5hbWUgbWFwOworCWtleWRhdCBrZXk7Cit9OworCitzdHJ1Y3QgeXByZXFfbm9rZXkgeworCWRvbWFpbm5hbWUgZG9tYWluOworCW1hcG5hbWUgbWFwOworfTsKKworc3RydWN0IHlwcmVxX3hmciB7CisJeXBtYXBfcGFybXMgbWFwX3Bhcm1zOworCXVuc2lnbmVkIGludCB0cmFuc2lkOworCXVuc2lnbmVkIGludCBwcm9nOworCXVuc2lnbmVkIGludCBwb3J0OworfTsKKworCitzdHJ1Y3QgeXByZXNwX3ZhbCB7CisJeXBzdGF0IHN0YXQ7CisJdmFsZGF0IHZhbDsKK307CisKK3N0cnVjdCB5cHJlc3Bfa2V5X3ZhbCB7CisJeXBzdGF0IHN0YXQ7CisjaWZkZWYgU1RVUElEX1NVTl9CVUcKKwkvKiBUaGlzIGlzIHRoZSBmb3JtIGFzIGRpc3RyaWJ1dGVkIGJ5IFN1bi4gIEJ1dCBldmVuIHRoZSBTdW4gTklTCisJICAgc2VydmVycyBleHBlY3QgdGhlIHZhbHVlcyBpbiB0aGUgb3RoZXIgb3JkZXIuICBTbyB0aGVpcgorCSAgIGltcGxlbWVudGF0aW9uIHNvbWVob3cgbXVzdCBjaGFuZ2UgdGhlIG9yZGVyIGludGVybmFsbHkuICBXZQorCSAgIGRvbid0IHdhbnQgdG8gZm9sbG93IHRoaXMgYmFkIGV4YW1wbGUgc2luY2UgdGhlIHVzZXIgc2hvdWxkIGJlCisJICAgYWJsZSB0byB1c2UgcnBjZ2VuIG9uIHRoaXMgZmlsZS4gICovCisJa2V5ZGF0IGtleTsKKwl2YWxkYXQgdmFsOworI2Vsc2UKKwl2YWxkYXQgdmFsOworCWtleWRhdCBrZXk7CisjZW5kaWYKK307CisKKworc3RydWN0IHlwcmVzcF9tYXN0ZXIgeworCXlwc3RhdCBzdGF0OworCXBlZXJuYW1lIHBlZXI7Cit9OworCitzdHJ1Y3QgeXByZXNwX29yZGVyIHsKKwl5cHN0YXQgc3RhdDsKKwl1bnNpZ25lZCBpbnQgb3JkZXJudW07Cit9OworCit1bmlvbiB5cHJlc3BfYWxsIHN3aXRjaCAoYm9vbCBtb3JlKSB7CitjYXNlIFRSVUU6CisJeXByZXNwX2tleV92YWwgdmFsOworY2FzZSBGQUxTRToKKwl2b2lkOworfTsKKworc3RydWN0IHlwcmVzcF94ZnIgeworCXVuc2lnbmVkIGludCB0cmFuc2lkOworCXlweGZyc3RhdCB4ZnJzdGF0OworfTsKKworc3RydWN0IHlwbWFwbGlzdCB7CisJbWFwbmFtZSBtYXA7CisJeXBtYXBsaXN0ICpuZXh0OworfTsKKworc3RydWN0IHlwcmVzcF9tYXBsaXN0IHsKKwl5cHN0YXQgc3RhdDsKKwl5cG1hcGxpc3QgKm1hcHM7Cit9OworCitlbnVtIHlwcHVzaF9zdGF0dXMgeworCVlQUFVTSF9TVUNDCT0gIDEsCS8qIFN1Y2Nlc3MgKi8KKwlZUFBVU0hfQUdFIAk9ICAyLAkvKiBNYXN0ZXIncyB2ZXJzaW9uIG5vdCBuZXdlciAqLworCVlQUFVTSF9OT01BUAk9IC0xLAkvKiBDYW4ndCBmaW5kIHNlcnZlciBmb3IgbWFwICovCisJWVBQVVNIX05PRE9NCT0gLTIsCS8qIERvbWFpbiBub3Qgc3VwcG9ydGVkICovCisJWVBQVVNIX1JTUkMJPSAtMywJLyogTG9jYWwgcmVzb3VyY2UgYWxsb2MgZmFpbHVyZSAqLworCVlQUFVTSF9SUEMJPSAtNCwJLyogUlBDIGZhaWx1cmUgdGFsa2luZyB0byBzZXJ2ZXIgKi8KKwlZUFBVU0hfTUFERFIgCT0gLTUsCS8qIENhbid0IGdldCBtYXN0ZXIgYWRkcmVzcyAqLworCVlQUFVTSF9ZUEVSUgk9IC02LAkvKiBZUCBzZXJ2ZXIvbWFwIGRiIGVycm9yICovCisJWVBQVVNIX0JBREFSR1MJPSAtNywJLyogUmVxdWVzdCBhcmd1bWVudHMgYmFkICovCisJWVBQVVNIX0RCTQk9IC04LAkvKiBMb2NhbCBkYm0gb3BlcmF0aW9uIGZhaWxlZCAqLworCVlQUFVTSF9GSUxFCT0gLTksCS8qIExvY2FsIGZpbGUgSS9PIG9wZXJhdGlvbiBmYWlsZWQgKi8KKwlZUFBVU0hfU0tFVwk9IC0xMCwJLyogTWFwIHZlcnNpb24gc2tldyBkdXJpbmcgdHJhbnNmZXIgKi8KKwlZUFBVU0hfQ0xFQVIJPSAtMTEsCS8qIENhbid0IHNlbmQgIkNsZWFyIiByZXEgdG8gbG9jYWwgeXBzZXJ2ICovCisJWVBQVVNIX0ZPUkNFCT0gLTEyLAkvKiBObyBsb2NhbCBvcmRlciBudW1iZXIgaW4gbWFwICB1c2UgLWYgZmxhZy4gKi8KKwlZUFBVU0hfWEZSRVJSIAk9IC0xMywJLyogeXB4ZnIgZXJyb3IgKi8KKwlZUFBVU0hfUkVGVVNFRAk9IC0xNCAJLyogVHJhbnNmZXIgcmVxdWVzdCByZWZ1c2VkIGJ5IHlwc2VydiAqLworfTsKKworc3RydWN0IHlwcHVzaHJlc3BfeGZyIHsKKwl1bnNpZ25lZCB0cmFuc2lkOworCXlwcHVzaF9zdGF0dXMgc3RhdHVzOworfTsKKworLyoKKyAqIFJlc3BvbnNlIHN0cnVjdHVyZSBhbmQgb3ZlcmFsbCByZXN1bHQgc3RhdHVzIGNvZGVzLiAgU3VjY2VzcyBhbmQgZmFpbHVyZQorICogcmVwcmVzZW50IHR3byBzZXBhcmF0ZSByZXNwb25zZSBtZXNzYWdlIHR5cGVzLgorICovCisKK2VudW0geXBiaW5kX3Jlc3B0eXBlIHsKKwlZUEJJTkRfU1VDQ19WQUwgPSAxLAorCVlQQklORF9GQUlMX1ZBTCA9IDIKK307CisKK3N0cnVjdCB5cGJpbmRfYmluZGluZyB7CisgICAgb3BhcXVlIHlwYmluZF9iaW5kaW5nX2FkZHJbNF07IC8qIEluIG5ldHdvcmsgb3JkZXIgKi8KKyAgICBvcGFxdWUgeXBiaW5kX2JpbmRpbmdfcG9ydFsyXTsgLyogSW4gbmV0d29yayBvcmRlciAqLworfTsKKwordW5pb24geXBiaW5kX3Jlc3Agc3dpdGNoICh5cGJpbmRfcmVzcHR5cGUgeXBiaW5kX3N0YXR1cykgeworY2FzZSBZUEJJTkRfRkFJTF9WQUw6CisgICAgICAgIHVuc2lnbmVkIHlwYmluZF9lcnJvcjsKK2Nhc2UgWVBCSU5EX1NVQ0NfVkFMOgorICAgICAgICB5cGJpbmRfYmluZGluZyB5cGJpbmRfYmluZGluZm87Cit9OworCisvKiBEZXRhaWxlZCBmYWlsdXJlIHJlYXNvbiBjb2RlcyBmb3IgcmVzcG9uc2UgZmllbGQgeXBiaW5kX2Vycm9yKi8KKworY29uc3QgWVBCSU5EX0VSUl9FUlIgICAgPSAxOwkvKiBJbnRlcm5hbCBlcnJvciAqLworY29uc3QgWVBCSU5EX0VSUl9OT1NFUlYgPSAyOwkvKiBObyBib3VuZCBzZXJ2ZXIgZm9yIHBhc3NlZCBkb21haW4gKi8KK2NvbnN0IFlQQklORF9FUlJfUkVTQyAgID0gMzsJLyogU3lzdGVtIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHVyZSAqLworCisKKy8qCisgKiBSZXF1ZXN0IGRhdGEgc3RydWN0dXJlIGZvciB5cGJpbmQgIlNldCBkb21haW4iIHByb2NlZHVyZS4KKyAqLworc3RydWN0IHlwYmluZF9zZXRkb20geworCWRvbWFpbm5hbWUgeXBzZXRkb21fZG9tYWluOworCXlwYmluZF9iaW5kaW5nIHlwc2V0ZG9tX2JpbmRpbmc7CisJdW5zaWduZWQgeXBzZXRkb21fdmVyczsKK307CisKKworLyoKKyAqIFlQIGFjY2VzcyBwcm90b2NvbAorICovCitwcm9ncmFtIFlQUFJPRyB7CisJdmVyc2lvbiBZUFZFUlMgeworCQl2b2lkCisJCVlQUFJPQ19OVUxMKHZvaWQpID0gMDsKKworCQlib29sCisJCVlQUFJPQ19ET01BSU4oZG9tYWlubmFtZSkgPSAxOworCisJCWJvb2wKKwkJWVBQUk9DX0RPTUFJTl9OT05BQ0soZG9tYWlubmFtZSkgPSAyOworCisJCXlwcmVzcF92YWwKKwkJWVBQUk9DX01BVENIKHlwcmVxX2tleSkgPSAzOworCisJCXlwcmVzcF9rZXlfdmFsCisJCVlQUFJPQ19GSVJTVCh5cHJlcV9rZXkpID0gNDsKKworCQl5cHJlc3Bfa2V5X3ZhbAorCQlZUFBST0NfTkVYVCh5cHJlcV9rZXkpID0gNTsKKworCQl5cHJlc3BfeGZyCisJCVlQUFJPQ19YRlIoeXByZXFfeGZyKSA9IDY7CisKKwkJdm9pZAorCQlZUFBST0NfQ0xFQVIodm9pZCkgPSA3OworCisJCXlwcmVzcF9hbGwKKwkJWVBQUk9DX0FMTCh5cHJlcV9ub2tleSkgPSA4OworCisJCXlwcmVzcF9tYXN0ZXIKKwkJWVBQUk9DX01BU1RFUih5cHJlcV9ub2tleSkgPSA5OworCisJCXlwcmVzcF9vcmRlcgorCQlZUFBST0NfT1JERVIoeXByZXFfbm9rZXkpID0gMTA7CisKKwkJeXByZXNwX21hcGxpc3QKKwkJWVBQUk9DX01BUExJU1QoZG9tYWlubmFtZSkgPSAxMTsKKwl9ID0gMjsKK30gPSAxMDAwMDQ7CisKKworLyoKKyAqIFlQUFVTSFBST0NfWEZSUkVTUCBpcyB0aGUgY2FsbGJhY2sgcm91dGluZSBmb3IgcmVzdWx0IG9mIFlQUFJPQ19YRlIKKyAqLworcHJvZ3JhbSBZUFBVU0hfWEZSUkVTUFBST0cgeworCXZlcnNpb24gWVBQVVNIX1hGUlJFU1BWRVJTIHsKKwkJdm9pZAorCQlZUFBVU0hQUk9DX05VTEwodm9pZCkgPSAwOworCisjaWZkZWYgU1RVUElEX1NVTl9CVUcKKwkJLyogVGhpcyBpcyB0aGUgZm9ybSBhcyBkaXN0cmlidXRlZCBieSBTdW4uICBCdXQgZXZlbgorCQkgICB0aGUgU3VuIE5JUyBzZXJ2ZXJzIGV4cGVjdCB0aGUgdmFsdWVzIGluIHRoZSBvdGhlcgorCQkgICBvcmRlci4gIFNvIHRoZWlyIGltcGxlbWVudGF0aW9uIHNvbWVob3cgbXVzdCBjaGFuZ2UKKwkJICAgdGhlIG9yZGVyIGludGVybmFsbHkuICBXZSBkb24ndCB3YW50IHRvIGZvbGxvdyB0aGlzCisJCSAgIGJhZCBleGFtcGxlIHNpbmNlIHRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIHVzZQorCQkgICBycGNnZW4gb24gdGhpcyBmaWxlLiAgKi8KKwkJeXBwdXNocmVzcF94ZnIKKwkJWVBQVVNIUFJPQ19YRlJSRVNQKHZvaWQpID0gMTsKKyNlbHNlCisJCXZvaWQKKwkJWVBQVVNIUFJPQ19YRlJSRVNQKHlwcHVzaHJlc3BfeGZyKSA9IDE7CisjZW5kaWYKKwl9ID0gMTsKK30gPSAweDQwMDAwMDAwOwkvKiB0cmFuc2llbnQ6IGNvdWxkIGJlIGFueXRoaW5nIHVwIHRvIDB4NWZmZmZmZmYgKi8KKworLyoKKyAqIFlQIGJpbmRpbmcgcHJvdG9jb2wKKyAqLworcHJvZ3JhbSBZUEJJTkRQUk9HIHsKKwl2ZXJzaW9uIFlQQklORFZFUlMgeworCQl2b2lkCisJCVlQQklORFBST0NfTlVMTCh2b2lkKSA9IDA7CisKKwkJeXBiaW5kX3Jlc3AKKwkJWVBCSU5EUFJPQ19ET01BSU4oZG9tYWlubmFtZSkgPSAxOworCisJCXZvaWQKKwkJWVBCSU5EUFJPQ19TRVRET00oeXBiaW5kX3NldGRvbSkgPSAyOworCX0gPSAyOworfSA9IDEwMDAwNzsKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwX3Byb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBkYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBfcHJvdC5oCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHN5bWJvbHMgYW5kIHN0cnVjdHVyZXMgZGVmaW5pbmcgdGhlIHJwYyBwcm90b2NvbAorICogYmV0d2VlbiB0aGUgTklTIGNsaWVudHMgYW5kIHRoZSBOSVMgc2VydmVycy4gIFRoZSBzZXJ2ZXJzCisgKiBhcmUgdGhlIE5JUyBkYXRhYmFzZSBzZXJ2ZXJzLCBhbmQgdGhlIE5JUyBiaW5kZXJzLgorICovCisKKyNpZm5kZWYgX1JQQ1NWQ19ZUF9QUk9UX0gKKyNkZWZpbmUgX1JQQ1NWQ19ZUF9QUk9UX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjc3ZjL3lwY2xudC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2w6CisgKgorICogWVBQUk9DX05VTEwoKSByZXR1cm5zICgpIHRha2VzIG5vdGhpbmcsIHJldHVybnMgbm90aGluZy4gIFRoaXMgaW5kaWNhdGVzCisgKiB0aGF0IHRoZSBOSVMgc2VydmVyIGlzIGFsaXZlLgorICoKKyAqIFlQUFJPQ19ET01BSU4gKGNoYXIgKikgcmV0dXJucyAoYm9vbF90KSBUUlVFLiAgSW5kaWNhdGVzIHRoYXQgdGhlCisgKiByZXNwb25kaW5nIE5JUyBzZXJ2ZXIgZG9lcyBzZXJ2ZSB0aGUgbmFtZWQgZG9tYWluOyBGQUxTRSBpbmRpY2F0ZXMgbm8KKyAqIHN1cHBvcnQuCisgKgorICogWVBQUk9DX0RPTUFJTl9OT05BQ0sgKGNoYXIgKikgcmV0dXJucyAoVFJVRSkgaWYgdGhlIE5JUyBzZXJ2ZXIgZG9lcyBzZXJ2ZQorICogdGhlIG5hbWVkIGRvbWFpbiwgb3RoZXJ3aXNlIGRvZXMgbm90IHJldHVybi4gIFVzZWQgaW4gdGhlIGJyb2FkY2FzdCBjYXNlLgorICoKKyAqIFlQUFJPQ19NQVRDSCAoc3RydWN0IHlwcmVxX2tleSkgcmV0dXJucyAoc3RydWN0IHlwcmVzcF92YWwpLiAgUmV0dXJucyB0aGUKKyAqIHJpZ2h0LWhhbmQgdmFsdWUgZm9yIGEgcGFzc2VkIGxlZnQtaGFuZCBrZXksIHdpdGhpbiBhIG5hbWVkIG1hcCBhbmQKKyAqIGRvbWFpbi4KKyAqCisgKiBZUFBST0NfRklSU1QgKHN0cnVjdCB5cHJlcV9ub2tleSkgcmV0dXJucyAoc3RydWN0IHlwcmVzcF9rZXlfdmFsKS4KKyAqIFJldHVybnMgdGhlIGZpcnN0IGtleS12YWx1ZSBwYWlyIGZyb20gYSBuYW1lZCBkb21haW4gYW5kIG1hcC4KKyAqCisgKiBZUFBST0NfTkVYVCAoc3RydWN0IHlwcmVxX2tleSkgcmV0dXJucyAoc3RydWN0IHlwcmVzcF9rZXlfdmFsKS4gIFJldHVybnMKKyAqIHRoZSBrZXktdmFsdWUgcGFpciBmb2xsb3dpbmcgYSBwYXNzZWQga2V5LXZhbHVlIHBhaXIgd2l0aGluIGEgbmFtZWQKKyAqIGRvbWFpbiBhbmQgbWFwLgorICoKKyAqIFlQUFJPQ19YRlIgKHN0cnVjdCB5cHJlcV94ZnIpIHJldHVybnMgbm90aGluZy4gIEluZGljYXRlcyB0byBhIHNlcnZlciB0aGF0CisgKiBhIG1hcCBzaG91bGQgYmUgdXBkYXRlZC4KKyAqCisgKiBZUFBST0NfQ0xFQVIJdGFrZXMgbm90aGluZywgcmV0dXJucyBub3RoaW5nLiAgSW5zdHJ1Y3RzIGEgTklTIHNlcnZlciB0bworICogY2xvc2UgdGhlIGN1cnJlbnQgbWFwLCBzbyB0aGF0IG9sZCB2ZXJzaW9ucyBvZiB0aGUgZGlzayBmaWxlIGRvbid0IGdldAorICogaGVsZCBvcGVuLgorICoKKyAqIFlQUFJPQ19BTEwgKHN0cnVjdCB5cHJlcV9ub2tleSksIHJldHVybnMKKyAqIAl1bmlvbiBzd2l0Y2ggKGJvb2xfdCBtb3JlKSB7CisgKgkJVFJVRToJKHN0cnVjdCB5cHJlc3Bfa2V5X3ZhbCk7CisgKgkJRkFMU0U6CShzdHJ1Y3QpIHt9OworICoJfQorICoKKyAqIFlQUFJPQ19NQVNURVIgKHN0cnVjdCB5cHJlcV9ub2tleSksIHJldHVybnMgKHlwcmVzcF9tYXN0ZXIpCisgKgorICogWVBQUk9DX09SREVSIChzdHJ1Y3QgeXByZXFfbm9rZXkpLCByZXR1cm5zICh5cHJlc3Bfb3JkZXIpCisgKgorICogWVBQUk9DX01BUExJU1QgKGNoYXIgKiksIHJldHVybnMgKHN0cnVjdCB5cG1hcGxpc3QgKikKKyAqLworCisvKiBQcm9ncmFtIGFuZCB2ZXJzaW9uIHN5bWJvbHMsIG1hZ2ljIG51bWJlcnMgKi8KKworI2RlZmluZSBZUFBST0cJCTEwMDAwNAorI2RlZmluZSBZUFZFUlMJCTIKKyNkZWZpbmUgWVBWRVJTX09SSUcJMQorI2RlZmluZSBZUE1BWFJFQ09SRAkxMDI0CisjZGVmaW5lIFlQTUFYRE9NQUlOCTY0IC8qIFhYWCBvcmlnLiB5cF9wcm90LmggZGVmaW5lcyAyNTYgKi8KKyNkZWZpbmUgWVBNQVhNQVAJNjQKKyNkZWZpbmUgWVBNQVhQRUVSCTY0IC8qIFhYWCBvcmlnLiB5cF9wcm90LmggZGVmaW5lcyAyNTYgKi8KKworLyogYnl0ZSBzaXplIG9mIGEgbGFyZ2UgTklTIHBhY2tldCAqLworI2RlZmluZSBZUE1TR1NaCQkxNjAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdV9pbnQga2V5ZGF0X2xlbjsKKyAgY2hhciAqa2V5ZGF0X3ZhbDsKK30ga2V5ZGF0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdV9pbnQgdmFsZGF0X2xlbjsKKyAgY2hhciAqdmFsZGF0X3ZhbDsKK30gdmFsZGF0X3Q7CisKK3N0cnVjdCB5cG1hcF9wYXJtcyB7CisgIGNoYXIgKmRvbWFpbjsJCQkvKiBOdWxsIHN0cmluZyBtZWFucyBub3QgYXZhaWxhYmxlICovCisgIGNoYXIgKm1hcDsJCQkvKiBOdWxsIHN0cmluZyBtZWFucyBub3QgYXZhaWxhYmxlICovCisgIHVuc2lnbmVkIGludCBvcmRlcm51bTsJLyogMCBtZWFucyBub3QgYXZhaWxhYmxlICovCisgIGNoYXIgKm93bmVyOwkJCS8qIE51bGwgc3RyaW5nIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KK307CisKKy8qCisgKiBSZXF1ZXN0IHBhcmFtZXRlciBzdHJ1Y3R1cmVzCisgKi8KKworc3RydWN0IHlwcmVxX2tleSB7CisgIGNvbnN0IGNoYXIgKmRvbWFpbjsKKyAgY29uc3QgY2hhciAqbWFwOworICBrZXlkYXRfdCBrZXlkYXQ7Cit9OworCitzdHJ1Y3QgeXByZXFfbm9rZXkgeworICBjaGFyICpkb21haW47CisgIGNoYXIgKm1hcDsKK307CisKK3N0cnVjdCB5cHJlcV94ZnIgeworICBzdHJ1Y3QgeXBtYXBfcGFybXMgbWFwX3Bhcm1zOworICB1X2ludCB0cmFuc2lkOworICB1X2ludCBwcm90bzsKKyAgdV9pbnQgcG9ydDsKK307CisKKyNkZWZpbmUgeXB4ZnJfZG9tYWluIG1hcF9wYXJtcy5kb21haW4KKyNkZWZpbmUgeXB4ZnJfbWFwIG1hcF9wYXJtcy5tYXAKKyNkZWZpbmUgeXB4ZnJfb3JkZXJudW0gbWFwX3Bhcm1zLm9yZGVybnVtCisjZGVmaW5lIHlweGZyX293bmVyIG1hcF9wYXJtcy5vd25lcgorCisvKiBSZXR1cm4gc3RhdHVzIHZhbHVlcyAqLworCitlbnVtIHlwc3RhdCB7CisgIFlQX1RSVUUgPSAxLAkJLyogR2VuZXJhbCBwdXJwb3NlIHN1Y2Nlc3MgY29kZSAqLworI2RlZmluZSBZUF9UUlVFIFlQX1RSVUUKKyAgWVBfTk9NT1JFID0gMiwJLyogTm8gbW9yZSBlbnRyaWVzIGluIG1hcCAqLworI2RlZmluZSBZUF9OT01PUkUgWVBfTk9NT1JFCisgIFlQX0ZBTFNFID0gMCwJCS8qIEdlbmVyYWwgcHVycG9zZSBmYWlsdXJlIGNvZGUgKi8KKyNkZWZpbmUgWVBfRkFMU0UgWVBfRkFMU0UKKyAgWVBfTk9NQVAgPSAtMSwJLyogTm8gc3VjaCBtYXAgaW4gZG9tYWluICovCisjZGVmaW5lIFlQX05PTUFQIFlQX05PTUFQCisgIFlQX05PRE9NID0gLTIsCS8qIERvbWFpbiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFlQX05PRE9NIFlQX05PRE9NCisgIFlQX05PS0VZID0gLTMsCS8qIE5vIHN1Y2gga2V5IGluIG1hcCAqLworI2RlZmluZSBZUF9OT0tFWSBZUF9OT0tFWQorICBZUF9CQURPUCA9IC00LAkvKiBJbnZhbGlkIG9wZXJhdGlvbiAqLworI2RlZmluZSBZUF9CQURPUCBZUF9CQURPUAorICBZUF9CQUREQiA9IC01LAkvKiBTZXJ2ZXIgZGF0YSBiYXNlIGlzIGJhZCAqLworI2RlZmluZSBZUF9CQUREQiBZUF9CQUREQgorICBZUF9ZUEVSUiA9IC02LAkvKiBOSVMgc2VydmVyIGVycm9yICovCisjZGVmaW5lIFlQX1lQRVJSIFlQX1lQRVJSCisgIFlQX0JBREFSR1MgPSAtNywJLyogUmVxdWVzdCBhcmd1bWVudHMgYmFkICovCisjZGVmaW5lIFlQX0JBREFSR1MgWVBfQkFEQVJHUworICBZUF9WRVJTID0gLTgsCQkvKiBOSVMgc2VydmVyIHZlcnNpb24gbWlzbWF0Y2ggLSBzZXJ2ZXIgY2FuJ3Qgc3VwcGx5CisJCQkgICByZXF1ZXN0ZWQgc2VydmljZS4gKi8KKyNkZWZpbmUgWVBfVkVSUyBZUF9WRVJTCit9OworCisvKgorICogUmVzcG9uc2UgcGFyYW1ldGVyIHN0cnVjdHVyZXMKKyAqLworCit0eXBlZGVmIGVudW0geXBzdGF0IHlwc3RhdDsKKworc3RydWN0IHlwcmVzcF92YWwgeworICB5cHN0YXQgc3RhdHVzOworICB2YWxkYXRfdCB2YWxkYXQ7Cit9OworCitzdHJ1Y3QgeXByZXNwX2tleV92YWwgeworICB5cHN0YXQgc3RhdHVzOworI2lmZGVmIFNUVVBJRF9TVU5fQlVHCisgIC8qIFRoaXMgaXMgdGhlIGZvcm0gYXMgZGlzdHJpYnV0ZWQgYnkgU3VuLiAgQnV0IGV2ZW4gdGhlIFN1biBOSVMKKyAgICAgc2VydmVycyBleHBlY3QgdGhlIHZhbHVlcyBpbiB0aGUgb3RoZXIgb3JkZXIuICBTbyB0aGVpcgorICAgICBpbXBsZW1lbnRhdGlvbiBzb21laG93IG11c3QgY2hhbmdlIHRoZSBvcmRlciBpbnRlcm5hbGx5LiAgV2UKKyAgICAgZG9uJ3Qgd2FudCB0byBmb2xsb3cgdGhpcyBiYWQgZXhhbXBsZSBzaW5jZSB0aGUgdXNlciBzaG91bGQgYmUKKyAgICAgYWJsZSB0byB1c2UgcnBjZ2VuIG9uIHRoaXMgZmlsZS4gICovCisgIGtleWRhdF90IGtleWRhdDsKKyAgdmFsZGF0X3QgdmFsZGF0OworI2Vsc2UKKyAgdmFsZGF0X3QgdmFsZGF0OworICBrZXlkYXRfdCBrZXlkYXQ7CisjZW5kaWYKK307CisKK3N0cnVjdCB5cHJlc3BfbWFzdGVyIHsKKyAgeXBzdGF0IHN0YXR1czsKKyAgY2hhciAqbWFzdGVyOworfTsKKworc3RydWN0IHlwcmVzcF9vcmRlciB7CisgIHlwc3RhdCBzdGF0dXM7CisgIHVfaW50IG9yZGVybnVtOworfTsKKworc3RydWN0IHlwbWFwbGlzdCB7CisgIGNoYXIgKm1hcDsKKyNkZWZpbmUgeXBtbF9uYW1lIG1hcAorICBzdHJ1Y3QgeXBtYXBsaXN0ICpuZXh0OworI2RlZmluZSB5cG1sX25leHQgbmV4dAorfTsKKworc3RydWN0IHlwcmVzcF9tYXBsaXN0IHsKKyAgeXBzdGF0IHN0YXR1czsKKyAgc3RydWN0IHlwbWFwbGlzdCAqbGlzdDsKK307CisKKy8qCisgKiBQcm9jZWR1cmUgc3ltYm9scy4gIFlQUFJPQ19OVUxMLCBZUFBST0NfRE9NQUlOLCBhbmQgWVBQUk9DX0RPTUFJTl9OT05BQ0sKKyAqIG11c3Qga2VlcCB0aGUgc2FtZSB2YWx1ZXMgKDAsIDEsIGFuZCAyKSB0aGF0IHRoZXkgaGFkIGluIHRoZSBmaXJzdCB2ZXJzaW9uCisgKiBvZiB0aGUgcHJvdG9jb2wuCisgKi8KKworI2RlZmluZSBZUFBST0NfTlVMTAkwCisjZGVmaW5lIFlQUFJPQ19ET01BSU4JMQorI2RlZmluZSBZUFBST0NfRE9NQUlOX05PTkFDSyAyCisjZGVmaW5lIFlQUFJPQ19NQVRDSAkzCisjZGVmaW5lIFlQUFJPQ19GSVJTVAk0CisjZGVmaW5lIFlQUFJPQ19ORVhUCTUKKyNkZWZpbmUgWVBQUk9DX1hGUgk2CisjZGVmaW5lIFlQUFJPQ19DTEVBUgk3CisjZGVmaW5lIFlQUFJPQ19BTEwJOAorI2RlZmluZSBZUFBST0NfTUFTVEVSCTkKKyNkZWZpbmUgWVBQUk9DX09SREVSCTEwCisjZGVmaW5lIFlQUFJPQ19NQVBMSVNUCTExCisjZGVmaW5lCVlQUFJPQ19ORVdYRlIJMTIKKworLyoKKyAqCQlQcm90b2NvbCBiZXR3ZWVuIGNsaWVudHMgYW5kIE5JUyBiaW5kZXIgc2VydmVycworICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2w6CisgKgorICogWVBCSU5EUFJPQ19OVUxMKCkgcmV0dXJucyAoKQorICogCXRha2VzIG5vdGhpbmcsIHJldHVybnMgbm90aGluZworICoKKyAqIFlQQklORFBST0NfRE9NQUlOIHRha2VzIChjaGFyICopIHJldHVybnMgKHN0cnVjdCB5cGJpbmRfcmVzcCkKKyAqCisgKiBZUEJJTkRQUk9DX1NFVERPTSB0YWtlcyAoc3RydWN0IHlwYmluZF9zZXRkb20pIHJldHVybnMgbm90aGluZworICovCisKKy8qIFByb2dyYW0gYW5kIHZlcnNpb24gc3ltYm9scywgbWFnaWMgbnVtYmVycyAqLworCisjZGVmaW5lIFlQQklORFBST0cJCTEwMDAwNworI2RlZmluZSBZUEJJTkRWRVJTCQkyCisjZGVmaW5lIFlQQklORFZFUlNfT1JJRwkJMQorCisvKiBQcm9jZWR1cmUgc3ltYm9scyAqLworCisjZGVmaW5lIFlQQklORFBST0NfTlVMTAkJMAorI2RlZmluZSBZUEJJTkRQUk9DX0RPTUFJTgkxCisjZGVmaW5lIFlQQklORFBST0NfU0VURE9NCTIKKy8qCisgKiBSZXNwb25zZSBzdHJ1Y3R1cmUgYW5kIG92ZXJhbGwgcmVzdWx0IHN0YXR1cyBjb2Rlcy4gIFN1Y2Nlc3MgYW5kIGZhaWx1cmUKKyAqIHJlcHJlc2VudCB0d28gc2VwYXJhdGUgcmVzcG9uc2UgbWVzc2FnZSB0eXBlcy4KKyAqLworCitlbnVtIHlwYmluZF9yZXNwdHlwZSB7WVBCSU5EX1NVQ0NfVkFMID0gMSwgWVBCSU5EX0ZBSUxfVkFMID0gMn07CisKK3N0cnVjdCB5cGJpbmRfYmluZGluZyB7CisgIHN0cnVjdCBpbl9hZGRyIHlwYmluZF9iaW5kaW5nX2FkZHI7CSAgICAgICAgLyogSW4gbmV0d29yayBvcmRlciAqLworICB1bnNpZ25lZCBzaG9ydCBpbnQgeXBiaW5kX2JpbmRpbmdfcG9ydDsJLyogSW4gbmV0d29yayBvcmRlciAqLworfTsKKworc3RydWN0IHlwYmluZF9yZXNwIHsKKyAgZW51bSB5cGJpbmRfcmVzcHR5cGUgeXBiaW5kX3N0YXR1czsKKyAgdW5pb24geworICAgIHVfaW50IHlwYmluZF9lcnJvcjsKKyAgICBzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgeXBiaW5kX2JpbmRpbmZvOworICB9IHlwYmluZF9yZXNwYm9keTsKK307CisKKworLyogRGV0YWlsZWQgZmFpbHVyZSByZWFzb24gY29kZXMgZm9yIHJlc3BvbnNlIGZpZWxkIHlwYmluZF9lcnJvciovCisKKyNkZWZpbmUgWVBCSU5EX0VSUl9FUlIgMQkJLyogSW50ZXJuYWwgZXJyb3IgKi8KKyNkZWZpbmUgWVBCSU5EX0VSUl9OT1NFUlYgMgkJLyogTm8gYm91bmQgc2VydmVyIGZvciBwYXNzZWQgZG9tYWluICovCisjZGVmaW5lIFlQQklORF9FUlJfUkVTQyAzCQkvKiBTeXN0ZW0gcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsdXJlICovCisKKy8qCisgKiBSZXF1ZXN0IGRhdGEgc3RydWN0dXJlIGZvciB5cGJpbmQgIlNldCBkb21haW4iIHByb2NlZHVyZS4KKyAqLworc3RydWN0IHlwYmluZF9zZXRkb20geworICBjaGFyICp5cHNldGRvbV9kb21haW47CisgIHN0cnVjdCB5cGJpbmRfYmluZGluZyB5cHNldGRvbV9iaW5kaW5nOworICB1X2ludCB5cHNldGRvbV92ZXJzOworfTsKKyNkZWZpbmUgeXBzZXRkb21fYWRkciB5cHNldGRvbV9iaW5kaW5nLnlwYmluZF9iaW5kaW5nX2FkZHIKKyNkZWZpbmUgeXBzZXRkb21fcG9ydCB5cHNldGRvbV9iaW5kaW5nLnlwYmluZF9iaW5kaW5nX3BvcnQKKworLyoKKyAqCQlQcm90b2NvbCBiZXR3ZWVuIGNsaWVudHMgKHlweGZyLCBvbmx5KSBhbmQgeXBwdXNoCisgKgkJeXBwdXNoIHNwZWFrcyBhIHByb3RvY29sIGluIHRoZSB0cmFuc2llbnQgcmFuZ2UsIHdoaWNoCisgKgkJaXMgc3VwcGxpZWQgdG8geXB4ZnIgYXMgYSBjb21tYW5kLWxpbmUgcGFyYW1ldGVyIHdoZW4gaXQKKyAqCQlpcyBhY3RpdmF0ZWQgYnkgeXBzZXJ2LgorICovCisjZGVmaW5lIFlQUFVTSFZFUlMJCTEKKyNkZWZpbmUgWVBQVVNIVkVSU19PUklHCQkxCisKKy8qIFByb2NlZHVyZSBzeW1ib2xzICovCisKKyNkZWZpbmUgWVBQVVNIUFJPQ19OVUxMCQkwCisjZGVmaW5lIFlQUFVTSFBST0NfWEZSUkVTUAkxCisKKy8qIFN0YXR1cyB2YWx1ZXMgZm9yIHlwcHVzaHJlc3BfeGZyLnN0YXR1cyAqLworCitlbnVtIHlwcHVzaF9zdGF0dXMgeworICBZUFBVU0hfU1VDQyA9IDEsCQkvKiBTdWNjZXNzICovCisjZGVmaW5lIFlQUFVTSF9TVUNDCVlQUFVTSF9TVUNDCisgIFlQUFVTSF9BR0UgPSAyLAkJLyogTWFzdGVyJ3MgdmVyc2lvbiBub3QgbmV3ZXIgKi8KKyNkZWZpbmUgWVBQVVNIX0FHRQlZUFBVU0hfQUdFCisgIFlQUFVTSF9OT01BUCA9IC0xLAkJLyogQ2FuJ3QgZmluZCBzZXJ2ZXIgZm9yIG1hcCAqLworI2RlZmluZSBZUFBVU0hfTk9NQVAgCVlQUFVTSF9OT01BUAorICBZUFBVU0hfTk9ET00gPSAtMiwJCS8qIERvbWFpbiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFlQUFVTSF9OT0RPTSAJWVBQVVNIX05PRE9NCisgIFlQUFVTSF9SU1JDID0gLTMsCQkvKiBMb2NhbCByZXNvdWNlIGFsbG9jIGZhaWx1cmUgKi8KKyNkZWZpbmUgWVBQVVNIX1JTUkMgCVlQUFVTSF9SU1JDCisgIFlQUFVTSF9SUEMgPSAtNCwJCS8qIFJQQyBmYWlsdXJlIHRhbGtpbmcgdG8gc2VydmVyICovCisjZGVmaW5lIFlQUFVTSF9SUEMgCVlQUFVTSF9SUEMKKyAgWVBQVVNIX01BRERSID0gLTUsCQkvKiBDYW4ndCBnZXQgbWFzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUgWVBQVVNIX01BRERSCVlQUFVTSF9NQUREUgorICBZUFBVU0hfWVBFUlIgPSAtNiwJCS8qIE5JUyBzZXJ2ZXIvbWFwIGRiIGVycm9yICovCisjZGVmaW5lIFlQUFVTSF9ZUEVSUiAJWVBQVVNIX1lQRVJSCisgIFlQUFVTSF9CQURBUkdTID0gLTcsCQkvKiBSZXF1ZXN0IGFyZ3VtZW50cyBiYWQgKi8KKyNkZWZpbmUgWVBQVVNIX0JBREFSR1MgCVlQUFVTSF9CQURBUkdTCisgIFlQUFVTSF9EQk0gPSAtOCwJCS8qIExvY2FsIGRibSBvcGVyYXRpb24gZmFpbGVkICovCisjZGVmaW5lIFlQUFVTSF9EQk0JWVBQVVNIX0RCTQorICBZUFBVU0hfRklMRSA9IC05LAkJLyogTG9jYWwgZmlsZSBJL08gb3BlcmF0aW9uIGZhaWxlZCAqLworI2RlZmluZSBZUFBVU0hfRklMRQlZUFBVU0hfRklMRQorICBZUFBVU0hfU0tFVyA9IC0xMCwJCS8qIE1hcCB2ZXJzaW9uIHNrZXcgZHVyaW5nIHRyYW5zZmVyICovCisjZGVmaW5lIFlQUFVTSF9TS0VXCVlQUFVTSF9TS0VXCisgIFlQUFVTSF9DTEVBUiA9IC0xMSwJCS8qIENhbid0IHNlbmQgIkNsZWFyIiByZXEgdG8gbG9jYWwgeXBzZXJ2ICovCisjZGVmaW5lIFlQUFVTSF9DTEVBUglZUFBVU0hfQ0xFQVIKKyAgWVBQVVNIX0ZPUkNFID0gLTEyLAkJLyogTm8gbG9jYWwgb3JkZXIgbnVtYmVyIGluIG1hcCAtIHVzZSAtZiBmbGFnKi8KKyNkZWZpbmUgWVBQVVNIX0ZPUkNFCVlQUFVTSF9GT1JDRQorICBZUFBVU0hfWEZSRVJSID0gLTEzLAkJLyogeXB4ZnIgZXJyb3IgKi8KKyNkZWZpbmUgWVBQVVNIX1hGUkVSUglZUFBVU0hfWEZSRVJSCisgIFlQUFVTSF9SRUZVU0VEID0gLTE0LAkJLyogVHJhbnNmZXIgcmVxdWVzdCByZWZ1c2VkIGJ5IHlwc2VydiAqLworI2RlZmluZSBZUFBVU0hfUkVGVVNFRAlZUFBVU0hfUkVGVVNFRAorICBZUFBVU0hfTk9BTElBUyA9IC0xNQkJLyogQWxpYXMgbm90IGZvdW5kIGZvciBtYXAgb3IgZG9tYWluICovCisjZGVmaW5lCVlQUFVTSF9OT0FMSUFTCVlQUFVTSF9OT0FMSUFTCit9OwordHlwZWRlZiBlbnVtIHlwcHVzaF9zdGF0dXMgeXBwdXNoX3N0YXR1czsKKworc3RydWN0IHlwcHVzaHJlc3BfeGZyIHsKKyAgdV9pbnQgdHJhbnNpZDsKKyAgeXBwdXNoX3N0YXR1cyBzdGF0dXM7Cit9OworCitzdHJ1Y3QgeXByZXNwX2FsbCB7CisgIGJvb2xfdCBtb3JlOworICB1bmlvbiB7CisgICAgc3RydWN0IHlwcmVzcF9rZXlfdmFsIHZhbDsKKyAgfSB5cHJlc3BfYWxsX3U7Cit9OworCitleHRlcm4gYm9vbF90IHhkcl95cHJlcV9rZXkgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXFfa2V5ICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVxX25va2V5IChYRFIgKl9feGRycywgc3RydWN0IHlwcmVxX25va2V5ICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVxX3hmciAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlcV94ZnIgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXNwX3ZhbCAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlc3BfdmFsICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwcmVzcF9rZXlfdmFsIChYRFIgKl9feGRycywgc3RydWN0IHlwcmVzcF9rZXlfdmFsICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwYmluZF9yZXNwIChYRFIgKl9feGRycywgc3RydWN0IHlwYmluZF9yZXNwICogX19vYmpwKTsKK2V4dGVybiBib29sX3QgeGRyX3lwYmluZF9zZXRkb20gKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXBiaW5kX3NldGRvbSAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cG1hcF9wYXJtcyAoWERSICpfX3hkcnMsIHN0cnVjdCB5cG1hcF9wYXJtcyAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHB1c2hyZXNwX3hmciAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHB1c2hyZXNwX3hmciAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlc3Bfb3JkZXIgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXNwX29yZGVyICAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl95cHJlc3BfbWFzdGVyIChYRFIgKl9feGRycywgc3RydWN0IHlwcmVzcF9tYXN0ZXIgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBhbGwgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXNwX21hcGxpc3QgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXByZXNwX21hcGxpc3QgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBiaW5kX2JpbmRpbmcgKFhEUiAqX194ZHJzLCBzdHJ1Y3QgeXBiaW5kX2JpbmRpbmcgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBiaW5kX3Jlc3B0eXBlIChYRFIgKl9feGRycywgZW51bSB5cGJpbmRfcmVzcHR5cGUgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBzdGF0IChYRFIgKl9feGRycywgZW51bSB5cGJpbmRfcmVzcHR5cGUgKiBfX29ianApOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXByZXNwX2FsbCAoWERSICpfX3hkcnMsIHN0cnVjdCB5cHJlc3BfYWxsICAqIF9fb2JqcCk7CitleHRlcm4gYm9vbF90IHhkcl9kb21haW5uYW1lIChYRFIgKl9feGRycywgY2hhciAqKiBfX29ianApOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogX1JQQ1NWQ19ZUF9QUk9UX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwY2xudC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBjbG50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzN2EyOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwY2xudC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVGhvcnN0ZW4gS3VrdWsgPGt1a3VrQHN1c2UuZGU+LCAxOTk2LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworCisjaWZuZGVmCV9fUlBDU1ZDX1lQQ0xOVF9IX18KKyNkZWZpbmUJX19SUENTVkNfWVBDTE5UX0hfXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogU29tZSBkZWZpbmVzICovCisjZGVmaW5lIFlQRVJSX1NVQ0NFU1MJMAkJLyogVGhlcmUgaXMgbm8gZXJyb3IgKi8KKyNkZWZpbmUJWVBFUlJfQkFEQVJHUwkxCQkvKiBBcmdzIHRvIGZ1bmN0aW9uIGFyZSBiYWQgKi8KKyNkZWZpbmUJWVBFUlJfUlBDIAkyCQkvKiBSUEMgZmFpbHVyZSAqLworI2RlZmluZQlZUEVSUl9ET01BSU4JMwkJLyogQ2FuJ3QgYmluZCB0byBhIHNlcnZlciB3aXRoIHRoaXMgZG9tYWluICovCisjZGVmaW5lCVlQRVJSX01BUAk0CQkvKiBObyBzdWNoIG1hcCBpbiBzZXJ2ZXIncyBkb21haW4gKi8KKyNkZWZpbmUJWVBFUlJfS0VZCTUJCS8qIE5vIHN1Y2gga2V5IGluIG1hcCAqLworI2RlZmluZQlZUEVSUl9ZUEVSUgk2CQkvKiBJbnRlcm5hbCB5cCBzZXJ2ZXIgb3IgY2xpZW50IGVycm9yICovCisjZGVmaW5lCVlQRVJSX1JFU1JDCTcJCS8qIExvY2FsIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHVyZSAqLworI2RlZmluZQlZUEVSUl9OT01PUkUJOAkJLyogTm8gbW9yZSByZWNvcmRzIGluIG1hcCBkYXRhYmFzZSAqLworI2RlZmluZQlZUEVSUl9QTUFQCTkJCS8qIENhbid0IGNvbW11bmljYXRlIHdpdGggcG9ydG1hcHBlciAqLworI2RlZmluZQlZUEVSUl9ZUEJJTkQJMTAJCS8qIENhbid0IGNvbW11bmljYXRlIHdpdGggeXBiaW5kICovCisjZGVmaW5lCVlQRVJSX1lQU0VSVgkxMQkJLyogQ2FuJ3QgY29tbXVuaWNhdGUgd2l0aCB5cHNlcnYgKi8KKyNkZWZpbmUJWVBFUlJfTk9ET00JMTIJCS8qIExvY2FsIGRvbWFpbiBuYW1lIG5vdCBzZXQgKi8KKyNkZWZpbmUJWVBFUlJfQkFEREIJMTMJCS8qIHlwIGRhdGEgYmFzZSBpcyBiYWQgKi8KKyNkZWZpbmUJWVBFUlJfVkVSUwkxNAkJLyogWVAgdmVyc2lvbiBtaXNtYXRjaCAqLworI2RlZmluZQlZUEVSUl9BQ0NFU1MJMTUJCS8qIEFjY2VzcyB2aW9sYXRpb24gKi8KKyNkZWZpbmUJWVBFUlJfQlVTWQkxNgkJLyogRGF0YWJhc2UgaXMgYnVzeSAqLworCisvKiBUeXBlcyBvZiB1cGRhdGUgb3BlcmF0aW9ucyAqLworI2RlZmluZQlZUE9QX0NIQU5HRQkxCQkvKiBDaGFuZ2UsIGRvIG5vdCBhZGQgKi8KKyNkZWZpbmUJWVBPUF9JTlNFUlQJMgkJLyogQWRkLCBkbyBub3QgY2hhbmdlICovCisjZGVmaW5lCVlQT1BfREVMRVRFCTMJCS8qIERlbGV0ZSB0aGlzIGVudHJ5ICovCisjZGVmaW5lCVlQT1BfU1RPUkUJNAkJLyogQWRkLCBvciBjaGFuZ2UgKi8KKworX19CRUdJTl9ERUNMUworCisvKiBzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sgKiBpcyB0aGUgYXJnIHdoaWNoIG11c3QgYmUgcGFzc2VkIHRvIHlwX2FsbC4gICovCitzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sKKyAgeworICAgIGludCAoKmZvcmVhY2gpIChpbnQgX19zdGF0dXMsIGNoYXIgKl9fa2V5LCBpbnQgX19rZXlsZW4sCisJCSAgICBjaGFyICpfX3ZhbCwgaW50IF9fdmFsbGVuLCBjaGFyICpfX2RhdGEpOworICAgIGNoYXIgKmRhdGE7CisgIH07CisKKy8qIEV4dGVybmFsIE5JUyBjbGllbnQgZnVuY3Rpb24gcmVmZXJlbmNlcy4gICovCitleHRlcm4gaW50IHlwX2JpbmQgKF9fY29uc3QgY2hhciAqKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgeXBfdW5iaW5kIChfX2NvbnN0IGNoYXIgKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfZ2V0X2RlZmF1bHRfZG9tYWluIChjaGFyICoqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9tYXRjaCAoX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwKKwkJICAgICBfX2NvbnN0IGludCwgY2hhciAqKiwgaW50ICopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX2ZpcnN0IChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosIGNoYXIgKiosCisJCSAgICAgaW50ICosIGNoYXIgKiosIGludCAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9uZXh0IChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosIF9fY29uc3QgY2hhciAqLAorCQkgICAgX19jb25zdCBpbnQsIGNoYXIgKiosIGludCAqLCBjaGFyICoqLCBpbnQgKikgX19USFJPVzsKK2V4dGVybiBpbnQgeXBfbWFzdGVyIChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosIGNoYXIgKiopIF9fVEhST1c7CitleHRlcm4gaW50IHlwX29yZGVyIChfX2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICosIHVuc2lnbmVkIGludCAqKSBfX1RIUk9XOworZXh0ZXJuIGludCB5cF9hbGwgKF9fY29uc3QgY2hhciAqLCBfX2NvbnN0IGNoYXIgKiwKKwkJICAgX19jb25zdCBzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sgKikgX19USFJPVzsKK2V4dGVybiBfX2NvbnN0IGNoYXIgKnlwZXJyX3N0cmluZyAoX19jb25zdCBpbnQpIF9fVEhST1c7CitleHRlcm4gX19jb25zdCBjaGFyICp5cGJpbmRlcnJfc3RyaW5nIChfX2NvbnN0IGludCkgX19USFJPVzsKK2V4dGVybiBpbnQgeXBwcm90X2VyciAoX19jb25zdCBpbnQpIF9fVEhST1c7CitleHRlcm4gaW50IHlwX3VwZGF0ZSAoY2hhciAqLCBjaGFyICosIHVuc2lnbmVkIGludCwgIGNoYXIgKiwKKwkJICAgICAgaW50LCBjaGFyICosIGludCkgX19USFJPVzsKKyNpZiAwCitleHRlcm4gaW50IHlwX21hcGxpc3QgKF9fY29uc3QgY2hhciAqLCBzdHJ1Y3QgeXBtYXBsaXN0ICoqKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb25zIGV4aXN0cyBvbmx5IHVuZGVyIEJTRCBhbmQgTGludXggc3lzdGVtcy4gICovCitleHRlcm4gaW50IF9feXBfY2hlY2sgKGNoYXIgKiopIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfX1JQQ1NWQ19ZUENMTlRfSF9fICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHBhc3N3ZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBwYXNzd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJlOWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBwYXNzd2QuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KKyAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgorICovCisKKyNpZm5kZWYgX1lQUEFTU1dEX0hfUlBDR0VOCisjZGVmaW5lIF9ZUFBBU1NXRF9IX1JQQ0dFTgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitzdHJ1Y3QgcGFzc3dkIHsKKwljaGFyICpwd19uYW1lOworCWNoYXIgKnB3X3Bhc3N3ZDsKKwlpbnQgcHdfdWlkOworCWludCBwd19naWQ7CisJY2hhciAqcHdfZ2Vjb3M7CisJY2hhciAqcHdfZGlyOworCWNoYXIgKnB3X3NoZWxsOworfTsKK3R5cGVkZWYgc3RydWN0IHBhc3N3ZCBwYXNzd2Q7CisKK3N0cnVjdCB5cHBhc3N3ZCB7CisJY2hhciAqb2xkcGFzczsKKwlwYXNzd2QgbmV3cHc7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBwYXNzd2QgeXBwYXNzd2Q7CisKKyNkZWZpbmUgWVBQQVNTV0RQUk9HIDEwMDAwOQorI2RlZmluZSBZUFBBU1NXRFZFUlMgMQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUgWVBQQVNTV0RQUk9DX1VQREFURSAxCitleHRlcm4gIGludCAqIHlwcGFzc3dkcHJvY191cGRhdGVfMSh5cHBhc3N3ZCAqLCBDTElFTlQgKik7CitleHRlcm4gIGludCAqIHlwcGFzc3dkcHJvY191cGRhdGVfMV9zdmMoeXBwYXNzd2QgKiwgc3RydWN0IHN2Y19yZXEgKik7CitleHRlcm4gaW50IHlwcGFzc3dkcHJvZ18xX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKKworI2Vsc2UgLyogSyZSIEMgKi8KKyNkZWZpbmUgWVBQQVNTV0RQUk9DX1VQREFURSAxCitleHRlcm4gIGludCAqIHlwcGFzc3dkcHJvY191cGRhdGVfMSgpOworZXh0ZXJuICBpbnQgKiB5cHBhc3N3ZHByb2NfdXBkYXRlXzFfc3ZjKCk7CitleHRlcm4gaW50IHlwcGFzc3dkcHJvZ18xX2ZyZWVyZXN1bHQgKCk7CisjZW5kaWYgLyogSyZSIEMgKi8KKworLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIGJvb2xfdCB4ZHJfcGFzc3dkIChYRFIgKiwgcGFzc3dkKik7CitleHRlcm4gIGJvb2xfdCB4ZHJfeXBwYXNzd2QgKFhEUiAqLCB5cHBhc3N3ZCopOworCisjZWxzZSAvKiBLJlIgQyAqLworZXh0ZXJuIGJvb2xfdCB4ZHJfcGFzc3dkICgpOworZXh0ZXJuIGJvb2xfdCB4ZHJfeXBwYXNzd2QgKCk7CisKKyNlbmRpZiAvKiBLJlIgQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIV9ZUFBBU1NXRF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXBwYXNzd2QueCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwcGFzc3dkLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzNDlhZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvcnBjc3ZjL3lwcGFzc3dkLngKQEAgLTAsMCArMSw2MyBAQAorLyogQCgjKXlwcGFzc3dkLngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKy8qIEAoIyl5cHBhc3N3ZC54IDEuMSA4Ny8wNC8xMyBDb3B5ciAxOTg3IFN1biBNaWNybyAqLworCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKiAKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICogCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqIAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICogCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKiAKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworCisvKgorICogWVAgcGFzc3dvcmQgdXBkYXRlIHByb3RvY29sCisgKiBSZXF1aXJlcyB1bml4IGF1dGhlbnRpY2F0aW9uCisgKi8KK3Byb2dyYW0gWVBQQVNTV0RQUk9HIHsKKwl2ZXJzaW9uIFlQUEFTU1dEVkVSUyB7CisJCS8qCisJCSAqIFVwZGF0ZSBteSBwYXNzd2QgZW50cnkgCisJCSAqLworCQlpbnQKKwkJWVBQQVNTV0RQUk9DX1VQREFURSh5cHBhc3N3ZCkgPSAxOworCX0gPSAxOworfSA9IDEwMDAwOTsKKworCitzdHJ1Y3QgcGFzc3dkIHsKKwlzdHJpbmcgcHdfbmFtZTw+OwkvKiB1c2VybmFtZSAqLworCXN0cmluZyBwd19wYXNzd2Q8PjsJLyogZW5jcnlwdGVkIHBhc3N3b3JkICovCisJaW50IHB3X3VpZDsJCS8qIHVzZXIgaWQgKi8KKwlpbnQgcHdfZ2lkOwkJLyogZ3JvdXAgaWQgKi8KKwlzdHJpbmcgcHdfZ2Vjb3M8PjsJLyogaW4gcmVhbCBsaWZlIG5hbWUgKi8KKwlzdHJpbmcgcHdfZGlyPD47CS8qIGhvbWUgZGlyZWN0b3J5ICovCisJc3RyaW5nIHB3X3NoZWxsPD47CS8qIGRlZmF1bHQgc2hlbGwgKi8KK307CisKK3N0cnVjdCB5cHBhc3N3ZCB7CisJc3RyaW5nIG9sZHBhc3M8PjsJLyogdW5lbmNyeXB0ZWQgb2xkIHBhc3N3b3JkICovCisJcGFzc3dkIG5ld3B3OwkJLyogbmV3IHBhc3N3ZCBlbnRyeSAqLworfTsKKworCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3JwY3N2Yy95cHVwZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXB1cGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTNlNjlkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9ycGNzdmMveXB1cGQuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIgb3Igd2l0aCB0aGUgZXhwcmVzcyB3cml0dGVuIGNvbnNlbnQgb2YKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NiwgMTk5MCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKy8qIGZyb20gQCgjKXlwdXBkYXRlX3Byb3QueAkxLjMgOTEvMDMvMTEgVElSUEMgMS4wICovCisKKyNpZm5kZWYgX19SUENTVkNfWVBVUERfSF9fCisjZGVmaW5lIF9fUlBDU1ZDX1lQVVBEX0hfXworCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKworI2RlZmluZSBNQVhNQVBOQU1FTEVOIDI1NQorI2RlZmluZSBNQVhZUERBVEFMRU4gMTAyMworI2RlZmluZSBNQVhFUlJNU0dMRU4gMjU1CisKK19fQkVHSU5fREVDTFMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50IHlwX2J1Zl9sZW47CisJY2hhciAqeXBfYnVmX3ZhbDsKK30geXBfYnVmOworCitleHRlcm4gIGJvb2xfdCB4ZHJfeXBfYnVmIChYRFIgKiwgeXBfYnVmKik7CisKK3N0cnVjdCB5cHVwZGF0ZV9hcmdzIHsKKwljaGFyICptYXBuYW1lOworCXlwX2J1ZiBrZXk7CisJeXBfYnVmIGRhdHVtOworfTsKK3R5cGVkZWYgc3RydWN0IHlwdXBkYXRlX2FyZ3MgeXB1cGRhdGVfYXJnczsKKworZXh0ZXJuICBib29sX3QgeGRyX3lwdXBkYXRlX2FyZ3MgKFhEUiAqLCB5cHVwZGF0ZV9hcmdzKik7CisKK3N0cnVjdCB5cGRlbGV0ZV9hcmdzIHsKKwljaGFyICptYXBuYW1lOworCXlwX2J1ZiBrZXk7Cit9OwordHlwZWRlZiBzdHJ1Y3QgeXBkZWxldGVfYXJncyB5cGRlbGV0ZV9hcmdzOworCitleHRlcm4gIGJvb2xfdCB4ZHJfeXBkZWxldGVfYXJncyAoWERSICosIHlwZGVsZXRlX2FyZ3MqKTsKKworI2RlZmluZSBZUFVfUFJPRyAxMDAwMjgKKyNkZWZpbmUgWVBVX1ZFUlMgMQorCisjZGVmaW5lIFlQVV9DSEFOR0UgMQorZXh0ZXJuICB1X2ludCAqIHlwdV9jaGFuZ2VfMSAoeXB1cGRhdGVfYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIHVfaW50ICogeXB1X2NoYW5nZV8xX3N2YyAoeXB1cGRhdGVfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgWVBVX0lOU0VSVCAyCitleHRlcm4gIHVfaW50ICogeXB1X2luc2VydF8xICh5cHVwZGF0ZV9hcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgdV9pbnQgKiB5cHVfaW5zZXJ0XzFfc3ZjICh5cHVwZGF0ZV9hcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBZUFVfREVMRVRFIDMKK2V4dGVybiAgdV9pbnQgKiB5cHVfZGVsZXRlXzEgKHlwZGVsZXRlX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHlwdV9kZWxldGVfMV9zdmMgKHlwZGVsZXRlX2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIFlQVV9TVE9SRSA0CitleHRlcm4gIHVfaW50ICogeXB1X3N0b3JlXzEgKHlwdXBkYXRlX2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICB1X2ludCAqIHlwdV9zdG9yZV8xX3N2YyAoeXB1cGRhdGVfYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qICFfX1JQQ1NWQ19ZUFVQRF9IX18gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NoZWQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTVjODBmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY2hlZC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiBEZWZpbml0aW9ucyBmb3IgUE9TSVggMTAwMy4xYi0xOTkzIChha2EgUE9TSVguNCkgc2NoZWR1bGluZyBpbnRlcmZhY2UuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsMTk5NywxOTk5LDIwMDEtMjAwNCwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TQ0hFRF9ICisjZGVmaW5lCV9TQ0hFRF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0eXBlIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIF9fbmVlZF90aW1lc3BlYworI2luY2x1ZGUgPHRpbWUuaD4KKworLyogR2V0IHN5c3RlbSBzcGVjaWZpYyBjb25zdGFudCBhbmQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAqLworI2luY2x1ZGUgPGJpdHMvc2NoZWQuaD4KKy8qIERlZmluZSB0aGUgcmVhbCBuYW1lcyBmb3IgdGhlIGVsZW1lbnRzIG9mIGBzdHJ1Y3Qgc2NoZWRfcGFyYW0nLiAgKi8KKyNkZWZpbmUgc2NoZWRfcHJpb3JpdHkJX19zY2hlZF9wcmlvcml0eQorCisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgYSBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfc2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKQorICAgICBfX1RIUk9XOworCisvKiBSZXRyaWV2ZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgZm9yIGEgcGFydGljdWxhciBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0cGFyYW0gKF9fcGlkX3QgX19waWQsIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgX19USFJPVzsKKworLyogU2V0IHNjaGVkdWxpbmcgYWxnb3JpdGhtIGFuZC9vciBwYXJhbWV0ZXJzIGZvciBhIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBzY2hlZF9zZXRzY2hlZHVsZXIgKF9fcGlkX3QgX19waWQsIGludCBfX3BvbGljeSwKKwkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgX19USFJPVzsKKworLyogUmV0cmlldmUgc2NoZWR1bGluZyBhbGdvcml0aG0gZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0c2NoZWR1bGVyIChfX3BpZF90IF9fcGlkKSBfX1RIUk9XOworCisvKiBZaWVsZCB0aGUgcHJvY2Vzc29yLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfeWllbGQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIGZvciBhIHNjaGVkdWxlci4gICovCitleHRlcm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9tYXggKGludCBfX2FsZ29yaXRobSkgX19USFJPVzsKKworLyogR2V0IG1pbmltdW0gcHJpb3JpdHkgdmFsdWUgZm9yIGEgc2NoZWR1bGVyLiAgKi8KK2V4dGVybiBpbnQgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAoaW50IF9fYWxnb3JpdGhtKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIFNDSEVEX1JSIGludGVydmFsIGZvciB0aGUgbmFtZWQgcHJvY2Vzcy4gICovCitleHRlcm4gaW50IHNjaGVkX3JyX2dldF9pbnRlcnZhbCAoX19waWRfdCBfX3BpZCwgc3RydWN0IHRpbWVzcGVjICpfX3QpIF9fVEhST1c7CisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogQWNjZXNzIG1hY3JvcyBmb3IgYGNwdV9zZXQnLiAgKi8KKyMgZGVmaW5lIENQVV9TRVRTSVpFIF9fQ1BVX1NFVFNJWkUKKyMgZGVmaW5lIENQVV9TRVQoY3B1LCBjcHVzZXRwKQkgX19DUFVfU0VUX1MgKGNwdSwgc2l6ZW9mIChjcHVfc2V0X3QpLCBjcHVzZXRwKQorIyBkZWZpbmUgQ1BVX0NMUihjcHUsIGNwdXNldHApCSBfX0NQVV9DTFJfUyAoY3B1LCBzaXplb2YgKGNwdV9zZXRfdCksIGNwdXNldHApCisjIGRlZmluZSBDUFVfSVNTRVQoY3B1LCBjcHVzZXRwKSBfX0NQVV9JU1NFVF9TIChjcHUsIHNpemVvZiAoY3B1X3NldF90KSwgXAorCQkJCQkJY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9aRVJPKGNwdXNldHApCSBfX0NQVV9aRVJPX1MgKHNpemVvZiAoY3B1X3NldF90KSwgY3B1c2V0cCkKKyMgZGVmaW5lIENQVV9DT1VOVChjcHVzZXRwKQkgX19DUFVfQ09VTlRfUyAoc2l6ZW9mIChjcHVfc2V0X3QpLCBjcHVzZXRwKQorCisjIGRlZmluZSBDUFVfU0VUX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSAgIF9fQ1BVX1NFVF9TIChjcHUsIHNldHNpemUsIGNwdXNldHApCisjIGRlZmluZSBDUFVfQ0xSX1MoY3B1LCBzZXRzaXplLCBjcHVzZXRwKSAgIF9fQ1BVX0NMUl9TIChjcHUsIHNldHNpemUsIGNwdXNldHApCisjIGRlZmluZSBDUFVfSVNTRVRfUyhjcHUsIHNldHNpemUsIGNwdXNldHApIF9fQ1BVX0lTU0VUX1MgKGNwdSwgc2V0c2l6ZSwgXAorCQkJCQkJCSAgIGNwdXNldHApCisjIGRlZmluZSBDUFVfWkVST19TKHNldHNpemUsIGNwdXNldHApCSAgICBfX0NQVV9aRVJPX1MgKHNldHNpemUsIGNwdXNldHApCisjIGRlZmluZSBDUFVfQ09VTlRfUyhzZXRzaXplLCBjcHVzZXRwKQkgICAgX19DUFVfQ09VTlRfUyAoc2V0c2l6ZSwgY3B1c2V0cCkKKworIyBkZWZpbmUgQ1BVX0VRVUFMKGNwdXNldHAxLCBjcHVzZXRwMikgXAorICBfX0NQVV9FUVVBTF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGNwdXNldHAxLCBjcHVzZXRwMikKKyMgZGVmaW5lIENQVV9FUVVBTF9TKHNldHNpemUsIGNwdXNldHAxLCBjcHVzZXRwMikgXAorICBfX0NQVV9FUVVBTF9TIChzZXRzaXplLCBjcHVzZXRwMSwgY3B1c2V0cDIpCisKKyMgZGVmaW5lIENQVV9BTkQoZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsICYpCisjIGRlZmluZSBDUFVfT1IoZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MikgXAorICBfX0NQVV9PUF9TIChzaXplb2YgKGNwdV9zZXRfdCksIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsIHwpCisjIGRlZmluZSBDUFVfWE9SKGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2l6ZW9mIChjcHVfc2V0X3QpLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyLCBeKQorIyBkZWZpbmUgQ1BVX0FORF9TKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgJikKKyMgZGVmaW5lIENQVV9PUl9TKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIpIFwKKyAgX19DUFVfT1BfUyAoc2V0c2l6ZSwgZGVzdHNldCwgc3Jjc2V0MSwgc3Jjc2V0MiwgfCkKKyMgZGVmaW5lIENQVV9YT1JfUyhzZXRzaXplLCBkZXN0c2V0LCBzcmNzZXQxLCBzcmNzZXQyKSBcCisgIF9fQ1BVX09QX1MgKHNldHNpemUsIGRlc3RzZXQsIHNyY3NldDEsIHNyY3NldDIsIF4pCisKKyMgZGVmaW5lIENQVV9BTExPQ19TSVpFKGNvdW50KSBfX0NQVV9BTExPQ19TSVpFIChjb3VudCkKKyMgZGVmaW5lIENQVV9BTExPQyhjb3VudCkgX19DUFVfQUxMT0MgKGNvdW50KQorIyBkZWZpbmUgQ1BVX0ZSRUUoY3B1c2V0KSBfX0NQVV9GUkVFIChjcHVzZXQpCisKKworLyogU2V0IHRoZSBDUFUgYWZmaW5pdHkgZm9yIGEgdGFzayAqLworZXh0ZXJuIGludCBzY2hlZF9zZXRhZmZpbml0eSAoX19waWRfdCBfX3BpZCwgc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCSAgICAgIF9fY29uc3QgY3B1X3NldF90ICpfX2NwdXNldCkgX19USFJPVzsKKworLyogR2V0IHRoZSBDUFUgYWZmaW5pdHkgZm9yIGEgdGFzayAqLworZXh0ZXJuIGludCBzY2hlZF9nZXRhZmZpbml0eSAoX19waWRfdCBfX3BpZCwgc2l6ZV90IF9fY3B1c2V0c2l6ZSwKKwkJCSAgICAgIGNwdV9zZXRfdCAqX19jcHVzZXQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHNjaGVkLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2NzaS9zY3NpLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YWI3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaS5oCkBAIC0wLDAgKzEsMjI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHB1YmxpYyBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgdXNlZCBieQorICogdGhlIHNjc2kgY29kZSBmb3IgbGludXguCisgKi8KKworI2lmbmRlZiBfU0NTSV9TQ1NJX0gKKyNkZWZpbmUgX1NDU0lfU0NTSV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qCisgKiAgICAgIFNDU0kgb3Bjb2RlcworICovCisKKyNkZWZpbmUgVEVTVF9VTklUX1JFQURZICAgICAgIDB4MDAKKyNkZWZpbmUgUkVaRVJPX1VOSVQgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkVRVUVTVF9TRU5TRSAgICAgICAgIDB4MDMKKyNkZWZpbmUgRk9STUFUX1VOSVQgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUkVBRF9CTE9DS19MSU1JVFMgICAgIDB4MDUKKyNkZWZpbmUgUkVBU1NJR05fQkxPQ0tTICAgICAgIDB4MDcKKyNkZWZpbmUgUkVBRF82ICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgV1JJVEVfNiAgICAgICAgICAgICAgIDB4MGEKKyNkZWZpbmUgU0VFS182ICAgICAgICAgICAgICAgIDB4MGIKKyNkZWZpbmUgUkVBRF9SRVZFUlNFICAgICAgICAgIDB4MGYKKyNkZWZpbmUgV1JJVEVfRklMRU1BUktTICAgICAgIDB4MTAKKyNkZWZpbmUgU1BBQ0UgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgSU5RVUlSWSAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUkVDT1ZFUl9CVUZGRVJFRF9EQVRBIDB4MTQKKyNkZWZpbmUgTU9ERV9TRUxFQ1QgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgUkVTRVJWRSAgICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgUkVMRUFTRSAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgQ09QWSAgICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgRVJBU0UgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgTU9ERV9TRU5TRSAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgU1RBUlRfU1RPUCAgICAgICAgICAgIDB4MWIKKyNkZWZpbmUgUkVDRUlWRV9ESUFHTk9TVElDICAgIDB4MWMKKyNkZWZpbmUgU0VORF9ESUFHTk9TVElDICAgICAgIDB4MWQKKyNkZWZpbmUgQUxMT1dfTUVESVVNX1JFTU9WQUwgIDB4MWUKKworI2RlZmluZSBTRVRfV0lORE9XICAgICAgICAgICAgMHgyNAorI2RlZmluZSBSRUFEX0NBUEFDSVRZICAgICAgICAgMHgyNQorI2RlZmluZSBSRUFEXzEwICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBXUklURV8xMCAgICAgICAgICAgICAgMHgyYQorI2RlZmluZSBTRUVLXzEwICAgICAgICAgICAgICAgMHgyYgorI2RlZmluZSBXUklURV9WRVJJRlkgICAgICAgICAgMHgyZQorI2RlZmluZSBWRVJJRlkgICAgICAgICAgICAgICAgMHgyZgorI2RlZmluZSBTRUFSQ0hfSElHSCAgICAgICAgICAgMHgzMAorI2RlZmluZSBTRUFSQ0hfRVFVQUwgICAgICAgICAgMHgzMQorI2RlZmluZSBTRUFSQ0hfTE9XICAgICAgICAgICAgMHgzMgorI2RlZmluZSBTRVRfTElNSVRTICAgICAgICAgICAgMHgzMworI2RlZmluZSBQUkVfRkVUQ0ggICAgICAgICAgICAgMHgzNAorI2RlZmluZSBSRUFEX1BPU0lUSU9OICAgICAgICAgMHgzNAorI2RlZmluZSBTWU5DSFJPTklaRV9DQUNIRSAgICAgMHgzNQorI2RlZmluZSBMT0NLX1VOTE9DS19DQUNIRSAgICAgMHgzNgorI2RlZmluZSBSRUFEX0RFRkVDVF9EQVRBICAgICAgMHgzNworI2RlZmluZSBNRURJVU1fU0NBTiAgICAgICAgICAgMHgzOAorI2RlZmluZSBDT01QQVJFICAgICAgICAgICAgICAgMHgzOQorI2RlZmluZSBDT1BZX1ZFUklGWSAgICAgICAgICAgMHgzYQorI2RlZmluZSBXUklURV9CVUZGRVIgICAgICAgICAgMHgzYgorI2RlZmluZSBSRUFEX0JVRkZFUiAgICAgICAgICAgMHgzYworI2RlZmluZSBVUERBVEVfQkxPQ0sgICAgICAgICAgMHgzZAorI2RlZmluZSBSRUFEX0xPTkcgICAgICAgICAgICAgMHgzZQorI2RlZmluZSBXUklURV9MT05HICAgICAgICAgICAgMHgzZgorI2RlZmluZSBDSEFOR0VfREVGSU5JVElPTiAgICAgMHg0MAorI2RlZmluZSBXUklURV9TQU1FICAgICAgICAgICAgMHg0MQorI2RlZmluZSBSRUFEX1RPQyAgICAgICAgICAgICAgMHg0MworI2RlZmluZSBMT0dfU0VMRUNUICAgICAgICAgICAgMHg0YworI2RlZmluZSBMT0dfU0VOU0UgICAgICAgICAgICAgMHg0ZAorI2RlZmluZSBNT0RFX1NFTEVDVF8xMCAgICAgICAgMHg1NQorI2RlZmluZSBSRVNFUlZFXzEwICAgICAgICAgICAgMHg1NgorI2RlZmluZSBSRUxFQVNFXzEwICAgICAgICAgICAgMHg1NworI2RlZmluZSBNT0RFX1NFTlNFXzEwICAgICAgICAgMHg1YQorI2RlZmluZSBQRVJTSVNURU5UX1JFU0VSVkVfSU4gMHg1ZQorI2RlZmluZSBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIDB4NWYKKyNkZWZpbmUgTU9WRV9NRURJVU0gICAgICAgICAgIDB4YTUKKyNkZWZpbmUgUkVBRF8xMiAgICAgICAgICAgICAgIDB4YTgKKyNkZWZpbmUgV1JJVEVfMTIgICAgICAgICAgICAgIDB4YWEKKyNkZWZpbmUgV1JJVEVfVkVSSUZZXzEyICAgICAgIDB4YWUKKyNkZWZpbmUgU0VBUkNIX0hJR0hfMTIgICAgICAgIDB4YjAKKyNkZWZpbmUgU0VBUkNIX0VRVUFMXzEyICAgICAgIDB4YjEKKyNkZWZpbmUgU0VBUkNIX0xPV18xMiAgICAgICAgIDB4YjIKKyNkZWZpbmUgUkVBRF9FTEVNRU5UX1NUQVRVUyAgIDB4YjgKKyNkZWZpbmUgU0VORF9WT0xVTUVfVEFHICAgICAgIDB4YjYKKyNkZWZpbmUgV1JJVEVfTE9OR18yICAgICAgICAgIDB4ZWEKKworLyoKKyAqICBTdGF0dXMgY29kZXMKKyAqLworCisjZGVmaW5lIEdPT0QgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQ0hFQ0tfQ09ORElUSU9OICAgICAgMHgwMQorI2RlZmluZSBDT05ESVRJT05fR09PRCAgICAgICAweDAyCisjZGVmaW5lIEJVU1kgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgSU5URVJNRURJQVRFX0dPT0QgICAgMHgwOAorI2RlZmluZSBJTlRFUk1FRElBVEVfQ19HT09EICAweDBhCisjZGVmaW5lIFJFU0VSVkFUSU9OX0NPTkZMSUNUIDB4MGMKKyNkZWZpbmUgQ09NTUFORF9URVJNSU5BVEVEICAgMHgxMQorI2RlZmluZSBRVUVVRV9GVUxMICAgICAgICAgICAweDE0CisKKyNkZWZpbmUgU1RBVFVTX01BU0sgICAgICAgICAgMHgzZQorCisvKgorICogIFNFTlNFIEtFWVMKKyAqLworCisjZGVmaW5lIE5PX1NFTlNFICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRUNPVkVSRURfRVJST1IgICAgIDB4MDEKKyNkZWZpbmUgTk9UX1JFQURZICAgICAgICAgICAweDAyCisjZGVmaW5lIE1FRElVTV9FUlJPUiAgICAgICAgMHgwMworI2RlZmluZSBIQVJEV0FSRV9FUlJPUiAgICAgIDB4MDQKKyNkZWZpbmUgSUxMRUdBTF9SRVFVRVNUICAgICAweDA1CisjZGVmaW5lIFVOSVRfQVRURU5USU9OICAgICAgMHgwNgorI2RlZmluZSBEQVRBX1BST1RFQ1QgICAgICAgIDB4MDcKKyNkZWZpbmUgQkxBTktfQ0hFQ0sgICAgICAgICAweDA4CisjZGVmaW5lIENPUFlfQUJPUlRFRCAgICAgICAgMHgwYQorI2RlZmluZSBBQk9SVEVEX0NPTU1BTkQgICAgIDB4MGIKKyNkZWZpbmUgVk9MVU1FX09WRVJGTE9XICAgICAweDBkCisjZGVmaW5lIE1JU0NPTVBBUkUgICAgICAgICAgMHgwZQorCisKKy8qCisgKiAgREVWSUNFIFRZUEVTCisgKi8KKworI2RlZmluZSBUWVBFX0RJU0sgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgVFlQRV9UQVBFICAgICAgICAgICAweDAxCisjZGVmaW5lIFRZUEVfUFJPQ0VTU09SICAgICAgMHgwMyAgICAvKiBIUCBzY2FubmVycyB1c2UgdGhpcyAqLworI2RlZmluZSBUWVBFX1dPUk0gICAgICAgICAgIDB4MDQgICAgLyogVHJlYXRlZCBhcyBST00gYnkgb3VyIHN5c3RlbSAqLworI2RlZmluZSBUWVBFX1JPTSAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgVFlQRV9TQ0FOTkVSICAgICAgICAweDA2CisjZGVmaW5lIFRZUEVfTU9EICAgICAgICAgICAgMHgwNyAgICAvKiBNYWduZXRvLW9wdGljYWwgZGlzayAtCisJCQkJICAgICAqIC0gdHJlYXRlZCBhcyBUWVBFX0RJU0sgKi8KKyNkZWZpbmUgVFlQRV9NRURJVU1fQ0hBTkdFUiAweDA4CisjZGVmaW5lIFRZUEVfRU5DTE9TVVJFCSAgICAweDBkICAgIC8qIEVuY2xvc3VyZSBTZXJ2aWNlcyBEZXZpY2UgKi8KKyNkZWZpbmUgVFlQRV9OT19MVU4gICAgICAgICAweDdmCisKKy8qCisgKiBzdGFuZGFyZCBtb2RlLXNlbGVjdCBoZWFkZXIgcHJlcGVuZGVkIHRvIGFsbCBtb2RlLXNlbGVjdCBjb21tYW5kcworICoKKyAqIG1vdmVkIGhlcmUgZnJvbSBjZHJvbS5oIC0tIGtyYXhlbAorICovCisKK3N0cnVjdCBjY3NfbW9kZXNlbF9oZWFkCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyIF9yMTsJCQkvKiByZXNlcnZlZC4gICovCisgICAgdW5zaWduZWQgY2hhciBtZWRpdW07CQkvKiBkZXZpY2Utc3BlY2lmaWMgbWVkaXVtIHR5cGUuICAqLworICAgIHVuc2lnbmVkIGNoYXIgX3IyOwkJCS8qIHJlc2VydmVkLiAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJsb2NrX2Rlc2NfbGVuZ3RoOwkvKiBibG9jayBkZXNjcmlwdG9yIGxlbmd0aC4gICovCisgICAgdW5zaWduZWQgY2hhciBkZW5zaXR5OwkJLyogZGV2aWNlLXNwZWNpZmljIGRlbnNpdHkgY29kZS4gICovCisgICAgdW5zaWduZWQgY2hhciBudW1iZXJfYmxvY2tzX2hpOwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHRoaXMgYmxvY2sKKwkJCQkJICAgZGVzYy4gICovCisgICAgdW5zaWduZWQgY2hhciBudW1iZXJfYmxvY2tzX21lZDsKKyAgICB1bnNpZ25lZCBjaGFyIG51bWJlcl9ibG9ja3NfbG87CisgICAgdW5zaWduZWQgY2hhciBfcjM7CisgICAgdW5zaWduZWQgY2hhciBibG9ja19sZW5ndGhfaGk7CS8qIGJsb2NrIGxlbmd0aCBmb3IgYmxvY2tzIGluIHRoaXMKKwkJCQkJICAgZGVzYy4gICovCisgICAgdW5zaWduZWQgY2hhciBibG9ja19sZW5ndGhfbWVkOworICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tfbGVuZ3RoX2xvOworICB9OworCisvKgorICogIE1FU1NBR0UgQ09ERVMKKyAqLworCisjZGVmaW5lIENPTU1BTkRfQ09NUExFVEUgICAgMHgwMAorI2RlZmluZSBFWFRFTkRFRF9NRVNTQUdFICAgIDB4MDEKKyNkZWZpbmUgICAgIEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVIgICAgMHgwMAorI2RlZmluZSAgICAgRVhURU5ERURfU0RUUiAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWSAgICAgIDB4MDIgICAgLyogU0NTSS1JIG9ubHkgKi8KKyNkZWZpbmUgICAgIEVYVEVOREVEX1dEVFIgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBTQVZFX1BPSU5URVJTICAgICAgIDB4MDIKKyNkZWZpbmUgUkVTVE9SRV9QT0lOVEVSUyAgICAweDAzCisjZGVmaW5lIERJU0NPTk5FQ1QgICAgICAgICAgMHgwNAorI2RlZmluZSBJTklUSUFUT1JfRVJST1IgICAgIDB4MDUKKyNkZWZpbmUgQUJPUlQgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIE1FU1NBR0VfUkVKRUNUICAgICAgMHgwNworI2RlZmluZSBOT1AgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVNHX1BBUklUWV9FUlJPUiAgICAweDA5CisjZGVmaW5lIExJTktFRF9DTURfQ09NUExFVEUgMHgwYQorI2RlZmluZSBMSU5LRURfRkxHX0NNRF9DT01QTEVURSAweDBiCisjZGVmaW5lIEJVU19ERVZJQ0VfUkVTRVQgICAgMHgwYworCisjZGVmaW5lIElOSVRJQVRFX1JFQ09WRVJZICAgMHgwZiAgICAgICAgICAgIC8qIFNDU0ktSUkgb25seSAqLworI2RlZmluZSBSRUxFQVNFX1JFQ09WRVJZICAgIDB4MTAgICAgICAgICAgICAvKiBTQ1NJLUlJIG9ubHkgKi8KKworI2RlZmluZSBTSU1QTEVfUVVFVUVfVEFHICAgIDB4MjAKKyNkZWZpbmUgSEVBRF9PRl9RVUVVRV9UQUcgICAweDIxCisjZGVmaW5lIE9SREVSRURfUVVFVUVfVEFHICAgMHgyMgorCisvKgorICogSGVyZSBhcmUgc29tZSBzY3NpIHNwZWNpZmljIGlvY3RsIGNvbW1hbmRzIHdoaWNoIGFyZSBzb21ldGltZXMgdXNlZnVsLgorICovCisvKiBUaGVzZSBhcmUgYSBmZXcgb3RoZXIgY29uc3RhbnRzIG9ubHkgdXNlZCBieSBzY3NpIGRldmljZXMuICAqLworCisjZGVmaW5lIFNDU0lfSU9DVExfR0VUX0lETFVOIDB4NTM4MgorCisvKiBVc2VkIHRvIHR1cm4gb24gYW5kIG9mZiB0YWdnZWQgcXVldWluZyBmb3Igc2NzaSBkZXZpY2VzLiAgKi8KKworI2RlZmluZSBTQ1NJX0lPQ1RMX1RBR0dFRF9FTkFCTEUgMHg1MzgzCisjZGVmaW5lIFNDU0lfSU9DVExfVEFHR0VEX0RJU0FCTEUgMHg1Mzg0CisKKy8qIFVzZWQgdG8gb2J0YWluIHRoZSBob3N0IG51bWJlciBvZiBhIGRldmljZS4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfUFJPQkVfSE9TVCAweDUzODUKKworLyogVXNlZCB0byBnZXQgdGhlIGJ1cyBudW1iZXIgZm9yIGEgZGV2aWNlLiAgKi8KKyNkZWZpbmUgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUiAweDUzODYKKworI2VuZGlmIC8qIHNjc2kvc2NzaS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2NzaV9pb2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3Njc2lfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWYwMTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3Njc2lfaW9jdGwuaApAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NDU0lfSU9DVExfSAorI2RlZmluZSBfU0NTSV9JT0NUTF9IIAorCisvKiBJT0NUTHMgZm9yIFNDU0kuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORAkJMQkvKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgU0NTSSBob3N0LiAgKi8KKyNkZWZpbmUgU0NTSV9JT0NUTF9URVNUX1VOSVRfUkVBRFkJMgkvKiBUZXN0IGlmIHVuaXQgaXMgcmVhZHkuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX0JFTkNITUFSS19DT01NQU5ECTMKKyNkZWZpbmUgU0NTSV9JT0NUTF9TWU5DCQkJNAkvKiBSZXF1ZXN0IHN5bmNocm9ub3VzIHBhcmFtZXRlcnMuICAqLworI2RlZmluZSBTQ1NJX0lPQ1RMX1NUQVJUX1VOSVQJCTUKKyNkZWZpbmUgU0NTSV9JT0NUTF9TVE9QX1VOSVQJCTYKKyNkZWZpbmUgU0NTSV9JT0NUTF9ET09STE9DSwkJMHg1MzgwCS8qIExvY2sgdGhlIGVqZWN0IG1lY2hhbmlzbS4gICovCisjZGVmaW5lIFNDU0lfSU9DVExfRE9PUlVOTE9DSwkJMHg1MzgxCS8qIFVubG9jayB0aGUgbWVjaGFuaXNtLiAgKi8KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3NnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Njc2kvc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRjMGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zY3NpL3NnLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgICBIaXN0b3J5OgorICAgIFN0YXJ0ZWQ6IEF1ZyA5IGJ5IExhd3JlbmNlIEZvYXJkIChlbnRyb3B5QHdvcmxkLnN0ZC5jb20pLCB0byBhbGxvdyB1c2VyCisgICAgIHByb2Nlc3MgY29udHJvbCBvZiBTQ1NJIGRldmljZXMuCisgICAgRGV2ZWxvcG1lbnQgU3BvbnNvcmVkIGJ5IEtpbGx5IENvcnAuIE5ZIE5ZCisqLworCisjaWZuZGVmIF9TQ1NJX1NHX0gKKyNkZWZpbmUgX1NDU0lfU0dfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisKKy8qIE5ldyBpbnRlcmZhY2UgaW50cm9kdWNlZCBpbiB0aGUgMy54IFNHIGRyaXZlcnMgZm9sbG93cyAqLworCisvKiBTYW1lIHN0cnVjdHVyZSBhcyB1c2VkIGJ5IHJlYWR2KCkgTGludXggc3lzdGVtIGNhbGwuIEl0IGRlZmluZXMgb25lCisgICBzY2F0dGVyLWdhdGhlciBlbGVtZW50LiAqLwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW92ZWMKK3sKKyAgdm9pZCAqIGlvdl9iYXNlOyAgICAgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3MgICovCisgIHNpemVfdCBpb3ZfbGVuOyAgICAgICAgICAgICAvKiBMZW5ndGggaW4gYnl0ZXMgICovCit9IHNnX2lvdmVjX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9faGRyCit7CisgIGludCBpbnRlcmZhY2VfaWQ7ICAgICAgICAgICAvKiBbaV0gJ1MnIGZvciBTQ1NJIGdlbmVyaWMgKHJlcXVpcmVkKSAqLworICBpbnQgZHhmZXJfZGlyZWN0aW9uOyAgICAgICAgLyogW2ldIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICAqLworICB1bnNpZ25lZCBjaGFyIGNtZF9sZW47ICAgICAgLyogW2ldIFNDU0kgY29tbWFuZCBsZW5ndGggKCA8PSAxNiBieXRlcykgKi8KKyAgdW5zaWduZWQgY2hhciBteF9zYl9sZW47ICAgIC8qIFtpXSBtYXggbGVuZ3RoIHRvIHdyaXRlIHRvIHNicCAqLworICB1bnNpZ25lZCBzaG9ydCBpbnQgaW92ZWNfY291bnQ7IC8qIFtpXSAwIGltcGxpZXMgbm8gc2NhdHRlciBnYXRoZXIgKi8KKyAgdW5zaWduZWQgaW50IGR4ZmVyX2xlbjsgICAgIC8qIFtpXSBieXRlIGNvdW50IG9mIGRhdGEgdHJhbnNmZXIgKi8KKyAgdm9pZCAqIGR4ZmVycDsgICAgICAgICAgICAgIC8qIFtpXSwgWyppb10gcG9pbnRzIHRvIGRhdGEgdHJhbnNmZXIgbWVtb3J5CisJCQkJIG9yIHNjYXR0ZXIgZ2F0aGVyIGxpc3QgKi8KKyAgdW5zaWduZWQgY2hhciAqIGNtZHA7ICAgICAgIC8qIFtpXSwgWyppXSBwb2ludHMgdG8gY29tbWFuZCB0byBwZXJmb3JtICovCisgIHVuc2lnbmVkIGNoYXIgKiBzYnA7ICAgICAgICAvKiBbaV0sIFsqb10gcG9pbnRzIHRvIHNlbnNlX2J1ZmZlciBtZW1vcnkgKi8KKyAgdW5zaWduZWQgaW50IHRpbWVvdXQ7ICAgICAgIC8qIFtpXSBNQVhfVUlOVC0+bm8gdGltZW91dCAodW5pdDogbWlsbGlzZWMpICovCisgIHVuc2lnbmVkIGludCBmbGFnczsgICAgICAgICAvKiBbaV0gMCAtPiBkZWZhdWx0LCBzZWUgU0dfRkxBRy4uLiAqLworICBpbnQgcGFja19pZDsgICAgICAgICAgICAgICAgLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5IChub3JtYWxseSkgKi8KKyAgdm9pZCAqIHVzcl9wdHI7ICAgICAgICAgICAgIC8qIFtpLT5vXSB1bnVzZWQgaW50ZXJuYWxseSAqLworICB1bnNpZ25lZCBjaGFyIHN0YXR1czsgICAgICAgLyogW29dIHNjc2kgc3RhdHVzICovCisgIHVuc2lnbmVkIGNoYXIgbWFza2VkX3N0YXR1czsvKiBbb10gc2hpZnRlZCwgbWFza2VkIHNjc2kgc3RhdHVzICovCisgIHVuc2lnbmVkIGNoYXIgbXNnX3N0YXR1czsgICAvKiBbb10gbWVzc2FnaW5nIGxldmVsIGRhdGEgKG9wdGlvbmFsKSAqLworICB1bnNpZ25lZCBjaGFyIHNiX2xlbl93cjsgICAgLyogW29dIGJ5dGUgY291bnQgYWN0dWFsbHkgd3JpdHRlbiB0byBzYnAgKi8KKyAgdW5zaWduZWQgc2hvcnQgaW50IGhvc3Rfc3RhdHVzOyAvKiBbb10gZXJyb3JzIGZyb20gaG9zdCBhZGFwdGVyICovCisgIHVuc2lnbmVkIHNob3J0IGludCBkcml2ZXJfc3RhdHVzOy8qIFtvXSBlcnJvcnMgZnJvbSBzb2Z0d2FyZSBkcml2ZXIgKi8KKyAgaW50IHJlc2lkOyAgICAgICAgICAgICAgICAgIC8qIFtvXSBkeGZlcl9sZW4gLSBhY3R1YWxfdHJhbnNmZXJyZWQgKi8KKyAgdW5zaWduZWQgaW50IGR1cmF0aW9uOyAgICAgIC8qIFtvXSB0aW1lIHRha2VuIGJ5IGNtZCAodW5pdDogbWlsbGlzZWMpICovCisgIHVuc2lnbmVkIGludCBpbmZvOyAgICAgICAgICAvKiBbb10gYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCit9IHNnX2lvX2hkcl90OworCisKKy8qIFVzZSBuZWdhdGl2ZSB2YWx1ZXMgdG8gZmxhZyBkaWZmZXJlbmNlIGZyb20gb3JpZ2luYWwgc2dfaGVhZGVyIHN0cnVjdHVyZS4gICovCisjZGVmaW5lIFNHX0RYRkVSX05PTkUgLTEgICAgICAgIC8qIGUuZy4gYSBTQ1NJIFRlc3QgVW5pdCBSZWFkeSBjb21tYW5kICovCisjZGVmaW5lIFNHX0RYRkVSX1RPX0RFViAtMiAgICAgIC8qIGUuZy4gYSBTQ1NJIFdSSVRFIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0dfRFhGRVJfRlJPTV9ERVYgLTMgICAgLyogZS5nLiBhIFNDU0kgUkVBRCBjb21tYW5kICovCisjZGVmaW5lIFNHX0RYRkVSX1RPX0ZST01fREVWIC00IC8qIHRyZWF0ZWQgbGlrZSBTR19EWEZFUl9GUk9NX0RFViB3aXRoIHRoZQorCQkJCSAgIGFkZGl0aW9uYWwgcHJvcGVydHkgdGhhbiBkdXJpbmcgaW5kaXJlY3QKKwkJCQkgICBJTyB0aGUgdXNlciBidWZmZXIgaXMgY29waWVkIGludG8gdGhlCisJCQkJICAga2VybmVsIGJ1ZmZlcnMgYmVmb3JlIHRoZSB0cmFuc2ZlciAqLworCisKKy8qIGZvbGxvd2luZyBmbGFnIHZhbHVlcyBjYW4gYmUgIm9yIi1lZCB0b2dldGhlciAqLworI2RlZmluZSBTR19GTEFHX0RJUkVDVF9JTyAxICAgICAvKiBkZWZhdWx0IGlzIGluZGlyZWN0IElPICovCisjZGVmaW5lIFNHX0ZMQUdfTFVOX0lOSElCSVQgMiAgIC8qIGRlZmF1bHQgaXMgdG8gcHV0IGRldmljZSdzIGx1biBpbnRvICovCisJCQkJLyogdGhlIDJuZCBieXRlIG9mIFNDU0kgY29tbWFuZCAqLworI2RlZmluZSBTR19GTEFHX05PX0RYRkVSIDB4MTAwMDAgLyogbm8gdHJhbnNmZXIgb2Yga2VybmVsIGJ1ZmZlcnMgdG8vZnJvbSAqLworCQkJCS8qIHVzZXIgc3BhY2UgKGRlYnVnIGluZGlyZWN0IElPKSAqLworCisvKiBUaGUgZm9sbG93aW5nICdpbmZvJyB2YWx1ZXMgYXJlICJvciItZWQgdG9nZXRoZXIuICAqLworI2RlZmluZSBTR19JTkZPX09LX01BU0sJMHgxCisjZGVmaW5lIFNHX0lORk9fT0sJMHgwCS8qIG5vIHNlbnNlLCBob3N0IG5vciBkcml2ZXIgIm5vaXNlIiAqLworI2RlZmluZSBTR19JTkZPX0NIRUNLCTB4MSAgICAgLyogc29tZXRoaW5nIGFibm9ybWFsIGhhcHBlbmVkICovCisKKyNkZWZpbmUgU0dfSU5GT19ESVJFQ1RfSU9fTUFTSwkweDYKKyNkZWZpbmUgU0dfSU5GT19JTkRJUkVDVF9JTyAJMHgwCS8qIGRhdGEgeGZlciB2aWEga2VybmVsIGJ1ZmZlcnMgKG9yIG5vIHhmZXIpICovCisjZGVmaW5lIFNHX0lORk9fRElSRUNUX0lPIAkweDIJLyogZGlyZWN0IElPIHJlcXVlc3RlZCBhbmQgcGVyZm9ybWVkICovCisjZGVmaW5lIFNHX0lORk9fTUlYRURfSU8gCTB4NAkvKiBwYXJ0IGRpcmVjdCwgcGFydCBpbmRpcmVjdCBJTyAqLworCisKKy8qIFJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBTRyBkZXZpY2UsIHVzZWQgYnkKKyAgIFNHX0dFVF9TQ1NJX0lEIGlvY3RsICgpLiAgKi8KK3N0cnVjdCBzZ19zY3NpX2lkIHsKKyAgLyogSG9zdCBudW1iZXIgYXMgaW4gInNjc2k8bj4iIHdoZXJlICduJyBpcyBvbmUgb2YgMCwgMSwgMiBldGMuICAqLworICBpbnQgaG9zdF9ubzsKKyAgaW50IGNoYW5uZWw7CisgIC8qIFNDU0kgaWQgb2YgdGFyZ2V0IGRldmljZS4gICovCisgIGludCBzY3NpX2lkOworICBpbnQgbHVuOworICAvKiBUWVBFXy4uLiBkZWZpbmVkIGluIDxzY3NpL3Njc2kuaD4uICAqLworICBpbnQgc2NzaV90eXBlOworICAvKiBIb3N0IChhZGFwdGVyKSBtYXhpbXVtIGNvbW1hbmRzIHBlciBsdW4uICAqLworICBzaG9ydCBpbnQgaF9jbWRfcGVyX2x1bjsKKyAgLyogRGV2aWNlIChvciBhZGFwdGVyKSBtYXhpbXVtIHF1ZXVlIGxlbmd0aC4gICovCisgIHNob3J0IGludCBkX3F1ZXVlX2RlcHRoOworICAvKiBVbnVzZWQsIHNldCB0byAwIGZvciBub3cuICAqLworICBpbnQgdW51c2VkWzJdOworfTsKKworLyogVXNlZCBieSBTR19HRVRfUkVRVUVTVF9UQUJMRSBpb2N0bCgpLiAgKi8KK3R5cGVkZWYgc3RydWN0IHNnX3JlcV9pbmZvIHsKKyAgICBjaGFyIHJlcV9zdGF0ZTsgICAgIC8qIDAgLT4gbm90IHVzZWQsIDEgLT4gd3JpdHRlbiwgMiAtPiByZWFkeSB0byByZWFkICovCisgICAgY2hhciBvcnBoYW47ICAgICAgICAvKiAwIC0+IG5vcm1hbCByZXF1ZXN0LCAxIC0+IGZyb20gaW50ZXJydXBlZCBTR19JTyAqLworICAgIGNoYXIgc2dfaW9fb3duZWQ7ICAgLyogMCAtPiBjb21wbGV0ZSB3aXRoIHJlYWQoKSwgMSAtPiBvd25lZCBieSBTR19JTyAqLworICAgIGNoYXIgcHJvYmxlbTsgICAgICAgLyogMCAtPiBubyBwcm9ibGVtIGRldGVjdGVkLCAxIC0+IGVycm9yIHRvIHJlcG9ydCAqLworICAgIGludCBwYWNrX2lkOyAgICAgICAgLyogcGFja19pZCBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCAqLworICAgIHZvaWQgKiB1c3JfcHRyOyAgICAgLyogdXNlciBwcm92aWRlZCBwb2ludGVyIChpbiBuZXcgaW50ZXJmYWNlKSAqLworICAgIHVuc2lnbmVkIGludCBkdXJhdGlvbjsgLyogbWlsbGlzZWNzIGVsYXBzZWQgc2luY2Ugd3JpdHRlbiAocmVxX3N0YXRlPT0xKQorCQkJICAgICAgb3IgcmVxdWVzdCBkdXJhdGlvbiAocmVxX3N0YXRlPT0yKSAqLworICAgIGludCB1bnVzZWQ7Cit9IHNnX3JlcV9pbmZvX3Q7CisKKworLyogSU9DVExzOiBUaG9zZSBpb2N0bHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhlIFNHIDMueCBkcml2ZXJzIGZvbGxvdy4KKyBbVGhvc2UgdGhhdCBvbmx5IGFwcGx5IHRvIHRoZSBTRyAyLnggZHJpdmVycyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS5dCisgKF9HRVRfcyB5aWVsZCByZXN1bHQgdmlhICdpbnQgKicgM3JkIGFyZ3VtZW50IHVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkKSAqLworCisjZGVmaW5lIFNHX0VNVUxBVEVEX0hPU1QgMHgyMjAzIC8qIHRydWUgZm9yIGVtdWxhdGVkIGhvc3QgYWRhcHRlciAoQVRBUEkpICovCisKKy8qIFVzZWQgdG8gY29uZmlndXJlIFNDU0kgY29tbWFuZCB0cmFuc2Zvcm1hdGlvbiBsYXllciBmb3IgQVRBUEkgZGV2aWNlcyAqLworLyogT25seSBzdXBwb3J0ZWQgYnkgdGhlIGlkZS1zY3NpIGRyaXZlciAqLworI2RlZmluZSBTR19TRVRfVFJBTlNGT1JNIDB4MjIwNCAvKiBOLkIuIDNyZCBhcmcgaXMgbm90IHBvaW50ZXIgYnV0IHZhbHVlOiAqLworCQkgICAgICAvKiAzcmQgYXJnID0gMCB0byBkaXNhYmxlIHRyYW5zZm9ybSwgMSB0byBlbmFibGUgaXQgKi8KKyNkZWZpbmUgU0dfR0VUX1RSQU5TRk9STSAweDIyMDUKKworI2RlZmluZSBTR19TRVRfUkVTRVJWRURfU0laRSAweDIyNzUgIC8qIHJlcXVlc3QgYSBuZXcgcmVzZXJ2ZWQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgU0dfR0VUX1JFU0VSVkVEX1NJWkUgMHgyMjcyICAvKiBhY3R1YWwgc2l6ZSBvZiByZXNlcnZlZCBidWZmZXIgKi8KKworLyogVGhlIGZvbGxvd2luZyBpb2N0bCBoYXMgYSAnc2dfc2NzaV9pZF90IConIG9iamVjdCBhcyBpdHMgM3JkIGFyZ3VtZW50LiAqLworI2RlZmluZSBTR19HRVRfU0NTSV9JRCAweDIyNzYgICAvKiBZaWVsZHMgZmQncyBidXMsIGNoYW4sIGRldiwgbHVuICsgdHlwZSAqLworLyogU0NTSSBpZCBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBvYnRhaW5lZCBmcm9tIFNDU0lfSU9DVExfR0VUX0lETFVOICovCisKKy8qIE92ZXJyaWRlIGhvc3Qgc2V0dGluZyBhbmQgYWx3YXlzIERNQSB1c2luZyBsb3cgbWVtb3J5ICggPDE2TUIgb24gaTM4NikgKi8KKyNkZWZpbmUgU0dfU0VUX0ZPUkNFX0xPV19ETUEgMHgyMjc5ICAvKiAwLT4gdXNlIGFkYXB0ZXIgc2V0dGluZywgMS0+IGZvcmNlICovCisjZGVmaW5lIFNHX0dFVF9MT1dfRE1BIDB4MjI3YSAgIC8qIDAtPiB1c2UgYWxsIHJhbSBmb3IgZG1hOyAxLT4gbG93IGRtYSByYW0gKi8KKworLyogV2hlbiBTR19TRVRfRk9SQ0VfUEFDS19JRCBzZXQgdG8gMSwgcGFja19pZCBpcyBpbnB1dCB0byByZWFkKCkgd2hpY2gKKyAgIHRyaWVzIHRvIGZldGNoIGEgcGFja2V0IHdpdGggYSBtYXRjaGluZyBwYWNrX2lkLCB3YWl0cywgb3IgcmV0dXJucyBFQUdBSU4uCisgICBJZiBwYWNrX2lkIGlzIC0xIHRoZW4gcmVhZCBvbGRlc3Qgd2FpdGluZy4gV2hlbiAuLi5GT1JDRV9QQUNLX0lEIHNldCB0byAwCisgICB0aGVuIHBhY2tfaWQgaWdub3JlZCBieSByZWFkKCkgYW5kIG9sZGVzdCByZWFkYWJsZSBmZXRjaGVkLiAqLworI2RlZmluZSBTR19TRVRfRk9SQ0VfUEFDS19JRCAweDIyN2IKKyNkZWZpbmUgU0dfR0VUX1BBQ0tfSUQgMHgyMjdjIC8qIFlpZWxkcyBvbGRlc3QgcmVhZGFibGUgcGFja19pZCAob3IgLTEpICovCisKKyNkZWZpbmUgU0dfR0VUX05VTV9XQUlUSU5HIDB4MjI3ZCAvKiBOdW1iZXIgb2YgY29tbWFuZHMgYXdhaXRpbmcgcmVhZCgpICovCisKKy8qIFlpZWxkcyBtYXggc2NhdHRlciBnYXRoZXIgdGFibGVzaXplIGFsbG93ZWQgYnkgY3VycmVudCBob3N0IGFkYXB0ZXIgKi8KKyNkZWZpbmUgU0dfR0VUX1NHX1RBQkxFU0laRSAweDIyN0YgIC8qIDAgaW1wbGllcyBjYW4ndCBkbyBzY2F0dGVyIGdhdGhlciAqLworCisjZGVmaW5lIFNHX0dFVF9WRVJTSU9OX05VTSAweDIyODIgLyogRXhhbXBsZTogdmVyc2lvbiAyLjEuMzQgeWllbGRzIDIwMTM0ICovCisKKy8qIFJldHVybnMgLUVCVVNZIGlmIG9jY3VwaWVkLiAzcmQgYXJndW1lbnQgcG9pbnRlciB0byBpbnQgKHNlZSBuZXh0KSAqLworI2RlZmluZSBTR19TQ1NJX1JFU0VUIDB4MjI4NAorLyogQXNzb2NpYXRlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gU0dfU0NTSV9SRVNFVCBmb2xsb3cgKi8KKyNkZWZpbmUgU0dfU0NTSV9SRVNFVF9OT1RISU5HCTAKKyNkZWZpbmUgU0dfU0NTSV9SRVNFVF9ERVZJQ0UJMQorI2RlZmluZSBTR19TQ1NJX1JFU0VUX0JVUwkyCisjZGVmaW5lIFNHX1NDU0lfUkVTRVRfSE9TVAkzCisKKy8qIHN5bmNocm9ub3VzIFNDU0kgY29tbWFuZCBpb2N0bCwgKG9ubHkgaW4gdmVyc2lvbiAzIGludGVyZmFjZSkgKi8KKyNkZWZpbmUgU0dfSU8gMHgyMjg1ICAgLyogc2ltaWxhciBlZmZlY3QgYXMgd3JpdGUoKSBmb2xsb3dlZCBieSByZWFkKCkgKi8KKworI2RlZmluZSBTR19HRVRfUkVRVUVTVF9UQUJMRSAweDIyODYgICAvKiB5aWVsZHMgdGFibGUgb2YgYWN0aXZlIHJlcXVlc3RzICovCisKKy8qIEhvdyB0byB0cmVhdCBFSU5UUiBkdXJpbmcgU0dfSU8gaW9jdGwoKSwgb25seSBpbiBTRyAzLnggc2VyaWVzICovCisjZGVmaW5lIFNHX1NFVF9LRUVQX09SUEhBTiAweDIyODcgLyogMSAtPiBob2xkIGZvciByZWFkKCksIDAgLT4gZHJvcCAoZGVmKSAqLworI2RlZmluZSBTR19HRVRfS0VFUF9PUlBIQU4gMHgyMjg4CisKKworI2RlZmluZSBTR19TQ0FUVEVSX1NaICg4ICogNDA5NikgIC8qIFBBR0VfU0laRSBub3QgYXZhaWxhYmxlIHRvIHVzZXIgKi8KKy8qIExhcmdlc3Qgc2l6ZSAoaW4gYnl0ZXMpIGEgc2luZ2xlIHNjYXR0ZXItZ2F0aGVyIGxpc3QgZWxlbWVudCBjYW4gaGF2ZS4KKyAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMiBhbmQgPD0gKFBBR0VfU0laRSAqIDMyKSBbMTMxMDcyIGJ5dGVzIG9uCisgICBpMzg2XS4gVGhlIG1pbmltdW0gdmFsdWUgaXMgUEFHRV9TSVpFLiBJZiBzY2F0dGVyLWdhdGhlciBub3Qgc3VwcG9ydGVkCisgICBieSBhZGFwdGVyIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUgbGFyZ2VzdCBkYXRhIGJsb2NrIHRoYXQgY2FuIGJlCisgICByZWFkL3dyaXR0ZW4gYnkgYSBzaW5nbGUgc2NzaSBjb21tYW5kLiBUaGUgdXNlciBjYW4gZmluZCB0aGUgdmFsdWUgb2YKKyAgIFBBR0VfU0laRSBieSBjYWxsaW5nIGdldHBhZ2VzaXplKCkgZGVmaW5lZCBpbiB1bmlzdGQuaCAuICovCisKKyNkZWZpbmUgU0dfREVGQVVMVF9SRVRSSUVTIDEKKworLyogRGVmYXVsdHMsIGNvbW1lbnRlZCBpZiB0aGV5IGRpZmZlciBmcm9tIG9yaWdpbmFsIHNnIGRyaXZlciAqLworI2RlZmluZSBTR19ERUZfRk9SQ0VfTE9XX0RNQSAwICAvKiB3YXMgMSAtPiBtZW1vcnkgYmVsb3cgMTZNQiBvbiBpMzg2ICovCisjZGVmaW5lIFNHX0RFRl9GT1JDRV9QQUNLX0lEIDAKKyNkZWZpbmUgU0dfREVGX0tFRVBfT1JQSEFOIDAKKyNkZWZpbmUgU0dfREVGX1JFU0VSVkVEX1NJWkUgU0dfU0NBVFRFUl9TWiAvKiBsb2FkIHRpbWUgb3B0aW9uICovCisKKy8qIG1heGltdW0gb3V0c3RhbmRpbmcgcmVxdWVzdHMsIHdyaXRlKCkgeWllbGRzIEVET00gaWYgZXhjZWVkZWQgKi8KKyNkZWZpbmUgU0dfTUFYX1FVRVVFIDE2CisKKyNkZWZpbmUgU0dfQklHX0JVRkYgU0dfREVGX1JFU0VSVkVEX1NJWkUgICAgLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKworLyogQWx0ZXJuYXRlIHN0eWxlIHR5cGUgbmFtZXMsICIuLi5fdCIgdmFyaWFudHMgcHJlZmVycmVkICovCit0eXBlZGVmIHN0cnVjdCBzZ19pb19oZHIgU2dfaW9faGRyOwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9fdmVjIFNnX2lvX3ZlYzsKK3R5cGVkZWYgc3RydWN0IHNnX3Njc2lfaWQgU2dfc2NzaV9pZDsKK3R5cGVkZWYgc3RydWN0IHNnX3JlcV9pbmZvIFNnX3JlcV9pbmZvOworCisKKy8qIHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYgKi8KKy8qICAgVGhlIG9sZGVyIFNHIGludGVyZmFjZSBiYXNlZCBvbiB0aGUgJ3NnX2hlYWRlcicgc3RydWN0dXJlIGZvbGxvd3MuICAgKi8KKy8qIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4gKi8KKworI2RlZmluZSBTR19NQVhfU0VOU0UgMTYgICAvKiB0aGlzIG9ubHkgYXBwbGllcyB0byB0aGUgc2dfaGVhZGVyIGludGVyZmFjZSAqLworCitzdHJ1Y3Qgc2dfaGVhZGVyCisgeworICAgLyogTGVuZ3RoIG9mIGluY29taW5nIHBhY2tldCAoaW5jbHVkaW5nIGhlYWRlcikuICAqLworICAgaW50IHBhY2tfbGVuOworICAgLyogTWF4aW1hbCBsZW5ndGggb2YgZXhwZWN0ZWQgcmVwbHkuICAqLworICAgaW50IHJlcGx5X2xlbjsKKyAgIC8qIElkIG51bWJlciBvZiBwYWNrZXQuICAqLworICAgaW50IHBhY2tfaWQ7CisgICAvKiAwPT1vaywgb3RoZXJ3aXNlIGVycm9yIG51bWJlci4gICovCisgICBpbnQgcmVzdWx0OworICAgLyogRm9yY2UgMTIgYnl0ZSBjb21tYW5kIGxlbmd0aCBmb3IgZ3JvdXAgNiAmIDcgY29tbWFuZHMuICAqLworICAgdW5zaWduZWQgaW50IHR3ZWx2ZV9ieXRlOjE7CisgICAvKiBTQ1NJIHN0YXR1cyBmcm9tIHRhcmdldC4gICovCisgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X3N0YXR1czo1OworICAgLyogSG9zdCBzdGF0dXMgKHNlZSAiRElEIiBjb2RlcykuICAqLworICAgdW5zaWduZWQgaW50IGhvc3Rfc3RhdHVzOjg7CisgICAvKiBEcml2ZXIgc3RhdHVzK3N1Z2dlc3Rpb24uICAqLworICAgdW5zaWduZWQgaW50IGRyaXZlcl9zdGF0dXM6ODsKKyAgIC8qIFVudXNlZC4gICovCisgICB1bnNpZ25lZCBpbnQgb3RoZXJfZmxhZ3M6MTA7CisgICAvKiBPdXRwdXQgaW4gMyBjYXNlczoKKyAgICAgIHdoZW4gdGFyZ2V0X3N0YXR1cyBpcyBDSEVDS19DT05ESVRJT04gb3IKKyAgICAgIHdoZW4gdGFyZ2V0X3N0YXR1cyBpcyBDT01NQU5EX1RFUk1JTkFURUQgb3IKKyAgICAgIHdoZW4gKGRyaXZlcl9zdGF0dXMgJiBEUklWRVJfU0VOU0UpIGlzIHRydWUuICAqLworICAgdW5zaWduZWQgY2hhciBzZW5zZV9idWZmZXJbU0dfTUFYX1NFTlNFXTsKKyB9OworCisKKy8qIElPQ1RMczogVGhlIGZvbGxvd2luZyBhcmUgbm90IHJlcXVpcmVkIChvciBpZ25vcmVkKSB3aGVuIHRoZSBzZ19pb19oZHJfdAorCSAgIGludGVyZmFjZSBpcyB1c2VkLiBUaGV5IGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKKwkgICB0aGUgb3JpZ2luYWwgYW5kIHZlcnNpb24gMiBkcml2ZXJzLiAqLworCisjZGVmaW5lIFNHX1NFVF9USU1FT1VUCQkweDIyMDEJLyogU2V0IHRpbWVvdXQ7ICooaW50ICopYXJnPT10aW1lb3V0LiAgKi8KKyNkZWZpbmUgU0dfR0VUX1RJTUVPVVQJCTB4MjIwMgkvKiBHZXQgdGltZW91dDsgcmV0dXJuIHRpbWVvdXQuICAqLworCisvKiBHZXQvc2V0IGNvbW1hbmQgcXVldWluZyBzdGF0ZSBwZXIgZmQgKGRlZmF1bHQgaXMgU0dfREVGX0NPTU1BTkRfUSkuICovCisjZGVmaW5lIFNHX0dFVF9DT01NQU5EX1EJMHgyMjcwCS8qIFlpZWxkcyAwIChxdWV1aW5nIG9mZikgb3IgMSAob24pLiAgKi8KKyNkZWZpbmUgU0dfU0VUX0NPTU1BTkRfUSAJMHgyMjcxCS8qIENoYW5nZSBxdWV1aW5nIHN0YXRlIHdpdGggMCBvciAxLiAgKi8KKworLyogVHVybiBvbiBlcnJvciBzZW5zZSB0cmFjZSAoMS4uOCksIGR1bXAgdGhpcyBkZXZpY2UgdG8gbG9nL2NvbnNvbGUgKDkpCisgICBvciBkdW1wIGFsbCBzZyBkZXZpY2Ugc3RhdGVzICggPjkgKSB0byBsb2cvY29uc29sZS4gICovCisjZGVmaW5lIFNHX1NFVF9ERUJVRwkJMHgyMjdlCS8qIDAgLT4gdHVybiBvZmYgZGVidWcgKi8KKworI2RlZmluZSBTR19ORVhUX0NNRF9MRU4JCTB4MjI4MwkvKiBPdmVycmlkZSBTQ1NJIGNvbW1hbmQgbGVuZ3RoIHdpdGggZ2l2ZW4KKwkJCQkJICAgbnVtYmVyIG9uIHRoZSBuZXh0IHdyaXRlKCkgb24gdGhpcyBmaWxlCisJCQkJCSAgIGRlc2NyaXB0b3IuICAqLworCisvKiBEZWZhdWx0cywgY29tbWVudGVkIGlmIHRoZXkgZGlmZmVyIGZyb20gb3JpZ2luYWwgc2cgZHJpdmVyICovCisjZGVmaW5lIFNHX0RFRkFVTFRfVElNRU9VVCAoNjAqSFopIC8qIEhaID09ICdqaWZmaWVzIGluIDEgc2Vjb25kJyAqLworI2RlZmluZSBTR19ERUZfQ09NTUFORF9RIDAgICAgIC8qIGNvbW1hbmQgcXVldWluZyBpcyBhbHdheXMgb24gd2hlbgorCQkJCSAgdGhlIG5ldyBpbnRlcmZhY2UgaXMgdXNlZCAqLworI2RlZmluZSBTR19ERUZfVU5ERVJSVU5fRkxBRyAwCisKKworI2VuZGlmCS8qIHNjc2kvc2cuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zZWFyY2guaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VhcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmYmE2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VhcmNoLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgU3lzdGVtIFYgc3R5bGUgc2VhcmNoaW5nIGZ1bmN0aW9ucy4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TRUFSQ0hfSAorI2RlZmluZQlfU0VBUkNIX0ggMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK19fQkVHSU5fREVDTFMKKworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBQcm90b3R5cGUgc3RydWN0dXJlIGZvciBhIGxpbmtlZC1saXN0IGRhdGEgc3RydWN0dXJlLgorICAgVGhpcyBpcyB0aGUgdHlwZSB1c2VkIGJ5IHRoZSBgaW5zcXVlJyBhbmQgYHJlbXF1ZScgZnVuY3Rpb25zLiAgKi8KKworIyBpZmRlZiBfX1VTRV9HTlUKK3N0cnVjdCBxZWxlbQorICB7CisgICAgc3RydWN0IHFlbGVtICpxX2Zvcnc7CisgICAgc3RydWN0IHFlbGVtICpxX2JhY2s7CisgICAgY2hhciBxX2RhdGFbMV07CisgIH07CisjIGVuZGlmCisKKworLyogSW5zZXJ0IEVMRU0gaW50byBhIGRvdWJseS1saW5rZWQgbGlzdCwgYWZ0ZXIgUFJFVi4gICovCitleHRlcm4gdm9pZCBpbnNxdWUgKHZvaWQgKl9fZWxlbSwgdm9pZCAqX19wcmV2KSBfX1RIUk9XOworCisvKiBVbmxpbmsgRUxFTSBmcm9tIHRoZSBkb3VibHktbGlua2VkIGxpc3QgdGhhdCBpdCBpcyBpbi4gICovCitleHRlcm4gdm9pZCByZW1xdWUgKHZvaWQgKl9fZWxlbSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIEZvciB1c2Ugd2l0aCBoc2VhcmNoKDMpLiAgKi8KKyNpZm5kZWYgX19DT01QQVJfRk5fVAorIyBkZWZpbmUgX19DT01QQVJfRk5fVAordHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90KSAoX19jb25zdCB2b2lkICosIF9fY29uc3Qgdm9pZCAqKTsKKworIyBpZmRlZglfX1VTRV9HTlUKK3R5cGVkZWYgX19jb21wYXJfZm5fdCBjb21wYXJpc29uX2ZuX3Q7CisjIGVuZGlmCisjZW5kaWYKKworLyogQWN0aW9uIHdoaWNoIHNoYWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgY2FsbCB0aGUgaHNlYXJjaC4gICovCit0eXBlZGVmIGVudW0KKyAgeworICAgIEZJTkQsCisgICAgRU5URVIKKyAgfQorQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBlbnRyeQorICB7CisgICAgY2hhciAqa2V5OworICAgIHZvaWQgKmRhdGE7CisgIH0KK0VOVFJZOworCisvKiBPcGFxdWUgdHlwZSBmb3IgaW50ZXJuYWwgdXNlLiAgKi8KK3N0cnVjdCBfRU5UUlk7CisKKy8qIEZhbWlseSBvZiBoYXNoIHRhYmxlIGhhbmRsaW5nIGZ1bmN0aW9ucy4gIFRoZSBmdW5jdGlvbnMgYWxzbworICAgaGF2ZSByZWVudHJhbnQgY291bnRlcnBhcnRzIGVuZGluZyB3aXRoIF9yLiAgVGhlIG5vbi1yZWVudHJhbnQKKyAgIGZ1bmN0aW9ucyBhbGwgd29yayBvbiBhIHNpZ25sZSBpbnRlcm5hbCBoYXNoaW5nIHRhYmxlLiAgKi8KKworLyogU2VhcmNoIGZvciBlbnRyeSBtYXRjaGluZyBJVEVNLmtleSBpbiBpbnRlcm5hbCBoYXNoIHRhYmxlLiAgSWYKKyAgIEFDVElPTiBpcyBgRklORCcgcmV0dXJuIGZvdW5kIGVudHJ5IG9yIHNpZ25hbCBlcnJvciBieSByZXR1cm5pbmcKKyAgIE5VTEwuICBJZiBBQ1RJT04gaXMgYEVOVEVSJyByZXBsYWNlIGV4aXN0aW5nIGRhdGEgKGlmIGFueSkgd2l0aAorICAgSVRFTS5kYXRhLiAgKi8KK2V4dGVybiBFTlRSWSAqaHNlYXJjaCAoRU5UUlkgX19pdGVtLCBBQ1RJT04gX19hY3Rpb24pIF9fVEhST1c7CisKKy8qIENyZWF0ZSBhIG5ldyBoYXNoaW5nIHRhYmxlIHdoaWNoIHdpbGwgYXQgbW9zdCBjb250YWluIE5FTCBlbGVtZW50cy4gICovCitleHRlcm4gaW50IGhjcmVhdGUgKHNpemVfdCBfX25lbCkgX19USFJPVzsKKworLyogRGVzdHJveSBjdXJyZW50IGludGVybmFsIGhhc2hpbmcgdGFibGUuICAqLworZXh0ZXJuIHZvaWQgaGRlc3Ryb3kgKHZvaWQpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIERhdGEgdHlwZSBmb3IgcmVlbnRyYW50IGZ1bmN0aW9ucy4gICovCitzdHJ1Y3QgaHNlYXJjaF9kYXRhCisgIHsKKyAgICBzdHJ1Y3QgX0VOVFJZICp0YWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgZmlsbGVkOworICB9OworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgd2hpY2ggY2FuIGhhbmRsZSBtdWx0aXBsZSBoYXNoaW5nIHRhYmxlcyBhdCB0aGUKKyAgIHNhbWUgdGltZS4gICovCitleHRlcm4gaW50IGhzZWFyY2hfciAoRU5UUlkgX19pdGVtLCBBQ1RJT04gX19hY3Rpb24sIEVOVFJZICoqX19yZXR2YWwsCisJCSAgICAgIHN0cnVjdCBoc2VhcmNoX2RhdGEgKl9faHRhYikgX19USFJPVzsKK2V4dGVybiBpbnQgaGNyZWF0ZV9yIChzaXplX3QgX19uZWwsIHN0cnVjdCBoc2VhcmNoX2RhdGEgKl9faHRhYikgX19USFJPVzsKK2V4dGVybiB2b2lkIGhkZXN0cm95X3IgKHN0cnVjdCBoc2VhcmNoX2RhdGEgKl9faHRhYikgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFRoZSB0c2VhcmNoIHJvdXRpbmVzIGFyZSB2ZXJ5IGludGVyZXN0aW5nLiBUaGV5IG1ha2UgbWFueQorICAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNvbXBpbGVyLiAgSXQgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCBmaWVsZAorICAgaW4gbm9kZSBtdXN0IGJlIHRoZSAia2V5IiBmaWVsZCwgd2hpY2ggcG9pbnRzIHRvIHRoZSBkYXR1bS4KKyAgIEV2ZXJ5dGhpbmcgZGVwZW5kcyBvbiB0aGF0LiAgKi8KKy8qIEZvciB0c2VhcmNoICovCit0eXBlZGVmIGVudW0KK3sKKyAgcHJlb3JkZXIsCisgIHBvc3RvcmRlciwKKyAgZW5kb3JkZXIsCisgIGxlYWYKK30KK1ZJU0lUOworCisvKiBTZWFyY2ggZm9yIGFuIGVudHJ5IG1hdGNoaW5nIHRoZSBnaXZlbiBLRVkgaW4gdGhlIHRyZWUgcG9pbnRlZCB0bworICAgYnkgKlJPT1RQIGFuZCBpbnNlcnQgYSBuZXcgZWxlbWVudCBpZiBub3QgZm91bmQuICAqLworZXh0ZXJuIHZvaWQgKnRzZWFyY2ggKF9fY29uc3Qgdm9pZCAqX19rZXksIHZvaWQgKipfX3Jvb3RwLAorCQkgICAgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSBtYXRjaGluZyB0aGUgZ2l2ZW4gS0VZIGluIHRoZSB0cmVlIHBvaW50ZWQgdG8KKyAgIGJ5ICpST09UUC4gIElmIG5vIG1hdGNoaW5nIGVudHJ5IGlzIGF2YWlsYWJsZSByZXR1cm4gTlVMTC4gICovCitleHRlcm4gdm9pZCAqdGZpbmQgKF9fY29uc3Qgdm9pZCAqX19rZXksIHZvaWQgKl9fY29uc3QgKl9fcm9vdHAsCisJCSAgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKKworLyogUmVtb3ZlIHRoZSBlbGVtZW50IG1hdGNoaW5nIEtFWSBmcm9tIHRoZSB0cmVlIHBvaW50ZWQgdG8gYnkgKlJPT1RQLiAgKi8KK2V4dGVybiB2b2lkICp0ZGVsZXRlIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19rZXksCisJCSAgICAgIHZvaWQgKipfX3Jlc3RyaWN0IF9fcm9vdHAsCisJCSAgICAgIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCisjaWZuZGVmIF9fQUNUSU9OX0ZOX1QKKyMgZGVmaW5lIF9fQUNUSU9OX0ZOX1QKK3R5cGVkZWYgdm9pZCAoKl9fYWN0aW9uX2ZuX3QpIChfX2NvbnN0IHZvaWQgKl9fbm9kZXAsIFZJU0lUIF9fdmFsdWUsCisJCQkgICAgICAgaW50IF9fbGV2ZWwpOworI2VuZGlmCisKKy8qIFdhbGsgdGhyb3VnaCB0aGUgd2hvbGUgdHJlZSBhbmQgY2FsbCB0aGUgQUNUSU9OIGNhbGxiYWNrIGZvciBldmVyeSBub2RlCisgICBvciBsZWFmLiAgKi8KK2V4dGVybiB2b2lkIHR3YWxrIChfX2NvbnN0IHZvaWQgKl9fcm9vdCwgX19hY3Rpb25fZm5fdCBfX2FjdGlvbik7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENhbGxiYWNrIHR5cGUgZm9yIGZ1bmN0aW9uIHRvIGZyZWUgYSB0cmVlIG5vZGUuICBJZiB0aGUga2V5cyBhcmUgYXRvbWljCisgICBkYXRhIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGRvIG5vdGhpbmcuICAqLwordHlwZWRlZiB2b2lkICgqX19mcmVlX2ZuX3QpICh2b2lkICpfX25vZGVwKTsKKworLyogRGVzdHJveSB0aGUgd2hvbGUgdHJlZSwgY2FsbCBGUkVFRkNUIGZvciBlYWNoIG5vZGUgb3IgbGVhZi4gICovCitleHRlcm4gdm9pZCB0ZGVzdHJveSAodm9pZCAqX19yb290LCBfX2ZyZWVfZm5fdCBfX2ZyZWVmY3QpOworI2VuZGlmCisKKworLyogUGVyZm9ybSBsaW5lYXIgc2VhcmNoIGZvciBLRVkgYnkgY29tcGFyaW5nIGJ5IENPTVBBUiBpbiBhbiBhcnJheQorICAgW0JBU0UsQkFTRStOTUVNQipTSVpFKS4gICovCitleHRlcm4gdm9pZCAqbGZpbmQgKF9fY29uc3Qgdm9pZCAqX19rZXksIF9fY29uc3Qgdm9pZCAqX19iYXNlLAorCQkgICAgc2l6ZV90ICpfX25tZW1iLCBzaXplX3QgX19zaXplLCBfX2NvbXBhcl9mbl90IF9fY29tcGFyKTsKKworLyogUGVyZm9ybSBsaW5lYXIgc2VhcmNoIGZvciBLRVkgYnkgY29tcGFyaW5nIGJ5IENPTVBBUiBmdW5jdGlvbiBpbgorICAgYXJyYXkgW0JBU0UsQkFTRStOTUVNQipTSVpFKSBhbmQgaW5zZXJ0IGVudHJ5IGlmIG5vdCBmb3VuZC4gICovCitleHRlcm4gdm9pZCAqbHNlYXJjaCAoX19jb25zdCB2b2lkICpfX2tleSwgdm9pZCAqX19iYXNlLAorCQkgICAgICBzaXplX3QgKl9fbm1lbWIsIHNpemVfdCBfX3NpemUsIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc2VhcmNoLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2VtYXBob3JlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTM3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NlbWFwaG9yZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU0VNQVBIT1JFX0gKKyNkZWZpbmUgX1NFTUFQSE9SRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgX19VU0VfWE9QRU4ySworIyBkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisvKiBHZXQgdGhlIGRlZmluaXRpb24gZm9yIHNlbV90LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NlbWFwaG9yZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogSW5pdGlhbGl6ZSBzZW1hcGhvcmUgb2JqZWN0IFNFTSB0byBWQUxVRS4gIElmIFBTSEFSRUQgdGhlbiBzaGFyZSBpdAorICAgd2l0aCBvdGhlciBwcm9jZXNzZXMuICAqLworZXh0ZXJuIGludCBzZW1faW5pdCAoc2VtX3QgKl9fc2VtLCBpbnQgX19wc2hhcmVkLCB1bnNpZ25lZCBpbnQgX192YWx1ZSkKKyAgICAgX19USFJPVzsKKy8qIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBzZW1hcGhvcmUgb2JqZWN0IFNFTS4gICovCitleHRlcm4gaW50IHNlbV9kZXN0cm95IChzZW1fdCAqX19zZW0pIF9fVEhST1c7CisKKy8qIE9wZW4gYSBuYW1lZCBzZW1hcGhvcmUgTkFNRSB3aXRoIG9wZW4gZmxhZ3MgT0ZMQUcuICAqLworZXh0ZXJuIHNlbV90ICpzZW1fb3BlbiAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX29mbGFnLCAuLi4pIF9fVEhST1c7CisKKy8qIENsb3NlIGRlc2NyaXB0b3IgZm9yIG5hbWVkIHNlbWFwaG9yZSBTRU0uICAqLworZXh0ZXJuIGludCBzZW1fY2xvc2UgKHNlbV90ICpfX3NlbSkgX19USFJPVzsKKworLyogUmVtb3ZlIG5hbWVkIHNlbWFwaG9yZSBOQU1FLiAgKi8KK2V4dGVybiBpbnQgc2VtX3VubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKy8qIFdhaXQgZm9yIFNFTSBiZWluZyBwb3N0ZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZW1fd2FpdCAoc2VtX3QgKl9fc2VtKTsKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIFNpbWlsYXIgdG8gYHNlbV93YWl0JyBidXQgd2FpdCBvbmx5IHVudGlsIEFCU1RJTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzZW1fdGltZWR3YWl0IChzZW1fdCAqX19yZXN0cmljdCBfX3NlbSwKKwkJCSAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX19hYnN0aW1lKTsKKyNlbmRpZgorCisvKiBUZXN0IHdoZXRoZXIgU0VNIGlzIHBvc3RlZC4gICovCitleHRlcm4gaW50IHNlbV90cnl3YWl0IChzZW1fdCAqX19zZW0pIF9fVEhST1c7CisKKy8qIFBvc3QgU0VNLiAgKi8KK2V4dGVybiBpbnQgc2VtX3Bvc3QgKHNlbV90ICpfX3NlbSkgX19USFJPVzsKKworLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgU0VNIGFuZCBzdG9yZSBpdCBpbiAqU1ZBTC4gICovCitleHRlcm4gaW50IHNlbV9nZXR2YWx1ZSAoc2VtX3QgKl9fcmVzdHJpY3QgX19zZW0sIGludCAqX19yZXN0cmljdCBfX3N2YWwpCisgICAgIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIHNlbWFwaG9yZS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NldGptcC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zZXRqbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjEwMzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zZXRqbXAuaApAQCAtMCwwICsxLDExNiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTksIDIwMDEsIDIwMDIsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjEzIE5vbmxvY2FsIGp1bXBzCTxzZXRqbXAuaD4KKyAqLworCisjaWZuZGVmCV9TRVRKTVBfSAorI2RlZmluZQlfU0VUSk1QX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy9zZXRqbXAuaD4JCS8qIEdldCBgX19qbXBfYnVmJy4gICovCisjaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4JCS8qIEdldCBgX19zaWdzZXRfdCcuICAqLworCisKKy8qIENhbGxpbmcgZW52aXJvbm1lbnQsIHBsdXMgcG9zc2libHkgYSBzYXZlZCBzaWduYWwgbWFzay4gICovCitzdHJ1Y3QgX19qbXBfYnVmX3RhZworICB7CisgICAgLyogTk9URTogVGhlIG1hY2hpbmUtZGVwZW5kZW50IGRlZmluaXRpb25zIG9mIGBfX3NpZ3NldGptcCcKKyAgICAgICBhc3N1bWUgdGhhdCBhIGBqbXBfYnVmJyBiZWdpbnMgd2l0aCBhIGBfX2ptcF9idWYnIGFuZCB0aGF0CisgICAgICAgYF9fbWFza193YXNfc2F2ZWQnIGZvbGxvd3MgaXQuICBEbyBub3QgbW92ZSB0aGVzZSBtZW1iZXJzCisgICAgICAgb3IgYWRkIG90aGVycyBiZWZvcmUgaXQuICAqLworICAgIF9fam1wX2J1ZiBfX2ptcGJ1ZjsJCS8qIENhbGxpbmcgZW52aXJvbm1lbnQuICAqLworICAgIGludCBfX21hc2tfd2FzX3NhdmVkOwkvKiBTYXZlZCB0aGUgc2lnbmFsIG1hc2s/ICAqLworICAgIF9fc2lnc2V0X3QgX19zYXZlZF9tYXNrOwkvKiBTYXZlZCBzaWduYWwgbWFzay4gICovCisgIH07CisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1Zl90YWcgam1wX2J1ZlsxXTsKKworLyogU3RvcmUgdGhlIGNhbGxpbmcgZW52aXJvbm1lbnQgaW4gRU5WLCBhbHNvIHNhdmluZyB0aGUgc2lnbmFsIG1hc2suCisgICBSZXR1cm4gMC4gICovCitleHRlcm4gaW50IHNldGptcCAoam1wX2J1ZiBfX2VudikgX19USFJPVzsKKworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIGFsc28gc2F2aW5nIHRoZQorICAgc2lnbmFsIG1hc2sgaWYgU0FWRU1BU0sgaXMgbm9uemVyby4gIFJldHVybiAwLgorICAgVGhpcyBpcyB0aGUgaW50ZXJuYWwgbmFtZSBmb3IgYHNpZ3NldGptcCcuICAqLworZXh0ZXJuIGludCBfX3NpZ3NldGptcCAoc3RydWN0IF9fam1wX2J1Zl90YWcgX19lbnZbMV0sIGludCBfX3NhdmVtYXNrKSBfX1RIUk9XOworCisjaWZuZGVmCV9fRkFWT1JfQlNECisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIG5vdCBzYXZpbmcgdGhlIHNpZ25hbCBtYXNrLgorICAgUmV0dXJuIDAuICAqLworZXh0ZXJuIGludCBfc2V0am1wIChzdHJ1Y3QgX19qbXBfYnVmX3RhZyBfX2VudlsxXSkgX19USFJPVzsKKworLyogRG8gbm90IHNhdmUgdGhlIHNpZ25hbCBtYXNrLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBgX3NldGptcCcKKyAgIEJTRCBmdW5jdGlvbi4gICovCisjIGRlZmluZSBzZXRqbXAoZW52KQlfc2V0am1wIChlbnYpCisjZWxzZQorLyogV2UgYXJlIGluIDQuMyBCU0QtY29tcGF0aWJpbGl0eSBtb2RlIGluIHdoaWNoIGBzZXRqbXAnCisgICBzYXZlcyB0aGUgc2lnbmFsIG1hc2sgbGlrZSBgc2lnc2V0am1wIChFTlYsIDEpJy4gIFdlIGhhdmUgdG8KKyAgIGRlZmluZSBhIG1hY3JvIHNpbmNlIElTTyBDIHNheXMgYHNldGptcCcgaXMgb25lLiAgKi8KKyMgZGVmaW5lIHNldGptcChlbnYpCXNldGptcCAoZW52KQorI2VuZGlmIC8qIEZhdm9yIEJTRC4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisKKy8qIEp1bXAgdG8gdGhlIGVudmlyb25tZW50IHNhdmVkIGluIEVOViwgbWFraW5nIHRoZQorICAgYHNldGptcCcgY2FsbCB0aGVyZSByZXR1cm4gVkFMLCBvciAxIGlmIFZBTCBpcyAwLiAgKi8KK2V4dGVybiB2b2lkIGxvbmdqbXAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBTYW1lLiAgVXN1YWxseSBgX2xvbmdqbXAnIGlzIHVzZWQgd2l0aCBgX3NldGptcCcsIHdoaWNoIGRvZXMgbm90IHNhdmUKKyAgIHRoZSBzaWduYWwgbWFzay4gIEJ1dCBpdCBpcyBob3cgRU5WIHdhcyBzYXZlZCB0aGF0IGRldGVybWluZXMgd2hldGhlcgorICAgYGxvbmdqbXAnIHJlc3RvcmVzIHRoZSBtYXNrOyBgX2xvbmdqbXAnIGlzIGp1c3QgYW4gYWxpYXMuICAqLworZXh0ZXJuIHZvaWQgX2xvbmdqbXAgKHN0cnVjdCBfX2ptcF9idWZfdGFnIF9fZW52WzFdLCBpbnQgX192YWwpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworI2VuZGlmCisKKworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBVc2UgdGhlIHNhbWUgdHlwZSBmb3IgYGptcF9idWYnIGFuZCBgc2lnam1wX2J1ZicuCisgICBUaGUgYF9fbWFza193YXNfc2F2ZWQnIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyCisgICBvciBub3QgYGxvbmdqbXAnIHdpbGwgcmVzdG9yZSB0aGUgc2lnbmFsIG1hc2suICAqLwordHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmX3RhZyBzaWdqbXBfYnVmWzFdOworCisvKiBTdG9yZSB0aGUgY2FsbGluZyBlbnZpcm9ubWVudCBpbiBFTlYsIGFsc28gc2F2aW5nIHRoZQorICAgc2lnbmFsIG1hc2sgaWYgU0FWRU1BU0sgaXMgbm9uemVyby4gIFJldHVybiAwLiAgKi8KKyMgZGVmaW5lIHNpZ3NldGptcChlbnYsIHNhdmVtYXNrKQlfX3NpZ3NldGptcCAoZW52LCBzYXZlbWFzaykKKworLyogSnVtcCB0byB0aGUgZW52aXJvbm1lbnQgc2F2ZWQgaW4gRU5WLCBtYWtpbmcgdGhlCisgICBzaWdzZXRqbXAgY2FsbCB0aGVyZSByZXR1cm4gVkFMLCBvciAxIGlmIFZBTCBpcyAwLgorICAgUmVzdG9yZSB0aGUgc2lnbmFsIG1hc2sgaWYgdGhhdCBzaWdzZXRqbXAgY2FsbCBzYXZlZCBpdC4KKyAgIFRoaXMgaXMganVzdCBhbiBhbGlhcyBgbG9uZ2ptcCcuICAqLworZXh0ZXJuIHZvaWQgc2lnbG9uZ2ptcCAoc2lnam1wX2J1ZiBfX2VudiwgaW50IF9fdmFsKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKyNlbmRpZiAvKiBVc2UgUE9TSVguICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc2V0am1wLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NndHR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NndHR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyYmM0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2d0dHkuaApAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NHVFRZX0gKKyNkZWZpbmUJX1NHVFRZX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisvKiBPbiBzb21lIHN5c3RlbXMgdGhpcyB0eXBlIGlzIG5vdCBkZWZpbmVkIGJ5IDxiaXRzL2lvY3RsLXR5cGVzLmg+OworICAgaW4gdGhhdCBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBqdXN0IHN0dWJzIHRoYXQgcmV0dXJuIEVOT1NZUy4gICovCitzdHJ1Y3Qgc2d0dHliOworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEZpbGwgaW4gKlBBUkFNUyB3aXRoIHRlcm1pbmFsIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgZ3R0eSAoaW50IF9fZmQsIHN0cnVjdCBzZ3R0eWIgKl9fcGFyYW1zKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIHRlcm1pbmFsIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIEZEIHRvICpQQVJBTVMuICAqLworZXh0ZXJuIGludCBzdHR5IChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3Qgc2d0dHliICpfX3BhcmFtcykgX19USFJPVzsKKworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc2d0dHkuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc2hhZG93LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NoYWRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGRmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3NoYWRvdy5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIERlY2xhcmF0aW9uIG9mIHR5cGVzIGFuZCBmdW5jdGlvbnMgZm9yIHNoYWRvdyBwYXNzd29yZCBzdWl0ZS4gICovCisKKyNpZm5kZWYgX1NIQURPV19ICisjZGVmaW5lIF9TSEFET1dfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8cGF0aHMuaD4KKworI2RlZmluZQlfX25lZWRfRklMRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogUGF0aHMgdG8gdGhlIHVzZXIgZGF0YWJhc2UgZmlsZXMuICAqLworI2RlZmluZQlTSEFET1cgX1BBVEhfU0hBRE9XCisKKworX19CRUdJTl9ERUNMUworCisvKiBTdHJ1Y3R1cmUgb2YgdGhlIHBhc3N3b3JkIGZpbGUuICAqLworc3RydWN0IHNwd2QKKyAgeworICAgIGNoYXIgKnNwX25hbXA7CQkvKiBMb2dpbiBuYW1lLiAgKi8KKyAgICBjaGFyICpzcF9wd2RwOwkJLyogRW5jcnlwdGVkIHBhc3N3b3JkLiAgKi8KKyAgICBsb25nIGludCBzcF9sc3RjaGc7CQkvKiBEYXRlIG9mIGxhc3QgY2hhbmdlLiAgKi8KKyAgICBsb25nIGludCBzcF9taW47CQkvKiBNaW5pbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gY2hhbmdlcy4gICovCisgICAgbG9uZyBpbnQgc3BfbWF4OwkJLyogTWF4aW11bSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGNoYW5nZXMuICAqLworICAgIGxvbmcgaW50IHNwX3dhcm47CQkvKiBOdW1iZXIgb2YgZGF5cyB0byB3YXJuIHVzZXIgdG8gY2hhbmdlCisJCQkJICAgdGhlIHBhc3N3b3JkLiAgKi8KKyAgICBsb25nIGludCBzcF9pbmFjdDsJCS8qIE51bWJlciBvZiBkYXlzIHRoZSBhY2NvdW50IG1heSBiZQorCQkJCSAgIGluYWN0aXZlLiAgKi8KKyAgICBsb25nIGludCBzcF9leHBpcmU7CQkvKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSAxOTcwLTAxLTAxIHVudGlsCisJCQkJICAgYWNjb3VudCBleHBpcmVzLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBzcF9mbGFnOwkvKiBSZXNlcnZlZC4gICovCisgIH07CisKKworLyogT3BlbiBkYXRhYmFzZSBmb3IgcmVhZGluZy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0c3BlbnQgKHZvaWQpOworCisvKiBDbG9zZSBkYXRhYmFzZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgZW5kc3BlbnQgKHZvaWQpOworCisvKiBHZXQgbmV4dCBlbnRyeSBmcm9tIGRhdGFiYXNlLCBwZXJoYXBzIGFmdGVyIG9wZW5pbmcgdGhlIGZpbGUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqZ2V0c3BlbnQgKHZvaWQpOworCisvKiBHZXQgc2hhZG93IGVudHJ5IG1hdGNoaW5nIE5BTUUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqZ2V0c3BuYW0gKF9fY29uc3QgY2hhciAqX19uYW1lKTsKKworLyogUmVhZCBzaGFkb3cgZW50cnkgZnJvbSBTVFJJTkcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc3B3ZCAqc2dldHNwZW50IChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nKTsKKworLyogUmVhZCBuZXh0IHNoYWRvdyBlbnRyeSBmcm9tIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCBzcHdkICpmZ2V0c3BlbnQgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgbGluZSBjb250YWluaW5nIHNoYWRvdyBwYXNzd29yZCBlbnRyeSB0byBzdHJlYW0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHV0c3BlbnQgKF9fY29uc3Qgc3RydWN0IHNwd2QgKl9fcCwgRklMRSAqX19zdHJlYW0pOworCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGV5IGFyZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0c3BlbnRfciAoc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwgY2hhciAqX19idWZmZXIsCisJCSAgICAgICBzaXplX3QgX19idWZsZW4sIHN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IGdldHNwbmFtX3IgKF9fY29uc3QgY2hhciAqX19uYW1lLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLAorCQkgICAgICAgY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJICAgICAgIHN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IHNnZXRzcGVudF9yIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzdHJ1Y3Qgc3B3ZCAqX19yZXN1bHRfYnVmLAorCQkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJCXN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworCitleHRlcm4gaW50IGZnZXRzcGVudF9yIChGSUxFICpfX3N0cmVhbSwgc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwKKwkJCWNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCQlzdHJ1Y3Qgc3B3ZCAqKl9fcmVzdWx0KTsKKyNlbmRpZgkvKiBtaXNjICovCisKKworLyogVGhlIHNpbXBsZSBsb2NraW5nIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgaGVyZSBpcyBub3Qgc3VpdGFibGUgZm9yCisgICBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuICAqLworCisvKiBQcm90ZWN0IHBhc3N3b3JkIGZpbGUgYWdhaW5zdCBtdWx0aSB3cml0ZXJzLiAgKi8KK2V4dGVybiBpbnQgbGNrcHdkZiAodm9pZCkgX19USFJPVzsKKworLyogVW5sb2NrIHBhc3N3b3JkIGZpbGUuICAqLworZXh0ZXJuIGludCB1bGNrcHdkZiAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHNoYWRvdy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NpZ25hbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTIxMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zaWduYWwuaApAQCAtMCwwICsxLDQwNCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLTIwMDMsIDIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjE0IFNpZ25hbCBoYW5kbGluZyA8c2lnbmFsLmg+CisgKi8KKworI2lmbmRlZglfU0lHTkFMX0gKKworI2lmICFkZWZpbmVkIF9fbmVlZF9zaWdfYXRvbWljX3QgJiYgIWRlZmluZWQgX19uZWVkX3NpZ3NldF90CisjIGRlZmluZSBfU0lHTkFMX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4JCS8qIF9fc2lnc2V0X3QsIF9fc2lnX2F0b21pY190LiAgKi8KKworLyogQW4gaW50ZWdyYWwgdHlwZSB0aGF0IGNhbiBiZSBtb2RpZmllZCBhdG9taWNhbGx5LCB3aXRob3V0IHRoZQorICAgcG9zc2liaWxpdHkgb2YgYSBzaWduYWwgYXJyaXZpbmcgaW4gdGhlIG1pZGRsZSBvZiB0aGUgb3BlcmF0aW9uLiAgKi8KKyNpZiBkZWZpbmVkIF9fbmVlZF9zaWdfYXRvbWljX3QgfHwgZGVmaW5lZCBfU0lHTkFMX0gKKyMgaWZuZGVmIF9fc2lnX2F0b21pY190X2RlZmluZWQKKyMgIGRlZmluZSBfX3NpZ19hdG9taWNfdF9kZWZpbmVkCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKK3R5cGVkZWYgX19zaWdfYXRvbWljX3Qgc2lnX2F0b21pY190OworX19FTkRfTkFNRVNQQUNFX1NURAorIyBlbmRpZgorIyB1bmRlZiBfX25lZWRfc2lnX2F0b21pY190CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19uZWVkX3NpZ3NldF90IHx8IChkZWZpbmVkIF9TSUdOQUxfSCAmJiBkZWZpbmVkIF9fVVNFX1BPU0lYKQorIyBpZm5kZWYgX19zaWdzZXRfdF9kZWZpbmVkCisjICBkZWZpbmUgX19zaWdzZXRfdF9kZWZpbmVkCit0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7CisjIGVuZGlmCisjIHVuZGVmIF9fbmVlZF9zaWdzZXRfdAorI2VuZGlmCisKKyNpZmRlZiBfU0lHTkFMX0gKKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3NpZ251bS5oPgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorI2VuZGlmCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgZW5kaWYKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFVuaXg5OCAqLworCisKKy8qIFR5cGUgb2YgYSBzaWduYWwgaGFuZGxlci4gICovCit0eXBlZGVmIHZvaWQgKCpfX3NpZ2hhbmRsZXJfdCkgKGludCk7CisKKy8qIFRoZSBYL09wZW4gZGVmaW5pdGlvbiBvZiBgc2lnbmFsJyBzcGVjaWZpZXMgdGhlIFNWSUQgc2VtYW50aWMuICBVc2UKKyAgIHRoZSBhZGRpdGlvbmFsIGZ1bmN0aW9uIGBzeXN2X3NpZ25hbCcgd2hlbiBYL09wZW4gY29tcGF0aWJpbGl0eSBpcworICAgcmVxdWVzdGVkLiAgKi8KK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBfX3N5c3Zfc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKKyNpZmRlZiBfX1VTRV9HTlUKK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBzeXN2X3NpZ25hbCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2hhbmRsZXIpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworLyogU2V0IHRoZSBoYW5kbGVyIGZvciB0aGUgc2lnbmFsIFNJRyB0byBIQU5ETEVSLCByZXR1cm5pbmcgdGhlIG9sZAorICAgaGFuZGxlciwgb3IgU0lHX0VSUiBvbiBlcnJvci4KKyAgIEJ5IGRlZmF1bHQgYHNpZ25hbCcgaGFzIHRoZSBCU0Qgc2VtYW50aWMuICAqLworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZkZWYgX19VU0VfQlNECitleHRlcm4gX19zaWdoYW5kbGVyX3Qgc2lnbmFsIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlcikKKyAgICAgX19USFJPVzsKKyNlbHNlCisvKiBNYWtlIHN1cmUgdGhlIHVzZWQgYHNpZ25hbCcgaW1wbGVtZW50YXRpb24gaXMgdGhlIFNWSUQgdmVyc2lvbi4gKi8KKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBfX1JFRElSRUNUX05USCAoc2lnbmFsLAorCQkJCSAgICAgIChpbnQgX19zaWcsIF9fc2lnaGFuZGxlcl90IF9faGFuZGxlciksCisJCQkJICAgICAgX19zeXN2X3NpZ25hbCk7CisjIGVsc2UKKyMgIGRlZmluZSBzaWduYWwgX19zeXN2X3NpZ25hbAorIyBlbmRpZgorI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogVGhlIFgvT3BlbiBkZWZpbml0aW9uIG9mIGBzaWduYWwnIGNvbmZsaWN0cyB3aXRoIHRoZSBCU0QgdmVyc2lvbi4KKyAgIFNvIHRoZXkgZGVmaW5lZCBhbm90aGVyIGZ1bmN0aW9uIGBic2Rfc2lnbmFsJy4gICovCitleHRlcm4gX19zaWdoYW5kbGVyX3QgYnNkX3NpZ25hbCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2hhbmRsZXIpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworLyogU2VuZCBzaWduYWwgU0lHIHRvIHByb2Nlc3MgbnVtYmVyIFBJRC4gIElmIFBJRCBpcyB6ZXJvLAorICAgc2VuZCBTSUcgdG8gYWxsIHByb2Nlc3NlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzJ3MgcHJvY2VzcyBncm91cC4KKyAgIElmIFBJRCBpcyA8IC0xLCBzZW5kIFNJRyB0byBhbGwgcHJvY2Vzc2VzIGluIHByb2Nlc3MgZ3JvdXAgLSBQSUQuICAqLworI2lmZGVmIF9fVVNFX1BPU0lYCitleHRlcm4gaW50IGtpbGwgKF9fcGlkX3QgX19waWQsIGludCBfX3NpZykgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgUE9TSVguICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogU2VuZCBTSUcgdG8gYWxsIHByb2Nlc3NlcyBpbiBwcm9jZXNzIGdyb3VwIFBHUlAuCisgICBJZiBQR1JQIGlzIHplcm8sIHNlbmQgU0lHIHRvIGFsbCBwcm9jZXNzZXMgaW4KKyAgIHRoZSBjdXJyZW50IHByb2Nlc3MncyBwcm9jZXNzIGdyb3VwLiAgKi8KK2V4dGVybiBpbnQga2lsbHBnIChfX3BpZF90IF9fcGdycCwgaW50IF9fc2lnKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuIFVuaXguICAqLworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJhaXNlIHNpZ25hbCBTSUcsIGkuZS4sIHNlbmQgU0lHIHRvIHlvdXJzZWxmLiAgKi8KK2V4dGVybiBpbnQgcmFpc2UgKGludCBfX3NpZykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX1NWSUQKKy8qIFNWSUQgbmFtZXMgZm9yIHRoZSBzYW1lIHRoaW5ncy4gICovCitleHRlcm4gX19zaWdoYW5kbGVyX3Qgc3NpZ25hbCAoaW50IF9fc2lnLCBfX3NpZ2hhbmRsZXJfdCBfX2hhbmRsZXIpCisgICAgIF9fVEhST1c7CitleHRlcm4gaW50IGdzaWduYWwgKGludCBfX3NpZykgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgU1ZJRC4gICovCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBQcmludCBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbWVhbmluZyBvZiB0aGUgZ2l2ZW4gc2lnbmFsIG51bWJlci4gICovCitleHRlcm4gdm9pZCBwc2lnbmFsIChpbnQgX19zaWcsIF9fY29uc3QgY2hhciAqX19zKTsKKyNlbmRpZiAvKiBVc2UgbWlzYy4gICovCisKKworLyogVGhlIGBzaWdwYXVzZScgZnVuY3Rpb24gaGFzIHR3byBkaWZmZXJlbnQgaW50ZXJmYWNlcy4gIFRoZSBvcmlnaW5hbAorICAgQlNEIGRlZmluaXRpb24gZGVmaW5lcyB0aGUgYXJndW1lbnQgYXMgYSBtYXNrIG9mIHRoZSBzaWduYWwsIHdoaWxlCisgICB0aGUgbW9yZSBtb2Rlcm4gaW50ZXJmYWNlIGluIFgvT3BlbiBkZWZpbmVzIGl0IGFzIHRoZSBzaWduYWwKKyAgIG51bWJlci4gIFdlIGdvIHdpdGggdGhlIEJTRCB2ZXJzaW9uIHVubGVzcyB0aGUgdXNlciBleHBsaWNpdGx5CisgICBzZWxlY3RzIHRoZSBYL09wZW4gdmVyc2lvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IF9fc2lncGF1c2UgKGludCBfX3NpZ19vcl9tYXNrLCBpbnQgX19pc19zaWcpOworCisjaWZkZWYgX19GQVZPUl9CU0QKKy8qIFNldCB0aGUgbWFzayBvZiBibG9ja2VkIHNpZ25hbHMgdG8gTUFTSywKKyAgIHdhaXQgZm9yIGEgc2lnbmFsIHRvIGFycml2ZSwgYW5kIHRoZW4gcmVzdG9yZSB0aGUgbWFzay4gICovCitleHRlcm4gaW50IHNpZ3BhdXNlIChpbnQgX19tYXNrKSBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKyNlbHNlCisjIGlmZGVmIF9fVVNFX1hPUEVOCisjICBpZmRlZiBfX0dOVUNfXworZXh0ZXJuIGludCBzaWdwYXVzZSAoaW50IF9fc2lnKSBfX2FzbV9fICgiX194cGdfc2lncGF1c2UiKTsKKyMgIGVsc2UKKy8qIFJlbW92ZSBhIHNpZ25hbCBmcm9tIHRoZSBzaWduYWwgbWFzayBhbmQgc3VzcGVuZCB0aGUgcHJvY2Vzcy4gICovCisjICAgZGVmaW5lIHNpZ3BhdXNlKHNpZykgX19zaWdwYXVzZSAoKHNpZyksIDEpCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogTm9uZSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBhbnltb3JlLiAgVGhleSBhcmUgaGVyZQorICAgb25seSBmb3IgY29tcGF0aWJpbGl0eS4gIEEgc2luZ2xlIHdvcmQgKGBpbnQnKSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZQorICAgZW5vdWdoIHRvIGhvbGQgYSBjb21wbGV0ZSBzaWduYWwgbWFzayBhbmQgdGhlcmVmb3JlIHRoZXNlIGZ1bmN0aW9ucworICAgc2ltcGx5IGRvIG5vdCB3b3JrIGluIG1hbnkgc2l0dWF0aW9ucy4gIFVzZSBgc2lncHJvY21hc2snIGluc3RlYWQuICAqLworCisvKiBDb21wdXRlIG1hc2sgZm9yIHNpZ25hbCBTSUcuICAqLworIyBkZWZpbmUgc2lnbWFzayhzaWcpCV9fc2lnbWFzayhzaWcpCisKKy8qIEJsb2NrIHNpZ25hbHMgaW4gTUFTSywgcmV0dXJuaW5nIHRoZSBvbGQgbWFzay4gICovCitleHRlcm4gaW50IHNpZ2Jsb2NrIChpbnQgX19tYXNrKSBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKworLyogU2V0IHRoZSBtYXNrIG9mIGJsb2NrZWQgc2lnbmFscyB0byBNQVNLLCByZXR1cm5pbmcgdGhlIG9sZCBtYXNrLiAgKi8KK2V4dGVybiBpbnQgc2lnc2V0bWFzayAoaW50IF9fbWFzaykgX19USFJPVyBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX187CisKKy8qIFJldHVybiBjdXJyZW50bHkgc2VsZWN0ZWQgc2lnbmFsIG1hc2suICAqLworZXh0ZXJuIGludCBzaWdnZXRtYXNrICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX2RlcHJlY2F0ZWRfXzsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworCisjaWZkZWYgX19VU0VfTUlTQworIyBkZWZpbmUgTlNJRwlfTlNJRworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKK3R5cGVkZWYgX19zaWdoYW5kbGVyX3Qgc2lnaGFuZGxlcl90OworI2VuZGlmCisKKy8qIDQuNCBCU0QgdXNlcyB0aGUgbmFtZSBgc2lnX3QnIGZvciB0aGlzLiAgKi8KKyNpZmRlZiBfX1VTRV9CU0QKK3R5cGVkZWYgX19zaWdoYW5kbGVyX3Qgc2lnX3Q7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1BPU0lYCisKKyMgaWZkZWYgX19VU0VfUE9TSVgxOTkzMDkKKy8qIFdlIG5lZWQgYHN0cnVjdCB0aW1lc3BlYycgbGF0ZXIgb24uICAqLworIyAgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyAgaW5jbHVkZSA8dGltZS5oPgorCisvKiBHZXQgdGhlIGBzaWdpbmZvX3QnIHR5cGUgcGx1cyB0aGUgbmVlZGVkIHN5bWJvbHMuICAqLworIyAgaW5jbHVkZSA8Yml0cy9zaWdpbmZvLmg+CisjIGVuZGlmCisKKy8qIENsZWFyIGFsbCBzaWduYWxzIGZyb20gU0VULiAgKi8KK2V4dGVybiBpbnQgc2lnZW1wdHlzZXQgKHNpZ3NldF90ICpfX3NldCkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNldCBhbGwgc2lnbmFscyBpbiBTRVQuICAqLworZXh0ZXJuIGludCBzaWdmaWxsc2V0IChzaWdzZXRfdCAqX19zZXQpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBBZGQgU0lHTk8gdG8gU0VULiAgKi8KK2V4dGVybiBpbnQgc2lnYWRkc2V0IChzaWdzZXRfdCAqX19zZXQsIGludCBfX3NpZ25vKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmVtb3ZlIFNJR05PIGZyb20gU0VULiAgKi8KK2V4dGVybiBpbnQgc2lnZGVsc2V0IChzaWdzZXRfdCAqX19zZXQsIGludCBfX3NpZ25vKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogUmV0dXJuIDEgaWYgU0lHTk8gaXMgaW4gU0VULCAwIGlmIG5vdC4gICovCitleHRlcm4gaW50IHNpZ2lzbWVtYmVyIChfX2NvbnN0IHNpZ3NldF90ICpfX3NldCwgaW50IF9fc2lnbm8pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjIGlmZGVmIF9fVVNFX0dOVQorLyogUmV0dXJuIG5vbi1lbXB0eSB2YWx1ZSBpcyBTRVQgaXMgbm90IGVtcHR5LiAgKi8KK2V4dGVybiBpbnQgc2lnaXNlbXB0eXNldCAoX19jb25zdCBzaWdzZXRfdCAqX19zZXQpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBCdWlsZCBuZXcgc2lnbmFsIHNldCBieSBjb21iaW5pbmcgdGhlIHR3byBpbnB1dHMgc2V0IHVzaW5nIGxvZ2ljYWwgQU5ELiAgKi8KK2V4dGVybiBpbnQgc2lnYW5kc2V0IChzaWdzZXRfdCAqX19zZXQsIF9fY29uc3Qgc2lnc2V0X3QgKl9fbGVmdCwKKwkJICAgICAgX19jb25zdCBzaWdzZXRfdCAqX19yaWdodCkgX19USFJPVyBfX25vbm51bGwgKCgxLCAyLCAzKSk7CisKKy8qIEJ1aWxkIG5ldyBzaWduYWwgc2V0IGJ5IGNvbWJpbmluZyB0aGUgdHdvIGlucHV0cyBzZXQgdXNpbmcgbG9naWNhbCBPUi4gICovCitleHRlcm4gaW50IHNpZ29yc2V0IChzaWdzZXRfdCAqX19zZXQsIF9fY29uc3Qgc2lnc2V0X3QgKl9fbGVmdCwKKwkJICAgICBfX2NvbnN0IHNpZ3NldF90ICpfX3JpZ2h0KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKyMgZW5kaWYgLyogR05VICovCisKKy8qIEdldCB0aGUgc3lzdGVtLXNwZWNpZmljIGRlZmluaXRpb25zIG9mIGBzdHJ1Y3Qgc2lnYWN0aW9uJworICAgYW5kIHRoZSBgU0FfKicgYW5kIGBTSUdfKicuIGNvbnN0YW50cy4gICovCisjIGluY2x1ZGUgPGJpdHMvc2lnYWN0aW9uLmg+CisKKy8qIEdldCBhbmQvb3IgY2hhbmdlIHRoZSBzZXQgb2YgYmxvY2tlZCBzaWduYWxzLiAgKi8KK2V4dGVybiBpbnQgc2lncHJvY21hc2sgKGludCBfX2hvdywgX19jb25zdCBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NldCwKKwkJCXNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fb3NldCkgX19USFJPVzsKKworLyogQ2hhbmdlIHRoZSBzZXQgb2YgYmxvY2tlZCBzaWduYWxzIHRvIFNFVCwKKyAgIHdhaXQgdW50aWwgYSBzaWduYWwgYXJyaXZlcywgYW5kIHJlc3RvcmUgdGhlIHNldCBvZiBibG9ja2VkIHNpZ25hbHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzaWdzdXNwZW5kIChfX2NvbnN0IHNpZ3NldF90ICpfX3NldCkgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgYW5kL29yIHNldCB0aGUgYWN0aW9uIGZvciBzaWduYWwgU0lHLiAgKi8KK2V4dGVybiBpbnQgc2lnYWN0aW9uIChpbnQgX19zaWcsIF9fY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqX19yZXN0cmljdCBfX2FjdCwKKwkJICAgICAgc3RydWN0IHNpZ2FjdGlvbiAqX19yZXN0cmljdCBfX29hY3QpIF9fVEhST1c7CisKKy8qIFB1dCBpbiBTRVQgYWxsIHNpZ25hbHMgdGhhdCBhcmUgYmxvY2tlZCBhbmQgd2FpdGluZyB0byBiZSBkZWxpdmVyZWQuICAqLworZXh0ZXJuIGludCBzaWdwZW5kaW5nIChzaWdzZXRfdCAqX19zZXQpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisKKy8qIFNlbGVjdCBhbnkgb2YgcGVuZGluZyBzaWduYWxzIGZyb20gU0VUIG9yIHdhaXQgZm9yIGFueSB0byBhcnJpdmUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzaWd3YWl0IChfX2NvbnN0IHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2V0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWcpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworIyBpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorLyogU2VsZWN0IGFueSBvZiBwZW5kaW5nIHNpZ25hbHMgZnJvbSBTRVQgYW5kIHBsYWNlIGluZm9ybWF0aW9uIGluIElORk8uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzaWd3YWl0aW5mbyAoX19jb25zdCBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NldCwKKwkJCXNpZ2luZm9fdCAqX19yZXN0cmljdCBfX2luZm8pIF9fbm9ubnVsbCAoKDEpKTsKKworLyogU2VsZWN0IGFueSBvZiBwZW5kaW5nIHNpZ25hbHMgZnJvbSBTRVQgYW5kIHBsYWNlIGluZm9ybWF0aW9uIGluIElORk8uCisgICBXYWl0IHRoZSB0aW1lIHNwZWNpZmllZCBieSBUSU1FT1VUIGlmIG5vIHNpZ25hbCBpcyBwZW5kaW5nLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2lndGltZWR3YWl0IChfX2NvbnN0IHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2V0LAorCQkJIHNpZ2luZm9fdCAqX19yZXN0cmljdCBfX2luZm8sCisJCQkgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0KQorICAgICBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNlbmQgc2lnbmFsIFNJRyB0byB0aGUgcHJvY2VzcyBQSUQuICBBc3NvY2lhdGUgZGF0YSBpbiBWQUwgd2l0aCB0aGUKKyAgIHNpZ25hbC4gICovCitleHRlcm4gaW50IHNpZ3F1ZXVlIChfX3BpZF90IF9fcGlkLCBpbnQgX19zaWcsIF9fY29uc3QgdW5pb24gc2lndmFsIF9fdmFsKQorICAgICBfX1RIUk9XOworIyBlbmRpZgkvKiBVc2UgUE9TSVggMTk5MzA2LiAgKi8KKworI2VuZGlmIC8qIFVzZSBQT1NJWC4gICovCisKKyNpZmRlZiBfX1VTRV9CU0QKKworLyogTmFtZXMgb2YgdGhlIHNpZ25hbHMuICBUaGlzIHZhcmlhYmxlIGV4aXN0cyBvbmx5IGZvciBjb21wYXRpYmlsaXR5LgorICAgVXNlIGBzdHJzaWduYWwnIGluc3RlYWQgKHNlZSA8c3RyaW5nLmg+KS4gICovCitleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IF9zeXNfc2lnbGlzdFtfTlNJR107CitleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19zaWdsaXN0W19OU0lHXTsKKworLyogU3RydWN0dXJlIHBhc3NlZCB0byBgc2lndmVjJy4gICovCitzdHJ1Y3Qgc2lndmVjCisgIHsKKyAgICBfX3NpZ2hhbmRsZXJfdCBzdl9oYW5kbGVyOwkvKiBTaWduYWwgaGFuZGxlci4gICovCisgICAgaW50IHN2X21hc2s7CQkvKiBNYXNrIG9mIHNpZ25hbHMgdG8gYmUgYmxvY2tlZC4gICovCisKKyAgICBpbnQgc3ZfZmxhZ3M7CQkvKiBGbGFncyAoc2VlIGJlbG93KS4gICovCisjIGRlZmluZSBzdl9vbnN0YWNrCXN2X2ZsYWdzIC8qIDQuMiBCU0QgY29tcGF0aWJpbGl0eS4gICovCisgIH07CisKKy8qIEJpdHMgaW4gYHN2X2ZsYWdzJy4gICovCisjIGRlZmluZSBTVl9PTlNUQUNLCSgxIDw8IDApLyogVGFrZSB0aGUgc2lnbmFsIG9uIHRoZSBzaWduYWwgc3RhY2suICAqLworIyBkZWZpbmUgU1ZfSU5URVJSVVBUCSgxIDw8IDEpLyogRG8gbm90IHJlc3RhcnQgc3lzdGVtIGNhbGxzLiAgKi8KKyMgZGVmaW5lIFNWX1JFU0VUSEFORAkoMSA8PCAyKS8qIFJlc2V0IGhhbmRsZXIgdG8gU0lHX0RGTCBvbiByZWNlaXB0LiAgKi8KKworCisvKiBJZiBWRUMgaXMgbm9uLU5VTEwsIHNldCB0aGUgaGFuZGxlciBmb3IgU0lHIHRvIHRoZSBgc3ZfaGFuZGxlcicgbWVtYmVyCisgICBvZiBWRUMuICBUaGUgc2lnbmFscyBpbiBgc3ZfbWFzaycgd2lsbCBiZSBibG9ja2VkIHdoaWxlIHRoZSBoYW5kbGVyIHJ1bnMuCisgICBJZiB0aGUgU1ZfUkVTRVRIQU5EIGJpdCBpcyBzZXQgaW4gYHN2X2ZsYWdzJywgdGhlIGhhbmRsZXIgZm9yIFNJRyB3aWxsIGJlCisgICByZXNldCB0byBTSUdfREZMIGJlZm9yZSBgc3ZfaGFuZGxlcicgaXMgZW50ZXJlZC4gIElmIE9WRUMgaXMgbm9uLU5VTEwsCisgICBpdCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgb2xkIGluZm9ybWF0aW9uIGZvciBTSUcuICAqLworZXh0ZXJuIGludCBzaWd2ZWMgKGludCBfX3NpZywgX19jb25zdCBzdHJ1Y3Qgc2lndmVjICpfX3ZlYywKKwkJICAgc3RydWN0IHNpZ3ZlYyAqX19vdmVjKSBfX1RIUk9XOworCisKKy8qIEdldCBtYWNoaW5lLWRlcGVuZGVudCBgc3RydWN0IHNpZ2NvbnRleHQnIGFuZCBzaWduYWwgc3ViY29kZXMuICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ2NvbnRleHQuaD4KKworLyogUmVzdG9yZSB0aGUgc3RhdGUgc2F2ZWQgaW4gU0NQLiAgKi8KK2V4dGVybiBpbnQgc2lncmV0dXJuIChzdHJ1Y3Qgc2lnY29udGV4dCAqX19zY3ApIF9fVEhST1c7CisKKyNlbmRpZiAvKiAgdXNlIEJTRC4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKyMgZGVmaW5lIF9fbmVlZF9zaXplX3QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIElmIElOVEVSUlVQVCBpcyBub256ZXJvLCBtYWtlIHNpZ25hbCBTSUcgaW50ZXJydXB0IHN5c3RlbSBjYWxscworICAgKGNhdXNpbmcgdGhlbSB0byBmYWlsIHdpdGggRUlOVFIpOyBpZiBJTlRFUlJVUFQgaXMgemVybywgbWFrZSBzeXN0ZW0KKyAgIGNhbGxzIGJlIHJlc3RhcnRlZCBhZnRlciBzaWduYWwgU0lHLiAgKi8KK2V4dGVybiBpbnQgc2lnaW50ZXJydXB0IChpbnQgX19zaWcsIGludCBfX2ludGVycnVwdCkgX19USFJPVzsKKworIyBpbmNsdWRlIDxiaXRzL3NpZ3N0YWNrLmg+CisjIGlmZGVmIF9fVVNFX1hPUEVOCisvKiBUaGlzIHdpbGwgZGVmaW5lIGB1Y29udGV4dF90JyBhbmQgYG1jb250ZXh0X3QnLiAgKi8KKyMgIGluY2x1ZGUgPHN5cy91Y29udGV4dC5oPgorIyBlbmRpZgorCisvKiBSdW4gc2lnbmFscyBoYW5kbGVycyBvbiB0aGUgc3RhY2sgc3BlY2lmaWVkIGJ5IFNTIChpZiBub3QgTlVMTCkuCisgICBJZiBPU1MgaXMgbm90IE5VTEwsIGl0IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBvbGQgc2lnbmFsIHN0YWNrIHN0YXR1cy4KKyAgIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlIGFuZCBvbiBtYW55IHBsYXRmb3JtIG5vdCBpbXBsZW1lbnRlZC4gICovCitleHRlcm4gaW50IHNpZ3N0YWNrIChzdHJ1Y3Qgc2lnc3RhY2sgKl9fc3MsIHN0cnVjdCBzaWdzdGFjayAqX19vc3MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fOworCisvKiBBbHRlcm5hdGUgc2lnbmFsIGhhbmRsZXIgc3RhY2sgaW50ZXJmYWNlLgorICAgVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGFsd2F5cyBiZSBwcmVmZXJyZWQgb3ZlciBgc2lnc3RhY2snLiAgKi8KK2V4dGVybiBpbnQgc2lnYWx0c3RhY2sgKF9fY29uc3Qgc3RydWN0IHNpZ2FsdHN0YWNrICpfX3Jlc3RyaWN0IF9fc3MsCisJCQlzdHJ1Y3Qgc2lnYWx0c3RhY2sgKl9fcmVzdHJpY3QgX19vc3MpIF9fVEhST1c7CisKKyNlbmRpZiAvKiB1c2UgQlNEIG9yIFgvT3BlbiBVbml4LiAgKi8KKworI2lmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBTaW1wbGlmaWVkIGludGVyZmFjZSBmb3Igc2lnbmFsIG1hbmFnZW1lbnQuICAqLworCisvKiBBZGQgU0lHIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MnIHNpZ25hbCBtYXNrLiAgKi8KK2V4dGVybiBpbnQgc2lnaG9sZCAoaW50IF9fc2lnKSBfX1RIUk9XOworCisvKiBSZW1vdmUgU0lHIGZyb20gdGhlIGNhbGxpbmcgcHJvY2Vzcycgc2lnbmFsIG1hc2suICAqLworZXh0ZXJuIGludCBzaWdyZWxzZSAoaW50IF9fc2lnKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIGRpc3Bvc2l0aW9uIG9mIFNJRyB0byBTSUdfSUdOLiAgKi8KK2V4dGVybiBpbnQgc2lnaWdub3JlIChpbnQgX19zaWcpIF9fVEhST1c7CisKKy8qIFNldCB0aGUgZGlzcG9zaXRpb24gb2YgU0lHLiAgKi8KK2V4dGVybiBfX3NpZ2hhbmRsZXJfdCBzaWdzZXQgKGludCBfX3NpZywgX19zaWdoYW5kbGVyX3QgX19kaXNwKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CisvKiBTb21lIG9mIHRoZSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHNpZ25hbHMgaW4gdGhyZWFkZWQgcHJvZ3JhbXMgbXVzdAorICAgYmUgZGVmaW5lZCBoZXJlLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9wdGhyZWFkdHlwZXMuaD4KKyMgaW5jbHVkZSA8Yml0cy9zaWd0aHJlYWQuaD4KKyNlbmRpZiAvKiB1c2UgVW5peDk4ICovCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIGludGVybmFsbHkgaW4gdGhlIEMgbGlicmFyeSBhbmQgaW4KKyAgIG90aGVyIGNvZGUgd2hpY2ggbmVlZCBkZWVwIGluc2lnaHRzLiAgKi8KKworLyogUmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgcmVhbC10aW1lIHNpZ25hbCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuICAqLworZXh0ZXJuIGludCBfX2xpYmNfY3VycmVudF9zaWdydG1pbiAodm9pZCkgX19USFJPVzsKKy8qIFJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHJlYWwtdGltZSBzaWduYWwgd2l0aCBsb3dlc3QgcHJpb3JpdHkuICAqLworZXh0ZXJuIGludCBfX2xpYmNfY3VycmVudF9zaWdydG1heCAodm9pZCkgX19USFJPVzsKKworI2VuZGlmIC8qIHNpZ25hbC5oICAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogbm90IHNpZ25hbC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3NwYXduLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3NwYXduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3N2ZjYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3Bhd24uaApAQCAtMCwwICsxLDE5MCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIFBPU0lYIHNwYXduIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1BBV05fSAorI2RlZmluZQlfU1BBV05fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29udGFpbiBhdHRyaWJ1dGVzIGZvciB0aHJlYWQgY3JlYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2hvcnQgaW50IF9fZmxhZ3M7CisgIHBpZF90IF9fcGdycDsKKyAgc2lnc2V0X3QgX19zZDsKKyAgc2lnc2V0X3QgX19zczsKKyAgc3RydWN0IHNjaGVkX3BhcmFtIF9fc3A7CisgIGludCBfX3BvbGljeTsKKyAgaW50IF9fcGFkWzE2XTsKK30gcG9zaXhfc3Bhd25hdHRyX3Q7CisKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0aW9ucyB0byBiZQorICAgcGVyZm9ybWVkIGluIHRoZSBuZXcgcHJvY2VzcyB3aXRoIHJlc3BlY3QgdG8gZmlsZSBkZXNjcmlwdG9ycy4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgX19hbGxvY2F0ZWQ7CisgIGludCBfX3VzZWQ7CisgIHN0cnVjdCBfX3NwYXduX2FjdGlvbiAqX19hY3Rpb25zOworICBpbnQgX19wYWRbMTZdOworfSBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdDsKKworCisvKiBGbGFncyB0byBiZSBzZXQgaW4gdGhlIGBwb3NpeF9zcGF3bmF0dHJfdCcuICAqLworI2RlZmluZSBQT1NJWF9TUEFXTl9SRVNFVElEUwkJMHgwMQorI2RlZmluZSBQT1NJWF9TUEFXTl9TRVRQR1JPVVAJCTB4MDIKKyNkZWZpbmUgUE9TSVhfU1BBV05fU0VUU0lHREVGCQkweDA0CisjZGVmaW5lIFBPU0lYX1NQQVdOX1NFVFNJR01BU0sJCTB4MDgKKyNkZWZpbmUgUE9TSVhfU1BBV05fU0VUU0NIRURQQVJBTQkweDEwCisjZGVmaW5lIFBPU0lYX1NQQVdOX1NFVFNDSEVEVUxFUgkweDIwCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBQT1NJWF9TUEFXTl9VU0VWRk9SSwkJMHg0MAorI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBTcGF3biBhIG5ldyBwcm9jZXNzIGV4ZWN1dGluZyBQQVRIIHdpdGggdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmVzIGluICpBVFRSUC4KKyAgIEJlZm9yZSBydW5uaW5nIHRoZSBwcm9jZXNzIHBlcmZvcm0gdGhlIGFjdGlvbnMgZGVzY3JpYmVkIGluIEZJTEUtQUNUSU9OUy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduIChwaWRfdCAqX19yZXN0cmljdCBfX3BpZCwKKwkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQlfX2NvbnN0IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICpfX3Jlc3RyaWN0CisJCQlfX2ZpbGVfYWN0aW9ucywKKwkJCV9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRycCwKKwkJCWNoYXIgKl9fY29uc3QgYXJndltfX3Jlc3RyaWN0X2Fycl0sCisJCQljaGFyICpfX2NvbnN0IGVudnBbX19yZXN0cmljdF9hcnJdKTsKKworLyogU2ltaWxhciB0byBgcG9zaXhfc3Bhd24nIGJ1dCBzZWFyY2ggZm9yIEZJTEUgaW4gdGhlIFBBVEguCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25wIChwaWRfdCAqX19waWQsIF9fY29uc3QgY2hhciAqX19maWxlLAorCQkJIF9fY29uc3QgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKl9fZmlsZV9hY3Rpb25zLAorCQkJIF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fYXR0cnAsCisJCQkgY2hhciAqX19jb25zdCBhcmd2W10sIGNoYXIgKl9fY29uc3QgZW52cFtdKTsKKworCisvKiBJbml0aWFsaXplIGRhdGEgc3RydWN0dXJlIHdpdGggYXR0cmlidXRlcyBmb3IgYHNwYXduJyB0byBkZWZhdWx0IHZhbHVlcy4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9pbml0IChwb3NpeF9zcGF3bmF0dHJfdCAqX19hdHRyKSBfX1RIUk9XOworCisvKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggQVRUUi4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9kZXN0cm95IChwb3NpeF9zcGF3bmF0dHJfdCAqX19hdHRyKSBfX1RIUk9XOworCisvKiBTdG9yZSBzaWduYWwgbWFzayBmb3Igc2lnbmFscyB3aXRoIGRlZmF1bHQgaGFuZGxpbmcgZnJvbSBBVFRSIGluCisgICBTSUdERUZBVUxULiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2dldHNpZ2RlZmF1bHQgKF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKgorCQkJCQkgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgIHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2lnZGVmYXVsdCkKKyAgICAgX19USFJPVzsKKworLyogU2V0IHNpZ25hbCBtYXNrIGZvciBzaWduYWxzIHdpdGggZGVmYXVsdCBoYW5kbGluZyBpbiBBVFRSIHRvIFNJR0RFRkFVTFQuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfc2V0c2lnZGVmYXVsdCAocG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgIF9fY29uc3Qgc2lnc2V0X3QgKl9fcmVzdHJpY3QKKwkJCQkJICBfX3NpZ2RlZmF1bHQpCisgICAgIF9fVEhST1c7CisKKy8qIFN0b3JlIHNpZ25hbCBtYXNrIGZvciB0aGUgbmV3IHByb2Nlc3MgZnJvbSBBVFRSIGluIFNJR01BU0suICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZ2V0c2lnbWFzayAoX19jb25zdCBwb3NpeF9zcGF3bmF0dHJfdCAqX19yZXN0cmljdAorCQkJCSAgICAgICBfX2F0dHIsCisJCQkJICAgICAgIHNpZ3NldF90ICpfX3Jlc3RyaWN0IF9fc2lnbWFzaykgX19USFJPVzsKKworLyogU2V0IHNpZ25hbCBtYXNrIGZvciB0aGUgbmV3IHByb2Nlc3MgaW4gQVRUUiB0byBTSUdNQVNLLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX3NldHNpZ21hc2sgKHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkgICAgICAgX19jb25zdCBzaWdzZXRfdCAqX19yZXN0cmljdCBfX3NpZ21hc2spCisgICAgIF9fVEhST1c7CisKKy8qIEdldCBmbGFnIHdvcmQgZnJvbSB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9nZXRmbGFncyAoX19jb25zdCBwb3NpeF9zcGF3bmF0dHJfdCAqX19yZXN0cmljdAorCQkJCSAgICAgX19hdHRyLAorCQkJCSAgICAgc2hvcnQgaW50ICpfX3Jlc3RyaWN0IF9fZmxhZ3MpIF9fVEhST1c7CisKKy8qIFN0b3JlIGZsYWdzIGluIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX3NldGZsYWdzIChwb3NpeF9zcGF3bmF0dHJfdCAqX2F0dHIsCisJCQkJICAgICBzaG9ydCBpbnQgX19mbGFncykgX19USFJPVzsKKworLyogR2V0IHByb2Nlc3MgZ3JvdXAgSUQgZnJvbSB0aGUgYXR0cmlidXRlIHN0cnVjdHVyZS4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduYXR0cl9nZXRwZ3JvdXAgKF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKl9fcmVzdHJpY3QKKwkJCQkgICAgICBfX2F0dHIsIHBpZF90ICpfX3Jlc3RyaWN0IF9fcGdyb3VwKQorICAgICBfX1RIUk9XOworCisvKiBTdG9yZSBwcm9jZXNzIGdyb3VwIElEIGluIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX3NldHBncm91cCAocG9zaXhfc3Bhd25hdHRyX3QgKl9fYXR0ciwKKwkJCQkgICAgICBwaWRfdCBfX3Bncm91cCkgX19USFJPVzsKKworLyogR2V0IHNjaGVkdWxpbmcgcG9saWN5IGZyb20gdGhlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bmF0dHJfZ2V0c2NoZWRwb2xpY3kgKF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKgorCQkJCQkgICBfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICAgaW50ICpfX3Jlc3RyaWN0IF9fc2NoZWRwb2xpY3kpCisgICAgIF9fVEhST1c7CisKKy8qIFN0b3JlIHNjaGVkdWxpbmcgcG9saWN5IGluIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX3NldHNjaGVkcG9saWN5IChwb3NpeF9zcGF3bmF0dHJfdCAqX19hdHRyLAorCQkJCQkgICBpbnQgX19zY2hlZHBvbGljeSkgX19USFJPVzsKKworLyogR2V0IHNjaGVkdWxpbmcgcGFyYW1ldGVycyBmcm9tIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX2dldHNjaGVkcGFyYW0gKF9fY29uc3QgcG9zaXhfc3Bhd25hdHRyX3QgKgorCQkJCQkgIF9fcmVzdHJpY3QgX19hdHRyLAorCQkJCQkgIHN0cnVjdCBzY2hlZF9wYXJhbSAqX19yZXN0cmljdAorCQkJCQkgIF9fc2NoZWRwYXJhbSkgX19USFJPVzsKKworLyogU3RvcmUgc2NoZWR1bGluZyBwYXJhbWV0ZXJzIGluIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25hdHRyX3NldHNjaGVkcGFyYW0gKHBvc2l4X3NwYXduYXR0cl90ICpfX3Jlc3RyaWN0IF9fYXR0ciwKKwkJCQkJICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKgorCQkJCQkgIF9fcmVzdHJpY3QgX19zY2hlZHBhcmFtKSBfX1RIUk9XOworCisKKy8qIEluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGZpbGUgYXR0cmlidXRlIGZvciBgc3Bhd24nIGNhbGwuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfaW5pdCAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKgorCQkJCQkgIF9fZmlsZV9hY3Rpb25zKSBfX1RIUk9XOworCisvKiBGcmVlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggRklMRS1BQ1RJT05TLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2Rlc3Ryb3kgKHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICoKKwkJCQkJICAgICBfX2ZpbGVfYWN0aW9ucykgX19USFJPVzsKKworLyogQWRkIGFuIGFjdGlvbiB0byBGSUxFLUFDVElPTlMgd2hpY2ggdGVsbHMgdGhlIGltcGxlbWVudGF0aW9uIHRvIGNhbGwKKyAgIGBvcGVuJyBmb3IgdGhlIGdpdmVuIGZpbGUgZHVyaW5nIHRoZSBgc3Bhd24nIGNhbGwuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfYWRkb3BlbiAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QgKgorCQkJCQkgICAgIF9fcmVzdHJpY3QgX19maWxlX2FjdGlvbnMsCisJCQkJCSAgICAgaW50IF9fZmQsCisJCQkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCQkJICAgICBpbnQgX19vZmxhZywgbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVzsKKworLyogQWRkIGFuIGFjdGlvbiB0byBGSUxFLUFDVElPTlMgd2hpY2ggdGVsbHMgdGhlIGltcGxlbWVudGF0aW9uIHRvIGNhbGwKKyAgIGBjbG9zZScgZm9yIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IgZHVyaW5nIHRoZSBgc3Bhd24nIGNhbGwuICAqLworZXh0ZXJuIGludCBwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfYWRkY2xvc2UgKHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190ICoKKwkJCQkJICAgICAgX19maWxlX2FjdGlvbnMsIGludCBfX2ZkKQorICAgICBfX1RIUk9XOworCisvKiBBZGQgYW4gYWN0aW9uIHRvIEZJTEUtQUNUSU9OUyB3aGljaCB0ZWxscyB0aGUgaW1wbGVtZW50YXRpb24gdG8gY2FsbAorICAgYGR1cDInIGZvciB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9ycyBkdXJpbmcgdGhlIGBzcGF3bicgY2FsbC4gICovCitleHRlcm4gaW50IHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRkdXAyIChwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCAqCisJCQkJCSAgICAgX19maWxlX2FjdGlvbnMsCisJCQkJCSAgICAgaW50IF9fZmQsIGludCBfX25ld2ZkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3Bhd24uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGFiLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGMzYzMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGFiLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfX0dOVV9TVEFCX18KKworLyogSW5kaWNhdGUgdGhlIEdOVSBzdGFiLmggaXMgaW4gdXNlLiAgKi8KKworI2RlZmluZSBfX0dOVV9TVEFCX18KKworI2RlZmluZSBfX2RlZmluZV9zdGFiKE5BTUUsIENPREUsIFNUUklORykgTkFNRT1DT0RFLAorCitlbnVtIF9fc3RhYl9kZWJ1Z19jb2RlCit7CisjaW5jbHVkZSA8Yml0cy9zdGFiLmRlZj4KK0xBU1RfVU5VU0VEX1NUQUJfQ09ERQorfTsKKworI3VuZGVmIF9fZGVmaW5lX3N0YWIKKworI2VuZGlmIC8qIF9fR05VX1NUQUJfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGludC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzcyOWFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpbnQuaApAQCAtMCwwICsxLDMyMCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LDE5OTgsMTk5OSwyMDAwLDIwMDEsMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTk6IDcuMTggSW50ZWdlciB0eXBlcyA8c3RkaW50Lmg+CisgKi8KKworI2lmbmRlZiBfU1RESU5UX0gKKyNkZWZpbmUgX1NURElOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy93Y2hhci5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogRXhhY3QgaW50ZWdyYWwgdHlwZXMuICAqLworCisvKiBTaWduZWQuICAqLworCisvKiBUaGVyZSBpcyBzb21lIGFtb3VudCBvZiBvdmVybGFwIHdpdGggPHN5cy90eXBlcy5oPiBhcyBrbm93biBieSBpbmV0IGNvZGUgKi8KKyNpZm5kZWYgX19pbnQ4X3RfZGVmaW5lZAorIyBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQJCWludDE2X3Q7Cit0eXBlZGVmIGludAkJCWludDMyX3Q7CisjIGlmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgbG9uZyBpbnQJCWludDY0X3Q7CisjIGVsc2UKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgbG9uZyBsb25nIGludAkJaW50NjRfdDsKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBVbnNpZ25lZC4gICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludAl1aW50MTZfdDsKKyNpZm5kZWYgX191aW50MzJfdF9kZWZpbmVkCit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDMyX3Q7CisjIGRlZmluZSBfX3VpbnQzMl90X2RlZmluZWQKKyNlbmRpZgorI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludDY0X3Q7CisjZWxzZQorX19leHRlbnNpb25fXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CXVpbnQ2NF90OworI2VuZGlmCisKKworLyogU21hbGwgdHlwZXMuICAqLworCisvKiBTaWduZWQuICAqLwordHlwZWRlZiBzaWduZWQgY2hhcgkJaW50X2xlYXN0OF90OwordHlwZWRlZiBzaG9ydCBpbnQJCWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludAkJCWludF9sZWFzdDMyX3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludAkJaW50X2xlYXN0NjRfdDsKKyNlbHNlCitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQJCWludF9sZWFzdDY0X3Q7CisjZW5kaWYKKworLyogVW5zaWduZWQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50X2xlYXN0OF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQJdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludF9sZWFzdDMyX3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2xlYXN0NjRfdDsKKyNlbHNlCitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludF9sZWFzdDY0X3Q7CisjZW5kaWYKKworCisvKiBGYXN0IHR5cGVzLiAgKi8KKworLyogU2lnbmVkLiAgKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIJCWludF9mYXN0OF90OworI2lmIF9fV09SRFNJWkUgPT0gNjQKK3R5cGVkZWYgbG9uZyBpbnQJCWludF9mYXN0MTZfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCWludF9mYXN0MzJfdDsKK3R5cGVkZWYgbG9uZyBpbnQJCWludF9mYXN0NjRfdDsKKyNlbHNlCit0eXBlZGVmIGludAkJCWludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50CQkJaW50X2Zhc3QzMl90OworX19leHRlbnNpb25fXwordHlwZWRlZiBsb25nIGxvbmcgaW50CQlpbnRfZmFzdDY0X3Q7CisjZW5kaWYKKworLyogVW5zaWduZWQuICAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1aW50X2Zhc3Q4X3Q7CisjaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2Zhc3QzMl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludAl1aW50X2Zhc3Q2NF90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X2Zhc3QxNl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCXVpbnRfZmFzdDMyX3Q7CitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludF9mYXN0NjRfdDsKKyNlbmRpZgorCisKKy8qIFR5cGVzIGZvciBgdm9pZCAqJyBwb2ludGVycy4gICovCisjaWYgX19XT1JEU0laRSA9PSA2NAorIyBpZm5kZWYgX19pbnRwdHJfdF9kZWZpbmVkCit0eXBlZGVmIGxvbmcgaW50CQlpbnRwdHJfdDsKKyMgIGRlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKyMgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludHB0cl90OworI2Vsc2UKKyMgaWZuZGVmIF9faW50cHRyX3RfZGVmaW5lZAordHlwZWRlZiBpbnQJCQlpbnRwdHJfdDsKKyMgIGRlZmluZSBfX2ludHB0cl90X2RlZmluZWQKKyMgZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50cHRyX3Q7CisjZW5kaWYKKworCisvKiBMYXJnZXN0IGludGVncmFsIHR5cGVzLiAgKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIGxvbmcgaW50CQlpbnRtYXhfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQJdWludG1heF90OworI2Vsc2UKK19fZXh0ZW5zaW9uX18KK3R5cGVkZWYgbG9uZyBsb25nIGludAkJaW50bWF4X3Q7CitfX2V4dGVuc2lvbl9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJdWludG1heF90OworI2VuZGlmCisKKworLyogVGhlIElTTyBDOTkgc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgaW4gQysrIGltcGxlbWVudGF0aW9ucyB0aGVzZQorICAgbWFjcm9zIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19TVERDX0xJTUlUX01BQ1JPUworCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBfX0lOVDY0X0MoYykJYyAjIyBMCisjICBkZWZpbmUgX19VSU5UNjRfQyhjKQljICMjIFVMCisjIGVsc2UKKyMgIGRlZmluZSBfX0lOVDY0X0MoYykJYyAjIyBMTAorIyAgZGVmaW5lIF9fVUlOVDY0X0MoYykJYyAjIyBVTEwKKyMgZW5kaWYKKworLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAgKi8KKworLyogTWluaW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgSU5UOF9NSU4JCSgtMTI4KQorIyBkZWZpbmUgSU5UMTZfTUlOCQkoLTMyNzY3LTEpCisjIGRlZmluZSBJTlQzMl9NSU4JCSgtMjE0NzQ4MzY0Ny0xKQorIyBkZWZpbmUgSU5UNjRfTUlOCQkoLV9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KS0xKQorLyogTWF4aW11bSBvZiBzaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgSU5UOF9NQVgJCSgxMjcpCisjIGRlZmluZSBJTlQxNl9NQVgJCSgzMjc2NykKKyMgZGVmaW5lIElOVDMyX01BWAkJKDIxNDc0ODM2NDcpCisjIGRlZmluZSBJTlQ2NF9NQVgJCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMuICAqLworIyBkZWZpbmUgVUlOVDhfTUFYCQkoMjU1KQorIyBkZWZpbmUgVUlOVDE2X01BWAkJKDY1NTM1KQorIyBkZWZpbmUgVUlOVDMyX01BWAkJKDQyOTQ5NjcyOTVVKQorIyBkZWZpbmUgVUlOVDY0X01BWAkJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIE1pbmltdW0gb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBJTlRfTEVBU1Q4X01JTgkJKC0xMjgpCisjIGRlZmluZSBJTlRfTEVBU1QxNl9NSU4JKC0zMjc2Ny0xKQorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUlOCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgSU5UX0xFQVNUOF9NQVgJCSgxMjcpCisjIGRlZmluZSBJTlRfTEVBU1QxNl9NQVgJKDMyNzY3KQorIyBkZWZpbmUgSU5UX0xFQVNUMzJfTUFYCSgyMTQ3NDgzNjQ3KQorIyBkZWZpbmUgSU5UX0xFQVNUNjRfTUFYCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIFVJTlRfTEVBU1Q4X01BWAkoMjU1KQorIyBkZWZpbmUgVUlOVF9MRUFTVDE2X01BWAkoNjU1MzUpCisjIGRlZmluZSBVSU5UX0xFQVNUMzJfTUFYCSg0Mjk0OTY3Mjk1VSkKKyMgZGVmaW5lIFVJTlRfTEVBU1Q2NF9NQVgJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIE1pbmltdW0gb2YgZmFzdCBzaWduZWQgaW50ZWdyYWwgdHlwZXMgaGF2aW5nIGEgbWluaW11bSBzaXplLiAgKi8KKyMgZGVmaW5lIElOVF9GQVNUOF9NSU4JCSgtMTI4KQorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UX0ZBU1QxNl9NSU4JKC05MjIzMzcyMDM2ODU0Nzc1ODA3TC0xKQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUlOCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyMgZWxzZQorIyAgZGVmaW5lIElOVF9GQVNUMTZfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUlOCSgtMjE0NzQ4MzY0Ny0xKQorIyBlbmRpZgorIyBkZWZpbmUgSU5UX0ZBU1Q2NF9NSU4JCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIG9mIGZhc3Qgc2lnbmVkIGludGVncmFsIHR5cGVzIGhhdmluZyBhIG1pbmltdW0gc2l6ZS4gICovCisjIGRlZmluZSBJTlRfRkFTVDhfTUFYCQkoMTI3KQorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UX0ZBU1QxNl9NQVgJKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUFYCSg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkKKyMgZWxzZQorIyAgZGVmaW5lIElOVF9GQVNUMTZfTUFYCSgyMTQ3NDgzNjQ3KQorIyAgZGVmaW5lIElOVF9GQVNUMzJfTUFYCSgyMTQ3NDgzNjQ3KQorIyBlbmRpZgorIyBkZWZpbmUgSU5UX0ZBU1Q2NF9NQVgJCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gb2YgZmFzdCB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBoYXZpbmcgYSBtaW5pbXVtIHNpemUuICAqLworIyBkZWZpbmUgVUlOVF9GQVNUOF9NQVgJCSgyNTUpCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBVSU5UX0ZBU1QxNl9NQVgJKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwpCisjICBkZWZpbmUgVUlOVF9GQVNUMzJfTUFYCSgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMKQorIyBlbHNlCisjICBkZWZpbmUgVUlOVF9GQVNUMTZfTUFYCSg0Mjk0OTY3Mjk1VSkKKyMgIGRlZmluZSBVSU5UX0ZBU1QzMl9NQVgJKDQyOTQ5NjcyOTVVKQorIyBlbmRpZgorIyBkZWZpbmUgVUlOVF9GQVNUNjRfTUFYCShfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKKworCisvKiBWYWx1ZXMgdG8gdGVzdCBmb3IgaW50ZWdyYWwgdHlwZXMgaG9sZGluZyBgdm9pZCAqJyBwb2ludGVyLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIElOVFBUUl9NSU4JCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyMgIGRlZmluZSBJTlRQVFJfTUFYCQkoOTIyMzM3MjAzNjg1NDc3NTgwN0wpCisjICBkZWZpbmUgVUlOVFBUUl9NQVgJCSgxODQ0Njc0NDA3MzcwOTU1MTYxNVVMKQorIyBlbHNlCisjICBkZWZpbmUgSU5UUFRSX01JTgkJKC0yMTQ3NDgzNjQ3LTEpCisjICBkZWZpbmUgSU5UUFRSX01BWAkJKDIxNDc0ODM2NDcpCisjICBkZWZpbmUgVUlOVFBUUl9NQVgJCSg0Mjk0OTY3Mjk1VSkKKyMgZW5kaWYKKworCisvKiBNaW5pbXVtIGZvciBsYXJnZXN0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLiAgKi8KKyMgZGVmaW5lIElOVE1BWF9NSU4JCSgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCisvKiBNYXhpbXVtIGZvciBsYXJnZXN0IHNpZ25lZCBpbnRlZ3JhbCB0eXBlLiAgKi8KKyMgZGVmaW5lIElOVE1BWF9NQVgJCShfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCisKKy8qIE1heGltdW0gZm9yIGxhcmdlc3QgdW5zaWduZWQgaW50ZWdyYWwgdHlwZS4gICovCisjIGRlZmluZSBVSU5UTUFYX01BWAkJKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorCisKKy8qIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzLiAgKi8KKworLyogTGltaXRzIG9mIGBwdHJkaWZmX3QnIHR5cGUuICAqLworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgUFRSRElGRl9NSU4JCSgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKKyMgIGRlZmluZSBQVFJESUZGX01BWAkJKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorIyBlbHNlCisjICBkZWZpbmUgUFRSRElGRl9NSU4JCSgtMjE0NzQ4MzY0Ny0xKQorIyAgZGVmaW5lIFBUUkRJRkZfTUFYCQkoMjE0NzQ4MzY0NykKKyMgZW5kaWYKKworLyogTGltaXRzIG9mIGBzaWdfYXRvbWljX3QnLiAgKi8KKyMgZGVmaW5lIFNJR19BVE9NSUNfTUlOCQkoLTIxNDc0ODM2NDctMSkKKyMgZGVmaW5lIFNJR19BVE9NSUNfTUFYCQkoMjE0NzQ4MzY0NykKKworLyogTGltaXQgb2YgYHNpemVfdCcgdHlwZS4gICovCisjIGlmIF9fV09SRFNJWkUgPT0gNjQKKyMgIGRlZmluZSBTSVpFX01BWAkJKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwpCisjIGVsc2UKKyMgIGRlZmluZSBTSVpFX01BWAkJKDQyOTQ5NjcyOTVVKQorIyBlbmRpZgorCisvKiBMaW1pdHMgb2YgYHdjaGFyX3QnLiAgKi8KKyMgaWZuZGVmIFdDSEFSX01JTgorLyogVGhlc2UgY29uc3RhbnRzIG1pZ2h0IGFsc28gYmUgZGVmaW5lZCBpbiA8d2NoYXIuaD4uICAqLworIyAgZGVmaW5lIFdDSEFSX01JTgkJX19XQ0hBUl9NSU4KKyMgIGRlZmluZSBXQ0hBUl9NQVgJCV9fV0NIQVJfTUFYCisjIGVuZGlmCisKKy8qIExpbWl0cyBvZiBgd2ludF90Jy4gICovCisjIGRlZmluZSBXSU5UX01JTgkJKDB1KQorIyBkZWZpbmUgV0lOVF9NQVgJCSg0Mjk0OTY3Mjk1dSkKKworI2VuZGlmCS8qIEMrKyAmJiBsaW1pdCBtYWNyb3MgKi8KKworCisvKiBUaGUgSVNPIEM5OSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBpbiBDKysgaW1wbGVtZW50YXRpb25zIHRoZXNlCisgICBzaG91bGQgb25seSBiZSBkZWZpbmVkIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KKyNpZiAhZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKworLyogU2lnbmVkLiAgKi8KKyMgZGVmaW5lIElOVDhfQyhjKQljCisjIGRlZmluZSBJTlQxNl9DKGMpCWMKKyMgZGVmaW5lIElOVDMyX0MoYykJYworIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgSU5UNjRfQyhjKQljICMjIEwKKyMgZWxzZQorIyAgZGVmaW5lIElOVDY0X0MoYykJYyAjIyBMTAorIyBlbmRpZgorCisvKiBVbnNpZ25lZC4gICovCisjIGRlZmluZSBVSU5UOF9DKGMpCWMKKyMgZGVmaW5lIFVJTlQxNl9DKGMpCWMKKyMgZGVmaW5lIFVJTlQzMl9DKGMpCWMgIyMgVQorIyBpZiBfX1dPUkRTSVpFID09IDY0CisjICBkZWZpbmUgVUlOVDY0X0MoYykJYyAjIyBVTAorIyBlbHNlCisjICBkZWZpbmUgVUlOVDY0X0MoYykJYyAjIyBVTEwKKyMgZW5kaWYKKworLyogTWF4aW1hbCB0eXBlLiAgKi8KKyMgaWYgX19XT1JEU0laRSA9PSA2NAorIyAgZGVmaW5lIElOVE1BWF9DKGMpCWMgIyMgTAorIyAgZGVmaW5lIFVJTlRNQVhfQyhjKQljICMjIFVMCisjIGVsc2UKKyMgIGRlZmluZSBJTlRNQVhfQyhjKQljICMjIExMCisjICBkZWZpbmUgVUlOVE1BWF9DKGMpCWMgIyMgVUxMCisjIGVuZGlmCisKKyNlbmRpZgkvKiBDKysgJiYgY29uc3RhbnQgbWFjcm9zICovCisKKyNlbmRpZiAvKiBzdGRpbnQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzZjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvLmgKQEAgLTAsMCArMSw5MTYgQEAKKy8qIERlZmluZSBJU08gQyBzdGRpbyBvbiB0b3Agb2YgQysrIGlvc3RyZWFtcy4KKyAgIENvcHlyaWdodCAoQykgMTk5MSwxOTk0LTIwMDQsMjAwNSwyMDA2LDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjE5IElucHV0L291dHB1dAk8c3RkaW8uaD4KKyAqLworCisjaWZuZGVmIF9TVERJT19ICisKKyNpZiAhZGVmaW5lZCBfX25lZWRfRklMRSAmJiAhZGVmaW5lZCBfX25lZWRfX19GSUxFCisjIGRlZmluZSBfU1RESU9fSAkxCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworIyBkZWZpbmUgX19uZWVkX3NpemVfdAorIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorIyBkZWZpbmUgX19uZWVkX0ZJTEUKKyMgZGVmaW5lIF9fbmVlZF9fX0ZJTEUKKyNlbmRpZiAvKiBEb24ndCBuZWVkIEZJTEUuICAqLworCisKKyNpZiAhZGVmaW5lZCBfX0ZJTEVfZGVmaW5lZCAmJiBkZWZpbmVkIF9fbmVlZF9GSUxFCisKKy8qIERlZmluZSBvdXRzaWRlIG9mIG5hbWVzcGFjZSBzbyB0aGUgQysrIGlzIGhhcHB5LiAgKi8KK3N0cnVjdCBfSU9fRklMRTsKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBUaGUgb3BhcXVlIHR5cGUgb2Ygc3RyZWFtcy4gIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gdXNlZCBlbHNld2hlcmUuICAqLwordHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgRklMRTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRTY0IHx8IGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOIFwKKyAgICB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYMgorX19VU0lOR19OQU1FU1BBQ0VfU1REKEZJTEUpCisjZW5kaWYKKworIyBkZWZpbmUgX19GSUxFX2RlZmluZWQJMQorI2VuZGlmIC8qIEZJTEUgbm90IGRlZmluZWQuICAqLworI3VuZGVmCV9fbmVlZF9GSUxFCisKKworI2lmICFkZWZpbmVkIF9fX19GSUxFX2RlZmluZWQgJiYgZGVmaW5lZCBfX25lZWRfX19GSUxFCisKKy8qIFRoZSBvcGFxdWUgdHlwZSBvZiBzdHJlYW1zLiAgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB1c2VkIGVsc2V3aGVyZS4gICovCit0eXBlZGVmIHN0cnVjdCBfSU9fRklMRSBfX0ZJTEU7CisKKyMgZGVmaW5lIF9fX19GSUxFX2RlZmluZWQJMQorI2VuZGlmIC8qIF9fRklMRSBub3QgZGVmaW5lZC4gICovCisjdW5kZWYJX19uZWVkX19fRklMRQorCisKKyNpZmRlZglfU1RESU9fSAorI2RlZmluZSBfU1RESU9fVVNFU19JT1NUUkVBTQorCisjaW5jbHVkZSA8bGliaW8uaD4KKworI2lmZGVmIF9fVVNFX1hPUEVOCisjIGlmZGVmIF9fR05VQ19fCisjICBpZm5kZWYgX1ZBX0xJU1RfREVGSU5FRAordHlwZWRlZiBfR192YV9saXN0IHZhX2xpc3Q7CisjICAgZGVmaW5lIF9WQV9MSVNUX0RFRklORUQKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGluY2x1ZGUgPHN0ZGFyZy5oPgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGZnZXRwb3MnIGFuZCBgZnNldHBvcycuICAqLworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX0dfZnBvc190IGZwb3NfdDsKKyNlbHNlCit0eXBlZGVmIF9HX2Zwb3M2NF90IGZwb3NfdDsKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0Cit0eXBlZGVmIF9HX2Zwb3M2NF90IGZwb3M2NF90OworI2VuZGlmCisKKy8qIFRoZSBwb3NzaWJpbGl0aWVzIGZvciB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYHNldHZidWYnLiAgKi8KKyNkZWZpbmUgX0lPRkJGIDAgCQkvKiBGdWxseSBidWZmZXJlZC4gICovCisjZGVmaW5lIF9JT0xCRiAxCQkvKiBMaW5lIGJ1ZmZlcmVkLiAgKi8KKyNkZWZpbmUgX0lPTkJGIDIJCS8qIE5vIGJ1ZmZlcmluZy4gICovCisKKworLyogRGVmYXVsdCBidWZmZXIgc2l6ZS4gICovCisjaWZuZGVmIEJVRlNJWgorIyBkZWZpbmUgQlVGU0laIF9JT19CVUZTSVoKKyNlbmRpZgorCisKKy8qIEVuZCBvZiBmaWxlIGNoYXJhY3Rlci4KKyAgIFNvbWUgdGhpbmdzIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgcmVseSBvbiB0aGlzIGJlaW5nIC0xLiAgKi8KKyNpZm5kZWYgRU9GCisjIGRlZmluZSBFT0YgKC0xKQorI2VuZGlmCisKKworLyogVGhlIHBvc3NpYmlsaXRpZXMgZm9yIHRoZSB0aGlyZCBhcmd1bWVudCB0byBgZnNlZWsnLgorICAgVGhlc2UgdmFsdWVzIHNob3VsZCBub3QgYmUgY2hhbmdlZC4gICovCisjZGVmaW5lIFNFRUtfU0VUCTAJLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyNkZWZpbmUgU0VFS19DVVIJMQkvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjZGVmaW5lIFNFRUtfRU5ECTIJLyogU2VlayBmcm9tIGVuZCBvZiBmaWxlLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIERlZmF1bHQgcGF0aCBwcmVmaXggZm9yIGB0ZW1wbmFtJyBhbmQgYHRtcG5hbScuICAqLworIyBkZWZpbmUgUF90bXBkaXIJIi90bXAiCisjZW5kaWYKKworCisvKiBHZXQgdGhlIHZhbHVlczoKKyAgIExfdG1wbmFtCUhvdyBsb25nIGFuIGFycmF5IG9mIGNoYXJzIG11c3QgYmUgdG8gYmUgcGFzc2VkIHRvIGB0bXBuYW0nLgorICAgVE1QX01BWAlUaGUgbWluaW11bSBudW1iZXIgb2YgdW5pcXVlIGZpbGVuYW1lcyBnZW5lcmF0ZWQgYnkgdG1wbmFtCisgICAJCShhbmQgdGVtcG5hbSB3aGVuIGl0IHVzZXMgdG1wbmFtJ3MgbmFtZSBzcGFjZSksCisJCW9yIHRlbXBuYW0gKHRoZSB0d28gYXJlIHNlcGFyYXRlKS4KKyAgIExfY3Rlcm1pZAlIb3cgbG9uZyBhbiBhcnJheSB0byBwYXNzIHRvIGBjdGVybWlkJy4KKyAgIExfY3VzZXJpZAlIb3cgbG9uZyBhbiBhcnJheSB0byBwYXNzIHRvIGBjdXNlcmlkJy4KKyAgIEZPUEVOX01BWAlNaW5pbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuIGF0IG9uY2UuCisgICBGSUxFTkFNRV9NQVgJTWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZS4gICovCisjaW5jbHVkZSA8Yml0cy9zdGRpb19saW0uaD4KKworCisvKiBTdGFuZGFyZCBzdHJlYW1zLiAgKi8KK2V4dGVybiBzdHJ1Y3QgX0lPX0ZJTEUgKnN0ZGluOwkJLyogU3RhbmRhcmQgaW5wdXQgc3RyZWFtLiAgKi8KK2V4dGVybiBzdHJ1Y3QgX0lPX0ZJTEUgKnN0ZG91dDsJCS8qIFN0YW5kYXJkIG91dHB1dCBzdHJlYW0uICAqLworZXh0ZXJuIHN0cnVjdCBfSU9fRklMRSAqc3RkZXJyOwkJLyogU3RhbmRhcmQgZXJyb3Igb3V0cHV0IHN0cmVhbS4gICovCisvKiBDODkvQzk5IHNheSB0aGV5J3JlIG1hY3Jvcy4gIE1ha2UgdGhlbSBoYXBweS4gICovCisjZGVmaW5lIHN0ZGluIHN0ZGluCisjZGVmaW5lIHN0ZG91dCBzdGRvdXQKKyNkZWZpbmUgc3RkZXJyIHN0ZGVycgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJlbW92ZSBmaWxlIEZJTEVOQU1FLiAgKi8KK2V4dGVybiBpbnQgcmVtb3ZlIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIF9fVEhST1c7CisvKiBSZW5hbWUgZmlsZSBPTEQgdG8gTkVXLiAgKi8KK2V4dGVybiBpbnQgcmVuYW1lIChfX2NvbnN0IGNoYXIgKl9fb2xkLCBfX2NvbnN0IGNoYXIgKl9fbmV3KSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBSZW5hbWUgZmlsZSBPTEQgcmVsYXRpdmUgdG8gT0xERkQgdG8gTkVXIHJlbGF0aXZlIHRvIE5FV0ZELiAgKi8KK2V4dGVybiBpbnQgcmVuYW1lYXQgKGludCBfX29sZGZkLCBfX2NvbnN0IGNoYXIgKl9fb2xkLCBpbnQgX19uZXdmZCwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fbmV3KSBfX1RIUk9XOworI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIG9wZW4gaXQgcmVhZC93cml0ZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gRklMRSAqdG1wZmlsZSAodm9pZCkgX193dXI7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gRklMRSAqX19SRURJUkVDVCAodG1wZmlsZSwgKHZvaWQpLCB0bXBmaWxlNjQpIF9fd3VyOworIyBlbHNlCisjICBkZWZpbmUgdG1wZmlsZSB0bXBmaWxlNjQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBGSUxFICp0bXBmaWxlNjQgKHZvaWQpIF9fd3VyOworI2VuZGlmCisKKy8qIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGVuYW1lLiAgKi8KK2V4dGVybiBjaGFyICp0bXBuYW0gKGNoYXIgKl9fcykgX19USFJPVyBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFRoaXMgaXMgdGhlIHJlZW50cmFudCB2YXJpYW50IG9mIGB0bXBuYW0nLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcworICAgdGhhdCBpdCBkb2VzIG5vdCBhbGxvdyBTIHRvIGJlIE5VTEwuICAqLworZXh0ZXJuIGNoYXIgKnRtcG5hbV9yIChjaGFyICpfX3MpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlbmFtZSB1c2luZyB1cCB0byBmaXZlIGNoYXJhY3RlcnMgb2YgUEZYCisgICBpZiBpdCBpcyBub3QgTlVMTC4gIFRoZSBkaXJlY3RvcnkgdG8gcHV0IHRoaXMgZmlsZSBpbiBpcyBzZWFyY2hlZCBmb3IKKyAgIGFzIGZvbGxvd3M6IEZpcnN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiVE1QRElSIiBpcyBjaGVja2VkLgorICAgSWYgaXQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3cml0YWJsZSBkaXJlY3RvcnksIHRoYXQgZGlyZWN0b3J5IGlzIHVzZWQuCisgICBJZiBub3QgYW5kIGlmIERJUiBpcyBub3QgTlVMTCwgdGhhdCB2YWx1ZSBpcyBjaGVja2VkLiAgSWYgdGhhdCBmYWlscywKKyAgIFBfdG1wZGlyIGlzIHRyaWVkIGFuZCBmaW5hbGx5ICIvdG1wIi4gIFRoZSBzdG9yYWdlIGZvciB0aGUgZmlsZW5hbWUKKyAgIGlzIGFsbG9jYXRlZCBieSBgbWFsbG9jJy4gICovCitleHRlcm4gY2hhciAqdGVtcG5hbSAoX19jb25zdCBjaGFyICpfX2RpciwgX19jb25zdCBjaGFyICpfX3BmeCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ2xvc2UgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmNsb3NlIChGSUxFICpfX3N0cmVhbSk7CisvKiBGbHVzaCBTVFJFQU0sIG9yIGFsbCBzdHJlYW1zIGlmIFNUUkVBTSBpcyBOVUxMLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmZsdXNoIChGSUxFICpfX3N0cmVhbSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCByZXF1aXJlZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmZmx1c2hfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfR05VCisvKiBDbG9zZSBhbGwgc3RyZWFtcy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmY2xvc2VhbGwgKHZvaWQpOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIE9wZW4gYSBmaWxlIGFuZCBjcmVhdGUgYSBuZXcgc3RyZWFtIGZvciBpdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gRklMRSAqZm9wZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMpIF9fd3VyOworLyogT3BlbiBhIGZpbGUsIHJlcGxhY2luZyBhbiBleGlzdGluZyBzdHJlYW0gd2l0aCBpdC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gRklMRSAqZnJlb3BlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzLAorCQkgICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBGSUxFICpfX1JFRElSRUNUIChmb3BlbiwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZpbGVuYW1lLAorCQkJCSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcyksIGZvcGVuNjQpCisgIF9fd3VyOworZXh0ZXJuIEZJTEUgKl9fUkVESVJFQ1QgKGZyZW9wZW4sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKKwkJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcywKKwkJCQkgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSwgZnJlb3BlbjY0KQorICBfX3d1cjsKKyMgZWxzZQorIyAgZGVmaW5lIGZvcGVuIGZvcGVuNjQKKyMgIGRlZmluZSBmcmVvcGVuIGZyZW9wZW42NAorIyBlbmRpZgorI2VuZGlmCitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBGSUxFICpmb3BlbjY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKKwkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMpIF9fd3VyOworZXh0ZXJuIEZJTEUgKmZyZW9wZW42NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcywKKwkJCUZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9QT1NJWAorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSB0aGF0IHJlZmVycyB0byBhbiBleGlzdGluZyBzeXN0ZW0gZmlsZSBkZXNjcmlwdG9yLiAgKi8KK2V4dGVybiBGSUxFICpmZG9wZW4gKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX0dOVQorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSB0aGF0IHJlZmVycyB0byB0aGUgZ2l2ZW4gbWFnaWMgY29va2llLAorICAgYW5kIHVzZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dC4gICovCitleHRlcm4gRklMRSAqZm9wZW5jb29raWUgKHZvaWQgKl9fcmVzdHJpY3QgX19tYWdpY19jb29raWUsCisJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVzLAorCQkJICBfSU9fY29va2llX2lvX2Z1bmN0aW9uc190IF9faW9fZnVuY3MpIF9fVEhST1cgX193dXI7CisKKy8qIENyZWF0ZSBhIG5ldyBzdHJlYW0gdGhhdCByZWZlcnMgdG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KK2V4dGVybiBGSUxFICpmbWVtb3BlbiAodm9pZCAqX19zLCBzaXplX3QgX19sZW4sIF9fY29uc3QgY2hhciAqX19tb2RlcykKKyAgX19USFJPVyBfX3d1cjsKKworLyogT3BlbiBhIHN0cmVhbSB0aGF0IHdyaXRlcyBpbnRvIGEgbWFsbG9jJ2QgYnVmZmVyIHRoYXQgaXMgZXhwYW5kZWQgYXMKKyAgIG5lY2Vzc2FyeS4gICpCVUZMT0MgYW5kICpTSVpFTE9DIGFyZSB1cGRhdGVkIHdpdGggdGhlIGJ1ZmZlcidzIGxvY2F0aW9uCisgICBhbmQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gb24gZmZsdXNoIG9yIGZjbG9zZS4gICovCitleHRlcm4gRklMRSAqb3Blbl9tZW1zdHJlYW0gKGNoYXIgKipfX2J1ZmxvYywgc2l6ZV90ICpfX3NpemVsb2MpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIElmIEJVRiBpcyBOVUxMLCBtYWtlIFNUUkVBTSB1bmJ1ZmZlcmVkLgorICAgRWxzZSBtYWtlIGl0IHVzZSBidWZmZXIgQlVGLCBvZiBzaXplIEJVRlNJWi4gICovCitleHRlcm4gdm9pZCBzZXRidWYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1c7CisvKiBNYWtlIFNUUkVBTSB1c2UgYnVmZmVyaW5nIG1vZGUgTU9ERS4KKyAgIElmIEJVRiBpcyBub3QgTlVMTCwgdXNlIE4gYnl0ZXMgb2YgaXQgZm9yIGJ1ZmZlcmluZzsKKyAgIGVsc2UgYWxsb2NhdGUgYW4gaW50ZXJuYWwgYnVmZmVyIE4gYnl0ZXMgbG9uZy4gICovCitleHRlcm4gaW50IHNldHZidWYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCSAgICBpbnQgX19tb2Rlcywgc2l6ZV90IF9fbikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmCV9fVVNFX0JTRAorLyogSWYgQlVGIGlzIE5VTEwsIG1ha2UgU1RSRUFNIHVuYnVmZmVyZWQuCisgICBFbHNlIG1ha2UgaXQgdXNlIFNJWkUgYnl0ZXMgb2YgQlVGIGZvciBidWZmZXJpbmcuICAqLworZXh0ZXJuIHZvaWQgc2V0YnVmZmVyIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgICAgICAgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworLyogTWFrZSBTVFJFQU0gbGluZS1idWZmZXJlZC4gICovCitleHRlcm4gdm9pZCBzZXRsaW5lYnVmIChGSUxFICpfX3N0cmVhbSkgX19USFJPVzsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBzdGRvdXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKTsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gUy4gICovCitleHRlcm4gaW50IHNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fVEhST1c7CisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gUyBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX0dfdmFfbGlzdCBfX2FyZyk7CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dCBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXJnKTsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gUyBmcm9tIGFyZ3VtZW50IGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX0dfdmFfbGlzdCBfX2FyZykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IGRlZmluZWQgX19VU0VfVU5JWDk4CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIE1heGltdW0gY2hhcnMgb2Ygb3V0cHV0IHRvIHdyaXRlIGluIE1BWExFTi4gICovCitleHRlcm4gaW50IHNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworCitleHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX21heGxlbiwKKwkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCAwKSkpOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggYG1hbGxvYycuCisgICBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIGluICpQVFIuICAqLworZXh0ZXJuIGludCB2YXNwcmludGYgKGNoYXIgKipfX3Jlc3RyaWN0IF9fcHRyLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mLAorCQkgICAgICBfR192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX2FzcHJpbnRmIChjaGFyICoqX19yZXN0cmljdCBfX3B0ciwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpIF9fd3VyOworZXh0ZXJuIGludCBhc3ByaW50ZiAoY2hhciAqKl9fcmVzdHJpY3QgX19wdHIsCisJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm10LCAuLi4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDIsIDMpKSkgX193dXI7CisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB2ZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwKKwkJICAgICBfR192YV9saXN0IF9fYXJnKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMCkpKTsKK2V4dGVybiBpbnQgZHByaW50ZiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmc2NhbmYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSBfX3d1cjsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gc3RkaW4uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fd3VyOworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTLiAgKi8KK2V4dGVybiBpbnQgc3NjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgJiYgKCFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVCkgXAorICAgICYmIChkZWZpbmVkIF9fU1RSSUNUX0FOU0lfXyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisjIGlmZGVmIF9fUkVESVJFQ1QKKy8qIEZvciBzdHJpY3QgSVNPIEM5OSBvciBQT1NJWCBjb21wbGlhbmNlIGRpc2FsbG93ICVhcywgJWFTIGFuZCAlYVsKKyAgIEdOVSBleHRlbnNpb24gd2hpY2ggY29uZmxpY3RzIHdpdGggdmFsaWQgJWEgZm9sbG93ZWQgYnkgbGV0dGVyCisgICBzLCBTIG9yIFsuICAqLworZXh0ZXJuIGludCBfX1JFRElSRUNUIChmc2NhbmYsIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJICAgICAgIF9faXNvYzk5X2ZzY2FuZikgX193dXI7CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHNjYW5mLCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pLAorCQkgICAgICAgX19pc29jOTlfc2NhbmYpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChzc2NhbmYsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJCV9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJICAgICAgIF9faXNvYzk5X3NzY2FuZikgX19USFJPVzsKKyMgZWxzZQorZXh0ZXJuIGludCBfX2lzb2M5OV9mc2NhbmYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fd3VyOworZXh0ZXJuIGludCBfX2lzb2M5OV9zY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fd3VyOworZXh0ZXJuIGludCBfX2lzb2M5OV9zc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIF9fVEhST1c7CisjICBkZWZpbmUgZnNjYW5mIF9faXNvYzk5X2ZzY2FuZgorIyAgZGVmaW5lIHNjYW5mIF9faXNvYzk5X3NjYW5mCisjICBkZWZpbmUgc3NjYW5mIF9faXNvYzk5X3NzY2FuZgorIyBlbmRpZgorI2VuZGlmCisKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmCV9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFMgaW50byBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZmc2NhbmYgKEZJTEUgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICBfR192YV9saXN0IF9fYXJnKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAyLCAwKSkpIF9fd3VyOworCisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIHN0ZGluIGludG8gYXJndW1lbnQgbGlzdCBBUkcuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB2c2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX0dfdmFfbGlzdCBfX2FyZykKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMSwgMCkpKSBfX3d1cjsKKworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTIGludG8gYXJndW1lbnQgbGlzdCBBUkcuICAqLworZXh0ZXJuIGludCB2c3NjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfR192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3NjYW5mX18sIDIsIDApKSk7CisKKyMgaWYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAgJiYgKCFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVCkgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyAgaWZkZWYgX19SRURJUkVDVAorLyogRm9yIHN0cmljdCBJU08gQzk5IG9yIFBPU0lYIGNvbXBsaWFuY2UgZGlzYWxsb3cgJWFzLCAlYVMgYW5kICVhWworICAgR05VIGV4dGVuc2lvbiB3aGljaCBjb25mbGljdHMgd2l0aCB2YWxpZCAlYSBmb2xsb3dlZCBieSBsZXR0ZXIKKyAgIHMsIFMgb3IgWy4gICovCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHZmc2NhbmYsCisJCSAgICAgICAoRklMRSAqX19yZXN0cmljdCBfX3MsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9HX3ZhX2xpc3QgX19hcmcpLAorCQkgICAgICAgX19pc29jOTlfdmZzY2FuZikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMiwgMCkpKSBfX3d1cjsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAodnNjYW5mLCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCV9HX3ZhX2xpc3QgX19hcmcpLCBfX2lzb2M5OV92ZnNjYW5mKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAxLCAwKSkpIF9fd3VyOworZXh0ZXJuIGludCBfX1JFRElSRUNUICh2c3NjYW5mLAorCQkgICAgICAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9HX3ZhX2xpc3QgX19hcmcpLAorCQkgICAgICAgX19pc29jOTlfdnNzY2FuZikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAyLCAwKSkpOworIyAgZWxzZQorZXh0ZXJuIGludCBfX2lzb2M5OV92ZnNjYW5mIChGSUxFICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgICBfR192YV9saXN0IF9fYXJnKSBfX3d1cjsKK2V4dGVybiBpbnQgX19pc29jOTlfdnNjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgX0dfdmFfbGlzdCBfX2FyZykgX193dXI7CitleHRlcm4gaW50IF9faXNvYzk5X3Zzc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCSAgICAgX0dfdmFfbGlzdCBfX2FyZykgX19USFJPVzsKKyMgICBkZWZpbmUgdmZzY2FuZiBfX2lzb2M5OV92ZnNjYW5mCisjICAgZGVmaW5lIHZzY2FuZiBfX2lzb2M5OV92c3NjYW5mCisjICAgZGVmaW5lIHZzc2NhbmYgX19pc29jOTlfdnNzY2FuZgorIyAgZW5kaWYKKyMgZW5kaWYKKworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmIC8qIFVzZSBJU08gQzl4LiAgKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBTVFJFQU0uCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZnZXRjIChGSUxFICpfX3N0cmVhbSk7CitleHRlcm4gaW50IGdldGMgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogUmVhZCBhIGNoYXJhY3RlciBmcm9tIHN0ZGluLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0Y2hhciAodm9pZCk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKy8qIFRoZSBDIHN0YW5kYXJkIGV4cGxpY2l0bHkgc2F5cyB0aGlzIGlzIGEgbWFjcm8sIHNvIHdlIGFsd2F5cyBkbyB0aGUKKyAgIG9wdGltaXphdGlvbiBmb3IgaXQuICAqLworI2RlZmluZSBnZXRjKF9mcCkgX0lPX2dldGMgKF9mcCkKKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGNfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiBpbnQgZ2V0Y2hhcl91bmxvY2tlZCAodm9pZCk7CisjZW5kaWYgLyogVXNlIFBPU0lYIG9yIE1JU0MuICAqLworCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldGNfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZiAvKiBVc2UgTUlTQy4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBTVFJFQU0uCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4KKworICAgVGhlc2UgZnVuY3Rpb25zIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiBpbnQgcHV0YyAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pOworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBzdGRvdXQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRjaGFyIChpbnQgX19jKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogVGhlIEMgc3RhbmRhcmQgZXhwbGljaXRseSBzYXlzIHRoaXMgY2FuIGJlIGEgbWFjcm8sCisgICBzbyB3ZSBhbHdheXMgZG8gdGhlIG9wdGltaXphdGlvbiBmb3IgaXQuICAqLworI2RlZmluZSBwdXRjKF9jaCwgX2ZwKSBfSU9fcHV0YyAoX2NoLCBfZnApCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbiB3aGVuIGxvY2tpbmcgaXMgbm90IG5lY2Vzc2FyeS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pOworI2VuZGlmIC8qIFVzZSBNSVNDLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCisvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBQT1NJWC4xOjE5OTYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiBpbnQgcHV0Y2hhcl91bmxvY2tlZCAoaW50IF9fYyk7CisjZW5kaWYgLyogVXNlIFBPU0lYIG9yIE1JU0MuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9NSVNDIFwKKyAgICB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorLyogR2V0IGEgd29yZCAoaW50KSBmcm9tIFNUUkVBTS4gICovCitleHRlcm4gaW50IGdldHcgKEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgYSB3b3JkIChpbnQpIHRvIFNUUkVBTS4gICovCitleHRlcm4gaW50IHB1dHcgKGludCBfX3csIEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogR2V0IGEgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZyBvZiBmaW5pdGUgbGVuZ3RoIGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBjaGFyICpmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCisgICAgIF9fd3VyOworCisvKiBHZXQgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gc3RkaW4sIHJlbW92aW5nIHRoZSBuZXdsaW5lLgorICAgRE8gTk9UIFVTRSBUSElTIEZVTkNUSU9OISEgIFRoZXJlIGlzIG5vIGxpbWl0IG9uIGhvdyBtdWNoIGl0IHdpbGwgcmVhZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gY2hhciAqZ2V0cyAoY2hhciAqX19zKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIGFzIGBmZ2V0cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGNoYXIgKmZnZXRzX3VubG9ja2VkIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwKKwkJCSAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CisjZW5kaWYKKworCisjaWZkZWYJX19VU0VfR05VCisvKiBSZWFkIHVwIHRvIChhbmQgaW5jbHVkaW5nKSBhIERFTElNSVRFUiBmcm9tIFNUUkVBTSBpbnRvICpMSU5FUFRSCisgICAoYW5kIG51bGwtdGVybWluYXRlIGl0KS4gKkxJTkVQVFIgaXMgYSBwb2ludGVyIHJldHVybmVkIGZyb20gbWFsbG9jIChvcgorICAgTlVMTCksIHBvaW50aW5nIHRvICpOIGNoYXJhY3RlcnMgb2Ygc3BhY2UuICBJdCBpcyByZWFsbG9jJ2QgYXMKKyAgIG5lY2Vzc2FyeS4gIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgKG5vdCBpbmNsdWRpbmcgdGhlCisgICBudWxsIHRlcm1pbmF0b3IpLCBvciAtMSBvbiBlcnJvciBvciBFT0YuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIF9JT19zc2l6ZV90IF9fZ2V0ZGVsaW0gKGNoYXIgKipfX3Jlc3RyaWN0IF9fbGluZXB0ciwKKwkJCSAgICAgICBzaXplX3QgKl9fcmVzdHJpY3QgX19uLCBpbnQgX19kZWxpbWl0ZXIsCisJCQkgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CitleHRlcm4gX0lPX3NzaXplX3QgZ2V0ZGVsaW0gKGNoYXIgKipfX3Jlc3RyaWN0IF9fbGluZXB0ciwKKwkJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9fbiwgaW50IF9fZGVsaW1pdGVyLAorCQkJICAgICBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKworLyogTGlrZSBgZ2V0ZGVsaW0nLCBidXQgcmVhZHMgdXAgdG8gYSBuZXdsaW5lLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gX0lPX3NzaXplX3QgZ2V0bGluZSAoY2hhciAqKl9fcmVzdHJpY3QgX19saW5lcHRyLAorCQkJICAgIHNpemVfdCAqX19yZXN0cmljdCBfX24sCisJCQkgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgX193dXI7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFdyaXRlIGEgc3RyaW5nIHRvIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0cyAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGEgc3RyaW5nLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUsIHRvIHN0ZG91dC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwdXRzIChfX2NvbnN0IGNoYXIgKl9fcyk7CisKKworLyogUHVzaCBhIGNoYXJhY3RlciBiYWNrIG9udG8gdGhlIGlucHV0IGJ1ZmZlciBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdW5nZXRjIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSk7CisKKworLyogUmVhZCBjaHVua3Mgb2YgZ2VuZXJpYyBkYXRhIGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc2l6ZV90IGZyZWFkICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAorCQkgICAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworLyogV3JpdGUgY2h1bmtzIG9mIGdlbmVyaWMgZGF0YSB0byBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBzaXplX3QgZndyaXRlIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCisJCSAgICAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIGFzIGBmcHV0cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0c191bmxvY2tlZCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCSAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGYXN0ZXIgdmVyc2lvbnMgd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHNpemVfdCBmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgICAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIF9fd3VyOworZXh0ZXJuIHNpemVfdCBmd3JpdGVfdW5sb2NrZWQgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKKwkJCSAgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogU2VlayB0byBhIGNlcnRhaW4gcG9zaXRpb24gb24gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnNlZWsgKEZJTEUgKl9fc3RyZWFtLCBsb25nIGludCBfX29mZiwgaW50IF9fd2hlbmNlKTsKKy8qIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGxvbmcgaW50IGZ0ZWxsIChGSUxFICpfX3N0cmVhbSkgX193dXI7CisvKiBSZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgcmV3aW5kIChGSUxFICpfX3N0cmVhbSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKy8qIFRoZSBTaW5nbGUgVW5peCBTcGVjaWZpY2F0aW9uLCBWZXJzaW9uIDIsIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSwKKyAgIG1vcmUgYWRlcXVhdGUgaW50ZXJmYWNlIGZvciB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSB3aGljaCBkZWFsIHdpdGgKKyAgIGZpbGUgb2Zmc2V0LiAgYGxvbmcgaW50JyBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuICBUaGVzZSBkZWZpbml0aW9ucworICAgYXJlIG9yaWdpbmFsbHkgZGVmaW5lZCBpbiB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IEFQSS4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0xBUkdFRklMRSB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIFNlZWsgdG8gYSBjZXJ0YWluIHBvc2l0aW9uIG9uIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZzZWVrbyAoRklMRSAqX19zdHJlYW0sIF9fb2ZmX3QgX19vZmYsIGludCBfX3doZW5jZSk7CisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBfX29mZl90IGZ0ZWxsbyAoRklMRSAqX19zdHJlYW0pIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZzZWVrbywKKwkJICAgICAgIChGSUxFICpfX3N0cmVhbSwgX19vZmY2NF90IF9fb2ZmLCBpbnQgX193aGVuY2UpLAorCQkgICAgICAgZnNlZWtvNjQpOworZXh0ZXJuIF9fb2ZmNjRfdCBfX1JFRElSRUNUIChmdGVsbG8sIChGSUxFICpfX3N0cmVhbSksIGZ0ZWxsbzY0KTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZnNlZWtvIGZzZWVrbzY0CisjICAgZGVmaW5lIGZ0ZWxsbyBmdGVsbG82NAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorLyogR2V0IFNUUkVBTSdzIHBvc2l0aW9uLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZmdldHBvcyAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvc190ICpfX3Jlc3RyaWN0IF9fcG9zKTsKKy8qIFNldCBTVFJFQU0ncyBwb3NpdGlvbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGZzZXRwb3MgKEZJTEUgKl9fc3RyZWFtLCBfX2NvbnN0IGZwb3NfdCAqX19wb3MpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVAorZXh0ZXJuIGludCBfX1JFRElSRUNUIChmZ2V0cG9zLCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwKKwkJCQkgZnBvc190ICpfX3Jlc3RyaWN0IF9fcG9zKSwgZmdldHBvczY0KTsKK2V4dGVybiBpbnQgX19SRURJUkVDVCAoZnNldHBvcywKKwkJICAgICAgIChGSUxFICpfX3N0cmVhbSwgX19jb25zdCBmcG9zX3QgKl9fcG9zKSwgZnNldHBvczY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIGZnZXRwb3MgZmdldHBvczY0CisjICBkZWZpbmUgZnNldHBvcyBmc2V0cG9zNjQKKyMgZW5kaWYKKyNlbmRpZgorX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnNlZWtvNjQgKEZJTEUgKl9fc3RyZWFtLCBfX29mZjY0X3QgX19vZmYsIGludCBfX3doZW5jZSk7CitleHRlcm4gX19vZmY2NF90IGZ0ZWxsbzY0IChGSUxFICpfX3N0cmVhbSkgX193dXI7CitleHRlcm4gaW50IGZnZXRwb3M2NCAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvczY0X3QgKl9fcmVzdHJpY3QgX19wb3MpOworZXh0ZXJuIGludCBmc2V0cG9zNjQgKEZJTEUgKl9fc3RyZWFtLCBfX2NvbnN0IGZwb3M2NF90ICpfX3Bvcyk7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDbGVhciB0aGUgZXJyb3IgYW5kIEVPRiBpbmRpY2F0b3JzIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIHZvaWQgY2xlYXJlcnIgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworLyogUmV0dXJuIHRoZSBFT0YgaW5kaWNhdG9yIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIGludCBmZW9mIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKKy8qIFJldHVybiB0aGUgZXJyb3IgaW5kaWNhdG9yIGZvciBTVFJFQU0uICAqLworZXh0ZXJuIGludCBmZXJyb3IgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfTUlTQworLyogRmFzdGVyIHZlcnNpb25zIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuICAqLworZXh0ZXJuIHZvaWQgY2xlYXJlcnJfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XOworZXh0ZXJuIGludCBmZW9mX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKK2V4dGVybiBpbnQgZmVycm9yX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUHJpbnQgYSBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhbHVlIG9mIGVycm5vLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHBlcnJvciAoX19jb25zdCBjaGFyICpfX3MpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBQcm92aWRlIHRoZSBkZWNsYXJhdGlvbnMgZm9yIGBzeXNfZXJybGlzdCcgYW5kIGBzeXNfbmVycicgaWYgdGhleQorICAgYXJlIGF2YWlsYWJsZSBvbiB0aGlzIHN5c3RlbS4gIEV2ZW4gaWYgYXZhaWxhYmxlLCB0aGVzZSB2YXJpYWJsZXMKKyAgIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4gIFRoZSBgc3RyZXJyb3InIGZ1bmN0aW9uIHByb3ZpZGVzCisgICBhbGwgdGhlIG5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5LiAgKi8KKyNpbmNsdWRlIDxiaXRzL3N5c19lcnJsaXN0Lmg+CisKKworI2lmZGVmCV9fVVNFX1BPU0lYCisvKiBSZXR1cm4gdGhlIHN5c3RlbSBmaWxlIGRlc2NyaXB0b3IgZm9yIFNUUkVBTS4gICovCitleHRlcm4gaW50IGZpbGVubyAoRklMRSAqX19zdHJlYW0pIF9fVEhST1cgX193dXI7CisjZW5kaWYgLyogVXNlIFBPU0lYLiAgKi8KKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIEZhc3RlciB2ZXJzaW9uIHdoZW4gbG9ja2luZyBpcyBub3QgcmVxdWlyZWQuICAqLworZXh0ZXJuIGludCBmaWxlbm9fdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSBfX1RIUk9XIF9fd3VyOworI2VuZGlmCisKKworI2lmIChkZWZpbmVkIF9fVVNFX1BPU0lYMiB8fCBkZWZpbmVkIF9fVVNFX1NWSUQgIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IFwKKyAgICAgZGVmaW5lZCBfX1VTRV9NSVNDKQorLyogQ3JlYXRlIGEgbmV3IHN0cmVhbSBjb25uZWN0ZWQgdG8gYSBwaXBlIHJ1bm5pbmcgdGhlIGdpdmVuIGNvbW1hbmQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIEZJTEUgKnBvcGVuIChfX2NvbnN0IGNoYXIgKl9fY29tbWFuZCwgX19jb25zdCBjaGFyICpfX21vZGVzKSBfX3d1cjsKKworLyogQ2xvc2UgYSBzdHJlYW0gb3BlbmVkIGJ5IHBvcGVuIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBvZiBpdHMgY2hpbGQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwY2xvc2UgKEZJTEUgKl9fc3RyZWFtKTsKKyNlbmRpZgorCisKKyNpZmRlZglfX1VTRV9QT1NJWAorLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gY2hhciAqY3Rlcm1pZCAoY2hhciAqX19zKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBQT1NJWC4gICovCisKKworI2lmZGVmIF9fVVNFX1hPUEVOCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdXNlci4gICovCitleHRlcm4gY2hhciAqY3VzZXJpZCAoY2hhciAqX19zKTsKKyNlbmRpZiAvKiBVc2UgWC9PcGVuLCBidXQgbm90IGlzc3VlIDYuICAqLworCisKKyNpZmRlZglfX1VTRV9HTlUKK3N0cnVjdCBvYnN0YWNrOwkJCS8qIFNlZSA8b2JzdGFjay5oPi4gICovCisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYW4gb2JzdGFjay4gICovCitleHRlcm4gaW50IG9ic3RhY2tfcHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKK2V4dGVybiBpbnQgb2JzdGFja192cHJpbnRmIChzdHJ1Y3Qgb2JzdGFjayAqX19yZXN0cmljdCBfX29ic3RhY2ssCisJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgIF9HX3ZhX2xpc3QgX19hcmdzKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpOworI2VuZGlmIC8qIFVzZSBHTlUuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX1BPU0lYIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gUE9TSVguMToxOTk2LiAgKi8KKworLyogQWNxdWlyZSBvd25lcnNoaXAgb2YgU1RSRUFNLiAgKi8KK2V4dGVybiB2b2lkIGZsb2NrZmlsZSAoRklMRSAqX19zdHJlYW0pIF9fVEhST1c7CisKKy8qIFRyeSB0byBhY3F1aXJlIG93bmVyc2hpcCBvZiBTVFJFQU0gYnV0IGRvIG5vdCBibG9jayBpZiBpdCBpcyBub3QKKyAgIHBvc3NpYmxlLiAgKi8KK2V4dGVybiBpbnQgZnRyeWxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkgX19USFJPVyBfX3d1cjsKKworLyogUmVsaW5xdWlzaCB0aGUgb3duZXJzaGlwIGdyYW50ZWQgZm9yIFNUUkVBTS4gICovCitleHRlcm4gdm9pZCBmdW5sb2NrZmlsZSAoRklMRSAqX19zdHJlYW0pIF9fVEhST1c7CisjZW5kaWYgLyogUE9TSVggfHwgbWlzYyAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9YT1BFTjJLICYmICFkZWZpbmVkIF9fVVNFX0dOVQorLyogVGhlIFgvT3BlbiBzdGFuZGFyZCByZXF1aXJlcyBzb21lIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIHRvIGJlCisgICBkZWNsYXJlZCBoZXJlIHdoaWNoIGRvIG5vdCBiZWxvbmcgaW50byB0aGlzIGhlYWRlci4gIEJ1dCB3ZSBoYXZlIHRvCisgICBmb2xsb3cuICBJbiBHTlUgbW9kZSB3ZSBkb24ndCBkbyB0aGlzIG5vbnNlbnNlLiAgKi8KKyMgZGVmaW5lIF9fbmVlZF9nZXRvcHQKKyMgaW5jbHVkZSA8Z2V0b3B0Lmg+CisjZW5kaWYJLyogWC9PcGVuLCBidXQgbm90IGlzc3VlIDYgYW5kIG5vdCBmb3IgR05VLiAgKi8KKworLyogSWYgd2UgYXJlIGNvbXBpbGluZyB3aXRoIG9wdGltaXppbmcgcmVhZCB0aGlzIGZpbGUuICBJdCBjb250YWlucworICAgc2V2ZXJhbCBvcHRpbWl6aW5nIGlubGluZSBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4gICovCisjaWZkZWYgX19VU0VfRVhURVJOX0lOTElORVMKKyMgaW5jbHVkZSA8Yml0cy9zdGRpby5oPgorI2VuZGlmCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjIGluY2x1ZGUgPGJpdHMvc3RkaW8yLmg+CisjZW5kaWYKKyNpZmRlZiBfX0xEQkxfQ09NUEFUCisjIGluY2x1ZGUgPGJpdHMvc3RkaW8tbGRibC5oPgorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiA8c3RkaW8uaD4gaW5jbHVkZWQuICAqLworCisjZW5kaWYgLyogIV9TVERJT19IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGlvX2V4dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpb19leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QxMmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zdGRpb19leHQuaApAQCAtMCwwICsxLDg3IEBACisvKiBGdW5jdGlvbnMgdG8gYWNjZXNzIEZJTEUgc3RydWN0dXJlIGludGVybmFscy4KKyAgIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBoZWFkZXIgY29udGFpbnMgdGhlIHNhbWUgZGVmaW5pdGlvbnMgYXMgdGhlIGhlYWRlciBvZiB0aGUgc2FtZSBuYW1lCisgICBvbiBTdW4ncyBTb2xhcmlzIE9TLiAgKi8KKworI2lmbmRlZiBfU1RESU9fRVhUX0gKKyNkZWZpbmUgX1NURElPX0VYVF9ICTEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2VudW0KK3sKKyAgLyogUXVlcnkgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9ja2luZyBzdGF0dXMuICAqLworICBGU0VUTE9DS0lOR19RVUVSWSA9IDAsCisjZGVmaW5lIEZTRVRMT0NLSU5HX1FVRVJZCUZTRVRMT0NLSU5HX1FVRVJZCisgIC8qIFRoZSBsaWJyYXJ5IHByb3RlY3RzIGFsbCB1c2VzIG9mIHRoZSBzdHJlYW0gZnVuY3Rpb25zLCBleGNlcHQgZm9yCisgICAgIHVzZXMgb2YgdGhlICpfdW5sb2NrZWQgZnVuY3Rpb25zLCBieSBjYWxscyBlcXVpdmFsZW50IHRvIGZsb2NrZmlsZSgpLiAgKi8KKyAgRlNFVExPQ0tJTkdfSU5URVJOQUwsCisjZGVmaW5lIEZTRVRMT0NLSU5HX0lOVEVSTkFMCUZTRVRMT0NLSU5HX0lOVEVSTkFMCisgIC8qIFRoZSB1c2VyIHdpbGwgdGFrZSBjYXJlIG9mIGxvY2tpbmcuICAqLworICBGU0VUTE9DS0lOR19CWUNBTExFUgorI2RlZmluZSBGU0VUTE9DS0lOR19CWUNBTExFUglGU0VUTE9DS0lOR19CWUNBTExFUgorfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG9mIEZQIGluIGJ5dGVzIGN1cnJlbnRseSBpbiB1c2UgYnkKKyAgIHRoZSBnaXZlbiBzdHJlYW0uICAqLworZXh0ZXJuIHNpemVfdCBfX2ZidWZzaXplIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisKKy8qIFJldHVybiBub24temVybyB2YWx1ZSBpZmYgdGhlIHN0cmVhbSBGUCBpcyBvcGVuZWQgcmVhZG9ubHksIG9yIGlmIHRoZQorICAgbGFzdCBvcGVyYXRpb24gb24gdGhlIHN0cmVhbSB3YXMgYSByZWFkIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IF9fZnJlYWRpbmcgKEZJTEUgKl9fZnApIF9fVEhST1c7CisKKy8qIFJldHVybiBub24temVybyB2YWx1ZSBpZmYgdGhlIHN0cmVhbSBGUCBpcyBvcGVuZWQgd3JpdGUtb25seSBvcgorICAgYXBwZW5kLW9ubHksIG9yIGlmIHRoZSBsYXN0IG9wZXJhdGlvbiBvbiB0aGUgc3RyZWFtIHdhcyBhIHdyaXRlCisgICBvcGVyYXRpb24uICAqLworZXh0ZXJuIGludCBfX2Z3cml0aW5nIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisKKy8qIFJldHVybiBub24temVybyB2YWx1ZSBpZmYgc3RyZWFtIEZQIGlzIG5vdCBvcGVuZWQgd3JpdGUtb25seSBvcgorICAgYXBwZW5kLW9ubHkuICAqLworZXh0ZXJuIGludCBfX2ZyZWFkYWJsZSAoRklMRSAqX19mcCkgX19USFJPVzsKKworLyogUmV0dXJuIG5vbi16ZXJvIHZhbHVlIGlmZiBzdHJlYW0gRlAgaXMgbm90IG9wZW5lZCByZWFkLW9ubHkuICAqLworZXh0ZXJuIGludCBfX2Z3cml0YWJsZSAoRklMRSAqX19mcCkgX19USFJPVzsKKworCisvKiBSZXR1cm4gbm9uLXplcm8gdmFsdWUgaWZmIHRoZSBzdHJlYW0gRlAgaXMgbGluZS1idWZmZXJlZC4gICovCitleHRlcm4gaW50IF9fZmxiZiAoRklMRSAqX19mcCkgX19USFJPVzsKKworCisvKiBEaXNjYXJkIGFsbCBwZW5kaW5nIGJ1ZmZlcmVkIEkvTyBvbiB0aGUgc3RyZWFtIEZQLiAgKi8KK2V4dGVybiB2b2lkIF9fZnB1cmdlIChGSUxFICpfX2ZwKSBfX1RIUk9XOworCisvKiBSZXR1cm4gYW1vdW50IG9mIG91dHB1dCBpbiBieXRlcyBwZW5kaW5nIG9uIGEgc3RyZWFtIEZQLiAgKi8KK2V4dGVybiBzaXplX3QgX19mcGVuZGluZyAoRklMRSAqX19mcCkgX19USFJPVzsKKworLyogRmx1c2ggYWxsIGxpbmUtYnVmZmVyZWQgZmlsZXMuICAqLworZXh0ZXJuIHZvaWQgX2ZsdXNobGJmICh2b2lkKTsKKworCisvKiBTZXQgbG9ja2luZyBzdGF0dXMgb2Ygc3RyZWFtIEZQIHRvIFRZUEUuICAqLworZXh0ZXJuIGludCBfX2ZzZXRsb2NraW5nIChGSUxFICpfX2ZwLCBpbnQgX190eXBlKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3RkaW9fZXh0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RkbGliLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmVhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0ZGxpYi5oCkBAIC0wLDAgKzEsODg1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwMywyMDA0LDIwMDUsMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4yMCBHZW5lcmFsIHV0aWxpdGllcwk8c3RkbGliLmg+CisgKi8KKworI2lmbmRlZglfU1RETElCX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBzaXplX3QsIHdjaGFyX3QgYW5kIE5VTEwgZnJvbSA8c3RkZGVmLmg+LiAgKi8KKyNkZWZpbmUJCV9fbmVlZF9zaXplX3QKKyNpZm5kZWYgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjIGRlZmluZQlfX25lZWRfd2NoYXJfdAorIyBkZWZpbmUJX19uZWVkX05VTEwKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpZm5kZWYgX19uZWVkX21hbGxvY19hbmRfY2FsbG9jCisjZGVmaW5lCV9TVERMSUJfSAkxCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9TWVNfV0FJVF9ICisvKiBYUEcgcmVxdWlyZXMgYSBmZXcgc3ltYm9scyBmcm9tIDxzeXMvd2FpdC5oPiBiZWluZyBkZWZpbmVkLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy93YWl0ZmxhZ3MuaD4KKyMgaW5jbHVkZSA8Yml0cy93YWl0c3RhdHVzLmg+CisKKyMgaWZkZWYgX19VU0VfQlNECisKKy8qIExvdHMgb2YgaGFpciB0byBhbGxvdyB0cmFkaXRpb25hbCBCU0QgdXNlIG9mIGB1bmlvbiB3YWl0JworICAgYXMgd2VsbCBhcyBQT1NJWC4xIHVzZSBvZiBgaW50JyBmb3IgdGhlIHN0YXR1cyB3b3JkLiAgKi8KKworIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfSU5UKHN0YXR1cykJCQkJCQkgICAgICBcCisgIChfX2V4dGVuc2lvbl9fICh7IHVuaW9uIHsgX190eXBlb2Yoc3RhdHVzKSBfX2luOyBpbnQgX19pOyB9IF9fdTsJICAgICAgXAorCQkgICAgX191Ll9faW4gPSAoc3RhdHVzKTsgX191Ll9faTsgfSkpCisjICBlbHNlCisjICAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoKihpbnQgKikgJihzdGF0dXMpKQorIyAgZW5kaWYKKworLyogVGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgdG8gYHdhaXQnLiAgVGhlIGZ1bmt5IHVuaW9uCisgICBjYXVzZXMgcmVkZWNsYXJhdGlvbnMgd2l0aCBldGhlciBgaW50IConIG9yIGB1bmlvbiB3YWl0IConIHRvIGJlCisgICBhbGxvd2VkIHdpdGhvdXQgY29tcGxhaW50LiAgX19XQUlUX1NUQVRVU19ERUZOIGlzIHRoZSB0eXBlIHVzZWQgaW4KKyAgIHRoZSBhY3R1YWwgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICAqLworCisjICBpZiAhZGVmaW5lZCBfX0dOVUNfXyB8fCBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTCXZvaWQgKgorIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4Jdm9pZCAqCisjICBlbHNlCisvKiBUaGlzIHdvcmtzIGluIEdDQyAyLjYuMSBhbmQgbGF0ZXIuICAqLwordHlwZWRlZiB1bmlvbgorICB7CisgICAgdW5pb24gd2FpdCAqX191cHRyOworICAgIGludCAqX19pcHRyOworICB9IF9fV0FJVF9TVEFUVVMgX19hdHRyaWJ1dGVfXyAoKF9fdHJhbnNwYXJlbnRfdW5pb25fXykpOworIyAgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4JaW50ICoKKyMgIGVuZGlmCisKKyMgZWxzZSAvKiBEb24ndCB1c2UgQlNELiAgKi8KKworIyAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoc3RhdHVzKQorIyAgZGVmaW5lIF9fV0FJVF9TVEFUVVMJCWludCAqCisjICBkZWZpbmUgX19XQUlUX1NUQVRVU19ERUZOCWludCAqCisKKyMgZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIERlZmluZSB0aGUgbWFjcm9zIDxzeXMvd2FpdC5oPiBhbHNvIHdvdWxkIGRlZmluZSB0aGlzIHdheS4gICovCisjIGRlZmluZSBXRVhJVFNUQVRVUyhzdGF0dXMpCV9fV0VYSVRTVEFUVVMoX19XQUlUX0lOVChzdGF0dXMpKQorIyBkZWZpbmUgV1RFUk1TSUcoc3RhdHVzKQlfX1dURVJNU0lHKF9fV0FJVF9JTlQoc3RhdHVzKSkKKyMgZGVmaW5lIFdTVE9QU0lHKHN0YXR1cykJX19XU1RPUFNJRyhfX1dBSVRfSU5UKHN0YXR1cykpCisjIGRlZmluZSBXSUZFWElURUQoc3RhdHVzKQlfX1dJRkVYSVRFRChfX1dBSVRfSU5UKHN0YXR1cykpCisjIGRlZmluZSBXSUZTSUdOQUxFRChzdGF0dXMpCV9fV0lGU0lHTkFMRUQoX19XQUlUX0lOVChzdGF0dXMpKQorIyBkZWZpbmUgV0lGU1RPUFBFRChzdGF0dXMpCV9fV0lGU1RPUFBFRChfX1dBSVRfSU5UKHN0YXR1cykpCisjIGlmZGVmIF9fV0lGQ09OVElOVUVECisjICBkZWZpbmUgV0lGQ09OVElOVUVEKHN0YXR1cykJX19XSUZDT05USU5VRUQoX19XQUlUX0lOVChzdGF0dXMpKQorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiBhbmQgPHN5cy93YWl0Lmg+IG5vdCBpbmNsdWRlZC4gICovCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuZWQgYnkgYGRpdicuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGludCBxdW90OwkJCS8qIFF1b3RpZW50LiAgKi8KKyAgICBpbnQgcmVtOwkJCS8qIFJlbWFpbmRlci4gICovCisgIH0gZGl2X3Q7CisKKy8qIFJldHVybmVkIGJ5IGBsZGl2Jy4gICovCisjaWZuZGVmIF9fbGRpdl90X2RlZmluZWQKK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICBsb25nIGludCBxdW90OwkJLyogUXVvdGllbnQuICAqLworICAgIGxvbmcgaW50IHJlbTsJCS8qIFJlbWFpbmRlci4gICovCisgIH0gbGRpdl90OworIyBkZWZpbmUgX19sZGl2X3RfZGVmaW5lZAkxCisjZW5kaWYKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5ICYmICFkZWZpbmVkIF9fbGxkaXZfdF9kZWZpbmVkCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJldHVybmVkIGJ5IGBsbGRpdicuICAqLworX19leHRlbnNpb25fXyB0eXBlZGVmIHN0cnVjdAorICB7CisgICAgbG9uZyBsb25nIGludCBxdW90OwkJLyogUXVvdGllbnQuICAqLworICAgIGxvbmcgbG9uZyBpbnQgcmVtOwkJLyogUmVtYWluZGVyLiAgKi8KKyAgfSBsbGRpdl90OworIyBkZWZpbmUgX19sbGRpdl90X2RlZmluZWQJMQorX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmCisKKworLyogVGhlIGxhcmdlc3QgbnVtYmVyIHJhbmQgd2lsbCByZXR1cm4gKHNhbWUgYXMgSU5UX01BWCkuICAqLworI2RlZmluZQlSQU5EX01BWAkyMTQ3NDgzNjQ3CisKKworLyogV2UgZGVmaW5lIHRoZXNlIHRoZSBzYW1lIGZvciBhbGwgbWFjaGluZXMuCisgICBDaGFuZ2VzIGZyb20gdGhpcyB0byB0aGUgb3V0c2lkZSB3b3JsZCBzaG91bGQgYmUgZG9uZSBpbiBgX2V4aXQnLiAgKi8KKyNkZWZpbmUJRVhJVF9GQUlMVVJFCTEJLyogRmFpbGluZyBleGl0IHN0YXR1cy4gICovCisjZGVmaW5lCUVYSVRfU1VDQ0VTUwkwCS8qIFN1Y2Nlc3NmdWwgZXhpdCBzdGF0dXMuICAqLworCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgbXVsdGlieXRlIGNoYXJhY3RlciBpbiB0aGUgY3VycmVudCBsb2NhbGUuICAqLworI2RlZmluZQlNQl9DVVJfTUFYCShfX2N0eXBlX2dldF9tYl9jdXJfbWF4ICgpKQorZXh0ZXJuIHNpemVfdCBfX2N0eXBlX2dldF9tYl9jdXJfbWF4ICh2b2lkKSBfX1RIUk9XIF9fd3VyOworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29udmVydCBhIHN0cmluZyB0byBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4gICovCitleHRlcm4gZG91YmxlIGF0b2YgKF9fY29uc3QgY2hhciAqX19ucHRyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIGludGVnZXIuICAqLworZXh0ZXJuIGludCBhdG9pIChfX2NvbnN0IGNoYXIgKl9fbnB0cikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpIF9fd3VyOworLyogQ29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgaW50ZWdlci4gICovCitleHRlcm4gbG9uZyBpbnQgYXRvbCAoX19jb25zdCBjaGFyICpfX25wdHIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19VU0VfSVNPQzk5IHx8IChkZWZpbmVkIF9fR0xJQkNfSEFWRV9MT05HX0xPTkcgJiYgZGVmaW5lZCBfX1VTRV9NSVNDKQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBsb25nIGludGVnZXIuICAqLworX19leHRlbnNpb25fXyBleHRlcm4gbG9uZyBsb25nIGludCBhdG9sbCAoX19jb25zdCBjaGFyICpfX25wdHIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmbG9hdGluZy1wb2ludCBudW1iZXIuICAqLworZXh0ZXJuIGRvdWJsZSBzdHJ0b2QgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmCV9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBMaWtld2lzZSBmb3IgYGZsb2F0JyBhbmQgYGxvbmcgZG91YmxlJyBzaXplcyBvZiBmbG9hdGluZy1wb2ludCBudW1iZXJzLiAgKi8KK2V4dGVybiBmbG9hdCBzdHJ0b2YgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCSAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCitleHRlcm4gbG9uZyBkb3VibGUgc3RydG9sZCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBpbnRlZ2VyLiAgKi8KK2V4dGVybiBsb25nIGludCBzdHJ0b2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQljaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgc3RydG91bCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmIGRlZmluZWQgX19HTElCQ19IQVZFX0xPTkdfTE9ORyAmJiBkZWZpbmVkIF9fVVNFX0JTRAorLyogQ29udmVydCBhIHN0cmluZyB0byBhIHF1YWR3b3JkIGludGVnZXIuICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgc3RydG9xIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisvKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIHF1YWR3b3JkIGludGVnZXIuICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91cSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworI2VuZGlmIC8qIEdDQyBhbmQgdXNlIEJTRC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCAoZGVmaW5lZCBfX0dMSUJDX0hBVkVfTE9OR19MT05HICYmIGRlZmluZWQgX19VU0VfTUlTQykKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogQ29udmVydCBhIHN0cmluZyB0byBhIHF1YWR3b3JkIGludGVnZXIuICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgc3RydG9sbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKy8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgcXVhZHdvcmQgaW50ZWdlci4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBzdHJ0b3VsbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX0M5OQorI2VuZGlmIC8qIElTTyBDOTkgb3IgR0NDIGFuZCB1c2UgTUlTQy4gICovCisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlIGNvbmNlcHQgb2Ygb25lIHN0YXRpYyBsb2NhbGUgcGVyIGNhdGVnb3J5IGlzIG5vdCB2ZXJ5IHdlbGwKKyAgIHRob3VnaHQgb3V0LiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIHRvIHByb2Nlc3MgaXRzIGRhdGEgdXNpbmcKKyAgIGluZm9ybWF0aW9uIGZyb20gc2V2ZXJhbCBkaWZmZXJlbnQgbG9jYWxlcy4gIEFub3RoZXIgYXBwbGljYXRpb24gaXMKKyAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24gaGFuZGxpbmcgaW4gdGhlCisgICB1cGNvbWluZyBJU08gQysrIHN0YW5kYXJkIGxpYnJhcnkuICBUbyBzdXBwb3J0IHRoaXMgYW5vdGhlciBzZXQgb2YKKyAgIHRoZSBmdW5jdGlvbnMgdXNpbmcgbG9jYWxlIGRhdGEgZXhpc3Qgd2hpY2ggaGF2ZSBhbiBhZGRpdGlvbmFsCisgICBhcmd1bWVudC4KKworICAgQXR0ZW50aW9uOiBhbGwgdGhlc2UgZnVuY3Rpb25zIGFyZSAqbm90KiBzdGFuZGFyZGl6ZWQgaW4gYW55IGZvcm0uCisgICBUaGlzIGlzIGEgcHJvb2Ytb2YtY29uY2VwdCBpbXBsZW1lbnRhdGlvbi4gICovCisKKy8qIFN0cnVjdHVyZSBmb3IgcmVlbnRyYW50IGxvY2FsZSB1c2luZyBmdW5jdGlvbnMuICBUaGlzIGlzIGFuCisgICAoYWxtb3N0KSBvcGFxdWUgdHlwZSBmb3IgdGhlIHVzZXIgbGV2ZWwgcHJvZ3JhbXMuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIFNwZWNpYWwgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGljaCB0YWtlIHRoZSBsb2NhbGUgdG8KKyAgIHVzZSBhcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4gICovCitleHRlcm4gbG9uZyBpbnQgc3RydG9sX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLAorCQkJICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDQpKSBfX3d1cjsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWxfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJICAgIGludCBfX2Jhc2UsIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgNCkpIF9fd3VyOworCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCBzdHJ0b2xsX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UsCisJCQkJX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCA0KSkgX193dXI7CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRvdWxsX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSAgaW50IF9fYmFzZSwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCA0KSkgX193dXI7CisKK2V4dGVybiBkb3VibGUgc3RydG9kX2wgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCisJCQljaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSkgX193dXI7CisKK2V4dGVybiBmbG9hdCBzdHJ0b2ZfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJICAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDMpKSBfX3d1cjsKKworZXh0ZXJuIGxvbmcgZG91YmxlIHN0cnRvbGRfbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJICAgICAgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSkgX193dXI7CisjZW5kaWYgLyogR05VICovCisKKworI2lmZGVmIF9fVVNFX0VYVEVSTl9JTkxJTkVTCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKK19fZXh0ZXJuX2lubGluZSBkb3VibGUKK19fTlRIIChhdG9mIChfX2NvbnN0IGNoYXIgKl9fbnB0cikpCit7CisgIHJldHVybiBzdHJ0b2QgKF9fbnB0ciwgKGNoYXIgKiopIE5VTEwpOworfQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKGF0b2kgKF9fY29uc3QgY2hhciAqX19ucHRyKSkKK3sKKyAgcmV0dXJuIChpbnQpIHN0cnRvbCAoX19ucHRyLCAoY2hhciAqKikgTlVMTCwgMTApOworfQorX19leHRlcm5faW5saW5lIGxvbmcgaW50CitfX05USCAoYXRvbCAoX19jb25zdCBjaGFyICpfX25wdHIpKQoreworICByZXR1cm4gc3RydG9sIChfX25wdHIsIChjaGFyICoqKSBOVUxMLCAxMCk7Cit9CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIGxvbmcgbG9uZyBpbnQKK19fTlRIIChhdG9sbCAoX19jb25zdCBjaGFyICpfX25wdHIpKQoreworICByZXR1cm4gc3RydG9sbCAoX19ucHRyLCAoY2hhciAqKikgTlVMTCwgMTApOworfQorX19FTkRfTkFNRVNQQUNFX0M5OQorIyBlbmRpZgorI2VuZGlmIC8qIE9wdGltaXppbmcgYW5kIElubGluaW5nLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIENvbnZlcnQgTiB0byBiYXNlIDY0IHVzaW5nIHRoZSBkaWdpdHMgIi4vMC05QS1aYS16IiwgbGVhc3Qtc2lnbmlmaWNhbnQKKyAgIGRpZ2l0IGZpcnN0LiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gc3RhdGljIHN0b3JhZ2Ugb3ZlcndyaXR0ZW4gYnkgdGhlCisgICBuZXh0IGNhbGwuICAqLworZXh0ZXJuIGNoYXIgKmw2NGEgKGxvbmcgaW50IF9fbikgX19USFJPVyBfX3d1cjsKKworLyogUmVhZCBhIG51bWJlciBmcm9tIGEgc3RyaW5nIFMgaW4gYmFzZSA2NCBhcyBhYm92ZS4gICovCitleHRlcm4gbG9uZyBpbnQgYTY0bCAoX19jb25zdCBjaGFyICpfX3MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2VuZGlmCS8qIFVzZSBTVklEIHx8IGV4dGVuZGVkIFgvT3Blbi4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX0JTRAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4JLyogd2UgbmVlZCBpbnQzMl90Li4uICovCisKKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgZG8gdGhpbmdzLiAgVGhlIGByYW5kb20nLCBgc3JhbmRvbScsCisgICBgaW5pdHN0YXRlJyBhbmQgYHNldHN0YXRlJyBmdW5jdGlvbnMgYXJlIHRob3NlIGZyb20gQlNEIFVuaWNlcy4KKyAgIFRoZSBgcmFuZCcgYW5kIGBzcmFuZCcgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCBieSB0aGUgQU5TSSBzdGFuZGFyZC4KKyAgIFdlIHByb3ZpZGUgYm90aCBpbnRlcmZhY2VzIHRvIHRoZSBzYW1lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgKi8KKy8qIFJldHVybiBhIHJhbmRvbSBsb25nIGludGVnZXIgYmV0d2VlbiAwIGFuZCBSQU5EX01BWCBpbmNsdXNpdmUuICAqLworZXh0ZXJuIGxvbmcgaW50IHJhbmRvbSAodm9pZCkgX19USFJPVzsKKworLyogU2VlZCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLiAgKi8KK2V4dGVybiB2b2lkIHNyYW5kb20gKHVuc2lnbmVkIGludCBfX3NlZWQpIF9fVEhST1c7CisKKy8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSBzdGF0ZSBidWZmZXIgU1RBVEVCVUYsCisgICBvZiBsZW5ndGggU1RBVEVMRU4sIGFuZCBzZWVkIGl0IHdpdGggU0VFRC4gIE9wdGltYWwgbGVuZ3RocyBhcmUgOCwgMTYsCisgICAzMiwgNjQsIDEyOCBhbmQgMjU2LCB0aGUgYmlnZ2VyIHRoZSBiZXR0ZXI7IHZhbHVlcyBsZXNzIHRoYW4gOCB3aWxsCisgICBjYXVzZSBhbiBlcnJvciBhbmQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAyNTYgd2lsbCBiZSByb3VuZGVkIGRvd24uICAqLworZXh0ZXJuIGNoYXIgKmluaXRzdGF0ZSAodW5zaWduZWQgaW50IF9fc2VlZCwgY2hhciAqX19zdGF0ZWJ1ZiwKKwkJCXNpemVfdCBfX3N0YXRlbGVuKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKworLyogU3dpdGNoIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byBzdGF0ZSBidWZmZXIgU1RBVEVCVUYsCisgICB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgYGluaXRzdGF0ZScuICAqLworZXh0ZXJuIGNoYXIgKnNldHN0YXRlIChjaGFyICpfX3N0YXRlYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisjIGlmZGVmIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgYHJhbmRvbScgZmFtaWx5IG9mIGZ1bmN0aW9ucy4KKyAgIFRoZXNlIGZ1bmN0aW9ucyBhbGwgdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmUgdG8gY29udGFpbgorICAgc3RhdGUsIHJhdGhlciB0aGFuIGdsb2JhbCBzdGF0ZSB2YXJpYWJsZXMuICAqLworCitzdHJ1Y3QgcmFuZG9tX2RhdGEKKyAgeworICAgIGludDMyX3QgKmZwdHI7CQkvKiBGcm9udCBwb2ludGVyLiAgKi8KKyAgICBpbnQzMl90ICpycHRyOwkJLyogUmVhciBwb2ludGVyLiAgKi8KKyAgICBpbnQzMl90ICpzdGF0ZTsJCS8qIEFycmF5IG9mIHN0YXRlIHZhbHVlcy4gICovCisgICAgaW50IHJhbmRfdHlwZTsJCS8qIFR5cGUgb2YgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworICAgIGludCByYW5kX2RlZzsJCS8qIERlZ3JlZSBvZiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gICovCisgICAgaW50IHJhbmRfc2VwOwkJLyogRGlzdGFuY2UgYmV0d2VlbiBmcm9udCBhbmQgcmVhci4gICovCisgICAgaW50MzJfdCAqZW5kX3B0cjsJCS8qIFBvaW50ZXIgYmVoaW5kIHN0YXRlIHRhYmxlLiAgKi8KKyAgfTsKKworZXh0ZXJuIGludCByYW5kb21fciAoc3RydWN0IHJhbmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkgICAgIGludDMyX3QgKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCitleHRlcm4gaW50IHNyYW5kb21fciAodW5zaWduZWQgaW50IF9fc2VlZCwgc3RydWN0IHJhbmRvbV9kYXRhICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKK2V4dGVybiBpbnQgaW5pdHN0YXRlX3IgKHVuc2lnbmVkIGludCBfX3NlZWQsIGNoYXIgKl9fcmVzdHJpY3QgX19zdGF0ZWJ1ZiwKKwkJCXNpemVfdCBfX3N0YXRlbGVuLAorCQkJc3RydWN0IHJhbmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDQpKTsKKworZXh0ZXJuIGludCBzZXRzdGF0ZV9yIChjaGFyICpfX3Jlc3RyaWN0IF9fc3RhdGVidWYsCisJCSAgICAgICBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworIyBlbmRpZgkvKiBVc2UgbWlzYy4gICovCisjZW5kaWYJLyogVXNlIFNWSUQgfHwgZXh0ZW5kZWQgWC9PcGVuIHx8IEJTRC4gKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgUkFORF9NQVggaW5jbHVzaXZlLiAgKi8KK2V4dGVybiBpbnQgcmFuZCAodm9pZCkgX19USFJPVzsKKy8qIFNlZWQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHdpdGggdGhlIGdpdmVuIG51bWJlci4gICovCitleHRlcm4gdm9pZCBzcmFuZCAodW5zaWduZWQgaW50IF9fc2VlZCkgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX1BPU0lYCisvKiBSZWVudHJhbnQgaW50ZXJmYWNlIGFjY29yZGluZyB0byBQT1NJWC4xLiAgKi8KK2V4dGVybiBpbnQgcmFuZF9yICh1bnNpZ25lZCBpbnQgKl9fc2VlZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX1NWSUQgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogU3lzdGVtIFYgc3R5bGUgNDgtYml0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZ1bmN0aW9ucy4gICovCisKKy8qIFJldHVybiBub24tbmVnYXRpdmUsIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgaW4gWzAuMCwxLjApLiAgKi8KK2V4dGVybiBkb3VibGUgZHJhbmQ0OCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBkb3VibGUgZXJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gbm9uLW5lZ2F0aXZlLCBsb25nIGludGVnZXIgaW4gWzAsMl4zMSkuICAqLworZXh0ZXJuIGxvbmcgaW50IGxyYW5kNDggKHZvaWQpIF9fVEhST1c7CitleHRlcm4gbG9uZyBpbnQgbnJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBSZXR1cm4gc2lnbmVkLCBsb25nIGludGVnZXJzIGluIFstMl4zMSwyXjMxKS4gICovCitleHRlcm4gbG9uZyBpbnQgbXJhbmQ0OCAodm9pZCkgX19USFJPVzsKK2V4dGVybiBsb25nIGludCBqcmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFNlZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworZXh0ZXJuIHZvaWQgc3JhbmQ0OCAobG9uZyBpbnQgX19zZWVkdmFsKSBfX1RIUk9XOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGludCAqc2VlZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKK2V4dGVybiB2b2lkIGxjb25nNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3BhcmFtWzddKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBEYXRhIHN0cnVjdHVyZSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRocmVhZCBzYWZlIHZlcnNpb25zLiAgVGhpcworICAgdHlwZSBpcyB0byBiZSByZWdhcmRlZCBhcyBvcGFxdWUuICBJdCdzIG9ubHkgZXhwb3J0ZWQgYmVjYXVzZSB1c2VycworICAgaGF2ZSB0byBhbGxvY2F0ZSBvYmplY3RzIG9mIHRoaXMgdHlwZS4gICovCitzdHJ1Y3QgZHJhbmQ0OF9kYXRhCisgIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX194WzNdOwkvKiBDdXJyZW50IHN0YXRlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19vbGRfeFszXTsgLyogT2xkIHN0YXRlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19jOwkvKiBBZGRpdGl2ZSBjb25zdC4gaW4gY29uZ3J1ZW50aWFsIGZvcm11bGEuICAqLworICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2luaXQ7CS8qIEZsYWcgZm9yIGluaXRpYWxpemluZy4gICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX2E7CS8qIEZhY3RvciBpbiBjb25ncnVlbnRpYWwgZm9ybXVsYS4gICovCisgIH07CisKKy8qIFJldHVybiBub24tbmVnYXRpdmUsIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgaW4gWzAuMCwxLjApLiAgKi8KK2V4dGVybiBpbnQgZHJhbmQ0OF9yIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBkb3VibGUgKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGludCBlcmFuZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBkb3VibGUgKl9fcmVzdHJpY3QgX19yZXN1bHQpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBSZXR1cm4gbm9uLW5lZ2F0aXZlLCBsb25nIGludGVnZXIgaW4gWzAsMl4zMSkuICAqLworZXh0ZXJuIGludCBscmFuZDQ4X3IgKHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCisJCSAgICAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBpbnQgbnJhbmQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSwKKwkJICAgICAgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKKwkJICAgICAgbG9uZyBpbnQgKl9fcmVzdHJpY3QgX19yZXN1bHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBSZXR1cm4gc2lnbmVkLCBsb25nIGludGVnZXJzIGluIFstMl4zMSwyXjMxKS4gICovCitleHRlcm4gaW50IG1yYW5kNDhfciAoc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKKwkJICAgICAgbG9uZyBpbnQgKl9fcmVzdHJpY3QgX19yZXN1bHQpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworZXh0ZXJuIGludCBqcmFuZDQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAorCQkgICAgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIFNlZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuICAqLworZXh0ZXJuIGludCBzcmFuZDQ4X3IgKGxvbmcgaW50IF9fc2VlZHZhbCwgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19idWZmZXIpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCitleHRlcm4gaW50IHNlZWQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdLAorCQkgICAgIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworZXh0ZXJuIGludCBsY29uZzQ4X3IgKHVuc2lnbmVkIHNob3J0IGludCBfX3BhcmFtWzddLAorCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX2J1ZmZlcikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCS8qIFVzZSBtaXNjLiAgKi8KKyNlbmRpZgkvKiBVc2UgU1ZJRCBvciBYL09wZW4uICAqLworCisjZW5kaWYgLyogZG9uJ3QganVzdCBuZWVkIG1hbGxvYyBhbmQgY2FsbG9jICovCisKKyNpZm5kZWYgX19tYWxsb2NfYW5kX2NhbGxvY19kZWZpbmVkCisjIGRlZmluZSBfX21hbGxvY19hbmRfY2FsbG9jX2RlZmluZWQKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQWxsb2NhdGUgU0laRSBieXRlcyBvZiBtZW1vcnkuICAqLworZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IF9fc2l6ZSkgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX3d1cjsKKy8qIEFsbG9jYXRlIE5NRU1CIGVsZW1lbnRzIG9mIFNJWkUgYnl0ZXMgZWFjaCwgYWxsIGluaXRpYWxpemVkIHRvIDAuICAqLworZXh0ZXJuIHZvaWQgKmNhbGxvYyAoc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjZW5kaWYKKworI2lmbmRlZiBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmUtYWxsb2NhdGUgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJsb2NrCisgICBpbiBQVFIsIG1ha2luZyB0aGUgbmV3IGJsb2NrIFNJWkUgYnl0ZXMgbG9uZy4gICovCisvKiBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBpcyBub3QgdXNlZCwgYmVjYXVzZSBpZiByZWFsbG9jIHJldHVybnMKKyAgIHRoZSBzYW1lIHBvaW50ZXIgdGhhdCB3YXMgcGFzc2VkIHRvIGl0LCBhbGlhc2luZyBuZWVkcyB0byBiZSBhbGxvd2VkCisgICBiZXR3ZWVuIG9iamVjdHMgcG9pbnRlZCBieSB0aGUgb2xkIGFuZCBuZXcgcG9pbnRlcnMuICAqLworZXh0ZXJuIHZvaWQgKnJlYWxsb2MgKHZvaWQgKl9fcHRyLCBzaXplX3QgX19zaXplKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3dhcm5fdW51c2VkX3Jlc3VsdF9fOworLyogRnJlZSBhIGJsb2NrIGFsbG9jYXRlZCBieSBgbWFsbG9jJywgYHJlYWxsb2MnIG9yIGBjYWxsb2MnLiAgKi8KK2V4dGVybiB2b2lkIGZyZWUgKHZvaWQgKl9fcHRyKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYJX19VU0VfTUlTQworLyogRnJlZSBhIGJsb2NrLiAgQW4gYWxpYXMgZm9yIGBmcmVlJy4JKFN1biBVbmljZXMpLiAgKi8KK2V4dGVybiB2b2lkIGNmcmVlICh2b2lkICpfX3B0cikgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgbWlzYy4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8YWxsb2NhLmg+CisjZW5kaWYgLyogVXNlIEdOVSwgQlNELCBvciBtaXNjLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIEFsbG9jYXRlIFNJWkUgYnl0ZXMgb24gYSBwYWdlIGJvdW5kYXJ5LiAgVGhlIHN0b3JhZ2UgY2Fubm90IGJlIGZyZWVkLiAgKi8KK2V4dGVybiB2b2lkICp2YWxsb2MgKHNpemVfdCBfX3NpemUpIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX18gX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEFsbG9jYXRlIG1lbW9yeSBvZiBTSVpFIGJ5dGVzIHdpdGggYW4gYWxpZ25tZW50IG9mIEFMSUdOTUVOVC4gICovCitleHRlcm4gaW50IHBvc2l4X21lbWFsaWduICh2b2lkICoqX19tZW1wdHIsIHNpemVfdCBfX2FsaWdubWVudCwgc2l6ZV90IF9fc2l6ZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBBYm9ydCBleGVjdXRpb24gYW5kIGdlbmVyYXRlIGEgY29yZS1kdW1wLiAgKi8KK2V4dGVybiB2b2lkIGFib3J0ICh2b2lkKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGBleGl0JyBpcyBjYWxsZWQuICAqLworZXh0ZXJuIGludCBhdGV4aXQgKHZvaWQgKCpfX2Z1bmMpICh2b2lkKSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBzdGF0dXMKKyAgIGdpdmVuIHRvIGBleGl0JyBhbmQgdGhlIGdpdmVuIGFyZ3VtZW50LiAgKi8KK2V4dGVybiBpbnQgb25fZXhpdCAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0YXR1cywgdm9pZCAqX19hcmcpLCB2b2lkICpfX2FyZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDYWxsIGFsbCBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIGBhdGV4aXQnIGFuZCBgb25fZXhpdCcsCisgICBpbiB0aGUgcmV2ZXJzZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHJlZ2lzdGVyZWQKKyAgIHBlcmZvcm0gc3RkaW8gY2xlYW51cCwgYW5kIHRlcm1pbmF0ZSBwcm9ncmFtIGV4ZWN1dGlvbiB3aXRoIFNUQVRVUy4gICovCitleHRlcm4gdm9pZCBleGl0IChpbnQgX19zdGF0dXMpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSB3aXRoIFNUQVRVUyB3aXRob3V0IGNhbGxpbmcgYW55IG9mIHRoZQorICAgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCBgYXRleGl0JyBvciBgb25fZXhpdCcuICAqLworZXh0ZXJuIHZvaWQgX0V4aXQgKGludCBfX3N0YXR1cykgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiB0aGUgdmFsdWUgb2YgZW52YXJpYWJsZSBOQU1FLCBvciBOVUxMIGlmIGl0IGRvZXNuJ3QgZXhpc3QuICAqLworZXh0ZXJuIGNoYXIgKmdldGVudiAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIGFib3ZlIGJ1dCByZXR1cm5zIE5VTEwgaWYgdGhlCisgICBwcm9ncmFtcyBpcyBydW5uaW5nIHdpdGggU1VJRCBvciBTR0lEIGVuYWJsZWQuICAqLworZXh0ZXJuIGNoYXIgKl9fc2VjdXJlX2dldGVudiAoX19jb25zdCBjaGFyICpfX25hbWUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFRoZSBTVklEIHNheXMgdGhpcyBpcyBpbiA8c3RkaW8uaD4sIGJ1dCB0aGlzIHNlZW1zIGEgYmV0dGVyIHBsYWNlLgkqLworLyogUHV0IFNUUklORywgd2hpY2ggaXMgb2YgdGhlIGZvcm0gIk5BTUU9VkFMVUUiLCBpbiB0aGUgZW52aXJvbm1lbnQuCisgICBJZiB0aGVyZSBpcyBubyBgPScsIHJlbW92ZSBOQU1FIGZyb20gdGhlIGVudmlyb25tZW50LiAgKi8KK2V4dGVybiBpbnQgcHV0ZW52IChjaGFyICpfX3N0cmluZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogU2V0IE5BTUUgdG8gVkFMVUUgaW4gdGhlIGVudmlyb25tZW50LgorICAgSWYgUkVQTEFDRSBpcyBub256ZXJvLCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdmFsdWUuICAqLworZXh0ZXJuIGludCBzZXRlbnYgKF9fY29uc3QgY2hhciAqX19uYW1lLCBfX2NvbnN0IGNoYXIgKl9fdmFsdWUsIGludCBfX3JlcGxhY2UpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworCisvKiBSZW1vdmUgdGhlIHZhcmlhYmxlIE5BTUUgZnJvbSB0aGUgZW52aXJvbm1lbnQuICAqLworZXh0ZXJuIGludCB1bnNldGVudiAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmCV9fVVNFX01JU0MKKy8qIFRoZSBgY2xlYXJlbnYnIHdhcyBwbGFubmVkIHRvIGJlIGFkZGVkIHRvIFBPU0lYLjEgYnV0IHByb2JhYmx5CisgICBuZXZlciBtYWRlIGl0LiAgTmV2ZXJ0aGVsZXNzIHRoZSBQT1NJWC45IHN0YW5kYXJkIChQT1NJWCBiaW5kaW5ncworICAgZm9yIEZvcnRyYW4gNzcpIHJlcXVpcmVzIHRoaXMgZnVuY3Rpb24uICAqLworZXh0ZXJuIGludCBjbGVhcmVudiAodm9pZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFLgorICAgVGhlIGxhc3Qgc2l4IGNoYXJhY3RlcnMgb2YgVEVNUExBVEUgbXVzdCBiZSAiWFhYWFhYIjsKKyAgIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggYSBzdHJpbmcgdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZS4KKyAgIFJldHVybnMgVEVNUExBVEUsIG9yIGEgbnVsbCBwb2ludGVyIGlmIGl0IGNhbm5vdCBnZXQgYSB1bmlxdWUgZmlsZSBuYW1lLiAgKi8KK2V4dGVybiBjaGFyICpta3RlbXAgKGNoYXIgKl9fdGVtcGxhdGUpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisvKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGZyb20gVEVNUExBVEUuCisgICBUaGUgbGFzdCBzaXggY2hhcmFjdGVycyBvZiBURU1QTEFURSBtdXN0IGJlICJYWFhYWFgiOworICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCisgICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIG9wZW4gb24gdGhlIGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsCisgICBvciAtMSBpZiBpdCBjYW5ub3QgY3JlYXRlIGEgdW5pcXVlbHktbmFtZWQgZmlsZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBta3N0ZW1wIChjaGFyICpfX3RlbXBsYXRlKSBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAobWtzdGVtcCwgKGNoYXIgKl9fdGVtcGxhdGUpLCBta3N0ZW1wNjQpCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbWtzdGVtcCBta3N0ZW1wNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IG1rc3RlbXA2NCAoY2hhciAqX190ZW1wbGF0ZSkgX19ub25udWxsICgoMSkpIF9fd3VyOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENyZWF0ZSBhIHVuaXF1ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZyb20gVEVNUExBVEUuCisgICBUaGUgbGFzdCBzaXggY2hhcmFjdGVycyBvZiBURU1QTEFURSBtdXN0IGJlICJYWFhYWFgiOworICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBkaXJlY3RvcnkgbmFtZSB1bmlxdWUuCisgICBSZXR1cm5zIFRFTVBMQVRFLCBvciBhIG51bGwgcG9pbnRlciBpZiBpdCBjYW5ub3QgZ2V0IGEgdW5pcXVlIG5hbWUuCisgICBUaGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQgbW9kZSA3MDAuICAqLworZXh0ZXJuIGNoYXIgKm1rZHRlbXAgKGNoYXIgKl9fdGVtcGxhdGUpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEdlbmVyYXRlIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZnJvbSBURU1QTEFURSBzaW1pbGFyIHRvCisgICBta3N0ZW1wLiAgQnV0IGFsbG93IHRoZSBjYWxsZXIgdG8gcGFzcyBhZGRpdGlvbmFsIGZsYWdzIHdoaWNoIGFyZQorICAgdXNlZCBpbiB0aGUgb3BlbiBjYWxsIHRvIGNyZWF0ZSB0aGUgZmlsZS4uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgbWtvc3RlbXAgKGNoYXIgKl9fdGVtcGxhdGUsIGludCBfX2ZsYWdzKSBfX25vbm51bGwgKCgxKSkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAobWtvc3RlbXAsIChjaGFyICpfX3RlbXBsYXRlLCBpbnQgX19mbGFncyksIG1rb3N0ZW1wNjQpCisgICAgIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgbWtvc3RlbXAgbWtvc3RlbXA2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgbWtvc3RlbXA2NCAoY2hhciAqX190ZW1wbGF0ZSwgaW50IF9fZmxhZ3MpIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZW5kaWYKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogRXhlY3V0ZSB0aGUgZ2l2ZW4gbGluZSBhcyBhIHNoZWxsIGNvbW1hbmQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBzeXN0ZW0gKF9fY29uc3QgY2hhciAqX19jb21tYW5kKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworCisjaWZkZWYJX19VU0VfR05VCisvKiBSZXR1cm4gYSBtYWxsb2MnZCBzdHJpbmcgY29udGFpbmluZyB0aGUgY2Fub25pY2FsIGFic29sdXRlIG5hbWUgb2YgdGhlCisgICBleGlzdGluZyBuYW1lZCBmaWxlLiAgKi8KK2V4dGVybiBjaGFyICpjYW5vbmljYWxpemVfZmlsZV9uYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFJldHVybiB0aGUgY2Fub25pY2FsIGFic29sdXRlIG5hbWUgb2YgZmlsZSBOQU1FLiAgSWYgUkVTT0xWRUQgaXMKKyAgIG51bGwsIHRoZSByZXN1bHQgaXMgbWFsbG9jJ2Q7IG90aGVyd2lzZSwgaWYgdGhlIGNhbm9uaWNhbCBuYW1lIGlzCisgICBQQVRIX01BWCBjaGFycyBvciBtb3JlLCByZXR1cm5zIG51bGwgd2l0aCBgZXJybm8nIHNldCB0bworICAgRU5BTUVUT09MT05HOyBpZiB0aGUgbmFtZSBmaXRzIGluIGZld2VyIHRoYW4gUEFUSF9NQVggY2hhcnMsCisgICByZXR1cm5zIHRoZSBuYW1lIGluIFJFU09MVkVELiAgKi8KK2V4dGVybiBjaGFyICpyZWFscGF0aCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbmFtZSwKKwkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19yZXNvbHZlZCkgX19USFJPVyBfX3d1cjsKKyNlbmRpZgorCisKKy8qIFNob3J0aGFuZCBmb3IgdHlwZSBvZiBjb21wYXJpc29uIGZ1bmN0aW9ucy4gICovCisjaWZuZGVmIF9fQ09NUEFSX0ZOX1QKKyMgZGVmaW5lIF9fQ09NUEFSX0ZOX1QKK3R5cGVkZWYgaW50ICgqX19jb21wYXJfZm5fdCkgKF9fY29uc3Qgdm9pZCAqLCBfX2NvbnN0IHZvaWQgKik7CisKKyMgaWZkZWYJX19VU0VfR05VCit0eXBlZGVmIF9fY29tcGFyX2ZuX3QgY29tcGFyaXNvbl9mbl90OworIyBlbmRpZgorI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogRG8gYSBiaW5hcnkgc2VhcmNoIGZvciBLRVkgaW4gQkFTRSwgd2hpY2ggY29uc2lzdHMgb2YgTk1FTUIgZWxlbWVudHMKKyAgIG9mIFNJWkUgYnl0ZXMgZWFjaCwgdXNpbmcgQ09NUEFSIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmlzb25zLiAgKi8KK2V4dGVybiB2b2lkICpic2VhcmNoIChfX2NvbnN0IHZvaWQgKl9fa2V5LCBfX2NvbnN0IHZvaWQgKl9fYmFzZSwKKwkJICAgICAgc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUsIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpCisgICAgIF9fbm9ubnVsbCAoKDEsIDIsIDUpKSBfX3d1cjsKKworLyogU29ydCBOTUVNQiBlbGVtZW50cyBvZiBCQVNFLCBvZiBTSVpFIGJ5dGVzIGVhY2gsCisgICB1c2luZyBDT01QQVIgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbnMuICAqLworZXh0ZXJuIHZvaWQgcXNvcnQgKHZvaWQgKl9fYmFzZSwgc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUsCisJCSAgIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpIF9fbm9ubnVsbCAoKDEsIDQpKTsKKworCisvKiBSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIFguICAqLworZXh0ZXJuIGludCBhYnMgKGludCBfX3gpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpIF9fd3VyOworZXh0ZXJuIGxvbmcgaW50IGxhYnMgKGxvbmcgaW50IF9feCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9JU09DOTkKK19fZXh0ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQgbGxhYnMgKGxvbmcgbG9uZyBpbnQgX194KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSBfX3d1cjsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBgZGl2X3QnLCBgbGRpdl90JyBvciBgbGxkaXZfdCcgcmVwcmVzZW50YXRpb24KKyAgIG9mIHRoZSB2YWx1ZSBvZiBOVU1FUiBvdmVyIERFTk9NLiAqLworLyogR0NDIG1heSBoYXZlIGJ1aWx0LWlucyBmb3IgdGhlc2Ugc29tZWRheS4gICovCitleHRlcm4gZGl2X3QgZGl2IChpbnQgX19udW1lciwgaW50IF9fZGVub20pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpIF9fd3VyOworZXh0ZXJuIGxkaXZfdCBsZGl2IChsb25nIGludCBfX251bWVyLCBsb25nIGludCBfX2Rlbm9tKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKSBfX3d1cjsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CitfX2V4dGVuc2lvbl9fIGV4dGVybiBsbGRpdl90IGxsZGl2IChsb25nIGxvbmcgaW50IF9fbnVtZXIsCisJCQkJICAgIGxvbmcgbG9uZyBpbnQgX19kZW5vbSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSkgX193dXI7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIENvbnZlcnQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0byBzdHJpbmdzLiAgVGhlIHJldHVybmVkIHZhbHVlcyBhcmUKKyAgIHZhbGlkIG9ubHkgdW50aWwgYW5vdGhlciBjYWxsIHRvIHRoZSBzYW1lIGZ1bmN0aW9uLiAgKi8KKworLyogQ29udmVydCBWQUxVRSB0byBhIHN0cmluZyB3aXRoIE5ESUdJVCBkaWdpdHMgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8KKyAgIHRoaXMuICBTZXQgKkRFQ1BUIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSBkZWNpbWFsIGNoYXJhY3RlciBhbmQgKlNJR04KKyAgIHdpdGggdGhlIHNpZ24gb2YgdGhlIG51bWJlci4gICovCitleHRlcm4gY2hhciAqZWN2dCAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsCisJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24pIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpIF9fd3VyOworCisvKiBDb252ZXJ0IFZBTFVFIHRvIGEgc3RyaW5nIHJvdW5kZWQgdG8gTkRJR0lUIGRlY2ltYWwgZGlnaXRzLiAgU2V0ICpERUNQVAorICAgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGRlY2ltYWwgY2hhcmFjdGVyIGFuZCAqU0lHTiB3aXRoIHRoZSBzaWduIG9mCisgICB0aGUgbnVtYmVyLiAgKi8KK2V4dGVybiBjaGFyICpmY3Z0IChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwKKwkJICAgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSkgX193dXI7CisKKy8qIElmIHBvc3NpYmxlIGNvbnZlcnQgVkFMVUUgdG8gYSBzdHJpbmcgd2l0aCBORElHSVQgc2lnbmlmaWNhbnQgZGlnaXRzLgorICAgT3RoZXJ3aXNlIHVzZSBleHBvbmVudGlhbCByZXByZXNlbnRhdGlvbi4gIFRoZSByZXN1bHRpbmcgc3RyaW5nIHdpbGwKKyAgIGJlIHdyaXR0ZW4gdG8gQlVGLiAgKi8KK2V4dGVybiBjaGFyICpnY3Z0IChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBjaGFyICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSkgX193dXI7CisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBMb25nIGRvdWJsZSB2ZXJzaW9ucyBvZiBhYm92ZSBmdW5jdGlvbnMuICAqLworZXh0ZXJuIGNoYXIgKnFlY3Z0IChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCisJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSkgX193dXI7CitleHRlcm4gY2hhciAqcWZjdnQgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwKKwkJICAgIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDQpKSBfX3d1cjsKK2V4dGVybiBjaGFyICpxZ2N2dCAobG9uZyBkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBjaGFyICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSkgX193dXI7CisKKworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGljaCBwcm92aWRlIHRoZWlyIG93bgorICAgYnVmZmVycy4gICovCitleHRlcm4gaW50IGVjdnRfciAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsCisJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCSAgIHNpemVfdCBfX2xlbikgX19USFJPVyBfX25vbm51bGwgKCgzLCA0LCA1KSk7CitleHRlcm4gaW50IGZjdnRfciAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsCisJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCisJCSAgIHNpemVfdCBfX2xlbikgX19USFJPVyBfX25vbm51bGwgKCgzLCA0LCA1KSk7CisKK2V4dGVybiBpbnQgcWVjdnRfciAobG9uZyBkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LAorCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24sCisJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCwgNSkpOworZXh0ZXJuIGludCBxZmN2dF9yIChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCisJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19kZWNwdCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbiwKKwkJICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0LCA1KSk7CisjIGVuZGlmCS8qIG1pc2MgKi8KKyNlbmRpZgkvKiB1c2UgTUlTQyB8fCB1c2UgWC9PcGVuIFVuaXggKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBtdWx0aWJ5dGUgY2hhcmFjdGVyCisgICBpbiBTLCB3aGljaCBpcyBubyBsb25nZXIgdGhhbiBOLiAgKi8KK2V4dGVybiBpbnQgbWJsZW4gKF9fY29uc3QgY2hhciAqX19zLCBzaXplX3QgX19uKSBfX1RIUk9XIF9fd3VyOworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIG11bHRpYnl0ZSBjaGFyYWN0ZXIsCisgICBwdXR0aW5nIGl0cyBgd2NoYXJfdCcgcmVwcmVzZW50YXRpb24gaW4gKlBXQy4gICovCitleHRlcm4gaW50IG1idG93YyAod2NoYXJfdCAqX19yZXN0cmljdCBfX3B3YywKKwkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbikgX19USFJPVyBfX3d1cjsKKy8qIFB1dCB0aGUgbXVsdGlieXRlIGNoYXJhY3RlciByZXByZXNlbnRlZAorICAgYnkgV0NIQVIgaW4gUywgcmV0dXJuaW5nIGl0cyBsZW5ndGguICAqLworZXh0ZXJuIGludCB3Y3RvbWIgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyKSBfX1RIUk9XIF9fd3VyOworCisKKy8qIENvbnZlcnQgYSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgd2lkZSBjaGFyIHN0cmluZy4gICovCitleHRlcm4gc2l6ZV90IG1ic3Rvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0ICBfX3B3Y3MsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uKSBfX1RIUk9XOworLyogQ29udmVydCBhIHdpZGUgY2hhciBzdHJpbmcgdG8gbXVsdGlieXRlIHN0cmluZy4gICovCitleHRlcm4gc2l6ZV90IHdjc3RvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3B3Y3MsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKworI2lmZGVmIF9fVVNFX1NWSUQKKy8qIERldGVybWluZSB3aGV0aGVyIHRoZSBzdHJpbmcgdmFsdWUgb2YgUkVTUE9OU0UgbWF0Y2hlcyB0aGUgYWZmaXJtYXRpb24KKyAgIG9yIG5lZ2F0aXZlIHJlc3BvbnNlIGV4cHJlc3Npb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSBMQ19NRVNTQUdFUyBjYXRlZ29yeQorICAgaW4gdGhlIHByb2dyYW0ncyBjdXJyZW50IGxvY2FsZS4gIFJldHVybnMgMSBpZiBhZmZpcm1hdGl2ZSwgMCBpZgorICAgbmVnYXRpdmUsIGFuZCAtMSBpZiBub3QgbWF0Y2hpbmcuICAqLworZXh0ZXJuIGludCBycG1hdGNoIChfX2NvbnN0IGNoYXIgKl9fcmVzcG9uc2UpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBQYXJzZSBjb21tYSBzZXBhcmF0ZWQgc3Vib3B0aW9uIGZyb20gKk9QVElPTlAgYW5kIG1hdGNoIGFnYWluc3QKKyAgIHN0cmluZ3MgaW4gVE9LRU5TLiAgSWYgZm91bmQgcmV0dXJuIGluZGV4IGFuZCBzZXQgKlZBTFVFUCB0bworICAgb3B0aW9uYWwgdmFsdWUgaW50cm9kdWNlZCBieSBhbiBlcXVhbCBzaWduLiAgSWYgdGhlIHN1Ym9wdGlvbiBpcworICAgbm90IHBhcnQgb2YgVE9LRU5TIHJldHVybiBpbiAqVkFMVUVQIGJlZ2lubmluZyBvZiB1bmtub3duCisgICBzdWJvcHRpb24uICBPbiBleGl0ICpPUFRJT05QIGlzIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0CisgICB0b2tlbiBvciBhdCB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGdldHN1Ym9wdCAoY2hhciAqKl9fcmVzdHJpY3QgX19vcHRpb25wLAorCQkgICAgICBjaGFyICpfX2NvbnN0ICpfX3Jlc3RyaWN0IF9fdG9rZW5zLAorCQkgICAgICBjaGFyICoqX19yZXN0cmljdCBfX3ZhbHVlcCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyLCAzKSkgX193dXI7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfWE9QRU4KKy8qIFNldHVwIERFUyB0YWJsZXMgYWNjb3JkaW5nIEtFWS4gICovCitleHRlcm4gdm9pZCBzZXRrZXkgKF9fY29uc3QgY2hhciAqX19rZXkpIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKworLyogWC9PcGVuIHBzZXVkbyB0ZXJtaW5hbCBoYW5kbGluZy4gICovCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBSZXR1cm4gYSBtYXN0ZXIgcHNldWRvLXRlcm1pbmFsIGhhbmRsZS4gICovCitleHRlcm4gaW50IHBvc2l4X29wZW5wdCAoaW50IF9fb2ZsYWcpIF9fd3VyOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogVGhlIG5leHQgZm91ciBmdW5jdGlvbnMgYWxsIHRha2UgYSBtYXN0ZXIgcHNldWRvLXR0eSBmZCBhbmQKKyAgIHBlcmZvcm0gYW4gb3BlcmF0aW9uIG9uIHRoZSBhc3NvY2lhdGVkIHNsYXZlOiAgKi8KKworLyogQ2hvd24gdGhlIHNsYXZlIHRvIHRoZSBjYWxsaW5nIHVzZXIuICAqLworZXh0ZXJuIGludCBncmFudHB0IChpbnQgX19mZCkgX19USFJPVzsKKworLyogUmVsZWFzZSBhbiBpbnRlcm5hbCBsb2NrIHNvIHRoZSBzbGF2ZSBjYW4gYmUgb3BlbmVkLgorICAgQ2FsbCBhZnRlciBncmFudHB0KCkuICAqLworZXh0ZXJuIGludCB1bmxvY2twdCAoaW50IF9fZmQpIF9fVEhST1c7CisKKy8qIFJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIHBzZXVkbyB0ZXJtaW5hbCBzbGF2ZSBhc3NvaWNhdGVkIHdpdGgKKyAgIHRoZSBtYXN0ZXIgRkQgaXMgb3BlbiBvbiwgb3IgTlVMTCBvbiBlcnJvcnMuCisgICBUaGUgcmV0dXJuZWQgc3RvcmFnZSBpcyBnb29kIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4gICovCitleHRlcm4gY2hhciAqcHRzbmFtZSAoaW50IF9fZmQpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU3RvcmUgYXQgbW9zdCBCVUZMRU4gY2hhcmFjdGVycyBvZiB0aGUgcGF0aG5hbWUgb2YgdGhlIHNsYXZlIHBzZXVkbworICAgdGVybWluYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXN0ZXIgRkQgaXMgb3BlbiBvbiBpbiBCVUYuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYW4gZXJyb3IgbnVtYmVyLiAgKi8KK2V4dGVybiBpbnQgcHRzbmFtZV9yIChpbnQgX19mZCwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisKKy8qIE9wZW4gYSBtYXN0ZXIgcHNldWRvIHRlcm1pbmFsIGFuZCByZXR1cm4gaXRzIGZpbGUgZGVzY3JpcHRvci4gICovCitleHRlcm4gaW50IGdldHB0ICh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQlNECisvKiBQdXQgdGhlIDEgbWludXRlLCA1IG1pbnV0ZSBhbmQgMTUgbWludXRlIGxvYWQgYXZlcmFnZXMgaW50byB0aGUgZmlyc3QKKyAgIE5FTEVNIGVsZW1lbnRzIG9mIExPQURBVkcuICBSZXR1cm4gdGhlIG51bWJlciB3cml0dGVuIChuZXZlciBtb3JlIHRoYW4KKyAgIHRocmVlLCBidXQgbWF5IGJlIGxlc3MgdGhhbiBORUxFTSksIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLiAgKi8KK2V4dGVybiBpbnQgZ2V0bG9hZGF2ZyAoZG91YmxlIF9fbG9hZGF2Z1tdLCBpbnQgX19uZWxlbSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgaGVscGluZyB0byBjYXRjaCBidWZmZXIgb3ZlcmZsb3dzLiAgKi8KKyNpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKyMgaW5jbHVkZSA8Yml0cy9zdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy9zdGRsaWItbGRibC5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBkb24ndCBqdXN0IG5lZWQgbWFsbG9jIGFuZCBjYWxsb2MgKi8KKyN1bmRlZiBfX25lZWRfbWFsbG9jX2FuZF9jYWxsb2MKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN0ZGxpYi5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zdHJpbmcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjOTJkNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5nLmgKQEAgLTAsMCArMSw0MzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MS0xOTkzLCAxOTk1LTIwMDQsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIxIFN0cmluZyBoYW5kbGluZwk8c3RyaW5nLmg+CisgKi8KKworI2lmbmRlZglfU1RSSU5HX0gKKyNkZWZpbmUJX1NUUklOR19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHNpemVfdCBhbmQgTlVMTCBmcm9tIDxzdGRkZWYuaD4uICAqLworI2RlZmluZQlfX25lZWRfc2l6ZV90CisjZGVmaW5lCV9fbmVlZF9OVUxMCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIHZvaWQgKm1lbWNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCSAgICAgX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVCwgZ3VhcmFudGVlaW5nCisgICBjb3JyZWN0IGJlaGF2aW9yIGZvciBvdmVybGFwcGluZyBzdHJpbmdzLiAgKi8KK2V4dGVybiB2b2lkICptZW1tb3ZlICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworX19FTkRfTkFNRVNQQUNFX1NURAorCisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIGJ5dGVzIG9mIFNSQyB0byBERVNULCBzdG9wcGluZyB3aGVuIEMgaXMgZm91bmQuCisgICBSZXR1cm4gdGhlIHBvc2l0aW9uIGluIERFU1Qgb25lIGJ5dGUgcGFzdCB3aGVyZSBDIHdhcyBjb3BpZWQsCisgICBvciBOVUxMIGlmIEMgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgTiBieXRlcyBvZiBTUkMuICAqLworI2lmIGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCitleHRlcm4gdm9pZCAqbWVtY2NweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKKwkJICAgICAgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYgLyogU1ZJRC4gICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIEMuICAqLworZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqX19zLCBpbnQgX19jLCBzaXplX3QgX19uKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQ29tcGFyZSBOIGJ5dGVzIG9mIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IG1lbWNtcCAoX19jb25zdCB2b2lkICpfX3MxLCBfX2NvbnN0IHZvaWQgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2VhcmNoIE4gYnl0ZXMgb2YgUyBmb3IgQy4gICovCitleHRlcm4gdm9pZCAqbWVtY2hyIChfX2NvbnN0IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2VhcmNoIGluIFMgZm9yIEMuICBUaGlzIGlzIHNpbWlsYXIgdG8gYG1lbWNocicgYnV0IHRoZXJlIGlzIG5vCisgICBsZW5ndGggbGltaXQuICAqLworZXh0ZXJuIHZvaWQgKnJhd21lbWNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKworLyogU2VhcmNoIE4gYnl0ZXMgb2YgUyBmb3IgdGhlIGZpbmFsIG9jY3VycmVuY2Ugb2YgQy4gICovCitleHRlcm4gdm9pZCAqbWVtcmNociAoX19jb25zdCB2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pCisgICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKnN0cmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKnN0cm5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBBcHBlbmQgU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gY2hhciAqc3RyY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIEFwcGVuZCBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIGZyb20gU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gY2hhciAqc3RybmNhdCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywKKwkJICAgICAgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIENvbXBhcmUgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgc3RyY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworLyogQ29tcGFyZSBOIGNoYXJhY3RlcnMgb2YgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgc3RybmNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogQ29tcGFyZSB0aGUgY29sbGF0ZWQgZm9ybXMgb2YgUzEgYW5kIFMyLiAgKi8KK2V4dGVybiBpbnQgc3RyY29sbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKy8qIFB1dCBhIHRyYW5zZm9ybWF0aW9uIG9mIFNSQyBpbnRvIG5vIG1vcmUgdGhhbiBOIGJ5dGVzIG9mIERFU1QuICAqLworZXh0ZXJuIHNpemVfdCBzdHJ4ZnJtIChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBib3RoIGFib3ZlIGJ1dCB0aGV5CisgICB0YWtlIHRoZSBsb2NhbGUgdGhleSB1c2UgZm9yIHRoZSBjb2xsYXRpb24gYXMgYW4gZXh0cmEgYXJndW1lbnQuCisgICBUaGlzIGlzIG5vdCBzdGFuZGFyZHNpemVkIGJ1dCBzb21ldGhpbmcgbGlrZSB3aWxsIGNvbWUuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIENvbXBhcmUgdGhlIGNvbGxhdGVkIGZvcm1zIG9mIFMxIGFuZCBTMiB1c2luZyBydWxlcyBmcm9tIEwuICAqLworZXh0ZXJuIGludCBzdHJjb2xsX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLCBfX2xvY2FsZV90IF9fbCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMiwgMykpOworLyogUHV0IGEgdHJhbnNmb3JtYXRpb24gb2YgU1JDIGludG8gbm8gbW9yZSB0aGFuIE4gYnl0ZXMgb2YgREVTVC4gICovCitleHRlcm4gc2l6ZV90IHN0cnhmcm1fbCAoY2hhciAqX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fc3JjLCBzaXplX3QgX19uLAorCQkJIF9fbG9jYWxlX3QgX19sKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDQpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIER1cGxpY2F0ZSBTLCByZXR1cm5pbmcgYW4gaWRlbnRpY2FsIG1hbGxvYydkIHN0cmluZy4gICovCitleHRlcm4gY2hhciAqc3RyZHVwIChfX2NvbnN0IGNoYXIgKl9fcykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9tYWxsb2NfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworLyogUmV0dXJuIGEgbWFsbG9jJ2QgY29weSBvZiBhdCBtb3N0IE4gYnl0ZXMgb2YgU1RSSU5HLiAgVGhlCisgICByZXN1bHRhbnQgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgZXZlbiBpZiBubyBudWxsIHRlcm1pbmF0b3IKKyAgIGFwcGVhcnMgYmVmb3JlIFNUUklOR1tOXS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUKK2V4dGVybiBjaGFyICpzdHJuZHVwIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX21hbGxvY19fIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgZGVmaW5lZCBfX0dOVUNfXworLyogRHVwbGljYXRlIFMsIHJldHVybmluZyBhbiBpZGVudGljYWwgYWxsb2NhJ2Qgc3RyaW5nLiAgKi8KKyMgZGVmaW5lIHN0cmR1cGEocykJCQkJCQkJICAgICAgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgICBfX2NvbnN0IGNoYXIgKl9fb2xkID0gKHMpOwkJCQkJICAgICAgXAorICAgICAgc2l6ZV90IF9fbGVuID0gc3RybGVuIChfX29sZCkgKyAxOwkJCQkgICAgICBcCisgICAgICBjaGFyICpfX25ldyA9IChjaGFyICopIF9fYnVpbHRpbl9hbGxvY2EgKF9fbGVuKTsJCQkgICAgICBcCisgICAgICAoY2hhciAqKSBtZW1jcHkgKF9fbmV3LCBfX29sZCwgX19sZW4pOwkJCQkgICAgICBcCisgICAgfSkpCisKKy8qIFJldHVybiBhbiBhbGxvY2EnZCBjb3B5IG9mIGF0IG1vc3QgTiBieXRlcyBvZiBzdHJpbmcuICAqLworIyBkZWZpbmUgc3RybmR1cGEocywgbikJCQkJCQkJICAgICAgXAorICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCisgICAgKHsJCQkJCQkJCQkgICAgICBcCisgICAgICBfX2NvbnN0IGNoYXIgKl9fb2xkID0gKHMpOwkJCQkJICAgICAgXAorICAgICAgc2l6ZV90IF9fbGVuID0gc3RybmxlbiAoX19vbGQsIChuKSk7CQkJCSAgICAgIFwKKyAgICAgIGNoYXIgKl9fbmV3ID0gKGNoYXIgKikgX19idWlsdGluX2FsbG9jYSAoX19sZW4gKyAxKTsJCSAgICAgIFwKKyAgICAgIF9fbmV3W19fbGVuXSA9ICdcMCc7CQkJCQkJICAgICAgXAorICAgICAgKGNoYXIgKikgbWVtY3B5IChfX25ldywgX19vbGQsIF9fbGVuKTsJCQkJICAgICAgXAorICAgIH0pKQorI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICAqLworZXh0ZXJuIGNoYXIgKnN0cmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMuICAqLworZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBgc3RyY2hyJy4gIEJ1dCBpdCByZXR1cm5zIGEgcG9pbnRlciB0bworICAgdGhlIGNsb3NpbmcgTlVMIGJ5dGUgaW4gY2FzZSBDIGlzIG5vdCBmb3VuZCBpbiBTLiAgKi8KK2V4dGVybiBjaGFyICpzdHJjaHJudWwgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgbm90IGluIFJFSkVDVC4gICovCitleHRlcm4gc2l6ZV90IHN0cmNzcG4gKF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIFMgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIGNoYXJhY3RlcnMgaW4gQUNDRVBULiAgKi8KK2V4dGVybiBzaXplX3Qgc3Ryc3BuIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KK2V4dGVybiBjaGFyICpzdHJwYnJrIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suICAqLworZXh0ZXJuIGNoYXIgKnN0cnN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKworLyogRGl2aWRlIFMgaW50byB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4gREVMSU0uICAqLworZXh0ZXJuIGNoYXIgKnN0cnRvayAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworLyogRGl2aWRlIFMgaW50byB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4gREVMSU0uICBJbmZvcm1hdGlvbgorICAgcGFzc2VkIGJldHdlZW4gY2FsbHMgYXJlIHN0b3JlZCBpbiBTQVZFX1BUUi4gICovCitleHRlcm4gY2hhciAqX19zdHJ0b2tfciAoY2hhciAqX19yZXN0cmljdCBfX3MsCisJCQkgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0sCisJCQkgY2hhciAqKl9fcmVzdHJpY3QgX19zYXZlX3B0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKK2V4dGVybiBjaGFyICpzdHJ0b2tfciAoY2hhciAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLAorCQkgICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19zYXZlX3B0cikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogU2ltaWxhciB0byBgc3Ryc3RyJyBidXQgdGhpcyBmdW5jdGlvbiBpZ25vcmVzIHRoZSBjYXNlIG9mIGJvdGggc3RyaW5ncy4gICovCitleHRlcm4gY2hhciAqc3RyY2FzZXN0ciAoX19jb25zdCBjaGFyICpfX2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBORUVETEUgaW4gSEFZU1RBQ0suCisgICBORUVETEUgaXMgTkVFRExFTEVOIGJ5dGVzIGxvbmc7CisgICBIQVlTVEFDSyBpcyBIQVlTVEFDS0xFTiBieXRlcyBsb25nLiAgKi8KK2V4dGVybiB2b2lkICptZW1tZW0gKF9fY29uc3Qgdm9pZCAqX19oYXlzdGFjaywgc2l6ZV90IF9faGF5c3RhY2tsZW4sCisJCSAgICAgX19jb25zdCB2b2lkICpfX25lZWRsZSwgc2l6ZV90IF9fbmVlZGxlbGVuKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAzKSk7CisKKy8qIENvcHkgTiBieXRlcyBvZiBTUkMgdG8gREVTVCwgcmV0dXJuIHBvaW50ZXIgdG8gYnl0ZXMgYWZ0ZXIgdGhlCisgICBsYXN0IHdyaXR0ZW4gYnl0ZS4gICovCitleHRlcm4gdm9pZCAqX19tZW1wY3B5ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCV9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gdm9pZCAqbWVtcGNweSAodm9pZCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCSAgICAgIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFMuICAqLworZXh0ZXJuIHNpemVfdCBzdHJsZW4gKF9fY29uc3QgY2hhciAqX19zKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIEZpbmQgdGhlIGxlbmd0aCBvZiBTVFJJTkcsIGJ1dCBzY2FuIGF0IG1vc3QgTUFYTEVOIGNoYXJhY3RlcnMuCisgICBJZiBubyAnXDAnIHRlcm1pbmF0b3IgaXMgZm91bmQgaW4gdGhhdCBtYW55IGNoYXJhY3RlcnMsIHJldHVybiBNQVhMRU4uICAqLworZXh0ZXJuIHNpemVfdCBzdHJubGVuIChfX2NvbnN0IGNoYXIgKl9fc3RyaW5nLCBzaXplX3QgX19tYXhsZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIGBlcnJubycgY29kZSBpbiBFUlJOVU0uICAqLworZXh0ZXJuIGNoYXIgKnN0cmVycm9yIChpbnQgX19lcnJudW0pIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTjJLIHx8IGRlZmluZWQgX19VU0VfTUlTQworLyogUmVlbnRyYW50IHZlcnNpb24gb2YgYHN0cmVycm9yJy4KKyAgIFRoZXJlIGFyZSAyIGZsYXZvcnMgb2YgYHN0cmVycm9yX3InLCBHTlUgd2hpY2ggcmV0dXJucyB0aGUgc3RyaW5nCisgICBhbmQgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBzdXBwbGllZCB0ZW1wb3JhcnkgYnVmZmVyIGFuZCBQT1NJWCBvbmUKKyAgIHdoaWNoIGZpbGxzIHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyLgorICAgVG8gdXNlIHRoZSBQT1NJWCB2ZXJzaW9uLCAtRF9YT1BFTl9TT1VSQ0U9NjAwIG9yIC1EX1BPU0lYX0NfU09VUkNFPTIwMDExMkwKKyAgIHdpdGhvdXQgLURfR05VX1NPVVJDRSBpcyBuZWVkZWQsIG90aGVyd2lzZSB0aGUgR05VIHZlcnNpb24gaXMKKyAgIHByZWZlcnJlZC4gICovCisjIGlmIGRlZmluZWQgX19VU0VfWE9QRU4ySyAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKy8qIEZpbGwgQlVGIHdpdGggYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWVhbmluZyBvZiB0aGUgYGVycm5vJyBjb2RlIGluCisgICBFUlJOVU0uICAqLworIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0cmVycm9yX3IsCisJCQkgICAoaW50IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSwKKwkJCSAgIF9feHBnX3N0cmVycm9yX3IpIF9fbm9ubnVsbCAoKDIpKTsKKyMgIGVsc2UKK2V4dGVybiBpbnQgX194cGdfc3RyZXJyb3JfciAoaW50IF9fZXJybnVtLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyMgICBkZWZpbmUgc3RyZXJyb3JfciBfX3hwZ19zdHJlcnJvcl9yCisjICBlbmRpZgorIyBlbHNlCisvKiBJZiBhIHRlbXBvcmFyeSBidWZmZXIgaXMgcmVxdWlyZWQsIGF0IG1vc3QgQlVGTEVOIGJ5dGVzIG9mIEJVRiB3aWxsIGJlCisgICB1c2VkLiAgKi8KK2V4dGVybiBjaGFyICpzdHJlcnJvcl9yIChpbnQgX19lcnJudW0sIGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRyYW5zbGF0ZSBlcnJvciBudW1iZXIgdG8gc3RyaW5nIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIEwuICAqLworZXh0ZXJuIGNoYXIgKnN0cmVycm9yX2wgKGludCBfX2Vycm51bSwgX19sb2NhbGVfdCBfX2wpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBXZSBkZWZpbmUgdGhpcyBmdW5jdGlvbiBhbHdheXMgc2luY2UgYGJ6ZXJvJyBpcyBzb21ldGltZXMgbmVlZGVkIHdoZW4KKyAgIHRoZSBuYW1lc3BhY2UgcnVsZXMgZG9lcyBub3QgYWxsb3cgdGhpcy4gICovCitleHRlcm4gdm9pZCBfX2J6ZXJvICh2b2lkICpfX3MsIHNpemVfdCBfX24pIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBDb3B5IE4gYnl0ZXMgb2YgU1JDIHRvIERFU1QgKGxpa2UgbWVtbW92ZSwgYnV0IGFyZ3MgcmV2ZXJzZWQpLiAgKi8KK2V4dGVybiB2b2lkIGJjb3B5IChfX2NvbnN0IHZvaWQgKl9fc3JjLCB2b2lkICpfX2Rlc3QsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIDAuICAqLworZXh0ZXJuIHZvaWQgYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIENvbXBhcmUgTiBieXRlcyBvZiBTMSBhbmQgUzIgKHNhbWUgYXMgbWVtY21wKS4gICovCitleHRlcm4gaW50IGJjbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTIChzYW1lIGFzIHN0cmNocikuICAqLworZXh0ZXJuIGNoYXIgKmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSkpOworCisvKiBGaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTIChzYW1lIGFzIHN0cnJjaHIpLiAgKi8KK2V4dGVybiBjaGFyICpyaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXyBfX25vbm51bGwgKCgxKSk7CisKKy8qIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCBzZXQgaW4gSSwgb3IgMCBpZiBub25lIGFyZSBzZXQuCisgICBUaGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IGlzIHBvc2l0aW9uIDEsIHRoZSBtb3N0LXNpZ25pZmljYW50IDMyLiAgKi8KK2V4dGVybiBpbnQgZmZzIChpbnQgX19pKSBfX1RIUk9XIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKworLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBub24tc3RhbmRhcmQgYnV0IG5lY2Vzc2FyeSBmb3Igbm9uLTMyIGJpdAorICAgcGxhdGZvcm1zLiAgKi8KKyMgaWZkZWYJX19VU0VfR05VCitleHRlcm4gaW50IGZmc2wgKGxvbmcgaW50IF9fbCkgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisjICBpZmRlZiBfX0dOVUNfXworX19leHRlbnNpb25fXyBleHRlcm4gaW50IGZmc2xsIChsb25nIGxvbmcgaW50IF9fbGwpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworIyAgZW5kaWYKKyMgZW5kaWYKKworLyogQ29tcGFyZSBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCBzdHJjYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworCisvKiBDb21wYXJlIG5vIG1vcmUgdGhhbiBOIGNoYXJzIG9mIFMxIGFuZCBTMiwgaWdub3JpbmcgY2FzZS4gICovCitleHRlcm4gaW50IHN0cm5jYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMikpOworI2VuZGlmIC8qIFVzZSBCU0QuICAqLworCisjaWZkZWYJX19VU0VfR05VCisvKiBBZ2FpbiB2ZXJzaW9ucyBvZiBhIGZldyBmdW5jdGlvbnMgd2hpY2ggdXNlIHRoZSBnaXZlbiBsb2NhbGUgaW5zdGVhZAorICAgb2YgdGhlIGdsb2JhbCBvbmUuICAqLworZXh0ZXJuIGludCBzdHJjYXNlY21wX2wgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyLAorCQkJIF9fbG9jYWxlX3QgX19sb2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIsIDMpKTsKKworZXh0ZXJuIGludCBzdHJuY2FzZWNtcF9sIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwKKwkJCSAgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX18gX19ub25udWxsICgoMSwgMiwgNCkpOworI2VuZGlmCisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIFJldHVybiB0aGUgbmV4dCBERUxJTS1kZWxpbWl0ZWQgdG9rZW4gZnJvbSAqU1RSSU5HUCwKKyAgIHRlcm1pbmF0aW5nIGl0IHdpdGggYSAnXDAnLCBhbmQgdXBkYXRlICpTVFJJTkdQIHRvIHBvaW50IHBhc3QgaXQuICAqLworZXh0ZXJuIGNoYXIgKnN0cnNlcCAoY2hhciAqKl9fcmVzdHJpY3QgX19zdHJpbmdwLAorCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfR05VCisvKiBDb21wYXJlIFMxIGFuZCBTMiBhcyBzdHJpbmdzIGhvbGRpbmcgbmFtZSAmIGluZGljZXMvdmVyc2lvbiBudW1iZXJzLiAgKi8KK2V4dGVybiBpbnQgc3RydmVyc2NtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHNpZ25hbCBudW1iZXIgaW4gU0lHLiAgKi8KK2V4dGVybiBjaGFyICpzdHJzaWduYWwgKGludCBfX3NpZykgX19USFJPVzsKKworLyogQ29weSBTUkMgdG8gREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluIERFU1QuICAqLworZXh0ZXJuIGNoYXIgKl9fc3RwY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBjaGFyICpzdHBjcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QsIHJldHVybmluZyB0aGUgYWRkcmVzcyBvZgorICAgdGhlIGxhc3QgY2hhcmFjdGVyIHdyaXR0ZW4gaW50byBERVNULiAgKi8KK2V4dGVybiBjaGFyICpfX3N0cG5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAorCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKK2V4dGVybiBjaGFyICpzdHBuY3B5IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKworLyogU2F1dGVlIFNUUklORyBicmlza2x5LiAgKi8KK2V4dGVybiBjaGFyICpzdHJmcnkgKGNoYXIgKl9fc3RyaW5nKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRnJvYm5pY2F0ZSBOIGJ5dGVzIG9mIFMuICAqLworZXh0ZXJuIHZvaWQgKm1lbWZyb2IgKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyMgaWZuZGVmIGJhc2VuYW1lCisvKiBSZXR1cm4gdGhlIGZpbGUgbmFtZSB3aXRoaW4gZGlyZWN0b3J5IG9mIEZJTEVOQU1FLiAgV2UgZG9uJ3QKKyAgIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIGlmIHRoZSBgYmFzZW5hbWUnIG1hY3JvIGlzIGF2YWlsYWJsZSAoZGVmaW5lZAorICAgaW4gPGxpYmdlbi5oPikgd2hpY2ggbWFrZXMgdGhlIFhQRyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24KKyAgIGF2YWlsYWJsZS4gICovCitleHRlcm4gY2hhciAqYmFzZW5hbWUgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjIGVuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyCisjIGlmIGRlZmluZWQgX19PUFRJTUlaRV9fICYmICFkZWZpbmVkIF9fT1BUSU1JWkVfU0laRV9fIFwKKyAgICAgJiYgIWRlZmluZWQgX19OT19JTkxJTkVfXyAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cworLyogV2hlbiB1c2luZyBHTlUgQ0Mgd2UgcHJvdmlkZSBzb21lIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBzZWxlY3RlZAorICAgZnVuY3Rpb25zIGZyb20gdGhpcyBoZWFkZXIuICBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIG9wdGltaXphdGlvbnM6CisKKyAgIC0gbWFjaGluZS1kZXBlbmRlbnQgb3B0aW1pemF0aW9ucywgbW9zdCBwcm9iYWJseSB1c2luZyBpbmxpbmUKKyAgICAgYXNzZW1ibGVyIGNvZGU7IHRoZXNlIG1pZ2h0IGJlIHF1aXRlIGV4cGVuc2l2ZSBzaW5jZSB0aGUgY29kZQorICAgICBzaXplIGNhbiBpbmNyZWFzZSBzaWduaWZpY2FudGx5LgorICAgICBUaGVzZSBvcHRpbWl6YXRpb25zIGFyZSBub3QgdXNlZCB1bmxlc3MgdGhlIHN5bWJvbAorCV9fVVNFX1NUUklOR19JTkxJTkVTCisgICAgIGlzIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGhlYWRlci4KKworICAgLSBtYWNoaW5lLWluZGVwZW5kZW50IG9wdGltaXphdGlvbnMgd2hpY2ggZG8gbm90IGluY3JlYXNlIHRoZQorICAgICBjb2RlIHNpemUgc2lnbmlmaWNhbnRseSBhbmQgd2hpY2ggb3B0aW1pemUgbWFpbmx5IHNpdHVhdGlvbnMKKyAgICAgd2hlcmUgb25lIG9yIG1vcmUgYXJndW1lbnRzIGFyZSBjb21waWxlLXRpbWUgY29uc3RhbnRzLgorICAgICBUaGVzZSBvcHRpbWl6YXRpb25zIGFyZSB1c2VkIGFsd2F5cyB3aGVuIHRoZSBjb21waWxlciBpcworICAgICB0YXVnaHQgdG8gb3B0aW1pemUuCisKKyAgIE9uZSBjYW4gaW5oaWJpdCBhbGwgb3B0aW1pemF0aW9ucyBieSBkZWZpbmluZyBfX05PX1NUUklOR19JTkxJTkVTLiAgKi8KKworLyogR2V0IHRoZSBtYWNoaW5lLWRlcGVuZGVudCBvcHRpbWl6YXRpb25zIChpZiBhbnkpLiAgKi8KKyMgIGluY2x1ZGUgPGJpdHMvc3RyaW5nLmg+CisKKy8qIFRoZXNlIGFyZSBnZW5lcmljIG9wdGltaXphdGlvbnMgd2hpY2ggZG8gbm90IGFkZCB0b28gbXVjaCBpbmxpbmUgY29kZS4gICovCisjICBpbmNsdWRlIDxiaXRzL3N0cmluZzIuaD4KKyMgZW5kaWYKKworIyBpZiBfX1VTRV9GT1JUSUZZX0xFVkVMID4gMCAmJiBkZWZpbmVkIF9fZXh0ZXJuX2Fsd2F5c19pbmxpbmUKKy8qIEZ1bmN0aW9ucyB3aXRoIHNlY3VyaXR5IGNoZWNrcy4gICovCisjICBpbmNsdWRlIDxiaXRzL3N0cmluZzMuaD4KKyMgZW5kaWYKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3RyaW5nLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0cmluZ3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3RyaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTJiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0cmluZ3MuaApAQCAtMCwwICsxLDY1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTYsOTcsOTksMjAwMCwyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TVFJJTkdTX0gKKyNkZWZpbmUJX1NUUklOR1NfSAkxCisKKy8qIFdlIGRvbid0IG5lZWQgYW5kIHNob3VsZCBub3QgcmVhZCB0aGlzIGZpbGUgaWYgPHN0cmluZy5oPiB3YXMgYWxyZWFkeQorICAgcmVhZC4gVGhlIG9uZSBleGNlcHRpb24gYmVpbmcgdGhhdCBpZiBfX1VTRV9CU0QgaXNuJ3QgZGVmaW5lZCwgdGhlbgorICAgdGhlc2UgYXJlbid0IGRlZmluZWQgaW4gc3RyaW5nLmgsIHNvIHdlIG5lZWQgdG8gZGVmaW5lIHRoZW0gaGVyZS4gICovCisjaWYgIWRlZmluZWQgX1NUUklOR19IIHx8ICFkZWZpbmVkIF9fVVNFX0JTRAorCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjIGRlZmluZSBfX25lZWRfc2l6ZV90CisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbXBhcmUgTiBieXRlcyBvZiBTMSBhbmQgUzIgKHNhbWUgYXMgbWVtY21wKS4gICovCitleHRlcm4gaW50IGJjbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogQ29weSBOIGJ5dGVzIG9mIFNSQyB0byBERVNUIChsaWtlIG1lbW1vdmUsIGJ1dCBhcmdzIHJldmVyc2VkKS4gICovCitleHRlcm4gdm9pZCBiY29weSAoX19jb25zdCB2b2lkICpfX3NyYywgdm9pZCAqX19kZXN0LCBzaXplX3QgX19uKSBfX1RIUk9XOworCisvKiBTZXQgTiBieXRlcyBvZiBTIHRvIDAuICAqLworZXh0ZXJuIHZvaWQgYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0IHNldCBpbiBJLCBvciAwIGlmIG5vbmUgYXJlIHNldC4KKyAgIFRoZSBsZWFzdC1zaWduaWZpY2FudCBiaXQgaXMgcG9zaXRpb24gMSwgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgMzIuICAqLworZXh0ZXJuIGludCBmZnMgKGludCBfX2kpIF9fVEhST1cgX19hdHRyaWJ1dGVfXyAoKGNvbnN0KSk7CisKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQyBpbiBTIChzYW1lIGFzIHN0cmNocikuICAqLworZXh0ZXJuIGNoYXIgKmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIEZpbmQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBDIGluIFMgKHNhbWUgYXMgc3RycmNocikuICAqLworZXh0ZXJuIGNoYXIgKnJpbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCisvKiBDb21wYXJlIFMxIGFuZCBTMiwgaWdub3JpbmcgY2FzZS4gICovCitleHRlcm4gaW50IHN0cmNhc2VjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogQ29tcGFyZSBubyBtb3JlIHRoYW4gTiBjaGFycyBvZiBTMSBhbmQgUzIsIGlnbm9yaW5nIGNhc2UuICAqLworZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3RyaW5nLmggICovCisKKyNlbmRpZgkvKiBzdHJpbmdzLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N0cm9wdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmMwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N0cm9wdHMuaApAQCAtMCwwICsxLDkyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NUUk9QVFNfSAorI2RlZmluZSBfU1RST1BUU19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMveHRpdHlwZXMuaD4KKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjIGRlZmluZSBfX3VpZF90X2RlZmluZWQKKyNlbmRpZgorCit0eXBlZGVmIF9fdF91c2NhbGFyX3QgdF91c2NhbGFyX3Q7CisKKy8qIEdldCBzeXN0ZW0gc3BlY2lmaWMgY29udGFudHMuICAqLworI2luY2x1ZGUgPGJpdHMvc3Ryb3B0cy5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogVGVzdCB3aGV0aGVyIEZJTERFUyBpcyBhc3NvY2lhdGVkIHdpdGggYSBTVFJFQU0tYmFzZWQgZmlsZS4gICovCitleHRlcm4gaW50IGlzYXN0cmVhbSAoaW50IF9fZmlsZGVzKSBfX1RIUk9XOworCisvKiBSZWNlaXZlIG5leHQgbWVzc2FnZSBmcm9tIGEgU1RSRUFNUyBmaWxlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0bXNnIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19jdGxwdHIsCisJCSAgIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19kYXRhcHRyLAorCQkgICBpbnQgKl9fcmVzdHJpY3QgX19mbGFnc3ApOworCisvKiBSZWNlaXZlIG5leHQgbWVzc2FnZSBmcm9tIGEgU1RSRUFNUyBmaWxlLCB3aXRoICpGTEFHU1AgYWxsb3dpbmcgdG8KKyAgIGNvbnRyb2wgd2hpY2ggbWVzc2FnZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IGdldHBtc2cgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0cmJ1ZiAqX19yZXN0cmljdCBfX2N0bHB0ciwKKwkJICAgIHN0cnVjdCBzdHJidWYgKl9fcmVzdHJpY3QgX19kYXRhcHRyLAorCQkgICAgaW50ICpfX3Jlc3RyaWN0IF9fYmFuZHAsIGludCAqX19yZXN0cmljdCBfX2ZsYWdzcCk7CisKKy8qIFBlcmZvcm0gdGhlIEkvTyBjb250cm9sIG9wZXJhdGlvbiBzcGVjaWZpZWQgYnkgUkVRVUVTVCBvbiBGRC4KKyAgIE9uZSBhcmd1bWVudCBtYXkgZm9sbG93OyBpdHMgcHJlc2VuY2UgYW5kIHR5cGUgZGVwZW5kIG9uIFJFUVVFU1QuCisgICBSZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiBSRVFVRVNULiAgVXN1YWxseSAtMSBpbmRpY2F0ZXMgZXJyb3IuICAqLworZXh0ZXJuIGludCBpb2N0bCAoaW50IF9fZmQsIHVuc2lnbmVkIGxvbmcgaW50IF9fcmVxdWVzdCwgLi4uKSBfX1RIUk9XOworCisvKiBTZW5kIGEgbWVzc2FnZSBvbiBhIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dG1zZyAoaW50IF9fZmlsZGVzLCBfX2NvbnN0IHN0cnVjdCBzdHJidWYgKl9fY3RscHRyLAorCQkgICBfX2NvbnN0IHN0cnVjdCBzdHJidWYgKl9fZGF0YXB0ciwgaW50IF9fZmxhZ3MpOworCisvKiBTZW5kIGEgbWVzc2FnZSBvbiBhIFNUUkVBTSB0byB0aGUgQkFORC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHB1dHBtc2cgKGludCBfX2ZpbGRlcywgX19jb25zdCBzdHJ1Y3Qgc3RyYnVmICpfX2N0bHB0ciwKKwkJICAgIF9fY29uc3Qgc3RydWN0IHN0cmJ1ZiAqX19kYXRhcHRyLCBpbnQgX19iYW5kLCBpbnQgX19mbGFncyk7CisKKy8qIEF0dGFjaCBhIFNUUkVBTVMtYmFzZWQgZmlsZSBkZXNjcmlwdG9yIEZJTERFUyB0byBhIGZpbGUgUEFUSCBpbiB0aGUKKyAgIGZpbGUgc3lzdGVtIG5hbWUgc3BhY2UuICAqLworZXh0ZXJuIGludCBmYXR0YWNoIChpbnQgX19maWxkZXMsIF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XOworCisvKiBEZXRhY2ggYSBuYW1lIFBBVEggZnJvbSBhIFNUUkVBTVMtYmFzZWQgZmlsZSBkZXNjcmlwdG9yLiAgKi8KK2V4dGVybiBpbnQgZmRldGFjaCAoX19jb25zdCBjaGFyICpfX3BhdGgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzdHJvcHRzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2FjY3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2FjY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M2M2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvYWNjdC5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19BQ0NUX0gKKyNkZWZpbmUgX1NZU19BQ0NUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2RlZmluZQlfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgQUNDVF9DT01NIDE2CisKKy8qCisgIGNvbXBfdCBpcyBhIDE2LWJpdCAiZmxvYXRpbmciIHBvaW50IG51bWJlciB3aXRoIGEgMy1iaXQgYmFzZSA4CisgIGV4cG9uZW50IGFuZCBhIDEzLWJpdCBmcmFjdGlvbi4gU2VlIGxpbnV4L2tlcm5lbC9hY2N0LmMgZm9yIHRoZQorICBzcGVjaWZpYyBlbmNvZGluZyBzeXN0ZW0gdXNlZC4KKyovCisKK3R5cGVkZWYgdV9pbnQxNl90IGNvbXBfdDsKKworc3RydWN0IGFjY3QKK3sKKyAgY2hhciBhY19mbGFnOwkJCS8qIEZsYWdzLiAgKi8KKyAgdV9pbnQxNl90IGFjX3VpZDsJCS8qIFJlYWwgdXNlciBJRC4gICovCisgIHVfaW50MTZfdCBhY19naWQ7CQkvKiBSZWFsIGdyb3VwIElELiAgKi8KKyAgdV9pbnQxNl90IGFjX3R0eTsJCS8qIENvbnRyb2xsaW5nIHRlcm1pbmFsLiAgKi8KKyAgdV9pbnQzMl90IGFjX2J0aW1lOwkJLyogQmVnaW5uaW5nIHRpbWUuICAqLworICBjb21wX3QgYWNfdXRpbWU7CQkvKiBVc2VyIHRpbWUuICAqLworICBjb21wX3QgYWNfc3RpbWU7CQkvKiBTeXN0ZW0gdGltZS4gICovCisgIGNvbXBfdCBhY19ldGltZTsJCS8qIEVsYXBzZWQgdGltZS4gICovCisgIGNvbXBfdCBhY19tZW07CQkvKiBBdmVyYWdlIG1lbW9yeSB1c2FnZS4gICovCisgIGNvbXBfdCBhY19pbzsJCQkvKiBDaGFycyB0cmFuc2ZlcnJlZC4gICovCisgIGNvbXBfdCBhY19ydzsJCQkvKiBCbG9ja3MgcmVhZCBvciB3cml0dGVuLiAgKi8KKyAgY29tcF90IGFjX21pbmZsdDsJCS8qIE1pbm9yIHBhZ2VmYXVsdHMuICAqLworICBjb21wX3QgYWNfbWFqZmx0OwkJLyogTWFqb3IgcGFnZWZhdWx0cy4gICovCisgIGNvbXBfdCBhY19zd2FwczsJCS8qIE51bWJlciBvZiBzd2Fwcy4gICovCisgIHVfaW50MzJfdCBhY19leGl0Y29kZTsJLyogUHJvY2VzcyBleGl0Y29kZS4gICovCisgIGNoYXIgYWNfY29tbVtBQ0NUX0NPTU0rMV07CS8qIENvbW1hbmQgbmFtZS4gICovCisgIGNoYXIgYWNfcGFkWzEwXTsJCS8qIFBhZGRpbmcgYnl0ZXMuICAqLworfTsKKworCitzdHJ1Y3QgYWNjdF92MworeworICBjaGFyIGFjX2ZsYWc7CQkJLyogRmxhZ3MgKi8KKyAgY2hhciBhY192ZXJzaW9uOwkJLyogQWx3YXlzIHNldCB0byBBQ0NUX1ZFUlNJT04gKi8KKyAgdV9pbnQxNl90IGFjX3R0eTsJCS8qIENvbnRyb2wgVGVybWluYWwgKi8KKyAgdV9pbnQzMl90IGFjX2V4aXRjb2RlOwkvKiBFeGl0Y29kZSAqLworICB1X2ludDMyX3QgYWNfdWlkOwkJLyogUmVhbCBVc2VyIElEICovCisgIHVfaW50MzJfdCBhY19naWQ7CQkvKiBSZWFsIEdyb3VwIElEICovCisgIHVfaW50MzJfdCBhY19waWQ7CQkvKiBQcm9jZXNzIElEICovCisgIHVfaW50MzJfdCBhY19wcGlkOwkJLyogUGFyZW50IFByb2Nlc3MgSUQgKi8KKyAgdV9pbnQzMl90IGFjX2J0aW1lOwkJLyogUHJvY2VzcyBDcmVhdGlvbiBUaW1lICovCisgIGZsb2F0IGFjX2V0aW1lOwkJLyogRWxhcHNlZCBUaW1lICovCisgIGNvbXBfdCBhY191dGltZTsJCS8qIFVzZXIgVGltZSAqLworICBjb21wX3QgYWNfc3RpbWU7CQkvKiBTeXN0ZW0gVGltZSAqLworICBjb21wX3QgYWNfbWVtOwkJLyogQXZlcmFnZSBNZW1vcnkgVXNhZ2UgKi8KKyAgY29tcF90IGFjX2lvOwkJCS8qIENoYXJzIFRyYW5zZmVycmVkICovCisgIGNvbXBfdCBhY19ydzsJCQkvKiBCbG9ja3MgUmVhZCBvciBXcml0dGVuICovCisgIGNvbXBfdCBhY19taW5mbHQ7CQkvKiBNaW5vciBQYWdlZmF1bHRzICovCisgIGNvbXBfdCBhY19tYWpmbHQ7CQkvKiBNYWpvciBQYWdlZmF1bHRzICovCisgIGNvbXBfdCBhY19zd2FwczsJCS8qIE51bWJlciBvZiBTd2FwcyAqLworICBjaGFyIGFjX2NvbW1bQUNDVF9DT01NXTsJLyogQ29tbWFuZCBOYW1lICovCit9OworCisKK2VudW0KKyAgeworICAgIEFGT1JLID0gMHgwMSwJCS8qIEhhcyBleGVjdXRlZCBmb3JrLCBidXQgbm8gZXhlYy4gICovCisgICAgQVNVID0gMHgwMiwJCQkvKiBVc2VkIHN1cGVyLXVzZXIgcHJpdmlsZWdlcy4gICovCisgICAgQUNPUkUgPSAweDA4LAkJLyogRHVtcGVkIGNvcmUuICAqLworICAgIEFYU0lHID0gMHgxMAkJLyogS2lsbGVkIGJ5IGEgc2lnbmFsLiAgKi8KKyAgfTsKKworI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyMgZGVmaW5lIEFDQ1RfQllURU9SREVSIDB4ODAJLyogQWNjb3VudGluZyBmaWxlIGlzIGJpZyBlbmRpYW4uICAqLworI2Vsc2UKKyMgZGVmaW5lIEFDQ1RfQllURU9SREVSIDB4MDAJLyogQWNjb3VudGluZyBmaWxlIGlzIGxpdHRsZSBlbmRpYW4uICAqLworI2VuZGlmCisKKyNkZWZpbmUgQUhaICAgICAxMDAKKworCisvKiBTd2l0Y2ggcHJvY2VzcyBhY2NvdW50aW5nIG9uIGFuZCBvZmYuICAqLworZXh0ZXJuIGludCBhY2N0IChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvYWNjdC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hc291bmRsaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2Fzb3VuZGxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9hc291bmRsaWIuaApAQCAtMCwwICsxLDIgQEAKKyN3YXJuaW5nIFRoaXMgaGVhZGVyIGlzIGRlcHJlY2F0ZWQsIHVzZSA8YWxzYS9hc291bmRsaWIuaD4gaW5zdGVhZC4KKyNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvYml0eXBlcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvYml0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTg2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9iaXR5cGVzLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGUgR05VIDxzeXMvdHlwZXMuaD4gZGVmaW5lcyBhbGwgdGhlIG5lY2Vzc2FyeSB0eXBlcy4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGM0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9jZGVmcy5oCkBAIC0wLDAgKzEsMzgyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTItMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19DREVGU19ICisjZGVmaW5lCV9TWVNfQ0RFRlNfSAkxCisKKy8qIFdlIGFyZSBhbG1vc3QgYWx3YXlzIGluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaC4gKi8KKyNpZm5kZWYgX0ZFQVRVUkVTX0gKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisvKiBUaGUgR05VIGxpYmMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgSyZSIGNvbXBpbGVycyBvciB0aGUgdHJhZGl0aW9uYWwgbW9kZQorICAgb2YgSVNPIEMgY29tcGlsZXJzIGFueW1vcmUuICBDaGVjayBmb3Igc29tZSBvZiB0aGUgY29tYmluYXRpb25zIG5vdAorICAgYW55bW9yZSBzdXBwb3J0ZWQuICAqLworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQgX19TVERDX18KKyMgZXJyb3IgIllvdSBuZWVkIGEgSVNPIEMgY29uZm9ybWluZyBjb21waWxlciB0byB1c2UgdGhlIGdsaWJjIGhlYWRlcnMiCisjZW5kaWYKKworLyogU29tZSB1c2VyIGhlYWRlciBmaWxlIG1pZ2h0IGhhdmUgZGVmaW5lZCB0aGlzIGJlZm9yZS4gICovCisjdW5kZWYJX19QCisjdW5kZWYJX19QTVQKKworI2lmZGVmIF9fR05VQ19fCisKKy8qIEdDQyBjYW4gYWx3YXlzIGdyb2sgcHJvdG90eXBlcy4gIEZvciBDKysgcHJvZ3JhbXMgd2UgYWRkIHRocm93KCkKKyAgIHRvIGhlbHAgaXQgb3B0aW1pemUgdGhlIGZ1bmN0aW9uIGNhbGxzLiAgQnV0IHRoaXMgd29ya3Mgb25seSB3aXRoCisgICBnY2MgMi44LnggYW5kIGVnY3MuICBGb3IgZ2NjIDMuMiBhbmQgdXAgd2UgZXZlbiBtYXJrIEMgZnVuY3Rpb25zCisgICBhcyBub24tdGhyb3dpbmcgdXNpbmcgYSBmdW5jdGlvbiBhdHRyaWJ1dGUgc2luY2UgcHJvZ3JhbXMgY2FuIHVzZQorICAgdGhlIC1mZXhjZXB0aW9ucyBvcHRpb25zIGZvciBDIGNvZGUgYXMgd2VsbC4gICovCisjIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzICYmIF9fR05VQ19QUkVSRVEgKDMsIDMpCisjICBkZWZpbmUgX19USFJPVwlfX2F0dHJpYnV0ZV9fICgoX19ub3Rocm93X18pKQorIyAgZGVmaW5lIF9fTlRIKGZjdCkJX19hdHRyaWJ1dGVfXyAoKF9fbm90aHJvd19fKSkgZmN0CisjIGVsc2UKKyMgIGlmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19HTlVDX1BSRVJFUSAoMiw4KQorIyAgIGRlZmluZSBfX1RIUk9XCXRocm93ICgpCisjICAgZGVmaW5lIF9fTlRIKGZjdCkJZmN0IHRocm93ICgpCisjICBlbHNlCisjICAgZGVmaW5lIF9fVEhST1cKKyMgICBkZWZpbmUgX19OVEgoZmN0KQlmY3QKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbHNlCS8qIE5vdCBHQ0MuICAqLworCisjIGRlZmluZSBfX2lubGluZQkJLyogTm8gaW5saW5lIGZ1bmN0aW9ucy4gICovCisKKyMgZGVmaW5lIF9fVEhST1cKKyMgZGVmaW5lIF9fTlRIKGZjdCkJZmN0CisKKyMgZGVmaW5lIF9fY29uc3QJY29uc3QKKyMgZGVmaW5lIF9fc2lnbmVkCXNpZ25lZAorIyBkZWZpbmUgX192b2xhdGlsZQl2b2xhdGlsZQorCisjZW5kaWYJLyogR0NDLiAgKi8KKworLyogVGhlc2UgdHdvIG1hY3JvcyBhcmUgbm90IHVzZWQgaW4gZ2xpYmMgYW55bW9yZS4gIFRoZXkgYXJlIGtlcHQgaGVyZQorICAgb25seSBiZWNhdXNlIHNvbWUgb3RoZXIgcHJvamVjdHMgZXhwZWN0IHRoZSBtYWNyb3MgdG8gYmUgZGVmaW5lZC4gICovCisjZGVmaW5lIF9fUChhcmdzKQlhcmdzCisjZGVmaW5lIF9fUE1UKGFyZ3MpCWFyZ3MKKworLyogRm9yIHRoZXNlIHRoaW5ncywgR0NDIGJlaGF2ZXMgdGhlIEFOU0kgd2F5IG5vcm1hbGx5LAorICAgYW5kIHRoZSBub24tQU5TSSB3YXkgdW5kZXIgLXRyYWRpdGlvbmFsLiAgKi8KKworI2RlZmluZSBfX0NPTkNBVCh4LHkpCXggIyMgeQorI2RlZmluZSBfX1NUUklORyh4KQkjeAorCisvKiBUaGlzIGlzIG5vdCBhIHR5cGVkZWYgc28gYGNvbnN0IF9fcHRyX3QnIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KKyNkZWZpbmUgX19wdHJfdCB2b2lkICoKKyNkZWZpbmUgX19sb25nX2RvdWJsZV90ICBsb25nIGRvdWJsZQorCisKKy8qIEMrKyBuZWVkcyB0byBrbm93IHRoYXQgdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyBhcmUgQywgbm90IEMrKy4gICovCisjaWZkZWYJX19jcGx1c3BsdXMKKyMgZGVmaW5lIF9fQkVHSU5fREVDTFMJZXh0ZXJuICJDIiB7CisjIGRlZmluZSBfX0VORF9ERUNMUwl9CisjZWxzZQorIyBkZWZpbmUgX19CRUdJTl9ERUNMUworIyBkZWZpbmUgX19FTkRfREVDTFMKKyNlbmRpZgorCisKKy8qIFRoZSBzdGFuZGFyZCBsaWJyYXJ5IG5lZWRzIHRoZSBmdW5jdGlvbnMgZnJvbSB0aGUgSVNPIEM5MCBzdGFuZGFyZAorICAgaW4gdGhlIHN0ZCBuYW1lc3BhY2UuICBBdCB0aGUgc2FtZSB0aW1lIHdlIHdhbnQgdG8gYmUgc2FmZSBmb3IKKyAgIGZ1dHVyZSBjaGFuZ2VzIGFuZCB3ZSBpbmNsdWRlIHRoZSBJU08gQzk5IGNvZGUgaW4gdGhlIG5vbi1zdGFuZGFyZAorICAgbmFtZXNwYWNlIF9fYzk5LiAgVGhlIEMrKyB3cmFwcGVyIGhlYWRlciB0YWtlIGNhc2Ugb2YgYWRkaW5nIHRoZQorICAgZGVmaW5pdGlvbnMgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAqLworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgZGVmaW5lZCBfR0xJQkNQUF9VU0VfTkFNRVNQQUNFUworIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfU1RECW5hbWVzcGFjZSBzdGQgeworIyBkZWZpbmUgX19FTkRfTkFNRVNQQUNFX1NURAl9CisjIGRlZmluZSBfX1VTSU5HX05BTUVTUEFDRV9TVEQobmFtZSkgdXNpbmcgc3RkOjpuYW1lOworIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CW5hbWVzcGFjZSBfX2M5OSB7CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfQzk5CX0KKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX0M5OShuYW1lKSB1c2luZyBfX2M5OTo6bmFtZTsKKyNlbHNlCisvKiBGb3IgY29tcGF0aWJpbGl0eSB3ZSBkbyBub3QgYWRkIHRoZSBkZWNsYXJhdGlvbnMgaW50byBhbnkKKyAgIG5hbWVzcGFjZS4gIFRoZXkgd2lsbCBlbmQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2Ugd2hpY2ggaXMgd2hhdAorICAgb2xkIGNvZGUgZXhwZWN0cy4gICovCisjIGRlZmluZSBfX0JFR0lOX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9fRU5EX05BTUVTUEFDRV9TVEQKKyMgZGVmaW5lIF9fVVNJTkdfTkFNRVNQQUNFX1NURChuYW1lKQorIyBkZWZpbmUgX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfX0VORF9OQU1FU1BBQ0VfQzk5CisjIGRlZmluZSBfX1VTSU5HX05BTUVTUEFDRV9DOTkobmFtZSkKKyNlbmRpZgorCisKKy8qIFN1cHBvcnQgZm9yIGJvdW5kZWQgcG9pbnRlcnMuICAqLworI2lmbmRlZiBfX0JPVU5ERURfUE9JTlRFUlNfXworIyBkZWZpbmUgX19ib3VuZGVkCS8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIF9fdW5ib3VuZGVkCS8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIF9fcHRydmFsdWUJLyogbm90aGluZyAqLworI2VuZGlmCisKKworLyogRm9ydGlmeSBzdXBwb3J0LiAgKi8KKyNkZWZpbmUgX19ib3MocHRyKSBfX2J1aWx0aW5fb2JqZWN0X3NpemUgKHB0ciwgX19VU0VfRk9SVElGWV9MRVZFTCA+IDEpCisjZGVmaW5lIF9fYm9zMChwdHIpIF9fYnVpbHRpbl9vYmplY3Rfc2l6ZSAocHRyLCAwKQorCisjaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyBkZWZpbmUgX193YXJuZGVjbChuYW1lLCBtc2cpIFwKKyAgZXh0ZXJuIHZvaWQgbmFtZSAodm9pZCkgX19hdHRyaWJ1dGVfXygoX193YXJuaW5nX18gKG1zZykpKQorIyBkZWZpbmUgX193YXJuYXR0cihtc2cpIF9fYXR0cmlidXRlX18oKF9fd2FybmluZ19fIChtc2cpKSkKKyMgZGVmaW5lIF9fZXJyb3JkZWNsKG5hbWUsIG1zZykgXAorICBleHRlcm4gdm9pZCBuYW1lICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX2Vycm9yX18gKG1zZykpKQorI2Vsc2UKKyMgZGVmaW5lIF9fd2FybmRlY2wobmFtZSwgbXNnKSBleHRlcm4gdm9pZCBuYW1lICh2b2lkKQorIyBkZWZpbmUgX193YXJuYXR0cihtc2cpCisjIGRlZmluZSBfX2Vycm9yZGVjbChuYW1lLCBtc2cpIGV4dGVybiB2b2lkIG5hbWUgKHZvaWQpCisjZW5kaWYKKworLyogU3VwcG9ydCBmb3IgZmxleGlibGUgYXJyYXlzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDk3KQorLyogR0NDIDIuOTcgc3VwcG9ydHMgQzk5IGZsZXhpYmxlIGFycmF5IG1lbWJlcnMuICAqLworIyBkZWZpbmUgX19mbGV4YXJyCVtdCisjZWxzZQorIyBpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fZmxleGFycglbMF0KKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIyAgIGRlZmluZSBfX2ZsZXhhcnIJW10KKyMgIGVsc2UKKy8qIFNvbWUgb3RoZXIgbm9uLUM5OSBjb21waWxlci4gIEFwcHJveGltYXRlIHdpdGggWzFdLiAgKi8KKyMgICBkZWZpbmUgX19mbGV4YXJyCVsxXQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIF9fYXNtX18gKCJ4eXoiKSBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGhlYWRlcnMgdG8gcmVuYW1lIGZ1bmN0aW9ucworICAgYXQgdGhlIGFzc2VtYmx5IGxhbmd1YWdlIGxldmVsLiAgVGhpcyBpcyB3cmFwcGVkIGJ5IHRoZSBfX1JFRElSRUNUCisgICBtYWNybywgaW4gb3JkZXIgdG8gc3VwcG9ydCBjb21waWxlcnMgdGhhdCBjYW4gZG8gdGhpcyBzb21lIG90aGVyCisgICB3YXkuICBXaGVuIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IGFzbS1uYW1lcyBhdCBhbGwsIHdlIGhhdmUgdG8gZG8KKyAgIHByZXByb2Nlc3NvciB0cmlja3MgaW5zdGVhZCAod2hpY2ggZG9uJ3QgaGF2ZSBleGFjdGx5IHRoZSByaWdodAorICAgc2VtYW50aWNzLCBidXQgaXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8pLgorCisgICBFeGFtcGxlOgorICAgaW50IF9fUkVESVJFQ1Qoc2V0cGdycCwgKF9fcGlkX3QgcGlkLCBfX3BpZF90IHBncnApLCBzZXRwZ2lkKTsgKi8KKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCisjIGRlZmluZSBfX1JFRElSRUNUKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19SRURJUkVDVF9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBcCisgICAgIG5hbWUgcHJvdG8gX19USFJPVyBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpCisjIGVsc2UKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgICAgbmFtZSBwcm90byBfX2FzbV9fIChfX0FTTU5BTUUgKCNhbGlhcykpIF9fVEhST1cKKyMgZW5kaWYKKyMgZGVmaW5lIF9fQVNNTkFNRShjbmFtZSkgIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCisjIGRlZmluZSBfX0FTTU5BTUUyKHByZWZpeCwgY25hbWUpIF9fU1RSSU5HIChwcmVmaXgpIGNuYW1lCisKKy8qCisjZWxpZiBfX1NPTUVfT1RIRVJfQ09NUElMRVJfXworCisjIGRlZmluZSBfX1JFRElSRUNUKG5hbWUsIHByb3RvLCBhbGlhcykgbmFtZSBwcm90bzsgXAorCV9QcmFnbWEoImxldCAiICNuYW1lICIgPSAiICNhbGlhcykKKyovCisjZW5kaWYKKworLyogR0NDIGhhcyB2YXJpb3VzIHVzZWZ1bCBkZWNsYXJhdGlvbnMgdGhhdCBjYW4gYmUgbWFkZSB3aXRoIHRoZQorICAgYF9fYXR0cmlidXRlX18nIHN5bnRheC4gIEFsbCBvZiB0aGUgd2F5cyB3ZSB1c2UgdGhpcyBkbyBmaW5lIGlmCisgICB0aGV5IGFyZSBvbWl0dGVkIGZvciBjb21waWxlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIGl0LiAqLworI2lmICFkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMgorIyBkZWZpbmUgX19hdHRyaWJ1dGVfXyh4eXopCS8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBnY2MgMi45NiBkZXZlbG9wbWVudCB0aGUgYG1hbGxvYycgYXR0cmlidXRlCisgICBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQgdW5jb25kaXRpb25hbGx5CisgICAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgyLDk2KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfbWFsbG9jX18gX19hdHRyaWJ1dGVfXyAoKF9fbWFsbG9jX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX21hbGxvY19fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBnY2MgMi45NiBkZXZlbG9wbWVudCB0aGUgYHB1cmUnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw5NikKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXyBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3B1cmVfXyAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDMuMSBkZXZlbG9wbWVudCB0aGUgYHVzZWQnIGF0dHJpYnV0ZQorICAgZm9yIGZ1bmN0aW9ucyB3YXMgaW50cm9kdWNlZC4gIFdlIGRvbid0IHdhbnQgdG8gdXNlIGl0IHVuY29uZGl0aW9uYWxseQorICAgKGFsdGhvdWdoIHRoaXMgd291bGQgYmUgcG9zc2libGUpIHNpbmNlIGl0IGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywxKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfdXNlZF9fIF9fYXR0cmlidXRlX18gKChfX3VzZWRfXykpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9ub2lubGluZV9fIF9fYXR0cmlidXRlX18gKChfX25vaW5saW5lX18pKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV9ub2lubGluZV9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIGdjYyBhbGxvd3MgbWFya2luZyBkZXByZWNhdGVkIGZ1bmN0aW9ucy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywyKQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIF9fYXR0cmlidXRlX18gKChfX2RlcHJlY2F0ZWRfXykpCisjZWxzZQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZGVwcmVjYXRlZF9fIC8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIEF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBnY2MgMi44IGRldmVsb3BtZW50IHRoZSBgZm9ybWF0X2FyZycgYXR0cmlidXRlCisgICBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQgdW5jb25kaXRpb25hbGx5CisgICAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQgZ2VuZXJhdGVzIHdhcm5pbmdzLgorICAgSWYgc2V2ZXJhbCBgZm9ybWF0X2FyZycgYXR0cmlidXRlcyBhcmUgZ2l2ZW4gZm9yIHRoZSBzYW1lIGZ1bmN0aW9uLCBpbgorICAgZ2NjLTMuMCBhbmQgb2xkZXIsIGFsbCBidXQgdGhlIGxhc3Qgb25lIGFyZSBpZ25vcmVkLiAgSW4gbmV3ZXIgZ2NjcywKKyAgIGFsbCBkZXNpZ25hdGVkIGFyZ3VtZW50cyBhcmUgY29uc2lkZXJlZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw4KQorIyBkZWZpbmUgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9hcmdfXyAoeCkpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9hcmdfXyh4KSAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBBdCBzb21lIHBvaW50IGR1cmluZyB0aGUgZ2NjIDIuOTcgZGV2ZWxvcG1lbnQgdGhlIGBzdHJmbW9uJyBmb3JtYXQKKyAgIGF0dHJpYnV0ZSBmb3IgZnVuY3Rpb25zIHdhcyBpbnRyb2R1Y2VkLiAgV2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQKKyAgIHVuY29uZGl0aW9uYWxseSAoYWx0aG91Z2ggdGhpcyB3b3VsZCBiZSBwb3NzaWJsZSkgc2luY2UgaXQKKyAgIGdlbmVyYXRlcyB3YXJuaW5ncy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMiw5NykKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18oYSxiKSBcCisgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3N0cmZtb25fXywgYSwgYikpKQorI2Vsc2UKKyMgZGVmaW5lIF9fYXR0cmlidXRlX2Zvcm1hdF9zdHJmbW9uX18oYSxiKSAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBUaGUgbm9udWxsIGZ1bmN0aW9uIGF0dHJpYnV0ZSBhbGxvd3MgdG8gbWFyayBwb2ludGVyIHBhcmFtZXRlcnMgd2hpY2gKKyAgIG11c3Qgbm90IGJlIE5VTEwuICAqLworI2lmIF9fR05VQ19QUkVSRVEgKDMsMykKKyMgZGVmaW5lIF9fbm9ubnVsbChwYXJhbXMpIF9fYXR0cmlidXRlX18gKChfX25vbm51bGxfXyBwYXJhbXMpKQorI2Vsc2UKKyMgZGVmaW5lIF9fbm9ubnVsbChwYXJhbXMpCisjZW5kaWYKKworLyogSWYgZm9ydGlmaWNhdGlvbiBtb2RlLCB3ZSB3YXJuIGFib3V0IHVudXNlZCByZXN1bHRzIG9mIGNlcnRhaW4KKyAgIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGNhbiBsZWFkIHRvIHByb2JsZW1zLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRICgzLDQpCisjIGRlZmluZSBfX2F0dHJpYnV0ZV93YXJuX3VudXNlZF9yZXN1bHRfXyBcCisgICBfX2F0dHJpYnV0ZV9fICgoX193YXJuX3VudXNlZF9yZXN1bHRfXykpCisjIGlmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwCisjICBkZWZpbmUgX193dXIgX19hdHRyaWJ1dGVfd2Fybl91bnVzZWRfcmVzdWx0X18KKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBfX2F0dHJpYnV0ZV93YXJuX3VudXNlZF9yZXN1bHRfXyAvKiBlbXB0eSAqLworI2VuZGlmCisjaWZuZGVmIF9fd3VyCisjIGRlZmluZSBfX3d1ciAvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBGb3JjZXMgYSBmdW5jdGlvbiB0byBiZSBhbHdheXMgaW5saW5lZC4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywyKQorIyBkZWZpbmUgX19hbHdheXNfaW5saW5lIF9faW5saW5lIF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCisjZWxzZQorIyBkZWZpbmUgX19hbHdheXNfaW5saW5lIF9faW5saW5lCisjZW5kaWYKKworLyogR0NDIDQuMyBhbmQgYWJvdmUgd2l0aCAtc3RkPWM5OSBvciAtc3RkPWdudTk5IGltcGxlbWVudHMgSVNPIEM5OQorICAgaW5saW5lIHNlbWFudGljcywgdW5sZXNzIC1mZ251ODktaW5saW5lIGlzIHVzZWQuICAqLworI2lmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IF9fR05VQ19QUkVSRVEgKDQsMykKKyMgaWYgZGVmaW5lZCBfX0dOVUNfU1REQ19JTkxJTkVfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICBkZWZpbmUgX19leHRlcm5faW5saW5lIGV4dGVybiBfX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18pKQorIyAgaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyAgIGRlZmluZSBfX2V4dGVybl9hbHdheXNfaW5saW5lIFwKKyAgZXh0ZXJuIF9fYWx3YXlzX2lubGluZSBfX2F0dHJpYnV0ZV9fICgoX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgX19leHRlcm5fYWx3YXlzX2lubGluZSBcCisgIGV4dGVybiBfX2Fsd2F5c19pbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fZ251X2lubGluZV9fKSkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBfX2V4dGVybl9pbmxpbmUgZXh0ZXJuIF9faW5saW5lCisjICBkZWZpbmUgX19leHRlcm5fYWx3YXlzX2lubGluZSBleHRlcm4gX19hbHdheXNfaW5saW5lCisjIGVuZGlmCisjZW5kaWYKKworLyogR0NDIDQuMyBhbmQgYWJvdmUgYWxsb3cgcGFzc2luZyBhbGwgYW5vbnltb3VzIGFyZ3VtZW50cyBvZiBhbgorICAgX19leHRlcm5fYWx3YXlzX2lubGluZSBmdW5jdGlvbiB0byBzb21lIG90aGVyIHZhcmFyZyBmdW5jdGlvbi4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoNCwzKQorIyBkZWZpbmUgX192YV9hcmdfcGFjaygpIF9fYnVpbHRpbl92YV9hcmdfcGFjayAoKQorIyBkZWZpbmUgX192YV9hcmdfcGFja19sZW4oKSBfX2J1aWx0aW5fdmFfYXJnX3BhY2tfbGVuICgpCisjZW5kaWYKKworLyogSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSBjb250YWluaW5nIEdDQyBleHRlbnNpb25zIGV2ZW4gaWYgR0NDIGlzCisgICBydW4gaW4gcGVkYW50aWMgbW9kZSBpZiB0aGUgdXNlcyBhcmUgY2FyZWZ1bGx5IG1hcmtlZCB1c2luZyB0aGUKKyAgIGBfX2V4dGVuc2lvbl9fJyBrZXl3b3JkLiAgQnV0IHRoaXMgaXMgbm90IGdlbmVyYWxseSBhdmFpbGFibGUgYmVmb3JlCisgICB2ZXJzaW9uIDIuOC4gICovCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsOCkKKyMgZGVmaW5lIF9fZXh0ZW5zaW9uX18JCS8qIElnbm9yZSAqLworI2VuZGlmCisKKy8qIF9fcmVzdHJpY3QgaXMga25vd24gaW4gRUdDUyAxLjIgYW5kIGFib3ZlLiAqLworI2lmICFfX0dOVUNfUFJFUkVRICgyLDkyKQorIyBkZWZpbmUgX19yZXN0cmljdAkvKiBJZ25vcmUgKi8KKyNlbmRpZgorCisvKiBJU08gQzk5IGFsc28gYWxsb3dzIHRvIGRlY2xhcmUgYXJyYXlzIGFzIG5vbi1vdmVybGFwcGluZy4gIFRoZSBzeW50YXggaXMKKyAgICAgYXJyYXlfbmFtZVtyZXN0cmljdF0KKyAgIEdDQyAzLjEgc3VwcG9ydHMgdGhpcy4gICovCisjaWYgX19HTlVDX1BSRVJFUSAoMywxKSAmJiAhZGVmaW5lZCBfX0dOVUdfXworIyBkZWZpbmUgX19yZXN0cmljdF9hcnIJX19yZXN0cmljdAorI2Vsc2UKKyMgaWZkZWYgX19HTlVDX18KKyMgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgkvKiBOb3Qgc3VwcG9ydGVkIGluIG9sZCBHQ0MuICAqLworIyBlbHNlCisjICBpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgZGVmaW5lIF9fcmVzdHJpY3RfYXJyCXJlc3RyaWN0CisjICBlbHNlCisvKiBTb21lIG90aGVyIG5vbi1DOTkgY29tcGlsZXIuICAqLworIyAgIGRlZmluZSBfX3Jlc3RyaWN0X2FycgkvKiBOb3Qgc3VwcG9ydGVkLiAgKi8KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworI2lmIGRlZmluZWQgX19MT05HX0RPVUJMRV9NQVRIX09QVElPTkFMICYmIGRlZmluZWQgX19OT19MT05HX0RPVUJMRV9NQVRICisjIGRlZmluZSBfX0xEQkxfQ09NUEFUIDEKKyMgaWZkZWYgX19SRURJUkVDVAorIyAgZGVmaW5lIF9fTERCTF9SRURJUjEobmFtZSwgcHJvdG8sIGFsaWFzKSBfX1JFRElSRUNUIChuYW1lLCBwcm90bywgYWxpYXMpCisjICBkZWZpbmUgX19MREJMX1JFRElSKG5hbWUsIHByb3RvKSBcCisgIF9fTERCTF9SRURJUjEgKG5hbWUsIHByb3RvLCBfX25sZGJsXyMjbmFtZSkKKyMgIGRlZmluZSBfX0xEQkxfUkVESVIxX05USChuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1RfTlRIIChuYW1lLCBwcm90bywgYWxpYXMpCisjICBkZWZpbmUgX19MREJMX1JFRElSX05USChuYW1lLCBwcm90bykgXAorICBfX0xEQkxfUkVESVIxX05USCAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNuYW1lKQorIyAgZGVmaW5lIF9fTERCTF9SRURJUjFfREVDTChuYW1lLCBhbGlhcykgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIG5hbWUgX19hc20gKF9fQVNNTkFNRSAoI2FsaWFzKSk7CisjICBkZWZpbmUgX19MREJMX1JFRElSX0RFQ0wobmFtZSkgXAorICBleHRlcm4gX190eXBlb2YgKG5hbWUpIG5hbWUgX19hc20gKF9fQVNNTkFNRSAoIl9fbmxkYmxfIiAjbmFtZSkpOworIyAgZGVmaW5lIF9fUkVESVJFQ1RfTERCTChuYW1lLCBwcm90bywgYWxpYXMpIFwKKyAgX19MREJMX1JFRElSMSAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNhbGlhcykKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX0xEQkxfUkVESVIxX05USCAobmFtZSwgcHJvdG8sIF9fbmxkYmxfIyNhbGlhcykKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVAorIyBkZWZpbmUgX19MREJMX1JFRElSMShuYW1lLCBwcm90bywgYWxpYXMpIG5hbWUgcHJvdG8KKyMgZGVmaW5lIF9fTERCTF9SRURJUihuYW1lLCBwcm90bykgbmFtZSBwcm90bworIyBkZWZpbmUgX19MREJMX1JFRElSMV9OVEgobmFtZSwgcHJvdG8sIGFsaWFzKSBuYW1lIHByb3RvIF9fVEhST1cKKyMgZGVmaW5lIF9fTERCTF9SRURJUl9OVEgobmFtZSwgcHJvdG8pIG5hbWUgcHJvdG8gX19USFJPVworIyBkZWZpbmUgX19MREJMX1JFRElSX0RFQ0wobmFtZSkKKyMgaWZkZWYgX19SRURJUkVDVAorIyAgZGVmaW5lIF9fUkVESVJFQ1RfTERCTChuYW1lLCBwcm90bywgYWxpYXMpIF9fUkVESVJFQ1QgKG5hbWUsIHByb3RvLCBhbGlhcykKKyMgIGRlZmluZSBfX1JFRElSRUNUX05USF9MREJMKG5hbWUsIHByb3RvLCBhbGlhcykgXAorICBfX1JFRElSRUNUX05USCAobmFtZSwgcHJvdG8sIGFsaWFzKQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgkgLyogc3lzL2NkZWZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2RlYnVncmVnLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9kZWJ1Z3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmJmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9kZWJ1Z3JlZy5oCkBAIC0wLDAgKzEsODggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0RFQlVHUkVHX0gKKyNkZWZpbmUgX1NZU19ERUJVR1JFR19ICTEKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKy8qIEluZGljYXRlIHRoZSByZWdpc3RlciBudW1iZXJzIGZvciBhIG51bWJlciBvZiB0aGUgc3BlY2lmaWMKKyAgIGRlYnVnIHJlZ2lzdGVycy4gIFJlZ2lzdGVycyAwLTMgY29udGFpbiB0aGUgYWRkcmVzc2VzIHdlIHdpc2ggdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9GSVJTVEFERFIgMCAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9GSVJTVEFERFJdICovCisjZGVmaW5lIERSX0xBU1RBRERSIDMgICAgICAgICAvKiB1X2RlYnVncmVnW0RSX0xBU1RBRERSXSAgKi8KKworI2RlZmluZSBEUl9TVEFUVVMgNiAgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9TVEFUVVNdICAgICAqLworI2RlZmluZSBEUl9DT05UUk9MIDcgICAgICAgICAgLyogdV9kZWJ1Z3JlZ1tEUl9DT05UUk9MXSAqLworCisvKiBEZWZpbmUgYSBmZXcgdGhpbmdzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAgV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZQorICAgd2hpY2ggZGVidWdnaW5nIHJlZ2lzdGVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIHRyYXAuICBUaGUgb3RoZXIgYml0cworICAgYXJlIGVpdGhlciByZXNlcnZlZCBvciBub3Qgb2YgaW50ZXJlc3QgdG8gdXMuICovCisKKyNkZWZpbmUgRFJfVFJBUDAJKDB4MSkJCS8qIGRiMCAqLworI2RlZmluZSBEUl9UUkFQMQkoMHgyKQkJLyogZGIxICovCisjZGVmaW5lIERSX1RSQVAyCSgweDQpCQkvKiBkYjIgKi8KKyNkZWZpbmUgRFJfVFJBUDMJKDB4OCkJCS8qIGRiMyAqLworCisjZGVmaW5lIERSX1NURVAJCSgweDQwMDApCS8qIHNpbmdsZS1zdGVwICovCisjZGVmaW5lIERSX1NXSVRDSAkoMHg4MDAwKQkvKiB0YXNrIHN3aXRjaCAqLworCisvKiBOb3cgZGVmaW5lIGEgYnVuY2ggb2YgdGhpbmdzIGZvciBtYW5pcHVsYXRpbmcgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCisgICBUaGUgdG9wIHR3byBieXRlcyBvZiB0aGUgY29udHJvbCByZWdpc3RlciBjb25zaXN0IG9mIDQgZmllbGRzIG9mIDQKKyAgIGJpdHMgLSBlYWNoIGZpZWxkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUgZm91ciBkZWJ1ZyByZWdpc3RlcnMsCisgICBhbmQgaW5kaWNhdGVzIHdoYXQgdHlwZXMgb2YgYWNjZXNzIHdlIHRyYXAgb24sIGFuZCBob3cgbGFyZ2UgdGhlIGRhdGEKKyAgIGZpZWxkIGlzIHRoYXQgd2UgYXJlIGxvb2tpbmcgYXQgKi8KKworI2RlZmluZSBEUl9DT05UUk9MX1NISUZUIDE2ICAgLyogU2tpcCB0aGlzIG1hbnkgYml0cyBpbiBjdGwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFJfQ09OVFJPTF9TSVpFICA0ICAgIC8qIDQgY29udHJvbCBiaXRzIHBlciByZWdpc3RlciAqLworCisjZGVmaW5lIERSX1JXX0VYRUNVVEUJKDB4MCkgLyogU2V0dGluZ3MgZm9yIHRoZSBhY2Nlc3MgdHlwZXMgdG8gdHJhcCBvbiAqLworI2RlZmluZSBEUl9SV19XUklURQkoMHgxKQorI2RlZmluZSBEUl9SV19SRUFECSgweDMpCisKKyNkZWZpbmUgRFJfTEVOXzEgKDB4MCkJICAgICAgLyogU2V0dGluZ3MgZm9yIGRhdGEgbGVuZ3RoIHRvIHRyYXAgb24gKi8KKyNkZWZpbmUgRFJfTEVOXzIgKDB4NCkKKyNkZWZpbmUgRFJfTEVOXzQgKDB4QykKKyNkZWZpbmUgRFJfTEVOXzggKDB4OCkKKworLyogVGhlIGxvdyBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGRldGVybWluZSB3aGljaCByZWdpc3RlcnMgYXJlCisgICBlbmFibGVkLiAgVGhlcmUgYXJlIDQgZmllbGRzIG9mIHR3byBiaXRzLiAgT25lIGJpdCBpcyAibG9jYWwiLCBtZWFuaW5nCisgICB0aGF0IHRoZSBwcm9jZXNzb3Igd2lsbCByZXNldCB0aGUgYml0IGFmdGVyIGEgdGFzayBzd2l0Y2ggYW5kIHRoZSBvdGhlcgorICAgaXMgZ2xvYmFsIG1lYW5pbmcgdGhhdCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgcmVzZXQgdGhlIGJpdC4gIFdpdGggbGludXgsCisgICB5b3UgY2FuIHVzZSBlaXRoZXIgb25lLCBzaW5jZSB3ZSBleHBsaWNpdGx5IHplcm8gdGhlIHJlZ2lzdGVyIHdoZW4gd2UgZW50ZXIKKyAgIGtlcm5lbCBtb2RlLiAqLworCisjZGVmaW5lIERSX0xPQ0FMX0VOQUJMRV9TSElGVCAgMCAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBsb2NhbCBlbmFibGUgYml0ICovCisjZGVmaW5lIERSX0dMT0JBTF9FTkFCTEVfU0hJRlQgMSAgIC8qIEV4dHJhIHNoaWZ0IHRvIHRoZSBnbG9iYWwgZW5hYmxlIGJpdCAqLworI2RlZmluZSBEUl9FTkFCTEVfU0laRQkgICAgICAgMiAgIC8qIDIgZW5hYmxlIGJpdHMgcGVyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgRFJfTE9DQUxfRU5BQkxFX01BU0sgICgweDU1KSAvKiBTZXQgIGxvY2FsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKyNkZWZpbmUgRFJfR0xPQkFMX0VOQUJMRV9NQVNLICgweEFBKSAvKiBTZXQgZ2xvYmFsIGJpdHMgZm9yIGFsbCA0IHJlZ3MgKi8KKworLyogVGhlIHNlY29uZCBieXRlIHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIGhhcyBhIGZldyBzcGVjaWFsCisgICB0aGluZ3MuICAqLworCisKKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKyMgZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4RkZGRkZGRkYwMDAwRkMwMFVMKSAvKiBSZXNlcnZlZCAqLworI2Vsc2UKKyMgZGVmaW5lIERSX0NPTlRST0xfUkVTRVJWRUQgKDB4MDBGQzAwVSkgLyogUmVzZXJ2ZWQgKi8KKyNlbmRpZgorI2RlZmluZSBEUl9MT0NBTF9TTE9XRE9XTiAgICgweDEwMCkgIC8qIExvY2FsIHNsb3cgdGhlIHBpcGVsaW5lICovCisjZGVmaW5lIERSX0dMT0JBTF9TTE9XRE9XTiAgKDB4MjAwKSAgLyogR2xvYmFsIHNsb3cgdGhlIHBpcGVsaW5lICovCisKKyNlbmRpZgkvKiBzeXMvZGVidWdyZWcuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZGlyLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjExZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZGlyLmgKQEAgLTAsMCArMSwyOCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfRElSX0gKKyNkZWZpbmUJX1NZU19ESVJfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNkZWZpbmUJZGlyZWN0CWRpcmVudAorCisjZW5kaWYJLyogc3lzL2Rpci5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZXBvbGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2Vwb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNjVmZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2Vwb2xsLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMiwyMDAzLDIwMDQsMjAwNSwyMDA2LDIwMDcsMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0VQT0xMX0gKKyNkZWZpbmUJX1NZU19FUE9MTF9ICTEKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBHZXQgX19zaWdzZXRfdC4gICovCisjaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4KKworI2lmbmRlZiBfX3NpZ3NldF90X2RlZmluZWQKKyMgZGVmaW5lIF9fc2lnc2V0X3RfZGVmaW5lZAordHlwZWRlZiBfX3NpZ3NldF90IHNpZ3NldF90OworI2VuZGlmCisKKworZW51bSBFUE9MTF9FVkVOVFMKKyAgeworICAgIEVQT0xMSU4gPSAweDAwMSwKKyNkZWZpbmUgRVBPTExJTiBFUE9MTElOCisgICAgRVBPTExQUkkgPSAweDAwMiwKKyNkZWZpbmUgRVBPTExQUkkgRVBPTExQUkkKKyAgICBFUE9MTE9VVCA9IDB4MDA0LAorI2RlZmluZSBFUE9MTE9VVCBFUE9MTE9VVAorICAgIEVQT0xMUkROT1JNID0gMHgwNDAsCisjZGVmaW5lIEVQT0xMUkROT1JNIEVQT0xMUkROT1JNCisgICAgRVBPTExSREJBTkQgPSAweDA4MCwKKyNkZWZpbmUgRVBPTExSREJBTkQgRVBPTExSREJBTkQKKyAgICBFUE9MTFdSTk9STSA9IDB4MTAwLAorI2RlZmluZSBFUE9MTFdSTk9STSBFUE9MTFdSTk9STQorICAgIEVQT0xMV1JCQU5EID0gMHgyMDAsCisjZGVmaW5lIEVQT0xMV1JCQU5EIEVQT0xMV1JCQU5ECisgICAgRVBPTExNU0cgPSAweDQwMCwKKyNkZWZpbmUgRVBPTExNU0cgRVBPTExNU0cKKyAgICBFUE9MTEVSUiA9IDB4MDA4LAorI2RlZmluZSBFUE9MTEVSUiBFUE9MTEVSUgorICAgIEVQT0xMSFVQID0gMHgwMTAsCisjZGVmaW5lIEVQT0xMSFVQIEVQT0xMSFVQCisgICAgRVBPTExSREhVUCA9IDB4MjAwMCwKKyNkZWZpbmUgRVBPTExSREhVUCBFUE9MTFJESFVQCisgICAgRVBPTExPTkVTSE9UID0gKDEgPDwgMzApLAorI2RlZmluZSBFUE9MTE9ORVNIT1QgRVBPTExPTkVTSE9UCisgICAgRVBPTExFVCA9ICgxIDw8IDMxKQorI2RlZmluZSBFUE9MTEVUIEVQT0xMRVQKKyAgfTsKKworCisvKiBWYWxpZCBvcGNvZGVzICggIm9wIiBwYXJhbWV0ZXIgKSB0byBpc3N1ZSB0byBlcG9sbF9jdGwoKS4gICovCisjZGVmaW5lIEVQT0xMX0NUTF9BREQgMQkvKiBBZGQgYSBmaWxlIGRlY3JpcHRvciB0byB0aGUgaW50ZXJmYWNlLiAgKi8KKyNkZWZpbmUgRVBPTExfQ1RMX0RFTCAyCS8qIFJlbW92ZSBhIGZpbGUgZGVjcmlwdG9yIGZyb20gdGhlIGludGVyZmFjZS4gICovCisjZGVmaW5lIEVQT0xMX0NUTF9NT0QgMwkvKiBDaGFuZ2UgZmlsZSBkZWNyaXB0b3IgZXBvbGxfZXZlbnQgc3RydWN0dXJlLiAgKi8KKworCit0eXBlZGVmIHVuaW9uIGVwb2xsX2RhdGEKK3sKKyAgdm9pZCAqcHRyOworICBpbnQgZmQ7CisgIHVpbnQzMl90IHUzMjsKKyAgdWludDY0X3QgdTY0OworfSBlcG9sbF9kYXRhX3Q7CisKK3N0cnVjdCBlcG9sbF9ldmVudAoreworICB1aW50MzJfdCBldmVudHM7CS8qIEVwb2xsIGV2ZW50cyAqLworICBlcG9sbF9kYXRhX3QgZGF0YTsJLyogVXNlciBkYXRhIHZhcmlhYmxlICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKworX19CRUdJTl9ERUNMUworCisvKiBDcmVhdGVzIGFuIGVwb2xsIGluc3RhbmNlLiAgUmV0dXJucyBhbiBmZCBmb3IgdGhlIG5ldyBpbnN0YW5jZS4KKyAgIFRoZSAic2l6ZSIgcGFyYW1ldGVyIGlzIGEgaGludCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZmlsZQorICAgZGVzY3JpcHRvcnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgaW5zdGFuY2UuICBUaGUgZmQKKyAgIHJldHVybmVkIGJ5IGVwb2xsX2NyZWF0ZSgpIHNob3VsZCBiZSBjbG9zZWQgd2l0aCBjbG9zZSgpLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfY3JlYXRlIChpbnQgX19zaXplKSBfX1RIUk9XOworCisKKy8qIE1hbmlwdWxhdGUgYW4gZXBvbGwgaW5zdGFuY2UgImVwZmQiLiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLAorICAgLTEgaW4gY2FzZSBvZiBlcnJvciAoIHRoZSAiZXJybm8iIHZhcmlhYmxlIHdpbGwgY29udGFpbiB0aGUKKyAgIHNwZWNpZmljIGVycm9yIGNvZGUgKSBUaGUgIm9wIiBwYXJhbWV0ZXIgaXMgb25lIG9mIHRoZSBFUE9MTF9DVExfKgorICAgY29uc3RhbnRzIGRlZmluZWQgYWJvdmUuIFRoZSAiZmQiIHBhcmFtZXRlciBpcyB0aGUgdGFyZ2V0IG9mIHRoZQorICAgb3BlcmF0aW9uLiBUaGUgImV2ZW50IiBwYXJhbWV0ZXIgZGVzY3JpYmVzIHdoaWNoIGV2ZW50cyB0aGUgY2FsbGVyCisgICBpcyBpbnRlcmVzdGVkIGluIGFuZCBhbnkgYXNzb2NpYXRlZCB1c2VyIGRhdGEuICAqLworZXh0ZXJuIGludCBlcG9sbF9jdGwgKGludCBfX2VwZmQsIGludCBfX29wLCBpbnQgX19mZCwKKwkJICAgICAgc3RydWN0IGVwb2xsX2V2ZW50ICpfX2V2ZW50KSBfX1RIUk9XOworCisKKy8qIFdhaXQgZm9yIGV2ZW50cyBvbiBhbiBlcG9sbCBpbnN0YW5jZSAiZXBmZCIuIFJldHVybnMgdGhlIG51bWJlciBvZgorICAgdHJpZ2dlcmVkIGV2ZW50cyByZXR1cm5lZCBpbiAiZXZlbnRzIiBidWZmZXIuIE9yIC0xIGluIGNhc2Ugb2YKKyAgIGVycm9yIHdpdGggdGhlICJlcnJubyIgdmFyaWFibGUgc2V0IHRvIHRoZSBzcGVjaWZpYyBlcnJvciBjb2RlLiBUaGUKKyAgICJldmVudHMiIHBhcmFtZXRlciBpcyBhIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0cmlnZ2VyZWQKKyAgIGV2ZW50cy4gVGhlICJtYXhldmVudHMiIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBldmVudHMgdG8gYmUKKyAgIHJldHVybmVkICggdXN1YWxseSBzaXplIG9mICJldmVudHMiICkuIFRoZSAidGltZW91dCIgcGFyYW1ldGVyCisgICBzcGVjaWZpZXMgdGhlIG1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyAoLTEgPT0gaW5maW5pdGUpLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfd2FpdCAoaW50IF9fZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50ICpfX2V2ZW50cywKKwkJICAgICAgIGludCBfX21heGV2ZW50cywgaW50IF9fdGltZW91dCk7CisKKworLyogU2FtZSBhcyBlcG9sbF93YWl0LCBidXQgdGhlIHRocmVhZCdzIHNpZ25hbCBtYXNrIGlzIHRlbXBvcmFyaWx5CisgICBhbmQgYXRvbWljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBvbmUgcHJvdmlkZWQgYXMgcGFyYW1ldGVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZXBvbGxfcHdhaXQgKGludCBfX2VwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCAqX19ldmVudHMsCisJCQlpbnQgX19tYXhldmVudHMsIGludCBfX3RpbWVvdXQsCisJCQlfX2NvbnN0IF9fc2lnc2V0X3QgKl9fc3MpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2Vwb2xsLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2Vycm5vLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWY0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9lcnJuby5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZmNudGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2ZjbnRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMDQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2ZjbnRsLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGZjbnRsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9maWxlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMzYzNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NiwgOTcsIDk4LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0ZJTEVfSAorI2RlZmluZQlfU1lTX0ZJTEVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaWZuZGVmCV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisKKy8qIEFsdGVybmF0ZSBuYW1lcyBmb3IgdmFsdWVzIGZvciB0aGUgV0hFTkNFIGFyZ3VtZW50IHRvIGBsc2VlaycuCisgICBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQsIHJlc3BlY3RpdmVseS4gICovCisjaWZuZGVmIExfU0VUCisjIGRlZmluZSBMX1NFVAkwCS8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjIGRlZmluZSBMX0lOQ1IJMQkvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjIGRlZmluZSBMX1hUTkQJMgkvKiBTZWVrIGZyb20gZW5kIG9mIGZpbGUuICAqLworI2VuZGlmCisKKworLyogT3BlcmF0aW9ucyBmb3IgdGhlIGBmbG9jaycgY2FsbC4gICovCisjZGVmaW5lCUxPQ0tfU0gJMQkvKiBTaGFyZWQgbG9jay4gICovCisjZGVmaW5lCUxPQ0tfRVgJMiAJLyogRXhjbHVzaXZlIGxvY2suICAqLworI2RlZmluZQlMT0NLX1VOCTgJLyogVW5sb2NrLiAgKi8KKworLyogQ2FuIGJlIE9SJ2QgaW4gdG8gb25lIG9mIHRoZSBhYm92ZS4gICovCisjZGVmaW5lCUxPQ0tfTkIJNAkvKiBEb24ndCBibG9jayB3aGVuIGxvY2tpbmcuICAqLworCisKKy8qIEFwcGx5IG9yIHJlbW92ZSBhbiBhZHZpc29yeSBsb2NrLCBhY2NvcmRpbmcgdG8gT1BFUkFUSU9OLAorICAgb24gdGhlIGZpbGUgRkQgcmVmZXJzIHRvLiAgKi8KK2V4dGVybiBpbnQgZmxvY2sgKGludCBfX2ZkLCBpbnQgX19vcGVyYXRpb24pIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9maWxlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9mc3VpZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZnN1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNiMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZnN1aWQuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19GU1VJRF9ICisjZGVmaW5lIF9TWVNfRlNVSURfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENoYW5nZSB1aWQgdXNlZCBmb3IgZmlsZSBhY2Nlc3MgY29udHJvbCB0byBVSUQsIHdpdGhvdXQgYWZmZWN0aW5nCisgICBvdGhlciBwcml2aWxlZ2VzIChzdWNoIGFzIHdobyBjYW4gc2VuZCBzaWduYWxzIGF0IHRoZSBwcm9jZXNzKS4gICovCitleHRlcm4gaW50IHNldGZzdWlkIChfX3VpZF90IF9fdWlkKSBfX1RIUk9XOworCisvKiBEaXR0byBmb3IgZ3JvdXAgaWQuICovCitleHRlcm4gaW50IHNldGZzZ2lkIChfX2dpZF90IF9fZ2lkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogZnN1aWQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZ21vbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZ21vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMmY4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9nbW9uLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkyLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWdtb24uaAk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqLworCisjaWZuZGVmCV9TWVNfR01PTl9ICisjZGVmaW5lCV9TWVNfR01PTl9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyoKKyAqIFNlZSBnbW9uX291dC5oIGZvciBnbW9uLm91dCBmb3JtYXQuCisgKi8KKworLyogc3RydWN0dXJlIGVtaXR0ZWQgYnkgImdjYyAtYSIuICBUaGlzIG11c3QgbWF0Y2ggc3RydWN0IGJiIGluCisgICBnY2MvbGliZ2NjMi5jLiAgSXQgaXMgT0sgZm9yIGdjYyB0byBkZWNsYXJlIGEgbG9uZ2VyIHN0cnVjdHVyZSBhcworICAgbG9uZyBhcyB0aGUgbWVtYmVycyBiZWxvdyBhcmUgcHJlc2VudC4gICovCitzdHJ1Y3QgX19iYgoreworICBsb25nCQkJemVyb193b3JkOworICBjb25zdCBjaGFyCQkqZmlsZW5hbWU7CisgIGxvbmcJCQkqY291bnRzOworICBsb25nCQkJbmNvdW50czsKKyAgc3RydWN0IF9fYmIJCSpuZXh0OworICBjb25zdCB1bnNpZ25lZCBsb25nCSphZGRyZXNzZXM7Cit9OworCitleHRlcm4gc3RydWN0IF9fYmIgKl9fYmJfaGVhZDsKKworLyoKKyAqIGhpc3RvZ3JhbSBjb3VudGVycyBhcmUgdW5zaWduZWQgc2hvcnRzIChhY2NvcmRpbmcgdG8gdGhlIGtlcm5lbCkuCisgKi8KKyNkZWZpbmUJSElTVENPVU5URVIJdW5zaWduZWQgc2hvcnQKKworLyoKKyAqIGZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGhpc3RvZ3JhbSBjb3VudGVycyBoZXJlLCAxLzIKKyAqLworI2RlZmluZQlISVNURlJBQ1RJT04JMgorCisvKgorICogRnJhY3Rpb24gb2YgdGV4dCBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgZnJvbSBoYXNoIGJ1Y2tldHMuCisgKiBUaGUgdmFsdWUgb2YgSEFTSEZSQUNUSU9OIGlzIGJhc2VkIG9uIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcworICogb2Ygc2VwYXJhdGlvbiBiZXR3ZWVuIHR3byBzdWJyb3V0aW5lIGNhbGwgcG9pbnRzIGluIHRoZSBvYmplY3QgY29kZS4KKyAqIEdpdmVuIE1JTl9TVUJSX1NFUEFSQVRJT04gYnl0ZXMgb2Ygc2VwYXJhdGlvbiB0aGUgdmFsdWUgb2YKKyAqIEhBU0hGUkFDVElPTiBpcyBjYWxjdWxhdGVkIGFzOgorICoKKyAqCUhBU0hGUkFDVElPTiA9IE1JTl9TVUJSX1NFUEFSQVRJT04gLyAoMiAqIHNpemVvZihzaG9ydCkgLSAxKTsKKyAqCisgKiBGb3IgZXhhbXBsZSwgb24gdGhlIFZBWCwgdGhlIHNob3J0ZXN0IHR3byBjYWxsIHNlcXVlbmNlIGlzOgorICoKKyAqCWNhbGxzCSQwLChyMCkKKyAqCWNhbGxzCSQwLChyMCkKKyAqCisgKiB3aGljaCBpcyBzZXBhcmF0ZWQgYnkgb25seSB0aHJlZSBieXRlcywgdGh1cyBIQVNIRlJBQ1RJT04gaXMKKyAqIGNhbGN1bGF0ZWQgYXM6CisgKgorICoJSEFTSEZSQUNUSU9OID0gMyAvICgyICogMiAtIDEpID0gMQorICoKKyAqIE5vdGUgdGhhdCB0aGUgZGl2aXNpb24gYWJvdmUgcm91bmRzIGRvd24sIHRodXMgaWYgTUlOX1NVQlJfRlJBQ1RJT04KKyAqIGlzIGxlc3MgdGhhbiB0aHJlZSwgdGhpcyBhbGdvcml0aG0gd2lsbCBub3Qgd29yayEKKyAqCisgKiBJbiBwcmFjdGljZSwgaG93ZXZlciwgY2FsbCBpbnN0cnVjdGlvbnMgYXJlIHJhcmVseSBhdCBhIG1pbmltYWwKKyAqIGRpc3RhbmNlLiAgSGVuY2UsIHdlIHdpbGwgZGVmaW5lIEhBU0hGUkFDVElPTiB0byBiZSAyIGFjcm9zcyBhbGwKKyAqIGFyY2hpdGVjdHVyZXMuICBUaGlzIHNhdmVzIGEgcmVhc29uYWJsZSBhbW91bnQgb2Ygc3BhY2UgZm9yCisgKiBwcm9maWxpbmcgZGF0YSBzdHJ1Y3R1cmVzIHdpdGhvdXQgKGluIHByYWN0aWNlKSBzYWNyaWZpY2luZworICogYW55IGdyYW51bGFyaXR5LgorICovCisjZGVmaW5lCUhBU0hGUkFDVElPTgkyCisKKy8qCisgKiBQZXJjZW50IG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIHRvc3RydWN0cy4KKyAqIFRoaXMgaXMgYSBoZXVyaXN0aWM7IHdlIHdpbGwgZmFpbCB3aXRoIGEgd2FybmluZyB3aGVuIHByb2ZpbGluZyBwcm9ncmFtcworICogd2l0aCBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIHZlcnkgc21hbGwgZnVuY3Rpb25zLCBidXQgdGhhdCdzCisgKiBub3JtYWxseSBPSy4KKyAqIDIgaXMgcHJvYmFibHkgc3RpbGwgYSBnb29kIHZhbHVlIGZvciBub3JtYWwgcHJvZ3JhbXMuCisgKiBQcm9maWxpbmcgYSB0ZXN0IGNhc2Ugd2l0aCA2NDAwMCBzbWFsbCBmdW5jdGlvbnMgd2lsbCB3b3JrIGlmCisgKiB5b3UgcmFpc2UgdGhpcyB2YWx1ZSB0byAzIGFuZCBsaW5rIHN0YXRpY2FsbHkgKHdoaWNoIGJsb2F0cyB0aGUKKyAqIHRleHQgc2l6ZSwgdGh1cyByYWlzaW5nIHRoZSBudW1iZXIgb2YgYXJjcyBleHBlY3RlZCBieSB0aGUgaGV1cmlzdGljKS4KKyAqLworI2RlZmluZSBBUkNERU5TSVRZCTMKKworLyoKKyAqIEFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCB0aGlzIG1hbnkgdG9zdHJ1Y3RzLiAgVGhpcworICogaGlkZXMgdGhlIGluYWRlcXVhY3kgb2YgdGhlIEFSQ0RFTlNJVFkgaGV1cmlzdGljLCBhdCBsZWFzdAorICogZm9yIHNtYWxsIHByb2dyYW1zLgorICovCisjZGVmaW5lIE1JTkFSQ1MJCTUwCisKKy8qCisgKiBUaGUgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBpbmRpY2VzIGludG8gZ21vbnBhcmFtLnRvc1tdLgorICovCisjZGVmaW5lCUFSQ0lOREVYCXVfbG9uZworCisvKiAKKyAqIE1heGltdW0gbnVtYmVyIG9mIGFyY3Mgd2Ugd2FudCB0byBhbGxvdy4KKyAqIFVzZWQgdG8gYmUgbWF4IHJlcHJlc2VudGFibGUgdmFsdWUgb2YgQVJDSU5ERVggbWludXMgMiwgYnV0IG5vdyAKKyAqIHRoYXQgQVJDSU5ERVggaXMgYSBsb25nLCB0aGF0J3MgdG9vIGxhcmdlOyB3ZSBkb24ndCByZWFsbHkgd2FudCAKKyAqIHRvIGFsbG93IGEgNDggZ2lnYWJ5dGUgdGFibGUuCisgKiBUaGUgb2xkIHZhbHVlIG9mIDE8PDE2IHdhc24ndCBoaWdoIGVub3VnaCBpbiBwcmFjdGljZSBmb3IgbGFyZ2UgQysrCisgKiBwcm9ncmFtczsgd2lsbCAxPDwyMCBiZSBhZGVxdWF0ZSBmb3IgbG9uZz8gIEZJWE1FCisgKi8KKyNkZWZpbmUgTUFYQVJDUwkJKDEgPDwgMjApCisKK3N0cnVjdCB0b3N0cnVjdCB7CisJdV9sb25nCQlzZWxmcGM7CisJbG9uZwkJY291bnQ7CisJQVJDSU5ERVgJbGluazsKK307CisKKy8qCisgKiBhIHJhdyBhcmMsIHdpdGggcG9pbnRlcnMgdG8gdGhlIGNhbGxpbmcgc2l0ZSBhbmQKKyAqIHRoZSBjYWxsZWQgc2l0ZSBhbmQgYSBjb3VudC4KKyAqLworc3RydWN0IHJhd2FyYyB7CisJdV9sb25nCXJhd19mcm9tcGM7CisJdV9sb25nCXJhd19zZWxmcGM7CisJbG9uZwlyYXdfY291bnQ7Cit9OworCisvKgorICogZ2VuZXJhbCByb3VuZGluZyBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgUk9VTkRET1dOKHgseSkJKCgoeCkvKHkpKSooeSkpCisjZGVmaW5lIFJPVU5EVVAoeCx5KQkoKCgoeCkrKHkpLTEpLyh5KSkqKHkpKQorCisvKgorICogVGhlIHByb2ZpbGluZyBkYXRhIHN0cnVjdHVyZXMgYXJlIGhvdXNlZCBpbiB0aGlzIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGdtb25wYXJhbSB7CisJbG9uZyBpbnQJc3RhdGU7CisJdV9zaG9ydAkJKmtjb3VudDsKKwl1X2xvbmcJCWtjb3VudHNpemU7CisJQVJDSU5ERVgJKmZyb21zOworCXVfbG9uZwkJZnJvbXNzaXplOworCXN0cnVjdCB0b3N0cnVjdAkqdG9zOworCXVfbG9uZwkJdG9zc2l6ZTsKKwlsb25nCQl0b2xpbWl0OworCXVfbG9uZwkJbG93cGM7CisJdV9sb25nCQloaWdocGM7CisJdV9sb25nCQl0ZXh0c2l6ZTsKKwl1X2xvbmcJCWhhc2hmcmFjdGlvbjsKKwlsb25nCQlsb2dfaGFzaGZyYWN0aW9uOworfTsKKworLyoKKyAqIFBvc3NpYmxlIHN0YXRlcyBvZiBwcm9maWxpbmcuCisgKi8KKyNkZWZpbmUJR01PTl9QUk9GX09OCTAKKyNkZWZpbmUJR01PTl9QUk9GX0JVU1kJMQorI2RlZmluZQlHTU9OX1BST0ZfRVJST1IJMgorI2RlZmluZQlHTU9OX1BST0ZfT0ZGCTMKKworLyoKKyAqIFN5c2N0bCBkZWZpbml0aW9ucyBmb3IgZXh0cmFjdGluZyBwcm9maWxpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUga2VybmVsLgorICovCisjZGVmaW5lCUdQUk9GX1NUQVRFCTAJLyogaW50OiBwcm9maWxpbmcgZW5hYmxpbmcgdmFyaWFibGUgKi8KKyNkZWZpbmUJR1BST0ZfQ09VTlQJMQkvKiBzdHJ1Y3Q6IHByb2ZpbGUgdGljayBjb3VudCBidWZmZXIgKi8KKyNkZWZpbmUJR1BST0ZfRlJPTVMJMgkvKiBzdHJ1Y3Q6IGZyb20gbG9jYXRpb24gaGFzaCBidWNrZXQgKi8KKyNkZWZpbmUJR1BST0ZfVE9TCTMJLyogc3RydWN0OiBkZXN0aW5hdGlvbi9jb3VudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJR1BST0ZfR01PTlBBUkFNCTQJLyogc3RydWN0OiBwcm9maWxpbmcgcGFyYW1ldGVycyAoc2VlIGFib3ZlKSAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFNldCB1cCBkYXRhIHN0cnVjdHVyZXMgYW5kIHN0YXJ0IHByb2ZpbGluZy4gICovCitleHRlcm4gdm9pZCBfX21vbnN0YXJ0dXAgKHVfbG9uZyBfX2xvd3BjLCB1X2xvbmcgX19oaWdocGMpIF9fVEhST1c7CitleHRlcm4gdm9pZCBtb25zdGFydHVwICh1X2xvbmcgX19sb3dwYywgdV9sb25nIF9faGlnaHBjKSBfX1RIUk9XOworCisvKiBDbGVhbiB1cCBwcm9maWxpbmcgYW5kIHdyaXRlIG91dCBnbW9uLm91dC4gICovCitleHRlcm4gdm9pZCBfbWNsZWFudXAgKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvZ21vbi5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9nbW9uX291dC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZ21vbl9vdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEwOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvZ21vbl9vdXQuaApAQCAtMCwwICsxLDgwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIE1vc2JlcmdlciA8ZGF2aWRtQGNzLmFyaXpvbmEuZWR1Pi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiBnbW9uLm91dCBmaWxlcy4gIEl0IHNob3VsZCBoYXZlCisgICBhcyBmZXcgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGFzIHBvc3NpYmxlIGFzIGl0IGlzIGdvaW5nIHRvIGJlIGluY2x1ZGVkCisgICBpbiBtYW55IGRpZmZlcmVudCBwcm9ncmFtcy4gIFRoYXQgaXMsIG1pbmltaXplIHRoZSBudW1iZXIgb2YgI2luY2x1ZGUncy4KKworICAgQSBnbW9uLm91dCBmaWxlIGNvbnNpc3RzIG9mIGEgaGVhZGVyIChkZWZpbmVkIGJ5IGdtb25faGRyKSBmb2xsb3dlZCBieQorICAgYSBzZXF1ZW5jZSBvZiByZWNvcmRzLiAgRWFjaCByZWNvcmQgc3RhcnRzIHdpdGggYSBvbmUtYnl0ZSB0YWcKKyAgIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIHJlY29yZHMsIGZvbGxvd2VkIGJ5IHJlY29yZHMgc3BlY2lmaWMgZGF0YS4gKi8KKworI2lmbmRlZiBfU1lTX0dNT05fT1VUX0gKKyNkZWZpbmUgX1NZU19HTU9OX09VVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUJR01PTl9NQUdJQwkiZ21vbiIJLyogbWFnaWMgY29va2llICovCisjZGVmaW5lIEdNT05fVkVSU0lPTgkxCS8qIHZlcnNpb24gbnVtYmVyICovCisKKy8qIEZvciBwcm9maWxpbmcgc2hhcmVkIG9iamVjdCB3ZSBuZWVkIGEgbmV3IGZvcm1hdC4gICovCisjZGVmaW5lIEdNT05fU0hPQkpfVkVSU0lPTgkweDFmZmZmCisKK19fQkVHSU5fREVDTFMKKworLyoKKyAqIFJhdyBoZWFkZXIgYXMgaXQgYXBwZWFycyBvbiBmaWxlICh3aXRob3V0IHBhZGRpbmcpLiAgVGhpcyBoZWFkZXIKKyAqIGFsd2F5cyBjb21lcyBmaXJzdCBpbiBnbW9uLm91dCBhbmQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIHNlcmllcworICogcmVjb3JkcyBkZWZpbmVkIGJlbG93LgorICovCitzdHJ1Y3QgZ21vbl9oZHIKKyAgeworICAgIGNoYXIgY29va2llWzRdOworICAgIGNoYXIgdmVyc2lvbls0XTsKKyAgICBjaGFyIHNwYXJlWzMgKiA0XTsKKyAgfTsKKworLyogdHlwZXMgb2YgcmVjb3JkcyBpbiB0aGlzIGZpbGU6ICovCit0eXBlZGVmIGVudW0KKyAgeworICAgIEdNT05fVEFHX1RJTUVfSElTVCA9IDAsCisgICAgR01PTl9UQUdfQ0dfQVJDID0gMSwKKyAgICBHTU9OX1RBR19CQl9DT1VOVCA9IDIKKyAgfSBHTU9OX1JlY29yZF9UYWc7CisKK3N0cnVjdCBnbW9uX2hpc3RfaGRyCisgIHsKKyAgICBjaGFyIGxvd19wY1tzaXplb2YgKGNoYXIgKildOwkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgaGlnaF9wY1tzaXplb2YgKGNoYXIgKildOwkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLworICAgIGNoYXIgaGlzdF9zaXplWzRdOwkJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAqLworICAgIGNoYXIgcHJvZl9yYXRlWzRdOwkJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCisgICAgY2hhciBkaW1lblsxNV07CQkJLyogcGh5cy4gZGltLiwgdXN1YWxseSAic2Vjb25kcyIgKi8KKyAgICBjaGFyIGRpbWVuX2FiYnJldjsJCQkvKiB1c3VhbGx5ICdzJyBmb3IgInNlY29uZHMiICovCisgIH07CisKK3N0cnVjdCBnbW9uX2NnX2FyY19yZWNvcmQKKyAgeworICAgIGNoYXIgZnJvbV9wY1tzaXplb2YgKGNoYXIgKildOwkvKiBhZGRyZXNzIHdpdGhpbiBjYWxsZXIncyBib2R5ICovCisgICAgY2hhciBzZWxmX3BjW3NpemVvZiAoY2hhciAqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlZSdzIGJvZHkgKi8KKyAgICBjaGFyIGNvdW50WzRdOwkJCS8qIG51bWJlciBvZiBhcmMgdHJhdmVyc2FscyAqLworICB9OworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2dtb25fb3V0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2lub3RpZnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2lub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMxZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvaW5vdGlmeS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lOT1RJRllfSAorI2RlZmluZQlfU1lTX0lOT1RJRllfSAkxCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbiBpbm90aWZ5IGV2ZW50LiAgKi8KK3N0cnVjdCBpbm90aWZ5X2V2ZW50Cit7CisgIGludCB3ZDsJCS8qIFdhdGNoIGRlc2NyaXB0b3IuICAqLworICB1aW50MzJfdCBtYXNrOwkvKiBXYXRjaCBtYXNrLiAgKi8KKyAgdWludDMyX3QgY29va2llOwkvKiBDb29raWUgdG8gc3luY2hyb25pemUgdHdvIGV2ZW50cy4gICovCisgIHVpbnQzMl90IGxlbjsJCS8qIExlbmd0aCAoaW5jbHVkaW5nIE5VTHMpIG9mIG5hbWUuICAqLworICBjaGFyIG5hbWUgX19mbGV4YXJyOwkvKiBOYW1lLiAgKi8KK307CisKKworLyogU3VwcG9ydGVkIGV2ZW50cyBzdWl0YWJsZSBmb3IgTUFTSyBwYXJhbWV0ZXIgb2YgSU5PVElGWV9BRERfV0FUQ0guICAqLworI2RlZmluZSBJTl9BQ0NFU1MJIDB4MDAwMDAwMDEJLyogRmlsZSB3YXMgYWNjZXNzZWQuICAqLworI2RlZmluZSBJTl9NT0RJRlkJIDB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQuICAqLworI2RlZmluZSBJTl9BVFRSSUIJIDB4MDAwMDAwMDQJLyogTWV0YWRhdGEgY2hhbmdlZC4gICovCisjZGVmaW5lIElOX0NMT1NFX1dSSVRFCSAweDAwMDAwMDA4CS8qIFdyaXR0YWJsZSBmaWxlIHdhcyBjbG9zZWQuICAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFIDB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQuICAqLworI2RlZmluZSBJTl9DTE9TRQkgKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkgLyogQ2xvc2UuICAqLworI2RlZmluZSBJTl9PUEVOCQkgMHgwMDAwMDAyMAkvKiBGaWxlIHdhcyBvcGVuZWQuICAqLworI2RlZmluZSBJTl9NT1ZFRF9GUk9NCSAweDAwMDAwMDQwCS8qIEZpbGUgd2FzIG1vdmVkIGZyb20gWC4gICovCisjZGVmaW5lIElOX01PVkVEX1RPICAgICAgMHgwMDAwMDA4MAkvKiBGaWxlIHdhcyBtb3ZlZCB0byBZLiAgKi8KKyNkZWZpbmUgSU5fTU9WRQkJIChJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pIC8qIE1vdmVzLiAgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCSAweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQuICAqLworI2RlZmluZSBJTl9ERUxFVEUJIDB4MDAwMDAyMDAJLyogU3ViZmlsZSB3YXMgZGVsZXRlZC4gICovCisjZGVmaW5lIElOX0RFTEVURV9TRUxGCSAweDAwMDAwNDAwCS8qIFNlbGYgd2FzIGRlbGV0ZWQuICAqLworI2RlZmluZSBJTl9NT1ZFX1NFTEYJIDB4MDAwMDA4MDAJLyogU2VsZiB3YXMgbW92ZWQuICAqLworCisvKiBFdmVudHMgc2VudCBieSB0aGUga2VybmVsLiAgKi8KKyNkZWZpbmUgSU5fVU5NT1VOVAkgMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQuICAqLworI2RlZmluZSBJTl9RX09WRVJGTE9XCSAweDAwMDA0MDAwCS8qIEV2ZW50IHF1ZXVlZCBvdmVyZmxvd2VkLiAgKi8KKyNkZWZpbmUgSU5fSUdOT1JFRAkgMHgwMDAwODAwMAkvKiBGaWxlIHdhcyBpZ25vcmVkLiAgKi8KKworLyogSGVscGVyIGV2ZW50cy4gICovCisjZGVmaW5lIElOX0NMT1NFCSAoSU5fQ0xPU0VfV1JJVEUgfCBJTl9DTE9TRV9OT1dSSVRFKQkvKiBDbG9zZS4gICovCisjZGVmaW5lIElOX01PVkUJCSAoSU5fTU9WRURfRlJPTSB8IElOX01PVkVEX1RPKQkJLyogTW92ZXMuICAqLworCisvKiBTcGVjaWFsIGZsYWdzLiAgKi8KKyNkZWZpbmUgSU5fT05MWURJUgkgMHgwMTAwMDAwMAkvKiBPbmx5IHdhdGNoIHRoZSBwYXRoIGlmIGl0IGlzIGEKKwkJCQkJICAgZGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUgSU5fRE9OVF9GT0xMT1cJIDB4MDIwMDAwMDAJLyogRG8gbm90IGZvbGxvdyBhIHN5bSBsaW5rLiAgKi8KKyNkZWZpbmUgSU5fTUFTS19BREQJIDB4MjAwMDAwMDAJLyogQWRkIHRvIHRoZSBtYXNrIG9mIGFuIGFscmVhZHkKKwkJCQkJICAgZXhpc3Rpbmcgd2F0Y2guICAqLworI2RlZmluZSBJTl9JU0RJUgkgMHg0MDAwMDAwMAkvKiBFdmVudCBvY2N1cnJlZCBhZ2FpbnN0IGRpci4gICovCisjZGVmaW5lIElOX09ORVNIT1QJIDB4ODAwMDAwMDAJLyogT25seSBzZW5kIGV2ZW50IG9uY2UuICAqLworCisvKiBBbGwgZXZlbnRzIHdoaWNoIGEgcHJvZ3JhbSBjYW4gd2FpdCBvbi4gICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJIChJTl9BQ0NFU1MgfCBJTl9NT0RJRlkgfCBJTl9BVFRSSUIgfCBJTl9DTE9TRV9XUklURSAgXAorCQkJICB8IElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTQkgICAgICBcCisJCQkgIHwgSU5fTU9WRURfVE8gfCBJTl9DUkVBVEUgfCBJTl9ERUxFVEUJCSAgICAgIFwKKwkJCSAgfCBJTl9ERUxFVEVfU0VMRiB8IElOX01PVkVfU0VMRikKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBpbm90aWZ5IGluc3RhbmNlLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9pbml0ICh2b2lkKSBfX1RIUk9XOworCisvKiBBZGQgd2F0Y2ggb2Ygb2JqZWN0IE5BTUUgdG8gaW5vdGlmeSBpbnN0YW5jZSBGRC4gIE5vdGlmeSBhYm91dAorICAgZXZlbnRzIHNwZWNpZmllZCBieSBNQVNLLiAgKi8KK2V4dGVybiBpbnQgaW5vdGlmeV9hZGRfd2F0Y2ggKGludCBfX2ZkLCBjb25zdCBjaGFyICpfX25hbWUsIHVpbnQzMl90IF9fbWFzaykKKyAgX19USFJPVzsKKworLyogUmVtb3ZlIHRoZSB3YXRjaCBzcGVjaWZpZWQgYnkgV0QgZnJvbSB0aGUgaW5vdGlmeSBpbnN0YW5jZSBGRC4gICovCitleHRlcm4gaW50IGlub3RpZnlfcm1fd2F0Y2ggKGludCBfX2ZkLCB1aW50MzJfdCBfX3dkKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL2lub3RpZnkuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvaW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyYTBkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2lvLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMjAwMCwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lPX0gKKyNkZWZpbmUJX1NZU19JT19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogSWYgVFVSTl9PTiBpcyBUUlVFLCByZXF1ZXN0IGZvciBwZXJtaXNzaW9uIHRvIGRvIGRpcmVjdCBpL28gb24gdGhlCisgICBwb3J0IG51bWJlcnMgaW4gdGhlIHJhbmdlIFtGUk9NLEZST00rTlVNLTFdLiAgT3RoZXJ3aXNlLCB0dXJuIEkvTworICAgcGVybWlzc2lvbiBvZmYgZm9yIHRoYXQgcmFuZ2UuICBUaGlzIGNhbGwgcmVxdWlyZXMgcm9vdCBwcml2aWxlZ2VzLgorCisgICBQb3J0YWJpbGl0eSBub3RlOiBub3QgYWxsIExpbnV4IHBsYXRmb3JtcyBzdXBwb3J0IHRoaXMgY2FsbC4gIE1vc3QKKyAgIHBsYXRmb3JtcyBiYXNlZCBvbiB0aGUgUEMgSS9PIGFyY2hpdGVjdHVyZSBwcm9iYWJseSB3aWxsLCBob3dldmVyLgorICAgRS5nLiwgTGludXgvQWxwaGEgZm9yIEFscGhhIFBDcyBzdXBwb3J0cyB0aGlzLiAgKi8KK2V4dGVybiBpbnQgaW9wZXJtICh1bnNpZ25lZCBsb25nIGludCBfX2Zyb20sIHVuc2lnbmVkIGxvbmcgaW50IF9fbnVtLAorICAgICAgICAgICAgICAgICAgIGludCBfX3R1cm5fb24pIF9fVEhST1c7CisKKy8qIFNldCB0aGUgSS9PIHByaXZpbGVnZSBsZXZlbCB0byBMRVZFTC4gIElmIExFVkVMPjMsIHBlcm1pc3Npb24gdG8KKyAgIGFjY2VzcyBhbnkgSS9PIHBvcnQgaXMgZ3JhbnRlZC4gIFRoaXMgY2FsbCByZXF1aXJlcyByb290CisgICBwcml2aWxlZ2VzLiAqLworZXh0ZXJuIGludCBpb3BsIChpbnQgX19sZXZlbCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMgorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgY2hhcgoraW5iICh1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCkKK3sKKyAgdW5zaWduZWQgY2hhciBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluYiAldzEsJTAiOiI9YSIgKF92KToiTmQiIChwb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGNoYXIKK2luYl9wICh1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCkKK3sKKyAgdW5zaWduZWQgY2hhciBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImluYiAldzEsJTBcbm91dGIgJSVhbCwkMHg4MCI6Ij1hIiAoX3YpOiJOZCIgKHBvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgaW50CitpbncgKHVuc2lnbmVkIHNob3J0IGludCBwb3J0KQoreworICB1bnNpZ25lZCBzaG9ydCBfdjsKKworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImludyAldzEsJTAiOiI9YSIgKF92KToiTmQiIChwb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGludAoraW53X3AgKHVuc2lnbmVkIHNob3J0IGludCBwb3J0KQoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgX3Y7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbncgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KToiTmQiIChwb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGludAoraW5sICh1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCkKK3sKKyAgdW5zaWduZWQgaW50IF92OworCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW5sICV3MSwlMCI6Ij1hIiAoX3YpOiJOZCIgKHBvcnQpKTsKKyAgcmV0dXJuIF92OworfQorCitzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgaW50CitpbmxfcCAodW5zaWduZWQgc2hvcnQgaW50IHBvcnQpCit7CisgIHVuc2lnbmVkIGludCBfdjsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpbmwgJXcxLCUwXG5vdXRiICUlYWwsJDB4ODAiOiI9YSIgKF92KToiTmQiIChwb3J0KSk7CisgIHJldHVybiBfdjsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGIgKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIHNob3J0IGludCBwb3J0KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm91dGIgJWIwLCV3MSI6IDoiYSIgKHZhbHVlKSwgIk5kIiAocG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0Yl9wICh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXRiICViMCwldzFcbm91dGIgJSVhbCwkMHg4MCI6IDoiYSIgKHZhbHVlKSwKKwkJCSJOZCIgKHBvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHcgKHVuc2lnbmVkIHNob3J0IGludCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IHBvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0dyAldzAsJXcxIjogOiJhIiAodmFsdWUpLCAiTmQiIChwb3J0KSk7CisKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dHdfcCAodW5zaWduZWQgc2hvcnQgaW50IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXR3ICV3MCwldzFcbm91dGIgJSVhbCwkMHg4MCI6IDoiYSIgKHZhbHVlKSwKKwkJCSJOZCIgKHBvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGwgKHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgc2hvcnQgaW50IHBvcnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgib3V0bCAlMCwldzEiOiA6ImEiICh2YWx1ZSksICJOZCIgKHBvcnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK291dGxfcCAodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJvdXRsICUwLCV3MVxub3V0YiAlJWFsLCQweDgwIjogOiJhIiAodmFsdWUpLAorCQkJIk5kIiAocG9ydCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAoraW5zYiAodW5zaWduZWQgc2hvcnQgaW50IHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgaW50IGNvdW50KQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZCA7IHJlcCA7IGluc2IiOiI9RCIgKGFkZHIpLAorCQkJIj1jIiAoY291bnQpOiJkIiAocG9ydCksICIwIiAoYWRkciksICIxIiAoY291bnQpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2luc3cgKHVuc2lnbmVkIHNob3J0IGludCBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGludCBjb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBpbnN3IjoiPUQiIChhZGRyKSwKKwkJCSI9YyIgKGNvdW50KToiZCIgKHBvcnQpLCAiMCIgKGFkZHIpLCAiMSIgKGNvdW50KSk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitpbnNsICh1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBpbnQgY291bnQpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiY2xkIDsgcmVwIDsgaW5zbCI6Ij1EIiAoYWRkciksCisJCQkiPWMiIChjb3VudCk6ImQiIChwb3J0KSwgIjAiIChhZGRyKSwgIjEiIChjb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c2IgKHVuc2lnbmVkIHNob3J0IGludCBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGludCBjb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzYiI6Ij1TIiAoYWRkciksCisJCQkiPWMiIChjb3VudCk6ImQiIChwb3J0KSwgIjAiIChhZGRyKSwgIjEiIChjb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c3cgKHVuc2lnbmVkIHNob3J0IGludCBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGludCBjb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzdyI6Ij1TIiAoYWRkciksCisJCQkiPWMiIChjb3VudCk6ImQiIChwb3J0KSwgIjAiIChhZGRyKSwgIjEiIChjb3VudCkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorb3V0c2wgKHVuc2lnbmVkIHNob3J0IGludCBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGludCBjb3VudCkKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGQgOyByZXAgOyBvdXRzbCI6Ij1TIiAoYWRkciksCisJCQkiPWMiIChjb3VudCk6ImQiIChwb3J0KSwgIjAiIChhZGRyKSwgIjEiIChjb3VudCkpOworfQorCisjZW5kaWYJLyogR05VIEMgKi8KKworX19FTkRfREVDTFMKKyNlbmRpZiAvKiBfU1lTX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2lvY3RsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOGEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9pb2N0bC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTYsIDk4LCA5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0lPQ1RMX0gKKyNkZWZpbmUJX1NZU19JT0NUTF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogR2V0IHRoZSBsaXN0IG9mIGBpb2N0bCcgcmVxdWVzdHMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL2lvY3Rscy5oPgorCisvKiBEZWZpbmUgc29tZSB0eXBlcyB1c2VkIGJ5IGBpb2N0bCcgcmVxdWVzdHMuICAqLworI2luY2x1ZGUgPGJpdHMvaW9jdGwtdHlwZXMuaD4KKworLyogT24gYSBVbml4IHN5c3RlbSwgdGhlIHN5c3RlbSA8c3lzL2lvY3RsLmg+IHByb2JhYmx5IGRlZmluZXMgc29tZSBvZgorICAgdGhlIHN5bWJvbHMgd2UgZGVmaW5lIGluIDxzeXMvdHR5ZGVmYXVsdHMuaD4gKHVzdWFsbHkgd2l0aCB0aGUgc2FtZQorICAgdmFsdWVzKS4gIFRoZSBjb2RlIHRvIGdlbmVyYXRlIDxiaXRzL2lvY3Rscy5oPiBoYXMgb21pdHRlZCB0aGVzZQorICAgc3ltYm9scyB0byBhdm9pZCB0aGUgY29uZmxpY3QsIGJ1dCBhIFVuaXggcHJvZ3JhbSBleHBlY3RzIDxzeXMvaW9jdGwuaD4KKyAgIHRvIGRlZmluZSB0aGVtLCBzbyB3ZSBtdXN0IGluY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPiBoZXJlLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4KKworLyogUGVyZm9ybSB0aGUgSS9PIGNvbnRyb2wgb3BlcmF0aW9uIHNwZWNpZmllZCBieSBSRVFVRVNUIG9uIEZELgorICAgT25lIGFyZ3VtZW50IG1heSBmb2xsb3c7IGl0cyBwcmVzZW5jZSBhbmQgdHlwZSBkZXBlbmQgb24gUkVRVUVTVC4KKyAgIFJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIFJFUVVFU1QuICBVc3VhbGx5IC0xIGluZGljYXRlcyBlcnJvci4gICovCitleHRlcm4gaW50IGlvY3RsIChpbnQgX19mZCwgdW5zaWduZWQgbG9uZyBpbnQgX19yZXF1ZXN0LCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaW9jdGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvaXBjLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThjMDllCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvaXBjLmgKQEAgLTAsMCArMSw1OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk5LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19JUENfSAorI2RlZmluZSBfU1lTX0lQQ19ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpZiAhZGVmaW5lZCBfX1VTRV9TVklEICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOICYmIF9fR05VQ19fID49IDIKKyMgd2FybmluZyAiRmlsZXMgdXNpbmcgdGhpcyBoZWFkZXIgbXVzdCBiZSBjb21waWxlZCB3aXRoIF9TVklEX1NPVVJDRSBvciBfWE9QRU5fU09VUkNFIgorI2VuZGlmCisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBpcGNfcGVybScgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvaXBjdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2lwYy5oPgorCisjaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyBkZWZpbmUgX191aWRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2dpZF90X2RlZmluZWQKK3R5cGVkZWYgX19naWRfdCBnaWRfdDsKKyMgZGVmaW5lIF9fZ2lkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjIGRlZmluZSBfX21vZGVfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2tleV90X2RlZmluZWQKK3R5cGVkZWYgX19rZXlfdCBrZXlfdDsKKyMgZGVmaW5lIF9fa2V5X3RfZGVmaW5lZAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogR2VuZXJhdGVzIGtleSBmb3IgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KK2V4dGVybiBrZXlfdCBmdG9rIChfX2NvbnN0IGNoYXIgKl9fcGF0aG5hbWUsIGludCBfX3Byb2pfaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvaXBjLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2tkLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9rZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTljMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9rZC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMjAwNSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX0tEX0gKKyNkZWZpbmUgX1NZU19LRF9ICTEKKworLyogTWFrZSBzdXJlIHRoZSA8bGludXgvdHlwZXMuaD4gaGVhZGVyIGlzIG5vdCBsb2FkZWQuICAqLworI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorIyBkZWZpbmUgX0xJTlVYX1RZUEVTX0gJCTEKKyMgZGVmaW5lIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZC5oPgorCisjaWZkZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9MSU5VWF9UWVBFU19ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfVFlQRVNfSAorI2VuZGlmCisKKyNlbmRpZgkvKiBzeXMva2QuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMva2RhZW1vbi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMva2RhZW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDkxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9rZGFlbW9uLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBJbnRlcmZhY2VzIHRvIGNvbnRyb2wgdGhlIHZhcmlvdXMga2VybmVsIGRhZW1vbnMuICAqLworCisjaWZuZGVmIF9TWVNfS0RBRU1PTl9ICisKKyNkZWZpbmUgX1NZU19LREFFTU9OX0gJMQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogU3RhcnQsIGZsdXNoLCBvciB0dW5lIHRoZSBrZXJuZWwncyBidWZmZXIgZmx1c2hpbmcgZGFlbW9uLiAgKi8KK2V4dGVybiBpbnQgYmRmbHVzaCAoaW50IF9fZnVuYywgbG9uZyBpbnQgX19kYXRhKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19LREFFTU9OX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2tsb2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL2tsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY1ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMva2xvZy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX0tMT0dfSAorCisjZGVmaW5lCV9TWVNfS0xPR19ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIENvbnRyb2wgdGhlIGtlcm5lbCdzIGxvZ2dpbmcgZmFjaWxpdHkuICBUaGlzIGNvcnJlc3BvbmRzIGV4YWN0bHkgdG8KKyAgIHRoZSBrZXJuZWwncyBzeXNsb2cgc3lzdGVtIGNhbGwsIGJ1dCB0aGF0IG5hbWUgaXMgZWFzaWx5IGNvbmZ1c2VkCisgICB3aXRoIHRoZSB1c2VyLWxldmVsIHN5c2xvZyBmYWNpbGl0eSwgd2hpY2ggaXMgc29tZXRoaW5nIGNvbXBsZXRlbHkKKyAgIGRpZmZlcmVudC4gICovCitleHRlcm4gaW50IGtsb2djdGwgKGludCBfX3R5cGUsIGNoYXIgKl9fYnVmcCwgaW50IF9fbGVuKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19LTE9HX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL21tYW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q4YTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvbW1hbi5oCkBAIC0wLDAgKzEsMTUyIEBACisvKiBEZWZpbml0aW9ucyBmb3IgQlNELXN0eWxlIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgQ29weXJpZ2h0IChDKSAxOTk0LTIwMDAsIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19NTUFOX0gKKyNkZWZpbmUJX1NZU19NTUFOX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3R5cGVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19vZmZfdCBvZmZfdDsKKyMgZWxzZQordHlwZWRlZiBfX29mZjY0X3Qgb2ZmX3Q7CisjIGVuZGlmCisjIGRlZmluZSBfX29mZl90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbW9kZV90X2RlZmluZWQKK3R5cGVkZWYgX19tb2RlX3QgbW9kZV90OworIyBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL21tYW4uaD4KKworLyogUmV0dXJuIHZhbHVlIG9mIGBtbWFwJyBpbiBjYXNlIG9mIGFuIGVycm9yLiAgKi8KKyNkZWZpbmUgTUFQX0ZBSUxFRAkoKHZvaWQgKikgLTEpCisKK19fQkVHSU5fREVDTFMKKy8qIE1hcCBhZGRyZXNzZXMgc3RhcnRpbmcgbmVhciBBRERSIGFuZCBleHRlbmRpbmcgZm9yIExFTiBieXRlcy4gIGZyb20KKyAgIE9GRlNFVCBpbnRvIHRoZSBmaWxlIEZEIGRlc2NyaWJlcyBhY2NvcmRpbmcgdG8gUFJPVCBhbmQgRkxBR1MuICBJZiBBRERSCisgICBpcyBub256ZXJvLCBpdCBpcyB0aGUgZGVzaXJlZCBtYXBwaW5nIGFkZHJlc3MuICBJZiB0aGUgTUFQX0ZJWEVEIGJpdCBpcworICAgc2V0IGluIEZMQUdTLCB0aGUgbWFwcGluZyB3aWxsIGJlIGF0IEFERFIgZXhhY3RseSAod2hpY2ggbXVzdCBiZQorICAgcGFnZS1hbGlnbmVkKTsgb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gY2hvb3NlcyBhIGNvbnZlbmllbnQgbmVhcmJ5IGFkZHJlc3MuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhY3R1YWwgbWFwcGluZyBhZGRyZXNzIGNob3NlbiBvciBNQVBfRkFJTEVECisgICBmb3IgZXJyb3JzIChpbiB3aGljaCBjYXNlIGBlcnJubycgaXMgc2V0KS4gIEEgc3VjY2Vzc2Z1bCBgbW1hcCcgY2FsbAorICAgZGVhbGxvY2F0ZXMgYW55IHByZXZpb3VzIG1hcHBpbmcgZm9yIHRoZSBhZmZlY3RlZCByZWdpb24uICAqLworCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiB2b2lkICptbWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbiwgaW50IF9fcHJvdCwKKwkJICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZl90IF9fb2Zmc2V0KSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiB2b2lkICogX19SRURJUkVDVF9OVEggKG1tYXAsCisJCQkgICAgICAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCQkgICAgICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQpLAorCQkJICAgICAgbW1hcDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIG1tYXAgbW1hcDY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHZvaWQgKm1tYXA2NCAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX3Byb3QsCisJCSAgICAgaW50IF9fZmxhZ3MsIGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQpIF9fVEhST1c7CisjZW5kaWYKKworLyogRGVhbGxvY2F0ZSBhbnkgbWFwcGluZyBmb3IgdGhlIHJlZ2lvbiBzdGFydGluZyBhdCBBRERSIGFuZCBleHRlbmRpbmcgTEVOCisgICBieXRlcy4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBmb3IgZXJyb3JzIChhbmQgc2V0cyBlcnJubykuICAqLworZXh0ZXJuIGludCBtdW5tYXAgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIG1lbW9yeSBwcm90ZWN0aW9uIG9mIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQKKyAgIGV4dGVuZGluZyBMRU4gYnl0ZXMgdG8gUFJPVC4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBmb3IgZXJyb3JzCisgICAoYW5kIHNldHMgZXJybm8pLiAgKi8KK2V4dGVybiBpbnQgbXByb3RlY3QgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19wcm90KSBfX1RIUk9XOworCisvKiBTeW5jaHJvbml6ZSB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IEFERFIgYW5kIGV4dGVuZGluZyBMRU4gYnl0ZXMgd2l0aCB0aGUKKyAgIGZpbGUgaXQgbWFwcy4gIEZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBvbiBhIGZpbGUgYmVpbmcgbWFwcGVkIGFyZQorICAgdW5wcmVkaWN0YWJsZSBiZWZvcmUgdGhpcyBpcyBkb25lLiAgRmxhZ3MgYXJlIGZyb20gdGhlIE1TXyogc2V0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgbXN5bmMgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19mbGFncyk7CisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIEFkdmlzZSB0aGUgc3lzdGVtIGFib3V0IHBhcnRpY3VsYXIgdXNhZ2UgcGF0dGVybnMgdGhlIHByb2dyYW0gZm9sbG93cworICAgZm9yIHRoZSByZWdpb24gc3RhcnRpbmcgYXQgQUREUiBhbmQgZXh0ZW5kaW5nIExFTiBieXRlcy4gICovCitleHRlcm4gaW50IG1hZHZpc2UgKHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuLCBpbnQgX19hZHZpY2UpIF9fVEhST1c7CisjZW5kaWYKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBUaGlzIGlzIHRoZSBQT1NJWCBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBpbnQgcG9zaXhfbWFkdmlzZSAodm9pZCAqX19hZGRyLCBzaXplX3QgX19sZW4sIGludCBfX2FkdmljZSkgX19USFJPVzsKKyNlbmRpZgorCisvKiBHdWFyYW50ZWUgYWxsIHdob2xlIHBhZ2VzIG1hcHBlZCBieSB0aGUgcmFuZ2UgW0FERFIsQUREUitMRU4pIHRvCisgICBiZSBtZW1vcnkgcmVzaWRlbnQuICAqLworZXh0ZXJuIGludCBtbG9jayAoX19jb25zdCB2b2lkICpfX2FkZHIsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKworLyogVW5sb2NrIHdob2xlIHBhZ2VzIHByZXZpb3VzbHkgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK0xFTikuICAqLworZXh0ZXJuIGludCBtdW5sb2NrIChfX2NvbnN0IHZvaWQgKl9fYWRkciwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XOworCisvKiBDYXVzZSBhbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyBvZiB0aGUgcHJvY2VzcyB0byBiZSBtZW1vcnkgcmVzaWRlbnQKKyAgIHVudGlsIHVubG9ja2VkIGJ5IGEgY2FsbCB0byB0aGUgYG11bmxvY2thbGwnLCB1bnRpbCB0aGUgcHJvY2VzcyBleGl0cywKKyAgIG9yIHVudGlsIHRoZSBwcm9jZXNzIGNhbGxzIGBleGVjdmUnLiAgKi8KK2V4dGVybiBpbnQgbWxvY2thbGwgKGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBBbGwgY3VycmVudGx5IG1hcHBlZCBwYWdlcyBvZiB0aGUgcHJvY2VzcycgYWRkcmVzcyBzcGFjZSBiZWNvbWUKKyAgIHVubG9ja2VkLiAgKi8KK2V4dGVybiBpbnQgbXVubG9ja2FsbCAodm9pZCkgX19USFJPVzsKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIG1pbmNvcmUgcmV0dXJucyB0aGUgbWVtb3J5IHJlc2lkZW5jeSBzdGF0dXMgb2YgdGhlIHBhZ2VzIGluIHRoZQorICAgY3VycmVudCBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZSBzcGVjaWZpZWQgYnkgW3N0YXJ0LCBzdGFydCArIGxlbikuCisgICBUaGUgc3RhdHVzIGlzIHJldHVybmVkIGluIGEgdmVjdG9yIG9mIGJ5dGVzLiAgVGhlIGxlYXN0IHNpZ25pZmljYW50CisgICBiaXQgb2YgZWFjaCBieXRlIGlzIDEgaWYgdGhlIHJlZmVyZW5jZWQgcGFnZSBpcyBpbiBtZW1vcnksIG90aGVyd2lzZQorICAgaXQgaXMgemVyby4gICovCitleHRlcm4gaW50IG1pbmNvcmUgKHZvaWQgKl9fc3RhcnQsIHNpemVfdCBfX2xlbiwgdW5zaWduZWQgY2hhciAqX192ZWMpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmVtYXAgcGFnZXMgbWFwcGVkIGJ5IHRoZSByYW5nZSBbQUREUixBRERSK09MRF9MRU4pIHRvIG5ldyBsZW5ndGgKKyAgIE5FV19MRU4uICBJZiBNUkVNQVBfTUFZTU9WRSBpcyBzZXQgaW4gRkxBR1MgdGhlIHJldHVybmVkIGFkZHJlc3MKKyAgIG1heSBkaWZmZXIgZnJvbSBBRERSLiAgSWYgTVJFTUFQX0ZJWEVEIGlzIHNldCBpbiBGTEFHUyB0aGUgZnVuY3Rpb24KKyAgIHRha2VzIGFub3RoZXIgcGFyYW10ZXIgd2hpY2ggaXMgYSBmaXhlZCBhZGRyZXNzIGF0IHdoaWNoIHRoZSBibG9jaworICAgcmVzaWRlcyBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbC4gICovCitleHRlcm4gdm9pZCAqbXJlbWFwICh2b2lkICpfX2FkZHIsIHNpemVfdCBfX29sZF9sZW4sIHNpemVfdCBfX25ld19sZW4sCisJCSAgICAgaW50IF9fZmxhZ3MsIC4uLikgX19USFJPVzsKKworLyogUmVtYXAgYXJiaXRyYXJ5IHBhZ2VzIG9mIGEgc2hhcmVkIGJhY2tpbmcgc3RvcmUgd2l0aGluIGFuIGV4aXN0aW5nCisgICBWTUEuICAqLworZXh0ZXJuIGludCByZW1hcF9maWxlX3BhZ2VzICh2b2lkICpfX3N0YXJ0LCBzaXplX3QgX19zaXplLCBpbnQgX19wcm90LAorCQkJICAgICBzaXplX3QgX19wZ29mZiwgaW50IF9fZmxhZ3MpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBPcGVuIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobV9vcGVuIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fb2ZsYWcsIG1vZGVfdCBfX21vZGUpOworCisvKiBSZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htX3VubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpOworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL21tYW4uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvbW91bnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwNTU0OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL21vdW50LmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBtb3VudGluZy91bm1vdW50IExpbnV4IGZpbGVzeXN0ZW1zLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyogVGhpcyBpcyB0YWtlbiBmcm9tIC91c3IvaW5jbHVkZS9saW51eC9mcy5oLiAgKi8KKworI2lmbmRlZiBfU1lTX01PVU5UX0gKKyNkZWZpbmUgX1NZU19NT1VOVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNkZWZpbmUgQkxPQ0tfU0laRQkxMDI0CisjZGVmaW5lIEJMT0NLX1NJWkVfQklUUwkxMAorCisKKy8qIFRoZXNlIGFyZSB0aGUgZnMtaW5kZXBlbmRlbnQgbW91bnQtZmxhZ3M6IHVwIHRvIDE2IGZsYWdzIGFyZQorICAgc3VwcG9ydGVkICAqLworZW51bQoreworICBNU19SRE9OTFkgPSAxLAkJLyogTW91bnQgcmVhZC1vbmx5LiAgKi8KKyNkZWZpbmUgTVNfUkRPTkxZCU1TX1JET05MWQorICBNU19OT1NVSUQgPSAyLAkJLyogSWdub3JlIHN1aWQgYW5kIHNnaWQgYml0cy4gICovCisjZGVmaW5lIE1TX05PU1VJRAlNU19OT1NVSUQKKyAgTVNfTk9ERVYgPSA0LAkJCS8qIERpc2FsbG93IGFjY2VzcyB0byBkZXZpY2Ugc3BlY2lhbCBmaWxlcy4gICovCisjZGVmaW5lIE1TX05PREVWCU1TX05PREVWCisgIE1TX05PRVhFQyA9IDgsCQkvKiBEaXNhbGxvdyBwcm9ncmFtIGV4ZWN1dGlvbi4gICovCisjZGVmaW5lIE1TX05PRVhFQwlNU19OT0VYRUMKKyAgTVNfU1lOQ0hST05PVVMgPSAxNiwJCS8qIFdyaXRlcyBhcmUgc3luY2VkIGF0IG9uY2UuICAqLworI2RlZmluZSBNU19TWU5DSFJPTk9VUwlNU19TWU5DSFJPTk9VUworICBNU19SRU1PVU5UID0gMzIsCQkvKiBBbHRlciBmbGFncyBvZiBhIG1vdW50ZWQgRlMuICAqLworI2RlZmluZSBNU19SRU1PVU5UCU1TX1JFTU9VTlQKKyAgTVNfTUFORExPQ0sgPSA2NCwJCS8qIEFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBhbiBGUy4gICovCisjZGVmaW5lIE1TX01BTkRMT0NLCU1TX01BTkRMT0NLCisgIFNfV1JJVEUgPSAxMjgsCQkvKiBXcml0ZSBvbiBmaWxlL2RpcmVjdG9yeS9zeW1saW5rLiAgKi8KKyNkZWZpbmUgU19XUklURQkJU19XUklURQorICBTX0FQUEVORCA9IDI1NiwJCS8qIEFwcGVuZC1vbmx5IGZpbGUuICAqLworI2RlZmluZSBTX0FQUEVORAlTX0FQUEVORAorICBTX0lNTVVUQUJMRSA9IDUxMiwJCS8qIEltbXV0YWJsZSBmaWxlLiAgKi8KKyNkZWZpbmUgU19JTU1VVEFCTEUJU19JTU1VVEFCTEUKKyAgTVNfTk9BVElNRSA9IDEwMjQsCQkvKiBEbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lcy4gICovCisjZGVmaW5lIE1TX05PQVRJTUUJTVNfTk9BVElNRQorICBNU19OT0RJUkFUSU1FID0gMjA0OCwJCS8qIERvIG5vdCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcy4gICovCisjZGVmaW5lIE1TX05PRElSQVRJTUUJTVNfTk9ESVJBVElNRQorICBNU19CSU5EID0gNDA5NiwJCS8qIEJpbmQgZGlyZWN0b3J5IGF0IGRpZmZlcmVudCBwbGFjZS4gICovCisjZGVmaW5lIE1TX0JJTkQJCU1TX0JJTkQKK307CisKKy8qIEZsYWdzIHRoYXQgY2FuIGJlIGFsdGVyZWQgYnkgTVNfUkVNT1VOVCAgKi8KKyNkZWZpbmUgTVNfUk1UX01BU0sgKE1TX1JET05MWXxNU19TWU5DSFJPTk9VU3xNU19NQU5ETE9DS3xNU19OT0FUSU1FIFwKKwkJICAgICB8TVNfTk9ESVJBVElNRSkKKworCisvKiBNYWdpYyBtb3VudCBmbGFnIG51bWJlci4gSGFzIHRvIGJlIG9yLWVkIHRvIHRoZSBmbGFnIHZhbHVlcy4gICovCisKKyNkZWZpbmUgTVNfTUdDX1ZBTCAweGMwZWQwMDAwCS8qIE1hZ2ljIGZsYWcgbnVtYmVyIHRvIGluZGljYXRlICJuZXciIGZsYWdzICovCisjZGVmaW5lIE1TX01HQ19NU0sgMHhmZmZmMDAwMAkvKiBNYWdpYyBmbGFnIG51bWJlciBtYXNrICovCisKKworLyogVGhlIHJlYWQtb25seSBzdHVmZiBkb2Vzbid0IHJlYWxseSBiZWxvbmcgaGVyZSwgYnV0IGFueSBvdGhlciBwbGFjZQorICAgaXMgcHJvYmFibHkgYXMgYmFkIGFuZCBJIGRvbid0IHdhbnQgdG8gY3JlYXRlIHlldCBhbm90aGVyIGluY2x1ZGUKKyAgIGZpbGUuICAqLworCisjZGVmaW5lIEJMS1JPU0VUICAgX0lPKDB4MTIsIDkzKSAvKiBTZXQgZGV2aWNlIHJlYWQtb25seSAoMCA9IHJlYWQtd3JpdGUpLiAgKi8KKyNkZWZpbmUgQkxLUk9HRVQgICBfSU8oMHgxMiwgOTQpIC8qIEdldCByZWFkLW9ubHkgc3RhdHVzICgwID0gcmVhZF93cml0ZSkuICAqLworI2RlZmluZSBCTEtSUlBBUlQgIF9JTygweDEyLCA5NSkgLyogUmUtcmVhZCBwYXJ0aXRpb24gdGFibGUuICAqLworI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLCA5NikgLyogUmV0dXJuIGRldmljZSBzaXplLiAgKi8KKyNkZWZpbmUgQkxLRkxTQlVGICBfSU8oMHgxMiwgOTcpIC8qIEZsdXNoIGJ1ZmZlciBjYWNoZS4gICovCisjZGVmaW5lIEJMS1JBU0VUICAgX0lPKDB4MTIsIDk4KSAvKiBTZXQgcmVhZCBhaGVhZCBmb3IgYmxvY2sgZGV2aWNlLiAgKi8KKyNkZWZpbmUgQkxLUkFHRVQgICBfSU8oMHgxMiwgOTkpIC8qIEdldCBjdXJyZW50IHJlYWQgYWhlYWQgc2V0dGluZy4gICovCisjZGVmaW5lIEJMS0ZSQVNFVCAgX0lPKDB4MTIsMTAwKSAvKiBTZXQgZmlsZXN5c3RlbSByZWFkLWFoZWFkLiAgKi8KKyNkZWZpbmUgQkxLRlJBR0VUICBfSU8oMHgxMiwxMDEpIC8qIEdldCBmaWxlc3lzdGVtIHJlYWQtYWhlYWQuICAqLworI2RlZmluZSBCTEtTRUNUU0VUIF9JTygweDEyLDEwMikgLyogU2V0IG1heCBzZWN0b3JzIHBlciByZXF1ZXN0LiAgKi8KKyNkZWZpbmUgQkxLU0VDVEdFVCBfSU8oMHgxMiwxMDMpIC8qIEdldCBtYXggc2VjdG9ycyBwZXIgcmVxdWVzdC4gICovCisjZGVmaW5lIEJMS1NTWkdFVCAgX0lPKDB4MTIsMTA0KSAvKiBHZXQgYmxvY2sgZGV2aWNlIHNlY3RvciBzaXplLiAgKi8KKyNkZWZpbmUgQkxLQlNaR0VUICBfSU9SKDB4MTIsMTEyLHNpemVfdCkKKyNkZWZpbmUgQkxLQlNaU0VUICBfSU9XKDB4MTIsMTEzLHNpemVfdCkKKyNkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KSAvKiByZXR1cm4gZGV2aWNlIHNpemUuICAqLworCisKKy8qIFBvc3NpYmxlIHZhbHVlIGZvciBGTEFHUyBwYXJhbWV0ZXIgb2YgYHVtb3VudDInLiAgKi8KK2VudW0KK3sKKyAgTU5UX0ZPUkNFID0gMQkJCS8qIEZvcmNlIHVubW91bnRpbmcuICAqLworI2RlZmluZSBNTlRfRk9SQ0UgTU5UX0ZPUkNFCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogTW91bnQgYSBmaWxlc3lzdGVtLiAgKi8KK2V4dGVybiBpbnQgbW91bnQgKF9fY29uc3QgY2hhciAqX19zcGVjaWFsX2ZpbGUsIF9fY29uc3QgY2hhciAqX19kaXIsCisJCSAgX19jb25zdCBjaGFyICpfX2ZzdHlwZSwgdW5zaWduZWQgbG9uZyBpbnQgX19yd2ZsYWcsCisJCSAgX19jb25zdCB2b2lkICpfX2RhdGEpIF9fVEhST1c7CisKKy8qIFVubW91bnQgYSBmaWxlc3lzdGVtLiAgKi8KK2V4dGVybiBpbnQgdW1vdW50IChfX2NvbnN0IGNoYXIgKl9fc3BlY2lhbF9maWxlKSBfX1RIUk9XOworCisvKiBVbm1vdW50IGEgZmlsZXN5c3RlbS4gIEZvcmNlIHVubW91bnRpbmcgaWYgRkxBR1MgaXMgc2V0IHRvIE1OVF9GT1JDRS4gICovCitleHRlcm4gaW50IHVtb3VudDIgKF9fY29uc3QgY2hhciAqX19zcGVjaWFsX2ZpbGUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19NT1VOVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9tc2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzk2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9tc2cuaApAQCAtMCwwICsxLDg1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywxOTk5LDIwMDAsMjAwMywyMDA2LDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfTVNHX0gKKyNkZWZpbmUgX1NZU19NU0dfSAorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfc2l6ZV90CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCBjb21tb24gZGVmaW5pdGlvbiBvZiBTeXN0ZW0gViBzdHlsZSBJUEMuICAqLworI2luY2x1ZGUgPHN5cy9pcGMuaD4KKworLyogR2V0IHN5c3RlbSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBgc3RydWN0IG1zcWlkX2RzJyBhbmQgbW9yZS4gICovCisjaW5jbHVkZSA8Yml0cy9tc3EuaD4KKworLyogRGVmaW5lIHR5cGVzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZC4gICovCisjZGVmaW5lCV9fbmVlZF90aW1lX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fc3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3NpemVfdCBzc2l6ZV90OworIyBkZWZpbmUgX19zc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIFN5c3RlbSBWIHN0eWxlIElQQyBmdW5jdGlvbnMgaW1wbGVtZW50IGEgbWVzc2FnZSBxdWV1ZQorICAgc3lzdGVtLiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHMi4gICovCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRlbXBsYXRlIGZvciBzdHJ1Y3QgdG8gYmUgdXNlZCBhcyBhcmd1bWVudCBmb3IgYG1zZ3NuZCcgYW5kIGBtc2dyY3YnLiAgKi8KK3N0cnVjdCBtc2didWYKKyAgeworICAgIGxvbmcgaW50IG10eXBlOwkJLyogdHlwZSBvZiByZWNlaXZlZC9zZW50IG1lc3NhZ2UgKi8KKyAgICBjaGFyIG10ZXh0WzFdOwkJLyogdGV4dCBvZiB0aGUgbWVzc2FnZSAqLworICB9OworI2VuZGlmCisKKworX19CRUdJTl9ERUNMUworCisvKiBNZXNzYWdlIHF1ZXVlIGNvbnRyb2wgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgbXNnY3RsIChpbnQgX19tc3FpZCwgaW50IF9fY21kLCBzdHJ1Y3QgbXNxaWRfZHMgKl9fYnVmKSBfX1RIUk9XOworCisvKiBHZXQgbWVzc2FnZXMgcXVldWUuICAqLworZXh0ZXJuIGludCBtc2dnZXQgKGtleV90IF9fa2V5LCBpbnQgX19tc2dmbGcpIF9fVEhST1c7CisKKy8qIFJlY2VpdmUgbWVzc2FnZSBmcm9tIG1lc3NhZ2UgcXVldWUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgbXNncmN2IChpbnQgX19tc3FpZCwgdm9pZCAqX19tc2dwLCBzaXplX3QgX19tc2dzeiwKKwkJICAgICAgIGxvbmcgaW50IF9fbXNndHlwLCBpbnQgX19tc2dmbGcpOworCisvKiBTZW5kIG1lc3NhZ2UgdG8gbWVzc2FnZSBxdWV1ZS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IG1zZ3NuZCAoaW50IF9fbXNxaWQsIF9fY29uc3Qgdm9pZCAqX19tc2dwLCBzaXplX3QgX19tc2dzeiwKKwkJICAgaW50IF9fbXNnZmxnKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9tc2cuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvbXRpby5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvbXRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmE1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9tdGlvLmgKQEAgLTAsMCArMSwyNzcgQEAKKy8qIFN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIGZvciBtYWduZXRpYyB0YXBlIEkvTyBjb250cm9sIGNvbW1hbmRzLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKiBXcml0dGVuIGJ5IEguIEJlcmdtYW4gPGhlbm51c0BjeWJlcmNvbW0ubmw+LiAgKi8KKworI2lmbmRlZiBfU1lTX01USU9fSAorI2RlZmluZSBfU1lTX01USU9fSAkxCisKKy8qIEdldCBuZWNlc3NhcnkgZGVmaW5pdGlvbnMgZnJvbSBzeXN0ZW0gYW5kIGtlcm5lbCBoZWFkZXJzLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworCisvKiBTdHJ1Y3R1cmUgZm9yIE1USU9DVE9QIC0gbWFnbmV0aWMgdGFwZSBvcGVyYXRpb24gY29tbWFuZC4gICovCitzdHJ1Y3QgbXRvcAorICB7CisgICAgc2hvcnQgaW50IG10X29wOwkJLyogT3BlcmF0aW9ucyBkZWZpbmVkIGJlbG93LiAgKi8KKyAgICBpbnQgbXRfY291bnQ7CQkvKiBIb3cgbWFueSBvZiB0aGVtLiAgKi8KKyAgfTsKKyNkZWZpbmUgX0lPVF9tdG9wIC8qIEh1cmQgaW9jdGwgdHlwZSBmaWVsZC4gICovIFwKKyAgX0lPVCAoX0lPVFMgKHNob3J0KSwgMSwgX0lPVFMgKGludCksIDEsIDAsIDApCisKKy8qIE1hZ25ldGljIFRhcGUgb3BlcmF0aW9ucyBbTm90IGFsbCBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSBhbGwgZHJpdmVyc10uICAqLworI2RlZmluZSBNVFJFU0VUIDAJLyogK3Jlc2V0IGRyaXZlIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAqLworI2RlZmluZSBNVEZTRgkxCS8qIEZvcndhcmQgc3BhY2Ugb3ZlciBGaWxlTWFyaywKKwkJCSAqIHBvc2l0aW9uIGF0IGZpcnN0IHJlY29yZCBvZiBuZXh0IGZpbGUuICAqLworI2RlZmluZSBNVEJTRgkyCS8qIEJhY2t3YXJkIHNwYWNlIEZpbGVNYXJrIChwb3NpdGlvbiBiZWZvcmUgRk0pLiAgKi8KKyNkZWZpbmUgTVRGU1IJMwkvKiBGb3J3YXJkIHNwYWNlIHJlY29yZC4gICovCisjZGVmaW5lIE1UQlNSCTQJLyogQmFja3dhcmQgc3BhY2UgcmVjb3JkLiAgKi8KKyNkZWZpbmUgTVRXRU9GCTUJLyogV3JpdGUgYW4gZW5kLW9mLWZpbGUgcmVjb3JkIChtYXJrKS4gICovCisjZGVmaW5lIE1UUkVXCTYJLyogUmV3aW5kLiAgKi8KKyNkZWZpbmUgTVRPRkZMCTcJLyogUmV3aW5kIGFuZCBwdXQgdGhlIGRyaXZlIG9mZmxpbmUgKGVqZWN0PykuICAqLworI2RlZmluZSBNVE5PUAk4CS8qIE5vIG9wLCBzZXQgc3RhdHVzIG9ubHkgKHJlYWQgd2l0aCBNVElPQ0dFVCkuICAqLworI2RlZmluZSBNVFJFVEVOIDkJLyogUmV0ZW5zaW9uIHRhcGUuICAqLworI2RlZmluZSBNVEJTRk0JMTAJLyogK2JhY2t3YXJkIHNwYWNlIEZpbGVNYXJrLCBwb3NpdGlvbiBhdCBGTS4gICovCisjZGVmaW5lIE1URlNGTSAgMTEJLyogK2ZvcndhcmQgc3BhY2UgRmlsZU1hcmssIHBvc2l0aW9uIGF0IEZNLiAgKi8KKyNkZWZpbmUgTVRFT00JMTIJLyogR290byBlbmQgb2YgcmVjb3JkZWQgbWVkaWEgKGZvciBhcHBlbmRpbmcgZmlsZXMpLgorCQkJICAgTVRFT00gcG9zaXRpb25zIGFmdGVyIHRoZSBsYXN0IEZNLCByZWFkeSBmb3IKKwkJCSAgIGFwcGVuZGluZyBhbm90aGVyIGZpbGUuICAqLworI2RlZmluZSBNVEVSQVNFIDEzCS8qIEVyYXNlIHRhcGUgLS0gYmUgY2FyZWZ1bCEgICovCisKKyNkZWZpbmUgTVRSQVMxICAxNAkvKiBSdW4gc2VsZiB0ZXN0IDEgKG5vbmRlc3RydWN0aXZlKS4gICovCisjZGVmaW5lIE1UUkFTMgkxNQkvKiBSdW4gc2VsZiB0ZXN0IDIgKGRlc3RydWN0aXZlKS4gICovCisjZGVmaW5lIE1UUkFTMyAgMTYJLyogUmVzZXJ2ZWQgZm9yIHNlbGYgdGVzdCAzLiAgKi8KKworI2RlZmluZSBNVFNFVEJMSyAyMAkvKiBTZXQgYmxvY2sgbGVuZ3RoIChTQ1NJKS4gICovCisjZGVmaW5lIE1UU0VUREVOU0lUWSAyMQkvKiBTZXQgdGFwZSBkZW5zaXR5IChTQ1NJKS4gICovCisjZGVmaW5lIE1UU0VFSwkyMgkvKiBTZWVrIHRvIGJsb2NrIChUYW5kYmVyZywgZXRjLikuICAqLworI2RlZmluZSBNVFRFTEwJMjMJLyogVGVsbCBibG9jayAoVGFuZGJlcmcsIGV0Yy4pLiAgKi8KKyNkZWZpbmUgTVRTRVREUlZCVUZGRVIgMjQgLyogU2V0IHRoZSBkcml2ZSBidWZmZXJpbmcgYWNjb3JkaW5nIHRvIFNDU0ktMi4KKwkJCSAgICAgT3JkaW5hcnkgYnVmZmVyZWQgb3BlcmF0aW9uIHdpdGggY29kZSAxLiAgKi8KKyNkZWZpbmUgTVRGU1MJMjUJLyogU3BhY2UgZm9yd2FyZCBvdmVyIHNldG1hcmtzLiAgKi8KKyNkZWZpbmUgTVRCU1MJMjYJLyogU3BhY2UgYmFja3dhcmQgb3ZlciBzZXRtYXJrcy4gICovCisjZGVmaW5lIE1UV1NNCTI3CS8qIFdyaXRlIHNldG1hcmtzLiAgKi8KKworI2RlZmluZSBNVExPQ0sgIDI4CS8qIExvY2sgdGhlIGRyaXZlIGRvb3IuICAqLworI2RlZmluZSBNVFVOTE9DSyAyOQkvKiBVbmxvY2sgdGhlIGRyaXZlIGRvb3IuICAqLworI2RlZmluZSBNVExPQUQgIDMwCS8qIEV4ZWN1dGUgdGhlIFNDU0kgbG9hZCBjb21tYW5kLiAgKi8KKyNkZWZpbmUgTVRVTkxPQUQgMzEJLyogRXhlY3V0ZSB0aGUgU0NTSSB1bmxvYWQgY29tbWFuZC4gICovCisjZGVmaW5lIE1UQ09NUFJFU1NJT04gMzIvKiBDb250cm9sIGNvbXByZXNzaW9uIHdpdGggU0NTSSBtb2RlIHBhZ2UgMTUuICAqLworI2RlZmluZSBNVFNFVFBBUlQgMzMJLyogQ2hhbmdlIHRoZSBhY3RpdmUgdGFwZSBwYXJ0aXRpb24uICAqLworI2RlZmluZSBNVE1LUEFSVCAgMzQJLyogRm9ybWF0IHRoZSB0YXBlIHdpdGggb25lIG9yIHR3byBwYXJ0aXRpb25zLiAgKi8KKworLyogc3RydWN0dXJlIGZvciBNVElPQ0dFVCAtIG1hZyB0YXBlIGdldCBzdGF0dXMgY29tbWFuZCAqLworCitzdHJ1Y3QgbXRnZXQKKyAgeworICAgIGxvbmcgaW50IG10X3R5cGU7CQkvKiBUeXBlIG9mIG1hZ3RhcGUgZGV2aWNlLiAgKi8KKyAgICBsb25nIGludCBtdF9yZXNpZDsJCS8qIFJlc2lkdWFsIGNvdW50OiAobm90IHN1cmUpCisJCQkJICAgbnVtYmVyIG9mIGJ5dGVzIGlnbm9yZWQsIG9yCisJCQkJICAgbnVtYmVyIG9mIGZpbGVzIG5vdCBza2lwcGVkLCBvcgorCQkJCSAgIG51bWJlciBvZiByZWNvcmRzIG5vdCBza2lwcGVkLiAgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgZGV2aWNlIGRlcGVuZGVudC4gICovCisgICAgbG9uZyBpbnQgbXRfZHNyZWc7CQkvKiBTdGF0dXMgcmVnaXN0ZXIuICAqLworICAgIGxvbmcgaW50IG10X2dzdGF0OwkJLyogR2VuZXJpYyAoZGV2aWNlIGluZGVwZW5kZW50KSBzdGF0dXMuICAqLworICAgIGxvbmcgaW50IG10X2VycmVnOwkJLyogRXJyb3IgcmVnaXN0ZXIuICAqLworICAgIC8qIFRoZSBuZXh0IHR3byBmaWVsZHMgYXJlIG5vdCBhbHdheXMgdXNlZC4gICovCisgICAgX19kYWRkcl90IG10X2ZpbGVubzsJLyogTnVtYmVyIG9mIGN1cnJlbnQgZmlsZSBvbiB0YXBlLiAgKi8KKyAgICBfX2RhZGRyX3QgbXRfYmxrbm87CQkvKiBDdXJyZW50IGJsb2NrIG51bWJlci4gICovCisgIH07CisjZGVmaW5lIF9JT1RfbXRnZXQgLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UIChfSU9UUyAobG9uZyksIDcsIDAsIDAsIDAsIDApCisKKworLyogQ29uc3RhbnRzIGZvciBtdF90eXBlLiBOb3QgYWxsIG9mIHRoZXNlIGFyZSBzdXBwb3J0ZWQsIGFuZAorICAgdGhlc2UgYXJlIG5vdCBhbGwgb2YgdGhlIG9uZXMgdGhhdCBhcmUgc3VwcG9ydGVkLiAgKi8KKyNkZWZpbmUgTVRfSVNVTktOT1dOCQkweDAxCisjZGVmaW5lIE1UX0lTUUlDMDIJCTB4MDIJLyogR2VuZXJpYyBRSUMtMDIgdGFwZSBzdHJlYW1lci4gICovCisjZGVmaW5lIE1UX0lTV1Q1MTUwCQkweDAzCS8qIFdhbmd0ZWsgNTE1MEVRLCBRSUMtMTUwLCBRSUMtMDIuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfNTk0NUwyCTB4MDQJLyogQXJjaGl2ZSA1OTQ1TC0yLCBRSUMtMjQsIFFJQy0wMj8uICovCisjZGVmaW5lIE1UX0lTQ01TSjUwMAkJMHgwNQkvKiBDTVMgSnVtYm8gNTAwIChRSUMtMDI/KS4gICovCisjZGVmaW5lIE1UX0lTVERDMzYxMAkJMHgwNgkvKiBUYW5kYmVyZyA2MzEwLCBRSUMtMjQuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfVlA2MEkJMHgwNwkvKiBBcmNoaXZlIFZQNjBpLCBRSUMtMDIuICAqLworI2RlZmluZSBNVF9JU0FSQ0hJVkVfMjE1MEwJMHgwOAkvKiBBcmNoaXZlIFZpcGVyIDIxNTBMLiAgKi8KKyNkZWZpbmUgTVRfSVNBUkNISVZFXzIwNjBMCTB4MDkJLyogQXJjaGl2ZSBWaXBlciAyMDYwTC4gICovCisjZGVmaW5lIE1UX0lTQVJDSElWRVNDNDk5CTB4MEEJLyogQXJjaGl2ZSBTQy00OTkgUUlDLTM2IGNvbnRyb2xsZXIuICovCisjZGVmaW5lIE1UX0lTUUlDMDJfQUxMX0ZFQVRVUkVTCTB4MEYJLyogR2VuZXJpYyBRSUMtMDIgd2l0aCBhbGwgZmVhdHVyZXMuICovCisjZGVmaW5lIE1UX0lTV1Q1MDk5RUVOMjQJMHgxMQkvKiBXYW5ndGVrIDUwOTktZWVuMjQsIDYwTUIsIFFJQy0yNC4gKi8KKyNkZWZpbmUgTVRfSVNURUFDX01UMlNUCQkweDEyCS8qIFRlYWMgTVQtMlNUIDE1NW1iIGRyaXZlLAorCQkJCQkgICBUZWFjIERDLTEgY2FyZCAoV2FuZ3RlayB0eXBlKS4gICovCisjZGVmaW5lIE1UX0lTRVZFUkVYX0ZUNDBBCTB4MzIJLyogRXZlcmV4IEZUNDBBIChRSUMtNDApLiAgKi8KKyNkZWZpbmUgTVRfSVNERFMxCQkweDUxCS8qIEREUyBkZXZpY2Ugd2l0aG91dCBwYXJ0aXRpb25zLiAgKi8KKyNkZWZpbmUgTVRfSVNERFMyCQkweDUyCS8qIEREUyBkZXZpY2Ugd2l0aCBwYXJ0aXRpb25zLiAgKi8KKyNkZWZpbmUgTVRfSVNTQ1NJMQkJMHg3MQkvKiBHZW5lcmljIEFOU0kgU0NTSS0xIHRhcGUgdW5pdC4gICovCisjZGVmaW5lIE1UX0lTU0NTSTIJCTB4NzIJLyogR2VuZXJpYyBBTlNJIFNDU0ktMiB0YXBlIHVuaXQuICAqLworCisvKiBRSUMtNDAvODAvMzAxMC8zMDIwIGZ0YXBlIHN1cHBvcnRlZCBkcml2ZXMuCisgICAyMGJpdCB2ZW5kb3IgSUQgKyAweDgwMDAwMCAoc2VlIHZlbmRvcnMuaCBpbiBmdGFwZSBkaXN0cmlidXRpb24pLiAgKi8KKyNkZWZpbmUgTVRfSVNGVEFQRV9VTktOT1dOCTB4ODAwMDAwIC8qIG9ic29sZXRlICovCisjZGVmaW5lIE1UX0lTRlRBUEVfRkxBRwkJMHg4MDAwMDAKKworc3RydWN0IG10X3RhcGVfaW5mbworICB7CisgICAgbG9uZyBpbnQgdF90eXBlOwkJLyogRGV2aWNlIHR5cGUgaWQgKG10X3R5cGUpLiAgKi8KKyAgICBjaGFyICp0X25hbWU7CQkvKiBEZXNjcmlwdGl2ZSBuYW1lLiAgKi8KKyAgfTsKKworI2RlZmluZSBNVF9UQVBFX0lORk8gXAorICB7CQkJCQkJCQkJICAgICAgXAorCXtNVF9JU1VOS05PV04sCQkiVW5rbm93biB0eXBlIG9mIHRhcGUgZGV2aWNlIn0sCQkgICAgICBcCisJe01UX0lTUUlDMDIsCQkiR2VuZXJpYyBRSUMtMDIgdGFwZSBzdHJlYW1lciJ9LAkgICAgICBcCisJe01UX0lTV1Q1MTUwLAkJIldhbmd0ZWsgNTE1MCwgUUlDLTE1MCJ9LAkJICAgICAgXAorCXtNVF9JU0FSQ0hJVkVfNTk0NUwyLAkiQXJjaGl2ZSA1OTQ1TC0yIn0sCQkJICAgICAgXAorCXtNVF9JU0NNU0o1MDAsCQkiQ01TIEp1bWJvIDUwMCJ9LAkJCSAgICAgIFwKKwl7TVRfSVNUREMzNjEwLAkJIlRhbmRiZXJnIFREQyAzNjEwLCBRSUMtMjQifSwJCSAgICAgIFwKKwl7TVRfSVNBUkNISVZFX1ZQNjBJLAkiQXJjaGl2ZSBWUDYwaSwgUUlDLTAyIn0sCQkgICAgICBcCisJe01UX0lTQVJDSElWRV8yMTUwTCwJIkFyY2hpdmUgVmlwZXIgMjE1MEwifSwJCQkgICAgICBcCisJe01UX0lTQVJDSElWRV8yMDYwTCwJIkFyY2hpdmUgVmlwZXIgMjA2MEwifSwJCQkgICAgICBcCisJe01UX0lTQVJDSElWRVNDNDk5LAkiQXJjaGl2ZSBTQy00OTkgUUlDLTM2IGNvbnRyb2xsZXIifSwJICAgICAgXAorCXtNVF9JU1FJQzAyX0FMTF9GRUFUVVJFUywgIkdlbmVyaWMgUUlDLTAyIHRhcGUsIGFsbCBmZWF0dXJlcyJ9LAkgICAgICBcCisJe01UX0lTV1Q1MDk5RUVOMjQsCSJXYW5ndGVrIDUwOTktZWVuMjQsIDYwTUIifSwJCSAgICAgIFwKKwl7TVRfSVNURUFDX01UMlNULAkiVGVhYyBNVC0yU1QgMTU1bWIgZGF0YSBjYXNzZXR0ZSBkcml2ZSJ9LCAgICAgXAorCXtNVF9JU0VWRVJFWF9GVDQwQSwJIkV2ZXJleCBGVDQwQSwgUUlDLTQwIn0sCQkgICAgICBcCisJe01UX0lTU0NTSTEsCQkiR2VuZXJpYyBTQ1NJLTEgdGFwZSJ9LAkJCSAgICAgIFwKKwl7TVRfSVNTQ1NJMiwJCSJHZW5lcmljIFNDU0ktMiB0YXBlIn0sCQkJICAgICAgXAorCXswLCBOVUxMfQkJCQkJCQkgICAgICBcCisgIH0KKworCisvKiBTdHJ1Y3R1cmUgZm9yIE1USU9DUE9TIC0gbWFnIHRhcGUgZ2V0IHBvc2l0aW9uIGNvbW1hbmQuICAqLworCitzdHJ1Y3QgbXRwb3MKKyAgeworICAgIGxvbmcgaW50IG10X2Jsa25vOwkvKiBDdXJyZW50IGJsb2NrIG51bWJlci4gICovCisgIH07CisjZGVmaW5lIF9JT1RfbXRwb3MgLyogSHVyZCBpb2N0bCB0eXBlIGZpZWxkLiAgKi8gXAorICBfSU9UX1NJTVBMRSAobG9uZykKKworCisvKiBTdHJ1Y3R1cmUgZm9yIE1USU9DR0VUQ09ORklHL01USU9DU0VUQ09ORklHIHByaW1hcmlseSBpbnRlbmRlZAorICAgYXMgYW4gaW50ZXJpbSBzb2x1dGlvbiBmb3IgUUlDLTAyIHVudGlsIERESSBpcyBmdWxseSBpbXBsZW1lbnRlZC4gICovCitzdHJ1Y3QgbXRjb25maWdpbmZvCisgIHsKKyAgICBsb25nIGludCBtdF90eXBlOwkJLyogRHJpdmUgdHlwZS4gICovCisgICAgbG9uZyBpbnQgaWZjX3R5cGU7CQkvKiBJbnRlcmZhY2UgY2FyZCB0eXBlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgaXJxbnI7CS8qIElSUSBudW1iZXIgdG8gdXNlLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgZG1hbnI7CS8qIERNQSBjaGFubmVsIHRvIHVzZS4gICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHBvcnQ7CS8qIElPIHBvcnQgYmFzZSBhZGRyZXNzLiAgKi8KKworICAgIHVuc2lnbmVkIGxvbmcgaW50IGRlYnVnOwkvKiBEZWJ1Z2dpbmcgZmxhZ3MuICAqLworCisgICAgdW5zaWduZWQgaGF2ZV9kZW5zOjE7CisgICAgdW5zaWduZWQgaGF2ZV9ic2Y6MTsKKyAgICB1bnNpZ25lZCBoYXZlX2ZzcjoxOworICAgIHVuc2lnbmVkIGhhdmVfYnNyOjE7CisgICAgdW5zaWduZWQgaGF2ZV9lb2Q6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3NlZWs6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3RlbGw6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3JhczE6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3JhczI6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3JhczM6MTsKKyAgICB1bnNpZ25lZCBoYXZlX3FmYToxOworCisgICAgdW5zaWduZWQgcGFkMTo1OworICAgIGNoYXIgcmVzZXJ2ZWRbMTBdOworICB9OworI2RlZmluZSBfSU9UX210Y29uZmlnaW5mbyAvKiBIdXJkIGlvY3RsIHR5cGUgZmllbGQuICAqLyBcCisgIF9JT1QgKF9JT1RTIChsb25nKSwgMiwgX0lPVFMgKHNob3J0KSwgMywgX0lPVFMgKGxvbmcpLCAxKSAvKiBYWFggd3JvbmcgKi8KKworCisvKiBNYWduZXRpYyB0YXBlIEkvTyBjb250cm9sIGNvbW1hbmRzLiAgKi8KKyNkZWZpbmUJTVRJT0NUT1AJX0lPVygnbScsIDEsIHN0cnVjdCBtdG9wKQkvKiBEbyBhIG1hZyB0YXBlIG9wLiAqLworI2RlZmluZQlNVElPQ0dFVAlfSU9SKCdtJywgMiwgc3RydWN0IG10Z2V0KQkvKiBHZXQgdGFwZSBzdGF0dXMuICAqLworI2RlZmluZQlNVElPQ1BPUwlfSU9SKCdtJywgMywgc3RydWN0IG10cG9zKQkvKiBHZXQgdGFwZSBwb3NpdGlvbi4qLworCisvKiBUaGUgbmV4dCB0d28gYXJlIHVzZWQgYnkgdGhlIFFJQy0wMiBkcml2ZXIgZm9yIHJ1bnRpbWUgcmVjb25maWd1cmF0aW9uLgorICAgU2VlIHRwcWljMDIuaCBmb3Igc3RydWN0IG10Y29uZmlnaW5mby4gICovCisjZGVmaW5lCU1USU9DR0VUQ09ORklHCV9JT1IoJ20nLCA0LCBzdHJ1Y3QgbXRjb25maWdpbmZvKSAvKiBHZXQgdGFwZSBjb25maWcuKi8KKyNkZWZpbmUJTVRJT0NTRVRDT05GSUcJX0lPVygnbScsIDUsIHN0cnVjdCBtdGNvbmZpZ2luZm8pIC8qIFNldCB0YXBlIGNvbmZpZy4qLworCisvKiBHZW5lcmljIE1hZyBUYXBlIChkZXZpY2UgaW5kZXBlbmRlbnQpIHN0YXR1cyBtYWNyb3MgZm9yIGV4YW1pbmluZworICAgbXRfZ3N0YXQgLS0gSFAtVVggY29tcGF0aWJsZS4KKyAgIFRoZXJlIGlzIHJvb20gZm9yIG1vcmUgZ2VuZXJpYyBzdGF0dXMgYml0cyBoZXJlLCBidXQgSSBkb24ndAorICAga25vdyB3aGljaCBvZiB0aGVtIGFyZSByZXNlcnZlZC4gQXQgbGVhc3QgdGhyZWUgb3Igc28gc2hvdWxkCisgICBiZSBhZGRlZCB0byBtYWtlIHRoaXMgcmVhbGx5IHVzZWZ1bC4gICovCisjZGVmaW5lIEdNVF9FT0YoeCkgICAgICAgICAgICAgICgoeCkgJiAweDgwMDAwMDAwKQorI2RlZmluZSBHTVRfQk9UKHgpICAgICAgICAgICAgICAoKHgpICYgMHg0MDAwMDAwMCkKKyNkZWZpbmUgR01UX0VPVCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4MjAwMDAwMDApCisjZGVmaW5lIEdNVF9TTSh4KSAgICAgICAgICAgICAgICgoeCkgJiAweDEwMDAwMDAwKSAgLyogRERTIHNldG1hcmsgKi8KKyNkZWZpbmUgR01UX0VPRCh4KSAgICAgICAgICAgICAgKCh4KSAmIDB4MDgwMDAwMDApICAvKiBERFMgRU9EICovCisjZGVmaW5lIEdNVF9XUl9QUk9UKHgpICAgICAgICAgICgoeCkgJiAweDA0MDAwMDAwKQorLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMjAwMDAwMCkgKi8KKyNkZWZpbmUgR01UX09OTElORSh4KSAgICAgICAgICAgKCh4KSAmIDB4MDEwMDAwMDApCisjZGVmaW5lIEdNVF9EXzYyNTAoeCkgICAgICAgICAgICgoeCkgJiAweDAwODAwMDAwKQorI2RlZmluZSBHTVRfRF8xNjAwKHgpICAgICAgICAgICAoKHgpICYgMHgwMDQwMDAwMCkKKyNkZWZpbmUgR01UX0RfODAwKHgpICAgICAgICAgICAgKCh4KSAmIDB4MDAyMDAwMDApCisvKiAjZGVmaW5lIEdNVF8gPyAJCSgoeCkgJiAweDAwMTAwMDAwKSAqLworLyogI2RlZmluZSBHTVRfID8gCQkoKHgpICYgMHgwMDA4MDAwMCkgKi8KKyNkZWZpbmUgR01UX0RSX09QRU4oeCkgICAgICAgICAgKCh4KSAmIDB4MDAwNDAwMDApICAvKiBEb29yIG9wZW4gKG5vIHRhcGUpLiAgKi8KKy8qICNkZWZpbmUgR01UXyA/IAkJKCh4KSAmIDB4MDAwMjAwMDApICovCisjZGVmaW5lIEdNVF9JTV9SRVBfRU4oeCkgICAgICAgICgoeCkgJiAweDAwMDEwMDAwKSAgLyogSW1tZWRpYXRlIHJlcG9ydCBtb2RlLiovCisvKiAxNiBnZW5lcmljIHN0YXR1cyBiaXRzIHVudXNlZC4gICovCisKKworLyogU0NTSS10YXBlIHNwZWNpZmljIGRlZmluaXRpb25zLiAgQml0ZmllbGQgc2hpZnRzIGluIHRoZSBzdGF0dXMgICovCisjZGVmaW5lIE1UX1NUX0JMS1NJWkVfU0hJRlQJMAorI2RlZmluZSBNVF9TVF9CTEtTSVpFX01BU0sJMHhmZmZmZmYKKyNkZWZpbmUgTVRfU1RfREVOU0lUWV9TSElGVAkyNAorI2RlZmluZSBNVF9TVF9ERU5TSVRZX01BU0sJMHhmZjAwMDAwMAorCisjZGVmaW5lIE1UX1NUX1NPRlRFUlJfU0hJRlQJMAorI2RlZmluZSBNVF9TVF9TT0ZURVJSX01BU0sJMHhmZmZmCisKKy8qIEJpdGZpZWxkcyBmb3IgdGhlIE1UU0VURFJWQlVGRkVSIGlvY3RsLiAgKi8KKyNkZWZpbmUgTVRfU1RfT1BUSU9OUwkJMHhmMDAwMDAwMAorI2RlZmluZSBNVF9TVF9CT09MRUFOUwkJMHgxMDAwMDAwMAorI2RlZmluZSBNVF9TVF9TRVRCT09MRUFOUwkweDMwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0NMRUFSQk9PTEVBTlMJMHg0MDAwMDAwMAorI2RlZmluZSBNVF9TVF9XUklURV9USFJFU0hPTEQJMHgyMDAwMDAwMAorI2RlZmluZSBNVF9TVF9ERUZfQkxLU0laRQkweDUwMDAwMDAwCisjZGVmaW5lIE1UX1NUX0RFRl9PUFRJT05TCTB4NjAwMDAwMDAKKworI2RlZmluZSBNVF9TVF9CVUZGRVJfV1JJVEVTCTB4MQorI2RlZmluZSBNVF9TVF9BU1lOQ19XUklURVMJMHgyCisjZGVmaW5lIE1UX1NUX1JFQURfQUhFQUQJMHg0CisjZGVmaW5lIE1UX1NUX0RFQlVHR0lORwkJMHg4CisjZGVmaW5lIE1UX1NUX1RXT19GTQkJMHgxMAorI2RlZmluZSBNVF9TVF9GQVNUX01URU9NCTB4MjAKKyNkZWZpbmUgTVRfU1RfQVVUT19MT0NLCQkweDQwCisjZGVmaW5lIE1UX1NUX0RFRl9XUklURVMJMHg4MAorI2RlZmluZSBNVF9TVF9DQU5fQlNSCQkweDEwMAorI2RlZmluZSBNVF9TVF9OT19CTEtMSU1TCTB4MjAwCisjZGVmaW5lIE1UX1NUX0NBTl9QQVJUSVRJT05TICAgIDB4NDAwCisjZGVmaW5lIE1UX1NUX1NDU0kyTE9HSUNBTCAgICAgIDB4ODAwCisKKy8qIFRoZSBtb2RlIHBhcmFtZXRlcnMgdG8gYmUgY29udHJvbGxlZC4gUGFyYW1ldGVyIGNob3NlbiB3aXRoIGJpdHMgMjAtMjguICAqLworI2RlZmluZSBNVF9TVF9DTEVBUl9ERUZBVUxUCTB4ZmZmZmYKKyNkZWZpbmUgTVRfU1RfREVGX0RFTlNJVFkJKE1UX1NUX0RFRl9PUFRJT05TIHwgMHgxMDAwMDApCisjZGVmaW5lIE1UX1NUX0RFRl9DT01QUkVTU0lPTgkoTVRfU1RfREVGX09QVElPTlMgfCAweDIwMDAwMCkKKyNkZWZpbmUgTVRfU1RfREVGX0RSVkJVRkZFUgkoTVRfU1RfREVGX09QVElPTlMgfCAweDMwMDAwMCkKKworLyogVGhlIG9mZnNldCBmb3IgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHNwZWNpYWwgSFAgY2hhbmdlciBsb2FkIGNvbW1hbmQuICAqLworI2RlZmluZSBNVF9TVF9IUExPQURFUl9PRkZTRVQgMTAwMDAKKworCisvKiBTcGVjaWZ5IGRlZmF1bHQgdGFwZSBkZXZpY2UuICAqLworI2lmbmRlZiBERUZUQVBFCisjIGRlZmluZSBERUZUQVBFCSIvZGV2L3RhcGUiCisjZW5kaWYKKworI2VuZGlmIC8qIG10aW8uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcGFyYW0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwNDI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3BhcmFtLmgKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywyMDAwLDIwMDEsMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BBUkFNX0gKKyNkZWZpbmUgX1NZU19QQVJBTV9ICTEKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisKKy8qIEJTRCBuYW1lcyBmb3Igc29tZSA8bGltaXRzLmg+IHZhbHVlcy4gICovCisKKyNkZWZpbmUJTkJCWQkJQ0hBUl9CSVQKKyNpZm5kZWYJTkdST1VQUworIyBkZWZpbmUgTkdST1VQUwlOR1JPVVBTX01BWAorI2VuZGlmCisjZGVmaW5lCU1BWFNZTUxJTktTCTIwCisjZGVmaW5lCUNBTkJTSVoJCU1BWF9DQU5PTgorI2RlZmluZQlOQ0FSR1MJCUFSR19NQVgKKyNkZWZpbmUgTUFYUEFUSExFTglQQVRIX01BWAorLyogVGhlIGZvbGxvd2luZyBpcyBub3QgcmVhbGx5IGNvcnJlY3QgYnV0IGl0IGlzIGEgdmFsdWUgd2UgdXNlZCBmb3IgYQorICAgbG9uZyB0aW1lIGFuZCB3aGljaCBzZWVtcyB0byBiZSB1c2FibGUuICBQZW9wbGUgc2hvdWxkIG5vdCB1c2UgTk9GSUxFCisgICBhbnl3YXkuICAqLworI2RlZmluZSBOT0ZJTEUJCTI1NgorCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQml0IG1hcCByZWxhdGVkIG1hY3Jvcy4gICovCisjZGVmaW5lCXNldGJpdChhLGkpCSgoYSlbKGkpL05CQlldIHw9IDE8PCgoaSklTkJCWSkpCisjZGVmaW5lCWNscmJpdChhLGkpCSgoYSlbKGkpL05CQlldICY9IH4oMTw8KChpKSVOQkJZKSkpCisjZGVmaW5lCWlzc2V0KGEsaSkJKChhKVsoaSkvTkJCWV0gJiAoMTw8KChpKSVOQkJZKSkpCisjZGVmaW5lCWlzY2xyKGEsaSkJKCgoYSlbKGkpL05CQlldICYgKDE8PCgoaSklTkJCWSkpKSA9PSAwKQorCisvKiBNYWNyb3MgZm9yIGNvdW50aW5nIGFuZCByb3VuZGluZy4gICovCisjaWZuZGVmIGhvd21hbnkKKyMgZGVmaW5lIGhvd21hbnkoeCwgeSkJKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKQorI2VuZGlmCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIHJvdW5kdXAoeCwgeSkJKF9fYnVpbHRpbl9jb25zdGFudF9wICh5KSAmJiBwb3dlcm9mMiAoeSkJICAgICAgXAorCQkJID8gKCgoeCkgKyAoeSkgLSAxKSAmIH4oKHkpIC0gMSkpCQkgICAgICBcCisJCQkgOiAoKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKSAqICh5KSkpCisjZWxzZQorIyBkZWZpbmUgcm91bmR1cCh4LCB5KQkoKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKSAqICh5KSkKKyNlbmRpZgorI2RlZmluZSBwb3dlcm9mMih4KQkoKCgoeCkgLSAxKSAmICh4KSkgPT0gMCkKKworLyogTWFjcm9zIGZvciBtaW4vbWF4LiAgKi8KKyNkZWZpbmUJTUlOKGEsYikgKCgoYSk8KGIpKT8oYSk6KGIpKQorI2RlZmluZQlNQVgoYSxiKSAoKChhKT4oYikpPyhhKTooYikpCisKKworLyogVW5pdCBvZiBgc3RfYmxvY2tzJy4gICovCisjZGVmaW5lIERFVl9CU0laRSAgICAgICA1MTIKKworCisjZW5kaWYJLyogc3lzL3BhcmFtLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3BjaS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNjI2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3BjaS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BDSV9ICisjZGVmaW5lIF9TWVNfUENJX0gJMQorCisvKiBXZSB1c2UgdGhlIGNvbnN0YW50cyBmcm9tIHRoZSBrZXJuZWwuICAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjZW5kaWYgLyogc3lzL3BjaS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wZXJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wZXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZmE5MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Blcm0uaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19QRVJNX0gKKworI2RlZmluZSBfU1lTX1BFUk1fSAkxCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTZXQgcG9ydCBpbnB1dC9vdXRwdXQgcGVybWlzc2lvbnMuICAqLworZXh0ZXJuIGludCBpb3Blcm0gKHVuc2lnbmVkIGxvbmcgaW50IF9fZnJvbSwgdW5zaWduZWQgbG9uZyBpbnQgX19udW0sCisJCSAgIGludCBfX3R1cm5fb24pIF9fVEhST1c7CisKKworLyogQ2hhbmdlIEkvTyBwcml2aWxlZ2UgbGV2ZWwuICAqLworZXh0ZXJuIGludCBpb3BsIChpbnQgX19sZXZlbCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9TWVNfUEVSTV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wZXJzb25hbGl0eS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcGVyc29uYWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjdjNjFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcGVyc29uYWxpdHkuaApAQCAtMCwwICsxLDc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRha2VuIHZlcmJhdGltIGZyb20gTGludXggMi42IChpbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgpLiAgKi8KKworI2lmbmRlZiBfU1lTX1BFUlNPTkFMSVRZX0gKKyNkZWZpbmUgX1NZU19QRVJTT05BTElUWV9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEZsYWdzIGZvciBidWcgZW11bGF0aW9uLgorICAgVGhlc2Ugb2NjdXB5IHRoZSB0b3AgdGhyZWUgYnl0ZXMuICAqLworZW51bQorICB7CisgICAgQUREUl9OT19SQU5ET01JWkUgPSAweDAwNDAwMDAsCisgICAgTU1BUF9QQUdFX1pFUk8gPSAweDAxMDAwMDAsCisgICAgQUREUl9MSU1JVF8zMkJJVCA9IDB4MDgwMDAwMCwKKyAgICBTSE9SVF9JTk9ERSA9IDB4MTAwMDAwMCwKKyAgICBXSE9MRV9TRUNPTkRTID0gMHgyMDAwMDAwLAorICAgIFNUSUNLWV9USU1FT1VUUyA9IDB4NDAwMDAwMCwKKyAgICBBRERSX0xJTUlUXzNHQiA9IAkweDgwMDAwMDAKKyAgfTsKKworLyogUGVyc29uYWxpdHkgdHlwZXMuCisKKyAgIFRoZXNlIGdvIGluIHRoZSBsb3cgYnl0ZS4gIEF2b2lkIHVzaW5nIHRoZSB0b3AgYml0LCBpdCB3aWxsCisgICBjb25mbGljdCB3aXRoIGVycm9yIHJldHVybnMuICAqLworZW51bSAKKyAgeworICAgIFBFUl9MSU5VWCA9IDB4MDAwMCwKKyAgICBQRVJfTElOVVhfMzJCSVQgPSAweDAwMDAgfCBBRERSX0xJTUlUXzMyQklULAorICAgIFBFUl9TVlI0ID0gMHgwMDAxIHwgU1RJQ0tZX1RJTUVPVVRTIHwgTU1BUF9QQUdFX1pFUk8sCisgICAgUEVSX1NWUjMgPSAweDAwMDIgfCBTVElDS1lfVElNRU9VVFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfU0NPU1ZSMyA9IDB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8IFdIT0xFX1NFQ09ORFMgfCBTSE9SVF9JTk9ERSwKKyAgICBQRVJfT1NSNSA9IDB4MDAwMyB8IFNUSUNLWV9USU1FT1VUUyB8IFdIT0xFX1NFQ09ORFMsCisgICAgUEVSX1dZU0VWMzg2ID0gMHgwMDA0IHwgU1RJQ0tZX1RJTUVPVVRTIHwgU0hPUlRfSU5PREUsCisgICAgUEVSX0lTQ1I0ID0gMHgwMDA1IHwgU1RJQ0tZX1RJTUVPVVRTLAorICAgIFBFUl9CU0QgPSAweDAwMDYsCisgICAgUEVSX1NVTk9TID0gMHgwMDA2IHwgU1RJQ0tZX1RJTUVPVVRTLAorICAgIFBFUl9YRU5JWCA9IDB4MDAwNyB8IFNUSUNLWV9USU1FT1VUUyB8IFNIT1JUX0lOT0RFLAorICAgIFBFUl9MSU5VWDMyID0gMHgwMDA4LAorICAgIFBFUl9MSU5VWDMyXzNHQiA9IDB4MDAwOCB8IEFERFJfTElNSVRfM0dCLAorICAgIFBFUl9JUklYMzIgPSAweDAwMDkgfCBTVElDS1lfVElNRU9VVFMsCS8qIElSSVg1IDMyLWJpdCAqLworICAgIFBFUl9JUklYTjMyID0gMHgwMDBhIHwgU1RJQ0tZX1RJTUVPVVRTLAkvKiBJUklYNiBuZXcgMzItYml0ICovCisgICAgUEVSX0lSSVg2NCA9IDB4MDAwYiB8IFNUSUNLWV9USU1FT1VUUywJLyogSVJJWDYgNjQtYml0ICovCisgICAgUEVSX1JJU0NPUyA9IDB4MDAwYywKKyAgICBQRVJfU09MQVJJUyA9IDB4MDAwZCB8IFNUSUNLWV9USU1FT1VUUywKKyAgICBQRVJfVVc3ID0gMHgwMDBlIHwgU1RJQ0tZX1RJTUVPVVRTIHwgTU1BUF9QQUdFX1pFUk8sCisgICAgUEVSX09TRjQgPSAweDAwMGYsCisgICAgUEVSX0hQVVggPSAweDAwMTAsCisgICAgUEVSX01BU0sgPSAweDAwZmYsCisgIH07CisKK19fQkVHSU5fREVDTFMKKworLyogU2V0IGRpZmZlcmVudCBBQklzIChwZXJzb25hbGl0aWVzKS4gICovCitleHRlcm4gaW50IHBlcnNvbmFsaXR5ICh1bnNpZ25lZCBsb25nIGludCBfX3BlcnNvbmEpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvcGVyc29uYWxpdHkuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcG9sbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcG9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODViNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wb2xsLmgKQEAgLTAsMCArMSw3NCBAQAorLyogQ29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucyBmb3IgU3lzdGVtIFYgYHBvbGwnIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NCwxOTk2LTIwMDEsMjAwNCwyMDA1LDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19QT0xMX0gKKyNkZWZpbmUJX1NZU19QT0xMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHRoZSBwbGF0Zm9ybSBkZXBlbmRlbnQgYml0cyBvZiBgcG9sbCcuICAqLworI2luY2x1ZGUgPGJpdHMvcG9sbC5oPgorI2lmZGVmIF9fVVNFX0dOVQorLyogR2V0IHRoZSBfX3NpZ3NldF90IGRlZmluaXRpb24uICAqLworIyBpbmNsdWRlIDxiaXRzL3NpZ3NldC5oPgorLyogR2V0IHRoZSB0aW1lc3BlYyBkZWZpbml0aW9uLiAgKi8KKyMgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworCisvKiBUeXBlIHVzZWQgZm9yIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycy4gICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IG5mZHNfdDsKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHBvbGxpbmcgcmVxdWVzdC4gICovCitzdHJ1Y3QgcG9sbGZkCisgIHsKKyAgICBpbnQgZmQ7CQkJLyogRmlsZSBkZXNjcmlwdG9yIHRvIHBvbGwuICAqLworICAgIHNob3J0IGludCBldmVudHM7CQkvKiBUeXBlcyBvZiBldmVudHMgcG9sbGVyIGNhcmVzIGFib3V0LiAgKi8KKyAgICBzaG9ydCBpbnQgcmV2ZW50czsJCS8qIFR5cGVzIG9mIGV2ZW50cyB0aGF0IGFjdHVhbGx5IG9jY3VycmVkLiAgKi8KKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFBvbGwgdGhlIGZpbGUgZGVzY3JpcHRvcnMgZGVzY3JpYmVkIGJ5IHRoZSBORkRTIHN0cnVjdHVyZXMgc3RhcnRpbmcgYXQKKyAgIEZEUy4gIElmIFRJTUVPVVQgaXMgbm9uemVybyBhbmQgbm90IC0xLCBhbGxvdyBUSU1FT1VUIG1pbGxpc2Vjb25kcyBmb3IKKyAgIGFuIGV2ZW50IHRvIG9jY3VyOyBpZiBUSU1FT1VUIGlzIC0xLCBibG9jayB1bnRpbCBhbiBldmVudCBvY2N1cnMuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB3aXRoIGV2ZW50cywgemVybyBpZiB0aW1lZCBvdXQsCisgICBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcG9sbCAoc3RydWN0IHBvbGxmZCAqX19mZHMsIG5mZHNfdCBfX25mZHMsIGludCBfX3RpbWVvdXQpOworCisjaWZkZWYgX19VU0VfR05VCisvKiBMaWtlIHBvbGwsIGJ1dCBiZWZvcmUgd2FpdGluZyB0aGUgdGhyZWFkcyBzaWduYWwgbWFzayBpcyByZXBsYWNlZAorICAgd2l0aCB0aGF0IHNwZWNpZmllZCBpbiB0aGUgZm91cnRoIHBhcmFtZXRlci4gIEZvciBiZXR0ZXIgdXNhYmlsaXR5LAorICAgdGhlIHRpbWVvdXQgdmFsdWUgaXMgc3BlY2lmaWVkIHVzaW5nIGEgVElNRVNQRUMgb2JqZWN0LgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgcHBvbGwgKHN0cnVjdCBwb2xsZmQgKl9fZmRzLCBuZmRzX3QgX19uZmRzLAorCQkgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQsCisJCSAgX19jb25zdCBfX3NpZ3NldF90ICpfX3NzKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3BvbGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcHJjdGwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3ByY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5YjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3ByY3RsLmgKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfUFJDVExfSAorI2RlZmluZSBfU1lTX1BSQ1RMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPiAgLyogIFRoZSBtYWdpYyB2YWx1ZXMgY29tZSBmcm9tIGhlcmUgICovCisKK19fQkVHSU5fREVDTFMKKworLyogQ29udHJvbCBwcm9jZXNzIGV4ZWN1dGlvbi4gICovCitleHRlcm4gaW50IHByY3RsIChpbnQgX19vcHRpb24sIC4uLikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmICAvKiBzeXMvcHJjdGwuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcHJvY2ZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wcm9jZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNkN2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcHJvY2ZzLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwMSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BST0NGU19ICisjZGVmaW5lIF9TWVNfUFJPQ0ZTX0gJMQorCisvKiBUaGlzIGlzIHNvbWV3aGF0IG1vZGVsbGVkIGFmdGVyIHRoZSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgb24gU1ZSNAorICAgc3lzdGVtcy4gIEl0IHByb3ZpZGVzIGEgZGVmaW5pdGlvbiBvZiB0aGUgY29yZSBmaWxlIGZvcm1hdCBmb3IgRUxGCisgICB1c2VkIG9uIExpbnV4LiAgSXQgZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIC9wcm9jIGZpbGUKKyAgIHN5c3RlbSwgZXZlbiB0aG91Z2ggTGludXggaGFzIG9uZS4KKworICAgQW55d2F5LCB0aGUgd2hvbGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgZm9yIEdEQiBhbmQgR0RCIG9ubHkuCisgICBEb24ndCByZWFkIHRvbyBtdWNoIGludG8gaXQuICBEb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KKyAgIEdEQiB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiAgKi8KKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdXNlci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFR5cGUgZm9yIGEgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OworCisvKiBBbmQgdGhlIHdob2xlIGJ1bmNoIG9mIHRoZW0uICBXZSBjb3VsZCBoYXZlIHVzZWQgYHN0cnVjdAorICAgdXNlcl9yZWdzX3N0cnVjdCcgZGlyZWN0bHkgaW4gdGhlIHR5cGVkZWYsIGJ1dCB0cmFkaXRpb24gc2F5cyB0aGF0CisgICB0aGUgcmVnaXN0ZXIgc2V0IGlzIGFuIGFycmF5LCB3aGljaCBkb2VzIGhhdmUgc29tZSBwZWN1bGlhcgorICAgc2VtYW50aWNzLCBzbyBsZWF2ZSBpdCB0aGF0IHdheS4gICovCisjZGVmaW5lIEVMRl9OR1JFRyAoc2l6ZW9mIChzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YoZWxmX2dyZWdfdCkpCit0eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOworCisjaWYgX19XT1JEU0laRSA9PSAzMgorLyogUmVnaXN0ZXIgc2V0IGZvciB0aGUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdCBlbGZfZnByZWdzZXRfdDsKKworLyogUmVnaXN0ZXIgc2V0IGZvciB0aGUgZXh0ZW5kZWQgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLiAgSW5jbHVkZXMKKyAgIHRoZSBQZW50aXVtIElJSSBTU0UgcmVnaXN0ZXJzIGluIGFkZGl0aW9uIHRvIHRoZSBjbGFzc2ljCisgICBmbG9hdGluZy1wb2ludCBzdHVmZi4gICovCit0eXBlZGVmIHN0cnVjdCB1c2VyX2ZweHJlZ3Nfc3RydWN0IGVsZl9mcHhyZWdzZXRfdDsKKyNlbHNlCisvKiBSZWdpc3RlciBzZXQgZm9yIHRoZSBleHRlbmRlZCBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMuICBJbmNsdWRlcworICAgdGhlIFBlbnRpdW0gSUlJIFNTRSByZWdpc3RlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzaWMKKyAgIGZsb2F0aW5nLXBvaW50IHN0dWZmLiAgKi8KK3R5cGVkZWYgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdCBlbGZfZnByZWdzZXRfdDsKKyNlbmRpZgorCisvKiBTaWduYWwgaW5mby4gICovCitzdHJ1Y3QgZWxmX3NpZ2luZm8KKyAgeworICAgIGludCBzaV9zaWdubzsJCQkvKiBTaWduYWwgbnVtYmVyLiAgKi8KKyAgICBpbnQgc2lfY29kZTsJCQkvKiBFeHRyYSBjb2RlLiAgKi8KKyAgICBpbnQgc2lfZXJybm87CQkJLyogRXJybm8uICAqLworICB9OworCisKKy8qIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIEludGVsIFNWUjQtbGlrZSBjb3JlIGZpbGVzLiAgVGhlc2UgbW9zdGx5CisgICBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBTVlI0IHR5cGVzIHdpdGggImVsZl8iIHRhY2tlZCBvbiB0aGUKKyAgIGZyb250IHRvIHByZXZlbnQgY2xhc2hlcyB3aXRoIExpbnV4IGRlZmluaXRpb25zLCBhbmQgdGhlIHR5cGVkZWYKKyAgIGZvcm1zIGhhdmUgYmVlbiBhdm9pZGVkLiAgVGhpcyBpcyBtb3N0bHkgbGlrZSB0aGUgU1ZSNCBzdHJ1Y3R1cmUsCisgICBidXQgbW9yZSBMaW51eHksIHdpdGggdGhpbmdzIHRoYXQgTGludXggZG9lcyBub3Qgc3VwcG9ydCBhbmQgd2hpY2gKKyAgIEdEQiBkb2Vzbid0IHJlYWxseSB1c2UgZXhjbHVkZWQuICAqLworCitzdHJ1Y3QgZWxmX3Byc3RhdHVzCisgIHsKKyAgICBzdHJ1Y3QgZWxmX3NpZ2luZm8gcHJfaW5mbzsJCS8qIEluZm8gYXNzb2NpYXRlZCB3aXRoIHNpZ25hbC4gICovCisgICAgc2hvcnQgaW50IHByX2N1cnNpZzsJCS8qIEN1cnJlbnQgc2lnbmFsLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBwcl9zaWdwZW5kOwkvKiBTZXQgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBwcl9zaWdob2xkOwkvKiBTZXQgb2YgaGVsZCBzaWduYWxzLiAgKi8KKyAgICBfX3BpZF90IHByX3BpZDsKKyAgICBfX3BpZF90IHByX3BwaWQ7CisgICAgX19waWRfdCBwcl9wZ3JwOworICAgIF9fcGlkX3QgcHJfc2lkOworICAgIHN0cnVjdCB0aW1ldmFsIHByX3V0aW1lOwkJLyogVXNlciB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBwcl9zdGltZTsJCS8qIFN5c3RlbSB0aW1lLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBwcl9jdXRpbWU7CQkvKiBDdW11bGF0aXZlIHVzZXIgdGltZS4gICovCisgICAgc3RydWN0IHRpbWV2YWwgcHJfY3N0aW1lOwkJLyogQ3VtdWxhdGl2ZSBzeXN0ZW0gdGltZS4gICovCisgICAgZWxmX2dyZWdzZXRfdCBwcl9yZWc7CQkvKiBHUCByZWdpc3RlcnMuICAqLworICAgIGludCBwcl9mcHZhbGlkOwkJCS8qIFRydWUgaWYgbWF0aCBjb3BybyBiZWluZyB1c2VkLiAgKi8KKyAgfTsKKworCisjZGVmaW5lIEVMRl9QUkFSR1NaICAgICAoODApICAgIC8qIE51bWJlciBvZiBjaGFycyBmb3IgYXJncy4gICovCisKK3N0cnVjdCBlbGZfcHJwc2luZm8KKyAgeworICAgIGNoYXIgcHJfc3RhdGU7CQkJLyogTnVtZXJpYyBwcm9jZXNzIHN0YXRlLiAgKi8KKyAgICBjaGFyIHByX3NuYW1lOwkJCS8qIENoYXIgZm9yIHByX3N0YXRlLiAgKi8KKyAgICBjaGFyIHByX3pvbWI7CQkJLyogWm9tYmllLiAgKi8KKyAgICBjaGFyIHByX25pY2U7CQkJLyogTmljZSB2YWwuICAqLworICAgIHVuc2lnbmVkIGxvbmcgaW50IHByX2ZsYWc7CQkvKiBGbGFncy4gICovCisjaWYgX19XT1JEU0laRSA9PSAzMgorICAgIHVuc2lnbmVkIHNob3J0IGludCBwcl91aWQ7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHByX2dpZDsKKyNlbHNlCisgICAgdW5zaWduZWQgaW50IHByX3VpZDsKKyAgICB1bnNpZ25lZCBpbnQgcHJfZ2lkOworI2VuZGlmCisgICAgaW50IHByX3BpZCwgcHJfcHBpZCwgcHJfcGdycCwgcHJfc2lkOworICAgIC8qIExvdHMgbWlzc2luZyAqLworICAgIGNoYXIgcHJfZm5hbWVbMTZdOwkJCS8qIEZpbGVuYW1lIG9mIGV4ZWN1dGFibGUuICAqLworICAgIGNoYXIgcHJfcHNhcmdzW0VMRl9QUkFSR1NaXTsJLyogSW5pdGlhbCBwYXJ0IG9mIGFyZyBsaXN0LiAgKi8KKyAgfTsKKworCisvKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgcHJvdmlkZXMgdGhlIHR5cGVzIGZvciBlbXVsYXRpb24gb2YgdGhlCisgICBTb2xhcmlzIDxwcm9jX3NlcnZpY2UuaD4gaW50ZXJmYWNlcyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieQorICAgdXNlcnMgb2YgbGlidGhyZWFkX2RiLiAgKi8KKworLyogQWRkcmVzc2VzLiAgKi8KK3R5cGVkZWYgdm9pZCAqcHNhZGRyX3Q7CisKKy8qIFJlZ2lzdGVyIHNldHMuICBMaW51eCBoYXMgZGlmZmVyZW50IG5hbWVzLiAgKi8KK3R5cGVkZWYgZWxmX2dyZWdzZXRfdCBwcmdyZWdzZXRfdDsKK3R5cGVkZWYgZWxmX2ZwcmVnc2V0X3QgcHJmcHJlZ3NldF90OworCisvKiBXZSBkb24ndCBoYXZlIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByb2Nlc3NlcyBhbmQgdGhyZWFkcywKKyAgIHRoZXJlZm9yZSBoYXZlIG9ubHkgb25lIFBJRCB0eXBlLiAgKi8KK3R5cGVkZWYgX19waWRfdCBsd3BpZF90OworCisvKiBQcm9jZXNzIHN0YXR1cyBhbmQgaW5mby4gIEluIHRoZSBlbmQgd2UgZG8gcHJvdmlkZSB0eXBlZGVmcyBmb3IgdGhlbS4gICovCit0eXBlZGVmIHN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXNfdDsKK3R5cGVkZWYgc3RydWN0IGVsZl9wcnBzaW5mbyBwcnBzaW5mb190OworCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3Byb2Nmcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wcm9maWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Byb2ZpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDhlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9wcm9maWwuaApAQCAtMCwwICsxLDYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1BST0ZJTF9ICisjZGVmaW5lIF9QUk9GSUxfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBzcHJvZmlsKCkgc3lzdGVtIGNhbGxzIGFzCisgICBkZXNjcmliZWQgYnkgdGhlIHNwcm9maWwoMikgbWFuIHBhZ2Ugb2YgSXJpeCB2Ni41LCBleGNlcHQgdGhhdDoKKworCS0gdGhlcmUgaXMgbm8gYSBwcmlvcmkgbGltaXQgb24gbnVtYmVyIG9mIHRleHQgc2VjdGlvbnMKKwktIHByX3NjYWxlIGlzIGRlY2xhcmVkIGFzIHVuc2lnbmVkIGxvbmcgKGluc3RlYWQgb2YgInVuc2lnbmVkIGludCIpCisJLSBwcl9zaXplIGlzIGRlY2xhcmVkIGFzIHNpemVfdCAoaW5zdGVhZCBvZiAidW5zaWduZWQgaW50IikKKwktIHByX29mZiBpcyBkZWNsYXJlZCBhcyB2b2lkICogKGluc3RlYWQgb2YgIl9fcHN1bnNpZ25lZF90IikKKwktIHRoZSBvdmVyZmxvdyBiaW4gKHByX2Jhc2U9PTAsIHByX3NjYWxlPT0yKSBjYW4gYXBwZWFyIGFueXdoZXJlCisJICBpbiB0aGUgcHJvZnAgYXJyYXkKKwktIFBST0ZfRkFTVCBoYXMgbm8gZWZmZWN0ICAqLworCitzdHJ1Y3QgcHJvZgorICB7CisgICAgdm9pZCAqcHJfYmFzZTsJCS8qIGJ1ZmZlciBiYXNlICovCisgICAgc2l6ZV90IHByX3NpemU7CQkvKiBidWZmZXIgc2l6ZSAqLworICAgIHNpemVfdCBwcl9vZmY7CQkvKiBwYyBvZmZzZXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGludCBwcl9zY2FsZTsJLyogcGMgc2NhbGluZyAoZml4ZWQtcG9pbnQgbnVtYmVyKSAqLworICB9OworCitlbnVtCisgIHsKKyAgICBQUk9GX1VTSE9SVAk9IDAsCQkvKiB1c2UgMTYtYml0IGNvdW50ZXJzIChkZWZhdWx0KSAqLworICAgIFBST0ZfVUlOVAk9IDEgPDwgMCwJLyogdXNlIDMyLWJpdCBjb3VudGVycyAqLworICAgIFBST0ZfRkFTVCAgID0gMSA8PCAxCS8qIHByb2ZpbGUgZmFzdGVyIHRoYW4gdXN1YWwgKi8KKyAgfTsKKworCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBpbnQgc3Byb2ZpbCAoc3RydWN0IHByb2YgKl9fcHJvZnAsIGludCBfX3Byb2ZjbnQsCisJCSAgICBzdHJ1Y3QgdGltZXZhbCAqX190dnAsIHVuc2lnbmVkIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogcHJvZmlsLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3B0cmFjZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2NThmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3B0cmFjZS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKiBgcHRyYWNlJyBkZWJ1Z2dlciBzdXBwb3J0IGludGVyZmFjZS4gIExpbnV4IHZlcnNpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSwyMDAwLDIwMDYsMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1BUUkFDRV9ICisjZGVmaW5lIF9TWVNfUFRSQUNFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBUeXBlIG9mIHRoZSBSRVFVRVNUIGFyZ3VtZW50IHRvIGBwdHJhY2UuJyAgKi8KK2VudW0gX19wdHJhY2VfcmVxdWVzdAoreworICAvKiBJbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzIG1ha2luZyB0aGlzIHJlcXVlc3Qgc2hvdWxkIGJlIHRyYWNlZC4KKyAgICAgQWxsIHNpZ25hbHMgcmVjZWl2ZWQgYnkgdGhpcyBwcm9jZXNzIGNhbiBiZSBpbnRlcmNlcHRlZCBieSBpdHMKKyAgICAgcGFyZW50LCBhbmQgaXRzIHBhcmVudCBjYW4gdXNlIHRoZSBvdGhlciBgcHRyYWNlJyByZXF1ZXN0cy4gICovCisgIFBUUkFDRV9UUkFDRU1FID0gMCwKKyNkZWZpbmUgUFRfVFJBQ0VfTUUgUFRSQUNFX1RSQUNFTUUKKworICAvKiBSZXR1cm4gdGhlIHdvcmQgaW4gdGhlIHByb2Nlc3MncyB0ZXh0IHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QRUVLVEVYVCA9IDEsCisjZGVmaW5lIFBUX1JFQURfSSBQVFJBQ0VfUEVFS1RFWFQKKworICAvKiBSZXR1cm4gdGhlIHdvcmQgaW4gdGhlIHByb2Nlc3MncyBkYXRhIHNwYWNlIGF0IGFkZHJlc3MgQUREUi4gICovCisgIFBUUkFDRV9QRUVLREFUQSA9IDIsCisjZGVmaW5lIFBUX1JFQURfRCBQVFJBQ0VfUEVFS0RBVEEKKworICAvKiBSZXR1cm4gdGhlIHdvcmQgaW4gdGhlIHByb2Nlc3MncyB1c2VyIGFyZWEgYXQgb2Zmc2V0IEFERFIuICAqLworICBQVFJBQ0VfUEVFS1VTRVIgPSAzLAorI2RlZmluZSBQVF9SRUFEX1UgUFRSQUNFX1BFRUtVU0VSCisKKyAgLyogV3JpdGUgdGhlIHdvcmQgREFUQSBpbnRvIHRoZSBwcm9jZXNzJ3MgdGV4dCBzcGFjZSBhdCBhZGRyZXNzIEFERFIuICAqLworICBQVFJBQ0VfUE9LRVRFWFQgPSA0LAorI2RlZmluZSBQVF9XUklURV9JIFBUUkFDRV9QT0tFVEVYVAorCisgIC8qIFdyaXRlIHRoZSB3b3JkIERBVEEgaW50byB0aGUgcHJvY2VzcydzIGRhdGEgc3BhY2UgYXQgYWRkcmVzcyBBRERSLiAgKi8KKyAgUFRSQUNFX1BPS0VEQVRBID0gNSwKKyNkZWZpbmUgUFRfV1JJVEVfRCBQVFJBQ0VfUE9LRURBVEEKKworICAvKiBXcml0ZSB0aGUgd29yZCBEQVRBIGludG8gdGhlIHByb2Nlc3MncyB1c2VyIGFyZWEgYXQgb2Zmc2V0IEFERFIuICAqLworICBQVFJBQ0VfUE9LRVVTRVIgPSA2LAorI2RlZmluZSBQVF9XUklURV9VIFBUUkFDRV9QT0tFVVNFUgorCisgIC8qIENvbnRpbnVlIHRoZSBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX0NPTlQgPSA3LAorI2RlZmluZSBQVF9DT05USU5VRSBQVFJBQ0VfQ09OVAorCisgIC8qIEtpbGwgdGhlIHByb2Nlc3MuICAqLworICBQVFJBQ0VfS0lMTCA9IDgsCisjZGVmaW5lIFBUX0tJTEwgUFRSQUNFX0tJTEwKKworICAvKiBTaW5nbGUgc3RlcCB0aGUgcHJvY2Vzcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgIFBUUkFDRV9TSU5HTEVTVEVQID0gOSwKKyNkZWZpbmUgUFRfU1RFUCBQVFJBQ0VfU0lOR0xFU1RFUAorCisgIC8qIEdldCBhbGwgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkIGJ5IGEgcHJvY2Vzc2VzLgorICAgICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgKi8KKyAgIFBUUkFDRV9HRVRSRUdTID0gMTIsCisjZGVmaW5lIFBUX0dFVFJFR1MgUFRSQUNFX0dFVFJFR1MKKworICAvKiBTZXQgYWxsIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfU0VUUkVHUyA9IDEzLAorI2RlZmluZSBQVF9TRVRSRUdTIFBUUkFDRV9TRVRSRUdTCisKKyAgLyogR2V0IGFsbCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfR0VURlBSRUdTID0gMTQsCisjZGVmaW5lIFBUX0dFVEZQUkVHUyBQVFJBQ0VfR0VURlBSRUdTCisKKyAgLyogU2V0IGFsbCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfU0VURlBSRUdTID0gMTUsCisjZGVmaW5lIFBUX1NFVEZQUkVHUyBQVFJBQ0VfU0VURlBSRUdTCisKKyAgLyogQXR0YWNoIHRvIGEgcHJvY2VzcyB0aGF0IGlzIGFscmVhZHkgcnVubmluZy4gKi8KKyAgUFRSQUNFX0FUVEFDSCA9IDE2LAorI2RlZmluZSBQVF9BVFRBQ0ggUFRSQUNFX0FUVEFDSAorCisgIC8qIERldGFjaCBmcm9tIGEgcHJvY2VzcyBhdHRhY2hlZCB0byB3aXRoIFBUUkFDRV9BVFRBQ0guICAqLworICBQVFJBQ0VfREVUQUNIID0gMTcsCisjZGVmaW5lIFBUX0RFVEFDSCBQVFJBQ0VfREVUQUNICisKKyAgLyogR2V0IGFsbCBleHRlbmRlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfR0VURlBYUkVHUyA9IDE4LAorI2RlZmluZSBQVF9HRVRGUFhSRUdTIFBUUkFDRV9HRVRGUFhSRUdTCisKKyAgLyogU2V0IGFsbCBleHRlbmRlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCBieSBhIHByb2Nlc3Nlcy4KKyAgICAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcy4gICovCisgICBQVFJBQ0VfU0VURlBYUkVHUyA9IDE5LAorI2RlZmluZSBQVF9TRVRGUFhSRUdTIFBUUkFDRV9TRVRGUFhSRUdTCisKKyAgLyogQ29udGludWUgYW5kIHN0b3AgYXQgdGhlIG5leHQgKHJldHVybiBmcm9tKSBzeXNjYWxsLiAgKi8KKyAgUFRSQUNFX1NZU0NBTEwgPSAyNCwKKyNkZWZpbmUgUFRfU1lTQ0FMTCBQVFJBQ0VfU1lTQ0FMTAorCisgIC8qIFNldCBwdHJhY2UgZmlsdGVyIG9wdGlvbnMuICAqLworICBQVFJBQ0VfU0VUT1BUSU9OUyA9IDB4NDIwMCwKKyNkZWZpbmUgUFRfU0VUT1BUSU9OUyBQVFJBQ0VfU0VUT1BUSU9OUworCisgIC8qIEdldCBsYXN0IHB0cmFjZSBtZXNzYWdlLiAgKi8KKyAgUFRSQUNFX0dFVEVWRU5UTVNHID0gMHg0MjAxLAorI2RlZmluZSBQVF9HRVRFVkVOVE1TRyBQVFJBQ0VfR0VURVZFTlRNU0cKKworICAvKiBHZXQgc2lnaW5mbyBmb3IgcHJvY2Vzcy4gICovCisgIFBUUkFDRV9HRVRTSUdJTkZPID0gMHg0MjAyLAorI2RlZmluZSBQVF9HRVRTSUdJTkZPIFBUUkFDRV9HRVRTSUdJTkZPCisKKyAgLyogU2V0IG5ldyBzaWdpbmZvIGZvciBwcm9jZXNzLiAgKi8KKyAgUFRSQUNFX1NFVFNJR0lORk8gPSAweDQyMDMKKyNkZWZpbmUgUFRfU0VUU0lHSU5GTyBQVFJBQ0VfU0VUU0lHSU5GTworfTsKKworCisvKiBPcHRpb25zIHNldCB1c2luZyBQVFJBQ0VfU0VUT1BUSU9OUy4gICovCitlbnVtIF9fcHRyYWNlX3NldG9wdGlvbnMgeworICBQVFJBQ0VfT19UUkFDRVNZU0dPT0QJPSAweDAwMDAwMDAxLAorICBQVFJBQ0VfT19UUkFDRUZPUksJPSAweDAwMDAwMDAyLAorICBQVFJBQ0VfT19UUkFDRVZGT1JLICAgPSAweDAwMDAwMDA0LAorICBQVFJBQ0VfT19UUkFDRUNMT05FCT0gMHgwMDAwMDAwOCwKKyAgUFRSQUNFX09fVFJBQ0VFWEVDCT0gMHgwMDAwMDAxMCwKKyAgUFRSQUNFX09fVFJBQ0VWRk9SS0RPTkUgPSAweDAwMDAwMDIwLAorICBQVFJBQ0VfT19UUkFDRUVYSVQJPSAweDAwMDAwMDQwLAorICBQVFJBQ0VfT19NQVNLCQk9IDB4MDAwMDAwN2YKK307CisKKy8qIFdhaXQgZXh0ZW5kZWQgcmVzdWx0IGNvZGVzIGZvciB0aGUgYWJvdmUgdHJhY2Ugb3B0aW9ucy4gICovCitlbnVtIF9fcHRyYWNlX2V2ZW50Y29kZXMgeworICBQVFJBQ0VfRVZFTlRfRk9SSwk9IDEsCisgIFBUUkFDRV9FVkVOVF9WRk9SSwk9IDIsCisgIFBUUkFDRV9FVkVOVF9DTE9ORQk9IDMsCisgIFBUUkFDRV9FVkVOVF9FWEVDCT0gNCwKKyAgUFRSQUNFX0VWRU5UX1ZGT1JLX0RPTkUgPSA1LAorICBQVFJBQ0VfRVZFTlRfRVhJVAk9IDYKK307CisKKy8qIFBlcmZvcm0gcHJvY2VzcyB0cmFjaW5nIGZ1bmN0aW9ucy4gIFJFUVVFU1QgaXMgb25lIG9mIHRoZSB2YWx1ZXMKKyAgIGFib3ZlLCBhbmQgZGV0ZXJtaW5lcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuLgorICAgRm9yIGFsbCByZXF1ZXN0cyBleGNlcHQgUFRSQUNFX1RSQUNFTUUsIFBJRCBzcGVjaWZpZXMgdGhlIHByb2Nlc3MgdG8gYmUKKyAgIHRyYWNlZC4KKworICAgUElEIGFuZCB0aGUgb3RoZXIgYXJndW1lbnRzIGRlc2NyaWJlZCBhYm92ZSBmb3IgdGhlIHZhcmlvdXMgcmVxdWVzdHMgc2hvdWxkCisgICBhcHBlYXIgKHRob3NlIHRoYXQgYXJlIHVzZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIHJlcXVlc3QpIGFzOgorICAgICBwaWRfdCBQSUQsIHZvaWQgKkFERFIsIGludCBEQVRBLCB2b2lkICpBRERSMgorICAgYWZ0ZXIgUkVRVUVTVC4gICovCitleHRlcm4gbG9uZyBpbnQgcHRyYWNlIChlbnVtIF9fcHRyYWNlX3JlcXVlc3QgX19yZXF1ZXN0LCAuLi4pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU1lTX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9xdWV1ZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU2YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcXVldWUuaApAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylxdWV1ZS5oCTguNSAoQmVya2VsZXkpIDgvMjAvOTQKKyAqLworCisjaWZuZGVmCV9TWVNfUVVFVUVfSF8KKyNkZWZpbmUJX1NZU19RVUVVRV9IXworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZml2ZSB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBsaXN0cywgc2ltcGxlIHF1ZXVlcywgdGFpbCBxdWV1ZXMsIGFuZCBjaXJjdWxhciBxdWV1ZXMuCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlCisgKiBlbGVtZW50cyBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24KKyAqIG92ZXJoZWFkIGF0IHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcKKyAqIGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZQorICogaGVhZCBvZiB0aGUgbGlzdC4gIEVsZW1lbnRzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdAorICogc2hvdWxkIHVzZSB0aGUgZXhwbGljaXQgbWFjcm8gZm9yIHRoaXMgcHVycG9zZSBmb3Igb3B0aW11bQorICogZWZmaWNpZW5jeS4gQSBzaW5nbHktbGlua2VkIGxpc3QgbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkCisgKiBkaXJlY3Rpb24uICBTaW5nbHktbGlua2VkIGxpc3RzIGFyZSBpZGVhbCBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UKKyAqIGRhdGFzZXRzIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yIGltcGxlbWVudGluZyBhIExJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHNpbXBsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgc2luZ2x5CisgKiBsaW5rZWQgdG8gc2F2ZSBzcGFjZSwgc28gZWxlbWVudHMgY2FuIG9ubHkgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICogaGVhZCBvZiB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBhZnRlcgorICogYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YgdGhlCisgKiBsaXN0LiBBIHNpbXBsZSBxdWV1ZSBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yCisgKiBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZgorICogdGhlIGxpc3QuIEEgdGFpbCBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24uCisgKgorICogQSBjaXJjbGUgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvciBhZnRlcgorICogYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKiBBIGNpcmNsZSBxdWV1ZSBtYXkgYmUgdHJhdmVyc2VkIGluIGVpdGhlciBkaXJlY3Rpb24sIGJ1dCBoYXMgYSBtb3JlCisgKiBjb21wbGV4IGVuZCBvZiBsaXN0IGRldGVjdGlvbi4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiB0aGUgdXNlIG9mIHRoZXNlIG1hY3Jvcywgc2VlIHRoZSBxdWV1ZSgzKSBtYW51YWwgcGFnZS4KKyAqLworCisvKgorICogTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZQlMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCUxJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCUxJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+bGhfZmlyc3QgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0KSAhPSBOVUxMKQlcCisJCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dC0+ZmllbGQubGVfcHJldiA9CQlcCisJCSAgICAmKGVsbSktPmZpZWxkLmxlX25leHQ7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLmxlX25leHQgPSAoZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dDsJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCUxJU1RfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2OwkJXAorCShlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihlbG0pLT5maWVsZC5sZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGhlYWQpLT5saF9maXJzdCkgIT0gTlVMTCkJCVwKKwkJKGhlYWQpLT5saF9maXJzdC0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDtcCisJKGhlYWQpLT5saF9maXJzdCA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihoZWFkKS0+bGhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJTElTVF9SRU1PVkUoZWxtLCBmaWVsZCkgZG8gewkJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQubGVfbmV4dCAhPSBOVUxMKQkJCQlcCisJCShlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0gCQkJXAorCQkgICAgKGVsbSktPmZpZWxkLmxlX3ByZXY7CQkJCVwKKwkqKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAoZWxtKS0+ZmllbGQubGVfbmV4dDsJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+bGhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5sZV9uZXh0KSkKKworLyoKKyAqIExpc3QgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJTElTVF9FTVBUWShoZWFkKQkJKChoZWFkKS0+bGhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJTElTVF9GSVJTVChoZWFkKQkJKChoZWFkKS0+bGhfZmlyc3QpCisjZGVmaW5lCUxJU1RfTkVYVChlbG0sIGZpZWxkKQkJKChlbG0pLT5maWVsZC5sZV9uZXh0KQorCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCVNMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lCVNMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dDsJCVwKKwkoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChoZWFkKS0+c2xoX2ZpcnN0OwkJCVwKKwkoaGVhZCktPnNsaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGhlYWQpLT5zbGhfZmlyc3QtPmZpZWxkLnNsZV9uZXh0OwkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c2xoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU0xJU1RfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJXAorCX0JCQkJCQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IChoZWFkKS0+c2xoX2ZpcnN0OwkJXAorCQl3aGlsZShjdXJlbG0tPmZpZWxkLnNsZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc2xlX25leHQ7CQlcCisJCWN1cmVsbS0+ZmllbGQuc2xlX25leHQgPQkJCQlcCisJCSAgICBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0LT5maWVsZC5zbGVfbmV4dDsJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCQlcCisJZm9yKCh2YXIpID0gKGhlYWQpLT5zbGhfZmlyc3Q7ICh2YXIpOyAodmFyKSA9ICh2YXIpLT5maWVsZC5zbGVfbmV4dCkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTTElTVF9FTVBUWShoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUJU0xJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0KQorI2RlZmluZQlTTElTVF9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc2xlX25leHQpCisKKworLyoKKyAqIFNpbmdseS1saW5rZWQgVGFpbCBxdWV1ZSBkZWNsYXJhdGlvbnMuCisgKi8KKyNkZWZpbmUJU1RBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3RxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnN0cWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnN0cWhfZmlyc3QgfQorCisjZGVmaW5lCVNUQUlMUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnN0cWVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCShoZWFkKS0+c3RxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGhlYWQpLT5zdHFoX2ZpcnN0OwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5zdHFlX25leHQgPSAoaGVhZCktPnN0cWhfZmlyc3QpID09IE5VTEwpCVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnN0cWVfbmV4dDsJCVwKKwkoaGVhZCktPnN0cWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zdHFlX25leHQgPSBOVUxMOwkJCQkJXAorCSooaGVhZCktPnN0cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3RxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zdHFlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3RxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zdHFlX25leHQpID09IE5VTEwpXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3RxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3RxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoaGVhZCktPnN0cWhfZmlyc3QgPSAoaGVhZCktPnN0cWhfZmlyc3QtPmZpZWxkLnN0cWVfbmV4dCkgPT0gTlVMTCkgXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICYoaGVhZCktPnN0cWhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoaGVhZCktPnN0cWhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAorCQlTVEFJTFFfUkVNT1ZFX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJc3RydWN0IHR5cGUgKmN1cmVsbSA9IChoZWFkKS0+c3RxaF9maXJzdDsJCVwKKwkJd2hpbGUgKGN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0OwkJXAorCQlpZiAoKGN1cmVsbS0+ZmllbGQuc3RxZV9uZXh0ID0JCQkJXAorCQkJY3VyZWxtLT5maWVsZC5zdHFlX25leHQtPmZpZWxkLnN0cWVfbmV4dCkgPT0gTlVMTCkgXAorCQkJICAgIChoZWFkKS0+c3RxaF9sYXN0ID0gJihjdXJlbG0pLT5maWVsZC5zdHFlX25leHQ7IFwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yICgodmFyKSA9ICgoaGVhZCktPnN0cWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5zdHFlX25leHQpKQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCVNUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0KQorI2RlZmluZQlTVEFJTFFfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCkKKworCisvKgorICogU2ltcGxlIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCVNJTVBMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipzcWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNJTVBMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS5zcWhfZmlyc3QgfQorCisjZGVmaW5lCVNJTVBMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWVfbmV4dDsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2ltcGxlIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGhlYWQpLT5zcWhfZmlyc3QpID09IE5VTEwpCVwKKwkJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQlcCisJKGhlYWQpLT5zcWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc3FlX25leHQgPSBOVUxMOwkJCQkJXAorCSooaGVhZCktPnNxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJU0lNUExFUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoaGVhZCktPnNxaF9maXJzdCA9IChoZWFkKS0+c3FoX2ZpcnN0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVNJTVBMRVFfUkVNT1ZFKGhlYWQsIGVsbSwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKChoZWFkKS0+c3FoX2ZpcnN0ID09IChlbG0pKSB7CQkJCVwKKwkJU0lNUExFUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zcWhfZmlyc3Q7CQlcCisJCXdoaWxlIChjdXJlbG0tPmZpZWxkLnNxZV9uZXh0ICE9IChlbG0pKQkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc3FlX25leHQ7CQlcCisJCWlmICgoY3VyZWxtLT5maWVsZC5zcWVfbmV4dCA9CQkJCVwKKwkJCWN1cmVsbS0+ZmllbGQuc3FlX25leHQtPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKSBcCisJCQkgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoY3VyZWxtKS0+ZmllbGQuc3FlX25leHQ7IFwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlTSU1QTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5zcWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC5zcWVfbmV4dCkpCisKKy8qCisgKiBTaW1wbGUgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJU0lNUExFUV9FTVBUWShoZWFkKQkJKChoZWFkKS0+c3FoX2ZpcnN0ID09IE5VTEwpCisjZGVmaW5lCVNJTVBMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnNxaF9maXJzdCkKKyNkZWZpbmUJU0lNUExFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc3FlX25leHQpCisKKworLyoKKyAqIFRhaWwgcXVldWUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUJX1RBSUxRX0hFQUQobmFtZSwgdHlwZSwgcXVhbCkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlxdWFsIHR5cGUgKnRxaF9maXJzdDsJCS8qIGZpcnN0IGVsZW1lbnQgKi8JCVwKKwlxdWFsIHR5cGUgKnF1YWwgKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCVwKK30KKyNkZWZpbmUgVEFJTFFfSEVBRChuYW1lLCB0eXBlKQlfVEFJTFFfSEVBRChuYW1lLCBzdHJ1Y3QgdHlwZSwpCisKKyNkZWZpbmUJVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lCV9UQUlMUV9FTlRSWSh0eXBlLCBxdWFsKQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlxdWFsIHR5cGUgKnRxZV9uZXh0OwkJLyogbmV4dCBlbGVtZW50ICovCQlcCisJcXVhbCB0eXBlICpxdWFsICp0cWVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi9cCit9CisjZGVmaW5lIFRBSUxRX0VOVFJZKHR5cGUpCV9UQUlMUV9FTlRSWShzdHJ1Y3QgdHlwZSwpCisKKy8qCisgKiBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT50cWhfZmlyc3QgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGhlYWQpLT50cWhfZmlyc3Q7CQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAoaGVhZCktPnRxaF9maXJzdCkgIT0gTlVMTCkJXAorCQkoaGVhZCktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPQkJCVwKKwkJICAgICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorCShoZWFkKS0+dHFoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihoZWFkKS0+dHFoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZCktPnRxaF9sYXN0OwkJCVwKKwkqKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9IAkJXAorCQkgICAgJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dCA9IChlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldjsJCVwKKwkoZWxtKS0+ZmllbGQudHFlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkqKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9IAkJXAorCQkgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCSooZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT50cWhfZmlyc3QpOwkJCQlcCisJCSh2YXIpOwkJCQkJCQlcCisJCSh2YXIpID0gKCh2YXIpLT5maWVsZC50cWVfbmV4dCkpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvciAoKHZhcikgPSAoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoaGVhZCktPnRxaF9sYXN0KSktPnRxaF9sYXN0KSk7CVwKKwkJKHZhcik7CQkJCQkJCVwKKwkJKHZhcikgPSAoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgodmFyKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKSkKKworLyoKKyAqIFRhaWwgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUJVEFJTFFfRU1QVFkoaGVhZCkJCSgoaGVhZCktPnRxaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+dHFoX2ZpcnN0KQorI2RlZmluZQlUQUlMUV9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLnRxZV9uZXh0KQorCisjZGVmaW5lCVRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpIFwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoaGVhZCktPnRxaF9sYXN0KSktPnRxaF9sYXN0KSkKKyNkZWZpbmUJVEFJTFFfUFJFVihlbG0sIGhlYWRuYW1lLCBmaWVsZCkgXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChlbG0pLT5maWVsZC50cWVfcHJldikpLT50cWhfbGFzdCkpCisKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCUNJUkNMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpjcWhfZmlyc3Q7CQkvKiBmaXJzdCBlbGVtZW50ICovCQlcCisJc3RydWN0IHR5cGUgKmNxaF9sYXN0OwkJLyogbGFzdCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUJQ0lSQ0xFUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyAodm9pZCAqKSZoZWFkLCAodm9pZCAqKSZoZWFkIH0KKworI2RlZmluZQlDSVJDTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX25leHQ7CQkvKiBuZXh0IGVsZW1lbnQgKi8JCVwKKwlzdHJ1Y3QgdHlwZSAqY3FlX3ByZXY7CQkvKiBwcmV2aW91cyBlbGVtZW50ICovCQlcCit9CisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJKGhlYWQpLT5jcWhfZmlyc3QgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorCShoZWFkKS0+Y3FoX2xhc3QgPSAodm9pZCAqKShoZWFkKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQ7CQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGxpc3RlbG0pOwkJCQlcCisJaWYgKChsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQgPT0gKHZvaWQgKikoaGVhZCkpCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJXAorCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2OwkJXAorCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2ID09ICh2b2lkICopKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwlcCisJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGhlYWQpLT5jcWhfZmlyc3Q7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9ICh2b2lkICopKGhlYWQpOwkJCQlcCisJaWYgKChoZWFkKS0+Y3FoX2xhc3QgPT0gKHZvaWQgKikoaGVhZCkpCQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9ICh2b2lkICopKGhlYWQpOwkJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGhlYWQpLT5jcWhfbGFzdDsJCQlcCisJaWYgKChoZWFkKS0+Y3FoX2ZpcnN0ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfZmlyc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdC0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJCVwKKwkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZQlDSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfcHJldjsJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUJQ0lSQ0xFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IgKCh2YXIpID0gKChoZWFkKS0+Y3FoX2ZpcnN0KTsJCQkJXAorCQkodmFyKSAhPSAoY29uc3Qgdm9pZCAqKShoZWFkKTsJCQkJXAorCQkodmFyKSA9ICgodmFyKS0+ZmllbGQuY3FlX25leHQpKQorCisjZGVmaW5lCUNJUkNMRVFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcikgPSAoKGhlYWQpLT5jcWhfbGFzdCk7CQkJCVwKKwkJKHZhcikgIT0gKGNvbnN0IHZvaWQgKikoaGVhZCk7CQkJCVwKKwkJKHZhcikgPSAoKHZhciktPmZpZWxkLmNxZV9wcmV2KSkKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lCUNJUkNMRVFfRU1QVFkoaGVhZCkJCSgoaGVhZCktPmNxaF9maXJzdCA9PSAodm9pZCAqKShoZWFkKSkKKyNkZWZpbmUJQ0lSQ0xFUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+Y3FoX2ZpcnN0KQorI2RlZmluZQlDSVJDTEVRX0xBU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9sYXN0KQorI2RlZmluZQlDSVJDTEVRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfbmV4dCkKKyNkZWZpbmUJQ0lSQ0xFUV9QUkVWKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX3ByZXYpCisKKyNkZWZpbmUgQ0lSQ0xFUV9MT09QX05FWFQoaGVhZCwgZWxtLCBmaWVsZCkJCQkJXAorCSgoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09ICh2b2lkICopKGhlYWQpKQkJCVwKKwkgICAgPyAoKGhlYWQpLT5jcWhfZmlyc3QpCQkJCQlcCisJICAgIDogKGVsbS0+ZmllbGQuY3FlX25leHQpKQorI2RlZmluZSBDSVJDTEVRX0xPT1BfUFJFVihoZWFkLCBlbG0sIGZpZWxkKQkJCQlcCisJKCgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gKHZvaWQgKikoaGVhZCkpCQkJXAorCSAgICA/ICgoaGVhZCktPmNxaF9sYXN0KQkJCQkJXAorCSAgICA6IChlbG0tPmZpZWxkLmNxZV9wcmV2KSkKKworI2VuZGlmCS8qIHN5cy9xdWV1ZS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9xdW90YS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWEwZWMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcXVvdGEuaApAQCAtMCwwICsxLDIyNSBAQAorLyogVGhpcyBqdXN0IHJlcHJlc2VudHMgdGhlIG5vbi1rZXJuZWwgcGFydHMgb2YgPGxpbnV4L3F1b3RhLmg+LgorICoKKyAqIGhlcmUncyB0aGUgY29ycmVzcG9uZGluZyBjb3B5cmlnaHQ6CisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBSb2JlcnQgRWx6IGF0IFRoZSBVbml2ZXJzaXR5IG9mIE1lbGJvdXJuZS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfU1lTX1FVT1RBX0gKKyNkZWZpbmUgX1NZU19RVU9UQV9IIDEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qCisgKiBTZWxlY3QgYmV0d2VlbiBkaWZmZXJlbnQgaW5jb21wYXRpYmxlIHF1b3RhIHZlcnNpb25zLgorICogRGVmYXVsdCB0byB0aGUgdmVyc2lvbiB1c2VkIGJ5IExpbnV4IGtlcm5lbCB2ZXJzaW9uIDIuNC4yMgorICogb3IgbGF0ZXIuICAqLworI2lmbmRlZiBfTElOVVhfUVVPVEFfVkVSU0lPTgorIyBkZWZpbmUgX0xJTlVYX1FVT1RBX1ZFUlNJT04gMgorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGRpc2tibG9ja3MgdG8gYmxvY2tzIGFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAqIGN1cnJlbnRseSBvbmx5IHRvIGZvb2wgdGhlIEJTRCBzb3VyY2UuIDotKQorICovCisjZGVmaW5lIGRidG9iKG51bSkgKChudW0pIDw8IDEwKQorI2RlZmluZSBidG9kYihudW0pICgobnVtKSA+PiAxMCkKKworLyoKKyAqIENvbnZlcnQgY291bnQgb2YgZmlsZXN5c3RlbSBibG9ja3MgdG8gZGlza3F1b3RhIGJsb2NrcywgbWVhbnQKKyAqIGZvciBmaWxlc3lzdGVtcyB3aGVyZSBpX2Jsa3NpemUgIT0gQkxPQ0tfU0laRQorICovCisjZGVmaW5lIGZzX3RvX2RxX2Jsb2NrcyhudW0sIGJsa3NpemUpICgoKG51bSkgKiAoYmxrc2l6ZSkpIC8gQkxPQ0tfU0laRSkKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBkaXNrIHF1b3RhcyBpbXBvc2VkIG9uIHRoZSBhdmVyYWdlIHVzZXIKKyAqIChiaWcgYnJvdGhlciBmaW5hbGx5IGhpdHMgTGludXgpLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGRlZmluZSB0aGUgYW1vdW50IG9mIHRpbWUgZ2l2ZW4gYSB1c2VyCisgKiBiZWZvcmUgdGhlIHNvZnQgbGltaXRzIGFyZSB0cmVhdGVkIGFzIGhhcmQgbGltaXRzICh1c3VhbGx5IHJlc3VsdGluZworICogaW4gYW4gYWxsb2NhdGlvbiBmYWlsdXJlKS4gVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgd2hlbiB0aGUgdXNlciBjcm9zc2VzCisgKiB0aGVpciBzb2Z0IGxpbWl0LCBpdCBpcyByZXNldCB3aGVuIHRoZXkgZ28gYmVsb3cgdGhlaXIgc29mdCBsaW1pdC4KKyAqLworI2RlZmluZSBNQVhfSVFfVElNRSAgNjA0ODAwCS8qICg3KjI0KjYwKjYwKSAxIHdlZWsgKi8KKyNkZWZpbmUgTUFYX0RRX1RJTUUgIDYwNDgwMAkvKiAoNyoyNCo2MCo2MCkgMSB3ZWVrICovCisKKyNkZWZpbmUgTUFYUVVPVEFTIDIKKyNkZWZpbmUgVVNSUVVPVEEgIDAJCS8qIGVsZW1lbnQgdXNlZCBmb3IgdXNlciBxdW90YXMgKi8KKyNkZWZpbmUgR1JQUVVPVEEgIDEJCS8qIGVsZW1lbnQgdXNlZCBmb3IgZ3JvdXAgcXVvdGFzICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbmFtZXMgb2YgdGhlIHF1b3RhcyBmaWxlcy4KKyAqLworI2RlZmluZSBJTklUUUZOQU1FUyB7IFwKKyAgICJ1c2VyIiwgICAgICAvKiBVU1JRVU9UQSAqLyBcCisgICAiZ3JvdXAiLCAgIC8qIEdSUFFVT1RBICovIFwKKyAgICJ1bmRlZmluZWQiLCBcCit9OworCisjZGVmaW5lIFFVT1RBRklMRU5BTUUgInF1b3RhIgorI2RlZmluZSBRVU9UQUdST1VQICJzdGFmZiIKKworI2RlZmluZSBOUl9EUUhBU0ggNDMgICAgICAgICAgLyogSnVzdCBhbiBhcmJpdHJhcnkgbnVtYmVyIGFueSBzdWdnZXN0aW9ucyA/ICovCisjZGVmaW5lIE5SX0RRVU9UUyAyNTYgICAgICAgICAvKiBOdW1iZXIgb2YgcXVvdGFzIGFjdGl2ZSBhdCBvbmUgdGltZSAqLworCisvKgorICogQ29tbWFuZCBkZWZpbml0aW9ucyBmb3IgdGhlICdxdW90YWN0bCcgc3lzdGVtIGNhbGwuCisgKiBUaGUgY29tbWFuZHMgYXJlIGJyb2tlbiBpbnRvIGEgbWFpbiBjb21tYW5kIGRlZmluZWQgYmVsb3cKKyAqIGFuZCBhIHN1YmNvbW1hbmQgdGhhdCBpcyB1c2VkIHRvIGNvbnZleSB0aGUgdHlwZSBvZgorICogcXVvdGEgdGhhdCBpcyBiZWluZyBtYW5pcHVsYXRlZCAoc2VlIGFib3ZlKS4KKyAqLworI2RlZmluZSBTVUJDTURNQVNLICAweDAwZmYKKyNkZWZpbmUgU1VCQ01EU0hJRlQgOAorI2RlZmluZSBRQ01EKGNtZCwgdHlwZSkgICgoKGNtZCkgPDwgU1VCQ01EU0hJRlQpIHwgKCh0eXBlKSAmIFNVQkNNRE1BU0spKQorCisjaWYgX0xJTlVYX1FVT1RBX1ZFUlNJT04gPCAyCisjIGRlZmluZSBRX1FVT1RBT04gIDB4MDEwMAkvKiBlbmFibGUgcXVvdGFzICovCisjIGRlZmluZSBRX1FVT1RBT0ZGIDB4MDIwMAkvKiBkaXNhYmxlIHF1b3RhcyAqLworIyBkZWZpbmUgUV9HRVRRVU9UQSAweDAzMDAJLyogZ2V0IGxpbWl0cyBhbmQgdXNhZ2UgKi8KKyMgZGVmaW5lIFFfU0VUUVVPVEEgMHgwNDAwCS8qIHNldCBsaW1pdHMgYW5kIHVzYWdlICovCisjIGRlZmluZSBRX1NFVFVTRSAgIDB4MDUwMAkvKiBzZXQgdXNhZ2UgKi8KKyMgZGVmaW5lIFFfU1lOQyAgICAgMHgwNjAwCS8qIHN5bmMgZGlzayBjb3B5IG9mIGEgZmlsZXN5c3RlbXMgcXVvdGFzICovCisjIGRlZmluZSBRX1NFVFFMSU0gIDB4MDcwMAkvKiBzZXQgbGltaXRzICovCisjIGRlZmluZSBRX0dFVFNUQVRTIDB4MDgwMAkvKiBnZXQgY29sbGVjdGVkIHN0YXRzICovCisjIGRlZmluZSBRX1JTUVVBU0ggIDB4MTAwMAkvKiBzZXQgcm9vdF9zcXVhc2ggb3B0aW9uICovCisjZWxzZQorIyBkZWZpbmUgUV9TWU5DICAgICAweDgwMDAwMQkvKiBzeW5jIGRpc2sgY29weSBvZiBhIGZpbGVzeXN0ZW1zIHF1b3RhcyAqLworIyBkZWZpbmUgUV9RVU9UQU9OICAweDgwMDAwMgkvKiB0dXJuIHF1b3RhcyBvbiAqLworIyBkZWZpbmUgUV9RVU9UQU9GRiAweDgwMDAwMwkvKiB0dXJuIHF1b3RhcyBvZmYgKi8KKyMgZGVmaW5lIFFfR0VURk1UICAgMHg4MDAwMDQJLyogZ2V0IHF1b3RhIGZvcm1hdCB1c2VkIG9uIGdpdmVuIGZpbGVzeXN0ZW0gKi8KKyMgZGVmaW5lIFFfR0VUSU5GTyAgMHg4MDAwMDUJLyogZ2V0IGluZm9ybWF0aW9uIGFib3V0IHF1b3RhIGZpbGVzICovCisjIGRlZmluZSBRX1NFVElORk8gIDB4ODAwMDA2CS8qIHNldCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YSBmaWxlcyAqLworIyBkZWZpbmUgUV9HRVRRVU9UQSAweDgwMDAwNwkvKiBnZXQgdXNlciBxdW90YSBzdHJ1Y3R1cmUgKi8KKyMgZGVmaW5lIFFfU0VUUVVPVEEgMHg4MDAwMDgJLyogc2V0IHVzZXIgcXVvdGEgc3RydWN0dXJlICovCisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGlzayBxdW90YSBmaWxlCisgKiAoYXMgaXQgYXBwZWFycyBvbiBkaXNrKSAtIHRoZSBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMKKyAqIGluZGV4ZWQgYnkgdXNlciBvciBncm91cCBudW1iZXIuCisgKi8KKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKK3N0cnVjdCBkcWJsaworICB7CisgICAgdV9pbnQzMl90IGRxYl9iaGFyZGxpbWl0OwkvKiBhYnNvbHV0ZSBsaW1pdCBvbiBkaXNrIGJsa3MgYWxsb2MgKi8KKyAgICB1X2ludDMyX3QgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKyAgICB1X2ludDMyX3QgZHFiX2N1cmJsb2NrczsJLyogY3VycmVudCBibG9jayBjb3VudCAqLworICAgIHVfaW50MzJfdCBkcWJfaWhhcmRsaW1pdDsJLyogbWF4aW11bSAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB1X2ludDMyX3QgZHFiX2lzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLworICAgIHVfaW50MzJfdCBkcWJfY3VyaW5vZGVzOwkvKiBjdXJyZW50ICMgYWxsb2NhdGVkIGlub2RlcyAqLworICAgIHRpbWVfdCBkcWJfYnRpbWU7CQkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKyAgICB0aW1lX3QgZHFiX2l0aW1lOwkJLyogdGltZSBsaW1pdCBmb3IgZXhjZXNzaXZlIGZpbGVzICovCisgIH07CisjZWxzZQorCisvKiBGbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIGZpZWxkcyBpbiBkcWJsayBzdHJ1Y3R1cmUgYXJlIHZhbGlkLiAgKi8KKyNkZWZpbmUgUUlGX0JMSU1JVFMJMQorI2RlZmluZSBRSUZfU1BBQ0UJMgorI2RlZmluZSBRSUZfSUxJTUlUUwk0CisjZGVmaW5lIFFJRl9JTk9ERVMJOAorI2RlZmluZSBRSUZfQlRJTUUJMTYKKyNkZWZpbmUgUUlGX0lUSU1FCTMyCisjZGVmaW5lIFFJRl9MSU1JVFMJKFFJRl9CTElNSVRTIHwgUUlGX0lMSU1JVFMpCisjZGVmaW5lIFFJRl9VU0FHRQkoUUlGX1NQQUNFIHwgUUlGX0lOT0RFUykKKyNkZWZpbmUgUUlGX1RJTUVTCShRSUZfQlRJTUUgfCBRSUZfSVRJTUUpCisjZGVmaW5lIFFJRl9BTEwJCShRSUZfTElNSVRTIHwgUUlGX1VTQUdFIHwgUUlGX1RJTUVTKQorCitzdHJ1Y3QgZHFibGsKKyAgeworICAgIHVfaW50NjRfdCBkcWJfYmhhcmRsaW1pdDsJLyogYWJzb2x1dGUgbGltaXQgb24gZGlzayBxdW90YSBibG9ja3MgYWxsb2MgKi8KKyAgICB1X2ludDY0X3QgZHFiX2Jzb2Z0bGltaXQ7CS8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIHF1b3RhIGJsb2NrcyAqLworICAgIHVfaW50NjRfdCBkcWJfY3Vyc3BhY2U7CS8qIGN1cnJlbnQgcXVvdGEgYmxvY2sgY291bnQgKi8KKyAgICB1X2ludDY0X3QgZHFiX2loYXJkbGltaXQ7CS8qIG1heGltdW0gIyBhbGxvY2F0ZWQgaW5vZGVzICovCisgICAgdV9pbnQ2NF90IGRxYl9pc29mdGxpbWl0OwkvKiBwcmVmZXJyZWQgaW5vZGUgbGltaXQgKi8KKyAgICB1X2ludDY0X3QgZHFiX2N1cmlub2RlczsJLyogY3VycmVudCAjIGFsbG9jYXRlZCBpbm9kZXMgKi8KKyAgICB1X2ludDY0X3QgZHFiX2J0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZGlzayB1c2UgKi8KKyAgICB1X2ludDY0X3QgZHFiX2l0aW1lOwkvKiB0aW1lIGxpbWl0IGZvciBleGNlc3NpdmUgZmlsZXMgKi8KKyAgICB1X2ludDMyX3QgZHFiX3ZhbGlkOwkvKiBiaXRtYXNrIG9mIFFJRl8qIGNvbnN0YW50cyAqLworICB9OworI2VuZGlmCisKKy8qCisgKiBTaG9ydGhhbmQgbm90YXRpb24uCisgKi8KKyNkZWZpbmUJZHFfYmhhcmRsaW1pdAlkcV9kcWIuZHFiX2JoYXJkbGltaXQKKyNkZWZpbmUJZHFfYnNvZnRsaW1pdAlkcV9kcWIuZHFiX2Jzb2Z0bGltaXQKKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKKyMgZGVmaW5lIGRxX2N1cmJsb2NrcwlkcV9kcWIuZHFiX2N1cmJsb2NrcworI2Vsc2UKKyMgZGVmaW5lIGRxX2N1cnNwYWNlCWRxX2RxYi5kcWJfY3Vyc3BhY2UKKyMgZGVmaW5lIGRxX3ZhbGlkCWRxX2RxYi5kcWJfdmFsaWQKKyNlbmRpZgorI2RlZmluZQlkcV9paGFyZGxpbWl0CWRxX2RxYi5kcWJfaWhhcmRsaW1pdAorI2RlZmluZQlkcV9pc29mdGxpbWl0CWRxX2RxYi5kcWJfaXNvZnRsaW1pdAorI2RlZmluZQlkcV9jdXJpbm9kZXMJZHFfZHFiLmRxYl9jdXJpbm9kZXMKKyNkZWZpbmUJZHFfYnRpbWUJZHFfZHFiLmRxYl9idGltZQorI2RlZmluZQlkcV9pdGltZQlkcV9kcWIuZHFiX2l0aW1lCisKKyNkZWZpbmUgZHFvZmYoVUlEKSAgICAgICgobG9mZl90KSgoVUlEKSAqIHNpemVvZiAoc3RydWN0IGRxYmxrKSkpCisKKyNpZiBfTElOVVhfUVVPVEFfVkVSU0lPTiA8IDIKK3N0cnVjdCBkcXN0YXRzCisgIHsKKyAgICB1X2ludDMyX3QgbG9va3VwczsKKyAgICB1X2ludDMyX3QgZHJvcHM7CisgICAgdV9pbnQzMl90IHJlYWRzOworICAgIHVfaW50MzJfdCB3cml0ZXM7CisgICAgdV9pbnQzMl90IGNhY2hlX2hpdHM7CisgICAgdV9pbnQzMl90IHBhZ2VzX2FsbG9jYXRlZDsKKyAgICB1X2ludDMyX3QgYWxsb2NhdGVkX2RxdW90czsKKyAgICB1X2ludDMyX3QgZnJlZV9kcXVvdHM7CisgICAgdV9pbnQzMl90IHN5bmNzOworICB9OworI2Vsc2UKKworLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgaW4gZHFpbmZvIHN0cnVjdHVyZSBhcmUgdmFsaWQuICAqLworIyBkZWZpbmUgSUlGX0JHUkFDRQkxCisjIGRlZmluZSBJSUZfSUdSQUNFCTIKKyMgZGVmaW5lIElJRl9GTEFHUwk0CisjIGRlZmluZSBJSUZfQUxMCShJSUZfQkdSQUNFIHwgSUlGX0lHUkFDRSB8IElJRl9GTEFHUykKKworc3RydWN0IGRxaW5mbworICB7CisgICAgdV9pbnQ2NF90IGRxaV9iZ3JhY2U7CisgICAgdV9pbnQ2NF90IGRxaV9pZ3JhY2U7CisgICAgdV9pbnQzMl90IGRxaV9mbGFnczsKKyAgICB1X2ludDMyX3QgZHFpX3ZhbGlkOworICB9OworI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCBxdW90YWN0bCAoaW50IF9fY21kLCBjb25zdCBjaGFyICpfX3NwZWNpYWwsIGludCBfX2lkLAorCQkgICAgIGNhZGRyX3QgX19hZGRyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3F1b3RhLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Jhdy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvcmF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyZjc4YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Jhdy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1JBV19ICisjZGVmaW5lIF9TWVNfUkFXX0gJMQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKy8qIFRoZSBtYWpvciBkZXZpY2UgbnVtYmVyIGZvciByYXcgZGV2aWNlcy4gICovCisjZGVmaW5lIFJBV19NQUpPUgkxNjIKKworLyogYGlvY3RsJyBjb21tYW5kcyBmb3IgcmF3IGRldmljZXMuICAqLworI2RlZmluZSBSQVdfU0VUQklORCAgICAgX0lPKDB4YWMsIDApCisjZGVmaW5lIFJBV19HRVRCSU5EICAgICBfSU8oMHhhYywgMSkKKworc3RydWN0IHJhd19jb25maWdfcmVxdWVzdAoreworICBpbnQgcmF3X21pbm9yOworICB1aW50NjRfdCBibG9ja19tYWpvcjsKKyAgdWludDY0X3QgYmxvY2tfbWlub3I7Cit9OworCisjZW5kaWYgLyogc3lzL3Jhdy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9yZWJvb3QuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3JlYm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzE5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9yZWJvb3QuaApAQCAtMCwwICsxLDQ5IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIFJCXyogbWFjcm9zIHRvIGJlIHVzZWQgYXMgZmxhZworICAgYml0cyBpbiB0aGUgYXJndW1lbnQgdG8gdGhlIGByZWJvb3QnIHN5c3RlbSBjYWxsLiAgKi8KKworI2lmbmRlZiBfU1lTX1JFQk9PVF9ICisjZGVmaW5lIF9TWVNfUkVCT09UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogUGVyZm9ybSBhIGhhcmQgcmVzZXQgbm93LiAgKi8KKyNkZWZpbmUgUkJfQVVUT0JPT1QJMHgwMTIzNDU2NworCisvKiBIYWx0IHRoZSBzeXN0ZW0uICAqLworI2RlZmluZSBSQl9IQUxUX1NZU1RFTQkweGNkZWYwMTIzCisKKy8qIEVuYWJsZSByZWJvb3QgdXNpbmcgQ3RybC1BbHQtRGVsZXRlIGtleXN0cm9rZS4gICovCisjZGVmaW5lIFJCX0VOQUJMRV9DQUQJMHg4OWFiY2RlZgorCisvKiBEaXNhYmxlIHJlYm9vdCB1c2luZyBDdHJsLUFsdC1EZWxldGUga2V5c3Ryb2tlLiAgKi8KKyNkZWZpbmUgUkJfRElTQUJMRV9DQUQJMAorCisvKiBTdG9wIHN5c3RlbSBhbmQgc3dpdGNoIHBvd2VyIG9mZiBpZiBwb3NzaWJsZS4gICovCisjZGVmaW5lIFJCX1BPV0VSX09GRgkweDQzMjFmZWRjCisKK19fQkVHSU5fREVDTFMKKworLyogUmVib290IG9yIGhhbHQgdGhlIHN5c3RlbS4gICovCitleHRlcm4gaW50IHJlYm9vdCAoaW50IF9faG93dG8pIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfU1lTX1JFQk9PVF9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9yZWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjcxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9yZWcuaApAQCAtMCwwICsxLDc5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19SRUdfSAorI2RlZmluZSBfU1lTX1JFR19ICTEKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisKKworI2lmIF9fV09SRFNJWkUgPT0gNjQKKy8qIEluZGV4IGludG8gYW4gYXJyYXkgb2YgOCBieXRlIGxvbmdzIHJldHVybmVkIGZyb20gcHRyYWNlIGZvcgorICAgbG9jYXRpb24gb2YgdGhlIHVzZXJzJyBzdG9yZWQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4gICovCisKKyMgZGVmaW5lIFIxNQkwCisjIGRlZmluZSBSMTQJMQorIyBkZWZpbmUgUjEzCTIKKyMgZGVmaW5lIFIxMgkzCisjIGRlZmluZSBSQlAJNAorIyBkZWZpbmUgUkJYCTUKKyMgZGVmaW5lIFIxMQk2CisjIGRlZmluZSBSMTAJNworIyBkZWZpbmUgUjkJOAorIyBkZWZpbmUgUjgJOQorIyBkZWZpbmUgUkFYCTEwCisjIGRlZmluZSBSQ1gJMTEKKyMgZGVmaW5lIFJEWAkxMgorIyBkZWZpbmUgUlNJCTEzCisjIGRlZmluZSBSREkJMTQKKyMgZGVmaW5lIE9SSUdfUkFYIDE1CisjIGRlZmluZSBSSVAJMTYKKyMgZGVmaW5lIENTCTE3CisjIGRlZmluZSBFRkxBR1MJMTgKKyMgZGVmaW5lIFJTUAkxOQorIyBkZWZpbmUgU1MJMjAKKyMgZGVmaW5lIEZTX0JBU0UgMjEKKyMgZGVmaW5lIEdTX0JBU0UgMjIKKyMgZGVmaW5lIERTCTIzCisjIGRlZmluZSBFUwkyNAorIyBkZWZpbmUgRlMJMjUKKyMgZGVmaW5lIEdTCTI2CisjZWxzZQorCisvKiBJbmRleCBpbnRvIGFuIGFycmF5IG9mIDQgYnl0ZSBpbnRlZ2VycyByZXR1cm5lZCBmcm9tIHB0cmFjZSBmb3IKKyAqIGxvY2F0aW9uIG9mIHRoZSB1c2Vycycgc3RvcmVkIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMuICovCisKKyMgZGVmaW5lIEVCWCAwCisjIGRlZmluZSBFQ1ggMQorIyBkZWZpbmUgRURYIDIKKyMgZGVmaW5lIEVTSSAzCisjIGRlZmluZSBFREkgNAorIyBkZWZpbmUgRUJQIDUKKyMgZGVmaW5lIEVBWCA2CisjIGRlZmluZSBEUyA3CisjIGRlZmluZSBFUyA4CisjIGRlZmluZSBGUyA5CisjIGRlZmluZSBHUyAxMAorIyBkZWZpbmUgT1JJR19FQVggMTEKKyMgZGVmaW5lIEVJUCAxMgorIyBkZWZpbmUgQ1MgIDEzCisjIGRlZmluZSBFRkwgMTQKKyMgZGVmaW5lIFVFU1AgMTUKKyMgZGVmaW5lIFNTICAgMTYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Jlc291cmNlLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTI3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTIsOTQsMTk5Ni0yMDAwLDIwMDIsMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1JFU09VUkNFX0gKKyNkZWZpbmUJX1NZU19SRVNPVVJDRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWZpbml0aW9ucyBvZiBzdHJ1Y3R1cmVzIGFuZCBiaXQgdmFsdWVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Jlc291cmNlLmg+CisKKyNpZm5kZWYgX19pZF90X2RlZmluZWQKK3R5cGVkZWYgX19pZF90IGlkX3Q7CisjIGRlZmluZSBfX2lkX3RfZGVmaW5lZAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIFgvT3BlbiBzdGFuZGFyZCBkZWZpbmVzIHRoYXQgYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3cgbXVzdCB1c2UKKyAgIGBpbnQnIGFzIHRoZSB0eXBlIGZvciB0aGUgZmlyc3QgYXJndW1lbnQuICBXaGVuIHdlIGFyZSBjb21waWxpbmcgd2l0aAorICAgR05VIGV4dGVuc2lvbnMgd2UgY2hhbmdlIHRoaXMgc2xpZ2h0bHkgdG8gcHJvdmlkZSBiZXR0ZXIgZXJyb3IKKyAgIGNoZWNraW5nLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX0dOVSAmJiAhZGVmaW5lZCBfX2NwbHVzcGx1cwordHlwZWRlZiBlbnVtIF9fcmxpbWl0X3Jlc291cmNlIF9fcmxpbWl0X3Jlc291cmNlX3Q7Cit0eXBlZGVmIGVudW0gX19ydXNhZ2Vfd2hvIF9fcnVzYWdlX3dob190OwordHlwZWRlZiBlbnVtIF9fcHJpb3JpdHlfd2hpY2ggX19wcmlvcml0eV93aGljaF90OworI2Vsc2UKK3R5cGVkZWYgaW50IF9fcmxpbWl0X3Jlc291cmNlX3Q7Cit0eXBlZGVmIGludCBfX3J1c2FnZV93aG9fdDsKK3R5cGVkZWYgaW50IF9fcHJpb3JpdHlfd2hpY2hfdDsKKyNlbmRpZgorCisvKiBQdXQgdGhlIHNvZnQgYW5kIGhhcmQgbGltaXRzIGZvciBSRVNPVVJDRSBpbiAqUkxJTUlUUy4KKyAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QgKGFuZCBzZXRzIGVycm5vKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZ2V0cmxpbWl0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCSAgICAgIHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChnZXRybGltaXQsIChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCQkJICAgICAgIHN0cnVjdCBybGltaXQgKl9fcmxpbWl0cyksIGdldHJsaW1pdDY0KTsKKyMgZWxzZQorIyAgZGVmaW5lIGdldHJsaW1pdCBnZXRybGltaXQ2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZ2V0cmxpbWl0NjQgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCXN0cnVjdCBybGltaXQ2NCAqX19ybGltaXRzKSBfX1RIUk9XOworI2VuZGlmCisKKy8qIFNldCB0aGUgc29mdCBhbmQgaGFyZCBsaW1pdHMgZm9yIFJFU09VUkNFIHRvICpSTElNSVRTLgorICAgT25seSB0aGUgc3VwZXItdXNlciBjYW4gaW5jcmVhc2UgaGFyZCBsaW1pdHMuCisgICBSZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QgKGFuZCBzZXRzIGVycm5vKS4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc2V0cmxpbWl0IChfX3JsaW1pdF9yZXNvdXJjZV90IF9fcmVzb3VyY2UsCisJCSAgICAgIF9fY29uc3Qgc3RydWN0IHJsaW1pdCAqX19ybGltaXRzKSBfX1RIUk9XOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHNldHJsaW1pdCwgKF9fcmxpbWl0X3Jlc291cmNlX3QgX19yZXNvdXJjZSwKKwkJCQkgICAgICAgX19jb25zdCBzdHJ1Y3QgcmxpbWl0ICpfX3JsaW1pdHMpLAorCQkJICAgc2V0cmxpbWl0NjQpOworIyBlbHNlCisjICBkZWZpbmUgc2V0cmxpbWl0IHNldHJsaW1pdDY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBzZXRybGltaXQ2NCAoX19ybGltaXRfcmVzb3VyY2VfdCBfX3Jlc291cmNlLAorCQkJX19jb25zdCBzdHJ1Y3QgcmxpbWl0NjQgKl9fcmxpbWl0cykgX19USFJPVzsKKyNlbmRpZgorCisvKiBSZXR1cm4gcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24gb24gcHJvY2VzcyBpbmRpY2F0ZWQgYnkgV0hPCisgICBhbmQgcHV0IGl0IGluICpVU0FHRS4gIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCBnZXRydXNhZ2UgKF9fcnVzYWdlX3dob190IF9fd2hvLCBzdHJ1Y3QgcnVzYWdlICpfX3VzYWdlKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgYW55IHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IFdISUNIIGFuZCBXSE8KKyAgIChzZWUgYWJvdmUpOyBpZiBXSE8gaXMgemVybywgdGhlIGN1cnJlbnQgcHJvY2VzcywgcHJvY2VzcyBncm91cCwgb3IgdXNlcgorICAgKGFzIHNwZWNpZmllZCBieSBXSE8pIGlzIHVzZWQuICBBIGxvd2VyIHByaW9yaXR5IG51bWJlciBtZWFucyBoaWdoZXIKKyAgIHByaW9yaXR5LiAgUHJpb3JpdGllcyByYW5nZSBmcm9tIFBSSU9fTUlOIHRvIFBSSU9fTUFYIChhYm92ZSkuICAqLworZXh0ZXJuIGludCBnZXRwcmlvcml0eSAoX19wcmlvcml0eV93aGljaF90IF9fd2hpY2gsIGlkX3QgX193aG8pIF9fVEhST1c7CisKKy8qIFNldCB0aGUgcHJpb3JpdHkgb2YgYWxsIHByb2Nlc3NlcyBzcGVjaWZpZWQgYnkgV0hJQ0ggYW5kIFdITyAoc2VlIGFib3ZlKQorICAgdG8gUFJJTy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRwcmlvcml0eSAoX19wcmlvcml0eV93aGljaF90IF9fd2hpY2gsIGlkX3QgX193aG8sIGludCBfX3ByaW8pCisgICAgIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvcmVzb3VyY2UuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0MDg0MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiBgZmRfc2V0JyB0eXBlIGFuZCByZWxhdGVkIG1hY3JvcywgYW5kIGBzZWxlY3QnL2Bwc2VsZWN0JyBkZWNsYXJhdGlvbnMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTgsOTksMjAwMCwwMSwwMiwyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKglQT1NJWCAxMDAzLjFnOiA2LjIgU2VsZWN0IGZyb20gRmlsZSBEZXNjcmlwdG9yIFNldHMgPHN5cy9zZWxlY3QuaD4gICovCisKKyNpZm5kZWYgX1NZU19TRUxFQ1RfSAorI2RlZmluZSBfU1lTX1NFTEVDVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKy8qIEdldCBkZWZpbml0aW9uIG9mIG5lZWRlZCBiYXNpYyB0eXBlcy4gICovCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBHZXQgX19GRF8qIGRlZmluaXRpb25zLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NlbGVjdC5oPgorCisvKiBHZXQgX19zaWdzZXRfdC4gICovCisjaW5jbHVkZSA8Yml0cy9zaWdzZXQuaD4KKworI2lmbmRlZiBfX3NpZ3NldF90X2RlZmluZWQKKyMgZGVmaW5lIF9fc2lnc2V0X3RfZGVmaW5lZAordHlwZWRlZiBfX3NpZ3NldF90IHNpZ3NldF90OworI2VuZGlmCisKKy8qIEdldCBkZWZpbml0aW9uIG9mIHRpbWVyIHNwZWNpZmljYXRpb24gc3RydWN0dXJlcy4gICovCisjZGVmaW5lIF9fbmVlZF90aW1lX3QKKyNkZWZpbmUgX19uZWVkX3RpbWVzcGVjCisjaW5jbHVkZSA8dGltZS5oPgorI2RlZmluZSBfX25lZWRfdGltZXZhbAorI2luY2x1ZGUgPGJpdHMvdGltZS5oPgorCisjaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyBkZWZpbmUgX19zdXNlY29uZHNfdF9kZWZpbmVkCisjZW5kaWYKKworCisvKiBUaGUgZmRfc2V0IG1lbWJlciBpcyByZXF1aXJlZCB0byBiZSBhbiBhcnJheSBvZiBsb25ncy4gICovCit0eXBlZGVmIGxvbmcgaW50IF9fZmRfbWFzazsKKworLyogU29tZSB2ZXJzaW9ucyBvZiA8bGludXgvcG9zaXhfdHlwZXMuaD4gZGVmaW5lIHRoZXNlIG1hY3Jvcy4gICovCisjdW5kZWYJX19ORkRCSVRTCisjdW5kZWYJX19GREVMVAorI3VuZGVmCV9fRkRNQVNLCisvKiBJdCdzIGVhc2llciB0byBhc3N1bWUgOC1iaXQgYnl0ZXMgdGhhbiB0byBnZXQgQ0hBUl9CSVQuICAqLworI2RlZmluZSBfX05GREJJVFMJKDggKiBzaXplb2YgKF9fZmRfbWFzaykpCisjZGVmaW5lCV9fRkRFTFQoZCkJKChkKSAvIF9fTkZEQklUUykKKyNkZWZpbmUJX19GRE1BU0soZCkJKChfX2ZkX21hc2spIDEgPDwgKChkKSAlIF9fTkZEQklUUykpCisKKy8qIGZkX3NldCBmb3Igc2VsZWN0IGFuZCBwc2VsZWN0LiAgKi8KK3R5cGVkZWYgc3RydWN0CisgIHsKKyAgICAvKiBYUEc0LjIgcmVxdWlyZXMgdGhpcyBtZW1iZXIgbmFtZS4gIE90aGVyd2lzZSBhdm9pZCB0aGUgbmFtZQorICAgICAgIGZyb20gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOCisgICAgX19mZF9tYXNrIGZkc19iaXRzW19fRkRfU0VUU0laRSAvIF9fTkZEQklUU107CisjIGRlZmluZSBfX0ZEU19CSVRTKHNldCkgKChzZXQpLT5mZHNfYml0cykKKyNlbHNlCisgICAgX19mZF9tYXNrIF9fZmRzX2JpdHNbX19GRF9TRVRTSVpFIC8gX19ORkRCSVRTXTsKKyMgZGVmaW5lIF9fRkRTX0JJVFMoc2V0KSAoKHNldCktPl9fZmRzX2JpdHMpCisjZW5kaWYKKyAgfSBmZF9zZXQ7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgaW4gYGZkX3NldCcuICAqLworI2RlZmluZQlGRF9TRVRTSVpFCQlfX0ZEX1NFVFNJWkUKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFNvbWV0aW1lcyB0aGUgZmRfc2V0IG1lbWJlciBpcyBhc3N1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLiAgKi8KK3R5cGVkZWYgX19mZF9tYXNrIGZkX21hc2s7CisKKy8qIE51bWJlciBvZiBiaXRzIHBlciB3b3JkIG9mIGBmZF9zZXQnIChzb21lIGNvZGUgYXNzdW1lcyB0aGlzIGlzIDMyKS4gICovCisjIGRlZmluZSBORkRCSVRTCQlfX05GREJJVFMKKyNlbmRpZgorCisKKy8qIEFjY2VzcyBtYWNyb3MgZm9yIGBmZF9zZXQnLiAgKi8KKyNkZWZpbmUJRkRfU0VUKGZkLCBmZHNldHApCV9fRkRfU0VUIChmZCwgZmRzZXRwKQorI2RlZmluZQlGRF9DTFIoZmQsIGZkc2V0cCkJX19GRF9DTFIgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX0lTU0VUKGZkLCBmZHNldHApCV9fRkRfSVNTRVQgKGZkLCBmZHNldHApCisjZGVmaW5lCUZEX1pFUk8oZmRzZXRwKQkJX19GRF9aRVJPIChmZHNldHApCisKKworX19CRUdJTl9ERUNMUworCisvKiBDaGVjayB0aGUgZmlyc3QgTkZEUyBkZXNjcmlwdG9ycyBlYWNoIGluIFJFQURGRFMgKGlmIG5vdCBOVUxMKSBmb3IgcmVhZAorICAgcmVhZGluZXNzLCBpbiBXUklURUZEUyAoaWYgbm90IE5VTEwpIGZvciB3cml0ZSByZWFkaW5lc3MsIGFuZCBpbiBFWENFUFRGRFMKKyAgIChpZiBub3QgTlVMTCkgZm9yIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuICBJZiBUSU1FT1VUIGlzIG5vdCBOVUxMLCB0aW1lIG91dAorICAgYWZ0ZXIgd2FpdGluZyB0aGUgaW50ZXJ2YWwgc3BlY2lmaWVkIHRoZXJlaW4uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZHkKKyAgIGRlc2NyaXB0b3JzLCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgc2VsZWN0IChpbnQgX19uZmRzLCBmZF9zZXQgKl9fcmVzdHJpY3QgX19yZWFkZmRzLAorCQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX193cml0ZWZkcywKKwkJICAgZmRfc2V0ICpfX3Jlc3RyaWN0IF9fZXhjZXB0ZmRzLAorCQkgICBzdHJ1Y3QgdGltZXZhbCAqX19yZXN0cmljdCBfX3RpbWVvdXQpOworCisjaWZkZWYgX19VU0VfWE9QRU4ySworLyogU2FtZSBhcyBhYm92ZSBvbmx5IHRoYXQgdGhlIFRJTUVPVVQgdmFsdWUgaXMgZ2l2ZW4gd2l0aCBoaWdoZXIKKyAgIHJlc29sdXRpb24gYW5kIGEgc2lnbWFzayB3aGljaCBpcyBiZWVuIHNldCB0ZW1wb3JhcmlseS4gIFRoaXMgdmVyc2lvbgorICAgc2hvdWxkIGJlIHVzZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBwc2VsZWN0IChpbnQgX19uZmRzLCBmZF9zZXQgKl9fcmVzdHJpY3QgX19yZWFkZmRzLAorCQkgICAgZmRfc2V0ICpfX3Jlc3RyaWN0IF9fd3JpdGVmZHMsCisJCSAgICBmZF9zZXQgKl9fcmVzdHJpY3QgX19leGNlcHRmZHMsCisJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzdHJpY3QgX190aW1lb3V0LAorCQkgICAgY29uc3QgX19zaWdzZXRfdCAqX19yZXN0cmljdCBfX3NpZ21hc2spOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvc2VsZWN0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NlbS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhNTdmYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NlbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VNX0gKKyNkZWZpbmUgX1NZU19TRU1fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogR2V0IGNvbW1vbiBkZWZpbml0aW9uIG9mIFN5c3RlbSBWIHN0eWxlIElQQy4gICovCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc2VtaWRfZHMnIGFuZCBtb3JlLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3NlbS5oPgorCisjaWZkZWYgX19VU0VfR05VCisjIGRlZmluZSBfX25lZWRfdGltZXNwZWMKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgU3lzdGVtIFYgc3R5bGUgSVBDIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBzZW1hcGhvcmUKKyAgIGhhbmRsaW5nLiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHMi4gICovCisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBhcmd1bWVudCB0byBgc2Vtb3AnIHRvIGRlc2NyaWJlIG9wZXJhdGlvbnMuICAqLworc3RydWN0IHNlbWJ1ZgoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgc2VtX251bTsJLyogc2VtYXBob3JlIG51bWJlciAqLworICBzaG9ydCBpbnQgc2VtX29wOwkJLyogc2VtYXBob3JlIG9wZXJhdGlvbiAqLworICBzaG9ydCBpbnQgc2VtX2ZsZzsJCS8qIG9wZXJhdGlvbiBmbGFnICovCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogU2VtYXBob3JlIGNvbnRyb2wgb3BlcmF0aW9uLiAgKi8KK2V4dGVybiBpbnQgc2VtY3RsIChpbnQgX19zZW1pZCwgaW50IF9fc2VtbnVtLCBpbnQgX19jbWQsIC4uLikgX19USFJPVzsKKworLyogR2V0IHNlbWFwaG9yZS4gICovCitleHRlcm4gaW50IHNlbWdldCAoa2V5X3QgX19rZXksIGludCBfX25zZW1zLCBpbnQgX19zZW1mbGcpIF9fVEhST1c7CisKKy8qIE9wZXJhdGUgb24gc2VtYXBob3JlLiAgKi8KK2V4dGVybiBpbnQgc2Vtb3AgKGludCBfX3NlbWlkLCBzdHJ1Y3Qgc2VtYnVmICpfX3NvcHMsIHNpemVfdCBfX25zb3BzKSBfX1RIUk9XOworCisjaWZkZWYgX19VU0VfR05VCisvKiBPcGVyYXRlIG9uIHNlbWFwaG9yZSB3aXRoIHRpbWVvdXQuICAqLworZXh0ZXJuIGludCBzZW10aW1lZG9wIChpbnQgX19zZW1pZCwgc3RydWN0IHNlbWJ1ZiAqX19zb3BzLCBzaXplX3QgX19uc29wcywKKwkJICAgICAgIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX3RpbWVvdXQpIF9fVEhST1c7CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy9zZW0uaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc2VuZGZpbGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NlbmRmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMzY3YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NlbmRmaWxlLmgKQEAgLTAsMCArMSw1MiBAQAorLyogc2VuZGZpbGUgLS0gY29weSBkYXRhIGRpcmVjdGx5IGZyb20gb25lIGZpbGUgZGVzY3JpcHRvciB0byBhbm90aGVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTgsOTksMDEsMjAwMiwyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfU0VOREZJTEVfSAorI2RlZmluZSBfU1lTX1NFTkRGSUxFX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBTZW5kIHVwIHRvIENPVU5UIGJ5dGVzIGZyb20gZmlsZSBhc3NvY2lhdGVkIHdpdGggSU5fRkQgc3RhcnRpbmcgYXQKKyAgICpPRkZTRVQgdG8gZGVzY3JpcHRvciBPVVRfRkQuICBTZXQgKk9GRlNFVCB0byB0aGUgSU5fRkQncyBmaWxlIHBvc2l0aW9uCisgICBmb2xsb3dpbmcgdGhlIHJlYWQgYnl0ZXMuICBJZiBPRkZTRVQgaXMgYSBudWxsIHBvaW50ZXIsIHVzZSB0aGUgbm9ybWFsCisgICBmaWxlIHBvc2l0aW9uIGluc3RlYWQuICBSZXR1cm4gdGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzLCBvciAtMSBpbgorICAgY2FzZSBvZiBlcnJvci4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBzc2l6ZV90IHNlbmRmaWxlIChpbnQgX19vdXRfZmQsIGludCBfX2luX2ZkLCBvZmZfdCAqX19vZmZzZXQsCisJCQkgc2l6ZV90IF9fY291bnQpIF9fVEhST1c7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVF9OVEggKHNlbmRmaWxlLAorCQkJICAgICAgIChpbnQgX19vdXRfZmQsIGludCBfX2luX2ZkLCBfX29mZjY0X3QgKl9fb2Zmc2V0LAorCQkJCXNpemVfdCBfX2NvdW50KSwgc2VuZGZpbGU2NCk7CisjIGVsc2UKKyMgIGRlZmluZSBzZW5kZmlsZSBzZW5kZmlsZTY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIHNzaXplX3Qgc2VuZGZpbGU2NCAoaW50IF9fb3V0X2ZkLCBpbnQgX19pbl9mZCwgX19vZmY2NF90ICpfX29mZnNldCwKKwkJCSAgIHNpemVfdCBfX2NvdW50KSBfX1RIUk9XOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc2VuZGZpbGUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc2htLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zaG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZjZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc2htLmgKQEAgLTAsMCArMSw2NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19TSE1fSAorI2RlZmluZSBfU1lTX1NITV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgY29tbW9uIGRlZmluaXRpb24gb2YgU3lzdGVtIFYgc3R5bGUgSVBDLiAgKi8KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYHN0cnVjdCBzaG1pZF9kcycgYW5kIG1vcmUuICAqLworI2luY2x1ZGUgPGJpdHMvc2htLmg+CisKKy8qIERlZmluZSB0eXBlcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICAqLworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgX19VU0VfWE9QRU4KKyMgaWZuZGVmIF9fcGlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3BpZF90IHBpZF90OworIyAgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisKK19fQkVHSU5fREVDTFMKKworLyogVGhlIGZvbGxvd2luZyBTeXN0ZW0gViBzdHlsZSBJUEMgZnVuY3Rpb25zIGltcGxlbWVudCBhIHNoYXJlZCBtZW1vcnkKKyAgIGZhY2lsaXR5LiAgVGhlIGRlZmluaXRpb24gaXMgZm91bmQgaW4gWFBHNC4yLiAgKi8KKworLyogU2hhcmVkIG1lbW9yeSBjb250cm9sIG9wZXJhdGlvbi4gICovCitleHRlcm4gaW50IHNobWN0bCAoaW50IF9fc2htaWQsIGludCBfX2NtZCwgc3RydWN0IHNobWlkX2RzICpfX2J1ZikgX19USFJPVzsKKworLyogR2V0IHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gaW50IHNobWdldCAoa2V5X3QgX19rZXksIHNpemVfdCBfX3NpemUsIGludCBfX3NobWZsZykgX19USFJPVzsKKworLyogQXR0YWNoIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gICovCitleHRlcm4gdm9pZCAqc2htYXQgKGludCBfX3NobWlkLCBfX2NvbnN0IHZvaWQgKl9fc2htYWRkciwgaW50IF9fc2htZmxnKQorICAgICBfX1RIUk9XOworCisvKiBEZXRhY2ggc2hhcmVkIG1lbW9yeSBzZWdtZW50LiAgKi8KK2V4dGVybiBpbnQgc2htZHQgKF9fY29uc3Qgdm9pZCAqX19zaG1hZGRyKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NobS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zaWduYWwuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjAyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zaWduYWwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8c2lnbmFsLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zb2NrZXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWVhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zb2NrZXQuaApAQCAtMCwwICsxLDI0MyBAQAorLyogRGVjbGFyYXRpb25zIG9mIHNvY2tldCBjb25zdGFudHMsIHR5cGVzLCBhbmQgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAxOTkxLDkyLDE5OTQtMjAwMSwyMDAzLDIwMDUsMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1NZU19TT0NLRVRfSAorI2RlZmluZQlfU1lTX1NPQ0tFVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisKKy8qIFRoaXMgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBTT0NLXyosIFBGXyosCisgICBBRl8qLCBNU0dfKiwgU09MXyosIGFuZCBTT18qIGNvbnN0YW50cywgYW5kIHRoZSBgc3RydWN0IHNvY2thZGRyJywKKyAgIGBzdHJ1Y3QgbXNnaGRyJywgYW5kIGBzdHJ1Y3QgbGluZ2VyJyB0eXBlcy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrZXQuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorLyogVGhpcyBpcyB0aGUgNC4zIEJTRCBgc3RydWN0IHNvY2thZGRyJyBmb3JtYXQsIHdoaWNoIGlzIHVzZWQgYXMgd2lyZQorICAgZm9ybWF0IGluIHRoZSBncm90dHkgb2xkIDQuMyBgdGFsaycgcHJvdG9jb2wuICAqLworc3RydWN0IG9zb2NrYWRkcgorICB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IHNhX2ZhbWlseTsKKyAgICB1bnNpZ25lZCBjaGFyIHNhX2RhdGFbMTRdOworICB9OworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZgorICAgYHNodXRkb3duJy4gICovCitlbnVtCit7CisgIFNIVVRfUkQgPSAwLAkJLyogTm8gbW9yZSByZWNlcHRpb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9SRAkJU0hVVF9SRAorICBTSFVUX1dSLAkJLyogTm8gbW9yZSB0cmFuc21pc3Npb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9XUgkJU0hVVF9XUgorICBTSFVUX1JEV1IJCS8qIE5vIG1vcmUgcmVjZXB0aW9ucyBvciB0cmFuc21pc3Npb25zLiAgKi8KKyNkZWZpbmUgU0hVVF9SRFdSCVNIVVRfUkRXUgorfTsKKworLyogVGhpcyBpcyB0aGUgdHlwZSB3ZSB1c2UgZm9yIGdlbmVyaWMgc29ja2V0IGFkZHJlc3MgYXJndW1lbnRzLgorCisgICBXaXRoIEdDQyAyLjcgYW5kIGxhdGVyLCB0aGUgZnVua3kgdW5pb24gY2F1c2VzIHJlZGVjbGFyYXRpb25zIG9yCisgICB1c2VzIHdpdGggYW55IG9mIHRoZSBsaXN0ZWQgdHlwZXMgdG8gYmUgYWxsb3dlZCB3aXRob3V0IGNvbXBsYWludC4KKyAgIEcrKyAyLjcgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc3BhcmVudCB1bmlvbnMgc28gdGhlcmUgd2Ugd2FudCB0aGUKKyAgIG9sZC1zdHlsZSBkZWNsYXJhdGlvbiwgdG9vLiAgKi8KKyNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8ICFfX0dOVUNfUFJFUkVRICgyLCA3KSB8fCAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fU09DS0FERFJfQVJHCQlzdHJ1Y3Qgc29ja2FkZHIgKl9fcmVzdHJpY3QKKyMgZGVmaW5lIF9fQ09OU1RfU09DS0FERFJfQVJHCV9fY29uc3Qgc3RydWN0IHNvY2thZGRyICoKKyNlbHNlCisvKiBBZGQgbW9yZSBgc3RydWN0IHNvY2thZGRyX0FGJyB0eXBlcyBoZXJlIGFzIG5lY2Vzc2FyeS4KKyAgIFRoZXNlIGFyZSBhbGwgdGhlIG9uZXMgSSBmb3VuZCBvbiBOZXRCU0QgYW5kIExpbnV4LiAgKi8KKyMgZGVmaW5lIF9fU09DS0FERFJfQUxMVFlQRVMgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfYXQpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9heDI1KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfZGwpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9lb24pIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl9pbikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luNikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX2luYXJwKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaXB4KSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfaXNvKSBcCisgIF9fU09DS0FERFJfT05FVFlQRSAoc29ja2FkZHJfbnMpIFwKKyAgX19TT0NLQUREUl9PTkVUWVBFIChzb2NrYWRkcl91bikgXAorICBfX1NPQ0tBRERSX09ORVRZUEUgKHNvY2thZGRyX3gyNSkKKworIyBkZWZpbmUgX19TT0NLQUREUl9PTkVUWVBFKHR5cGUpIHN0cnVjdCB0eXBlICpfX3Jlc3RyaWN0IF9fIyN0eXBlIyNfXzsKK3R5cGVkZWYgdW5pb24geyBfX1NPQ0tBRERSX0FMTFRZUEVTCisJICAgICAgfSBfX1NPQ0tBRERSX0FSRyBfX2F0dHJpYnV0ZV9fICgoX190cmFuc3BhcmVudF91bmlvbl9fKSk7CisjIHVuZGVmIF9fU09DS0FERFJfT05FVFlQRQorIyBkZWZpbmUgX19TT0NLQUREUl9PTkVUWVBFKHR5cGUpIF9fY29uc3Qgc3RydWN0IHR5cGUgKl9fcmVzdHJpY3QgX18jI3R5cGUjI19fOwordHlwZWRlZiB1bmlvbiB7IF9fU09DS0FERFJfQUxMVFlQRVMKKwkgICAgICB9IF9fQ09OU1RfU09DS0FERFJfQVJHIF9fYXR0cmlidXRlX18gKChfX3RyYW5zcGFyZW50X3VuaW9uX18pKTsKKyMgdW5kZWYgX19TT0NLQUREUl9PTkVUWVBFCisjZW5kaWYKKworCisvKiBDcmVhdGUgYSBuZXcgc29ja2V0IG9mIHR5cGUgVFlQRSBpbiBkb21haW4gRE9NQUlOLCB1c2luZworICAgcHJvdG9jb2wgUFJPVE9DT0wuICBJZiBQUk9UT0NPTCBpcyB6ZXJvLCBvbmUgaXMgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisgICBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgbmV3IHNvY2tldCwgb3IgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNvY2tldCAoaW50IF9fZG9tYWluLCBpbnQgX190eXBlLCBpbnQgX19wcm90b2NvbCkgX19USFJPVzsKKworLyogQ3JlYXRlIHR3byBuZXcgc29ja2V0cywgb2YgdHlwZSBUWVBFIGluIGRvbWFpbiBET01BSU4gYW5kIHVzaW5nCisgICBwcm90b2NvbCBQUk9UT0NPTCwgd2hpY2ggYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLCBhbmQgcHV0IGZpbGUKKyAgIGRlc2NyaXB0b3JzIGZvciB0aGVtIGluIEZEU1swXSBhbmQgRkRTWzFdLiAgSWYgUFJPVE9DT0wgaXMgemVybywKKyAgIG9uZSB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzb2NrZXRwYWlyIChpbnQgX19kb21haW4sIGludCBfX3R5cGUsIGludCBfX3Byb3RvY29sLAorCQkgICAgICAgaW50IF9fZmRzWzJdKSBfX1RIUk9XOworCisvKiBHaXZlIHRoZSBzb2NrZXQgRkQgdGhlIGxvY2FsIGFkZHJlc3MgQUREUiAod2hpY2ggaXMgTEVOIGJ5dGVzIGxvbmcpLiAgKi8KK2V4dGVybiBpbnQgYmluZCAoaW50IF9fZmQsIF9fQ09OU1RfU09DS0FERFJfQVJHIF9fYWRkciwgc29ja2xlbl90IF9fbGVuKQorICAgICBfX1RIUk9XOworCisvKiBQdXQgdGhlIGxvY2FsIGFkZHJlc3Mgb2YgRkQgaW50byAqQUREUiBhbmQgaXRzIGxlbmd0aCBpbiAqTEVOLiAgKi8KK2V4dGVybiBpbnQgZ2V0c29ja25hbWUgKGludCBfX2ZkLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQlzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19sZW4pIF9fVEhST1c7CisKKy8qIE9wZW4gYSBjb25uZWN0aW9uIG9uIHNvY2tldCBGRCB0byBwZWVyIGF0IEFERFIgKHdoaWNoIExFTiBieXRlcyBsb25nKS4KKyAgIEZvciBjb25uZWN0aW9ubGVzcyBzb2NrZXQgdHlwZXMsIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IGFkZHJlc3MgdG8gc2VuZCB0bworICAgYW5kIHRoZSBvbmx5IGFkZHJlc3MgZnJvbSB3aGljaCB0byBhY2NlcHQgdHJhbnNtaXNzaW9ucy4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBjb25uZWN0IChpbnQgX19mZCwgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLCBzb2NrbGVuX3QgX19sZW4pOworCisvKiBQdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIgY29ubmVjdGVkIHRvIHNvY2tldCBGRCBpbnRvICpBRERSCisgICAod2hpY2ggaXMgKkxFTiBieXRlcyBsb25nKSwgYW5kIGl0cyBhY3R1YWwgbGVuZ3RoIGludG8gKkxFTi4gICovCitleHRlcm4gaW50IGdldHBlZXJuYW1lIChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkJc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fbGVuKSBfX1RIUk9XOworCisKKy8qIFNlbmQgTiBieXRlcyBvZiBCVUYgdG8gc29ja2V0IEZELiAgUmV0dXJucyB0aGUgbnVtYmVyIHNlbnQgb3IgLTEuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3Qgc2VuZCAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKTsKKworLyogUmVhZCBOIGJ5dGVzIGludG8gQlVGIGZyb20gc29ja2V0IEZELgorICAgUmV0dXJucyB0aGUgbnVtYmVyIHJlYWQgb3IgLTEgZm9yIGVycm9ycy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWN2IChpbnQgX19mZCwgdm9pZCAqX19idWYsIHNpemVfdCBfX24sIGludCBfX2ZsYWdzKTsKKworLyogU2VuZCBOIGJ5dGVzIG9mIEJVRiBvbiBzb2NrZXQgRkQgdG8gcGVlciBhdCBhZGRyZXNzIEFERFIgKHdoaWNoIGlzCisgICBBRERSX0xFTiBieXRlcyBsb25nKS4gIFJldHVybnMgdGhlIG51bWJlciBzZW50LCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNlbmR0byAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24sCisJCSAgICAgICBpbnQgX19mbGFncywgX19DT05TVF9TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICAgICAgc29ja2xlbl90IF9fYWRkcl9sZW4pOworCisvKiBSZWFkIE4gYnl0ZXMgaW50byBCVUYgdGhyb3VnaCBzb2NrZXQgRkQuCisgICBJZiBBRERSIGlzIG5vdCBOVUxMLCBmaWxsIGluICpBRERSX0xFTiBieXRlcyBvZiBpdCB3aXRoIHRoYSBhZGRyZXNzIG9mCisgICB0aGUgc2VuZGVyLCBhbmQgc3RvcmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBhZGRyZXNzIGluICpBRERSX0xFTi4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGZvciBlcnJvcnMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIHNzaXplX3QgcmVjdmZyb20gKGludCBfX2ZkLCB2b2lkICpfX3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19uLAorCQkJIGludCBfX2ZsYWdzLCBfX1NPQ0tBRERSX0FSRyBfX2FkZHIsCisJCQkgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fYWRkcl9sZW4pOworCisKKy8qIFNlbmQgYSBtZXNzYWdlIGRlc2NyaWJlZCBNRVNTQUdFIG9uIHNvY2tldCBGRC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50LCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHNlbmRtc2cgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBtc2doZHIgKl9fbWVzc2FnZSwKKwkJCWludCBfX2ZsYWdzKTsKKworLyogUmVjZWl2ZSBhIG1lc3NhZ2UgYXMgZGVzY3JpYmVkIGJ5IE1FU1NBR0UgZnJvbSBzb2NrZXQgRkQuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlY3Ztc2cgKGludCBfX2ZkLCBzdHJ1Y3QgbXNnaGRyICpfX21lc3NhZ2UsIGludCBfX2ZsYWdzKTsKKworCisvKiBQdXQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHNvY2tldCBGRCdzIG9wdGlvbiBPUFROQU1FIGF0IHByb3RvY29sIGxldmVsIExFVkVMCisgICBpbnRvIE9QVFZBTCAod2hpY2ggaXMgKk9QVExFTiBieXRlcyBsb25nKSwgYW5kIHNldCAqT1BUTEVOIHRvIHRoZSB2YWx1ZSdzCisgICBhY3R1YWwgbGVuZ3RoLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBnZXRzb2Nrb3B0IChpbnQgX19mZCwgaW50IF9fbGV2ZWwsIGludCBfX29wdG5hbWUsCisJCSAgICAgICB2b2lkICpfX3Jlc3RyaWN0IF9fb3B0dmFsLAorCQkgICAgICAgc29ja2xlbl90ICpfX3Jlc3RyaWN0IF9fb3B0bGVuKSBfX1RIUk9XOworCisvKiBTZXQgc29ja2V0IEZEJ3Mgb3B0aW9uIE9QVE5BTUUgYXQgcHJvdG9jb2wgbGV2ZWwgTEVWRUwKKyAgIHRvICpPUFRWQUwgKHdoaWNoIGlzIE9QVExFTiBieXRlcyBsb25nKS4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgc2V0c29ja29wdCAoaW50IF9fZmQsIGludCBfX2xldmVsLCBpbnQgX19vcHRuYW1lLAorCQkgICAgICAgX19jb25zdCB2b2lkICpfX29wdHZhbCwgc29ja2xlbl90IF9fb3B0bGVuKSBfX1RIUk9XOworCisKKy8qIFByZXBhcmUgdG8gYWNjZXB0IGNvbm5lY3Rpb25zIG9uIHNvY2tldCBGRC4KKyAgIE4gY29ubmVjdGlvbiByZXF1ZXN0cyB3aWxsIGJlIHF1ZXVlZCBiZWZvcmUgZnVydGhlciByZXF1ZXN0cyBhcmUgcmVmdXNlZC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgbGlzdGVuIChpbnQgX19mZCwgaW50IF9fbikgX19USFJPVzsKKworLyogQXdhaXQgYSBjb25uZWN0aW9uIG9uIHNvY2tldCBGRC4KKyAgIFdoZW4gYSBjb25uZWN0aW9uIGFycml2ZXMsIG9wZW4gYSBuZXcgc29ja2V0IHRvIGNvbW11bmljYXRlIHdpdGggaXQsCisgICBzZXQgKkFERFIgKHdoaWNoIGlzICpBRERSX0xFTiBieXRlcyBsb25nKSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGluZworICAgcGVlciBhbmQgKkFERFJfTEVOIHRvIHRoZSBhZGRyZXNzJ3MgYWN0dWFsIGxlbmd0aCwgYW5kIHJldHVybiB0aGUKKyAgIG5ldyBzb2NrZXQncyBkZXNjcmlwdG9yLCBvciAtMSBmb3IgZXJyb3JzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgYWNjZXB0IChpbnQgX19mZCwgX19TT0NLQUREUl9BUkcgX19hZGRyLAorCQkgICBzb2NrbGVuX3QgKl9fcmVzdHJpY3QgX19hZGRyX2xlbik7CisKKy8qIFNodXQgZG93biBhbGwgb3IgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBvcGVuIG9uIHNvY2tldCBGRC4KKyAgIEhPVyBkZXRlcm1pbmVzIHdoYXQgdG8gc2h1dCBkb3duOgorICAgICBTSFVUX1JEICAgPSBObyBtb3JlIHJlY2VwdGlvbnM7CisgICAgIFNIVVRfV1IgICA9IE5vIG1vcmUgdHJhbnNtaXNzaW9uczsKKyAgICAgU0hVVF9SRFdSID0gTm8gbW9yZSByZWNlcHRpb25zIG9yIHRyYW5zbWlzc2lvbnMuCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNodXRkb3duIChpbnQgX19mZCwgaW50IF9faG93KSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisvKiBEZXRlcm1pbmUgd2hldGVyIHNvY2tldCBpcyBhdCBhIG91dC1vZi1iYW5kIG1hcmsuICAqLworZXh0ZXJuIGludCBzb2NrYXRtYXJrIChpbnQgX19mZCkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9NSVNDCisvKiBGRFRZUEUgaXMgU19JRlNPQ0sgb3IgYW5vdGhlciBTX0lGKiBtYWNybyBkZWZpbmVkIGluIDxzeXMvc3RhdC5oPjsKKyAgIHJldHVybnMgMSBpZiBGRCBpcyBvcGVuIG9uIGFuIG9iamVjdCBvZiB0aGUgaW5kaWNhdGVkIHR5cGUsIDAgaWYgbm90LAorICAgb3IgLTEgZm9yIGVycm9ycyAoc2V0dGluZyBlcnJubykuICAqLworZXh0ZXJuIGludCBpc2ZkdHlwZSAoaW50IF9fZmQsIGludCBfX2ZkdHlwZSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIERlZmluZSBzb21lIG1hY3JvcyBoZWxwaW5nIHRvIGNhdGNoIGJ1ZmZlciBvdmVyZmxvd3MuICAqLworI2lmIF9fVVNFX0ZPUlRJRllfTEVWRUwgPiAwICYmIGRlZmluZWQgX19leHRlcm5fYWx3YXlzX2lubGluZQorIyBpbmNsdWRlIDxiaXRzL3NvY2tldDIuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3NvY2tldC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zb2NrZXR2YXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NvY2tldHZhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzcxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zb2NrZXR2YXIuaApAQCAtMCwwICsxLDMgQEAKKy8qIFRoaXMgaGVhZGVyIGlzIHVzZWQgb24gbWFueSBzeXN0ZW1zIGJ1dCBmb3IgR05VIHdlIGhhdmUgZXZlcnl0aGluZworICAgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZCBoZWFkZXIuICAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NvdW5kY2FyZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc291bmRjYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkZTk4NgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3NvdW5kY2FyZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRjNDNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3RhdC5oCkBAIC0wLDAgKzEsNTM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTUtMjAwNCwgMjAwNSwgMjAwNiwgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNS42IEZpbGUgQ2hhcmFjdGVyaXN0aWNzCTxzeXMvc3RhdC5oPgorICovCisKKyNpZm5kZWYJX1NZU19TVEFUX0gKKyNkZWZpbmUJX1NZU19TVEFUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGJpdHMvdHlwZXMuaD4JCS8qIEZvciBfX21vZGVfdCBhbmQgX19kZXZfdC4gICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySyB8fCBkZWZpbmVkIF9fVVNFX01JU0MgXAorICAgICAgICAgfHwgZGVmaW5lZCBfX1VTRV9BVEZJTEUKKyMgaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgIGRlZmluZSBfX25lZWRfdGltZV90CisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX0FURklMRQorIyAgZGVmaW5lIF9fbmVlZF90aW1lc3BlYworIyBlbmRpZgorIyBpbmNsdWRlIDx0aW1lLmg+CQkvKiBGb3IgdGltZV90IHJlc3AuIHRpbWVzcGVjLiAgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBzb21lIG1vcmUgdHlwZXMgYXJlCisgICBhdmFpbGFibGUgaGVyZS4gICovCisjIGlmbmRlZiBfX2Rldl90X2RlZmluZWQKK3R5cGVkZWYgX19kZXZfdCBkZXZfdDsKKyMgIGRlZmluZSBfX2Rldl90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjICBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9faW5vX3RfZGVmaW5lZAorIyAgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK3R5cGVkZWYgX19pbm9fdCBpbm9fdDsKKyMgIGVsc2UKK3R5cGVkZWYgX19pbm82NF90IGlub190OworIyAgZW5kaWYKKyMgIGRlZmluZSBfX2lub190X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19tb2RlX3RfZGVmaW5lZAordHlwZWRlZiBfX21vZGVfdCBtb2RlX3Q7CisjICBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX25saW5rX3RfZGVmaW5lZAordHlwZWRlZiBfX25saW5rX3QgbmxpbmtfdDsKKyMgIGRlZmluZSBfX25saW5rX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjICBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCS8qIFgvT3BlbiAqLworCisjaWZkZWYgX19VU0VfVU5JWDk4CisjIGlmbmRlZiBfX2Jsa2NudF90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fYmxrY250X3QgYmxrY250X3Q7CisjICBlbHNlCit0eXBlZGVmIF9fYmxrY250NjRfdCBibGtjbnRfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19ibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fYmxrc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19ibGtzaXplX3QgYmxrc2l6ZV90OworIyAgZGVmaW5lIF9fYmxrc2l6ZV90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgkvKiBVbml4OTggKi8KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy9zdGF0Lmg+CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorIyBkZWZpbmUgU19JRk1UCQlfX1NfSUZNVAorIyBkZWZpbmUgU19JRkRJUglfX1NfSUZESVIKKyMgZGVmaW5lIFNfSUZDSFIJX19TX0lGQ0hSCisjIGRlZmluZSBTX0lGQkxLCV9fU19JRkJMSworIyBkZWZpbmUgU19JRlJFRwlfX1NfSUZSRUcKKyMgaWZkZWYgX19TX0lGSUZPCisjICBkZWZpbmUgU19JRklGTwlfX1NfSUZJRk8KKyMgZW5kaWYKKyMgaWZkZWYgX19TX0lGTE5LCisjICBkZWZpbmUgU19JRkxOSwlfX1NfSUZMTksKKyMgZW5kaWYKKyMgaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OCkgXAorICAgICAmJiBkZWZpbmVkIF9fU19JRlNPQ0sKKyMgIGRlZmluZSBTX0lGU09DSwlfX1NfSUZTT0NLCisjIGVuZGlmCisjZW5kaWYKKworLyogVGVzdCBtYWNyb3MgZm9yIGZpbGUgdHlwZXMuCSovCisKKyNkZWZpbmUJX19TX0lTVFlQRShtb2RlLCBtYXNrKQkoKChtb2RlKSAmIF9fU19JRk1UKSA9PSAobWFzaykpCisKKyNkZWZpbmUJU19JU0RJUihtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkRJUikKKyNkZWZpbmUJU19JU0NIUihtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkNIUikKKyNkZWZpbmUJU19JU0JMSyhtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRkJMSykKKyNkZWZpbmUJU19JU1JFRyhtb2RlKQkgX19TX0lTVFlQRSgobW9kZSksIF9fU19JRlJFRykKKyNpZmRlZiBfX1NfSUZJRk8KKyMgZGVmaW5lIFNfSVNGSUZPKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGSUZPKQorI2VuZGlmCisjaWZkZWYgX19TX0lGTE5LCisjIGRlZmluZSBTX0lTTE5LKG1vZGUpCSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGTE5LKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCAmJiAhZGVmaW5lZCBfX1NfSUZMTksKKyMgZGVmaW5lIFNfSVNMTksobW9kZSkgIDAKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfVU5JWDk4KSBcCisgICAgJiYgZGVmaW5lZCBfX1NfSUZTT0NLCisjIGRlZmluZSBTX0lTU09DSyhtb2RlKSBfX1NfSVNUWVBFKChtb2RlKSwgX19TX0lGU09DSykKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgZnJvbSBQT1NJWC4xYi4gIElmIHRoZSBvYmplY3RzIGFyZSBub3QgaW1wbGVtZW50ZWQgdXNpbmcgc2VwYXJhdGUKKyAgIGRpc3RpbmN0IGZpbGUgdHlwZXMsIHRoZSBtYWNyb3MgYWx3YXlzIHdpbGwgZXZhbHVhdGUgdG8gemVyby4gIFVubGlrZSB0aGUKKyAgIG90aGVyIFNfKiBtYWNyb3MgdGhlIGZvbGxvd2luZyB0aHJlZSB0YWtlIGEgcG9pbnRlciB0byBhIGBzdHJ1Y3Qgc3RhdCcKKyAgIG9iamVjdCBhcyB0aGUgYXJndW1lbnQuICAqLworI2lmZGVmCV9fVVNFX1BPU0lYMTk5MzA5CisjIGRlZmluZSBTX1RZUEVJU01RKGJ1ZikgX19TX1RZUEVJU01RKGJ1ZikKKyMgZGVmaW5lIFNfVFlQRUlTU0VNKGJ1ZikgX19TX1RZUEVJU1NFTShidWYpCisjIGRlZmluZSBTX1RZUEVJU1NITShidWYpIF9fU19UWVBFSVNTSE0oYnVmKQorI2VuZGlmCisKKworLyogUHJvdGVjdGlvbiBiaXRzLiAgKi8KKworI2RlZmluZQlTX0lTVUlEIF9fU19JU1VJRAkvKiBTZXQgdXNlciBJRCBvbiBleGVjdXRpb24uICAqLworI2RlZmluZQlTX0lTR0lECV9fU19JU0dJRAkvKiBTZXQgZ3JvdXAgSUQgb24gZXhlY3V0aW9uLiAgKi8KKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBTYXZlIHN3YXBwZWQgdGV4dCBhZnRlciB1c2UgKHN0aWNreSBiaXQpLiAgVGhpcyBpcyBwcmV0dHkgd2VsbCBvYnNvbGV0ZS4gICovCisjIGRlZmluZSBTX0lTVlRYCV9fU19JU1ZUWAorI2VuZGlmCisKKyNkZWZpbmUJU19JUlVTUglfX1NfSVJFQUQJLyogUmVhZCBieSBvd25lci4gICovCisjZGVmaW5lCVNfSVdVU1IJX19TX0lXUklURQkvKiBXcml0ZSBieSBvd25lci4gICovCisjZGVmaW5lCVNfSVhVU1IJX19TX0lFWEVDCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLworLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGJ5IG93bmVyLiAgKi8KKyNkZWZpbmUJU19JUldYVQkoX19TX0lSRUFEfF9fU19JV1JJVEV8X19TX0lFWEVDKQorCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDICYmIGRlZmluZWQgX19VU0VfQlNECisjIGRlZmluZSBTX0lSRUFECVNfSVJVU1IKKyMgZGVmaW5lIFNfSVdSSVRFCVNfSVdVU1IKKyMgZGVmaW5lIFNfSUVYRUMJU19JWFVTUgorI2VuZGlmCisKKyNkZWZpbmUJU19JUkdSUAkoU19JUlVTUiA+PiAzKQkvKiBSZWFkIGJ5IGdyb3VwLiAgKi8KKyNkZWZpbmUJU19JV0dSUAkoU19JV1VTUiA+PiAzKQkvKiBXcml0ZSBieSBncm91cC4gICovCisjZGVmaW5lCVNfSVhHUlAJKFNfSVhVU1IgPj4gMykJLyogRXhlY3V0ZSBieSBncm91cC4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgZ3JvdXAuICAqLworI2RlZmluZQlTX0lSV1hHCShTX0lSV1hVID4+IDMpCisKKyNkZWZpbmUJU19JUk9USAkoU19JUkdSUCA+PiAzKQkvKiBSZWFkIGJ5IG90aGVycy4gICovCisjZGVmaW5lCVNfSVdPVEgJKFNfSVdHUlAgPj4gMykJLyogV3JpdGUgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JWE9USAkoU19JWEdSUCA+PiAzKQkvKiBFeGVjdXRlIGJ5IG90aGVycy4gICovCisvKiBSZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgYnkgb3RoZXJzLiAgKi8KKyNkZWZpbmUJU19JUldYTwkoU19JUldYRyA+PiAzKQorCisKKyNpZmRlZglfX1VTRV9CU0QKKy8qIE1hY3JvcyBmb3IgY29tbW9uIG1vZGUgYml0IG1hc2tzLiAgKi8KKyMgZGVmaW5lIEFDQ0VTU1BFUk1TIChTX0lSV1hVfFNfSVJXWEd8U19JUldYTykgLyogMDc3NyAqLworIyBkZWZpbmUgQUxMUEVSTVMgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKS8qIDA3Nzc3ICovCisjIGRlZmluZSBERUZGSUxFTU9ERSAoU19JUlVTUnxTX0lXVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lST1RIfFNfSVdPVEgpLyogMDY2NiovCisKKyMgZGVmaW5lIFNfQkxLU0laRQk1MTIJLyogQmxvY2sgc2l6ZSBmb3IgYHN0X2Jsb2NrcycuICAqLworI2VuZGlmCisKKworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGZvciBGSUxFIGFuZCBwdXQgdGhlbSBpbiBCVUYuICAqLworZXh0ZXJuIGludCBzdGF0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgc3RydWN0IHN0YXQgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworCisvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZmlsZSwgZGV2aWNlLCBwaXBlLCBvciBzb2NrZXQKKyAgIHRoYXQgZmlsZSBkZXNjcmlwdG9yIEZEIGlzIG9wZW4gb24gYW5kIHB1dCB0aGVtIGluIEJVRi4gICovCitleHRlcm4gaW50IGZzdGF0IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fYnVmKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChzdGF0LCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCQkgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSwgc3RhdDY0KQorICAgICBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChmc3RhdCwgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdCAqX19idWYpLCBmc3RhdDY0KQorICAgICBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBzdGF0IHN0YXQ2NAorIyAgZGVmaW5lIGZzdGF0IGZzdGF0NjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CitleHRlcm4gaW50IGZzdGF0NjQgKGludCBfX2ZkLCBzdHJ1Y3Qgc3RhdDY0ICpfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2ltaWxhciB0byBzdGF0LCBnZXQgdGhlIGF0dHJpYnV0ZXMgZm9yIEZJTEUgYW5kIHB1dCB0aGVtIGluIEJVRi4KKyAgIFJlbGF0aXZlIHBhdGggbmFtZXMgYXJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIEZEIHVubGVzcyBGRCBpcworICAgQVRfRkRDV0QuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmc3RhdGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKGZzdGF0YXQsIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCQkgICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmLAorCQkJCSAgICAgaW50IF9fZmxhZyksCisJCQkgICBmc3RhdGF0NjQpIF9fbm9ubnVsbCAoKDIsIDMpKTsKKyMgIGVsc2UKKyMgICBkZWZpbmUgZnN0YXRhdCBmc3RhdGF0NjQKKyMgIGVuZGlmCisjIGVuZGlmCisKK2V4dGVybiBpbnQgZnN0YXRhdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZiwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKy8qIEdldCBmaWxlIGF0dHJpYnV0ZXMgYWJvdXQgRklMRSBhbmQgcHV0IHRoZW0gaW4gQlVGLgorICAgSWYgRklMRSBpcyBhIHN5bWJvbGljIGxpbmssIGRvIG5vdCBmb2xsb3cgaXQuICAqLworZXh0ZXJuIGludCBsc3RhdCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICBzdHJ1Y3Qgc3RhdCAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChsc3RhdCwKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkJICAgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSwgbHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyAgZWxzZQorIyAgIGRlZmluZSBsc3RhdCBsc3RhdDY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBsc3RhdDY0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXQ2NCAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjIGVuZGlmCisjZW5kaWYKKworLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBGSUxFIHRvIE1PREUuCisgICBJZiBGSUxFIGlzIGEgc3ltYm9saWMgbGluaywgdGhpcyBhZmZlY3RzIGl0cyB0YXJnZXQgaW5zdGVhZC4gICovCitleHRlcm4gaW50IGNobW9kIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIGZvciBGSUxFIHRvIE1PREUuCisgICBJZiBGSUxFIGlzIGEgc3ltYm9saWMgbGluaywgdGhpcyBhZmZlY3RzIHRoZSBsaW5rIGl0c2VsZgorICAgcmF0aGVyIHRoYW4gaXRzIHRhcmdldC4gICovCitleHRlcm4gaW50IGxjaG1vZCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IF9fbW9kZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlIEZEIGlzIG9wZW4gb24gdG8gTU9ERS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorZXh0ZXJuIGludCBmY2htb2QgKGludCBfX2ZkLCBfX21vZGVfdCBfX21vZGUpIF9fVEhST1c7CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2V0IGZpbGUgYWNjZXNzIHBlcm1pc3Npb25zIG9mIEZJTEUgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgRkQgaXMgb3BlbiBvbi4gICovCitleHRlcm4gaW50IGZjaG1vZGF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fbW9kZV90IG1vZGUsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpIF9fd3VyOworI2VuZGlmIC8qIFVzZSBBVEZJTEUuICAqLworCisKKworLyogU2V0IHRoZSBmaWxlIGNyZWF0aW9uIG1hc2sgb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byBNQVNLLAorICAgYW5kIHJldHVybiB0aGUgb2xkIGNyZWF0aW9uIG1hc2suICAqLworZXh0ZXJuIF9fbW9kZV90IHVtYXNrIChfX21vZGVfdCBfX21hc2spIF9fVEhST1c7CisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIEdldCB0aGUgY3VycmVudCBgdW1hc2snIHZhbHVlIHdpdGhvdXQgY2hhbmdpbmcgaXQuCisgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgSHVyZC4gICovCitleHRlcm4gX19tb2RlX3QgZ2V0dW1hc2sgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworLyogQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBQQVRILCB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFLiAgKi8KK2V4dGVybiBpbnQgbWtkaXIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIG1rZGlyLCBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5IHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUuICBCdXQKKyAgIGludGVycHJldCByZWxhdGl2ZSBQQVRIIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgYXNzb2NpYXRlZAorICAgd2l0aCBGRC4gICovCitleHRlcm4gaW50IG1rZGlyYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisvKiBDcmVhdGUgYSBkZXZpY2UgZmlsZSBuYW1lZCBQQVRILCB3aXRoIHBlcm1pc3Npb24gYW5kIHNwZWNpYWwgYml0cyBNT0RFCisgICBhbmQgZGV2aWNlIG51bWJlciBERVYgKHdoaWNoIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIG1ham9yIGFuZCBtaW5vcgorICAgZGV2aWNlIG51bWJlcnMgd2l0aCB0aGUgYG1ha2VkZXYnIG1hY3JvIGFib3ZlKS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKK2V4dGVybiBpbnQgbWtub2QgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgX19kZXYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbWtub2QsIGNyZWF0ZSBhIG5ldyBkZXZpY2UgZmlsZSB3aXRoIHBlcm1pc3Npb24gYml0cyBNT0RFIGFuZAorICAgZGV2aWNlIG51bWJlciBERVYuICBCdXQgaW50ZXJwcmV0IHJlbGF0aXZlIFBBVEggbmFtZXMgcmVsYXRpdmUgdG8KKyAgIHRoZSBkaXJlY3RvcnkgYXNzb2NpYXRlZCB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgbWtub2RhdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsCisJCSAgICBfX2Rldl90IF9fZGV2KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisKKy8qIENyZWF0ZSBhIG5ldyBGSUZPIG5hbWVkIFBBVEgsIHdpdGggcGVybWlzc2lvbiBiaXRzIE1PREUuICAqLworZXh0ZXJuIGludCBta2ZpZm8gKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBMaWtlIG1rZmlmbywgY3JlYXRlIGEgbmV3IEZJRk8gd2l0aCBwZXJtaXNzaW9uIGJpdHMgTU9ERS4gIEJ1dAorICAgaW50ZXJwcmV0IHJlbGF0aXZlIFBBVEggbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBhc3NvY2lhdGVkCisgICB3aXRoIEZELiAgKi8KK2V4dGVybiBpbnQgbWtmaWZvYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorDAorI2lmZGVmIF9fVVNFX0FURklMRQorLyogU2V0IGZpbGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gdGltZXMgcmVsYXRpdmUgdG8gZGlyZWN0b3J5IGZpbGUKKyAgIGRlc2NyaXB0b3IuICAqLworZXh0ZXJuIGludCB1dGltZW5zYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgX190aW1lc1syXSwKKwkJICAgICAgaW50IF9fZmxhZ3MpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFhYWCBUaGlzIHdpbGwgY2hhbmdlIHRvIHRoZSBtYWNybyBmb3IgdGhlIG5leHQgMjAwOCBQT1NJWCByZXZpc2lvbi4gICovCisvKiBTZXQgZmlsZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lcyBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggRkQuICAqLworZXh0ZXJuIGludCBmdXRpbWVucyAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdGltZXNbMl0pIF9fVEhST1c7CisjZW5kaWYKKwwKKy8qIFRvIGFsbG93IHRoZSBgc3RydWN0IHN0YXQnIHN0cnVjdHVyZSBhbmQgdGhlIGZpbGUgdHlwZSBgbW9kZV90JworICAgYml0cyB0byB2YXJ5IHdpdGhvdXQgY2hhbmdpbmcgc2hhcmVkIGxpYnJhcnkgbWFqb3IgdmVyc2lvbiBudW1iZXIsCisgICB0aGUgYHN0YXQnIGZhbWlseSBvZiBmdW5jdGlvbnMgYW5kIGBta25vZCcgYXJlIGluIGZhY3QgaW5saW5lCisgICB3cmFwcGVycyBhcm91bmQgY2FsbHMgdG8gYHhzdGF0JywgYGZ4c3RhdCcsIGBseHN0YXQnLCBhbmQgYHhta25vZCcsCisgICB3aGljaCBhbGwgdGFrZSBhIGxlYWRpbmcgdmVyc2lvbi1udW1iZXIgYXJndW1lbnQgZGVzaWduYXRpbmcgdGhlCisgICBkYXRhIHN0cnVjdHVyZSBhbmQgYml0cyB1c2VkLiAgPGJpdHMvc3RhdC5oPiBkZWZpbmVzIF9TVEFUX1ZFUiB3aXRoCisgICB0aGUgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBgc3RydWN0IHN0YXQnIGFzIGRlZmluZWQgaW4KKyAgIHRoYXQgZmlsZTsgYW5kIF9NS05PRF9WRVIgd2l0aCB0aGUgdmVyc2lvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bworICAgdGhlIFNfSUYqIG1hY3JvcyBkZWZpbmVkIHRoZXJlaW4uICBJdCBpcyBhcnJhbmdlZCB0aGF0IHdoZW4gbm90CisgICBpbmxpbmVkIHRoZXNlIGZ1bmN0aW9uIGFyZSBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQ7IHRoYXQgd2F5IGEKKyAgIGR5bmFtaWNhbGx5LWxpbmtlZCBleGVjdXRhYmxlIGFsd2F5cyBlbmNvZGVzIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGl0IHVzZXMsIHNvIHRoZSBgeCcgZnVuY3Rpb25zCisgICBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgY2FuIGFkYXB0IHdpdGhvdXQgbmVlZGluZyB0byByZWNvbXBpbGUgYWxsCisgICBjYWxsZXJzLiAgKi8KKworI2lmbmRlZiBfU1RBVF9WRVIKKyMgZGVmaW5lIF9TVEFUX1ZFUgkwCisjZW5kaWYKKyNpZm5kZWYgX01LTk9EX1ZFUgorIyBkZWZpbmUgX01LTk9EX1ZFUgkwCisjZW5kaWYKKworLyogV3JhcHBlcnMgZm9yIHN0YXQgYW5kIG1rbm9kIHN5c3RlbSBjYWxscy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgX19meHN0YXQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9feHN0YXQgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2x4c3RhdCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2Z4c3RhdGF0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkgICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMywgNCkpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZnhzdGF0LCAoaW50IF9fdmVyLCBpbnQgX19maWxkZXMsCisJCQkJICAgICAgc3RydWN0IHN0YXQgKl9fc3RhdF9idWYpLCBfX2Z4c3RhdDY0KQorICAgICBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9fUkVESVJFQ1RfTlRIIChfX3hzdGF0LCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkJICAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiksIF9feHN0YXQ2NCkKKyAgICAgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoX19seHN0YXQsIChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJCQkgICAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiksIF9fbHhzdGF0NjQpCisgICAgIF9fbm9ubnVsbCAoKDIsIDMpKTsKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKF9fZnhzdGF0YXQsIChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywKKwkJCQkJX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLAorCQkJCQlzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZiwgaW50IF9fZmxhZyksCisJCQkgICBfX2Z4c3RhdGF0NjQpIF9fbm9ubnVsbCAoKDMsIDQpKTsKKworIyBlbHNlCisjICBkZWZpbmUgX19meHN0YXQgX19meHN0YXQ2NAorIyAgZGVmaW5lIF9feHN0YXQgX194c3RhdDY0CisjICBkZWZpbmUgX19seHN0YXQgX19seHN0YXQ2NAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBfX2Z4c3RhdDY0IChpbnQgX192ZXIsIGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXQ2NCAqX19zdGF0X2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzKSk7CitleHRlcm4gaW50IF9feHN0YXQ2NCAoaW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCSAgICAgIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2x4c3RhdDY0IChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxlbmFtZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0NjQgKl9fc3RhdF9idWYpIF9fVEhST1cgX19ub25udWxsICgoMiwgMykpOworZXh0ZXJuIGludCBfX2Z4c3RhdGF0NjQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsCisJCQkgc3RydWN0IHN0YXQ2NCAqX19zdGF0X2J1ZiwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgzLCA0KSk7CisjZW5kaWYKK2V4dGVybiBpbnQgX194bWtub2QgKGludCBfX3ZlciwgX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwKKwkJICAgICBfX2Rldl90ICpfX2RldikgX19USFJPVyBfX25vbm51bGwgKCgyLCA0KSk7CisKK2V4dGVybiBpbnQgX194bWtub2RhdCAoaW50IF9fdmVyLCBpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3BhdGgsCisJCSAgICAgICBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgKl9fZGV2KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDMsIDUpKTsKKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gMiAmJiBkZWZpbmVkIF9fVVNFX0VYVEVSTl9JTkxJTkVTCisvKiBJbmxpbmVkIHZlcnNpb25zIG9mIHRoZSByZWFsIHN0YXQgYW5kIG1rbm9kIGZ1bmN0aW9ucy4gICovCisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChzdGF0IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX3hzdGF0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKworIyBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobHN0YXQgKF9fY29uc3QgY2hhciAqX19wYXRoLCBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fbHhzdGF0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKyMgZW5kaWYKKworX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX2Z4c3RhdCAoX1NUQVRfVkVSLCBfX2ZkLCBfX3N0YXRidWYpOworfQorCisjIGlmZGVmIF9fVVNFX0FURklMRQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKGZzdGF0YXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUsIHN0cnVjdCBzdGF0ICpfX3N0YXRidWYsCisJCWludCBfX2ZsYWcpKQoreworICByZXR1cm4gX19meHN0YXRhdCAoX1NUQVRfVkVSLCBfX2ZkLCBfX2ZpbGVuYW1lLCBfX3N0YXRidWYsIF9fZmxhZyk7Cit9CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfQlNECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobWtub2QgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21vZGVfdCBfX21vZGUsIF9fZGV2X3QgX19kZXYpKQoreworICByZXR1cm4gX194bWtub2QgKF9NS05PRF9WRVIsIF9fcGF0aCwgX19tb2RlLCAmX19kZXYpOworfQorIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0FURklMRQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKG1rbm9kYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlLAorCQlfX2Rldl90IF9fZGV2KSkKK3sKKyAgcmV0dXJuIF9feG1rbm9kYXQgKF9NS05PRF9WRVIsIF9fZmQsIF9fcGF0aCwgX19tb2RlLCAmX19kZXYpOworfQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgXAorICAmJiAoISBkZWZpbmVkIF9fVVNFX0ZJTEVfT0ZGU0VUNjQgXAorICAgICAgfHwgKGRlZmluZWQgX19SRURJUkVDVF9OVEggJiYgZGVmaW5lZCBfX09QVElNSVpFX18pKQorX19leHRlcm5faW5saW5lIGludAorX19OVEggKHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX3hzdGF0NjQgKF9TVEFUX1ZFUiwgX19wYXRoLCBfX3N0YXRidWYpOworfQorCisjICBpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAobHN0YXQ2NCAoX19jb25zdCBjaGFyICpfX3BhdGgsIHN0cnVjdCBzdGF0NjQgKl9fc3RhdGJ1ZikpCit7CisgIHJldHVybiBfX2x4c3RhdDY0IChfU1RBVF9WRVIsIF9fcGF0aCwgX19zdGF0YnVmKTsKK30KKyMgIGVuZGlmCisKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIIChmc3RhdDY0IChpbnQgX19mZCwgc3RydWN0IHN0YXQ2NCAqX19zdGF0YnVmKSkKK3sKKyAgcmV0dXJuIF9fZnhzdGF0NjQgKF9TVEFUX1ZFUiwgX19mZCwgX19zdGF0YnVmKTsKK30KKworIyAgaWZkZWYgX19VU0VfR05VCitfX2V4dGVybl9pbmxpbmUgaW50CitfX05USCAoZnN0YXRhdDY0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0ICpfX3N0YXRidWYsCisJCSAgaW50IF9fZmxhZykpCit7CisgIHJldHVybiBfX2Z4c3RhdGF0NjQgKF9TVEFUX1ZFUiwgX19mZCwgX19maWxlbmFtZSwgX19zdGF0YnVmLCBfX2ZsYWcpOworfQorIyAgZW5kaWYKKworIyBlbmRpZgorCisjZW5kaWYKKworX19FTkRfREVDTFMKKworCisjZW5kaWYgLyogc3lzL3N0YXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N0YXRmcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMjI2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N0YXRmcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIERlZmluaXRpb25zIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZXN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NUQVRGU19ICisjZGVmaW5lCV9TWVNfU1RBVEZTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogR2V0IHRoZSBzeXN0ZW0tc3BlY2lmaWMgZGVmaW5pdGlvbiBvZiBgc3RydWN0IHN0YXRmcycuICAqLworI2luY2x1ZGUgPGJpdHMvc3RhdGZzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIG9uIHdoaWNoIEZJTEUgcmVzaWRlcy4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgc3RhdGZzIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHN0YXRmcyAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXRmcywKKwkJCSAgIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgc3RydWN0IHN0YXRmcyAqX19idWYpLAorCQkJICAgc3RhdGZzNjQpIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyMgZWxzZQorIyAgZGVmaW5lIHN0YXRmcyBzdGF0ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgc3RhdGZzNjQgKF9fY29uc3QgY2hhciAqX19maWxlLCBzdHJ1Y3Qgc3RhdGZzNjQgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gY29udGFpbmluZyB0aGUgZmlsZSBGSUxERVMKKyAgIHJlZmVycyB0by4gICovCisjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgZnN0YXRmcyAoaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdGZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXRmcywgKGludCBfX2ZpbGRlcywgc3RydWN0IHN0YXRmcyAqX19idWYpLAorCQkJICAgZnN0YXRmczY0KSBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBmc3RhdGZzIGZzdGF0ZnM2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnN0YXRmczY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0ZnM2NCAqX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc3RhdGZzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N0YXR2ZnMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N0YXR2ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk2NjJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3RhdHZmcy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIERlZmluaXRpb25zIGZvciBnZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZXN5c3RlbS4KKyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NUQVRWRlNfSAorI2RlZmluZQlfU1lTX1NUQVRWRlNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgdGhlIHN5c3RlbS1zcGVjaWZpYyBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgc3RhdGZzJy4gICovCisjaW5jbHVkZSA8Yml0cy9zdGF0dmZzLmg+CisKKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorIyBpZm5kZWYgX19mc2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2Jsa2NudF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyMgIGRlZmluZSBfX2ZzZmlsY250X3RfZGVmaW5lZAorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIF9fZnNibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNibGtjbnQ2NF90IGZzYmxrY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2ZzYmxrY250X3RfZGVmaW5lZAorIyBlbmRpZgorIyBpZm5kZWYgX19mc2ZpbGNudF90X2RlZmluZWQKK3R5cGVkZWYgX19mc2ZpbGNudDY0X3QgZnNmaWxjbnRfdDsgLyogVHlwZSB0byBjb3VudCBmaWxlIHN5c3RlbSBpbm9kZXMuICAqLworIyAgZGVmaW5lIF9fZnNmaWxjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGVzeXN0ZW0gb24gd2hpY2ggRklMRSByZXNpZGVzLiAgKi8KKyNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBzdGF0dmZzIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAorCQkgICAgc3RydWN0IHN0YXR2ZnMgKl9fcmVzdHJpY3QgX19idWYpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSwgMikpOworI2Vsc2UKKyMgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHN0YXR2ZnMsCisJCQkgICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJCSAgICBzdHJ1Y3Qgc3RhdHZmcyAqX19yZXN0cmljdCBfX2J1ZiksIHN0YXR2ZnM2NCkKKyAgICAgX19ub25udWxsICgoMSwgMikpOworIyBlbHNlCisjICBkZWZpbmUgc3RhdHZmcyBzdGF0dmZzNjQKKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IHN0YXR2ZnM2NCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZSwKKwkJICAgICAgc3RydWN0IHN0YXR2ZnM2NCAqX19yZXN0cmljdCBfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisjZW5kaWYKKworLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgdGhlIGZpbGUgRklMREVTCisgICByZWZlcnMgdG8uICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gaW50IGZzdGF0dmZzIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzICpfX2J1ZikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSk7CisjZWxzZQorIyBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnN0YXR2ZnMsIChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzICpfX2J1ZiksCisJCQkgICBmc3RhdHZmczY0KSBfX25vbm51bGwgKCgyKSk7CisjIGVsc2UKKyMgIGRlZmluZSBmc3RhdHZmcyBmc3RhdHZmczY0CisjIGVuZGlmCisjZW5kaWYKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCBmc3RhdHZmczY0IChpbnQgX19maWxkZXMsIHN0cnVjdCBzdGF0dmZzNjQgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogc3lzL3N0YXR2ZnMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3Ryb3B0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3Ryb3B0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWJjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zdHJvcHRzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN0cm9wdHMuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N3YXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU3YmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3dhcC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENhbGxzIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBzd2FwcGluZyBvbiBzcGVjaWZpZWQgbG9jYXRpb25zLiAgTGludXggdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NXQVBfSAorCisjZGVmaW5lIF9TWVNfU1dBUF9ICTEKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBUaGUgc3dhcCBwcmlvcml0eSBpcyBlbmNvZGVkIGFzOgorICAgKHByaW8gPDwgU1dBUF9GTEFHX1BSSU9fU0hJRlQpICYgU1dBUF9GTEFHX1BSSU9fTUFTSworKi8KKyNkZWZpbmUJU1dBUF9GTEFHX1BSRUZFUgkweDgwMDAJLyogU2V0IGlmIHN3YXAgcHJpb3JpdHkgaXMgc3BlY2lmaWVkLiAqLworI2RlZmluZQlTV0FQX0ZMQUdfUFJJT19NQVNLCTB4N2ZmZgorI2RlZmluZQlTV0FQX0ZMQUdfUFJJT19TSElGVAkwCisKK19fQkVHSU5fREVDTFMKKworLyogTWFrZSB0aGUgYmxvY2sgc3BlY2lhbCBkZXZpY2UgUEFUSCBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbSBmb3Igc3dhcHBpbmcuCisgICBUaGlzIGNhbGwgaXMgcmVzdHJpY3RlZCB0byB0aGUgc3VwZXItdXNlci4gICovCitleHRlcm4gaW50IHN3YXBvbiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBTdG9wIHVzaW5nIGJsb2NrIHNwZWNpYWwgZGV2aWNlIFBBVEggZm9yIHN3YXBwaW5nLiAgKi8KK2V4dGVybiBpbnQgc3dhcG9mZiAoX19jb25zdCBjaGFyICpfX3BhdGgpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU1lTX1NXQVBfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3lzY2FsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3lzY2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NWNhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zeXNjYWxsLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNDQUxMX0gKKyNkZWZpbmUgX1NZU0NBTExfSAkxCisKKy8qIFRoaXMgZmlsZSBzaG91bGQgbGlzdCB0aGUgbnVtYmVycyBvZiB0aGUgc3lzdGVtIHRoZSBzeXN0ZW0ga25vd3MuCisgICBCdXQgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyB0aGlzIHdlIHVzZSB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlCisgICBmcm9tIHRoZSBrZXJuZWwgc291cmNlcy4gICovCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaWZuZGVmIF9MSUJDCisvKiBUaGUgTGludXgga2VybmVsIGhlYWRlciBmaWxlIGRlZmluZXMgbWFjcm9zIGBfX05SXzxuYW1lPicsIGJ1dCBzb21lCisgICBwcm9ncmFtcyBleHBlY3QgdGhlIHRyYWRpdGlvbmFsIGZvcm0gYFNZU188bmFtZT4nLiAgU28gaW4gYnVpbGRpbmcgbGliYworICAgd2Ugc2NhbiB0aGUga2VybmVsJ3MgbGlzdCBhbmQgcHJvZHVjZSA8Yml0cy9zeXNjYWxsLmg+IHdpdGggbWFjcm9zIGZvcgorICAgYWxsIHRoZSBgU1lTXycgbmFtZXMuICAqLworIyBpbmNsdWRlIDxiaXRzL3N5c2NhbGwuaD4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N5c2N0bC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3lzY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZWZhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N5c2N0bC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMiwgMjAwMywgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfU1lTX1NZU0NUTF9ICisjZGVmaW5lCV9TWVNfU1lTQ1RMX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNkZWZpbmUgX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorLyogUHJldmVudCBtb3JlIGtlcm5lbCBoZWFkZXJzIHRoYW4gbmVjZXNzYXJ5IHRvIGJlIGluY2x1ZGVkLiAgKi8KKyNpZm5kZWYgX0xJTlVYX0tFUk5FTF9ICisjIGRlZmluZSBfTElOVVhfS0VSTkVMX0gJMQorIyBkZWZpbmUgX191bmRlZl9MSU5VWF9LRVJORUxfSAorI2VuZGlmCisjaWZuZGVmIF9MSU5VWF9UWVBFU19ICisjIGRlZmluZSBfTElOVVhfVFlQRVNfSAkJMQorIyBkZWZpbmUgX191bmRlZl9MSU5VWF9UWVBFU19ICisjZW5kaWYKKyNpZm5kZWYgX0xJTlVYX0xJU1RfSAorIyBkZWZpbmUgX0xJTlVYX0xJU1RfSAkJMQorIyBkZWZpbmUgX191bmRlZl9MSU5VWF9MSVNUX0gKKyNlbmRpZgorI2lmbmRlZiBfX0xJTlVYX0NPTVBJTEVSX0gKKyMgZGVmaW5lIF9fTElOVVhfQ09NUElMRVJfSAkxCisjIGRlZmluZSBfX3VzZXIKKyMgZGVmaW5lIF9fdW5kZWZfX0xJTlVYX0NPTVBJTEVSX0gKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpZmRlZiBfX3VuZGVmX0xJTlVYX0tFUk5FTF9ICisjIHVuZGVmIF9MSU5VWF9LRVJORUxfSAorIyB1bmRlZiBfX3VuZGVmX0xJTlVYX0tFUk5FTF9ICisjZW5kaWYKKyNpZmRlZiBfX3VuZGVmX0xJTlVYX1RZUEVTX0gKKyMgdW5kZWYgX0xJTlVYX1RZUEVTX0gKKyMgdW5kZWYgX191bmRlZl9MSU5VWF9UWVBFU19ICisjZW5kaWYKKyNpZmRlZiBfX3VuZGVmX0xJTlVYX0xJU1RfSAorIyB1bmRlZiBfTElOVVhfTElTVF9ICisjIHVuZGVmIF9fdW5kZWZfTElOVVhfTElTVF9ICisjZW5kaWYKKyNpZmRlZiBfX3VuZGVmX19MSU5VWF9DT01QSUxFUl9ICisjIHVuZGVmIF9fTElOVVhfQ09NUElMRVJfSAorIyB1bmRlZiBfX3VzZXIKKyMgdW5kZWYgX191bmRlZl9fTElOVVhfQ09NUElMRVJfSAorI2VuZGlmCisKK19fQkVHSU5fREVDTFMKKworLyogUmVhZCBvciB3cml0ZSBzeXN0ZW0gcGFyYW1ldGVycy4gICovCitleHRlcm4gaW50IHN5c2N0bCAoaW50ICpfX25hbWUsIGludCBfX25sZW4sIHZvaWQgKl9fb2xkdmFsLAorCQkgICBzaXplX3QgKl9fb2xkbGVucCwgdm9pZCAqX19uZXd2YWwsIHNpemVfdCBfX25ld2xlbikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9TWVNfU1lTQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N5c2luZm8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N5c2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjcyN2IyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvc3lzaW5mby5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NZU0lORk9fSAorI2RlZmluZSBfU1lTX1NZU0lORk9fSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgc3lzaW5mbyBzdHJ1Y3R1cmUgZnJvbSBrZXJuZWwgaGVhZGVyLiAgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBSZXR1cm5zIGluZm9ybWF0aW9uIG9uIG92ZXJhbGwgc3lzdGVtIHN0YXRpc3RpY3MuICAqLworZXh0ZXJuIGludCBzeXNpbmZvIChzdHJ1Y3Qgc3lzaW5mbyAqX19pbmZvKSBfX1RIUk9XOworCisKKy8qIFJldHVybiBudW1iZXIgb2YgY29uZmlndXJlZCBwcm9jZXNzb3JzLiAgKi8KK2V4dGVybiBpbnQgZ2V0X25wcm9jc19jb25mICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzLiAgKi8KK2V4dGVybiBpbnQgZ2V0X25wcm9jcyAodm9pZCkgX19USFJPVzsKKworCisvKiBSZXR1cm4gbnVtYmVyIG9mIHBoeXNpY2FsIHBhZ2VzIG9mIG1lbW9yeSBpbiB0aGUgc3lzdGVtLiAgKi8KK2V4dGVybiBsb25nIGludCBnZXRfcGh5c19wYWdlcyAodm9pZCkgX19USFJPVzsKKworLyogUmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgcGh5c2ljYWwgcGFnZXMgb2YgbWVtb3J5IGluIHRoZSBzeXN0ZW0uICAqLworZXh0ZXJuIGxvbmcgaW50IGdldF9hdnBoeXNfcGFnZXMgKHZvaWQpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvc3lzaW5mby5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zeXNsb2cuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N5c2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGExY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zeXNsb2cuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylzeXNsb2cuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmIF9TWVNfU1lTTE9HX0gKKyNkZWZpbmUgX1NZU19TWVNMT0dfSCAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX25lZWRfX192YV9saXN0CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIF9QQVRIX0xPRy4gICovCisjaW5jbHVkZSA8Yml0cy9zeXNsb2ctcGF0aC5oPgorCisvKgorICogcHJpb3JpdGllcy9mYWNpbGl0aWVzIGFyZSBlbmNvZGVkIGludG8gYSBzaW5nbGUgMzItYml0IHF1YW50aXR5LCB3aGVyZSB0aGUKKyAqIGJvdHRvbSAzIGJpdHMgYXJlIHRoZSBwcmlvcml0eSAoMC03KSBhbmQgdGhlIHRvcCAyOCBiaXRzIGFyZSB0aGUgZmFjaWxpdHkKKyAqICgwLWJpZyBudW1iZXIpLiAgQm90aCB0aGUgcHJpb3JpdGllcyBhbmQgdGhlIGZhY2lsaXRpZXMgbWFwIHJvdWdobHkKKyAqIG9uZS10by1vbmUgdG8gc3RyaW5ncyBpbiB0aGUgc3lzbG9nZCg4KSBzb3VyY2UgY29kZS4gIFRoaXMgbWFwcGluZyBpcworICogaW5jbHVkZWQgaW4gdGhpcyBmaWxlLgorICoKKyAqIHByaW9yaXRpZXMgKHRoZXNlIGFyZSBvcmRlcmVkKQorICovCisjZGVmaW5lCUxPR19FTUVSRwkwCS8qIHN5c3RlbSBpcyB1bnVzYWJsZSAqLworI2RlZmluZQlMT0dfQUxFUlQJMQkvKiBhY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseSAqLworI2RlZmluZQlMT0dfQ1JJVAkyCS8qIGNyaXRpY2FsIGNvbmRpdGlvbnMgKi8KKyNkZWZpbmUJTE9HX0VSUgkJMwkvKiBlcnJvciBjb25kaXRpb25zICovCisjZGVmaW5lCUxPR19XQVJOSU5HCTQJLyogd2FybmluZyBjb25kaXRpb25zICovCisjZGVmaW5lCUxPR19OT1RJQ0UJNQkvKiBub3JtYWwgYnV0IHNpZ25pZmljYW50IGNvbmRpdGlvbiAqLworI2RlZmluZQlMT0dfSU5GTwk2CS8qIGluZm9ybWF0aW9uYWwgKi8KKyNkZWZpbmUJTE9HX0RFQlVHCTcJLyogZGVidWctbGV2ZWwgbWVzc2FnZXMgKi8KKworI2RlZmluZQlMT0dfUFJJTUFTSwkweDA3CS8qIG1hc2sgdG8gZXh0cmFjdCBwcmlvcml0eSBwYXJ0IChpbnRlcm5hbCkgKi8KKwkJCQkvKiBleHRyYWN0IHByaW9yaXR5ICovCisjZGVmaW5lCUxPR19QUkkocCkJKChwKSAmIExPR19QUklNQVNLKQorI2RlZmluZQlMT0dfTUFLRVBSSShmYWMsIHByaSkJKCgoZmFjKSA8PCAzKSB8IChwcmkpKQorCisjaWZkZWYgU1lTTE9HX05BTUVTCisjZGVmaW5lCUlOVEVSTkFMX05PUFJJCTB4MTAJLyogdGhlICJubyBwcmlvcml0eSIgcHJpb3JpdHkgKi8KKwkJCQkvKiBtYXJrICJmYWNpbGl0eSIgKi8KKyNkZWZpbmUJSU5URVJOQUxfTUFSSwlMT0dfTUFLRVBSSShMT0dfTkZBQ0lMSVRJRVMsIDApCit0eXBlZGVmIHN0cnVjdCBfY29kZSB7CisJY2hhcgkqY19uYW1lOworCWludAljX3ZhbDsKK30gQ09ERTsKKworQ09ERSBwcmlvcml0eW5hbWVzW10gPQorICB7CisgICAgeyAiYWxlcnQiLCBMT0dfQUxFUlQgfSwKKyAgICB7ICJjcml0IiwgTE9HX0NSSVQgfSwKKyAgICB7ICJkZWJ1ZyIsIExPR19ERUJVRyB9LAorICAgIHsgImVtZXJnIiwgTE9HX0VNRVJHIH0sCisgICAgeyAiZXJyIiwgTE9HX0VSUiB9LAorICAgIHsgImVycm9yIiwgTE9HX0VSUiB9LAkJLyogREVQUkVDQVRFRCAqLworICAgIHsgImluZm8iLCBMT0dfSU5GTyB9LAorICAgIHsgIm5vbmUiLCBJTlRFUk5BTF9OT1BSSSB9LAkJLyogSU5URVJOQUwgKi8KKyAgICB7ICJub3RpY2UiLCBMT0dfTk9USUNFIH0sCisgICAgeyAicGFuaWMiLCBMT0dfRU1FUkcgfSwJCS8qIERFUFJFQ0FURUQgKi8KKyAgICB7ICJ3YXJuIiwgTE9HX1dBUk5JTkcgfSwJCS8qIERFUFJFQ0FURUQgKi8KKyAgICB7ICJ3YXJuaW5nIiwgTE9HX1dBUk5JTkcgfSwKKyAgICB7IE5VTEwsIC0xIH0KKyAgfTsKKyNlbmRpZgorCisvKiBmYWNpbGl0eSBjb2RlcyAqLworI2RlZmluZQlMT0dfS0VSTgkoMDw8MykJLyoga2VybmVsIG1lc3NhZ2VzICovCisjZGVmaW5lCUxPR19VU0VSCSgxPDwzKQkvKiByYW5kb20gdXNlci1sZXZlbCBtZXNzYWdlcyAqLworI2RlZmluZQlMT0dfTUFJTAkoMjw8MykJLyogbWFpbCBzeXN0ZW0gKi8KKyNkZWZpbmUJTE9HX0RBRU1PTgkoMzw8MykJLyogc3lzdGVtIGRhZW1vbnMgKi8KKyNkZWZpbmUJTE9HX0FVVEgJKDQ8PDMpCS8qIHNlY3VyaXR5L2F1dGhvcml6YXRpb24gbWVzc2FnZXMgKi8KKyNkZWZpbmUJTE9HX1NZU0xPRwkoNTw8MykJLyogbWVzc2FnZXMgZ2VuZXJhdGVkIGludGVybmFsbHkgYnkgc3lzbG9nZCAqLworI2RlZmluZQlMT0dfTFBSCQkoNjw8MykJLyogbGluZSBwcmludGVyIHN1YnN5c3RlbSAqLworI2RlZmluZQlMT0dfTkVXUwkoNzw8MykJLyogbmV0d29yayBuZXdzIHN1YnN5c3RlbSAqLworI2RlZmluZQlMT0dfVVVDUAkoODw8MykJLyogVVVDUCBzdWJzeXN0ZW0gKi8KKyNkZWZpbmUJTE9HX0NST04JKDk8PDMpCS8qIGNsb2NrIGRhZW1vbiAqLworI2RlZmluZQlMT0dfQVVUSFBSSVYJKDEwPDwzKQkvKiBzZWN1cml0eS9hdXRob3JpemF0aW9uIG1lc3NhZ2VzIChwcml2YXRlKSAqLworI2RlZmluZQlMT0dfRlRQCQkoMTE8PDMpCS8qIGZ0cCBkYWVtb24gKi8KKworCS8qIG90aGVyIGNvZGVzIHRocm91Z2ggMTUgcmVzZXJ2ZWQgZm9yIHN5c3RlbSB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMMAkoMTY8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMMQkoMTc8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMMgkoMTg8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMMwkoMTk8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMNAkoMjA8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMNQkoMjE8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMNgkoMjI8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKyNkZWZpbmUJTE9HX0xPQ0FMNwkoMjM8PDMpCS8qIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgKi8KKworI2RlZmluZQlMT0dfTkZBQ0lMSVRJRVMJMjQJLyogY3VycmVudCBudW1iZXIgb2YgZmFjaWxpdGllcyAqLworI2RlZmluZQlMT0dfRkFDTUFTSwkweDAzZjgJLyogbWFzayB0byBleHRyYWN0IGZhY2lsaXR5IHBhcnQgKi8KKwkJCQkvKiBmYWNpbGl0eSBvZiBwcmkgKi8KKyNkZWZpbmUJTE9HX0ZBQyhwKQkoKChwKSAmIExPR19GQUNNQVNLKSA+PiAzKQorCisjaWZkZWYgU1lTTE9HX05BTUVTCitDT0RFIGZhY2lsaXR5bmFtZXNbXSA9CisgIHsKKyAgICB7ICJhdXRoIiwgTE9HX0FVVEggfSwKKyAgICB7ICJhdXRocHJpdiIsIExPR19BVVRIUFJJViB9LAorICAgIHsgImNyb24iLCBMT0dfQ1JPTiB9LAorICAgIHsgImRhZW1vbiIsIExPR19EQUVNT04gfSwKKyAgICB7ICJmdHAiLCBMT0dfRlRQIH0sCisgICAgeyAia2VybiIsIExPR19LRVJOIH0sCisgICAgeyAibHByIiwgTE9HX0xQUiB9LAorICAgIHsgIm1haWwiLCBMT0dfTUFJTCB9LAorICAgIHsgIm1hcmsiLCBJTlRFUk5BTF9NQVJLIH0sCQkvKiBJTlRFUk5BTCAqLworICAgIHsgIm5ld3MiLCBMT0dfTkVXUyB9LAorICAgIHsgInNlY3VyaXR5IiwgTE9HX0FVVEggfSwJCS8qIERFUFJFQ0FURUQgKi8KKyAgICB7ICJzeXNsb2ciLCBMT0dfU1lTTE9HIH0sCisgICAgeyAidXNlciIsIExPR19VU0VSIH0sCisgICAgeyAidXVjcCIsIExPR19VVUNQIH0sCisgICAgeyAibG9jYWwwIiwgTE9HX0xPQ0FMMCB9LAorICAgIHsgImxvY2FsMSIsIExPR19MT0NBTDEgfSwKKyAgICB7ICJsb2NhbDIiLCBMT0dfTE9DQUwyIH0sCisgICAgeyAibG9jYWwzIiwgTE9HX0xPQ0FMMyB9LAorICAgIHsgImxvY2FsNCIsIExPR19MT0NBTDQgfSwKKyAgICB7ICJsb2NhbDUiLCBMT0dfTE9DQUw1IH0sCisgICAgeyAibG9jYWw2IiwgTE9HX0xPQ0FMNiB9LAorICAgIHsgImxvY2FsNyIsIExPR19MT0NBTDcgfSwKKyAgICB7IE5VTEwsIC0xIH0KKyAgfTsKKyNlbmRpZgorCisvKgorICogYXJndW1lbnRzIHRvIHNldGxvZ21hc2suCisgKi8KKyNkZWZpbmUJTE9HX01BU0socHJpKQkoMSA8PCAocHJpKSkJCS8qIG1hc2sgZm9yIG9uZSBwcmlvcml0eSAqLworI2RlZmluZQlMT0dfVVBUTyhwcmkpCSgoMSA8PCAoKHByaSkrMSkpIC0gMSkJLyogYWxsIHByaW9yaXRpZXMgdGhyb3VnaCBwcmkgKi8KKworLyoKKyAqIE9wdGlvbiBmbGFncyBmb3Igb3BlbmxvZy4KKyAqCisgKiBMT0dfT0RFTEFZIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLgorICogTE9HX05ERUxBWSBpcyB0aGUgaW52ZXJzZSBvZiB3aGF0IGl0IHVzZWQgdG8gYmUuCisgKi8KKyNkZWZpbmUJTE9HX1BJRAkJMHgwMQkvKiBsb2cgdGhlIHBpZCB3aXRoIGVhY2ggbWVzc2FnZSAqLworI2RlZmluZQlMT0dfQ09OUwkweDAyCS8qIGxvZyBvbiB0aGUgY29uc29sZSBpZiBlcnJvcnMgaW4gc2VuZGluZyAqLworI2RlZmluZQlMT0dfT0RFTEFZCTB4MDQJLyogZGVsYXkgb3BlbiB1bnRpbCBmaXJzdCBzeXNsb2coKSAoZGVmYXVsdCkgKi8KKyNkZWZpbmUJTE9HX05ERUxBWQkweDA4CS8qIGRvbid0IGRlbGF5IG9wZW4gKi8KKyNkZWZpbmUJTE9HX05PV0FJVAkweDEwCS8qIGRvbid0IHdhaXQgZm9yIGNvbnNvbGUgZm9ya3M6IERFUFJFQ0FURUQgKi8KKyNkZWZpbmUJTE9HX1BFUlJPUgkweDIwCS8qIGxvZyB0byBzdGRlcnIgYXMgd2VsbCAqLworCitfX0JFR0lOX0RFQ0xTCisKKy8qIENsb3NlIGRlc2NyaXB0b3IgdXNlZCB0byB3cml0ZSB0byBzeXN0ZW0gbG9nZ2VyLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGNsb3NlbG9nICh2b2lkKTsKKworLyogT3BlbiBjb25uZWN0aW9uIHRvIHN5c3RlbSBsb2dnZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgb3BlbmxvZyAoX19jb25zdCBjaGFyICpfX2lkZW50LCBpbnQgX19vcHRpb24sIGludCBfX2ZhY2lsaXR5KTsKKworLyogU2V0IHRoZSBsb2cgbWFzayBsZXZlbC4gICovCitleHRlcm4gaW50IHNldGxvZ21hc2sgKGludCBfX21hc2spIF9fVEhST1c7CisKKy8qIEdlbmVyYXRlIGEgbG9nIG1lc3NhZ2UgdXNpbmcgRk1UIHN0cmluZyBhbmQgb3B0aW9uIGFyZ3VtZW50cy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBzeXNsb2cgKGludCBfX3ByaSwgX19jb25zdCBjaGFyICpfX2ZtdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMiwgMykpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogR2VuZXJhdGUgYSBsb2cgbWVzc2FnZSB1c2luZyBGTVQgYW5kIHVzaW5nIGFyZ3VtZW50cyBwb2ludGVkIHRvIGJ5IEFQLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCB2c3lzbG9nIChpbnQgX19wcmksIF9fY29uc3QgY2hhciAqX19mbXQsIF9fZ251Y192YV9saXN0IF9fYXApCisgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAwKSkpOworI2VuZGlmCisKKworLyogRGVmaW5lIHNvbWUgbWFjcm9zIGhlbHBpbmcgdG8gY2F0Y2ggYnVmZmVyIG92ZXJmbG93cy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjIGluY2x1ZGUgPGJpdHMvc3lzbG9nLmg+CisjZW5kaWYKKyNpZmRlZiBfX0xEQkxfQ09NUEFUCisjIGluY2x1ZGUgPGJpdHMvc3lzbG9nLWxkYmwuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3N5c2xvZy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjNhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy9zeXNtYWNyb3MuaApAQCAtMCwwICsxLDcwIEBACisvKiBEZWZpbml0aW9ucyBvZiBtYWNyb3MgdG8gYWNjZXNzIGBkZXZfdCcgdmFsdWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk5LCAyMDAzLCAyMDA0LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1NZU01BQ1JPU19ICisjZGVmaW5lIF9TWVNfU1lTTUFDUk9TX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogSWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGtub3cgbG9uZyBsb25nIGl0IGlzIG91dCBvZiBsdWNrLiAgV2UgYXJlCisgICBub3QgZ29pbmcgdG8gaGFjayB3ZWlyZCBoYWNrcyB0byBzdXBwb3J0IHRoZSBkZXZfdCByZXByZXNlbnRhdGlvbgorICAgdGhleSBuZWVkLiAgKi8KKyNpZmRlZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgaW50IGdudV9kZXZfbWFqb3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpCisgICAgIF9fVEhST1c7CitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgaW50IGdudV9kZXZfbWlub3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpCisgICAgIF9fVEhST1c7CitfX2V4dGVuc2lvbl9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBnbnVfZGV2X21ha2VkZXYgKHVuc2lnbmVkIGludCBfX21ham9yLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IF9fbWlub3IpCisgICAgIF9fVEhST1c7CisKKyMgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAyICYmIGRlZmluZWQgX19VU0VfRVhURVJOX0lOTElORVMKK19fZXh0ZW5zaW9uX18gX19leHRlcm5faW5saW5lIHVuc2lnbmVkIGludAorX19OVEggKGdudV9kZXZfbWFqb3IgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19kZXYpKQoreworICByZXR1cm4gKChfX2RldiA+PiA4KSAmIDB4ZmZmKSB8ICgodW5zaWduZWQgaW50KSAoX19kZXYgPj4gMzIpICYgfjB4ZmZmKTsKK30KKworX19leHRlbnNpb25fXyBfX2V4dGVybl9pbmxpbmUgdW5zaWduZWQgaW50CitfX05USCAoZ251X2Rldl9taW5vciAodW5zaWduZWQgbG9uZyBsb25nIGludCBfX2RldikpCit7CisgIHJldHVybiAoX19kZXYgJiAweGZmKSB8ICgodW5zaWduZWQgaW50KSAoX19kZXYgPj4gMTIpICYgfjB4ZmYpOworfQorCitfX2V4dGVuc2lvbl9fIF9fZXh0ZXJuX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgaW50CitfX05USCAoZ251X2Rldl9tYWtlZGV2ICh1bnNpZ25lZCBpbnQgX19tYWpvciwgdW5zaWduZWQgaW50IF9fbWlub3IpKQoreworICByZXR1cm4gKChfX21pbm9yICYgMHhmZikgfCAoKF9fbWFqb3IgJiAweGZmZikgPDwgOCkKKwkgIHwgKCgodW5zaWduZWQgbG9uZyBsb25nIGludCkgKF9fbWlub3IgJiB+MHhmZikpIDw8IDEyKQorCSAgfCAoKCh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSAoX19tYWpvciAmIH4weGZmZikpIDw8IDMyKSk7Cit9CisjIGVuZGlmCisKKworLyogQWNjZXNzIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGVpciB0cmFkaXRpb25hbCBuYW1lcy4gICovCisjIGRlZmluZSBtYWpvcihkZXYpIGdudV9kZXZfbWFqb3IgKGRldikKKyMgZGVmaW5lIG1pbm9yKGRldikgZ251X2Rldl9taW5vciAoZGV2KQorIyBkZWZpbmUgbWFrZWRldihtYWosIG1pbikgZ251X2Rldl9tYWtlZGV2IChtYWosIG1pbikKKyNlbmRpZgorCisjZW5kaWYgLyogc3lzL3N5c21hY3Jvcy5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy90ZXJtaW9zLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxODgwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Rlcm1pb3MuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX1NZU19URVJNSU9TX0gKKyNkZWZpbmUgX1NZU19URVJNSU9TX0gKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3RpbWUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc2OTZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdGltZS5oCkBAIC0wLDAgKzEsMTkzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwxOTk2LTIwMDIsMjAwMywyMDA1LDIwMDYKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1RJTUVfSAorI2RlZmluZSBfU1lTX1RJTUVfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorI2RlZmluZSBfX25lZWRfdGltZXZhbAorI2luY2x1ZGUgPGJpdHMvdGltZS5oPgorCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisjaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyBkZWZpbmUgX19zdXNlY29uZHNfdF9kZWZpbmVkCisjZW5kaWYKKworCitfX0JFR0lOX0RFQ0xTCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE1hY3JvcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGBzdHJ1Y3QgdGltZXZhbCcgYW5kIGBzdHJ1Y3QgdGltZXNwZWMnLiAgKi8KKyMgZGVmaW5lIFRJTUVWQUxfVE9fVElNRVNQRUModHYsIHRzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0cyktPnR2X3NlYyA9ICh0diktPnR2X3NlYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh0cyktPnR2X25zZWMgPSAodHYpLT50dl91c2VjICogMTAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjIGRlZmluZSBUSU1FU1BFQ19UT19USU1FVkFMKHR2LCB0cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodHYpLT50dl9zZWMgPSAodHMpLT50dl9zZWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodHYpLT50dl91c2VjID0gKHRzKS0+dHZfbnNlYyAvIDEwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU3RydWN0dXJlIGNydWRlbHkgcmVwcmVzZW50aW5nIGEgdGltZXpvbmUuCisgICBUaGlzIGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCitzdHJ1Y3QgdGltZXpvbmUKKyAgeworICAgIGludCB0el9taW51dGVzd2VzdDsJCS8qIE1pbnV0ZXMgd2VzdCBvZiBHTVQuICAqLworICAgIGludCB0el9kc3R0aW1lOwkJLyogTm9uemVybyBpZiBEU1QgaXMgZXZlciBpbiBlZmZlY3QuICAqLworICB9OworCit0eXBlZGVmIHN0cnVjdCB0aW1lem9uZSAqX19yZXN0cmljdCBfX3RpbWV6b25lX3B0cl90OworI2Vsc2UKK3R5cGVkZWYgdm9pZCAqX19yZXN0cmljdCBfX3RpbWV6b25lX3B0cl90OworI2VuZGlmCisKKy8qIEdldCB0aGUgY3VycmVudCB0aW1lIG9mIGRheSBhbmQgdGltZXpvbmUgaW5mb3JtYXRpb24sCisgICBwdXR0aW5nIGl0IGludG8gKlRWIGFuZCAqVFouICBJZiBUWiBpcyBOVUxMLCAqVFogaXMgbm90IGZpbGxlZC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuCisgICBOT1RFOiBUaGlzIGZvcm0gb2YgdGltZXpvbmUgaW5mb3JtYXRpb24gaXMgb2Jzb2xldGUuCisgICBVc2UgdGhlIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIGluIDx0aW1lLmg+IGluc3RlYWQuICAqLworZXh0ZXJuIGludCBnZXR0aW1lb2ZkYXkgKHN0cnVjdCB0aW1ldmFsICpfX3Jlc3RyaWN0IF9fdHYsCisJCQkgX190aW1lem9uZV9wdHJfdCBfX3R6KSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0JTRAorLyogU2V0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGFuZCB0aW1lem9uZSBpbmZvcm1hdGlvbi4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0dGltZW9mZGF5IChfX2NvbnN0IHN0cnVjdCB0aW1ldmFsICpfX3R2LAorCQkJIF9fY29uc3Qgc3RydWN0IHRpbWV6b25lICpfX3R6KQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogQWRqdXN0IHRoZSBjdXJyZW50IHRpbWUgb2YgZGF5IGJ5IHRoZSBhbW91bnQgaW4gREVMVEEuCisgICBJZiBPTERERUxUQSBpcyBub3QgTlVMTCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIGFtb3VudAorICAgb2YgdGltZSBhZGp1c3RtZW50IHJlbWFpbmluZyB0byBiZSBkb25lIGZyb20gdGhlIGxhc3QgYGFkanRpbWUnIGNhbGwuCisgICBUaGlzIGNhbGwgaXMgcmVzdHJpY3RlZCB0byB0aGUgc3VwZXItdXNlci4gICovCitleHRlcm4gaW50IGFkanRpbWUgKF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fZGVsdGEsCisJCSAgICBzdHJ1Y3QgdGltZXZhbCAqX19vbGRkZWx0YSkgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIFZhbHVlcyBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBnZXRpdGltZXInIGFuZCBgc2V0aXRpbWVyJy4gICovCitlbnVtIF9faXRpbWVyX3doaWNoCisgIHsKKyAgICAvKiBUaW1lcnMgcnVuIGluIHJlYWwgdGltZS4gICovCisgICAgSVRJTUVSX1JFQUwgPSAwLAorI2RlZmluZSBJVElNRVJfUkVBTCBJVElNRVJfUkVBTAorICAgIC8qIFRpbWVycyBydW4gb25seSB3aGVuIHRoZSBwcm9jZXNzIGlzIGV4ZWN1dGluZy4gICovCisgICAgSVRJTUVSX1ZJUlRVQUwgPSAxLAorI2RlZmluZSBJVElNRVJfVklSVFVBTCBJVElNRVJfVklSVFVBTAorICAgIC8qIFRpbWVycyBydW4gd2hlbiB0aGUgcHJvY2VzcyBpcyBleGVjdXRpbmcgYW5kIHdoZW4KKyAgICAgICB0aGUgc3lzdGVtIGlzIGV4ZWN1dGluZyBvbiBiZWhhbGYgb2YgdGhlIHByb2Nlc3MuICAqLworICAgIElUSU1FUl9QUk9GID0gMgorI2RlZmluZSBJVElNRVJfUFJPRiBJVElNRVJfUFJPRgorICB9OworCisvKiBUeXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGdldGl0aW1lcicgYW5kCisgICB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudHMgYHNldGl0aW1lcicuICAqLworc3RydWN0IGl0aW1lcnZhbAorICB7CisgICAgLyogVmFsdWUgdG8gcHV0IGludG8gYGl0X3ZhbHVlJyB3aGVuIHRoZSB0aW1lciBleHBpcmVzLiAgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCBpdF9pbnRlcnZhbDsKKyAgICAvKiBUaW1lIHRvIHRoZSBuZXh0IHRpbWVyIGV4cGlyYXRpb24uICAqLworICAgIHN0cnVjdCB0aW1ldmFsIGl0X3ZhbHVlOworICB9OworCisjaWYgZGVmaW5lZCBfX1VTRV9HTlUgJiYgIWRlZmluZWQgX19jcGx1c3BsdXMKKy8qIFVzZSB0aGUgbmljZXIgcGFyYW1ldGVyIHR5cGUgb25seSBpbiBHTlUgbW9kZSBhbmQgbm90IGZvciBDKysgc2luY2UgdGhlCisgICBzdHJpY3QgQysrIHJ1bGVzIHByZXZlbnQgdGhlIGF1dG9tYXRpYyBwcm9tb3Rpb24uICAqLwordHlwZWRlZiBlbnVtIF9faXRpbWVyX3doaWNoIF9faXRpbWVyX3doaWNoX3Q7CisjZWxzZQordHlwZWRlZiBpbnQgX19pdGltZXJfd2hpY2hfdDsKKyNlbmRpZgorCisvKiBTZXQgKlZBTFVFIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGltZXIgV0hJQ0guCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBnZXRpdGltZXIgKF9faXRpbWVyX3doaWNoX3QgX193aGljaCwKKwkJICAgICAgc3RydWN0IGl0aW1lcnZhbCAqX192YWx1ZSkgX19USFJPVzsKKworLyogU2V0IHRoZSB0aW1lciBXSElDSCB0byAqTkVXLiAgSWYgT0xEIGlzIG5vdCBOVUxMLAorICAgc2V0ICpPTEQgdG8gdGhlIG9sZCB2YWx1ZSBvZiB0aW1lciBXSElDSC4KKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBzZXRpdGltZXIgKF9faXRpbWVyX3doaWNoX3QgX193aGljaCwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgaXRpbWVydmFsICpfX3Jlc3RyaWN0IF9fbmV3LAorCQkgICAgICBzdHJ1Y3QgaXRpbWVydmFsICpfX3Jlc3RyaWN0IF9fb2xkKSBfX1RIUk9XOworCisvKiBDaGFuZ2UgdGhlIGFjY2VzcyB0aW1lIG9mIEZJTEUgdG8gVFZQWzBdIGFuZCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YKKyAgIEZJTEUgdG8gVFZQWzFdLiAgSWYgVFZQIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkLgorICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9ycy4gICovCitleHRlcm4gaW50IHV0aW1lcyAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisjaWZkZWYgX19VU0VfQlNECisvKiBTYW1lIGFzIGB1dGltZXMnLCBidXQgZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KK2V4dGVybiBpbnQgbHV0aW1lcyAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3Qgc3RydWN0IHRpbWV2YWwgX190dnBbMl0pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBTYW1lIGFzIGB1dGltZXMnLCBidXQgdGFrZXMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiBhIG5hbWUuICAqLworZXh0ZXJuIGludCBmdXRpbWVzIChpbnQgX19mZCwgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkgX19USFJPVzsKKyNlbmRpZgorCisjaWZkZWYgX19VU0VfQVRGSUxFCisvKiBDaGFuZ2UgdGhlIGFjY2VzcyB0aW1lIG9mIEZJTEUgcmVsYXRpdmUgdG8gRkQgdG8gVFZQWzBdIGFuZCB0aGUKKyAgIG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUgdG8gVFZQWzFdLiAgSWYgVFZQIGlzIGEgbnVsbCBwb2ludGVyLCB1c2UKKyAgIHRoZSBjdXJyZW50IHRpbWUgaW5zdGVhZC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcnMuICAqLworZXh0ZXJuIGludCBmdXRpbWVzYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdGltZXZhbCBfX3R2cFsyXSkgX19USFJPVzsKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIENvbnZlbmllbmNlIG1hY3JvcyBmb3Igb3BlcmF0aW9ucyBvbiB0aW1ldmFscy4KKyAgIE5PVEU6IGB0aW1lcmNtcCcgZG9lcyBub3Qgd29yayBmb3IgPj0gb3IgPD0uICAqLworIyBkZWZpbmUgdGltZXJpc3NldCh0dnApCSgodHZwKS0+dHZfc2VjIHx8ICh0dnApLT50dl91c2VjKQorIyBkZWZpbmUgdGltZXJjbGVhcih0dnApCSgodHZwKS0+dHZfc2VjID0gKHR2cCktPnR2X3VzZWMgPSAwKQorIyBkZWZpbmUgdGltZXJjbXAoYSwgYiwgQ01QKSAJCQkJCQkgICAgICBcCisgICgoKGEpLT50dl9zZWMgPT0gKGIpLT50dl9zZWMpID8gCQkJCQkgICAgICBcCisgICAoKGEpLT50dl91c2VjIENNUCAoYiktPnR2X3VzZWMpIDogCQkJCQkgICAgICBcCisgICAoKGEpLT50dl9zZWMgQ01QIChiKS0+dHZfc2VjKSkKKyMgZGVmaW5lIHRpbWVyYWRkKGEsIGIsIHJlc3VsdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjICsgKGIpLT50dl9zZWM7CQkJICAgICAgXAorICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjICsgKGIpLT50dl91c2VjOwkJCSAgICAgIFwKKyAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPj0gMTAwMDAwMCkJCQkJCSAgICAgIFwKKyAgICAgIHsJCQkJCQkJCQkgICAgICBcCisJKysocmVzdWx0KS0+dHZfc2VjOwkJCQkJCSAgICAgIFwKKwkocmVzdWx0KS0+dHZfdXNlYyAtPSAxMDAwMDAwOwkJCQkJICAgICAgXAorICAgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHRpbWVyc3ViKGEsIGIsIHJlc3VsdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgKHJlc3VsdCktPnR2X3NlYyA9IChhKS0+dHZfc2VjIC0gKGIpLT50dl9zZWM7CQkJICAgICAgXAorICAgIChyZXN1bHQpLT50dl91c2VjID0gKGEpLT50dl91c2VjIC0gKGIpLT50dl91c2VjOwkJCSAgICAgIFwKKyAgICBpZiAoKHJlc3VsdCktPnR2X3VzZWMgPCAwKSB7CQkJCQkgICAgICBcCisgICAgICAtLShyZXN1bHQpLT50dl9zZWM7CQkJCQkJICAgICAgXAorICAgICAgKHJlc3VsdCktPnR2X3VzZWMgKz0gMTAwMDAwMDsJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmCS8qIEJTRCAqLworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3RpbWUuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdGltZWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3RpbWViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJkYmY0NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3RpbWViLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVElNRUJfSAorI2RlZmluZSBfU1lTX1RJTUVCX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZSBfX25lZWRfdGltZV90CisjaW5jbHVkZSA8dGltZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIHJldHVybmVkIGJ5IHRoZSBgZnRpbWUnIGZ1bmN0aW9uLiAgKi8KKworc3RydWN0IHRpbWViCisgIHsKKyAgICB0aW1lX3QgdGltZTsJCS8qIFNlY29uZHMgc2luY2UgZXBvY2gsIGFzIGZyb20gYHRpbWUnLiAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgbWlsbGl0bTsJLyogQWRkaXRpb25hbCBtaWxsaXNlY29uZHMuICAqLworICAgIHNob3J0IGludCB0aW1lem9uZTsJCS8qIE1pbnV0ZXMgd2VzdCBvZiBHTVQuICAqLworICAgIHNob3J0IGludCBkc3RmbGFnOwkJLyogTm9uemVybyBpZiBEYXlsaWdodCBTYXZpbmdzIFRpbWUgdXNlZC4gICovCisgIH07CisKKy8qIEZpbGwgaW4gVElNRUJVRiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHRpbWUuICAqLworCitleHRlcm4gaW50IGZ0aW1lIChzdHJ1Y3QgdGltZWIgKl9fdGltZWJ1Zik7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvdGltZWIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdGltZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3RpbWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMmYyZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3RpbWVzLmgKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDQuNS4yIFByb2Nlc3MgVGltZXMJPHN5cy90aW1lcy5oPgorICovCisKKyNpZm5kZWYJX1NZU19USU1FU19ICisjZGVmaW5lCV9TWVNfVElNRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZGVmaW5lCV9fbmVlZF9jbG9ja190CisjaW5jbHVkZSA8dGltZS5oPgorCisKK19fQkVHSU5fREVDTFMKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgQ1BVIHRpbWUgdXNlZCBieSBhIHByb2Nlc3MgYW5kIGl0cyBjaGlsZHJlbi4gICovCitzdHJ1Y3QgdG1zCisgIHsKKyAgICBjbG9ja190IHRtc191dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUuICAqLworICAgIGNsb2NrX3QgdG1zX3N0aW1lOwkJLyogU3lzdGVtIENQVSB0aW1lLiAgKi8KKworICAgIGNsb2NrX3QgdG1zX2N1dGltZTsJCS8qIFVzZXIgQ1BVIHRpbWUgb2YgZGVhZCBjaGlsZHJlbi4gICovCisgICAgY2xvY2tfdCB0bXNfY3N0aW1lOwkJLyogU3lzdGVtIENQVSB0aW1lIG9mIGRlYWQgY2hpbGRyZW4uICAqLworICB9OworCisKKy8qIFN0b3JlIHRoZSBDUFUgdGltZSB1c2VkIGJ5IHRoaXMgcHJvY2VzcyBhbmQgYWxsIGl0cworICAgZGVhZCBjaGlsZHJlbiAoYW5kIHRoZWlyIGRlYWQgY2hpbGRyZW4pIGluIEJVRkZFUi4KKyAgIFJldHVybiB0aGUgZWxhcHNlZCByZWFsIHRpbWUsIG9yIChjbG9ja190KSAtMSBmb3IgZXJyb3JzLgorICAgQWxsIHRpbWVzIGFyZSBpbiBDTEtfVENLdGhzIG9mIGEgc2Vjb25kLiAgKi8KK2V4dGVybiBjbG9ja190IHRpbWVzIChzdHJ1Y3QgdG1zICpfX2J1ZmZlcikgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90aW1lcy5oCSovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy90aW1leC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNhNWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdGltZXguaApAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVElNRVhfSAorI2RlZmluZQlfU1lTX1RJTUVYX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisvKiBUaGVzZSBkZWZpbml0aW9ucyBmcm9tIGxpbnV4L3RpbWV4LmggYXMgb2YgMi4yLjAuICAqLworCitzdHJ1Y3QgbnRwdGltZXZhbAoreworICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwkvKiBjdXJyZW50IHRpbWUgKHJvKSAqLworICBsb25nIGludCBtYXhlcnJvcjsJLyogbWF4aW11bSBlcnJvciAodXMpIChybykgKi8KKyAgbG9uZyBpbnQgZXN0ZXJyb3I7CS8qIGVzdGltYXRlZCBlcnJvciAodXMpIChybykgKi8KK307CisKK3N0cnVjdCB0aW1leAoreworICB1bnNpZ25lZCBpbnQgbW9kZXM7CS8qIG1vZGUgc2VsZWN0b3IgKi8KKyAgbG9uZyBpbnQgb2Zmc2V0OwkvKiB0aW1lIG9mZnNldCAodXNlYykgKi8KKyAgbG9uZyBpbnQgZnJlcTsJLyogZnJlcXVlbmN5IG9mZnNldCAoc2NhbGVkIHBwbSkgKi8KKyAgbG9uZyBpbnQgbWF4ZXJyb3I7CS8qIG1heGltdW0gZXJyb3IgKHVzZWMpICovCisgIGxvbmcgaW50IGVzdGVycm9yOwkvKiBlc3RpbWF0ZWQgZXJyb3IgKHVzZWMpICovCisgIGludCBzdGF0dXM7CQkvKiBjbG9jayBjb21tYW5kL3N0YXR1cyAqLworICBsb25nIGludCBjb25zdGFudDsJLyogcGxsIHRpbWUgY29uc3RhbnQgKi8KKyAgbG9uZyBpbnQgcHJlY2lzaW9uOwkvKiBjbG9jayBwcmVjaXNpb24gKHVzZWMpIChyZWFkIG9ubHkpICovCisgIGxvbmcgaW50IHRvbGVyYW5jZTsJLyogY2xvY2sgZnJlcXVlbmN5IHRvbGVyYW5jZSAocHBtKSAocmVhZCBvbmx5KSAqLworICBzdHJ1Y3QgdGltZXZhbCB0aW1lOwkvKiAocmVhZCBvbmx5KSAqLworICBsb25nIGludCB0aWNrOwkvKiAobW9kaWZpZWQpIHVzZWNzIGJldHdlZW4gY2xvY2sgdGlja3MgKi8KKworICBsb25nIGludCBwcHNmcmVxOwkvKiBwcHMgZnJlcXVlbmN5IChzY2FsZWQgcHBtKSAocm8pICovCisgIGxvbmcgaW50IGppdHRlcjsJLyogcHBzIGppdHRlciAodXMpIChybykgKi8KKyAgaW50IHNoaWZ0OwkJLyogaW50ZXJ2YWwgZHVyYXRpb24gKHMpIChzaGlmdCkgKHJvKSAqLworICBsb25nIGludCBzdGFiaWw7CS8qIHBwcyBzdGFiaWxpdHkgKHNjYWxlZCBwcG0pIChybykgKi8KKyAgbG9uZyBpbnQgaml0Y250OwkvKiBqaXR0ZXIgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworICBsb25nIGludCBjYWxjbnQ7CS8qIGNhbGlicmF0aW9uIGludGVydmFscyAocm8pICovCisgIGxvbmcgaW50IGVycmNudDsJLyogY2FsaWJyYXRpb24gZXJyb3JzIChybykgKi8KKyAgbG9uZyBpbnQgc3RiY250OwkvKiBzdGFiaWxpdHkgbGltaXQgZXhjZWVkZWQgKHJvKSAqLworCisgIC8qID8/PyAqLworICBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsKKyAgaW50ICA6MzI7IGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7CisgIGludCAgOjMyOyBpbnQgIDozMjsgaW50ICA6MzI7IGludCAgOjMyOworfTsKKworLyogTW9kZSBjb2RlcyAodGltZXgubW9kZSkgKi8KKyNkZWZpbmUgQURKX09GRlNFVAkJMHgwMDAxCS8qIHRpbWUgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9GUkVRVUVOQ1kJCTB4MDAwMgkvKiBmcmVxdWVuY3kgb2Zmc2V0ICovCisjZGVmaW5lIEFESl9NQVhFUlJPUgkJMHgwMDA0CS8qIG1heGltdW0gdGltZSBlcnJvciAqLworI2RlZmluZSBBREpfRVNURVJST1IJCTB4MDAwOAkvKiBlc3RpbWF0ZWQgdGltZSBlcnJvciAqLworI2RlZmluZSBBREpfU1RBVFVTCQkweDAwMTAJLyogY2xvY2sgc3RhdHVzICovCisjZGVmaW5lIEFESl9USU1FQ09OU1QJCTB4MDAyMAkvKiBwbGwgdGltZSBjb25zdGFudCAqLworI2RlZmluZSBBREpfVElDSwkJMHg0MDAwCS8qIHRpY2sgdmFsdWUgKi8KKyNkZWZpbmUgQURKX09GRlNFVF9TSU5HTEVTSE9UCTB4ODAwMQkvKiBvbGQtZmFzaGlvbmVkIGFkanRpbWUgKi8KKworLyogeG50cCAzLjQgY29tcGF0aWJpbGl0eSBuYW1lcyAqLworI2RlZmluZSBNT0RfT0ZGU0VUCUFESl9PRkZTRVQKKyNkZWZpbmUgTU9EX0ZSRVFVRU5DWQlBREpfRlJFUVVFTkNZCisjZGVmaW5lIE1PRF9NQVhFUlJPUglBREpfTUFYRVJST1IKKyNkZWZpbmUgTU9EX0VTVEVSUk9SCUFESl9FU1RFUlJPUgorI2RlZmluZSBNT0RfU1RBVFVTCUFESl9TVEFUVVMKKyNkZWZpbmUgTU9EX1RJTUVDT05TVAlBREpfVElNRUNPTlNUCisjZGVmaW5lIE1PRF9DTEtCCUFESl9USUNLCisjZGVmaW5lIE1PRF9DTEtBCUFESl9PRkZTRVRfU0lOR0xFU0hPVCAvKiAweDgwMDAgaW4gb3JpZ2luYWwgKi8KKworCisvKiBTdGF0dXMgY29kZXMgKHRpbWV4LnN0YXR1cykgKi8KKyNkZWZpbmUgU1RBX1BMTAkJMHgwMDAxCS8qIGVuYWJsZSBQTEwgdXBkYXRlcyAocncpICovCisjZGVmaW5lIFNUQV9QUFNGUkVRCTB4MDAwMgkvKiBlbmFibGUgUFBTIGZyZXEgZGlzY2lwbGluZSAocncpICovCisjZGVmaW5lIFNUQV9QUFNUSU1FCTB4MDAwNAkvKiBlbmFibGUgUFBTIHRpbWUgZGlzY2lwbGluZSAocncpICovCisjZGVmaW5lIFNUQV9GTEwJCTB4MDAwOAkvKiBzZWxlY3QgZnJlcXVlbmN5LWxvY2sgbW9kZSAocncpICovCisKKyNkZWZpbmUgU1RBX0lOUwkJMHgwMDEwCS8qIGluc2VydCBsZWFwIChydykgKi8KKyNkZWZpbmUgU1RBX0RFTAkJMHgwMDIwCS8qIGRlbGV0ZSBsZWFwIChydykgKi8KKyNkZWZpbmUgU1RBX1VOU1lOQwkweDAwNDAJLyogY2xvY2sgdW5zeW5jaHJvbml6ZWQgKHJ3KSAqLworI2RlZmluZSBTVEFfRlJFUUhPTEQJMHgwMDgwCS8qIGhvbGQgZnJlcXVlbmN5IChydykgKi8KKworI2RlZmluZSBTVEFfUFBTU0lHTkFMCTB4MDEwMAkvKiBQUFMgc2lnbmFsIHByZXNlbnQgKHJvKSAqLworI2RlZmluZSBTVEFfUFBTSklUVEVSCTB4MDIwMAkvKiBQUFMgc2lnbmFsIGppdHRlciBleGNlZWRlZCAocm8pICovCisjZGVmaW5lIFNUQV9QUFNXQU5ERVIJMHgwNDAwCS8qIFBQUyBzaWduYWwgd2FuZGVyIGV4Y2VlZGVkIChybykgKi8KKyNkZWZpbmUgU1RBX1BQU0VSUk9SCTB4MDgwMAkvKiBQUFMgc2lnbmFsIGNhbGlicmF0aW9uIGVycm9yIChybykgKi8KKworI2RlZmluZSBTVEFfQ0xPQ0tFUlIJMHgxMDAwCS8qIGNsb2NrIGhhcmR3YXJlIGZhdWx0IChybykgKi8KKworI2RlZmluZSBTVEFfUk9OTFkgKFNUQV9QUFNTSUdOQUwgfCBTVEFfUFBTSklUVEVSIHwgU1RBX1BQU1dBTkRFUiB8IFwKKyAgICBTVEFfUFBTRVJST1IgfCBTVEFfQ0xPQ0tFUlIpIC8qIHJlYWQtb25seSBiaXRzICovCisKKy8qIENsb2NrIHN0YXRlcyAodGltZV9zdGF0ZSkgKi8KKyNkZWZpbmUgVElNRV9PSwkJMAkvKiBjbG9jayBzeW5jaHJvbml6ZWQsIG5vIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfSU5TCTEJLyogaW5zZXJ0IGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfREVMCTIJLyogZGVsZXRlIGxlYXAgc2Vjb25kICovCisjZGVmaW5lIFRJTUVfT09QCTMJLyogbGVhcCBzZWNvbmQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgVElNRV9XQUlUCTQJLyogbGVhcCBzZWNvbmQgaGFzIG9jY3VycmVkICovCisjZGVmaW5lIFRJTUVfRVJST1IJNQkvKiBjbG9jayBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lIFRJTUVfQkFECVRJTUVfRVJST1IgLyogYncgY29tcGF0ICovCisKKy8qIE1heGltdW0gdGltZSBjb25zdGFudCBvZiB0aGUgUExMLiAgKi8KKyNkZWZpbmUgTUFYVEMJCTYKKworX19CRUdJTl9ERUNMUworCitleHRlcm4gaW50IF9fYWRqdGltZXggKHN0cnVjdCB0aW1leCAqX19udHgpIF9fVEhST1c7CitleHRlcm4gaW50IGFkanRpbWV4IChzdHJ1Y3QgdGltZXggKl9fbnR4KSBfX1RIUk9XOworCitleHRlcm4gaW50IG50cF9nZXR0aW1lIChzdHJ1Y3QgbnRwdGltZXZhbCAqX19udHYpIF9fVEhST1c7CitleHRlcm4gaW50IG50cF9hZGp0aW1lIChzdHJ1Y3QgdGltZXggKl9fdG50eCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy90aW1leC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy90dHljaGFycy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdHR5Y2hhcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQzZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdHR5Y2hhcnMuaApAQCAtMCwwICsxLDYxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHljaGFycy5oCTguMiAoQmVya2VsZXkpIDEvNC85NAorICovCisKKy8qCisgKiA0LjMgQ09NUEFUSUJJTElUWSBGSUxFCisgKgorICogVXNlciB2aXNpYmxlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyByZWxhdGVkIHRvIHRlcm1pbmFsIGhhbmRsaW5nLgorICovCisjaWZuZGVmIF9TWVNfVFRZQ0hBUlNfSAorI2RlZmluZQlfU1lTX1RUWUNIQVJTX0ggMQorCitzdHJ1Y3QgdHR5Y2hhcnMgeworCWNoYXIJdGNfZXJhc2U7CS8qIGVyYXNlIGxhc3QgY2hhcmFjdGVyICovCisJY2hhcgl0Y19raWxsOwkvKiBlcmFzZSBlbnRpcmUgbGluZSAqLworCWNoYXIJdGNfaW50cmM7CS8qIGludGVycnVwdCAqLworCWNoYXIJdGNfcXVpdGM7CS8qIHF1aXQgKi8KKwljaGFyCXRjX3N0YXJ0YzsJLyogc3RhcnQgb3V0cHV0ICovCisJY2hhcgl0Y19zdG9wYzsJLyogc3RvcCBvdXRwdXQgKi8KKwljaGFyCXRjX2VvZmM7CS8qIGVuZC1vZi1maWxlICovCisJY2hhcgl0Y19icmtjOwkvKiBpbnB1dCBkZWxpbWl0ZXIgKGxpa2UgbmwpICovCisJY2hhcgl0Y19zdXNwYzsJLyogc3RvcCBwcm9jZXNzIHNpZ25hbCAqLworCWNoYXIJdGNfZHN1c3BjOwkvKiBkZWxheWVkIHN0b3AgcHJvY2VzcyBzaWduYWwgKi8KKwljaGFyCXRjX3Jwcm50YzsJLyogcmVwcmludCBsaW5lICovCisJY2hhcgl0Y19mbHVzaGM7CS8qIGZsdXNoIG91dHB1dCAodG9nZ2xlcykgKi8KKwljaGFyCXRjX3dlcmFzYzsJLyogd29yZCBlcmFzZSAqLworCWNoYXIJdGNfbG5leHRjOwkvKiBsaXRlcmFsIG5leHQgY2hhcmFjdGVyICovCit9OworCisjaWZkZWYgX19VU0VfT0xEX1RUWQorI2luY2x1ZGUgPHN5cy90dHlkZWZhdWx0cy5oPgkvKiB0byBwaWNrIHVwIGNoYXJhY3RlciBkZWZhdWx0cyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBzeXMvdHR5Y2hhcnMuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdHR5ZGVmYXVsdHMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3R0eWRlZmF1bHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlMTY4YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3R0eWRlZmF1bHRzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIChjKSBVTklYIFN5c3RlbSBMYWJvcmF0b3JpZXMsIEluYy4KKyAqIEFsbCBvciBzb21lIHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIG1hdGVyaWFsIGxpY2Vuc2VkCisgKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGJ5IEFtZXJpY2FuIFRlbGVwaG9uZSBhbmQgVGVsZWdyYXBoCisgKiBDby4gb3IgVW5peCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuIGFuZCBhcmUgcmVwcm9kdWNlZCBoZXJlaW4gd2l0aAorICogdGhlIHBlcm1pc3Npb24gb2YgVU5JWCBTeXN0ZW0gTGFib3JhdG9yaWVzLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHlkZWZhdWx0cy5oCTguNCAoQmVya2VsZXkpIDEvMjEvOTQKKyAqLworCisvKgorICogU3lzdGVtIHdpZGUgZGVmYXVsdHMgZm9yIHRlcm1pbmFsIHN0YXRlLiAgTGludXggdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfU1lTX1RUWURFRkFVTFRTX0hfCisjZGVmaW5lCV9TWVNfVFRZREVGQVVMVFNfSF8KKworLyoKKyAqIERlZmF1bHRzIG9uICJmaXJzdCIgb3Blbi4KKyAqLworI2RlZmluZQlUVFlERUZfSUZMQUcJKEJSS0lOVCB8IElTVFJJUCB8IElDUk5MIHwgSU1BWEJFTCB8IElYT04gfCBJWEFOWSkKKyNkZWZpbmUgVFRZREVGX09GTEFHCShPUE9TVCB8IE9OTENSIHwgWFRBQlMpCisjZGVmaW5lIFRUWURFRl9MRkxBRwkoRUNITyB8IElDQU5PTiB8IElTSUcgfCBJRVhURU4gfCBFQ0hPRXxFQ0hPS0V8RUNIT0NUTCkKKyNkZWZpbmUgVFRZREVGX0NGTEFHCShDUkVBRCB8IENTNyB8IFBBUkVOQiB8IEhVUENMKQorI2RlZmluZSBUVFlERUZfU1BFRUQJKEI5NjAwKQorCisvKgorICogQ29udHJvbCBDaGFyYWN0ZXIgRGVmYXVsdHMKKyAqLworI2RlZmluZSBDVFJMKHgpCSh4JjAzNykKKyNkZWZpbmUJQ0VPRgkJQ1RSTCgnZCcpCisjaWZkZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBDRU9MCQlfUE9TSVhfVkRJU0FCTEUKKyNlbHNlCisjIGRlZmluZSBDRU9MCQknXDAnCQkvKiBYWFggYXZvaWQgX1BPU0lYX1ZESVNBQkxFICovCisjZW5kaWYKKyNkZWZpbmUJQ0VSQVNFCQkwMTc3CisjZGVmaW5lCUNJTlRSCQlDVFJMKCdjJykKKyNpZmRlZiBfUE9TSVhfVkRJU0FCTEUKKyMgZGVmaW5lIENTVEFUVVMJX1BPU0lYX1ZESVNBQkxFCisjZWxzZQorIyBkZWZpbmUgQ1NUQVRVUwknXDAnCQkvKiBYWFggYXZvaWQgX1BPU0lYX1ZESVNBQkxFICovCisjZW5kaWYKKyNkZWZpbmUJQ0tJTEwJCUNUUkwoJ3UnKQorI2RlZmluZQlDTUlOCQkxCisjZGVmaW5lCUNRVUlUCQkwMzQJCS8qIEZTLCBeXCAqLworI2RlZmluZQlDU1VTUAkJQ1RSTCgneicpCisjZGVmaW5lCUNUSU1FCQkwCisjZGVmaW5lCUNEU1VTUAkJQ1RSTCgneScpCisjZGVmaW5lCUNTVEFSVAkJQ1RSTCgncScpCisjZGVmaW5lCUNTVE9QCQlDVFJMKCdzJykKKyNkZWZpbmUJQ0xORVhUCQlDVFJMKCd2JykKKyNkZWZpbmUJQ0RJU0NBUkQgCUNUUkwoJ28nKQorI2RlZmluZQlDV0VSQVNFIAlDVFJMKCd3JykKKyNkZWZpbmUJQ1JFUFJJTlQgCUNUUkwoJ3InKQorI2RlZmluZQlDRU9UCQlDRU9GCisvKiBjb21wYXQgKi8KKyNkZWZpbmUJQ0JSSwkJQ0VPTAorI2RlZmluZSBDUlBSTlQJCUNSRVBSSU5UCisjZGVmaW5lCUNGTFVTSAkJQ0RJU0NBUkQKKworLyogUFJPVEVDVEVEIElOQ0xVU0lPTiBFTkRTIEhFUkUgKi8KKyNlbmRpZiAvKiAhX1NZU19UVFlERUZBVUxUU19IXyAqLworCisvKgorICogI2RlZmluZSBUVFlERUZDSEFSUyB0byBpbmNsdWRlIGFuIGFycmF5IG9mIGRlZmF1bHQgY29udHJvbCBjaGFyYWN0ZXJzLgorICovCisjaWZkZWYgVFRZREVGQ0hBUlMKK2NjX3QJdHR5ZGVmY2hhcnNbTkNDU10gPSB7CisJQ0VPRiwJQ0VPTCwJQ0VPTCwJQ0VSQVNFLCBDV0VSQVNFLCBDS0lMTCwgQ1JFUFJJTlQsCisJX1BPU0lYX1ZESVNBQkxFLCBDSU5UUiwJQ1FVSVQsCUNTVVNQLAlDRFNVU1AsCUNTVEFSVCwJQ1NUT1AsCUNMTkVYVCwKKwlDRElTQ0FSRCwgQ01JTiwJQ1RJTUUsICBDU1RBVFVTLCBfUE9TSVhfVkRJU0FCTEUKK307CisjdW5kZWYgVFRZREVGQ0hBUlMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1NjNhNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MSwxOTkyLDE5OTQsMTk5NSwxOTk2LDE5OTcsMTk5OCwxOTk5LDIwMDAsMjAwMSwyMDAyLDIwMDYKKyAgIAlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiAyLjYgUHJpbWl0aXZlIFN5c3RlbSBEYXRhIFR5cGVzCTxzeXMvdHlwZXMuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfVFlQRVNfSAorI2RlZmluZQlfU1lTX1RZUEVTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZkZWYJX19VU0VfQlNECisjIGlmbmRlZiBfX3VfY2hhcl9kZWZpbmVkCit0eXBlZGVmIF9fdV9jaGFyIHVfY2hhcjsKK3R5cGVkZWYgX191X3Nob3J0IHVfc2hvcnQ7Cit0eXBlZGVmIF9fdV9pbnQgdV9pbnQ7Cit0eXBlZGVmIF9fdV9sb25nIHVfbG9uZzsKK3R5cGVkZWYgX19xdWFkX3QgcXVhZF90OwordHlwZWRlZiBfX3VfcXVhZF90IHVfcXVhZF90OwordHlwZWRlZiBfX2ZzaWRfdCBmc2lkX3Q7CisjICBkZWZpbmUgX191X2NoYXJfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgX19sb2ZmX3QgbG9mZl90OworCisjaWZuZGVmIF9faW5vX3RfZGVmaW5lZAorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX2lub190IGlub190OworIyBlbHNlCit0eXBlZGVmIF9faW5vNjRfdCBpbm9fdDsKKyMgZW5kaWYKKyMgZGVmaW5lIF9faW5vX3RfZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCAmJiAhZGVmaW5lZCBfX2lubzY0X3RfZGVmaW5lZAordHlwZWRlZiBfX2lubzY0X3QgaW5vNjRfdDsKKyMgZGVmaW5lIF9faW5vNjRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX2Rldl90X2RlZmluZWQKK3R5cGVkZWYgX19kZXZfdCBkZXZfdDsKKyMgZGVmaW5lIF9fZGV2X3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjIGRlZmluZSBfX2dpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fbW9kZV90X2RlZmluZWQKK3R5cGVkZWYgX19tb2RlX3QgbW9kZV90OworIyBkZWZpbmUgX19tb2RlX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX19ubGlua190X2RlZmluZWQKK3R5cGVkZWYgX19ubGlua190IG5saW5rX3Q7CisjIGRlZmluZSBfX25saW5rX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgX191aWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CisjIGRlZmluZSBfX3VpZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fb2ZmX3RfZGVmaW5lZAorIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAordHlwZWRlZiBfX29mZl90IG9mZl90OworIyBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgZW5kaWYKKyMgZGVmaW5lIF9fb2ZmX3RfZGVmaW5lZAorI2VuZGlmCisjaWYgZGVmaW5lZCBfX1VTRV9MQVJHRUZJTEU2NCAmJiAhZGVmaW5lZCBfX29mZjY0X3RfZGVmaW5lZAordHlwZWRlZiBfX29mZjY0X3Qgb2ZmNjRfdDsKKyMgZGVmaW5lIF9fb2ZmNjRfdF9kZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgZGVmaW5lIF9fcGlkX3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4pICYmICFkZWZpbmVkIF9faWRfdF9kZWZpbmVkCit0eXBlZGVmIF9faWRfdCBpZF90OworIyBkZWZpbmUgX19pZF90X2RlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIF9fc3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3NpemVfdCBzc2l6ZV90OworIyBkZWZpbmUgX19zc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfQlNECisjIGlmbmRlZiBfX2RhZGRyX3RfZGVmaW5lZAordHlwZWRlZiBfX2RhZGRyX3QgZGFkZHJfdDsKK3R5cGVkZWYgX19jYWRkcl90IGNhZGRyX3Q7CisjICBkZWZpbmUgX19kYWRkcl90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19VU0VfU1ZJRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOKSAmJiAhZGVmaW5lZCBfX2tleV90X2RlZmluZWQKK3R5cGVkZWYgX19rZXlfdCBrZXlfdDsKKyMgZGVmaW5lIF9fa2V5X3RfZGVmaW5lZAorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9YT1BFTgorIyBkZWZpbmUgX19uZWVkX2Nsb2NrX3QKKyNlbmRpZgorI2RlZmluZQlfX25lZWRfdGltZV90CisjZGVmaW5lIF9fbmVlZF90aW1lcl90CisjZGVmaW5lIF9fbmVlZF9jbG9ja2lkX3QKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBfX1VTRV9YT1BFTgorIyBpZm5kZWYgX191c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX191c2Vjb25kc190IHVzZWNvbmRzX3Q7CisjICBkZWZpbmUgX191c2Vjb25kc190X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAordHlwZWRlZiBfX3N1c2Vjb25kc190IHN1c2Vjb25kc190OworIyAgZGVmaW5lIF9fc3VzZWNvbmRzX3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJX19uZWVkX3NpemVfdAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgX19VU0VfTUlTQworLyogT2xkIGNvbXBhdGliaWxpdHkgbmFtZXMgZm9yIEMgdHlwZXMuICAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1bG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisjZW5kaWYKKworLyogVGhlc2Ugc2l6ZS1zcGVjaWZpYyBuYW1lcyBhcmUgdXNlZCBieSBzb21lIG9mIHRoZSBpbmV0IGNvZGUuICAqLworCisjaWYgIV9fR05VQ19QUkVSRVEgKDIsIDcpCisKKy8qIFRoZXNlIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBJU08gQzk5IGhlYWRlciA8aW50dHlwZXMuaD4uICovCisjIGlmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjICBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAordHlwZWRlZgljaGFyIGludDhfdDsKK3R5cGVkZWYJc2hvcnQgaW50IGludDE2X3Q7Cit0eXBlZGVmCWludCBpbnQzMl90OworIyAgaWYgX19XT1JEU0laRSA9PSA2NAordHlwZWRlZiBsb25nIGludCBpbnQ2NF90OworIyAgZWxpZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIGludCBpbnQ2NF90OworIyAgZW5kaWYKKyMgZW5kaWYKKworLyogQnV0IHRoZXNlIHdlcmUgZGVmaW5lZCBieSBJU08gQyB3aXRob3V0IHRoZSBmaXJzdCBgXycuICAqLwordHlwZWRlZgl1bnNpZ25lZCBjaGFyIHVfaW50OF90OwordHlwZWRlZgl1bnNpZ25lZCBzaG9ydCBpbnQgdV9pbnQxNl90OwordHlwZWRlZgl1bnNpZ25lZCBpbnQgdV9pbnQzMl90OworIyBpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHVfaW50NjRfdDsKKyMgZWxpZiBfX0dMSUJDX0hBVkVfTE9OR19MT05HCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCB1X2ludDY0X3Q7CisjIGVuZGlmCisKK3R5cGVkZWYgaW50IHJlZ2lzdGVyX3Q7CisKKyNlbHNlCisKKy8qIEZvciBHQ0MgMi43IGFuZCBsYXRlciwgd2UgY2FuIHVzZSBzcGVjaWZpYyB0eXBlLXNpemUgYXR0cmlidXRlcy4gICovCisjIGRlZmluZSBfX2ludE5fdChOLCBNT0RFKSBcCisgIHR5cGVkZWYgaW50IGludCMjTiMjX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChNT0RFKSkpCisjIGRlZmluZSBfX3VfaW50Tl90KE4sIE1PREUpIFwKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQjI04jI190IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoTU9ERSkpKQorCisjIGlmbmRlZiBfX2ludDhfdF9kZWZpbmVkCisjICBkZWZpbmUgX19pbnQ4X3RfZGVmaW5lZAorX19pbnROX3QgKDgsIF9fUUlfXyk7CitfX2ludE5fdCAoMTYsIF9fSElfXyk7CitfX2ludE5fdCAoMzIsIF9fU0lfXyk7CitfX2ludE5fdCAoNjQsIF9fRElfXyk7CisjIGVuZGlmCisKK19fdV9pbnROX3QgKDgsIF9fUUlfXyk7CitfX3VfaW50Tl90ICgxNiwgX19ISV9fKTsKK19fdV9pbnROX3QgKDMyLCBfX1NJX18pOworX191X2ludE5fdCAoNjQsIF9fRElfXyk7CisKK3R5cGVkZWYgaW50IHJlZ2lzdGVyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX3dvcmRfXykpKTsKKworCisvKiBTb21lIGNvZGUgZnJvbSBCSU5EIHRlc3RzIHRoaXMgbWFjcm8gdG8gc2VlIGlmIHRoZSB0eXBlcyBhYm92ZSBhcmUKKyAgIGRlZmluZWQuICAqLworI2VuZGlmCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXwkxCisKKworI2lmZGVmCV9fVVNFX0JTRAorLyogSW4gQlNEIDxzeXMvdHlwZXMuaD4gaXMgZXhwZWN0ZWQgdG8gZGVmaW5lIEJZVEVfT1JERVIuICAqLworIyBpbmNsdWRlIDxlbmRpYW4uaD4KKworLyogSXQgYWxzbyBkZWZpbmVzIGBmZF9zZXQnIGFuZCB0aGUgRkRfKiBtYWNyb3MgZm9yIGBzZWxlY3QnLiAgKi8KKyMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisvKiBCU0QgZGVmaW5lcyB0aGVzZSBzeW1ib2xzLCBzbyB3ZSBmb2xsb3cuICAqLworIyBpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfVU5JWDk4ICYmICFkZWZpbmVkIF9fYmxrc2l6ZV90X2RlZmluZWQKK3R5cGVkZWYgX19ibGtzaXplX3QgYmxrc2l6ZV90OworIyBkZWZpbmUgX19ibGtzaXplX3RfZGVmaW5lZAorI2VuZGlmCisKKy8qIFR5cGVzIGZyb20gdGhlIExhcmdlIEZpbGUgU3VwcG9ydCBpbnRlcmZhY2UuICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisjIGlmbmRlZiBfX2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19ibGtjbnRfdCBibGtjbnRfdDsJIC8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAgKi8KKyMgIGRlZmluZSBfX2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fZnNibGtjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNibGtjbnRfdCBmc2Jsa2NudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGJsb2Nrcy4gICovCisjICBkZWZpbmUgX19mc2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fZnNmaWxjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNmaWxjbnRfdCBmc2ZpbGNudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGlub2Rlcy4gICovCisjICBkZWZpbmUgX19mc2ZpbGNudF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBfX2Jsa2NudF90X2RlZmluZWQKK3R5cGVkZWYgX19ibGtjbnQ2NF90IGJsa2NudF90OwkgICAvKiBUeXBlIHRvIGNvdW50IG51bWJlciBvZiBkaXNrIGJsb2Nrcy4gICovCisjICBkZWZpbmUgX19ibGtjbnRfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmbmRlZiBfX2ZzYmxrY250X3RfZGVmaW5lZAordHlwZWRlZiBfX2ZzYmxrY250NjRfdCBmc2Jsa2NudF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGJsb2Nrcy4gICovCisjICBkZWZpbmUgX19mc2Jsa2NudF90X2RlZmluZWQKKyMgZW5kaWYKKyMgaWZuZGVmIF9fZnNmaWxjbnRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZnNmaWxjbnQ2NF90IGZzZmlsY250X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gaW5vZGVzLiAgKi8KKyMgIGRlZmluZSBfX2ZzZmlsY250X3RfZGVmaW5lZAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAordHlwZWRlZiBfX2Jsa2NudDY0X3QgYmxrY250NjRfdDsgICAgIC8qIFR5cGUgdG8gY291bnQgbnVtYmVyIG9mIGRpc2sgYmxvY2tzLiAqLwordHlwZWRlZiBfX2ZzYmxrY250NjRfdCBmc2Jsa2NudDY0X3Q7IC8qIFR5cGUgdG8gY291bnQgZmlsZSBzeXN0ZW0gYmxvY2tzLiAgKi8KK3R5cGVkZWYgX19mc2ZpbGNudDY0X3QgZnNmaWxjbnQ2NF90OyAvKiBUeXBlIHRvIGNvdW50IGZpbGUgc3lzdGVtIGlub2Rlcy4gICovCisjZW5kaWYKKworCisvKiBOb3cgYWRkIHRoZSB0aHJlYWQgdHlwZXMuICAqLworI2lmIGRlZmluZWQgX19VU0VfUE9TSVgxOTk1MDYgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKKyMgaW5jbHVkZSA8Yml0cy9wdGhyZWFkdHlwZXMuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3R5cGVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Vjb250ZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91Y29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWNkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91Y29udGV4dC5oCkBAIC0wLDAgKzEsMjQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VQ09OVEVYVF9ICisjZGVmaW5lIF9TWVNfVUNPTlRFWFRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGJpdHMvd29yZHNpemUuaD4KKworLyogV2UgbmVlZCB0aGUgc2lnbmFsIGNvbnRleHQgZGVmaW5pdGlvbnMgZXZlbiBpZiB0aGV5IGFyZSBub3QgdXNlZAorICAgaW5jbHVkZWQgaW4gPHNpZ25hbC5oPi4gICovCisjaW5jbHVkZSA8Yml0cy9zaWdjb250ZXh0Lmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDY0CisKKy8qIFR5cGUgZm9yIGdlbmVyYWwgcmVnaXN0ZXIuICAqLwordHlwZWRlZiBsb25nIGludCBncmVnX3Q7CisKKy8qIE51bWJlciBvZiBnZW5lcmFsIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIE5HUkVHCTIzCisKKy8qIENvbnRhaW5lciBmb3IgYWxsIGdlbmVyYWwgcmVnaXN0ZXJzLiAgKi8KK3R5cGVkZWYgZ3JlZ190IGdyZWdzZXRfdFtOR1JFR107CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIE51bWJlciBvZiBlYWNoIHJlZ2lzdGVyIGluIHRoZSBgZ3JlZ3NldF90JyBhcnJheS4gICovCitlbnVtCit7CisgIFJFR19SOCA9IDAsCisjIGRlZmluZSBSRUdfUjgJCVJFR19SOAorICBSRUdfUjksCisjIGRlZmluZSBSRUdfUjkJCVJFR19SOQorICBSRUdfUjEwLAorIyBkZWZpbmUgUkVHX1IxMAlSRUdfUjEwCisgIFJFR19SMTEsCisjIGRlZmluZSBSRUdfUjExCVJFR19SMTEKKyAgUkVHX1IxMiwKKyMgZGVmaW5lIFJFR19SMTIJUkVHX1IxMgorICBSRUdfUjEzLAorIyBkZWZpbmUgUkVHX1IxMwlSRUdfUjEzCisgIFJFR19SMTQsCisjIGRlZmluZSBSRUdfUjE0CVJFR19SMTQKKyAgUkVHX1IxNSwKKyMgZGVmaW5lIFJFR19SMTUJUkVHX1IxNQorICBSRUdfUkRJLAorIyBkZWZpbmUgUkVHX1JESQlSRUdfUkRJCisgIFJFR19SU0ksCisjIGRlZmluZSBSRUdfUlNJCVJFR19SU0kKKyAgUkVHX1JCUCwKKyMgZGVmaW5lIFJFR19SQlAJUkVHX1JCUAorICBSRUdfUkJYLAorIyBkZWZpbmUgUkVHX1JCWAlSRUdfUkJYCisgIFJFR19SRFgsCisjIGRlZmluZSBSRUdfUkRYCVJFR19SRFgKKyAgUkVHX1JBWCwKKyMgZGVmaW5lIFJFR19SQVgJUkVHX1JBWAorICBSRUdfUkNYLAorIyBkZWZpbmUgUkVHX1JDWAlSRUdfUkNYCisgIFJFR19SU1AsCisjIGRlZmluZSBSRUdfUlNQCVJFR19SU1AKKyAgUkVHX1JJUCwKKyMgZGVmaW5lIFJFR19SSVAJUkVHX1JJUAorICBSRUdfRUZMLAorIyBkZWZpbmUgUkVHX0VGTAlSRUdfRUZMCisgIFJFR19DU0dTRlMsCQkvKiBBY3R1YWxseSBzaG9ydCBjcywgZ3MsIGZzLCBfX3BhZDAuICAqLworIyBkZWZpbmUgUkVHX0NTR1NGUwlSRUdfQ1NHU0ZTCisgIFJFR19FUlIsCisjIGRlZmluZSBSRUdfRVJSCVJFR19FUlIKKyAgUkVHX1RSQVBOTywKKyMgZGVmaW5lIFJFR19UUkFQTk8JUkVHX1RSQVBOTworICBSRUdfT0xETUFTSywKKyMgZGVmaW5lIFJFR19PTERNQVNLCVJFR19PTERNQVNLCisgIFJFR19DUjIKKyMgZGVmaW5lIFJFR19DUjIJUkVHX0NSMgorfTsKKyNlbmRpZgorCitzdHJ1Y3QgX2xpYmNfZnB4cmVnCit7CisgIHVuc2lnbmVkIHNob3J0IGludCBzaWduaWZpY2FuZFs0XTsKKyAgdW5zaWduZWQgc2hvcnQgaW50IGV4cG9uZW50OworICB1bnNpZ25lZCBzaG9ydCBpbnQgcGFkZGluZ1szXTsKK307CisKK3N0cnVjdCBfbGliY194bW1yZWcKK3sKKyAgX191aW50MzJfdAllbGVtZW50WzRdOworfTsKKworc3RydWN0IF9saWJjX2Zwc3RhdGUKK3sKKyAgLyogNjQtYml0IEZYU0FWRSBmb3JtYXQuICAqLworICBfX3VpbnQxNl90CQljd2Q7CisgIF9fdWludDE2X3QJCXN3ZDsKKyAgX191aW50MTZfdAkJZnR3OworICBfX3VpbnQxNl90CQlmb3A7CisgIF9fdWludDY0X3QJCXJpcDsKKyAgX191aW50NjRfdAkJcmRwOworICBfX3VpbnQzMl90CQlteGNzcjsKKyAgX191aW50MzJfdAkJbXhjcl9tYXNrOworICBzdHJ1Y3QgX2xpYmNfZnB4cmVnCV9zdFs4XTsKKyAgc3RydWN0IF9saWJjX3htbXJlZwlfeG1tWzE2XTsKKyAgX191aW50MzJfdAkJcGFkZGluZ1syNF07Cit9OworCisvKiBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgRlBVIHJlZ2lzdGVycy4gICovCit0eXBlZGVmIHN0cnVjdCBfbGliY19mcHN0YXRlICpmcHJlZ3NldF90OworCisvKiBDb250ZXh0IHRvIGRlc2NyaWJlIHdob2xlIHByb2Nlc3NvciBzdGF0ZS4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgZ3JlZ3NldF90IGdyZWdzOworICAgIC8qIE5vdGUgdGhhdCBmcHJlZ3MgaXMgYSBwb2ludGVyLiAgKi8KKyAgICBmcHJlZ3NldF90IGZwcmVnczsKKyAgICB1bnNpZ25lZCBsb25nIF9fcmVzZXJ2ZWQxIFs4XTsKK30gbWNvbnRleHRfdDsKKworLyogVXNlcmxldmVsIGNvbnRleHQuICAqLwordHlwZWRlZiBzdHJ1Y3QgdWNvbnRleHQKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IHVjX2ZsYWdzOworICAgIHN0cnVjdCB1Y29udGV4dCAqdWNfbGluazsKKyAgICBzdGFja190IHVjX3N0YWNrOworICAgIG1jb250ZXh0X3QgdWNfbWNvbnRleHQ7CisgICAgX19zaWdzZXRfdCB1Y19zaWdtYXNrOworICAgIHN0cnVjdCBfbGliY19mcHN0YXRlIF9fZnByZWdzX21lbTsKKyAgfSB1Y29udGV4dF90OworCisjZWxzZSAvKiBfX1dPUkRTSVpFID09IDMyICovCisKKy8qIFR5cGUgZm9yIGdlbmVyYWwgcmVnaXN0ZXIuICAqLwordHlwZWRlZiBpbnQgZ3JlZ190OworCisvKiBOdW1iZXIgb2YgZ2VuZXJhbCByZWdpc3RlcnMuICAqLworI2RlZmluZSBOR1JFRwkxOQorCisvKiBDb250YWluZXIgZm9yIGFsbCBnZW5lcmFsIHJlZ2lzdGVycy4gICovCit0eXBlZGVmIGdyZWdfdCBncmVnc2V0X3RbTkdSRUddOworCisjaWZkZWYgX19VU0VfR05VCisvKiBOdW1iZXIgb2YgZWFjaCByZWdpc3RlciBpcyB0aGUgYGdyZWdzZXRfdCcgYXJyYXkuICAqLworZW51bQoreworICBSRUdfR1MgPSAwLAorIyBkZWZpbmUgUkVHX0dTCQlSRUdfR1MKKyAgUkVHX0ZTLAorIyBkZWZpbmUgUkVHX0ZTCQlSRUdfRlMKKyAgUkVHX0VTLAorIyBkZWZpbmUgUkVHX0VTCQlSRUdfRVMKKyAgUkVHX0RTLAorIyBkZWZpbmUgUkVHX0RTCQlSRUdfRFMKKyAgUkVHX0VESSwKKyMgZGVmaW5lIFJFR19FREkJUkVHX0VESQorICBSRUdfRVNJLAorIyBkZWZpbmUgUkVHX0VTSQlSRUdfRVNJCisgIFJFR19FQlAsCisjIGRlZmluZSBSRUdfRUJQCVJFR19FQlAKKyAgUkVHX0VTUCwKKyMgZGVmaW5lIFJFR19FU1AJUkVHX0VTUAorICBSRUdfRUJYLAorIyBkZWZpbmUgUkVHX0VCWAlSRUdfRUJYCisgIFJFR19FRFgsCisjIGRlZmluZSBSRUdfRURYCVJFR19FRFgKKyAgUkVHX0VDWCwKKyMgZGVmaW5lIFJFR19FQ1gJUkVHX0VDWAorICBSRUdfRUFYLAorIyBkZWZpbmUgUkVHX0VBWAlSRUdfRUFYCisgIFJFR19UUkFQTk8sCisjIGRlZmluZSBSRUdfVFJBUE5PCVJFR19UUkFQTk8KKyAgUkVHX0VSUiwKKyMgZGVmaW5lIFJFR19FUlIJUkVHX0VSUgorICBSRUdfRUlQLAorIyBkZWZpbmUgUkVHX0VJUAlSRUdfRUlQCisgIFJFR19DUywKKyMgZGVmaW5lIFJFR19DUwkJUkVHX0NTCisgIFJFR19FRkwsCisjIGRlZmluZSBSRUdfRUZMCVJFR19FRkwKKyAgUkVHX1VFU1AsCisjIGRlZmluZSBSRUdfVUVTUAlSRUdfVUVTUAorICBSRUdfU1MKKyMgZGVmaW5lIFJFR19TUwlSRUdfU1MKK307CisjZW5kaWYKKworLyogRGVmaW5pdGlvbnMgdGFrZW4gZnJvbSB0aGUga2VybmVsIGhlYWRlcnMuICAqLworc3RydWN0IF9saWJjX2ZwcmVnCit7CisgIHVuc2lnbmVkIHNob3J0IGludCBzaWduaWZpY2FuZFs0XTsKKyAgdW5zaWduZWQgc2hvcnQgaW50IGV4cG9uZW50OworfTsKKworc3RydWN0IF9saWJjX2Zwc3RhdGUKK3sKKyAgdW5zaWduZWQgbG9uZyBpbnQgY3c7CisgIHVuc2lnbmVkIGxvbmcgaW50IHN3OworICB1bnNpZ25lZCBsb25nIGludCB0YWc7CisgIHVuc2lnbmVkIGxvbmcgaW50IGlwb2ZmOworICB1bnNpZ25lZCBsb25nIGludCBjc3NlbDsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZGF0YW9mZjsKKyAgdW5zaWduZWQgbG9uZyBpbnQgZGF0YXNlbDsKKyAgc3RydWN0IF9saWJjX2ZwcmVnIF9zdFs4XTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgc3RhdHVzOworfTsKKworLyogU3RydWN0dXJlIHRvIGRlc2NyaWJlIEZQVSByZWdpc3RlcnMuICAqLwordHlwZWRlZiBzdHJ1Y3QgX2xpYmNfZnBzdGF0ZSAqZnByZWdzZXRfdDsKKworLyogQ29udGV4dCB0byBkZXNjcmliZSB3aG9sZSBwcm9jZXNzb3Igc3RhdGUuICAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgeworICAgIGdyZWdzZXRfdCBncmVnczsKKyAgICAvKiBEdWUgdG8gTGludXgncyBoaXN0b3J5IHdlIGhhdmUgdG8gdXNlIGEgcG9pbnRlciBoZXJlLiAgVGhlIFN5c1YvaTM4NgorICAgICAgIEFCSSByZXF1aXJlcyBhIHN0cnVjdCB3aXRoIHRoZSB2YWx1ZXMuICAqLworICAgIGZwcmVnc2V0X3QgZnByZWdzOworICAgIHVuc2lnbmVkIGxvbmcgaW50IG9sZG1hc2s7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgY3IyOworICB9IG1jb250ZXh0X3Q7CisKKy8qIFVzZXJsZXZlbCBjb250ZXh0LiAgKi8KK3R5cGVkZWYgc3RydWN0IHVjb250ZXh0CisgIHsKKyAgICB1bnNpZ25lZCBsb25nIGludCB1Y19mbGFnczsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjX2xpbms7CisgICAgc3RhY2tfdCB1Y19zdGFjazsKKyAgICBtY29udGV4dF90IHVjX21jb250ZXh0OworICAgIF9fc2lnc2V0X3QgdWNfc2lnbWFzazsKKyAgICBzdHJ1Y3QgX2xpYmNfZnBzdGF0ZSBfX2ZwcmVnc19tZW07CisgIH0gdWNvbnRleHRfdDsKKworI2VuZGlmIC8qIF9fV09SRFNJWkUgPT0gMzIgKi8KKworI2VuZGlmIC8qIHN5cy91Y29udGV4dC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91aW8uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Vpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjAzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91aW8uaApAQCAtMCwwICsxLDU0IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5NiwgOTcsIDk4LCA5OSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfU1lTX1VJT19ICisjZGVmaW5lIF9TWVNfVUlPX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgZmlsZSBkZWZpbmVzIGBzdHJ1Y3QgaW92ZWMnLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Vpby5oPgorCisKKy8qIFJlYWQgZGF0YSBmcm9tIGZpbGUgZGVzY3JpcHRvciBGRCwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHRoZQorICAgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoIGlzIGEgdmVjdG9yIG9mIENPVU5UIGBzdHJ1Y3QgaW92ZWMncy4KKyAgIFRoZSBidWZmZXJzIGFyZSBmaWxsZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4KKyAgIE9wZXJhdGVzIGp1c3QgbGlrZSBgcmVhZCcgKHNlZSA8dW5pc3RkLmg+KSBleGNlcHQgdGhhdCBkYXRhIGFyZQorICAgcHV0IGluIElPVkVDIGluc3RlYWQgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCByZWFkdiAoaW50IF9fZmQsIF9fY29uc3Qgc3RydWN0IGlvdmVjICpfX2lvdmVjLCBpbnQgX19jb3VudCk7CisKKy8qIFdyaXRlIGRhdGEgcG9pbnRlZCBieSB0aGUgYnVmZmVycyBkZXNjcmliZWQgYnkgSU9WRUMsIHdoaWNoCisgICBpcyBhIHZlY3RvciBvZiBDT1VOVCBgc3RydWN0IGlvdmVjJ3MsIHRvIGZpbGUgZGVzY3JpcHRvciBGRC4KKyAgIFRoZSBkYXRhIGlzIHdyaXR0ZW4gaW4gdGhlIG9yZGVyIHNwZWNpZmllZC4KKyAgIE9wZXJhdGVzIGp1c3QgbGlrZSBgd3JpdGUnIChzZWUgPHVuaXN0ZC5oPikgZXhjZXB0IHRoYXQgdGhlIGRhdGEKKyAgIGFyZSB0YWtlbiBmcm9tIElPVkVDIGluc3RlYWQgb2YgYSBjb250aWd1b3VzIGJ1ZmZlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCB3cml0ZXYgKGludCBfX2ZkLCBfX2NvbnN0IHN0cnVjdCBpb3ZlYyAqX19pb3ZlYywgaW50IF9fY291bnQpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogc3lzL3Vpby5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91bHRyYXNvdW5kLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91bHRyYXNvdW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1YzM4NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VsdHJhc291bmQuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8bGludXgvdWx0cmFzb3VuZC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdW4uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMTBlNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VuLmgKQEAgLTAsMCArMSw0NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk1LCAxOTk2LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmCV9TWVNfVU5fSAorI2RlZmluZQlfU1lTX1VOX0gJMQorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKy8qIEdldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8gdG8gZGVmaW5lIHRoZSBjb21tb24gc29ja2FkZHIgbWVtYmVycy4gICovCisjaW5jbHVkZSA8Yml0cy9zb2NrYWRkci5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhZGRyZXNzIG9mIGFuIEFGX0xPQ0FMIChha2EgQUZfVU5JWCkgc29ja2V0LiAgKi8KK3N0cnVjdCBzb2NrYWRkcl91bgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHN1bl8pOworICAgIGNoYXIgc3VuX3BhdGhbMTA4XTsJCS8qIFBhdGggbmFtZS4gICovCisgIH07CisKKworI2lmZGVmIF9fVVNFX01JU0MKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBGb3IgcHJvdG90eXBlIG9mIGBzdHJsZW4nLiAgKi8KKworLyogRXZhbHVhdGUgdG8gYWN0dWFsIGxlbmd0aCBvZiB0aGUgYHNvY2thZGRyX3VuJyBzdHJ1Y3R1cmUuICAqLworIyBkZWZpbmUgU1VOX0xFTihwdHIpICgoc2l6ZV90KSAoKChzdHJ1Y3Qgc29ja2FkZHJfdW4gKikgMCktPnN1bl9wYXRoKQkgICAgICBcCisJCSAgICAgICsgc3RybGVuICgocHRyKS0+c3VuX3BhdGgpKQorI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMvdW4uaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MjNmYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VzZXIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY0NWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdXNlci5oCkBAIC0wLDAgKzEsMTc1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19VU0VSX0gKKyNkZWZpbmUgX1NZU19VU0VSX0gJMQorCisvKiBUaGUgd2hvbGUgcHVycG9zZSBvZiB0aGlzIGZpbGUgaXMgZm9yIEdEQiBhbmQgR0RCIG9ubHkuICBEb24ndCByZWFkCisgICB0b28gbXVjaCBpbnRvIGl0LiAgRG9uJ3QgdXNlIGl0IGZvciBhbnl0aGluZyBvdGhlciB0aGFuIEdEQiB1bmxlc3MKKyAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gICovCisKKyNpbmNsdWRlIDxiaXRzL3dvcmRzaXplLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiBfX1dPUkRTSVpFID09IDY0CisKK3N0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QKK3sKKyAgX191aW50MTZfdAkJY3dkOworICBfX3VpbnQxNl90CQlzd2Q7CisgIF9fdWludDE2X3QJCWZ0dzsKKyAgX191aW50MTZfdAkJZm9wOworICBfX3VpbnQ2NF90CQlyaXA7CisgIF9fdWludDY0X3QJCXJkcDsKKyAgX191aW50MzJfdAkJbXhjc3I7CisgIF9fdWludDMyX3QJCW14Y3JfbWFzazsKKyAgX191aW50MzJfdAkJc3Rfc3BhY2VbMzJdOyAgIC8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnID0gMTI4IGJ5dGVzICovCisgIF9fdWludDMyX3QJCXhtbV9zcGFjZVs2NF07ICAvKiAxNioxNiBieXRlcyBmb3IgZWFjaCBYTU0tcmVnID0gMjU2IGJ5dGVzICovCisgIF9fdWludDMyX3QJCXBhZGRpbmdbMjRdOworfTsKKworc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgbG9uZyByMTU7CisgIHVuc2lnbmVkIGxvbmcgcjE0OworICB1bnNpZ25lZCBsb25nIHIxMzsKKyAgdW5zaWduZWQgbG9uZyByMTI7CisgIHVuc2lnbmVkIGxvbmcgcmJwOworICB1bnNpZ25lZCBsb25nIHJieDsKKyAgdW5zaWduZWQgbG9uZyByMTE7CisgIHVuc2lnbmVkIGxvbmcgcjEwOworICB1bnNpZ25lZCBsb25nIHI5OworICB1bnNpZ25lZCBsb25nIHI4OworICB1bnNpZ25lZCBsb25nIHJheDsKKyAgdW5zaWduZWQgbG9uZyByY3g7CisgIHVuc2lnbmVkIGxvbmcgcmR4OworICB1bnNpZ25lZCBsb25nIHJzaTsKKyAgdW5zaWduZWQgbG9uZyByZGk7CisgIHVuc2lnbmVkIGxvbmcgb3JpZ19yYXg7CisgIHVuc2lnbmVkIGxvbmcgcmlwOworICB1bnNpZ25lZCBsb25nIGNzOworICB1bnNpZ25lZCBsb25nIGVmbGFnczsKKyAgdW5zaWduZWQgbG9uZyByc3A7CisgIHVuc2lnbmVkIGxvbmcgc3M7CisgIHVuc2lnbmVkIGxvbmcgZnNfYmFzZTsKKyAgdW5zaWduZWQgbG9uZyBnc19iYXNlOworICB1bnNpZ25lZCBsb25nIGRzOworICB1bnNpZ25lZCBsb25nIGVzOworICB1bnNpZ25lZCBsb25nIGZzOworICB1bnNpZ25lZCBsb25nIGdzOworfTsKKworc3RydWN0IHVzZXIKK3sKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QJcmVnczsKKyAgaW50CQkJCXVfZnB2YWxpZDsKKyAgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAlpMzg3OworICB1bnNpZ25lZCBsb25nIGludAkJdV90c2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfZHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X3NzaXplOworICB1bnNpZ25lZCBsb25nCQkJc3RhcnRfY29kZTsKKyAgdW5zaWduZWQgbG9uZwkJCXN0YXJ0X3N0YWNrOworICBsb25nIGludAkJCXNpZ25hbDsKKyAgaW50CQkJCXJlc2VydmVkOworICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCoJdV9hcjA7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QqCXVfZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCW1hZ2ljOworICBjaGFyCQkJCXVfY29tbSBbMzJdOworICB1bnNpZ25lZCBsb25nIGludAkJdV9kZWJ1Z3JlZyBbOF07Cit9OworCisjZWxzZQorLyogVGhlc2UgYXJlIHRoZSAzMi1iaXQgeDg2IHN0cnVjdHVyZXMuICAqLworc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAoreworICBsb25nIGludCBjd2Q7CisgIGxvbmcgaW50IHN3ZDsKKyAgbG9uZyBpbnQgdHdkOworICBsb25nIGludCBmaXA7CisgIGxvbmcgaW50IGZjczsKKyAgbG9uZyBpbnQgZm9vOworICBsb25nIGludCBmb3M7CisgIGxvbmcgaW50IHN0X3NwYWNlIFsyMF07Cit9OworCitzdHJ1Y3QgdXNlcl9mcHhyZWdzX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBpbnQgY3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgc3dkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgdHdkOworICB1bnNpZ25lZCBzaG9ydCBpbnQgZm9wOworICBsb25nIGludCBmaXA7CisgIGxvbmcgaW50IGZjczsKKyAgbG9uZyBpbnQgZm9vOworICBsb25nIGludCBmb3M7CisgIGxvbmcgaW50IG14Y3NyOworICBsb25nIGludCByZXNlcnZlZDsKKyAgbG9uZyBpbnQgc3Rfc3BhY2VbMzJdOyAgIC8qIDgqMTYgYnl0ZXMgZm9yIGVhY2ggRlAtcmVnID0gMTI4IGJ5dGVzICovCisgIGxvbmcgaW50IHhtbV9zcGFjZVszMl07ICAvKiA4KjE2IGJ5dGVzIGZvciBlYWNoIFhNTS1yZWcgPSAxMjggYnl0ZXMgKi8KKyAgbG9uZyBpbnQgcGFkZGluZ1s1Nl07Cit9OworCitzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdAoreworICBsb25nIGludCBlYng7CisgIGxvbmcgaW50IGVjeDsKKyAgbG9uZyBpbnQgZWR4OworICBsb25nIGludCBlc2k7CisgIGxvbmcgaW50IGVkaTsKKyAgbG9uZyBpbnQgZWJwOworICBsb25nIGludCBlYXg7CisgIGxvbmcgaW50IHhkczsKKyAgbG9uZyBpbnQgeGVzOworICBsb25nIGludCB4ZnM7CisgIGxvbmcgaW50IHhnczsKKyAgbG9uZyBpbnQgb3JpZ19lYXg7CisgIGxvbmcgaW50IGVpcDsKKyAgbG9uZyBpbnQgeGNzOworICBsb25nIGludCBlZmxhZ3M7CisgIGxvbmcgaW50IGVzcDsKKyAgbG9uZyBpbnQgeHNzOworfTsKKworc3RydWN0IHVzZXIKK3sKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QJcmVnczsKKyAgaW50CQkJCXVfZnB2YWxpZDsKKyAgc3RydWN0IHVzZXJfZnByZWdzX3N0cnVjdAlpMzg3OworICB1bnNpZ25lZCBsb25nIGludAkJdV90c2l6ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCXVfZHNpemU7CisgIHVuc2lnbmVkIGxvbmcgaW50CQl1X3NzaXplOworICB1bnNpZ25lZCBsb25nCQkJc3RhcnRfY29kZTsKKyAgdW5zaWduZWQgbG9uZwkJCXN0YXJ0X3N0YWNrOworICBsb25nIGludAkJCXNpZ25hbDsKKyAgaW50CQkJCXJlc2VydmVkOworICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCoJdV9hcjA7CisgIHN0cnVjdCB1c2VyX2ZwcmVnc19zdHJ1Y3QqCXVfZnBzdGF0ZTsKKyAgdW5zaWduZWQgbG9uZyBpbnQJCW1hZ2ljOworICBjaGFyCQkJCXVfY29tbSBbMzJdOworICBpbnQJCQkJdV9kZWJ1Z3JlZyBbOF07Cit9OworI2VuZGlmICAvKiBfX1dPUkRTSVpFICovCisKKyNkZWZpbmUgUEFHRV9TSVpFCQlzeXNjb25mKF9TQ19QQUdFU0laRSkKKyNkZWZpbmUgUEFHRV9NQVNLCQkofihQQUdFX1NJWkUtMSkpCisjZGVmaW5lIE5CUEcJCQlQQUdFX1NJWkUKKyNkZWZpbmUgVVBBR0VTCQkJMQorI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUgkodS5zdGFydF9jb2RlKQorI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCSh1LnN0YXJ0X3N0YWNrICsgdS51X3NzaXplICogTkJQRykKKworI2VuZGlmCS8qIF9TWVNfVVNFUl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91c3RhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdXN0YXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTljZGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdXN0YXQuaApAQCAtMCwwICsxLDM4IEBACisvKiBIZWFkZXIgZGVzY3JpYmluZyBvYnNvbGV0ZSBgdXN0YXQnIGludGVyZmFjZS4KKyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlLiAgVXNlIDxzeXMvc3RhdGZzLmg+IGluc3RlYWQuCisgKi8KKworI2lmbmRlZiBfU1lTX1VTVEFUX0gKKyNkZWZpbmUJX1NZU19VU1RBVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3VzdGF0Lmg+CisKK19fQkVHSU5fREVDTFMKKworZXh0ZXJuIGludCB1c3RhdCAoX19kZXZfdCBfX2Rldiwgc3RydWN0IHVzdGF0ICpfX3VidWYpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdXN0YXQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdXRzbmFtZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdXRzbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2FhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy91dHNuYW1lLmgKQEAgLTAsMCArMSw4NyBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDk0LDk2LDk3LDk5LDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNC40IFN5c3RlbSBJZGVudGlmaWNhdGlvbgk8c3lzL3V0c25hbWUuaD4KKyAqLworCisjaWZuZGVmCV9TWVNfVVRTTkFNRV9ICisjZGVmaW5lCV9TWVNfVVRTTkFNRV9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworI2luY2x1ZGUgPGJpdHMvdXRzbmFtZS5oPgorCisjaWZuZGVmIF9VVFNOQU1FX1NZU05BTUVfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9TWVNOQU1FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9OT0RFTkFNRV9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX05PREVOQU1FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorI2lmbmRlZiBfVVRTTkFNRV9SRUxFQVNFX0xFTkdUSAorIyBkZWZpbmUgX1VUU05BTUVfUkVMRUFTRV9MRU5HVEggX1VUU05BTUVfTEVOR1RICisjZW5kaWYKKyNpZm5kZWYgX1VUU05BTUVfVkVSU0lPTl9MRU5HVEgKKyMgZGVmaW5lIF9VVFNOQU1FX1ZFUlNJT05fTEVOR1RIIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisjaWZuZGVmIF9VVFNOQU1FX01BQ0hJTkVfTEVOR1RICisjIGRlZmluZSBfVVRTTkFNRV9NQUNISU5FX0xFTkdUSCBfVVRTTkFNRV9MRU5HVEgKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgc3lzdGVtIGFuZCBtYWNoaW5lLiAgKi8KK3N0cnVjdCB1dHNuYW1lCisgIHsKKyAgICAvKiBOYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gICovCisgICAgY2hhciBzeXNuYW1lW19VVFNOQU1FX1NZU05BTUVfTEVOR1RIXTsKKworICAgIC8qIE5hbWUgb2YgdGhpcyBub2RlIG9uIHRoZSBuZXR3b3JrLiAgKi8KKyAgICBjaGFyIG5vZGVuYW1lW19VVFNOQU1FX05PREVOQU1FX0xFTkdUSF07CisKKyAgICAvKiBDdXJyZW50IHJlbGVhc2UgbGV2ZWwgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbi4gICovCisgICAgY2hhciByZWxlYXNlW19VVFNOQU1FX1JFTEVBU0VfTEVOR1RIXTsKKyAgICAvKiBDdXJyZW50IHZlcnNpb24gbGV2ZWwgb2YgdGhpcyByZWxlYXNlLiAgKi8KKyAgICBjaGFyIHZlcnNpb25bX1VUU05BTUVfVkVSU0lPTl9MRU5HVEhdOworCisgICAgLyogTmFtZSBvZiB0aGUgaGFyZHdhcmUgdHlwZSB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcgb24uICAqLworICAgIGNoYXIgbWFjaGluZVtfVVRTTkFNRV9NQUNISU5FX0xFTkdUSF07CisKKyNpZiBfVVRTTkFNRV9ET01BSU5fTEVOR1RIIC0gMAorICAgIC8qIE5hbWUgb2YgdGhlIGRvbWFpbiBvZiB0aGlzIG5vZGUgb24gdGhlIG5ldHdvcmsuICAqLworIyBpZmRlZiBfX1VTRV9HTlUKKyAgICBjaGFyIGRvbWFpbm5hbWVbX1VUU05BTUVfRE9NQUlOX0xFTkdUSF07CisjIGVsc2UKKyAgICBjaGFyIF9fZG9tYWlubmFtZVtfVVRTTkFNRV9ET01BSU5fTEVOR1RIXTsKKyMgZW5kaWYKKyNlbmRpZgorICB9OworCisjaWZkZWYgX19VU0VfU1ZJRAorLyogTm90ZSB0aGF0IFNWSUQgYXNzdW1lcyBhbGwgbWVtYmVycyBoYXZlIHRoZSBzYW1lIHNpemUuICAqLworIyBkZWZpbmUgU1lTX05NTE4gIF9VVFNOQU1FX0xFTkdUSAorI2VuZGlmCisKKworLyogUHV0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeXN0ZW0gaW4gTkFNRS4gICovCitleHRlcm4gaW50IHVuYW1lIChzdHJ1Y3QgdXRzbmFtZSAqX19uYW1lKSBfX1RIUk9XOworCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBzeXMvdXRzbmFtZS5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdmZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy92ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTIyZDMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdmZzLmgKQEAgLTAsMCArMSw0IEBACisvKiBPdGhlciBzeXN0ZW1zIGRlY2xhcmUgYHN0cnVjdCBzdGF0ZnMnIGV0IGFsIGluIDxzeXMvdmZzLmg+LAorICAgc28gd2UgaGF2ZSB0aGlzIGZpbGUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHByb2dyYW1zIGV4cGVjdGluZyBpdC4gICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy92bGltaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3ZsaW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2EwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy92bGltaXQuaApAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1NZU19WTElNSVRfSAorI2RlZmluZSBfU1lTX1ZMSU1JVF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKK19fQkVHSU5fREVDTFMKKworLyogVGhpcyBpbnRlcmZhY2UgaXMgb2Jzb2xldGUsIGFuZCBpcyBzdXBlcnNlZGVkIGJ5IDxzeXMvcmVzb3VyY2UuaD4uICAqLworCisvKiBLaW5kcyBvZiByZXNvdXJjZSBsaW1pdC4gICovCitlbnVtIF9fdmxpbWl0X3Jlc291cmNlCit7CisgIC8qIFNldHRpbmcgdGhpcyBub24temVybyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJhaXNlIGxpbWl0cy4KKyAgICAgT25seSB0aGUgc3VwZXItdXNlIGNhbiBzZXQgaXQgdG8gemVyby4KKworICAgICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiByZWNlbnQgdmVyc2lvbnMgb2YgQlNELCBub3IgYnkKKyAgICAgdGhlIEdOVSBDIGxpYnJhcnkuICAqLworICBMSU1fTk9SQUlTRSwKKworICAvKiBDUFUgdGltZSBhdmFpbGFibGUgZm9yIGVhY2ggcHJvY2VzcyAoc2Vjb25kcykuICAqLworICBMSU1fQ1BVLAorCisgIC8qIExhcmdlc3QgZmlsZSB3aGljaCBjYW4gYmUgY3JlYXRlZCAoYnl0ZXMpLiAgKi8KKyAgTElNX0ZTSVpFLAorCisgIC8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSBzZWdtZW50IChieXRlcykuICAqLworICBMSU1fREFUQSwKKworICAvKiBNYXhpbXVtIHNpemUgb2YgdGhlIHN0YWNrIHNlZ21lbnQgKGJ5dGVzKS4gICovCisgIExJTV9TVEFDSywKKworICAvKiBMYXJnZXN0IGNvcmUgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCAoYnl0ZXMpLiAgKi8KKyAgTElNX0NPUkUsCisKKyAgLyogUmVzaWRlbnQgc2V0IHNpemUgKGJ5dGVzKS4gICovCisgIExJTV9NQVhSU1MKK307CisKKy8qIFRoaXMgbWVhbnMgbm8gbGltaXQuICAqLworI2RlZmluZSBJTkZJTklUWSAweDdmZmZmZmZmCisKKworLyogU2V0IHRoZSBzb2Z0IGxpbWl0IGZvciBSRVNPVVJDRSB0byBiZSBWQUxVRS4KKyAgIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuICAqLworZXh0ZXJuIGludCB2bGltaXQgKGVudW0gX192bGltaXRfcmVzb3VyY2UgX19yZXNvdXJjZSwgaW50IF9fdmFsdWUpIF9fVEhST1c7CisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy92bGltaXQuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3Z0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy92dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy92dC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxsaW51eC92dC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdnRpbWVzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy92dGltZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvdnRpbWVzLmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfVlRJTUVTX0gKKyNkZWZpbmUgX1NZU19WVElNRVNfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlOyB1c2UgYGdldHJ1c2FnZScgaW5zdGVhZC4gICovCisKKy8qIEdyYW51bGFyaXR5IG9mIHRoZSBgdm1fdXRpbWUnIGFuZCBgdm1fc3RpbWUnIGZpZWxkcyBvZiBhIGBzdHJ1Y3QgdnRpbWVzJy4KKyAgIChUaGlzIGlzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1hY2hpbmUncyBwb3dlciBzdXBwbHksIGluIEh6LikgICovCisjZGVmaW5lCVZUSU1FU19VTklUU19QRVJfU0VDT05ECTYwCisKK3N0cnVjdCB2dGltZXMKK3sKKyAgLyogVXNlciB0aW1lIHVzZWQgaW4gdW5pdHMgb2YgMS9WVElNRVNfVU5JVFNfUEVSX1NFQ09ORCBzZWNvbmRzLiAgKi8KKyAgaW50IHZtX3V0aW1lOworICAvKiBTeXN0ZW0gdGltZSB1c2VkIGluIHVuaXRzIG9mIDEvVlRJTUVTX1VOSVRTX1BFUl9TRUNPTkQgc2Vjb25kcy4gICovCisgIGludCB2bV9zdGltZTsKKworICAvKiBBbW91bnQgb2YgZGF0YSBhbmQgc3RhY2sgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHZtX2lkc3JzczsKKyAgLyogQW1vdW50IG9mIHRleHQgbWVtb3J5IHVzZWQgKGtpbG9ieXRlLXNlY29uZHMpLiAgKi8KKyAgdW5zaWduZWQgaW50IHZtX2l4cnNzOworICAvKiBNYXhpbXVtIHJlc2lkZW50IHNldCBzaXplICh0ZXh0LCBkYXRhLCBhbmQgc3RhY2spIChraWxvYnl0ZXMpLiAgKi8KKyAgaW50IHZtX21heHJzczsKKworICAvKiBOdW1iZXIgb2YgaGFyZCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSB0aGF0IHJlcXVpcmVkIEkvTykuICAqLworICBpbnQgdm1fbWFqZmx0OworICAvKiBOdW1iZXIgb2Ygc29mdCBwYWdlIGZhdWx0cyAoaS5lLiB0aG9zZSBzZXJ2aWNlZCBieSByZWNsYWltaW5nCisgICAgIGEgcGFnZSBmcm9tIHRoZSBsaXN0IG9mIHBhZ2VzIGF3YWl0aW5nIHJlYWxsb2NhdGlvbi4gICovCisgIGludCB2bV9taW5mbHQ7CisKKyAgLyogTnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgc3dhcHBlZCBvdXQgb2YgcGh5c2ljYWwgbWVtb3J5LiAgKi8KKyAgaW50IHZtX25zd2FwOworCisgIC8qIE51bWJlciBvZiBpbnB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICBOb3RlOiBUaGlzCisgICAgIGFuZCBgcnVfb3VibG9jaycgZG8gbm90IGluY2x1ZGUgb3BlcmF0aW9ucyB3aXRoIHRoZSBjYWNoZS4gICovCisgIGludCB2bV9pbmJsazsKKyAgLyogTnVtYmVyIG9mIG91dHB1dCBvcGVyYXRpb25zIHZpYSB0aGUgZmlsZSBzeXN0ZW0uICAqLworICBpbnQgdm1fb3VibGs7Cit9OworCisvKiBJZiBDVVJSRU5UIGlzIG5vdCBOVUxMLCB3cml0ZSBzdGF0aXN0aWNzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzIGludG8KKyAgICpDVVJSRU5ULiAgSWYgQ0hJTEQgaXMgbm90IE5VTEwsIHdyaXRlIHN0YXRpc3RpY3MgZm9yIGFsbCB0ZXJtaW5hdGVkIGNoaWxkCisgICBwcm9jZXNzZXMgaW50byAqQ0hJTEQuICBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLiAgKi8KK2V4dGVybiBpbnQgdnRpbWVzIChzdHJ1Y3QgdnRpbWVzICogX19jdXJyZW50LCBzdHJ1Y3QgdnRpbWVzICogX19jaGlsZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy92dGltZXMuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3dhaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzL3dhaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTEwMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMvd2FpdC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwxOTk2LTIwMDEsMjAwMywyMDA0LDIwMDUsMjAwNworCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJUE9TSVggU3RhbmRhcmQ6IDMuMi4xIFdhaXQgZm9yIFByb2Nlc3MgVGVybWluYXRpb24JPHN5cy93YWl0Lmg+CisgKi8KKworI2lmbmRlZglfU1lTX1dBSVRfSAorI2RlZmluZQlfU1lTX1dBSVRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworLyogVGhlc2UgbWFjcm9zIGNvdWxkIGFsc28gYmUgZGVmaW5lZCBpbiA8c3RkbGliLmg+LiAgKi8KKyNpZiAhZGVmaW5lZCBfU1RETElCX0ggfHwgIWRlZmluZWQgX19VU0VfWE9QRU4KKy8qIFRoaXMgd2lsbCBkZWZpbmUgdGhlIGBXKicgbWFjcm9zIGZvciB0aGUgZmxhZworICAgYml0cyB0byBgd2FpdHBpZCcsIGB3YWl0MycsIGFuZCBgd2FpdDQnLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy93YWl0ZmxhZ3MuaD4KKworIyBpZmRlZglfX1VTRV9CU0QKKworLyogTG90cyBvZiBoYWlyIHRvIGFsbG93IHRyYWRpdGlvbmFsIEJTRCB1c2Ugb2YgYHVuaW9uIHdhaXQnCisgICBhcyB3ZWxsIGFzIFBPU0lYLjEgdXNlIG9mIGBpbnQnIGZvciB0aGUgc3RhdHVzIHdvcmQuICAqLworCisjICBpZiBkZWZpbmVkIF9fR05VQ19fICYmICFkZWZpbmVkIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKSBcCisgIChfX2V4dGVuc2lvbl9fICgoKHVuaW9uIHsgX190eXBlb2Yoc3RhdHVzKSBfX2luOyBpbnQgX19pOyB9KSBcCisgICAgICAgICAgICAgICAgICAgeyAuX19pbiA9IChzdGF0dXMpIH0pLl9faSkpCisjICBlbHNlCisjICAgZGVmaW5lIF9fV0FJVF9JTlQoc3RhdHVzKQkoKihfX2NvbnN0IGludCAqKSAmKHN0YXR1cykpCisjICBlbmRpZgorCisvKiBUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCB0byBgd2FpdCcuICBUaGUgZnVua3kgdW5pb24KKyAgIGNhdXNlcyByZWRlY2xhcmF0aW9ucyB3aXRoIGV0aGVyIGBpbnQgKicgb3IgYHVuaW9uIHdhaXQgKicgdG8gYmUKKyAgIGFsbG93ZWQgd2l0aG91dCBjb21wbGFpbnQuICBfX1dBSVRfU1RBVFVTX0RFRk4gaXMgdGhlIHR5cGUgdXNlZCBpbgorICAgdGhlIGFjdHVhbCBmdW5jdGlvbiBkZWZpbml0aW9ucy4gICovCisKKyMgIGlmICFkZWZpbmVkIF9fR05VQ19fIHx8IF9fR05VQ19fIDwgMiB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVMJdm9pZCAqCisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTgl2b2lkICoKKyMgIGVsc2UKKy8qIFRoaXMgd29ya3MgaW4gR0NDIDIuNi4xIGFuZCBsYXRlci4gICovCit0eXBlZGVmIHVuaW9uCisgIHsKKyAgICB1bmlvbiB3YWl0ICpfX3VwdHI7CisgICAgaW50ICpfX2lwdHI7CisgIH0gX19XQUlUX1NUQVRVUyBfX2F0dHJpYnV0ZV9fICgoX190cmFuc3BhcmVudF91bmlvbl9fKSk7CisjICAgZGVmaW5lIF9fV0FJVF9TVEFUVVNfREVGTglpbnQgKgorIyAgZW5kaWYKKworIyBlbHNlIC8qIERvbid0IHVzZSBCU0QuICAqLworCisjICBkZWZpbmUgX19XQUlUX0lOVChzdGF0dXMpCShzdGF0dXMpCisjICBkZWZpbmUgX19XQUlUX1NUQVRVUwkJaW50ICoKKyMgIGRlZmluZSBfX1dBSVRfU1RBVFVTX0RFRk4JaW50ICoKKworIyBlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworLyogVGhpcyB3aWxsIGRlZmluZSBhbGwgdGhlIGBfX1cqJyBtYWNyb3MuICAqLworIyBpbmNsdWRlIDxiaXRzL3dhaXRzdGF0dXMuaD4KKworIyBkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdHVzKQlfX1dFWElUU1RBVFVTKF9fV0FJVF9JTlQoc3RhdHVzKSkKKyMgZGVmaW5lIFdURVJNU0lHKHN0YXR1cykJX19XVEVSTVNJRyhfX1dBSVRfSU5UKHN0YXR1cykpCisjIGRlZmluZSBXU1RPUFNJRyhzdGF0dXMpCV9fV1NUT1BTSUcoX19XQUlUX0lOVChzdGF0dXMpKQorIyBkZWZpbmUgV0lGRVhJVEVEKHN0YXR1cykJX19XSUZFWElURUQoX19XQUlUX0lOVChzdGF0dXMpKQorIyBkZWZpbmUgV0lGU0lHTkFMRUQoc3RhdHVzKQlfX1dJRlNJR05BTEVEKF9fV0FJVF9JTlQoc3RhdHVzKSkKKyMgZGVmaW5lIFdJRlNUT1BQRUQoc3RhdHVzKQlfX1dJRlNUT1BQRUQoX19XQUlUX0lOVChzdGF0dXMpKQorIyBpZmRlZiBfX1dJRkNPTlRJTlVFRAorIyAgZGVmaW5lIFdJRkNPTlRJTlVFRChzdGF0dXMpCV9fV0lGQ09OVElOVUVEKF9fV0FJVF9JTlQoc3RhdHVzKSkKKyMgZW5kaWYKKyNlbmRpZgkvKiA8c3RkbGliLmg+IG5vdCBpbmNsdWRlZC4gICovCisKKyNpZmRlZglfX1VTRV9CU0QKKyMgZGVmaW5lIFdDT1JFRkxBRwkJX19XQ09SRUZMQUcKKyMgZGVmaW5lIFdDT1JFRFVNUChzdGF0dXMpCV9fV0NPUkVEVU1QKF9fV0FJVF9JTlQoc3RhdHVzKSkKKyMgZGVmaW5lIFdfRVhJVENPREUocmV0LCBzaWcpCV9fV19FWElUQ09ERShyZXQsIHNpZykKKyMgZGVmaW5lIFdfU1RPUENPREUoc2lnKQlfX1dfU1RPUENPREUoc2lnKQorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkIGJ5IHRoZSBgd2FpdGlkJyBmdW5jdGlvbi4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KK3R5cGVkZWYgZW51bQoreworICBQX0FMTCwJCS8qIFdhaXQgZm9yIGFueSBjaGlsZC4gICovCisgIFBfUElELAkJLyogV2FpdCBmb3Igc3BlY2lmaWVkIHByb2Nlc3MuICAqLworICBQX1BHSUQJCS8qIFdhaXQgZm9yIG1lbWJlcnMgb2YgcHJvY2VzcyBncm91cC4gICovCit9IGlkdHlwZV90OworI2VuZGlmCisKKworLyogV2FpdCBmb3IgYSBjaGlsZCB0byBkaWUuICBXaGVuIG9uZSBkb2VzLCBwdXQgaXRzIHN0YXR1cyBpbiAqU1RBVF9MT0MKKyAgIGFuZCByZXR1cm4gaXRzIHByb2Nlc3MgSUQuICBGb3IgZXJyb3JzLCByZXR1cm4gKHBpZF90KSAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gX19waWRfdCB3YWl0IChfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MpOworCisjaWZkZWYJX19VU0VfQlNECisvKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIFBJRCBhcmd1bWVudCB0byBgd2FpdHBpZCcgYW5kIGB3YWl0NCcuICAqLworIyBkZWZpbmUgV0FJVF9BTlkJKC0xKQkvKiBBbnkgcHJvY2Vzcy4gICovCisjIGRlZmluZSBXQUlUX01ZUEdSUAkwCS8qIEFueSBwcm9jZXNzIGluIG15IHByb2Nlc3MgZ3JvdXAuICAqLworI2VuZGlmCisKKy8qIFdhaXQgZm9yIGEgY2hpbGQgbWF0Y2hpbmcgUElEIHRvIGRpZS4KKyAgIElmIFBJRCBpcyBncmVhdGVyIHRoYW4gMCwgbWF0Y2ggYW55IHByb2Nlc3Mgd2hvc2UgcHJvY2VzcyBJRCBpcyBQSUQuCisgICBJZiBQSUQgaXMgKHBpZF90KSAtMSwgbWF0Y2ggYW55IHByb2Nlc3MuCisgICBJZiBQSUQgaXMgKHBpZF90KSAwLCBtYXRjaCBhbnkgcHJvY2VzcyB3aXRoIHRoZQorICAgc2FtZSBwcm9jZXNzIGdyb3VwIGFzIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICBJZiBQSUQgaXMgbGVzcyB0aGFuIC0xLCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZQorICAgcHJvY2VzcyBncm91cCBpcyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgUElELgorICAgSWYgdGhlIFdOT0hBTkcgYml0IGlzIHNldCBpbiBPUFRJT05TLCBhbmQgdGhhdCBjaGlsZAorICAgaXMgbm90IGFscmVhZHkgZGVhZCwgcmV0dXJuIChwaWRfdCkgMC4gIElmIHN1Y2Nlc3NmdWwsCisgICByZXR1cm4gUElEIGFuZCBzdG9yZSB0aGUgZGVhZCBjaGlsZCdzIHN0YXR1cyBpbiBTVEFUX0xPQy4KKyAgIFJldHVybiAocGlkX3QpIC0xIGZvciBlcnJvcnMuICBJZiB0aGUgV1VOVFJBQ0VEIGJpdCBpcworICAgc2V0IGluIE9QVElPTlMsIHJldHVybiBzdGF0dXMgZm9yIHN0b3BwZWQgY2hpbGRyZW47IG90aGVyd2lzZSBkb24ndC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gX19waWRfdCB3YWl0cGlkIChfX3BpZF90IF9fcGlkLCBpbnQgKl9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMpOworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgZGVmaW5lIF9fbmVlZF9zaWdpbmZvX3QKKyMgaW5jbHVkZSA8Yml0cy9zaWdpbmZvLmg+CisvKiBXYWl0IGZvciBhIGNoaWxkaW5nIG1hdGNoaW5nIElEVFlQRSBhbmQgSUQgdG8gY2hhbmdlIHRoZSBzdGF0dXMgYW5kCisgICBwbGFjZSBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbiBpbiAqSU5GT1AuCisgICBJZiBJRFRZUEUgaXMgUF9QSUQsIG1hdGNoIGFueSBwcm9jZXNzIHdob3NlIHByb2Nlc3MgSUQgaXMgSUQuCisgICBJZiBJRFRZUEUgaXMgUF9QR0lELCBtYXRjaCBhbnkgcHJvY2VzcyB3aG9zZSBwcm9jZXNzIGdyb3VwIGlzIElELgorICAgSWYgSURUWVBFIGlzIFBfQUxMLCBtYXRjaCBhbnkgcHJvY2Vzcy4KKyAgIElmIHRoZSBXTk9IQU5HIGJpdCBpcyBzZXQgaW4gT1BUSU9OUywgYW5kIHRoYXQgY2hpbGQKKyAgIGlzIG5vdCBhbHJlYWR5IGRlYWQsIGNsZWFyICpJTkZPUCBhbmQgcmV0dXJuIDAuICBJZiBzdWNjZXNzZnVsLCBzdG9yZQorICAgZXhpdCBjb2RlIGFuZCBzdGF0dXMgaW4gKklORk9QLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgd2FpdGlkIChpZHR5cGVfdCBfX2lkdHlwZSwgX19pZF90IF9faWQsIHNpZ2luZm9fdCAqX19pbmZvcCwKKwkJICAgaW50IF9fb3B0aW9ucyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFRoaXMgYmVpbmcgaGVyZSBtYWtlcyB0aGUgcHJvdG90eXBlcyB2YWxpZCB3aGV0aGVyIG9yIG5vdAorICAgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIDxzeXMvcmVzb3VyY2UuaD4gdG8gZGVmaW5lIGBzdHJ1Y3QgcnVzYWdlJy4gICovCitzdHJ1Y3QgcnVzYWdlOworCisvKiBXYWl0IGZvciBhIGNoaWxkIHRvIGV4aXQuICBXaGVuIG9uZSBkb2VzLCBwdXQgaXRzIHN0YXR1cyBpbiAqU1RBVF9MT0MgYW5kCisgICByZXR1cm4gaXRzIHByb2Nlc3MgSUQuICBGb3IgZXJyb3JzIHJldHVybiAocGlkX3QpIC0xLiAgSWYgVVNBR0UgaXMgbm90CisgICBuaWwsIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGlsZCdzIHJlc291cmNlIHVzYWdlIHRoZXJlLiAgSWYgdGhlCisgICBXVU5UUkFDRUQgYml0IGlzIHNldCBpbiBPUFRJT05TLCByZXR1cm4gc3RhdHVzIGZvciBzdG9wcGVkIGNoaWxkcmVuOworICAgb3RoZXJ3aXNlIGRvbid0LiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQzIChfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMsCisJCSAgICAgIHN0cnVjdCBydXNhZ2UgKiBfX3VzYWdlKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9CU0QKKy8qIFBJRCBpcyBsaWtlIHdhaXRwaWQuICBPdGhlciBhcmdzIGFyZSBsaWtlIHdhaXQzLiAgKi8KK2V4dGVybiBfX3BpZF90IHdhaXQ0IChfX3BpZF90IF9fcGlkLCBfX1dBSVRfU1RBVFVTIF9fc3RhdF9sb2MsIGludCBfX29wdGlvbnMsCisJCSAgICAgIHN0cnVjdCBydXNhZ2UgKl9fdXNhZ2UpIF9fVEhST1c7CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHN5cy93YWl0LmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3N5cy94YXR0ci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzM3ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXMveGF0dHIuaApAQCAtMCwwICsxLDEwNCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9TWVNfWEFUVFJfSAorI2RlZmluZSBfU1lTX1hBVFRSX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZmlmdGggcGFyYW1ldGVyIG9mCisgICBgKnNldHhhdHRyJy4gICovCitlbnVtCit7CisgIFhBVFRSX0NSRUFURSA9IDEsCS8qIHNldCB2YWx1ZSwgZmFpbCBpZiBhdHRyIGFscmVhZHkgZXhpc3RzLiAgKi8KKyNkZWZpbmUgWEFUVFJfQ1JFQVRFCVhBVFRSX0NSRUFURQorICBYQVRUUl9SRVBMQUNFID0gMgkvKiBzZXQgdmFsdWUsIGZhaWwgaWYgYXR0ciBkb2VzIG5vdCBleGlzdC4gICovCisjZGVmaW5lIFhBVFRSX1JFUExBQ0UJWEFUVFJfUkVQTEFDRQorfTsKKworLyogU2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggdG8gVkFMVUUgKHdoaWNoCisgICBpcyBTSVpFIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHNldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCSAgICAgX19jb25zdCB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplLCBpbnQgX19mbGFncykKKwlfX1RIUk9XOworCisvKiBTZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2ggaXMKKyAgIFNJWkUgYnl0ZXMgbG9uZyksIG5vdCBmb2xsb3dpbmcgc3ltbGlua3MgZm9yIHRoZSBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4KKyAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIGludCBsc2V0eGF0dHIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwKKwkJICAgICAgX19jb25zdCB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplLCBpbnQgX19mbGFncykKKwlfX1RIUk9XOworCisvKiBTZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQgdG8gVkFMVUUgKHdoaWNoIGlzIFNJWkUKKyAgIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGZzZXR4YXR0ciAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lLCBfX2NvbnN0IHZvaWQgKl9fdmFsdWUsCisJCSAgICAgIHNpemVfdCBfX3NpemUsIGludCBfX2ZsYWdzKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCB0byBWQUxVRSAod2hpY2ggaXMKKyAgIFNJWkUgYnl0ZXMgbG9uZykuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGdldHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUsCisJCQkgdm9pZCAqX192YWx1ZSwgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworLyogR2V0IHRoZSBhdHRyaWJ1dGUgTkFNRSBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggdG8gVkFMVUUgKHdoaWNoIGlzCisgICBTSVpFIGJ5dGVzIGxvbmcpLCBub3QgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUgbGFzdCBwYXRobmFtZSBjb21wb25lbnQuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBzc2l6ZV90IGxnZXR4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lLAorCQkJICB2b2lkICpfX3ZhbHVlLCBzaXplX3QgX19zaXplKSBfX1RIUk9XOworCisvKiBHZXQgdGhlIGF0dHJpYnV0ZSBOQU1FIG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQgdG8gVkFMVUUgKHdoaWNoIGlzIFNJWkUKKyAgIGJ5dGVzIGxvbmcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBmZ2V0eGF0dHIgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbmFtZSwgdm9pZCAqX192YWx1ZSwKKwkJCSAgc2l6ZV90IF9fc2l6ZSkgX19USFJPVzsKKworLyogTGlzdCBhdHRyaWJ1dGVzIG9mIHRoZSBmaWxlIHBvaW50ZWQgdG8gYnkgUEFUSCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkCisgICBidWZmZXIgTElTVCAod2hpY2ggaXMgU0laRSBieXRlcyBiaWcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yCisgICBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgbGlzdHhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19saXN0LCBzaXplX3QgX19zaXplKQorCV9fVEhST1c7CisKKy8qIExpc3QgYXR0cmlidXRlcyBvZiB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEggaW50byB0aGUgdXNlci1zdXBwbGllZAorICAgYnVmZmVyIExJU1QgKHdoaWNoIGlzIFNJWkUgYnl0ZXMgYmlnKSwgbm90IGZvbGxvd2luZyBzeW1saW5rcyBmb3IgdGhlCisgICBsYXN0IHBhdGhuYW1lIGNvbXBvbmVudC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgbGxpc3R4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIGNoYXIgKl9fbGlzdCwgc2l6ZV90IF9fc2l6ZSkKKwlfX1RIUk9XOworCisvKiBMaXN0IGF0dHJpYnV0ZXMgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBGRCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlcgorICAgTElTVCAod2hpY2ggaXMgU0laRSBieXRlcyBiaWcpLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gc3NpemVfdCBmbGlzdHhhdHRyIChpbnQgX19mZCwgY2hhciAqX19saXN0LCBzaXplX3QgX19zaXplKQorCV9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgYXR0cmlidXRlIE5BTUUgZnJvbSB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEguICBSZXR1cm4gMAorICAgb24gc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IHJlbW92ZXhhdHRyIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKy8qIFJlbW92ZSB0aGUgYXR0cmlidXRlIE5BTUUgZnJvbSB0aGUgZmlsZSBwb2ludGVkIHRvIGJ5IFBBVEgsIG5vdAorICAgZm9sbG93aW5nIHN5bWxpbmtzIGZvciB0aGUgbGFzdCBwYXRobmFtZSBjb21wb25lbnQuICBSZXR1cm4gMCBvbgorICAgc3VjY2VzcywgLTEgZm9yIGVycm9ycy4gICovCitleHRlcm4gaW50IGxyZW1vdmV4YXR0ciAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XOworCisvKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZSBOQU1FIGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvciBGRC4gIFJldHVybiAwIG9uCisgICBzdWNjZXNzLCAtMSBmb3IgZXJyb3JzLiAgKi8KK2V4dGVybiBpbnQgZnJlbW92ZXhhdHRyIChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBzeXMveGF0dHIuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzY2FsbC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMDU3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzY2FsbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNleGl0cy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9zeXNleGl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjQ2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2V4aXRzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpc3lzZXhpdHMuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmCV9TWVNFWElUU19ICisjZGVmaW5lCV9TWVNFWElUU19IIDEKKworLyoKKyAqICBTWVNFWElUUy5IIC0tIEV4aXQgc3RhdHVzIGNvZGVzIGZvciBzeXN0ZW0gcHJvZ3JhbXMuCisgKgorICoJVGhpcyBpbmNsdWRlIGZpbGUgYXR0ZW1wdHMgdG8gY2F0ZWdvcml6ZSBwb3NzaWJsZSBlcnJvcgorICoJZXhpdCBzdGF0dXNlcyBmb3Igc3lzdGVtIHByb2dyYW1zLCBub3RhYmx5IGRlbGl2ZXJtYWlsCisgKglhbmQgdGhlIEJlcmtlbGV5IG5ldHdvcmsuCisgKgorICoJRXJyb3IgbnVtYmVycyBiZWdpbiBhdCBFWF9fQkFTRSB0byByZWR1Y2UgdGhlIHBvc3NpYmlsaXR5IG9mCisgKgljbGFzaGluZyB3aXRoIG90aGVyIGV4aXQgc3RhdHVzZXMgdGhhdCByYW5kb20gcHJvZ3JhbXMgbWF5CisgKglhbHJlYWR5IHJldHVybi4gIFRoZSBtZWFuaW5nIG9mIHRoZSBjb2RlcyBpcyBhcHByb3hpbWF0ZWx5CisgKglhcyBmb2xsb3dzOgorICoKKyAqCUVYX1VTQUdFIC0tIFRoZSBjb21tYW5kIHdhcyB1c2VkIGluY29ycmVjdGx5LCBlLmcuLCB3aXRoCisgKgkJdGhlIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMsIGEgYmFkIGZsYWcsIGEgYmFkCisgKgkJc3ludGF4IGluIGEgcGFyYW1ldGVyLCBvciB3aGF0ZXZlci4KKyAqCUVYX0RBVEFFUlIgLS0gVGhlIGlucHV0IGRhdGEgd2FzIGluY29ycmVjdCBpbiBzb21lIHdheS4KKyAqCQlUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHVzZXIncyBkYXRhICYgbm90CisgKgkJc3lzdGVtIGZpbGVzLgorICoJRVhfTk9JTlBVVCAtLSBBbiBpbnB1dCBmaWxlIChub3QgYSBzeXN0ZW0gZmlsZSkgZGlkIG5vdAorICoJCWV4aXN0IG9yIHdhcyBub3QgcmVhZGFibGUuICBUaGlzIGNvdWxkIGFsc28gaW5jbHVkZQorICoJCWVycm9ycyBsaWtlICJObyBtZXNzYWdlIiB0byBhIG1haWxlciAoaWYgaXQgY2FyZWQKKyAqCQl0byBjYXRjaCBpdCkuCisgKglFWF9OT1VTRVIgLS0gVGhlIHVzZXIgc3BlY2lmaWVkIGRpZCBub3QgZXhpc3QuICBUaGlzIG1pZ2h0CisgKgkJYmUgdXNlZCBmb3IgbWFpbCBhZGRyZXNzZXMgb3IgcmVtb3RlIGxvZ2lucy4KKyAqCUVYX05PSE9TVCAtLSBUaGUgaG9zdCBzcGVjaWZpZWQgZGlkIG5vdCBleGlzdC4gIFRoaXMgaXMgdXNlZAorICoJCWluIG1haWwgYWRkcmVzc2VzIG9yIG5ldHdvcmsgcmVxdWVzdHMuCisgKglFWF9VTkFWQUlMQUJMRSAtLSBBIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUuICBUaGlzIGNhbiBvY2N1cgorICoJCWlmIGEgc3VwcG9ydCBwcm9ncmFtIG9yIGZpbGUgZG9lcyBub3QgZXhpc3QuICBUaGlzCisgKgkJY2FuIGFsc28gYmUgdXNlZCBhcyBhIGNhdGNoYWxsIG1lc3NhZ2Ugd2hlbiBzb21ldGhpbmcKKyAqCQl5b3Ugd2FudGVkIHRvIGRvIGRvZXNuJ3Qgd29yaywgYnV0IHlvdSBkb24ndCBrbm93CisgKgkJd2h5LgorICoJRVhfU09GVFdBUkUgLS0gQW4gaW50ZXJuYWwgc29mdHdhcmUgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQuCisgKgkJVGhpcyBzaG91bGQgYmUgbGltaXRlZCB0byBub24tb3BlcmF0aW5nIHN5c3RlbSByZWxhdGVkCisgKgkJZXJyb3JzIGFzIHBvc3NpYmxlLgorICoJRVhfT1NFUlIgLS0gQW4gb3BlcmF0aW5nIHN5c3RlbSBlcnJvciBoYXMgYmVlbiBkZXRlY3RlZC4KKyAqCQlUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHN1Y2ggdGhpbmdzIGFzICJjYW5ub3QKKyAqCQlmb3JrIiwgImNhbm5vdCBjcmVhdGUgcGlwZSIsIG9yIHRoZSBsaWtlLiAgSXQgaW5jbHVkZXMKKyAqCQl0aGluZ3MgbGlrZSBnZXR1aWQgcmV0dXJuaW5nIGEgdXNlciB0aGF0IGRvZXMgbm90CisgKgkJZXhpc3QgaW4gdGhlIHBhc3N3ZCBmaWxlLgorICoJRVhfT1NGSUxFIC0tIFNvbWUgc3lzdGVtIGZpbGUgKGUuZy4sIC9ldGMvcGFzc3dkLCAvZXRjL3V0bXAsCisgKgkJZXRjLikgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBiZSBvcGVuZWQsIG9yIGhhcyBzb21lCisgKgkJc29ydCBvZiBlcnJvciAoZS5nLiwgc3ludGF4IGVycm9yKS4KKyAqCUVYX0NBTlRDUkVBVCAtLSBBICh1c2VyIHNwZWNpZmllZCkgb3V0cHV0IGZpbGUgY2Fubm90IGJlCisgKgkJY3JlYXRlZC4KKyAqCUVYX0lPRVJSIC0tIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGRvaW5nIEkvTyBvbiBzb21lIGZpbGUuCisgKglFWF9URU1QRkFJTCAtLSB0ZW1wb3JhcnkgZmFpbHVyZSwgaW5kaWNhdGluZyBzb21ldGhpbmcgdGhhdAorICoJCWlzIG5vdCByZWFsbHkgYW4gZXJyb3IuICBJbiBzZW5kbWFpbCwgdGhpcyBtZWFucworICoJCXRoYXQgYSBtYWlsZXIgKGUuZy4pIGNvdWxkIG5vdCBjcmVhdGUgYSBjb25uZWN0aW9uLAorICoJCWFuZCB0aGUgcmVxdWVzdCBzaG91bGQgYmUgcmVhdHRlbXB0ZWQgbGF0ZXIuCisgKglFWF9QUk9UT0NPTCAtLSB0aGUgcmVtb3RlIHN5c3RlbSByZXR1cm5lZCBzb21ldGhpbmcgdGhhdAorICoJCXdhcyAibm90IHBvc3NpYmxlIiBkdXJpbmcgYSBwcm90b2NvbCBleGNoYW5nZS4KKyAqCUVYX05PUEVSTSAtLSBZb3UgZGlkIG5vdCBoYXZlIHN1ZmZpY2llbnQgcGVybWlzc2lvbiB0bworICoJCXBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gIFRoaXMgaXMgbm90IGludGVuZGVkIGZvcgorICoJCWZpbGUgc3lzdGVtIHByb2JsZW1zLCB3aGljaCBzaG91bGQgdXNlIE5PSU5QVVQgb3IKKyAqCQlDQU5UQ1JFQVQsIGJ1dCByYXRoZXIgZm9yIGhpZ2hlciBsZXZlbCBwZXJtaXNzaW9ucy4KKyAqLworCisjZGVmaW5lIEVYX09LCQkwCS8qIHN1Y2Nlc3NmdWwgdGVybWluYXRpb24gKi8KKworI2RlZmluZSBFWF9fQkFTRQk2NAkvKiBiYXNlIHZhbHVlIGZvciBlcnJvciBtZXNzYWdlcyAqLworCisjZGVmaW5lIEVYX1VTQUdFCTY0CS8qIGNvbW1hbmQgbGluZSB1c2FnZSBlcnJvciAqLworI2RlZmluZSBFWF9EQVRBRVJSCTY1CS8qIGRhdGEgZm9ybWF0IGVycm9yICovCisjZGVmaW5lIEVYX05PSU5QVVQJNjYJLyogY2Fubm90IG9wZW4gaW5wdXQgKi8KKyNkZWZpbmUgRVhfTk9VU0VSCTY3CS8qIGFkZHJlc3NlZSB1bmtub3duICovCisjZGVmaW5lIEVYX05PSE9TVAk2OAkvKiBob3N0IG5hbWUgdW5rbm93biAqLworI2RlZmluZSBFWF9VTkFWQUlMQUJMRQk2OQkvKiBzZXJ2aWNlIHVuYXZhaWxhYmxlICovCisjZGVmaW5lIEVYX1NPRlRXQVJFCTcwCS8qIGludGVybmFsIHNvZnR3YXJlIGVycm9yICovCisjZGVmaW5lIEVYX09TRVJSCTcxCS8qIHN5c3RlbSBlcnJvciAoZS5nLiwgY2FuJ3QgZm9yaykgKi8KKyNkZWZpbmUgRVhfT1NGSUxFCTcyCS8qIGNyaXRpY2FsIE9TIGZpbGUgbWlzc2luZyAqLworI2RlZmluZSBFWF9DQU5UQ1JFQVQJNzMJLyogY2FuJ3QgY3JlYXRlICh1c2VyKSBvdXRwdXQgZmlsZSAqLworI2RlZmluZSBFWF9JT0VSUgk3NAkvKiBpbnB1dC9vdXRwdXQgZXJyb3IgKi8KKyNkZWZpbmUgRVhfVEVNUEZBSUwJNzUJLyogdGVtcCBmYWlsdXJlOyB1c2VyIGlzIGludml0ZWQgdG8gcmV0cnkgKi8KKyNkZWZpbmUgRVhfUFJPVE9DT0wJNzYJLyogcmVtb3RlIGVycm9yIGluIHByb3RvY29sICovCisjZGVmaW5lIEVYX05PUEVSTQk3NwkvKiBwZXJtaXNzaW9uIGRlbmllZCAqLworI2RlZmluZSBFWF9DT05GSUcJNzgJLyogY29uZmlndXJhdGlvbiBlcnJvciAqLworCisjZGVmaW5lIEVYX19NQVgJNzgJLyogbWF4aW11bSBsaXN0ZWQgdmFsdWUgKi8KKworI2VuZGlmIC8qIHN5c2V4aXRzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvc3lzbG9nLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMGI0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3N5c2xvZy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvc3lzbG9nLmg+CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Rhci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZlZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90YXIuaApAQCAtMCwwICsxLDEwOCBAQAorLyogRXh0ZW5kZWQgdGFyIGZvcm1hdCBmcm9tIFBPU0lYLjEuCisgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIFdyaXR0ZW4gYnkgRGF2aWQgSi4gTWFjS2VuemllLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZglfVEFSX0gKKyNkZWZpbmUJX1RBUl9ICTEKKworLyogQSB0YXIgYXJjaGl2ZSBjb25zaXN0cyBvZiA1MTItYnl0ZSBibG9ja3MuCisgICBFYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUgaGFzIGEgaGVhZGVyIGJsb2NrIGZvbGxvd2VkIGJ5IDArIGRhdGEgYmxvY2tzLgorICAgVHdvIGJsb2NrcyBvZiBOVUwgYnl0ZXMgaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gICovCisKKy8qIFRoZSBmaWVsZHMgb2YgaGVhZGVyIGJsb2NrczoKKyAgIEFsbCBzdHJpbmdzIGFyZSBzdG9yZWQgYXMgSVNPIDY0NiAoYXBwcm94aW1hdGVseSBBU0NJSSkgc3RyaW5ncy4KKworICAgRmllbGRzIGFyZSBudW1lcmljIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQgYmVsb3c7IG51bWJlcnMgYXJlIElTTyA2NDYKKyAgIHJlcHJlc2VudGF0aW9ucyBvZiBvY3RhbCBudW1iZXJzLCB3aXRoIGxlYWRpbmcgemVyb3MgYXMgbmVlZGVkLgorCisgICBsaW5rbmFtZSBpcyBvbmx5IHZhbGlkIHdoZW4gdHlwZWZsYWc9PUxOS1RZUEUuICBJdCBkb2Vzbid0IHVzZSBwcmVmaXg7CisgICBmaWxlcyB0aGF0IGFyZSBsaW5rcyB0byBwYXRobmFtZXMgPjEwMCBjaGFycyBsb25nIGNhbiBub3QgYmUgc3RvcmVkCisgICBpbiBhIHRhciBhcmNoaXZlLgorCisgICBJZiB0eXBlZmxhZz09e0xOS1RZUEUsU1lNVFlQRSxESVJUWVBFfSB0aGVuIHNpemUgbXVzdCBiZSAwLgorCisgICBkZXZtYWpvciBhbmQgZGV2bWlub3IgYXJlIG9ubHkgdmFsaWQgZm9yIHR5cGVmbGFnPT17QkxLVFlQRSxDSFJUWVBFfS4KKworICAgY2hrc3VtIGNvbnRhaW5zIHRoZSBzdW0gb2YgYWxsIDUxMiBieXRlcyBpbiB0aGUgaGVhZGVyIGJsb2NrLAorICAgdHJlYXRpbmcgZWFjaCBieXRlIGFzIGFuIDgtYml0IHVuc2lnbmVkIHZhbHVlIGFuZCB0cmVhdGluZyB0aGUKKyAgIDggYnl0ZXMgb2YgY2hrc3VtIGFzIGJsYW5rIGNoYXJhY3RlcnMuCisKKyAgIHVuYW1lIGFuZCBnbmFtZSBhcmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIHVpZCBhbmQgZ2lkLCBpZiB0aG9zZQorICAgbmFtZXMgZXhpc3QgbG9jYWxseS4KKworICAgRmllbGQgTmFtZQlCeXRlIE9mZnNldAlMZW5ndGggaW4gQnl0ZXMJRmllbGQgVHlwZQorICAgbmFtZQkJMAkJMTAwCQlOVUwtdGVybWluYXRlZCBpZiBOVUwgZml0cworICAgbW9kZQkJMTAwCQk4CisgICB1aWQJCTEwOAkJOAorICAgZ2lkCQkxMTYJCTgKKyAgIHNpemUJCTEyNAkJMTIKKyAgIG10aW1lCTEzNgkJMTIKKyAgIGNoa3N1bQkxNDgJCTgKKyAgIHR5cGVmbGFnCTE1NgkJMQkJc2VlIGJlbG93CisgICBsaW5rbmFtZQkxNTcJCTEwMAkJTlVMLXRlcm1pbmF0ZWQgaWYgTlVMIGZpdHMKKyAgIG1hZ2ljCTI1NwkJNgkJbXVzdCBiZSBUTUFHSUMgKE5VTCB0ZXJtLikKKyAgIHZlcnNpb24JMjYzCQkyCQltdXN0IGJlIFRWRVJTSU9OCisgICB1bmFtZQkyNjUJCTMyCQlOVUwtdGVybWluYXRlZAorICAgZ25hbWUJMjk3CQkzMgkJTlVMLXRlcm1pbmF0ZWQKKyAgIGRldm1ham9yCTMyOQkJOAorICAgZGV2bWlub3IJMzM3CQk4CisgICBwcmVmaXgJMzQ1CQkxNTUJCU5VTC10ZXJtaW5hdGVkIGlmIE5VTCBmaXRzCisKKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgcHJlZml4IGlzICdcMCcsIHRoZSBmaWxlIG5hbWUgaXMgbmFtZTsKKyAgIG90aGVyd2lzZSwgaXQgaXMgcHJlZml4L25hbWUuICBGaWxlcyB3aG9zZSBwYXRobmFtZXMgZG9uJ3QgZml0IGluIHRoYXQKKyAgIGxlbmd0aCBjYW4gbm90IGJlIHN0b3JlZCBpbiBhIHRhciBhcmNoaXZlLiAgKi8KKworLyogVGhlIGJpdHMgaW4gbW9kZTogKi8KKyNkZWZpbmUgVFNVSUQJMDQwMDAKKyNkZWZpbmUgVFNHSUQJMDIwMDAKKyNkZWZpbmUgVFNWVFgJMDEwMDAKKyNkZWZpbmUgVFVSRUFECTAwNDAwCisjZGVmaW5lIFRVV1JJVEUJMDAyMDAKKyNkZWZpbmUgVFVFWEVDCTAwMTAwCisjZGVmaW5lIFRHUkVBRAkwMDA0MAorI2RlZmluZSBUR1dSSVRFCTAwMDIwCisjZGVmaW5lIFRHRVhFQwkwMDAxMAorI2RlZmluZSBUT1JFQUQJMDAwMDQKKyNkZWZpbmUgVE9XUklURQkwMDAwMgorI2RlZmluZSBUT0VYRUMJMDAwMDEKKworLyogVGhlIHZhbHVlcyBmb3IgdHlwZWZsYWc6CisgICBWYWx1ZXMgJ0EnLSdaJyBhcmUgcmVzZXJ2ZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMuCisgICBBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIFBPU0lYLjEgcmV2aXNpb25zLiAgKi8KKworI2RlZmluZSBSRUdUWVBFCQknMCcJLyogUmVndWxhciBmaWxlIChwcmVmZXJyZWQgY29kZSkuICAqLworI2RlZmluZSBBUkVHVFlQRQknXDAnCS8qIFJlZ3VsYXIgZmlsZSAoYWx0ZXJuYXRlIGNvZGUpLiAgKi8KKyNkZWZpbmUgTE5LVFlQRQkJJzEnCS8qIEhhcmQgbGluay4gICovCisjZGVmaW5lIFNZTVRZUEUJCScyJwkvKiBTeW1ib2xpYyBsaW5rIChoYXJkIGlmIG5vdCBzdXBwb3J0ZWQpLiAgKi8KKyNkZWZpbmUgQ0hSVFlQRQkJJzMnCS8qIENoYXJhY3RlciBzcGVjaWFsLiAgKi8KKyNkZWZpbmUgQkxLVFlQRQkJJzQnCS8qIEJsb2NrIHNwZWNpYWwuICAqLworI2RlZmluZSBESVJUWVBFCQknNScJLyogRGlyZWN0b3J5LiAgKi8KKyNkZWZpbmUgRklGT1RZUEUJJzYnCS8qIE5hbWVkIHBpcGUuICAqLworI2RlZmluZSBDT05UVFlQRQknNycJLyogQ29udGlndW91cyBmaWxlICovCisgLyogKHJlZ3VsYXIgZmlsZSBpZiBub3Qgc3VwcG9ydGVkKS4gICovCisKKy8qIENvbnRlbnRzIG9mIG1hZ2ljIGZpZWxkIGFuZCBpdHMgbGVuZ3RoLiAgKi8KKyNkZWZpbmUgVE1BR0lDCSJ1c3RhciIKKyNkZWZpbmUgVE1BR0xFTgk2CisKKy8qIENvbnRlbnRzIG9mIHRoZSB2ZXJzaW9uIGZpZWxkIGFuZCBpdHMgbGVuZ3RoLiAgKi8KKyNkZWZpbmUgVFZFUlNJT04JIjAwIgorI2RlZmluZSBUVkVSU0xFTgkyCisKKyNlbmRpZiAvKiB0YXIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA5ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtLmgKQEAgLTAsMCArMSw3OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgICovCisvKiAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGFuZDogVGhvbWFzIEUuIERpY2tleSAgICAgICAgICAgICAgICAgICAgICAgIDE5OTUtb24gICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRJZDogTUt0ZXJtLmguYXdrLmluLHYgMS40OSAyMDA3LzA4LzE4IDExOjQ0OjI2IHRvbSBFeHAgJCAqLworCisvKgorKioJdGVybS5oIC0tIERlZmluaXRpb24gb2Ygc3RydWN0IHRlcm0KKyovCisKKyNpZm5kZWYgTkNVUlNFU19URVJNX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX1RFUk1fSF9pbmNsIDEKKworI3VuZGVmICBOQ1VSU0VTX1ZFUlNJT04KKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OICI1LjYiCisKKyNpbmNsdWRlIDxuY3Vyc2VzX2RsbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE1ha2UgdGhpcyBmaWxlIHNlbGYtY29udGFpbmVkIGJ5IHByb3ZpZGluZyBkZWZhdWx0cyBmb3IgdGhlIEhBVkVfVEVSTUlPW1NdX0gKKyAqIGRlZmluaXRpb24gKGJhc2VkIG9uIHRoZSBzeXN0ZW0gZm9yIHdoaWNoIHRoaXMgd2FzIGNvbmZpZ3VyZWQpLgorICovCisKKyN1bmRlZiAgTkNVUlNFU19DT05TVAorI2RlZmluZSBOQ1VSU0VTX0NPTlNUIGNvbnN0CisKKyN1bmRlZiAgTkNVUlNFU19TQk9PTAorI2RlZmluZSBOQ1VSU0VTX1NCT09MIGNoYXIKKworI3VuZGVmICBOQ1VSU0VTX1hOQU1FUworI2RlZmluZSBOQ1VSU0VTX1hOQU1FUyAxCisKKy8qIFdlIHdpbGwgdXNlIHRoZXNlIHN5bWJvbHMgdG8gaGlkZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgKiB0ZXJtaW9zL3Rlcm1pby9zZ3R0eWIgaW50ZXJmYWNlcy4KKyAqLworI3VuZGVmICBUVFkKKyN1bmRlZiAgU0VUX1RUWQorI3VuZGVmICBHRVRfVFRZCisKKy8qIEFzc3VtZSBQT1NJWCB0ZXJtaW8gaWYgd2UgaGF2ZSB0aGUgaGVhZGVyIGFuZCBmdW5jdGlvbiAqLworLyogI2lmIEhBVkVfVEVSTUlPU19IICYmIEhBVkVfVENHRVRBVFRSICovCisjaWYgMSAmJiAxCisKKyN1bmRlZiAgVEVSTUlPUworI2RlZmluZSBURVJNSU9TIDEKKworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNkZWZpbmUgVFRZIHN0cnVjdCB0ZXJtaW9zCisKKyNlbHNlIC8qICFIQVZFX1RFUk1JT1NfSCAqLworCisvKiAjaWYgSEFWRV9URVJNSU9fSCAqLworI2lmIDEKKworI3VuZGVmICBURVJNSU9TCisjZGVmaW5lIFRFUk1JT1MgMQorCisjaW5jbHVkZSA8dGVybWlvLmg+CisjZGVmaW5lIFRUWSBzdHJ1Y3QgdGVybWlvCisKKy8qIEFkZCBkZWZpbml0aW9ucyB0byBtYWtlIHRlcm1pbyBsb29rIGxpa2UgdGVybWlvcy4KKyAqIEJ1dCBpZmRlZiBpdCwgc2luY2UgdGhlcmUgYXJlIHNvbWUgaW1wbGVtZW50YXRpb25zCisgKiB0aGF0IHRyeSB0byBkbyB0aGlzIGZvciB1cyBpbiBhIGZha2UgPHRlcm1pby5oPi4KKyAqLworI2lmbmRlZiBUQ1NBTk9XCisjZGVmaW5lIFRDU0FOT1cgVENTRVRBCisjZW5kaWYKKyNpZm5kZWYgVENTQURSQUlOCisjZGVmaW5lIFRDU0FEUkFJTiBUQ1NFVEFXCisjZW5kaWYKKyNpZm5kZWYgVENTQUZMVVNICisjZGVmaW5lIFRDU0FGTFVTSCBUQ1NFVEFGCisjZW5kaWYKKyNpZm5kZWYgdGNzZXRhdHRyCisjZGVmaW5lIHRjc2V0YXR0cihmZCwgY21kLCBhcmcpIGlvY3RsKGZkLCBjbWQsIGFyZykKKyNlbmRpZgorI2lmbmRlZiB0Y2dldGF0dHIKKyNkZWZpbmUgdGNnZXRhdHRyKGZkLCBhcmcpIGlvY3RsKGZkLCBUQ0dFVEEsIGFyZykKKyNlbmRpZgorI2lmbmRlZiBjZmdldG9zcGVlZAorI2RlZmluZSBjZmdldG9zcGVlZCh0KSAoKHQpLT5jX2NmbGFnICYgQ0JBVUQpCisjZW5kaWYKKyNpZm5kZWYgVENJRkxVU0ggCisjZGVmaW5lIFRDSUZMVVNIIDAKKyNlbmRpZgorI2lmbmRlZiBUQ09GTFVTSCAKKyNkZWZpbmUgVENPRkxVU0ggMQorI2VuZGlmCisjaWZuZGVmIFRDSU9GTFVTSCAKKyNkZWZpbmUgVENJT0ZMVVNIIDIKKyNlbmRpZgorI2lmbmRlZiB0Y2ZsdXNoCisjZGVmaW5lIHRjZmx1c2goZmQsIGFyZykgaW9jdGwoZmQsIFRDRkxTSCwgYXJnKQorI2VuZGlmCisKKyNlbHNlIC8qICFIQVZFX1RFUk1JT19IICovCisKKyN1bmRlZiBURVJNSU9TCisjaW5jbHVkZSA8c2d0dHkuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNkZWZpbmUgVFRZIHN0cnVjdCBzZ3R0eWIKKworI2VuZGlmIC8qIEhBVkVfVEVSTUlPX0ggKi8KKworI2VuZGlmIC8qIEhBVkVfVEVSTUlPU19IICovCisKKyNpZmRlZiBURVJNSU9TCisjZGVmaW5lIEdFVF9UVFkoZmQsIGJ1ZikgdGNnZXRhdHRyKGZkLCBidWYpCisjZGVmaW5lIFNFVF9UVFkoZmQsIGJ1ZikgdGNzZXRhdHRyKGZkLCBUQ1NBRFJBSU4sIGJ1ZikKKyNlbHNlCisjZGVmaW5lIEdFVF9UVFkoZmQsIGJ1ZikgZ3R0eShmZCwgYnVmKQorI2RlZmluZSBTRVRfVFRZKGZkLCBidWYpIHN0dHkoZmQsIGJ1ZikKKyNlbmRpZgorCisjZGVmaW5lIE5BTUVTSVpFIDI1NgorCisjZGVmaW5lIENVUiBjdXJfdGVybS0+dHlwZS4KKworI2RlZmluZSBhdXRvX2xlZnRfbWFyZ2luICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzBdCisjZGVmaW5lIGF1dG9fcmlnaHRfbWFyZ2luICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMV0KKyNkZWZpbmUgbm9fZXNjX2N0bGMgICAgICAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1syXQorI2RlZmluZSBjZW9sX3N0YW5kb3V0X2dsaXRjaCAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzNdCisjZGVmaW5lIGVhdF9uZXdsaW5lX2dsaXRjaCAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNF0KKyNkZWZpbmUgZXJhc2Vfb3ZlcnN0cmlrZSAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1s1XQorI2RlZmluZSBnZW5lcmljX3R5cGUgICAgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzZdCisjZGVmaW5lIGhhcmRfY29weSAgICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbN10KKyNkZWZpbmUgaGFzX21ldGFfa2V5ICAgICAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1s4XQorI2RlZmluZSBoYXNfc3RhdHVzX2xpbmUgICAgICAgICAgICAgICAgQ1VSIEJvb2xlYW5zWzldCisjZGVmaW5lIGluc2VydF9udWxsX2dsaXRjaCAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTBdCisjZGVmaW5lIG1lbW9yeV9hYm92ZSAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTFdCisjZGVmaW5lIG1lbW9yeV9iZWxvdyAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTJdCisjZGVmaW5lIG1vdmVfaW5zZXJ0X21vZGUgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTNdCisjZGVmaW5lIG1vdmVfc3RhbmRvdXRfbW9kZSAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTRdCisjZGVmaW5lIG92ZXJfc3RyaWtlICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTVdCisjZGVmaW5lIHN0YXR1c19saW5lX2VzY19vayAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTZdCisjZGVmaW5lIGRlc3RfdGFic19tYWdpY19zbXNvICAgICAgICAgICBDVVIgQm9vbGVhbnNbMTddCisjZGVmaW5lIHRpbGRlX2dsaXRjaCAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMThdCisjZGVmaW5lIHRyYW5zcGFyZW50X3VuZGVybGluZSAgICAgICAgICBDVVIgQm9vbGVhbnNbMTldCisjZGVmaW5lIHhvbl94b2ZmICAgICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjBdCisjZGVmaW5lIG5lZWRzX3hvbl94b2ZmICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjFdCisjZGVmaW5lIHBydHJfc2lsZW50ICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjJdCisjZGVmaW5lIGhhcmRfY3Vyc29yICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjNdCisjZGVmaW5lIG5vbl9yZXZfcm1jdXAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjRdCisjZGVmaW5lIG5vX3BhZF9jaGFyICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjVdCisjZGVmaW5lIG5vbl9kZXN0X3Njcm9sbF9yZWdpb24gICAgICAgICBDVVIgQm9vbGVhbnNbMjZdCisjZGVmaW5lIGNhbl9jaGFuZ2UgICAgICAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjddCisjZGVmaW5lIGJhY2tfY29sb3JfZXJhc2UgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMjhdCisjZGVmaW5lIGh1ZV9saWdodG5lc3Nfc2F0dXJhdGlvbiAgICAgICBDVVIgQm9vbGVhbnNbMjldCisjZGVmaW5lIGNvbF9hZGRyX2dsaXRjaCAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzBdCisjZGVmaW5lIGNyX2NhbmNlbHNfbWljcm9fbW9kZSAgICAgICAgICBDVVIgQm9vbGVhbnNbMzFdCisjZGVmaW5lIGhhc19wcmludF93aGVlbCAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzJdCisjZGVmaW5lIHJvd19hZGRyX2dsaXRjaCAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzNdCisjZGVmaW5lIHNlbWlfYXV0b19yaWdodF9tYXJnaW4gICAgICAgICBDVVIgQm9vbGVhbnNbMzRdCisjZGVmaW5lIGNwaV9jaGFuZ2VzX3JlcyAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzVdCisjZGVmaW5lIGxwaV9jaGFuZ2VzX3JlcyAgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbMzZdCisjZGVmaW5lIGNvbHVtbnMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1swXQorI2RlZmluZSBpbml0X3RhYnMgICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMV0KKyNkZWZpbmUgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzJdCisjZGVmaW5lIGxpbmVzX29mX21lbW9yeSAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szXQorI2RlZmluZSBtYWdpY19jb29raWVfZ2xpdGNoICAgICAgICAgICAgQ1VSIE51bWJlcnNbNF0KKyNkZWZpbmUgcGFkZGluZ19iYXVkX3JhdGUgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzVdCisjZGVmaW5lIHZpcnR1YWxfdGVybWluYWwgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1s2XQorI2RlZmluZSB3aWR0aF9zdGF0dXNfbGluZSAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbN10KKyNkZWZpbmUgbnVtX2xhYmVscyAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzhdCisjZGVmaW5lIGxhYmVsX2hlaWdodCAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1s5XQorI2RlZmluZSBsYWJlbF93aWR0aCAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTBdCisjZGVmaW5lIG1heF9hdHRyaWJ1dGVzICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxMV0KKyNkZWZpbmUgbWF4aW11bV93aW5kb3dzICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzEyXQorI2RlZmluZSBtYXhfY29sb3JzICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTNdCisjZGVmaW5lIG1heF9wYWlycyAgICAgICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxNF0KKyNkZWZpbmUgbm9fY29sb3JfdmlkZW8gICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzE1XQorI2RlZmluZSBidWZmZXJfY2FwYWNpdHkgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTZdCisjZGVmaW5lIGRvdF92ZXJ0X3NwYWNpbmcgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1sxN10KKyNkZWZpbmUgZG90X2hvcnpfc3BhY2luZyAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzE4XQorI2RlZmluZSBtYXhfbWljcm9fYWRkcmVzcyAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMTldCisjZGVmaW5lIG1heF9taWNyb19qdW1wICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syMF0KKyNkZWZpbmUgbWljcm9fY29sX3NpemUgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzIxXQorI2RlZmluZSBtaWNyb19saW5lX3NpemUgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjJdCisjZGVmaW5lIG51bWJlcl9vZl9waW5zICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syM10KKyNkZWZpbmUgb3V0cHV0X3Jlc19jaGFyICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzI0XQorI2RlZmluZSBvdXRwdXRfcmVzX2xpbmUgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjVdCisjZGVmaW5lIG91dHB1dF9yZXNfaG9yel9pbmNoICAgICAgICAgICBDVVIgTnVtYmVyc1syNl0KKyNkZWZpbmUgb3V0cHV0X3Jlc192ZXJ0X2luY2ggICAgICAgICAgIENVUiBOdW1iZXJzWzI3XQorI2RlZmluZSBwcmludF9yYXRlICAgICAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMjhdCisjZGVmaW5lIHdpZGVfY2hhcl9zaXplICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1syOV0KKyNkZWZpbmUgYnV0dG9ucyAgICAgICAgICAgICAgICAgICAgICAgIENVUiBOdW1iZXJzWzMwXQorI2RlZmluZSBiaXRfaW1hZ2VfZW50d2luaW5nICAgICAgICAgICAgQ1VSIE51bWJlcnNbMzFdCisjZGVmaW5lIGJpdF9pbWFnZV90eXBlICAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szMl0KKyNkZWZpbmUgYmFja190YWIgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzBdCisjZGVmaW5lIGJlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxXQorI2RlZmluZSBjYXJyaWFnZV9yZXR1cm4gICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMl0KKyNkZWZpbmUgY2hhbmdlX3Njcm9sbF9yZWdpb24gICAgICAgICAgIENVUiBTdHJpbmdzWzNdCisjZGVmaW5lIGNsZWFyX2FsbF90YWJzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0XQorI2RlZmluZSBjbGVhcl9zY3JlZW4gICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNV0KKyNkZWZpbmUgY2xyX2VvbCAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzZdCisjZGVmaW5lIGNscl9lb3MgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3XQorI2RlZmluZSBjb2x1bW5fYWRkcmVzcyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOF0KKyNkZWZpbmUgY29tbWFuZF9jaGFyYWN0ZXIgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzldCisjZGVmaW5lIGN1cnNvcl9hZGRyZXNzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMF0KKyNkZWZpbmUgY3Vyc29yX2Rvd24gICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzExXQorI2RlZmluZSBjdXJzb3JfaG9tZSAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTJdCisjZGVmaW5lIGN1cnNvcl9pbnZpc2libGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxM10KKyNkZWZpbmUgY3Vyc29yX2xlZnQgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzE0XQorI2RlZmluZSBjdXJzb3JfbWVtX2FkZHJlc3MgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMTVdCisjZGVmaW5lIGN1cnNvcl9ub3JtYWwgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNl0KKyNkZWZpbmUgY3Vyc29yX3JpZ2h0ICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzE3XQorI2RlZmluZSBjdXJzb3JfdG9fbGwgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMThdCisjZGVmaW5lIGN1cnNvcl91cCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOV0KKyNkZWZpbmUgY3Vyc29yX3Zpc2libGUgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzIwXQorI2RlZmluZSBkZWxldGVfY2hhcmFjdGVyICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjFdCisjZGVmaW5lIGRlbGV0ZV9saW5lICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMl0KKyNkZWZpbmUgZGlzX3N0YXR1c19saW5lICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzIzXQorI2RlZmluZSBkb3duX2hhbGZfbGluZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjRdCisjZGVmaW5lIGVudGVyX2FsdF9jaGFyc2V0X21vZGUgICAgICAgICBDVVIgU3RyaW5nc1syNV0KKyNkZWZpbmUgZW50ZXJfYmxpbmtfbW9kZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzI2XQorI2RlZmluZSBlbnRlcl9ib2xkX21vZGUgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMjddCisjZGVmaW5lIGVudGVyX2NhX21vZGUgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOF0KKyNkZWZpbmUgZW50ZXJfZGVsZXRlX21vZGUgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzI5XQorI2RlZmluZSBlbnRlcl9kaW1fbW9kZSAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzBdCisjZGVmaW5lIGVudGVyX2luc2VydF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMV0KKyNkZWZpbmUgZW50ZXJfc2VjdXJlX21vZGUgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzMyXQorI2RlZmluZSBlbnRlcl9wcm90ZWN0ZWRfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzNdCisjZGVmaW5lIGVudGVyX3JldmVyc2VfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNF0KKyNkZWZpbmUgZW50ZXJfc3RhbmRvdXRfbW9kZSAgICAgICAgICAgIENVUiBTdHJpbmdzWzM1XQorI2RlZmluZSBlbnRlcl91bmRlcmxpbmVfbW9kZSAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzZdCisjZGVmaW5lIGVyYXNlX2NoYXJzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szN10KKyNkZWZpbmUgZXhpdF9hbHRfY2hhcnNldF9tb2RlICAgICAgICAgIENVUiBTdHJpbmdzWzM4XQorI2RlZmluZSBleGl0X2F0dHJpYnV0ZV9tb2RlICAgICAgICAgICAgQ1VSIFN0cmluZ3NbMzldCisjZGVmaW5lIGV4aXRfY2FfbW9kZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MF0KKyNkZWZpbmUgZXhpdF9kZWxldGVfbW9kZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQxXQorI2RlZmluZSBleGl0X2luc2VydF9tb2RlICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDJdCisjZGVmaW5lIGV4aXRfc3RhbmRvdXRfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0M10KKyNkZWZpbmUgZXhpdF91bmRlcmxpbmVfbW9kZSAgICAgICAgICAgIENVUiBTdHJpbmdzWzQ0XQorI2RlZmluZSBmbGFzaF9zY3JlZW4gICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDVdCisjZGVmaW5lIGZvcm1fZmVlZCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0Nl0KKyNkZWZpbmUgZnJvbV9zdGF0dXNfbGluZSAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzQ3XQorI2RlZmluZSBpbml0XzFzdHJpbmcgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNDhdCisjZGVmaW5lIGluaXRfMnN0cmluZyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0OV0KKyNkZWZpbmUgaW5pdF8zc3RyaW5nICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzUwXQorI2RlZmluZSBpbml0X2ZpbGUgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTFdCisjZGVmaW5lIGluc2VydF9jaGFyYWN0ZXIgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1Ml0KKyNkZWZpbmUgaW5zZXJ0X2xpbmUgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzUzXQorI2RlZmluZSBpbnNlcnRfcGFkZGluZyAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTRdCisjZGVmaW5lIGtleV9iYWNrc3BhY2UgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1NV0KKyNkZWZpbmUga2V5X2NhdGFiICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzU2XQorI2RlZmluZSBrZXlfY2xlYXIgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNTddCisjZGVmaW5lIGtleV9jdGFiICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s1OF0KKyNkZWZpbmUga2V5X2RjICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzU5XQorI2RlZmluZSBrZXlfZGwgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjBdCisjZGVmaW5lIGtleV9kb3duICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2MV0KKyNkZWZpbmUga2V5X2VpYyAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzYyXQorI2RlZmluZSBrZXlfZW9sICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjNdCisjZGVmaW5lIGtleV9lb3MgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2NF0KKyNkZWZpbmUga2V5X2YwICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzY1XQorI2RlZmluZSBrZXlfZjEgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjZdCisjZGVmaW5lIGtleV9mMTAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s2N10KKyNkZWZpbmUga2V5X2YyICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzY4XQorI2RlZmluZSBrZXlfZjMgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNjldCisjZGVmaW5lIGtleV9mNCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3MF0KKyNkZWZpbmUga2V5X2Y1ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzcxXQorI2RlZmluZSBrZXlfZjYgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzJdCisjZGVmaW5lIGtleV9mNyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3M10KKyNkZWZpbmUga2V5X2Y4ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzc0XQorI2RlZmluZSBrZXlfZjkgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzVdCisjZGVmaW5lIGtleV9ob21lICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3Nl0KKyNkZWZpbmUga2V5X2ljICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzc3XQorI2RlZmluZSBrZXlfaWwgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbNzhdCisjZGVmaW5lIGtleV9sZWZ0ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s3OV0KKyNkZWZpbmUga2V5X2xsICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzgwXQorI2RlZmluZSBrZXlfbnBhZ2UgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODFdCisjZGVmaW5lIGtleV9wcGFnZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4Ml0KKyNkZWZpbmUga2V5X3JpZ2h0ICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzgzXQorI2RlZmluZSBrZXlfc2YgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODRdCisjZGVmaW5lIGtleV9zciAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4NV0KKyNkZWZpbmUga2V5X3N0YWIgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzg2XQorI2RlZmluZSBrZXlfdXAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbODddCisjZGVmaW5lIGtleXBhZF9sb2NhbCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s4OF0KKyNkZWZpbmUga2V5cGFkX3htaXQgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzg5XQorI2RlZmluZSBsYWJfZjAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTBdCisjZGVmaW5lIGxhYl9mMSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5MV0KKyNkZWZpbmUgbGFiX2YxMCAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzkyXQorI2RlZmluZSBsYWJfZjIgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTNdCisjZGVmaW5lIGxhYl9mMyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5NF0KKyNkZWZpbmUgbGFiX2Y0ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzk1XQorI2RlZmluZSBsYWJfZjUgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTZdCisjZGVmaW5lIGxhYl9mNiAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s5N10KKyNkZWZpbmUgbGFiX2Y3ICAgICAgICAgICAgICAgICAgICAgICAgIENVUiBTdHJpbmdzWzk4XQorI2RlZmluZSBsYWJfZjggICAgICAgICAgICAgICAgICAgICAgICAgQ1VSIFN0cmluZ3NbOTldCisjZGVmaW5lIGxhYl9mOSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDBdCisjZGVmaW5lIG1ldGFfb2ZmICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDFdCisjZGVmaW5lIG1ldGFfb24gICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDJdCisjZGVmaW5lIG5ld2xpbmUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDNdCisjZGVmaW5lIHBhZF9jaGFyICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDRdCisjZGVmaW5lIHBhcm1fZGNoICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDVdCisjZGVmaW5lIHBhcm1fZGVsZXRlX2xpbmUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDZdCisjZGVmaW5lIHBhcm1fZG93bl9jdXJzb3IgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDddCisjZGVmaW5lIHBhcm1faWNoICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDhdCisjZGVmaW5lIHBhcm1faW5kZXggICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMDldCisjZGVmaW5lIHBhcm1faW5zZXJ0X2xpbmUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTBdCisjZGVmaW5lIHBhcm1fbGVmdF9jdXJzb3IgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTFdCisjZGVmaW5lIHBhcm1fcmlnaHRfY3Vyc29yICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTJdCisjZGVmaW5lIHBhcm1fcmluZGV4ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTNdCisjZGVmaW5lIHBhcm1fdXBfY3Vyc29yICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTRdCisjZGVmaW5lIHBrZXlfa2V5ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTVdCisjZGVmaW5lIHBrZXlfbG9jYWwgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTZdCisjZGVmaW5lIHBrZXlfeG1pdCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTddCisjZGVmaW5lIHByaW50X3NjcmVlbiAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMThdCisjZGVmaW5lIHBydHJfb2ZmICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMTldCisjZGVmaW5lIHBydHJfb24gICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjBdCisjZGVmaW5lIHJlcGVhdF9jaGFyICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjFdCisjZGVmaW5lIHJlc2V0XzFzdHJpbmcgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjJdCisjZGVmaW5lIHJlc2V0XzJzdHJpbmcgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjNdCisjZGVmaW5lIHJlc2V0XzNzdHJpbmcgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjRdCisjZGVmaW5lIHJlc2V0X2ZpbGUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjVdCisjZGVmaW5lIHJlc3RvcmVfY3Vyc29yICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjZdCisjZGVmaW5lIHJvd19hZGRyZXNzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjddCisjZGVmaW5lIHNhdmVfY3Vyc29yICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjhdCisjZGVmaW5lIHNjcm9sbF9mb3J3YXJkICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMjldCisjZGVmaW5lIHNjcm9sbF9yZXZlcnNlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzBdCisjZGVmaW5lIHNldF9hdHRyaWJ1dGVzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzFdCisjZGVmaW5lIHNldF90YWIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzJdCisjZGVmaW5lIHNldF93aW5kb3cgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzNdCisjZGVmaW5lIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzRdCisjZGVmaW5lIHRvX3N0YXR1c19saW5lICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzVdCisjZGVmaW5lIHVuZGVybGluZV9jaGFyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzZdCisjZGVmaW5lIHVwX2hhbGZfbGluZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzddCisjZGVmaW5lIGluaXRfcHJvZyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzhdCisjZGVmaW5lIGtleV9hMSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxMzldCisjZGVmaW5lIGtleV9hMyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDBdCisjZGVmaW5lIGtleV9iMiAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDFdCisjZGVmaW5lIGtleV9jMSAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDJdCisjZGVmaW5lIGtleV9jMyAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDNdCisjZGVmaW5lIHBydHJfbm9uICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDRdCisjZGVmaW5lIGNoYXJfcGFkZGluZyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDVdCisjZGVmaW5lIGFjc19jaGFycyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDZdCisjZGVmaW5lIHBsYWJfbm9ybSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDddCisjZGVmaW5lIGtleV9idGFiICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDhdCisjZGVmaW5lIGVudGVyX3hvbl9tb2RlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNDldCisjZGVmaW5lIGV4aXRfeG9uX21vZGUgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTBdCisjZGVmaW5lIGVudGVyX2FtX21vZGUgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTFdCisjZGVmaW5lIGV4aXRfYW1fbW9kZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTJdCisjZGVmaW5lIHhvbl9jaGFyYWN0ZXIgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTNdCisjZGVmaW5lIHhvZmZfY2hhcmFjdGVyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTRdCisjZGVmaW5lIGVuYV9hY3MgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTVdCisjZGVmaW5lIGxhYmVsX29uICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTZdCisjZGVmaW5lIGxhYmVsX29mZiAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTddCisjZGVmaW5lIGtleV9iZWcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNThdCisjZGVmaW5lIGtleV9jYW5jZWwgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNTldCisjZGVmaW5lIGtleV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjBdCisjZGVmaW5lIGtleV9jb21tYW5kICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjFdCisjZGVmaW5lIGtleV9jb3B5ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjJdCisjZGVmaW5lIGtleV9jcmVhdGUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjNdCisjZGVmaW5lIGtleV9lbmQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjRdCisjZGVmaW5lIGtleV9lbnRlciAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjVdCisjZGVmaW5lIGtleV9leGl0ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjZdCisjZGVmaW5lIGtleV9maW5kICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjddCisjZGVmaW5lIGtleV9oZWxwICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjhdCisjZGVmaW5lIGtleV9tYXJrICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNjldCisjZGVmaW5lIGtleV9tZXNzYWdlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzBdCisjZGVmaW5lIGtleV9tb3ZlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzFdCisjZGVmaW5lIGtleV9uZXh0ICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzJdCisjZGVmaW5lIGtleV9vcGVuICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzNdCisjZGVmaW5lIGtleV9vcHRpb25zICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzRdCisjZGVmaW5lIGtleV9wcmV2aW91cyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzVdCisjZGVmaW5lIGtleV9wcmludCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzZdCisjZGVmaW5lIGtleV9yZWRvICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzddCisjZGVmaW5lIGtleV9yZWZlcmVuY2UgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzhdCisjZGVmaW5lIGtleV9yZWZyZXNoICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxNzldCisjZGVmaW5lIGtleV9yZXBsYWNlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODBdCisjZGVmaW5lIGtleV9yZXN0YXJ0ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODFdCisjZGVmaW5lIGtleV9yZXN1bWUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODJdCisjZGVmaW5lIGtleV9zYXZlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODNdCisjZGVmaW5lIGtleV9zdXNwZW5kICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODRdCisjZGVmaW5lIGtleV91bmRvICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODVdCisjZGVmaW5lIGtleV9zYmVnICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODZdCisjZGVmaW5lIGtleV9zY2FuY2VsICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODddCisjZGVmaW5lIGtleV9zY29tbWFuZCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODhdCisjZGVmaW5lIGtleV9zY29weSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxODldCisjZGVmaW5lIGtleV9zY3JlYXRlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTBdCisjZGVmaW5lIGtleV9zZGMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTFdCisjZGVmaW5lIGtleV9zZGwgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTJdCisjZGVmaW5lIGtleV9zZWxlY3QgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTNdCisjZGVmaW5lIGtleV9zZW5kICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTRdCisjZGVmaW5lIGtleV9zZW9sICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTVdCisjZGVmaW5lIGtleV9zZXhpdCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTZdCisjZGVmaW5lIGtleV9zZmluZCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTddCisjZGVmaW5lIGtleV9zaGVscCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOThdCisjZGVmaW5lIGtleV9zaG9tZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1sxOTldCisjZGVmaW5lIGtleV9zaWMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDBdCisjZGVmaW5lIGtleV9zbGVmdCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDFdCisjZGVmaW5lIGtleV9zbWVzc2FnZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDJdCisjZGVmaW5lIGtleV9zbW92ZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDNdCisjZGVmaW5lIGtleV9zbmV4dCAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDRdCisjZGVmaW5lIGtleV9zb3B0aW9ucyAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDVdCisjZGVmaW5lIGtleV9zcHJldmlvdXMgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDZdCisjZGVmaW5lIGtleV9zcHJpbnQgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDddCisjZGVmaW5lIGtleV9zcmVkbyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDhdCisjZGVmaW5lIGtleV9zcmVwbGFjZSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMDldCisjZGVmaW5lIGtleV9zcmlnaHQgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTBdCisjZGVmaW5lIGtleV9zcnN1bWUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTFdCisjZGVmaW5lIGtleV9zc2F2ZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTJdCisjZGVmaW5lIGtleV9zc3VzcGVuZCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTNdCisjZGVmaW5lIGtleV9zdW5kbyAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTRdCisjZGVmaW5lIHJlcV9mb3JfaW5wdXQgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTVdCisjZGVmaW5lIGtleV9mMTEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTZdCisjZGVmaW5lIGtleV9mMTIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTddCisjZGVmaW5lIGtleV9mMTMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMThdCisjZGVmaW5lIGtleV9mMTQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMTldCisjZGVmaW5lIGtleV9mMTUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjBdCisjZGVmaW5lIGtleV9mMTYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjFdCisjZGVmaW5lIGtleV9mMTcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjJdCisjZGVmaW5lIGtleV9mMTggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjNdCisjZGVmaW5lIGtleV9mMTkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjRdCisjZGVmaW5lIGtleV9mMjAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjVdCisjZGVmaW5lIGtleV9mMjEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjZdCisjZGVmaW5lIGtleV9mMjIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjddCisjZGVmaW5lIGtleV9mMjMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjhdCisjZGVmaW5lIGtleV9mMjQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMjldCisjZGVmaW5lIGtleV9mMjUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzBdCisjZGVmaW5lIGtleV9mMjYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzFdCisjZGVmaW5lIGtleV9mMjcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzJdCisjZGVmaW5lIGtleV9mMjggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzNdCisjZGVmaW5lIGtleV9mMjkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzRdCisjZGVmaW5lIGtleV9mMzAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzVdCisjZGVmaW5lIGtleV9mMzEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzZdCisjZGVmaW5lIGtleV9mMzIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzddCisjZGVmaW5lIGtleV9mMzMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzhdCisjZGVmaW5lIGtleV9mMzQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syMzldCisjZGVmaW5lIGtleV9mMzUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDBdCisjZGVmaW5lIGtleV9mMzYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDFdCisjZGVmaW5lIGtleV9mMzcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDJdCisjZGVmaW5lIGtleV9mMzggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDNdCisjZGVmaW5lIGtleV9mMzkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDRdCisjZGVmaW5lIGtleV9mNDAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDVdCisjZGVmaW5lIGtleV9mNDEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDZdCisjZGVmaW5lIGtleV9mNDIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDddCisjZGVmaW5lIGtleV9mNDMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDhdCisjZGVmaW5lIGtleV9mNDQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNDldCisjZGVmaW5lIGtleV9mNDUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTBdCisjZGVmaW5lIGtleV9mNDYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTFdCisjZGVmaW5lIGtleV9mNDcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTJdCisjZGVmaW5lIGtleV9mNDggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTNdCisjZGVmaW5lIGtleV9mNDkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTRdCisjZGVmaW5lIGtleV9mNTAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTVdCisjZGVmaW5lIGtleV9mNTEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTZdCisjZGVmaW5lIGtleV9mNTIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTddCisjZGVmaW5lIGtleV9mNTMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNThdCisjZGVmaW5lIGtleV9mNTQgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNTldCisjZGVmaW5lIGtleV9mNTUgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjBdCisjZGVmaW5lIGtleV9mNTYgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjFdCisjZGVmaW5lIGtleV9mNTcgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjJdCisjZGVmaW5lIGtleV9mNTggICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjNdCisjZGVmaW5lIGtleV9mNTkgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjRdCisjZGVmaW5lIGtleV9mNjAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjVdCisjZGVmaW5lIGtleV9mNjEgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjZdCisjZGVmaW5lIGtleV9mNjIgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjddCisjZGVmaW5lIGtleV9mNjMgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjhdCisjZGVmaW5lIGNscl9ib2wgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNjldCisjZGVmaW5lIGNsZWFyX21hcmdpbnMgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzBdCisjZGVmaW5lIHNldF9sZWZ0X21hcmdpbiAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzFdCisjZGVmaW5lIHNldF9yaWdodF9tYXJnaW4gICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzJdCisjZGVmaW5lIGxhYmVsX2Zvcm1hdCAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzNdCisjZGVmaW5lIHNldF9jbG9jayAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzRdCisjZGVmaW5lIGRpc3BsYXlfY2xvY2sgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzVdCisjZGVmaW5lIHJlbW92ZV9jbG9jayAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzZdCisjZGVmaW5lIGNyZWF0ZV93aW5kb3cgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzddCisjZGVmaW5lIGdvdG9fd2luZG93ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzhdCisjZGVmaW5lIGhhbmd1cCAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syNzldCisjZGVmaW5lIGRpYWxfcGhvbmUgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODBdCisjZGVmaW5lIHF1aWNrX2RpYWwgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODFdCisjZGVmaW5lIHRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODJdCisjZGVmaW5lIHB1bHNlICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODNdCisjZGVmaW5lIGZsYXNoX2hvb2sgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODRdCisjZGVmaW5lIGZpeGVkX3BhdXNlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODVdCisjZGVmaW5lIHdhaXRfdG9uZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODZdCisjZGVmaW5lIHVzZXIwICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODddCisjZGVmaW5lIHVzZXIxICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODhdCisjZGVmaW5lIHVzZXIyICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syODldCisjZGVmaW5lIHVzZXIzICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTBdCisjZGVmaW5lIHVzZXI0ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTFdCisjZGVmaW5lIHVzZXI1ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTJdCisjZGVmaW5lIHVzZXI2ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTNdCisjZGVmaW5lIHVzZXI3ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTRdCisjZGVmaW5lIHVzZXI4ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTVdCisjZGVmaW5lIHVzZXI5ICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTZdCisjZGVmaW5lIG9yaWdfcGFpciAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTddCisjZGVmaW5lIG9yaWdfY29sb3JzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOThdCisjZGVmaW5lIGluaXRpYWxpemVfY29sb3IgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1syOTldCisjZGVmaW5lIGluaXRpYWxpemVfcGFpciAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDBdCisjZGVmaW5lIHNldF9jb2xvcl9wYWlyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDFdCisjZGVmaW5lIHNldF9mb3JlZ3JvdW5kICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDJdCisjZGVmaW5lIHNldF9iYWNrZ3JvdW5kICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDNdCisjZGVmaW5lIGNoYW5nZV9jaGFyX3BpdGNoICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDRdCisjZGVmaW5lIGNoYW5nZV9saW5lX3BpdGNoICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDVdCisjZGVmaW5lIGNoYW5nZV9yZXNfaG9yeiAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDZdCisjZGVmaW5lIGNoYW5nZV9yZXNfdmVydCAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDddCisjZGVmaW5lIGRlZmluZV9jaGFyICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMDhdCisjZGVmaW5lIGVudGVyX2RvdWJsZXdpZGVfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szMDldCisjZGVmaW5lIGVudGVyX2RyYWZ0X3F1YWxpdHkgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTBdCisjZGVmaW5lIGVudGVyX2l0YWxpY3NfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTFdCisjZGVmaW5lIGVudGVyX2xlZnR3YXJkX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTJdCisjZGVmaW5lIGVudGVyX21pY3JvX21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTNdCisjZGVmaW5lIGVudGVyX25lYXJfbGV0dGVyX3F1YWxpdHkgICAgICBDVVIgU3RyaW5nc1szMTRdCisjZGVmaW5lIGVudGVyX25vcm1hbF9xdWFsaXR5ICAgICAgICAgICBDVVIgU3RyaW5nc1szMTVdCisjZGVmaW5lIGVudGVyX3NoYWRvd19tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTZdCisjZGVmaW5lIGVudGVyX3N1YnNjcmlwdF9tb2RlICAgICAgICAgICBDVVIgU3RyaW5nc1szMTddCisjZGVmaW5lIGVudGVyX3N1cGVyc2NyaXB0X21vZGUgICAgICAgICBDVVIgU3RyaW5nc1szMThdCisjZGVmaW5lIGVudGVyX3Vwd2FyZF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMTldCisjZGVmaW5lIGV4aXRfZG91Ymxld2lkZV9tb2RlICAgICAgICAgICBDVVIgU3RyaW5nc1szMjBdCisjZGVmaW5lIGV4aXRfaXRhbGljc19tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjFdCisjZGVmaW5lIGV4aXRfbGVmdHdhcmRfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjJdCisjZGVmaW5lIGV4aXRfbWljcm9fbW9kZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjNdCisjZGVmaW5lIGV4aXRfc2hhZG93X21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjRdCisjZGVmaW5lIGV4aXRfc3Vic2NyaXB0X21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjVdCisjZGVmaW5lIGV4aXRfc3VwZXJzY3JpcHRfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szMjZdCisjZGVmaW5lIGV4aXRfdXB3YXJkX21vZGUgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjddCisjZGVmaW5lIG1pY3JvX2NvbHVtbl9hZGRyZXNzICAgICAgICAgICBDVVIgU3RyaW5nc1szMjhdCisjZGVmaW5lIG1pY3JvX2Rvd24gICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMjldCisjZGVmaW5lIG1pY3JvX2xlZnQgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzBdCisjZGVmaW5lIG1pY3JvX3JpZ2h0ICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzFdCisjZGVmaW5lIG1pY3JvX3Jvd19hZGRyZXNzICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzJdCisjZGVmaW5lIG1pY3JvX3VwICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzNdCisjZGVmaW5lIG9yZGVyX29mX3BpbnMgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzRdCisjZGVmaW5lIHBhcm1fZG93bl9taWNybyAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzVdCisjZGVmaW5lIHBhcm1fbGVmdF9taWNybyAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzZdCisjZGVmaW5lIHBhcm1fcmlnaHRfbWljcm8gICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzddCisjZGVmaW5lIHBhcm1fdXBfbWljcm8gICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzhdCisjZGVmaW5lIHNlbGVjdF9jaGFyX3NldCAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szMzldCisjZGVmaW5lIHNldF9ib3R0b21fbWFyZ2luICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDBdCisjZGVmaW5lIHNldF9ib3R0b21fbWFyZ2luX3Bhcm0gICAgICAgICBDVVIgU3RyaW5nc1szNDFdCisjZGVmaW5lIHNldF9sZWZ0X21hcmdpbl9wYXJtICAgICAgICAgICBDVVIgU3RyaW5nc1szNDJdCisjZGVmaW5lIHNldF9yaWdodF9tYXJnaW5fcGFybSAgICAgICAgICBDVVIgU3RyaW5nc1szNDNdCisjZGVmaW5lIHNldF90b3BfbWFyZ2luICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDRdCisjZGVmaW5lIHNldF90b3BfbWFyZ2luX3Bhcm0gICAgICAgICAgICBDVVIgU3RyaW5nc1szNDVdCisjZGVmaW5lIHN0YXJ0X2JpdF9pbWFnZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDZdCisjZGVmaW5lIHN0YXJ0X2NoYXJfc2V0X2RlZiAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDddCisjZGVmaW5lIHN0b3BfYml0X2ltYWdlICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDhdCisjZGVmaW5lIHN0b3BfY2hhcl9zZXRfZGVmICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNDldCisjZGVmaW5lIHN1YnNjcmlwdF9jaGFyYWN0ZXJzICAgICAgICAgICBDVVIgU3RyaW5nc1szNTBdCisjZGVmaW5lIHN1cGVyc2NyaXB0X2NoYXJhY3RlcnMgICAgICAgICBDVVIgU3RyaW5nc1szNTFdCisjZGVmaW5lIHRoZXNlX2NhdXNlX2NyICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTJdCisjZGVmaW5lIHplcm9fbW90aW9uICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTNdCisjZGVmaW5lIGNoYXJfc2V0X25hbWVzICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTRdCisjZGVmaW5lIGtleV9tb3VzZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTVdCisjZGVmaW5lIG1vdXNlX2luZm8gICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTZdCisjZGVmaW5lIHJlcV9tb3VzZV9wb3MgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTddCisjZGVmaW5lIGdldF9tb3VzZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNThdCisjZGVmaW5lIHNldF9hX2ZvcmVncm91bmQgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNTldCisjZGVmaW5lIHNldF9hX2JhY2tncm91bmQgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjBdCisjZGVmaW5lIHBrZXlfcGxhYiAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjFdCisjZGVmaW5lIGRldmljZV90eXBlICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjJdCisjZGVmaW5lIGNvZGVfc2V0X2luaXQgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjNdCisjZGVmaW5lIHNldDBfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjRdCisjZGVmaW5lIHNldDFfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjVdCisjZGVmaW5lIHNldDJfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjZdCisjZGVmaW5lIHNldDNfZGVzX3NlcSAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjddCisjZGVmaW5lIHNldF9scl9tYXJnaW4gICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjhdCisjZGVmaW5lIHNldF90Yl9tYXJnaW4gICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNjldCisjZGVmaW5lIGJpdF9pbWFnZV9yZXBlYXQgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzBdCisjZGVmaW5lIGJpdF9pbWFnZV9uZXdsaW5lICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzFdCisjZGVmaW5lIGJpdF9pbWFnZV9jYXJyaWFnZV9yZXR1cm4gICAgICBDVVIgU3RyaW5nc1szNzJdCisjZGVmaW5lIGNvbG9yX25hbWVzICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzNdCisjZGVmaW5lIGRlZmluZV9iaXRfaW1hZ2VfcmVnaW9uICAgICAgICBDVVIgU3RyaW5nc1szNzRdCisjZGVmaW5lIGVuZF9iaXRfaW1hZ2VfcmVnaW9uICAgICAgICAgICBDVVIgU3RyaW5nc1szNzVdCisjZGVmaW5lIHNldF9jb2xvcl9iYW5kICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzZdCisjZGVmaW5lIHNldF9wYWdlX2xlbmd0aCAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzddCisjZGVmaW5lIGRpc3BsYXlfcGNfY2hhciAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szNzhdCisjZGVmaW5lIGVudGVyX3BjX2NoYXJzZXRfbW9kZSAgICAgICAgICBDVVIgU3RyaW5nc1szNzldCisjZGVmaW5lIGV4aXRfcGNfY2hhcnNldF9tb2RlICAgICAgICAgICBDVVIgU3RyaW5nc1szODBdCisjZGVmaW5lIGVudGVyX3NjYW5jb2RlX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szODFdCisjZGVmaW5lIGV4aXRfc2NhbmNvZGVfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODJdCisjZGVmaW5lIHBjX3Rlcm1fb3B0aW9ucyAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODNdCisjZGVmaW5lIHNjYW5jb2RlX2VzY2FwZSAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODRdCisjZGVmaW5lIGFsdF9zY2FuY29kZV9lc2MgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODVdCisjZGVmaW5lIGVudGVyX2hvcml6b250YWxfaGxfbW9kZSAgICAgICBDVVIgU3RyaW5nc1szODZdCisjZGVmaW5lIGVudGVyX2xlZnRfaGxfbW9kZSAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODddCisjZGVmaW5lIGVudGVyX2xvd19obF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szODhdCisjZGVmaW5lIGVudGVyX3JpZ2h0X2hsX21vZGUgICAgICAgICAgICBDVVIgU3RyaW5nc1szODldCisjZGVmaW5lIGVudGVyX3RvcF9obF9tb2RlICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTBdCisjZGVmaW5lIGVudGVyX3ZlcnRpY2FsX2hsX21vZGUgICAgICAgICBDVVIgU3RyaW5nc1szOTFdCisjZGVmaW5lIHNldF9hX2F0dHJpYnV0ZXMgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTJdCisjZGVmaW5lIHNldF9wZ2xlbl9pbmNoICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTNdCisKKyNkZWZpbmUgQk9PTFdSSVRFIDM3CisjZGVmaW5lIE5VTVdSSVRFICAzMworI2RlZmluZSBTVFJXUklURSAgMzk0CisKKy8qIG9sZGVyIHN5bm9ueW1zIGZvciBzb21lIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBiZWVoaXZlX2dsaXRjaAlub19lc2NfY3RsYworI2RlZmluZSB0ZWxlcmF5X2dsaXRjaAlkZXN0X3RhYnNfbWFnaWNfc21zbworI2RlZmluZSBtaWNyb19jaGFyX3NpemUgbWljcm9fY29sX3NpemUKKworI2lmZGVmIF9fSU5URVJOQUxfQ0FQU19WSVNJQkxFCisjZGVmaW5lIHRlcm1jYXBfaW5pdDIgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTRdCisjZGVmaW5lIHRlcm1jYXBfcmVzZXQgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTVdCisjZGVmaW5lIG1hZ2ljX2Nvb2tpZV9nbGl0Y2hfdWwgICAgICAgICBDVVIgTnVtYmVyc1szM10KKyNkZWZpbmUgYmFja3NwYWNlc193aXRoX2JzICAgICAgICAgICAgIENVUiBCb29sZWFuc1szN10KKyNkZWZpbmUgY3J0X25vX3Njcm9sbGluZyAgICAgICAgICAgICAgIENVUiBCb29sZWFuc1szOF0KKyNkZWZpbmUgbm9fY29ycmVjdGx5X3dvcmtpbmdfY3IgICAgICAgIENVUiBCb29sZWFuc1szOV0KKyNkZWZpbmUgY2FycmlhZ2VfcmV0dXJuX2RlbGF5ICAgICAgICAgIENVUiBOdW1iZXJzWzM0XQorI2RlZmluZSBuZXdfbGluZV9kZWxheSAgICAgICAgICAgICAgICAgQ1VSIE51bWJlcnNbMzVdCisjZGVmaW5lIGxpbmVmZWVkX2lmX25vdF9sZiAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTZdCisjZGVmaW5lIGJhY2tzcGFjZV9pZl9ub3RfYnMgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTddCisjZGVmaW5lIGdudV9oYXNfbWV0YV9rZXkgICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDBdCisjZGVmaW5lIGxpbmVmZWVkX2lzX25ld2xpbmUgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDFdCisjZGVmaW5lIGJhY2tzcGFjZV9kZWxheSAgICAgICAgICAgICAgICBDVVIgTnVtYmVyc1szNl0KKyNkZWZpbmUgaG9yaXpvbnRhbF90YWJfZGVsYXkgICAgICAgICAgIENVUiBOdW1iZXJzWzM3XQorI2RlZmluZSBudW1iZXJfb2ZfZnVuY3Rpb25fa2V5cyAgICAgICAgQ1VSIE51bWJlcnNbMzhdCisjZGVmaW5lIG90aGVyX25vbl9mdW5jdGlvbl9rZXlzICAgICAgICBDVVIgU3RyaW5nc1szOThdCisjZGVmaW5lIGFycm93X2tleV9tYXAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1szOTldCisjZGVmaW5lIGhhc19oYXJkd2FyZV90YWJzICAgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDJdCisjZGVmaW5lIHJldHVybl9kb2VzX2Nscl9lb2wgICAgICAgICAgICBDVVIgQm9vbGVhbnNbNDNdCisjZGVmaW5lIGFjc191bGNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDBdCisjZGVmaW5lIGFjc19sbGNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDFdCisjZGVmaW5lIGFjc191cmNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDJdCisjZGVmaW5lIGFjc19scmNvcm5lciAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDNdCisjZGVmaW5lIGFjc19sdGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDRdCisjZGVmaW5lIGFjc19ydGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDVdCisjZGVmaW5lIGFjc19idGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDZdCisjZGVmaW5lIGFjc190dGVlICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDddCisjZGVmaW5lIGFjc19obGluZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDhdCisjZGVmaW5lIGFjc192bGluZSAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MDldCisjZGVmaW5lIGFjc19wbHVzICAgICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTBdCisjZGVmaW5lIG1lbW9yeV9sb2NrICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTFdCisjZGVmaW5lIG1lbW9yeV91bmxvY2sgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTJdCisjZGVmaW5lIGJveF9jaGFyc18xICAgICAgICAgICAgICAgICAgICBDVVIgU3RyaW5nc1s0MTNdCisjZW5kaWYgLyogX19JTlRFUk5BTF9DQVBTX1ZJU0lCTEUgKi8KKworCisvKgorICogUHJlZGVmaW5lZCB0ZXJtaW5mbyBhcnJheSBzaXplcworICovCisjZGVmaW5lIEJPT0xDT1VOVCA0NAorI2RlZmluZSBOVU1DT1VOVCAgMzkKKyNkZWZpbmUgU1RSQ09VTlQgIDQxNAorCisvKiB1c2VkIGJ5IGNvZGUgZm9yIGNvbXBhcmluZyBlbnRyaWVzICovCisjZGVmaW5lIGFjc19jaGFyc19pbmRleAkgMTQ2CisKK3R5cGVkZWYgc3RydWN0IHRlcm10eXBlIHsJLyogaW4tY29yZSBmb3JtIG9mIHRlcm1pbmZvIGRhdGEgKi8KKyAgICBjaGFyICAqdGVybV9uYW1lczsJCS8qIHN0cl90YWJsZSBvZmZzZXQgb2YgdGVybSBuYW1lcyAqLworICAgIGNoYXIgICpzdHJfdGFibGU7CQkvKiBwb2ludGVyIHRvIHN0cmluZyB0YWJsZSAqLworICAgIE5DVVJTRVNfU0JPT0wgICpCb29sZWFuczsJLyogYXJyYXkgb2YgYm9vbGVhbiB2YWx1ZXMgKi8KKyAgICBzaG9ydCAqTnVtYmVyczsJCS8qIGFycmF5IG9mIGludGVnZXIgdmFsdWVzICovCisgICAgY2hhciAgKipTdHJpbmdzOwkJLyogYXJyYXkgb2Ygc3RyaW5nIG9mZnNldHMgKi8KKworI2lmIE5DVVJTRVNfWE5BTUVTCisgICAgY2hhciAgKmV4dF9zdHJfdGFibGU7CS8qIHBvaW50ZXIgdG8gZXh0ZW5kZWQgc3RyaW5nIHRhYmxlICovCisgICAgY2hhciAgKipleHRfTmFtZXM7CQkvKiBjb3JyZXNwb25kaW5nIG5hbWVzICovCisKKyAgICB1bnNpZ25lZCBzaG9ydCBudW1fQm9vbGVhbnM7LyogY291bnQgdG90YWwgQm9vbGVhbnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBudW1fTnVtYmVyczsJLyogY291bnQgdG90YWwgTnVtYmVycyAqLworICAgIHVuc2lnbmVkIHNob3J0IG51bV9TdHJpbmdzOwkvKiBjb3VudCB0b3RhbCBTdHJpbmdzICovCisKKyAgICB1bnNpZ25lZCBzaG9ydCBleHRfQm9vbGVhbnM7LyogY291bnQgZXh0ZW5zaW9ucyB0byBCb29sZWFucyAqLworICAgIHVuc2lnbmVkIHNob3J0IGV4dF9OdW1iZXJzOwkvKiBjb3VudCBleHRlbnNpb25zIHRvIE51bWJlcnMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBleHRfU3RyaW5nczsJLyogY291bnQgZXh0ZW5zaW9ucyB0byBTdHJpbmdzICovCisjZW5kaWYgLyogTkNVUlNFU19YTkFNRVMgKi8KKworfSBURVJNVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgdGVybSB7CQkvKiBkZXNjcmliZSBhbiBhY3R1YWwgdGVybWluYWwgKi8KKyAgICBURVJNVFlQRQl0eXBlOwkJLyogdGVybWluYWwgdHlwZSBkZXNjcmlwdGlvbiAqLworICAgIHNob3J0CUZpbGVkZXM7CS8qIGZpbGUgZGVzY3JpcHRpb24gYmVpbmcgd3JpdHRlbiB0byAqLworICAgIFRUWQkJT3R0eWIsCQkvKiBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgdGVybWluYWwgKi8KKwkJTnR0eWI7CQkvKiBjdXJyZW50IHN0YXRlIG9mIHRoZSB0ZXJtaW5hbCAqLworICAgIGludAkJX2JhdWRyYXRlOwkvKiB1c2VkIHRvIGNvbXB1dGUgcGFkZGluZyAqLworICAgIGNoYXIgKiAgICAgIF90ZXJtbmFtZTsgICAgICAvKiB1c2VkIGZvciB0ZXJtbmFtZSgpICovCit9IFRFUk1JTkFMOworCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKFRFUk1JTkFMICopIGN1cl90ZXJtOworCisjaWYgMCB8fCAwCitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIGJvb2xuYW1lcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIGJvb2xjb2Rlcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIGJvb2xmbmFtZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBudW1uYW1lcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIG51bWNvZGVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgbnVtZm5hbWVzKTsKK05DVVJTRVNfV1JBUFBFRF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKiwgc3RybmFtZXMpOworTkNVUlNFU19XUkFQUEVEX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCAqLCBzdHJjb2Rlcyk7CitOQ1VSU0VTX1dSQVBQRURfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICosIHN0cmZuYW1lcyk7CisKKyNkZWZpbmUgYm9vbG5hbWVzICBOQ1VSU0VTX1BVQkxJQ19WQVIoYm9vbG5hbWVzKCkpCisjZGVmaW5lIGJvb2xjb2RlcyAgTkNVUlNFU19QVUJMSUNfVkFSKGJvb2xjb2RlcygpKQorI2RlZmluZSBib29sZm5hbWVzIE5DVVJTRVNfUFVCTElDX1ZBUihib29sZm5hbWVzKCkpCisjZGVmaW5lIG51bW5hbWVzICAgTkNVUlNFU19QVUJMSUNfVkFSKG51bW5hbWVzKCkpCisjZGVmaW5lIG51bWNvZGVzICAgTkNVUlNFU19QVUJMSUNfVkFSKG51bWNvZGVzKCkpCisjZGVmaW5lIG51bWZuYW1lcyAgTkNVUlNFU19QVUJMSUNfVkFSKG51bWZuYW1lcygpKQorI2RlZmluZSBzdHJuYW1lcyAgIE5DVVJTRVNfUFVCTElDX1ZBUihzdHJuYW1lcygpKQorI2RlZmluZSBzdHJjb2RlcyAgIE5DVVJTRVNfUFVCTElDX1ZBUihzdHJjb2RlcygpKQorI2RlZmluZSBzdHJmbmFtZXMgIE5DVVJTRVNfUFVCTElDX1ZBUihzdHJmbmFtZXMoKSkKKworI2Vsc2UKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIGJvb2xuYW1lc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIGJvb2xjb2Rlc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIGJvb2xmbmFtZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBudW1uYW1lc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIG51bWNvZGVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgbnVtZm5hbWVzW107CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfQ09OU1QgY2hhciAqIGNvbnN0ICkgc3RybmFtZXNbXTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoTkNVUlNFU19DT05TVCBjaGFyICogY29uc3QgKSBzdHJjb2Rlc1tdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihOQ1VSU0VTX0NPTlNUIGNoYXIgKiBjb25zdCApIHN0cmZuYW1lc1tdOworCisjZW5kaWYKKworLyogaW50ZXJuYWxzICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfc2V0X3R0eV9tb2RlIChUVFkgKmJ1Zik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfZ2V0X3R0eV9tb2RlIChUVFkgKmJ1Zik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfcmVhZF9lbnRyeSAoY29uc3QgY2hhciAqIGNvbnN0LCBjaGFyICogY29uc3QsIFRFUk1UWVBFICpjb25zdCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfcmVhZF9maWxlX2VudHJ5IChjb25zdCBjaGFyICpjb25zdCwgVEVSTVRZUEUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfcmVhZF90ZXJtdHlwZSAoVEVSTVRZUEUgKiwgY2hhciAqLCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX2ZpcnN0X25hbWUgKGNvbnN0IGNoYXIgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIF9uY19uYW1lX21hdGNoIChjb25zdCBjaGFyICpjb25zdCwgY29uc3QgY2hhciAqY29uc3QsIGNvbnN0IGNoYXIgKmNvbnN0KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBURVJNVFlQRSAqKSBfbmNfZmFsbGJhY2sgKGNvbnN0IGNoYXIgKik7CisKKy8qIGVudHJ5IHBvaW50cyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKFRFUk1JTkFMICopIHNldF9jdXJ0ZXJtIChURVJNSU5BTCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIGRlbF9jdXJ0ZXJtIChURVJNSU5BTCAqKTsKKworLyogbWlzY2VsbGFuZW91cyBlbnRyeSBwb2ludHMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHJlc3RhcnR0ZXJtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKiwgaW50LCBpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBzZXR1cHRlcm0gKE5DVVJTRVNfQ09OU1QgY2hhciAqLGludCxpbnQgKik7CisKKy8qIHRlcm1pbmZvIGVudHJ5IHBvaW50cywgYWxzbyBkZWNsYXJlZCBpbiBjdXJzZXMuaCAqLworI2lmICFkZWZpbmVkKF9fTkNVUlNFU19IKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGlnZXRzdHIgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY2hhcikgdHR5dHlwZVtdOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgcHV0cCAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRpZ2V0ZmxhZyAoTkNVUlNFU19DT05TVCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGlnZXRudW0gKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKKworI2lmIDEgLyogTkNVUlNFU19UUEFSTV9WQVJBUkdTICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0cGFybSAoTkNVUlNFU19DT05TVCBjaGFyICosIC4uLik7CS8qIHNwZWNpYWwgKi8KKyNlbHNlCitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSB0cGFybSAoTkNVUlNFU19DT05TVCBjaGFyICosIGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nLGxvbmcsbG9uZyxsb25nKTsJLyogc3BlY2lhbCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdHBhcm1fdmFyYXJncyAoTkNVUlNFU19DT05TVCBjaGFyICosIC4uLik7CS8qIHNwZWNpYWwgKi8KKyNlbmRpZgorCisjZW5kaWYgLyogX19OQ1VSU0VTX0ggKi8KKworLyogdGVybWNhcCBkYXRhYmFzZSBlbXVsYXRpb24gKFhQRzQgdXNlcyBjb25zdCBvbmx5IGZvciAybmQgcGFyYW0gb2YgdGdldGVudCkgKi8KKyNpZiAhZGVmaW5lZChOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGdldHN0ciAoTkNVUlNFU19DT05TVCBjaGFyICosIGNoYXIgKiopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgdGdvdG8gKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldGVudCAoY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgdGdldGZsYWcgKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRnZXRudW0gKE5DVVJTRVNfQ09OU1QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRwdXRzIChjb25zdCBjaGFyICosIGludCwgaW50ICgqKShpbnQpKTsKKyNlbmRpZiAvKiBOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX1RFUk1fSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1fZW50cnkuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybV9lbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODBjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1fZW50cnkuaApAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxLDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgICoKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgICAgICAgICAgICAqCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nICAgICAgKgorICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAgICAgICoKKyAqIGRpc3RyaWJ1dGUsIGRpc3RyaWJ1dGUgd2l0aCBtb2RpZmljYXRpb25zLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgICAgICAqCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgICAgKgorICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAgKgorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyAgKgorICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiAgICAgICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gICAqCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQUJPVkUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sICAgKgorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SICAgICoKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiAgICAqCisgKiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lKHMpIG9mIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAqCisgKiBob2xkZXJzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSAgICAgKgorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuICAgICAgICoKKyAqIGF1dGhvcml6YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBBdXRob3I6IFpleWQgTS4gQmVuLUhhbGltIDx6bWJlbmhhbEBuZXRjb20uY29tPiAxOTkyLDE5OTUgICAgICAgICAgICAgICAqCisgKiAgICAgYW5kOiBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogVGhvbWFzIEUuIERpY2tleSAgICAgICAgICAgICAgICAgICAgICAgIDE5OTgtMjAwNCAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAkSWQ6IHRlcm1fZW50cnkuaCx2IDEuMzQgMjAwNS8wNy8xNiAyMToxNTowNyB0b20gRXhwICQgKi8KKworLyoKKyAqCXRlcm1fZW50cnkuaCAtLSBpbnRlcmZhY2UgdG8gZW50cnktbWFuaXB1bGF0aW9uIGNvZGUKKyAqLworCisjaWZuZGVmIE5DVVJTRVNfVEVSTV9FTlRSWV9IX2luY2wKKyNkZWZpbmUgTkNVUlNFU19URVJNX0VOVFJZX0hfaW5jbCAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHRlcm0uaD4KKworI2RlZmluZSBNQVhfVVNFUwkzMgorI2RlZmluZSBNQVhfQ1JPU1NMSU5LUwkxNgorCit0eXBlZGVmIHN0cnVjdCBlbnRyeSB7CisJVEVSTVRZUEUJdHRlcm07CisJaW50CQludXNlczsKKwlzdHJ1Y3QKKyAgICAgICAgeworCSAgICBjaGFyCQkqbmFtZTsKKwkgICAgc3RydWN0IGVudHJ5CSpsaW5rOworCSAgICBsb25nCQlsaW5lOworICAgICAgICB9CisJdXNlc1tNQVhfVVNFU107CisJaW50CQluY3Jvc3NsaW5rczsKKwlzdHJ1Y3QgZW50cnkJKmNyb3NzbGlua3NbTUFYX0NST1NTTElOS1NdOworCWxvbmcJCWNzdGFydCwgY2VuZDsKKwlsb25nCQlzdGFydGxpbmU7CisJc3RydWN0IGVudHJ5CSpuZXh0OworCXN0cnVjdCBlbnRyeQkqbGFzdDsKK30KK0VOVFJZOworCisjaWYgTkNVUlNFU19YTkFNRVMKKyNkZWZpbmUgTlVNX0JPT0xFQU5TKHRwKSAodHApLT5udW1fQm9vbGVhbnMKKyNkZWZpbmUgTlVNX05VTUJFUlModHApICAodHApLT5udW1fTnVtYmVycworI2RlZmluZSBOVU1fU1RSSU5HUyh0cCkgICh0cCktPm51bV9TdHJpbmdzCisjZGVmaW5lIEVYVF9OQU1FUyh0cCxpLGxpbWl0LGluZGV4LHRhYmxlKSAoaSA+PSBsaW1pdCkgPyB0cC0+ZXh0X05hbWVzW2luZGV4XSA6IHRhYmxlW2ldCisjZWxzZQorI2RlZmluZSBOVU1fQk9PTEVBTlModHApIEJPT0xDT1VOVAorI2RlZmluZSBOVU1fTlVNQkVSUyh0cCkgIE5VTUNPVU5UCisjZGVmaW5lIE5VTV9TVFJJTkdTKHRwKSAgU1RSQ09VTlQKKyNkZWZpbmUgRVhUX05BTUVTKHRwLGksbGltaXQsaW5kZXgsdGFibGUpIHRhYmxlW2ldCisjZW5kaWYKKworI2RlZmluZSBOVU1fRVhUX05BTUVTKHRwKSAoKHRwKS0+ZXh0X0Jvb2xlYW5zICsgKHRwKS0+ZXh0X051bWJlcnMgKyAodHApLT5leHRfU3RyaW5ncykKKworI2RlZmluZSBmb3JfZWFjaF9ib29sZWFuKG4sdHApIGZvcihuID0gMDsgbiA8IE5VTV9CT09MRUFOUyh0cCk7IG4rKykKKyNkZWZpbmUgZm9yX2VhY2hfbnVtYmVyKG4sdHApICBmb3IobiA9IDA7IG4gPCBOVU1fTlVNQkVSUyh0cCk7ICBuKyspCisjZGVmaW5lIGZvcl9lYWNoX3N0cmluZyhuLHRwKSAgZm9yKG4gPSAwOyBuIDwgTlVNX1NUUklOR1ModHApOyAgbisrKQorCisjZGVmaW5lIEV4dEJvb2xuYW1lKHRwLGksbmFtZXMpIEVYVF9OQU1FUyh0cCwgaSwgQk9PTENPVU5ULCAoaSAtICh0cC0+bnVtX0Jvb2xlYW5zIC0gdHAtPmV4dF9Cb29sZWFucykpLCBuYW1lcykKKyNkZWZpbmUgRXh0TnVtbmFtZSh0cCxpLG5hbWVzKSAgRVhUX05BTUVTKHRwLCBpLCBOVU1DT1VOVCwgKGkgLSAodHAtPm51bV9OdW1iZXJzIC0gdHAtPmV4dF9OdW1iZXJzKSkgKyB0cC0+ZXh0X0Jvb2xlYW5zLCBuYW1lcykKKyNkZWZpbmUgRXh0U3RybmFtZSh0cCxpLG5hbWVzKSAgRVhUX05BTUVTKHRwLCBpLCBTVFJDT1VOVCwgKGkgLSAodHAtPm51bV9TdHJpbmdzIC0gdHAtPmV4dF9TdHJpbmdzKSkgKyAodHAtPmV4dF9OdW1iZXJzICsgdHAtPmV4dF9Cb29sZWFucyksIG5hbWVzKQorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKEVOVFJZICopIF9uY19oZWFkOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihFTlRSWSAqKSBfbmNfdGFpbDsKKyNkZWZpbmUgZm9yX2VudHJ5X2xpc3QocXApCWZvciAocXAgPSBfbmNfaGVhZDsgcXA7IHFwID0gcXAtPm5leHQpCisKKyNkZWZpbmUgTUFYX0xJTkUJMTMyCisKKyNkZWZpbmUgTlVMTEhPT0sgICAgICAgIChib29sKCopKEVOVFJZICopKTAKKworLyoKKyAqIE5vdGUgdGhhdCBXQU5URUQgYW5kIFBSRVNFTlQgYXJlIG5vdCBzaW1wbGUgaW52ZXJzZXMhICBJZiBhIGNhcGFiaWxpdHkKKyAqIGhhcyBiZWVuIGV4cGxpY2l0bHkgY2FuY2VsbGVkLCBpdCdzIG5vdCBjb25zaWRlcmVkIFdBTlRFRC4KKyAqLworI2RlZmluZSBXQU5URUQocykJKChzKSA9PSBBQlNFTlRfU1RSSU5HKQorI2RlZmluZSBQUkVTRU5UKHMpCSgoKHMpICE9IEFCU0VOVF9TVFJJTkcpICYmICgocykgIT0gQ0FOQ0VMTEVEX1NUUklORykpCisKKyNkZWZpbmUgQU5ETUlTU0lORyhwLHEpIFwKKwkJe2lmIChQUkVTRU5UKHApICYmICFQUkVTRU5UKHEpKSBfbmNfd2FybmluZygjcCAiIGJ1dCBubyAiICNxKTt9CisKKyNkZWZpbmUgUEFJUkVEKHAscSkgXAorCQl7IFwKKwkJaWYgKFBSRVNFTlQocSkgJiYgIVBSRVNFTlQocCkpIFwKKwkJCV9uY193YXJuaW5nKCNxICIgYnV0IG5vICIgI3ApOyBcCisJCWlmIChQUkVTRU5UKHApICYmICFQUkVTRU5UKHEpKSBcCisJCQlfbmNfd2FybmluZygjcCAiIGJ1dCBubyAiICNxKTsgXAorCQl9CisKKy8qIGFsbG9jX2VudHJ5LmM6IGVsZW1lbnRhcnkgYWxsb2NhdGlvbiBjb2RlICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoRU5UUlkgKikgX25jX2NvcHlfZW50cnkgKEVOVFJZICpvbGRwKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY19zYXZlX3N0ciAoY29uc3QgY2hhciAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19pbml0X2VudHJ5IChURVJNVFlQRSAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19tZXJnZV9lbnRyeSAoVEVSTVRZUEUgKmNvbnN0LCBURVJNVFlQRSAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY193cmFwX2VudHJ5IChFTlRSWSAqY29uc3QsIGJvb2wpOworCisvKiBhbGxvY190dHlwZS5jOiBlbGVtZW50YXJ5IGFsbG9jYXRpb24gY29kZSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19hbGlnbl90ZXJtdHlwZSAoVEVSTVRZUEUgKiwgVEVSTVRZUEUgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2NvcHlfdGVybXR5cGUgKFRFUk1UWVBFICosIFRFUk1UWVBFICopOworCisvKiBmcmVlX3R0eXBlLmM6IGVsZW1lbnRhcnkgYWxsb2NhdGlvbiBjb2RlICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2ZyZWVfdGVybXR5cGUgKFRFUk1UWVBFICopOworCisvKiBsaWJfYWNzLmMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfaW5pdF9hY3MgKHZvaWQpOwkvKiBjb3JyZXNwb25kcyB0byB0cmFkaXRpb25hbCAnaW5pdF9hY3MoKScgKi8KKworLyogbGliX3Rlcm1jYXAuYzogdHJpbSBzZ3IwIHN0cmluZyBmb3IgdGVybWNhcCB1c2VycyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX3RyaW1fc2dyMCAoVEVSTVRZUEUgKik7CisKKy8qIHBhcnNlX2VudHJ5LmM6IGVudHJ5LXBhcnNpbmcgY29kZSAqLworI2lmIE5DVVJTRVNfWE5BTUVTCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGJvb2wpIF9uY191c2VyX2RlZmluYWJsZTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoYm9vbCkgX25jX2Rpc2FibGVfcGVyaW9kOworI2VuZGlmCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfcGFyc2VfZW50cnkgKEVOVFJZICosIGludCwgYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfY2FwY21wIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKy8qIHdyaXRlX2VudHJ5LmM6IHdyaXRpbmcgYW4gZW50cnkgdG8gdGhlIGZpbGUgc3lzdGVtICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3NldF93cml0ZWRpciAoY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfd3JpdGVfZW50cnkgKFRFUk1UWVBFICpjb25zdCk7CisKKy8qIGNvbXBfcGFyc2UuYzogZW50cnkgbGlzdCBoYW5kbGluZyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19yZWFkX2VudHJ5X3NvdXJjZSAoRklMRSosIGNoYXIqLCBpbnQsIGJvb2wsIGJvb2wgKCopKEVOVFJZKikpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIF9uY19lbnRyeV9tYXRjaCAoY2hhciAqLCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3Jlc29sdmVfdXNlcyAoYm9vbCk7IC8qIG9icyAyMDA0MDcwNSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3Jlc29sdmVfdXNlczIgKGJvb2wsIGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19mcmVlX2VudHJpZXMgKEVOVFJZICopOworZXh0ZXJuIE5DVVJTRVNfSU1QRVhQIHZvaWQgTkNVUlNFU19BUEkgKCpfbmNfY2hlY2tfdGVybXR5cGUpKFRFUk1UWVBFICopOyAvKiBvYnMgMjAwNDA3MDUgKi8KK2V4dGVybiBOQ1VSU0VTX0lNUEVYUCB2b2lkIE5DVVJTRVNfQVBJICgqX25jX2NoZWNrX3Rlcm10eXBlMikoVEVSTVRZUEUgKiwgYm9vbCk7CisKKy8qIHRyYWNlX3huYW1lcy5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3RyYWNlX3huYW1lcyAoVEVSTVRZUEUgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBOQ1VSU0VTX1RFUk1fRU5UUllfSF9pbmNsICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1jYXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZGJhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1jYXAuaApAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAxOTk4LDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSAgKgorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAgICAgICAgICAgICoKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgICAgICAqCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsICAgICAgKgorICogZGlzdHJpYnV0ZSwgZGlzdHJpYnV0ZSB3aXRoIG1vZGlmaWNhdGlvbnMsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICAgICAgICoKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyAgICAqCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkICAqCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTICAqCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GICAgICAgICAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBQk9WRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgICAqCisgKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgICAgKgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SICAgICoKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUocykgb2YgdGhlIGFib3ZlIGNvcHlyaWdodCAgICoKKyAqIGhvbGRlcnMgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlICAgICAqCisgKiBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gICAgICAgKgorICogYXV0aG9yaXphdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEF1dGhvcjogWmV5ZCBNLiBCZW4tSGFsaW0gPHptYmVuaGFsQG5ldGNvbS5jb20+IDE5OTIsMTk5NSAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IEVyaWMgUy4gUmF5bW9uZCA8ZXNyQHNuYXJrLnRoeXJzdXMuY29tPiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogJElkOiB0ZXJtY2FwLmguaW4sdiAxLjE2IDIwMDEvMDMvMjQgMjE6NTM6MjcgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgTkNVUlNFU19URVJNQ0FQX0hfaW5jbAorI2RlZmluZSBOQ1VSU0VTX1RFUk1DQVBfSF9pbmNsCTEKKworI3VuZGVmICBOQ1VSU0VTX1ZFUlNJT04KKyNkZWZpbmUgTkNVUlNFU19WRVJTSU9OICI1LjYiCisKKyNpbmNsdWRlIDxuY3Vyc2VzX2RsbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyN1bmRlZiAgTkNVUlNFU19DT05TVCAKKyNkZWZpbmUgTkNVUlNFU19DT05TVCBjb25zdCAKKworI3VuZGVmICBOQ1VSU0VTX09TUEVFRCAKKyNkZWZpbmUgTkNVUlNFU19PU1BFRUQgc2hvcnQgCisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoY2hhcikgUEM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGNoYXIgKikgVVA7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGNoYXIgKikgQkM7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKE5DVVJTRVNfT1NQRUVEKSBvc3BlZWQ7IAorCisjaWYgIWRlZmluZWQoTkNVUlNFU19URVJNX0hfaW5jbCkKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRnZXRzdHIgKE5DVVJTRVNfQ09OU1QgY2hhciAqLCBjaGFyICoqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIHRnb3RvIChjb25zdCBjaGFyICosIGludCwgaW50KTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRnZXRlbnQgKGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChpbnQpIHRnZXRmbGFnIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0Z2V0bnVtIChOQ1VSU0VTX0NPTlNUIGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSB0cHV0cyAoY29uc3QgY2hhciAqLCBpbnQsIGludCAoKikoaW50KSk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfVEVSTUNBUF9IX2luY2wgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWlvLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjEwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3Rlcm1pby5oCkBAIC0wLDAgKzEsNiBAQAorLyogQ29tcGF0aWJsZSA8dGVybWlvLmg+IGZvciBvbGQgYHN0cnVjdCB0ZXJtaW8nIGlvY3RsIGludGVyZmFjZS4KKyAgIFRoaXMgaXMgb2Jzb2xldGU7IHVzZSB0aGUgUE9TSVguMSBgc3RydWN0IHRlcm1pb3MnIGludGVyZmFjZQorICAgZGVmaW5lZCBpbiA8dGVybWlvcy5oPiBpbnN0ZWFkLiAgKi8KKworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWlvcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90ZXJtaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5OGIxZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGVybWlvcy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTMsOTQsOTYsOTcsOTgsOTksIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNy4xLTIgR2VuZXJhbCBUZXJtaW5hbCBJbnRlcmZhY2UJPHRlcm1pb3MuaD4KKyAqLworCisjaWZuZGVmCV9URVJNSU9TX0gKKyNkZWZpbmUJX1RFUk1JT1NfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmZGVmIF9fVVNFX1VOSVg5OAorLyogV2UgbmVlZCBgcGlkX3QnLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorIyBpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjICBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworX19CRUdJTl9ERUNMUworCisvKiBHZXQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgb2YgYHN0cnVjdCB0ZXJtaW9zJywgYHRjZmxhZ190JywKKyAgIGBjY190JywgYHNwZWVkX3QnLCBhbmQgYWxsIHRoZSBtYWNyb3Mgc3BlY2lmeWluZyB0aGUgZmxhZyBiaXRzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3Rlcm1pb3MuaD4KKworI2lmZGVmIF9fVVNFX0JTRAorLyogQ29tcGFyZSBhIGNoYXJhY3RlciBDIHRvIGEgdmFsdWUgVkFMIGZyb20gdGhlIGBjX2NjJyBhcnJheSBpbiBhCisgICBgc3RydWN0IHRlcm1pb3MnLiAgSWYgVkFMIGlzIF9QT1NJWF9WRElTQUJMRSwgbm8gY2hhcmFjdGVyIGNhbiBtYXRjaCBpdC4gICovCisjIGRlZmluZSBDQ0VRKHZhbCwgYykJKChjKSA9PSAodmFsKSAmJiAodmFsKSAhPSBfUE9TSVhfVkRJU0FCTEUpCisjZW5kaWYKKworLyogUmV0dXJuIHRoZSBvdXRwdXQgYmF1ZCByYXRlIHN0b3JlZCBpbiAqVEVSTUlPU19QLiAgKi8KK2V4dGVybiBzcGVlZF90IGNmZ2V0b3NwZWVkIChfX2NvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBpbnB1dCBiYXVkIHJhdGUgc3RvcmVkIGluICpURVJNSU9TX1AuICAqLworZXh0ZXJuIHNwZWVkX3QgY2ZnZXRpc3BlZWQgKF9fY29uc3Qgc3RydWN0IHRlcm1pb3MgKl9fdGVybWlvc19wKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIG91dHB1dCBiYXVkIHJhdGUgc3RvcmVkIGluICpURVJNSU9TX1AgdG8gU1BFRUQuICAqLworZXh0ZXJuIGludCBjZnNldG9zcGVlZCAoc3RydWN0IHRlcm1pb3MgKl9fdGVybWlvc19wLCBzcGVlZF90IF9fc3BlZWQpIF9fVEhST1c7CisKKy8qIFNldCB0aGUgaW5wdXQgYmF1ZCByYXRlIHN0b3JlZCBpbiAqVEVSTUlPU19QIHRvIFNQRUVELiAgKi8KK2V4dGVybiBpbnQgY2ZzZXRpc3BlZWQgKHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCwgc3BlZWRfdCBfX3NwZWVkKSBfX1RIUk9XOworCisjaWZkZWYJX19VU0VfQlNECisvKiBTZXQgYm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBiYXVkIHJhdGVzIGluICpURVJNSU9TX09QIHRvIFNQRUVELiAgKi8KK2V4dGVybiBpbnQgY2ZzZXRzcGVlZCAoc3RydWN0IHRlcm1pb3MgKl9fdGVybWlvc19wLCBzcGVlZF90IF9fc3BlZWQpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBQdXQgdGhlIHN0YXRlIG9mIEZEIGludG8gKlRFUk1JT1NfUC4gICovCitleHRlcm4gaW50IHRjZ2V0YXR0ciAoaW50IF9fZmQsIHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworLyogU2V0IHRoZSBzdGF0ZSBvZiBGRCB0byAqVEVSTUlPU19QLgorICAgVmFsdWVzIGZvciBPUFRJT05BTF9BQ1RJT05TIChUQ1NBKikgYXJlIGluIDxiaXRzL3Rlcm1pb3MuaD4uICAqLworZXh0ZXJuIGludCB0Y3NldGF0dHIgKGludCBfX2ZkLCBpbnQgX19vcHRpb25hbF9hY3Rpb25zLAorCQkgICAgICBfX2NvbnN0IHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKworCisjaWZkZWYJX19VU0VfQlNECisvKiBTZXQgKlRFUk1JT1NfUCB0byBpbmRpY2F0ZSByYXcgbW9kZS4gICovCitleHRlcm4gdm9pZCBjZm1ha2VyYXcgKHN0cnVjdCB0ZXJtaW9zICpfX3Rlcm1pb3NfcCkgX19USFJPVzsKKyNlbmRpZgorCisvKiBTZW5kIHplcm8gYml0cyBvbiBGRC4gICovCitleHRlcm4gaW50IHRjc2VuZGJyZWFrIChpbnQgX19mZCwgaW50IF9fZHVyYXRpb24pIF9fVEhST1c7CisKKy8qIFdhaXQgZm9yIHBlbmRpbmcgb3V0cHV0IHRvIGJlIHdyaXR0ZW4gb24gRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB0Y2RyYWluIChpbnQgX19mZCk7CisKKy8qIEZsdXNoIHBlbmRpbmcgZGF0YSBvbiBGRC4KKyAgIFZhbHVlcyBmb3IgUVVFVUVfU0VMRUNUT1IgKFRDe0ksTyxJT31GTFVTSCkgYXJlIGluIDxiaXRzL3Rlcm1pb3MuaD4uICAqLworZXh0ZXJuIGludCB0Y2ZsdXNoIChpbnQgX19mZCwgaW50IF9fcXVldWVfc2VsZWN0b3IpIF9fVEhST1c7CisKKy8qIFN1c3BlbmQgb3IgcmVzdGFydCB0cmFuc21pc3Npb24gb24gRkQuCisgICBWYWx1ZXMgZm9yIEFDVElPTiAoVENbSU9de09GRixPTn0pIGFyZSBpbiA8Yml0cy90ZXJtaW9zLmg+LiAgKi8KK2V4dGVybiBpbnQgdGNmbG93IChpbnQgX19mZCwgaW50IF9fYWN0aW9uKSBfX1RIUk9XOworCisKKyNpZmRlZiBfX1VTRV9VTklYOTgKKy8qIEdldCBwcm9jZXNzIGdyb3VwIElEIGZvciBzZXNzaW9uIGxlYWRlciBmb3IgY29udHJvbGxpbmcgdGVybWluYWwgRkQuICAqLworZXh0ZXJuIF9fcGlkX3QgdGNnZXRzaWQgKGludCBfX2ZkKSBfX1RIUk9XOworI2VuZGlmCisKKworI2lmZGVmIF9fVVNFX0JTRAorIyBpbmNsdWRlIDxzeXMvdHR5ZGVmYXVsdHMuaD4KKyNlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdGVybWlvcy5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90Z21hdGguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGdtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGdtYXRoLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNworICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglJU08gQzk5IFN0YW5kYXJkOiA3LjIyIFR5cGUtZ2VuZXJpYyBtYXRoCTx0Z21hdGguaD4KKyAqLworCisjaWZuZGVmIF9UR01BVEhfSAorI2RlZmluZSBfVEdNQVRIX0gJMQorCisvKiBJbmNsdWRlIHRoZSBuZWVkZWQgaGVhZGVycy4gICovCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGNvbXBsZXguaD4KKworCisvKiBTaW5jZSBgY29tcGxleCcgaXMgY3VycmVudGx5IG5vdCByZWFsbHkgaW1wbGVtZW50ZWQgaW4gbW9zdCBDIGNvbXBpbGVycworICAgYW5kIGlmIGl0IGlzIGltcGxlbWVudGVkLCB0aGUgaW1wbGVtZW50YXRpb25zIGRpZmZlci4gIFRoaXMgbWFrZXMgaXQKKyAgIHF1aXRlIGRpZmZpY3VsdCB0byB3cml0ZSBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBoZWFkZXIuICBXZQorICAgZG8gbm90IHRyeSB0aGlzIGZvciBub3cgYW5kIGluc3RlYWQgY29uY2VudHJhdGUgb25seSBvbiBHTlUgQ0MuICBPbmNlCisgICB3ZSBoYXZlIG1vcmUgaW5mb3JtYXRpb24gc3VwcG9ydCBmb3Igb3RoZXIgY29tcGlsZXJzIG1pZ2h0IGZvbGxvdy4gICovCisKKyNpZiBfX0dOVUNfUFJFUkVRICgyLCA3KQorCisjIGlmZGVmIF9fTk9fTE9OR19ET1VCTEVfTUFUSAorIyAgZGVmaW5lIF9fdGdtbChmY3QpIGZjdAorIyBlbHNlCisjICBkZWZpbmUgX190Z21sKGZjdCkgZmN0ICMjIGwKKyMgZW5kaWYKKworLyogVGhpcyBpcyB1Z2x5IGJ1dCB1bmxlc3MgZ2NjIGdldHMgYXBwcm9wcmlhdGUgYnVpbHRpbnMgd2UgaGF2ZSB0byBkbworICAgc29tZXRoaW5nIGxpa2UgdGhpcy4gIERvbid0IGFzayBob3cgaXQgd29ya3MuICAqLworCisvKiAxIGlmICd0eXBlJyBpcyBhIGZsb2F0aW5nIHR5cGUsIDAgaWYgJ3R5cGUnIGlzIGFuIGludGVnZXIgdHlwZS4KKyAgIEFsbG93cyBmb3IgX0Jvb2wuICBFeHBhbmRzIHRvIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbi4gICovCisjIGRlZmluZSBfX2Zsb2F0aW5nX3R5cGUodHlwZSkgKCgodHlwZSkgMC4yNSkgJiYgKCh0eXBlKSAwLjI1IC0gMSkpCisKKy8qIFRoZSB0Z21hdGggcmVhbCB0eXBlIGZvciBULCB3aGVyZSBFIGlzIDAgaWYgVCBpcyBhbiBpbnRlZ2VyIHR5cGUgYW5kCisgICAxIGZvciBhIGZsb2F0aW5nIHR5cGUuICAqLworIyBkZWZpbmUgX190Z21hdGhfcmVhbF90eXBlX3N1YihULCBFKSBcCisgIF9fdHlwZW9mX18gKCooMCA/IChfX3R5cGVvZl9fICgwID8gKGRvdWJsZSAqKSAwIDogKHZvaWQgKikgKEUpKSkgMAkgICAgICBcCisJCSAgOiAoX190eXBlb2ZfXyAoMCA/IChUICopIDAgOiAodm9pZCAqKSAoIShFKSkpKSAwKSkKKworLyogVGhlIHRnbWF0aCByZWFsIHR5cGUgb2YgRVhQUi4gICovCisjIGRlZmluZSBfX3RnbWF0aF9yZWFsX3R5cGUoZXhwcikgXAorICBfX3RnbWF0aF9yZWFsX3R5cGVfc3ViIChfX3R5cGVvZl9fICgoX190eXBlb2ZfXyAoZXhwcikpIDApLAkJICAgICAgXAorCQkJICBfX2Zsb2F0aW5nX3R5cGUgKF9fdHlwZW9mX18gKGV4cHIpKSkKKworCisvKiBXZSBoYXZlIHR3byBraW5kcyBvZiBnZW5lcmljIG1hY3JvczogdG8gc3VwcG9ydCBmdW5jdGlvbnMgd2hpY2ggYXJlCisgICBvbmx5IGRlZmluZWQgb24gcmVhbCB2YWx1ZWQgcGFyYW1ldGVycyBhbmQgdGhvc2Ugd2hpY2ggYXJlIGRlZmluZWQKKyAgIGZvciBjb21wbGV4IGZ1bmN0aW9ucyBhcyB3ZWxsLiAgKi8KKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWShWYWwsIEZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKHNpemVvZiAoVmFsKSA9PSBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBGY3QgKFZhbCkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKFZhbCkgPT0gc2l6ZW9mIChmbG9hdCkpCQkJICAgICAgXAorCQkgICAgID8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IyNmIChWYWwpCQkgICAgICBcCisJCSAgICAgOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBfX3RnbWwoRmN0KSAoVmFsKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkoVmFsLCBSZXRUeXBlLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKFZhbCkgPT0gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsKSAhPSA4KQkJICAgICAgXAorCQkgICAgID8gKFJldFR5cGUpIEZjdCAoVmFsKQkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwpID09IHNpemVvZiAoZmxvYXQpKQkJCSAgICAgIFwKKwkJICAgICA/IChSZXRUeXBlKSBGY3QjI2YgKFZhbCkJCQkJICAgICAgXAorCQkgICAgIDogKFJldFR5cGUpIF9fdGdtbChGY3QpIChWYWwpKSkKKworIyBkZWZpbmUgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWShWYWwxLCBWYWwyLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKFZhbDEpID09IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDEpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgRmN0IChWYWwxLCBWYWwyKQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGZsb2F0KSkJCSAgICAgIFwKKwkJICAgICA/IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSBGY3QjI2YgKFZhbDEsIFZhbDIpCSAgICAgIFwKKwkJICAgICA6IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSBfX3RnbWwoRmN0KSAoVmFsMSwgVmFsMikpKQorCisjIGRlZmluZSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZKFZhbDEsIFZhbDIsIEZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKChzaXplb2YgKFZhbDEpID4gc2l6ZW9mIChkb3VibGUpCQkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChWYWwyKSA+IHNpemVvZiAoZG91YmxlKSkJCSAgICAgIFwKKwkJICAgICAgJiYgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKChWYWwxKSArIChWYWwyKSkgPT0gOCkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIF9fdGdtbChGY3QpIChWYWwxLCBWYWwyKQkJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoVmFsMikgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMSkgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDIpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCAoVmFsMSwgVmFsMikJCQkJCSAgICAgIFwKKwkJICAgICA6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkgICAgICAgRmN0IyNmIChWYWwxLCBWYWwyKSkpCisKKyMgZGVmaW5lIF9fVEdNQVRIX1RFUk5BUllfRklSU1RfU0VDT05EX1JFQUxfT05MWShWYWwxLCBWYWwyLCBWYWwzLCBGY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKCgoc2l6ZW9mIChWYWwxKSA+IHNpemVvZiAoZG91YmxlKQkJCSAgICAgIFwKKwkJICAgICAgIHx8IHNpemVvZiAoVmFsMikgPiBzaXplb2YgKGRvdWJsZSkpCQkgICAgICBcCisJCSAgICAgICYmIF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlICgoVmFsMSkgKyAoVmFsMikpID09IDgpICAgICAgXAorCQkgICAgID8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBfX3RnbWwoRmN0KSAoVmFsMSwgVmFsMiwgVmFsMykJCQkgICAgICBcCisJCSAgICAgOiAoc2l6ZW9mIChWYWwxKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoVmFsMikgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMSkgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDIpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCAoVmFsMSwgVmFsMiwgVmFsMykJCQkJICAgICAgXAorCQkgICAgIDogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QjI2YgKFZhbDEsIFZhbDIsIFZhbDMpKSkKKworIyBkZWZpbmUgX19UR01BVEhfVEVSTkFSWV9SRUFMX09OTFkoVmFsMSwgVmFsMiwgVmFsMywgRmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoKHNpemVvZiAoVmFsMSkgPiBzaXplb2YgKGRvdWJsZSkJCQkgICAgICBcCisJCSAgICAgICB8fCBzaXplb2YgKFZhbDIpID4gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCSAgICAgICB8fCBzaXplb2YgKFZhbDMpID4gc2l6ZW9mIChkb3VibGUpKQkJICAgICAgXAorCQkgICAgICAmJiBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoKFZhbDEpICsgKFZhbDIpICsgKFZhbDMpKSAgIFwKKwkJCSA9PSA4KQkJCQkJCSAgICAgIFwKKwkJICAgICA/IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDMpKSAwKSkJICAgICAgXAorCQkgICAgICAgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIsIFZhbDMpCQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoVmFsMSkgPT0gc2l6ZW9mIChkb3VibGUpCQkgICAgICBcCisJCQl8fCBzaXplb2YgKFZhbDIpID09IHNpemVvZiAoZG91YmxlKQkJICAgICAgXAorCQkJfHwgc2l6ZW9mIChWYWwzKSA9PSBzaXplb2YgKGRvdWJsZSkJCSAgICAgIFwKKwkJCXx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChWYWwxKSAhPSA4CQkgICAgICBcCisJCQl8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoVmFsMikgIT0gOAkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKFZhbDMpICE9IDgpCQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCQkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwzKSkgMCkpCSAgICAgIFwKKwkJICAgICAgIEZjdCAoVmFsMSwgVmFsMiwgVmFsMykJCQkJICAgICAgXAorCQkgICAgIDogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMykpIDApKQkgICAgICBcCisJCSAgICAgICBGY3QjI2YgKFZhbDEsIFZhbDIsIFZhbDMpKSkKKworLyogWFhYIFRoaXMgZGVmaW5pdGlvbiBoYXMgdG8gYmUgY2hhbmdlZCBhcyBzb29uIGFzIHRoZSBjb21waWxlciB1bmRlcnN0YW5kcworICAgdGhlIGltYWdpbmFyeSBrZXl3b3JkLiAgKi8KKyMgZGVmaW5lIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyhWYWwsIEZjdCwgQ2ZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoZG91YmxlKQkgICAgICBcCisJCSAgICAgIHx8IF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsKSkgIT0gOCkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IChWYWwpCQkgICAgICBcCisJCQk6IChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIENmY3QgKFZhbCkpCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGZsb2F0KSkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgRmN0IyNmIChWYWwpCSAgICAgIFwKKwkJCTogKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgQ2ZjdCMjZiAoVmFsKSkJICAgICAgXAorCQkgICAgIDogKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgX190Z21sKEZjdCkgKFZhbCkJICAgICAgXAorCQkJOiAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSBfX3RnbWwoQ2ZjdCkgKFZhbCkpKSkKKworIyBkZWZpbmUgX19UR01BVEhfVU5BUllfSU1BRyhWYWwsIENmY3QpIFwKKyAgICAgKF9fZXh0ZW5zaW9uX18gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkgICAgICB8fCBfX2J1aWx0aW5fY2xhc3NpZnlfdHlwZSAoX19yZWFsX18gKFZhbCkpICE9IDgpCSAgICAgIFwKKwkJICAgICA/IChfX3R5cGVvZl9fICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwCSAgICAgIFwKKwkJCQkgICAgKyBfQ29tcGxleF9JKSkgQ2ZjdCAoVmFsKQkJICAgICAgXAorCQkgICAgIDogKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoZmxvYXQpKQkgICAgICBcCisJCSAgICAgPyAoX190eXBlb2ZfXyAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMAkgICAgICBcCisJCQkJICAgICsgX0NvbXBsZXhfSSkpIENmY3QjI2YgKFZhbCkJICAgICAgXAorCQkgICAgIDogKF9fdHlwZW9mX18gKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDAJICAgICAgXAorCQkJCSAgICArIF9Db21wbGV4X0kpKSBfX3RnbWwoQ2ZjdCkgKFZhbCkpKQorCisvKiBYWFggVGhpcyBkZWZpbml0aW9uIGhhcyB0byBiZSBjaGFuZ2VkIGFzIHNvb24gYXMgdGhlIGNvbXBpbGVyIHVuZGVyc3RhbmRzCisgICB0aGUgaW1hZ2luYXJ5IGtleXdvcmQuICAqLworIyBkZWZpbmUgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMKFZhbCwgRmN0LCBDZmN0KSBcCisgICAgIChfX2V4dGVuc2lvbl9fICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJICAgICAgfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwpKSAhPSA4KQkgICAgICBcCisJCSAgICAgPyAoKHNpemVvZiAoX19yZWFsX18gKFZhbCkpID09IHNpemVvZiAoVmFsKSkJICAgICAgXAorCQkJPyAoX190eXBlb2ZfXyAoX19yZWFsX18gKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsKSkgMCkpXAorCQkJICBGY3QgKFZhbCkJCQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgQ2ZjdCAoVmFsKSkJCQkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKGZsb2F0KSkJICAgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwpKSA9PSBzaXplb2YgKFZhbCkpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgRmN0IyNmIChWYWwpCQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIENmY3QjI2YgKFZhbCkpCQkJCSAgICAgIFwKKwkJICAgICA6ICgoc2l6ZW9mIChfX3JlYWxfXyAoVmFsKSkgPT0gc2l6ZW9mIChWYWwpKQkgICAgICBcCisJCQk/IChfX3R5cGVvZl9fIChfX3JlYWxfXyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwpKSAwKSlcCisJCQkgIF9fdGdtbChGY3QpIChWYWwpCQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mX18gKF9fcmVhbF9fIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbCkpIDApKVwKKwkJCSAgX190Z21sKENmY3QpIChWYWwpKSkpCisKKy8qIFhYWCBUaGlzIGRlZmluaXRpb24gaGFzIHRvIGJlIGNoYW5nZWQgYXMgc29vbiBhcyB0aGUgY29tcGlsZXIgdW5kZXJzdGFuZHMKKyAgIHRoZSBpbWFnaW5hcnkga2V5d29yZC4gICovCisjIGRlZmluZSBfX1RHTUFUSF9CSU5BUllfUkVBTF9JTUFHKFZhbDEsIFZhbDIsIEZjdCwgQ2ZjdCkgXAorICAgICAoX19leHRlbnNpb25fXyAoKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPiBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkgICAgICAgfHwgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID4gc2l6ZW9mIChkb3VibGUpKQkgICAgICBcCisJCSAgICAgICYmIF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlIChfX3JlYWxfXyAoVmFsMSkJICAgICAgXAorCQkJCQkJICArIF9fcmVhbF9fIChWYWwyKSkgPT0gOCkgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChWYWwxKQkgICAgICBcCisJCQkgJiYgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID09IHNpemVvZiAoVmFsMikpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgX190Z21sKEZjdCkgKFZhbDEsIFZhbDIpCQkJICAgICAgXAorCQkJOiAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkJICBfX3RnbWwoQ2ZjdCkgKFZhbDEsIFZhbDIpKQkJCSAgICAgIFwKKwkJICAgICA6IChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChkb3VibGUpCSAgICAgIFwKKwkJCXx8IHNpemVvZiAoX19yZWFsX18gKFZhbDIpKSA9PSBzaXplb2YgKGRvdWJsZSkJICAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwxKSkgIT0gOCAgICAgXAorCQkJfHwgX19idWlsdGluX2NsYXNzaWZ5X3R5cGUgKF9fcmVhbF9fIChWYWwyKSkgIT0gOCkgICAgXAorCQkgICAgID8gKChzaXplb2YgKF9fcmVhbF9fIChWYWwxKSkgPT0gc2l6ZW9mIChWYWwxKQkgICAgICBcCisJCQkgJiYgc2l6ZW9mIChfX3JlYWxfXyAoVmFsMikpID09IHNpemVvZiAoVmFsMikpCSAgICAgIFwKKwkJCT8gKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgRmN0IChWYWwxLCBWYWwyKQkJCQkgICAgICBcCisJCQk6IChfX3R5cGVvZiAoKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMSkpIDAJICAgICAgXAorCQkJCSAgICsgKF9fdGdtYXRoX3JlYWxfdHlwZSAoVmFsMikpIDApKQkgICAgICBcCisJCQkgIENmY3QgKFZhbDEsIFZhbDIpKQkJCQkgICAgICBcCisJCSAgICAgOiAoKHNpemVvZiAoX19yZWFsX18gKFZhbDEpKSA9PSBzaXplb2YgKFZhbDEpCSAgICAgIFwKKwkJCSAmJiBzaXplb2YgKF9fcmVhbF9fIChWYWwyKSkgPT0gc2l6ZW9mIChWYWwyKSkJICAgICAgXAorCQkJPyAoX190eXBlb2YgKChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDEpKSAwCSAgICAgIFwKKwkJCQkgICArIChfX3RnbWF0aF9yZWFsX3R5cGUgKFZhbDIpKSAwKSkJICAgICAgXAorCQkJICBGY3QjI2YgKFZhbDEsIFZhbDIpCQkJCSAgICAgIFwKKwkJCTogKF9fdHlwZW9mICgoX190Z21hdGhfcmVhbF90eXBlIChWYWwxKSkgMAkgICAgICBcCisJCQkJICAgKyAoX190Z21hdGhfcmVhbF90eXBlIChWYWwyKSkgMCkpCSAgICAgIFwKKwkJCSAgQ2ZjdCMjZiAoVmFsMSwgVmFsMikpKSkKKyNlbHNlCisjIGVycm9yICJVbnN1cHBvcnRlZCBjb21waWxlcjsgeW91IGNhbm5vdCB1c2UgPHRnbWF0aC5oPiIKKyNlbmRpZgorCisKKy8qIFVuYXJ5IGZ1bmN0aW9ucyBkZWZpbmVkIGZvciByZWFsIGFuZCBjb21wbGV4IHZhbHVlcy4gICovCisKKworLyogVHJpZ29ub21ldHJpYyBmdW5jdGlvbnMuICAqLworCisvKiBBcmMgY29zaW5lIG9mIFguICAqLworI2RlZmluZSBhY29zKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFjb3MsIGNhY29zKQorLyogQXJjIHNpbmUgb2YgWC4gICovCisjZGVmaW5lIGFzaW4oVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYXNpbiwgY2FzaW4pCisvKiBBcmMgdGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgYXRhbihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhdGFuLCBjYXRhbikKKy8qIEFyYyB0YW5nZW50IG9mIFkvWC4gICovCisjZGVmaW5lIGF0YW4yKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGF0YW4yKQorCisvKiBDb3NpbmUgb2YgWC4gICovCisjZGVmaW5lIGNvcyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBjb3MsIGNjb3MpCisvKiBTaW5lIG9mIFguICAqLworI2RlZmluZSBzaW4oVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgc2luLCBjc2luKQorLyogVGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgdGFuKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIHRhbiwgY3RhbikKKworCisvKiBIeXBlcmJvbGljIGZ1bmN0aW9ucy4gICovCisKKy8qIEh5cGVyYm9saWMgYXJjIGNvc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgYWNvc2goVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgYWNvc2gsIGNhY29zaCkKKy8qIEh5cGVyYm9saWMgYXJjIHNpbmUgb2YgWC4gICovCisjZGVmaW5lIGFzaW5oKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGFzaW5oLCBjYXNpbmgpCisvKiBIeXBlcmJvbGljIGFyYyB0YW5nZW50IG9mIFguICAqLworI2RlZmluZSBhdGFuaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBhdGFuaCwgY2F0YW5oKQorCisvKiBIeXBlcmJvbGljIGNvc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgY29zaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBjb3NoLCBjY29zaCkKKy8qIEh5cGVyYm9saWMgc2luZSBvZiBYLiAgKi8KKyNkZWZpbmUgc2luaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBzaW5oLCBjc2luaCkKKy8qIEh5cGVyYm9saWMgdGFuZ2VudCBvZiBYLiAgKi8KKyNkZWZpbmUgdGFuaChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCB0YW5oLCBjdGFuaCkKKworCisvKiBFeHBvbmVudGlhbCBhbmQgbG9nYXJpdGhtaWMgZnVuY3Rpb25zLiAgKi8KKworLyogRXhwb25lbnRpYWwgZnVuY3Rpb24gb2YgWC4gICovCisjZGVmaW5lIGV4cChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BRyAoVmFsLCBleHAsIGNleHApCisKKy8qIEJyZWFrIFZBTFVFIGludG8gYSBub3JtYWxpemVkIGZyYWN0aW9uIGFuZCBhbiBpbnRlZ3JhbCBwb3dlciBvZiAyLiAgKi8KKyNkZWZpbmUgZnJleHAoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZnJleHApCisKKy8qIFggdGltZXMgKHR3byB0byB0aGUgRVhQIHBvd2VyKS4gICovCisjZGVmaW5lIGxkZXhwKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGxkZXhwKQorCisvKiBOYXR1cmFsIGxvZ2FyaXRobSBvZiBYLiAgKi8KKyNkZWZpbmUgbG9nKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHIChWYWwsIGxvZywgY2xvZykKKworLyogQmFzZS10ZW4gbG9nYXJpdGhtIG9mIFguICAqLworI2lmZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgbG9nMTAoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgbG9nMTAsIF9fY2xvZzEwKQorI2Vsc2UKKyMgZGVmaW5lIGxvZzEwKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGxvZzEwKQorI2VuZGlmCisKKy8qIFJldHVybiBleHAoWCkgLSAxLiAgKi8KKyNkZWZpbmUgZXhwbTEoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZXhwbTEpCisKKy8qIFJldHVybiBsb2coMSArIFgpLiAgKi8KKyNkZWZpbmUgbG9nMXAoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbG9nMXApCisKKy8qIFJldHVybiB0aGUgYmFzZSAyIHNpZ25lZCBpbnRlZ3JhbCBleHBvbmVudCBvZiBYLiAgKi8KKyNkZWZpbmUgbG9nYihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBsb2diKQorCisvKiBDb21wdXRlIGJhc2UtMiBleHBvbmVudGlhbCBvZiBYLiAgKi8KKyNkZWZpbmUgZXhwMihWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBleHAyKQorCisvKiBDb21wdXRlIGJhc2UtMiBsb2dhcml0aG0gb2YgWC4gICovCisjZGVmaW5lIGxvZzIoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbG9nMikKKworCisvKiBQb3dlciBmdW5jdGlvbnMuICAqLworCisvKiBSZXR1cm4gWCB0byB0aGUgWSBwb3dlci4gICovCisjZGVmaW5lIHBvdyhWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9JTUFHIChWYWwxLCBWYWwyLCBwb3csIGNwb3cpCisKKy8qIFJldHVybiB0aGUgc3F1YXJlIHJvb3Qgb2YgWC4gICovCisjZGVmaW5lIHNxcnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUcgKFZhbCwgc3FydCwgY3NxcnQpCisKKy8qIFJldHVybiBgc3FydChYKlggKyBZKlkpJy4gICovCisjZGVmaW5lIGh5cG90KFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGh5cG90KQorCisvKiBSZXR1cm4gdGhlIGN1YmUgcm9vdCBvZiBYLiAgKi8KKyNkZWZpbmUgY2JydChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBjYnJ0KQorCisKKy8qIE5lYXJlc3QgaW50ZWdlciwgYWJzb2x1dGUgdmFsdWUsIGFuZCByZW1haW5kZXIgZnVuY3Rpb25zLiAgKi8KKworLyogU21hbGxlc3QgaW50ZWdyYWwgdmFsdWUgbm90IGxlc3MgdGhhbiBYLiAgKi8KKyNkZWZpbmUgY2VpbChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBjZWlsKQorCisvKiBBYnNvbHV0ZSB2YWx1ZSBvZiBYLiAgKi8KKyNkZWZpbmUgZmFicyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfSU1BR19SRVRfUkVBTCAoVmFsLCBmYWJzLCBjYWJzKQorCisvKiBMYXJnZXN0IGludGVnZXIgbm90IGdyZWF0ZXIgdGhhbiBYLiAgKi8KKyNkZWZpbmUgZmxvb3IoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgZmxvb3IpCisKKy8qIEZsb2F0aW5nLXBvaW50IG1vZHVsbyByZW1haW5kZXIgb2YgWC9ZLiAgKi8KKyNkZWZpbmUgZm1vZChWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBmbW9kKQorCisvKiBSb3VuZCBYIHRvIGludGVncmFsIHZhbHVlaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IHVzaW5nIGN1cnJlbnQKKyAgIHJvdW5kaW5nIGRpcmVjdGlvbiwgYnV0IGRvIG5vdCByYWlzZSBpbmV4YWN0IGV4Y2VwdGlvbi4gICovCisjZGVmaW5lIG5lYXJieWludChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBuZWFyYnlpbnQpCisKKy8qIFJvdW5kIFggdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSwgcm91bmRpbmcgaGFsZndheSBjYXNlcyBhd2F5IGZyb20KKyAgIHplcm8uICAqLworI2RlZmluZSByb3VuZChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCByb3VuZCkKKworLyogUm91bmQgWCB0byB0aGUgaW50ZWdyYWwgdmFsdWUgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IG5lYXJlc3QgYnV0CisgICBub3QgbGFyZ2VyIGluIG1hZ25pdHVkZS4gICovCisjZGVmaW5lIHRydW5jKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIHRydW5jKQorCisvKiBDb21wdXRlIHJlbWFpbmRlciBvZiBYIGFuZCBZIGFuZCBwdXQgaW4gKlFVTyBhIHZhbHVlIHdpdGggc2lnbiBvZiB4L3kKKyAgIGFuZCBtYWduaXR1ZGUgY29uZ3J1ZW50IGBtb2QgMl5uJyB0byB0aGUgbWFnbml0dWRlIG9mIHRoZSBpbnRlZ3JhbAorICAgcXVvdGllbnQgeC95LCB3aXRoIG4gPj0gMy4gICovCisjZGVmaW5lIHJlbXF1byhWYWwxLCBWYWwyLCBWYWwzKSBcCisgICAgIF9fVEdNQVRIX1RFUk5BUllfRklSU1RfU0VDT05EX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgVmFsMywgcmVtcXVvKQorCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgYWNjb3JkaW5nIHRvIGN1cnJlbnQgcm91bmRpbmcKKyAgIGRpcmVjdGlvbi4gICovCisjZGVmaW5lIGxyaW50KFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBsb25nIGludCwgbHJpbnQpCisjZGVmaW5lIGxscmludChWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfUkVUX09OTFkgKFZhbCwgbG9uZyBsb25nIGludCwgbGxyaW50KQorCisvKiBSb3VuZCBYIHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheSBmcm9tCisgICB6ZXJvLiAgKi8KKyNkZWZpbmUgbHJvdW5kKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBsb25nIGludCwgbHJvdW5kKQorI2RlZmluZSBsbHJvdW5kKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9SRVRfT05MWSAoVmFsLCBsb25nIGxvbmcgaW50LCBsbHJvdW5kKQorCisKKy8qIFJldHVybiBYIHdpdGggaXRzIHNpZ25lZCBjaGFuZ2VkIHRvIFkncy4gICovCisjZGVmaW5lIGNvcHlzaWduKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGNvcHlzaWduKQorCisvKiBFcnJvciBhbmQgZ2FtbWEgZnVuY3Rpb25zLiAgKi8KKyNkZWZpbmUgZXJmKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9PTkxZIChWYWwsIGVyZikKKyNkZWZpbmUgZXJmYyhWYWwpIF9fVEdNQVRIX1VOQVJZX1JFQUxfT05MWSAoVmFsLCBlcmZjKQorI2RlZmluZSB0Z2FtbWEoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgdGdhbW1hKQorI2RlZmluZSBsZ2FtbWEoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgbGdhbW1hKQorCisKKy8qIFJldHVybiB0aGUgaW50ZWdlciBuZWFyZXN0IFggaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUKKyAgIHByZXZhaWxpbmcgcm91bmRpbmcgbW9kZS4gICovCisjZGVmaW5lIHJpbnQoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX09OTFkgKFZhbCwgcmludCkKKworLyogUmV0dXJuIFggKyBlcHNpbG9uIGlmIFggPCBZLCBYIC0gZXBzaWxvbiBpZiBYID4gWS4gICovCisjZGVmaW5lIG5leHRhZnRlcihWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBuZXh0YWZ0ZXIpCisjZGVmaW5lIG5leHR0b3dhcmQoVmFsMSwgVmFsMikgXAorICAgICBfX1RHTUFUSF9CSU5BUllfRklSU1RfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBuZXh0dG93YXJkKQorCisvKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiBpbnRlZ2VyIGRpdmlzb24gWCAvIFkgd2l0aCBpbmZpbml0ZSBwcmVjaXNpb24uICAqLworI2RlZmluZSByZW1haW5kZXIoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgcmVtYWluZGVyKQorCisvKiBSZXR1cm4gWCB0aW1lcyAoMiB0byB0aGUgTnRoIHBvd2VyKS4gICovCisjaWYgZGVmaW5lZCBfX1VTRV9NSVNDIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKyMgZGVmaW5lIHNjYWxiKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHNjYWxiKQorI2VuZGlmCisKKy8qIFJldHVybiBYIHRpbWVzICgyIHRvIHRoZSBOdGggcG93ZXIpLiAgKi8KKyNkZWZpbmUgc2NhbGJuKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9GSVJTVF9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIHNjYWxibikKKworLyogUmV0dXJuIFggdGltZXMgKDIgdG8gdGhlIE50aCBwb3dlcikuICAqLworI2RlZmluZSBzY2FsYmxuKFZhbDEsIFZhbDIpIFwKKyAgICAgX19UR01BVEhfQklOQVJZX0ZJUlNUX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgc2NhbGJsbikKKworLyogUmV0dXJuIHRoZSBiaW5hcnkgZXhwb25lbnQgb2YgWCwgd2hpY2ggbXVzdCBiZSBub256ZXJvLiAgKi8KKyNkZWZpbmUgaWxvZ2IoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX1JFVF9PTkxZIChWYWwsIGludCwgaWxvZ2IpCisKKworLyogUmV0dXJuIHBvc2l0aXZlIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZLiAgKi8KKyNkZWZpbmUgZmRpbShWYWwxLCBWYWwyKSBfX1RHTUFUSF9CSU5BUllfUkVBTF9PTkxZIChWYWwxLCBWYWwyLCBmZGltKQorCisvKiBSZXR1cm4gbWF4aW11bSBudW1lcmljIHZhbHVlIGZyb20gWCBhbmQgWS4gICovCisjZGVmaW5lIGZtYXgoVmFsMSwgVmFsMikgX19UR01BVEhfQklOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgZm1heCkKKworLyogUmV0dXJuIG1pbmltdW0gbnVtZXJpYyB2YWx1ZSBmcm9tIFggYW5kIFkuICAqLworI2RlZmluZSBmbWluKFZhbDEsIFZhbDIpIF9fVEdNQVRIX0JJTkFSWV9SRUFMX09OTFkgKFZhbDEsIFZhbDIsIGZtaW4pCisKKworLyogTXVsdGlwbHktYWRkIGZ1bmN0aW9uIGNvbXB1dGVkIGFzIGEgdGVybmFyeSBvcGVyYXRpb24uICAqLworI2RlZmluZSBmbWEoVmFsMSwgVmFsMiwgVmFsMykgXAorICAgICBfX1RHTUFUSF9URVJOQVJZX1JFQUxfT05MWSAoVmFsMSwgVmFsMiwgVmFsMywgZm1hKQorCisKKy8qIEFic29sdXRlIHZhbHVlLCBjb25qdWdhdGVzLCBhbmQgcHJvamVjdGlvbi4gICovCisKKy8qIEFyZ3VtZW50IHZhbHVlIG9mIFouICAqLworI2RlZmluZSBjYXJnKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMIChWYWwsIGNhcmcsIGNhcmcpCisKKy8qIENvbXBsZXggY29uanVnYXRlIG9mIFouICAqLworI2RlZmluZSBjb25qKFZhbCkgX19UR01BVEhfVU5BUllfSU1BRyAoVmFsLCBjb25qKQorCisvKiBQcm9qZWN0aW9uIG9mIFogb250byB0aGUgUmllbWFubiBzcGhlcmUuICAqLworI2RlZmluZSBjcHJvaihWYWwpIF9fVEdNQVRIX1VOQVJZX0lNQUcgKFZhbCwgY3Byb2opCisKKworLyogRGVjb21wb3NpbmcgY29tcGxleCB2YWx1ZXMuICAqLworCisvKiBJbWFnaW5hcnkgcGFydCBvZiBaLiAgKi8KKyNkZWZpbmUgY2ltYWcoVmFsKSBfX1RHTUFUSF9VTkFSWV9SRUFMX0lNQUdfUkVUX1JFQUwgKFZhbCwgY2ltYWcsIGNpbWFnKQorCisvKiBSZWFsIHBhcnQgb2YgWi4gICovCisjZGVmaW5lIGNyZWFsKFZhbCkgX19UR01BVEhfVU5BUllfUkVBTF9JTUFHX1JFVF9SRUFMIChWYWwsIGNyZWFsLCBjcmVhbCkKKworI2VuZGlmIC8qIHRnbWF0aC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3RocmVhZF9kYi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90aHJlYWRfZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNiNTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90aHJlYWRfZGIuaApAQCAtMCwwICsxLDQ1OSBAQAorLyogdGhyZWFkX2RiLmggLS0gaW50ZXJmYWNlIHRvIGxpYnRocmVhZF9kYi5zbyBsaWJyYXJ5IGZvciBkZWJ1Z2dpbmcgLWxwdGhyZWFkCisgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMSwyMDAyLDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYgX1RIUkVBRF9EQl9ICisjZGVmaW5lIF9USFJFQURfREJfSAkxCisKKy8qIFRoaXMgaXMgdGhlIGRlYnVnZ2VyIGludGVyZmFjZSBmb3IgdGhlIE5QVEwgbGlicmFyeS4gIEl0IGlzCisgICBtb2RlbGxlZCBjbG9zZWx5IGFmdGVyIHRoZSBpbnRlcmZhY2Ugd2l0aCBzYW1lIG5hbWVzIGluIFNvbGFyaXMKKyAgIHdpdGggdGhlIGdvYWwgdG8gc2hhcmUgdGhlIHNhbWUgY29kZSBpbiB0aGUgZGVidWdnZXIuICAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+CisKKworLyogRXJyb3IgY29kZXMgb2YgdGhlIGxpYnJhcnkuICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX09LLAkgIC8qIE5vIGVycm9yLiAgKi8KKyAgVERfRVJSLAkgIC8qIE5vIGZ1cnRoZXIgc3BlY2lmaWVkIGVycm9yLiAgKi8KKyAgVERfTk9USFIsCSAgLyogTm8gbWF0Y2hpbmcgdGhyZWFkIGZvdW5kLiAgKi8KKyAgVERfTk9TViwJICAvKiBObyBtYXRjaGluZyBzeW5jaHJvbml6YXRpb24gaGFuZGxlIGZvdW5kLiAgKi8KKyAgVERfTk9MV1AsCSAgLyogTm8gbWF0Y2hpbmcgbGlnaHQtd2VpZ2h0ZWQgcHJvY2VzcyBmb3VuZC4gICovCisgIFREX0JBRFBILAkgIC8qIEludmFsaWQgcHJvY2VzcyBoYW5kbGUuICAqLworICBURF9CQURUSCwJICAvKiBJbnZhbGlkIHRocmVhZCBoYW5kbGUuICAqLworICBURF9CQURTSCwJICAvKiBJbnZhbGlkIHN5bmNocm9uaXphdGlvbiBoYW5kbGUuICAqLworICBURF9CQURUQSwJICAvKiBJbnZhbGlkIHRocmVhZCBhZ2VudC4gICovCisgIFREX0JBREtFWSwJICAvKiBJbnZhbGlkIGtleS4gICovCisgIFREX05PTVNHLAkgIC8qIE5vIGV2ZW50IGF2YWlsYWJsZS4gICovCisgIFREX05PRlBSRUdTLAkgIC8qIE5vIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGNvbnRlbnQgYXZhaWxhYmxlLiAgKi8KKyAgVERfTk9MSUJUSFJFQUQsIC8qIEFwcGxpY2F0aW9uIG5vdCBsaW5rZWQgd2l0aCB0aHJlYWQgbGlicmFyeS4gICovCisgIFREX05PRVZFTlQsCSAgLyogUmVxdWVzdGVkIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQuICAqLworICBURF9OT0NBUEFCLAkgIC8qIENhcGFiaWxpdHkgbm90IGF2YWlsYWJsZS4gICovCisgIFREX0RCRVJSLAkgIC8qIEludGVybmFsIGRlYnVnIGxpYnJhcnkgZXJyb3IuICAqLworICBURF9OT0FQTElDLAkgIC8qIE9wZXJhdGlvbiBpcyBub3QgYXBwbGljYWJsZS4gICovCisgIFREX05PVFNELAkgIC8qIE5vIHRocmVhZC1zcGVjaWZpYyBkYXRhIGF2YWlsYWJsZS4gICovCisgIFREX01BTExPQywJICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKyAgVERfUEFSVElBTFJFRywgIC8qIE5vdCBlbnRpcmUgcmVnaXN0ZXIgc2V0IHdhcyByZWFkIG9yIHdyaXR0ZW4uICAqLworICBURF9OT1hSRUdTLAkgIC8qIFggcmVnaXN0ZXIgc2V0IG5vdCBhdmFpbGFibGUgZm9yIGdpdmVuIHRocmVhZC4gICovCisgIFREX1RMU0RFRkVSLAkgIC8qIFRocmVhZCBoYXMgbm90IHlldCBhbGxvY2F0ZWQgVExTIGZvciBnaXZlbiBtb2R1bGUuICAqLworICBURF9OT1RBTExPQyA9IFREX1RMU0RFRkVSLAorICBURF9WRVJTSU9OLAkgIC8qIFZlcnNpb24gaWYgbGlicHRocmVhZCBhbmQgbGlidGhyZWFkX2RiIGRvIG5vdCBtYXRjaC4gICovCisgIFREX05PVExTCSAgLyogVGhlcmUgaXMgbm8gVExTIHNlZ21lbnQgaW4gdGhlIGdpdmVuIG1vZHVsZS4gICovCit9IHRkX2Vycl9lOworCisKKy8qIFBvc3NpYmxlIHRocmVhZCBzdGF0ZXMuICBURF9USFJfQU5ZX1NUQVRFIGlzIGEgcHNldWRvLXN0YXRlIHVzZWQgdG8KKyAgIHNlbGVjdCB0aHJlYWRzIHJlZ2FyZGxlc3Mgb2Ygc3RhdGUgaW4gdGRfdGFfdGhyX2l0ZXIoKS4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgVERfVEhSX0FOWV9TVEFURSwKKyAgVERfVEhSX1VOS05PV04sCisgIFREX1RIUl9TVE9QUEVELAorICBURF9USFJfUlVOLAorICBURF9USFJfQUNUSVZFLAorICBURF9USFJfWk9NQklFLAorICBURF9USFJfU0xFRVAsCisgIFREX1RIUl9TVE9QUEVEX0FTTEVFUAorfSB0ZF90aHJfc3RhdGVfZTsKKworLyogVGhyZWFkIHR5cGU6IHVzZXIgb3Igc3lzdGVtLiAgVERfVEhSX0FOWV9UWVBFIGlzIGEgcHNldWRvLXR5cGUgdXNlZAorICAgdG8gc2VsZWN0IHRocmVhZHMgcmVnYXJkbGVzcyBvZiB0eXBlIGluIHRkX3RhX3Rocl9pdGVyKCkuICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX1RIUl9BTllfVFlQRSwKKyAgVERfVEhSX1VTRVIsCisgIFREX1RIUl9TWVNURU0KK30gdGRfdGhyX3R5cGVfZTsKKworCisvKiBUeXBlcyBvZiB0aGUgZGVidWdnaW5nIGxpYnJhcnkuICAqLworCisvKiBIYW5kbGUgZm9yIGEgcHJvY2Vzcy4gIFRoaXMgdHlwZSBpcyBvcGFxdWUuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfdGhyYWdlbnQgdGRfdGhyYWdlbnRfdDsKKworLyogVGhlIGFjdHVhbCB0aHJlYWQgaGFuZGxlIHR5cGUuICBUaGlzIGlzIGFsc28gb3BhcXVlLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX3RocmhhbmRsZQoreworICB0ZF90aHJhZ2VudF90ICp0aF90YV9wOworICBwc2FkZHJfdCB0aF91bmlxdWU7Cit9IHRkX3RocmhhbmRsZV90OworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYSB0eXBlIGRlZmluZWQgYnkgYW5kIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLworc3RydWN0IGxpbmtfbWFwOworCisKKy8qIEZsYWdzIGZvciBgdGRfdGFfdGhyX2l0ZXInLiAgKi8KKyNkZWZpbmUgVERfVEhSX0FOWV9VU0VSX0ZMQUdTCTB4ZmZmZmZmZmYKKyNkZWZpbmUgVERfVEhSX0xPV0VTVF9QUklPUklUWQktMjAKKyNkZWZpbmUgVERfU0lHTk9fTUFTSwkJTlVMTAorCisKKyNkZWZpbmUgVERfRVZFTlRTSVpFCTIKKyNkZWZpbmUgQlRfVUlTSElGVAk1IC8qIGxvZyBiYXNlIDIgb2YgQlRfTkJJUFVJLCB0byBleHRyYWN0IHdvcmQgaW5kZXggKi8KKyNkZWZpbmUgQlRfTkJJUFVJCSgxIDw8IEJUX1VJU0hJRlQpICAgICAgIC8qIG4gYml0cyBwZXIgdWludCAqLworI2RlZmluZSBCVF9VSU1BU0sJKEJUX05CSVBVSSAtIDEpICAgICAgICAgLyogdG8gZXh0cmFjdCBiaXQgaW5kZXggKi8KKworLyogQml0bWFzayBvZiBlbmFibGVkIGV2ZW50cy4gKi8KK3R5cGVkZWYgc3RydWN0IHRkX3Rocl9ldmVudHMKK3sKKyAgdWludDMyX3QgZXZlbnRfYml0c1tURF9FVkVOVFNJWkVdOworfSB0ZF90aHJfZXZlbnRzX3Q7CisKKy8qIEV2ZW50IHNldCBtYW5pcHVsYXRpb24gbWFjcm9zLiAqLworI2RlZmluZSBfX3RkX2V2ZW50bWFzayhuKSBcCisgIChVSU5UMzJfQyAoMSkgPDwgKCgobikgLSAxKSAmIEJUX1VJTUFTSykpCisjZGVmaW5lIF9fdGRfZXZlbnR3b3JkKG4pIFwKKyAgKChVSU5UMzJfQyAoKG4pIC0gMSkpID4+IEJUX1VJU0hJRlQpCisKKyNkZWZpbmUgdGRfZXZlbnRfZW1wdHlzZXQoc2V0cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfX2k7CQkJCQkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSBURF9FVkVOVFNJWkU7IF9faSA+IDA7IC0tX19pKQkJCQkgICAgICBcCisgICAgICAoc2V0cCktPmV2ZW50X2JpdHNbX19pIC0gMV0gPSAwOwkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIHRkX2V2ZW50X2ZpbGxzZXQoc2V0cCkgXAorICBkbyB7CQkJCQkJCQkJICAgICAgXAorICAgIGludCBfX2k7CQkJCQkJCQkgICAgICBcCisgICAgZm9yIChfX2kgPSBURF9FVkVOVFNJWkU7IF9faSA+IDA7IC0tX19pKQkJCQkgICAgICBcCisgICAgICAoc2V0cCktPmV2ZW50X2JpdHNbX19pIC0gMV0gPSBVSU5UMzJfQyAoMHhmZmZmZmZmZik7CQkgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdGRfZXZlbnRfYWRkc2V0KHNldHAsIG4pIFwKKyAgKCgoc2V0cCktPmV2ZW50X2JpdHNbX190ZF9ldmVudHdvcmQgKG4pXSkgfD0gX190ZF9ldmVudG1hc2sgKG4pKQorI2RlZmluZSB0ZF9ldmVudF9kZWxzZXQoc2V0cCwgbikgXAorICAoKChzZXRwKS0+ZXZlbnRfYml0c1tfX3RkX2V2ZW50d29yZCAobildKSAmPSB+X190ZF9ldmVudG1hc2sgKG4pKQorI2RlZmluZSB0ZF9ldmVudGlzbWVtYmVyKHNldHAsIG4pIFwKKyAgKF9fdGRfZXZlbnRtYXNrIChuKSAmICgoc2V0cCktPmV2ZW50X2JpdHNbX190ZF9ldmVudHdvcmQgKG4pXSkpCisjaWYgVERfRVZFTlRTSVpFID09IDIKKyMgZGVmaW5lIHRkX2V2ZW50aXNlbXB0eShzZXRwKSBcCisgICghKChzZXRwKS0+ZXZlbnRfYml0c1swXSkgJiYgISgoc2V0cCktPmV2ZW50X2JpdHNbMV0pKQorI2Vsc2UKKyMgZXJyb3IgInRkX2V2ZW50aXNlbXB0eSBtdXN0IGJlIGNoYW5nZWQgdG8gbWF0Y2ggVERfRVZFTlRTSVpFIgorI2VuZGlmCisKKy8qIEV2ZW50cyByZXBvcnRhYmxlIGJ5IHRoZSB0aHJlYWQgaW1wbGVtZW50YXRpb24uICAqLwordHlwZWRlZiBlbnVtCit7CisgIFREX0FMTF9FVkVOVFMsCQkgLyogUHNldWRvLWV2ZW50IG51bWJlci4gICovCisgIFREX0VWRU5UX05PTkUgPSBURF9BTExfRVZFTlRTLCAvKiBEZXBlbmRzIG9uIGNvbnRleHQuICAqLworICBURF9SRUFEWSwJCQkgLyogSXMgZXhlY3V0YWJsZSBub3cuICovCisgIFREX1NMRUVQLAkJCSAvKiBCbG9ja2VkIGluIGEgc3luY2hyb25pemF0aW9uIG9iai4gICovCisgIFREX1NXSVRDSFRPLAkJCSAvKiBOb3cgYXNzaWduZWQgdG8gYSBwcm9jZXNzLiAgKi8KKyAgVERfU1dJVENIRlJPTSwJCSAvKiBOb3QgYW55bW9yZSBhc3NpZ25lZCB0byBhIHByb2Nlc3MuICAqLworICBURF9MT0NLX1RSWSwJCQkgLyogVHJ5aW5nIHRvIGdldCBhbiB1bmF2YWlsYWJsZSBsb2NrLiAgKi8KKyAgVERfQ0FUQ0hTSUcsCQkJIC8qIFNpZ25hbCBwb3N0ZWQgdG8gdGhlIHRocmVhZC4gICovCisgIFREX0lETEUsCQkJIC8qIFByb2Nlc3MgZ2V0dGluZyBpZGxlLiAgKi8KKyAgVERfQ1JFQVRFLAkJCSAvKiBOZXcgdGhyZWFkIGNyZWF0ZWQuICAqLworICBURF9ERUFUSCwJCQkgLyogVGhyZWFkIHRlcm1pbmF0ZWQuICAqLworICBURF9QUkVFTVBULAkJCSAvKiBQcmVlbXB0ZWQuICAqLworICBURF9QUklfSU5IRVJJVCwJCSAvKiBJbmhlcml0ZWQgZWxldmF0ZWQgcHJpb3JpdHkuICAqLworICBURF9SRUFQLAkJCSAvKiBSZWFwZWQuICAqLworICBURF9DT05DVVJSRU5DWSwJCSAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VzIGNoYW5naW5nLiAgKi8KKyAgVERfVElNRU9VVCwJCQkgLyogQ29uZGl0aW9uYWwgdmFyaWFibGUgd2FpdCB0aW1lZCBvdXQuICAqLworICBURF9NSU5fRVZFTlRfTlVNID0gVERfUkVBRFksCisgIFREX01BWF9FVkVOVF9OVU0gPSBURF9USU1FT1VULAorICBURF9FVkVOVFNfRU5BQkxFID0gMzEJCS8qIEV2ZW50IHJlcG9ydGluZyBlbmFibGVkLiAgKi8KK30gdGRfZXZlbnRfZTsKKworLyogVmFsdWVzIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW50IHdheXMgZXZlbnRzIGFyZSByZXBvcnRlZC4gICovCit0eXBlZGVmIGVudW0KK3sKKyAgTk9USUZZX0JQVCwJCQkvKiBVc2VyIG11c3QgaW5zZXJ0IGJyZWFrcG9pbnQgYXQgdS5icHRhZGRyLiAqLworICBOT1RJRllfQVVUT0JQVCwJCS8qIEJyZWFrcG9pbnQgYXQgdS5icHRhZGRyIGlzIGF1dG9tYXRpY2FsbHkKKwkJCQkgICBpbnNlcnRlZC4gICovCisgIE5PVElGWV9TWVNDQUxMCQkvKiBTeXN0ZW0gY2FsbCB1LnN5c2NhbGxubyB3aWxsIGJlIGludm9rZWQuICAqLworfSB0ZF9ub3RpZnlfZTsKKworLyogRGVzY3JpcHRpb24gaG93IGV2ZW50IHR5cGUgaXMgcmVwb3J0ZWQuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfbm90aWZ5Cit7CisgIHRkX25vdGlmeV9lIHR5cGU7CQkvKiBXYXkgdGhlIGV2ZW50IGlzIHJlcG9ydGVkLiAgKi8KKyAgdW5pb24KKyAgeworICAgIHBzYWRkcl90IGJwdGFkZHI7CQkvKiBBZGRyZXNzIG9mIGJyZWFrcG9pbnQuICAqLworICAgIGludCBzeXNjYWxsbm87CQkvKiBOdW1iZXIgb2Ygc3lzdGVtIGNhbGwgdXNlZC4gICovCisgIH0gdTsKK30gdGRfbm90aWZ5X3Q7CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHJlcG9ydCBldmVudC4gICovCit0eXBlZGVmIHN0cnVjdCB0ZF9ldmVudF9tc2cKK3sKKyAgdGRfZXZlbnRfZSBldmVudDsJCS8qIEV2ZW50IHR5cGUgYmVpbmcgcmVwb3J0ZWQuICAqLworICBjb25zdCB0ZF90aHJoYW5kbGVfdCAqdGhfcDsJLyogVGhyZWFkIHJlcG9ydGluZyB0aGUgZXZlbnQuICAqLworICB1bmlvbgorICB7CisjIGlmIDAKKyAgICB0ZF9zeW5jaGFuZGxlX3QgKnNoOwkvKiBIYW5kbGUgb2Ygc3luY2hyb25pemF0aW9uIG9iamVjdC4gICovCisjZW5kaWYKKyAgICB1aW50cHRyX3QgZGF0YTsJCS8qIEV2ZW50IHNwZWNpZmljIGRhdGEuICAqLworICB9IG1zZzsKK30gdGRfZXZlbnRfbXNnX3Q7CisKKy8qIFN0cnVjdHVyZSBjb250YWluaW5nIGV2ZW50IGRhdGEgYXZhaWxhYmxlIGluIGVhY2ggdGhyZWFkIHN0cnVjdHVyZS4gICovCit0eXBlZGVmIHN0cnVjdAoreworICB0ZF90aHJfZXZlbnRzX3QgZXZlbnRtYXNrOwkvKiBNYXNrIG9mIGVuYWJsZWQgZXZlbnRzLiAgKi8KKyAgdGRfZXZlbnRfZSBldmVudG51bTsJCS8qIE51bWJlciBvZiBsYXN0IGV2ZW50LiAgKi8KKyAgdm9pZCAqZXZlbnRkYXRhOwkJLyogRGF0YSBhc3NvY2lhdGVkIHdpdGggZXZlbnQuICAqLworfSB0ZF9ldmVudGJ1Zl90OworCisKKy8qIEdhdGhlcmVkIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHByb2Nlc3MuICAqLwordHlwZWRlZiBzdHJ1Y3QgdGRfdGFfc3RhdHMKK3sKKyAgaW50IG50aHJlYWRzOyAgICAgICAJCS8qIFRvdGFsIG51bWJlciBvZiB0aHJlYWRzIGluIHVzZS4gICovCisgIGludCByX2NvbmN1cnJlbmN5OwkJLyogQ29uY3VycmVuY3kgbGV2ZWwgcmVxdWVzdGVkIGJ5IHVzZXIuICAqLworICBpbnQgbnJ1bm5hYmxlX251bTsJCS8qIEF2ZXJhZ2UgcnVubmFibGUgdGhyZWFkcywgbnVtZXJhdG9yLiAgKi8KKyAgaW50IG5ydW5uYWJsZV9kZW47CQkvKiBBdmVyYWdlIHJ1bm5hYmxlIHRocmVhZHMsIGRlbm9taW5hdG9yLiAgKi8KKyAgaW50IGFfY29uY3VycmVuY3lfbnVtOwkvKiBBY2hpZXZlZCBjb25jdXJyZW5jeSBsZXZlbCwgbnVtZXJhdG9yLiAgKi8KKyAgaW50IGFfY29uY3VycmVuY3lfZGVuOwkvKiBBY2hpZXZlZCBjb25jdXJyZW5jeSBsZXZlbCwgZGVub21pbmF0b3IuICAqLworICBpbnQgbmx3cHNfbnVtOwkJLyogQXZlcmFnZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHVzZSwKKwkJCQkgICBudW1lcmF0b3IuICAqLworICBpbnQgbmx3cHNfZGVuOwkJLyogQXZlcmFnZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHVzZSwKKwkJCQkgICBkZW5vbWluYXRvci4gICovCisgIGludCBuaWRsZV9udW07CQkvKiBBdmVyYWdlIG51bWJlciBvZiBpZGxpbmcgcHJvY2Vzc2VzLAorCQkJCSAgIG51bWVyYXRvci4gICovCisgIGludCBuaWRsZV9kZW47CQkvKiBBdmVyYWdlIG51bWJlciBvZiBpZGxpbmcgcHJvY2Vzc2VzLAorCQkJCSAgIGRlbm9taW5hdG9yLiAgKi8KK30gdGRfdGFfc3RhdHNfdDsKKworCisvKiBTaW5jZSBTdW4ncyBsaWJyYXJ5IGlzIGJhc2VkIG9uIFNvbGFyaXMgdGhyZWFkcyB3ZSBoYXZlIHRvIGRlZmluZSBhIGZldworICAgdHlwZXMgdG8gbWFwIHRoZW0gdG8gUE9TSVggdGhyZWFkcy4gICovCit0eXBlZGVmIHB0aHJlYWRfdCB0aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCB0aHJlYWRfa2V5X3Q7CisKKworLyogQ2FsbGJhY2sgZm9yIGl0ZXJhdGlvbiBvdmVyIHRocmVhZHMuICAqLwordHlwZWRlZiBpbnQgdGRfdGhyX2l0ZXJfZiAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKiwgdm9pZCAqKTsKKworLyogQ2FsbGJhY2sgZm9yIGl0ZXJhdGlvbiBvdmVyIHRocmVhZCBsb2NhbCBkYXRhLiAgKi8KK3R5cGVkZWYgaW50IHRkX2tleV9pdGVyX2YgKHRocmVhZF9rZXlfdCwgdm9pZCAoKikgKHZvaWQgKiksIHZvaWQgKik7CisKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZGVmaW5lZCBieSB0aGUgdXNlci4gICovCitzdHJ1Y3QgcHNfcHJvY2hhbmRsZTsKKworCisvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdGhyZWFkLiAgKi8KK3R5cGVkZWYgc3RydWN0IHRkX3RocmluZm8KK3sKKyAgdGRfdGhyYWdlbnRfdCAqdGlfdGFfcDsJCS8qIFByb2Nlc3MgaGFuZGxlLiAgKi8KKyAgdW5zaWduZWQgaW50IHRpX3VzZXJfZmxhZ3M7CQkvKiBVbnVzZWQuICAqLworICB0aHJlYWRfdCB0aV90aWQ7CQkJLyogVGhyZWFkIElEIHJldHVybmVkIGJ5CisJCQkJCSAgIHB0aHJlYWRfY3JlYXRlKCkuICAqLworICBjaGFyICp0aV90bHM7CQkJCS8qIFBvaW50ZXIgdG8gdGhyZWFkLWxvY2FsIGRhdGEuICAqLworICBwc2FkZHJfdCB0aV9zdGFydGZ1bmM7CQkvKiBTdGFydCBmdW5jdGlvbiBwYXNzZWQgdG8KKwkJCQkJICAgcHRocmVhZF9jcmVhdGUoKS4gICovCisgIHBzYWRkcl90IHRpX3N0a2Jhc2U7CQkJLyogQmFzZSBvZiB0aHJlYWQncyBzdGFjay4gICovCisgIGxvbmcgaW50IHRpX3N0a3NpemU7CQkJLyogU2l6ZSBvZiB0aHJlYWQncyBzdGFjay4gICovCisgIHBzYWRkcl90IHRpX3JvX2FyZWE7CQkJLyogVW51c2VkLiAgKi8KKyAgaW50IHRpX3JvX3NpemU7CQkJLyogVW51c2VkLiAgKi8KKyAgdGRfdGhyX3N0YXRlX2UgdGlfc3RhdGU7CQkvKiBUaHJlYWQgc3RhdGUuICAqLworICB1bnNpZ25lZCBjaGFyIHRpX2RiX3N1c3BlbmRlZDsJLyogTm9uemVybyBpZiBzdXNwZW5kZWQgYnkgZGVidWdnZXIuICovCisgIHRkX3Rocl90eXBlX2UgdGlfdHlwZTsJCS8qIFR5cGUgb2YgdGhlIHRocmVhZCAoc3lzdGVtIHZzCisJCQkJCSAgIHVzZXIgdGhyZWFkKS4gICovCisgIGludHB0cl90IHRpX3BjOwkJCS8qIFVudXNlZC4gICovCisgIGludHB0cl90IHRpX3NwOwkJCS8qIFVudXNlZC4gICovCisgIHNob3J0IGludCB0aV9mbGFnczsJCQkvKiBVbnVzZWQuICAqLworICBpbnQgdGlfcHJpOwkJCQkvKiBUaHJlYWQgcHJpb3JpdHkuICAqLworICBsd3BpZF90IHRpX2xpZDsJCQkvKiBLZXJuZWwgUElEIGZvciB0aGlzIHRocmVhZC4gICovCisgIHNpZ3NldF90IHRpX3NpZ21hc2s7CQkJLyogU2lnbmFsIG1hc2suICAqLworICB1bnNpZ25lZCBjaGFyIHRpX3RyYWNlbWU7CQkvKiBOb256ZXJvIGlmIGV2ZW50IHJlcG9ydGluZworCQkJCQkgICBlbmFibGVkLiAgKi8KKyAgdW5zaWduZWQgY2hhciB0aV9wcmVlbXB0ZmxhZzsJCS8qIFVudXNlZC4gICovCisgIHVuc2lnbmVkIGNoYXIgdGlfcGlyZWNmbGFnOwkJLyogVW51c2VkLiAgKi8KKyAgc2lnc2V0X3QgdGlfcGVuZGluZzsJCQkvKiBTZXQgb2YgcGVuZGluZyBzaWduYWxzLiAgKi8KKyAgdGRfdGhyX2V2ZW50c190IHRpX2V2ZW50czsJCS8qIFNldCBvZiBlbmFibGVkIGV2ZW50cy4gICovCit9IHRkX3RocmluZm9fdDsKKworCisKKy8qIFByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zLiAgKi8KKworLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIGRlYnVnIHN1cHBvcnQgbGlicmFyeS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfaW5pdCAodm9pZCk7CisKKy8qIEhpc3RvcmljYWwgcmVsaWN0LiAgU2hvdWxkIG5vdCBiZSB1c2VkIGFueW1vcmUuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX2xvZyAodm9pZCk7CisKKy8qIFJldHVybiBsaXN0IG9mIHN5bWJvbHMgdGhlIGxpYnJhcnkgY2FuIHJlcXVlc3QuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKip0ZF9zeW1ib2xfbGlzdCAodm9pZCk7CisKKy8qIEdlbmVyYXRlIG5ldyB0aHJlYWQgZGVidWcgbGlicmFyeSBoYW5kbGUgZm9yIHByb2Nlc3MgUFMuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX25ldyAoc3RydWN0IHBzX3Byb2NoYW5kbGUgKl9fcHMsIHRkX3RocmFnZW50X3QgKipfX3RhKTsKKworLyogRnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZGVsZXRlICh0ZF90aHJhZ2VudF90ICpfX3RhKTsKKworLyogR2V0IG51bWJlciBvZiBjdXJyZW50bHkgcnVubmluZyB0aHJlYWRzIGluIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9nZXRfbnRocmVhZHMgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIGludCAqX19ucCk7CisKKy8qIFJldHVybiBwcm9jZXNzIGhhbmRsZSBwYXNzZWQgaW4gYHRkX3RhX25ldycgZm9yIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoCisgICBUQS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZ2V0X3BoIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJICAgICAgc3RydWN0IHBzX3Byb2NoYW5kbGUgKipfX3BoKTsKKworLyogTWFwIHRocmVhZCBsaWJyYXJ5IGhhbmRsZSBQVCB0byB0aHJlYWQgZGVidWcgbGlicmFyeSBoYW5kbGUgZm9yIHByb2Nlc3MKKyAgIGFzc29jaWF0ZWQgd2l0aCBUQSBhbmQgc3RvcmUgcmVzdWx0IGluICpUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfbWFwX2lkMnRociAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwgcHRocmVhZF90IF9fcHQsCisJCQkJICB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKy8qIE1hcCBwcm9jZXNzIElEIExXUElEIHRvIHRocmVhZCBkZWJ1ZyBsaWJyYXJ5IGhhbmRsZSBmb3IgcHJvY2VzcworICAgYXNzb2NpYXRlZCB3aXRoIFRBIGFuZCBzdG9yZSByZXN1bHQgaW4gKlRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9tYXBfbHdwMnRociAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwgbHdwaWRfdCBfX2x3cGlkLAorCQkJCSAgIHRkX3RocmhhbmRsZV90ICpfX3RoKTsKKworCisvKiBDYWxsIGZvciBlYWNoIHRocmVhZCBpbiBhIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICAgQ0FMTEJBQ0suICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX3Rocl9pdGVyIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCXRkX3Rocl9pdGVyX2YgKl9fY2FsbGJhY2ssIHZvaWQgKl9fY2JkYXRhX3AsCisJCQkJdGRfdGhyX3N0YXRlX2UgX19zdGF0ZSwgaW50IF9fdGlfcHJpLAorCQkJCXNpZ3NldF90ICpfX3RpX3NpZ21hc2tfcCwKKwkJCQl1bnNpZ25lZCBpbnQgX190aV91c2VyX2ZsYWdzKTsKKworLyogQ2FsbCBmb3IgZWFjaCBkZWZpbmVkIHRocmVhZCBsb2NhbCBkYXRhIGVudHJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbiBLSS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfdHNkX2l0ZXIgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIHRkX2tleV9pdGVyX2YgKl9fa2ksCisJCQkJdm9pZCAqX19wKTsKKworCisvKiBHZXQgZXZlbnQgYWRkcmVzcyBmb3IgRVZFTlQuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX2V2ZW50X2FkZHIgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsCisJCQkJICB0ZF9ldmVudF9lIF9fZXZlbnQsIHRkX25vdGlmeV90ICpfX3B0cik7CisKKy8qIEVuYWJsZSBFVkVOVCBpbiBnbG9iYWwgbWFzay4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfc2V0X2V2ZW50IChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCSB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBEaXNhYmxlIEVWRU5UIGluIGdsb2JhbCBtYXNrLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9jbGVhcl9ldmVudCAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwKKwkJCQkgICB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgbGFzdCBldmVudC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGFfZXZlbnRfZ2V0bXNnIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhLAorCQkJCSAgICB0ZF9ldmVudF9tc2dfdCAqX19tc2cpOworCisKKy8qIFNldCBzdWdnZXN0ZWQgY29uY3VycmVuY3kgbGV2ZWwgZm9yIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9zZXRjb25jdXJyZW5jeSAoY29uc3QgdGRfdGhyYWdlbnRfdCAqX190YSwgaW50IF9fbGV2ZWwpOworCisKKy8qIEVuYWJsZSBjb2xsZWN0aW5nIHN0YXRpc3RpY3MgZm9yIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9lbmFibGVfc3RhdHMgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsIGludCBfX2VuYWJsZSk7CisKKy8qIFJlc2V0IHN0YXRpc3RpY3MuICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3RhX3Jlc2V0X3N0YXRzIChjb25zdCB0ZF90aHJhZ2VudF90ICpfX3RhKTsKKworLyogUmV0cmlldmUgc3RhdGlzdGljcyBmcm9tIHByb2Nlc3MgYXNzb2NpYXRlZCB3aXRoIFRBLiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90YV9nZXRfc3RhdHMgKGNvbnN0IHRkX3RocmFnZW50X3QgKl9fdGEsCisJCQkJIHRkX3RhX3N0YXRzX3QgKl9fc3RhdHNwKTsKKworCisvKiBWYWxpZGF0ZSB0aGF0IFRIIGlzIGEgdGhyZWFkIGhhbmRsZS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3ZhbGlkYXRlIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKy8qIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXRfaW5mbyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJIHRkX3RocmluZm9fdCAqX19pbmZvcCk7CisKKy8qIFJldHJpZXZlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXRmcHJlZ3MgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgcHJmcHJlZ3NldF90ICpfX3JlZ3NldCk7CisKKy8qIFJldHJpZXZlIGdlbmVyYWwgcmVnaXN0ZXIgY29udGVudHMgb2YgcHJvY2VzcyBydW5uaW5nIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2dldGdyZWdzIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgcHJncmVnc2V0X3QgX19ncmVncyk7CisKKy8qIFJldHJpZXZlIGV4dGVuZGVkIHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9nZXR4cmVncyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsIHZvaWQgKl9feHJlZ3MpOworCisvKiBHZXQgc2l6ZSBvZiBleHRlbmRlZCByZWdpc3RlciBzZXQgb2YgcHJvY2VzcyBydW5uaW5nIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2dldHhyZWdzaXplIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwgaW50ICpfX3NpemVwKTsKKworLyogU2V0IGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXRmcHJlZ3MgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgY29uc3QgcHJmcHJlZ3NldF90ICpfX2ZwcmVncyk7CisKKy8qIFNldCBnZW5lcmFsIHJlZ2lzdGVyIGNvbnRlbnRzIG9mIHByb2Nlc3MgcnVubmluZyB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9zZXRncmVncyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJIHByZ3JlZ3NldF90IF9fZ3JlZ3MpOworCisvKiBTZXQgZXh0ZW5kZWQgcmVnaXN0ZXIgY29udGVudHMgb2YgcHJvY2VzcyBydW5uaW5nIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldHhyZWdzIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwKKwkJCQkgY29uc3Qgdm9pZCAqX19hZGRyKTsKKworCisvKiBHZXQgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gbW9kdWxlJ3MgVExTIHN0b3JhZ2UgYXJlYSBmb3IgdGhlIGdpdmVuIHRocmVhZC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3Rsc2Jhc2UgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCXVuc2lnbmVkIGxvbmcgaW50IF9fbW9kaWQsCisJCQkJcHNhZGRyX3QgKl9fYmFzZSk7CisKKy8qIEdldCBhZGRyZXNzIG9mIHRocmVhZCBsb2NhbCB2YXJpYWJsZS4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3Rsc19nZXRfYWRkciAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICAgICBwc2FkZHJfdCBfX21hcF9hZGRyZXNzLCBzaXplX3QgX19vZmZzZXQsCisJCQkJICAgICBwc2FkZHJfdCAqX19hZGRyZXNzKTsKKworCisvKiBFbmFibGUgcmVwb3J0aW5nIGZvciBFVkVOVCBmb3IgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfZXZlbnRfZW5hYmxlIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCwgaW50IF9fZXZlbnQpOworCisvKiBFbmFibGUgRVZFTlQgZm9yIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldF9ldmVudCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICB0ZF90aHJfZXZlbnRzX3QgKl9fZXZlbnQpOworCisvKiBEaXNhYmxlIEVWRU5UIGZvciB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9jbGVhcl9ldmVudCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICAgIHRkX3Rocl9ldmVudHNfdCAqX19ldmVudCk7CisKKy8qIEdldCBldmVudCBtZXNzYWdlIGZvciB0aHJlYWQgVEguICAqLworZXh0ZXJuIHRkX2Vycl9lIHRkX3Rocl9ldmVudF9nZXRtc2cgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgICAgdGRfZXZlbnRfbXNnX3QgKl9fbXNnKTsKKworCisvKiBTZXQgcHJpb3JpdHkgb2YgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfc2V0cHJpbyAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsIGludCBfX3ByaW8pOworCisKKy8qIFNldCBwZW5kaW5nIHNpZ25hbHMgZm9yIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3NldHNpZ3BlbmRpbmcgKGNvbnN0IHRkX3RocmhhbmRsZV90ICpfX3RoLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgX19uLCBjb25zdCBzaWdzZXRfdCAqX19zcyk7CisKKy8qIFNldCBzaWduYWwgbWFzayBmb3IgdGhyZWFkIFRILiAgKi8KK2V4dGVybiB0ZF9lcnJfZSB0ZF90aHJfc2lnc2V0bWFzayAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkJICAgY29uc3Qgc2lnc2V0X3QgKl9fc3MpOworCisKKy8qIFJldHVybiB0aHJlYWQgbG9jYWwgZGF0YSBhc3NvY2lhdGVkIHdpdGgga2V5IFRLIGluIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX3RzZCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgsCisJCQkgICAgY29uc3QgdGhyZWFkX2tleV90IF9fdGssIHZvaWQgKipfX2RhdGEpOworCisKKy8qIFN1c3BlbmQgZXhlY3V0aW9uIG9mIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2Ric3VzcGVuZCAoY29uc3QgdGRfdGhyaGFuZGxlX3QgKl9fdGgpOworCisvKiBSZXN1bWUgZXhlY3V0aW9uIG9mIHRocmVhZCBUSC4gICovCitleHRlcm4gdGRfZXJyX2UgdGRfdGhyX2RicmVzdW1lIChjb25zdCB0ZF90aHJoYW5kbGVfdCAqX190aCk7CisKKyNlbmRpZgkvKiB0aHJlYWRfZGIuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90aWMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxMDM5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGljLmgKQEAgLTAsMCArMSwzMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBhbmQ6IFRob21hcyBFLiBEaWNrZXkgMTk5NiBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICRJZDogdGljLmgsdiAxLjYyIDIwMDcvMDgvMTEgMTY6MTI6NDMgdG9tIEV4cCAkCisgKgl0aWMuaCAtIEdsb2JhbCB2YXJpYWJsZXMgYW5kIHN0cnVjdHVyZXMgZm9yIHRoZSB0ZXJtaW5mbworICoJCQljb21waWxlci4KKyAqLworCisjaWZuZGVmIF9fVElDX0gKKyNkZWZpbmUgX19USUNfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4JLyogZm9yIHRoZSBfdHJhY2VmKCkgcHJvdG90eXBlLCBFUlIvT0ssIGJvb2wgZGVmcyAqLworCisvKgorKiogVGhlIGZvcm1hdCBvZiBjb21waWxlZCB0ZXJtaW5mbyBmaWxlcyBpcyBhcyBmb2xsb3dzOgorKioKKyoqCQlIZWFkZXIgKDEyIGJ5dGVzKSwgY29udGFpbmluZyBpbmZvcm1hdGlvbiBnaXZlbiBiZWxvdworKioJCU5hbWVzIFNlY3Rpb24sIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSB0ZXJtaW5hbAorKioJCUJvb2xlYW4gU2VjdGlvbiwgY29udGFpbmluZyB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUKKyoqCQkJCWJvb2xlYW4gY2FwYWJpbGl0aWVzCisqKgkJCQlBIG51bGwgYnl0ZSBtYXkgYmUgaW5zZXJ0ZWQgaGVyZSB0byBtYWtlCisqKgkJCQlzdXJlIHRoYXQgdGhlIE51bWJlciBTZWN0aW9uIGJlZ2lucyBvbiBhbgorKioJCQkJZXZlbiB3b3JkIGJvdW5kYXJ5LgorKioJCU51bWJlciBTZWN0aW9uLCBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBudW1lcmljCisqKgkJCQljYXBhYmlsaXRpZXMsIGVhY2ggYXMgYSBzaG9ydCBpbnRlZ2VyCisqKgkJU3RyaW5nIFNlY3Rpb24sIGNvbnRhaW5pbmcgc2hvcnQgaW50ZWdlciBvZmZzZXRzIGludG8gdGhlCisqKgkJCQlTdHJpbmcgVGFibGUsIG9uZSBwZXIgc3RyaW5nIGNhcGFiaWxpdHkKKyoqCQlTdHJpbmcgVGFibGUsIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcKKyoqCQkJCWNhcGFiaWxpdGllcy4KKyoqCisqKglOT1RFIHRoYXQgYWxsIHNob3J0IGludGVnZXJzIGluIHRoZSBmaWxlIGFyZSBzdG9yZWQgdXNpbmcgVkFYL1BEUC1zdHlsZQorKioJYnl0ZS1vcmRlciwgaS5lLiwgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdC4KKyoqCisqKglUaGVyZSBpcyBubyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBoZXJlIGJlY2F1c2UgaXQgd291bGQgb25seSBjb25mdXNlCisqKgltYXR0ZXJzLiAgVGVybWluZm8gZm9ybWF0IGlzIGEgcmF3IGJ5dGUgbGF5b3V0LCBub3QgYSBzdHJ1Y3R1cmUKKyoqCWR1bXAuICBJZiB5b3UgaGFwcGVuIHRvIGJlIG9uIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lIHdpdGggMTYtYml0CisqKglzaG9ydHMgdGhhdCByZXF1aXJlcyBubyBwYWRkaW5nIGJldHdlZW4gc2hvcnQgbWVtYmVycyBpbiBhIHN0cnVjdCwKKyoqCXRoZW4gdGhlcmUgaXMgYSBuYXR1cmFsIEMgc3RydWN0dXJlIHRoYXQgY2FwdHVyZXMgdGhlIGhlYWRlciwgYnV0CisqKglub3QgdmVyeSBoZWxwZnVsbHkuCisqLworCisjZGVmaW5lIE1BR0lDCQkwNDMyCS8qIGZpcnN0IHR3byBieXRlcyBvZiBhIGNvbXBpbGVkIGVudHJ5ICovCisKKyN1bmRlZiAgQllURQorI2RlZmluZSBCWVRFKHAsbikJKHVuc2lnbmVkIGNoYXIpKChwKVtuXSkKKworI2RlZmluZSBJU19ORUcxKHApCSgoQllURShwLDApID09IDAzNzcpICYmIChCWVRFKHAsMSkgPT0gMDM3NykpCisjZGVmaW5lIElTX05FRzIocCkJKChCWVRFKHAsMCkgPT0gMDM3NikgJiYgKEJZVEUocCwxKSA9PSAwMzc3KSkKKyNkZWZpbmUgTE9XX01TQihwKQkoQllURShwLDApICsgMjU2KkJZVEUocCwxKSkKKworI2RlZmluZSBJU19USUNfTUFHSUMocCkJKExPV19NU0IocCkgPT0gTUFHSUMpCisKKy8qCisgKiBUaGUgIm1heGltdW0iIGhlcmUgaXMgbWlzbGVhZGluZzsgWFNJIGd1YXJhbnRlZXMgbWluaW11bSB2YWx1ZXMsIHdoaWNoIGEKKyAqIGdpdmVuIGltcGxlbWVudGF0aW9uIG1heSBleGNlZWQuCisgKi8KKyNkZWZpbmUgTUFYX05BTUVfU0laRQk1MTIJLyogbWF4aW11bSBsZWdhbCBuYW1lIGZpZWxkIHNpemUgKFhTSToxMjcpICovCisjZGVmaW5lIE1BWF9FTlRSWV9TSVpFCTQwOTYJLyogbWF4aW11bSBsZWdhbCBlbnRyeSBzaXplICovCisKKy8qCisgKiBUaGUgbWF4aW11bSBzaXplIG9mIGluZGl2aWR1YWwgbmFtZSBvciBhbGlhcyBpcyBndWFyYW50ZWVkIGluIFhTSSB0byBiZSBhdAorICogbGVhc3QgMTQsIHNpbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG9sZGVyIGZpbGVuYW1lIGxlbmd0aHMuICBOZXdlcgorICogc3lzdGVtcyBhbGxvdyBsb25nZXIgYWxpYXNlcywgdGhvdWdoIG5vdCBtYW55IHRlcm1pbmFsIGRlc2NyaXB0aW9ucyBhcmUKKyAqIHdyaXR0ZW4gdG8gdXNlIHRoZW0uICBUaGUgTUFYX0FMSUFTIHN5bWJvbCBpcyB1c2VkIGZvciB3YXJuaW5ncy4KKyAqLworI2lmIEhBVkVfTE9OR19GSUxFX05BTUVTCisjZGVmaW5lIE1BWF9BTElBUwkzMgkvKiBzbWFsbGVyIHRoYW4gUE9TSVggbWluaW11bSBmb3IgUEFUSF9NQVggKi8KKyNlbHNlCisjZGVmaW5lIE1BWF9BTElBUwkxNAkvKiBTVnIzIGZpbGVuYW1lIGxlbmd0aCAqLworI2VuZGlmCisKKy8qIGxvY2F0aW9uIG9mIHVzZXIncyBwZXJzb25hbCBpbmZvIGRpcmVjdG9yeSAqLworI2RlZmluZSBQUklWQVRFX0lORk8JIiVzLy50ZXJtaW5mbyIJLyogcGx1ZyBnZXRlbnYoIkhPTUUiKSBpbnRvICVzICovCisKKy8qCisgKiBTb21lIHRyYWNlcyBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCB2aWEgdGljJ3MgdmVyYm9zZSBvcHRpb24gKGFuZCBzaW1pbGFyIGluCisgKiBpbmZvY21wIGFuZCB0b2UpIHJhdGhlciB0aGFuIHRoZSAndHJhY2UoKScgZnVuY3Rpb24uICBTbyB3ZSB1c2UgdGhlIGJpdHMKKyAqIGFib3ZlIHRoZSBub3JtYWwgdHJhY2UoKSBwYXJhbWV0ZXIgYXMgYSBkZWJ1Zy1sZXZlbC4KKyAqLworCisjZGVmaW5lIE1BWF9ERUJVR19MRVZFTCAxNQorI2RlZmluZSBERUJVR19MRVZFTChuKQkoKG4pIDw8IFRSQUNFX1NISUZUKQorCisjZGVmaW5lIHNldF90cmFjZV9sZXZlbChuKSBcCisJX25jX3RyYWNpbmcgJj0gREVCVUdfTEVWRUwoTUFYX0RFQlVHX0xFVkVMKSwgXAorCV9uY190cmFjaW5nIHw9IERFQlVHX0xFVkVMKG4pCisKKyNpZmRlZiBUUkFDRQorI2RlZmluZSBERUJVRyhuLCBhKQlpZiAoX25jX3RyYWNpbmcgPj0gREVCVUdfTEVWRUwobikpIF90cmFjZWYgYQorI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYSkJLypub3RoaW5nKi8KKyNlbmRpZgorCitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKHVuc2lnbmVkKSBfbmNfdHJhY2luZzsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfdHJhY2VmIChjaGFyICosIC4uLikgR0NDX1BSSU5URkxJS0UoMSwyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIF9uY192aXNidWYgKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfdmlzYnVmMiAoaW50LCBjb25zdCBjaGFyICopOworCisvKgorICogVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiB0b2tlbnMgcmV0dXJuZWQgYnkgdGhlIHNjYW5uZXIuICBUaGUgZmlyc3QKKyAqIHRocmVlIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGhhc2ggdGFibGUgb2YgY2FwYWJpbGl0eSBuYW1lcy4gIFRoZSBzY2FubmVyCisgKiByZXR1cm5zIG9uZSBvZiB0aGVzZSB2YWx1ZXMgYWZ0ZXIgbG9hZGluZyB0aGUgc3BlY2lmaWNzIGludG8gdGhlIGdsb2JhbAorICogc3RydWN0dXJlIGN1cnJfdG9rZW4uCisgKi8KKworI2RlZmluZSBCT09MRUFOIDAJCS8qIEJvb2xlYW4gY2FwYWJpbGl0eSAqLworI2RlZmluZSBOVU1CRVIgMQkJLyogTnVtZXJpYyBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFNUUklORyAyCQkvKiBTdHJpbmctdmFsdWVkIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgQ0FOQ0VMIDMJCS8qIENhcGFiaWxpdHkgdG8gYmUgY2FuY2VsbGVkIGluIGZvbGxvd2luZyB0YydzICovCisjZGVmaW5lIE5BTUVTICA0CQkvKiBUaGUgbmFtZXMgZm9yIGEgdGVybWluYWwgdHlwZSAqLworI2RlZmluZSBVTkRFRiAgNQkJLyogVW5kZWZpbmVkICovCisKKyNkZWZpbmUgTk9fUFVTSEJBQ0sJLTEJLyogdXNlZCBpbiBwdXNodHlwZSB0byBpbmRpY2F0ZSBubyBwdXNoYmFjayAqLworCisJLyoKKwkgKglUaGUgZ2xvYmFsIHN0cnVjdHVyZSBpbiB3aGljaCB0aGUgc3BlY2lmaWMgcGFydHMgb2YgYQorCSAqCXNjYW5uZWQgdG9rZW4gYXJlIHJldHVybmVkLgorCSAqCisJICovCisKK3N0cnVjdCB0b2tlbgoreworCWNoYXIJKnRrX25hbWU7CQkvKiBuYW1lIG9mIGNhcGFiaWxpdHkgKi8KKwlpbnQJdGtfdmFsbnVtYmVyOwkvKiB2YWx1ZSBvZiBjYXBhYmlsaXR5IChpZiBhIG51bWJlcikgKi8KKwljaGFyCSp0a192YWxzdHJpbmc7CS8qIHZhbHVlIG9mIGNhcGFiaWxpdHkgKGlmIGEgc3RyaW5nKSAqLworfTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihzdHJ1Y3QgdG9rZW4pCV9uY19jdXJyX3Rva2VuOworCisJLyoKKwkgKiBPZmZzZXRzIHRvIHN0cmluZyBjYXBhYmlsaXRpZXMsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25rZXkKKwkgKiBjb2Rlcy4KKwkgKi8KK3N0cnVjdCB0aW5mb19ma2V5cyB7CisJdW5zaWduZWQgb2Zmc2V0OworCWNodHlwZSBjb2RlOworCX07CisKKyNpZglCUk9LRU5fTElOS0VSCisKKyNkZWZpbmUJX25jX3RpbmZvX2ZrZXlzCV9uY190aW5mb19ma2V5c2YoKQorZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IHN0cnVjdCB0aW5mb19ma2V5cyAqKSBfbmNfdGluZm9fZmtleXNmICh2b2lkKTsKKworI2Vsc2UKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihjb25zdCBzdHJ1Y3QgdGluZm9fZmtleXMpIF9uY190aW5mb19ma2V5c1tdOworCisjZW5kaWYKKworCS8qCisJICogVGhlIGZpbGUgY29tcF9jYXB0YWIuYyBjb250YWlucyBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLCBvbmUKKwkgKiBwZXIgcG9zc2libGUgY2FwYWJpbGl0eS4gIFRoZXNlIGFyZSBpbmRleGVkIGJ5IGEgaGFzaCB0YWJsZSBhcnJheSBvZgorCSAqIHBvaW50ZXJzIHRvIHRoZSBzYW1lIHN0cnVjdHVyZXMgZm9yIHVzZSBieSB0aGUgcGFyc2VyLgorCSAqLworCitzdHJ1Y3QgbmFtZV90YWJsZV9lbnRyeQoreworCWNvbnN0IGNoYXIgKm50ZV9uYW1lOwkvKiBuYW1lIHRvIGhhc2ggb24gKi8KKwlpbnQJbnRlX3R5cGU7CS8qIEJPT0xFQU4sIE5VTUJFUiBvciBTVFJJTkcgKi8KKwlzaG9ydAludGVfaW5kZXg7CS8qIGluZGV4IG9mIGFzc29jaWF0ZWQgdmFyaWFibGUgaW4gaXRzIGFycmF5ICovCisJc2hvcnQJbnRlX2xpbms7CS8qIGluZGV4IGluIHRhYmxlIG9mIG5leHQgaGFzaCwgb3IgLTEgKi8KK307CisKK3N0cnVjdCBhbGlhcworeworCWNvbnN0IGNoYXIJKmZyb207CisJY29uc3QgY2hhcgkqdG87CisJY29uc3QgY2hhcgkqc291cmNlOworfTsKKworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IHN0cnVjdCBuYW1lX3RhYmxlX2VudHJ5ICopIF9uY19nZXRfdGFibGUgKGJvb2wpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IHNob3J0ICopIF9uY19nZXRfaGFzaF90YWJsZSAoYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3Qgc3RydWN0IGFsaWFzICopIF9uY19nZXRfYWxpYXNfdGFibGUgKGJvb2wpOworCisjZGVmaW5lIE5PVEZPVU5ECSgoc3RydWN0IG5hbWVfdGFibGVfZW50cnkgKikgMCkKKworLyogb3V0LW9mLWJhbmQgdmFsdWVzIGZvciByZXByZXNlbnRpbmcgYWJzZW50IGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBBQlNFTlRfQk9PTEVBTgkJKChzaWduZWQgY2hhciktMSkJLyogMjU1ICovCisjZGVmaW5lIEFCU0VOVF9OVU1FUklDCQkoLTEpCisjZGVmaW5lIEFCU0VOVF9TVFJJTkcJCShjaGFyICopMAorCisvKiBvdXQtb2YtYmFuZCB2YWx1ZXMgZm9yIHJlcHJlc2VudGluZyBjYW5jZWxzICovCisjZGVmaW5lIENBTkNFTExFRF9CT09MRUFOCSgoc2lnbmVkIGNoYXIpLTIpCS8qIDI1NCAqLworI2RlZmluZSBDQU5DRUxMRURfTlVNRVJJQwkoLTIpCisjZGVmaW5lIENBTkNFTExFRF9TVFJJTkcJKGNoYXIgKikoLTEpCisKKyNkZWZpbmUgVkFMSURfQk9PTEVBTihzKSAoKHVuc2lnbmVkIGNoYXIpKHMpIDw9IDEpIC8qIHJlamVjdCAiLTEiICovCisjZGVmaW5lIFZBTElEX05VTUVSSUMocykgKChzKSA+PSAwKQorI2RlZmluZSBWQUxJRF9TVFJJTkcocykgICgocykgIT0gQ0FOQ0VMTEVEX1NUUklORyAmJiAocykgIT0gQUJTRU5UX1NUUklORykKKworLyogdGVybWNhcCBlbnRyaWVzIGxvbmdlciB0aGFuIHRoaXMgbWF5IGJyZWFrIG9sZCBiaW5hcmllcyAqLworI2RlZmluZSBNQVhfVEVSTUNBUF9MRU5HVEgJMTAyMworCisvKiB0aGlzIGlzIGEgZG9jdW1lbnRlZCBsaW1pdGF0aW9uIG9mIHRlcm1pbmZvICovCisjZGVmaW5lIE1BWF9URVJNSU5GT19MRU5HVEgJNDA5NgorCisjaWZuZGVmIFRFUk1JTkZPCisjZGVmaW5lIFRFUk1JTkZPICIvdXNyL3NoYXJlL3Rlcm1pbmZvIgorI2VuZGlmCisKKy8qIGFjY2Vzcy5jICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQodW5zaWduZWQpIF9uY19wYXRobGFzdCAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChib29sKSBfbmNfaXNfYWJzX3BhdGggKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoYm9vbCkgX25jX2lzX2Rpcl9wYXRoIChjb25zdCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGJvb2wpIF9uY19pc19maWxlX3BhdGggKGNvbnN0IGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfYmFzZW5hbWUgKGNoYXIgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY2hhciAqKSBfbmNfcm9vdG5hbWUgKGNoYXIgKik7CisKKy8qIGNvbXBfaGFzaC5jOiBuYW1lIGxvb2t1cCAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHN0cnVjdCBuYW1lX3RhYmxlX2VudHJ5IGNvbnN0ICopIF9uY19maW5kX2VudHJ5CisJKGNvbnN0IGNoYXIgKiwgY29uc3Qgc2hvcnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoc3RydWN0IG5hbWVfdGFibGVfZW50cnkgY29uc3QgKikgX25jX2ZpbmRfdHlwZV9lbnRyeQorCShjb25zdCBjaGFyICosIGludCwgY29uc3Qgc3RydWN0IG5hbWVfdGFibGVfZW50cnkgKik7CisKKy8qIGNvbXBfc2Nhbi5jOiBsZXhpY2FsIGFuYWx5c2lzICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSAgX25jX2dldF90b2tlbiAoYm9vbCk7CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3BhbmljX21vZGUgKGNoYXIpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19wdXNoX3Rva2VuIChpbnQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19yZXNldF9pbnB1dCAoRklMRSAqLCBjaGFyICopOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIF9uY19jdXJyX2NvbDsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBfbmNfY3Vycl9saW5lOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihpbnQpIF9uY19zeW50YXg7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGxvbmcpIF9uY19jb21tZW50X2VuZDsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIobG9uZykgX25jX2NvbW1lbnRfc3RhcnQ7CitleHRlcm4gTkNVUlNFU19FWFBPUlRfVkFSKGxvbmcpIF9uY19jdXJyX2ZpbGVfcG9zOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUX1ZBUihsb25nKSBfbmNfc3RhcnRfbGluZTsKKyNkZWZpbmUgU1lOX1RFUk1JTkZPCTAKKyNkZWZpbmUgU1lOX1RFUk1DQVAJMQorCisvKiBjb21wX2Vycm9yLmM6IHdhcm5pbmcgJiBhYm9ydCBtZXNzYWdlcyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNvbnN0IGNoYXIgKikgX25jX2dldF9zb3VyY2UgKHZvaWQpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19lcnJfYWJvcnQgKGNvbnN0IGNoYXIgKmNvbnN0LC4uLikgR0NDX1BSSU5URkxJS0UoMSwyKSBHQ0NfTk9SRVRVUk47CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX2dldF90eXBlIChjaGFyICpuYW1lKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfc2V0X3NvdXJjZSAoY29uc3QgY2hhciAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19zZXRfdHlwZSAoY29uc3QgY2hhciAqY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKHZvaWQpIF9uY19zeXNlcnJfYWJvcnQgKGNvbnN0IGNoYXIgKmNvbnN0LC4uLikgR0NDX1BSSU5URkxJS0UoMSwyKSBHQ0NfTk9SRVRVUk47CitleHRlcm4gTkNVUlNFU19FWFBPUlQodm9pZCkgX25jX3dhcm5pbmcgKGNvbnN0IGNoYXIgKmNvbnN0LC4uLikgR0NDX1BSSU5URkxJS0UoMSwyKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoYm9vbCkgX25jX3N1cHByZXNzX3dhcm5pbmdzOworCisvKiBjb21wX2V4cGFuZC5jOiBleHBhbmQgc3RyaW5nIGludG8gcmVhZGFibGUgZm9ybSAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX3RpY19leHBhbmQgKGNvbnN0IGNoYXIgKiwgYm9vbCwgaW50KTsKKworLyogY29tcF9zY2FuLmM6IGRlY29kZSBzdHJpbmcgZnJvbSByZWFkYWJsZSBmb3JtICovCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfdHJhbnNfc3RyaW5nIChjaGFyICosIGNoYXIgKik7CisKKy8qIGNhcHRvaW5mby5jOiBjYXBhYmlsaXR5IGNvbnZlcnNpb24gKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjaGFyICopIF9uY19jYXB0b2luZm8gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgY29uc3QpOworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX2luZm90b2NhcCAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCBjb25zdCk7CisKKy8qIGhvbWVfdGVybWluZm8uYyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGNoYXIgKikgX25jX2hvbWVfdGVybWluZm8gKHZvaWQpOworCisvKiBsaWJfdHBhcm0uYyAqLworI2RlZmluZSBOVU1fUEFSTSA5CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBfbmNfdHBhcm1fZXJyOworCitleHRlcm4gTkNVUlNFU19FWFBPUlQoaW50KSBfbmNfdHBhcm1fYW5hbHl6ZShjb25zdCBjaGFyICosIGNoYXIgKiosIGludCAqKTsKKworLyogbGliX3RwdXRzLmMgKi8KK2V4dGVybiBOQ1VSU0VTX0VYUE9SVF9WQVIoaW50KSBfbmNfbnVsbHNfc2VudDsJCS8qIEFkZCBvbmUgZm9yIGV2ZXJ5IG51bGwgc2VudCAqLworCisvKiBjb21wX21haW4uYzogY29tcGlsZXIgbWFpbiAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBfbmNfcHJvZ25hbWU7CisKKy8qIGRiX2l0ZXJhdG9yLmMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZGJkVElDID0gMCwKKyNpZiBVU0VfREFUQUJBU0UKKyAgICBkYmRFbnZPbmNlLAorICAgIGRiZEhvbWUsCisgICAgZGJkRW52TGlzdCwKKyAgICBkYmRDZmdMaXN0LAorICAgIGRiZENmZ09uY2UsCisjZW5kaWYKKyNpZiBVU0VfVEVSTUNBUAorICAgIGRiZEVudk9uY2UyLAorICAgIGRiZEVudkxpc3QyLAorICAgIGRiZENmZ0xpc3QyLAorI2VuZGlmCisgICAgZGJkTEFTVAorfSBEQkRJUlM7CisKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVChjb25zdCBjaGFyICopIF9uY19uZXh0X2RiKERCRElSUyAqLCBpbnQgKik7CitleHRlcm4gTkNVUlNFU19FWFBPUlQoY29uc3QgY2hhciAqKSBfbmNfdGljX2RpciAoY29uc3QgY2hhciAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfZmlyc3RfZGIoREJESVJTICosIGludCAqKTsKK2V4dGVybiBOQ1VSU0VTX0VYUE9SVCh2b2lkKSBfbmNfbGFzdF9kYih2b2lkKTsKKworLyogd3JpdGVfZW50cnkuYyAqLworZXh0ZXJuIE5DVVJTRVNfRVhQT1JUKGludCkgX25jX3RpY193cml0dGVuICh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVElDX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4Zjc5ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdGltZS5oCkBAIC0wLDAgKzEsNDIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OSwyMDAwLDIwMDEsMjAwMiwyMDAzLDIwMDYKKwlGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCUlTTyBDOTkgU3RhbmRhcmQ6IDcuMjMgRGF0ZSBhbmQgdGltZQk8dGltZS5oPgorICovCisKKyNpZm5kZWYJX1RJTUVfSAorCisjaWYgKCEgZGVmaW5lZCBfX25lZWRfdGltZV90ICYmICFkZWZpbmVkIF9fbmVlZF9jbG9ja190ICYmIFwKKyAgICAgISBkZWZpbmVkIF9fbmVlZF90aW1lc3BlYykKKyMgZGVmaW5lIF9USU1FX0gJMQorIyBpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKyNlbmRpZgorCisjaWZkZWYJX1RJTUVfSAorLyogR2V0IHNpemVfdCBhbmQgTlVMTCBmcm9tIDxzdGRkZWYuaD4uICAqLworIyBkZWZpbmUgX19uZWVkX3NpemVfdAorIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFRoaXMgZGVmaW5lcyBDTE9DS1NfUEVSX1NFQywgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3IgY2xvY2sKKyAgIHRpY2tzIHBlciBzZWNvbmQuICAqLworIyBpbmNsdWRlIDxiaXRzL3RpbWUuaD4KKworLyogVGhpcyBpcyB0aGUgb2Jzb2xldGUgUE9TSVguMS0xOTg4IG5hbWUgZm9yIHRoZSBzYW1lIGNvbnN0YW50LiAgKi8KKyMgaWYgIWRlZmluZWQgX19TVFJJQ1RfQU5TSV9fICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgIGlmbmRlZiBDTEtfVENLCisjICAgZGVmaW5lIENMS19UQ0sJQ0xPQ0tTX1BFUl9TRUMKKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiA8dGltZS5oPiBpbmNsdWRlZC4gICovCisKKyNpZiAhZGVmaW5lZCBfX2Nsb2NrX3RfZGVmaW5lZCAmJiAoZGVmaW5lZCBfVElNRV9IIHx8IGRlZmluZWQgX19uZWVkX2Nsb2NrX3QpCisjIGRlZmluZSBfX2Nsb2NrX3RfZGVmaW5lZAkxCisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFJldHVybmVkIGJ5IGBjbG9jaycuICAqLwordHlwZWRlZiBfX2Nsb2NrX3QgY2xvY2tfdDsKK19fRU5EX05BTUVTUEFDRV9TVEQKKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOIHx8IGRlZmluZWQgX19VU0VfUE9TSVggfHwgZGVmaW5lZCBfX1VTRV9NSVNDCitfX1VTSU5HX05BTUVTUEFDRV9TVEQoY2xvY2tfdCkKKyNlbmRpZgorCisjZW5kaWYgLyogY2xvY2tfdCBub3QgZGVmaW5lZCBhbmQgPHRpbWUuaD4gb3IgbmVlZCBjbG9ja190LiAgKi8KKyN1bmRlZglfX25lZWRfY2xvY2tfdAorCisjaWYgIWRlZmluZWQgX190aW1lX3RfZGVmaW5lZCAmJiAoZGVmaW5lZCBfVElNRV9IIHx8IGRlZmluZWQgX19uZWVkX3RpbWVfdCkKKyMgZGVmaW5lIF9fdGltZV90X2RlZmluZWQJMQorCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm5lZCBieSBgdGltZScuICAqLwordHlwZWRlZiBfX3RpbWVfdCB0aW1lX3Q7CitfX0VORF9OQU1FU1BBQ0VfU1RECisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9TVklECitfX1VTSU5HX05BTUVTUEFDRV9TVEQodGltZV90KQorI2VuZGlmCisKKyNlbmRpZiAvKiB0aW1lX3Qgbm90IGRlZmluZWQgYW5kIDx0aW1lLmg+IG9yIG5lZWQgdGltZV90LiAgKi8KKyN1bmRlZglfX25lZWRfdGltZV90CisKKyNpZiAhZGVmaW5lZCBfX2Nsb2NraWRfdF9kZWZpbmVkICYmIFwKKyAgICgoZGVmaW5lZCBfVElNRV9IICYmIGRlZmluZWQgX19VU0VfUE9TSVgxOTkzMDkpIHx8IGRlZmluZWQgX19uZWVkX2Nsb2NraWRfdCkKKyMgZGVmaW5lIF9fY2xvY2tpZF90X2RlZmluZWQJMQorCisjIGluY2x1ZGUgPGJpdHMvdHlwZXMuaD4KKworLyogQ2xvY2sgSUQgdXNlZCBpbiBjbG9jayBhbmQgdGltZXIgZnVuY3Rpb25zLiAgKi8KK3R5cGVkZWYgX19jbG9ja2lkX3QgY2xvY2tpZF90OworCisjZW5kaWYgLyogY2xvY2tpZF90IG5vdCBkZWZpbmVkIGFuZCA8dGltZS5oPiBvciBuZWVkIGNsb2NraWRfdC4gICovCisjdW5kZWYJX19jbG9ja2lkX3RpbWVfdAorCisjaWYgIWRlZmluZWQgX190aW1lcl90X2RlZmluZWQgJiYgXAorICAgICgoZGVmaW5lZCBfVElNRV9IICYmIGRlZmluZWQgX19VU0VfUE9TSVgxOTkzMDkpIHx8IGRlZmluZWQgX19uZWVkX3RpbWVyX3QpCisjIGRlZmluZSBfX3RpbWVyX3RfZGVmaW5lZAkxCisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisvKiBUaW1lciBJRCByZXR1cm5lZCBieSBgdGltZXJfY3JlYXRlJy4gICovCit0eXBlZGVmIF9fdGltZXJfdCB0aW1lcl90OworCisjZW5kaWYgLyogdGltZXJfdCBub3QgZGVmaW5lZCBhbmQgPHRpbWUuaD4gb3IgbmVlZCB0aW1lcl90LiAgKi8KKyN1bmRlZglfX25lZWRfdGltZXJfdAorCisKKyNpZiAhZGVmaW5lZCBfX3RpbWVzcGVjX2RlZmluZWQgJiYJCQkJXAorICAgICgoZGVmaW5lZCBfVElNRV9IICYmCQkJCQlcCisgICAgICAoZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOSB8fCBkZWZpbmVkIF9fVVNFX01JU0MpKSB8fAlcCisgICAgICBkZWZpbmVkIF9fbmVlZF90aW1lc3BlYykKKyMgZGVmaW5lIF9fdGltZXNwZWNfZGVmaW5lZAkxCisKKyMgaW5jbHVkZSA8Yml0cy90eXBlcy5oPgkvKiBUaGlzIGRlZmluZXMgX190aW1lX3QgZm9yIHVzLiAgKi8KKworLyogUE9TSVguMWIgc3RydWN0dXJlIGZvciBhIHRpbWUgdmFsdWUuICBUaGlzIGlzIGxpa2UgYSBgc3RydWN0IHRpbWV2YWwnIGJ1dAorICAgaGFzIG5hbm9zZWNvbmRzIGluc3RlYWQgb2YgbWljcm9zZWNvbmRzLiAgKi8KK3N0cnVjdCB0aW1lc3BlYworICB7CisgICAgX190aW1lX3QgdHZfc2VjOwkJLyogU2Vjb25kcy4gICovCisgICAgbG9uZyBpbnQgdHZfbnNlYzsJCS8qIE5hbm9zZWNvbmRzLiAgKi8KKyAgfTsKKworI2VuZGlmIC8qIHRpbWVzcGVjIG5vdCBkZWZpbmVkIGFuZCA8dGltZS5oPiBvciBuZWVkIHRpbWVzcGVjLiAgKi8KKyN1bmRlZglfX25lZWRfdGltZXNwZWMKKworCisjaWZkZWYJX1RJTUVfSAorX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBVc2VkIGJ5IG90aGVyIHRpbWUgZnVuY3Rpb25zLiAgKi8KK3N0cnVjdCB0bQoreworICBpbnQgdG1fc2VjOwkJCS8qIFNlY29uZHMuCVswLTYwXSAoMSBsZWFwIHNlY29uZCkgKi8KKyAgaW50IHRtX21pbjsJCQkvKiBNaW51dGVzLglbMC01OV0gKi8KKyAgaW50IHRtX2hvdXI7CQkJLyogSG91cnMuCVswLTIzXSAqLworICBpbnQgdG1fbWRheTsJCQkvKiBEYXkuCQlbMS0zMV0gKi8KKyAgaW50IHRtX21vbjsJCQkvKiBNb250aC4JWzAtMTFdICovCisgIGludCB0bV95ZWFyOwkJCS8qIFllYXIJLSAxOTAwLiAgKi8KKyAgaW50IHRtX3dkYXk7CQkJLyogRGF5IG9mIHdlZWsuCVswLTZdICovCisgIGludCB0bV95ZGF5OwkJCS8qIERheXMgaW4geWVhci5bMC0zNjVdCSovCisgIGludCB0bV9pc2RzdDsJCQkvKiBEU1QuCQlbLTEvMC8xXSovCisKKyNpZmRlZglfX1VTRV9CU0QKKyAgbG9uZyBpbnQgdG1fZ210b2ZmOwkJLyogU2Vjb25kcyBlYXN0IG9mIFVUQy4gICovCisgIF9fY29uc3QgY2hhciAqdG1fem9uZTsJLyogVGltZXpvbmUgYWJicmV2aWF0aW9uLiAgKi8KKyNlbHNlCisgIGxvbmcgaW50IF9fdG1fZ210b2ZmOwkJLyogU2Vjb25kcyBlYXN0IG9mIFVUQy4gICovCisgIF9fY29uc3QgY2hhciAqX190bV96b25lOwkvKiBUaW1lem9uZSBhYmJyZXZpYXRpb24uICAqLworI2VuZGlmCit9OworX19FTkRfTkFNRVNQQUNFX1NURAorI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKK19fVVNJTkdfTkFNRVNQQUNFX1NURCh0bSkKKyNlbmRpZgorCisKKyNpZmRlZiBfX1VTRV9QT1NJWDE5OTMwOQorLyogUE9TSVguMWIgc3RydWN0dXJlIGZvciB0aW1lciBzdGFydCB2YWx1ZXMgYW5kIGludGVydmFscy4gICovCitzdHJ1Y3QgaXRpbWVyc3BlYworICB7CisgICAgc3RydWN0IHRpbWVzcGVjIGl0X2ludGVydmFsOworICAgIHN0cnVjdCB0aW1lc3BlYyBpdF92YWx1ZTsKKyAgfTsKKworLyogV2UgY2FuIHVzZSBhIHNpbXBsZSBmb3J3YXJkIGRlY2xhcmF0aW9uLiAgKi8KK3N0cnVjdCBzaWdldmVudDsKKworI2VuZGlmCS8qIFBPU0lYLjFiICovCisKKyNpZmRlZiBfX1VTRV9YT1BFTjJLCisjIGlmbmRlZiBfX3BpZF90X2RlZmluZWQKK3R5cGVkZWYgX19waWRfdCBwaWRfdDsKKyMgIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogVGltZSB1c2VkIGJ5IHRoZSBwcm9ncmFtIHNvIGZhciAodXNlciB0aW1lICsgc3lzdGVtIHRpbWUpLgorICAgVGhlIHJlc3VsdCAvIENMT0NLU19QRVJfU0VDT05EIGlzIHByb2dyYW0gdGltZSBpbiBzZWNvbmRzLiAgKi8KK2V4dGVybiBjbG9ja190IGNsb2NrICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBhbmQgcHV0IGl0IGluICpUSU1FUiBpZiBUSU1FUiBpcyBub3QgTlVMTC4gICovCitleHRlcm4gdGltZV90IHRpbWUgKHRpbWVfdCAqX190aW1lcikgX19USFJPVzsKKworLyogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gVElNRTEgYW5kIFRJTUUwLiAgKi8KK2V4dGVybiBkb3VibGUgZGlmZnRpbWUgKHRpbWVfdCBfX3RpbWUxLCB0aW1lX3QgX190aW1lMCkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKy8qIFJldHVybiB0aGUgYHRpbWVfdCcgcmVwcmVzZW50YXRpb24gb2YgVFAgYW5kIG5vcm1hbGl6ZSBUUC4gICovCitleHRlcm4gdGltZV90IG1rdGltZSAoc3RydWN0IHRtICpfX3RwKSBfX1RIUk9XOworCisKKy8qIEZvcm1hdCBUUCBpbnRvIFMgYWNjb3JkaW5nIHRvIEZPUk1BVC4KKyAgIFdyaXRlIG5vIG1vcmUgdGhhbiBNQVhTSVpFIGNoYXJhY3RlcnMgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIDAgaWYgaXQgd291bGQgZXhjZWVkIE1BWFNJWkUuICAqLworZXh0ZXJuIHNpemVfdCBzdHJmdGltZSAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX21heHNpemUsCisJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQlfX2NvbnN0IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjIGlmZGVmIF9fVVNFX1hPUEVOCisvKiBQYXJzZSBTIGFjY29yZGluZyB0byBGT1JNQVQgYW5kIHN0b3JlIGJpbmFyeSB0aW1lIGluZm9ybWF0aW9uIGluIFRQLgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHVucGFyc2VkIGNoYXJhY3RlciBpbiBTLiAgKi8KK2V4dGVybiBjaGFyICpzdHJwdGltZSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgc3RydWN0IHRtICpfX3RwKQorICAgICBfX1RIUk9XOworIyBlbmRpZgorCisjIGlmZGVmIF9fVVNFX0dOVQorLyogU2ltaWxhciB0byB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSBidXQgdGFrZSB0aGUgaW5mb3JtYXRpb24gZnJvbQorICAgdGhlIHByb3ZpZGVkIGxvY2FsZSBhbmQgbm90IHRoZSBnbG9iYWwgbG9jYWxlLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCitleHRlcm4gc2l6ZV90IHN0cmZ0aW1lX2wgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgIF9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHAsCisJCQkgIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisKK2V4dGVybiBjaGFyICpzdHJwdGltZV9sIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLAorCQkJIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgc3RydWN0IHRtICpfX3RwLAorCQkJIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisjIGVuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gdGhlIGBzdHJ1Y3QgdG0nIHJlcHJlc2VudGF0aW9uIG9mICpUSU1FUgorICAgaW4gVW5pdmVyc2FsIENvb3JkaW5hdGVkIFRpbWUgKGFrYSBHcmVlbndpY2ggTWVhbiBUaW1lKS4gICovCitleHRlcm4gc3RydWN0IHRtICpnbXRpbWUgKF9fY29uc3QgdGltZV90ICpfX3RpbWVyKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGBzdHJ1Y3QgdG0nIHJlcHJlc2VudGF0aW9uCisgICBvZiAqVElNRVIgaW4gdGhlIGxvY2FsIHRpbWV6b25lLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZSAoX19jb25zdCB0aW1lX3QgKl9fdGltZXIpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFJldHVybiB0aGUgYHN0cnVjdCB0bScgcmVwcmVzZW50YXRpb24gb2YgKlRJTUVSIGluIFVUQywKKyAgIHVzaW5nICpUUCB0byBzdG9yZSB0aGUgcmVzdWx0LiAgKi8KK2V4dGVybiBzdHJ1Y3QgdG0gKmdtdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAorCQkJICAgIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIGBzdHJ1Y3QgdG0nIHJlcHJlc2VudGF0aW9uIG9mICpUSU1FUiBpbiBsb2NhbCB0aW1lLAorICAgdXNpbmcgKlRQIHRvIHN0b3JlIHRoZSByZXN1bHQuICAqLworZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lX3IgKF9fY29uc3QgdGltZV90ICpfX3Jlc3RyaWN0IF9fdGltZXIsCisJCQkgICAgICAgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIF9fVEhST1c7CisjIGVuZGlmCS8qIFBPU0lYIG9yIG1pc2MgKi8KKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZXR1cm4gYSBzdHJpbmcgb2YgdGhlIGZvcm0gIkRheSBNb24gZGQgaGg6bW06c3MgeXl5eVxuIgorICAgdGhhdCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgVFAgaW4gdGhpcyBmb3JtYXQuICAqLworZXh0ZXJuIGNoYXIgKmFzY3RpbWUgKF9fY29uc3Qgc3RydWN0IHRtICpfX3RwKSBfX1RIUk9XOworCisvKiBFcXVpdmFsZW50IHRvIGBhc2N0aW1lIChsb2NhbHRpbWUgKHRpbWVyKSknLiAgKi8KK2V4dGVybiBjaGFyICpjdGltZSAoX19jb25zdCB0aW1lX3QgKl9fdGltZXIpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyMgaWYgZGVmaW5lZCBfX1VTRV9QT1NJWCB8fCBkZWZpbmVkIF9fVVNFX01JU0MKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zLiAgKi8KKworLyogUmV0dXJuIGluIEJVRiBhIHN0cmluZyBvZiB0aGUgZm9ybSAiRGF5IE1vbiBkZCBoaDptbTpzcyB5eXl5XG4iCisgICB0aGF0IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBUUCBpbiB0aGlzIGZvcm1hdC4gICovCitleHRlcm4gY2hhciAqYXNjdGltZV9yIChfX2NvbnN0IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwLAorCQkJY2hhciAqX19yZXN0cmljdCBfX2J1ZikgX19USFJPVzsKKworLyogRXF1aXZhbGVudCB0byBgYXNjdGltZV9yIChsb2NhbHRpbWVfciAodGltZXIsICpUTVAqKSwgYnVmKScuICAqLworZXh0ZXJuIGNoYXIgKmN0aW1lX3IgKF9fY29uc3QgdGltZV90ICpfX3Jlc3RyaWN0IF9fdGltZXIsCisJCSAgICAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIF9fVEhST1c7CisjIGVuZGlmCS8qIFBPU0lYIG9yIG1pc2MgKi8KKworCisvKiBEZWZpbmVkIGluIGxvY2FsdGltZS5jLiAgKi8KK2V4dGVybiBjaGFyICpfX3R6bmFtZVsyXTsJLyogQ3VycmVudCB0aW1lem9uZSBuYW1lcy4gICovCitleHRlcm4gaW50IF9fZGF5bGlnaHQ7CQkvKiBJZiBkYXlsaWdodC1zYXZpbmcgdGltZSBpcyBldmVyIGluIHVzZS4gICovCitleHRlcm4gbG9uZyBpbnQgX190aW1lem9uZTsJLyogU2Vjb25kcyB3ZXN0IG9mIFVUQy4gICovCisKKworIyBpZmRlZglfX1VTRV9QT1NJWAorLyogU2FtZSBhcyBhYm92ZS4gICovCitleHRlcm4gY2hhciAqdHpuYW1lWzJdOworCisvKiBTZXQgdGltZSBjb252ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgSWYgVFogaXMgbm90IGRlZmluZWQsIGEgbG9jYWxlLWRlcGVuZGVudCBkZWZhdWx0IGlzIHVzZWQuICAqLworZXh0ZXJuIHZvaWQgdHpzZXQgKHZvaWQpIF9fVEhST1c7CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KK2V4dGVybiBpbnQgZGF5bGlnaHQ7CitleHRlcm4gbG9uZyBpbnQgdGltZXpvbmU7CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfU1ZJRAorLyogU2V0IHRoZSBzeXN0ZW0gdGltZSB0byAqV0hFTi4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlcnVzZXIuICAqLworZXh0ZXJuIGludCBzdGltZSAoX19jb25zdCB0aW1lX3QgKl9fd2hlbikgX19USFJPVzsKKyMgZW5kaWYKKworCisvKiBOb256ZXJvIGlmIFlFQVIgaXMgYSBsZWFwIHllYXIgKGV2ZXJ5IDQgeWVhcnMsCisgICBleGNlcHQgZXZlcnkgMTAwdGggaXNuJ3QsIGFuZCBldmVyeSA0MDB0aCBpcykuICAqLworIyBkZWZpbmUgX19pc2xlYXAoeWVhcikJXAorICAoKHllYXIpICUgNCA9PSAwICYmICgoeWVhcikgJSAxMDAgIT0gMCB8fCAoeWVhcikgJSA0MDAgPT0gMCkpCisKKworIyBpZmRlZiBfX1VTRV9NSVNDCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyBtYW55IFVuaWNlcyBpbmhlcml0ZWQgZnJvbSB0aGUgcHVibGljIGRvbWFpbgorICAgbG9jYWx0aW1lIHBhY2thZ2UuICBUaGVzZSBhcmUgaW5jbHVkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eS4gICovCisKKy8qIExpa2UgYG1rdGltZScsIGJ1dCBmb3IgVFAgcmVwcmVzZW50cyBVbml2ZXJzYWwgVGltZSwgbm90IGxvY2FsIHRpbWUuICAqLworZXh0ZXJuIHRpbWVfdCB0aW1lZ20gKHN0cnVjdCB0bSAqX190cCkgX19USFJPVzsKKworLyogQW5vdGhlciBuYW1lIGZvciBgbWt0aW1lJy4gICovCitleHRlcm4gdGltZV90IHRpbWVsb2NhbCAoc3RydWN0IHRtICpfX3RwKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkYXlzIGluIFlFQVIuICAqLworZXh0ZXJuIGludCBkeXNpemUgKGludCBfX3llYXIpIF9fVEhST1cgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKKyMgZW5kaWYKKworCisjIGlmZGVmIF9fVVNFX1BPU0lYMTk5MzA5CisvKiBQYXVzZSBleGVjdXRpb24gZm9yIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgbmFub3NsZWVwIChfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXF1ZXN0ZWRfdGltZSwKKwkJICAgICAgc3RydWN0IHRpbWVzcGVjICpfX3JlbWFpbmluZyk7CisKKworLyogR2V0IHJlc29sdXRpb24gb2YgY2xvY2sgQ0xPQ0tfSUQuICAqLworZXh0ZXJuIGludCBjbG9ja19nZXRyZXMgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVzKSBfX1RIUk9XOworCisvKiBHZXQgY3VycmVudCB2YWx1ZSBvZiBjbG9jayBDTE9DS19JRCBhbmQgc3RvcmUgaXQgaW4gVFAuICAqLworZXh0ZXJuIGludCBjbG9ja19nZXR0aW1lIChjbG9ja2lkX3QgX19jbG9ja19pZCwgc3RydWN0IHRpbWVzcGVjICpfX3RwKSBfX1RIUk9XOworCisvKiBTZXQgY2xvY2sgQ0xPQ0tfSUQgdG8gdmFsdWUgVFAuICAqLworZXh0ZXJuIGludCBjbG9ja19zZXR0aW1lIChjbG9ja2lkX3QgX19jbG9ja19pZCwgX19jb25zdCBzdHJ1Y3QgdGltZXNwZWMgKl9fdHApCisgICAgIF9fVEhST1c7CisKKyMgIGlmZGVmIF9fVVNFX1hPUEVOMksKKy8qIEhpZ2gtcmVzb2x1dGlvbiBzbGVlcCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xvY2suCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBjbG9ja19uYW5vc2xlZXAgKGNsb2NraWRfdCBfX2Nsb2NrX2lkLCBpbnQgX19mbGFncywKKwkJCSAgICBfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXEsCisJCQkgICAgc3RydWN0IHRpbWVzcGVjICpfX3JlbSk7CisKKy8qIFJldHVybiBjbG9jayBJRCBmb3IgQ1BVLXRpbWUgY2xvY2suICAqLworZXh0ZXJuIGludCBjbG9ja19nZXRjcHVjbG9ja2lkIChwaWRfdCBfX3BpZCwgY2xvY2tpZF90ICpfX2Nsb2NrX2lkKSBfX1RIUk9XOworIyAgZW5kaWYKKworCisvKiBDcmVhdGUgbmV3IHBlci1wcm9jZXNzIHRpbWVyIHVzaW5nIENMT0NLX0lELiAgKi8KK2V4dGVybiBpbnQgdGltZXJfY3JlYXRlIChjbG9ja2lkX3QgX19jbG9ja19pZCwKKwkJCSBzdHJ1Y3Qgc2lnZXZlbnQgKl9fcmVzdHJpY3QgX19ldnAsCisJCQkgdGltZXJfdCAqX19yZXN0cmljdCBfX3RpbWVyaWQpIF9fVEhST1c7CisKKy8qIERlbGV0ZSB0aW1lciBUSU1FUklELiAgKi8KK2V4dGVybiBpbnQgdGltZXJfZGVsZXRlICh0aW1lcl90IF9fdGltZXJpZCkgX19USFJPVzsKKworLyogU2V0IHRpbWVyIFRJTUVSSUQgdG8gVkFMVUUsIHJldHVybmluZyBvbGQgdmFsdWUgaW4gT1ZMQVVFLiAgKi8KK2V4dGVybiBpbnQgdGltZXJfc2V0dGltZSAodGltZXJfdCBfX3RpbWVyaWQsIGludCBfX2ZsYWdzLAorCQkJICBfX2NvbnN0IHN0cnVjdCBpdGltZXJzcGVjICpfX3Jlc3RyaWN0IF9fdmFsdWUsCisJCQkgIHN0cnVjdCBpdGltZXJzcGVjICpfX3Jlc3RyaWN0IF9fb3ZhbHVlKSBfX1RIUk9XOworCisvKiBHZXQgY3VycmVudCB2YWx1ZSBvZiB0aW1lciBUSU1FUklEIGFuZCBzdG9yZSBpdCBpbiBWTEFVRS4gICovCitleHRlcm4gaW50IHRpbWVyX2dldHRpbWUgKHRpbWVyX3QgX190aW1lcmlkLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX192YWx1ZSkKKyAgICAgX19USFJPVzsKKworLyogR2V0IGV4cGlyYXRpb24gb3ZlcnJ1biBmb3IgdGltZXIgVElNRVJJRC4gICovCitleHRlcm4gaW50IHRpbWVyX2dldG92ZXJydW4gKHRpbWVyX3QgX190aW1lcmlkKSBfX1RIUk9XOworIyBlbmRpZgorCisKKyMgaWZkZWYgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgdG8gaW5kaWNhdGUgYW4gZXJyb3IuCisgICAgIDEgIHRoZSBEQVRFTVNLIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG51bGwgb3IgdW5kZWZpbmVkLAorICAgICAyICB0aGUgdGVtcGxhdGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nLAorICAgICAzICBmYWlsZWQgdG8gZ2V0IGZpbGUgc3RhdHVzIGluZm9ybWF0aW9uLAorICAgICA0ICB0aGUgdGVtcGxhdGUgZmlsZSBpcyBub3QgYSByZWd1bGFyIGZpbGUsCisgICAgIDUgIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdoaWxlIHJlYWRpbmcgdGhlIHRlbXBsYXRlIGZpbGUsCisgICAgIDYgIG1lbW9yeSBhbGxpY2F0aW9uIGZhaWxlZCAobm90IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlKSwKKyAgICAgNyAgdGhlcmUgaXMgbm8gbGluZSBpbiB0aGUgdGVtcGxhdGUgdGhhdCBtYXRjaGVzIHRoZSBpbnB1dCwKKyAgICAgOCAgaW52YWxpZCBpbnB1dCBzcGVjaWZpY2F0aW9uIEV4YW1wbGU6IEZlYnJ1YXJ5IDMxIG9yIGEgdGltZSBpcworICAgICAgICBzcGVjaWZpZWQgdGhhdCBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIGEgdGltZV90IChyZXByZXNlbnRpbmcKKwl0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIDAwOjAwOjAwIFVUQywgSmFudWFyeSAxLCAxOTcwKSAqLworZXh0ZXJuIGludCBnZXRkYXRlX2VycjsKKworLyogUGFyc2UgdGhlIGdpdmVuIHN0cmluZyBhcyBhIGRhdGUgc3BlY2lmaWNhdGlvbiBhbmQgcmV0dXJuIGEgdmFsdWUKKyAgIHJlcHJlc2VudGluZyB0aGUgdmFsdWUuICBUaGUgdGVtcGxhdGVzIGZyb20gdGhlIGZpbGUgaWRlbnRpZmllZCBieQorICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERBVEVNU0sgYXJlIHVzZWQuICBJbiBjYXNlIG9mIGFuIGVycm9yCisgICBgZ2V0ZGF0ZV9lcnInIGlzIHNldC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCB0bSAqZ2V0ZGF0ZSAoX19jb25zdCBjaGFyICpfX3N0cmluZyk7CisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfR05VCisvKiBTaW5jZSBgZ2V0ZGF0ZScgaXMgbm90IHJlZW50cmFudCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgYGdldGRhdGVfZXJyJworICAgYW5kIHRoZSBzdGF0aWMgYnVmZmVyIHRvIHJldHVybiB0aGUgcmVzdWx0IGluLCB3ZSBwcm92aWRlIGEgdGhyZWFkLXNhZmUKKyAgIHZhcmlhbnQuICBUaGUgZnVuY3Rpb25hbGl0eSBpcyB0aGUgc2FtZS4gIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgaW4KKyAgIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBSRVNCVUZQIGFuZCBpbiBjYXNlIG9mIGFuIGVycm9yIHRoZSByZXR1cm4KKyAgIHZhbHVlIGlzICE9IDAgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgYXMgZ2l2ZW4gYWJvdmUgZm9yIGBnZXRkYXRlX2VycicuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZ2V0ZGF0ZV9yIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zdHJpbmcsCisJCSAgICAgIHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3Jlc2J1ZnApOworIyBlbmRpZgorCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogPHRpbWUuaD4gaW5jbHVkZWQuICAqLworCisjZW5kaWYgLyogPHRpbWUuaD4gbm90IGFscmVhZHkgaW5jbHVkZWQuICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS90dHllbnQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdHR5ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyMjFiYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdHR5ZW50LmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0dHllbnQuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqLworCisjaWZuZGVmCV9UVFlFTlRfSAorI2RlZmluZQlfVFRZRU5UX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2RlZmluZQlfUEFUSF9UVFlTCSIvZXRjL3R0eXMiCisKKyNkZWZpbmUJX1RUWVNfT0ZGCSJvZmYiCisjZGVmaW5lCV9UVFlTX09OCSJvbiIKKyNkZWZpbmUJX1RUWVNfU0VDVVJFCSJzZWN1cmUiCisjZGVmaW5lCV9UVFlTX1dJTkRPVwkid2luZG93IgorCitzdHJ1Y3QgdHR5ZW50IHsKKwljaGFyCSp0eV9uYW1lOwkvKiB0ZXJtaW5hbCBkZXZpY2UgbmFtZSAqLworCWNoYXIJKnR5X2dldHR5OwkvKiBjb21tYW5kIHRvIGV4ZWN1dGUsIHVzdWFsbHkgZ2V0dHkgKi8KKwljaGFyCSp0eV90eXBlOwkvKiB0ZXJtaW5hbCB0eXBlIGZvciB0ZXJtY2FwICovCisjZGVmaW5lCVRUWV9PTgkJMHgwMQkvKiBlbmFibGUgbG9naW5zIChzdGFydCB0eV9nZXR0eSBwcm9ncmFtKSAqLworI2RlZmluZQlUVFlfU0VDVVJFCTB4MDIJLyogYWxsb3cgdWlkIG9mIDAgdG8gbG9naW4gKi8KKwlpbnQJdHlfc3RhdHVzOwkvKiBzdGF0dXMgZmxhZ3MgKi8KKwljaGFyIAkqdHlfd2luZG93OwkvKiBjb21tYW5kIHRvIHN0YXJ0IHVwIHdpbmRvdyBtYW5hZ2VyICovCisJY2hhcgkqdHlfY29tbWVudDsJLyogY29tbWVudCBmaWVsZCAqLworfTsKKworCitfX0JFR0lOX0RFQ0xTCisKK2V4dGVybiBzdHJ1Y3QgdHR5ZW50ICpnZXR0dHllbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gc3RydWN0IHR0eWVudCAqZ2V0dHR5bmFtIChfX2NvbnN0IGNoYXIgKl9fdHR5KSBfX1RIUk9XOworZXh0ZXJuIGludCBzZXR0dHllbnQgKHZvaWQpIF9fVEhST1c7CitleHRlcm4gaW50IGVuZHR0eWVudCAodm9pZCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHR0eWVudC5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3Vjb250ZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3Vjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZjU5NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWNvbnRleHQuaApAQCAtMCwwICsxLDUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFN5c3RlbSBWIEFCSSBjb21wbGlhbnQgdXNlci1sZXZlbCBjb250ZXh0IHN3aXRjaGluZyBzdXBwb3J0LiAgKi8KKworI2lmbmRlZiBfVUNPTlRFWFRfSAorI2RlZmluZSBfVUNPTlRFWFRfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisvKiBHZXQgbWFjaGluZSBkZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMuICAqLworI2luY2x1ZGUgPHN5cy91Y29udGV4dC5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCB1c2VyIGNvbnRleHQgYW5kIHN0b3JlIGl0IGluIHZhcmlhYmxlIHBvaW50ZWQgdG8gYnkgVUNQLiAgKi8KK2V4dGVybiBpbnQgZ2V0Y29udGV4dCAodWNvbnRleHRfdCAqX191Y3ApIF9fVEhST1c7CisKKy8qIFNldCB1c2VyIGNvbnRleHQgZnJvbSBpbmZvcm1hdGlvbiBvZiB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IFVDUC4gICovCitleHRlcm4gaW50IHNldGNvbnRleHQgKF9fY29uc3QgdWNvbnRleHRfdCAqX191Y3ApIF9fVEhST1c7CisKKy8qIFNhdmUgY3VycmVudCBjb250ZXh0IGluIGNvbnRleHQgdmFyaWFibGUgcG9pbnRlZCB0byBieSBPVUNQIGFuZCBzZXQKKyAgIGNvbnRleHQgZnJvbSB2YXJpYWJsZSBwb2ludGVkIHRvIGJ5IFVDUC4gICovCitleHRlcm4gaW50IHN3YXBjb250ZXh0ICh1Y29udGV4dF90ICpfX3Jlc3RyaWN0IF9fb3VjcCwKKwkJCV9fY29uc3QgdWNvbnRleHRfdCAqX19yZXN0cmljdCBfX3VjcCkgX19USFJPVzsKKworLyogTWFuaXB1bGF0ZSB1c2VyIGNvbnRleHQgVUNQIHRvIGNvbnRpbnVlIHdpdGggY2FsbGluZyBmdW5jdGlvbnMgRlVOQworICAgYW5kIHRoZSBBUkdDLTEgcGFyYW1ldGVycyBmb2xsb3dpbmcgQVJHQyB3aGVuIHRoZSBjb250ZXh0IGlzIHVzZWQKKyAgIHRoZSBuZXh0IHRpbWUgaW4gYHNldGNvbnRleHQnIG9yIGBzd2FwY29udGV4dCcuCisKKyAgIFdlIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgdGhlIHBhcmFtZXRlcnMgRlVOQyB0YWtlczsgYHZvaWQnCisgICBpcyBhcyBnb29kIGFzIGFueSBvdGhlciBjaG9pY2UuICAqLworZXh0ZXJuIHZvaWQgbWFrZWNvbnRleHQgKHVjb250ZXh0X3QgKl9fdWNwLCB2b2lkICgqX19mdW5jKSAodm9pZCksCisJCQkgaW50IF9fYXJnYywgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdWNvbnRleHQuaCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS91bGltaXQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWxpbWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNWYzNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdWxpbWl0LmgKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaWZuZGVmIF9VTElNSVRfSAorI2RlZmluZSBfVUxJTUlUX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworLyogQ29uc3RhbnRzIHVzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBmb3IgYHVsaW1pdCcuICBUaGV5IGRlbm90ZSBsaW1pdHMKKyAgIHdoaWNoIGNhbiBiZSBzZXQgb3IgcmV0cmlldmVkIHVzaW5nIHRoaXMgZnVuY3Rpb24uICAqLworZW51bQoreworICBVTF9HRVRGU0laRSA9IDEsCQkJLyogUmV0dXJuIGxpbWl0IG9uIHRoZSBzaXplIG9mIGEgZmlsZSwKKwkJCQkJICAgaW4gdW5pdHMgb2YgNTEyIGJ5dGVzLiAgKi8KKyNkZWZpbmUgVUxfR0VURlNJWkUJVUxfR0VURlNJWkUKKyAgVUxfU0VURlNJWkUsCQkJCS8qIFNldCBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBhIGZpbGUgdG8KKwkJCQkJICAgc2Vjb25kIGFyZ3VtZW50LiAgKi8KKyNkZWZpbmUgVUxfU0VURlNJWkUJVUxfU0VURlNJWkUKKyAgX19VTF9HRVRNQVhCUkssCQkJLyogUmV0dXJuIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGFkZHJlc3MKKwkJCQkJICAgb2YgdGhlIGRhdGEgc2VnbWVudC4gICovCisgIF9fVUxfR0VUT1BFTk1BWAkJCS8qIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMKKwkJCQkJICAgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBvcGVuLiovCit9OworCisKK19fQkVHSU5fREVDTFMKKworLyogQ29udHJvbCBwcm9jZXNzIGxpbWl0cyBhY2NvcmRpbmcgdG8gQ01ELiAgKi8KK2V4dGVybiBsb25nIGludCB1bGltaXQgKGludCBfX2NtZCwgLi4uKSBfX1RIUk9XOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLyogdWxpbWl0LmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5jdHJsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3VuY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmI0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3VuY3RybC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhICAqCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICAgICAgICAgICAgKgorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAgICAgICoKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgICAgICAqCisgKiBkaXN0cmlidXRlLCBkaXN0cmlidXRlIHdpdGggbW9kaWZpY2F0aW9ucywgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgICAgICAgKgorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzICAgICoKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6ICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgICoKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgICoKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgICAgICAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICAgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFCT1ZFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAgICoKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAgICAqCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgICAgKgorICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZShzKSBvZiB0aGUgYWJvdmUgY29weXJpZ2h0ICAgKgorICogaG9sZGVycyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgICAgICoKKyAqIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAgICAgICAqCisgKiBhdXRob3JpemF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQXV0aG9yOiBaZXlkIE0uIEJlbi1IYWxpbSA8em1iZW5oYWxAbmV0Y29tLmNvbT4gMTk5MiwxOTk1ICAgICAgICAgICAgICAgKgorICogICAgIGFuZDogRXJpYyBTLiBSYXltb25kIDxlc3JAc25hcmsudGh5cnN1cy5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogdW5jdHJsLmgKKyAqCisgKiBEaXNwbGF5IGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgYSBjb250cm9sIGNoYXJhY3Rlci4KKyAqIENvbnRyb2wgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIGluIGNhcmV0IG5vdGF0aW9uICheeCksIERFTEVURSBpcyBkaXNwbGF5ZWQKKyAqIGFzIF4/LiBQcmludGFibGUgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIGFzIGlzLgorICovCisKKy8qICRJZDogdW5jdHJsLmguaW4sdiAxLjEwIDIwMDEvMDMvMjQgMjE6NTM6MjUgdG9tIEV4cCAkICovCisKKyNpZm5kZWYgTkNVUlNFU19VTkNUUkxfSF9pbmNsCisjZGVmaW5lIE5DVVJTRVNfVU5DVFJMX0hfaW5jbAkxCisKKyN1bmRlZiAgTkNVUlNFU19WRVJTSU9OCisjZGVmaW5lIE5DVVJTRVNfVkVSU0lPTiAiNS42IgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKworI3VuZGVmIHVuY3RybAorTkNVUlNFU19FWFBPUlQoTkNVUlNFU19DT05TVCBjaGFyICopIHVuY3RybCAoY2h0eXBlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE5DVVJTRVNfVU5DVFJMX0hfaW5jbCAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS91bmlzdGQuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5pc3RkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2YzFmMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdW5pc3RkLmgKQEAgLTAsMCArMSwxMTA1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqCVBPU0lYIFN0YW5kYXJkOiAyLjEwIFN5bWJvbGljIENvbnN0YW50cwkJPHVuaXN0ZC5oPgorICovCisKKyNpZm5kZWYJX1VOSVNURF9ICisjZGVmaW5lCV9VTklTVERfSAkxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qIFRoZXNlIG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGF0IGZhY2lsaXRpZXMgYXJlIHByZXNlbnQgYXQgY29tcGlsZSB0aW1lLgorICAgVGhlaXIgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCBhdCBydW4gdGltZSBmcm9tIGBzeXNjb25mJy4gICovCisKKy8qIFBPU0lYIFN0YW5kYXJkIGFwcHJvdmVkIGFzIElTTy9JRUMgOTk0NS0xIGFzIG9mIERlY2VtYmVyIDIwMDEuICAqLworI2RlZmluZQlfUE9TSVhfVkVSU0lPTgkyMDAxMTJMCisKKy8qIFRoZXNlIGFyZSBub3QgI2lmZGVmIF9fVVNFX1BPU0lYMiBiZWNhdXNlIHRoZXkgYXJlCisgICBpbiB0aGUgdGhlb3JldGljYWxseSBhcHBsaWNhdGlvbi1vd25lZCBuYW1lc3BhY2UuICAqLworCisvKiBUaGUgdXRpbGl0aWVzIG9uIEdOVSBzeXN0ZW1zIGFsc28gY29ycmVzcG9uZCB0byB0aGlzIHZlcnNpb24uICAqLworI2RlZmluZSBfUE9TSVgyX1ZFUlNJT04JMjAwMTEyTAorCisvKiBJZiBkZWZpbmVkLCB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlCisgICBDIExhbmd1YWdlIEJpbmRpbmdzIE9wdGlvbi4gICovCisjZGVmaW5lCV9QT1NJWDJfQ19CSU5ECTIwMDExMkwKKworLyogSWYgZGVmaW5lZCwgdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZQorICAgQyBMYW5ndWFnZSBEZXZlbG9wbWVudCBVdGlsaXRpZXMgT3B0aW9uLiAgKi8KKyNkZWZpbmUJX1BPU0lYMl9DX0RFVgkyMDAxMTJMCisKKy8qIElmIGRlZmluZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUKKyAgIFNvZnR3YXJlIERldmVsb3BtZW50IFV0aWxpdGllcyBPcHRpb24uICAqLworI2RlZmluZQlfUE9TSVgyX1NXX0RFVgkyMDAxMTJMCisKKy8qIElmIGRlZmluZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUKKyAgIGNyZWF0aW9uIG9mIGxvY2FsZXMgd2l0aCB0aGUgbG9jYWxlZGVmIHV0aWxpdHkuICAqLworI2RlZmluZSBfUE9TSVgyX0xPQ0FMRURFRiAgICAgICAyMDAxMTJMCisKKy8qIFgvT3BlbiB2ZXJzaW9uIG51bWJlciB0byB3aGljaCB0aGUgbGlicmFyeSBjb25mb3Jtcy4gIEl0IGlzIHNlbGVjdGFibGUuICAqLworI2lmZGVmIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTYwMAorI2VsaWYgZGVmaW5lZCBfX1VTRV9VTklYOTgKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTUwMAorI2Vsc2UKKyMgZGVmaW5lIF9YT1BFTl9WRVJTSU9OCTQKKyNlbmRpZgorCisvKiBDb21tYW5kcyBhbmQgdXRpbGl0aWVzIGZyb20gWFBHNCBhcmUgYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX1hDVV9WRVJTSU9OCTQKKworLyogV2UgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIHB1Ymxpc2hlZCBzdGFuZGFyZHMgYXMgd2VsbC4gICovCisjZGVmaW5lIF9YT1BFTl9YUEcyCTEKKyNkZWZpbmUgX1hPUEVOX1hQRzMJMQorI2RlZmluZSBfWE9QRU5fWFBHNAkxCisKKy8qIFRoZSBYL09wZW4gVW5peCBleHRlbnNpb25zIGFyZSBhdmFpbGFibGUuICAqLworI2RlZmluZSBfWE9QRU5fVU5JWAkxCisKKy8qIEVuY3J5cHRpb24gaXMgcHJlc2VudC4gICovCisjZGVmaW5lCV9YT1BFTl9DUllQVAkxCisKKy8qIFRoZSBlbmhhbmNlZCBpbnRlcm5hdGlvbmFsaXphdGlvbiBjYXBhYmlsaXRpZXMgYWNjb3JkaW5nIHRvIFhQRzQuMgorICAgYXJlIHByZXNlbnQuICAqLworI2RlZmluZQlfWE9QRU5fRU5IX0kxOE4JMQorCisvKiBUaGUgbGVnYWN5IGludGVyZmFjZXMgYXJlIGFsc28gYXZhaWxhYmxlLiAgKi8KKyNkZWZpbmUgX1hPUEVOX0xFR0FDWQkxCisKKworLyogR2V0IHZhbHVlcyBvZiBQT1NJWCBvcHRpb25zOgorCisgICBJZiB0aGVzZSBzeW1ib2xzIGFyZSBkZWZpbmVkLCB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlcyBhcmUKKyAgIGFsd2F5cyBhdmFpbGFibGUuICBJZiBub3QsIHRoZXkgbWF5IGJlIGF2YWlsYWJsZSBzb21ldGltZXMuCisgICBUaGUgY3VycmVudCB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkIHdpdGggYHN5c2NvbmYnLgorCisgICBfUE9TSVhfSk9CX0NPTlRST0wJCUpvYiBjb250cm9sIGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9TQVZFRF9JRFMJCVByb2Nlc3NlcyBoYXZlIGEgc2F2ZWQgc2V0LXVzZXItSUQKKwkJCQlhbmQgYSBzYXZlZCBzZXQtZ3JvdXAtSUQuCisgICBfUE9TSVhfUkVBTFRJTUVfU0lHTkFMUwlSZWFsLXRpbWUsIHF1ZXVlZCBzaWduYWxzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORwlQcmlvcml0eSBzY2hlZHVsaW5nIGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USU1FUlMJCVBPU0lYLjQgY2xvY2tzIGFuZCB0aW1lcnMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9BU1lOQ0hST05PVVNfSU8JQXN5bmNocm9ub3VzIEkvTyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUFJJT1JJVElaRURfSU8JUHJpb3JpdGl6ZWQgYXN5bmNocm9ub3VzIEkvTyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfU1lOQ0hST05JWkVEX0lPCVN5bmNocm9uaXppbmcgZmlsZSBkYXRhIGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9GU1lOQwkJCVRoZSBmc3luYyBmdW5jdGlvbiBpcyBwcmVzZW50LgorICAgX1BPU0lYX01BUFBFRF9GSUxFUwkJTWFwcGluZyBvZiBmaWxlcyB0byBtZW1vcnkgaXMgc3VwcG9ydGVkLgorICAgX1BPU0lYX01FTUxPQ0sJCUxvY2tpbmcgb2YgYWxsIG1lbW9yeSBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfTUVNTE9DS19SQU5HRQkJTG9ja2luZyBvZiByYW5nZXMgb2YgbWVtb3J5IGlzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9NRU1PUllfUFJPVEVDVElPTglTZXR0aW5nIG9mIG1lbW9yeSBwcm90ZWN0aW9ucyBpcyBzdXBwb3J0ZWQuCisgICBfUE9TSVhfTUVTU0FHRV9QQVNTSU5HCVBPU0lYLjQgbWVzc2FnZSBxdWV1ZXMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9TRU1BUEhPUkVTCQlQT1NJWC40IGNvdW50aW5nIHNlbWFwaG9yZXMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9TSEFSRURfTUVNT1JZX09CSkVDVFMJUE9TSVguNCBzaGFyZWQgbWVtb3J5IG9iamVjdHMgYXJlIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURTCQlQT1NJWC4xYyBwdGhyZWFkcyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLQUREUglUaHJlYWQgc3RhY2sgYWRkcmVzcyBhdHRyaWJ1dGUgb3B0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUJVGhyZWFkIHN0YWNrIHNpemUgYXR0cmlidXRlIG9wdGlvbiBzdXBwb3J0ZWQuCisgICBfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TCVRocmVhZC1zYWZlIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisJCQkJUE9TSVguMWMgdGhyZWFkIGV4ZWN1dGlvbiBzY2hlZHVsaW5nIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfUFJJT19JTkhFUklUCVRocmVhZCBwcmlvcml0eSBpbmhlcml0YW5jZSBvcHRpb24gc3VwcG9ydGVkLgorICAgX1BPU0lYX1RIUkVBRF9QUklPX1BST1RFQ1QJVGhyZWFkIHByaW9yaXR5IHByb3RlY3Rpb24gb3B0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9USFJFQURfUFJPQ0VTU19TSEFSRUQJUHJvY2Vzcy1zaGFyZWQgc3luY2hyb25pemF0aW9uIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUkJCQlQcm90b2NvbC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX1hUSQkJWFRJIHByb3RvY29sLWluZGVwLiBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX1NPQ0tFVAkJU29ja2V0IHByb3RvY29sLWluZGVwLiBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX0lOVEVSTkVUCQlJbnRlcm5ldCBmYW1pbHkgb2YgcHJvdG9jb2xzIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUlfSU5URVJORVRfU1RSRUFNCUNvbm5lY3Rpb24tbW9kZSBJbnRlcm5ldCBwcm90b2NvbCBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX0lOVEVSTkVUX0RHUkFNCUNvbm5lY3Rpb25sZXNzIEludGVybmV0IHByb3RvY29sIHN1cHBvcnRlZC4KKyAgIF9QT1NJWF9QSUlfT1NJCQlJU08vT1NJIGZhbWlseSBvZiBwcm90b2NvbHMgc3VwcG9ydGVkLgorICAgX1BPU0lYX1BJSV9PU0lfQ09UUwkJQ29ubmVjdGlvbi1tb2RlIElTTy9PU0kgc2VydmljZSBzdXBwb3J0ZWQuCisgICBfUE9TSVhfUElJX09TSV9DTFRTCQlDb25uZWN0aW9ubGVzcyBJU08vT1NJIHNlcnZpY2Ugc3VwcG9ydGVkLgorICAgX1BPU0lYX1BPTEwJCQlJbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBgcG9sbCcgZnVuY3Rpb24uCisgICBfUE9TSVhfU0VMRUNUCQlJbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBgc2VsZWN0JyBhbmQgYHBzZWxlY3QnLgorCisgICBfWE9QRU5fUkVBTFRJTUUJCVgvT3BlbiByZWFsdGltZSBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KKyAgIF9YT1BFTl9SRUFMVElNRV9USFJFQURTCVgvT3BlbiByZWFsdGltZSB0aHJlYWQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCisgICBfWE9QRU5fU0hNCQkJU2hhcmVkIG1lbW9yeSBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIFhQRzQuMi4KKworICAgX1hCUzVfSUxQMzJfT0ZGMzIJCUltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVudmlyb25tZW50IHdpdGggMzItYml0CisJCQkJaW50LCBsb25nLCBwb2ludGVyLCBhbmQgb2ZmX3QgdHlwZXMuCisgICBfWEJTNV9JTFAzMl9PRkZCSUcJCUltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVudmlyb25tZW50IHdpdGggMzItYml0CisJCQkJaW50LCBsb25nLCBhbmQgcG9pbnRlciBhbmQgb2ZmX3Qgd2l0aCBhdCBsZWFzdAorCQkJCTY0IGJpdHMuCisgICBfWEJTNV9MUDY0X09GRjY0CQlJbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBlbnZpcm9ubWVudCB3aXRoIDMyLWJpdAorCQkJCWludCwgYW5kIDY0LWJpdCBsb25nLCBwb2ludGVyLCBhbmQgb2ZmX3QgdHlwZXMuCisgICBfWEJTNV9MUEJJR19PRkZCSUcJCUltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGVudmlyb25tZW50IHdpdGggYXQKKwkJCQlsZWFzdCAzMiBiaXRzIGludCBhbmQgbG9uZywgcG9pbnRlciwgYW5kIG9mZl90CisJCQkJd2l0aCBhdCBsZWFzdCA2NCBiaXRzLgorCisgICBJZiBhbnkgb2YgdGhlc2Ugc3ltYm9scyBpcyBkZWZpbmVkIGFzIC0xLCB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24gaXMgbm90CisgICB0cnVlIGZvciBhbnkgZmlsZS4gIElmIGFueSBpcyBkZWZpbmVkIGFzIG90aGVyIHRoYW4gLTEsIHRoZSBjb3JyZXNwb25kaW5nCisgICBvcHRpb24gaXMgdHJ1ZSBmb3IgYWxsIGZpbGVzLiAgSWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgYXQgYWxsLCB0aGUgdmFsdWUKKyAgIGZvciBhIHNwZWNpZmljIGZpbGUgY2FuIGJlIG9idGFpbmVkIGZyb20gYHBhdGhjb25mJyBhbmQgYGZwYXRoY29uZicuCisKKyAgIF9QT1NJWF9DSE9XTl9SRVNUUklDVEVECU9ubHkgdGhlIHN1cGVyIHVzZXIgY2FuIHVzZSBgY2hvd24nIHRvIGNoYW5nZQorCQkJCXRoZSBvd25lciBvZiBhIGZpbGUuICBgY2hvd24nIGNhbiBvbmx5IGJlIHVzZWQKKwkJCQl0byBjaGFuZ2UgdGhlIGdyb3VwIElEIG9mIGEgZmlsZSB0byBhIGdyb3VwIG9mCisJCQkJd2hpY2ggdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBhIG1lbWJlci4KKyAgIF9QT1NJWF9OT19UUlVOQwkJUGF0aG5hbWUgY29tcG9uZW50cyBsb25nZXIgdGhhbgorCQkJCU5BTUVfTUFYIGdlbmVyYXRlIGFuIGVycm9yLgorICAgX1BPU0lYX1ZESVNBQkxFCQlJZiBkZWZpbmVkLCBpZiB0aGUgdmFsdWUgb2YgYW4gZWxlbWVudCBvZiB0aGUKKwkJCQlgY19jYycgbWVtYmVyIG9mIGBzdHJ1Y3QgdGVybWlvcycgaXMKKwkJCQlfUE9TSVhfVkRJU0FCTEUsIG5vIGNoYXJhY3RlciB3aWxsIGhhdmUgdGhlCisJCQkJZWZmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQuCisgICBfUE9TSVhfU1lOQ19JTwkJU3luY2hyb25vdXMgSS9PIG1heSBiZSBwZXJmb3JtZWQuCisgICBfUE9TSVhfQVNZTkNfSU8JCUFzeW5jaHJvbm91cyBJL08gbWF5IGJlIHBlcmZvcm1lZC4KKyAgIF9QT1NJWF9QUklPX0lPCQlQcmlvcml0aXplZCBBc3luY2hyb25vdXMgSS9PIG1heSBiZSBwZXJmb3JtZWQuCisKKyAgIFN1cHBvcnQgZm9yIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgaW50ZXJmYWNlIGlzIG5vdCBnZW5lcmFsbHkgYXZhaWxhYmxlLgorICAgSWYgaXQgaXMgYXZhaWxhYmxlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSBkZWZpbmVkIHRvIG9uZS4KKyAgIF9MRlM2NF9MQVJHRUZJTEUJCUxvdy1sZXZlbCBJL08gc3VwcG9ydHMgbGFyZ2UgZmlsZXMuCisgICBfTEZTNjRfU1RESU8JCQlTdGFuZGFyZCBJL08gc3VwcG9ydHMgbGFyZ2UgZmlsZXMuCisgICAqLworCisjaW5jbHVkZSA8Yml0cy9wb3NpeF9vcHQuaD4KKworLyogR2V0IHRoZSBlbnZpcm9ubWVudCBkZWZpbml0aW9ucyBmcm9tIFVuaXg5OC4gICovCisjaWZkZWYgX19VU0VfVU5JWDk4CisjIGluY2x1ZGUgPGJpdHMvZW52aXJvbm1lbnRzLmg+CisjZW5kaWYKKworLyogU3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycy4gICovCisjZGVmaW5lCVNURElOX0ZJTEVOTwkwCS8qIFN0YW5kYXJkIGlucHV0LiAgKi8KKyNkZWZpbmUJU1RET1VUX0ZJTEVOTwkxCS8qIFN0YW5kYXJkIG91dHB1dC4gICovCisjZGVmaW5lCVNUREVSUl9GSUxFTk8JMgkvKiBTdGFuZGFyZCBlcnJvciBvdXRwdXQuICAqLworCisKKy8qIEFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGRlY2xhcmVkIGFueXdoZXJlIGVsc2UuICAqLworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZuZGVmCV9fc3NpemVfdF9kZWZpbmVkCit0eXBlZGVmIF9fc3NpemVfdCBzc2l6ZV90OworIyBkZWZpbmUgX19zc2l6ZV90X2RlZmluZWQKKyNlbmRpZgorCisjZGVmaW5lCV9fbmVlZF9zaXplX3QKKyNkZWZpbmUgX19uZWVkX05VTEwKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmIGRlZmluZWQgX19VU0VfWE9QRU4gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLCisvKiBUaGUgU2luZ2xlIFVuaXggc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgc29tZSBtb3JlIHR5cGVzIGFyZQorICAgYXZhaWxhYmxlIGhlcmUuICAqLworIyBpZm5kZWYgX19naWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CisjICBkZWZpbmUgX19naWRfdF9kZWZpbmVkCisjIGVuZGlmCisKKyMgaWZuZGVmIF9fdWlkX3RfZGVmaW5lZAordHlwZWRlZiBfX3VpZF90IHVpZF90OworIyAgZGVmaW5lIF9fdWlkX3RfZGVmaW5lZAorIyBlbmRpZgorCisjIGlmbmRlZiBfX29mZl90X2RlZmluZWQKKyMgIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0Cit0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CisjICBlbHNlCit0eXBlZGVmIF9fb2ZmNjRfdCBvZmZfdDsKKyMgIGVuZGlmCisjICBkZWZpbmUgX19vZmZfdF9kZWZpbmVkCisjIGVuZGlmCisjIGlmIGRlZmluZWQgX19VU0VfTEFSR0VGSUxFNjQgJiYgIWRlZmluZWQgX19vZmY2NF90X2RlZmluZWQKK3R5cGVkZWYgX19vZmY2NF90IG9mZjY0X3Q7CisjICBkZWZpbmUgX19vZmY2NF90X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX191c2Vjb25kc190X2RlZmluZWQKK3R5cGVkZWYgX191c2Vjb25kc190IHVzZWNvbmRzX3Q7CisjICBkZWZpbmUgX191c2Vjb25kc190X2RlZmluZWQKKyMgZW5kaWYKKworIyBpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjICBkZWZpbmUgX19waWRfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYJLyogWC9PcGVuICovCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorIyBpZm5kZWYgX19pbnRwdHJfdF9kZWZpbmVkCit0eXBlZGVmIF9faW50cHRyX3QgaW50cHRyX3Q7CisjICBkZWZpbmUgX19pbnRwdHJfdF9kZWZpbmVkCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4KKyMgaWZuZGVmIF9fc29ja2xlbl90X2RlZmluZWQKK3R5cGVkZWYgX19zb2NrbGVuX3Qgc29ja2xlbl90OworIyAgZGVmaW5lIF9fc29ja2xlbl90X2RlZmluZWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBWYWx1ZXMgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYWNjZXNzLgorICAgVGhlc2UgbWF5IGJlIE9SJ2QgdG9nZXRoZXIuICAqLworI2RlZmluZQlSX09LCTQJCS8qIFRlc3QgZm9yIHJlYWQgcGVybWlzc2lvbi4gICovCisjZGVmaW5lCVdfT0sJMgkJLyogVGVzdCBmb3Igd3JpdGUgcGVybWlzc2lvbi4gICovCisjZGVmaW5lCVhfT0sJMQkJLyogVGVzdCBmb3IgZXhlY3V0ZSBwZXJtaXNzaW9uLiAgKi8KKyNkZWZpbmUJRl9PSwkwCQkvKiBUZXN0IGZvciBleGlzdGVuY2UuICAqLworCisvKiBUZXN0IGZvciBhY2Nlc3MgdG8gTkFNRSB1c2luZyB0aGUgcmVhbCBVSUQgYW5kIHJlYWwgR0lELiAgKi8KK2V4dGVybiBpbnQgYWNjZXNzIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fdHlwZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFRlc3QgZm9yIGFjY2VzcyB0byBOQU1FIHVzaW5nIHRoZSBlZmZlY3RpdmUgVUlEIGFuZCBHSUQKKyAgIChhcyBub3JtYWwgZmlsZSBvcGVyYXRpb25zIHVzZSkuICAqLworZXh0ZXJuIGludCBldWlkYWNjZXNzIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgaW50IF9fdHlwZSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEFuIGFsaWFzIGZvciBgZXVpZGFjY2VzcycsIHVzZWQgYnkgc29tZSBvdGhlciBzeXN0ZW1zLiAgKi8KK2V4dGVybiBpbnQgZWFjY2VzcyAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX3R5cGUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworI2VuZGlmCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIFRlc3QgZm9yIGFjY2VzcyB0byBGSUxFIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgRkQgaXMgb3BlbiBvbi4KKyAgIElmIEFUX0VBQ0NFU1MgaXMgc2V0IGluIEZMQUcsIHRoZW4gdXNlIGVmZmVjdGl2ZSBJRHMgbGlrZSBgZWFjY2VzcycsCisgICBvdGhlcndpc2UgdXNlIHJlYWwgSURzIGxpa2UgYGFjY2VzcycuICAqLworZXh0ZXJuIGludCBmYWNjZXNzYXQgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fdHlwZSwgaW50IF9fZmxhZykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyKSkgX193dXI7CisjZW5kaWYgLyogVXNlIEdOVS4gICovCisKKworLyogVmFsdWVzIGZvciB0aGUgV0hFTkNFIGFyZ3VtZW50IHRvIGxzZWVrLiAgKi8KKyNpZm5kZWYJX1NURElPX0gJCS8qIDxzdGRpby5oPiBoYXMgdGhlIHNhbWUgZGVmaW5pdGlvbnMuICAqLworIyBkZWZpbmUgU0VFS19TRVQJMAkvKiBTZWVrIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUuICAqLworIyBkZWZpbmUgU0VFS19DVVIJMQkvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjIGRlZmluZSBTRUVLX0VORAkyCS8qIFNlZWsgZnJvbSBlbmQgb2YgZmlsZS4gICovCisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEICYmICFkZWZpbmVkIExfU0VUCisvKiBPbGQgQlNEIG5hbWVzIGZvciB0aGUgc2FtZSBjb25zdGFudHM7IGp1c3QgZm9yIGNvbXBhdGliaWxpdHkuICAqLworIyBkZWZpbmUgTF9TRVQJCVNFRUtfU0VUCisjIGRlZmluZSBMX0lOQ1IJCVNFRUtfQ1VSCisjIGRlZmluZSBMX1hUTkQJCVNFRUtfRU5ECisjZW5kaWYKKworCisvKiBNb3ZlIEZEJ3MgZmlsZSBwb3NpdGlvbiB0byBPRkZTRVQgYnl0ZXMgZnJvbSB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAoaWYgV0hFTkNFIGlzIFNFRUtfU0VUKSwKKyAgIHRoZSBjdXJyZW50IHBvc2l0aW9uIChpZiBXSEVOQ0UgaXMgU0VFS19DVVIpLAorICAgb3IgdGhlIGVuZCBvZiB0aGUgZmlsZSAoaWYgV0hFTkNFIGlzIFNFRUtfRU5EKS4KKyAgIFJldHVybiB0aGUgbmV3IGZpbGUgcG9zaXRpb24uICAqLworI2lmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CitleHRlcm4gX19vZmZfdCBsc2VlayAoaW50IF9fZmQsIF9fb2ZmX3QgX19vZmZzZXQsIGludCBfX3doZW5jZSkgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gX19vZmY2NF90IF9fUkVESVJFQ1RfTlRIIChsc2VlaywKKwkJCQkgKGludCBfX2ZkLCBfX29mZjY0X3QgX19vZmZzZXQsIGludCBfX3doZW5jZSksCisJCQkJIGxzZWVrNjQpOworIyBlbHNlCisjICBkZWZpbmUgbHNlZWsgbHNlZWs2NAorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBfX29mZjY0X3QgbHNlZWs2NCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX29mZnNldCwgaW50IF9fd2hlbmNlKQorICAgICBfX1RIUk9XOworI2VuZGlmCisKKy8qIENsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IgRkQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBjbG9zZSAoaW50IF9fZmQpOworCisvKiBSZWFkIE5CWVRFUyBpbnRvIEJVRiBmcm9tIEZELiAgUmV0dXJuIHRoZQorICAgbnVtYmVyIHJlYWQsIC0xIGZvciBlcnJvcnMgb3IgMCBmb3IgRU9GLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBzc2l6ZV90IHJlYWQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzKSBfX3d1cjsKKworLyogV3JpdGUgTiBieXRlcyBvZiBCVUYgdG8gRkQuICBSZXR1cm4gdGhlIG51bWJlciB3cml0dGVuLCBvciAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCB3cml0ZSAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsIHNpemVfdCBfX24pIF9fd3VyOworCisjaWZkZWYgX19VU0VfVU5JWDk4CisjIGlmbmRlZiBfX1VTRV9GSUxFX09GRlNFVDY0CisvKiBSZWFkIE5CWVRFUyBpbnRvIEJVRiBmcm9tIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dAorICAgY2hhbmdpbmcgdGhlIGZpbGUgcG9pbnRlci4gIFJldHVybiB0aGUgbnVtYmVyIHJlYWQsIC0xIGZvciBlcnJvcnMKKyAgIG9yIDAgZm9yIEVPRi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwcmVhZCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCSAgICAgIF9fb2ZmX3QgX19vZmZzZXQpIF9fd3VyOworCisvKiBXcml0ZSBOIGJ5dGVzIG9mIEJVRiB0byBGRCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gT0ZGU0VUIHdpdGhvdXQKKyAgIGNoYW5naW5nIHRoZSBmaWxlIHBvaW50ZXIuICBSZXR1cm4gdGhlIG51bWJlciB3cml0dGVuLCBvciAtMS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gc3NpemVfdCBwd3JpdGUgKGludCBfX2ZkLCBfX2NvbnN0IHZvaWQgKl9fYnVmLCBzaXplX3QgX19uLAorCQkgICAgICAgX19vZmZfdCBfX29mZnNldCkgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBzc2l6ZV90IF9fUkVESVJFQ1QgKHByZWFkLCAoaW50IF9fZmQsIHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMsCisJCQkJICAgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgIHByZWFkNjQpIF9fd3VyOworZXh0ZXJuIHNzaXplX3QgX19SRURJUkVDVCAocHdyaXRlLCAoaW50IF9fZmQsIF9fY29uc3Qgdm9pZCAqX19idWYsCisJCQkJICAgIHNpemVfdCBfX25ieXRlcywgX19vZmY2NF90IF9fb2Zmc2V0KSwKKwkJCSAgIHB3cml0ZTY0KSBfX3d1cjsKKyMgIGVsc2UKKyMgICBkZWZpbmUgcHJlYWQgcHJlYWQ2NAorIyAgIGRlZmluZSBwd3JpdGUgcHdyaXRlNjQKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKKy8qIFJlYWQgTkJZVEVTIGludG8gQlVGIGZyb20gRkQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIE9GRlNFVCB3aXRob3V0CisgICBjaGFuZ2luZyB0aGUgZmlsZSBwb2ludGVyLiAgUmV0dXJuIHRoZSBudW1iZXIgcmVhZCwgLTEgZm9yIGVycm9ycworICAgb3IgMCBmb3IgRU9GLiAgKi8KK2V4dGVybiBzc2l6ZV90IHByZWFkNjQgKGludCBfX2ZkLCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzLAorCQkJX19vZmY2NF90IF9fb2Zmc2V0KSBfX3d1cjsKKy8qIFdyaXRlIE4gYnl0ZXMgb2YgQlVGIHRvIEZEIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBPRkZTRVQgd2l0aG91dAorICAgY2hhbmdpbmcgdGhlIGZpbGUgcG9pbnRlci4gIFJldHVybiB0aGUgbnVtYmVyIHdyaXR0ZW4sIG9yIC0xLiAgKi8KK2V4dGVybiBzc2l6ZV90IHB3cml0ZTY0IChpbnQgX19mZCwgX19jb25zdCB2b2lkICpfX2J1Ziwgc2l6ZV90IF9fbiwKKwkJCSBfX29mZjY0X3QgX19vZmZzZXQpIF9fd3VyOworIyBlbmRpZgorI2VuZGlmCisKKy8qIENyZWF0ZSBhIG9uZS13YXkgY29tbXVuaWNhdGlvbiBjaGFubmVsIChwaXBlKS4KKyAgIElmIHN1Y2Nlc3NmdWwsIHR3byBmaWxlIGRlc2NyaXB0b3JzIGFyZSBzdG9yZWQgaW4gUElQRURFUzsKKyAgIGJ5dGVzIHdyaXR0ZW4gb24gUElQRURFU1sxXSBjYW4gYmUgcmVhZCBmcm9tIFBJUEVERVNbMF0uCisgICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LiAgKi8KK2V4dGVybiBpbnQgcGlwZSAoaW50IF9fcGlwZWRlc1syXSkgX19USFJPVyBfX3d1cjsKKworLyogU2NoZWR1bGUgYW4gYWxhcm0uICBJbiBTRUNPTkRTIHNlY29uZHMsIHRoZSBwcm9jZXNzIHdpbGwgZ2V0IGEgU0lHQUxSTS4KKyAgIElmIFNFQ09ORFMgaXMgemVybywgYW55IGN1cnJlbnRseSBzY2hlZHVsZWQgYWxhcm0gd2lsbCBiZSBjYW5jZWxsZWQuCisgICBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgcmVtYWluaW5nIHVudGlsIHRoZSBsYXN0CisgICBhbGFybSBzY2hlZHVsZWQgd291bGQgaGF2ZSBzaWduYWxlZCwgb3IgemVybyBpZiB0aGVyZSB3YXNuJ3Qgb25lLgorICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIGFuIGVycm9yLCBidXQgeW91IGNhbiBzZXQgYGVycm5vJworICAgdG8gMCBhbmQgY2hlY2sgaXRzIHZhbHVlIGFmdGVyIGNhbGxpbmcgYGFsYXJtJywgYW5kIHRoaXMgbWlnaHQgdGVsbCB5b3UuCisgICBUaGUgc2lnbmFsIG1heSBjb21lIGxhdGUgZHVlIHRvIHByb2Nlc3NvciBzY2hlZHVsaW5nLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgYWxhcm0gKHVuc2lnbmVkIGludCBfX3NlY29uZHMpIF9fVEhST1c7CisKKy8qIE1ha2UgdGhlIHByb2Nlc3Mgc2xlZXAgZm9yIFNFQ09ORFMgc2Vjb25kcywgb3IgdW50aWwgYSBzaWduYWwgYXJyaXZlcworICAgYW5kIGlzIG5vdCBpZ25vcmVkLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGxlc3MKKyAgIHRoYW4gU0VDT05EUyB3aGljaCBpdCBhY3R1YWxseSBzbGVwdCAodGh1cyB6ZXJvIGlmIGl0IHNsZXB0IHRoZSBmdWxsIHRpbWUpLgorICAgSWYgYSBzaWduYWwgaGFuZGxlciBkb2VzIGEgYGxvbmdqbXAnIG9yIG1vZGlmaWVzIHRoZSBoYW5kbGluZyBvZiB0aGUKKyAgIFNJR0FMUk0gc2lnbmFsIHdoaWxlIGluc2lkZSBgc2xlZXAnIGNhbGwsIHRoZSBoYW5kbGluZyBvZiB0aGUgU0lHQUxSTQorICAgc2lnbmFsIGFmdGVyd2FyZHMgaXMgdW5kZWZpbmVkLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlCisgICBlcnJvciwgYnV0IGlmIGBzbGVlcCcgcmV0dXJucyBTRUNPTkRTLCBpdCBwcm9iYWJseSBkaWRuJ3Qgd29yay4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gdW5zaWduZWQgaW50IHNsZWVwICh1bnNpZ25lZCBpbnQgX19zZWNvbmRzKTsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFNldCBhbiBhbGFybSB0byBnbyBvZmYgKGdlbmVyYXRpbmcgYSBTSUdBTFJNIHNpZ25hbCkgaW4gVkFMVUUKKyAgIG1pY3Jvc2Vjb25kcy4gIElmIElOVEVSVkFMIGlzIG5vbnplcm8sIHdoZW4gdGhlIGFsYXJtIGdvZXMgb2ZmLCB0aGUKKyAgIHRpbWVyIGlzIHJlc2V0IHRvIGdvIG9mZiBldmVyeSBJTlRFUlZBTCBtaWNyb3NlY29uZHMgdGhlcmVhZnRlci4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgcmVtYWluaW5nIGJlZm9yZSB0aGUgYWxhcm0uICAqLworZXh0ZXJuIF9fdXNlY29uZHNfdCB1YWxhcm0gKF9fdXNlY29uZHNfdCBfX3ZhbHVlLCBfX3VzZWNvbmRzX3QgX19pbnRlcnZhbCkKKyAgICAgX19USFJPVzsKKworLyogU2xlZXAgVVNFQ09ORFMgbWljcm9zZWNvbmRzLCBvciB1bnRpbCBhIHNpZ25hbCBhcnJpdmVzIHRoYXQgaXMgbm90IGJsb2NrZWQKKyAgIG9yIGlnbm9yZWQuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGgKKyAgIF9fVEhST1cuICAqLworZXh0ZXJuIGludCB1c2xlZXAgKF9fdXNlY29uZHNfdCBfX3VzZWNvbmRzKTsKKyNlbmRpZgorCisKKy8qIFN1c3BlbmQgdGhlIHByb2Nlc3MgdW50aWwgYSBzaWduYWwgYXJyaXZlcy4KKyAgIFRoaXMgYWx3YXlzIHJldHVybnMgLTEgYW5kIHNldHMgYGVycm5vJyB0byBFSU5UUi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aAorICAgX19USFJPVy4gICovCitleHRlcm4gaW50IHBhdXNlICh2b2lkKTsKKworCisvKiBDaGFuZ2UgdGhlIG93bmVyIGFuZCBncm91cCBvZiBGSUxFLiAgKi8KK2V4dGVybiBpbnQgY2hvd24gKF9fY29uc3QgY2hhciAqX19maWxlLCBfX3VpZF90IF9fb3duZXIsIF9fZ2lkX3QgX19ncm91cCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBDaGFuZ2UgdGhlIG93bmVyIGFuZCBncm91cCBvZiB0aGUgZmlsZSB0aGF0IEZEIGlzIG9wZW4gb24uICAqLworZXh0ZXJuIGludCBmY2hvd24gKGludCBfX2ZkLCBfX3VpZF90IF9fb3duZXIsIF9fZ2lkX3QgX19ncm91cCkgX19USFJPVyBfX3d1cjsKKworCisvKiBDaGFuZ2Ugb3duZXIgYW5kIGdyb3VwIG9mIEZJTEUsIGlmIGl0IGlzIGEgc3ltYm9saWMKKyAgIGxpbmsgdGhlIG93bmVyc2hpcCBvZiB0aGUgc3ltYm9saWMgbGluayBpcyBjaGFuZ2VkLiAgKi8KK2V4dGVybiBpbnQgbGNob3duIChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX191aWRfdCBfX293bmVyLCBfX2dpZF90IF9fZ3JvdXApCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisjZW5kaWYgLyogVXNlIEJTRCB8fCBYL09wZW4gVW5peC4gICovCisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIENoYW5nZSB0aGUgb3duZXIgYW5kIGdyb3VwIG9mIEZJTEUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBGRCBpcyBvcGVuCisgICBvbi4gICovCitleHRlcm4gaW50IGZjaG93bmF0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fdWlkX3QgX19vd25lciwKKwkJICAgICBfX2dpZF90IF9fZ3JvdXAsIGludCBfX2ZsYWcpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMikpIF9fd3VyOworI2VuZGlmIC8qIFVzZSBHTlUuICAqLworCisvKiBDaGFuZ2UgdGhlIHByb2Nlc3MncyB3b3JraW5nIGRpcmVjdG9yeSB0byBQQVRILiAgKi8KK2V4dGVybiBpbnQgY2hkaXIgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIENoYW5nZSB0aGUgcHJvY2VzcydzIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBvbmUgRkQgaXMgb3BlbiBvbi4gICovCitleHRlcm4gaW50IGZjaGRpciAoaW50IF9fZmQpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworLyogR2V0IHRoZSBwYXRobmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKKyAgIGFuZCBwdXQgaXQgaW4gU0laRSBieXRlcyBvZiBCVUYuICBSZXR1cm5zIE5VTEwgaWYgdGhlCisgICBkaXJlY3RvcnkgY291bGRuJ3QgYmUgZGV0ZXJtaW5lZCBvciBTSVpFIHdhcyB0b28gc21hbGwuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIEJVRi4gIEluIEdOVSwgaWYgQlVGIGlzIE5VTEwsCisgICBhbiBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCBgbWFsbG9jJzsgdGhlIGFycmF5IGlzIFNJWkUKKyAgIGJ5dGVzIGxvbmcsIHVubGVzcyBTSVpFID09IDAsIGluIHdoaWNoIGNhc2UgaXQgaXMgYXMKKyAgIGJpZyBhcyBuZWNlc3NhcnkuICAqLworZXh0ZXJuIGNoYXIgKmdldGN3ZCAoY2hhciAqX19idWYsIHNpemVfdCBfX3NpemUpIF9fVEhST1cgX193dXI7CisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIFJldHVybiBhIG1hbGxvYydkIHN0cmluZyBjb250YWluaW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBuYW1lLgorICAgSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBQV0QnIGlzIHNldCwgYW5kIGl0cyB2YWx1ZSBpcyBjb3JyZWN0LAorICAgdGhhdCB2YWx1ZSBpcyB1c2VkLiAgKi8KK2V4dGVybiBjaGFyICpnZXRfY3VycmVudF9kaXJfbmFtZSAodm9pZCkgX19USFJPVzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogUHV0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpbiBCVUYuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gQlVGLiAgSWYgbm90LCBwdXQgYW4gZXJyb3IgbWVzc2FnZSBpbgorICAgQlVGIGFuZCByZXR1cm4gTlVMTC4gIEJVRiBzaG91bGQgYmUgYXQgbGVhc3QgUEFUSF9NQVggYnl0ZXMgbG9uZy4gICovCitleHRlcm4gY2hhciAqZ2V0d2QgKGNoYXIgKl9fYnVmKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX2F0dHJpYnV0ZV9kZXByZWNhdGVkX18gX193dXI7CisjZW5kaWYKKworCisvKiBEdXBsaWNhdGUgRkQsIHJldHVybmluZyBhIG5ldyBmaWxlIGRlc2NyaXB0b3Igb24gdGhlIHNhbWUgZmlsZS4gICovCitleHRlcm4gaW50IGR1cCAoaW50IF9fZmQpIF9fVEhST1cgX193dXI7CisKKy8qIER1cGxpY2F0ZSBGRCB0byBGRDIsIGNsb3NpbmcgRkQyIGFuZCBtYWtpbmcgaXQgb3BlbiBvbiB0aGUgc2FtZSBmaWxlLiAgKi8KK2V4dGVybiBpbnQgZHVwMiAoaW50IF9fZmQsIGludCBfX2ZkMikgX19USFJPVzsKKworLyogTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mICJOQU1FPVZBTFVFIiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworZXh0ZXJuIGNoYXIgKipfX2Vudmlyb247CisjaWZkZWYgX19VU0VfR05VCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKworCisvKiBSZXBsYWNlIHRoZSBjdXJyZW50IHByb2Nlc3MsIGV4ZWN1dGluZyBQQVRIIHdpdGggYXJndW1lbnRzIEFSR1YgYW5kCisgICBlbnZpcm9ubWVudCBFTlZQLiAgQVJHViBhbmQgRU5WUCBhcmUgdGVybWluYXRlZCBieSBOVUxMIHBvaW50ZXJzLiAgKi8KK2V4dGVybiBpbnQgZXhlY3ZlIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwKKwkJICAgY2hhciAqX19jb25zdCBfX2VudnBbXSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIEV4ZWN1dGUgdGhlIGZpbGUgRkQgcmVmZXJzIHRvLCBvdmVybGF5aW5nIHRoZSBydW5uaW5nIHByb2dyYW0gaW1hZ2UuCisgICBBUkdWIGFuZCBFTlZQIGFyZSBwYXNzZWQgdG8gdGhlIG5ldyBwcm9ncmFtLCBhcyBmb3IgYGV4ZWN2ZScuICAqLworZXh0ZXJuIGludCBmZXhlY3ZlIChpbnQgX19mZCwgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSwgY2hhciAqX19jb25zdCBfX2VudnBbXSkKKyAgICAgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIEV4ZWN1dGUgUEFUSCB3aXRoIGFyZ3VtZW50cyBBUkdWIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWN2IChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgY2hhciAqX19jb25zdCBfX2FyZ3ZbXSkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKy8qIEV4ZWN1dGUgUEFUSCB3aXRoIGFsbCBhcmd1bWVudHMgYWZ0ZXIgUEFUSCB1bnRpbCBhIE5VTEwgcG9pbnRlciwKKyAgIGFuZCB0aGUgYXJndW1lbnQgYWZ0ZXIgdGhhdCBmb3IgZW52aXJvbm1lbnQuICAqLworZXh0ZXJuIGludCBleGVjbGUgKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX2NvbnN0IGNoYXIgKl9fYXJnLCAuLi4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBFeGVjdXRlIFBBVEggd2l0aCBhbGwgYXJndW1lbnRzIGFmdGVyIFBBVEggdW50aWwKKyAgIGEgTlVMTCBwb2ludGVyIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWNsIChfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19jb25zdCBjaGFyICpfX2FyZywgLi4uKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRXhlY3V0ZSBGSUxFLCBzZWFyY2hpbmcgaW4gdGhlIGBQQVRIJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBjb250YWlucworICAgbm8gc2xhc2hlcywgd2l0aCBhcmd1bWVudHMgQVJHViBhbmQgZW52aXJvbm1lbnQgZnJvbSBgZW52aXJvbicuICAqLworZXh0ZXJuIGludCBleGVjdnAgKF9fY29uc3QgY2hhciAqX19maWxlLCBjaGFyICpfX2NvbnN0IF9fYXJndltdKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworLyogRXhlY3V0ZSBGSUxFLCBzZWFyY2hpbmcgaW4gdGhlIGBQQVRIJyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZgorICAgaXQgY29udGFpbnMgbm8gc2xhc2hlcywgd2l0aCBhbGwgYXJndW1lbnRzIGFmdGVyIEZJTEUgdW50aWwgYQorICAgTlVMTCBwb2ludGVyIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBlbnZpcm9uJy4gICovCitleHRlcm4gaW50IGV4ZWNscCAoX19jb25zdCBjaGFyICpfX2ZpbGUsIF9fY29uc3QgY2hhciAqX19hcmcsIC4uLikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworI2lmIGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOCisvKiBBZGQgSU5DIHRvIHByaW9yaXR5IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBuaWNlIChpbnQgX19pbmMpIF9fVEhST1cgX193dXI7CisjZW5kaWYKKworCisvKiBUZXJtaW5hdGUgcHJvZ3JhbSBleGVjdXRpb24gd2l0aCB0aGUgbG93LW9yZGVyIDggYml0cyBvZiBTVEFUVVMuICAqLworZXh0ZXJuIHZvaWQgX2V4aXQgKGludCBfX3N0YXR1cykgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisKKy8qIEdldCB0aGUgYF9QQ18qJyBzeW1ib2xzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgcGF0aGNvbmYnIGFuZCBgZnBhdGhjb25mJzsKKyAgIHRoZSBgX1NDXyonIHN5bWJvbHMgZm9yIHRoZSBOQU1FIGFyZ3VtZW50IHRvIGBzeXNjb25mJzsKKyAgIGFuZCB0aGUgYF9DU18qJyBzeW1ib2xzIGZvciB0aGUgTkFNRSBhcmd1bWVudCB0byBgY29uZnN0cicuICAqLworI2luY2x1ZGUgPGJpdHMvY29uZm5hbWUuaD4KKworLyogR2V0IGZpbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBQQVRILiAgKi8KK2V4dGVybiBsb25nIGludCBwYXRoY29uZiAoX19jb25zdCBjaGFyICpfX3BhdGgsIGludCBfX25hbWUpCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpOworCisvKiBHZXQgZmlsZS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGFib3V0IGRlc2NyaXB0b3IgRkQuICAqLworZXh0ZXJuIGxvbmcgaW50IGZwYXRoY29uZiAoaW50IF9fZmQsIGludCBfX25hbWUpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5c3RlbSB2YXJpYWJsZSBOQU1FLiAgKi8KK2V4dGVybiBsb25nIGludCBzeXNjb25mIChpbnQgX19uYW1lKSBfX1RIUk9XOworCisjaWZkZWYJX19VU0VfUE9TSVgyCisvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzdHJpbmctdmFsdWVkIHN5c3RlbSB2YXJpYWJsZSBOQU1FLiAgKi8KK2V4dGVybiBzaXplX3QgY29uZnN0ciAoaW50IF9fbmFtZSwgY2hhciAqX19idWYsIHNpemVfdCBfX2xlbikgX19USFJPVzsKKyNlbmRpZgorCisKKy8qIEdldCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3BpZF90IGdldHBpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBwcm9jZXNzIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MncyBwYXJlbnQuICAqLworZXh0ZXJuIF9fcGlkX3QgZ2V0cHBpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBwcm9jZXNzIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgICBUaGlzIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCBvbiBvbGQgQlNELiAqLworI2lmbmRlZiBfX0ZBVk9SX0JTRAorZXh0ZXJuIF9fcGlkX3QgZ2V0cGdycCAodm9pZCkgX19USFJPVzsKKyNlbHNlCisjIGlmZGVmIF9fUkVESVJFQ1RfTlRICitleHRlcm4gX19waWRfdCBfX1JFRElSRUNUX05USCAoZ2V0cGdycCwgKF9fcGlkX3QgX19waWQpLCBfX2dldHBnaWQpOworIyBlbHNlCisjICBkZWZpbmUgZ2V0cGdycCBfX2dldHBnaWQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBHZXQgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgcHJvY2VzcyBQSUQuICAqLworZXh0ZXJuIF9fcGlkX3QgX19nZXRwZ2lkIChfX3BpZF90IF9fcGlkKSBfX1RIUk9XOworI2lmZGVmIF9fVVNFX1hPUEVOX0VYVEVOREVECitleHRlcm4gX19waWRfdCBnZXRwZ2lkIChfX3BpZF90IF9fcGlkKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogU2V0IHRoZSBwcm9jZXNzIGdyb3VwIElEIG9mIHRoZSBwcm9jZXNzIG1hdGNoaW5nIFBJRCB0byBQR0lELgorICAgSWYgUElEIGlzIHplcm8sIHRoZSBjdXJyZW50IHByb2Nlc3MncyBwcm9jZXNzIGdyb3VwIElEIGlzIHNldC4KKyAgIElmIFBHSUQgaXMgemVybywgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgaXMgdXNlZC4gICovCitleHRlcm4gaW50IHNldHBnaWQgKF9fcGlkX3QgX19waWQsIF9fcGlkX3QgX19wZ2lkKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX1VTRV9TVklEIHx8IGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIEJvdGggU3lzdGVtIFYgYW5kIEJTRCBoYXZlIGBzZXRwZ3JwJyBmdW5jdGlvbnMsIGJ1dCB3aXRoIGRpZmZlcmVudAorICAgY2FsbGluZyBjb252ZW50aW9ucy4gIFRoZSBCU0QgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgUE9TSVguMSBgc2V0cGdpZCcKKyAgIChhYm92ZSkuICBUaGUgU3lzdGVtIFYgZnVuY3Rpb24gdGFrZXMgbm8gYXJndW1lbnRzIGFuZCBwdXRzIHRoZSBjYWxsaW5nCisgICBwcm9jZXNzIGluIGl0cyBvbiBncm91cCBsaWtlIGBzZXRwZ2lkICgwLCAwKScuCisKKyAgIE5ldyBwcm9ncmFtcyBzaG91bGQgYWx3YXlzIHVzZSBgc2V0cGdpZCcgaW5zdGVhZC4KKworICAgVGhlIGRlZmF1bHQgaW4gR05VIGlzIHRvIHByb3ZpZGUgdGhlIFN5c3RlbSBWIGZ1bmN0aW9uLiAgVGhlIEJTRAorICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHVuZGVyIC1EX0JTRF9TT1VSQ0UuICAqLworCisjIGlmbmRlZiBfX0ZBVk9SX0JTRAorCisvKiBTZXQgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBpdHMgb3duIFBJRC4KKyAgIFRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBgc2V0cGdpZCAoMCwgMCknLiAgKi8KK2V4dGVybiBpbnQgc2V0cGdycCAodm9pZCkgX19USFJPVzsKKworIyBlbHNlCisKKy8qIEFub3RoZXIgbmFtZSBmb3IgYHNldHBnaWQnIChhYm92ZSkuICAqLworIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHNldHBncnAsIChfX3BpZF90IF9fcGlkLCBfX3BpZF90IF9fcGdycCksIHNldHBnaWQpOworIyAgZWxzZQorIyAgIGRlZmluZSBzZXRwZ3JwIHNldHBnaWQKKyMgIGVuZGlmCisKKyMgZW5kaWYJLyogRmF2b3IgQlNELiAgKi8KKyNlbmRpZgkvKiBVc2UgU1ZJRCBvciBCU0QuICAqLworCisvKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiB3aXRoIHRoZSBjYWxsaW5nIHByb2Nlc3MgYXMgaXRzIGxlYWRlci4KKyAgIFRoZSBwcm9jZXNzIGdyb3VwIElEcyBvZiB0aGUgc2Vzc2lvbiBhbmQgdGhlIGNhbGxpbmcgcHJvY2VzcworICAgYXJlIHNldCB0byB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLCB3aGljaCBpcyByZXR1cm5lZC4gICovCitleHRlcm4gX19waWRfdCBzZXRzaWQgKHZvaWQpIF9fVEhST1c7CisKKyNpZmRlZiBfX1VTRV9YT1BFTl9FWFRFTkRFRAorLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIHRoZSBnaXZlbiBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3BpZF90IGdldHNpZCAoX19waWRfdCBfX3BpZCkgX19USFJPVzsKKyNlbmRpZgorCisvKiBHZXQgdGhlIHJlYWwgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3VpZF90IGdldHVpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3VpZF90IGdldGV1aWQgKHZvaWQpIF9fVEhST1c7CisKKy8qIEdldCB0aGUgcmVhbCBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX2dpZF90IGdldGdpZCAodm9pZCkgX19USFJPVzsKKworLyogR2V0IHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gICovCitleHRlcm4gX19naWRfdCBnZXRlZ2lkICh2b2lkKSBfX1RIUk9XOworCisvKiBJZiBTSVpFIGlzIHplcm8sIHJldHVybiB0aGUgbnVtYmVyIG9mIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCisgICB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIGluLiAgT3RoZXJ3aXNlLCBmaWxsIGluIHRoZSBncm91cCBJRHMKKyAgIG9mIGl0cyBzdXBwbGVtZW50YXJ5IGdyb3VwcyBpbiBMSVNUIGFuZCByZXR1cm4gdGhlIG51bWJlciB3cml0dGVuLiAgKi8KK2V4dGVybiBpbnQgZ2V0Z3JvdXBzIChpbnQgX19zaXplLCBfX2dpZF90IF9fbGlzdFtdKSBfX1RIUk9XIF9fd3VyOworCisjaWZkZWYJX19VU0VfR05VCisvKiBSZXR1cm4gbm9uemVybyBpZmYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBpbiBncm91cCBHSUQuICAqLworZXh0ZXJuIGludCBncm91cF9tZW1iZXIgKF9fZ2lkX3QgX19naWQpIF9fVEhST1c7CisjZW5kaWYKKworLyogU2V0IHRoZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gVUlELgorICAgSWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyB0aGUgc3VwZXItdXNlciwgc2V0IHRoZSByZWFsCisgICBhbmQgZWZmZWN0aXZlIHVzZXIgSURzLCBhbmQgdGhlIHNhdmVkIHNldC11c2VyLUlEIHRvIFVJRDsKKyAgIGlmIG5vdCwgdGhlIGVmZmVjdGl2ZSB1c2VyIElEIGlzIHNldCB0byBVSUQuICAqLworZXh0ZXJuIGludCBzZXR1aWQgKF9fdWlkX3QgX191aWQpIF9fVEhST1c7CisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVECisvKiBTZXQgdGhlIHJlYWwgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFJVSUQsCisgICBhbmQgdGhlIGVmZmVjdGl2ZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gRVVJRC4gICovCitleHRlcm4gaW50IHNldHJldWlkIChfX3VpZF90IF9fcnVpZCwgX191aWRfdCBfX2V1aWQpIF9fVEhST1c7CisjZW5kaWYKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySworLyogU2V0IHRoZSBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFVJRC4gICovCitleHRlcm4gaW50IHNldGV1aWQgKF9fdWlkX3QgX191aWQpIF9fVEhST1c7CisjZW5kaWYgLyogVXNlIEJTRC4gICovCisKKy8qIFNldCB0aGUgZ3JvdXAgSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byBHSUQuCisgICBJZiB0aGUgY2FsbGluZyBwcm9jZXNzIGlzIHRoZSBzdXBlci11c2VyLCBzZXQgdGhlIHJlYWwKKyAgIGFuZCBlZmZlY3RpdmUgZ3JvdXAgSURzLCBhbmQgdGhlIHNhdmVkIHNldC1ncm91cC1JRCB0byBHSUQ7CisgICBpZiBub3QsIHRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgaXMgc2V0IHRvIEdJRC4gICovCitleHRlcm4gaW50IHNldGdpZCAoX19naWRfdCBfX2dpZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIFNldCB0aGUgcmVhbCBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFJHSUQsCisgICBhbmQgdGhlIGVmZmVjdGl2ZSBncm91cCBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIEVHSUQuICAqLworZXh0ZXJuIGludCBzZXRyZWdpZCAoX19naWRfdCBfX3JnaWQsIF9fZ2lkX3QgX19lZ2lkKSBfX1RIUk9XOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIFNldCB0aGUgZWZmZWN0aXZlIGdyb3VwIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gR0lELiAgKi8KK2V4dGVybiBpbnQgc2V0ZWdpZCAoX19naWRfdCBfX2dpZCkgX19USFJPVzsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorLyogRmV0Y2ggdGhlIHJlYWwgdXNlciBJRCwgZWZmZWN0aXZlIHVzZXIgSUQsIGFuZCBzYXZlZC1zZXQgdXNlciBJRCwKKyAgIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICAqLworZXh0ZXJuIGludCBnZXRyZXN1aWQgKF9fdWlkX3QgKl9fcnVpZCwgX191aWRfdCAqX19ldWlkLCBfX3VpZF90ICpfX3N1aWQpCisgICAgIF9fVEhST1c7CisKKy8qIEZldGNoIHRoZSByZWFsIGdyb3VwIElELCBlZmZlY3RpdmUgZ3JvdXAgSUQsIGFuZCBzYXZlZC1zZXQgZ3JvdXAgSUQsCisgICBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiAgKi8KK2V4dGVybiBpbnQgZ2V0cmVzZ2lkIChfX2dpZF90ICpfX3JnaWQsIF9fZ2lkX3QgKl9fZWdpZCwgX19naWRfdCAqX19zZ2lkKQorICAgICBfX1RIUk9XOworCisvKiBTZXQgdGhlIHJlYWwgdXNlciBJRCwgZWZmZWN0aXZlIHVzZXIgSUQsIGFuZCBzYXZlZC1zZXQgdXNlciBJRCwKKyAgIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8gUlVJRCwgRVVJRCwgYW5kIFNVSUQsIHJlc3BlY3RpdmVseS4gICovCitleHRlcm4gaW50IHNldHJlc3VpZCAoX191aWRfdCBfX3J1aWQsIF9fdWlkX3QgX19ldWlkLCBfX3VpZF90IF9fc3VpZCkKKyAgICAgX19USFJPVzsKKworLyogU2V0IHRoZSByZWFsIGdyb3VwIElELCBlZmZlY3RpdmUgZ3JvdXAgSUQsIGFuZCBzYXZlZC1zZXQgZ3JvdXAgSUQsCisgICBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIFJHSUQsIEVHSUQsIGFuZCBTR0lELCByZXNwZWN0aXZlbHkuICAqLworZXh0ZXJuIGludCBzZXRyZXNnaWQgKF9fZ2lkX3QgX19yZ2lkLCBfX2dpZF90IF9fZWdpZCwgX19naWRfdCBfX3NnaWQpCisgICAgIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBDbG9uZSB0aGUgY2FsbGluZyBwcm9jZXNzLCBjcmVhdGluZyBhbiBleGFjdCBjb3B5LgorICAgUmV0dXJuIC0xIGZvciBlcnJvcnMsIDAgdG8gdGhlIG5ldyBwcm9jZXNzLAorICAgYW5kIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBuZXcgcHJvY2VzcyB0byB0aGUgb2xkIHByb2Nlc3MuICAqLworZXh0ZXJuIF9fcGlkX3QgZm9yayAodm9pZCkgX19USFJPVzsKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKy8qIENsb25lIHRoZSBjYWxsaW5nIHByb2Nlc3MsIGJ1dCB3aXRob3V0IGNvcHlpbmcgdGhlIHdob2xlIGFkZHJlc3Mgc3BhY2UuCisgICBUaGUgY2FsbGluZyBwcm9jZXNzIGlzIHN1c3BlbmRlZCB1bnRpbCB0aGUgbmV3IHByb2Nlc3MgZXhpdHMgb3IgaXMKKyAgIHJlcGxhY2VkIGJ5IGEgY2FsbCB0byBgZXhlY3ZlJy4gIFJldHVybiAtMSBmb3IgZXJyb3JzLCAwIHRvIHRoZSBuZXcgcHJvY2VzcywKKyAgIGFuZCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgbmV3IHByb2Nlc3MgdG8gdGhlIG9sZCBwcm9jZXNzLiAgKi8KK2V4dGVybiBfX3BpZF90IHZmb3JrICh2b2lkKSBfX1RIUk9XOworI2VuZGlmIC8qIFVzZSBCU0QuICovCisKKworLyogUmV0dXJuIHRoZSBwYXRobmFtZSBvZiB0aGUgdGVybWluYWwgRkQgaXMgb3BlbiBvbiwgb3IgTlVMTCBvbiBlcnJvcnMuCisgICBUaGUgcmV0dXJuZWQgc3RvcmFnZSBpcyBnb29kIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLiAgKi8KK2V4dGVybiBjaGFyICp0dHluYW1lIChpbnQgX19mZCkgX19USFJPVzsKKworLyogU3RvcmUgYXQgbW9zdCBCVUZMRU4gY2hhcmFjdGVycyBvZiB0aGUgcGF0aG5hbWUgb2YgdGhlIHRlcm1pbmFsIEZEIGlzCisgICBvcGVuIG9uIGluIEJVRi4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBudW1iZXIuICAqLworZXh0ZXJuIGludCB0dHluYW1lX3IgKGludCBfX2ZkLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKSBfX3d1cjsKKworLyogUmV0dXJuIDEgaWYgRkQgaXMgYSB2YWxpZCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQKKyAgIHdpdGggYSB0ZXJtaW5hbCwgemVybyBpZiBub3QuICAqLworZXh0ZXJuIGludCBpc2F0dHkgKGludCBfX2ZkKSBfX1RIUk9XOworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgXAorICAgIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OCkKKy8qIFJldHVybiB0aGUgaW5kZXggaW50byB0aGUgYWN0aXZlLWxvZ2lucyBmaWxlICh1dG1wKSBmb3IKKyAgIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gaW50IHR0eXNsb3QgKHZvaWQpIF9fVEhST1c7CisjZW5kaWYKKworCisvKiBNYWtlIGEgbGluayB0byBGUk9NIG5hbWVkIFRPLiAgKi8KK2V4dGVybiBpbnQgbGluayAoX19jb25zdCBjaGFyICpfX2Zyb20sIF9fY29uc3QgY2hhciAqX190bykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSkgX193dXI7CisKKyNpZmRlZiBfX1VTRV9BVEZJTEUKKy8qIExpa2UgbGluayBidXQgcmVsYXRpdmUgcGF0aHMgaW4gVE8gYW5kIEZST00gYXJlIGludGVycHJldGVkIHJlbGF0aXZlCisgICB0byBGUk9NRkQgYW5kIFRPRkQgcmVzcGVjdGl2ZWx5LiAgKi8KK2V4dGVybiBpbnQgbGlua2F0IChpbnQgX19mcm9tZmQsIF9fY29uc3QgY2hhciAqX19mcm9tLCBpbnQgX190b2ZkLAorCQkgICBfX2NvbnN0IGNoYXIgKl9fdG8sIGludCBfX2ZsYWdzKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIsIDQpKSBfX3d1cjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKy8qIE1ha2UgYSBzeW1ib2xpYyBsaW5rIHRvIEZST00gbmFtZWQgVE8uICAqLworZXh0ZXJuIGludCBzeW1saW5rIChfX2NvbnN0IGNoYXIgKl9fZnJvbSwgX19jb25zdCBjaGFyICpfX3RvKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKKworLyogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHN5bWJvbGljIGxpbmsgUEFUSCBpbnRvIG5vIG1vcmUgdGhhbgorICAgTEVOIGJ5dGVzIG9mIEJVRi4gIFRoZSBjb250ZW50cyBhcmUgbm90IG51bGwtdGVybWluYXRlZC4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIC0xIGZvciBlcnJvcnMuICAqLworZXh0ZXJuIHNzaXplX3QgcmVhZGxpbmsgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3BhdGgsCisJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKSBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgQlNELiAgKi8KKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogTGlrZSBzeW1saW5rIGJ1dCBhIHJlbGF0aXZlIHBhdGggaW4gVE8gaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gVE9GRC4gICovCitleHRlcm4gaW50IHN5bWxpbmthdCAoX19jb25zdCBjaGFyICpfX2Zyb20sIGludCBfX3RvZmQsCisJCSAgICAgIF9fY29uc3QgY2hhciAqX190bykgX19USFJPVyBfX25vbm51bGwgKCgxLCAzKSkgX193dXI7CisKKy8qIExpa2UgcmVhZGxpbmsgYnV0IGEgcmVsYXRpdmUgUEFUSCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byBGRC4gICovCitleHRlcm4gc3NpemVfdCByZWFkbGlua2F0IChpbnQgX19mZCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcGF0aCwKKwkJCSAgIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgyLCAzKSkgX193dXI7CisjZW5kaWYKKworLyogUmVtb3ZlIHRoZSBsaW5rIE5BTUUuICAqLworZXh0ZXJuIGludCB1bmxpbmsgKF9fY29uc3QgY2hhciAqX19uYW1lKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworI2lmZGVmIF9fVVNFX0FURklMRQorLyogUmVtb3ZlIHRoZSBsaW5rIE5BTUUgcmVsYXRpdmUgdG8gRkQuICAqLworZXh0ZXJuIGludCB1bmxpbmthdCAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19uYW1lLCBpbnQgX19mbGFnKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDIpKTsKKyNlbmRpZgorCisvKiBSZW1vdmUgdGhlIGRpcmVjdG9yeSBQQVRILiAgKi8KK2V4dGVybiBpbnQgcm1kaXIgKF9fY29uc3QgY2hhciAqX19wYXRoKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBSZXR1cm4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBJRCBvZiBGRC4gICovCitleHRlcm4gX19waWRfdCB0Y2dldHBncnAgKGludCBfX2ZkKSBfX1RIUk9XOworCisvKiBTZXQgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBJRCBvZiBGRCBzZXQgUEdSUF9JRC4gICovCitleHRlcm4gaW50IHRjc2V0cGdycCAoaW50IF9fZmQsIF9fcGlkX3QgX19wZ3JwX2lkKSBfX1RIUk9XOworCisKKy8qIFJldHVybiB0aGUgbG9naW4gbmFtZSBvZiB0aGUgdXNlci4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGNoYXIgKmdldGxvZ2luICh2b2lkKTsKKyNpZiBkZWZpbmVkIF9fVVNFX1JFRU5UUkFOVCB8fCBkZWZpbmVkIF9fVVNFX1BPU0lYMTk5NTA2CisvKiBSZXR1cm4gYXQgbW9zdCBOQU1FX0xFTiBjaGFyYWN0ZXJzIG9mIHRoZSBsb2dpbiBuYW1lIG9mIHRoZSB1c2VyIGluIE5BTUUuCisgICBJZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBvciBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkLCByZXR1cm4gdGhlIGVycm9yCisgICBjb2RlLiAgT3RoZXJ3aXNlIHJldHVybiAwLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IGdldGxvZ2luX3IgKGNoYXIgKl9fbmFtZSwgc2l6ZV90IF9fbmFtZV9sZW4pIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisjaWZkZWYJX19VU0VfQlNECisvKiBTZXQgdGhlIGxvZ2luIG5hbWUgcmV0dXJuZWQgYnkgYGdldGxvZ2luJy4gICovCitleHRlcm4gaW50IHNldGxvZ2luIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisjZW5kaWYKKworCisjaWZkZWYJX19VU0VfUE9TSVgyCisvKiBHZXQgZGVmaW5pdGlvbnMgYW5kIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyB0byBwcm9jZXNzIHRoZQorICAgYXJndW1lbnRzIGluIEFSR1YgKEFSR0Mgb2YgdGhlbSwgbWludXMgdGhlIHByb2dyYW0gbmFtZSkgZm9yCisgICBvcHRpb25zIGdpdmVuIGluIE9QVFMuICAqLworIyBkZWZpbmUgX19uZWVkX2dldG9wdAorIyBpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorLyogUHV0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGhvc3QgaW4gbm8gbW9yZSB0aGFuIExFTiBieXRlcyBvZiBOQU1FLgorICAgVGhlIHJlc3VsdCBpcyBudWxsLXRlcm1pbmF0ZWQgaWYgTEVOIGlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIGZ1bGwKKyAgIG5hbWUgYW5kIHRoZSB0ZXJtaW5hdG9yLiAgKi8KK2V4dGVybiBpbnQgZ2V0aG9zdG5hbWUgKGNoYXIgKl9fbmFtZSwgc2l6ZV90IF9fbGVuKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkIF9fVVNFX0JTRCB8fCAoZGVmaW5lZCBfX1VTRV9YT1BFTiAmJiAhZGVmaW5lZCBfX1VTRV9VTklYOTgpCisvKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgaG9zdCB0byBOQU1FLCB3aGljaCBpcyBMRU4gYnl0ZXMgbG9uZy4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0aG9zdG5hbWUgKF9fY29uc3QgY2hhciAqX19uYW1lLCBzaXplX3QgX19sZW4pCisgICAgIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisvKiBTZXQgdGhlIGN1cnJlbnQgbWFjaGluZSdzIEludGVybmV0IG51bWJlciB0byBJRC4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgc2V0aG9zdGlkIChsb25nIGludCBfX2lkKSBfX1RIUk9XIF9fd3VyOworCisKKy8qIEdldCBhbmQgc2V0IHRoZSBOSVMgKGFrYSBZUCkgZG9tYWluIG5hbWUsIGlmIGFueS4KKyAgIENhbGxlZCBqdXN0IGxpa2UgYGdldGhvc3RuYW1lJyBhbmQgYHNldGhvc3RuYW1lJy4KKyAgIFRoZSBOSVMgZG9tYWluIG5hbWUgaXMgdXN1YWxseSB0aGUgZW1wdHkgc3RyaW5nIHdoZW4gbm90IHVzaW5nIE5JUy4gICovCitleHRlcm4gaW50IGdldGRvbWFpbm5hbWUgKGNoYXIgKl9fbmFtZSwgc2l6ZV90IF9fbGVuKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKK2V4dGVybiBpbnQgc2V0ZG9tYWlubmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUsIHNpemVfdCBfX2xlbikKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKworLyogUmV2b2tlIGFjY2VzcyBwZXJtaXNzaW9ucyB0byBhbGwgcHJvY2Vzc2VzIGN1cnJlbnRseSBjb21tdW5pY2F0aW5nCisgICB3aXRoIHRoZSBjb250cm9sIHRlcm1pbmFsLCBhbmQgdGhlbiBzZW5kIGEgU0lHSFVQIHNpZ25hbCB0byB0aGUgcHJvY2VzcworICAgZ3JvdXAgb2YgdGhlIGNvbnRyb2wgdGVybWluYWwuICAqLworZXh0ZXJuIGludCB2aGFuZ3VwICh2b2lkKSBfX1RIUk9XOworCisvKiBSZXZva2UgdGhlIGFjY2VzcyBvZiBhbGwgZGVzY3JpcHRvcnMgY3VycmVudGx5IG9wZW4gb24gRklMRS4gICovCitleHRlcm4gaW50IHJldm9rZSAoX19jb25zdCBjaGFyICpfX2ZpbGUpIF9fVEhST1cgX19ub25udWxsICgoMSkpIF9fd3VyOworCisKKy8qIEVuYWJsZSBzdGF0aXN0aWNhbCBwcm9maWxpbmcsIHdyaXRpbmcgc2FtcGxlcyBvZiB0aGUgUEMgaW50byBhdCBtb3N0CisgICBTSVpFIGJ5dGVzIG9mIFNBTVBMRV9CVUZGRVI7IGV2ZXJ5IHByb2Nlc3NvciBjbG9jayB0aWNrIHdoaWxlIHByb2ZpbGluZworICAgaXMgZW5hYmxlZCwgdGhlIHN5c3RlbSBleGFtaW5lcyB0aGUgdXNlciBQQyBhbmQgaW5jcmVtZW50cworICAgU0FNUExFX0JVRkZFUlsoKFBDIC0gT0ZGU0VUKSAvIDIpICogU0NBTEUgLyA2NTUzNl0uICBJZiBTQ0FMRSBpcyB6ZXJvLAorICAgZGlzYWJsZSBwcm9maWxpbmcuICBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICAqLworZXh0ZXJuIGludCBwcm9maWwgKHVuc2lnbmVkIHNob3J0IGludCAqX19zYW1wbGVfYnVmZmVyLCBzaXplX3QgX19zaXplLAorCQkgICBzaXplX3QgX19vZmZzZXQsIHVuc2lnbmVkIGludCBfX3NjYWxlKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKTsKKworCisvKiBUdXJuIGFjY291bnRpbmcgb24gaWYgTkFNRSBpcyBhbiBleGlzdGluZyBmaWxlLiAgVGhlIHN5c3RlbSB3aWxsIHRoZW4gd3JpdGUKKyAgIGEgcmVjb3JkIGZvciBlYWNoIHByb2Nlc3MgYXMgaXQgdGVybWluYXRlcywgdG8gdGhpcyBmaWxlLiAgSWYgTkFNRSBpcyBOVUxMLAorICAgdHVybiBhY2NvdW50aW5nIG9mZi4gIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgYWNjdCAoX19jb25zdCBjaGFyICpfX25hbWUpIF9fVEhST1c7CisKKworLyogU3VjY2Vzc2l2ZSBjYWxscyByZXR1cm4gdGhlIHNoZWxscyBsaXN0ZWQgaW4gYC9ldGMvc2hlbGxzJy4gICovCitleHRlcm4gY2hhciAqZ2V0dXNlcnNoZWxsICh2b2lkKSBfX1RIUk9XOworZXh0ZXJuIHZvaWQgZW5kdXNlcnNoZWxsICh2b2lkKSBfX1RIUk9XOyAvKiBEaXNjYXJkIGNhY2hlZCBpbmZvLiAgKi8KK2V4dGVybiB2b2lkIHNldHVzZXJzaGVsbCAodm9pZCkgX19USFJPVzsgLyogUmV3aW5kIGFuZCByZS1yZWFkIHRoZSBmaWxlLiAgKi8KKworCisvKiBQdXQgdGhlIHByb2dyYW0gaW4gdGhlIGJhY2tncm91bmQsIGFuZCBkaXNzb2NpYXRlIGZyb20gdGhlIGNvbnRyb2xsaW5nCisgICB0ZXJtaW5hbC4gIElmIE5PQ0hESVIgaXMgemVybywgZG8gYGNoZGlyICgiLyIpJy4gIElmIE5PQ0xPU0UgaXMgemVybywKKyAgIHJlZGlyZWN0cyBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyIHRvIC9kZXYvbnVsbC4gICovCitleHRlcm4gaW50IGRhZW1vbiAoaW50IF9fbm9jaGRpciwgaW50IF9fbm9jbG9zZSkgX19USFJPVyBfX3d1cjsKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3Blbi4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IChkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1hPUEVOMkspCisvKiBNYWtlIFBBVEggYmUgdGhlIHJvb3QgZGlyZWN0b3J5ICh0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFic29sdXRlIHBhdGhzKS4KKyAgIFRoaXMgY2FsbCBpcyByZXN0cmljdGVkIHRvIHRoZSBzdXBlci11c2VyLiAgKi8KK2V4dGVybiBpbnQgY2hyb290IChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgX19USFJPVyBfX25vbm51bGwgKCgxKSkgX193dXI7CisKKy8qIFByb21wdCB3aXRoIFBST01QVCBhbmQgcmVhZCBhIHN0cmluZyBmcm9tIHRoZSB0ZXJtaW5hbCB3aXRob3V0IGVjaG9pbmcuCisgICBVc2VzIC9kZXYvdHR5IGlmIHBvc3NpYmxlOyBvdGhlcndpc2Ugc3RkZXJyIGFuZCBzdGRpbi4gICovCitleHRlcm4gY2hhciAqZ2V0cGFzcyAoX19jb25zdCBjaGFyICpfX3Byb21wdCkgX19ub25udWxsICgoMSkpOworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuLiAgKi8KKworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTgorLyogTWFrZSBhbGwgY2hhbmdlcyBkb25lIHRvIEZEIGFjdHVhbGx5IGFwcGVhciBvbiBkaXNrLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnN5bmMgKGludCBfX2ZkKTsKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3Blbi4gICovCisKKworI2lmIGRlZmluZWQgX19VU0VfQlNEIHx8IGRlZmluZWQgX19VU0VfWE9QRU5fRVhURU5ERUQKKworLyogUmV0dXJuIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGhvc3QuICAqLworZXh0ZXJuIGxvbmcgaW50IGdldGhvc3RpZCAodm9pZCk7CisKKy8qIE1ha2UgYWxsIGNoYW5nZXMgZG9uZSB0byBhbGwgZmlsZXMgYWN0dWFsbHkgYXBwZWFyIG9uIGRpc2suICAqLworZXh0ZXJuIHZvaWQgc3luYyAodm9pZCkgX19USFJPVzsKKworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHBhZ2UuICBUaGlzIGlzIHRoZSBzeXN0ZW0ncyBwYWdlIHNpemUsCisgICB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIGhhcmR3YXJlIHBhZ2Ugc2l6ZS4gICovCitleHRlcm4gaW50IGdldHBhZ2VzaXplICh2b2lkKSAgX19USFJPVyBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CisKKworLyogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisgICB0aGUgY3VycmVudCBwcm9jZXNzIGNvdWxkIHBvc3NpYmx5IGhhdmUuICAqLworZXh0ZXJuIGludCBnZXRkdGFibGVzaXplICh2b2lkKSBfX1RIUk9XOworCisKKy8qIFRydW5jYXRlIEZJTEUgdG8gTEVOR1RIIGJ5dGVzLiAgKi8KKyMgaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKK2V4dGVybiBpbnQgdHJ1bmNhdGUgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX29mZl90IF9fbGVuZ3RoKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZWxzZQorIyAgaWZkZWYgX19SRURJUkVDVF9OVEgKK2V4dGVybiBpbnQgX19SRURJUkVDVF9OVEggKHRydW5jYXRlLAorCQkJICAgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX29mZjY0X3QgX19sZW5ndGgpLAorCQkJICAgdHJ1bmNhdGU2NCkgX19ub25udWxsICgoMSkpIF9fd3VyOworIyAgZWxzZQorIyAgIGRlZmluZSB0cnVuY2F0ZSB0cnVuY2F0ZTY0CisjICBlbmRpZgorIyBlbmRpZgorIyBpZmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorZXh0ZXJuIGludCB0cnVuY2F0ZTY0IChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX19vZmY2NF90IF9fbGVuZ3RoKQorICAgICBfX1RIUk9XIF9fbm9ubnVsbCAoKDEpKSBfX3d1cjsKKyMgZW5kaWYKKworI2VuZGlmIC8qIFVzZSBCU0QgfHwgWC9PcGVuIFVuaXguICAqLworCisjaWYgZGVmaW5lZCBfX1VTRV9CU0QgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRCB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKworLyogVHJ1bmNhdGUgdGhlIGZpbGUgRkQgaXMgb3BlbiBvbiB0byBMRU5HVEggYnl0ZXMuICAqLworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBmdHJ1bmNhdGUgKGludCBfX2ZkLCBfX29mZl90IF9fbGVuZ3RoKSBfX1RIUk9XIF9fd3VyOworIyBlbHNlCisjICBpZmRlZiBfX1JFRElSRUNUX05USAorZXh0ZXJuIGludCBfX1JFRElSRUNUX05USCAoZnRydW5jYXRlLCAoaW50IF9fZmQsIF9fb2ZmNjRfdCBfX2xlbmd0aCksCisJCQkgICBmdHJ1bmNhdGU2NCkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIGZ0cnVuY2F0ZSBmdHJ1bmNhdGU2NAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZkZWYgX19VU0VfTEFSR0VGSUxFNjQKK2V4dGVybiBpbnQgZnRydW5jYXRlNjQgKGludCBfX2ZkLCBfX29mZjY0X3QgX19sZW5ndGgpIF9fVEhST1cgX193dXI7CisjIGVuZGlmCisKKyNlbmRpZiAvKiBVc2UgQlNEIHx8IFgvT3BlbiBVbml4IHx8IFBPU0lYIDIwMDMuICAqLworCisKKyNpZiBkZWZpbmVkIF9fVVNFX01JU0MgfHwgZGVmaW5lZCBfX1VTRV9YT1BFTl9FWFRFTkRFRAorCisvKiBTZXQgdGhlIGVuZCBvZiBhY2Nlc3NpYmxlIGRhdGEgc3BhY2UgKGFrYSAidGhlIGJyZWFrIikgdG8gQUREUi4KKyAgIFJldHVybnMgemVybyBvbiBzdWNjZXNzIGFuZCAtMSBmb3IgZXJyb3JzICh3aXRoIGVycm5vIHNldCkuICAqLworZXh0ZXJuIGludCBicmsgKHZvaWQgKl9fYWRkcikgX19USFJPVyBfX3d1cjsKKworLyogSW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGVuZCBvZiBhY2Nlc3NpYmxlIGRhdGEgc3BhY2UgYnkgREVMVEEgYnl0ZXMuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSBhZGRyZXNzIHRoZSBwcmV2aW91cyBlbmQgb2YgZGF0YSBzcGFjZQorICAgKGkuZS4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IHNwYWNlLCBpZiBERUxUQSA+IDApOworICAgcmV0dXJucyAodm9pZCAqKSAtMSBmb3IgZXJyb3JzICh3aXRoIGVycm5vIHNldCkuICAqLworZXh0ZXJuIHZvaWQgKnNicmsgKGludHB0cl90IF9fZGVsdGEpIF9fVEhST1c7CisjZW5kaWYKKworCisjaWZkZWYgX19VU0VfTUlTQworLyogSW52b2tlIGBzeXN0ZW0gY2FsbCcgbnVtYmVyIFNZU05PLCBwYXNzaW5nIGl0IHRoZSByZW1haW5pbmcgYXJndW1lbnRzLgorICAgVGhpcyBpcyBjb21wbGV0ZWx5IHN5c3RlbS1kZXBlbmRlbnQsIGFuZCBub3Qgb2Z0ZW4gdXNlZnVsLgorCisgICBJbiBVbml4LCBgc3lzY2FsbCcgc2V0cyBgZXJybm8nIGZvciBhbGwgZXJyb3JzIGFuZCBtb3N0IGNhbGxzIHJldHVybiAtMQorICAgZm9yIGVycm9yczsgaW4gbWFueSBzeXN0ZW1zIHlvdSBjYW5ub3QgcGFzcyBhcmd1bWVudHMgb3IgZ2V0IHJldHVybgorICAgdmFsdWVzIGZvciBhbGwgc3lzdGVtIGNhbGxzIChgcGlwZScsIGBmb3JrJywgYW5kIGBnZXRwcGlkJyB0eXBpY2FsbHkKKyAgIGFtb25nIHRoZW0pLgorCisgICBJbiBNYWNoLCBhbGwgc3lzdGVtIGNhbGxzIHRha2Ugbm9ybWFsIGFyZ3VtZW50cyBhbmQgYWx3YXlzIHJldHVybiBhbgorICAgZXJyb3IgY29kZSAoemVybyBmb3Igc3VjY2VzcykuICAqLworZXh0ZXJuIGxvbmcgaW50IHN5c2NhbGwgKGxvbmcgaW50IF9fc3lzbm8sIC4uLikgX19USFJPVzsKKworI2VuZGlmCS8qIFVzZSBtaXNjLiAgKi8KKworCisjaWYgKGRlZmluZWQgX19VU0VfTUlTQyB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOX0VYVEVOREVEKSAmJiAhZGVmaW5lZCBGX0xPQ0sKKy8qIE5PVEU6IFRoZXNlIGRlY2xhcmF0aW9ucyBhbHNvIGFwcGVhciBpbiA8ZmNudGwuaD47IGJlIHN1cmUgdG8ga2VlcCBib3RoCisgICBmaWxlcyBjb25zaXN0ZW50LiAgU29tZSBzeXN0ZW1zIGhhdmUgdGhlbSB0aGVyZSBhbmQgc29tZSBoZXJlLCBhbmQgc29tZQorICAgc29mdHdhcmUgZGVwZW5kcyBvbiB0aGUgbWFjcm9zIGJlaW5nIGRlZmluZWQgd2l0aG91dCBpbmNsdWRpbmcgYm90aC4gICovCisKKy8qIGBsb2NrZicgaXMgYSBzaW1wbGVyIGludGVyZmFjZSB0byB0aGUgbG9ja2luZyBmYWNpbGl0aWVzIG9mIGBmY250bCcuCisgICBMRU4gaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCisgICBUaGUgQ01EIGFyZ3VtZW50IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoCisgICBfX1RIUk9XLiAgKi8KKworIyBkZWZpbmUgRl9VTE9DSyAwCS8qIFVubG9jayBhIHByZXZpb3VzbHkgbG9ja2VkIHJlZ2lvbi4gICovCisjIGRlZmluZSBGX0xPQ0sgIDEJLyogTG9jayBhIHJlZ2lvbiBmb3IgZXhjbHVzaXZlIHVzZS4gICovCisjIGRlZmluZSBGX1RMT0NLIDIJLyogVGVzdCBhbmQgbG9jayBhIHJlZ2lvbiBmb3IgZXhjbHVzaXZlIHVzZS4gICovCisjIGRlZmluZSBGX1RFU1QgIDMJLyogVGVzdCBhIHJlZ2lvbiBmb3Igb3RoZXIgcHJvY2Vzc2VzIGxvY2tzLiAgKi8KKworIyBpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorZXh0ZXJuIGludCBsb2NrZiAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmZfdCBfX2xlbikgX193dXI7CisjIGVsc2UKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAobG9ja2YsIChpbnQgX19mZCwgaW50IF9fY21kLCBfX29mZjY0X3QgX19sZW4pLAorCQkgICAgICAgbG9ja2Y2NCkgX193dXI7CisjICBlbHNlCisjICAgZGVmaW5lIGxvY2tmIGxvY2tmNjQKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmZGVmIF9fVVNFX0xBUkdFRklMRTY0CitleHRlcm4gaW50IGxvY2tmNjQgKGludCBfX2ZkLCBpbnQgX19jbWQsIF9fb2ZmNjRfdCBfX2xlbikgX193dXI7CisjIGVuZGlmCisjZW5kaWYgLyogVXNlIG1pc2MgYW5kIEZfTE9DSyBub3QgYWxyZWFkeSBkZWZpbmVkLiAgKi8KKworCisjaWZkZWYgX19VU0VfR05VCisKKy8qIEV2YWx1YXRlIEVYUFJFU1NJT04sIGFuZCByZXBlYXQgYXMgbG9uZyBhcyBpdCByZXR1cm5zIC0xIHdpdGggYGVycm5vJworICAgc2V0IHRvIEVJTlRSLiAgKi8KKworIyBkZWZpbmUgVEVNUF9GQUlMVVJFX1JFVFJZKGV4cHJlc3Npb24pIFwKKyAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAorICAgICh7IGxvbmcgaW50IF9fcmVzdWx0OwkJCQkJCSAgICAgIFwKKyAgICAgICBkbyBfX3Jlc3VsdCA9IChsb25nIGludCkgKGV4cHJlc3Npb24pOwkJCQkgICAgICBcCisgICAgICAgd2hpbGUgKF9fcmVzdWx0ID09IC0xTCAmJiBlcnJubyA9PSBFSU5UUik7CQkJICAgICAgXAorICAgICAgIF9fcmVzdWx0OyB9KSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9QT1NJWDE5OTMwOSB8fCBkZWZpbmVkIF9fVVNFX1VOSVg5OAorLyogU3luY2hyb25pemUgYXQgbGVhc3QgdGhlIGRhdGEgcGFydCBvZiBhIGZpbGUgd2l0aCB0aGUgdW5kZXJseWluZworICAgbWVkaWEuICAqLworZXh0ZXJuIGludCBmZGF0YXN5bmMgKGludCBfX2ZpbGRlcyk7CisjZW5kaWYgLyogVXNlIFBPU0lYMTk5MzA5ICovCisKKworLyogWFBHNC4yIHNwZWNpZmllcyB0aGF0IHByb3RvdHlwZXMgZm9yIHRoZSBlbmNyeXB0aW9uIGZ1bmN0aW9ucyBtdXN0CisgICBiZSBkZWZpbmVkIGhlcmUuICAqLworI2lmZGVmCV9fVVNFX1hPUEVOCisvKiBFbmNyeXB0IGF0IG1vc3QgOCBjaGFyYWN0ZXJzIGZyb20gS0VZIHVzaW5nIHNhbHQgdG8gcGVydHVyYiBERVMuICAqLworZXh0ZXJuIGNoYXIgKmNyeXB0IChfX2NvbnN0IGNoYXIgKl9fa2V5LCBfX2NvbnN0IGNoYXIgKl9fc2FsdCkKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxLCAyKSk7CisKKy8qIEVuY3J5cHQgZGF0YSBpbiBCTE9DSyBpbiBwbGFjZSBpZiBFREZMQUcgaXMgemVybzsgb3RoZXJ3aXNlIGRlY3J5cHQKKyAgIGJsb2NrIGluIHBsYWNlLiAgKi8KK2V4dGVybiB2b2lkIGVuY3J5cHQgKGNoYXIgKl9fYmxvY2ssIGludCBfX2VkZmxhZykgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKKworLyogU3dhYiBwYWlycyBieXRlcyBpbiB0aGUgZmlyc3QgTiBieXRlcyBvZiB0aGUgYXJlYSBwb2ludGVkIHRvIGJ5CisgICBGUk9NIGFuZCBjb3B5IHRoZSByZXN1bHQgdG8gVE8uICBUaGUgdmFsdWUgb2YgVE8gbXVzdCBub3QgYmUgaW4gdGhlCisgICByYW5nZSBbRlJPTSAtIE4gKyAxLCBGUk9NIC0gMV0uICBJZiBOIGlzIG9kZCB0aGUgZmlyc3QgYnl0ZSBpbiBGUk9NCisgICBpcyB3aXRob3V0IHBhcnRuZXIuICAqLworZXh0ZXJuIHZvaWQgc3dhYiAoX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fZnJvbSwgdm9pZCAqX19yZXN0cmljdCBfX3RvLAorCQkgIHNzaXplX3QgX19uKSBfX1RIUk9XIF9fbm9ubnVsbCAoKDEsIDIpKTsKKyNlbmRpZgorCisKKy8qIFRoZSBTaW5nbGUgVW5peCBzcGVjaWZpY2F0aW9uIGRlbWFuZHMgdGhpcyBwcm90b3R5cGUgdG8gYmUgaGVyZS4KKyAgIEl0IGlzIGFsc28gZm91bmQgaW4gPHN0ZGlvLmg+LiAgKi8KKyNpZmRlZiBfX1VTRV9YT1BFTgorLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4gICovCitleHRlcm4gY2hhciAqY3Rlcm1pZCAoY2hhciAqX19zKSBfX1RIUk9XOworI2VuZGlmCisKKworLyogRGVmaW5lIHNvbWUgbWFjcm9zIGhlbHBpbmcgdG8gY2F0Y2ggYnVmZmVyIG92ZXJmbG93cy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjIGluY2x1ZGUgPGJpdHMvdW5pc3RkLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHVuaXN0ZC5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS91c3RhdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91c3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTE1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3VzdGF0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHN5cy91c3RhdC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS91dGltZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWQyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3V0aW1lLmgKQEAgLTAsMCArMSw1MiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTYsIDk3LCA5OCwgOTksIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qCisgKglQT1NJWCBTdGFuZGFyZDogNS42LjYgU2V0IEZpbGUgQWNjZXNzIGFuZCBNb2RpZmljYXRpb24gVGltZXMgIDx1dGltZS5oPgorICovCisKKyNpZm5kZWYJX1VUSU1FX0gKKyNkZWZpbmUJX1VUSU1FX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworX19CRUdJTl9ERUNMUworCisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWYgZGVmaW5lZCBfX1VTRV9YT1BFTiB8fCBkZWZpbmVkIF9fVVNFX1hPUEVOMksKKyMgZGVmaW5lIF9fbmVlZF90aW1lX3QKKyMgaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGZpbGUgdGltZXMuICAqLworc3RydWN0IHV0aW1idWYKKyAgeworICAgIF9fdGltZV90IGFjdGltZTsJCS8qIEFjY2VzcyB0aW1lLiAgKi8KKyAgICBfX3RpbWVfdCBtb2R0aW1lOwkJLyogTW9kaWZpY2F0aW9uIHRpbWUuICAqLworICB9OworCisvKiBTZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzIG9mIEZJTEUgdG8gdGhvc2UgZ2l2ZW4gaW4KKyAgICpGSUxFX1RJTUVTLiAgSWYgRklMRV9USU1FUyBpcyBOVUxMLCBzZXQgdGhlbSB0byB0aGUgY3VycmVudCB0aW1lLiAgKi8KK2V4dGVybiBpbnQgdXRpbWUgKF9fY29uc3QgY2hhciAqX19maWxlLAorCQkgIF9fY29uc3Qgc3RydWN0IHV0aW1idWYgKl9fZmlsZV90aW1lcykKKyAgICAgX19USFJPVyBfX25vbm51bGwgKCgxKSk7CisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiB1dGltZS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3V0bXAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YjEwODgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3V0bXAuaApAQCAtMCwwICsxLDk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1VUTVBfSAorI2RlZmluZQlfVVRNUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCitfX0JFR0lOX0RFQ0xTCisKKy8qIEdldCBzeXN0ZW0gZGVwZW5kZW50IHZhbHVlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKyNpbmNsdWRlIDxiaXRzL3V0bXAuaD4KKworLyogQ29tcGF0aWJpbGl0eSBuYW1lcyBmb3IgdGhlIHN0cmluZ3Mgb2YgdGhlIGNhbm9uaWNhbCBmaWxlIG5hbWVzLiAgKi8KKyNkZWZpbmUgVVRNUF9GSUxFCV9QQVRIX1VUTVAKKyNkZWZpbmUgVVRNUF9GSUxFTkFNRQlfUEFUSF9VVE1QCisjZGVmaW5lIFdUTVBfRklMRQlfUEFUSF9XVE1QCisjZGVmaW5lIFdUTVBfRklMRU5BTUUJX1BBVEhfV1RNUAorCisKKworLyogTWFrZSBGRCBiZSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwsIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnI7CisgICB0aGVuIGNsb3NlIEZELiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuICAqLworZXh0ZXJuIGludCBsb2dpbl90dHkgKGludCBfX2ZkKSBfX1RIUk9XOworCisKKy8qIFdyaXRlIHRoZSBnaXZlbiBlbnRyeSBpbnRvIHV0bXAgYW5kIHd0bXAuICAqLworZXh0ZXJuIHZvaWQgbG9naW4gKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9fZW50cnkpIF9fVEhST1c7CisKKy8qIFdyaXRlIHRoZSB1dG1wIGVudHJ5IHRvIHNheSB0aGUgdXNlciBvbiBVVF9MSU5FIGhhcyBsb2dnZWQgb3V0LiAgKi8KK2V4dGVybiBpbnQgbG9nb3V0IChfX2NvbnN0IGNoYXIgKl9fdXRfbGluZSkgX19USFJPVzsKKworLyogQXBwZW5kIHRvIHd0bXAgYW4gZW50cnkgZm9yIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBnaXZlbiBpbmZvLiAgKi8KK2V4dGVybiB2b2lkIGxvZ3d0bXAgKF9fY29uc3QgY2hhciAqX191dF9saW5lLCBfX2NvbnN0IGNoYXIgKl9fdXRfbmFtZSwKKwkJICAgICBfX2NvbnN0IGNoYXIgKl9fdXRfaG9zdCkgX19USFJPVzsKKworLyogQXBwZW5kIGVudHJ5IFVUTVAgdG8gdGhlIHd0bXAtbGlrZSBmaWxlIFdUTVBfRklMRS4gICovCitleHRlcm4gdm9pZCB1cGR3dG1wIChfX2NvbnN0IGNoYXIgKl9fd3RtcF9maWxlLCBfX2NvbnN0IHN0cnVjdCB1dG1wICpfX3V0bXApCisgICAgIF9fVEhST1c7CisKKy8qIENoYW5nZSBuYW1lIG9mIHRoZSB1dG1wIGZpbGUgdG8gYmUgZXhhbWluZWQuICAqLworZXh0ZXJuIGludCB1dG1wbmFtZSAoX19jb25zdCBjaGFyICpfX2ZpbGUpIF9fVEhST1c7CisKKy8qIFJlYWQgbmV4dCBlbnRyeSBmcm9tIGEgdXRtcC1saWtlIGZpbGUuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1wICpnZXR1dGVudCAodm9pZCkgX19USFJPVzsKKworLyogUmVzZXQgdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgKi8KK2V4dGVybiB2b2lkIHNldHV0ZW50ICh2b2lkKSBfX1RIUk9XOworCisvKiBDbG9zZSB0aGUgY3VycmVudCBvcGVuIGZpbGUuICAqLworZXh0ZXJuIHZvaWQgZW5kdXRlbnQgKHZvaWQpIF9fVEhST1c7CisKKy8qIFNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQgaW4gdGhlIHV0bXAgZmlsZSB1bnRpbCB0aGUKKyAgIG5leHQgZW50cnkgd2l0aCBhIHV0X3R5cGUgbWF0Y2hpbmcgSUQtPnV0X3R5cGUuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1wICpnZXR1dGlkIChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX2lkKSBfX1RIUk9XOworCisvKiBTZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBjdXJyZW50IHBvaW50IGluIHRoZSB1dG1wIGZpbGUgdW50aWwgdGhlCisgICBuZXh0IGVudHJ5IHdpdGggYSB1dF9saW5lIG1hdGNoaW5nIExJTkUtPnV0X2xpbmUuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1wICpnZXR1dGxpbmUgKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9fbGluZSkgX19USFJPVzsKKworLyogV3JpdGUgb3V0IGVudHJ5IHBvaW50ZWQgdG8gYnkgVVRNUF9QVFIgaW50byB0aGUgdXRtcCBmaWxlLiAgKi8KK2V4dGVybiBzdHJ1Y3QgdXRtcCAqcHV0dXRsaW5lIChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX3V0bXBfcHRyKSBfX1RIUk9XOworCisKKyNpZmRlZglfX1VTRV9NSVNDCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2YgdGhlIGZpbGUgZm9yIGhhbmRsaW5nIHV0bXAgZmlsZXMuICAqLworZXh0ZXJuIGludCBnZXR1dGVudF9yIChzdHJ1Y3QgdXRtcCAqX19idWZmZXIsIHN0cnVjdCB1dG1wICoqX19yZXN1bHQpIF9fVEhST1c7CisKK2V4dGVybiBpbnQgZ2V0dXRpZF9yIChfX2NvbnN0IHN0cnVjdCB1dG1wICpfX2lkLCBzdHJ1Y3QgdXRtcCAqX19idWZmZXIsCisJCSAgICAgIHN0cnVjdCB1dG1wICoqX19yZXN1bHQpIF9fVEhST1c7CisKK2V4dGVybiBpbnQgZ2V0dXRsaW5lX3IgKF9fY29uc3Qgc3RydWN0IHV0bXAgKl9fbGluZSwKKwkJCXN0cnVjdCB1dG1wICpfX2J1ZmZlciwgc3RydWN0IHV0bXAgKipfX3Jlc3VsdCkgX19USFJPVzsKKworI2VuZGlmCS8qIFVzZSBtaXNjLiAgKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHV0bXAuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRtcHguaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdXRtcHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjIyOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS91dG1weC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1VUTVBYX0gKKyNkZWZpbmUJX1VUTVBYX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisvKiBSZXF1aXJlZCBhY2NvcmRpbmcgdG8gVW5peDk4LiAgKi8KKyNpZm5kZWYgX19waWRfdF9kZWZpbmVkCit0eXBlZGVmIF9fcGlkX3QgcGlkX3Q7CisjIGRlZmluZSBfX3BpZF90X2RlZmluZWQKKyNlbmRpZgorCisvKiBHZXQgc3lzdGVtIGRlcGVuZGVudCB2YWx1ZXMgYW5kIGRhdGEgc3RydWN0dXJlcy4gICovCisjaW5jbHVkZSA8Yml0cy91dG1weC5oPgorCisjaWZkZWYgX19VU0VfR05VCisvKiBDb21wYXRpYmlsaXR5IG5hbWVzIGZvciB0aGUgc3RyaW5ncyBvZiB0aGUgY2Fub25pY2FsIGZpbGUgbmFtZXMuICAqLworIyBkZWZpbmUgVVRNUFhfRklMRQlfUEFUSF9VVE1QWAorIyBkZWZpbmUgVVRNUFhfRklMRU5BTUUJX1BBVEhfVVRNUFgKKyMgZGVmaW5lIFdUTVBYX0ZJTEUJX1BBVEhfV1RNUFgKKyMgZGVmaW5lIFdUTVBYX0ZJTEVOQU1FCV9QQVRIX1dUTVBYCisjZW5kaWYKKworLyogRm9yIHRoZSBnZXR1dG1weyx4fSBmdW5jdGlvbnMgd2UgbmVlZCB0aGUgYHN0cnVjdCB1dG1wJy4gICovCisjaWZkZWYgX19VU0VfR05VCitzdHJ1Y3QgdXRtcDsKKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworLyogT3BlbiB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHZvaWQgc2V0dXR4ZW50ICh2b2lkKTsKKworLyogQ2xvc2UgdXNlciBhY2NvdW50aW5nIGRhdGFiYXNlLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGVuZHV0eGVudCAodm9pZCk7CisKKy8qIEdldCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1weCAqZ2V0dXR4ZW50ICh2b2lkKTsKKworLyogR2V0IHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UgZW50cnkgY29ycmVzcG9uZGluZyB0byBJRC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gc3RydWN0IHV0bXB4ICpnZXR1dHhpZCAoX19jb25zdCBzdHJ1Y3QgdXRtcHggKl9faWQpOworCisvKiBHZXQgdGhlIHVzZXIgYWNjb3VudGluZyBkYXRhYmFzZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIExJTkUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1weCAqZ2V0dXR4bGluZSAoX19jb25zdCBzdHJ1Y3QgdXRtcHggKl9fbGluZSk7CisKKy8qIFdyaXRlIHRoZSBlbnRyeSBVVE1QWCBpbnRvIHRoZSB1c2VyIGFjY291bnRpbmcgZGF0YWJhc2UuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHN0cnVjdCB1dG1weCAqcHV0dXR4bGluZSAoX19jb25zdCBzdHJ1Y3QgdXRtcHggKl9fdXRtcHgpOworCisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENoYW5nZSBuYW1lIG9mIHRoZSB1dG1weCBmaWxlIHRvIGJlIGV4YW1pbmVkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHV0bXB4bmFtZSAoX19jb25zdCBjaGFyICpfX2ZpbGUpOworCisvKiBBcHBlbmQgZW50cnkgVVRNUCB0byB0aGUgd3RtcHgtbGlrZSBmaWxlIFdUTVBYX0ZJTEUuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIHVwZHd0bXB4IChfX2NvbnN0IGNoYXIgKl9fd3RtcHhfZmlsZSwKKwkJICAgICAgX19jb25zdCBzdHJ1Y3QgdXRtcHggKl9fdXRtcHgpOworCisKKy8qIENvcHkgdGhlIGluZm9ybWF0aW9uIGluIFVUTVBYIHRvIFVUTVAuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB2b2lkIGdldHV0bXAgKF9fY29uc3Qgc3RydWN0IHV0bXB4ICpfX3V0bXB4LAorCQkgICAgIHN0cnVjdCB1dG1wICpfX3V0bXApOworCisvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbiBVVE1QIHRvIFVUTVBYLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBwYXJ0IG9mIFBPU0lYIGFuZCB0aGVyZWZvcmUgbm8gb2ZmaWNpYWwKKyAgIGNhbmNlbGxhdGlvbiBwb2ludC4gIEJ1dCBkdWUgdG8gc2ltaWxhcml0eSB3aXRoIGFuIFBPU0lYIGludGVyZmFjZQorICAgb3IgZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpdCBpcyBhIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gdm9pZCBnZXR1dG1weCAoX19jb25zdCBzdHJ1Y3QgdXRtcCAqX191dG1wLAorCQkgICAgICBzdHJ1Y3QgdXRtcHggKl9fdXRtcHgpOworI2VuZGlmCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiB1dG1weC5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS92YWx1ZXMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmFsdWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMzc2ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvdmFsdWVzLmgKQEAgLTAsMCArMSw2OSBAQAorLyogT2xkIGNvbXBhdGliaWxpdHkgbmFtZXMgZm9yIDxsaW1pdHMuaD4gYW5kIDxmbG9hdC5oPiBjb25zdGFudHMuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIFRoaXMgaW50ZXJmYWNlIGlzIG9ic29sZXRlLiAgTmV3IHByb2dyYW1zIHNob3VsZCB1c2UKKyAgIDxsaW1pdHMuaD4gYW5kL29yIDxmbG9hdC5oPiBpbnN0ZWFkIG9mIDx2YWx1ZXMuaD4uICAqLworCisjaWZuZGVmCV9WQUxVRVNfSAorI2RlZmluZQlfVkFMVUVTX0gJMQorCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIF9UWVBFQklUUyh0eXBlKQkoc2l6ZW9mICh0eXBlKSAqIENIQVJfQklUKQorCisjZGVmaW5lIENIQVJCSVRTCV9UWVBFQklUUyAoY2hhcikKKyNkZWZpbmUgU0hPUlRCSVRTCV9UWVBFQklUUyAoc2hvcnQgaW50KQorI2RlZmluZSBJTlRCSVRTCQlfVFlQRUJJVFMgKGludCkKKyNkZWZpbmUgTE9OR0JJVFMJX1RZUEVCSVRTIChsb25nIGludCkKKyNkZWZpbmUgUFRSQklUUwkJX1RZUEVCSVRTIChjaGFyICopCisjZGVmaW5lIERPVUJMRUJJVFMJX1RZUEVCSVRTIChkb3VibGUpCisjZGVmaW5lIEZMT0FUQklUUwlfVFlQRUJJVFMgKGZsb2F0KQorCisjZGVmaW5lIE1JTlNIT1JUCVNIUlRfTUlOCisjZGVmaW5lCU1JTklOVAkJSU5UX01JTgorI2RlZmluZQlNSU5MT05HCQlMT05HX01JTgorCisjZGVmaW5lCU1BWFNIT1JUCVNIUlRfTUFYCisjZGVmaW5lCU1BWElOVAkJSU5UX01BWAorI2RlZmluZQlNQVhMT05HCQlMT05HX01BWAorCisjZGVmaW5lIEhJQklUUwkJTUlOU0hPUlQKKyNkZWZpbmUgSElCSVRMCQlNSU5MT05HCisKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNkZWZpbmUJTUFYRE9VQkxFCURCTF9NQVgKKyNkZWZpbmUJTUFYRkxPQVQJRkxUX01BWAorI2RlZmluZQlNSU5ET1VCTEUJREJMX01JTgorI2RlZmluZQlNSU5GTE9BVAlGTFRfTUlOCisjZGVmaW5lCURNSU5FWFAJCURCTF9NSU5fRVhQCisjZGVmaW5lCUZNSU5FWFAJCUZMVF9NSU5fRVhQCisjZGVmaW5lCURNQVhFWFAJCURCTF9NQVhfRVhQCisjZGVmaW5lCUZNQVhFWFAJCUZMVF9NQVhfRVhQCisKKworI2lmZGVmIF9fVVNFX01JU0MKKy8qIFNvbWUgc3lzdGVtcyBkZWZpbmUgdGhpcyBuYW1lIGluc3RlYWQgb2YgQ0hBUl9CSVQgb3IgQ0hBUkJJVFMuICAqLworIyBkZWZpbmUgQklUU1BFUkJZVEUJQ0hBUl9CSVQKKyNlbmRpZgorCisjZW5kaWYJLyogdmFsdWVzLmggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2FpdC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS93YWl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxYjgxMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2FpdC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS93Y2hhci5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS93Y2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzAwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3djaGFyLmgKQEAgLTAsMCArMSw4NDcgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0yMDA0LDIwMDUsMjAwNiwyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICogICAgICBJU08gQzk5IFN0YW5kYXJkOiA3LjI0CisgKglFeHRlbmRlZCBtdWx0aWJ5dGUgYW5kIHdpZGUgY2hhcmFjdGVyIHV0aWxpdGllcwk8d2NoYXIuaD4KKyAqLworCisjaWZuZGVmIF9XQ0hBUl9ICisKKyNpZiAhZGVmaW5lZCBfX25lZWRfbWJzdGF0ZV90ICYmICFkZWZpbmVkIF9fbmVlZF93aW50X3QKKyMgZGVmaW5lIF9XQ0hBUl9IIDEKKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dDSEFSX0gKKy8qIEdldCBGSUxFIGRlZmluaXRpb24uICAqLworIyBkZWZpbmUgX19uZWVkX19fRklMRQorIyBpZmRlZiBfX1VTRV9VTklYOTgKKyMgIGRlZmluZSBfX25lZWRfRklMRQorIyBlbmRpZgorIyBpbmNsdWRlIDxzdGRpby5oPgorLyogR2V0IHZhX2xpc3QgZGVmaW5pdGlvbi4gICovCisjIGRlZmluZSBfX25lZWRfX192YV9saXN0CisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorCisjIGluY2x1ZGUgPGJpdHMvd2NoYXIuaD4KKworLyogR2V0IHNpemVfdCwgd2NoYXJfdCwgd2ludF90IGFuZCBOVUxMIGZyb20gPHN0ZGRlZi5oPi4gICovCisjIGRlZmluZSBfX25lZWRfc2l6ZV90CisjIGRlZmluZSBfX25lZWRfd2NoYXJfdAorIyBkZWZpbmUgX19uZWVkX05VTEwKKyNlbmRpZgorI2lmIGRlZmluZWQgX1dDSEFSX0ggfHwgZGVmaW5lZCBfX25lZWRfd2ludF90IHx8ICFkZWZpbmVkIF9fV0lOVF9UWVBFX18KKyMgdW5kZWYgX19uZWVkX3dpbnRfdAorIyBkZWZpbmUgX19uZWVkX3dpbnRfdAorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogV2UgdHJ5IHRvIGdldCB3aW50X3QgZnJvbSA8c3RkZGVmLmg+LCBidXQgbm90IGFsbCBHQ0MgdmVyc2lvbnMgZGVmaW5lIGl0CisgICB0aGVyZS4gIFNvIGRlZmluZSBpdCBvdXJzZWx2ZXMgaWYgaXQgcmVtYWlucyB1bmRlZmluZWQuICAqLworIyBpZm5kZWYgX1dJTlRfVAorLyogSW50ZWdyYWwgdHlwZSB1bmNoYW5nZWQgYnkgZGVmYXVsdCBhcmd1bWVudCBwcm9tb3Rpb25zIHRoYXQgY2FuCisgICBob2xkIGFueSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIG1lbWJlcnMgb2YgdGhlIGV4dGVuZGVkIGNoYXJhY3RlcgorICAgc2V0LCBhcyB3ZWxsIGFzIGF0IGxlYXN0IG9uZSB2YWx1ZSB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55CisgICBtZW1iZXIgb2YgdGhlIGV4dGVuZGVkIGNoYXJhY3RlciBzZXQuICAqLworIyAgZGVmaW5lIF9XSU5UX1QKK3R5cGVkZWYgdW5zaWduZWQgaW50IHdpbnRfdDsKKyMgZWxzZQorLyogV29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCB0aGUgPHN0ZGRlZi5oPiBmaWxlIHdoaWNoIGRvZXNuJ3QgcHV0CisgICB3aW50X3QgaW4gdGhlIHN0ZCBuYW1lc3BhY2UuICAqLworIyAgaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBkZWZpbmVkIF9HTElCQ1BQX1VTRV9OQU1FU1BBQ0VTIFwKKyAgICAgICYmIGRlZmluZWQgX19XSU5UX1RZUEVfXworX19CRUdJTl9OQU1FU1BBQ0VfU1RECit0eXBlZGVmIF9fV0lOVF9UWVBFX18gd2ludF90OworX19FTkRfTkFNRVNQQUNFX1NURAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX1dDSEFSX0ggfHwgZGVmaW5lZCBfX25lZWRfbWJzdGF0ZV90KSAmJiAhZGVmaW5lZCBfX21ic3RhdGVfdF9kZWZpbmVkCisjIGRlZmluZSBfX21ic3RhdGVfdF9kZWZpbmVkCTEKKy8qIENvbnZlcnNpb24gc3RhdGUgaW5mb3JtYXRpb24uICAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgaW50IF9fY291bnQ7CisgIHVuaW9uCisgIHsKKyMgaWZkZWYgX19XSU5UX1RZUEVfXworICAgIF9fV0lOVF9UWVBFX18gX193Y2g7CisjIGVsc2UKKyAgICB3aW50X3QgX193Y2g7CisjIGVuZGlmCisgICAgY2hhciBfX3djaGJbNF07CisgIH0gX192YWx1ZTsJCS8qIFZhbHVlIHNvIGZhci4gICovCit9IF9fbWJzdGF0ZV90OworI2VuZGlmCisjdW5kZWYgX19uZWVkX21ic3RhdGVfdAorCisKKy8qIFRoZSByZXN0IG9mIHRoZSBmaWxlIGlzIG9ubHkgdXNlZCBpZiB1c2VkIGlmIF9fbmVlZF9tYnN0YXRlX3QgaXMgbm90CisgICBkZWZpbmVkLiAgKi8KKyNpZmRlZiBfV0NIQVJfSAorCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFB1YmxpYyB0eXBlLiAgKi8KK3R5cGVkZWYgX19tYnN0YXRlX3QgbWJzdGF0ZV90OworX19FTkRfTkFNRVNQQUNFX0M5OQorI2lmZGVmIF9fVVNFX0dOVQorX19VU0lOR19OQU1FU1BBQ0VfQzk5KG1ic3RhdGVfdCkKKyNlbmRpZgorCisjaWZuZGVmIFdDSEFSX01JTgorLyogVGhlc2UgY29uc3RhbnRzIG1pZ2h0IGFsc28gYmUgZGVmaW5lZCBpbiA8aW50dHlwZXMuaD4uICAqLworIyBkZWZpbmUgV0NIQVJfTUlOIF9fV0NIQVJfTUlOCisjIGRlZmluZSBXQ0hBUl9NQVggX19XQ0hBUl9NQVgKKyNlbmRpZgorCisjaWZuZGVmIFdFT0YKKyMgZGVmaW5lIFdFT0YgKDB4ZmZmZmZmZmZ1KQorI2VuZGlmCisKKy8qIEZvciBYUEc0IGNvbXBsaWFuY2Ugd2UgaGF2ZSB0byBkZWZpbmUgdGhlIHN0dWZmIGZyb20gPHdjdHlwZS5oPiBoZXJlCisgICBhcyB3ZWxsLiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1hPUEVOICYmICFkZWZpbmVkIF9fVVNFX1VOSVg5OAorIyBpbmNsdWRlIDx3Y3R5cGUuaD4KKyNlbmRpZgorCisKK19fQkVHSU5fREVDTFMKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBUaGlzIGluY29tcGxldGUgdHlwZSBpcyBkZWZpbmVkIGluIDx0aW1lLmg+IGJ1dCBuZWVkZWQgaGVyZSBiZWNhdXNlCisgICBvZiBgd2NzZnRpbWUnLiAgKi8KK3N0cnVjdCB0bTsKK19fRU5EX05BTUVTUEFDRV9TVEQKKy8qIFhYWCBXZSBoYXZlIHRvIGNsZWFuIHRoaXMgdXAgYXQgc29tZSBwb2ludC4gIFNpbmNlIHRtIGlzIGluIHRoZSBzdGQKKyAgIG5hbWVzcGFjZSBidXQgd2NzZnRpbWUgaXMgaW4gX19jOTkgdGhlIHR5cGUgd291bGRuJ3QgYmUgZm91bmQKKyAgIHdpdGhvdXQgaW5zZXJ0aW5nIGl0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgKi8KK19fVVNJTkdfTkFNRVNQQUNFX1NURCh0bSkKKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvcHkgU1JDIHRvIERFU1QuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc2NweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zcmMpIF9fVEhST1c7CisvKiBDb3B5IG5vIG1vcmUgdGhhbiBOIHdpZGUtY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzbmNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworCisvKiBBcHBlbmQgU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzY2F0ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwKKwkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykgX19USFJPVzsKKy8qIEFwcGVuZCBubyBtb3JlIHRoYW4gTiB3aWRlLWNoYXJhY3RlcnMgb2YgU1JDIG9udG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzbmNhdCAod2NoYXJfdCAqX19yZXN0cmljdCBfX2Rlc3QsCisJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworCisvKiBDb21wYXJlIFMxIGFuZCBTMi4gICovCitleHRlcm4gaW50IHdjc2NtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworLyogQ29tcGFyZSBOIHdpZGUtY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworZXh0ZXJuIGludCB3Y3NuY21wIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbikKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBpZ25vcmluZyBjYXNlLiAgKi8KK2V4dGVybiBpbnQgd2NzY2FzZWNtcCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIpIF9fVEhST1c7CisKKy8qIENvbXBhcmUgbm8gbW9yZSB0aGFuIE4gY2hhcnMgb2YgUzEgYW5kIFMyLCBpZ25vcmluZyBjYXNlLiAgKi8KK2V4dGVybiBpbnQgd2NzbmNhc2VjbXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLAorCQkJc2l6ZV90IF9fbikgX19USFJPVzsKKworLyogU2ltaWxhciB0byB0aGUgdHdvIGZ1bmN0aW9ucyBhYm92ZSBidXQgdGFrZSB0aGUgaW5mb3JtYXRpb24gZnJvbQorICAgdGhlIHByb3ZpZGVkIGxvY2FsZSBhbmQgbm90IHRoZSBnbG9iYWwgbG9jYWxlLiAgKi8KKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCitleHRlcm4gaW50IHdjc2Nhc2VjbXBfbCAoX19jb25zdCB3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsCisJCQkgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworZXh0ZXJuIGludCB3Y3NuY2FzZWNtcF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJCSAgc2l6ZV90IF9fbiwgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBib3RoIGludGVycHJldGVkIGFzIGFwcHJvcHJpYXRlIHRvIHRoZQorICAgTENfQ09MTEFURSBjYXRlZ29yeSBvZiB0aGUgY3VycmVudCBsb2NhbGUuICAqLworZXh0ZXJuIGludCB3Y3Njb2xsIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMikgX19USFJPVzsKKy8qIFRyYW5zZm9ybSBTMiBpbnRvIGFycmF5IHBvaW50ZWQgdG8gYnkgUzEgc3VjaCB0aGF0IGlmIHdjc2NtcCBpcworICAgYXBwbGllZCB0byB0d28gdHJhbnNmb3JtZWQgc3RyaW5ncyB0aGUgcmVzdWx0IGlzIHRoZSBhcyBhcHBseWluZworICAgYHdjc2NvbGwnIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmdzLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzeGZybSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkgICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczIsIHNpemVfdCBfX24pIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIFNpbWlsYXIgdG8gdGhlIHR3byBmdW5jdGlvbnMgYWJvdmUgYnV0IHRha2UgdGhlIGluZm9ybWF0aW9uIGZyb20KKyAgIHRoZSBwcm92aWRlZCBsb2NhbGUgYW5kIG5vdCB0aGUgZ2xvYmFsIGxvY2FsZS4gICovCisKKy8qIENvbXBhcmUgUzEgYW5kIFMyLCBib3RoIGludGVycHJldGVkIGFzIGFwcHJvcHJpYXRlIHRvIHRoZQorICAgTENfQ09MTEFURSBjYXRlZ29yeSBvZiB0aGUgZ2l2ZW4gbG9jYWxlLiAgKi8KK2V4dGVybiBpbnQgd2NzY29sbF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJICAgICAgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworLyogVHJhbnNmb3JtIFMyIGludG8gYXJyYXkgcG9pbnRlZCB0byBieSBTMSBzdWNoIHRoYXQgaWYgd2NzY21wIGlzCisgICBhcHBsaWVkIHRvIHR3byB0cmFuc2Zvcm1lZCBzdHJpbmdzIHRoZSByZXN1bHQgaXMgdGhlIGFzIGFwcGx5aW5nCisgICBgd2NzY29sbCcgdG8gdGhlIG9yaWdpbmFsIHN0cmluZ3MuICAqLworZXh0ZXJuIHNpemVfdCB3Y3N4ZnJtX2wgKHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwKKwkJCSBzaXplX3QgX19uLCBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworCisvKiBEdXBsaWNhdGUgUywgcmV0dXJuaW5nIGFuIGlkZW50aWNhbCBtYWxsb2MnZCBzdHJpbmcuICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc2R1cCAoX19jb25zdCB3Y2hhcl90ICpfX3MpIF9fVEhST1cgX19hdHRyaWJ1dGVfbWFsbG9jX187CisjZW5kaWYKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFdDIGluIFdDUy4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzY2hyIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworLyogRmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFdDIGluIFdDUy4gICovCitleHRlcm4gd2NoYXJfdCAqd2NzcmNociAoX19jb25zdCB3Y2hhcl90ICpfX3djcywgd2NoYXJfdCBfX3djKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGB3Y3NjaHInLiAgQnV0IGl0IHJldHVybnMgYSBwb2ludGVyIHRvCisgICB0aGUgY2xvc2luZyBOVUwgd2lkZSBjaGFyYWN0ZXIgaW4gY2FzZSBDIGlzIG5vdCBmb3VuZCBpbiBTLiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3NjaHJudWwgKF9fY29uc3Qgd2NoYXJfdCAqX19zLCB3Y2hhcl90IF9fd2MpCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworI2VuZGlmCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc2VnbWV0IG9mIFdDUyB3aGljaAorICAgY29uc2lzdHMgZW50aXJlbHkgb2Ygd2lkZSBjaGFyYWN0ZXJzIG5vdCBpbiBSRUpFQ1QuICAqLworZXh0ZXJuIHNpemVfdCB3Y3Njc3BuIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCBfX2NvbnN0IHdjaGFyX3QgKl9fcmVqZWN0KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21ldCBvZiBXQ1Mgd2hpY2gKKyAgIGNvbnNpc3RzIGVudGlyZWx5IG9mIHdpZGUgY2hhcmFjdGVycyBpbiAgQUNDRVBULiAgKi8KK2V4dGVybiBzaXplX3Qgd2Nzc3BuIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCBfX2NvbnN0IHdjaGFyX3QgKl9fYWNjZXB0KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gV0NTIG9mIGFueSBjaGFyYWN0ZXIgaW4gQUNDRVBULiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3NwYnJrIChfX2NvbnN0IHdjaGFyX3QgKl9fd2NzLCBfX2NvbnN0IHdjaGFyX3QgKl9fYWNjZXB0KQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKy8qIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExFIGluIEhBWVNUQUNLLiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3NzdHIgKF9fY29uc3Qgd2NoYXJfdCAqX19oYXlzdGFjaywgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIERpdmlkZSBXQ1MgaW50byB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4gREVMSU0uICAqLworZXh0ZXJuIHdjaGFyX3QgKndjc3RvayAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQlfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZWxpbSwKKwkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fcHRyKSBfX1RIUk9XOworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3aWRlIGNoYXJhY3RlcnMgaW4gUy4gICovCitleHRlcm4gc2l6ZV90IHdjc2xlbiAoX19jb25zdCB3Y2hhcl90ICpfX3MpIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworX19FTkRfTkFNRVNQQUNFX1NURAorCisjaWZkZWYgX19VU0VfWE9QRU4KKy8qIEFub3RoZXIgbmFtZSBmb3IgYHdjc3N0cicgZnJvbSBYUEc0LiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3N3Y3MgKF9fY29uc3Qgd2NoYXJfdCAqX19oYXlzdGFjaywgX19jb25zdCB3Y2hhcl90ICpfX25lZWRsZSkKKyAgICAgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisjZW5kaWYKKworI2lmZGVmIF9fVVNFX0dOVQorLyogUmV0dXJuIHRoZSBudW1iZXIgb2Ygd2lkZSBjaGFyYWN0ZXJzIGluIFMsIGJ1dCBhdCBtb3N0IE1BWExFTi4gICovCitleHRlcm4gc2l6ZV90IHdjc25sZW4gKF9fY29uc3Qgd2NoYXJfdCAqX19zLCBzaXplX3QgX19tYXhsZW4pCisgICAgIF9fVEhST1cgX19hdHRyaWJ1dGVfcHVyZV9fOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBTZWFyY2ggTiB3aWRlIGNoYXJhY3RlcnMgb2YgUyBmb3IgQy4gICovCitleHRlcm4gd2NoYXJfdCAqd21lbWNociAoX19jb25zdCB3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogQ29tcGFyZSBOIHdpZGUgY2hhcmFjdGVycyBvZiBTMSBhbmQgUzIuICAqLworZXh0ZXJuIGludCB3bWVtY21wIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMSwKKwkJICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XIF9fYXR0cmlidXRlX3B1cmVfXzsKKworLyogQ29weSBOIHdpZGUgY2hhcmFjdGVycyBvZiBTUkMgdG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd21lbWNweSAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MxLAorCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKSBfX1RIUk9XOworCisvKiBDb3B5IE4gd2lkZSBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULCBndWFyYW50ZWVpbmcKKyAgIGNvcnJlY3QgYmVoYXZpb3IgZm9yIG92ZXJsYXBwaW5nIHN0cmluZ3MuICAqLworZXh0ZXJuIHdjaGFyX3QgKndtZW1tb3ZlICh3Y2hhcl90ICpfX3MxLCBfX2NvbnN0IHdjaGFyX3QgKl9fczIsIHNpemVfdCBfX24pCisgICAgIF9fVEhST1c7CisKKy8qIFNldCBOIHdpZGUgY2hhcmFjdGVycyBvZiBTIHRvIEMuICAqLworZXh0ZXJuIHdjaGFyX3QgKndtZW1zZXQgKHdjaGFyX3QgKl9fcywgd2NoYXJfdCBfX2MsIHNpemVfdCBfX24pIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9HTlUKKy8qIENvcHkgTiB3aWRlIGNoYXJhY3RlcnMgb2YgU1JDIHRvIERFU1QgYW5kIHJldHVybiBwb2ludGVyIHRvIGZvbGxvd2luZworICAgd2lkZSBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIHdjaGFyX3QgKndtZW1wY3B5ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fczEsCisJCQkgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworI2VuZGlmCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBEZXRlcm1pbmUgd2hldGhlciBDIGNvbnN0aXR1dGVzIGEgdmFsaWQgKG9uZS1ieXRlKSBtdWx0aWJ5dGUKKyAgIGNoYXJhY3Rlci4gICovCitleHRlcm4gd2ludF90IGJ0b3djIChpbnQgX19jKSBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgd2hldGhlciBDIGNvcnJlc3BvbmRzIHRvIGEgbWVtYmVyIG9mIHRoZSBleHRlbmRlZAorICAgY2hhcmFjdGVyIHNldCB3aG9zZSBtdWx0aWJ5dGUgcmVwcmVzZW50YXRpb24gaXMgYSBzaW5nbGUgYnl0ZS4gICovCitleHRlcm4gaW50IHdjdG9iICh3aW50X3QgX19jKSBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgd2hldGhlciBQUyBwb2ludHMgdG8gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgaW5pdGlhbAorICAgc3RhdGUuICAqLworZXh0ZXJuIGludCBtYnNpbml0IChfX2NvbnN0IG1ic3RhdGVfdCAqX19wcykgX19USFJPVyBfX2F0dHJpYnV0ZV9wdXJlX187CisKKy8qIFdyaXRlIHdpZGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIG11bHRpYnl0ZSBjaGFyYWN0ZXIgcG9pbnRlZAorICAgdG8gYnkgUyB0byBQV0MuICAqLworZXh0ZXJuIHNpemVfdCBtYnJ0b3djICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjLAorCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICAgICAgIG1ic3RhdGVfdCAqX19wKSBfX1RIUk9XOworCisvKiBXcml0ZSBtdWx0aWJ5dGUgcmVwcmVzZW50YXRpb24gb2Ygd2lkZSBjaGFyYWN0ZXIgV0MgdG8gUy4gICovCitleHRlcm4gc2l6ZV90IHdjcnRvbWIgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCB3Y2hhcl90IF9fd2MsCisJCSAgICAgICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKKworLyogUmV0dXJuIG51bWJlciBvZiBieXRlcyBpbiBtdWx0aWJ5dGUgY2hhcmFjdGVyIHBvaW50ZWQgdG8gYnkgUy4gICovCitleHRlcm4gc2l6ZV90IF9fbWJybGVuIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19uLAorCQkJbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CitleHRlcm4gc2l6ZV90IG1icmxlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICAgICAgbWJzdGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZmRlZiBfX1VTRV9FWFRFUk5fSU5MSU5FUworLyogRGVmaW5lIGlubGluZSBmdW5jdGlvbiBhcyBvcHRpbWl6YXRpb24uICAqLworCisvKiBXZSBjYW4gdXNlIHRoZSBCVE9XQyBhbmQgV0NUT0Igb3B0aW1pemF0aW9ucyBzaW5jZSB3ZSBrbm93IHRoYXQgYWxsCisgICBsb2NhbGVzIG11c3QgdXNlIEFTQ0lJIGVuY29kaW5nIGZvciB0aGUgdmFsdWVzIGluIHRoZSBBU0NJSSByYW5nZQorICAgYW5kIGJlY2F1c2UgdGhlIHdjaGFyX3QgZW5jb2RpbmcgaXMgYWx3YXlzIElTTyAxMDY0Ni4gICovCitleHRlcm4gd2ludF90IF9fYnRvd2NfYWxpYXMgKGludCBfX2MpIF9fYXNtICgiYnRvd2MiKTsKK19fZXh0ZXJuX2lubGluZSB3aW50X3QKK19fTlRIIChidG93YyAoaW50IF9fYykpCit7IHJldHVybiAoX19idWlsdGluX2NvbnN0YW50X3AgKF9fYykgJiYgX19jID49ICdcMCcgJiYgX19jIDw9ICdceDdmJworCSAgPyAod2ludF90KSBfX2MgOiBfX2J0b3djX2FsaWFzIChfX2MpKTsgfQorCitleHRlcm4gaW50IF9fd2N0b2JfYWxpYXMgKHdpbnRfdCBfX2MpIF9fYXNtICgid2N0b2IiKTsKK19fZXh0ZXJuX2lubGluZSBpbnQKK19fTlRIICh3Y3RvYiAod2ludF90IF9fd2MpKQoreyByZXR1cm4gKF9fYnVpbHRpbl9jb25zdGFudF9wIChfX3djKSAmJiBfX3djID49IEwnXDAnICYmIF9fd2MgPD0gTCdceDdmJworCSAgPyAoaW50KSBfX3djIDogX193Y3RvYl9hbGlhcyAoX193YykpOyB9CisKK19fZXh0ZXJuX2lubGluZSBzaXplX3QKK19fTlRIIChtYnJsZW4gKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJICAgICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSkKK3sgcmV0dXJuIChfX3BzICE9IE5VTEwKKwkgID8gbWJydG93YyAoTlVMTCwgX19zLCBfX24sIF9fcHMpIDogX19tYnJsZW4gKF9fcywgX19uLCBOVUxMKSk7IH0KKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIFdyaXRlIHdpZGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIG11bHRpYnl0ZSBjaGFyYWN0ZXIgc3RyaW5nCisgICBTUkMgdG8gRFNULiAgKi8KK2V4dGVybiBzaXplX3QgbWJzcnRvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZHN0LAorCQkJIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX2xlbiwKKwkJCSBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKKworLyogV3JpdGUgbXVsdGlieXRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiB3aWRlIGNoYXJhY3RlciBzdHJpbmcKKyAgIFNSQyB0byBEU1QuICAqLworZXh0ZXJuIHNpemVfdCB3Y3NydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgX19jb25zdCB3Y2hhcl90ICoqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbGVuLAorCQkJIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX1NURAorCisKKyNpZmRlZglfX1VTRV9HTlUKKy8qIFdyaXRlIHdpZGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIGF0IG1vc3QgTk1DIGJ5dGVzIG9mIHRoZQorICAgbXVsdGlieXRlIGNoYXJhY3RlciBzdHJpbmcgU1JDIHRvIERTVC4gICovCitleHRlcm4gc2l6ZV90IG1ic25ydG93Y3MgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgIF9fY29uc3QgY2hhciAqKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBfX25tYywKKwkJCSAgc2l6ZV90IF9fbGVuLCBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKKworLyogV3JpdGUgbXVsdGlieXRlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiBhdCBtb3N0IE5XQyBjaGFyYWN0ZXJzCisgICBmcm9tIHRoZSB3aWRlIGNoYXJhY3RlciBzdHJpbmcgU1JDIHRvIERTVC4gICovCitleHRlcm4gc2l6ZV90IHdjc25ydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19kc3QsCisJCQkgIF9fY29uc3Qgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19zcmMsCisJCQkgIHNpemVfdCBfX253Yywgc2l6ZV90IF9fbGVuLAorCQkJICBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgX19USFJPVzsKKyNlbmRpZgkvKiB1c2UgR05VICovCisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4dGVuc2lvbnMgZm91bmQgaW4gWC9PcGVuIENBRS4gICovCisjaWZkZWYgX19VU0VfWE9QRU4KKy8qIERldGVybWluZSBudW1iZXIgb2YgY29sdW1uIHBvc2l0aW9ucyByZXF1aXJlZCBmb3IgQy4gICovCitleHRlcm4gaW50IHdjd2lkdGggKHdjaGFyX3QgX19jKSBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIGNvbHVtbiBwb3NpdGlvbnMgcmVxdWlyZWQgZm9yIGZpcnN0IE4gd2lkZQorICAgY2hhcmFjdGVycyAob3IgZmV3ZXIgaWYgUyBlbmRzIGJlZm9yZSB0aGlzKSBpbiBTLiAgKi8KK2V4dGVybiBpbnQgd2Nzd2lkdGggKF9fY29uc3Qgd2NoYXJfdCAqX19zLCBzaXplX3QgX19uKSBfX1RIUk9XOworI2VuZGlmCS8qIFVzZSBYL09wZW4uICAqLworCisKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2YgdGhlIHdpZGUgc3RyaW5nIE5QVFIgdG8gYGRvdWJsZScKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK2V4dGVybiBkb3VibGUgd2NzdG9kIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkgICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0cikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9TVEQKKworI2lmZGVmIF9fVVNFX0lTT0M5OQorX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBMaWtld2lzZSBmb3IgYGZsb2F0JyBhbmQgYGxvbmcgZG91YmxlJyBzaXplcyBvZiBmbG9hdGluZy1wb2ludCBudW1iZXJzLiAgKi8KK2V4dGVybiBmbG9hdCB3Y3N0b2YgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCSAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIpIF9fVEhST1c7CitleHRlcm4gbG9uZyBkb3VibGUgd2NzdG9sZCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0cikgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZiAvKiBDOTkgKi8KKworCitfX0JFR0lOX05BTUVTUEFDRV9TVEQKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHdpZGUgc3RyaW5nIE5QVFIgdG8gYGxvbmcgaW50JworICAgcmVwcmVzZW50YXRpb24uICAqLworZXh0ZXJuIGxvbmcgaW50IHdjc3RvbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSBfX1RIUk9XOworCisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB3aWRlIHN0cmluZyBOUFRSIHRvIGB1bnNpZ25lZCBsb25nIGludCcKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGludCB3Y3N0b3VsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpCisgICAgIF9fVEhST1c7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKyNpZiBkZWZpbmVkIF9fVVNFX0lTT0M5OSB8fCAoZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9fVVNFX0dOVSkKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2Ygd2lkZSBzdHJpbmcgTlBUUiB0byBgbG9uZyBsb25nIGludCcKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiBsb25nIGxvbmcgaW50IHdjc3RvbGwgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKKyAgICAgX19USFJPVzsKKworLyogQ29udmVydCBpbml0aWFsIHBvcnRpb24gb2Ygd2lkZSBzdHJpbmcgTlBUUiB0byBgdW5zaWduZWQgbG9uZyBsb25nIGludCcKKyAgIHJlcHJlc2VudGF0aW9uLiAgKi8KK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHdjc3RvdWxsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCQl3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkJaW50IF9fYmFzZSkgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKyNlbmRpZiAvKiBJU08gQzk5IG9yIEdDQyBhbmQgR05VLiAgKi8KKworI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX1VTRV9HTlUKKy8qIENvbnZlcnQgaW5pdGlhbCBwb3J0aW9uIG9mIHdpZGUgc3RyaW5nIE5QVFIgdG8gYGxvbmcgbG9uZyBpbnQnCisgICByZXByZXNlbnRhdGlvbi4gICovCitfX2V4dGVuc2lvbl9fCitleHRlcm4gbG9uZyBsb25nIGludCB3Y3N0b3EgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKQorICAgICBfX1RIUk9XOworCisvKiBDb252ZXJ0IGluaXRpYWwgcG9ydGlvbiBvZiB3aWRlIHN0cmluZyBOUFRSIHRvIGB1bnNpZ25lZCBsb25nIGxvbmcgaW50JworICAgcmVwcmVzZW50YXRpb24uICAqLworX19leHRlbnNpb25fXworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgd2NzdG91cSAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCQkgICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJICAgICAgIGludCBfX2Jhc2UpIF9fVEhST1c7CisjZW5kaWYgLyogR0NDIGFuZCB1c2UgR05VLiAgKi8KKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlIGNvbmNlcHQgb2Ygb25lIHN0YXRpYyBsb2NhbGUgcGVyIGNhdGVnb3J5IGlzIG5vdCB2ZXJ5IHdlbGwKKyAgIHRob3VnaHQgb3V0LiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIHRvIHByb2Nlc3MgaXRzIGRhdGEgdXNpbmcKKyAgIGluZm9ybWF0aW9uIGZyb20gc2V2ZXJhbCBkaWZmZXJlbnQgbG9jYWxlcy4gIEFub3RoZXIgYXBwbGljYXRpb24gaXMKKyAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYXRpb25hbGl6YXRpb24gaGFuZGxpbmcgaW4gdGhlCisgICB1cGNvbWluZyBJU08gQysrIHN0YW5kYXJkIGxpYnJhcnkuICBUbyBzdXBwb3J0IHRoaXMgYW5vdGhlciBzZXQgb2YKKyAgIHRoZSBmdW5jdGlvbnMgdXNpbmcgbG9jYWxlIGRhdGEgZXhpc3Qgd2hpY2ggaGF2ZSBhbiBhZGRpdGlvbmFsCisgICBhcmd1bWVudC4KKworICAgQXR0ZW50aW9uOiBhbGwgdGhlc2UgZnVuY3Rpb25zIGFyZSAqbm90KiBzdGFuZGFyZGl6ZWQgaW4gYW55IGZvcm0uCisgICBUaGlzIGlzIGEgcHJvb2Ytb2YtY29uY2VwdCBpbXBsZW1lbnRhdGlvbi4gICovCisKKy8qIFN0cnVjdHVyZSBmb3IgcmVlbnRyYW50IGxvY2FsZSB1c2luZyBmdW5jdGlvbnMuICBUaGlzIGlzIGFuCisgICAoYWxtb3N0KSBvcGFxdWUgdHlwZSBmb3IgdGhlIHVzZXIgbGV2ZWwgcHJvZ3JhbXMuICAqLworIyBpbmNsdWRlIDx4bG9jYWxlLmg+CisKKy8qIFNwZWNpYWwgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGljaCB0YWtlIHRoZSBsb2NhbGUgdG8KKyAgIHVzZSBhcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlci4gICovCitleHRlcm4gbG9uZyBpbnQgd2NzdG9sX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlLAorCQkJICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgd2NzdG91bF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCSAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKKwkJCQkgICAgaW50IF9fYmFzZSwgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKworX19leHRlbnNpb25fXworZXh0ZXJuIGxvbmcgbG9uZyBpbnQgd2NzdG9sbF9sIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAorCQkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJCWludCBfX2Jhc2UsIF9fbG9jYWxlX3QgX19sb2MpIF9fVEhST1c7CisKK19fZXh0ZW5zaW9uX18KK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHdjc3RvdWxsX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCQkJCSAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCisJCQkJCSAgaW50IF9fYmFzZSwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVzsKKworZXh0ZXJuIGRvdWJsZSB3Y3N0b2RfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBfX2xvY2FsZV90IF9fbG9jKQorICAgICBfX1RIUk9XOworCitleHRlcm4gZmxvYXQgd2NzdG9mX2wgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCisJCSAgICAgICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgX19sb2NhbGVfdCBfX2xvYykKKyAgICAgX19USFJPVzsKKworZXh0ZXJuIGxvbmcgZG91YmxlIHdjc3RvbGRfbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKKwkJCSAgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAorCQkJICAgICAgX19sb2NhbGVfdCBfX2xvYykgX19USFJPVzsKKyNlbmRpZiAvKiBHTlUgKi8KKworCisjaWZkZWYJX19VU0VfR05VCisvKiBDb3B5IFNSQyB0byBERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nIEwnXDAnIGluCisgICBERVNULiAgKi8KK2V4dGVybiB3Y2hhcl90ICp3Y3BjcHkgKHdjaGFyX3QgKl9fZGVzdCwgX19jb25zdCB3Y2hhcl90ICpfX3NyYykgX19USFJPVzsKKworLyogQ29weSBubyBtb3JlIHRoYW4gTiBjaGFyYWN0ZXJzIG9mIFNSQyB0byBERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YKKyAgIHRoZSBsYXN0IGNoYXJhY3RlciB3cml0dGVuIGludG8gREVTVC4gICovCitleHRlcm4gd2NoYXJfdCAqd2NwbmNweSAod2NoYXJfdCAqX19kZXN0LCBfX2NvbnN0IHdjaGFyX3QgKl9fc3JjLCBzaXplX3QgX19uKQorICAgICBfX1RIUk9XOworI2VuZGlmCS8qIHVzZSBHTlUgKi8KKworCisvKiBXaWRlIGNoYXJhY3RlciBJL08gZnVuY3Rpb25zLiAgKi8KKworI2lmZGVmCV9fVVNFX0dOVQorLyogTGlrZSBPUEVOX01FTVNUUkVBTSwgYnV0IHRoZSBzdHJlYW0gaXMgd2lkZSBvcmllbnRlZCBhbmQgcHJvZHVjZXMKKyAgIGEgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgKi8KK2V4dGVybiBfX0ZJTEUgKm9wZW5fd21lbXN0cmVhbSAod2NoYXJfdCAqKl9fYnVmbG9jLCBzaXplX3QgKl9fc2l6ZWxvYykgX19USFJPVzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX1VTRV9JU09DOTUgfHwgZGVmaW5lZCBfX1VTRV9VTklYOTgKK19fQkVHSU5fTkFNRVNQQUNFX1NURAorCisvKiBTZWxlY3Qgb3JpZW50YXRpb24gZm9yIHN0cmVhbS4gICovCitleHRlcm4gaW50IGZ3aWRlIChfX0ZJTEUgKl9fZnAsIGludCBfX21vZGUpIF9fVEhST1c7CisKKworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDIsIDMpKSkgKi87CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHdwcmludGYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDEsIDIpKSkgKi87CisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IG9mIGF0IG1vc3QgTiBjaGFyYWN0ZXJzIHRvIFMuICAqLworZXh0ZXJuIGludCBzd3ByaW50ZiAod2NoYXJfdCAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCAzLCA0KSkpICovOworCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIFMgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZmd3ByaW50ZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fcywKKwkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3ByaW50Zl9fLCAyLCAwKSkpICovOworLyogV3JpdGUgZm9ybWF0dGVkIG91dHB1dCB0byBzdGRvdXQgZnJvbSBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZ3cHJpbnRmIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCSAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dwcmludGZfXywgMSwgMCkpKSAqLzsKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgb2YgYXQgbW9zdCBOIGNoYXJhY3RlciB0byBTIGZyb20gYXJndW1lbnQKKyAgIGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnN3cHJpbnRmICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKKwkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193cHJpbnRmX18sIDMsIDApKSkgKi87CisKKworLyogUmVhZCBmb3JtYXR0ZWQgaW5wdXQgZnJvbSBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmd3NjYW5mIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCSAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDMpKSkgKi87CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIHN0ZGluLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDEsIDIpKSkgKi87CisvKiBSZWFkIGZvcm1hdHRlZCBpbnB1dCBmcm9tIFMuICAqLworZXh0ZXJuIGludCBzd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLAorCQkgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDMpKSkgKi87CisKKyMgaWYgZGVmaW5lZCBfX1VTRV9JU09DOTkgJiYgIWRlZmluZWQgX19VU0VfR05VIFwKKyAgICAgJiYgKCFkZWZpbmVkIF9fTERCTF9DT01QQVQgfHwgIWRlZmluZWQgX19SRURJUkVDVCkgXAorICAgICAmJiAoZGVmaW5lZCBfX1NUUklDVF9BTlNJX18gfHwgZGVmaW5lZCBfX1VTRV9YT1BFTjJLKQorIyAgaWZkZWYgX19SRURJUkVDVAorLyogRm9yIHN0cmljdCBJU08gQzk5IG9yIFBPU0lYIGNvbXBsaWFuY2UgZGlzYWxsb3cgJWFzLCAlYVMgYW5kICVhWworICAgR05VIGV4dGVuc2lvbiB3aGljaCBjb25mbGljdHMgd2l0aCB2YWxpZCAlYSBmb2xsb3dlZCBieSBsZXR0ZXIKKyAgIHMsIFMgb3IgWy4gICovCitleHRlcm4gaW50IF9fUkVESVJFQ1QgKGZ3c2NhbmYsIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCisJCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSwKKwkJICAgICAgIF9faXNvYzk5X2Z3c2NhbmYpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAzKSkpICovOworZXh0ZXJuIGludCBfX1JFRElSRUNUICh3c2NhbmYsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLiksCisJCSAgICAgICBfX2lzb2M5OV93c2NhbmYpCisgICAgIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAxLCAyKSkpICovOworZXh0ZXJuIGludCBfX1JFRElSRUNUIChzd3NjYW5mLCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKKwkJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pLAorCQkgICAgICAgX19pc29jOTlfc3dzY2FuZikKKyAgICAgX19USFJPVyAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMykpKSAqLzsKKyMgIGVsc2UKK2V4dGVybiBpbnQgX19pc29jOTlfZndzY2FuZiAoX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAorCQkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLik7CitleHRlcm4gaW50IF9faXNvYzk5X3dzY2FuZiAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pOworZXh0ZXJuIGludCBfX2lzb2M5OV9zd3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKKyAgICAgX19USFJPVzsKKyMgICBkZWZpbmUgZndzY2FuZiBfX2lzb2M5OV9md3NjYW5mCisjICAgZGVmaW5lIHdzY2FuZiBfX2lzb2M5OV93c2NhbmYKKyMgICBkZWZpbmUgc3dzY2FuZiBfX2lzb2M5OV9zd3NjYW5mCisjICBlbmRpZgorIyBlbmRpZgorCitfX0VORF9OQU1FU1BBQ0VfU1RECisjZW5kaWYgLyogVXNlIElTTyBDOTUsIEM5OSBhbmQgVW5peDk4LiAqLworCisjaWZkZWYgX19VU0VfSVNPQzk5CitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUyBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50IGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgdmZ3c2NhbmYgKF9fRklMRSAqX19yZXN0cmljdCBfX3MsCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMiwgMCkpKSAqLzsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gc3RkaW4gaW50byBhcmd1bWVudCBsaXN0IEFSRy4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gaW50IHZ3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICAvKiBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX193c2NhbmZfXywgMSwgMCkpKSAqLzsKKy8qIFJlYWQgZm9ybWF0dGVkIGlucHV0IGZyb20gUyBpbnRvIGFyZ3VtZW50IGxpc3QgQVJHLiAgKi8KK2V4dGVybiBpbnQgdnN3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKQorICAgICBfX1RIUk9XIC8qIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3dzY2FuZl9fLCAyLCAwKSkpICovOworCisjIGlmICFkZWZpbmVkIF9fVVNFX0dOVSBcCisgICAgICYmICghZGVmaW5lZCBfX0xEQkxfQ09NUEFUIHx8ICFkZWZpbmVkIF9fUkVESVJFQ1QpIFwKKyAgICAgJiYgKGRlZmluZWQgX19TVFJJQ1RfQU5TSV9fIHx8IGRlZmluZWQgX19VU0VfWE9QRU4ySykKKyMgIGlmZGVmIF9fUkVESVJFQ1QKK2V4dGVybiBpbnQgX19SRURJUkVDVCAodmZ3c2NhbmYsIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJCSAgX19nbnVjX3ZhX2xpc3QgX19hcmcpLCBfX2lzb2M5OV92ZndzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDApKSkgKi87CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHZ3c2NhbmYsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkJIF9fZ251Y192YV9saXN0IF9fYXJnKSwgX19pc29jOTlfdndzY2FuZikKKyAgICAgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDEsIDApKSkgKi87CitleHRlcm4gaW50IF9fUkVESVJFQ1QgKHZzd3NjYW5mLCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKKwkJCQkgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX2Zvcm1hdCwKKwkJCQkgIF9fZ251Y192YV9saXN0IF9fYXJnKSwgX19pc29jOTlfdnN3c2NhbmYpCisgICAgIF9fVEhST1cgLyogX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fd3NjYW5mX18sIDIsIDApKSkgKi87CisjICBlbHNlCitleHRlcm4gaW50IF9faXNvYzk5X3Zmd3NjYW5mIChfX0ZJTEUgKl9fcmVzdHJpY3QgX19zLAorCQkJICAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICAgICAgX19nbnVjX3ZhX2xpc3QgX19hcmcpOworZXh0ZXJuIGludCBfX2lzb2M5OV92d3NjYW5mIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgIF9fZ251Y192YV9saXN0IF9fYXJnKTsKK2V4dGVybiBpbnQgX19pc29jOTlfdnN3c2NhbmYgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MsCisJCQkgICAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19mb3JtYXQsCisJCQkgICAgICBfX2dudWNfdmFfbGlzdCBfX2FyZykgX19USFJPVzsKKyMgICBkZWZpbmUgdmZ3c2NhbmYgX19pc29jOTlfdmZ3c2NhbmYKKyMgICBkZWZpbmUgdndzY2FuZiBfX2lzb2M5OV92d3NjYW5mCisjICAgZGVmaW5lIHZzd3NjYW5mIF9faXNvYzk5X3Zzd3NjYW5mCisjICBlbmRpZgorIyBlbmRpZgorCitfX0VORF9OQU1FU1BBQ0VfQzk5CisjZW5kaWYgLyogVXNlIElTTyBDOTkuICovCisKKworX19CRUdJTl9OQU1FU1BBQ0VfU1RECisvKiBSZWFkIGEgY2hhcmFjdGVyIGZyb20gU1RSRUFNLgorCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBmZ2V0d2MgKF9fRklMRSAqX19zdHJlYW0pOworZXh0ZXJuIHdpbnRfdCBnZXR3YyAoX19GSUxFICpfX3N0cmVhbSk7CisKKy8qIFJlYWQgYSBjaGFyYWN0ZXIgZnJvbSBzdGRpbi4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludCBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IGdldHdjaGFyICh2b2lkKTsKKworCisvKiBXcml0ZSBhIGNoYXJhY3RlciB0byBTVFJFQU0uCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IGZwdXR3YyAod2NoYXJfdCBfX3djLCBfX0ZJTEUgKl9fc3RyZWFtKTsKK2V4dGVybiB3aW50X3QgcHV0d2MgKHdjaGFyX3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CisKKy8qIFdyaXRlIGEgY2hhcmFjdGVyIHRvIHN0ZG91dC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBwdXR3Y2hhciAod2NoYXJfdCBfX3djKTsKKworCisvKiBHZXQgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIG9mIGZpbml0ZSBsZW5ndGgKKyAgIGZyb20gU1RSRUFNLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgcG9zc2libGUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQgdGhlcmVmb3JlIG5vdAorICAgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2NoYXJfdCAqZmdldHdzICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fd3MsIGludCBfX24sCisJCQlfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pOworCisvKiBXcml0ZSBhIHN0cmluZyB0byBTVFJFQU0uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgYSBwb3NzaWJsZSBjYW5jZWxsYXRpb24gcG9pbnRzIGFuZCB0aGVyZWZvcmUgbm90CisgICBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiBpbnQgZnB1dHdzIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX193cywKKwkJICAgX19GSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKTsKKworCisvKiBQdXNoIGEgY2hhcmFjdGVyIGJhY2sgb250byB0aGUgaW5wdXQgYnVmZmVyIG9mIFNUUkVBTS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBhIHBvc3NpYmxlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kIHRoZXJlZm9yZSBub3QKKyAgIG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCB1bmdldHdjICh3aW50X3QgX193YywgX19GSUxFICpfX3N0cmVhbSk7CitfX0VORF9OQU1FU1BBQ0VfU1RECisKKworI2lmZGVmIF9fVVNFX0dOVQorLyogVGhlc2UgYXJlIGRlZmluZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgYGNoYXInIGZ1bmN0aW9ucyBkZWZpbmVkCisgICBpbiBQT1NJWC4xOjE5OTYuCisKKyAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIHRoZXkgYXJlIGNhbmNlbGxhdGlvbiBwb2ludHMgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdpbnRfdCBnZXR3Y191bmxvY2tlZCAoX19GSUxFICpfX3N0cmVhbSk7CitleHRlcm4gd2ludF90IGdldHdjaGFyX3VubG9ja2VkICh2b2lkKTsKKworLyogVGhpcyBpcyB0aGUgd2lkZSBjaGFyYWN0ZXIgdmVyc2lvbiBvZiBhIEdOVSBleHRlbnNpb24uCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3aW50X3QgZmdldHdjX3VubG9ja2VkIChfX0ZJTEUgKl9fc3RyZWFtKTsKKworLyogRmFzdGVyIHZlcnNpb24gd2hlbiBsb2NraW5nIGlzIG5vdCBuZWNlc3NhcnkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHBhcnQgb2YgUE9TSVggYW5kIHRoZXJlZm9yZSBubyBvZmZpY2lhbAorICAgY2FuY2VsbGF0aW9uIHBvaW50LiAgQnV0IGR1ZSB0byBzaW1pbGFyaXR5IHdpdGggYW4gUE9TSVggaW50ZXJmYWNlCisgICBvciBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIGEgY2FuY2VsbGF0aW9uIHBvaW50IGFuZAorICAgdGhlcmVmb3JlIG5vdCBtYXJrZWQgd2l0aCBfX1RIUk9XLiAgKi8KK2V4dGVybiB3aW50X3QgZnB1dHdjX3VubG9ja2VkICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOworCisvKiBUaGVzZSBhcmUgZGVmaW5lZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBgY2hhcicgZnVuY3Rpb25zIGRlZmluZWQKKyAgIGluIFBPU0lYLjE6MTk5Ni4KKworICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gdGhleSBhcmUgY2FuY2VsbGF0aW9uIHBvaW50cyBhbmQKKyAgIHRoZXJlZm9yZSBub3QgbWFya2VkIHdpdGggX19USFJPVy4gICovCitleHRlcm4gd2ludF90IHB1dHdjX3VubG9ja2VkICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOworZXh0ZXJuIHdpbnRfdCBwdXR3Y2hhcl91bmxvY2tlZCAod2NoYXJfdCBfX3djKTsKKworCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgYXMgYGZnZXR3cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIHdjaGFyX3QgKmZnZXR3c191bmxvY2tlZCAod2NoYXJfdCAqX19yZXN0cmljdCBfX3dzLCBpbnQgX19uLAorCQkJCSBfX0ZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pOworCisvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgYXMgYGZwdXR3cycgYnV0IGRvZXMgbm90IGxvY2sgdGhlIHN0cmVhbS4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcGFydCBvZiBQT1NJWCBhbmQgdGhlcmVmb3JlIG5vIG9mZmljaWFsCisgICBjYW5jZWxsYXRpb24gcG9pbnQuICBCdXQgZHVlIHRvIHNpbWlsYXJpdHkgd2l0aCBhbiBQT1NJWCBpbnRlcmZhY2UKKyAgIG9yIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gaXQgaXMgYSBjYW5jZWxsYXRpb24gcG9pbnQgYW5kCisgICB0aGVyZWZvcmUgbm90IG1hcmtlZCB3aXRoIF9fVEhST1cuICAqLworZXh0ZXJuIGludCBmcHV0d3NfdW5sb2NrZWQgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3dzLAorCQkJICAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CisjZW5kaWYKKworCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIEZvcm1hdCBUUCBpbnRvIFMgYWNjb3JkaW5nIHRvIEZPUk1BVC4KKyAgIFdyaXRlIG5vIG1vcmUgdGhhbiBNQVhTSVpFIHdpZGUgY2hhcmFjdGVycyBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgIG9mIHdpZGUgY2hhcmFjdGVycyB3cml0dGVuLCBvciAwIGlmIGl0IHdvdWxkIGV4Y2VlZCBNQVhTSVpFLiAgKi8KK2V4dGVybiBzaXplX3Qgd2NzZnRpbWUgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAorCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworIyBpZmRlZiBfX1VTRV9HTlUKKyMgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBTaW1pbGFyIHRvIGB3Y3NmdGltZScgYnV0IHRha2VzIHRoZSBpbmZvcm1hdGlvbiBmcm9tCisgICB0aGUgcHJvdmlkZWQgbG9jYWxlIGFuZCBub3QgdGhlIGdsb2JhbCBsb2NhbGUuICAqLworZXh0ZXJuIHNpemVfdCB3Y3NmdGltZV9sICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4c2l6ZSwKKwkJCSAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAorCQkJICBfX2NvbnN0IHN0cnVjdCB0bSAqX19yZXN0cmljdCBfX3RwLAorCQkJICBfX2xvY2FsZV90IF9fbG9jKSBfX1RIUk9XOworIyBlbmRpZgorCisvKiBUaGUgWC9PcGVuIHN0YW5kYXJkIGRlbWFuZHMgdGhhdCBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbgorICAgdGhlIDx3Y3R5cGUuaD4gaGVhZGVyIG11c3QgYWxzbyBhcHBlYXIgaGVyZS4gIFRoaXMgaXMgcHJvYmFibHkKKyAgIGJlY2F1c2Ugc29tZSBYL09wZW4gbWVtYmVycyB3cm90ZSB0aGVpciBpbXBsZW1lbnRhdGlvbiBiZWZvcmUgdGhlCisgICBJU08gQyBzdGFuZGFyZCB3YXMgcHVibGlzaGVkIGFuZCBpbnRyb2R1Y2VkIHRoZSBiZXR0ZXIgc29sdXRpb24uCisgICBXZSBoYXZlIHRvIHByb3ZpZGUgdGhlc2UgZGVmaW5pdGlvbnMgZm9yIGNvbXBsaWFuY2UgcmVhc29ucyBidXQgd2UKKyAgIGRvIHRoaXMgbm9uc2Vuc2Ugb25seSBpZiByZWFsbHkgbmVjZXNzYXJ5LiAgKi8KKyNpZiBkZWZpbmVkIF9fVVNFX1VOSVg5OCAmJiAhZGVmaW5lZCBfX1VTRV9HTlUKKyMgZGVmaW5lIF9fbmVlZF9pc3d4eHgKKyMgaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYKKworLyogRGVmaW5lIHNvbWUgbWFjcm9zIGhlbHBpbmcgdG8gY2F0Y2ggYnVmZmVyIG92ZXJmbG93cy4gICovCisjaWYgX19VU0VfRk9SVElGWV9MRVZFTCA+IDAgJiYgZGVmaW5lZCBfX2V4dGVybl9hbHdheXNfaW5saW5lCisjIGluY2x1ZGUgPGJpdHMvd2NoYXIyLmg+CisjZW5kaWYKKworI2lmZGVmIF9fTERCTF9DT01QQVQKKyMgaW5jbHVkZSA8Yml0cy93Y2hhci1sZGJsLmg+CisjZW5kaWYKKworX19FTkRfREVDTFMKKworI2VuZGlmCS8qIF9XQ0hBUl9IIGRlZmluZWQgKi8KKworLyogVW5kZWZpbmVkIGFsbCBfX25lZWRfKiBjb25zdGFudHMgaW4gY2FzZSB3ZSBhcmUgaW5jbHVkZWQgdG8gZ2V0IHRob3NlCisgICBjb25zdGFudHMgYnV0IHRoZSB3aG9sZSBmaWxlIHdhcyBhbHJlYWR5IHJlYWQuICAqLworI3VuZGVmIF9fbmVlZF9tYnN0YXRlX3QKKyN1bmRlZiBfX25lZWRfd2ludF90CisKKyNlbmRpZiAvKiB3Y2hhci5oICAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS93Y3R5cGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzMjU1OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd2N0eXBlLmgKQEAgLTAsMCArMSwzMTkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5Ni0yMDAyLCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisvKgorICoJSVNPIEM5OSBTdGFuZGFyZDogNy4yNQorICoJV2lkZSBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gYW5kIG1hcHBpbmcgdXRpbGl0aWVzICA8d2N0eXBlLmg+CisgKi8KKworI2lmbmRlZiBfV0NUWVBFX0gKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjaW5jbHVkZSA8Yml0cy90eXBlcy5oPgorCisjaWZuZGVmIF9fbmVlZF9pc3d4eHgKKyMgZGVmaW5lIF9XQ1RZUEVfSAkxCisKKy8qIEdldCB3aW50X3QgZnJvbSA8d2NoYXIuaD4uICAqLworIyBkZWZpbmUgX19uZWVkX3dpbnRfdAorIyBpbmNsdWRlIDx3Y2hhci5oPgorCisvKiBDb25zdGFudCBleHByZXNzaW9uIG9mIHR5cGUgYHdpbnRfdCcgd2hvc2UgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZAorICAgdG8gYW55IG1lbWJlciBvZiB0aGUgZXh0ZW5kZWQgY2hhcmFjdGVyIHNldC4gICovCisjIGlmbmRlZiBXRU9GCisjICBkZWZpbmUgV0VPRiAoMHhmZmZmZmZmZnUpCisjIGVuZGlmCisjZW5kaWYKKyN1bmRlZiBfX25lZWRfaXN3eHh4CisKKworLyogVGhlIGZvbGxvd2luZyBwYXJ0IGlzIGFsc28gdXNlZCBpbiB0aGUgPHdjc21icy5oPiBoZWFkZXIgd2hlbiBjb21waWxlZAorICAgaW4gdGhlIFVuaXg5OCBjb21wYXRpYmlsaXR5IG1vZGUuICAqLworI2lmbmRlZiBfX2lzd3h4eF9kZWZpbmVkCisjIGRlZmluZSBfX2lzd3h4eF9kZWZpbmVkCTEKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBTY2FsYXIgdHlwZSB0aGF0IGNhbiBob2xkIHZhbHVlcyB3aGljaCByZXByZXNlbnQgbG9jYWxlLXNwZWNpZmljCisgICBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb25zLiAgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgd2N0eXBlX3Q7CitfX0VORF9OQU1FU1BBQ0VfQzk5CisKKyMgaWZuZGVmIF9JU3diaXQKKy8qIFRoZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIHN0b3JlZCBhbHdheXMgaW4gbmV0d29yayBieXRlIG9yZGVyIChiaWcKKyAgIGVuZGlhbikuICBXZSBkZWZpbmUgdGhlIGJpdCB2YWx1ZSBpbnRlcnByZXRhdGlvbnMgaGVyZSBkZXBlbmRlbnQgb24gdGhlCisgICBtYWNoaW5lJ3MgYnl0ZSBvcmRlci4gICovCisKKyMgIGluY2x1ZGUgPGVuZGlhbi5oPgorIyAgaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyAgIGRlZmluZSBfSVN3Yml0KGJpdCkJKDEgPDwgKGJpdCkpCisjICBlbHNlIC8qIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gKi8KKyMgICBkZWZpbmUgX0lTd2JpdChiaXQpCVwKKwkoKGJpdCkgPCA4ID8gKGludCkgKCgxVUwgPDwgKGJpdCkpIDw8IDI0KQkJCSAgICAgIFwKKwkgOiAoKGJpdCkgPCAxNiA/IChpbnQpICgoMVVMIDw8IChiaXQpKSA8PCA4KQkJCSAgICAgIFwKKwkgICAgOiAoKGJpdCkgPCAyNCA/IChpbnQpICgoMVVMIDw8IChiaXQpKSA+PiA4KQkJCSAgICAgIFwKKwkgICAgICAgOiAoaW50KSAoKDFVTCA8PCAoYml0KSkgPj4gMjQpKSkpCisjICBlbmRpZgorCitlbnVtCit7CisgIF9fSVN3dXBwZXIgPSAwLAkJCS8qIFVQUEVSQ0FTRS4gICovCisgIF9fSVN3bG93ZXIgPSAxLAkJCS8qIGxvd2VyY2FzZS4gICovCisgIF9fSVN3YWxwaGEgPSAyLAkJCS8qIEFscGhhYmV0aWMuICAqLworICBfX0lTd2RpZ2l0ID0gMywJCQkvKiBOdW1lcmljLiAgKi8KKyAgX19JU3d4ZGlnaXQgPSA0LAkJCS8qIEhleGFkZWNpbWFsIG51bWVyaWMuICAqLworICBfX0lTd3NwYWNlID0gNSwJCQkvKiBXaGl0ZXNwYWNlLiAgKi8KKyAgX19JU3dwcmludCA9IDYsCQkJLyogUHJpbnRpbmcuICAqLworICBfX0lTd2dyYXBoID0gNywJCQkvKiBHcmFwaGljYWwuICAqLworICBfX0lTd2JsYW5rID0gOCwJCQkvKiBCbGFuayAodXN1YWxseSBTUEMgYW5kIFRBQikuICAqLworICBfX0lTd2NudHJsID0gOSwJCQkvKiBDb250cm9sIGNoYXJhY3Rlci4gICovCisgIF9fSVN3cHVuY3QgPSAxMCwJCQkvKiBQdW5jdHVhdGlvbi4gICovCisgIF9fSVN3YWxudW0gPSAxMSwJCQkvKiBBbHBoYW51bWVyaWMuICAqLworCisgIF9JU3d1cHBlciA9IF9JU3diaXQgKF9fSVN3dXBwZXIpLAkvKiBVUFBFUkNBU0UuICAqLworICBfSVN3bG93ZXIgPSBfSVN3Yml0IChfX0lTd2xvd2VyKSwJLyogbG93ZXJjYXNlLiAgKi8KKyAgX0lTd2FscGhhID0gX0lTd2JpdCAoX19JU3dhbHBoYSksCS8qIEFscGhhYmV0aWMuICAqLworICBfSVN3ZGlnaXQgPSBfSVN3Yml0IChfX0lTd2RpZ2l0KSwJLyogTnVtZXJpYy4gICovCisgIF9JU3d4ZGlnaXQgPSBfSVN3Yml0IChfX0lTd3hkaWdpdCksCS8qIEhleGFkZWNpbWFsIG51bWVyaWMuICAqLworICBfSVN3c3BhY2UgPSBfSVN3Yml0IChfX0lTd3NwYWNlKSwJLyogV2hpdGVzcGFjZS4gICovCisgIF9JU3dwcmludCA9IF9JU3diaXQgKF9fSVN3cHJpbnQpLAkvKiBQcmludGluZy4gICovCisgIF9JU3dncmFwaCA9IF9JU3diaXQgKF9fSVN3Z3JhcGgpLAkvKiBHcmFwaGljYWwuICAqLworICBfSVN3YmxhbmsgPSBfSVN3Yml0IChfX0lTd2JsYW5rKSwJLyogQmxhbmsgKHVzdWFsbHkgU1BDIGFuZCBUQUIpLiAgKi8KKyAgX0lTd2NudHJsID0gX0lTd2JpdCAoX19JU3djbnRybCksCS8qIENvbnRyb2wgY2hhcmFjdGVyLiAgKi8KKyAgX0lTd3B1bmN0ID0gX0lTd2JpdCAoX19JU3dwdW5jdCksCS8qIFB1bmN0dWF0aW9uLiAgKi8KKyAgX0lTd2FsbnVtID0gX0lTd2JpdCAoX19JU3dhbG51bSkJLyogQWxwaGFudW1lcmljLiAgKi8KK307CisjIGVuZGlmIC8qIE5vdCBfSVN3Yml0ICAqLworCisKK19fQkVHSU5fREVDTFMKKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKgorICogV2lkZS1jaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gZnVuY3Rpb25zOiA3LjE1LjIuMS4KKyAqLworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIGBpc3dhbHBoYScgb3IgYGlzd2RpZ2l0JyBpcworICAgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2FsbnVtICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBgaXN3dXBwZXInIG9yICdpc3dsb3dlcicgaXMKKyAgIHRydWUsIG9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2YKKyAgIHdpZGUtY2hhcmFjdGVycyBmb3Igd2hpY2ggbm9uZSBvZiBgaXN3Y250cmwnLCBgaXN3ZGlnaXQnLAorICAgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3YWxwaGEgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgY29udHJvbCB3aWRlIGNoYXJhY3Rlci4gICovCitleHRlcm4gaW50IGlzd2NudHJsICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBkZWNpbWFsLWRpZ2l0CisgICBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3dkaWdpdCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciBmb3Igd2hpY2ggYGlzd3ByaW50JyBpcyB0cnVlIGFuZAorICAgYGlzd3NwYWNlJyBpcyBmYWxzZS4gICovCitleHRlcm4gaW50IGlzd2dyYXBoICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBsb3dlcmNhc2UgbGV0dGVyCisgICBvciBpcyBvbmUgb2YgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2gKKyAgIG5vbmUgb2YgYGlzd2NudHJsJywgYGlzd2RpZ2l0JywgYGlzd3B1bmN0Jywgb3IgYGlzd3NwYWNlJyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3bG93ZXIgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgcHJpbnRpbmcgd2lkZSBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3dwcmludCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSBwcmludGluZyB3aWRlIGNoYXJhY3RlciB0aGF0IGlzIG9uZSBvZiBhCisgICBsb2NhbGUtc3BlY2lmaWMgZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBuZWl0aGVyIGBpc3dzcGFjZScKKyAgIG5vciBgaXN3YWxudW0nIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dwdW5jdCAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbG9jYWxlLXNwZWNpZmljCisgICBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvciB3aGljaCBub25lIG9mIGBpc3dhbG51bScsIGBpc3dncmFwaCcsIG9yCisgICBgaXN3cHVuY3QnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dzcGFjZSAod2ludF90IF9fd2MpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGFuIHVwcGVyY2FzZSBsZXR0ZXIKKyAgIG9yIGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIG5vbmUKKyAgIG9mIGBpc3djbnRybCcsIGBpc3dkaWdpdCcsIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd3VwcGVyICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBoZXhhZGVjaW1hbC1kaWdpdAorICAgY2hhcmFjdGVyIGVxdWl2YWxlbnQgdG8gdGhhdCBwZXJmb3JtZWQgYmUgdGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQKKyAgIGluIHRoZSBwcmV2aW91cyBzdWJjbGF1c2UuICAqLworZXh0ZXJuIGludCBpc3d4ZGlnaXQgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIHN0YW5kYXJkIGJsYW5rCisgICB3aWRlIGNoYXJhY3RlciBvciBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXJzIGZvcgorICAgd2hpY2ggYGlzd2FsbnVtJyBpcyBmYWxzZS4gICovCisjIGlmZGVmIF9fVVNFX0lTT0M5OQorZXh0ZXJuIGludCBpc3dibGFuayAod2ludF90IF9fd2MpIF9fVEhST1c7CisjIGVuZGlmCisKKy8qCisgKiBFeHRlbnNpYmxlIHdpZGUtY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGZ1bmN0aW9uczogNy4xNS4yLjIuCisgKi8KKworLyogQ29uc3RydWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGEgY2xhc3Mgb2Ygd2lkZSBjaGFyYWN0ZXJzIGlkZW50aWZpZWQKKyAgIGJ5IHRoZSBzdHJpbmcgYXJndW1lbnQgUFJPUEVSVFkuICAqLworZXh0ZXJuIHdjdHlwZV90IHdjdHlwZSAoX19jb25zdCBjaGFyICpfX3Byb3BlcnR5KSBfX1RIUk9XOworCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgd2lkZS1jaGFyYWN0ZXIgV0MgaGFzIHRoZSBwcm9wZXJ0eSBkZXNjcmliZWQgYnkKKyAgIERFU0MuICAqLworZXh0ZXJuIGludCBpc3djdHlwZSAod2ludF90IF9fd2MsIHdjdHlwZV90IF9fZGVzYykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworCisvKgorICogV2lkZS1jaGFyYWN0ZXIgY2FzZS1tYXBwaW5nIGZ1bmN0aW9uczogNy4xNS4zLjEuCisgKi8KKworX19CRUdJTl9OQU1FU1BBQ0VfQzk5CisvKiBTY2FsYXIgdHlwZSB0aGF0IGNhbiBob2xkIHZhbHVlcyB3aGljaCByZXByZXNlbnQgbG9jYWxlLXNwZWNpZmljCisgICBjaGFyYWN0ZXIgbWFwcGluZ3MuICAqLwordHlwZWRlZiBfX2NvbnN0IF9faW50MzJfdCAqd2N0cmFuc190OworX19FTkRfTkFNRVNQQUNFX0M5OQorI2lmZGVmIF9fVVNFX0dOVQorX19VU0lOR19OQU1FU1BBQ0VfQzk5KHdjdHJhbnNfdCkKKyNlbmRpZgorCitfX0JFR0lOX05BTUVTUEFDRV9DOTkKKy8qIENvbnZlcnRzIGFuIHVwcGVyY2FzZSBsZXR0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG93ZXJjYXNlIGxldHRlci4gICovCitleHRlcm4gd2ludF90IHRvd2xvd2VyICh3aW50X3QgX193YykgX19USFJPVzsKKworLyogQ29udmVydHMgYW4gbG93ZXJjYXNlIGxldHRlciB0byB0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyLiAgKi8KK2V4dGVybiB3aW50X3QgdG93dXBwZXIgKHdpbnRfdCBfX3djKSBfX1RIUk9XOworX19FTkRfTkFNRVNQQUNFX0M5OQorCitfX0VORF9ERUNMUworCisjZW5kaWYJLyogbmVlZCBpc3d4eHguICAqLworCisKKy8qIFRoZSByZW1haW5pbmcgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlCisgICA8d2NzbWJzLmg+IGhlYWRlci4gICovCisjaWZkZWYgX1dDVFlQRV9ICisKKy8qCisgKiBFeHRlbnNpYmxlIHdpZGUtY2hhcmFjdGVyIG1hcHBpbmcgZnVuY3Rpb25zOiA3LjE1LjMuMi4KKyAqLworCitfX0JFR0lOX0RFQ0xTCisKK19fQkVHSU5fTkFNRVNQQUNFX0M5OQorLyogQ29uc3RydWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGEgbWFwcGluZyBiZXR3ZWVuIHdpZGUgY2hhcmFjdGVycworICAgaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIGFyZ3VtZW50IFBST1BFUlRZLiAgKi8KK2V4dGVybiB3Y3RyYW5zX3Qgd2N0cmFucyAoX19jb25zdCBjaGFyICpfX3Byb3BlcnR5KSBfX1RIUk9XOworCisvKiBNYXAgdGhlIHdpZGUgY2hhcmFjdGVyIFdDIHVzaW5nIHRoZSBtYXBwaW5nIGRlc2NyaWJlZCBieSBERVNDLiAgKi8KK2V4dGVybiB3aW50X3QgdG93Y3RyYW5zICh3aW50X3QgX193Yywgd2N0cmFuc190IF9fZGVzYykgX19USFJPVzsKK19fRU5EX05BTUVTUEFDRV9DOTkKKworIyBpZmRlZiBfX1VTRV9HTlUKKy8qIERlY2xhcmUgdGhlIGludGVyZmFjZSB0byBleHRlbmRlZCBsb2NhbGUgbW9kZWwuICAqLworIyAgaW5jbHVkZSA8eGxvY2FsZS5oPgorCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIGBpc3dhbHBoYScgb3IgYGlzd2RpZ2l0JyBpcworICAgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2FsbnVtX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIGBpc3d1cHBlcicgb3IgJ2lzd2xvd2VyJyBpcworICAgdHJ1ZSwgb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgaXMgb25lIG9mIGEgbG9jYWxlLXNwZWNpZmljIHNldCBvZgorICAgd2lkZS1jaGFyYWN0ZXJzIGZvciB3aGljaCBub25lIG9mIGBpc3djbnRybCcsIGBpc3dkaWdpdCcsCisgICBgaXN3cHVuY3QnLCBvciBgaXN3c3BhY2UnIGlzIHRydWUuICAqLworZXh0ZXJuIGludCBpc3dhbHBoYV9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IGNvbnRyb2wgd2lkZSBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3djbnRybF9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBkZWNpbWFsLWRpZ2l0CisgICBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3dkaWdpdF9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIGZvciB3aGljaCBgaXN3cHJpbnQnIGlzIHRydWUgYW5kCisgICBgaXN3c3BhY2UnIGlzIGZhbHNlLiAgKi8KK2V4dGVybiBpbnQgaXN3Z3JhcGhfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgbG93ZXJjYXNlIGxldHRlcgorICAgb3IgaXMgb25lIG9mIGEgbG9jYWxlLXNwZWNpZmljIHNldCBvZiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdoaWNoCisgICBub25lIG9mIGBpc3djbnRybCcsIGBpc3dkaWdpdCcsIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd2xvd2VyX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgcHJpbnRpbmcgd2lkZSBjaGFyYWN0ZXIuICAqLworZXh0ZXJuIGludCBpc3dwcmludF9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHByaW50aW5nIHdpZGUgY2hhcmFjdGVyIHRoYXQgaXMgb25lIG9mIGEKKyAgIGxvY2FsZS1zcGVjaWZpYyBldCBvZiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdoaWNoIG5laXRoZXIgYGlzd3NwYWNlJworICAgbm9yIGBpc3dhbG51bScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd3B1bmN0X2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIGxvY2FsZS1zcGVjaWZpYworICAgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3Igd2hpY2ggbm9uZSBvZiBgaXN3YWxudW0nLCBgaXN3Z3JhcGgnLCBvcgorICAgYGlzd3B1bmN0JyBpcyB0cnVlLiAgKi8KK2V4dGVybiBpbnQgaXN3c3BhY2VfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIFRlc3QgZm9yIGFueSB3aWRlIGNoYXJhY3RlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGFuIHVwcGVyY2FzZSBsZXR0ZXIKKyAgIG9yIGlzIG9uZSBvZiBhIGxvY2FsZS1zcGVjaWZpYyBzZXQgb2Ygd2lkZSBjaGFyYWN0ZXIgZm9yIHdoaWNoIG5vbmUKKyAgIG9mIGBpc3djbnRybCcsIGBpc3dkaWdpdCcsIGBpc3dwdW5jdCcsIG9yIGBpc3dzcGFjZScgaXMgdHJ1ZS4gICovCitleHRlcm4gaW50IGlzd3VwcGVyX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBUZXN0IGZvciBhbnkgd2lkZSBjaGFyYWN0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIGhleGFkZWNpbWFsLWRpZ2l0CisgICBjaGFyYWN0ZXIgZXF1aXZhbGVudCB0byB0aGF0IHBlcmZvcm1lZCBiZSB0aGUgZnVuY3Rpb25zIGRlc2NyaWJlZAorICAgaW4gdGhlIHByZXZpb3VzIHN1YmNsYXVzZS4gICovCitleHRlcm4gaW50IGlzd3hkaWdpdF9sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogVGVzdCBmb3IgYW55IHdpZGUgY2hhcmFjdGVyIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzdGFuZGFyZCBibGFuaworICAgd2lkZSBjaGFyYWN0ZXIgb3IgYSBsb2NhbGUtc3BlY2lmaWMgc2V0IG9mIHdpZGUgY2hhcmFjdGVycyBmb3IKKyAgIHdoaWNoIGBpc3dhbG51bScgaXMgZmFsc2UuICAqLworZXh0ZXJuIGludCBpc3dibGFua19sICh3aW50X3QgX193YywgX19sb2NhbGVfdCBfX2xvY2FsZSkgX19USFJPVzsKKworLyogQ29uc3RydWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGEgY2xhc3Mgb2Ygd2lkZSBjaGFyYWN0ZXJzIGlkZW50aWZpZWQKKyAgIGJ5IHRoZSBzdHJpbmcgYXJndW1lbnQgUFJPUEVSVFkuICAqLworZXh0ZXJuIHdjdHlwZV90IHdjdHlwZV9sIChfX2NvbnN0IGNoYXIgKl9fcHJvcGVydHksIF9fbG9jYWxlX3QgX19sb2NhbGUpCisgICAgIF9fVEhST1c7CisKKy8qIERldGVybWluZSB3aGV0aGVyIHRoZSB3aWRlLWNoYXJhY3RlciBXQyBoYXMgdGhlIHByb3BlcnR5IGRlc2NyaWJlZCBieQorICAgREVTQy4gICovCitleHRlcm4gaW50IGlzd2N0eXBlX2wgKHdpbnRfdCBfX3djLCB3Y3R5cGVfdCBfX2Rlc2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpCisgICAgIF9fVEhST1c7CisKKworLyoKKyAqIFdpZGUtY2hhcmFjdGVyIGNhc2UtbWFwcGluZyBmdW5jdGlvbnMuCisgKi8KKworLyogQ29udmVydHMgYW4gdXBwZXJjYXNlIGxldHRlciB0byB0aGUgY29ycmVzcG9uZGluZyBsb3dlcmNhc2UgbGV0dGVyLiAgKi8KK2V4dGVybiB3aW50X3QgdG93bG93ZXJfbCAod2ludF90IF9fd2MsIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKy8qIENvbnZlcnRzIGFuIGxvd2VyY2FzZSBsZXR0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdXBwZXJjYXNlIGxldHRlci4gICovCitleHRlcm4gd2ludF90IHRvd3VwcGVyX2wgKHdpbnRfdCBfX3djLCBfX2xvY2FsZV90IF9fbG9jYWxlKSBfX1RIUk9XOworCisvKiBDb25zdHJ1Y3QgdmFsdWUgdGhhdCBkZXNjcmliZXMgYSBtYXBwaW5nIGJldHdlZW4gd2lkZSBjaGFyYWN0ZXJzCisgICBpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgYXJndW1lbnQgUFJPUEVSVFkuICAqLworZXh0ZXJuIHdjdHJhbnNfdCB3Y3RyYW5zX2wgKF9fY29uc3QgY2hhciAqX19wcm9wZXJ0eSwgX19sb2NhbGVfdCBfX2xvY2FsZSkKKyAgICAgX19USFJPVzsKKworLyogTWFwIHRoZSB3aWRlIGNoYXJhY3RlciBXQyB1c2luZyB0aGUgbWFwcGluZyBkZXNjcmliZWQgYnkgREVTQy4gICovCitleHRlcm4gd2ludF90IHRvd2N0cmFuc19sICh3aW50X3QgX193Yywgd2N0cmFuc190IF9fZGVzYywKKwkJCSAgIF9fbG9jYWxlX3QgX19sb2NhbGUpIF9fVEhST1c7CisKKyMgZW5kaWYgLyogVXNlIEdOVS4gICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZgkvKiBfX1dDVFlQRV9IIGRlZmluZWQuICAqLworCisjZW5kaWYgLyogd2N0eXBlLmggICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3dvcmRleHAuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvd29yZGV4cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDBlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3dvcmRleHAuaApAQCAtMCwwICsxLDcxIEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCAxOTk2LTE5OTksIDIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKyNpZm5kZWYJX1dPUkRFWFBfSAorI2RlZmluZQlfV09SREVYUF9ICTEKKworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZGVmaW5lIF9fbmVlZF9zaXplX3QKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworX19CRUdJTl9ERUNMUworCisvKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYHdvcmRleHAnLiAgKi8KK2VudW0KKyAgeworICAgIFdSREVfRE9PRkZTID0gKDEgPDwgMCksCS8qIEluc2VydCBQV09SREVYUC0+d2Vfb2ZmcyBOVUxMcy4gICovCisgICAgV1JERV9BUFBFTkQgPSAoMSA8PCAxKSwJLyogQXBwZW5kIHRvIHJlc3VsdHMgb2YgYSBwcmV2aW91cyBjYWxsLiAgKi8KKyAgICBXUkRFX05PQ01EID0gKDEgPDwgMiksCS8qIERvbid0IGRvIGNvbW1hbmQgc3Vic3RpdHV0aW9uLiAgKi8KKyAgICBXUkRFX1JFVVNFID0gKDEgPDwgMyksCS8qIFJldXNlIHN0b3JhZ2UgaW4gUFdPUkRFWFAuICAqLworICAgIFdSREVfU0hPV0VSUiA9ICgxIDw8IDQpLAkvKiBEb24ndCByZWRpcmVjdCBzdGRlcnIgdG8gL2Rldi9udWxsLiAgKi8KKyAgICBXUkRFX1VOREVGID0gKDEgPDwgNSksCS8qIEVycm9yIGZvciBleHBhbmRpbmcgdW5kZWZpbmVkIHZhcmlhYmxlcy4gICovCisgICAgX19XUkRFX0ZMQUdTID0gKFdSREVfRE9PRkZTIHwgV1JERV9BUFBFTkQgfCBXUkRFX05PQ01EIHwKKwkJICAgIFdSREVfUkVVU0UgfCBXUkRFX1NIT1dFUlIgfCBXUkRFX1VOREVGKQorICB9OworCisvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHdvcmQtZXhwYW5zaW9uIHJ1bi4gICovCit0eXBlZGVmIHN0cnVjdAorICB7CisgICAgc2l6ZV90IHdlX3dvcmRjOwkJLyogQ291bnQgb2Ygd29yZHMgbWF0Y2hlZC4gICovCisgICAgY2hhciAqKndlX3dvcmR2OwkJLyogTGlzdCBvZiBleHBhbmRlZCB3b3Jkcy4gICovCisgICAgc2l6ZV90IHdlX29mZnM7CQkvKiBTbG90cyB0byByZXNlcnZlIGluIGB3ZV93b3JkdicuICAqLworICB9IHdvcmRleHBfdDsKKworLyogUG9zc2libGUgbm9uemVybyByZXR1cm4gdmFsdWVzIGZyb20gYHdvcmRleHAnLiAgKi8KK2VudW0KKyAgeworI2lmZGVmIF9fVVNFX1hPUEVOCisgICAgV1JERV9OT1NZUyA9IC0xLAkJLyogTmV2ZXIgdXNlZCBzaW5jZSB3ZSBzdXBwb3J0IGB3b3JkZXhwJy4gICovCisjZW5kaWYKKyAgICBXUkRFX05PU1BBQ0UgPSAxLAkJLyogUmFuIG91dCBvZiBtZW1vcnkuICAqLworICAgIFdSREVfQkFEQ0hBUiwJCS8qIEEgbWV0YWNoYXIgYXBwZWFycyBpbiB0aGUgd3JvbmcgcGxhY2UuICAqLworICAgIFdSREVfQkFEVkFMLAkJLyogVW5kZWZpbmVkIHZhciByZWZlcmVuY2Ugd2l0aCBXUkRFX1VOREVGLiAgKi8KKyAgICBXUkRFX0NNRFNVQiwJCS8qIENvbW1hbmQgc3Vic3RpdHV0aW9uIHdpdGggV1JERV9OT0NNRC4gICovCisgICAgV1JERV9TWU5UQVgJCQkvKiBTaGVsbCBzeW50YXggZXJyb3IuICAqLworICB9OworCisvKiBEbyB3b3JkIGV4cGFuc2lvbiBvZiBXT1JEUyBpbnRvIFBXT1JERVhQLiAgKi8KK2V4dGVybiBpbnQgd29yZGV4cCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fd29yZHMsCisJCSAgICB3b3JkZXhwX3QgKl9fcmVzdHJpY3QgX19wd29yZGV4cCwgaW50IF9fZmxhZ3MpOworCisvKiBGcmVlIHRoZSBzdG9yYWdlIGFsbG9jYXRlZCBieSBhIGB3b3JkZXhwJyBjYWxsLiAgKi8KK2V4dGVybiB2b2lkIHdvcmRmcmVlICh3b3JkZXhwX3QgKl9fd29yZGV4cCkgX19USFJPVzsKKworX19FTkRfREVDTFMKKworI2VuZGlmIC8qIHdvcmRleHAuaCAgKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUveGxvY2FsZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS94bG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxN2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUveGxvY2FsZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qIERlZmluaXRpb24gb2YgbG9jYWxlIGRhdGF0eXBlLgorICAgQ29weXJpZ2h0IChDKSAxOTk3LDIwMDAsMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk3LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworI2lmbmRlZiBfWExPQ0FMRV9ICisjZGVmaW5lIF9YTE9DQUxFX0gJMQorCisvKiBTdHJ1Y3R1cmUgZm9yIHJlZW50cmFudCBsb2NhbGUgdXNpbmcgZnVuY3Rpb25zLiAgVGhpcyBpcyBhbgorICAgKGFsbW9zdCkgb3BhcXVlIHR5cGUgZm9yIHRoZSB1c2VyIGxldmVsIHByb2dyYW1zLiAgVGhlIGZpbGUgYW5kCisgICB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIG5vdCBzdGFuZGFyZGl6ZWQuICBEb24ndCByZWx5IG9uIGl0LiAgSXQgY2FuCisgICBnbyBhd2F5IHdpdGhvdXQgd2FybmluZy4gICovCit0eXBlZGVmIHN0cnVjdCBfX2xvY2FsZV9zdHJ1Y3QKK3sKKyAgLyogTm90ZTogTENfQUxMIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gdGhpcyBhcnJheS4gICovCisgIHN0cnVjdCBsb2NhbGVfZGF0YSAqX19sb2NhbGVzWzEzXTsgLyogMTMgPSBfX0xDX0xBU1QuICovCisKKyAgLyogVG8gaW5jcmVhc2UgdGhlIHNwZWVkIG9mIHRoaXMgc29sdXRpb24gd2UgYWRkIHNvbWUgc3BlY2lhbCBtZW1iZXJzLiAgKi8KKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICpfX2N0eXBlX2I7CisgIGNvbnN0IGludCAqX19jdHlwZV90b2xvd2VyOworICBjb25zdCBpbnQgKl9fY3R5cGVfdG91cHBlcjsKKworICAvKiBOb3RlOiBMQ19BTEwgaXMgbm90IGEgdmFsaWQgaW5kZXggaW50byB0aGlzIGFycmF5LiAgKi8KKyAgY29uc3QgY2hhciAqX19uYW1lc1sxM107Cit9ICpfX2xvY2FsZV90OworCisjZW5kaWYgLyogeGxvY2FsZS5oICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3pjb25mLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3pjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMwNDdiZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvemNvbmYuaApAQCAtMCwwICsxLDM5NCBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA2IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisKKy8qCisgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCisgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAorICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgorICovCisjaWZkZWYgWl9QUkVGSVggICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKworLyogYWxsIGxpbmtlZCBzeW1ib2xzICovCisjICBkZWZpbmUgX2Rpc3RfY29kZSAgICAgICAgICAgIHpfX2Rpc3RfY29kZQorIyAgZGVmaW5lIF9sZW5ndGhfY29kZSAgICAgICAgICB6X19sZW5ndGhfY29kZQorIyAgZGVmaW5lIF90cl9hbGlnbiAgICAgICAgICAgICB6X190cl9hbGlnbgorIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jaworIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0CisjICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jaworIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQorIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKKyMgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgorIyAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XworIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKKyMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQorIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0CisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgZGVmaW5lIGd6Y2xlYXJlcnIgICAgICAgICAgICB6X2d6Y2xlYXJlcnIKKyMgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCisjICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKKyMgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCisjICBkZWZpbmUgZ3plb2YgICAgICAgICAgICAgICAgIHpfZ3plb2YKKyMgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCisjICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAorIyAgZGVmaW5lIGd6Z2V0YyAgICAgICAgICAgICAgICB6X2d6Z2V0YworIyAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cworIyAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgorIyAgZGVmaW5lIGd6cHJpbnRmICAgICAgICAgICAgICB6X2d6cHJpbnRmCisjICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCisjICBkZWZpbmUgZ3pwdXRzICAgICAgICAgICAgICAgIHpfZ3pwdXRzCisjICBkZWZpbmUgZ3pyZWFkICAgICAgICAgICAgICAgIHpfZ3pyZWFkCisjICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKKyMgIGRlZmluZSBnenNlZWsgICAgICAgICAgICAgICAgel9nenNlZWsKKyMgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcworIyAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAorIyAgZGVmaW5lIGd6dW5nZXRjICAgICAgICAgICAgICB6X2d6dW5nZXRjCisjICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQorIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tJbml0XyAgICAgIHpfaW5mbGF0ZUJhY2tJbml0XworIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5CisjICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVHZXRIZWFkZXIgICAgICB6X2luZmxhdGVHZXRIZWFkZXIKKyMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCisjICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCisjICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBkZWZpbmUgel9lcnJtc2cgICAgICAgICAgICAgIHpfel9lcnJtc2cKKyMgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCisKKy8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQorIyAgZGVmaW5lIGd6X2hlYWRlciAgICAgICAgICAgICB6X2d6X2hlYWRlcgorIyAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgaW50ZiAgICAgICAgICAgICAgICAgIHpfaW50ZgorIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVJbnRmICAgICAgICAgICAgICAgICB6X3VJbnRmCisjICBkZWZpbmUgdUxvbmcgICAgICAgICAgICAgICAgIHpfdUxvbmcKKyMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKKyMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisjICBkZWZpbmUgel9zdHJlYW0gICAgICAgICAgICAgIHpfel9zdHJlYW0KKyMgIGRlZmluZSB6X3N0cmVhbXAgICAgICAgICAgICAgel96X3N0cmVhbXAKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcworIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisjICBkZWZpbmUgel9zdHJlYW1fcyAgICAgICAgICAgIHpfel9zdHJlYW1fcworCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1ZJU0lCSUxJVFlfUFJBR01BCisjICBkZWZpbmUgWkVYVEVSTiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkgZXh0ZXJuCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2luY2x1ZGUgInpsaWJkZWZzLmgiICAgICAgIC8qIGNyZWF0ZWQgYnkgY29uZmlndXJlICovCisKKyNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisjICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3psaWIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTY0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL3psaWIuaApAQCAtMCwwICsxLDEzOTkgQEAKKy8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICB2ZXJzaW9uIDEuMi4zLjMsIE9jdG9iZXIgMm5kLCAyMDA2CisKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKworCisgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0CisgICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkgYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCisqLworCisjaWZuZGVmIFpMSUJfSAorI2RlZmluZSBaTElCX0gKKworI2luY2x1ZGUgInpjb25mLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMi4zLjMiCisjZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTIzMworI2RlZmluZSBaTElCX1ZFUl9NQUpPUiAxCisjZGVmaW5lIFpMSUJfVkVSX01JTk9SIDIKKyNkZWZpbmUgWkxJQl9WRVJfUkVWSVNJT04gMworCisvKgorICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAorICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAorICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKKyAgc3RyZWFtIGludGVyZmFjZS4KKworICAgICBDb21wcmVzc2lvbiBjYW4gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwIGlmIHRoZSBidWZmZXJzIGFyZSBsYXJnZQorICBlbm91Z2ggKGZvciBleGFtcGxlIGlmIGFuIGlucHV0IGZpbGUgaXMgbW1hcCdlZCksIG9yIGNhbiBiZSBkb25lIGJ5CisgIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyAgKHByb3ZpZGluZyBtb3JlIG91dHB1dCBzcGFjZSkgYmVmb3JlIGVhY2ggY2FsbC4KKworICAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKKyAgdGhlIHpsaWIgZm9ybWF0LCB3aGljaCBpcyBhIHpsaWIgd3JhcHBlciBkb2N1bWVudGVkIGluIFJGQyAxOTUwLCB3cmFwcGVkCisgIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLCB3aGljaCBpcyBpdHNlbGYgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MS4KKworICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAorICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCisgIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKworICAgICBUaGlzIGxpYnJhcnkgY2FuIG9wdGlvbmFsbHkgcmVhZCBhbmQgd3JpdGUgZ3ppcCBzdHJlYW1zIGluIG1lbW9yeSBhcyB3ZWxsLgorCisgICAgIFRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gYmUgY29tcGFjdCBhbmQgZmFzdCBmb3IgdXNlIGluIG1lbW9yeQorICBhbmQgb24gY29tbXVuaWNhdGlvbnMgY2hhbm5lbHMuICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIGZvciBzaW5nbGUtCisgIGZpbGUgY29tcHJlc3Npb24gb24gZmlsZSBzeXN0ZW1zLCBoYXMgYSBsYXJnZXIgaGVhZGVyIHRoYW4gemxpYiB0byBtYWludGFpbgorICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGFuZCB1c2VzIGEgZGlmZmVyZW50LCBzbG93ZXIgY2hlY2sgbWV0aG9kIHRoYW4gemxpYi4KKworICAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKKyAgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyovCisKK3R5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpmcmVlX2Z1bmMpICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIGFkZHJlc3MpKTsKKworc3RydWN0IGludGVybmFsX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKyAgICBCeXRlZiAgICAqbmV4dF9pbjsgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLworICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCisgICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCisgICAgQnl0ZWYgICAgKm5leHRfb3V0OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisgICAgdUxvbmcgICAgdG90YWxfb3V0OyAvKiB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovCisKKyAgICBjaGFyICAgICAqbXNnOyAgICAgIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKnN0YXRlOyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKworICAgIGFsbG9jX2Z1bmMgemFsbG9jOyAgLyogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICBmcmVlX2Z1bmMgIHpmcmVlOyAgIC8qIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKyAgICB2b2lkcGYgICAgIG9wYXF1ZTsgIC8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KKworICAgIGludCAgICAgZGF0YV90eXBlOyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqLworICAgIHVMb25nICAgYWRsZXI7ICAgICAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICB1TG9uZyAgIHJlc2VydmVkOyAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHpfc3RyZWFtOworCit0eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOworCisvKgorICAgICBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYW5kIGZyb20gemxpYiByb3V0aW5lcy4gIFNlZSBSRkMgMTk1MgorICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBtZWFuaW5ncyBvZiB0aGVzZSBmaWVsZHMuCisqLwordHlwZWRlZiBzdHJ1Y3QgZ3pfaGVhZGVyX3MgeworICAgIGludCAgICAgdGV4dDsgICAgICAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqLworICAgIHVMb25nICAgdGltZTsgICAgICAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKyAgICBpbnQgICAgIHhmbGFnczsgICAgIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCisgICAgaW50ICAgICBvczsgICAgICAgICAvKiBvcGVyYXRpbmcgc3lzdGVtICovCisgICAgQnl0ZWYgICAqZXh0cmE7ICAgICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovCisgICAgdUludCAgICBleHRyYV9sZW47ICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KKyAgICB1SW50ICAgIGV4dHJhX21heDsgIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgQnl0ZWYgICAqbmFtZTsgICAgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovCisgICAgdUludCAgICBuYW1lX21heDsgICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisgICAgQnl0ZWYgICAqY29tbWVudDsgICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqLworICAgIHVJbnQgICAgY29tbV9tYXg7ICAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIGludCAgICAgaGNyYzsgICAgICAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi8KKyAgICBpbnQgICAgIGRvbmU7ICAgICAgIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCit9IGd6X2hlYWRlcjsKKwordHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOworCisvKgorICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luIHdoZW4gYXZhaWxfaW4gaGFzCisgICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKKyAgIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKKyAgIG9wYXF1ZSBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQorICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uCisKKyAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAorICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQorICAgbWVtb3J5IG1hbmFnZW1lbnQuIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCisgICBvcGFxdWUgdmFsdWUuCisKKyAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCisgICBJZiB6bGliIGlzIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlCisgICB0aHJlYWQgc2FmZS4KKworICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKKyAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcworICAgaWYgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gV0FSTklORzogT24gTVNET1MsCisgICBwb2ludGVycyByZXR1cm5lZCBieSB6YWxsb2MgZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKKyAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgorICAgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiBUbyByZWR1Y2UgbWVtb3J5CisgICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgorICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgorCisgICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IKKyAgIHByb2dyZXNzIHJlcG9ydHMuIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZgorICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCisgICAocGFydGljdWxhcmx5IGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluCisgICBhIHNpbmdsZSBzdGVwKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLworCisjZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCisjZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxIC8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkICovCisjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCisjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCisjZGVmaW5lIFpfRklOSVNIICAgICAgICA0CisjZGVmaW5lIFpfQkxPQ0sgICAgICAgICA1CisvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKKyNkZWZpbmUgWl9TVFJFQU1fRU5EICAgIDEKKyNkZWZpbmUgWl9ORUVEX0RJQ1QgICAgIDIKKyNkZWZpbmUgWl9FUlJOTyAgICAgICAgKC0xKQorI2RlZmluZSBaX1NUUkVBTV9FUlJPUiAoLTIpCisjZGVmaW5lIFpfREFUQV9FUlJPUiAgICgtMykKKyNkZWZpbmUgWl9NRU1fRVJST1IgICAgKC00KQorI2RlZmluZSBaX0JVRl9FUlJPUiAgICAoLTUpCisjZGVmaW5lIFpfVkVSU0lPTl9FUlJPUiAoLTYpCisvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUKKyAqIHZhbHVlcyBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCisgKi8KKworI2RlZmluZSBaX05PX0NPTVBSRVNTSU9OICAgICAgICAgMAorI2RlZmluZSBaX0JFU1RfU1BFRUQgICAgICAgICAgICAgMQorI2RlZmluZSBaX0JFU1RfQ09NUFJFU1NJT04gICAgICAgOQorI2RlZmluZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04gICgtMSkKKy8qIGNvbXByZXNzaW9uIGxldmVscyAqLworCisjZGVmaW5lIFpfRklMVEVSRUQgICAgICAgICAgICAxCisjZGVmaW5lIFpfSFVGRk1BTl9PTkxZICAgICAgICAyCisjZGVmaW5lIFpfUkxFICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpfRklYRUQgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpfREVGQVVMVF9TVFJBVEVHWSAgICAwCisvKiBjb21wcmVzc2lvbiBzdHJhdGVneTsgc2VlIGRlZmxhdGVJbml0MigpIGJlbG93IGZvciBkZXRhaWxzICovCisKKyNkZWZpbmUgWl9CSU5BUlkgICAwCisjZGVmaW5lIFpfVEVYVCAgICAgMQorI2RlZmluZSBaX0FTQ0lJICAgIFpfVEVYVCAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjIgYW5kIGVhcmxpZXIgKi8KKyNkZWZpbmUgWl9VTktOT1dOICAyCisvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovCisKKyNkZWZpbmUgWl9ERUZMQVRFRCAgIDgKKy8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAodGhlIG9ubHkgb25lIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24pICovCisKKyNkZWZpbmUgWl9OVUxMICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIHphbGxvYywgemZyZWUsIG9wYXF1ZSAqLworCisjZGVmaW5lIHpsaWJfdmVyc2lvbiB6bGliVmVyc2lvbigpCisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDwgMS4wLjIgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24gT0YoKHZvaWQpKTsKKy8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCisgICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCisgKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwpKTsKKworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisgICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBkZWZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgb3IgYmV0d2VlbiAwIGFuZCA5OgorICAgMSBnaXZlcyBiZXN0IHNwZWVkLCA5IGdpdmVzIGJlc3QgY29tcHJlc3Npb24sIDAgZ2l2ZXMgbm8gY29tcHJlc3Npb24gYXQKKyAgIGFsbCAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuCisgICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKKyAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KKworICAgICBkZWZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgbGV2ZWwgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbGV2ZWwsCisgICBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzIGluY29tcGF0aWJsZQorICAgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuCisgICBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZSBzb21lCisgIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgIGZvbGxvd2luZyBhY3Rpb25zOgorCisgIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCisgICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgorICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCisgICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLgorICAgIFNvbWUgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCisKKyAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKKyAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dAorICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKKyAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCisgIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuIElmIGRlZmxhdGUgcmV0dXJucyBaX09LCisgIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX05PX0ZMVVNILCB3aGljaCBhbGxvd3MgZGVmbGF0ZSB0bworICBkZWNpZGUgaG93IG11Y2ggZGF0YSB0byBhY2N1bXVhbHRlIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0LCBpbiBvcmRlciB0bworICBtYXhpbWl6ZSBjb21wcmVzc2lvbi4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfU1lOQ19GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCisgIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCisgIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIChJbiBwYXJ0aWN1bGFyCisgIGF2YWlsX2luIGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZAorICBiZWZvcmUgdGhlIGNhbGwuKSAgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUgY29tcHJlc3Npb24KKyAgYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0ZVTExfRkxVU0gsIGFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoCisgIFpfU1lOQ19GTFVTSCwgYW5kIHRoZSBjb21wcmVzc2lvbiBzdGF0ZSBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCisgIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCisgIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gVXNpbmcgWl9GVUxMX0ZMVVNIIHRvbyBvZnRlbiBjYW4gc2VyaW91c2x5IGRlZ3JhZGUKKyAgY29tcHJlc3Npb24uCisKKyAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgYXZhaWxfb3V0KS4gSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAorICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bworICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCisKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCisgIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZQorICB3YXMgZW5vdWdoIG91dHB1dCBzcGFjZTsgaWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9PSywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiB3aXRoIFpfRklOSVNIIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpIGJ1dCBubworICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuIEFmdGVyCisgIGRlZmxhdGUgaGFzIHJldHVybmVkIFpfU1RSRUFNX0VORCwgdGhlIG9ubHkgcG9zc2libGUgb3BlcmF0aW9ucyBvbiB0aGUKKyAgc3RyZWFtIGFyZSBkZWZsYXRlUmVzZXQgb3IgZGVmbGF0ZUVuZC4KKworICAgIFpfRklOSVNIIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KKyAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0CisgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuIElmIGRlZmxhdGUgZG9lcyBub3QgcmV0dXJuCisgIFpfU1RSRUFNX0VORCwgdGhlbiBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgICBkZWZsYXRlKCkgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAorICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX2luIGJ5dGVzKS4KKworICAgIGRlZmxhdGUoKSBtYXkgdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoWl9CSU5BUlkgb3IgWl9URVhUKS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKKyAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKKyAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgorCisgICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKKyAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgorICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bworICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCisgIChmb3IgZXhhbXBsZSBhdmFpbF9pbiBvciBhdmFpbF9vdXQgd2FzIHplcm8pLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90CisgIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAorICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAorICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKKyAgIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlCisgICBkZWFsbG9jYXRlZCkuCisqLworCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworCisgICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKKyAgIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUgZXhhY3QKKyAgIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCisgICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCisgICBhY2NvcmRpbmdseTsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKKyAgIGluZmxhdGUuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KKyAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIGluZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQorICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCisgICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiBpbmZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uCisgICBhcGFydCBmcm9tIHBvc3NpYmx5IHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IGFjdHVhbCBkZWNvbXByZXNzaW9uCisgICB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAgKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0CisgICBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bnVzZWQgYW5kIHVuY2hhbmdlZC4pICBUaGUgY3VycmVudAorICAgaW1wbGVtZW50YXRpb24gb2YgaW5mbGF0ZUluaXQoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0KKyAgIHRoYXQgaXMgZGVmZXJyZWQgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCisgICAgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZQorICAgIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cKKyAgICBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgaW5mbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgorICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCisgIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2gKKyAgY2FsbCBvZiBpbmZsYXRlKCkuIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdAorICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCisgIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBUaGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBjYW4gYmUgWl9OT19GTFVTSCwgWl9TWU5DX0ZMVVNILAorICBaX0ZJTklTSCwgb3IgWl9CTE9DSy4gWl9TWU5DX0ZMVVNIIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIGZsdXNoIGFzIG11Y2gKKyAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIHN0b3AKKyAgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiBXaGVuIGRlY29kaW5nIHRoZQorICB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlcgorICB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiBXaGVuIGRvaW5nIGEgcmF3IGluZmxhdGUsIGluZmxhdGUoKQorICB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuIHdoZW4gaXQgZ2V0cyB0bworICB0aGUgZW5kIG9mIHRoYXQgYmxvY2ssIG9yIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YS4KKworICAgIFRoZSBaX0JMT0NLIG9wdGlvbiBhc3Npc3RzIGluIGFwcGVuZGluZyB0byBvciBjb21iaW5pbmcgZGVmbGF0ZSBzdHJlYW1zLgorICBBbHNvIHRvIGFzc2lzdCBpbiB0aGlzLCBvbiByZXR1cm4gaW5mbGF0ZSgpIHdpbGwgc2V0IHN0cm0tPmRhdGFfdHlwZSB0byB0aGUKKyAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luLCBwbHVzIDY0CisgIGlmIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGRlZmxhdGUgc3RyZWFtLAorICBwbHVzIDEyOCBpZiBpbmZsYXRlKCkgcmV0dXJuZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcgYW4gZW5kLW9mLWJsb2NrCisgIGNvZGUgb3IgZGVjb2RpbmcgdGhlIGNvbXBsZXRlIGhlYWRlciB1cCB0byBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKyAgZGVmbGF0ZSBzdHJlYW0uIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUKKyAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4KKyAgYml0IDcgb2YgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUKKyAgbGVzcyB0aGFuIGVpZ2h0LgorCisgICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KKyAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKKyAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bworICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKKyAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAorICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKKyAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICisgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaAorICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KKworICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbmZsYXRlKCkgYWx3YXlzIGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQgYXMKKyAgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuZCBhbHdheXMgdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9uIHRoZQorICBmaXJzdCBjYWxsLiBTbyB0aGUgb25seSBlZmZlY3Qgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgIGlzIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpLCBhcyBub3RlZCBiZWxvdywgb3Igd2hlbiBpdCByZXR1cm5zIGVhcmx5CisgIGJlY2F1c2UgWl9CTE9DSyBpcyB1c2VkLgorCisgICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZSBkaWN0aW9uYXJ5CisgIGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIGl0IHNldHMKKyAgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZCBzbyBmYXIgKHRoYXQgaXMsCisgIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkCisgIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgorICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAorICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgorCisgICAgaW5mbGF0ZSgpIHdpbGwgZGVjb21wcmVzcyBhbmQgY2hlY2sgZWl0aGVyIHpsaWItd3JhcHBlZCBvciBnemlwLXdyYXBwZWQKKyAgZGVmbGF0ZSBkYXRhLiAgVGhlIGhlYWRlciB0eXBlIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuICBBbnkgaW5mb3JtYXRpb24KKyAgY29udGFpbmVkIGluIHRoZSBnemlwIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdAorICBpbmZvcm1hdGlvbiBzaG91bGQgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IKKyAgaW5mbGF0ZUJhY2soKSBhbmQgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kCisgIHRyYWlsZXIuCisKKyAgICBpbmZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKKyAgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCBaX05FRURfRElDVCBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QgY2hlY2sKKyAgdmFsdWUpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAorICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKKyAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KKyovCisKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKKyAgIHBlbmRpbmcgb3V0cHV0LgorCisgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKKyAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZWQgZnVuY3Rpb25zICovCisKKy8qCisgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBvbmx5IGluIHNvbWUgc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBzdHJhdGVneSkpOworCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGRlZmxhdGVJbml0IHdpdGggbW9yZSBjb21wcmVzc2lvbiBvcHRpb25zLiBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKKyAgIHRoZSBjYWxsZXIuCisKKyAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSBaX0RFRkxBVEVEIGluCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCisgICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcworICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCisgICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCisgICBkZWZsYXRlSW5pdCBpcyB1c2VkIGluc3RlYWQuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgZGVmbGF0ZS4gSW4gdGhpcyBjYXNlLCAtd2luZG93Qml0cworICAgZGV0ZXJtaW5lcyB0aGUgd2luZG93IHNpemUuIGRlZmxhdGUoKSB3aWxsIHRoZW4gZ2VuZXJhdGUgcmF3IGRlZmxhdGUgZGF0YQorICAgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGVuY29kaW5nLiBBZGQKKyAgIDE2IHRvIHdpbmRvd0JpdHMgdG8gd3JpdGUgYSBzaW1wbGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgYXJvdW5kIHRoZQorICAgY29tcHJlc3NlZCBkYXRhIGluc3RlYWQgb2YgYSB6bGliIHdyYXBwZXIuIFRoZSBnemlwIGhlYWRlciB3aWxsIGhhdmUgbm8KKyAgIGZpbGUgbmFtZSwgbm8gZXh0cmEgZGF0YSwgbm8gY29tbWVudCwgbm8gbW9kaWZpY2F0aW9uIHRpbWUgKHNldCB0byB6ZXJvKSwKKyAgIG5vIGhlYWRlciBjcmMsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGJlIHNldCB0byAyNTUgKHVua25vd24pLiAgSWYgYQorICAgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgd3JpdHRlbiwgc3RybS0+YWRsZXIgaXMgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCisKKyAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKKyAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKKyAgIGlzIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeQorICAgZm9yIG9wdGltYWwgc3BlZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguIFNlZSB6Y29uZi5oIGZvciB0b3RhbCBtZW1vcnkKKyAgIHVzYWdlIGFzIGEgZnVuY3Rpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwuCisKKyAgICAgVGhlIHN0cmF0ZWd5IHBhcmFtZXRlciBpcyB1c2VkIHRvIHR1bmUgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS4gVXNlIHRoZQorICAgdmFsdWUgWl9ERUZBVUxUX1NUUkFURUdZIGZvciBub3JtYWwgZGF0YSwgWl9GSUxURVJFRCBmb3IgZGF0YSBwcm9kdWNlZCBieSBhCisgICBmaWx0ZXIgKG9yIHByZWRpY3RvciksIFpfSFVGRk1BTl9PTkxZIHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8KKyAgIHN0cmluZyBtYXRjaCksIG9yIFpfUkxFIHRvIGxpbWl0IG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGgKKyAgIGVuY29kaW5nKS4gRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYSBzb21ld2hhdAorICAgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHR1bmVkIHRvCisgICBjb21wcmVzcyB0aGVtIGJldHRlci4gVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUgSHVmZm1hbgorICAgY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlIGJldHdlZW4KKyAgIFpfREVGQVVMVCBhbmQgWl9IVUZGTUFOX09OTFkuIFpfUkxFIGlzIGRlc2lnbmVkIHRvIGJlIGFsbW9zdCBhcyBmYXN0IGFzCisgICBaX0hVRkZNQU5fT05MWSwgYnV0IGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uIGZvciBQTkcgaW1hZ2UgZGF0YS4gVGhlIHN0cmF0ZWd5CisgICBwYXJhbWV0ZXIgb25seSBhZmZlY3RzIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQgbm90IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUKKyAgIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4gaWYgaXQgaXMgbm90IHNldCBhcHByb3ByaWF0ZWx5LiAgWl9GSVhFRCBwcmV2ZW50cyB0aGUKKyAgIHVzZSBvZiBkeW5hbWljIEh1ZmZtYW4gY29kZXMsIGFsbG93aW5nIGZvciBhIHNpbXBsZXIgZGVjb2RlciBmb3Igc3BlY2lhbAorICAgYXBwbGljYXRpb25zLgorCisgICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYW4gaW52YWxpZAorICAgbWV0aG9kKS4gbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdDIgZG9lcworICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOworLyoKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQorICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yIGRlZmxhdGVSZXNldCwgYmVmb3JlIGFueQorICAgY2FsbCBvZiBkZWZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgIGRpY3Rpb25hcnkgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeSkuCisKKyAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQorICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQorICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQorICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQorICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgorICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgorCisgICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CisgICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCisgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZSBpbgorICAgZGVmbGF0ZSBvciBkZWZsYXRlMi4gVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgc2hvdWxkIGJlCisgICBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4gSW4gYWRkaXRpb24sIHRoZQorICAgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkZWZsYXRlIHdpbGwgdXNlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplIG1pbnVzCisgICAyNjIgYnl0ZXMgb2YgdGhlIHByb3ZpZGVkIGRpY3Rpb25hcnkuCisKKyAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0+YWRsZXIgaXMgc2V0IHRvIHRoZSBhZGxlcjMyIHZhbHVlCisgICBvZiB0aGUgZGljdGlvbmFyeTsgdGhlIGRlY29tcHJlc3NvciBtYXkgbGF0ZXIgdXNlIHRoaXMgdmFsdWUgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuIChUaGUgYWRsZXIzMiB2YWx1ZQorICAgYXBwbGllcyB0byB0aGUgd2hvbGUgZGljdGlvbmFyeSBldmVuIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGRpY3Rpb25hcnkgaXMKKyAgIGFjdHVhbGx5IHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuKSBJZiBhIHJhdyBkZWZsYXRlIHdhcyByZXF1ZXN0ZWQsIHRoZW4gdGhlCisgICBhZGxlcjMyIHZhbHVlIGlzIG5vdCBjb21wdXRlZCBhbmQgc3RybS0+YWRsZXIgaXMgbm90IHNldC4KKworICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIGRlZmxhdGUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCisgICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gZGVmbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKKyAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKKyAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0CisgICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKKyAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAorICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCisgICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KKworICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIE5VTEwpLiBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCisgICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGRlZmxhdGVJbml0Mi4KKworICAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSkpOworLyoKKyAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKKyAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiBkZWZsYXRlSW5pdDIuICBUaGlzIGNhbiBiZQorICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKKyAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50CisgICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCisgICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCisgICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgorCisgICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlUGFyYW1zLCB0aGUgc3RyZWFtIHN0YXRlIG11c3QgYmUgc2V0IGFzIGZvcgorICAgYSBjYWxsIG9mIGRlZmxhdGUoKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8KKyAgIGJlIGNvbXByZXNzZWQgYW5kIGZsdXNoZWQuIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgorCisgICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUgorICAgaWYgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ29vZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xhenksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NoYWluKSk7CisvKgorICAgICBGaW5lIHR1bmUgZGVmbGF0ZSdzIGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBvbmx5IGJlCisgICB1c2VkIGJ5IHNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIHRoZSBhbGdvcml0aG0gdXNlZCBieSB6bGliJ3MgZGVmbGF0ZSBmb3IKKyAgIHNlYXJjaGluZyBmb3IgdGhlIGJlc3QgbWF0Y2hpbmcgc3RyaW5nLCBhbmQgZXZlbiB0aGVuIG9ubHkgYnkgdGhlIG1vc3QKKyAgIGZhbmF0aWMgb3B0aW1pemVyIHRyeWluZyB0byBzcXVlZXplIG91dCB0aGUgbGFzdCBjb21wcmVzc2VkIGJpdCBmb3IgdGhlaXIKKyAgIHNwZWNpZmljIGlucHV0IGRhdGEuICBSZWFkIHRoZSBkZWZsYXRlLmMgc291cmNlIGNvZGUgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQorICAgbWF4X2xhenksIGdvb2RfbGVuZ3RoLCBuaWNlX2xlbmd0aCwgYW5kIG1heF9jaGFpbiBwYXJhbWV0ZXJzLgorCisgICAgIGRlZmxhdGVUdW5lKCkgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yIGRlZmxhdGVJbml0MigpLCBhbmQKKyAgIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBmb3IgYW4gaW52YWxpZCBkZWZsYXRlIHN0cmVhbS4KKyAqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgZGVmbGF0ZUJvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCisgICBkZWZsYXRpb24gb2Ygc291cmNlTGVuIGJ5dGVzLiAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvcgorICAgZGVmbGF0ZUluaXQyKCksIGFuZCBhZnRlciBkZWZsYXRlU2V0SGVhZGVyKCksIGlmIHVzZWQuICBUaGlzIHdvdWxkIGJlIHVzZWQKKyAgIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIgZm9yIGRlZmxhdGlvbiBpbiBhIHNpbmdsZSBwYXNzLCBhbmQgc28gd291bGQgYmUKKyAgIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOworLyoKKyAgICAgZGVmbGF0ZVByaW1lKCkgaW5zZXJ0cyBiaXRzIGluIHRoZSBkZWZsYXRlIG91dHB1dCBzdHJlYW0uICBUaGUgaW50ZW50CisgIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUKKyAgYml0cyBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXMgZGVmbGF0ZSBzdHJlYW0gd2hlbiBhcHBlbmRpbmcgdG8gaXQuICBBcyBzdWNoLAorICB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUKKyAgZmlyc3QgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZQorICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YKKyAgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgorCisgICAgICBkZWZsYXRlUHJpbWUgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0SGVhZGVyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3pfaGVhZGVycCBoZWFkKSk7CisvKgorICAgICAgZGVmbGF0ZVNldEhlYWRlcigpIHByb3ZpZGVzIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciB3aGVuIGEgZ3ppcAorICAgc3RyZWFtIGlzIHJlcXVlc3RlZCBieSBkZWZsYXRlSW5pdDIoKS4gIGRlZmxhdGVTZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkCisgICBhZnRlciBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mCisgICBkZWZsYXRlKCkuICBUaGUgdGV4dCwgdGltZSwgb3MsIGV4dHJhIGZpZWxkLCBuYW1lLCBhbmQgY29tbWVudCBpbmZvcm1hdGlvbgorICAgaW4gdGhlIHByb3ZpZGVkIGd6X2hlYWRlciBzdHJ1Y3R1cmUgYXJlIHdyaXR0ZW4gdG8gdGhlIGd6aXAgaGVhZGVyICh4ZmxhZyBpcworICAgaWdub3JlZCAtLSB0aGUgZXh0cmEgZmxhZ3MgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGNvbXByZXNzaW9uIGxldmVsKS4gIFRoZQorICAgY2FsbGVyIG11c3QgYXNzdXJlIHRoYXQsIGlmIG5vdCBaX05VTEwsIG5hbWUgYW5kIGNvbW1lbnQgYXJlIHRlcm1pbmF0ZWQgd2l0aAorICAgYSB6ZXJvIGJ5dGUsIGFuZCB0aGF0IGlmIGV4dHJhIGlzIG5vdCBaX05VTEwsIHRoYXQgZXh0cmFfbGVuIGJ5dGVzIGFyZQorICAgYXZhaWxhYmxlIHRoZXJlLiAgSWYgaGNyYyBpcyB0cnVlLCBhIGd6aXAgaGVhZGVyIGNyYyBpcyBpbmNsdWRlZC4gIE5vdGUgdGhhdAorICAgdGhlIGN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIGNvbW1hbmQtbGluZSB2ZXJzaW9uIG9mIGd6aXAgKHVwIHRocm91Z2ggdmVyc2lvbgorICAgMS4zLngpIGRvIG5vdCBzdXBwb3J0IGhlYWRlciBjcmMncywgYW5kIHdpbGwgcmVwb3J0IHRoYXQgaXQgaXMgYSAibXVsdGktcGFydAorICAgZ3ppcCBmaWxlIiBhbmQgZ2l2ZSB1cC4KKworICAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCisgICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKKyAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KKworICAgICAgZGVmbGF0ZVNldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCisvKgorWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cykpOworCisgICAgIFRoaXMgaXMgYW5vdGhlciB2ZXJzaW9uIG9mIGluZmxhdGVJbml0IHdpdGggYW4gZXh0cmEgcGFyYW1ldGVyLiBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgorCisgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdworICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKKyAgIGluc3RlYWQuIHdpbmRvd0JpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHdpbmRvd0JpdHMgdmFsdWUKKyAgIHByb3ZpZGVkIHRvIGRlZmxhdGVJbml0MigpIHdoaWxlIGNvbXByZXNzaW5nLCBvciBpdCBtdXN0IGJlIGVxdWFsIHRvIDE1IGlmCisgICBkZWZsYXRlSW5pdDIoKSB3YXMgbm90IHVzZWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKKyAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCisgICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBpbmZsYXRlKCkgd2lsbCB0aGVuIHByb2Nlc3MgcmF3IGRlZmxhdGUgZGF0YSwKKyAgIG5vdCBsb29raW5nIGZvciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIsIG5vdCBnZW5lcmF0aW5nIGEgY2hlY2sgdmFsdWUsIGFuZCBub3QKKyAgIGxvb2tpbmcgZm9yIGFueSBjaGVjayB2YWx1ZXMgZm9yIGNvbXBhcmlzb24gYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBUaGlzCisgICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0CisgICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiBJZiBhIGN1c3RvbQorICAgZm9ybWF0IGlzIGRldmVsb3BlZCB1c2luZyB0aGUgcmF3IGRlZmxhdGUgZm9ybWF0IGZvciBjb21wcmVzc2VkIGRhdGEsIGl0IGlzCisgICByZWNvbW1lbmRlZCB0aGF0IGEgY2hlY2sgdmFsdWUgc3VjaCBhcyBhbiBhZGxlcjMyIG9yIGEgY3JjMzIgYmUgYXBwbGllZCB0bworICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGRvbmUgaW4gdGhlIHpsaWIsIGd6aXAsIGFuZCB6aXAgZm9ybWF0cy4gIEZvcgorICAgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSB6bGliIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBhcyBpcy4gTm90ZSB0aGF0IGNvbW1lbnRzCisgICBhYm92ZSBvbiB0aGUgdXNlIGluIGRlZmxhdGVJbml0MigpIGFwcGxpZXMgdG8gdGhlIG1hZ25pdHVkZSBvZiB3aW5kb3dCaXRzLgorCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGRlY29kaW5nLiBBZGQKKyAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCisgICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCisgICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcworICAgYSBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCisKKyAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQorICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQorICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCisgICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiBpbmZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgorICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSAgVGhlIGN1cnJlbnQKKyAgIGltcGxlbWVudGF0aW9uIG9mIGluZmxhdGVJbml0MigpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLQorICAgdGhhdCBpcyBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKKy8qCisgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKKyAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlLAorICAgaWYgdGhhdCBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKKyAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIG9mIGluZmxhdGUuCisgICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCisgICBkZWZsYXRlU2V0RGljdGlvbmFyeSkuICBGb3IgcmF3IGluZmxhdGUsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IgaW5mbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZgorICAgaW5mbGF0ZSgpIHRvIHNldCB0aGUgZGljdGlvbmFyeS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZQorICAgZGljdGlvbmFyeSB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KKworICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQorICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQorICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICBpbmZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKKyAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KKworICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCisgIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCisgIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCisgIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKKyAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfc3RyZWFtcCBzb3VyY2UpKTsKKy8qCisgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBhcyBhIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBzdHJlYW0uCisKKyAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gcmFuZG9tbHkgYWNjZXNzaW5nIGEgbGFyZ2Ugc3RyZWFtLiAgVGhlCisgICBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIHN0cmVhbSBjYW4gcGVyaW9kaWNhbGx5IHJlY29yZCB0aGUgaW5mbGF0ZSBzdGF0ZSwKKyAgIGFsbG93aW5nIHJlc3RhcnRpbmcgaW5mbGF0ZSBhdCB0aG9zZSBwb2ludHMgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgdGhlCisgICBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKKyAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgZGVzdGluYXRpb24uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBpbmZsYXRlRW5kIGZvbGxvd2VkIGJ5IGluZmxhdGVJbml0LAorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIHN0YXRlLgorICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KKworICAgICAgaW5mbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYml0cyBpbiB0aGUgaW5mbGF0ZSBpbnB1dCBzdHJlYW0uICBUaGUgaW50ZW50IGlzCisgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCisgIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKKyAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgorICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCisgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCisKKyAgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVHZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKKy8qCisgICAgICBpbmZsYXRlR2V0SGVhZGVyKCkgcmVxdWVzdHMgdGhhdCBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBiZSBzdG9yZWQgaW4gdGhlCisgICBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlLiAgaW5mbGF0ZUdldEhlYWRlcigpIG1heSBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGluZmxhdGVJbml0MigpIG9yIGluZmxhdGVSZXNldCgpLCBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIGluZmxhdGUoKS4KKyAgIEFzIGluZmxhdGUoKSBwcm9jZXNzZXMgdGhlIGd6aXAgc3RyZWFtLCBoZWFkLT5kb25lIGlzIHplcm8gdW50aWwgdGhlIGhlYWRlcgorICAgaXMgY29tcGxldGVkLCBhdCB3aGljaCB0aW1lIGhlYWQtPmRvbmUgaXMgc2V0IHRvIG9uZS4gIElmIGEgemxpYiBzdHJlYW0gaXMKKyAgIGJlaW5nIGRlY29kZWQsIHRoZW4gaGVhZC0+ZG9uZSBpcyBzZXQgdG8gLTEgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSB3aWxsIGJlCisgICBubyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3J0aGNvbWluZy4gIE5vdGUgdGhhdCBaX0JMT0NLIGNhbiBiZSB1c2VkIHRvCisgICBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlCisgICBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCisKKyAgICAgIFRoZSB0ZXh0LCB0aW1lLCB4ZmxhZ3MsIGFuZCBvcyBmaWVsZHMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBnemlwIGhlYWRlcgorICAgY29udGVudHMuICBoY3JjIGlzIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIGEgaGVhZGVyIENSQy4gIChUaGUgaGVhZGVyIENSQworICAgd2FzIHZhbGlkIGlmIGRvbmUgaXMgc2V0IHRvIG9uZS4pICBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAorICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCisgICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKKyAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KKyAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgorICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCisgICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4KKyAgIGFueSBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMKKyAgIG5vdCBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKKyAgIGFic2VuY2UuICBUaGlzIGFsbG93cyB0aGUgdXNlIG9mIGRlZmxhdGVTZXRIZWFkZXIoKSB3aXRoIHRoZSByZXR1cm5lZAorICAgc3RydWN0dXJlIHRvIGR1cGxpY2F0ZSB0aGUgaGVhZGVyLiAgSG93ZXZlciBpZiB0aG9zZSBmaWVsZHMgYXJlIHNldCB0bworICAgYWxsb2NhdGVkIG1lbW9yeSwgdGhlbiB0aGUgYXBwbGljYXRpb24gd2lsbCBuZWVkIHRvIHNhdmUgdGhvc2UgcG9pbnRlcnMKKyAgIGVsc2V3aGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGV2ZW50dWFsbHkgZnJlZWQuCisKKyAgICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKKyAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgorICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgorICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bworICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgorCisgICAgICBpbmZsYXRlR2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3cpKTsKKworICAgICBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24gdXNpbmcgaW5mbGF0ZUJhY2soKQorICAgY2FsbHMuICBUaGUgZmllbGRzIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBpbiBzdHJtIG11c3QgYmUgaW5pdGlhbGl6ZWQKKyAgIGJlZm9yZSB0aGUgY2FsbC4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIFpfTlVMTCwgdGhlbiB0aGUgZGVmYXVsdCBsaWJyYXJ5LQorICAgZGVyaXZlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBhcmUgdXNlZC4gIHdpbmRvd0JpdHMgaXMgdGhlIGJhc2UgdHdvCisgICBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplLCBpbiB0aGUgcmFuZ2UgOC4uMTUuICB3aW5kb3cgaXMgYSBjYWxsZXIKKyAgIHN1cHBsaWVkIGJ1ZmZlciBvZiB0aGF0IHNpemUuICBFeGNlcHQgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIHdoZXJlIGl0IGlzCisgICBhc3N1cmVkIHRoYXQgZGVmbGF0ZSB3YXMgdXNlZCB3aXRoIHNtYWxsIHdpbmRvdyBzaXplcywgd2luZG93Qml0cyBtdXN0IGJlIDE1CisgICBhbmQgYSAzMksgYnl0ZSB3aW5kb3cgbXVzdCBiZSBzdXBwbGllZCB0byBiZSBhYmxlIHRvIGRlY29tcHJlc3MgZ2VuZXJhbAorICAgZGVmbGF0ZSBzdHJlYW1zLgorCisgICAgIFNlZSBpbmZsYXRlQmFjaygpIGZvciB0aGUgdXNhZ2Ugb2YgdGhlc2Ugcm91dGluZXMuCisKKyAgICAgaW5mbGF0ZUJhY2tJbml0IHdpbGwgcmV0dXJuIFpfT0sgb24gc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYW55IG9mCisgICB0aGUgcGFyYW1hdGVycyBhcmUgaW52YWxpZCwgWl9NRU1fRVJST1IgaWYgdGhlIGludGVybmFsIHN0YXRlIGNvdWxkIG5vdAorICAgYmUgYWxsb2NhdGVkLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QKKyAgIG1hdGNoIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZS4KKyovCisKK3R5cGVkZWYgdW5zaWduZWQgKCppbl9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiBGQVIgKikpOwordHlwZWRlZiBpbnQgKCpvdXRfZnVuYykgT0YoKHZvaWQgRkFSICosIHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2sgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZnVuYyBpbiwgdm9pZCBGQVIgKmluX2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZnVuYyBvdXQsIHZvaWQgRkFSICpvdXRfZGVzYykpOworLyoKKyAgICAgaW5mbGF0ZUJhY2soKSBkb2VzIGEgcmF3IGluZmxhdGUgd2l0aCBhIHNpbmdsZSBjYWxsIHVzaW5nIGEgY2FsbC1iYWNrCisgICBpbnRlcmZhY2UgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaW5mbGF0ZSgpIGZvcgorICAgZmlsZSBpL28gYXBwbGljYXRpb25zIGluIHRoYXQgaXQgYXZvaWRzIGNvcHlpbmcgYmV0d2VlbiB0aGUgb3V0cHV0IGFuZCB0aGUKKyAgIHNsaWRpbmcgd2luZG93IGJ5IHNpbXBseSBtYWtpbmcgdGhlIHdpbmRvdyBpdHNlbGYgdGhlIG91dHB1dCBidWZmZXIuICBUaGlzCisgICBmdW5jdGlvbiB0cnVzdHMgdGhlIGFwcGxpY2F0aW9uIHRvIG5vdCBjaGFuZ2UgdGhlIG91dHB1dCBidWZmZXIgcGFzc2VkIGJ5CisgICB0aGUgb3V0cHV0IGZ1bmN0aW9uLCBhdCBsZWFzdCB1bnRpbCBpbmZsYXRlQmFjaygpIHJldHVybnMuCisKKyAgICAgaW5mbGF0ZUJhY2tJbml0KCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCisgICBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgd2l0aCB0aGUgdXNlci1wcm92aWRlZCB3aW5kb3cgYnVmZmVyLgorICAgaW5mbGF0ZUJhY2soKSBtYXkgdGhlbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIHRvIGluZmxhdGUgYSBjb21wbGV0ZSwgcmF3CisgICBkZWZsYXRlIHN0cmVhbSB3aXRoIGVhY2ggY2FsbC4gIGluZmxhdGVCYWNrRW5kKCkgaXMgdGhlbiBjYWxsZWQgdG8gZnJlZQorICAgdGhlIGFsbG9jYXRlZCBzdGF0ZS4KKworICAgICBBIHJhdyBkZWZsYXRlIHN0cmVhbSBpcyBvbmUgd2l0aCBubyB6bGliIG9yIGd6aXAgaGVhZGVyIG9yIHRyYWlsZXIuCisgICBUaGlzIHJvdXRpbmUgd291bGQgbm9ybWFsbHkgYmUgdXNlZCBpbiBhIHV0aWxpdHkgdGhhdCByZWFkcyB6aXAgb3IgZ3ppcAorICAgZmlsZXMgYW5kIHdyaXRlcyBvdXQgdW5jb21wcmVzc2VkIGZpbGVzLiAgVGhlIHV0aWxpdHkgd291bGQgZGVjb2RlIHRoZQorICAgaGVhZGVyIGFuZCBwcm9jZXNzIHRoZSB0cmFpbGVyIG9uIGl0cyBvd24sIGhlbmNlIHRoaXMgcm91dGluZSBleHBlY3RzCisgICBvbmx5IHRoZSByYXcgZGVmbGF0ZSBzdHJlYW0gdG8gZGVjb21wcmVzcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgICBub3JtYWwgYmVoYXZpb3Igb2YgaW5mbGF0ZSgpLCB3aGljaCBleHBlY3RzIGVpdGhlciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGFyb3VuZCB0aGUgZGVmbGF0ZSBzdHJlYW0uCisKKyAgICAgaW5mbGF0ZUJhY2soKSB1c2VzIHR3byBzdWJyb3V0aW5lcyBzdXBwbGllZCBieSB0aGUgY2FsbGVyIHRoYXQgYXJlIHRoZW4KKyAgIGNhbGxlZCBieSBpbmZsYXRlQmFjaygpIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgaW5mbGF0ZUJhY2soKSBjYWxscyB0aG9zZQorICAgcm91dGluZXMgdW50aWwgaXQgcmVhZHMgYSBjb21wbGV0ZSBkZWZsYXRlIHN0cmVhbSBhbmQgd3JpdGVzIG91dCBhbGwgb2YgdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSwgb3IgdW50aWwgaXQgZW5jb3VudGVycyBhbiBlcnJvci4gIFRoZSBmdW5jdGlvbidzCisgICBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdHlwZXMgYXJlIGRlZmluZWQgYWJvdmUgaW4gdGhlIGluX2Z1bmMgYW5kIG91dF9mdW5jCisgICB0eXBlZGVmcy4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsIGluKGluX2Rlc2MsICZidWYpIHdoaWNoIHNob3VsZCByZXR1cm4gdGhlCisgICBudW1iZXIgb2YgYnl0ZXMgb2YgcHJvdmlkZWQgaW5wdXQsIGFuZCBhIHBvaW50ZXIgdG8gdGhhdCBpbnB1dCBpbiBidWYuICBJZgorICAgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLCBpbigpIG11c3QgcmV0dXJuIHplcm8tLWJ1ZiBpcyBpZ25vcmVkIGluIHRoYXQKKyAgIGNhc2UtLWFuZCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIGEgYnVmZmVyIGVycm9yLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwKKyAgIG91dChvdXRfZGVzYywgYnVmLCBsZW4pIHRvIHdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBidWZbMC4ubGVuLTFdLiAgb3V0KCkKKyAgIHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBvciBub24temVybyBvbiBmYWlsdXJlLiAgSWYgb3V0KCkgcmV0dXJucworICAgbm9uLXplcm8sIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gd2l0aCBhbiBlcnJvci4gIE5laXRoZXIgaW4oKSBub3Igb3V0KCkKKyAgIGFyZSBwZXJtaXR0ZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93IHByb3ZpZGVkIHRvCisgICBpbmZsYXRlQmFja0luaXQoKSwgd2hpY2ggaXMgYWxzbyB0aGUgYnVmZmVyIHRoYXQgb3V0KCkgdXNlcyB0byB3cml0ZSBmcm9tLgorICAgVGhlIGxlbmd0aCB3cml0dGVuIGJ5IG91dCgpIHdpbGwgYmUgYXQgbW9zdCB0aGUgd2luZG93IHNpemUuICBBbnkgbm9uLXplcm8KKyAgIGFtb3VudCBvZiBpbnB1dCBtYXkgYmUgcHJvdmlkZWQgYnkgaW4oKS4KKworICAgICBGb3IgY29udmVuaWVuY2UsIGluZmxhdGVCYWNrKCkgY2FuIGJlIHByb3ZpZGVkIGlucHV0IG9uIHRoZSBmaXJzdCBjYWxsIGJ5CisgICBzZXR0aW5nIHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luLiAgSWYgdGhhdCBpbnB1dCBpcyBleGhhdXN0ZWQsIHRoZW4KKyAgIGluKCkgd2lsbCBiZSBjYWxsZWQuICBUaGVyZWZvcmUgc3RybS0+bmV4dF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZQorICAgY2FsbGluZyBpbmZsYXRlQmFjaygpLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBaX05VTEwsIHRoZW4gaW4oKSB3aWxsIGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgZm9yIGlucHV0LiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHN0cm0tPmF2YWlsX2luCisgICBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGlmIHN0cm0tPmF2YWlsX2luIGlzIG5vdCB6ZXJvLCBpbnB1dCB3aWxsCisgICBpbml0aWFsbHkgYmUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luWzAgLi4gc3RybS0+YXZhaWxfaW4gLSAxXS4KKworICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKKyAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQorICAgZGVzY3JpcHRvcnMgY2FuIGJlIG9wdGlvbmFsbHkgdXNlZCB0byBwYXNzIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjYWxsZXItCisgICBzdXBwbGllZCBpbigpIGFuZCBvdXQoKSBmdW5jdGlvbnMgbmVlZCB0byBkbyB0aGVpciBqb2IuCisKKyAgICAgT24gcmV0dXJuLCBpbmZsYXRlQmFjaygpIHdpbGwgc2V0IHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luIHRvCisgICBwYXNzIGJhY2sgYW55IHVudXNlZCBpbnB1dCB0aGF0IHdhcyBwcm92aWRlZCBieSB0aGUgbGFzdCBpbigpIGNhbGwuICBUaGUKKyAgIHJldHVybiB2YWx1ZXMgb2YgaW5mbGF0ZUJhY2soKSBjYW4gYmUgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCisgICBpZiBpbigpIG9yIG91dCgpIHJldHVybmVkIGFuIGVycm9yLCBaX0RBVEFfRVJST1IgaWYgdGhlcmUgd2FzIGEgZm9ybWF0CisgICBlcnJvciBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0gKGluIHdoaWNoIGNhc2Ugc3RybS0+bXNnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUKKyAgIG5hdHVyZSBvZiB0aGUgZXJyb3IpLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBub3QgcHJvcGVybHkKKyAgIGluaXRpYWxpemVkLiAgSW4gdGhlIGNhc2Ugb2YgWl9CVUZfRVJST1IsIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBjYW4gYmUKKyAgIGRpc3Rpbmd1aXNoZWQgdXNpbmcgc3RybS0+bmV4dF9pbiB3aGljaCB3aWxsIGJlIFpfTlVMTCBvbmx5IGlmIGluKCkgcmV0dXJuZWQKKyAgIGFuIGVycm9yLiAgSWYgc3RybS0+bmV4dCBpcyBub3QgWl9OVUxMLCB0aGVuIHRoZSBaX0JVRl9FUlJPUiB3YXMgZHVlIHRvCisgICBvdXQoKSByZXR1cm5pbmcgbm9uLXplcm8uICAoaW4oKSB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlIG91dCgpLCBzbworICAgc3RybS0+bmV4dF9pbiBpcyBhc3N1cmVkIHRvIGJlIGRlZmluZWQgaWYgb3V0KCkgcmV0dXJucyBub24temVyby4pICBOb3RlCisgICB0aGF0IGluZmxhdGVCYWNrKCkgY2Fubm90IHJldHVybiBaX09LLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgorCisgICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KKyAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOworLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCisKKyAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6CisgICAgIDEuMDogc2l6ZSBvZiB1SW50CisgICAgIDMuMjogc2l6ZSBvZiB1TG9uZworICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQorICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAorCisgICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6CisgICAgIDg6IERFQlVHCisgICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQorICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgorICAgICAxMTogMCAocmVzZXJ2ZWQpCisKKyAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgorICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCisgICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKKworICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6CisgICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCisgICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCisgICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKKworICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6CisgICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQorICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKKyAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQorCisgICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgorICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAorICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKKyAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKKworICAgIFJlbWFpbmRlcjoKKyAgICAgMjctMzE6IDAgKHJlc2VydmVkKQorICovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgIGJ5IGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQorICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKKy8qCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZQorICAgYSBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKKyAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKKyAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKKyAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgorICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKKyAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgorICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCisgICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuCisqLworCisKK3R5cGVkZWYgdm9pZHAgZ3pGaWxlOworCisvKgorWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKSk7CisKKyAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCisgICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsCisgICAoIndiOSIpIG9yIGEgc3RyYXRlZ3k6ICdmJyBmb3IgZmlsdGVyZWQgZGF0YSBhcyBpbiAid2I2ZiIsICdoJyBmb3IKKyAgIEh1ZmZtYW4gb25seSBjb21wcmVzc2lvbiBhcyBpbiAid2IxaCIsIG9yICdSJyBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZworICAgYXMgaW4gIndiMVIiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlSW5pdDIgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKQorCisgICAgIGd6b3BlbiBjYW4gYmUgdXNlZCB0byByZWFkIGEgZmlsZSB3aGljaCBpcyBub3QgaW4gZ3ppcCBmb3JtYXQ7IGluIHRoaXMKKyAgIGNhc2UgZ3pyZWFkIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KKworICAgICBnem9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCisgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCisgICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKKyAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLiAgKi8KKworWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnemRvcGVuICBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7CisvKgorICAgICBnemRvcGVuKCkgYXNzb2NpYXRlcyBhIGd6RmlsZSB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuICBGaWxlCisgICBkZXNjcmlwdG9ycyBhcmUgb2J0YWluZWQgZnJvbSBjYWxscyBsaWtlIG9wZW4sIGR1cCwgY3JlYXQsIHBpcGUgb3IKKyAgIGZpbGVubyAoaW4gdGhlIGZpbGUgaGFzIGJlZW4gcHJldmlvdXNseSBvcGVuZWQgd2l0aCBmb3BlbikuCisgICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMgaW4gZ3pvcGVuLgorICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlCisgICBmaWxlIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkKSwgbW9kZSkgY2xvc2VzIHRoZSBmaWxlCisgICBkZXNjcmlwdG9yIGZkLiBJZiB5b3Ugd2FudCB0byBrZWVwIGZkIG9wZW4sIHVzZSBnemRvcGVuKGR1cChmZCksIG1vZGUpLgorICAgICBnemRvcGVuIHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZQorICAgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pzZXRwYXJhbXMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSkpOworLyoKKyAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvciBzdHJhdGVneS4gU2VlIHRoZSBkZXNjcmlwdGlvbgorICAgb2YgZGVmbGF0ZUluaXQyIGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzLgorICAgICBnenNldHBhcmFtcyByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGZpbGUgd2FzIG5vdAorICAgb3BlbmVkIGZvciB3cml0aW5nLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJlYWQgIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIElmIHRoZSBpbnB1dCBmaWxlIHdhcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlcgorICAgb2YgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkICgwIGZvcgorICAgZW5kIG9mIGZpbGUsIC0xIGZvciBlcnJvcikuICovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgICAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlRWQSAgIGd6cHJpbnRmIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKTsKKy8qCisgICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKKyAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuICBUaGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgd3JpdHRlbiBpcyBsaW1pdGVkIHRvIDQwOTUuIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0CisgICB0aGlzIGxpbWl0IGlzIG5vdCBleGNlZWRlZC4gSWYgaXQgaXMgZXhjZWVkZWQsIHRoZW4gZ3pwcmludGYoKSB3aWxsIHJldHVybgorICAgcmV0dXJuIGFuIGVycm9yICgwKSB3aXRoIG5vdGhpbmcgd3JpdHRlbi4gSW4gdGhpcyBjYXNlLCB0aGVyZSBtYXkgYWxzbyBiZSBhCisgICBidWZmZXIgb3ZlcmZsb3cgd2l0aCB1bnByZWRpY3RhYmxlIGNvbnNlcXVlbmNlcywgd2hpY2ggaXMgcG9zc2libGUgb25seSBpZgorICAgemxpYiB3YXMgY29tcGlsZWQgd2l0aCB0aGUgaW5zZWN1cmUgZnVuY3Rpb25zIHNwcmludGYoKSBvciB2c3ByaW50ZigpCisgICBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKSBvciB2c25wcmludGYoKSBmdW5jdGlvbnMgd2VyZSBub3QgYXZhaWxhYmxlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dHMgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKSk7CisvKgorICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorICAgICAgZ3pwdXRzIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGNoYXIgKiBaRVhQT1JUIGd6Z2V0cyBPRigoZ3pGaWxlIGZpbGUsIGNoYXIgKmJ1ZiwgaW50IGxlbikpOworLyoKKyAgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvcgorICAgYSBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCisgICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZCB3aXRoIGEgbnVsbAorICAgY2hhcmFjdGVyLgorICAgICAgZ3pnZXRzIHJldHVybnMgYnVmLCBvciBaX05VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pwdXRjIE9GKChnekZpbGUgZmlsZSwgaW50IGMpKTsKKy8qCisgICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6cHV0YyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemdldGMgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKKyAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6dW5nZXRjIE9GKChpbnQgYywgZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhZ2FpbiBsYXRlci4KKyAgIE9ubHkgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4gIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUKKyAgIGNoYXJhY3RlciBwdXNoZWQsIG9yIC0xIG9uIGZhaWx1cmUuICBnenVuZ2V0YygpIHdpbGwgZmFpbCBpZiBhCisgICBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZCB5ZXQsIG9yIGlmIGMgaXMgLTEuIFRoZSBwdXNoZWQKKyAgIGNoYXJhY3RlciB3aWxsIGJlIGRpc2NhcmRlZCBpZiB0aGUgc3RyZWFtIGlzIHJlcG9zaXRpb25lZCB3aXRoIGd6c2VlaygpCisgICBvciBnenJld2luZCgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnemZsdXNoIE9GKChnekZpbGUgZmlsZSwgaW50IGZsdXNoKSk7CisvKgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKKyAgIGZsdXNoIGlzIGFzIGluIHRoZSBkZWZsYXRlKCkgZnVuY3Rpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKKyAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiBnemZsdXNoIHJldHVybnMgWl9PSyBpZgorICAgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgorICAgICBnemZsdXNoIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgorICAgZGVncmFkZSBjb21wcmVzc2lvbi4KKyovCisKKy8qCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenNlZWsgT0YoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X29mZl90IG9mZnNldCwgaW50IHdoZW5jZSkpOworCisgICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlCisgICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKKyAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgorICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQorICAgZXh0cmVtZWx5IHNsb3cuIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKKyAgIHN0YXJ0aW5nIHBvc2l0aW9uLgorCisgICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgorICAgcGFydGljdWxhciBpZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcgYW5kIHRoZSBuZXcgc3RhcnRpbmcgcG9zaXRpb24KKyAgIHdvdWxkIGJlIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZXdpbmQgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXdpbmRzIHRoZSBnaXZlbiBmaWxlLiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciByZWFkaW5nLgorCisgICBnenJld2luZChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIChpbnQpZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkKKyovCisKKy8qCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCAgICBnenRlbGwgT0YoKGd6RmlsZSBmaWxlKSk7CisKKyAgICAgUmV0dXJucyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uCisKKyAgIGd6dGVsbChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6ZW9mIE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KKyAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6ZGlyZWN0IE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgUmV0dXJucyAxIGlmIGZpbGUgaXMgYmVpbmcgcmVhZCBkaXJlY3RseSB3aXRob3V0IGRlY29tcHJlc3Npb24sIG90aGVyd2lzZQorICAgemVyby4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pjbG9zZSBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgorICAgZXJyb3IgbnVtYmVyLiAgTm90ZSB0aGF0IG9uY2UgZmlsZSBpcyBjbG9zZSwgeW91IGNhbm5vdCBjYWxsIGd6ZXJyb3Igd2l0aAorICAgZmlsZSwgc2luY2UgaXRzIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIGRlYWxsb2NhdGVkLgorKi8KKworWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCBnemVycm9yIE9GKChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pKTsKKy8qCisgICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCisgICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorCisgICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmcgYW5kIGZ1dHVyZSBjYWxscyB0bworICAgdGhpcyBmdW5jdGlvbiBtYXkgaW52YWxpZGF0ZSB0aGUgcmV0dXJuZWQgc3RyaW5nLgorKi8KKworWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUKKyAgIGNsZWFyZXJyKCkgZnVuY3Rpb24gaW4gc3RkaW8uIFRoaXMgaXMgdXNlZnVsIGZvciBjb250aW51aW5nIHRvIHJlYWQgYSBnemlwCisgICBmaWxlIHRoYXQgaXMgYmVpbmcgd3JpdHRlbiBjb25jdXJyZW50bHkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja3N1bSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCisgICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCisgICBjb21wcmVzc2lvbiBsaWJyYXJ5LgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzIgT0YoKHVMb25nIGFkbGVyLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAorICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgorICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworLyoKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7CisKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMiAgIE9GKCh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIENSQy0zMiB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4gdGhlCisgICB1cGRhdGVkIENSQy0zMi4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWlyZWQgaW5pdGlhbAorICAgdmFsdWUgZm9yIHRoZSBmb3IgdGhlIGNyYy4gUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCisgICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVXNhZ2UgZXhhbXBsZToKKworICAgICB1TG9uZyBjcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGNyYyA9IGNyYzMyKGNyYywgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChjcmMgIT0gb3JpZ2luYWxfY3JjKSBlcnJvcigpOworKi8KKworLyoKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZyBjcmMxLCB1TG9uZyBjcmMyLCB6X29mZl90IGxlbjIpKTsKKworICAgICBDb21iaW5lIHR3byBDUkMtMzIgY2hlY2sgdmFsdWVzIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsCisgICBzZXExIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBDUkMtMzIgY2hlY2sgdmFsdWVzIHdlcmUKKyAgIGNhbGN1bGF0ZWQgZm9yIGVhY2gsIGNyYzEgYW5kIGNyYzIuICBjcmMzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQ1JDLTMyCisgICBjaGVjayB2YWx1ZSBvZiBzZXExIGFuZCBzZXEyIGNvbmNhdGVuYXRlZCwgcmVxdWlyaW5nIG9ubHkgY3JjMSwgY3JjMiwgYW5kCisgICBsZW4yLgorKi8KKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YXJpb3VzIGhhY2tzLCBkb24ndCBsb29rIDopICovCisKKy8qIGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBhcmUgbWFjcm9zIHRvIGFsbG93IGNoZWNraW5nIHRoZSB6bGliIHZlcnNpb24KKyAqIGFuZCB0aGUgY29tcGlsZXIncyB2aWV3IG9mIHpfc3RyZWFtOgorICovCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXyBPRigoel9zdHJlYW1wIHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLCBpbnQgc3RyZWFtX3NpemUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyBPRigoel9zdHJlYW1wIHN0cm0sIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKKyNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKKyAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCisgICAgICAgIGluZmxhdGVJbml0Xygoc3RybSksICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAorICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAorICAgICAgICBpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisjZGVmaW5lIGluZmxhdGVCYWNrSW5pdChzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3cpIFwKKyAgICAgICAgaW5mbGF0ZUJhY2tJbml0Xygoc3RybSksICh3aW5kb3dCaXRzKSwgKHdpbmRvdyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorCisjaWZkZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgIFpFWFRFUk4gb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIG9mZjY0X3QsIGludCkpOworICAgWkVYVEVSTiBvZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIG9mZjY0X3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgb2ZmNjRfdCkpOworI2VuZGlmCisKKyNpZiBfRklMRV9PRkZTRVRfQklUUyA9PSA2NAorIyAgZGVmaW5lIGd6b3BlbiBnem9wZW42NAorIyAgZGVmaW5lIGd6c2VlayBnenNlZWs2NAorIyAgZGVmaW5lIGd6dGVsbCBnenRlbGw2NAorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSBhZGxlcjMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgY3JjMzJfY29tYmluZTY0CisjZWxzZQorICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenNlZWsgT0YoKGd6RmlsZSwgel9vZmZfdCwgaW50KSk7CisgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenRlbGwgT0YoKGd6RmlsZSkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCisgICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisjZW5kaWYKKworWkVYVEVSTiBjb25zdCBjaGFyICAgKiBaRVhQT1JUIHpFcnJvciAgICAgICAgICAgT0YoKGludCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQgT0YoKHpfc3RyZWFtcCkpOworWkVYVEVSTiBjb25zdCB1TG9uZ2YgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlVW5kZXJtaW5lIE9GKCh6X3N0cmVhbXAsIGludCkpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogWkxJQl9IICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL3psaWJkZWZzLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL3psaWJkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkNmU4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvemxpYmRlZnMuaApAQCAtMCwwICsxLDEzIEBACisvKiB6bGliZGVmcy5oIC0tIGNvbXBpbGUtdGltZSBkZWZpbml0aW9ucyBmb3IgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CS8qIGZvciBvZmZfdCAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgkvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworI2lmZGVmIFZNUworIyAgaW5jbHVkZSA8dW5peGlvLmg+CS8qIGZvciBvZmZfdCAqLworI2VuZGlmCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IG9mZl90CisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9NY3J0MS5vIGIvc3lzcm9vdC91c3IvbGliL01jcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YWFlMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9NY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9TY3J0MS5vIGIvc3lzcm9vdC91c3IvbGliL1NjcnQxLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjYTBiNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9TY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9jcnQxLm8gYi9zeXNyb290L3Vzci9saWIvY3J0MS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmJjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY3J0MS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9jcnRpLm8gYi9zeXNyb290L3Vzci9saWIvY3J0aS5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZGQ0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY3J0aS5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9jcnRuLm8gYi9zeXNyb290L3Vzci9saWIvY3J0bi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGNjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvY3J0bi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9lc291bmQvbGliZXNkZHNwLnNvLjAgYi9zeXNyb290L3Vzci9saWIvZXNvdW5kL2xpYmVzZGRzcC5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZmNzMxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZXNvdW5kL2xpYmVzZGRzcC5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYmVzZGRzcC5zby4wLjIuMzgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZXNvdW5kL2xpYmVzZGRzcC5zby4wLjIuMzggYi9zeXNyb290L3Vzci9saWIvZXNvdW5kL2xpYmVzZGRzcC5zby4wLjIuMzgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyYTQzNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9lc291bmQvbGliZXNkZHNwLnNvLjAuMi4zOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQU5TSV9YMy4xMTAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQU5TSV9YMy4xMTAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NDhmYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BTlNJX1gzLjExMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQVJNU0NJSS04LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0FSTVNDSUktOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI3ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0FSTVNDSUktOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQVNNT180NDkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQVNNT180NDkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5NGRmMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9BU01PXzQ0OS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQklHNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9CSUc1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMmY2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQklHNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQklHNUhLU0NTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0JJRzVIS1NDUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY4MjMxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0JJRzVIS1NDUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQlJGLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0JSRi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0JSRi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMDAwNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDEwMDA3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjdmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMDAwNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMTI1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTEyNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY4YzVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTEyNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2VjN2RjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYzYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRiNTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Mi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjUzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk5YWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTFlZTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjJkMGFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY1MThlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDMyNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1AxMjU4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QzMzRlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NQMTI1OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3Mzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3Mzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllNjJiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDczNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A3NzUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxZWUzZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDc3NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A5MzIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1A5MzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5ODU5NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DUDkzMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1NOXzM2OTEwMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9DU05fMzY5MTAzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWZkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1NOXzM2OTEwMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvQ1dJLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NXSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTZhYmEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0NXSS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvREVDLU1DUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9ERUMtTUNTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDAxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvREVDLU1DUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUFULURFLUEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUFULURFLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4ZGE3NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtQVQtREUtQS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUFULURFLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1BVC1ERS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjMxNGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1BVC1ERS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUNBLUZSLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1DQS1GUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJlYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1DQS1GUi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLURLLU5PLUEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLURLLU5PLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyZjg2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtREstTk8tQS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLURLLU5PLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1ESy1OTy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQyNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1ESy1OTy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLUEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYTBjOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMtQS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLVMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1ZmE2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRVMtUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUVTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdmZGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1FUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZJLVNFLUEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZJLVNFLUEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZTkyYQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQkNESUMtRkktU0UtQS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZJLVNFLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GSS1TRS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRjNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GSS1TRS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUZSLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGFhOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1GUi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUlTLUZSSVNTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1JUy1GUklTUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2I5NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1JUy1GUklTUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLUlULnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1JVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzViZWVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1JVC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVBULnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1QVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM2ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1QVC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVVLLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1VSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzE3ODNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1VSy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUJDRElDLVVTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1VUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWU4Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VCQ0RJQy1VUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUNNQS1DWVJJTExJQy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9FQ01BLUNZUklMTElDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmFhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvRUNNQS1DWVJJTExJQy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUNOLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1DTi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM0Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1DTi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpJU1gwMjEzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KSVNYMDIxMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFlODNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KSVNYMDIxMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpQLU1TLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KUC1NUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmFkNGFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KUC1NUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUpQLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KUC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRiODcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1KUC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLUtSLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1LUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2IwZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1LUi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvRVVDLVRXLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1UVy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIwNzVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0VVQy1UVy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0IxODAzMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQjE4MDMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2E0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0IxODAzMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JCSUc1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dCQklHNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI1ZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dCQklHNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JHQksuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JHQksuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwOGMxNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HQkdCSy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0JLLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dCSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODdmNzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dCSy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0VPUkdJQU4tQUNBREVNWS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HRU9SR0lBTi1BQ0FERU1ZLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDQxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0VPUkdJQU4tQUNBREVNWS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0VPUkdJQU4tUFMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR0VPUkdJQU4tUFMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1NjQxYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HRU9SR0lBTi1QUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR09TVF8xOTc2OC03NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HT1NUXzE5NzY4LTc0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzhjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR09TVF8xOTc2OC03NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUstQ0NJVFQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUstQ0NJVFQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5ZGU0MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSy1DQ0lUVC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUs3LU9MRC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9HUkVFSzctT0xELnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWU1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUs3LU9MRC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvR1JFRUs3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWMxMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0dSRUVLNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSFAtUk9NQU44LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVJPTUFOOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODAxOTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0hQLVJPTUFOOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMDM3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTAzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA0ZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTAzNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMDM4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTAzOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM1MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTAzOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGE0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwOC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTBkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwOF80MjAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAwOF80MjAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmZTAyOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDA4XzQyMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAyNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDI1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGQ2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAyNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAyNi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDI2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTc5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTAyNi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA0Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDQ2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGRkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA0Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA0Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDQ3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA0Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA5Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMDk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzJjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTA5Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTExMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTEyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTNiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTExMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTIyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmQ3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTIzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTI0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjkzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyOS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTI5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTRhODYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEyOS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDhiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2VmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTMzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTc2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTM3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmODY4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTEzNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDhiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmIzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Mi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0My5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmM2YzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDczYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTI1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTAwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZTUyODcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmVkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0OS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTQ5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjY2Q5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE0OS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1My5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTUzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTA1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWZiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1NS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjI1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjJlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmIyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTU4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZWY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE1OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjhmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTRhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMmY5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Mi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2My5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTYzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZWMwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTk2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjI5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMTY3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTE0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTE2Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTI3MTIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTI3MTIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkMzU4YwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMjcxMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM2NC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzY0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDdkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM2NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM3MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDBjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM3MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM4OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzg4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzczZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM4OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM5MC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzkwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGIzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM5MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM5OS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xMzk5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjg0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTM5OS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTY4MDQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMTY4MDQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5OGQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk0xNjgwNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjU2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVhNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI1Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjczLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdjYmJmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTcyODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzA3MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZmNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjc4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUxNjRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI3OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjgwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ3YmFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjgxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2OTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjg0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU5ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjg1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFhODk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI4NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjkwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI5MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE2NzczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI5MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNMjk3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI5Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRiYzdiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTI5Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDIwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQ5ODZlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDIzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNkNDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDI0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJkMzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQyNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDM3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODU4YTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTQzNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDUxNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00NTE3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDBhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDUxNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDg5OS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00ODk5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMDkwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDg5OS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDkwOS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00OTA5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDY1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDkwOS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDk3MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk00OTcxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGRiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNDk3MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNTAwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTUwMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWY0NTZhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTUwMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNTM0Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk01MzQ3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZWFlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNNTM0Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODAzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTgwMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDA0ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTgwMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmIyNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjViMWRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODUyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQwOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Mi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU2MzYwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU5ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODU3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Ny5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmYyNWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg1Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVlZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBjZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Mi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMwNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Mi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODYzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI1YmY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU1MmFkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE2MzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWEzODk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY2TkFWLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Nk5BVi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmM3MzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2Nk5BVi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU5ZDVkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODY5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2OS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmMzYzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg2OS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODcwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzk2ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODcxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTRiNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODc0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3NC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDMxNTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODc1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3NS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVkNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg3NS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODgwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg4MC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDdmZDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg4MC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNODkxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg5MS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTAwZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTg5MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE1YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzEwYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTRjYTJhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAzMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDMwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYjk3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTAzMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA0LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2NiZjkzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk4YTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkwNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA2Ni5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05MDY2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YmUxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTA2Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTE4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkxOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjcxZDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkxOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTIxLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkyMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmY0MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkyMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTIyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkyMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2I0NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkyMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMwLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWVkNjEyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmI0YmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTMzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2RlNDdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzU0ZDgwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM3LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2U2NzM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTM5LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDgxZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTkzOS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTQzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTk0My5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3NjFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lCTTk0My5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTQ0OC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JQk05NDQ4LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjVhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUJNOTQ0OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSUVDX1AyNy0xLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lFQ19QMjctMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDc1ODgzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lFQ19QMjctMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy04LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMtOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmViNTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lOSVMtOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy1DWVJJTExJQy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLUNZUklMTElDLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2RiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy1DWVJJTExJQy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JTklTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjA5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSU5JUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNJUkktMzM0Mi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU0lSSS0zMzQyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjM5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNJUkktMzM0Mi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItQ04tRVhULnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUNOLUVYVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg1NzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTy0yMDIyLUNOLUVYVC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItQ04uc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItQ04uc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ODY3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1DTi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItSlAtMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1KUC0zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NThiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItSlAtMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItSlAuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItSlAuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhMTg4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1KUC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItS1Iuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLTIwMjItS1Iuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNjRhZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tMjAyMi1LUi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLUlSLTE5Ny5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tSVItMTk3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2RkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLUlSLTE5Ny5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLUlSLTIwOS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU08tSVItMjA5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjYzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPLUlSLTIwOS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPNjQ2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzY0Ni5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjBjMjYzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzY0Ni5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjVhYTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWI3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTExLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZjI4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTljMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjY2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTE2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmExYjUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0xNi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0yLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVlMjMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS0zLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmIzNzBjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS00LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjIxYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS01LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc5YmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS02LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJjMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS03LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYxODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS04LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTEyMTQyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS05LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk0MzZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTTzg4NTktOS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS05RS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU084ODU5LTlFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzU5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPODg1OS05RS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzEwMzY3LUJPWC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMTAzNjctQk9YLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NjMxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzEwMzY3LUJPWC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzExNTQ4LTEuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzExNTQ4LTEuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMTIwZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMTE1NDgtMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzIwMzMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzIwMzMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmM2U5MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fMjAzMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0MjctRVhULnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI3LUVYVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg2Mzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0lTT181NDI3LUVYVC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0Mjcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0Mjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhZTU3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0Mjguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzU0Mjguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5M2JjOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNTQyOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzY5MzctMi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNjkzNy0yLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTNjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzY5MzctMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzY5Mzcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSVNPXzY5Mzcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlNzBhMgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9JU09fNjkzNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvSk9IQUIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvSk9IQUIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwNDlkZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9KT0hBQi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JLTguc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JLTguc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1Yzk3OAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0ktOC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1SLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtUi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODI2ZDYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtUi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1SVS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9LT0k4LVJVLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2VlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1SVS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1ULnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtVC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZjODMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtVC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvS09JOC1VLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtVS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA3YmJjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L0tPSTgtVS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTEFUSU4tR1JFRUstMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9MQVRJTi1HUkVFSy0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTEFUSU4tR1JFRUstMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTEFUSU4tR1JFRUsuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTEFUSU4tR1JFRUsuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjNDljMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9MQVRJTi1HUkVFSy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLUNFTlRSQUxFVVJPUEUuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLUNFTlRSQUxFVVJPUEUuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5ZTc4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtQ0VOVFJBTEVVUk9QRS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLUlTLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1JUy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQ0MjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1JUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLVNBTUkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLVNBTUkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlNDMzMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9NQUMtU0FNSS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDLVVLLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1VSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBlNGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQy1VSy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUFDSU5UT1NILnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQ0lOVE9TSC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VlMTRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L01BQ0lOVE9TSC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTUlLLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L01JSy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzg1NTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L01JSy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTkFUUy1EQU5PLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L05BVFMtREFOTy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjZlNWFmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L05BVFMtREFOTy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvTkFUUy1TRUZJLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L05BVFMtU0VGSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzM0ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L05BVFMtU0VGSS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvUFQxNTQuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvUFQxNTQuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhOTRiYwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9QVDE1NC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvUksxMDQ4LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1JLMTA0OC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNiODY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1JLMTA0OC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0FNSS1XUzIuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0FNSS1XUzIuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxZjQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TQU1JLVdTMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0hJRlRfSklTWDAyMTMuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0hJRlRfSklTWDAyMTMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3NmZiZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TSElGVF9KSVNYMDIxMy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0pJUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9TSklTLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTc1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvU0pJUy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVC42MS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9ULjYxLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTBhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVC42MS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVENWTjU3MTItMS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9UQ1ZONTcxMi0xLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDQwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVENWTjU3MTItMS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVElTLTYyMC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9USVMtNjIwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZDg3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVElTLTYyMC5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVFNDSUkuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVFNDSUkuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyZjkxMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9UU0NJSS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVUhDLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VIQy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE5MjBlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VIQy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVU5JQ09ERS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VTklDT0RFLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkN2VkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVU5JQ09ERS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTE2LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VURi0xNi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzE1ZDRkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VURi0xNi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTMyLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VURi0zMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTllY2JlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1VURi0zMi5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTcuc28gYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvVVRGLTcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwM2ViNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9VVEYtNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvVklTQ0lJLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L1ZJU0NJSS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE3ODZhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djb252L1ZJU0NJSS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvZ2NvbnYvZ2NvbnYtbW9kdWxlcyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9nY29udi1tb2R1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmNkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvZ2NvbnYtbW9kdWxlcwpAQCAtMCwwICsxLDE5MjkgQEAKKyMgR05VIGxpYmMgaWNvbnYgY29uZmlndXJhdGlvbi4KKyMgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisjIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisjIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisjIDAyMTExLTEzMDcgVVNBLgorCisjIEFsbCBsaW5lcyBjb250YWluIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisKKyMgSWYgdGhlIGxpbmVzIHN0YXJ0IHdpdGggYG1vZHVsZScKKyMgIGZyb21zZXQ6CWVpdGhlciBhIG5hbWUgdHJpcGxlIG9yIGEgcmVndWxhciBleHByZXNzaW9uIHRyaXBsZS4KKyMgIHRvc2V0OglhIG5hbWUgdHJpcGxlIG9yIGFuIGV4cHJlc3Npb24gd2l0aCBcTiB0byBnZXQgcmVndWxhcgorIwkJZXhwcmVzc2lvbiBtYXRjaGluZyByZXN1bHRzLgorIyAgZmlsZW5hbWU6CWZpbGVuYW1lIG9mIHRoZSBtb2R1bGUgaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKyMJCUlmIGl0IGlzIG5vdCBhYnNvbHV0ZSB0aGUgcGF0aCBpcyBtYWRlIGFic29sdXRlIGJ5IHByZXBlbmRpbmcKKyMJCXRoZSBkaXJlY3RvcnkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBmb3VuZCBpbi4KKyMgIGNvc3Q6CW9wdGlvbmFsIGNvc3Qgb2YgdGhlIHRyYW5zZm9ybWF0aW9uLiAgRGVmYXVsdCBpcyAxLgorCisjIElmIHRoZSBsaW5lcyBzdGFydCB3aXRoIGBhbGlhcycKKyMgIGFsaWFzOglhbGlhcyBuYW1lIHdoaWNoIGlzIG5vdCByZWFsbHkgcmVjb2duaXplZC4KKyMgIG5hbWU6CXRoZSByZWFsIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBzZXQKKworYWxpYXMJSVNPLUlSLTQvLwkJQlNfNDczMC8vCithbGlhcwlJU082NDYtR0IvLwkJQlNfNDczMC8vCithbGlhcwlHQi8vCQkJQlNfNDczMC8vCithbGlhcwlVSy8vCQkJQlNfNDczMC8vCithbGlhcwlDU0lTTzRVTklURURLSU5HRE9NLy8JQlNfNDczMC8vCittb2R1bGUJQlNfNDczMC8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUJTXzQ3MzAvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xMjEvLwkJQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJSVNPNjQ2LUNBLy8JCUNTQV9aMjQzLjQtMTk4NS0xLy8KK2FsaWFzCUNTQTctMS8vCQlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlDQS8vCQkJQ1NBX1oyNDMuNC0xOTg1LTEvLworYWxpYXMJQ1NJU08xMjFDQU5BRElBTjEvLwlDU0FfWjI0My40LTE5ODUtMS8vCithbGlhcwlDU0FfWjI0My40MTk4NTEvLwlDU0FfWjI0My40LTE5ODUtMS8vCittb2R1bGUJQ1NBX1oyNDMuNC0xOTg1LTEvLwlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUNTQV9aMjQzLjQtMTk4NS0xLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xMjIvLwkJQ1NBX1oyNDMuNC0xOTg1LTIvLworYWxpYXMJSVNPNjQ2LUNBMi8vCQlDU0FfWjI0My40LTE5ODUtMi8vCithbGlhcwlDU0E3LTIvLwkJQ1NBX1oyNDMuNC0xOTg1LTIvLworYWxpYXMJQ1NJU08xMjJDQU5BRElBTjIvLwlDU0FfWjI0My40LTE5ODUtMi8vCithbGlhcwlDU0FfWjI0My40MTk4NTIvLwlDU0FfWjI0My40LTE5ODUtMi8vCittb2R1bGUJQ1NBX1oyNDMuNC0xOTg1LTIvLwlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUNTQV9aMjQzLjQtMTk4NS0yLy8JSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0yMS8vCQlESU5fNjYwMDMvLworYWxpYXMJREUvLwkJCURJTl82NjAwMy8vCithbGlhcwlJU082NDYtREUvLwkJRElOXzY2MDAzLy8KK2FsaWFzCUNTSVNPMjFHRVJNQU4vLwkJRElOXzY2MDAzLy8KK21vZHVsZQlESU5fNjYwMDMvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlESU5fNjYwMDMvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCURTMjA4OS8vCQlEU18yMDg5Ly8KK2FsaWFzCUlTTzY0Ni1ESy8vCQlEU18yMDg5Ly8KK2FsaWFzCURLLy8JCQlEU18yMDg5Ly8KK2FsaWFzCUNTSVNPNjQ2REFOSVNILy8JRFNfMjA4OS8vCittb2R1bGUJRFNfMjA4OS8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCURTXzIwODkvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNy8vCQlFUy8vCithbGlhcwlJU082NDYtRVMvLwkJRVMvLworYWxpYXMJQ1NJU08xN1NQQU5JU0gvLwlFUy8vCittb2R1bGUJRVMvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJRVMvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItODUvLwkJRVMyLy8KK2FsaWFzCUlTTzY0Ni1FUzIvLwkJRVMyLy8KK2FsaWFzCUNTSVNPODVTUEFOSVNIMi8vCUVTMi8vCittb2R1bGUJRVMyLy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUVTMi8vCQkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi01Ny8vCQlHQl8xOTg4LTgwLy8KK2FsaWFzCUNOLy8JCQlHQl8xOTg4LTgwLy8KK2FsaWFzCUlTTzY0Ni1DTi8vCQlHQl8xOTg4LTgwLy8KK2FsaWFzCUNTSVNPNThHQjE5ODgvLwkJR0JfMTk4OC04MC8vCithbGlhcwlHQl8xOTg4ODAvLwkJR0JfMTk4OC04MC8vCittb2R1bGUJR0JfMTk4OC04MC8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUdCXzE5ODgtODAvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xNS8vCQlJVC8vCithbGlhcwlJU082NDYtSVQvLwkJSVQvLworYWxpYXMJQ1NJU08xNUlUQUxJQU4vLwlJVC8vCittb2R1bGUJSVQvLwkJCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJSVQvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTQvLwkJSklTX0M2MjIwLTE5NjktUk8vLworYWxpYXMJSlAvLwkJCUpJU19DNjIyMC0xOTY5LVJPLy8KK2FsaWFzCUlTTzY0Ni1KUC8vCQlKSVNfQzYyMjAtMTk2OS1STy8vCithbGlhcwlDU0lTTzE0SklTQzYyMjBSTy8vCUpJU19DNjIyMC0xOTY5LVJPLy8KK2FsaWFzCUpJU19DNjIyMDE5NjlSTy8vCUpJU19DNjIyMC0xOTY5LVJPLy8KK21vZHVsZQlKSVNfQzYyMjAtMTk2OS1STy8vCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJSklTX0M2MjIwLTE5NjktUk8vLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTkyLy8JCUpJU19DNjIyOS0xOTg0LUIvLworYWxpYXMJSVNPNjQ2LUpQLU9DUi1CLy8JSklTX0M2MjI5LTE5ODQtQi8vCithbGlhcwlKUC1PQ1ItQi8vCQlKSVNfQzYyMjktMTk4NC1CLy8KK2FsaWFzCUNTSVNPOTJKSVNDNjI5OTE5ODRCLy8JSklTX0M2MjI5LTE5ODQtQi8vCithbGlhcwlKSVNfQzYyMjkxOTg0Qi8vCUpJU19DNjIyOS0xOTg0LUIvLworbW9kdWxlCUpJU19DNjIyOS0xOTg0LUIvLwlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUpJU19DNjIyOS0xOTg0LUIvLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE0MS8vCQlKVVNfSS5CMS4wMDIvLworYWxpYXMJSVNPNjQ2LVlVLy8JCUpVU19JLkIxLjAwMi8vCithbGlhcwlKUy8vCQkJSlVTX0kuQjEuMDAyLy8KK2FsaWFzCVlVLy8JCQlKVVNfSS5CMS4wMDIvLworYWxpYXMJQ1NJU08xNDFKVVNJQjEwMDIvLwlKVVNfSS5CMS4wMDIvLworbW9kdWxlCUpVU19JLkIxLjAwMi8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCUpVU19JLkIxLjAwMi8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPNjQ2LUtSLy8JCUtTQzU2MzYvLworYWxpYXMJQ1NLU0M1NjM2Ly8JCUtTQzU2MzYvLworbW9kdWxlCUtTQzU2MzYvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlLU0M1NjM2Ly8JCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItODYvLwkJTVNaXzc3OTUuMy8vCithbGlhcwlJU082NDYtSFUvLwkJTVNaXzc3OTUuMy8vCithbGlhcwlIVS8vCQkJTVNaXzc3OTUuMy8vCithbGlhcwlDU0lTTzg2SFVOR0FSSUFOLy8JTVNaXzc3OTUuMy8vCittb2R1bGUJTVNaXzc3OTUuMy8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU1TWl83Nzk1LjMvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUNVQkEvLwkJCU5DX05DMDAtMTAvLworYWxpYXMJTkNfTkMwMC0xMDo4MS8vCQlOQ19OQzAwLTEwLy8KK2FsaWFzCUlTTy1JUi0xNTEvLwkJTkNfTkMwMC0xMC8vCithbGlhcwlJU082NDYtQ1UvLwkJTkNfTkMwMC0xMC8vCithbGlhcwlDU0lTTzE1MUNVQkEvLwkJTkNfTkMwMC0xMC8vCithbGlhcwlOQ19OQzAwMTAvLwkJTkNfTkMwMC0xMC8vCittb2R1bGUJTkNfTkMwMC0xMC8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU5DX05DMDAtMTAvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi02OS8vCQlORl9aXzYyLTAxMC8vCithbGlhcwlJU082NDYtRlIvLwkJTkZfWl82Mi0wMTAvLworYWxpYXMJRlIvLwkJCU5GX1pfNjItMDEwLy8KK2FsaWFzCUNTSVNPNjlGUkVOQ0gvLwkJTkZfWl82Mi0wMTAvLworYWxpYXMJTkZfWl82MjAxMC8vCQlORl9aXzYyLTAxMC8vCittb2R1bGUJTkZfWl82Mi0wMTAvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlORl9aXzYyLTAxMC8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTI1Ly8JCU5GX1pfNjItMDEwXzE5NzMvLworYWxpYXMJSVNPNjQ2LUZSMS8vCQlORl9aXzYyLTAxMF8xOTczLy8KK2FsaWFzCU5GX1pfNjItMDEwXygxOTczKS8vCU5GX1pfNjItMDEwXzE5NzMvLworYWxpYXMJQ1NJU08yNUZSRU5DSC8vCQlORl9aXzYyLTAxMF8xOTczLy8KK2FsaWFzCU5GX1pfNjIwMTBfMTk3My8vCU5GX1pfNjItMDEwXzE5NzMvLworbW9kdWxlCU5GX1pfNjItMDEwXzE5NzMvLwlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU5GX1pfNjItMDEwXzE5NzMvLwlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTYwLy8JCU5TXzQ1NTEtMS8vCithbGlhcwlJU082NDYtTk8vLwkJTlNfNDU1MS0xLy8KK2FsaWFzCU5PLy8JCQlOU180NTUxLTEvLworYWxpYXMJQ1NJU082MERBTklTSE5PUldFR0lBTi8vIE5TXzQ1NTEtMS8vCithbGlhcwlDU0lTTzYwTk9SV0VHSUFOMS8vCU5TXzQ1NTEtMS8vCithbGlhcwlOU180NTUxMS8vCQlOU180NTUxLTEvLworbW9kdWxlCU5TXzQ1NTEtMS8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU5TXzQ1NTEtMS8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPNjQ2LU5PMi8vCQlOU180NTUxLTIvLworYWxpYXMJSVNPLUlSLTYxLy8JCU5TXzQ1NTEtMi8vCithbGlhcwlOTzIvLwkJCU5TXzQ1NTEtMi8vCithbGlhcwlDU0lTTzYxTk9SV0VHSUFOMi8vCU5TXzQ1NTEtMi8vCithbGlhcwlOU180NTUxMi8vCQlOU180NTUxLTIvLworbW9kdWxlCU5TXzQ1NTEtMi8vCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCU5TXzQ1NTEtMi8vCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTE2Ly8JCVBULy8KK2FsaWFzCUlTTzY0Ni1QVC8vCQlQVC8vCithbGlhcwlDU0lTTzE2UE9SVFVHRVNFLy8JUFQvLworbW9kdWxlCVBULy8JCQlJTlRFUk5BTAkJSVNPNjQ2CQkyCittb2R1bGUJSU5URVJOQUwJCVBULy8JCQlJU082NDYJCTIKKworYWxpYXMJSVNPLUlSLTg0Ly8JCVBUMi8vCithbGlhcwlJU082NDYtUFQyLy8JCVBUMi8vCithbGlhcwlDU0lTTzg0UE9SVFVHVUVTRTIvLwlQVDIvLworbW9kdWxlCVBUMi8vCQkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlQVDIvLwkJCUlTTzY0NgkJMgorCithbGlhcwlJU08tSVItMTAvLwkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCUZJLy8JCQlTRU5fODUwMjAwX0IvLworYWxpYXMJSVNPNjQ2LUZJLy8JCVNFTl84NTAyMDBfQi8vCithbGlhcwlJU082NDYtU0UvLwkJU0VOXzg1MDIwMF9CLy8KK2FsaWFzCVNFLy8JCQlTRU5fODUwMjAwX0IvLworYWxpYXMJQ1NJU08xMFNXRURJU0gvLwlTRU5fODUwMjAwX0IvLworYWxpYXMJU1M2MzYxMjcvLwkJU0VOXzg1MDIwMF9CLy8KK21vZHVsZQlTRU5fODUwMjAwX0IvLwkJSU5URVJOQUwJCUlTTzY0NgkJMgorbW9kdWxlCUlOVEVSTkFMCQlTRU5fODUwMjAwX0IvLwkJSVNPNjQ2CQkyCisKK2FsaWFzCUlTTy1JUi0xMS8vCQlTRU5fODUwMjAwX0MvLworYWxpYXMJSVNPNjQ2LVNFMi8vCQlTRU5fODUwMjAwX0MvLworYWxpYXMJU0UyLy8JCQlTRU5fODUwMjAwX0MvLworYWxpYXMJQ1NJU08xMVNXRURJU0hGT1JOQU1FUy8vIFNFTl84NTAyMDBfQy8vCittb2R1bGUJU0VOXzg1MDIwMF9DLy8JCUlOVEVSTkFMCQlJU082NDYJCTIKK21vZHVsZQlJTlRFUk5BTAkJU0VOXzg1MDIwMF9DLy8JCUlTTzY0NgkJMgorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEwMC8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUlTT184ODU5LTE6MTk4Ny8vCUlTTy04ODU5LTEvLworYWxpYXMJSVNPXzg4NTktMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUlTTzg4NTktMS8vCQlJU08tODg1OS0xLy8KK2FsaWFzCUlTTzg4NTkxLy8JCUlTTy04ODU5LTEvLworYWxpYXMJTEFUSU4xLy8JCUlTTy04ODU5LTEvLworYWxpYXMJTDEvLwkJCUlTTy04ODU5LTEvLworYWxpYXMJSUJNODE5Ly8JCUlTTy04ODU5LTEvLworYWxpYXMJQ1A4MTkvLwkJCUlTTy04ODU5LTEvLworYWxpYXMJQ1NJU09MQVRJTjEvLwkJSVNPLTg4NTktMS8vCithbGlhcwk4ODU5XzEvLwkJSVNPLTg4NTktMS8vCithbGlhcwlPU0YwMDAxMDAwMS8vCQlJU08tODg1OS0xLy8KK21vZHVsZQlJU08tODg1OS0xLy8JCUlOVEVSTkFMCQlJU084ODU5LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xLy8JCUlTTzg4NTktMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTAxLy8JCUlTTy04ODU5LTIvLworYWxpYXMJSVNPXzg4NTktMjoxOTg3Ly8JSVNPLTg4NTktMi8vCithbGlhcwlJU09fODg1OS0yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJSVNPODg1OS0yLy8JCUlTTy04ODU5LTIvLworYWxpYXMJSVNPODg1OTIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlMQVRJTjIvLwkJSVNPLTg4NTktMi8vCithbGlhcwlMMi8vCQkJSVNPLTg4NTktMi8vCithbGlhcwlDU0lTT0xBVElOMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCTg4NTlfMi8vCQlJU08tODg1OS0yLy8KK2FsaWFzCU9TRjAwMDEwMDAyLy8JCUlTTy04ODU5LTIvLworYWxpYXMJSUJNOTEyLy8JCUlTTy04ODU5LTIvLworYWxpYXMJQ1A5MTIvLwkJCUlTTy04ODU5LTIvLworbW9kdWxlCUlTTy04ODU5LTIvLwkJSU5URVJOQUwJCUlTTzg4NTktMgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTIvLwkJSVNPODg1OS0yCTEKKworIwlmcm9tCQkJdG8JCQkgbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTA5Ly8JCUlTTy04ODU5LTMvLworYWxpYXMJSVNPXzg4NTktMzoxOTg4Ly8JSVNPLTg4NTktMy8vCithbGlhcwlJU09fODg1OS0zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJSVNPODg1OS0zLy8JCUlTTy04ODU5LTMvLworYWxpYXMJSVNPODg1OTMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlMQVRJTjMvLwkJSVNPLTg4NTktMy8vCithbGlhcwlMMy8vCQkJSVNPLTg4NTktMy8vCithbGlhcwlDU0lTT0xBVElOMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCTg4NTlfMy8vCQlJU08tODg1OS0zLy8KK2FsaWFzCU9TRjAwMDEwMDAzLy8JCUlTTy04ODU5LTMvLworbW9kdWxlCUlTTy04ODU5LTMvLwkJSU5URVJOQUwJCUlTTzg4NTktMwkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTMvLwkJSVNPODg1OS0zCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMTAvLwkJSVNPLTg4NTktNC8vCithbGlhcwlJU09fODg1OS00OjE5ODgvLwlJU08tODg1OS00Ly8KK2FsaWFzCUlTT184ODU5LTQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlJU084ODU5LTQvLwkJSVNPLTg4NTktNC8vCithbGlhcwlJU084ODU5NC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUxBVElONC8vCQlJU08tODg1OS00Ly8KK2FsaWFzCUw0Ly8JCQlJU08tODg1OS00Ly8KK2FsaWFzCUNTSVNPTEFUSU40Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJODg1OV80Ly8JCUlTTy04ODU5LTQvLworYWxpYXMJT1NGMDAwMTAwMDQvLwkJSVNPLTg4NTktNC8vCittb2R1bGUJSVNPLTg4NTktNC8vCQlJTlRFUk5BTAkJSVNPODg1OS00CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktNC8vCQlJU084ODU5LTQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE0NC8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUlTT184ODU5LTU6MTk4OC8vCUlTTy04ODU5LTUvLworYWxpYXMJSVNPXzg4NTktNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUlTTzg4NTktNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCUlTTzg4NTk1Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJQ1lSSUxMSUMvLwkJSVNPLTg4NTktNS8vCithbGlhcwlDU0lTT0xBVElOQ1lSSUxMSUMvLwlJU08tODg1OS01Ly8KK2FsaWFzCTg4NTlfNS8vCQlJU08tODg1OS01Ly8KK2FsaWFzCU9TRjAwMDEwMDA1Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJSUJNOTE1Ly8JCUlTTy04ODU5LTUvLworYWxpYXMJQ1A5MTUvLwkJCUlTTy04ODU5LTUvLworbW9kdWxlCUlTTy04ODU5LTUvLwkJSU5URVJOQUwJCUlTTzg4NTktNQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTUvLwkJSVNPODg1OS01CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xMjcvLwkJSVNPLTg4NTktNi8vCithbGlhcwlJU09fODg1OS02OjE5ODcvLwlJU08tODg1OS02Ly8KK2FsaWFzCUlTT184ODU5LTYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlJU084ODU5LTYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlJU084ODU5Ni8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUVDTUEtMTE0Ly8JCUlTTy04ODU5LTYvLworYWxpYXMJQVNNTy03MDgvLwkJSVNPLTg4NTktNi8vCithbGlhcwlBUkFCSUMvLwkJSVNPLTg4NTktNi8vCithbGlhcwlDU0lTT0xBVElOQVJBQklDLy8JSVNPLTg4NTktNi8vCithbGlhcwk4ODU5XzYvLwkJSVNPLTg4NTktNi8vCithbGlhcwlPU0YwMDAxMDAwNi8vCQlJU08tODg1OS02Ly8KK2FsaWFzCUlCTTEwODkvLwkJSVNPLTg4NTktNi8vCithbGlhcwlDUDEwODkvLwkJSVNPLTg4NTktNi8vCittb2R1bGUJSVNPLTg4NTktNi8vCQlJTlRFUk5BTAkJSVNPODg1OS02CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktNi8vCQlJU084ODU5LTYJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEyNi8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUlTT184ODU5LTc6MjAwMy8vCUlTTy04ODU5LTcvLworYWxpYXMJSVNPXzg4NTktNzoxOTg3Ly8JSVNPLTg4NTktNy8vCithbGlhcwlJU09fODg1OS03Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJSVNPODg1OS03Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJSVNPODg1OTcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlFTE9UXzkyOC8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUVDTUEtMTE4Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJR1JFRUsvLwkJCUlTTy04ODU5LTcvLworYWxpYXMJR1JFRUs4Ly8JCUlTTy04ODU5LTcvLworYWxpYXMJQ1NJU09MQVRJTkdSRUVLLy8JSVNPLTg4NTktNy8vCithbGlhcwk4ODU5XzcvLwkJSVNPLTg4NTktNy8vCithbGlhcwlPU0YwMDAxMDAwNy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUlCTTgxMy8vCQlJU08tODg1OS03Ly8KK2FsaWFzCUNQODEzLy8JCQlJU08tODg1OS03Ly8KK21vZHVsZQlJU08tODg1OS03Ly8JCUlOVEVSTkFMCQlJU084ODU5LTcJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS03Ly8JCUlTTzg4NTktNwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTM4Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSVNPXzg4NTktODoxOTg4Ly8JSVNPLTg4NTktOC8vCithbGlhcwlJU09fODg1OS04Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSVNPODg1OS04Ly8JCUlTTy04ODU5LTgvLworYWxpYXMJSVNPODg1OTgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlIRUJSRVcvLwkJSVNPLTg4NTktOC8vCithbGlhcwlDU0lTT0xBVElOSEVCUkVXLy8JSVNPLTg4NTktOC8vCithbGlhcwk4ODU5XzgvLwkJSVNPLTg4NTktOC8vCithbGlhcwlPU0YwMDAxMDAwOC8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUlCTTkxNi8vCQlJU08tODg1OS04Ly8KK2FsaWFzCUNQOTE2Ly8JCQlJU08tODg1OS04Ly8KK21vZHVsZQlJU08tODg1OS04Ly8JCUlOVEVSTkFMCQlJU084ODU5LTgJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS04Ly8JCUlTTzg4NTktOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTQ4Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJSVNPXzg4NTktOToxOTg5Ly8JSVNPLTg4NTktOS8vCithbGlhcwlJU09fODg1OS05Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJSVNPODg1OS05Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJSVNPODg1OTkvLwkJSVNPLTg4NTktOS8vCithbGlhcwlMQVRJTjUvLwkJSVNPLTg4NTktOS8vCithbGlhcwlMNS8vCQkJSVNPLTg4NTktOS8vCithbGlhcwlDU0lTT0xBVElONS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCTg4NTlfOS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCU9TRjAwMDEwMDA5Ly8JCUlTTy04ODU5LTkvLworYWxpYXMJSUJNOTIwLy8JCUlTTy04ODU5LTkvLworYWxpYXMJQ1A5MjAvLwkJCUlTTy04ODU5LTkvLworYWxpYXMJVFMtNTg4MS8vCQlJU08tODg1OS05Ly8KK2FsaWFzCUVDTUEtMTI4Ly8JCUlTTy04ODU5LTkvLworbW9kdWxlCUlTTy04ODU5LTkvLwkJSU5URVJOQUwJCUlTTzg4NTktOQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTkvLwkJSVNPODg1OS05CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNTcvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJSVNPXzg4NTktMTA6MTk5Mi8vCUlTTy04ODU5LTEwLy8KK2FsaWFzCUlTT184ODU5LTEwLy8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUlTTzg4NTktMTAvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJSVNPODg1OTEwLy8JCUlTTy04ODU5LTEwLy8KK2FsaWFzCUxBVElONi8vCQlJU08tODg1OS0xMC8vCithbGlhcwlMNi8vCQkJSVNPLTg4NTktMTAvLworYWxpYXMJQ1NJU09MQVRJTjYvLwkJSVNPLTg4NTktMTAvLworYWxpYXMJT1NGMDAwMTAwMEEvLwkJSVNPLTg4NTktMTAvLworbW9kdWxlCUlTTy04ODU5LTEwLy8JCUlOVEVSTkFMCQlJU084ODU5LTEwCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTAvLwkJSVNPODg1OS0xMAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTExLy8JCUlTTy04ODU5LTExLy8KK2FsaWFzCUlTTzg4NTkxMS8vCQlJU08tODg1OS0xMS8vCittb2R1bGUJSVNPLTg4NTktMTEvLwkJSU5URVJOQUwJCUlTTzg4NTktMTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tODg1OS0xMS8vCQlJU084ODU5LTExCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzg4NTktMTMvLwkJSVNPLTg4NTktMTMvLworYWxpYXMJSVNPODg1OTEzLy8JCUlTTy04ODU5LTEzLy8KK2FsaWFzCUlTTy1JUi0xNzkvLwkJSVNPLTg4NTktMTMvLworYWxpYXMJTEFUSU43Ly8JCUlTTy04ODU5LTEzLy8KK2FsaWFzCUw3Ly8JCQlJU08tODg1OS0xMy8vCithbGlhcwlCQUxUSUMvLwkJSVNPLTg4NTktMTMvLworbW9kdWxlCUlTTy04ODU5LTEzLy8JCUlOVEVSTkFMCQlJU084ODU5LTEzCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTMvLwkJSVNPODg1OS0xMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTE0Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTTzg4NTkxNC8vCQlJU08tODg1OS0xNC8vCithbGlhcwlJU08tSVItMTk5Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUxBVElOOC8vCQlJU08tODg1OS0xNC8vCithbGlhcwlMOC8vCQkJSVNPLTg4NTktMTQvLworYWxpYXMJSVNPXzg4NTktMTQ6MTk5OC8vCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTT184ODU5LTE0Ly8JCUlTTy04ODU5LTE0Ly8KK2FsaWFzCUlTTy1DRUxUSUMvLwkJSVNPLTg4NTktMTQvLworbW9kdWxlCUlTTy04ODU5LTE0Ly8JCUlOVEVSTkFMCQlJU084ODU5LTE0CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTg4NTktMTQvLwkJSVNPODg1OS0xNAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU084ODU5LTE1Ly8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUlTTzg4NTkxNS8vCQlJU08tODg1OS0xNS8vCithbGlhcwlJU08tSVItMjAzLy8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUlTT184ODU5LTE1Ly8JCUlTTy04ODU5LTE1Ly8KK2FsaWFzCUxBVElOLTkvLwkJSVNPLTg4NTktMTUvLworYWxpYXMJSVNPXzg4NTktMTU6MTk5OC8vCUlTTy04ODU5LTE1Ly8KK21vZHVsZQlJU08tODg1OS0xNS8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE1Ly8JCUlTTzg4NTktMTUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPODg1OS0xNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlJU084ODU5MTYvLwkJSVNPLTg4NTktMTYvLworYWxpYXMJSVNPLUlSLTIyNi8vCQlJU08tODg1OS0xNi8vCithbGlhcwlMQVRJTjEwLy8JCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUwxMC8vCQkJSVNPLTg4NTktMTYvLworYWxpYXMJSVNPXzg4NTktMTY6MjAwMS8vCUlTTy04ODU5LTE2Ly8KK2FsaWFzCUlTT184ODU5LTE2Ly8JCUlTTy04ODU5LTE2Ly8KK21vZHVsZQlJU08tODg1OS0xNi8vCQlJTlRFUk5BTAkJSVNPODg1OS0xNgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTE2Ly8JCUlTTzg4NTktMTYJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVC42MS8vCQkJVC42MS04QklULy8KK2FsaWFzCUlTTy1JUi0xMDMvLwkJVC42MS04QklULy8KK2FsaWFzCUNTSVNPMTAzVDYxOEJJVC8vCVQuNjEtOEJJVC8vCithbGlhcwlULjYxOEJJVC8vCQlULjYxLThCSVQvLworbW9kdWxlCVQuNjEtOEJJVC8vCQlJTlRFUk5BTAkJVC42MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlULjYxLThCSVQvLwkJVC42MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE1Ni8vCQlJU09fNjkzNy8vCithbGlhcwlJU09fNjkzNzoxOTkyLy8JCUlTT182OTM3Ly8KK2FsaWFzCUlTTzY5MzcvLwkJSVNPXzY5MzcvLworbW9kdWxlCUlTT182OTM3Ly8JCUlOVEVSTkFMCQlJU09fNjkzNwkxCittb2R1bGUJSU5URVJOQUwJCUlTT182OTM3Ly8JCUlTT182OTM3CTEKKworCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTkwLy8JCUlTT182OTM3LTIvLworYWxpYXMJSVNPXzY5MzctMjoxOTgzLy8JSVNPXzY5MzctMi8vCithbGlhcwlDU0lTTzkwLy8JCUlTT182OTM3LTIvLworYWxpYXMJSVNPXzY5MzcyLy8JCUlTT182OTM3LTIvLworbW9kdWxlCUlTT182OTM3LTIvLwkJSU5URVJOQUwJCUlTT182OTM3LTIJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNjkzNy0yLy8JCUlTT182OTM3LTIJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJU0hJRlQtSklTLy8JCVNKSVMvLworYWxpYXMJU0hJRlRfSklTLy8JCVNKSVMvLworYWxpYXMJTVNfS0FOSkkvLwkJU0pJUy8vCithbGlhcwlDU1NISUZUSklTLy8JCVNKSVMvLworbW9kdWxlCVNKSVMvLwkJCUlOVEVSTkFMCQlTSklTCQkxCittb2R1bGUJSU5URVJOQUwJCVNKSVMvLwkJCVNKSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVdJTkRPV1MtMzFKLy8JCUNQOTMyLy8KK2FsaWFzCU1TOTMyLy8JCQlDUDkzMi8vCithbGlhcwlTSklTLU9QRU4vLwkJQ1A5MzIvLworYWxpYXMJU0pJUy1XSU4vLwkJQ1A5MzIvLworYWxpYXMJQ1NXSU5ET1dTMzFKLy8JCUNQOTMyLy8KK21vZHVsZQlDUDkzMi8vCQkJSU5URVJOQUwJCUNQOTMyCQkxCittb2R1bGUJSU5URVJOQUwJCUNQOTMyLy8JCQlDUDkzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJS09JOC8vCQkJS09JLTgvLworbW9kdWxlCUtPSS04Ly8JCQlJTlRFUk5BTAkJS09JLTgJCTEKK21vZHVsZQlJTlRFUk5BTAkJS09JLTgvLwkJCUtPSS04CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0tPSThSLy8JCUtPSTgtUi8vCithbGlhcwlLT0k4Ui8vCQkJS09JOC1SLy8KK21vZHVsZQlLT0k4LVIvLwkJSU5URVJOQUwJCUtPSTgtUgkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVIvLwkJS09JOC1SCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTkvLwkJTEFUSU4tR1JFRUsvLworYWxpYXMJQ1NJU08xOUxBVElOR1JFRUsvLwlMQVRJTi1HUkVFSy8vCithbGlhcwlMQVRJTkdSRUVLLy8JCUxBVElOLUdSRUVLLy8KK21vZHVsZQlMQVRJTi1HUkVFSy8vCQlJTlRFUk5BTAkJTEFUSU4tR1JFRUsJMQorbW9kdWxlCUlOVEVSTkFMCQlMQVRJTi1HUkVFSy8vCQlMQVRJTi1HUkVFSwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMjcvLwkJTEFUSU4tR1JFRUstMS8vCithbGlhcwlDU0lTTzI3TEFUSU5HUkVFSzEvLwlMQVRJTi1HUkVFSy0xLy8KK2FsaWFzCUxBVElOR1JFRUsxLy8JCUxBVElOLUdSRUVLLTEvLworbW9kdWxlCUxBVElOLUdSRUVLLTEvLwkJSU5URVJOQUwJCUxBVElOLUdSRUVLLTEJMQorbW9kdWxlCUlOVEVSTkFMCQlMQVRJTi1HUkVFSy0xLy8JCUxBVElOLUdSRUVLLTEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUk9NQU44Ly8JCUhQLVJPTUFOOC8vCithbGlhcwlSOC8vCQkJSFAtUk9NQU44Ly8KK2FsaWFzCUNTSFBST01BTjgvLwkJSFAtUk9NQU44Ly8KK2FsaWFzCU9TRjEwMDEwMDAxLy8JCUhQLVJPTUFOOC8vCithbGlhcwlIUFJPTUFOOC8vCQlIUC1ST01BTjgvLworbW9kdWxlCUhQLVJPTUFOOC8vCQlJTlRFUk5BTAkJSFAtUk9NQU44CTEKK21vZHVsZQlJTlRFUk5BTAkJSFAtUk9NQU44Ly8JCUhQLVJPTUFOOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0FUREUvLwkJRUJDRElDLUFULURFLy8KK2FsaWFzCUVCQ0RJQ0FUREUvLwkJRUJDRElDLUFULURFLy8KK21vZHVsZQlFQkNESUMtQVQtREUvLwkJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1BVC1ERS8vCQlFQkNESUMtQVQtREUJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNBVERFQS8vCQlFQkNESUMtQVQtREUtQS8vCithbGlhcwlFQkNESUNBVERFQS8vCQlFQkNESUMtQVQtREUtQS8vCittb2R1bGUJRUJDRElDLUFULURFLUEvLwlJTlRFUk5BTAkJRUJDRElDLUFULURFLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtQVQtREUtQS8vCUVCQ0RJQy1BVC1ERS1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDQ0FGUi8vCQlFQkNESUMtQ0EtRlIvLworYWxpYXMJRUJDRElDQ0FGUi8vCQlFQkNESUMtQ0EtRlIvLworbW9kdWxlCUVCQ0RJQy1DQS1GUi8vCQlJTlRFUk5BTAkJRUJDRElDLUNBLUZSCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUNBLUZSLy8JCUVCQ0RJQy1DQS1GUgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0RLTk8vLwkJRUJDRElDLURLLU5PLy8KK2FsaWFzCUVCQ0RJQ0RLTk8vLwkJRUJDRElDLURLLU5PLy8KK21vZHVsZQlFQkNESUMtREstTk8vLwkJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTwkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1ESy1OTy8vCQlFQkNESUMtREstTk8JMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNES05PQS8vCQlFQkNESUMtREstTk8tQS8vCithbGlhcwlFQkNESUNES05PQS8vCQlFQkNESUMtREstTk8tQS8vCittb2R1bGUJRUJDRElDLURLLU5PLUEvLwlJTlRFUk5BTAkJRUJDRElDLURLLU5PLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtREstTk8tQS8vCUVCQ0RJQy1ESy1OTy1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRVMvLwkJRUJDRElDLUVTLy8KK2FsaWFzCUVCQ0RJQ0VTLy8JCUVCQ0RJQy1FUy8vCittb2R1bGUJRUJDRElDLUVTLy8JCUlOVEVSTkFMCQlFQkNESUMtRVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMvLwkJRUJDRElDLUVTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRVNBLy8JCUVCQ0RJQy1FUy1BLy8KK2FsaWFzCUVCQ0RJQ0VTQS8vCQlFQkNESUMtRVMtQS8vCittb2R1bGUJRUJDRElDLUVTLUEvLwkJSU5URVJOQUwJCUVCQ0RJQy1FUy1BCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUVTLUEvLwkJRUJDRElDLUVTLUEJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNFU1MvLwkJRUJDRElDLUVTLVMvLworYWxpYXMJRUJDRElDRVNTLy8JCUVCQ0RJQy1FUy1TLy8KK21vZHVsZQlFQkNESUMtRVMtUy8vCQlJTlRFUk5BTAkJRUJDRElDLUVTLVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRVMtUy8vCQlFQkNESUMtRVMtUwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0VCQ0RJQ0ZJU0UvLwkJRUJDRElDLUZJLVNFLy8KK2FsaWFzCUVCQ0RJQ0ZJU0UvLwkJRUJDRElDLUZJLVNFLy8KK21vZHVsZQlFQkNESUMtRkktU0UvLwkJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRQkxCittb2R1bGUJSU5URVJOQUwJCUVCQ0RJQy1GSS1TRS8vCQlFQkNESUMtRkktU0UJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NFQkNESUNGSVNFQS8vCQlFQkNESUMtRkktU0UtQS8vCithbGlhcwlFQkNESUNGSVNFQS8vCQlFQkNESUMtRkktU0UtQS8vCittb2R1bGUJRUJDRElDLUZJLVNFLUEvLwlJTlRFUk5BTAkJRUJDRElDLUZJLVNFLUEJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRkktU0UtQS8vCUVCQ0RJQy1GSS1TRS1BCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDRlIvLwkJRUJDRElDLUZSLy8KK2FsaWFzCUVCQ0RJQ0ZSLy8JCUVCQ0RJQy1GUi8vCittb2R1bGUJRUJDRElDLUZSLy8JCUlOVEVSTkFMCQlFQkNESUMtRlIJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtRlIvLwkJRUJDRElDLUZSCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQ0lTRlJJU1MvLwkJRUJDRElDLUlTLUZSSVNTLy8KK21vZHVsZQlFQkNESUMtSVMtRlJJU1MvLwlJTlRFUk5BTAkJRUJDRElDLUlTLUZSSVNTCTEKK21vZHVsZQlJTlRFUk5BTAkJRUJDRElDLUlTLUZSSVNTLy8JRUJDRElDLUlTLUZSSVNTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDSVQvLwkJRUJDRElDLUlULy8KK2FsaWFzCUVCQ0RJQ0lULy8JCUVCQ0RJQy1JVC8vCittb2R1bGUJRUJDRElDLUlULy8JCUlOVEVSTkFMCQlFQkNESUMtSVQJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtSVQvLwkJRUJDRElDLUlUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDUFQvLwkJRUJDRElDLVBULy8KK2FsaWFzCUVCQ0RJQ1BULy8JCUVCQ0RJQy1QVC8vCittb2R1bGUJRUJDRElDLVBULy8JCUlOVEVSTkFMCQlFQkNESUMtUFQJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtUFQvLwkJRUJDRElDLVBUCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDVUsvLwkJRUJDRElDLVVLLy8KK2FsaWFzCUVCQ0RJQ1VLLy8JCUVCQ0RJQy1VSy8vCittb2R1bGUJRUJDRElDLVVLLy8JCUlOVEVSTkFMCQlFQkNESUMtVUsJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtVUsvLwkJRUJDRElDLVVLCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTRUJDRElDVVMvLwkJRUJDRElDLVVTLy8KK2FsaWFzCUVCQ0RJQ1VTLy8JCUVCQ0RJQy1VUy8vCittb2R1bGUJRUJDRElDLVVTLy8JCUlOVEVSTkFMCQlFQkNESUMtVVMJMQorbW9kdWxlCUlOVEVSTkFMCQlFQkNESUMtVVMvLwkJRUJDRElDLVVTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMDM3Ly8JCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLVVTLy8JCUlCTTAzNy8vCithbGlhcwlFQkNESUMtQ1AtQ0EvLwkJSUJNMDM3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1XVC8vCQlJQk0wMzcvLworYWxpYXMJRUJDRElDLUNQLU5MLy8JCUlCTTAzNy8vCithbGlhcwlDU0lCTTAzNy8vCQlJQk0wMzcvLworYWxpYXMJT1NGMTAwMjAwMjUvLwkJSUJNMDM3Ly8KK2FsaWFzCUNQMTA3MC8vCQlJQk0wMzcvLworYWxpYXMJQ1AyODIvLwkJCUlCTTAzNy8vCittb2R1bGUJSUJNMDM3Ly8JCUlOVEVSTkFMCQlJQk0wMzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMDM3Ly8JCUlCTTAzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRUJDRElDLUlOVC8vCQlJQk0wMzgvLworYWxpYXMJQ1AwMzgvLwkJCUlCTTAzOC8vCithbGlhcwlDU0lCTTAzOC8vCQlJQk0wMzgvLworbW9kdWxlCUlCTTAzOC8vCQlJTlRFUk5BTAkJSUJNMDM4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTAzOC8vCQlJQk0wMzgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1JTlQxLy8JCUlCTTI1Ni8vCittb2R1bGUJSUJNMjU2Ly8JCUlOVEVSTkFMCQlJQk0yNTYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjU2Ly8JCUlCTTI1NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyNzMvLwkJCUlCTTI3My8vCithbGlhcwlDU0lCTTI3My8vCQlJQk0yNzMvLworYWxpYXMJT1NGMTAwMjAxMTEvLwkJSUJNMjczLy8KK21vZHVsZQlJQk0yNzMvLwkJSU5URVJOQUwJCUlCTTI3MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzMvLwkJSUJNMjczCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQkUvLwkJSUJNMjc0Ly8KK2FsaWFzCUNQMjc0Ly8JCQlJQk0yNzQvLworYWxpYXMJQ1NJQk0yNzQvLwkJSUJNMjc0Ly8KK21vZHVsZQlJQk0yNzQvLwkJSU5URVJOQUwJCUlCTTI3NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzQvLwkJSUJNMjc0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQlIvLwkJSUJNMjc1Ly8KK2FsaWFzCUNQMjc1Ly8JCQlJQk0yNzUvLworYWxpYXMJQ1NJQk0yNzUvLwkJSUJNMjc1Ly8KK21vZHVsZQlJQk0yNzUvLwkJSU5URVJOQUwJCUlCTTI3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0yNzUvLwkJSUJNMjc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFQkNESUMtQ1AtREsvLwkJSUJNMjc3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1OTy8vCQlJQk0yNzcvLworYWxpYXMJQ1NJQk0yNzcvLwkJSUJNMjc3Ly8KK2FsaWFzCU9TRjEwMDIwMTE1Ly8JCUlCTTI3Ny8vCittb2R1bGUJSUJNMjc3Ly8JCUlOVEVSTkFMCQlJQk0yNzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjc3Ly8JCUlCTTI3NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyNzgvLwkJCUlCTTI3OC8vCithbGlhcwlFQkNESUMtQ1AtRkkvLwkJSUJNMjc4Ly8KK2FsaWFzCUVCQ0RJQy1DUC1TRS8vCQlJQk0yNzgvLworYWxpYXMJQ1NJQk0yNzgvLwkJSUJNMjc4Ly8KK2FsaWFzCU9TRjEwMDIwMTE2Ly8JCUlCTTI3OC8vCittb2R1bGUJSUJNMjc4Ly8JCUlOVEVSTkFMCQlJQk0yNzgJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjc4Ly8JCUlCTTI3OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODAvLwkJCUlCTTI4MC8vCithbGlhcwlFQkNESUMtQ1AtSVQvLwkJSUJNMjgwLy8KK2FsaWFzCUNTSUJNMjgwLy8JCUlCTTI4MC8vCithbGlhcwlPU0YxMDAyMDExOC8vCQlJQk0yODAvLworbW9kdWxlCUlCTTI4MC8vCQlJTlRFUk5BTAkJSUJNMjgwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI4MC8vCQlJQk0yODAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVCQ0RJQy1KUC1FLy8JCUlCTTI4MS8vCithbGlhcwlDUDI4MS8vCQkJSUJNMjgxLy8KK2FsaWFzCUNTSUJNMjgxLy8JCUlCTTI4MS8vCittb2R1bGUJSUJNMjgxLy8JCUlOVEVSTkFMCQlJQk0yODEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjgxLy8JCUlCTTI4MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODQvLwkJCUlCTTI4NC8vCithbGlhcwlFQkNESUMtQ1AtRVMvLwkJSUJNMjg0Ly8KK2FsaWFzCUNTSUJNMjg0Ly8JCUlCTTI4NC8vCithbGlhcwlPU0YxMDAyMDExQy8vCQlJQk0yODQvLworYWxpYXMJQ1AxMDc5Ly8JCUlCTTI4NC8vCittb2R1bGUJSUJNMjg0Ly8JCUlOVEVSTkFMCQlJQk0yODQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjg0Ly8JCUlCTTI4NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyODUvLwkJCUlCTTI4NS8vCithbGlhcwlFQkNESUMtQ1AtR0IvLwkJSUJNMjg1Ly8KK2FsaWFzCUNTSUJNMjg1Ly8JCUlCTTI4NS8vCithbGlhcwlPU0YxMDAyMDExRC8vCQlJQk0yODUvLworbW9kdWxlCUlCTTI4NS8vCQlJTlRFUk5BTAkJSUJNMjg1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTI4NS8vCQlJQk0yODUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQMjkwLy8JCQlJQk0yOTAvLworYWxpYXMJRUJDRElDLUpQLUtBTkEvLwlJQk0yOTAvLworYWxpYXMJQ1NJQk0yOTAvLwkJSUJNMjkwLy8KK2FsaWFzCU9TRjEwMDIwMTIyLy8JCUlCTTI5MC8vCittb2R1bGUJSUJNMjkwLy8JCUlOVEVSTkFMCQlJQk0yOTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjkwLy8JCUlCTTI5MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AyOTcvLwkJCUlCTTI5Ny8vCithbGlhcwlFQkNESUMtQ1AtRlIvLwkJSUJNMjk3Ly8KK2FsaWFzCUNTSUJNMjk3Ly8JCUlCTTI5Ny8vCithbGlhcwlPU0YxMDAyMDEyOS8vCQlJQk0yOTcvLworYWxpYXMJQ1AxMDgxLy8JCUlCTTI5Ny8vCittb2R1bGUJSUJNMjk3Ly8JCUlOVEVSTkFMCQlJQk0yOTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMjk3Ly8JCUlCTTI5NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A0MjAvLwkJCUlCTTQyMC8vCithbGlhcwlFQkNESUMtQ1AtQVIxLy8JCUlCTTQyMC8vCithbGlhcwlDU0lCTTQyMC8vCQlJQk00MjAvLworYWxpYXMJT1NGMTAwMjAxQTQvLwkJSUJNNDIwLy8KK21vZHVsZQlJQk00MjAvLwkJSU5URVJOQUwJCUlCTTQyMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjAvLwkJSUJNNDIwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyMy8vCQkJSUJNNDIzLy8KK2FsaWFzCUVCQ0RJQy1DUC1HUi8vCQlJQk00MjMvLworYWxpYXMJQ1NJQk00MjMvLwkJSUJNNDIzLy8KK21vZHVsZQlJQk00MjMvLwkJSU5URVJOQUwJCUlCTTQyMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00MjMvLwkJSUJNNDIzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDQyNC8vCQkJSUJNNDI0Ly8KK2FsaWFzCUVCQ0RJQy1DUC1IRS8vCQlJQk00MjQvLworYWxpYXMJQ1NJQk00MjQvLwkJSUJNNDI0Ly8KK2FsaWFzCU9TRjEwMDIwMUE4Ly8JCUlCTTQyNC8vCittb2R1bGUJSUJNNDI0Ly8JCUlOVEVSTkFMCQlJQk00MjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDI0Ly8JCUlCTTQyNAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A0MzcvLwkJCUlCTTQzNy8vCithbGlhcwk0MzcvLwkJCUlCTTQzNy8vCithbGlhcwlDU1BDOENPREVQQUdFNDM3Ly8JSUJNNDM3Ly8KK2FsaWFzCU9TRjEwMDIwMUI1Ly8JCUlCTTQzNy8vCittb2R1bGUJSUJNNDM3Ly8JCUlOVEVSTkFMCQlJQk00MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDM3Ly8JCUlCTTQzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A1MDAvLwkJCUlCTTUwMC8vCithbGlhcwk1MDAvLwkJCUlCTTUwMC8vCithbGlhcwk1MDBWMS8vCQkJSUJNNTAwLy8KK2FsaWFzCUVCQ0RJQy1DUC1CRS8vCQlJQk01MDAvLworYWxpYXMJRUJDRElDLUNQLUNILy8JCUlCTTUwMC8vCithbGlhcwlDU0lCTTUwMC8vCQlJQk01MDAvLworYWxpYXMJT1NGMTAwMjAxRjQvLwkJSUJNNTAwLy8KK2FsaWFzCUNQMTA4NC8vCQlJQk01MDAvLworbW9kdWxlCUlCTTUwMC8vCQlJTlRFUk5BTAkJSUJNNTAwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTUwMC8vCQlJQk01MDAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUwLy8JCQlJQk04NTAvLworYWxpYXMJODUwLy8JCQlJQk04NTAvLworYWxpYXMJQ1NQQzg1ME1VTFRJTElOR1VBTC8vCUlCTTg1MC8vCithbGlhcwlPU0YxMDAyMDM1Mi8vCQlJQk04NTAvLworbW9kdWxlCUlCTTg1MC8vCQlJTlRFUk5BTAkJSUJNODUwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1MC8vCQlJQk04NTAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODUxLy8JCQlJQk04NTEvLworYWxpYXMJODUxLy8JCQlJQk04NTEvLworYWxpYXMJQ1NJQk04NTEvLwkJSUJNODUxLy8KK21vZHVsZQlJQk04NTEvLwkJSU5URVJOQUwJCUlCTTg1MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NTEvLwkJSUJNODUxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg1Mi8vCQkJSUJNODUyLy8KK2FsaWFzCTg1Mi8vCQkJSUJNODUyLy8KK2FsaWFzCUNTUENQODUyLy8JCUlCTTg1Mi8vCithbGlhcwlPU0YxMDAyMDM1NC8vCQlJQk04NTIvLworbW9kdWxlCUlCTTg1Mi8vCQlJTlRFUk5BTAkJSUJNODUyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1Mi8vCQlJQk04NTIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODU1Ly8JCQlJQk04NTUvLworYWxpYXMJODU1Ly8JCQlJQk04NTUvLworYWxpYXMJQ1NJQk04NTUvLwkJSUJNODU1Ly8KK2FsaWFzCU9TRjEwMDIwMzU3Ly8JCUlCTTg1NS8vCittb2R1bGUJSUJNODU1Ly8JCUlOVEVSTkFMCQlJQk04NTUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU1Ly8JCUlCTTg1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTg1Ni8vCQlJQk04NTYvLworYWxpYXMJQ1A4NTYvLwkJCUlCTTg1Ni8vCithbGlhcwk4NTYvLwkJCUlCTTg1Ni8vCithbGlhcwlDU0lCTTg1Ni8vCQlJQk04NTYvLworbW9kdWxlCUlCTTg1Ni8vCQlJTlRFUk5BTAkJSUJNODU2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg1Ni8vCQlJQk04NTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODU3Ly8JCQlJQk04NTcvLworYWxpYXMJODU3Ly8JCQlJQk04NTcvLworYWxpYXMJQ1NJQk04NTcvLwkJSUJNODU3Ly8KK2FsaWFzCU9TRjEwMDIwMzU5Ly8JCUlCTTg1Ny8vCittb2R1bGUJSUJNODU3Ly8JCUlOVEVSTkFMCQlJQk04NTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODU3Ly8JCUlCTTg1NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjAvLwkJCUlCTTg2MC8vCithbGlhcwk4NjAvLwkJCUlCTTg2MC8vCithbGlhcwlDU0lCTTg2MC8vCQlJQk04NjAvLworbW9kdWxlCUlCTTg2MC8vCQlJTlRFUk5BTAkJSUJNODYwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2MC8vCQlJQk04NjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODYxLy8JCQlJQk04NjEvLworYWxpYXMJODYxLy8JCQlJQk04NjEvLworYWxpYXMJQ1BJQk04NjEvLwkJSUJNODYxLy8KK2FsaWFzCU9TRjEwMDIwMzVELy8JCUlCTTg2MS8vCittb2R1bGUJSUJNODYxLy8JCUlOVEVSTkFMCQlJQk04NjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODYxLy8JCUlCTTg2MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjIvLwkJCUlCTTg2Mi8vCithbGlhcwk4NjIvLwkJCUlCTTg2Mi8vCithbGlhcwlDU1BDODYyTEFUSU5IRUJSRVcvLwlJQk04NjIvLworYWxpYXMJT1NGMTAwMjAzNUUvLwkJSUJNODYyLy8KK21vZHVsZQlJQk04NjIvLwkJSU5URVJOQUwJCUlCTTg2MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjIvLwkJSUJNODYyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2My8vCQkJSUJNODYzLy8KK2FsaWFzCTg2My8vCQkJSUJNODYzLy8KK2FsaWFzCUNTSUJNODYzLy8JCUlCTTg2My8vCithbGlhcwlPU0YxMDAyMDM1Ri8vCQlJQk04NjMvLworbW9kdWxlCUlCTTg2My8vCQlJTlRFUk5BTAkJSUJNODYzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2My8vCQlJQk04NjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY0Ly8JCQlJQk04NjQvLworYWxpYXMJODY0Ly8JCQlJQk04NjQvLworYWxpYXMJQ1NJQk04NjQvLwkJSUJNODY0Ly8KK2FsaWFzCU9TRjEwMDIwMzYwLy8JCUlCTTg2NC8vCittb2R1bGUJSUJNODY0Ly8JCUlOVEVSTkFMCQlJQk04NjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY0Ly8JCUlCTTg2NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NjUvLwkJCUlCTTg2NS8vCithbGlhcwk4NjUvLwkJCUlCTTg2NS8vCithbGlhcwlDU0lCTTg2NS8vCQlJQk04NjUvLworbW9kdWxlCUlCTTg2NS8vCQlJTlRFUk5BTAkJSUJNODY1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTg2NS8vCQlJQk04NjUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY2Ly8JCQlJQk04NjYvLworYWxpYXMJODY2Ly8JCQlJQk04NjYvLworYWxpYXMJQ1NJQk04NjYvLwkJSUJNODY2Ly8KK21vZHVsZQlJQk04NjYvLwkJSU5URVJOQUwJCUlCTTg2NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjYvLwkJSUJNODY2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2Nk5BVi8vCQlJQk04NjZOQVYvLworYWxpYXMJODY2TkFWLy8JCUlCTTg2Nk5BVi8vCittb2R1bGUJSUJNODY2TkFWLy8JCUlOVEVSTkFMCQlJQk04NjZOQVYJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjZOQVYvLwkJSUJNODY2TkFWCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQODY4Ly8JCQlJQk04NjgvLworYWxpYXMJQ1AtQVIvLwkJCUlCTTg2OC8vCithbGlhcwlDU0lCTTg2OC8vCQlJQk04NjgvLworYWxpYXMJT1NGMTAwMjAzNjQvLwkJSUJNODY4Ly8KK21vZHVsZQlJQk04NjgvLwkJSU5URVJOQUwJCUlCTTg2OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NjgvLwkJSUJNODY4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg2OS8vCQkJSUJNODY5Ly8KK2FsaWFzCTg2OS8vCQkJSUJNODY5Ly8KK2FsaWFzCUNQLUdSLy8JCQlJQk04NjkvLworYWxpYXMJQ1NJQk04NjkvLwkJSUJNODY5Ly8KK2FsaWFzCU9TRjEwMDIwMzY1Ly8JCUlCTTg2OS8vCittb2R1bGUJSUJNODY5Ly8JCUlOVEVSTkFMCQlJQk04NjkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODY5Ly8JCUlCTTg2OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NzAvLwkJCUlCTTg3MC8vCithbGlhcwlFQkNESUMtQ1AtUk9FQ0UvLwlJQk04NzAvLworYWxpYXMJRUJDRElDLUNQLVlVLy8JCUlCTTg3MC8vCithbGlhcwlDU0lCTTg3MC8vCQlJQk04NzAvLworYWxpYXMJT1NGMTAwMjAzNjYvLwkJSUJNODcwLy8KK21vZHVsZQlJQk04NzAvLwkJSU5URVJOQUwJCUlCTTg3MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04NzAvLwkJSUJNODcwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDg3MS8vCQkJSUJNODcxLy8KK2FsaWFzCUVCQ0RJQy1DUC1JUy8vCQlJQk04NzEvLworYWxpYXMJQ1NJQk04NzEvLwkJSUJNODcxLy8KK2FsaWFzCU9TRjEwMDIwMzY3Ly8JCUlCTTg3MS8vCittb2R1bGUJSUJNODcxLy8JCUlOVEVSTkFMCQlJQk04NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODcxLy8JCUlCTTg3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4NzUvLwkJCUlCTTg3NS8vCithbGlhcwlFQkNESUMtR1JFRUsvLwkJSUJNODc1Ly8KK2FsaWFzCU9TRjEwMDIwMzZCLy8JCUlCTTg3NS8vCittb2R1bGUJSUJNODc1Ly8JCUlOVEVSTkFMCQlJQk04NzUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODc1Ly8JCUlCTTg3NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4ODAvLwkJCUlCTTg4MC8vCithbGlhcwlFQkNESUMtQ1lSSUxMSUMvLwlJQk04ODAvLworYWxpYXMJQ1NJQk04ODAvLwkJSUJNODgwLy8KK2FsaWFzCU9TRjEwMDIwMzcwLy8JCUlCTTg4MC8vCittb2R1bGUJSUJNODgwLy8JCUlOVEVSTkFMCQlJQk04ODAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODgwLy8JCUlCTTg4MAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A4OTEvLwkJCUlCTTg5MS8vCithbGlhcwlDU0lCTTg5MS8vCQlJQk04OTEvLworYWxpYXMJT1NGMTAwMjAzN0IvLwkJSUJNODkxLy8KK21vZHVsZQlJQk04OTEvLwkJSU5URVJOQUwJCUlCTTg5MQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk04OTEvLwkJSUJNODkxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDkwMy8vCQkJSUJNOTAzLy8KK2FsaWFzCUNTSUJNOTAzLy8JCUlCTTkwMy8vCithbGlhcwlPU0YxMDAyMDM4Ny8vCQlJQk05MDMvLworbW9kdWxlCUlCTTkwMy8vCQlJTlRFUk5BTAkJSUJNOTAzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkwMy8vCQlJQk05MDMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNQOTA0Ly8JCQlJQk05MDQvLworYWxpYXMJOTA0Ly8JCQlJQk05MDQvLworYWxpYXMJQ1NJQk05MDQvLwkJSUJNOTA0Ly8KK2FsaWFzCU9TRjEwMDIwMzg4Ly8JCUlCTTkwNC8vCittb2R1bGUJSUJNOTA0Ly8JCUlOVEVSTkFMCQlJQk05MDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA0Ly8JCUlCTTkwNAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MDUvLwkJCUlCTTkwNS8vCithbGlhcwlFQkNESUMtQ1AtVFIvLwkJSUJNOTA1Ly8KK2FsaWFzCUNTSUJNOTA1Ly8JCUlCTTkwNS8vCittb2R1bGUJSUJNOTA1Ly8JCUlOVEVSTkFMCQlJQk05MDUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA1Ly8JCUlCTTkwNQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1A5MTgvLwkJCUlCTTkxOC8vCithbGlhcwlFQkNESUMtQ1AtQVIyLy8JCUlCTTkxOC8vCithbGlhcwlDU0lCTTkxOC8vCQlJQk05MTgvLworYWxpYXMJT1NGMTAwMjAzOTYvLwkJSUJNOTE4Ly8KK21vZHVsZQlJQk05MTgvLwkJSU5URVJOQUwJCUlCTTkxOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MTgvLwkJSUJNOTE4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTIyLy8JCUlCTTkyMi8vCithbGlhcwlDUDkyMi8vCQkJSUJNOTIyLy8KK2FsaWFzCUNTSUJNOTIyLy8JCUlCTTkyMi8vCittb2R1bGUJSUJNOTIyLy8JCUlOVEVSTkFMCQlJQk05MjIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTIyLy8JCUlCTTkyMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMC8vCQlJQk05MzAvLworYWxpYXMJQ1A5MzAvLwkJCUlCTTkzMC8vCithbGlhcwlFQkNESUMtQ1AtQVIyLy8JCUlCTTkzMC8vCithbGlhcwlDU0lCTTkzMC8vCQlJQk05MzAvLworbW9kdWxlCUlCTTkzMC8vCQlJTlRFUk5BTAkJSUJNOTMwCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzMC8vCQlJQk05MzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzIvLwkJSUJNOTMyLy8KK2FsaWFzCUNTSUJNOTMyLy8JCUlCTTkzMi8vCittb2R1bGUJSUJNOTMyLy8JCUlOVEVSTkFMCQlJQk05MzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTMyLy8JCUlCTTkzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzMy8vCQlJQk05MzMvLworYWxpYXMJQ1A5MzMvLwkJCUlCTTkzMy8vCithbGlhcwlFQkNESUMtQ1AtQVIyLy8JCUlCTTkzMy8vCithbGlhcwlDU0lCTTkzMy8vCQlJQk05MzMvLworbW9kdWxlCUlCTTkzMy8vCQlJTlRFUk5BTAkJSUJNOTMzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzMy8vCQlJQk05MzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MzUvLwkJSUJNOTM1Ly8KK2FsaWFzCUNQOTM1Ly8JCQlJQk05MzUvLworYWxpYXMJRUJDRElDLUNQLUFSMi8vCQlJQk05MzUvLworYWxpYXMJQ1NJQk05MzUvLwkJSUJNOTM1Ly8KK21vZHVsZQlJQk05MzUvLwkJSU5URVJOQUwJCUlCTTkzNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MzUvLwkJSUJNOTM1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTM3Ly8JCUlCTTkzNy8vCithbGlhcwlDUDkzNy8vCQkJSUJNOTM3Ly8KK2FsaWFzCUVCQ0RJQy1DUC1BUjIvLwkJSUJNOTM3Ly8KK2FsaWFzCUNTSUJNOTM3Ly8JCUlCTTkzNy8vCittb2R1bGUJSUJNOTM3Ly8JCUlOVEVSTkFMCQlJQk05MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTM3Ly8JCUlCTTkzNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkzOS8vCQlJQk05MzkvLworYWxpYXMJQ1A5MzkvLwkJCUlCTTkzOS8vCithbGlhcwlFQkNESUMtQ1AtQVIyLy8JCUlCTTkzOS8vCithbGlhcwlDU0lCTTkzOS8vCQlJQk05MzkvLworbW9kdWxlCUlCTTkzOS8vCQlJTlRFUk5BTAkJSUJNOTM5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTkzOS8vCQlJQk05MzkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05NDMvLwkJSUJNOTQzLy8KK2FsaWFzCUNTSUJNOTQzLy8JCUlCTTk0My8vCittb2R1bGUJSUJNOTQzLy8JCUlOVEVSTkFMCQlJQk05NDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTQzLy8JCUlCTTk0MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1AxMDA0Ly8JCUlCTTEwMDQvLworYWxpYXMJT1MyTEFUSU4xLy8JCUlCTTEwMDQvLworbW9kdWxlCUlCTTEwMDQvLwkJSU5URVJOQUwJCUlCTTEwMDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAwNC8vCQlJQk0xMDA0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEwMjYvLwkJSUJNMTAyNi8vCithbGlhcwkxMDI2Ly8JCQlJQk0xMDI2Ly8KK2FsaWFzCUNTSUJNMTAyNi8vCQlJQk0xMDI2Ly8KK2FsaWFzCU9TRjEwMDIwNDAyLy8JCUlCTTEwMjYvLworbW9kdWxlCUlCTTEwMjYvLwkJSU5URVJOQUwJCUlCTTEwMjYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTAyNi8vCQlJQk0xMDI2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTA0Ni8vCQlJQk0xMDQ2Ly8KK2FsaWFzCUNQMTA0Ni8vCQlJQk0xMDQ2Ly8KK2FsaWFzCTEwNDYvLwkJCUlCTTEwNDYvLworbW9kdWxlCUlCTTEwNDYvLwkJSU5URVJOQUwJCUlCTTEwNDYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTA0Ni8vCQlJQk0xMDQ2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTA0Ny8vCQlJQk0xMDQ3Ly8KK2FsaWFzCUNQMTA0Ny8vCQlJQk0xMDQ3Ly8KK2FsaWFzCTEwNDcvLwkJCUlCTTEwNDcvLworYWxpYXMJT1NGMTAwMjA0MTcvLwkJSUJNMTA0Ny8vCittb2R1bGUJSUJNMTA0Ny8vCQlJTlRFUk5BTAkJSUJNMTA0NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDQ3Ly8JCUlCTTEwNDcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTI0Ly8JCUlCTTExMjQvLworYWxpYXMJQ1AxMTI0Ly8JCUlCTTExMjQvLworYWxpYXMJQ1NJQk0xMTI0Ly8JCUlCTTExMjQvLworbW9kdWxlCUlCTTExMjQvLwkJSU5URVJOQUwJCUlCTTExMjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEyNC8vCQlJQk0xMTI0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEyOS8vCQlJQk0xMTI5Ly8KK2FsaWFzCUNQMTEyOS8vCQlJQk0xMTI5Ly8KK2FsaWFzCUNTSUJNMTEyOS8vCQlJQk0xMTI5Ly8KK21vZHVsZQlJQk0xMTI5Ly8JCUlOVEVSTkFMCQlJQk0xMTI5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMjkvLwkJSUJNMTEyOQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjAvLwkJSUJNMTE2MC8vCithbGlhcwlDUDExNjAvLwkJSUJNMTE2MC8vCithbGlhcwlDU0lCTTExNjAvLwkJSUJNMTE2MC8vCittb2R1bGUJSUJNMTE2MC8vCQlJTlRFUk5BTAkJSUJNMTE2MAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYwLy8JCUlCTTExNjAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTYxLy8JCUlCTTExNjEvLworYWxpYXMJQ1AxMTYxLy8JCUlCTTExNjEvLworYWxpYXMJQ1NJQk0xMTYxLy8JCUlCTTExNjEvLworbW9kdWxlCUlCTTExNjEvLwkJSU5URVJOQUwJCUlCTTExNjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2MS8vCQlJQk0xMTYxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEzMi8vCQlJQk0xMTMyLy8KK2FsaWFzCUNQMTEzMi8vCQlJQk0xMTMyLy8KK2FsaWFzCUNTSUJNMTEzMi8vCQlJQk0xMTMyLy8KK21vZHVsZQlJQk0xMTMyLy8JCUlOVEVSTkFMCQlJQk0xMTMyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMzIvLwkJSUJNMTEzMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMzMvLwkJSUJNMTEzMy8vCithbGlhcwlDUDExMzMvLwkJSUJNMTEzMy8vCithbGlhcwlDU0lCTTExMzMvLwkJSUJNMTEzMy8vCittb2R1bGUJSUJNMTEzMy8vCQlJTlRFUk5BTAkJSUJNMTEzMwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTMzLy8JCUlCTTExMzMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTYyLy8JCUlCTTExNjIvLworYWxpYXMJQ1AxMTYyLy8JCUlCTTExNjIvLworYWxpYXMJQ1NJQk0xMTYyMTE2Mi8vCQlJQk0xMTYyLy8KK21vZHVsZQlJQk0xMTYyLy8JCUlOVEVSTkFMCQlJQk0xMTYyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjIvLwkJSUJNMTE2MgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjMvLwkJSUJNMTE2My8vCithbGlhcwlDUDExNjMvLwkJSUJNMTE2My8vCithbGlhcwlDU0lCTTExNjMvLwkJSUJNMTE2My8vCittb2R1bGUJSUJNMTE2My8vCQlJTlRFUk5BTAkJSUJNMTE2MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTYzLy8JCUlCTTExNjMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTY0Ly8JCUlCTTExNjQvLworYWxpYXMJQ1AxMTY0Ly8JCUlCTTExNjQvLworYWxpYXMJQ1NJQk0xMTY0Ly8JCUlCTTExNjQvLworbW9kdWxlCUlCTTExNjQvLwkJSU5URVJOQUwJCUlCTTExNjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE2NC8vCQlJQk0xMTY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNLUi8vCQkJRVVDLUtSLy8KK2FsaWFzCUNTRVVDS1IvLwkJRVVDLUtSLy8KK2FsaWFzCU9TRjAwMDQwMDBhLy8JCUVVQy1LUi8vCittb2R1bGUJRVVDLUtSLy8JCUlOVEVSTkFMCQlFVUMtS1IJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUtSLy8JCUVVQy1LUgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVNDUDk0OS8vCQlVSEMvLworYWxpYXMJQ1A5NDkvLwkJCVVIQy8vCithbGlhcwlPU0YxMDAyMDNCNS8vCQlVSEMvLworbW9kdWxlCVVIQy8vCQkJSU5URVJOQUwJCVVIQwkJMQorbW9kdWxlCUlOVEVSTkFMCQlVSEMvLwkJCVVIQwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVNDUDEzNjEvLwkJSk9IQUIvLworYWxpYXMJQ1AxMzYxLy8JCUpPSEFCLy8KK21vZHVsZQlKT0hBQi8vCQkJSU5URVJOQUwJCUpPSEFCCQkxCittb2R1bGUJSU5URVJOQUwJCUpPSEFCLy8JCQlKT0hBQgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQklHLUZJVkUvLwkJQklHNS8vCithbGlhcwlCSUdGSVZFLy8JCUJJRzUvLworYWxpYXMJQklHLTUvLwkJCUJJRzUvLworYWxpYXMJQ04tQklHNS8vCQlCSUc1Ly8KK2FsaWFzCUNQOTUwLy8JCQlCSUc1Ly8KK21vZHVsZQlCSUc1Ly8JCQlJTlRFUk5BTAkJQklHNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlCSUc1Ly8JCQlCSUc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlCSUc1LUhLU0NTLy8JCUJJRzVIS1NDUy8vCittb2R1bGUJQklHNUhLU0NTLy8JCUlOVEVSTkFMCQlCSUc1SEtTQ1MJMQorbW9kdWxlCUlOVEVSTkFMCQlCSUc1SEtTQ1MvLwkJQklHNUhLU0NTCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0pQLU1TLy8JCUVVQy1KUC1NUy8vCithbGlhcwlFVUNKUC1PUEVOLy8JCUVVQy1KUC1NUy8vCithbGlhcwlFVUNKUC1XSU4vLwkJRVVDLUpQLU1TLy8KK21vZHVsZQlFVUMtSlAtTVMvLwkJSU5URVJOQUwJCUVVQy1KUC1NUwkxCittb2R1bGUJSU5URVJOQUwJCUVVQy1KUC1NUy8vCQlFVUMtSlAtTVMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJRVVDSlAvLwkJCUVVQy1KUC8vCithbGlhcwlDU0VVQ1BLREZNVEpBUEFORVNFLy8JRVVDLUpQLy8KK2FsaWFzCU9TRjAwMDMwMDEwLy8JCUVVQy1KUC8vCithbGlhcwlVSklTLy8JCQlFVUMtSlAvLworbW9kdWxlCUVVQy1KUC8vCQlJTlRFUk5BTAkJRVVDLUpQCQkxCittb2R1bGUJSU5URVJOQUwJCUVVQy1KUC8vCQlFVUMtSlAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUVVQ0NOLy8JCQlFVUMtQ04vLworYWxpYXMJR0IyMzEyLy8JCUVVQy1DTi8vCithbGlhcwljc0dCMjMxMi8vCQlFVUMtQ04vLworYWxpYXMJQ04tR0IvLwkJCUVVQy1DTi8vCittb2R1bGUJRVVDLUNOLy8JCUlOVEVSTkFMCQlFVUMtQ04JCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLUNOLy8JCUVVQy1DTgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUVVQy1DTi8vCQlCSUc1Ly8JCQlHQkJJRzUJCTEKK21vZHVsZQlCSUc1Ly8JCQlFVUMtQ04vLwkJR0JCSUc1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlHQjEzMDAwLy8JCUdCSy8vCithbGlhcwlDUDkzNi8vCQkJR0JLLy8KK2FsaWFzCU1TOTM2Ly8JCQlHQksvLworYWxpYXMJV0lORE9XUy05MzYvLwkJR0JLLy8KK21vZHVsZQlHQksvLwkJCUlOVEVSTkFMCQlHQksJCTEKK21vZHVsZQlJTlRFUk5BTAkJR0JLLy8JCQlHQksJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHQksvLwkJCUVVQy1DTi8vCQlHQkdCSwkJMQorbW9kdWxlCUVVQy1DTi8vCQlHQksvLwkJCUdCR0JLCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlFVUNUVy8vCQkJRVVDLVRXLy8KK2FsaWFzCU9TRjAwMDUwMDBhLy8JCUVVQy1UVy8vCittb2R1bGUJRVVDLVRXLy8JCUlOVEVSTkFMCQlFVUMtVFcJCTEKK21vZHVsZQlJTlRFUk5BTAkJRVVDLVRXLy8JCUVVQy1UVwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJUlVTQ0lJLy8JCUNQMTEyNS8vCithbGlhcwlJQk04NDgvLwkJQ1AxMTI1Ly8KK21vZHVsZQlDUDExMjUvLwkJSU5URVJOQUwJCUNQMTEyNQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDExMjUvLwkJQ1AxMTI1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1FRS8vCQkJQ1AxMjUwLy8KK2FsaWFzCVdJTkRPV1MtMTI1MC8vCQlDUDEyNTAvLworbW9kdWxlCUNQMTI1MC8vCQlJTlRFUk5BTAkJQ1AxMjUwCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1MC8vCQlDUDEyNTAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUNZUkwvLwkJQ1AxMjUxLy8KK2FsaWFzCVdJTkRPV1MtMTI1MS8vCQlDUDEyNTEvLworbW9kdWxlCUNQMTI1MS8vCQlJTlRFUk5BTAkJQ1AxMjUxCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1MS8vCQlDUDEyNTEJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUFOU0kvLwkJQ1AxMjUyLy8KK2FsaWFzCVdJTkRPV1MtMTI1Mi8vCQlDUDEyNTIvLworbW9kdWxlCUNQMTI1Mi8vCQlJTlRFUk5BTAkJQ1AxMjUyCQkxCittb2R1bGUJSU5URVJOQUwJCUNQMTI1Mi8vCQlDUDEyNTIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1TLUdSRUVLLy8JCUNQMTI1My8vCithbGlhcwlXSU5ET1dTLTEyNTMvLwkJQ1AxMjUzLy8KK21vZHVsZQlDUDEyNTMvLwkJSU5URVJOQUwJCUNQMTI1MwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTMvLwkJQ1AxMjUzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1UVVJLLy8JCUNQMTI1NC8vCithbGlhcwlXSU5ET1dTLTEyNTQvLwkJQ1AxMjU0Ly8KK21vZHVsZQlDUDEyNTQvLwkJSU5URVJOQUwJCUNQMTI1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTQvLwkJQ1AxMjU0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1IRUJSLy8JCUNQMTI1NS8vCithbGlhcwlXSU5ET1dTLTEyNTUvLwkJQ1AxMjU1Ly8KK21vZHVsZQlDUDEyNTUvLwkJSU5URVJOQUwJCUNQMTI1NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTUvLwkJQ1AxMjU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlNUy1BUkFCLy8JCUNQMTI1Ni8vCithbGlhcwlXSU5ET1dTLTEyNTYvLwkJQ1AxMjU2Ly8KK21vZHVsZQlDUDEyNTYvLwkJSU5URVJOQUwJCUNQMTI1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTYvLwkJQ1AxMjU2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXSU5CQUxUUklNLy8JCUNQMTI1Ny8vCithbGlhcwlXSU5ET1dTLTEyNTcvLwkJQ1AxMjU3Ly8KK21vZHVsZQlDUDEyNTcvLwkJSU5URVJOQUwJCUNQMTI1NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTcvLwkJQ1AxMjU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXSU5ET1dTLTEyNTgvLwkJQ1AxMjU4Ly8KK21vZHVsZQlDUDEyNTgvLwkJSU5URVJOQUwJCUNQMTI1OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDEyNTgvLwkJQ1AxMjU4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwk4NzQvLwkJCUlCTTg3NC8vCithbGlhcwlDUDg3NC8vCQkJSUJNODc0Ly8KK2FsaWFzCVdJTkRPV1MtODc0Ly8JCUlCTTg3NC8vCittb2R1bGUJSUJNODc0Ly8JCUlOVEVSTkFMCQlJQk04NzQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODc0Ly8JCUlCTTg3NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUNQNzM3Ly8JCQlJTlRFUk5BTAkJQ1A3MzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1A3MzcvLwkJCUNQNzM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk03NzUvLwkJQ1A3NzUvLworYWxpYXMJQ1NQQzc3NUJBTFRJQy8vCQlDUDc3NS8vCittb2R1bGUJQ1A3NzUvLwkJCUlOVEVSTkFMCQlDUDc3NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDUDc3NS8vCQkJQ1A3NzUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTSVNPMjAyMkpQLy8JCUlTTy0yMDIyLUpQLy8KK2FsaWFzCUlTTzIwMjJKUC8vCQlJU08tMjAyMi1KUC8vCittb2R1bGUJSVNPLTIwMjItSlAvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUpQCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLTIwMjItSlAvLwkJSVNPLTIwMjItSlAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIySlAyLy8JCUlTTy0yMDIyLUpQLTIvLworYWxpYXMJSVNPMjAyMkpQMi8vCQlJU08tMjAyMi1KUC0yLy8KK21vZHVsZQlJU08tMjAyMi1KUC0yLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1KUAkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUpQLTIvLwkJSVNPLTIwMjItSlAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUlTTy0yMDIyLUpQLTMvLwkJSU5URVJOQUwJCUlTTy0yMDIyLUpQLTMJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1KUC0zLy8JCUlTTy0yMDIyLUpQLTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJQ1NJU08yMDIyS1IvLwkJSVNPLTIwMjItS1IvLworYWxpYXMJSVNPMjAyMktSLy8JCUlTTy0yMDIyLUtSLy8KK21vZHVsZQlJU08tMjAyMi1LUi8vCQlJTlRFUk5BTAkJSVNPLTIwMjItS1IJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1LUi8vCQlJU08tMjAyMi1LUgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDU0lTTzIwMjJDTi8vCQlJU08tMjAyMi1DTi8vCithbGlhcwlJU08yMDIyQ04vLwkJSVNPLTIwMjItQ04vLworbW9kdWxlCUlTTy0yMDIyLUNOLy8JCUlOVEVSTkFMCQlJU08tMjAyMi1DTgkxCittb2R1bGUJSU5URVJOQUwJCUlTTy0yMDIyLUNOLy8JCUlTTy0yMDIyLUNOCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTzIwMjJDTkVYVC8vCQlJU08tMjAyMi1DTi1FWFQvLworbW9kdWxlCUlTTy0yMDIyLUNOLUVYVC8vCUlOVEVSTkFMCQlJU08tMjAyMi1DTi1FWFQJMQorbW9kdWxlCUlOVEVSTkFMCQlJU08tMjAyMi1DTi1FWFQvLwlJU08tMjAyMi1DTi1FWFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTUFDLy8JCQlNQUNJTlRPU0gvLworYWxpYXMJQ1NNQUNJTlRPU0gvLwkJTUFDSU5UT1NILy8KK21vZHVsZQlNQUNJTlRPU0gvLwkJSU5URVJOQUwJCU1BQ0lOVE9TSAkxCittb2R1bGUJSU5URVJOQUwJCU1BQ0lOVE9TSC8vCQlNQUNJTlRPU0gJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE0My8vCQlJRUNfUDI3LTEvLworYWxpYXMJQ1NJU08xNDNJRUNQMjcxLy8JSUVDX1AyNy0xLy8KK2FsaWFzCUlFQ19QMjcxLy8JCUlFQ19QMjctMS8vCittb2R1bGUJSUVDX1AyNy0xLy8JCUlOVEVSTkFMCQlJRUNfUDI3LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJRUNfUDI3LTEvLwkJSUVDX1AyNy0xCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTT185MDM2Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUFSQUJJQzcvLwkJQVNNT180NDkvLworYWxpYXMJSVNPLUlSLTg5Ly8JCUFTTU9fNDQ5Ly8KK2FsaWFzCUNTSVNPODlBU01PNDQ5Ly8JQVNNT180NDkvLworbW9kdWxlCUFTTU9fNDQ5Ly8JCUlOVEVSTkFMCQlBU01PXzQ0OQkxCittb2R1bGUJSU5URVJOQUwJCUFTTU9fNDQ5Ly8JCUFTTU9fNDQ5CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUFOU0lfWDMuMTEwLTE5ODMvLwlBTlNJX1gzLjExMC8vCithbGlhcwlJU08tSVItOTkvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NBX1Q1MDAtMTk4My8vCQlBTlNJX1gzLjExMC8vCithbGlhcwlDU0FfVDUwMC8vCQlBTlNJX1gzLjExMC8vCithbGlhcwlOQVBMUFMvLwkJQU5TSV9YMy4xMTAvLworYWxpYXMJQ1NJU085OU5BUExQUy8vCQlBTlNJX1gzLjExMC8vCittb2R1bGUJQU5TSV9YMy4xMTAvLwkJSU5URVJOQUwJCUFOU0lfWDMuMTEwCTEKK21vZHVsZQlJTlRFUk5BTAkJQU5TSV9YMy4xMTAvLwkJQU5TSV9YMy4xMTAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTEzOS8vCQlDU05fMzY5MTAzLy8KK2FsaWFzCUNTSVNPMTM5Q1NOMzY5MTAzLy8JQ1NOXzM2OTEwMy8vCittb2R1bGUJQ1NOXzM2OTEwMy8vCQlJTlRFUk5BTAkJQ1NOXzM2OTEwMwkxCittb2R1bGUJSU5URVJOQUwJCUNTTl8zNjkxMDMvLwkJQ1NOXzM2OTEwMwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDV0ktMi8vCQkJQ1dJLy8KK2FsaWFzCUNQLUhVLy8JCQlDV0kvLworbW9kdWxlCUNXSS8vCQkJSU5URVJOQUwJCUNXSQkJMQorbW9kdWxlCUlOVEVSTkFMCQlDV0kvLwkJCUNXSQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJREVDLy8JCQlERUMtTUNTLy8KK2FsaWFzCUNTREVDTUNTLy8JCURFQy1NQ1MvLworYWxpYXMJREVDTUNTLy8JCURFQy1NQ1MvLworbW9kdWxlCURFQy1NQ1MvLwkJSU5URVJOQUwJCURFQy1NQ1MJCTEKK21vZHVsZQlJTlRFUk5BTAkJREVDLU1DUy8vCQlERUMtTUNTCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTExLy8JCUVDTUEtQ1lSSUxMSUMvLworYWxpYXMJQ1NJU08xMTFFQ01BQ1lSSUxMSUMvLwlFQ01BLUNZUklMTElDLy8KK2FsaWFzCUVDTUFDWVJJTExJQy8vCQlFQ01BLUNZUklMTElDLy8KK21vZHVsZQlFQ01BLUNZUklMTElDLy8JCUlOVEVSTkFMCQlFQ01BLUNZUklMTElDCTEKK21vZHVsZQlJTlRFUk5BTAkJRUNNQS1DWVJJTExJQy8vCQlFQ01BLUNZUklMTElDCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVNUX1NFVl8zNTgtODgvLwkJR09TVF8xOTc2OC03NC8vCithbGlhcwlHT1NUXzE5NzY4Ly8JCUdPU1RfMTk3NjgtNzQvLworYWxpYXMJSVNPLUlSLTE1My8vCQlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUNTSVNPMTUzR09TVDE5NzY4NzQvLwlHT1NUXzE5NzY4LTc0Ly8KK2FsaWFzCUdPU1RfMTk3Njg3NC8vCQlHT1NUXzE5NzY4LTc0Ly8KK21vZHVsZQlHT1NUXzE5NzY4LTc0Ly8JCUlOVEVSTkFMCQlHT1NUXzE5NzY4LTc0CTEKK21vZHVsZQlJTlRFUk5BTAkJR09TVF8xOTc2OC03NC8vCQlHT1NUXzE5NzY4LTc0CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi0xNTAvLwkJR1JFRUstQ0NJVFQvLworYWxpYXMJQ1NJU08xNTAvLwkJR1JFRUstQ0NJVFQvLworYWxpYXMJQ1NJU08xNTBHUkVFS0NDSVRULy8JR1JFRUstQ0NJVFQvLworYWxpYXMJR1JFRUtDQ0lUVC8vCQlHUkVFSy1DQ0lUVC8vCittb2R1bGUJR1JFRUstQ0NJVFQvLwkJSU5URVJOQUwJCUdSRUVLLUNDSVRUCTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUstQ0NJVFQvLwkJR1JFRUstQ0NJVFQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTg4Ly8JCUdSRUVLNy8vCithbGlhcwlDU0lTTzg4R1JFRUs3Ly8JCUdSRUVLNy8vCittb2R1bGUJR1JFRUs3Ly8JCUlOVEVSTkFMCQlHUkVFSzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJR1JFRUs3Ly8JCUdSRUVLNwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTE4Ly8JCUdSRUVLNy1PTEQvLworYWxpYXMJQ1NJU08xOEdSRUVLN09MRC8vCUdSRUVLNy1PTEQvLworYWxpYXMJR1JFRUs3T0xELy8JCUdSRUVLNy1PTEQvLworbW9kdWxlCUdSRUVLNy1PTEQvLwkJSU5URVJOQUwJCUdSRUVLNy1PTEQJMQorbW9kdWxlCUlOVEVSTkFMCQlHUkVFSzctT0xELy8JCUdSRUVLNy1PTEQJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTQ5Ly8JCUlOSVMvLworYWxpYXMJQ1NJU080OUlOSVMvLwkJSU5JUy8vCittb2R1bGUJSU5JUy8vCQkJSU5URVJOQUwJCUlOSVMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSU5JUy8vCQkJSU5JUwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTUwLy8JCUlOSVMtOC8vCithbGlhcwlDU0lTTzUwSU5JUzgvLwkJSU5JUy04Ly8KK2FsaWFzCUlOSVM4Ly8JCQlJTklTLTgvLworbW9kdWxlCUlOSVMtOC8vCQlJTlRFUk5BTAkJSU5JUy04CQkxCittb2R1bGUJSU5URVJOQUwJCUlOSVMtOC8vCQlJTklTLTgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi01MS8vCQlJTklTLUNZUklMTElDLy8KK2FsaWFzCUNTSVNPNTFJTklTQ1lSSUxMSUMvLwlJTklTLUNZUklMTElDLy8KK2FsaWFzCUlOSVNDWVJJTExJQy8vCQlJTklTLUNZUklMTElDLy8KK21vZHVsZQlJTklTLUNZUklMTElDLy8JCUlOVEVSTkFMCQlJTklTLUNZUklMTElDCTEKK21vZHVsZQlJTlRFUk5BTAkJSU5JUy1DWVJJTExJQy8vCQlJTklTLUNZUklMTElDCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTTy1JUi05OC8vCQlJU09fMjAzMy8vCithbGlhcwlJU09fMjAzMy0xOTgzLy8JCUlTT18yMDMzLy8KK2FsaWFzCUUxM0IvLwkJCUlTT18yMDMzLy8KK2FsaWFzCUNTSVNPMjAzMy8vCQlJU09fMjAzMy8vCittb2R1bGUJSVNPXzIwMzMvLwkJSU5URVJOQUwJCUlTT18yMDMzCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzIwMzMvLwkJSVNPXzIwMzMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPLUlSLTM3Ly8JCUlTT181NDI3Ly8KK2FsaWFzCUtPSS03Ly8JCQlJU09fNTQyNy8vCithbGlhcwlDU0lTTzU0MjdDWVJJTExJQy8vCUlTT181NDI3Ly8KK21vZHVsZQlJU09fNTQyNy8vCQlJTlRFUk5BTAkJSVNPXzU0MjcJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNTQyNy8vCQlJU09fNTQyNwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTQvLwkJSVNPXzU0MjctRVhULy8KK2FsaWFzCUlTT181NDI3OjE5ODEvLwkJSVNPXzU0MjctRVhULy8KK2FsaWFzCUNTSVNPNTQyN0NZUklMTElDMTk4MS8vCUlTT181NDI3LUVYVC8vCithbGlhcwlJU09fNTQyN0VYVC8vCQlJU09fNTQyNy1FWFQvLworbW9kdWxlCUlTT181NDI3LUVYVC8vCQlJTlRFUk5BTAkJSVNPXzU0MjctRVhUCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzU0MjctRVhULy8JCUlTT181NDI3LUVYVAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItNTUvLwkJSVNPXzU0MjgvLworYWxpYXMJSVNPXzU0Mjg6MTk4MC8vCQlJU09fNTQyOC8vCithbGlhcwlDU0lTTzU0MjhHUkVFSy8vCUlTT181NDI4Ly8KK21vZHVsZQlJU09fNTQyOC8vCQlJTlRFUk5BTAkJSVNPXzU0MjgJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fNTQyOC8vCQlJU09fNTQyOAkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItMTU1Ly8JCUlTT18xMDM2Ny1CT1gvLworYWxpYXMJQ1NJU08xMDM2N0JPWC8vCQlJU09fMTAzNjctQk9YLy8KK2FsaWFzCUlTT18xMDM2N0JPWC8vCQlJU09fMTAzNjctQk9YLy8KK21vZHVsZQlJU09fMTAzNjctQk9YLy8JCUlOVEVSTkFMCQlJU09fMTAzNjctQk9YCTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPXzEwMzY3LUJPWC8vCQlJU09fMTAzNjctQk9YCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQ0lTLy8JCQlNQUMtSVMvLworbW9kdWxlCU1BQy1JUy8vCQlJTlRFUk5BTAkJTUFDLUlTCQkxCittb2R1bGUJSU5URVJOQUwJCU1BQy1JUy8vCQlNQUMtSVMJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCU1BQ1VLLy8JCQlNQUMtVUsvLworYWxpYXMJTUFDVUtSQUlOSUFOLy8JCU1BQy1VSy8vCithbGlhcwlNQUMtQ1lSSUxMSUMvLwkJTUFDLVVLLy8KK2FsaWFzCU1BQ0NZUklMTElDLy8JCU1BQy1VSy8vCittb2R1bGUJTUFDLVVLLy8JCUlOVEVSTkFMCQlNQUMtVUsJCTEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLVVLLy8JCU1BQy1VSwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJTVMtTUFDLUNZUklMTElDLy8JQ1AxMDAwNy8vCithbGlhcwlNU01BQ0NZUklMTElDLy8JCUNQMTAwMDcvLworbW9kdWxlCUNQMTAwMDcvLwkJSU5URVJOQUwJCUNQMTAwMDcJCTEKK21vZHVsZQlJTlRFUk5BTAkJQ1AxMDAwNy8vCQlDUDEwMDA3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOS0xLy8JCU5BVFMtREFOTy8vCithbGlhcwlDU05BVFNEQU5PLy8JCU5BVFMtREFOTy8vCithbGlhcwlOQVRTREFOTy8vCQlOQVRTLURBTk8vLworbW9kdWxlCU5BVFMtREFOTy8vCQlJTlRFUk5BTAkJTkFUUy1EQU5PCTEKK21vZHVsZQlJTlRFUk5BTAkJTkFUUy1EQU5PLy8JCU5BVFMtREFOTwkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU08tSVItOC0xLy8JCU5BVFMtU0VGSS8vCithbGlhcwlDU05BVFNTRUZJLy8JCU5BVFMtU0VGSS8vCithbGlhcwlOQVRTU0VGSS8vCQlOQVRTLVNFRkkvLworbW9kdWxlCU5BVFMtU0VGSS8vCQlJTlRFUk5BTAkJTkFUUy1TRUZJCTEKK21vZHVsZQlJTlRFUk5BTAkJTkFUUy1TRUZJLy8JCU5BVFMtU0VGSQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlXUzIvLwkJCVdJTi1TQU1JLTIvLworYWxpYXMJV0lOU0FNSTIvLwkJV0lOLVNBTUktMi8vCittb2R1bGUJV0lOLVNBTUktMi8vCQlJTlRFUk5BTAkJU0FNSS1XUzIJMQorbW9kdWxlCUlOVEVSTkFMCQlXSU4tU0FNSS0yLy8JCVNBTUktV1MyCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tSVItMTk3Ly8JCUlOVEVSTkFMCQlJU08tSVItMTk3CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLUlSLTE5Ny8vCQlJU08tSVItMTk3CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRJUzYyMC8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC0wLy8JCVRJUy02MjAvLworYWxpYXMJVElTNjIwLjI1MjktMS8vCQlUSVMtNjIwLy8KK2FsaWFzCVRJUzYyMC4yNTMzLTAvLwkJVElTLTYyMC8vCithbGlhcwlJU08tSVItMTY2Ly8JCVRJUy02MjAvLworbW9kdWxlCVRJUy02MjAvLwkJSU5URVJOQUwJCVRJUy02MjAJCTEKK21vZHVsZQlJTlRFUk5BTAkJVElTLTYyMC8vCQlUSVMtNjIwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlLT0k4VS8vCQkJS09JOC1VLy8KK21vZHVsZQlLT0k4LVUvLwkJSU5URVJOQUwJCUtPSTgtVQkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVUvLwkJS09JOC1VCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJU0lSSTMzNDIvLwkJSVNJUkktMzM0Mi8vCittb2R1bGUJSVNJUkktMzM0Mi8vCQlJTlRFUk5BTAkJSVNJUkktMzM0MgkxCittb2R1bGUJSU5URVJOQUwJCUlTSVJJLTMzNDIvLwkJSVNJUkktMzM0MgkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYxNi8vCQkJVVRGLTE2Ly8KK21vZHVsZQlVVEYtMTYvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTYvLwkJVVRGLTE2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEYxNkxFLy8JCVVURi0xNkxFLy8KK21vZHVsZQlVVEYtMTZMRS8vCQlJTlRFUk5BTAkJVVRGLTE2CQkxCittb2R1bGUJSU5URVJOQUwJCVVURi0xNkxFLy8JCVVURi0xNgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMTZCRS8vCQlVVEYtMTZCRS8vCittb2R1bGUJVVRGLTE2QkUvLwkJSU5URVJOQUwJCVVURi0xNgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMTZCRS8vCQlVVEYtMTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUNTVU5JQ09ERS8vCQlVTklDT0RFLy8KK21vZHVsZQlVTklDT0RFLy8JCUlOVEVSTkFMCQlVTklDT0RFCQkxCittb2R1bGUJSU5URVJOQUwJCVVOSUNPREUvLwkJVU5JQ09ERQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMzIvLwkJCVVURi0zMi8vCittb2R1bGUJVVRGLTMyLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyLy8JCVVURi0zMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJVVRGMzJMRS8vCQlVVEYtMzJMRS8vCittb2R1bGUJVVRGLTMyTEUvLwkJSU5URVJOQUwJCVVURi0zMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtMzJMRS8vCQlVVEYtMzIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVVURjMyQkUvLwkJVVRGLTMyQkUvLworbW9kdWxlCVVURi0zMkJFLy8JCUlOVEVSTkFMCQlVVEYtMzIJCTEKK21vZHVsZQlJTlRFUk5BTAkJVVRGLTMyQkUvLwkJVVRGLTMyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlVVEY3Ly8JCQlVVEYtNy8vCittb2R1bGUJVVRGLTcvLwkJCUlOVEVSTkFMCQlVVEYtNwkJMQorbW9kdWxlCUlOVEVSTkFMCQlVVEYtNy8vCQkJVVRGLTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlHQjE4MDMwLy8JCUlOVEVSTkFMCQlHQjE4MDMwCQkxCittb2R1bGUJSU5URVJOQUwJCUdCMTgwMzAvLwkJR0IxODAzMAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVZJU0NJSS8vCQlJTlRFUk5BTAkJVklTQ0lJCQkxCittb2R1bGUJSU5URVJOQUwJCVZJU0NJSS8vCQlWSVNDSUkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlLT0k4LVQvLwkJSU5URVJOQUwJCUtPSTgtVAkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVQvLwkJS09JOC1UCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJR0VPUkdJQU4tUFMvLwkJSU5URVJOQUwJCUdFT1JHSUFOLVBTCTEKK21vZHVsZQlJTlRFUk5BTAkJR0VPUkdJQU4tUFMvLwkJR0VPUkdJQU4tUFMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCUdFT1JHSUFOLUFDQURFTVkvLwlJTlRFUk5BTAkJR0VPUkdJQU4tQUNBREVNWSAxCittb2R1bGUJSU5URVJOQUwJCUdFT1JHSUFOLUFDQURFTVkvLwlHRU9SR0lBTi1BQ0FERU1ZIDEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJU08tSVItMjA5Ly8JCUlOVEVSTkFMCQlJU08tSVItMjA5CTEKK21vZHVsZQlJTlRFUk5BTAkJSVNPLUlSLTIwOS8vCQlJU08tSVItMjA5CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlNQUMtU0FNSS8vCQlJTlRFUk5BTAkJTUFDLVNBTUkJMQorbW9kdWxlCUlOVEVSTkFMCQlNQUMtU0FNSS8vCQlNQUMtU0FNSQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQVJNU0NJSS04Ly8JCUlOVEVSTkFMCQlBUk1TQ0lJLTgJMQorbW9kdWxlCUlOVEVSTkFMCQlBUk1TQ0lJLTgvLwkJQVJNU0NJSS04CTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVRDVk4vLwkJCVRDVk41NzEyLTEvLworYWxpYXMJVENWTi01NzEyLy8JCVRDVk41NzEyLTEvLworYWxpYXMJVENWTjU3MTItMToxOTkzLy8JVENWTjU3MTItMS8vCittb2R1bGUJVENWTjU3MTItMS8vCQlJTlRFUk5BTAkJVENWTjU3MTItMQkxCittb2R1bGUJSU5URVJOQUwJCVRDVk41NzEyLTEvLwkJVENWTjU3MTItMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJRVVDLUpJU1gwMjEzLy8JCUlOVEVSTkFMCQlFVUMtSklTWDAyMTMJMQorbW9kdWxlCUlOVEVSTkFMCQlFVUMtSklTWDAyMTMvLwkJRVVDLUpJU1gwMjEzCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlTaGlmdF9KSVNYMDIxMy8vCUlOVEVSTkFMCQlTSElGVF9KSVNYMDIxMwkxCittb2R1bGUJSU5URVJOQUwJCVNoaWZ0X0pJU1gwMjEzLy8JU0hJRlRfSklTWDAyMTMJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorbW9kdWxlCVRTQ0lJLy8JCQlJTlRFUk5BTAkJVFNDSUkJCTEKK21vZHVsZQlJTlRFUk5BTAkJVFNDSUkvLwkJCVRTQ0lJCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJUFQxNTQvLwkJCUlOVEVSTkFMCQlQVDE1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlQVDE1NC8vCQkJUFQxNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCVNUUksxMDQ4LTIwMDIvLwkJUksxMDQ4Ly8KK21vZHVsZQlSSzEwNDgvLwkJSU5URVJOQUwJCVJLMTA0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlSSzEwNDgvLwkJUksxMDQ4CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTAyNS8vCQlJQk0xMDI1Ly8KK2FsaWFzCUNQMTAyNS8vCQlJQk0xMDI1Ly8KK2FsaWFzCUNTSUJNMTAyNS8vCQlJQk0xMDI1Ly8KK21vZHVsZQlJQk0xMDI1Ly8JCUlOVEVSTkFMCQlJQk0xMDI1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEwMjUvLwkJSUJNMTAyNQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMjIvLwkJSUJNMTEyMi8vCithbGlhcwlDUDExMjIvLwkJSUJNMTEyMi8vCithbGlhcwlDU0lCTTExMjIvLwkJSUJNMTEyMi8vCittb2R1bGUJSUJNMTEyMi8vCQlJTlRFUk5BTAkJSUJNMTEyMgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTIyLy8JCUlCTTExMjIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTM3Ly8JCUlCTTExMzcvLworYWxpYXMJQ1AxMTM3Ly8JCUlCTTExMzcvLworYWxpYXMJQ1NJQk0xMTM3Ly8JCUlCTTExMzcvLworbW9kdWxlCUlCTTExMzcvLwkJSU5URVJOQUwJCUlCTTExMzcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTEzNy8vCQlJQk0xMTM3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1My8vCQlJQk0xMTUzLy8KK2FsaWFzCUNQMTE1My8vCQlJQk0xMTUzLy8KK2FsaWFzCUNTSUJNMTE1My8vCQlJQk0xMTUzLy8KK21vZHVsZQlJQk0xMTUzLy8JCUlOVEVSTkFMCQlJQk0xMTUzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTMvLwkJSUJNMTE1MwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTQvLwkJSUJNMTE1NC8vCithbGlhcwlDUDExNTQvLwkJSUJNMTE1NC8vCithbGlhcwlDU0lCTTExNTQvLwkJSUJNMTE1NC8vCittb2R1bGUJSUJNMTE1NC8vCQlJTlRFUk5BTAkJSUJNMTE1NAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU0Ly8JCUlCTTExNTQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU1Ly8JCUlCTTExNTUvLworYWxpYXMJQ1AxMTU1Ly8JCUlCTTExNTUvLworYWxpYXMJQ1NJQk0xMTU1Ly8JCUlCTTExNTUvLworbW9kdWxlCUlCTTExNTUvLwkJSU5URVJOQUwJCUlCTTExNTUJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1NS8vCQlJQk0xMTU1CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNQMTE1NS8vCQlJQk0xMTU1Ly8KK2FsaWFzCUNTSUJNMTE1NS8vCQlJQk0xMTU1Ly8KK21vZHVsZQlJQk0xMTU1Ly8JCUlOVEVSTkFMCQlJQk0xMTU1CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTUvLwkJSUJNMTE1NQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNTYvLwkJSUJNMTE1Ni8vCithbGlhcwlDUDExNTYvLwkJSUJNMTE1Ni8vCithbGlhcwlDU0lCTTExNTYvLwkJSUJNMTE1Ni8vCittb2R1bGUJSUJNMTE1Ni8vCQlJTlRFUk5BTAkJSUJNMTE1NgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTU2Ly8JCUlCTTExNTYJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTU3Ly8JCUlCTTExNTcvLworYWxpYXMJQ1AxMTU3Ly8JCUlCTTExNTcvLworYWxpYXMJQ1NJQk0xMTU3Ly8JCUlCTTExNTcvLworbW9kdWxlCUlCTTExNTcvLwkJSU5URVJOQUwJCUlCTTExNTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE1Ny8vCQlJQk0xMTU3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE1OC8vCQlJQk0xMTU4Ly8KK2FsaWFzCUNQMTE1OC8vCQlJQk0xMTU4Ly8KK2FsaWFzCUNTSUJNMTE1OC8vCQlJQk0xMTU4Ly8KK21vZHVsZQlJQk0xMTU4Ly8JCUlOVEVSTkFMCQlJQk0xMTU4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNTgvLwkJSUJNMTE1OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTgwMy8vCQlJQk04MDMvLworYWxpYXMJQ1A4MDMvLwkJSUJNODAzLy8KK2FsaWFzCUNTSUJNODAzLy8JCUlCTTgwMy8vCittb2R1bGUJSUJNODAzLy8JCUlOVEVSTkFMCQlJQk04MDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNODAzLy8JCUlCTTgwMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMS8vCQlJQk05MDEvLworYWxpYXMJQ1A5MDEvLwkJSUJNOTAxLy8KK2FsaWFzCUNTSUJNOTAxLy8JCUlCTTkwMS8vCittb2R1bGUJSUJNOTAxLy8JCUlOVEVSTkFMCQlJQk05MDEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAxLy8JCUlCTTkwMQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMi8vCQlJQk05MDIvLworYWxpYXMJQ1A5MDIvLwkJSUJNOTAyLy8KK2FsaWFzCUNTSUJNOTAyLy8JCUlCTTkwMi8vCittb2R1bGUJSUJNOTAyLy8JCUlOVEVSTkFMCQlJQk05MDIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTAyLy8JCUlCTTkwMgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkyMS8vCQlJQk05MjEvLworYWxpYXMJQ1A5MjEvLwkJSUJNOTIxLy8KK2FsaWFzCUNTSUJNOTIxLy8JCUlCTTkyMS8vCittb2R1bGUJSUJNOTIxLy8JCUlOVEVSTkFMCQlJQk05MjEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTIxLy8JCUlCTTkyMQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwMDgvLwkJSUJNMTAwOC8vCithbGlhcwlDUDEwMDgvLwkJSUJNMTAwOC8vCithbGlhcwlDU0lCTTEwMDgvLwkJSUJNMTAwOC8vCittb2R1bGUJSUJNMTAwOC8vCQlJTlRFUk5BTAkJSUJNMTAwOAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDA4Ly8JCUlCTTEwMDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK21vZHVsZQlJQk0xMDA4Ly8JCUlCTTQyMC8vCQlJQk0xMDA4XzQyMAkxCittb2R1bGUJSUJNNDIwLy8JCUlCTTEwMDgvLwkJSUJNMTAwOF80MjAJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEwOTcvLwkJSUJNMTA5Ny8vCithbGlhcwlDUDEwOTcvLwkJSUJNMTA5Ny8vCithbGlhcwlDU0lCTTEwOTcvLwkJSUJNMTA5Ny8vCittb2R1bGUJSUJNMTA5Ny8vCQlJTlRFUk5BTAkJSUJNMTA5NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMDk3Ly8JCUlCTTEwOTcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTEyLy8JCUlCTTExMTIvLworYWxpYXMJQ1AxMTEyLy8JCUlCTTExMTIvLworYWxpYXMJQ1NJQk0xMTEyLy8JCUlCTTExMTIvLworbW9kdWxlCUlCTTExMTIvLwkJSU5URVJOQUwJCUlCTTExMTIJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTExMi8vCQlJQk0xMTEyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTEyMy8vCQlJQk0xMTIzLy8KK2FsaWFzCUNQMTEyMy8vCQlJQk0xMTIzLy8KK2FsaWFzCUNTSUJNMTEyMy8vCQlJQk0xMTIzLy8KK21vZHVsZQlJQk0xMTIzLy8JCUlOVEVSTkFMCQlJQk0xMTIzCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExMjMvLwkJSUJNMTEyMwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExMzAvLwkJSUJNMTEzMC8vCithbGlhcwlDUDExMzAvLwkJSUJNMTEzMC8vCithbGlhcwlDU0lCTTExMzAvLwkJSUJNMTEzMC8vCittb2R1bGUJSUJNMTEzMC8vCQlJTlRFUk5BTAkJSUJNMTEzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTMwLy8JCUlCTTExMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQwLy8JCUlCTTExNDAvLworYWxpYXMJQ1AxMTQwLy8JCUlCTTExNDAvLworYWxpYXMJQ1NJQk0xMTQwLy8JCUlCTTExNDAvLworbW9kdWxlCUlCTTExNDAvLwkJSU5URVJOQUwJCUlCTTExNDAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0MC8vCQlJQk0xMTQwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0MS8vCQlJQk0xMTQxLy8KK2FsaWFzCUNQMTE0MS8vCQlJQk0xMTQxLy8KK2FsaWFzCUNTSUJNMTE0MS8vCQlJQk0xMTQxLy8KK21vZHVsZQlJQk0xMTQxLy8JCUlOVEVSTkFMCQlJQk0xMTQxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDEvLwkJSUJNMTE0MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDIvLwkJSUJNMTE0Mi8vCithbGlhcwlDUDExNDIvLwkJSUJNMTE0Mi8vCithbGlhcwlDU0lCTTExNDIvLwkJSUJNMTE0Mi8vCittb2R1bGUJSUJNMTE0Mi8vCQlJTlRFUk5BTAkJSUJNMTE0MgkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQyLy8JCUlCTTExNDIJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQzLy8JCUlCTTExNDMvLworYWxpYXMJQ1AxMTQzLy8JCUlCTTExNDMvLworYWxpYXMJQ1NJQk0xMTQzLy8JCUlCTTExNDMvLworbW9kdWxlCUlCTTExNDMvLwkJSU5URVJOQUwJCUlCTTExNDMJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0My8vCQlJQk0xMTQzCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0NC8vCQlJQk0xMTQ0Ly8KK2FsaWFzCUNQMTE0NC8vCQlJQk0xMTQ0Ly8KK2FsaWFzCUNTSUJNMTE0NC8vCQlJQk0xMTQ0Ly8KK21vZHVsZQlJQk0xMTQ0Ly8JCUlOVEVSTkFMCQlJQk0xMTQ0CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDQvLwkJSUJNMTE0NAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDUvLwkJSUJNMTE0NS8vCithbGlhcwlDUDExNDUvLwkJSUJNMTE0NS8vCithbGlhcwlDU0lCTTExNDUvLwkJSUJNMTE0NS8vCittb2R1bGUJSUJNMTE0NS8vCQlJTlRFUk5BTAkJSUJNMTE0NQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ1Ly8JCUlCTTExNDUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ2Ly8JCUlCTTExNDYvLworYWxpYXMJQ1AxMTQ2Ly8JCUlCTTExNDYvLworYWxpYXMJQ1NJQk0xMTQ2Ly8JCUlCTTExNDYvLworbW9kdWxlCUlCTTExNDYvLwkJSU5URVJOQUwJCUlCTTExNDYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0Ni8vCQlJQk0xMTQ2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE0Ny8vCQlJQk0xMTQ3Ly8KK2FsaWFzCUNQMTE0Ny8vCQlJQk0xMTQ3Ly8KK2FsaWFzCUNTSUJNMTE0Ny8vCQlJQk0xMTQ3Ly8KK21vZHVsZQlJQk0xMTQ3Ly8JCUlOVEVSTkFMCQlJQk0xMTQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNDcvLwkJSUJNMTE0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNDgvLwkJSUJNMTE0OC8vCithbGlhcwlDUDExNDgvLwkJSUJNMTE0OC8vCithbGlhcwlDU0lCTTExNDgvLwkJSUJNMTE0OC8vCittb2R1bGUJSUJNMTE0OC8vCQlJTlRFUk5BTAkJSUJNMTE0OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTQ4Ly8JCUlCTTExNDgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMTQ5Ly8JCUlCTTExNDkvLworYWxpYXMJQ1AxMTQ5Ly8JCUlCTTExNDkvLworYWxpYXMJQ1NJQk0xMTQ5Ly8JCUlCTTExNDkvLworbW9kdWxlCUlCTTExNDkvLwkJSU5URVJOQUwJCUlCTTExNDkJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTE0OS8vCQlJQk0xMTQ5CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTE2Ni8vCQlJQk0xMTY2Ly8KK2FsaWFzCUNQMTE2Ni8vCQlJQk0xMTY2Ly8KK2FsaWFzCUNTSUJNMTE2Ni8vCQlJQk0xMTY2Ly8KK21vZHVsZQlJQk0xMTY2Ly8JCUlOVEVSTkFMCQlJQk0xMTY2CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTExNjYvLwkJSUJNMTE2NgkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTExNjcvLwkJSUJNMTE2Ny8vCithbGlhcwlDUDExNjcvLwkJSUJNMTE2Ny8vCithbGlhcwlDU0lCTTExNjcvLwkJSUJNMTE2Ny8vCittb2R1bGUJSUJNMTE2Ny8vCQlJTlRFUk5BTAkJSUJNMTE2NwkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMTY3Ly8JCUlCTTExNjcJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00NTE3Ly8JCUlCTTQ1MTcvLworYWxpYXMJQ1A0NTE3Ly8JCUlCTTQ1MTcvLworYWxpYXMJQ1NJQk00NTE3Ly8JCUlCTTQ1MTcvLworbW9kdWxlCUlCTTQ1MTcvLwkJSU5URVJOQUwJCUlCTTQ1MTcJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDUxNy8vCQlJQk00NTE3CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNDg5OS8vCQlJQk00ODk5Ly8KK2FsaWFzCUNQNDg5OS8vCQlJQk00ODk5Ly8KK2FsaWFzCUNTSUJNNDg5OS8vCQlJQk00ODk5Ly8KK21vZHVsZQlJQk00ODk5Ly8JCUlOVEVSTkFMCQlJQk00ODk5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTQ4OTkvLwkJSUJNNDg5OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTQ5MDkvLwkJSUJNNDkwOS8vCithbGlhcwlDUDQ5MDkvLwkJSUJNNDkwOS8vCithbGlhcwlDU0lCTTQ5MDkvLwkJSUJNNDkwOS8vCittb2R1bGUJSUJNNDkwOS8vCQlJTlRFUk5BTAkJSUJNNDkwOQkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk00OTA5Ly8JCUlCTTQ5MDkJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS00OTcxLy8JCUlCTTQ5NzEvLworYWxpYXMJQ1A0OTcxLy8JCUlCTTQ5NzEvLworYWxpYXMJQ1NJQk00OTcxLy8JCUlCTTQ5NzEvLworbW9kdWxlCUlCTTQ5NzEvLwkJSU5URVJOQUwJCUlCTTQ5NzEJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNNDk3MS8vCQlJQk00OTcxCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tNTM0Ny8vCQlJQk01MzQ3Ly8KK2FsaWFzCUNQNTM0Ny8vCQlJQk01MzQ3Ly8KK2FsaWFzCUNTSUJNNTM0Ny8vCQlJQk01MzQ3Ly8KK21vZHVsZQlJQk01MzQ3Ly8JCUlOVEVSTkFMCQlJQk01MzQ3CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTUzNDcvLwkJSUJNNTM0NwkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTkwMzAvLwkJSUJNOTAzMC8vCithbGlhcwlDUDkwMzAvLwkJSUJNOTAzMC8vCithbGlhcwlDU0lCTTkwMzAvLwkJSUJNOTAzMC8vCittb2R1bGUJSUJNOTAzMC8vCQlJTlRFUk5BTAkJSUJNOTAzMAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk05MDMwLy8JCUlCTTkwMzAJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS05MDY2Ly8JCUlCTTkwNjYvLworYWxpYXMJQ1A5MDY2Ly8JCUlCTTkwNjYvLworYWxpYXMJQ1NJQk05MDY2Ly8JCUlCTTkwNjYvLworbW9kdWxlCUlCTTkwNjYvLwkJSU5URVJOQUwJCUlCTTkwNjYJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNOTA2Ni8vCQlJQk05MDY2CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tOTQ0OC8vCQlJQk05NDQ4Ly8KK2FsaWFzCUNQOTQ0OC8vCQlJQk05NDQ4Ly8KK2FsaWFzCUNTSUJNOTQ0OC8vCQlJQk05NDQ4Ly8KK21vZHVsZQlJQk05NDQ4Ly8JCUlOVEVSTkFMCQlJQk05NDQ4CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTk0NDgvLwkJSUJNOTQ0OAkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEyNzEyLy8JCUlCTTEyNzEyLy8KK2FsaWFzCUNQMTI3MTIvLwkJSUJNMTI3MTIvLworYWxpYXMJQ1NJQk0xMjcxMi8vCQlJQk0xMjcxMi8vCittb2R1bGUJSUJNMTI3MTIvLwkJSU5URVJOQUwJCUlCTTEyNzEyCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEyNzEyLy8JCUlCTTEyNzEyCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTY4MDQvLwkJSUJNMTY4MDQvLworYWxpYXMJQ1AxNjgwNC8vCQlJQk0xNjgwNC8vCithbGlhcwlDU0lCTTE2ODA0Ly8JCUlCTTE2ODA0Ly8KK21vZHVsZQlJQk0xNjgwNC8vCQlJTlRFUk5BTAkJSUJNMTY4MDQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTY4MDQvLwkJSUJNMTY4MDQJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzY0Ly8JCUlCTTEzNjQvLworYWxpYXMJQ1AxMzY0Ly8JCUlCTTEzNjQvLworYWxpYXMJQ1NJQk0xMzY0Ly8JCUlCTTEzNjQvLworbW9kdWxlCUlCTTEzNjQvLwkJSU5URVJOQUwJCUlCTTEzNjQJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM2NC8vCQlJQk0xMzY0CQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM3MS8vCQlJQk0xMzcxLy8KK2FsaWFzCUNQMTM3MS8vCQlJQk0xMzcxLy8KK2FsaWFzCUNTSUJNMTM3MS8vCQlJQk0xMzcxLy8KK21vZHVsZQlJQk0xMzcxLy8JCUlOVEVSTkFMCQlJQk0xMzcxCQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzNzEvLwkJSUJNMTM3MQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSUJNLTEzODgvLwkJSUJNMTM4OC8vCithbGlhcwlDUDEzODgvLwkJSUJNMTM4OC8vCithbGlhcwlDU0lCTTEzODgvLwkJSUJNMTM4OC8vCittb2R1bGUJSUJNMTM4OC8vCQlJTlRFUk5BTAkJSUJNMTM4OAkJMQorbW9kdWxlCUlOVEVSTkFMCQlJQk0xMzg4Ly8JCUlCTTEzODgJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlCTS0xMzkwLy8JCUlCTTEzOTAvLworYWxpYXMJQ1AxMzkwLy8JCUlCTTEzOTAvLworYWxpYXMJQ1NJQk0xMzkwLy8JCUlCTTEzOTAvLworbW9kdWxlCUlCTTEzOTAvLwkJSU5URVJOQUwJCUlCTTEzOTAJCTEKK21vZHVsZQlJTlRFUk5BTAkJSUJNMTM5MC8vCQlJQk0xMzkwCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlJQk0tMTM5OS8vCQlJQk0xMzk5Ly8KK2FsaWFzCUNQMTM5OS8vCQlJQk0xMzk5Ly8KK2FsaWFzCUNTSUJNMTM5OS8vCQlJQk0xMzk5Ly8KK21vZHVsZQlJQk0xMzk5Ly8JCUlOVEVSTkFMCQlJQk0xMzk5CQkxCittb2R1bGUJSU5URVJOQUwJCUlCTTEzOTkvLwkJSUJNMTM5OQkJMQorCisjCWZyb20JCQl0bwkJCW1vZHVsZQkJY29zdAorYWxpYXMJSVNPL1RSXzExNTQ4LTEvCQlJU09fMTE1NDgtMS8vCithbGlhcwlJU08xMTU0OC0xLy8JCUlTT18xMTU0OC0xLy8KK21vZHVsZQlJU09fMTE1NDgtMS8vCQlJTlRFUk5BTAkJSVNPXzExNTQ4LTEJMQorbW9kdWxlCUlOVEVSTkFMCQlJU09fMTE1NDgtMS8vCQlJU09fMTE1NDgtMQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJTUlLLy8JCQlJTlRFUk5BTAkJTUlLCQkxCittb2R1bGUJSU5URVJOQUwJCU1JSy8vCQkJTUlLCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJQlJGLy8JCQlJTlRFUk5BTAkJQlJGCQkxCittb2R1bGUJSU5URVJOQUwJCUJSRi8vCQkJQlJGCQkxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0CithbGlhcwlDUDEyODIvLwkJTUFDLUNFTlRSQUxFVVJPUEUvLworbW9kdWxlCU1BQy1DRU5UUkFMRVVST1BFLy8JSU5URVJOQUwJCU1BQy1DRU5UUkFMRVVST1BFIDEKK21vZHVsZQlJTlRFUk5BTAkJTUFDLUNFTlRSQUxFVVJPUEUvLwlNQUMtQ0VOVFJBTEVVUk9QRSAxCisKKyMJZnJvbQkJCXRvCQkJbW9kdWxlCQljb3N0Cittb2R1bGUJS09JOC1SVS8vCQlJTlRFUk5BTAkJS09JOC1SVQkJMQorbW9kdWxlCUlOVEVSTkFMCQlLT0k4LVJVLy8JCUtPSTgtUlUJCTEKKworIwlmcm9tCQkJdG8JCQltb2R1bGUJCWNvc3QKK2FsaWFzCUlTT184ODU5LTlFLy8JCUlTTy04ODU5LTlFLy8KK2FsaWFzCUlTTzg4NTktOUUvLwkJSVNPLTg4NTktOUUvLworYWxpYXMJSVNPODg1OTlFLy8JCUlTTy04ODU5LTlFLy8KK21vZHVsZQlJU08tODg1OS05RS8vCQlJTlRFUk5BTAkJSVNPODg1OS05RQkxCittb2R1bGUJSU5URVJOQUwJCUlTTy04ODU5LTlFLy8JCUlTTzg4NTktOUUJMQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkNOUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJDTlMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2ZGUwZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJDTlMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkdCLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkdCLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGE0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliR0Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djb252L2xpYklTT0lSMTY1LnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L2xpYklTT0lSMTY1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTk3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliSVNPSVIxNjUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJUy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0OGQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJKSVMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJU1gwMjEzLnNvIGIvc3lzcm9vdC91c3IvbGliL2djb252L2xpYkpJU1gwMjEzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvZ2NvbnYvbGliSklTWDAyMTMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djb252L2xpYktTQy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJLU0Muc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NjU3MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9nY29udi9saWJLU0Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2djcnQxLm8gYi9zeXNyb290L3Vzci9saWIvZ2NydDEubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUzMjVmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2djcnQxLm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xkLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9sZC0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY5MTdkMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9sZC0yLjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xkLWxpbnV4LXg4Ni02NC5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xkLWxpbnV4LXg4Ni02NC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZmNWNmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGQtbGludXgteDg2LTY0LnNvLjIKQEAgLTAsMCArMSBAQAorbGQtMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS0yLjcuc28gYi9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM3OThkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS0yLjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5hIGIvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjYwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYkJyb2tlbkxvY2FsZS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjgxMDRjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuc28KQEAgLTAsMCArMSBAQAorbGliQnJva2VuTG9jYWxlLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGliQnJva2VuTG9jYWxlLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWIxZWVmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJCcm9rZW5Mb2NhbGUuc28uMQpAQCAtMCwwICsxIEBACitsaWJCcm9rZW5Mb2NhbGUtMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYkdMLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYkdMLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNjZGQ5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliR0wuc28KQEAgLTAsMCArMSBAQAorbGliR0wuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJHTC5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYkdMLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzBhYjhjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJHTC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYkdMLnNvLjEuMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJHTC5zby4xLjIgYi9zeXNyb290L3Vzci9saWIvbGliR0wuc28uMS4yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYTUxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliR0wuc28uMS4yCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJTZWdGYXVsdC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJTZWdGYXVsdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMyZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlNlZ0ZhdWx0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGI5MjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28gYi9zeXNyb290L3Vzci9saWIvbGliWDExLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjUyNjMwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWDExLnNvCkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjIuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41MjYzMDcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjIuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNi4yIGIvc3lzcm9vdC91c3IvbGliL2xpYlgxMS5zby42LjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTI2MzA3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNi4yCkBAIC0wLDAgKzEgQEAKK2xpYlgxMS5zby42LjIuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYMTEuc28uNi4yLjAgYi9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYuMi4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjEwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWDExLnNvLjYuMi4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zMzk2MzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhhdS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlhhdS5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNi4wIGIvc3lzcm9vdC91c3IvbGliL2xpYlhhdS5zby42LjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzM5NjM2YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNi4wCkBAIC0wLDAgKzEgQEAKK2xpYlhhdS5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYYXUuc28uNi4wLjAgYi9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjRiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGF1LnNvLjYuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZGFtYWdlLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmE2MWQ5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYlhkYW1hZ2Uuc28uMS4xLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xLjEgYi9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTYxZDkxZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZGFtYWdlLnNvLjEuMQpAQCAtMCwwICsxIEBACitsaWJYZGFtYWdlLnNvLjEuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhkYW1hZ2Uuc28uMS4xLjAgYi9zeXNyb290L3Vzci9saWIvbGliWGRhbWFnZS5zby4xLjEuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODUyMzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkYW1hZ2Uuc28uMS4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYgYi9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYmY0NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYKQEAgLTAsMCArMSBAQAorbGliWGRtY3Auc28uNi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGRtY3Auc28uNi4wIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYuMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iYmY0NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYuMApAQCAtMCwwICsxIEBACitsaWJYZG1jcC5zby42LjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZG1jcC5zby42LjAuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZG1jcC5zby42LjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQwYzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhkbWNwLnNvLjYuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvLjYgYi9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQ2NWY4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42CkBAIC0wLDAgKzEgQEAKK2xpYlhleHQuc28uNi40LjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42LjQgYi9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42LjQKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDY1ZjgwNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZXh0LnNvLjYuNApAQCAtMCwwICsxIEBACitsaWJYZXh0LnNvLjYuNC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNi40LjAgYi9zeXNyb290L3Vzci9saWIvbGliWGV4dC5zby42LjQuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTE4NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhleHQuc28uNi40LjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zIGIvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjkyN2RhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvLjMKQEAgLTAsMCArMSBAQAorbGliWGZpeGVzLnNvLjMuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zLjEgYi9zeXNyb290L3Vzci9saWIvbGliWGZpeGVzLnNvLjMuMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45MjdkYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zLjEKQEAgLTAsMCArMSBAQAorbGliWGZpeGVzLnNvLjMuMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlhmaXhlcy5zby4zLjEuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMy4xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNTIwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYZml4ZXMuc28uMy4xLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTk5MWZmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEKQEAgLTAsMCArMSBAQAorbGliWHhmODZ2bS5zby4xLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEuMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lOTkxZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYlh4Zjg2dm0uc28uMS4wCkBAIC0wLDAgKzEgQEAKK2xpYlh4Zjg2dm0uc28uMS4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliWHhmODZ2bS5zby4xLjAuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJYeGY4NnZtLnNvLjEuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTlmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliWHhmODZ2bS5zby4xLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYW5sLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwtMi43LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYW5sLTIuNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYW5sLmEgYi9zeXNyb290L3Vzci9saWIvbGliYW5sLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YTQwNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYW5sLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40ZjBjNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zbwpAQCAtMCwwICsxIEBACitsaWJhbmwuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhbmwuc28uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wZGZkOGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFubC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmFubC0yLjcuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLmEgYi9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiNjgzYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLmxhIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5sYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRhNjUyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5sYQpAQCAtMCwwICsxLDM1IEBACisjIGxpYmFzb3VuZC5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSBsaWJ0b29sIDEuNS4yNCBEZWJpYW4gMS41LjI0LTEgKDEuMTIyMC4yLjQ1NiAyMDA3LzA2LzI0IDAyOjI1OjMyKQorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9J2xpYmFzb3VuZC5zby4yJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9J2xpYmFzb3VuZC5zby4yLjAuMCBsaWJhc291bmQuc28uMiBsaWJhc291bmQuc28nCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9J2xpYmFzb3VuZC5hJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nIC1sbSAtbGRsIC1scHRocmVhZCcKKworIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBsaWJhc291bmQuCitjdXJyZW50PTIKK2FnZT0wCityZXZpc2lvbj0wCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz1ubworCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJworZGxwcmVvcGVuPScnCisKKyMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKK2xpYmRpcj0nL3Vzci9saWInCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40MmRmYzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zbwpAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNDJkZmM5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28uMgpAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhc291bmQuc28uMi4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQyZGZjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIuMApAQCAtMCwwICsxIEBACitsaWJhc291bmQuc28uMi4wLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXNvdW5kLnNvLjIuMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yLjAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U0M2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmFzb3VuZC5zby4yLjAuMApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLmEgYi9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiMmIyNwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhdWRpb2ZpbGUuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLmxhIGIvc3lzcm9vdC91c3IvbGliL2xpYmF1ZGlvZmlsZS5sYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZjOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmF1ZGlvZmlsZS5sYQpAQCAtMCwwICsxLDM1IEBACisjIGxpYmF1ZGlvZmlsZS5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGx0bWFpbi5zaCAtIEdOVSBsaWJ0b29sIDEuNS4yICgxLjEyMjAuMi42MCAyMDA0LzAxLzI1IDEyOjI1OjA4KSBEZWJpYW46IDE5MiAkCisjCisjIFBsZWFzZSBETyBOT1QgZGVsZXRlIHRoaXMgZmlsZSEKKyMgSXQgaXMgbmVjZXNzYXJ5IGZvciBsaW5raW5nIHRoZSBsaWJyYXJ5LgorCisjIFRoZSBuYW1lIHRoYXQgd2UgY2FuIGRsb3BlbigzKS4KK2RsbmFtZT0nbGliYXVkaW9maWxlLnNvLjAnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nbGliYXVkaW9maWxlLnNvLjAuMC4yIGxpYmF1ZGlvZmlsZS5zby4wIGxpYmF1ZGlvZmlsZS5zbycKKworIyBUaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFyY2hpdmUuCitvbGRfbGlicmFyeT0nbGliYXVkaW9maWxlLmEnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPScgLWxtJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmF1ZGlvZmlsZS4KK2N1cnJlbnQ9MAorYWdlPTAKK3JldmlzaW9uPTIKKworIyBJcyB0aGlzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGxpYnJhcnk/CitpbnN0YWxsZWQ9eWVzCisKKyMgU2hvdWxkIHdlIHdhcm4gYWJvdXQgcG9ydGFiaWxpdHkgd2hlbiBsaW5raW5nIGFnYWluc3QgLW1vZHVsZXM/CitzaG91bGRub3RsaW5rPW5vCisKKyMgRmlsZXMgdG8gZGxvcGVuL2RscHJlb3BlbgorZGxvcGVuPScnCitkbHByZW9wZW49JycKKworIyBEaXJlY3RvcnkgdGhhdCB0aGlzIGxpYnJhcnkgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIGluOgorbGliZGlyPScvdXNyL2xpYicKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJhdWRpb2ZpbGUuc28gYi9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjBmNDRjODAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYXVkaW9maWxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmF1ZGlvZmlsZS5zby4wLjAuMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJhdWRpb2ZpbGUuc28uMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYmF1ZGlvZmlsZS5zby4wLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGY0NGM4MAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJhdWRpb2ZpbGUuc28uMC4wCkBAIC0wLDAgKzEgQEAKK2xpYmF1ZGlvZmlsZS5zby4wLjAuMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJic2QtY29tcGF0LmEgYi9zeXNyb290L3Vzci9saWIvbGliYnNkLWNvbXBhdC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWNkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYnNkLWNvbXBhdC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjLTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDY3ZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmMtMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjLmEgYi9zeXNyb290L3Vzci9saWIvbGliYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjAyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliYy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmMuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMGQwOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjLnNvCkBAIC0wLDAgKzEsNSBAQAorLyogR05VIGxkIHNjcmlwdAorICAgVXNlIHRoZSBzaGFyZWQgbGlicmFyeSwgYnV0IHNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGluCisgICB0aGUgc3RhdGljIGxpYnJhcnksIHNvIHRyeSB0aGF0IHNlY29uZGFyaWx5LiAgKi8KK09VVFBVVF9GT1JNQVQoZWxmNjQteDg2LTY0KQorR1JPVVAgKCBsaWJjLnNvLjYgbGliY19ub25zaGFyZWQuYSAgQVNfTkVFREVEICggbGQtbGludXgteDg2LTY0LnNvLjIgKSApCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliYy5zby42IGIvc3lzcm9vdC91c3IvbGliL2xpYmMuc28uNgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xZDc3ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmMuc28uNgpAQCAtMCwwICsxIEBACitsaWJjLTIuNy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjX25vbnNoYXJlZC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmNfbm9uc2hhcmVkLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0ZjE4NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRmZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4tMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmNpZG4uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzBhMDFhNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvCkBAIC0wLDAgKzEgQEAKK2xpYmNpZG4uc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjaWRuLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGliY2lkbi5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdjYjA1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY2lkbi5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmNpZG4tMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NjRkZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC0yLjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LmEgYi9zeXNyb290L3Vzci9saWIvbGliY3J5cHQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdkZjMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNiMTFmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY3J5cHQuc28KQEAgLTAsMCArMSBAQAorbGliY3J5cHQuc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYmNyeXB0LnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjA1NTQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjcnlwdC5zby4xCkBAIC0wLDAgKzEgQEAKK2xpYmNyeXB0LTIuNy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjdXJzZXMuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJjdXJzZXMuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41NzQ1NjExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmN1cnNlcy5hCkBAIC0wLDAgKzEgQEAKK2xpYm5jdXJzZXMuYQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJjdXJzZXMuc28gYi9zeXNyb290L3Vzci9saWIvbGliY3Vyc2VzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3ZjhlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliY3Vyc2VzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5jdXJzZXMuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZGwtMi43LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmRsLTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJlMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmRsLTIuNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZGwuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczN2IyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZGwuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZGwuc28gYi9zeXNyb290L3Vzci9saWIvbGliZGwuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjkxZjE5OQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkbC5zbwpAQCAtMCwwICsxIEBACitsaWJkbC5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmRsLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGliZGwuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yM2FkODczCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmRsLnNvLjIKQEAgLTAsMCArMSBAQAorbGliZGwtMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjgxNWFkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZHJtLnNvLjIKQEAgLTAsMCArMSBAQAorbGliZHJtLnNvLjIuMy4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yLjMgYi9zeXNyb290L3Vzci9saWIvbGliZHJtLnNvLjIuMwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MTVhZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yLjMKQEAgLTAsMCArMSBAQAorbGliZHJtLnNvLjIuMy4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmRybS5zby4yLjMuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkcm0uc28uMi4zLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NjRmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJkcm0uc28uMi4zLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTYzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZXNkLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5sYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2QubGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxMGE3YQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2QubGEKQEAgLTAsMCArMSwzNSBAQAorIyBsaWJlc2QubGEgLSBhIGxpYnRvb2wgbGlicmFyeSBmaWxlCisjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgbGlidG9vbCAxLjUuMjIgKDEuMTIyMC4yLjM2NSAyMDA1LzEyLzE4IDIyOjE0OjA2KQorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9J2xpYmVzZC5zby4wJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9J2xpYmVzZC5zby4wLjIuMzggbGliZXNkLnNvLjAgbGliZXNkLnNvJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSdsaWJlc2QuYScKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JyAvdXNyL2xpYi9saWJhdWRpb2ZpbGUubGEgLWxtJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYmVzZC4KK2N1cnJlbnQ9MgorYWdlPTIKK3JldmlzaW9uPTM4CisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz1ubworCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJworZGxwcmVvcGVuPScnCisKKyMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKK2xpYmRpcj0nL3Vzci9saWInCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZXNkLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kNTdiMTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zbwpAQCAtMCwwICsxIEBACitsaWJlc2Quc28uMC4yLjM4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zby4wIGIvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmQ1N2IxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZXNkLnNvLjAKQEAgLTAsMCArMSBAQAorbGliZXNkLnNvLjAuMi4zOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2Quc28uMC4yIGIvc3lzcm9vdC91c3IvbGliL2xpYmVzZC5zby4wLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDU3YjE0YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2Quc28uMC4yCkBAIC0wLDAgKzEgQEAKK2xpYmVzZC5zby4wLjIuMzgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZXNkLnNvLjAuMi4zOCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJlc2Quc28uMC4yLjM4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTcxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZXNkLnNvLjAuMi4zOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZm9ybS5hIGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMxZDhhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjEwZTkxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zbwpAQCAtMCwwICsxIEBACitsaWJmb3JtLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGliZm9ybS5zby41IGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YTgwZjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28uNQpAQCAtMCwwICsxIEBACitsaWJmb3JtLnNvLjUuNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvLjUuNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJmb3JtLnNvLjUuNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYmZvcm0uc28uNS42CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJnLmEgYi9zeXNyb290L3Vzci9saWIvbGliZy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWNkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliZy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJpZWVlLmEgYi9zeXNyb290L3Vzci9saWIvbGliaWVlZS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDNhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGliaWVlZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJtLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThmZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm0tMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJtLmEgYi9zeXNyb290L3Vzci9saWIvbGlibS5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGYyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJtLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm0uc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzYwNzk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm0uc28uNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJtLnNvLjYgYi9zeXNyb290L3Vzci9saWIvbGlibS5zby42Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjk1MjYyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibS5zby42CkBAIC0wLDAgKzEgQEAKK2xpYm0tMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1jaGVjay5hIGIvc3lzcm9vdC91c3IvbGliL2xpYm1jaGVjay5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTAzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibWNoZWNrLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbXVzYWdlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm1lbXVzYWdlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDM5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibWVtdXNhZ2Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlNmNmMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28gYi9zeXNyb290L3Vzci9saWIvbGlibWVudS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iMTJiNWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28KQEAgLTAsMCArMSBAQAorbGlibWVudS5zby41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm1lbnUuc28uNSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODY5ZjRhNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUKQEAgLTAsMCArMSBAQAorbGlibWVudS5zby41LjYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibWVudS5zby41LjYgYi9zeXNyb290L3Vzci9saWIvbGlibWVudS5zby41LjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2YzBkOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJtZW51LnNvLjUuNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcysrLmEgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcysrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwZDIwOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzKysuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5hIGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzVhNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjcyNTdiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zbwpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibmN1cnNlcy5zby41IGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28uNQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jN2IxZTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28uNQpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLnNvLjUuNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvLjUuNiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuY3Vyc2VzLnNvLjUuNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjJmOTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5jdXJzZXMuc28uNS42CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wtMi43LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zbC0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlNzkzYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wtMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhiMDcyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc2wuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNsLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI4ZDE2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNsLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zbC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zbC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU5NTRkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNsLnNvLjEKQEAgLTAsMCArMSBAQAorbGlibnNsLTIuNy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDUyZjkwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQtMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19jb21wYXQuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjBmYTE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19jb21wYXQuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfY29tcGF0LnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQxOWRlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2NvbXBhdC5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19jb21wYXQtMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMtMi43LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMtMi43LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTQ0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy0yLjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2Rucy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi43ZDdhMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX2Rucy5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19kbnMuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTc1ZTdjMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZG5zLnNvLjIKQEAgLTAsMCArMSBAQAorbGlibnNzX2Rucy0yLjcuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMtMi43LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDhjODkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLTIuNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX2ZpbGVzLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yYjllMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zbwpAQCAtMCwwICsxIEBACitsaWJuc3NfZmlsZXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28uMiBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfZmlsZXMuc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44ZDAxNmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19maWxlcy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19maWxlcy0yLjcuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC0yLjcuc28gYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzYzhjZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLTIuNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfaGVzaW9kLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZkN2YxNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC5zbwpAQCAtMCwwICsxIEBACitsaWJuc3NfaGVzaW9kLnNvLjIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlibnNzX2hlc2lvZC5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2Quc28uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yZmE3YjVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19oZXNpb2Quc28uMgpAQCAtMCwwICsxIEBACitsaWJuc3NfaGVzaW9kLTIuNy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLTIuNy5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJkZGVjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMtMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTQwMzY1MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzLnNvLjIgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjIwYTE5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pcy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXMtMi43LnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLTIuNy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjOGViOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy0yLjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJhNjE4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlibnNzX25pc3BsdXMuc28KQEAgLTAsMCArMSBAQAorbGlibnNzX25pc3BsdXMuc28uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xpYm5zc19uaXNwbHVzLnNvLjIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDkzYjNjYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJuc3NfbmlzcGx1cy5zby4yCkBAIC0wLDAgKzEgQEAKK2xpYm5zc19uaXNwbHVzLTIuNy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiOGQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNWNkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnBhbmVsLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28uNSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwYW5lbC5zby41Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZmMmU4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28uNQpAQCAtMCwwICsxIEBACitsaWJwYW5lbC5zby41LjYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicGFuZWwuc28uNS42IGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvLjUuNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI5Y2RlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnBhbmVsLnNvLjUuNgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicGNwcm9maWxlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnBjcHJvZmlsZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdmNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnBjcHJvZmlsZS5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC0yLjcuc28gYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmUyOTAzMwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLTIuNy5zbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2EzOWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMmNlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZC5zbwpAQCAtMCwwICsxLDUgQEAKKy8qIEdOVSBsZCBzY3JpcHQKKyAgIFVzZSB0aGUgc2hhcmVkIGxpYnJhcnksIGJ1dCBzb21lIGZ1bmN0aW9ucyBhcmUgb25seSBpbgorICAgdGhlIHN0YXRpYyBsaWJyYXJ5LCBzbyB0cnkgdGhhdCBzZWNvbmRhcmlseS4gICovCitPVVRQVVRfRk9STUFUKGVsZjY0LXg4Ni02NCkKK0dST1VQICggbGlicHRocmVhZC5zby4wIGxpYnB0aHJlYWRfbm9uc2hhcmVkLmEgKQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB0aHJlYWQuc28uMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLnNvLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWNkNTg1MwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHRocmVhZC0yLjcuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZF9ub25zaGFyZWQuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdGhyZWFkX25vbnNoYXJlZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTUyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHRocmVhZF9ub25zaGFyZWQuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtYnJvd3NlLmEgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtYnJvd3NlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmM2IwNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1icm93c2UuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtYnJvd3NlLnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLWJyb3dzZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45NzQxMWIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLWJyb3dzZS5zbwpAQCAtMCwwICsxIEBACitsaWJwdWxzZS1icm93c2Uuc28uMC4xLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtYnJvd3NlLnNvLjAuMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1icm93c2Uuc28uMC4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjk3NDExYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtYnJvd3NlLnNvLjAuMQpAQCAtMCwwICsxIEBACitsaWJwdWxzZS1icm93c2Uuc28uMC4xLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE1ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1tYWlubG9vcC1nbGliLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVkNTY3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zbwpAQCAtMCwwICsxIEBACitsaWJwdWxzZS1tYWlubG9vcC1nbGliLnNvLjAuMC4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuc28uMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLW1haW5sb29wLWdsaWIuc28uMC4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVkNTY3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zby4wLjAKQEAgLTAsMCArMSBAQAorbGlicHVsc2UtbWFpbmxvb3AtZ2xpYi5zby4wLjAuMwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUyZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28gYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmQwN2I0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kMDdiNGMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLXNpbXBsZS5zby4wLjAKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDA3YjRjMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMC4wCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLXNpbXBsZS5zby4wLjAuMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS1zaW1wbGUuc28uMC4wLjEgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZWMzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Utc2ltcGxlLnNvLjAuMC4xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViOGZkNQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNTNjOTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnB1bHNlLnNvLjAuNC4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAgYi9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNTNjOTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAKQEAgLTAsMCArMSBAQAorbGlicHVsc2Uuc28uMC40LjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicHVsc2Uuc28uMC40IGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAuNApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNTNjOTYyCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAuNApAQCAtMCwwICsxIEBACitsaWJwdWxzZS5zby4wLjQuMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zby4wLjQuMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJwdWxzZS5zby4wLjQuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTE3ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnB1bHNlLnNvLjAuNC4xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYtMi43LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi0yLjcuc28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwY2Y3MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYtMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgzZTQwCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJyZXNvbHYuc28gYi9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJmNmMxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LnNvCkBAIC0wLDAgKzEgQEAKK2xpYnJlc29sdi5zby4yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5zby4yIGIvc3lzcm9vdC91c3IvbGliL2xpYnJlc29sdi5zby4yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU2YmVmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicmVzb2x2LnNvLjIKQEAgLTAsMCArMSBAQAorbGlicmVzb2x2LTIuNy5zbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJycGNzdmMuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJycGNzdmMuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmU4NWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnJwY3N2Yy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJydC0yLjcuc28gYi9zeXNyb290L3Vzci9saWIvbGlicnQtMi43LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjE3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicnQtMi43LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnJ0LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmZDBiOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wODIwZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnJ0LnNvCkBAIC0wLDAgKzEgQEAKK2xpYnJ0LnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlicnQuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJydC5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjJkN2U5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlicnQuc28uMQpAQCAtMCwwICsxIEBACitsaWJydC0yLjcuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidGVybWNhcC5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuYQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41NzQ1NjExCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnRlcm1jYXAuYQpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidGVybWNhcC5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0ZXJtY2FwLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3ZjhlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGVybWNhcC5zbwpAQCAtMCwwICsxIEBACitsaWJuY3Vyc2VzLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi0xLjAuc28gYi9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLTEuMC5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjljNzEzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi0xLjAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRocmVhZF9kYi5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzkxOTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28KQEAgLTAsMCArMSBAQAorbGlidGhyZWFkX2RiLnNvLjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEgYi9zeXNyb290L3Vzci9saWIvbGlidGhyZWFkX2RiLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYmM1MjUxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aHJlYWRfZGIuc28uMQpAQCAtMCwwICsxIEBACitsaWJ0aHJlYWRfZGItMS4wLnNvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5hIGIvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWE5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidGljLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zbyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjI4YzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28KQEAgLTAsMCArMSBAQAorbGlidGljLnNvLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUgYi9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWMwMzMxNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ0aWMuc28uNQpAQCAtMCwwICsxIEBACitsaWJ0aWMuc28uNS42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41LjYgYi9zeXNyb290L3Vzci9saWIvbGlidGljLnNvLjUuNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkzYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnRpYy5zby41LjYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwtMi43LnNvIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwtMi43LnNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTQ3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlidXRpbC0yLjcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwYTM4MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuc28gYi9zeXNyb290L3Vzci9saWIvbGlidXRpbC5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iM2FmNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuc28KQEAgLTAsMCArMSBAQAorbGlidXRpbC5zby4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnV0aWwuc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uN2FhZDIzMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ1dGlsLnNvLjEKQEAgLTAsMCArMSBAQAorbGlidXRpbC0yLjcuc28KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvbGlieGNiLXhsaWIuc28uMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2IteGxpYi5zby4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY3MDM3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLXhsaWIuc28uMApAQCAtMCwwICsxIEBACitsaWJ4Y2IteGxpYi5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2IteGxpYi5zby4wLjAgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLXhsaWIuc28uMC4wCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY3MDM3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLXhsaWIuc28uMC4wCkBAIC0wLDAgKzEgQEAKK2xpYnhjYi14bGliLnNvLjAuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnhjYi14bGliLnNvLjAuMC4wIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi14bGliLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZWU4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLXhsaWIuc28uMC4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjA3NmY2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEKQEAgLTAsMCArMSBAQAorbGlieGNiLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xLjAgYi9zeXNyb290L3Vzci9saWIvbGlieGNiLnNvLjEuMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wNzZmNjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xLjAKQEAgLTAsMCArMSBAQAorbGlieGNiLnNvLjEuMC4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnhjYi5zby4xLjAuMCBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28uMS4wLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0ZDBmOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ4Y2Iuc28uMS4wLjAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnouYSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MDBlOAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnouc28gYi9zeXNyb290L3Vzci9saWIvbGliei5zbwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xMjdkYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnouc28KQEAgLTAsMCArMSBAQAorbGliei5zby4xLjIuMy4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMSBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTI3ZGIzNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvLjEKQEAgLTAsMCArMSBAQAorbGliei5zby4xLjIuMy4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMS4yLjMgYi9zeXNyb290L3Vzci9saWIvbGliei5zby4xLjIuMwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xMjdkYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMS4yLjMKQEAgLTAsMCArMSBAQAorbGliei5zby4xLjIuMy4zClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL2xpYnouc28uMS4yLjMuMyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvLjEuMi4zLjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4MTUyYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9saWJ6LnNvLjEuMi4zLjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9hbHNhLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9hbHNhLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjE5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Fsc2EucGMKQEAgLTAsMCArMSwxNCBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PS91c3IKK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogYWxzYQorRGVzY3JpcHRpb246IEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZSAoQUxTQSkgLSBMaWJyYXJ5CitWZXJzaW9uOiAxLjAuMTUKK1JlcXVpcmVzOiAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sYXNvdW5kCitMaWJzLnByaXZhdGU6IC1sbSAtbGRsIC1scHRocmVhZAorIyAtSSR7aW5jbHVkZWRpcn0vYWxzYSBiZWxvdyBpcyBqdXN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisjIChpdCB3YXMgc2V0IHNvIG1pc3Rha2VseSBpbiB0aGUgb2xkZXIgdmVyc2lvbikKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9IC1JJHtpbmNsdWRlZGlyfS9hbHNhCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvYXVkaW9maWxlLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MWU0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2F1ZGlvZmlsZS5wYwpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGF1ZGlvZmlsZQorRGVzY3JpcHRpb246IGF1ZGlvZmlsZQorUmVxdWlyZXM6CitWZXJzaW9uOiAwLjIuNgorTGliczogLUwke2xpYmRpcn0gLWxhdWRpb2ZpbGUKK0xpYnMucHJpdmF0ZTogLWxtCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9lc291bmQucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2Vzb3VuZC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWI4NGRhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9lc291bmQucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorZXNkX3NlcnZlcmRpcj0ke3ByZWZpeH0vYmluCisKK05hbWU6IGVzb3VuZAorRGVzY3JpcHRpb246IGVzb3VuZAorUmVxdWlyZXM6IGF1ZGlvZmlsZQorVmVyc2lvbjogMC4yLjM4CitMaWJzOiAtTCR7bGliZGlyfSAtbGVzZCAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2lucHV0cHJvdG8ucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2lucHV0cHJvdG8ucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0NjU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvaW5wdXRwcm90by5wYwpAQCAtMCwwICsxLDkgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKyAKK05hbWU6IElucHV0UHJvdG8KK0Rlc2NyaXB0aW9uOiBJbnB1dCBleHRlbnNpb24gaGVhZGVycworVmVyc2lvbjogMS40LjIKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2ticHJvdG8ucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2ticHJvdG8ucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlMjhlZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcva2Jwcm90by5wYwpAQCAtMCwwICsxLDkgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKyAKK05hbWU6IEtCUHJvdG8KK0Rlc2NyaXB0aW9uOiBLQiBleHRlbnNpb24gaGVhZGVycworVmVyc2lvbjogMS4wLjMKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLWJyb3dzZS5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UtYnJvd3NlLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNDljZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLWJyb3dzZS5wYwpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK05hbWU6IGxpYnB1bHNlLWJyb3dzZQorRGVzY3JpcHRpb246IFB1bHNlQXVkaW8gTmV0d29yayBCcm93c2luZyBBUEkKK1ZlcnNpb246IDAuOS4xMAorTGliczogLUwke2xpYmRpcn0gLWxwdWxzZS1icm93c2UgCitDZmxhZ3M6IC1EX1JFRU5UUkFOVCAtSSR7aW5jbHVkZWRpcn0KK1JlcXVpcmVzOiBsaWJwdWxzZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS1tYWlubG9vcC1nbGliLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS1tYWlubG9vcC1nbGliLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOGIwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL2xpYnB1bHNlLW1haW5sb29wLWdsaWIucGMKQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBsaWJwdWxzZS1tYWlubG9vcC1nbGliCitEZXNjcmlwdGlvbjogR0xJQiAyLjAgTWFpbiBMb29wIFdyYXBwZXIgZm9yIFB1bHNlQXVkaW8KK1ZlcnNpb246IDAuOS4xMAorTGliczogLUwke2xpYmRpcn0gLWxwdWxzZS1tYWlubG9vcC1nbGliIAorQ2ZsYWdzOiAtRF9SRUVOVFJBTlQgLUkke2luY2x1ZGVkaXJ9CitSZXF1aXJlczogbGlicHVsc2UgZ2xpYi0yLjAKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2Utc2ltcGxlLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS1zaW1wbGUucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzMTUzMAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2Utc2ltcGxlLnBjCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogbGlicHVsc2Utc2ltcGxlCitEZXNjcmlwdGlvbjogU2ltcGxpZmllZCBTeW5jaHJvbm91cyBDbGllbnQgSW50ZXJmYWNlIHRvIFB1bHNlQXVkaW8KK1ZlcnNpb246IDAuOS4xMAorTGliczogLUwke2xpYmRpcn0gLWxwdWxzZS1zaW1wbGUgCitDZmxhZ3M6IC1EX1JFRU5UUkFOVCAtSSR7aW5jbHVkZWRpcn0KK1JlcXVpcmVzOiBsaWJwdWxzZQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy9saWJwdWxzZS5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0MWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcvbGlicHVsc2UucGMKQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBsaWJwdWxzZQorRGVzY3JpcHRpb246IENsaWVudCBJbnRlcmZhY2UgdG8gUHVsc2VBdWRpbworVmVyc2lvbjogMC45LjEwCitMaWJzOiAtTCR7bGliZGlyfSAtbHB1bHNlIAorQ2ZsYWdzOiAtRF9SRUVOVFJBTlQgLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3gxMS5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveDExLnBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTMyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3gxMS5wYwpAQCAtMCwwICsxLDE1IEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisKK3h0aHJlYWRsaWI9LWxwdGhyZWFkCisKK05hbWU6IFgxMQorRGVzY3JpcHRpb246IFggTGlicmFyeQorVmVyc2lvbjogMS4xLjMKK1JlcXVpcmVzOiB4cHJvdG8ga2Jwcm90bworUmVxdWlyZXMucHJpdmF0ZTogeGF1IHhkbWNwIHhjYi14bGliCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfSAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWDExCitMaWJzLnByaXZhdGU6IC1scHRocmVhZApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94ZXh0cHJvdG8ucGMgYi9zeXNyb290L3Vzci9saWIvcGtnY29uZmlnL3hleHRwcm90by5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMwY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94ZXh0cHJvdG8ucGMKQEAgLTAsMCArMSw5IEBACitwcmVmaXg9L3VzcgorZXhlY19wcmVmaXg9JHtwcmVmaXh9CitsaWJkaXI9JHtleGVjX3ByZWZpeH0vbGliCitpbmNsdWRlZGlyPSR7cHJlZml4fS9pbmNsdWRlCisgCitOYW1lOiBYRXh0UHJvdG8KK0Rlc2NyaXB0aW9uOiBYRXh0IGV4dGVuc2lvbiBoZWFkZXJzCitWZXJzaW9uOiA3LjAuMgorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveHByb3RvLnBjIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94cHJvdG8ucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveHByb3RvLnBjCkBAIC0wLDAgKzEsMTAgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKK2luY2x1ZGV4MTFkaXI9JHtwcmVmaXh9L2luY2x1ZGUvWDExCisgCitOYW1lOiBYcHJvdG8KK0Rlc2NyaXB0aW9uOiBYcHJvdG8gaGVhZGVycworVmVyc2lvbjogNy4wLjExCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliL3B0X2Nob3duIGIvc3lzcm9vdC91c3IvbGliL3B0X2Nob3duCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhNjU5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9saWIvcHRfY2hvd24KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtX0xpc3Rfbm9kZV9iYXNlLXVzZXMtb2xkLWNvbXBhdGlibGUtaW1wbGVtZW50YXRpb24tdG8tYXZvaWQtR0xJQkNYWF8zLjQuMTUucGF0Y2ggYi90b29sY2hhaW4tcGF0Y2hlcy9nY2MvMDAwMS1fTGlzdF9ub2RlX2Jhc2UtdXNlcy1vbGQtY29tcGF0aWJsZS1pbXBsZW1lbnRhdGlvbi10by1hdm9pZC1HTElCQ1hYXzMuNC4xNS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QxZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtX0xpc3Rfbm9kZV9iYXNlLXVzZXMtb2xkLWNvbXBhdGlibGUtaW1wbGVtZW50YXRpb24tdG8tYXZvaWQtR0xJQkNYWF8zLjQuMTUucGF0Y2gKQEAgLTAsMCArMSwyNTEgQEAKK2RpZmYgLU5hdXIgYS9nY2MtNC42L2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvY29tcGF0aWJpbGl0eS1saXN0LmggYi9nY2MtNC42L2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvY29tcGF0aWJpbGl0eS1saXN0LmgKKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9jb21wYXRpYmlsaXR5LWxpc3QuaAkxOTY5LTEyLTMxIDE2OjAwOjAwLjAwMDAwMDAwMCAtMDgwMAorKysrIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2NvbXBhdGliaWxpdHktbGlzdC5oCTIwMTItMDMtMDkgMTM6Mjk6NTkuNjY2Njg4MDAxIC0wODAwCitAQCAtMCwwICsxLDU5IEBACisrLy8gQ29tcGF0aWJpbGl0eSBzeW1ib2xzIGZvciBwcmV2aW91cyB2ZXJzaW9ucywgbGlzdCBiaXRzIC0qLSBDKysgLSotCisrCisrLy8gQ29weXJpZ2h0IChDKSAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKy8vCisrLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisrLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisrLy8gYW55IGxhdGVyIHZlcnNpb24uCisrCisrLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysKKysvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKysvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisrLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKysKKysvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKysvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKysKKysjaWZuZGVmIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT01QQVQKKysjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09NUEFUCisrI2VuZGlmCisrI2lmbmRlZiBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTVBBVAorKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09NUEFUCisrI2VuZGlmCisrCisrbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCisreworK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT01QQVQKKysKKysgIHN0cnVjdCBfTGlzdF9ub2RlX2Jhc2UKKysgIHsKKysgICAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworKyAgICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7CisrCisrICAgIHN0YXRpYyB2b2lkCisrICAgIHN3YXAoX0xpc3Rfbm9kZV9iYXNlJiBfX3gsIF9MaXN0X25vZGVfYmFzZSYgX195KSB0aHJvdyAoKTsKKysgICAgdm9pZAorKyAgICB0cmFuc2ZlcihfTGlzdF9ub2RlX2Jhc2UgKiBjb25zdCBfX2ZpcnN0LAorKwkJX0xpc3Rfbm9kZV9iYXNlICogY29uc3QgX19sYXN0KSB0aHJvdyAoKTsKKysKKysgICAgdm9pZAorKyAgICByZXZlcnNlKCkgdGhyb3cgKCk7CisrCisrICAgIHZvaWQKKysgICAgaG9vayhfTGlzdF9ub2RlX2Jhc2UgKiBjb25zdCBfX3Bvc2l0aW9uKSB0aHJvdyAoKTsKKysKKysgICAgdm9pZAorKyAgICB1bmhvb2soKSB0aHJvdyAoKTsKKysgIH07CisrCisrX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT01QQVQKKysKKyt9IC8vIG5hbWVzcGFjZSBzdGQKK2RpZmYgLU5hdXIgYS9nY2MtNC42L2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvc3RsX2xpc3QuaCBiL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9zdGxfbGlzdC5oCistLS0gYS9nY2MtNC42L2xpYnN0ZGMrKy12My9pbmNsdWRlL2JpdHMvc3RsX2xpc3QuaAkyMDEyLTAzLTA3IDEzOjIwOjEwLjQzMjgwMzQzMCAtMDgwMAorKysrIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL3N0bF9saXN0LmgJMjAxMi0wMy0wOSAxMzo1MDoxNi40OTQyNTgxNjEgLTA4MDAKK0BAIC01OSw2ICs1OSw3IEBACisgCisgI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorICNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorKyNpbmNsdWRlIDxiaXRzL2NvbXBhdGliaWxpdHktbGlzdC5oPgorIAorIG5hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQorIHsKK0BAIC03OSwyMCArODAsMzkgQEAKKyAgICAgICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7CisgICAgICAgCisgICAgICAgc3RhdGljIHZvaWQKKy0gICAgICBzd2FwKF9MaXN0X25vZGVfYmFzZSYgX194LCBfTGlzdF9ub2RlX2Jhc2UmIF9feSkgdGhyb3cgKCk7CistICAgICAgCisrICAgICAgc3dhcChfTGlzdF9ub2RlX2Jhc2UmIF9feCwgX0xpc3Rfbm9kZV9iYXNlJiBfX3kpIHRocm93ICgpCisrICAgICAgeworKyAgICAgICAgc3RkOjpfTGlzdF9ub2RlX2Jhc2U6OnN3YXAocmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAmPihfX3gpLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAmPihfX3kpKTsKKysgICAgICB9CisrCisgICAgICAgdm9pZAorICAgICAgIF9NX3RyYW5zZmVyKF9MaXN0X25vZGVfYmFzZSogY29uc3QgX19maXJzdCwKKy0JCSAgX0xpc3Rfbm9kZV9iYXNlKiBjb25zdCBfX2xhc3QpIHRocm93ICgpOworKwkJICBfTGlzdF9ub2RlX2Jhc2UqIGNvbnN0IF9fbGFzdCkgdGhyb3cgKCkKKysgICAgICB7CisrICAgICAgICAocmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAqPih0aGlzKSktPnRyYW5zZmVyKAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICogY29uc3Q+KF9fZmlyc3QpLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICogY29uc3Q+KF9fbGFzdCkpOworKyAgICAgIH0KKyAgICAgICAKKyAgICAgICB2b2lkCistICAgICAgX01fcmV2ZXJzZSgpIHRocm93ICgpOworKyAgICAgIF9NX3JldmVyc2UoKSB0aHJvdyAoKQorKyAgICAgIHsKKysgICAgICAgIChyZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICo+KHRoaXMpKS0+cmV2ZXJzZSgpOworKyAgICAgIH0KKyAgICAgICAKKyAgICAgICB2b2lkCistICAgICAgX01faG9vayhfTGlzdF9ub2RlX2Jhc2UqIGNvbnN0IF9fcG9zaXRpb24pIHRocm93ICgpOworKyAgICAgIF9NX2hvb2soX0xpc3Rfbm9kZV9iYXNlKiBjb25zdCBfX3Bvc2l0aW9uKSB0aHJvdyAoKQorKyAgICAgIHsKKysgICAgICAgIChyZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICo+KHRoaXMpKS0+aG9vaygKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAqIGNvbnN0PihfX3Bvc2l0aW9uKSk7CisrICAgICAgfQorICAgICAgIAorICAgICAgIHZvaWQKKy0gICAgICBfTV91bmhvb2soKSB0aHJvdyAoKTsKKysgICAgICBfTV91bmhvb2soKSB0aHJvdyAoKQorKyAgICAgIHsKKysgICAgICAgIChyZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICo+KHRoaXMpKS0+dW5ob29rKCk7CisrICAgICAgfQorICAgICB9OworIAorICAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCitkaWZmIC1OYXVyIGEvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9NYWtlZmlsZS5hbSBiL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvTWFrZWZpbGUuYW0KKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvTWFrZWZpbGUuYW0JMjAxMi0wMy0wNyAxMzoyMDoxMC40MTI4MDMxODIgLTA4MDAKKysrKyBiL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvTWFrZWZpbGUuYW0JMjAxMi0wMy0wOSAxNDo0MDowNy42NDk2NzQ0NzYgLTA4MDAKK0BAIC0xNDgsNiArMTQ4LDcgQEAKKyAJJHtiaXRzX3NyY2Rpcn0vc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaCBcCisgCSR7Yml0c19zcmNkaXJ9L3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmggXAorIAkke2JpdHNfc3JjZGlyfS9zdGxfbGlzdC5oIFwKKysJJHtiaXRzX3NyY2Rpcn0vY29tcGF0aWJpbGl0eS1saXN0LmggXAorIAkke2JpdHNfc3JjZGlyfS9zdGxfbWFwLmggXAorIAkke2JpdHNfc3JjZGlyfS9zdGxfbXVsdGltYXAuaCBcCisgCSR7Yml0c19zcmNkaXJ9L3N0bF9tdWx0aXNldC5oIFwKK2RpZmYgLU5hdXIgYS9nY2MtNC42L2xpYnN0ZGMrKy12My9pbmNsdWRlL01ha2VmaWxlLmluIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9NYWtlZmlsZS5pbgorLS0tIGEvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9NYWtlZmlsZS5pbgkyMDEyLTAzLTA3IDEzOjIwOjEwLjQxMjgwMzE4MiAtMDgwMAorKysrIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9NYWtlZmlsZS5pbgkyMDEyLTAzLTA5IDE0OjQwOjUwLjAwMDMxMjU4MyAtMDgwMAorQEAgLTM5OSw2ICszOTksNyBAQAorIAkke2JpdHNfc3JjZGlyfS9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oIFwKKyAJJHtiaXRzX3NyY2Rpcn0vc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaCBcCisgCSR7Yml0c19zcmNkaXJ9L3N0bF9saXN0LmggXAorKwkke2JpdHNfc3JjZGlyfS9jb21wYXRpYmlsaXR5LWxpc3QuaCBcCisgCSR7Yml0c19zcmNkaXJ9L3N0bF9tYXAuaCBcCisgCSR7Yml0c19zcmNkaXJ9L3N0bF9tdWx0aW1hcC5oIFwKKyAJJHtiaXRzX3NyY2Rpcn0vc3RsX211bHRpc2V0LmggXAorZGlmZiAtTmF1ciBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9jb21wYXRpYmlsaXR5LWxpc3QuY2MgYi9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvY29tcGF0aWJpbGl0eS1saXN0LmNjCistLS0gYS9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvY29tcGF0aWJpbGl0eS1saXN0LmNjCTIwMTItMDMtMDcgMTM6MjA6MTAuNTAyODA0MzA1IC0wODAwCisrKysgYi9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvY29tcGF0aWJpbGl0eS1saXN0LmNjCTIwMTItMDMtMDkgMTM6NDM6MDAuOTY3OTUyNTUyIC0wODAwCitAQCAtMjMsNDEgKzIzLDEyIEBACisgLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIAorICNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKy0KKy0jaWZuZGVmIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT01QQVQKKy0jIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09NUEFUCistI2VuZGlmCistCistI2lmbmRlZiBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTVBBVAorLSMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09NUEFUCistI2VuZGlmCisrI2luY2x1ZGUgPGJpdHMvY29tcGF0aWJpbGl0eS1saXN0Lmg+CisgCisgbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCisgeworIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT01QQVQKKyAKKy0gIHN0cnVjdCBfTGlzdF9ub2RlX2Jhc2UKKy0gIHsKKy0gICAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworLSAgICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7CistCistICAgIHN0YXRpYyB2b2lkCistICAgIHN3YXAoX0xpc3Rfbm9kZV9iYXNlJiBfX3gsIF9MaXN0X25vZGVfYmFzZSYgX195KSB0aHJvdyAoKTsKKy0KKy0gICAgdm9pZAorLSAgICB0cmFuc2ZlcihfTGlzdF9ub2RlX2Jhc2UgKiBjb25zdCBfX2ZpcnN0LAorLQkgICAgIF9MaXN0X25vZGVfYmFzZSAqIGNvbnN0IF9fbGFzdCkgdGhyb3cgKCk7CistCistICAgIHZvaWQKKy0gICAgcmV2ZXJzZSgpIHRocm93ICgpOworLQorLSAgICB2b2lkCistICAgIGhvb2soX0xpc3Rfbm9kZV9iYXNlICogY29uc3QgX19wb3NpdGlvbikgdGhyb3cgKCk7CistCistICAgIHZvaWQKKy0gICAgdW5ob29rKCkgdGhyb3cgKCk7CistICB9OworLQorICAgdm9pZAorICAgX0xpc3Rfbm9kZV9iYXNlOjpzd2FwKF9MaXN0X25vZGVfYmFzZSYgX194LCBfTGlzdF9ub2RlX2Jhc2UmIF9feSkgdGhyb3coKQorICAgeworZGlmZiAtTmF1ciBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9saXN0LmNjIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL2xpc3QuY2MKKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9saXN0LmNjCTIwMTItMDMtMDcgMTM6MjA6MTAuNTEyODA0NDMwIC0wODAwCisrKysgYi9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvbGlzdC5jYwkyMDEyLTAzLTA5IDEzOjU3OjU4LjE0MTIyNDUyMCAtMDgwMAorQEAgLTU2LDYgKzU2LDUwIEBACisgICB7CisgICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorIAorKyNpZiAwCisrCisrLyoKKysgIFRoZSBmb2xsb3dpbmcgbWVtYmVyIGZ1bmN0aW9ucyBhcmUgcmVtb3ZlZCB0byBhdm9pZCBkZXBlbmRlbmNpZXMgb24gbW9yZQorKyAgcmVjZW50IGxpYnN0ZGMrKy4KKysKKysgIFNlZSBodHRwOi8vZ2xhbmRpdW0ub3JnL2Jsb2cvP3A9MTkwMSBmb3Igc2ltaWxpYXIgc2l0dWF0aW9uIGluIEdDQyA0LjUuCisrCisrICBJbiBzaG9ydCwgZXhlY3V0YWJsZSBjb21waWxlZCBieSBHQ0MgNC42IG1heSBub3QgcnVuIG9uIHN5c3RlbSB3aXRoCisrICBsaWJzdGRjKysgY29tZXMgd2l0aCBHQ0MgNC40LiBGb3IgZXhhbXBsZSwgCisrCisrICAjaW5jbHVkZSA8bGlzdD4KKysgIGludCBtYWluKCkgCisrICB7CisrICAgICBzdGQ6Omxpc3Q8aW50PiBsOworKyAgICAgbC5wdXNoX2JhY2soNDIpOworKyAgICAgcmV0dXJuIDA7CisrICB9CisrCisrICBUaGUgYWJvdmUgY29kZSBjb21waWxlZCBieSBHQ0MgNC42IG1heSBydW4gaW50byBlcnJvciBtZXNzYWdlIHJlYWRzCisrCisrICAgIC4vYS5vdXQ6IC91c3IvbGliMzIvbGlic3RkYysrLnNvLjY6IHZlcnNpb24gR0xJQkNYWF8zLjQuMTUnIG5vdCBmb3VuZCAocmVxdWlyZWQgYnkgLi9hLm91dCkgCisrCisrICBUaGUgcmVhc29uIGlzIHRoYXQgc3RkOjpsaXN0PGluaXQ+OjpwdXNoX2JhY2soaW50ICYpIGNhbGxzIF9NX2luc2VydCgpCisrICB3aGljaCBpbiB0dXJucyBjYWxscyBfTV9ob29rKCkgaW4gdGhlIGdjYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9zdGxfbGlzdC5oCisrICBpbnN0ZWFkIG9mIF9ob29rKCkgaW4gZ2NjLTQuNC4zJ3MgY291bnRlcnBhcnQuICBfTV9ob29rKCkgaXMgYW5ub3RhdGVkCisrICB3aXRoIHZlcnNpb24gR0xJQkNYWF8zLjQuMTUsIGFuZCB0aGF0J3Mgd2h5IHJ1bm5pbmcgdGhlIGFib3ZlIGEub3V0IG9uCisrICBzeXN0ZW0gd2l0aCBsaWJzdGRjKysgYnVpbHQgZnJvbSA8PSBHQ0MgNC40IHdpbGwgZmFpbC4KKysKKysgIEl0J3Mgbm90IHByYWN0aWNhbCB0byBhc2sgYWxsIGN1c3RvbWVycyB0byB1cGRhdGUgdGhlaXIgbGlic3RkYysrLgorKyAgdCdzIG5vdCBlYXN5IHRvIGNvbXBpbGUgb2xkIDQuNC4zIGxpYnN0ZCsrIHdpdGggR0NDIDQuNiwgZWl0aGVyLgorKyAgKE5PVEU6IGxpYnN0ZGMrKyBpcyByZWxlYXNlZCBhcyBwYXJ0IG9mIEdDQywgc28gdGhlcmUgbWF5IGJlIHN0cm9uZyB0aWUKKysgIGluIGJldHdlZW4pCisrCisrICBMdWNraWx5IChhbmQgY291cmlvdXNseSksIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBfTGlzdF9ub2RlX2Jhc2UgZG9lc24ndAorKyAgY2hhbmdlIChleGNlcHQgZm9yIGFkZGluZyAidGhyb3coKSIgaGludCBmb3IgY29tcGlsZXIgb3B0aW1pemF0aW9uKSBpbgorKyAgZGVzcGl0ZSBvZiB0aGUgbmFtZSBjaGFuZ2VzICh3aXRoIG5ldyBwcmVmaXggX01fIGluIEdDQyA0LjUgYW5kIEdDQyA0LjYsCisrICBzZWUgZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL2xpc3QuY2MpLiAgU28sIGhlcmUgZ29lcyB0aGUgd29ya2Fyb3VuZDoKKysKKysgICAgMS4gUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWVtYmVyIGZ1bmN0aW9ucyBpbXBsZW1lbnRhdGlvbnMuCisrICAgIDIuIEluIGJpdHMvc3RsX2xpc3QuaCwgdGhlc2UgZnVuY3Rpb25zIGNhbGwgdG8gdGhlaXIgY291bnRlcnBhcnRzIGluCisrICAgICAgIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGllLiBvbGQgZnVuY3Rpb25zIHcvbyBfTV8gcHJlZml4KQorKyovCisrCisgICAgIHZvaWQKKyAgICAgX0xpc3Rfbm9kZV9iYXNlOjpzd2FwKF9MaXN0X25vZGVfYmFzZSYgX194LCBfTGlzdF9ub2RlX2Jhc2UmIF9feSkgdGhyb3coKQorICAgICB7CitAQCAtMTM5LDYgKzE4Myw4IEBACisgICAgICAgX19uZXh0X25vZGUtPl9NX3ByZXYgPSBfX3ByZXZfbm9kZTsKKyAgICAgfQorIAorKyNlbmRpZiAvLyAwCisrCisgICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgIH0gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCisgfSAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS90b29sY2hhaW4tcGF0Y2hlcy9nY2MvMDAwMS1tb3ZlLWN0eXBlX2NoYXJfTV93aWRlbl9pbml0LWJhY2stdG8taGVhZGVyLXRvLWF2b2lkLUdMSUJDWFhfMy40LjExLnBhdGNoIGIvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtbW92ZS1jdHlwZV9jaGFyX01fd2lkZW5faW5pdC1iYWNrLXRvLWhlYWRlci10by1hdm9pZC1HTElCQ1hYXzMuNC4xMS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGViNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbGNoYWluLXBhdGNoZXMvZ2NjLzAwMDEtbW92ZS1jdHlwZV9jaGFyX01fd2lkZW5faW5pdC1iYWNrLXRvLWhlYWRlci10by1hdm9pZC1HTElCQ1hYXzMuNC4xMS5wYXRjaApAQCAtMCwwICsxLDU3IEBACitkaWZmIC1OYXVyIGEvZ2NjLTQuNi9saWJzdGRjKystdjMvaW5jbHVkZS9iaXRzL2xvY2FsZV9mYWNldHMuaCBiL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9sb2NhbGVfZmFjZXRzLmgKKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9sb2NhbGVfZmFjZXRzLmgJMjAxMi0wMy0wNyAxMzoyMDoxMC40MjI4MDMzMDYgLTA4MDAKKysrKyBiL2djYy00LjYvbGlic3RkYysrLXYzL2luY2x1ZGUvYml0cy9sb2NhbGVfZmFjZXRzLmgJMjAxMi0wMy0wOSAxNDoxMjoyNS4wMDQ0OTQwMTkgLTA4MDAKK0BAIC0xMTU3LDcgKzExNTcsMjAgQEAKKyAKKyAgICAgcHJpdmF0ZToKKyAgICAgICB2b2lkIF9NX25hcnJvd19pbml0KCkgY29uc3Q7CistICAgICAgdm9pZCBfTV93aWRlbl9pbml0KCkgY29uc3Q7CisrICAgICAgLyogVGhlIGZvbGxvd2luZyBtZW1iZXIgZnVuY3Rpb24gaXMgbW92ZWQgZnJvbSBzcmMvY3R5cGUuY2MuCisrICAgICAgICAgU2VlIGNvbW1lbnQgdGhlcmUgZm9yIHJlYXNvbiB3aHkgKi8KKysgICAgICB2b2lkIF9NX3dpZGVuX2luaXQoKSBjb25zdAorKyAgICAgIHsKKysgICAgICAgIGNoYXIgX190bXBbc2l6ZW9mKF9NX3dpZGVuKV07CisrICAgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBzaXplb2YoX01fd2lkZW4pOyArK19faSkKKysgICAgICAgICAgX190bXBbX19pXSA9IF9faTsKKysgICAgICAgIGRvX3dpZGVuKF9fdG1wLCBfX3RtcCArIHNpemVvZihfX3RtcCksIF9NX3dpZGVuKTsKKysKKysgICAgICAgIF9NX3dpZGVuX29rID0gMTsKKysgICAgICAgIC8vIFNldCBfTV93aWRlbl9vayB0byAyIGlmIG1lbWNweSBjYW4ndCBiZSB1c2VkLgorKyAgICAgICAgaWYgKF9fYnVpbHRpbl9tZW1jbXAoX190bXAsIF9NX3dpZGVuLCBzaXplb2YoX01fd2lkZW4pKSkKKysgICAgICAgICAgX01fd2lkZW5fb2sgPSAyOworKyAgICAgIH0KKyAgICAgfTsKKyAKKyAjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKK2RpZmYgLU5hdXIgYS9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvY3R5cGUuY2MgYi9nY2MtNC42L2xpYnN0ZGMrKy12My9zcmMvY3R5cGUuY2MKKy0tLSBhL2djYy00LjYvbGlic3RkYysrLXYzL3NyYy9jdHlwZS5jYwkyMDEyLTAzLTA3IDEzOjIwOjEwLjUwMjgwNDMwNSAtMDgwMAorKysrIGIvZ2NjLTQuNi9saWJzdGRjKystdjMvc3JjL2N0eXBlLmNjCTIwMTItMDMtMDkgMTQ6MDg6MTIuOTAwNjQ4MjgyIC0wODAwCitAQCAtODksNiArODksMjAgQEAKKyAJICBfTV9uYXJyb3dfb2sgPSAyOworICAgICAgIH0KKyAgIH0KKysjaWYgMAorKy8qCisrICBUaGUgZm9sbG93aW5nIG1lbWJlciBmdW5jdGlvbiBpcyBtb3ZlZCB0byBoZWFkZXIgPGJpdHMvbG9jYWxlX2ZhY2V0cy5oPgorKyAgdG8gYXZvaWQgZGVwZW5kZW5jaWVzIG9uIG1vcmUgcmVjZW50IGxpYnN0ZGMrKy4KKysgIE1fd2lkZW5faW5pdCgpIHdhcyBtb3ZlZCBmcm9tIDxiaXRzL2xvY2FsZV9mYWNldHMuaD4gdG8gaGVyZSBwb3N0IGdjYyA0LjIKKysgIGFuZCBhbm5vdGF0ZWQgd2l0aCB2ZXJzaW9uIEdMSUJDWFhfMy40LjExLiAgUnVubmluZyBjb2RlIGNvbXBpbGVkIHdpdGgKKysgIHRoaXMgR0NDIDQuNiBvbiBVYnVudHUgOC4wNCAod2hlcmUgZ2NjIDQuMiBpcyB0aGUgbm9ybSkgbWF5IHJlc3VsdCBpbgorKyAgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgorKworKyAgICAuL2Eub3V0OiAvdXNyL2xpYjMyL2xpYnN0ZGMrKy5zby42OiB2ZXJzaW9uIEdMSUJDWFhfMy40LjExJyBub3QgZm91bmQgKHJlcXVpcmVkIGJ5IC4vYS5vdXQpIAorKworKyAgVGhpcyB3b3JrYXJvdW5kIGlzIHRvIGFsbG93IGJpbmFyeSBnZW5lcmF0ZWQgYnkgdGhpcyBHQ0MgNC42IHRvCisrICBydW4gb24gb2xkZXIgcGxhdGZvcm0uCisrKi8KKyAKKyAgIHZvaWQKKyAgIGN0eXBlPGNoYXI+OjoKK0BAIC0xMDQsNiArMTE4LDcgQEAKKyAgICAgaWYgKF9fYnVpbHRpbl9tZW1jbXAoX190bXAsIF9NX3dpZGVuLCBzaXplb2YoX01fd2lkZW4pKSkKKyAgICAgICBfTV93aWRlbl9vayA9IDI7CisgICB9CisrI2VuZGlmIC8vIDAKKyAKKyAjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgIGN0eXBlPHdjaGFyX3Q+OjpjdHlwZShzaXplX3QgX19yZWZzKSAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vYXIgYi94ODZfNjQtbGludXgvYmluL2FyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmYzRjMjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL2FyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vYXMgYi94ODZfNjQtbGludXgvYmluL2FzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzMDEwNDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL2FzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vYysrIGIveDg2XzY0LWxpbnV4L2Jpbi9jKysKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTI0ODMyNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vYysrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vZysrIGIveDg2XzY0LWxpbnV4L2Jpbi9nKysKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTI0ODMyNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vZysrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vZ2NjIGIveDg2XzY0LWxpbnV4L2Jpbi9nY2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE2YmRjZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vZ2NjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbGQgYi94ODZfNjQtbGludXgvYmluL2xkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg0NDg2OGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL2xkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbGQuYmZkIGIveDg2XzY0LWxpbnV4L2Jpbi9sZC5iZmQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODQ0ODY4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vbGQuYmZkCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vbm0gYi94ODZfNjQtbGludXgvYmluL25tCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0ZWQwZGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL25tCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vb2JqY29weSBiL3g4Nl82NC1saW51eC9iaW4vb2JqY29weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NGI5OWNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2Jpbi9vYmpjb3B5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vb2JqZHVtcCBiL3g4Nl82NC1saW51eC9iaW4vb2JqZHVtcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2RjOTY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2Jpbi9vYmpkdW1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vcmFubGliIGIveDg2XzY0LWxpbnV4L2Jpbi9yYW5saWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M3NWYwZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9iaW4vcmFubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9iaW4vc3RyaXAgYi94ODZfNjQtbGludXgvYmluL3N0cmlwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmOGFmNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvYmluL3N0cmlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYWxnb3JpdGhtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9hbGdvcml0aG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0OWVjMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYWxnb3JpdGhtCkBAIC0wLDAgKzEsNjkgQEAKKy8vIDxhbGdvcml0aG0+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvYWxnb3JpdGhtCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FMR09SSVRITQorI2RlZmluZSBfR0xJQkNYWF9BTEdPUklUSE0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBVSy0zMDAuCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvLmg+CisKKyNpZmRlZiBfR0xJQkNYWF9QQVJBTExFTAorIyBpbmNsdWRlIDxwYXJhbGxlbC9hbGdvcml0aG0+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0FMR09SSVRITSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9hcnJheSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZGQyNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYXJyYXkKQEAgLTAsMCArMSwyNzQgQEAKKy8vIDxhcnJheT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2FycmF5CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FSUkFZCisjZGVmaW5lIF9HTElCQ1hYX0FSUkFZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGZvciBzdG9yaW5nIGEgZml4ZWQgc2l6ZSBzZXF1ZW5jZSBvZiBlbGVtZW50cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPi4KKyAgICoKKyAgICogIFNldHMgc3VwcG9ydCByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIEBwYXJhbSAgVHAgIFR5cGUgb2YgZWxlbWVudC4gUmVxdWlyZWQgdG8gYmUgYSBjb21wbGV0ZSB0eXBlLgorICAgKiAgQHBhcmFtICBOICBOdW1iZXIgb2YgZWxlbWVudHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCBhcnJheQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIAkgICAgCQkJICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAJICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAJICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAJCSAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKgkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgCSAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgCSAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPgkgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gU3VwcG9ydCBmb3IgemVyby1zaXplZCBhcnJheXMgbWFuZGF0b3J5LgorICAgICAgdmFsdWVfdHlwZSBfTV9pbnN0YW5jZVtfTm0gPyBfTm0gOiAxXTsKKworICAgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUuCisKKyAgICAgIC8vIERSIDc3Ni4KKyAgICAgIHZvaWQKKyAgICAgIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KQorICAgICAgeyBzdGQ6OmZpbGxfbihiZWdpbigpLCBzaXplKCksIF9fdSk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChhcnJheSYgX19vdGhlcikKKyAgICAgIHsgc3RkOjpzd2FwX3JhbmdlcyhiZWdpbigpLCBlbmQoKSwgX19vdGhlci5iZWdpbigpKTsgfQorCisgICAgICAvLyBJdGVyYXRvcnMuCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3Ioc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVswXSkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0IAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3Ioc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVswXSkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3Ioc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVtfTm1dKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlW19ObV0pKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbMF0pKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlW19ObV0pKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgY3JlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICAvLyBDYXBhY2l0eS4KKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgCisgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9ObTsgfQorCisgICAgICBjb25zdGV4cHIgYm9vbCAKKyAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3MuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2luc3RhbmNlW19fbl07IH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbnN0YW5jZVtfX25dOyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID49IF9ObSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSk7CisJcmV0dXJuIF9NX2luc3RhbmNlW19fbl07CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19uID49IF9ObSkKKwkgIHN0ZDo6X190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJhcnJheTo6YXQiKSk7CisJcmV0dXJuIF9NX2luc3RhbmNlW19fbl07CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICAgIHJlZmVyZW5jZSAKKyAgICAgIGJhY2soKQorICAgICAgeyByZXR1cm4gX05tID8gKihlbmQoKSAtIDEpIDogKmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZSAKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyByZXR1cm4gX05tID8gKihlbmQoKSAtIDEpIDogKmVuZCgpOyB9CisKKyAgICAgIF9UcCoKKyAgICAgIGRhdGEoKQorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVswXSk7IH0KKworICAgICAgY29uc3QgX1RwKgorICAgICAgZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlWzBdKTsgfQorICAgIH07CisKKyAgLy8gQXJyYXkgY29tcGFyaXNvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sIAorICAgIG9wZXJhdG9yPT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiBzdGQ6OmVxdWFsKF9fb25lLmJlZ2luKCksIF9fb25lLmVuZCgpLCBfX3R3by5iZWdpbigpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPT0gX190d28pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2EsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19iKQorICAgIHsgCisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX2EuYmVnaW4oKSwgX19hLmVuZCgpLAorCQkJCQkgIF9fYi5iZWdpbigpLCBfX2IuZW5kKCkpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiBfX3R3byA8IF9fb25lOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gIShfX29uZSA+IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPCBfX3R3byk7IH0KKworICAvLyBTcGVjaWFsaXplZCBhbGdvcml0aG1zIFs2LjIuMi4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyBfX29uZS5zd2FwKF9fdHdvKTsgfQorCisgIC8vIFR1cGxlIGludGVyZmFjZSB0byBjbGFzcyB0ZW1wbGF0ZSBhcnJheSBbNi4yLjIuNV0uCisKKyAgLy8vIHR1cGxlX3NpemUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyB0dXBsZV9zaXplOworCisgIC8vLyB0dXBsZV9lbGVtZW50CisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyB0dXBsZV9lbGVtZW50OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPGFycmF5PF9UcCwgX05tPiA+CisgICAgeyBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgdmFsdWUgPSBfTm07IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3Qgc3RkOjpzaXplX3QKKyAgICB0dXBsZV9zaXplPGFycmF5PF9UcCwgX05tPiA+Ojp2YWx1ZTsgIAorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PF9JbnQsIGFycmF5PF9UcCwgX05tPiA+CisgICAgeyB0eXBlZGVmIF9UcCB0eXBlOyB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBfVHAmCisgICAgZ2V0KGFycmF5PF9UcCwgX05tPiYgX19hcnIpCisgICAgeyByZXR1cm4gX19hcnJbX0ludF07IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50LCB0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIGdldChjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYXJyKQorICAgIHsgcmV0dXJuIF9fYXJyW19JbnRdOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9BUlJBWQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9hdG9taWMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2F0b21pYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTk4OTFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9hdG9taWMKQEAgLTAsMCArMSwxMDU0IEBACisvLyAtKi0gQysrIC0qLSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9hdG9taWMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vIEJhc2VkIG9uICJDKysgQXRvbWljIFR5cGVzIGFuZCBPcGVyYXRpb25zIiBieSBIYW5zIEJvZWhtIGFuZCBMYXdyZW5jZSBDcm93bC4KKy8vIGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDcvbjI0MjcuaHRtbAorCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQworI2RlZmluZSBfR0xJQkNYWF9BVE9NSUMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvYXRvbWljX2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2F0b21pY18wLmg+CisjaW5jbHVkZSA8Yml0cy9hdG9taWNfMi5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGF0b21pY3MKKyAgICogQHsKKyAgICovCisKKyAgLy8vIGF0b21pY19ib29sCisgIC8vIE5COiBObyBvcGVyYXRvcnMgb3IgZmV0Y2gtb3BlcmF0aW9ucyBmb3IgdGhpcyB0eXBlLgorICBzdHJ1Y3QgYXRvbWljX2Jvb2wKKyAgeworICBwcml2YXRlOgorICAgIF9fYXRvbWljX2Jhc2U8Ym9vbD4JX01fYmFzZTsKKworICBwdWJsaWM6CisgICAgYXRvbWljX2Jvb2woKSA9IGRlZmF1bHQ7CisgICAgfmF0b21pY19ib29sKCkgPSBkZWZhdWx0OworICAgIGF0b21pY19ib29sKGNvbnN0IGF0b21pY19ib29sJikgPSBkZWxldGU7CisgICAgYXRvbWljX2Jvb2wmIG9wZXJhdG9yPShjb25zdCBhdG9taWNfYm9vbCYpID0gZGVsZXRlOworICAgIGF0b21pY19ib29sJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljX2Jvb2wmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgIGNvbnN0ZXhwciBhdG9taWNfYm9vbChib29sIF9faSkgOiBfTV9iYXNlKF9faSkgeyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I9KGJvb2wgX19pKQorICAgIHsgcmV0dXJuIF9NX2Jhc2Uub3BlcmF0b3I9KF9faSk7IH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2Jhc2UubG9hZCgpOyB9CisKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3Qgdm9sYXRpbGUKKyAgICB7IHJldHVybiBfTV9iYXNlLmxvYWQoKTsgfQorCisgICAgYm9vbAorICAgIGlzX2xvY2tfZnJlZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2Jhc2UuaXNfbG9ja19mcmVlKCk7IH0KKworICAgIGJvb2wKKyAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZSB7IHJldHVybiBfTV9iYXNlLmlzX2xvY2tfZnJlZSgpOyB9CisKKyAgICB2b2lkCisgICAgc3RvcmUoYm9vbCBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICB7IF9NX2Jhc2Uuc3RvcmUoX19pLCBfX20pOyB9CisKKyAgICB2b2lkCisgICAgc3RvcmUoYm9vbCBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICB7IF9NX2Jhc2Uuc3RvcmUoX19pLCBfX20pOyB9CisKKyAgICBib29sCisgICAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0CisgICAgeyByZXR1cm4gX01fYmFzZS5sb2FkKF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUKKyAgICB7IHJldHVybiBfTV9iYXNlLmxvYWQoX19tKTsgfQorCisgICAgYm9vbAorICAgIGV4Y2hhbmdlKGJvb2wgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgeyByZXR1cm4gX01fYmFzZS5leGNoYW5nZShfX2ksIF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBleGNoYW5nZShib29sIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgIHsgcmV0dXJuIF9NX2Jhc2UuZXhjaGFuZ2UoX19pLCBfX20pOyB9CisKKyAgICBib29sCisgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKGJvb2wmIF9faTEsIGJvb2wgX19pMiwgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgIG1lbW9yeV9vcmRlciBfX20yKQorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICBib29sCisgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKGJvb2wmIF9faTEsIGJvb2wgX19pMiwgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZQorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICBib29sCisgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKGJvb2wmIF9faTEsIGJvb2wgX19pMiwKKwkJCSAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgIHsgcmV0dXJuIF9NX2Jhc2UuY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbSk7IH0KKworICAgIGJvb2wKKyAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoYm9vbCYgX19pMSwgYm9vbCBfX2kyLAorCQkJICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpCisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlCisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgICAgYm9vbAorICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGJvb2wmIF9faTEsIGJvb2wgX19pMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgeyByZXR1cm4gX01fYmFzZS5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20pOyB9CisKKyAgICBib29sCisgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoYm9vbCYgX19pMSwgYm9vbCBfX2kyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICB7IHJldHVybiBfTV9iYXNlLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faTEsIF9faTIsIF9fbSk7IH0KKyAgfTsKKworCisgIC8vLyBhdG9taWMKKyAgLy8vIDI5LjQuMywgR2VuZXJpYyBhdG9taWMgdHlwZSwgcHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhdG9taWMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9UcCBfTV9pOworCisgICAgcHVibGljOgorICAgICAgYXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX1RwIF9faSkgOiBfTV9pKF9faSkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9UcCgpIGNvbnN0OworCisgICAgICBvcGVyYXRvciBfVHAoKSBjb25zdCB2b2xhdGlsZTsKKworICAgICAgX1RwCisgICAgICBvcGVyYXRvcj0oX1RwIF9faSkgeyBzdG9yZShfX2kpOyByZXR1cm4gX19pOyB9CisKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3I9KF9UcCBfX2kpIHZvbGF0aWxlIHsgc3RvcmUoX19pKTsgcmV0dXJuIF9faTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdDsKKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGU7CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9UcCwgbWVtb3J5X29yZGVyID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICAgICB2b2lkCisgICAgICBzdG9yZShfVHAsIG1lbW9yeV9vcmRlciA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZTsKKworICAgICAgX1RwCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdDsKKworICAgICAgX1RwCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdCB2b2xhdGlsZTsKKworICAgICAgX1RwCisgICAgICBleGNoYW5nZShfVHAgX19pLCBtZW1vcnlfb3JkZXIgPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgICAgIF9UcAorICAgICAgZXhjaGFuZ2UoX1RwIF9faSwgbWVtb3J5X29yZGVyID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlOworCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX1RwJiwgX1RwLCBtZW1vcnlfb3JkZXIsIG1lbW9yeV9vcmRlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfVHAmLCBfVHAsIG1lbW9yeV9vcmRlciwgbWVtb3J5X29yZGVyKSB2b2xhdGlsZTsKKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9UcCYsIF9UcCwgbWVtb3J5X29yZGVyID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX1RwJiwgX1RwLAorCQkJICAgIG1lbW9yeV9vcmRlciA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZTsKKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX1RwJiwgX1RwLCBtZW1vcnlfb3JkZXIsIG1lbW9yeV9vcmRlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9UcCYsIF9UcCwgbWVtb3J5X29yZGVyLCBtZW1vcnlfb3JkZXIpIHZvbGF0aWxlOworCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfVHAmLCBfVHAsIG1lbW9yeV9vcmRlciA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX1RwJiwgX1RwLAorCQkJICAgICAgbWVtb3J5X29yZGVyID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlOworICAgIH07CisKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhdG9taWM8X1RwKj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCogCQkJX19wb2ludGVyX3R5cGU7CisgICAgICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8X1RwKj4JX19iYXNlX3R5cGU7CisgICAgICBfX2Jhc2VfdHlwZQkJCV9NX2I7CisKKyAgICAgIGF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9fcG9pbnRlcl90eXBlIF9fcCkgOiBfTV9iKF9fcCkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcG9pbnRlcl90eXBlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fcG9pbnRlcl90eXBlKF9NX2IpOyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcG9pbnRlcl90eXBlKCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9fcG9pbnRlcl90eXBlKF9NX2IpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcj0oX19wb2ludGVyX3R5cGUgX19wKQorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvcj0oX19wKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3I9KF9fcG9pbnRlcl90eXBlIF9fcCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2Iub3BlcmF0b3I9KF9fcCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gX01fYisrOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2IrKzsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7IHJldHVybiBfTV9iLS07IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oaW50KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX01fYi0tOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICsrX01fYjsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiArK19NX2I7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeyByZXR1cm4gLS1fTV9iOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIC0tX01fYjsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKQorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvcis9KF9fZCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2Iub3BlcmF0b3IrPShfX2QpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX2QpCisgICAgICB7IHJldHVybiBfTV9iLm9wZXJhdG9yLT0oX19kKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX01fYi5vcGVyYXRvci09KF9fZCk7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2IuaXNfbG9ja19mcmVlKCk7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2IuaXNfbG9ja19mcmVlKCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3RvcmUoX19wb2ludGVyX3R5cGUgX19wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7IHJldHVybiBfTV9iLnN0b3JlKF9fcCwgX19tKTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2Iuc3RvcmUoX19wLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2IubG9hZChfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2IubG9hZChfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBleGNoYW5nZShfX3BvaW50ZXJfdHlwZSBfX3AsIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICAgIHsgcmV0dXJuIF9NX2IuZXhjaGFuZ2UoX19wLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBleGNoYW5nZShfX3BvaW50ZXJfdHlwZSBfX3AsCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2IuZXhjaGFuZ2UoX19wLCBfX20pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpCisgICAgICB7IHJldHVybiBfTV9iLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcDEsIF9fcDIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfTV9iLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcDEsIF9fcDIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3AxLCBfX3AyLCBfX20sCisJCQkJICAgICBfX2NhbGN1bGF0ZV9tZW1vcnlfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX3AxLCBfX3AyLCBfX20sCisJCQkJICAgICBfX2NhbGN1bGF0ZV9tZW1vcnlfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKQorICAgICAgeyByZXR1cm4gX01fYi5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3AxLCBfX3AyLCBfX20xLCBfX20yKTsgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLCBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tMSwgX19tMik7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wb2ludGVyX3R5cGUmIF9fcDEsIF9fcG9pbnRlcl90eXBlIF9fcDIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJcmV0dXJuIF9NX2IuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19wMSwgX19wMiwgX19tLAorCQkJCQkgICAgX19jYWxjdWxhdGVfbWVtb3J5X29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3BvaW50ZXJfdHlwZSYgX19wMSwgX19wb2ludGVyX3R5cGUgX19wMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsKKwlyZXR1cm4gX01fYi5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3AxLCBfX3AyLCBfX20sCisJCQkJCSAgICBfX2NhbGN1bGF0ZV9tZW1vcnlfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9hZGQocHRyZGlmZl90IF9fZCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9hZGQocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9zdWIocHRyZGlmZl90IF9fZCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9zdWIocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX01fYi5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisgICAgfTsKKworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgYm9vbC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8Ym9vbD4gOiBwdWJsaWMgYXRvbWljX2Jvb2wKKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfYm9vbCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxjaGFyPiA6IHB1YmxpYyBhdG9taWNfY2hhcgorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhciAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19jaGFyIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHNpZ25lZCBjaGFyLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxzaWduZWQgY2hhcj4gOiBwdWJsaWMgYXRvbWljX3NjaGFyCisgICAgeworICAgICAgdHlwZWRlZiBzaWduZWQgY2hhciAJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3NjaGFyIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGNoYXIuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHVuc2lnbmVkIGNoYXI+IDogcHVibGljIGF0b21pY191Y2hhcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3VjaGFyIAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHNob3J0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzxzaG9ydD4gOiBwdWJsaWMgYXRvbWljX3Nob3J0CisgICAgeworICAgICAgdHlwZWRlZiBzaG9ydCAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19zaG9ydCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBzaG9ydC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8dW5zaWduZWQgc2hvcnQ+IDogcHVibGljIGF0b21pY191c2hvcnQKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IAkgICAgICAJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfdXNob3J0IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGludC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8aW50PiA6IGF0b21pY19pbnQKKyAgICB7CisgICAgICB0eXBlZGVmIGludCAJCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19pbnQgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgaW50LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzx1bnNpZ25lZCBpbnQ+IDogcHVibGljIGF0b21pY191aW50CisgICAgeworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX3VpbnQgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgbG9uZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8bG9uZz4gOiBwdWJsaWMgYXRvbWljX2xvbmcKKyAgICB7CisgICAgICB0eXBlZGVmIGxvbmcgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfbG9uZyAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBsb25nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGF0b21pYzx1bnNpZ25lZCBsb25nPiA6IHB1YmxpYyBhdG9taWNfdWxvbmcKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY191bG9uZyAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBsb25nIGxvbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPGxvbmcgbG9uZz4gOiBwdWJsaWMgYXRvbWljX2xsb25nCisgICAgeworICAgICAgdHlwZWRlZiBsb25nIGxvbmcgCQlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY19sbG9uZyAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBsb25nIGxvbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPHVuc2lnbmVkIGxvbmcgbG9uZz4gOiBwdWJsaWMgYXRvbWljX3VsbG9uZworICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgICAgIAlfX2ludGVncmFsX3R5cGU7CisgICAgICB0eXBlZGVmIGF0b21pY191bGxvbmcgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3Igd2NoYXJfdC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8d2NoYXJfdD4gOiBwdWJsaWMgYXRvbWljX3djaGFyX3QKKyAgICB7CisgICAgICB0eXBlZGVmIHdjaGFyX3QgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfd2NoYXJfdCAJCV9fYmFzZV90eXBlOworCisgICAgICBhdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICB+YXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgYXRvbWljKGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgY29uc3RleHByIGF0b21pYyhfX2ludGVncmFsX3R5cGUgX19pKSA6IF9fYmFzZV90eXBlKF9faSkgeyB9CisKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvciBfX2ludGVncmFsX3R5cGU7CisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3I9OworICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyMTZfdC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBhdG9taWM8Y2hhcjE2X3Q+IDogcHVibGljIGF0b21pY19jaGFyMTZfdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcjE2X3QgCQkJX19pbnRlZ3JhbF90eXBlOworICAgICAgdHlwZWRlZiBhdG9taWNfY2hhcjE2X3QgCQlfX2Jhc2VfdHlwZTsKKworICAgICAgYXRvbWljKCkgPSBkZWZhdWx0OworICAgICAgfmF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIGF0b21pYyhjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpID0gZGVsZXRlOworICAgICAgYXRvbWljJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIGNvbnN0ZXhwciBhdG9taWMoX19pbnRlZ3JhbF90eXBlIF9faSkgOiBfX2Jhc2VfdHlwZShfX2kpIHsgfQorCisgICAgICB1c2luZyBfX2Jhc2VfdHlwZTo6b3BlcmF0b3IgX19pbnRlZ3JhbF90eXBlOworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yPTsKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgY2hhcjMyX3QuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgYXRvbWljPGNoYXIzMl90PiA6IHB1YmxpYyBhdG9taWNfY2hhcjMyX3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIzMl90IAkJCV9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHR5cGVkZWYgYXRvbWljX2NoYXIzMl90IAkJX19iYXNlX3R5cGU7CisKKyAgICAgIGF0b21pYygpID0gZGVmYXVsdDsKKyAgICAgIH5hdG9taWMoKSA9IGRlZmF1bHQ7CisgICAgICBhdG9taWMoY29uc3QgYXRvbWljJikgPSBkZWxldGU7CisgICAgICBhdG9taWMmIG9wZXJhdG9yPShjb25zdCBhdG9taWMmKSA9IGRlbGV0ZTsKKyAgICAgIGF0b21pYyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pYyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICBjb25zdGV4cHIgYXRvbWljKF9faW50ZWdyYWxfdHlwZSBfX2kpIDogX19iYXNlX3R5cGUoX19pKSB7IH0KKworICAgICAgdXNpbmcgX19iYXNlX3R5cGU6Om9wZXJhdG9yIF9faW50ZWdyYWxfdHlwZTsKKyAgICAgIHVzaW5nIF9fYmFzZV90eXBlOjpvcGVyYXRvcj07CisgICAgfTsKKworCisgIC8vIEZ1bmN0aW9uIGRlZmluaXRpb25zLCBhdG9taWNfZmxhZyBvcGVyYXRpb25zLgorICBpbmxpbmUgYm9vbAorICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQoYXRvbWljX2ZsYWcqIF9fYSwgbWVtb3J5X29yZGVyIF9fbSkKKyAgeyByZXR1cm4gX19hLT50ZXN0X2FuZF9zZXQoX19tKTsgfQorCisgIGlubGluZSBib29sCisgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxhZyogX19hLAorCQkJCSAgICBtZW1vcnlfb3JkZXIgX19tKQorICB7IHJldHVybiBfX2EtPnRlc3RfYW5kX3NldChfX20pOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQoYXRvbWljX2ZsYWcqIF9fYSwgbWVtb3J5X29yZGVyIF9fbSkKKyAgeyBfX2EtPmNsZWFyKF9fbSk7IH0KKworICBpbmxpbmUgdm9pZAorICBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWNfZmxhZyogX19hLCBtZW1vcnlfb3JkZXIgX19tKQorICB7IF9fYS0+Y2xlYXIoX19tKTsgfQorCisgIGlubGluZSBib29sCisgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldChhdG9taWNfZmxhZyogX19hKQorICB7IHJldHVybiBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICBpbmxpbmUgYm9vbAorICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQodm9sYXRpbGUgYXRvbWljX2ZsYWcqIF9fYSkKKyAgeyByZXR1cm4gYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KF9fYSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgYXRvbWljX2ZsYWdfY2xlYXIoYXRvbWljX2ZsYWcqIF9fYSkKKyAgeyBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChfX2EsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIGlubGluZSB2b2lkCisgIGF0b21pY19mbGFnX2NsZWFyKHZvbGF0aWxlIGF0b21pY19mbGFnKiBfX2EpCisgIHsgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworCisgIC8vIEZ1bmN0aW9uIHRlbXBsYXRlcyBnZW5lcmFsbHkgYXBwbGljYWJsZSB0byBhdG9taWMgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfaXNfbG9ja19mcmVlKGNvbnN0IGF0b21pYzxfSVRwPiogX19hKQorICAgIHsgcmV0dXJuIF9fYS0+aXNfbG9ja19mcmVlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2lzX2xvY2tfZnJlZShjb25zdCB2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSkKKyAgICB7IHJldHVybiBfX2EtPmlzX2xvY2tfZnJlZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19pbml0KGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19pbml0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19zdG9yZV9leHBsaWNpdChhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2ksIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyBfX2EtPnN0b3JlKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pLAorCQkJICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgX19hLT5zdG9yZShfX2ksIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2xvYWRfZXhwbGljaXQoY29uc3QgYXRvbWljPF9JVHA+KiBfX2EsIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyByZXR1cm4gX19hLT5sb2FkKF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2xvYWRfZXhwbGljaXQoY29uc3Qgdm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsCisJCQkgbWVtb3J5X29yZGVyIF9fbSkKKyAgICB7IHJldHVybiBfX2EtPmxvYWQoX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQoYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pLAorCQkJICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZXhjaGFuZ2UoX19pLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19leGNoYW5nZV9leHBsaWNpdCh2b2xhdGlsZSBhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyByZXR1cm4gX19hLT5leGNoYW5nZShfX2ksIF9fbSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkJICBfSVRwKiBfX2kxLCBfSVRwIF9faTIsCisJCQkJCSAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKQorICAgIHsgcmV0dXJuIF9fYS0+Y29tcGFyZV9leGNoYW5nZV93ZWFrKCpfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLAorCQkJCQkgIF9JVHAqIF9faTEsIF9JVHAgX19pMiwKKwkJCQkJICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpCisgICAgeyByZXR1cm4gX19hLT5jb21wYXJlX2V4Y2hhbmdlX3dlYWsoKl9faTEsIF9faTIsIF9fbTEsIF9fbTIpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkJICAgIF9JVHAqIF9faTEsIF9JVHAgX19pMiwKKwkJCQkJICAgIG1lbW9yeV9vcmRlciBfX20xLAorCQkJCQkgICAgbWVtb3J5X29yZGVyIF9fbTIpCisgICAgeyByZXR1cm4gX19hLT5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZygqX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBib29sCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwPiogX19hLAorCQkJCQkgICAgX0lUcCogX19pMSwgX0lUcCBfX2kyLAorCQkJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsCisJCQkJCSAgICBtZW1vcnlfb3JkZXIgX19tMikKKyAgICB7IHJldHVybiBfX2EtPmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKCpfX2kxLCBfX2kyLCBfX20xLCBfX20yKTsgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGF0b21pY19zdG9yZShhdG9taWM8X0lUcD4qIF9fYSwgX0lUcCBfX2kpCisgICAgeyBhdG9taWNfc3RvcmVfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBhdG9taWNfc3RvcmUodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKQorICAgIHsgYXRvbWljX3N0b3JlX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2xvYWQoY29uc3QgYXRvbWljPF9JVHA+KiBfX2EpCisgICAgeyByZXR1cm4gYXRvbWljX2xvYWRfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2xvYWQoY29uc3Qgdm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EpCisgICAgeyByZXR1cm4gYXRvbWljX2xvYWRfZXhwbGljaXQoX19hLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2V4Y2hhbmdlKGF0b21pYzxfSVRwPiogX19hLCBfSVRwIF9faSkKKyAgICB7IHJldHVybiBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZXhjaGFuZ2Uodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsIF9JVHAgX19pKQorICAgIHsgcmV0dXJuIGF0b21pY19leGNoYW5nZV9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJIF9JVHAqIF9faTEsIF9JVHAgX19pMikKKyAgICB7CisgICAgICByZXR1cm4gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkJCSAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJIF9JVHAqIF9faTEsIF9JVHAgX19pMikKKyAgICB7CisgICAgICByZXR1cm4gYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkJCSAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhhdG9taWM8X0lUcD4qIF9fYSwKKwkJCQkgICBfSVRwKiBfX2kxLCBfSVRwIF9faTIpCisgICAgeworICAgICAgcmV0dXJuIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChfX2EsIF9faTEsIF9faTIsCisJCQkJCQkgICAgIG1lbW9yeV9vcmRlcl9zZXFfY3N0LAorCQkJCQkJICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcodm9sYXRpbGUgYXRvbWljPF9JVHA+KiBfX2EsCisJCQkJICAgX0lUcCogX19pMSwgX0lUcCBfX2kyKQorICAgIHsKKyAgICAgIHJldHVybiBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQoX19hLCBfX2kxLCBfX2kyLAorCQkJCQkJICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdCwKKwkJCQkJCSAgICAgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgIH0KKworICAvLyBGdW5jdGlvbiB0ZW1wbGF0ZXMgZm9yIGF0b21pY19pbnRlZ3JhbCBvcGVyYXRpb25zIG9ubHksIHVzaW5nCisgIC8vIF9fYXRvbWljX2Jhc2UuIFRlbXBsYXRlIGFyZ3VtZW50IHNob3VsZCBiZSBjb25zdHJpY3RlZCB0bworICAvLyBpbnRlcmdyYWwgdHlwZXMgYXMgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZCwgZXhjbHVkaW5nIGFkZHJlc3MKKyAgLy8gdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYWRkKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYWRkKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfc3ViKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfc3ViKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYW5kKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfYW5kKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX29yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSwKKwkJCSAgICAgbWVtb3J5X29yZGVyIF9fbSkKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX29yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfeG9yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2ksCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tKQorICAgIHsgcmV0dXJuIF9fYS0+ZmV0Y2hfeG9yKF9faSwgX19tKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfYWRkKF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpCisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hZGQodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX3N1YihfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKQorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpCisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF9hbmQoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSVRwPgorICAgIGlubGluZSBfSVRwCisgICAgYXRvbWljX2ZldGNoX2FuZCh2b2xhdGlsZSBfX2F0b21pY19iYXNlPF9JVHA+KiBfX2EsIF9JVHAgX19pKQorICAgIHsgcmV0dXJuIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3IoX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfb3Iodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoX19hLCBfX2ksIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgaW5saW5lIF9JVHAKKyAgICBhdG9taWNfZmV0Y2hfeG9yKF9fYXRvbWljX2Jhc2U8X0lUcD4qIF9fYSwgX0lUcCBfX2kpCisgICAgeyByZXR1cm4gYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdChfX2EsIF9faSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcAorICAgIGF0b21pY19mZXRjaF94b3Iodm9sYXRpbGUgX19hdG9taWNfYmFzZTxfSVRwPiogX19hLCBfSVRwIF9faSkKKyAgICB7IHJldHVybiBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KF9fYSwgX19pLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7IH0KKworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGZvciBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9hZGQoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkKHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX2FkZChfX2QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfYWRkKGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX2FkZChfX2QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwKKwkJCSAgICAgIHB0cmRpZmZfdCBfX2QsIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20pCisgICAgeyByZXR1cm4gX19hLT5mZXRjaF9zdWIoX19kLCBfX20pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViKHZvbGF0aWxlIGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX3N1YihfX2QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lUcD4KKyAgICBpbmxpbmUgX0lUcCoKKyAgICBhdG9taWNfZmV0Y2hfc3ViKGF0b21pYzxfSVRwKj4qIF9fYSwgcHRyZGlmZl90IF9fZCkKKyAgICB7IHJldHVybiBfX2EtPmZldGNoX3N1YihfX2QpOyB9CisgIC8vIEB9IGdyb3VwIGF0b21pY3MKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvYXV0b19wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvYXV0b19wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODY4NzY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9hdXRvX3B0ci5oCkBAIC0wLDAgKzEsMjk1IEBACisvLyBhdXRvX3B0ciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJhY2t3YXJkL2F1dG9fcHRyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfQVVUT19QVFJfSAorI2RlZmluZSBfQkFDS1dBUkRfQVVUT19QVFJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEEgd3JhcHBlciBjbGFzcyB0byBwcm92aWRlIGF1dG9fcHRyIHdpdGggcmVmZXJlbmNlIHNlbWFudGljcy4KKyAgICogIEZvciBleGFtcGxlLCBhbiBhdXRvX3B0ciBjYW4gYmUgYXNzaWduZWQgKG9yIGNvbnN0cnVjdGVkIGZyb20pCisgICAqICB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBhdXRvX3B0ciBieSB2YWx1ZS4KKyAgICoKKyAgICogIEFsbCB0aGUgYXV0b19wdHJfcmVmIHN0dWZmIHNob3VsZCBoYXBwZW4gYmVoaW5kIHRoZSBzY2VuZXMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgIHN0cnVjdCBhdXRvX3B0cl9yZWYKKyAgICB7CisgICAgICBfVHAxKiBfTV9wdHI7CisgICAgICAKKyAgICAgIGV4cGxpY2l0CisgICAgICBhdXRvX3B0cl9yZWYoX1RwMSogX19wKTogX01fcHRyKF9fcCkgeyB9CisgICAgfSBfR0xJQkNYWF9ERVBSRUNBVEVEOworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgc2ltcGxlIHNtYXJ0IHBvaW50ZXIgcHJvdmlkaW5nIHN0cmljdCBvd25lcnNoaXAgc2VtYW50aWNzLgorICAgKgorICAgKiAgVGhlIFN0YW5kYXJkIHNheXM6CisgICAqICA8cHJlPgorICAgKiAgQW4gQGMgYXV0b19wdHIgb3ducyB0aGUgb2JqZWN0IGl0IGhvbGRzIGEgcG9pbnRlciB0by4gIENvcHlpbmcKKyAgICogIGFuIEBjIGF1dG9fcHRyIGNvcGllcyB0aGUgcG9pbnRlciBhbmQgdHJhbnNmZXJzIG93bmVyc2hpcCB0byB0aGUKKyAgICogIGRlc3RpbmF0aW9uLiAgSWYgbW9yZSB0aGFuIG9uZSBAYyBhdXRvX3B0ciBvd25zIHRoZSBzYW1lIG9iamVjdAorICAgKiAgYXQgdGhlIHNhbWUgdGltZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2dyYW0gaXMgdW5kZWZpbmVkLgorICAgKgorICAgKiAgVGhlIHVzZXMgb2YgQGMgYXV0b19wdHIgaW5jbHVkZSBwcm92aWRpbmcgdGVtcG9yYXJ5CisgICAqICBleGNlcHRpb24tc2FmZXR5IGZvciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5LCBwYXNzaW5nCisgICAqICBvd25lcnNoaXAgb2YgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSB0byBhIGZ1bmN0aW9uLCBhbmQKKyAgICogIHJldHVybmluZyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gYSBmdW5jdGlvbi4gIEBjCisgICAqICBhdXRvX3B0ciBkb2VzIG5vdCBtZWV0IHRoZSBDb3B5Q29uc3RydWN0aWJsZSBhbmQgQXNzaWduYWJsZQorICAgKiAgcmVxdWlyZW1lbnRzIGZvciBTdGFuZGFyZCBMaWJyYXJ5IDxhCisgICAqICBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiBlbGVtZW50cyBhbmQgdGh1cworICAgKiAgaW5zdGFudGlhdGluZyBhIFN0YW5kYXJkIExpYnJhcnkgY29udGFpbmVyIHdpdGggYW4gQGMgYXV0b19wdHIKKyAgICogIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgKiAgPC9wcmU+CisgICAqICBRdW90ZWQgZnJvbSBbMjAuNC41XS8zLgorICAgKgorICAgKiAgR29vZCBleGFtcGxlcyBvZiB3aGF0IGNhbiBhbmQgY2Fubm90IGJlIGRvbmUgd2l0aCBhdXRvX3B0ciBjYW4KKyAgICogIGJlIGZvdW5kIGluIHRoZSBsaWJzdGRjKysgdGVzdHN1aXRlLgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgMTI3LiAgYXV0b19wdHI8PiBjb252ZXJzaW9uIGlzc3VlcworICAgKiAgVGhlc2UgcmVzb2x1dGlvbnMgaGF2ZSBhbGwgYmVlbiBpbmNvcnBvcmF0ZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgYXV0b19wdHIKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9UcCogX01fcHRyOworICAgICAgCisgICAgcHVibGljOgorICAgICAgLy8vIFRoZSBwb2ludGVkLXRvIHR5cGUuCisgICAgICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQW4gJWF1dG9fcHRyIGlzIHVzdWFsbHkgY29uc3RydWN0ZWQgZnJvbSBhIHJhdyBwb2ludGVyLgorICAgICAgICogIEBwYXJhbSAgcCAgQSBwb2ludGVyIChkZWZhdWx0cyB0byBOVUxMKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEBhIHAuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBhdXRvX3B0cihlbGVtZW50X3R5cGUqIF9fcCA9IDApIHRocm93KCkgOiBfTV9wdHIoX19wKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBbiAlYXV0b19wdHIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYW5vdGhlciAlYXV0b19wdHIuCisgICAgICAgKiAgQHBhcmFtICBhICBBbm90aGVyICVhdXRvX3B0ciBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9iamVjdCBub3cgQGUgb3ducyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgb3duZWQgYnkgQGEgYSwKKyAgICAgICAqICB3aGljaCBoYXMgZ2l2ZW4gdXAgb3duZXJzaGlwLgorICAgICAgICovCisgICAgICBhdXRvX3B0cihhdXRvX3B0ciYgX19hKSB0aHJvdygpIDogX01fcHRyKF9fYS5yZWxlYXNlKCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFuICVhdXRvX3B0ciBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhbm90aGVyICVhdXRvX3B0ci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFub3RoZXIgJWF1dG9fcHRyIG9mIGEgZGlmZmVyZW50IGJ1dCByZWxhdGVkIHR5cGUuCisgICAgICAgKgorICAgICAgICogIEEgcG9pbnRlci10by1UcDEgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBhCisgICAgICAgKiAgcG9pbnRlci10by1UcC9lbGVtZW50X3R5cGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb2JqZWN0IG5vdyBAZSBvd25zIHRoZSBvYmplY3QgcHJldmlvdXNseSBvd25lZCBieSBAYSBhLAorICAgICAgICogIHdoaWNoIGhhcyBnaXZlbiB1cCBvd25lcnNoaXAuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGF1dG9fcHRyKGF1dG9fcHRyPF9UcDE+JiBfX2EpIHRocm93KCkgOiBfTV9wdHIoX19hLnJlbGVhc2UoKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJWF1dG9fcHRyIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBhICBBbm90aGVyICVhdXRvX3B0ciBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9iamVjdCBub3cgQGUgb3ducyB0aGUgb2JqZWN0IHByZXZpb3VzbHkgb3duZWQgYnkgQGEgYSwKKyAgICAgICAqICB3aGljaCBoYXMgZ2l2ZW4gdXAgb3duZXJzaGlwLiAgVGhlIG9iamVjdCB0aGF0IHRoaXMgb25lIEBlCisgICAgICAgKiAgdXNlZCB0byBvd24gYW5kIHRyYWNrIGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgICAgKi8KKyAgICAgIGF1dG9fcHRyJgorICAgICAgb3BlcmF0b3I9KGF1dG9fcHRyJiBfX2EpIHRocm93KCkKKyAgICAgIHsKKwlyZXNldChfX2EucmVsZWFzZSgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJWF1dG9fcHRyIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBhICBBbm90aGVyICVhdXRvX3B0ciBvZiBhIGRpZmZlcmVudCBidXQgcmVsYXRlZCB0eXBlLgorICAgICAgICoKKyAgICAgICAqICBBIHBvaW50ZXItdG8tVHAxIG11c3QgYmUgY29udmVydGlibGUgdG8gYSBwb2ludGVyLXRvLVRwL2VsZW1lbnRfdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwcmV2aW91c2x5IG93bmVkIGJ5IEBhIGEsCisgICAgICAgKiAgd2hpY2ggaGFzIGdpdmVuIHVwIG93bmVyc2hpcC4gIFRoZSBvYmplY3QgdGhhdCB0aGlzIG9uZSBAZQorICAgICAgICogIHVzZWQgdG8gb3duIGFuZCB0cmFjayBoYXMgYmVlbiBkZWxldGVkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBhdXRvX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KGF1dG9fcHRyPF9UcDE+JiBfX2EpIHRocm93KCkKKyAgICAgICAgeworCSAgcmVzZXQoX19hLnJlbGVhc2UoKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBXaGVuIHRoZSAlYXV0b19wdHIgZ29lcyBvdXQgb2Ygc2NvcGUsIHRoZSBvYmplY3QgaXQgb3ducyBpcworICAgICAgICogIGRlbGV0ZWQuICBJZiBpdCBubyBsb25nZXIgb3ducyBhbnl0aGluZyAoaS5lLiwgQGMgZ2V0KCkgaXMKKyAgICAgICAqICBAYyBOVUxMKSwgdGhlbiB0aGlzIGhhcyBubyBlZmZlY3QuCisgICAgICAgKgorICAgICAgICogIFRoZSBDKysgc3RhbmRhcmQgc2F5cyB0aGVyZSBpcyBzdXBwb3NlZCB0byBiZSBhbiBlbXB0eSB0aHJvdworICAgICAgICogIHNwZWNpZmljYXRpb24gaGVyZSwgYnV0IG9taXR0aW5nIGl0IGlzIHN0YW5kYXJkIGNvbmZvcm1pbmcuICBJdHMKKyAgICAgICAqICBwcmVzZW5jZSBjYW4gYmUgZGV0ZWN0ZWQgb25seSBpZiBfVHA6On5fVHAoKSB0aHJvd3MsIGJ1dCB0aGlzIGlzCisgICAgICAgKiAgcHJvaGliaXRlZC4gIFsxNy40LjMuNl0vMgorICAgICAgICovCisgICAgICB+YXV0b19wdHIoKSB7IGRlbGV0ZSBfTV9wdHI7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTbWFydCBwb2ludGVyIGRlcmVmZXJlbmNpbmcuCisgICAgICAgKgorICAgICAgICogIElmIHRoaXMgJWF1dG9fcHRyIG5vIGxvbmdlciBvd25zIGFueXRoaW5nLCB0aGVuIHRoaXMKKyAgICAgICAqICBvcGVyYXRpb24gd2lsbCBjcmFzaC4gIChGb3IgYSBzbWFydCBwb2ludGVyLCA8ZW0+bm8gbG9uZ2VyIG93bnMKKyAgICAgICAqICBhbnl0aGluZzwvZW0+IGlzIHRoZSBzYW1lIGFzIGJlaW5nIGEgbnVsbCBwb2ludGVyLCBhbmQgeW91IGtub3cKKyAgICAgICAqICB3aGF0IGhhcHBlbnMgd2hlbiB5b3UgZGVyZWZlcmVuY2Ugb25lIG9mIHRob3NlLi4uKQorICAgICAgICovCisgICAgICBlbGVtZW50X3R5cGUmCisgICAgICBvcGVyYXRvciooKSBjb25zdCB0aHJvdygpIAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9wdHIgIT0gMCk7CisJcmV0dXJuICpfTV9wdHI7IAorICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNtYXJ0IHBvaW50ZXIgZGVyZWZlcmVuY2luZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyByZXR1cm5zIHRoZSBwb2ludGVyIGl0c2VsZiwgd2hpY2ggdGhlIGxhbmd1YWdlIHRoZW4gd2lsbAorICAgICAgICogIGF1dG9tYXRpY2FsbHkgY2F1c2UgdG8gYmUgZGVyZWZlcmVuY2VkLgorICAgICAgICovCisgICAgICBlbGVtZW50X3R5cGUqCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QgdGhyb3coKSAKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiBfTV9wdHI7IAorICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ5cGFzc2luZyB0aGUgc21hcnQgcG9pbnRlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcmF3IHBvaW50ZXIgYmVpbmcgbWFuYWdlZC4KKyAgICAgICAqCisgICAgICAgKiAgWW91IGNhbiBnZXQgYSBjb3B5IG9mIHRoZSBwb2ludGVyIHRoYXQgdGhpcyBvYmplY3Qgb3ducywgZm9yCisgICAgICAgKiAgc2l0dWF0aW9ucyBzdWNoIGFzIHBhc3NpbmcgdG8gYSBmdW5jdGlvbiB3aGljaCBvbmx5IGFjY2VwdHMKKyAgICAgICAqICBhIHJhdyBwb2ludGVyLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyAlYXV0b19wdHIgc3RpbGwgb3ducyB0aGUgbWVtb3J5LgorICAgICAgICovCisgICAgICBlbGVtZW50X3R5cGUqCisgICAgICBnZXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIF9NX3B0cjsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ5cGFzc2luZyB0aGUgc21hcnQgcG9pbnRlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgcmF3IHBvaW50ZXIgYmVpbmcgbWFuYWdlZC4KKyAgICAgICAqCisgICAgICAgKiAgWW91IGNhbiBnZXQgYSBjb3B5IG9mIHRoZSBwb2ludGVyIHRoYXQgdGhpcyBvYmplY3Qgb3ducywgZm9yCisgICAgICAgKiAgc2l0dWF0aW9ucyBzdWNoIGFzIHBhc3NpbmcgdG8gYSBmdW5jdGlvbiB3aGljaCBvbmx5IGFjY2VwdHMKKyAgICAgICAqICBhIHJhdyBwb2ludGVyLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyAlYXV0b19wdHIgbm8gbG9uZ2VyIG93bnMgdGhlIG1lbW9yeS4gIFdoZW4gdGhpcyBvYmplY3QKKyAgICAgICAqICBnb2VzIG91dCBvZiBzY29wZSwgbm90aGluZyB3aWxsIGhhcHBlbi4KKyAgICAgICAqLworICAgICAgZWxlbWVudF90eXBlKgorICAgICAgcmVsZWFzZSgpIHRocm93KCkKKyAgICAgIHsKKwllbGVtZW50X3R5cGUqIF9fdG1wID0gX01fcHRyOworCV9NX3B0ciA9IDA7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcmNpYmx5IGRlbGV0ZXMgdGhlIG1hbmFnZWQgb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgcCAgQSBwb2ludGVyIChkZWZhdWx0cyB0byBOVUxMKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvYmplY3Qgbm93IEBlIG93bnMgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IEBhIHAuICBUaGUKKyAgICAgICAqICBwcmV2aW91cyBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoZWxlbWVudF90eXBlKiBfX3AgPSAwKSB0aHJvdygpCisgICAgICB7CisJaWYgKF9fcCAhPSBfTV9wdHIpCisJICB7CisJICAgIGRlbGV0ZSBfTV9wdHI7CisJICAgIF9NX3B0ciA9IF9fcDsKKwkgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqIAorICAgICAgICogIEBicmllZiAgQXV0b21hdGljIGNvbnZlcnNpb25zCisgICAgICAgKgorICAgICAgICogIFRoZXNlIG9wZXJhdGlvbnMgY29udmVydCBhbiAlYXV0b19wdHIgaW50byBhbmQgZnJvbSBhbiBhdXRvX3B0cl9yZWYKKyAgICAgICAqICBhdXRvbWF0aWNhbGx5IGFzIG5lZWRlZC4gIFRoaXMgYWxsb3dzIGNvbnN0cnVjdHMgc3VjaCBhcworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBhdXRvX3B0cjxEZXJpdmVkPiAgZnVuY19yZXR1cm5pbmdfYXV0b19wdHIoLi4uLi4pOworICAgICAgICogICAgLi4uCisgICAgICAgKiAgICBhdXRvX3B0cjxCYXNlPiBwdHIgPSBmdW5jX3JldHVybmluZ19hdXRvX3B0ciguLi4uLik7CisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqLworICAgICAgYXV0b19wdHIoYXV0b19wdHJfcmVmPGVsZW1lbnRfdHlwZT4gX19yZWYpIHRocm93KCkKKyAgICAgIDogX01fcHRyKF9fcmVmLl9NX3B0cikgeyB9CisgICAgICAKKyAgICAgIGF1dG9fcHRyJgorICAgICAgb3BlcmF0b3I9KGF1dG9fcHRyX3JlZjxlbGVtZW50X3R5cGU+IF9fcmVmKSB0aHJvdygpCisgICAgICB7CisJaWYgKF9fcmVmLl9NX3B0ciAhPSB0aGlzLT5nZXQoKSkKKwkgIHsKKwkgICAgZGVsZXRlIF9NX3B0cjsKKwkgICAgX01fcHRyID0gX19yZWYuX01fcHRyOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgb3BlcmF0b3IgYXV0b19wdHJfcmVmPF9UcDE+KCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBhdXRvX3B0cl9yZWY8X1RwMT4odGhpcy0+cmVsZWFzZSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBvcGVyYXRvciBhdXRvX3B0cjxfVHAxPigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gYXV0b19wdHI8X1RwMT4odGhpcy0+cmVsZWFzZSgpKTsgfQorICAgIH0gX0dMSUJDWFhfREVQUkVDQVRFRDsKKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDU0MS4gc2hhcmVkX3B0ciB0ZW1wbGF0ZSBhc3NpZ25tZW50IGFuZCB2b2lkCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBhdXRvX3B0cjx2b2lkPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHZvaWQgZWxlbWVudF90eXBlOworICAgIH0gX0dMSUJDWFhfREVQUkVDQVRFRDsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0JBQ0tXQVJEX0FVVE9fUFRSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvYmFja3dhcmRfd2FybmluZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9iYWNrd2FyZF93YXJuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZmYwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvYmFja3dhcmRfd2FybmluZy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJhY2t3YXJkL2JhY2t3YXJkX3dhcm5pbmcuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9CQUNLV0FSRF9XQVJOSU5HX0gKKyNkZWZpbmUgX0JBQ0tXQVJEX0JBQ0tXQVJEX1dBUk5JTkdfSCAxCisKKyNpZmRlZiBfX0RFUFJFQ0FURUQKKyN3YXJuaW5nIFwKKyAgVGhpcyBmaWxlIGluY2x1ZGVzIGF0IGxlYXN0IG9uZSBkZXByZWNhdGVkIG9yIGFudGlxdWF0ZWQgaGVhZGVyIHdoaWNoIFwKKyAgbWF5IGJlIHJlbW92ZWQgd2l0aG91dCBmdXJ0aGVyIG5vdGljZSBhdCBhIGZ1dHVyZSBkYXRlLiBQbGVhc2UgdXNlIGEgXAorICBub24tZGVwcmVjYXRlZCBpbnRlcmZhY2Ugd2l0aCBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkgaW5zdGVhZC4gRm9yIGEgXAorICBsaXN0aW5nIG9mIHJlcGxhY2VtZW50IGhlYWRlcnMgYW5kIGludGVyZmFjZXMsIGNvbnN1bHQgdGhlIGZpbGUgXAorICBiYWNrd2FyZF93YXJuaW5nLmguIFRvIGRpc2FibGUgdGhpcyB3YXJuaW5nIHVzZSAtV25vLWRlcHJlY2F0ZWQuCisKKy8qCisgIEEgbGlzdCBvZiB2YWxpZCByZXBsYWNlbWVudHMgaXMgYXMgZm9sbG93czoKKworICBVc2U6CQkJCQlJbnN0ZWFkIG9mOgorICA8c3N0cmVhbT4sIGJhc2ljX3N0cmluZ2J1ZgkgICAJPHN0cnN0cmVhbT4sIHN0cnN0cmVhbWJ1ZgorICA8c3N0cmVhbT4sIGJhc2ljX2lzdHJpbmdzdHJlYW0JPHN0cnN0cmVhbT4sIGlzdHJzdHJlYW0KKyAgPHNzdHJlYW0+LCBiYXNpY19vc3RyaW5nc3RyZWFtCTxzdHJzdHJlYW0+LCBvc3Ryc3RyZWFtCisgIDxzc3RyZWFtPiwgYmFzaWNfc3RyaW5nc3RyZWFtCQk8c3Ryc3RyZWFtPiwgc3Ryc3RyZWFtCisgIDx1bm9yZGVyZWRfc2V0PiwgdW5vcmRlcmVkX3NldCAgICAgCTxleHQvaGFzaF9zZXQ+LCBoYXNoX3NldAorICA8dW5vcmRlcmVkX3NldD4sIHVub3JkZXJlZF9tdWx0aXNldAk8ZXh0L2hhc2hfc2V0PiwgaGFzaF9tdWx0aXNldAorICA8dW5vcmRlcmVkX21hcD4sIHVub3JkZXJlZF9tYXAJPGV4dC9oYXNoX21hcD4sIGhhc2hfbWFwCisgIDx1bm9yZGVyZWRfbWFwPiwgdW5vcmRlcmVkX211bHRpbWFwCTxleHQvaGFzaF9tYXA+LCBoYXNoX211bHRpbWFwCisgIDxmdW5jdGlvbmFsPiwgYmluZAkJCTxmdW5jdGlvbmFsPiwgYmluZGVyMXN0CisgIDxmdW5jdGlvbmFsPiwgYmluZAkJCTxmdW5jdGlvbmFsPiwgYmluZGVyMm5kCisgIDxmdW5jdGlvbmFsPiwgYmluZAkJCTxmdW5jdGlvbmFsPiwgYmluZDFzdAorICA8ZnVuY3Rpb25hbD4sIGJpbmQJCQk8ZnVuY3Rpb25hbD4sIGJpbmQybmQKKyAgPG1lbW9yeT4sIHVuaXF1ZV9wdHIgICAgICAgCQk8bWVtb3J5PiwgYXV0b19wdHIKKyovCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvYmluZGVycy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9iaW5kZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4YjU2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvYmluZGVycy5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBGdW5jdG9yIGltcGxlbWVudGF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9iaW5kZXJzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmdW5jdGlvbmFsfQorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0JJTkRFUlNfSAorI2RlZmluZSBfQkFDS1dBUkRfQklOREVSU19IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIDIwLjMuNiBiaW5kZXJzCisgIC8qKiBAZGVmZ3JvdXAgYmluZGVycyBCaW5kZXIgQ2xhc3NlcworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgQmluZGVycyB0dXJuIGZ1bmN0aW9ucy9mdW5jdG9ycyB3aXRoIHR3byBhcmd1bWVudHMgaW50byBmdW5jdG9ycworICAgKiAgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCwgc3RvcmluZyBhbiBhcmd1bWVudCB0byBiZSBhcHBsaWVkIGxhdGVyLgorICAgKiAgRm9yIGV4YW1wbGUsIGEgdmFyaWFibGUgQGMgQiBvZiB0eXBlIEBjIGJpbmRlcjFzdCBpcyBjb25zdHJ1Y3RlZAorICAgKiAgZnJvbSBhIGZ1bmN0b3IgQGMgZiBhbmQgYW4gYXJndW1lbnQgQGMgeC4gTGF0ZXIsIEIncyBAYworICAgKiAgb3BlcmF0b3IoKSBpcyBjYWxsZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCBAYyB5LiBUaGUgcmV0dXJuCisgICAqICB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgQGMgZih4LHkpLiBAYyBCIGNhbiBiZSBAYSBjYWxsZWQgd2l0aAorICAgKiAgdmFyaW91cyBhcmd1bWVudHMgKHkxLCB5MiwgLi4uKSBhbmQgd2lsbCBpbiB0dXJuIGNhbGwgQGMKKyAgICogIGYoeCx5MSksIEBjIGYoeCx5MiksIC4uLgorICAgKgorICAgKiAgVGhlIGZ1bmN0aW9uIEBjIGJpbmQxc3QgaXMgcHJvdmlkZWQgdG8gc2F2ZSBzb21lIHR5cGluZy4gSXQgdGFrZXMgdGhlCisgICAqICBmdW5jdGlvbiBhbmQgYW4gYXJndW1lbnQgYXMgcGFyYW1ldGVycywgYW5kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YKKyAgICogIEBjIGJpbmRlcjFzdC4KKyAgICoKKyAgICogIFRoZSB0eXBlIEBjIGJpbmRlcjJuZCBhbmQgaXRzIGNyZWF0b3IgZnVuY3Rpb24gQGMgYmluZDJuZCBkbyB0aGUgc2FtZQorICAgKiAgdGhpbmcsIGJ1dCB0aGUgc3RvcmVkIGFyZ3VtZW50IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBpbnN0ZWFkCisgICAqICBvZiB0aGUgZmlyc3QsIGUuZy4sIEBjIGJpbmQybmQoc3RkOjptaW51czxmbG9hdD4sMS4zKSB3aWxsIGNyZWF0ZSBhCisgICAqICBmdW5jdG9yIHdob3NlIEBjIG9wZXJhdG9yKCkgYWNjZXB0cyBhIGZsb2F0aW5nLXBvaW50IG51bWJlciwgc3VidHJhY3RzCisgICAqICAxLjMgZnJvbSBpdCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gKElmIEBjIGJpbmQxc3QgaGFkIGJlZW4gdXNlZCwKKyAgICogIHRoZSBmdW5jdG9yIHdvdWxkIHBlcmZvcm0gPGVtPjEuMyAtIHg8L2VtPiBpbnN0ZWFkLgorICAgKgorICAgKiAgQ3JlYXRvci13cmFwcGVyIGZ1bmN0aW9ucyBsaWtlIEBjIGJpbmQxc3QgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW4KKyAgICogIGNhbGxpbmcgYWxnb3JpdGhtcy4gVGhlaXIgcmV0dXJuIHZhbHVlcyB3aWxsIGJlIHRlbXBvcmFyeSBvYmplY3RzLgorICAgKiAgKFRoZSBnb2FsIGlzIHRvIG5vdCByZXF1aXJlIHlvdSB0byB0eXBlIG5hbWVzIGxpa2UKKyAgICogIEBjIHN0ZDo6YmluZGVyMXN0PHN0ZDo6cGx1czxpbnQ+PiBmb3IgZGVjbGFyaW5nIGEgdmFyaWFibGUgdG8gaG9sZCB0aGUKKyAgICogIHJldHVybiB2YWx1ZSBmcm9tIEBjIGJpbmQxc3Qoc3RkOjpwbHVzPGludD4sNSkuCisgICAqCisgICAqICBUaGVzZSBiZWNvbWUgbW9yZSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBjb21wb3NpdGlvbiBmdW5jdGlvbnMuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYmluZGVycyBiaW5kZXIgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbj4KKyAgICBjbGFzcyBiaW5kZXIxc3QKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKKwkJCSAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbiBvcDsKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBiaW5kZXIxc3QoY29uc3QgX09wZXJhdGlvbiYgX194LAorCQljb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3kpCisgICAgICA6IG9wKF9feCksIHZhbHVlKF9feSkgeyB9CisKKyAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBvcCh2YWx1ZSwgX194KTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMDkuICBNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkodHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG9wKHZhbHVlLCBfX3gpOyB9CisgICAgfSBfR0xJQkNYWF9ERVBSRUNBVEVEOworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGJpbmRlcnMgYmluZGVyIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PcGVyYXRpb24sIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYmluZGVyMXN0PF9PcGVyYXRpb24+CisgICAgYmluZDFzdChjb25zdCBfT3BlcmF0aW9uJiBfX2ZuLCBjb25zdCBfVHAmIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX0FyZzFfdHlwZTsKKyAgICAgIHJldHVybiBiaW5kZXIxc3Q8X09wZXJhdGlvbj4oX19mbiwgX0FyZzFfdHlwZShfX3gpKTsKKyAgICB9CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYmluZGVycyBiaW5kZXIgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbj4KKyAgICBjbGFzcyBiaW5kZXIybmQKKyAgICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlLAorCQkJICAgIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3BlcmF0aW9uIG9wOworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBiaW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LAorCQljb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX195KQorICAgICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHsgfQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uOjpyZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBvcChfX3gsIHZhbHVlKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMDkuICBNaXNzaW5nIGJpbmRlcnMgZm9yIG5vbi1jb25zdCBzZXF1ZW5jZSBlbGVtZW50cworICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkodHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gb3AoX194LCB2YWx1ZSk7IH0KKyAgICB9IF9HTElCQ1hYX0RFUFJFQ0FURUQ7CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYmluZGVycyBiaW5kZXIgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09wZXJhdGlvbiwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBiaW5kZXIybmQ8X09wZXJhdGlvbj4KKyAgICBiaW5kMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9fZm4sIGNvbnN0IF9UcCYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgX0FyZzJfdHlwZTsKKyAgICAgIHJldHVybiBiaW5kZXIybmQ8X09wZXJhdGlvbj4oX19mbiwgX0FyZzJfdHlwZShfX3gpKTsKKyAgICB9IAorICAvKiogQH0gICovCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9CQUNLV0FSRF9CSU5ERVJTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvaGFzaF9mdW4uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvaGFzaF9mdW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZlYjczCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9oYXNoX2Z1bi5oCkBAIC0wLDAgKzEsMTcxIEBACisvLyAnc3RydWN0IGhhc2gnIGZyb20gU0dJIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2hfZnVuLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0hBU0hfRlVOX0gKKyNkZWZpbmUgX0JBQ0tXQVJEX0hBU0hfRlVOX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXk+CisgICAgc3RydWN0IGhhc2ggeyB9OworCisgIGlubGluZSBzaXplX3QKKyAgX19zdGxfaGFzaF9zdHJpbmcoY29uc3QgY2hhciogX19zKQorICB7CisgICAgdW5zaWduZWQgbG9uZyBfX2ggPSAwOworICAgIGZvciAoIDsgKl9fczsgKytfX3MpCisgICAgICBfX2ggPSA1ICogX19oICsgKl9fczsKKyAgICByZXR1cm4gc2l6ZV90KF9faCk7CisgIH0KKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8Y2hhcio+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc3RsX2hhc2hfc3RyaW5nKF9fcyk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxjb25zdCBjaGFyKj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgY2hhciogX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gX19zdGxfaGFzaF9zdHJpbmcoX19zKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGNoYXI+CisgICAgeyAKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjaGFyIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHVuc2lnbmVkIGNoYXI+CisgICAgeyAKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBjaGFyIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBjaGFyIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHNob3J0PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShzaG9ydCBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx1bnNpZ25lZCBzaG9ydD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkodW5zaWduZWQgc2hvcnQgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8aW50PgorICAgIHsgCisgICAgICBzaXplX3QgCisgICAgICBvcGVyYXRvcigpKGludCBfX3gpIGNvbnN0IAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8dW5zaWduZWQgaW50PgorICAgIHsgCisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkodW5zaWduZWQgaW50IF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGxvbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGxvbmcgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8dW5zaWduZWQgbG9uZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkodW5zaWduZWQgbG9uZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9oYXNoX21hcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvaGFzaF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjNDM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvaGFzaF9tYXAKQEAgLTAsMCArMSw2MDAgQEAKKy8vIEhhc2hpbmcgbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9oYXNoX21hcAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfSEFTSF9NQVAKKyNkZWZpbmUgX0JBQ0tXQVJEX0hBU0hfTUFQIDEKKworI2lmbmRlZiBfR0xJQkNYWF9QRVJNSVRfQkFDS1dBUkRfSEFTSAorI2luY2x1ZGUgImJhY2t3YXJkX3dhcm5pbmcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiYWNrd2FyZC9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6ZXF1YWxfdG87CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X1NlbGVjdDFzdDsKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4gPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9LZXk+LCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgaGFzaF9tYXAKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPHBhaXI8Y29uc3QgX0tleSwgX1RwPixfS2V5LCBfSGFzaEZuLAorCQkJX1NlbGVjdDFzdDxwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX21hcCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICAKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX21hcChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX21hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9tYXAmIF9faHMpCisgICAgICB7IF9NX2h0LnN3YXAoX19ocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0sxLCBjbGFzcyBfVDEsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09IChjb25zdCBoYXNoX21hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+JiwKKwkJICAgIGNvbnN0IGhhc2hfbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIF9UcCYKKyAgICAgIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZmluZF9vcl9pbnNlcnQodmFsdWVfdHlwZShfX2tleSwgX1RwKCkpKS5zZWNvbmQ7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuIF9faG0xLl9NX2h0ID09IF9faG0yLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gIShfX2htMSA9PSBfX2htMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IF9faG0xLnN3YXAoX19obTIpOyB9CisKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2hGbiA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGhhc2hfbXVsdGltYXAKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9LZXksIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0hhc2hGbiwgc2l6ZV90LCBfS2V5LCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9FcXVhbEtleSwgX0tleSwgX0tleSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisJCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPHBhaXI8Y29uc3QgX0tleSwgX1RwPiwgX0tleSwgX0hhc2hGbiwKKwkJCV9TZWxlY3Qxc3Q8cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICAgIF9IdDsKKworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgZGF0YV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfbXVsdGltYXAoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX211bHRpbWFwJiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9LMSwgY2xhc3MgX1QxLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICBjb25zdCBoYXNoX211bHRpbWFwPF9LMSwgX1QxLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLF9fbCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbF9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IRiwgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gX19obTEuX01faHQgPT0gX19obTIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IRiwgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSEYsIF9FcUtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyByZXR1cm4gIShfX2htMSA9PSBfX2htMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyBfX2htMS5zd2FwKF9faG0yKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfbWFwCisgIC8vIGFuZCBoYXNoX211bHRpbWFwLgorICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIAorCQkJCQkgICAgICBfRXFLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLAorCQkJCQkJICAgX0VxS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JhY2t3YXJkL2hhc2hfc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9oYXNoX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEwZmVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9oYXNoX3NldApAQCAtMCwwICsxLDU2OCBAQAorLy8gSGFzaGluZyBzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJhY2t3YXJkL2hhc2hfc2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9IQVNIX1NFVAorI2RlZmluZSBfQkFDS1dBUkRfSEFTSF9TRVQgMQorCisjaWZuZGVmIF9HTElCQ1hYX1BFUk1JVF9CQUNLV0FSRF9IQVNICisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJhY2t3YXJkL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjplcXVhbF90bzsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfSWRlbnRpdHk7CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiAgPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgaGFzaF9zZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9WYWx1ZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZjbiwgc2l6ZV90LCBfVmFsdWUsIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfVmFsdWUsIF9WYWx1ZSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLCBfSWRlbnRpdHk8X1ZhbHVlPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfc2V0KCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX3NldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfc2V0JiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IRiwgY2xhc3MgX0VxSywgY2xhc3MgX0FsPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJcGFpcjx0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yLCBib29sPiBfX3AgPSBfTV9odC5pbnNlcnRfdW5pcXVlKF9fb2JqKTsKKwlyZXR1cm4gcGFpcjxpdGVyYXRvcixib29sPihfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X3VuaXF1ZShfX2YsIF9fbCk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlwYWlyPHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IsIGJvb2w+IF9fcAorCSAgPSBfTV9odC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsKKwlyZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7cmV0dXJuIF9NX2h0LmVyYXNlKF9fa2V5KTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01faHQuY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9faGludCkKKyAgICAgIHsgX01faHQucmVzaXplKF9faGludCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuIF9faHMxLl9NX2h0ID09IF9faHMyLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gIShfX2hzMSA9PSBfX2hzMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfc2V0PF9WYWwsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSBoYXNoX3NldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IF9faHMxLnN3YXAoX19oczIpOyB9CisKKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsCisJICAgY2xhc3MgX0hhc2hGY24gPSBoYXNoPF9WYWx1ZT4sCisJICAgY2xhc3MgX0VxdWFsS2V5ID0gZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgaGFzaF9tdWx0aXNldAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1ZhbHVlLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9IYXNoRmNuLCBzaXplX3QsIF9WYWx1ZSwgX1VuYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfRXF1YWxLZXksIF9WYWx1ZSwgX1ZhbHVlLCBfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCkKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0hhc2hGY24sIF9JZGVudGl0eTxfVmFsdWU+LAorCQkJX0VxdWFsS2V5LCBfQWxsb2M+IF9IdDsKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorICAgICAgCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorICAgICAgCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tdWx0aXNldCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uKQorICAgICAgOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aXNldChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisgICAgICAKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkge30KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uKQorCTogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmKQorCTogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9zaXplKCk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW1wdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbXVsdGlzZXQmIGhzKQorICAgICAgeyBfTV9odC5zd2FwKGhzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbChfX29iaik7IH0KKyAgCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9ub3Jlc2l6ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmluc2VydF9lcXVhbF9ub3Jlc2l6ZShfX29iaik7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZmluZChfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5jb3VudChfX2tleSk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lcXVhbF9yYW5nZShfX2tleSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyBfTV9odC5lcmFzZShfX2l0KTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lm1heF9idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVsZW1zX2luX2J1Y2tldChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZWxlbXNfaW5fYnVja2V0KF9fbik7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiBfX2hzMS5fTV9odCA9PSBfX2hzMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiAhKF9faHMxID09IF9faHMyKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgaGFzaF9tdWx0aXNldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IF9faHMxLnN3YXAoX19oczIpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNwZWNpYWxpemF0aW9uIG9mIGluc2VydF9pdGVyYXRvciBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgaGFzaF9zZXQKKyAgLy8gYW5kIGhhc2hfbXVsdGlzZXQuCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcjxfX2dudV9jeHg6Omhhc2hfc2V0PF9WYWx1ZSwgX0hhc2hGY24sCisJCQkJCSAgICAgIF9FcXVhbEtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgb3V0cHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCkKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gsIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5pbnNlcnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX211bHRpc2V0PF9WYWx1ZSwgX0hhc2hGY24sCisJCQkJCQkgICBfRXF1YWxLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0NvbnRhaW5lcjsKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYmFja3dhcmQvaGFzaHRhYmxlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JhY2t3YXJkL2hhc2h0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNGQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JhY2t3YXJkL2hhc2h0YWJsZS5oCkBAIC0wLDAgKzEsMTE2OCBAQAorLy8gSGFzaHRhYmxlIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgY29udGFpbmVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9oYXNodGFibGUuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfSEFTSFRBQkxFX0gKKyNkZWZpbmUgX0JBQ0tXQVJEX0hBU0hUQUJMRV9IIDEKKworLy8gSGFzaHRhYmxlIGNsYXNzLCB1c2VkIHRvIGltcGxlbWVudCB0aGUgaGFzaGVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMKKy8vIGhhc2hfc2V0LCBoYXNoX21hcCwgaGFzaF9tdWx0aXNldCwgYW5kIGhhc2hfbXVsdGltYXAuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8YmFja3dhcmQvaGFzaF9mdW4uaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKyAgdXNpbmcgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgc3RkOjppbnB1dF9pdGVyYXRvcl90YWc7CisgIHVzaW5nIHN0ZDo6X0NvbnN0cnVjdDsKKyAgdXNpbmcgc3RkOjpfRGVzdHJveTsKKyAgdXNpbmcgc3RkOjpkaXN0YW5jZTsKKyAgdXNpbmcgc3RkOjp2ZWN0b3I7CisgIHVzaW5nIHN0ZDo6cGFpcjsKKyAgdXNpbmcgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWw+CisgICAgc3RydWN0IF9IYXNodGFibGVfbm9kZQorICAgIHsKKyAgICAgIF9IYXNodGFibGVfbm9kZSogX01fbmV4dDsKKyAgICAgIF9WYWwgX01fdmFsOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FeHRyYWN0S2V5LCAKKwkgICBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWw+ID4KKyAgICBjbGFzcyBoYXNodGFibGU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IYXNoRmNuLAorCSAgIGNsYXNzIF9FeHRyYWN0S2V5LCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSGFzaEZjbiwKKwkgICBjbGFzcyBfRXh0cmFjdEtleSwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9IYXNodGFibGVfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSGFzaEZjbiwgX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBfSGFzaHRhYmxlOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSGFzaEZjbiwKKwkJCQkJX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9ub2RlPF9WYWw+IF9Ob2RlOworICAgICAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgX1ZhbCB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBfVmFsJiByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9WYWwqIHBvaW50ZXI7CisgICAgICAKKyAgICAgIF9Ob2RlKiBfTV9jdXI7CisgICAgICBfSGFzaHRhYmxlKiBfTV9odDsKKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcihfTm9kZSogX19uLCBfSGFzaHRhYmxlKiBfX3RhYikKKyAgICAgIDogX01fY3VyKF9fbiksIF9NX2h0KF9fdGFiKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcigpCisgICAgICA6IF9NX2N1cigwKSwgX01faHQoMCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ci0+X01fdmFsOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KKworICAgICAgaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCk7CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIF9faXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXIgPT0gX19pdC5fTV9jdXI7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgX19pdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1ciAhPSBfX2l0Ll9NX2N1cjsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgX0hhc2h0YWJsZTsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLF9LZXksX0hhc2hGY24sCisJCQkJICBfRXh0cmFjdEtleSxfRXF1YWxLZXksX0FsbG9jPgorICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSGFzaEZjbiwKKwkJCQkJX0V4dHJhY3RLZXksIF9FcXVhbEtleSwgX0FsbG9jPgorICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0hhc2h0YWJsZV9ub2RlPF9WYWw+IF9Ob2RlOworCisgICAgICB0eXBlZGVmIGZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWwmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbCogcG9pbnRlcjsKKyAgICAgIAorICAgICAgY29uc3QgX05vZGUqIF9NX2N1cjsKKyAgICAgIGNvbnN0IF9IYXNodGFibGUqIF9NX2h0OworCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Ob2RlKiBfX24sIGNvbnN0IF9IYXNodGFibGUqIF9fdGFiKQorICAgICAgOiBfTV9jdXIoX19uKSwgX01faHQoX190YWIpIHsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKCkgeyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgICAgICA6IF9NX2N1cihfX2l0Ll9NX2N1ciksIF9NX2h0KF9faXQuX01faHQpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXItPl9NX3ZhbDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2l0KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyID09IF9faXQuX01fY3VyOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXIgIT0gX19pdC5fTV9jdXI7IH0KKyAgICB9OworCisgIC8vIE5vdGU6IGFzc3VtZXMgbG9uZyBpcyBhdCBsZWFzdCAzMiBiaXRzLgorICBlbnVtIHsgX1NfbnVtX3ByaW1lcyA9IDI5IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByaW1lVHlwZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9wcmltZV9saXN0CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IF9QcmltZVR5cGUgIF9fc3RsX3ByaW1lX2xpc3RbX1NfbnVtX3ByaW1lc107CisKKyAgICAgIHN0YXRpYyBjb25zdCBfUHJpbWVUeXBlKgorICAgICAgX1NfZ2V0X3ByaW1lX2xpc3QoKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmltZVR5cGU+IGNvbnN0IF9QcmltZVR5cGUKKyAgX0hhc2h0YWJsZV9wcmltZV9saXN0PF9QcmltZVR5cGU+OjpfX3N0bF9wcmltZV9saXN0W19TX251bV9wcmltZXNdID0KKyAgICB7CisgICAgICA1dWwsICAgICAgICAgIDUzdWwsICAgICAgICAgOTd1bCwgICAgICAgICAxOTN1bCwgICAgICAgMzg5dWwsCisgICAgICA3Njl1bCwgICAgICAgIDE1NDN1bCwgICAgICAgMzA3OXVsLCAgICAgICA2MTUxdWwsICAgICAgMTIyODl1bCwKKyAgICAgIDI0NTkzdWwsICAgICAgNDkxNTd1bCwgICAgICA5ODMxN3VsLCAgICAgIDE5NjYxM3VsLCAgICAzOTMyNDF1bCwKKyAgICAgIDc4NjQzM3VsLCAgICAgMTU3Mjg2OXVsLCAgICAzMTQ1NzM5dWwsICAgIDYyOTE0Njl1bCwgICAxMjU4MjkxN3VsLAorICAgICAgMjUxNjU4NDN1bCwgICA1MDMzMTY1M3VsLCAgIDEwMDY2MzMxOXVsLCAgMjAxMzI2NjExdWwsIDQwMjY1MzE4OXVsLAorICAgICAgODA1MzA2NDU3dWwsICAxNjEwNjEyNzQxdWwsIDMyMjEyMjU0NzN1bCwgNDI5NDk2NzI5MXVsCisgICAgfTsKKworIHRlbXBsYXRlPGNsYXNzIF9QcmltZVR5cGU+IGlubGluZSBjb25zdCBfUHJpbWVUeXBlKgorIF9IYXNodGFibGVfcHJpbWVfbGlzdDxfUHJpbWVUeXBlPjo6X1NfZ2V0X3ByaW1lX2xpc3QoKQorIHsKKyAgIHJldHVybiBfX3N0bF9wcmltZV9saXN0OworIH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBfX3N0bF9uZXh0X3ByaW1lKHVuc2lnbmVkIGxvbmcgX19uKQorICB7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZyogX19maXJzdCA9IF9IYXNodGFibGVfcHJpbWVfbGlzdDx1bnNpZ25lZCBsb25nPjo6X1NfZ2V0X3ByaW1lX2xpc3QoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX2xhc3QgPSBfX2ZpcnN0ICsgKGludClfU19udW1fcHJpbWVzOworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19maXJzdCwgX19sYXN0LCBfX24pOworICAgIHJldHVybiBwb3MgPT0gX19sYXN0ID8gKihfX2xhc3QgLSAxKSA6ICpwb3M7CisgIH0KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIG9wZXJhdG9yPT0uICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsCisJICAgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIGNsYXNzIGhhc2h0YWJsZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwKKwkgICBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+JiBfX2h0MSwKKwkgICAgICAgY29uc3QgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+JiBfX2h0Mik7CisKKyAgLy8gSGFzaHRhYmxlcyBoYW5kbGUgYWxsb2NhdG9ycyBhIGJpdCBkaWZmZXJlbnRseSB0aGFuIG90aGVyCisgIC8vIGNvbnRhaW5lcnMgZG8uICBJZiB3ZSdyZSB1c2luZyBzdGFuZGFyZC1jb25mb3JtaW5nIGFsbG9jYXRvcnMsIHRoZW4KKyAgLy8gYSBoYXNodGFibGUgdW5jb25kaXRpb25hbGx5IGhhcyBhIG1lbWJlciB2YXJpYWJsZSB0byBob2xkIGl0cworICAvLyBhbGxvY2F0b3IsIGV2ZW4gaWYgaXQgc28gaGFwcGVucyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlCisgIC8vIGFsbG9jYXRvciB0eXBlIGFyZSBpZGVudGljYWwuICBUaGlzIGlzIGJlY2F1c2UsIGZvciBoYXNodGFibGVzLAorICAvLyB0aGlzIGV4dHJhIHN0b3JhZ2UgaXMgbmVnbGlnaWJsZS4gIEFkZGl0aW9uYWxseSwgYSBiYXNlIGNsYXNzCisgIC8vIHdvdWxkbid0IHNlcnZlIGFueSBvdGhlciBwdXJwb3NlczsgaXQgd291bGRuJ3QsIGZvciBleGFtcGxlLAorICAvLyBzaW1wbGlmeSB0aGUgZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUuICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hhc2hGY24sCisJICAgY2xhc3MgX0V4dHJhY3RLZXksIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIGhhc2h0YWJsZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9LZXkga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9WYWwgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0hhc2hGY24gaGFzaGVyOworICAgICAgdHlwZWRlZiBfRXF1YWxLZXkga2V5X2VxdWFsOworCisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2hhc2g7IH0KKworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXF1YWxzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX25vZGU8X1ZhbD4gX05vZGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGVfYWxsb2NhdG9yOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfTm9kZT46Om90aGVyIF9Ob2RlX0FsbG9jOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfTm9kZSo+OjpvdGhlciBfTm9kZXB0cl9BbGxvYzsKKyAgICAgIHR5cGVkZWYgdmVjdG9yPF9Ob2RlKiwgX05vZGVwdHJfQWxsb2M+IF9WZWN0b3JfdHlwZTsKKworICAgICAgX05vZGVfQWxsb2MgX01fbm9kZV9hbGxvY2F0b3I7CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fcHV0X25vZGUoX05vZGUqIF9fcCkKKyAgICAgIHsgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgaGFzaGVyICAgICAgICAgICAgICAgIF9NX2hhc2g7CisgICAgICBrZXlfZXF1YWwgICAgICAgICAgICAgX01fZXF1YWxzOworICAgICAgX0V4dHJhY3RLZXkgICAgICAgICAgIF9NX2dldF9rZXk7CisgICAgICBfVmVjdG9yX3R5cGUgICAgICAgICAgX01fYnVja2V0czsKKyAgICAgIHNpemVfdHlwZSAgICAgICAgICAgICBfTV9udW1fZWxlbWVudHM7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hhc2hGY24sIF9FeHRyYWN0S2V5LAorCQkJCSAgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwKKwkJCQkJX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBmcmllbmQgc3RydWN0CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwgX0VxdWFsS2V5LCBfQWxsb2M+OworCisgICAgICBmcmllbmQgc3RydWN0CisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IYXNoRmNuLCBfRXh0cmFjdEtleSwKKwkJCQlfRXF1YWxLZXksIF9BbGxvYz47CisKKyAgICBwdWJsaWM6CisgICAgICBoYXNodGFibGUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX0hhc2hGY24mIF9faGYsCisJCWNvbnN0IF9FcXVhbEtleSYgX19lcWwsIGNvbnN0IF9FeHRyYWN0S2V5JiBfX2V4dCwKKwkJY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX25vZGVfYWxsb2NhdG9yKF9fYSksIF9NX2hhc2goX19oZiksIF9NX2VxdWFscyhfX2VxbCksCisJX01fZ2V0X2tleShfX2V4dCksIF9NX2J1Y2tldHMoX19hKSwgX01fbnVtX2VsZW1lbnRzKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfYnVja2V0cyhfX24pOyB9CisKKyAgICAgIGhhc2h0YWJsZShzaXplX3R5cGUgX19uLCBjb25zdCBfSGFzaEZjbiYgX19oZiwKKwkJY29uc3QgX0VxdWFsS2V5JiBfX2VxbCwKKwkJY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX25vZGVfYWxsb2NhdG9yKF9fYSksIF9NX2hhc2goX19oZiksIF9NX2VxdWFscyhfX2VxbCksCisJX01fZ2V0X2tleShfRXh0cmFjdEtleSgpKSwgX01fYnVja2V0cyhfX2EpLCBfTV9udW1fZWxlbWVudHMoMCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9idWNrZXRzKF9fbik7IH0KKworICAgICAgaGFzaHRhYmxlKGNvbnN0IGhhc2h0YWJsZSYgX19odCkKKyAgICAgIDogX01fbm9kZV9hbGxvY2F0b3IoX19odC5nZXRfYWxsb2NhdG9yKCkpLCBfTV9oYXNoKF9faHQuX01faGFzaCksCisgICAgICBfTV9lcXVhbHMoX19odC5fTV9lcXVhbHMpLCBfTV9nZXRfa2V5KF9faHQuX01fZ2V0X2tleSksCisgICAgICBfTV9idWNrZXRzKF9faHQuZ2V0X2FsbG9jYXRvcigpKSwgX01fbnVtX2VsZW1lbnRzKDApCisgICAgICB7IF9NX2NvcHlfZnJvbShfX2h0KTsgfQorCisgICAgICBoYXNodGFibGUmCisgICAgICBvcGVyYXRvcj0gKGNvbnN0IGhhc2h0YWJsZSYgX19odCkKKyAgICAgIHsKKwlpZiAoJl9faHQgIT0gdGhpcykKKwkgIHsKKwkgICAgY2xlYXIoKTsKKwkgICAgX01faGFzaCA9IF9faHQuX01faGFzaDsKKwkgICAgX01fZXF1YWxzID0gX19odC5fTV9lcXVhbHM7CisJICAgIF9NX2dldF9rZXkgPSBfX2h0Ll9NX2dldF9rZXk7CisJICAgIF9NX2NvcHlfZnJvbShfX2h0KTsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIH5oYXNodGFibGUoKQorICAgICAgeyBjbGVhcigpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9udW1fZWxlbWVudHM7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaHRhYmxlJiBfX2h0KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9oYXNoLCBfX2h0Ll9NX2hhc2gpOworCXN0ZDo6c3dhcChfTV9lcXVhbHMsIF9faHQuX01fZXF1YWxzKTsKKwlzdGQ6OnN3YXAoX01fZ2V0X2tleSwgX19odC5fTV9nZXRfa2V5KTsKKwlfTV9idWNrZXRzLnN3YXAoX19odC5fTV9idWNrZXRzKTsKKwlzdGQ6OnN3YXAoX01fbnVtX2VsZW1lbnRzLCBfX2h0Ll9NX251bV9lbGVtZW50cyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7CisJZm9yIChzaXplX3R5cGUgX19uID0gMDsgX19uIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19uKQorCSAgaWYgKF9NX2J1Y2tldHNbX19uXSkKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSwgdGhpcyk7CisJcmV0dXJuIGVuZCgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKDAsIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7CisJZm9yIChzaXplX3R5cGUgX19uID0gMDsgX19uIDwgX01fYnVja2V0cy5zaXplKCk7ICsrX19uKQorCSAgaWYgKF9NX2J1Y2tldHNbX19uXSkKKwkgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSwgdGhpcyk7CisJcmV0dXJuIGVuZCgpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDAsIHRoaXMpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9WbCwgY2xhc3MgX0t5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLAorCQljbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaHRhYmxlPF9WbCwgX0t5LCBfSEYsIF9FeCwgX0VxLCBfQWw+JiwKKwkJICAgY29uc3QgaGFzaHRhYmxlPF9WbCwgX0t5LCBfSEYsIF9FeCwgX0VxLCBfQWw+Jik7CisKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9idWNrZXRzLnNpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0hhc2h0YWJsZV9wcmltZV9saXN0PHVuc2lnbmVkIGxvbmc+OjoKKyAgICAgICAgICAgICAgIF9TX2dldF9wcmltZV9saXN0KClbKGludClfU19udW1fcHJpbWVzIC0gMV07CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX2J1Y2tldCkgY29uc3QKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXN1bHQgPSAwOworCWZvciAoX05vZGUqIF9fbiA9IF9NX2J1Y2tldHNbX19idWNrZXRdOyBfX247IF9fbiA9IF9fbi0+X01fbmV4dCkKKwkgIF9fcmVzdWx0ICs9IDE7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlyZXNpemUoX01fbnVtX2VsZW1lbnRzICsgMSk7CisJcmV0dXJuIGluc2VydF91bmlxdWVfbm9yZXNpemUoX19vYmopOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2VxdWFsKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXJlc2l6ZShfTV9udW1fZWxlbWVudHMgKyAxKTsKKwlyZXR1cm4gaW5zZXJ0X2VxdWFsX25vcmVzaXplKF9fb2JqKTsKKyAgICAgIH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydF91bmlxdWVfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopOworCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBpbnNlcnRfdW5pcXVlKF9fZiwgX19sLCBfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZikpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydF9lcXVhbChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKyAgICAgICAgeyBpbnNlcnRfZXF1YWwoX19mLCBfX2wsIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19mKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgICB7CisJICBmb3IgKCA7IF9fZiAhPSBfX2w7ICsrX19mKQorCSAgICBpbnNlcnRfdW5pcXVlKCpfX2YpOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0X2VxdWFsKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgZm9yICggOyBfX2YgIT0gX19sOyArK19fZikKKwkgICAgaW5zZXJ0X2VxdWFsKCpfX2YpOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfdW5pcXVlKF9Gb3J3YXJkSXRlcmF0b3IgX19mLCBfRm9yd2FyZEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIHNpemVfdHlwZSBfX24gPSBkaXN0YW5jZShfX2YsIF9fbCk7CisJICByZXNpemUoX01fbnVtX2VsZW1lbnRzICsgX19uKTsKKwkgIGZvciAoIDsgX19uID4gMDsgLS1fX24sICsrX19mKQorCSAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKCpfX2YpOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnRfZXF1YWwoX0ZvcndhcmRJdGVyYXRvciBfX2YsIF9Gb3J3YXJkSXRlcmF0b3IgX19sLAorCQkgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19uID0gZGlzdGFuY2UoX19mLCBfX2wpOworCSAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIF9fbik7CisJICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZikKKwkgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKCpfX2YpOworCX0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBmaW5kX29yX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCV9Ob2RlKiBfX2ZpcnN0OworCWZvciAoX19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgICAgIF9fZmlyc3QgJiYgIV9NX2VxdWFscyhfTV9nZXRfa2V5KF9fZmlyc3QtPl9NX3ZhbCksIF9fa2V5KTsKKwkgICAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCSAgeyB9CisJcmV0dXJuIGl0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKwljb25zdCBfTm9kZSogX19maXJzdDsKKwlmb3IgKF9fZmlyc3QgPSBfTV9idWNrZXRzW19fbl07CisJICAgICBfX2ZpcnN0ICYmICFfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSk7CisJICAgICBfX2ZpcnN0ID0gX19maXJzdC0+X01fbmV4dCkKKwkgIHsgfQorCXJldHVybiBjb25zdF9pdGVyYXRvcihfX2ZpcnN0LCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKwlzaXplX3R5cGUgX19yZXN1bHQgPSAwOworCQorCWZvciAoY29uc3QgX05vZGUqIF9fY3VyID0gX01fYnVja2V0c1tfX25dOyBfX2N1cjsKKwkgICAgIF9fY3VyID0gX19jdXItPl9NX25leHQpCisJICBpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9fa2V5KSkKKwkgICAgKytfX3Jlc3VsdDsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KTsKKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0OworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UoY29uc3QgY29uc3RfaXRlcmF0b3ImIF9faXQpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbnVtX2VsZW1lbnRzX2hpbnQpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbmV4dF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfX3N0bF9uZXh0X3ByaW1lKF9fbik7IH0KKworICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbl9idWNrZXRzID0gX01fbmV4dF9zaXplKF9fbik7CisJX01fYnVja2V0cy5yZXNlcnZlKF9fbl9idWNrZXRzKTsKKwlfTV9idWNrZXRzLmluc2VydChfTV9idWNrZXRzLmVuZCgpLCBfX25fYnVja2V0cywgKF9Ob2RlKikgMCk7CisJX01fbnVtX2VsZW1lbnRzID0gMDsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9ia3RfbnVtX2tleShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ia3RfbnVtX2tleShfX2tleSwgX01fYnVja2V0cy5zaXplKCkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9NX2dldF9rZXkoX19vYmopKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2JrdF9udW1fa2V5KGNvbnN0IGtleV90eXBlJiBfX2tleSwgc2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2hhc2goX19rZXkpICUgX19uOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fYmt0X251bShjb25zdCB2YWx1ZV90eXBlJiBfX29iaiwgc2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2JrdF9udW1fa2V5KF9NX2dldF9rZXkoX19vYmopLCBfX24pOyB9CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fbmV3X25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJX05vZGUqIF9fbiA9IF9NX2dldF9ub2RlKCk7CisJX19uLT5fTV9uZXh0ID0gMDsKKwlfX3RyeQorCSAgeworCSAgICB0aGlzLT5nZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0KCZfX24tPl9NX3ZhbCwgX19vYmopOworCSAgICByZXR1cm4gX19uOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9wdXRfbm9kZShfX24pOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVsZXRlX25vZGUoX05vZGUqIF9fbikKKyAgICAgIHsKKwl0aGlzLT5nZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX19uLT5fTV92YWwpOworCV9NX3B1dF9ub2RlKF9fbik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2J1Y2tldChjb25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19maXJzdCwgX05vZGUqIF9fbGFzdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2J1Y2tldChjb25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19sYXN0KTsKKworICAgICAgdm9pZAorICAgICAgX01fY29weV9mcm9tKGNvbnN0IGhhc2h0YWJsZSYgX19odCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssCisJICAgIGNsYXNzIF9BbGw+CisgICAgX0hhc2h0YWJsZV9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+JgorICAgIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPjo6CisgICAgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgY29uc3QgX05vZGUqIF9fb2xkID0gX01fY3VyOworICAgICAgX01fY3VyID0gX01fY3VyLT5fTV9uZXh0OworICAgICAgaWYgKCFfTV9jdXIpCisJeworCSAgc2l6ZV90eXBlIF9fYnVja2V0ID0gX01faHQtPl9NX2JrdF9udW0oX19vbGQtPl9NX3ZhbCk7CisJICB3aGlsZSAoIV9NX2N1ciAmJiArK19fYnVja2V0IDwgX01faHQtPl9NX2J1Y2tldHMuc2l6ZSgpKQorCSAgICBfTV9jdXIgPSBfTV9odC0+X01fYnVja2V0c1tfX2J1Y2tldF07CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeEssIGNsYXNzIF9FcUssCisJICAgIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPgorICAgIF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbCwgX0tleSwgX0hGLCBfRXhLLCBfRXFLLCBfQWxsPjo6CisgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywKKwkgICAgY2xhc3MgX0FsbD4KKyAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPF9WYWwsIF9LZXksIF9IRiwgX0V4SywgX0VxSywgX0FsbD4mCisgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+OjoKKyAgICBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBjb25zdCBfTm9kZSogX19vbGQgPSBfTV9jdXI7CisgICAgICBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7CisgICAgICBpZiAoIV9NX2N1cikKKwl7CisJICBzaXplX3R5cGUgX19idWNrZXQgPSBfTV9odC0+X01fYmt0X251bShfX29sZC0+X01fdmFsKTsKKwkgIHdoaWxlICghX01fY3VyICYmICsrX19idWNrZXQgPCBfTV9odC0+X01fYnVja2V0cy5zaXplKCkpCisJICAgIF9NX2N1ciA9IF9NX2h0LT5fTV9idWNrZXRzW19fYnVja2V0XTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4SywgY2xhc3MgX0VxSywKKwkgICAgY2xhc3MgX0FsbD4KKyAgICBpbmxpbmUgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+CisgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcjxfVmFsLCBfS2V5LCBfSEYsIF9FeEssIF9FcUssIF9BbGw+OjoKKyAgICBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQxLAorCSAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjpfTm9kZSBfTm9kZTsKKworICAgICAgaWYgKF9faHQxLl9NX2J1Y2tldHMuc2l6ZSgpICE9IF9faHQyLl9NX2J1Y2tldHMuc2l6ZSgpKQorCXJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDwgX19odDEuX01fYnVja2V0cy5zaXplKCk7ICsrX19uKQorCXsKKwkgIF9Ob2RlKiBfX2N1cjEgPSBfX2h0MS5fTV9idWNrZXRzW19fbl07CisJICBfTm9kZSogX19jdXIyID0gX19odDIuX01fYnVja2V0c1tfX25dOworCSAgLy8gQ2hlY2sgc2FtZSBsZW5ndGggb2YgbGlzdHMKKwkgIGZvciAoOyBfX2N1cjEgJiYgX19jdXIyOworCSAgICAgICBfX2N1cjEgPSBfX2N1cjEtPl9NX25leHQsIF9fY3VyMiA9IF9fY3VyMi0+X01fbmV4dCkKKwkgICAgeyB9IAorCSAgaWYgKF9fY3VyMSB8fCBfX2N1cjIpCisJICAgIHJldHVybiBmYWxzZTsKKwkgIC8vIE5vdyBjaGVjayBvbmUncyBlbGVtZW50cyBhcmUgaW4gdGhlIG90aGVyCisJICBmb3IgKF9fY3VyMSA9IF9faHQxLl9NX2J1Y2tldHNbX19uXSA7IF9fY3VyMTsKKwkgICAgICAgX19jdXIxID0gX19jdXIxLT5fTV9uZXh0KQorCSAgICB7CisJICAgICAgYm9vbCBfZm91bmRfX2N1cjEgPSBmYWxzZTsKKwkgICAgICBmb3IgKF9fY3VyMiA9IF9faHQyLl9NX2J1Y2tldHNbX19uXTsKKwkJICAgX19jdXIyOyBfX2N1cjIgPSBfX2N1cjItPl9NX25leHQpCisJCXsKKwkJICBpZiAoX19jdXIxLT5fTV92YWwgPT0gX19jdXIyLT5fTV92YWwpCisJCSAgICB7CisJCSAgICAgIF9mb3VuZF9fY3VyMSA9IHRydWU7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgaWYgKCFfZm91bmRfX2N1cjEpCisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQxLAorCSAgICAgICBjb25zdCBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD4mIF9faHQyKQorICAgIHsgcmV0dXJuICEoX19odDEgPT0gX19odDIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXh0cmFjdCwgY2xhc3MgX0VxS2V5LAorCSAgICBjbGFzcyBfQWxsPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXh0cmFjdCwgX0VxS2V5LCBfQWxsPiYgX19odDEsCisJIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeHRyYWN0LCBfRXFLZXksIF9BbGw+JiBfX2h0MikKKyAgICB7IF9faHQxLnN3YXAoX19odDIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICBwYWlyPHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBpbnNlcnRfdW5pcXVlX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgCisgICAgICBmb3IgKF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3Q7IF9fY3VyOyBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX01fZ2V0X2tleShfX29iaikpKQorCSAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fY3VyLCB0aGlzKSwgZmFsc2UpOworICAgICAgCisgICAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisgICAgICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX3RtcDsKKyAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fdG1wLCB0aGlzKSwgdHJ1ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdHlwZW5hbWUgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjppdGVyYXRvcgorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgaW5zZXJ0X2VxdWFsX25vcmVzaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9ia3RfbnVtKF9fb2JqKTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgCisgICAgICBmb3IgKF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3Q7IF9fY3VyOyBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2N1ci0+X01fdmFsKSwgX01fZ2V0X2tleShfX29iaikpKQorCSAgeworCSAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisJICAgIF9fdG1wLT5fTV9uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgIF9fY3VyLT5fTV9uZXh0ID0gX190bXA7CisJICAgICsrX01fbnVtX2VsZW1lbnRzOworCSAgICByZXR1cm4gaXRlcmF0b3IoX190bXAsIHRoaXMpOworCSAgfQorCisgICAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisgICAgICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX3RtcDsKKyAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fdG1wLCB0aGlzKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OnJlZmVyZW5jZQorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZmluZF9vcl9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgeworICAgICAgcmVzaXplKF9NX251bV9lbGVtZW50cyArIDEpOworCisgICAgICBzaXplX3R5cGUgX19uID0gX01fYmt0X251bShfX29iaik7CisgICAgICBfTm9kZSogX19maXJzdCA9IF9NX2J1Y2tldHNbX19uXTsKKyAgICAgIAorICAgICAgZm9yIChfTm9kZSogX19jdXIgPSBfX2ZpcnN0OyBfX2N1cjsgX19jdXIgPSBfX2N1ci0+X01fbmV4dCkKKwlpZiAoX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9NX2dldF9rZXkoX19vYmopKSkKKwkgIHJldHVybiBfX2N1ci0+X01fdmFsOworICAgICAgCisgICAgICBfTm9kZSogX190bXAgPSBfTV9uZXdfbm9kZShfX29iaik7CisgICAgICBfX3RtcC0+X01fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX3RtcDsKKyAgICAgICsrX01fbnVtX2VsZW1lbnRzOworICAgICAgcmV0dXJuIF9fdG1wLT5fTV92YWw7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgcGFpcjx0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46Oml0ZXJhdG9yLAorCSB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46Oml0ZXJhdG9yPgorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgIHsKKyAgICAgIHR5cGVkZWYgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9QaWk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCisgICAgICBmb3IgKF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOyBfX2ZpcnN0OworCSAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCWlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSkpCisJICB7CisJICAgIGZvciAoX05vZGUqIF9fY3VyID0gX19maXJzdC0+X01fbmV4dDsgX19jdXI7CisJCSBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCSAgICAgIGlmICghX01fZXF1YWxzKF9NX2dldF9rZXkoX19jdXItPl9NX3ZhbCksIF9fa2V5KSkKKwkJcmV0dXJuIF9QaWkoaXRlcmF0b3IoX19maXJzdCwgdGhpcyksIGl0ZXJhdG9yKF9fY3VyLCB0aGlzKSk7CisJICAgIGZvciAoc2l6ZV90eXBlIF9fbSA9IF9fbiArIDE7IF9fbSA8IF9NX2J1Y2tldHMuc2l6ZSgpOyArK19fbSkKKwkgICAgICBpZiAoX01fYnVja2V0c1tfX21dKQorCQlyZXR1cm4gX1BpaShpdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwKKwkJCSAgICBpdGVyYXRvcihfTV9idWNrZXRzW19fbV0sIHRoaXMpKTsKKwkgICAgcmV0dXJuIF9QaWkoaXRlcmF0b3IoX19maXJzdCwgdGhpcyksIGVuZCgpKTsKKwkgIH0KKyAgICAgIHJldHVybiBfUGlpKGVuZCgpLCBlbmQoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgcGFpcjx0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OmNvbnN0X2l0ZXJhdG9yLAorCSB0eXBlbmFtZSBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OmNvbnN0X2l0ZXJhdG9yPgorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9QaWk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bV9rZXkoX19rZXkpOworCisgICAgICBmb3IgKGNvbnN0IF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOyBfX2ZpcnN0OworCSAgIF9fZmlyc3QgPSBfX2ZpcnN0LT5fTV9uZXh0KQorCXsKKwkgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSkpCisJICAgIHsKKwkgICAgICBmb3IgKGNvbnN0IF9Ob2RlKiBfX2N1ciA9IF9fZmlyc3QtPl9NX25leHQ7IF9fY3VyOworCQkgICBfX2N1ciA9IF9fY3VyLT5fTV9uZXh0KQorCQlpZiAoIV9NX2VxdWFscyhfTV9nZXRfa2V5KF9fY3VyLT5fTV92YWwpLCBfX2tleSkpCisJCSAgcmV0dXJuIF9QaWkoY29uc3RfaXRlcmF0b3IoX19maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX2N1ciwgdGhpcykpOworCSAgICAgIGZvciAoc2l6ZV90eXBlIF9fbSA9IF9fbiArIDE7IF9fbSA8IF9NX2J1Y2tldHMuc2l6ZSgpOyArK19fbSkKKwkJaWYgKF9NX2J1Y2tldHNbX19tXSkKKwkJICByZXR1cm4gX1BpaShjb25zdF9pdGVyYXRvcihfX2ZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19tXSwgdGhpcykpOworCSAgICAgIHJldHVybiBfUGlpKGNvbnN0X2l0ZXJhdG9yKF9fZmlyc3QsIHRoaXMpLCBlbmQoKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX1BpaShlbmQoKSwgZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHR5cGVuYW1lIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6c2l6ZV90eXBlCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9NX2JrdF9udW1fa2V5KF9fa2V5KTsKKyAgICAgIF9Ob2RlKiBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX25dOworICAgICAgX05vZGUqIF9fc2F2ZWRfc2xvdCA9IDA7CisgICAgICBzaXplX3R5cGUgX19lcmFzZWQgPSAwOworCisgICAgICBpZiAoX19maXJzdCkKKwl7CisJICBfTm9kZSogX19jdXIgPSBfX2ZpcnN0OworCSAgX05vZGUqIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgd2hpbGUgKF9fbmV4dCkKKwkgICAgeworCSAgICAgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX25leHQtPl9NX3ZhbCksIF9fa2V5KSkKKwkJeworCQkgIGlmICgmX01fZ2V0X2tleShfX25leHQtPl9NX3ZhbCkgIT0gJl9fa2V5KQorCQkgICAgeworCQkgICAgICBfX2N1ci0+X01fbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKwkJICAgICAgX01fZGVsZXRlX25vZGUoX19uZXh0KTsKKwkJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCSAgICAgICsrX19lcmFzZWQ7CisJCSAgICAgIC0tX01fbnVtX2VsZW1lbnRzOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgX19zYXZlZF9zbG90ID0gX19jdXI7CisJCSAgICAgIF9fY3VyID0gX19uZXh0OworCQkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIF9fY3VyID0gX19uZXh0OworCQkgIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCQl9CisJICAgIH0KKwkgIGlmIChfTV9lcXVhbHMoX01fZ2V0X2tleShfX2ZpcnN0LT5fTV92YWwpLCBfX2tleSkpCisJICAgIHsKKwkgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX2ZpcnN0LT5fTV9uZXh0OworCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fZmlyc3QpOworCSAgICAgICsrX19lcmFzZWQ7CisJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJICAgIH0KKwkgIGlmIChfX3NhdmVkX3Nsb3QpCisJICAgIHsKKwkgICAgICBfX25leHQgPSBfX3NhdmVkX3Nsb3QtPl9NX25leHQ7CisJICAgICAgX19zYXZlZF9zbG90LT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fbmV4dCk7CisJICAgICAgKytfX2VyYXNlZDsKKwkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX2VyYXNlZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB2b2lkIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9faXQpCisgICAgeworICAgICAgX05vZGUqIF9fcCA9IF9faXQuX01fY3VyOworICAgICAgaWYgKF9fcCkKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19uID0gX01fYmt0X251bShfX3AtPl9NX3ZhbCk7CisJICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07CisJICAKKwkgIGlmIChfX2N1ciA9PSBfX3ApCisJICAgIHsKKwkgICAgICBfTV9idWNrZXRzW19fbl0gPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICBfTV9kZWxldGVfbm9kZShfX2N1cik7CisJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICB3aGlsZSAoX19uZXh0KQorCQl7CisJCSAgaWYgKF9fbmV4dCA9PSBfX3ApCisJCSAgICB7CisJCSAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCQkgICAgICBfTV9kZWxldGVfbm9kZShfX25leHQpOworCQkgICAgICAtLV9NX251bV9lbGVtZW50czsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICBfX2N1ciA9IF9fbmV4dDsKKwkJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0tleSwgY2xhc3MgX0hGLCBjbGFzcyBfRXgsIGNsYXNzIF9FcSwgY2xhc3MgX0FsbD4KKyAgICB2b2lkCisgICAgaGFzaHRhYmxlPF9WYWwsIF9LZXksIF9IRiwgX0V4LCBfRXEsIF9BbGw+OjoKKyAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgc2l6ZV90eXBlIF9fZl9idWNrZXQgPSBfX2ZpcnN0Ll9NX2N1ciA/IF9NX2JrdF9udW0oX19maXJzdC5fTV9jdXItPl9NX3ZhbCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9NX2J1Y2tldHMuc2l6ZSgpOworCisgICAgICBzaXplX3R5cGUgX19sX2J1Y2tldCA9IF9fbGFzdC5fTV9jdXIgPyBfTV9ia3RfbnVtKF9fbGFzdC5fTV9jdXItPl9NX3ZhbCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX01fYnVja2V0cy5zaXplKCk7CisKKyAgICAgIGlmIChfX2ZpcnN0Ll9NX2N1ciA9PSBfX2xhc3QuX01fY3VyKQorCXJldHVybjsKKyAgICAgIGVsc2UgaWYgKF9fZl9idWNrZXQgPT0gX19sX2J1Y2tldCkKKwlfTV9lcmFzZV9idWNrZXQoX19mX2J1Y2tldCwgX19maXJzdC5fTV9jdXIsIF9fbGFzdC5fTV9jdXIpOworICAgICAgZWxzZQorCXsKKwkgIF9NX2VyYXNlX2J1Y2tldChfX2ZfYnVja2V0LCBfX2ZpcnN0Ll9NX2N1ciwgMCk7CisJICBmb3IgKHNpemVfdHlwZSBfX24gPSBfX2ZfYnVja2V0ICsgMTsgX19uIDwgX19sX2J1Y2tldDsgKytfX24pCisJICAgIF9NX2VyYXNlX2J1Y2tldChfX24sIDApOworCSAgaWYgKF9fbF9idWNrZXQgIT0gX01fYnVja2V0cy5zaXplKCkpCisJICAgIF9NX2VyYXNlX2J1Y2tldChfX2xfYnVja2V0LCBfX2xhc3QuX01fY3VyKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBlcmFzZShpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlKj4oX19maXJzdC5fTV9jdXIpLAorCQkgICAgIGNvbnN0X2Nhc3Q8aGFzaHRhYmxlKj4oX19maXJzdC5fTV9odCkpLAorCSAgICBpdGVyYXRvcihjb25zdF9jYXN0PF9Ob2RlKj4oX19sYXN0Ll9NX2N1ciksCisJCSAgICAgY29uc3RfY2FzdDxoYXNodGFibGUqPihfX2xhc3QuX01faHQpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgaW5saW5lIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGVyYXNlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2l0KQorICAgIHsgZXJhc2UoaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZSo+KF9faXQuX01fY3VyKSwKKwkJICAgICBjb25zdF9jYXN0PGhhc2h0YWJsZSo+KF9faXQuX01faHQpKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19udW1fZWxlbWVudHNfaGludCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfbiA9IF9NX2J1Y2tldHMuc2l6ZSgpOworICAgICAgaWYgKF9fbnVtX2VsZW1lbnRzX2hpbnQgPiBfX29sZF9uKQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBfTV9uZXh0X3NpemUoX19udW1fZWxlbWVudHNfaGludCk7CisJICBpZiAoX19uID4gX19vbGRfbikKKwkgICAgeworCSAgICAgIF9WZWN0b3JfdHlwZSBfX3RtcChfX24sIChfTm9kZSopKDApLCBfTV9idWNrZXRzLmdldF9hbGxvY2F0b3IoKSk7CisJICAgICAgX190cnkKKwkJeworCQkgIGZvciAoc2l6ZV90eXBlIF9fYnVja2V0ID0gMDsgX19idWNrZXQgPCBfX29sZF9uOyArK19fYnVja2V0KQorCQkgICAgeworCQkgICAgICBfTm9kZSogX19maXJzdCA9IF9NX2J1Y2tldHNbX19idWNrZXRdOworCQkgICAgICB3aGlsZSAoX19maXJzdCkKKwkJCXsKKwkJCSAgc2l6ZV90eXBlIF9fbmV3X2J1Y2tldCA9IF9NX2JrdF9udW0oX19maXJzdC0+X01fdmFsLAorCQkJCQkJCSAgICAgIF9fbik7CisJCQkgIF9NX2J1Y2tldHNbX19idWNrZXRdID0gX19maXJzdC0+X01fbmV4dDsKKwkJCSAgX19maXJzdC0+X01fbmV4dCA9IF9fdG1wW19fbmV3X2J1Y2tldF07CisJCQkgIF9fdG1wW19fbmV3X2J1Y2tldF0gPSBfX2ZpcnN0OworCQkJICBfX2ZpcnN0ID0gX01fYnVja2V0c1tfX2J1Y2tldF07CisJCQl9CisJCSAgICB9CisJCSAgX01fYnVja2V0cy5zd2FwKF9fdG1wKTsKKwkJfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgZm9yIChzaXplX3R5cGUgX19idWNrZXQgPSAwOyBfX2J1Y2tldCA8IF9fdG1wLnNpemUoKTsKKwkJICAgICAgICsrX19idWNrZXQpCisJCSAgICB7CisJCSAgICAgIHdoaWxlIChfX3RtcFtfX2J1Y2tldF0pCisJCQl7CisJCQkgIF9Ob2RlKiBfX25leHQgPSBfX3RtcFtfX2J1Y2tldF0tPl9NX25leHQ7CisJCQkgIF9NX2RlbGV0ZV9ub2RlKF9fdG1wW19fYnVja2V0XSk7CisJCQkgIF9fdG1wW19fYnVja2V0XSA9IF9fbmV4dDsKKwkJCX0KKwkJICAgIH0KKwkJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIF9NX2VyYXNlX2J1Y2tldChjb25zdCBzaXplX3R5cGUgX19uLCBfTm9kZSogX19maXJzdCwgX05vZGUqIF9fbGFzdCkKKyAgICB7CisgICAgICBfTm9kZSogX19jdXIgPSBfTV9idWNrZXRzW19fbl07CisgICAgICBpZiAoX19jdXIgPT0gX19maXJzdCkKKwlfTV9lcmFzZV9idWNrZXQoX19uLCBfX2xhc3QpOworICAgICAgZWxzZQorCXsKKwkgIF9Ob2RlKiBfX25leHQ7CisJICBmb3IgKF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgICAgICBfX25leHQgIT0gX19maXJzdDsKKwkgICAgICAgX19jdXIgPSBfX25leHQsIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0KQorCSAgICA7CisJICB3aGlsZSAoX19uZXh0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIF9fY3VyLT5fTV9uZXh0ID0gX19uZXh0LT5fTV9uZXh0OworCSAgICAgIF9NX2RlbGV0ZV9ub2RlKF9fbmV4dCk7CisJICAgICAgX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgICAgLS1fTV9udW1fZWxlbWVudHM7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgX01fZXJhc2VfYnVja2V0KGNvbnN0IHNpemVfdHlwZSBfX24sIF9Ob2RlKiBfX2xhc3QpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyID0gX01fYnVja2V0c1tfX25dOworICAgICAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdCkKKwl7CisJICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICBfTV9kZWxldGVfbm9kZShfX2N1cik7CisJICBfX2N1ciA9IF9fbmV4dDsKKwkgIF9NX2J1Y2tldHNbX19uXSA9IF9fY3VyOworCSAgLS1fTV9udW1fZWxlbWVudHM7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfS2V5LCBjbGFzcyBfSEYsIGNsYXNzIF9FeCwgY2xhc3MgX0VxLCBjbGFzcyBfQWxsPgorICAgIHZvaWQKKyAgICBoYXNodGFibGU8X1ZhbCwgX0tleSwgX0hGLCBfRXgsIF9FcSwgX0FsbD46OgorICAgIGNsZWFyKCkKKyAgICB7CisgICAgICBpZiAoX01fbnVtX2VsZW1lbnRzID09IDApCisJcmV0dXJuOworCisgICAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfTV9idWNrZXRzLnNpemUoKTsgKytfX2kpCisJeworCSAgX05vZGUqIF9fY3VyID0gX01fYnVja2V0c1tfX2ldOworCSAgd2hpbGUgKF9fY3VyICE9IDApCisJICAgIHsKKwkgICAgICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICAgICAgX01fZGVsZXRlX25vZGUoX19jdXIpOworCSAgICAgIF9fY3VyID0gX19uZXh0OworCSAgICB9CisJICBfTV9idWNrZXRzW19faV0gPSAwOworCX0KKyAgICAgIF9NX251bV9lbGVtZW50cyA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWwsIGNsYXNzIF9LZXksIGNsYXNzIF9IRiwgY2xhc3MgX0V4LCBjbGFzcyBfRXEsIGNsYXNzIF9BbGw+CisgICAgdm9pZAorICAgIGhhc2h0YWJsZTxfVmFsLCBfS2V5LCBfSEYsIF9FeCwgX0VxLCBfQWxsPjo6CisgICAgX01fY29weV9mcm9tKGNvbnN0IGhhc2h0YWJsZSYgX19odCkKKyAgICB7CisgICAgICBfTV9idWNrZXRzLmNsZWFyKCk7CisgICAgICBfTV9idWNrZXRzLnJlc2VydmUoX19odC5fTV9idWNrZXRzLnNpemUoKSk7CisgICAgICBfTV9idWNrZXRzLmluc2VydChfTV9idWNrZXRzLmVuZCgpLCBfX2h0Ll9NX2J1Y2tldHMuc2l6ZSgpLCAoX05vZGUqKSAwKTsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19odC5fTV9idWNrZXRzLnNpemUoKTsgKytfX2kpIHsKKwkgICAgY29uc3QgX05vZGUqIF9fY3VyID0gX19odC5fTV9idWNrZXRzW19faV07CisJICAgIGlmIChfX2N1cikKKwkgICAgICB7CisJCV9Ob2RlKiBfX2xvY2FsX2NvcHkgPSBfTV9uZXdfbm9kZShfX2N1ci0+X01fdmFsKTsKKwkJX01fYnVja2V0c1tfX2ldID0gX19sb2NhbF9jb3B5OworCQkKKwkJZm9yIChfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJCSAgICAgX19uZXh0OworCQkgICAgIF9fY3VyID0gX19uZXh0LCBfX25leHQgPSBfX2N1ci0+X01fbmV4dCkKKwkJICB7CisJCSAgICBfX2xvY2FsX2NvcHktPl9NX25leHQgPSBfTV9uZXdfbm9kZShfX25leHQtPl9NX3ZhbCk7CisJCSAgICBfX2xvY2FsX2NvcHkgPSBfX2xvY2FsX2NvcHktPl9NX25leHQ7CisJCSAgfQorCSAgICAgIH0KKwkgIH0KKwkgIF9NX251bV9lbGVtZW50cyA9IF9faHQuX01fbnVtX2VsZW1lbnRzOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGNsZWFyKCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9zdHJzdHJlYW0gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JhY2t3YXJkL3N0cnN0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTE4YTM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iYWNrd2FyZC9zdHJzdHJlYW0KQEAgLTAsMCArMSwxODUgQEAKKy8vIEJhY2t3YXJkLWNvbXBhdCBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLy8gV0FSTklORzogVGhlIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGlzIGhlYWRlciBhcmUgREVQUkVDQVRFRC4gIFRoaXMKKy8vIGhlYWRlciBpcyBkZWZpbmVkIGluIHNlY3Rpb24gRC43LjEgb2YgdGhlIEMrKyBzdGFuZGFyZCwgYW5kIGl0CisvLyBNQVkgQkUgUkVNT1ZFRCBpbiBhIGZ1dHVyZSBzdGFuZGFyZCByZXZpc2lvbi4gIE9uZSBzaG91bGQgdXNlIHRoZQorLy8gaGVhZGVyIDxzc3RyZWFtPiBpbnN0ZWFkLgorCisvKiogQGZpbGUgYmFja3dhcmQvc3Ryc3RyZWFtCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3N0cmVhbX0KKyAqLworCisjaWZuZGVmIF9CQUNLV0FSRF9TVFJTVFJFQU0KKyNkZWZpbmUgX0JBQ0tXQVJEX1NUUlNUUkVBTQorCisjaW5jbHVkZSAiYmFja3dhcmRfd2FybmluZy5oIgorI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIENsYXNzIHN0cnN0cmVhbWJ1ZiwgYSBzdHJlYW1idWYgY2xhc3MgdGhhdCBtYW5hZ2VzIGFuIGFycmF5IG9mIGNoYXIuCisgIC8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIG5vdCBhIHRlbXBsYXRlLgorICBjbGFzcyBzdHJzdHJlYW1idWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPGNoYXIsIGNoYXJfdHJhaXRzPGNoYXI+ID4KKyAgeworICBwdWJsaWM6CisgICAgLy8gVHlwZXMuCisgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPiAgICAgICAgICAgICAgX1RyYWl0czsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyLCBfVHJhaXRzPiBfQmFzZTsKKworICBwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IKKyAgICBleHBsaWNpdCBzdHJzdHJlYW1idWYoc3RyZWFtc2l6ZSBfX2luaXRpYWxfY2FwYWNpdHkgPSAwKTsKKyAgICBzdHJzdHJlYW1idWYodm9pZCogKCpfX2FsbG9jKShzaXplX3QpLCB2b2lkICgqX19mcmVlKSh2b2lkKikpOworCisgICAgc3Ryc3RyZWFtYnVmKGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgY2hhciogX19wdXQgPSAwKSB0aHJvdyAoKTsKKyAgICBzdHJzdHJlYW1idWYoc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgc2lnbmVkIGNoYXIqIF9fcHV0ID0gMCkgdGhyb3cgKCk7CisgICAgc3Ryc3RyZWFtYnVmKHVuc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbiwgdW5zaWduZWQgY2hhciogX19wdXQ9MCkgdGhyb3cgKCk7CisKKyAgICBzdHJzdHJlYW1idWYoY29uc3QgY2hhciogX19nZXQsIHN0cmVhbXNpemUgX19uKSB0aHJvdyAoKTsKKyAgICBzdHJzdHJlYW1idWYoY29uc3Qgc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisgICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZ2V0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisKKyAgICB2aXJ0dWFsIH5zdHJzdHJlYW1idWYoKTsKKworICBwdWJsaWM6CisgICAgdm9pZCBmcmVlemUoYm9vbCA9IHRydWUpIHRocm93ICgpOworICAgIGNoYXIqIHN0cigpIHRocm93ICgpOworICAgIF9HTElCQ1hYX1BVUkUgaW50IHBjb3VudCgpIGNvbnN0IHRocm93ICgpOworCisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludF90eXBlIG92ZXJmbG93KGludF90eXBlIF9fYyAgPSBfVHJhaXRzOjplb2YoKSk7CisgICAgdmlydHVhbCBpbnRfdHlwZSBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gX1RyYWl0czo6ZW9mKCkpOworICAgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CisgICAgdmlydHVhbCBfQmFzZSogc2V0YnVmKGNoYXIqIF9fYnVmLCBzdHJlYW1zaXplIF9fbik7CisgICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKKwkJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorCQkJICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgcG9zX3R5cGUgc2Vla3Bvcyhwb3NfdHlwZSBfX3BvcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZQorCQkJICAgICA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgIHByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmJgorICAgIG9wZXJhdG9yPShjb25zdCBzdHJzdHJlYW1idWYmKTsKKworICAgIHN0cnN0cmVhbWJ1Zihjb25zdCBzdHJzdHJlYW1idWYmKTsKKworICAgIC8vIER5bmFtaWMgYWxsb2NhdGlvbiwgcG9zc2libHkgdXNpbmcgX01fYWxsb2NfZnVuIGFuZCBfTV9mcmVlX2Z1bi4KKyAgICBjaGFyKiBfTV9hbGxvYyhzaXplX3QpOworICAgIHZvaWQgIF9NX2ZyZWUoY2hhciopOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgaW4gY29uc3RydWN0b3JzLgorICAgIHZvaWQgX01fc2V0dXAoY2hhciogX19nZXQsIGNoYXIqIF9fcHV0LCBzdHJlYW1zaXplIF9fbikgdGhyb3cgKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBEYXRhIG1lbWJlcnMuCisgICAgdm9pZCogKCpfTV9hbGxvY19mdW4pKHNpemVfdCk7CisgICAgdm9pZCAgKCpfTV9mcmVlX2Z1bikodm9pZCopOworCisgICAgYm9vbCBfTV9keW5hbWljICA6IDE7CisgICAgYm9vbCBfTV9mcm96ZW4gICA6IDE7CisgICAgYm9vbCBfTV9jb25zdGFudCA6IDE7CisgIH07CisKKyAgLy8gQ2xhc3MgaXN0cnN0cmVhbSwgYW4gaXN0cmVhbSB0aGF0IG1hbmFnZXMgYSBzdHJzdHJlYW1idWYuCisgIGNsYXNzIGlzdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxjaGFyPgorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNoYXIqKTsKKyAgICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNvbnN0IGNoYXIqKTsKKyAgICBpc3Ryc3RyZWFtKGNoYXIqICwgc3RyZWFtc2l6ZSk7CisgICAgaXN0cnN0cmVhbShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CisgICAgdmlydHVhbCB+aXN0cnN0cmVhbSgpOworCisgICAgX0dMSUJDWFhfQ09OU1Qgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHRocm93ICgpOworICAgIGNoYXIqIHN0cigpIHRocm93ICgpOworCisgIHByaXZhdGU6CisgICAgc3Ryc3RyZWFtYnVmIF9NX2J1ZjsKKyAgfTsKKworICAvLyBDbGFzcyBvc3Ryc3RyZWFtCisgIGNsYXNzIG9zdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxjaGFyPgorICB7CisgIHB1YmxpYzoKKyAgICBvc3Ryc3RyZWFtKCk7CisgICAgb3N0cnN0cmVhbShjaGFyKiwgaW50LCBpb3NfYmFzZTo6b3Blbm1vZGUgPSBpb3NfYmFzZTo6b3V0KTsKKyAgICB2aXJ0dWFsIH5vc3Ryc3RyZWFtKCk7CisKKyAgICBfR0xJQkNYWF9DT05TVCBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3QgdGhyb3cgKCk7CisgICAgdm9pZCBmcmVlemUoYm9vbCA9IHRydWUpIHRocm93KCk7CisgICAgY2hhciogc3RyKCkgdGhyb3cgKCk7CisgICAgX0dMSUJDWFhfUFVSRSBpbnQgcGNvdW50KCkgY29uc3QgdGhyb3cgKCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJzdHJlYW1idWYgX01fYnVmOworICB9OworCisgIC8vIENsYXNzIHN0cnN0cmVhbQorICBjbGFzcyBzdHJzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaW9zdHJlYW08Y2hhcj4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OmludF90eXBlIGludF90eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OnBvc190eXBlIHBvc190eXBlOworICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46Om9mZl90eXBlIG9mZl90eXBlOworCisgICAgc3Ryc3RyZWFtKCk7CisgICAgc3Ryc3RyZWFtKGNoYXIqLCBpbnQsIGlvc19iYXNlOjpvcGVubW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworICAgIHZpcnR1YWwgfnN0cnN0cmVhbSgpOworCisgICAgX0dMSUJDWFhfQ09OU1Qgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHRocm93ICgpOworICAgIHZvaWQgZnJlZXplKGJvb2wgPSB0cnVlKSB0aHJvdyAoKTsKKyAgICBfR0xJQkNYWF9QVVJFIGludCBwY291bnQoKSBjb25zdCB0aHJvdyAoKTsKKyAgICBjaGFyKiBzdHIoKSB0aHJvdyAoKTsKKworICBwcml2YXRlOgorICAgIHN0cnN0cmVhbWJ1ZiBfTV9idWY7CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYWxnb3JpdGhtZndkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYWxnb3JpdGhtZndkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzMmJmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hbGdvcml0aG1md2QuaApAQCAtMCwwICsxLDgxNSBAQAorLy8gPGFsZ29yaXRobT4gZGVjbGFyYXRpb25zICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYWxnb3JpdGhtZndkLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXthbGdvcml0aG19CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9BTEdPUklUSE1GV0RfSAorI2RlZmluZSBfR0xJQkNYWF9BTEdPUklUSE1GV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoKKyAgICBhZGphY2VudF9maW5kCisgICAgYWxsX29mIChDKysweCkKKyAgICBhbnlfb2YgKEMrKzB4KQorICAgIGJpbmFyeV9zZWFyY2gKKyAgICBjb3B5CisgICAgY29weV9iYWNrd2FyZAorICAgIGNvcHlfaWYgKEMrKzB4KQorICAgIGNvcHlfbiAoQysrMHgpCisgICAgY291bnQKKyAgICBjb3VudF9pZgorICAgIGVxdWFsCisgICAgZXF1YWxfcmFuZ2UKKyAgICBmaWxsCisgICAgZmlsbF9uCisgICAgZmluZAorICAgIGZpbmRfZW5kCisgICAgZmluZF9maXJzdF9vZgorICAgIGZpbmRfaWYKKyAgICBmaW5kX2lmX25vdCAoQysrMHgpCisgICAgZm9yX2VhY2gKKyAgICBnZW5lcmF0ZQorICAgIGdlbmVyYXRlX24KKyAgICBpbmNsdWRlcworICAgIGlucGxhY2VfbWVyZ2UKKyAgICBpc19oZWFwIChDKysweCkKKyAgICBpc19oZWFwX3VudGlsIChDKysweCkKKyAgICBpc19wYXJ0aXRpb25lZCAoQysrMHgpCisgICAgaXNfc29ydGVkIChDKysweCkKKyAgICBpc19zb3J0ZWRfdW50aWwgKEMrKzB4KQorICAgIGl0ZXJfc3dhcAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlCisgICAgbG93ZXJfYm91bmQKKyAgICBtYWtlX2hlYXAKKyAgICBtYXgKKyAgICBtYXhfZWxlbWVudAorICAgIG1lcmdlCisgICAgbWluCisgICAgbWluX2VsZW1lbnQKKyAgICBtaW5tYXggKEMrKzB4KQorICAgIG1pbm1heF9lbGVtZW50IChDKysweCkKKyAgICBtaXNtYXRjaAorICAgIG5leHRfcGVybXV0YXRpb24KKyAgICBub25lX29mIChDKysweCkKKyAgICBudGhfZWxlbWVudAorICAgIHBhcnRpYWxfc29ydAorICAgIHBhcnRpYWxfc29ydF9jb3B5CisgICAgcGFydGl0aW9uCisgICAgcGFydGl0aW9uX2NvcHkgKEMrKzB4KQorICAgIHBhcnRpdGlvbl9wb2ludCAoQysrMHgpCisgICAgcG9wX2hlYXAKKyAgICBwcmV2X3Blcm11dGF0aW9uCisgICAgcHVzaF9oZWFwCisgICAgcmFuZG9tX3NodWZmbGUKKyAgICByZW1vdmUKKyAgICByZW1vdmVfY29weQorICAgIHJlbW92ZV9jb3B5X2lmCisgICAgcmVtb3ZlX2lmCisgICAgcmVwbGFjZQorICAgIHJlcGxhY2VfY29weQorICAgIHJlcGxhY2VfY29weV9pZgorICAgIHJlcGxhY2VfaWYKKyAgICByZXZlcnNlCisgICAgcmV2ZXJzZV9jb3B5CisgICAgcm90YXRlCisgICAgcm90YXRlX2NvcHkKKyAgICBzZWFyY2gKKyAgICBzZWFyY2hfbgorICAgIHNldF9kaWZmZXJlbmNlCisgICAgc2V0X2ludGVyc2VjdGlvbgorICAgIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAgIHNldF91bmlvbgorICAgIHNodWZmbGUgKEMrKzB4KQorICAgIHNvcnQKKyAgICBzb3J0X2hlYXAKKyAgICBzdGFibGVfcGFydGl0aW9uCisgICAgc3RhYmxlX3NvcnQKKyAgICBzd2FwCisgICAgc3dhcF9yYW5nZXMKKyAgICB0cmFuc2Zvcm0KKyAgICB1bmlxdWUKKyAgICB1bmlxdWVfY29weQorICAgIHVwcGVyX2JvdW5kCisgICovCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBhbGdvcml0aG1zIEFsZ29yaXRobXMKKyAgICoKKyAgICogQ29tcG9uZW50cyBmb3IgcGVyZm9ybWluZyBhbGdvcml0aG1pYyBvcGVyYXRpb25zLiBJbmNsdWRlcworICAgKiBub24tbW9kaWZ5aW5nIHNlcXVlbmNlLCBtb2RpZnlpbmcgKG11dGF0aW5nKSBzZXF1ZW5jZSwgc29ydGluZywKKyAgICogc2VhcmNoaW5nLCBtZXJnZSwgcGFydGl0aW9uLCBoZWFwLCBzZXQsIG1pbmltYSwgbWF4aW1hLCBhbmQKKyAgICogcGVybXV0YXRpb24gb3BlcmF0aW9ucy4KKyAgICovCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBtdXRhdGluZ19hbGdvcml0aG1zIE11dGF0aW5nCisgICAqIEBpbmdyb3VwIGFsZ29yaXRobXMKKyAgICovCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcyBOb24tTXV0YXRpbmcKKyAgICogQGluZ3JvdXAgYWxnb3JpdGhtcworICAgKi8KKworICAvKioKKyAgICogQGRlZmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcyBTb3J0aW5nCisgICAqIEBpbmdyb3VwIGFsZ29yaXRobXMKKyAgICovCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBzZXRfYWxnb3JpdGhtcyBTZXQgT3BlcmF0aW9uCisgICAqIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKgorICAgKiBUaGVzZSBhbGdvcml0aG1zIGFyZSBjb21tb24gc2V0IG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHNlcXVlbmNlcworICAgKiB0aGF0IGFyZSBhbHJlYWR5IHNvcnRlZC4gVGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB3aWxsIGJlCisgICAqIGxpbmVhci4KKyAgICovCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMgQmluYXJ5IFNlYXJjaAorICAgKiBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICoKKyAgICogVGhlc2UgYWxnb3JpdGhtcyBhcmUgdmFyaWF0aW9ucyBvZiBhIGNsYXNzaWMgYmluYXJ5IHNlYXJjaCwgYW5kCisgICAqIGFsbCBhc3N1bWUgdGhhdCB0aGUgc2VxdWVuY2UgYmVpbmcgc2VhcmNoZWQgaXMgYWxyZWFkeSBzb3J0ZWQuCisgICAqIAorICAgKiBUaGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHdpbGwgYmUgbG9nYXJpdGhtaWMgKGFuZCBhcyBmZXcgYXMKKyAgICogcG9zc2libGUpLiAgVGhlIG51bWJlciBvZiBzdGVwcyB0aHJvdWdoIHRoZSBzZXF1ZW5jZSB3aWxsIGJlCisgICAqIGxvZ2FyaXRobWljIGZvciByYW5kb20tYWNjZXNzIGl0ZXJhdG9ycyAoZS5nLiwgcG9pbnRlcnMpLCBhbmQKKyAgICogbGluZWFyIG90aGVyd2lzZS4KKyAgICogCisgICAqIFRoZSBMV0cgaGFzIHBhc3NlZCBEZWZlY3QgUmVwb3J0IDI3MCwgd2hpY2ggbm90ZXM6IDxlbT5UaGUKKyAgICogcHJvcG9zZWQgcmVzb2x1dGlvbiByZWludGVycHJldHMgYmluYXJ5IHNlYXJjaC4gSW5zdGVhZCBvZgorICAgKiB0aGlua2luZyBhYm91dCBzZWFyY2hpbmcgZm9yIGEgdmFsdWUgaW4gYSBzb3J0ZWQgcmFuZ2UsIHdlIHZpZXcKKyAgICogdGhhdCBhcyBhbiBpbXBvcnRhbnQgc3BlY2lhbCBjYXNlIG9mIGEgbW9yZSBnZW5lcmFsIGFsZ29yaXRobToKKyAgICogc2VhcmNoaW5nIGZvciB0aGUgcGFydGl0aW9uIHBvaW50IGluIGEgcGFydGl0aW9uZWQgcmFuZ2UuICBXZQorICAgKiBhbHNvIGFkZCBhIGd1YXJhbnRlZSB0aGF0IHRoZSBvbGQgd29yZGluZyBkaWQgbm90OiB3ZSBlbnN1cmUgdGhhdAorICAgKiB0aGUgdXBwZXIgYm91bmQgaXMgbm8gZWFybGllciB0aGFuIHRoZSBsb3dlciBib3VuZCwgdGhhdCB0aGUgcGFpcgorICAgKiByZXR1cm5lZCBieSBlcXVhbF9yYW5nZSBpcyBhIHZhbGlkIHJhbmdlLCBhbmQgdGhhdCB0aGUgZmlyc3QgcGFydAorICAgKiBvZiB0aGF0IHBhaXIgaXMgdGhlIGxvd2VyIGJvdW5kLjwvZW0+CisgICAqCisgICAqIFRoZSBhY3R1YWwgZWZmZWN0IG9mIHRoZSBmaXJzdCBzZW50ZW5jZSBpcyB0aGF0IGEgY29tcGFyaXNvbgorICAgKiBmdW5jdG9yIHBhc3NlZCBieSB0aGUgdXNlciBkb2Vzbid0IG5lY2Vzc2FyaWx5IG5lZWQgdG8gaW5kdWNlIGEKKyAgICogc3RyaWN0IHdlYWsgb3JkZXJpbmcgcmVsYXRpb24uICBSYXRoZXIsIGl0IHBhcnRpdGlvbnMgdGhlIHJhbmdlLgorICAgKi8KKworICAvLyBhZGphY2VudF9maW5kCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGFsbF9vZihfSUl0ZXIsIF9JSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBhbnlfb2YoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgYm9vbCAKKyAgICBiaW5hcnlfc2VhcmNoKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBiaW5hcnlfc2VhcmNoKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyIAorICAgIGNvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyMSwgdHlwZW5hbWUgX0JJdGVyMj4KKyAgICBfQkl0ZXIyCisgICAgY29weV9iYWNrd2FyZChfQkl0ZXIxLCBfQkl0ZXIxLCBfQkl0ZXIyKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PSXRlcgorICAgIGNvcHlfaWYoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlcgorICAgIGNvcHlfbihfSUl0ZXIsIF9TaXplLCBfT0l0ZXIpOworI2VuZGlmCisKKyAgLy8gY291bnQKKyAgLy8gY291bnRfaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9GSXRlciwgX0ZJdGVyPgorICAgIGVxdWFsX3JhbmdlKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxfRkl0ZXIsIF9GSXRlcj4KKyAgICBlcXVhbF9yYW5nZShfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQgCisgICAgZmlsbChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIF9PSXRlcgorICAgIGZpbGxfbihfT0l0ZXIsIF9TaXplLCBjb25zdCBfVHAmKTsKKworICAvLyBmaW5kCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMj4KKyAgICBfRkl0ZXIxCisgICAgZmluZF9lbmQoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIxCisgICAgZmluZF9lbmQoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgLy8gZmluZF9maXJzdF9vZgorICAvLyBmaW5kX2lmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0lJdGVyCisgICAgZmluZF9pZl9ub3QoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworI2VuZGlmCisKKyAgLy8gZm9yX2VhY2gKKyAgLy8gZ2VuZXJhdGUKKyAgLy8gZ2VuZXJhdGVfbgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbCAKKyAgICBpbmNsdWRlcyhfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIGluY2x1ZGVzKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXI+CisgICAgdm9pZCAKKyAgICBpbnBsYWNlX21lcmdlKF9CSXRlciwgX0JJdGVyLCBfQkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBpbnBsYWNlX21lcmdlKF9CSXRlciwgX0JJdGVyLCBfQkl0ZXIsIF9Db21wYXJlKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgYm9vbCAKKyAgICBpc19oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wgCisgICAgaXNfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICBfUkFJdGVyIAorICAgIGlzX2hlYXBfdW50aWwoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JBSXRlciAKKyAgICBpc19oZWFwX3VudGlsKF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGlzX3BhcnRpdGlvbmVkKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIGJvb2wKKyAgICBpc19wZXJtdXRhdGlvbihfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgYm9vbAorICAgIGlzX3Blcm11dGF0aW9uKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBib29sIAorICAgIGlzX3NvcnRlZChfRkl0ZXIsIF9GSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIGlzX3NvcnRlZChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBfRkl0ZXIgCisgICAgaXNfc29ydGVkX3VudGlsKF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBpc19zb3J0ZWRfdW50aWwoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjI+CisgICAgdm9pZCAKKyAgICBpdGVyX3N3YXAoX0ZJdGVyMSwgX0ZJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZJdGVyIAorICAgIGxvd2VyX2JvdW5kKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZJdGVyIAorICAgIGxvd2VyX2JvdW5kKF9GSXRlciwgX0ZJdGVyLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIG1ha2VfaGVhcChfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIG1ha2VfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjb25zdCBfVHAmIAorICAgIG1heChjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNvbnN0IF9UcCYgCisgICAgbWF4KGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYsIF9Db21wYXJlKTsKKworICAvLyBtYXhfZWxlbWVudAorICAvLyBtZXJnZQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY29uc3QgX1RwJiAKKyAgICBtaW4oY29uc3QgX1RwJiwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBjb25zdCBfVHAmIAorICAgIG1pbihjb25zdCBfVHAmLCBjb25zdCBfVHAmLCBfQ29tcGFyZSk7CisKKyAgLy8gbWluX2VsZW1lbnQKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+IAorICAgIG1pbm1heChjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHBhaXI8Y29uc3QgX1RwJiwgY29uc3QgX1RwJj4KKyAgICBtaW5tYXgoY29uc3QgX1RwJiwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcj4KKyAgICBwYWlyPF9GSXRlciwgX0ZJdGVyPgorICAgIG1pbm1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHBhaXI8X0ZJdGVyLCBfRkl0ZXI+CisgICAgbWlubWF4X2VsZW1lbnQoX0ZJdGVyLCBfRkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgbWluKGluaXRpYWxpemVyX2xpc3Q8X1RwPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfVHAKKyAgICBtaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+LCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIG1heChpbml0aWFsaXplcl9saXN0PF9UcD4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1RwCisgICAgbWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9UcCwgX1RwPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PF9UcD4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgcGFpcjxfVHAsIF9UcD4KKyAgICBtaW5tYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+LCBfQ29tcGFyZSk7CisjZW5kaWYKKworICAvLyBtaXNtYXRjaAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcj4KKyAgICBib29sIAorICAgIG5leHRfcGVybXV0YXRpb24oX0JJdGVyLCBfQkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgYm9vbCAKKyAgICBuZXh0X3Blcm11dGF0aW9uKF9CSXRlciwgX0JJdGVyLCBfQ29tcGFyZSk7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgYm9vbAorICAgIG5vbmVfb2YoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworI2VuZGlmCisKKyAgLy8gbnRoX2VsZW1lbnQKKyAgLy8gcGFydGlhbF9zb3J0CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUkFJdGVyPgorICAgIF9SQUl0ZXIKKyAgICBwYXJ0aWFsX3NvcnRfY29weShfSUl0ZXIsIF9JSXRlciwgX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUkFJdGVyCisgICAgcGFydGlhbF9zb3J0X2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICAvLyBwYXJ0aXRpb24KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyMSwKKwkgICB0eXBlbmFtZSBfT0l0ZXIyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHBhaXI8X09JdGVyMSwgX09JdGVyMj4KKyAgICBwYXJ0aXRpb25fY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyMSwgX09JdGVyMiwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9GSXRlcgorICAgIHBhcnRpdGlvbl9wb2ludChfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSk7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcG9wX2hlYXAoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBwb3BfaGVhcChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyPgorICAgIGJvb2wgCisgICAgcHJldl9wZXJtdXRhdGlvbihfQkl0ZXIsIF9CSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIHByZXZfcGVybXV0YXRpb24oX0JJdGVyLCBfQkl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcHVzaF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgcHVzaF9oZWFwKF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICAvLyByYW5kb21fc2h1ZmZsZQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlciAKKyAgICByZW1vdmUoX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgcmVtb3ZlX2lmKF9GSXRlciwgX0ZJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9PSXRlciAKKyAgICByZW1vdmVfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfT0l0ZXIgCisgICAgcmVtb3ZlX2NvcHlfaWYoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgLy8gcmVwbGFjZQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgX09JdGVyIAorICAgIHJlcGxhY2VfY29weShfSUl0ZXIsIF9JSXRlciwgX09JdGVyLCBjb25zdCBfVHAmLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlciwgdHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgX09JdGVyIAorICAgIHJlcGxhY2VfY29weV9pZihfSXRlciwgX0l0ZXIsIF9PSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJik7CisKKyAgLy8gcmVwbGFjZV9pZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlcj4KKyAgICB2b2lkIAorICAgIHJldmVyc2UoX0JJdGVyLCBfQkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICByZXZlcnNlX2NvcHkoX0JJdGVyLCBfQkl0ZXIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIHZvaWQgCisgICAgcm90YXRlKF9GSXRlciwgX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICByb3RhdGVfY29weShfRkl0ZXIsIF9GSXRlciwgX0ZJdGVyLCBfT0l0ZXIpOworCisgIC8vIHNlYXJjaAorICAvLyBzZWFyY2hfbgorICAvLyBzZXRfZGlmZmVyZW5jZQorICAvLyBzZXRfaW50ZXJzZWN0aW9uCisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAvLyBzZXRfdW5pb24KKworI2lmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfVUdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgc2h1ZmZsZShfUkFJdGVyLCBfUkFJdGVyLCBfVUdlbmVyYXRvciYmKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBzb3J0X2hlYXAoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBzb3J0X2hlYXAoX1JBSXRlciwgX1JBSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfQkl0ZXIgCisgICAgc3RhYmxlX3BhcnRpdGlvbihfQkl0ZXIsIF9CSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICB2b2lkIAorICAgIHN3YXAoX1RwJiwgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzaXplX3QgX05tPgorICAgIHZvaWQKKyAgICBzd2FwKF9UcCAoJilbX05tXSwgX1RwICgmKVtfTm1dKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjIgCisgICAgc3dhcF9yYW5nZXMoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMik7CisKKyAgLy8gdHJhbnNmb3JtCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyPgorICAgIF9GSXRlciAKKyAgICB1bmlxdWUoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgdW5pcXVlKF9GSXRlciwgX0ZJdGVyLCBfQmluYXJ5UHJlZGljYXRlKTsKKworICAvLyB1bmlxdWVfY29weQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9GSXRlciAKKyAgICB1cHBlcl9ib3VuZChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICB1cHBlcl9ib3VuZChfRkl0ZXIsIF9GSXRlciwgY29uc3QgX1RwJiwgX0NvbXBhcmUpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIGFkamFjZW50X2ZpbmQoX0ZJdGVyLCBfRkl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRkl0ZXIgCisgICAgYWRqYWNlbnRfZmluZChfRkl0ZXIsIF9GSXRlciwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50KF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JSXRlciwgX0lJdGVyLCBfUHJlZGljYXRlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyPgorICAgIGJvb2wgCisgICAgZXF1YWwoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBib29sIAorICAgIGVxdWFsKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX1RwPgorICAgIF9JSXRlciAKKyAgICBmaW5kKF9JSXRlciwgX0lJdGVyLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyPgorICAgIF9GSXRlcjEKKyAgICBmaW5kX2ZpcnN0X29mKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlcjEsIHR5cGVuYW1lIF9GSXRlcjIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZJdGVyMQorICAgIGZpbmRfZmlyc3Rfb2YoX0ZJdGVyMSwgX0ZJdGVyMSwgX0ZJdGVyMiwgX0ZJdGVyMiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9JSXRlcgorICAgIGZpbmRfaWYoX0lJdGVyLCBfSUl0ZXIsIF9QcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlciwgdHlwZW5hbWUgX0Z1bmN0PgorICAgIF9GdW5jdCAKKyAgICBmb3JfZWFjaChfSUl0ZXIsIF9JSXRlciwgX0Z1bmN0KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZCAKKyAgICBnZW5lcmF0ZShfRkl0ZXIsIF9GSXRlciwgX0dlbmVyYXRvcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX09JdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBfT0l0ZXIKKyAgICBnZW5lcmF0ZV9uKF9PSXRlciwgX1NpemUsIF9HZW5lcmF0b3IpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgYm9vbCAKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sIAorICAgIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIG1heF9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBtYXhfZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgbWVyZ2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXIsIAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlciAKKyAgICBtZXJnZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXI+CisgICAgX0ZJdGVyIAorICAgIG1pbl9lbGVtZW50KF9GSXRlciwgX0ZJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9GSXRlciAKKyAgICBtaW5fZWxlbWVudChfRkl0ZXIsIF9GSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjI+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgcGFpcjxfSUl0ZXIxLCBfSUl0ZXIyPgorICAgIG1pc21hdGNoKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXI+CisgICAgdm9pZCAKKyAgICBudGhfZWxlbWVudChfUkFJdGVyLCBfUkFJdGVyLCBfUkFJdGVyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkIAorICAgIG50aF9lbGVtZW50KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQgCisgICAgcGFydGlhbF9zb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkl0ZXIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0JJdGVyIAorICAgIHBhcnRpdGlvbihfQkl0ZXIsIF9CSXRlciwgX1ByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHJhbmRvbV9zaHVmZmxlKF9SQUl0ZXIsIF9SQUl0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUl0ZXIsIHR5cGVuYW1lIF9HZW5lcmF0b3I+CisgICAgdm9pZCAKKyAgICByYW5kb21fc2h1ZmZsZShfUkFJdGVyLCBfUkFJdGVyLAorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisJCSAgIF9HZW5lcmF0b3ImJik7CisjZWxzZQorCQkgICBfR2VuZXJhdG9yJik7CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkIAorICAgIHJlcGxhY2UoX0ZJdGVyLCBfRkl0ZXIsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQgCisgICAgcmVwbGFjZV9pZihfRkl0ZXIsIF9GSXRlciwgX1ByZWRpY2F0ZSwgY29uc3QgX1RwJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZJdGVyMSwgdHlwZW5hbWUgX0ZJdGVyMj4KKyAgICBfRkl0ZXIxIAorICAgIHNlYXJjaChfRkl0ZXIxLCBfRkl0ZXIxLCBfRkl0ZXIyLCBfRkl0ZXIyKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIxLCB0eXBlbmFtZSBfRkl0ZXIyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9GSXRlcjEgCisgICAgc2VhcmNoKF9GSXRlcjEsIF9GSXRlcjEsIF9GSXRlcjIsIF9GSXRlcjIsIF9CaW5hcnlQcmVkaWNhdGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GSXRlciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBfRkl0ZXIgCisgICAgc2VhcmNoX24oX0ZJdGVyLCBfRkl0ZXIsIF9TaXplLCBjb25zdCBfVHAmKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRkl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHAsIAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZJdGVyIAorICAgIHNlYXJjaF9uKF9GSXRlciwgX0ZJdGVyLCBfU2l6ZSwgY29uc3QgX1RwJiwgX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyPgorICAgIF9PSXRlciAKKyAgICBzZXRfZGlmZmVyZW5jZShfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwgCisJICAgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX09JdGVyIAorICAgIHNldF9kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlciwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT0l0ZXIgCisgICAgc2V0X2ludGVyc2VjdGlvbihfSUl0ZXIxLCBfSUl0ZXIxLCBfSUl0ZXIyLCBfSUl0ZXIyLCBfT0l0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfT0l0ZXI+CisgICAgX09JdGVyCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLCAKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT0l0ZXIKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgCisJCQkgICAgIF9PSXRlciwgX0NvbXBhcmUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSXRlcjEsIHR5cGVuYW1lIF9JSXRlcjIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgc2V0X3VuaW9uKF9JSXRlcjEsIF9JSXRlcjEsIF9JSXRlcjIsIF9JSXRlcjIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PSXRlciAKKyAgICBzZXRfdW5pb24oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX0lJdGVyMiwgX09JdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcj4KKyAgICB2b2lkIAorICAgIHNvcnQoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBzb3J0KF9SQUl0ZXIsIF9SQUl0ZXIsIF9Db21wYXJlKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUkFJdGVyPgorICAgIHZvaWQgCisgICAgc3RhYmxlX3NvcnQoX1JBSXRlciwgX1JBSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZCAKKyAgICBzdGFibGVfc29ydChfUkFJdGVyLCBfUkFJdGVyLCBfQ29tcGFyZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBfT0l0ZXIgCisgICAgdHJhbnNmb3JtKF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9VbmFyeU9wZXJhdGlvbik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyMSwgdHlwZW5hbWUgX0lJdGVyMiwgdHlwZW5hbWUgX09JdGVyLCAKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PSXRlciAKKyAgICB0cmFuc2Zvcm0oX0lJdGVyMSwgX0lJdGVyMSwgX0lJdGVyMiwgX09JdGVyLCBfQmluYXJ5T3BlcmF0aW9uKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIsIHR5cGVuYW1lIF9PSXRlcj4KKyAgICBfT0l0ZXIgCisgICAgdW5pcXVlX2NvcHkoX0lJdGVyLCBfSUl0ZXIsIF9PSXRlcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJdGVyLCB0eXBlbmFtZSBfT0l0ZXIsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX09JdGVyIAorICAgIHVuaXF1ZV9jb3B5KF9JSXRlciwgX0lJdGVyLCBfT0l0ZXIsIF9CaW5hcnlQcmVkaWNhdGUpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgaW5jbHVkZSA8cGFyYWxsZWwvYWxnb3JpdGhtZndkLmg+CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDAxYTYwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMjM5IEBACisvLyBBbGxvY2F0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKy8vIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9hbGxvY2F0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9BTExPQ0FUT1JfSAorI2RlZmluZSBfQUxMT0NBVE9SX0ggMQorCisvLyBEZWZpbmUgdGhlIGJhc2UgY2xhc3MgdG8gc3RkOjphbGxvY2F0b3IuCisjaW5jbHVkZSA8Yml0cy9jKythbGxvY2F0b3IuaD4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIEZvciBfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBhbGxvY2F0b3JzIEFsbG9jYXRvcnMKKyAgICogQGluZ3JvdXAgbWVtb3J5CisgICAqCisgICAqIENsYXNzZXMgZW5jYXBzdWxhdGluZyBtZW1vcnkgb3BlcmF0aW9ucy4KKyAgICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGFsbG9jYXRvcjsKKworICAvLy8gYWxsb2NhdG9yPHZvaWQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgYWxsb2NhdG9yPHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsgfTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgIFRoZSBAYSBzdGFuZGFyZCBhbGxvY2F0b3IsIGFzIHBlciBbMjAuNF0uCisgICAqIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIEZ1cnRoZXIgZGV0YWlsczoKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDRjaDExLmh0bWwKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBhbGxvY2F0b3I6IHB1YmxpYyBfX2dsaWJjeHhfYmFzZV9hbGxvY2F0b3I8X1RwPgorICAgIHsKKyAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsgfTsKKworICAgICAgYWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKworICAgICAgYWxsb2NhdG9yKGNvbnN0IGFsbG9jYXRvciYgX19hKSB0aHJvdygpCisgICAgICA6IF9fZ2xpYmN4eF9iYXNlX2FsbG9jYXRvcjxfVHA+KF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3I8X1RwMT4mKSB0aHJvdygpIHsgfQorCisgICAgICB+YWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKworICAgICAgLy8gSW5oZXJpdCBldmVyeXRoaW5nIGVsc2UuCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9yPF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBhbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBhbGxvY2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxfVDI+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBhbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGFsbG9jYXRvcjxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGFsbG9jYXRvcjx3Y2hhcl90PjsKKyNlbmRpZgorCisgIC8vIFVuZGVmaW5lLgorI3VuZGVmIF9fZ2xpYmN4eF9iYXNlX2FsbG9jYXRvcgorCisgIC8vIFRvIGltcGxlbWVudCBPcHRpb24gMyBvZiBEUiA0MzEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgYm9vbCA9IF9faXNfZW1wdHkoX0FsbG9jKT4KKyAgICBzdHJ1Y3QgX19hbGxvY19zd2FwCisgICAgeyBzdGF0aWMgdm9pZCBfU19kb19pdChfQWxsb2MmLCBfQWxsb2MmKSB7IH0gfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fYWxsb2Nfc3dhcDxfQWxsb2MsIGZhbHNlPgorICAgIHsKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChfQWxsb2MmIF9fb25lLCBfQWxsb2MmIF9fdHdvKQorICAgICAgeworCS8vIFByZWNvbmRpdGlvbjogc3dhcHBhYmxlIGFsbG9jYXRvcnMuCisJaWYgKF9fb25lICE9IF9fdHdvKQorCSAgc3dhcChfX29uZSwgX190d28pOworICAgICAgfQorICAgIH07CisKKyAgLy8gT3B0aW1pemUgZm9yIHN0YXRlbGVzcyBhbGxvY2F0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2MsIGJvb2wgPSBfX2lzX2VtcHR5KF9BbGxvYyk+CisgICAgc3RydWN0IF9fYWxsb2NfbmVxCisgICAgeworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9BbGxvYyYsIGNvbnN0IF9BbGxvYyYpCisgICAgICB7IHJldHVybiBmYWxzZTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfX2FsbG9jX25lcTxfQWxsb2MsIGZhbHNlPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19kb19pdChjb25zdCBfQWxsb2MmIF9fb25lLCBjb25zdCBfQWxsb2MmIF9fdHdvKQorICAgICAgeyByZXR1cm4gX19vbmUgIT0gX190d287IH0KKyAgICB9OworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgLy8gQSB2ZXJ5IGJhc2ljIGltcGxlbWVudGF0aW9uIGZvciBub3cuICBJbiBnZW5lcmFsIHdlIGhhdmUgdG8gd2FpdCBmb3IKKyAgLy8gdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgZGVzY3JpYmVkIGluIE4yOTgzOiAgd2Ugc2hvdWxkCisgIC8vIHRyeSB3aGVuIGVpdGhlciBUIGhhcyBhIG1vdmUgY29uc3RydWN0b3Igd2hpY2ggY2Fubm90IHRocm93IG9yIFQgaXMKKyAgLy8gQ29weUNvbnRydWN0aWJsZS4KKyAgLy8gTkI6IFRoaXMgY29kZSBkb2Vzbid0IHByb3Blcmx5IGJlbG9uZyBoZXJlLCB3ZSBzaG91bGQgZmluZCBhIG1vcmUKKyAgLy8gc3VpdGVkIHBsYWNlIGNvbW1vbiB0byBzdGQ6OnZlY3RvciBhbmQgc3RkOjpkZXF1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorCSAgIGJvb2wgPSBfX2hhc190cml2aWFsX2NvcHkodHlwZW5hbWUgX1RwOjp2YWx1ZV90eXBlKT4KKyAgICBzdHJ1Y3QgX19zaHJpbmtfdG9fZml0CisgICAgeyBzdGF0aWMgdm9pZCBfU19kb19pdChfVHAmKSB7IH0gfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc2hyaW5rX3RvX2ZpdDxfVHAsIHRydWU+CisgICAgeworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KF9UcCYgX192KQorICAgICAgeworCV9fdHJ5CisJICB7IF9UcChfX3YpLnN3YXAoX192KTsgfQorCV9fY2F0Y2goLi4uKSB7IH0KKyAgICAgIH0KKyAgICB9OworCisKKyAgLy8vIFthbGxvY2F0b3IudGFnXQorICBzdHJ1Y3QgYWxsb2NhdG9yX2FyZ190IHsgfTsKKworICBjb25zdGV4cHIgYWxsb2NhdG9yX2FyZ190IGFsbG9jYXRvcl9hcmcgPSBhbGxvY2F0b3JfYXJnX3QoKTsKKworX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGFsbG9jYXRvcl90eXBlKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLAorCSAgIGJvb2wgPSBfX2hhc19hbGxvY2F0b3JfdHlwZTxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jYXRvcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX191c2VzX2FsbG9jYXRvcl9oZWxwZXI8X1RwLCBfQWxsb2MsIHRydWU+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfY29udmVydGlibGU8X0FsbG9jLAorCQkJCSAgICAgdHlwZW5hbWUgX1RwOjphbGxvY2F0b3JfdHlwZT46OnZhbHVlPgorICAgIHsgfTsKKworICAvLy8gW2FsbG9jYXRvci51c2VzLnRyYWl0XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorCQkJICAgICAgIF9fdXNlc19hbGxvY2F0b3JfaGVscGVyPF9UcCwgX0FsbG9jPjo6dmFsdWU+CisgICAgeyB9OworCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYXRvbWljXzAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hdG9taWNfMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmY3NzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYXRvbWljXzAuaApAQCAtMCwwICsxLDY2MCBAQAorLy8gLSotIEMrKyAtKi0gaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2F0b21pY18wLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXthdG9taWN9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9BVE9NSUNfMF9ICisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ18wX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworLy8gMCA9PSBfX2F0b21pYzAgPT0gTmV2ZXIgbG9jay1mcmVlCituYW1lc3BhY2UgX19hdG9taWMwCit7CisgIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DCisKKyAgdm9pZAorICBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChfX2F0b21pY19mbGFnX2Jhc2UqLCBtZW1vcnlfb3JkZXIpCisgIF9HTElCQ1hYX05PVEhST1c7CisKKyAgdm9pZAorICBfX2F0b21pY19mbGFnX3dhaXRfZXhwbGljaXQoX19hdG9taWNfZmxhZ19iYXNlKiwgbWVtb3J5X29yZGVyKQorICBfR0xJQkNYWF9OT1RIUk9XOworCisgIF9HTElCQ1hYX0NPTlNUIF9fYXRvbWljX2ZsYWdfYmFzZSoKKyAgX19hdG9taWNfZmxhZ19mb3JfYWRkcmVzcyhjb25zdCB2b2xhdGlsZSB2b2lkKiBfX3opIF9HTElCQ1hYX05PVEhST1c7CisKKyAgX0dMSUJDWFhfRU5EX0VYVEVSTl9DCisKKyAgLy8gSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGVmaW5lcy4KKyNkZWZpbmUgX0FUT01JQ19NRU1CRVJfIF9NX2kKKworICAvLyBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkZWZpbmVzLgorI2RlZmluZSBfQVRPTUlDX0xPQURfKF9fYSwgX194KQkJCQkJCSAgIFwKKyAgKHt0eXBlZGVmIF9fdHlwZW9mX18oX0FUT01JQ19NRU1CRVJfKSBfX2lfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2lfdHlwZSogX19wID0gJl9BVE9NSUNfTUVNQkVSXzsJICAgCQkJCSAgIFwKKyAgICBfX2F0b21pY19mbGFnX2Jhc2UqIF9fZyA9IF9fYXRvbWljX2ZsYWdfZm9yX2FkZHJlc3MoX19wKTsJICAJICAgXAorICAgIF9fYXRvbWljX2ZsYWdfd2FpdF9leHBsaWNpdChfX2csIF9feCk7CQkJCSAgIFwKKyAgICBfX2lfdHlwZSBfX3IgPSAqX19wOwkJCQkJCSAgIFwKKyAgICBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChfX2csIF9feCk7CQkgICAgICAgCQkgICBcCisgICAgX19yOyB9KQorCisjZGVmaW5lIF9BVE9NSUNfU1RPUkVfKF9fYSwgX19uLCBfX3gpCQkJCQkgICBcCisgICh7dHlwZWRlZiBfX3R5cGVvZl9fKF9BVE9NSUNfTUVNQkVSXykgX19pX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19pX3R5cGUqIF9fcCA9ICZfQVRPTUlDX01FTUJFUl87CSAgIAkJCQkgICBcCisgICAgX190eXBlb2ZfXyhfX24pIF9fdyA9IChfX24pOwkJCSAgICAgICAJCSAgIFwKKyAgICBfX2F0b21pY19mbGFnX2Jhc2UqIF9fZyA9IF9fYXRvbWljX2ZsYWdfZm9yX2FkZHJlc3MoX19wKTsJICAJICAgXAorICAgIF9fYXRvbWljX2ZsYWdfd2FpdF9leHBsaWNpdChfX2csIF9feCk7CQkJCSAgIFwKKyAgICAqX19wID0gX193OwkJCQkJCQkJICAgXAorICAgIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KF9fZywgX194KTsJCSAgICAgICAJCSAgIFwKKyAgICBfX3c7IH0pCisKKyNkZWZpbmUgX0FUT01JQ19NT0RJRllfKF9fYSwgX19vLCBfX24sIF9feCkJCQkJICAgXAorICAoe3R5cGVkZWYgX190eXBlb2ZfXyhfQVRPTUlDX01FTUJFUl8pIF9faV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9faV90eXBlKiBfX3AgPSAmX0FUT01JQ19NRU1CRVJfOwkgICAJCQkJICAgXAorICAgIF9fdHlwZW9mX18oX19uKSBfX3cgPSAoX19uKTsJCQkgICAgICAgCQkgICBcCisgICAgX19hdG9taWNfZmxhZ19iYXNlKiBfX2cgPSBfX2F0b21pY19mbGFnX2Zvcl9hZGRyZXNzKF9fcCk7CSAgCSAgIFwKKyAgICBfX2F0b21pY19mbGFnX3dhaXRfZXhwbGljaXQoX19nLCBfX3gpOwkJCQkgICBcCisgICAgX19pX3R5cGUgX19yID0gKl9fcDsJCSAgICAgICAJCQkJICAgXAorICAgICpfX3AgX19vIF9fdzsJCQkJCSAgICAgICAJCSAgIFwKKyAgICBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChfX2csIF9feCk7CQkgICAgICAgCQkgICBcCisgICAgX19yOyB9KQorCisjZGVmaW5lIF9BVE9NSUNfQ01QRVhDSE5HXyhfX2EsIF9fZSwgX19uLCBfX3gpCQkJCSAgIFwKKyAgKHt0eXBlZGVmIF9fdHlwZW9mX18oX0FUT01JQ19NRU1CRVJfKSBfX2lfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2lfdHlwZSogX19wID0gJl9BVE9NSUNfTUVNQkVSXzsJICAgCQkJCSAgIFwKKyAgICBfX3R5cGVvZl9fKF9fZSkgX19xID0gKF9fZSk7CQkJICAgICAgIAkJICAgXAorICAgIF9fdHlwZW9mX18oX19uKSBfX3cgPSAoX19uKTsJCQkgICAgICAgCQkgICBcCisgICAgYm9vbCBfX3I7CQkJCQkJICAgICAgIAkJICAgXAorICAgIF9fYXRvbWljX2ZsYWdfYmFzZSogX19nID0gX19hdG9taWNfZmxhZ19mb3JfYWRkcmVzcyhfX3ApOwkgICAJICAgXAorICAgIF9fYXRvbWljX2ZsYWdfd2FpdF9leHBsaWNpdChfX2csIF9feCk7CQkJCSAgIFwKKyAgICBfX2lfdHlwZSBfX3QgPSAqX19wOwkJICAgICAgIAkJCQkgICBcCisgICAgaWYgKCpfX3EgPT0gX190KSAJCQkJCQkJICAgXAorICAgICAgewkJCQkJCQkJCSAgIFwKKwkqX19wID0gKF9faV90eXBlKV9fdzsJCQkJCQkgICBcCisJX19yID0gdHJ1ZTsJCQkJCQkJICAgXAorICAgICAgfQkJCQkJCQkJCSAgIFwKKyAgICBlbHNlIHsgKl9fcSA9IF9fdDsgX19yID0gZmFsc2U7IH0JCSAgICAgICAJCQkgICBcCisgICAgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQoX19nLCBfX3gpOwkJICAgICAgIAkJICAgXAorICAgIF9fcjsgfSkKKworCisgIC8vLyBhdG9taWNfZmxhZworICBzdHJ1Y3QgYXRvbWljX2ZsYWcgOiBwdWJsaWMgX19hdG9taWNfZmxhZ19iYXNlCisgIHsKKyAgICBhdG9taWNfZmxhZygpID0gZGVmYXVsdDsKKyAgICB+YXRvbWljX2ZsYWcoKSA9IGRlZmF1bHQ7CisgICAgYXRvbWljX2ZsYWcoY29uc3QgYXRvbWljX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgPSBkZWxldGU7CisgICAgYXRvbWljX2ZsYWcmIG9wZXJhdG9yPShjb25zdCBhdG9taWNfZmxhZyYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgLy8gQ29udmVyc2lvbiB0byBBVE9NSUNfRkxBR19JTklULgorICAgIGF0b21pY19mbGFnKGJvb2wgX19pKTogX19hdG9taWNfZmxhZ19iYXNlKHsgX19pIH0pIHsgfQorCisgICAgYm9vbAorICAgIHRlc3RfYW5kX3NldChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICAgYm9vbAorICAgIHRlc3RfYW5kX3NldChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlOworCisgICAgdm9pZAorICAgIGNsZWFyKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgICB2b2lkCisgICAgY2xlYXIobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZTsKKyAgfTsKKworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBhdG9taWMgaW50ZWdyYWxzLgorICAvLworICAvLyBGb3IgZWFjaCBvZiB0aGUgaW50ZWdyYWwgdHlwZXMsIGRlZmluZSBhdG9taWNfW2ludGVncmFsIHR5cGVdIHN0cnVjdAorICAvLworICAvLyBhdG9taWNfYm9vbCAgICAgYm9vbAorICAvLyBhdG9taWNfY2hhciAgICAgY2hhcgorICAvLyBhdG9taWNfc2NoYXIgICAgc2lnbmVkIGNoYXIKKyAgLy8gYXRvbWljX3VjaGFyICAgIHVuc2lnbmVkIGNoYXIKKyAgLy8gYXRvbWljX3Nob3J0ICAgIHNob3J0CisgIC8vIGF0b21pY191c2hvcnQgICB1bnNpZ25lZCBzaG9ydAorICAvLyBhdG9taWNfaW50ICAgICAgaW50CisgIC8vIGF0b21pY191aW50ICAgICB1bnNpZ25lZCBpbnQKKyAgLy8gYXRvbWljX2xvbmcgICAgIGxvbmcKKyAgLy8gYXRvbWljX3Vsb25nICAgIHVuc2lnbmVkIGxvbmcKKyAgLy8gYXRvbWljX2xsb25nICAgIGxvbmcgbG9uZworICAvLyBhdG9taWNfdWxsb25nICAgdW5zaWduZWQgbG9uZyBsb25nCisgIC8vIGF0b21pY19jaGFyMTZfdCBjaGFyMTZfdAorICAvLyBhdG9taWNfY2hhcjMyX3QgY2hhcjMyX3QKKyAgLy8gYXRvbWljX3djaGFyX3QgIHdjaGFyX3QKKworICAvLyBCYXNlIHR5cGUuCisgIC8vIE5COiBBc3N1bWluZyBfSVRwIGlzIGFuIGludGVncmFsIHNjYWxhciB0eXBlIHRoYXQgaXMgMSwgMiwgNCwgb3IgOCBieXRlcywKKyAgLy8gc2luY2UgdGhhdCBpcyB3aGF0IEdDQyBidWlsdC1pbiBmdW5jdGlvbnMgZm9yIGF0b21pYyBtZW1vcnkgYWNjZXNzIHdvcmsgb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgc3RydWN0IF9fYXRvbWljX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX0lUcCAJX19pbnRfdHlwZTsKKworICAgICAgX19pbnRfdHlwZSAJX01faTsKKworICAgIHB1YmxpYzoKKyAgICAgIF9fYXRvbWljX2Jhc2UoKSA9IGRlZmF1bHQ7CisgICAgICB+X19hdG9taWNfYmFzZSgpID0gZGVmYXVsdDsKKyAgICAgIF9fYXRvbWljX2Jhc2UoY29uc3QgX19hdG9taWNfYmFzZSYpID0gZGVsZXRlOworICAgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9fYXRvbWljX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2F0b21pY19iYXNlJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIC8vIFJlcXVpcmVzIF9faW50X3R5cGUgY29udmVydGlibGUgdG8gX01fYmFzZS5fTV9pLgorICAgICAgY29uc3RleHByIF9fYXRvbWljX2Jhc2UoX19pbnRfdHlwZSBfX2kpOiBfTV9pIChfX2kpIHsgfQorCisgICAgICBvcGVyYXRvciBfX2ludF90eXBlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBvcGVyYXRvciBfX2ludF90eXBlKCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcj0oX19pbnRfdHlwZSBfX2kpCisgICAgICB7CisJc3RvcmUoX19pKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcj0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlCisgICAgICB7CisJc3RvcmUoX19pKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKSArIDE7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSkgKyAxOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeyByZXR1cm4gZmV0Y2hfc3ViKDEpIC0gMTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci0tKCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKSAtIDE7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrPShfX2ludF90eXBlIF9faSkKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZChfX2kpICsgX19pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yKz0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoX19pKSArIF9faTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci09KF9faW50X3R5cGUgX19pKQorICAgICAgeyByZXR1cm4gZmV0Y2hfc3ViKF9faSkgLSBfX2k7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItPShfX2ludF90eXBlIF9faSkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YihfX2kpIC0gX19pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yJj0oX19pbnRfdHlwZSBfX2kpCisgICAgICB7IHJldHVybiBmZXRjaF9hbmQoX19pKSAmIF9faTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvciY9KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gZmV0Y2hfYW5kKF9faSkgJiBfX2k7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3J8PShfX2ludF90eXBlIF9faSkKKyAgICAgIHsgcmV0dXJuIGZldGNoX29yKF9faSkgfCBfX2k7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3J8PShfX2ludF90eXBlIF9faSkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX29yKF9faSkgfCBfX2k7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3JePShfX2ludF90eXBlIF9faSkKKyAgICAgIHsgcmV0dXJuIGZldGNoX3hvcihfX2kpIF4gX19pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yXj0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBmZXRjaF94b3IoX19pKSBeIF9faTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisJX0FUT01JQ19TVE9SRV8odGhpcywgX19pLCBfX20pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCV9BVE9NSUNfU1RPUkVfKHRoaXMsIF9faSwgX19tKTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlyZXR1cm4gX0FUT01JQ19MT0FEXyh0aGlzLCBfX20pOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCXJldHVybiBfQVRPTUlDX0xPQURfKHRoaXMsIF9fbSk7CisgICAgICB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7IHJldHVybiBfQVRPTUlDX01PRElGWV8odGhpcywgPSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfQVRPTUlDX01PRElGWV8odGhpcywgPSwgX19pLCBfX20pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisJcmV0dXJuIF9BVE9NSUNfQ01QRVhDSE5HXyh0aGlzLCAmX19pMSwgX19pMiwgX19tMSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisJcmV0dXJuIF9BVE9NSUNfQ01QRVhDSE5HXyh0aGlzLCAmX19pMSwgX19pMiwgX19tMSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tLAorCQkJCSAgICAgX19jYWxjdWxhdGVfbWVtb3J5X29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsKKwlyZXR1cm4gY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faTEsIF9faTIsIF9fbSwKKwkJCQkgICAgIF9fY2FsY3VsYXRlX21lbW9yeV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisJcmV0dXJuIF9BVE9NSUNfQ01QRVhDSE5HXyh0aGlzLCAmX19pMSwgX19pMiwgX19tMSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLCBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20yIDw9IF9fbTEpOworCXJldHVybiBfQVRPTUlDX0NNUEVYQ0hOR18odGhpcywgJl9faTEsIF9faTIsIF9fbTEpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faTEsIF9faTIsIF9fbSwKKwkJCQkgICAgICAgX19jYWxjdWxhdGVfbWVtb3J5X29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faTEsIF9faTIsIF9fbSwKKwkJCQkgICAgICAgX19jYWxjdWxhdGVfbWVtb3J5X29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9hZGQoX19pbnRfdHlwZSBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICAgIHsgcmV0dXJuIF9BVE9NSUNfTU9ESUZZXyh0aGlzLCArPSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX2FkZChfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX0FUT01JQ19NT0RJRllfKHRoaXMsICs9LCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfc3ViKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7IHJldHVybiBfQVRPTUlDX01PRElGWV8odGhpcywgLT0sIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9zdWIoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9BVE9NSUNfTU9ESUZZXyh0aGlzLCAtPSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX2FuZChfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX0FUT01JQ19NT0RJRllfKHRoaXMsICY9LCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfYW5kKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfQVRPTUlDX01PRElGWV8odGhpcywgJj0sIF9faSwgX19tKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9vcihfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX0FUT01JQ19NT0RJRllfKHRoaXMsIHw9LCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfb3IoX19pbnRfdHlwZSBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9BVE9NSUNfTU9ESUZZXyh0aGlzLCB8PSwgX19pLCBfX20pOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX3hvcihfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX0FUT01JQ19NT0RJRllfKHRoaXMsIF49LCBfX2ksIF9fbSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfeG9yKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfQVRPTUlDX01PRElGWV8odGhpcywgXj0sIF9faSwgX19tKTsgfQorICAgIH07CisKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1BUcD4KKyAgICBzdHJ1Y3QgX19hdG9taWNfYmFzZTxfUFRwKj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX1BUcCogCV9fcmV0dXJuX3BvaW50ZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCogCV9fcG9pbnRlcl90eXBlOworICAgICAgX19wb2ludGVyX3R5cGUgCV9NX2k7CisKKyAgICBwdWJsaWM6CisgICAgICBfX2F0b21pY19iYXNlKCkgPSBkZWZhdWx0OworICAgICAgfl9fYXRvbWljX2Jhc2UoKSA9IGRlZmF1bHQ7CisgICAgICBfX2F0b21pY19iYXNlKGNvbnN0IF9fYXRvbWljX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9fYXRvbWljX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpIHZvbGF0aWxlID0gZGVsZXRlOworCisgICAgICAvLyBSZXF1aXJlcyBfX3BvaW50ZXJfdHlwZSBjb252ZXJ0aWJsZSB0byBfTV9pLgorICAgICAgY29uc3RleHByIF9fYXRvbWljX2Jhc2UoX19yZXR1cm5fcG9pbnRlcl90eXBlIF9fcCk6IF9NX2kgKF9fcCkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcmV0dXJuX3BvaW50ZXJfdHlwZSgpIGNvbnN0CisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PF9fcmV0dXJuX3BvaW50ZXJfdHlwZT4obG9hZCgpKTsgfQorCisgICAgICBvcGVyYXRvciBfX3JldHVybl9wb2ludGVyX3R5cGUoKSBjb25zdCB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KGxvYWQoKSk7IH0KKworICAgICAgX19yZXR1cm5fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcj0oX19wb2ludGVyX3R5cGUgX19wKQorICAgICAgeworCXN0b3JlKF9fcCk7CisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihfX3ApOworICAgICAgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yPShfX3BvaW50ZXJfdHlwZSBfX3ApIHZvbGF0aWxlCisgICAgICB7CisJc3RvcmUoX19wKTsKKwlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KF9fcCk7CisgICAgICB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PF9fcmV0dXJuX3BvaW50ZXJfdHlwZT4oZmV0Y2hfYWRkKDEpKTsgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoaW50KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KGZldGNoX2FkZCgxKSk7IH0KKworICAgICAgX19yZXR1cm5fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihmZXRjaF9zdWIoMSkpOyB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PF9fcmV0dXJuX3BvaW50ZXJfdHlwZT4oZmV0Y2hfc3ViKDEpKTsgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KGZldGNoX2FkZCgxKSArIDEpOyB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PF9fcmV0dXJuX3BvaW50ZXJfdHlwZT4oZmV0Y2hfYWRkKDEpICsgMSk7IH0KKworICAgICAgX19yZXR1cm5fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihmZXRjaF9zdWIoMSkgLSAxKTsgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KGZldGNoX3N1YigxKSAtIDEpOyB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKQorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KGZldGNoX2FkZChfX2QpICsgX19kKTsgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihmZXRjaF9hZGQoX19kKSArIF9fZCk7IH0KKworICAgICAgX19yZXR1cm5fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX2QpCisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PF9fcmV0dXJuX3BvaW50ZXJfdHlwZT4oZmV0Y2hfc3ViKF9fZCkgLSBfX2QpOyB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KGZldGNoX3N1YihfX2QpIC0gX19kKTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX3BvaW50ZXJfdHlwZSBfX3AsIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKwlfQVRPTUlDX1NUT1JFXyh0aGlzLCBfX3AsIF9fbSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCXZvbGF0aWxlIF9fcG9pbnRlcl90eXBlKiBfX3AyID0gJl9NX2k7CisJX190eXBlb2ZfXyhfX3ApIF9fdyA9IChfX3ApOworCV9fYXRvbWljX2ZsYWdfYmFzZSogX19nID0gX19hdG9taWNfZmxhZ19mb3JfYWRkcmVzcyhfX3AyKTsKKwlfX2F0b21pY19mbGFnX3dhaXRfZXhwbGljaXQoX19nLCBfX20pOworCSpfX3AyID0gcmVpbnRlcnByZXRfY2FzdDxfX3BvaW50ZXJfdHlwZT4oX193KTsKKwlhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChfX2csIF9fbSk7CisJX193OworICAgICAgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIGxvYWQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJdm9pZCogX192ID0gX0FUT01JQ19MT0FEXyh0aGlzLCBfX20pOworCXJldHVybiByZWludGVycHJldF9jYXN0PF9fcmV0dXJuX3BvaW50ZXJfdHlwZT4oX192KTsKKyAgICAgIH0KKworICAgICAgX19yZXR1cm5fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCXZvaWQqIF9fdiA9IF9BVE9NSUNfTE9BRF8odGhpcywgX19tKTsKKwlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KF9fdik7CisgICAgICB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgZXhjaGFuZ2UoX19wb2ludGVyX3R5cGUgX19wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJdm9pZCogX192ID0gX0FUT01JQ19NT0RJRllfKHRoaXMsID0sIF9fcCwgX19tKTsKKwlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KF9fdik7CisgICAgICB9CisKKyAgICAgIF9fcmV0dXJuX3BvaW50ZXJfdHlwZQorICAgICAgZXhjaGFuZ2UoX19wb2ludGVyX3R5cGUgX19wLAorCSAgICAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7CisJdm9sYXRpbGUgX19wb2ludGVyX3R5cGUqIF9fcDIgPSAmX01faTsKKwlfX3R5cGVvZl9fKF9fcCkgX193ID0gKF9fcCk7CisJX19hdG9taWNfZmxhZ19iYXNlKiBfX2cgPSBfX2F0b21pY19mbGFnX2Zvcl9hZGRyZXNzKF9fcDIpOworCV9fYXRvbWljX2ZsYWdfd2FpdF9leHBsaWNpdChfX2csIF9fbSk7CisJX19wb2ludGVyX3R5cGUgX19yID0gKl9fcDI7CisJKl9fcDIgPSBfX3c7CisJYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQoX19nLCBfX20pOworCV9fcjsKKwlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfX3JldHVybl9wb2ludGVyX3R5cGU+KF9NX2kpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3JldHVybl9wb2ludGVyX3R5cGUmIF9fcnAxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisJX19wb2ludGVyX3R5cGUmIF9fcDEgPSByZWludGVycHJldF9jYXN0PHZvaWQqJj4oX19ycDEpOworCXJldHVybiBfQVRPTUlDX0NNUEVYQ0hOR18odGhpcywgJl9fcDEsIF9fcDIsIF9fbTEpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX3JldHVybl9wb2ludGVyX3R5cGUmIF9fcnAxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisJX19wb2ludGVyX3R5cGUmIF9fcDEgPSByZWludGVycHJldF9jYXN0PHZvaWQqJj4oX19ycDEpOworCXJldHVybiBfQVRPTUlDX0NNUEVYQ0hOR18odGhpcywgJl9fcDEsIF9fcDIsIF9fbTEpOworICAgICAgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX2FkZChwdHJkaWZmX3QgX19kLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJdm9pZCogX192ID0gX0FUT01JQ19NT0RJRllfKHRoaXMsICs9LCBfX2QsIF9fbSk7CisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihfX3YpOworICAgICAgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX2FkZChwdHJkaWZmX3QgX19kLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7CisJdm9pZCogX192ID0gX0FUT01JQ19NT0RJRllfKHRoaXMsICs9LCBfX2QsIF9fbSk7CisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihfX3YpOworICAgICAgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX3N1YihwdHJkaWZmX3QgX19kLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJdm9pZCogX192ID0gX0FUT01JQ19NT0RJRllfKHRoaXMsIC09LCBfX2QsIF9fbSk7CisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihfX3YpOworICAgICAgfQorCisgICAgICBfX3JldHVybl9wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX3N1YihwdHJkaWZmX3QgX19kLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7CisJdm9pZCogX192ID0gX0FUT01JQ19NT0RJRllfKHRoaXMsIC09LCBfX2QsIF9fbSk7CisJcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X19yZXR1cm5fcG9pbnRlcl90eXBlPihfX3YpOworICAgICAgfQorICAgIH07CisKKyN1bmRlZiBfQVRPTUlDX0xPQURfCisjdW5kZWYgX0FUT01JQ19TVE9SRV8KKyN1bmRlZiBfQVRPTUlDX01PRElGWV8KKyN1bmRlZiBfQVRPTUlDX0NNUEVYQ0hOR18KK30gLy8gbmFtZXNwYWNlIF9fYXRvbWljMAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hdG9taWNfMi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2F0b21pY18yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1YmVjYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hdG9taWNfMi5oCkBAIC0wLDAgKzEsNjY5IEBACisvLyAtKi0gQysrIC0qLSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYXRvbWljXzIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2F0b21pY30KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQ18yX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDXzJfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisvLyAyID09IF9fYXRvbWljMiA9PSBBbHdheXMgbG9jay1mcmVlCisvLyBBc3N1bWVkOgorLy8gX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzEKKy8vIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU18yCisvLyBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlNfNAorLy8gX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzgKK25hbWVzcGFjZSBfX2F0b21pYzIKK3sKKyAgLy8vIGF0b21pY19mbGFnCisgIHN0cnVjdCBhdG9taWNfZmxhZyA6IHB1YmxpYyBfX2F0b21pY19mbGFnX2Jhc2UKKyAgeworICAgIGF0b21pY19mbGFnKCkgPSBkZWZhdWx0OworICAgIH5hdG9taWNfZmxhZygpID0gZGVmYXVsdDsKKyAgICBhdG9taWNfZmxhZyhjb25zdCBhdG9taWNfZmxhZyYpID0gZGVsZXRlOworICAgIGF0b21pY19mbGFnJiBvcGVyYXRvcj0oY29uc3QgYXRvbWljX2ZsYWcmKSA9IGRlbGV0ZTsKKyAgICBhdG9taWNfZmxhZyYgb3BlcmF0b3I9KGNvbnN0IGF0b21pY19mbGFnJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAvLyBDb252ZXJzaW9uIHRvIEFUT01JQ19GTEFHX0lOSVQuCisgICAgYXRvbWljX2ZsYWcoYm9vbCBfX2kpOiBfX2F0b21pY19mbGFnX2Jhc2UoeyBfX2kgfSkgeyB9CisKKyAgICBib29sCisgICAgdGVzdF9hbmRfc2V0KG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICB7CisgICAgICAvLyBSZWR1bmRhbnQgc3luY2hyb25pemUgaWYgYnVpbHQtaW4gZm9yIGxvY2sgaXMgYSBmdWxsIGJhcnJpZXIuCisgICAgICBpZiAoX19tICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlICYmIF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCkKKwlfX3N5bmNfc3luY2hyb25pemUoKTsKKyAgICAgIHJldHVybiBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJl9NX2ksIDEpOworICAgIH0KKworICAgIGJvb2wKKyAgICB0ZXN0X2FuZF9zZXQobWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgIHsKKyAgICAgIC8vIFJlZHVuZGFudCBzeW5jaHJvbml6ZSBpZiBidWlsdC1pbiBmb3IgbG9jayBpcyBhIGZ1bGwgYmFycmllci4KKyAgICAgIGlmIChfX20gIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUgJiYgX19tICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKQorCV9fc3luY19zeW5jaHJvbml6ZSgpOworICAgICAgcmV0dXJuIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCgmX01faSwgMSk7CisgICAgfQorCisgICAgdm9pZAorICAgIGNsZWFyKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICB7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisKKyAgICAgIF9fc3luY19sb2NrX3JlbGVhc2UoJl9NX2kpOworICAgICAgaWYgKF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSAmJiBfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpCisJX19zeW5jX3N5bmNocm9uaXplKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIGNsZWFyKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICB7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisKKyAgICAgIF9fc3luY19sb2NrX3JlbGVhc2UoJl9NX2kpOworICAgICAgaWYgKF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxdWlyZSAmJiBfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpCisJX19zeW5jX3N5bmNocm9uaXplKCk7CisgICAgfQorICB9OworCisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIGF0b21pYyBpbnRlZ3JhbHMuCisgIC8vCisgIC8vIEZvciBlYWNoIG9mIHRoZSBpbnRlZ3JhbCB0eXBlcywgZGVmaW5lIGF0b21pY19baW50ZWdyYWwgdHlwZV0gc3RydWN0CisgIC8vCisgIC8vIGF0b21pY19ib29sICAgICBib29sCisgIC8vIGF0b21pY19jaGFyICAgICBjaGFyCisgIC8vIGF0b21pY19zY2hhciAgICBzaWduZWQgY2hhcgorICAvLyBhdG9taWNfdWNoYXIgICAgdW5zaWduZWQgY2hhcgorICAvLyBhdG9taWNfc2hvcnQgICAgc2hvcnQKKyAgLy8gYXRvbWljX3VzaG9ydCAgIHVuc2lnbmVkIHNob3J0CisgIC8vIGF0b21pY19pbnQgICAgICBpbnQKKyAgLy8gYXRvbWljX3VpbnQgICAgIHVuc2lnbmVkIGludAorICAvLyBhdG9taWNfbG9uZyAgICAgbG9uZworICAvLyBhdG9taWNfdWxvbmcgICAgdW5zaWduZWQgbG9uZworICAvLyBhdG9taWNfbGxvbmcgICAgbG9uZyBsb25nCisgIC8vIGF0b21pY191bGxvbmcgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgLy8gYXRvbWljX2NoYXIxNl90IGNoYXIxNl90CisgIC8vIGF0b21pY19jaGFyMzJfdCBjaGFyMzJfdAorICAvLyBhdG9taWNfd2NoYXJfdCAgd2NoYXJfdAorICAvLworICAvLyBOQjogQXNzdW1pbmcgX0lUcCBpcyBhbiBpbnRlZ3JhbCBzY2FsYXIgdHlwZSB0aGF0IGlzIDEsIDIsIDQsIG9yCisgIC8vIDggYnl0ZXMsIHNpbmNlIHRoYXQgaXMgd2hhdCBHQ0MgYnVpbHQtaW4gZnVuY3Rpb25zIGZvciBhdG9taWMKKyAgLy8gbWVtb3J5IGFjY2VzcyBleHBlY3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JVHA+CisgICAgc3RydWN0IF9fYXRvbWljX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX0lUcCAJX19pbnRfdHlwZTsKKworICAgICAgX19pbnRfdHlwZSAJX01faTsKKworICAgIHB1YmxpYzoKKyAgICAgIF9fYXRvbWljX2Jhc2UoKSA9IGRlZmF1bHQ7CisgICAgICB+X19hdG9taWNfYmFzZSgpID0gZGVmYXVsdDsKKyAgICAgIF9fYXRvbWljX2Jhc2UoY29uc3QgX19hdG9taWNfYmFzZSYpID0gZGVsZXRlOworICAgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9fYXRvbWljX2Jhc2UmIG9wZXJhdG9yPShjb25zdCBfX2F0b21pY19iYXNlJikgdm9sYXRpbGUgPSBkZWxldGU7CisKKyAgICAgIC8vIFJlcXVpcmVzIF9faW50X3R5cGUgY29udmVydGlibGUgdG8gX01faS4KKyAgICAgIGNvbnN0ZXhwciBfX2F0b21pY19iYXNlKF9faW50X3R5cGUgX19pKTogX01faSAoX19pKSB7IH0KKworICAgICAgb3BlcmF0b3IgX19pbnRfdHlwZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgb3BlcmF0b3IgX19pbnRfdHlwZSgpIGNvbnN0IHZvbGF0aWxlCisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3I9KF9faW50X3R5cGUgX19pKQorICAgICAgeworCXN0b3JlKF9faSk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3I9KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZQorICAgICAgeworCXN0b3JlKF9faSk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7IHJldHVybiBmZXRjaF9zdWIoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLShpbnQpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBmZXRjaF9zdWIoMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiBfX3N5bmNfYWRkX2FuZF9mZXRjaCgmX01faSwgMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrKygpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfX3N5bmNfYWRkX2FuZF9mZXRjaCgmX01faSwgMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7IHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmX01faSwgMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItLSgpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmX01faSwgMSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3IrPShfX2ludF90eXBlIF9faSkKKyAgICAgIHsgcmV0dXJuIF9fc3luY19hZGRfYW5kX2ZldGNoKCZfTV9pLCBfX2kpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yKz0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfX3N5bmNfYWRkX2FuZF9mZXRjaCgmX01faSwgX19pKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvci09KF9faW50X3R5cGUgX19pKQorICAgICAgeyByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3ItPShfX2ludF90eXBlIF9faSkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9fc3luY19zdWJfYW5kX2ZldGNoKCZfTV9pLCBfX2kpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yJj0oX19pbnRfdHlwZSBfX2kpCisgICAgICB7IHJldHVybiBfX3N5bmNfYW5kX2FuZF9mZXRjaCgmX01faSwgX19pKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBvcGVyYXRvciY9KF9faW50X3R5cGUgX19pKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX19zeW5jX2FuZF9hbmRfZmV0Y2goJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3J8PShfX2ludF90eXBlIF9faSkKKyAgICAgIHsgcmV0dXJuIF9fc3luY19vcl9hbmRfZmV0Y2goJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3J8PShfX2ludF90eXBlIF9faSkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9fc3luY19vcl9hbmRfZmV0Y2goJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgb3BlcmF0b3JePShfX2ludF90eXBlIF9faSkKKyAgICAgIHsgcmV0dXJuIF9fc3luY194b3JfYW5kX2ZldGNoKCZfTV9pLCBfX2kpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIG9wZXJhdG9yXj0oX19pbnRfdHlwZSBfX2kpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfX3N5bmNfeG9yX2FuZF9mZXRjaCgmX01faSwgX19pKTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBib29sCisgICAgICBpc19sb2NrX2ZyZWUoKSBjb25zdCB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCisJaWYgKF9fbSA9PSBtZW1vcnlfb3JkZXJfcmVsYXhlZCkKKwkgIF9NX2kgPSBfX2k7CisJZWxzZQorCSAgeworCSAgICAvLyB3cml0ZV9tZW1fYmFycmllcigpOworCSAgICBfTV9pID0gX19pOworCSAgICBpZiAoX19tID09IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorCSAgICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzdG9yZShfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCisJaWYgKF9fbSA9PSBtZW1vcnlfb3JkZXJfcmVsYXhlZCkKKwkgIF9NX2kgPSBfX2k7CisJZWxzZQorCSAgeworCSAgICAvLyB3cml0ZV9tZW1fYmFycmllcigpOworCSAgICBfTV9pID0gX19pOworCSAgICBpZiAoX19tID09IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorCSAgICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOworCSAgfQorICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisJX19zeW5jX3N5bmNocm9uaXplKCk7CisJX19pbnRfdHlwZSBfX3JldCA9IF9NX2k7CisJX19zeW5jX3N5bmNocm9uaXplKCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisJX19zeW5jX3N5bmNocm9uaXplKCk7CisJX19pbnRfdHlwZSBfX3JldCA9IF9NX2k7CisJX19zeW5jX3N5bmNocm9uaXplKCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBleGNoYW5nZShfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeworCS8vIFhYWCBidWlsdC1pbiBhc3N1bWVzIG1lbW9yeV9vcmRlcl9hY3F1aXJlLgorCXJldHVybiBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJl9NX2ksIF9faSk7CisgICAgICB9CisKKworICAgICAgX19pbnRfdHlwZQorICAgICAgZXhjaGFuZ2UoX19pbnRfdHlwZSBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsKKwkvLyBYWFggYnVpbHQtaW4gYXNzdW1lcyBtZW1vcnlfb3JkZXJfYWNxdWlyZS4KKwlyZXR1cm4gX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCZfTV9pLCBfX2kpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgIG1lbW9yeV9vcmRlciBfX20xLCBtZW1vcnlfb3JkZXIgX19tMikKKyAgICAgIHsgcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faTEsIF9faTIsIF9fbTEsIF9fbTIpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pMSwgX19pMiwgX19tMSwgX19tMik7IH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV93ZWFrKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJCSAgICBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJcmV0dXJuIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2kxLCBfX2kyLCBfX20sCisJCQkJICAgICBfX2NhbGN1bGF0ZV9tZW1vcnlfb3JkZXIoX19tKSk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfd2VhayhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3dlYWsoX19pMSwgX19pMiwgX19tLAorCQkJCSAgICAgX19jYWxjdWxhdGVfbWVtb3J5X29yZGVyKF9fbSkpOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2ludF90eXBlJiBfX2kxLCBfX2ludF90eXBlIF9faTIsCisJCQkgICAgICBtZW1vcnlfb3JkZXIgX19tMSwgbWVtb3J5X29yZGVyIF9fbTIpCisgICAgICB7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiA8PSBfX20xKTsKKworCV9faW50X3R5cGUgX19pMW8gPSBfX2kxOworCV9faW50X3R5cGUgX19pMW4gPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJl9NX2ksIF9faTFvLCBfX2kyKTsKKworCS8vIEFzc3VtZSBleHRyYSBzdG9yZXMgKG9mIHNhbWUgdmFsdWUpIGFsbG93ZWQgaW4gdHJ1ZSBjYXNlLgorCV9faTEgPSBfX2kxbjsKKwlyZXR1cm4gX19pMW8gPT0gX19pMW47CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9faW50X3R5cGUmIF9faTEsIF9faW50X3R5cGUgX19pMiwKKwkJCSAgICAgIG1lbW9yeV9vcmRlciBfX20xLCBtZW1vcnlfb3JkZXIgX19tMikgdm9sYXRpbGUKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20yIDw9IF9fbTEpOworCisJX19pbnRfdHlwZSBfX2kxbyA9IF9faTE7CisJX19pbnRfdHlwZSBfX2kxbiA9IF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgmX01faSwgX19pMW8sIF9faTIpOworCisJLy8gQXNzdW1lIGV4dHJhIHN0b3JlcyAob2Ygc2FtZSB2YWx1ZSkgYWxsb3dlZCBpbiB0cnVlIGNhc2UuCisJX19pMSA9IF9faTFuOworCXJldHVybiBfX2kxbyA9PSBfX2kxbjsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20sCisJCQkJICAgICAgIF9fY2FsY3VsYXRlX21lbW9yeV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoX19pbnRfdHlwZSYgX19pMSwgX19pbnRfdHlwZSBfX2kyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCXJldHVybiBjb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhfX2kxLCBfX2kyLCBfX20sCisJCQkJICAgICAgIF9fY2FsY3VsYXRlX21lbW9yeV9vcmRlcihfX20pKTsKKyAgICAgIH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfYWRkKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7IHJldHVybiBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmX01faSwgX19pKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9hZGQoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZfTV9pLCBfX2kpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX3N1YihfX2ludF90eXBlIF9faSwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9zdWIoJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfc3ViKF9faW50X3R5cGUgX19pLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfX3N5bmNfZmV0Y2hfYW5kX3N1YigmX01faSwgX19pKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF9hbmQoX19pbnRfdHlwZSBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICAgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYW5kKCZfTV9pLCBfX2kpOyB9CisKKyAgICAgIF9faW50X3R5cGUKKyAgICAgIGZldGNoX2FuZChfX2ludF90eXBlIF9faSwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9hbmQoJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfb3IoX19pbnRfdHlwZSBfX2ksIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICAgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfb3IoJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfb3IoX19pbnRfdHlwZSBfX2ksCisJICAgICAgIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfb3IoJl9NX2ksIF9faSk7IH0KKworICAgICAgX19pbnRfdHlwZQorICAgICAgZmV0Y2hfeG9yKF9faW50X3R5cGUgX19pLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7IHJldHVybiBfX3N5bmNfZmV0Y2hfYW5kX3hvcigmX01faSwgX19pKTsgfQorCisgICAgICBfX2ludF90eXBlCisgICAgICBmZXRjaF94b3IoX19pbnRfdHlwZSBfX2ksCisJCW1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfeG9yKCZfTV9pLCBfX2kpOyB9CisgICAgfTsKKworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUFRwPgorICAgIHN0cnVjdCBfX2F0b21pY19iYXNlPF9QVHAqPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfUFRwKiAJX19wb2ludGVyX3R5cGU7CisKKyAgICAgIF9fcG9pbnRlcl90eXBlIAlfTV9wOworCisgICAgcHVibGljOgorICAgICAgX19hdG9taWNfYmFzZSgpID0gZGVmYXVsdDsKKyAgICAgIH5fX2F0b21pY19iYXNlKCkgPSBkZWZhdWx0OworICAgICAgX19hdG9taWNfYmFzZShjb25zdCBfX2F0b21pY19iYXNlJikgPSBkZWxldGU7CisgICAgICBfX2F0b21pY19iYXNlJiBvcGVyYXRvcj0oY29uc3QgX19hdG9taWNfYmFzZSYpID0gZGVsZXRlOworICAgICAgX19hdG9taWNfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9fYXRvbWljX2Jhc2UmKSB2b2xhdGlsZSA9IGRlbGV0ZTsKKworICAgICAgLy8gUmVxdWlyZXMgX19wb2ludGVyX3R5cGUgY29udmVydGlibGUgdG8gX01fcC4KKyAgICAgIGNvbnN0ZXhwciBfX2F0b21pY19iYXNlKF9fcG9pbnRlcl90eXBlIF9fcCk6IF9NX3AgKF9fcCkgeyB9CisKKyAgICAgIG9wZXJhdG9yIF9fcG9pbnRlcl90eXBlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGxvYWQoKTsgfQorCisgICAgICBvcGVyYXRvciBfX3BvaW50ZXJfdHlwZSgpIGNvbnN0IHZvbGF0aWxlCisgICAgICB7IHJldHVybiBsb2FkKCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yPShfX3BvaW50ZXJfdHlwZSBfX3ApCisgICAgICB7CisJc3RvcmUoX19wKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3I9KF9fcG9pbnRlcl90eXBlIF9fcCkgdm9sYXRpbGUKKyAgICAgIHsKKwlzdG9yZShfX3ApOworCXJldHVybiBfX3A7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKyhpbnQpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeyByZXR1cm4gZmV0Y2hfc3ViKDEpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKGludCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiBmZXRjaF9hZGQoMSkgKyAxOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvcisrKCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZCgxKSArIDE7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeyByZXR1cm4gZmV0Y2hfc3ViKDEpIC0xOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci0tKCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX3N1YigxKSAtMTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19kKQorICAgICAgeyByZXR1cm4gZmV0Y2hfYWRkKF9fZCkgKyBfX2Q7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fZCkgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIGZldGNoX2FkZChfX2QpICsgX19kOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX2QpCisgICAgICB7IHJldHVybiBmZXRjaF9zdWIoX19kKSAtIF9fZDsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19kKSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gZmV0Y2hfc3ViKF9fZCkgLSBfX2Q7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgYm9vbAorICAgICAgaXNfbG9ja19mcmVlKCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgdm9pZAorICAgICAgc3RvcmUoX19wb2ludGVyX3R5cGUgX19wLCBtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgICB7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisKKwlpZiAoX19tID09IG1lbW9yeV9vcmRlcl9yZWxheGVkKQorCSAgX01fcCA9IF9fcDsKKwllbHNlCisJICB7CisJICAgIC8vIHdyaXRlX21lbV9iYXJyaWVyKCk7CisJICAgIF9NX3AgPSBfX3A7CisJICAgIGlmIChfX20gPT0gbWVtb3J5X29yZGVyX3NlcV9jc3QpCisJICAgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN0b3JlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2NvbnN1bWUpOworCisJaWYgKF9fbSA9PSBtZW1vcnlfb3JkZXJfcmVsYXhlZCkKKwkgIF9NX3AgPSBfX3A7CisJZWxzZQorCSAgeworCSAgICAvLyB3cml0ZV9tZW1fYmFycmllcigpOworCSAgICBfTV9wID0gX19wOworCSAgICBpZiAoX19tID09IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorCSAgICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOworCSAgfQorICAgICAgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgbG9hZChtZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCV9fZ2xpYmN4eF9hc3NlcnQoX19tICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworCV9fc3luY19zeW5jaHJvbml6ZSgpOworCV9fcG9pbnRlcl90eXBlIF9fcmV0ID0gX01fcDsKKwlfX3N5bmNfc3luY2hyb25pemUoKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBsb2FkKG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbSAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20gIT0gbWVtb3J5X29yZGVyX2FjcV9yZWwpOworCisJX19zeW5jX3N5bmNocm9uaXplKCk7CisJX19wb2ludGVyX3R5cGUgX19yZXQgPSBfTV9wOworCV9fc3luY19zeW5jaHJvbml6ZSgpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9fcG9pbnRlcl90eXBlIF9fcCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeworCS8vIFhYWCBidWlsdC1pbiBhc3N1bWVzIG1lbW9yeV9vcmRlcl9hY3F1aXJlLgorCXJldHVybiBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJl9NX3AsIF9fcCk7CisgICAgICB9CisKKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGV4Y2hhbmdlKF9fcG9pbnRlcl90eXBlIF9fcCwKKwkgICAgICAgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeworCS8vIFhYWCBidWlsdC1pbiBhc3N1bWVzIG1lbW9yeV9vcmRlcl9hY3F1aXJlLgorCXJldHVybiBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoJl9NX3AsIF9fcCk7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisKKwlfX3BvaW50ZXJfdHlwZSBfX3AxbyA9IF9fcDE7CisJX19wb2ludGVyX3R5cGUgX19wMW4gPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJl9NX3AsIF9fcDFvLCBfX3AyKTsKKworCS8vIEFzc3VtZSBleHRyYSBzdG9yZXMgKG9mIHNhbWUgdmFsdWUpIGFsbG93ZWQgaW4gdHJ1ZSBjYXNlLgorCV9fcDEgPSBfX3AxbjsKKwlyZXR1cm4gX19wMW8gPT0gX19wMW47CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIGNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKF9fcG9pbnRlcl90eXBlJiBfX3AxLCBfX3BvaW50ZXJfdHlwZSBfX3AyLAorCQkJICAgICAgbWVtb3J5X29yZGVyIF9fbTEsIG1lbW9yeV9vcmRlciBfX20yKSB2b2xhdGlsZQorICAgICAgeworCV9fZ2xpYmN4eF9hc3NlcnQoX19tMiAhPSBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisJX19nbGliY3h4X2Fzc2VydChfX20yICE9IG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKwlfX2dsaWJjeHhfYXNzZXJ0KF9fbTIgPD0gX19tMSk7CisKKwlfX3BvaW50ZXJfdHlwZSBfX3AxbyA9IF9fcDE7CisJX19wb2ludGVyX3R5cGUgX19wMW4gPSBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoJl9NX3AsIF9fcDFvLCBfX3AyKTsKKworCS8vIEFzc3VtZSBleHRyYSBzdG9yZXMgKG9mIHNhbWUgdmFsdWUpIGFsbG93ZWQgaW4gdHJ1ZSBjYXNlLgorCV9fcDEgPSBfX3AxbjsKKwlyZXR1cm4gX19wMW8gPT0gX19wMW47CisgICAgICB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9hZGQocHRyZGlmZl90IF9fZCwgbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KQorICAgICAgeyByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9hZGQoJl9NX3AsIF9fZCk7IH0KKworICAgICAgX19wb2ludGVyX3R5cGUKKyAgICAgIGZldGNoX2FkZChwdHJkaWZmX3QgX19kLAorCQltZW1vcnlfb3JkZXIgX19tID0gbWVtb3J5X29yZGVyX3NlcV9jc3QpIHZvbGF0aWxlCisgICAgICB7IHJldHVybiBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmX01fcCwgX19kKTsgfQorCisgICAgICBfX3BvaW50ZXJfdHlwZQorICAgICAgZmV0Y2hfc3ViKHB0cmRpZmZfdCBfX2QsIG1lbW9yeV9vcmRlciBfX20gPSBtZW1vcnlfb3JkZXJfc2VxX2NzdCkKKyAgICAgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfc3ViKCZfTV9wLCBfX2QpOyB9CisKKyAgICAgIF9fcG9pbnRlcl90eXBlCisgICAgICBmZXRjaF9zdWIocHRyZGlmZl90IF9fZCwKKwkJbWVtb3J5X29yZGVyIF9fbSA9IG1lbW9yeV9vcmRlcl9zZXFfY3N0KSB2b2xhdGlsZQorICAgICAgeyByZXR1cm4gX19zeW5jX2ZldGNoX2FuZF9zdWIoJl9NX3AsIF9fZCk7IH0KKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBfX2F0b21pYzIKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYXRvbWljX2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9hdG9taWNfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmE0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYXRvbWljX2Jhc2UuaApAQCAtMCwwICsxLDI5NSBAQAorLy8gLSotIEMrKyAtKi0gaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYXRvbWljX2Jhc2UuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2F0b21pY30KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0FUT01JQ19CQVNFX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX0JBU0VfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBhdG9taWNzIEF0b21pY3MKKyAgICoKKyAgICogQ29tcG9uZW50cyBmb3IgcGVyZm9ybWluZyBhdG9taWMgb3BlcmF0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgLy8vIEVudW1lcmF0aW9uIGZvciBtZW1vcnlfb3JkZXIKKyAgdHlwZWRlZiBlbnVtIG1lbW9yeV9vcmRlcgorICAgIHsKKyAgICAgIG1lbW9yeV9vcmRlcl9yZWxheGVkLAorICAgICAgbWVtb3J5X29yZGVyX2NvbnN1bWUsCisgICAgICBtZW1vcnlfb3JkZXJfYWNxdWlyZSwKKyAgICAgIG1lbW9yeV9vcmRlcl9yZWxlYXNlLAorICAgICAgbWVtb3J5X29yZGVyX2FjcV9yZWwsCisgICAgICBtZW1vcnlfb3JkZXJfc2VxX2NzdAorICAgIH0gbWVtb3J5X29yZGVyOworCisgIGlubGluZSBtZW1vcnlfb3JkZXIKKyAgX19jYWxjdWxhdGVfbWVtb3J5X29yZGVyKG1lbW9yeV9vcmRlciBfX20pCisgIHsKKyAgICBjb25zdCBib29sIF9fY29uZDEgPSBfX20gPT0gbWVtb3J5X29yZGVyX3JlbGVhc2U7CisgICAgY29uc3QgYm9vbCBfX2NvbmQyID0gX19tID09IG1lbW9yeV9vcmRlcl9hY3FfcmVsOworICAgIG1lbW9yeV9vcmRlciBfX21vMShfX2NvbmQxID8gbWVtb3J5X29yZGVyX3JlbGF4ZWQgOiBfX20pOworICAgIG1lbW9yeV9vcmRlciBfX21vMihfX2NvbmQyID8gbWVtb3J5X29yZGVyX2FjcXVpcmUgOiBfX21vMSk7CisgICAgcmV0dXJuIF9fbW8yOworICB9CisKKyAgdm9pZAorICBhdG9taWNfdGhyZWFkX2ZlbmNlKG1lbW9yeV9vcmRlcik7CisKKyAgdm9pZAorICBhdG9taWNfc2lnbmFsX2ZlbmNlKG1lbW9yeV9vcmRlcik7CisKKyAgLy8vIGtpbGxfZGVwZW5kZW5jeQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGtpbGxfZGVwZW5kZW5jeShfVHAgX195KQorICAgIHsKKyAgICAgIF9UcCBfX3JldChfX3kpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBCYXNlIHR5cGUgZm9yIGF0b21pY19mbGFnLgorICAgKgorICAgKiAgQmFzZSB0eXBlIGlzIFBPRCB3aXRoIGRhdGEsIGFsbG93aW5nIGF0b21pY19mbGFnIHRvIGRlcml2ZSBmcm9tCisgICAqICBpdCBhbmQgbWVldCB0aGUgc3RhbmRhcmQgbGF5b3V0IHR5cGUgcmVxdWlyZW1lbnQuIEluIGFkZGl0aW9uIHRvCisgICAqICBjb21wYXRpYmlsdHkgd2l0aCBhIEMgaW50ZXJmYWNlLCB0aGlzIGFsbG93cyBkaWZmZXJlbnQKKyAgICogIGltcGxlbWVudGF0aW9ucyBvZiBhdG9taWNfZmxhZyB0byB1c2UgdGhlIHNhbWUgYXRvbWljIG9wZXJhdGlvbgorICAgKiAgZnVuY3Rpb25zLCB2aWEgYSBzdGFuZGFyZCBjb252ZXJzaW9uIHRvIHRoZSBfX2F0b21pY19mbGFnX2Jhc2UKKyAgICogIGFyZ3VtZW50LgorICAqLworICBfR0xJQkNYWF9CRUdJTl9FWFRFUk5fQworCisgIHN0cnVjdCBfX2F0b21pY19mbGFnX2Jhc2UKKyAgeworICAgIGJvb2wgX01faTsKKyAgfTsKKworICBfR0xJQkNYWF9FTkRfRVhURVJOX0MKKworI2RlZmluZSBBVE9NSUNfRkxBR19JTklUIHsgZmFsc2UgfQorCisKKyAgLy8gQmFzZSB0eXBlcyBmb3IgYXRvbWljcy4KKyAgLy8KKyAgLy8gVGhyZWUgbmVzdGVkIG5hbWVzcGFjZXMgZm9yIGF0b21pYyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorICAvLworICAvLyBUaGUgbmVzdGVkIG5hbWVzcGFjZSBpbmxpbmVkIGludG8gc3RkOjogaXMgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUKKyAgLy8gb2YgdGhlIF9HTElCQ1hYX0FUT01JQ19QUk9QRVJUWSBtYWNybyBhbmQgdGhlIHJlc3VsdGluZworICAvLyBBVE9NSUNfKl9MT0NLX0ZSRUUgbWFjcm9zLgorICAvLworICAvLyAwID09IF9fYXRvbWljMCA9PSBOZXZlciBsb2NrLWZyZWUKKyAgLy8gMSA9PSBfX2F0b21pYzEgPT0gQmVzdCBhdmFpbGFibGUsIHNvbWV0aW1lcyBsb2NrLWZyZWUKKyAgLy8gMiA9PSBfX2F0b21pYzIgPT0gQWx3YXlzIGxvY2stZnJlZQorCisgIG5hbWVzcGFjZSBfX2F0b21pYzAKKyAgeworICAgIHN0cnVjdCBhdG9taWNfZmxhZzsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUcD4KKyAgICAgIHN0cnVjdCBfX2F0b21pY19iYXNlOworICB9CisKKyAgbmFtZXNwYWNlIF9fYXRvbWljMgorICB7CisgICAgc3RydWN0IGF0b21pY19mbGFnOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFRwPgorICAgICAgc3RydWN0IF9fYXRvbWljX2Jhc2U7CisgIH0KKworICBuYW1lc3BhY2UgX19hdG9taWMxCisgIHsKKyAgICB1c2luZyBfX2F0b21pYzI6OmF0b21pY19mbGFnOworICAgIHVzaW5nIF9fYXRvbWljMDo6X19hdG9taWNfYmFzZTsKKyAgfQorCisgIC8vLyBMb2NrLWZyZWUgUHJvcGVydHkKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU18xKSAmJiBkZWZpbmVkKF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU18yKSBcCisgICYmIGRlZmluZWQoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzQpICYmIGRlZmluZWQoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzgpCisjIGRlZmluZSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkgMgorIyBkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX05BTUVTUEFDRSBfX2F0b21pYzIKKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzEpCisjIGRlZmluZSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkgMQorIyBkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX05BTUVTUEFDRSBfX2F0b21pYzEKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkgMAorIyBkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX05BTUVTUEFDRSBfX2F0b21pYzAKKyNlbmRpZgorCisjZGVmaW5lIEFUT01JQ19DSEFSX0xPQ0tfRlJFRSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkKKyNkZWZpbmUgQVRPTUlDX0NIQVIxNl9UX0xPQ0tfRlJFRSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkKKyNkZWZpbmUgQVRPTUlDX0NIQVIzMl9UX0xPQ0tfRlJFRSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkKKyNkZWZpbmUgQVRPTUlDX1dDSEFSX1RfTE9DS19GUkVFIF9HTElCQ1hYX0FUT01JQ19QUk9QRVJUWQorI2RlZmluZSBBVE9NSUNfU0hPUlRfTE9DS19GUkVFIF9HTElCQ1hYX0FUT01JQ19QUk9QRVJUWQorI2RlZmluZSBBVE9NSUNfSU5UX0xPQ0tfRlJFRSBfR0xJQkNYWF9BVE9NSUNfUFJPUEVSVFkKKyNkZWZpbmUgQVRPTUlDX0xPTkdfTE9DS19GUkVFIF9HTElCQ1hYX0FUT01JQ19QUk9QRVJUWQorI2RlZmluZSBBVE9NSUNfTExPTkdfTE9DS19GUkVFIF9HTElCQ1hYX0FUT01JQ19QUk9QRVJUWQorCisgIGlubGluZSBuYW1lc3BhY2UgX0dMSUJDWFhfQVRPTUlDX05BTUVTUEFDRSB7IH0KKworCisgIC8vLyBhdG9taWNfY2hhcgorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8Y2hhcj4gIAkgICAgICAgCQlhdG9taWNfY2hhcjsKKworICAvLy8gYXRvbWljX3NjaGFyCisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxzaWduZWQgY2hhcj4JICAgICAJYXRvbWljX3NjaGFyOworCisgIC8vLyBhdG9taWNfdWNoYXIKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGNoYXI+CQlhdG9taWNfdWNoYXI7CisKKyAgLy8vIGF0b21pY19zaG9ydAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8c2hvcnQ+CQkJYXRvbWljX3Nob3J0OworCisgIC8vLyBhdG9taWNfdXNob3J0CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1bnNpZ25lZCBzaG9ydD4JIAlhdG9taWNfdXNob3J0OworCisgIC8vLyBhdG9taWNfaW50CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnQ+ICAJICAgICAgIAkJYXRvbWljX2ludDsKKworICAvLy8gYXRvbWljX3VpbnQKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGludD4JICAgICAJYXRvbWljX3VpbnQ7CisKKyAgLy8vIGF0b21pY19sb25nCisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxsb25nPiAgCSAgICAgICAJCWF0b21pY19sb25nOworCisgIC8vLyBhdG9taWNfdWxvbmcKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGxvbmc+CQlhdG9taWNfdWxvbmc7CisKKyAgLy8vIGF0b21pY19sbG9uZworICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8bG9uZyBsb25nPiAgCQlhdG9taWNfbGxvbmc7CisKKyAgLy8vIGF0b21pY191bGxvbmcKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVuc2lnbmVkIGxvbmcgbG9uZz4gCWF0b21pY191bGxvbmc7CisKKyAgLy8vIGF0b21pY193Y2hhcl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx3Y2hhcl90PiAgCQlhdG9taWNfd2NoYXJfdDsKKworICAvLy8gYXRvbWljX2NoYXIxNl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxjaGFyMTZfdD4gIAkJYXRvbWljX2NoYXIxNl90OworCisgIC8vLyBhdG9taWNfY2hhcjMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGNoYXIzMl90PiAgCQlhdG9taWNfY2hhcjMyX3Q7CisKKyAgLy8vIGF0b21pY19jaGFyMzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8Y2hhcjMyX3Q+ICAJCWF0b21pY19jaGFyMzJfdDsKKworCisgIC8vLyBhdG9taWNfaW50X2xlYXN0OF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfbGVhc3Q4X3Q+ICAJCWF0b21pY19pbnRfbGVhc3Q4X3Q7CisKKyAgLy8vIGF0b21pY191aW50X2xlYXN0OF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50X2xlYXN0OF90PgkgICAgICAgCWF0b21pY191aW50X2xlYXN0OF90OworCisgIC8vLyBhdG9taWNfaW50X2xlYXN0MTZfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2xlYXN0MTZfdD4JICAgICAgIAlhdG9taWNfaW50X2xlYXN0MTZfdDsKKworICAvLy8gYXRvbWljX3VpbnRfbGVhc3QxNl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50X2xlYXN0MTZfdD4JICAgICAgIAlhdG9taWNfdWludF9sZWFzdDE2X3Q7CisKKyAgLy8vIGF0b21pY19pbnRfbGVhc3QzMl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxpbnRfbGVhc3QzMl90PgkgICAgICAgCWF0b21pY19pbnRfbGVhc3QzMl90OworCisgIC8vLyBhdG9taWNfdWludF9sZWFzdDMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfbGVhc3QzMl90PgkgICAgICAgCWF0b21pY191aW50X2xlYXN0MzJfdDsKKworICAvLy8gYXRvbWljX2ludF9sZWFzdDY0X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludF9sZWFzdDY0X3Q+CSAgICAgICAJYXRvbWljX2ludF9sZWFzdDY0X3Q7CisKKyAgLy8vIGF0b21pY191aW50X2xlYXN0NjRfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9sZWFzdDY0X3Q+CSAgICAgICAJYXRvbWljX3VpbnRfbGVhc3Q2NF90OworCisKKyAgLy8vIGF0b21pY19pbnRfZmFzdDhfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3Q4X3Q+ICAJCWF0b21pY19pbnRfZmFzdDhfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDhfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8dWludF9mYXN0OF90PgkgICAgICAJYXRvbWljX3VpbnRfZmFzdDhfdDsKKworICAvLy8gYXRvbWljX2ludF9mYXN0MTZfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3QxNl90PgkgICAgICAJYXRvbWljX2ludF9mYXN0MTZfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDE2X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfZmFzdDE2X3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0MTZfdDsKKworICAvLy8gYXRvbWljX2ludF9mYXN0MzJfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3QzMl90PgkgICAgICAJYXRvbWljX2ludF9mYXN0MzJfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDMyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfZmFzdDMyX3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0MzJfdDsKKworICAvLy8gYXRvbWljX2ludF9mYXN0NjRfdAorICB0eXBlZGVmIF9fYXRvbWljX2Jhc2U8aW50X2Zhc3Q2NF90PgkgICAgICAJYXRvbWljX2ludF9mYXN0NjRfdDsKKworICAvLy8gYXRvbWljX3VpbnRfZmFzdDY0X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPHVpbnRfZmFzdDY0X3Q+CSAgICAgIAlhdG9taWNfdWludF9mYXN0NjRfdDsKKworCisgIC8vLyBhdG9taWNfaW50cHRyX3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludHB0cl90PiAgCSAgICAgICAJYXRvbWljX2ludHB0cl90OworCisgIC8vLyBhdG9taWNfdWludHB0cl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50cHRyX3Q+ICAJICAgICAgIAlhdG9taWNfdWludHB0cl90OworCisgIC8vLyBhdG9taWNfc2l6ZV90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxzaXplX3Q+CSAJICAgICAgIAlhdG9taWNfc2l6ZV90OworCisgIC8vLyBhdG9taWNfaW50bWF4X3QKKyAgdHlwZWRlZiBfX2F0b21pY19iYXNlPGludG1heF90PiAgCSAgICAgICAJYXRvbWljX2ludG1heF90OworCisgIC8vLyBhdG9taWNfdWludG1heF90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTx1aW50bWF4X3Q+ICAJICAgICAgIAlhdG9taWNfdWludG1heF90OworCisgIC8vLyBhdG9taWNfcHRyZGlmZl90CisgIHR5cGVkZWYgX19hdG9taWNfYmFzZTxwdHJkaWZmX3Q+ICAJICAgICAgIAlhdG9taWNfcHRyZGlmZl90OworCisKKyNkZWZpbmUgQVRPTUlDX1ZBUl9JTklUKF9WSSkgeyBfVkkgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYXRvbWljOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYXRvbWljPF9UcCo+OworCisgIC8vIEB9IGdyb3VwIGF0b21pY3MKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYmFzaWNfaW9zLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYmFzaWNfaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkOGFlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9iYXNpY19pb3MuaApAQCAtMCwwICsxLDQ3NSBAQAorLy8gSW9zdHJlYW1zIGJhc2UgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9iYXNpY19pb3MuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisjaWZuZGVmIF9CQVNJQ19JT1NfSAorI2RlZmluZSBfQkFTSUNfSU9TX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlX2NsYXNzZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGlubGluZSBjb25zdCBfRmFjZXQmCisgICAgX19jaGVja19mYWNldChjb25zdCBfRmFjZXQqIF9fZikKKyAgICB7CisgICAgICBpZiAoIV9fZikKKwlfX3Rocm93X2JhZF9jYXN0KCk7CisgICAgICByZXR1cm4gKl9fZjsKKyAgICB9CisKKyAgLy8gMjcuNC41ICBUZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3MKKyAgLyoqCisgICAqICBAYnJpZWYgIFZpcnR1YWwgYmFzZSBjbGFzcyBmb3IgYWxsIHN0cmVhbSBjbGFzc2VzLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIE1vc3Qgb2YgdGhlIG1lbWJlciBmdW5jdGlvbnMgY2FsbGVkIGRpc3BhdGNoZWQgb24gc3RyZWFtIG9iamVjdHMKKyAgICogIChlLmcuLCBAYyBzdGQ6OmNvdXQuZm9vKGJhcik7KSBhcmUgY29uc29saWRhdGVkIGluIHRoaXMgY2xhc3MuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19pb3MgOiBwdWJsaWMgaW9zX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgVGhlc2UgYXJlIHN0YW5kYXJkIHR5cGVzLiAgVGhleSBwZXJtaXQgYSBzdGFuZGFyZGl6ZWQgd2F5IG9mCisgICAgICAgKiAgcmVmZXJyaW5nIHRvIG5hbWVzIG9mIChvciBuYW1lcyBkZXBlbmRhbnQgb24pIHRoZSB0ZW1wbGF0ZQorICAgICAgICogIHBhcmFtZXRlcnMsIHdoaWNoIGFyZSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICAqLworICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlICAgICAgICAgICAgIGludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAgICAgICAgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgICAgICAgICAgICAgb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBUaGVzZSBhcmUgbm9uLXN0YW5kYXJkIHR5cGVzLgorICAgICAgKi8KKyAgICAgIHR5cGVkZWYgY3R5cGU8X0NoYXJUPiAgICAgICAgICAgICAgICAgICAgICAgICAgX19jdHlwZV90eXBlOworICAgICAgdHlwZWRlZiBudW1fcHV0PF9DaGFyVCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4KKwkJCQkJCSAgICAgX19udW1fcHV0X3R5cGU7CisgICAgICB0eXBlZGVmIG51bV9nZXQ8X0NoYXJULCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gPgorCQkJCQkJICAgICBfX251bV9nZXRfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8gRGF0YSBtZW1iZXJzOgorICAgIHByb3RlY3RlZDoKKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogICAgICAgICAgICAgICAgX01fdGllOworICAgICAgbXV0YWJsZSBjaGFyX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9maWxsOworICAgICAgbXV0YWJsZSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9maWxsX2luaXQ7CisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogICAgICAgICAgICAgIF9NX3N0cmVhbWJ1ZjsKKworICAgICAgLy8gQ2FjaGVkIHVzZV9mYWNldDxjdHlwZT4sIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZSBpbmZvLgorICAgICAgY29uc3QgX19jdHlwZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9jdHlwZTsKKyAgICAgIC8vIEZvciBvc3RyZWFtLgorICAgICAgY29uc3QgX19udW1fcHV0X3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9udW1fcHV0OworICAgICAgLy8gRm9yIGlzdHJlYW0uCisgICAgICBjb25zdCBfX251bV9nZXRfdHlwZSogICAgICAgICAgICAgICAgICAgICAgICAgIF9NX251bV9nZXQ7CisKKyAgICBwdWJsaWM6CisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBxdWljay1hbmQtZWFzeSBzdGF0dXMgY2hlY2suCisgICAgICAgKgorICAgICAgICogIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSBjb25zdHJ1Y3RzIHN1Y2ggYXMKKyAgICAgICAqICA8Y29kZT5pZiAoIWFfc3RyZWFtKSAuLi48L2NvZGU+IGFuZCA8Y29kZT53aGlsZSAoYV9zdHJlYW0pIC4uLjwvY29kZT4KKyAgICAgICovCisgICAgICBvcGVyYXRvciB2b2lkKigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5mYWlsKCkgPyAwIDogY29uc3RfY2FzdDxiYXNpY19pb3MqPih0aGlzKTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciEoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmFpbCgpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIHN0cmVhbSBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgQSBiaXQgcGF0dGVybiAod2VsbCwgaXNuJ3QgZXZlcnl0aGluZz8pCisgICAgICAgKgorICAgICAgICogIFNlZSBzdGQ6Omlvc19iYXNlOjppb3N0YXRlIGZvciB0aGUgcG9zc2libGUgYml0IHZhbHVlcy4gIE1vc3QKKyAgICAgICAqICB1c2VycyB3aWxsIGNhbGwgb25lIG9mIHRoZSBpbnRlcnByZXRpbmcgd3JhcHBlcnMsIGUuZy4sIGdvb2QoKS4KKyAgICAgICovCisgICAgICBpb3N0YXRlCisgICAgICByZHN0YXRlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmVhbWJ1Zl9zdGF0ZTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFtSZV1zZXRzIHRoZSBlcnJvciBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIHN0YXRlICBUaGUgbmV3IHN0YXRlIGZsYWcocykgdG8gc2V0LgorICAgICAgICoKKyAgICAgICAqICBTZWUgc3RkOjppb3NfYmFzZTo6aW9zdGF0ZSBmb3IgdGhlIHBvc3NpYmxlIGJpdCB2YWx1ZXMuICBNb3N0CisgICAgICAgKiAgdXNlcnMgd2lsbCBub3QgbmVlZCB0byBwYXNzIGFuIGFyZ3VtZW50LgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKGlvc3RhdGUgX19zdGF0ZSA9IGdvb2RiaXQpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHMgYWRkaXRpb25hbCBmbGFncyBpbiB0aGUgZXJyb3Igc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBzdGF0ZSAgVGhlIGFkZGl0aW9uYWwgc3RhdGUgZmxhZyhzKSB0byBzZXQuCisgICAgICAgKgorICAgICAgICogIFNlZSBzdGQ6Omlvc19iYXNlOjppb3N0YXRlIGZvciB0aGUgcG9zc2libGUgYml0IHZhbHVlcy4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZXRzdGF0ZShpb3N0YXRlIF9fc3RhdGUpCisgICAgICB7IHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSB8IF9fc3RhdGUpOyB9CisKKyAgICAgIC8vIEZsaXAgdGhlIGludGVybmFsIHN0YXRlIG9uIGZvciB0aGUgcHJvcGVyIHN0YXRlIGJpdHMsIHRoZW4gcmUKKyAgICAgIC8vIHRocm93cyB0aGUgcHJvcGFnYXRlZCBleGNlcHRpb24gaWYgYml0IGFsc28gc2V0IGluCisgICAgICAvLyBleGNlcHRpb25zKCkuCisgICAgICB2b2lkCisgICAgICBfTV9zZXRzdGF0ZShpb3N0YXRlIF9fc3RhdGUpCisgICAgICB7CisJLy8gMjcuNi4xLjIuMSBDb21tb24gcmVxdWlyZW1lbnRzLgorCS8vIFR1cm4gdGhpcyBvbiB3aXRob3V0IGNhdXNpbmcgYW4gaW9zOjpmYWlsdXJlIHRvIGJlIHRocm93bi4KKwlfTV9zdHJlYW1idWZfc3RhdGUgfD0gX19zdGF0ZTsKKwlpZiAodGhpcy0+ZXhjZXB0aW9ucygpICYgX19zdGF0ZSkKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZhc3QgZXJyb3IgY2hlY2tpbmcuCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBubyBlcnJvciBmbGFncyBhcmUgc2V0LgorICAgICAgICoKKyAgICAgICAqICBBIHdyYXBwZXIgYXJvdW5kIHJkc3RhdGUuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgZ29vZCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5yZHN0YXRlKCkgPT0gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZhc3QgZXJyb3IgY2hlY2tpbmcuCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgZW9mYml0IGlzIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG90aGVyIGlvc3RhdGUgZmxhZ3MgbWF5IGFsc28gYmUgc2V0LgorICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVvZigpIGNvbnN0CisgICAgICB7IHJldHVybiAodGhpcy0+cmRzdGF0ZSgpICYgZW9mYml0KSAhPSAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmFzdCBlcnJvciBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIGVpdGhlciB0aGUgYmFkYml0IG9yIHRoZSBmYWlsYml0IGlzIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQ2hlY2tpbmcgdGhlIGJhZGJpdCBpbiBmYWlsKCkgaXMgaGlzdG9yaWNhbCBwcmFjdGljZS4KKyAgICAgICAqICBOb3RlIHRoYXQgb3RoZXIgaW9zdGF0ZSBmbGFncyBtYXkgYWxzbyBiZSBzZXQuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgZmFpbCgpIGNvbnN0CisgICAgICB7IHJldHVybiAodGhpcy0+cmRzdGF0ZSgpICYgKGJhZGJpdCB8IGZhaWxiaXQpKSAhPSAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmFzdCBlcnJvciBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBiYWRiaXQgaXMgc2V0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgb3RoZXIgaW9zdGF0ZSBmbGFncyBtYXkgYWxzbyBiZSBzZXQuCisgICAgICAqLworICAgICAgYm9vbAorICAgICAgYmFkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICh0aGlzLT5yZHN0YXRlKCkgJiBiYWRiaXQpICE9IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaHJvd2luZyBleGNlcHRpb25zIG9uIGVycm9ycy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBleGNlcHRpb25zIG1hc2suCisgICAgICAgKgorICAgICAgICogIFRoaXMgY2hhbmdlcyBub3RoaW5nIGluIHRoZSBzdHJlYW0uICBTZWUgdGhlIG9uZS1hcmd1bWVudCB2ZXJzaW9uCisgICAgICAgKiAgb2YgZXhjZXB0aW9ucyhpb3N0YXRlKSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgICovCisgICAgICBpb3N0YXRlCisgICAgICBleGNlcHRpb25zKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2V4Y2VwdGlvbjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRocm93aW5nIGV4Y2VwdGlvbnMgb24gZXJyb3JzLgorICAgICAgICogIEBwYXJhbSAgZXhjZXB0ICBUaGUgbmV3IGV4Y2VwdGlvbnMgbWFzay4KKyAgICAgICAqCisgICAgICAgKiAgQnkgZGVmYXVsdCwgZXJyb3IgZmxhZ3MgYXJlIHNldCBzaWxlbnRseS4gIFlvdSBjYW4gc2V0IGFuCisgICAgICAgKiAgZXhjZXB0aW9ucyBtYXNrIGZvciBlYWNoIHN0cmVhbTsgaWYgYSBiaXQgaW4gdGhlIG1hc2sgYmVjb21lcyBzZXQKKyAgICAgICAqICBpbiB0aGUgZXJyb3IgZmxhZ3MsIHRoZW4gYW4gZXhjZXB0aW9uIG9mIHR5cGUKKyAgICAgICAqICBzdGQ6Omlvc19iYXNlOjpmYWlsdXJlIGlzIHRocm93bi4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIGVycm9yIGZsYWcgaXMgYWxyZWFkeSBzZXQgd2hlbiB0aGUgZXhjZXB0aW9ucyBtYXNrIGlzCisgICAgICAgKiAgYWRkZWQsIHRoZSBleGNlcHRpb24gaXMgaW1tZWRpYXRlbHkgdGhyb3duLiAgVHJ5IHJ1bm5pbmcgdGhlCisgICAgICAgKiAgZm9sbG93aW5nIHVuZGVyIEdDQyAzLjEgb3IgbGF0ZXI6CisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAjaW5jbHVkZSA8aW9zdHJlYW0+CisgICAgICAgKiAgI2luY2x1ZGUgPGZzdHJlYW0+CisgICAgICAgKiAgI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyAgICAgICAqCisgICAgICAgKiAgaW50IG1haW4oKQorICAgICAgICogIHsKKyAgICAgICAqICAgICAgc3RkOjpzZXRfdGVybWluYXRlIChfX2dudV9jeHg6Ol9fdmVyYm9zZV90ZXJtaW5hdGVfaGFuZGxlcik7CisgICAgICAgKgorICAgICAgICogICAgICBzdGQ6Omlmc3RyZWFtIGYgKCIvZXRjL21vdGQiKTsKKyAgICAgICAqCisgICAgICAgKiAgICAgIHN0ZDo6Y2VyciA8PCAiU2V0dGluZyBiYWRiaXRcbiI7CisgICAgICAgKiAgICAgIGYuc2V0c3RhdGUgKHN0ZDo6aW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgICAgKgorICAgICAgICogICAgICBzdGQ6OmNlcnIgPDwgIlNldHRpbmcgZXhjZXB0aW9uIG1hc2tcbiI7CisgICAgICAgKiAgICAgIGYuZXhjZXB0aW9ucyAoc3RkOjppb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgICAqICB9CisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBleGNlcHRpb25zKGlvc3RhdGUgX19leGNlcHQpCisgICAgICB7CisgICAgICAgIF9NX2V4Y2VwdGlvbiA9IF9fZXhjZXB0OworICAgICAgICB0aGlzLT5jbGVhcihfTV9zdHJlYW1idWZfc3RhdGUpOworICAgICAgfQorCisgICAgICAvLyBDb25zdHJ1Y3Rvci9kZXN0cnVjdG9yOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgZGVyaXZlZCBzdHJlYW1zLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pb3MoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpCisgICAgICA6IGlvc19iYXNlKCksIF9NX3RpZSgwKSwgX01fZmlsbCgpLCBfTV9maWxsX2luaXQoZmFsc2UpLCBfTV9zdHJlYW1idWYoMCksCisJX01fY3R5cGUoMCksIF9NX251bV9wdXQoMCksIF9NX251bV9nZXQoMCkKKyAgICAgIHsgdGhpcy0+aW5pdChfX3NiKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuICBNb3JlIHNwZWNpZmljYWxseSwgaXQgZG9lcyBub3QKKyAgICAgICAqICBkZXN0cm95IHRoZSBzdHJlYW1idWYgaGVsZCBieSByZGJ1ZigpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5iYXNpY19pb3MoKSB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmV0Y2hlcyB0aGUgY3VycmVudCBAZSB0aWVkIHN0cmVhbS4KKyAgICAgICAqICBAcmV0dXJuICBBIHBvaW50ZXIgdG8gdGhlIHRpZWQgc3RyZWFtLCBvciBOVUxMIGlmIHRoZSBzdHJlYW0gaXMKKyAgICAgICAqICAgICAgICAgICBub3QgdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgQSBzdHJlYW0gbWF5IGJlIEBlIHRpZWQgKG9yIHN5bmNocm9uaXplZCkgdG8gYSBzZWNvbmQgb3V0cHV0CisgICAgICAgKiAgc3RyZWFtLiAgV2hlbiB0aGlzIHN0cmVhbSBwZXJmb3JtcyBhbnkgSS9PLCB0aGUgdGllZCBzdHJlYW0gaXMKKyAgICAgICAqICBmaXJzdCBmbHVzaGVkLiAgRm9yIGV4YW1wbGUsIEBjIHN0ZDo6Y2luIGlzIHRpZWQgdG8gQGMgc3RkOjpjb3V0LgorICAgICAgKi8KKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPioKKyAgICAgIHRpZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90aWU7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaWVzIHRoaXMgc3RyZWFtIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICB0aWVzdHIgIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91c2x5IHRpZWQgb3V0cHV0IHN0cmVhbSwgb3IgTlVMTCBpZiB0aGUgc3RyZWFtCisgICAgICAgKiAgICAgICAgICAgd2FzIG5vdCB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHNldHMgdXAgYSBuZXcgdGllOyBzZWUgdGllKCkgZm9yIG1vcmUuCisgICAgICAqLworICAgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+KgorICAgICAgdGllKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX190aWVzdHIpCisgICAgICB7CisgICAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiogX19vbGQgPSBfTV90aWU7CisgICAgICAgIF9NX3RpZSA9IF9fdGllc3RyOworICAgICAgICByZXR1cm4gX19vbGQ7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBzdHJlYW0gYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHN0cmVhbS4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmVhbWJ1ZjsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIHNiICBUaGUgbmV3IHN0cmVhbSBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIHN0cmVhbSBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIEFzc29jaWF0ZXMgYSBuZXcgYnVmZmVyIHdpdGggdGhlIGN1cnJlbnQgc3RyZWFtLCBhbmQgY2xlYXJzIHRoZQorICAgICAgICogIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBEdWUgdG8gaGlzdG9yaWNhbCBhY2NpZGVudHMgd2hpY2ggdGhlIExXRyByZWZ1c2VzIHRvIGNvcnJlY3QsIHRoZQorICAgICAgICogIEkvTyBsaWJyYXJ5IHN1ZmZlcnMgZnJvbSBhIGRlc2lnbiBlcnJvcjogIHRoaXMgZnVuY3Rpb24gaXMgaGlkZGVuCisgICAgICAgKiAgaW4gZGVyaXZlZCBjbGFzc2VzIGJ5IG92ZXJyaWRlcyBvZiB0aGUgemVyby1hcmd1bWVudCBAYyByZGJ1ZigpLAorICAgICAgICogIHdoaWNoIGlzIG5vbi12aXJ0dWFsIGZvciBoeXN0ZXJpY2FsIHJhaXNpbnMuICBBcyBhIHJlc3VsdCwgeW91CisgICAgICAgKiAgbXVzdCB1c2UgZXhwbGljaXQgcXVhbGlmaWNhdGlvbnMgdG8gYWNjZXNzIHRoaXMgZnVuY3Rpb24gdmlhIGFueQorICAgICAgICogIGRlcml2ZWQgY2xhc3MuICBGb3IgZXhhbXBsZToKKyAgICAgICAqCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICBzdGQ6OmZzdHJlYW0gICAgIGZvbzsgICAgICAgICAvLyBvciBzb21lIG90aGVyIGRlcml2ZWQgdHlwZQorICAgICAgICogIHN0ZDo6c3RyZWFtYnVmKiAgcCA9IC4uLi4uOworICAgICAgICoKKyAgICAgICAqICBmb28uaW9zOjpyZGJ1ZihwKTsgICAgICAgICAgICAvLyBpb3MgPT0gYmFzaWNfaW9zPGNoYXI+CisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICovCisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPioKKyAgICAgIHJkYnVmKGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3BpZXMgZmllbGRzIG9mIF9fcmhzIGludG8gdGhpcy4KKyAgICAgICAqICBAcGFyYW0gIF9fcmhzICBUaGUgc291cmNlIHZhbHVlcyBmb3IgdGhlIGNvcGllcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIEFsbCBmaWVsZHMgb2YgX19yaHMgYXJlIGNvcGllZCBpbnRvIHRoaXMgb2JqZWN0IGV4Y2VwdCB0aGF0IHJkYnVmKCkKKyAgICAgICAqICBhbmQgcmRzdGF0ZSgpIHJlbWFpbiB1bmNoYW5nZWQuICBBbGwgdmFsdWVzIGluIHRoZSBwd29yZCBhbmQgaXdvcmQKKyAgICAgICAqICBhcnJheXMgYXJlIGNvcGllZC4gIEJlZm9yZSBjb3B5aW5nLCBlYWNoIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aAorICAgICAgICogIGVyYXNlX2V2ZW50LiAgQWZ0ZXIgY29weWluZywgZWFjaCAobmV3KSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGgKKyAgICAgICAqICBjb3B5Zm10X2V2ZW50LiAgVGhlIGZpbmFsIHN0ZXAgaXMgdG8gY29weSBleGNlcHRpb25zKCkuCisgICAgICAqLworICAgICAgYmFzaWNfaW9zJgorICAgICAgY29weWZtdChjb25zdCBiYXNpY19pb3MmIF9fcmhzKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXRyaWV2ZXMgdGhlIEBhIGVtcHR5IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBmaWxsIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgSXQgZGVmYXVsdHMgdG8gYSBzcGFjZSAoJyAnKSBpbiB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICBmaWxsKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGxfaW5pdCkKKwkgIHsKKwkgICAgX01fZmlsbCA9IHRoaXMtPndpZGVuKCcgJyk7CisJICAgIF9NX2ZpbGxfaW5pdCA9IHRydWU7CisJICB9CisJcmV0dXJuIF9NX2ZpbGw7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0cyBhIG5ldyBAYSBlbXB0eSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtICBjaCAgVGhlIG5ldyBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGZpbGwgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZmlsbCBjaGFyYWN0ZXIgaXMgdXNlZCB0byBmaWxsIG91dCBzcGFjZSB3aGVuIFArIGNoYXJhY3RlcnMKKyAgICAgICAqICBoYXZlIGJlZW4gcmVxdWVzdGVkIChlLmcuLCB2aWEgc2V0dyksIFEgY2hhcmFjdGVycyBhcmUgYWN0dWFsbHkKKyAgICAgICAqICB1c2VkLCBhbmQgUTxQLiAgSXQgZGVmYXVsdHMgdG8gYSBzcGFjZSAoJyAnKSBpbiB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICBmaWxsKGNoYXJfdHlwZSBfX2NoKQorICAgICAgeworCWNoYXJfdHlwZSBfX29sZCA9IHRoaXMtPmZpbGwoKTsKKwlfTV9maWxsID0gX19jaDsKKwlyZXR1cm4gX19vbGQ7CisgICAgICB9CisKKyAgICAgIC8vIExvY2FsZXM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmVzIHRvIGEgbmV3IGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIGxvYyAgVGhlIG5ldyBsb2NhbGUuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgaW9zX2Jhc2U6OmltYnVlKGxvYyksIGFuZCBpZiBhIHN0cmVhbSBidWZmZXIgaXMgYXNzb2NpYXRlZAorICAgICAgICogIHdpdGggdGhpcyBzdHJlYW0sIGNhbGxzIHRoYXQgYnVmZmVyJ3MgQGMgcHViaW1idWUobG9jKS4KKyAgICAgICAqCisgICAgICAgKiAgQWRkaXRpb25hbCBsMTBuIG5vdGVzIGFyZSBhdAorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvbG9jYWxpemF0aW9uLmh0bWwKKyAgICAgICovCisgICAgICBsb2NhbGUKKyAgICAgIGltYnVlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNxdWVlemVzIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBjICBUaGUgY2hhcmFjdGVyIHRvIG5hcnJvdy4KKyAgICAgICAqICBAcGFyYW0gIGRmYXVsdCAgVGhlIGNoYXJhY3RlciB0byBuYXJyb3cuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5hcnJvd2VkIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgTWFwcyBhIGNoYXJhY3RlciBvZiBAYyBjaGFyX3R5cGUgdG8gYSBjaGFyYWN0ZXIgb2YgQGMgY2hhciwKKyAgICAgICAqICBpZiBwb3NzaWJsZS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6dXNlX2ZhY2V0PGN0eXBlPGNoYXJfdHlwZT4gPihnZXRsb2MoKSkubmFycm93KGMsZGZhdWx0KQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKgorICAgICAgICogIEFkZGl0aW9uYWwgbDEwbiBub3RlcyBhcmUgYXQKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2xvY2FsaXphdGlvbi5odG1sCisgICAgICAqLworICAgICAgY2hhcgorICAgICAgbmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIgX19kZmF1bHQpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2NoZWNrX2ZhY2V0KF9NX2N0eXBlKS5uYXJyb3coX19jLCBfX2RmYXVsdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbnMgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIGMgIFRoZSBjaGFyYWN0ZXIgdG8gd2lkZW4uCisgICAgICAgKiAgQHJldHVybiAgVGhlIHdpZGVuZWQgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBNYXBzIGEgY2hhcmFjdGVyIG9mIEBjIGNoYXIgdG8gYSBjaGFyYWN0ZXIgb2YgQGMgY2hhcl90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjp1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KGdldGxvYygpKS53aWRlbihjKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKgorICAgICAgICogIEFkZGl0aW9uYWwgbDEwbiBub3RlcyBhcmUgYXQKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2xvY2FsaXphdGlvbi5odG1sCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fY2hlY2tfZmFjZXQoX01fY3R5cGUpLndpZGVuKF9fYyk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIDI3LjQuNS4xICBiYXNpY19pb3MgY29uc3RydWN0b3JzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBkb2VzIG5vdGhpbmcgYW5kIGlzIG5vdCBub3JtYWxseQorICAgICAgICogIGFjY2Vzc2libGUgdG8gdXNlcnMuCisgICAgICAqLworICAgICAgYmFzaWNfaW9zKCkKKyAgICAgIDogaW9zX2Jhc2UoKSwgX01fdGllKDApLCBfTV9maWxsKGNoYXJfdHlwZSgpKSwgX01fZmlsbF9pbml0KGZhbHNlKSwgCisJX01fc3RyZWFtYnVmKDApLCBfTV9jdHlwZSgwKSwgX01fbnVtX3B1dCgwKSwgX01fbnVtX2dldCgwKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWxsIHNldHVwIGlzIHBlcmZvcm1lZCBoZXJlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBwdWJsaWMgY29uc3RydWN0b3IuICBJdCBpcyBub3QgdmlydHVhbCBhbmQKKyAgICAgICAqICBjYW5ub3QgYmUgcmVkZWZpbmVkLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluaXQoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpOworCisgICAgICB2b2lkCisgICAgICBfTV9jYWNoZV9sb2NhbGUoY29uc3QgbG9jYWxlJiBfX2xvYyk7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy9iYXNpY19pb3MudGNjPgorCisjZW5kaWYgLyogX0JBU0lDX0lPU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYmFzaWNfaW9zLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9iYXNpY19pb3MudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzZiZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYmFzaWNfaW9zLnRjYwpAQCAtMCwwICsxLDE4OSBAQAorLy8gYmFzaWNfaW9zIG1lbWJlciBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LAorLy8gMjAwOSwgMjAxMCwgMjAxMSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvYmFzaWNfaW9zLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc30KKyAqLworCisjaWZuZGVmIF9CQVNJQ19JT1NfVENDCisjZGVmaW5lIF9CQVNJQ19JT1NfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19pb3M8X0NoYXJULCBfVHJhaXRzPjo6Y2xlYXIoaW9zdGF0ZSBfX3N0YXRlKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5yZGJ1ZigpKQorCV9NX3N0cmVhbWJ1Zl9zdGF0ZSA9IF9fc3RhdGU7CisgICAgICBlbHNlCisJICBfTV9zdHJlYW1idWZfc3RhdGUgPSBfX3N0YXRlIHwgYmFkYml0OworICAgICAgaWYgKHRoaXMtPmV4Y2VwdGlvbnMoKSAmIHRoaXMtPnJkc3RhdGUoKSkKKwlfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfaW9zOjpjbGVhciIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjpyZGJ1ZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYikKKyAgICB7CisgICAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19vbGQgPSBfTV9zdHJlYW1idWY7CisgICAgICBfTV9zdHJlYW1idWYgPSBfX3NiOworICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojpjb3B5Zm10KGNvbnN0IGJhc2ljX2lvcyYgX19yaHMpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjkyLiBlZmZlY3RzIG9mIGEuY29weWZtdCAoYSkKKyAgICAgIGlmICh0aGlzICE9ICZfX3JocykKKwl7CisJICAvLyBQZXIgMjcuMS4xLCBkbyBub3QgY2FsbCBpbWJ1ZSwgeWV0IG11c3QgdHJhc2ggYWxsIGNhY2hlcworCSAgLy8gYXNzb2NpYXRlZCB3aXRoIGltYnVlKCkKKworCSAgLy8gQWxsb2MgYW55IG5ldyB3b3JkIGFycmF5IGZpcnN0LCBzbyBpZiBpdCBmYWlscyB3ZSBoYXZlICJyb2xsYmFjayIuCisJICBfV29yZHMqIF9fd29yZHMgPSAoX19yaHMuX01fd29yZF9zaXplIDw9IF9TX2xvY2FsX3dvcmRfc2l6ZSkgPworCSAgICAgICAgICAgICAgICAgICAgIF9NX2xvY2FsX3dvcmQgOiBuZXcgX1dvcmRzW19fcmhzLl9NX3dvcmRfc2l6ZV07CisKKwkgIC8vIEJ1bXAgcmVmcyBiZWZvcmUgZG9pbmcgY2FsbGJhY2tzLCBmb3Igc2FmZXR5LgorCSAgX0NhbGxiYWNrX2xpc3QqIF9fY2IgPSBfX3Jocy5fTV9jYWxsYmFja3M7CisJICBpZiAoX19jYikKKwkgICAgX19jYi0+X01fYWRkX3JlZmVyZW5jZSgpOworCSAgX01fY2FsbF9jYWxsYmFja3MoZXJhc2VfZXZlbnQpOworCSAgaWYgKF9NX3dvcmQgIT0gX01fbG9jYWxfd29yZCkKKwkgICAgeworCSAgICAgIGRlbGV0ZSBbXSBfTV93b3JkOworCSAgICAgIF9NX3dvcmQgPSAwOworCSAgICB9CisJICBfTV9kaXNwb3NlX2NhbGxiYWNrcygpOworCisJICAvLyBOQjogRG9uJ3Qgd2FudCBhbnkgYWRkZWQgZHVyaW5nIGFib3ZlLgorCSAgX01fY2FsbGJhY2tzID0gX19jYjsKKwkgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fcmhzLl9NX3dvcmRfc2l6ZTsgKytfX2kpCisJICAgIF9fd29yZHNbX19pXSA9IF9fcmhzLl9NX3dvcmRbX19pXTsKKwkgIF9NX3dvcmQgPSBfX3dvcmRzOworCSAgX01fd29yZF9zaXplID0gX19yaHMuX01fd29yZF9zaXplOworCisJICB0aGlzLT5mbGFncyhfX3Jocy5mbGFncygpKTsKKwkgIHRoaXMtPndpZHRoKF9fcmhzLndpZHRoKCkpOworCSAgdGhpcy0+cHJlY2lzaW9uKF9fcmhzLnByZWNpc2lvbigpKTsKKwkgIHRoaXMtPnRpZShfX3Jocy50aWUoKSk7CisJICB0aGlzLT5maWxsKF9fcmhzLmZpbGwoKSk7CisJICBfTV9pb3NfbG9jYWxlID0gX19yaHMuZ2V0bG9jKCk7CisJICBfTV9jYWNoZV9sb2NhbGUoX01faW9zX2xvY2FsZSk7CisKKwkgIF9NX2NhbGxfY2FsbGJhY2tzKGNvcHlmbXRfZXZlbnQpOworCisJICAvLyBUaGUgbmV4dCBpcyByZXF1aXJlZCB0byBiZSB0aGUgbGFzdCBhc3NpZ25tZW50LgorCSAgdGhpcy0+ZXhjZXB0aW9ucyhfX3Jocy5leGNlcHRpb25zKCkpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gTG9jYWxlczoKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGxvY2FsZQorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+OjppbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGxvY2FsZSBfX29sZCh0aGlzLT5nZXRsb2MoKSk7CisgICAgICBpb3NfYmFzZTo6aW1idWUoX19sb2MpOworICAgICAgX01fY2FjaGVfbG9jYWxlKF9fbG9jKTsKKyAgICAgIGlmICh0aGlzLT5yZGJ1ZigpICE9IDApCisJdGhpcy0+cmRidWYoKS0+cHViaW1idWUoX19sb2MpOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdm9pZAorICAgIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+Ojppbml0KGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiBfX3NiKQorICAgIHsKKyAgICAgIC8vIE5COiBUaGlzIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgb2JqZWN0LgorICAgICAgaW9zX2Jhc2U6Ol9NX2luaXQoKTsKKworICAgICAgLy8gQ2FjaGUgbG9jYWxlIGRhdGEgYW5kIHNwZWNpZmljIGZhY2V0cyB1c2VkIGJ5IGlvc3RyZWFtcy4KKyAgICAgIF9NX2NhY2hlX2xvY2FsZShfTV9pb3NfbG9jYWxlKTsKKworICAgICAgLy8gTkI6IFRoZSAyNy40LjQuMSBQb3N0Y29uZGl0aW9ucyBUYWJsZSBzcGVjaWZpZXMgcmVxdWlyZW1lbnRzCisgICAgICAvLyBhZnRlciBiYXNpY19pb3M6OmluaXQoKSBoYXMgYmVlbiBjYWxsZWQuIEFzIHBhcnQgb2YgdGhpcywKKyAgICAgIC8vIGZpbGwoKSBtdXN0IHJldHVybiB3aWRlbignICcpIGFueSB0aW1lIGFmdGVyIGluaXQoKSBoYXMgYmVlbgorICAgICAgLy8gY2FsbGVkLCB3aGljaCBuZWVkcyBhbiBpbWJ1ZWQgY3R5cGUgZmFjZXQgb2YgY2hhcl90eXBlIHRvCisgICAgICAvLyByZXR1cm4gd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uIFVuZm9ydHVuYXRlbHksCisgICAgICAvLyBjdHlwZTxjaGFyX3R5cGU+IGlzIG5vdCBuZWNlc3NhcmlseSBhIHJlcXVpcmVkIGZhY2V0LCBzbworICAgICAgLy8gc3RyZWFtcyB3aXRoIGNoYXJfdHlwZSAhPSBbY2hhciwgd2NoYXJfdF0gd2lsbCBub3QgaGF2ZSBpdCBieQorICAgICAgLy8gZGVmYXVsdC4gQmVjYXVzZSBvZiB0aGlzLCB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgX01fZmlsbCBpcworICAgICAgLy8gY29uc3RydWN0ZWQgb24gdGhlIGZpcnN0IGNhbGwgb2YgZmlsbCgpLiBUaGF0IHdheSwKKyAgICAgIC8vIHVuZm9ybWF0dGVkIGlucHV0IGFuZCBvdXRwdXQgd2l0aCBub24tcmVxdWlyZWQgYmFzaWNfaW9zCisgICAgICAvLyBpbnN0YW50aWF0aW9ucyBpcyBwb3NzaWJsZSBldmVuIHdpdGhvdXQgaW1idWluZyB0aGUgZXhwZWN0ZWQKKyAgICAgIC8vIGN0eXBlPGNoYXJfdHlwZT4gZmFjZXQuCisgICAgICBfTV9maWxsID0gX0NoYXJUKCk7CisgICAgICBfTV9maWxsX2luaXQgPSBmYWxzZTsKKworICAgICAgX01fdGllID0gMDsKKyAgICAgIF9NX2V4Y2VwdGlvbiA9IGdvb2RiaXQ7CisgICAgICBfTV9zdHJlYW1idWYgPSBfX3NiOworICAgICAgX01fc3RyZWFtYnVmX3N0YXRlID0gX19zYiA/IGdvb2RiaXQgOiBiYWRiaXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz46Ol9NX2NhY2hlX2xvY2FsZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGhhc19mYWNldDxfX2N0eXBlX3R5cGU+KF9fbG9jKSwgdHJ1ZSkpCisJX01fY3R5cGUgPSAmdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19sb2MpOworICAgICAgZWxzZQorCV9NX2N0eXBlID0gMDsKKworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoaGFzX2ZhY2V0PF9fbnVtX3B1dF90eXBlPihfX2xvYyksIHRydWUpKQorCV9NX251bV9wdXQgPSAmdXNlX2ZhY2V0PF9fbnVtX3B1dF90eXBlPihfX2xvYyk7CisgICAgICBlbHNlCisJX01fbnVtX3B1dCA9IDA7CisKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGhhc19mYWNldDxfX251bV9nZXRfdHlwZT4oX19sb2MpLCB0cnVlKSkKKwlfTV9udW1fZ2V0ID0gJnVzZV9mYWNldDxfX251bV9nZXRfdHlwZT4oX19sb2MpOworICAgICAgZWxzZQorCV9NX251bV9nZXQgPSAwOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2lvczxjaGFyPjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pb3M8d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9iYXNpY19zdHJpbmcuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9iYXNpY19zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjcwOGI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2Jhc2ljX3N0cmluZy5oCkBAIC0wLDAgKzEsMzAzNiBAQAorLy8gQ29tcG9uZW50cyBmb3IgbWFuaXB1bGF0aW5nIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Jhc2ljX3N0cmluZy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKyNpZm5kZWYgX0JBU0lDX1NUUklOR19ICisjZGVmaW5lIF9CQVNJQ19TVFJJTkdfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBjbGFzcyBiYXNpY19zdHJpbmcgYmFzaWNfc3RyaW5nLmggPHN0cmluZz4KKyAgICogIEBicmllZiAgTWFuYWdpbmcgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgYW5kIGNoYXJhY3Rlci1saWtlIG9iamVjdHMuCisgICAqCisgICAqICBAaW5ncm91cCBzdHJpbmdzCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY3Ij5zZXF1ZW5jZTwvYT4uICBPZiB0aGUKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY4Ij5vcHRpb25hbCBzZXF1ZW5jZSByZXF1aXJlbWVudHM8L2E+LCBvbmx5CisgICAqICBAYyBwdXNoX2JhY2ssIEBjIGF0LCBhbmQgQGMgJWFycmF5IGFjY2VzcyBhcmUgc3VwcG9ydGVkLgorICAgKgorICAgKiAgQGRvY3RvZG8KKyAgICoKKyAgICoKKyAgICogIERvY3VtZW50YXRpb24/ICBXaGF0J3MgdGhhdD8KKyAgICogIE5hdGhhbiBNeWVycyA8bmNtQGNhbnRyaXAub3JnPi4KKyAgICoKKyAgICogIEEgc3RyaW5nIGxvb2tzIGxpa2UgdGhpczoKKyAgICoKKyAgICogIEBjb2RlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtfUmVwXQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9sZW5ndGgKKyAgICogICBbYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT5dICAgICAgICAgICAgX01fY2FwYWNpdHkKKyAgICogICBfTV9kYXRhcGx1cyAgICAgICAgICAgICAgICAgICAgICAgICAgX01fcmVmY291bnQKKyAgICogICBfTV9wIC0tLS0tLS0tLS0tLS0tLS0+ICAgICAgICAgICAgICAgdW5uYW1lZCBhcnJheSBvZiBjaGFyX3R5cGUKKyAgICogIEBlbmRjb2RlCisgICAqCisgICAqICBXaGVyZSB0aGUgX01fcCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLCBhbmQKKyAgICogIHlvdSBjYXN0IGl0IHRvIGEgcG9pbnRlci10by1fUmVwIGFuZCBzdWJ0cmFjdCAxIHRvIGdldCBhCisgICAqICBwb2ludGVyIHRvIHRoZSBoZWFkZXIuCisgICAqCisgICAqICBUaGlzIGFwcHJvYWNoIGhhcyB0aGUgZW5vcm1vdXMgYWR2YW50YWdlIHRoYXQgYSBzdHJpbmcgb2JqZWN0CisgICAqICByZXF1aXJlcyBvbmx5IG9uZSBhbGxvY2F0aW9uLiAgQWxsIHRoZSB1Z2xpbmVzcyBpcyBjb25maW5lZAorICAgKiAgd2l0aGluIGEgc2luZ2xlICVwYWlyIG9mIGlubGluZSBmdW5jdGlvbnMsIHdoaWNoIGVhY2ggY29tcGlsZSB0bworICAgKiAgYSBzaW5nbGUgQGEgYWRkIGluc3RydWN0aW9uOiBfUmVwOjpfTV9kYXRhKCksIGFuZAorICAgKiAgc3RyaW5nOjpfTV9yZXAoKTsgYW5kIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHdoaWNoIGdldHMgYQorICAgKiAgYmxvY2sgb2YgcmF3IGJ5dGVzIGFuZCB3aXRoIHJvb20gZW5vdWdoIGFuZCBjb25zdHJ1Y3RzIGEgX1JlcAorICAgKiAgb2JqZWN0IGF0IHRoZSBmcm9udC4KKyAgICoKKyAgICogIFRoZSByZWFzb24geW91IHdhbnQgX01fZGF0YSBwb2ludGluZyB0byB0aGUgY2hhcmFjdGVyICVhcnJheSBhbmQKKyAgICogIG5vdCB0aGUgX1JlcCBpcyBzbyB0aGF0IHRoZSBkZWJ1Z2dlciBjYW4gc2VlIHRoZSBzdHJpbmcKKyAgICogIGNvbnRlbnRzLiAoUHJvYmFibHkgd2Ugc2hvdWxkIGFkZCBhIG5vbi1pbmxpbmUgbWVtYmVyIHRvIGdldAorICAgKiAgdGhlIF9SZXAgZm9yIHRoZSBkZWJ1Z2dlciB0byB1c2UsIHNvIHVzZXJzIGNhbiBjaGVjayB0aGUgYWN0dWFsCisgICAqICBzdHJpbmcgbGVuZ3RoLikKKyAgICoKKyAgICogIE5vdGUgdGhhdCB0aGUgX1JlcCBvYmplY3QgaXMgYSBQT0Qgc28gdGhhdCB5b3UgY2FuIGhhdmUgYQorICAgKiAgc3RhdGljIDxlbT5lbXB0eSBzdHJpbmc8L2VtPiBfUmVwIG9iamVjdCBhbHJlYWR5IEBhIGNvbnN0cnVjdGVkIGJlZm9yZQorICAgKiAgc3RhdGljIGNvbnN0cnVjdG9ycyBoYXZlIHJ1bi4gIFRoZSByZWZlcmVuY2UtY291bnQgZW5jb2RpbmcgaXMKKyAgICogIGNob3NlbiBzbyB0aGF0IGEgMCBpbmRpY2F0ZXMgb25lIHJlZmVyZW5jZSwgc28geW91IG5ldmVyIHRyeSB0bworICAgKiAgZGVzdHJveSB0aGUgZW1wdHktc3RyaW5nIF9SZXAgb2JqZWN0LgorICAgKgorICAgKiAgQWxsIGJ1dCB0aGUgbGFzdCBwYXJhZ3JhcGggaXMgY29uc2lkZXJlZCBwcmV0dHkgY29udmVudGlvbmFsCisgICAqICBmb3IgYSBDKysgc3RyaW5nIGltcGxlbWVudGF0aW9uLgorICAqLworICAvLyAyMS4zICBUZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmcKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfQ2hhclQ+OjpvdGhlciBfQ2hhclRfYWxsb2NfdHlwZTsKKworICAgICAgLy8gVHlwZXM6CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpyZWZlcmVuY2UJICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnBvaW50ZXIJICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyCSAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIGJhc2ljX3N0cmluZz4gIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPGNvbnN0X3BvaW50ZXIsIGJhc2ljX3N0cmluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+CWNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JCSAgICByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9SZXA6IHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgLy8gICBJbnZhcmlhbnRzOgorICAgICAgLy8gICAxLiBTdHJpbmcgcmVhbGx5IGNvbnRhaW5zIF9NX2xlbmd0aCArIDEgY2hhcmFjdGVyczogZHVlIHRvIDIxLjMuNAorICAgICAgLy8gICAgICBtdXN0IGJlIGtlcHQgbnVsbC10ZXJtaW5hdGVkLgorICAgICAgLy8gICAyLiBfTV9jYXBhY2l0eSA+PSBfTV9sZW5ndGgKKyAgICAgIC8vICAgICAgQWxsb2NhdGVkIG1lbW9yeSBpcyBhbHdheXMgKF9NX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKS4KKyAgICAgIC8vICAgMy4gX01fcmVmY291bnQgaGFzIHRocmVlIHN0YXRlczoKKyAgICAgIC8vICAgICAgLTE6IGxlYWtlZCwgb25lIHJlZmVyZW5jZSwgbm8gcmVmLWNvcGllcyBhbGxvd2VkLCBub24tY29uc3QuCisgICAgICAvLyAgICAgICAwOiBvbmUgcmVmZXJlbmNlLCBub24tY29uc3QuCisgICAgICAvLyAgICAgbj4wOiBuICsgMSByZWZlcmVuY2VzLCBvcGVyYXRpb25zIHJlcXVpcmUgYSBsb2NrLCBjb25zdC4KKyAgICAgIC8vICAgNC4gQWxsIGZpZWxkcz09MCBpcyBhbiBlbXB0eSBzdHJpbmcsIGdpdmVuIHRoZSBleHRyYSBzdG9yYWdlCisgICAgICAvLyAgICAgIGJleW9uZC10aGUtZW5kIGZvciBhIG51bGwgdGVybWluYXRvcjsgdGh1cywgdGhlIHNoYXJlZAorICAgICAgLy8gICAgICBlbXB0eSBzdHJpbmcgcmVwcmVzZW50YXRpb24gbmVlZHMgbm8gY29uc3RydWN0b3IuCisKKyAgICAgIHN0cnVjdCBfUmVwX2Jhc2UKKyAgICAgIHsKKwlzaXplX3R5cGUJCV9NX2xlbmd0aDsKKwlzaXplX3R5cGUJCV9NX2NhcGFjaXR5OworCV9BdG9taWNfd29yZAkJX01fcmVmY291bnQ7CisgICAgICB9OworCisgICAgICBzdHJ1Y3QgX1JlcCA6IF9SZXBfYmFzZQorICAgICAgeworCS8vIFR5cGVzOgorCXR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8Y2hhcj46Om90aGVyIF9SYXdfYnl0ZXNfYWxsb2M7CisKKwkvLyAoUHVibGljKSBEYXRhIG1lbWJlcnM6CisKKwkvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBjaGFyX3R5cGUgZWxlbWVudHMgb2YgYW4KKwkvLyBpbmRpdmlkdWFsIHN0cmluZyBpcyBkZXRlcm1pbmVkIGJ5IF9TX21heF9zaXplLiBUaGlzIGlzIHRoZQorCS8vIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBtYXhfc2l6ZSgpLiAgKFdoZXJlYXMgbnBvcworCS8vIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGUgYWxsb2NhdG9yIGNhbiBhbGxvY2F0ZS4pCisJLy8gSWYgb25lIHdhcyB0byBkaXZ2eSB1cCB0aGUgdGhlb3JldGljYWwgbGFyZ2VzdCBzaXplIHN0cmluZywKKwkvLyB3aXRoIGEgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFuZCBtIF9DaGFyVCBlbGVtZW50cywgaXQnZAorCS8vIGxvb2sgbGlrZSB0aGlzOgorCS8vIG5wb3MgPSBzaXplb2YoX1JlcCkgKyAobSAqIHNpemVvZihfQ2hhclQpKSArIHNpemVvZihfQ2hhclQpCisJLy8gU29sdmluZyBmb3IgbToKKwkvLyBtID0gKChucG9zIC0gc2l6ZW9mKF9SZXApKS9zaXplb2YoQ2hhclQpKSAtIDEKKwkvLyBJbiBhZGRpdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBxdWFydGVycyB0aGlzIGFtb3VudC4KKwlzdGF0aWMgY29uc3Qgc2l6ZV90eXBlCV9TX21heF9zaXplOworCXN0YXRpYyBjb25zdCBfQ2hhclQJX1NfdGVybWluYWw7CisKKwkvLyBUaGUgZm9sbG93aW5nIHN0b3JhZ2UgaXMgaW5pdCdkIHRvIDAgYnkgdGhlIGxpbmtlciwgcmVzdWx0aW5nCisgICAgICAgIC8vIChjYXJlZnVsbHkpIGluIGFuIGVtcHR5IHN0cmluZyB3aXRoIG9uZSByZWZlcmVuY2UuCisgICAgICAgIHN0YXRpYyBzaXplX3R5cGUgX1NfZW1wdHlfcmVwX3N0b3JhZ2VbXTsKKworICAgICAgICBzdGF0aWMgX1JlcCYKKyAgICAgICAgX1NfZW1wdHlfcmVwKCkKKyAgICAgICAgeyAKKwkgIC8vIE5COiBNaWxkIGhhY2sgdG8gYXZvaWQgc3RyaWN0LWFsaWFzaW5nIHdhcm5pbmdzLiAgTm90ZSB0aGF0CisJICAvLyBfU19lbXB0eV9yZXBfc3RvcmFnZSBpcyBuZXZlciBtb2RpZmllZCBhbmQgdGhlIHB1bm5pbmcgc2hvdWxkCisJICAvLyBiZSByZWFzb25hYmx5IHNhZmUgaW4gdGhpcyBjYXNlLgorCSAgdm9pZCogX19wID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJl9TX2VtcHR5X3JlcF9zdG9yYWdlKTsKKwkgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxfUmVwKj4oX19wKTsKKwl9CisKKyAgICAgICAgYm9vbAorCV9NX2lzX2xlYWtlZCgpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX3JlZmNvdW50IDwgMDsgfQorCisgICAgICAgIGJvb2wKKwlfTV9pc19zaGFyZWQoKSBjb25zdAorICAgICAgICB7IHJldHVybiB0aGlzLT5fTV9yZWZjb3VudCA+IDA7IH0KKworICAgICAgICB2b2lkCisJX01fc2V0X2xlYWtlZCgpCisgICAgICAgIHsgdGhpcy0+X01fcmVmY291bnQgPSAtMTsgfQorCisgICAgICAgIHZvaWQKKwlfTV9zZXRfc2hhcmFibGUoKQorICAgICAgICB7IHRoaXMtPl9NX3JlZmNvdW50ID0gMDsgfQorCisJdm9pZAorCV9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKHNpemVfdHlwZSBfX24pCisJeworI2lmbmRlZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORworCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcyAhPSAmX1NfZW1wdHlfcmVwKCksIGZhbHNlKSkKKyNlbmRpZgorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0X3NoYXJhYmxlKCk7ICAvLyBPbmUgcmVmZXJlbmNlLgorCSAgICAgIHRoaXMtPl9NX2xlbmd0aCA9IF9fbjsKKwkgICAgICB0cmFpdHNfdHlwZTo6YXNzaWduKHRoaXMtPl9NX3JlZmRhdGEoKVtfX25dLCBfU190ZXJtaW5hbCk7CisJICAgICAgLy8gZ3Jyci4gKHBlciAyMS4zLjQpCisJICAgICAgLy8gWW91IGNhbm5vdCBsZWF2ZSB0aG9zZSBMV0cgcGVvcGxlIGFsb25lIGZvciBhIHNlY29uZC4KKwkgICAgfQorCX0KKworCV9DaGFyVCoKKwlfTV9yZWZkYXRhKCkgdGhyb3coKQorCXsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8X0NoYXJUKj4odGhpcyArIDEpOyB9CisKKwlfQ2hhclQqCisJX01fZ3JhYihjb25zdCBfQWxsb2MmIF9fYWxsb2MxLCBjb25zdCBfQWxsb2MmIF9fYWxsb2MyKQorCXsKKwkgIHJldHVybiAoIV9NX2lzX2xlYWtlZCgpICYmIF9fYWxsb2MxID09IF9fYWxsb2MyKQorCSAgICAgICAgICA/IF9NX3JlZmNvcHkoKSA6IF9NX2Nsb25lKF9fYWxsb2MxKTsKKwl9CisKKwkvLyBDcmVhdGUgJiBEZXN0cm95CisJc3RhdGljIF9SZXAqCisJX1NfY3JlYXRlKHNpemVfdHlwZSwgc2l6ZV90eXBlLCBjb25zdCBfQWxsb2MmKTsKKworCXZvaWQKKwlfTV9kaXNwb3NlKGNvbnN0IF9BbGxvYyYgX19hKQorCXsKKyNpZm5kZWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcKKwkgIGlmIChfX2J1aWx0aW5fZXhwZWN0KHRoaXMgIT0gJl9TX2VtcHR5X3JlcCgpLCBmYWxzZSkpCisjZW5kaWYKKwkgICAgeworCSAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKwkgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoJnRoaXMtPl9NX3JlZmNvdW50KTsKKwkgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJnRoaXMtPl9NX3JlZmNvdW50LAorCQkJCQkJCSAtMSkgPD0gMCkKKwkJeworCQkgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZ0aGlzLT5fTV9yZWZjb3VudCk7CisJCSAgX01fZGVzdHJveShfX2EpOworCQl9CisJICAgIH0KKwl9ICAvLyBYWFggTVQKKworCXZvaWQKKwlfTV9kZXN0cm95KGNvbnN0IF9BbGxvYyYpIHRocm93KCk7CisKKwlfQ2hhclQqCisJX01fcmVmY29weSgpIHRocm93KCkKKwl7CisjaWZuZGVmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HCisJICBpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzICE9ICZfU19lbXB0eV9yZXAoKSwgZmFsc2UpKQorI2VuZGlmCisgICAgICAgICAgICBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmdGhpcy0+X01fcmVmY291bnQsIDEpOworCSAgcmV0dXJuIF9NX3JlZmRhdGEoKTsKKwl9ICAvLyBYWFggTVQKKworCV9DaGFyVCoKKwlfTV9jbG9uZShjb25zdCBfQWxsb2MmLCBzaXplX3R5cGUgX19yZXMgPSAwKTsKKyAgICAgIH07CisKKyAgICAgIC8vIFVzZSBlbXB0eS1iYXNlIG9wdGltaXphdGlvbjogaHR0cDovL3d3dy5jYW50cmlwLm9yZy9lbXB0eW9wdC5odG1sCisgICAgICBzdHJ1Y3QgX0FsbG9jX2hpZGVyIDogX0FsbG9jCisgICAgICB7CisJX0FsbG9jX2hpZGVyKF9DaGFyVCogX19kYXQsIGNvbnN0IF9BbGxvYyYgX19hKQorCTogX0FsbG9jKF9fYSksIF9NX3AoX19kYXQpIHsgfQorCisJX0NoYXJUKiBfTV9wOyAvLyBUaGUgYWN0dWFsIGRhdGEuCisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLy8gRGF0YSBNZW1iZXJzIChwdWJsaWMpOgorICAgICAgLy8gTkI6IFRoaXMgaXMgYW4gdW5zaWduZWQgdHlwZSwgYW5kIHRodXMgcmVwcmVzZW50cyB0aGUgbWF4aW11bQorICAgICAgLy8gc2l6ZSB0aGF0IHRoZSBhbGxvY2F0b3IgY2FuIGhvbGQuCisgICAgICAvLy8gIFZhbHVlIHJldHVybmVkIGJ5IHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHRoZXkgZmFpbC4KKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUJbnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIERhdGEgTWVtYmVycyAocHJpdmF0ZSk6CisgICAgICBtdXRhYmxlIF9BbGxvY19oaWRlcglfTV9kYXRhcGx1czsKKworICAgICAgX0NoYXJUKgorICAgICAgX01fZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiAgX01fZGF0YXBsdXMuX01fcDsgfQorCisgICAgICBfQ2hhclQqCisgICAgICBfTV9kYXRhKF9DaGFyVCogX19wKQorICAgICAgeyByZXR1cm4gKF9NX2RhdGFwbHVzLl9NX3AgPSBfX3ApOyB9CisKKyAgICAgIF9SZXAqCisgICAgICBfTV9yZXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gJigocmVpbnRlcnByZXRfY2FzdDxfUmVwKj4gKF9NX2RhdGEoKSkpWy0xXSk7IH0KKworICAgICAgLy8gRm9yIHRoZSBpbnRlcm5hbCB1c2Ugd2UgaGF2ZSBmdW5jdGlvbnMgc2ltaWxhciB0byBgYmVnaW4nL2BlbmQnCisgICAgICAvLyBidXQgdGhleSBkbyBub3QgY2FsbCBfTV9sZWFrLgorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2liZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9kYXRhKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbGVhaygpICAgIC8vIGZvciB1c2UgaW4gYmVnaW4oKSAmIG5vbi1jb25zdCBvcFtdCisgICAgICB7CisJaWYgKCFfTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCisJICBfTV9sZWFrX2hhcmQoKTsKKyAgICAgIH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9jaGVjayhzaXplX3R5cGUgX19wb3MsIGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsKKwlpZiAoX19wb3MgPiB0aGlzLT5zaXplKCkpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oX19zKSk7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKHRoaXMtPm1heF9zaXplKCkgLSAodGhpcy0+c2l6ZSgpIC0gX19uMSkgPCBfX24yKQorCSAgX190aHJvd19sZW5ndGhfZXJyb3IoX19OKF9fcykpOworICAgICAgfQorCisgICAgICAvLyBOQjogX01fbGltaXQgZG9lc24ndCBjaGVjayBmb3IgYSBiYWQgX19wb3MgdmFsdWUuCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2xpbWl0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fb2ZmKSBjb25zdAorICAgICAgeworCWNvbnN0IGJvb2wgX190ZXN0b2ZmID0gIF9fb2ZmIDwgdGhpcy0+c2l6ZSgpIC0gX19wb3M7CisJcmV0dXJuIF9fdGVzdG9mZiA/IF9fb2ZmIDogdGhpcy0+c2l6ZSgpIC0gX19wb3M7CisgICAgICB9CisKKyAgICAgIC8vIFRydWUgaWYgX1JlcCBhbmQgc291cmNlIGRvIG5vdCBvdmVybGFwLgorICAgICAgYm9vbAorICAgICAgX01fZGlzanVuY3QoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChsZXNzPGNvbnN0IF9DaGFyVCo+KCkoX19zLCBfTV9kYXRhKCkpCisJCXx8IGxlc3M8Y29uc3QgX0NoYXJUKj4oKShfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCksIF9fcykpOworICAgICAgfQorCisgICAgICAvLyBXaGVuIF9fbiA9IDEgd2F5IGZhc3RlciB0aGFuIHRoZSBnZW5lcmFsIG11bHRpY2hhcgorICAgICAgLy8gdHJhaXRzX3R5cGU6OmNvcHkvbW92ZS9hc3NpZ24uCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01fY29weShfQ2hhclQqIF9fZCwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCAqX19zKTsKKwllbHNlCisJICB0cmFpdHNfdHlwZTo6Y29weShfX2QsIF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX21vdmUoX0NoYXJUKiBfX2QsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgKl9fcyk7CisJZWxzZQorCSAgdHJhaXRzX3R5cGU6Om1vdmUoX19kLCBfX3MsIF9fbik7CSAgCisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9hc3NpZ24oX0NoYXJUKiBfX2QsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJaWYgKF9fbiA9PSAxKQorCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19kLCBfX2MpOworCWVsc2UKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oX19kLCBfX24sIF9fYyk7CSAgCisgICAgICB9CisKKyAgICAgIC8vIF9TX2NvcHlfY2hhcnMgaXMgYSBzZXBhcmF0ZSB0ZW1wbGF0ZSB0byBwZXJtaXQgc3BlY2lhbGl6YXRpb24KKyAgICAgIC8vIHRvIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgcG9pbnRlcnMgYXMgaXRlcmF0b3JzLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0l0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfSXRlcmF0b3IgX19rMSwgX0l0ZXJhdG9yIF9fazIpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2sxICE9IF9fazI7ICsrX19rMSwgKytfX3ApCisJICAgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fcCwgKl9fazEpOyAvLyBUaGVzZSB0eXBlcyBhcmUgb2ZmLgorCX0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIGl0ZXJhdG9yIF9fazEsIGl0ZXJhdG9yIF9fazIpCisgICAgICB7IF9TX2NvcHlfY2hhcnMoX19wLCBfX2sxLmJhc2UoKSwgX19rMi5iYXNlKCkpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBjb25zdF9pdGVyYXRvciBfX2sxLCBjb25zdF9pdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX0NoYXJUKiBfX2sxLCBfQ2hhclQqIF9fazIpCisgICAgICB7IF9NX2NvcHkoX19wLCBfX2sxLCBfX2syIC0gX19rMSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIGNvbnN0IF9DaGFyVCogX19rMSwgY29uc3QgX0NoYXJUKiBfX2syKQorICAgICAgeyBfTV9jb3B5KF9fcCwgX19rMSwgX19rMiAtIF9fazEpOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIF9TX2NvbXBhcmUoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yKQorICAgICAgeworCWNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2QgPSBkaWZmZXJlbmNlX3R5cGUoX19uMSAtIF9fbjIpOworCisJaWYgKF9fZCA+IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heCkKKwkgIHJldHVybiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXg7CisJZWxzZSBpZiAoX19kIDwgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWluKQorCSAgcmV0dXJuIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbjsKKwllbHNlCisJICByZXR1cm4gaW50KF9fZCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIHNpemVfdHlwZSBfX2xlbjIpOworCisgICAgICB2b2lkCisgICAgICBfTV9sZWFrX2hhcmQoKTsKKworICAgICAgc3RhdGljIF9SZXAmCisgICAgICBfU19lbXB0eV9yZXAoKQorICAgICAgeyByZXR1cm4gX1JlcDo6X1NfZW1wdHlfcmVwKCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICAvLyBOQjogV2Ugb3ZlcmxvYWQgY3RvcnMgaW4gc29tZSBjYXNlcyBpbnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQKKyAgICAgIC8vIGFyZ3VtZW50cywgcGVyIDE3LjQuNC40IHBhcmEuIDIgaXRlbSAyLgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZygpCisjaWZuZGVmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HCisgICAgICA6IF9NX2RhdGFwbHVzKF9TX2VtcHR5X3JlcCgpLl9NX3JlZmRhdGEoKSwgX0FsbG9jKCkpIHsgfQorI2Vsc2UKKyAgICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KHNpemVfdHlwZSgpLCBfQ2hhclQoKSwgX0FsbG9jKCkpLCBfQWxsb2MoKSl7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhbiBlbXB0eSBzdHJpbmcgdXNpbmcgYWxsb2NhdG9yIEBhIGEuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICAvLyBOQjogcGVyIExXRyBpc3N1ZSA0Miwgc2VtYW50aWNzIGRpZmZlcmVudCBmcm9tIElTOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIHdpdGggY29weSBvZiB2YWx1ZSBvZiBAYSBzdHIuCisgICAgICAgKiAgQHBhcmFtICBzdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weSBmcm9tLgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weSAoZGVmYXVsdCByZW1haW5kZXIpLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICBzaXplX3R5cGUgX19uID0gbnBvcyk7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHN0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHBvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGNvcHkgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBhICBBbGxvY2F0b3IgdG8gdXNlLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICBzaXplX3R5cGUgX19uLCBjb25zdCBfQWxsb2MmIF9fYSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBpbml0aWFsaXplZCBieSBhIGNoYXJhY3RlciAlYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBzICBTb3VyY2UgY2hhcmFjdGVyICVhcnJheS4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBhICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqCisgICAgICAgKiAgTkI6IEBhIHMgbXVzdCBoYXZlIGF0IGxlYXN0IEBhIG4gY2hhcmFjdGVycywgJmFwb3M7XFwwJmFwb3M7CisgICAgICAgKiAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLAorCQkgICBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBzICBTb3VyY2UgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBhICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtICBjICBDaGFyYWN0ZXIgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgY29uc3RydWN0IHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHN0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgc3RyaW5nIGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSBzdHIuCisgICAgICAgKiAgQGEgc3RyIGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCBzdHJpbmcuCisgICAgICAgKiovCisgICAgICBiYXNpY19zdHJpbmcoYmFzaWNfc3RyaW5nJiYgX19zdHIpCisgICAgICA6IF9NX2RhdGFwbHVzKF9fc3RyLl9NX2RhdGFwbHVzKQorICAgICAgeworI2lmbmRlZiBfR0xJQkNYWF9GVUxMWV9EWU5BTUlDX1NUUklORwkKKwlfX3N0ci5fTV9kYXRhKF9TX2VtcHR5X3JlcCgpLl9NX3JlZmRhdGEoKSk7CisjZWxzZQorCV9fc3RyLl9NX2RhdGEoX1NfY29uc3RydWN0KHNpemVfdHlwZSgpLCBfQ2hhclQoKSwgZ2V0X2FsbG9jYXRvcigpKSk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGZyb20gYW4gaW5pdGlhbGl6ZXIgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBsICBzdGQ6OmluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcoaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCwgY29uc3QgX0FsbG9jJiBfX2EgPSBfQWxsb2MoKSk7CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIGNvcHkgb2YgYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGJlZyAgU3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJICAgICBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cm95IHRoZSBzdHJpbmcgaW5zdGFuY2UuCisgICAgICAgKi8KKyAgICAgIH5iYXNpY19zdHJpbmcoKQorICAgICAgeyBfTV9yZXAoKS0+X01fZGlzcG9zZSh0aGlzLT5nZXRfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIHRoZSB2YWx1ZSBvZiBAYSBzdHIgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBzdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSAKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX3N0cik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5IGNvbnRlbnRzIG9mIEBhIHMgaW50byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHMgIFNvdXJjZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpIAorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gc3RyaW5nIG9mIGxlbmd0aCAxLgorICAgICAgICogIEBwYXJhbSAgYyAgU291cmNlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduaW5nIHRvIGEgY2hhcmFjdGVyIG1ha2VzIHRoaXMgc3RyaW5nIGxlbmd0aCAxIGFuZAorICAgICAgICogICgqdGhpcylbMF0gPT0gQGEgYy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpIAorICAgICAgeyAKKwl0aGlzLT5hc3NpZ24oMSwgX19jKTsgCisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92ZSBhc3NpZ24gdGhlIHZhbHVlIG9mIEBhIHN0ciB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHN0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIHN0ciBhcmUgbW92ZWQgaW50byB0aGlzIHN0cmluZyAod2l0aG91dCBjb3B5aW5nKS4KKyAgICAgICAqICBAYSBzdHIgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgICAqKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yPShiYXNpY19zdHJpbmcmJiBfX3N0cikKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwl0aGlzLT5zd2FwKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIHN0cmluZyBjb25zdHJ1Y3RlZCBmcm9tIGluaXRpYWxpemVyICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgbCAgc3RkOjppbml0aWFsaXplcl9saXN0LgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5zaXplKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgICAvLyBJdGVyYXRvcnM6CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCisgICAgICAgKiAgdGhlICVzdHJpbmcuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeworCV9NX2xlYWsoKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2RhdGEoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsKKwlfTV9sZWFrKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUKKyAgICAgICAqICBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQKKyAgICAgICAqICBvcmRlci4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uCisgICAgICAgKiAgaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlCisgICAgICAgKiAgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENhcGFjaXR5OgorICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9sZW5ndGg7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2xlbmd0aDsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAlc3RyaW5nLgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfUmVwOjpfU19tYXhfc2l6ZTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSAlc3RyaW5nIHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSAgYyAgQ2hhcmFjdGVyIHRvIGZpbGwgYW55IG5ldyBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJXN0cmluZydzIGN1cnJlbnQgc2l6ZSB0aGUgJXN0cmluZyBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogIHRoZSAlc3RyaW5nIGlzIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlICVzZXQgdG8gQGEgYy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSAlc3RyaW5nIHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzaXplIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLiAgSWYKKyAgICAgICAqICB0aGUgbmV3IHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSAlc3RyaW5nJ3MgY3VycmVudCBzaXplIHRoZSAlc3RyaW5nCisgICAgICAgKiAgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVzdHJpbmcgaXMgZXh0ZW5kZWQgYW5kIG5ldyBjaGFyYWN0ZXJzCisgICAgICAgKiAgYXJlIGRlZmF1bHQtY29uc3RydWN0ZWQuICBGb3IgYmFzaWMgdHlwZXMgc3VjaCBhcyBjaGFyLCB0aGlzIG1lYW5zCisgICAgICAgKiAgc2V0dGluZyB0aGVtIHRvIDAuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uKQorICAgICAgeyB0aGlzLT5yZXNpemUoX19uLCBfQ2hhclQoKSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLy8gIEEgbm9uLWJpbmRpbmcgcmVxdWVzdCB0byByZWR1Y2UgY2FwYWNpdHkoKSB0byBzaXplKCkuCisgICAgICB2b2lkCisgICAgICBzaHJpbmtfdG9fZml0KCkKKyAgICAgIHsKKwlfX3RyeQorCSAgeyByZXNlcnZlKDApOyB9CisJX19jYXRjaCguLi4pCisJICB7IH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSAlc3RyaW5nIGNhbiBob2xkCisgICAgICAgKiAgYmVmb3JlIG5lZWRpbmcgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY2FwYWNpdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2NhcGFjaXR5OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXR0ZW1wdCB0byBwcmVhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgICBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgcmVzX2FyZyAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVxdWlyZWQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgQGEgcmVzX2FyZyBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcmVzZXJ2ZSBlbm91Z2ggbWVtb3J5IGZvciB0aGUKKyAgICAgICAqICAlc3RyaW5nIHRvIGhvbGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4gIElmIHRoZQorICAgICAgICogIG51bWJlciByZXF1ZXN0ZWQgaXMgbW9yZSB0aGFuIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGFkdmFudGFnZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgaWYgb3B0aW1hbCBjb2RlIGlzIGEKKyAgICAgICAqICBuZWNlc3NpdHkgYW5kIHRoZSB1c2VyIGNhbiBkZXRlcm1pbmUgdGhlIHN0cmluZyBsZW5ndGggdGhhdCB3aWxsIGJlCisgICAgICAgKiAgcmVxdWlyZWQsIHRoZSB1c2VyIGNhbiByZXNlcnZlIHRoZSBtZW1vcnkgaW4gJWFkdmFuY2UsIGFuZCB0aHVzCisgICAgICAgKiAgcHJldmVudCBhIHBvc3NpYmxlIHJlYWxsb2NhdGlvbiBvZiBtZW1vcnkgYW5kIGNvcHlpbmcgb2YgJXN0cmluZworICAgICAgICogIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fcmVzX2FyZyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgdGhlIHN0cmluZywgbWFraW5nIGl0IGVtcHR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX211dGF0ZSgwLCB0aGlzLT5zaXplKCksIDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXN0cmluZyBpcyBlbXB0eS4gIEVxdWl2YWxlbnQgdG8gCisgICAgICAgKiAgPGNvZGU+KnRoaXMgPT0gIiI8L2NvZGU+LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zaXplKCkgPT0gMDsgfQorCisgICAgICAvLyBFbGVtZW50IGFjY2VzczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3Vic2NyaXB0IGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBwb3MgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wb3MgPD0gc2l6ZSgpKTsKKwlyZXR1cm4gX01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHBvcyAgVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0b3IgYWxsb3dzIGZvciBlYXN5LCBhcnJheS1zdHlsZSwgZGF0YSBhY2Nlc3MuCisgICAgICAgKiAgTm90ZSB0aGF0IGRhdGEgYWNjZXNzIHdpdGggdGhpcyBvcGVyYXRvciBpcyB1bmNoZWNrZWQgYW5kCisgICAgICAgKiAgb3V0X29mX3JhbmdlIGxvb2t1cHMgYXJlIG5vdCBkZWZpbmVkLiAoRm9yIGNoZWNrZWQgbG9va3VwcworICAgICAgICogIHNlZSBhdCgpLikgIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisgICAgICAgIC8vIGFsbG93IHBvcyA9PSBzaXplKCkgYXMgdjMgZXh0ZW5zaW9uOgorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3BvcyA8PSBzaXplKCkpOworICAgICAgICAvLyBidXQgYmUgc3RyaWN0IGluIHBlZGFudGljIG1vZGU6CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcG9zIDwgc2l6ZSgpKTsKKwlfTV9sZWFrKCk7CisJcmV0dXJuIF9NX2RhdGEoKVtfX3Bvc107CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdCkgcmVmZXJlbmNlIHRvIHRoZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIgaXMKKyAgICAgICAqICBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUgZnVuY3Rpb24KKyAgICAgICAqICB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCWlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiYXNpY19zdHJpbmc6OmF0IikpOworCXJldHVybiBfTV9kYXRhKClbX19uXTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7IHJldHVybiBvcGVyYXRvcltdKHRoaXMtPnNpemUoKSAtIDEpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSh0aGlzLT5zaXplKCkgLSAxKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBuIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlciBpcworICAgICAgICogIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHN0cmluZy4gIFRoZSBmdW5jdGlvbgorICAgICAgICogIHRocm93cyBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLiAgU3VjY2VzcyByZXN1bHRzIGluCisgICAgICAgKiAgdW5zaGFyaW5nIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID49IHNpemUoKSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYmFzaWNfc3RyaW5nOjphdCIpKTsKKwlfTV9sZWFrKCk7CisJcmV0dXJuIF9NX2RhdGEoKVtfX25dOworICAgICAgfQorCisgICAgICAvLyBNb2RpZmllcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHN0cmluZyB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBUaGUgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX3N0cik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KF9DaGFyVCBfX2MpCisgICAgICB7IAorCXRoaXMtPnB1c2hfYmFjayhfX2MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhbiBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIGwgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYmUgYXBwZW5kZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7IHJldHVybiB0aGlzLT5hcHBlbmQoX19sLmJlZ2luKCksIF9fbC5zaXplKCkpOyB9CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBzdHJpbmcgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHN0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzdHIgIFRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3RyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSBpZiBAYSBwb3MgaXMgbm90IGEgdmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyBAYSBuIGNoYXJhY3RlcnMgZnJvbSBAYSBzdHIgc3RhcnRpbmcgYXQgQGEgcG9zCisgICAgICAgKiAgdG8gdGhpcyBzdHJpbmcuICBJZiBAYSBuIGlzIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisgICAgICAgKiAgY2hhcmFjdGVycyBpbiBAYSBzdHIsIHRoZSByZW1haW5kZXIgb2YgQGEgc3RyIGlzIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIFRoZSBDIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5hcHBlbmQoX19zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhcmFjdGVyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEFwcGVuZHMgbiBjb3BpZXMgb2YgYyB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX2wuYmVnaW4oKSwgX19sLnNpemUoKSk7IH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIGZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gbGFzdCAgSXRlcmF0b3IgbWFya2luZyB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEFwcGVuZHMgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9NX2llbmQoKSwgX01faWVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gYyAgQ2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9DaGFyVCBfX2MpCisgICAgICB7IAorCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IDEgKyB0aGlzLT5zaXplKCk7CisJaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwl0cmFpdHNfdHlwZTo6YXNzaWduKF9NX2RhdGEoKVt0aGlzLT5zaXplKCldLCBfX2MpOworCV9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2xlbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgc3RyICBTb3VyY2Ugc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBjb250ZW50cyBvZiBhbm90aGVyIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIHN0ciAgU291cmNlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyBzdHJpbmcgdG8gdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIHN0ci4KKyAgICAgICAqICBAYSBzdHIgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGJhc2ljX3N0cmluZyYmIF9fc3RyKQorICAgICAgeworCXRoaXMtPnN3YXAoX19zdHIpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIHN1YnN0cmluZyBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBUaGUgc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ci4KKyAgICAgICAqICBAcGFyYW0gbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlIGlmIEBhIHBvcyBpcyBub3QgYSB2YWxpZCBpbmRleC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoaXMgc3RyaW5nIHRvIHRoZSBzdWJzdHJpbmcgb2YgQGEgc3RyIGNvbnNpc3RpbmcKKyAgICAgICAqICBvZiBAYSBuIGNoYXJhY3RlcnMgYXQgQGEgcG9zLiAgSWYgQGEgbiBpcyBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgYXZhaWxhYmxlIGNoYXJhY3RlcnMgaW4gQGEgc3RyLCB0aGUgcmVtYWluZGVyIG9mIEBhIHN0ciBpcyB1c2VkLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICsgX19zdHIuX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OmFzc2lnbiIpLAorCQkJICAgIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzICBUaGUgQyBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSBuICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nIHRvIHRoZSBmaXJzdCBAYSBuCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBzLiAgSWYgQGEgbiBpcyBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisgICAgICAgKiAgYXZhaWxhYmxlIGNoYXJhY3RlcnMgaW4gQGEgcywgdGhlIHJlbWFpbmRlciBvZiBAYSBzIGlzIHVzZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIFRoZSBDIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIG9mIHRoaXMgc3RyaW5nIHRvIHRoZSB2YWx1ZSBvZiBAYSBzLgorICAgICAgICogIFRoZSBkYXRhIGlzIGNvcGllZCwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jZSBvbiBAYSBzIG9uY2UgdGhlCisgICAgICAgKiAgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+YXNzaWduKF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gbiAgTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhcmFjdGVyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gQGEgbiBjb3BpZXMgb2YKKyAgICAgICAqICBjaGFyYWN0ZXIgQGEgYy4KKyAgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUoMCksIHRoaXMtPnNpemUoKSwgX19uLCBfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYXBwZW5kLgorICAgICAgICogIEBwYXJhbSBsYXN0ICBJdGVyYXRvciBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgU2V0cyB2YWx1ZSBvZiBzdHJpbmcgdG8gY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX01faWJlZ2luKCksIF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBhc3NpZ24uCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLnNpemUoKSk7IH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBwICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBuICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgQGEgbiBjb3BpZXMgb2YgY2hhcmFjdGVyIEBhIGMgc3RhcnRpbmcgYXQgdGhlIHBvc2l0aW9uCisgICAgICAgKiAgcmVmZXJlbmNlZCBieSBpdGVyYXRvciBAYSBwLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGgKKyAgICAgICAqICB0byBleGNlZWQgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAqICBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CXRoaXMtPnJlcGxhY2UoX19wLCBfX3AsIF9fbiwgX19jKTsgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBwICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBiZWcgIFN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBlbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBjaGFyYWN0ZXJzIGluIHJhbmdlIFtiZWcsZW5kKS4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcworICAgICAgICogIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUKKyAgICAgICAqICBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQpCisgICAgICAgIHsgdGhpcy0+cmVwbGFjZShfX3AsIF9fcCwgX19iZWcsIF9fZW5kKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcCA+PSBfTV9pYmVnaW4oKSAmJiBfX3AgPD0gX01faWVuZCgpKTsKKwl0aGlzLT5pbnNlcnQoX19wIC0gX01faWJlZ2luKCksIF9fbC5iZWdpbigpLCBfX2wuc2l6ZSgpKTsKKyAgICAgIH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCB2YWx1ZSBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcG9zMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gc3RyICBUaGUgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdmFsdWUgb2YgQGEgc3RyIHN0YXJ0aW5nIGF0IEBhIHBvczEuICBJZiBhZGRpbmcgY2hhcmFjdGVycworICAgICAgICogIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZCBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5pbnNlcnQoX19wb3MxLCBfX3N0ciwgc2l6ZV90eXBlKDApLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBwb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBzdHIgIFRoZSBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBwb3MyICBTdGFydCBvZiBjaGFyYWN0ZXJzIGluIHN0ciB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zMSA+IHNpemUoKSBvcgorICAgICAgICogIEBhIHBvczIgPiBAYSBzdHIuc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBhdCBAYSBwb3MxLCBpbnNlcnQgQGEgbiBjaGFyYWN0ZXIgb2YgQGEgc3RyIGJlZ2lubmluZyB3aXRoCisgICAgICAgKiAgQGEgcG9zMi4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZAorICAgICAgICogIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBwb3MxIGlzIGJleW9uZCB0aGUgZW5kIG9mCisgICAgICAgKiAgdGhpcyBzdHJpbmcgb3IgQGEgcG9zMiBpcyBiZXlvbmQgdGhlIGVuZCBvZiBAYSBzdHIsIG91dF9vZl9yYW5nZSBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmluc2VydChfX3BvczEsIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICsgX19zdHIuX01fY2hlY2soX19wb3MyLCAiYmFzaWNfc3RyaW5nOjppbnNlcnQiKSwKKwkJCSAgICBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gcyAgVGhlIEMgc3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdGhlIGZpcnN0IEBhIG4gY2hhcmFjdGVycyBvZiBAYSBzIHN0YXJ0aW5nIGF0IEBhIHBvcy4gIElmCisgICAgICAgKiAgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIHBvcyBpcyBiZXlvbmQgZW5kKCksIG91dF9vZl9yYW5nZSBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBzICBUaGUgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyB0aGUgZmlyc3QgQGEgbiBjaGFyYWN0ZXJzIG9mIEBhIHMgc3RhcnRpbmcgYXQgQGEgcG9zLiAgSWYKKyAgICAgICAqICBhZGRpbmcgY2hhcmFjdGVycyBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgcG9zIGlzIGJleW9uZCBlbmQoKSwgb3V0X29mX3JhbmdlIGlzCisgICAgICAgKiAgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5pbnNlcnQoX19wb3MsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBuICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgKiAgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIEBhIG4gY29waWVzIG9mIGNoYXJhY3RlciBAYSBjIHN0YXJ0aW5nIGF0IGluZGV4IEBhIHBvcy4gIElmCisgICAgICAgKiAgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIHBvcyA+IGxlbmd0aCgpLCBvdXRfb2ZfcmFuZ2UgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcworICAgICAgICogIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6Omluc2VydCIpLAorCQkJICAgICAgc2l6ZV90eXBlKDApLCBfX24sIF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgb25lIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgcG9zaXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJhY3RlciB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbmV3bHkgaW5zZXJ0ZWQgY2hhci4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBjaGFyYWN0ZXIgQGEgYyBhdCBwb3NpdGlvbiByZWZlcmVuY2VkIGJ5IEBhIHAuICBJZiBhZGRpbmcKKyAgICAgICAqICBjaGFyYWN0ZXIgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIElmIEBhIHAgaXMgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAgKiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfQ2hhclQgX19jKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX3AgPj0gX01faWJlZ2luKCkgJiYgX19wIDw9IF9NX2llbmQoKSk7CisJY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19wIC0gX01faWJlZ2luKCk7CisJX01fcmVwbGFjZV9hdXgoX19wb3MsIHNpemVfdHlwZSgwKSwgc2l6ZV90eXBlKDEpLCBfX2MpOworCV9NX3JlcCgpLT5fTV9zZXRfbGVha2VkKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2RhdGEoKSArIF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVtb3ZlIChkZWZhdWx0IDApLgorICAgICAgICogIEBwYXJhbSBuICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byByZW1vdmUgKGRlZmF1bHQgcmVtYWluZGVyKS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgQGEgbiBjaGFyYWN0ZXJzIGZyb20gdGhpcyBzdHJpbmcgc3RhcnRpbmcgYXQgQGEgcG9zLiAgVGhlCisgICAgICAgKiAgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgcmVkdWNlZCBieSBAYSBuLiAgSWYgdGhlcmUgYXJlIDwgQGEgbgorICAgICAgICogIGNoYXJhY3RlcnMgdG8gcmVtb3ZlLCB0aGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgaXMgdHJ1bmNhdGVkLiAgSWYKKyAgICAgICAqICBAYSBwIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mCisgICAgICAgKiAgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpCisgICAgICB7IAorCV9NX211dGF0ZShfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6ZXJhc2UiKSwKKwkJICBfTV9saW1pdChfX3BvcywgX19uKSwgc2l6ZV90eXBlKDApKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIHBvc2l0aW9uICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgY2hhcmFjdGVyIHRvIHJlbW92ZS4KKyAgICAgICAqICBAcmV0dXJuICBpdGVyYXRvciByZWZlcmVuY2luZyBzYW1lIGxvY2F0aW9uIGFmdGVyIHJlbW92YWwuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlciBhdCBAYSBwb3NpdGlvbiBmcm9tIHRoaXMgc3RyaW5nLiBUaGUgdmFsdWUKKyAgICAgICAqICBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wb3NpdGlvbiA+PSBfTV9pYmVnaW4oKQorCQkJCSAmJiBfX3Bvc2l0aW9uIDwgX01faWVuZCgpKTsKKwljb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX3Bvc2l0aW9uIC0gX01faWJlZ2luKCk7CisJX01fbXV0YXRlKF9fcG9zLCBzaXplX3R5cGUoMSksIHNpemVfdHlwZSgwKSk7CisJX01fcmVwKCktPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIGZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHJlbW92ZS4KKyAgICAgICAqICBAcGFyYW0gbGFzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gb2YgZmlyc3QgYWZ0ZXIgcmVtb3ZhbC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGZyb20gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpOworIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCB2YWx1ZSBmcm9tIGFub3RoZXIgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBuICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MrbikgZnJvbSB0aGlzIHN0cmluZy4KKyAgICAgICAqICBJbiBwbGFjZSwgdGhlIHZhbHVlIG9mIEBhIHN0ciBpcyBpbnNlcnRlZC4gIElmIEBhIHBvcyBpcyBiZXlvbmQgZW5kCisgICAgICAgKiAgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgSWYgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0CisgICAgICAgKiAgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcKKyAgICAgICAqICBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9fcG9zLCBfX24sIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIGZyb20gYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHBvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBuMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIHN0ciAgU3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gcG9zMiAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ciB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIG4yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHN0ciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvczEgPiBzaXplKCkgb3IgQGEgcG9zMiA+CisgICAgICAgKiAgc3RyLnNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3BvczEscG9zMSArIG4pIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgdmFsdWUgb2YgQGEgc3RyIGlzIGluc2VydGVkLiAgSWYgQGEgcG9zIGlzCisgICAgICAgKiAgYmV5b25kIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBJZiB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAgICogIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlCisgICAgICAgKiAgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvczEsIF9fbjEsIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgImJhc2ljX3N0cmluZzo6cmVwbGFjZSIpLAorCQkJICAgICBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbjIpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIG4xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gcyAgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBuMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBAYSBzIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zMSA+IHNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MgKyBuMSkgZnJvbSB0aGlzIHN0cmluZy4KKyAgICAgICAqICBJbiBwbGFjZSwgdGhlIGZpcnN0IEBhIG4yIGNoYXJhY3RlcnMgb2YgQGEgcyBhcmUgaW5zZXJ0ZWQsIG9yIGFsbAorICAgICAgICogIG9mIEBhIHMgaWYgQGEgbjIgaXMgdG9vIGxhcmdlLiAgSWYgQGEgcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmCisgICAgICAgKiAgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbjIpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIG4xICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gcyAgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zICsgbjEpIGZyb20gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgSW4gcGxhY2UsIHRoZSBjaGFyYWN0ZXJzIG9mIEBhIHMgYXJlIGluc2VydGVkLiAgSWYgQGEgcG9zIGlzIGJleW9uZAorICAgICAgICogIGVuZCBvZiBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdAorICAgICAgICogIGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nCisgICAgICAgKiAgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9fcG9zLCBfX24xLCBfX3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSBjaGFyYWN0ZXJzIHdpdGggbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBuMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBjICBDaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zICsgbjEpIGZyb20gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgSW4gcGxhY2UsIEBhIG4yIGNvcGllcyBvZiBAYSBjIGFyZSBpbnNlcnRlZC4gIElmIEBhIHBvcyBpcyBiZXlvbmQKKyAgICAgICAqICBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQKKyAgICAgICAqICBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZworICAgICAgICogIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OnJlcGxhY2UiKSwKKwkJCSAgICAgIF9NX2xpbWl0KF9fcG9zLCBfX24xKSwgX19uMiwgX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gaTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIGkyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLCB0aGUgdmFsdWUgb2YKKyAgICAgICAqICBAYSBzdHIgaXMgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmCisgICAgICAgKiAgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIGkxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBpMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIHMgIEMgc3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwgdGhlIGZpcnN0IEBhCisgICAgICAgKiAgbiBjaGFyYWN0ZXJzIG9mIEBhIHMgYXJlIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcworICAgICAgICogIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwgX19zLCBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBpMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gaTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBzICBDIHN0cmluZyB2YWx1ZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgcyBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEsIF9faTIsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBtdWx0aXBsZSBjaGFyYWN0ZXJzCisgICAgICAgKiAgQHBhcmFtIGkxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBpMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gYyAgQ2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwgQGEgbiBjb3BpZXMKKyAgICAgICAqICBvZiBAYSBjIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYKKyAgICAgICAqICBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJcmV0dXJuIF9NX3JlcGxhY2VfYXV4KF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsIF9fbiwgX19jKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIGkyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gazEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gazIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIGNoYXJhY3RlcnMKKyAgICAgICAqICBpbiB0aGUgcmFuZ2UgW2sxLGsyKSBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmcmCisgICAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJX0lucHV0SXRlcmF0b3IgX19rMSwgX0lucHV0SXRlcmF0b3IgX19rMikKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICAgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCSAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICByZXR1cm4gX01fcmVwbGFjZV9kaXNwYXRjaChfX2kxLCBfX2kyLCBfX2sxLCBfX2syLCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvLyBTcGVjaWFsaXphdGlvbnMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBwb2ludGVyIGFuZCBpdGVyYXRvcjoKKyAgICAgIC8vIHVzZWZ1bCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdGVtcG9yYXJ5IGJ1ZmZlcmluZyBpbiBfTV9yZXBsYWNlLgorICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfQ2hhclQqIF9fazEsIF9DaGFyVCogX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLCBfX2syIC0gX19rMSk7CisgICAgICB9CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkgICAgICBjb25zdCBfQ2hhclQqIF9fazEsIGNvbnN0IF9DaGFyVCogX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLCBfX2syIC0gX19rMSk7CisgICAgICB9CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgaXRlcmF0b3IgX19rMSwgaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorCisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgY29uc3RfaXRlcmF0b3IgX19rMSwgY29uc3RfaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorICAgICAgCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gaTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIGkyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIGNoYXJhY3RlcnMKKyAgICAgICAqICBpbiB0aGUgcmFuZ2UgW2sxLGsyKSBhcmUgaW5zZXJ0ZWQuICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLAorCQkJICAgIGluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEsIF9faTIsIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW50ZWdlcj4KKwliYXNpY19zdHJpbmcmCisJX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfSW50ZWdlciBfX24sCisJCQkgICAgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX24sIF9fdmFsKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKwliYXNpY19zdHJpbmcmCisJX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfSW5wdXRJdGVyYXRvciBfX2sxLAorCQkJICAgIF9JbnB1dEl0ZXJhdG9yIF9fazIsIF9fZmFsc2VfdHlwZSk7CisKKyAgICAgIGJhc2ljX3N0cmluZyYKKyAgICAgIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwKKwkJICAgICBfQ2hhclQgX19jKTsKKworICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgX01fcmVwbGFjZV9zYWZlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkJICAgICAgc2l6ZV90eXBlIF9fbjIpOworCisgICAgICAvLyBfU19jb25zdHJ1Y3RfYXV4IGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSAyMS4zLjEgcGFyYSAxNSB3aGljaAorICAgICAgLy8gcmVxdWlyZXMgc3BlY2lhbCBiZWhhdmlvdXIgaWYgX0luSXRlciBpcyBhbiBpbnRlZ3JhbCB0eXBlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgICAgX1NfY29uc3RydWN0X2F1eChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsCisJCQkgY29uc3QgX0FsbG9jJiBfX2EsIF9fZmFsc2VfdHlwZSkKKwl7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0luSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOworICAgICAgICAgIHJldHVybiBfU19jb25zdHJ1Y3QoX19iZWcsIF9fZW5kLCBfX2EsIF9UYWcoKSk7CisJfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW50ZWdlcj4KKyAgICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgICAgX1NfY29uc3RydWN0X2F1eChfSW50ZWdlciBfX2JlZywgX0ludGVnZXIgX19lbmQsCisJCQkgY29uc3QgX0FsbG9jJiBfX2EsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBfU19jb25zdHJ1Y3RfYXV4XzIoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2JlZyksCisJCQkJICAgIF9fZW5kLCBfX2EpOyB9CisKKyAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICBfU19jb25zdHJ1Y3RfYXV4XzIoc2l6ZV90eXBlIF9fcmVxLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgIHsgcmV0dXJuIF9TX2NvbnN0cnVjdChfX3JlcSwgX19jLCBfX2EpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgICBfU19jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSkKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9Jbkl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIHJldHVybiBfU19jb25zdHJ1Y3RfYXV4KF9fYmVnLCBfX2VuZCwgX19hLCBfSW50ZWdyYWwoKSk7CisgICAgICAgIH0KKworICAgICAgLy8gRm9yIElucHV0IEl0ZXJhdG9ycywgdXNlZCBpbiBpc3RyZWFtYnVmX2l0ZXJhdG9ycywgZXRjLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0luSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICAgICBfU19jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gRm9yIGZvcndhcmRfaXRlcmF0b3JzIHVwIHRvIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JzLCB1c2VkIGZvcgorICAgICAgLy8gc3RyaW5nOjppdGVyYXRvciwgX0NoYXJUKiwgZXRjLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0Z3ZEl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgX0NoYXJUKgorICAgICAgICBfU19jb25zdHJ1Y3QoX0Z3ZEl0ZXJhdG9yIF9fYmVnLCBfRndkSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgIF9TX2NvbnN0cnVjdChzaXplX3R5cGUgX19yZXEsIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgIHB1YmxpYzoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5IHN1YnN0cmluZyBpbnRvIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzICBDIHN0cmluZyB0byBjb3B5IHZhbHVlIGludG8uCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGNvcHkuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgY29waWVkCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgcG9zID4gc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBDb3BpZXMgdXAgdG8gQGEgbiBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIHBvcyBpbnRvIHRoZSBDIHN0cmluZyBAYQorICAgICAgICogIHMuICBJZiBAYSBwb3MgaXMgJWdyZWF0ZXIgdGhhbiBzaXplKCksIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwIGNvbnRlbnRzIHdpdGggYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIFN0cmluZyB0byBzd2FwIHdpdGguCisgICAgICAgKgorICAgICAgICogIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJpbmcgd2l0aCB0aGF0IG9mIEBhIHMgaW4gY29uc3RhbnQKKyAgICAgICAqICB0aW1lLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoYmFzaWNfc3RyaW5nJiBfX3MpOworCisgICAgICAvLyBTdHJpbmcgb3BlcmF0aW9uczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGNvbnN0IHBvaW50ZXIgdG8gbnVsbC10ZXJtaW5hdGVkIGNvbnRlbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgaGFuZGxlIHRvIGludGVybmFsIGRhdGEuICBEbyBub3QgbW9kaWZ5IG9yIGRpcmUgdGhpbmdzIG1heQorICAgICAgICogIGhhcHBlbi4KKyAgICAgICovCisgICAgICBjb25zdCBfQ2hhclQqCisgICAgICBjX3N0cigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29uc3QgcG9pbnRlciB0byBjb250ZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGhhbmRsZSB0byBpbnRlcm5hbCBkYXRhLiAgRG8gbm90IG1vZGlmeSBvciBkaXJlIHRoaW5ncyBtYXkKKyAgICAgICAqICBoYXBwZW4uCisgICAgICAqLworICAgICAgY29uc3QgX0NoYXJUKgorICAgICAgZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29weSBvZiBhbGxvY2F0b3IgdXNlZCB0byBjb25zdHJ1Y3QgdGhpcyBzdHJpbmcuCisgICAgICAqLworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXM7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gQGEgcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB0aGUgZmlyc3QgQGEgbiBjaGFyYWN0ZXJzCisgICAgICAgKiAgaW4gQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQKKyAgICAgICAqICBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdmFsdWUgb2YgQGEgc3RyIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdAorICAgICAgICogIGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5maW5kKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBwb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSB2YWx1ZSBvZiBAYSBzIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdAorICAgICAgICogIGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZChfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIGMgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBAYSBjIHdpdGhpbiB0aGlzIHN0cmluZy4KKyAgICAgICAqICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLAorICAgICAgICogIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzdHIgIFN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdmFsdWUgb2YgQGEgc3RyIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdAorICAgICAgICogIGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+cmZpbmQoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20uCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBzZWFyY2ggZm9yLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBwb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciB0aGUgZmlyc3QgQGEgbgorICAgICAgICogIGNoYXJhY3RlcnMgaW4gQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXgKKyAgICAgICAqICB3aGVyZSBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHN0YXJ0IHNlYXJjaCBhdCAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIHN0YXJ0IG9mICBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdGhlIHZhbHVlIG9mIEBhIHMgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgYmVnaW5zLiAgSWYgbm90CisgICAgICAgKiAgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+cmZpbmQoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIGMgIENoYXJhY3RlciB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgQGEgYyB3aXRoaW4gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBwb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBvZgorICAgICAgICogIEBhIHN0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbS4KKyAgICAgICAqICBAcGFyYW0gbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBwb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUgZmlyc3QgQGEgbgorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXgKKyAgICAgICAqICB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcyAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgb2YKKyAgICAgICAqICBAYSBzIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBjICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdGhlIGNoYXJhY3RlciBAYSBjIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmCisgICAgICAgKiAgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IGVxdWl2YWxlbnQgdG8gZmluZChjLCBwb3MpLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHN0ciAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZSBjaGFyYWN0ZXJzIG9mCisgICAgICAgKiAgQGEgc3RyIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMKKyAgICAgICAqICBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2xhc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIG9uZSBvZiB0aGUgZmlyc3QgQGEgbgorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXgKKyAgICAgICAqICB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZSBjaGFyYWN0ZXJzIG9mCisgICAgICAgKiAgQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9vZihfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gYyAgQ2hhcmFjdGVyIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBwb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBAYSBjIHdpdGhpbiB0aGlzIHN0cmluZy4KKyAgICAgICAqICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLAorICAgICAgICogIHJldHVybnMgbnBvcy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogZXF1aXZhbGVudCB0byByZmluZChjLCBwb3MpLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5yZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90IGNvbnRhaW5lZAorICAgICAgICogIGluIEBhIHN0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQKKyAgICAgICAqICB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2ZpcnN0X25vdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBjb25zaWRlci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90IGNvbnRhaW5lZAorICAgICAgICogIGluIHRoZSBmaXJzdCBAYSBuIGNoYXJhY3RlcnMgb2YgQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisJCQlzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90IGNvbnRhaW5lZAorICAgICAgICogIGluIEBhIHMgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0CisgICAgICAgKiAgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGRpZmZlcmVudCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIGMgIENoYXJhY3RlciB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBwb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG90aGVyIHRoYW4gQGEgYworICAgICAgICogIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuCisgICAgICAgKiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiBAYSBzdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4CisgICAgICAgKiAgd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2xhc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20uCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBjb25zaWRlci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIgbm90CisgICAgICAgKiAgY29udGFpbmVkIGluIHRoZSBmaXJzdCBAYSBuIGNoYXJhY3RlcnMgb2YgQGEgcyB3aXRoaW4gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsCisJCSAgICAgICBzaXplX3R5cGUgX19uKSBjb25zdDsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBwb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIHBvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiBAYSBzIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleAorICAgICAgICogIHdoZXJlIGl0IHdhcyBmb3VuZC4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBjICBDaGFyYWN0ZXIgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIgb3RoZXIgdGhhbgorICAgICAgICogIEBhIGMgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHBhcmFtIG4gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZyAoZGVmYXVsdCByZW1haW5kZXIpLgorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXcgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIHBvcyA+IHNpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIHVzaW5nIHRoZSBAYSBuIGNoYXJhY3RlcnMgc3RhcnRpbmcKKyAgICAgICAqICBhdCBAYSBwb3MuICBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCwgdXNlIHRoZSByZW1haW5kZXIgb2YgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycy4gIElmIEBhIHBvcyBpcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBvdXRfb2ZfcmFuZ2UKKyAgICAgICAqICBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgYmFzaWNfc3RyaW5nCisgICAgICBzdWJzdHIoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IG5wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNpY19zdHJpbmcoKnRoaXMsCisJCQkgICAgX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OnN1YnN0ciIpLCBfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0byBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gc3RyICBTdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhpcyBzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEgc3RyLCAwIGlmCisgICAgICAgKiAgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcyBzdHJpbmcgaXMgb3JkZXJlZCBhZnRlcgorICAgICAgICogIEBhIHN0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0bworICAgICAgICogIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHNpemUoKSBhbmQgc3RyLnNpemUoKS4gIFRoZSBmdW5jdGlvbgorICAgICAgICogIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmdzIGJ5IGNhbGxpbmcgdHJhaXRzOjpjb21wYXJlKGRhdGEoKSwKKyAgICAgICAqICBzdHIuZGF0YSgpLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMKKyAgICAgICAqICBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKSBjb25zdAorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisJY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSBfX3N0ci5zaXplKCk7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19zaXplLCBfX29zaXplKTsKKworCWludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCksIF9fc3RyLmRhdGEoKSwgX19sZW4pOworCWlmICghX19yKQorCSAgX19yID0gX1NfY29tcGFyZShfX3NpemUsIF9fb3NpemUpOworCXJldHVybiBfX3I7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHBvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzdHIgIFN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIG4gY2hhcmFjdGVycyBzdGFydGluZworICAgICAgICogIGF0IEBhIHBvcy4gIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhlIHN1YnN0cmluZyBpcyBvcmRlcmVkCisgICAgICAgKiAgYmVmb3JlIEBhIHN0ciwgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGUKKyAgICAgICAqICBzdWJzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciBAYSBzdHIuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoCisgICAgICAgKiAgcmxlbiBvZiB0aGUgc3RyaW5ncyB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZQorICAgICAgICogIHN1YnN0cmluZyBhbmQgQGEgc3RyLnNpemUoKS4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28KKyAgICAgICAqICBzdHJpbmdzIGJ5IGNhbGxpbmcgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksc3RyLmRhdGEoKSxybGVuKS4KKyAgICAgICAqICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZQorICAgICAgICogIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHBvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIG4xICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHN0ciAgU3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gcG9zMiAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZyBvZiBzdHIuCisgICAgICAgKiAgQHBhcmFtIG4yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcgb2Ygc3RyLgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBuMSBjaGFyYWN0ZXJzIHN0YXJ0aW5nCisgICAgICAgKiAgYXQgQGEgcG9zMS4gIEZvcm0gdGhlIHN1YnN0cmluZyBvZiBAYSBzdHIgZnJvbSB0aGUgQGEgbjIgY2hhcmFjdGVycworICAgICAgICogIHN0YXJ0aW5nIGF0IEBhIHBvczIuICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3Vic3RyaW5nIGlzCisgICAgICAgKiAgb3JkZXJlZCBiZWZvcmUgdGhlIHN1YnN0cmluZyBvZiBAYSBzdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZQorICAgICAgICogIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIHRoZSBzdWJzdHJpbmcKKyAgICAgICAqICBvZiBAYSBzdHIuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MKKyAgICAgICAqICB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RocyBvZiB0aGUgc3Vic3RyaW5ncy4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmdzIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoc3Vic3RyaW5nLmRhdGEoKSxzdHIuc3Vic3RyKHBvczIsbjIpLmRhdGEoKSxybGVuKS4KKyAgICAgICAqICBJZiB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZQorICAgICAgICogIHNob3J0ZXIgb25lIGlzIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHRvIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIEMgc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhIHMsIDAgaWYKKyAgICAgICAqICB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzIHN0cmluZyBpcyBvcmRlcmVkIGFmdGVyCisgICAgICAgKiAgQGEgcy4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncyB0bworICAgICAgICogIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHNpemUoKSBhbmQgdGhlIGxlbmd0aCBvZiBhIHN0cmluZworICAgICAgICogIGNvbnN0cnVjdGVkIGZyb20gQGEgcy4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28gc3RyaW5ncworICAgICAgICogIGJ5IGNhbGxpbmcgdHJhaXRzOjpjb21wYXJlKGRhdGEoKSxzLHJsZW4pLiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgICAqICBjb21wYXJpc29uIGlzIG5vbnplcm8gcmV0dXJucyBpdCwgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcworICAgICAgICogIG9yZGVyZWQgZmlyc3QuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdDsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNSBTdHJpbmc6OmNvbXBhcmUgc3BlY2lmaWNhdGlvbiBxdWVzdGlvbmFibGUKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgdG8gYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBuMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBzICBDIHN0cmluZyB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIG4xIGNoYXJhY3RlcnMgc3RhcnRpbmcKKyAgICAgICAqICBhdCBAYSBwb3MuICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoZSBzdWJzdHJpbmcgaXMgb3JkZXJlZAorICAgICAgICogIGJlZm9yZSBAYSBzLCAwIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoZQorICAgICAgICogIHN1YnN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIEBhIHMuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoCisgICAgICAgKiAgcmxlbiBvZiB0aGUgc3RyaW5ncyB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSAKKyAgICAgICAqICBzdWJzdHJpbmcgYW5kIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgY29uc3RydWN0ZWQgZnJvbSBAYSBzLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCkscyxybGVuKS4gIElmIHRoZSByZXN1bHQgb2YgdGhlCisgICAgICAgKiAgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZSB0aGUgc2hvcnRlciBvbmUgaXMKKyAgICAgICAqICBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSBzdWJzdHJpbmcgYWdhaW5zdCBhIGNoYXJhY3RlciAlYXJyYXkuCisgICAgICAgKiAgQHBhcmFtIHBvczEgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIG4xICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIHMgIGNoYXJhY3RlciAlYXJyYXkgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBuMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgb2Ygcy4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgbjEgY2hhcmFjdGVycyBzdGFydGluZworICAgICAgICogIGF0IEBhIHBvczEuICBGb3JtIGEgc3RyaW5nIGZyb20gdGhlIGZpcnN0IEBhIG4yIGNoYXJhY3RlcnMgb2YgQGEgcy4KKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIHRoZSBzdHJpbmcKKyAgICAgICAqICBmcm9tIEBhIHMsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcyBzdWJzdHJpbmcKKyAgICAgICAqICBpcyBvcmRlcmVkIGFmdGVyIHRoZSBzdHJpbmcgZnJvbSBAYSBzLiAgIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZQorICAgICAgICogIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGgKKyAgICAgICAqICBvZiB0aGUgc3Vic3RyaW5nIGFuZCBAYSBuMi4gIFRoZSBmdW5jdGlvbiB0aGVuIGNvbXBhcmVzIHRoZSB0d28KKyAgICAgICAqICBzdHJpbmdzIGJ5IGNhbGxpbmcgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCkscyxybGVuKS4gIElmIHRoZQorICAgICAgICogIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZSB0aGUgc2hvcnRlcgorICAgICAgICogIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgICoKKyAgICAgICAqICBOQjogcyBtdXN0IGhhdmUgYXQgbGVhc3QgbjIgY2hhcmFjdGVycywgJmFwb3M7XFwwJmFwb3M7IGhhcworICAgICAgICogIG5vIHNwZWNpYWwgbWVhbmluZy4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0OworICB9OworCisgIC8vIG9wZXJhdG9yKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCB2YWx1ZSBvZiBAYSBsaHMgZm9sbG93ZWQgYnkgQGEgcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7CisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBDIHN0cmluZyBhbmQgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggdmFsdWUgb2YgQGEgbGhzIGZvbGxvd2VkIGJ5IEBhIHJocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4mIF9fcmhzKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgY2hhcmFjdGVyIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gcmhzICBMYXN0IHN0cmluZy4KKyAgICogIEByZXR1cm4gIE5ldyBzdHJpbmcgd2l0aCBAYSBsaHMgZm9sbG93ZWQgYnkgQGEgcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvYz4KKyAgICBvcGVyYXRvcisoX0NoYXJUIF9fbGhzLCBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jPiYgX19yaHMpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggQGEgbGhzIGZvbGxvd2VkIGJ5IEBhIHJocy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fc3RyKF9fbGhzKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBzdHJpbmcgYW5kIGNoYXJhY3Rlci4KKyAgICogIEBwYXJhbSBsaHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIEBhIGxocyBmb2xsb3dlZCBieSBAYSByaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywgX0NoYXJUIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPglfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cihfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19zaXplX3R5cGUoMSksIF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mJiBfX2xocywKKwkgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19yaHMpCisgICAgeworICAgICAgY29uc3QgYXV0byBfX3NpemUgPSBfX2xocy5zaXplKCkgKyBfX3Jocy5zaXplKCk7CisgICAgICBjb25zdCBib29sIF9fY29uZCA9IChfX3NpemUgPiBfX2xocy5jYXBhY2l0eSgpCisJCQkgICAmJiBfX3NpemUgPD0gX19yaHMuY2FwYWNpdHkoKSk7CisgICAgICByZXR1cm4gX19jb25kID8gc3RkOjptb3ZlKF9fcmhzLmluc2VydCgwLCBfX2xocykpCisJICAgICAgICAgICAgOiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywKKwkgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fcmhzLmluc2VydCgwLCAxLCBfX2xocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYmIF9fbGhzLAorCSAgICAgIF9DaGFyVCBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKDEsIF9fcmhzKSk7IH0KKyNlbmRpZgorCisgIC8vIG9wZXJhdG9yID09CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIGxocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgbGhzLmNvbXBhcmUoQGEgcmhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIGJvb2w+OjpfX3R5cGUKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQ+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIChfX2xocy5zaXplKCkgPT0gX19yaHMuc2l6ZSgpCisJICAgICAgJiYgIXN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPjo6Y29tcGFyZShfX2xocy5kYXRhKCksIF9fcmhzLmRhdGEoKSwKKwkJCQkJCSAgICBfX2xocy5zaXplKCkpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgcmhzLmNvbXBhcmUoQGEgbGhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID09IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBlcXVpdmFsZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocy5jb21wYXJlKEBhIHJocykgPT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgLy8gb3BlcmF0b3IgIT0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBsaHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocy5jb21wYXJlKEBhIHJocykgIT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgcmhzLmNvbXBhcmUoQGEgbGhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocy5jb21wYXJlKEBhIHJocykgIT0gMC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8vIG9wZXJhdG9yIDwKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIHByZWNlZGVzIHN0cmluZy4KKyAgICogIEBwYXJhbSBsaHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgcHJlY2VkZXMgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgcHJlY2VkZXMgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID4gMDsgfQorCisgIC8vIG9wZXJhdG9yID4KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3Mgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgbGhzIGZvbGxvd3MgQGEgcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3MgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgbGhzIGZvbGxvd3MgQGEgcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBmb2xsb3dzIHN0cmluZy4KKyAgICogIEBwYXJhbSBsaHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBsaHMgZm9sbG93cyBAYSByaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpIDwgMDsgfQorCisgIC8vIG9wZXJhdG9yIDw9CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IGZvbGxvdyBzdHJpbmcuCisgICAqICBAcGFyYW0gbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBsaHMgZG9lc24ndCBmb2xsb3cgQGEgcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIGxocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocyBkb2Vzbid0IGZvbGxvdyBAYSByaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIEMgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IHN0cmluZy4KKyAgICogIEBwYXJhbSBsaHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBsaHMgZG9lc24ndCBmb2xsb3cgQGEgcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID49IDA7IH0KKworICAvLyBvcGVyYXRvciA+PQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBsaHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIGxocyBkb2Vzbid0IHByZWNlZGUgQGEgcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgcHJlY2VkZSBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBsaHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSByaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBsaHMgZG9lc24ndCBwcmVjZWRlIEBhIHJocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBsaHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBsaHMgZG9lc24ndCBwcmVjZWRlIEBhIHJocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPD0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBTd2FwIGNvbnRlbnRzIG9mIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIGxocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIHJocyAgU2Vjb25kIHN0cmluZy4KKyAgICoKKyAgICogIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgQGEgbGhzIGFuZCBAYSByaHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX2xocywKKwkgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIGlzICBJbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gc3RyICBCdWZmZXIgdG8gc3RvcmUgaW50by4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgU3RvcmVzIGNoYXJhY3RlcnMgZnJvbSBAYSBpcyBpbnRvIEBhIHN0ciB1bnRpbCB3aGl0ZXNwYWNlIGlzIGZvdW5kLCB0aGUKKyAgICogIGVuZCBvZiB0aGUgc3RyZWFtIGlzIGVuY291bnRlcmVkLCBvciBzdHIubWF4X3NpemUoKSBpcyByZWFjaGVkLiAgSWYKKyAgICogIGlzLndpZHRoKCkgaXMgbm9uLXplcm8sIHRoYXQgaXMgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgKiAgc3RvcmVkIGludG8gQGEgc3RyLiAgQW55IHByZXZpb3VzIGNvbnRlbnRzIG9mIEBhIHN0ciBhcmUgZXJhc2VkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0cik7CisKKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXI+JiBfX2lzLCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fc3RyKTsKKworICAvKioKKyAgICogIEBicmllZiAgV3JpdGUgc3RyaW5nIHRvIGEgc3RyZWFtLgorICAgKiAgQHBhcmFtIG9zICBPdXRwdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIHN0ciAgU3RyaW5nIHRvIHdyaXRlIG91dC4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogIE91dHB1dCBjaGFyYWN0ZXJzIG9mIEBhIHN0ciBpbnRvIG9zIGZvbGxvd2luZyB0aGUgc2FtZSBydWxlcyBhcyBmb3IKKyAgICogIHdyaXRpbmcgYSBDIHN0cmluZy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDU4Ni4gc3RyaW5nIGluc2VydGVyIG5vdCBhIGZvcm1hdHRlZCBmdW5jdGlvbgorICAgICAgcmV0dXJuIF9fb3N0cmVhbV9pbnNlcnQoX19vcywgX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmVhZCBhIGxpbmUgZnJvbSBzdHJlYW0gaW50byBhIHN0cmluZy4KKyAgICogIEBwYXJhbSBpcyAgSW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtIHN0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcGFyYW0gZGVsaW0gIENoYXJhY3RlciBtYXJraW5nIGVuZCBvZiBsaW5lLgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICBTdG9yZXMgY2hhcmFjdGVycyBmcm9tIEBhIGlzIGludG8gQGEgc3RyIHVudGlsIEBhIGRlbGltIGlzIGZvdW5kLCB0aGUKKyAgICogIGVuZCBvZiB0aGUgc3RyZWFtIGlzIGVuY291bnRlcmVkLCBvciBzdHIubWF4X3NpemUoKSBpcyByZWFjaGVkLiAgSWYKKyAgICogIGlzLndpZHRoKCkgaXMgbm9uLXplcm8sIHRoYXQgaXMgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycworICAgKiAgc3RvcmVkIGludG8gQGEgc3RyLiAgQW55IHByZXZpb3VzIGNvbnRlbnRzIG9mIEBhIHN0ciBhcmUgZXJhc2VkLiAgSWYgQGEKKyAgICogIGRlbGltIHdhcyBlbmNvdW50ZXJlZCwgaXQgaXMgZXh0cmFjdGVkIGJ1dCBub3Qgc3RvcmVkIGludG8gQGEgc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0ciwgX0NoYXJUIF9fZGVsaW0pOworCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIGEgbGluZSBmcm9tIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIGlzICBJbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gc3RyICBCdWZmZXIgdG8gc3RvcmUgaW50by4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgU3RvcmVzIGNoYXJhY3RlcnMgZnJvbSBpcyBpbnRvIEBhIHN0ciB1bnRpbCAmYXBvcztcbiZhcG9zOyBpcworICAgKiAgZm91bmQsIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBlbmNvdW50ZXJlZCwgb3Igc3RyLm1heF9zaXplKCkKKyAgICogIGlzIHJlYWNoZWQuICBJZiBpcy53aWR0aCgpIGlzIG5vbi16ZXJvLCB0aGF0IGlzIHRoZSBsaW1pdCBvbiB0aGUKKyAgICogIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN0b3JlZCBpbnRvIEBhIHN0ci4gIEFueSBwcmV2aW91cyBjb250ZW50cworICAgKiAgb2YgQGEgc3RyIGFyZSBlcmFzZWQuICBJZiBlbmQgb2YgbGluZSB3YXMgZW5jb3VudGVyZWQsIGl0IGlzCisgICAqICBleHRyYWN0ZWQgYnV0IG5vdCBzdG9yZWQgaW50byBAYSBzdHIuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0cikKKyAgICB7IHJldHVybiBnZXRsaW5lKF9faXMsIF9fc3RyLCBfX2lzLndpZGVuKCdcbicpKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxjaGFyPiYgX19pbiwgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3N0ciwKKwkgICAgY2hhciBfX2RlbGltKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYgX19pbiwgYmFzaWNfc3RyaW5nPHdjaGFyX3Q+JiBfX3N0ciwKKwkgICAgd2NoYXJfdCBfX2RlbGltKTsKKyNlbmRpZiAgCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIChkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTkpIFwKKyAgICAgJiYgIWRlZmluZWQoX0dMSUJDWFhfSEFWRV9CUk9LRU5fVlNXUFJJTlRGKSkKKworI2luY2x1ZGUgPGV4dC9zdHJpbmdfY29udmVyc2lvbnMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIDIxLjQgTnVtZXJpYyBDb252ZXJzaW9ucyBbc3RyaW5nLmNvbnZlcnNpb25zXS4KKyAgaW5saW5lIGludAorICBzdG9pKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hPGxvbmcsIGludD4oJnN0ZDo6c3RydG9sLCAic3RvaSIsIF9fc3RyLmNfc3RyKCksCisJCQkJCV9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcKKyAgc3RvbChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2wsICJzdG9sIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBzdG91bChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b3VsLCAic3RvdWwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgc3RvbGwoY29uc3Qgc3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9sbCwgInN0b2xsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCisgIHN0b3VsbChjb25zdCBzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b3VsbCwgInN0b3VsbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgLy8gTkI6IHN0cnRvZiB2cyBzdHJ0b2QuCisgIGlubGluZSBmbG9hdAorICBzdG9mKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2YsICJzdG9mIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBzdG9kKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2QsICJzdG9kIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHN0b2xkKGNvbnN0IHN0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2xkLCAic3RvbGQiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICAvLyBOQjogKHYpc25wcmludGYgdnMgc3ByaW50Zi4KKworICAvLyBEUiAxMjYxLgorICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyhpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCA0ICogc2l6ZW9mKGludCksCisJCQkJCSAgICIlZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKHVuc2lnbmVkIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgNCAqIHNpemVvZih1bnNpZ25lZCksCisJCQkJCSAgICIldSIsIF9fdmFsKTsgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCA0ICogc2l6ZW9mKGxvbmcpLAorCQkJCQkgICAiJWxkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCSAgICIlbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyhsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICA0ICogc2l6ZW9mKGxvbmcgbG9uZyksCisJCQkJCSAgICIlbGxkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIHN0cmluZworICB0b19zdHJpbmcodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpLAorCQkJCQkgICAiJWxsdSIsIF9fdmFsKTsgfQorCisgIGlubGluZSBzdHJpbmcKKyAgdG9fc3RyaW5nKGZsb2F0IF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IAorICAgICAgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGZsb2F0Pjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyhkb3VibGUgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0gCisgICAgICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgc3RyaW5nCisgIHRvX3N0cmluZyhsb25nIGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSAKKyAgICAgIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxsb25nIGRvdWJsZT46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8c3RyaW5nPigmc3RkOjp2c25wcmludGYsIF9fbiwKKwkJCQkJICAgIiVMZiIsIF9fdmFsKTsKKyAgfQorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgaW5saW5lIGludCAKKyAgc3RvaShjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2E8bG9uZywgaW50Pigmc3RkOjp3Y3N0b2wsICJzdG9pIiwgX19zdHIuY19zdHIoKSwKKwkJCQkJX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZyAKKyAgc3RvbChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sLCAic3RvbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcKKyAgc3RvdWwoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvdWwsICJzdG91bCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBzdG9sbChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sbCwgInN0b2xsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCisgIHN0b3VsbChjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG91bGwsICJzdG91bGwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIC8vIE5COiB3Y3N0b2YgdnMgd2NzdG9kLgorICBpbmxpbmUgZmxvYXQKKyAgc3RvZihjb25zdCB3c3RyaW5nJiBfX3N0ciwgc2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6Ondjc3RvZiwgInN0b2YiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworICBpbmxpbmUgZG91YmxlCisgIHN0b2QoY29uc3Qgd3N0cmluZyYgX19zdHIsIHNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2QsICJzdG9kIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHN0b2xkKGNvbnN0IHdzdHJpbmcmIF9fc3RyLCBzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sZCwgInN0b2xkIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgLy8gRFIgMTI2MS4KKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyhpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgNCAqIHNpemVvZihpbnQpLAorCQkJCQkgICAgTCIlZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgIDQgKiBzaXplb2YodW5zaWduZWQpLAorCQkJCQkgICAgTCIldSIsIF9fdmFsKTsgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcobG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLCA0ICogc2l6ZW9mKGxvbmcpLAorCQkJCQkgICAgTCIlbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPHdzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCSAgICBMIiVsdSIsIF9fdmFsKTsgfQorCisgIGlubGluZSB3c3RyaW5nCisgIHRvX3dzdHJpbmcobG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICA0ICogc2l6ZW9mKGxvbmcgbG9uZyksCisJCQkJCSAgICBMIiVsbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpLAorCQkJCQkgICAgTCIlbGx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyhmbG9hdCBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPQorICAgICAgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGZsb2F0Pjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgIEwiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgd3N0cmluZworICB0b193c3RyaW5nKGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPQorICAgICAgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGRvdWJsZT46Ol9fbWF4X2V4cG9uZW50MTAgKyAyMDsKKyAgICByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8d3N0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLCBfX24sCisJCQkJCSAgICBMIiVmIiwgX192YWwpOworICB9CisKKyAgaW5saW5lIHdzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIGRvdWJsZSBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPQorICAgICAgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGxvbmcgZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzx3c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgIEwiJUxmIiwgX192YWwpOworICB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gJiYgX0dMSUJDWFhfVVNFX0M5OSAuLi4gKi8KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRFIgMTE4Mi4KKworI2lmbmRlZiBfR0xJQkNYWF9DT01QQVRJQklMSVRZX0NYWDBYCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwgX19zLmxlbmd0aCgpKTsgfQorICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB3c3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8d3N0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHdzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHdzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5sZW5ndGgoKSAqIHNpemVvZih3Y2hhcl90KSk7IH0KKyAgICB9OworI2VuZGlmCisjZW5kaWYgLyogX0dMSUJDWFhfQ09NUEFUSUJJTElUWV9DWFgwWCAqLworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHUxNnN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHUxNnN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIHUxNnN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdTE2c3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3MubGVuZ3RoKCkgKiBzaXplb2YoY2hhcjE2X3QpKTsgfQorICAgIH07CisKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdTMyc3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8dTMyc3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgdTMyc3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCB1MzJzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5sZW5ndGgoKSAqIHNpemVvZihjaGFyMzJfdCkpOyB9CisgICAgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXyAqLworCisjZW5kaWYgLyogX0JBU0lDX1NUUklOR19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYmFzaWNfc3RyaW5nLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9iYXNpY19zdHJpbmcudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODgzMzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYmFzaWNfc3RyaW5nLnRjYwpAQCAtMCwwICsxLDExNjggQEAKKy8vIENvbXBvbmVudHMgZm9yIG1hbmlwdWxhdGluZyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9iYXNpY19zdHJpbmcudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSAgU3RyaW5ncyBsaWJyYXJ5CisvLworCisvLyBXcml0dGVuIGJ5IEphc29uIE1lcnJpbGwgYmFzZWQgdXBvbiB0aGUgc3BlY2lmaWNhdGlvbiBieSBUYWthbm9yaSBBZGFjaGkKKy8vIGluIEFOU0kgWDNKMTYvOTQtMDAxM1IyLiAgUmV3cml0dGVuIGJ5IE5hdGhhbiBNeWVycyB0byBJU08tMTQ4ODIuCisKKyNpZm5kZWYgX0JBU0lDX1NUUklOR19UQ0MKKyNkZWZpbmUgX0JBU0lDX1NUUklOR19UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNvbnN0IHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9SZXA6Ol9TX21heF9zaXplID0gKCgobnBvcyAtIHNpemVvZihfUmVwX2Jhc2UpKS9zaXplb2YoX0NoYXJUKSkgLSAxKSAvIDQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY29uc3QgX0NoYXJUCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX1JlcDo6X1NfdGVybWluYWwgPSBfQ2hhclQoKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjb25zdCB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zOworCisgIC8vIExpbmtlciBzZXRzIF9TX2VtcHR5X3JlcF9zdG9yYWdlIHRvIGFsbCAwcyAob25lIHJlZmVyZW5jZSwgZW1wdHkgc3RyaW5nKQorICAvLyBhdCBzdGF0aWMgaW5pdCB0aW1lIChiZWZvcmUgc3RhdGljIGN0b3JzIGFyZSBydW4pLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjpfU19lbXB0eV9yZXBfc3RvcmFnZVsKKyAgICAoc2l6ZW9mKF9SZXBfYmFzZSkgKyBzaXplb2YoX0NoYXJUKSArIHNpemVvZihzaXplX3R5cGUpIC0gMSkgLworICAgICAgc2l6ZW9mKHNpemVfdHlwZSldOworCisgIC8vIE5COiBUaGlzIGlzIHRoZSBzcGVjaWFsIGNhc2UgZm9yIElucHV0IEl0ZXJhdG9ycywgdXNlZCBpbgorICAvLyBpc3RyZWFtYnVmX2l0ZXJhdG9ycywgZXRjLgorICAvLyBJbnB1dCBJdGVyYXRvcnMgaGF2ZSBhIGNvc3Qgc3RydWN0dXJlIHZlcnkgZGlmZmVyZW50IGZyb20KKyAgLy8gcG9pbnRlcnMsIGNhbGxpbmcgZm9yIGEgZGlmZmVyZW50IGNvZGluZyBzdHlsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICBfQ2hhclQqCisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisjaWZuZGVmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HCisJaWYgKF9fYmVnID09IF9fZW5kICYmIF9fYSA9PSBfQWxsb2MoKSkKKwkgIHJldHVybiBfU19lbXB0eV9yZXAoKS5fTV9yZWZkYXRhKCk7CisjZW5kaWYKKwkvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCV9DaGFyVCBfX2J1ZlsxMjhdOworCXNpemVfdHlwZSBfX2xlbiA9IDA7CisJd2hpbGUgKF9fYmVnICE9IF9fZW5kICYmIF9fbGVuIDwgc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCSAgeworCSAgICBfX2J1ZltfX2xlbisrXSA9ICpfX2JlZzsKKwkgICAgKytfX2JlZzsKKwkgIH0KKwlfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19sZW4sIHNpemVfdHlwZSgwKSwgX19hKTsKKwlfTV9jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfX2J1ZiwgX19sZW4pOworCV9fdHJ5CisJICB7CisJICAgIHdoaWxlIChfX2JlZyAhPSBfX2VuZCkKKwkgICAgICB7CisJCWlmIChfX2xlbiA9PSBfX3ItPl9NX2NhcGFjaXR5KQorCQkgIHsKKwkJICAgIC8vIEFsbG9jYXRlIG1vcmUgc3BhY2UuCisJCSAgICBfUmVwKiBfX2Fub3RoZXIgPSBfUmVwOjpfU19jcmVhdGUoX19sZW4gKyAxLCBfX2xlbiwgX19hKTsKKwkJICAgIF9NX2NvcHkoX19hbm90aGVyLT5fTV9yZWZkYXRhKCksIF9fci0+X01fcmVmZGF0YSgpLCBfX2xlbik7CisJCSAgICBfX3ItPl9NX2Rlc3Ryb3koX19hKTsKKwkJICAgIF9fciA9IF9fYW5vdGhlcjsKKwkJICB9CisJCV9fci0+X01fcmVmZGF0YSgpW19fbGVuKytdID0gKl9fYmVnOworCQkrK19fYmVnOworCSAgICAgIH0KKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fci0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICBfQ2hhclQqCisgICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyNpZm5kZWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcKKwlpZiAoX19iZWcgPT0gX19lbmQgJiYgX19hID09IF9BbGxvYygpKQorCSAgcmV0dXJuIF9TX2VtcHR5X3JlcCgpLl9NX3JlZmRhdGEoKTsKKyNlbmRpZgorCS8vIE5COiBOb3QgcmVxdWlyZWQsIGJ1dCBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UuCisJaWYgKF9fZ251X2N4eDo6X19pc19udWxsX3BvaW50ZXIoX19iZWcpICYmIF9fYmVnICE9IF9fZW5kKQorCSAgX190aHJvd19sb2dpY19lcnJvcihfX04oImJhc2ljX3N0cmluZzo6X1NfY29uc3RydWN0IG51bGwgbm90IHZhbGlkIikpOworCisJY29uc3Qgc2l6ZV90eXBlIF9fZG5ldyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oc3RkOjpkaXN0YW5jZShfX2JlZywKKwkJCQkJCQkJICAgICAgX19lbmQpKTsKKwkvLyBDaGVjayBmb3Igb3V0X29mX3JhbmdlIGFuZCBsZW5ndGhfZXJyb3IgZXhjZXB0aW9ucy4KKwlfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19kbmV3LCBzaXplX3R5cGUoMCksIF9fYSk7CisJX190cnkKKwkgIHsgX1NfY29weV9jaGFycyhfX3ItPl9NX3JlZmRhdGEoKSwgX19iZWcsIF9fZW5kKTsgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfX3ItPl9NX2Rlc3Ryb3koX19hKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisJX19yLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2RuZXcpOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfQ2hhclQqCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX1NfY29uc3RydWN0KHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIHsKKyNpZm5kZWYgX0dMSUJDWFhfRlVMTFlfRFlOQU1JQ19TVFJJTkcKKyAgICAgIGlmIChfX24gPT0gMCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJcmV0dXJuIF9TX2VtcHR5X3JlcCgpLl9NX3JlZmRhdGEoKTsKKyNlbmRpZgorICAgICAgLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19uLCBzaXplX3R5cGUoMCksIF9fYSk7CisgICAgICBpZiAoX19uKQorCV9NX2Fzc2lnbihfX3ItPl9NX3JlZmRhdGEoKSwgX19uLCBfX2MpOworCisgICAgICBfX3ItPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbik7CisgICAgICByZXR1cm4gX19yLT5fTV9yZWZkYXRhKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIDogX01fZGF0YXBsdXMoX19zdHIuX01fcmVwKCktPl9NX2dyYWIoX0FsbG9jKF9fc3RyLmdldF9hbGxvY2F0b3IoKSksCisJCQkJCSAgX19zdHIuZ2V0X2FsbG9jYXRvcigpKSwKKwkJICBfX3N0ci5nZXRfYWxsb2NhdG9yKCkpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KHNpemVfdHlwZSgpLCBfQ2hhclQoKSwgX19hKSwgX19hKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zdHIuX01fZGF0YSgpCisJCQkgICAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywKKwkJCQkJCSJiYXNpY19zdHJpbmc6OmJhc2ljX3N0cmluZyIpLAorCQkJICAgICAgIF9fc3RyLl9NX2RhdGEoKSArIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pCisJCQkgICAgICAgKyBfX3BvcywgX0FsbG9jKCkpLCBfQWxsb2MoKSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zdHIuX01fZGF0YSgpCisJCQkgICAgICAgKyBfX3N0ci5fTV9jaGVjayhfX3BvcywKKwkJCQkJCSJiYXNpY19zdHJpbmc6OmJhc2ljX3N0cmluZyIpLAorCQkJICAgICAgIF9fc3RyLl9NX2RhdGEoKSArIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pCisJCQkgICAgICAgKyBfX3BvcywgX19hKSwgX19hKQorICAgIHsgfQorCisgIC8vIFRCRDogRFBHIGFubm90YXRlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19zLCBfX3MgKyBfX24sIF9fYSksIF9fYSkKKyAgICB7IH0KKworICAvLyBUQkQ6IERQRyBhbm5vdGF0ZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KF9fcywgX19zID8gX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpIDoKKwkJCSAgICAgICBfX3MgKyBucG9zLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX1NfY29uc3RydWN0KF9fbiwgX19jLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyAgLy8gVEJEOiBEUEcgYW5ub3RhdGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYmFzaWNfc3RyaW5nKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19iZWcsIF9fZW5kLCBfX2EpLCBfX2EpCisgICAgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBiYXNpY19zdHJpbmcoaW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCwgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfU19jb25zdHJ1Y3QoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19hKSwgX19hKQorICAgIHsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBpZiAoX01fcmVwKCkgIT0gX19zdHIuX01fcmVwKCkpCisJeworCSAgLy8gWFhYIE1UCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSBfX2EgPSB0aGlzLT5nZXRfYWxsb2NhdG9yKCk7CisJICBfQ2hhclQqIF9fdG1wID0gX19zdHIuX01fcmVwKCktPl9NX2dyYWIoX19hLCBfX3N0ci5nZXRfYWxsb2NhdG9yKCkpOworCSAgX01fcmVwKCktPl9NX2Rpc3Bvc2UoX19hKTsKKwkgIF9NX2RhdGEoX190bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgX01fY2hlY2tfbGVuZ3RoKHRoaXMtPnNpemUoKSwgX19uLCAiYmFzaWNfc3RyaW5nOjphc3NpZ24iKTsKKyAgICAgIGlmIChfTV9kaXNqdW5jdChfX3MpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwlyZXR1cm4gX01fcmVwbGFjZV9zYWZlKHNpemVfdHlwZSgwKSwgdGhpcy0+c2l6ZSgpLCBfX3MsIF9fbik7CisgICAgICBlbHNlCisJeworCSAgLy8gV29yayBpbi1wbGFjZS4KKwkgIGNvbnN0IHNpemVfdHlwZSBfX3BvcyA9IF9fcyAtIF9NX2RhdGEoKTsKKwkgIGlmIChfX3BvcyA+PSBfX24pCisJICAgIF9NX2NvcHkoX01fZGF0YSgpLCBfX3MsIF9fbik7CisJICBlbHNlIGlmIChfX3BvcykKKwkgICAgX01fbW92ZShfTV9kYXRhKCksIF9fcywgX19uKTsKKwkgIF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX24pOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgaWYgKF9fbikKKwl7CisJICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlKDApLCBfX24sICJiYXNpY19zdHJpbmc6OmFwcGVuZCIpOwkgIAorCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19uICsgdGhpcy0+c2l6ZSgpOworCSAgaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJICAgIHRoaXMtPnJlc2VydmUoX19sZW4pOworCSAgX01fYXNzaWduKF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSwgX19uLCBfX2MpOworCSAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbGVuKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGlmIChfX24pCisJeworCSAgX01fY2hlY2tfbGVuZ3RoKHNpemVfdHlwZSgwKSwgX19uLCAiYmFzaWNfc3RyaW5nOjphcHBlbmQiKTsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IF9fbiArIHRoaXMtPnNpemUoKTsKKwkgIGlmIChfX2xlbiA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCSAgICB7CisJICAgICAgaWYgKF9NX2Rpc2p1bmN0KF9fcykpCisJCXRoaXMtPnJlc2VydmUoX19sZW4pOworCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbnN0IHNpemVfdHlwZSBfX29mZiA9IF9fcyAtIF9NX2RhdGEoKTsKKwkJICB0aGlzLT5yZXNlcnZlKF9fbGVuKTsKKwkJICBfX3MgPSBfTV9kYXRhKCkgKyBfX29mZjsKKwkJfQorCSAgICB9CisJICBfTV9jb3B5KF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSwgX19zLCBfX24pOworCSAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbGVuKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IF9fc3RyLnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19zaXplICsgdGhpcy0+c2l6ZSgpOworCSAgaWYgKF9fbGVuID4gdGhpcy0+Y2FwYWNpdHkoKSB8fCBfTV9yZXAoKS0+X01faXNfc2hhcmVkKCkpCisJICAgIHRoaXMtPnJlc2VydmUoX19sZW4pOworCSAgX01fY29weShfTV9kYXRhKCkgKyB0aGlzLT5zaXplKCksIF9fc3RyLl9NX2RhdGEoKSwgX19zaXplKTsKKwkgIF9NX3JlcCgpLT5fTV9zZXRfbGVuZ3RoX2FuZF9zaGFyYWJsZShfX2xlbik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0gICAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBhcHBlbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9fc3RyLl9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjphcHBlbmQiKTsKKyAgICAgIF9fbiA9IF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pOworICAgICAgaWYgKF9fbikKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX24gKyB0aGlzLT5zaXplKCk7CisJICBpZiAoX19sZW4gPiB0aGlzLT5jYXBhY2l0eSgpIHx8IF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwkgICAgdGhpcy0+cmVzZXJ2ZShfX2xlbik7CisJICBfTV9jb3B5KF9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSwgX19zdHIuX01fZGF0YSgpICsgX19wb3MsIF9fbik7CisJICBfTV9yZXAoKS0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUoX19sZW4pOwkgIAorCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JgorICAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvcywgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgIHsKKyAgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICAgX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6Omluc2VydCIpOworICAgICAgIF9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUoMCksIF9fbiwgImJhc2ljX3N0cmluZzo6aW5zZXJ0Iik7CisgICAgICAgaWYgKF9NX2Rpc2p1bmN0KF9fcykgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorICAgICAgICAgcmV0dXJuIF9NX3JlcGxhY2Vfc2FmZShfX3Bvcywgc2l6ZV90eXBlKDApLCBfX3MsIF9fbik7CisgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAvLyBXb3JrIGluLXBsYWNlLgorICAgICAgICAgICBjb25zdCBzaXplX3R5cGUgX19vZmYgPSBfX3MgLSBfTV9kYXRhKCk7CisgICAgICAgICAgIF9NX211dGF0ZShfX3BvcywgMCwgX19uKTsKKyAgICAgICAgICAgX19zID0gX01fZGF0YSgpICsgX19vZmY7CisgICAgICAgICAgIF9DaGFyVCogX19wID0gX01fZGF0YSgpICsgX19wb3M7CisgICAgICAgICAgIGlmIChfX3MgICsgX19uIDw9IF9fcCkKKyAgICAgICAgICAgICBfTV9jb3B5KF9fcCwgX19zLCBfX24pOworICAgICAgICAgICBlbHNlIGlmIChfX3MgPj0gX19wKQorICAgICAgICAgICAgIF9NX2NvcHkoX19wLCBfX3MgKyBfX24sIF9fbik7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB7CisJICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25sZWZ0ID0gX19wIC0gX19zOworICAgICAgICAgICAgICAgX01fY29weShfX3AsIF9fcywgX19ubGVmdCk7CisgICAgICAgICAgICAgICBfTV9jb3B5KF9fcCArIF9fbmxlZnQsIF9fcCArIF9fbiwgX19uIC0gX19ubGVmdCk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICB9CisgICAgIH0KKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgIHsKKyAgICAgICBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19maXJzdCA+PSBfTV9pYmVnaW4oKSAmJiBfX2ZpcnN0IDw9IF9fbGFzdAorCQkJCSYmIF9fbGFzdCA8PSBfTV9pZW5kKCkpOworCisgICAgICAgLy8gTkI6IFRoaXMgaXNuJ3QganVzdCBhbiBvcHRpbWl6YXRpb24gKGJhaWwgb3V0IGVhcmx5IHdoZW4KKyAgICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLCByZWFsbHkpLCBpdCdzIGFsc28gYSBjb3JyZWN0bmVzcworICAgICAgIC8vIGlzc3VlIHZzIE1ULCBzZWUgbGlic3RkYysrLzQwNTE4LgorICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgIGlmIChfX3NpemUpCisJIHsKKwkgICBjb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX2ZpcnN0IC0gX01faWJlZ2luKCk7CisJICAgX01fbXV0YXRlKF9fcG9zLCBfX3NpemUsIHNpemVfdHlwZSgwKSk7CisJICAgX01fcmVwKCktPl9NX3NldF9sZWFrZWQoKTsKKwkgICByZXR1cm4gaXRlcmF0b3IoX01fZGF0YSgpICsgX19wb3MpOworCSB9CisgICAgICAgZWxzZQorCSByZXR1cm4gX19maXJzdDsKKyAgICAgfQorCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICBzaXplX3R5cGUgX19uMikKKyAgICAgeworICAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uMik7CisgICAgICAgX01fY2hlY2soX19wb3MsICJiYXNpY19zdHJpbmc6OnJlcGxhY2UiKTsKKyAgICAgICBfX24xID0gX01fbGltaXQoX19wb3MsIF9fbjEpOworICAgICAgIF9NX2NoZWNrX2xlbmd0aChfX24xLCBfX24yLCAiYmFzaWNfc3RyaW5nOjpyZXBsYWNlIik7CisgICAgICAgYm9vbCBfX2xlZnQ7CisgICAgICAgaWYgKF9NX2Rpc2p1bmN0KF9fcykgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorICAgICAgICAgcmV0dXJuIF9NX3JlcGxhY2Vfc2FmZShfX3BvcywgX19uMSwgX19zLCBfX24yKTsKKyAgICAgICBlbHNlIGlmICgoX19sZWZ0ID0gX19zICsgX19uMiA8PSBfTV9kYXRhKCkgKyBfX3BvcykKKwkJfHwgX01fZGF0YSgpICsgX19wb3MgKyBfX24xIDw9IF9fcykKKwkgeworCSAgIC8vIFdvcmsgaW4tcGxhY2U6IG5vbi1vdmVybGFwcGluZyBjYXNlLgorCSAgIHNpemVfdHlwZSBfX29mZiA9IF9fcyAtIF9NX2RhdGEoKTsKKwkgICBfX2xlZnQgPyBfX29mZiA6IChfX29mZiArPSBfX24yIC0gX19uMSk7CisJICAgX01fbXV0YXRlKF9fcG9zLCBfX24xLCBfX24yKTsKKwkgICBfTV9jb3B5KF9NX2RhdGEoKSArIF9fcG9zLCBfTV9kYXRhKCkgKyBfX29mZiwgX19uMik7CisJICAgcmV0dXJuICp0aGlzOworCSB9CisgICAgICAgZWxzZQorCSB7CisJICAgLy8gVG9kbzogb3ZlcmxhcHBpbmcgY2FzZS4KKwkgICBjb25zdCBiYXNpY19zdHJpbmcgX190bXAoX19zLCBfX24yKTsKKwkgICByZXR1cm4gX01fcmVwbGFjZV9zYWZlKF9fcG9zLCBfX24xLCBfX3RtcC5fTV9kYXRhKCksIF9fbjIpOworCSB9CisgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX01fZGVzdHJveShjb25zdCBfQWxsb2MmIF9fYSkgdGhyb3cgKCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gc2l6ZW9mKF9SZXBfYmFzZSkgKworCSAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMtPl9NX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKTsKKyAgICAgIF9SYXdfYnl0ZXNfYWxsb2MoX19hKS5kZWFsbG9jYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpLCBfX3NpemUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fbGVha19oYXJkKCkKKyAgICB7CisjaWZuZGVmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HCisgICAgICBpZiAoX01fcmVwKCkgPT0gJl9TX2VtcHR5X3JlcCgpKQorCXJldHVybjsKKyNlbmRpZgorICAgICAgaWYgKF9NX3JlcCgpLT5fTV9pc19zaGFyZWQoKSkKKwlfTV9tdXRhdGUoMCwgMCwgMCk7CisgICAgICBfTV9yZXAoKS0+X01fc2V0X2xlYWtlZCgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fbXV0YXRlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgc2l6ZV90eXBlIF9fbGVuMikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19zaXplID0gX19vbGRfc2l6ZSArIF9fbGVuMiAtIF9fbGVuMTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zIC0gX19sZW4xOworCisgICAgICBpZiAoX19uZXdfc2l6ZSA+IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorCXsKKwkgIC8vIE11c3QgcmVhbGxvY2F0ZS4KKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlIF9fYSA9IGdldF9hbGxvY2F0b3IoKTsKKwkgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX25ld19zaXplLCB0aGlzLT5jYXBhY2l0eSgpLCBfX2EpOworCisJICBpZiAoX19wb3MpCisJICAgIF9NX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX2RhdGEoKSwgX19wb3MpOworCSAgaWYgKF9faG93X211Y2gpCisJICAgIF9NX2NvcHkoX19yLT5fTV9yZWZkYXRhKCkgKyBfX3BvcyArIF9fbGVuMiwKKwkJICAgIF9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKworCSAgX01fcmVwKCktPl9NX2Rpc3Bvc2UoX19hKTsKKwkgIF9NX2RhdGEoX19yLT5fTV9yZWZkYXRhKCkpOworCX0KKyAgICAgIGVsc2UgaWYgKF9faG93X211Y2ggJiYgX19sZW4xICE9IF9fbGVuMikKKwl7CisJICAvLyBXb3JrIGluLXBsYWNlLgorCSAgX01fbW92ZShfTV9kYXRhKCkgKyBfX3BvcyArIF9fbGVuMiwKKwkJICBfTV9kYXRhKCkgKyBfX3BvcyArIF9fbGVuMSwgX19ob3dfbXVjaCk7CisJfQorICAgICAgX01fcmVwKCktPl9NX3NldF9sZW5ndGhfYW5kX3NoYXJhYmxlKF9fbmV3X3NpemUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXMpCisgICAgeworICAgICAgaWYgKF9fcmVzICE9IHRoaXMtPmNhcGFjaXR5KCkgfHwgX01fcmVwKCktPl9NX2lzX3NoYXJlZCgpKQorICAgICAgICB7CisJICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2hyaW5rIGJlbG93IHRoZSBjdXJyZW50IHNpemUKKwkgIGlmIChfX3JlcyA8IHRoaXMtPnNpemUoKSkKKwkgICAgX19yZXMgPSB0aGlzLT5zaXplKCk7CisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSBfX2EgPSBnZXRfYWxsb2NhdG9yKCk7CisJICBfQ2hhclQqIF9fdG1wID0gX01fcmVwKCktPl9NX2Nsb25lKF9fYSwgX19yZXMgLSB0aGlzLT5zaXplKCkpOworCSAgX01fcmVwKCktPl9NX2Rpc3Bvc2UoX19hKTsKKwkgIF9NX2RhdGEoX190bXApOworICAgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBzd2FwKGJhc2ljX3N0cmluZyYgX19zKQorICAgIHsKKyAgICAgIGlmIChfTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCisJX01fcmVwKCktPl9NX3NldF9zaGFyYWJsZSgpOworICAgICAgaWYgKF9fcy5fTV9yZXAoKS0+X01faXNfbGVha2VkKCkpCisJX19zLl9NX3JlcCgpLT5fTV9zZXRfc2hhcmFibGUoKTsKKyAgICAgIGlmICh0aGlzLT5nZXRfYWxsb2NhdG9yKCkgPT0gX19zLmdldF9hbGxvY2F0b3IoKSkKKwl7CisJICBfQ2hhclQqIF9fdG1wID0gX01fZGF0YSgpOworCSAgX01fZGF0YShfX3MuX01fZGF0YSgpKTsKKwkgIF9fcy5fTV9kYXRhKF9fdG1wKTsKKwl9CisgICAgICAvLyBUaGUgY29kZSBiZWxvdyBjYW4gdXN1YWxseSBiZSBvcHRpbWl6ZWQgYXdheS4KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBiYXNpY19zdHJpbmcgX190bXAxKF9NX2liZWdpbigpLCBfTV9pZW5kKCksCisJCQkJICAgIF9fcy5nZXRfYWxsb2NhdG9yKCkpOworCSAgY29uc3QgYmFzaWNfc3RyaW5nIF9fdG1wMihfX3MuX01faWJlZ2luKCksIF9fcy5fTV9pZW5kKCksCisJCQkJICAgIHRoaXMtPmdldF9hbGxvY2F0b3IoKSk7CisJICAqdGhpcyA9IF9fdG1wMjsKKwkgIF9fcyA9IF9fdG1wMTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXAqCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX1NfY3JlYXRlKHNpemVfdHlwZSBfX2NhcGFjaXR5LCBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHksCisJICAgICAgY29uc3QgX0FsbG9jJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDgzLiAgU3RyaW5nOjpucG9zIHZzLiBzdHJpbmc6Om1heF9zaXplKCkKKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gX1NfbWF4X3NpemUpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJiYXNpY19zdHJpbmc6Ol9TX2NyZWF0ZSIpKTsKKworICAgICAgLy8gVGhlIHN0YW5kYXJkIHBsYWNlcyBubyByZXN0cmljdGlvbiBvbiBhbGxvY2F0aW5nIG1vcmUgbWVtb3J5CisgICAgICAvLyB0aGFuIGlzIHN0cmljdGx5IG5lZWRlZCB3aXRoaW4gdGhpcyBsYXllciBhdCB0aGUgbW9tZW50IG9yIGFzCisgICAgICAvLyByZXF1ZXN0ZWQgYnkgYW4gZXhwbGljaXQgYXBwbGljYXRpb24gY2FsbCB0byByZXNlcnZlKCkuCisKKyAgICAgIC8vIE1hbnkgbWFsbG9jIGltcGxlbWVudGF0aW9ucyBwZXJmb3JtIHF1aXRlIHBvb3JseSB3aGVuIGFuCisgICAgICAvLyBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gYSBzdGVwd2lzZSBmYXNoaW9uCisgICAgICAvLyBncm93aW5nIGVhY2ggYWxsb2NhdGlvbiBzaXplIGJ5IG9ubHkgMSBjaGFyLiAgQWRkaXRpb25hbGx5LAorICAgICAgLy8gaXQgbWFrZXMgbGl0dGxlIHNlbnNlIHRvIGFsbG9jYXRlIGxlc3MgbGluZWFyIG1lbW9yeSB0aGFuIHRoZQorICAgICAgLy8gbmF0dXJhbCBibG9ja2luZyBzaXplIG9mIHRoZSBtYWxsb2MgaW1wbGVtZW50YXRpb24uCisgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSB3b3VsZCBuZWVkIGEgc29tZXdoYXQgbG93LWxldmVsIGNhbGN1bGF0aW9uCisgICAgICAvLyB3aXRoIHR1bmVkIHBhcmFtZXRlcnMgdG8gZ2V0IHRoaXMgcGVyZmVjdCBmb3IgYW55IHBhcnRpY3VsYXIKKyAgICAgIC8vIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4gIEZvcnR1bmF0ZWx5LCBnZW5lcmFsaXphdGlvbnMgYWJvdXQKKyAgICAgIC8vIGNvbW1vbiBmZWF0dXJlcyBzZWVuIGFtb25nIGltcGxlbWVudGF0aW9ucyBzZWVtcyB0byBzdWZmaWNlLgorCisgICAgICAvLyBfX3BhZ2VzaXplIG5lZWQgbm90IG1hdGNoIHRoZSBhY3R1YWwgVk0gcGFnZSBzaXplIGZvciBnb29kCisgICAgICAvLyByZXN1bHRzIGluIHByYWN0aWNlLCB0aHVzIHdlIHBpY2sgYSBjb21tb24gdmFsdWUgb24gdGhlIGxvdworICAgICAgLy8gc2lkZS4gIF9fbWFsbG9jX2hlYWRlcl9zaXplIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YKKyAgICAgIC8vIG92ZXJoZWFkIHBlciBtZW1vcnkgYWxsb2NhdGlvbiAoaW4gcHJhY3RpY2Ugc2VlbiBOICogc2l6ZW9mCisgICAgICAvLyAodm9pZCopIHdoZXJlIE4gaXMgMCwgMiBvciA0KS4gIEFjY29yZGluZyB0byBmb2xrbG9yZSwKKyAgICAgIC8vIHBpY2tpbmcgdGhpcyB2YWx1ZSBvbiB0aGUgaGlnaCBzaWRlIGlzIGJldHRlciB0aGFuCisgICAgICAvLyBsb3ctYmFsbGluZyBpdCAoZXNwZWNpYWxseSB3aGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgd2l0aAorICAgICAgLy8gbWFsbG9jIGltcGxlbWVudGF0aW9ucyB0aGF0IGFsbG9jYXRlIG1lbW9yeSBibG9ja3Mgcm91bmRlZCB1cAorICAgICAgLy8gdG8gYSBzaXplIHdoaWNoIGlzIGEgcG93ZXIgb2YgMikuCisgICAgICBjb25zdCBzaXplX3R5cGUgX19wYWdlc2l6ZSA9IDQwOTY7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19tYWxsb2NfaGVhZGVyX3NpemUgPSA0ICogc2l6ZW9mKHZvaWQqKTsKKworICAgICAgLy8gVGhlIGJlbG93IGltcGxlbWVudHMgYW4gZXhwb25lbnRpYWwgZ3Jvd3RoIHBvbGljeSwgbmVjZXNzYXJ5IHRvCisgICAgICAvLyBtZWV0IGFtb3J0aXplZCBsaW5lYXIgdGltZSByZXF1aXJlbWVudHMgb2YgdGhlIGxpYnJhcnk6IHNlZQorICAgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTA3L21zZzAwMDg1Lmh0bWwuCisgICAgICAvLyBJdCdzIGFjdGl2ZSBmb3IgYWxsb2NhdGlvbnMgcmVxdWlyaW5nIGFuIGFtb3VudCBvZiBtZW1vcnkgYWJvdmUKKyAgICAgIC8vIHN5c3RlbSBwYWdlc2l6ZS4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUKKyAgICAgIC8vIHN0YW5kYXJkOiBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDEtMDcvbXNnMDAxMzAuaHRtbAorICAgICAgaWYgKF9fY2FwYWNpdHkgPiBfX29sZF9jYXBhY2l0eSAmJiBfX2NhcGFjaXR5IDwgMiAqIF9fb2xkX2NhcGFjaXR5KQorCV9fY2FwYWNpdHkgPSAyICogX19vbGRfY2FwYWNpdHk7CisKKyAgICAgIC8vIE5COiBOZWVkIGFuIGFycmF5IG9mIGNoYXJfdHlwZVtfX2NhcGFjaXR5XSwgcGx1cyBhIHRlcm1pbmF0aW5nCisgICAgICAvLyBudWxsIGNoYXJfdHlwZSgpIGVsZW1lbnQsIHBsdXMgZW5vdWdoIGZvciB0aGUgX1JlcCBkYXRhIHN0cnVjdHVyZS4KKyAgICAgIC8vIFdoZXcuIFNlZW1pbmdseSBzbyBuZWVkeSwgeWV0IHNvIGVsZW1lbnRhbC4KKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSAoX19jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkgKyBzaXplb2YoX1JlcCk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2Fkal9zaXplID0gX19zaXplICsgX19tYWxsb2NfaGVhZGVyX3NpemU7CisgICAgICBpZiAoX19hZGpfc2l6ZSA+IF9fcGFnZXNpemUgJiYgX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5KQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2V4dHJhID0gX19wYWdlc2l6ZSAtIF9fYWRqX3NpemUgJSBfX3BhZ2VzaXplOworCSAgX19jYXBhY2l0eSArPSBfX2V4dHJhIC8gc2l6ZW9mKF9DaGFyVCk7CisJICAvLyBOZXZlciBhbGxvY2F0ZSBhIHN0cmluZyBiaWdnZXIgdGhhbiBfU19tYXhfc2l6ZS4KKwkgIGlmIChfX2NhcGFjaXR5ID4gX1NfbWF4X3NpemUpCisJICAgIF9fY2FwYWNpdHkgPSBfU19tYXhfc2l6ZTsKKwkgIF9fc2l6ZSA9IChfX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKSArIHNpemVvZihfUmVwKTsKKwl9CisKKyAgICAgIC8vIE5COiBNaWdodCB0aHJvdywgYnV0IG5vIHdvcnJpZXMgYWJvdXQgYSBsZWFrLCBtYXRlOiBfUmVwKCkKKyAgICAgIC8vIGRvZXMgbm90IHRocm93LgorICAgICAgdm9pZCogX19wbGFjZSA9IF9SYXdfYnl0ZXNfYWxsb2MoX19hbGxvYykuYWxsb2NhdGUoX19zaXplKTsKKyAgICAgIF9SZXAgKl9fcCA9IG5ldyAoX19wbGFjZSkgX1JlcDsKKyAgICAgIF9fcC0+X01fY2FwYWNpdHkgPSBfX2NhcGFjaXR5OworICAgICAgLy8gQUJJIGNvbXBhdGliaWxpdHkgLSAzLjQueCBzZXQgaW4gX1NfY3JlYXRlIGJvdGgKKyAgICAgIC8vIF9NX3JlZmNvdW50IGFuZCBfTV9sZW5ndGguICBBbGwgY2FsbGVycyBvZiBfU19jcmVhdGUKKyAgICAgIC8vIGluIGJhc2ljX3N0cmluZy50Y2MgdGhlbiBzZXQganVzdCBfTV9sZW5ndGguCisgICAgICAvLyBJbiA0LjAueCBhbmQgbGF0ZXIgYm90aCBfTV9yZWZjb3VudCBhbmQgX01fbGVuZ3RoCisgICAgICAvLyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGNhbGxlcnMsIHVuZm9ydHVuYXRlbHkgd2UgY2FuCisgICAgICAvLyBoYXZlIDMuNC54IGNvbXBpbGVkIGNvZGUgd2l0aCBfU19jcmVhdGUgY2FsbGVycyBpbmxpbmVkCisgICAgICAvLyBjYWxsaW5nIDQuMC54KyBfU19jcmVhdGUuCisgICAgICBfX3AtPl9NX3NldF9zaGFyYWJsZSgpOworICAgICAgcmV0dXJuIF9fcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6OgorICAgIF9NX2Nsb25lKGNvbnN0IF9BbGxvYyYgX19hbGxvYywgc2l6ZV90eXBlIF9fcmVzKQorICAgIHsKKyAgICAgIC8vIFJlcXVlc3RlZCBjYXBhY2l0eSBvZiB0aGUgY2xvbmUuCisgICAgICBjb25zdCBzaXplX3R5cGUgX19yZXF1ZXN0ZWRfY2FwID0gdGhpcy0+X01fbGVuZ3RoICsgX19yZXM7CisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19yZXF1ZXN0ZWRfY2FwLCB0aGlzLT5fTV9jYXBhY2l0eSwKKwkJCQkgIF9fYWxsb2MpOworICAgICAgaWYgKHRoaXMtPl9NX2xlbmd0aCkKKwlfTV9jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9yZWZkYXRhKCksIHRoaXMtPl9NX2xlbmd0aCk7CisKKyAgICAgIF9fci0+X01fc2V0X2xlbmd0aF9hbmRfc2hhcmFibGUodGhpcy0+X01fbGVuZ3RoKTsKKyAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBfTV9jaGVja19sZW5ndGgoX19zaXplLCBfX24sICJiYXNpY19zdHJpbmc6OnJlc2l6ZSIpOworICAgICAgaWYgKF9fc2l6ZSA8IF9fbikKKwl0aGlzLT5hcHBlbmQoX19uIC0gX19zaXplLCBfX2MpOworICAgICAgZWxzZSBpZiAoX19uIDwgX19zaXplKQorCXRoaXMtPmVyYXNlKF9fbik7CisgICAgICAvLyBlbHNlIG5vdGhpbmcgKGluIHBhcnRpY3VsYXIsIGF2b2lkIGNhbGxpbmcgX01fbXV0YXRlKCkgdW5uZWNlc3NhcmlseS4pCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX01fcmVwbGFjZV9kaXNwYXRjaChpdGVyYXRvciBfX2kxLCBpdGVyYXRvciBfX2kyLCBfSW5wdXRJdGVyYXRvciBfX2sxLAorCQkJICBfSW5wdXRJdGVyYXRvciBfX2syLCBfX2ZhbHNlX3R5cGUpCisgICAgICB7CisJY29uc3QgYmFzaWNfc3RyaW5nIF9fcyhfX2sxLCBfX2syKTsKKwljb25zdCBzaXplX3R5cGUgX19uMSA9IF9faTIgLSBfX2kxOworCV9NX2NoZWNrX2xlbmd0aChfX24xLCBfX3Muc2l6ZSgpLCAiYmFzaWNfc3RyaW5nOjpfTV9yZXBsYWNlX2Rpc3BhdGNoIik7CisJcmV0dXJuIF9NX3JlcGxhY2Vfc2FmZShfX2kxIC0gX01faWJlZ2luKCksIF9fbjEsIF9fcy5fTV9kYXRhKCksCisJCQkgICAgICAgX19zLnNpemUoKSk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsCisJCSAgIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbjEsIF9fbjIsICJiYXNpY19zdHJpbmc6Ol9NX3JlcGxhY2VfYXV4Iik7CisgICAgICBfTV9tdXRhdGUoX19wb3MxLCBfX24xLCBfX24yKTsKKyAgICAgIGlmIChfX24yKQorCV9NX2Fzc2lnbihfTV9kYXRhKCkgKyBfX3BvczEsIF9fbjIsIF9fYyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fcmVwbGFjZV9zYWZlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkJICAgIHNpemVfdHlwZSBfX24yKQorICAgIHsKKyAgICAgIF9NX211dGF0ZShfX3BvczEsIF9fbjEsIF9fbjIpOworICAgICAgaWYgKF9fbjIpCisJX01fY29weShfTV9kYXRhKCkgKyBfX3BvczEsIF9fcywgX19uMik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fbGhzKTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJICBfX3NpemVfdHlwZTsKKyAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fbGhzKTsKKyAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CisgICAgICBfX3N0ci5yZXNlcnZlKF9fbGVuICsgX19yaHMuc2l6ZSgpKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX2xocywgX19sZW4pOworICAgICAgX19zdHIuYXBwZW5kKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiBfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJICBfX3NpemVfdHlwZTsKKyAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX2xlbiA9IF9fcmhzLnNpemUoKTsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19sZW4gKyAxKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX3NpemVfdHlwZSgxKSwgX19saHMpOworICAgICAgX19zdHIuYXBwZW5kKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgY29weShfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgIHsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpjb3B5Iik7CisgICAgICBfX24gPSBfTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGlmIChfX24pCisJX01fY29weShfX3MsIF9NX2RhdGEoKSArIF9fcG9zLCBfX24pOworICAgICAgLy8gMjEuMy41LjcgcGFyIDM6IGRvIG5vdCBhcHBlbmQgbnVsbC4gIChnb29kLikKKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfTV9kYXRhKCk7CisKKyAgICAgIGlmIChfX24gPT0gMCkKKwlyZXR1cm4gX19wb3MgPD0gX19zaXplID8gX19wb3MgOiBucG9zOworCisgICAgICBpZiAoX19uIDw9IF9fc2l6ZSkKKwl7CisJICBmb3IgKDsgX19wb3MgPD0gX19zaXplIC0gX19uOyArK19fcG9zKQorCSAgICBpZiAodHJhaXRzX3R5cGU6OmVxKF9fZGF0YVtfX3Bvc10sIF9fc1swXSkKKwkJJiYgdHJhaXRzX3R5cGU6OmNvbXBhcmUoX19kYXRhICsgX19wb3MgKyAxLAorCQkJCQlfX3MgKyAxLCBfX24gLSAxKSA9PSAwKQorCSAgICAgIHJldHVybiBfX3BvczsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIF9fcmV0ID0gbnBvczsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19wb3MgPCBfX3NpemUpCisJeworCSAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSBfTV9kYXRhKCk7CisJICBjb25zdCBzaXplX3R5cGUgX19uID0gX19zaXplIC0gX19wb3M7CisJICBjb25zdCBfQ2hhclQqIF9fcCA9IHRyYWl0c190eXBlOjpmaW5kKF9fZGF0YSArIF9fcG9zLCBfX24sIF9fYyk7CisJICBpZiAoX19wKQorCSAgICBfX3JldCA9IF9fcCAtIF9fZGF0YTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX24gPD0gX19zaXplKQorCXsKKwkgIF9fcG9zID0gc3RkOjptaW4oc2l6ZV90eXBlKF9fc2l6ZSAtIF9fbiksIF9fcG9zKTsKKwkgIGNvbnN0IF9DaGFyVCogX19kYXRhID0gX01fZGF0YSgpOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6Y29tcGFyZShfX2RhdGEgKyBfX3BvcywgX19zLCBfX24pID09IDApCisJCXJldHVybiBfX3BvczsKKwkgICAgfQorCSAgd2hpbGUgKF9fcG9zLS0gPiAwKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcmZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgIHsKKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19zaXplKQorCXsKKwkgIGlmICgtLV9fc2l6ZSA+IF9fcG9zKQorCSAgICBfX3NpemUgPSBfX3BvczsKKwkgIGZvciAoKytfX3NpemU7IF9fc2l6ZS0tID4gMDsgKQorCSAgICBpZiAodHJhaXRzX3R5cGU6OmVxKF9NX2RhdGEoKVtfX3NpemVdLCBfX2MpKQorCSAgICAgIHJldHVybiBfX3NpemU7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBmb3IgKDsgX19uICYmIF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCXsKKwkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtfX3Bvc10pOworCSAgaWYgKF9fcCkKKwkgICAgcmV0dXJuIF9fcG9zOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSAmJiBfX24pCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgX01fZGF0YSgpW19fc2l6ZV0pKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0gIT0gMCk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgZm9yICg7IF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCWlmICghdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtfX3Bvc10pKQorCSAgcmV0dXJuIF9fcG9zOworICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICB7CisgICAgICBmb3IgKDsgX19wb3MgPCB0aGlzLT5zaXplKCk7ICsrX19wb3MpCisJaWYgKCF0cmFpdHNfdHlwZTo6ZXEoX01fZGF0YSgpW19fcG9zXSwgX19jKSkKKwkgIHJldHVybiBfX3BvczsKKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIF9NX2RhdGEoKVtfX3NpemVdKSkKKwkJcmV0dXJuIF9fc2l6ZTsKKwkgICAgfQorCSAgd2hpbGUgKF9fc2l6ZS0tKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxKF9NX2RhdGEoKVtfX3NpemVdLCBfX2MpKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbnQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19uID0gX01fbGltaXQoX19wb3MsIF9fbik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IF9fc3RyLnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbiwgX19vc2l6ZSk7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpICsgX19wb3MsIF9fc3RyLmRhdGEoKSwgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX1NfY29tcGFyZShfX24sIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW50CisgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwKKwkgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MxLCAiYmFzaWNfc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX3N0ci5fTV9jaGVjayhfX3BvczIsICJiYXNpY19zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvczEsIF9fbjEpOworICAgICAgX19uMiA9IF9fc3RyLl9NX2xpbWl0KF9fcG9zMiwgX19uMik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24xLCBfX24yKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCkgKyBfX3BvczEsCisJCQkJICAgICBfX3N0ci5kYXRhKCkgKyBfX3BvczIsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19uMSwgX19uMik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbnQKKyAgICBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IHRyYWl0c190eXBlOjpsZW5ndGgoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fc2l6ZSwgX19vc2l6ZSk7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUoX01fZGF0YSgpLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19zaXplLCBfX29zaXplKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIGludAorICAgIGJhc2ljX3N0cmluZyA8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiYmFzaWNfc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MsIF9fbjEpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb3NpemUgPSB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcyk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6Om1pbihfX24xLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZShfTV9kYXRhKCkgKyBfX3BvcywgX19zLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfU19jb21wYXJlKF9fbjEsIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW50CisgICAgYmFzaWNfc3RyaW5nIDxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgIHNpemVfdHlwZSBfX24yKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uMik7CisgICAgICBfTV9jaGVjayhfX3BvcywgImJhc2ljX3N0cmluZzo6Y29tcGFyZSIpOworICAgICAgX19uMSA9IF9NX2xpbWl0KF9fcG9zLCBfX24xKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbjEsIF9fbjIpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKF9NX2RhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9TX2NvbXBhcmUoX19uMSwgX19uMik7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLyAyMS4zLjcuOSBiYXNpY19zdHJpbmc6OmdldGxpbmUgYW5kIG9wZXJhdG9ycworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCisJICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPglfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgICAgICBfX2lvc19iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW50X3R5cGUJCV9faW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkJX19zaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGN0eXBlPF9DaGFyVD4JCQkJX19jdHlwZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2N0eXBlX3R5cGU6OmN0eXBlX2Jhc2UgICAgICAgICBfX2N0eXBlX2Jhc2U7CisKKyAgICAgIF9fc2l6ZV90eXBlIF9fZXh0cmFjdGVkID0gMDsKKyAgICAgIHR5cGVuYW1lIF9faW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBfX2lvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gQXZvaWQgcmVhbGxvY2F0aW9uIGZvciBjb21tb24gY2FzZS4KKwkgICAgICBfX3N0ci5lcmFzZSgpOworCSAgICAgIF9DaGFyVCBfX2J1ZlsxMjhdOworCSAgICAgIF9fc2l6ZV90eXBlIF9fbGVuID0gMDsJICAgICAgCisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3cgPSBfX2luLndpZHRoKCk7CisJICAgICAgY29uc3QgX19zaXplX3R5cGUgX19uID0gX193ID4gMCA/IHN0YXRpY19jYXN0PF9fc2l6ZV90eXBlPihfX3cpCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19zdHIubWF4X3NpemUoKTsKKwkgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSB1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfX2luLmdldGxvYygpKTsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX2luLnJkYnVmKCktPnNnZXRjKCk7CisKKwkgICAgICB3aGlsZSAoX19leHRyYWN0ZWQgPCBfX24KKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiAhX19jdC5pcyhfX2N0eXBlX2Jhc2U6OnNwYWNlLAorCQkJCSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJCXsKKwkJICBpZiAoX19sZW4gPT0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCQkgICAgeworCQkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSk7CisJCSAgICAgIF9fbGVuID0gMDsKKwkJICAgIH0KKwkJICBfX2J1ZltfX2xlbisrXSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1ZiwgX19sZW4pOworCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgX19pbi53aWR0aCgwKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyA5MS4gRGVzY3JpcHRpb24gb2Ygb3BlcmF0b3I+PiBhbmQgZ2V0bGluZSgpIGZvciBzdHJpbmc8PgorCSAgICAgIC8vIG1pZ2h0IGNhdXNlIGVuZGxlc3MgbG9vcAorCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgfQorCX0KKyAgICAgIC8vIDIxMS4gIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHN0cmluZyYpIGRvZXNuJ3Qgc2V0IGZhaWxiaXQKKyAgICAgIGlmICghX19leHRyYWN0ZWQpCisJX19lcnIgfD0gX19pb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgIGlmIChfX2VycikKKwlfX2luLnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiBfX2luOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCisJICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLCBfQ2hhclQgX19kZWxpbSkKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4JX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgICAgICAgX19pb3NfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlCQlfX2ludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworCisgICAgICBfX3NpemVfdHlwZSBfX2V4dHJhY3RlZCA9IDA7CisgICAgICBjb25zdCBfX3NpemVfdHlwZSBfX24gPSBfX3N0ci5tYXhfc2l6ZSgpOworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2lkZWxpbSA9IF9UcmFpdHM6OnRvX2ludF90eXBlKF9fZGVsaW0pOworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSBfVHJhaXRzOjplb2YoKTsKKwkgICAgICBfX2ludF90eXBlIF9fYyA9IF9faW4ucmRidWYoKS0+c2dldGMoKTsKKworCSAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbgorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgIF9fc3RyICs9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisJCXsKKwkJICArK19fZXh0cmFjdGVkOwkJICAKKwkJICBfX2luLnJkYnVmKCktPnNidW1wYygpOworCQl9CisJICAgICAgZWxzZQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDkxLiBEZXNjcmlwdGlvbiBvZiBvcGVyYXRvcj4+IGFuZCBnZXRsaW5lKCkgZm9yIHN0cmluZzw+CisJICAgICAgLy8gbWlnaHQgY2F1c2UgZW5kbGVzcyBsb29wCisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICB9CisJfQorICAgICAgaWYgKCFfX2V4dHJhY3RlZCkKKwlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURSA+IDAKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZzxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhcj4mLCBzdHJpbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfb3N0cmVhbTxjaGFyPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhcj4mLCBjb25zdCBzdHJpbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhcj4mLCBzdHJpbmcmLCBjaGFyKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08Y2hhcj4mLCBzdHJpbmcmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmc8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPHdjaGFyX3Q+Jiwgd3N0cmluZyYpOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBiYXNpY19vc3RyZWFtPHdjaGFyX3Q+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTx3Y2hhcl90PiYsIGNvbnN0IHdzdHJpbmcmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PiYKKyAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mLCB3c3RyaW5nJiwgd2NoYXJfdCk7CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPHdjaGFyX3Q+Jiwgd3N0cmluZyYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2Jvb3N0X2NvbmNlcHRfY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWJjMTZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2Jvb3N0X2NvbmNlcHRfY2hlY2suaApAQCAtMCwwICsxLDc5MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyAoQykgQ29weXJpZ2h0IEplcmVteSBTaWVrIDIwMDAuIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLCBtb2RpZnksCisvLyBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzCisvLyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZAorLy8gImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMKKy8vIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCisvLworCisvKiogQGZpbGUgYml0cy9ib29zdF9jb25jZXB0X2NoZWNrLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisvLyBHQ0MgTm90ZTogIGJhc2VkIG9uIHZlcnNpb24gMS4xMi4wIG9mIHRoZSBCb29zdCBsaWJyYXJ5LgorCisjaWZuZGVmIF9CT09TVF9DT05DRVBUX0NIRUNLX0gKKyNkZWZpbmUgX0JPT1NUX0NPTkNFUFRfQ0hFQ0tfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPiAgICAvLyBmb3IgdHJhaXRzIGFuZCB0YWdzCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2RlZmluZSBfSXNVbnVzZWQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorCisvLyBXaGVuIHRoZSBDLUMgY29kZSBpcyBpbiB1c2UsIHdlIHdvdWxkIGxpa2UgdGhpcyBmdW5jdGlvbiB0byBkbyBhcyBsaXR0bGUKKy8vIGFzIHBvc3NpYmxlIGF0IHJ1bnRpbWUsIHVzZSBhcyBmZXcgcmVzb3VyY2VzIGFzIHBvc3NpYmxlLCBhbmQgaG9wZWZ1bGx5CisvLyBiZSBlbGlkZWQgb3V0IG9mIGV4aXN0ZW5jZS4uLiBobW1tLgordGVtcGxhdGUgPGNsYXNzIF9Db25jZXB0PgoraW5saW5lIHZvaWQgX19mdW5jdGlvbl9yZXF1aXJlcygpCit7CisgIHZvaWQgKF9Db25jZXB0OjoqX194KSgpIF9Jc1VudXNlZCA9ICZfQ29uY2VwdDo6X19jb25zdHJhaW50czsKK30KKworLy8gTm8gZGVmaW5pdGlvbjogaWYgdGhpcyBpcyByZWZlcmVuY2VkLCB0aGVyZSdzIGEgcHJvYmxlbSB3aXRoCisvLyB0aGUgaW5zdGFudGlhdGluZyB0eXBlIG5vdCBiZWluZyBvbmUgb2YgdGhlIHJlcXVpcmVkIGludGVnZXIgdHlwZXMuCisvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIHJlc3VsdHMgaW4gYSBsaW5rLXRpbWUgZXJyb3IsIG5vdCBhIGNvbXBpbGUtdGltZSBlcnJvci4KK3ZvaWQgX19lcnJvcl90eXBlX211c3RfYmVfYW5faW50ZWdlcl90eXBlKCk7Cit2b2lkIF9fZXJyb3JfdHlwZV9tdXN0X2JlX2FuX3Vuc2lnbmVkX2ludGVnZXJfdHlwZSgpOwordm9pZCBfX2Vycm9yX3R5cGVfbXVzdF9iZV9hX3NpZ25lZF9pbnRlZ2VyX3R5cGUoKTsKKworLy8gPz8/IFNob3VsZCB0aGUgImNvbmNlcHRfY2hlY2tpbmcqIiBzdHJ1Y3RzIGJlZ2luIHdpdGggbW9yZSB0aGFuIF8gPworI2RlZmluZSBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUyhfdHlwZV92YXIsIF9ucywgX2NvbmNlcHQpIFwKKyAgdHlwZWRlZiB2b2lkIChfbnM6Ol9jb25jZXB0IDxfdHlwZV92YXI+OjoqIF9mdW5jIyNfdHlwZV92YXIjI19jb25jZXB0KSgpOyBcCisgIHRlbXBsYXRlIDxfZnVuYyMjX3R5cGVfdmFyIyNfY29uY2VwdCBfVHAxPiBcCisgIHN0cnVjdCBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyIyNfY29uY2VwdCB7IH07IFwKKyAgdHlwZWRlZiBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyIyNfY29uY2VwdDwgXAorICAgICZfbnM6Ol9jb25jZXB0IDxfdHlwZV92YXI+OjpfX2NvbnN0cmFpbnRzPiBcCisgICAgX2NvbmNlcHRfY2hlY2tpbmdfdHlwZWRlZiMjX3R5cGVfdmFyIyNfY29uY2VwdAorCisjZGVmaW5lIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTMihfdHlwZV92YXIxLCBfdHlwZV92YXIyLCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyPjo6KiBfZnVuYyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX2NvbmNlcHQpKCk7IFwKKyAgdGVtcGxhdGUgPF9mdW5jIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfY29uY2VwdCBfVHAxPiBcCisgIHN0cnVjdCBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX2NvbmNlcHQgeyB9OyBcCisgIHR5cGVkZWYgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI19jb25jZXB0PCBcCisgICAgJl9uczo6X2NvbmNlcHQgPF90eXBlX3ZhcjEsX3R5cGVfdmFyMj46Ol9fY29uc3RyYWludHM+IFwKKyAgICBfY29uY2VwdF9jaGVja2luZ190eXBlZGVmIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfY29uY2VwdAorCisjZGVmaW5lIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTMyhfdHlwZV92YXIxLCBfdHlwZV92YXIyLCBfdHlwZV92YXIzLCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjM+OjoqIF9mdW5jIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdCkoKTsgXAorICB0ZW1wbGF0ZSA8X2Z1bmMjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI19jb25jZXB0IF9UcDE+IFwKKyAgc3RydWN0IF9jb25jZXB0X2NoZWNraW5nIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdCB7IH07IFwKKyAgdHlwZWRlZiBfY29uY2VwdF9jaGVja2luZyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX2NvbmNlcHQ8IFwKKyAgICAmX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjM+OjpfX2NvbnN0cmFpbnRzPiAgXAorICBfY29uY2VwdF9jaGVja2luZ190eXBlZGVmIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfY29uY2VwdAorCisjZGVmaW5lIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTNChfdHlwZV92YXIxLCBfdHlwZV92YXIyLCBfdHlwZV92YXIzLCBfdHlwZV92YXI0LCBfbnMsIF9jb25jZXB0KSBcCisgIHR5cGVkZWYgdm9pZCAoX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjMsX3R5cGVfdmFyND46OiogX2Z1bmMjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI190eXBlX3ZhcjQjI19jb25jZXB0KSgpOyBcCisgIHRlbXBsYXRlIDxfZnVuYyMjX3R5cGVfdmFyMSMjX3R5cGVfdmFyMiMjX3R5cGVfdmFyMyMjX3R5cGVfdmFyNCMjX2NvbmNlcHQgX1RwMT4gXAorICBzdHJ1Y3QgX2NvbmNlcHRfY2hlY2tpbmcjI190eXBlX3ZhcjEjI190eXBlX3ZhcjIjI190eXBlX3ZhcjMjI190eXBlX3ZhcjQjI19jb25jZXB0IHsgfTsgXAorICB0eXBlZGVmIF9jb25jZXB0X2NoZWNraW5nIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfdHlwZV92YXI0IyNfY29uY2VwdDwgXAorICAmX25zOjpfY29uY2VwdCA8X3R5cGVfdmFyMSxfdHlwZV92YXIyLF90eXBlX3ZhcjMsX3R5cGVfdmFyND46Ol9fY29uc3RyYWludHM+IFwKKyAgICBfY29uY2VwdF9jaGVja2luZ190eXBlZGVmIyNfdHlwZV92YXIxIyNfdHlwZV92YXIyIyNfdHlwZV92YXIzIyNfdHlwZV92YXI0IyNfY29uY2VwdAorCisKK3RlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorc3RydWN0IF9BdXhfcmVxdWlyZV9zYW1lIHsgfTsKKwordGVtcGxhdGUgPGNsYXNzIF9UcD4KK3N0cnVjdCBfQXV4X3JlcXVpcmVfc2FtZTxfVHAsX1RwPiB7IHR5cGVkZWYgX1RwIF9UeXBlOyB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICBzdHJ1Y3QgX1NhbWVUeXBlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQXV4X3JlcXVpcmVfc2FtZTxfVHAxLCBfVHAyPjo6X1R5cGUgX1JlcXVpcmVkOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0IHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Vycm9yX3R5cGVfbXVzdF9iZV9hbl9pbnRlZ2VyX3R5cGUoKTsKKyAgICB9CisgIH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8c2hvcnQ+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBzaG9ydD4geyB2b2lkIF9fY29uc3RyYWludHMoKXt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8aW50PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8dW5zaWduZWQgaW50PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfSW50ZWdlckNvbmNlcHQ8bG9uZz4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX0ludGVnZXJDb25jZXB0PHVuc2lnbmVkIGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDxsb25nIGxvbmc+IHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9JbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9TaWduZWRJbnRlZ2VyQ29uY2VwdCB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19lcnJvcl90eXBlX211c3RfYmVfYV9zaWduZWRfaW50ZWdlcl90eXBlKCk7CisgICAgfQorICB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1NpZ25lZEludGVnZXJDb25jZXB0PHNob3J0PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfU2lnbmVkSW50ZWdlckNvbmNlcHQ8aW50PiB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfU2lnbmVkSW50ZWdlckNvbmNlcHQ8bG9uZz4geyB2b2lkIF9fY29uc3RyYWludHMoKSB7fSB9OworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX1NpZ25lZEludGVnZXJDb25jZXB0PGxvbmcgbG9uZz4geyB2b2lkIF9fY29uc3RyYWludHMoKXt9fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1Vuc2lnbmVkSW50ZWdlckNvbmNlcHQgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZXJyb3JfdHlwZV9tdXN0X2JlX2FuX3Vuc2lnbmVkX2ludGVnZXJfdHlwZSgpOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0PHVuc2lnbmVkIHNob3J0PgorICAgIHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0PHVuc2lnbmVkIGludD4KKyAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisgIHRlbXBsYXRlIDw+IHN0cnVjdCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdDx1bnNpZ25lZCBsb25nPgorICAgIHsgdm9pZCBfX2NvbnN0cmFpbnRzKCkge30gfTsKKyAgdGVtcGxhdGUgPD4gc3RydWN0IF9VbnNpZ25lZEludGVnZXJDb25jZXB0PHVuc2lnbmVkIGxvbmcgbG9uZz4KKyAgICB7IHZvaWQgX19jb25zdHJhaW50cygpIHt9IH07CisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gQmFzaWMgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RwIF9fYSBfSXNVbnVzZWQ7ICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0Fzc2lnbmFibGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2EgPSBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBhc3NpZ25tZW50IG9wZXJhdG9yCisgICAgICBfX2NvbnN0X2NvbnN0cmFpbnRzKF9fYSk7CisgICAgfQorICAgIHZvaWQgX19jb25zdF9jb25zdHJhaW50cyhjb25zdCBfVHAmIF9fYikgeworICAgICAgX19hID0gX19iOyAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZXF1aXJlZCBmb3IgYXJndW1lbnQgdG8gYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19hOworICAgIC8vIHBvc3NpYmx5IHNob3VsZCBiZSAiVHAqIGE7IiBhbmQgdGhlbiBkZXJlZmVyZW5jZSAiYSIgaW4gY29uc3RyYWludAorICAgIC8vIGZ1bmN0aW9ucz8gIHByZXNlbnQgd2F5IHdvdWxkIHJlcXVpcmUgYSBkZWZhdWx0IGN0b3IsIGkgdGhpbmsuLi4KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0NvcHlDb25zdHJ1Y3RpYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RwIF9fYShfX2IpOyAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgY29weSBjb25zdHJ1Y3RvcgorICAgICAgX1RwKiBfX3B0ciBfSXNVbnVzZWQgPSAmX19hOyAgICAgIC8vIHJlcXVpcmUgYWRkcmVzcyBvZiBvcGVyYXRvcgorICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2EpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX1RwJiBfX2EpIHsKKyAgICAgIF9UcCBfX2MgX0lzVW51c2VkKF9fYSk7ICAgICAgICAgICAvLyByZXF1aXJlIGNvbnN0IGNvcHkgY29uc3RydWN0b3IKKyAgICAgIGNvbnN0IF9UcCogX19wdHIgX0lzVW51c2VkID0gJl9fYTsgLy8gcmVxdWlyZSBjb25zdCBhZGRyZXNzIG9mIG9wZXJhdG9yCisgICAgfQorICAgIF9UcCBfX2I7CisgIH07CisKKyAgLy8gVGhlIFNHSSBTVEwgdmVyc2lvbiBvZiBBc3NpZ25hYmxlIHJlcXVpcmVzIGNvcHkgY29uc3RydWN0b3IgYW5kIG9wZXJhdG9yPQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1NHSUFzc2lnbmFibGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfVHAgX19iIF9Jc1VudXNlZChfX2EpOworICAgICAgX19hID0gX19hOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2EpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX1RwJiBfX2IpIHsKKyAgICAgIF9UcCBfX2MgX0lzVW51c2VkKF9fYik7CisgICAgICBfX2EgPSBfX2I7ICAgICAgICAgICAgICAvLyBjb25zdCByZXF1aXJlZCBmb3IgYXJndW1lbnQgdG8gYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19hOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbSwgY2xhc3MgX1RvPgorICBzdHJ1Y3QgX0NvbnZlcnRpYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX1RvIF9feSBfSXNVbnVzZWQgPSBfX3g7CisgICAgfQorICAgIF9Gcm9tIF9feDsKKyAgfTsKKworICAvLyBUaGUgQysrIHN0YW5kYXJkIHJlcXVpcmVtZW50cyBmb3IgbWFueSBjb25jZXB0cyB0YWxrIGFib3V0IHJldHVybgorICAvLyB0eXBlcyB0aGF0IG11c3QgYmUgImNvbnZlcnRpYmxlIHRvIGJvb2wiLiAgVGhlIHByb2JsZW0gd2l0aCB0aGlzCisgIC8vIHJlcXVpcmVtZW50IGlzIHRoYXQgaXQgbGVhdmVzIHRoZSBkb29yIG9wZW4gZm9yIGV2aWwgcHJveGllcyB0aGF0CisgIC8vIGRlZmluZSB0aGluZ3MgbGlrZSBvcGVyYXRvcnx8IHdpdGggc3RyYW5nZSByZXR1cm4gdHlwZXMuICBUd28KKyAgLy8gcG9zc2libGUgc29sdXRpb25zIGFyZToKKyAgLy8gMSkgcmVxdWlyZSB0aGUgcmV0dXJuIHR5cGUgdG8gYmUgZXhhY3RseSBib29sCisgIC8vIDIpIHN0YXkgd2l0aCBjb252ZXJ0aWJsZSB0byBib29sLCBhbmQgYWxzbworICAvLyAgICBzcGVjaWZ5IHN0dWZmIGFib3V0IGFsbCB0aGUgbG9naWNhbCBvcGVyYXRvcnMuCisgIC8vIEZvciBub3cgd2UganVzdCB0ZXN0IGZvciBjb252ZXJ0aWJsZSB0byBib29sLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICB2b2lkIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKGNvbnN0IF9UcCYgX190KSB7CisgICAgYm9vbCBfX3ggX0lzVW51c2VkID0gX190OworICB9CisKKy8vIEZJWE1FCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19hID09IF9fYik7CisgICAgfQorICAgIF9UcCBfX2EsIF9fYjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA8IF9fYik7CisgICAgfQorICAgIF9UcCBfX2EsIF9fYjsKKyAgfTsKKworICAvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gU0dJIFNUTCdzIExlc3NUaGFuQ29tcGFyYWJsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Db21wYXJhYmxlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19hIDwgX19iKTsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA+IF9fYik7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2EgPD0gX19iKTsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fYSA+PSBfX2IpOworICAgIH0KKyAgICBfVHAgX19hLCBfX2I7CisgIH07CisKKyNkZWZpbmUgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9QUkVESUNBVEVfT1BfQ09OU1RSQUlOVChfT1AsX05BTUUpIFwKKyAgdGVtcGxhdGUgPGNsYXNzIF9GaXJzdCwgY2xhc3MgX1NlY29uZD4gXAorICBzdHJ1Y3QgX05BTUUgeyBcCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeyAodm9pZClfX2NvbnN0cmFpbnRzXygpOyB9IFwKKyAgICBib29sIF9fY29uc3RyYWludHNfKCkgeyAgXAorICAgICAgcmV0dXJuICBfX2EgX09QIF9fYjsgXAorICAgIH0gXAorICAgIF9GaXJzdCBfX2E7IFwKKyAgICBfU2Vjb25kIF9fYjsgXAorICB9CisKKyNkZWZpbmUgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKF9PUCxfTkFNRSkgXAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPiBcCisgIHN0cnVjdCBfTkFNRSB7IFwKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7ICh2b2lkKV9fY29uc3RyYWludHNfKCk7IH0gXAorICAgIF9SZXQgX19jb25zdHJhaW50c18oKSB7ICBcCisgICAgICByZXR1cm4gX19hIF9PUCBfX2I7IFwKKyAgICB9IFwKKyAgICBfRmlyc3QgX19hOyBcCisgICAgX1NlY29uZCBfX2I7IFwKKyAgfQorCisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPT0sIF9FcXVhbE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoIT0sIF9Ob3RFcXVhbE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPCwgX0xlc3NUaGFuT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9QUkVESUNBVEVfT1BfQ09OU1RSQUlOVCg8PSwgX0xlc3NFcXVhbE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQoPiwgX0dyZWF0ZXJUaGFuT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9QUkVESUNBVEVfT1BfQ09OU1RSQUlOVCg+PSwgX0dyZWF0ZXJFcXVhbE9wQ29uY2VwdCk7CisKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKCssIF9QbHVzT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKCosIF9UaW1lc09wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCgvLCBfRGl2aWRlT3BDb25jZXB0KTsKKyAgX0dMSUJDWFhfREVGSU5FX0JJTkFSWV9PUEVSQVRPUl9DT05TVFJBSU5UKC0sIF9TdWJ0cmFjdE9wQ29uY2VwdCk7CisgIF9HTElCQ1hYX0RFRklORV9CSU5BUllfT1BFUkFUT1JfQ09OU1RSQUlOVCglLCBfTW9kT3BDb25jZXB0KTsKKworI3VuZGVmIF9HTElCQ1hYX0RFRklORV9CSU5BUllfUFJFRElDQVRFX09QX0NPTlNUUkFJTlQKKyN1bmRlZiBfR0xJQkNYWF9ERUZJTkVfQklOQVJZX09QRVJBVE9SX0NPTlNUUkFJTlQKKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBGdW5jdGlvbiBPYmplY3QgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9SZXR1cm4+CisgIHN0cnVjdCBfR2VuZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgY29uc3QgX1JldHVybiYgX19yIF9Jc1VudXNlZCA9IF9fZigpOy8vIHJlcXVpcmUgb3BlcmF0b3IoKSBtZW1iZXIgZnVuY3Rpb24KKyAgICB9CisgICAgX0Z1bmMgX19mOworICB9OworCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jPgorICBzdHJ1Y3QgX0dlbmVyYXRvckNvbmNlcHQ8X0Z1bmMsdm9pZD4KKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIG9wZXJhdG9yKCkgbWVtYmVyIGZ1bmN0aW9uCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9SZXR1cm4sIGNsYXNzIF9Bcmc+CisgIHN0cnVjdCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fciA9IF9fZihfX2FyZyk7ICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBvcGVyYXRvcigpCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfQXJnIF9fYXJnOworICAgIF9SZXR1cm4gX19yOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0FyZz4KKyAgc3RydWN0IF9VbmFyeUZ1bmN0aW9uQ29uY2VwdDxfRnVuYywgdm9pZCwgX0FyZz4geworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZihfX2FyZyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIG9wZXJhdG9yKCkKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9BcmcgX19hcmc7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfUmV0dXJuLCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+CisgIHN0cnVjdCBfQmluYXJ5RnVuY3Rpb25Db25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX3IgPSBfX2YoX19maXJzdCwgX19zZWNvbmQpOyAgICAgLy8gcmVxdWlyZSBvcGVyYXRvcigpCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfRmlyc3QgX19maXJzdDsKKyAgICBfU2Vjb25kIF9fc2Vjb25kOworICAgIF9SZXR1cm4gX19yOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorICBzdHJ1Y3QgX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdDxfRnVuYywgdm9pZCwgX0ZpcnN0LCBfU2Vjb25kPgorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mKF9fZmlyc3QsIF9fc2Vjb25kKTsgICAgICAgICAgIC8vIHJlcXVpcmUgb3BlcmF0b3IoKQorICAgIH0KKyAgICBfRnVuYyBfX2Y7CisgICAgX0ZpcnN0IF9fZmlyc3Q7CisgICAgX1NlY29uZCBfX3NlY29uZDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0Z1bmMsIGNsYXNzIF9Bcmc+CisgIHN0cnVjdCBfVW5hcnlQcmVkaWNhdGVDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2F1eF9yZXF1aXJlX2Jvb2xlYW5fZXhwcihfX2YoX19hcmcpKTsgLy8gcmVxdWlyZSBvcCgpIHJldHVybmluZyBib29sCisgICAgfQorICAgIF9GdW5jIF9fZjsKKyAgICBfQXJnIF9fYXJnOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnVuYywgY2xhc3MgX0ZpcnN0LCBjbGFzcyBfU2Vjb25kPgorICBzdHJ1Y3QgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fYXV4X3JlcXVpcmVfYm9vbGVhbl9leHByKF9fZihfX2EsIF9fYikpOyAvLyByZXF1aXJlIG9wKCkgcmV0dXJuaW5nIGJvb2wKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9GaXJzdCBfX2E7CisgICAgX1NlY29uZCBfX2I7CisgIH07CisKKyAgLy8gdXNlIHRoaXMgd2hlbiBmdW5jdG9yIGlzIHVzZWQgaW5zaWRlIGEgY29udGFpbmVyIGNsYXNzIGxpa2Ugc3RkOjpzZXQKKyAgdGVtcGxhdGUgPGNsYXNzIF9GdW5jLCBjbGFzcyBfRmlyc3QsIGNsYXNzIF9TZWNvbmQ+CisgIHN0cnVjdCBfQ29uc3RfQmluYXJ5UHJlZGljYXRlQ29uY2VwdCB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19jb25zdF9jb25zdHJhaW50cyhfX2YpOworICAgIH0KKyAgICB2b2lkIF9fY29uc3RfY29uc3RyYWludHMoY29uc3QgX0Z1bmMmIF9fZnVuKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9GdW5jLCBfRmlyc3QsIF9TZWNvbmQ+ID4oKTsKKyAgICAgIC8vIG9wZXJhdG9yKCkgbXVzdCBiZSBhIGNvbnN0IG1lbWJlciBmdW5jdGlvbgorICAgICAgX19hdXhfcmVxdWlyZV9ib29sZWFuX2V4cHIoX19mdW4oX19hLCBfX2IpKTsKKyAgICB9CisgICAgX0Z1bmMgX19mOworICAgIF9GaXJzdCBfX2E7CisgICAgX1NlY29uZCBfX2I7CisgIH07CisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gSXRlcmF0b3IgQ29uY2VwdHMKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKy8vICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQXNzaWduYWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDxfVHA+ID4oKTsKKy8vICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+Ojp2YWx1ZV90eXBlIF9WOworICAgICAgKHZvaWQpKl9faTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGVyZWZlcmVuY2Ugb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX011dGFibGVfVHJpdmlhbEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAqX19pID0gKl9fajsgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBkZXJlZmVyZW5jZSBhbmQgYXNzaWdubWVudAorICAgIH0KKyAgICBfVHAgX19pLCBfX2o7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9JbnB1dEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1RyaXZpYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAvLyByZXF1aXJlIGl0ZXJhdG9yX3RyYWl0cyB0eXBlZGVmJ3MKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6ZGlmZmVyZW5jZV90eXBlIF9EaWZmOworLy8gICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfU2lnbmVkSW50ZWdlckNvbmNlcHQ8X0RpZmY+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6cmVmZXJlbmNlIF9SZWY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9UcD46OnBvaW50ZXIgX1B0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjppdGVyYXRvcl9jYXRlZ29yeSBfQ2F0OworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPiA+KCk7CisgICAgICArK19faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwcmVpbmNyZW1lbnQgb3BlcmF0b3IKKyAgICAgIF9faSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHBvc3RpbmNyZW1lbnQgb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfVmFsdWVUPgorICBzdHJ1Y3QgX091dHB1dEl0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0Fzc2lnbmFibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgKytfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcHJlaW5jcmVtZW50IG9wZXJhdG9yCisgICAgICBfX2krKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0aW5jcmVtZW50IG9wZXJhdG9yCisgICAgICAqX19pKysgPSBfX3Q7ICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0aW5jcmVtZW50IGFuZCBhc3NpZ25tZW50CisgICAgfQorICAgIF9UcCBfX2k7CisgICAgX1ZhbHVlVCBfX3Q7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgc3RydWN0IF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRGVmYXVsdENvbnN0cnVjdGlibGVDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6cmVmZXJlbmNlIF9SZWY7CisgICAgICBfUmVmIF9fciBfSXNVbnVzZWQgPSAqX19pOworICAgIH0KKyAgICBfVHAgX19pOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgICpfX2krKyA9ICpfX2k7ICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHBvc3RpbmNyZW1lbnQgYW5kIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9faTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnZlcnRpYmxlQ29uY2VwdDwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1RwPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWc+ID4oKTsKKyAgICAgIC0tX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHByZWRlY3JlbWVudCBvcGVyYXRvcgorICAgICAgX19pLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgcG9zdGRlY3JlbWVudCBvcGVyYXRvcgorICAgIH0KKyAgICBfVHAgX19pOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfVHA+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICAqX19pLS0gPSAqX19pOyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSBwb3N0ZGVjcmVtZW50IGFuZCBhc3NpZ25tZW50CisgICAgfQorICAgIF9UcCBfX2k7CisgIH07CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICBzdHJ1Y3QgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQ29tcGFyYWJsZUNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQ29udmVydGlibGVDb25jZXB0PAorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4gPigpOworICAgICAgLy8gPz8/IFdlIGRvbid0IHVzZSBfUmVmLCBhcmUgd2UganVzdCBjaGVja2luZyBmb3IgInJlZmVyZW5jZWFiaWxpdHkiPworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjpyZWZlcmVuY2UgX1JlZjsKKworICAgICAgX19pICs9IF9fbjsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgYXNzaWdubWVudCBhZGRpdGlvbiBvcGVyYXRvcgorICAgICAgX19pID0gX19pICsgX19uOyBfX2kgPSBfX24gKyBfX2k7IC8vIHJlcXVpcmUgYWRkaXRpb24gd2l0aCBkaWZmZXJlbmNlIHR5cGUKKyAgICAgIF9faSAtPSBfX247ICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIGFzc2lnbm1lbnQgc3VidHJhY3Rpb24gb3AKKyAgICAgIF9faSA9IF9faSAtIF9fbjsgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlIHN1YnRyYWN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGRpZmZlcmVuY2UgdHlwZQorICAgICAgX19uID0gX19pIC0gX19qOyAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZGlmZmVyZW5jZSBvcGVyYXRvcgorICAgICAgKHZvaWQpX19pW19fbl07ICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZWxlbWVudCBhY2Nlc3Mgb3BlcmF0b3IKKyAgICB9CisgICAgX1RwIF9fYSwgX19iOworICAgIF9UcCBfX2ksIF9fajsKKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjpkaWZmZXJlbmNlX3R5cGUgX19uOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgIHN0cnVjdCBfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQKKyAgeworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8X1RwPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9UcD4gPigpOworICAgICAgX19pW19fbl0gPSAqX19pOyAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmUgZWxlbWVudCBhY2Nlc3MgYW5kIGFzc2lnbm1lbnQKKyAgICB9CisgICAgX1RwIF9faTsKKyAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfVHA+OjpkaWZmZXJlbmNlX3R5cGUgX19uOworICB9OworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIENvbnRhaW5lciBDb25jZXB0cworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorICBzdHJ1Y3QgX0NvbnRhaW5lckNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSBfVmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6c2l6ZV90eXBlIF9TaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Db250YWluZXI6OmNvbnN0X3BvaW50ZXIgX0NvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBfQ29uc3RfaXRlcmF0b3I7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X2l0ZXJhdG9yPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQXNzaWduYWJsZUNvbmNlcHQ8X0NvbnRhaW5lcj4gPigpOworICAgICAgY29uc3QgX0NvbnRhaW5lciBfX2M7CisgICAgICBfX2kgPSBfX2MuYmVnaW4oKTsKKyAgICAgIF9faSA9IF9fYy5lbmQoKTsKKyAgICAgIF9fbiA9IF9fYy5zaXplKCk7CisgICAgICBfX24gPSBfX2MubWF4X3NpemUoKTsKKyAgICAgIF9fYiA9IF9fYy5lbXB0eSgpOworICAgIH0KKyAgICBib29sIF9fYjsKKyAgICBfQ29uc3RfaXRlcmF0b3IgX19pOworICAgIF9TaXplX3R5cGUgX19uOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgorICBzdHJ1Y3QgX011dGFibGVfQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlIF9WYWx1ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cmVmZXJlbmNlIF9SZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjpwb2ludGVyIF9Qb2ludGVyOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0NvbnRhaW5lckNvbmNlcHQ8X0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0Fzc2lnbmFibGVDb25jZXB0PF9WYWx1ZV90eXBlPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIF9faSA9IF9fYy5iZWdpbigpOworICAgICAgX19pID0gX19jLmVuZCgpOworICAgICAgX19jLnN3YXAoX19jMik7CisgICAgfQorICAgIF9JdGVyYXRvciBfX2k7CisgICAgX0NvbnRhaW5lciBfX2MsIF9fYzI7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkQ29udGFpbmVyPgorICBzdHJ1Y3QgX0ZvcndhcmRDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQ29udGFpbmVyQ29uY2VwdDxfRm9yd2FyZENvbnRhaW5lcj4gPigpOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRm9yd2FyZENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X2l0ZXJhdG9yPiA+KCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZENvbnRhaW5lcj4KKyAgc3RydWN0IF9NdXRhYmxlX0ZvcndhcmRDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfRm9yd2FyZENvbnRhaW5lckNvbmNlcHQ8X0ZvcndhcmRDb250YWluZXI+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0NvbnRhaW5lckNvbmNlcHQ8X0ZvcndhcmRDb250YWluZXI+ID4oKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0ZvcndhcmRDb250YWluZXI6Oml0ZXJhdG9yIF9JdGVyYXRvcjsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0l0ZXJhdG9yPiA+KCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV2ZXJzaWJsZUNvbnRhaW5lcj4KKyAgc3RydWN0IF9SZXZlcnNpYmxlQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmV2ZXJzaWJsZUNvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JldmVyc2libGVDb250YWluZXI6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0ZvcndhcmRDb250YWluZXJDb25jZXB0PF9SZXZlcnNpYmxlQ29udGFpbmVyPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPCBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQ29uc3RfaXRlcmF0b3I+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIGNvbnN0IF9SZXZlcnNpYmxlQ29udGFpbmVyIF9fYzsKKyAgICAgIF9Db25zdF9yZXZlcnNlX2l0ZXJhdG9yIF9faSA9IF9fYy5yYmVnaW4oKTsKKyAgICAgIF9faSA9IF9fYy5yZW5kKCk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV2ZXJzaWJsZUNvbnRhaW5lcj4KKyAgc3RydWN0IF9NdXRhYmxlX1JldmVyc2libGVDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXZlcnNpYmxlQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmV2ZXJzaWJsZUNvbnRhaW5lcjo6cmV2ZXJzZV9pdGVyYXRvciBfUmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8X1JldmVyc2libGVDb250YWluZXJDb25jZXB0PF9SZXZlcnNpYmxlQ29udGFpbmVyPiA+KCk7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPAorICAgICAgICBfTXV0YWJsZV9Gb3J3YXJkQ29udGFpbmVyQ29uY2VwdDxfUmV2ZXJzaWJsZUNvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczxfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9JdGVyYXRvcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfUmV2ZXJzZV9pdGVyYXRvcj4gPigpOworCisgICAgICBfUmV2ZXJzZV9pdGVyYXRvciBfX2kgPSBfX2MucmJlZ2luKCk7CisgICAgICBfX2kgPSBfX2MucmVuZCgpOworICAgIH0KKyAgICBfUmV2ZXJzaWJsZUNvbnRhaW5lciBfX2M7CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NDb250YWluZXI+CisgIHN0cnVjdCBfUmFuZG9tQWNjZXNzQ29udGFpbmVyQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjpzaXplX3R5cGUgX1NpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OmNvbnN0X3JlZmVyZW5jZSBfQ29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgX0NvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgX0NvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICB2b2lkIF9fY29uc3RyYWludHMoKSB7CisgICAgICBfX2Z1bmN0aW9uX3JlcXVpcmVzPAorICAgICAgICBfUmV2ZXJzaWJsZUNvbnRhaW5lckNvbmNlcHQ8X1JhbmRvbUFjY2Vzc0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDxfQ29uc3RfaXRlcmF0b3I+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8CisgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8X0NvbnN0X3JldmVyc2VfaXRlcmF0b3I+ID4oKTsKKworICAgICAgY29uc3QgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lciBfX2M7CisgICAgICBfQ29uc3RfcmVmZXJlbmNlIF9fciBfSXNVbnVzZWQgPSBfX2NbX19uXTsKKyAgICB9CisgICAgX1NpemVfdHlwZSBfX247CisgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NDb250YWluZXI+CisgIHN0cnVjdCBfTXV0YWJsZV9SYW5kb21BY2Nlc3NDb250YWluZXJDb25jZXB0CisgIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NDb250YWluZXI6OnNpemVfdHlwZSBfU2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lcjo6cmVmZXJlbmNlIF9SZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjppdGVyYXRvciBfSXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzQ29udGFpbmVyOjpyZXZlcnNlX2l0ZXJhdG9yIF9SZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX1JhbmRvbUFjY2Vzc0NvbnRhaW5lckNvbmNlcHQ8X1JhbmRvbUFjY2Vzc0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfUmV2ZXJzaWJsZUNvbnRhaW5lckNvbmNlcHQ8X1JhbmRvbUFjY2Vzc0NvbnRhaW5lcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PF9JdGVyYXRvcj4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwKKyAgICAgICAgX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PF9SZXZlcnNlX2l0ZXJhdG9yPiA+KCk7CisKKyAgICAgIF9SZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fY1tfX2ldOworICAgIH0KKyAgICBfU2l6ZV90eXBlIF9faTsKKyAgICBfUmFuZG9tQWNjZXNzQ29udGFpbmVyIF9fYzsKKyAgfTsKKworICAvLyBBIFNlcXVlbmNlIGlzIGluaGVyZW50bHkgbXV0YWJsZQorICB0ZW1wbGF0ZSA8Y2xhc3MgX1NlcXVlbmNlPgorICBzdHJ1Y3QgX1NlcXVlbmNlQ29uY2VwdAorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSBfUmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIC8vIE1hdHQgQXVzdGVybidzIGJvb2sgcHV0cyBEZWZhdWx0Q29uc3RydWN0aWJsZSBoZXJlLCB0aGUgQysrCisgICAgICAvLyBzdGFuZGFyZCBwbGFjZXMgaXQgaW4gQ29udGFpbmVyCisgICAgICAvLyAgICBmdW5jdGlvbl9yZXF1aXJlczwgRGVmYXVsdENvbnN0cnVjdGlibGU8U2VxdWVuY2U+ID4oKTsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9NdXRhYmxlX0ZvcndhcmRDb250YWluZXJDb25jZXB0PF9TZXF1ZW5jZT4gPigpOworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX0RlZmF1bHRDb25zdHJ1Y3RpYmxlQ29uY2VwdDxfU2VxdWVuY2U+ID4oKTsKKworICAgICAgX1NlcXVlbmNlCisJX19jIF9Jc1VudXNlZChfX24sIF9fdCksCisgICAgICAgIF9fYzIgX0lzVW51c2VkKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9fYy5pbnNlcnQoX19wLCBfX3QpOworICAgICAgX19jLmluc2VydChfX3AsIF9fbiwgX190KTsKKyAgICAgIF9fYy5pbnNlcnQoX19wLCBfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfX2MuZXJhc2UoX19wKTsKKyAgICAgIF9fYy5lcmFzZShfX3AsIF9fcSk7CisKKyAgICAgIF9SZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5mcm9udCgpOworCisgICAgICBfX2NvbnN0X2NvbnN0cmFpbnRzKF9fYyk7CisgICAgfQorICAgIHZvaWQgX19jb25zdF9jb25zdHJhaW50cyhjb25zdCBfU2VxdWVuY2UmIF9fYykgeworICAgICAgX0NvbnN0X3JlZmVyZW5jZSBfX3IgX0lzVW51c2VkID0gX19jLmZyb250KCk7CisgICAgfQorICAgIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSBfX3Q7CisgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjpzaXplX3R5cGUgX19uOworICAgIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAqX19maXJzdCwgKl9fbGFzdDsKKyAgICB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yIF9fcCwgX19xOworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZT4KKyAgc3RydWN0IF9Gcm9udEluc2VydGlvblNlcXVlbmNlQ29uY2VwdAorICB7CisgICAgdm9pZCBfX2NvbnN0cmFpbnRzKCkgeworICAgICAgX19mdW5jdGlvbl9yZXF1aXJlczwgX1NlcXVlbmNlQ29uY2VwdDxfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZT4gPigpOworCisgICAgICBfX2MucHVzaF9mcm9udChfX3QpOworICAgICAgX19jLnBvcF9mcm9udCgpOworICAgIH0KKyAgICBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZSBfX2M7CisgICAgdHlwZW5hbWUgX0Zyb250SW5zZXJ0aW9uU2VxdWVuY2U6OnZhbHVlX3R5cGUgX190OworICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfQmFja0luc2VydGlvblNlcXVlbmNlPgorICBzdHJ1Y3QgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQKKyAgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0JhY2tJbnNlcnRpb25TZXF1ZW5jZTo6cmVmZXJlbmNlIF9SZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFja0luc2VydGlvblNlcXVlbmNlOjpjb25zdF9yZWZlcmVuY2UgX0NvbnN0X3JlZmVyZW5jZTsKKworICAgIHZvaWQgX19jb25zdHJhaW50cygpIHsKKyAgICAgIF9fZnVuY3Rpb25fcmVxdWlyZXM8IF9TZXF1ZW5jZUNvbmNlcHQ8X0JhY2tJbnNlcnRpb25TZXF1ZW5jZT4gPigpOworCisgICAgICBfX2MucHVzaF9iYWNrKF9fdCk7CisgICAgICBfX2MucG9wX2JhY2soKTsKKyAgICAgIF9SZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5iYWNrKCk7CisgICAgfQorICAgIHZvaWQgX19jb25zdF9jb25zdHJhaW50cyhjb25zdCBfQmFja0luc2VydGlvblNlcXVlbmNlJiBfX2MpIHsKKyAgICAgIF9Db25zdF9yZWZlcmVuY2UgX19yIF9Jc1VudXNlZCA9IF9fYy5iYWNrKCk7CisgICAgfTsKKyAgICBfQmFja0luc2VydGlvblNlcXVlbmNlIF9fYzsKKyAgICB0eXBlbmFtZSBfQmFja0luc2VydGlvblNlcXVlbmNlOjp2YWx1ZV90eXBlIF9fdDsKKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjdW5kZWYgX0lzVW51c2VkCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9CT09TVF9DT05DRVBUX0NIRUNLCisKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2MrKzB4X3dhcm5pbmcuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jKysweF93YXJuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwNzJkMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jKysweF93YXJuaW5nLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrKzB4X3dhcm5pbmcuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9DWFgwWF9XQVJOSU5HX0gKKyNkZWZpbmUgX0NYWDBYX1dBUk5JTkdfSCAxCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyNlcnJvciBUaGlzIGZpbGUgcmVxdWlyZXMgY29tcGlsZXIgYW5kIGxpYnJhcnkgc3VwcG9ydCBmb3IgdGhlIFwKK0lTTyBDKysgMjAxMSBzdGFuZGFyZC4gVGhpcyBzdXBwb3J0IGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwsIGFuZCBtdXN0IGJlIFwKK2VuYWJsZWQgd2l0aCB0aGUgLXN0ZD1jKysxMSBvciAtc3RkPWdudSsrMTEgY29tcGlsZXIgb3B0aW9ucy4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jaGFyX3RyYWl0cy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2NoYXJfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNTFkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jaGFyX3RyYWl0cy5oCkBAIC0wLDAgKzEsNTc1IEBACisvLyBDaGFyYWN0ZXIgVHJhaXRzIGZvciB1c2UgYnkgc3RhbmRhcmQgc3RyaW5nIGFuZCBpb3N0cmVhbSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jaGFyX3RyYWl0cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSAgU3RyaW5ncyBsaWJyYXJ5CisvLworCisjaWZuZGVmIF9DSEFSX1RSQUlUU19ICisjZGVmaW5lIF9DSEFSX1RSQUlUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4gIC8vIHN0ZDo6Y29weSwgc3RkOjpmaWxsX24KKyNpbmNsdWRlIDxiaXRzL3Bvc3R5cGVzLmg+ICAgICAgLy8gRm9yIHN0cmVhbXBvcworI2luY2x1ZGUgPGN3Y2hhcj4gICAgICAgICAgICAgICAvLyBGb3IgV0VPRiwgd21lbW1vdmUsIHdtZW1zZXQsIGV0Yy4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBNYXBwaW5nIGZyb20gY2hhcmFjdGVyIHR5cGUgdG8gYXNzb2NpYXRlZCB0eXBlcy4KKyAgICoKKyAgICogIEBub3RlIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBnZW5lcmljIHZlcnNpb24KKyAgICogIG9mIGNoYXJfdHJhaXRzLiAgSXQgZGVmaW5lcyBpbnRfdHlwZSwgb2ZmX3R5cGUsIHBvc190eXBlLCBhbmQKKyAgICogIHN0YXRlX3R5cGUuICBCeSBkZWZhdWx0IHRoZXNlIGFyZSB1bnNpZ25lZCBsb25nLCBzdHJlYW1vZmYsCisgICAqICBzdHJlYW1wb3MsIGFuZCBtYnN0YXRlX3QuICBVc2VycyB3aG8gbmVlZCBhIGRpZmZlcmVudCBzZXQgb2YKKyAgICogIHR5cGVzLCBidXQgd2hvIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9ucyBvZiBhbnkgZnVuY3Rpb24KKyAgICogIGRlZmluZWQgaW4gY2hhcl90cmFpdHMsIGNhbiBzcGVjaWFsaXplIF9fZ251X2N4eDo6X0NoYXJfdHlwZXMKKyAgICogIHdoaWxlIGxlYXZpbmcgX19nbnVfY3h4OjpjaGFyX3RyYWl0cyBhbG9uZS4gKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHN0cnVjdCBfQ2hhcl90eXBlcworICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIGludF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnN0cmVhbXBvcyAgcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtb2ZmICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjptYnN0YXRlX3QgIHN0YXRlX3R5cGU7CisgICAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBCYXNlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IHN0ZDo6Y2hhcl90cmFpdHMuCisgICAqCisgICAqICBAbm90ZSBGb3IgYW55IGdpdmVuIGFjdHVhbCBjaGFyYWN0ZXIgdHlwZSwgdGhpcyBkZWZpbml0aW9uIGlzCisgICAqICBwcm9iYWJseSB3cm9uZy4gIChNb3N0IG9mIHRoZSBtZW1iZXIgZnVuY3Rpb25zIGFyZSBsaWtlbHkgdG8gYmUKKyAgICogIHJpZ2h0LCBidXQgdGhlIGludF90eXBlIGFuZCBzdGF0ZV90eXBlIHR5cGVkZWZzLCBhbmQgdGhlIGVvZigpCisgICAqICBtZW1iZXIgZnVuY3Rpb24sIGFyZSBsaWtlbHkgdG8gYmUgd3JvbmcuKSAgVGhlIHJlYXNvbiB0aGlzIGNsYXNzCisgICAqICBleGlzdHMgaXMgc28gdXNlcnMgY2FuIHNwZWNpYWxpemUgaXQuICBDbGFzc2VzIGluIG5hbWVzcGFjZSBzdGQKKyAgICogIG1heSBub3QgYmUgc3BlY2lhbGl6ZWQgZm9yIGZ1bmRhbWVudGFsIHR5cGVzLCBidXQgY2xhc3NlcyBpbgorICAgKiAgbmFtZXNwYWNlIF9fZ251X2N4eCBtYXkgYmUuCisgICAqCisgICAqICBTZWUgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwNWNoMTNzMDMuaHRtbAorICAgKiAgZm9yIGFkdmljZSBvbiBob3cgdG8gbWFrZSB1c2Ugb2YgdGhpcyBjbGFzcyBmb3IgQGEgdW51c3VhbCBjaGFyYWN0ZXIKKyAgICogIHR5cGVzLiBBbHNvLCBjaGVjayBvdXQgaW5jbHVkZS9leHQvcG9kX2NoYXJfdHJhaXRzLmguICAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHMKKyAgICB7CisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJfdHlwZXM8X0NoYXJUPjo6aW50X3R5cGUgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyX3R5cGVzPF9DaGFyVD46OnBvc190eXBlICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhcl90eXBlczxfQ2hhclQ+OjpvZmZfdHlwZSAgICBvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJfdHlwZXM8X0NoYXJUPjo6c3RhdGVfdHlwZSAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKTsKKworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpOworCisgICAgICBzdGF0aWMgY29uc3QgY2hhcl90eXBlKgorICAgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RkOjpzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSk7CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzdGQ6OnNpemVfdCBfX24pOworCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc3RkOjpzaXplX3QgX19uKTsKKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc3RkOjpzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyX3R5cGUKKyAgICAgIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlPihfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgZW9mKCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPihfR0xJQkNYWF9TVERJT19FT0YpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuICFlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IF9fYyA6IHRvX2ludF90eXBlKGNoYXJfdHlwZSgpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGludAorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbikKKyAgICB7CisgICAgICBmb3IgKHN0ZDo6c2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJaWYgKGx0KF9fczFbX19pXSwgX19zMltfX2ldKSkKKwkgIHJldHVybiAtMTsKKwllbHNlIGlmIChsdChfX3MyW19faV0sIF9fczFbX19pXSkpCisJICByZXR1cm4gMTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RkOjpzaXplX3QKKyAgICBjaGFyX3RyYWl0czxfQ2hhclQ+OjoKKyAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3ApCisgICAgeworICAgICAgc3RkOjpzaXplX3QgX19pID0gMDsKKyAgICAgIHdoaWxlICghZXEoX19wW19faV0sIGNoYXJfdHlwZSgpKSkKKyAgICAgICAgKytfX2k7CisgICAgICByZXR1cm4gX19pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY29uc3QgdHlwZW5hbWUgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y2hhcl90eXBlKgorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0ZDo6c2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCisgICAgeworICAgICAgZm9yIChzdGQ6OnNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorICAgICAgICBpZiAoZXEoX19zW19faV0sIF9fYSkpCisgICAgICAgICAgcmV0dXJuIF9fcyArIF9faTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y2hhcl90eXBlKgorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbikKKyAgICB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX21lbW1vdmUoX19zMSwgX19zMiwKKwkJCQkJCSAgICBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y2hhcl90eXBlKgorICAgIGNoYXJfdHJhaXRzPF9DaGFyVD46OgorICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHN0ZDo6c2l6ZV90IF9fbikKKyAgICB7CisgICAgICAvLyBOQjogSW5saW5lIHN0ZDo6Y29weSBzbyBubyByZWN1cnNpdmUgZGVwZW5kZW5jaWVzLgorICAgICAgc3RkOjpjb3B5KF9fczIsIF9fczIgKyBfX24sIF9fczEpOworICAgICAgcmV0dXJuIF9fczE7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpjaGFyX3R5cGUqCisgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6CisgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzdGQ6OnNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgeworICAgICAgLy8gTkI6IElubGluZSBzdGQ6OmZpbGxfbiBzbyBubyByZWN1cnNpdmUgZGVwZW5kZW5jaWVzLgorICAgICAgc3RkOjpmaWxsX24oX19zLCBfX24sIF9fYSk7CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjEuMQorICAvKioKKyAgICogIEBicmllZiAgQmFzaXMgZm9yIGV4cGxpY2l0IHRyYWl0cyBzcGVjaWFsaXphdGlvbnMuCisgICAqCisgICAqICBAbm90ZSAgRm9yIGFueSBnaXZlbiBhY3R1YWwgY2hhcmFjdGVyIHR5cGUsIHRoaXMgZGVmaW5pdGlvbiBpcworICAgKiAgcHJvYmFibHkgd3JvbmcuICBTaW5jZSB0aGlzIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgYXJvdW5kCisgICAqICBfX2dudV9jeHg6OmNoYXJfdHJhaXRzLCBpdCBpcyBwb3NzaWJsZSB0byBhY2hpZXZlIGEgbW9yZQorICAgKiAgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbiBieSBzcGVjaWFsaXppbmcgX19nbnVfY3h4OjpjaGFyX3RyYWl0cy4KKyAgICoKKyAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA1Y2gxM3MwMy5odG1sCisgICAqICBmb3IgYWR2aWNlIG9uIGhvdyB0byBtYWtlIHVzZSBvZiB0aGlzIGNsYXNzIGZvciBAYSB1bnVzdWFsIGNoYXJhY3RlcgorICAgKiAgdHlwZXMuIEFsc28sIGNoZWNrIG91dCBpbmNsdWRlL2V4dC9wb2RfY2hhcl90cmFpdHMuaC4KKyAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorICAgIHN0cnVjdCBjaGFyX3RyYWl0cyA6IHB1YmxpYyBfX2dudV9jeHg6OmNoYXJfdHJhaXRzPF9DaGFyVD4KKyAgICB7IH07CisKKworICAvLy8gMjEuMS4zLjEgIGNoYXJfdHJhaXRzIHNwZWNpYWxpemF0aW9ucworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzPGNoYXI+CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGludCAgICAgICAgICAgICAgIGludF90eXBlOworICAgICAgdHlwZWRlZiBzdHJlYW1wb3MgICAgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgICAgb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIG1ic3RhdGVfdCAgICAgICAgIHN0YXRlX3R5cGU7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBhc3NpZ24oY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgICAgICB7IF9fYzEgPSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBsdChjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPCBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBfX2J1aWx0aW5fbWVtY21wKF9fczEsIF9fczIsIF9fbik7IH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQorICAgICAgeyByZXR1cm4gX19idWlsdGluX3N0cmxlbihfX3MpOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IGNoYXJfdHlwZSo+KF9fYnVpbHRpbl9tZW1jaHIoX19zLCBfX2EsIF9fbikpOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4oX19idWlsdGluX21lbW1vdmUoX19zMSwgX19zMiwgX19uKSk7IH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPihfX2J1aWx0aW5fbWVtY3B5KF9fczEsIF9fczIsIF9fbikpOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPihfX2J1aWx0aW5fbWVtc2V0KF9fcywgX19hLCBfX24pKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGU+KF9fYyk7IH0KKworICAgICAgLy8gVG8ga2VlcCBib3RoIHRoZSBieXRlIDB4ZmYgYW5kIHRoZSBlb2Ygc3ltYm9sIDB4ZmZmZmZmZmYKKyAgICAgIC8vIGZyb20gZW5kaW5nIHVwIGFzIDB4ZmZmZmZmZmYuCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxX2ludF90eXBlKGNvbnN0IGludF90eXBlJiBfX2MxLCBjb25zdCBpbnRfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBlb2YoKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50X3R5cGU+KF9HTElCQ1hYX1NURElPX0VPRik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gKF9fYyA9PSBlb2YoKSkgPyAwIDogX19jOyB9CisgIH07CisKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyAyMS4xLjMuMiAgY2hhcl90cmFpdHMgc3BlY2lhbGl6YXRpb25zCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY2hhcl90cmFpdHM8d2NoYXJfdD4KKyAgICB7CisgICAgICB0eXBlZGVmIHdjaGFyX3QgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgd2ludF90ICAgICAgICAgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiB3c3RyZWFtcG9zICAgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90ICAgICAgICAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIHdtZW1jbXAoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCisgICAgICB7IHJldHVybiB3Y3NsZW4oX19zKTsgfQorCisgICAgICBzdGF0aWMgY29uc3QgY2hhcl90eXBlKgorICAgICAgZmluZChjb25zdCBjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY29uc3QgY2hhcl90eXBlJiBfX2EpCisgICAgICB7IHJldHVybiB3bWVtY2hyKF9fcywgX19hLCBfX24pOyB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gd21lbW1vdmUoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIHdtZW1jcHkoX19zMSwgX19zMiwgX19uKTsgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgeyByZXR1cm4gd21lbXNldChfX3MsIF9fYSwgX19uKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBjaGFyX3R5cGUoX19jKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuIGludF90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgZW9mKCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPihXRU9GKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICBub3RfZW9mKGNvbnN0IGludF90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBlcV9pbnRfdHlwZShfX2MsIGVvZigpKSA/IDAgOiBfX2M7IH0KKyAgfTsKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIChkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSBcCisgICAgICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKSkKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzPGNoYXIxNl90PgorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcjE2X3QgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB1aW50X2xlYXN0MTZfdCAgICBpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmICAgICAgICAgb2ZmX3R5cGU7CisgICAgICB0eXBlZGVmIHUxNnN0cmVhbXBvcyAgICAgIHBvc190eXBlOworICAgICAgdHlwZWRlZiBtYnN0YXRlX3QgICAgICAgICBzdGF0ZV90eXBlOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyBfX2MxID0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGVxKGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgbHQoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxIDwgX19jMjsgfQorCisgICAgICBzdGF0aWMgaW50CisgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBpZiAobHQoX19zMVtfX2ldLCBfX3MyW19faV0pKQorCSAgICByZXR1cm4gLTE7CisJICBlbHNlIGlmIChsdChfX3MyW19faV0sIF9fczFbX19pXSkpCisJICAgIHJldHVybiAxOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3MpCisgICAgICB7CisJc2l6ZV90IF9faSA9IDA7CisJd2hpbGUgKCFlcShfX3NbX19pXSwgY2hhcl90eXBlKCkpKQorCSAgKytfX2k7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBpZiAoZXEoX19zW19faV0sIF9fYSkpCisJICAgIHJldHVybiBfX3MgKyBfX2k7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBtb3ZlKGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeworCXJldHVybiAoc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4KKwkJKF9fYnVpbHRpbl9tZW1tb3ZlKF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgY29weShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+CisJCShfX2J1aWx0aW5fbWVtY3B5KF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgYXNzaWduKGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjaGFyX3R5cGUgX19hKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJICBhc3NpZ24oX19zW19faV0sIF9fYSk7CisJcmV0dXJuIF9fczsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyX3R5cGUKKyAgICAgIHRvX2NoYXJfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gY2hhcl90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgdG9faW50X3R5cGUoY29uc3QgY2hhcl90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBpbnRfdHlwZShfX2MpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIGVvZigpCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnRfdHlwZT4oLTEpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50X3R5cGUKKyAgICAgIG5vdF9lb2YoY29uc3QgaW50X3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuIGVxX2ludF90eXBlKF9fYywgZW9mKCkpID8gMCA6IF9fYzsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyMzJfdD4KKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXIzMl90ICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdWludF9sZWFzdDMyX3QgICAgaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHN0cmVhbW9mZiAgICAgICAgIG9mZl90eXBlOworICAgICAgdHlwZWRlZiB1MzJzdHJlYW1wb3MgICAgICBwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90ICAgICAgICAgc3RhdGVfdHlwZTsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgX19jMSA9IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcShjb25zdCBjaGFyX3R5cGUmIF9fYzEsIGNvbnN0IGNoYXJfdHlwZSYgX19jMikKKyAgICAgIHsgcmV0dXJuIF9fYzEgPT0gX19jMjsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKGx0KF9fczFbX19pXSwgX19zMltfX2ldKSkKKwkgICAgcmV0dXJuIC0xOworCSAgZWxzZSBpZiAobHQoX19zMltfX2ldLCBfX3MxW19faV0pKQorCSAgICByZXR1cm4gMTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19zKQorICAgICAgeworCXNpemVfdCBfX2kgPSAwOworCXdoaWxlICghZXEoX19zW19faV0sIGNoYXJfdHlwZSgpKSkKKwkgICsrX19pOworCXJldHVybiBfX2k7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyX3R5cGUqCisgICAgICBmaW5kKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzaXplX3QgX19uLCBjb25zdCBjaGFyX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKGVxKF9fc1tfX2ldLCBfX2EpKQorCSAgICByZXR1cm4gX19zICsgX19pOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBzdGF0aWMgY2hhcl90eXBlKgorICAgICAgbW92ZShjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNoYXJfdHlwZSo+CisJCShfX2J1aWx0aW5fbWVtbW92ZShfX3MxLCBfX3MyLCBfX24gKiBzaXplb2YoY2hhcl90eXBlKSkpKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGNvcHkoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IAorCXJldHVybiAoc3RhdGljX2Nhc3Q8Y2hhcl90eXBlKj4KKwkJKF9fYnVpbHRpbl9tZW1jcHkoX19zMSwgX19zMiwgX19uICogc2l6ZW9mKGNoYXJfdHlwZSkpKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBhc3NpZ24oY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNoYXJfdHlwZSBfX2EpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkgIGFzc2lnbihfX3NbX19pXSwgX19hKTsKKwlyZXR1cm4gX19zOworICAgICAgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2MpCisgICAgICB7IHJldHVybiBjaGFyX3R5cGUoX19jKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludF90eXBlCisgICAgICB0b19pbnRfdHlwZShjb25zdCBjaGFyX3R5cGUmIF9fYykKKyAgICAgIHsgcmV0dXJuIGludF90eXBlKF9fYyk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgICBlcV9pbnRfdHlwZShjb25zdCBpbnRfdHlwZSYgX19jMSwgY29uc3QgaW50X3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgZW9mKCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludF90eXBlPigtMSk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyAwIDogX19jOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgCisKKyNlbmRpZiAvLyBfQ0hBUl9UUkFJVFNfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2NvZGVjdnQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jb2RlY3Z0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlOWJiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jb2RlY3Z0LmgKQEAgLTAsMCArMSw1MDYgQEAKKy8vIExvY2FsZSBzdXBwb3J0IChjb2RlY3Z0KSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsCisvLyAyMDA5LCAyMDEwLCAyMDExICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jb2RlY3Z0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuMS41IFRlbXBsYXRlIGNsYXNzIGNvZGVjdnQKKy8vCisKKy8vIFdyaXR0ZW4gYnkgQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpZm5kZWYgX0NPREVDVlRfSAorI2RlZmluZSBfQ09ERUNWVF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIEVtcHR5IGJhc2UgY2xhc3MgZm9yIGNvZGVjdnQgZmFjZXQgWzIyLjIuMS41XS4KKyAgY2xhc3MgY29kZWN2dF9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIGVudW0gcmVzdWx0CisgICAgeworICAgICAgb2ssCisgICAgICBwYXJ0aWFsLAorICAgICAgZXJyb3IsCisgICAgICBub2NvbnYKKyAgICB9OworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb21tb24gYmFzZSBmb3IgY29kZWN2dCBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHVibGljIGZ1bmN0aW9ucworICAgKiAgdGhhdCBmb3J3YXJkIHRvIHRoZSBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGFsc28gcHJvdmlkZXMgYWJzdHJhY3Qgc3R1YnMgZm9yIHRoZSBwcm90ZWN0ZWQgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQsIHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2UKKyAgICA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY29kZWN2dF9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAlyZXN1bHQ7CisgICAgICB0eXBlZGVmIF9JbnRlcm5UCQkJaW50ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9FeHRlcm5UCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9TdGF0ZVQJCQlzdGF0ZV90eXBlOworCisgICAgICAvLyAyMi4yLjEuNS4xIGNvZGVjdnQgbWVtYmVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGZyb20gaW50ZXJuYWwgdG8gZXh0ZXJuYWwgY2hhcmFjdGVyIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQ29udmVydHMgaW5wdXQgc3RyaW5nIG9mIGludGVybl90eXBlIHRvIG91dHB1dCBzdHJpbmcgb2YKKyAgICAgICAqICBleHRlcm5fdHlwZS4gIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHdjc3J0b21icy4gIEl0IGRvZXMgdGhpcyBieQorICAgICAgICogIGNhbGxpbmcgY29kZWN2dDo6ZG9fb3V0LgorICAgICAgICoKKyAgICAgICAqICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc2V0cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgICAqICBmYWNldCdzIGxvY2FsZSwgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY2hhcmFjdGVycyBpbiBbZnJvbSxmcm9tX2VuZCkgYXJlIGNvbnZlcnRlZCBhbmQgd3JpdHRlbiB0bworICAgICAgICogIFt0byx0b19lbmQpLiAgZnJvbV9uZXh0IGFuZCB0b19uZXh0IGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlCisgICAgICAgKiAgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgY29udmVydGVkIGNoYXJhY3RlciwKKyAgICAgICAqICByZXNwZWN0aXZlbHkuICBJZiB0aGUgcmVzdWx0IG5lZWRlZCBubyBjb252ZXJzaW9uLCBmcm9tX25leHQgYW5kCisgICAgICAgKiAgdG9fbmV4dCBhcmUgbm90IGFmZmVjdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGUgQGEgc3RhdGUgYXJndW1lbnQgc2hvdWxkIGJlIGluaXRpYWxpemVkIGlmIHRoZSBpbnB1dCBpcyBhdCB0aGUKKyAgICAgICAqICBiZWdpbm5pbmcgYW5kIGNhcnJpZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgaWYgY29udGludWluZworICAgICAgICogIGNvbnZlcnNpb24uICBUaGVyZSBhcmUgbm8gZ3VhcmFudGVlcyBhYm91dCBob3cgQGEgc3RhdGUgaXMgdXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHJlc3VsdCByZXR1cm5lZCBpcyBhIG1lbWJlciBvZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdC4gIElmCisgICAgICAgKiAgYWxsIHRoZSBpbnB1dCBpcyBjb252ZXJ0ZWQsIHJldHVybnMgY29kZWN2dF9iYXNlOjpvay4gIElmIG5vCisgICAgICAgKiAgY29udmVyc2lvbiBpcyBuZWNlc3NhcnksIHJldHVybnMgY29kZWN2dF9iYXNlOjpub2NvbnYuICBJZgorICAgICAgICogIHRoZSBpbnB1dCBlbmRzIGVhcmx5IG9yIHRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBpbiB0aGUKKyAgICAgICAqICBvdXRwdXQsIHJldHVybnMgY29kZWN2dF9iYXNlOjpwYXJ0aWFsLiAgT3RoZXJ3aXNlIHRoZQorICAgICAgICogIGNvbnZlcnNpb24gZmFpbGVkIGFuZCBjb2RlY3Z0X2Jhc2U6OmVycm9yIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHN0YXRlICBQZXJzaXN0ZW50IGNvbnZlcnNpb24gc3RhdGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIGZyb20gIFN0YXJ0IG9mIGlucHV0LgorICAgICAgICogIEBwYXJhbSAgZnJvbV9lbmQgIEVuZCBvZiBpbnB1dC4KKyAgICAgICAqICBAcGFyYW0gIGZyb21fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bmNvbnZlcnRlZCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgdG8gIFN0YXJ0IG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICB0b19lbmQgIEVuZCBvZiBvdXRwdXQgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgdG9fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bnVzZWQgb3V0cHV0IGFyZWEuCisgICAgICAgKiAgQHJldHVybiAgY29kZWN2dF9iYXNlOjpyZXN1bHQuCisgICAgICAqLworICAgICAgcmVzdWx0CisgICAgICBvdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5kb19vdXQoX19zdGF0ZSwgX19mcm9tLCBfX2Zyb21fZW5kLCBfX2Zyb21fbmV4dCwKKwkJCSAgICBfX3RvLCBfX3RvX2VuZCwgX190b19uZXh0KTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNldCBjb252ZXJzaW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBXcml0ZXMgY2hhcmFjdGVycyB0byBvdXRwdXQgdGhhdCB3b3VsZCByZXN0b3JlIEBhIHN0YXRlIHRvIGluaXRpYWwKKyAgICAgICAqICBjb25kaXRpb25zLiAgVGhlIGlkZWEgaXMgdGhhdCBpZiBhIHBhcnRpYWwgY29udmVyc2lvbiBvY2N1cnMsIHRoZW4KKyAgICAgICAqICB0aGUgY29udmVydGluZyB0aGUgY2hhcmFjdGVycyB3cml0dGVuIGJ5IHRoaXMgZnVuY3Rpb24gd291bGQgbGVhdmUKKyAgICAgICAqICB0aGUgc3RhdGUgaW4gaW5pdGlhbCBjb25kaXRpb25zLCByYXRoZXIgdGhhbiBwYXJ0aWFsIGNvbnZlcnNpb24KKyAgICAgICAqICBzdGF0ZS4gIEl0IGRvZXMgdGhpcyBieSBjYWxsaW5nIGNvZGVjdnQ6OmRvX3Vuc2hpZnQoKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIGlmIDQgZXh0ZXJuYWwgY2hhcmFjdGVycyBhbHdheXMgY29udmVydGVkIHRvIDEgaW50ZXJuYWwKKyAgICAgICAqICBjaGFyYWN0ZXIsIGFuZCBpbnB1dCB0byBpbigpIGhhZCA2IGV4dGVybmFsIGNoYXJhY3RlcnMgd2l0aCBzdGF0ZQorICAgICAgICogIHNhdmVkLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIHdyaXRlIHR3byBjaGFyYWN0ZXJzIHRvIHRoZSBvdXRwdXQgYW5kCisgICAgICAgKiAgc2V0IHRoZSBzdGF0ZSB0byBpbml0aWFsaXplZCBjb25kaXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc2V0cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgICAqICBmYWNldCdzIGxvY2FsZSwgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgcmVzdWx0IHJldHVybmVkIGlzIGEgbWVtYmVyIG9mIGNvZGVjdnRfYmFzZTo6cmVzdWx0LiAgSWYgdGhlCisgICAgICAgKiAgc3RhdGUgY291bGQgYmUgcmVzZXQgYW5kIGRhdGEgd3JpdHRlbiwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6Om9rLiAgSWYKKyAgICAgICAqICBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeSwgcmV0dXJucyBjb2RlY3Z0X2Jhc2U6Om5vY29udi4gIElmIHRoZQorICAgICAgICogIG91dHB1dCBoYXMgaW5zdWZmaWNpZW50IHNwYWNlLCByZXR1cm5zIGNvZGVjdnRfYmFzZTo6cGFydGlhbC4KKyAgICAgICAqICBPdGhlcndpc2UgdGhlIHJlc2V0IGZhaWxlZCBhbmQgY29kZWN2dF9iYXNlOjplcnJvciBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzdGF0ZSAgUGVyc2lzdGVudCBjb252ZXJzaW9uIHN0YXRlIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICB0byAgU3RhcnQgb2Ygb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIHRvX2VuZCAgRW5kIG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICB0b19uZXh0ICBSZXR1cm5zIHN0YXJ0IG9mIHVudXNlZCBvdXRwdXQgYXJlYS4KKyAgICAgICAqICBAcmV0dXJuICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdC4KKyAgICAgICovCisgICAgICByZXN1bHQKKyAgICAgIHVuc2hpZnQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3Vuc2hpZnQoX19zdGF0ZSwgX190byxfX3RvX2VuZCxfX3RvX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBmcm9tIGV4dGVybmFsIHRvIGludGVybmFsIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogIENvbnZlcnRzIGlucHV0IHN0cmluZyBvZiBleHRlcm5fdHlwZSB0byBvdXRwdXQgc3RyaW5nIG9mCisgICAgICAgKiAgaW50ZXJuX3R5cGUuICBUaGlzIGlzIGFuYWxvZ291cyB0byBtYnNydG93Y3MuICBJdCBkb2VzIHRoaXMgYnkKKyAgICAgICAqICBjYWxsaW5nIGNvZGVjdnQ6OmRvX2luLgorICAgICAgICoKKyAgICAgICAqICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc2V0cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgICAqICBmYWNldCdzIGxvY2FsZSwgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY2hhcmFjdGVycyBpbiBbZnJvbSxmcm9tX2VuZCkgYXJlIGNvbnZlcnRlZCBhbmQgd3JpdHRlbiB0bworICAgICAgICogIFt0byx0b19lbmQpLiAgZnJvbV9uZXh0IGFuZCB0b19uZXh0IGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlCisgICAgICAgKiAgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgY29udmVydGVkIGNoYXJhY3RlciwKKyAgICAgICAqICByZXNwZWN0aXZlbHkuICBJZiB0aGUgcmVzdWx0IG5lZWRlZCBubyBjb252ZXJzaW9uLCBmcm9tX25leHQgYW5kCisgICAgICAgKiAgdG9fbmV4dCBhcmUgbm90IGFmZmVjdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGUgQGEgc3RhdGUgYXJndW1lbnQgc2hvdWxkIGJlIGluaXRpYWxpemVkIGlmIHRoZSBpbnB1dCBpcyBhdCB0aGUKKyAgICAgICAqICBiZWdpbm5pbmcgYW5kIGNhcnJpZWQgZnJvbSBhIHByZXZpb3VzIGNhbGwgaWYgY29udGludWluZworICAgICAgICogIGNvbnZlcnNpb24uICBUaGVyZSBhcmUgbm8gZ3VhcmFudGVlcyBhYm91dCBob3cgQGEgc3RhdGUgaXMgdXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHJlc3VsdCByZXR1cm5lZCBpcyBhIG1lbWJlciBvZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdC4gIElmCisgICAgICAgKiAgYWxsIHRoZSBpbnB1dCBpcyBjb252ZXJ0ZWQsIHJldHVybnMgY29kZWN2dF9iYXNlOjpvay4gIElmIG5vCisgICAgICAgKiAgY29udmVyc2lvbiBpcyBuZWNlc3NhcnksIHJldHVybnMgY29kZWN2dF9iYXNlOjpub2NvbnYuICBJZgorICAgICAgICogIHRoZSBpbnB1dCBlbmRzIGVhcmx5IG9yIHRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBpbiB0aGUKKyAgICAgICAqICBvdXRwdXQsIHJldHVybnMgY29kZWN2dF9iYXNlOjpwYXJ0aWFsLiAgT3RoZXJ3aXNlIHRoZQorICAgICAgICogIGNvbnZlcnNpb24gZmFpbGVkIGFuZCBjb2RlY3Z0X2Jhc2U6OmVycm9yIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHN0YXRlICBQZXJzaXN0ZW50IGNvbnZlcnNpb24gc3RhdGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIGZyb20gIFN0YXJ0IG9mIGlucHV0LgorICAgICAgICogIEBwYXJhbSAgZnJvbV9lbmQgIEVuZCBvZiBpbnB1dC4KKyAgICAgICAqICBAcGFyYW0gIGZyb21fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bmNvbnZlcnRlZCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgdG8gIFN0YXJ0IG9mIG91dHB1dCBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICB0b19lbmQgIEVuZCBvZiBvdXRwdXQgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgdG9fbmV4dCAgUmV0dXJucyBzdGFydCBvZiB1bnVzZWQgb3V0cHV0IGFyZWEuCisgICAgICAgKiAgQHJldHVybiAgY29kZWN2dF9iYXNlOjpyZXN1bHQuCisgICAgICAqLworICAgICAgcmVzdWx0CisgICAgICBpbihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwKKwkgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPmRvX2luKF9fc3RhdGUsIF9fZnJvbSwgX19mcm9tX2VuZCwgX19mcm9tX25leHQsCisJCQkgICBfX3RvLCBfX3RvX2VuZCwgX190b19uZXh0KTsKKyAgICAgIH0KKworICAgICAgaW50CisgICAgICBlbmNvZGluZygpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2VuY29kaW5nKCk7IH0KKworICAgICAgYm9vbAorICAgICAgYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2Fsd2F5c19ub2NvbnYoKTsgfQorCisgICAgICBpbnQKKyAgICAgIGxlbmd0aChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSAgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19sZW5ndGgoX19zdGF0ZSwgX19mcm9tLCBfX2VuZCwgX19tYXgpOyB9CisKKyAgICAgIGludAorICAgICAgbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX21heF9sZW5ndGgoKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlKHNpemVfdCBfX3JlZnMgPSAwKSA6IGxvY2FsZTo6ZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgdmlydHVhbAorICAgICAgfl9fY29kZWN2dF9hYnN0cmFjdF9iYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBmcm9tIGludGVybmFsIHRvIGV4dGVybmFsIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogIENvbnZlcnRzIGlucHV0IHN0cmluZyBvZiBpbnRlcm5fdHlwZSB0byBvdXRwdXQgc3RyaW5nIG9mCisgICAgICAgKiAgZXh0ZXJuX3R5cGUuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZQorICAgICAgICogIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgb3V0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgIGludGVybl90eXBlKiBfX3RvLCBpbnRlcm5fdHlwZSogX190b19lbmQsCisJICAgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdCA9IDA7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCkgPSAwOworCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpID0gMDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX2xlbmd0aChzdGF0ZV90eXBlJiwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwKKwkJY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpID0gMDsKKyAgICB9OworCisKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBjb2RlY3Z0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgTkI6IEdlbmVyaWMsIG1vc3RseSB1c2VsZXNzIGltcGxlbWVudGF0aW9uLgorICAgKgorICAqLworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIGNvZGVjdnQKKyAgICA6IHB1YmxpYyBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAlyZXN1bHQ7CisgICAgICB0eXBlZGVmIF9JbnRlcm5UCQkJaW50ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9FeHRlcm5UCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIF9TdGF0ZVQJCQlzdGF0ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgX19jX2xvY2FsZQkJCV9NX2NfbG9jYWxlX2NvZGVjdnQ7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPiAoX19yZWZzKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoX19jX2xvY2FsZSBfX2Nsb2MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2RlY3Z0KCkgeyB9CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwKKwkgICAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICAgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX3Vuc2hpZnQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgZXh0ZXJuX3R5cGUqIF9fdG8sCisJCSBleHRlcm5fdHlwZSogX190b19lbmQsIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisJICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICBpbnRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19lbmNvZGluZygpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sCisJCWNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdDsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGxvY2FsZTo6aWQgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIF9TdGF0ZVQ+OjppZDsKKworICAvLy8gY2xhc3MgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8Y2hhciwgY2hhciwgbWJzdGF0ZV90PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgY2hhcgkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBjaGFyCQkJZXh0ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIG1ic3RhdGVfdAkJCXN0YXRlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2NfbG9jYWxlCQkJX01fY19sb2NhbGVfY29kZWN2dDsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkIGlkOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2RlY3Z0KF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y29kZWN2dCgpOworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sCisJICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19pbihzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCSAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgZXh0ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgaW50ZXJuX3R5cGUqIF9fdG8sIGludGVybl90eXBlKiBfX3RvX2VuZCwKKwkgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGJvb2wKKyAgICAgIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCQljb25zdCBleHRlcm5fdHlwZSogX19lbmQsIHNpemVfdCBfX21heCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaW50CisgICAgICBkb19tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4KKyAgICA6IHB1YmxpYyBfX2NvZGVjdnRfYWJzdHJhY3RfYmFzZTx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiB3Y2hhcl90CQkJaW50ZXJuX3R5cGU7CisgICAgICB0eXBlZGVmIGNoYXIJCQlleHRlcm5fdHlwZTsKKyAgICAgIHR5cGVkZWYgbWJzdGF0ZV90CQkJc3RhdGVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fY19sb2NhbGUJCQlfTV9jX2xvY2FsZV9jb2RlY3Z0OworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICBleHBsaWNpdAorICAgICAgY29kZWN2dChfX2NfbG9jYWxlIF9fY2xvYywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmNvZGVjdnQoKTsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX291dChzdGF0ZV90eXBlJiBfX3N0YXRlLCBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tLAorCSAgICAgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGludGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgICBleHRlcm5fdHlwZSogX190bywgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9fdW5zaGlmdChzdGF0ZV90eXBlJiBfX3N0YXRlLAorCQkgZXh0ZXJuX3R5cGUqIF9fdG8sIGV4dGVybl90eXBlKiBfX3RvX2VuZCwKKwkJIGV4dGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdDsKKworICAgICAgdmlydHVhbCByZXN1bHQKKyAgICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsCisJICAgICBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tX2VuZCwKKwkgICAgIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLAorCSAgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsCisgICAgICBpbnQgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsCisgICAgICBib29sIGRvX2Fsd2F5c19ub2NvbnYoKSBjb25zdCB0aHJvdygpOworCisgICAgICB2aXJ0dWFsCisgICAgICBpbnQgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLAorCQkgICAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCk7CisgICAgfTsKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyAgLy8vIGNsYXNzIGNvZGVjdnRfYnluYW1lIFsyMi4yLjEuNl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVCwgdHlwZW5hbWUgX1N0YXRlVD4KKyAgICBjbGFzcyBjb2RlY3Z0X2J5bmFtZSA6IHB1YmxpYyBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgX1N0YXRlVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIGNvZGVjdnRfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBfU3RhdGVUPihfX3JlZnMpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAgJiYgX19idWlsdGluX3N0cmNtcChfX3MsICJQT1NJWCIpICE9IDApCisJICB7CisJICAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfY29kZWN2dCk7CisJICAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZSh0aGlzLT5fTV9jX2xvY2FsZV9jb2RlY3Z0LCBfX3MpOworCSAgfQorICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmNvZGVjdnRfYnluYW1lKCkgeyB9CisgICAgfTsKKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvZGVjdnRfYnluYW1lPGNoYXIsIGNoYXIsIG1ic3RhdGVfdD47CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgY29kZWN2dDxjaGFyLCBjaGFyLCBtYnN0YXRlX3Q+JgorICAgIHVzZV9mYWNldDxjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGNvZGVjdnQ8Y2hhciwgY2hhciwgbWJzdGF0ZV90PiA+KGNvbnN0IGxvY2FsZSYpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvZGVjdnRfYnluYW1lPHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD47CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgY29kZWN2dDx3Y2hhcl90LCBjaGFyLCBtYnN0YXRlX3Q+JgorICAgIHVzZV9mYWNldDxjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PGNvZGVjdnQ8d2NoYXJfdCwgY2hhciwgbWJzdGF0ZV90PiA+KGNvbnN0IGxvY2FsZSYpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9DT0RFQ1ZUX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jb21wYXRpYmlsaXR5LWxpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jb21wYXRpYmlsaXR5LWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWEyYjQwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2NvbXBhdGliaWxpdHktbGlzdC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvbXBhdGliaWxpdHkgc3ltYm9scyBmb3IgcHJldmlvdXMgdmVyc2lvbnMsIGxpc3QgYml0cyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09NUEFUCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09NUEFUCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT01QQVQKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09NUEFUCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09NUEFUCisKKyAgc3RydWN0IF9MaXN0X25vZGVfYmFzZQorICB7CisgICAgX0xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworICAgIF9MaXN0X25vZGVfYmFzZSogX01fcHJldjsKKworICAgIHN0YXRpYyB2b2lkCisgICAgc3dhcChfTGlzdF9ub2RlX2Jhc2UmIF9feCwgX0xpc3Rfbm9kZV9iYXNlJiBfX3kpIHRocm93ICgpOworICAgIHZvaWQKKyAgICB0cmFuc2ZlcihfTGlzdF9ub2RlX2Jhc2UgKiBjb25zdCBfX2ZpcnN0LAorCQlfTGlzdF9ub2RlX2Jhc2UgKiBjb25zdCBfX2xhc3QpIHRocm93ICgpOworCisgICAgdm9pZAorICAgIHJldmVyc2UoKSB0aHJvdyAoKTsKKworICAgIHZvaWQKKyAgICBob29rKF9MaXN0X25vZGVfYmFzZSAqIGNvbnN0IF9fcG9zaXRpb24pIHRocm93ICgpOworCisgICAgdm9pZAorICAgIHVuaG9vaygpIHRocm93ICgpOworICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTVBBVAorCit9IC8vIG5hbWVzcGFjZSBzdGQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jb25jZXB0X2NoZWNrLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvY29uY2VwdF9jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTdlNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvY29uY2VwdF9jaGVjay5oCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvbmNlcHQtY2hlY2tpbmcgY29udHJvbCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY29uY2VwdF9jaGVjay5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKi8KKworI2lmbmRlZiBfQ09OQ0VQVF9DSEVDS19ICisjZGVmaW5lIF9DT05DRVBUX0NIRUNLX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisvLyBBbGwgcGxhY2VzIGluIGxpYnN0ZGMrKy12MyB3aGVyZSB0aGVzZSBhcmUgdXNlZCwgb3IgL21pZ2h0LyBiZSB1c2VkLCBvcgorLy8gZG9uJ3QgbmVlZCB0byBiZSB1c2VkLCBvciBwZXJoYXBzIC9zaG91bGQvIGJlIHVzZWQsIGFyZSBjb21tZW50ZWQgd2l0aAorLy8gImNvbmNlcHQgcmVxdWlyZW1lbnRzIiAoYW5kIG1heWJlIHNvbWUgbW9yZSB0ZXh0KS4gIFNvIGdyZXAgbGlrZSBjcmF6eQorLy8gaWYgeW91J3JlIGxvb2tpbmcgZm9yIGFkZGl0aW9uYWwgcGxhY2VzIHRvIHVzZSB0aGVzZS4KKworLy8gQ29uY2VwdC1jaGVja2luZyBjb2RlIGlzIG9mZiBieSBkZWZhdWx0IHVubGVzcyB1c2VycyB0dXJuIGl0IG9uIHZpYQorLy8gY29uZmlndXJlIG9wdGlvbnMgb3IgZWRpdGluZyBjKytjb25maWcuaC4KKworI2lmbmRlZiBfR0xJQkNYWF9DT05DRVBUX0NIRUNLUworCisjZGVmaW5lIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyguLi4pCisjZGVmaW5lIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfYSxfYikKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfYSxfYixfYykKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfYSxfYixfYyxfZCkKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfYSxfYixfYyxfZCxfZSkKKworI2Vsc2UgLy8gdGhlIGNoZWNrcyBhcmUgb24KKworI2luY2x1ZGUgPGJpdHMvYm9vc3RfY29uY2VwdF9jaGVjay5oPgorCisvLyBOb3RlIHRoYXQgdGhlIG9idmlvdXMgYW5kIGVsZWdhbnQgYXBwcm9hY2ggb2YKKy8vCisvLyNkZWZpbmUgZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhDKSBib29zdDo6ZnVuY3Rpb25fcmVxdWlyZXM8IGJvb3N0OjpDID4oKQorLy8KKy8vIHdvbid0IHdvcmsgZHVlIHRvIGNvbmNlcHQgdGVtcGxhdGVzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIsIGUuZy4sCisvLyBCaW5hcnlQcmVkaWNhdGVDb25jZXB0LiAgVGhlIHByZXByb2Nlc3NvciB0cmllcyB0byBzcGxpdCB0aGluZ3MgdXAgb24KKy8vIHRoZSBjb21tYXMgaW4gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuICBXZSBjYW4ndCB1c2UgYW4gaW5uZXIgcGFpciBvZgorLy8gcGFyZW50aGVzaXMgdG8gaGlkZSB0aGUgY29tbWFzLCBiZWNhdXNlICJib29zdDo6KFRlbXA8Rm9vLEJhcj4pIiBpc24ndAorLy8gYSB2YWxpZCBpbnN0YW50aWF0aW9uIHBhdHRlcm4uICBUaHVzLCB3ZSBzdGVhbCBhIGZlYXR1cmUgZnJvbSBDOTkuCisKKyNkZWZpbmUgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2dudV9jeHg6Ol9fZnVuY3Rpb25fcmVxdWlyZXM8IF9fZ251X2N4eDo6X19WQV9BUkdTX18gPigpOworI2RlZmluZSBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX2EsX0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9HTElCQ1hYX0NMQVNTX1JFUVVJUkVTKF9hLCBfX2dudV9jeHgsIF9DKTsKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfYSxfYixfQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzIoX2EsIF9iLCBfX2dudV9jeHgsIF9DKTsKKyNkZWZpbmUgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfYSxfYixfYyxfQykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfR0xJQkNYWF9DTEFTU19SRVFVSVJFUzMoX2EsIF9iLCBfYywgX19nbnVfY3h4LCBfQyk7CisjZGVmaW5lIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczQoX2EsX2IsX2MsX2QsX0MpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX0dMSUJDWFhfQ0xBU1NfUkVRVUlSRVM0KF9hLCBfYiwgX2MsIF9kLCBfX2dudV9jeHgsIF9DKTsKKworI2VuZGlmIC8vIGVuYWJsZS9kaXNhYmxlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DT05DRVBUX0NIRUNLCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvY3BwX3R5cGVfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvY3BwX3R5cGVfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2ODkwZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9jcHBfdHlwZV90cmFpdHMuaApAQCAtMCwwICsxLDQyNSBAQAorLy8gVGhlICAtKi0gQysrIC0qLSB0eXBlIHRyYWl0cyBjbGFzc2VzIGZvciBpbnRlcm5hbCB1c2UgaW4gbGlic3RkYysrCisKKy8vIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3BwX3R5cGVfdHJhaXRzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleHQvdHlwZV90cmFpdHN9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxkb3NyZWlzQGNtbGEuZW5zLWNhY2hhbi5mcj4KKworI2lmbmRlZiBfQ1BQX1RZUEVfVFJBSVRTX0gKKyNkZWZpbmUgX0NQUF9UWVBFX1RSQUlUU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBzb21lIGNvbXBpbGUtdGltZSBpbmZvcm1hdGlvbiBhYm91dCB2YXJpb3VzIHR5cGVzLgorLy8gVGhlc2UgcmVwcmVzZW50YXRpb25zIHdlcmUgZGVzaWduZWQsIG9uIHB1cnBvc2UsIHRvIGJlIGNvbnN0YW50LWV4cHJlc3Npb25zCisvLyBhbmQgbm90IHR5cGVzIGFzIGZvdW5kIGluIDxiaXRzL3R5cGVfdHJhaXRzLmg+LiAgSW4gcGFydGljdWxhciwgdGhleQorLy8gY2FuIGJlIHVzZWQgaW4gY29udHJvbCBzdHJ1Y3R1cmVzIGFuZCB0aGUgb3B0aW1pemVyIGhvcGVmdWxseSB3aWxsIGRvCisvLyB0aGUgb2J2aW91cyB0aGluZy4KKy8vCisvLyBXaHkgaW50ZWdyYWwgZXhwcmVzc2lvbnMsIGFuZCBub3QgZnVuY3Rpb25zIG5vciB0eXBlcz8KKy8vIEZpcnN0bHksIHRoZXNlIGNvbXBpbGUtdGltZSBlbnRpdGllcyBhcmUgdXNlZCBhcyB0ZW1wbGF0ZS1hcmd1bWVudHMKKy8vIHNvIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXMgd29uJ3Qgd29yazogIFdlIG5lZWQgY29tcGlsZS10aW1lIGVudGl0aWVzLgorLy8gV2UncmUgbGVmdCB3aXRoIHR5cGVzIGFuZCBjb25zdGFudCAgaW50ZWdyYWwgZXhwcmVzc2lvbnMuCisvLyBTZWNvbmRseSwgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBlYXNlIG9mIHVzZSwgdHlwZS1iYXNlZCBjb21waWxlLXRpbWUKKy8vIGluZm9ybWF0aW9uIGlzIC1ub3QtICp0aGF0KiBjb252ZW5pZW50LiAgT24gaGFzIHRvIHdyaXRlIGxvdHMgb2YKKy8vIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCB0byBob3BlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgc2VsZWN0IHRoZSByaWdodAorLy8gb25lLiBBcyBhIG5ldCBlZmZlY3QsIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBpc24ndCB2ZXJ5IGNsZWFyIGF0IGZpcnN0CisvLyBnbGFuY2UuCisvLyBUaGlyZGx5LCBwYXJ0aWFsIG9yZGVyaW5nIGFuZCBvdmVybG9hZCByZXNvbHV0aW9uIChvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMpCisvLyBpcyBoaWdobHkgY29zdGx5IGluIHRlcm1zIG9mIGNvbXBpbGVyLXJlc291cmNlLiAgSXQgaXMgYSBHb29kIFRoaW5nIHRvCisvLyBrZWVwIHRoZXNlIHJlc291cmNlIGNvbnN1bXB0aW9uIGFzIGxlYXN0IGFzIHBvc3NpYmxlLgorLy8KKy8vIFNlZSB2YWxhcnJheV9hcnJheS5oIGZvciBhIGNhc2UgdXNlLgorLy8KKy8vIC0tIEdhYnkgKGRvc3JlaXNAY21sYS5lbnMtY2FjaGFuLmZyKSAyMDAwLTAzLTA2LgorLy8KKy8vIFVwZGF0ZSAyMDA1OiB0eXBlcyBhcmUgYWxzbyBwcm92aWRlZCBhbmQgPGJpdHMvdHlwZV90cmFpdHMuaD4gaGFzIGJlZW4KKy8vIHJlbW92ZWQuCisvLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIGhhY2ssIHNob3VsZCByZWFsbHkgaW5jbHVkZSB0aGlzIGZyb20gc29tZXdoZXJlLgorbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBfX25vcm1hbF9pdGVyYXRvcjsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgc3RydWN0IF9fdHJ1ZV90eXBlIHsgfTsKKyAgc3RydWN0IF9fZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8Ym9vbD4KKyAgICBzdHJ1Y3QgX190cnV0aF90eXBlCisgICAgeyB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3RydXRoX3R5cGU8dHJ1ZT4KKyAgICB7IHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOyB9OworCisgIC8vIE4uQi4gVGhlIGNvbnZlcnNpb25zIHRvIGJvb2wgYXJlIG5lZWRlZCBkdWUgdG8gdGhlIGlzc3VlCisgIC8vIGV4cGxhaW5lZCBpbiBjKysvMTk0MDQuCisgIHRlbXBsYXRlPGNsYXNzIF9TcCwgY2xhc3MgX1RwPgorICAgIHN0cnVjdCBfX3RyYWl0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IGJvb2woX1NwOjpfX3ZhbHVlKSB8fCBib29sKF9UcDo6X192YWx1ZSkgfTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cnV0aF90eXBlPF9fdmFsdWU+OjpfX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gQ29tcGFyZSBmb3IgZXF1YWxpdHkgb2YgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19hcmVfc2FtZQorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBfX2ZhbHNlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2FyZV9zYW1lPF9UcCwgX1RwPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBIb2xkcyBpZiB0aGUgdGVtcGxhdGUtYXJndW1lbnQgaXMgYSB2b2lkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc192b2lkCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfdm9pZDx2b2lkPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBJbnRlZ2VyIHR5cGVzCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLyBUaGlydGVlbiBzcGVjaWFsaXphdGlvbnMgKHllcyB0aGVyZSBhcmUgZWxldmVuIHN0YW5kYXJkIGludGVnZXIKKyAgLy8gdHlwZXM7IDxlbT5sb25nIGxvbmc8L2VtPiBhbmQgPGVtPnVuc2lnbmVkIGxvbmcgbG9uZzwvZW0+IGFyZQorICAvLyBzdXBwb3J0ZWQgYXMgZXh0ZW5zaW9ucykKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Ym9vbD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Y2hhcj4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8c2lnbmVkIGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHVuc2lnbmVkIGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisjIGlmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHdjaGFyX3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworIyBlbmRpZgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8Y2hhcjE2X3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGNoYXIzMl90PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHNob3J0PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx1bnNpZ25lZCBzaG9ydD4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8aW50PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfaW50ZWdlcjx1bnNpZ25lZCBpbnQ+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGxvbmc+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPHVuc2lnbmVkIGxvbmc+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19pbnRlZ2VyPGxvbmcgbG9uZz4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2ludGVnZXI8dW5zaWduZWQgbG9uZyBsb25nPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBGbG9hdGluZyBwb2ludCB0eXBlcworICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmcKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vIHRocmVlIHNwZWNpYWxpemF0aW9ucyAoZmxvYXQsIGRvdWJsZSBhbmQgJ2xvbmcgZG91YmxlJykKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2lzX2Zsb2F0aW5nPGZsb2F0PgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmc8ZG91YmxlPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfZmxvYXRpbmc8bG9uZyBkb3VibGU+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vCisgIC8vIFBvaW50ZXIgdHlwZXMKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3BvaW50ZXIKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19wb2ludGVyPF9UcCo+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vCisgIC8vIE5vcm1hbCBpdGVyYXRvciB0eXBlCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19ub3JtYWxfaXRlcmF0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBzdHJ1Y3QgX19pc19ub3JtYWxfaXRlcmF0b3I8IF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLAorCQkJCQkJCSAgICAgIF9Db250YWluZXI+ID4KKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDEgfTsKKyAgICAgIHR5cGVkZWYgX190cnVlX3R5cGUgX190eXBlOworICAgIH07CisKKyAgLy8KKyAgLy8gQW4gYXJpdGhtZXRpYyB0eXBlIGlzIGFuIGludGVnZXIgdHlwZSBvciBhIGZsb2F0aW5nIHBvaW50IHR5cGUKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2FyaXRobWV0aWMKKyAgICA6IHB1YmxpYyBfX3RyYWl0b3I8X19pc19pbnRlZ2VyPF9UcD4sIF9faXNfZmxvYXRpbmc8X1RwPiA+CisgICAgeyB9OworCisgIC8vCisgIC8vIEEgZnVuZGFtZW50YWwgdHlwZSBpcyBgdm9pZCcgb3IgYW5kIGFyaXRobWV0aWMgdHlwZQorICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfZnVuZGFtZW50YWwKKyAgICA6IHB1YmxpYyBfX3RyYWl0b3I8X19pc192b2lkPF9UcD4sIF9faXNfYXJpdGhtZXRpYzxfVHA+ID4KKyAgICB7IH07CisKKyAgLy8KKyAgLy8gQSBzY2FsYXIgdHlwZSBpcyBhbiBhcml0aG1ldGljIHR5cGUgb3IgYSBwb2ludGVyIHR5cGUKKyAgLy8gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19zY2FsYXIKKyAgICA6IHB1YmxpYyBfX3RyYWl0b3I8X19pc19hcml0aG1ldGljPF9UcD4sIF9faXNfcG9pbnRlcjxfVHA+ID4KKyAgICB7IH07CisKKyAgLy8KKyAgLy8gRm9yIHVzZSBpbiBzdGQ6OmNvcHkgYW5kIHN0ZDo6ZmluZCBvdmVybG9hZHMgZm9yIHN0cmVhbWJ1ZiBpdGVyYXRvcnMuCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19jaGFyCisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAwIH07CisgICAgICB0eXBlZGVmIF9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfY2hhcjxjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19jaGFyPHdjaGFyX3Q+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2J5dGUKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19ieXRlPGNoYXI+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pc19ieXRlPHNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9faXNfYnl0ZTx1bnNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMSB9OworICAgICAgdHlwZWRlZiBfX3RydWVfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBNb3ZlIGl0ZXJhdG9yIHR5cGUKKyAgLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX21vdmVfaXRlcmF0b3IKKyAgICB7CisgICAgICBlbnVtIHsgX192YWx1ZSA9IDAgfTsKKyAgICAgIHR5cGVkZWYgX19mYWxzZV90eXBlIF9fdHlwZTsKKyAgICB9OworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGNsYXNzIG1vdmVfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfX2lzX21vdmVfaXRlcmF0b3I8IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiA+CisgICAgeworICAgICAgZW51bSB7IF9fdmFsdWUgPSAxIH07CisgICAgICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9fdHlwZTsKKyAgICB9OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vX0NQUF9UWVBFX1RSQUlUU19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvY3h4YWJpX2ZvcmNlZC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2N4eGFiaV9mb3JjZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVjZTc5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2N4eGFiaV9mb3JjZWQuaApAQCAtMCwwICsxLDYwIEBACisvLyBjeHhhYmkuaCBzdWJzZXQgZm9yIGNhbmNlbGxhdGlvbiAtKi0gQysrIC0qLQorICAKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIAorLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3h4YWJpX2ZvcmNlZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7Y3h4YWJpLmh9CisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX0ZPUkNFRF9ICisjZGVmaW5lIF9DWFhBQklfRk9SQ0VEX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaChkZWZhdWx0KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7ICAKKyAgLyoqIAorICAgKiAgQGJyaWVmIFRocm93biBhcyBwYXJ0IG9mIGZvcmNlZCB1bndpbmRpbmcuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqICBBIG1hZ2ljIHBsYWNlaG9sZGVyIGNsYXNzIHRoYXQgY2FuIGJlIGNhdWdodCBieSByZWZlcmVuY2UgdG8KKyAgICogIHJlY29nbml6ZSBmb3JjZWQgdW53aW5kaW5nLgorICAgKi8KKyAgY2xhc3MgX19mb3JjZWRfdW53aW5kCisgIHsKKyAgICB2aXJ0dWFsIH5fX2ZvcmNlZF91bndpbmQoKSB0aHJvdygpOworCisgICAgLy8gUHJldmVudCBjYXRjaCBieSB2YWx1ZS4KKyAgICB2aXJ0dWFsIHZvaWQgX19wdXJlX2R1bW15KCkgPSAwOyAKKyAgfTsKK30KKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYgLy8gX19DWFhBQklfRk9SQ0VEX0ggCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZGVxdWUudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2RlcXVlLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzgxMDIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2RlcXVlLnRjYwpAQCAtMCwwICsxLDEwNDggQEAKKy8vIERlcXVlIGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LAorLy8gMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL2RlcXVlLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2RlcXVlfQorICovCisKKyNpZm5kZWYgX0RFUVVFX1RDQworI2RlZmluZSBfREVRVUVfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBfTWFwX3BvaW50ZXIgX19jdXI7CisgICAgICBfX3RyeQorICAgICAgICB7CisgICAgICAgICAgZm9yIChfX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZTsKKwkgICAgICAgX19jdXIgPCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlOworCSAgICAgICArK19fY3VyKQorICAgICAgICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9hKCpfX2N1ciwgKl9fY3VyICsgX1NfYnVmZmVyX3NpemUoKSwKKwkJCQkJICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QsCisJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsCisJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICB9CisgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgeworICAgICAgICAgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgaXRlcmF0b3IoKl9fY3VyLCBfX2N1ciksCisJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGRlcXVlPF9UcCwgX0FsbG9jPiYKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgX194KQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKyAgICAgIGlmICgmX194ICE9IHRoaXMpCisJeworCSAgaWYgKF9fbGVuID49IF9feC5zaXplKCkpCisJICAgIF9NX2VyYXNlX2F0X2VuZChzdGQ6OmNvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX21pZCA9IF9feC5iZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9fbGVuKTsKKwkgICAgICBzdGQ6OmNvcHkoX194LmJlZ2luKCksIF9fbWlkLCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgICBpbnNlcnQodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9fbWlkLCBfX3guZW5kKCkpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyICE9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3QpCisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyIC0gMSwKKwkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgLS10aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cjsKKwkgIH0KKwllbHNlCisJICBfTV9wdXNoX2Zyb250X2F1eChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2VfYmFjayhfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyCisJICAgICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QgLSAxKQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsCisJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3B1c2hfYmFja19hdXgoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIGlmIChfX3Bvc2l0aW9uLl9NX2N1ciA9PSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cikKKwl7CisJICBwdXNoX2Zyb250KF9feCk7CisJICByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwl9CisgICAgICBlbHNlIGlmIChfX3Bvc2l0aW9uLl9NX2N1ciA9PSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIpCisJeworCSAgcHVzaF9iYWNrKF9feCk7CisJICBpdGVyYXRvciBfX3RtcCA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgLS1fX3RtcDsKKwkgIHJldHVybiBfX3RtcDsKKwl9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBkZXF1ZTxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbi5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpCisJICB7CisJICAgIHB1c2hfZnJvbnQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7CisJICB9CisJZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKQorCSAgeworCSAgICBwdXNoX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgICAgaXRlcmF0b3IgX190bXAgPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgICAgLS1fX3RtcDsKKwkgICAgcmV0dXJuIF9fdG1wOworCSAgfQorCWVsc2UKKwkgIHJldHVybiBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgZGVxdWU8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICB7CisgICAgICBpdGVyYXRvciBfX25leHQgPSBfX3Bvc2l0aW9uOworICAgICAgKytfX25leHQ7CisgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19pbmRleCA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19pbmRleCkgPCAoc2l6ZSgpID4+IDEpKQorCXsKKwkgIGlmIChfX3Bvc2l0aW9uICE9IGJlZ2luKCkpCisJICAgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKGJlZ2luKCksIF9fcG9zaXRpb24sIF9fbmV4dCk7CisJICBwb3BfZnJvbnQoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKF9fbmV4dCAhPSBlbmQoKSkKKwkgICAgX0dMSUJDWFhfTU9WRTMoX19uZXh0LCBlbmQoKSwgX19wb3NpdGlvbik7CisJICBwb3BfYmFjaygpOworCX0KKyAgICAgIHJldHVybiBiZWdpbigpICsgX19pbmRleDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBlbHNlIGlmIChfX2ZpcnN0ID09IGJlZ2luKCkgJiYgX19sYXN0ID09IGVuZCgpKQorCXsKKwkgIGNsZWFyKCk7CisJICByZXR1cm4gZW5kKCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYmVmb3JlID0gX19maXJzdCAtIGJlZ2luKCk7CisJICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2VsZW1zX2JlZm9yZSkgPD0gKHNpemUoKSAtIF9fbikgLyAyKQorCSAgICB7CisJICAgICAgaWYgKF9fZmlyc3QgIT0gYmVnaW4oKSkKKwkJX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsKKwkgICAgICBfTV9lcmFzZV9hdF9iZWdpbihiZWdpbigpICsgX19uKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9fbGFzdCAhPSBlbmQoKSkKKwkJX0dMSUJDWFhfTU9WRTMoX19sYXN0LCBlbmQoKSwgX19maXJzdCk7CisJICAgICAgX01fZXJhc2VfYXRfZW5kKGVuZCgpIC0gX19uKTsKKwkgICAgfQorCSAgcmV0dXJuIGJlZ2luKCkgKyBfX2VsZW1zX2JlZm9yZTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigpOworICAgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJzdCkKKyAgICAgICAgICAqX19jdXIgPSAqX19maXJzdDsKKyAgICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorICAgICAgICAgIF9NX2VyYXNlX2F0X2VuZChfX2N1cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cikKKwl7CisJICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoX19uZXdfc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCSAgX194LCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkgICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKF9fcG9zLl9NX2N1ciA9PSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIpCisJeworCSAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgIF9fbmV3X2ZpbmlzaCwgX194LAorCQkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCSAgICAgICBfX25ld19maW5pc2guX01fbm9kZSArIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgICAgZWxzZQorICAgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zLCBfX24sIF9feCk7CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fbikKKwl7CisJICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgX19uZXdfZmluaXNoLAorCQkJCQkgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fZGVzdHJveV9ub2Rlcyh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCSAgICAgICBfX25ld19maW5pc2guX01fbm9kZSArIDEpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9maWxsX2luaXRpYWxpemUoY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICB7CisgICAgICBfTWFwX3BvaW50ZXIgX19jdXI7CisgICAgICBfX3RyeQorICAgICAgICB7CisgICAgICAgICAgZm9yIChfX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZTsKKwkgICAgICAgX19jdXIgPCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlOworCSAgICAgICArK19fY3VyKQorICAgICAgICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKCpfX2N1ciwgKl9fY3VyICsgX1NfYnVmZmVyX3NpemUoKSwKKwkJCQkJX192YWx1ZSwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QsCisJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLAorCQkJCSAgICAgIF9fdmFsdWUsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgIH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBpdGVyYXRvcigqX19jdXIsIF9fY3VyKSwKKwkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisgICAgICAgIHRoaXMtPl9NX2luaXRpYWxpemVfbWFwKDApOworICAgICAgICBfX3RyeQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorICAgICAgICAgICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworICAgICAgICAgIH0KKyAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgeworICAgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICAgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworICAgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICB0aGlzLT5fTV9pbml0aWFsaXplX21hcChfX24pOworCisgICAgICAgIF9NYXBfcG9pbnRlciBfX2N1cl9ub2RlOworICAgICAgICBfX3RyeQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoX19jdXJfbm9kZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZTsKKyAgICAgICAgICAgICAgICAgX19jdXJfbm9kZSA8IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGU7CisgICAgICAgICAgICAgICAgICsrX19jdXJfbm9kZSkKKwkgICAgICB7CisJCV9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCQlzdGQ6OmFkdmFuY2UoX19taWQsIF9TX2J1ZmZlcl9zaXplKCkpOworCQlzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19taWQsICpfX2N1cl9ub2RlLAorCQkJCQkgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJX19maXJzdCA9IF9fbWlkOworCSAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0LAorCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworICAgICAgICAgIH0KKyAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICBpdGVyYXRvcigqX19jdXJfbm9kZSwgX19jdXJfbm9kZSksCisJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgLy8gQ2FsbGVkIG9ubHkgaWYgX01faW1wbC5fTV9maW5pc2guX01fY3VyID09IF9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QgLSAxLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3B1c2hfYmFja19hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3B1c2hfYmFja19hdXgoY29uc3QgdmFsdWVfdHlwZSYgX190KQorI2VuZGlmCisgICAgICB7CisJX01fcmVzZXJ2ZV9tYXBfYXRfYmFjaygpOworCSoodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEpID0gdGhpcy0+X01fYWxsb2NhdGVfbm9kZSgpOworCV9fdHJ5CisJICB7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworI2Vsc2UKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyLCBfX3QpOworI2VuZGlmCisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUKKwkJCQkJCSsgMSk7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1ciA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0OworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9kZWFsbG9jYXRlX25vZGUoKih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSkpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgb25seSBpZiBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciA9PSBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3B1c2hfZnJvbnRfYXV4KF9BcmdzJiYuLi4gX19hcmdzKQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9wdXNoX2Zyb250X2F1eChjb25zdCB2YWx1ZV90eXBlJiBfX3QpCisjZW5kaWYKKyAgICAgIHsKKwlfTV9yZXNlcnZlX21hcF9hdF9mcm9udCgpOworCSoodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlIC0gMSkgPSB0aGlzLT5fTV9hbGxvY2F0ZV9ub2RlKCk7CisJX190cnkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUKKwkJCQkJICAgICAgIC0gMSk7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9sYXN0IC0gMTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1ciwKKwkJCQkgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyNlbHNlCisJICAgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyLCBfX3QpOworI2VuZGlmCisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwkgICAgX01fZGVhbGxvY2F0ZV9ub2RlKCoodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlIC0gMSkpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgb25seSBpZiBfTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIgPT0gX01faW1wbC5fTV9maW5pc2guX01fZmlyc3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01fcG9wX2JhY2tfYXV4KCkKKyAgICB7CisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fZmlyc3QpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fc2V0X25vZGUodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSAtIDEpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbGFzdCAtIDE7CisgICAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKTsKKyAgICB9CisKKyAgLy8gQ2FsbGVkIG9ubHkgaWYgX01faW1wbC5fTV9zdGFydC5fTV9jdXIgPT0gX01faW1wbC5fTV9zdGFydC5fTV9sYXN0IC0gMS4KKyAgLy8gTm90ZSB0aGF0IGlmIHRoZSBkZXF1ZSBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgKGEgcHJlY29uZGl0aW9uIGZvciB0aGlzCisgIC8vIG1lbWJlciBmdW5jdGlvbiksIGFuZCBpZgorICAvLyAgIF9NX2ltcGwuX01fc3RhcnQuX01fY3VyID09IF9NX2ltcGwuX01fc3RhcnQuX01fbGFzdCwKKyAgLy8gdGhlbiB0aGUgZGVxdWUgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBub2Rlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9wb3BfZnJvbnRfYXV4KCkKKyAgICB7CisgICAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpOworICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fZmlyc3QpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9zZXRfbm9kZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX25vZGUgKyAxKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9maXJzdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeyBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBzdGQ6Omluc2VydGVyKCp0aGlzLCBfX3BvcykpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisgICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX24gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpCisJICB7CisJICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChfX24pOworCSAgICBfX3RyeQorCSAgICAgIHsKKwkJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QsIF9fbGFzdCwgX19uZXdfc3RhcnQsCisJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7CisJCV9NX2Rlc3Ryb3lfbm9kZXMoX19uZXdfc3RhcnQuX01fbm9kZSwKKwkJCQkgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgfQorICAgICAgICBlbHNlIGlmIChfX3Bvcy5fTV9jdXIgPT0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKQorCSAgeworCSAgICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKwkgICAgX190cnkKKwkgICAgICB7CisJCXN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJCSBfX25ld19maW5pc2guX01fbm9kZSArIDEpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9fbik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwl2YWx1ZV90eXBlIF9feF9jb3B5KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IC8vIFhYWCBjb3B5CisjZWxzZQorICAgIHR5cGVuYW1lIGRlcXVlPF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsgLy8gWFhYIGNvcHkKKyNlbmRpZgorCWRpZmZlcmVuY2VfdHlwZSBfX2luZGV4ID0gX19wb3MgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCWlmIChzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faW5kZXgpIDwgc2l6ZSgpIC8gMikKKwkgIHsKKwkgICAgcHVzaF9mcm9udChfR0xJQkNYWF9NT1ZFKGZyb250KCkpKTsKKwkgICAgaXRlcmF0b3IgX19mcm9udDEgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCSAgICArK19fZnJvbnQxOworCSAgICBpdGVyYXRvciBfX2Zyb250MiA9IF9fZnJvbnQxOworCSAgICArK19fZnJvbnQyOworCSAgICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX2luZGV4OworCSAgICBpdGVyYXRvciBfX3BvczEgPSBfX3BvczsKKwkgICAgKytfX3BvczE7CisJICAgIF9HTElCQ1hYX01PVkUzKF9fZnJvbnQyLCBfX3BvczEsIF9fZnJvbnQxKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHB1c2hfYmFjayhfR0xJQkNYWF9NT1ZFKGJhY2soKSkpOworCSAgICBpdGVyYXRvciBfX2JhY2sxID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICAgIC0tX19iYWNrMTsKKwkgICAgaXRlcmF0b3IgX19iYWNrMiA9IF9fYmFjazE7CisJICAgIC0tX19iYWNrMjsKKwkgICAgX19wb3MgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19pbmRleDsKKwkgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3MsIF9fYmFjazIsIF9fYmFjazEpOworCSAgfQorCSpfX3BvcyA9IF9HTElCQ1hYX01PVkUoX194X2NvcHkpOworCXJldHVybiBfX3BvczsKKyAgICAgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIGNvbnN0IGRpZmZlcmVuY2VfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbmd0aCA9IHRoaXMtPnNpemUoKTsKKyAgICAgIHZhbHVlX3R5cGUgX194X2NvcHkgPSBfX3g7CisgICAgICBpZiAoX19lbGVtc19iZWZvcmUgPCBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGggLyAyKSkKKwl7CisJICBpdGVyYXRvciBfX25ld19zdGFydCA9IF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfZnJvbnQoX19uKTsKKwkgIGl0ZXJhdG9yIF9fb2xkX3N0YXJ0ID0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwkgIF9fcG9zID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fZWxlbXNfYmVmb3JlOworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmIChfX2VsZW1zX2JlZm9yZSA+PSBkaWZmZXJlbmNlX3R5cGUoX19uKSkKKwkJeworCQkgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0CisJCQkJCSsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCQkgICAgICBfX3N0YXJ0X24sIF9fbmV3X3N0YXJ0LAorCQkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJICBfR0xJQkNYWF9NT1ZFMyhfX3N0YXJ0X24sIF9fcG9zLCBfX29sZF9zdGFydCk7CisJCSAgc3RkOjpmaWxsKF9fcG9zIC0gZGlmZmVyZW5jZV90eXBlKF9fbiksIF9fcG9zLCBfX3hfY29weSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2ZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSBfX3BvcywgX19uZXdfc3RhcnQsCisJCQkJCQkgdGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSBfX3hfY29weSwKKwkJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJICBzdGQ6OmZpbGwoX19vbGRfc3RhcnQsIF9fcG9zLCBfX3hfY29weSk7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkgICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UKKwl7CisJICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2JhY2soX19uKTsKKwkgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNfYWZ0ZXIgPQorCSAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc19iZWZvcmU7CisJICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gX19lbGVtc19hZnRlcjsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBpZiAoX19lbGVtc19hZnRlciA+IGRpZmZlcmVuY2VfdHlwZShfX24pKQorCQl7CisJCSAgaXRlcmF0b3IgX19maW5pc2hfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaAorCQkJCQkgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fZmluaXNoX24sCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX3BvcywgX19maW5pc2hfbiwgX19vbGRfZmluaXNoKTsKKwkJICBzdGQ6OmZpbGwoX19wb3MsIF9fcG9zICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feF9jb3B5KTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfbW92ZSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSBfX3BvcyArIGRpZmZlcmVuY2VfdHlwZShfX24pLAorCQkJCQkJIF9feF9jb3B5LCBfX3BvcywKKwkJCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19uZXdfZmluaXNoOworCQkgIHN0ZDo6ZmlsbChfX3BvcywgX19vbGRfZmluaXNoLCBfX3hfY29weSk7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLAorICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19lbGVtc2JlZm9yZSA9IF9fcG9zIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKyAgICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuZ3RoID0gc2l6ZSgpOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2VsZW1zYmVmb3JlKSA8IF9fbGVuZ3RoIC8gMikKKwkgIHsKKwkgICAgaXRlcmF0b3IgX19uZXdfc3RhcnQgPSBfTV9yZXNlcnZlX2VsZW1lbnRzX2F0X2Zyb250KF9fbik7CisJICAgIGl0ZXJhdG9yIF9fb2xkX3N0YXJ0ID0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsKKwkgICAgX19wb3MgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19lbGVtc2JlZm9yZTsKKwkgICAgX190cnkKKwkgICAgICB7CisJCWlmIChfX2VsZW1zYmVmb3JlID49IGRpZmZlcmVuY2VfdHlwZShfX24pKQorCQkgIHsKKwkJICAgIGl0ZXJhdG9yIF9fc3RhcnRfbiA9ICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0CisJCQkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCV9fc3RhcnRfbiwgX19uZXdfc3RhcnQsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCQkgICAgX0dMSUJDWFhfTU9WRTMoX19zdGFydF9uLCBfX3BvcywgX19vbGRfc3RhcnQpOworCQkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MgLSBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJCSAgICBzdGQ6OmFkdmFuY2UoX19taWQsIGRpZmZlcmVuY2VfdHlwZShfX24pIC0gX19lbGVtc2JlZm9yZSk7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2NvcHkodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSAgIF9fcG9zLCBfX2ZpcnN0LCBfX21pZCwKKwkJCQkJCSAgIF9fbmV3X3N0YXJ0LAorCQkJCQkJICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJICAgIHN0ZDo6Y29weShfX21pZCwgX19sYXN0LCBfX29sZF9zdGFydCk7CisJCSAgfQorCSAgICAgIH0KKwkgICAgX19jYXRjaCguLi4pCisJICAgICAgeworCQlfTV9kZXN0cm95X25vZGVzKF9fbmV3X3N0YXJ0Ll9NX25vZGUsCisJCQkJIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSk7CisJCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICAgIH0KKwkgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaXRlcmF0b3IgX19uZXdfZmluaXNoID0gX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9iYWNrKF9fbik7CisgICAgICAgICAgaXRlcmF0b3IgX19vbGRfZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisgICAgICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fZWxlbXNhZnRlciA9CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUoX19sZW5ndGgpIC0gX19lbGVtc2JlZm9yZTsKKyAgICAgICAgICBfX3BvcyA9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gX19lbGVtc2FmdGVyOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChfX2VsZW1zYWZ0ZXIgPiBkaWZmZXJlbmNlX3R5cGUoX19uKSkKKwkJeworCQkgIGl0ZXJhdG9yIF9fZmluaXNoX24gPSAodGhpcy0+X01faW1wbC5fTV9maW5pc2gKKwkJCQkJIC0gZGlmZmVyZW5jZV90eXBlKF9fbikpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpbmlzaF9uLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3MsIF9fZmluaXNoX24sIF9fb2xkX2ZpbmlzaCk7CisJCSAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3MpOworCQl9CisgICAgICAgICAgICAgIGVsc2UKKwkJeworCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCQkgIHN0ZDo6YWR2YW5jZShfX21pZCwgX19lbGVtc2FmdGVyKTsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X21vdmUoX19taWQsIF9fbGFzdCwgX19wb3MsCisJCQkJCQkgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQkgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQkgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkJICBzdGQ6OmNvcHkoX19maXJzdCwgX19taWQsIF9fcG9zKTsKKwkJfQorICAgICAgICAgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyAxLAorCQkJICAgICAgIF9fbmV3X2ZpbmlzaC5fTV9ub2RlICsgMSk7CisgICAgICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgICB2b2lkCisgICAgIGRlcXVlPF9UcCwgX0FsbG9jPjo6CisgICAgIF9NX2Rlc3Ryb3lfZGF0YV9hdXgoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICB7CisgICAgICAgZm9yIChfTWFwX3BvaW50ZXIgX19ub2RlID0gX19maXJzdC5fTV9ub2RlICsgMTsKKwkgICAgX19ub2RlIDwgX19sYXN0Ll9NX25vZGU7ICsrX19ub2RlKQorCSBzdGQ6Ol9EZXN0cm95KCpfX25vZGUsICpfX25vZGUgKyBfU19idWZmZXJfc2l6ZSgpLAorCQkgICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKworICAgICAgIGlmIChfX2ZpcnN0Ll9NX25vZGUgIT0gX19sYXN0Ll9NX25vZGUpCisJIHsKKwkgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QuX01fY3VyLCBfX2ZpcnN0Ll9NX2xhc3QsCisJCQkgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICBzdGQ6Ol9EZXN0cm95KF9fbGFzdC5fTV9maXJzdCwgX19sYXN0Ll9NX2N1ciwKKwkJCSBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSB9CisgICAgICAgZWxzZQorCSBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QuX01fY3VyLCBfX2xhc3QuX01fY3VyLAorCQkgICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQoc2l6ZV90eXBlIF9fbmV3X2VsZW1zKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5tYXhfc2l6ZSgpIC0gdGhpcy0+c2l6ZSgpIDwgX19uZXdfZWxlbXMpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJkZXF1ZTo6X01fbmV3X2VsZW1lbnRzX2F0X2Zyb250IikpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfbm9kZXMgPSAoKF9fbmV3X2VsZW1zICsgX1NfYnVmZmVyX3NpemUoKSAtIDEpCisJCQkJICAgICAvIF9TX2J1ZmZlcl9zaXplKCkpOworICAgICAgX01fcmVzZXJ2ZV9tYXBfYXRfZnJvbnQoX19uZXdfbm9kZXMpOworICAgICAgc2l6ZV90eXBlIF9faTsKKyAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX25ld19ub2RlczsgKytfX2kpCisgICAgICAgICAgICAqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSAtIF9faSkgPSB0aGlzLT5fTV9hbGxvY2F0ZV9ub2RlKCk7CisgICAgICAgIH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICB7CisgICAgICAgICAgZm9yIChzaXplX3R5cGUgX19qID0gMTsgX19qIDwgX19pOyArK19faikKKyAgICAgICAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZSgqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSAtIF9faikpOworICAgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZGVxdWU8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9uZXdfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uZXdfZWxlbXMpCisgICAgeworICAgICAgaWYgKHRoaXMtPm1heF9zaXplKCkgLSB0aGlzLT5zaXplKCkgPCBfX25ld19lbGVtcykKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oImRlcXVlOjpfTV9uZXdfZWxlbWVudHNfYXRfYmFjayIpKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmV3X25vZGVzID0gKChfX25ld19lbGVtcyArIF9TX2J1ZmZlcl9zaXplKCkgLSAxKQorCQkJCSAgICAgLyBfU19idWZmZXJfc2l6ZSgpKTsKKyAgICAgIF9NX3Jlc2VydmVfbWFwX2F0X2JhY2soX19uZXdfbm9kZXMpOworICAgICAgc2l6ZV90eXBlIF9faTsKKyAgICAgIF9fdHJ5CisgICAgICAgIHsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX25ld19ub2RlczsgKytfX2kpCisgICAgICAgICAgICAqKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX25vZGUgKyBfX2kpID0gdGhpcy0+X01fYWxsb2NhdGVfbm9kZSgpOworICAgICAgICB9CisgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgeworICAgICAgICAgIGZvciAoc2l6ZV90eXBlIF9faiA9IDE7IF9faiA8IF9faTsgKytfX2opCisgICAgICAgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoKih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgX19qKSk7CisgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBkZXF1ZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX3JlYWxsb2NhdGVfbWFwKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCwgYm9vbCBfX2FkZF9hdF9mcm9udCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfbnVtX25vZGVzCisJPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlICsgMTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19udW1fbm9kZXMgPSBfX29sZF9udW1fbm9kZXMgKyBfX25vZGVzX3RvX2FkZDsKKworICAgICAgX01hcF9wb2ludGVyIF9fbmV3X25zdGFydDsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplID4gMiAqIF9fbmV3X251bV9ub2RlcykKKwl7CisJICBfX25ld19uc3RhcnQgPSB0aGlzLT5fTV9pbXBsLl9NX21hcCArICh0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplCisJCQkJCSAtIF9fbmV3X251bV9ub2RlcykgLyAyCisJICAgICAgICAgICAgICAgICArIChfX2FkZF9hdF9mcm9udCA/IF9fbm9kZXNfdG9fYWRkIDogMCk7CisJICBpZiAoX19uZXdfbnN0YXJ0IDwgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlKQorCSAgICBzdGQ6OmNvcHkodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLAorCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJICAgICAgX19uZXdfbnN0YXJ0KTsKKwkgIGVsc2UKKwkgICAgc3RkOjpjb3B5X2JhY2t3YXJkKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSwKKwkJCSAgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSwKKwkJCSAgICAgICBfX25ld19uc3RhcnQgKyBfX29sZF9udW1fbm9kZXMpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBzaXplX3R5cGUgX19uZXdfbWFwX3NpemUgPSB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6bWF4KHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUsCisJCQkJCQlfX25vZGVzX3RvX2FkZCkgKyAyOworCisJICBfTWFwX3BvaW50ZXIgX19uZXdfbWFwID0gdGhpcy0+X01fYWxsb2NhdGVfbWFwKF9fbmV3X21hcF9zaXplKTsKKwkgIF9fbmV3X25zdGFydCA9IF9fbmV3X21hcCArIChfX25ld19tYXBfc2l6ZSAtIF9fbmV3X251bV9ub2RlcykgLyAyCisJICAgICAgICAgICAgICAgICArIChfX2FkZF9hdF9mcm9udCA/IF9fbm9kZXNfdG9fYWRkIDogMCk7CisJICBzdGQ6OmNvcHkodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLAorCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEsCisJCSAgICBfX25ld19uc3RhcnQpOworCSAgX01fZGVhbGxvY2F0ZV9tYXAodGhpcy0+X01faW1wbC5fTV9tYXAsIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUpOworCisJICB0aGlzLT5fTV9pbXBsLl9NX21hcCA9IF9fbmV3X21hcDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgPSBfX25ld19tYXBfc2l6ZTsKKwl9CisKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fc2V0X25vZGUoX19uZXdfbnN0YXJ0KTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKF9fbmV3X25zdGFydCArIF9fb2xkX251bV9ub2RlcyAtIDEpOworICAgIH0KKworICAvLyBPdmVybG9hZCBmb3IgZGVxdWU6Oml0ZXJhdG9ycywgZXhwbG9pdGluZyB0aGUgInNlZ21lbnRlZC1pdGVyYXRvcgorICAvLyBvcHRpbWl6YXRpb24iLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIGZpbGwoY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4mIF9fZmlyc3QsCisJIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+JiBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+OjpfU2VsZiBfU2VsZjsKKworICAgICAgZm9yICh0eXBlbmFtZSBfU2VsZjo6X01hcF9wb2ludGVyIF9fbm9kZSA9IF9fZmlyc3QuX01fbm9kZSArIDE7CisgICAgICAgICAgIF9fbm9kZSA8IF9fbGFzdC5fTV9ub2RlOyArK19fbm9kZSkKKwlzdGQ6OmZpbGwoKl9fbm9kZSwgKl9fbm9kZSArIF9TZWxmOjpfU19idWZmZXJfc2l6ZSgpLCBfX3ZhbHVlKTsKKworICAgICAgaWYgKF9fZmlyc3QuX01fbm9kZSAhPSBfX2xhc3QuX01fbm9kZSkKKwl7CisJICBzdGQ6OmZpbGwoX19maXJzdC5fTV9jdXIsIF9fZmlyc3QuX01fbGFzdCwgX192YWx1ZSk7CisJICBzdGQ6OmZpbGwoX19sYXN0Ll9NX2ZpcnN0LCBfX2xhc3QuX01fY3VyLCBfX3ZhbHVlKTsKKwl9CisgICAgICBlbHNlCisJc3RkOjpmaWxsKF9fZmlyc3QuX01fY3VyLCBfX2xhc3QuX01fY3VyLCBfX3ZhbHVlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2ZpcnN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2xhc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj46Ol9TZWxmIF9TZWxmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VsZjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fY2xlbgorCSAgICA9IHN0ZDo6bWluKF9fbGVuLCBzdGQ6Om1pbihfX2ZpcnN0Ll9NX2xhc3QgLSBfX2ZpcnN0Ll9NX2N1ciwKKwkJCQkgICAgICAgX19yZXN1bHQuX01fbGFzdCAtIF9fcmVzdWx0Ll9NX2N1cikpOworCSAgc3RkOjpjb3B5KF9fZmlyc3QuX01fY3VyLCBfX2ZpcnN0Ll9NX2N1ciArIF9fY2xlbiwgX19yZXN1bHQuX01fY3VyKTsKKwkgIF9fZmlyc3QgKz0gX19jbGVuOworCSAgX19yZXN1bHQgKz0gX19jbGVuOworCSAgX19sZW4gLT0gX19jbGVuOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2ZpcnN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fbGFzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+OjpfU2VsZiBfU2VsZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlbGY6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIGRpZmZlcmVuY2VfdHlwZSBfX2xsZW4gPSBfX2xhc3QuX01fY3VyIC0gX19sYXN0Ll9NX2ZpcnN0OworCSAgX1RwKiBfX2xlbmQgPSBfX2xhc3QuX01fY3VyOworCisJICBkaWZmZXJlbmNlX3R5cGUgX19ybGVuID0gX19yZXN1bHQuX01fY3VyIC0gX19yZXN1bHQuX01fZmlyc3Q7CisJICBfVHAqIF9fcmVuZCA9IF9fcmVzdWx0Ll9NX2N1cjsKKworCSAgaWYgKCFfX2xsZW4pCisJICAgIHsKKwkgICAgICBfX2xsZW4gPSBfU2VsZjo6X1NfYnVmZmVyX3NpemUoKTsKKwkgICAgICBfX2xlbmQgPSAqKF9fbGFzdC5fTV9ub2RlIC0gMSkgKyBfX2xsZW47CisJICAgIH0KKwkgIGlmICghX19ybGVuKQorCSAgICB7CisJICAgICAgX19ybGVuID0gX1NlbGY6Ol9TX2J1ZmZlcl9zaXplKCk7CisJICAgICAgX19yZW5kID0gKihfX3Jlc3VsdC5fTV9ub2RlIC0gMSkgKyBfX3JsZW47CisJICAgIH0KKworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fY2xlbiA9IHN0ZDo6bWluKF9fbGVuLAorCQkJCQkJICBzdGQ6Om1pbihfX2xsZW4sIF9fcmxlbikpOworCSAgc3RkOjpjb3B5X2JhY2t3YXJkKF9fbGVuZCAtIF9fY2xlbiwgX19sZW5kLCBfX3JlbmQpOworCSAgX19sYXN0IC09IF9fY2xlbjsKKwkgIF9fcmVzdWx0IC09IF9fY2xlbjsKKwkgIF9fbGVuIC09IF9fY2xlbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2ZpcnN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2xhc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj46Ol9TZWxmIF9TZWxmOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VsZjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fY2xlbgorCSAgICA9IHN0ZDo6bWluKF9fbGVuLCBzdGQ6Om1pbihfX2ZpcnN0Ll9NX2xhc3QgLSBfX2ZpcnN0Ll9NX2N1ciwKKwkJCQkgICAgICAgX19yZXN1bHQuX01fbGFzdCAtIF9fcmVzdWx0Ll9NX2N1cikpOworCSAgc3RkOjptb3ZlKF9fZmlyc3QuX01fY3VyLCBfX2ZpcnN0Ll9NX2N1ciArIF9fY2xlbiwgX19yZXN1bHQuX01fY3VyKTsKKwkgIF9fZmlyc3QgKz0gX19jbGVuOworCSAgX19yZXN1bHQgKz0gX19jbGVuOworCSAgX19sZW4gLT0gX19jbGVuOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBfX2ZpcnN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IF9fbGFzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+OjpfU2VsZiBfU2VsZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlbGY6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIGRpZmZlcmVuY2VfdHlwZSBfX2xsZW4gPSBfX2xhc3QuX01fY3VyIC0gX19sYXN0Ll9NX2ZpcnN0OworCSAgX1RwKiBfX2xlbmQgPSBfX2xhc3QuX01fY3VyOworCisJICBkaWZmZXJlbmNlX3R5cGUgX19ybGVuID0gX19yZXN1bHQuX01fY3VyIC0gX19yZXN1bHQuX01fZmlyc3Q7CisJICBfVHAqIF9fcmVuZCA9IF9fcmVzdWx0Ll9NX2N1cjsKKworCSAgaWYgKCFfX2xsZW4pCisJICAgIHsKKwkgICAgICBfX2xsZW4gPSBfU2VsZjo6X1NfYnVmZmVyX3NpemUoKTsKKwkgICAgICBfX2xlbmQgPSAqKF9fbGFzdC5fTV9ub2RlIC0gMSkgKyBfX2xsZW47CisJICAgIH0KKwkgIGlmICghX19ybGVuKQorCSAgICB7CisJICAgICAgX19ybGVuID0gX1NlbGY6Ol9TX2J1ZmZlcl9zaXplKCk7CisJICAgICAgX19yZW5kID0gKihfX3Jlc3VsdC5fTV9ub2RlIC0gMSkgKyBfX3JsZW47CisJICAgIH0KKworCSAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fY2xlbiA9IHN0ZDo6bWluKF9fbGVuLAorCQkJCQkJICBzdGQ6Om1pbihfX2xsZW4sIF9fcmxlbikpOworCSAgc3RkOjptb3ZlX2JhY2t3YXJkKF9fbGVuZCAtIF9fY2xlbiwgX19sZW5kLCBfX3JlbmQpOworCSAgX19sYXN0IC09IF9fY2xlbjsKKwkgIF9fcmVzdWx0IC09IF9fY2xlbjsKKwkgIF9fbGVuIC09IF9fY2xlbjsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZXhjZXB0aW9uX2RlZmluZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9leGNlcHRpb25fZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTkzN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZXhjZXB0aW9uX2RlZmluZXMuaApAQCAtMCwwICsxLDQ3IEBACisvLyAtZm5vLWV4Y2VwdGlvbnMgU3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksCisvLyAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9leGNlcHRpb25fZGVmaW5lcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXhjZXB0aW9ufQorICovCisKKyNpZm5kZWYgX0VYQ0VQVElPTl9ERUZJTkVTX0gKKyNkZWZpbmUgX0VYQ0VQVElPTl9ERUZJTkVTX0ggMQorCisjaWZuZGVmIF9fRVhDRVBUSU9OUworLy8gSWZmIC1mbm8tZXhjZXB0aW9ucywgdHJhbnNmb3JtIGVycm9yIGhhbmRsaW5nIGNvZGUgdG8gd29yayB3aXRob3V0IGl0LgorIyBkZWZpbmUgX190cnkgICAgICBpZiAodHJ1ZSkKKyMgZGVmaW5lIF9fY2F0Y2goWCkgaWYgKGZhbHNlKQorIyBkZWZpbmUgX190aHJvd19leGNlcHRpb25fYWdhaW4KKyNlbHNlCisvLyBFbHNlIHByb2NlZWQgbm9ybWFsbHkuCisjIGRlZmluZSBfX3RyeSAgICAgIHRyeQorIyBkZWZpbmUgX19jYXRjaChYKSBjYXRjaChYKQorIyBkZWZpbmUgX190aHJvd19leGNlcHRpb25fYWdhaW4gdGhyb3cKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9leGNlcHRpb25fcHRyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZXhjZXB0aW9uX3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTE3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZXhjZXB0aW9uX3B0ci5oCkBAIC0wLDAgKzEsMTkxIEBACisvLyBFeGNlcHRpb24gSGFuZGxpbmcgc3VwcG9ydCBoZWFkZXIgKGV4Y2VwdGlvbl9wdHIgY2xhc3MpIGZvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyAKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2V4Y2VwdGlvbl9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4Y2VwdGlvbn0KKyAqLworCisjaWZuZGVmIF9FWENFUFRJT05fUFRSX0gKKyNkZWZpbmUgX0VYQ0VQVElPTl9QVFJfSAorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9leGNlcHRpb25fZGVmaW5lcy5oPgorCisjaWYgIWRlZmluZWQoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzQpCisjICBlcnJvciBUaGlzIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9uIHByb3BhZ2F0aW9uLgorI2VuZGlmCisKK2V4dGVybiAiQysrIiB7CisKK25hbWVzcGFjZSBzdGQgCit7CisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBleGNlcHRpb25zCisgICAqIEB7CisgICAqLworICBuYW1lc3BhY2UgX19leGNlcHRpb25fcHRyCisgIHsKKyAgICBjbGFzcyBleGNlcHRpb25fcHRyOworICB9CisKKyAgdXNpbmcgX19leGNlcHRpb25fcHRyOjpleGNlcHRpb25fcHRyOworCisgIC8qKiBPYnRhaW4gYW4gZXhjZXB0aW9uX3B0ciB0byB0aGUgY3VycmVudGx5IGhhbmRsZWQgZXhjZXB0aW9uLiBJZiB0aGVyZQorICAgKiAgaXMgbm9uZSwgb3IgdGhlIGN1cnJlbnRseSBoYW5kbGVkIGV4Y2VwdGlvbiBpcyBmb3JlaWduLCByZXR1cm4gdGhlIG51bGwKKyAgICogIHZhbHVlLgorICAgKi8KKyAgZXhjZXB0aW9uX3B0ciBjdXJyZW50X2V4Y2VwdGlvbigpIHRocm93KCk7CisKKyAgLy8vIFRocm93IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgZXhjZXB0aW9uX3B0ci4KKyAgdm9pZCByZXRocm93X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgbmFtZXNwYWNlIF9fZXhjZXB0aW9uX3B0cgorICB7CisgICAgLyoqCisgICAgICogIEBicmllZiBBbiBvcGFxdWUgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgZXhjZXB0aW9uLgorICAgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAgICovCisgICAgY2xhc3MgZXhjZXB0aW9uX3B0cgorICAgIHsKKyAgICAgIHZvaWQqIF9NX2V4Y2VwdGlvbl9vYmplY3Q7CisKKyAgICAgIGV4cGxpY2l0IGV4Y2VwdGlvbl9wdHIodm9pZCogX19lKSB0aHJvdygpOworCisgICAgICB2b2lkIF9NX2FkZHJlZigpIHRocm93KCk7CisgICAgICB2b2lkIF9NX3JlbGVhc2UoKSB0aHJvdygpOworCisgICAgICB2b2lkICpfTV9nZXQoKSBjb25zdCB0aHJvdygpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgICAgICBmcmllbmQgZXhjZXB0aW9uX3B0ciBzdGQ6OmN1cnJlbnRfZXhjZXB0aW9uKCkgdGhyb3coKTsKKyAgICAgIGZyaWVuZCB2b2lkIHN0ZDo6cmV0aHJvd19leGNlcHRpb24oZXhjZXB0aW9uX3B0cik7CisKKyAgICBwdWJsaWM6CisgICAgICBleGNlcHRpb25fcHRyKCkgdGhyb3coKTsKKworICAgICAgZXhjZXB0aW9uX3B0cihjb25zdCBleGNlcHRpb25fcHRyJikgdGhyb3coKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleGNlcHRpb25fcHRyKG51bGxwdHJfdCkgdGhyb3coKQorICAgICAgOiBfTV9leGNlcHRpb25fb2JqZWN0KDApCisgICAgICB7IH0KKworICAgICAgZXhjZXB0aW9uX3B0cihleGNlcHRpb25fcHRyJiYgX19vKSB0aHJvdygpCisgICAgICA6IF9NX2V4Y2VwdGlvbl9vYmplY3QoX19vLl9NX2V4Y2VwdGlvbl9vYmplY3QpCisgICAgICB7IF9fby5fTV9leGNlcHRpb25fb2JqZWN0ID0gMDsgfQorI2Vsc2UKKyAgICAgIHR5cGVkZWYgdm9pZCAoZXhjZXB0aW9uX3B0cjo6Kl9fc2FmZV9ib29sKSgpOworCisgICAgICAvLyBGb3IgY29uc3RydWN0aW9uIGZyb20gbnVsbHB0ciBvciAwLgorICAgICAgZXhjZXB0aW9uX3B0cihfX3NhZmVfYm9vbCkgdGhyb3coKTsKKyNlbmRpZgorCisgICAgICBleGNlcHRpb25fcHRyJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBleGNlcHRpb25fcHRyJikgdGhyb3coKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleGNlcHRpb25fcHRyJiAKKyAgICAgIG9wZXJhdG9yPShleGNlcHRpb25fcHRyJiYgX19vKSB0aHJvdygpCisgICAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9wdHIoc3RhdGljX2Nhc3Q8ZXhjZXB0aW9uX3B0ciYmPihfX28pKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIH5leGNlcHRpb25fcHRyKCkgdGhyb3coKTsKKworICAgICAgdm9pZCAKKyAgICAgIHN3YXAoZXhjZXB0aW9uX3B0ciYpIHRocm93KCk7CisKKyNpZmRlZiBfR0xJQkNYWF9FSF9QVFJfQ09NUEFUCisgICAgICAvLyBSZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIENYWEFCSV8xLjMuCisgICAgICB2b2lkIF9NX3NhZmVfYm9vbF9kdW1teSgpIHRocm93KCkgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOworICAgICAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB0aHJvdygpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworICAgICAgb3BlcmF0b3IgX19zYWZlX2Jvb2woKSBjb25zdCB0aHJvdygpOworI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leGNlcHRpb25fb2JqZWN0OyB9CisjZW5kaWYKKworICAgICAgZnJpZW5kIGJvb2wgCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGV4Y2VwdGlvbl9wdHImLCBjb25zdCBleGNlcHRpb25fcHRyJikgdGhyb3coKSAKKyAgICAgIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgICAgICBjb25zdCBjbGFzcyB0eXBlX2luZm8qCisgICAgICBfX2N4YV9leGNlcHRpb25fdHlwZSgpIGNvbnN0IHRocm93KCkgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisgICAgfTsKKworICAgIGJvb2wgCisgICAgb3BlcmF0b3I9PShjb25zdCBleGNlcHRpb25fcHRyJiwgY29uc3QgZXhjZXB0aW9uX3B0ciYpIHRocm93KCkgCisgICAgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgICBib29sIAorICAgIG9wZXJhdG9yIT0oY29uc3QgZXhjZXB0aW9uX3B0ciYsIGNvbnN0IGV4Y2VwdGlvbl9wdHImKSB0aHJvdygpIAorICAgIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGV4Y2VwdGlvbl9wdHImIF9fbGhzLCBleGNlcHRpb25fcHRyJiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKyAgfSAvLyBuYW1lc3BhY2UgX19leGNlcHRpb25fcHRyCisKKworICAvLy8gT2J0YWluIGFuIGV4Y2VwdGlvbl9wdHIgcG9pbnRpbmcgdG8gYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBvYmplY3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBleGNlcHRpb25fcHRyIAorICAgIGNvcHlfZXhjZXB0aW9uKF9FeCBfX2V4KSB0aHJvdygpCisgICAgeworICAgICAgX190cnkKKwl7CisjaWZkZWYgX19FWENFUFRJT05TCisJICB0aHJvdyBfX2V4OworI2VuZGlmCisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgcmV0dXJuIGN1cnJlbnRfZXhjZXB0aW9uKCk7CisJfQorICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDExMzAuIGNvcHlfZXhjZXB0aW9uIG5hbWUgbWlzbGVhZGluZworICAvLy8gT2J0YWluIGFuIGV4Y2VwdGlvbl9wdHIgcG9pbnRpbmcgdG8gYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBvYmplY3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBleGNlcHRpb25fcHRyIAorICAgIG1ha2VfZXhjZXB0aW9uX3B0cihfRXggX19leCkgdGhyb3coKQorICAgIHsgcmV0dXJuIHN0ZDo6Y29weV9leGNlcHRpb248X0V4PihfX2V4KTsgfQorCisgIC8vIEB9IGdyb3VwIGV4Y2VwdGlvbnMKK30gLy8gbmFtZXNwYWNlIHN0ZAorCit9IC8vIGV4dGVybiAiQysrIgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mb3J3YXJkX2xpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mb3J3YXJkX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMyNTMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2ZvcndhcmRfbGlzdC5oCkBAIC0wLDAgKzEsMTMwMyBAQAorLy8gPGZvcndhcmRfbGlzdC5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZm9yd2FyZF9saXN0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmb3J3YXJkX2xpc3R9CisgKi8KKworI2lmbmRlZiBfRk9SV0FSRF9MSVNUX0gKKyNkZWZpbmUgX0ZPUldBUkRfTElTVF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIGhlbHBlciBiYXNpYyBub2RlIGNsYXNzIGZvciAlZm9yd2FyZF9saXN0LgorICAgKiAgICAgICAgICBUaGlzIGlzIGp1c3QgYSBsaW5rZWQgbGlzdCB3aXRoIG5vdGhpbmcgaW5zaWRlIGl0LgorICAgKiAgICAgICAgICBUaGVyZSBhcmUgcHVyZWx5IGxpc3Qgc2h1ZmZsaW5nIHV0aWxpdHkgbWV0aG9kcyBoZXJlLgorICAgKi8KKyAgc3RydWN0IF9Gd2RfbGlzdF9ub2RlX2Jhc2UKKyAgeworICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UoKSA6IF9NX25leHQoMCkgeyB9CisKKyAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworCisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICBfTV90cmFuc2Zlcl9hZnRlcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2JlZ2luKQorICAgIHsKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fZW5kID0gX19iZWdpbjsKKyAgICAgIHdoaWxlIChfX2VuZCAmJiBfX2VuZC0+X01fbmV4dCkKKwlfX2VuZCA9IF9fZW5kLT5fTV9uZXh0OworICAgICAgcmV0dXJuIF9NX3RyYW5zZmVyX2FmdGVyKF9fYmVnaW4sIF9fZW5kKTsKKyAgICB9CisKKyAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgIF9NX3RyYW5zZmVyX2FmdGVyKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fYmVnaW4sCisJCSAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fZW5kKQorICAgIHsKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fa2VlcCA9IF9fYmVnaW4tPl9NX25leHQ7CisgICAgICBpZiAoX19lbmQpCisJeworCSAgX19iZWdpbi0+X01fbmV4dCA9IF9fZW5kLT5fTV9uZXh0OworCSAgX19lbmQtPl9NX25leHQgPSBfTV9uZXh0OworCX0KKyAgICAgIGVsc2UKKwlfX2JlZ2luLT5fTV9uZXh0ID0gMDsKKyAgICAgIF9NX25leHQgPSBfX2tlZXA7CisgICAgICByZXR1cm4gX19lbmQ7CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX3JldmVyc2VfYWZ0ZXIoKQorICAgIHsKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fdGFpbCA9IF9NX25leHQ7CisgICAgICBpZiAoIV9fdGFpbCkKKwlyZXR1cm47CisgICAgICB3aGlsZSAoX0Z3ZF9saXN0X25vZGVfYmFzZSogX190ZW1wID0gX190YWlsLT5fTV9uZXh0KQorCXsKKwkgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fa2VlcCA9IF9NX25leHQ7CisJICBfTV9uZXh0ID0gX190ZW1wOworCSAgX190YWlsLT5fTV9uZXh0ID0gX190ZW1wLT5fTV9uZXh0OworCSAgX01fbmV4dC0+X01fbmV4dCA9IF9fa2VlcDsKKwl9CisgICAgfQorICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBBIGhlbHBlciBub2RlIGNsYXNzIGZvciAlZm9yd2FyZF9saXN0LgorICAgKiAgICAgICAgICBUaGlzIGlzIGp1c3QgYSBsaW5rZWQgbGlzdCB3aXRoIGEgZGF0YSB2YWx1ZSBpbiBlYWNoIG5vZGUuCisgICAqICAgICAgICAgIFRoZXJlIGlzIGEgc29ydGluZyB1dGlsaXR5IG1ldGhvZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X25vZGUKKyAgICA6IHB1YmxpYyBfRndkX2xpc3Rfbm9kZV9iYXNlCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIF9Gd2RfbGlzdF9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICA6IF9Gd2RfbGlzdF9ub2RlX2Jhc2UoKSwgCisgICAgICAgICAgX01fdmFsdWUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7IH0KKworICAgICAgX1RwIF9NX3ZhbHVlOworICAgIH07CisKKyAgLyoqCisgICAqICAgQGJyaWVmIEEgZm9yd2FyZF9saXN0OjppdGVyYXRvci4KKyAgICogCisgICAqICAgQWxsIHRoZSBmdW5jdGlvbnMgYXJlIG9wIG92ZXJsb2Fkcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgIF9TZWxmOworICAgICAgdHlwZWRlZiBfRndkX2xpc3Rfbm9kZTxfVHA+ICAgICAgICAgICAgICAgIF9Ob2RlOworCisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9Gd2RfbGlzdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9Gd2RfbGlzdF9pdGVyYXRvcihfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX24pIAorICAgICAgOiBfTV9ub2RlKF9fbikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01fbm9kZSktPl9NX3ZhbHVlOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihzdGF0aWNfY2FzdDxfTm9kZSo+CisJCQkJKHRoaXMtPl9NX25vZGUpLT5fTV92YWx1ZSk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBfU2VsZiBfX3RtcCgqdGhpcyk7CisgICAgICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworICAgICAgICByZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICBfU2VsZgorICAgICAgX01fbmV4dCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmIChfTV9ub2RlKQorICAgICAgICAgIHJldHVybiBfRndkX2xpc3RfaXRlcmF0b3IoX01fbm9kZS0+X01fbmV4dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gX0Z3ZF9saXN0X2l0ZXJhdG9yKDApOworICAgICAgfQorCisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfTV9ub2RlOworICAgIH07CisKKyAgLyoqCisgICAqICAgQGJyaWVmIEEgZm9yd2FyZF9saXN0Ojpjb25zdF9pdGVyYXRvci4KKyAgICogCisgICAqICAgQWxsIHRoZSBmdW5jdGlvbnMgYXJlIG9wIG92ZXJsb2Fkcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yCisgICAgeworICAgICAgdHlwZWRlZiBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiAgICAgIF9TZWxmOworICAgICAgdHlwZWRlZiBjb25zdCBfRndkX2xpc3Rfbm9kZTxfVHA+ICAgICAgICAgIF9Ob2RlOworICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgIGl0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX24pIAorICAgICAgOiBfTV9ub2RlKF9fbikgeyB9CisKKyAgICAgIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdGVyKQorICAgICAgOiBfTV9ub2RlKF9faXRlci5fTV9ub2RlKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9ub2RlKS0+X01fdmFsdWU7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9Ob2RlKj4KKwkJCQkodGhpcy0+X01fbm9kZSktPl9NX3ZhbHVlKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisgICAgICAgIF9TZWxmIF9fdG1wKCp0aGlzKTsKKyAgICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisgICAgICAgIHJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlICE9IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIF9TZWxmCisgICAgICBfTV9uZXh0KCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPl9NX25vZGUpCisgICAgICAgICAgcmV0dXJuIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcihfTV9ub2RlLT5fTV9uZXh0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3IoMCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBsaXN0IGl0ZXJhdG9yIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZvcndhcmQgbGlzdCBpdGVyYXRvciBpbmVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Gd2RfbGlzdF9pdGVyYXRvcjxfVHA+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfRndkX2xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlICE9IF9feS5fTV9ub2RlOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEJhc2UgY2xhc3MgZm9yICVmb3J3YXJkX2xpc3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX0Z3ZF9saXN0X2Jhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlciBfVHBfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIAorICAgICAgICByZWJpbmQ8X0Z3ZF9saXN0X25vZGU8X1RwPj46Om90aGVyIF9Ob2RlX2FsbG9jX3R5cGU7CisKKyAgICAgIHN0cnVjdCBfRndkX2xpc3RfaW1wbCAKKyAgICAgIDogcHVibGljIF9Ob2RlX2FsbG9jX3R5cGUKKyAgICAgIHsKKyAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSBfTV9oZWFkOworCisgICAgICAgIF9Gd2RfbGlzdF9pbXBsKCkKKyAgICAgICAgOiBfTm9kZV9hbGxvY190eXBlKCksIF9NX2hlYWQoKQorICAgICAgICB7IH0KKworICAgICAgICBfRndkX2xpc3RfaW1wbChjb25zdCBfTm9kZV9hbGxvY190eXBlJiBfX2EpCisgICAgICAgIDogX05vZGVfYWxsb2NfdHlwZShfX2EpLCBfTV9oZWFkKCkKKyAgICAgICAgeyB9CisgICAgICB9OworCisgICAgICBfRndkX2xpc3RfaW1wbCBfTV9pbXBsOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgICAgICAgIF9Ob2RlOworCisgICAgICBfTm9kZV9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfTm9kZV9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgX0Z3ZF9saXN0X2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkgeyB9CisKKyAgICAgIF9Gd2RfbGlzdF9iYXNlKGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkgeyB9CisKKyAgICAgIF9Gd2RfbGlzdF9iYXNlKGNvbnN0IF9Gd2RfbGlzdF9iYXNlJiBfX2xzdCwgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICBfRndkX2xpc3RfYmFzZShfRndkX2xpc3RfYmFzZSYmIF9fbHN0LCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPSBfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dDsKKwlfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IDA7CisgICAgICB9CisKKyAgICAgIF9Gd2RfbGlzdF9iYXNlKF9Gd2RfbGlzdF9iYXNlJiYgX19sc3QpCisgICAgICA6IF9NX2ltcGwoX19sc3QuX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPSBfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dDsKKwlfX2xzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCA9IDA7CisgICAgICB9CisKKyAgICAgIH5fRndkX2xpc3RfYmFzZSgpCisgICAgICB7IF9NX2VyYXNlX2FmdGVyKCZfTV9pbXBsLl9NX2hlYWQsIDApOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuYWxsb2NhdGUoMSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIF9Ob2RlKgorICAgICAgICBfTV9jcmVhdGVfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeworICAgICAgICAgIF9Ob2RlKiBfX25vZGUgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmNvbnN0cnVjdChfX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgICAgICAgICAgX19ub2RlLT5fTV9uZXh0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdGhpcy0+X01fcHV0X25vZGUoX19ub2RlKTsKKyAgICAgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIF9fbm9kZTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICAgICAgX01faW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dF9ub2RlKF9Ob2RlKiBfX3ApCisgICAgICB7IF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmRlYWxsb2NhdGUoX19wLCAxKTsgfQorCisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgICAgX01fZXJhc2VfYWZ0ZXIoX0Z3ZF9saXN0X25vZGVfYmFzZSogX19wb3MpOworCisgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKgorICAgICAgX01fZXJhc2VfYWZ0ZXIoX0Z3ZF9saXN0X25vZGVfYmFzZSogX19wb3MsIAorICAgICAgICAgICAgICAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX19sYXN0KTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIHdpdGggbGluZWFyIHRpbWUgYWNjZXNzIHRvIGVsZW1lbnRzLAorICAgKiAgYW5kIGZpeGVkIHRpbWUgaW5zZXJ0aW9uL2RlbGV0aW9uIGF0IGFueSBwb2ludCBpbiB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPiwgaW5jbHVkaW5nIHRoZQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjgiPm9wdGlvbmFsIHNlcXVlbmNlIHJlcXVpcmVtZW50czwvYT4gd2l0aCB0aGUKKyAgICogICVleGNlcHRpb24gb2YgQGMgYXQgYW5kIEBjIG9wZXJhdG9yW10uCisgICAqCisgICAqICBUaGlzIGlzIGEgQGUgc2luZ2x5IEBlIGxpbmtlZCAlbGlzdC4gIFRyYXZlcnNhbCB1cCB0aGUKKyAgICogICVsaXN0IHJlcXVpcmVzIGxpbmVhciB0aW1lLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyBlbGVtZW50cyAob3IKKyAgICogIEBlIG5vZGVzKSBpcyBkb25lIGluIGNvbnN0YW50IHRpbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlCisgICAqICBjaGFuZ2UgdGFrZXMgcGxhY2UuICBVbmxpa2Ugc3RkOjp2ZWN0b3IgYW5kIHN0ZDo6ZGVxdWUsCisgICAqICByYW5kb20tYWNjZXNzIGl0ZXJhdG9ycyBhcmUgbm90IHByb3ZpZGVkLCBzbyBzdWJzY3JpcHRpbmcgKCBAYworICAgKiAgW10gKSBhY2Nlc3MgaXMgbm90IGFsbG93ZWQuICBGb3IgYWxnb3JpdGhtcyB3aGljaCBvbmx5IG5lZWQKKyAgICogIHNlcXVlbnRpYWwgYWNjZXNzLCB0aGlzIGxhY2sgbWFrZXMgbm8gZGlmZmVyZW5jZS4KKyAgICoKKyAgICogIEFsc28gdW5saWtlIHRoZSBvdGhlciBzdGFuZGFyZCBjb250YWluZXJzLCBzdGQ6OmZvcndhcmRfbGlzdCBwcm92aWRlcworICAgKiAgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyAldW5pcXVlIHRvIGxpbmtlZCBsaXN0cywgc3VjaCBhcworICAgKiAgc3BsaWNpbmcsIHNvcnRpbmcsIGFuZCBpbi1wbGFjZSByZXZlcnNhbC4KKyAgICoKKyAgICogIEEgY291cGxlIHBvaW50cyBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZm9yd2FyZF9saXN0PFRwPjoKKyAgICoKKyAgICogIEZpcnN0LCB3ZSBuZXZlciBhY3R1YWxseSBhbGxvY2F0ZSBhIFRwLCB3ZSBhbGxvY2F0ZQorICAgKiAgRndkX2xpc3Rfbm9kZTxUcD4ncyBhbmQgdHJ1c3QgWzIwLjEuNV0vNCB0byBEVFJULiAgVGhpcyBpcyB0byBlbnN1cmUKKyAgICogIHRoYXQgYWZ0ZXIgZWxlbWVudHMgZnJvbSAlZm9yd2FyZF9saXN0PFgsQWxsb2MxPiBhcmUgc3BsaWNlZCBpbnRvCisgICAqICAlZm9yd2FyZF9saXN0PFgsQWxsb2MyPiwgZGVzdHJveWluZyB0aGUgbWVtb3J5IG9mIHRoZSBzZWNvbmQgJWxpc3QgaXMgYQorICAgKiAgdmFsaWQgb3BlcmF0aW9uLCBpLmUuLCBBbGxvYzEgZ2l2ZXRoIGFuZCBBbGxvYzIgdGFrZXRoIGF3YXkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBmb3J3YXJkX2xpc3QgOiBwcml2YXRlIF9Gd2RfbGlzdF9iYXNlPF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz4gICAgICAgICAgICAgICAgICBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgX05vZGU7CisgICAgICB0eXBlZGVmIF9Gd2RfbGlzdF9ub2RlX2Jhc2UgICAgICAgICAgICAgICAgICAgICAgICAgIF9Ob2RlX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpfVHBfYWxsb2NfdHlwZSAgICAgICAgICAgICAgIF9UcF9hbGxvY190eXBlOworCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgICAgY29uc3RfcmVmZXJlbmNlOworIAorICAgICAgdHlwZWRlZiBfRndkX2xpc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0Z3ZF9saXN0X2NvbnN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgLy8gMjMuMi4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWZvcndhcmRfbGlzdCB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgYWwgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9fYWwpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5IGNvbnN0cnVjdG9yIHdpdGggYWxsb2NhdG9yIGFyZ3VtZW50LgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgSW5wdXQgbGlzdCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgYWwgICAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0LCBjb25zdCBfQWxsb2MmIF9fYWwpCisgICAgICA6IF9CYXNlKF9fbGlzdCwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUgY29uc3RydWN0b3Igd2l0aCBhbGxvY2F0b3IgYXJndW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBsaXN0ICBJbnB1dCBsaXN0IHRvIG1vdmUuCisgICAgICAgKiAgQHBhcmFtICBhbCAgICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3QoZm9yd2FyZF9saXN0JiYgX19saXN0LCBjb25zdCBfQWxsb2MmIF9fYWwpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX2xpc3QpLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVmb3J3YXJkX2xpc3Qgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgdGhlICVmb3J3YXJkX2xpc3Qgd2l0aCBAYSBuIGRlZmF1bHQKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZSgpCisgICAgICB7IF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVmb3J3YXJkX2xpc3Qgd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIG4gICAgICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICB2YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgYWwgICAgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICVmb3J3YXJkX2xpc3Qgd2l0aCBAYSBuIGNvcGllcyBvZiBAYQorICAgICAgICogIHZhbHVlLgorICAgICAgICovCisgICAgICBmb3J3YXJkX2xpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfX2FsKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVmb3J3YXJkX2xpc3QgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgYWwgICAgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVmb3J3YXJkX2xpc3QgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbQGEgZmlyc3QsQGEgbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOICh3aGVyZSBOIGlzCisgICAgICAgKiAgZGlzdGFuY2UoQGEgZmlyc3QsQGEgbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgZm9yd2FyZF9saXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgICA6IF9CYXNlKF9fYWwpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKyAgICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlICVmb3J3YXJkX2xpc3QgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGxpc3QgIEEgJWZvcndhcmRfbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgICB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWZvcndhcmRfbGlzdCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbgorICAgICAgICogIG9iamVjdCB1c2VkIGJ5IEBhIGxpc3QuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdChjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICAgIDogX0Jhc2UoX19saXN0Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKQorICAgICAgeyBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fbGlzdC5iZWdpbigpLCBfX2xpc3QuZW5kKCksIF9fZmFsc2VfdHlwZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSAlZm9yd2FyZF9saXN0IG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBsaXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmb3J3YXJkX2xpc3QgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhCisgICAgICAgKiAgZm9yd2FyZF9saXN0LiBUaGUgY29udGVudHMgb2YgQGEgbGlzdCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkCisgICAgICAgKiAgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVmb3J3YXJkX2xpc3QgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0CisgICAgICAgKiAgQHBhcmFtICBpbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICogIEBwYXJhbSAgYWwgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVmb3J3YXJkX2xpc3QgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgaW4gdGhlIGluaXRpYWxpemVyX2xpc3QgQGEgaWwuICBUaGlzIGlzIGxpbmVhciBpbiBpbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9BbGxvYyYgX19hbCA9IF9BbGxvYygpKQorICAgICAgOiBfQmFzZShfX2FsKQorICAgICAgeyBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9faWwuYmVnaW4oKSwgX19pbC5lbmQoKSwgX19mYWxzZV90eXBlKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGZvcndhcmRfbGlzdCBkdG9yLgorICAgICAgICovCisgICAgICB+Zm9yd2FyZF9saXN0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSAlZm9yd2FyZF9saXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsaXN0ICBBICVmb3J3YXJkX2xpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgbGlzdCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlICVmb3J3YXJkX2xpc3QgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgQSAlZm9yd2FyZF9saXN0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IKKyAgICAgICAqICAgICAgICAgICAgICAgIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgbGlzdCBhcmUgbW92ZWQgaW50byB0aGlzICVmb3J3YXJkX2xpc3QKKyAgICAgICAqICAod2l0aG91dCBjb3B5aW5nKS4gQGEgbGlzdCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQKKyAgICAgICAqICAlZm9yd2FyZF9saXN0CisgICAgICAgKi8KKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShmb3J3YXJkX2xpc3QmJiBfX2xpc3QpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX19saXN0KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlICVmb3J3YXJkX2xpc3QgaW5pdGlhbGl6ZXIgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgaWwgIEFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVfdHlwZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVwbGFjZSB0aGUgY29udGVudHMgb2YgdGhlICVmb3J3YXJkX2xpc3Qgd2l0aCBjb3BpZXMgb2YgdGhlCisgICAgICAgKiAgZWxlbWVudHMgaW4gdGhlIGluaXRpYWxpemVyX2xpc3QgQGEgaWwuICBUaGlzIGlzIGxpbmVhciBpbgorICAgICAgICogIGlsLnNpemUoKS4KKyAgICAgICAqLworICAgICAgZm9yd2FyZF9saXN0JgorICAgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpCisgICAgICB7CisgICAgICAgIGFzc2lnbihfX2lsKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSByYW5nZSB0byBhICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZm9yd2FyZF9saXN0IHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSByYW5nZSBbQGEgZmlyc3QsQGEgbGFzdCkuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVmb3J3YXJkX2xpc3QgYW5kCisgICAgICAgKiAgdGhhdCB0aGUgcmVzdWx0aW5nICVmb3J3YXJkX2xpc3QncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgICBpbnNlcnRfYWZ0ZXIoY2JlZm9yZV9iZWdpbigpLCBfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIGdpdmVuIHZhbHVlIHRvIGEgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqICBAcGFyYW0gIHZhbCAgVmFsdWUgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZm9yd2FyZF9saXN0IHdpdGggQGEgbiBjb3BpZXMgb2YgdGhlIGdpdmVuCisgICAgICAgKiAgdmFsdWUuICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZQorICAgICAgICogICVmb3J3YXJkX2xpc3QgYW5kIHRoYXQgdGhlIHJlc3VsdGluZyAlZm9yd2FyZF9saXN0J3Mgc2l6ZSBpcyB0aGUKKyAgICAgICAqICBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIGluc2VydF9hZnRlcihjYmVmb3JlX2JlZ2luKCksIF9fbiwgX192YWwpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXJfbGlzdCB0byBhICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBpbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgJWZvcndhcmRfbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBpbC4gIFRoaXMgaXMgbGluZWFyIGluCisgICAgICAgKiAgaWwuc2l6ZSgpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICAgIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgaW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX19pbCk7CisgICAgICB9CisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvLyAyMy4yLjMuMiBpdGVyYXRvcnM6CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogIGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigmdGhpcy0+X01faW1wbC5fTV9oZWFkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWZvcmVfYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAgICAqICBpbiB0aGUgJWZvcndhcmRfbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAlZm9yd2FyZF9saXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVmb3J3YXJkX2xpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJWZvcndhcmRfbGlzdCBpcyBlbXB0eS4gIChUaHVzIGJlZ2luKCkgd291bGQKKyAgICAgICAqICBlcXVhbCBlbmQoKS4pCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID09IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzaXplIG9mICVmb3J3YXJkX2xpc3QuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZ2V0X05vZGVfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsgfQorCisgICAgICAvLyAyMy4yLjMuMyBlbGVtZW50IGFjY2VzczoKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworICAgICAgICBfTm9kZSogX19mcm9udCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4odGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQpOworICAgICAgICByZXR1cm4gX19mcm9udC0+X01fdmFsdWU7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9Ob2RlKiBfX2Zyb250ID0gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCk7CisgICAgICAgIHJldHVybiBfX2Zyb250LT5fTV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4zLjQgbW9kae+sgWVyczoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RzIG9iamVjdCBpbiAlZm9yd2FyZF9saXN0IGF0IHRoZSBmcm9udCBvZiB0aGUKKyAgICAgICAqICAgICAgICAgIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBhcmdzICBBcmd1bWVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW4gb2JqZWN0IG9mIHR5cGUgVHAgY29uc3RydWN0ZWQKKyAgICAgICAqICB3aXRoIFRwKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0CisgICAgICAgKiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZm9yd2FyZF9saXN0IHRoaXMgb3BlcmF0aW9uIGNhbgorICAgICAgICogIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzCisgICAgICAgKiAgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsgdGhpcy0+X01faW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBmcm9udCBvZiB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHZhbCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBmcm9udCBvZiB0aGUgJWZvcndhcmRfbGlzdCBhbmQgYXNzaWducyB0aGUgZ2l2ZW4KKyAgICAgICAqICBkYXRhIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZm9yd2FyZF9saXN0IHRoaXMgb3BlcmF0aW9uCisgICAgICAgKiAgY2FuIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzCisgICAgICAgKiAgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgX192YWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udChfVHAmJiBfX3ZhbCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0X2FmdGVyKGNiZWZvcmVfYmVnaW4oKSwgc3RkOjptb3ZlKF9fdmFsKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVmb3J3YXJkX2xpc3QKKyAgICAgICAqICBieSBvbmUuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcyBvcGVyYXRpb24gY2FuCisgICAgICAgKiAgYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcworICAgICAgICogIHRvIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncyBkYXRhCisgICAgICAgKiAgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfZnJvbnQoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RzIG9iamVjdCBpbiAlZm9yd2FyZF9saXN0IGFmdGVyIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICAgICAgICAgIGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgcG9zICBBIGNvbnN0X2l0ZXJhdG9yIGludG8gdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBhcmdzICBBcmd1bWVudHMuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW4gb2JqZWN0IG9mIHR5cGUgVCBjb25zdHJ1Y3RlZAorICAgICAgICogIHdpdGggVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIGFmdGVyIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBsb2NhdGlvbi4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWZvcndhcmRfbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4KKyAgICAgICAqICBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycworICAgICAgICogIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2luc2VydF9hZnRlcihfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvICVmb3J3YXJkX2xpc3QgYWZ0ZXIgc3BlY2lmaWVkCisgICAgICAgKiAgICAgICAgICBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHBvcyAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHZhbCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlIGFmdGVyCisgICAgICAgKiAgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWZvcndhcmRfbGlzdCB0aGlzCisgICAgICAgKiAgb3BlcmF0aW9uIGNhbiBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdAorICAgICAgICogIGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW5zZXJ0X2FmdGVyKF9fcG9zLCBfX3ZhbCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgX1RwJiYgX192YWwpCisgICAgICB7IHJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbnNlcnRfYWZ0ZXIoX19wb3MsIHN0ZDo6bW92ZShfX3ZhbCkpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSBudW1iZXIgb2YgY29waWVzIG9mIGdpdmVuIGRhdGEgaW50byB0aGUKKyAgICAgICAqICAgICAgICAgICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBwb3MgIEFuIGl0ZXJhdG9yIGludG8gdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBuICBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICB2YWwgIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgaW5zZXJ0ZWQgY29weSBvZgorICAgICAgICogICAgICAgICAgIEBhIHZhbCBvciBAYSBwb3MgaWYgQGEgbiA9PSAwLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlCisgICAgICAgKiAgZ2l2ZW4gZGF0YSBhZnRlciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IEBhIHBvcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zZXJ0ZWQgYW5kCisgICAgICAgKiAgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSByYW5nZSBpbnRvIHRoZSAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgaW5zZXJ0ZWQgZWxlbWVudCBvcgorICAgICAgICogICAgICAgICAgIEBhIHBvcyBpZiBAYSBmaXJzdCA9PSBAYSBsYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUgcmFuZ2UgW0BhCisgICAgICAgKiAgZmlyc3QsQGEgbGFzdCkgaW50byB0aGUgJWZvcndhcmRfbGlzdCBhZnRlciB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCisgICAgICAgKiAgYnkgQGEgcG9zLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYW4gaW5pdGlhbGl6ZXJfbGlzdCBpbnRvCisgICAgICAgKiAgICAgICAgICAlZm9yd2FyZF9saXN0IGFmdGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBwb3MgIEFuIGl0ZXJhdG9yIGludG8gdGhlICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBpbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGluc2VydGVkIGVsZW1lbnQKKyAgICAgICAqICAgICAgICAgICBvciBAYSBwb3MgaWYgQGEgaWwgaXMgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgY29waWVzIG9mIHRoZSBkYXRhIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgaWwgaW50byB0aGUgJWZvcndhcmRfbGlzdCBiZWZvcmUgdGhlIGxvY2F0aW9uCisgICAgICAgKiAgc3BlY2lmaWVkIGJ5IEBhIHBvcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zZXJ0ZWQgYW5kCisgICAgICAgKiAgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWwpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZXMgdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYyBwb3MuCisgICAgICAgKiAgQHBhcmFtICBwb3MgIEl0ZXJhdG9yIHBvaW50aW5nIGJlZm9yZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBmb2xsb3dpbmcgdGhlIG9uZQorICAgICAgICogICAgICAgICAgIHRoYXQgd2FzIGVyYXNlZCwgb3IgZW5kKCkgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQKKyAgICAgICAqICB0aHVzIHNob3J0ZW4gdGhlICVmb3J3YXJkX2xpc3QgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVmb3J3YXJkX2xpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUKKyAgICAgICAqICBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0bworICAgICAgICogIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQKKyAgICAgICAqICBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4KKyAgICAgICAqICBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4KKwkJCQkJICAgICAoX19wb3MuX01fbm9kZSkpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgcG9zICBJdGVyYXRvciBwb2ludGluZyBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEBsYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAYQorICAgICAgICogIChwb3MsbGFzdCkgYW5kIHNob3J0ZW4gdGhlICVmb3J3YXJkX2xpc3QgYWNjb3JkaW5nbHkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciB0aW1lIGluIHRoZSBzaXplIG9mIHRoZSByYW5nZSBhbmQgb25seQorICAgICAgICogIGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKiAgVGhlIHVzZXIgaXMgYWxzbyBjYXV0aW9uZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZQorICAgICAgICogIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZQorICAgICAgICogIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlcgorICAgICAgICogIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZXJhc2VfYWZ0ZXIoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4KKwkJCQkJICAgICAoX19wb3MuX01fbm9kZSksCisJCQkJCSAgICAgY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4KKwkJCQkJICAgICAoX19sYXN0Ll9NX25vZGUpKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlZm9yd2FyZF9saXN0LgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgQSAlZm9yd2FyZF9saXN0IG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvcgorICAgICAgICogICAgICAgICAgICAgICAgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBsaXN0cyBpbiBjb25zdGFudAorICAgICAgICogIHRpbWUuICBOb3RlIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcworICAgICAgICogIHNwZWNpYWxpemVkIHN1Y2ggdGhhdCBzdGQ6OnN3YXAobDEsbDIpIHdpbGwgZmVlZCB0byB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7IHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCwKKwkJICBfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXNpemVzIHRoZSAlZm9yd2FyZF9saXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mCisgICAgICAgKiAgICAgICAgIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSBzeiBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVmb3J3YXJkX2xpc3Qgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlZm9yd2FyZF9saXN0IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlZm9yd2FyZF9saXN0J3MgY3VycmVudCBzaXplIHRoZSAlZm9yd2FyZF9saXN0IGlzIHRydW5jYXRlZCwKKyAgICAgICAqICBvdGhlcndpc2UgdGhlICVmb3J3YXJkX2xpc3QgaXMgZXh0ZW5kZWQgYW5kIHRoZSBuZXcgZWxlbWVudHMKKyAgICAgICAqICBhcmUgZGVmYXVsdCBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJlc2l6ZXMgdGhlICVmb3J3YXJkX2xpc3QgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtIHN6IE51bWJlciBvZiBlbGVtZW50cyB0aGUgJWZvcndhcmRfbGlzdCBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gdmFsIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVmb3J3YXJkX2xpc3QgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVmb3J3YXJkX2xpc3QncyBjdXJyZW50IHNpemUgdGhlICVmb3J3YXJkX2xpc3QgaXMgdHJ1bmNhdGVkLAorICAgICAgICogIG90aGVyd2lzZSB0aGUgJWZvcndhcmRfbGlzdCBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZQorICAgICAgICogIHBvcHVsYXRlZCB3aXRoIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2ltcGwuX01faGVhZCwgMCk7IH0KKworICAgICAgLy8gMjMuMi4zLjUgZm9yd2FyZF9saXN0IG9wZXJhdGlvbnM6CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGNvbnRlbnRzIG9mIGFub3RoZXIgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHBvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGFmdGVyLgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgU291cmNlIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFRoZSBlbGVtZW50cyBvZiBAYSBsaXN0IGFyZSBpbnNlcnRlZCBpbiBjb25zdGFudCB0aW1lIGFmdGVyCisgICAgICAgKiAgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBAYSBwb3MuICBAYSBsaXN0IGJlY29tZXMgYW4gZW1wdHkKKyAgICAgICAqICBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBSZXF1aXJlcyB0aGlzICE9IEBhIHguCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgeworCWlmICghX19saXN0LmVtcHR5KCkpCisJICBfTV9zcGxpY2VfYWZ0ZXIoX19wb3MsIHN0ZDo6bW92ZShfX2xpc3QpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgZWxlbWVudCBmcm9tIGFub3RoZXIgJWZvcndhcmRfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHBvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGFmdGVyLgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgU291cmNlIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBpICAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgYmVmb3JlIHRoZSBlbGVtZW50CisgICAgICAgKiAgICAgICAgICAgICAgdG8gbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgZWxlbWVudCBpbiBsaXN0IEBhIGxpc3QgcmVmZXJlbmNlZCBieSBAYSBpIGFuZAorICAgICAgICogIGluc2VydHMgaXQgaW50byB0aGUgY3VycmVudCBsaXN0IGFmdGVyIEBhIHBvcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3BsaWNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBmb3J3YXJkX2xpc3QmJiBfX2xpc3QsCisgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgX19pKQorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9faiA9IF9faTsKKwkrK19fajsKKwlpZiAoX19wb3MgPT0gX19pIHx8IF9fcG9zID09IF9faikKKwkgIHJldHVybjsKKworCXNwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fbGlzdCksIF9faSwgX19qKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgcmFuZ2UgZnJvbSBhbm90aGVyICVmb3J3YXJkX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBwb3MgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbGVtZW50IHRvIGluc2VydCBhZnRlci4KKyAgICAgICAqICBAcGFyYW0gIGxpc3QgIFNvdXJjZSBsaXN0LgorICAgICAgICogIEBwYXJhbSAgYmVmb3JlICBJdGVyYXRvciByZWZlcmVuY2luZyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHJhbmdlCisgICAgICAgKiAgICAgICAgICAgICAgICAgIGluIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZW5kIG9mIHJhbmdlIGluIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZWxlbWVudHMgaW4gdGhlIHJhbmdlIChiZWZvcmUsbGFzdCkgYW5kIGluc2VydHMgdGhlbQorICAgICAgICogIGFmdGVyIEBhIHBvcyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICoKKyAgICAgICAqICBVbmRlZmluZWQgaWYgQGEgcG9zIGlzIGluIChiZWZvcmUsbGFzdCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhbGwgZWxlbWVudHMgZXF1YWwgdG8gdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICB2YWwgIFRoZSB2YWx1ZSB0byByZW1vdmUuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgZXZlcnkgZWxlbWVudCBpbiB0aGUgbGlzdCBlcXVhbCB0byBAYSB2YWx1ZS4KKyAgICAgICAqICBSZW1haW5pbmcgZWxlbWVudHMgc3RheSBpbiBsaXN0IG9yZGVyLiAgTm90ZSB0aGF0IHRoaXMKKyAgICAgICAqICBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cworICAgICAgICogIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGFsbCBlbGVtZW50cyBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLgorICAgICAgICogIEBwYXJhbSAgcHJlZCAgVW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyBldmVyeSBlbGVtZW50IGluIHRoZSBsaXN0IGZvciB3aGljaCB0aGUgcHJlZGljYXRlCisgICAgICAgKiAgcmV0dXJucyB0cnVlLiAgUmVtYWluaW5nIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUKKyAgICAgICAqICB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWQ+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkIF9fcHJlZCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGNvbnNlY3V0aXZlIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhY2ggY29uc2VjdXRpdmUgc2V0IG9mIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgdmFsdWUsCisgICAgICAgKiAgcmVtb3ZlIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluCisgICAgICAgKiAgbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZQorICAgICAgICogIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsCisgICAgICAgKiAgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZworICAgICAgICogIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHVuaXF1ZSgpCisgICAgICB7IHRoaXMtPnVuaXF1ZShzdGQ6OmVxdWFsX3RvPF9UcD4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY29uc2VjdXRpdmUgZWxlbWVudHMgc2F0aXNmeWluZyBhIHByZWRpY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gIGJpbmFyeV9wcmVkICBCaW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhY2ggY29uc2VjdXRpdmUgc2V0IG9mIGVsZW1lbnRzIFtmaXJzdCxsYXN0KSB0aGF0CisgICAgICAgKiAgc2F0aXNmeSBwcmVkaWNhdGUoZmlyc3QsaSkgd2hlcmUgaSBpcyBhbiBpdGVyYXRvciBpbgorICAgICAgICogIFtmaXJzdCxsYXN0KSwgcmVtb3ZlIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gIFJlbWFpbmluZworICAgICAgICogIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkKKyAgICAgICAqICBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAgICAgICAqICBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpblByZWQ+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5QcmVkIF9fYmluYXJ5X3ByZWQpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1lcmdlIHNvcnRlZCBsaXN0cy4KKyAgICAgICAqICBAcGFyYW0gIGxpc3QgIFNvcnRlZCBsaXN0IHRvIG1lcmdlLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSBsaXN0IGFuZCB0aGlzIGxpc3QgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBvcGVyYXRvcjwoKS4gIE1lcmdlcyBlbGVtZW50cyBvZiBAYSBsaXN0IGludG8gdGhpcyBsaXN0IGluCisgICAgICAgKiAgc29ydGVkIG9yZGVyLCBsZWF2aW5nIEBhIGxpc3QgZW1wdHkgd2hlbiBjb21wbGV0ZS4gIEVsZW1lbnRzIGluCisgICAgICAgKiAgdGhpcyBsaXN0IHByZWNlZGUgZWxlbWVudHMgaW4gQGEgbGlzdCB0aGF0IGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgeyB0aGlzLT5tZXJnZShzdGQ6Om1vdmUoX19saXN0KSwgc3RkOjpsZXNzPF9UcD4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNZXJnZSBzb3J0ZWQgbGlzdHMgYWNjb3JkaW5nIHRvIGNvbXBhcmlzb24gZnVuY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICBsaXN0ICBTb3J0ZWQgbGlzdCB0byBtZXJnZS4KKyAgICAgICAqICBAcGFyYW0gIGNvbXAgQ29tcGFyaXNvbiBmdW5jdGlvbiBkZWZpbmluZyBzb3J0IG9yZGVyLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSBsaXN0IGFuZCB0aGlzIGxpc3QgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBjb21wLiAgTWVyZ2VzIGVsZW1lbnRzIG9mIEBhIGxpc3QgaW50byB0aGlzIGxpc3QKKyAgICAgICAqICBpbiBzb3J0ZWQgb3JkZXIsIGxlYXZpbmcgQGEgbGlzdCBlbXB0eSB3aGVuIGNvbXBsZXRlLiAgRWxlbWVudHMKKyAgICAgICAqICBpbiB0aGlzIGxpc3QgcHJlY2VkZSBlbGVtZW50cyBpbiBAYSBsaXN0IHRoYXQgYXJlIGVxdWl2YWxlbnQKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gY29tcCgpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIF9Db21wIF9fY29tcCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU29ydCB0aGUgZWxlbWVudHMgb2YgdGhlIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgaW4gTmxvZ04gdGltZS4gIEVxdWl2YWxlbnQKKyAgICAgICAqICBlbGVtZW50cyByZW1haW4gaW4gbGlzdCBvcmRlci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc29ydCgpCisgICAgICB7IHRoaXMtPnNvcnQoc3RkOjpsZXNzPF9UcD4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTb3J0IHRoZSBmb3J3YXJkX2xpc3QgdXNpbmcgYSBjb21wYXJpc29uIGZ1bmN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGluIE5sb2dOIHRpbWUuICBFcXVpdmFsZW50CisgICAgICAgKiAgZWxlbWVudHMgcmVtYWluIGluIGxpc3Qgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX0NvbXAgX19jb21wKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXZlcnNlIHRoZSBlbGVtZW50cyBpbiBsaXN0LgorICAgICAgICoKKyAgICAgICAqICBSZXZlcnNlIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBpbiBsaW5lYXIgdGltZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmV2ZXJzZSgpCisgICAgICB7IHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9yZXZlcnNlX2FmdGVyKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pLCBfX3gpOyB9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmFsc2VfdHlwZSk7CisKKyAgICAgIC8vIENhbGxlZCBieSBmb3J3YXJkX2xpc3Qobix2LGEpLCBhbmQgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHdoZW4gaXQKKyAgICAgIC8vIHR1cm5zIG91dCB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHNwbGljZV9hZnRlciBhbmQgaW5zZXJ0X2FmdGVyLgorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX3NwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYgX19saXN0KTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGZvcndhcmRfbGlzdChuKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHJlc2l6ZShzeikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2luc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbik7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBsaXN0IGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIGx4ICBBICVmb3J3YXJkX2xpc3QKKyAgICogIEBwYXJhbSAgbHkgIEEgJWZvcndhcmRfbGlzdCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIGx4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBmb3J3YXJkIGxpc3RzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBmb3J3YXJkIGxpc3RzLiAgRGVxdWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgY29ycmVzcG9uZGluZworICAgKiAgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KTsKKworICAvKioKKyAgICogIEBicmllZiAgRm9yd2FyZCBsaXN0IG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICBseCAgQSAlZm9yd2FyZF9saXN0LgorICAgKiAgQHBhcmFtICBseSAgQSAlZm9yd2FyZF9saXN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgbHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSBseCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgbHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBmb3J3YXJkIGxpc3RzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX2x4LmNiZWdpbigpLCBfX2x4LmNlbmQoKSwKKwkJCQkJICBfX2x5LmNiZWdpbigpLCBfX2x5LmNlbmQoKSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4ID09IF9fbHkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIChfX2x5IDwgX19seCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHggPCBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIFNlZSBzdGQ6OmZvcndhcmRfbGlzdDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKwkgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IF9fbHguc3dhcChfX2x5KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfRk9SV0FSRF9MSVNUX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mb3J3YXJkX2xpc3QudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2ZvcndhcmRfbGlzdC50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzMTlkYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mb3J3YXJkX2xpc3QudGNjCkBAIC0wLDAgKzEsNTAzIEBACisvLyA8Zm9yd2FyZF9saXN0LnRjYz4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2ZvcndhcmRfbGlzdC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmb3J3YXJkX2xpc3R9CisgKi8KKworI2lmbmRlZiBfRk9SV0FSRF9MSVNUX1RDQworI2RlZmluZSBfRk9SV0FSRF9MSVNUX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9Gd2RfbGlzdF9iYXNlPF9UcCwgX0FsbG9jPjo6CisgICAgX0Z3ZF9saXN0X2Jhc2UoY29uc3QgX0Z3ZF9saXN0X2Jhc2UmIF9fbHN0LCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2ltcGwoX19hKQorICAgIHsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0ID0gMDsKKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fdG8gPSAmdGhpcy0+X01faW1wbC5fTV9oZWFkOworICAgICAgX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19sc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpOworCisgICAgICB3aGlsZSAoX19jdXJyKQorICAgICAgICB7CisgICAgICAgICAgX190by0+X01fbmV4dCA9IF9NX2NyZWF0ZV9ub2RlKF9fY3Vyci0+X01fdmFsdWUpOworICAgICAgICAgIF9fdG8gPSBfX3RvLT5fTV9uZXh0OworICAgICAgICAgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIF9Gd2RfbGlzdF9ub2RlX2Jhc2UqCisgICAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgICAgX01faW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSogX190bworCSAgPSBjb25zdF9jYXN0PF9Gd2RfbGlzdF9ub2RlX2Jhc2UqPihfX3Bvcy5fTV9ub2RlKTsKKwlfTm9kZSogX190aGluZyA9IF9NX2NyZWF0ZV9ub2RlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICAgIF9fdGhpbmctPl9NX25leHQgPSBfX3RvLT5fTV9uZXh0OworICAgICAgICBfX3RvLT5fTV9uZXh0ID0gX190aGluZzsKKyAgICAgICAgcmV0dXJuIF9fdG8tPl9NX25leHQ7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlX2FmdGVyKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fcG9zKQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX2N1cnIgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcG9zLT5fTV9uZXh0KTsKKyAgICAgIF9fcG9zLT5fTV9uZXh0ID0gX19jdXJyLT5fTV9uZXh0OworICAgICAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuZGVzdHJveShfX2N1cnIpOworICAgICAgX01fcHV0X25vZGUoX19jdXJyKTsKKyAgICAgIHJldHVybiBfX3Bvcy0+X01fbmV4dDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0Z3ZF9saXN0X25vZGVfYmFzZSoKKyAgICBfRndkX2xpc3RfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlX2FmdGVyKF9Gd2RfbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLCAKKyAgICAgICAgICAgICAgICAgICBfRndkX2xpc3Rfbm9kZV9iYXNlKiBfX2xhc3QpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19wb3MtPl9NX25leHQpOworICAgICAgd2hpbGUgKF9fY3VyciAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICBfTm9kZSogX190ZW1wID0gX19jdXJyOworICAgICAgICAgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKyAgICAgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKS5kZXN0cm95KF9fdGVtcCk7CisgICAgICAgICAgX01fcHV0X25vZGUoX190ZW1wKTsKKyAgICAgICAgfQorICAgICAgX19wb3MtPl9NX25leHQgPSBfX2xhc3Q7CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mYWxzZV90eXBlKQorICAgICAgeworICAgICAgICBfTm9kZV9iYXNlKiBfX3RvID0gJnRoaXMtPl9NX2ltcGwuX01faGVhZDsKKyAgICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgICAgeworICAgICAgICAgICAgX190by0+X01fbmV4dCA9IHRoaXMtPl9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KTsKKyAgICAgICAgICAgIF9fdG8gPSBfX3RvLT5fTV9uZXh0OworICAgICAgICAgIH0KKyAgICAgIH0KKworICAvLyBDYWxsZWQgYnkgZm9yd2FyZF9saXN0KG4sdixhKSwgYW5kIHRoZSByYW5nZSBjb25zdHJ1Y3RvcgorICAvLyB3aGVuIGl0IHR1cm5zIG91dCB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fdG8gPSAmdGhpcy0+X01faW1wbC5fTV9oZWFkOworICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgIHsKKyAgICAgICAgICBfX3RvLT5fTV9uZXh0ID0gdGhpcy0+X01fY3JlYXRlX25vZGUoX192YWx1ZSk7CisgICAgICAgICAgX190byA9IF9fdG8tPl9NX25leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9Ob2RlX2Jhc2UqIF9fdG8gPSAmdGhpcy0+X01faW1wbC5fTV9oZWFkOworICAgICAgZm9yICg7IF9fbjsgLS1fX24pCisgICAgICAgIHsKKyAgICAgICAgICBfX3RvLT5fTV9uZXh0ID0gdGhpcy0+X01fY3JlYXRlX25vZGUoKTsKKyAgICAgICAgICBfX3RvID0gX190by0+X01fbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JgorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBmb3J3YXJkX2xpc3QmIF9fbGlzdCkKKyAgICB7CisgICAgICBpZiAoJl9fbGlzdCAhPSB0aGlzKQorICAgICAgICB7CisgICAgICAgICAgaXRlcmF0b3IgX19wcmV2MSA9IGJlZm9yZV9iZWdpbigpOworICAgICAgICAgIGl0ZXJhdG9yIF9fY3VycjEgPSBiZWdpbigpOworICAgICAgICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKKyAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0MiA9IF9fbGlzdC5jYmVnaW4oKTsKKyAgICAgICAgICBjb25zdF9pdGVyYXRvciBfX2xhc3QyID0gX19saXN0LmNlbmQoKTsKKyAgICAgICAgICB3aGlsZSAoX19jdXJyMSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICpfX2N1cnIxID0gKl9fZmlyc3QyOworICAgICAgICAgICAgICArK19fcHJldjE7CisgICAgICAgICAgICAgICsrX19jdXJyMTsKKyAgICAgICAgICAgICAgKytfX2ZpcnN0MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgICAgIGVyYXNlX2FmdGVyKF9fcHJldjEsIF9fbGFzdDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluc2VydF9hZnRlcihfX3ByZXYxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgICAgICAgIH0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfaW5zZXJ0X2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fc2F2ZWRfcG9zID0gX19wb3M7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX247IC0tX19uKQorCSAgICBfX3BvcyA9IGVtcGxhY2VfYWZ0ZXIoX19wb3MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGVyYXNlX2FmdGVyKF9fc2F2ZWRfcG9zLCArK19fcG9zKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICB7CisgICAgICBpdGVyYXRvciBfX2sgPSBiZWZvcmVfYmVnaW4oKTsKKworICAgICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKKyAgICAgIHdoaWxlIChfX2suX01fbmV4dCgpICE9IGVuZCgpICYmIF9fbGVuIDwgX19zeikKKyAgICAgICAgeworICAgICAgICAgICsrX19rOworICAgICAgICAgICsrX19sZW47CisgICAgICAgIH0KKyAgICAgIGlmIChfX2xlbiA9PSBfX3N6KQorICAgICAgICBlcmFzZV9hZnRlcihfX2ssIGVuZCgpKTsKKyAgICAgIGVsc2UKKwlfTV9kZWZhdWx0X2luc2VydF9hZnRlcihfX2ssIF9fc3ogLSBfX2xlbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fayA9IGJlZm9yZV9iZWdpbigpOworCisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgd2hpbGUgKF9fay5fTV9uZXh0KCkgIT0gZW5kKCkgJiYgX19sZW4gPCBfX3N6KQorICAgICAgICB7CisgICAgICAgICAgKytfX2s7CisgICAgICAgICAgKytfX2xlbjsKKyAgICAgICAgfQorICAgICAgaWYgKF9fbGVuID09IF9fc3opCisgICAgICAgIGVyYXNlX2FmdGVyKF9faywgZW5kKCkpOworICAgICAgZWxzZQorICAgICAgICBpbnNlcnRfYWZ0ZXIoX19rLCBfX3N6IC0gX19sZW4sIF9fdmFsKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9zcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX3RtcCA9IGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fcG9zLl9NX25vZGUpOworICAgICAgaXRlcmF0b3IgX19iZWZvcmUgPSBfX2xpc3QuYmVmb3JlX2JlZ2luKCk7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX190bXAtPl9NX3RyYW5zZmVyX2FmdGVyKF9fYmVmb3JlLl9NX25vZGUpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHNwbGljZV9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgZm9yd2FyZF9saXN0JiYsCisgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlLCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX190bXAgPSBjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX3Bvcy5fTV9ub2RlKTsKKyAgICAgIF9fdG1wLT5fTV90cmFuc2Zlcl9hZnRlcihjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX2JlZm9yZS5fTV9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PF9Ob2RlX2Jhc2UqPihfX2xhc3QuX01fbm9kZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICBpZiAoX19uKQorCXsKKwkgIGZvcndhcmRfbGlzdCBfX3RtcChfX24sIF9fdmFsLCB0aGlzLT5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisJICByZXR1cm4gX01fc3BsaWNlX2FmdGVyKF9fcG9zLCBzdGQ6Om1vdmUoX190bXApKTsKKwl9CisgICAgICBlbHNlCisJcmV0dXJuIGl0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fcG9zLl9NX25vZGUpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsCisJCSAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlmb3J3YXJkX2xpc3QgX190bXAoX19maXJzdCwgX19sYXN0LCB0aGlzLT5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisJaWYgKCFfX3RtcC5lbXB0eSgpKQorCSAgcmV0dXJuIF9NX3NwbGljZV9hZnRlcihfX3Bvcywgc3RkOjptb3ZlKF9fdG1wKSk7CisJZWxzZQorCSAgcmV0dXJuIGl0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGVfYmFzZSo+KF9fcG9zLl9NX25vZGUpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICB7CisgICAgICBpZiAoX19pbC5zaXplKCkpCisJeworCSAgZm9yd2FyZF9saXN0IF9fdG1wKF9faWwsIHRoaXMtPl9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsKKwkgIHJldHVybiBfTV9zcGxpY2VfYWZ0ZXIoX19wb3MsIHN0ZDo6bW92ZShfX3RtcCkpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZV9iYXNlKj4oX19wb3MuX01fbm9kZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgX05vZGUqIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oJnRoaXMtPl9NX2ltcGwuX01faGVhZCk7CisgICAgICBfTm9kZSogX19leHRyYSA9IDA7CisKKyAgICAgIHdoaWxlIChfTm9kZSogX190bXAgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fY3Vyci0+X01fbmV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX190bXAtPl9NX3ZhbHVlID09IF9fdmFsKQorCSAgICB7CisJICAgICAgaWYgKHN0ZDo6X19hZGRyZXNzb2YoX190bXAtPl9NX3ZhbHVlKQorCQkgICE9IHN0ZDo6X19hZGRyZXNzb2YoX192YWwpKQorCQl7CisJCSAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXJyKTsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19leHRyYSA9IF9fY3VycjsKKwkgICAgfQorCSAgX19jdXJyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX2N1cnItPl9NX25leHQpOworICAgICAgICB9CisKKyAgICAgIGlmIChfX2V4dHJhKQorCXRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fZXh0cmEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZD4KKyAgICAgIHZvaWQKKyAgICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgcmVtb3ZlX2lmKF9QcmVkIF9fcHJlZCkKKyAgICAgIHsKKwlfTm9kZSogX19jdXJyID0gc3RhdGljX2Nhc3Q8X05vZGUqPigmdGhpcy0+X01faW1wbC5fTV9oZWFkKTsKKyAgICAgICAgd2hpbGUgKF9Ob2RlKiBfX3RtcCA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoX19wcmVkKF9fdG1wLT5fTV92YWx1ZSkpCisgICAgICAgICAgICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3Vycik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIF9fY3VyciA9IHN0YXRpY19jYXN0PF9Ob2RlKj4oX19jdXJyLT5fTV9uZXh0KTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpblByZWQ+CisgICAgICB2b2lkCisgICAgICBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHVuaXF1ZShfQmluUHJlZCBfX2JpbmFyeV9wcmVkKQorICAgICAgeworICAgICAgICBpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKyAgICAgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisgICAgICAgICAgICBlcmFzZV9hZnRlcihfX2ZpcnN0KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgIHZvaWQKKyAgICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgbWVyZ2UoZm9yd2FyZF9saXN0JiYgX19saXN0LCBfQ29tcCBfX2NvbXApCisgICAgICB7CisgICAgICAgIF9Ob2RlX2Jhc2UqIF9fbm9kZSA9ICZ0aGlzLT5fTV9pbXBsLl9NX2hlYWQ7CisgICAgICAgIHdoaWxlIChfX25vZGUtPl9NX25leHQgJiYgX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfX2NvbXAoc3RhdGljX2Nhc3Q8X05vZGUqPgorICAgICAgICAgICAgICAgICAgICAgICAoX19saXN0Ll9NX2ltcGwuX01faGVhZC5fTV9uZXh0KS0+X01fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PF9Ob2RlKj4KKyAgICAgICAgICAgICAgICAgICAgICAgKF9fbm9kZS0+X01fbmV4dCktPl9NX3ZhbHVlKSkKKyAgICAgICAgICAgICAgX19ub2RlLT5fTV90cmFuc2Zlcl9hZnRlcigmX19saXN0Ll9NX2ltcGwuX01faGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQpOworICAgICAgICAgICAgX19ub2RlID0gX19ub2RlLT5fTV9uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgaWYgKF9fbGlzdC5fTV9pbXBsLl9NX2hlYWQuX01fbmV4dCkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfX25vZGUtPl9NX25leHQgPSBfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQ7CisgICAgICAgICAgICBfX2xpc3QuX01faW1wbC5fTV9oZWFkLl9NX25leHQgPSAwOworICAgICAgICAgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7CisgICAgICAvLyAgV2UgZG9uJ3QgaGF2ZSBzaXplKCkgc28gd2UgbmVlZCB0byB3YWxrIHRocm91Z2ggYm90aCBsaXN0cworICAgICAgLy8gIG1ha2luZyBzdXJlIGJvdGggaXRlcmF0b3JzIGFyZSB2YWxpZC4KKyAgICAgIGF1dG8gX19peCA9IF9fbHguY2JlZ2luKCk7CisgICAgICBhdXRvIF9faXkgPSBfX2x5LmNiZWdpbigpOworICAgICAgd2hpbGUgKF9faXggIT0gX19seC5jZW5kKCkgJiYgX19peSAhPSBfX2x5LmNlbmQoKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICgqX19peCAhPSAqX19peSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICArK19faXg7CisgICAgICAgICAgKytfX2l5OworICAgICAgICB9CisgICAgICBpZiAoX19peCA9PSBfX2x4LmNlbmQoKSAmJiBfX2l5ID09IF9fbHkuY2VuZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgIHZvaWQKKyAgICAgIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgc29ydChfQ29tcCBfX2NvbXApCisgICAgICB7CisgICAgICAgIC8vIElmIGBuZXh0JyBpcyAwLCByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICAgIF9Ob2RlKiBfX2xpc3QgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KHRoaXMtPl9NX2ltcGwuX01faGVhZC5fTV9uZXh0KTsKKyAgICAgICAgaWYgKCFfX2xpc3QpCisgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHVuc2lnbmVkIGxvbmcgX19pbnNpemUgPSAxOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9Ob2RlKiBfX3AgPSBfX2xpc3Q7CisgICAgICAgICAgICBfX2xpc3QgPSAwOworICAgICAgICAgICAgX05vZGUqIF9fdGFpbCA9IDA7CisKKyAgICAgICAgICAgIC8vIENvdW50IG51bWJlciBvZiBtZXJnZXMgd2UgZG8gaW4gdGhpcyBwYXNzLgorICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBfX25tZXJnZXMgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoX19wKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytfX25tZXJnZXM7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgZXhpc3RzIGEgbWVyZ2UgdG8gYmUgZG9uZS4KKyAgICAgICAgICAgICAgICAvLyBTdGVwIGBpbnNpemUnIHBsYWNlcyBhbG9uZyBmcm9tIHAuCisgICAgICAgICAgICAgICAgX05vZGUqIF9fcSA9IF9fcDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIF9fcHNpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgbG9uZyBfX2kgPSAwOyBfX2kgPCBfX2luc2l6ZTsgKytfX2kpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrX19wc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgX19xID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3EtPl9NX25leHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIV9fcSkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHEgaGFzbid0IGZhbGxlbiBvZmYgZW5kLCB3ZSBoYXZlIHR3byBsaXN0cyB0byBtZXJnZS4KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIF9fcXNpemUgPSBfX2luc2l6ZTsKKworICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBoYXZlIHR3byBsaXN0czsgbWVyZ2UgdGhlbS4KKyAgICAgICAgICAgICAgICB3aGlsZSAoX19wc2l6ZSA+IDAgfHwgKF9fcXNpemUgPiAwICYmIF9fcSkpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIERlY2lkZSB3aGV0aGVyIG5leHQgbm9kZSBvZiBtZXJnZSBjb21lcyBmcm9tIHAgb3IgcS4KKyAgICAgICAgICAgICAgICAgICAgX05vZGUqIF9fZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fcHNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwIGlzIGVtcHR5OyBlIG11c3QgY29tZSBmcm9tIHEuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2UgPSBfX3E7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3EgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcS0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fcXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfX3FzaXplID09IDAgfHwgIV9fcSkKKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxIGlzIGVtcHR5OyBlIG11c3QgY29tZSBmcm9tIHAuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2UgPSBfX3A7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3AgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcC0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fcHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfX2NvbXAoX19wLT5fTV92YWx1ZSwgX19xLT5fTV92YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3Qgbm9kZSBvZiBwIGlzIGxvd2VyOyBlIG11c3QgY29tZSBmcm9tIHAuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2UgPSBfX3A7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3AgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcC0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fcHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3Qgbm9kZSBvZiBxIGlzIGxvd2VyOyBlIG11c3QgY29tZSBmcm9tIHEuCisgICAgICAgICAgICAgICAgICAgICAgICBfX2UgPSBfX3E7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3EgPSBzdGF0aWNfY2FzdDxfTm9kZSo+KF9fcS0+X01fbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAtLV9fcXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV4dCBub2RlIHRvIHRoZSBtZXJnZWQgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fdGFpbCkKKyAgICAgICAgICAgICAgICAgICAgICBfX3RhaWwtPl9NX25leHQgPSBfX2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBfX2xpc3QgPSBfX2U7CisgICAgICAgICAgICAgICAgICAgIF9fdGFpbCA9IF9fZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE5vdyBwIGhhcyBzdGVwcGVkIGBpbnNpemUnIHBsYWNlcyBhbG9uZywgYW5kIHEgaGFzIHRvby4KKyAgICAgICAgICAgICAgICBfX3AgPSBfX3E7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fdGFpbC0+X01fbmV4dCA9IDA7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgZG9uZSBvbmx5IG9uZSBtZXJnZSwgd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAvLyBBbGxvdyBmb3Igbm1lcmdlcyA9PSAwLCB0aGUgZW1wdHkgbGlzdCBjYXNlLgorICAgICAgICAgICAgaWYgKF9fbm1lcmdlcyA8PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+X01faW1wbC5fTV9oZWFkLl9NX25leHQgPSBfX2xpc3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSByZXBlYXQsIG1lcmdpbmcgbGlzdHMgdHdpY2UgdGhlIHNpemUuCisgICAgICAgICAgICBfX2luc2l6ZSAqPSAyOworICAgICAgICAgIH0KKyAgICAgIH0KKyAKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9GT1JXQVJEX0xJU1RfVENDICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mc3RyZWFtLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mc3RyZWFtLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVjYTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2ZzdHJlYW0udGNjCkBAIC0wLDAgKzEsOTg0IEBACisvLyBGaWxlIGJhc2VkIHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorLy8gMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvZnN0cmVhbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtmc3RyZWFtfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy44ICBGaWxlLWJhc2VkIHN0cmVhbXMKKy8vCisKKyNpZm5kZWYgX0ZTVFJFQU1fVENDCisjZGVmaW5lIF9GU1RSRUFNX1RDQyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIF9NX2FsbG9jYXRlX2ludGVybmFsX2J1ZmZlcigpCisgICAgeworICAgICAgLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyIG9ubHkgaWYgb25lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdAorICAgICAgLy8gKGVpdGhlciBhbGxvY2F0ZWQgb3IgcHJvdmlkZWQgYnkgdGhlIHVzZXIgdmlhIHNldGJ1ZikuCisgICAgICBpZiAoIV9NX2J1Zl9hbGxvY2F0ZWQgJiYgIV9NX2J1ZikKKwl7CisJICBfTV9idWYgPSBuZXcgY2hhcl90eXBlW19NX2J1Zl9zaXplXTsKKwkgIF9NX2J1Zl9hbGxvY2F0ZWQgPSB0cnVlOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIF9NX2Rlc3Ryb3lfaW50ZXJuYWxfYnVmZmVyKCkgdGhyb3coKQorICAgIHsKKyAgICAgIGlmIChfTV9idWZfYWxsb2NhdGVkKQorCXsKKwkgIGRlbGV0ZSBbXSBfTV9idWY7CisJICBfTV9idWYgPSAwOworCSAgX01fYnVmX2FsbG9jYXRlZCA9IGZhbHNlOworCX0KKyAgICAgIGRlbGV0ZSBbXSBfTV9leHRfYnVmOworICAgICAgX01fZXh0X2J1ZiA9IDA7CisgICAgICBfTV9leHRfYnVmX3NpemUgPSAwOworICAgICAgX01fZXh0X25leHQgPSAwOworICAgICAgX01fZXh0X2VuZCA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGJhc2ljX2ZpbGVidWYoKSA6IF9fc3RyZWFtYnVmX3R5cGUoKSwgX01fbG9jaygpLCBfTV9maWxlKCZfTV9sb2NrKSwKKyAgICBfTV9tb2RlKGlvc19iYXNlOjpvcGVubW9kZSgwKSksIF9NX3N0YXRlX2JlZygpLCBfTV9zdGF0ZV9jdXIoKSwKKyAgICBfTV9zdGF0ZV9sYXN0KCksIF9NX2J1ZigwKSwgX01fYnVmX3NpemUoQlVGU0laKSwKKyAgICBfTV9idWZfYWxsb2NhdGVkKGZhbHNlKSwgX01fcmVhZGluZyhmYWxzZSksIF9NX3dyaXRpbmcoZmFsc2UpLCBfTV9wYmFjaygpLCAKKyAgICBfTV9wYmFja19jdXJfc2F2ZSgwKSwgX01fcGJhY2tfZW5kX3NhdmUoMCksIF9NX3BiYWNrX2luaXQoZmFsc2UpLAorICAgIF9NX2NvZGVjdnQoMCksIF9NX2V4dF9idWYoMCksIF9NX2V4dF9idWZfc2l6ZSgwKSwgX01fZXh0X25leHQoMCksCisgICAgX01fZXh0X2VuZCgwKQorICAgIHsKKyAgICAgIGlmIChoYXNfZmFjZXQ8X19jb2RlY3Z0X3R5cGU+KHRoaXMtPl9NX2J1Zl9sb2NhbGUpKQorCV9NX2NvZGVjdnQgPSAmdXNlX2ZhY2V0PF9fY29kZWN2dF90eXBlPih0aGlzLT5fTV9idWZfbG9jYWxlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6X19maWxlYnVmX3R5cGUqCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVuKGNvbnN0IGNoYXIqIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICB7CisgICAgICBfX2ZpbGVidWZfdHlwZSAqX19yZXQgPSAwOworICAgICAgaWYgKCF0aGlzLT5pc19vcGVuKCkpCisJeworCSAgX01fZmlsZS5vcGVuKF9fcywgX19tb2RlKTsKKwkgIGlmICh0aGlzLT5pc19vcGVuKCkpCisJICAgIHsKKwkgICAgICBfTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKTsKKwkgICAgICBfTV9tb2RlID0gX19tb2RlOworCisJICAgICAgLy8gU2V0dXAgaW5pdGlhbCBidWZmZXIgdG8gJ3VuY29tbWl0dGVkJyBtb2RlLgorCSAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgICBfTV93cml0aW5nID0gZmFsc2U7CisJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisKKwkgICAgICAvLyBSZXNldCB0byBpbml0aWFsIHN0YXRlLgorCSAgICAgIF9NX3N0YXRlX2xhc3QgPSBfTV9zdGF0ZV9jdXIgPSBfTV9zdGF0ZV9iZWc7CisKKwkgICAgICAvLyAyNy44LjEuMyw0CisJICAgICAgaWYgKChfX21vZGUgJiBpb3NfYmFzZTo6YXRlKQorCQkgICYmIHRoaXMtPnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmVuZCwgX19tb2RlKQorCQkgID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJCXRoaXMtPmNsb3NlKCk7CisJICAgICAgZWxzZQorCQlfX3JldCA9IHRoaXM7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9fZmlsZWJ1Zl90eXBlKgorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgY2xvc2UoKQorICAgIHsKKyAgICAgIGlmICghdGhpcy0+aXNfb3BlbigpKQorCXJldHVybiAwOworCisgICAgICBib29sIF9fdGVzdGZhaWwgPSBmYWxzZTsKKyAgICAgIHsKKwkvLyBOQjogRG8gdGhpcyBoZXJlIHNvIHRoYXQgcmUtb3BlbmVkIGZpbGVidWZzIHdpbGwgYmUgY29vbC4uLgorCXN0cnVjdCBfX2Nsb3NlX3NlbnRyeQorCXsKKwkgIGJhc2ljX2ZpbGVidWYgKl9fZmI7CisJICBfX2Nsb3NlX3NlbnRyeSAoYmFzaWNfZmlsZWJ1ZiAqX19mYmkpOiBfX2ZiKF9fZmJpKSB7IH0KKwkgIH5fX2Nsb3NlX3NlbnRyeSAoKQorCSAgeworCSAgICBfX2ZiLT5fTV9tb2RlID0gaW9zX2Jhc2U6Om9wZW5tb2RlKDApOworCSAgICBfX2ZiLT5fTV9wYmFja19pbml0ID0gZmFsc2U7CisJICAgIF9fZmItPl9NX2Rlc3Ryb3lfaW50ZXJuYWxfYnVmZmVyKCk7CisJICAgIF9fZmItPl9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgX19mYi0+X01fd3JpdGluZyA9IGZhbHNlOworCSAgICBfX2ZiLT5fTV9zZXRfYnVmZmVyKC0xKTsKKwkgICAgX19mYi0+X01fc3RhdGVfbGFzdCA9IF9fZmItPl9NX3N0YXRlX2N1ciA9IF9fZmItPl9NX3N0YXRlX2JlZzsKKwkgIH0KKwl9IF9fY3MgKHRoaXMpOworCisJX190cnkKKwkgIHsKKwkgICAgaWYgKCFfTV90ZXJtaW5hdGVfb3V0cHV0KCkpCisJICAgICAgX190ZXN0ZmFpbCA9IHRydWU7CisJICB9CisJX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgeworCSAgICBfTV9maWxlLmNsb3NlKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeyBfX3Rlc3RmYWlsID0gdHJ1ZTsgfQorICAgICAgfQorCisgICAgICBpZiAoIV9NX2ZpbGUuY2xvc2UoKSkKKwlfX3Rlc3RmYWlsID0gdHJ1ZTsKKworICAgICAgaWYgKF9fdGVzdGZhaWwpCisJcmV0dXJuIDA7CisgICAgICBlbHNlCisJcmV0dXJuIHRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzaG93bWFueWMoKQorICAgIHsKKyAgICAgIHN0cmVhbXNpemUgX19yZXQgPSAtMTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluICYmIHRoaXMtPmlzX29wZW4oKSkKKwl7CisJICAvLyBGb3IgYSBzdGF0ZWZ1bCBlbmNvZGluZyAoLTEpIHRoZSBwZW5kaW5nIHNlcXVlbmNlIG1pZ2h0IGJlIGp1c3QKKwkgIC8vIHNoaWZ0IGFuZCB1bnNoaWZ0IHByZWZpeGVzIHdpdGggbm8gYWN0dWFsIGNoYXJhY3Rlci4KKwkgIF9fcmV0ID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKworI2lmIF9HTElCQ1hYX0hBVkVfRE9TX0JBU0VEX0ZJTEVTWVNURU0KKwkgIC8vIEFib3V0IHRoaXMgd29ya2Fyb3VuZCwgc2VlIGxpYnN0ZGMrKy8yMDgwNi4KKwkgIGNvbnN0IGJvb2wgX190ZXN0YmluYXJ5ID0gX01fbW9kZSAmIGlvc19iYXNlOjpiaW5hcnk7CisJICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5lbmNvZGluZygpID49IDAKKwkgICAgICAmJiBfX3Rlc3RiaW5hcnkpCisjZWxzZQorCSAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuZW5jb2RpbmcoKSA+PSAwKQorI2VuZGlmCisJICAgIF9fcmV0ICs9IF9NX2ZpbGUuc2hvd21hbnljKCkgLyBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgdW5kZXJmbG93KCkKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluKQorCXsKKwkgIGlmIChfTV93cml0aW5nKQorCSAgICB7CisJICAgICAgaWYgKG92ZXJmbG93KCkgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorCQlyZXR1cm4gX19yZXQ7CisJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisJICAgICAgX01fd3JpdGluZyA9IGZhbHNlOworCSAgICB9CisJICAvLyBDaGVjayBmb3IgcGJhY2sgbWFkbmVzcywgYW5kIGlmIHNvIHN3aXRjaCBiYWNrIHRvIHRoZQorCSAgLy8gbm9ybWFsIGJ1ZmZlcnMgYW5kIGpldCBvdXR0YSBoZXJlIGJlZm9yZSBleHBlbnNpdmUKKwkgIC8vIGZpbGVvcHMgaGFwcGVuLi4uCisJICBfTV9kZXN0cm95X3BiYWNrKCk7CisKKwkgIGlmICh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpKQorCSAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCisJICAvLyBHZXQgYW5kIGNvbnZlcnQgaW5wdXQgc2VxdWVuY2UuCisJICBjb25zdCBzaXplX3QgX19idWZsZW4gPSBfTV9idWZfc2l6ZSA+IDEgPyBfTV9idWZfc2l6ZSAtIDEgOiAxOworCisJICAvLyBXaWxsIGJlIHNldCB0byB0cnVlIGlmIDo6cmVhZCgpIHJldHVybnMgMCBpbmRpY2F0aW5nIEVPRi4KKwkgIGJvb2wgX19nb3RfZW9mID0gZmFsc2U7CisJICAvLyBOdW1iZXIgb2YgaW50ZXJuYWwgY2hhcmFjdGVycyBwcm9kdWNlZC4KKwkgIHN0cmVhbXNpemUgX19pbGVuID0gMDsKKwkgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fciA9IGNvZGVjdnRfYmFzZTo6b2s7CisJICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkpCisJICAgIHsKKwkgICAgICBfX2lsZW4gPSBfTV9maWxlLnhzZ2V0bihyZWludGVycHJldF9jYXN0PGNoYXIqPih0aGlzLT5lYmFjaygpKSwKKwkJCQkgICAgICBfX2J1Zmxlbik7CisJICAgICAgaWYgKF9faWxlbiA9PSAwKQorCQlfX2dvdF9lb2YgPSB0cnVlOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKyAgICAgICAgICAgICAgLy8gV29yc3QtY2FzZSBudW1iZXIgb2YgZXh0ZXJuYWwgYnl0ZXMuCisJICAgICAgLy8gWFhYIE5vdCBkb25lIGVuY29kaW5nKCkgPT0gLTEuCisJICAgICAgY29uc3QgaW50IF9fZW5jID0gX01fY29kZWN2dC0+ZW5jb2RpbmcoKTsKKwkgICAgICBzdHJlYW1zaXplIF9fYmxlbjsgLy8gTWluaW11bSBidWZmZXIgc2l6ZS4KKwkgICAgICBzdHJlYW1zaXplIF9fcmxlbjsgLy8gTnVtYmVyIG9mIGNoYXJzIHRvIHJlYWQuCisJICAgICAgaWYgKF9fZW5jID4gMCkKKwkJX19ibGVuID0gX19ybGVuID0gX19idWZsZW4gKiBfX2VuYzsKKwkgICAgICBlbHNlCisJCXsKKwkJICBfX2JsZW4gPSBfX2J1ZmxlbiArIF9NX2NvZGVjdnQtPm1heF9sZW5ndGgoKSAtIDE7CisJCSAgX19ybGVuID0gX19idWZsZW47CisJCX0KKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcmVtYWluZGVyID0gX01fZXh0X2VuZCAtIF9NX2V4dF9uZXh0OworCSAgICAgIF9fcmxlbiA9IF9fcmxlbiA+IF9fcmVtYWluZGVyID8gX19ybGVuIC0gX19yZW1haW5kZXIgOiAwOworCisJICAgICAgLy8gQW4gaW1idWUgaW4gJ3JlYWQnIG1vZGUgaW1wbGllcyBmaXJzdCBjb252ZXJ0aW5nIHRoZSBleHRlcm5hbAorCSAgICAgIC8vIGNoYXJzIGFscmVhZHkgcHJlc2VudC4KKwkgICAgICBpZiAoX01fcmVhZGluZyAmJiB0aGlzLT5lZ3B0cigpID09IHRoaXMtPmViYWNrKCkgJiYgX19yZW1haW5kZXIpCisJCV9fcmxlbiA9IDA7CisKKwkgICAgICAvLyBBbGxvY2F0ZSBidWZmZXIgaWYgbmVjZXNzYXJ5IGFuZCBtb3ZlIHVuY29udmVydGVkCisJICAgICAgLy8gYnl0ZXMgdG8gZnJvbnQuCisJICAgICAgaWYgKF9NX2V4dF9idWZfc2l6ZSA8IF9fYmxlbikKKwkJeworCQkgIGNoYXIqIF9fYnVmID0gbmV3IGNoYXJbX19ibGVuXTsKKwkJICBpZiAoX19yZW1haW5kZXIpCisJCSAgICBfX2J1aWx0aW5fbWVtY3B5KF9fYnVmLCBfTV9leHRfbmV4dCwgX19yZW1haW5kZXIpOworCisJCSAgZGVsZXRlIFtdIF9NX2V4dF9idWY7CisJCSAgX01fZXh0X2J1ZiA9IF9fYnVmOworCQkgIF9NX2V4dF9idWZfc2l6ZSA9IF9fYmxlbjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKF9fcmVtYWluZGVyKQorCQlfX2J1aWx0aW5fbWVtbW92ZShfTV9leHRfYnVmLCBfTV9leHRfbmV4dCwgX19yZW1haW5kZXIpOworCisJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfYnVmOworCSAgICAgIF9NX2V4dF9lbmQgPSBfTV9leHRfYnVmICsgX19yZW1haW5kZXI7CisJICAgICAgX01fc3RhdGVfbGFzdCA9IF9NX3N0YXRlX2N1cjsKKworCSAgICAgIGRvCisJCXsKKwkJICBpZiAoX19ybGVuID4gMCkKKwkJICAgIHsKKwkJICAgICAgLy8gU2FuaXR5IGNoZWNrIQorCQkgICAgICAvLyBUaGlzIG1heSBmYWlsIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YKKwkJICAgICAgLy8gY29kZWN2dDo6bWF4X2xlbmd0aCgpIGlzIGJvZ3VzLgorCQkgICAgICBpZiAoX01fZXh0X2VuZCAtIF9NX2V4dF9idWYgKyBfX3JsZW4gPiBfTV9leHRfYnVmX3NpemUpCisJCQl7CisJCQkgIF9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCQkgICAgICAiY29kZWN2dDo6bWF4X2xlbmd0aCgpICIKKwkJCQkJICAgICAgImlzIG5vdCB2YWxpZCIpKTsKKwkJCX0KKwkJICAgICAgc3RyZWFtc2l6ZSBfX2VsZW4gPSBfTV9maWxlLnhzZ2V0bihfTV9leHRfZW5kLCBfX3JsZW4pOworCQkgICAgICBpZiAoX19lbGVuID09IDApCisJCQlfX2dvdF9lb2YgPSB0cnVlOworCQkgICAgICBlbHNlIGlmIChfX2VsZW4gPT0gLTEpCisJCQlicmVhazsKKwkJICAgICAgX01fZXh0X2VuZCArPSBfX2VsZW47CisJCSAgICB9CisKKwkJICBjaGFyX3R5cGUqIF9faWVuZCA9IHRoaXMtPmViYWNrKCk7CisJCSAgaWYgKF9NX2V4dF9uZXh0IDwgX01fZXh0X2VuZCkKKwkJICAgIF9fciA9IF9NX2NvZGVjdnQtPmluKF9NX3N0YXRlX2N1ciwgX01fZXh0X25leHQsCisJCQkJCSBfTV9leHRfZW5kLCBfTV9leHRfbmV4dCwKKwkJCQkJIHRoaXMtPmViYWNrKCksCisJCQkJCSB0aGlzLT5lYmFjaygpICsgX19idWZsZW4sIF9faWVuZCk7CisJCSAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6Om5vY29udikKKwkJICAgIHsKKwkJICAgICAgc2l6ZV90IF9fYXZhaWwgPSBfTV9leHRfZW5kIC0gX01fZXh0X2J1ZjsKKwkJICAgICAgX19pbGVuID0gc3RkOjptaW4oX19hdmFpbCwgX19idWZsZW4pOworCQkgICAgICB0cmFpdHNfdHlwZTo6Y29weSh0aGlzLT5lYmFjaygpLAorCQkJCQlyZWludGVycHJldF9jYXN0PGNoYXJfdHlwZSo+CisJCQkJCShfTV9leHRfYnVmKSwgX19pbGVuKTsKKwkJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfYnVmICsgX19pbGVuOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIF9faWxlbiA9IF9faWVuZCAtIHRoaXMtPmViYWNrKCk7CisKKwkJICAvLyBfTV9jb2RlY3Z0LT5pbiBtYXkgcmV0dXJuIGVycm9yIHdoaWxlIF9faWxlbiA+IDA6IHRoaXMgaXMKKwkJICAvLyBvaywgYW5kIGFjdHVhbGx5IG9jY3VycyBpbiBjYXNlIG9mIG1peGVkIGVuY29kaW5ncyAoZS5nLiwKKwkJICAvLyBYTUwgZmlsZXMpLgorCQkgIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjplcnJvcikKKwkJICAgIGJyZWFrOworCisJCSAgX19ybGVuID0gMTsKKwkJfQorCSAgICAgIHdoaWxlIChfX2lsZW4gPT0gMCAmJiAhX19nb3RfZW9mKTsKKwkgICAgfQorCisJICBpZiAoX19pbGVuID4gMCkKKwkgICAgeworCSAgICAgIF9NX3NldF9idWZmZXIoX19pbGVuKTsKKwkgICAgICBfTV9yZWFkaW5nID0gdHJ1ZTsKKwkgICAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19nb3RfZW9mKQorCSAgICB7CisJICAgICAgLy8gSWYgdGhlIGFjdHVhbCBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLCBzZXQgJ3VuY29tbWl0dGVkJworCSAgICAgIC8vIG1vZGUsIHRodXMgYWxsb3dpbmcgYW4gaW1tZWRpYXRlIHdyaXRlIHdpdGhvdXQgYW4KKwkgICAgICAvLyBpbnRlcnZlbmluZyBzZWVrLgorCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCSAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKwkgICAgICAvLyBIb3dldmVyLCByZWFjaGluZyBpdCB3aGlsZSBsb29waW5nIG9uIHBhcnRpYWwgbWVhbnMgdGhhdAorCSAgICAgIC8vIHRoZSBmaWxlIGhhcyBnb3QgYW4gaW5jb21wbGV0ZSBjaGFyYWN0ZXIuCisJICAgICAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpCisJCV9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCSAgICAiaW5jb21wbGV0ZSBjaGFyYWN0ZXIgaW4gZmlsZSIpKTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJICAgIF9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjp1bmRlcmZsb3cgIgorCQkJCSJpbnZhbGlkIGJ5dGUgc2VxdWVuY2UgaW4gZmlsZSIpKTsKKwkgIGVsc2UKKwkgICAgX190aHJvd19pb3NfZmFpbHVyZShfX04oImJhc2ljX2ZpbGVidWY6OnVuZGVyZmxvdyAiCisJCQkJImVycm9yIHJlYWRpbmcgdGhlIGZpbGUiKSk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcGJhY2tmYWlsKGludF90eXBlIF9faSkKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgaWYgKF9fdGVzdGluKQorCXsKKwkgIGlmIChfTV93cml0aW5nKQorCSAgICB7CisJICAgICAgaWYgKG92ZXJmbG93KCkgPT0gdHJhaXRzX3R5cGU6OmVvZigpKQorCQlyZXR1cm4gX19yZXQ7CisJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisJICAgICAgX01fd3JpdGluZyA9IGZhbHNlOworCSAgICB9CisJICAvLyBSZW1lbWJlciB3aGV0aGVyIHRoZSBwYmFjayBidWZmZXIgaXMgYWN0aXZlLCBvdGhlcndpc2UgYmVsb3cKKwkgIC8vIHdlIG1heSB0cnkgdG8gc3RvcmUgaW4gaXQgYSBzZWNvbmQgY2hhciAobGlic3RkYysrLzk3NjEpLgorCSAgY29uc3QgYm9vbCBfX3Rlc3RwYiA9IF9NX3BiYWNrX2luaXQ7CisJICBjb25zdCBib29sIF9fdGVzdGVvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2ksIF9fcmV0KTsKKwkgIGludF90eXBlIF9fdG1wOworCSAgaWYgKHRoaXMtPmViYWNrKCkgPCB0aGlzLT5ncHRyKCkpCisJICAgIHsKKwkgICAgICB0aGlzLT5nYnVtcCgtMSk7CisJICAgICAgX190bXAgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKHRoaXMtPnNlZWtvZmYoLTEsIGlvc19iYXNlOjpjdXIpICE9IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJICAgIHsKKwkgICAgICBfX3RtcCA9IHRoaXMtPnVuZGVyZmxvdygpOworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX190bXAsIF9fcmV0KSkKKwkJcmV0dXJuIF9fcmV0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIG5lZWQgdG8gbWFrZSBhCisJICAgICAgLy8gcHV0YmFjayBwb3NpdGlvbiBhdmFpbGFibGUuICBCdXQgdGhlIHNlZWsgbWF5IGZhaWwKKwkgICAgICAvLyAoZi5pLiwgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUsIHNlZQorCSAgICAgIC8vIGxpYnN0ZGMrKy85NDM5KSBhbmQgaW4gdGhhdCBjYXNlIHdlIHJldHVybgorCSAgICAgIC8vIHRyYWl0c190eXBlOjplb2YoKS4KKwkgICAgICByZXR1cm4gX19yZXQ7CisJICAgIH0KKworCSAgLy8gVHJ5IHRvIHB1dCBiYWNrIF9faSBpbnRvIGlucHV0IHNlcXVlbmNlIGluIG9uZSBvZiB0aHJlZSB3YXlzLgorCSAgLy8gT3JkZXIgdGhlc2UgdGVzdHMgZG9uZSBpbiBpcyB1bnNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuCisJICBpZiAoIV9fdGVzdGVvZiAmJiB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19pLCBfX3RtcCkpCisJICAgIF9fcmV0ID0gX19pOworCSAgZWxzZSBpZiAoX190ZXN0ZW9mKQorCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjpub3RfZW9mKF9faSk7CisJICBlbHNlIGlmICghX190ZXN0cGIpCisJICAgIHsKKwkgICAgICBfTV9jcmVhdGVfcGJhY2soKTsKKwkgICAgICBfTV9yZWFkaW5nID0gdHJ1ZTsKKwkgICAgICAqdGhpcy0+Z3B0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2kpOworCSAgICAgIF9fcmV0ID0gX19pOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgb3ZlcmZsb3coaW50X3R5cGUgX19jKQorICAgIHsKKyAgICAgIGludF90eXBlIF9fcmV0ID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3Rlb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX3JldCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdG91dCA9IF9NX21vZGUgJiBpb3NfYmFzZTo6b3V0OworICAgICAgaWYgKF9fdGVzdG91dCkKKwl7CisgICAgICAgICAgaWYgKF9NX3JlYWRpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKyAgICAgICAgICAgICAgY29uc3QgaW50IF9fZ3B0cl9vZmYgPSBfTV9nZXRfZXh0X3BvcyhfTV9zdGF0ZV9sYXN0KTsKKyAgICAgICAgICAgICAgaWYgKF9NX3NlZWsoX19ncHRyX29mZiwgaW9zX2Jhc2U6OmN1ciwgX01fc3RhdGVfbGFzdCkKKyAgICAgICAgICAgICAgICAgID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9fcmV0OworICAgICAgICAgICAgfQorCSAgaWYgKHRoaXMtPnBiYXNlKCkgPCB0aGlzLT5wcHRyKCkpCisJICAgIHsKKwkgICAgICAvLyBJZiBhcHByb3ByaWF0ZSwgYXBwZW5kIHRoZSBvdmVyZmxvdyBjaGFyLgorCSAgICAgIGlmICghX190ZXN0ZW9mKQorCQl7CisJCSAgKnRoaXMtPnBwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICB0aGlzLT5wYnVtcCgxKTsKKwkJfQorCisJICAgICAgLy8gQ29udmVydCBwZW5kaW5nIHNlcXVlbmNlIHRvIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uLAorCSAgICAgIC8vIGFuZCBvdXRwdXQuCisJICAgICAgaWYgKF9NX2NvbnZlcnRfdG9fZXh0ZXJuYWwodGhpcy0+cGJhc2UoKSwKKwkJCQkJIHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpKQorCQl7CisJCSAgX01fc2V0X2J1ZmZlcigwKTsKKwkJICBfX3JldCA9IHRyYWl0c190eXBlOjpub3RfZW9mKF9fYyk7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoX01fYnVmX3NpemUgPiAxKQorCSAgICB7CisJICAgICAgLy8gT3ZlcmZsb3cgaW4gJ3VuY29tbWl0dGVkJyBtb2RlOiBzZXQgX01fd3JpdGluZywgc2V0CisJICAgICAgLy8gdGhlIGJ1ZmZlciB0byB0aGUgaW5pdGlhbCAnd3JpdGUnIG1vZGUsIGFuZCBwdXQgX19jCisJICAgICAgLy8gaW50byB0aGUgYnVmZmVyLgorCSAgICAgIF9NX3NldF9idWZmZXIoMCk7CisJICAgICAgX01fd3JpdGluZyA9IHRydWU7CisJICAgICAgaWYgKCFfX3Rlc3Rlb2YpCisJCXsKKwkJICAqdGhpcy0+cHB0cigpID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgIHRoaXMtPnBidW1wKDEpOworCQl9CisJICAgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBVbmJ1ZmZlcmVkLgorCSAgICAgIGNoYXJfdHlwZSBfX2NvbnYgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisJICAgICAgaWYgKF9fdGVzdGVvZiB8fCBfTV9jb252ZXJ0X3RvX2V4dGVybmFsKCZfX2NvbnYsIDEpKQorCQl7CisJCSAgX01fd3JpdGluZyA9IHRydWU7CisJCSAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBib29sCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfTV9jb252ZXJ0X3RvX2V4dGVybmFsKF9DaGFyVCogX19pYnVmLCBzdHJlYW1zaXplIF9faWxlbikKKyAgICB7CisgICAgICAvLyBTaXplcyBvZiBleHRlcm5hbCBhbmQgcGVuZGluZyBvdXRwdXQuCisgICAgICBzdHJlYW1zaXplIF9fZWxlbjsKKyAgICAgIHN0cmVhbXNpemUgX19wbGVuOworICAgICAgaWYgKF9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpKQorCXsKKwkgIF9fZWxlbiA9IF9NX2ZpbGUueHNwdXRuKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9faWJ1ZiksIF9faWxlbik7CisJICBfX3BsZW4gPSBfX2lsZW47CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIFdvcnN0LWNhc2UgbnVtYmVyIG9mIGV4dGVybmFsIGJ5dGVzIG5lZWRlZC4KKwkgIC8vIFhYWCBOb3QgZG9uZSBlbmNvZGluZygpID09IC0xLgorCSAgc3RyZWFtc2l6ZSBfX2JsZW4gPSBfX2lsZW4gKiBfTV9jb2RlY3Z0LT5tYXhfbGVuZ3RoKCk7CisJICBjaGFyKiBfX2J1ZiA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fYmxlbikpOworCisJICBjaGFyKiBfX2JlbmQ7CisJICBjb25zdCBjaGFyX3R5cGUqIF9faWVuZDsKKwkgIGNvZGVjdnRfYmFzZTo6cmVzdWx0IF9fcjsKKwkgIF9fciA9IF9NX2NvZGVjdnQtPm91dChfTV9zdGF0ZV9jdXIsIF9faWJ1ZiwgX19pYnVmICsgX19pbGVuLAorCQkJCV9faWVuZCwgX19idWYsIF9fYnVmICsgX19ibGVuLCBfX2JlbmQpOworCisJICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2sgfHwgX19yID09IGNvZGVjdnRfYmFzZTo6cGFydGlhbCkKKwkgICAgX19ibGVuID0gX19iZW5kIC0gX19idWY7CisJICBlbHNlIGlmIChfX3IgPT0gY29kZWN2dF9iYXNlOjpub2NvbnYpCisJICAgIHsKKwkgICAgICAvLyBTYW1lIGFzIHRoZSBhbHdheXNfbm9jb252IGNhc2UgYWJvdmUuCisJICAgICAgX19idWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2lidWYpOworCSAgICAgIF9fYmxlbiA9IF9faWxlbjsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX3Rocm93X2lvc19mYWlsdXJlKF9fTigiYmFzaWNfZmlsZWJ1Zjo6X01fY29udmVydF90b19leHRlcm5hbCAiCisJCQkJICAgICJjb252ZXJzaW9uIGVycm9yIikpOworICAKKwkgIF9fZWxlbiA9IF9NX2ZpbGUueHNwdXRuKF9fYnVmLCBfX2JsZW4pOworCSAgX19wbGVuID0gX19ibGVuOworCisJICAvLyBUcnkgb25jZSBtb3JlIGZvciBwYXJ0aWFsIGNvbnZlcnNpb25zLgorCSAgaWYgKF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwgJiYgX19lbGVuID09IF9fcGxlbikKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19pcmVzdW1lID0gX19pZW5kOworCSAgICAgIHN0cmVhbXNpemUgX19ybGVuID0gdGhpcy0+cHB0cigpIC0gX19pZW5kOworCSAgICAgIF9fciA9IF9NX2NvZGVjdnQtPm91dChfTV9zdGF0ZV9jdXIsIF9faXJlc3VtZSwKKwkJCQkgICAgX19pcmVzdW1lICsgX19ybGVuLCBfX2llbmQsIF9fYnVmLAorCQkJCSAgICBfX2J1ZiArIF9fYmxlbiwgX19iZW5kKTsKKwkgICAgICBpZiAoX19yICE9IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJCXsKKwkJICBfX3JsZW4gPSBfX2JlbmQgLSBfX2J1ZjsKKwkJICBfX2VsZW4gPSBfTV9maWxlLnhzcHV0bihfX2J1ZiwgX19ybGVuKTsKKwkJICBfX3BsZW4gPSBfX3JsZW47CisJCX0KKwkgICAgICBlbHNlCisJCV9fdGhyb3dfaW9zX2ZhaWx1cmUoX19OKCJiYXNpY19maWxlYnVmOjpfTV9jb252ZXJ0X3RvX2V4dGVybmFsICIKKwkJCQkJImNvbnZlcnNpb24gZXJyb3IiKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19lbGVuID09IF9fcGxlbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHhzZ2V0bihfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgLy8gQ2xlYXIgb3V0IHBiYWNrIGJ1ZmZlciBiZWZvcmUgZ29pbmcgb24gdG8gdGhlIHJlYWwgZGVhbC4uLgorICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICBpZiAoX01fcGJhY2tfaW5pdCkKKwl7CisJICBpZiAoX19uID4gMCAmJiB0aGlzLT5ncHRyKCkgPT0gdGhpcy0+ZWJhY2soKSkKKwkgICAgeworCSAgICAgICpfX3MrKyA9ICp0aGlzLT5ncHRyKCk7IC8vIGVtdWxhdGUgbm9uLXVuZGVyZmxvd2luZyBzYnVtcGMKKwkgICAgICB0aGlzLT5nYnVtcCgxKTsKKwkgICAgICBfX3JldCA9IDE7CisJICAgICAgLS1fX247CisJICAgIH0KKwkgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKwl9CisgICAgICBlbHNlIGlmIChfTV93cml0aW5nKQorCXsKKyAJICBpZiAob3ZlcmZsb3coKSA9PSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgCSAgICByZXR1cm4gX19yZXQ7CisgCSAgX01fc2V0X2J1ZmZlcigtMSk7CisgCSAgX01fd3JpdGluZyA9IGZhbHNlOworIAl9CisgCisgICAgICAvLyBPcHRpbWl6YXRpb24gaW4gdGhlIGFsd2F5c19ub2NvbnYoKSBjYXNlLCB0byBiZSBnZW5lcmFsaXplZCBpbiB0aGUKKyAgICAgIC8vIGZ1dHVyZTogd2hlbiBfX24gPiBfX2J1ZmxlbiB3ZSByZWFkIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlCisgICAgICAvLyBidWZmZXIgcmVwZWF0ZWRseS4KKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0aW4gPSBfTV9tb2RlICYgaW9zX2Jhc2U6OmluOworICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2J1ZmxlbiA9IF9NX2J1Zl9zaXplID4gMSA/IF9NX2J1Zl9zaXplIC0gMSA6IDE7CisgCisgICAgICBpZiAoX19uID4gX19idWZsZW4gJiYgX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkKKyAJICAgJiYgX190ZXN0aW4pCisgCSB7CisgCSAgIC8vIEZpcnN0LCBjb3B5IHRoZSBjaGFycyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGJ1ZmZlci4KKyAJICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2F2YWlsID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKyAJICAgaWYgKF9fYXZhaWwgIT0gMCkKKyAJICAgICB7CisJICAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcywgdGhpcy0+Z3B0cigpLCBfX2F2YWlsKTsKKyAJICAgICAgIF9fcyArPSBfX2F2YWlsOworCSAgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmdwdHIoKSArIF9fYXZhaWwsCisJCQkgIHRoaXMtPmVncHRyKCkpOworCSAgICAgICBfX3JldCArPSBfX2F2YWlsOworCSAgICAgICBfX24gLT0gX19hdmFpbDsKKyAJICAgICB9CisgCisgCSAgIC8vIE5lZWQgdG8gbG9vcCBpbiBjYXNlIG9mIHNob3J0IHJlYWRzIChyZWxhdGl2ZWx5IGNvbW1vbgorIAkgICAvLyB3aXRoIHBpcGVzKS4KKyAJICAgc3RyZWFtc2l6ZSBfX2xlbjsKKyAJICAgZm9yICg7OykKKyAJICAgICB7CisgCSAgICAgICBfX2xlbiA9IF9NX2ZpbGUueHNnZXRuKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fcyksCisgCQkJCSAgICAgIF9fbik7CisgCSAgICAgICBpZiAoX19sZW4gPT0gLTEpCisgCQkgX190aHJvd19pb3NfZmFpbHVyZShfX04oImJhc2ljX2ZpbGVidWY6OnhzZ2V0biAiCisgCQkJCQkgImVycm9yIHJlYWRpbmcgdGhlIGZpbGUiKSk7CisgCSAgICAgICBpZiAoX19sZW4gPT0gMCkKKyAJCSBicmVhazsKKyAKKyAJICAgICAgIF9fbiAtPSBfX2xlbjsKKyAJICAgICAgIF9fcmV0ICs9IF9fbGVuOworIAkgICAgICAgaWYgKF9fbiA9PSAwKQorIAkJIGJyZWFrOworIAorIAkgICAgICAgX19zICs9IF9fbGVuOworIAkgICAgIH0KKyAKKyAJICAgaWYgKF9fbiA9PSAwKQorIAkgICAgIHsKKyAJICAgICAgIF9NX3NldF9idWZmZXIoMCk7CisgCSAgICAgICBfTV9yZWFkaW5nID0gdHJ1ZTsKKyAJICAgICB9CisgCSAgIGVsc2UgaWYgKF9fbGVuID09IDApCisgCSAgICAgeworIAkgICAgICAgLy8gSWYgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgc2V0ICd1bmNvbW1pdHRlZCcKKyAJICAgICAgIC8vIG1vZGUsIHRodXMgYWxsb3dpbmcgYW4gaW1tZWRpYXRlIHdyaXRlIHdpdGhvdXQKKyAJICAgICAgIC8vIGFuIGludGVydmVuaW5nIHNlZWsuCisgCSAgICAgICBfTV9zZXRfYnVmZmVyKC0xKTsKKyAJICAgICAgIF9NX3JlYWRpbmcgPSBmYWxzZTsKKyAJICAgICB9CisgCSB9CisgICAgICBlbHNlCisgCSBfX3JldCArPSBfX3N0cmVhbWJ1Zl90eXBlOjp4c2dldG4oX19zLCBfX24pOworIAorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgeHNwdXRuKGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIC8vIE9wdGltaXphdGlvbiBpbiB0aGUgYWx3YXlzX25vY29udigpIGNhc2UsIHRvIGJlIGdlbmVyYWxpemVkIGluIHRoZQorICAgICAgLy8gZnV0dXJlOiB3aGVuIF9fbiBpcyBzdWZmaWNpZW50bHkgbGFyZ2Ugd2Ugd3JpdGUgZGlyZWN0bHkgaW5zdGVhZCBvZgorICAgICAgLy8gdXNpbmcgdGhlIGJ1ZmZlci4KKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gX01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisgICAgICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkKKyAJICAgJiYgX190ZXN0b3V0ICYmICFfTV9yZWFkaW5nKQorCXsKKwkgIC8vIE1lYXN1cmVtZW50IHdvdWxkIHJldmVhbCB0aGUgYmVzdCBjaG9pY2UuCisJICBjb25zdCBzdHJlYW1zaXplIF9fY2h1bmsgPSAxdWwgPDwgMTA7CisJICBzdHJlYW1zaXplIF9fYnVmYXZhaWwgPSB0aGlzLT5lcHB0cigpIC0gdGhpcy0+cHB0cigpOworCisJICAvLyBEb24ndCBtaXN0YWtlICd1bmNvbW1pdHRlZCcgbW9kZSBidWZmZXJlZCB3aXRoIHVuYnVmZmVyZWQuCisJICBpZiAoIV9NX3dyaXRpbmcgJiYgX01fYnVmX3NpemUgPiAxKQorCSAgICBfX2J1ZmF2YWlsID0gX01fYnVmX3NpemUgLSAxOworCisJICBjb25zdCBzdHJlYW1zaXplIF9fbGltaXQgPSBzdGQ6Om1pbihfX2NodW5rLCBfX2J1ZmF2YWlsKTsKKwkgIGlmIChfX24gPj0gX19saW1pdCkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19idWZmaWxsID0gdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKTsKKwkgICAgICBjb25zdCBjaGFyKiBfX2J1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRoaXMtPnBiYXNlKCkpOworCSAgICAgIF9fcmV0ID0gX01fZmlsZS54c3B1dG5fMihfX2J1ZiwgX19idWZmaWxsLAorCQkJCSAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihfX3MpLAorCQkJCSAgICAgICBfX24pOworCSAgICAgIGlmIChfX3JldCA9PSBfX2J1ZmZpbGwgKyBfX24pCisJCXsKKwkJICBfTV9zZXRfYnVmZmVyKDApOworCQkgIF9NX3dyaXRpbmcgPSB0cnVlOworCQl9CisJICAgICAgaWYgKF9fcmV0ID4gX19idWZmaWxsKQorCQlfX3JldCAtPSBfX2J1ZmZpbGw7CisJICAgICAgZWxzZQorCQlfX3JldCA9IDA7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX19yZXQgPSBfX3N0cmVhbWJ1Zl90eXBlOjp4c3B1dG4oX19zLCBfX24pOworCX0KKyAgICAgICBlbHNlCisJIF9fcmV0ID0gX19zdHJlYW1idWZfdHlwZTo6eHNwdXRuKF9fcywgX19uKTsKKyAgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46Ol9fc3RyZWFtYnVmX3R5cGUqCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIGlmICghdGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIGlmIChfX3MgPT0gMCAmJiBfX24gPT0gMCkKKwkgICAgX01fYnVmX3NpemUgPSAxOworCSAgZWxzZSBpZiAoX19zICYmIF9fbiA+IDApCisJICAgIHsKKwkgICAgICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYmVoYXZpb3IsIGFuZCBhc3N1bWVzIHRoYXQKKwkgICAgICAvLyBhbiBleHRlcm5hbCBjaGFyX3R5cGUgYXJyYXkgb2YgbGVuZ3RoIF9fbiBleGlzdHMgYW5kIGhhcworCSAgICAgIC8vIGJlZW4gcHJlLWFsbG9jYXRlZC4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoaW5ncyB3aWxsCisJICAgICAgLy8gcXVpY2tseSBibG93IHVwLiBXaGVuIF9fbiA+IDEsIF9fbiAtIDEgcG9zaXRpb25zIHdpbGwgYmUKKwkgICAgICAvLyB1c2VkIGZvciB0aGUgZ2V0IGFyZWEsIF9fbiAtIDEgZm9yIHRoZSBwdXQgYXJlYSBhbmQgMQorCSAgICAgIC8vIHBvc2l0aW9uIHRvIGhvc3QgdGhlIG92ZXJmbG93IGNoYXIgb2YgYSBmdWxsIHB1dCBhcmVhLgorCSAgICAgIC8vIFdoZW4gX19uID09IDEsIDEgcG9zaXRpb24gd2lsbCBiZSB1c2VkIGZvciB0aGUgZ2V0IGFyZWEKKwkgICAgICAvLyBhbmQgMCBmb3IgdGhlIHB1dCBhcmVhLCBhcyBpbiB0aGUgdW5idWZmZXJlZCBjYXNlIGFib3ZlLgorCSAgICAgIF9NX2J1ZiA9IF9fczsKKwkgICAgICBfTV9idWZfc2l6ZSA9IF9fbjsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgIC8vIEFjY29yZGluZyB0byAyNy44LjEuNCBwMTEgLSAxMywgc2Vla29mZiBzaG91bGQgaWdub3JlIHRoZSBsYXN0CisgIC8vIGFyZ3VtZW50IChvZiB0eXBlIG9wZW5tb2RlKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyAgICBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHNlZWtvZmYob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LCBpb3NfYmFzZTo6b3Blbm1vZGUpCisgICAgeworICAgICAgaW50IF9fd2lkdGggPSAwOworICAgICAgaWYgKF9NX2NvZGVjdnQpCisJX193aWR0aCA9IF9NX2NvZGVjdnQtPmVuY29kaW5nKCk7CisgICAgICBpZiAoX193aWR0aCA8IDApCisJX193aWR0aCA9IDA7CisKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0ZmFpbCA9IF9fb2ZmICE9IDAgJiYgX193aWR0aCA8PSAwOworICAgICAgaWYgKHRoaXMtPmlzX29wZW4oKSAmJiAhX190ZXN0ZmFpbCkKKwl7CisJICAvLyB0ZWxsZyBhbmQgdGVsbHAgcXVlcmllcyBkbyBub3QgYWZmZWN0IGFueSBzdGF0ZSwgdW5sZXNzCisJICAvLyAhIGFsd2F5c19ub2NvbnYgYW5kIHRoZSBwdXQgc2VxdWVuY2UgaXMgbm90IGVtcHR5LgorCSAgLy8gSW4gdGhhdCBjYXNlLCBkZXRlcm1pbmluZyB0aGUgcG9zaXRpb24gcmVxdWlyZXMgY29udmVydGluZyB0aGUKKwkgIC8vIHB1dCBzZXF1ZW5jZS4gVGhhdCBkb2Vzbid0IHVzZSBleHRfYnVmLCBzbyByZXF1aXJlcyBhIGZsdXNoLgorCSAgYm9vbCBfX25vX21vdmVtZW50ID0gX193YXkgPT0gaW9zX2Jhc2U6OmN1ciAmJiBfX29mZiA9PSAwCisJICAgICYmICghX01fd3JpdGluZyB8fCBfTV9jb2RlY3Z0LT5hbHdheXNfbm9jb252KCkpOworCisJICAvLyBEaXRjaCBhbnkgcGJhY2sgYnVmZmVycyB0byBhdm9pZCBjb25mdXNpb24uCisJICBpZiAoIV9fbm9fbW92ZW1lbnQpCisJICAgIF9NX2Rlc3Ryb3lfcGJhY2soKTsKKworCSAgLy8gQ29ycmVjdCBzdGF0ZSBhdCBkZXN0aW5hdGlvbi4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNvcnJlY3QKKwkgIC8vIHN0YXRlIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbiBkdXJpbmcgb3V0cHV0LCBiZWNhdXNlCisJICAvLyBjb2RlY3Z0Ojp1bnNoaWZ0KCkgcmV0dXJucyB0aGUgc3RhdGUgdG8gdGhlIGluaXRpYWwgc3RhdGUuCisJICAvLyBUaGlzIGlzIGFsc28gdGhlIGNvcnJlY3Qgc3RhdGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBiZWNhdXNlCisJICAvLyBhbiB1bnNoaWZ0IHNlcXVlbmNlIHNob3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBhdCB0aGUgZW5kLgorCSAgX19zdGF0ZV90eXBlIF9fc3RhdGUgPSBfTV9zdGF0ZV9iZWc7CisJICBvZmZfdHlwZSBfX2NvbXB1dGVkX29mZiA9IF9fb2ZmICogX193aWR0aDsKKwkgIGlmIChfTV9yZWFkaW5nICYmIF9fd2F5ID09IGlvc19iYXNlOjpjdXIpCisJICAgIHsKKwkgICAgICBfX3N0YXRlID0gX01fc3RhdGVfbGFzdDsKKwkgICAgICBfX2NvbXB1dGVkX29mZiArPSBfTV9nZXRfZXh0X3BvcyhfX3N0YXRlKTsKKwkgICAgfQorCSAgaWYgKCFfX25vX21vdmVtZW50KQorCSAgICBfX3JldCA9IF9NX3NlZWsoX19jb21wdXRlZF9vZmYsIF9fd2F5LCBfX3N0YXRlKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChfTV93cml0aW5nKQorCQlfX2NvbXB1dGVkX29mZiA9IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisJICAgICAgCisgCSAgICAgIG9mZl90eXBlIF9fZmlsZV9vZmYgPSBfTV9maWxlLnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1cik7CisgCSAgICAgIGlmIChfX2ZpbGVfb2ZmICE9IG9mZl90eXBlKC0xKSkKKwkJeworCQkgIF9fcmV0ID0gX19maWxlX29mZiArIF9fY29tcHV0ZWRfb2ZmOworCQkgIF9fcmV0LnN0YXRlKF9fc3RhdGUpOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMTcxLiBTdHJhbmdlIHNlZWtwb3MoKSBzZW1hbnRpY3MgZHVlIHRvIGpvaW50IHBvc2l0aW9uCisgIC8vIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBEUiAxNzEsIHNlZWtwb3Mgc2hvdWxkIGlnbm9yZSB0aGUgbGFzdAorICAvLyBhcmd1bWVudCAob2YgdHlwZSBvcGVubW9kZSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB0eXBlbmFtZSBiYXNpY19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OnBvc190eXBlCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrcG9zKHBvc190eXBlIF9fcG9zLCBpb3NfYmFzZTo6b3Blbm1vZGUpCisgICAgeworICAgICAgcG9zX3R5cGUgX19yZXQgPSAgcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGlmICh0aGlzLT5pc19vcGVuKCkpCisJeworCSAgLy8gRGl0Y2ggYW55IHBiYWNrIGJ1ZmZlcnMgdG8gYXZvaWQgY29uZnVzaW9uLgorCSAgX01fZGVzdHJveV9wYmFjaygpOworCSAgX19yZXQgPSBfTV9zZWVrKG9mZl90eXBlKF9fcG9zKSwgaW9zX2Jhc2U6OmJlZywgX19wb3Muc3RhdGUoKSk7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+Ojpwb3NfdHlwZQorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgX01fc2VlayhvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksIF9fc3RhdGVfdHlwZSBfX3N0YXRlKQorICAgIHsKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGlmIChfTV90ZXJtaW5hdGVfb3V0cHV0KCkpCisJeworCSAgb2ZmX3R5cGUgX19maWxlX29mZiA9IF9NX2ZpbGUuc2Vla29mZihfX29mZiwgX193YXkpOworCSAgaWYgKF9fZmlsZV9vZmYgIT0gb2ZmX3R5cGUoLTEpKQorCSAgICB7CisJICAgICAgX01fcmVhZGluZyA9IGZhbHNlOworCSAgICAgIF9NX3dyaXRpbmcgPSBmYWxzZTsKKwkgICAgICBfTV9leHRfbmV4dCA9IF9NX2V4dF9lbmQgPSBfTV9leHRfYnVmOworCSAgICAgIF9NX3NldF9idWZmZXIoLTEpOworCSAgICAgIF9NX3N0YXRlX2N1ciA9IF9fc3RhdGU7CisJICAgICAgX19yZXQgPSBfX2ZpbGVfb2ZmOworCSAgICAgIF9fcmV0LnN0YXRlKF9NX3N0YXRlX2N1cik7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGVuZCBvZiB0aGUgZXh0IGJ1ZmZlciB0byB0aGUgcG9pbnQKKyAgLy8gY29ycmVzcG9uZGluZyB0byBncHRyKCkuIFRoaXMgaXMgYSBuZWdhdGl2ZSB2YWx1ZS4gVXBkYXRlcyBfX3N0YXRlCisgIC8vIGZyb20gZWJhY2soKSBjb3JyZXNwb25kZW5jZSB0byBncHRyKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbnQgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBfTV9nZXRfZXh0X3BvcyhfX3N0YXRlX3R5cGUmIF9fc3RhdGUpCisgICAgeworICAgICAgaWYgKF9NX2NvZGVjdnQtPmFsd2F5c19ub2NvbnYoKSkKKyAgICAgICAgcmV0dXJuIHRoaXMtPmdwdHIoKSAtIHRoaXMtPmVncHRyKCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvLyBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gX01fZXh0X2J1ZiB0aGF0IGNvcnJlc3BvbmRzIHRvCisgICAgICAgICAgLy8gZ3B0cigpLiBQcmVjb25kaXRpb246IF9fc3RhdGUgPT0gX01fc3RhdGVfbGFzdCwgd2hpY2gKKyAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBlYmFjaygpLgorICAgICAgICAgIGNvbnN0IGludCBfX2dwdHJfb2ZmID0KKyAgICAgICAgICAgIF9NX2NvZGVjdnQtPmxlbmd0aChfX3N0YXRlLCBfTV9leHRfYnVmLCBfTV9leHRfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5ncHRyKCkgLSB0aGlzLT5lYmFjaygpKTsKKyAgICAgICAgICByZXR1cm4gX01fZXh0X2J1ZiArIF9fZ3B0cl9vZmYgLSBfTV9leHRfZW5kOworICAgICAgICB9CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYm9vbAorICAgIGJhc2ljX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgX01fdGVybWluYXRlX291dHB1dCgpCisgICAgeworICAgICAgLy8gUGFydCBvbmU6IHVwZGF0ZSB0aGUgb3V0cHV0IHNlcXVlbmNlLgorICAgICAgYm9vbCBfX3Rlc3R2YWxpZCA9IHRydWU7CisgICAgICBpZiAodGhpcy0+cGJhc2UoKSA8IHRoaXMtPnBwdHIoKSkKKwl7CisJICBjb25zdCBpbnRfdHlwZSBfX3RtcCA9IHRoaXMtPm92ZXJmbG93KCk7CisJICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fdG1wLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCSAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCX0KKworICAgICAgLy8gUGFydCB0d286IG91dHB1dCB1bnNoaWZ0IHNlcXVlbmNlLgorICAgICAgaWYgKF9NX3dyaXRpbmcgJiYgIV9fY2hlY2tfZmFjZXQoX01fY29kZWN2dCkuYWx3YXlzX25vY29udigpCisJICAmJiBfX3Rlc3R2YWxpZCkKKwl7CisJICAvLyBOb3RlOiB0aGlzIHZhbHVlIGlzIGFyYml0cmFyeSwgc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvCisJICAvLyBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgdW5zaGlmdCBzZXF1ZW5jZSBmcm9tIGNvZGVjdnQsCisJICAvLyB3aXRob3V0IGNhbGxpbmcgdW5zaGlmdC4KKwkgIGNvbnN0IHNpemVfdCBfX2JsZW4gPSAxMjg7CisJICBjaGFyIF9fYnVmW19fYmxlbl07CisJICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdCBfX3I7CisJICBzdHJlYW1zaXplIF9faWxlbiA9IDA7CisKKwkgIGRvCisJICAgIHsKKwkgICAgICBjaGFyKiBfX25leHQ7CisJICAgICAgX19yID0gX01fY29kZWN2dC0+dW5zaGlmdChfTV9zdGF0ZV9jdXIsIF9fYnVmLAorCQkJCQlfX2J1ZiArIF9fYmxlbiwgX19uZXh0KTsKKwkgICAgICBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6ZXJyb3IpCisJCV9fdGVzdHZhbGlkID0gZmFsc2U7CisJICAgICAgZWxzZSBpZiAoX19yID09IGNvZGVjdnRfYmFzZTo6b2sgfHwKKwkJICAgICAgIF9fciA9PSBjb2RlY3Z0X2Jhc2U6OnBhcnRpYWwpCisJCXsKKwkJICBfX2lsZW4gPSBfX25leHQgLSBfX2J1ZjsKKwkJICBpZiAoX19pbGVuID4gMCkKKwkJICAgIHsKKwkJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX2VsZW4gPSBfTV9maWxlLnhzcHV0bihfX2J1ZiwgX19pbGVuKTsKKwkJICAgICAgaWYgKF9fZWxlbiAhPSBfX2lsZW4pCisJCQlfX3Rlc3R2YWxpZCA9IGZhbHNlOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgIHdoaWxlIChfX3IgPT0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsICYmIF9faWxlbiA+IDAgJiYgX190ZXN0dmFsaWQpOworCisJICBpZiAoX190ZXN0dmFsaWQpCisJICAgIHsKKwkgICAgICAvLyBUaGlzIHNlY29uZCBjYWxsIHRvIG92ZXJmbG93KCkgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkLAorCSAgICAgIC8vIGJ1dCBpdCdzIG5vdCBjbGVhciB3aHkgaXQncyBuZWVkZWQsIHNpbmNlIHRoZSBvdXRwdXQgYnVmZmVyCisJICAgICAgLy8gc2hvdWxkIGJlIGVtcHR5IGJ5IHRoaXMgcG9pbnQgKGl0IHNob3VsZCBoYXZlIGJlZW4gZW1wdGllZAorCSAgICAgIC8vIGluIHRoZSBmaXJzdCBjYWxsIHRvIG92ZXJmbG93KCkpLgorCSAgICAgIGNvbnN0IGludF90eXBlIF9fdG1wID0gdGhpcy0+b3ZlcmZsb3coKTsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fdG1wLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQlfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fdGVzdHZhbGlkOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW50CisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzeW5jKCkKKyAgICB7CisgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIHJlc3luY3MgaXRzIGlkZWEgb2YKKyAgICAgIC8vIHRoZSBmaWxlIHBvc2l0aW9uIHdpdGggdGhlIGV4dGVybmFsIGZpbGUuCisgICAgICBpbnQgX19yZXQgPSAwOworICAgICAgaWYgKHRoaXMtPnBiYXNlKCkgPCB0aGlzLT5wcHRyKCkpCisJeworCSAgY29uc3QgaW50X3R5cGUgX190bXAgPSB0aGlzLT5vdmVyZmxvdygpOworCSAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX3RtcCwgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkgICAgX19yZXQgPSAtMTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICB2b2lkCisgICAgYmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGJvb2wgX190ZXN0dmFsaWQgPSB0cnVlOworCisgICAgICBjb25zdCBfX2NvZGVjdnRfdHlwZSogX01fY29kZWN2dF90bXAgPSAwOworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoaGFzX2ZhY2V0PF9fY29kZWN2dF90eXBlPihfX2xvYyksIHRydWUpKQorCV9NX2NvZGVjdnRfdG1wID0gJnVzZV9mYWNldDxfX2NvZGVjdnRfdHlwZT4oX19sb2MpOworCisgICAgICBpZiAodGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIC8vIGVuY29kaW5nKCkgPT0gLTEgaXMgb2sgb25seSBhdCB0aGUgYmVnaW5uaW5nLgorCSAgaWYgKChfTV9yZWFkaW5nIHx8IF9NX3dyaXRpbmcpCisJICAgICAgJiYgX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5lbmNvZGluZygpID09IC0xKQorCSAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9NX3JlYWRpbmcpCisJCXsKKwkJICBpZiAoX19jaGVja19mYWNldChfTV9jb2RlY3Z0KS5hbHdheXNfbm9jb252KCkpCisJCSAgICB7CisJCSAgICAgIGlmIChfTV9jb2RlY3Z0X3RtcAorCQkJICAmJiAhX19jaGVja19mYWNldChfTV9jb2RlY3Z0X3RtcCkuYWx3YXlzX25vY29udigpKQorCQkJX190ZXN0dmFsaWQgPSB0aGlzLT5zZWVrb2ZmKDAsIGlvc19iYXNlOjpjdXIsIF9NX21vZGUpCisJCQkgICAgICAgICAgICAgICE9IHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgeworCQkgICAgICAvLyBFeHRlcm5hbCBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIGdwdHIoKS4KKwkJICAgICAgX01fZXh0X25leHQgPSBfTV9leHRfYnVmCisJCQkrIF9NX2NvZGVjdnQtPmxlbmd0aChfTV9zdGF0ZV9sYXN0LCBfTV9leHRfYnVmLAorCQkJCQkgICAgIF9NX2V4dF9uZXh0LAorCQkJCQkgICAgIHRoaXMtPmdwdHIoKSAtIHRoaXMtPmViYWNrKCkpOworCQkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcmVtYWluZGVyID0gX01fZXh0X2VuZCAtIF9NX2V4dF9uZXh0OworCQkgICAgICBpZiAoX19yZW1haW5kZXIpCisJCQlfX2J1aWx0aW5fbWVtbW92ZShfTV9leHRfYnVmLCBfTV9leHRfbmV4dCwgX19yZW1haW5kZXIpOworCisJCSAgICAgIF9NX2V4dF9uZXh0ID0gX01fZXh0X2J1ZjsKKwkJICAgICAgX01fZXh0X2VuZCA9IF9NX2V4dF9idWYgKyBfX3JlbWFpbmRlcjsKKwkJICAgICAgX01fc2V0X2J1ZmZlcigtMSk7CisJCSAgICAgIF9NX3N0YXRlX2xhc3QgPSBfTV9zdGF0ZV9jdXIgPSBfTV9zdGF0ZV9iZWc7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlIGlmIChfTV93cml0aW5nICYmIChfX3Rlc3R2YWxpZCA9IF9NX3Rlcm1pbmF0ZV9vdXRwdXQoKSkpCisJCV9NX3NldF9idWZmZXIoLTEpOworCSAgICB9CisJfQorCisgICAgICBpZiAoX190ZXN0dmFsaWQpCisJX01fY29kZWN2dCA9IF9NX2NvZGVjdnRfdG1wOworICAgICAgZWxzZQorCV9NX2NvZGVjdnQgPSAwOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZpbGVidWY8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pZnN0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29mc3RyZWFtPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfZnN0cmVhbTxjaGFyPjsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19maWxlYnVmPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaWZzdHJlYW08d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vZnN0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZzdHJlYW08d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mdW5jdGV4Y2VwdC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2Z1bmN0ZXhjZXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlNmFlNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mdW5jdGV4Y2VwdC5oCkBAIC0wLDAgKzEsMTA3IEBACisvLyBGdW5jdGlvbi1CYXNlZCBFeGNlcHRpb24gU3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDQsIDIwMDUsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Z1bmN0ZXhjZXB0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtleGNlcHRpb259CisgKgorICogIFRoaXMgaGVhZGVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIC1mbm8tZXhjZXB0aW9ucy4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTkuMSAgRXhjZXB0aW9uIGNsYXNzZXMKKy8vCisKKyNpZm5kZWYgX0ZVTkNURVhDRVBUX0gKKyNkZWZpbmUgX0ZVTkNURVhDRVBUX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2V4Y2VwdGlvbl9kZWZpbmVzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBIZWxwZXIgZm9yIGV4Y2VwdGlvbiBvYmplY3RzIGluIDxleGNlcHQ+CisgIHZvaWQKKyAgX190aHJvd19iYWRfZXhjZXB0aW9uKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIEhlbHBlciBmb3IgZXhjZXB0aW9uIG9iamVjdHMgaW4gPG5ldz4KKyAgdm9pZAorICBfX3Rocm93X2JhZF9hbGxvYyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICAvLyBIZWxwZXIgZm9yIGV4Y2VwdGlvbiBvYmplY3RzIGluIDx0eXBlaW5mbz4KKyAgdm9pZAorICBfX3Rocm93X2JhZF9jYXN0KHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19iYWRfdHlwZWlkKHZvaWQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIEhlbHBlcnMgZm9yIGV4Y2VwdGlvbiBvYmplY3RzIGluIDxzdGRleGNlcHQ+CisgIHZvaWQKKyAgX190aHJvd19sb2dpY19lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X2RvbWFpbl9lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X2ludmFsaWRfYXJndW1lbnQoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19sZW5ndGhfZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19vdXRfb2ZfcmFuZ2UoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19ydW50aW1lX2Vycm9yKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfcmFuZ2VfZXJyb3IoY29uc3QgY2hhciopIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIHZvaWQKKyAgX190aHJvd19vdmVyZmxvd19lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X3VuZGVyZmxvd19lcnJvcihjb25zdCBjaGFyKikgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgLy8gSGVscGVycyBmb3IgZXhjZXB0aW9uIG9iamVjdHMgaW4gPGlvcz4KKyAgdm9pZAorICBfX3Rocm93X2lvc19mYWlsdXJlKGNvbnN0IGNoYXIqKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworICB2b2lkCisgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludCkgX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSk7CisKKyAgdm9pZAorICBfX3Rocm93X2Z1dHVyZV9lcnJvcihpbnQpIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpOworCisgIC8vIEhlbHBlcnMgZm9yIGV4Y2VwdGlvbiBvYmplY3RzIGluIDxmdW5jdGlvbmFsPgorICB2b2lkCisgIF9fdGhyb3dfYmFkX2Z1bmN0aW9uX2NhbGwoKSBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mdW5jdGlvbmFsX2hhc2guaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9mdW5jdGlvbmFsX2hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODkyMTU5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2Z1bmN0aW9uYWxfaGFzaC5oCkBAIC0wLDAgKzEsMjA1IEBACisvLyBmdW5jdGlvbmFsX2hhc2guaCBoZWFkZXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9GVU5DVElPTkFMX0hBU0hfSAorI2RlZmluZSBfRlVOQ1RJT05BTF9IQVNIX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2hhc2hfYnl0ZXMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKiBAZGVmZ3JvdXAgaGFzaGVzIEhhc2hlcworICAgKiAgQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogICBIYXNoaW5nIGZ1bmN0b3JzIHRha2luZyBhIHZhcmlhYmxlIHR5cGUgYW5kIHJldHVybmluZyBhIEBjIHN0ZDo6c2l6ZV90LgorICAgKgorICAgKiAgQHsKKyAgICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX19oYXNoX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXN1bHQgICAgIHJlc3VsdF90eXBlOworICAgICAgdHlwZWRlZiBfQXJnICAgICAgYXJndW1lbnRfdHlwZTsKKyAgICB9OworCisgIC8vLyBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIGhhc2guCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaCA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9UcD4KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHApIDwgMCwKKwkJICAgICJzdGQ6Omhhc2ggaXMgbm90IHNwZWNpYWxpemVkIGZvciB0aGlzIHR5cGUiKTsKKyAgICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IF9UcCYpIGNvbnN0IG5vZXhjZXB0OworICAgIH07CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGZvciBwb2ludGVyIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc2g8X1RwKj4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfVHAqPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihfX3ApOyB9CisgICAgfTsKKworICAvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGludGVnZXIgdHlwZXMuCisjZGVmaW5lIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goX1RwKSAJXAorICB0ZW1wbGF0ZTw+CQkJCQkJXAorICAgIHN0cnVjdCBoYXNoPF9UcD4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfVHA+ICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3BlcmF0b3IoKShfVHAgX192YWwpIGNvbnN0IG5vZXhjZXB0ICAgICAgICAgICAgICBcCisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fdmFsKTsgfSAgICAgICAgICAgIFwKKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgYm9vbC4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChib29sKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgY2hhci4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChjaGFyKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3Igc2lnbmVkIGNoYXIuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goc2lnbmVkIGNoYXIpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB1bnNpZ25lZCBjaGFyLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGNoYXIpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciB3Y2hhcl90LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHdjaGFyX3QpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBjaGFyMTZfdC4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChjaGFyMTZfdCkKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIGNoYXIzMl90LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGNoYXIzMl90KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3Igc2hvcnQuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goc2hvcnQpCisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBpbnQuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goaW50KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgbG9uZy4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChsb25nKQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgbG9uZyBsb25nLgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGxvbmcgbG9uZykKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIHNob3J0LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIHNob3J0KQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgdW5zaWduZWQgaW50LgorICBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGludCkKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGxvbmcuCisgIF9DeHhfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2godW5zaWduZWQgbG9uZykKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHVuc2lnbmVkIGxvbmcgbG9uZy4KKyAgX0N4eF9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBsb25nIGxvbmcpCisKKyN1bmRlZiBfQ3h4X2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoCisKKyAgc3RydWN0IF9IYXNoX2ltcGwKKyAgeworICAgIHN0YXRpYyBzaXplX3QKKyAgICBoYXNoKGNvbnN0IHZvaWQqIF9fcHRyLCBzaXplX3QgX19jbGVuZ3RoLAorCSBzaXplX3QgX19zZWVkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigweGM3MGY2OTA3VUwpKQorICAgIHsgcmV0dXJuIF9IYXNoX2J5dGVzKF9fcHRyLCBfX2NsZW5ndGgsIF9fc2VlZCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGhhc2goY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIGhhc2goJl9fdmFsLCBzaXplb2YoX192YWwpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX19oYXNoX2NvbWJpbmUoY29uc3QgX1RwJiBfX3ZhbCwgc2l6ZV90IF9faGFzaCkKKyAgICAgIHsgcmV0dXJuIGhhc2goJl9fdmFsLCBzaXplb2YoX192YWwpLCBfX2hhc2gpOyB9CisgIH07CisKKyAgc3RydWN0IF9GbnZfaGFzaF9pbXBsCisgIHsKKyAgICBzdGF0aWMgc2l6ZV90CisgICAgaGFzaChjb25zdCB2b2lkKiBfX3B0ciwgc2l6ZV90IF9fY2xlbmd0aCwKKwkgc2l6ZV90IF9fc2VlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4oMjE2NjEzNjI2MVVMKSkKKyAgICB7IHJldHVybiBfRm52X2hhc2hfYnl0ZXMoX19wdHIsIF9fY2xlbmd0aCwgX19zZWVkKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RhdGljIHNpemVfdAorICAgICAgaGFzaChjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeyByZXR1cm4gaGFzaCgmX192YWwsIHNpemVvZihfX3ZhbCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfX2hhc2hfY29tYmluZShjb25zdCBfVHAmIF9fdmFsLCBzaXplX3QgX19oYXNoKQorICAgICAgeyByZXR1cm4gaGFzaCgmX192YWwsIHNpemVvZihfX3ZhbCksIF9faGFzaCk7IH0KKyAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsb2F0LgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8ZmxvYXQ+IDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgZmxvYXQ+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGZsb2F0IF9fdmFsKSBjb25zdCBub2V4Y2VwdAorICAgICAgeworCS8vIDAgYW5kIC0wIGJvdGggaGFzaCB0byB6ZXJvLgorCXJldHVybiBfX3ZhbCAhPSAwLjBmID8gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgICB9CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGRvdWJsZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGRvdWJsZT4gOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBkb3VibGU+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGRvdWJsZSBfX3ZhbCkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwkvLyAwIGFuZCAtMCBib3RoIGhhc2ggdG8gemVyby4KKwlyZXR1cm4gX192YWwgIT0gMC4wID8gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgICB9CisgICAgfTsKKworICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGxvbmcgZG91YmxlLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8bG9uZyBkb3VibGU+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBsb25nIGRvdWJsZT4KKyAgICB7CisgICAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3Qgbm9leGNlcHQ7CisgICAgfTsKKworICAvLyBAfSBncm91cCBoYXNoZXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0ZVTkNUSU9OQUxfSEFTSF9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZ3NsaWNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZ3NsaWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkMTc3NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9nc2xpY2UuaApAQCAtMCwwICsxLDE4NSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gZ3NsaWNlIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2dzbGljZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX0dTTElDRV9ICisjZGVmaW5lIF9HU0xJQ0VfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgQ2xhc3MgZGVmaW5pbmcgbXVsdGktZGltZW5zaW9uYWwgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgVGhlIHNsaWNlIGNsYXNzIHJlcHJlc2VudHMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdWJzZXQgb2YgYW4gYXJyYXksCisgICAqICBzcGVjaWZpZWQgYnkgdGhyZWUgcGFyYW1ldGVyIHNldHM6IHN0YXJ0IG9mZnNldCwgc2l6ZSBhcnJheSwgYW5kIHN0cmlkZQorICAgKiAgYXJyYXkuICBUaGUgc3RhcnQgb2Zmc2V0IGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkKKyAgICogIHRoYXQgaXMgcGFydCBvZiB0aGUgc3Vic2V0LiAgVGhlIHNpemUgYW5kIHN0cmlkZSBhcnJheSBkZXNjcmliZSBlYWNoCisgICAqICBkaW1lbnNpb24gb2YgdGhlIHNsaWNlLiAgU2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoYXQKKyAgICogIGRpbWVuc2lvbiwgYW5kIHN0cmlkZSBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlIGFycmF5IGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgKiAgZWxlbWVudHMgaW4gdGhhdCBkaW1lbnNpb24uICBFYWNoIGRpbWVuc2lvbidzIHNpemUgYW5kIHN0cmlkZSBpcyB0YWtlbgorICAgKiAgdG8gYmVnaW4gYXQgYW4gYXJyYXkgZWxlbWVudCBkZXNjcmliZWQgYnkgdGhlIHByZXZpb3VzIGRpbWVuc2lvbi4gIFRoZQorICAgKiAgc2l6ZSBhcnJheSBhbmQgc3RyaWRlIGFycmF5IG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4KKyAgICoKKyAgICogIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBvZmZzZXQ9PTMsIHN0cmlkZVswXT09MTEsIHNpemVbMV09PTMsCisgICAqICBzdHJpZGVbMV09PTMsIHRoZW4gc2xpY2VbMCwwXT09YXJyYXlbM10sIHNsaWNlWzAsMV09PWFycmF5WzZdLAorICAgKiAgc2xpY2VbMCwyXT09YXJyYXlbOV0sIHNsaWNlWzEsMF09PWFycmF5WzE0XSwgc2xpY2VbMSwxXT09YXJyYXlbMTddLAorICAgKiAgc2xpY2VbMSwyXT09YXJyYXlbMjBdLgorICAgKi8KKyAgY2xhc3MgZ3NsaWNlCisgIHsKKyAgcHVibGljOgorICAgIC8vLyAgQ29uc3RydWN0IGFuIGVtcHR5IHNsaWNlLgorICAgIGdzbGljZSgpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgc2xpY2UuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIHNsaWNlIHdpdGggYXMgbWFueSBkaW1lbnNpb25zIGFzIHRoZSBsZW5ndGggb2YgdGhlIEBhIGwKKyAgICAgKiAgYW5kIEBhIHMgYXJyYXlzLgorICAgICAqCisgICAgICogIEBwYXJhbSAgbyAgT2Zmc2V0IGluIGFycmF5IG9mIGZpcnN0IGVsZW1lbnQuCisgICAgICogIEBwYXJhbSAgbCAgQXJyYXkgb2YgZGltZW5zaW9uIGxlbmd0aHMuCisgICAgICogIEBwYXJhbSAgcyAgQXJyYXkgb2YgZGltZW5zaW9uIHN0cmlkZXMgYmV0d2VlbiBhcnJheSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBnc2xpY2Uoc2l6ZV90LCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYpOworCisgICAgLy8gWFhYOiB0aGUgSVMgc2F5cyB0aGUgY29weS1jdG9yIGFuZCBjb3B5LWFzc2lnbm1lbnQgb3BlcmF0b3JzIGFyZQorICAgIC8vICAgICAgc3ludGhlc2l6ZWQgYnkgdGhlIGNvbXBpbGVyIGJ1dCB0aGV5IGFyZSBqdXN0IHVuc3VpdGFibGUKKyAgICAvLyAgICAgIGZvciBhIHJlZi1jb3VudGVkIHNlbWFudGljCisgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLgorICAgIGdzbGljZShjb25zdCBnc2xpY2UmKTsKKworICAgIC8vLyAgRGVzdHJ1Y3Rvci4KKyAgICB+Z3NsaWNlKCk7CisKKyAgICAvLyBYWFg6IFNlZSB0aGUgbm90ZSBhYm92ZS4KKyAgICAvLy8gIEFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgZ3NsaWNlJiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlJik7CisKKyAgICAvLy8gIFJldHVybiBhcnJheSBvZmZzZXQgb2YgZmlyc3Qgc2xpY2UgZWxlbWVudC4KKyAgICBzaXplX3QgICAgICAgICAgIHN0YXJ0KCkgY29uc3Q7CisKKyAgICAvLy8gIFJldHVybiBhcnJheSBvZiBzaXplcyBvZiBzbGljZSBkaW1lbnNpb25zLgorICAgIHZhbGFycmF5PHNpemVfdD4gc2l6ZSgpIGNvbnN0OworICAgIAorICAgIC8vLyAgUmV0dXJuIGFycmF5IG9mIGFycmF5IHN0cmlkZXMgZm9yIGVhY2ggZGltZW5zaW9uLgorICAgIHZhbGFycmF5PHNpemVfdD4gc3RyaWRlKCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgX0luZGV4ZXIKKyAgICB7CisgICAgICBzaXplX3QgX01fY291bnQ7CisgICAgICBzaXplX3QgX01fc3RhcnQ7CisgICAgICB2YWxhcnJheTxzaXplX3Q+IF9NX3NpemU7CisgICAgICB2YWxhcnJheTxzaXplX3Q+IF9NX3N0cmlkZTsKKyAgICAgIHZhbGFycmF5PHNpemVfdD4gX01faW5kZXg7IC8vIExpbmVhciBhcnJheSBvZiByZWZlcmVuY2VkIGluZGljZXMKKworICAgICAgX0luZGV4ZXIoKQorICAgICAgOiBfTV9jb3VudCgxKSwgX01fc3RhcnQoMCksIF9NX3NpemUoKSwgX01fc3RyaWRlKCksIF9NX2luZGV4KCkge30KKworICAgICAgX0luZGV4ZXIoc2l6ZV90LCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiwKKwkgICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYpOworCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyZW1lbnRfdXNlKCkKKyAgICAgIHsgKytfTV9jb3VudDsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RlY3JlbWVudF91c2UoKQorICAgICAgeyByZXR1cm4gLS1fTV9jb3VudDsgfQorICAgIH07CisKKyAgICBfSW5kZXhlciogX01faW5kZXg7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGZyaWVuZCBjbGFzcyB2YWxhcnJheTsKKyAgfTsKKworICBpbmxpbmUgc2l6ZV90CisgIGdzbGljZTo6c3RhcnQoKSBjb25zdAorICB7IHJldHVybiBfTV9pbmRleCA/IF9NX2luZGV4LT5fTV9zdGFydCA6IDA7IH0KKworICBpbmxpbmUgdmFsYXJyYXk8c2l6ZV90PgorICBnc2xpY2U6OnNpemUoKSBjb25zdAorICB7IHJldHVybiBfTV9pbmRleCA/IF9NX2luZGV4LT5fTV9zaXplIDogdmFsYXJyYXk8c2l6ZV90PigpOyB9CisKKyAgaW5saW5lIHZhbGFycmF5PHNpemVfdD4KKyAgZ3NsaWNlOjpzdHJpZGUoKSBjb25zdAorICB7IHJldHVybiBfTV9pbmRleCA/IF9NX2luZGV4LT5fTV9zdHJpZGUgOiB2YWxhcnJheTxzaXplX3Q+KCk7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDU0My4gdmFsYXJyYXkgc2xpY2UgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmxpbmUKKyAgZ3NsaWNlOjpnc2xpY2UoKQorICA6IF9NX2luZGV4KG5ldyBnc2xpY2U6Ol9JbmRleGVyKCkpIHt9CisKKyAgaW5saW5lCisgIGdzbGljZTo6Z3NsaWNlKHNpemVfdCBfX28sIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9fbCwKKwkJIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9fcykKKyAgOiBfTV9pbmRleChuZXcgZ3NsaWNlOjpfSW5kZXhlcihfX28sIF9fbCwgX19zKSkge30KKworICBpbmxpbmUKKyAgZ3NsaWNlOjpnc2xpY2UoY29uc3QgZ3NsaWNlJiBfX2cpCisgIDogX01faW5kZXgoX19nLl9NX2luZGV4KQorICB7IGlmIChfTV9pbmRleCkgX01faW5kZXgtPl9NX2luY3JlbWVudF91c2UoKTsgfQorCisgIGlubGluZQorICBnc2xpY2U6On5nc2xpY2UoKQorICB7CisgICAgaWYgKF9NX2luZGV4ICYmIF9NX2luZGV4LT5fTV9kZWNyZW1lbnRfdXNlKCkgPT0gMCkKKyAgICAgIGRlbGV0ZSBfTV9pbmRleDsKKyAgfQorCisgIGlubGluZSBnc2xpY2UmCisgIGdzbGljZTo6b3BlcmF0b3I9KGNvbnN0IGdzbGljZSYgX19nKQorICB7CisgICAgaWYgKF9fZy5fTV9pbmRleCkKKyAgICAgIF9fZy5fTV9pbmRleC0+X01faW5jcmVtZW50X3VzZSgpOworICAgIGlmIChfTV9pbmRleCAmJiBfTV9pbmRleC0+X01fZGVjcmVtZW50X3VzZSgpID09IDApCisgICAgICBkZWxldGUgX01faW5kZXg7CisgICAgX01faW5kZXggPSBfX2cuX01faW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dTTElDRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZ3NsaWNlX2FycmF5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvZ3NsaWNlX2FycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlMDQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9nc2xpY2VfYXJyYXkuaApAQCAtMCwwICsxLDIxOSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gZ3NsaWNlX2FycmF5IGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDQsIDIwMDUsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2dzbGljZV9hcnJheS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX0dTTElDRV9BUlJBWV9ICisjZGVmaW5lIF9HU0xJQ0VfQVJSQVlfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgUmVmZXJlbmNlIHRvIG11bHRpLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIEEgZ3NsaWNlX2FycmF5IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgZWxlbWVudHMgb2YgYW4gYXJyYXkKKyAgICogIHNwZWNpZmllZCBieSBhIGdzbGljZS4gIFRoZSB3YXkgdG8gZ2V0IGEgZ3NsaWNlX2FycmF5IGlzIHRvIGNhbGwKKyAgICogIG9wZXJhdG9yW10oZ3NsaWNlKSBvbiBhIHZhbGFycmF5LiAgVGhlIHJldHVybmVkIGdzbGljZV9hcnJheSB0aGVuCisgICAqICBwZXJtaXRzIGNhcnJ5aW5nIG9wZXJhdGlvbnMgb3V0IG9uIHRoZSByZWZlcmVuY2VkIHN1YnNldCBvZiBlbGVtZW50cyBpbgorICAgKiAgdGhlIG9yaWdpbmFsIHZhbGFycmF5LiAgRm9yIGV4YW1wbGUsIG9wZXJhdG9yKz0odmFsYXJyYXkpIHdpbGwgYWRkCisgICAqICB2YWx1ZXMgdG8gdGhlIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUgdW5kZXJseWluZyB2YWxhcnJheSB0aGlzCisgICAqICBnc2xpY2VfYXJyYXkgcmVmZXJzIHRvLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgRWxlbWVudCB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGdzbGljZV9hcnJheQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTMuIHZhbGFycmF5IGhlbHBlciBmdW5jdGlvbnMgYXJlIGFsbW9zdCBlbnRpcmVseSB1c2VsZXNzCisKKyAgICAgIC8vLyAgQ29weSBjb25zdHJ1Y3Rvci4gIEJvdGggc2xpY2VzIHJlZmVyIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgYXJyYXkuCisgICAgICBnc2xpY2VfYXJyYXkoY29uc3QgZ3NsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWdubWVudCBvcGVyYXRvci4gIEFzc2lnbnMgc2xpY2UgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZworICAgICAgLy8vICBlbGVtZW50cyBvZiBAYSBhLgorICAgICAgZ3NsaWNlX2FycmF5JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWduIHNsaWNlIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTXVsdGlwbHkgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgRGl2aWRlIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE1vZHVsbyBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIHhvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgYW5kIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExlZnQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBc3NpZ24gYWxsIHNsaWNlIGVsZW1lbnRzIHRvIEBhIHQuCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfVHAmKSBjb25zdDsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIF9BcnJheTxfVHA+ICAgIF9NX2FycmF5OworICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX01faW5kZXg7CisKKyAgICAgIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OworCisgICAgICBnc2xpY2VfYXJyYXkoX0FycmF5PF9UcD4sIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mKTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBnc2xpY2VfYXJyYXkoKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6Z3NsaWNlX2FycmF5KF9BcnJheTxfVHA+IF9fYSwKKwkJCQkgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgIDogX01fYXJyYXkoX19hKSwgX01faW5kZXgoX19pKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6Z3NsaWNlX2FycmF5KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2EpCisgICAgOiBfTV9hcnJheShfX2EuX01fYXJyYXkpLCBfTV9pbmRleChfX2EuX01faW5kZXgpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBnc2xpY2VfYXJyYXk8X1RwPiYKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2EpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4oX19hLl9NX2FycmF5KSwKKwkJCSAgIF9BcnJheTxzaXplX3Q+KF9fYS5fTV9pbmRleCksIF9NX2luZGV4LnNpemUoKSwKKwkJCSAgIF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9maWxsKF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCksCisJCQkgICBfTV9pbmRleC5zaXplKCksIF9fdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGdzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+KF9fdiksIF9fdi5zaXplKCksCisJCQkgICBfTV9hcnJheSwgX0FycmF5PHNpemVfdD4oX01faW5kZXgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0CisgICAgICB7CisJc3RkOjpfX3ZhbGFycmF5X2NvcHkgKF9fZSwgX01faW5kZXguc2l6ZSgpLCBfTV9hcnJheSwKKwkJCSAgICAgIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSk7CisgICAgICB9CisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisjZGVmaW5lIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgZ3NsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfTV9pbmRleCksCVwKKwkJCSAgICAgICBfQXJyYXk8X1RwPihfX3YpLCBfX3Yuc2l6ZSgpKTsJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJCSAgICAgICAgICAgICAgICBcCisgICAgICBpbmxpbmUgdm9pZAkJCQkJCQlcCisgICAgICBnc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9IChjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0XAorICAgICAgewkJCQkJCQkJCVwKKwlfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9BcnJheTxzaXplX3Q+KF9NX2luZGV4KSwgX19lLFwKKwkJCQkgX01faW5kZXguc2l6ZSgpKTsJCQlcCisgICAgICB9CisKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigvLCBfX2RpdmlkZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorCisgIC8vIEB9IGdyb3VwIG51bWVyaWNfYXJyYXlzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9HU0xJQ0VfQVJSQVlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2hhc2hfYnl0ZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9oYXNoX2J5dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwYzBlYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9oYXNoX2J5dGVzLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gRGVjbGFyYXRpb25zIGZvciBoYXNoIGZ1bmN0aW9ucy4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2hhc2hfYnl0ZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2Z1bmN0aW9uYWx9CisgKi8KKworI2lmbmRlZiBfSEFTSF9CWVRFU19ICisjZGVmaW5lIF9IQVNIX0JZVEVTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCituYW1lc3BhY2Ugc3RkCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEhhc2ggZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBub250cml2aWFsIHNwZWNpYWxpemF0aW9uLgorICAvLyBBbGwgb2YgdGhlbSBhcmUgYmFzZWQgb24gYSBwcmltaXRpdmUgdGhhdCBoYXNoZXMgYSBwb2ludGVyIHRvIGEKKyAgLy8gYnl0ZSBhcnJheS4gVGhlIGFjdHVhbCBoYXNoIGFsZ29yaXRobSBpcyBub3QgZ3VhcmFudGVlZCB0byBzdGF5CisgIC8vIHRoZSBzYW1lIGZyb20gcmVsZWFzZSB0byByZWxlYXNlIC0tIGl0IG1heSBiZSB1cGRhdGVkIG9yIHR1bmVkIHRvCisgIC8vIGltcHJvdmUgaGFzaCBxdWFsaXR5IG9yIHNwZWVkLgorICBzaXplX3QKKyAgX0hhc2hfYnl0ZXMoY29uc3Qgdm9pZCogX19wdHIsIHNpemVfdCBfX2xlbiwgc2l6ZV90IF9fc2VlZCk7CisKKyAgLy8gQSBzaW1pbGFyIGhhc2ggcHJpbWl0aXZlLCB1c2luZyB0aGUgRk5WIGhhc2ggYWxnb3JpdGhtLiBUaGlzCisgIC8vIGFsZ29yaXRobSBpcyBndWFyYW50ZWVkIHRvIHN0YXkgdGhlIHNhbWUgZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UuCisgIC8vIChhbHRob3VnaCBpdCBtaWdodCBub3QgcHJvZHVjZSB0aGUgc2FtZSB2YWx1ZXMgb24gZGlmZmVyZW50CisgIC8vIG1hY2hpbmVzLikKKyAgc2l6ZV90CisgIF9GbnZfaGFzaF9ieXRlcyhjb25zdCB2b2lkKiBfX3B0ciwgc2l6ZV90IF9fbGVuLCBzaXplX3QgX19zZWVkKTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9oYXNodGFibGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9oYXNodGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRjZmJmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2hhc2h0YWJsZS5oCkBAIC0wLDAgKzEsMTI0MCBAQAorLy8gaGFzaHRhYmxlLmggaGVhZGVyIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9oYXNodGFibGUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9tYXAsIHVub3JkZXJlZF9zZXR9CisgKi8KKworI2lmbmRlZiBfSEFTSFRBQkxFX0gKKyNkZWZpbmUgX0hBU0hUQUJMRV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9oYXNodGFibGVfcG9saWN5Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBDbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlLCBjbGFzcyBkZWZpbml0aW9uLgorCisgIC8vIE1lYW5pbmcgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIHRlbXBsYXRlIHBhcmFtZXRlcnMKKworICAvLyBfS2V5IGFuZCBfVmFsdWU6IGFyYml0cmFyeSBDb3B5Q29uc3RydWN0aWJsZSB0eXBlcy4KKworICAvLyBfQWxsb2NhdG9yOiBhbiBhbGxvY2F0b3IgdHlwZSAoW2xpYi5hbGxvY2F0b3IucmVxdWlyZW1lbnRzXSkgd2hvc2UKKyAgLy8gdmFsdWUgdHlwZSBpcyBWYWx1ZS4gIEFzIGEgY29uZm9ybWluZyBleHRlbnNpb24sIHdlIGFsbG93IGZvcgorICAvLyB2YWx1ZSB0eXBlICE9IFZhbHVlLgorCisgIC8vIF9FeHRyYWN0S2V5OiBmdW5jdGlvbiBvYmplY3QgdGhhdCB0YWtlcyBhIG9iamVjdCBvZiB0eXBlIFZhbHVlCisgIC8vIGFuZCByZXR1cm5zIGEgdmFsdWUgb2YgdHlwZSBfS2V5LgorCisgIC8vIF9FcXVhbDogZnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgdHdvIG9iamVjdHMgb2YgdHlwZSBrIGFuZCByZXR1cm5zCisgIC8vIGEgYm9vbC1saWtlIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisKKyAgLy8gX0gxOiB0aGUgaGFzaCBmdW5jdGlvbi4gIEEgdW5hcnkgZnVuY3Rpb24gb2JqZWN0IHdpdGggYXJndW1lbnQgdHlwZQorICAvLyBLZXkgYW5kIHJlc3VsdCB0eXBlIHNpemVfdC4gIFJldHVybiB2YWx1ZXMgc2hvdWxkIGJlIGRpc3RyaWJ1dGVkCisgIC8vIG92ZXIgdGhlIGVudGlyZSByYW5nZSBbMCwgbnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6Om1heCgpXS4KKworICAvLyBfSDI6IHRoZSByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uIChpbiB0aGUgdGVybWlub2xvZ3kgb2YgVGF2b3JpIGFuZAorICAvLyBEcmVpemluKS4gIEEgYmluYXJ5IGZ1bmN0aW9uIG9iamVjdCB3aG9zZSBhcmd1bWVudCB0eXBlcyBhbmQgcmVzdWx0CisgIC8vIHR5cGUgYXJlIGFsbCBzaXplX3QuICBHaXZlbiBhcmd1bWVudHMgciBhbmQgTiwgdGhlIHJldHVybiB2YWx1ZSBpcworICAvLyBpbiB0aGUgcmFuZ2UgWzAsIE4pLgorCisgIC8vIF9IYXNoOiB0aGUgcmFuZ2VkIGhhc2ggZnVuY3Rpb24gKFRhdm9yaSBhbmQgRHJlaXppbikuIEEgYmluYXJ5IGZ1bmN0aW9uCisgIC8vIHdob3NlIGFyZ3VtZW50IHR5cGVzIGFyZSBfS2V5IGFuZCBzaXplX3QgYW5kIHdob3NlIHJlc3VsdCB0eXBlIGlzCisgIC8vIHNpemVfdC4gIEdpdmVuIGFyZ3VtZW50cyBrIGFuZCBOLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIHRoZSByYW5nZQorICAvLyBbMCwgTikuICBEZWZhdWx0OiBoYXNoKGssIE4pID0gaDIoaDEoayksIE4pLiAgSWYgX0hhc2ggaXMgYW55dGhpbmcgb3RoZXIKKyAgLy8gdGhhbiB0aGUgZGVmYXVsdCwgX0gxIGFuZCBfSDIgYXJlIGlnbm9yZWQuCisKKyAgLy8gX1JlaGFzaFBvbGljeTogUG9saWN5IGNsYXNzIHdpdGggdGhyZWUgbWVtYmVycywgYWxsIG9mIHdoaWNoIGdvdmVybgorICAvLyB0aGUgYnVja2V0IGNvdW50LiBfTV9uZXh0X2JrdChuKSByZXR1cm5zIGEgYnVja2V0IGNvdW50IG5vIHNtYWxsZXIKKyAgLy8gdGhhbiBuLiAgX01fYmt0X2Zvcl9lbGVtZW50cyhuKSByZXR1cm5zIGEgYnVja2V0IGNvdW50IGFwcHJvcHJpYXRlCisgIC8vIGZvciBhbiBlbGVtZW50IGNvdW50IG9mIG4uICBfTV9uZWVkX3JlaGFzaChuX2JrdCwgbl9lbHQsIG5faW5zKQorICAvLyBkZXRlcm1pbmVzIHdoZXRoZXIsIGlmIHRoZSBjdXJyZW50IGJ1Y2tldCBjb3VudCBpcyBuX2JrdCBhbmQgdGhlCisgIC8vIGN1cnJlbnQgZWxlbWVudCBjb3VudCBpcyBuX2VsdCwgd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgYnVja2V0CisgIC8vIGNvdW50LiAgSWYgc28sIHJldHVybnMgbWFrZV9wYWlyKHRydWUsIG4pLCB3aGVyZSBuIGlzIHRoZSBuZXcKKyAgLy8gYnVja2V0IGNvdW50LiAgSWYgbm90LCByZXR1cm5zIG1ha2VfcGFpcihmYWxzZSwgPGFueXRoaW5nPikuCisKKyAgLy8gPz8/IFJpZ2h0IG5vdyBpdCBpcyBoYXJkLXdpcmVkIHRoYXQgdGhlIG51bWJlciBvZiBidWNrZXRzIG5ldmVyCisgIC8vIHNocmlua3MuICBTaG91bGQgd2UgYWxsb3cgX1JlaGFzaFBvbGljeSB0byBjaGFuZ2UgdGhhdD8KKworICAvLyBfX2NhY2hlX2hhc2hfY29kZTogYm9vbC4gIHRydWUgaWYgd2Ugc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBoYXNoCisgIC8vIGZ1bmN0aW9uIGFsb25nIHdpdGggdGhlIHZhbHVlLiAgVGhpcyBpcyBhIHRpbWUtc3BhY2UgdHJhZGVvZmYuCisgIC8vIFN0b3JpbmcgaXQgbWF5IGltcHJvdmUgbG9va3VwIHNwZWVkIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGltZXMKKyAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBFcXVhbCBmdW5jdGlvbi4KKworICAvLyBfX2NvbnN0YW50X2l0ZXJhdG9yczogYm9vbC4gIHRydWUgaWYgaXRlcmF0b3IgYW5kIGNvbnN0X2l0ZXJhdG9yIGFyZQorICAvLyBib3RoIGNvbnN0YW50IGl0ZXJhdG9yIHR5cGVzLiAgVGhpcyBpcyB0cnVlIGZvciB1bm9yZGVyZWRfc2V0IGFuZAorICAvLyB1bm9yZGVyZWRfbXVsdGlzZXQsIGZhbHNlIGZvciB1bm9yZGVyZWRfbWFwIGFuZCB1bm9yZGVyZWRfbXVsdGltYXAuCisKKyAgLy8gX191bmlxdWVfa2V5czogYm9vbC4gIHRydWUgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiBfSGFzaHRhYmxlOjpjb3VudChrKQorICAvLyBpcyBhbHdheXMgYXQgbW9zdCBvbmUsIGZhbHNlIGlmIGl0IG1heSBiZSBhbiBhcmJpdHJhcnkgbnVtYmVyLiAgVGhpcworICAvLyB0cnVlIGZvciB1bm9yZGVyZWRfc2V0IGFuZCB1bm9yZGVyZWRfbWFwLCBmYWxzZSBmb3IgdW5vcmRlcmVkX211bHRpc2V0CisgIC8vIGFuZCB1bm9yZGVyZWRfbXVsdGltYXAuCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfQWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSwKKwkgICBib29sIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCSAgIGJvb2wgX191bmlxdWVfa2V5cz4KKyAgICBjbGFzcyBfSGFzaHRhYmxlCisgICAgOiBwdWJsaWMgX19kZXRhaWw6Ol9SZWhhc2hfYmFzZTxfUmVoYXNoUG9saWN5LAorCQkJCSAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkJICAgICAgIF9FeHRyYWN0S2V5LAorCQkJCQkgICAgICAgX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsCisJCQkJCSAgICAgICBfUmVoYXNoUG9saWN5LAorCQkJCQkgICAgICAgX19jYWNoZV9oYXNoX2NvZGUsCisJCQkJCSAgICAgICBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJICAgICAgIF9fdW5pcXVlX2tleXM+ID4sCisgICAgICBwdWJsaWMgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX19jYWNoZV9oYXNoX2NvZGU+LAorICAgICAgcHVibGljIF9fZGV0YWlsOjpfTWFwX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX191bmlxdWVfa2V5cywKKwkJCQkgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJCSAgICBfRXh0cmFjdEtleSwKKwkJCQkJICAgIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkgICAgX1JlaGFzaFBvbGljeSwKKwkJCQkJICAgIF9fY2FjaGVfaGFzaF9jb2RlLAorCQkJCQkgICAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCSAgICBfX3VuaXF1ZV9rZXlzPiA+LAorICAgICAgcHVibGljIF9fZGV0YWlsOjpfRXF1YWxpdHlfYmFzZTxfRXh0cmFjdEtleSwgX191bmlxdWVfa2V5cywKKwkJCQkgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkJCSBfRXh0cmFjdEtleSwKKwkJCQkJCSBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJCSBfUmVoYXNoUG9saWN5LAorCQkJCQkJIF9fY2FjaGVfaGFzaF9jb2RlLAorCQkJCQkJIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkJIF9fdW5pcXVlX2tleXM+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9FcXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2VxdWFsOworICAgICAgLy8gbWFwcGVkX3R5cGUsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX01hcF9iYXNlLgorICAgICAgLy8gaGFzaGVyLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9IYXNoX2NvZGVfYmFzZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnJlZmVyZW5jZSAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfTm9kZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+CisJCQkJCQkJICBsb2NhbF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9Ob2RlX2NvbnN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsCisJCQkJCSAgICAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCSAgICAgX19jYWNoZV9oYXNoX2NvZGU+CisJCQkJCQkJICBjb25zdF9sb2NhbF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X0hhc2h0YWJsZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJICAgIF9fY2FjaGVfaGFzaF9jb2RlPgorCQkJCQkJCSAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yPHZhbHVlX3R5cGUsCisJCQkJCQkgIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkJICBfX2NhY2hlX2hhc2hfY29kZT4KKwkJCQkJCQkgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5MiwgdHlwZW5hbWUgX1ZhbHVlMiwgdHlwZW5hbWUgX0V4MiwgYm9vbCBfX3VuaXF1ZTIsCisJICAgICAgIHR5cGVuYW1lIF9IYXNodGFibGUyPgorCWZyaWVuZCBzdHJ1Y3QgX19kZXRhaWw6Ol9NYXBfYmFzZTsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZV9oYXNoX2NvZGU+IF9Ob2RlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8X05vZGU+OjpvdGhlcgorCQkJCQkJCV9Ob2RlX2FsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8X05vZGUqPjo6b3RoZXIKKwkJCQkJCQlfQnVja2V0X2FsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxfVmFsdWU+OjpvdGhlcgorCQkJCQkJCV9WYWx1ZV9hbGxvY2F0b3JfdHlwZTsKKworICAgICAgX05vZGVfYWxsb2NhdG9yX3R5cGUgICBfTV9ub2RlX2FsbG9jYXRvcjsKKyAgICAgIF9Ob2RlKiogICAgICAgICAgICAgICAgX01fYnVja2V0czsKKyAgICAgIHNpemVfdHlwZSAgICAgICAgICAgICAgX01fYnVja2V0X2NvdW50OworICAgICAgc2l6ZV90eXBlICAgICAgICAgICAgICBfTV9iZWdpbl9idWNrZXRfaW5kZXg7IC8vIEZpcnN0IG5vbi1lbXB0eSBidWNrZXQuCisgICAgICBzaXplX3R5cGUgICAgICAgICAgICAgIF9NX2VsZW1lbnRfY291bnQ7CisgICAgICBfUmVoYXNoUG9saWN5ICAgICAgICAgIF9NX3JlaGFzaF9wb2xpY3k7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCV9Ob2RlKgorCV9NX2FsbG9jYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX05vZGUqIF9fbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX05vZGUqKiwgc2l6ZV90eXBlKTsKKworICAgICAgX05vZGUqKgorICAgICAgX01fYWxsb2NhdGVfYnVja2V0cyhzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9Ob2RlKiosIHNpemVfdHlwZSBfX24pOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQsIHN3YXAKKyAgICAgIF9IYXNodGFibGUoc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJCSBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYsCisJCSBjb25zdCBfRXF1YWwmLCBjb25zdCBfRXh0cmFjdEtleSYsCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfSGFzaHRhYmxlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJCSAgIGNvbnN0IF9IMSYsIGNvbnN0IF9IMiYsIGNvbnN0IF9IYXNoJiwKKwkJICAgY29uc3QgX0VxdWFsJiwgY29uc3QgX0V4dHJhY3RLZXkmLAorCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYpOworCisgICAgICBfSGFzaHRhYmxlKGNvbnN0IF9IYXNodGFibGUmKTsKKworICAgICAgX0hhc2h0YWJsZShfSGFzaHRhYmxlJiYpOworCisgICAgICBfSGFzaHRhYmxlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9IYXNodGFibGUmIF9faHQpCisgICAgICB7CisJX0hhc2h0YWJsZSBfX3RtcChfX2h0KTsKKwl0aGlzLT5zd2FwKF9fdG1wKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9IYXNodGFibGUmCisgICAgICBvcGVyYXRvcj0oX0hhc2h0YWJsZSYmIF9faHQpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX19odCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB+X0hhc2h0YWJsZSgpOworCisgICAgICB2b2lkIHN3YXAoX0hhc2h0YWJsZSYpOworCisgICAgICAvLyBCYXNpYyBjb250YWluZXIgb3BlcmF0aW9ucworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2J1Y2tldHMgKyBfTV9iZWdpbl9idWNrZXRfaW5kZXgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9idWNrZXRzICsgX01fYmVnaW5fYnVja2V0X2luZGV4KTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2J1Y2tldHMgKyBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX01fYnVja2V0cyArIF9NX2J1Y2tldF9jb3VudCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9idWNrZXRzICsgX01fYmVnaW5fYnVja2V0X2luZGV4KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfTV9idWNrZXRzICsgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZWxlbWVudF9jb3VudDsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBhbGxvY2F0b3JfdHlwZShfTV9ub2RlX2FsbG9jYXRvcik7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIE9ic2VydmVycworICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZXE7IH0KKworICAgICAgLy8gaGFzaF9mdW5jdGlvbiwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfSGFzaF9jb2RlX2Jhc2UuCisKKyAgICAgIC8vIEJ1Y2tldCBvcGVyYXRpb25zCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9idWNrZXRfY291bnQ7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1heF9zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXRfc2l6ZShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbihfX24pLCBlbmQoX19uKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBidWNrZXQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgdGhpcy0+X01faGFzaF9jb2RlKF9fayksCisJCQkJICAgICBidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gbG9jYWxfaXRlcmF0b3IoX01fYnVja2V0c1tfX25dKTsgfQorCisgICAgICBsb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSkKKyAgICAgIHsgcmV0dXJuIGxvY2FsX2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBiZWdpbihzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoX01fYnVja2V0c1tfX25dKTsgfQorCisgICAgICBjb25zdF9sb2NhbF9pdGVyYXRvcgorICAgICAgZW5kKHNpemVfdHlwZSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8vIERSIDY5MS4KKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBjYmVnaW4oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2xvY2FsX2l0ZXJhdG9yKF9NX2J1Y2tldHNbX19uXSk7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGNlbmQoc2l6ZV90eXBlKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoMCk7IH0KKworICAgICAgZmxvYXQKKyAgICAgIGxvYWRfZmFjdG9yKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpemUoKSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oYnVja2V0X2NvdW50KCkpOworICAgICAgfQorCisgICAgICAvLyBtYXhfbG9hZF9mYWN0b3IsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX1JlaGFzaF9iYXNlLgorCisgICAgICAvLyBHZW5lcmFsaXphdGlvbiBvZiBtYXhfbG9hZF9mYWN0b3IuICBFeHRlbnNpb24sIG5vdCBmb3VuZCBpbiBUUjEuICBPbmx5CisgICAgICAvLyB1c2VmdWwgaWYgX1JlaGFzaFBvbGljeSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KKyAgICAgIGNvbnN0IF9SZWhhc2hQb2xpY3kmCisgICAgICBfX3JlaGFzaF9wb2xpY3koKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVoYXNoX3BvbGljeTsgfQorCisgICAgICB2b2lkCisgICAgICBfX3JlaGFzaF9wb2xpY3koY29uc3QgX1JlaGFzaFBvbGljeSYpOworCisgICAgICAvLyBMb29rdXAuCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEZpbmQgYW5kIGluc2VydCBoZWxwZXIgZnVuY3Rpb25zIGFuZCB0eXBlcworICAgICAgX05vZGUqCisgICAgICBfTV9maW5kX25vZGUoX05vZGUqLCBjb25zdCBrZXlfdHlwZSYsCisJCSAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSkgY29uc3Q7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisJaXRlcmF0b3IKKwlfTV9pbnNlcnRfYnVja2V0KF9BcmcmJiwgc2l6ZV90eXBlLAorCQkJIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorCV9NX2luc2VydChfQXJnJiYsIHN0ZDo6dHJ1ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKwlpdGVyYXRvcgorCV9NX2luc2VydChfQXJnJiYsIHN0ZDo6ZmFsc2VfdHlwZSk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxfX3VuaXF1ZV9rZXlzLAorCQkJCQlzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+LAorCQkJCQlpdGVyYXRvcj46OnR5cGUKKwlfSW5zZXJ0X1JldHVybl9UeXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8X191bmlxdWVfa2V5cywKKwkJCQkJc3RkOjpfU2VsZWN0MXN0PF9JbnNlcnRfUmV0dXJuX1R5cGU+LAorCQkJCQlzdGQ6Ol9JZGVudGl0eTxfSW5zZXJ0X1JldHVybl9UeXBlPgorCQkJCSAgID46OnR5cGUKKwlfSW5zZXJ0X0NvbnZfVHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIEluc2VydCBhbmQgZXJhc2UKKyAgICAgIF9JbnNlcnRfUmV0dXJuX1R5cGUKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX192LCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIF9fdW5pcXVlX2tleXM+KCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsgcmV0dXJuIF9JbnNlcnRfQ29udl9UeXBlKCkoaW5zZXJ0KF9fdikpOyB9CisKKyAgICAgIF9JbnNlcnRfUmV0dXJuX1R5cGUKKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX192KQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KHN0ZDo6bW92ZShfX3YpLAorCQkJIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX191bmlxdWVfa2V5cz4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciwgdmFsdWVfdHlwZSYmIF9fdikKKyAgICAgIHsgcmV0dXJuIF9JbnNlcnRfQ29udl9UeXBlKCkoaW5zZXJ0KHN0ZDo6bW92ZShfX3YpKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8IV9fY29uc3RhbnRfaXRlcmF0b3JzCisJCQkgICAgICAmJiBzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICAgICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorCV9JbnNlcnRfUmV0dXJuX1R5cGUKKwlpbnNlcnQoX1BhaXImJiBfX3YpCisJeyByZXR1cm4gX01faW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX192KSwKKwkJCSAgIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX191bmlxdWVfa2V5cz4oKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8IV9fY29uc3RhbnRfaXRlcmF0b3JzCisJCQkgICAgICAmJiBzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICAgICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorCWl0ZXJhdG9yCisJaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yLCBfUGFpciYmIF9fdikKKwl7IHJldHVybiBfSW5zZXJ0X0NvbnZfVHlwZSgpKGluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl2b2lkCisJaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvcik7CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgLy8gU2V0IG51bWJlciBvZiBidWNrZXRzIHRvIGJlIGFwcHJvcHJpYXRlIGZvciBjb250YWluZXIgb2YgbiBlbGVtZW50LgorICAgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIC8vIERSIDExODkuCisgICAgICAvLyByZXNlcnZlLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9SZWhhc2hfYmFzZS4KKworICAgIHByaXZhdGU6CisgICAgICAvLyBVbmNvbmRpdGlvbmFsbHkgY2hhbmdlIHNpemUgb2YgYnVja2V0IGFycmF5IHRvIG4uCisgICAgICB2b2lkIF9NX3JlaGFzaChzaXplX3R5cGUgX19uKTsKKyAgICB9OworCisKKyAgLy8gRGVmaW5pdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSdzIG91dC1vZi1saW5lIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJICBfX2NoYywgX19jaXQsIF9fdWs+OjpfTm9kZSoKKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICAgIF9NX2FsbG9jYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJX05vZGUqIF9fbiA9IF9NX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCV9fdHJ5CisJICB7CisJICAgIF9NX25vZGVfYWxsb2NhdG9yLmNvbnN0cnVjdChfX24sIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIF9fbi0+X01fbmV4dCA9IDA7CisJICAgIHJldHVybiBfX247CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUoX19uLCAxKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9Ob2RlKiBfX24pCisgICAgeworICAgICAgX01fbm9kZV9hbGxvY2F0b3IuZGVzdHJveShfX24pOworICAgICAgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX24sIDEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9kZWFsbG9jYXRlX25vZGVzKF9Ob2RlKiogX19hcnJheSwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCXsKKwkgIF9Ob2RlKiBfX3AgPSBfX2FycmF5W19faV07CisJICB3aGlsZSAoX19wKQorCSAgICB7CisJICAgICAgX05vZGUqIF9fdG1wID0gX19wOworCSAgICAgIF9fcCA9IF9fcC0+X01fbmV4dDsKKwkgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX190bXApOworCSAgICB9CisJICBfX2FycmF5W19faV0gPSAwOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Ol9Ob2RlKioKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9hbGxvY2F0ZV9idWNrZXRzKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0J1Y2tldF9hbGxvY2F0b3JfdHlwZSBfX2FsbG9jKF9NX25vZGVfYWxsb2NhdG9yKTsKKworICAgICAgLy8gV2UgYWxsb2NhdGUgb25lIGV4dHJhIGJ1Y2tldCB0byBob2xkIGEgc2VudGluZWwsIGFuIGFyYml0cmFyeQorICAgICAgLy8gbm9uLW51bGwgcG9pbnRlci4gIEl0ZXJhdG9yIGluY3JlbWVudCByZWxpZXMgb24gdGhpcy4KKyAgICAgIF9Ob2RlKiogX19wID0gX19hbGxvYy5hbGxvY2F0ZShfX24gKyAxKTsKKyAgICAgIHN0ZDo6ZmlsbChfX3AsIF9fcCArIF9fbiwgKF9Ob2RlKikgMCk7CisgICAgICBfX3BbX19uXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8X05vZGUqPigweDEwMDApOworICAgICAgcmV0dXJuIF9fcDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9Ob2RlKiogX19wLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9CdWNrZXRfYWxsb2NhdG9yX3R5cGUgX19hbGxvYyhfTV9ub2RlX2FsbG9jYXRvcik7CisgICAgICBfX2FsbG9jLmRlYWxsb2NhdGUoX19wLCBfX24gKyAxKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfSGFzaHRhYmxlKHNpemVfdHlwZSBfX2J1Y2tldF9oaW50LAorCSAgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwgY29uc3QgX0hhc2gmIF9faCwKKwkgICAgICAgY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leGssCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KCksCisgICAgICBfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCQlfSDEsIF9IMiwgX0hhc2gsIF9fY2hjPihfX2V4aywgX19lcSwKKwkJCQkJCQlfX2gxLCBfX2gyLCBfX2gpLAorICAgICAgX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfX3VrLCBfSGFzaHRhYmxlPigpLAorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoX19hKSwKKyAgICAgIF9NX2J1Y2tldF9jb3VudCgwKSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoMCksCisgICAgICBfTV9yZWhhc2hfcG9saWN5KCkKKyAgICB7CisgICAgICBfTV9idWNrZXRfY291bnQgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KF9fYnVja2V0X2hpbnQpOworICAgICAgX01fYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9NX2JlZ2luX2J1Y2tldF9pbmRleCA9IF9NX2J1Y2tldF9jb3VudDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICAgIF9IYXNodGFibGUoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSBzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkJIGNvbnN0IF9IMSYgX19oMSwgY29uc3QgX0gyJiBfX2gyLCBjb25zdCBfSGFzaCYgX19oLAorCQkgY29uc3QgX0VxdWFsJiBfX2VxLCBjb25zdCBfRXh0cmFjdEtleSYgX19leGssCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KCksCisJX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJICBfSDEsIF9IMiwgX0hhc2gsIF9fY2hjPihfX2V4aywgX19lcSwKKwkJCQkJCQkgIF9faDEsIF9faDIsIF9faCksCisJX19kZXRhaWw6Ol9NYXBfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfX3VrLCBfSGFzaHRhYmxlPigpLAorCV9NX25vZGVfYWxsb2NhdG9yKF9fYSksCisJX01fYnVja2V0X2NvdW50KDApLAorCV9NX2VsZW1lbnRfY291bnQoMCksCisJX01fcmVoYXNoX3BvbGljeSgpCisgICAgICB7CisJX01fYnVja2V0X2NvdW50ID0gc3RkOjptYXgoX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdChfX2J1Y2tldF9oaW50KSwKKwkJCQkgICBfTV9yZWhhc2hfcG9saWN5LgorCQkJCSAgIF9NX2JrdF9mb3JfZWxlbWVudHMoX19kZXRhaWw6OgorCQkJCQkJICAgICAgIF9fZGlzdGFuY2VfZncoX19mLAorCQkJCQkJCQkgICAgIF9fbCkpKTsKKwlfTV9idWNrZXRzID0gX01fYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRfY291bnQpOworCV9NX2JlZ2luX2J1Y2tldF9pbmRleCA9IF9NX2J1Y2tldF9jb3VudDsKKwlfX3RyeQorCSAgeworCSAgICBmb3IgKDsgX19mICE9IF9fbDsgKytfX2YpCisJICAgICAgdGhpcy0+aW5zZXJ0KCpfX2YpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBjbGVhcigpOworCSAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfSGFzaHRhYmxlKGNvbnN0IF9IYXNodGFibGUmIF9faHQpCisgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KF9faHQpLAorICAgICAgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz4oX19odCksCisgICAgICBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9fdWssIF9IYXNodGFibGU+KF9faHQpLAorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoX19odC5fTV9ub2RlX2FsbG9jYXRvciksCisgICAgICBfTV9idWNrZXRfY291bnQoX19odC5fTV9idWNrZXRfY291bnQpLAorICAgICAgX01fYmVnaW5fYnVja2V0X2luZGV4KF9faHQuX01fYmVnaW5fYnVja2V0X2luZGV4KSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoX19odC5fTV9lbGVtZW50X2NvdW50KSwKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3koX19odC5fTV9yZWhhc2hfcG9saWN5KQorICAgIHsKKyAgICAgIF9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9faHQuX01fYnVja2V0X2NvdW50OyArK19faSkKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX24gPSBfX2h0Ll9NX2J1Y2tldHNbX19pXTsKKwkgICAgICBfTm9kZSoqIF9fdGFpbCA9IF9NX2J1Y2tldHMgKyBfX2k7CisJICAgICAgd2hpbGUgKF9fbikKKwkJeworCQkgICpfX3RhaWwgPSBfTV9hbGxvY2F0ZV9ub2RlKF9fbi0+X01fdik7CisJCSAgdGhpcy0+X01fY29weV9jb2RlKCpfX3RhaWwsIF9fbik7CisJCSAgX190YWlsID0gJigoKl9fdGFpbCktPl9NX25leHQpOworCQkgIF9fbiA9IF9fbi0+X01fbmV4dDsKKwkJfQorCSAgICB9CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgY2xlYXIoKTsKKwkgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9IYXNodGFibGUoX0hhc2h0YWJsZSYmIF9faHQpCisgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KF9faHQpLAorICAgICAgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz4oX19odCksCisgICAgICBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9fdWssIF9IYXNodGFibGU+KF9faHQpLAorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoX19odC5fTV9ub2RlX2FsbG9jYXRvciksCisgICAgICBfTV9idWNrZXRzKF9faHQuX01fYnVja2V0cyksCisgICAgICBfTV9idWNrZXRfY291bnQoX19odC5fTV9idWNrZXRfY291bnQpLAorICAgICAgX01fYmVnaW5fYnVja2V0X2luZGV4KF9faHQuX01fYmVnaW5fYnVja2V0X2luZGV4KSwKKyAgICAgIF9NX2VsZW1lbnRfY291bnQoX19odC5fTV9lbGVtZW50X2NvdW50KSwKKyAgICAgIF9NX3JlaGFzaF9wb2xpY3koX19odC5fTV9yZWhhc2hfcG9saWN5KQorICAgIHsKKyAgICAgIF9faHQuX01fcmVoYXNoX3BvbGljeSA9IF9SZWhhc2hQb2xpY3koKTsKKyAgICAgIF9faHQuX01fYnVja2V0X2NvdW50ID0gX19odC5fTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KDApOworICAgICAgX19odC5fTV9idWNrZXRzID0gX19odC5fTV9hbGxvY2F0ZV9idWNrZXRzKF9faHQuX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9faHQuX01fYmVnaW5fYnVja2V0X2luZGV4ID0gX19odC5fTV9idWNrZXRfY291bnQ7CisgICAgICBfX2h0Ll9NX2VsZW1lbnRfY291bnQgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIH5fSGFzaHRhYmxlKCkKKyAgICB7CisgICAgICBjbGVhcigpOworICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIHN3YXAoX0hhc2h0YWJsZSYgX194KQorICAgIHsKKyAgICAgIC8vIFRoZSBvbmx5IGJhc2UgY2xhc3Mgd2l0aCBtZW1iZXIgdmFyaWFibGVzIGlzIGhhc2hfY29kZV9iYXNlLiAgV2UKKyAgICAgIC8vIGRlZmluZSBfSGFzaF9jb2RlX2Jhc2U6Ol9NX3N3YXAgYmVjYXVzZSBkaWZmZXJlbnQgc3BlY2lhbGl6YXRpb25zCisgICAgICAvLyBoYXZlIGRpZmZlcmVudCBtZW1iZXJzLgorICAgICAgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz46Ol9NX3N3YXAoX194KTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDMxLiBTd2FwcGluZyBjb250YWluZXJzIHdpdGggdW5lcXVhbCBhbGxvY2F0b3JzLgorICAgICAgc3RkOjpfX2FsbG9jX3N3YXA8X05vZGVfYWxsb2NhdG9yX3R5cGU+OjpfU19kb19pdChfTV9ub2RlX2FsbG9jYXRvciwKKwkJCQkJCQlfX3guX01fbm9kZV9hbGxvY2F0b3IpOworCisgICAgICBzdGQ6OnN3YXAoX01fcmVoYXNoX3BvbGljeSwgX194Ll9NX3JlaGFzaF9wb2xpY3kpOworICAgICAgc3RkOjpzd2FwKF9NX2J1Y2tldHMsIF9feC5fTV9idWNrZXRzKTsKKyAgICAgIHN0ZDo6c3dhcChfTV9idWNrZXRfY291bnQsIF9feC5fTV9idWNrZXRfY291bnQpOworICAgICAgc3RkOjpzd2FwKF9NX2JlZ2luX2J1Y2tldF9pbmRleCwgX194Ll9NX2JlZ2luX2J1Y2tldF9pbmRleCk7CisgICAgICBzdGQ6OnN3YXAoX01fZWxlbWVudF9jb3VudCwgX194Ll9NX2VsZW1lbnRfY291bnQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfX3JlaGFzaF9wb2xpY3koY29uc3QgX1JlaGFzaFBvbGljeSYgX19wb2wpCisgICAgeworICAgICAgX01fcmVoYXNoX3BvbGljeSA9IF9fcG9sOworICAgICAgc2l6ZV90eXBlIF9fbl9ia3QgPSBfX3BvbC5fTV9ia3RfZm9yX2VsZW1lbnRzKF9NX2VsZW1lbnRfY291bnQpOworICAgICAgaWYgKF9fbl9ia3QgPiBfTV9idWNrZXRfY291bnQpCisJX01fcmVoYXNoKF9fbl9ia3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIHJldHVybiBfX3AgPyBpdGVyYXRvcihfX3AsIF9NX2J1Y2tldHMgKyBfX24pIDogdGhpcy0+ZW5kKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTm9kZSogX19wID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworICAgICAgcmV0dXJuIF9fcCA/IGNvbnN0X2l0ZXJhdG9yKF9fcCwgX01fYnVja2V0cyArIF9fbikgOiB0aGlzLT5lbmQoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OnNpemVfdHlwZQorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgc3RkOjpzaXplX3QgX19yZXN1bHQgPSAwOworICAgICAgZm9yIChfTm9kZSogX19wID0gX01fYnVja2V0c1tfX25dOyBfX3A7IF9fcCA9IF9fcC0+X01fbmV4dCkKKwlpZiAodGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgX19wKSkKKwkgICsrX19yZXN1bHQ7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yLAorCSAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX05vZGUqKiBfX2hlYWQgPSBfTV9idWNrZXRzICsgX19uOworICAgICAgX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZSgqX19oZWFkLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmIChfX3ApCisJeworCSAgX05vZGUqIF9fcDEgPSBfX3AtPl9NX25leHQ7CisJICBmb3IgKDsgX19wMTsgX19wMSA9IF9fcDEtPl9NX25leHQpCisJICAgIGlmICghdGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgX19wMSkpCisJICAgICAgYnJlYWs7CisKKwkgIGl0ZXJhdG9yIF9fZmlyc3QoX19wLCBfX2hlYWQpOworCSAgaXRlcmF0b3IgX19sYXN0KF9fcDEsIF9faGVhZCk7CisJICBpZiAoIV9fcDEpCisJICAgIF9fbGFzdC5fTV9pbmNyX2J1Y2tldCgpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fZmlyc3QsIF9fbGFzdCk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLT5lbmQoKSwgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvciwKKwkgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9Ob2RlKiogX19oZWFkID0gX01fYnVja2V0cyArIF9fbjsKKyAgICAgIF9Ob2RlKiBfX3AgPSBfTV9maW5kX25vZGUoKl9faGVhZCwgX19rLCBfX2NvZGUpOworCisgICAgICBpZiAoX19wKQorCXsKKwkgIF9Ob2RlKiBfX3AxID0gX19wLT5fTV9uZXh0OworCSAgZm9yICg7IF9fcDE7IF9fcDEgPSBfX3AxLT5fTV9uZXh0KQorCSAgICBpZiAoIXRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcDEpKQorCSAgICAgIGJyZWFrOworCisJICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0KF9fcCwgX19oZWFkKTsKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdChfX3AxLCBfX2hlYWQpOworCSAgaWYgKCFfX3AxKQorCSAgICBfX2xhc3QuX01faW5jcl9idWNrZXQoKTsKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2ZpcnN0LCBfX2xhc3QpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIodGhpcy0+ZW5kKCksIHRoaXMtPmVuZCgpKTsKKyAgICB9CisKKyAgLy8gRmluZCB0aGUgbm9kZSB3aG9zZSBrZXkgY29tcGFyZXMgZXF1YWwgdG8gaywgYmVnaW5uaW5nIHRoZSBzZWFyY2gKKyAgLy8gYXQgcCAodXN1YWxseSB0aGUgaGVhZCBvZiBhIGJ1Y2tldCkuICBSZXR1cm4gbmlsIGlmIG5vIG5vZGUgaXMgZm91bmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LAorCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpfTm9kZSoKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9maW5kX25vZGUoX05vZGUqIF9fcCwgY29uc3Qga2V5X3R5cGUmIF9faywKKwkJdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSkgY29uc3QKKyAgICB7CisgICAgICBmb3IgKDsgX19wOyBfX3AgPSBfX3AtPl9NX25leHQpCisJaWYgKHRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcCkpCisJICByZXR1cm4gX19wOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvLyBJbnNlcnQgdiBpbiBidWNrZXQgbiAoYXNzdW1lcyBubyBlbGVtZW50IHdpdGggaXRzIGtleSBhbHJlYWR5IHByZXNlbnQpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJICBfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgICAgX01faW5zZXJ0X2J1Y2tldChfQXJnJiYgX192LCBzaXplX3R5cGUgX19uLAorCQkgICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+IF9fZG9fcmVoYXNoCisJICA9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LAorCQkJCQkgICAgX01fZWxlbWVudF9jb3VudCwgMSk7CisKKwlpZiAoX19kb19yZWhhc2guZmlyc3QpCisJICB7CisJICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSB0aGlzLT5fTV9leHRyYWN0KF9fdik7CisJICAgIF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX19kb19yZWhhc2guc2Vjb25kKTsKKwkgIH0KKworCS8vIEFsbG9jYXRlIHRoZSBuZXcgbm9kZSBiZWZvcmUgZG9pbmcgdGhlIHJlaGFzaCBzbyB0aGF0IHdlIGRvbid0CisJLy8gZG8gYSByZWhhc2ggaWYgdGhlIGFsbG9jYXRpb24gdGhyb3dzLgorCV9Ob2RlKiBfX25ld19ub2RlID0gX01fYWxsb2NhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZz4oX192KSk7CisKKwlfX3RyeQorCSAgeworCSAgICBpZiAoX19kb19yZWhhc2guZmlyc3QpCisJICAgICAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCk7CisKKwkgICAgX19uZXdfbm9kZS0+X01fbmV4dCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgICAgdGhpcy0+X01fc3RvcmVfY29kZShfX25ld19ub2RlLCBfX2NvZGUpOworCSAgICBfTV9idWNrZXRzW19fbl0gPSBfX25ld19ub2RlOworCSAgICArK19NX2VsZW1lbnRfY291bnQ7CisJICAgIGlmIChfX24gPCBfTV9iZWdpbl9idWNrZXRfaW5kZXgpCisJICAgICAgX01fYmVnaW5fYnVja2V0X2luZGV4ID0gX19uOworCSAgICByZXR1cm4gaXRlcmF0b3IoX19uZXdfbm9kZSwgX01fYnVja2V0cyArIF9fbik7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX25ld19ub2RlKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgLy8gSW5zZXJ0IHYgaWYgbm8gZWxlbWVudCB3aXRoIGl0cyBrZXkgaXMgYWxyZWFkeSBwcmVzZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJICAgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgICAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgICAgX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgICBfTV9pbnNlcnQoX0FyZyYmIF9fdiwgc3RkOjp0cnVlX3R5cGUpCisgICAgICB7CisJY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoX192KTsKKwl0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisJc2l6ZV90eXBlIF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKworCWlmIChfTm9kZSogX19wID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpKQorCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcCwgX01fYnVja2V0cyArIF9fbiksIGZhbHNlKTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoX01faW5zZXJ0X2J1Y2tldChzdGQ6OmZvcndhcmQ8X0FyZz4oX192KSwKKwkJCSAgICAgIF9fbiwgX19jb2RlKSwgdHJ1ZSk7CisgICAgICB9CisKKyAgLy8gSW5zZXJ0IHYgdW5jb25kaXRpb25hbGx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJICBfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgICAgX01faW5zZXJ0KF9BcmcmJiBfX3YsIHN0ZDo6ZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+IF9fZG9fcmVoYXNoCisJICA9IF9NX3JlaGFzaF9wb2xpY3kuX01fbmVlZF9yZWhhc2goX01fYnVja2V0X2NvdW50LAorCQkJCQkgICAgX01fZWxlbWVudF9jb3VudCwgMSk7CisJaWYgKF9fZG9fcmVoYXNoLmZpcnN0KQorCSAgX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCk7CisKKwljb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdChfX3YpOworCXR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKwlzaXplX3R5cGUgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworCisJLy8gRmlyc3QgZmluZCB0aGUgbm9kZSwgYXZvaWQgbGVha2luZyBuZXdfbm9kZSBpZiBjb21wYXJlIHRocm93cy4KKwlfTm9kZSogX19wcmV2ID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworCV9Ob2RlKiBfX25ld19ub2RlID0gX01fYWxsb2NhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZz4oX192KSk7CisKKwlpZiAoX19wcmV2KQorCSAgeworCSAgICBfX25ld19ub2RlLT5fTV9uZXh0ID0gX19wcmV2LT5fTV9uZXh0OworCSAgICBfX3ByZXYtPl9NX25leHQgPSBfX25ld19ub2RlOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgX19uZXdfbm9kZS0+X01fbmV4dCA9IF9NX2J1Y2tldHNbX19uXTsKKwkgICAgX01fYnVja2V0c1tfX25dID0gX19uZXdfbm9kZTsKKwkgICAgaWYgKF9fbiA8IF9NX2JlZ2luX2J1Y2tldF9pbmRleCkKKwkgICAgICBfTV9iZWdpbl9idWNrZXRfaW5kZXggPSBfX247CisJICB9CisJdGhpcy0+X01fc3RvcmVfY29kZShfX25ld19ub2RlLCBfX2NvZGUpOworCisJKytfTV9lbGVtZW50X2NvdW50OworCXJldHVybiBpdGVyYXRvcihfX25ld19ub2RlLCBfTV9idWNrZXRzICsgX19uKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uX2VsdCA9IF9fZGV0YWlsOjpfX2Rpc3RhbmNlX2Z3KF9fZmlyc3QsIF9fbGFzdCk7CisJc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PiBfX2RvX3JlaGFzaAorCSAgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25lZWRfcmVoYXNoKF9NX2J1Y2tldF9jb3VudCwKKwkJCQkJICAgIF9NX2VsZW1lbnRfY291bnQsIF9fbl9lbHQpOworCWlmIChfX2RvX3JlaGFzaC5maXJzdCkKKwkgIF9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQpOworCisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICB0aGlzLT5pbnNlcnQoKl9fZmlyc3QpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9faXQpCisgICAgeworICAgICAgaXRlcmF0b3IgX19yZXN1bHQoX19pdC5fTV9jdXJfbm9kZSwgX19pdC5fTV9jdXJfYnVja2V0KTsKKyAgICAgICsrX19yZXN1bHQ7CisKKyAgICAgIF9Ob2RlKiBfX2N1ciA9ICpfX2l0Ll9NX2N1cl9idWNrZXQ7CisgICAgICBpZiAoX19jdXIgPT0gX19pdC5fTV9jdXJfbm9kZSkKKwl7CisJICAqX19pdC5fTV9jdXJfYnVja2V0ID0gX19jdXItPl9NX25leHQ7CisKKwkgIC8vIElmIF9NX2JlZ2luX2J1Y2tldF9pbmRleCBubyBsb25nZXIgaW5kZXhlcyB0aGUgZmlyc3Qgbm9uLWVtcHR5CisJICAvLyBidWNrZXQgLSBpdHMgc2luZ2xlIG5vZGUgaXMgYmVpbmcgZXJhc2VkIC0gdXBkYXRlIGl0LgorCSAgaWYgKCFfTV9idWNrZXRzW19NX2JlZ2luX2J1Y2tldF9pbmRleF0pCisJICAgIF9NX2JlZ2luX2J1Y2tldF9pbmRleCA9IF9fcmVzdWx0Ll9NX2N1cl9idWNrZXQgLSBfTV9idWNrZXRzOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICB3aGlsZSAoX19uZXh0ICE9IF9faXQuX01fY3VyX25vZGUpCisJICAgIHsKKwkgICAgICBfX2N1ciA9IF9fbmV4dDsKKwkgICAgICBfX25leHQgPSBfX2N1ci0+X01fbmV4dDsKKwkgICAgfQorCSAgX19jdXItPl9NX25leHQgPSBfX25leHQtPl9NX25leHQ7CisJfQorCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX19pdC5fTV9jdXJfbm9kZSk7CisgICAgICAtLV9NX2VsZW1lbnRfY291bnQ7CisKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OnNpemVfdHlwZQorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgc2l6ZV90eXBlIF9fcmVzdWx0ID0gMDsKKworICAgICAgX05vZGUqKiBfX3Nsb3QgPSBfTV9idWNrZXRzICsgX19uOworICAgICAgd2hpbGUgKCpfX3Nsb3QgJiYgIXRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsICpfX3Nsb3QpKQorCV9fc2xvdCA9ICYoKCpfX3Nsb3QpLT5fTV9uZXh0KTsKKworICAgICAgX05vZGUqKiBfX3NhdmVkX3Nsb3QgPSAwOworICAgICAgd2hpbGUgKCpfX3Nsb3QgJiYgdGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgKl9fc2xvdCkpCisJeworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gNTI2LiBJcyBpdCB1bmRlZmluZWQgaWYgYSBmdW5jdGlvbiBpbiB0aGUgc3RhbmRhcmQgY2hhbmdlcworCSAgLy8gaW4gcGFyYW1ldGVycz8KKwkgIGlmIChzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2V4dHJhY3QoKCpfX3Nsb3QpLT5fTV92KSkKKwkgICAgICAhPSBzdGQ6Ol9fYWRkcmVzc29mKF9faykpCisJICAgIHsKKwkgICAgICBfTm9kZSogX19wID0gKl9fc2xvdDsKKwkgICAgICAqX19zbG90ID0gX19wLT5fTV9uZXh0OworCSAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3ApOworCSAgICAgIC0tX01fZWxlbWVudF9jb3VudDsKKwkgICAgICArK19fcmVzdWx0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX3NhdmVkX3Nsb3QgPSBfX3Nsb3Q7CisJICAgICAgX19zbG90ID0gJigoKl9fc2xvdCktPl9NX25leHQpOworCSAgICB9CisJfQorCisgICAgICBpZiAoX19zYXZlZF9zbG90KQorCXsKKwkgIF9Ob2RlKiBfX3AgPSAqX19zYXZlZF9zbG90OworCSAgKl9fc2F2ZWRfc2xvdCA9IF9fcC0+X01fbmV4dDsKKwkgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3ApOworCSAgLS1fTV9lbGVtZW50X2NvdW50OworCSAgKytfX3Jlc3VsdDsKKwl9CisKKyAgICAgIC8vIElmIHRoZSBlbnRpcmUgYnVja2V0IGluZGV4ZWQgYnkgX01fYmVnaW5fYnVja2V0X2luZGV4IGhhcyBiZWVuCisgICAgICAvLyBlcmFzZWQgbG9vayBmb3J3YXJkIGZvciB0aGUgZmlyc3Qgbm9uLWVtcHR5IGJ1Y2tldC4KKyAgICAgIGlmICghX01fYnVja2V0c1tfTV9iZWdpbl9idWNrZXRfaW5kZXhdKQorCXsKKwkgIGlmICghX01fZWxlbWVudF9jb3VudCkKKwkgICAgX01fYmVnaW5fYnVja2V0X2luZGV4ID0gX01fYnVja2V0X2NvdW50OworCSAgZWxzZQorCSAgICB7CisJICAgICAgKytfTV9iZWdpbl9idWNrZXRfaW5kZXg7CisJICAgICAgd2hpbGUgKCFfTV9idWNrZXRzW19NX2JlZ2luX2J1Y2tldF9pbmRleF0pCisJCSsrX01fYmVnaW5fYnVja2V0X2luZGV4OworCSAgICB9CisJfQorCisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8vID8/PyBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBieSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoZSBidWNrZXQKKyAgLy8gc3RydWN0dXJlLCBidXQgaXQncyBub3QgY2xlYXIgdGhhdCBpdCdzIHdvcnRoIGRvaW5nLiAgSXQgcHJvYmFibHkKKyAgLy8gd291bGRuJ3QgZXZlbiBiZSBhbiBvcHRpbWl6YXRpb24gdW5sZXNzIHRoZSBsb2FkIGZhY3RvciBpcyBsYXJnZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJIF9fZmlyc3QgPSB0aGlzLT5lcmFzZShfX2ZpcnN0KTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX2xhc3QuX01fY3VyX25vZGUsIF9fbGFzdC5fTV9jdXJfYnVja2V0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgY2xlYXIoKQorICAgIHsKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9NX2VsZW1lbnRfY291bnQgPSAwOworICAgICAgX01fYmVnaW5fYnVja2V0X2luZGV4ID0gX01fYnVja2V0X2NvdW50OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfTV9yZWhhc2goc3RkOjptYXgoX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdChfX24pLAorCQkJIF9NX3JlaGFzaF9wb2xpY3kuX01fYmt0X2Zvcl9lbGVtZW50cyhfTV9lbGVtZW50X2NvdW50CisJCQkJCQkJICAgICAgKyAxKSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9yZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfTm9kZSoqIF9fbmV3X2FycmF5ID0gX01fYWxsb2NhdGVfYnVja2V0cyhfX24pOworICAgICAgX190cnkKKwl7CisJICBfTV9iZWdpbl9idWNrZXRfaW5kZXggPSBfX247CisJICBmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfTV9idWNrZXRfY291bnQ7ICsrX19pKQorCSAgICB3aGlsZSAoX05vZGUqIF9fcCA9IF9NX2J1Y2tldHNbX19pXSkKKwkgICAgICB7CisJCXN0ZDo6c2l6ZV90IF9fbmV3X2luZGV4ID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9fcCwgX19uKTsKKwkJX01fYnVja2V0c1tfX2ldID0gX19wLT5fTV9uZXh0OworCQlfX3AtPl9NX25leHQgPSBfX25ld19hcnJheVtfX25ld19pbmRleF07CisJCV9fbmV3X2FycmF5W19fbmV3X2luZGV4XSA9IF9fcDsKKwkJaWYgKF9fbmV3X2luZGV4IDwgX01fYmVnaW5fYnVja2V0X2luZGV4KQorCQkgIF9NX2JlZ2luX2J1Y2tldF9pbmRleCA9IF9fbmV3X2luZGV4OworCSAgICAgIH0KKwkgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgX01fYnVja2V0X2NvdW50ID0gX19uOworCSAgX01fYnVja2V0cyA9IF9fbmV3X2FycmF5OworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIC8vIEEgZmFpbHVyZSBoZXJlIG1lYW5zIHRoYXQgYSBoYXNoIGZ1bmN0aW9uIHRocmV3IGFuIGV4Y2VwdGlvbi4KKwkgIC8vIFdlIGNhbid0IHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIHdpdGhvdXQgY2FsbGluZyB0aGUgaGFzaAorCSAgLy8gZnVuY3Rpb24gYWdhaW4sIHNvIHRoZSBvbmx5IHNlbnNpYmxlIHJlY292ZXJ5IGlzIHRvIGRlbGV0ZQorCSAgLy8gZXZlcnl0aGluZy4KKwkgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX19uZXdfYXJyYXksIF9fbik7CisJICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX19uZXdfYXJyYXksIF9fbik7CisJICBfTV9kZWFsbG9jYXRlX25vZGVzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisJICBfTV9lbGVtZW50X2NvdW50ID0gMDsKKwkgIF9NX2JlZ2luX2J1Y2tldF9pbmRleCA9IF9NX2J1Y2tldF9jb3VudDsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfSEFTSFRBQkxFX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9oYXNodGFibGVfcG9saWN5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvaGFzaHRhYmxlX3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZTE4NzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvaGFzaHRhYmxlX3BvbGljeS5oCkBAIC0wLDAgKzEsOTg3IEBACisvLyBJbnRlcm5hbCBwb2xpY3kgaGVhZGVyIGZvciB1bm9yZGVyZWRfc2V0IGFuZCB1bm9yZGVyZWRfbWFwIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9oYXNodGFibGVfcG9saWN5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICogIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9tYXAsdW5vcmRlcmVkX3NldH0KKyAqLworCisjaWZuZGVmIF9IQVNIVEFCTEVfUE9MSUNZX0gKKyNkZWZpbmUgX0hBU0hUQUJMRV9QT0xJQ1lfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fZGV0YWlsCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEhlbHBlciBmdW5jdGlvbjogcmV0dXJuIGRpc3RhbmNlKGZpcnN0LCBsYXN0KSBmb3IgZm9yd2FyZAorICAvLyBpdGVyYXRvcnMsIG9yIDAgZm9yIGlucHV0IGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8Y2xhc3MgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2Rpc3RhbmNlX2Z3KF9JdGVyYXRvciBfX2ZpcnN0LCBfSXRlcmF0b3IgX19sYXN0LAorCQkgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIDA7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QsCisJCSAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOworICAgICAgcmV0dXJuIF9fZGlzdGFuY2VfZncoX19maXJzdCwgX19sYXN0LCBfVGFnKCkpOworICAgIH0KKworICAvLyBBdXhpbGlhcnkgdHlwZXMgdXNlZCBmb3IgYWxsIGluc3RhbnRpYXRpb25zIG9mIF9IYXNodGFibGU6IG5vZGVzCisgIC8vIGFuZCBpdGVyYXRvcnMuCisKKyAgLy8gTm9kZXMsIHVzZWQgdG8gd3JhcCBlbGVtZW50cyBzdG9yZWQgaW4gdGhlIGhhc2ggdGFibGUuICBBIHBvbGljeQorICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgY2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSBjb250cm9scyB3aGV0aGVyCisgIC8vIG5vZGVzIGFsc28gc3RvcmUgYSBoYXNoIGNvZGUuIEluIHNvbWUgY2FzZXMgKGUuZy4gc3RyaW5ncykgdGhpcworICAvLyBtYXkgYmUgYSBwZXJmb3JtYW5jZSB3aW4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPgorICAgIHsKKyAgICAgIF9WYWx1ZSAgICAgICBfTV92OworICAgICAgc3RkOjpzaXplX3QgIF9NX2hhc2hfY29kZTsKKyAgICAgIF9IYXNoX25vZGUqICBfTV9uZXh0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlfSGFzaF9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fdihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgX01faGFzaF9jb2RlKCksIF9NX25leHQoKSB7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPgorICAgIHsKKyAgICAgIF9WYWx1ZSAgICAgICBfTV92OworICAgICAgX0hhc2hfbm9kZSogIF9NX25leHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCV9IYXNoX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV92KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICBfTV9uZXh0KCkgeyB9CisgICAgfTsKKworICAvLyBMb2NhbCBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB3aXRoaW4gYSBidWNrZXQgYnV0IG5vdCBiZXR3ZWVuCisgIC8vIGJ1Y2tldHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgX05vZGVfaXRlcmF0b3JfYmFzZShfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX01fY3VyKF9fcCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeyBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7IH0KKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiAgX01fY3VyOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgIT0gX195Ll9NX2N1cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQljb25zdCBfVmFsdWUqLCBfVmFsdWUqPjo6dHlwZQorCQkJCQkJICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCWNvbnN0IF9WYWx1ZSYsIF9WYWx1ZSY+Ojp0eXBlCisJCQkJCQkgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX05vZGVfaXRlcmF0b3IoKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTm9kZV9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyLT5fTV92KTsgfQorCisgICAgICBfTm9kZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTm9kZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCkgeyB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Ob2RlX2l0ZXJhdG9yPF9WYWx1ZSwgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkgICBfX2NhY2hlPiYgX194KQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX194Ll9NX2N1cikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyLT5fTV92KTsgfQorCisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfTm9kZV9jb25zdF9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2UKKyAgICB7CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2UoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiBfX25vZGUsCisJCQkgICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19idWNrZXQpCisgICAgICA6IF9NX2N1cl9ub2RlKF9fbm9kZSksIF9NX2N1cl9idWNrZXQoX19idWNrZXQpIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyKCkKKyAgICAgIHsKKwlfTV9jdXJfbm9kZSA9IF9NX2N1cl9ub2RlLT5fTV9uZXh0OworCWlmICghX01fY3VyX25vZGUpCisJICBfTV9pbmNyX2J1Y2tldCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyX2J1Y2tldCgpOworCisgICAgICBfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qICAgX01fY3VyX25vZGU7CisgICAgICBfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qKiAgX01fY3VyX2J1Y2tldDsKKyAgICB9OworCisgIC8vIEdsb2JhbCBpdGVyYXRvcnMsIHVzZWQgZm9yIGFyYml0cmFyeSBpdGVyYXRpb24gd2l0aGluIGEgaGFzaAorICAvLyB0YWJsZS4gIExhcmdlciBhbmQgbW9yZSBleHBlbnNpdmUgdGhhbiBsb2NhbCBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPjo6CisgICAgX01faW5jcl9idWNrZXQoKQorICAgIHsKKyAgICAgICsrX01fY3VyX2J1Y2tldDsKKworICAgICAgLy8gVGhpcyBsb29wIHJlcXVpcmVzIHRoZSBidWNrZXQgYXJyYXkgdG8gaGF2ZSBhIG5vbi1udWxsIHNlbnRpbmVsLgorICAgICAgd2hpbGUgKCEqX01fY3VyX2J1Y2tldCkKKwkrK19NX2N1cl9idWNrZXQ7CisgICAgICBfTV9jdXJfbm9kZSA9ICpfTV9jdXJfYnVja2V0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feCwKKwkgICAgICAgY29uc3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyX25vZGUgPT0gX195Ll9NX2N1cl9ub2RlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1cl9ub2RlICE9IF9feS5fTV9jdXJfbm9kZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJY29uc3QgX1ZhbHVlKiwgX1ZhbHVlKj46OnR5cGUKKwkJCQkJCSAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQljb25zdCBfVmFsdWUmLCBfVmFsdWUmPjo6dHlwZQorCQkJCQkJICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwLCAwKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCSAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3AsIF9fYikgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYikKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oKl9fYiwgX19iKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyX25vZGUtPl9NX3Y7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1cl9ub2RlLT5fTV92KTsgfQorCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX0hhc2h0YWJsZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUmICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwLCAwKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCQlfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qKiBfX2IpCisgICAgICA6IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCwgX19iKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigqX19iLCBfX2IpIHsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbHVlLAorCQkJCV9fY29uc3RhbnRfaXRlcmF0b3JzLCBfX2NhY2hlPiYgX194KQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3guX01fY3VyX25vZGUsCisJCQkJCQkgIF9feC5fTV9jdXJfYnVja2V0KSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyX25vZGUtPl9NX3Y7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1cl9ub2RlLT5fTV92KTsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisKKyAgLy8gTWFueSBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3MgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcG9saWN5CisgIC8vIGNsYXNzZXMuICBUaGVzZSBhcmUgZGVmYXVsdHMgZm9yIHRoZSBwb2xpY2llcy4KKworICAvLyBEZWZhdWx0IHJhbmdlIGhhc2hpbmcgZnVuY3Rpb246IHVzZSBkaXZpc2lvbiB0byBmb2xkIGEgbGFyZ2UgbnVtYmVyCisgIC8vIGludG8gdGhlIHJhbmdlIFswLCBOKS4KKyAgc3RydWN0IF9Nb2RfcmFuZ2VfaGFzaGluZworICB7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBmaXJzdF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCByZXN1bHRfdHlwZTsKKworICAgIHJlc3VsdF90eXBlCisgICAgb3BlcmF0b3IoKShmaXJzdF9hcmd1bWVudF90eXBlIF9fbnVtLCBzZWNvbmRfYXJndW1lbnRfdHlwZSBfX2RlbikgY29uc3QKKyAgICB7IHJldHVybiBfX251bSAlIF9fZGVuOyB9CisgIH07CisKKyAgLy8gRGVmYXVsdCByYW5nZWQgaGFzaCBmdW5jdGlvbiBILiAgSW4gcHJpbmNpcGxlIGl0IHNob3VsZCBiZSBhCisgIC8vIGZ1bmN0aW9uIG9iamVjdCBjb21wb3NlZCBmcm9tIG9iamVjdHMgb2YgdHlwZSBIMSBhbmQgSDIgc3VjaCB0aGF0CisgIC8vIGgoaywgTikgPSBoMihoMShrKSwgTiksIGJ1dCB0aGF0IHdvdWxkIG1lYW4gbWFraW5nIGV4dHJhIGNvcGllcyBvZgorICAvLyBoMSBhbmQgaDIuICBTbyBpbnN0ZWFkIHdlJ2xsIGp1c3QgdXNlIGEgdGFnIHRvIHRlbGwgY2xhc3MgdGVtcGxhdGUKKyAgLy8gaGFzaHRhYmxlIHRvIGRvIHRoYXQgY29tcG9zaXRpb24uCisgIHN0cnVjdCBfRGVmYXVsdF9yYW5nZWRfaGFzaCB7IH07CisKKyAgLy8gRGVmYXVsdCB2YWx1ZSBmb3IgcmVoYXNoIHBvbGljeS4gIEJ1Y2tldCBzaXplIGlzICh1c3VhbGx5KSB0aGUKKyAgLy8gc21hbGxlc3QgcHJpbWUgdGhhdCBrZWVwcyB0aGUgbG9hZCBmYWN0b3Igc21hbGwgZW5vdWdoLgorICBzdHJ1Y3QgX1ByaW1lX3JlaGFzaF9wb2xpY3kKKyAgeworICAgIF9QcmltZV9yZWhhc2hfcG9saWN5KGZsb2F0IF9feiA9IDEuMCkKKyAgICA6IF9NX21heF9sb2FkX2ZhY3RvcihfX3opLCBfTV9ncm93dGhfZmFjdG9yKDIuZiksIF9NX25leHRfcmVzaXplKDApIHsgfQorCisgICAgZmxvYXQKKyAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX21heF9sb2FkX2ZhY3RvcjsgfQorCisgICAgLy8gUmV0dXJuIGEgYnVja2V0IHNpemUgbm8gc21hbGxlciB0aGFuIG4uCisgICAgc3RkOjpzaXplX3QKKyAgICBfTV9uZXh0X2JrdChzdGQ6OnNpemVfdCBfX24pIGNvbnN0OworCisgICAgLy8gUmV0dXJuIGEgYnVja2V0IGNvdW50IGFwcHJvcHJpYXRlIGZvciBuIGVsZW1lbnRzCisgICAgc3RkOjpzaXplX3QKKyAgICBfTV9ia3RfZm9yX2VsZW1lbnRzKHN0ZDo6c2l6ZV90IF9fbikgY29uc3Q7CisKKyAgICAvLyBfX25fYmt0IGlzIGN1cnJlbnQgYnVja2V0IGNvdW50LCBfX25fZWx0IGlzIGN1cnJlbnQgZWxlbWVudCBjb3VudCwKKyAgICAvLyBhbmQgX19uX2lucyBpcyBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgaW5zZXJ0ZWQuICBEbyB3ZSBuZWVkIHRvCisgICAgLy8gaW5jcmVhc2UgYnVja2V0IGNvdW50PyAgSWYgc28sIHJldHVybiBtYWtlX3BhaXIodHJ1ZSwgbiksIHdoZXJlIG4KKyAgICAvLyBpcyB0aGUgbmV3IGJ1Y2tldCBjb3VudC4gIElmIG5vdCwgcmV0dXJuIG1ha2VfcGFpcihmYWxzZSwgMCkuCisgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PgorICAgIF9NX25lZWRfcmVoYXNoKHN0ZDo6c2l6ZV90IF9fbl9ia3QsIHN0ZDo6c2l6ZV90IF9fbl9lbHQsCisJCSAgIHN0ZDo6c2l6ZV90IF9fbl9pbnMpIGNvbnN0OworCisgICAgZW51bSB7IF9TX25fcHJpbWVzID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICE9IDggPyAyNTYgOiAyNTYgKyA0OCB9OworCisgICAgZmxvYXQgICAgICAgICAgICAgICAgX01fbWF4X2xvYWRfZmFjdG9yOworICAgIGZsb2F0ICAgICAgICAgICAgICAgIF9NX2dyb3d0aF9mYWN0b3I7CisgICAgbXV0YWJsZSBzdGQ6OnNpemVfdCAgX01fbmV4dF9yZXNpemU7CisgIH07CisKKyAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgX19wcmltZV9saXN0W107CisKKyAgLy8gWFhYIFRoaXMgaXMgYSBoYWNrLiAgVGhlcmUncyBubyBnb29kIHJlYXNvbiBmb3IgYW55IG9mCisgIC8vIF9QcmltZV9yZWhhc2hfcG9saWN5J3MgbWVtYmVyIGZ1bmN0aW9ucyB0byBiZSBpbmxpbmUuCisKKyAgLy8gUmV0dXJuIGEgcHJpbWUgbm8gc21hbGxlciB0aGFuIG4uCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfUHJpbWVfcmVoYXNoX3BvbGljeTo6CisgIF9NX25leHRfYmt0KHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgeworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fcCA9IHN0ZDo6bG93ZXJfYm91bmQoX19wcmltZV9saXN0LCBfX3ByaW1lX2xpc3QKKwkJCQkJCSsgX1Nfbl9wcmltZXMsIF9fbik7CisgICAgX01fbmV4dF9yZXNpemUgPQorICAgICAgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KF9fYnVpbHRpbl9jZWlsKCpfX3AgKiBfTV9tYXhfbG9hZF9mYWN0b3IpKTsKKyAgICByZXR1cm4gKl9fcDsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgc21hbGxlc3QgcHJpbWUgcCBzdWNoIHRoYXQgYWxwaGEgcCA+PSBuLCB3aGVyZSBhbHBoYQorICAvLyBpcyB0aGUgbG9hZCBmYWN0b3IuCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfUHJpbWVfcmVoYXNoX3BvbGljeTo6CisgIF9NX2JrdF9mb3JfZWxlbWVudHMoc3RkOjpzaXplX3QgX19uKSBjb25zdAorICB7CisgICAgY29uc3QgZmxvYXQgX19taW5fYmt0cyA9IF9fbiAvIF9NX21heF9sb2FkX2ZhY3RvcjsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX3AgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fcHJpbWVfbGlzdCwgX19wcmltZV9saXN0CisJCQkJCQkrIF9TX25fcHJpbWVzLCBfX21pbl9ia3RzKTsKKyAgICBfTV9uZXh0X3Jlc2l6ZSA9CisgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oX19idWlsdGluX2NlaWwoKl9fcCAqIF9NX21heF9sb2FkX2ZhY3RvcikpOworICAgIHJldHVybiAqX19wOworICB9CisKKyAgLy8gRmluZHMgdGhlIHNtYWxsZXN0IHByaW1lIHAgc3VjaCB0aGF0IGFscGhhIHAgPiBfX25fZWx0ICsgX19uX2lucy4KKyAgLy8gSWYgcCA+IF9fbl9ia3QsIHJldHVybiBtYWtlX3BhaXIodHJ1ZSwgcCk7IG90aGVyd2lzZSByZXR1cm4KKyAgLy8gbWFrZV9wYWlyKGZhbHNlLCAwKS4gIEluIHByaW5jaXBsZSB0aGlzIGlzbid0IHZlcnkgZGlmZmVyZW50IGZyb20KKyAgLy8gX01fYmt0X2Zvcl9lbGVtZW50cy4KKworICAvLyBUaGUgb25seSB0cmlja3kgcGFydCBpcyB0aGF0IHdlJ3JlIGNhY2hpbmcgdGhlIGVsZW1lbnQgY291bnQgYXQKKyAgLy8gd2hpY2ggd2UgbmVlZCB0byByZWhhc2gsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYSBmbG9hdGluZy1wb2ludAorICAvLyBtdWx0aXBseSBmb3IgZXZlcnkgaW5zZXJ0aW9uLgorCisgIGlubGluZSBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+CisgIF9QcmltZV9yZWhhc2hfcG9saWN5OjoKKyAgX01fbmVlZF9yZWhhc2goc3RkOjpzaXplX3QgX19uX2JrdCwgc3RkOjpzaXplX3QgX19uX2VsdCwKKwkJIHN0ZDo6c2l6ZV90IF9fbl9pbnMpIGNvbnN0CisgIHsKKyAgICBpZiAoX19uX2VsdCArIF9fbl9pbnMgPiBfTV9uZXh0X3Jlc2l6ZSkKKyAgICAgIHsKKwlmbG9hdCBfX21pbl9ia3RzID0gKChmbG9hdChfX25faW5zKSArIGZsb2F0KF9fbl9lbHQpKQorCQkJICAgIC8gX01fbWF4X2xvYWRfZmFjdG9yKTsKKwlpZiAoX19taW5fYmt0cyA+IF9fbl9ia3QpCisJICB7CisJICAgIF9fbWluX2JrdHMgPSBzdGQ6Om1heChfX21pbl9ia3RzLCBfTV9ncm93dGhfZmFjdG9yICogX19uX2JrdCk7CisJICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fcCA9CisJICAgICAgc3RkOjpsb3dlcl9ib3VuZChfX3ByaW1lX2xpc3QsIF9fcHJpbWVfbGlzdCArIF9TX25fcHJpbWVzLAorCQkJICAgICAgIF9fbWluX2JrdHMpOworCSAgICBfTV9uZXh0X3Jlc2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PgorCSAgICAgIChfX2J1aWx0aW5fY2VpbCgqX19wICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisJICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCAqX19wKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9NX25leHRfcmVzaXplID0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+CisJICAgICAgKF9fYnVpbHRpbl9jZWlsKF9fbl9ia3QgKiBfTV9tYXhfbG9hZF9mYWN0b3IpKTsKKwkgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAwKTsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIDApOworICB9CisKKyAgLy8gQmFzZSBjbGFzc2VzIGZvciBzdGQ6Ol9IYXNodGFibGUuICBXZSBkZWZpbmUgdGhlc2UgYmFzZSBjbGFzc2VzCisgIC8vIGJlY2F1c2UgaW4gc29tZSBjYXNlcyB3ZSB3YW50IHRvIGRvIGRpZmZlcmVudCB0aGluZ3MgZGVwZW5kaW5nCisgIC8vIG9uIHRoZSB2YWx1ZSBvZiBhIHBvbGljeSBjbGFzcy4gIEluIHNvbWUgY2FzZXMgdGhlIHBvbGljeSBjbGFzcworICAvLyBhZmZlY3RzIHdoaWNoIG1lbWJlciBmdW5jdGlvbnMgYW5kIG5lc3RlZCB0eXBlZGVmcyBhcmUgZGVmaW5lZDsKKyAgLy8gd2UgaGFuZGxlIHRoYXQgYnkgc3BlY2lhbGl6aW5nIGJhc2UgY2xhc3MgdGVtcGxhdGVzLiAgU2V2ZXJhbCBvZgorICAvLyB0aGUgYmFzZSBjbGFzcyB0ZW1wbGF0ZXMgbmVlZCB0byBhY2Nlc3Mgb3RoZXIgbWVtYmVycyBvZiBjbGFzcworICAvLyB0ZW1wbGF0ZSBfSGFzaHRhYmxlLCBzbyB3ZSB1c2UgdGhlICJjdXJpb3VzbHkgcmVjdXJyaW5nIHRlbXBsYXRlCisgIC8vIHBhdHRlcm4iIGZvciB0aGVtLgorCisgIC8vIGNsYXNzIHRlbXBsYXRlIF9NYXBfYmFzZS4gIElmIHRoZSBoYXNodGFibGUgaGFzIGEgdmFsdWUgdHlwZSBvZgorICAvLyB0aGUgZm9ybSBwYWlyPFQxLCBUMj4gYW5kIGEga2V5IGV4dHJhY3Rpb24gcG9saWN5IHRoYXQgcmV0dXJucyB0aGUKKyAgLy8gZmlyc3QgcGFydCBvZiB0aGUgcGFpciwgdGhlIGhhc2h0YWJsZSBnZXRzIGEgbWFwcGVkX3R5cGUgdHlwZWRlZi4KKyAgLy8gSWYgaXQgc2F0aXNmaWVzIHRob3NlIGNyaXRlcmlhIGFuZCBhbHNvIGhhcyB1bmlxdWUga2V5cywgdGhlbiBpdAorICAvLyBhbHNvIGdldHMgYW4gb3BlcmF0b3JbXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfRXgsIGJvb2wgX191bmlxdWUsCisJICAgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX01hcF9iYXNlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LCBmYWxzZSwgX0hhc2h0YWJsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSBtYXBwZWRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4sIHRydWUsIF9IYXNodGFibGU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUgbWFwcGVkX3R5cGU7CisKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShjb25zdCBfS2V5JiBfX2spOworCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oX0tleSYmIF9fayk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDc2MS4gdW5vcmRlcmVkX21hcCBuZWVkcyBhbiBhdCgpIG1lbWJlciBmdW5jdGlvbi4KKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3QgX0tleSYgX19rKTsKKworICAgICAgY29uc3QgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBfS2V5JiBfX2spIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgdHlwZW5hbWUgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LAorCQkgICAgICAgdHJ1ZSwgX0hhc2h0YWJsZT46Om1hcHBlZF90eXBlJgorICAgIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwgdHJ1ZSwgX0hhc2h0YWJsZT46OgorICAgIG9wZXJhdG9yW10oY29uc3QgX0tleSYgX19rKQorICAgIHsKKyAgICAgIF9IYXNodGFibGUqIF9faCA9IHN0YXRpY19jYXN0PF9IYXNodGFibGUqPih0aGlzKTsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSBfX2gtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX19oLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsCisJCQkJCSAgICAgX19oLT5fTV9idWNrZXRfY291bnQpOworCisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfTm9kZSogX19wID0KKwlfX2gtPl9NX2ZpbmRfbm9kZShfX2gtPl9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworICAgICAgaWYgKCFfX3ApCisJcmV0dXJuIF9faC0+X01faW5zZXJ0X2J1Y2tldChzdGQ6Om1ha2VfcGFpcihfX2ssIG1hcHBlZF90eXBlKCkpLAorCQkJCSAgICAgX19uLCBfX2NvZGUpLT5zZWNvbmQ7CisgICAgICByZXR1cm4gKF9fcC0+X01fdikuc2Vjb25kOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICB0eXBlbmFtZSBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4sCisJCSAgICAgICB0cnVlLCBfSGFzaHRhYmxlPjo6bWFwcGVkX3R5cGUmCisgICAgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LCB0cnVlLCBfSGFzaHRhYmxlPjo6CisgICAgb3BlcmF0b3JbXShfS2V5JiYgX19rKQorICAgIHsKKyAgICAgIF9IYXNodGFibGUqIF9faCA9IHN0YXRpY19jYXN0PF9IYXNodGFibGUqPih0aGlzKTsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSBfX2gtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gX19oLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsCisJCQkJCSAgICAgX19oLT5fTV9idWNrZXRfY291bnQpOworCisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfTm9kZSogX19wID0KKwlfX2gtPl9NX2ZpbmRfbm9kZShfX2gtPl9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworICAgICAgaWYgKCFfX3ApCisJcmV0dXJuIF9faC0+X01faW5zZXJ0X2J1Y2tldChzdGQ6Om1ha2VfcGFpcihzdGQ6Om1vdmUoX19rKSwKKwkJCQkJCSAgICBtYXBwZWRfdHlwZSgpKSwKKwkJCQkgICAgIF9fbiwgX19jb2RlKS0+c2Vjb25kOworICAgICAgcmV0dXJuIChfX3AtPl9NX3YpLnNlY29uZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgdHlwZW5hbWUgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LAorCQkgICAgICAgdHJ1ZSwgX0hhc2h0YWJsZT46Om1hcHBlZF90eXBlJgorICAgIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwgdHJ1ZSwgX0hhc2h0YWJsZT46OgorICAgIGF0KGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICBfSGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxfSGFzaHRhYmxlKj4odGhpcyk7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLAorCQkJCQkgICAgIF9faC0+X01fYnVja2V0X2NvdW50KTsKKworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X05vZGUqIF9fcCA9CisJX19oLT5fTV9maW5kX25vZGUoX19oLT5fTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19wKQorCV9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX01hcF9iYXNlOjphdCIpKTsKKyAgICAgIHJldHVybiAoX19wLT5fTV92KS5zZWNvbmQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIGNvbnN0IHR5cGVuYW1lIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwKKwkJCSAgICAgdHJ1ZSwgX0hhc2h0YWJsZT46Om1hcHBlZF90eXBlJgorICAgIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwgdHJ1ZSwgX0hhc2h0YWJsZT46OgorICAgIGF0KGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfSGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxjb25zdCBfSGFzaHRhYmxlKj4odGhpcyk7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLAorCQkJCQkgICAgIF9faC0+X01fYnVja2V0X2NvdW50KTsKKworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X05vZGUqIF9fcCA9CisJX19oLT5fTV9maW5kX25vZGUoX19oLT5fTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19wKQorCV9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX01hcF9iYXNlOjphdCIpKTsKKyAgICAgIHJldHVybiAoX19wLT5fTV92KS5zZWNvbmQ7CisgICAgfQorCisgIC8vIGNsYXNzIHRlbXBsYXRlIF9SZWhhc2hfYmFzZS4gIEdpdmUgaGFzaHRhYmxlIHRoZSBtYXhfbG9hZF9mYWN0b3IKKyAgLy8gZnVuY3Rpb25zIGFuZCByZXNlcnZlIGlmZiB0aGUgcmVoYXNoIHBvbGljeSBpcyBfUHJpbWVfcmVoYXNoX3BvbGljeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlaGFzaFBvbGljeSwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX1JlaGFzaF9iYXNlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfUmVoYXNoX2Jhc2U8X1ByaW1lX3JlaGFzaF9wb2xpY3ksIF9IYXNodGFibGU+CisgICAgeworICAgICAgZmxvYXQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcigpIGNvbnN0CisgICAgICB7CisJY29uc3QgX0hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8Y29uc3QgX0hhc2h0YWJsZSo+KHRoaXMpOworCXJldHVybiBfX3RoaXMtPl9fcmVoYXNoX3BvbGljeSgpLm1heF9sb2FkX2ZhY3RvcigpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBtYXhfbG9hZF9mYWN0b3IoZmxvYXQgX196KQorICAgICAgeworCV9IYXNodGFibGUqIF9fdGhpcyA9IHN0YXRpY19jYXN0PF9IYXNodGFibGUqPih0aGlzKTsKKwlfX3RoaXMtPl9fcmVoYXNoX3BvbGljeShfUHJpbWVfcmVoYXNoX3BvbGljeShfX3opKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzdGQ6OnNpemVfdCBfX24pCisgICAgICB7CisJX0hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8X0hhc2h0YWJsZSo+KHRoaXMpOworCV9fdGhpcy0+cmVoYXNoKF9fYnVpbHRpbl9jZWlsKF9fbiAvIG1heF9sb2FkX2ZhY3RvcigpKSk7CisgICAgICB9CisgICAgfTsKKworICAvLyBDbGFzcyB0ZW1wbGF0ZSBfSGFzaF9jb2RlX2Jhc2UuICBFbmNhcHN1bGF0ZXMgdHdvIHBvbGljeSBpc3N1ZXMgdGhhdAorICAvLyBhcmVuJ3QgcXVpdGUgb3J0aG9nb25hbC4KKyAgLy8gICAoMSkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2luZyBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uIGFuZCB1c2luZworICAvLyAgICAgICB0aGUgY29tYmluYXRpb24gb2YgYSBoYXNoIGZ1bmN0aW9uIGFuZCBhIHJhbmdlLWhhc2hpbmcgZnVuY3Rpb24uCisgIC8vICAgICAgIEluIHRoZSBmb3JtZXIgY2FzZSB3ZSBkb24ndCBoYXZlIHN1Y2ggdGhpbmdzIGFzIGhhc2ggY29kZXMsIHNvCisgIC8vICAgICAgIHdlIGhhdmUgYSBkdW1teSB0eXBlIGFzIHBsYWNlaG9sZGVyLgorICAvLyAgICgyKSBXaGV0aGVyIG9yIG5vdCB3ZSBjYWNoZSBoYXNoIGNvZGVzLiAgQ2FjaGluZyBoYXNoIGNvZGVzIGlzCisgIC8vICAgICAgIG1lYW5pbmdsZXNzIGlmIHdlIGhhdmUgYSByYW5nZWQgaGFzaCBmdW5jdGlvbi4KKyAgLy8gV2UgYWxzbyBwdXQgdGhlIGtleSBleHRyYWN0aW9uIGFuZCBlcXVhbGl0eSBjb21wYXJpc29uIGZ1bmN0aW9uCisgIC8vIG9iamVjdHMgaGVyZSwgZm9yIGNvbnZlbmllbmNlLgorCisgIC8vIFByaW1hcnkgdGVtcGxhdGU6IHVudXNlZCBleGNlcHQgYXMgYSBob29rIGZvciBzcGVjaWFsaXphdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U7CisKKyAgLy8gU3BlY2lhbGl6YXRpb246IHJhbmdlZCBoYXNoIGZ1bmN0aW9uLCBubyBjYWNoaW5nIGhhc2ggY29kZXMuICBIMQorICAvLyBhbmQgSDIgYXJlIHByb3ZpZGVkIGJ1dCBpZ25vcmVkLiAgV2UgZGVmaW5lIGEgZHVtbXkgaGFzaCBjb2RlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsCisJCQkgICBfSGFzaCwgZmFsc2U+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYgX19oKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01fcmFuZ2VkX2hhc2goX19oKSB7IH0KKworICAgICAgdHlwZWRlZiB2b2lkKiBfSGFzaF9jb2RlX3R5cGU7CisKKyAgICAgIF9IYXNoX2NvZGVfdHlwZQorICAgICAgX01faGFzaF9jb2RlKGNvbnN0IF9LZXkmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9LZXkmIF9faywgX0hhc2hfY29kZV90eXBlLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yYW5nZWRfaGFzaChfX2ssIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JhbmdlZF9oYXNoKF9NX2V4dHJhY3QoX19wLT5fTV92KSwgX19uKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9LZXkmIF9faywgX0hhc2hfY29kZV90eXBlLAorCQkgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXEoX19rLCBfTV9leHRyYWN0KF9fbi0+X01fdikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiosIF9IYXNoX2NvZGVfdHlwZSkgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiosCisJCSAgIGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qKSBjb25zdAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX0hhc2hfY29kZV9iYXNlJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2V4dHJhY3QsIF9feC5fTV9leHRyYWN0KTsKKwlzdGQ6OnN3YXAoX01fZXEsIF9feC5fTV9lcSk7CisJc3RkOjpzd2FwKF9NX3JhbmdlZF9oYXNoLCBfX3guX01fcmFuZ2VkX2hhc2gpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0V4dHJhY3RLZXkgIF9NX2V4dHJhY3Q7CisgICAgICBfRXF1YWwgICAgICAgX01fZXE7CisgICAgICBfSGFzaCAgICAgICAgX01fcmFuZ2VkX2hhc2g7CisgICAgfTsKKworCisgIC8vIE5vIHNwZWNpYWxpemF0aW9uIGZvciByYW5nZWQgaGFzaCBmdW5jdGlvbiB3aGlsZSBjYWNoaW5nIGhhc2ggY29kZXMuCisgIC8vIFRoYXQgY29tYmluYXRpb24gaXMgbWVhbmluZ2xlc3MsIGFuZCB0cnlpbmcgdG8gZG8gaXQgaXMgYW4gZXJyb3IuCisKKworICAvLyBTcGVjaWFsaXphdGlvbjogcmFuZ2VkIGhhc2ggZnVuY3Rpb24sIGNhY2hlIGhhc2ggY29kZXMuICBUaGlzCisgIC8vIGNvbWJpbmF0aW9uIGlzIG1lYW5pbmdsZXNzLCBzbyB3ZSBwcm92aWRlIG9ubHkgYSBkZWNsYXJhdGlvbgorICAvLyBhbmQgbm8gZGVmaW5pdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsIF9IMiwKKwkJCSAgIF9IYXNoLCB0cnVlPjsKKworICAvLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwgbm8KKyAgLy8gY2FjaGluZyBvZiBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IFRSMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDI+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLAorCQkJICAgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0gxIGhhc2hlcjsKKworICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0aW9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gxOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSGFzaF9jb2RlX2Jhc2UoY29uc3QgX0V4dHJhY3RLZXkmIF9fZXgsIGNvbnN0IF9FcXVhbCYgX19lcSwKKwkJICAgICAgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsCisJCSAgICAgIGNvbnN0IF9EZWZhdWx0X3JhbmdlZF9oYXNoJikKKyAgICAgIDogX01fZXh0cmFjdChfX2V4KSwgX01fZXEoX19lcSksIF9NX2gxKF9faDEpLCBfTV9oMihfX2gyKSB7IH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBfSGFzaF9jb2RlX3R5cGU7CisKKyAgICAgIF9IYXNoX2NvZGVfdHlwZQorICAgICAgX01faGFzaF9jb2RlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gxKF9fayk7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiwgX0hhc2hfY29kZV90eXBlIF9fYywKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoX19jLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19wLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMihfTV9oMShfTV9leHRyYWN0KF9fcC0+X01fdikpLCBfX24pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX0tleSYgX19rLCBfSGFzaF9jb2RlX3R5cGUsCisJCSBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9lcShfX2ssIF9NX2V4dHJhY3QoX19uLT5fTV92KSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3RvcmVfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiwgX0hhc2hfY29kZV90eXBlKSBjb25zdAorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvcHlfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiwKKwkJICAgY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiopIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfSGFzaF9jb2RlX2Jhc2UmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZXh0cmFjdCwgX194Ll9NX2V4dHJhY3QpOworCXN0ZDo6c3dhcChfTV9lcSwgX194Ll9NX2VxKTsKKwlzdGQ6OnN3YXAoX01faDEsIF9feC5fTV9oMSk7CisJc3RkOjpzd2FwKF9NX2gyLCBfX3guX01faDIpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0V4dHJhY3RLZXkgIF9NX2V4dHJhY3Q7CisgICAgICBfRXF1YWwgICAgICAgX01fZXE7CisgICAgICBfSDEgICAgICAgICAgX01faDE7CisgICAgICBfSDIgICAgICAgICAgX01faDI7CisgICAgfTsKKworICAvLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwKKyAgLy8gY2FjaGluZyBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IFRSMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDI+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLAorCQkJICAgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBfSDEgaGFzaGVyOworCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDE7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwKKwkJICAgICAgY29uc3QgX0RlZmF1bHRfcmFuZ2VkX2hhc2gmKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01faDEoX19oMSksIF9NX2gyKF9faDIpIHsgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IF9IYXNoX2NvZGVfdHlwZTsKKworICAgICAgX0hhc2hfY29kZV90eXBlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoX19rKTsgfQorCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9LZXkmLCBfSGFzaF9jb2RlX3R5cGUgX19jLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMihfX2MsIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fcCwKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoX19wLT5fTV9oYXNoX2NvZGUsIF9fbik7IH0KKworICAgICAgYm9vbAorICAgICAgX01fY29tcGFyZShjb25zdCBfS2V5JiBfX2ssIF9IYXNoX2NvZGVfdHlwZSBfX2MsCisJCSBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYyA9PSBfX24tPl9NX2hhc2hfY29kZSAmJiBfTV9lcShfX2ssIF9NX2V4dHJhY3QoX19uLT5fTV92KSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc3RvcmVfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fbiwgX0hhc2hfY29kZV90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgX19uLT5fTV9oYXNoX2NvZGUgPSBfX2M7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY29weV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX190bywKKwkJICAgY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX2Zyb20pIGNvbnN0CisgICAgICB7IF9fdG8tPl9NX2hhc2hfY29kZSA9IF9fZnJvbS0+X01faGFzaF9jb2RlOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX0hhc2hfY29kZV9iYXNlJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2V4dHJhY3QsIF9feC5fTV9leHRyYWN0KTsKKwlzdGQ6OnN3YXAoX01fZXEsIF9feC5fTV9lcSk7CisJc3RkOjpzd2FwKF9NX2gxLCBfX3guX01faDEpOworCXN0ZDo6c3dhcChfTV9oMiwgX194Ll9NX2gyKTsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9FeHRyYWN0S2V5ICBfTV9leHRyYWN0OworICAgICAgX0VxdWFsICAgICAgIF9NX2VxOworICAgICAgX0gxICAgICAgICAgIF9NX2gxOworICAgICAgX0gyICAgICAgICAgIF9NX2gyOworICAgIH07CisKKworICAvLyBDbGFzcyB0ZW1wbGF0ZSBfRXF1YWxpdHlfYmFzZS4gIFRoaXMgaXMgZm9yIGltcGxlbWVudGluZyBlcXVhbGl0eQorICAvLyBjb21wYXJpc29uIGZvciB1bm9yZGVyZWQgY29udGFpbmVycywgcGVyIE4zMDY4LCBieSBKb2huIExha29zIGFuZAorICAvLyBQYWJsbyBIYWxwZXJuLiAgQWxnb3JpdGhtaWNhbGx5LCB3ZSBmb2xsb3cgY2xvc2VseSB0aGUgcmVmZXJlbmNlCisgIC8vIGltcGxlbWVudGF0aW9ucyB0aGVyZWluLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXh0cmFjdEtleSwgYm9vbCBfX3VuaXF1ZV9rZXlzLAorCSAgIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9FcXVhbGl0eV9iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfRXF1YWxpdHlfYmFzZTxfRXh0cmFjdEtleSwgdHJ1ZSwgX0hhc2h0YWJsZT4KKyAgICB7CisgICAgICBib29sIF9NX2VxdWFsKGNvbnN0IF9IYXNodGFibGUmKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIGJvb2wKKyAgICBfRXF1YWxpdHlfYmFzZTxfRXh0cmFjdEtleSwgdHJ1ZSwgX0hhc2h0YWJsZT46OgorICAgIF9NX2VxdWFsKGNvbnN0IF9IYXNodGFibGUmIF9fb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgX0hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8Y29uc3QgX0hhc2h0YWJsZSo+KHRoaXMpOworCisgICAgICBpZiAoX190aGlzLT5zaXplKCkgIT0gX19vdGhlci5zaXplKCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKGF1dG8gX19pdHggPSBfX3RoaXMtPmJlZ2luKCk7IF9faXR4ICE9IF9fdGhpcy0+ZW5kKCk7ICsrX19pdHgpCisJeworCSAgY29uc3QgYXV0byBfX2l0eSA9IF9fb3RoZXIuZmluZChfRXh0cmFjdEtleSgpKCpfX2l0eCkpOworCSAgaWYgKF9faXR5ID09IF9fb3RoZXIuZW5kKCkgfHwgKl9faXR5ICE9ICpfX2l0eCkKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX0VxdWFsaXR5X2Jhc2U8X0V4dHJhY3RLZXksIGZhbHNlLCBfSGFzaHRhYmxlPgorICAgIHsKKyAgICAgIGJvb2wgX01fZXF1YWwoY29uc3QgX0hhc2h0YWJsZSYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VaXRlcmF0b3I+CisJc3RhdGljIGJvb2wKKwlfU19pc19wZXJtdXRhdGlvbihfVWl0ZXJhdG9yLCBfVWl0ZXJhdG9yLCBfVWl0ZXJhdG9yKTsKKyAgICB9OworCisgIC8vIFNlZSBzdGQ6OmlzX3Blcm11dGF0aW9uIGluIE4zMDY4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVWl0ZXJhdG9yPgorICAgICAgYm9vbAorICAgICAgX0VxdWFsaXR5X2Jhc2U8X0V4dHJhY3RLZXksIGZhbHNlLCBfSGFzaHRhYmxlPjo6CisgICAgICBfU19pc19wZXJtdXRhdGlvbihfVWl0ZXJhdG9yIF9fZmlyc3QxLCBfVWl0ZXJhdG9yIF9fbGFzdDEsCisJCQlfVWl0ZXJhdG9yIF9fZmlyc3QyKQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCSAgaWYgKCEoKl9fZmlyc3QxID09ICpfX2ZpcnN0MikpCisJICAgIGJyZWFrOworCisJaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJICByZXR1cm4gdHJ1ZTsKKworCV9VaXRlcmF0b3IgX19sYXN0MiA9IF9fZmlyc3QyOworCXN0ZDo6YWR2YW5jZShfX2xhc3QyLCBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QxLCBfX2xhc3QxKSk7CisKKwlmb3IgKF9VaXRlcmF0b3IgX19pdDEgPSBfX2ZpcnN0MTsgX19pdDEgIT0gX19sYXN0MTsgKytfX2l0MSkKKwkgIHsKKwkgICAgX1VpdGVyYXRvciBfX3RtcCA9ICBfX2ZpcnN0MTsKKwkgICAgd2hpbGUgKF9fdG1wICE9IF9faXQxICYmICEoKl9fdG1wID09ICpfX2l0MSkpCisJICAgICAgKytfX3RtcDsKKworCSAgICAvLyBXZSd2ZSBzZWVuIHRoaXMgb25lIGJlZm9yZS4KKwkgICAgaWYgKF9fdG1wICE9IF9faXQxKQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIHN0ZDo6cHRyZGlmZl90IF9fbjIgPSAwOworCSAgICBmb3IgKF9fdG1wID0gX19maXJzdDI7IF9fdG1wICE9IF9fbGFzdDI7ICsrX190bXApCisJICAgICAgaWYgKCpfX3RtcCA9PSAqX19pdDEpCisJCSsrX19uMjsKKworCSAgICBpZiAoIV9fbjIpCisJICAgICAgcmV0dXJuIGZhbHNlOworCisJICAgIHN0ZDo6cHRyZGlmZl90IF9fbjEgPSAwOworCSAgICBmb3IgKF9fdG1wID0gX19pdDE7IF9fdG1wICE9IF9fbGFzdDE7ICsrX190bXApCisJICAgICAgaWYgKCpfX3RtcCA9PSAqX19pdDEpCisJCSsrX19uMTsKKworCSAgICBpZiAoX19uMSAhPSBfX24yKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBib29sCisgICAgX0VxdWFsaXR5X2Jhc2U8X0V4dHJhY3RLZXksIGZhbHNlLCBfSGFzaHRhYmxlPjo6CisgICAgX01fZXF1YWwoY29uc3QgX0hhc2h0YWJsZSYgX19vdGhlcikgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfSGFzaHRhYmxlKiBfX3RoaXMgPSBzdGF0aWNfY2FzdDxjb25zdCBfSGFzaHRhYmxlKj4odGhpcyk7CisKKyAgICAgIGlmIChfX3RoaXMtPnNpemUoKSAhPSBfX290aGVyLnNpemUoKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoYXV0byBfX2l0eCA9IF9fdGhpcy0+YmVnaW4oKTsgX19pdHggIT0gX190aGlzLT5lbmQoKTspCisJeworCSAgY29uc3QgYXV0byBfX3hyYW5nZSA9IF9fdGhpcy0+ZXF1YWxfcmFuZ2UoX0V4dHJhY3RLZXkoKSgqX19pdHgpKTsKKwkgIGNvbnN0IGF1dG8gX195cmFuZ2UgPSBfX290aGVyLmVxdWFsX3JhbmdlKF9FeHRyYWN0S2V5KCkoKl9faXR4KSk7CisKKwkgIGlmIChzdGQ6OmRpc3RhbmNlKF9feHJhbmdlLmZpcnN0LCBfX3hyYW5nZS5zZWNvbmQpCisJICAgICAgIT0gc3RkOjpkaXN0YW5jZShfX3lyYW5nZS5maXJzdCwgX195cmFuZ2Uuc2Vjb25kKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAoIV9TX2lzX3Blcm11dGF0aW9uKF9feHJhbmdlLmZpcnN0LAorCQkJCSBfX3hyYW5nZS5zZWNvbmQsCisJCQkJIF9feXJhbmdlLmZpcnN0KSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBfX2l0eCA9IF9feHJhbmdlLnNlY29uZDsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0hBU0hUQUJMRV9QT0xJQ1lfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2luZGlyZWN0X2FycmF5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvaW5kaXJlY3RfYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2I3YjA4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2luZGlyZWN0X2FycmF5LmgKQEAgLTAsMCArMSwyMTMgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGluZGlyZWN0X2FycmF5IGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDksIDIwMTAKKy8vICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9pbmRpcmVjdF9hcnJheS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQERQVE1hdGhzLkVOUy1DYWNoYW4uRnI+CisKKyNpZm5kZWYgX0lORElSRUNUX0FSUkFZX0gKKyNkZWZpbmUgX0lORElSRUNUX0FSUkFZX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgbnVtZXJpY19hcnJheXMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlZmVyZW5jZSB0byBhcmJpdHJhcnkgc3Vic2V0IG9mIGFuIGFycmF5LgorICAgKgorICAgKiAgQW4gaW5kaXJlY3RfYXJyYXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheQorICAgKiAgc3BlY2lmaWVkIGJ5IGFuIG9yZGVyZWQgYXJyYXkgb2YgaW5kaWNlcy4gIFRoZSB3YXkgdG8gZ2V0IGFuCisgICAqICBpbmRpcmVjdF9hcnJheSBpcyB0byBjYWxsIG9wZXJhdG9yW10odmFsYXJyYXk8c2l6ZV90Pikgb24gYSB2YWxhcnJheS4KKyAgICogIFRoZSByZXR1cm5lZCBpbmRpcmVjdF9hcnJheSB0aGVuIHBlcm1pdHMgY2Fycnlpbmcgb3BlcmF0aW9ucyBvdXQgb24gdGhlCisgICAqICByZWZlcmVuY2VkIHN1YnNldCBvZiBlbGVtZW50cyBpbiB0aGUgb3JpZ2luYWwgdmFsYXJyYXkuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgaWYgYW4gaW5kaXJlY3RfYXJyYXkgaXMgb2J0YWluZWQgdXNpbmcgdGhlIGFycmF5ICg0LDIsMCkgYXMKKyAgICogIGFuIGFyZ3VtZW50LCBhbmQgdGhlbiBhc3NpZ25lZCB0byBhbiBhcnJheSBjb250YWluaW5nICgxLDIsMyksIHRoZW4gdGhlCisgICAqICB1bmRlcmx5aW5nIGFycmF5IHdpbGwgaGF2ZSBhcnJheVswXT09MywgYXJyYXlbMl09PTIsIGFuZCBhcnJheVs0XT09MS4KKyAgICoKKyAgICogIEBwYXJhbSAgVHAgIEVsZW1lbnQgdHlwZS4KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgY2xhc3MgaW5kaXJlY3RfYXJyYXkKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUzLiB2YWxhcnJheSBoZWxwZXIgZnVuY3Rpb25zIGFyZSBhbG1vc3QgZW50aXJlbHkgdXNlbGVzcworCisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuICBCb3RoIHNsaWNlcyByZWZlciB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGFycmF5LgorICAgICAgaW5kaXJlY3RfYXJyYXkoY29uc3QgaW5kaXJlY3RfYXJyYXkmKTsKKworICAgICAgLy8vICBBc3NpZ25tZW50IG9wZXJhdG9yLiAgQXNzaWducyBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nIGVsZW1lbnRzCisgICAgICAvLy8gIG9mIEBhIGEuCisgICAgICBpbmRpcmVjdF9hcnJheSYgb3BlcmF0b3I9KGNvbnN0IGluZGlyZWN0X2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWduIHNsaWNlIGVsZW1lbnRzIHRvIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTXVsdGlwbHkgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcio9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgRGl2aWRlIHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE1vZHVsbyBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yJT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gc2xpY2UgZWxlbWVudHMuCisgICAgICB2b2lkIG9wZXJhdG9yLT0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIHhvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgYW5kIHNsaWNlIGVsZW1lbnRzIHdpdGggY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCBvciBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExlZnQgc2hpZnQgc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I+Pj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBBc3NpZ24gYWxsIHNsaWNlIGVsZW1lbnRzIHRvIEBhIHQuCisgICAgICB2b2lkIG9wZXJhdG9yPSAoY29uc3QgX1RwJikgY29uc3Q7CisgICAgICAvLyAgICB+aW5kaXJlY3RfYXJyYXkoKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yKj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcl49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICB2b2lkIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcjw8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgdm9pZCBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLiAgQm90aCBzbGljZXMgcmVmZXIgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBhcnJheS4KKyAgICAgIGluZGlyZWN0X2FycmF5KF9BcnJheTxfVHA+LCBzaXplX3QsIF9BcnJheTxzaXplX3Q+KTsKKworICAgICAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CisgICAgICBmcmllbmQgY2xhc3MgZ3NsaWNlX2FycmF5PF9UcD47CisKKyAgICAgIGNvbnN0IHNpemVfdAkgX01fc3o7CisgICAgICBjb25zdCBfQXJyYXk8c2l6ZV90PiBfTV9pbmRleDsKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+CSBfTV9hcnJheTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBpbmRpcmVjdF9hcnJheSgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIGluZGlyZWN0X2FycmF5PF9UcD46OmluZGlyZWN0X2FycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9fYSkKKyAgICA6IF9NX3N6KF9fYS5fTV9zeiksIF9NX2luZGV4KF9fYS5fTV9pbmRleCksIF9NX2FycmF5KF9fYS5fTV9hcnJheSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6aW5kaXJlY3RfYXJyYXkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19zLAorCQkJCQlfQXJyYXk8c2l6ZV90PiBfX2kpCisgICAgOiBfTV9zeihfX3MpLCBfTV9pbmRleChfX2kpLCBfTV9hcnJheShfX2EpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBpbmRpcmVjdF9hcnJheTxfVHA+JgorICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBpbmRpcmVjdF9hcnJheTxfVHA+JiBfX2EpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2FycmF5LCBfTV9zeiwgX19hLl9NX2luZGV4LCBfTV9hcnJheSwKKwkJCSAgIF9NX2luZGV4KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX01fYXJyYXksIF9NX2luZGV4LCBfTV9zeiwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPihfX3YpLCBfTV9zeiwgX01fYXJyYXksIF9NX2luZGV4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluZGlyZWN0X2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpIGNvbnN0CisgICAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fZSwgX01fc3osIF9NX2FycmF5LCBfTV9pbmRleCk7IH0KKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUihfT3AsIF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBpbmRpcmVjdF9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdFwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9pbmRleCwgX0FycmF5PF9UcD4oX192KSwgX01fc3opOyBcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgkJCQkgICAgICAgICAgICAgICAgXAorICAgICAgaW5saW5lIHZvaWQJCQkJCQkJXAorICAgICAgaW5kaXJlY3RfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYgX19lKSBjb25zdFwKKyAgICAgIHsJCQkJCQkJCQlcCisJX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9pbmRleCwgX19lLCBfTV9zeik7CVwKKyAgICAgIH0KKworX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0lORElSRUNUX0FSUkFZX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9pb3NfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2lvc19iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyNTY1NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9pb3NfYmFzZS5oCkBAIC0wLDAgKzEsOTc3IEBACisvLyBJb3N0cmVhbXMgYmFzZSBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2lvc19iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjQgIElvc3RyZWFtcyBiYXNlIGNsYXNzZXMKKy8vCisKKyNpZm5kZWYgX0lPU19CQVNFX0gKKyNkZWZpbmUgX0lPU19CQVNFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9jbGFzc2VzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIG9mIGJpdG1hc2sgdHlwZXMgYXJlIGVudW1zLCBub3QgaW50cywKKyAgLy8gYXMgcGVybWl0dGVkIChidXQgbm90IHJlcXVpcmVkKSBpbiB0aGUgc3RhbmRhcmQsIGluIG9yZGVyIHRvIHByb3ZpZGUKKyAgLy8gYmV0dGVyIHR5cGUgc2FmZXR5IGluIGlvc3RyZWFtIGNhbGxzLiAgQSBzaWRlIGVmZmVjdCBpcyB0aGF0CisgIC8vIGV4cHJlc3Npb25zIGludm9sdmluZyB0aGVtIGFyZSBubyBsb25nZXIgY29tcGlsZS10aW1lIGNvbnN0YW50cy4KKyAgZW51bSBfSW9zX0ZtdGZsYWdzIAorICAgIHsgCisgICAgICBfU19ib29sYWxwaGEgCT0gMUwgPDwgMCwKKyAgICAgIF9TX2RlYyAJCT0gMUwgPDwgMSwKKyAgICAgIF9TX2ZpeGVkIAkJPSAxTCA8PCAyLAorICAgICAgX1NfaGV4IAkJPSAxTCA8PCAzLAorICAgICAgX1NfaW50ZXJuYWwgCT0gMUwgPDwgNCwKKyAgICAgIF9TX2xlZnQgCQk9IDFMIDw8IDUsCisgICAgICBfU19vY3QgCQk9IDFMIDw8IDYsCisgICAgICBfU19yaWdodCAJCT0gMUwgPDwgNywKKyAgICAgIF9TX3NjaWVudGlmaWMgCT0gMUwgPDwgOCwKKyAgICAgIF9TX3Nob3diYXNlIAk9IDFMIDw8IDksCisgICAgICBfU19zaG93cG9pbnQgCT0gMUwgPDwgMTAsCisgICAgICBfU19zaG93cG9zIAk9IDFMIDw8IDExLAorICAgICAgX1Nfc2tpcHdzIAk9IDFMIDw8IDEyLAorICAgICAgX1NfdW5pdGJ1ZiAJPSAxTCA8PCAxMywKKyAgICAgIF9TX3VwcGVyY2FzZSAJPSAxTCA8PCAxNCwKKyAgICAgIF9TX2FkanVzdGZpZWxkIAk9IF9TX2xlZnQgfCBfU19yaWdodCB8IF9TX2ludGVybmFsLAorICAgICAgX1NfYmFzZWZpZWxkIAk9IF9TX2RlYyB8IF9TX29jdCB8IF9TX2hleCwKKyAgICAgIF9TX2Zsb2F0ZmllbGQgCT0gX1Nfc2NpZW50aWZpYyB8IF9TX2ZpeGVkLAorICAgICAgX1NfaW9zX2ZtdGZsYWdzX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0ZtdGZsYWdzCisgIG9wZXJhdG9yJihfSW9zX0ZtdGZsYWdzIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfRm10ZmxhZ3Moc3RhdGljX2Nhc3Q8aW50PihfX2EpICYgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgX0lvc19GbXRmbGFncworICBvcGVyYXRvcnwoX0lvc19GbXRmbGFncyBfX2EsIF9Jb3NfRm10ZmxhZ3MgX19iKQorICB7IHJldHVybiBfSW9zX0ZtdGZsYWdzKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfRm10ZmxhZ3MKKyAgb3BlcmF0b3JeKF9Jb3NfRm10ZmxhZ3MgX19hLCBfSW9zX0ZtdGZsYWdzIF9fYikKKyAgeyByZXR1cm4gX0lvc19GbXRmbGFncyhzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0ZtdGZsYWdzCisgIG9wZXJhdG9yfihfSW9zX0ZtdGZsYWdzIF9fYSkKKyAgeyByZXR1cm4gX0lvc19GbXRmbGFncyh+c3RhdGljX2Nhc3Q8aW50PihfX2EpKTsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0ZtdGZsYWdzJgorICBvcGVyYXRvcnw9KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0ZtdGZsYWdzJgorICBvcGVyYXRvciY9KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSAmIF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0ZtdGZsYWdzJgorICBvcGVyYXRvcl49KF9Jb3NfRm10ZmxhZ3MmIF9fYSwgX0lvc19GbXRmbGFncyBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSBeIF9fYjsgfQorCisKKyAgZW51bSBfSW9zX09wZW5tb2RlIAorICAgIHsgCisgICAgICBfU19hcHAgCQk9IDFMIDw8IDAsCisgICAgICBfU19hdGUgCQk9IDFMIDw8IDEsCisgICAgICBfU19iaW4gCQk9IDFMIDw8IDIsCisgICAgICBfU19pbiAJCT0gMUwgPDwgMywKKyAgICAgIF9TX291dCAJCT0gMUwgPDwgNCwKKyAgICAgIF9TX3RydW5jIAkJPSAxTCA8PCA1LAorICAgICAgX1NfaW9zX29wZW5tb2RlX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX09wZW5tb2RlCisgIG9wZXJhdG9yJihfSW9zX09wZW5tb2RlIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfT3Blbm1vZGUoc3RhdGljX2Nhc3Q8aW50PihfX2EpICYgc3RhdGljX2Nhc3Q8aW50PihfX2IpKTsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgX0lvc19PcGVubW9kZQorICBvcGVyYXRvcnwoX0lvc19PcGVubW9kZSBfX2EsIF9Jb3NfT3Blbm1vZGUgX19iKQorICB7IHJldHVybiBfSW9zX09wZW5tb2RlKHN0YXRpY19jYXN0PGludD4oX19hKSB8IHN0YXRpY19jYXN0PGludD4oX19iKSk7IH0KKworICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIF9Jb3NfT3Blbm1vZGUKKyAgb3BlcmF0b3JeKF9Jb3NfT3Blbm1vZGUgX19hLCBfSW9zX09wZW5tb2RlIF9fYikKKyAgeyByZXR1cm4gX0lvc19PcGVubW9kZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX09wZW5tb2RlCisgIG9wZXJhdG9yfihfSW9zX09wZW5tb2RlIF9fYSkKKyAgeyByZXR1cm4gX0lvc19PcGVubW9kZSh+c3RhdGljX2Nhc3Q8aW50PihfX2EpKTsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX09wZW5tb2RlJgorICBvcGVyYXRvcnw9KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX09wZW5tb2RlJgorICBvcGVyYXRvciY9KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSAmIF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX09wZW5tb2RlJgorICBvcGVyYXRvcl49KF9Jb3NfT3Blbm1vZGUmIF9fYSwgX0lvc19PcGVubW9kZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSBeIF9fYjsgfQorCisKKyAgZW51bSBfSW9zX0lvc3RhdGUKKyAgICB7IAorICAgICAgX1NfZ29vZGJpdCAJCT0gMCwKKyAgICAgIF9TX2JhZGJpdCAJCT0gMUwgPDwgMCwKKyAgICAgIF9TX2VvZmJpdCAJCT0gMUwgPDwgMSwKKyAgICAgIF9TX2ZhaWxiaXQJCT0gMUwgPDwgMiwKKyAgICAgIF9TX2lvc19pb3N0YXRlX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3ImKF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgJiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3J8KF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgfCBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3JeKF9Jb3NfSW9zdGF0ZSBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZShzdGF0aWNfY2FzdDxpbnQ+KF9fYSkgXiBzdGF0aWNfY2FzdDxpbnQ+KF9fYikpOyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBfSW9zX0lvc3RhdGUKKyAgb3BlcmF0b3J+KF9Jb3NfSW9zdGF0ZSBfX2EpCisgIHsgcmV0dXJuIF9Jb3NfSW9zdGF0ZSh+c3RhdGljX2Nhc3Q8aW50PihfX2EpKTsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0lvc3RhdGUmCisgIG9wZXJhdG9yfD0oX0lvc19Jb3N0YXRlJiBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSB8IF9fYjsgfQorCisgIGlubGluZSBjb25zdCBfSW9zX0lvc3RhdGUmCisgIG9wZXJhdG9yJj0oX0lvc19Jb3N0YXRlJiBfX2EsIF9Jb3NfSW9zdGF0ZSBfX2IpCisgIHsgcmV0dXJuIF9fYSA9IF9fYSAmIF9fYjsgfQorCisgIGlubGluZSBjb25zdCAgX0lvc19Jb3N0YXRlJgorICBvcGVyYXRvcl49KF9Jb3NfSW9zdGF0ZSYgX19hLCBfSW9zX0lvc3RhdGUgX19iKQorICB7IHJldHVybiBfX2EgPSBfX2EgXiBfX2I7IH0KKworCisgIGVudW0gX0lvc19TZWVrZGlyIAorICAgIHsgCisgICAgICBfU19iZWcgPSAwLAorICAgICAgX1NfY3VyID0gX0dMSUJDWFhfU1RESU9fU0VFS19DVVIsCisgICAgICBfU19lbmQgPSBfR0xJQkNYWF9TVERJT19TRUVLX0VORCwKKyAgICAgIF9TX2lvc19zZWVrZGlyX2VuZCA9IDFMIDw8IDE2IAorICAgIH07CisKKyAgLy8gMjcuNC4yICBDbGFzcyBpb3NfYmFzZQorICAvKioKKyAgICogIEBicmllZiAgVGhlIGJhc2Ugb2YgdGhlIEkvTyBjbGFzcyBoaWVyYXJjaHkuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBjbGFzcyBkZWZpbmVzIGV2ZXJ5dGhpbmcgdGhhdCBjYW4gYmUgZGVmaW5lZCBhYm91dCBJL08gdGhhdCBkb2VzCisgICAqICBub3QgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIGNoYXJhY3RlcnMgYmVpbmcgaW5wdXQgb3Igb3V0cHV0LiAgTW9zdAorICAgKiAgcGVvcGxlIHdpbGwgb25seSBzZWUgQGMgaW9zX2Jhc2Ugd2hlbiB0aGV5IG5lZWQgdG8gc3BlY2lmeSB0aGUgZnVsbAorICAgKiAgbmFtZSBvZiB0aGUgdmFyaW91cyBJL08gZmxhZ3MgKGUuZy4sIHRoZSBvcGVubW9kZXMpLgorICAqLworICBjbGFzcyBpb3NfYmFzZQorICB7CisgIHB1YmxpYzoKKworICAgIC8qKiAKKyAgICAgKiAgQGJyaWVmIFRoZXNlIGFyZSB0aHJvd24gdG8gaW5kaWNhdGUgcHJvYmxlbXMgd2l0aCBpby4KKyAgICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgICAqCisgICAgICogIDI3LjQuMi4xLjEgIENsYXNzIGlvc19iYXNlOjpmYWlsdXJlCisgICAgICovCisgICAgY2xhc3MgZmFpbHVyZSA6IHB1YmxpYyBleGNlcHRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDguICBVc2Ugb2Ygbm9uLWV4aXN0ZW50IGV4Y2VwdGlvbiBjb25zdHJ1Y3RvcgorICAgICAgZXhwbGljaXQKKyAgICAgIGZhaWx1cmUoY29uc3Qgc3RyaW5nJiBfX3N0cikgdGhyb3coKTsKKworICAgICAgLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBub3QgdXNlbGVzczoKKyAgICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy00LjMuMi9nY2MvVmFndWUtTGlua2FnZS5odG1sCisgICAgICB2aXJ0dWFsCisgICAgICB+ZmFpbHVyZSgpIHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICAgIHdoYXQoKSBjb25zdCB0aHJvdygpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHN0cmluZyBfTV9tc2c7CisgICAgfTsKKworICAgIC8vIDI3LjQuMi4xLjIgIFR5cGUgaW9zX2Jhc2U6OmZtdGZsYWdzCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlLgorICAgICAqCisgICAgICogIEBjIEBhIF9Jb3NfRm10ZmxhZ3MgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCwgYnV0IGl0IGlzIHZhbGlkIHRvCisgICAgICogIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIHRoZXNlIHZhbHVlcyBhbmQgZXhwZWN0IHRoZSBSaWdodAorICAgICAqICBUaGluZyB0byBoYXBwZW4uICBEZWZpbmVkIG9iamVjdHMgb2YgdHlwZSBmbXRmbGFncyBhcmU6CisgICAgICogIC0gYm9vbGFscGhhCisgICAgICogIC0gZGVjCisgICAgICogIC0gZml4ZWQKKyAgICAgKiAgLSBoZXgKKyAgICAgKiAgLSBpbnRlcm5hbAorICAgICAqICAtIGxlZnQKKyAgICAgKiAgLSBvY3QKKyAgICAgKiAgLSByaWdodAorICAgICAqICAtIHNjaWVudGlmaWMKKyAgICAgKiAgLSBzaG93YmFzZQorICAgICAqICAtIHNob3dwb2ludAorICAgICAqICAtIHNob3dwb3MKKyAgICAgKiAgLSBza2lwd3MKKyAgICAgKiAgLSB1bml0YnVmCisgICAgICogIC0gdXBwZXJjYXNlCisgICAgICogIC0gYWRqdXN0ZmllbGQKKyAgICAgKiAgLSBiYXNlZmllbGQKKyAgICAgKiAgLSBmbG9hdGZpZWxkCisgICAgKi8KKyAgICB0eXBlZGVmIF9Jb3NfRm10ZmxhZ3MgZm10ZmxhZ3M7CisKKyAgICAvLy8gSW5zZXJ0L2V4dHJhY3QgQGMgYm9vbCBpbiBhbHBoYWJldGljIHJhdGhlciB0aGFuIG51bWVyaWMgZm9ybWF0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBib29sYWxwaGEgPSAgIF9TX2Jvb2xhbHBoYTsKKworICAgIC8vLyBDb252ZXJ0cyBpbnRlZ2VyIGlucHV0IG9yIGdlbmVyYXRlcyBpbnRlZ2VyIG91dHB1dCBpbiBkZWNpbWFsIGJhc2UuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGRlYyA9ICAgICAgICAgX1NfZGVjOworCisgICAgLy8vIEdlbmVyYXRlIGZsb2F0aW5nLXBvaW50IG91dHB1dCBpbiBmaXhlZC1wb2ludCBub3RhdGlvbi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgZml4ZWQgPSAgICAgICBfU19maXhlZDsKKworICAgIC8vLyBDb252ZXJ0cyBpbnRlZ2VyIGlucHV0IG9yIGdlbmVyYXRlcyBpbnRlZ2VyIG91dHB1dCBpbiBoZXhhZGVjaW1hbCBiYXNlLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBoZXggPSAgICAgICAgIF9TX2hleDsKKworICAgIC8vLyBBZGRzIGZpbGwgY2hhcmFjdGVycyBhdCBhIGRlc2lnbmF0ZWQgaW50ZXJuYWwgcG9pbnQgaW4gY2VydGFpbgorICAgIC8vLyBnZW5lcmF0ZWQgb3V0cHV0LCBvciBpZGVudGljYWwgdG8gQGMgcmlnaHQgaWYgbm8gc3VjaCBwb2ludCBpcworICAgIC8vLyBkZXNpZ25hdGVkLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBpbnRlcm5hbCA9ICAgIF9TX2ludGVybmFsOworCisgICAgLy8vIEFkZHMgZmlsbCBjaGFyYWN0ZXJzIG9uIHRoZSByaWdodCAoZmluYWwgcG9zaXRpb25zKSBvZiBjZXJ0YWluCisgICAgLy8vIGdlbmVyYXRlZCBvdXRwdXQuICAoSS5lLiwgdGhlIHRoaW5nIHlvdSBwcmludCBpcyBmbHVzaCBsZWZ0LikKKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgbGVmdCA9ICAgICAgICBfU19sZWZ0OworCisgICAgLy8vIENvbnZlcnRzIGludGVnZXIgaW5wdXQgb3IgZ2VuZXJhdGVzIGludGVnZXIgb3V0cHV0IGluIG9jdGFsIGJhc2UuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIG9jdCA9ICAgICAgICAgX1Nfb2N0OworCisgICAgLy8vIEFkZHMgZmlsbCBjaGFyYWN0ZXJzIG9uIHRoZSBsZWZ0IChpbml0aWFsIHBvc2l0aW9ucykgb2YgY2VydGFpbgorICAgIC8vLyBnZW5lcmF0ZWQgb3V0cHV0LiAgKEkuZS4sIHRoZSB0aGluZyB5b3UgcHJpbnQgaXMgZmx1c2ggcmlnaHQuKQorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyByaWdodCA9ICAgICAgIF9TX3JpZ2h0OworCisgICAgLy8vIEdlbmVyYXRlcyBmbG9hdGluZy1wb2ludCBvdXRwdXQgaW4gc2NpZW50aWZpYyBub3RhdGlvbi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2NpZW50aWZpYyA9ICBfU19zY2llbnRpZmljOworCisgICAgLy8vIEdlbmVyYXRlcyBhIHByZWZpeCBpbmRpY2F0aW5nIHRoZSBudW1lcmljIGJhc2Ugb2YgZ2VuZXJhdGVkIGludGVnZXIKKyAgICAvLy8gb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93YmFzZSA9ICAgIF9TX3Nob3diYXNlOworCisgICAgLy8vIEdlbmVyYXRlcyBhIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIHVuY29uZGl0aW9uYWxseSBpbiBnZW5lcmF0ZWQKKyAgICAvLy8gZmxvYXRpbmctcG9pbnQgb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBzaG93cG9pbnQgPSAgIF9TX3Nob3dwb2ludDsKKworICAgIC8vLyBHZW5lcmF0ZXMgYSArIHNpZ24gaW4gbm9uLW5lZ2F0aXZlIGdlbmVyYXRlZCBudW1lcmljIG91dHB1dC4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2hvd3BvcyA9ICAgICBfU19zaG93cG9zOworCisgICAgLy8vIFNraXBzIGxlYWRpbmcgd2hpdGUgc3BhY2UgYmVmb3JlIGNlcnRhaW4gaW5wdXQgb3BlcmF0aW9ucy4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3Mgc2tpcHdzID0gICAgICBfU19za2lwd3M7CisKKyAgICAvLy8gRmx1c2hlcyBvdXRwdXQgYWZ0ZXIgZWFjaCBvdXRwdXQgb3BlcmF0aW9uLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyB1bml0YnVmID0gICAgIF9TX3VuaXRidWY7CisKKyAgICAvLy8gUmVwbGFjZXMgY2VydGFpbiBsb3dlcmNhc2UgbGV0dGVycyB3aXRoIHRoZWlyIHVwcGVyY2FzZSBlcXVpdmFsZW50cworICAgIC8vLyBpbiBnZW5lcmF0ZWQgb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyB1cHBlcmNhc2UgPSAgIF9TX3VwcGVyY2FzZTsKKworICAgIC8vLyBBIG1hc2sgb2YgbGVmdHxyaWdodHxpbnRlcm5hbC4gIFVzZWZ1bCBmb3IgdGhlIDItYXJnIGZvcm0gb2YgQGMgc2V0Zi4KKyAgICBzdGF0aWMgY29uc3QgZm10ZmxhZ3MgYWRqdXN0ZmllbGQgPSBfU19hZGp1c3RmaWVsZDsKKworICAgIC8vLyBBIG1hc2sgb2YgZGVjfG9jdHxoZXguICBVc2VmdWwgZm9yIHRoZSAyLWFyZyBmb3JtIG9mIEBjIHNldGYuCisgICAgc3RhdGljIGNvbnN0IGZtdGZsYWdzIGJhc2VmaWVsZCA9ICAgX1NfYmFzZWZpZWxkOworCisgICAgLy8vIEEgbWFzayBvZiBzY2llbnRpZmljfGZpeGVkLiAgVXNlZnVsIGZvciB0aGUgMi1hcmcgZm9ybSBvZiBAYyBzZXRmLgorICAgIHN0YXRpYyBjb25zdCBmbXRmbGFncyBmbG9hdGZpZWxkID0gIF9TX2Zsb2F0ZmllbGQ7CisKKyAgICAvLyAyNy40LjIuMS4zICBUeXBlIGlvc19iYXNlOjppb3N0YXRlCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlLgorICAgICAqCisgICAgICogIEBjIEBhIF9Jb3NfSW9zdGF0ZSBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICAgKiAgcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIFJpZ2h0CisgICAgICogIFRoaW5nIHRvIGhhcHBlbi4gIERlZmluZWQgb2JqZWN0cyBvZiB0eXBlIGlvc3RhdGUgYXJlOgorICAgICAqICAtIGJhZGJpdAorICAgICAqICAtIGVvZmJpdAorICAgICAqICAtIGZhaWxiaXQKKyAgICAgKiAgLSBnb29kYml0CisgICAgKi8KKyAgICB0eXBlZGVmIF9Jb3NfSW9zdGF0ZSBpb3N0YXRlOworCisgICAgLy8vIEluZGljYXRlcyBhIGxvc3Mgb2YgaW50ZWdyaXR5IGluIGFuIGlucHV0IG9yIG91dHB1dCBzZXF1ZW5jZSAoc3VjaAorICAgIC8vLyBhcyBhbiBpcnJlY292ZXJhYmxlIHJlYWQgZXJyb3IgZnJvbSBhIGZpbGUpLgorICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGJhZGJpdCA9CV9TX2JhZGJpdDsKKworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBpbnB1dCBvcGVyYXRpb24gcmVhY2hlZCB0aGUgZW5kIG9mIGFuIGlucHV0IHNlcXVlbmNlLgorICAgIHN0YXRpYyBjb25zdCBpb3N0YXRlIGVvZmJpdCA9CV9TX2VvZmJpdDsKKworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCBhbiBpbnB1dCBvcGVyYXRpb24gZmFpbGVkIHRvIHJlYWQgdGhlIGV4cGVjdGVkCisgICAgLy8vIGNoYXJhY3RlcnMsIG9yIHRoYXQgYW4gb3V0cHV0IG9wZXJhdGlvbiBmYWlsZWQgdG8gZ2VuZXJhdGUgdGhlCisgICAgLy8vIGRlc2lyZWQgY2hhcmFjdGVycy4KKyAgICBzdGF0aWMgY29uc3QgaW9zdGF0ZSBmYWlsYml0ID0JX1NfZmFpbGJpdDsKKworICAgIC8vLyBJbmRpY2F0ZXMgYWxsIGlzIHdlbGwuCisgICAgc3RhdGljIGNvbnN0IGlvc3RhdGUgZ29vZGJpdCA9CV9TX2dvb2RiaXQ7CisKKyAgICAvLyAyNy40LjIuMS40ICBUeXBlIGlvc19iYXNlOjpvcGVubW9kZQorICAgIC8qKgorICAgICAqICBAYnJpZWYgVGhpcyBpcyBhIGJpdG1hc2sgdHlwZS4KKyAgICAgKgorICAgICAqICBAYyBAYSBfSW9zX09wZW5tb2RlIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgICAqICBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgUmlnaHQKKyAgICAgKiAgVGhpbmcgdG8gaGFwcGVuLiAgRGVmaW5lZCBvYmplY3RzIG9mIHR5cGUgb3Blbm1vZGUgYXJlOgorICAgICAqICAtIGFwcAorICAgICAqICAtIGF0ZQorICAgICAqICAtIGJpbmFyeQorICAgICAqICAtIGluCisgICAgICogIC0gb3V0CisgICAgICogIC0gdHJ1bmMKKyAgICAqLworICAgIHR5cGVkZWYgX0lvc19PcGVubW9kZSBvcGVubW9kZTsKKworICAgIC8vLyBTZWVrIHRvIGVuZCBiZWZvcmUgZWFjaCB3cml0ZS4KKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYXBwID0JCV9TX2FwcDsKKworICAgIC8vLyBPcGVuIGFuZCBzZWVrIHRvIGVuZCBpbW1lZGlhdGVseSBhZnRlciBvcGVuaW5nLgorICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBhdGUgPQkJX1NfYXRlOworCisgICAgLy8vIFBlcmZvcm0gaW5wdXQgYW5kIG91dHB1dCBpbiBiaW5hcnkgbW9kZSAoYXMgb3Bwb3NlZCB0byB0ZXh0IG1vZGUpLgorICAgIC8vLyBUaGlzIGlzIHByb2JhYmx5IG5vdCB3aGF0IHlvdSB0aGluayBpdCBpczsgc2VlCisgICAgLy8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI3czAyLmh0bWwKKyAgICBzdGF0aWMgY29uc3Qgb3Blbm1vZGUgYmluYXJ5ID0JX1NfYmluOworCisgICAgLy8vIE9wZW4gZm9yIGlucHV0LiAgRGVmYXVsdCBmb3IgQGMgaWZzdHJlYW0gYW5kIGZzdHJlYW0uCisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIGluID0JCV9TX2luOworCisgICAgLy8vIE9wZW4gZm9yIG91dHB1dC4gIERlZmF1bHQgZm9yIEBjIG9mc3RyZWFtIGFuZCBmc3RyZWFtLgorICAgIHN0YXRpYyBjb25zdCBvcGVubW9kZSBvdXQgPQkJX1Nfb3V0OworCisgICAgLy8vIE9wZW4gZm9yIGlucHV0LiAgRGVmYXVsdCBmb3IgQGMgb2ZzdHJlYW0uCisgICAgc3RhdGljIGNvbnN0IG9wZW5tb2RlIHRydW5jID0JX1NfdHJ1bmM7CisKKyAgICAvLyAyNy40LjIuMS41ICBUeXBlIGlvc19iYXNlOjpzZWVrZGlyCisgICAgLyoqCisgICAgICogIEBicmllZiBUaGlzIGlzIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAgICAgKgorICAgICAqICBAYyBAYSBfSW9zX1NlZWtkaXIgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIERlZmluZWQgdmFsdWVzCisgICAgICogIG9mIHR5cGUgc2Vla2RpciBhcmU6CisgICAgICogIC0gYmVnCisgICAgICogIC0gY3VyLCBlcXVpdmFsZW50IHRvIEBjIFNFRUtfQ1VSIGluIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkuCisgICAgICogIC0gZW5kLCBlcXVpdmFsZW50IHRvIEBjIFNFRUtfRU5EIGluIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkuCisgICAgKi8KKyAgICB0eXBlZGVmIF9Jb3NfU2Vla2RpciBzZWVrZGlyOworCisgICAgLy8vIFJlcXVlc3QgYSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4KKyAgICBzdGF0aWMgY29uc3Qgc2Vla2RpciBiZWcgPQkJX1NfYmVnOworCisgICAgLy8vIFJlcXVlc3QgYSBzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc2VxdWVuY2UuCisgICAgc3RhdGljIGNvbnN0IHNlZWtkaXIgY3VyID0JCV9TX2N1cjsKKworICAgIC8vLyBSZXF1ZXN0IGEgc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHNlcXVlbmNlLgorICAgIHN0YXRpYyBjb25zdCBzZWVrZGlyIGVuZCA9CQlfU19lbmQ7CisKKyAgICAvLyBBbm5leCBELjYKKyAgICB0eXBlZGVmIGludCBpb19zdGF0ZTsKKyAgICB0eXBlZGVmIGludCBvcGVuX21vZGU7CisgICAgdHlwZWRlZiBpbnQgc2Vla19kaXI7CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtcG9zIHN0cmVhbXBvczsKKyAgICB0eXBlZGVmIHN0ZDo6c3RyZWFtb2ZmIHN0cmVhbW9mZjsKKworICAgIC8vIENhbGxiYWNrczsKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBUaGUgc2V0IG9mIGV2ZW50cyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gYW4gZXZlbnQgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiAgZXJhc2VfZXZlbnQgaXMgdXNlZCBkdXJpbmcgfmlvcygpIGFuZCBjb3B5Zm10KCkuICBpbWJ1ZV9ldmVudCBpcyB1c2VkCisgICAgICogIGR1cmluZyBpbWJ1ZSgpLiAgY29weWZtdF9ldmVudCBpcyB1c2VkIGR1cmluZyBjb3B5Zm10KCkuCisgICAgKi8KKyAgICBlbnVtIGV2ZW50CisgICAgeworICAgICAgZXJhc2VfZXZlbnQsCisgICAgICBpbWJ1ZV9ldmVudCwKKyAgICAgIGNvcHlmbXRfZXZlbnQKKyAgICB9OworCisgICAgLyoqCisgICAgICogIEBicmllZiAgVGhlIHR5cGUgb2YgYW4gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICogIEBwYXJhbSAgZXZlbnQgIE9uZSBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZXZlbnQgZW51bS4KKyAgICAgKiAgQHBhcmFtICBpb3NfYmFzZSAgUmVmZXJlbmNlIHRvIHRoZSBpb3NfYmFzZSBvYmplY3QuCisgICAgICogIEBwYXJhbSAgaW50ICBUaGUgaW50ZWdlciBwcm92aWRlZCB3aGVuIHRoZSBjYWxsYmFjayB3YXMgcmVnaXN0ZXJlZC4KKyAgICAgKgorICAgICAqICBFdmVudCBjYWxsYmFja3MgYXJlIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgdGhhdCBnZXQgY2FsbGVkIGR1cmluZworICAgICAqICBzZXZlcmFsIGlvc19iYXNlIGFuZCBiYXNpY19pb3MgZnVuY3Rpb25zLCBzcGVjaWZpY2FsbHkgaW1idWUoKSwKKyAgICAgKiAgY29weWZtdCgpLCBhbmQgfmlvcygpLgorICAgICovCisgICAgdHlwZWRlZiB2b2lkICgqZXZlbnRfY2FsbGJhY2spIChldmVudCwgaW9zX2Jhc2UmLCBpbnQpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQWRkIHRoZSBjYWxsYmFjayBfX2ZuIHdpdGggcGFyYW1ldGVyIF9faW5kZXguCisgICAgICogIEBwYXJhbSAgX19mbiAgVGhlIGZ1bmN0aW9uIHRvIGFkZC4KKyAgICAgKiAgQHBhcmFtICBfX2luZGV4ICBUaGUgaW50ZWdlciB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGludm9rZWQuCisgICAgICoKKyAgICAgKiAgUmVnaXN0ZXJzIGEgZnVuY3Rpb24gYXMgYW4gZXZlbnQgY2FsbGJhY2sgd2l0aCBhbiBpbnRlZ2VyIHBhcmFtZXRlciB0bworICAgICAqICBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIHdoZW4gaW52b2tlZC4gIE11bHRpcGxlIGNvcGllcyBvZiB0aGUKKyAgICAgKiAgZnVuY3Rpb24gYXJlIGFsbG93ZWQuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgY2FsbGJhY2tzLCB0aGV5IGFyZQorICAgICAqICBpbnZva2VkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZC4KKyAgICAqLworICAgIHZvaWQKKyAgICByZWdpc3Rlcl9jYWxsYmFjayhldmVudF9jYWxsYmFjayBfX2ZuLCBpbnQgX19pbmRleCk7CisKKyAgcHJvdGVjdGVkOgorICAgIHN0cmVhbXNpemUJCV9NX3ByZWNpc2lvbjsKKyAgICBzdHJlYW1zaXplCQlfTV93aWR0aDsKKyAgICBmbXRmbGFncwkJX01fZmxhZ3M7CisgICAgaW9zdGF0ZQkJX01fZXhjZXB0aW9uOworICAgIGlvc3RhdGUJCV9NX3N0cmVhbWJ1Zl9zdGF0ZTsKKworICAgIC8vIDI3LjQuMi42ICBNZW1iZXJzIGZvciBjYWxsYmFja3MKKyAgICAvLyAyNy40LjIuNiAgaW9zX2Jhc2UgY2FsbGJhY2tzCisgICAgc3RydWN0IF9DYWxsYmFja19saXN0CisgICAgeworICAgICAgLy8gRGF0YSBNZW1iZXJzCisgICAgICBfQ2FsbGJhY2tfbGlzdCoJCV9NX25leHQ7CisgICAgICBpb3NfYmFzZTo6ZXZlbnRfY2FsbGJhY2sJX01fZm47CisgICAgICBpbnQJCQlfTV9pbmRleDsKKyAgICAgIF9BdG9taWNfd29yZAkJX01fcmVmY291bnQ7ICAvLyAwIG1lYW5zIG9uZSByZWZlcmVuY2UuCisKKyAgICAgIF9DYWxsYmFja19saXN0KGlvc19iYXNlOjpldmVudF9jYWxsYmFjayBfX2ZuLCBpbnQgX19pbmRleCwKKwkJICAgICBfQ2FsbGJhY2tfbGlzdCogX19jYikKKyAgICAgIDogX01fbmV4dChfX2NiKSwgX01fZm4oX19mbiksIF9NX2luZGV4KF9faW5kZXgpLCBfTV9yZWZjb3VudCgwKSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fYWRkX3JlZmVyZW5jZSgpIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAxKTsgfQorCisgICAgICAvLyAwID0+IE9LIHRvIGRlbGV0ZS4KKyAgICAgIGludAorICAgICAgX01fcmVtb3ZlX3JlZmVyZW5jZSgpIAorICAgICAgeworICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fcmVmY291bnQpOworICAgICAgICBpbnQgX19yZXMgPSBfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fcmVmY291bnQsIC0xKTsKKyAgICAgICAgaWYgKF9fcmVzID09IDApCisgICAgICAgICAgeworICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3JlZmNvdW50KTsKKyAgICAgICAgICB9CisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKyAgICB9OworCisgICAgIF9DYWxsYmFja19saXN0KglfTV9jYWxsYmFja3M7CisKKyAgICB2b2lkCisgICAgX01fY2FsbF9jYWxsYmFja3MoZXZlbnQgX19ldikgdGhyb3coKTsKKworICAgIHZvaWQKKyAgICBfTV9kaXNwb3NlX2NhbGxiYWNrcyh2b2lkKSB0aHJvdygpOworCisgICAgLy8gMjcuNC4yLjUgIE1lbWJlcnMgZm9yIGl3b3JkL3B3b3JkIHN0b3JhZ2UKKyAgICBzdHJ1Y3QgX1dvcmRzCisgICAgeworICAgICAgdm9pZCoJX01fcHdvcmQ7CisgICAgICBsb25nCV9NX2l3b3JkOworICAgICAgX1dvcmRzKCkgOiBfTV9wd29yZCgwKSwgX01faXdvcmQoMCkgeyB9CisgICAgfTsKKworICAgIC8vIE9ubHkgZm9yIGZhaWxlZCBpd29yZC9wd29yZCBjYWxscy4KKyAgICBfV29yZHMJCV9NX3dvcmRfemVybzsKKworICAgIC8vIEd1YXJhbnRlZWQgc3RvcmFnZS4KKyAgICAvLyBUaGUgZmlyc3QgNSBpd29yZCBhbmQgcHdvcmQgc2xvdHMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCisgICAgZW51bSB7IF9TX2xvY2FsX3dvcmRfc2l6ZSA9IDggfTsKKyAgICBfV29yZHMJCV9NX2xvY2FsX3dvcmRbX1NfbG9jYWxfd29yZF9zaXplXTsKKworICAgIC8vIEFsbG9jYXRlZCBzdG9yYWdlLgorICAgIGludAkJCV9NX3dvcmRfc2l6ZTsKKyAgICBfV29yZHMqCQlfTV93b3JkOworCisgICAgX1dvcmRzJgorICAgIF9NX2dyb3dfd29yZHMoaW50IF9faW5kZXgsIGJvb2wgX19pd29yZCk7CisKKyAgICAvLyBNZW1iZXJzIGZvciBsb2NhbGUgYW5kIGxvY2FsZSBjYWNoaW5nLgorICAgIGxvY2FsZQkJX01faW9zX2xvY2FsZTsKKworICAgIHZvaWQKKyAgICBfTV9pbml0KCkgdGhyb3coKTsKKworICBwdWJsaWM6CisKKyAgICAvLyAyNy40LjIuMS42ICBDbGFzcyBpb3NfYmFzZTo6SW5pdAorICAgIC8vIFVzZWQgdG8gaW5pdGlhbGl6ZSBzdGFuZGFyZCBzdHJlYW1zLiBJbiB0aGVvcnksIGcrKyBjb3VsZCB1c2UKKyAgICAvLyAtZmluaXQtcHJpb3JpdHkgdG8gb3JkZXIgdGhpcyBzdHVmZiBjb3JyZWN0bHkgd2l0aG91dCBnb2luZworICAgIC8vIHRocm91Z2ggdGhlc2UgbWFjaGluYXRpb25zLgorICAgIGNsYXNzIEluaXQKKyAgICB7CisgICAgICBmcmllbmQgY2xhc3MgaW9zX2Jhc2U7CisgICAgcHVibGljOgorICAgICAgSW5pdCgpOworICAgICAgfkluaXQoKTsKKworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgX0F0b21pY193b3JkCV9TX3JlZmNvdW50OworICAgICAgc3RhdGljIGJvb2wJCV9TX3N5bmNlZF93aXRoX3N0ZGlvOworICAgIH07CisKKyAgICAvLyBbMjcuNC4yLjJdIGZtdGZsYWdzIHN0YXRlIGZ1bmN0aW9ucworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEFjY2VzcyB0byBmb3JtYXQgZmxhZ3MuCisgICAgICogIEByZXR1cm4gIFRoZSBmb3JtYXQgY29udHJvbCBmbGFncyBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgorICAgICovCisgICAgZm10ZmxhZ3MKKyAgICBmbGFncygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZmxhZ3M7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldHRpbmcgbmV3IGZvcm1hdCBmbGFncyBhbGwgYXQgb25jZS4KKyAgICAgKiAgQHBhcmFtICBmbXRmbCAgVGhlIG5ldyBmbGFncyB0byBzZXQuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBmb3JtYXQgY29udHJvbCBmbGFncy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIG92ZXJ3cml0ZXMgYWxsIHRoZSBmb3JtYXQgZmxhZ3Mgd2l0aCBAYSBmbXRmbC4KKyAgICAqLworICAgIGZtdGZsYWdzCisgICAgZmxhZ3MoZm10ZmxhZ3MgX19mbXRmbCkKKyAgICB7CisgICAgICBmbXRmbGFncyBfX29sZCA9IF9NX2ZsYWdzOworICAgICAgX01fZmxhZ3MgPSBfX2ZtdGZsOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldHRpbmcgbmV3IGZvcm1hdCBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBmbXRmbCAgQWRkaXRpb25hbCBmbGFncyB0byBzZXQuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBmb3JtYXQgY29udHJvbCBmbGFncy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgYWRkaXRpb25hbCBmbGFncyBpbiBmb3JtYXQgY29udHJvbC4gIEZsYWdzIHRoYXQKKyAgICAgKiAgd2VyZSBwcmV2aW91c2x5IHNldCByZW1haW4gc2V0LgorICAgICovCisgICAgZm10ZmxhZ3MKKyAgICBzZXRmKGZtdGZsYWdzIF9fZm10ZmwpCisgICAgeworICAgICAgZm10ZmxhZ3MgX19vbGQgPSBfTV9mbGFnczsKKyAgICAgIF9NX2ZsYWdzIHw9IF9fZm10Zmw7CisgICAgICByZXR1cm4gX19vbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgU2V0dGluZyBuZXcgZm9ybWF0IGZsYWdzLgorICAgICAqICBAcGFyYW0gIGZtdGZsICBBZGRpdGlvbmFsIGZsYWdzIHRvIHNldC4KKyAgICAgKiAgQHBhcmFtICBtYXNrICBUaGUgZmxhZ3MgbWFzayBmb3IgQGEgZm10ZmwuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBmb3JtYXQgY29udHJvbCBmbGFncy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIGNsZWFycyBAYSBtYXNrIGluIHRoZSBmb3JtYXQgZmxhZ3MsIHRoZW4gc2V0cworICAgICAqICBAYSBmbXRmbCBAYyAmIEBhIG1hc2suICBBbiBleGFtcGxlIG1hc2sgaXMgQGMgaW9zX2Jhc2U6OmFkanVzdGZpZWxkLgorICAgICovCisgICAgZm10ZmxhZ3MKKyAgICBzZXRmKGZtdGZsYWdzIF9fZm10ZmwsIGZtdGZsYWdzIF9fbWFzaykKKyAgICB7CisgICAgICBmbXRmbGFncyBfX29sZCA9IF9NX2ZsYWdzOworICAgICAgX01fZmxhZ3MgJj0gfl9fbWFzazsKKyAgICAgIF9NX2ZsYWdzIHw9IChfX2ZtdGZsICYgX19tYXNrKTsKKyAgICAgIHJldHVybiBfX29sZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDbGVhcmluZyBmb3JtYXQgZmxhZ3MuCisgICAgICogIEBwYXJhbSAgbWFzayAgVGhlIGZsYWdzIHRvIHVuc2V0LgorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gY2xlYXJzIEBhIG1hc2sgaW4gdGhlIGZvcm1hdCBmbGFncy4KKyAgICAqLworICAgIHZvaWQKKyAgICB1bnNldGYoZm10ZmxhZ3MgX19tYXNrKQorICAgIHsgX01fZmxhZ3MgJj0gfl9fbWFzazsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgRmxhZ3MgYWNjZXNzLgorICAgICAqICBAcmV0dXJuICBUaGUgcHJlY2lzaW9uIHRvIGdlbmVyYXRlIG9uIGNlcnRhaW4gb3V0cHV0IG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiAgQmUgY2FyZWZ1bCBpZiB5b3UgdHJ5IHRvIGdpdmUgYSBkZWZpbml0aW9uIG9mIEBhIHByZWNpc2lvbiBoZXJlOyBzZWUKKyAgICAgKiAgRFIgMTg5LgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHByZWNpc2lvbigpIGNvbnN0CisgICAgeyByZXR1cm4gX01fcHJlY2lzaW9uOyB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyBmbGFncy4KKyAgICAgKiAgQHBhcmFtICBwcmVjICBUaGUgbmV3IHByZWNpc2lvbiB2YWx1ZS4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHByZWNpc2lvbigpLgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHByZWNpc2lvbihzdHJlYW1zaXplIF9fcHJlYykKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fb2xkID0gX01fcHJlY2lzaW9uOworICAgICAgX01fcHJlY2lzaW9uID0gX19wcmVjOworICAgICAgcmV0dXJuIF9fb2xkOworICAgIH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEZsYWdzIGFjY2Vzcy4KKyAgICAgKiAgQHJldHVybiAgVGhlIG1pbmltdW0gZmllbGQgd2lkdGggdG8gZ2VuZXJhdGUgb24gb3V0cHV0IG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiAgPGVtPk1pbmltdW0gZmllbGQgd2lkdGg8L2VtPiByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICovCisgICAgc3RyZWFtc2l6ZQorICAgIHdpZHRoKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV93aWR0aDsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ2hhbmdpbmcgZmxhZ3MuCisgICAgICogIEBwYXJhbSAgd2lkZSAgVGhlIG5ldyB3aWR0aCB2YWx1ZS4KKyAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIHZhbHVlIG9mIHdpZHRoKCkuCisgICAgKi8KKyAgICBzdHJlYW1zaXplCisgICAgd2lkdGgoc3RyZWFtc2l6ZSBfX3dpZGUpCisgICAgeworICAgICAgc3RyZWFtc2l6ZSBfX29sZCA9IF9NX3dpZHRoOworICAgICAgX01fd2lkdGggPSBfX3dpZGU7CisgICAgICByZXR1cm4gX19vbGQ7CisgICAgfQorCisgICAgLy8gWzI3LjQuMi40XSBpb3NfYmFzZSBzdGF0aWMgbWVtYmVycworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEludGVyYWN0aW9uIHdpdGggdGhlIHN0YW5kYXJkIEMgSS9PIG9iamVjdHMuCisgICAgICogIEBwYXJhbSAgc3luYyAgV2hldGhlciB0byBzeW5jaHJvbml6ZSBvciBub3QuCisgICAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIHN0YW5kYXJkIHN0cmVhbXMgd2VyZSBwcmV2aW91c2x5IHN5bmNocm9uaXplZC4KKyAgICAgKgorICAgICAqICBUaGUgc3luY2hyb25pemF0aW9uIHJlZmVycmVkIHRvIGlzIEBlIG9ubHkgdGhhdCBiZXR3ZWVuIHRoZSBzdGFuZGFyZAorICAgICAqICBDIGZhY2lsaXRpZXMgKGUuZy4sIHN0ZG91dCkgYW5kIHRoZSBzdGFuZGFyZCBDKysgb2JqZWN0cyAoZS5nLiwKKyAgICAgKiAgY291dCkuICBVc2VyLWRlY2xhcmVkIHN0cmVhbXMgYXJlIHVuYWZmZWN0ZWQuICBTZWUKKyAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjhzMDIuaHRtbAorICAgICovCisgICAgc3RhdGljIGJvb2wKKyAgICBzeW5jX3dpdGhfc3RkaW8oYm9vbCBfX3N5bmMgPSB0cnVlKTsKKworICAgIC8vIFsyNy40LjIuM10gaW9zX2Jhc2UgbG9jYWxlIGZ1bmN0aW9ucworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgbG9jYWxlLgorICAgICAqICBAcGFyYW0gIGxvYyAgVGhlIG5ldyBsb2NhbGUuCisgICAgICogIEByZXR1cm4gIFRoZSBwcmV2aW91cyBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgU2V0cyB0aGUgbmV3IGxvY2FsZSBmb3IgdGhpcyBzdHJlYW0sIGFuZCB0aGVuIGludm9rZXMgZWFjaCBjYWxsYmFjaworICAgICAqICB3aXRoIGltYnVlX2V2ZW50LgorICAgICovCisgICAgbG9jYWxlCisgICAgaW1idWUoY29uc3QgbG9jYWxlJiBfX2xvYykgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIExvY2FsZSBhY2Nlc3MKKyAgICAgKiAgQHJldHVybiAgQSBjb3B5IG9mIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgICAgKgorICAgICAqICBJZiBAYyBpbWJ1ZShsb2MpIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgKiAgcmV0dXJucyBAYyBsb2MuICBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBjb3B5IG9mIEBjIHN0ZDo6bG9jYWxlKCksCisgICAgICogIHRoZSBnbG9iYWwgQysrIGxvY2FsZS4KKyAgICAqLworICAgIGxvY2FsZQorICAgIGdldGxvYygpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW9zX2xvY2FsZTsgfQorCisgICAgLyoqCisgICAgICogIEBicmllZiAgTG9jYWxlIGFjY2VzcworICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgTGlrZSBnZXRsb2MgYWJvdmUsIGJ1dCByZXR1cm5zIGEgcmVmZXJlbmNlIGluc3RlYWQgb2YKKyAgICAgKiAgZ2VuZXJhdGluZyBhIGNvcHkuCisgICAgKi8KKyAgICBjb25zdCBsb2NhbGUmCisgICAgX01fZ2V0bG9jKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pb3NfbG9jYWxlOyB9CisKKyAgICAvLyBbMjcuNC4yLjVdIGlvc19iYXNlIHN0b3JhZ2UgZnVuY3Rpb25zCisgICAgLyoqCisgICAgICogIEBicmllZiAgQWNjZXNzIHRvIHVuaXF1ZSBpbmRpY2VzLgorICAgICAqICBAcmV0dXJuICBBbiBpbnRlZ2VyIGRpZmZlcmVudCBmcm9tIGFsbCBwcmV2aW91cyBjYWxscy4KKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgaW50ZWdlciBldmVyeSB0aW1lIGl0IGlzIGNhbGxlZC4gIEl0CisgICAgICogIGNhbiBiZSB1c2VkIGZvciBhbnkgcHVycG9zZSwgYnV0IGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZSBhIHVuaXF1ZQorICAgICAqICBpbmRleCBmb3IgdGhlIGl3b3JkIGFuZCBwd29yZCBmdW5jdGlvbnMuICBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhbgorICAgICAqICBhcHBsaWNhdGlvbiBjYWxscyB4YWxsb2MgaW4gb3JkZXIgdG8gb2J0YWluIGFuIGluZGV4IGluIHRoZSBpd29yZCBhbmQKKyAgICAgKiAgcHdvcmQgYXJyYXlzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0LgorICAgICAqCisgICAgICogIFRoZSBpbXBsZW1lbnRhdGlvbiBtYWludGFpbnMgYSBzdGF0aWMgdmFyaWFibGUgdGhhdCBpcyBpbmNyZW1lbnRlZCBhbmQKKyAgICAgKiAgcmV0dXJuZWQgb24gZWFjaCBpbnZvY2F0aW9uLiAgeGFsbG9jIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGFuIGluZGV4CisgICAgICogIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gdGhlIGl3b3JkIGFuZCBwd29yZCBhcnJheXMuCisgICAgKi8KKyAgICBzdGF0aWMgaW50CisgICAgeGFsbG9jKCkgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEFjY2VzcyB0byBpbnRlZ2VyIGFycmF5LgorICAgICAqICBAcGFyYW0gIF9faXggIEluZGV4IGludG8gdGhlIGFycmF5LgorICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byBhbiBpbnRlZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5kZXguCisgICAgICoKKyAgICAgKiAgVGhlIGl3b3JkIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBhbiBhcnJheSBvZiBpbnRlZ2VycyB0aGF0IGNhbiBiZQorICAgICAqICB1c2VkIGZvciBhbnkgcHVycG9zZS4gIFRoZSBhcnJheSBncm93cyBhcyByZXF1aXJlZCB0byBob2xkIHRoZQorICAgICAqICBzdXBwbGllZCBpbmRleC4gIEFsbCBpbnRlZ2VycyBpbiB0aGUgYXJyYXkgYXJlIGluaXRpYWxpemVkIHRvIDAuCisgICAgICoKKyAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIHJlc2VydmVzIHNldmVyYWwgaW5kaWNlcy4gIFlvdSBzaG91bGQgdXNlIHhhbGxvYyB0bworICAgICAqICBvYnRhaW4gYW4gaW5kZXggdGhhdCBpcyBzYWZlIHRvIHVzZS4gIEFsc28gbm90ZSB0aGF0IHNpbmNlIHRoZSBhcnJheQorICAgICAqICBjYW4gZ3JvdyBkeW5hbWljYWxseSwgaXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSByZWZlcmVuY2UuCisgICAgKi8KKyAgICBsb25nJgorICAgIGl3b3JkKGludCBfX2l4KQorICAgIHsKKyAgICAgIF9Xb3JkcyYgX193b3JkID0gKF9faXggPCBfTV93b3JkX3NpemUpCisJCQk/IF9NX3dvcmRbX19peF0gOiBfTV9ncm93X3dvcmRzKF9faXgsIHRydWUpOworICAgICAgcmV0dXJuIF9fd29yZC5fTV9pd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gdm9pZCBwb2ludGVyIGFycmF5LgorICAgICAqICBAcGFyYW0gIF9faXggIEluZGV4IGludG8gdGhlIGFycmF5LgorICAgICAqICBAcmV0dXJuICBBIHJlZmVyZW5jZSB0byBhIHZvaWQqIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5kZXguCisgICAgICoKKyAgICAgKiAgVGhlIHB3b3JkIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0aGF0IGNhbiBiZQorICAgICAqICB1c2VkIGZvciBhbnkgcHVycG9zZS4gIFRoZSBhcnJheSBncm93cyBhcyByZXF1aXJlZCB0byBob2xkIHRoZQorICAgICAqICBzdXBwbGllZCBpbmRleC4gIEFsbCBwb2ludGVycyBpbiB0aGUgYXJyYXkgYXJlIGluaXRpYWxpemVkIHRvIDAuCisgICAgICoKKyAgICAgKiAgVGhlIGltcGxlbWVudGF0aW9uIHJlc2VydmVzIHNldmVyYWwgaW5kaWNlcy4gIFlvdSBzaG91bGQgdXNlIHhhbGxvYyB0bworICAgICAqICBvYnRhaW4gYW4gaW5kZXggdGhhdCBpcyBzYWZlIHRvIHVzZS4gIEFsc28gbm90ZSB0aGF0IHNpbmNlIHRoZSBhcnJheQorICAgICAqICBjYW4gZ3JvdyBkeW5hbWljYWxseSwgaXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSByZWZlcmVuY2UuCisgICAgKi8KKyAgICB2b2lkKiYKKyAgICBwd29yZChpbnQgX19peCkKKyAgICB7CisgICAgICBfV29yZHMmIF9fd29yZCA9IChfX2l4IDwgX01fd29yZF9zaXplKQorCQkJPyBfTV93b3JkW19faXhdIDogX01fZ3Jvd193b3JkcyhfX2l4LCBmYWxzZSk7CisgICAgICByZXR1cm4gX193b3JkLl9NX3B3b3JkOworICAgIH0KKworICAgIC8vIERlc3RydWN0b3IKKyAgICAvKioKKyAgICAgKiAgSW52b2tlcyBlYWNoIGNhbGxiYWNrIHdpdGggZXJhc2VfZXZlbnQuICBEZXN0cm95cyBsb2NhbCBzdG9yYWdlLgorICAgICAqCisgICAgICogIE5vdGUgdGhhdCB0aGUgaW9zX2Jhc2Ugb2JqZWN0IGZvciB0aGUgc3RhbmRhcmQgc3RyZWFtcyBuZXZlciBnZXRzCisgICAgICogIGRlc3Ryb3llZC4gIEFzIGEgcmVzdWx0LCBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3RhbmRhcmQKKyAgICAgKiAgc3RyZWFtcyB3aWxsIG5vdCBnZXQgaW52b2tlZCB3aXRoIGVyYXNlX2V2ZW50ICh1bmxlc3MgY29weWZtdCBpcworICAgICAqICB1c2VkKS4KKyAgICAqLworICAgIHZpcnR1YWwgfmlvc19iYXNlKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIGlvc19iYXNlKCkgdGhyb3cgKCk7CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1MC4gIENvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3Igb2YgaW9zX2Jhc2UKKyAgcHJpdmF0ZToKKyAgICBpb3NfYmFzZShjb25zdCBpb3NfYmFzZSYpOworCisgICAgaW9zX2Jhc2UmCisgICAgb3BlcmF0b3I9KGNvbnN0IGlvc19iYXNlJik7CisgIH07CisKKyAgLy8gWzI3LjQuNS4xXSBmbXRmbGFncyBtYW5pcHVsYXRvcnMKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6Ym9vbGFscGhhKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBib29sYWxwaGEoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpib29sYWxwaGEpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS51bnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm9ib29sYWxwaGEoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS51bnNldGYoaW9zX2Jhc2U6OmJvb2xhbHBoYSk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBzaG93YmFzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3diYXNlKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjpzaG93YmFzZSkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm9zaG93YmFzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd2Jhc2UpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpzaG93cG9pbnQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHNob3dwb2ludChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3dwb2ludCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub3Nob3dwb2ludChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3BvaW50KTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6c2hvd3BvcykuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2hvd3Bvcyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS51bnNldGYoaW9zX2Jhc2U6OnNob3dwb3MpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG5vc2hvd3Bvcyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6c2hvd3Bvcyk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnNraXB3cykuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2tpcHdzKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6c2tpcHdzKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2UudW5zZXRmKGlvc19iYXNlOjpza2lwd3MpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIG5vc2tpcHdzKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2UudW5zZXRmKGlvc19iYXNlOjpza2lwd3MpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjp1cHBlcmNhc2UpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHVwcGVyY2FzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnVwcGVyY2FzZSk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBub3VwcGVyY2FzZShpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6dXBwZXJjYXNlKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1ZikuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgdW5pdGJ1Zihpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjp1bml0YnVmKTsKKyAgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnVuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1ZikuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbm91bml0YnVmKGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICAgX19iYXNlLnVuc2V0Zihpb3NfYmFzZTo6dW5pdGJ1Zik7CisgICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLyBbMjcuNC41LjJdIGFkanVzdGZpZWxkIG1hbmlwdWxhdG9ycworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBpbnRlcm5hbChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjppbnRlcm5hbCwgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKTsKKyAgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmxlZnQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgbGVmdChpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmxlZnQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OnJpZ2h0LCBpb3NfYmFzZTo6YWRqdXN0ZmllbGQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIHJpZ2h0KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6cmlnaHQsIGlvc19iYXNlOjphZGp1c3RmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vIFsyNy40LjUuM10gYmFzZWZpZWxkIG1hbmlwdWxhdG9ycworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpkZWMsIGlvc19iYXNlOjpiYXNlZmllbGQpLgorICBpbmxpbmUgaW9zX2Jhc2UmCisgIGRlYyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OmRlYywgaW9zX2Jhc2U6OmJhc2VmaWVsZCk7CisgICAgcmV0dXJuIF9fYmFzZTsKKyAgfQorCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmhleCwgaW9zX2Jhc2U6OmJhc2VmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgaGV4KGlvc19iYXNlJiBfX2Jhc2UpCisgIHsKKyAgICBfX2Jhc2Uuc2V0Zihpb3NfYmFzZTo6aGV4LCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKKyAgLy8vIENhbGxzIGJhc2Uuc2V0Zihpb3NfYmFzZTo6b2N0LCBpb3NfYmFzZTo6YmFzZWZpZWxkKS4KKyAgaW5saW5lIGlvc19iYXNlJgorICBvY3QoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpvY3QsIGlvc19iYXNlOjpiYXNlZmllbGQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLyBbMjcuNC41LjRdIGZsb2F0ZmllbGQgbWFuaXB1bGF0b3JzCisgIC8vLyBDYWxscyBiYXNlLnNldGYoaW9zX2Jhc2U6OmZpeGVkLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgZml4ZWQoaW9zX2Jhc2UmIF9fYmFzZSkKKyAgeworICAgIF9fYmFzZS5zZXRmKGlvc19iYXNlOjpmaXhlZCwgaW9zX2Jhc2U6OmZsb2F0ZmllbGQpOworICAgIHJldHVybiBfX2Jhc2U7CisgIH0KKworICAvLy8gQ2FsbHMgYmFzZS5zZXRmKGlvc19iYXNlOjpzY2llbnRpZmljLCBpb3NfYmFzZTo6ZmxvYXRmaWVsZCkuCisgIGlubGluZSBpb3NfYmFzZSYKKyAgc2NpZW50aWZpYyhpb3NfYmFzZSYgX19iYXNlKQorICB7CisgICAgX19iYXNlLnNldGYoaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGlvc19iYXNlOjpmbG9hdGZpZWxkKTsKKyAgICByZXR1cm4gX19iYXNlOworICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9JT1NfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvaXN0cmVhbS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvaXN0cmVhbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1NWMzMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9pc3RyZWFtLnRjYwpAQCAtMCwwICsxLDEwOTQgQEAKKy8vIGlzdHJlYW0gY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9pc3RyZWFtLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lzdHJlYW19CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjYuMSAgSW5wdXQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfSVNUUkVBTV9UQ0MKKyNkZWZpbmUgX0lTVFJFQU1fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnk6OgorICAgIHNlbnRyeShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sIGJvb2wgX19ub3NraXApIDogX01fb2soZmFsc2UpCisgICAgeworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIGlmIChfX2luLmdvb2QoKSkKKwl7CisJICBpZiAoX19pbi50aWUoKSkKKwkgICAgX19pbi50aWUoKS0+Zmx1c2goKTsKKwkgIGlmICghX19ub3NraXAgJiYgYm9vbChfX2luLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2tpcHdzKSkKKwkgICAgeworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IF9faW4ucmRidWYoKTsKKwkgICAgICBfX2ludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKwkgICAgICBjb25zdCBfX2N0eXBlX3R5cGUmIF9fY3QgPSBfX2NoZWNrX2ZhY2V0KF9faW4uX01fY3R5cGUpOworCSAgICAgIHdoaWxlICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgX19jdC5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgCisJCQkJdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpKSkKKwkJX19jID0gX19zYi0+c25leHRjKCk7CisKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gMTk1LiBTaG91bGQgYmFzaWNfaXN0cmVhbTo6c2VudHJ5J3MgY29uc3RydWN0b3IgZXZlcgorCSAgICAgIC8vIHNldCBlb2ZiaXQ/CisJICAgICAgaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCX0KKworICAgICAgaWYgKF9faW4uZ29vZCgpICYmIF9fZXJyID09IGlvc19iYXNlOjpnb29kYml0KQorCV9NX29rID0gdHJ1ZTsKKyAgICAgIGVsc2UKKwl7CisJICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgIF9faW4uc2V0c3RhdGUoX19lcnIpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgICAgX01fZXh0cmFjdChfVmFsdWVUJiBfX3YpCisgICAgICB7CisJc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworCWlmIChfX2NlcmIpCisJICB7CisJICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIF9fdHJ5CisJICAgICAgeworCQljb25zdCBfX251bV9nZXRfdHlwZSYgX19uZyA9IF9fY2hlY2tfZmFjZXQodGhpcy0+X01fbnVtX2dldCk7CisJCV9fbmcuZ2V0KCp0aGlzLCAwLCAqdGhpcywgX19lcnIsIF9fdik7CisJICAgICAgfQorCSAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgICAgeworCQl0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICAgIGlmIChfX2VycikKKwkgICAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcj4+KHNob3J0JiBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTE4LiBiYXNpY19pc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX2dldCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGxvbmcgX19sOworCSAgICAgIGNvbnN0IF9fbnVtX2dldF90eXBlJiBfX25nID0gX19jaGVja19mYWNldCh0aGlzLT5fTV9udW1fZ2V0KTsKKwkgICAgICBfX25nLmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX2wpOworCisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDY5Ni4gaXN0cmVhbTo6b3BlcmF0b3I+PihpbnQmKSBicm9rZW4uCisJICAgICAgaWYgKF9fbCA8IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzaG9ydD46Ol9fbWluKQorCQl7CisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgX19uID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHNob3J0Pjo6X19taW47CisJCX0KKwkgICAgICBlbHNlIGlmIChfX2wgPiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c2hvcnQ+OjpfX21heCkKKwkJeworCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIF9fbiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzaG9ydD46Ol9fbWF4OworCQl9CisJICAgICAgZWxzZQorCQlfX24gPSBzaG9ydChfX2wpOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPj4oaW50JiBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTE4LiBiYXNpY19pc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX2dldCBtZW1iZXIgZnVuY3Rpb25zLgorICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGxvbmcgX19sOworCSAgICAgIGNvbnN0IF9fbnVtX2dldF90eXBlJiBfX25nID0gX19jaGVja19mYWNldCh0aGlzLT5fTV9udW1fZ2V0KTsKKwkgICAgICBfX25nLmdldCgqdGhpcywgMCwgKnRoaXMsIF9fZXJyLCBfX2wpOworCisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDY5Ni4gaXN0cmVhbTo6b3BlcmF0b3I+PihpbnQmKSBicm9rZW4uCisJICAgICAgaWYgKF9fbCA8IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbikKKwkJeworCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIF9fbiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbjsKKwkJfQorCSAgICAgIGVsc2UgaWYgKF9fbCA+IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heCkKKwkJeworCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OwkgICAgICAKKwkJICBfX24gPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXg7CisJCX0KKwkgICAgICBlbHNlCisJCV9fbiA9IGludChfX2wpOworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPj4oX19zdHJlYW1idWZfdHlwZSogX19zYm91dCkKKyAgICB7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYiAmJiBfX3Nib3V0KQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBib29sIF9faW5lb2Y7CisJICAgICAgaWYgKCFfX2NvcHlfc3RyZWFtYnVmc19lb2YodGhpcy0+cmRidWYoKSwgX19zYm91dCwgX19pbmVvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICAgIGlmIChfX2luZW9mKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsgfQorCX0KKyAgICAgIGVsc2UgaWYgKCFfX3Nib3V0KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6aW50X3R5cGUKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldCh2b2lkKQorICAgIHsKKyAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgaW50X3R5cGUgX19jID0gX19lb2Y7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19jID0gdGhpcy0+cmRidWYoKS0+c2J1bXBjKCk7CisJICAgICAgLy8gMjcuNi4xLjEgcGFyYWdyYXBoIDMKKwkgICAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX01fZ2NvdW50ID0gMTsKKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBnZXQoY2hhcl90eXBlJiBfX2MpCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fY2IgPSB0aGlzLT5yZGJ1ZigpLT5zYnVtcGMoKTsKKwkgICAgICAvLyAyNy42LjEuMSBwYXJhZ3JhcGggMworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fY2IsIHRyYWl0c190eXBlOjplb2YoKSkpCisJCXsKKwkJICBfTV9nY291bnQgPSAxOworCQkgIF9fYyA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jYik7CisJCX0KKwkgICAgICBlbHNlCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24sIGNoYXJfdHlwZSBfX2RlbGltKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2lkZWxpbSA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2RlbGltKTsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgd2hpbGUgKF9NX2djb3VudCArIDEgPCBfX24KKwkJICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9faWRlbGltKSkKKwkJeworCQkgICpfX3MrKyA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICArK19NX2djb3VudDsKKwkJICBfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI0My4gZ2V0IGFuZCBnZXRsaW5lIHdoZW4gc2VudHJ5IHJlcG9ydHMgZmFpbHVyZS4KKyAgICAgIGlmIChfX24gPiAwKQorCSpfX3MgPSBjaGFyX3R5cGUoKTsKKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldChfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiLCBjaGFyX3R5cGUgX19kZWxpbSkKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgY29uc3QgaW50X3R5cGUgX19pZGVsaW0gPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19kZWxpbSk7CisJICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJICAgICAgX19zdHJlYW1idWZfdHlwZSogX190aGlzX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSBfX3RoaXNfc2ItPnNnZXRjKCk7CisJICAgICAgY2hhcl90eXBlIF9fYzIgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisKKwkgICAgICB3aGlsZSAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkKKwkJICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fc2Iuc3B1dGMoX19jMiksIF9fZW9mKSkKKwkJeworCQkgICsrX01fZ2NvdW50OworCQkgIF9fYyA9IF9fdGhpc19zYi0+c25leHRjKCk7CisJCSAgX19jMiA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJfQorCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIGlmICghX01fZ2NvdW50KQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSkKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKyAgICAgICAgeworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGludF90eXBlIF9faWRlbGltID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fZGVsaW0pOworICAgICAgICAgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgICAgICAgICAgX19zdHJlYW1idWZfdHlwZSogX19zYiA9IHRoaXMtPnJkYnVmKCk7CisgICAgICAgICAgICAgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisKKyAgICAgICAgICAgICAgd2hpbGUgKF9NX2djb3VudCArIDEgPCBfX24KKyAgICAgICAgICAgICAgICAgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKyAgICAgICAgICAgICAgICAgICAgICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgKl9fcysrID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworICAgICAgICAgICAgICAgICAgX19jID0gX19zYi0+c25leHRjKCk7CisgICAgICAgICAgICAgICAgICArK19NX2djb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisgICAgICAgICAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBfX3NiLT5zYnVtcGMoKTsKKyAgICAgICAgICAgICAgICAgICAgICArK19NX2djb3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgICB9CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNDMuIGdldCBhbmQgZ2V0bGluZSB3aGVuIHNlbnRyeSByZXBvcnRzIGZhaWx1cmUuCisgICAgICBpZiAoX19uID4gMCkKKwkqX19zID0gY2hhcl90eXBlKCk7CisgICAgICBpZiAoIV9NX2djb3VudCkKKyAgICAgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gV2UgcHJvdmlkZSB0aHJlZSBvdmVybG9hZHMsIHNpbmNlIHRoZSBmaXJzdCB0d28gYXJlIG11Y2ggc2ltcGxlcgorICAvLyB0aGFuIHRoZSBnZW5lcmFsIGNhc2UuIEFsc28sIHRoZSBsYXR0ZXIgdHdvIGNhbiB0aHVzIGFkb3B0IHRoZQorICAvLyBzYW1lICJiYXRjaHkiIHN0cmF0ZWd5IHVzZWQgYnkgZ2V0bGluZSBhYm92ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGlnbm9yZSh2b2lkKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi0+c2J1bXBjKCksIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgICBlbHNlCisJCV9NX2djb3VudCA9IDE7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIgJiYgX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworICAgICAgICAgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgLy8gTi5CLiBPbiBMRlMtZW5hYmxlZCBwbGF0Zm9ybXMgc3RyZWFtc2l6ZSBpcyBzdGlsbCAzMiBiaXRzCisJICAgICAgLy8gd2lkZTogaWYgd2Ugd2FudCB0byBpbXBsZW1lbnQgdGhlIHN0YW5kYXJkIG1hbmRhdGVkIGJlaGF2aW9yCisJICAgICAgLy8gZm9yIG4gPT0gbWF4KCkgKHNlZSAyNy42LjEuMy8yNCkgd2UgYXJlIGF0IHJpc2sgb2Ygc2lnbmVkCisJICAgICAgLy8gaW50ZWdlciBvdmVyZmxvdzogdGh1cyB0aGVzZSBjb250b3J0aW9ucy4gQWxzbyBub3RlIHRoYXQsCisJICAgICAgLy8gYnkgZGVmaW5pdGlvbiwgd2hlbiBtb3JlIHRoYW4gMkcgY2hhcnMgYXJlIGFjdHVhbGx5IGlnbm9yZWQsCisJICAgICAgLy8gX01fZ2NvdW50ICh0aGUgcmV0dXJuIHZhbHVlIG9mIGdjb3VudCwgdGhhdCBpcykgY2Fubm90IGJlCisJICAgICAgLy8gcmVhbGx5IGNvcnJlY3QsIGJlaW5nIHVuYXZvaWRhYmx5IHRvbyBzbWFsbC4KKwkgICAgICBib29sIF9fbGFyZ2VfaWdub3JlID0gZmFsc2U7CisJICAgICAgd2hpbGUgKHRydWUpCisJCXsKKwkJICB3aGlsZSAoX01fZ2NvdW50IDwgX19uCisJCQkgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJICAgIHsKKwkJICAgICAgKytfTV9nY291bnQ7CisJCSAgICAgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQkgICAgfQorCQkgIGlmIChfX24gPT0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heAorCQkgICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQkgICAgeworCQkgICAgICBfTV9nY291bnQgPQorCQkJX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21pbjsKKwkJICAgICAgX19sYXJnZV9pZ25vcmUgPSB0cnVlOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIGJyZWFrOworCQl9CisKKwkgICAgICBpZiAoX19sYXJnZV9pZ25vcmUpCisJCV9NX2djb3VudCA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzdHJlYW1zaXplPjo6X19tYXg7CisKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICAgICAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgICAgIGlmIChfX2VycikKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uLCBpbnRfdHlwZSBfX2RlbGltKQorICAgIHsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIgJiYgX19uID4gMCkKKyAgICAgICAgeworICAgICAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgaW50X3R5cGUgX19lb2YgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICAgICAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSB0aGlzLT5yZGJ1ZigpOworICAgICAgICAgICAgICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisJICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUuCisJICAgICAgYm9vbCBfX2xhcmdlX2lnbm9yZSA9IGZhbHNlOworCSAgICAgIHdoaWxlICh0cnVlKQorCQl7CisJCSAgd2hpbGUgKF9NX2djb3VudCA8IF9fbgorCQkJICYmICF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJCSAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19kZWxpbSkpCisJCSAgICB7CisJCSAgICAgICsrX01fZ2NvdW50OworCQkgICAgICBfX2MgPSBfX3NiLT5zbmV4dGMoKTsKKwkJICAgIH0KKwkJICBpZiAoX19uID09IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxzdHJlYW1zaXplPjo6X19tYXgKKwkJICAgICAgJiYgIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19kZWxpbSkpCisJCSAgICB7CisJCSAgICAgIF9NX2djb3VudCA9CisJCQlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWluOworCQkgICAgICBfX2xhcmdlX2lnbm9yZSA9IHRydWU7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgYnJlYWs7CisJCX0KKworCSAgICAgIGlmIChfX2xhcmdlX2lnbm9yZSkKKwkJX01fZ2NvdW50ID0gX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heDsKKworICAgICAgICAgICAgICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorICAgICAgICAgICAgICAgIF9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgZWxzZSBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19kZWxpbSkpCisJCXsKKwkJICBpZiAoX01fZ2NvdW50CisJCSAgICAgIDwgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPHN0cmVhbXNpemU+OjpfX21heCkKKwkJICAgICsrX01fZ2NvdW50OworCQkgIF9fc2ItPnNidW1wYygpOworCQl9CisgICAgICAgICAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorICAgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICAgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgICAgIGlmIChfX2VycikKKyAgICAgICAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdHlwZW5hbWUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjppbnRfdHlwZQorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcGVlayh2b2lkKQorICAgIHsKKyAgICAgIGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIF9NX2djb3VudCA9IDA7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfX2MgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0YygpOworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICByZWFkKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBfTV9nY291bnQgPSAwOworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcywgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX01fZ2NvdW50ID0gdGhpcy0+cmRidWYoKS0+c2dldG4oX19zLCBfX24pOworCSAgICAgIGlmIChfTV9nY291bnQgIT0gX19uKQorCQlfX2VyciB8PSAoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICByZWFkc29tZShjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIC8vIENhbm5vdCBjb21wYXJlIGludF90eXBlIHdpdGggc3RyZWFtc2l6ZSBnZW5lcmljYWxseS4KKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbnVtID0gdGhpcy0+cmRidWYoKS0+aW5fYXZhaWwoKTsKKwkgICAgICBpZiAoX19udW0gPiAwKQorCQlfTV9nY291bnQgPSB0aGlzLT5yZGJ1ZigpLT5zZ2V0bihfX3MsIHN0ZDo6bWluKF9fbnVtLCBfX24pKTsKKwkgICAgICBlbHNlIGlmIChfX251bSA9PSAtMSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gX01fZ2NvdW50OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgcHV0YmFjayhjaGFyX3R5cGUgX19jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIC8vIENsZWFyIGVvZmJpdCBwZXIgTjMxNjguCisgICAgICB0aGlzLT5jbGVhcih0aGlzLT5yZHN0YXRlKCkgJiB+aW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpZiAoIV9fc2IKKwkJICB8fCB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi0+c3B1dGJhY2tjKF9fYyksIF9fZW9mKSkKKwkJX19lcnIgfD0gaW9zX2Jhc2U6OmJhZGJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICB1bmdldCh2b2lkKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgX01fZ2NvdW50ID0gMDsKKyAgICAgIC8vIENsZWFyIGVvZmJpdCBwZXIgTjMxNjguCisgICAgICB0aGlzLT5jbGVhcih0aGlzLT5yZHN0YXRlKCkgJiB+aW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpZiAoIV9fc2IKKwkJICB8fCB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19zYi0+c3VuZ2V0YygpLCBfX2VvZikpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW50CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzeW5jKHZvaWQpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgaW50IF9fcmV0ID0gLTE7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gdGhpcy0+cmRidWYoKTsKKwkgICAgICBpZiAoX19zYikKKwkJeworCQkgIGlmIChfX3NiLT5wdWJzeW5jKCkgPT0gLTEpCisJCSAgICBfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCQkgIGVsc2UKKwkJICAgIF9fcmV0ID0gMDsKKwkJfQorCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgIGlmIChfX2VycikKKwkgICAgdGhpcy0+c2V0c3RhdGUoX19lcnIpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHRlbGxnKHZvaWQpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgcG9zX3R5cGUgX19yZXQgPSBwb3NfdHlwZSgtMSk7CisgICAgICBzZW50cnkgX19jZXJiKCp0aGlzLCB0cnVlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghdGhpcy0+ZmFpbCgpKQorCQlfX3JldCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoMCwgaW9zX2Jhc2U6OmN1ciwKKwkJCQkJCSAgaW9zX2Jhc2U6OmluKTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgc2Vla2cocG9zX3R5cGUgX19wb3MpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgLy8gQ2xlYXIgZW9mYml0IHBlciBOMzE2OC4KKyAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghdGhpcy0+ZmFpbCgpKQorCQl7CisJCSAgLy8gMTM2LiAgc2Vla3AsIHNlZWtnIHNldHRpbmcgd3Jvbmcgc3RyZWFtcz8KKwkJICBjb25zdCBwb3NfdHlwZSBfX3AgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrcG9zKF9fcG9zLAorCQkJCQkJCQkgaW9zX2Jhc2U6OmluKTsKKwkJICAKKwkJICAvLyAxMjkuICBOZWVkIGVycm9yIGluZGljYXRpb24gZnJvbSBzZWVrcCgpIGFuZCBzZWVrZygpCisJCSAgaWYgKF9fcCA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCQkgICAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCX0KKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzZWVrZyhvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX19kaXIpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFI2MC4gIERvIG5vdCBjaGFuZ2UgX01fZ2NvdW50LgorICAgICAgLy8gQ2xlYXIgZW9mYml0IHBlciBOMzE2OC4KKyAgICAgIHRoaXMtPmNsZWFyKHRoaXMtPnJkc3RhdGUoKSAmIH5pb3NfYmFzZTo6ZW9mYml0KTsKKyAgICAgIHNlbnRyeSBfX2NlcmIoKnRoaXMsIHRydWUpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGlmICghdGhpcy0+ZmFpbCgpKQorCQl7CisJCSAgLy8gMTM2LiAgc2Vla3AsIHNlZWtnIHNldHRpbmcgd3Jvbmcgc3RyZWFtcz8KKwkJICBjb25zdCBwb3NfdHlwZSBfX3AgPSB0aGlzLT5yZGJ1ZigpLT5wdWJzZWVrb2ZmKF9fb2ZmLCBfX2RpciwKKwkJCQkJCQkJIGlvc19iYXNlOjppbik7CisJICAgICAgCisJCSAgLy8gMTI5LiAgTmVlZCBlcnJvciBpbmRpY2F0aW9uIGZyb20gc2Vla3AoKSBhbmQgc2Vla2coKQorCQkgIGlmIChfX3AgPT0gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKSkKKwkJICAgIF9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQl9CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICB0aGlzLT5zZXRzdGF0ZShfX2Vycik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNy42LjEuMi4zIENoYXJhY3RlciBleHRyYWN0aW9uIHRlbXBsYXRlcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQmIF9fYykKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZSAgICAgICAgIF9faW50X3R5cGU7CisKKyAgICAgIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9faW4sIGZhbHNlKTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fY2IgPSBfX2luLnJkYnVmKCktPnNidW1wYygpOworCSAgICAgIGlmICghX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jYiwgX1RyYWl0czo6ZW9mKCkpKQorCQlfX2MgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jYik7CisJICAgICAgZWxzZQorCQlfX2VyciB8PSAoaW9zX2Jhc2U6OmVvZmJpdCB8IGlvc19iYXNlOjpmYWlsYml0KTsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgX19pbi5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCSAgaWYgKF9fZXJyKQorCSAgICBfX2luLnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAgICAgICAgICBfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZQkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CQkJCV9fY3R5cGVfdHlwZTsKKworICAgICAgc3RyZWFtc2l6ZSBfX2V4dHJhY3RlZCA9IDA7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgZmFsc2UpOworICAgICAgaWYgKF9fY2VyYikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIGV4dHJhY3QuCisJICAgICAgc3RyZWFtc2l6ZSBfX251bSA9IF9faW4ud2lkdGgoKTsKKwkgICAgICBpZiAoX19udW0gPD0gMCkKKwkJX19udW0gPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8c3RyZWFtc2l6ZT46Ol9fbWF4OworCisJICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2N0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19pbi5nZXRsb2MoKSk7CisKKwkgICAgICBjb25zdCBpbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCSAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSBfX2luLnJkYnVmKCk7CisJICAgICAgaW50X3R5cGUgX19jID0gX19zYi0+c2dldGMoKTsKKworCSAgICAgIHdoaWxlIChfX2V4dHJhY3RlZCA8IF9fbnVtIC0gMQorCQkgICAgICYmICFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKQorCQkgICAgICYmICFfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLAorCQkJCSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJCXsKKwkJICAqX19zKysgPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICArK19fZXh0cmFjdGVkOworCQkgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQl9CisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDY4LiAgRXh0cmFjdG9ycyBmb3IgY2hhciogc2hvdWxkIHN0b3JlIG51bGwgYXQgZW5kCisJICAgICAgKl9fcyA9IGNoYXJfdHlwZSgpOworCSAgICAgIF9faW4ud2lkdGgoMCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faW4uX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9faW4uX01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICBpZiAoIV9fZXh0cmFjdGVkKQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfQorCisgIC8vIDI3LjYuMS40IFN0YW5kYXJkIGJhc2ljX2lzdHJlYW0gbWFuaXB1bGF0b3JzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgd3MoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gICAgICAgICAgX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OmludF90eXBlCQlfX2ludF90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+CQkJCV9fY3R5cGVfdHlwZTsKKworICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2N0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19pbi5nZXRsb2MoKSk7CisgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisgICAgICBfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiID0gX19pbi5yZGJ1ZigpOworICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCisgICAgICB3aGlsZSAoIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJICAgICAmJiBfX2N0LmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSkpCisJX19jID0gX19zYi0+c25leHRjKCk7CisKKyAgICAgICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikpCisJIF9faW4uc2V0c3RhdGUoaW9zX2Jhc2U6OmVvZmJpdCk7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19pc3RyZWFtPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgd3MoaXN0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY2hhciYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY2hhciopOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgdW5zaWduZWQgY2hhciYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgc2lnbmVkIGNoYXImKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHVuc2lnbmVkIGNoYXIqKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYsIHNpZ25lZCBjaGFyKik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgc2hvcnQmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgaW50Jik7ICAKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KGJvb2wmKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBpc3RyZWFtOjpfTV9leHRyYWN0KGxvbmcgbG9uZyYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdCh1bnNpZ25lZCBsb25nIGxvbmcmKTsKKyNlbmRpZgorICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdChmbG9hdCYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgaXN0cmVhbTo6X01fZXh0cmFjdChkb3VibGUmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyBkb3VibGUmKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIGlzdHJlYW0mIGlzdHJlYW06Ol9NX2V4dHJhY3Qodm9pZComKTsKKworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaW9zdHJlYW08Y2hhcj47CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3cyh3aXN0cmVhbSYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCB3Y2hhcl90Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIHdjaGFyX3QqKTsKKworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KHVuc2lnbmVkIHNob3J0Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgaW50Jik7ICAKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdChsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgbG9uZyYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGJvb2wmKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QobG9uZyBsb25nJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3QodW5zaWduZWQgbG9uZyBsb25nJik7CisjZW5kaWYKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiB3aXN0cmVhbTo6X01fZXh0cmFjdChmbG9hdCYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGRvdWJsZSYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIHdpc3RyZWFtOjpfTV9leHRyYWN0KGxvbmcgZG91YmxlJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgd2lzdHJlYW06Ol9NX2V4dHJhY3Qodm9pZComKTsKKworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaW9zdHJlYW08d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9saXN0LnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9saXN0LnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWMxYmM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xpc3QudGNjCkBAIC0wLDAgKzEsNDcwIEBACisvLyBMaXN0IGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorLy8gMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9saXN0LnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xpc3R9CisgKi8KKworI2lmbmRlZiBfTElTVF9UQ0MKKyNkZWZpbmUgX0xJU1RfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9jbGVhcigpCisgICAgeworICAgICAgdHlwZWRlZiBfTGlzdF9ub2RlPF9UcD4gIF9Ob2RlOworICAgICAgX05vZGUqIF9fY3VyID0gc3RhdGljX2Nhc3Q8X05vZGUqPih0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCk7CisgICAgICB3aGlsZSAoX19jdXIgIT0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZSkKKwl7CisJICBfTm9kZSogX190bXAgPSBfX2N1cjsKKwkgIF9fY3VyID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX2N1ci0+X01fbmV4dCk7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKwkgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmRlc3Ryb3koX190bXApOworI2Vsc2UKKwkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKS5kZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoX190bXAtPl9NX2RhdGEpKTsKKyNlbmRpZgorCSAgX01fcHV0X25vZGUoX190bXApOworCX0KKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKwlfTm9kZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCV9fdG1wLT5fTV9ob29rKF9fcG9zaXRpb24uX01fbm9kZSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fdG1wKTsKKyAgICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIGxpc3Q8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX3RtcCA9IF9NX2NyZWF0ZV9ub2RlKF9feCk7CisgICAgICBfX3RtcC0+X01faG9vayhfX3Bvc2l0aW9uLl9NX25vZGUpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fdG1wKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgbGlzdDxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgaXRlcmF0b3IgX19yZXQgPSBpdGVyYXRvcihfX3Bvc2l0aW9uLl9NX25vZGUtPl9NX25leHQpOworICAgICAgX01fZXJhc2UoX19wb3NpdGlvbik7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9kZWZhdWx0X2FwcGVuZChzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIHNpemVfdHlwZSBfX2kgPSAwOworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19pIDwgX19uOyArK19faSkKKwkgICAgZW1wbGFjZV9iYWNrKCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgZm9yICg7IF9faTsgLS1fX2kpCisJICAgIHBvcF9iYWNrKCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKQorICAgICAgICA7CisgICAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKwlfTV9kZWZhdWx0X2FwcGVuZChfX25ld19zaXplIC0gX19sZW4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKQorICAgICAgICA7CisgICAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKyAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisgICAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIHZhbHVlX3R5cGUgX194KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBzaXplX3R5cGUgX19sZW4gPSAwOworICAgICAgZm9yICg7IF9faSAhPSBlbmQoKSAmJiBfX2xlbiA8IF9fbmV3X3NpemU7ICsrX19pLCArK19fbGVuKQorICAgICAgICA7CisgICAgICBpZiAoX19sZW4gPT0gX19uZXdfc2l6ZSkKKyAgICAgICAgZXJhc2UoX19pLCBlbmQoKSk7CisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBfX2kgPT0gZW5kKCkKKyAgICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgbGlzdDxfVHAsIF9BbGxvYz4mCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX3gpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJl9feCkKKwl7CisJICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisJICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisJICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOworCSAgY29uc3RfaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKwkgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7CisJICAgICAgICsrX19maXJzdDEsICsrX19maXJzdDIpCisJICAgICpfX2ZpcnN0MSA9ICpfX2ZpcnN0MjsKKwkgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCSAgICBlcmFzZShfX2ZpcnN0MSwgX19sYXN0MSk7CisJICBlbHNlCisJICAgIGluc2VydChfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9faSA9IGJlZ2luKCk7CisgICAgICBmb3IgKDsgX19pICE9IGVuZCgpICYmIF9fbiA+IDA7ICsrX19pLCAtLV9fbikKKyAgICAgICAgKl9faSA9IF9fdmFsOworICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIGluc2VydChlbmQoKSwgX19uLCBfX3ZhbCk7CisgICAgICBlbHNlCisgICAgICAgIGVyYXNlKF9faSwgZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdDIsCisJCQkgX19mYWxzZV90eXBlKQorICAgICAgeworICAgICAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKKyAgICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MjsKKwkgICAgICsrX19maXJzdDEsICsrX19maXJzdDIpCisgICAgICAgICAgKl9fZmlyc3QxID0gKl9fZmlyc3QyOworICAgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKyAgICAgICAgICBlcmFzZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisgICAgcmVtb3ZlKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgeworICAgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgIGl0ZXJhdG9yIF9fZXh0cmEgPSBfX2xhc3Q7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKwkgICsrX19uZXh0OworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWUpCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gNTI2LiBJcyBpdCB1bmRlZmluZWQgaWYgYSBmdW5jdGlvbiBpbiB0aGUgc3RhbmRhcmQgY2hhbmdlcworCSAgICAgIC8vIGluIHBhcmFtZXRlcnM/CisJICAgICAgaWYgKHN0ZDo6X19hZGRyZXNzb2YoKl9fZmlyc3QpICE9IHN0ZDo6X19hZGRyZXNzb2YoX192YWx1ZSkpCisJCV9NX2VyYXNlKF9fZmlyc3QpOworCSAgICAgIGVsc2UKKwkJX19leHRyYSA9IF9fZmlyc3Q7CisJICAgIH0KKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJfQorICAgICAgaWYgKF9fZXh0cmEgIT0gX19sYXN0KQorCV9NX2VyYXNlKF9fZXh0cmEpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgIHVuaXF1ZSgpCisgICAgeworICAgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgICBpdGVyYXRvciBfX2xhc3QgPSBlbmQoKTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm47CisgICAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwl7CisJICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkKKwkgICAgX01fZXJhc2UoX19uZXh0KTsKKwkgIGVsc2UKKwkgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgIF9fbmV4dCA9IF9fZmlyc3Q7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgbWVyZ2UobGlzdCYmIF9feCkKKyNlbHNlCisgICAgbWVyZ2UobGlzdCYgX194KQorI2VuZGlmCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorICAgICAgaWYgKHRoaXMgIT0gJl9feCkKKwl7CisJICBfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzKF9feCk7IAorCisJICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisJICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CisJICBpdGVyYXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOworCSAgaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKwkgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCisJICAgICAgeworCQlpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0MjsKKwkJX01fdHJhbnNmZXIoX19maXJzdDEsIF9fZmlyc3QyLCArK19fbmV4dCk7CisJCV9fZmlyc3QyID0gX19uZXh0OworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgICsrX19maXJzdDE7CisJICBpZiAoX19maXJzdDIgIT0gX19sYXN0MikKKwkgICAgX01fdHJhbnNmZXIoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICB2b2lkCisgICAgICBsaXN0PF9UcCwgX0FsbG9jPjo6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG1lcmdlKGxpc3QmJiBfX3gsIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorI2Vsc2UKKyAgICAgIG1lcmdlKGxpc3QmIF9feCwgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisjZW5kaWYKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorCWlmICh0aGlzICE9ICZfX3gpCisJICB7CisJICAgIF9NX2NoZWNrX2VxdWFsX2FsbG9jYXRvcnMoX194KTsKKworCSAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2luKCk7CisJICAgIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKKwkgICAgaXRlcmF0b3IgX19maXJzdDIgPSBfX3guYmVnaW4oKTsKKwkgICAgaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQoKTsKKwkgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwkgICAgICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkJeworCQkgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3QyOworCQkgIF9NX3RyYW5zZmVyKF9fZmlyc3QxLCBfX2ZpcnN0MiwgKytfX25leHQpOworCQkgIF9fZmlyc3QyID0gX19uZXh0OworCQl9CisJICAgICAgZWxzZQorCQkrK19fZmlyc3QxOworCSAgICBpZiAoX19maXJzdDIgIT0gX19sYXN0MikKKwkgICAgICBfTV90cmFuc2ZlcihfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICBzb3J0KCkKKyAgICB7CisgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBsaXN0IGhhcyBsZW5ndGggMCBvciAxLgorICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0ICE9ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGUKKwkgICYmIHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0LT5fTV9uZXh0ICE9ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpCisgICAgICB7CisgICAgICAgIGxpc3QgX19jYXJyeTsKKyAgICAgICAgbGlzdCBfX3RtcFs2NF07CisgICAgICAgIGxpc3QgKiBfX2ZpbGwgPSAmX190bXBbMF07CisgICAgICAgIGxpc3QgKiBfX2NvdW50ZXI7CisKKyAgICAgICAgZG8KKwkgIHsKKwkgICAgX19jYXJyeS5zcGxpY2UoX19jYXJyeS5iZWdpbigpLCAqdGhpcywgYmVnaW4oKSk7CisKKwkgICAgZm9yKF9fY291bnRlciA9ICZfX3RtcFswXTsKKwkJX19jb3VudGVyICE9IF9fZmlsbCAmJiAhX19jb3VudGVyLT5lbXB0eSgpOworCQkrK19fY291bnRlcikKKwkgICAgICB7CisJCV9fY291bnRlci0+bWVyZ2UoX19jYXJyeSk7CisJCV9fY2Fycnkuc3dhcCgqX19jb3VudGVyKTsKKwkgICAgICB9CisJICAgIF9fY2Fycnkuc3dhcCgqX19jb3VudGVyKTsKKwkgICAgaWYgKF9fY291bnRlciA9PSBfX2ZpbGwpCisJICAgICAgKytfX2ZpbGw7CisJICB9CisJd2hpbGUgKCAhZW1wdHkoKSApOworCisgICAgICAgIGZvciAoX19jb3VudGVyID0gJl9fdG1wWzFdOyBfX2NvdW50ZXIgIT0gX19maWxsOyArK19fY291bnRlcikKKyAgICAgICAgICBfX2NvdW50ZXItPm1lcmdlKCooX19jb3VudGVyIC0gMSkpOworICAgICAgICBzd2FwKCAqKF9fZmlsbCAtIDEpICk7CisgICAgICB9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQorICAgICAgeworICAgICAgICBpdGVyYXRvciBfX2ZpcnN0ID0gYmVnaW4oKTsKKyAgICAgICAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisgICAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIHsKKwkgICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKwkgICAgKytfX25leHQ7CisJICAgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICAgIF9NX2VyYXNlKF9fZmlyc3QpOworCSAgICBfX2ZpcnN0ID0gX19uZXh0OworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgbGlzdDxfVHAsIF9BbGxvYz46OgorICAgICAgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICAgIHsKKyAgICAgICAgaXRlcmF0b3IgX19maXJzdCA9IGJlZ2luKCk7CisgICAgICAgIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOworICAgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm47CisgICAgICAgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisJICB7CisJICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKwkgICAgICBfTV9lcmFzZShfX25leHQpOworCSAgICBlbHNlCisJICAgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgICAgX19uZXh0ID0gX19maXJzdDsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICAgIHZvaWQKKyAgICAgIGxpc3Q8X1RwLCBfQWxsb2M+OjoKKyAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgICAgICB7CisJLy8gRG8gbm90aGluZyBpZiB0aGUgbGlzdCBoYXMgbGVuZ3RoIDAgb3IgMS4KKwlpZiAodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQgIT0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZQorCSAgICAmJiB0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dC0+X01fbmV4dCAhPSAmdGhpcy0+X01faW1wbC5fTV9ub2RlKQorCSAgeworCSAgICBsaXN0IF9fY2Fycnk7CisJICAgIGxpc3QgX190bXBbNjRdOworCSAgICBsaXN0ICogX19maWxsID0gJl9fdG1wWzBdOworCSAgICBsaXN0ICogX19jb3VudGVyOworCisJICAgIGRvCisJICAgICAgeworCQlfX2NhcnJ5LnNwbGljZShfX2NhcnJ5LmJlZ2luKCksICp0aGlzLCBiZWdpbigpKTsKKworCQlmb3IoX19jb3VudGVyID0gJl9fdG1wWzBdOworCQkgICAgX19jb3VudGVyICE9IF9fZmlsbCAmJiAhX19jb3VudGVyLT5lbXB0eSgpOworCQkgICAgKytfX2NvdW50ZXIpCisJCSAgeworCQkgICAgX19jb3VudGVyLT5tZXJnZShfX2NhcnJ5LCBfX2NvbXApOworCQkgICAgX19jYXJyeS5zd2FwKCpfX2NvdW50ZXIpOworCQkgIH0KKwkJX19jYXJyeS5zd2FwKCpfX2NvdW50ZXIpOworCQlpZiAoX19jb3VudGVyID09IF9fZmlsbCkKKwkJICArK19fZmlsbDsKKwkgICAgICB9CisJICAgIHdoaWxlICggIWVtcHR5KCkgKTsKKworCSAgICBmb3IgKF9fY291bnRlciA9ICZfX3RtcFsxXTsgX19jb3VudGVyICE9IF9fZmlsbDsgKytfX2NvdW50ZXIpCisJICAgICAgX19jb3VudGVyLT5tZXJnZSgqKF9fY291bnRlciAtIDEpLCBfX2NvbXApOworCSAgICBzd2FwKCooX19maWxsIC0gMSkpOworCSAgfQorICAgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfTElTVF9UQ0MgKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9jbGFzc2VzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlX2NsYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGJhNzM1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9jbGFzc2VzLmgKQEAgLTAsMCArMSw4MjUgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZV9jbGFzc2VzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjEgIExvY2FsZXMKKy8vCisKKyNpZm5kZWYgX0xPQ0FMRV9DTEFTU0VTX0gKKyNkZWZpbmUgX0xPQ0FMRV9DTEFTU0VTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMi4xLjEgQ2xhc3MgbG9jYWxlCisgIC8qKgorICAgKiAgQGJyaWVmICBDb250YWluZXIgY2xhc3MgZm9yIGxvY2FsaXphdGlvbiBmdW5jdGlvbmFsaXR5LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhlIGxvY2FsZSBjbGFzcyBpcyBmaXJzdCBhIGNsYXNzIHdyYXBwZXIgZm9yIEMgbGlicmFyeSBsb2NhbGVzLiAgSXQgaXMKKyAgICogIGFsc28gYW4gZXh0ZW5zaWJsZSBjb250YWluZXIgZm9yIHVzZXItZGVmaW5lZCBsb2NhbGl6YXRpb24uICBBIGxvY2FsZSBpcworICAgKiAgYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyB0aGF0IGltcGxlbWVudCB2YXJpb3VzIGxvY2FsaXphdGlvbiBmZWF0dXJlcyBzdWNoCisgICAqICBhcyBtb25leSwgdGltZSwgYW5kIG51bWJlciBwcmludGluZy4KKyAgICoKKyAgICogIENvbnN0cnVjdGluZyBDKysgbG9jYWxlcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIEMgbGlicmFyeSBsb2NhbGUuCisgICAqCisgICAqICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgZWZmaWNpZW50IGNvbnN0cnVjdGlvbiBhbmQgY29weWluZyBvZiBsb2NhbGVzCisgICAqICB0aHJvdWdoIGEgcmVmZXJlbmNlIGNvdW50aW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsb2NhbGUgY2xhc3MuCisgICovCisgIGNsYXNzIGxvY2FsZQorICB7CisgIHB1YmxpYzoKKyAgICAvLyBUeXBlczoKKyAgICAvLy8gRGVmaW5pdGlvbiBvZiBsb2NhbGU6OmNhdGVnb3J5LgorICAgIHR5cGVkZWYgaW50CWNhdGVnb3J5OworCisgICAgLy8gRm9yd2FyZCBkZWNscyBhbmQgZnJpZW5kczoKKyAgICBjbGFzcyBmYWNldDsKKyAgICBjbGFzcyBpZDsKKyAgICBjbGFzcyBfSW1wbDsKKworICAgIGZyaWVuZCBjbGFzcyBmYWNldDsKKyAgICBmcmllbmQgY2xhc3MgX0ltcGw7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgYm9vbAorICAgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIHRocm93KCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgY29uc3QgX0ZhY2V0JgorICAgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhY2hlPgorICAgICAgZnJpZW5kIHN0cnVjdCBfX3VzZV9jYWNoZTsKKworICAgIC8vQHsKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDYXRlZ29yeSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiAgVGhlIHN0YW5kYXJkIGNhdGVnb3J5IHZhbHVlcyBhcmUgbm9uZSwgY3R5cGUsIG51bWVyaWMsIGNvbGxhdGUsIHRpbWUsCisgICAgICogIG1vbmV0YXJ5LCBhbmQgbWVzc2FnZXMuICBUaGV5IGZvcm0gYSBiaXRtYXNrIHRoYXQgc3VwcG9ydHMgdW5pb24gYW5kCisgICAgICogIGludGVyc2VjdGlvbi4gIFRoZSBjYXRlZ29yeSBhbGwgaXMgdGhlIHVuaW9uIG9mIHRoZXNlIHZhbHVlcy4KKyAgICAgKgorICAgICAqICBOQjogT3JkZXIgbXVzdCBtYXRjaCBfU19mYWNldF9jYXRlZ29yaWVzIGRlZmluaXRpb24gaW4gbG9jYWxlLmNjCisgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgbm9uZQkJPSAwOworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBjdHlwZQkJPSAxTCA8PCAwOworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBudW1lcmljCT0gMUwgPDwgMTsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgY29sbGF0ZQk9IDFMIDw8IDI7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IHRpbWUJCT0gMUwgPDwgMzsKKyAgICBzdGF0aWMgY29uc3QgY2F0ZWdvcnkgbW9uZXRhcnkJPSAxTCA8PCA0OworICAgIHN0YXRpYyBjb25zdCBjYXRlZ29yeSBtZXNzYWdlcwk9IDFMIDw8IDU7CisgICAgc3RhdGljIGNvbnN0IGNhdGVnb3J5IGFsbAkJPSAoY3R5cGUgfCBudW1lcmljIHwgY29sbGF0ZSB8CisJCQkJCSAgIHRpbWUgIHwgbW9uZXRhcnkgfCBtZXNzYWdlcyk7CisgICAgLy9AfQorCisgICAgLy8gQ29uc3RydWN0L2NvcHkvZGVzdHJveToKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIGdsb2JhbCBsb2NhbGUuICBJZiBubyBsb2NhbGUgaGFzIGJlZW4KKyAgICAgKiAgZXhwbGljaXRseSBzZXQsIHRoaXMgaXMgdGhlIEMgbG9jYWxlLgorICAgICovCisgICAgbG9jYWxlKCkgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIENvcHkgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgQGEgb3RoZXIuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBvdGhlciAgVGhlIGxvY2FsZSB0byBjb3B5LgorICAgICovCisgICAgbG9jYWxlKGNvbnN0IGxvY2FsZSYgX19vdGhlcikgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIE5hbWVkIGxvY2FsZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgY29weSBvZiB0aGUgbmFtZWQgQyBsaWJyYXJ5IGxvY2FsZS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIHMgIE5hbWUgb2YgdGhlIGxvY2FsZSB0byBjb25zdHJ1Y3QuCisgICAgICogIEB0aHJvdyAgc3RkOjpydW50aW1lX2Vycm9yIGlmIHMgaXMgbnVsbCBvciBhbiB1bmRlZmluZWQgbG9jYWxlLgorICAgICovCisgICAgZXhwbGljaXQKKyAgICBsb2NhbGUoY29uc3QgY2hhciogX19zKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBsb2NhbGUgd2l0aCBmYWNldHMgZnJvbSBhbm90aGVyIGxvY2FsZS4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGEgY29weSBvZiB0aGUgbG9jYWxlIEBhIGJhc2UuICBUaGUgZmFjZXRzIHNwZWNpZmllZCBieSBAYQorICAgICAqICBjYXQgYXJlIHJlcGxhY2VkIHdpdGggdGhvc2UgZnJvbSB0aGUgbG9jYWxlIG5hbWVkIGJ5IEBhIHMuICBJZiBiYXNlIGlzCisgICAgICogIG5hbWVkLCB0aGlzIGxvY2FsZSBpbnN0YW5jZSB3aWxsIGFsc28gYmUgbmFtZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBiYXNlICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEBwYXJhbSAgcyAgTmFtZSBvZiB0aGUgbG9jYWxlIHRvIHVzZSBmYWNldHMgZnJvbS4KKyAgICAgKiAgQHBhcmFtICBjYXQgIFNldCBvZiBjYXRlZ29yaWVzIGRlZmluaW5nIHRoZSBmYWNldHMgdG8gdXNlIGZyb20gcy4KKyAgICAgKiAgQHRocm93ICBzdGQ6OnJ1bnRpbWVfZXJyb3IgaWYgcyBpcyBudWxsIG9yIGFuIHVuZGVmaW5lZCBsb2NhbGUuCisgICAgKi8KKyAgICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX2Jhc2UsIGNvbnN0IGNoYXIqIF9fcywgY2F0ZWdvcnkgX19jYXQpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGxvY2FsZSB3aXRoIGZhY2V0cyBmcm9tIGFub3RoZXIgbG9jYWxlLgorICAgICAqCisgICAgICogIENvbnN0cnVjdHMgYSBjb3B5IG9mIHRoZSBsb2NhbGUgQGEgYmFzZS4gIFRoZSBmYWNldHMgc3BlY2lmaWVkIGJ5IEBhCisgICAgICogIGNhdCBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBmcm9tIHRoZSBsb2NhbGUgQGEgYWRkLiAgSWYgQGEgYmFzZSBhbmQgQGEKKyAgICAgKiAgYWRkIGFyZSBuYW1lZCwgdGhpcyBsb2NhbGUgaW5zdGFuY2Ugd2lsbCBhbHNvIGJlIG5hbWVkLgorICAgICAqCisgICAgICogIEBwYXJhbSAgYmFzZSAgVGhlIGxvY2FsZSB0byBjb3B5LgorICAgICAqICBAcGFyYW0gIGFkZCAgVGhlIGxvY2FsZSB0byB1c2UgZmFjZXRzIGZyb20uCisgICAgICogIEBwYXJhbSAgY2F0ICBTZXQgb2YgY2F0ZWdvcmllcyBkZWZpbmluZyB0aGUgZmFjZXRzIHRvIHVzZSBmcm9tIGFkZC4KKyAgICAqLworICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fYmFzZSwgY29uc3QgbG9jYWxlJiBfX2FkZCwgY2F0ZWdvcnkgX19jYXQpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGxvY2FsZSB3aXRoIGFub3RoZXIgZmFjZXQuCisgICAgICoKKyAgICAgKiAgQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIGxvY2FsZSBAYSBvdGhlci4gIFRoZSBmYWNldCBAZiBpcyBhZGRlZCB0bworICAgICAqICBAb3RoZXIsIHJlcGxhY2luZyBhbiBleGlzdGluZyBmYWNldCBvZiB0eXBlIEZhY2V0IGlmIHRoZXJlIGlzIG9uZS4gIElmCisgICAgICogIEBmIGlzIG51bGwsIHRoaXMgbG9jYWxlIGlzIGEgY29weSBvZiBAYSBvdGhlci4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIG90aGVyICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEBwYXJhbSAgZiAgVGhlIGZhY2V0IHRvIGFkZCBpbi4KKyAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICAgIGxvY2FsZShjb25zdCBsb2NhbGUmIF9fb3RoZXIsIF9GYWNldCogX19mKTsKKworICAgIC8vLyBMb2NhbGUgZGVzdHJ1Y3Rvci4KKyAgICB+bG9jYWxlKCkgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIEFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICoKKyAgICAgKiAgU2V0IHRoaXMgbG9jYWxlIHRvIGJlIGEgY29weSBvZiBAYSBvdGhlci4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIG90aGVyICBUaGUgbG9jYWxlIHRvIGNvcHkuCisgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoaXMgbG9jYWxlLgorICAgICovCisgICAgY29uc3QgbG9jYWxlJgorICAgIG9wZXJhdG9yPShjb25zdCBsb2NhbGUmIF9fb3RoZXIpIHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgbG9jYWxlIHdpdGggYW5vdGhlciBmYWNldC4KKyAgICAgKgorICAgICAqICBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhpcyBsb2NhbGUuICBBZGRzIG9yIHJlcGxhY2VzIGFuCisgICAgICogIGV4aXN0aW5nIGZhY2V0IG9mIHR5cGUgRmFjZXQgZnJvbSB0aGUgbG9jYWxlIEBhIG90aGVyIGludG8gdGhlIG5ldworICAgICAqICBsb2NhbGUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBGYWNldCAgVGhlIGZhY2V0IHR5cGUgdG8gY29weSBmcm9tIG90aGVyCisgICAgICogIEBwYXJhbSAgb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29weSBmcm9tLgorICAgICAqICBAcmV0dXJuICBOZXdseSBjb25zdHJ1Y3RlZCBsb2NhbGUuCisgICAgICogIEB0aHJvdyAgc3RkOjpydW50aW1lX2Vycm9yIGlmIG90aGVyIGhhcyBubyBmYWNldCBvZiB0eXBlIEZhY2V0LgorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgbG9jYWxlCisgICAgICBjb21iaW5lKGNvbnN0IGxvY2FsZSYgX19vdGhlcikgY29uc3Q7CisKKyAgICAvLyBMb2NhbGUgb3BlcmF0aW9uczoKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBSZXR1cm4gbG9jYWxlIG5hbWUuCisgICAgICogIEByZXR1cm4gIExvY2FsZSBuYW1lIG9yICIqIiBpZiB1bm5hbWVkLgorICAgICovCisgICAgc3RyaW5nCisgICAgbmFtZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogIEBicmllZiAgTG9jYWxlIGVxdWFsaXR5LgorICAgICAqCisgICAgICogIEBwYXJhbSAgb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqICBAcmV0dXJuICBUcnVlIGlmIG90aGVyIGFuZCB0aGlzIHJlZmVyIHRvIHRoZSBzYW1lIGxvY2FsZSBpbnN0YW5jZSwgYXJlCisgICAgICoJCSBjb3BpZXMsIG9yIGhhdmUgdGhlIHNhbWUgbmFtZS4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICAqLworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxvY2FsZSYgX19vdGhlcikgY29uc3QgdGhyb3coKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIExvY2FsZSBpbmVxdWFsaXR5LgorICAgICAqCisgICAgICogIEBwYXJhbSAgb3RoZXIgIFRoZSBsb2NhbGUgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAqICBAcmV0dXJuICAhICgqdGhpcyA9PSBvdGhlcikKKyAgICAqLworICAgIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGxvY2FsZSYgX19vdGhlcikgY29uc3QgdGhyb3coKQorICAgIHsgcmV0dXJuICEodGhpcy0+b3BlcmF0b3I9PShfX290aGVyKSk7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIENvbXBhcmUgdHdvIHN0cmluZ3MgYWNjb3JkaW5nIHRvIGNvbGxhdGUuCisgICAgICoKKyAgICAgKiAgVGVtcGxhdGUgb3BlcmF0b3IgdG8gY29tcGFyZSB0d28gc3RyaW5ncyB1c2luZyB0aGUgY29tcGFyZSBmdW5jdGlvbiBvZgorICAgICAqICB0aGUgY29sbGF0ZSBmYWNldCBpbiB0aGlzIGxvY2FsZS4gIE9uZSB1c2UgaXMgdG8gcHJvdmlkZSB0aGUgbG9jYWxlIHRvCisgICAgICogIHRoZSBzb3J0IGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGEgdmVjdG9yIHYgb2Ygc3RyaW5ncyBjb3VsZCBiZSBzb3J0ZWQKKyAgICAgKiAgYWNjb3JkaW5nIHRvIGxvY2FsZSBsb2MgYnkgZG9pbmc6CisgICAgICogIEBjb2RlCisgICAgICogIHN0ZDo6c29ydCh2LmJlZ2luKCksIHYuZW5kKCksIGxvYyk7CisgICAgICogIEBlbmRjb2RlCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBzMSAgRmlyc3Qgc3RyaW5nIHRvIGNvbXBhcmUuCisgICAgICogIEBwYXJhbSAgczIgIFNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4KKyAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBjb2xsYXRlPENoYXI+IGZhY2V0IGNvbXBhcmVzIHMxIDwgczIsIGVsc2UgZmFsc2UuCisgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhciwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXIsIF9UcmFpdHMsIF9BbGxvYz4mIF9fczEsCisJCSBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXIsIF9UcmFpdHMsIF9BbGxvYz4mIF9fczIpIGNvbnN0OworCisgICAgLy8gR2xvYmFsIGxvY2FsZSBvYmplY3RzOgorICAgIC8qKgorICAgICAqICBAYnJpZWYgIFNldCBnbG9iYWwgbG9jYWxlCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBnbG9iYWwgbG9jYWxlIHRvIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJucyBhCisgICAgICogIGNvcHkgb2YgdGhlIHByZXZpb3VzIGdsb2JhbCBsb2NhbGUuICBJZiB0aGUgYXJndW1lbnQgaGFzIGEgbmFtZSwgaXQKKyAgICAgKiAgd2lsbCBhbHNvIGNhbGwgc3RkOjpzZXRsb2NhbGUoTENfQUxMLCBsb2MubmFtZSgpKS4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIGxvY2FsZSAgVGhlIG5ldyBsb2NhbGUgdG8gbWFrZSBnbG9iYWwuCisgICAgICogIEByZXR1cm4gIENvcHkgb2YgdGhlIG9sZCBnbG9iYWwgbG9jYWxlLgorICAgICovCisgICAgc3RhdGljIGxvY2FsZQorICAgIGdsb2JhbChjb25zdCBsb2NhbGUmKTsKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFJldHVybiByZWZlcmVuY2UgdG8gdGhlIEMgbG9jYWxlLgorICAgICovCisgICAgc3RhdGljIGNvbnN0IGxvY2FsZSYKKyAgICBjbGFzc2ljKCk7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBUaGUgKHNoYXJlZCkgaW1wbGVtZW50YXRpb24KKyAgICBfSW1wbCoJCV9NX2ltcGw7CisKKyAgICAvLyBUaGUgIkMiIHJlZmVyZW5jZSBsb2NhbGUKKyAgICBzdGF0aWMgX0ltcGwqICAgICAgIF9TX2NsYXNzaWM7CisKKyAgICAvLyBDdXJyZW50IGdsb2JhbCBsb2NhbGUKKyAgICBzdGF0aWMgX0ltcGwqCV9TX2dsb2JhbDsKKworICAgIC8vIE5hbWVzIG9mIHVuZGVybHlpbmcgbG9jYWxlIGNhdGVnb3JpZXMuCisgICAgLy8gTkI6IGxvY2FsZTo6Z2xvYmFsKCkgaGFzIHRvIGtub3cgaG93IHRvIG1vZGlmeSBhbGwgdGhlCisgICAgLy8gdW5kZXJseWluZyBjYXRlZ29yaWVzLCBub3QganVzdCB0aGUgb25lcyByZXF1aXJlZCBieSB0aGUgQysrCisgICAgLy8gc3RhbmRhcmQuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0KiBjb25zdCBfU19jYXRlZ29yaWVzOworCisgICAgLy8gTnVtYmVyIG9mIHN0YW5kYXJkIGNhdGVnb3JpZXMuIEZvciBDKyssIHRoZXNlIGNhdGVnb3JpZXMgYXJlCisgICAgLy8gY29sbGF0ZSwgY3R5cGUsIG1vbmV0YXJ5LCBudW1lcmljLCB0aW1lLCBhbmQgbWVzc2FnZXMuIFRoZXNlCisgICAgLy8gZGlyZWN0bHkgY29ycmVzcG9uZCB0byBJU08gQzk5IG1hY3JvcyBMQ19DT0xMQVRFLCBMQ19DVFlQRSwKKyAgICAvLyBMQ19NT05FVEFSWSwgTENfTlVNRVJJQywgYW5kIExDX1RJTUUuIEluIGFkZGl0aW9uLCBQT1NJWCAoSUVFRQorICAgIC8vIDEwMDMuMS0yMDAxKSBzcGVjaWZpZXMgTENfTUVTU0FHRVMuCisgICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIGNhdGVnb3JpZXMsIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gb3BlcmF0aW5nIHN5c3RlbSBpcyBhbGxvd2VkIHRvIGRlZmluZSBleHRyYSBMQ18qCisgICAgLy8gbWFjcm9zLiBGb3IgR05VIHN5c3RlbXMsIHRoZSBmb2xsb3dpbmcgYXJlIGFsc28gdmFsaWQ6CisgICAgLy8gTENfUEFQRVIsIExDX05BTUUsIExDX0FERFJFU1MsIExDX1RFTEVQSE9ORSwgTENfTUVBU1VSRU1FTlQsCisgICAgLy8gYW5kIExDX0lERU5USUZJQ0FUSU9OLgorICAgIGVudW0geyBfU19jYXRlZ29yaWVzX3NpemUgPSA2ICsgX0dMSUJDWFhfTlVNX0NBVEVHT1JJRVMgfTsKKworI2lmZGVmIF9fR1RIUkVBRFMKKyAgICBzdGF0aWMgX19ndGhyZWFkX29uY2VfdCBfU19vbmNlOworI2VuZGlmCisKKyAgICBleHBsaWNpdAorICAgIGxvY2FsZShfSW1wbCopIHRocm93KCk7CisKKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2luaXRpYWxpemUoKTsKKworICAgIHN0YXRpYyB2b2lkCisgICAgX1NfaW5pdGlhbGl6ZV9vbmNlKCkgdGhyb3coKTsKKworICAgIHN0YXRpYyBjYXRlZ29yeQorICAgIF9TX25vcm1hbGl6ZV9jYXRlZ29yeShjYXRlZ29yeSk7CisKKyAgICB2b2lkCisgICAgX01fY29hbGVzY2UoY29uc3QgbG9jYWxlJiBfX2Jhc2UsIGNvbnN0IGxvY2FsZSYgX19hZGQsIGNhdGVnb3J5IF9fY2F0KTsKKyAgfTsKKworCisgIC8vIDIyLjEuMS4xLjIgIENsYXNzIGxvY2FsZTo6ZmFjZXQKKyAgLyoqCisgICAqICBAYnJpZWYgIExvY2FsaXphdGlvbiBmdW5jdGlvbmFsaXR5IGJhc2UgY2xhc3MuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGUgZmFjZXQgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGEgbG9jYWxpemF0aW9uIGZlYXR1cmUsIHN1Y2ggYXMKKyAgICogIG1vbmV5LCB0aW1lLCBhbmQgbnVtYmVyIHByaW50aW5nLiAgSXQgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGZhY2V0cworICAgKiAgYW5kIHJlZmVyZW5jZSBtYW5hZ2VtZW50LgorICAgKgorICAgKiAgRmFjZXRzIG1heSBub3QgYmUgY29waWVkIG9yIGFzc2lnbmVkLgorICAqLworICBjbGFzcyBsb2NhbGU6OmZhY2V0CisgIHsKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOworICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU6Ol9JbXBsOworCisgICAgbXV0YWJsZSBfQXRvbWljX3dvcmQJCV9NX3JlZmNvdW50OworCisgICAgLy8gQ29udGFpbnMgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nICJDIiBsaWJyYXJ5IGZvciB0aGUgY2xhc3NpYyBsb2NhbGUuCisgICAgc3RhdGljIF9fY19sb2NhbGUgICAgICAgICAgICAgICAgICAgX1NfY19sb2NhbGU7CisKKyAgICAvLyBTdHJpbmcgbGl0ZXJhbCBmb3IgdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWMgbG9jYWxlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyCQkJX1NfY19uYW1lWzJdOworCisjaWZkZWYgX19HVEhSRUFEUworICAgIHN0YXRpYyBfX2d0aHJlYWRfb25jZV90CQlfU19vbmNlOworI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZAorICAgIF9TX2luaXRpYWxpemVfb25jZSgpOworCisgIHByb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBGYWNldCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuICBJZiByZWZzIGlzIDAsIHRoZQorICAgICAqICBmYWNldCBpcyBkZXN0cm95ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2luZyBsb2NhbGUgaXMgZGVzdHJveWVkLgorICAgICAqICBPdGhlcndpc2UgdGhlIGZhY2V0IHdpbGwgbmV2ZXIgYmUgZGVzdHJveWVkLgorICAgICAqCisgICAgICogIEBwYXJhbSByZWZzICBUaGUgaW5pdGlhbCB2YWx1ZSBmb3IgcmVmZXJlbmNlIGNvdW50LgorICAgICovCisgICAgZXhwbGljaXQKKyAgICBmYWNldChzaXplX3QgX19yZWZzID0gMCkgdGhyb3coKSA6IF9NX3JlZmNvdW50KF9fcmVmcyA/IDEgOiAwKQorICAgIHsgfQorCisgICAgLy8vIEZhY2V0IGRlc3RydWN0b3IuCisgICAgdmlydHVhbAorICAgIH5mYWNldCgpOworCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19jcmVhdGVfY19sb2NhbGUoX19jX2xvY2FsZSYgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsCisJCSAgICAgICBfX2NfbG9jYWxlIF9fb2xkID0gMCk7CisKKyAgICBzdGF0aWMgX19jX2xvY2FsZQorICAgIF9TX2Nsb25lX2NfbG9jYWxlKF9fY19sb2NhbGUmIF9fY2xvYykgdGhyb3coKTsKKworICAgIHN0YXRpYyB2b2lkCisgICAgX1NfZGVzdHJveV9jX2xvY2FsZShfX2NfbG9jYWxlJiBfX2Nsb2MpOworCisgICAgc3RhdGljIF9fY19sb2NhbGUKKyAgICBfU19sY19jdHlwZV9jX2xvY2FsZShfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgY2hhciogX19zKTsKKworICAgIC8vIFJldHVybnMgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nICJDIiBsaWJyYXJ5IGRhdGEgZm9yIHRoZQorICAgIC8vIGNsYXNzaWMgbG9jYWxlLgorICAgIHN0YXRpYyBfX2NfbG9jYWxlCisgICAgX1NfZ2V0X2NfbG9jYWxlKCk7CisKKyAgICBfR0xJQkNYWF9DT05TVCBzdGF0aWMgY29uc3QgY2hhcioKKyAgICBfU19nZXRfY19uYW1lKCkgdGhyb3coKTsKKworICBwcml2YXRlOgorICAgIHZvaWQKKyAgICBfTV9hZGRfcmVmZXJlbmNlKCkgY29uc3QgdGhyb3coKQorICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAxKTsgfQorCisgICAgdm9pZAorICAgIF9NX3JlbW92ZV9yZWZlcmVuY2UoKSBjb25zdCB0aHJvdygpCisgICAgeworICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV9yZWZjb3VudCk7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3JlZmNvdW50LCAtMSkgPT0gMSkKKwl7CisgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3JlZmNvdW50KTsKKwkgIF9fdHJ5CisJICAgIHsgZGVsZXRlIHRoaXM7IH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IH0KKwl9CisgICAgfQorCisgICAgZmFjZXQoY29uc3QgZmFjZXQmKTsgIC8vIE5vdCBkZWZpbmVkLgorCisgICAgZmFjZXQmCisgICAgb3BlcmF0b3I9KGNvbnN0IGZhY2V0Jik7ICAvLyBOb3QgZGVmaW5lZC4KKyAgfTsKKworCisgIC8vIDIyLjEuMS4xLjMgQ2xhc3MgbG9jYWxlOjppZAorICAvKioKKyAgICogIEBicmllZiAgRmFjZXQgSUQgY2xhc3MuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGUgSUQgY2xhc3MgcHJvdmlkZXMgZmFjZXRzIHdpdGggYW4gaW5kZXggdXNlZCB0byBpZGVudGlmeSB0aGVtLgorICAgKiAgRXZlcnkgZmFjZXQgY2xhc3MgbXVzdCBkZWZpbmUgYSBwdWJsaWMgc3RhdGljIG1lbWJlciBsb2NhbGU6OmlkLCBvciBiZQorICAgKiAgZGVyaXZlZCBmcm9tIGEgZmFjZXQgdGhhdCBwcm92aWRlcyB0aGlzIG1lbWJlciwgb3RoZXJ3aXNlIHRoZSBmYWNldAorICAgKiAgY2Fubm90IGJlIHVzZWQgaW4gYSBsb2NhbGUuICBUaGUgbG9jYWxlOjppZCBlbnN1cmVzIHRoYXQgZWFjaCBjbGFzcworICAgKiAgdHlwZSBnZXRzIGEgdW5pcXVlIGlkZW50aWZpZXIuCisgICovCisgIGNsYXNzIGxvY2FsZTo6aWQKKyAgeworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU7CisgICAgZnJpZW5kIGNsYXNzIGxvY2FsZTo6X0ltcGw7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgICBmcmllbmQgY29uc3QgX0ZhY2V0JgorICAgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOworCisgICAgLy8gTkI6IFRoZXJlIGlzIG5vIGFjY2Vzc29yIGZvciBfTV9pbmRleCBiZWNhdXNlIGl0IG1heSBiZSB1c2VkCisgICAgLy8gYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBpcyBydW47IHRoZSBlZmZlY3Qgb2YgY2FsbGluZyBhIG1lbWJlcgorICAgIC8vIGZ1bmN0aW9uIChldmVuIGFuIGlubGluZSkgd291bGQgYmUgdW5kZWZpbmVkLgorICAgIG11dGFibGUgc2l6ZV90CQlfTV9pbmRleDsKKworICAgIC8vIExhc3QgaWQgbnVtYmVyIGFzc2lnbmVkLgorICAgIHN0YXRpYyBfQXRvbWljX3dvcmQJCV9TX3JlZmNvdW50OworCisgICAgdm9pZAorICAgIG9wZXJhdG9yPShjb25zdCBpZCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgICBpZChjb25zdCBpZCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgcHVibGljOgorICAgIC8vIE5COiBUaGlzIGNsYXNzIGlzIGFsd2F5cyBhIHN0YXRpYyBkYXRhIG1lbWJlciwgYW5kIHRodXMgY2FuIGJlCisgICAgLy8gY291bnRlZCBvbiB0byBiZSB6ZXJvLWluaXRpYWxpemVkLgorICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICBpZCgpIHsgfQorCisgICAgc2l6ZV90CisgICAgX01faWQoKSBjb25zdCB0aHJvdygpOworICB9OworCisKKyAgLy8gSW1wbGVtZW50YXRpb24gb2JqZWN0IGZvciBsb2NhbGUuCisgIGNsYXNzIGxvY2FsZTo6X0ltcGwKKyAgeworICBwdWJsaWM6CisgICAgLy8gRnJpZW5kcy4KKyAgICBmcmllbmQgY2xhc3MgbG9jYWxlOworICAgIGZyaWVuZCBjbGFzcyBsb2NhbGU6OmZhY2V0OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmKSB0aHJvdygpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgZnJpZW5kIGNvbnN0IF9GYWNldCYKKyAgICAgIHVzZV9mYWNldChjb25zdCBsb2NhbGUmKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWNoZT4KKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX191c2VfY2FjaGU7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBEYXRhIE1lbWJlcnMuCisgICAgX0F0b21pY193b3JkCQkJX01fcmVmY291bnQ7CisgICAgY29uc3QgZmFjZXQqKgkJCV9NX2ZhY2V0czsKKyAgICBzaXplX3QJCQkJX01fZmFjZXRzX3NpemU7CisgICAgY29uc3QgZmFjZXQqKgkJCV9NX2NhY2hlczsKKyAgICBjaGFyKioJCQkJX01fbmFtZXM7CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX2N0eXBlW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX251bWVyaWNbXTsKKyAgICBzdGF0aWMgY29uc3QgbG9jYWxlOjppZCogY29uc3QJX1NfaWRfY29sbGF0ZVtdOworICAgIHN0YXRpYyBjb25zdCBsb2NhbGU6OmlkKiBjb25zdAlfU19pZF90aW1lW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX21vbmV0YXJ5W107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0CV9TX2lkX21lc3NhZ2VzW107CisgICAgc3RhdGljIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0KiBjb25zdCBfU19mYWNldF9jYXRlZ29yaWVzW107CisKKyAgICB2b2lkCisgICAgX01fYWRkX3JlZmVyZW5jZSgpIHRocm93KCkKKyAgICB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV9yZWZjb3VudCwgMSk7IH0KKworICAgIHZvaWQKKyAgICBfTV9yZW1vdmVfcmVmZXJlbmNlKCkgdGhyb3coKQorICAgIHsKKyAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fcmVmY291bnQpOworICAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV9yZWZjb3VudCwgLTEpID09IDEpCisJeworICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV9yZWZjb3VudCk7CisJICBfX3RyeQorCSAgICB7IGRlbGV0ZSB0aGlzOyB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB9CisJfQorICAgIH0KKworICAgIF9JbXBsKGNvbnN0IF9JbXBsJiwgc2l6ZV90KTsKKyAgICBfSW1wbChjb25zdCBjaGFyKiwgc2l6ZV90KTsKKyAgICBfSW1wbChzaXplX3QpIHRocm93KCk7CisKKyAgIH5fSW1wbCgpIHRocm93KCk7CisKKyAgICBfSW1wbChjb25zdCBfSW1wbCYpOyAgLy8gTm90IGRlZmluZWQuCisKKyAgICB2b2lkCisgICAgb3BlcmF0b3I9KGNvbnN0IF9JbXBsJik7ICAvLyBOb3QgZGVmaW5lZC4KKworICAgIGJvb2wKKyAgICBfTV9jaGVja19zYW1lX25hbWUoKQorICAgIHsKKyAgICAgIGJvb2wgX19yZXQgPSB0cnVlOworICAgICAgaWYgKF9NX25hbWVzWzFdKQorCS8vIFdlIG11c3QgYWN0dWFsbHkgY29tcGFyZSBhbGwgdGhlIF9NX25hbWVzOiBjYW4gYmUgYWxsIGVxdWFsIQorCWZvciAoc2l6ZV90IF9faSA9IDA7IF9fcmV0ICYmIF9faSA8IF9TX2NhdGVnb3JpZXNfc2l6ZSAtIDE7ICsrX19pKQorCSAgX19yZXQgPSBfX2J1aWx0aW5fc3RyY21wKF9NX25hbWVzW19faV0sIF9NX25hbWVzW19faSArIDFdKSA9PSAwOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9yZXBsYWNlX2NhdGVnb3JpZXMoY29uc3QgX0ltcGwqLCBjYXRlZ29yeSk7CisKKyAgICB2b2lkCisgICAgX01fcmVwbGFjZV9jYXRlZ29yeShjb25zdCBfSW1wbCosIGNvbnN0IGxvY2FsZTo6aWQqIGNvbnN0Kik7CisKKyAgICB2b2lkCisgICAgX01fcmVwbGFjZV9mYWNldChjb25zdCBfSW1wbCosIGNvbnN0IGxvY2FsZTo6aWQqKTsKKworICAgIHZvaWQKKyAgICBfTV9pbnN0YWxsX2ZhY2V0KGNvbnN0IGxvY2FsZTo6aWQqLCBjb25zdCBmYWNldCopOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgICAgdm9pZAorICAgICAgX01faW5pdF9mYWNldChfRmFjZXQqIF9fZmFjZXQpCisgICAgICB7IF9NX2luc3RhbGxfZmFjZXQoJl9GYWNldDo6aWQsIF9fZmFjZXQpOyB9CisKKyAgICB2b2lkCisgICAgX01faW5zdGFsbF9jYWNoZShjb25zdCBmYWNldCosIHNpemVfdCk7CisgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgZmFjZXQuCisgICAqCisgICAqICBoYXNfZmFjZXQgdGVzdHMgdGhlIGxvY2FsZSBhcmd1bWVudCBmb3IgdGhlIHByZXNlbmNlIG9mIHRoZSBmYWNldCB0eXBlCisgICAqICBwcm92aWRlZCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLiAgRmFjZXRzIGRlcml2ZWQgZnJvbSB0aGUgZmFjZXQKKyAgICogIHBhcmFtZXRlciB3aWxsIGFsc28gcmV0dXJuIHRydWUuCisgICAqCisgICAqICBAcGFyYW0gIEZhY2V0ICBUaGUgZmFjZXQgdHlwZSB0byB0ZXN0IHRoZSBwcmVzZW5jZSBvZi4KKyAgICogIEBwYXJhbSAgbG9jYWxlICBUaGUgbG9jYWxlIHRvIHRlc3QuCisgICAqICBAcmV0dXJuICB0cnVlIGlmIGxvY2FsZSBjb250YWlucyBhIGZhY2V0IG9mIHR5cGUgRmFjZXQsIGVsc2UgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBib29sCisgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpIHRocm93KCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhIGZhY2V0LgorICAgKgorICAgKiAgdXNlX2ZhY2V0IGxvb2tzIGZvciBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGZhY2V0IG9mIHR5cGUgRmFjZXQKKyAgICogIHdoZXJlIEZhY2V0IGlzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICBJZiBoYXNfZmFjZXQobG9jYWxlKSBpcyB0cnVlLAorICAgKiAgdGhlcmUgaXMgYSBzdWl0YWJsZSBmYWNldCB0byByZXR1cm4uICBJdCB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUKKyAgICogIGxvY2FsZSBkb2Vzbid0IGNvbnRhaW4gYSBmYWNldCBvZiB0eXBlIEZhY2V0LgorICAgKgorICAgKiAgQHBhcmFtICBGYWNldCAgVGhlIGZhY2V0IHR5cGUgdG8gYWNjZXNzLgorICAgKiAgQHBhcmFtICBsb2NhbGUgIFRoZSBsb2NhbGUgdG8gdXNlLgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIGZhY2V0IG9mIHR5cGUgRmFjZXQuCisgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2Nhc3QgaWYgbG9jYWxlIGRvZXNuJ3QgY29udGFpbiBhIGZhY2V0IG9mIHR5cGUgRmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBjb25zdCBfRmFjZXQmCisgICAgdXNlX2ZhY2V0KGNvbnN0IGxvY2FsZSYgX19sb2MpOworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZhY2V0IGZvciBsb2NhbGl6ZWQgc3RyaW5nIGNvbXBhcmlzb24uCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBjb21wYXJlIHN0cmluZ3MgaW4gYSBsb2NhbGl6ZWQKKyAgICogIG1hbm5lci4KKyAgICoKKyAgICogIFRoZSBjb2xsYXRlIHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUKKyAgICogIHRoZSBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlIGNhbGwgdG8KKyAgICogIHRoZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBob29rcyBmb3IKKyAgICogIGRldmVsb3BlcnMgdG8gaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbSB0aGUKKyAgICogIGNvbGxhdGUgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjb2xsYXRlIDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBVbmRlcmx5aW5nICJDIiBsaWJyYXJ5IGxvY2FsZSBpbmZvcm1hdGlvbiBzYXZlZCBmcm9tCisgICAgICAvLyBpbml0aWFsaXphdGlvbiwgbmVlZGVkIGJ5IGNvbGxhdGVfYnluYW1lIGFzIHdlbGwuCisgICAgICBfX2NfbG9jYWxlCQkJX01fY19sb2NhbGVfY29sbGF0ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIHJlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY29sbGF0ZShzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fY19sb2NhbGVfY29sbGF0ZShfU19nZXRfY19sb2NhbGUoKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIHJlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY29sbGF0ZShfX2NfbG9jYWxlIF9fY2xvYywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2NfbG9jYWxlX2NvbGxhdGUoX1NfY2xvbmVfY19sb2NhbGUoX19jbG9jKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgdHdvIHN0cmluZ3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdHdvIHN0cmluZ3MgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBieSBjYWxsaW5nCisgICAgICAgKiAgY29sbGF0ZTo6ZG9fY29tcGFyZSgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8xICBTdGFydCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gaGkxICBFbmQgb2Ygc3RyaW5nIDEuCisgICAgICAgKiAgQHBhcmFtIGxvMiAgU3RhcnQgb2Ygc3RyaW5nIDIuCisgICAgICAgKiAgQHBhcmFtIGhpMiAgRW5kIG9mIHN0cmluZyAyLgorICAgICAgICogIEByZXR1cm4gIDEgaWYgc3RyaW5nMSA+IHN0cmluZzIsIC0xIGlmIHN0cmluZzEgPCBzdHJpbmcyLCBlbHNlIDAuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IF9DaGFyVCogX19sbzEsIGNvbnN0IF9DaGFyVCogX19oaTEsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2xvMiwgY29uc3QgX0NoYXJUKiBfX2hpMikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2NvbXBhcmUoX19sbzEsIF9faGkxLCBfX2xvMiwgX19oaTIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVHJhbnNmb3JtIHN0cmluZyB0byBjb21wYXJhYmxlIGZvcm0uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciBzdHJ4ZnJtIGZ1bmN0aW9uYWxpdHkuICBJdCB0YWtlcyB0aGUKKyAgICAgICAqICBpbnB1dCBzdHJpbmcgYW5kIHJldHVybnMgYSBtb2RpZmllZCBzdHJpbmcgdGhhdCBjYW4gYmUgZGlyZWN0bHkKKyAgICAgICAqICBjb21wYXJlZCB0byBvdGhlciB0cmFuc2Zvcm1lZCBzdHJpbmdzLiAgSW4gdGhlIEMgbG9jYWxlLCB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24ganVzdCByZXR1cm5zIGEgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nLiAgSW4gc29tZSBvdGhlcgorICAgICAgICogIGxvY2FsZXMsIGl0IG1heSByZXBsYWNlIHR3byBjaGFycyB3aXRoIG9uZSwgY2hhbmdlIGEgY2hhciBmb3IKKyAgICAgICAqICBhbm90aGVyLCBldGMuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyBjb2xsYXRlOjpkb190cmFuc2Zvcm0oKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBTdGFydCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIGhpICBFbmQgb2Ygc3RyaW5nLgorICAgICAgICogIEByZXR1cm4gIFRyYW5zZm9ybWVkIHN0cmluZ190eXBlLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICB0cmFuc2Zvcm0oY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190cmFuc2Zvcm0oX19sbywgX19oaSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gaGFzaCBvZiBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhbmQgcmV0dXJucyBhIGhhc2ggb24gdGhlIGlucHV0IHN0cmluZy4gIEl0CisgICAgICAgKiAgZG9lcyBzbyBieSByZXR1cm5pbmcgY29sbGF0ZTo6ZG9faGFzaCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFN0YXJ0IG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gaGkgIEVuZCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHJldHVybiAgSGFzaCB2YWx1ZS4KKyAgICAgICovCisgICAgICBsb25nCisgICAgICBoYXNoKGNvbnN0IF9DaGFyVCogX19sbywgY29uc3QgX0NoYXJUKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9faGFzaChfX2xvLCBfX2hpKTsgfQorCisgICAgICAvLyBVc2VkIHRvIGFic3RyYWN0IG91dCBfQ2hhclQgYml0cyBpbiB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMsIGJlbG93LgorICAgICAgaW50CisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9DaGFyVCosIGNvbnN0IF9DaGFyVCopIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHNpemVfdAorICAgICAgX01fdHJhbnNmb3JtKF9DaGFyVCosIGNvbnN0IF9DaGFyVCosIHNpemVfdCkgY29uc3QgdGhyb3coKTsKKworICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2xsYXRlKCkKKyAgICAgIHsgX1NfZGVzdHJveV9jX2xvY2FsZShfTV9jX2xvY2FsZV9jb2xsYXRlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgdHdvIHN0cmluZ3MuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICogIHJldHVybmVkLiAgQHNlZSBjb21wYXJlKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbzEgIFN0YXJ0IG9mIHN0cmluZyAxLgorICAgICAgICogIEBwYXJhbSBoaTEgIEVuZCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gbG8yICBTdGFydCBvZiBzdHJpbmcgMi4KKyAgICAgICAqICBAcGFyYW0gaGkyICBFbmQgb2Ygc3RyaW5nIDIuCisgICAgICAgKiAgQHJldHVybiAgMSBpZiBzdHJpbmcxID4gc3RyaW5nMiwgLTEgaWYgc3RyaW5nMSA8IHN0cmluZzIsIGVsc2UgMC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludAorICAgICAgZG9fY29tcGFyZShjb25zdCBfQ2hhclQqIF9fbG8xLCBjb25zdCBfQ2hhclQqIF9faGkxLAorCQkgY29uc3QgX0NoYXJUKiBfX2xvMiwgY29uc3QgX0NoYXJUKiBfX2hpMikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVHJhbnNmb3JtIHN0cmluZyB0byBjb21wYXJhYmxlIGZvcm0uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICogIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8xICBTdGFydCBvZiBzdHJpbmcgMS4KKyAgICAgICAqICBAcGFyYW0gaGkxICBFbmQgb2Ygc3RyaW5nIDEuCisgICAgICAgKiAgQHBhcmFtIGxvMiAgU3RhcnQgb2Ygc3RyaW5nIDIuCisgICAgICAgKiAgQHBhcmFtIGhpMiAgRW5kIG9mIHN0cmluZyAyLgorICAgICAgICogIEByZXR1cm4gIDEgaWYgc3RyaW5nMSA+IHN0cmluZzIsIC0xIGlmIHN0cmluZzEgPCBzdHJpbmcyLCBlbHNlIDAuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fdHJhbnNmb3JtKGNvbnN0IF9DaGFyVCogX19sbywgY29uc3QgX0NoYXJUKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gaGFzaCBvZiBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhbmQgcmV0dXJucyBhIGhhc2ggb24gdGhlIGlucHV0IHN0cmluZy4gIFRoaXMKKyAgICAgICAqICBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFN0YXJ0IG9mIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gaGkgIEVuZCBvZiBzdHJpbmcuCisgICAgICAgKiAgQHJldHVybiAgSGFzaCB2YWx1ZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGxvbmcKKyAgICAgIGRvX2hhc2goY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGxvY2FsZTo6aWQgY29sbGF0ZTxfQ2hhclQ+OjppZDsKKworICAvLyBTcGVjaWFsaXphdGlvbnMuCisgIHRlbXBsYXRlPD4KKyAgICBpbnQKKyAgICBjb2xsYXRlPGNoYXI+OjpfTV9jb21wYXJlKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKikgY29uc3QgdGhyb3coKTsKKworICB0ZW1wbGF0ZTw+CisgICAgc2l6ZV90CisgICAgY29sbGF0ZTxjaGFyPjo6X01fdHJhbnNmb3JtKGNoYXIqLCBjb25zdCBjaGFyKiwgc2l6ZV90KSBjb25zdCB0aHJvdygpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIGludAorICAgIGNvbGxhdGU8d2NoYXJfdD46Ol9NX2NvbXBhcmUoY29uc3Qgd2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqKSBjb25zdCB0aHJvdygpOworCisgIHRlbXBsYXRlPD4KKyAgICBzaXplX3QKKyAgICBjb2xsYXRlPHdjaGFyX3Q+OjpfTV90cmFuc2Zvcm0od2NoYXJfdCosIGNvbnN0IHdjaGFyX3QqLCBzaXplX3QpIGNvbnN0IHRocm93KCk7CisjZW5kaWYKKworICAvLy8gY2xhc3MgY29sbGF0ZV9ieW5hbWUgWzIyLjIuNC4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIGNvbGxhdGVfYnluYW1lIDogcHVibGljIGNvbGxhdGU8X0NoYXJUPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4gc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb2xsYXRlX2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBjb2xsYXRlPF9DaGFyVD4oX19yZWZzKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgIkMiKSAhPSAwCisJICAgICYmIF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiUE9TSVgiKSAhPSAwKQorCSAgeworCSAgICB0aGlzLT5fU19kZXN0cm95X2NfbG9jYWxlKHRoaXMtPl9NX2NfbG9jYWxlX2NvbGxhdGUpOworCSAgICB0aGlzLT5fU19jcmVhdGVfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfY29sbGF0ZSwgX19zKTsKKwkgIH0KKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jb2xsYXRlX2J5bmFtZSgpIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworIyBpbmNsdWRlIDxiaXRzL2xvY2FsZV9jbGFzc2VzLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlX2NsYXNzZXMudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9jbGFzc2VzLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjI5MDFhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9jbGFzc2VzLnRjYwpAQCAtMCwwICsxLDI3MyBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZV9jbGFzc2VzLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworI2lmbmRlZiBfTE9DQUxFX0NMQVNTRVNfVENDCisjZGVmaW5lIF9MT0NBTEVfQ0xBU1NFU19UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgbG9jYWxlOjoKKyAgICBsb2NhbGUoY29uc3QgbG9jYWxlJiBfX290aGVyLCBfRmFjZXQqIF9fZikKKyAgICB7CisgICAgICBfTV9pbXBsID0gbmV3IF9JbXBsKCpfX290aGVyLl9NX2ltcGwsIDEpOworCisgICAgICBfX3RyeQorCXsgX01faW1wbC0+X01faW5zdGFsbF9mYWNldCgmX0ZhY2V0OjppZCwgX19mKTsgfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX01faW1wbC0+X01fcmVtb3ZlX3JlZmVyZW5jZSgpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgZGVsZXRlIFtdIF9NX2ltcGwtPl9NX25hbWVzWzBdOworICAgICAgX01faW1wbC0+X01fbmFtZXNbMF0gPSAwOyAgIC8vIFVubmFtZWQuCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBsb2NhbGUKKyAgICBsb2NhbGU6OgorICAgIGNvbWJpbmUoY29uc3QgbG9jYWxlJiBfX290aGVyKSBjb25zdAorICAgIHsKKyAgICAgIF9JbXBsKiBfX3RtcCA9IG5ldyBfSW1wbCgqX01faW1wbCwgMSk7CisgICAgICBfX3RyeQorCXsKKwkgIF9fdG1wLT5fTV9yZXBsYWNlX2ZhY2V0KF9fb3RoZXIuX01faW1wbCwgJl9GYWNldDo6aWQpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9fdG1wLT5fTV9yZW1vdmVfcmVmZXJlbmNlKCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICByZXR1cm4gbG9jYWxlKF9fdG1wKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIGxvY2FsZTo6CisgICAgb3BlcmF0b3IoKShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MxLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MyKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpjb2xsYXRlPF9DaGFyVD4gX19jb2xsYXRlX3R5cGU7CisgICAgICBjb25zdCBfX2NvbGxhdGVfdHlwZSYgX19jb2xsYXRlID0gdXNlX2ZhY2V0PF9fY29sbGF0ZV90eXBlPigqdGhpcyk7CisgICAgICByZXR1cm4gKF9fY29sbGF0ZS5jb21wYXJlKF9fczEuZGF0YSgpLCBfX3MxLmRhdGEoKSArIF9fczEubGVuZ3RoKCksCisJCQkJX19zMi5kYXRhKCksIF9fczIuZGF0YSgpICsgX19zMi5sZW5ndGgoKSkgPCAwKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgYm9vbAorICAgIGhhc19mYWNldChjb25zdCBsb2NhbGUmIF9fbG9jKSB0aHJvdygpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9faSA9IF9GYWNldDo6aWQuX01faWQoKTsKKyAgICAgIGNvbnN0IGxvY2FsZTo6ZmFjZXQqKiBfX2ZhY2V0cyA9IF9fbG9jLl9NX2ltcGwtPl9NX2ZhY2V0czsKKyAgICAgIHJldHVybiAoX19pIDwgX19sb2MuX01faW1wbC0+X01fZmFjZXRzX3NpemUKKyNpZmRlZiBfX0dYWF9SVFRJCisJICAgICAgJiYgZHluYW1pY19jYXN0PGNvbnN0IF9GYWNldCo+KF9fZmFjZXRzW19faV0pKTsKKyNlbHNlCisgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0PGNvbnN0IF9GYWNldCo+KF9fZmFjZXRzW19faV0pKTsKKyNlbmRpZgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRmFjZXQ+CisgICAgY29uc3QgX0ZhY2V0JgorICAgIHVzZV9mYWNldChjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2kgPSBfRmFjZXQ6OmlkLl9NX2lkKCk7CisgICAgICBjb25zdCBsb2NhbGU6OmZhY2V0KiogX19mYWNldHMgPSBfX2xvYy5fTV9pbXBsLT5fTV9mYWNldHM7CisgICAgICBpZiAoX19pID49IF9fbG9jLl9NX2ltcGwtPl9NX2ZhY2V0c19zaXplIHx8ICFfX2ZhY2V0c1tfX2ldKQorICAgICAgICBfX3Rocm93X2JhZF9jYXN0KCk7CisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgcmV0dXJuIGR5bmFtaWNfY2FzdDxjb25zdCBfRmFjZXQmPigqX19mYWNldHNbX19pXSk7CisjZWxzZQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9GYWNldCY+KCpfX2ZhY2V0c1tfX2ldKTsKKyNlbmRpZgorICAgIH0KKworCisgIC8vIEdlbmVyaWMgdmVyc2lvbiBkb2VzIG5vdGhpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbnQKKyAgICBjb2xsYXRlPF9DaGFyVD46Ol9NX2NvbXBhcmUoY29uc3QgX0NoYXJUKiwgY29uc3QgX0NoYXJUKikgY29uc3QgdGhyb3cgKCkKKyAgICB7IHJldHVybiAwOyB9CisKKyAgLy8gR2VuZXJpYyB2ZXJzaW9uIGRvZXMgbm90aGluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHNpemVfdAorICAgIGNvbGxhdGU8X0NoYXJUPjo6X01fdHJhbnNmb3JtKF9DaGFyVCosIGNvbnN0IF9DaGFyVCosIHNpemVfdCkgY29uc3QgdGhyb3cgKCkKKyAgICB7IHJldHVybiAwOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGludAorICAgIGNvbGxhdGU8X0NoYXJUPjo6CisgICAgZG9fY29tcGFyZShjb25zdCBfQ2hhclQqIF9fbG8xLCBjb25zdCBfQ2hhclQqIF9faGkxLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fbG8yLCBjb25zdCBfQ2hhclQqIF9faGkyKSBjb25zdAorICAgIHsKKyAgICAgIC8vIHN0cmNvbGwgYXNzdW1lcyB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncyBzbyB3ZSBtYWtlIGEgY29weQorICAgICAgLy8gYW5kIHRoZW4gcHV0IGEgemVybyBhdCB0aGUgZW5kLgorICAgICAgY29uc3Qgc3RyaW5nX3R5cGUgX19vbmUoX19sbzEsIF9faGkxKTsKKyAgICAgIGNvbnN0IHN0cmluZ190eXBlIF9fdHdvKF9fbG8yLCBfX2hpMik7CisKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wID0gX19vbmUuY19zdHIoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCogX19wZW5kID0gX19vbmUuZGF0YSgpICsgX19vbmUubGVuZ3RoKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcSA9IF9fdHdvLmNfc3RyKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcWVuZCA9IF9fdHdvLmRhdGEoKSArIF9fdHdvLmxlbmd0aCgpOworCisgICAgICAvLyBzdHJjb2xsIHN0b3BzIHdoZW4gaXQgc2VlcyBhIG51bCBjaGFyYWN0ZXIgc28gd2UgYnJlYWsKKyAgICAgIC8vIHRoZSBzdHJpbmdzIGludG8gemVyby10ZXJtaW5hdGVkIHN1YnN0cmluZ3MgYW5kIHBhc3MgdGhvc2UKKyAgICAgIC8vIHRvIHN0cmNvbGwuCisgICAgICBmb3IgKDs7KQorCXsKKwkgIGNvbnN0IGludCBfX3JlcyA9IF9NX2NvbXBhcmUoX19wLCBfX3EpOworCSAgaWYgKF9fcmVzKQorCSAgICByZXR1cm4gX19yZXM7CisKKwkgIF9fcCArPSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19wKTsKKwkgIF9fcSArPSBjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19xKTsKKwkgIGlmIChfX3AgPT0gX19wZW5kICYmIF9fcSA9PSBfX3FlbmQpCisJICAgIHJldHVybiAwOworCSAgZWxzZSBpZiAoX19wID09IF9fcGVuZCkKKwkgICAgcmV0dXJuIC0xOworCSAgZWxzZSBpZiAoX19xID09IF9fcWVuZCkKKwkgICAgcmV0dXJuIDE7CisKKwkgIF9fcCsrOworCSAgX19xKys7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgY29sbGF0ZTxfQ2hhclQ+OjpzdHJpbmdfdHlwZQorICAgIGNvbGxhdGU8X0NoYXJUPjo6CisgICAgZG9fdHJhbnNmb3JtKGNvbnN0IF9DaGFyVCogX19sbywgY29uc3QgX0NoYXJUKiBfX2hpKSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZ190eXBlIF9fcmV0OworCisgICAgICAvLyBzdHJ4ZnJtIGFzc3VtZXMgemVyby10ZXJtaW5hdGVkIHN0cmluZ3Mgc28gd2UgbWFrZSBhIGNvcHkKKyAgICAgIGNvbnN0IHN0cmluZ190eXBlIF9fc3RyKF9fbG8sIF9faGkpOworCisgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fc3RyLmNfc3RyKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcGVuZCA9IF9fc3RyLmRhdGEoKSArIF9fc3RyLmxlbmd0aCgpOworCisgICAgICBzaXplX3QgX19sZW4gPSAoX19oaSAtIF9fbG8pICogMjsKKworICAgICAgX0NoYXJUKiBfX2MgPSBuZXcgX0NoYXJUW19fbGVuXTsKKworICAgICAgX190cnkKKwl7CisJICAvLyBzdHJ4ZnJtIHN0b3BzIHdoZW4gaXQgc2VlcyBhIG51bCBjaGFyYWN0ZXIgc28gd2UgYnJlYWsKKwkgIC8vIHRoZSBzdHJpbmcgaW50byB6ZXJvLXRlcm1pbmF0ZWQgc3Vic3RyaW5ncyBhbmQgcGFzcyB0aG9zZQorCSAgLy8gdG8gc3RyeGZybS4KKwkgIGZvciAoOzspCisJICAgIHsKKwkgICAgICAvLyBGaXJzdCB0cnkgYSBidWZmZXIgcGVyaGFwcyBiaWcgZW5vdWdoLgorCSAgICAgIHNpemVfdCBfX3JlcyA9IF9NX3RyYW5zZm9ybShfX2MsIF9fcCwgX19sZW4pOworCSAgICAgIC8vIElmIHRoZSBidWZmZXIgd2FzIG5vdCBsYXJnZSBlbm91Z2gsIHRyeSBhZ2FpbiB3aXRoIHRoZQorCSAgICAgIC8vIGNvcnJlY3Qgc2l6ZS4KKwkgICAgICBpZiAoX19yZXMgPj0gX19sZW4pCisJCXsKKwkJICBfX2xlbiA9IF9fcmVzICsgMTsKKwkJICBkZWxldGUgW10gX19jLCBfX2MgPSAwOworCQkgIF9fYyA9IG5ldyBfQ2hhclRbX19sZW5dOworCQkgIF9fcmVzID0gX01fdHJhbnNmb3JtKF9fYywgX19wLCBfX2xlbik7CisJCX0KKworCSAgICAgIF9fcmV0LmFwcGVuZChfX2MsIF9fcmVzKTsKKwkgICAgICBfX3AgKz0gY2hhcl90cmFpdHM8X0NoYXJUPjo6bGVuZ3RoKF9fcCk7CisJICAgICAgaWYgKF9fcCA9PSBfX3BlbmQpCisJCWJyZWFrOworCisJICAgICAgX19wKys7CisJICAgICAgX19yZXQucHVzaF9iYWNrKF9DaGFyVCgpKTsKKwkgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGRlbGV0ZSBbXSBfX2M7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisKKyAgICAgIGRlbGV0ZSBbXSBfX2M7CisKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGxvbmcKKyAgICBjb2xsYXRlPF9DaGFyVD46OgorICAgIGRvX2hhc2goY29uc3QgX0NoYXJUKiBfX2xvLCBjb25zdCBfQ2hhclQqIF9faGkpIGNvbnN0CisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBfX3ZhbCA9IDA7CisgICAgICBmb3IgKDsgX19sbyA8IF9faGk7ICsrX19sbykKKwlfX3ZhbCA9CisJICAqX19sbyArICgoX192YWwgPDwgNykKKwkJICAgfCAoX192YWwgPj4gKF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czx1bnNpZ25lZCBsb25nPjo6CisJCQkJX19kaWdpdHMgLSA3KSkpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KF9fdmFsKTsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjb2xsYXRlPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgY29sbGF0ZV9ieW5hbWU8Y2hhcj47CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgY29sbGF0ZTxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8Y29sbGF0ZTxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8Y29sbGF0ZTxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGNvbGxhdGU8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBjb2xsYXRlPHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxjb2xsYXRlPHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjb2xsYXRlPHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9sb2NhbGVfZmFjZXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlX2ZhY2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjQ5YzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlX2ZhY2V0cy5oCkBAIC0wLDAgKzEsMjYyMyBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2ZhY2V0cy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisjaWZuZGVmIF9MT0NBTEVfRkFDRVRTX0gKKyNkZWZpbmUgX0xPQ0FMRV9GQUNFVFNfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGN3Y3R5cGU+CS8vIEZvciB3Y3R5cGVfdAorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxiaXRzL2N0eXBlX2Jhc2UuaD4JCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvaW9zX2Jhc2UuaD4gIC8vIEZvciBpb3NfYmFzZSwgaW9zX2Jhc2U6Omlvc3RhdGUKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gTkI6IERvbid0IGluc3RhbnRpYXRlIHJlcXVpcmVkIHdjaGFyX3QgZmFjZXRzIGlmIG5vIHdjaGFyX3Qgc3VwcG9ydC4KKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorIyBkZWZpbmUgIF9HTElCQ1hYX05VTV9GQUNFVFMgMjgKKyNlbHNlCisjIGRlZmluZSAgX0dMSUJDWFhfTlVNX0ZBQ0VUUyAxNAorI2VuZGlmCisKKyAgLy8gQ29udmVydCBzdHJpbmcgdG8gbnVtZXJpYyB2YWx1ZSBvZiB0eXBlIF9UcCBhbmQgc3RvcmUgcmVzdWx0cy4KKyAgLy8gTkI6IFRoaXMgaXMgc3BlY2lhbGl6ZWQgZm9yIGFsbCByZXF1aXJlZCB0eXBlcywgdGhlcmUgaXMgbm8KKyAgLy8gZ2VuZXJpYyBkZWZpbml0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fY29udmVydF90b192KGNvbnN0IGNoYXIqLCBfVHAmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsCisJCSAgIGNvbnN0IF9fY19sb2NhbGUmKSB0aHJvdygpOworCisgIC8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgcmVxdWlyZWQgdHlwZXMuCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX19jb252ZXJ0X3RvX3YoY29uc3QgY2hhciosIGZsb2F0JiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICBjb25zdCBfX2NfbG9jYWxlJikgdGhyb3coKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fY29udmVydF90b192KGNvbnN0IGNoYXIqLCBkb3VibGUmLCBpb3NfYmFzZTo6aW9zdGF0ZSYsCisJCSAgIGNvbnN0IF9fY19sb2NhbGUmKSB0aHJvdygpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX19jb252ZXJ0X3RvX3YoY29uc3QgY2hhciosIGxvbmcgZG91YmxlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICBjb25zdCBfX2NfbG9jYWxlJikgdGhyb3coKTsKKworICAvLyBOQjogX19wYWQgaXMgYSBzdHJ1Y3QsIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24sIHNvIGl0IGNhbiBiZQorICAvLyBwYXJ0aWFsbHktc3BlY2lhbGl6ZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJ1Y3QgX19wYWQKKyAgICB7CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfcGFkKGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLCBfQ2hhclQqIF9fbmV3cywKKwkgICAgIGNvbnN0IF9DaGFyVCogX19vbGRzLCBzdHJlYW1zaXplIF9fbmV3bGVuLCBzdHJlYW1zaXplIF9fb2xkbGVuKTsKKyAgICB9OworCisgIC8vIFVzZWQgYnkgYm90aCBudW1lcmljIGFuZCBtb25ldGFyeSBmYWNldHMuCisgIC8vIEluc2VydHMgImdyb3VwIHNlcGFyYXRvciIgY2hhcmFjdGVycyBpbnRvIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuCisgIC8vIEl0J3MgcmVjdXJzaXZlLCBvbmUgaXRlcmF0aW9uIHBlciBncm91cC4gIEl0IG1vdmVzIHRoZSBjaGFyYWN0ZXJzCisgIC8vIGluIHRoZSBidWZmZXIgdGhpcyB3YXk6ICJ4eHh4MTIzNDUiIC0+ICIxMiwzNDV4eHgiLiAgQ2FsbCB0aGlzCisgIC8vIG9ubHkgd2l0aCBfX2dzaXplICE9IDAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQqCisgICAgX19hZGRfZ3JvdXBpbmcoX0NoYXJUKiBfX3MsIF9DaGFyVCBfX3NlcCwKKwkJICAgY29uc3QgY2hhciogX19nYmVnLCBzaXplX3QgX19nc2l6ZSwKKwkJICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCk7CisKKyAgLy8gVGhpcyB0ZW1wbGF0ZSBwZXJtaXRzIHNwZWNpYWxpemluZyBmYWNldCBvdXRwdXQgY29kZSBmb3IKKyAgLy8gb3N0cmVhbWJ1Zl9pdGVyYXRvci4gIEZvciBvc3RyZWFtYnVmX2l0ZXJhdG9yLCBzcHV0biBpcworICAvLyBzaWduaWZpY2FudGx5IG1vcmUgZWZmaWNpZW50IHRoYW4gaW5jcmVtZW50aW5nIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZQorICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPgorICAgIF9fd3JpdGUob3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fcywgY29uc3QgX0NoYXJUKiBfX3dzLCBpbnQgX19sZW4pCisgICAgeworICAgICAgX19zLl9NX3B1dChfX3dzLCBfX2xlbik7CisgICAgICByZXR1cm4gX19zOworICAgIH0KKworICAvLyBUaGlzIGlzIHRoZSB1bnNwZWNpYWxpemVkIGZvcm0gb2YgdGhlIHRlbXBsYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGlubGluZQorICAgIF9PdXRJdGVyCisgICAgX193cml0ZShfT3V0SXRlciBfX3MsIGNvbnN0IF9DaGFyVCogX193cywgaW50IF9fbGVuKQorICAgIHsKKyAgICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbGVuOyBfX2orKywgKytfX3MpCisJKl9fcyA9IF9fd3NbX19qXTsKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisKKyAgLy8gMjIuMi4xLjEgIFRlbXBsYXRlIGNsYXNzIGN0eXBlCisgIC8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBjdHlwZSBlbnVtcyBmb3IgY3R5cGVfYmFzZS4KKworICAvKioKKyAgICogIEBicmllZiAgQ29tbW9uIGJhc2UgZm9yIGN0eXBlIGZhY2V0CisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHVibGljIGZ1bmN0aW9ucworICAgKiAgdGhhdCBmb3J3YXJkIHRvIHRoZSBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMuCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGFsc28gcHJvdmlkZXMgYWJzdHJhY3Qgc3R1YnMgZm9yIHRoZSBwcm90ZWN0ZWQgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgX19jdHlwZV9hYnN0cmFjdF9iYXNlIDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBjdHlwZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy8vIFR5cGVkZWYgZm9yIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICAgIHR5cGVkZWYgX0NoYXJUIGNoYXJfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUZXN0IGNoYXJfdHlwZSBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhIG1hc2sgTSBmb3IgQGEgYyBhbmQgY29tcGFyZXMgaXQgdG8gbWFzayBAYSBtLgorICAgICAgICogIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiBjdHlwZTxjaGFyX3R5cGU+Ojpkb19pcygpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJfdHlwZSB0byBjb21wYXJlIHRoZSBtYXNrIG9mLgorICAgICAgICogIEBwYXJhbSBtICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHJldHVybiAgKE0gJiBtKSAhPSAwLgorICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGlzKG1hc2sgX19tLCBjaGFyX3R5cGUgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9faXMoX19tLCBfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgbWFzayBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbWFzayBmb3IgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIHJhbmdlIFtsbyxoaSkKKyAgICAgICAqICBhbmQgc3VjY2Vzc2l2ZWx5IHdyaXRlcyBpdCB0byB2ZWMuICB2ZWMgbXVzdCBoYXZlIGFzIG1hbnkgZWxlbWVudHMKKyAgICAgICAqICBhcyB0aGUgY2hhciBhcnJheS4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZgorICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX2lzKCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSB2ZWMgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgbWFzayBzdG9yYWdlLgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGlzKGNvbnN0IGNoYXJfdHlwZSAqX19sbywgY29uc3QgY2hhcl90eXBlICpfX2hpLCBtYXNrICpfX3ZlYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2lzKF9fbG8sIF9faGksIF9fdmVjKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhcl90eXBlIG1hdGNoaW5nIGEgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyB0aGUgZmlyc3QgY2hhcl90eXBlIGMgaW4KKyAgICAgICAqICBbbG8saGkpIGZvciB3aGljaCBpcyhtLGMpIGlzIHRydWUuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX3NjYW5faXMoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIG0gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBQb2ludGVyIHRvIG1hdGNoaW5nIGNoYXJfdHlwZSBpZiBmb3VuZCwgZWxzZSBAYSBoaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICBzY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3NjYW5faXMoX19tLCBfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhcl90eXBlIG5vdCBtYXRjaGluZyBhIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgdGhlIGZpcnN0IGNoYXJfdHlwZSBjIGluCisgICAgICAgKiAgW2xvLGhpKSBmb3Igd2hpY2ggaXMobSxjKSBpcyBmYWxzZS4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9fc2Nhbl9ub3QoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIG0gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gZmlyc3QgY2hhciBpbiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gbm9uLW1hdGNoaW5nIGNoYXIgaWYgZm91bmQsIGVsc2UgQGEgaGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fc2Nhbl9ub3QoX19tLCBfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byB1cHBlcmNhc2UgaWYgcG9zc2libGUuCisgICAgICAgKiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuICBJdCBkb2VzCisgICAgICAgKiAgc28gYnkgcmV0dXJuaW5nIGN0eXBlPGNoYXJfdHlwZT46OmRvX3RvdXBwZXIoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyX3R5cGUgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgdXBwZXJjYXNlIGNoYXJfdHlwZSBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBjLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG91cHBlcihfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICB1cHBlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IHJldHVybmluZyBjdHlwZTxjaGFyX3R5cGU+OjogZG9fdG91cHBlcihsbywgaGkpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBoaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICB0b3VwcGVyKGNoYXJfdHlwZSAqX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG91cHBlcihfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgdG8gbG93ZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBJZgorICAgICAgICogIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LiAgSXQgZG9lcyBzbworICAgICAgICogIGJ5IHJldHVybmluZyBjdHlwZTxjaGFyX3R5cGU+Ojpkb190b2xvd2VyKGMpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2UgY2hhcl90eXBlIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIGMuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b2xvd2VyKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIGxvd2VyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgcmV0dXJuaW5nIGN0eXBlPGNoYXJfdHlwZT46OiBkb190b2xvd2VyKGxvLCBoaSkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHRvbG93ZXIoY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b2xvd2VyKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciB0byBjaGFyX3R5cGUKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byBjaGFyX3R5cGUgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgY3R5cGU8Y2hhcl90eXBlPjo6ZG9fd2lkZW4oYykuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyX3R5cGUuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3dpZGVuKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBhcnJheSB0byBjaGFyX3R5cGUKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIGNoYXJfdHlwZSB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICBjdHlwZTxjaGFyX3R5cGU+Ojpkb193aWRlbihjKS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXIqCisgICAgICB3aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLCBjaGFyX3R5cGUqIF9fdG8pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb193aWRlbihfX2xvLCBfX2hpLCBfX3RvKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyX3R5cGUgdG8gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBjaGFyX3R5cGUgdG8gY2hhciB1c2luZyB0aGUgc2ltcGxlc3QKKyAgICAgICAqICByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIGRmYXVsdCBpcworICAgICAgICogIHJldHVybmVkIGluc3RlYWQuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX25hcnJvdyhjKS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBkZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIGNoYXIKKyAgICAgIG5hcnJvdyhjaGFyX3R5cGUgX19jLCBjaGFyIF9fZGZhdWx0KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fbmFycm93KF9fYywgX19kZmF1bHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGFycmF5IHRvIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgaW5wdXQgdG8gY2hhciB1c2luZyB0aGUKKyAgICAgICAqICBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgdG8gdGhlCisgICAgICAgKiAgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IGNoYXJfdHlwZSBpbiB0aGUgaW5wdXQgdGhhdCBjYW5ub3QgYmUKKyAgICAgICAqICBjb252ZXJ0ZWQsIEBhIGRmYXVsdCBpcyB1c2VkIGluc3RlYWQuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZworICAgICAgICogIGN0eXBlPGNoYXJfdHlwZT46OmRvX25hcnJvdyhsbywgaGksIGRmYXVsdCwgdG8pLgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBkZmF1bHQgIENoYXIgdG8gdXNlIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHBhcmFtIHRvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBoaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICBuYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJICAgICAgY2hhciBfX2RmYXVsdCwgY2hhciAqX190bykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX25hcnJvdyhfX2xvLCBfX2hpLCBfX2RmYXVsdCwgX190byk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2N0eXBlX2Fic3RyYWN0X2Jhc2Uoc2l6ZV90IF9fcmVmcyA9IDApOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICB2aXJ0dWFsCisgICAgICB+X19jdHlwZV9hYnN0cmFjdF9iYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGVzdCBjaGFyX3R5cGUgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBtYXNrIE0gZm9yIEBhIGMgYW5kIGNvbXBhcmVzIGl0IHRvIG1hc2sgQGEgbS4KKyAgICAgICAqCisgICAgICAgKiAgZG9faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgY2xhc3NpZnlpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhcl90eXBlIHRvIGZpbmQgdGhlIG1hc2sgb2YuCisgICAgICAgKiAgQHBhcmFtIG0gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICAoTSAmIG0pICE9IDAuCisgICAgICAqLworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIG1hc2sgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1hc2sgZm9yIGVhY2ggY2hhcl90eXBlIGluIHRoZSByYW5nZSBbbG8saGkpCisgICAgICAgKiAgYW5kIHN1Y2Nlc3NpdmVseSB3cml0ZXMgaXQgdG8gdmVjLiAgdmVjIG11c3QgaGF2ZSBhcyBtYW55IGVsZW1lbnRzCisgICAgICAgKiAgYXMgdGhlIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBkb19pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBjbGFzc2lmeWluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIHZlYyAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBtYXNrIHN0b3JhZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19pcyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKKwkgICAgbWFzayogX192ZWMpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXJfdHlwZSBtYXRjaGluZyBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBjaGFyX3R5cGUgYyBpbgorICAgICAgICogIFtsbyxoaSkgZm9yIHdoaWNoIGlzKG0sYykgaXMgdHJ1ZS4KKyAgICAgICAqCisgICAgICAgKiAgZG9fc2Nhbl9pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBtYXRjaCBzZWFyY2hpbmcuICBkb19pcygpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBtICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBhIG1hdGNoaW5nIGNoYXJfdHlwZSBpZiBmb3VuZCwgZWxzZSBAYSBoaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3NjYW5faXMobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywKKwkJIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhcl90eXBlIG5vdCBtYXRjaGluZyBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyX3R5cGUgYyBvZiBbbG8saGkpIGZvciB3aGljaCBpcyhtLGMpIGlzIGZhbHNlLgorICAgICAgICoKKyAgICAgICAqICBkb19zY2FuX2lzKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIG1hdGNoIHNlYXJjaGluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIG0gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBQb2ludGVyIHRvIGEgbm9uLW1hdGNoaW5nIGNoYXJfdHlwZSBpZiBmb3VuZCwgZWxzZSBAYSBoaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3NjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sCisJCSAgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhcl90eXBlIGFyZ3VtZW50IHRvIHVwcGVyY2FzZQorICAgICAgICogIGlmIHBvc3NpYmxlLiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUKKyAgICAgICAqICBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG91cHBlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB1cHBlcmNhc2luZy4gIGRvX3RvdXBwZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB1cHBlcmNhc2UgY2hhcl90eXBlIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIGMuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW2xvLGhpKQorICAgICAgICogIHRvIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgdG8gbG93ZXJjYXNlIGlmCisgICAgICAgKiAgcG9zc2libGUuICBJZiBub3QgcG9zc2libGUgKGZvciBleGFtcGxlLCAnMicpLCByZXR1cm5zIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fdG9sb3dlcigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBsb3dlcmNhc2luZy4gIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgICogIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2UgY2hhcl90eXBlIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIGMuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvbG93ZXIoY2hhcl90eXBlKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXJfdHlwZSBpbiB0aGUgcmFuZ2UgW2xvLGhpKQorICAgICAgICogIHRvIGxvd2VyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvbG93ZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbG93ZXJjYXNpbmcuICBkb190b2xvd2VyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdCA9IDA7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgdG8gY2hhcl90eXBlIHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBjb252ZXJ0ZWQgY2hhcl90eXBlCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3dpZGVuKGNoYXIpIGNvbnN0ID0gMDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyIGFycmF5CisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyIGluIHRoZSBpbnB1dCB0byBjaGFyX3R5cGUgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgZG9fd2lkZW4oKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgd2lkZW5pbmcuICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIHRvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBoaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqCisgICAgICBkb193aWRlbihjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpLAorCSAgICAgICBjaGFyX3R5cGUqIF9fZGVzdCkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyX3R5cGUgdG8gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGFyZ3VtZW50IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIElmIHRoZSBjb252ZXJzaW9uIGZhaWxzLCBkZmF1bHQKKyAgICAgICAqICBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXJfdHlwZSB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBkZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcgorICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSwgY2hhciBfX2RmYXVsdCkgY29uc3QgPSAwOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE5hcnJvdyBjaGFyX3R5cGUgYXJyYXkgdG8gY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgZWFjaCBjaGFyX3R5cGUgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlCisgICAgICAgKiAgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IGVsZW1lbnQgaW4gdGhlIGlucHV0IHRoYXQKKyAgICAgICAqICBjYW5ub3QgYmUgY29udmVydGVkLCBAYSBkZmF1bHQgaXMgdXNlZCBpbnN0ZWFkLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gZGZhdWx0ICBDaGFyIHRvIHVzZSBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEBwYXJhbSB0byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJCWNoYXIgX19kZmF1bHQsIGNoYXIqIF9fZGVzdCkgY29uc3QgPSAwOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgY3R5cGUgZmFjZXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIHRlbXBsYXRlIGNsYXNzIGRlZmluZXMgY2xhc3NpZmljYXRpb24gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZvcgorICAgKiAgY2hhcmFjdGVyIHNldHMuICBJdCB3cmFwcyBjY3R5cGUgZnVuY3Rpb25hbGl0eS4gIEN0eXBlIGdldHMgdXNlZCBieQorICAgKiAgc3RyZWFtcyBmb3IgbWFueSBJL08gb3BlcmF0aW9ucy4KKyAgICoKKyAgICogIFRoaXMgdGVtcGxhdGUgcHJvdmlkZXMgdGhlIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGUgZGV2ZWxvcGVyCisgICAqICB3aWxsIGhhdmUgdG8gcmVwbGFjZSBpbiBhIGRlcml2ZWQgY2xhc3Mgb3Igc3BlY2lhbGl6YXRpb24gdG8gbWFrZSBhCisgICAqICB3b3JraW5nIGZhY2V0LiAgVGhlIHB1YmxpYyBmdW5jdGlvbnMgdGhhdCBhY2Nlc3MgdGhlbSBhcmUgZGVmaW5lZCBpbgorICAgKiAgX19jdHlwZV9hYnN0cmFjdF9iYXNlLCB0byBhbGxvdyBmb3IgaW1wbGVtZW50YXRpb24gZmxleGliaWxpdHkuICBTZWUKKyAgICogIGN0eXBlPHdjaGFyX3Q+IGZvciBhbiBleGFtcGxlLiAgVGhlIGZ1bmN0aW9ucyBhcmUgZG9jdW1lbnRlZCBpbgorICAgKiAgX19jdHlwZV9hYnN0cmFjdF9iYXNlLgorICAgKgorICAgKiAgTm90ZTogaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHRoZSBwcm90ZWN0ZWQgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLCBidXQgd2lsbCBsaWtlbHkgbm90IGJlIHVzZWZ1bC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIGN0eXBlIDogcHVibGljIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3R5cGVfYWJzdHJhY3RfYmFzZTxfQ2hhclQ+OjptYXNrIG1hc2s7CisKKyAgICAgIC8vLyBUaGUgZmFjZXQgaWQgZm9yIGN0eXBlPGNoYXJfdHlwZT4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShzaXplX3QgX19yZWZzID0gMCkgOiBfX2N0eXBlX2Fic3RyYWN0X2Jhc2U8X0NoYXJUPihfX3JlZnMpIHsgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y3R5cGUoKTsKKworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9faXMoY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksIG1hc2sqIF9fdmVjKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19zY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9ub3QobWFzayBfX20sIGNvbnN0IGNoYXJfdHlwZSogX19sbywKKwkJICBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUgX19jKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvbG93ZXIoY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb193aWRlbihjaGFyIF9fYykgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICAgIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGksIGNoYXJfdHlwZSogX19kZXN0KSBjb25zdDsKKworICAgICAgdmlydHVhbCBjaGFyCisgICAgICBkb19uYXJyb3coY2hhcl90eXBlLCBjaGFyIF9fZGZhdWx0KSBjb25zdDsKKworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJCWNoYXIgX19kZmF1bHQsIGNoYXIqIF9fZGVzdCkgY29uc3Q7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgbG9jYWxlOjppZCBjdHlwZTxfQ2hhclQ+OjppZDsKKworICAvKioKKyAgICogIEBicmllZiAgVGhlIGN0eXBlPGNoYXI+IHNwZWNpYWxpemF0aW9uLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBjbGFzcyBkZWZpbmVzIGNsYXNzaWZpY2F0aW9uIGFuZCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IKKyAgICogIHRoZSBjaGFyIHR5cGUuICBJdCBnZXRzIHVzZWQgYnkgY2hhciBzdHJlYW1zIGZvciBtYW55IEkvTworICAgKiAgb3BlcmF0aW9ucy4gIFRoZSBjaGFyIHNwZWNpYWxpemF0aW9uIHByb3ZpZGVzIGEgbnVtYmVyIG9mCisgICAqICBvcHRpbWl6YXRpb25zIGFzIHdlbGwuCisgICovCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBjdHlwZTxjaGFyPiA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0LCBwdWJsaWMgY3R5cGVfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vLyBUeXBlZGVmIGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGNoYXIuCisgICAgICB0eXBlZGVmIGNoYXIJCWNoYXJfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIERhdGEgTWVtYmVyczoKKyAgICAgIF9fY19sb2NhbGUJCV9NX2NfbG9jYWxlX2N0eXBlOworICAgICAgYm9vbAkJCV9NX2RlbDsKKyAgICAgIF9fdG9fdHlwZQkJCV9NX3RvdXBwZXI7CisgICAgICBfX3RvX3R5cGUJCQlfTV90b2xvd2VyOworICAgICAgY29uc3QgbWFzayoJCV9NX3RhYmxlOworICAgICAgbXV0YWJsZSBjaGFyCQlfTV93aWRlbl9vazsKKyAgICAgIG11dGFibGUgY2hhcgkJX01fd2lkZW5bMSArIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KC0xKV07CisgICAgICBtdXRhYmxlIGNoYXIJCV9NX25hcnJvd1sxICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oLTEpXTsKKyAgICAgIG11dGFibGUgY2hhcgkJX01fbmFycm93X29rOwkvLyAwIHVuaW5pdGlhbGl6ZWQsIDEgaW5pdCwKKwkJCQkJCS8vIDIgbWVtY3B5IGNhbid0IGJlIHVzZWQKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBUaGUgZmFjZXQgaWQgZm9yIGN0eXBlPGNoYXI+CisgICAgICBzdGF0aWMgbG9jYWxlOjppZCAgICAgICAgaWQ7CisgICAgICAvLy8gVGhlIHNpemUgb2YgdGhlIG1hc2sgdGFibGUuICBJdCBpcyBTQ0hBUl9NQVggKyAxLgorICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgIHRhYmxlX3NpemUgPSAxICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oLTEpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSB0YWJsZSBJZiBub24temVybywgdGFibGUgaXMgdXNlZCBhcyB0aGUgcGVyLWNoYXIgbWFzay4KKyAgICAgICAqICAgICAgICAgICAgICAgRWxzZSBjbGFzc2ljX3RhYmxlKCkgaXMgdXNlZC4KKyAgICAgICAqICBAcGFyYW0gZGVsICAgSWYgdHJ1ZSwgcGFzc2VzIG93bmVyc2hpcCBvZiB0YWJsZSB0byB0aGlzIGZhY2V0LgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGN0eXBlKGNvbnN0IG1hc2sqIF9fdGFibGUgPSAwLCBib29sIF9fZGVsID0gZmFsc2UsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGluaXRpYWwgQyBsb2NhbGUgZmFjZXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjbG9jICBIYW5kbGUgdG8gQyBsb2NhbGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gdGFibGUgSWYgbm9uLXplcm8sIHRhYmxlIGlzIHVzZWQgYXMgdGhlIHBlci1jaGFyIG1hc2suCisgICAgICAgKiAgQHBhcmFtIGRlbCAgIElmIHRydWUsIHBhc3NlcyBvd25lcnNoaXAgb2YgdGFibGUgdG8gdGhpcyBmYWNldC4KKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShfX2NfbG9jYWxlIF9fY2xvYywgY29uc3QgbWFzayogX190YWJsZSA9IDAsIGJvb2wgX19kZWwgPSBmYWxzZSwKKwkgICAgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRlc3QgY2hhciBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0aGUgbWFzayB0YWJsZVtjXSB0byBAYSBtLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXIgdG8gY29tcGFyZSB0aGUgbWFzayBvZi4KKyAgICAgICAqICBAcGFyYW0gbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIFRydWUgaWYgbSAmIHRhYmxlW2NdIGlzIHRydWUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICovCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgaXMobWFzayBfX20sIGNoYXIgX19jKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSBtYXNrIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBtYXNrIGZvciBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbywgaGkpIGFuZAorICAgICAgICogIHN1Y2Nlc3NpdmVseSB3cml0ZXMgaXQgdG8gdmVjLiAgdmVjIG11c3QgaGF2ZSBhcyBtYW55IGVsZW1lbnRzIGFzCisgICAgICAgKiAgdGhlIGNoYXIgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSB2ZWMgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgbWFzayBzdG9yYWdlLgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIGlubGluZSBjb25zdCBjaGFyKgorICAgICAgaXMoY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgbWFzayogX192ZWMpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgY2hhciBtYXRjaGluZyBhIG1hc2sKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW5kIHJldHVybnMgdGhlIGZpcnN0IGNoYXIgaW4gW2xvLGhpKSBmb3IKKyAgICAgICAqICB3aGljaCBpcyhtLGNoYXIpIGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBtICBUaGUgbWFzayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgUG9pbnRlciB0byBhIG1hdGNoaW5nIGNoYXIgaWYgZm91bmQsIGVsc2UgQGEgaGkuCisgICAgICAqLworICAgICAgaW5saW5lIGNvbnN0IGNoYXIqCisgICAgICBzY2FuX2lzKG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGNoYXIgbm90IG1hdGNoaW5nIGEgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIKKyAgICAgICAqICBpbiBbbG8saGkpIGZvciB3aGljaCBpcyhtLGNoYXIpIGlzIGZhbHNlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBub24tbWF0Y2hpbmcgY2hhciBpZiBmb3VuZCwgZWxzZSBAYSBoaS4KKyAgICAgICovCisgICAgICBpbmxpbmUgY29uc3QgY2hhcioKKyAgICAgIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvLCBjb25zdCBjaGFyKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byB1cHBlcmNhc2UgaWYgcG9zc2libGUuCisgICAgICAgKiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIHRvdXBwZXIoKSBhY3RzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX3RvdXBwZXIoYykuCisgICAgICAgKiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gYyAgVGhlIGNoYXIgdG8gY29udmVydC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgdXBwZXJjYXNlIGNoYXIgaWYgY29udmVydGlibGUsIGVsc2UgQGEgYy4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRvdXBwZXIoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RvdXBwZXIoX19jKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnZlcnQgYXJyYXkgdG8gdXBwZXJjYXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0byB1cHBlcmNhc2UKKyAgICAgICAqICBpZiBwb3NzaWJsZS4gIE90aGVyIGNoYXJzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIHRvdXBwZXIoKSBhY3RzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OiBkb190b3VwcGVyKGxvLCBoaSkuCisgICAgICAgKiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gZmlyc3QgY2hhciBpbiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIHRvdXBwZXIoY2hhcl90eXBlICpfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b3VwcGVyKF9fbG8sIF9faGkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgYXJndW1lbnQgdG8gbG93ZXJjYXNlIGlmIHBvc3NpYmxlLgorICAgICAgICogIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICB0b2xvd2VyKCkgYWN0cyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb190b2xvd2VyKGMpLgorICAgICAgICogIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGxvd2VyY2FzZSBjaGFyIGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIGMuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0b2xvd2VyKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190b2xvd2VyKF9fYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8gbG93ZXJjYXNlCisgICAgICAgKiAgaWYgcG9zc2libGUuICBPdGhlciBjaGFycyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICB0b2xvd2VyKCkgYWN0cyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+OjogZG9fdG9sb3dlcihsbywgaGkpLgorICAgICAgICogIGRvX3RvbG93ZXIoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIGZpcnN0IGNoYXIgaW4gcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBoaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyX3R5cGUqCisgICAgICB0b2xvd2VyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fdG9sb3dlcihfX2xvLCBfX2hpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byBjaGFyX3R5cGUgdXNpbmcgdGhlIHNpbXBsZXN0CisgICAgICAgKiAgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4gZmFjZXQsIHRoZQorICAgICAgICogIGFyZ3VtZW50IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFzIGlmIGl0IHJldHVybnMgY3R5cGU8Y2hhcj46OmRvX3dpZGVuKGMpLgorICAgICAgICogIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCisgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB3aWRlbihjaGFyIF9fYykgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fd2lkZW5fb2spCisJICByZXR1cm4gX01fd2lkZW5bc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX19jKV07CisJdGhpcy0+X01fd2lkZW5faW5pdCgpOworCXJldHVybiB0aGlzLT5kb193aWRlbihfX2MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdpZGVuIGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb193aWRlbihjKS4KKyAgICAgICAqICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBmaXJzdCBjaGFyIGluIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIHRvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBoaS4KKyAgICAgICovCisgICAgICBjb25zdCBjaGFyKgorICAgICAgd2lkZW4oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX3RvKSBjb25zdAorICAgICAgeworCWlmIChfTV93aWRlbl9vayA9PSAxKQorCSAgeworCSAgICBfX2J1aWx0aW5fbWVtY3B5KF9fdG8sIF9fbG8sIF9faGkgLSBfX2xvKTsKKwkgICAgcmV0dXJuIF9faGk7CisJICB9CisJaWYgKCFfTV93aWRlbl9vaykKKwkgIF9NX3dpZGVuX2luaXQoKTsKKwlyZXR1cm4gdGhpcy0+ZG9fd2lkZW4oX19sbywgX19oaSwgX190byk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGNoYXIKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdAorICAgICAgICogIHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBJZiB0aGUgY29udmVyc2lvbiBmYWlscywgZGZhdWx0IGlzCisgICAgICAgKiAgcmV0dXJuZWQgaW5zdGVhZC4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4gZmFjZXQsIEBhIGMKKyAgICAgICAqICB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb19uYXJyb3coYykuCisgICAgICAgKiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHBhcmFtIGRmYXVsdCAgQ2hhciB0byByZXR1cm4gaWYgY29udmVyc2lvbiBmYWlscy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY29udmVydGVkIGNoYXJhY3Rlci4KKyAgICAgICovCisgICAgICBjaGFyCisgICAgICBuYXJyb3coY2hhcl90eXBlIF9fYywgY2hhciBfX2RmYXVsdCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fbmFycm93W3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYyldKQorCSAgcmV0dXJuIF9NX25hcnJvd1tzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXTsKKwljb25zdCBjaGFyIF9fdCA9IGRvX25hcnJvdyhfX2MsIF9fZGZhdWx0KTsKKwlpZiAoX190ICE9IF9fZGZhdWx0KQorCSAgX01fbmFycm93W3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYyldID0gX190OworCXJldHVybiBfX3Q7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IGNoYXIgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIGNoYXIgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIHRvIHRoZQorICAgICAgICogIGRlc3RpbmF0aW9uIGFycmF5LiAgRm9yIGFueSBjaGFyIGluIHRoZSBpbnB1dCB0aGF0IGNhbm5vdCBiZQorICAgICAgICogIGNvbnZlcnRlZCwgQGEgZGZhdWx0IGlzIHVzZWQgaW5zdGVhZC4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8Y2hhcj4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBhcyBpZiBpdCByZXR1cm5zIGN0eXBlPGNoYXI+Ojpkb19uYXJyb3cobG8sIGhpLAorICAgICAgICogIGRmYXVsdCwgdG8pLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gZGZhdWx0ICBDaGFyIHRvIHVzZSBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEBwYXJhbSB0byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgY29uc3QgY2hhcl90eXBlKgorICAgICAgbmFycm93KGNvbnN0IGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpLAorCSAgICAgY2hhciBfX2RmYXVsdCwgY2hhciAqX190bykgY29uc3QKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfTV9uYXJyb3dfb2sgPT0gMSwgdHJ1ZSkpCisJICB7CisJICAgIF9fYnVpbHRpbl9tZW1jcHkoX190bywgX19sbywgX19oaSAtIF9fbG8pOworCSAgICByZXR1cm4gX19oaTsKKwkgIH0KKwlpZiAoIV9NX25hcnJvd19vaykKKwkgIF9NX25hcnJvd19pbml0KCk7CisJcmV0dXJuIHRoaXMtPmRvX25hcnJvdyhfX2xvLCBfX2hpLCBfX2RmYXVsdCwgX190byk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDY5NS4gY3R5cGU8Y2hhcj46OmNsYXNzaWNfdGFibGUoKSBub3QgYWNjZXNzaWJsZS4KKyAgICAgIC8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbWFzayB0YWJsZSBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IsIG9yCisgICAgICAvLy8gdGhlIGRlZmF1bHQgZnJvbSBjbGFzc2ljX3RhYmxlKCkgaWYgbm9uZSB3YXMgcHJvdmlkZWQuCisgICAgICBjb25zdCBtYXNrKgorICAgICAgdGFibGUoKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiBfTV90YWJsZTsgfQorCisgICAgICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEMgbG9jYWxlIG1hc2sgdGFibGUuCisgICAgICBzdGF0aWMgY29uc3QgbWFzayoKKyAgICAgIGNsYXNzaWNfdGFibGUoKSB0aHJvdygpOworICAgIHByb3RlY3RlZDoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgdGFibGUoKSBpZiBAYSBkZWwgd2FzIHRydWUgaW4gdGhlCisgICAgICAgKiAgY29uc3RydWN0b3IuCisgICAgICAqLworICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byB1cHBlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSB1cHBlcmNhc2UgY2hhciBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBjLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byB1cHBlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICB1cHBlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBjaGFycyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b3VwcGVyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHVwcGVyY2FzaW5nLiAgZG9fdG91cHBlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG91cHBlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2UgY2hhciBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBjLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBjaGFycyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBmaXJzdCBjaGFyIGluIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdAorICAgICAgICogIHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBGb3IgYW4gdW5kZXJpdmVkIGN0eXBlPGNoYXI+IGZhY2V0LCB0aGUKKyAgICAgICAqICBhcmd1bWVudCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fd2lkZW4oKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgd2lkZW5pbmcuICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyYWN0ZXIuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3dpZGVuKGNoYXIgX19jKSBjb25zdAorICAgICAgeyByZXR1cm4gX19jOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggY2hhciBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0byBjaGFyIHVzaW5nCisgICAgICAgKiAgdGhlIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBGb3IgYW4gdW5kZXJpdmVkCisgICAgICAgKiAgY3R5cGU8Y2hhcj4gZmFjZXQsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGNvcGllZCB1bmNoYW5nZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3dpZGVuKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIHdpZGVuaW5nLiAgZG9fd2lkZW4oKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSB0byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyKgorICAgICAgZG9fd2lkZW4oY29uc3QgY2hhciogX19sbywgY29uc3QgY2hhciogX19oaSwgY2hhcl90eXBlKiBfX2Rlc3QpIGNvbnN0CisgICAgICB7CisJX19idWlsdGluX21lbWNweShfX2Rlc3QsIF9fbG8sIF9faGkgLSBfX2xvKTsKKwlyZXR1cm4gX19oaTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhcgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgdGhlIGNoYXIgdG8gY2hhciB1c2luZyB0aGUgc2ltcGxlc3QKKyAgICAgICAqICByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIGRmYXVsdCBpcworICAgICAgICogIHJldHVybmVkIGluc3RlYWQuICBGb3IgYW4gdW5kZXJpdmVkIGN0eXBlPGNoYXI+IGZhY2V0LCBAYSBjIHdpbGwgYmUKKyAgICAgICAqICByZXR1cm5lZCB1bmNoYW5nZWQuCisgICAgICAgKgorICAgICAgICogIGRvX25hcnJvdygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBuYXJyb3dpbmcuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgY2hhciB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBkZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcgorICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSBfX2MsIGNoYXIpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2M7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgY2hhciBhcnJheSB0byBjaGFyIGFycmF5CisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBjaGFyIHVzaW5nIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uIGFuZCB3cml0ZXMgdGhlCisgICAgICAgKiAgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuICBGb3IgYW55IGNoYXIgaW4gdGhlIGlucHV0IHRoYXQKKyAgICAgICAqICBjYW5ub3QgYmUgY29udmVydGVkLCBAYSBkZmF1bHQgaXMgdXNlZCBpbnN0ZWFkLiAgRm9yIGFuIHVuZGVyaXZlZAorICAgICAgICogIGN0eXBlPGNoYXI+IGZhY2V0LCB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb3BpZWQgdW5jaGFuZ2VkLgorICAgICAgICoKKyAgICAgICAqICBkb19uYXJyb3coKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbmFycm93aW5nLiAgZG9fbmFycm93KCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gZGZhdWx0ICBDaGFyIHRvIHVzZSBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICogIEBwYXJhbSB0byAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19uYXJyb3coY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGksCisJCWNoYXIsIGNoYXIqIF9fZGVzdCkgY29uc3QKKyAgICAgIHsKKwlfX2J1aWx0aW5fbWVtY3B5KF9fZGVzdCwgX19sbywgX19oaSAtIF9fbG8pOworCXJldHVybiBfX2hpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQgX01fbmFycm93X2luaXQoKSBjb25zdDsKKyAgICAgIC8qIFRoZSBmb2xsb3dpbmcgbWVtYmVyIGZ1bmN0aW9uIGlzIG1vdmVkIGZyb20gc3JjL2N0eXBlLmNjLgorICAgICAgICAgU2VlIGNvbW1lbnQgdGhlcmUgZm9yIHJlYXNvbiB3aHkgKi8KKyAgICAgIHZvaWQgX01fd2lkZW5faW5pdCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGNoYXIgX190bXBbc2l6ZW9mKF9NX3dpZGVuKV07CisgICAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHNpemVvZihfTV93aWRlbik7ICsrX19pKQorICAgICAgICAgIF9fdG1wW19faV0gPSBfX2k7CisgICAgICAgIGRvX3dpZGVuKF9fdG1wLCBfX3RtcCArIHNpemVvZihfX3RtcCksIF9NX3dpZGVuKTsKKworICAgICAgICBfTV93aWRlbl9vayA9IDE7CisgICAgICAgIC8vIFNldCBfTV93aWRlbl9vayB0byAyIGlmIG1lbWNweSBjYW4ndCBiZSB1c2VkLgorICAgICAgICBpZiAoX19idWlsdGluX21lbWNtcChfX3RtcCwgX01fd2lkZW4sIHNpemVvZihfTV93aWRlbikpKQorICAgICAgICAgIF9NX3dpZGVuX29rID0gMjsKKyAgICAgIH0KKyAgICB9OworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSBjdHlwZTx3Y2hhcl90PiBzcGVjaWFsaXphdGlvbi4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgY2xhc3MgZGVmaW5lcyBjbGFzc2lmaWNhdGlvbiBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHRoZQorICAgKiAgd2NoYXJfdCB0eXBlLiAgSXQgZ2V0cyB1c2VkIGJ5IHdjaGFyX3Qgc3RyZWFtcyBmb3IgbWFueSBJL08gb3BlcmF0aW9ucy4KKyAgICogIFRoZSB3Y2hhcl90IHNwZWNpYWxpemF0aW9uIHByb3ZpZGVzIGEgbnVtYmVyIG9mIG9wdGltaXphdGlvbnMgYXMgd2VsbC4KKyAgICoKKyAgICogIGN0eXBlPHdjaGFyX3Q+IGluaGVyaXRzIGl0cyBwdWJsaWMgbWV0aG9kcyBmcm9tCisgICAqICBfX2N0eXBlX2Fic3RyYWN0X2Jhc2U8d2NoYXJfdD4uCisgICovCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBjdHlwZTx3Y2hhcl90PiA6IHB1YmxpYyBfX2N0eXBlX2Fic3RyYWN0X2Jhc2U8d2NoYXJfdD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvLy8gVHlwZWRlZiBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB3Y2hhcl90LgorICAgICAgdHlwZWRlZiB3Y2hhcl90CQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHdjdHlwZV90CQlfX3dtYXNrX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2NfbG9jYWxlCQlfTV9jX2xvY2FsZV9jdHlwZTsKKworICAgICAgLy8gUHJlLWNvbXB1dGVkIG5hcnJvd2VkIGFuZCB3aWRlbmVkIGNoYXJzLgorICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBfTV9uYXJyb3dfb2s7CisgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgIF9NX25hcnJvd1sxMjhdOworICAgICAgd2ludF90ICAgICAgICAgICAgICAgICAgICBfTV93aWRlblsxICsgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oLTEpXTsKKworICAgICAgLy8gUHJlLWNvbXB1dGVkIGVsZW1lbnRzIGZvciBkb19pcy4KKyAgICAgIG1hc2sgICAgICAgICAgICAgICAgICAgICAgX01fYml0WzE2XTsKKyAgICAgIF9fd21hc2tfdHlwZSAgICAgICAgICAgICAgX01fd21hc2tbMTZdOworCisgICAgcHVibGljOgorICAgICAgLy8gRGF0YSBNZW1iZXJzOgorICAgICAgLy8vIFRoZSBmYWNldCBpZCBmb3IgY3R5cGU8d2NoYXJfdD4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZShzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0b3IgcGVyZm9ybXMgc3RhdGljIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBpbml0aWFsIEMgbG9jYWxlIGZhY2V0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gY2xvYyAgSGFuZGxlIHRvIEMgbG9jYWxlIGRhdGEuCisgICAgICAgKiAgQHBhcmFtIHJlZnMgIFBhc3NlZCB0byB0aGUgYmFzZSBmYWNldCBjbGFzcy4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGUoX19jX2xvY2FsZSBfX2Nsb2MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9fd21hc2tfdHlwZQorICAgICAgX01fY29udmVydF90b193bWFzayhjb25zdCBtYXNrIF9fbSkgY29uc3QgdGhyb3coKTsKKworICAgICAgLy8vIERlc3RydWN0b3IKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5jdHlwZSgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRlc3Qgd2NoYXJfdCBjbGFzc2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaW5kcyBhIG1hc2sgTSBmb3IgQGEgYyBhbmQgY29tcGFyZXMgaXQgdG8gbWFzayBAYSBtLgorICAgICAgICoKKyAgICAgICAqICBkb19pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBjbGFzc2lmeWluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSB3Y2hhcl90IHRvIGZpbmQgdGhlIG1hc2sgb2YuCisgICAgICAgKiAgQHBhcmFtIG0gIFRoZSBtYXNrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICAoTSAmIG0pICE9IDAuCisgICAgICAqLworICAgICAgdmlydHVhbCBib29sCisgICAgICBkb19pcyhtYXNrIF9fbSwgY2hhcl90eXBlIF9fYykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgbWFzayBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbWFzayBmb3IgZWFjaCB3Y2hhcl90IGluIHRoZSByYW5nZSBbbG8saGkpCisgICAgICAgKiAgYW5kIHN1Y2Nlc3NpdmVseSB3cml0ZXMgaXQgdG8gdmVjLiAgdmVjIG11c3QgaGF2ZSBhcyBtYW55IGVsZW1lbnRzCisgICAgICAgKiAgYXMgdGhlIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBkb19pcygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBjbGFzc2lmeWluZy4gIGRvX2lzKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIHZlYyAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBtYXNrIHN0b3JhZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb19pcyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwgbWFzayogX192ZWMpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgd2NoYXJfdCBtYXRjaGluZyBtYXNrCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgZm9yIGFuZCByZXR1cm5zIHRoZSBmaXJzdCB3Y2hhcl90IGMgaW4KKyAgICAgICAqICBbbG8saGkpIGZvciB3aGljaCBpcyhtLGMpIGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIGRvX3NjYW5faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbWF0Y2ggc2VhcmNoaW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBtYXRjaGluZyB3Y2hhcl90IGlmIGZvdW5kLCBlbHNlIEBhIGhpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhcl90eXBlKiBfX2xvLCBjb25zdCBjaGFyX3R5cGUqIF9faGkpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgd2NoYXJfdCBub3QgbWF0Y2hpbmcgbWFzaworICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgd2NoYXJfdCBjIG9mIFtsbyxoaSkgZm9yIHdoaWNoIGlzKG0sYykgaXMgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIGRvX3NjYW5faXMoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgbWF0Y2ggc2VhcmNoaW5nLiAgZG9faXMoKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbSAgVGhlIG1hc2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFBvaW50ZXIgdG8gYSBub24tbWF0Y2hpbmcgd2NoYXJfdCBpZiBmb3VuZCwgZWxzZSBAYSBoaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX3NjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyX3R5cGUqIF9fbG8sCisJCSAgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSB3Y2hhcl90IGFyZ3VtZW50IHRvIHVwcGVyY2FzZSBpZgorICAgICAgICogIHBvc3NpYmxlLiAgSWYgbm90IHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgJzInKSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSB3Y2hhcl90IHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVwcGVyY2FzZSB3Y2hhcl90IGlmIGNvbnZlcnRpYmxlLCBlbHNlIEBhIGMuCisgICAgICAqLworICAgICAgdmlydHVhbCBjaGFyX3R5cGUKKyAgICAgIGRvX3RvdXBwZXIoY2hhcl90eXBlKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IGFycmF5IHRvIHVwcGVyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIGVhY2ggd2NoYXJfdCBpbiB0aGUgcmFuZ2UgW2xvLGhpKSB0bworICAgICAgICogIHVwcGVyY2FzZSBpZiBwb3NzaWJsZS4gIE90aGVyIGVsZW1lbnRzIHJlbWFpbiB1bnRvdWNoZWQuCisgICAgICAgKgorICAgICAgICogIGRvX3RvdXBwZXIoKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgdXBwZXJjYXNpbmcuICBkb190b3VwcGVyKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICAgICAqICB0aGUgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGxvICBQb2ludGVyIHRvIHN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBoaSAgUG9pbnRlciB0byBlbmQgb2YgcmFuZ2UuCisgICAgICAgKiAgQHJldHVybiAgQGEgaGkuCisgICAgICAqLworICAgICAgdmlydHVhbCBjb25zdCBjaGFyX3R5cGUqCisgICAgICBkb190b3VwcGVyKGNoYXJfdHlwZSogX19sbywgY29uc3QgY2hhcl90eXBlKiBfX2hpKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb252ZXJ0IHRvIGxvd2VyY2FzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBhcmd1bWVudCB0byBsb3dlcmNhc2UgaWYKKyAgICAgICAqICBwb3NzaWJsZS4gIElmIG5vdCBwb3NzaWJsZSAoZm9yIGV4YW1wbGUsICcyJyksIHJldHVybnMgdGhlIGFyZ3VtZW50LgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgd2NoYXJfdCB0byBjb252ZXJ0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBsb3dlcmNhc2Ugd2NoYXJfdCBpZiBjb252ZXJ0aWJsZSwgZWxzZSBAYSBjLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb190b2xvd2VyKGNoYXJfdHlwZSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29udmVydCBhcnJheSB0byBsb3dlcmNhc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIHdjaGFyX3QgaW4gdGhlIHJhbmdlIFtsbyxoaSkgdG8KKyAgICAgICAqICBsb3dlcmNhc2UgaWYgcG9zc2libGUuICBPdGhlciBlbGVtZW50cyByZW1haW4gdW50b3VjaGVkLgorICAgICAgICoKKyAgICAgICAqICBkb190b2xvd2VyKCkgaXMgYSBob29rIGZvciBhIGRlcml2ZWQgZmFjZXQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICAgICAgICogIGxvd2VyY2FzaW5nLiAgZG9fdG9sb3dlcigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgKiAgdGhlIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcl90eXBlKgorICAgICAgZG9fdG9sb3dlcihjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV2lkZW4gY2hhciB0byB3Y2hhcl90CisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgY2hhciB0byB3Y2hhcl90IHVzaW5nIHRoZQorICAgICAgICogIHNpbXBsZXN0IHJlYXNvbmFibGUgdHJhbnNmb3JtYXRpb24uICBGb3IgYW4gdW5kZXJpdmVkIGN0eXBlPHdjaGFyX3Q+CisgICAgICAgKiAgZmFjZXQsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGNhc3QgdG8gd2NoYXJfdC4KKyAgICAgICAqCisgICAgICAgKiAgZG9fd2lkZW4oKSBpcyBhIGhvb2sgZm9yIGEgZGVyaXZlZCBmYWNldCB0byBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCisgICAgICAgKiAgd2lkZW5pbmcuICBkb193aWRlbigpIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHRoZQorICAgICAgICogIHNhbWUgaW5wdXQuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IHRoaXMgaXMgbm90IHdoYXQgeW91IHdhbnQgZm9yIGNvZGVwYWdlIGNvbnZlcnNpb25zLiAgU2VlCisgICAgICAgKiAgY29kZWN2dCBmb3IgdGhhdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGMgIFRoZSBjaGFyIHRvIGNvbnZlcnQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCB3Y2hhcl90LgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb193aWRlbihjaGFyKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXaWRlbiBjaGFyIGFycmF5IHRvIHdjaGFyX3QgYXJyYXkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBlYWNoIGNoYXIgaW4gdGhlIGlucHV0IHRvIHdjaGFyX3QgdXNpbmcgdGhlCisgICAgICAgKiAgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbi4gIEZvciBhbiB1bmRlcml2ZWQgY3R5cGU8d2NoYXJfdD4KKyAgICAgICAqICBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkLCBjYXN0aW5nIGVhY2ggZWxlbWVudCB0byB3Y2hhcl90LgorICAgICAgICoKKyAgICAgICAqICBkb193aWRlbigpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICB3aWRlbmluZy4gIGRvX3dpZGVuKCkgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IgdGhlCisgICAgICAgKiAgc2FtZSBpbnB1dC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZTogdGhpcyBpcyBub3Qgd2hhdCB5b3Ugd2FudCBmb3IgY29kZXBhZ2UgY29udmVyc2lvbnMuICBTZWUKKyAgICAgICAqICBjb2RlY3Z0IGZvciB0aGF0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gbG8gIFBvaW50ZXIgdG8gc3RhcnQgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtIGhpICBQb2ludGVyIHRvIGVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gdG8gIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LgorICAgICAgICogIEByZXR1cm4gIEBhIGhpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhcioKKyAgICAgIGRvX3dpZGVuKGNvbnN0IGNoYXIqIF9fbG8sIGNvbnN0IGNoYXIqIF9faGksIGNoYXJfdHlwZSogX19kZXN0KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOYXJyb3cgd2NoYXJfdCB0byBjaGFyCisgICAgICAgKgorICAgICAgICogIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnQgdG8gY2hhciB1c2luZworICAgICAgICogIHRoZSBzaW1wbGVzdCByZWFzb25hYmxlIHRyYW5zZm9ybWF0aW9uLiAgSWYgdGhlIGNvbnZlcnNpb24KKyAgICAgICAqICBmYWlscywgZGZhdWx0IGlzIHJldHVybmVkIGluc3RlYWQuICBGb3IgYW4gdW5kZXJpdmVkCisgICAgICAgKiAgY3R5cGU8d2NoYXJfdD4gZmFjZXQsIEBhIGMgd2lsbCBiZSBjYXN0IHRvIGNoYXIgYW5kCisgICAgICAgKiAgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIGRvX25hcnJvdygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICBiZWhhdmlvciBvZiBuYXJyb3dpbmcuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlCisgICAgICAgKiAgc2FtZSByZXN1bHQgZm9yIHRoZSBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjICBUaGUgd2NoYXJfdCB0byBjb252ZXJ0LgorICAgICAgICogIEBwYXJhbSBkZmF1bHQgIENoYXIgdG8gcmV0dXJuIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGNvbnZlcnRlZCBjaGFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcgorICAgICAgZG9fbmFycm93KGNoYXJfdHlwZSwgY2hhciBfX2RmYXVsdCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTmFycm93IHdjaGFyX3QgYXJyYXkgdG8gY2hhciBhcnJheQorICAgICAgICoKKyAgICAgICAqICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY29udmVydHMgZWFjaCB3Y2hhcl90IGluIHRoZSByYW5nZSBbbG8saGkpIHRvCisgICAgICAgKiAgY2hhciB1c2luZyB0aGUgc2ltcGxlc3QgcmVhc29uYWJsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgd3JpdGVzIHRoZQorICAgICAgICogIHJlc3VsdHMgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5LiAgRm9yIGFueSB3Y2hhcl90IGluIHRoZSBpbnB1dCB0aGF0CisgICAgICAgKiAgY2Fubm90IGJlIGNvbnZlcnRlZCwgQGEgZGZhdWx0IGlzIHVzZWQgaW5zdGVhZC4gIEZvciBhbiB1bmRlcml2ZWQKKyAgICAgICAqICBjdHlwZTx3Y2hhcl90PiBmYWNldCwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkLCBjYXN0aW5nIGVhY2gKKyAgICAgICAqICBlbGVtZW50IHRvIGNoYXIuCisgICAgICAgKgorICAgICAgICogIGRvX25hcnJvdygpIGlzIGEgaG9vayBmb3IgYSBkZXJpdmVkIGZhY2V0IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YKKyAgICAgICAqICBuYXJyb3dpbmcuICBkb19uYXJyb3coKSBtdXN0IGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGZvciB0aGUKKyAgICAgICAqICBzYW1lIGlucHV0LgorICAgICAgICoKKyAgICAgICAqICBOb3RlOiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50IGZvciBjb2RlcGFnZSBjb252ZXJzaW9ucy4gIFNlZQorICAgICAgICogIGNvZGVjdnQgZm9yIHRoYXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBsbyAgUG9pbnRlciB0byBzdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gaGkgIFBvaW50ZXIgdG8gZW5kIG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBkZmF1bHQgIENoYXIgdG8gdXNlIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgKiAgQHBhcmFtIHRvICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheS4KKyAgICAgICAqICBAcmV0dXJuICBAYSBoaS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGRvX25hcnJvdyhjb25zdCBjaGFyX3R5cGUqIF9fbG8sIGNvbnN0IGNoYXJfdHlwZSogX19oaSwKKwkJY2hhciBfX2RmYXVsdCwgY2hhciogX19kZXN0KSBjb25zdDsKKworICAgICAgLy8gRm9yIHVzZSBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvbmx5LgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9jdHlwZSgpIHRocm93KCk7CisgICAgfTsKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyAgLy8vIGNsYXNzIGN0eXBlX2J5bmFtZSBbMjIuMi4xLjJdLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgY3R5cGVfYnluYW1lIDogcHVibGljIGN0eXBlPF9DaGFyVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjdHlwZTxfQ2hhclQ+OjptYXNrICBtYXNrOworCisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlX2J5bmFtZSgpIHsgfTsKKyAgICB9OworCisgIC8vLyAyMi4yLjEuNCAgQ2xhc3MgY3R5cGVfYnluYW1lIHNwZWNpYWxpemF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIGN0eXBlX2J5bmFtZTxjaGFyPiA6IHB1YmxpYyBjdHlwZTxjaGFyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY3R5cGVfYnluYW1lKGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfmN0eXBlX2J5bmFtZSgpOworICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgY3R5cGVfYnluYW1lPHdjaGFyX3Q+IDogcHVibGljIGN0eXBlPHdjaGFyX3Q+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjdHlwZV9ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+Y3R5cGVfYnluYW1lKCk7CisgICAgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKy8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBjdHlwZSBpbmxpbmVzLgorI2luY2x1ZGUgPGJpdHMvY3R5cGVfaW5saW5lLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyAyMi4yLjIgIFRoZSBudW1lcmljIGNhdGVnb3J5LgorICBjbGFzcyBfX251bV9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIC8vIE5COiBDb2RlIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIF9TX2F0b21zX291dCBlbGVtZW50cy4KKyAgICAvLyBCZWxvdyBhcmUgdGhlIGluZGljZXMgaW50byBfU19hdG9tc19vdXQuCisgICAgZW51bQorICAgICAgeworICAgICAgICBfU19vbWludXMsCisgICAgICAgIF9TX29wbHVzLAorICAgICAgICBfU19veCwKKyAgICAgICAgX1Nfb1gsCisgICAgICAgIF9TX29kaWdpdHMsCisgICAgICAgIF9TX29kaWdpdHNfZW5kID0gX1Nfb2RpZ2l0cyArIDE2LAorICAgICAgICBfU19vdWRpZ2l0cyA9IF9TX29kaWdpdHNfZW5kLAorICAgICAgICBfU19vdWRpZ2l0c19lbmQgPSBfU19vdWRpZ2l0cyArIDE2LAorICAgICAgICBfU19vZSA9IF9TX29kaWdpdHMgKyAxNCwgIC8vIEZvciBzY2llbnRpZmljIG5vdGF0aW9uLCAnZScKKyAgICAgICAgX1Nfb0UgPSBfU19vdWRpZ2l0cyArIDE0LCAvLyBGb3Igc2NpZW50aWZpYyBub3RhdGlvbiwgJ0UnCisJX1Nfb2VuZCA9IF9TX291ZGlnaXRzX2VuZAorICAgICAgfTsKKworICAgIC8vIEEgbGlzdCBvZiB2YWxpZCBudW1lcmljIGxpdGVyYWxzIGZvciBvdXRwdXQuICBUaGlzIGFycmF5CisgICAgLy8gY29udGFpbnMgY2hhcnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBjdXJyZW50IGxvY2FsZSdzCisgICAgLy8gY3R5cGU8X0NoYXJUPi53aWRlbigpIGFuZCB0aGVuIHVzZWQgdG8gcmVuZGVyIG51bWJlcnMuCisgICAgLy8gRm9yIHRoZSBzdGFuZGFyZCAiQyIgbG9jYWxlLCB0aGlzIGlzCisgICAgLy8gIi0reFgwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OUFCQ0RFRiIuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIF9TX2F0b21zX291dDsKKworICAgIC8vIFN0cmluZyBsaXRlcmFsIG9mIGFjY2VwdGFibGUgKG5hcnJvdykgaW5wdXQsIGZvciBudW1fZ2V0LgorICAgIC8vICItK3hYMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRiIKKyAgICBzdGF0aWMgY29uc3QgY2hhciogX1NfYXRvbXNfaW47CisKKyAgICBlbnVtCisgICAgeworICAgICAgX1NfaW1pbnVzLAorICAgICAgX1NfaXBsdXMsCisgICAgICBfU19peCwKKyAgICAgIF9TX2lYLAorICAgICAgX1NfaXplcm8sCisgICAgICBfU19pZSA9IF9TX2l6ZXJvICsgMTQsCisgICAgICBfU19pRSA9IF9TX2l6ZXJvICsgMjAsCisgICAgICBfU19pZW5kID0gMjYKKyAgICB9OworCisgICAgLy8gbnVtX3B1dAorICAgIC8vIENvbnN0cnVjdCBhbmQgcmV0dXJuIHZhbGlkIHNjYW5mIGZvcm1hdCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCisgICAgc3RhdGljIHZvaWQKKyAgICBfU19mb3JtYXRfZmxvYXQoY29uc3QgaW9zX2Jhc2UmIF9faW8sIGNoYXIqIF9fZnB0ciwgY2hhciBfX21vZCkgdGhyb3coKTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9fbnVtcHVuY3RfY2FjaGUgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqCQkJX01fZ3JvdXBpbmc7CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZ3JvdXBpbmdfc2l6ZTsKKyAgICAgIGJvb2wJCQkJX01fdXNlX2dyb3VwaW5nOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX3RydWVuYW1lOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3RydWVuYW1lX3NpemU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZmFsc2VuYW1lOworICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2ZhbHNlbmFtZV9zaXplOworICAgICAgX0NoYXJUCQkJCV9NX2RlY2ltYWxfcG9pbnQ7CisgICAgICBfQ2hhclQJCQkJX01fdGhvdXNhbmRzX3NlcDsKKworICAgICAgLy8gQSBsaXN0IG9mIHZhbGlkIG51bWVyaWMgbGl0ZXJhbHMgZm9yIG91dHB1dDogaW4gdGhlIHN0YW5kYXJkCisgICAgICAvLyAiQyIgbG9jYWxlLCB0aGlzIGlzICItK3hYMDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlBQkNERUYiLgorICAgICAgLy8gVGhpcyBhcnJheSBjb250YWlucyB0aGUgY2hhcnMgYWZ0ZXIgaGF2aW5nIGJlZW4gcGFzc2VkCisgICAgICAvLyB0aHJvdWdoIHRoZSBjdXJyZW50IGxvY2FsZSdzIGN0eXBlPF9DaGFyVD4ud2lkZW4oKS4KKyAgICAgIF9DaGFyVAkJCQlfTV9hdG9tc19vdXRbX19udW1fYmFzZTo6X1Nfb2VuZF07CisKKyAgICAgIC8vIEEgbGlzdCBvZiB2YWxpZCBudW1lcmljIGxpdGVyYWxzIGZvciBpbnB1dDogaW4gdGhlIHN0YW5kYXJkCisgICAgICAvLyAiQyIgbG9jYWxlLCB0aGlzIGlzICItK3hYMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRiIKKyAgICAgIC8vIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGNoYXJzIGFmdGVyIGhhdmluZyBiZWVuIHBhc3NlZAorICAgICAgLy8gdGhyb3VnaCB0aGUgY3VycmVudCBsb2NhbGUncyBjdHlwZTxfQ2hhclQ+LndpZGVuKCkuCisgICAgICBfQ2hhclQJCQkJX01fYXRvbXNfaW5bX19udW1fYmFzZTo6X1NfaWVuZF07CisKKyAgICAgIGJvb2wJCQkJX01fYWxsb2NhdGVkOworCisgICAgICBfX251bXB1bmN0X2NhY2hlKHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9ncm91cGluZygwKSwgX01fZ3JvdXBpbmdfc2l6ZSgwKSwKKwlfTV91c2VfZ3JvdXBpbmcoZmFsc2UpLAorCV9NX3RydWVuYW1lKDApLCBfTV90cnVlbmFtZV9zaXplKDApLCBfTV9mYWxzZW5hbWUoMCksCisJX01fZmFsc2VuYW1lX3NpemUoMCksIF9NX2RlY2ltYWxfcG9pbnQoX0NoYXJUKCkpLAorCV9NX3Rob3VzYW5kc19zZXAoX0NoYXJUKCkpLCBfTV9hbGxvY2F0ZWQoZmFsc2UpCisgICAgICAgIHsgfQorCisgICAgICB+X19udW1wdW5jdF9jYWNoZSgpOworCisgICAgICB2b2lkCisgICAgICBfTV9jYWNoZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgIHByaXZhdGU6CisgICAgICBfX251bXB1bmN0X2NhY2hlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fbnVtcHVuY3RfY2FjaGUmKTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIF9fbnVtcHVuY3RfY2FjaGUoY29uc3QgX19udW1wdW5jdF9jYWNoZSYpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPjo6fl9fbnVtcHVuY3RfY2FjaGUoKQorICAgIHsKKyAgICAgIGlmIChfTV9hbGxvY2F0ZWQpCisJeworCSAgZGVsZXRlIFtdIF9NX2dyb3VwaW5nOworCSAgZGVsZXRlIFtdIF9NX3RydWVuYW1lOworCSAgZGVsZXRlIFtdIF9NX2ZhbHNlbmFtZTsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG51bXB1bmN0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBzdG9yZXMgc2V2ZXJhbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBwcmludGluZyBhbmQKKyAgICogIHNjYW5uaW5nIG51bWJlcnMsIHN1Y2ggYXMgdGhlIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyLiAgSXQgdGFrZXMgYQorICAgKiAgdGVtcGxhdGUgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNoYXIgdHlwZS4gIFRoZSBudW1wdW5jdCBmYWNldCBpcworICAgKiAgdXNlZCBieSBzdHJlYW1zIGZvciBtYW55IEkvTyBvcGVyYXRpb25zIGludm9sdmluZyBudW1iZXJzLgorICAgKgorICAgKiAgVGhlIG51bXB1bmN0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlCisgICAqICBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBob29rcyBmb3IgZGV2ZWxvcGVycyB0bworICAgKiAgaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbSBhIG51bXB1bmN0IGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgbnVtcHVuY3QgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKyAgICAgIHR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ICBfX2NhY2hlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2NhY2hlX3R5cGUqCQkJX01fZGF0YTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQkJaWQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtcHVuY3QgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcmVmcyAgUmVmY291bnQgdG8gcGFzcyB0byB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9kYXRhKDApCisgICAgICB7IF9NX2luaXRpYWxpemVfbnVtcHVuY3QoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiAgTm90IGZvciBnZW5lcmFsIHVzZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZvciB1c2UgYnkgdGhlIGxpYnJhcnkgaXRzZWxmIHRvIHNldCB1cCB0aGUKKyAgICAgICAqICBwcmVkZWZpbmVkIGxvY2FsZSBmYWNldHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgY2FjaGUgIF9fbnVtcHVuY3RfY2FjaGUgb2JqZWN0LgorICAgICAgICogIEBwYXJhbSAgcmVmcyAgUmVmY291bnQgdG8gcGFzcyB0byB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0KF9fY2FjaGVfdHlwZSogX19jYWNoZSwgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoX19jYWNoZSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9udW1wdW5jdCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJuYWwgY29uc3RydWN0b3IuICBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgY2xvYyAgVGhlIEMgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgcmVmcyAgUmVmY291bnQgdG8gcGFzcyB0byB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKQorICAgICAgeyBfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY2xvYyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSBkZWNpbWFsIHBvaW50LiAgSXQKKyAgICAgICAqICBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb19kZWNpbWFsX3BvaW50KCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSBkZWNpbWFsIHBvaW50LgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgZGVjaW1hbF9wb2ludCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19kZWNpbWFsX3BvaW50KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSB0aG91c2FuZHMKKyAgICAgICAqICBzZXBhcmF0b3IuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb190aG91c2FuZHNfc2VwKCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSB0aG91c2FuZHMgc2VwYXJhdG9yLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190aG91c2FuZHNfc2VwKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZ3MgZm9yIHRoZQorICAgICAgICogIGludGVnZXIgcGFydCBvZiBhIG51bWJlci4gIEdyb3VwaW5ncyBpbmRpY2F0ZSB3aGVyZSB0aG91c2FuZHMKKyAgICAgICAqICBzZXBhcmF0b3JzIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgaW50ZWdlciBwYXJ0IG9mIGEgbnVtYmVyLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGNoYXIgaW4gdGhlIHJldHVybiBzdHJpbmcgaXMgaW50ZXJwcmV0IGFzIGFuIGludGVnZXIKKyAgICAgICAqICByYXRoZXIgdGhhbiBhIGNoYXJhY3Rlci4gIFRoZXNlIG51bWJlcnMgcmVwcmVzZW50IHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBkaWdpdHMgaW4gYSBncm91cC4gIFRoZSBmaXJzdCBjaGFyIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudAorICAgICAgICogIGdyb3VwLiAgSWYgYSBjaGFyIGlzIG5lZ2F0aXZlLCBpdCBpbmRpY2F0ZXMgYW4gdW5saW1pdGVkCisgICAgICAgKiAgbnVtYmVyIG9mIGRpZ2l0cyBmb3IgdGhlIGdyb3VwLiAgSWYgbW9yZSBjaGFycyBmcm9tIHRoZQorICAgICAgICogIHN0cmluZyBhcmUgcmVxdWlyZWQgdG8gZ3JvdXAgYSBudW1iZXIsIHRoZSBsYXN0IGNoYXIgaXMgdXNlZAorICAgICAgICogIHJlcGVhdGVkbHkuCisgICAgICAgKgorICAgICAgICogIEZvciBleGFtcGxlLCBpZiB0aGUgZ3JvdXBpbmcoKSByZXR1cm5zICJcMDAzXDAwMiIgYW5kIGlzCisgICAgICAgKiAgYXBwbGllZCB0byB0aGUgbnVtYmVyIDEyMzQ1Njc4OSwgdGhpcyBjb3JyZXNwb25kcyB0bworICAgICAgICogIDEyLDM0LDU2LDc4OS4gIE5vdGUgdGhhdCBpZiB0aGUgc3RyaW5nIHdhcyAiMzIiLCB0aGlzIHdvdWxkCisgICAgICAgKiAgcHV0IG1vcmUgdGhhbiA1MCBkaWdpdHMgaW50byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZ3JvdXAgaWYKKyAgICAgICAqICB0aGUgY2hhcmFjdGVyIHNldCBpcyBBU0NJSS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHN0cmluZyBpcyByZXR1cm5lZCBieSBjYWxsaW5nCisgICAgICAgKiAgbnVtcHVuY3Q8Y2hhcl90eXBlPjo6ZG9fZ3JvdXBpbmcoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgKi8KKyAgICAgIHN0cmluZworICAgICAgZ3JvdXBpbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ3JvdXBpbmcoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYm9vbCB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSBjb250YWluaW5nIHRoZSB0ZXh0CisgICAgICAgKiAgcmVwcmVzZW50YXRpb24gZm9yIHRydWUgYm9vbCB2YXJpYWJsZXMuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb190cnVlbmFtZSgpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgcHJpbnRlZCBmb3JtIG9mIHRydWUuCisgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHRydWVuYW1lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3RydWVuYW1lKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2wgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIGNvbnRhaW5pbmcgdGhlIHRleHQKKyAgICAgICAqICByZXByZXNlbnRhdGlvbiBmb3IgZmFsc2UgYm9vbCB2YXJpYWJsZXMuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1wdW5jdDxjaGFyX3R5cGU+Ojpkb19mYWxzZW5hbWUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIHByaW50ZWQgZm9ybSBvZiBmYWxzZS4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgZmFsc2VuYW1lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2ZhbHNlbmFtZSgpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5udW1wdW5jdCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBkZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSBkZWNpbWFsIHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBhCisgICAgICAgKiAgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSBkZWNpbWFsIHBvaW50LgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2RlY2ltYWxfcG9pbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBjaGFyX3R5cGUgdG8gdXNlIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4gIFRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBjaGFyX3R5cGUgcmVwcmVzZW50aW5nIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV90aG91c2FuZHNfc2VwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5ncyBmb3IgdGhlIGludGVnZXIgcGFydCBvZiBhCisgICAgICAgKiAgbnVtYmVyLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdyb3VwaW5nKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIFN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZworICAgICAgZG9fZ3JvdXBpbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZ3JvdXBpbmc7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2wgdHJ1ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIHN0cmluZ190eXBlIGNvbnRhaW5pbmcgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gZm9yIHRydWUKKyAgICAgICAqICBib29sIHZhcmlhYmxlcy4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8KKyAgICAgICAqICBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgcHJpbnRlZCBmb3JtIG9mIHRydWUuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fdHJ1ZW5hbWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fdHJ1ZW5hbWU7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJvb2wgZmFsc2UuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBzdHJpbmdfdHlwZSBjb250YWluaW5nIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIGZvciBmYWxzZQorICAgICAgICogIGJvb2wgdmFyaWFibGVzLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0bworICAgICAgICogIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBwcmludGVkIGZvcm0gb2YgZmFsc2UuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fZmFsc2VuYW1lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2ZhbHNlbmFtZTsgfQorCisgICAgICAvLyBGb3IgdXNlIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG9ubHkuCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jID0gMCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgbG9jYWxlOjppZCBudW1wdW5jdDxfQ2hhclQ+OjppZDsKKworICB0ZW1wbGF0ZTw+CisgICAgbnVtcHVuY3Q8Y2hhcj46On5udW1wdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgbnVtcHVuY3Q8Y2hhcj46Ol9NX2luaXRpYWxpemVfbnVtcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIG51bXB1bmN0PHdjaGFyX3Q+Ojp+bnVtcHVuY3QoKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIG51bXB1bmN0PHdjaGFyX3Q+OjpfTV9pbml0aWFsaXplX251bXB1bmN0KF9fY19sb2NhbGUgX19jbG9jKTsKKyNlbmRpZgorCisgIC8vLyBjbGFzcyBudW1wdW5jdF9ieW5hbWUgWzIyLjIuMy4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG51bXB1bmN0X2J5bmFtZSA6IHB1YmxpYyBudW1wdW5jdDxfQ2hhclQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIG51bXB1bmN0X2J5bmFtZShjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiBudW1wdW5jdDxfQ2hhclQ+KF9fcmVmcykKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX3N0cmNtcChfX3MsICJDIikgIT0gMAorCSAgICAmJiBfX2J1aWx0aW5fc3RyY21wKF9fcywgIlBPU0lYIikgIT0gMCkKKwkgIHsKKwkgICAgX19jX2xvY2FsZSBfX3RtcDsKKwkgICAgdGhpcy0+X1NfY3JlYXRlX2NfbG9jYWxlKF9fdG1wLCBfX3MpOworCSAgICB0aGlzLT5fTV9pbml0aWFsaXplX251bXB1bmN0KF9fdG1wKTsKKwkgICAgdGhpcy0+X1NfZGVzdHJveV9jX2xvY2FsZShfX3RtcCk7CisJICB9CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+bnVtcHVuY3RfYnluYW1lKCkgeyB9CisgICAgfTsKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBudW1fZ2V0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gcGFyc2UgYW5kIHJldHVybiBhIG51bWJlcgorICAgKiAgZnJvbSBhIHN0cmluZy4gIEl0IGlzIHVzZWQgYnkgdGhlIGlzdHJlYW0gbnVtZXJpYyBleHRyYWN0aW9uCisgICAqICBvcGVyYXRvcnMuCisgICAqCisgICAqICBUaGUgbnVtX2dldCB0ZW1wbGF0ZSB1c2VzIHByb3RlY3RlZCB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBwcm92aWRlIHRoZQorICAgKiAgYWN0dWFsIHJlc3VsdHMuICBUaGUgcHVibGljIGFjY2Vzc29ycyBmb3J3YXJkIHRoZSBjYWxsIHRvIHRoZSB2aXJ0dWFsCisgICAqICBmdW5jdGlvbnMuICBUaGVzZSB2aXJ0dWFsIGZ1bmN0aW9ucyBhcmUgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8KKyAgICogIGltcGxlbWVudCB0aGUgYmVoYXZpb3IgdGhleSByZXF1aXJlIGZyb20gdGhlIG51bV9nZXQgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBjbGFzcyBudW1fZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0luSXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBudW1fZ2V0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGZhY2V0KF9fcmVmcykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBwYXJzaW5nLgorICAgICAgICoKKyAgICAgICAqICBQYXJzZXMgdGhlIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBib29sIEBhIHYuICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcKKyAgICAgICAqICBudW1fZ2V0Ojpkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OmJvb2xhbHBoYSBpcyBzZXQsIGF0dGVtcHRzIHRvIHJlYWQKKyAgICAgICAqICBjdHlwZTxDaGFyVD46OnRydWVuYW1lKCkgb3IgY3R5cGU8Q2hhclQ+OjpmYWxzZW5hbWUoKS4gIFNldHMKKyAgICAgICAqICBAYSB2IHRvIHRydWUgb3IgZmFsc2UgaWYgc3VjY2Vzc2Z1bC4gIFNldHMgZXJyIHRvCisgICAgICAgKiAgaW9zX2Jhc2U6OmZhaWxiaXQgaWYgcmVhZGluZyB0aGUgc3RyaW5nIGZhaWxzLiAgU2V0cyBlcnIgdG8KKyAgICAgICAqICBpb3NfYmFzZTo6ZW9mYml0IGlmIHRoZSBzdHJlYW0gaXMgZW1wdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OmJvb2xhbHBoYSBpcyBub3Qgc2V0LCBwcm9jZWVkcyBhcyB3aXRoIHJlYWRpbmcgYSBsb25nLAorICAgICAgICogIGV4Y2VwdCBpZiB0aGUgdmFsdWUgaXMgMSwgc2V0cyBAYSB2IHRvIHRydWUsIGlmIHRoZSB2YWx1ZSBpcyAwLCBzZXRzCisgICAgICAgKiAgQGEgdiB0byBmYWxzZSwgYW5kIG90aGVyd2lzZSBzZXQgZXJyIHRvIGlvc19iYXNlOjpmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGluICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBlcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHJlYWRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGJvb2wmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGludGVncmFsIHZhcmlhYmxlIEBhIHYuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgY2FsbGluZyBudW1fZ2V0Ojpkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2luZyBpcyBhZmZlY3RlZCBieSB0aGUgZmxhZyBzZXR0aW5ncyBpbiBAYSBpby4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJhc2ljIHBhcnNlIGlzIGFmZmVjdGVkIGJ5IHRoZSB2YWx1ZSBvZiBpby5mbGFncygpICYKKyAgICAgICAqICBpb3NfYmFzZTo6YmFzZWZpZWxkLiAgSWYgZXF1YWwgdG8gaW9zX2Jhc2U6Om9jdCwgcGFyc2VzIGxpa2UgdGhlCisgICAgICAgKiAgc2NhbmYgJW8gc3BlY2lmaWVyLiAgRWxzZSBpZiBlcXVhbCB0byBpb3NfYmFzZTo6aGV4LCBwYXJzZXMgbGlrZSAlWAorICAgICAgICogIHNwZWNpZmllci4gIEVsc2UgaWYgYmFzZWZpZWxkIGVxdWFsIHRvIDAsIHBhcnNlcyBsaWtlIHRoZSAlaQorICAgICAgICogIHNwZWNpZmllci4gIE90aGVyd2lzZSwgcGFyc2VzIGxpa2UgJWQgZm9yIHNpZ25lZCBhbmQgJXUgZm9yIHVuc2lnbmVkCisgICAgICAgKiAgdHlwZXMuICBUaGUgbWF0Y2hpbmcgdHlwZSBsZW5ndGggbW9kaWZpZXIgaXMgYWxzbyB1c2VkLgorICAgICAgICoKKyAgICAgICAqICBEaWdpdCBncm91cGluZyBpcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gbnVtcHVuY3Q6Omdyb3VwaW5nKCkgYW5kCisgICAgICAgKiAgbnVtcHVuY3Q6OnRob3VzYW5kc19zZXAoKS4gIElmIHRoZSBwYXR0ZXJuIG9mIGRpZ2l0IGdyb3VwcyBpc24ndAorICAgICAgICogIGNvbnNpc3RlbnQsIHNldHMgZXJyIHRvIGlvc19iYXNlOjpmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICBJZiBwYXJzaW5nIHRoZSBzdHJpbmcgeWllbGRzIGEgdmFsaWQgdmFsdWUgZm9yIEBhIHYsIEBhIHYgaXMgc2V0LgorICAgICAgICogIE90aGVyd2lzZSwgc2V0cyBlcnIgdG8gaW9zX2Jhc2U6OmZhaWxiaXQgYW5kIGxlYXZlcyBAYSB2IHVuYWx0ZXJlZC4KKyAgICAgICAqICBTZXRzIGVyciB0byBpb3NfYmFzZTo6ZW9mYml0IGlmIHRoZSBzdHJlYW0gaXMgZW1wdGllZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBpbiAgU3RhcnQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgZW5kICBFbmQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICB2ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciByZWFkaW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBzaG9ydCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpICAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHVuc2lnbmVkIGxvbmcmIF9fdikgIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX2luLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nIGxvbmcmIF9fdikgIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisjZW5kaWYKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIGludGVncmFsIHZhcmlhYmxlIEBhIHYuICBJdCBkb2VzIHNvCisgICAgICAgKiAgYnkgY2FsbGluZyBudW1fZ2V0Ojpkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGlucHV0IGNoYXJhY3RlcnMgYXJlIHBhcnNlZCBsaWtlIHRoZSBzY2FuZiAlZyBzcGVjaWZpZXIuICBUaGUKKyAgICAgICAqICBtYXRjaGluZyB0eXBlIGxlbmd0aCBtb2RpZmllciBpcyBhbHNvIHVzZWQuCisgICAgICAgKgorICAgICAgICogIFRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlciB1c2VkIGlzIG51bXB1bmN0OjpkZWNpbWFsX3BvaW50KCkuCisgICAgICAgKiAgRGlnaXQgZ3JvdXBpbmcgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIG51bXB1bmN0Ojpncm91cGluZygpIGFuZAorICAgICAgICogIG51bXB1bmN0Ojp0aG91c2FuZHNfc2VwKCkuICBJZiB0aGUgcGF0dGVybiBvZiBkaWdpdCBncm91cHMgaXNuJ3QKKyAgICAgICAqICBjb25zaXN0ZW50LCBzZXRzIGVyciB0byBpb3NfYmFzZTo6ZmFpbGJpdC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgcGFyc2luZyB0aGUgc3RyaW5nIHlpZWxkcyBhIHZhbGlkIHZhbHVlIGZvciBAYSB2LCBAYSB2IGlzIHNldC4KKyAgICAgICAqICBPdGhlcndpc2UsIHNldHMgZXJyIHRvIGlvc19iYXNlOjpmYWlsYml0IGFuZCBsZWF2ZXMgQGEgdiB1bmFsdGVyZWQuCisgICAgICAgKiAgU2V0cyBlcnIgdG8gaW9zX2Jhc2U6OmVvZmJpdCBpZiB0aGUgc3RyZWFtIGlzIGVtcHRpZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgaW4gIFN0YXJ0IG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIGlucHV0IHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgcmVhZGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZmxvYXQmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0KF9faW4sIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIGdldChpdGVyX3R5cGUgX19pbiwgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX2luLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdik7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIHBhcnNpbmcuCisgICAgICAgKgorICAgICAgICogIFBhcnNlcyB0aGUgaW5wdXQgc3RyZWFtIGludG8gdGhlIHBvaW50ZXIgdmFyaWFibGUgQGEgdi4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9nZXQ6OmRvX2dldCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGUgaW5wdXQgY2hhcmFjdGVycyBhcmUgcGFyc2VkIGxpa2UgdGhlIHNjYW5mICVwIHNwZWNpZmllci4KKyAgICAgICAqCisgICAgICAgKiAgRGlnaXQgZ3JvdXBpbmcgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIG51bXB1bmN0Ojpncm91cGluZygpIGFuZAorICAgICAgICogIG51bXB1bmN0Ojp0aG91c2FuZHNfc2VwKCkuICBJZiB0aGUgcGF0dGVybiBvZiBkaWdpdCBncm91cHMgaXNuJ3QKKyAgICAgICAqICBjb25zaXN0ZW50LCBzZXRzIGVyciB0byBpb3NfYmFzZTo6ZmFpbGJpdC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBkaWdpdCBncm91cGluZyBlZmZlY3QgZm9yIHBvaW50ZXJzIGlzIGEgYml0IGFtYmlndW91cworICAgICAgICogIGluIHRoZSBzdGFuZGFyZCBhbmQgc2hvdWxkbid0IGJlIHJlbGllZCBvbi4gIFNlZSBEUiAzNDQuCisgICAgICAgKgorICAgICAgICogIElmIHBhcnNpbmcgdGhlIHN0cmluZyB5aWVsZHMgYSB2YWxpZCB2YWx1ZSBmb3IgQGEgdiwgQGEgdiBpcyBzZXQuCisgICAgICAgKiAgT3RoZXJ3aXNlLCBzZXRzIGVyciB0byBpb3NfYmFzZTo6ZmFpbGJpdCBhbmQgbGVhdmVzIEBhIHYgdW5hbHRlcmVkLgorICAgICAgICogIFNldHMgZXJyIHRvIGlvc19iYXNlOjplb2ZiaXQgaWYgdGhlIHN0cmVhbSBpcyBlbXB0aWVkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGluICBTdGFydCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBlcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHJlYWRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9faW4sIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHZvaWQqJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19pbiwgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwgfm51bV9nZXQoKSB7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X2Zsb2F0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiwKKwkJICAgICAgIHN0cmluZyYpIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgICBpdGVyX3R5cGUKKyAgICAgICAgX01fZXh0cmFjdF9pbnQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLAorCQkgICAgICAgX1ZhbHVlVCYpIGNvbnN0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsIGludD46Ol9fdHlwZQorICAgICAgICBfTV9maW5kKGNvbnN0IF9DaGFyVDIqLCBzaXplX3QgX19sZW4sIF9DaGFyVDIgX19jKSBjb25zdAorICAgICAgICB7CisJICBpbnQgX19yZXQgPSAtMTsKKwkgIGlmIChfX2xlbiA8PSAxMCkKKwkgICAgeworCSAgICAgIGlmIChfX2MgPj0gX0NoYXJUMignMCcpICYmIF9fYyA8IF9DaGFyVDIoX0NoYXJUMignMCcpICsgX19sZW4pKQorCQlfX3JldCA9IF9fYyAtIF9DaGFyVDIoJzAnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9fYyA+PSBfQ2hhclQyKCcwJykgJiYgX19jIDw9IF9DaGFyVDIoJzknKSkKKwkJX19yZXQgPSBfX2MgLSBfQ2hhclQyKCcwJyk7CisJICAgICAgZWxzZSBpZiAoX19jID49IF9DaGFyVDIoJ2EnKSAmJiBfX2MgPD0gX0NoYXJUMignZicpKQorCQlfX3JldCA9IDEwICsgKF9fYyAtIF9DaGFyVDIoJ2EnKSk7CisJICAgICAgZWxzZSBpZiAoX19jID49IF9DaGFyVDIoJ0EnKSAmJiBfX2MgPD0gX0NoYXJUMignRicpKQorCQlfX3JldCA9IDEwICsgKF9fYyAtIF9DaGFyVDIoJ0EnKSk7CisJICAgIH0KKwkgIHJldHVybiBfX3JldDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVDI+CisgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsIAorCQkJCSAgICAgIGludD46Ol9fdHlwZQorICAgICAgICBfTV9maW5kKGNvbnN0IF9DaGFyVDIqIF9femVybywgc2l6ZV90IF9fbGVuLCBfQ2hhclQyIF9fYykgY29uc3QKKyAgICAgICAgeworCSAgaW50IF9fcmV0ID0gLTE7CisJICBjb25zdCBjaGFyX3R5cGUqIF9fcSA9IGNoYXJfdHJhaXRzPF9DaGFyVDI+OjpmaW5kKF9femVybywgX19sZW4sIF9fYyk7CisJICBpZiAoX19xKQorCSAgICB7CisJICAgICAgX19yZXQgPSBfX3EgLSBfX3plcm87CisJICAgICAgaWYgKF9fcmV0ID4gMTUpCisJCV9fcmV0IC09IDY7CisJICAgIH0KKwkgIHJldHVybiBfX3JldDsKKwl9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBwYXJzaW5nLgorICAgICAgICoKKyAgICAgICAqICBQYXJzZXMgdGhlIGlucHV0IHN0cmVhbSBpbnRvIHRoZSB2YXJpYWJsZSBAYSB2LiAgVGhpcyBmdW5jdGlvbiBpcyBhCisgICAgICAgKiAgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldCgpCisgICAgICAgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBpbiAgU3RhcnQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgZW5kICBFbmQgb2YgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICB2ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciByZWFkaW5nLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmLCBib29sJikgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBzaG9ydCYgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgaW50JiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB1bnNpZ25lZCBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdW5zaWduZWQgbG9uZyBsb25nJiBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHRyYWN0X2ludChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3YpOyB9CisjZW5kaWYKKworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisJICAgICBmbG9hdCYpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKwkgICAgIGRvdWJsZSYpIGNvbnN0OworCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIF9fZG9fZ2V0KGl0ZXJfdHlwZSwgaXRlcl90eXBlLCBpb3NfYmFzZSYsIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwKKwkgICAgICAgZG91YmxlJikgY29uc3Q7CisjZWxzZQorICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUsIGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsCisJICAgICBsb25nIGRvdWJsZSYpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorCSAgICAgdm9pZComKSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXQoaXRlcl90eXBlLCBpdGVyX3R5cGUsIGlvc19iYXNlJiwgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLAorCSAgICAgbG9uZyBkb3VibGUmKSBjb25zdDsKKyNlbmRpZgorICAgICAgLy9AfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGxvY2FsZTo6aWQgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjppZDsKKworCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG51bV9wdXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBjb252ZXJ0IGEgbnVtYmVyIHRvIGEgc3RyaW5nLiAgSXQgaXMKKyAgICogIHVzZWQgYnkgdGhlIG9zdHJlYW0gbnVtZXJpYyBpbnNlcnRpb24gb3BlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIG51bV9wdXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUKKyAgICogIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvCisgICAqICBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIHRoZSBudW1fcHV0IGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIGNsYXNzIG51bV9wdXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9PdXRJdGVyCQlpdGVyX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vLyBOdW1wdW5jdCBmYWNldCBpZC4KKyAgICAgIHN0YXRpYyBsb2NhbGU6OmlkCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBudW1fcHV0KHNpemVfdCBfX3JlZnMgPSAwKSA6IGZhY2V0KF9fcmVmcykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBib29sZWFuIEBhIHYgYW5kIGluc2VydHMgaXQgaW50byBhIHN0cmVhbS4gIEl0IGRvZXMgc28KKyAgICAgICAqICBieSBjYWxsaW5nIG51bV9wdXQ6OmRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpb3NfYmFzZTo6Ym9vbGFscGhhIGlzIHNldCwgd3JpdGVzIGN0eXBlPENoYXJUPjo6dHJ1ZW5hbWUoKSBvcgorICAgICAgICogIGN0eXBlPENoYXJUPjo6ZmFsc2VuYW1lKCkuICBPdGhlcndpc2UgZm9ybWF0cyBAYSB2IGFzIGFuIGludC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBmaWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTnVtZXJpYyBmb3JtYXR0aW5nLgorICAgICAgICoKKyAgICAgICAqICBGb3JtYXRzIHRoZSBpbnRlZ3JhbCB2YWx1ZSBAYSB2IGFuZCBpbnNlcnRzIGl0IGludG8gYQorICAgICAgICogIHN0cmVhbS4gIEl0IGRvZXMgc28gYnkgY2FsbGluZyBudW1fcHV0Ojpkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybWF0dGluZyBpcyBhZmZlY3RlZCBieSB0aGUgZmxhZyBzZXR0aW5ncyBpbiBAYSBpby4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJhc2ljIGZvcm1hdCBpcyBhZmZlY3RlZCBieSB0aGUgdmFsdWUgb2YgaW8uZmxhZ3MoKSAmCisgICAgICAgKiAgaW9zX2Jhc2U6OmJhc2VmaWVsZC4gIElmIGVxdWFsIHRvIGlvc19iYXNlOjpvY3QsIGZvcm1hdHMgbGlrZSB0aGUKKyAgICAgICAqICBwcmludGYgJW8gc3BlY2lmaWVyLiAgRWxzZSBpZiBlcXVhbCB0byBpb3NfYmFzZTo6aGV4LCBmb3JtYXRzIGxpa2UKKyAgICAgICAqICAleCBvciAlWCB3aXRoIGlvc19iYXNlOjp1cHBlcmNhc2UgdW5zZXQgb3Igc2V0IHJlc3BlY3RpdmVseS4KKyAgICAgICAqICBPdGhlcndpc2UsIGZvcm1hdHMgbGlrZSAlZCwgJWxkLCAlbGxkIGZvciBzaWduZWQgYW5kICV1LCAlbHUsICVsbHUKKyAgICAgICAqICBmb3IgdW5zaWduZWQgdmFsdWVzLiAgTm90ZSB0aGF0IGlmIGJvdGggb2N0IGFuZCBoZXggYXJlIHNldCwgbmVpdGhlcgorICAgICAgICogIHdpbGwgdGFrZSBlZmZlY3QuCisgICAgICAgKgorICAgICAgICogIElmIGlvc19iYXNlOjpzaG93cG9zIGlzIHNldCwgJysnIGlzIG91dHB1dCBiZWZvcmUgcG9zaXRpdmUgdmFsdWVzLgorICAgICAgICogIElmIGlvc19iYXNlOjpzaG93YmFzZSBpcyBzZXQsICcwJyBwcmVjZWRlcyBvY3RhbCB2YWx1ZXMgKGV4Y2VwdCAwKQorICAgICAgICogIGFuZCAnMFt4WF0nIHByZWNlZGVzIGhleCB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICogIFRob3VzYW5kcyBzZXBhcmF0b3JzIGFyZSBpbnNlcnRlZCBhY2NvcmRpbmcgdG8gbnVtcHVuY3Q6Omdyb3VwaW5nKCkKKyAgICAgICAqICBhbmQgbnVtcHVuY3Q6OnRob3VzYW5kc19zZXAoKS4gIFRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlciB1c2VkIGlzCisgICAgICAgKiAgbnVtcHVuY3Q6OmRlY2ltYWxfcG9pbnQoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW8ud2lkdGgoKSBpcyBub24temVybywgZW5vdWdoIEBhIGZpbGwgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgdG8KKyAgICAgICAqICBtYWtlIHRoZSByZXN1bHQgYXQgbGVhc3QgdGhhdCB3aWRlLiAgSWYKKyAgICAgICAqICAoaW8uZmxhZ3MoKSAmIGlvc19iYXNlOjphZGp1c3RmaWVsZCkgPT0gaW9zX2Jhc2U6OmxlZnQsIHJlc3VsdCBpcworICAgICAgICogIHBhZGRlZCBhdCB0aGUgZW5kLiAgSWYgaW9zX2Jhc2U6OmludGVybmFsLCB0aGVuIHBhZGRpbmcgb2NjdXJzCisgICAgICAgKiAgaW1tZWRpYXRlbHkgYWZ0ZXIgZWl0aGVyIGEgJysnIG9yICctJyBvciBhZnRlciAnMHgnIG9yICcwWCcuCisgICAgICAgKiAgT3RoZXJ3aXNlLCBwYWRkaW5nIG9jY3VycyBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHMgIFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgbG9jYWxlIGFuZCBmbGFncy4KKyAgICAgICAqICBAcGFyYW0gIGZpbGwgIENoYXJfdHlwZSB0byB1c2UgZm9yIGZpbGxpbmcuCisgICAgICAgKiAgQHBhcmFtICB2ICBWYWx1ZSB0byBmb3JtYXQgYW5kIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0KKworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwKKwkgIHVuc2lnbmVkIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsIGxvbmcgbG9uZyBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192KTsgfQorCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAorCSAgdW5zaWduZWQgbG9uZyBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3YpOyB9CisjZW5kaWYKKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBOdW1lcmljIGZvcm1hdHRpbmcuCisgICAgICAgKgorICAgICAgICogIEZvcm1hdHMgdGhlIGZsb2F0aW5nIHBvaW50IHZhbHVlIEBhIHYgYW5kIGluc2VydHMgaXQgaW50byBhIHN0cmVhbS4KKyAgICAgICAqICBJdCBkb2VzIHNvIGJ5IGNhbGxpbmcgbnVtX3B1dDo6ZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEZvcm1hdHRpbmcgaXMgYWZmZWN0ZWQgYnkgdGhlIGZsYWcgc2V0dGluZ3MgaW4gQGEgaW8uCisgICAgICAgKgorICAgICAgICogIFRoZSBiYXNpYyBmb3JtYXQgaXMgYWZmZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIGlvLmZsYWdzKCkgJgorICAgICAgICogIGlvc19iYXNlOjpmbG9hdGZpZWxkLiAgSWYgZXF1YWwgdG8gaW9zX2Jhc2U6OmZpeGVkLCBmb3JtYXRzIGxpa2UgdGhlCisgICAgICAgKiAgcHJpbnRmICVmIHNwZWNpZmllci4gIEVsc2UgaWYgZXF1YWwgdG8gaW9zX2Jhc2U6OnNjaWVudGlmaWMsIGZvcm1hdHMKKyAgICAgICAqICBsaWtlICVlIG9yICVFIHdpdGggaW9zX2Jhc2U6OnVwcGVyY2FzZSB1bnNldCBvciBzZXQgcmVzcGVjdGl2ZWx5LgorICAgICAgICogIE90aGVyd2lzZSwgZm9ybWF0cyBsaWtlICVnIG9yICVHIGRlcGVuZGluZyBvbiB1cHBlcmNhc2UuICBOb3RlIHRoYXQKKyAgICAgICAqICBpZiBib3RoIGZpeGVkIGFuZCBzY2llbnRpZmljIGFyZSBzZXQsIHRoZSBlZmZlY3Qgd2lsbCBhbHNvIGJlIGxpa2UKKyAgICAgICAqICAlZyBvciAlRy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG91dHB1dCBwcmVjaXNpb24gaXMgZ2l2ZW4gYnkgaW8ucHJlY2lzaW9uKCkuICBUaGlzIHByZWNpc2lvbiBpcworICAgICAgICogIGNhcHBlZCBhdCBudW1lcmljX2xpbWl0czo6ZGlnaXRzMTAgKyAyIChkaWZmZXJlbnQgZm9yIGRvdWJsZSBhbmQKKyAgICAgICAqICBsb25nIGRvdWJsZSkuICBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgNi4KKyAgICAgICAqCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OnNob3dwb3MgaXMgc2V0LCAnKycgaXMgb3V0cHV0IGJlZm9yZSBwb3NpdGl2ZSB2YWx1ZXMuCisgICAgICAgKiAgSWYgaW9zX2Jhc2U6OnNob3dwb2ludCBpcyBzZXQsIGEgZGVjaW1hbCBwb2ludCB3aWxsIGFsd2F5cyBiZQorICAgICAgICogIG91dHB1dC4KKyAgICAgICAqCisgICAgICAgKiAgVGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGluc2VydGVkIGFjY29yZGluZyB0byBudW1wdW5jdDo6Z3JvdXBpbmcoKQorICAgICAgICogIGFuZCBudW1wdW5jdDo6dGhvdXNhbmRzX3NlcCgpLiAgVGhlIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyIHVzZWQgaXMKKyAgICAgICAqICBudW1wdW5jdDo6ZGVjaW1hbF9wb2ludCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBpby53aWR0aCgpIGlzIG5vbi16ZXJvLCBlbm91Z2ggQGEgZmlsbCBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCB0bworICAgICAgICogIG1ha2UgdGhlIHJlc3VsdCBhdCBsZWFzdCB0aGF0IHdpZGUuICBJZgorICAgICAgICogIChpby5mbGFncygpICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCwgcmVzdWx0IGlzCisgICAgICAgKiAgcGFkZGVkIGF0IHRoZSBlbmQuICBJZiBpb3NfYmFzZTo6aW50ZXJuYWwsIHRoZW4gcGFkZGluZyBvY2N1cnMKKyAgICAgICAqICBpbW1lZGlhdGVseSBhZnRlciBlaXRoZXIgYSAnKycgb3IgJy0nIG9yIGFmdGVyICcweCcgb3IgJzBYJy4KKyAgICAgICAqICBPdGhlcndpc2UsIHBhZGRpbmcgb2NjdXJzIGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgU3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgZmlsbCAgQ2hhcl90eXBlIHRvIHVzZSBmb3IgZmlsbGluZy4KKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9fZiwgY2hhcl90eXBlIF9fZmlsbCwgZG91YmxlIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9fZiwgX19maWxsLCBfX3YpOyB9CisKKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2YsIGNoYXJfdHlwZSBfX2ZpbGwsCisJICBsb25nIGRvdWJsZSBfX3YpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wdXQoX19zLCBfX2YsIF9fZmlsbCwgX192KTsgfQorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybWF0cyB0aGUgcG9pbnRlciB2YWx1ZSBAYSB2IGFuZCBpbnNlcnRzIGl0IGludG8gYSBzdHJlYW0uICBJdAorICAgICAgICogIGRvZXMgc28gYnkgY2FsbGluZyBudW1fcHV0Ojpkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIEBhIHYgYXMgYW4gdW5zaWduZWQgbG9uZyB3aXRoIGlvc19iYXNlOjpoZXgKKyAgICAgICAqICBhbmQgaW9zX2Jhc2U6OnNob3diYXNlIHNldC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGxvY2FsZSBhbmQgZmxhZ3MuCisgICAgICAgKiAgQHBhcmFtICBmaWxsICBDaGFyX3R5cGUgdG8gdXNlIGZvciBmaWxsaW5nLgorICAgICAgICogIEBwYXJhbSAgdiAgVmFsdWUgdG8gZm9ybWF0IGFuZCBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19mLCBjaGFyX3R5cGUgX19maWxsLAorCSAgY29uc3Qgdm9pZCogX192KSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fcHV0KF9fcywgX19mLCBfX2ZpbGwsIF9fdik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICAgIGl0ZXJfdHlwZQorICAgICAgICBfTV9pbnNlcnRfZmxvYXQoaXRlcl90eXBlLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkJCWNoYXIgX19tb2QsIF9WYWx1ZVQgX192KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgX01fZ3JvdXBfZmxvYXQoY29uc3QgY2hhciogX19ncm91cGluZywgc2l6ZV90IF9fZ3JvdXBpbmdfc2l6ZSwKKwkJICAgICBjaGFyX3R5cGUgX19zZXAsIGNvbnN0IGNoYXJfdHlwZSogX19wLCBjaGFyX3R5cGUqIF9fbmV3LAorCQkgICAgIGNoYXJfdHlwZSogX19jcywgaW50JiBfX2xlbikgY29uc3Q7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgICAgIGl0ZXJfdHlwZQorICAgICAgICBfTV9pbnNlcnRfaW50KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJCSAgICAgIF9WYWx1ZVQgX192KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgX01fZ3JvdXBfaW50KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsCisJCSAgIGNoYXJfdHlwZSBfX3NlcCwgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSogX19uZXcsCisJCSAgIGNoYXJfdHlwZSogX19jcywgaW50JiBfX2xlbikgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3BhZChjaGFyX3R5cGUgX19maWxsLCBzdHJlYW1zaXplIF9fdywgaW9zX2Jhc2UmIF9faW8sCisJICAgICBjaGFyX3R5cGUqIF9fbmV3LCBjb25zdCBjaGFyX3R5cGUqIF9fY3MsIGludCYgX19sZW4pIGNvbnN0OworCisgICAgICAvLy8gRGVzdHJ1Y3Rvci4KKyAgICAgIHZpcnR1YWwKKyAgICAgIH5udW1fcHV0KCkgeyB9OworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIGRvIHRoZSB3b3JrIG9mIGZvcm1hdHRpbmcgbnVtZXJpYyB2YWx1ZXMgYW5kCisgICAgICAgKiAgaW5zZXJ0aW5nIHRoZW0gaW50byBhIHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgU3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBsb2NhbGUgYW5kIGZsYWdzLgorICAgICAgICogIEBwYXJhbSAgZmlsbCAgQ2hhcl90eXBlIHRvIHVzZSBmb3IgZmlsbGluZy4KKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbHVlIHRvIGZvcm1hdCBhbmQgaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlIF9fZmlsbCwgYm9vbCBfX3YpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0JCisKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICB1bnNpZ25lZCBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgICBsb25nIGxvbmcgX192KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5zZXJ0X2ludChfX3MsIF9faW8sIF9fZmlsbCwgX192KTsgfQorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgdW5zaWduZWQgbG9uZyBsb25nIF9fdikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydF9pbnQoX19zLCBfX2lvLCBfX2ZpbGwsIF9fdik7IH0KKyNlbmRpZgorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUgX19maWxsLCBkb3VibGUgX192KSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBfX2RvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlIF9fZmlsbCwgZG91YmxlIF9fdikgY29uc3Q7CisjZWxzZQorICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBkb3VibGUgX192KSBjb25zdDsKKyNlbmRpZgorCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSwgaW9zX2Jhc2UmLCBjaGFyX3R5cGUgX19maWxsLCBjb25zdCB2b2lkKiBfX3YpIGNvbnN0OworCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX3B1dChpdGVyX3R5cGUsIGlvc19iYXNlJiwgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBkb3VibGUgX192KSBjb25zdDsKKyNlbmRpZgorICAgICAgLy9AfQorICAgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgbG9jYWxlOjppZCBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjppZDsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9MREJMCisKKyAgLy8gU3ViY2xhdXNlIGNvbnZlbmllbmNlIGludGVyZmFjZXMsIGlubGluZXMuCisgIC8vIE5COiBUaGVzZSBhcmUgaW5saW5lIGJlY2F1c2UsIHdoZW4gdXNlZCBpbiBhIGxvb3AsIHNvbWUgY29tcGlsZXJzCisgIC8vIGNhbiBob2lzdCB0aGUgYm9keSBvdXQgb2YgdGhlIGxvb3A7IHRoZW4gaXQncyBqdXN0IGFzIGZhc3QgYXMgdGhlCisgIC8vIEMgaXMqKCkgZnVuY3Rpb24uCisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNzcGFjZShfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnNwYWNlLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpwcmludCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNwcmludChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnByaW50LCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpjbnRybCwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXNjbnRybChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OmNudHJsLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgaXN1cHBlcihfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnVwcGVyLCBfX2MpOyB9CisKKyAgLy8vIENvbnZlbmllbmNlIGludGVyZmFjZSB0byBjdHlwZS5pcyhjdHlwZV9iYXNlOjpsb3dlciwgX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBib29sIAorICAgIGlzbG93ZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjpsb3dlciwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUuaXMoY3R5cGVfYmFzZTo6YWxwaGEsIF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzYWxwaGEoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjphbHBoYSwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUuaXMoY3R5cGVfYmFzZTo6ZGlnaXQsIF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzZGlnaXQoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjpkaWdpdCwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUuaXMoY3R5cGVfYmFzZTo6cHVuY3QsIF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzcHVuY3QoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjpwdW5jdCwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUuaXMoY3R5cGVfYmFzZTo6eGRpZ2l0LCBfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc3hkaWdpdChfQ2hhclQgX19jLCBjb25zdCBsb2NhbGUmIF9fbG9jKQorICAgIHsgcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpLmlzKGN0eXBlX2Jhc2U6OnhkaWdpdCwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUuaXMoY3R5cGVfYmFzZTo6YWxudW0sIF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzYWxudW0oX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjphbG51bSwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUuaXMoY3R5cGVfYmFzZTo6Z3JhcGgsIF9fYykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzZ3JhcGgoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS5pcyhjdHlwZV9iYXNlOjpncmFwaCwgX19jKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBpbnRlcmZhY2UgdG8gY3R5cGUudG91cHBlcihfX2MpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgaW5saW5lIF9DaGFyVAorICAgIHRvdXBwZXIoX0NoYXJUIF9fYywgY29uc3QgbG9jYWxlJiBfX2xvYykKKyAgICB7IHJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKS50b3VwcGVyKF9fYyk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgaW50ZXJmYWNlIHRvIGN0eXBlLnRvbG93ZXIoX19jKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGlubGluZSBfQ2hhclQKKyAgICB0b2xvd2VyKF9DaGFyVCBfX2MsIGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeyByZXR1cm4gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYykudG9sb3dlcihfX2MpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworIyBpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHMudGNjPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9sb2NhbGVfZmFjZXRzLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9sb2NhbGVfZmFjZXRzLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGJkYTE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9mYWNldHMudGNjCkBAIC0wLDAgKzEsMTM2MiBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2ZhY2V0cy50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworI2lmbmRlZiBfTE9DQUxFX0ZBQ0VUU19UQ0MKKyNkZWZpbmUgX0xPQ0FMRV9GQUNFVFNfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gUm91dGluZSB0byBhY2Nlc3MgYSBjYWNoZSBmb3IgdGhlIGZhY2V0LiAgSWYgdGhlIGNhY2hlIGRpZG4ndAorICAvLyBleGlzdCBiZWZvcmUsIGl0IGdldHMgY29uc3RydWN0ZWQgb24gdGhlIGZseS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIHN0cnVjdCBfX3VzZV9jYWNoZQorICAgIHsKKyAgICAgIGNvbnN0IF9GYWNldCoKKyAgICAgIG9wZXJhdG9yKCkgKGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0OworICAgIH07CisKKyAgLy8gU3BlY2lhbGl6YXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IF9fdXNlX2NhY2hlPF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPiA+CisgICAgeworICAgICAgY29uc3QgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+KgorICAgICAgb3BlcmF0b3IoKSAoY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19pID0gbnVtcHVuY3Q8X0NoYXJUPjo6aWQuX01faWQoKTsKKwljb25zdCBsb2NhbGU6OmZhY2V0KiogX19jYWNoZXMgPSBfX2xvYy5fTV9pbXBsLT5fTV9jYWNoZXM7CisJaWYgKCFfX2NhY2hlc1tfX2ldKQorCSAgeworCSAgICBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4qIF9fdG1wID0gMDsKKwkgICAgX190cnkKKwkgICAgICB7CisJCV9fdG1wID0gbmV3IF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPjsKKwkJX190bXAtPl9NX2NhY2hlKF9fbG9jKTsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJZGVsZXRlIF9fdG1wOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICAgIF9fbG9jLl9NX2ltcGwtPl9NX2luc3RhbGxfY2FjaGUoX190bXAsIF9faSk7CisJICB9CisJcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9fbnVtcHVuY3RfY2FjaGU8X0NoYXJUPio+KF9fY2FjaGVzW19faV0pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHZvaWQKKyAgICBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD46Ol9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeworICAgICAgX01fYWxsb2NhdGVkID0gdHJ1ZTsKKworICAgICAgY29uc3QgbnVtcHVuY3Q8X0NoYXJUPiYgX19ucCA9IHVzZV9mYWNldDxudW1wdW5jdDxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICBjaGFyKiBfX2dyb3VwaW5nID0gMDsKKyAgICAgIF9DaGFyVCogX190cnVlbmFtZSA9IDA7CisgICAgICBfQ2hhclQqIF9fZmFsc2VuYW1lID0gMDsKKyAgICAgIF9fdHJ5CisJeworCSAgX01fZ3JvdXBpbmdfc2l6ZSA9IF9fbnAuZ3JvdXBpbmcoKS5zaXplKCk7CisJICBfX2dyb3VwaW5nID0gbmV3IGNoYXJbX01fZ3JvdXBpbmdfc2l6ZV07CisJICBfX25wLmdyb3VwaW5nKCkuY29weShfX2dyb3VwaW5nLCBfTV9ncm91cGluZ19zaXplKTsKKwkgIF9NX2dyb3VwaW5nID0gX19ncm91cGluZzsKKwkgIF9NX3VzZV9ncm91cGluZyA9IChfTV9ncm91cGluZ19zaXplCisJCQkgICAgICYmIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihfTV9ncm91cGluZ1swXSkgPiAwCisJCQkgICAgICYmIChfTV9ncm91cGluZ1swXQorCQkJCSAhPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8Y2hhcj46Ol9fbWF4KSk7CisKKwkgIF9NX3RydWVuYW1lX3NpemUgPSBfX25wLnRydWVuYW1lKCkuc2l6ZSgpOworCSAgX190cnVlbmFtZSA9IG5ldyBfQ2hhclRbX01fdHJ1ZW5hbWVfc2l6ZV07CisJICBfX25wLnRydWVuYW1lKCkuY29weShfX3RydWVuYW1lLCBfTV90cnVlbmFtZV9zaXplKTsKKwkgIF9NX3RydWVuYW1lID0gX190cnVlbmFtZTsKKworCSAgX01fZmFsc2VuYW1lX3NpemUgPSBfX25wLmZhbHNlbmFtZSgpLnNpemUoKTsKKwkgIF9fZmFsc2VuYW1lID0gbmV3IF9DaGFyVFtfTV9mYWxzZW5hbWVfc2l6ZV07CisJICBfX25wLmZhbHNlbmFtZSgpLmNvcHkoX19mYWxzZW5hbWUsIF9NX2ZhbHNlbmFtZV9zaXplKTsKKwkgIF9NX2ZhbHNlbmFtZSA9IF9fZmFsc2VuYW1lOworCisJICBfTV9kZWNpbWFsX3BvaW50ID0gX19ucC5kZWNpbWFsX3BvaW50KCk7CisJICBfTV90aG91c2FuZHNfc2VwID0gX19ucC50aG91c2FuZHNfc2VwKCk7CisKKwkgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3QgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKwkgIF9fY3Qud2lkZW4oX19udW1fYmFzZTo6X1NfYXRvbXNfb3V0LAorCQkgICAgIF9fbnVtX2Jhc2U6Ol9TX2F0b21zX291dAorCQkgICAgICsgX19udW1fYmFzZTo6X1Nfb2VuZCwgX01fYXRvbXNfb3V0KTsKKwkgIF9fY3Qud2lkZW4oX19udW1fYmFzZTo6X1NfYXRvbXNfaW4sCisJCSAgICAgX19udW1fYmFzZTo6X1NfYXRvbXNfaW4KKwkJICAgICArIF9fbnVtX2Jhc2U6Ol9TX2llbmQsIF9NX2F0b21zX2luKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBkZWxldGUgW10gX19ncm91cGluZzsKKwkgIGRlbGV0ZSBbXSBfX3RydWVuYW1lOworCSAgZGVsZXRlIFtdIF9fZmFsc2VuYW1lOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICAvLyBVc2VkIGJ5IGJvdGggbnVtZXJpYyBhbmQgbW9uZXRhcnkgZmFjZXRzLgorICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgX19ncm91cGluZ190bXAgc3RyaW5nIGNvbnN0cnVjdGVkIGluCisgIC8vIG1vbmV5X2dldCBvciBudW1fZ2V0IG1hdGNoZXMgdGhlIGNhbm9uaWNhbCBncm91cGluZyBmb3IgYSBnaXZlbgorICAvLyBsb2NhbGUuCisgIC8vIF9fZ3JvdXBpbmdfdG1wIGlzIHBhcnNlZCBMIHRvIFIKKyAgLy8gMSwyMjIsNDQ0ID09IF9fZ3JvdXBpbmdfdG1wIG9mICJcMVwzXDMiCisgIC8vIF9fZ3JvdXBpbmcgaXMgcGFyc2VkIFIgdG8gTAorICAvLyAxLDIyMiw0NDQgPT0gX19ncm91cGluZyBvZiAiXDMiID09ICJcM1wzXDMiCisgIF9HTElCQ1hYX1BVUkUgYm9vbAorICBfX3ZlcmlmeV9ncm91cGluZyhjb25zdCBjaGFyKiBfX2dyb3VwaW5nLCBzaXplX3QgX19ncm91cGluZ19zaXplLAorCQkgICAgY29uc3Qgc3RyaW5nJiBfX2dyb3VwaW5nX3RtcCkgdGhyb3cgKCk7CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBudW1fZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfZmxvYXQoX0luSXRlciBfX2JlZywgX0luSXRlciBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmcmIF9feHRyYykgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCQlfX3RyYWl0c190eXBlOworICAgICAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gICAgICAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisgICAgICBfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworICAgICAgY29uc3QgX0NoYXJUKiBfX2xpdCA9IF9fbGMtPl9NX2F0b21zX2luOworICAgICAgY2hhcl90eXBlIF9fYyA9IGNoYXJfdHlwZSgpOworCisgICAgICAvLyBUcnVlIGlmIF9fYmVnIGJlY29tZXMgZXF1YWwgdG8gX19lbmQuCisgICAgICBib29sIF9fdGVzdGVvZiA9IF9fYmVnID09IF9fZW5kOworCisgICAgICAvLyBGaXJzdCBjaGVjayBmb3Igc2lnbi4KKyAgICAgIGlmICghX190ZXN0ZW9mKQorCXsKKwkgIF9fYyA9ICpfX2JlZzsKKwkgIGNvbnN0IGJvb2wgX19wbHVzID0gX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2lwbHVzXTsKKwkgIGlmICgoX19wbHVzIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pbWludXNdKQorCSAgICAgICYmICEoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCSAgICAgICYmICEoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpKQorCSAgICB7CisJICAgICAgX194dHJjICs9IF9fcGx1cyA/ICcrJyA6ICctJzsKKwkgICAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJX19jID0gKl9fYmVnOworCSAgICAgIGVsc2UKKwkJX190ZXN0ZW9mID0gdHJ1ZTsKKwkgICAgfQorCX0KKworICAgICAgLy8gTmV4dCwgbG9vayBmb3IgbGVhZGluZyB6ZXJvcy4KKyAgICAgIGJvb2wgX19mb3VuZF9tYW50aXNzYSA9IGZhbHNlOworICAgICAgaW50IF9fc2VwX3BvcyA9IDA7CisgICAgICB3aGlsZSAoIV9fdGVzdGVvZikKKwl7CisJICBpZiAoKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkgICAgICB8fCBfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkKKwkgICAgYnJlYWs7CisJICBlbHNlIGlmIChfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXplcm9dKQorCSAgICB7CisJICAgICAgaWYgKCFfX2ZvdW5kX21hbnRpc3NhKQorCQl7CisJCSAgX194dHJjICs9ICcwJzsKKwkJICBfX2ZvdW5kX21hbnRpc3NhID0gdHJ1ZTsKKwkJfQorCSAgICAgICsrX19zZXBfcG9zOworCisJICAgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCV9fYyA9ICpfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdGVzdGVvZiA9IHRydWU7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgYnJlYWs7CisJfQorCisgICAgICAvLyBPbmx5IG5lZWQgYWNjZXB0YWJsZSBkaWdpdHMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCisgICAgICBib29sIF9fZm91bmRfZGVjID0gZmFsc2U7CisgICAgICBib29sIF9fZm91bmRfc2NpID0gZmFsc2U7CisgICAgICBzdHJpbmcgX19mb3VuZF9ncm91cGluZzsKKyAgICAgIGlmIChfX2xjLT5fTV91c2VfZ3JvdXBpbmcpCisJX19mb3VuZF9ncm91cGluZy5yZXNlcnZlKDMyKTsKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19saXRfemVybyA9IF9fbGl0ICsgX19udW1fYmFzZTo6X1NfaXplcm87CisKKyAgICAgIGlmICghX19sYy0+X01fYWxsb2NhdGVkKQorCS8vICJDIiBsb2NhbGUKKwl3aGlsZSAoIV9fdGVzdGVvZikKKwkgIHsKKwkgICAgY29uc3QgaW50IF9fZGlnaXQgPSBfTV9maW5kKF9fbGl0X3plcm8sIDEwLCBfX2MpOworCSAgICBpZiAoX19kaWdpdCAhPSAtMSkKKwkgICAgICB7CisJCV9feHRyYyArPSAnMCcgKyBfX2RpZ2l0OworCQlfX2ZvdW5kX21hbnRpc3NhID0gdHJ1ZTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50CisJCSAgICAgJiYgIV9fZm91bmRfZGVjICYmICFfX2ZvdW5kX3NjaSkKKwkgICAgICB7CisJCV9feHRyYyArPSAnLic7CisJCV9fZm91bmRfZGVjID0gdHJ1ZTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKChfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaWVdIAorCQkgICAgICB8fCBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaUVdKQorCQkgICAgICYmICFfX2ZvdW5kX3NjaSAmJiBfX2ZvdW5kX21hbnRpc3NhKQorCSAgICAgIHsKKwkJLy8gU2NpZW50aWZpYyBub3RhdGlvbi4KKwkJX194dHJjICs9ICdlJzsKKwkJX19mb3VuZF9zY2kgPSB0cnVlOworCQkKKwkJLy8gUmVtb3ZlIG9wdGlvbmFsIHBsdXMgb3IgbWludXMgc2lnbiwgaWYgdGhleSBleGlzdC4KKwkJaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCSAgeworCQkgICAgX19jID0gKl9fYmVnOworCQkgICAgY29uc3QgYm9vbCBfX3BsdXMgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXBsdXNdOworCQkgICAgaWYgKF9fcGx1cyB8fCBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaW1pbnVzXSkKKwkJICAgICAgX194dHJjICs9IF9fcGx1cyA/ICcrJyA6ICctJzsKKwkJICAgIGVsc2UKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgX190ZXN0ZW9mID0gdHJ1ZTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKworCSAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkgICAgICBfX2MgPSAqX19iZWc7CisJICAgIGVsc2UKKwkgICAgICBfX3Rlc3Rlb2YgPSB0cnVlOworCSAgfQorICAgICAgZWxzZQorCXdoaWxlICghX190ZXN0ZW9mKQorCSAgeworCSAgICAvLyBBY2NvcmRpbmcgdG8gMjIuMi4yLjEuMiwgcDgtOSwgZmlyc3QgbG9vayBmb3IgdGhvdXNhbmRzX3NlcAorCSAgICAvLyBhbmQgZGVjaW1hbF9wb2ludC4KKwkgICAgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkgICAgICB7CisJCWlmICghX19mb3VuZF9kZWMgJiYgIV9fZm91bmRfc2NpKQorCQkgIHsKKwkJICAgIC8vIE5COiBUaG91c2FuZHMgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcKKwkJICAgIC8vIGlzIGEgbm8tbm8sIGFzIGlzIHR3byBjb25zZWN1dGl2ZSB0aG91c2FuZHMgc2VwYXJhdG9ycy4KKwkJICAgIGlmIChfX3NlcF9wb3MpCisJCSAgICAgIHsKKwkJCV9fZm91bmRfZ3JvdXBpbmcgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19zZXBfcG9zKTsKKwkJCV9fc2VwX3BvcyA9IDA7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJLy8gTkI6IF9fY29udmVydF90b192IHdpbGwgbm90IGFzc2lnbiBfX3YgYW5kIHdpbGwKKwkJCS8vIHNldCB0aGUgZmFpbGJpdC4KKwkJCV9feHRyYy5jbGVhcigpOworCQkJYnJlYWs7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50KQorCSAgICAgIHsKKwkJaWYgKCFfX2ZvdW5kX2RlYyAmJiAhX19mb3VuZF9zY2kpCisJCSAgeworCQkgICAgLy8gSWYgbm8gZ3JvdXBpbmcgY2hhcnMgYXJlIHNlZW4sIG5vIGdyb3VwaW5nIGNoZWNrCisJCSAgICAvLyBpcyBhcHBsaWVkLiBUaGVyZWZvcmUgX19mb3VuZF9ncm91cGluZyBpcyBhZGp1c3RlZAorCQkgICAgLy8gb25seSBpZiBkZWNpbWFsX3BvaW50IGNvbWVzIGFmdGVyIHNvbWUgdGhvdXNhbmRzX3NlcC4KKwkJICAgIGlmIChfX2ZvdW5kX2dyb3VwaW5nLnNpemUoKSkKKwkJICAgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCQkgICAgX194dHJjICs9ICcuJzsKKwkJICAgIF9fZm91bmRfZGVjID0gdHJ1ZTsKKwkJICB9CisJCWVsc2UKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWNvbnN0IGNoYXJfdHlwZSogX19xID0KKwkJICBfX3RyYWl0c190eXBlOjpmaW5kKF9fbGl0X3plcm8sIDEwLCBfX2MpOworCQlpZiAoX19xKQorCQkgIHsKKwkJICAgIF9feHRyYyArPSAnMCcgKyAoX19xIC0gX19saXRfemVybyk7CisJCSAgICBfX2ZvdW5kX21hbnRpc3NhID0gdHJ1ZTsKKwkJICAgICsrX19zZXBfcG9zOworCQkgIH0KKwkJZWxzZSBpZiAoKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pZV0gCisJCQkgIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pRV0pCisJCQkgJiYgIV9fZm91bmRfc2NpICYmIF9fZm91bmRfbWFudGlzc2EpCisJCSAgeworCQkgICAgLy8gU2NpZW50aWZpYyBub3RhdGlvbi4KKwkJICAgIGlmIChfX2ZvdW5kX2dyb3VwaW5nLnNpemUoKSAmJiAhX19mb3VuZF9kZWMpCisJCSAgICAgIF9fZm91bmRfZ3JvdXBpbmcgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19zZXBfcG9zKTsKKwkJICAgIF9feHRyYyArPSAnZSc7CisJCSAgICBfX2ZvdW5kX3NjaSA9IHRydWU7CisJCSAgICAKKwkJICAgIC8vIFJlbW92ZSBvcHRpb25hbCBwbHVzIG9yIG1pbnVzIHNpZ24sIGlmIHRoZXkgZXhpc3QuCisJCSAgICBpZiAoKytfX2JlZyAhPSBfX2VuZCkKKwkJICAgICAgeworCQkJX19jID0gKl9fYmVnOworCQkJY29uc3QgYm9vbCBfX3BsdXMgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXBsdXNdOworCQkJaWYgKChfX3BsdXMgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2ltaW51c10pCisJCQkgICAgJiYgIShfX2xjLT5fTV91c2VfZ3JvdXBpbmcKKwkJCQkgJiYgX19jID09IF9fbGMtPl9NX3Rob3VzYW5kc19zZXApCisJCQkgICAgJiYgIShfX2MgPT0gX19sYy0+X01fZGVjaW1hbF9wb2ludCkpCisJCSAgICAgIF9feHRyYyArPSBfX3BsdXMgPyAnKycgOiAnLSc7CisJCQllbHNlCisJCQkgIGNvbnRpbnVlOworCQkgICAgICB9CisJCSAgICBlbHNlCisJCSAgICAgIHsKKwkJCV9fdGVzdGVvZiA9IHRydWU7CisJCQlicmVhazsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgCisJICAgIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgICAgIF9fYyA9ICpfX2JlZzsKKwkgICAgZWxzZQorCSAgICAgIF9fdGVzdGVvZiA9IHRydWU7CisJICB9CisKKyAgICAgIC8vIERpZ2l0IGdyb3VwaW5nIGlzIGNoZWNrZWQuIElmIGdyb3VwaW5nIGFuZCBmb3VuZF9ncm91cGluZyBkb24ndAorICAgICAgLy8gbWF0Y2gsIHRoZW4gZ2V0IHZlcnkgdmVyeSB1cHNldCwgYW5kIHNldCBmYWlsYml0LgorICAgICAgaWYgKF9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgICAgLy8gQWRkIHRoZSBlbmRpbmcgZ3JvdXBpbmcgaWYgYSBkZWNpbWFsIG9yICdlJy8nRScgd2Fzbid0IGZvdW5kLgorCSAgaWYgKCFfX2ZvdW5kX2RlYyAmJiAhX19mb3VuZF9zY2kpCisJICAgIF9fZm91bmRfZ3JvdXBpbmcgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oX19zZXBfcG9zKTsKKworICAgICAgICAgIGlmICghc3RkOjpfX3ZlcmlmeV9ncm91cGluZyhfX2xjLT5fTV9ncm91cGluZywgCisJCQkJICAgICAgX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCQkgICAgICBfX2ZvdW5kX2dyb3VwaW5nKSkKKwkgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgX0luSXRlcgorICAgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICAgIF9NX2V4dHJhY3RfaW50KF9Jbkl0ZXIgX19iZWcsIF9Jbkl0ZXIgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgX1ZhbHVlVCYgX192KSBjb25zdAorICAgICAgeworICAgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCQkgICAgIF9fdHJhaXRzX3R5cGU7CisJdXNpbmcgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fYWRkX3Vuc2lnbmVkPF9WYWx1ZVQ+OjpfX3R5cGUgX191bnNpZ25lZF90eXBlOworCXR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgICAgX19jYWNoZV90eXBlOworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKwljb25zdCBfQ2hhclQqIF9fbGl0ID0gX19sYy0+X01fYXRvbXNfaW47CisJY2hhcl90eXBlIF9fYyA9IGNoYXJfdHlwZSgpOworCisJLy8gTkI6IElmZiBfX2Jhc2VmaWVsZCA9PSAwLCBfX2Jhc2UgY2FuIGNoYW5nZSBiYXNlZCBvbiBjb250ZW50cy4KKwljb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19iYXNlZmllbGQgPSBfX2lvLmZsYWdzKCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisJY29uc3QgYm9vbCBfX29jdCA9IF9fYmFzZWZpZWxkID09IGlvc19iYXNlOjpvY3Q7CisJaW50IF9fYmFzZSA9IF9fb2N0ID8gOCA6IChfX2Jhc2VmaWVsZCA9PSBpb3NfYmFzZTo6aGV4ID8gMTYgOiAxMCk7CisKKwkvLyBUcnVlIGlmIF9fYmVnIGJlY29tZXMgZXF1YWwgdG8gX19lbmQuCisJYm9vbCBfX3Rlc3Rlb2YgPSBfX2JlZyA9PSBfX2VuZDsKKworCS8vIEZpcnN0IGNoZWNrIGZvciBzaWduLgorCWJvb2wgX19uZWdhdGl2ZSA9IGZhbHNlOworCWlmICghX190ZXN0ZW9mKQorCSAgeworCSAgICBfX2MgPSAqX19iZWc7CisJICAgIF9fbmVnYXRpdmUgPSBfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaW1pbnVzXTsKKwkgICAgaWYgKChfX25lZ2F0aXZlIHx8IF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pcGx1c10pCisJCSYmICEoX19sYy0+X01fdXNlX2dyb3VwaW5nICYmIF9fYyA9PSBfX2xjLT5fTV90aG91c2FuZHNfc2VwKQorCQkmJiAhKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50KSkKKwkgICAgICB7CisJCWlmICgrK19fYmVnICE9IF9fZW5kKQorCQkgIF9fYyA9ICpfX2JlZzsKKwkJZWxzZQorCQkgIF9fdGVzdGVvZiA9IHRydWU7CisJICAgICAgfQorCSAgfQorCisJLy8gTmV4dCwgbG9vayBmb3IgbGVhZGluZyB6ZXJvcyBhbmQgY2hlY2sgcmVxdWlyZWQgZGlnaXRzCisJLy8gZm9yIGJhc2UgZm9ybWF0cy4KKwlib29sIF9fZm91bmRfemVybyA9IGZhbHNlOworCWludCBfX3NlcF9wb3MgPSAwOworCXdoaWxlICghX190ZXN0ZW9mKQorCSAgeworCSAgICBpZiAoKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkJfHwgX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpCisJICAgICAgYnJlYWs7CisJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xpdFtfX251bV9iYXNlOjpfU19pemVyb10gCisJCSAgICAgJiYgKCFfX2ZvdW5kX3plcm8gfHwgX19iYXNlID09IDEwKSkKKwkgICAgICB7CisJCV9fZm91bmRfemVybyA9IHRydWU7CisJCSsrX19zZXBfcG9zOworCQlpZiAoX19iYXNlZmllbGQgPT0gMCkKKwkJICBfX2Jhc2UgPSA4OworCQlpZiAoX19iYXNlID09IDgpCisJCSAgX19zZXBfcG9zID0gMDsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fZm91bmRfemVybworCQkgICAgICYmIChfX2MgPT0gX19saXRbX19udW1fYmFzZTo6X1NfaXhdCisJCQkgfHwgX19jID09IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX2lYXSkpCisJICAgICAgeworCQlpZiAoX19iYXNlZmllbGQgPT0gMCkKKwkJICBfX2Jhc2UgPSAxNjsKKwkJaWYgKF9fYmFzZSA9PSAxNikKKwkJICB7CisJCSAgICBfX2ZvdW5kX3plcm8gPSBmYWxzZTsKKwkJICAgIF9fc2VwX3BvcyA9IDA7CisJCSAgfQorCQllbHNlCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgYnJlYWs7CisKKwkgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJICAgICAgeworCQlfX2MgPSAqX19iZWc7CisJCWlmICghX19mb3VuZF96ZXJvKQorCQkgIGJyZWFrOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIF9fdGVzdGVvZiA9IHRydWU7CisJICB9CisJCisJLy8gQXQgdGhpcyBwb2ludCwgYmFzZSBpcyBkZXRlcm1pbmVkLiBJZiBub3QgaGV4LCBvbmx5IGFsbG93CisJLy8gYmFzZSBkaWdpdHMgYXMgdmFsaWQgaW5wdXQuCisJY29uc3Qgc2l6ZV90IF9fbGVuID0gKF9fYmFzZSA9PSAxNiA/IF9fbnVtX2Jhc2U6Ol9TX2llbmQKKwkJCSAgICAgIC0gX19udW1fYmFzZTo6X1NfaXplcm8gOiBfX2Jhc2UpOworCisJLy8gRXh0cmFjdC4KKwlzdHJpbmcgX19mb3VuZF9ncm91cGluZzsKKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nKQorCSAgX19mb3VuZF9ncm91cGluZy5yZXNlcnZlKDMyKTsKKwlib29sIF9fdGVzdGZhaWwgPSBmYWxzZTsKKwlib29sIF9fdGVzdG92ZXJmbG93ID0gZmFsc2U7CisJY29uc3QgX191bnNpZ25lZF90eXBlIF9fbWF4ID0KKwkgIChfX25lZ2F0aXZlICYmIF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19pc19zaWduZWQpCisJICA/IC1fX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fbWluCisJICA6IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19tYXg7CisJY29uc3QgX191bnNpZ25lZF90eXBlIF9fc21heCA9IF9fbWF4IC8gX19iYXNlOworCV9fdW5zaWduZWRfdHlwZSBfX3Jlc3VsdCA9IDA7CisJaW50IF9fZGlnaXQgPSAwOworCWNvbnN0IGNoYXJfdHlwZSogX19saXRfemVybyA9IF9fbGl0ICsgX19udW1fYmFzZTo6X1NfaXplcm87CisKKwlpZiAoIV9fbGMtPl9NX2FsbG9jYXRlZCkKKwkgIC8vICJDIiBsb2NhbGUKKwkgIHdoaWxlICghX190ZXN0ZW9mKQorCSAgICB7CisJICAgICAgX19kaWdpdCA9IF9NX2ZpbmQoX19saXRfemVybywgX19sZW4sIF9fYyk7CisJICAgICAgaWYgKF9fZGlnaXQgPT0gLTEpCisJCWJyZWFrOworCSAgICAgIAorCSAgICAgIGlmIChfX3Jlc3VsdCA+IF9fc21heCkKKwkJX190ZXN0b3ZlcmZsb3cgPSB0cnVlOworCSAgICAgIGVsc2UKKwkJeworCQkgIF9fcmVzdWx0ICo9IF9fYmFzZTsKKwkJICBfX3Rlc3RvdmVyZmxvdyB8PSBfX3Jlc3VsdCA+IF9fbWF4IC0gX19kaWdpdDsKKwkJICBfX3Jlc3VsdCArPSBfX2RpZ2l0OworCQkgICsrX19zZXBfcG9zOworCQl9CisJICAgICAgCisJICAgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCV9fYyA9ICpfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdGVzdGVvZiA9IHRydWU7CisJICAgIH0KKwllbHNlCisJICB3aGlsZSAoIV9fdGVzdGVvZikKKwkgICAgeworCSAgICAgIC8vIEFjY29yZGluZyB0byAyMi4yLjIuMS4yLCBwOC05LCBmaXJzdCBsb29rIGZvciB0aG91c2FuZHNfc2VwCisJICAgICAgLy8gYW5kIGRlY2ltYWxfcG9pbnQuCisJICAgICAgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZyAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcCkKKwkJeworCQkgIC8vIE5COiBUaG91c2FuZHMgc2VwYXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcKKwkJICAvLyBpcyBhIG5vLW5vLCBhcyBpcyB0d28gY29uc2VjdXRpdmUgdGhvdXNhbmRzIHNlcGFyYXRvcnMuCisJCSAgaWYgKF9fc2VwX3BvcykKKwkJICAgIHsKKwkJICAgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCQkgICAgICBfX3NlcF9wb3MgPSAwOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgX190ZXN0ZmFpbCA9IHRydWU7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZSBpZiAoX19jID09IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQpCisJCWJyZWFrOworCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbnN0IGNoYXJfdHlwZSogX19xID0KKwkJICAgIF9fdHJhaXRzX3R5cGU6OmZpbmQoX19saXRfemVybywgX19sZW4sIF9fYyk7CisJCSAgaWYgKCFfX3EpCisJCSAgICBicmVhazsKKwkJICAKKwkJICBfX2RpZ2l0ID0gX19xIC0gX19saXRfemVybzsKKwkJICBpZiAoX19kaWdpdCA+IDE1KQorCQkgICAgX19kaWdpdCAtPSA2OworCQkgIGlmIChfX3Jlc3VsdCA+IF9fc21heCkKKwkJICAgIF9fdGVzdG92ZXJmbG93ID0gdHJ1ZTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIF9fcmVzdWx0ICo9IF9fYmFzZTsKKwkJICAgICAgX190ZXN0b3ZlcmZsb3cgfD0gX19yZXN1bHQgPiBfX21heCAtIF9fZGlnaXQ7CisJCSAgICAgIF9fcmVzdWx0ICs9IF9fZGlnaXQ7CisJCSAgICAgICsrX19zZXBfcG9zOworCQkgICAgfQorCQl9CisJICAgICAgCisJICAgICAgaWYgKCsrX19iZWcgIT0gX19lbmQpCisJCV9fYyA9ICpfX2JlZzsKKwkgICAgICBlbHNlCisJCV9fdGVzdGVvZiA9IHRydWU7CisJICAgIH0KKwkKKwkvLyBEaWdpdCBncm91cGluZyBpcyBjaGVja2VkLiBJZiBncm91cGluZyBhbmQgZm91bmRfZ3JvdXBpbmcgZG9uJ3QKKwkvLyBtYXRjaCwgdGhlbiBnZXQgdmVyeSB2ZXJ5IHVwc2V0LCBhbmQgc2V0IGZhaWxiaXQuCisJaWYgKF9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorCSAgeworCSAgICAvLyBBZGQgdGhlIGVuZGluZyBncm91cGluZy4KKwkgICAgX19mb3VuZF9ncm91cGluZyArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3NlcF9wb3MpOworCisJICAgIGlmICghc3RkOjpfX3ZlcmlmeV9ncm91cGluZyhfX2xjLT5fTV9ncm91cGluZywKKwkJCQkJX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCQkJX19mb3VuZF9ncm91cGluZykpCisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgIH0KKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAyMy4gTnVtX2dldCBvdmVyZmxvdyByZXN1bHQuCisJaWYgKCghX19zZXBfcG9zICYmICFfX2ZvdW5kX3plcm8gJiYgIV9fZm91bmRfZ3JvdXBpbmcuc2l6ZSgpKQorCSAgICB8fCBfX3Rlc3RmYWlsKQorCSAgeworCSAgICBfX3YgPSAwOworCSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgfQorCWVsc2UgaWYgKF9fdGVzdG92ZXJmbG93KQorCSAgeworCSAgICBpZiAoX19uZWdhdGl2ZQorCQkmJiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9faXNfc2lnbmVkKQorCSAgICAgIF9fdiA9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUPjo6X19taW47CisJICAgIGVsc2UKKwkgICAgICBfX3YgPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fbWF4OworCSAgICBfX2VyciA9IGlvc19iYXNlOjpmYWlsYml0OworCSAgfQorCWVsc2UKKwkgIF9fdiA9IF9fbmVnYXRpdmUgPyAtX19yZXN1bHQgOiBfX3Jlc3VsdDsKKworCWlmIChfX3Rlc3Rlb2YpCisJICBfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCXJldHVybiBfX2JlZzsKKyAgICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDE3LiAgQmFkIGJvb2wgcGFyc2luZworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKyAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBib29sJiBfX3YpIGNvbnN0CisgICAgeworICAgICAgaWYgKCEoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OmJvb2xhbHBoYSkpCisgICAgICAgIHsKKwkgIC8vIFBhcnNlIGJvb2wgdmFsdWVzIGFzIGxvbmcuCisgICAgICAgICAgLy8gTkI6IFdlIGNhbid0IGp1c3QgY2FsbCBkb19nZXQobG9uZykgaGVyZSwgYXMgaXQgbWlnaHQKKyAgICAgICAgICAvLyByZWZlciB0byBhIGRlcml2ZWQgY2xhc3MuCisJICBsb25nIF9fbCA9IC0xOworICAgICAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19sKTsKKwkgIGlmIChfX2wgPT0gMCB8fCBfX2wgPT0gMSkKKwkgICAgX192ID0gYm9vbChfX2wpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDIzLiBOdW1fZ2V0IG92ZXJmbG93IHJlc3VsdC4KKwkgICAgICBfX3YgPSB0cnVlOworCSAgICAgIF9fZXJyID0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgLy8gUGFyc2UgYm9vbCB2YWx1ZXMgYXMgYWxwaGFudW1lcmljLgorCSAgdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gIF9fY2FjaGVfdHlwZTsKKwkgIF9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwkgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgX19jYWNoZV90eXBlKiBfX2xjID0gX191YyhfX2xvYyk7CisKKwkgIGJvb2wgX190ZXN0ZiA9IHRydWU7CisJICBib29sIF9fdGVzdHQgPSB0cnVlOworCSAgYm9vbCBfX2RvbmVmID0gX19sYy0+X01fZmFsc2VuYW1lX3NpemUgPT0gMDsKKwkgIGJvb2wgX19kb25ldCA9IF9fbGMtPl9NX3RydWVuYW1lX3NpemUgPT0gMDsKKwkgIGJvb2wgX190ZXN0ZW9mID0gZmFsc2U7CisJICBzaXplX3QgX19uID0gMDsKKwkgIHdoaWxlICghX19kb25lZiB8fCAhX19kb25ldCkKKwkgICAgeworCSAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwkJeworCQkgIF9fdGVzdGVvZiA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKworCSAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisKKwkgICAgICBpZiAoIV9fZG9uZWYpCisJCV9fdGVzdGYgPSBfX2MgPT0gX19sYy0+X01fZmFsc2VuYW1lW19fbl07CisKKwkgICAgICBpZiAoIV9fdGVzdGYgJiYgX19kb25ldCkKKwkJYnJlYWs7CisKKwkgICAgICBpZiAoIV9fZG9uZXQpCisJCV9fdGVzdHQgPSBfX2MgPT0gX19sYy0+X01fdHJ1ZW5hbWVbX19uXTsKKworCSAgICAgIGlmICghX190ZXN0dCAmJiBfX2RvbmVmKQorCQlicmVhazsKKworCSAgICAgIGlmICghX190ZXN0dCAmJiAhX190ZXN0ZikKKwkJYnJlYWs7CisKKwkgICAgICArK19fbjsKKwkgICAgICArK19fYmVnOworCisJICAgICAgX19kb25lZiA9ICFfX3Rlc3RmIHx8IF9fbiA+PSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZTsKKwkgICAgICBfX2RvbmV0ID0gIV9fdGVzdHQgfHwgX19uID49IF9fbGMtPl9NX3RydWVuYW1lX3NpemU7CisJICAgIH0KKwkgIGlmIChfX3Rlc3RmICYmIF9fbiA9PSBfX2xjLT5fTV9mYWxzZW5hbWVfc2l6ZSAmJiBfX24pCisJICAgIHsKKwkgICAgICBfX3YgPSBmYWxzZTsKKwkgICAgICBpZiAoX190ZXN0dCAmJiBfX24gPT0gX19sYy0+X01fdHJ1ZW5hbWVfc2l6ZSkKKwkJX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBlbHNlCisJCV9fZXJyID0gX190ZXN0ZW9mID8gaW9zX2Jhc2U6OmVvZmJpdCA6IGlvc19iYXNlOjpnb29kYml0OworCSAgICB9CisJICBlbHNlIGlmIChfX3Rlc3R0ICYmIF9fbiA9PSBfX2xjLT5fTV90cnVlbmFtZV9zaXplICYmIF9fbikKKwkgICAgeworCSAgICAgIF9fdiA9IHRydWU7CisJICAgICAgX19lcnIgPSBfX3Rlc3Rlb2YgPyBpb3NfYmFzZTo6ZW9mYml0IDogaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyAyMy4gTnVtX2dldCBvdmVyZmxvdyByZXN1bHQuCisJICAgICAgX192ID0gZmFsc2U7CisJICAgICAgX19lcnIgPSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgICBpZiAoX190ZXN0ZW9mKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGZsb2F0JiBfX3YpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nIF9feHRyYzsKKyAgICAgIF9feHRyYy5yZXNlcnZlKDMyKTsKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9mbG9hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3h0cmMpOworICAgICAgc3RkOjpfX2NvbnZlcnRfdG9fdihfX3h0cmMuY19zdHIoKSwgX192LCBfX2VyciwgX1NfZ2V0X2NfbG9jYWxlKCkpOworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbnVtX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorICAgICAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3h0cmM7CisgICAgICBfX3h0cmMucmVzZXJ2ZSgzMik7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfZmxvYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX194dHJjKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX194dHJjLmNfc3RyKCksIF9fdiwgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX19kb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBkb3VibGUmIF9fdikgY29uc3QKKyAgICB7CisgICAgICBzdHJpbmcgX194dHJjOworICAgICAgX194dHJjLnJlc2VydmUoMzIpOworICAgICAgX19iZWcgPSBfTV9leHRyYWN0X2Zsb2F0KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9feHRyYyk7CisgICAgICBzdGQ6Ol9fY29udmVydF90b192KF9feHRyYy5jX3N0cigpLCBfX3YsIF9fZXJyLCBfU19nZXRfY19sb2NhbGUoKSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKyAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX192KSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3h0cmM7CisgICAgICBfX3h0cmMucmVzZXJ2ZSgzMik7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfZmxvYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX194dHJjKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX194dHJjLmNfc3RyKCksIF9fdiwgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIG51bV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKyAgICAgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB2b2lkKiYgX192KSBjb25zdAorICAgIHsKKyAgICAgIC8vIFByZXBhcmUgZm9yIGhleCBmb3JtYXR0ZWQgaW5wdXQuCisgICAgICB0eXBlZGVmIGlvc19iYXNlOjpmbXRmbGFncyAgICAgICAgZm10ZmxhZ3M7CisgICAgICBjb25zdCBmbXRmbGFncyBfX2ZtdCA9IF9faW8uZmxhZ3MoKTsKKyAgICAgIF9faW8uZmxhZ3MoKF9fZm10ICYgfmlvc19iYXNlOjpiYXNlZmllbGQpIHwgaW9zX2Jhc2U6OmhleCk7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZih2b2lkKikKKwkJCQkJICAgICA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpLAorCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Ol9fdHlwZSBfVUludFB0clR5cGU7ICAgICAgIAorCisgICAgICBfVUludFB0clR5cGUgX191bDsKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9pbnQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX191bCk7CisKKyAgICAgIC8vIFJlc2V0IGZyb20gaGV4IGZvcm1hdHRlZCBpbnB1dC4KKyAgICAgIF9faW8uZmxhZ3MoX19mbXQpOworCisgICAgICBfX3YgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX3VsKTsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgLy8gRm9yIHVzZSBieSBpbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCB0eXBlcyBhZnRlciB0aGV5IGhhdmUgYmVlbgorICAvLyBjb252ZXJ0ZWQgaW50byBhIGNoYXJfdHlwZSBzdHJpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdm9pZAorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIF9NX3BhZChfQ2hhclQgX19maWxsLCBzdHJlYW1zaXplIF9fdywgaW9zX2Jhc2UmIF9faW8sCisJICAgX0NoYXJUKiBfX25ldywgY29uc3QgX0NoYXJUKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdAorICAgIHsKKyAgICAgIC8vIFsyMi4yLjIuMi4yXSBTdGFnZSAzLgorICAgICAgLy8gSWYgbmVjZXNzYXJ5LCBwYWQuCisgICAgICBfX3BhZDxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPjo6X1NfcGFkKF9faW8sIF9fZmlsbCwgX19uZXcsCisJCQkJCQkgIF9fY3MsIF9fdywgX19sZW4pOworICAgICAgX19sZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KF9fdyk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9WYWx1ZVQ+CisgICAgaW50CisgICAgX19pbnRfdG9fY2hhcihfQ2hhclQqIF9fYnVmZW5kLCBfVmFsdWVUIF9fdiwgY29uc3QgX0NoYXJUKiBfX2xpdCwKKwkJICBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncywgYm9vbCBfX2RlYykKKyAgICB7CisgICAgICBfQ2hhclQqIF9fYnVmID0gX19idWZlbmQ7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX2RlYywgdHJ1ZSkpCisJeworCSAgLy8gRGVjaW1hbC4KKwkgIGRvCisJICAgIHsKKwkgICAgICAqLS1fX2J1ZiA9IF9fbGl0WyhfX3YgJSAxMCkgKyBfX251bV9iYXNlOjpfU19vZGlnaXRzXTsKKwkgICAgICBfX3YgLz0gMTA7CisJICAgIH0KKwkgIHdoaWxlIChfX3YgIT0gMCk7CisJfQorICAgICAgZWxzZSBpZiAoKF9fZmxhZ3MgJiBpb3NfYmFzZTo6YmFzZWZpZWxkKSA9PSBpb3NfYmFzZTo6b2N0KQorCXsKKwkgIC8vIE9jdGFsLgorCSAgZG8KKwkgICAgeworCSAgICAgICotLV9fYnVmID0gX19saXRbKF9fdiAmIDB4NykgKyBfX251bV9iYXNlOjpfU19vZGlnaXRzXTsKKwkgICAgICBfX3YgPj49IDM7CisJICAgIH0KKwkgIHdoaWxlIChfX3YgIT0gMCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8vIEhleC4KKwkgIGNvbnN0IGJvb2wgX191cHBlcmNhc2UgPSBfX2ZsYWdzICYgaW9zX2Jhc2U6OnVwcGVyY2FzZTsKKwkgIGNvbnN0IGludCBfX2Nhc2Vfb2Zmc2V0ID0gX191cHBlcmNhc2UgPyBfX251bV9iYXNlOjpfU19vdWRpZ2l0cworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fbnVtX2Jhc2U6Ol9TX29kaWdpdHM7CisJICBkbworCSAgICB7CisJICAgICAgKi0tX19idWYgPSBfX2xpdFsoX192ICYgMHhmKSArIF9fY2FzZV9vZmZzZXRdOworCSAgICAgIF9fdiA+Pj0gNDsKKwkgICAgfQorCSAgd2hpbGUgKF9fdiAhPSAwKTsKKwl9CisgICAgICByZXR1cm4gX19idWZlbmQgLSBfX2J1ZjsKKyAgICB9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB2b2lkCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgX01fZ3JvdXBfaW50KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsIF9DaGFyVCBfX3NlcCwKKwkJIGlvc19iYXNlJiwgX0NoYXJUKiBfX25ldywgX0NoYXJUKiBfX2NzLCBpbnQmIF9fbGVuKSBjb25zdAorICAgIHsKKyAgICAgIF9DaGFyVCogX19wID0gc3RkOjpfX2FkZF9ncm91cGluZyhfX25ldywgX19zZXAsIF9fZ3JvdXBpbmcsCisJCQkJCV9fZ3JvdXBpbmdfc2l6ZSwgX19jcywgX19jcyArIF9fbGVuKTsKKyAgICAgIF9fbGVuID0gX19wIC0gX19uZXc7CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgX091dEl0ZXIKKyAgICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgICAgX01faW5zZXJ0X2ludChfT3V0SXRlciBfX3MsIGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLAorCQkgICAgX1ZhbHVlVCBfX3YpIGNvbnN0CisgICAgICB7CisJdXNpbmcgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fYWRkX3Vuc2lnbmVkPF9WYWx1ZVQ+OjpfX3R5cGUgX191bnNpZ25lZF90eXBlOworCXR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+CSAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisJX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCWNvbnN0IF9DaGFyVCogX19saXQgPSBfX2xjLT5fTV9hdG9tc19vdXQ7CisJY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lvLmZsYWdzKCk7CisKKwkvLyBMb25nIGVub3VnaCB0byBob2xkIGhleCwgZGVjLCBhbmQgb2N0YWwgcmVwcmVzZW50YXRpb25zLgorCWNvbnN0IGludCBfX2lsZW4gPSA1ICogc2l6ZW9mKF9WYWx1ZVQpOworCV9DaGFyVCogX19jcyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkgICAgICogX19pbGVuKSk7CisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgMSwgbnVtZXJpYyBjb252ZXJzaW9uIHRvIGNoYXJhY3Rlci4KKwkvLyBSZXN1bHQgaXMgcmV0dXJuZWQgcmlnaHQtanVzdGlmaWVkIGluIHRoZSBidWZmZXIuCisJY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fYmFzZWZpZWxkID0gX19mbGFncyAmIGlvc19iYXNlOjpiYXNlZmllbGQ7CisJY29uc3QgYm9vbCBfX2RlYyA9IChfX2Jhc2VmaWVsZCAhPSBpb3NfYmFzZTo6b2N0CisJCQkgICAgJiYgX19iYXNlZmllbGQgIT0gaW9zX2Jhc2U6OmhleCk7CisJY29uc3QgX191bnNpZ25lZF90eXBlIF9fdSA9ICgoX192ID4gMCB8fCAhX19kZWMpCisJCQkJICAgICA/IF9fdW5zaWduZWRfdHlwZShfX3YpCisJCQkJICAgICA6IC1fX3Vuc2lnbmVkX3R5cGUoX192KSk7CisgCWludCBfX2xlbiA9IF9faW50X3RvX2NoYXIoX19jcyArIF9faWxlbiwgX191LCBfX2xpdCwgX19mbGFncywgX19kZWMpOworCV9fY3MgKz0gX19pbGVuIC0gX19sZW47CisKKwkvLyBBZGQgZ3JvdXBpbmcsIGlmIG5lY2Vzc2FyeS4KKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nKQorCSAgeworCSAgICAvLyBHcm91cGluZyBjYW4gYWRkIChhbG1vc3QpIGFzIG1hbnkgc2VwYXJhdG9ycyBhcyB0aGUgbnVtYmVyCisJICAgIC8vIG9mIGRpZ2l0cyArIHNwYWNlIGlzIHJlc2VydmVkIGZvciBudW1lcmljIGJhc2Ugb3Igc2lnbi4KKwkgICAgX0NoYXJUKiBfX2NzMiA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkJICAqIChfX2xlbiArIDEpCisJCQkJCQkJCSAgKiAyKSk7CisJICAgIF9NX2dyb3VwX2ludChfX2xjLT5fTV9ncm91cGluZywgX19sYy0+X01fZ3JvdXBpbmdfc2l6ZSwKKwkJCSBfX2xjLT5fTV90aG91c2FuZHNfc2VwLCBfX2lvLCBfX2NzMiArIDIsIF9fY3MsIF9fbGVuKTsKKwkgICAgX19jcyA9IF9fY3MyICsgMjsKKwkgIH0KKworCS8vIENvbXBsZXRlIFN0YWdlIDEsIHByZXBlbmQgbnVtZXJpYyBiYXNlIG9yIHNpZ24uCisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19kZWMsIHRydWUpKQorCSAgeworCSAgICAvLyBEZWNpbWFsLgorCSAgICBpZiAoX192ID49IDApCisJICAgICAgeworCQlpZiAoYm9vbChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3dwb3MpCisJCSAgICAmJiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9faXNfc2lnbmVkKQorCQkgICotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19vcGx1c10sICsrX19sZW47CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgKi0tX19jcyA9IF9fbGl0W19fbnVtX2Jhc2U6Ol9TX29taW51c10sICsrX19sZW47CisJICB9CisJZWxzZSBpZiAoYm9vbChfX2ZsYWdzICYgaW9zX2Jhc2U6OnNob3diYXNlKSAmJiBfX3YpCisJICB7CisJICAgIGlmIChfX2Jhc2VmaWVsZCA9PSBpb3NfYmFzZTo6b2N0KQorCSAgICAgICotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19vZGlnaXRzXSwgKytfX2xlbjsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJLy8gJ3gnIG9yICdYJworCQljb25zdCBib29sIF9fdXBwZXJjYXNlID0gX19mbGFncyAmIGlvc19iYXNlOjp1cHBlcmNhc2U7CisJCSotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19veCArIF9fdXBwZXJjYXNlXTsKKwkJLy8gJzAnCisJCSotLV9fY3MgPSBfX2xpdFtfX251bV9iYXNlOjpfU19vZGlnaXRzXTsKKwkJX19sZW4gKz0gMjsKKwkgICAgICB9CisJICB9CisKKwkvLyBQYWQuCisJY29uc3Qgc3RyZWFtc2l6ZSBfX3cgPSBfX2lvLndpZHRoKCk7CisJaWYgKF9fdyA+IHN0YXRpY19jYXN0PHN0cmVhbXNpemU+KF9fbGVuKSkKKwkgIHsKKwkgICAgX0NoYXJUKiBfX2NzMyA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkJICAqIF9fdykpOworCSAgICBfTV9wYWQoX19maWxsLCBfX3csIF9faW8sIF9fY3MzLCBfX2NzLCBfX2xlbik7CisJICAgIF9fY3MgPSBfX2NzMzsKKwkgIH0KKwlfX2lvLndpZHRoKDApOworCisJLy8gWzIyLjIuMi4yLjJdIFN0YWdlIDQuCisJLy8gV3JpdGUgcmVzdWx0aW5nLCBmdWxseS1mb3JtYXR0ZWQgc3RyaW5nIHRvIG91dHB1dCBpdGVyYXRvci4KKwlyZXR1cm4gc3RkOjpfX3dyaXRlKF9fcywgX19jcywgX19sZW4pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdm9pZAorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIF9NX2dyb3VwX2Zsb2F0KGNvbnN0IGNoYXIqIF9fZ3JvdXBpbmcsIHNpemVfdCBfX2dyb3VwaW5nX3NpemUsCisJCSAgIF9DaGFyVCBfX3NlcCwgY29uc3QgX0NoYXJUKiBfX3AsIF9DaGFyVCogX19uZXcsCisJCSAgIF9DaGFyVCogX19jcywgaW50JiBfX2xlbikgY29uc3QKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyODIuIFdoYXQgdHlwZXMgZG9lcyBudW1wdW5jdCBncm91cGluZyByZWZlciB0bz8KKyAgICAgIC8vIEFkZCBncm91cGluZywgaWYgbmVjZXNzYXJ5LgorICAgICAgY29uc3QgaW50IF9fZGVjbGVuID0gX19wID8gX19wIC0gX19jcyA6IF9fbGVuOworICAgICAgX0NoYXJUKiBfX3AyID0gc3RkOjpfX2FkZF9ncm91cGluZyhfX25ldywgX19zZXAsIF9fZ3JvdXBpbmcsCisJCQkJCSBfX2dyb3VwaW5nX3NpemUsCisJCQkJCSBfX2NzLCBfX2NzICsgX19kZWNsZW4pOworCisgICAgICAvLyBUYWNrIG9uIGRlY2ltYWwgcGFydC4KKyAgICAgIGludCBfX25ld2xlbiA9IF9fcDIgLSBfX25ldzsKKyAgICAgIGlmIChfX3ApCisJeworCSAgY2hhcl90cmFpdHM8X0NoYXJUPjo6Y29weShfX3AyLCBfX3AsIF9fbGVuIC0gX19kZWNsZW4pOworCSAgX19uZXdsZW4gKz0gX19sZW4gLSBfX2RlY2xlbjsKKwl9CisgICAgICBfX2xlbiA9IF9fbmV3bGVuOworICAgIH0KKworICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyB2c25wcmludGYgKG9yIHZzcHJpbnRmKCksIHdoZW4KKyAgLy8gX0dMSUJDWFhfVVNFX0M5OSBpcyBub3QgZGVmaW5lZCkgdG8gY29udmVydCBmbG9hdGluZyBwb2ludCB2YWx1ZXMKKyAgLy8gZm9yIGluc2VydGlvbiBpbnRvIGEgc3RyZWFtLiAgQW4gb3B0aW1pemF0aW9uIHdvdWxkIGJlIHRvIHJlcGxhY2UKKyAgLy8gdGhlbSB3aXRoIGNvZGUgdGhhdCB3b3JrcyBkaXJlY3RseSBvbiBhIHdpZGUgYnVmZmVyIGFuZCB0aGVuIHVzZQorICAvLyBfX3BhZCB0byBkbyB0aGUgcGFkZGluZy4gIEl0IHdvdWxkIGJlIGdvb2QgdG8gcmVwbGFjZSB0aGVtIGFueXdheQorICAvLyB0byBnYWluIGJhY2sgdGhlIGVmZmljaWVuY3kgdGhhdCBDKysgcHJvdmlkZXMgYnkga25vd2luZyB1cCBmcm9udAorICAvLyB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHRvIGluc2VydC4gIEFsc28sIHNwcmludGYgaXMgZGFuZ2Vyb3VzCisgIC8vIHNpbmNlIG1heSBsZWFkIHRvIGFjY2lkZW50YWwgYnVmZmVyIG92ZXJydW5zLiAgVGhpcworICAvLyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBDKysgc3RhbmRhcmQgZmFpcmx5IGRpcmVjdGx5IGFzCisgIC8vIG91dGxpbmVkIGluIDIyLjIuMi4yIFtsaWIubG9jYWxlLm51bS5wdXRdCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKyAgICAgIF9PdXRJdGVyCisgICAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICAgIF9NX2luc2VydF9mbG9hdChfT3V0SXRlciBfX3MsIGlvc19iYXNlJiBfX2lvLCBfQ2hhclQgX19maWxsLCBjaGFyIF9fbW9kLAorCQkgICAgICAgX1ZhbHVlVCBfX3YpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiBfX251bXB1bmN0X2NhY2hlPF9DaGFyVD4gICAgICAgICAgICAgICAgX19jYWNoZV90eXBlOworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKworCS8vIFVzZSBkZWZhdWx0IHByZWNpc2lvbiBpZiBvdXQgb2YgcmFuZ2UuCisJY29uc3Qgc3RyZWFtc2l6ZSBfX3ByZWMgPSBfX2lvLnByZWNpc2lvbigpIDwgMCA/IDYgOiBfX2lvLnByZWNpc2lvbigpOworCisJY29uc3QgaW50IF9fbWF4X2RpZ2l0cyA9CisJICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fZGlnaXRzMTA7CisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgMSwgbnVtZXJpYyBjb252ZXJzaW9uIHRvIGNoYXJhY3Rlci4KKwlpbnQgX19sZW47CisJLy8gTG9uZyBlbm91Z2ggZm9yIHRoZSBtYXggZm9ybWF0IHNwZWMuCisJY2hhciBfX2ZidWZbMTZdOworCV9fbnVtX2Jhc2U6Ol9TX2Zvcm1hdF9mbG9hdChfX2lvLCBfX2ZidWYsIF9fbW9kKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTkKKwkvLyBGaXJzdCB0cnkgYSBidWZmZXIgcGVyaGFwcyBiaWcgZW5vdWdoIChtb3N0IHByb2JhYmx5IHN1ZmZpY2llbnQKKwkvLyBmb3Igbm9uLWlvc19iYXNlOjpmaXhlZCBvdXRwdXRzKQorCWludCBfX2NzX3NpemUgPSBfX21heF9kaWdpdHMgKiAzOworCWNoYXIqIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKwlfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgX19jc19zaXplLAorCQkJCSAgICAgIF9fZmJ1ZiwgX19wcmVjLCBfX3YpOworCisJLy8gSWYgdGhlIGJ1ZmZlciB3YXMgbm90IGxhcmdlIGVub3VnaCwgdHJ5IGFnYWluIHdpdGggdGhlIGNvcnJlY3Qgc2l6ZS4KKwlpZiAoX19sZW4gPj0gX19jc19zaXplKQorCSAgeworCSAgICBfX2NzX3NpemUgPSBfX2xlbiArIDE7CisJICAgIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKwkgICAgX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIF9fY3Nfc2l6ZSwKKwkJCQkJICBfX2ZidWYsIF9fcHJlYywgX192KTsKKwkgIH0KKyNlbHNlCisJLy8gQ29uc2lkZXIgdGhlIHBvc3NpYmlsaXR5IG9mIGxvbmcgaW9zX2Jhc2U6OmZpeGVkIG91dHB1dHMKKwljb25zdCBib29sIF9fZml4ZWQgPSBfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6Zml4ZWQ7CisJY29uc3QgaW50IF9fbWF4X2V4cCA9CisJICBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVD46Ol9fbWF4X2V4cG9uZW50MTA7CisKKwkvLyBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0cmluZyBpcyBjb21wdXRlZCBhcyBmb2xsb3dzLgorCS8vIGlvc19iYXNlOjpmaXhlZCBvdXRwdXRzIG1heSBuZWVkIHVwIHRvIF9fbWF4X2V4cCArIDEgY2hhcnMKKwkvLyBmb3IgdGhlIGludGVnZXIgcGFydCArIF9fcHJlYyBjaGFycyBmb3IgdGhlIGZyYWN0aW9uYWwgcGFydAorCS8vICsgMyBjaGFycyBmb3Igc2lnbiwgZGVjaW1hbCBwb2ludCwgJ1wwJy4gT24gdGhlIG90aGVyIGhhbmQsCisJLy8gZm9yIG5vbi1maXhlZCBvdXRwdXRzIF9fbWF4X2RpZ2l0cyAqIDIgKyBfX3ByZWMgY2hhcnMgYXJlCisJLy8gbGFyZ2VseSBzdWZmaWNpZW50LgorCWNvbnN0IGludCBfX2NzX3NpemUgPSBfX2ZpeGVkID8gX19tYXhfZXhwICsgX19wcmVjICsgNAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19tYXhfZGlnaXRzICogMiArIF9fcHJlYzsKKwljaGFyKiBfX2NzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KF9fYnVpbHRpbl9hbGxvY2EoX19jc19zaXplKSk7CisJX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIDAsIF9fZmJ1ZiwgCisJCQkJICAgICAgX19wcmVjLCBfX3YpOworI2VuZGlmCisKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgMiwgY29udmVydCB0byBjaGFyX3R5cGUsIHVzaW5nIGNvcnJlY3QKKwkvLyBudW1wdW5jdC5kZWNpbWFsX3BvaW50KCkgdmFsdWVzIGZvciAnLicgYW5kIGFkZGluZyBncm91cGluZy4KKwljb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisJCisJX0NoYXJUKiBfX3dzID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCSAgICAgKiBfX2xlbikpOworCV9fY3R5cGUud2lkZW4oX19jcywgX19jcyArIF9fbGVuLCBfX3dzKTsKKwkKKwkvLyBSZXBsYWNlIGRlY2ltYWwgcG9pbnQuCisJX0NoYXJUKiBfX3dwID0gMDsKKwljb25zdCBjaGFyKiBfX3AgPSBjaGFyX3RyYWl0czxjaGFyPjo6ZmluZChfX2NzLCBfX2xlbiwgJy4nKTsKKwlpZiAoX19wKQorCSAgeworCSAgICBfX3dwID0gX193cyArIChfX3AgLSBfX2NzKTsKKwkgICAgKl9fd3AgPSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50OworCSAgfQorCQorCS8vIEFkZCBncm91cGluZywgaWYgbmVjZXNzYXJ5LgorCS8vIE4uQi4gTWFrZSBzdXJlIHRvIG5vdCBncm91cCB0aGluZ3MgbGlrZSAyZTIwLCBpLmUuLCBubyBkZWNpbWFsCisJLy8gcG9pbnQsIHNjaWVudGlmaWMgbm90YXRpb24uCisJaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZworCSAgICAmJiAoX193cCB8fCBfX2xlbiA8IDMgfHwgKF9fY3NbMV0gPD0gJzknICYmIF9fY3NbMl0gPD0gJzknCisJCQkJICAgICAgJiYgX19jc1sxXSA+PSAnMCcgJiYgX19jc1syXSA+PSAnMCcpKSkKKwkgIHsKKwkgICAgLy8gR3JvdXBpbmcgY2FuIGFkZCAoYWxtb3N0KSBhcyBtYW55IHNlcGFyYXRvcnMgYXMgdGhlCisJICAgIC8vIG51bWJlciBvZiBkaWdpdHMsIGJ1dCBubyBtb3JlLgorCSAgICBfQ2hhclQqIF9fd3MyID0gc3RhdGljX2Nhc3Q8X0NoYXJUKj4oX19idWlsdGluX2FsbG9jYShzaXplb2YoX0NoYXJUKQorCQkJCQkJCQkgICogX19sZW4gKiAyKSk7CisJICAgIAorCSAgICBzdHJlYW1zaXplIF9fb2ZmID0gMDsKKwkgICAgaWYgKF9fY3NbMF0gPT0gJy0nIHx8IF9fY3NbMF0gPT0gJysnKQorCSAgICAgIHsKKwkJX19vZmYgPSAxOworCQlfX3dzMlswXSA9IF9fd3NbMF07CisJCV9fbGVuIC09IDE7CisJICAgICAgfQorCSAgICAKKwkgICAgX01fZ3JvdXBfZmxvYXQoX19sYy0+X01fZ3JvdXBpbmcsIF9fbGMtPl9NX2dyb3VwaW5nX3NpemUsCisJCQkgICBfX2xjLT5fTV90aG91c2FuZHNfc2VwLCBfX3dwLCBfX3dzMiArIF9fb2ZmLAorCQkJICAgX193cyArIF9fb2ZmLCBfX2xlbik7CisJICAgIF9fbGVuICs9IF9fb2ZmOworCSAgICAKKwkgICAgX193cyA9IF9fd3MyOworCSAgfQorCisJLy8gUGFkLgorCWNvbnN0IHN0cmVhbXNpemUgX193ID0gX19pby53aWR0aCgpOworCWlmIChfX3cgPiBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2xlbikpCisJICB7CisJICAgIF9DaGFyVCogX193czMgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihfQ2hhclQpCisJCQkJCQkJCSAgKiBfX3cpKTsKKwkgICAgX01fcGFkKF9fZmlsbCwgX193LCBfX2lvLCBfX3dzMywgX193cywgX19sZW4pOworCSAgICBfX3dzID0gX193czM7CisJICB9CisJX19pby53aWR0aCgwKTsKKwkKKwkvLyBbMjIuMi4yLjIuMl0gU3RhZ2UgNC4KKwkvLyBXcml0ZSByZXN1bHRpbmcsIGZ1bGx5LWZvcm1hdHRlZCBzdHJpbmcgdG8gb3V0cHV0IGl0ZXJhdG9yLgorCXJldHVybiBzdGQ6Ol9fd3JpdGUoX19zLCBfX3dzLCBfX2xlbik7CisgICAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBib29sIF9fdikgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faW8uZmxhZ3MoKTsKKyAgICAgIGlmICgoX19mbGFncyAmIGlvc19iYXNlOjpib29sYWxwaGEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBsb25nIF9fbCA9IF9fdjsKKyAgICAgICAgICBfX3MgPSBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLCBfX2wpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIHR5cGVkZWYgX19udW1wdW5jdF9jYWNoZTxfQ2hhclQ+ICAgICAgICAgICAgICBfX2NhY2hlX3R5cGU7CisJICBfX3VzZV9jYWNoZTxfX2NhY2hlX3R5cGU+IF9fdWM7CisJICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKwkgIGNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCisJICBjb25zdCBfQ2hhclQqIF9fbmFtZSA9IF9fdiA/IF9fbGMtPl9NX3RydWVuYW1lCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fbGMtPl9NX2ZhbHNlbmFtZTsKKwkgIGludCBfX2xlbiA9IF9fdiA/IF9fbGMtPl9NX3RydWVuYW1lX3NpemUKKwkgICAgICAgICAgICAgICAgICA6IF9fbGMtPl9NX2ZhbHNlbmFtZV9zaXplOworCisJICBjb25zdCBzdHJlYW1zaXplIF9fdyA9IF9faW8ud2lkdGgoKTsKKwkgIGlmIChfX3cgPiBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfX2xlbikpCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fcGxlbiA9IF9fdyAtIF9fbGVuOworCSAgICAgIF9DaGFyVCogX19wcworCQk9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2Eoc2l6ZW9mKF9DaGFyVCkKKwkJCQkJCQkqIF9fcGxlbikpOworCisJICAgICAgY2hhcl90cmFpdHM8X0NoYXJUPjo6YXNzaWduKF9fcHMsIF9fcGxlbiwgX19maWxsKTsKKwkgICAgICBfX2lvLndpZHRoKDApOworCisJICAgICAgaWYgKChfX2ZsYWdzICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkKSA9PSBpb3NfYmFzZTo6bGVmdCkKKwkJeworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fcHMsIF9fcGxlbik7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBfX3MgPSBzdGQ6Ol9fd3JpdGUoX19zLCBfX3BzLCBfX3BsZW4pOworCQkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCQl9CisJICAgICAgcmV0dXJuIF9fczsKKwkgICAgfQorCSAgX19pby53aWR0aCgwKTsKKwkgIF9fcyA9IHN0ZDo6X193cml0ZShfX3MsIF9fbmFtZSwgX19sZW4pOworCX0KKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGRvdWJsZSBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5zZXJ0X2Zsb2F0KF9fcywgX19pbywgX19maWxsLCBjaGFyKCksIF9fdik7IH0KKworI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbnVtX3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgX19kb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGRvdWJsZSBfX3YpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5zZXJ0X2Zsb2F0KF9fcywgX19pbywgX19maWxsLCBjaGFyKCksIF9fdik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBudW1fcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsCisJICAgbG9uZyBkb3VibGUgX192KSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2luc2VydF9mbG9hdChfX3MsIF9faW8sIF9fZmlsbCwgJ0wnLCBfX3YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG51bV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIGRvX3B1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKyAgICAgICAgICAgY29uc3Qgdm9pZCogX192KSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pby5mbGFncygpOworICAgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZm10ID0gfihpb3NfYmFzZTo6YmFzZWZpZWxkCisJCQkJCSB8IGlvc19iYXNlOjp1cHBlcmNhc2UpOworICAgICAgX19pby5mbGFncygoX19mbGFncyAmIF9fZm10KSB8IChpb3NfYmFzZTo6aGV4IHwgaW9zX2Jhc2U6OnNob3diYXNlKSk7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8KHNpemVvZihjb25zdCB2b2lkKikKKwkJCQkJICAgICA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpLAorCXVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZz46Ol9fdHlwZSBfVUludFB0clR5cGU7ICAgICAgIAorCisgICAgICBfX3MgPSBfTV9pbnNlcnRfaW50KF9fcywgX19pbywgX19maWxsLAorCQkJICByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX192KSk7CisgICAgICBfX2lvLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorCisgIC8vIENvbnN0cnVjdCBjb3JyZWN0bHkgcGFkZGVkIHN0cmluZywgYXMgcGVyIDIyLjIuMi4yLjIKKyAgLy8gQXNzdW1lcworICAvLyBfX25ld2xlbiA+IF9fb2xkbGVuCisgIC8vIF9fbmV3cyBpcyBhbGxvY2F0ZWQgZm9yIF9fbmV3bGVuIHNpemUKKworICAvLyBOQjogT2YgdGhlIHR3byBwYXJhbWV0ZXJzLCBfQ2hhclQgY2FuIGJlIGRlZHVjZWQgZnJvbSB0aGUKKyAgLy8gZnVuY3Rpb24gYXJndW1lbnRzLiBUaGUgb3RoZXIgKF9UcmFpdHMpIGhhcyB0byBiZSBleHBsaWNpdGx5IHNwZWNpZmllZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHZvaWQKKyAgICBfX3BhZDxfQ2hhclQsIF9UcmFpdHM+OjpfU19wYWQoaW9zX2Jhc2UmIF9faW8sIF9DaGFyVCBfX2ZpbGwsCisJCQkJICAgX0NoYXJUKiBfX25ld3MsIGNvbnN0IF9DaGFyVCogX19vbGRzLAorCQkJCSAgIHN0cmVhbXNpemUgX19uZXdsZW4sIHN0cmVhbXNpemUgX19vbGRsZW4pCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9fcGxlbiA9IHN0YXRpY19jYXN0PHNpemVfdD4oX19uZXdsZW4gLSBfX29sZGxlbik7CisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19hZGp1c3QgPSBfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6YWRqdXN0ZmllbGQ7CisKKyAgICAgIC8vIFBhZGRpbmcgbGFzdC4KKyAgICAgIGlmIChfX2FkanVzdCA9PSBpb3NfYmFzZTo6bGVmdCkKKwl7CisJICBfVHJhaXRzOjpjb3B5KF9fbmV3cywgX19vbGRzLCBfX29sZGxlbik7CisJICBfVHJhaXRzOjphc3NpZ24oX19uZXdzICsgX19vbGRsZW4sIF9fcGxlbiwgX19maWxsKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIHNpemVfdCBfX21vZCA9IDA7CisgICAgICBpZiAoX19hZGp1c3QgPT0gaW9zX2Jhc2U6OmludGVybmFsKQorCXsKKwkgIC8vIFBhZCBhZnRlciB0aGUgc2lnbiwgaWYgdGhlcmUgaXMgb25lLgorCSAgLy8gUGFkIGFmdGVyIDBbeFhdLCBpZiB0aGVyZSBpcyBvbmUuCisJICAvLyBXaG8gY2FtZSB1cCB3aXRoIHRoZXNlIHJ1bGVzLCBhbnl3YXk/IEplZXplLgorICAgICAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCSAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisJICBpZiAoX19jdHlwZS53aWRlbignLScpID09IF9fb2xkc1swXQorCSAgICAgIHx8IF9fY3R5cGUud2lkZW4oJysnKSA9PSBfX29sZHNbMF0pCisJICAgIHsKKwkgICAgICBfX25ld3NbMF0gPSBfX29sZHNbMF07CisJICAgICAgX19tb2QgPSAxOworCSAgICAgICsrX19uZXdzOworCSAgICB9CisJICBlbHNlIGlmIChfX2N0eXBlLndpZGVuKCcwJykgPT0gX19vbGRzWzBdCisJCSAgICYmIF9fb2xkbGVuID4gMQorCQkgICAmJiAoX19jdHlwZS53aWRlbigneCcpID09IF9fb2xkc1sxXQorCQkgICAgICAgfHwgX19jdHlwZS53aWRlbignWCcpID09IF9fb2xkc1sxXSkpCisJICAgIHsKKwkgICAgICBfX25ld3NbMF0gPSBfX29sZHNbMF07CisJICAgICAgX19uZXdzWzFdID0gX19vbGRzWzFdOworCSAgICAgIF9fbW9kID0gMjsKKwkgICAgICBfX25ld3MgKz0gMjsKKwkgICAgfQorCSAgLy8gZWxzZSBQYWRkaW5nIGZpcnN0LgorCX0KKyAgICAgIF9UcmFpdHM6OmFzc2lnbihfX25ld3MsIF9fcGxlbiwgX19maWxsKTsKKyAgICAgIF9UcmFpdHM6OmNvcHkoX19uZXdzICsgX19wbGVuLCBfX29sZHMgKyBfX21vZCwgX19vbGRsZW4gLSBfX21vZCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQqCisgICAgX19hZGRfZ3JvdXBpbmcoX0NoYXJUKiBfX3MsIF9DaGFyVCBfX3NlcCwKKwkJICAgY29uc3QgY2hhciogX19nYmVnLCBzaXplX3QgX19nc2l6ZSwKKwkJICAgY29uc3QgX0NoYXJUKiBfX2ZpcnN0LCBjb25zdCBfQ2hhclQqIF9fbGFzdCkKKyAgICB7CisgICAgICBzaXplX3QgX19pZHggPSAwOworICAgICAgc2l6ZV90IF9fY3RyID0gMDsKKworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiBfX2diZWdbX19pZHhdCisJICAgICAmJiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oX19nYmVnW19faWR4XSkgPiAwCisJICAgICAmJiBfX2diZWdbX19pZHhdICE9IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxjaGFyPjo6X19tYXgpCisJeworCSAgX19sYXN0IC09IF9fZ2JlZ1tfX2lkeF07CisJICBfX2lkeCA8IF9fZ3NpemUgLSAxID8gKytfX2lkeCA6ICsrX19jdHI7CisJfQorCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJKl9fcysrID0gKl9fZmlyc3QrKzsKKworICAgICAgd2hpbGUgKF9fY3RyLS0pCisJeworCSAgKl9fcysrID0gX19zZXA7CSAgCisJICBmb3IgKGNoYXIgX19pID0gX19nYmVnW19faWR4XTsgX19pID4gMDsgLS1fX2kpCisJICAgICpfX3MrKyA9ICpfX2ZpcnN0Kys7CisJfQorCisgICAgICB3aGlsZSAoX19pZHgtLSkKKwl7CisJICAqX19zKysgPSBfX3NlcDsJICAKKwkgIGZvciAoY2hhciBfX2kgPSBfX2diZWdbX19pZHhdOyBfX2kgPiAwOyAtLV9faSkKKwkgICAgKl9fcysrID0gKl9fZmlyc3QrKzsKKwl9CisKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbnVtcHVuY3Q8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBudW1wdW5jdF9ieW5hbWU8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBudW1fZ2V0PGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgbnVtX3B1dDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGN0eXBlX2J5bmFtZTxjaGFyPjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBjdHlwZTxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1wdW5jdDxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8bnVtcHVuY3Q8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1fcHV0PGNoYXI+JgorICAgIHVzZV9mYWNldDxudW1fcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbnVtX2dldDxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8bnVtX2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8Y3R5cGU8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxudW1fcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxudW1fZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbnVtcHVuY3Q8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBudW1wdW5jdF9ieW5hbWU8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBfR0xJQkNYWF9OQU1FU1BBQ0VfTERCTCBudW1fZ2V0PHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgbnVtX3B1dDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGN0eXBlX2J5bmFtZTx3Y2hhcl90PjsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBjdHlwZTx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8Y3R5cGU8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1wdW5jdDx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8bnVtcHVuY3Q8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBudW1fcHV0PHdjaGFyX3Q+JgorICAgIHVzZV9mYWNldDxudW1fcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbnVtX2dldDx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8bnVtX2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxjdHlwZTx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bnVtcHVuY3Q8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bV9wdXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG51bV9nZXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdjMWE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaApAQCAtMCwwICsxLDE5MzggQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9sb2NhbGVfZmFjZXRzX25vbmlvLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjEgIExvY2FsZXMKKy8vCisKKyNpZm5kZWYgX0xPQ0FMRV9GQUNFVFNfTk9OSU9fSAorI2RlZmluZSBfTE9DQUxFX0ZBQ0VUU19OT05JT19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3RpbWU+CS8vIEZvciBzdHJ1Y3QgdG0KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBUaW1lIGZvcm1hdCBvcmRlcmluZyBkYXRhLgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBlbnVtIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgb3JkZXJpbmdzIG9mCisgICAqICB0aW1lOiBkYXksIG1vbnRoLCBhbmQgeWVhci4KKyAgKi8KKyAgY2xhc3MgdGltZV9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIGVudW0gZGF0ZW9yZGVyIHsgbm9fb3JkZXIsIGRteSwgbWR5LCB5bWQsIHlkbSB9OworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgX190aW1lcHVuY3RfY2FjaGUgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICAgIC8vIExpc3Qgb2YgYWxsIGtub3duIHRpbWV6b25lcywgd2l0aCBHTVQgZmlyc3QuCisgICAgICBzdGF0aWMgY29uc3QgX0NoYXJUKgkJX1NfdGltZXpvbmVzWzE0XTsKKworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RhdGVfZm9ybWF0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RhdGVfZXJhX2Zvcm1hdDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV90aW1lX2Zvcm1hdDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV90aW1lX2VyYV9mb3JtYXQ7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF0ZV90aW1lX2Zvcm1hdDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXRlX3RpbWVfZXJhX2Zvcm1hdDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9wbTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hbV9wbV9mb3JtYXQ7CisKKyAgICAgIC8vIERheSBuYW1lcywgc3RhcnRpbmcgd2l0aCAiQyIncyBTdW5kYXkuCisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5MTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXkyOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTM7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5NDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9kYXk1OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2RheTY7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fZGF5NzsKKworICAgICAgLy8gQWJicmV2aWF0ZWQgZGF5IG5hbWVzLCBzdGFydGluZyB3aXRoICJDIidzIFN1bi4KKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5MTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5MjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5MzsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5NDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5NTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5NjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9hZGF5NzsKKworICAgICAgLy8gTW9udGggbmFtZXMsIHN0YXJ0aW5nIHdpdGggIkMiJ3MgSmFudWFyeS4KKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDAxOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDI7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwMzsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDA0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDU7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwNjsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDA3OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMDg7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgwOTsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9tb250aDEwOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX21vbnRoMTE7CisgICAgICBjb25zdCBfQ2hhclQqCQkJX01fbW9udGgxMjsKKworICAgICAgLy8gQWJicmV2aWF0ZWQgbW9udGggbmFtZXMsIHN0YXJ0aW5nIHdpdGggIkMiJ3MgSmFuLgorICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDAxOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDAyOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDAzOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDA0OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDA1OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDA2OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDA3OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDA4OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDA5OworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDEwOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDExOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX2Ftb250aDEyOworCisgICAgICBib29sCQkJCV9NX2FsbG9jYXRlZDsKKworICAgICAgX190aW1lcHVuY3RfY2FjaGUoc2l6ZV90IF9fcmVmcyA9IDApIDogZmFjZXQoX19yZWZzKSwKKyAgICAgIF9NX2RhdGVfZm9ybWF0KDApLCBfTV9kYXRlX2VyYV9mb3JtYXQoMCksIF9NX3RpbWVfZm9ybWF0KDApLAorICAgICAgX01fdGltZV9lcmFfZm9ybWF0KDApLCBfTV9kYXRlX3RpbWVfZm9ybWF0KDApLAorICAgICAgX01fZGF0ZV90aW1lX2VyYV9mb3JtYXQoMCksIF9NX2FtKDApLCBfTV9wbSgwKSwKKyAgICAgIF9NX2FtX3BtX2Zvcm1hdCgwKSwgX01fZGF5MSgwKSwgX01fZGF5MigwKSwgX01fZGF5MygwKSwKKyAgICAgIF9NX2RheTQoMCksIF9NX2RheTUoMCksIF9NX2RheTYoMCksIF9NX2RheTcoMCksCisgICAgICBfTV9hZGF5MSgwKSwgX01fYWRheTIoMCksIF9NX2FkYXkzKDApLCBfTV9hZGF5NCgwKSwKKyAgICAgIF9NX2FkYXk1KDApLCBfTV9hZGF5NigwKSwgX01fYWRheTcoMCksIF9NX21vbnRoMDEoMCksCisgICAgICBfTV9tb250aDAyKDApLCBfTV9tb250aDAzKDApLCBfTV9tb250aDA0KDApLCBfTV9tb250aDA1KDApLAorICAgICAgX01fbW9udGgwNigwKSwgX01fbW9udGgwNygwKSwgX01fbW9udGgwOCgwKSwgX01fbW9udGgwOSgwKSwKKyAgICAgIF9NX21vbnRoMTAoMCksIF9NX21vbnRoMTEoMCksIF9NX21vbnRoMTIoMCksIF9NX2Ftb250aDAxKDApLAorICAgICAgX01fYW1vbnRoMDIoMCksIF9NX2Ftb250aDAzKDApLCBfTV9hbW9udGgwNCgwKSwKKyAgICAgIF9NX2Ftb250aDA1KDApLCBfTV9hbW9udGgwNigwKSwgX01fYW1vbnRoMDcoMCksCisgICAgICBfTV9hbW9udGgwOCgwKSwgX01fYW1vbnRoMDkoMCksIF9NX2Ftb250aDEwKDApLAorICAgICAgX01fYW1vbnRoMTEoMCksIF9NX2Ftb250aDEyKDApLCBfTV9hbGxvY2F0ZWQoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgfl9fdGltZXB1bmN0X2NhY2hlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fdGltZXB1bmN0X2NhY2hlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fdGltZXB1bmN0X2NhY2hlJik7CisgICAgICAKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3RpbWVwdW5jdF9jYWNoZShjb25zdCBfX3RpbWVwdW5jdF9jYWNoZSYpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0X2NhY2hlPF9DaGFyVD46On5fX3RpbWVwdW5jdF9jYWNoZSgpCisgICAgeworICAgICAgaWYgKF9NX2FsbG9jYXRlZCkKKwl7CisJICAvLyBVbnVzZWQuCisJfQorICAgIH0KKworICAvLyBTcGVjaWFsaXphdGlvbnMuCisgIHRlbXBsYXRlPD4KKyAgICBjb25zdCBjaGFyKgorICAgIF9fdGltZXB1bmN0X2NhY2hlPGNoYXI+OjpfU190aW1lem9uZXNbMTRdOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIGNvbnN0IHdjaGFyX3QqCisgICAgX190aW1lcHVuY3RfY2FjaGU8d2NoYXJfdD46Ol9TX3RpbWV6b25lc1sxNF07CisjZW5kaWYKKworICAvLyBHZW5lcmljLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY29uc3QgX0NoYXJUKiBfX3RpbWVwdW5jdF9jYWNoZTxfQ2hhclQ+OjpfU190aW1lem9uZXNbMTRdOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBfX3RpbWVwdW5jdCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQlfX2NoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4JX19zdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgX190aW1lcHVuY3RfY2FjaGU8X0NoYXJUPglfX2NhY2hlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfX2NhY2hlX3R5cGUqCQkJX01fZGF0YTsKKyAgICAgIF9fY19sb2NhbGUJCQlfTV9jX2xvY2FsZV90aW1lcHVuY3Q7CisgICAgICBjb25zdCBjaGFyKgkJCV9NX25hbWVfdGltZXB1bmN0OworCisgICAgcHVibGljOgorICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdGltZXB1bmN0KHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdGltZXB1bmN0KF9fY2FjaGVfdHlwZSogX19jYWNoZSwgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIHMgIFRoZSBuYW1lIG9mIGEgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdGltZXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIHNpemVfdCBfX3JlZnMgPSAwKTsKKworICAgICAgLy8gRklYTUU6IGZvciBlcnJvciBjaGVja2luZyBwdXJwb3NlcyBfTV9wdXQgc2hvdWxkIHJldHVybiB0aGUgcmV0dXJuCisgICAgICAvLyB2YWx1ZSBvZiBzdHJmdGltZS93Y3NmdGltZS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dChfQ2hhclQqIF9fcywgc2l6ZV90IF9fbWF4bGVuLCBjb25zdCBfQ2hhclQqIF9fZm9ybWF0LAorCSAgICAgY29uc3QgdG0qIF9fdG0pIGNvbnN0IHRocm93ICgpOworCisgICAgICB2b2lkCisgICAgICBfTV9kYXRlX2Zvcm1hdHMoY29uc3QgX0NoYXJUKiogX19kYXRlKSBjb25zdAorICAgICAgeworCS8vIEFsd2F5cyBoYXZlIGRlZmF1bHQgZmlyc3QuCisJX19kYXRlWzBdID0gX01fZGF0YS0+X01fZGF0ZV9mb3JtYXQ7CisJX19kYXRlWzFdID0gX01fZGF0YS0+X01fZGF0ZV9lcmFfZm9ybWF0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV90aW1lX2Zvcm1hdHMoY29uc3QgX0NoYXJUKiogX190aW1lKSBjb25zdAorICAgICAgeworCS8vIEFsd2F5cyBoYXZlIGRlZmF1bHQgZmlyc3QuCisJX190aW1lWzBdID0gX01fZGF0YS0+X01fdGltZV9mb3JtYXQ7CisJX190aW1lWzFdID0gX01fZGF0YS0+X01fdGltZV9lcmFfZm9ybWF0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kYXRlX3RpbWVfZm9ybWF0cyhjb25zdCBfQ2hhclQqKiBfX2R0KSBjb25zdAorICAgICAgeworCS8vIEFsd2F5cyBoYXZlIGRlZmF1bHQgZmlyc3QuCisJX19kdFswXSA9IF9NX2RhdGEtPl9NX2RhdGVfdGltZV9mb3JtYXQ7CisJX19kdFsxXSA9IF9NX2RhdGEtPl9NX2RhdGVfdGltZV9lcmFfZm9ybWF0OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hbV9wbV9mb3JtYXQoY29uc3QgX0NoYXJUKiBfX2FtcG0pIGNvbnN0CisgICAgICB7IF9fYW1wbSA9IF9NX2RhdGEtPl9NX2FtX3BtX2Zvcm1hdDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hbV9wbShjb25zdCBfQ2hhclQqKiBfX2FtcG0pIGNvbnN0CisgICAgICB7CisJX19hbXBtWzBdID0gX01fZGF0YS0+X01fYW07CisJX19hbXBtWzFdID0gX01fZGF0YS0+X01fcG07CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RheXMoY29uc3QgX0NoYXJUKiogX19kYXlzKSBjb25zdAorICAgICAgeworCV9fZGF5c1swXSA9IF9NX2RhdGEtPl9NX2RheTE7CisJX19kYXlzWzFdID0gX01fZGF0YS0+X01fZGF5MjsKKwlfX2RheXNbMl0gPSBfTV9kYXRhLT5fTV9kYXkzOworCV9fZGF5c1szXSA9IF9NX2RhdGEtPl9NX2RheTQ7CisJX19kYXlzWzRdID0gX01fZGF0YS0+X01fZGF5NTsKKwlfX2RheXNbNV0gPSBfTV9kYXRhLT5fTV9kYXk2OworCV9fZGF5c1s2XSA9IF9NX2RhdGEtPl9NX2RheTc7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RheXNfYWJicmV2aWF0ZWQoY29uc3QgX0NoYXJUKiogX19kYXlzKSBjb25zdAorICAgICAgeworCV9fZGF5c1swXSA9IF9NX2RhdGEtPl9NX2FkYXkxOworCV9fZGF5c1sxXSA9IF9NX2RhdGEtPl9NX2FkYXkyOworCV9fZGF5c1syXSA9IF9NX2RhdGEtPl9NX2FkYXkzOworCV9fZGF5c1szXSA9IF9NX2RhdGEtPl9NX2FkYXk0OworCV9fZGF5c1s0XSA9IF9NX2RhdGEtPl9NX2FkYXk1OworCV9fZGF5c1s1XSA9IF9NX2RhdGEtPl9NX2FkYXk2OworCV9fZGF5c1s2XSA9IF9NX2RhdGEtPl9NX2FkYXk3OworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9tb250aHMoY29uc3QgX0NoYXJUKiogX19tb250aHMpIGNvbnN0CisgICAgICB7CisJX19tb250aHNbMF0gPSBfTV9kYXRhLT5fTV9tb250aDAxOworCV9fbW9udGhzWzFdID0gX01fZGF0YS0+X01fbW9udGgwMjsKKwlfX21vbnRoc1syXSA9IF9NX2RhdGEtPl9NX21vbnRoMDM7CisJX19tb250aHNbM10gPSBfTV9kYXRhLT5fTV9tb250aDA0OworCV9fbW9udGhzWzRdID0gX01fZGF0YS0+X01fbW9udGgwNTsKKwlfX21vbnRoc1s1XSA9IF9NX2RhdGEtPl9NX21vbnRoMDY7CisJX19tb250aHNbNl0gPSBfTV9kYXRhLT5fTV9tb250aDA3OworCV9fbW9udGhzWzddID0gX01fZGF0YS0+X01fbW9udGgwODsKKwlfX21vbnRoc1s4XSA9IF9NX2RhdGEtPl9NX21vbnRoMDk7CisJX19tb250aHNbOV0gPSBfTV9kYXRhLT5fTV9tb250aDEwOworCV9fbW9udGhzWzEwXSA9IF9NX2RhdGEtPl9NX21vbnRoMTE7CisJX19tb250aHNbMTFdID0gX01fZGF0YS0+X01fbW9udGgxMjsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fbW9udGhzX2FiYnJldmlhdGVkKGNvbnN0IF9DaGFyVCoqIF9fbW9udGhzKSBjb25zdAorICAgICAgeworCV9fbW9udGhzWzBdID0gX01fZGF0YS0+X01fYW1vbnRoMDE7CisJX19tb250aHNbMV0gPSBfTV9kYXRhLT5fTV9hbW9udGgwMjsKKwlfX21vbnRoc1syXSA9IF9NX2RhdGEtPl9NX2Ftb250aDAzOworCV9fbW9udGhzWzNdID0gX01fZGF0YS0+X01fYW1vbnRoMDQ7CisJX19tb250aHNbNF0gPSBfTV9kYXRhLT5fTV9hbW9udGgwNTsKKwlfX21vbnRoc1s1XSA9IF9NX2RhdGEtPl9NX2Ftb250aDA2OworCV9fbW9udGhzWzZdID0gX01fZGF0YS0+X01fYW1vbnRoMDc7CisJX19tb250aHNbN10gPSBfTV9kYXRhLT5fTV9hbW9udGgwODsKKwlfX21vbnRoc1s4XSA9IF9NX2RhdGEtPl9NX2Ftb250aDA5OworCV9fbW9udGhzWzldID0gX01fZGF0YS0+X01fYW1vbnRoMTA7CisJX19tb250aHNbMTBdID0gX01fZGF0YS0+X01fYW1vbnRoMTE7CisJX19tb250aHNbMTFdID0gX01fZGF0YS0+X01fYW1vbnRoMTI7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+X190aW1lcHVuY3QoKTsKKworICAgICAgLy8gRm9yIHVzZSBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvbmx5LgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MgPSAwKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBsb2NhbGU6OmlkIF9fdGltZXB1bmN0PF9DaGFyVD46OmlkOworCisgIC8vIFNwZWNpYWxpemF0aW9ucy4KKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBfX3RpbWVwdW5jdDxjaGFyPjo6X01faW5pdGlhbGl6ZV90aW1lcHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MpOworCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX190aW1lcHVuY3Q8Y2hhcj46Ol9NX3B1dChjaGFyKiwgc2l6ZV90LCBjb25zdCBjaGFyKiwgY29uc3QgdG0qKSBjb25zdCB0aHJvdyAoKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICB2b2lkCisgICAgX190aW1lcHVuY3Q8d2NoYXJfdD46Ol9NX2luaXRpYWxpemVfdGltZXB1bmN0KF9fY19sb2NhbGUgX19jbG9jKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIF9fdGltZXB1bmN0PHdjaGFyX3Q+OjpfTV9wdXQod2NoYXJfdCosIHNpemVfdCwgY29uc3Qgd2NoYXJfdCosCisJCQkJIGNvbnN0IHRtKikgY29uc3QgdGhyb3cgKCk7CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisgIC8vIEluY2x1ZGUgaG9zdCBhbmQgY29uZmlndXJhdGlvbiBzcGVjaWZpYyB0aW1lcHVuY3QgZnVuY3Rpb25zLgorICAjaW5jbHVkZSA8Yml0cy90aW1lX21lbWJlcnMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIHRpbWVfZ2V0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIGNvZGUgdG8gcGFyc2UgYW5kIHJldHVybiBhIGRhdGUgb3IKKyAgICogIHRpbWUgZnJvbSBhIHN0cmluZy4gIEl0IGlzIHVzZWQgYnkgdGhlIGlzdHJlYW0gbnVtZXJpYworICAgKiAgZXh0cmFjdGlvbiBvcGVyYXRvcnMuCisgICAqCisgICAqICBUaGUgdGltZV9nZXQgdGVtcGxhdGUgdXNlcyBwcm90ZWN0ZWQgdmlydHVhbCBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUKKyAgICogIGFjdHVhbCByZXN1bHRzLiAgVGhlIHB1YmxpYyBhY2Nlc3NvcnMgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgdmlydHVhbAorICAgKiAgZnVuY3Rpb25zLiAgVGhlc2UgdmlydHVhbCBmdW5jdGlvbnMgYXJlIGhvb2tzIGZvciBkZXZlbG9wZXJzIHRvCisgICAqICBpbXBsZW1lbnQgdGhlIGJlaGF2aW9yIHRoZXkgcmVxdWlyZSBmcm9tIHRoZSB0aW1lX2dldCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGNsYXNzIHRpbWVfZ2V0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyB0aW1lX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0luSXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIC8vQH0KKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4JX19zdHJpbmdfdHlwZTsKKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB0aW1lX2dldChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQgKF9fcmVmcykgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHByZWZlcnJlZCBvcmRlciBvZiBtb250aCwgZGF5LCBhbmQgeWVhci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVudW0gZnJvbSB0aW1lYmFzZTo6ZGF0ZW9yZGVyIGdpdmluZyB0aGUKKyAgICAgICAqICBwcmVmZXJyZWQgb3JkZXJpbmcgaWYgdGhlIGZvcm1hdCBAYSB4IGdpdmVuIHRvIHRpbWVfcHV0OjpwdXQoKSBvbmx5CisgICAgICAgKiAgdXNlcyBtb250aCwgZGF5LCBhbmQgeWVhci4gIElmIHRoZSBmb3JtYXQgQGEgeCBmb3IgdGhlIGFzc29jaWF0ZWQKKyAgICAgICAqICBsb2NhbGUgdXNlcyBvdGhlciBmaWVsZHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgICAgICogIHRpbWViYXNlOjpkYXRlb3JkZXI6Om5vb3JkZXIuCisgICAgICAgKgorICAgICAgICogIE5PVEU6IFRoZSBsaWJyYXJ5IGFsd2F5cyByZXR1cm5zIG5vb3JkZXIgYXQgdGhlIG1vbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQSBtZW1iZXIgb2YgdGltZWJhc2U6OmRhdGVvcmRlci4KKyAgICAgICovCisgICAgICBkYXRlb3JkZXIKKyAgICAgIGRhdGVfb3JkZXIoKSAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2RhdGVfb3JkZXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IHRpbWUgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgQGEgWCBhbmQgcHV0cyB0aGUKKyAgICAgICAqICByZXN1bHRzIGludG8gYSB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYnkKKyAgICAgICAqICBjYWxsaW5nIHRpbWVfZ2V0Ojpkb19nZXRfdGltZSgpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGVyZSBpcyBhIHZhbGlkIHRpbWUgc3RyaW5nIGFjY29yZGluZyB0byBmb3JtYXQgQGEgWCwgQGEgdG0gd2lsbAorICAgICAgICogIGJlIGZpbGxlZCBpbiBhY2NvcmRpbmdseSBhbmQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIHdpbGwgcG9pbnQgdG8gdGhlCisgICAgICAgKiAgZmlyc3QgY2hhcmFjdGVyIGJleW9uZCB0aGUgdGltZSBzdHJpbmcuICBJZiBhbiBlcnJvciBvY2N1cnMgYmVmb3JlCisgICAgICAgKiAgdGhlIGVuZCwgZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0LiAgSWYgcGFyc2luZyByZWFkcyBhbGwgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycywgZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBlcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIHRtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHRpbWUgc3RyaW5nLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0X3RpbWUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSAgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldF90aW1lKF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgZGF0ZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgZGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBAYSB4IGFuZCBwdXRzIHRoZQorICAgICAgICogIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBieQorICAgICAgICogIGNhbGxpbmcgdGltZV9nZXQ6OmRvX2dldF9kYXRlKCkuCisgICAgICAgKgorICAgICAgICogIElmIHRoZXJlIGlzIGEgdmFsaWQgZGF0ZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGZvcm1hdCBAYSB4LCBAYSB0bSB3aWxsCisgICAgICAgKiAgYmUgZmlsbGVkIGluIGFjY29yZGluZ2x5IGFuZCB0aGUgcmV0dXJuZWQgaXRlcmF0b3Igd2lsbCBwb2ludCB0byB0aGUKKyAgICAgICAqICBmaXJzdCBjaGFyYWN0ZXIgYmV5b25kIHRoZSBkYXRlIHN0cmluZy4gIElmIGFuIGVycm9yIG9jY3VycyBiZWZvcmUKKyAgICAgICAqICB0aGUgZW5kLCBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQuICBJZiBwYXJzaW5nIHJlYWRzIGFsbCB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzLCBlcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBiZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgZGF0ZSBzdHJpbmcuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXRfZGF0ZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pICBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0X2RhdGUoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCB3ZWVrZGF5IHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSB3ZWVrZGF5IG5hbWUgYW5kIHB1dHMgdGhlIHJlc3VsdHMgaW50byBhCisgICAgICAgKiAgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzIHJldHVybmVkIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0aW1lX2dldDo6ZG9fZ2V0X3dlZWtkYXkoKS4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2luZyBzdGFydHMgYnkgcGFyc2luZyBhbiBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWUuICBJZiBhIHZhbGlkCisgICAgICAgKiAgYWJicmV2aWF0aW9uIGlzIGZvbGxvd2VkIGJ5IGEgY2hhcmFjdGVyIHRoYXQgd291bGQgbGVhZCB0byB0aGUgZnVsbAorICAgICAgICogIHdlZWtkYXkgbmFtZSwgcGFyc2luZyBjb250aW51ZXMgdW50aWwgdGhlIGZ1bGwgbmFtZSBpcyBmb3VuZCBvciBhbgorICAgICAgICogIGVycm9yIG9jY3Vycy4gIE90aGVyd2lzZSBwYXJzaW5nIGZpbmlzaGVzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgKiAgYWJicmV2aWF0ZWQgbmFtZS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZSB0aGUgZW5kLCBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQuICBJZgorICAgICAgICogIHBhcnNpbmcgcmVhZHMgYWxsIHRoZSBjaGFyYWN0ZXJzLCBlcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBiZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgd2Vla2RheSBuYW1lLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXRfd2Vla2RheShfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3RtKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IG1vbnRoIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSBtb250aCBuYW1lIGFuZCBwdXRzIHRoZSByZXN1bHRzIGludG8gYQorICAgICAgICogIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBieSBjYWxsaW5nCisgICAgICAgKiAgdGltZV9nZXQ6OmRvX2dldF9tb250aG5hbWUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUGFyc2luZyBzdGFydHMgYnkgcGFyc2luZyBhbiBhYmJyZXZpYXRlZCBtb250aCBuYW1lLiAgSWYgYSB2YWxpZAorICAgICAgICogIGFiYnJldmlhdGlvbiBpcyBmb2xsb3dlZCBieSBhIGNoYXJhY3RlciB0aGF0IHdvdWxkIGxlYWQgdG8gdGhlIGZ1bGwKKyAgICAgICAqICBtb250aCBuYW1lLCBwYXJzaW5nIGNvbnRpbnVlcyB1bnRpbCB0aGUgZnVsbCBuYW1lIGlzIGZvdW5kIG9yIGFuCisgICAgICAgKiAgZXJyb3Igb2NjdXJzLiAgT3RoZXJ3aXNlIHBhcnNpbmcgZmluaXNoZXMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAqICBhYmJyZXZpYXRlZCBuYW1lLgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBlcnJvciBvY2N1cnMgYmVmb3JlIHRoZSBlbmQsIGVyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdC4gIElmCisgICAgICAgKiAgcGFyc2luZyByZWFkcyBhbGwgdGhlIGNoYXJhY3RlcnMsIGVyciB8PQorICAgICAgICogIGlvc19iYXNlOjplb2ZiaXQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBlcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIHRtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIG1vbnRoIG5hbWUuCisgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXRfbW9udGhuYW1lKF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fdG0pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgeWVhciBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgdXAgdG8gNCBjaGFyYWN0ZXJzIHRvIHBhcnNlIGEgeWVhciBzdHJpbmcgYW5kCisgICAgICAgKiAgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGUgcmVzdWx0IGlzCisgICAgICAgKiAgcmV0dXJuZWQgYnkgY2FsbGluZyB0aW1lX2dldDo6ZG9fZ2V0X3llYXIoKS4KKyAgICAgICAqCisgICAgICAgKiAgNCBjb25zZWN1dGl2ZSBkaWdpdHMgYXJlIGludGVycHJldGVkIGFzIGEgZnVsbCB5ZWFyLiAgSWYgdGhlcmUgYXJlCisgICAgICAgKiAgZXhhY3RseSAyIGNvbnNlY3V0aXZlIGRpZ2l0cywgdGhlIGxpYnJhcnkgaW50ZXJwcmV0cyB0aGlzIGFzIHRoZQorICAgICAgICogIG51bWJlciBvZiB5ZWFycyBzaW5jZSAxOTAwLgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBlcnJvciBvY2N1cnMgYmVmb3JlIHRoZSBlbmQsIGVyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdC4gIElmCisgICAgICAgKiAgcGFyc2luZyByZWFkcyBhbGwgdGhlIGNoYXJhY3RlcnMsIGVyciB8PSBpb3NfYmFzZTo6ZW9mYml0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGJlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICB0bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB5ZWFyLgorICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0X3llYXIoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ2V0X3llYXIoX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX190bSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfnRpbWVfZ2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHByZWZlcnJlZCBvcmRlciBvZiBtb250aCwgZGF5LCBhbmQgeWVhci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVudW0gZnJvbSB0aW1lYmFzZTo6ZGF0ZW9yZGVyIGdpdmluZyB0aGUKKyAgICAgICAqICBwcmVmZXJyZWQgb3JkZXJpbmcgaWYgdGhlIGZvcm1hdCBAYSB4IGdpdmVuIHRvIHRpbWVfcHV0OjpwdXQoKSBvbmx5CisgICAgICAgKiAgdXNlcyBtb250aCwgZGF5LCBhbmQgeWVhci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBBIG1lbWJlciBvZiB0aW1lYmFzZTo6ZGF0ZW9yZGVyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgZGF0ZW9yZGVyCisgICAgICBkb19kYXRlX29yZGVyKCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgdGltZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgdGltZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBAYSB4IGFuZCBwdXRzIHRoZQorICAgICAgICogIHJlc3VsdHMgaW50byBhIHVzZXItc3VwcGxpZWQgc3RydWN0IHRtLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yCisgICAgICAgKiAgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldF90aW1lKCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBiZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgdGltZSBzdHJpbmcuCisgICAgICAqLworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldF90aW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCBkYXRlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSBkYXRlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IEBhIFggYW5kIHB1dHMgdGhlCisgICAgICAgKiAgcmVzdWx0cyBpbnRvIGEgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IKKyAgICAgICAqICBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ2V0X2RhdGUoKSBmb3IKKyAgICAgICAqICBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGJlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICB0bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCBkYXRlIHN0cmluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0X2RhdGUoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQkgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFBhcnNlIGlucHV0IHdlZWtkYXkgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIHdlZWtkYXkgbmFtZSBhbmQgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEKKyAgICAgICAqICB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXRfd2Vla2RheSgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgYmVnICBTdGFydCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBzdHJpbmcgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIHRoZSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBlcnIgIEVycm9yIGZsYWdzIHRvIHNldC4KKyAgICAgICAqICBAcGFyYW0gIHRtICBQb2ludGVyIHRvIHN0cnVjdCB0bSB0byBmaWxsIGluLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHRvIGZpcnN0IGNoYXIgYmV5b25kIHdlZWtkYXkgbmFtZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0X3dlZWtkYXkoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiwKKwkJICAgICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQYXJzZSBpbnB1dCBtb250aCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgbW9udGggbmFtZSBhbmQgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEKKyAgICAgICAqICB1c2VyLXN1cHBsaWVkIHN0cnVjdCB0bS4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBnZXRfbW9udGhuYW1lKCkgZm9yCisgICAgICAgKiAgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBiZWcgIFN0YXJ0IG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIHN0cmluZyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgdGhlIGxvY2FsZS4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmxhZ3MgdG8gc2V0LgorICAgICAgICogIEBwYXJhbSAgdG0gIFBvaW50ZXIgdG8gc3RydWN0IHRtIHRvIGZpbGwgaW4uCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgdG8gZmlyc3QgY2hhciBiZXlvbmQgbW9udGggbmFtZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0X21vbnRobmFtZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmLAorCQkgICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUGFyc2UgaW5wdXQgeWVhciBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgdXAgdG8gNCBjaGFyYWN0ZXJzIHRvIHBhcnNlIGEgeWVhciBzdHJpbmcgYW5kCisgICAgICAgKiAgcHV0cyB0aGUgcmVzdWx0cyBpbnRvIGEgdXNlci1zdXBwbGllZCBzdHJ1Y3QgdG0uICBUaGlzIGZ1bmN0aW9uIGlzIGEKKyAgICAgICAqICBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUKKyAgICAgICAqICBnZXRfeWVhcigpIGZvciBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGJlZyAgU3RhcnQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgZW5kICBFbmQgb2Ygc3RyaW5nIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiB0aGUgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgZXJyICBFcnJvciBmbGFncyB0byBzZXQuCisgICAgICAgKiAgQHBhcmFtICB0bSAgUG9pbnRlciB0byBzdHJ1Y3QgdG0gdG8gZmlsbCBpbi4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciB0byBmaXJzdCBjaGFyIGJleW9uZCB5ZWFyLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19nZXRfeWVhcihpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSkgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3QgbnVtZXJpYyBjb21wb25lbnQgb2YgbGVuZ3RoIF9fbGVuLgorICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X251bShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW50JiBfX21lbWJlciwKKwkJICAgICBpbnQgX19taW4sIGludCBfX21heCwgc2l6ZV90IF9fbGVuLAorCQkgICAgIGlvc19iYXNlJiBfX2lvLCBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIpIGNvbnN0OworCisgICAgICAvLyBFeHRyYWN0IGFueSB1bmlxdWUgYXJyYXkgb2Ygc3RyaW5nIGxpdGVyYWxzIGluIGEgY29uc3QgX0NoYXJUKiBhcnJheS4KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgX01fZXh0cmFjdF9uYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpbnQmIF9fbWVtYmVyLAorCQkgICAgICBjb25zdCBfQ2hhclQqKiBfX25hbWVzLCBzaXplX3QgX19pbmRleGxlbiwKKwkJICAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3QgZGF5IG9yIG1vbnRoIG5hbWUgaW4gYSBjb25zdCBfQ2hhclQqIGFycmF5LgorICAgICAgaXRlcl90eXBlCisgICAgICBfTV9leHRyYWN0X3dkYXlfb3JfbW9udGgoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGludCYgX19tZW1iZXIsCisJCQkgICAgICAgY29uc3QgX0NoYXJUKiogX19uYW1lcywgc2l6ZV90IF9faW5kZXhsZW4sCisJCQkgICAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3Q7CisKKyAgICAgIC8vIEV4dHJhY3Qgb24gYSBjb21wb25lbnQtYnktY29tcG9uZW50IGJhc2lzLCB2aWEgX19mb3JtYXQgYXJndW1lbnQuCisgICAgICBpdGVyX3R5cGUKKyAgICAgIF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCQkgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSwKKwkJCSAgICBjb25zdCBfQ2hhclQqIF9fZm9ybWF0KSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBsb2NhbGU6OmlkIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OmlkOworCisgIC8vLyBjbGFzcyB0aW1lX2dldF9ieW5hbWUgWzIyLjIuNS4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZSA6IHB1YmxpYyB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9Jbkl0ZXIJCQlpdGVyX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0aW1lX2dldF9ieW5hbWUoY29uc3QgY2hhciosIHNpemVfdCBfX3JlZnMgPSAwKQorICAgICAgOiB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+KF9fcmVmcykgeyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+dGltZV9nZXRfYnluYW1lKCkgeyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSB0aW1lX3B1dC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBjb2RlIHRvIGZvcm1hdCBhbmQgb3V0cHV0IGRhdGVzIGFuZCB0aW1lcworICAgKiAgYWNjb3JkaW5nIHRvIGZvcm1hdHMgdXNlZCBieSBzdHJmdGltZSgpLgorICAgKgorICAgKiAgVGhlIHRpbWVfcHV0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlCisgICAqICBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHZpcnR1YWwKKyAgICogIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZSBob29rcyBmb3IgZGV2ZWxvcGVycyB0bworICAgKiAgaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbSB0aGUgdGltZV9wdXQgZmFjZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgY2xhc3MgdGltZV9wdXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZnMKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfT3V0SXRlcgkJCWl0ZXJfdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB0aW1lX3B1dChzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGb3JtYXQgYW5kIG91dHB1dCBhIHRpbWUgb3IgZGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmb3JtYXRzIHRoZSBkYXRhIGluIHN0cnVjdCB0bSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAgcHJvdmlkZWQgZm9ybWF0IHN0cmluZy4gIFRoZSBmb3JtYXQgc3RyaW5nIGlzIGludGVycHJldGVkIGFzIGJ5CisgICAgICAgKiAgc3RyZnRpbWUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICBmaWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgdG0gIFN0cnVjdCB0bSB3aXRoIGRhdGUgYW5kIHRpbWUgaW5mbyB0byBmb3JtYXQuCisgICAgICAgKiAgQHBhcmFtICBiZWcgIFN0YXJ0IG9mIGZvcm1hdCBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBlbmQgIEVuZCBvZiBmb3JtYXQgc3RyaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBjb25zdCB0bSogX190bSwKKwkgIGNvbnN0IF9DaGFyVCogX19iZWcsIGNvbnN0IF9DaGFyVCogX19lbmQpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgdGltZSBvciBkYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgdGhlIGRhdGEgaW4gc3RydWN0IHRtIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBwcm92aWRlZCBmb3JtYXQgY2hhciBhbmQgb3B0aW9uYWwgbW9kaWZpZXIuICBUaGUgZm9ybWF0IGFuZCBtb2RpZmllcgorICAgICAgICogIGFyZSBpbnRlcnByZXRlZCBhcyBieSBzdHJmdGltZSgpLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcKKyAgICAgICAqICB0aW1lX3B1dDo6ZG9fcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgZmlsbCAgY2hhcl90eXBlIHRvIHVzZSBmb3IgcGFkZGluZy4KKyAgICAgICAqICBAcGFyYW0gIHRtICBTdHJ1Y3QgdG0gd2l0aCBkYXRlIGFuZCB0aW1lIGluZm8gdG8gZm9ybWF0LgorICAgICAgICogIEBwYXJhbSAgZm9ybWF0ICBGb3JtYXQgY2hhci4KKyAgICAgICAqICBAcGFyYW0gIG1vZCAgT3B0aW9uYWwgbW9kaWZpZXIgY2hhci4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgICovCisgICAgICBpdGVyX3R5cGUKKyAgICAgIHB1dChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgIGNvbnN0IHRtKiBfX3RtLCBjaGFyIF9fZm9ybWF0LCBjaGFyIF9fbW9kID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW8sIF9fZmlsbCwgX190bSwgX19mb3JtYXQsIF9fbW9kKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIERlc3RydWN0b3IuCisgICAgICB2aXJ0dWFsCisgICAgICB+dGltZV9wdXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRm9ybWF0IGFuZCBvdXRwdXQgYSB0aW1lIG9yIGRhdGUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyB0aGUgZGF0YSBpbiBzdHJ1Y3QgdG0gYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIHByb3ZpZGVkIGZvcm1hdCBjaGFyIGFuZCBvcHRpb25hbCBtb2RpZmllci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rCisgICAgICAgKiAgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLiAgQHNlZSBwdXQoKSBmb3IKKyAgICAgICAqICBtb3JlIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgZmlsbCAgY2hhcl90eXBlIHRvIHVzZSBmb3IgcGFkZGluZy4KKyAgICAgICAqICBAcGFyYW0gIHRtICBTdHJ1Y3QgdG0gd2l0aCBkYXRlIGFuZCB0aW1lIGluZm8gdG8gZm9ybWF0LgorICAgICAgICogIEBwYXJhbSAgZm9ybWF0ICBGb3JtYXQgY2hhci4KKyAgICAgICAqICBAcGFyYW0gIG1vZCAgT3B0aW9uYWwgbW9kaWZpZXIgY2hhci4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLCBjb25zdCB0bSogX190bSwKKwkgICAgIGNoYXIgX19mb3JtYXQsIGNoYXIgX19tb2QpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBsb2NhbGU6OmlkIHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjppZDsKKworICAvLy8gY2xhc3MgdGltZV9wdXRfYnluYW1lIFsyMi4yLjUuNF0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgY2xhc3MgdGltZV9wdXRfYnluYW1lIDogcHVibGljIHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9PdXRJdGVyCQkJaXRlcl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgdGltZV9wdXRfYnluYW1lKGNvbnN0IGNoYXIqLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogdGltZV9wdXQ8X0NoYXJULCBfT3V0SXRlcj4oX19yZWZzKQorICAgICAgeyB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbAorICAgICAgfnRpbWVfcHV0X2J5bmFtZSgpIHsgfQorICAgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgTW9uZXkgZm9ybWF0IG9yZGVyaW5nIGRhdGEuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGNsYXNzIGNvbnRhaW5zIGFuIG9yZGVyZWQgYXJyYXkgb2YgNCBmaWVsZHMgdG8gcmVwcmVzZW50IHRoZQorICAgKiAgcGF0dGVybiBmb3IgZm9ybWF0dGluZyBhIG1vbmV5IGFtb3VudC4gIEVhY2ggZmllbGQgbWF5IGNvbnRhaW4gb25lIGVudHJ5CisgICAqICBmcm9tIHRoZSBwYXJ0IGVudW0uICBzeW1ib2wsIHNpZ24sIGFuZCB2YWx1ZSBtdXN0IGJlIHByZXNlbnQgYW5kIHRoZQorICAgKiAgcmVtYWluaW5nIGZpZWxkIG11c3QgY29udGFpbiBlaXRoZXIgbm9uZSBvciBzcGFjZS4gIEBzZWUKKyAgICogIG1vbmV5cHVuY3Q6OnBvc19mb3JtYXQoKSBhbmQgbW9uZXlwdW5jdDo6bmVnX2Zvcm1hdCgpIGZvciBkZXRhaWxzIG9mIGhvdworICAgKiAgdGhlc2UgZmllbGRzIGFyZSBpbnRlcnByZXRlZC4KKyAgKi8KKyAgY2xhc3MgbW9uZXlfYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBlbnVtIHBhcnQgeyBub25lLCBzcGFjZSwgc3ltYm9sLCBzaWduLCB2YWx1ZSB9OworICAgIHN0cnVjdCBwYXR0ZXJuIHsgY2hhciBmaWVsZFs0XTsgfTsKKworICAgIHN0YXRpYyBjb25zdCBwYXR0ZXJuIF9TX2RlZmF1bHRfcGF0dGVybjsKKworICAgIGVudW0KKyAgICB7CisgICAgICBfU19taW51cywKKyAgICAgIF9TX3plcm8sCisgICAgICBfU19lbmQgPSAxMQorICAgIH07CisKKyAgICAvLyBTdHJpbmcgbGl0ZXJhbCBvZiBhY2NlcHRhYmxlIChuYXJyb3cpIGlucHV0L291dHB1dCwgZm9yCisgICAgLy8gbW9uZXlfZ2V0L21vbmV5X3B1dC4gIi0wMTIzNDU2Nzg5IgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBfU19hdG9tczsKKworICAgIC8vIENvbnN0cnVjdCBhbmQgcmV0dXJuIHZhbGlkIHBhdHRlcm4gY29uc2lzdGluZyBvZiBzb21lIGNvbWJpbmF0aW9uIG9mOgorICAgIC8vIHNwYWNlIG5vbmUgc3ltYm9sIHNpZ24gdmFsdWUKKyAgICBfR0xJQkNYWF9DT05TVCBzdGF0aWMgcGF0dGVybgorICAgIF9TX2NvbnN0cnVjdF9wYXR0ZXJuKGNoYXIgX19wcmVjZWRlcywgY2hhciBfX3NwYWNlLCBjaGFyIF9fcG9zbikgdGhyb3cgKCk7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIHN0cnVjdCBfX21vbmV5cHVuY3RfY2FjaGUgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqCQkJX01fZ3JvdXBpbmc7CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fZ3JvdXBpbmdfc2l6ZTsKKyAgICAgIGJvb2wJCQkJX01fdXNlX2dyb3VwaW5nOworICAgICAgX0NoYXJUCQkJCV9NX2RlY2ltYWxfcG9pbnQ7CisgICAgICBfQ2hhclQJCQkJX01fdGhvdXNhbmRzX3NlcDsKKyAgICAgIGNvbnN0IF9DaGFyVCoJCQlfTV9jdXJyX3N5bWJvbDsKKyAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9jdXJyX3N5bWJvbF9zaXplOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX3Bvc2l0aXZlX3NpZ247CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fcG9zaXRpdmVfc2lnbl9zaXplOworICAgICAgY29uc3QgX0NoYXJUKgkJCV9NX25lZ2F0aXZlX3NpZ247CisgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbmVnYXRpdmVfc2lnbl9zaXplOworICAgICAgaW50CQkJCV9NX2ZyYWNfZGlnaXRzOworICAgICAgbW9uZXlfYmFzZTo6cGF0dGVybgkJX01fcG9zX2Zvcm1hdDsKKyAgICAgIG1vbmV5X2Jhc2U6OnBhdHRlcm4JICAgICAgICBfTV9uZWdfZm9ybWF0OworCisgICAgICAvLyBBIGxpc3Qgb2YgdmFsaWQgbnVtZXJpYyBsaXRlcmFscyBmb3IgaW5wdXQgYW5kIG91dHB1dDogaW4gdGhlIHN0YW5kYXJkCisgICAgICAvLyAiQyIgbG9jYWxlLCB0aGlzIGlzICItMDEyMzQ1Njc4OSIuIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGNoYXJzIGFmdGVyCisgICAgICAvLyBoYXZpbmcgYmVlbiBwYXNzZWQgdGhyb3VnaCB0aGUgY3VycmVudCBsb2NhbGUncyBjdHlwZTxfQ2hhclQ+LndpZGVuKCkuCisgICAgICBfQ2hhclQJCQkJX01fYXRvbXNbbW9uZXlfYmFzZTo6X1NfZW5kXTsKKworICAgICAgYm9vbAkJCQlfTV9hbGxvY2F0ZWQ7CisKKyAgICAgIF9fbW9uZXlwdW5jdF9jYWNoZShzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpLAorICAgICAgX01fZ3JvdXBpbmcoMCksIF9NX2dyb3VwaW5nX3NpemUoMCksIF9NX3VzZV9ncm91cGluZyhmYWxzZSksCisgICAgICBfTV9kZWNpbWFsX3BvaW50KF9DaGFyVCgpKSwgX01fdGhvdXNhbmRzX3NlcChfQ2hhclQoKSksCisgICAgICBfTV9jdXJyX3N5bWJvbCgwKSwgX01fY3Vycl9zeW1ib2xfc2l6ZSgwKSwKKyAgICAgIF9NX3Bvc2l0aXZlX3NpZ24oMCksIF9NX3Bvc2l0aXZlX3NpZ25fc2l6ZSgwKSwKKyAgICAgIF9NX25lZ2F0aXZlX3NpZ24oMCksIF9NX25lZ2F0aXZlX3NpZ25fc2l6ZSgwKSwKKyAgICAgIF9NX2ZyYWNfZGlnaXRzKDApLAorICAgICAgX01fcG9zX2Zvcm1hdChtb25leV9iYXNlOjpwYXR0ZXJuKCkpLAorICAgICAgX01fbmVnX2Zvcm1hdChtb25leV9iYXNlOjpwYXR0ZXJuKCkpLCBfTV9hbGxvY2F0ZWQoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgfl9fbW9uZXlwdW5jdF9jYWNoZSgpOworCisgICAgICB2b2lkCisgICAgICBfTV9jYWNoZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgIHByaXZhdGU6CisgICAgICBfX21vbmV5cHVuY3RfY2FjaGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19tb25leXB1bmN0X2NhY2hlJik7CisgICAgICAKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX21vbmV5cHVuY3RfY2FjaGUoY29uc3QgX19tb25leXB1bmN0X2NhY2hlJik7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+Ojp+X19tb25leXB1bmN0X2NhY2hlKCkKKyAgICB7CisgICAgICBpZiAoX01fYWxsb2NhdGVkKQorCXsKKwkgIGRlbGV0ZSBbXSBfTV9ncm91cGluZzsKKwkgIGRlbGV0ZSBbXSBfTV9jdXJyX3N5bWJvbDsKKwkgIGRlbGV0ZSBbXSBfTV9wb3NpdGl2ZV9zaWduOworCSAgZGVsZXRlIFtdIF9NX25lZ2F0aXZlX3NpZ247CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBtb25leXB1bmN0LgorICAgKiAgQGluZ3JvdXAgbG9jYWxlcworICAgKgorICAgKiAgVGhpcyBmYWNldCBlbmNhcHN1bGF0ZXMgdGhlIHB1bmN0dWF0aW9uLCBncm91cGluZyBhbmQgb3RoZXIgZm9ybWF0dGluZworICAgKiAgZmVhdHVyZXMgb2YgbW9uZXkgYW1vdW50IHN0cmluZyByZXByZXNlbnRhdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBjbGFzcyBtb25leXB1bmN0IDogcHVibGljIGxvY2FsZTo6ZmFjZXQsIHB1YmxpYyBtb25leV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworICAgICAgLy9AfQorICAgICAgdHlwZWRlZiBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD4gICAgIF9fY2FjaGVfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX2NhY2hlX3R5cGUqCQkJX01fZGF0YTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBUaGlzIHZhbHVlIGlzIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZCwgYnV0IG5vIHJlYXNvbiBmb3IgaXRzCisgICAgICAvLy8gZXhpc3RlbmNlLgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wJCQlpbnRsID0gX0ludGw7CisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5cHVuY3Qoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoMCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tb25leXB1bmN0KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtIGNhY2hlICBDYWNoZSBmb3Igb3B0aW1pemF0aW9uLgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5cHVuY3QoX19jYWNoZV90eXBlKiBfX2NhY2hlLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YShfX2NhY2hlKQorICAgICAgeyBfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEludGVybmFsIGNvbnN0cnVjdG9yLiBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSBjbG9jICBUaGUgQyBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtIHMgIFRoZSBuYW1lIG9mIGEgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5cHVuY3QoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoMCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fY2xvYywgX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBkZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY2hhcl90eXBlIHRvIHVzZSBhcyBhIGRlY2ltYWwgcG9pbnQuICBJdAorICAgICAgICogIGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fZGVjaW1hbF9wb2ludCgpLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBjaGFyX3R5cGUgcmVwcmVzZW50aW5nIGEgZGVjaW1hbCBwb2ludC4KKyAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIGRlY2ltYWxfcG9pbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZGVjaW1hbF9wb2ludCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHRob3VzYW5kcyBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBjaGFyX3R5cGUgdG8gdXNlIGFzIGEgdGhvdXNhbmRzCisgICAgICAgKiAgc2VwYXJhdG9yLiAgSXQgZG9lcyBzbyBieSByZXR1cm5pbmcgcmV0dXJuaW5nCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb190aG91c2FuZHNfc2VwKCkuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSB0aG91c2FuZHMgc2VwYXJhdG9yLgorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdGhvdXNhbmRzX3NlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb190aG91c2FuZHNfc2VwKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZ3MgZm9yIHRoZQorICAgICAgICogIGludGVnZXIgcGFydCBvZiBhbiBhbW91bnQuICBHcm91cGluZ3MgaW5kaWNhdGUgd2hlcmUgdGhvdXNhbmRzCisgICAgICAgKiAgc2VwYXJhdG9ycyBzaG91bGQgYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIEVhY2ggY2hhciBpbiB0aGUgcmV0dXJuIHN0cmluZyBpcyBpbnRlcnByZXQgYXMgYW4gaW50ZWdlciByYXRoZXIKKyAgICAgICAqICB0aGFuIGEgY2hhcmFjdGVyLiAgVGhlc2UgbnVtYmVycyByZXByZXNlbnQgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gYQorICAgICAgICogIGdyb3VwLiAgVGhlIGZpcnN0IGNoYXIgaW4gdGhlIHN0cmluZyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGlnaXRzCisgICAgICAgKiAgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGdyb3VwLiAgSWYgYSBjaGFyIGlzIG5lZ2F0aXZlLCBpdCBpbmRpY2F0ZXMKKyAgICAgICAqICBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGRpZ2l0cyBmb3IgdGhlIGdyb3VwLiAgSWYgbW9yZSBjaGFycyBmcm9tIHRoZQorICAgICAgICogIHN0cmluZyBhcmUgcmVxdWlyZWQgdG8gZ3JvdXAgYSBudW1iZXIsIHRoZSBsYXN0IGNoYXIgaXMgdXNlZAorICAgICAgICogIHJlcGVhdGVkbHkuCisgICAgICAgKgorICAgICAgICogIEZvciBleGFtcGxlLCBpZiB0aGUgZ3JvdXBpbmcoKSByZXR1cm5zIDxjb2RlPlwwMDNcMDAyPC9jb2RlPgorICAgICAgICogIGFuZCBpcyBhcHBsaWVkIHRvIHRoZSBudW1iZXIgMTIzNDU2Nzg5LCB0aGlzIGNvcnJlc3BvbmRzIHRvCisgICAgICAgKiAgMTIsMzQsNTYsNzg5LiAgTm90ZSB0aGF0IGlmIHRoZSBzdHJpbmcgd2FzIDxjb2RlPjMyPC9jb2RlPiwgdGhpcyB3b3VsZAorICAgICAgICogIHB1dCBtb3JlIHRoYW4gNTAgZGlnaXRzIGludG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGdyb3VwIGlmCisgICAgICAgKiAgdGhlIGNoYXJhY3RlciBzZXQgaXMgQVNDSUkuCisgICAgICAgKgorICAgICAgICogIFRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgYnkgY2FsbGluZworICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fZ3JvdXBpbmcoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgc3RyaW5nIHJlcHJlc2VudGluZyBncm91cGluZyBzcGVjaWZpY2F0aW9uLgorICAgICAgKi8KKyAgICAgIHN0cmluZworICAgICAgZ3JvdXBpbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZ3JvdXBpbmcoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBjdXJyZW5jeSBzeW1ib2wgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSB0byB1c2UgYXMgYSBjdXJyZW5jeSBzeW1ib2wuICBJdAorICAgICAgICogIGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fY3Vycl9zeW1ib2woKS4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIGEgY3VycmVuY3kgc3ltYm9sLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBjdXJyX3N5bWJvbCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19jdXJyX3N5bWJvbCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHBvc2l0aXZlIHNpZ24gc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmdfdHlwZSB0byB1c2UgYXMgYSBzaWduIGZvciBwb3NpdGl2ZQorICAgICAgICogIGFtb3VudHMuICBJdCBkb2VzIHNvIGJ5IHJldHVybmluZyByZXR1cm5pbmcKKyAgICAgICAqICBtb25leXB1bmN0PGNoYXJfdHlwZT46OmRvX3Bvc2l0aXZlX3NpZ24oKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHJldHVybiB2YWx1ZSBjb250YWlucyBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciwgdGhlIGZpcnN0CisgICAgICAgKiAgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHBvc2l0aW9uIGluZGljYXRlZCBieSBwb3NfZm9ybWF0KCkgYW5kIHRoZQorICAgICAgICogIHJlbWFpbmRlciBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZm9ybWF0dGVkIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIGEgcG9zaXRpdmUgc2lnbi4KKyAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgcG9zaXRpdmVfc2lnbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19wb3NpdGl2ZV9zaWduKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gbmVnYXRpdmUgc2lnbiBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIHRvIHVzZSBhcyBhIHNpZ24gZm9yIG5lZ2F0aXZlCisgICAgICAgKiAgYW1vdW50cy4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nIHJldHVybmluZworICAgICAgICogIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fbmVnYXRpdmVfc2lnbigpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLCB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IG5lZ19mb3JtYXQoKSBhbmQgdGhlCisgICAgICAgKiAgcmVtYWluZGVyIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgYSBuZWdhdGl2ZSBzaWduLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBuZWdhdGl2ZV9zaWduKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX25lZ2F0aXZlX3NpZ24oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBudW1iZXIgb2YgZGlnaXRzIGluIGZyYWN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGV4YWN0IG51bWJlciBvZiBkaWdpdHMgdGhhdCBtYWtlIHVwIHRoZQorICAgICAgICogIGZyYWN0aW9uYWwgcGFydCBvZiBhIG1vbmV5IGFtb3VudC4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgcmV0dXJuaW5nIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fZnJhY19kaWdpdHMoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhIG1vbmV5IGFtb3VudCBpcyBvcHRpb25hbC4gIEJ1dCBpZiBpdCBpcworICAgICAgICogIHByZXNlbnQsIHRoZXJlIG11c3QgYmUgZnJhY19kaWdpdHMoKSBkaWdpdHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBkaWdpdHMgaW4gYW1vdW50IGZyYWN0aW9uLgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgZnJhY19kaWdpdHMoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZG9fZnJhY19kaWdpdHMoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwYXR0ZXJuIGZvciBtb25leSB2YWx1ZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBhdHRlcm4gZGVzY3JpYmluZyB0aGUgZm9ybWF0dGluZyBvZiBhCisgICAgICAgKiAgcG9zaXRpdmUgb3IgbmVnYXRpdmUgdmFsdWVkIG1vbmV5IGFtb3VudC4gIEl0IGRvZXMgc28gYnkgcmV0dXJuaW5nCisgICAgICAgKiAgcmV0dXJuaW5nIG1vbmV5cHVuY3Q8Y2hhcl90eXBlPjo6ZG9fcG9zX2Zvcm1hdCgpIG9yCisgICAgICAgKiAgbW9uZXlwdW5jdDxjaGFyX3R5cGU+Ojpkb19uZWdfZm9ybWF0KCkuCisgICAgICAgKgorICAgICAgICogIFRoZSBwYXR0ZXJuIGhhcyA0IGZpZWxkcyBkZXNjcmliaW5nIHRoZSBvcmRlcmluZyBvZiBzeW1ib2wsIHNpZ24sCisgICAgICAgKiAgdmFsdWUsIGFuZCBub25lIG9yIHNwYWNlLiAgVGhlcmUgbXVzdCBiZSBvbmUgb2YgZWFjaCBpbiB0aGUgcGF0dGVybi4KKyAgICAgICAqICBUaGUgbm9uZSBhbmQgc3BhY2UgZW51bXMgbWF5IG5vdCBhcHBlYXIgaW4gdGhlIGZpcnN0IGZpZWxkIGFuZCBzcGFjZQorICAgICAgICogIG1heSBub3QgYXBwZWFyIGluIHRoZSBmaW5hbCBmaWVsZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHBhcnRzIG9mIGEgbW9uZXkgc3RyaW5nIG11c3QgYXBwZWFyIGluIHRoZSBvcmRlciBpbmRpY2F0ZWQgYnkKKyAgICAgICAqICB0aGUgZmllbGRzIG9mIHRoZSBwYXR0ZXJuLiAgVGhlIHN5bWJvbCBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICAgICAqICB2YWx1ZSBvZiBjdXJyX3N5bWJvbCgpIG1heSBiZSBwcmVzZW50LiAgVGhlIHNpZ24gZmllbGQgaW5kaWNhdGVzCisgICAgICAgKiAgdGhhdCB0aGUgdmFsdWUgb2YgcG9zaXRpdmVfc2lnbigpIG9yIG5lZ2F0aXZlX3NpZ24oKSBtdXN0IGJlCisgICAgICAgKiAgcHJlc2VudC4gIFRoZSB2YWx1ZSBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlCisgICAgICAgKiAgbW9uZXkgYW1vdW50IGlzIHByZXNlbnQuICBub25lIGluZGljYXRlcyAwIG9yIG1vcmUgd2hpdGVzcGFjZQorICAgICAgICogIGNoYXJhY3RlcnMsIGV4Y2VwdCBhdCB0aGUgZW5kLCB3aGVyZSBpdCBwZXJtaXRzIG5vIHdoaXRlc3BhY2UuCisgICAgICAgKiAgc3BhY2UgaW5kaWNhdGVzIHRoYXQgMSBvciBtb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBtdXN0IGJlCisgICAgICAgKiAgcHJlc2VudC4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIGZvciB0aGUgVVMgbG9jYWxlIGFuZCBwb3NfZm9ybWF0KCkgcGF0dGVybgorICAgICAgICogIHtzeW1ib2wsc2lnbix2YWx1ZSxub25lfSwgY3Vycl9zeW1ib2woKSA9PSAmYXBvczskJmFwb3M7CisgICAgICAgKiAgcG9zaXRpdmVfc2lnbigpID09ICZhcG9zOysmYXBvczssIGFuZCB2YWx1ZSAxMC4wMSwgYW5kCisgICAgICAgKiAgb3B0aW9ucyBzZXQgdG8gZm9yY2UgdGhlIHN5bWJvbCwgdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nIGlzCisgICAgICAgKiAgPGNvZGU+JCsxMC4wMTwvY29kZT4uCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIFBhdHRlcm4gZm9yIG1vbmV5IHZhbHVlcy4KKyAgICAgICovCisgICAgICBwYXR0ZXJuCisgICAgICBwb3NfZm9ybWF0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3Bvc19mb3JtYXQoKTsgfQorCisgICAgICBwYXR0ZXJuCisgICAgICBuZWdfZm9ybWF0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX25lZ19mb3JtYXQoKTsgfQorICAgICAgLy9AfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIERlc3RydWN0b3IuCisgICAgICB2aXJ0dWFsCisgICAgICB+bW9uZXlwdW5jdCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBkZWNpbWFsIHBvaW50IGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIGNoYXJfdHlwZSB0byB1c2UgYXMgYSBkZWNpbWFsIHBvaW50LiAgVGhpcyBmdW5jdGlvbiBpcyBhCisgICAgICAgKiAgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIGNoYXJfdHlwZSByZXByZXNlbnRpbmcgYSBkZWNpbWFsIHBvaW50LgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgY2hhcl90eXBlCisgICAgICBkb19kZWNpbWFsX3BvaW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2RlY2ltYWxfcG9pbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhvdXNhbmRzIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBjaGFyX3R5cGUgdG8gdXNlIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4gIFRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBjaGFyX3R5cGUgcmVwcmVzZW50aW5nIGEgdGhvdXNhbmRzIHNlcGFyYXRvci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNoYXJfdHlwZQorICAgICAgZG9fdGhvdXNhbmRzX3NlcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV90aG91c2FuZHNfc2VwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGdyb3VwaW5nIHNwZWNpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGdyb3VwaW5ncyBmb3IgdGhlIGludGVnZXIgcGFydCBvZiBhCisgICAgICAgKiAgbnVtYmVyLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdyb3VwaW5nKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIFN0cmluZyByZXByZXNlbnRpbmcgZ3JvdXBpbmcgc3BlY2lmaWNhdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZworICAgICAgZG9fZ3JvdXBpbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fZ3JvdXBpbmc7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY3VycmVuY3kgc3ltYm9sIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgdG8gdXNlIGFzIGEgY3VycmVuY3kgc3ltYm9sLgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICogIHJldHVybmVkLiAgQHNlZSBjdXJyX3N5bWJvbCgpIGZvciBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBAYSBzdHJpbmdfdHlwZSByZXByZXNlbnRpbmcgYSBjdXJyZW5jeSBzeW1ib2wuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fY3Vycl9zeW1ib2woKSAgIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9jdXJyX3N5bWJvbDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBwb3NpdGl2ZSBzaWduIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nX3R5cGUgdG8gdXNlIGFzIGEgc2lnbiBmb3IgcG9zaXRpdmUKKyAgICAgICAqICBhbW91bnRzLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIHBvc2l0aXZlX3NpZ24oKSBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgQGEgc3RyaW5nX3R5cGUgcmVwcmVzZW50aW5nIGEgcG9zaXRpdmUgc2lnbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmluZ190eXBlCisgICAgICBkb19wb3NpdGl2ZV9zaWduKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX3Bvc2l0aXZlX3NpZ247IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gbmVnYXRpdmUgc2lnbiBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZ190eXBlIHRvIHVzZSBhcyBhIHNpZ24gZm9yIG5lZ2F0aXZlCisgICAgICAgKiAgYW1vdW50cy4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZQorICAgICAgICogIHZhbHVlIHJldHVybmVkLiAgQHNlZSBuZWdhdGl2ZV9zaWduKCkgZm9yIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIEBhIHN0cmluZ190eXBlIHJlcHJlc2VudGluZyBhIG5lZ2F0aXZlIHNpZ24uCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fbmVnYXRpdmVfc2lnbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhLT5fTV9uZWdhdGl2ZV9zaWduOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIG51bWJlciBvZiBkaWdpdHMgaW4gZnJhY3Rpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXhhY3QgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IG1ha2UgdXAgdGhlCisgICAgICAgKiAgZnJhY3Rpb25hbCBwYXJ0IG9mIGEgbW9uZXkgYW1vdW50LiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yCisgICAgICAgKiAgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGZyYWNfZGlnaXRzKCkKKyAgICAgICAqICBmb3IgZGV0YWlscy4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGRpZ2l0cyBpbiBhbW91bnQgZnJhY3Rpb24uCisgICAgICAqLworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIGRvX2ZyYWNfZGlnaXRzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX2ZyYWNfZGlnaXRzOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHBhdHRlcm4gZm9yIG1vbmV5IHZhbHVlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcGF0dGVybiBkZXNjcmliaW5nIHRoZSBmb3JtYXR0aW5nIG9mIGEKKyAgICAgICAqICBwb3NpdGl2ZSB2YWx1ZWQgbW9uZXkgYW1vdW50LiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQKKyAgICAgICAqICBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUgcmV0dXJuZWQuICBAc2VlIHBvc19mb3JtYXQoKSBmb3IKKyAgICAgICAqICBkZXRhaWxzLgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuICBQYXR0ZXJuIGZvciBtb25leSB2YWx1ZXMuCisgICAgICAqLworICAgICAgdmlydHVhbCBwYXR0ZXJuCisgICAgICBkb19wb3NfZm9ybWF0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEtPl9NX3Bvc19mb3JtYXQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gcGF0dGVybiBmb3IgbW9uZXkgdmFsdWVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwYXR0ZXJuIGRlc2NyaWJpbmcgdGhlIGZvcm1hdHRpbmcgb2YgYQorICAgICAgICogIG5lZ2F0aXZlIHZhbHVlZCBtb25leSBhbW91bnQuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZAorICAgICAgICogIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgbmVnX2Zvcm1hdCgpIGZvcgorICAgICAgICogIGRldGFpbHMuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gIFBhdHRlcm4gZm9yIG1vbmV5IHZhbHVlcy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHBhdHRlcm4KKyAgICAgIGRvX25lZ19mb3JtYXQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGF0YS0+X01fbmVnX2Zvcm1hdDsgfQorCisgICAgICAvLyBGb3IgdXNlIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG9ubHkuCisgICAgICAgdm9pZAorICAgICAgIF9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlIF9fY2xvYyA9IDAsCisJCQkJY29uc3QgY2hhciogX19uYW1lID0gMCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgbG9jYWxlOjppZCBtb25leXB1bmN0PF9DaGFyVCwgX0ludGw+OjppZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIGJvb2wgX0ludGw+CisgICAgY29uc3QgYm9vbCBtb25leXB1bmN0PF9DaGFyVCwgX0ludGw+OjppbnRsOworCisgIHRlbXBsYXRlPD4KKyAgICBtb25leXB1bmN0PGNoYXIsIHRydWU+Ojp+bW9uZXlwdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6fm1vbmV5cHVuY3QoKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT46Ol9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlLCBjb25zdCBjaGFyKik7CisKKyAgdGVtcGxhdGU8PgorICAgIHZvaWQKKyAgICBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjo6X01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fY19sb2NhbGUsIGNvbnN0IGNoYXIqKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBtb25leXB1bmN0PHdjaGFyX3QsIHRydWU+Ojp+bW9uZXlwdW5jdCgpOworCisgIHRlbXBsYXRlPD4KKyAgICBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjo6fm1vbmV5cHVuY3QoKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT46Ol9NX2luaXRpYWxpemVfbW9uZXlwdW5jdChfX2NfbG9jYWxlLAorCQkJCQkJCWNvbnN0IGNoYXIqKTsKKworICB0ZW1wbGF0ZTw+CisgICAgdm9pZAorICAgIG1vbmV5cHVuY3Q8d2NoYXJfdCwgZmFsc2U+OjpfTV9pbml0aWFsaXplX21vbmV5cHVuY3QoX19jX2xvY2FsZSwKKwkJCQkJCQkgY29uc3QgY2hhciopOworI2VuZGlmCisKKyAgLy8vIGNsYXNzIG1vbmV5cHVuY3RfYnluYW1lIFsyMi4yLjYuNF0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBjbGFzcyBtb25leXB1bmN0X2J5bmFtZSA6IHB1YmxpYyBtb25leXB1bmN0PF9DaGFyVCwgX0ludGw+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJUPglzdHJpbmdfdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaW50bCA9IF9JbnRsOworCisgICAgICBleHBsaWNpdAorICAgICAgbW9uZXlwdW5jdF9ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzID0gMCkKKyAgICAgIDogbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPihfX3JlZnMpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAgJiYgX19idWlsdGluX3N0cmNtcChfX3MsICJQT1NJWCIpICE9IDApCisJICB7CisJICAgIF9fY19sb2NhbGUgX190bXA7CisJICAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZShfX3RtcCwgX19zKTsKKwkgICAgdGhpcy0+X01faW5pdGlhbGl6ZV9tb25leXB1bmN0KF9fdG1wKTsKKwkgICAgdGhpcy0+X1NfZGVzdHJveV9jX2xvY2FsZShfX3RtcCk7CisJICB9CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+bW9uZXlwdW5jdF9ieW5hbWUoKSB7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgYm9vbCBfSW50bD4KKyAgICBjb25zdCBib29sIG1vbmV5cHVuY3RfYnluYW1lPF9DaGFyVCwgX0ludGw+OjppbnRsOworCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfTERCTAorCisgIC8qKgorICAgKiAgQGJyaWVmICBQcmltYXJ5IGNsYXNzIHRlbXBsYXRlIG1vbmV5X2dldC4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBjb2RlIHRvIHBhcnNlIGFuZCByZXR1cm4gYSBtb25ldGFyeQorICAgKiAgYW1vdW50IGZyb20gYSBzdHJpbmcuCisgICAqCisgICAqICBUaGUgbW9uZXlfZ2V0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvCisgICAqICBwcm92aWRlIHRoZSBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlCisgICAqICBjYWxsIHRvIHRoZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZQorICAgKiAgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8gaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbQorICAgKiAgdGhlIG1vbmV5X2dldCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIGNsYXNzIG1vbmV5X2dldCA6IHB1YmxpYyBsb2NhbGU6OmZhY2V0CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9Jbkl0ZXIJCQlpdGVyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworICAgICAgLy9AfQorCisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5X2dldChzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlYWQgYW5kIHBhcnNlIGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgY2hhcmFjdGVycyBmcm9tIEBhIHMsIGludGVycHJldHMgdGhlbSBhcyBhCisgICAgICAgKiAgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQKKyAgICAgICAqICBmcm9tIGlvLmdldGxvYygpLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIEBhIHVuaXRzIGFzIGFuIGludGVncmFsCisgICAgICAgKiAgdmFsdWUgbW9uZXlwdW5jdDo6ZnJhY19kaWdpdHMoKSAqIHRoZSBhY3R1YWwgYW1vdW50LiAgRm9yIGV4YW1wbGUsCisgICAgICAgKiAgdGhlIHN0cmluZyAkMTAuMDEgaW4gYSBVUyBsb2NhbGUgd291bGQgc3RvcmUgMTAwMSBpbiBAYSB1bml0cy4KKyAgICAgICAqCisgICAgICAgKiAgQW55IGNoYXJhY3RlcnMgbm90IHBhcnQgb2YgYSB2YWxpZCBtb25leSBhbW91bnQgYXJlIG5vdCBjb25zdW1lZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYSBtb25leSB2YWx1ZSBjYW5ub3QgYmUgcGFyc2VkIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgc2V0cworICAgICAgICogIGVycj0oZXJyfGlvLmZhaWxiaXQpLiAgSWYgdGhlIHN0cmVhbSBpcyBjb25zdW1lZCBiZWZvcmUgZmluaXNoaW5nCisgICAgICAgKiAgcGFyc2luZywgIHNldHMgZXJyPShlcnJ8aW8uZmFpbGJpdHxpby5lb2ZiaXQpLiAgQGEgdW5pdHMgaXMKKyAgICAgICAqICB1bmNoYW5nZWQgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBkb19nZXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBTdGFydCBvZiBjaGFyYWN0ZXJzIHRvIHBhcnNlLgorICAgICAgICogIEBwYXJhbSAgZW5kICBFbmQgb2YgY2hhcmFjdGVycyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBmYWNldHMgYW5kIGlvIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgZXJyICBFcnJvciBmaWVsZCB0byBzZXQgaWYgcGFyc2luZyBmYWlscy4KKyAgICAgICAqICBAcGFyYW0gIHVuaXRzICBQbGFjZSB0byBzdG9yZSByZXN1bHQgb2YgcGFyc2luZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyBmaXJzdCBjaGFyYWN0ZXIgYmV5b25kIHZhbGlkIG1vbmV5CisgICAgICAgKgkgICBhbW91bnQuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX191bml0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX3MsIF9fZW5kLCBfX2ludGwsIF9faW8sIF9fZXJyLCBfX3VuaXRzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlYWQgYW5kIHBhcnNlIGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgY2hhcmFjdGVycyBmcm9tIEBhIHMsIGludGVycHJldHMgdGhlbSBhcworICAgICAgICogIGEgbW9uZXRhcnkgdmFsdWUgYWNjb3JkaW5nIHRvIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cworICAgICAgICogIHJldHJpZXZlZCBmcm9tIGlvLmdldGxvYygpLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGluIEBhCisgICAgICAgKiAgZGlnaXRzLiAgRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgJDEwLjAxIGluIGEgVVMgbG9jYWxlIHdvdWxkCisgICAgICAgKiAgc3RvcmUgPGNvZGU+MTAwMTwvY29kZT4gaW4gQGEgZGlnaXRzLgorICAgICAgICoKKyAgICAgICAqICBBbnkgY2hhcmFjdGVycyBub3QgcGFydCBvZiBhIHZhbGlkIG1vbmV5IGFtb3VudCBhcmUgbm90IGNvbnN1bWVkLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIG1vbmV5IHZhbHVlIGNhbm5vdCBiZSBwYXJzZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBzZXRzCisgICAgICAgKiAgZXJyPShlcnJ8aW8uZmFpbGJpdCkuICBJZiB0aGUgc3RyZWFtIGlzIGNvbnN1bWVkIGJlZm9yZSBmaW5pc2hpbmcKKyAgICAgICAqICBwYXJzaW5nLCAgc2V0cyBlcnI9KGVycnxpby5mYWlsYml0fGlvLmVvZmJpdCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd29ya3MgYnkgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgZG9fZ2V0KCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgU3RhcnQgb2YgY2hhcmFjdGVycyB0byBwYXJzZS4KKyAgICAgICAqICBAcGFyYW0gIGVuZCAgRW5kIG9mIGNoYXJhY3RlcnMgdG8gcGFyc2UuCisgICAgICAgKiAgQHBhcmFtICBpbnRsICBQYXJhbWV0ZXIgdG8gdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Q2hhclQsaW50bD4gPi4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgZmFjZXRzIGFuZCBpbyBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIGVyciAgRXJyb3IgZmllbGQgdG8gc2V0IGlmIHBhcnNpbmcgZmFpbHMuCisgICAgICAgKiAgQHBhcmFtICBkaWdpdHMgIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCBvZiBwYXJzaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGZpcnN0IGNoYXJhY3RlciBiZXlvbmQgdmFsaWQgbW9uZXkKKyAgICAgICAqCSAgIGFtb3VudC4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBnZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICBpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2dldChfX3MsIF9fZW5kLCBfX2ludGwsIF9faW8sIF9fZXJyLCBfX2RpZ2l0cyk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm1vbmV5X2dldCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlYWQgYW5kIHBhcnNlIGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgYW5kIHBhcnNlcyBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyBhIG1vbmV0YXJ5CisgICAgICAgKiAgdmFsdWUuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUKKyAgICAgICAqICB2YWx1ZSByZXR1cm5lZC4gIEBzZWUgZ2V0KCkgZm9yIGRldGFpbHMuCisgICAgICAgKi8KKyAgICAgIC8vIFhYWCBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgX19kb19nZXQoaXRlcl90eXBlIF9fcywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3VuaXRzKSBjb25zdDsKKyNlbHNlCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBsb25nIGRvdWJsZSYgX191bml0cykgY29uc3Q7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZWFkIGFuZCBwYXJzZSBhIG1vbmV0YXJ5IHZhbHVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGFuZCBwYXJzZXMgY2hhcmFjdGVycyByZXByZXNlbnRpbmcgYSBtb25ldGFyeQorICAgICAgICogIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiBpcyBhIGhvb2sgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBjaGFuZ2UgdGhlCisgICAgICAgKiAgdmFsdWUgcmV0dXJuZWQuICBAc2VlIGdldCgpIGZvciBkZXRhaWxzLgorICAgICAgICovCisgICAgICB2aXJ0dWFsIGl0ZXJfdHlwZQorICAgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0OworCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIGRvX2dldChpdGVyX3R5cGUgX19zLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdW5pdHMpIGNvbnN0OworI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGJvb2wgX0ludGw+CisgICAgICAgIGl0ZXJfdHlwZQorICAgICAgICBfTV9leHRyYWN0KGl0ZXJfdHlwZSBfX3MsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nJiBfX2RpZ2l0cykgY29uc3Q7ICAgICAKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBsb2NhbGU6OmlkIG1vbmV5X2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjppZDsKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBtb25leV9wdXQuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqCisgICAqICBUaGlzIGZhY2V0IGVuY2Fwc3VsYXRlcyB0aGUgY29kZSB0byBmb3JtYXQgYW5kIG91dHB1dCBhIG1vbmV0YXJ5CisgICAqICBhbW91bnQuCisgICAqCisgICAqICBUaGUgbW9uZXlfcHV0IHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvCisgICAqICBwcm92aWRlIHRoZSBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlCisgICAqICBjYWxsIHRvIHRoZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZQorICAgKiAgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8gaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbQorICAgKiAgdGhlIG1vbmV5X3B1dCBmYWNldC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBjbGFzcyBtb25leV9wdXQgOiBwdWJsaWMgbG9jYWxlOjpmYWNldAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX091dEl0ZXIJCQlpdGVyX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQ+CXN0cmluZ190eXBlOworICAgICAgLy9AfQorCisgICAgICAvLy8gTnVtcHVuY3QgZmFjZXQgaWQuCisgICAgICBzdGF0aWMgbG9jYWxlOjppZAkJCWlkOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSByZWZzICBQYXNzZWQgdG8gdGhlIGJhc2UgZmFjZXQgY2xhc3MuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG1vbmV5X3B1dChzaXplX3QgX19yZWZzID0gMCkgOiBmYWNldChfX3JlZnMpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSB1bml0cyBhcyBhIG1vbmV0YXJ5IHZhbHVlIGFjY29yZGluZyB0bworICAgICAgICogIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQgZnJvbSBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcworICAgICAgICogIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVycyB0byBAYSBzLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAxMDAxIGluIGEKKyAgICAgICAqICBVUyBsb2NhbGUgd291bGQgd3JpdGUgPGNvZGU+JDEwLjAxPC9jb2RlPiB0byBAYSBzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGJ5IHJldHVybmluZyB0aGUgcmVzdWx0IG9mIGRvX3B1dCgpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHMgIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICAgKiAgQHBhcmFtICBpbnRsICBQYXJhbWV0ZXIgdG8gdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Q2hhclQsaW50bD4gPi4KKyAgICAgICAqICBAcGFyYW0gIGlvICBTb3VyY2Ugb2YgZmFjZXRzIGFuZCBpbyBzdGF0ZS4KKyAgICAgICAqICBAcGFyYW0gIGZpbGwgIGNoYXJfdHlwZSB0byB1c2UgZm9yIHBhZGRpbmcuCisgICAgICAgKiAgQHBhcmFtICB1bml0cyAgUGxhY2UgdG8gc3RvcmUgcmVzdWx0IG9mIHBhcnNpbmcuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgYWZ0ZXIgd3JpdGluZy4KKyAgICAgICAqLworICAgICAgaXRlcl90eXBlCisgICAgICBwdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgY2hhcl90eXBlIF9fZmlsbCwgbG9uZyBkb3VibGUgX191bml0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW50bCwgX19pbywgX19maWxsLCBfX3VuaXRzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSBkaWdpdHMgYXMgYSBtb25ldGFyeSB2YWx1ZQorICAgICAgICogIGFjY29yZGluZyB0byBtb25leXB1bmN0IGFuZCBjdHlwZSBmYWNldHMgcmV0cmlldmVkIGZyb20KKyAgICAgICAqICBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcnMgdG8gQGEgcy4KKyAgICAgICAqICBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyA8Y29kZT4xMDAxPC9jb2RlPiBpbiBhIFVTIGxvY2FsZQorICAgICAgICogIHdvdWxkIHdyaXRlIDxjb2RlPiQxMC4wMTwvY29kZT4gdG8gQGEgcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3b3JrcyBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBvZiBkb19wdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgaW50bCAgUGFyYW1ldGVyIHRvIHVzZV9mYWNldDxtb25leXB1bmN0PENoYXJULGludGw+ID4uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBmaWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgdW5pdHMgIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCBvZiBwYXJzaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIGl0ZXJfdHlwZQorICAgICAgcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHN0cmluZ190eXBlJiBfX2RpZ2l0cykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW50bCwgX19pbywgX19maWxsLCBfX2RpZ2l0cyk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm1vbmV5X3B1dCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZvcm1hdCBhbmQgb3V0cHV0IGEgbW9uZXRhcnkgdmFsdWUuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZm9ybWF0cyBAYSB1bml0cyBhcyBhIG1vbmV0YXJ5IHZhbHVlIGFjY29yZGluZyB0bworICAgICAgICogIG1vbmV5cHVuY3QgYW5kIGN0eXBlIGZhY2V0cyByZXRyaWV2ZWQgZnJvbSBpby5nZXRsb2MoKSwgYW5kIHdyaXRlcworICAgICAgICogIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVycyB0byBAYSBzLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAxMDAxIGluIGEKKyAgICAgICAqICBVUyBsb2NhbGUgd291bGQgd3JpdGUgPGNvZGU+JDEwLjAxPC9jb2RlPiB0byBAYSBzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZCBjbGFzc2VzIHRvIGNoYW5nZSB0aGUgdmFsdWUKKyAgICAgICAqICByZXR1cm5lZC4gIEBzZWUgcHV0KCkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgICAqICBAcGFyYW0gIGludGwgIFBhcmFtZXRlciB0byB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxDaGFyVCxpbnRsPiA+LgorICAgICAgICogIEBwYXJhbSAgaW8gIFNvdXJjZSBvZiBmYWNldHMgYW5kIGlvIHN0YXRlLgorICAgICAgICogIEBwYXJhbSAgZmlsbCAgY2hhcl90eXBlIHRvIHVzZSBmb3IgcGFkZGluZy4KKyAgICAgICAqICBAcGFyYW0gIHVuaXRzICBQbGFjZSB0byBzdG9yZSByZXN1bHQgb2YgcGFyc2luZy4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciBhZnRlciB3cml0aW5nLgorICAgICAgICovCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworICAgICAgdmlydHVhbCBpdGVyX3R5cGUKKyAgICAgIF9fZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgICAgZG91YmxlIF9fdW5pdHMpIGNvbnN0OworI2Vsc2UKKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgbG9uZyBkb3VibGUgX191bml0cykgY29uc3Q7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGb3JtYXQgYW5kIG91dHB1dCBhIG1vbmV0YXJ5IHZhbHVlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZvcm1hdHMgQGEgZGlnaXRzIGFzIGEgbW9uZXRhcnkgdmFsdWUKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gbW9uZXlwdW5jdCBhbmQgY3R5cGUgZmFjZXRzIHJldHJpZXZlZCBmcm9tCisgICAgICAgKiAgaW8uZ2V0bG9jKCksIGFuZCB3cml0ZXMgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXJzIHRvIEBhIHMuCisgICAgICAgKiAgRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgPGNvZGU+MTAwMTwvY29kZT4gaW4gYSBVUyBsb2NhbGUKKyAgICAgICAqICB3b3VsZCB3cml0ZSA8Y29kZT4kMTAuMDE8L2NvZGU+IHRvIEBhIHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZQorICAgICAgICogIHJldHVybmVkLiAgQHNlZSBwdXQoKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgaW50bCAgUGFyYW1ldGVyIHRvIHVzZV9mYWNldDxtb25leXB1bmN0PENoYXJULGludGw+ID4uCisgICAgICAgKiAgQHBhcmFtICBpbyAgU291cmNlIG9mIGZhY2V0cyBhbmQgaW8gc3RhdGUuCisgICAgICAgKiAgQHBhcmFtICBmaWxsICBjaGFyX3R5cGUgdG8gdXNlIGZvciBwYWRkaW5nLgorICAgICAgICogIEBwYXJhbSAgdW5pdHMgIFBsYWNlIHRvIHN0b3JlIHJlc3VsdCBvZiBwYXJzaW5nLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIGFmdGVyIHdyaXRpbmcuCisgICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgY29uc3Qgc3RyaW5nX3R5cGUmIF9fZGlnaXRzKSBjb25zdDsKKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgICAgIHZpcnR1YWwgaXRlcl90eXBlCisgICAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgICAgbG9uZyBkb3VibGUgX191bml0cykgY29uc3Q7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8Ym9vbCBfSW50bD4KKyAgICAgICAgaXRlcl90eXBlCisgICAgICAgIF9NX2luc2VydChpdGVyX3R5cGUgX19zLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkJICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBsb2NhbGU6OmlkIG1vbmV5X3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6aWQ7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorCisgIC8qKgorICAgKiAgQGJyaWVmICBNZXNzYWdlcyBmYWNldCBiYXNlIGNsYXNzIHByb3ZpZGluZyBjYXRhbG9nIHR5cGVkZWYuCisgICAqICBAaW5ncm91cCBsb2NhbGVzCisgICAqLworICBzdHJ1Y3QgbWVzc2FnZXNfYmFzZQorICB7CisgICAgdHlwZWRlZiBpbnQgY2F0YWxvZzsKKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBtZXNzYWdlcy4KKyAgICogIEBpbmdyb3VwIGxvY2FsZXMKKyAgICoKKyAgICogIFRoaXMgZmFjZXQgZW5jYXBzdWxhdGVzIHRoZSBjb2RlIHRvIHJldHJpZXZlIG1lc3NhZ2VzIGZyb20KKyAgICogIG1lc3NhZ2UgY2F0YWxvZ3MuICBUaGUgb25seSB0aGluZyBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZCBmb3IgdGhpcyBmYWNldAorICAgKiAgaXMgdGhlIGludGVyZmFjZS4gIEFsbCB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHkgaXMKKyAgICogIGltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgICAqCisgICAqICBUaGlzIGxpYnJhcnkgY3VycmVudGx5IGltcGxlbWVudHMgMyB2ZXJzaW9ucyBvZiB0aGUgbWVzc2FnZSBmYWNldC4gIFRoZQorICAgKiAgZmlyc3QgdmVyc2lvbiAoZ251KSBpcyBhIHdyYXBwZXIgYXJvdW5kIGdldHRleHQsIHByb3ZpZGVkIGJ5IGxpYmludGwuCisgICAqICBUaGUgc2Vjb25kIHZlcnNpb24gKGllZWUpIGlzIGEgd3JhcHBlciBhcm91bmQgY2F0Z2V0cy4gIFRoZSBmaW5hbAorICAgKiAgdmVyc2lvbiAoZGVmYXVsdCkgZG9lcyBubyBhY3R1YWwgdHJhbnNsYXRpb24uICBUaGVzZSBpbXBsZW1lbnRhdGlvbnMgYXJlCisgICAqICBvbmx5IHByb3ZpZGVkIGZvciBjaGFyIGFuZCB3Y2hhcl90IGluc3RhbnRpYXRpb25zLgorICAgKgorICAgKiAgVGhlIG1lc3NhZ2VzIHRlbXBsYXRlIHVzZXMgcHJvdGVjdGVkIHZpcnR1YWwgZnVuY3Rpb25zIHRvCisgICAqICBwcm92aWRlIHRoZSBhY3R1YWwgcmVzdWx0cy4gIFRoZSBwdWJsaWMgYWNjZXNzb3JzIGZvcndhcmQgdGhlCisgICAqICBjYWxsIHRvIHRoZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gIFRoZXNlIHZpcnR1YWwgZnVuY3Rpb25zIGFyZQorICAgKiAgaG9va3MgZm9yIGRldmVsb3BlcnMgdG8gaW1wbGVtZW50IHRoZSBiZWhhdmlvciB0aGV5IHJlcXVpcmUgZnJvbQorICAgKiAgdGhlIG1lc3NhZ2VzIGZhY2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgbWVzc2FnZXMgOiBwdWJsaWMgbG9jYWxlOjpmYWNldCwgcHVibGljIG1lc3NhZ2VzX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICAvL0B7CisgICAgICAvLy8gUHVibGljIHR5cGVkZWZzCisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBVbmRlcmx5aW5nICJDIiBsaWJyYXJ5IGxvY2FsZSBpbmZvcm1hdGlvbiBzYXZlZCBmcm9tCisgICAgICAvLyBpbml0aWFsaXphdGlvbiwgbmVlZGVkIGJ5IG1lc3NhZ2VzX2J5bmFtZSBhcyB3ZWxsLgorICAgICAgX19jX2xvY2FsZQkJCV9NX2NfbG9jYWxlX21lc3NhZ2VzOworICAgICAgY29uc3QgY2hhcioJCQlfTV9uYW1lX21lc3NhZ2VzOworCisgICAgcHVibGljOgorICAgICAgLy8vIE51bXB1bmN0IGZhY2V0IGlkLgorICAgICAgc3RhdGljIGxvY2FsZTo6aWQJCQlpZDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RvciBwZXJmb3JtcyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gcmVmcyAgUGFzc2VkIHRvIHRoZSBiYXNlIGZhY2V0IGNsYXNzLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtZXNzYWdlcyhzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICAgIC8vIE5vbi1zdGFuZGFyZC4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJuYWwgY29uc3RydWN0b3IuICBOb3QgZm9yIGdlbmVyYWwgdXNlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgY29uc3RydWN0b3IgZm9yIHVzZSBieSB0aGUgbGlicmFyeSBpdHNlbGYgdG8gc2V0IHVwIG5ldworICAgICAgICogIGxvY2FsZXMuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgY2xvYyAgVGhlIEMgbG9jYWxlLgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIG5hbWUgb2YgYSBsb2NhbGUuCisgICAgICAgKiAgQHBhcmFtICByZWZzICBSZWZjb3VudCB0byBwYXNzIHRvIHRoZSBiYXNlIGNsYXNzLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbWVzc2FnZXMoX19jX2xvY2FsZSBfX2Nsb2MsIGNvbnN0IGNoYXIqIF9fcywgc2l6ZV90IF9fcmVmcyA9IDApOworCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgT3BlbiBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvcGVucyBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byBhIG1lc3NhZ2UgY2F0YWxvZyBieQorICAgICAgICogIHJldHVybmluZyBkb19vcGVuKHMsIGxvYykuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIGNhdGFsb2cgdG8gb3Blbi4KKyAgICAgICAqICBAcGFyYW0gIGxvYyAgTG9jYWxlIHRvIHVzZSBmb3IgY2hhcmFjdGVyIHNldCBjb252ZXJzaW9ucy4KKyAgICAgICAqICBAcmV0dXJuICBIYW5kbGUgdG8gdGhlIGNhdGFsb2cgb3IgdmFsdWUgPCAwIGlmIG9wZW4gZmFpbHMuCisgICAgICAqLworICAgICAgY2F0YWxvZworICAgICAgb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fcywgY29uc3QgbG9jYWxlJiBfX2xvYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX29wZW4oX19zLCBfX2xvYyk7IH0KKworICAgICAgLy8gTm9uLXN0YW5kYXJkIGFuZCB1bm9ydGhvZG94LCB5ZXQgZWZmZWN0aXZlLgorICAgICAgLyoKKyAgICAgICAqICBAYnJpZWYgIE9wZW4gYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIFRoaXMgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIG9wZW5zIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEgbWVzc2FnZQorICAgICAgICogIGNhdGFsb2cgYnkgcmV0dXJuaW5nIGRvX29wZW4ocywgbG9jKS4gIFRoZSB0aGlyZCBhcmd1bWVudCBwcm92aWRlcyBhCisgICAgICAgKiAgbWVzc2FnZSBjYXRhbG9nIHJvb3QgZGlyZWN0b3J5IGZvciBnbnUgZ2V0dGV4dCBhbmQgaXMgaWdub3JlZAorICAgICAgICogIG90aGVyd2lzZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgY2F0YWxvZyB0byBvcGVuLgorICAgICAgICogIEBwYXJhbSAgbG9jICBMb2NhbGUgdG8gdXNlIGZvciBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb25zLgorICAgICAgICogIEBwYXJhbSAgZGlyICBNZXNzYWdlIGNhdGFsb2cgcm9vdCBkaXJlY3RvcnkuCisgICAgICAgKiAgQHJldHVybiAgSGFuZGxlIHRvIHRoZSBjYXRhbG9nIG9yIHZhbHVlIDwgMCBpZiBvcGVuIGZhaWxzLgorICAgICAgKi8KKyAgICAgIGNhdGFsb2cKKyAgICAgIG9wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiwgY29uc3QgbG9jYWxlJiwgY29uc3QgY2hhciopIGNvbnN0OworCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgTG9vayB1cCBhIHN0cmluZyBpbiBhIG1lc3NhZ2UgY2F0YWxvZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYW5kIHJldHVybnMgYSBtZXNzYWdlIGZyb20gYSBjYXRhbG9nIGJ5CisgICAgICAgKiAgcmV0dXJuaW5nIGRvX2dldChjLCBzZXQsIG1zZ2lkLCBzKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGdudSwgQGEgc2V0IGFuZCBAYSBtc2dpZCBhcmUgaWdub3JlZC4gIFJldHVybnMgZ2V0dGV4dChzKS4KKyAgICAgICAqICBGb3IgZGVmYXVsdCwgcmV0dXJucyBzLiBGb3IgaWVlZSwgcmV0dXJucyBjYXRnZXRzKGMsc2V0LG1zZ2lkLHMpLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGMgIFRoZSBjYXRhbG9nIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcGFyYW0gIHNldCAgSW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICAgICAqICBAcGFyYW0gIG1zZ2lkICBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgICAgICogIEBwYXJhbSAgcyAgRGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgcmV0cmlldmFsIGZhaWxzLgorICAgICAgICogIEByZXR1cm4gIFJldHJpZXZlZCBtZXNzYWdlIG9yIEBhIHMgaWYgZ2V0IGZhaWxzLgorICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBnZXQoY2F0YWxvZyBfX2MsIGludCBfX3NldCwgaW50IF9fbXNnaWQsIGNvbnN0IHN0cmluZ190eXBlJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5kb19nZXQoX19jLCBfX3NldCwgX19tc2dpZCwgX19zKTsgfQorCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgQ2xvc2UgYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIENsb3NlcyBjYXRhbG9nIEBhIGMgYnkgY2FsbGluZyBkb19jbG9zZShjKS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBjICBUaGUgY2F0YWxvZyB0byBjbG9zZS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbG9zZShjYXRhbG9nIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRvX2Nsb3NlKF9fYyk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vLyBEZXN0cnVjdG9yLgorICAgICAgdmlydHVhbAorICAgICAgfm1lc3NhZ2VzKCk7CisKKyAgICAgIC8qCisgICAgICAgKiAgQGJyaWVmICBPcGVuIGEgbWVzc2FnZSBjYXRhbG9nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIG9wZW5zIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGEgbWVzc2FnZSBjYXRhbG9nIGluIGFuCisgICAgICAgKiAgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBtYW5uZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayBmb3IgZGVyaXZlZAorICAgICAgICogIGNsYXNzZXMgdG8gY2hhbmdlIHRoZSB2YWx1ZSByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgY2F0YWxvZyB0byBvcGVuLgorICAgICAgICogIEBwYXJhbSAgbG9jICBMb2NhbGUgdG8gdXNlIGZvciBjaGFyYWN0ZXIgc2V0IGNvbnZlcnNpb25zLgorICAgICAgICogIEByZXR1cm4gIEhhbmRsZSB0byB0aGUgb3BlbmVkIGNhdGFsb2csIHZhbHVlIDwgMCBpZiBvcGVuIGZhaWxlZC4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGNhdGFsb2cKKyAgICAgIGRvX29wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiwgY29uc3QgbG9jYWxlJikgY29uc3Q7CisKKyAgICAgIC8qCisgICAgICAgKiAgQGJyaWVmICBMb29rIHVwIGEgc3RyaW5nIGluIGEgbWVzc2FnZSBjYXRhbG9nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhbmQgcmV0dXJucyBhIG1lc3NhZ2UgZnJvbSBhIGNhdGFsb2cgaW4gYW4KKyAgICAgICAqICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG1hbm5lci4gIFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIGZvciBkZXJpdmVkCisgICAgICAgKiAgY2xhc3NlcyB0byBjaGFuZ2UgdGhlIHZhbHVlIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZ251LCBAYSBzZXQgYW5kIEBhIG1zZ2lkIGFyZSBpZ25vcmVkLiAgUmV0dXJucyBnZXR0ZXh0KHMpLgorICAgICAgICogIEZvciBkZWZhdWx0LCByZXR1cm5zIHMuIEZvciBpZWVlLCByZXR1cm5zIGNhdGdldHMoYyxzZXQsbXNnaWQscykuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgYyAgVGhlIGNhdGFsb2cgdG8gYWNjZXNzLgorICAgICAgICogIEBwYXJhbSAgc2V0ICBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkLgorICAgICAgICogIEBwYXJhbSAgbXNnaWQgIEltcGxlbWVudGF0aW9uLWRlZmluZWQuCisgICAgICAgKiAgQHBhcmFtICBzICBEZWZhdWx0IHJldHVybiB2YWx1ZSBpZiByZXRyaWV2YWwgZmFpbHMuCisgICAgICAgKiAgQHJldHVybiAgUmV0cmlldmVkIG1lc3NhZ2Ugb3IgQGEgcyBpZiBnZXQgZmFpbHMuCisgICAgICAqLworICAgICAgdmlydHVhbCBzdHJpbmdfdHlwZQorICAgICAgZG9fZ2V0KGNhdGFsb2csIGludCwgaW50LCBjb25zdCBzdHJpbmdfdHlwZSYgX19kZmF1bHQpIGNvbnN0OworCisgICAgICAvKgorICAgICAgICogIEBicmllZiAgQ2xvc2UgYSBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgYyAgVGhlIGNhdGFsb2cgdG8gY2xvc2UuCisgICAgICAqLworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBkb19jbG9zZShjYXRhbG9nKSBjb25zdDsKKworICAgICAgLy8gUmV0dXJucyBhIGxvY2FsZSBhbmQgY29kZXNldC1jb252ZXJ0ZWQgc3RyaW5nLCBnaXZlbiBhIGNoYXIqIG1lc3NhZ2UuCisgICAgICBjaGFyKgorICAgICAgX01fY29udmVydF90b19jaGFyKGNvbnN0IHN0cmluZ190eXBlJiBfX21zZykgY29uc3QKKyAgICAgIHsKKwkvLyBYWFgKKwlyZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oY29uc3RfY2FzdDxfQ2hhclQqPihfX21zZy5jX3N0cigpKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHVybnMgYSBsb2NhbGUgYW5kIGNvZGVzZXQtY29udmVydGVkIHN0cmluZywgZ2l2ZW4gYSBjaGFyKiBtZXNzYWdlLgorICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIF9NX2NvbnZlcnRfZnJvbV9jaGFyKGNoYXIqKSBjb25zdAorICAgICAgeworI2lmIDAKKwkvLyBMZW5ndGggb2YgbWVzc2FnZSBzdHJpbmcgd2l0aG91dCB0ZXJtaW5hdGluZyBudWxsLgorCXNpemVfdCBfX2xlbiA9IGNoYXJfdHJhaXRzPGNoYXI+OjpsZW5ndGgoX19tc2cpIC0gMTsKKworCS8vICJldmVyeWJvZHkgY2FuIGVhc2lseSBjb252ZXJ0IHRoZSBzdHJpbmcgdXNpbmcKKwkvLyBtYnNydG93Y3Mvd2NzcnRvbWJzIG9yIHdpdGggaWNvbnYoKSIKKworCS8vIENvbnZlcnQgY2hhciogdG8gX0NoYXJUIGluIGxvY2FsZSB1c2VkIHRvIG9wZW4gY2F0YWxvZy4KKwkvLyBYWFggbmVlZCBhZGRpdGlvbmFsIHRlbXBsYXRlIHBhcmFtZXRlciBvbiBtZXNzYWdlcyBjbGFzcyBmb3IgdGhpcy4uCisJLy8gdHlwZWRlZiB0eXBlbmFtZSBjb2RlY3Z0PGNoYXIsIF9DaGFyVCwgX1N0YXRlVD4gX19jb2RlY3Z0X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBjb2RlY3Z0PGNoYXIsIF9DaGFyVCwgbWJzdGF0ZV90PiBfX2NvZGVjdnRfdHlwZTsKKworCV9fY29kZWN2dF90eXBlOjpzdGF0ZV90eXBlIF9fc3RhdGU7CisJLy8gWFhYIG1heSBuZWVkIHRvIGluaXRpYWxpemUgc3RhdGUuCisJLy9pbml0aWFsaXplX3N0YXRlKF9fc3RhdGUuX01faW5pdCgpKTsKKworCWNoYXIqIF9fZnJvbV9uZXh0OworCS8vIFhYWCB3aGF0IHNpemUgZm9yIHRoaXMgc3RyaW5nPworCV9DaGFyVCogX190byA9IHN0YXRpY19jYXN0PF9DaGFyVCo+KF9fYnVpbHRpbl9hbGxvY2EoX19sZW4gKyAxKSk7CisJY29uc3QgX19jb2RlY3Z0X3R5cGUmIF9fY3Z0ID0gdXNlX2ZhY2V0PF9fY29kZWN2dF90eXBlPihfTV9sb2NhbGVfY29udik7CisJX19jdnQub3V0KF9fc3RhdGUsIF9fbXNnLCBfX21zZyArIF9fbGVuLCBfX2Zyb21fbmV4dCwKKwkJICBfX3RvLCBfX3RvICsgX19sZW4gKyAxLCBfX3RvX25leHQpOworCXJldHVybiBzdHJpbmdfdHlwZShfX3RvKTsKKyNlbmRpZgorI2lmIDAKKwl0eXBlZGVmIGN0eXBlPF9DaGFyVD4gX19jdHlwZV90eXBlOworCS8vIGNvbnN0IF9fY3R5cGVfdHlwZSYgX19jdnQgPSB1c2VfZmFjZXQ8X19jdHlwZV90eXBlPihfTV9sb2NhbGVfbXNnKTsKKwljb25zdCBfX2N0eXBlX3R5cGUmIF9fY3Z0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4obG9jYWxlKCkpOworCS8vIFhYWCBBZ2FpbiwgcHJvcGVyIGxlbmd0aCBvZiBjb252ZXJ0ZWQgc3RyaW5nIGFuIGlzc3VlIGhlcmUuCisJLy8gRm9yIG5vdywgYXNzdW1lIHRoZSBjb252ZXJ0ZWQgbGVuZ3RoIGlzIG5vdCBsYXJnZXIuCisJX0NoYXJUKiBfX2Rlc3QgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKF9fbGVuICsgMSkpOworCV9fY3Z0LndpZGVuKF9fbXNnLCBfX21zZyArIF9fbGVuLCBfX2Rlc3QpOworCXJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJUPihfX2Rlc3QpOworI2VuZGlmCisJcmV0dXJuIHN0cmluZ190eXBlKCk7CisgICAgICB9CisgICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGxvY2FsZTo6aWQgbWVzc2FnZXM8X0NoYXJUPjo6aWQ7CisKKyAgLy8vIFNwZWNpYWxpemF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJpbmcKKyAgICBtZXNzYWdlczxjaGFyPjo6ZG9fZ2V0KGNhdGFsb2csIGludCwgaW50LCBjb25zdCBzdHJpbmcmKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICB3c3RyaW5nCisgICAgbWVzc2FnZXM8d2NoYXJfdD46OmRvX2dldChjYXRhbG9nLCBpbnQsIGludCwgY29uc3Qgd3N0cmluZyYpIGNvbnN0OworI2VuZGlmCisKKyAgIC8vLyBjbGFzcyBtZXNzYWdlc19ieW5hbWUgWzIyLjIuNy4yXS4KKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBtZXNzYWdlc19ieW5hbWUgOiBwdWJsaWMgbWVzc2FnZXM8X0NoYXJUPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaGFyVAkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPF9DaGFyVD4Jc3RyaW5nX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBtZXNzYWdlc19ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzID0gMCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2aXJ0dWFsCisgICAgICB+bWVzc2FnZXNfYnluYW1lKCkKKyAgICAgIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworLy8gSW5jbHVkZSBob3N0IGFuZCBjb25maWd1cmF0aW9uIHNwZWNpZmljIG1lc3NhZ2VzIGZ1bmN0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL21lc3NhZ2VzX21lbWJlcnMuaD4KKworLy8gMjIuMi4xLjUgIFRlbXBsYXRlIGNsYXNzIGNvZGVjdnQKKyNpbmNsdWRlIDxiaXRzL2NvZGVjdnQuaD4KKworI2luY2x1ZGUgPGJpdHMvbG9jYWxlX2ZhY2V0c19ub25pby50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8udGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjcwMDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlX2ZhY2V0c19ub25pby50Y2MKQEAgLTAsMCArMSwxMzczIEBACisvLyBMb2NhbGUgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvbG9jYWxlX2ZhY2V0c19ub25pby50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworI2lmbmRlZiBfTE9DQUxFX0ZBQ0VUU19OT05JT19UQ0MKKyNkZWZpbmUgX0xPQ0FMRV9GQUNFVFNfTk9OSU9fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIHN0cnVjdCBfX3VzZV9jYWNoZTxfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD4gPgorICAgIHsKKyAgICAgIGNvbnN0IF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPioKKyAgICAgIG9wZXJhdG9yKCkgKGNvbnN0IGxvY2FsZSYgX19sb2MpIGNvbnN0CisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9faSA9IG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD46OmlkLl9NX2lkKCk7CisJY29uc3QgbG9jYWxlOjpmYWNldCoqIF9fY2FjaGVzID0gX19sb2MuX01faW1wbC0+X01fY2FjaGVzOworCWlmICghX19jYWNoZXNbX19pXSkKKwkgIHsKKwkgICAgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+KiBfX3RtcCA9IDA7CisJICAgIF9fdHJ5CisJICAgICAgeworCQlfX3RtcCA9IG5ldyBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD47CisJCV9fdG1wLT5fTV9jYWNoZShfX2xvYyk7CisJICAgICAgfQorCSAgICBfX2NhdGNoKC4uLikKKwkgICAgICB7CisJCWRlbGV0ZSBfX3RtcDsKKwkJX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgICAgfQorCSAgICBfX2xvYy5fTV9pbXBsLT5fTV9pbnN0YWxsX2NhY2hlKF9fdG1wLCBfX2kpOworCSAgfQorCXJldHVybiBzdGF0aWNfY2FzdDwKKwkgIGNvbnN0IF9fbW9uZXlwdW5jdF9jYWNoZTxfQ2hhclQsIF9JbnRsPio+KF9fY2FjaGVzW19faV0pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsPgorICAgIHZvaWQKKyAgICBfX21vbmV5cHVuY3RfY2FjaGU8X0NoYXJULCBfSW50bD46Ol9NX2NhY2hlKGNvbnN0IGxvY2FsZSYgX19sb2MpCisgICAgeworICAgICAgX01fYWxsb2NhdGVkID0gdHJ1ZTsKKworICAgICAgY29uc3QgbW9uZXlwdW5jdDxfQ2hhclQsIF9JbnRsPiYgX19tcCA9CisJdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8X0NoYXJULCBfSW50bD4gPihfX2xvYyk7CisKKyAgICAgIF9NX2RlY2ltYWxfcG9pbnQgPSBfX21wLmRlY2ltYWxfcG9pbnQoKTsKKyAgICAgIF9NX3Rob3VzYW5kc19zZXAgPSBfX21wLnRob3VzYW5kc19zZXAoKTsKKyAgICAgIF9NX2ZyYWNfZGlnaXRzID0gX19tcC5mcmFjX2RpZ2l0cygpOworCisgICAgICBjaGFyKiBfX2dyb3VwaW5nID0gMDsKKyAgICAgIF9DaGFyVCogX19jdXJyX3N5bWJvbCA9IDA7CisgICAgICBfQ2hhclQqIF9fcG9zaXRpdmVfc2lnbiA9IDA7CisgICAgICBfQ2hhclQqIF9fbmVnYXRpdmVfc2lnbiA9IDA7ICAgICAKKyAgICAgIF9fdHJ5CisJeworCSAgX01fZ3JvdXBpbmdfc2l6ZSA9IF9fbXAuZ3JvdXBpbmcoKS5zaXplKCk7CisJICBfX2dyb3VwaW5nID0gbmV3IGNoYXJbX01fZ3JvdXBpbmdfc2l6ZV07CisJICBfX21wLmdyb3VwaW5nKCkuY29weShfX2dyb3VwaW5nLCBfTV9ncm91cGluZ19zaXplKTsKKwkgIF9NX2dyb3VwaW5nID0gX19ncm91cGluZzsKKwkgIF9NX3VzZV9ncm91cGluZyA9IChfTV9ncm91cGluZ19zaXplCisJCQkgICAgICYmIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPihfTV9ncm91cGluZ1swXSkgPiAwCisJCQkgICAgICYmIChfTV9ncm91cGluZ1swXQorCQkJCSAhPSBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8Y2hhcj46Ol9fbWF4KSk7CisKKwkgIF9NX2N1cnJfc3ltYm9sX3NpemUgPSBfX21wLmN1cnJfc3ltYm9sKCkuc2l6ZSgpOworCSAgX19jdXJyX3N5bWJvbCA9IG5ldyBfQ2hhclRbX01fY3Vycl9zeW1ib2xfc2l6ZV07CisJICBfX21wLmN1cnJfc3ltYm9sKCkuY29weShfX2N1cnJfc3ltYm9sLCBfTV9jdXJyX3N5bWJvbF9zaXplKTsKKwkgIF9NX2N1cnJfc3ltYm9sID0gX19jdXJyX3N5bWJvbDsKKworCSAgX01fcG9zaXRpdmVfc2lnbl9zaXplID0gX19tcC5wb3NpdGl2ZV9zaWduKCkuc2l6ZSgpOworCSAgX19wb3NpdGl2ZV9zaWduID0gbmV3IF9DaGFyVFtfTV9wb3NpdGl2ZV9zaWduX3NpemVdOworCSAgX19tcC5wb3NpdGl2ZV9zaWduKCkuY29weShfX3Bvc2l0aXZlX3NpZ24sIF9NX3Bvc2l0aXZlX3NpZ25fc2l6ZSk7CisJICBfTV9wb3NpdGl2ZV9zaWduID0gX19wb3NpdGl2ZV9zaWduOworCisJICBfTV9uZWdhdGl2ZV9zaWduX3NpemUgPSBfX21wLm5lZ2F0aXZlX3NpZ24oKS5zaXplKCk7CisJICBfX25lZ2F0aXZlX3NpZ24gPSBuZXcgX0NoYXJUW19NX25lZ2F0aXZlX3NpZ25fc2l6ZV07CisJICBfX21wLm5lZ2F0aXZlX3NpZ24oKS5jb3B5KF9fbmVnYXRpdmVfc2lnbiwgX01fbmVnYXRpdmVfc2lnbl9zaXplKTsKKwkgIF9NX25lZ2F0aXZlX3NpZ24gPSBfX25lZ2F0aXZlX3NpZ247CisKKwkgIF9NX3Bvc19mb3JtYXQgPSBfX21wLnBvc19mb3JtYXQoKTsKKwkgIF9NX25lZ19mb3JtYXQgPSBfX21wLm5lZ19mb3JtYXQoKTsKKworCSAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdCA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCSAgX19jdC53aWRlbihtb25leV9iYXNlOjpfU19hdG9tcywKKwkJICAgICBtb25leV9iYXNlOjpfU19hdG9tcyArIG1vbmV5X2Jhc2U6Ol9TX2VuZCwgX01fYXRvbXMpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGRlbGV0ZSBbXSBfX2dyb3VwaW5nOworCSAgZGVsZXRlIFtdIF9fY3Vycl9zeW1ib2w7CisJICBkZWxldGUgW10gX19wb3NpdGl2ZV9zaWduOworCSAgZGVsZXRlIFtdIF9fbmVnYXRpdmVfc2lnbjsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIHRlbXBsYXRlPGJvb2wgX0ludGw+CisgICAgICBfSW5JdGVyCisgICAgICBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgICBfTV9leHRyYWN0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJIGlvc19iYXNlOjppb3N0YXRlJiBfX2Vyciwgc3RyaW5nJiBfX3VuaXRzKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJCSAgX190cmFpdHNfdHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0cmluZ190eXBlOjpzaXplX3R5cGUJICAgICAgICAgIHNpemVfdHlwZTsJCisJdHlwZWRlZiBtb25leV9iYXNlOjpwYXJ0CQkJICBwYXJ0OworCXR5cGVkZWYgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+ICAgICAgICAgX19jYWNoZV90eXBlOworCQorCWNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworCWNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworCV9fdXNlX2NhY2hlPF9fY2FjaGVfdHlwZT4gX191YzsKKwljb25zdCBfX2NhY2hlX3R5cGUqIF9fbGMgPSBfX3VjKF9fbG9jKTsKKwljb25zdCBjaGFyX3R5cGUqIF9fbGl0ID0gX19sYy0+X01fYXRvbXM7CisKKwkvLyBEZWR1Y2VkIHNpZ24uCisJYm9vbCBfX25lZ2F0aXZlID0gZmFsc2U7CisJLy8gU2lnbiBzaXplLgorCXNpemVfdHlwZSBfX3NpZ25fc2l6ZSA9IDA7CisJLy8gVHJ1ZSBpZiBzaWduIGlzIG1hbmRhdG9yeS4KKwljb25zdCBib29sIF9fbWFuZGF0b3J5X3NpZ24gPSAoX19sYy0+X01fcG9zaXRpdmVfc2lnbl9zaXplCisJCQkJICAgICAgICYmIF9fbGMtPl9NX25lZ2F0aXZlX3NpZ25fc2l6ZSk7CisJLy8gU3RyaW5nIG9mIGdyb3VwaW5nIGluZm8gZnJvbSB0aG91c2FuZHNfc2VwIHBsdWNrZWQgZnJvbSBfX3VuaXRzLgorCXN0cmluZyBfX2dyb3VwaW5nX3RtcDsKKwlpZiAoX19sYy0+X01fdXNlX2dyb3VwaW5nKQorCSAgX19ncm91cGluZ190bXAucmVzZXJ2ZSgzMik7CisJLy8gTGFzdCBwb3NpdGlvbiBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCisJaW50IF9fbGFzdF9wb3MgPSAwOworCS8vIFNlcGFyYXRvciBwb3NpdGlvbnMsIHRoZW4sIHBvc3NpYmx5LCBmcmFjdGlvbmFsIGRpZ2l0cy4KKwlpbnQgX19uID0gMDsKKwkvLyBJZiBpbnB1dCBpdGVyYXRvciBpcyBpbiBhIHZhbGlkIHN0YXRlLgorCWJvb2wgX190ZXN0dmFsaWQgPSB0cnVlOworCS8vIEZsYWcgbWFya2luZyB3aGVuIGEgZGVjaW1hbCBwb2ludCBpcyBmb3VuZC4KKwlib29sIF9fdGVzdGRlY2ZvdW5kID0gZmFsc2U7CisKKwkvLyBUaGUgdGVudGF0aXZlIHJldHVybmVkIHN0cmluZyBpcyBzdG9yZWQgaGVyZS4KKwlzdHJpbmcgX19yZXM7CisJX19yZXMucmVzZXJ2ZSgzMik7CisKKwljb25zdCBjaGFyX3R5cGUqIF9fbGl0X3plcm8gPSBfX2xpdCArIG1vbmV5X2Jhc2U6Ol9TX3plcm87CisJY29uc3QgbW9uZXlfYmFzZTo6cGF0dGVybiBfX3AgPSBfX2xjLT5fTV9uZWdfZm9ybWF0OworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IDQgJiYgX190ZXN0dmFsaWQ7ICsrX19pKQorCSAgeworCSAgICBjb25zdCBwYXJ0IF9fd2hpY2ggPSBzdGF0aWNfY2FzdDxwYXJ0PihfX3AuZmllbGRbX19pXSk7CisJICAgIHN3aXRjaCAoX193aGljaCkKKwkgICAgICB7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjpzeW1ib2w6CisJCS8vIEFjY29yZGluZyB0byAyMi4yLjYuMS4yLCBwMiwgc3ltYm9sIGlzIHJlcXVpcmVkCisJCS8vIGlmIChfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UpLCBvdGhlcndpc2UKKwkJLy8gaXMgb3B0aW9uYWwgYW5kIGNvbnN1bWVkIG9ubHkgaWYgb3RoZXIgY2hhcmFjdGVycworCQkvLyBhcmUgbmVlZGVkIHRvIGNvbXBsZXRlIHRoZSBmb3JtYXQuCisJCWlmIChfX2lvLmZsYWdzKCkgJiBpb3NfYmFzZTo6c2hvd2Jhc2UgfHwgX19zaWduX3NpemUgPiAxCisJCSAgICB8fCBfX2kgPT0gMAorCQkgICAgfHwgKF9faSA9PSAxICYmIChfX21hbmRhdG9yeV9zaWduCisJCQkJICAgICB8fCAoc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkWzBdKQorCQkJCQkgPT0gbW9uZXlfYmFzZTo6c2lnbikKKwkJCQkgICAgIHx8IChzdGF0aWNfY2FzdDxwYXJ0PihfX3AuZmllbGRbMl0pCisJCQkJCSA9PSBtb25leV9iYXNlOjpzcGFjZSkpKQorCQkgICAgfHwgKF9faSA9PSAyICYmICgoc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkWzNdKQorCQkJCSAgICAgID09IG1vbmV5X2Jhc2U6OnZhbHVlKQorCQkJCSAgICAgfHwgKF9fbWFuZGF0b3J5X3NpZ24KKwkJCQkJICYmIChzdGF0aWNfY2FzdDxwYXJ0PihfX3AuZmllbGRbM10pCisJCQkJCSAgICAgPT0gbW9uZXlfYmFzZTo6c2lnbikpKSkpCisJCSAgeworCQkgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gX19sYy0+X01fY3Vycl9zeW1ib2xfc2l6ZTsKKwkJICAgIHNpemVfdHlwZSBfX2ogPSAwOworCQkgICAgZm9yICg7IF9fYmVnICE9IF9fZW5kICYmIF9faiA8IF9fbGVuCisJCQkgICAmJiAqX19iZWcgPT0gX19sYy0+X01fY3Vycl9zeW1ib2xbX19qXTsKKwkJCSArK19fYmVnLCArK19faik7CisJCSAgICBpZiAoX19qICE9IF9fbGVuCisJCQkmJiAoX19qIHx8IF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpzaG93YmFzZSkpCisJCSAgICAgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCSAgfQorCQlicmVhazsKKwkgICAgICBjYXNlIG1vbmV5X2Jhc2U6OnNpZ246CisJCS8vIFNpZ24gbWlnaHQgbm90IGV4aXN0LCBvciBiZSBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBsb25nLgorCQlpZiAoX19sYy0+X01fcG9zaXRpdmVfc2lnbl9zaXplICYmIF9fYmVnICE9IF9fZW5kCisJCSAgICAmJiAqX19iZWcgPT0gX19sYy0+X01fcG9zaXRpdmVfc2lnblswXSkKKwkJICB7CisJCSAgICBfX3NpZ25fc2l6ZSA9IF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZTsKKwkJICAgICsrX19iZWc7CisJCSAgfQorCQllbHNlIGlmIChfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemUgJiYgX19iZWcgIT0gX19lbmQKKwkJCSAmJiAqX19iZWcgPT0gX19sYy0+X01fbmVnYXRpdmVfc2lnblswXSkKKwkJICB7CisJCSAgICBfX25lZ2F0aXZlID0gdHJ1ZTsKKwkJICAgIF9fc2lnbl9zaXplID0gX19sYy0+X01fbmVnYXRpdmVfc2lnbl9zaXplOworCQkgICAgKytfX2JlZzsKKwkJICB9CisJCWVsc2UgaWYgKF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ25fc2l6ZQorCQkJICYmICFfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemUpCisJCSAgLy8gIi4uLiBpZiBubyBzaWduIGlzIGRldGVjdGVkLCB0aGUgcmVzdWx0IGlzIGdpdmVuIHRoZSBzaWduCisJCSAgLy8gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIG9mIHRoZSBlbXB0eSBzdHJpbmciCisJCSAgX19uZWdhdGl2ZSA9IHRydWU7CisJCWVsc2UgaWYgKF9fbWFuZGF0b3J5X3NpZ24pCisJCSAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjp2YWx1ZToKKwkJLy8gRXh0cmFjdCBkaWdpdHMsIHJlbW92ZSBhbmQgc3Rhc2ggYXdheSB0aGUKKwkJLy8gZ3JvdXBpbmcgb2YgZm91bmQgdGhvdXNhbmRzIHNlcGFyYXRvcnMuCisJCWZvciAoOyBfX2JlZyAhPSBfX2VuZDsgKytfX2JlZykKKwkJICB7CisJCSAgICBjb25zdCBjaGFyX3R5cGUgX19jID0gKl9fYmVnOworCQkgICAgY29uc3QgY2hhcl90eXBlKiBfX3EgPSBfX3RyYWl0c190eXBlOjpmaW5kKF9fbGl0X3plcm8sIAorCQkJCQkJCSAgICAgICAxMCwgX19jKTsKKwkJICAgIGlmIChfX3EgIT0gMCkKKwkJICAgICAgeworCQkJX19yZXMgKz0gbW9uZXlfYmFzZTo6X1NfYXRvbXNbX19xIC0gX19saXRdOworCQkJKytfX247CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKF9fYyA9PSBfX2xjLT5fTV9kZWNpbWFsX3BvaW50IAorCQkJICAgICAmJiAhX190ZXN0ZGVjZm91bmQpCisJCSAgICAgIHsKKwkJCWlmIChfX2xjLT5fTV9mcmFjX2RpZ2l0cyA8PSAwKQorCQkJICBicmVhazsKKworCQkJX19sYXN0X3BvcyA9IF9fbjsKKwkJCV9fbiA9IDA7CisJCQlfX3Rlc3RkZWNmb3VuZCA9IHRydWU7CisJCSAgICAgIH0KKwkJICAgIGVsc2UgaWYgKF9fbGMtPl9NX3VzZV9ncm91cGluZworCQkJICAgICAmJiBfX2MgPT0gX19sYy0+X01fdGhvdXNhbmRzX3NlcAorCQkJICAgICAmJiAhX190ZXN0ZGVjZm91bmQpCisJCSAgICAgIHsKKwkJCWlmIChfX24pCisJCQkgIHsKKwkJCSAgICAvLyBNYXJrIHBvc2l0aW9uIGZvciBsYXRlciBhbmFseXNpcy4KKwkJCSAgICBfX2dyb3VwaW5nX3RtcCArPSBzdGF0aWNfY2FzdDxjaGFyPihfX24pOworCQkJICAgIF9fbiA9IDA7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCQkgICAgYnJlYWs7CisJCQkgIH0KKwkJICAgICAgfQorCQkgICAgZWxzZQorCQkgICAgICBicmVhazsKKwkJICB9CisJCWlmIChfX3Jlcy5lbXB0eSgpKQorCQkgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJCWJyZWFrOworCSAgICAgIGNhc2UgbW9uZXlfYmFzZTo6c3BhY2U6CisJCS8vIEF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZXF1aXJlZC4KKwkJaWYgKF9fYmVnICE9IF9fZW5kICYmIF9fY3R5cGUuaXMoY3R5cGVfYmFzZTo6c3BhY2UsICpfX2JlZykpCisJCSAgKytfX2JlZzsKKwkJZWxzZQorCQkgIF9fdGVzdHZhbGlkID0gZmFsc2U7CisJICAgICAgY2FzZSBtb25leV9iYXNlOjpub25lOgorCQkvLyBPbmx5IGlmIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLgorCQlpZiAoX19pICE9IDMpCisJCSAgZm9yICg7IF9fYmVnICE9IF9fZW5kCisJCQkgJiYgX19jdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgKl9fYmVnKTsgKytfX2JlZyk7CisJCWJyZWFrOworCSAgICAgIH0KKwkgIH0KKworCS8vIE5lZWQgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSBzaWduIGNoYXJhY3RlcnMsIGlmIHRoZXkgZXhpc3QuCisJaWYgKF9fc2lnbl9zaXplID4gMSAmJiBfX3Rlc3R2YWxpZCkKKwkgIHsKKwkgICAgY29uc3QgY2hhcl90eXBlKiBfX3NpZ24gPSBfX25lZ2F0aXZlID8gX19sYy0+X01fbmVnYXRpdmVfc2lnbgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2xjLT5fTV9wb3NpdGl2ZV9zaWduOworCSAgICBzaXplX3R5cGUgX19pID0gMTsKKwkgICAgZm9yICg7IF9fYmVnICE9IF9fZW5kICYmIF9faSA8IF9fc2lnbl9zaXplCisJCSAgICYmICpfX2JlZyA9PSBfX3NpZ25bX19pXTsgKytfX2JlZywgKytfX2kpOworCSAgICAKKwkgICAgaWYgKF9faSAhPSBfX3NpZ25fc2l6ZSkKKwkgICAgICBfX3Rlc3R2YWxpZCA9IGZhbHNlOworCSAgfQorCisJaWYgKF9fdGVzdHZhbGlkKQorCSAgeworCSAgICAvLyBTdHJpcCBsZWFkaW5nIHplcm9zLgorCSAgICBpZiAoX19yZXMuc2l6ZSgpID4gMSkKKwkgICAgICB7CisJCWNvbnN0IHNpemVfdHlwZSBfX2ZpcnN0ID0gX19yZXMuZmluZF9maXJzdF9ub3Rfb2YoJzAnKTsKKwkJY29uc3QgYm9vbCBfX29ubHlfemVyb3MgPSBfX2ZpcnN0ID09IHN0cmluZzo6bnBvczsKKwkJaWYgKF9fZmlyc3QpCisJCSAgX19yZXMuZXJhc2UoMCwgX19vbmx5X3plcm9zID8gX19yZXMuc2l6ZSgpIC0gMSA6IF9fZmlyc3QpOworCSAgICAgIH0KKworCSAgICAvLyAyMi4yLjYuMS4yLCBwNAorCSAgICBpZiAoX19uZWdhdGl2ZSAmJiBfX3Jlc1swXSAhPSAnMCcpCisJICAgICAgX19yZXMuaW5zZXJ0KF9fcmVzLmJlZ2luKCksICctJyk7CisJICAgIAorCSAgICAvLyBUZXN0IGZvciBncm91cGluZyBmaWRlbGl0eS4KKwkgICAgaWYgKF9fZ3JvdXBpbmdfdG1wLnNpemUoKSkKKwkgICAgICB7CisJCS8vIEFkZCB0aGUgZW5kaW5nIGdyb3VwaW5nLgorCQlfX2dyb3VwaW5nX3RtcCArPSBzdGF0aWNfY2FzdDxjaGFyPihfX3Rlc3RkZWNmb3VuZCA/IF9fbGFzdF9wb3MKKwkJCQkJCSAgICAgICAgICAgICAgICAgICA6IF9fbik7CisJCWlmICghc3RkOjpfX3ZlcmlmeV9ncm91cGluZyhfX2xjLT5fTV9ncm91cGluZywKKwkJCQkJICAgIF9fbGMtPl9NX2dyb3VwaW5nX3NpemUsCisJCQkJCSAgICBfX2dyb3VwaW5nX3RtcCkpCisJCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgICAgfQorCSAgICAKKwkgICAgLy8gSWZmIG5vdCBlbm91Z2ggZGlnaXRzIHdlcmUgc3VwcGxpZWQgYWZ0ZXIgdGhlIGRlY2ltYWwtcG9pbnQuCisJICAgIGlmIChfX3Rlc3RkZWNmb3VuZCAmJiBfX24gIT0gX19sYy0+X01fZnJhY19kaWdpdHMpCisJICAgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwkgIH0KKworCS8vIElmZiB2YWxpZCBzZXF1ZW5jZSBpcyBub3QgcmVjb2duaXplZC4KKwlpZiAoIV9fdGVzdHZhbGlkKQorCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJZWxzZQorCSAgX191bml0cy5zd2FwKF9fcmVzKTsKKwkKKwkvLyBJZmYgbm8gbW9yZSBjaGFyYWN0ZXJzIGFyZSBhdmFpbGFibGUuCisJaWYgKF9fYmVnID09IF9fZW5kKQorCSAgX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKwlyZXR1cm4gX19iZWc7CisgICAgICB9CisKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0xPTkdfRE9VQkxFX0NPTVBBVCAmJiBkZWZpbmVkIF9fTE9OR19ET1VCTEVfMTI4X18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX19kb19nZXQoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywKKwkgICAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgZG91YmxlJiBfX3VuaXRzKSBjb25zdAorICAgIHsKKyAgICAgIHN0cmluZyBfX3N0cjsKKyAgICAgIF9fYmVnID0gX19pbnRsID8gX01fZXh0cmFjdDx0cnVlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cikKKyAgICAgICAgICAgICAgICAgICAgIDogX01fZXh0cmFjdDxmYWxzZT4oX19iZWcsIF9fZW5kLCBfX2lvLCBfX2VyciwgX19zdHIpOworICAgICAgc3RkOjpfX2NvbnZlcnRfdG9fdihfX3N0ci5jX3N0cigpLCBfX3VuaXRzLCBfX2VyciwgX1NfZ2V0X2NfbG9jYWxlKCkpOworICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgbW9uZXlfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIGRvX2dldChpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLAorCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgbG9uZyBkb3VibGUmIF9fdW5pdHMpIGNvbnN0CisgICAgeworICAgICAgc3RyaW5nIF9fc3RyOworICAgICAgX19iZWcgPSBfX2ludGwgPyBfTV9leHRyYWN0PHRydWU+KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fc3RyKQorCSAgICAgICAgICAgICA6IF9NX2V4dHJhY3Q8ZmFsc2U+KF9fYmVnLCBfX2VuZCwgX19pbywgX19lcnIsIF9fc3RyKTsKKyAgICAgIHN0ZDo6X19jb252ZXJ0X3RvX3YoX19zdHIuY19zdHIoKSwgX191bml0cywgX19lcnIsIF9TX2dldF9jX2xvY2FsZSgpKTsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICBtb25leV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBib29sIF9faW50bCwgaW9zX2Jhc2UmIF9faW8sCisJICAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmc6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisKKyAgICAgIHN0cmluZyBfX3N0cjsKKyAgICAgIF9fYmVnID0gX19pbnRsID8gX01fZXh0cmFjdDx0cnVlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cikKKwkgICAgICAgICAgICAgOiBfTV9leHRyYWN0PGZhbHNlPihfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCBfX3N0cik7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX3N0ci5zaXplKCk7CisgICAgICBpZiAoX19sZW4pCisJeworCSAgX19kaWdpdHMucmVzaXplKF9fbGVuKTsKKwkgIF9fY3R5cGUud2lkZW4oX19zdHIuZGF0YSgpLCBfX3N0ci5kYXRhKCkgKyBfX2xlbiwgJl9fZGlnaXRzWzBdKTsKKwl9CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgdGVtcGxhdGU8Ym9vbCBfSW50bD4KKyAgICAgIF9PdXRJdGVyCisgICAgICBtb25leV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgICAgX01faW5zZXJ0KGl0ZXJfdHlwZSBfX3MsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCQljb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdHJpbmdfdHlwZTo6c2l6ZV90eXBlCSAgICAgICAgICBzaXplX3R5cGU7CisJdHlwZWRlZiBtb25leV9iYXNlOjpwYXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0OworCXR5cGVkZWYgX19tb25leXB1bmN0X2NhY2hlPF9DaGFyVCwgX0ludGw+ICAgICAgICAgX19jYWNoZV90eXBlOworICAgICAgCisJY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisJY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisJX191c2VfY2FjaGU8X19jYWNoZV90eXBlPiBfX3VjOworCWNvbnN0IF9fY2FjaGVfdHlwZSogX19sYyA9IF9fdWMoX19sb2MpOworCWNvbnN0IGNoYXJfdHlwZSogX19saXQgPSBfX2xjLT5fTV9hdG9tczsKKworCS8vIERldGVybWluZSBpZiBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBmb3JtYXRzIGFyZSB0byBiZSB1c2VkLCBhbmQKKwkvLyBkaXNjYXJkIGxlYWRpbmcgbmVnYXRpdmVfc2lnbiBpZiBpdCBpcyBwcmVzZW50LgorCWNvbnN0IGNoYXJfdHlwZSogX19iZWcgPSBfX2RpZ2l0cy5kYXRhKCk7CisKKwltb25leV9iYXNlOjpwYXR0ZXJuIF9fcDsKKwljb25zdCBjaGFyX3R5cGUqIF9fc2lnbjsKKwlzaXplX3R5cGUgX19zaWduX3NpemU7CisJaWYgKCEoKl9fYmVnID09IF9fbGl0W21vbmV5X2Jhc2U6Ol9TX21pbnVzXSkpCisJICB7CisJICAgIF9fcCA9IF9fbGMtPl9NX3Bvc19mb3JtYXQ7CisJICAgIF9fc2lnbiA9IF9fbGMtPl9NX3Bvc2l0aXZlX3NpZ247CisJICAgIF9fc2lnbl9zaXplID0gX19sYy0+X01fcG9zaXRpdmVfc2lnbl9zaXplOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgX19wID0gX19sYy0+X01fbmVnX2Zvcm1hdDsKKwkgICAgX19zaWduID0gX19sYy0+X01fbmVnYXRpdmVfc2lnbjsKKwkgICAgX19zaWduX3NpemUgPSBfX2xjLT5fTV9uZWdhdGl2ZV9zaWduX3NpemU7CisJICAgIGlmIChfX2RpZ2l0cy5zaXplKCkpCisJICAgICAgKytfX2JlZzsKKwkgIH0KKyAgICAgICAKKwkvLyBMb29rIGZvciB2YWxpZCBudW1iZXJzIGluIHRoZSBjdHlwZSBmYWNldCB3aXRoaW4gaW5wdXQgZGlnaXRzLgorCXNpemVfdHlwZSBfX2xlbiA9IF9fY3R5cGUuc2Nhbl9ub3QoY3R5cGVfYmFzZTo6ZGlnaXQsIF9fYmVnLAorCQkJCQkgICBfX2JlZyArIF9fZGlnaXRzLnNpemUoKSkgLSBfX2JlZzsKKwlpZiAoX19sZW4pCisJICB7CisJICAgIC8vIEFzc3VtZSB2YWxpZCBpbnB1dCwgYW5kIGF0dGVtcHQgdG8gZm9ybWF0LgorCSAgICAvLyBCcmVhayBkb3duIGlucHV0IG51bWJlcnMgaW50byBiYXNlIGNvbXBvbmVudHMsIGFzIGZvbGxvd3M6CisJICAgIC8vICAgZmluYWxfdmFsdWUgPSBncm91cGVkIHVuaXRzICsgKGRlY2ltYWwgcG9pbnQpICsgKGRpZ2l0cykKKwkgICAgc3RyaW5nX3R5cGUgX192YWx1ZTsKKwkgICAgX192YWx1ZS5yZXNlcnZlKDIgKiBfX2xlbik7CisKKwkgICAgLy8gQWRkIHRob3VzYW5kcyBzZXBhcmF0b3JzIHRvIG5vbi1kZWNpbWFsIGRpZ2l0cywgcGVyCisJICAgIC8vIGdyb3VwaW5nIHJ1bGVzLgorCSAgICBsb25nIF9fcGFkZGVjID0gX19sZW4gLSBfX2xjLT5fTV9mcmFjX2RpZ2l0czsKKwkgICAgaWYgKF9fcGFkZGVjID4gMCkKKyAgCSAgICAgIHsKKwkJaWYgKF9fbGMtPl9NX2ZyYWNfZGlnaXRzIDwgMCkKKwkJICBfX3BhZGRlYyA9IF9fbGVuOworICAJCWlmIChfX2xjLT5fTV9ncm91cGluZ19zaXplKQorICAJCSAgeworCQkgICAgX192YWx1ZS5hc3NpZ24oMiAqIF9fcGFkZGVjLCBjaGFyX3R5cGUoKSk7CisgCQkgICAgX0NoYXJUKiBfX3ZlbmQgPSAKKwkJICAgICAgc3RkOjpfX2FkZF9ncm91cGluZygmX192YWx1ZVswXSwgX19sYy0+X01fdGhvdXNhbmRzX3NlcCwKKwkJCQkJICBfX2xjLT5fTV9ncm91cGluZywKKwkJCQkJICBfX2xjLT5fTV9ncm91cGluZ19zaXplLAorCQkJCQkgIF9fYmVnLCBfX2JlZyArIF9fcGFkZGVjKTsKKwkJICAgIF9fdmFsdWUuZXJhc2UoX192ZW5kIC0gJl9fdmFsdWVbMF0pOworICAJCSAgfQorICAJCWVsc2UKKwkJICBfX3ZhbHVlLmFzc2lnbihfX2JlZywgX19wYWRkZWMpOworCSAgICAgIH0KKworCSAgICAvLyBEZWFsIHdpdGggZGVjaW1hbCBwb2ludCwgZGVjaW1hbCBkaWdpdHMuCisJICAgIGlmIChfX2xjLT5fTV9mcmFjX2RpZ2l0cyA+IDApCisJICAgICAgeworCQlfX3ZhbHVlICs9IF9fbGMtPl9NX2RlY2ltYWxfcG9pbnQ7CisJCWlmIChfX3BhZGRlYyA+PSAwKQorCQkgIF9fdmFsdWUuYXBwZW5kKF9fYmVnICsgX19wYWRkZWMsIF9fbGMtPl9NX2ZyYWNfZGlnaXRzKTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIC8vIEhhdmUgdG8gcGFkIHplcm9zIGluIHRoZSBkZWNpbWFsIHBvc2l0aW9uLgorCQkgICAgX192YWx1ZS5hcHBlbmQoLV9fcGFkZGVjLCBfX2xpdFttb25leV9iYXNlOjpfU196ZXJvXSk7CisJCSAgICBfX3ZhbHVlLmFwcGVuZChfX2JlZywgX19sZW4pOworCQkgIH0KKyAgCSAgICAgIH0KKyAgCisJICAgIC8vIENhbGN1bGF0ZSBsZW5ndGggb2YgcmVzdWx0aW5nIHN0cmluZy4KKwkgICAgY29uc3QgaW9zX2Jhc2U6OmZtdGZsYWdzIF9fZiA9IF9faW8uZmxhZ3MoKSAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgaW9zX2Jhc2U6OmFkanVzdGZpZWxkOworCSAgICBfX2xlbiA9IF9fdmFsdWUuc2l6ZSgpICsgX19zaWduX3NpemU7CisJICAgIF9fbGVuICs9ICgoX19pby5mbGFncygpICYgaW9zX2Jhc2U6OnNob3diYXNlKQorCQkgICAgICA/IF9fbGMtPl9NX2N1cnJfc3ltYm9sX3NpemUgOiAwKTsKKworCSAgICBzdHJpbmdfdHlwZSBfX3JlczsKKwkgICAgX19yZXMucmVzZXJ2ZSgyICogX19sZW4pOworCSAgICAKKwkgICAgY29uc3Qgc2l6ZV90eXBlIF9fd2lkdGggPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9faW8ud2lkdGgoKSk7ICAKKwkgICAgY29uc3QgYm9vbCBfX3Rlc3RpcGFkID0gKF9fZiA9PSBpb3NfYmFzZTo6aW50ZXJuYWwKKwkJCQkgICAgICYmIF9fbGVuIDwgX193aWR0aCk7CisJICAgIC8vIEZpdCBmb3JtYXR0ZWQgZGlnaXRzIGludG8gdGhlIHJlcXVpcmVkIHBhdHRlcm4uCisJICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IDQ7ICsrX19pKQorCSAgICAgIHsKKwkJY29uc3QgcGFydCBfX3doaWNoID0gc3RhdGljX2Nhc3Q8cGFydD4oX19wLmZpZWxkW19faV0pOworCQlzd2l0Y2ggKF9fd2hpY2gpCisJCSAgeworCQkgIGNhc2UgbW9uZXlfYmFzZTo6c3ltYm9sOgorCQkgICAgaWYgKF9faW8uZmxhZ3MoKSAmIGlvc19iYXNlOjpzaG93YmFzZSkKKwkJICAgICAgX19yZXMuYXBwZW5kKF9fbGMtPl9NX2N1cnJfc3ltYm9sLAorCQkJCSAgIF9fbGMtPl9NX2N1cnJfc3ltYm9sX3NpemUpOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBtb25leV9iYXNlOjpzaWduOgorCQkgICAgLy8gU2lnbiBtaWdodCBub3QgZXhpc3QsIG9yIGJlIG1vcmUgdGhhbiBvbmUKKwkJICAgIC8vIGNoYXJhY3RlciBsb25nLiBJbiB0aGF0IGNhc2UsIGFkZCBpbiB0aGUgcmVzdAorCQkgICAgLy8gYmVsb3cuCisJCSAgICBpZiAoX19zaWduX3NpemUpCisJCSAgICAgIF9fcmVzICs9IF9fc2lnblswXTsKKwkJICAgIGJyZWFrOworCQkgIGNhc2UgbW9uZXlfYmFzZTo6dmFsdWU6CisJCSAgICBfX3JlcyArPSBfX3ZhbHVlOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBtb25leV9iYXNlOjpzcGFjZToKKwkJICAgIC8vIEF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZXF1aXJlZCwgYnV0IGlmIGludGVybmFsCisJCSAgICAvLyBmb3JtYXR0aW5nIGlzIHJlcXVpcmVkLCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisJCSAgICAvLyBmaWxsIHNwYWNlcyB3aWxsIGJlIG5lY2Vzc2FyeS4KKwkJICAgIGlmIChfX3Rlc3RpcGFkKQorCQkgICAgICBfX3Jlcy5hcHBlbmQoX193aWR0aCAtIF9fbGVuLCBfX2ZpbGwpOworCQkgICAgZWxzZQorCQkgICAgICBfX3JlcyArPSBfX2ZpbGw7CisJCSAgICBicmVhazsKKwkJICBjYXNlIG1vbmV5X2Jhc2U6Om5vbmU6CisJCSAgICBpZiAoX190ZXN0aXBhZCkKKwkJICAgICAgX19yZXMuYXBwZW5kKF9fd2lkdGggLSBfX2xlbiwgX19maWxsKTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICAgIAorCSAgICAvLyBTcGVjaWFsIGNhc2Ugb2YgbXVsdGktcGFydCBzaWduIHBhcnRzLgorCSAgICBpZiAoX19zaWduX3NpemUgPiAxKQorCSAgICAgIF9fcmVzLmFwcGVuZChfX3NpZ24gKyAxLCBfX3NpZ25fc2l6ZSAtIDEpOworCSAgICAKKwkgICAgLy8gUGFkLCBpZiBzdGlsbCBuZWNlc3NhcnkuCisJICAgIF9fbGVuID0gX19yZXMuc2l6ZSgpOworCSAgICBpZiAoX193aWR0aCA+IF9fbGVuKQorCSAgICAgIHsKKwkJaWYgKF9fZiA9PSBpb3NfYmFzZTo6bGVmdCkKKwkJICAvLyBBZnRlci4KKwkJICBfX3Jlcy5hcHBlbmQoX193aWR0aCAtIF9fbGVuLCBfX2ZpbGwpOworCQllbHNlCisJCSAgLy8gQmVmb3JlLgorCQkgIF9fcmVzLmluc2VydCgwLCBfX3dpZHRoIC0gX19sZW4sIF9fZmlsbCk7CisJCV9fbGVuID0gX193aWR0aDsKKwkgICAgICB9CisJICAgIAorCSAgICAvLyBXcml0ZSByZXN1bHRpbmcsIGZ1bGx5LWZvcm1hdHRlZCBzdHJpbmcgdG8gb3V0cHV0IGl0ZXJhdG9yLgorCSAgICBfX3MgPSBzdGQ6Ol9fd3JpdGUoX19zLCBfX3Jlcy5kYXRhKCksIF9fbGVuKTsKKwkgIH0KKwlfX2lvLndpZHRoKDApOworCXJldHVybiBfX3M7ICAgIAorICAgICAgfQorCisjaWYgZGVmaW5lZCBfR0xJQkNYWF9MT05HX0RPVUJMRV9DT01QQVQgJiYgZGVmaW5lZCBfX0xPTkdfRE9VQkxFXzEyOF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX091dEl0ZXI+CisgICAgX091dEl0ZXIKKyAgICBtb25leV9wdXQ8X0NoYXJULCBfT3V0SXRlcj46OgorICAgIF9fZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICAgIGRvdWJsZSBfX3VuaXRzKSBjb25zdAorICAgIHsgcmV0dXJuIHRoaXMtPmRvX3B1dChfX3MsIF9faW50bCwgX19pbywgX19maWxsLCAobG9uZyBkb3VibGUpIF9fdW5pdHMpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyPgorICAgIF9PdXRJdGVyCisgICAgbW9uZXlfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgYm9vbCBfX2ludGwsIGlvc19iYXNlJiBfX2lvLCBjaGFyX3R5cGUgX19maWxsLAorCSAgIGxvbmcgZG91YmxlIF9fdW5pdHMpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlIF9fbG9jID0gX19pby5nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5CisgICAgICAvLyBGaXJzdCB0cnkgYSBidWZmZXIgcGVyaGFwcyBiaWcgZW5vdWdoLgorICAgICAgaW50IF9fY3Nfc2l6ZSA9IDY0OworICAgICAgY2hhciogX19jcyA9IHN0YXRpY19jYXN0PGNoYXIqPihfX2J1aWx0aW5fYWxsb2NhKF9fY3Nfc2l6ZSkpOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzI4LiBCYWQgc3ByaW50ZiBmb3JtYXQgbW9kaWZpZXIgaW4gbW9uZXlfcHV0PD46OmRvX3B1dCgpCisgICAgICBpbnQgX19sZW4gPSBzdGQ6Ol9fY29udmVydF9mcm9tX3YoX1NfZ2V0X2NfbG9jYWxlKCksIF9fY3MsIF9fY3Nfc2l6ZSwKKwkJCQkJIiUuKkxmIiwgMCwgX191bml0cyk7CisgICAgICAvLyBJZiB0aGUgYnVmZmVyIHdhcyBub3QgbGFyZ2UgZW5vdWdoLCB0cnkgYWdhaW4gd2l0aCB0aGUgY29ycmVjdCBzaXplLgorICAgICAgaWYgKF9fbGVuID49IF9fY3Nfc2l6ZSkKKwl7CisJICBfX2NzX3NpemUgPSBfX2xlbiArIDE7CisJICBfX2NzID0gc3RhdGljX2Nhc3Q8Y2hhcio+KF9fYnVpbHRpbl9hbGxvY2EoX19jc19zaXplKSk7CisJICBfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgX19jc19zaXplLAorCQkJCQkiJS4qTGYiLCAwLCBfX3VuaXRzKTsKKwl9CisjZWxzZQorICAgICAgLy8gbWF4X2V4cG9uZW50MTAgKyAxIGZvciB0aGUgaW50ZWdlciBwYXJ0LCArIDIgZm9yIHNpZ24gYW5kICdcMCcuCisgICAgICBjb25zdCBpbnQgX19jc19zaXplID0KKwlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMzsKKyAgICAgIGNoYXIqIF9fY3MgPSBzdGF0aWNfY2FzdDxjaGFyKj4oX19idWlsdGluX2FsbG9jYShfX2NzX3NpemUpKTsKKyAgICAgIGludCBfX2xlbiA9IHN0ZDo6X19jb252ZXJ0X2Zyb21fdihfU19nZXRfY19sb2NhbGUoKSwgX19jcywgMCwgIiUuKkxmIiwgCisJCQkJCTAsIF9fdW5pdHMpOworI2VuZGlmCisgICAgICBzdHJpbmdfdHlwZSBfX2RpZ2l0cyhfX2xlbiwgY2hhcl90eXBlKCkpOworICAgICAgX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgX19sZW4sICZfX2RpZ2l0c1swXSk7CisgICAgICByZXR1cm4gX19pbnRsID8gX01faW5zZXJ0PHRydWU+KF9fcywgX19pbywgX19maWxsLCBfX2RpZ2l0cykKKwkgICAgICAgICAgICA6IF9NX2luc2VydDxmYWxzZT4oX19zLCBfX2lvLCBfX2ZpbGwsIF9fZGlnaXRzKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIG1vbmV5X3B1dDxfQ2hhclQsIF9PdXRJdGVyPjo6CisgICAgZG9fcHV0KGl0ZXJfdHlwZSBfX3MsIGJvb2wgX19pbnRsLCBpb3NfYmFzZSYgX19pbywgY2hhcl90eXBlIF9fZmlsbCwKKwkgICBjb25zdCBzdHJpbmdfdHlwZSYgX19kaWdpdHMpIGNvbnN0CisgICAgeyByZXR1cm4gX19pbnRsID8gX01faW5zZXJ0PHRydWU+KF9fcywgX19pbywgX19maWxsLCBfX2RpZ2l0cykKKwkgICAgICAgICAgICA6IF9NX2luc2VydDxmYWxzZT4oX19zLCBfX2lvLCBfX2ZpbGwsIF9fZGlnaXRzKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKworICAvLyBOQjogTm90IGVzcGVjaWFsbHkgdXNlZnVsLiBXaXRob3V0IGFuIGlvc19iYXNlIG9iamVjdCBvciBzb21lCisgIC8vIGtpbmQgb2YgbG9jYWxlIHJlZmVyZW5jZSwgd2UgYXJlIGxlZnQgY2xhd2luZyBhdCB0aGUgYWlyIHdoZXJlCisgIC8vIHRoZSBzaWRlIG9mIHRoZSBtb3VudGFpbiB1c2VkIHRvIGJlLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICB0aW1lX2Jhc2U6OmRhdGVvcmRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OmRvX2RhdGVfb3JkZXIoKSBjb25zdAorICAgIHsgcmV0dXJuIHRpbWVfYmFzZTo6bm9fb3JkZXI7IH0KKworICAvLyBFeHBhbmQgYSBzdHJmdGltZSBmb3JtYXQgc3RyaW5nIGFuZCBwYXJzZSBpdC4gIEUuZy4sIGRvX2dldF9kYXRlKCkgbWF5CisgIC8vIHBhc3MgJW0vJWQvJVkgPT4gZXh0cmFjdGVkIGNoYXJhY3RlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgX01fZXh0cmFjdF92aWFfZm9ybWF0KGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpb3NfYmFzZSYgX19pbywKKwkJCSAgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyLCB0bSogX190bSwKKwkJCSAgY29uc3QgX0NoYXJUKiBfX2Zvcm1hdCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IF9fdGltZXB1bmN0PF9DaGFyVD4mIF9fdHAgPSB1c2VfZmFjZXQ8X190aW1lcHVuY3Q8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IGNoYXJfdHJhaXRzPF9DaGFyVD46Omxlbmd0aChfX2Zvcm1hdCk7CisKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fdG1wZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBzaXplX3QgX19pID0gMDsKKyAgICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZCAmJiBfX2kgPCBfX2xlbiAmJiAhX190bXBlcnI7ICsrX19pKQorCXsKKwkgIGlmIChfX2N0eXBlLm5hcnJvdyhfX2Zvcm1hdFtfX2ldLCAwKSA9PSAnJScpCisJICAgIHsKKwkgICAgICAvLyBWZXJpZnkgdmFsaWQgZm9ybWF0dGluZyBjb2RlLCBhdHRlbXB0IHRvIGV4dHJhY3QuCisJICAgICAgY2hhciBfX2MgPSBfX2N0eXBlLm5hcnJvdyhfX2Zvcm1hdFsrK19faV0sIDApOworCSAgICAgIGludCBfX21lbSA9IDA7CisJICAgICAgaWYgKF9fYyA9PSAnRScgfHwgX19jID09ICdPJykKKwkJX19jID0gX19jdHlwZS5uYXJyb3coX19mb3JtYXRbKytfX2ldLCAwKTsKKwkgICAgICBzd2l0Y2ggKF9fYykKKwkJeworCQkgIGNvbnN0IGNoYXIqIF9fY3M7CisJCSAgX0NoYXJUIF9fd2NzWzEwXTsKKwkJY2FzZSAnYSc6CisJCSAgLy8gQWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lIFt0bV93ZGF5XQorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fZGF5czFbN107CisJCSAgX190cC5fTV9kYXlzX2FiYnJldmlhdGVkKF9fZGF5czEpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF9uYW1lKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fd2RheSwgX19kYXlzMSwKKwkJCQkJICA3LCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0EnOgorCQkgIC8vIFdlZWtkYXkgbmFtZSBbdG1fd2RheV0uCisJCSAgY29uc3QgY2hhcl90eXBlKiAgX19kYXlzMls3XTsKKwkJICBfX3RwLl9NX2RheXMoX19kYXlzMik7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtLT50bV93ZGF5LCBfX2RheXMyLAorCQkJCQkgIDcsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ2InOgorCQkgIC8vIEFiYnJldmlhdGVkIG1vbnRoIG5hbWUgW3RtX21vbl0KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX21vbnRoczFbMTJdOworCQkgIF9fdHAuX01fbW9udGhzX2FiYnJldmlhdGVkKF9fbW9udGhzMSk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tb24sIAorCQkJCQkgIF9fbW9udGhzMSwgMTIsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnQic6CisJCSAgLy8gTW9udGggbmFtZSBbdG1fbW9uXS4KKwkJICBjb25zdCBjaGFyX3R5cGUqICBfX21vbnRoczJbMTJdOworCQkgIF9fdHAuX01fbW9udGhzKF9fbW9udGhzMik7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X25hbWUoX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tb24sIAorCQkJCQkgIF9fbW9udGhzMiwgMTIsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnYyc6CisJCSAgLy8gRGVmYXVsdCB0aW1lIGFuZCBkYXRlIHJlcHJlc2VudGF0aW9uLgorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fZHRbMl07CisJCSAgX190cC5fTV9kYXRlX3RpbWVfZm9ybWF0cyhfX2R0KTsKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fdG1wZXJyLCAKKwkJCQkJCV9fdG0sIF9fZHRbMF0pOworCQkgIGJyZWFrOworCQljYXNlICdkJzoKKwkJICAvLyBEYXkgWzAxLCAzMV0uIFt0bV9tZGF5XQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9tZGF5LCAxLCAzMSwgMiwKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnZSc6CisJCSAgLy8gRGF5IFsxLCAzMV0sIHdpdGggc2luZ2xlIGRpZ2l0cyBwcmVjZWRlZCBieQorCQkgIC8vIHNwYWNlLiBbdG1fbWRheV0KKwkJICBpZiAoX19jdHlwZS5pcyhjdHlwZV9iYXNlOjpzcGFjZSwgKl9fYmVnKSkKKwkJICAgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oKytfX2JlZywgX19lbmQsIF9fdG0tPnRtX21kYXksIDEsIDksCisJCQkJCSAgIDEsIF9faW8sIF9fdG1wZXJyKTsKKwkJICBlbHNlCisJCSAgICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fbWRheSwgMTAsIDMxLAorCQkJCQkgICAyLCBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkgIC8vIEVxdWl2YWxlbnQgdG8gJW0vJWQvJXkuW3RtX21vbiwgdG1fbWRheSwgdG1feWVhcl0KKwkJICBfX2NzID0gIiVtLyVkLyV5IjsKKwkJICBfX2N0eXBlLndpZGVuKF9fY3MsIF9fY3MgKyA5LCBfX3djcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX3djcyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ0gnOgorCQkgIC8vIEhvdXIgWzAwLCAyM10uIFt0bV9ob3VyXQorCQkgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtLT50bV9ob3VyLCAwLCAyMywgMiwKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAnSSc6CisJCSAgLy8gSG91ciBbMDEsIDEyXS4gW3RtX2hvdXJdCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX2hvdXIsIDEsIDEyLCAyLAorCQkJCQkgX19pbywgX190bXBlcnIpOworCQkgIGJyZWFrOworCQljYXNlICdtJzoKKwkJICAvLyBNb250aCBbMDEsIDEyXS4gW3RtX21vbl0KKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX19tZW0sIDEsIDEyLCAyLCAKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBpZiAoIV9fdG1wZXJyKQorCQkgICAgX190bS0+dG1fbW9uID0gX19tZW0gLSAxOworCQkgIGJyZWFrOworCQljYXNlICdNJzoKKwkJICAvLyBNaW51dGUgWzAwLCA1OV0uIFt0bV9taW5dCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX21pbiwgMCwgNTksIDIsCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgYnJlYWs7CisJCWNhc2UgJ24nOgorCQkgIGlmIChfX2N0eXBlLm5hcnJvdygqX19iZWcsIDApID09ICdcbicpCisJCSAgICArK19fYmVnOworCQkgIGVsc2UKKwkJICAgIF9fdG1wZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCQkgIGJyZWFrOworCQljYXNlICdSJzoKKwkJICAvLyBFcXVpdmFsZW50IHRvICglSDolTSkuCisJCSAgX19jcyA9ICIlSDolTSI7CisJCSAgX19jdHlwZS53aWRlbihfX2NzLCBfX2NzICsgNiwgX193Y3MpOworCQkgIF9fYmVnID0gX01fZXh0cmFjdF92aWFfZm9ybWF0KF9fYmVnLCBfX2VuZCwgX19pbywgX190bXBlcnIsIAorCQkJCQkJX190bSwgX193Y3MpOworCQkgIGJyZWFrOworCQljYXNlICdTJzoKKwkJICAvLyBTZWNvbmRzLiBbdG1fc2VjXQorCQkgIC8vIFswMCwgNjBdIGluIEM5OSAob25lIGxlYXAtc2Vjb25kKSwgWzAwLCA2MV0gaW4gQzg5LgorI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTkKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bS0+dG1fc2VjLCAwLCA2MCwgMiwKKyNlbHNlCisJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG0tPnRtX3NlYywgMCwgNjEsIDIsCisjZW5kaWYKKwkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJICBicmVhazsKKwkJY2FzZSAndCc6CisJCSAgaWYgKF9fY3R5cGUubmFycm93KCpfX2JlZywgMCkgPT0gJ1x0JykKKwkJICAgICsrX19iZWc7CisJCSAgZWxzZQorCQkgICAgX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgYnJlYWs7CisJCWNhc2UgJ1QnOgorCQkgIC8vIEVxdWl2YWxlbnQgdG8gKCVIOiVNOiVTKS4KKwkJICBfX2NzID0gIiVIOiVNOiVTIjsKKwkJICBfX2N0eXBlLndpZGVuKF9fY3MsIF9fY3MgKyA5LCBfX3djcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX3djcyk7CisJCSAgYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkgIC8vIExvY2FsZSdzIGRhdGUuCisJCSAgY29uc3QgY2hhcl90eXBlKiAgX19kYXRlc1syXTsKKwkJICBfX3RwLl9NX2RhdGVfZm9ybWF0cyhfX2RhdGVzKTsKKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fdG1wZXJyLCAKKwkJCQkJCV9fdG0sIF9fZGF0ZXNbMF0pOworCQkgIGJyZWFrOworCQljYXNlICdYJzoKKwkJICAvLyBMb2NhbGUncyB0aW1lLgorCQkgIGNvbnN0IGNoYXJfdHlwZSogIF9fdGltZXNbMl07CisJCSAgX190cC5fTV90aW1lX2Zvcm1hdHMoX190aW1lcyk7CisJCSAgX19iZWcgPSBfTV9leHRyYWN0X3ZpYV9mb3JtYXQoX19iZWcsIF9fZW5kLCBfX2lvLCBfX3RtcGVyciwgCisJCQkJCQlfX3RtLCBfX3RpbWVzWzBdKTsKKwkJICBicmVhazsKKwkJY2FzZSAneSc6CisJCWNhc2UgJ0MnOiAvLyBDOTkKKwkJICAvLyBUd28gZGlnaXQgeWVhci4KKwkJY2FzZSAnWSc6CisJCSAgLy8gWWVhciBbMTkwMCkuCisJCSAgLy8gTkI6IFdlIHBhcnNlIGVpdGhlciB0d28gZGlnaXRzLCBpbXBsaWNpdGx5IHllYXJzIHNpbmNlCisJCSAgLy8gMTkwMCwgb3IgNCBkaWdpdHMsIGZ1bGwgeWVhci4gIEluIGJvdGggY2FzZXMgd2UgY2FuIAorCQkgIC8vIHJlY29uc3RydWN0IFt0bV95ZWFyXS4gIFNlZSBhbHNvIGxpYnN0ZGMrKy8yNjcwMS4KKwkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX19tZW0sIDAsIDk5OTksIDQsCisJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCSAgaWYgKCFfX3RtcGVycikKKwkJICAgIF9fdG0tPnRtX3llYXIgPSBfX21lbSA8IDAgPyBfX21lbSArIDEwMCA6IF9fbWVtIC0gMTkwMDsKKwkJICBicmVhazsKKwkJY2FzZSAnWic6CisJCSAgLy8gVGltZXpvbmUgaW5mby4KKwkJICBpZiAoX19jdHlwZS5pcyhjdHlwZV9iYXNlOjp1cHBlciwgKl9fYmVnKSkKKwkJICAgIHsKKwkJICAgICAgaW50IF9fdG1wOworCQkgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfbmFtZShfX2JlZywgX19lbmQsIF9fdG1wLAorCQkJCSAgICAgICBfX3RpbWVwdW5jdF9jYWNoZTxfQ2hhclQ+OjpfU190aW1lem9uZXMsCisJCQkJCSAgICAgIDE0LCBfX2lvLCBfX3RtcGVycik7CisKKwkJICAgICAgLy8gR01UIHJlcXVpcmVzIHNwZWNpYWwgZWZmb3J0LgorCQkgICAgICBpZiAoX19iZWcgIT0gX19lbmQgJiYgIV9fdG1wZXJyICYmIF9fdG1wID09IDAKKwkJCSAgJiYgKCpfX2JlZyA9PSBfX2N0eXBlLndpZGVuKCctJykKKwkJCSAgICAgIHx8ICpfX2JlZyA9PSBfX2N0eXBlLndpZGVuKCcrJykpKQorCQkJeworCQkJICBfX2JlZyA9IF9NX2V4dHJhY3RfbnVtKF9fYmVnLCBfX2VuZCwgX190bXAsIDAsIDIzLCAyLAorCQkJCQkJIF9faW8sIF9fdG1wZXJyKTsKKwkJCSAgX19iZWcgPSBfTV9leHRyYWN0X251bShfX2JlZywgX19lbmQsIF9fdG1wLCAwLCA1OSwgMiwKKwkJCQkJCSBfX2lvLCBfX3RtcGVycik7CisJCQl9CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgLy8gTm90IHJlY29nbml6ZWQuCisJCSAgX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJCX0KKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gVmVyaWZ5IGZvcm1hdCBhbmQgaW5wdXQgbWF0Y2gsIGV4dHJhY3QgYW5kIGRpc2NhcmQuCisJICAgICAgaWYgKF9fZm9ybWF0W19faV0gPT0gKl9fYmVnKQorCQkrK19fYmVnOworCSAgICAgIGVsc2UKKwkJX190bXBlcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChfX3RtcGVyciB8fCBfX2kgIT0gX19sZW4pCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisgIAorICAgICAgcmV0dXJuIF9fYmVnOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfbnVtKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLCBpbnQmIF9fbWVtYmVyLAorCQkgICBpbnQgX19taW4sIGludCBfX21heCwgc2l6ZV90IF9fbGVuLAorCQkgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICAvLyBBcy1pcyB3b3JrcyBmb3IgX19sZW4gPSAxLCAyLCA0LCB0aGUgdmFsdWVzIGFjdHVhbGx5IHVzZWQuCisgICAgICBpbnQgX19tdWx0ID0gX19sZW4gPT0gMiA/IDEwIDogKF9fbGVuID09IDQgPyAxMDAwIDogMSk7CisKKyAgICAgICsrX19taW47CisgICAgICBzaXplX3QgX19pID0gMDsKKyAgICAgIGludCBfX3ZhbHVlID0gMDsKKyAgICAgIGZvciAoOyBfX2JlZyAhPSBfX2VuZCAmJiBfX2kgPCBfX2xlbjsgKytfX2JlZywgKytfX2kpCisJeworCSAgY29uc3QgY2hhciBfX2MgPSBfX2N0eXBlLm5hcnJvdygqX19iZWcsICcqJyk7CisJICBpZiAoX19jID49ICcwJyAmJiBfX2MgPD0gJzknKQorCSAgICB7CisJICAgICAgX192YWx1ZSA9IF9fdmFsdWUgKiAxMCArIChfX2MgLSAnMCcpOworCSAgICAgIGNvbnN0IGludCBfX3ZhbHVlYyA9IF9fdmFsdWUgKiBfX211bHQ7CisJICAgICAgaWYgKF9fdmFsdWVjID4gX19tYXggfHwgX192YWx1ZWMgKyBfX211bHQgPCBfX21pbikKKwkJYnJlYWs7CisJICAgICAgX19tdWx0IC89IDEwOworCSAgICB9CisJICBlbHNlCisJICAgIGJyZWFrOworCX0KKyAgICAgIGlmIChfX2kgPT0gX19sZW4pCisJX19tZW1iZXIgPSBfX3ZhbHVlOworICAgICAgLy8gU3BlY2lhbCBlbmNvZGluZyBmb3IgZG9fZ2V0X3llYXIsICd5JywgYW5kICdZJyBhYm92ZS4KKyAgICAgIGVsc2UgaWYgKF9fbGVuID09IDQgJiYgX19pID09IDIpCisJX19tZW1iZXIgPSBfX3ZhbHVlIC0gMTAwOworICAgICAgZWxzZQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIC8vIEFzc3VtcHRpb25zOgorICAvLyBBbGwgZWxlbWVudHMgaW4gX19uYW1lcyBhcmUgdW5pcXVlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXI+CisgICAgX0luSXRlcgorICAgIHRpbWVfZ2V0PF9DaGFyVCwgX0luSXRlcj46OgorICAgIF9NX2V4dHJhY3RfbmFtZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW50JiBfX21lbWJlciwKKwkJICAgIGNvbnN0IF9DaGFyVCoqIF9fbmFtZXMsIHNpemVfdCBfX2luZGV4bGVuLAorCQkgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VycikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPF9DaGFyVD4JCV9fdHJhaXRzX3R5cGU7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGNvbnN0IGN0eXBlPF9DaGFyVD4mIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKworICAgICAgaW50KiBfX21hdGNoZXMgPSBzdGF0aWNfY2FzdDxpbnQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihpbnQpCisJCQkJCQkJICAqIF9faW5kZXhsZW4pKTsKKyAgICAgIHNpemVfdCBfX25tYXRjaGVzID0gMDsKKyAgICAgIHNpemVfdCBfX3BvcyA9IDA7CisgICAgICBib29sIF9fdGVzdHZhbGlkID0gdHJ1ZTsKKyAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19uYW1lOworCisgICAgICAvLyBMb29rIGZvciBpbml0aWFsIG1hdGNoZXMuCisgICAgICAvLyBOQjogU29tZSBvZiB0aGUgbG9jYWxlIGRhdGEgaXMgaW4gdGhlIGZvcm0gb2YgYWxsIGxvd2VyY2FzZQorICAgICAgLy8gbmFtZXMsIGFuZCBzb21lIGlzIGluIHRoZSBmb3JtIG9mIGluaXRpYWxseS1jYXBpdGFsaXplZAorICAgICAgLy8gbmFtZXMuIExvb2sgZm9yIGJvdGguCisgICAgICBpZiAoX19iZWcgIT0gX19lbmQpCisJeworCSAgY29uc3QgY2hhcl90eXBlIF9fYyA9ICpfX2JlZzsKKwkgIGZvciAoc2l6ZV90IF9faTEgPSAwOyBfX2kxIDwgX19pbmRleGxlbjsgKytfX2kxKQorCSAgICBpZiAoX19jID09IF9fbmFtZXNbX19pMV1bMF0KKwkJfHwgX19jID09IF9fY3R5cGUudG91cHBlcihfX25hbWVzW19faTFdWzBdKSkKKwkgICAgICBfX21hdGNoZXNbX19ubWF0Y2hlcysrXSA9IF9faTE7CisJfQorCisgICAgICB3aGlsZSAoX19ubWF0Y2hlcyA+IDEpCisJeworCSAgLy8gRmluZCBzbWFsbGVzdCBtYXRjaGluZyBzdHJpbmcuCisJICBzaXplX3QgX19taW5sZW4gPSBfX3RyYWl0c190eXBlOjpsZW5ndGgoX19uYW1lc1tfX21hdGNoZXNbMF1dKTsKKwkgIGZvciAoc2l6ZV90IF9faTIgPSAxOyBfX2kyIDwgX19ubWF0Y2hlczsgKytfX2kyKQorCSAgICBfX21pbmxlbiA9IHN0ZDo6bWluKF9fbWlubGVuLAorCQkJICAgICAgX190cmFpdHNfdHlwZTo6bGVuZ3RoKF9fbmFtZXNbX19tYXRjaGVzW19faTJdXSkpOworCSAgKytfX2JlZywgKytfX3BvczsKKwkgIGlmIChfX3BvcyA8IF9fbWlubGVuICYmIF9fYmVnICE9IF9fZW5kKQorCSAgICBmb3IgKHNpemVfdCBfX2kzID0gMDsgX19pMyA8IF9fbm1hdGNoZXM7KQorCSAgICAgIHsKKwkJX19uYW1lID0gX19uYW1lc1tfX21hdGNoZXNbX19pM11dOworCQlpZiAoIShfX25hbWVbX19wb3NdID09ICpfX2JlZykpCisJCSAgX19tYXRjaGVzW19faTNdID0gX19tYXRjaGVzWy0tX19ubWF0Y2hlc107CisJCWVsc2UKKwkJICArK19faTM7CisJICAgICAgfQorCSAgZWxzZQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIGlmIChfX25tYXRjaGVzID09IDEpCisJeworCSAgLy8gTWFrZSBzdXJlIGZvdW5kIG5hbWUgaXMgY29tcGxldGVseSBleHRyYWN0ZWQuCisJICArK19fYmVnLCArK19fcG9zOworCSAgX19uYW1lID0gX19uYW1lc1tfX21hdGNoZXNbMF1dOworCSAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX190cmFpdHNfdHlwZTo6bGVuZ3RoKF9fbmFtZSk7CisJICB3aGlsZSAoX19wb3MgPCBfX2xlbiAmJiBfX2JlZyAhPSBfX2VuZCAmJiBfX25hbWVbX19wb3NdID09ICpfX2JlZykKKwkgICAgKytfX2JlZywgKytfX3BvczsKKworCSAgaWYgKF9fbGVuID09IF9fcG9zKQorCSAgICBfX21lbWJlciA9IF9fbWF0Y2hlc1swXTsKKwkgIGVsc2UKKwkgICAgX190ZXN0dmFsaWQgPSBmYWxzZTsKKwl9CisgICAgICBlbHNlCisJX190ZXN0dmFsaWQgPSBmYWxzZTsKKyAgICAgIGlmICghX190ZXN0dmFsaWQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBfTV9leHRyYWN0X3dkYXlfb3JfbW9udGgoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGludCYgX19tZW1iZXIsCisJCQkgICAgIGNvbnN0IF9DaGFyVCoqIF9fbmFtZXMsIHNpemVfdCBfX2luZGV4bGVuLAorCQkJICAgICBpb3NfYmFzZSYgX19pbywgaW9zX2Jhc2U6Omlvc3RhdGUmIF9fZXJyKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8X0NoYXJUPgkJX190cmFpdHNfdHlwZTsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworCisgICAgICBpbnQqIF9fbWF0Y2hlcyA9IHN0YXRpY19jYXN0PGludCo+KF9fYnVpbHRpbl9hbGxvY2EoMiAqIHNpemVvZihpbnQpCisJCQkJCQkJICAqIF9faW5kZXhsZW4pKTsKKyAgICAgIHNpemVfdCBfX25tYXRjaGVzID0gMDsKKyAgICAgIHNpemVfdCogX19tYXRjaGVzX2xlbmd0aHMgPSAwOworICAgICAgc2l6ZV90IF9fcG9zID0gMDsKKworICAgICAgaWYgKF9fYmVnICE9IF9fZW5kKQorCXsKKwkgIGNvbnN0IGNoYXJfdHlwZSBfX2MgPSAqX19iZWc7CisJICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCAyICogX19pbmRleGxlbjsgKytfX2kpCisJICAgIGlmIChfX2MgPT0gX19uYW1lc1tfX2ldWzBdCisJCXx8IF9fYyA9PSBfX2N0eXBlLnRvdXBwZXIoX19uYW1lc1tfX2ldWzBdKSkKKwkgICAgICBfX21hdGNoZXNbX19ubWF0Y2hlcysrXSA9IF9faTsKKwl9CisKKyAgICAgIGlmIChfX25tYXRjaGVzKQorCXsKKwkgICsrX19iZWcsICsrX19wb3M7CisKKwkgIF9fbWF0Y2hlc19sZW5ndGhzCisJICAgID0gc3RhdGljX2Nhc3Q8c2l6ZV90Kj4oX19idWlsdGluX2FsbG9jYShzaXplb2Yoc2l6ZV90KQorCQkJCQkJICAgICogX19ubWF0Y2hlcykpOworCSAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19ubWF0Y2hlczsgKytfX2kpCisJICAgIF9fbWF0Y2hlc19sZW5ndGhzW19faV0KKwkgICAgICA9IF9fdHJhaXRzX3R5cGU6Omxlbmd0aChfX25hbWVzW19fbWF0Y2hlc1tfX2ldXSk7CisJfQorCisgICAgICBmb3IgKDsgX19iZWcgIT0gX19lbmQ7ICsrX19iZWcsICsrX19wb3MpCisJeworCSAgc2l6ZV90IF9fbnNraXBwZWQgPSAwOworCSAgY29uc3QgY2hhcl90eXBlIF9fYyA9ICpfX2JlZzsKKwkgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbm1hdGNoZXM7KQorCSAgICB7CisJICAgICAgY29uc3QgY2hhcl90eXBlKiBfX25hbWUgPSBfX25hbWVzW19fbWF0Y2hlc1tfX2ldXTsKKwkgICAgICBpZiAoX19wb3MgPj0gX19tYXRjaGVzX2xlbmd0aHNbX19pXSkKKwkJKytfX25za2lwcGVkLCArK19faTsKKwkgICAgICBlbHNlIGlmICghKF9fbmFtZVtfX3Bvc10gPT0gX19jKSkKKwkJeworCQkgIC0tX19ubWF0Y2hlczsKKwkJICBfX21hdGNoZXNbX19pXSA9IF9fbWF0Y2hlc1tfX25tYXRjaGVzXTsKKwkJICBfX21hdGNoZXNfbGVuZ3Roc1tfX2ldID0gX19tYXRjaGVzX2xlbmd0aHNbX19ubWF0Y2hlc107CisJCX0KKwkgICAgICBlbHNlCisJCSsrX19pOworCSAgICB9CisJICBpZiAoX19uc2tpcHBlZCA9PSBfX25tYXRjaGVzKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIGlmICgoX19ubWF0Y2hlcyA9PSAxICYmIF9fbWF0Y2hlc19sZW5ndGhzWzBdID09IF9fcG9zKQorCSAgfHwgKF9fbm1hdGNoZXMgPT0gMiAmJiAoX19tYXRjaGVzX2xlbmd0aHNbMF0gPT0gX19wb3MKKwkJCQkgIHx8IF9fbWF0Y2hlc19sZW5ndGhzWzFdID09IF9fcG9zKSkpCisJX19tZW1iZXIgPSAoX19tYXRjaGVzWzBdID49IF9faW5kZXhsZW4KKwkJICAgID8gX19tYXRjaGVzWzBdIC0gX19pbmRleGxlbiA6IF9fbWF0Y2hlc1swXSk7CisgICAgICBlbHNlCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfdGltZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCWlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqICBfX3RpbWVzWzJdOworICAgICAgX190cC5fTV90aW1lX2Zvcm1hdHMoX190aW1lcyk7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCAKKwkJCQkgICAgX190bSwgX190aW1lc1swXSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfZGF0ZShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCWlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqICBfX2RhdGVzWzJdOworICAgICAgX190cC5fTV9kYXRlX2Zvcm1hdHMoX19kYXRlcyk7CisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3RfdmlhX2Zvcm1hdChfX2JlZywgX19lbmQsIF9faW8sIF9fZXJyLCAKKwkJCQkgICAgX190bSwgX19kYXRlc1swXSk7CisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfd2Vla2RheShpdGVyX3R5cGUgX19iZWcsIGl0ZXJfdHlwZSBfX2VuZCwgaW9zX2Jhc2UmIF9faW8sCisJCSAgIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxfQ2hhclQ+CQlfX3RyYWl0c190eXBlOworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZGF5c1sxNF07CisgICAgICBfX3RwLl9NX2RheXNfYWJicmV2aWF0ZWQoX19kYXlzKTsKKyAgICAgIF9fdHAuX01fZGF5cyhfX2RheXMgKyA3KTsKKyAgICAgIGludCBfX3RtcHdkYXk7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX3RtcGVyciA9IGlvc19iYXNlOjpnb29kYml0OworCisgICAgICBfX2JlZyA9IF9NX2V4dHJhY3Rfd2RheV9vcl9tb250aChfX2JlZywgX19lbmQsIF9fdG1wd2RheSwgX19kYXlzLCA3LAorCQkJCSAgICAgICBfX2lvLCBfX3RtcGVycik7CisgICAgICBpZiAoIV9fdG1wZXJyKQorCV9fdG0tPnRtX3dkYXkgPSBfX3RtcHdkYXk7CisgICAgICBlbHNlCisJX19lcnIgfD0gaW9zX2Jhc2U6OmZhaWxiaXQ7CisKKyAgICAgIGlmIChfX2JlZyA9PSBfX2VuZCkKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZW9mYml0OworICAgICAgcmV0dXJuIF9fYmVnOworICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyPgorICAgIF9Jbkl0ZXIKKyAgICB0aW1lX2dldDxfQ2hhclQsIF9Jbkl0ZXI+OjoKKyAgICBkb19nZXRfbW9udGhuYW1lKGl0ZXJfdHlwZSBfX2JlZywgaXRlcl90eXBlIF9fZW5kLAorICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2UmIF9faW8sIGlvc19iYXNlOjppb3N0YXRlJiBfX2VyciwgdG0qIF9fdG0pIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBjaGFyX3RyYWl0czxfQ2hhclQ+CQlfX3RyYWl0c190eXBlOworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjb25zdCBfX3RpbWVwdW5jdDxfQ2hhclQ+JiBfX3RwID0gdXNlX2ZhY2V0PF9fdGltZXB1bmN0PF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBjb25zdCBjaGFyX3R5cGUqICBfX21vbnRoc1syNF07CisgICAgICBfX3RwLl9NX21vbnRoc19hYmJyZXZpYXRlZChfX21vbnRocyk7CisgICAgICBfX3RwLl9NX21vbnRocyhfX21vbnRocyArIDEyKTsKKyAgICAgIGludCBfX3RtcG1vbjsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fdG1wZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF93ZGF5X29yX21vbnRoKF9fYmVnLCBfX2VuZCwgX190bXBtb24sIF9fbW9udGhzLCAxMiwKKwkJCQkgICAgICAgX19pbywgX190bXBlcnIpOworICAgICAgaWYgKCFfX3RtcGVycikKKwlfX3RtLT50bV9tb24gPSBfX3RtcG1vbjsKKyAgICAgIGVsc2UKKwlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKworICAgICAgaWYgKF9fYmVnID09IF9fZW5kKQorCV9fZXJyIHw9IGlvc19iYXNlOjplb2ZiaXQ7CisgICAgICByZXR1cm4gX19iZWc7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlcj4KKyAgICBfSW5JdGVyCisgICAgdGltZV9nZXQ8X0NoYXJULCBfSW5JdGVyPjo6CisgICAgZG9fZ2V0X3llYXIoaXRlcl90eXBlIF9fYmVnLCBpdGVyX3R5cGUgX19lbmQsIGlvc19iYXNlJiBfX2lvLAorCQlpb3NfYmFzZTo6aW9zdGF0ZSYgX19lcnIsIHRtKiBfX3RtKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IGxvY2FsZSYgX19sb2MgPSBfX2lvLl9NX2dldGxvYygpOworICAgICAgY29uc3QgY3R5cGU8X0NoYXJUPiYgX19jdHlwZSA9IHVzZV9mYWNldDxjdHlwZTxfQ2hhclQ+ID4oX19sb2MpOworICAgICAgaW50IF9fdG1weWVhcjsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fdG1wZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisKKyAgICAgIF9fYmVnID0gX01fZXh0cmFjdF9udW0oX19iZWcsIF9fZW5kLCBfX3RtcHllYXIsIDAsIDk5OTksIDQsCisJCQkgICAgIF9faW8sIF9fdG1wZXJyKTsKKyAgICAgIGlmICghX190bXBlcnIpCisJX190bS0+dG1feWVhciA9IF9fdG1weWVhciA8IDAgPyBfX3RtcHllYXIgKyAxMDAgOiBfX3RtcHllYXIgLSAxOTAwOworICAgICAgZWxzZQorCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCisgICAgICBpZiAoX19iZWcgPT0gX19lbmQpCisJX19lcnIgfD0gaW9zX2Jhc2U6OmVvZmJpdDsKKyAgICAgIHJldHVybiBfX2JlZzsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBwdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSBfX2ZpbGwsIGNvbnN0IHRtKiBfX3RtLAorCWNvbnN0IF9DaGFyVCogX19iZWcsIGNvbnN0IF9DaGFyVCogX19lbmQpIGNvbnN0CisgICAgeworICAgICAgY29uc3QgbG9jYWxlJiBfX2xvYyA9IF9faW8uX01fZ2V0bG9jKCk7CisgICAgICBjdHlwZTxfQ2hhclQ+IGNvbnN0JiBfX2N0eXBlID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX2xvYyk7CisgICAgICBmb3IgKDsgX19iZWcgIT0gX19lbmQ7ICsrX19iZWcpCisJaWYgKF9fY3R5cGUubmFycm93KCpfX2JlZywgMCkgIT0gJyUnKQorCSAgeworCSAgICAqX19zID0gKl9fYmVnOworCSAgICArK19fczsKKwkgIH0KKwllbHNlIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgeworCSAgICBjaGFyIF9fZm9ybWF0OworCSAgICBjaGFyIF9fbW9kID0gMDsKKwkgICAgY29uc3QgY2hhciBfX2MgPSBfX2N0eXBlLm5hcnJvdygqX19iZWcsIDApOworCSAgICBpZiAoX19jICE9ICdFJyAmJiBfX2MgIT0gJ08nKQorCSAgICAgIF9fZm9ybWF0ID0gX19jOworCSAgICBlbHNlIGlmICgrK19fYmVnICE9IF9fZW5kKQorCSAgICAgIHsKKwkJX19tb2QgPSBfX2M7CisJCV9fZm9ybWF0ID0gX19jdHlwZS5uYXJyb3coKl9fYmVnLCAwKTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKwkgICAgX19zID0gdGhpcy0+ZG9fcHV0KF9fcywgX19pbywgX19maWxsLCBfX3RtLCBfX2Zvcm1hdCwgX19tb2QpOworCSAgfQorCWVsc2UKKwkgIGJyZWFrOworICAgICAgcmV0dXJuIF9fczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlcj4KKyAgICBfT3V0SXRlcgorICAgIHRpbWVfcHV0PF9DaGFyVCwgX091dEl0ZXI+OjoKKyAgICBkb19wdXQoaXRlcl90eXBlIF9fcywgaW9zX2Jhc2UmIF9faW8sIGNoYXJfdHlwZSwgY29uc3QgdG0qIF9fdG0sCisJICAgY2hhciBfX2Zvcm1hdCwgY2hhciBfX21vZCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBsb2NhbGUmIF9fbG9jID0gX19pby5fTV9nZXRsb2MoKTsKKyAgICAgIGN0eXBlPF9DaGFyVD4gY29uc3QmIF9fY3R5cGUgPSB1c2VfZmFjZXQ8Y3R5cGU8X0NoYXJUPiA+KF9fbG9jKTsKKyAgICAgIF9fdGltZXB1bmN0PF9DaGFyVD4gY29uc3QmIF9fdHAgPSB1c2VfZmFjZXQ8X190aW1lcHVuY3Q8X0NoYXJUPiA+KF9fbG9jKTsKKworICAgICAgLy8gTkI6IFRoaXMgc2l6ZSBpcyBhcmJpdHJhcnkuIFNob3VsZCB0aGlzIGJlIGEgZGF0YSBtZW1iZXIsCisgICAgICAvLyBpbml0aWFsaXplZCBhdCBjb25zdHJ1Y3Rpb24/CisgICAgICBjb25zdCBzaXplX3QgX19tYXhsZW4gPSAxMjg7CisgICAgICBjaGFyX3R5cGUgX19yZXNbX19tYXhsZW5dOworCisgICAgICAvLyBOQjogSW4gSUVFIDEwMDMuMS0yMDB4LCBhbmQgcGVyaGFwcyBvdGhlciBsb2NhbGUgbW9kZWxzLCBpdAorICAgICAgLy8gaXMgcG9zc2libGUgdGhhdCB0aGUgZm9ybWF0IGNoYXJhY3RlciB3aWxsIGJlIGxvbmdlciB0aGFuIG9uZQorICAgICAgLy8gY2hhcmFjdGVyLiBQb3NzaWJpbGl0aWVzIGluY2x1ZGUgJ0UnIG9yICdPJyBmb2xsb3dlZCBieSBhCisgICAgICAvLyBmb3JtYXQgY2hhcmFjdGVyOiBpZiBfX21vZCBpcyBub3QgdGhlIGRlZmF1bHQgYXJndW1lbnQsIGFzc3VtZQorICAgICAgLy8gaXQncyBhIHZhbGlkIG1vZGlmaWVyLgorICAgICAgY2hhcl90eXBlIF9fZm10WzRdOworICAgICAgX19mbXRbMF0gPSBfX2N0eXBlLndpZGVuKCclJyk7CisgICAgICBpZiAoIV9fbW9kKQorCXsKKwkgIF9fZm10WzFdID0gX19mb3JtYXQ7CisJICBfX2ZtdFsyXSA9IGNoYXJfdHlwZSgpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX2ZtdFsxXSA9IF9fbW9kOworCSAgX19mbXRbMl0gPSBfX2Zvcm1hdDsKKwkgIF9fZm10WzNdID0gY2hhcl90eXBlKCk7CisJfQorCisgICAgICBfX3RwLl9NX3B1dChfX3JlcywgX19tYXhsZW4sIF9fZm10LCBfX3RtKTsKKworICAgICAgLy8gV3JpdGUgcmVzdWx0aW5nLCBmdWxseS1mb3JtYXR0ZWQgc3RyaW5nIHRvIG91dHB1dCBpdGVyYXRvci4KKyAgICAgIHJldHVybiBzdGQ6Ol9fd3JpdGUoX19zLCBfX3JlcywgY2hhcl90cmFpdHM8Y2hhcl90eXBlPjo6bGVuZ3RoKF9fcmVzKSk7CisgICAgfQorCisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0PGNoYXIsIGZhbHNlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCBmYWxzZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTxjaGFyLCB0cnVlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X2dldDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X3B1dDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9fdGltZXB1bmN0PGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9wdXQ8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX3B1dF9ieW5hbWU8Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldDxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1lc3NhZ2VzPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbWVzc2FnZXNfYnluYW1lPGNoYXI+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4mCisgICAgdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8Y2hhciwgdHJ1ZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leXB1bmN0PGNoYXIsIGZhbHNlPiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlwdW5jdDxjaGFyLCBmYWxzZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leV9wdXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PG1vbmV5X3B1dDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5X2dldDxjaGFyPiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlfZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgX190aW1lcHVuY3Q8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PF9fdGltZXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9wdXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PHRpbWVfcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9nZXQ8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PHRpbWVfZ2V0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbWVzc2FnZXM8Y2hhcj4mCisgICAgdXNlX2ZhY2V0PG1lc3NhZ2VzPGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leXB1bmN0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leV9wdXQ8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG1vbmV5X2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8X190aW1lcHVuY3Q8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PHRpbWVfcHV0PGNoYXI+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDx0aW1lX2dldDxjaGFyPiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bWVzc2FnZXM8Y2hhcj4gPihjb25zdCBsb2NhbGUmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCBmYWxzZT47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBtb25leXB1bmN0X2J5bmFtZTx3Y2hhcl90LCB0cnVlPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X2dldDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9HTElCQ1hYX05BTUVTUEFDRV9MREJMIG1vbmV5X3B1dDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIF9fdGltZXB1bmN0PHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgdGltZV9wdXQ8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX3B1dF9ieW5hbWU8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyB0aW1lX2dldDx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHRpbWVfZ2V0X2J5bmFtZTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG1lc3NhZ2VzPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgbWVzc2FnZXNfYnluYW1lPHdjaGFyX3Q+OworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4mCisgICAgdXNlX2ZhY2V0PG1vbmV5cHVuY3Q8d2NoYXJfdCwgdHJ1ZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leXB1bmN0PHdjaGFyX3QsIGZhbHNlPiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlwdW5jdDx3Y2hhcl90LCBmYWxzZT4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBjb25zdCBtb25leV9wdXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PG1vbmV5X3B1dDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGNvbnN0IG1vbmV5X2dldDx3Y2hhcl90PiYKKyAgICB1c2VfZmFjZXQ8bW9uZXlfZ2V0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgX190aW1lcHVuY3Q8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PF9fdGltZXB1bmN0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9wdXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PHRpbWVfcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgdGltZV9nZXQ8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PHRpbWVfZ2V0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgY29uc3QgbWVzc2FnZXM8d2NoYXJfdD4mCisgICAgdXNlX2ZhY2V0PG1lc3NhZ2VzPHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leXB1bmN0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDxtb25leV9wdXQ8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PG1vbmV5X2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8X190aW1lcHVuY3Q8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKworICBleHRlcm4gdGVtcGxhdGUKKyAgICBib29sCisgICAgaGFzX2ZhY2V0PHRpbWVfcHV0PHdjaGFyX3Q+ID4oY29uc3QgbG9jYWxlJik7CisKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgYm9vbAorICAgIGhhc19mYWNldDx0aW1lX2dldDx3Y2hhcl90PiA+KGNvbnN0IGxvY2FsZSYpOworCisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIGJvb2wKKyAgICBoYXNfZmFjZXQ8bWVzc2FnZXM8d2NoYXJfdD4gPihjb25zdCBsb2NhbGUmKTsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZWZ3ZC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL2xvY2FsZWZ3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTdkZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbG9jYWxlZndkLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2xvY2FsZWZ3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisjaWZuZGVmIF9MT0NBTEVfRldEX0gKKyNkZWZpbmUgX0xPQ0FMRV9GV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jKytsb2NhbGUuaD4gIC8vIERlZmluZXMgX19jX2xvY2FsZSwgY29uZmlnLXNwZWNpZmljIGluY2x1ZGUKKyNpbmNsdWRlIDxpb3Nmd2Q+ICAgICAgICAgICAgLy8gRm9yIG9zdHJlYW1idWZfaXRlcmF0b3IsIGlzdHJlYW1idWZfaXRlcmF0b3IKKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogCisgICAqICBAZGVmZ3JvdXAgbG9jYWxlcyBMb2NhbGVzCisgICAqCisgICAqICBDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGl6YXRpb24uCisgICAqLworCisgIC8vIDIyLjEuMSBMb2NhbGUKKyAgY2xhc3MgbG9jYWxlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GYWNldD4KKyAgICBib29sCisgICAgaGFzX2ZhY2V0KGNvbnN0IGxvY2FsZSYpIHRocm93KCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZhY2V0PgorICAgIGNvbnN0IF9GYWNldCYKKyAgICB1c2VfZmFjZXQoY29uc3QgbG9jYWxlJik7CisKKyAgLy8gMjIuMS4zIENvbnZlbmllbmNlIGludGVyZmFjZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3NwYWNlKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3ByaW50KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2NudHJsKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3VwcGVyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2xvd2VyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2FscGhhKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc2RpZ2l0KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3B1bmN0KF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGJvb2wKKyAgICBpc3hkaWdpdChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNhbG51bShfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBib29sCisgICAgaXNncmFwaChfQ2hhclQsIGNvbnN0IGxvY2FsZSYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfQ2hhclQKKyAgICB0b3VwcGVyKF9DaGFyVCwgY29uc3QgbG9jYWxlJik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9DaGFyVAorICAgIHRvbG93ZXIoX0NoYXJULCBjb25zdCBsb2NhbGUmKTsKKworICAvLyAyMi4yLjEgYW5kIDIyLjIuMS4zIGN0eXBlCisgIGNsYXNzIGN0eXBlX2Jhc2U7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjdHlwZTsKKyAgdGVtcGxhdGU8PiBjbGFzcyBjdHlwZTxjaGFyPjsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+IGNsYXNzIGN0eXBlPHdjaGFyX3Q+OworI2VuZGlmCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjdHlwZV9ieW5hbWU7CisgIC8vIE5COiBTcGVjaWFsaXplZCBmb3IgY2hhciBhbmQgd2NoYXJfdCBpbiBsb2NhbGVfZmFjZXRzLmguCisKKyAgY2xhc3MgY29kZWN2dF9iYXNlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQsIHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgY29kZWN2dDsKKyAgdGVtcGxhdGU8PiBjbGFzcyBjb2RlY3Z0PGNoYXIsIGNoYXIsIG1ic3RhdGVfdD47CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PiBjbGFzcyBjb2RlY3Z0PHdjaGFyX3QsIGNoYXIsIG1ic3RhdGVfdD47CisjZW5kaWYKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5ULCB0eXBlbmFtZSBfU3RhdGVUPgorICAgIGNsYXNzIGNvZGVjdnRfYnluYW1lOworCisgIC8vIDIyLjIuMiBhbmQgMjIuMi4zIG51bWVyaWMKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX0luSXRlciA9IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbnVtX2dldDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbnVtX3B1dDsKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzIG51bXB1bmN0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzIG51bXB1bmN0X2J5bmFtZTsKKworICAvLyAyMi4yLjQgY29sbGF0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBjb2xsYXRlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+IGNsYXNzCisgICAgY29sbGF0ZV9ieW5hbWU7CisKKyAgLy8gMjIuMi41IGRhdGUgYW5kIHRpbWUKKyAgY2xhc3MgdGltZV9iYXNlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9Jbkl0ZXIgPSAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyB0aW1lX2dldDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyID0gIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgdGltZV9nZXRfYnluYW1lOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyB0aW1lX3B1dDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfT3V0SXRlciA9IG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgdGltZV9wdXRfYnluYW1lOworCisgIC8vIDIyLjIuNiBtb25leQorICBjbGFzcyBtb25leV9iYXNlOworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfSW5JdGVyID0gIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgbW9uZXlfZ2V0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9PdXRJdGVyID0gb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBtb25leV9wdXQ7CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsID0gZmFsc2U+CisgICAgY2xhc3MgbW9uZXlwdW5jdDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCBib29sIF9JbnRsID0gZmFsc2U+CisgICAgY2xhc3MgbW9uZXlwdW5jdF9ieW5hbWU7CisKKyAgLy8gMjIuMi43IG1lc3NhZ2UgcmV0cmlldmFsCisgIGNsYXNzIG1lc3NhZ2VzX2Jhc2U7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBjbGFzcyBtZXNzYWdlczsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIG1lc3NhZ2VzX2J5bmFtZTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9tYXNrX2FycmF5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbWFza19hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjUyYTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbWFza19hcnJheS5oCkBAIC0wLDAgKzEsMjA5IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSBtYXNrX2FycmF5IGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDksIDIwMTAKKy8vICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9tYXNrX2FycmF5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfTUFTS19BUlJBWV9ICisjZGVmaW5lIF9NQVNLX0FSUkFZX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgbnVtZXJpY19hcnJheXMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJlZmVyZW5jZSB0byBzZWxlY3RlZCBzdWJzZXQgb2YgYW4gYXJyYXkuCisgICAqCisgICAqICBBIG1hc2tfYXJyYXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheSBzcGVjaWZpZWQKKyAgICogIGJ5IGEgYml0bWFzayBpbiB0aGUgZm9ybSBvZiBhbiBhcnJheSBvZiBib29sLiAgVGhlIHdheSB0byBnZXQgYQorICAgKiAgbWFza19hcnJheSBpcyB0byBjYWxsIG9wZXJhdG9yW10odmFsYXJyYXk8Ym9vbD4pIG9uIGEgdmFsYXJyYXkuICBUaGUKKyAgICogIHJldHVybmVkIG1hc2tfYXJyYXkgdGhlbiBwZXJtaXRzIGNhcnJ5aW5nIG9wZXJhdGlvbnMgb3V0IG9uIHRoZQorICAgKiAgcmVmZXJlbmNlZCBzdWJzZXQgb2YgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIHZhbGFycmF5LgorICAgKgorICAgKiAgRm9yIGV4YW1wbGUsIGlmIGEgbWFza19hcnJheSBpcyBvYnRhaW5lZCB1c2luZyB0aGUgYXJyYXkgKGZhbHNlLCB0cnVlLAorICAgKiAgZmFsc2UsIHRydWUpIGFzIGFuIGFyZ3VtZW50LCB0aGUgbWFzayBhcnJheSBoYXMgdHdvIGVsZW1lbnRzIHJlZmVycmluZworICAgKiAgdG8gYXJyYXlbMV0gYW5kIGFycmF5WzNdIGluIHRoZSB1bmRlcmx5aW5nIGFycmF5LgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgRWxlbWVudCB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBjbGFzcyBtYXNrX2FycmF5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1My4gdmFsYXJyYXkgaGVscGVyIGZ1bmN0aW9ucyBhcmUgYWxtb3N0IGVudGlyZWx5IHVzZWxlc3MKKworICAgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLiAgQm90aCBzbGljZXMgcmVmZXIgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBhcnJheS4KKyAgICAgIG1hc2tfYXJyYXkgKGNvbnN0IG1hc2tfYXJyYXkmKTsKKyAgICAgIAorICAgICAgLy8vICBBc3NpZ25tZW50IG9wZXJhdG9yLiAgQXNzaWducyBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nIGVsZW1lbnRzCisgICAgICAvLy8gIG9mIEBhIGEuCisgICAgICBtYXNrX2FycmF5JiBvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheSYpOworCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE11bHRpcGx5IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIERpdmlkZSBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBNb2R1bG8gc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgQWRkIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiB0byBzbGljZSBlbGVtZW50cy4KKyAgICAgIHZvaWQgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFN1YnRyYWN0IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiBmcm9tIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCB4b3Igc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIGFuZCBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3ImPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgb3Igc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMZWZ0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBSaWdodCBzaGlmdCBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgQXNzaWduIGFsbCBzbGljZSBlbGVtZW50cyB0byBAYSB0LgorICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1RwJikgY29uc3Q7CisKKyAgICAgICAgLy8gICAgICAgIH5tYXNrX2FycmF5ICgpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IqPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IlPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3IrPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3JePShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3ImPShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3J8PShjb25zdCBfRXhwcjxfRG9tLF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JikgY29uc3Q7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByPF9Eb20sX1RwPiYpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIG1hc2tfYXJyYXkoX0FycmF5PF9UcD4sIHNpemVfdCwgX0FycmF5PGJvb2w+KTsKKyAgICAgIGZyaWVuZCBjbGFzcyB2YWxhcnJheTxfVHA+OworCisgICAgICBjb25zdCBzaXplX3QgICAgICAgX01fc3o7CisgICAgICBjb25zdCBfQXJyYXk8Ym9vbD4gX01fbWFzazsKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+ICBfTV9hcnJheTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBtYXNrX2FycmF5KCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIG1hc2tfYXJyYXk8X1RwPjo6bWFza19hcnJheShjb25zdCBtYXNrX2FycmF5PF9UcD4mIGEpCisgICAgOiBfTV9zeihhLl9NX3N6KSwgX01fbWFzayhhLl9NX21hc2spLCBfTV9hcnJheShhLl9NX2FycmF5KSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBtYXNrX2FycmF5PF9UcD46Om1hc2tfYXJyYXkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19zLCBfQXJyYXk8Ym9vbD4gX19tKQorICAgIDogX01fc3ooX19zKSwgX01fbWFzayhfX20pLCBfTV9hcnJheShfX2EpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBtYXNrX2FycmF5PF9UcD4mCisgICAgbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgbWFza19hcnJheTxfVHA+JiBfX2EpCisgICAgeworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2FycmF5LCBfX2EuX01fbWFzaywKKwkJCSAgIF9NX3N6LCBfTV9hcnJheSwgX01fbWFzayk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIG1hc2tfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX01fYXJyYXksIF9NX3N6LCBfTV9tYXNrLCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgbWFza19hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KSBjb25zdAorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4oX192KSwgX192LnNpemUoKSwgX01fYXJyYXksIF9NX21hc2spOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHRlbXBsYXRlPGNsYXNzIF9FeD4KKyAgICAgIGlubGluZSB2b2lkCisgICAgICBtYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfRXhwcjxfRXgsIF9UcD4mIF9fZSkgY29uc3QKKyAgICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19lLCBfX2Uuc2l6ZSgpLCBfTV9hcnJheSwgX01fbWFzayk7IH0KKworI3VuZGVmIF9ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUihfT3AsIF9OYW1lKQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBtYXNrX2FycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9tYXNrLAkJCVwKKwkJCSAgICAgICBfQXJyYXk8X1RwPihfX3YpLCBfX3Yuc2l6ZSgpKTsJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW5saW5lIHZvaWQJCQkJCQkJXAorICAgICAgbWFza19hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lKSBjb25zdFwKKyAgICAgIHsJCQkJCQkJCQlcCisJX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9NX2FycmF5LCBfTV9tYXNrLCBfX2UsIF9fZS5zaXplKCkpOyAgIFwKKyAgICAgIH0KKworX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigqLCBfX211bHRpcGxpZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SCisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX01BU0tfQVJSQVlfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL21vdmUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9tb3ZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MTg5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9tb3ZlLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8vIE1vdmUsIGZvcndhcmQgYW5kIGlkZW50aXR5IGZvciBDKysweCArIHN3YXAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL21vdmUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3V0aWxpdHl9CisgKi8KKworI2lmbmRlZiBfTU9WRV9ICisjZGVmaW5lIF9NT1ZFX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFVzZWQsIGluIEMrKzAzIG1vZGUgdG9vLCBieSBhbGxvY2F0b3JzLCBldGMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwKgorICAgIF9fYWRkcmVzc29mKF9UcCYgX19yKQorICAgIHsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PF9UcCo+CisJKCZjb25zdF9jYXN0PGNoYXImPihyZWludGVycHJldF9jYXN0PGNvbnN0IHZvbGF0aWxlIGNoYXImPihfX3IpKSk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPiAvLyBCcmluZ3MgaW4gc3RkOjpkZWNsdmFsIHRvby4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorICAKKyAgLy8vIGZvcndhcmQgKGFzIHBlciBOMzE0MykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAmJgorICAgIGZvcndhcmQodHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUmIF9fdCkgCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwJiY+KF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcCYmCisgICAgZm9yd2FyZCh0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYmIF9fdCkgCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQiCisJCSAgICAiIHN1YnN0aXR1dGluZyBfVHAgaXMgYW4gbHZhbHVlIHJlZmVyZW5jZSB0eXBlIik7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwJiY+KF9fdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIE1vdmUgYSB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgX190ICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiBTYW1lLCBtb3ZlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSYmCisgICAgbW92ZShfVHAmJiBfX3QpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUmJj4oX190KTsgfQorCisgIC8vLyBkZWNsdmFsLCBmcm9tIHR5cGVfdHJhaXRzLgorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybnMgdGhlIGFjdHVhbCBhZGRyZXNzIG9mIHRoZSBvYmplY3Qgb3IgZnVuY3Rpb24KKyAgICogICAgICAgICByZWZlcmVuY2VkIGJ5IHIsIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIGFuIG92ZXJsb2FkZWQKKyAgICogICAgICAgICBvcGVyYXRvciYuCisgICAqICBAcGFyYW0gIF9fciAgUmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvciBmdW5jdGlvbi4KKyAgICogIEByZXR1cm4gICBUaGUgYWN0dWFsIGFkZHJlc3MuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwKgorICAgIGFkZHJlc3NvZihfVHAmIF9fcikKKyAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fcik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZGVmaW5lIF9HTElCQ1hYX01PVkUoX192YWwpIHN0ZDo6bW92ZShfX3ZhbCkKKyNkZWZpbmUgX0dMSUJDWFhfRk9SV0FSRChfVHAsIF9fdmFsKSBzdGQ6OmZvcndhcmQ8X1RwPihfX3ZhbCkKKyNlbHNlCisjZGVmaW5lIF9HTElCQ1hYX01PVkUoX192YWwpIChfX3ZhbCkKKyNkZWZpbmUgX0dMSUJDWFhfRk9SV0FSRChfVHAsIF9fdmFsKSAoX192YWwpCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIFN3YXBzIHR3byB2YWx1ZXMuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIF9fYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgX19iICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX1RwJiBfX2EsIF9UcCYgX19iKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1NHSUFzc2lnbmFibGVDb25jZXB0PF9UcD4pCisKKyAgICAgIF9UcCBfX3RtcCA9IF9HTElCQ1hYX01PVkUoX19hKTsKKyAgICAgIF9fYSA9IF9HTElCQ1hYX01PVkUoX19iKTsKKyAgICAgIF9fYiA9IF9HTElCQ1hYX01PVkUoX190bXApOworICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIERSIDgwOS4gc3RkOjpzd2FwIHNob3VsZCBiZSBvdmVybG9hZGVkIGZvciBhcnJheSB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfVHAgKCZfX2EpW19ObV0sIF9UcCAoJl9fYilbX05tXSkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX24gPSAwOyBfX24gPCBfTm07ICsrX19uKQorCXN3YXAoX19hW19fbl0sIF9fYltfX25dKTsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9NT1ZFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9uZXN0ZWRfZXhjZXB0aW9uLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbmVzdGVkX2V4Y2VwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ODA0YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvbmVzdGVkX2V4Y2VwdGlvbi5oCkBAIC0wLDAgKzEsMTY2IEBACisvLyBOZXN0ZWQgRXhjZXB0aW9uIHN1cHBvcnQgaGVhZGVyIChuZXN0ZWRfZXhjZXB0aW9uIGNsYXNzKSBmb3IgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL25lc3RlZF9leGNlcHRpb24uaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4Y2VwdGlvbn0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX05FU1RFRF9FWENFUFRJT05fSAorI2RlZmluZSBfR0xJQkNYWF9ORVNURURfRVhDRVBUSU9OX0ggMQorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgIWRlZmluZWQoX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzQpCisjICBlcnJvciBUaGlzIHBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgZXhjZXB0aW9uIHByb3BhZ2F0aW9uLgorI2VuZGlmCisKK2V4dGVybiAiQysrIiB7CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGV4Y2VwdGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLy8vIEV4Y2VwdGlvbiBjbGFzcyB3aXRoIGV4Y2VwdGlvbl9wdHIgZGF0YSBtZW1iZXIuCisgIGNsYXNzIG5lc3RlZF9leGNlcHRpb24KKyAgeworICAgIGV4Y2VwdGlvbl9wdHIgX01fcHRyOworCisgIHB1YmxpYzoKKyAgICBuZXN0ZWRfZXhjZXB0aW9uKCkgdGhyb3coKSA6IF9NX3B0cihjdXJyZW50X2V4Y2VwdGlvbigpKSB7IH0KKworICAgIG5lc3RlZF9leGNlcHRpb24oY29uc3QgbmVzdGVkX2V4Y2VwdGlvbiYpID0gZGVmYXVsdDsKKworICAgIG5lc3RlZF9leGNlcHRpb24mIG9wZXJhdG9yPShjb25zdCBuZXN0ZWRfZXhjZXB0aW9uJikgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+bmVzdGVkX2V4Y2VwdGlvbigpOworCisgICAgdm9pZAorICAgIHJldGhyb3dfbmVzdGVkKCkgY29uc3QgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpCisgICAgeyByZXRocm93X2V4Y2VwdGlvbihfTV9wdHIpOyB9CisKKyAgICBleGNlcHRpb25fcHRyCisgICAgbmVzdGVkX3B0cigpIGNvbnN0CisgICAgeyByZXR1cm4gX01fcHRyOyB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4Y2VwdD4KKyAgICBzdHJ1Y3QgX05lc3RlZF9leGNlcHRpb24gOiBwdWJsaWMgX0V4Y2VwdCwgcHVibGljIG5lc3RlZF9leGNlcHRpb24KKyAgICB7CisgICAgICBleHBsaWNpdCBfTmVzdGVkX2V4Y2VwdGlvbihfRXhjZXB0JiYgX19leCkKKyAgICAgIDogX0V4Y2VwdChzdGF0aWNfY2FzdDxfRXhjZXB0JiY+KF9fZXgpKQorICAgICAgeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgc3RydWN0IF9fZ2V0X25lc3RlZF9oZWxwZXIKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgbmVzdGVkX2V4Y2VwdGlvbioKKyAgICAgIF9TX2dldChjb25zdCBfRXgmIF9fZXgpCisgICAgICB7IHJldHVybiBkeW5hbWljX2Nhc3Q8Y29uc3QgbmVzdGVkX2V4Y2VwdGlvbio+KCZfX2V4KTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIHN0cnVjdCBfX2dldF9uZXN0ZWRfaGVscGVyPF9FeCo+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IG5lc3RlZF9leGNlcHRpb24qCisgICAgICBfU19nZXQoY29uc3QgX0V4KiBfX2V4KQorICAgICAgeyByZXR1cm4gZHluYW1pY19jYXN0PGNvbnN0IG5lc3RlZF9leGNlcHRpb24qPihfX2V4KTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGlubGluZSBjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKgorICAgIF9fZ2V0X25lc3RlZF9leGNlcHRpb24oY29uc3QgX0V4JiBfX2V4KQorICAgIHsgcmV0dXJuIF9fZ2V0X25lc3RlZF9oZWxwZXI8X0V4Pjo6X1NfZ2V0KF9fZXgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIHZvaWQKKyAgICBfX3Rocm93X3dpdGhfbmVzdGVkKF9FeCYmLCBjb25zdCBuZXN0ZWRfZXhjZXB0aW9uKiA9IDApCisgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICB2b2lkCisgICAgX190aHJvd193aXRoX25lc3RlZChfRXgmJiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLCBidXQgaXMgbmVlZGVkIHRvIGF2b2lkIGEgd2FybmluZworICAvLyBhYm91dCBhbWJpZ3VvdXMgYmFzZSBjbGFzc2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aHJvd193aXRoX25lc3RlZDxfRXg+KCkKKyAgLy8gd2l0aCBhIHR5cGUgdGhhdCBoYXMgYW4gYWNjZXNzaWJsZSBuZXN0ZWRfZXhjZXB0aW9uIGJhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdGhyb3dfd2l0aF9uZXN0ZWQoX0V4JiYgX19leCwgY29uc3QgbmVzdGVkX2V4Y2VwdGlvbiopCisgICAgeyB0aHJvdyBfX2V4OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGlubGluZSB2b2lkCisgICAgX190aHJvd193aXRoX25lc3RlZChfRXgmJiBfX2V4LCAuLi4pCisgICAgeyB0aHJvdyBfTmVzdGVkX2V4Y2VwdGlvbjxfRXg+KHN0YXRpY19jYXN0PF9FeCYmPihfX2V4KSk7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9FeD4KKyAgICB2b2lkCisgICAgdGhyb3dfd2l0aF9uZXN0ZWQoX0V4IF9fZXgpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvLy8gSWYgQHAgX19leCBpcyBkZXJpdmVkIGZyb20gbmVzdGVkX2V4Y2VwdGlvbiwgQHAgX19leC4gCisgIC8vLyBFbHNlLCBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG9iamVjdCBkZXJpdmVkIGZyb20gYm90aC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V4PgorICAgIGlubGluZSB2b2lkCisgICAgdGhyb3dfd2l0aF9uZXN0ZWQoX0V4IF9fZXgpCisgICAgeworICAgICAgaWYgKF9fZ2V0X25lc3RlZF9leGNlcHRpb24oX19leCkpCisgICAgICAgIHRocm93IF9fZXg7CisgICAgICBfX3Rocm93X3dpdGhfbmVzdGVkKHN0YXRpY19jYXN0PF9FeCYmPihfX2V4KSwgJl9fZXgpOworICAgIH0KKworICAvLy8gSWYgQHAgX19leCBpcyBkZXJpdmVkIGZyb20gbmVzdGVkX2V4Y2VwdGlvbiwgQHAgX19leC5yZXRocm93X25lc3RlZCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXg+CisgICAgaW5saW5lIHZvaWQKKyAgICByZXRocm93X2lmX25lc3RlZChjb25zdCBfRXgmIF9fZXgpCisgICAgeworICAgICAgaWYgKGNvbnN0IG5lc3RlZF9leGNlcHRpb24qIF9fbmVzdGVkID0gX19nZXRfbmVzdGVkX2V4Y2VwdGlvbihfX2V4KSkKKyAgICAgICAgX19uZXN0ZWQtPnJldGhyb3dfbmVzdGVkKCk7CisgICAgfQorCisgIC8vLyBPdmVybG9hZCwgU2VlIE4yNjE5CisgIGlubGluZSB2b2lkCisgIHJldGhyb3dfaWZfbmVzdGVkKGNvbnN0IG5lc3RlZF9leGNlcHRpb24mIF9fZXgpCisgIHsgX19leC5yZXRocm93X25lc3RlZCgpOyB9CisKKyAgLy8gQH0gZ3JvdXAgZXhjZXB0aW9ucworfSAvLyBuYW1lc3BhY2Ugc3RkCisKK30gLy8gZXh0ZXJuICJDKysiCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYgLy8gX0dMSUJDWFhfTkVTVEVEX0VYQ0VQVElPTl9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvb3N0cmVhbS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvb3N0cmVhbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkY2U2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9vc3RyZWFtLnRjYwpAQCAtMCwwICsxLDQwOSBAQAorLy8gb3N0cmVhbSBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29zdHJlYW0udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7b3N0cmVhbX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNi4yICBPdXRwdXQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfT1NUUkVBTV9UQ0MKKyNkZWZpbmUgX09TVFJFQU1fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnk6OgorICAgIHNlbnRyeShiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCisgICAgOiBfTV9vayhmYWxzZSksIF9NX29zKF9fb3MpCisgICAgeworICAgICAgLy8gWFhYIE1UCisgICAgICBpZiAoX19vcy50aWUoKSAmJiBfX29zLmdvb2QoKSkKKwlfX29zLnRpZSgpLT5mbHVzaCgpOworCisgICAgICBpZiAoX19vcy5nb29kKCkpCisJX01fb2sgPSB0cnVlOworICAgICAgZWxzZQorCV9fb3Muc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6CisgICAgICBfTV9pbnNlcnQoX1ZhbHVlVCBfX3YpCisgICAgICB7CisJc2VudHJ5IF9fY2VyYigqdGhpcyk7CisJaWYgKF9fY2VyYikKKwkgIHsKKwkgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKwkgICAgX190cnkKKwkgICAgICB7CisJCWNvbnN0IF9fbnVtX3B1dF90eXBlJiBfX25wID0gX19jaGVja19mYWNldCh0aGlzLT5fTV9udW1fcHV0KTsKKwkJaWYgKF9fbnAucHV0KCp0aGlzLCAqdGhpcywgdGhpcy0+ZmlsbCgpLCBfX3YpLmZhaWxlZCgpKQorCQkgIF9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJICAgICAgfQorCSAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgICAgeworCQl0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwkgICAgaWYgKF9fZXJyKQorCSAgICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPDwoc2hvcnQgX19uKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExNy4gYmFzaWNfb3N0cmVhbSB1c2VzIG5vbmV4aXN0ZW50IG51bV9wdXQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICAgIGNvbnN0IGlvc19iYXNlOjpmbXRmbGFncyBfX2ZtdCA9IHRoaXMtPmZsYWdzKCkgJiBpb3NfYmFzZTo6YmFzZWZpZWxkOworICAgICAgaWYgKF9fZm10ID09IGlvc19iYXNlOjpvY3QgfHwgX19mbXQgPT0gaW9zX2Jhc2U6OmhleCkKKwlyZXR1cm4gX01faW5zZXJ0KHN0YXRpY19jYXN0PGxvbmc+KHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihfX24pKSk7CisgICAgICBlbHNlCisJcmV0dXJuIF9NX2luc2VydChzdGF0aWNfY2FzdDxsb25nPihfX24pKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIG9wZXJhdG9yPDwoaW50IF9fbikKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMTcuIGJhc2ljX29zdHJlYW0gdXNlcyBub25leGlzdGVudCBudW1fcHV0IG1lbWJlciBmdW5jdGlvbnMuCisgICAgICBjb25zdCBpb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbXQgPSB0aGlzLT5mbGFncygpICYgaW9zX2Jhc2U6OmJhc2VmaWVsZDsKKyAgICAgIGlmIChfX2ZtdCA9PSBpb3NfYmFzZTo6b2N0IHx8IF9fZm10ID09IGlvc19iYXNlOjpoZXgpCisJcmV0dXJuIF9NX2luc2VydChzdGF0aWNfY2FzdDxsb25nPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KF9fbikpKTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX01faW5zZXJ0KHN0YXRpY19jYXN0PGxvbmc+KF9fbikpOworICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcjw8KF9fc3RyZWFtYnVmX3R5cGUqIF9fc2JpbikKKyAgICB7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcyk7CisgICAgICBpZiAoX19jZXJiICYmIF9fc2JpbikKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgaWYgKCFfX2NvcHlfc3RyZWFtYnVmcyhfX3NiaW4sIHRoaXMtPnJkYnVmKCkpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgfQorCSAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCSAgICB7CisJICAgICAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOyB9CisJfQorICAgICAgZWxzZSBpZiAoIV9fc2JpbikKKwlfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHB1dChjaGFyX3R5cGUgX19jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworICAgICAgLy8gYmFzaWNfb3N0cmVhbTo6cHV0KGNoYXJfdHlwZSkgaXMgYW4gdW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9uLgorICAgICAgLy8gRFIgNjMuIEV4Y2VwdGlvbi1oYW5kbGluZyBwb2xpY3kgZm9yIHVuZm9ybWF0dGVkIG91dHB1dC4KKyAgICAgIC8vIFVuZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMgc2hvdWxkIGNhdGNoIGV4Y2VwdGlvbnMgdGhyb3duCisgICAgICAvLyBmcm9tIHN0cmVhbWJ1ZiBtZW1iZXJzLgorICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcyk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgY29uc3QgaW50X3R5cGUgX19wdXQgPSB0aGlzLT5yZGJ1ZigpLT5zcHV0YyhfX2MpOworCSAgICAgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19wdXQsIHRyYWl0c190eXBlOjplb2YoKSkpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpiYWRiaXQ7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisJICBpZiAoX19lcnIpCisJICAgIHRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICB3cml0ZShjb25zdCBfQ2hhclQqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgNjAuIFdoYXQgaXMgYSBmb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb24/CisgICAgICAvLyBiYXNpY19vc3RyZWFtOjp3cml0ZShjb25zdCBjaGFyX3R5cGUqLCBzdHJlYW1zaXplKSBpcyBhbgorICAgICAgLy8gdW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9uLgorICAgICAgLy8gRFIgNjMuIEV4Y2VwdGlvbi1oYW5kbGluZyBwb2xpY3kgZm9yIHVuZm9ybWF0dGVkIG91dHB1dC4KKyAgICAgIC8vIFVuZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMgc2hvdWxkIGNhdGNoIGV4Y2VwdGlvbnMgdGhyb3duCisgICAgICAvLyBmcm9tIHN0cmVhbWJ1ZiBtZW1iZXJzLgorICAgICAgc2VudHJ5IF9fY2VyYigqdGhpcyk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsgX01fd3JpdGUoX19zLCBfX24pOyB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIGZsdXNoKCkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA2MC4gV2hhdCBpcyBhIGZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbj8KKyAgICAgIC8vIGJhc2ljX29zdHJlYW06OmZsdXNoKCkgaXMgKm5vdCogYW4gdW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9uLgorICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKHRoaXMtPnJkYnVmKCkgJiYgdGhpcy0+cmRidWYoKS0+cHVic3luYygpID09IC0xKQorCSAgICBfX2VyciB8PSBpb3NfYmFzZTo6YmFkYml0OworCX0KKyAgICAgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwl7CisJICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHR5cGVuYW1lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6cG9zX3R5cGUKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHRlbGxwKCkKKyAgICB7CisgICAgICBwb3NfdHlwZSBfX3JldCA9IHBvc190eXBlKC0xKTsKKyAgICAgIF9fdHJ5CisJeworCSAgaWYgKCF0aGlzLT5mYWlsKCkpCisJICAgIF9fcmV0ID0gdGhpcy0+cmRidWYoKS0+cHVic2Vla29mZigwLCBpb3NfYmFzZTo6Y3VyLCBpb3NfYmFzZTo6b3V0KTsKKwl9CisgICAgICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJeworCSAgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CQkKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsgdGhpcy0+X01fc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7IH0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHNlZWtwKHBvc190eXBlIF9fcG9zKQorICAgIHsKKyAgICAgIGlvc19iYXNlOjppb3N0YXRlIF9fZXJyID0gaW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICBfX3RyeQorCXsKKwkgIGlmICghdGhpcy0+ZmFpbCgpKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDEzNi4gIHNlZWtwLCBzZWVrZyBzZXR0aW5nIHdyb25nIHN0cmVhbXM/CisJICAgICAgY29uc3QgcG9zX3R5cGUgX19wID0gdGhpcy0+cmRidWYoKS0+cHVic2Vla3BvcyhfX3BvcywKKwkJCQkJCQkgICAgIGlvc19iYXNlOjpvdXQpOworCisJICAgICAgLy8gMTI5LiBOZWVkIGVycm9yIGluZGljYXRpb24gZnJvbSBzZWVrcCgpIGFuZCBzZWVrZygpCisJICAgICAgaWYgKF9fcCA9PSBwb3NfdHlwZShvZmZfdHlwZSgtMSkpKQorCQlfX2VyciB8PSBpb3NfYmFzZTo6ZmFpbGJpdDsKKwkgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwl7CisJICB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeyB0aGlzLT5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorICAgICAgaWYgKF9fZXJyKQorCXRoaXMtPnNldHN0YXRlKF9fZXJyKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHNlZWtwKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX2RpcikKKyAgICB7CisgICAgICBpb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IGlvc19iYXNlOjpnb29kYml0OworICAgICAgX190cnkKKwl7CisJICBpZiAoIXRoaXMtPmZhaWwoKSkKKwkgICAgeworCSAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgICAgICAvLyAxMzYuICBzZWVrcCwgc2Vla2cgc2V0dGluZyB3cm9uZyBzdHJlYW1zPworCSAgICAgIGNvbnN0IHBvc190eXBlIF9fcCA9IHRoaXMtPnJkYnVmKCktPnB1YnNlZWtvZmYoX19vZmYsIF9fZGlyLAorCQkJCQkJCSAgICAgaW9zX2Jhc2U6Om91dCk7CisKKwkgICAgICAvLyAxMjkuIE5lZWQgZXJyb3IgaW5kaWNhdGlvbiBmcm9tIHNlZWtwKCkgYW5kIHNlZWtnKCkKKwkgICAgICBpZiAoX19wID09IHBvc190eXBlKG9mZl90eXBlKC0xKSkpCisJCV9fZXJyIHw9IGlvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJfQorICAgICAgX19jYXRjaChfX2N4eGFiaXYxOjpfX2ZvcmNlZF91bndpbmQmKQorCXsKKwkgIHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOwkJCisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7IHRoaXMtPl9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOyB9CisgICAgICBpZiAoX19lcnIpCisJdGhpcy0+c2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgY2hhciogX19zKQorICAgIHsKKyAgICAgIGlmICghX19zKQorCV9fb3V0LnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgZWxzZQorCXsKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDE2Ny4gIEltcHJvcGVyIHVzZSBvZiB0cmFpdHNfdHlwZTo6bGVuZ3RoKCkKKwkgIGNvbnN0IHNpemVfdCBfX2NsZW4gPSBjaGFyX3RyYWl0czxjaGFyPjo6bGVuZ3RoKF9fcyk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgc3RydWN0IF9fcHRyX2d1YXJkCisJICAgICAgeworCQlfQ2hhclQgKl9fcDsKKwkJX19wdHJfZ3VhcmQgKF9DaGFyVCAqX19pcCk6IF9fcChfX2lwKSB7IH0KKwkJfl9fcHRyX2d1YXJkKCkgeyBkZWxldGVbXSBfX3A7IH0KKwkJX0NoYXJUKiBfX2dldCgpIHsgcmV0dXJuIF9fcDsgfQorCSAgICAgIH0gX19wZyAobmV3IF9DaGFyVFtfX2NsZW5dKTsKKworCSAgICAgIF9DaGFyVCAqX193cyA9IF9fcGcuX19nZXQoKTsKKwkgICAgICBmb3IgKHNpemVfdCAgX19pID0gMDsgX19pIDwgX19jbGVuOyArK19faSkKKwkJX193c1tfX2ldID0gX19vdXQud2lkZW4oX19zW19faV0pOworCSAgICAgIF9fb3N0cmVhbV9pbnNlcnQoX19vdXQsIF9fd3MsIF9fY2xlbik7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9fb3V0Ll9NX3NldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyBfX291dC5fTV9zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsgfQorCX0KKyAgICAgIHJldHVybiBfX291dDsKKyAgICB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vc3RyZWFtPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgZW5kbChvc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBlbmRzKG9zdHJlYW0mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIGZsdXNoKG9zdHJlYW0mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNoYXIpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgdW5zaWduZWQgY2hhcik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBzaWduZWQgY2hhcik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBjaGFyKik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCB1bnNpZ25lZCBjaGFyKik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBjb25zdCBzaWduZWQgY2hhciopOworCisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQobG9uZyk7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQodW5zaWduZWQgbG9uZyk7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQoYm9vbCk7CisjaWZkZWYgX0dMSUJDWFhfVVNFX0xPTkdfTE9ORworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KGxvbmcgbG9uZyk7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQodW5zaWduZWQgbG9uZyBsb25nKTsKKyNlbmRpZgorICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KGRvdWJsZSk7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvc3RyZWFtOjpfTV9pbnNlcnQobG9uZyBkb3VibGUpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3N0cmVhbTo6X01faW5zZXJ0KGNvbnN0IHZvaWQqKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19vc3RyZWFtPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIGVuZGwod29zdHJlYW0mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBlbmRzKHdvc3RyZWFtJik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgZmx1c2god29zdHJlYW0mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgd2NoYXJfdCk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIGNoYXIpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBjb25zdCB3Y2hhcl90Kik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIGNvbnN0IGNoYXIqKTsKKworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQobG9uZyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydCh1bnNpZ25lZCBsb25nKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KGJvb2wpOworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiB3b3N0cmVhbTo6X01faW5zZXJ0KGxvbmcgbG9uZyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydCh1bnNpZ25lZCBsb25nIGxvbmcpOworI2VuZGlmCisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgd29zdHJlYW06Ol9NX2luc2VydChkb3VibGUpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQobG9uZyBkb3VibGUpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIHdvc3RyZWFtOjpfTV9pbnNlcnQoY29uc3Qgdm9pZCopOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvb3N0cmVhbV9pbnNlcnQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9vc3RyZWFtX2luc2VydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjI4NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvb3N0cmVhbV9pbnNlcnQuaApAQCAtMCwwICsxLDEyOSBAQAorLy8gSGVscGVycyBmb3Igb3N0cmVhbSBpbnNlcnRlcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29zdHJlYW1faW5zZXJ0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtvc3RyZWFtfQorICovCisKKyNpZm5kZWYgX09TVFJFQU1fSU5TRVJUX0gKKyNkZWZpbmUgX09TVFJFQU1fSU5TRVJUX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX29zdHJlYW1fd3JpdGUoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwKKwkJICAgIGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICBfX29zdHJlYW1fdHlwZTsgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19wdXQgPSBfX291dC5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbik7CisgICAgICBpZiAoX19wdXQgIT0gX19uKQorCV9fb3V0LnNldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fb3N0cmVhbV9maWxsKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsIHN0cmVhbXNpemUgX19uKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgIF9fb3N0cmVhbV90eXBlOyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgX0NoYXJUIF9fYyA9IF9fb3V0LmZpbGwoKTsKKyAgICAgIGZvciAoOyBfX24gPiAwOyAtLV9fbikKKwl7CisJICBjb25zdCB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX3B1dCA9IF9fb3V0LnJkYnVmKCktPnNwdXRjKF9fYyk7CisJICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19wdXQsIF9UcmFpdHM6OmVvZigpKSkKKwkgICAgeworCSAgICAgIF9fb3V0LnNldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgX19vc3RyZWFtX2luc2VydChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LAorCQkgICAgIGNvbnN0IF9DaGFyVCogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgICAgICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjpzZW50cnkgX19jZXJiKF9fb3V0KTsKKyAgICAgIGlmIChfX2NlcmIpCisJeworCSAgX190cnkKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX193ID0gX19vdXQud2lkdGgoKTsKKwkgICAgICBpZiAoX193ID4gX19uKQorCQl7CisJCSAgY29uc3QgYm9vbCBfX2xlZnQgPSAoKF9fb3V0LmZsYWdzKCkKKwkJCQkJJiBfX2lvc19iYXNlOjphZGp1c3RmaWVsZCkKKwkJCQkgICAgICAgPT0gX19pb3NfYmFzZTo6bGVmdCk7CisJCSAgaWYgKCFfX2xlZnQpCisJCSAgICBfX29zdHJlYW1fZmlsbChfX291dCwgX193IC0gX19uKTsKKwkJICBpZiAoX19vdXQuZ29vZCgpKQorCQkgICAgX19vc3RyZWFtX3dyaXRlKF9fb3V0LCBfX3MsIF9fbik7CisJCSAgaWYgKF9fbGVmdCAmJiBfX291dC5nb29kKCkpCisJCSAgICBfX29zdHJlYW1fZmlsbChfX291dCwgX193IC0gX19uKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19vc3RyZWFtX3dyaXRlKF9fb3V0LCBfX3MsIF9fbik7CisJICAgICAgX19vdXQud2lkdGgoMCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9fb3V0Ll9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7IF9fb3V0Ll9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisgICAgICByZXR1cm4gX19vdXQ7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgX19vc3RyZWFtX2luc2VydChvc3RyZWFtJiwgY29uc3QgY2hhciosIHN0cmVhbXNpemUpOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBfX29zdHJlYW1faW5zZXJ0KHdvc3RyZWFtJiwgY29uc3Qgd2NoYXJfdCosCisJCQkJCSAgICAgc3RyZWFtc2l6ZSk7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX09TVFJFQU1fSU5TRVJUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9wb3N0eXBlcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3Bvc3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMzVkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9wb3N0eXBlcy5oCkBAIC0wLDAgKzEsMjQ0IEBACisvLyBQb3NpdGlvbiB0eXBlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9wb3N0eXBlcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy40LjEgLSBUeXBlcworLy8gSVNPIEMrKyAxNDg4MjogMjcuNC4zIC0gVGVtcGxhdGUgY2xhc3MgZnBvcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9QT1NUWVBFU19ICisjZGVmaW5lIF9HTElCQ1hYX1BPU1RZUEVTX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjd2NoYXI+IC8vIEZvciBtYnN0YXRlX3QKKworLy8gWFhYIElmIDxzdGRpbnQuaD4gaXMgcmVhbGx5IG5lZWRlZCwgbWFrZSBzdXJlIHRvIGRlZmluZSB0aGUgbWFjcm9zCisvLyBiZWZvcmUgaW5jbHVkaW5nIGl0LCBpbiBvcmRlciBub3QgdG8gYnJlYWsgPHRyMS9jc3RkaW50PiAoYW5kIDxjc3RkaW50PgorLy8gaW4gQysrMHgpLiAgUmVjb25zaWRlciBhbGwgdGhpcyBhcyBzb29uIGFzIHBvc3NpYmxlLi4uCisjaWYgKGRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UKSAmJiAhZGVmaW5lZChfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9ORykgXAorICAgICAmJiAhZGVmaW5lZChfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9OR19MT05HKSkKKworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjIGRlZmluZSBfVU5ERUZfX1NURENfTElNSVRfTUFDUk9TCisjIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpZm5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyBkZWZpbmUgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyBkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW50Lmg+IC8vIEZvciBpbnQ2NF90CisjaWZkZWYgX1VOREVGX19TVERDX0xJTUlUX01BQ1JPUworIyB1bmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjIHVuZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmZGVmIF9VTkRFRl9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgdW5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyB1bmRlZiBfVU5ERUZfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjZW5kaWYKKworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGUgdHlwZXMgc3RyZWFtb2ZmLCBzdHJlYW1wb3MgYW5kIHdzdHJlYW1wb3MgYW5kIHRoZSBjbGFzcworICAvLyB0ZW1wbGF0ZSBmcG9zPD4gYXJlIGRlc2NyaWJlZCBpbiBjbGF1c2VzIDIxLjEuMiwgMjEuMS4zLCAyNy4xLjIsCisgIC8vIDI3LjIsIDI3LjQuMSwgMjcuNC4zIGFuZCBELjYuIERlc3BpdGUgYWxsIHRoaXMgdmVyYmlhZ2UsIHRoZQorICAvLyBiZWhhdmlvdXIgb2YgdGhlc2UgdHlwZXMgaXMgbW9zdGx5IGltcGxlbWVudGF0aW9uIGRlZmluZWQgb3IKKyAgLy8gdW5zcGVjaWZpZWQuIFRoZSBiZWhhdmlvdXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhcyBub3RlZAorICAvLyBiZWxvdy4KKworICAvKioKKyAgICogIEBicmllZiAgVHlwZSB1c2VkIGJ5IGZwb3MsIGNoYXJfdHJhaXRzPGNoYXI+LCBhbmQgY2hhcl90cmFpdHM8d2NoYXJfdD4uCisgICAqCisgICAqICBJbiBjbGF1c2VzIDIxLjEuMy4xIGFuZCAyNy40LjEgc3RyZWFtb2ZmIGlzIGRlc2NyaWJlZCBhcyBhbgorICAgKiAgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLgorICAgKiAgTm90ZTogSW4gdmVyc2lvbnMgb2YgR0NDIHVwIHRvIGFuZCBpbmNsdWRpbmcgR0NDIDMuMywgc3RyZWFtb2ZmCisgICAqICB3YXMgdHlwZWRlZiBsb25nLgorICAqLyAgCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkcKKyAgdHlwZWRlZiBsb25nICAgICAgICAgIHN0cmVhbW9mZjsKKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UX0xPTkdfTE9ORykKKyAgdHlwZWRlZiBsb25nIGxvbmcgICAgIHN0cmVhbW9mZjsKKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfSEFWRV9JTlQ2NF9UKSAKKyAgdHlwZWRlZiBpbnQ2NF90ICAgICAgIHN0cmVhbW9mZjsKKyNlbHNlCisgIHR5cGVkZWYgbG9uZyBsb25nICAgICBzdHJlYW1vZmY7CisjZW5kaWYKKworICAvLy8gSW50ZWdyYWwgdHlwZSBmb3IgSS9PIG9wZXJhdGlvbiBjb3VudHMgYW5kIGJ1ZmZlciBzaXplcy4KKyAgdHlwZWRlZiBwdHJkaWZmX3QJc3RyZWFtc2l6ZTsgLy8gU2lnbmVkIGludGVncmFsIHR5cGUKKworICAvKioKKyAgICogIEBicmllZiAgQ2xhc3MgcmVwcmVzZW50aW5nIHN0cmVhbSBwb3NpdGlvbnMuCisgICAqCisgICAqICBUaGUgc3RhbmRhcmQgcGxhY2VzIG5vIHJlcXVpcmVtZW50cyB1cG9uIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgU3RhdGVULgorICAgKiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBTdGF0ZVQgbXVzdCBiZSBEZWZhdWx0Q29uc3RydWN0aWJsZSwKKyAgICogIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBBc3NpZ25hYmxlLiAgVGhlIHN0YW5kYXJkIG9ubHkgcmVxdWlyZXMgdGhhdCBmcG9zCisgICAqICBzaG91bGQgY29udGFpbiBhIG1lbWJlciBvZiB0eXBlIFN0YXRlVC4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpdCBhbHNvCisgICAqICBjb250YWlucyBhbiBvZmZzZXQgc3RvcmVkIGFzIGEgc2lnbmVkIGludGVnZXIuCisgICAqCisgICAqICBAcGFyYW0gIFN0YXRlVCAgVHlwZSBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGZyb20gc3RhdGUoKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgY2xhc3MgZnBvcworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RyZWFtb2ZmCSAgICAgICAgICAgICAgICBfTV9vZmY7CisgICAgICBfU3RhdGVUCQkJX01fc3RhdGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBUaGUgc3RhbmRhcmQgZG9lc24ndCByZXF1aXJlIHRoYXQgZnBvcyBvYmplY3RzIGNhbiBiZSBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGRlZmF1bHQKKyAgICAgIC8vIGNvbnN0cnVjdG9yIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG9mZnNldCB0byAwIGFuZCBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RzIHRoZSBzdGF0ZS4KKyAgICAgIGZwb3MoKQorICAgICAgOiBfTV9vZmYoMCksIF9NX3N0YXRlKCkgeyB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IGZwb3Mgb2JqZWN0cyBjYW4gYmUgY29uc3RydWN0ZWQKKyAgICAgIC8vIGZyb20gc3RyZWFtb2ZmIG9iamVjdHMgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIHN5bnRheCwgYW5kCisgICAgICAvLyBmYWlscyB0byBnaXZlIGFueSBtZWFuaW5nZnVsIHNlbWFudGljcy4gSW4gdGhpcworICAgICAgLy8gaW1wbGVtZW50YXRpb24gaW1wbGljaXQgY29udmVyc2lvbiBpcyBhbHNvIGFsbG93ZWQsIGFuZCB0aGlzCisgICAgICAvLyBjb25zdHJ1Y3RvciBzdG9yZXMgdGhlIHN0cmVhbW9mZiBhcyB0aGUgb2Zmc2V0IGFuZCBkZWZhdWx0CisgICAgICAvLyBjb25zdHJ1Y3RzIHRoZSBzdGF0ZS4KKyAgICAgIC8vLyBDb25zdHJ1Y3QgcG9zaXRpb24gZnJvbSBvZmZzZXQuCisgICAgICBmcG9zKHN0cmVhbW9mZiBfX29mZikKKyAgICAgIDogX01fb2ZmKF9fb2ZmKSwgX01fc3RhdGUoKSB7IH0KKworICAgICAgLy8vIENvbnZlcnQgdG8gc3RyZWFtb2ZmLgorICAgICAgb3BlcmF0b3Igc3RyZWFtb2ZmKCkgY29uc3QgeyByZXR1cm4gX01fb2ZmOyB9CisKKyAgICAgIC8vLyBSZW1lbWJlciB0aGUgdmFsdWUgb2YgQGEgc3QuCisgICAgICB2b2lkCisgICAgICBzdGF0ZShfU3RhdGVUIF9fc3QpCisgICAgICB7IF9NX3N0YXRlID0gX19zdDsgfQorCisgICAgICAvLy8gUmV0dXJuIHRoZSBsYXN0IHNldCB2YWx1ZSBvZiBAYSBzdC4KKyAgICAgIF9TdGF0ZVQKKyAgICAgIHN0YXRlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0YXRlOyB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGdpdmVzIG5vIHNlbWFudGljcy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBpdCBqdXN0IGFkZHMgaXRzCisgICAgICAvLyBhcmd1bWVudCB0byB0aGUgc3RvcmVkIG9mZnNldCBhbmQgcmV0dXJucyAqdGhpcy4KKyAgICAgIC8vLyBBZGQgb2Zmc2V0IHRvIHRoaXMgcG9zaXRpb24uCisgICAgICBmcG9zJgorICAgICAgb3BlcmF0b3IrPShzdHJlYW1vZmYgX19vZmYpCisgICAgICB7CisJX01fb2ZmICs9IF9fb2ZmOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgdGhpcyBvcGVyYXRvciBtdXN0IGJlIGRlZmluZWQsIGJ1dAorICAgICAgLy8gZ2l2ZXMgbm8gc2VtYW50aWNzLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIGl0IGp1c3Qgc3VidHJhY3RzCisgICAgICAvLyBpdHMgYXJndW1lbnQgZnJvbSB0aGUgc3RvcmVkIG9mZnNldCBhbmQgcmV0dXJucyAqdGhpcy4KKyAgICAgIC8vLyBTdWJ0cmFjdCBvZmZzZXQgZnJvbSB0aGlzIHBvc2l0aW9uLgorICAgICAgZnBvcyYKKyAgICAgIG9wZXJhdG9yLT0oc3RyZWFtb2ZmIF9fb2ZmKQorICAgICAgeworCV9NX29mZiAtPSBfX29mZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGRlZmluZXMgaXRzIHNlbWFudGljcyBvbmx5IGluIHRlcm1zIG9mIG9wZXJhdG9yLS4gSW4gdGhpcworICAgICAgLy8gaW1wbGVtZW50YXRpb24gaXQgY29uc3RydWN0cyBhIGNvcHkgb2YgKnRoaXMsIGFkZHMgdGhlCisgICAgICAvLyBhcmd1bWVudCB0byB0aGF0IGNvcHkgdXNpbmcgb3BlcmF0b3IrPSBhbmQgdGhlbiByZXR1cm5zIHRoZQorICAgICAgLy8gY29weS4KKyAgICAgIC8vLyBBZGQgcG9zaXRpb24gYW5kIG9mZnNldC4KKyAgICAgIGZwb3MKKyAgICAgIG9wZXJhdG9yKyhzdHJlYW1vZmYgX19vZmYpIGNvbnN0CisgICAgICB7CisJZnBvcyBfX3BvcygqdGhpcyk7CisJX19wb3MgKz0gX19vZmY7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCB0aGlzIG9wZXJhdG9yIG11c3QgYmUgZGVmaW5lZCwgYnV0CisgICAgICAvLyBkZWZpbmVzIGl0cyBzZW1hbnRpY3Mgb25seSBpbiB0ZXJtcyBvZiBvcGVyYXRvcisuIEluIHRoaXMKKyAgICAgIC8vIGltcGxlbWVudGF0aW9uIGl0IGNvbnN0cnVjdHMgYSBjb3B5IG9mICp0aGlzLCBzdWJ0cmFjdHMgdGhlCisgICAgICAvLyBhcmd1bWVudCBmcm9tIHRoYXQgY29weSB1c2luZyBvcGVyYXRvci09IGFuZCB0aGVuIHJldHVybnMgdGhlCisgICAgICAvLyBjb3B5LgorICAgICAgLy8vIFN1YnRyYWN0IG9mZnNldCBmcm9tIHBvc2l0aW9uLgorICAgICAgZnBvcworICAgICAgb3BlcmF0b3ItKHN0cmVhbW9mZiBfX29mZikgY29uc3QKKyAgICAgIHsKKwlmcG9zIF9fcG9zKCp0aGlzKTsKKwlfX3BvcyAtPSBfX29mZjsKKwlyZXR1cm4gX19wb3M7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoaXMgb3BlcmF0b3IgbXVzdCBiZSBkZWZpbmVkLCBidXQKKyAgICAgIC8vIGRlZmluZXMgaXRzIHNlbWFudGljcyBvbmx5IGluIHRlcm1zIG9mIG9wZXJhdG9yKy4gSW4gdGhpcworICAgICAgLy8gaW1wbGVtZW50YXRpb24gaXQgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvZmZzZXQKKyAgICAgIC8vIHN0b3JlZCBpbiAqdGhpcyBhbmQgaW4gdGhlIGFyZ3VtZW50LgorICAgICAgLy8vIFN1YnRyYWN0IHBvc2l0aW9uIHRvIHJldHVybiBvZmZzZXQuCisgICAgICBzdHJlYW1vZmYKKyAgICAgIG9wZXJhdG9yLShjb25zdCBmcG9zJiBfX290aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fb2ZmIC0gX19vdGhlci5fTV9vZmY7IH0KKyAgICB9OworCisgIC8vIFRoZSBzdGFuZGFyZCBvbmx5IHJlcXVpcmVzIHRoYXQgb3BlcmF0b3I9PSBtdXN0IGJlIGFuCisgIC8vIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHR3byBmcG9zPFN0YXRlVD4KKyAgLy8gb2JqZWN0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgaWYgdGhlIGNvbnRhaW5lZAorICAvLyBvZmZzZXRzIGNvbXBhcmUgZXF1YWwuCisgIC8vLyBUZXN0IGlmIGVxdWl2YWxlbnQgdG8gYW5vdGhlciBwb3NpdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1N0YXRlVD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZnBvczxfU3RhdGVUPiYgX19saHMsIGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0cmVhbW9mZihfX2xocykgPT0gc3RyZWFtb2ZmKF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZwb3M8X1N0YXRlVD4mIF9fbGhzLCBjb25zdCBmcG9zPF9TdGF0ZVQ+JiBfX3JocykKKyAgICB7IHJldHVybiBzdHJlYW1vZmYoX19saHMpICE9IHN0cmVhbW9mZihfX3Jocyk7IH0KKworICAvLyBDbGF1c2VzIDIxLjEuMy4xIGFuZCAyMS4xLjMuMiBkZXNjcmliZSBzdHJlYW1wb3MgYW5kIHdzdHJlYW1wb3MKKyAgLy8gYXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlcywgYnV0IGNsYXVzZSAyNy4yIHJlcXVpcmVzIHRoYXQKKyAgLy8gdGhleSBtdXN0IGJvdGggYmUgdHlwZWRlZnMgZm9yIGZwb3M8bWJzdGF0ZV90PgorICAvLy8gRmlsZSBwb3NpdGlvbiBmb3IgY2hhciBzdHJlYW1zLgorICB0eXBlZGVmIGZwb3M8bWJzdGF0ZV90PiBzdHJlYW1wb3M7CisgIC8vLyBGaWxlIHBvc2l0aW9uIGZvciB3Y2hhcl90IHN0cmVhbXMuCisgIHR5cGVkZWYgZnBvczxtYnN0YXRlX3Q+IHdzdHJlYW1wb3M7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAvLy8gRmlsZSBwb3NpdGlvbiBmb3IgY2hhcjE2X3Qgc3RyZWFtcy4KKyAgdHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gdTE2c3RyZWFtcG9zOworICAvLy8gRmlsZSBwb3NpdGlvbiBmb3IgY2hhcjMyX3Qgc3RyZWFtcy4KKyAgdHlwZWRlZiBmcG9zPG1ic3RhdGVfdD4gdTMyc3RyZWFtcG9zOworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmFuZG9tLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4ZWU2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yYW5kb20uaApAQCAtMCwwICsxLDUzOTUgQEAKKy8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSBiaXRzL3JhbmRvbS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmFuZG9tfQorICovCisKKyNpZm5kZWYgX1JBTkRPTV9ICisjZGVmaW5lIF9SQU5ET01fSCAxCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjYuNF0gUmFuZG9tIG51bWJlciBnZW5lcmF0aW9uCisKKyAgLyoqCisgICAqIEBkZWZncm91cCByYW5kb20gUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIEEgZmFjaWxpdHkgZm9yIGdlbmVyYXRpbmcgcmFuZG9tIG51bWJlcnMgb24gc2VsZWN0ZWQgZGlzdHJpYnV0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBBIGZ1bmN0aW9uIHRlbXBsYXRlIGZvciBjb252ZXJ0aW5nIHRoZSBvdXRwdXQgb2YgYSAoaW50ZWdyYWwpCisgICAqIHVuaWZvcm0gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gYSBmbG9hdG5nIHBvaW50IHJlc3VsdCBpbiB0aGUgcmFuZ2UKKyAgICogWzAtMSkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHNpemVfdCBfX2JpdHMsCisJICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgX1JlYWxUeXBlCisgICAgZ2VuZXJhdGVfY2Fub25pY2FsKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX2cpOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKgorICAgKiBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICAgKi8KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywKKwkgICAgIGJvb2wgPSBfX3cgPCBzdGF0aWNfY2FzdDxzaXplX3Q+CisJCQkgIChzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cyk+CisgICAgICBzdHJ1Y3QgX1NoaWZ0CisgICAgICB7IHN0YXRpYyBjb25zdCBfVUludFR5cGUgX192YWx1ZSA9IDA7IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3c+CisgICAgICBzdHJ1Y3QgX1NoaWZ0PF9VSW50VHlwZSwgX193LCB0cnVlPgorICAgICAgeyBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIF9fdmFsdWUgPSBfVUludFR5cGUoMSkgPDwgX193OyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19tLCBfVHAgX19hLCBfVHAgX19jLCBib29sPgorICAgICAgc3RydWN0IF9Nb2Q7CisKKyAgICAvLyBEaXNwYXRjaCBiYXNlZCBvbiBtb2R1bHVzIHZhbHVlIHRvIHByZXZlbnQgZGl2aWRlLWJ5LXplcm8gY29tcGlsZS10aW1lCisgICAgLy8gZXJyb3JzIHdoZW4gbSA9PSAwLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fbSwgX1RwIF9fYSA9IDEsIF9UcCBfX2MgPSAwPgorICAgICAgaW5saW5lIF9UcAorICAgICAgX19tb2QoX1RwIF9feCkKKyAgICAgIHsgcmV0dXJuIF9Nb2Q8X1RwLCBfX20sIF9fYSwgX19jLCBfX20gPT0gMD46Ol9fY2FsYyhfX3gpOyB9CisKKyAgICAvKgorICAgICAqIEFuIGFkYXB0b3IgY2xhc3MgZm9yIGNvbnZlcnRpbmcgdGhlIG91dHB1dCBvZiBhbnkgR2VuZXJhdG9yIGludG8KKyAgICAgKiB0aGUgaW5wdXQgZm9yIGEgc3BlY2lmaWMgRGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9FbmdpbmUsIHR5cGVuYW1lIF9ESW5wdXRUeXBlPgorICAgICAgc3RydWN0IF9BZGFwdG9yCisgICAgICB7CisKKyAgICAgIHB1YmxpYzoKKwlfQWRhcHRvcihfRW5naW5lJiBfX2cpCisJOiBfTV9nKF9fZykgeyB9CisKKwlfRElucHV0VHlwZQorCW1pbigpIGNvbnN0CisJeyByZXR1cm4gX0RJbnB1dFR5cGUoMCk7IH0KKworCV9ESW5wdXRUeXBlCisJbWF4KCkgY29uc3QKKwl7IHJldHVybiBfRElucHV0VHlwZSgxKTsgfQorCisJLyoKKwkgKiBDb252ZXJ0cyBhIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgYWRhcHRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCSAqIGludG8gYSB2YWx1ZSBpbiB0aGUgaW5wdXQgZG9tYWluIGZvciB0aGUgZGVwZW5kZW50IHJhbmRvbSBudW1iZXIKKwkgKiBkaXN0cmlidXRpb24uCisJICovCisJX0RJbnB1dFR5cGUKKwlvcGVyYXRvcigpKCkKKwl7CisJICByZXR1cm4gc3RkOjpnZW5lcmF0ZV9jYW5vbmljYWw8X0RJbnB1dFR5cGUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0RJbnB1dFR5cGU+OjpkaWdpdHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9FbmdpbmU+KF9NX2cpOworCX0KKworICAgICAgcHJpdmF0ZToKKwlfRW5naW5lJiBfTV9nOworICAgICAgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcmFuZG9tX2dlbmVyYXRvcnMgUmFuZG9tIE51bWJlciBHZW5lcmF0b3JzCisgICAqIEBpbmdyb3VwIHJhbmRvbQorICAgKgorICAgKiBUaGVzZSBjbGFzc2VzIGRlZmluZSBvYmplY3RzIHdoaWNoIHByb3ZpZGUgcmFuZG9tIG9yIHBzZXVkb3JhbmRvbQorICAgKiBudW1iZXJzLCBlaXRoZXIgZnJvbSBhIGRpc2NyZXRlIG9yIGEgY29udGludW91cyBpbnRlcnZhbC4gIFRoZQorICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzdXBwbGllZCBhcyBhIHBhcnQgb2YgdGhpcyBsaWJyYXJ5IGFyZQorICAgKiBhbGwgdW5pZm9ybSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgd2hpY2ggcHJvdmlkZSBhIHNlcXVlbmNlIG9mCisgICAqIHJhbmRvbSBudW1iZXIgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIG92ZXIgdGhlaXIgcmFuZ2UuCisgICAqCisgICAqIEEgbnVtYmVyIGdlbmVyYXRvciBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aXRoIGFuIG9wZXJhdG9yKCkgdGhhdAorICAgKiB0YWtlcyB6ZXJvIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIG51bWJlci4KKyAgICoKKyAgICogQSBjb21wbGlhbnQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcKKyAgICogcmVxdWlyZW1lbnRzLiAgPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTEwIGNlbGxzcGFjaW5nPTA+CisgICAqIDxjYXB0aW9uIGFsaWduPXRvcD5SYW5kb20gTnVtYmVyIEdlbmVyYXRvciBSZXF1aXJlbWVudHM8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+VG8gYmUgZG9jdW1lbnRlZC48L3RkPjwvdHI+IDwvdGFibGU+CisgICAqCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQSBtb2RlbCBvZiBhIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAqCisgICAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBwcm9kdWNlcyBwc2V1ZG9yYW5kb20gbnVtYmVycyB2aWEKKyAgICogbGluZWFyIGZ1bmN0aW9uOgorICAgKiBAZlsKKyAgICogICAgIHhfe2krMX1cbGVmdGFycm93KGF4X3tpfSArIGMpIFxibW9kIG0gCisgICAqIEBmXQorICAgKgorICAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIEBwIF9VSW50VHlwZSBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUKKyAgICogbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHZhbHVlcyB1cCB0byAoX19tLTEpLiBJZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyCisgICAqIEBwIF9fbSBpcyAwLCB0aGUgbW9kdWx1cyBAcCBfX20gdXNlZCBpcworICAgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46Om1heCgpIHBsdXMgMS4gT3RoZXJ3aXNlLCB0aGUgdGVtcGxhdGUKKyAgICogcGFyYW1ldGVycyBAcCBfX2EgYW5kIEBwIF9fYyBtdXN0IGJlIGxlc3MgdGhhbiBAcCBfX20uCisgICAqCisgICAqIFRoZSBzaXplIG9mIHRoZSBzdGF0ZSBpcyBAZiQxQGYkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNsYXNzIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3Vuc2lnbmVkPF9VSW50VHlwZT46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQgIgorCQkgICAgInN1YnN0aXR1dGluZyBfVUludFR5cGUgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19tID09IDB1IHx8IChfX2EgPCBfX20gJiYgX19jIDwgX19tKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19tIG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvKiogVGhlIG11bHRpcGxpZXIuICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG11bHRpcGxpZXIgICA9IF9fYTsKKyAgICAgIC8qKiBBbiBpbmNyZW1lbnQuICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGluY3JlbWVudCAgICA9IF9fYzsKKyAgICAgIC8qKiBUaGUgbW9kdWx1cy4gKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbW9kdWx1cyAgICAgID0gX19tOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBkZWZhdWx0X3NlZWQgPSAxdTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhICVsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZSB3aXRoIHNlZWQgQHAgX19zLiAgVGhlIGRlZmF1bHQgc2VlZCB2YWx1ZQorICAgICAgICogICAgICAgIGlzIDEuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBUaGUgaW5pdGlhbCBzZWVkIHZhbHVlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUocmVzdWx0X3R5cGUgX19zID0gZGVmYXVsdF9zZWVkKQorICAgICAgeyBzZWVkKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhICVsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZSBzZWVkZWQgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwlzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lKF9Tc2VxJiBfX3EpCisgICAgICAgIHsgc2VlZChfX3EpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgIGVuZ2luZSBzZXF1ZW5jZSB0byB0aGUgc2VlZCBAcCBfX3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcyBUaGUgbmV3IHNlZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQocmVzdWx0X3R5cGUgX19zID0gZGVmYXVsdF9zZWVkKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJWxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgZW5naW5lCisgICAgICAgKiBzZXF1ZW5jZSB1c2luZyB2YWx1ZXMgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgc21hbGxlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgbWluaW11bSBkZXBlbmRzIG9uIHRoZSBAcCBfX2MgcGFyYW1ldGVyOiBpZiBpdCBpcyB6ZXJvLCB0aGUKKyAgICAgICAqIG1pbmltdW0gZ2VuZXJhdGVkIG11c3QgYmUgPiAwLCBvdGhlcndpc2UgMCBpcyBhbGxvd2VkLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gX19jID09IDB1ID8gMXUgOiAwdTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHZhbHVlIGluIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfX20gLSAxdTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEaXNjYXJkIGEgc2VxdWVuY2Ugb2YgcmFuZG9tIG51bWJlcnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGRpc2NhcmQodW5zaWduZWQgbG9uZyBsb25nIF9feikKKyAgICAgIHsKKwlmb3IgKDsgX196ICE9IDBVTEw7IC0tX196KQorCSAgKCp0aGlzKSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpCisgICAgICB7CisJX01feCA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fbSwgX19hLCBfX2M+KF9NX3gpOworCXJldHVybiBfTV94OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lJiBfX2xocywKKwkJIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fbGhzLl9NX3ggPT0gX19yaHMuX01feDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBXcml0ZXMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXRlIHgoaSkgb2YgeCB0bworICAgICAgICogICAgICAgIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgIFRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9fbGNyIEEgJSBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEByZXR1cm5zIF9fb3MuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIF9VSW50VHlwZTEgX19hMSwgX1VJbnRUeXBlMSBfX2MxLAorCSAgICAgICBfVUludFR5cGUxIF9fbTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6bGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlMSwKKwkJICAgX19hMSwgX19jMSwgX19tMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGVuZ2luZSBieSByZWFkaW5nIGl0cyB0ZXh0dWFsCisgICAgICAgKiAgICAgICAgcmVwcmVzZW50YXRpb24gZnJvbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgd3JpdHRlbiB1c2luZworICAgICAgICogYW4gb3V0cHV0IHN0cmVhbSB3aG9zZSBpbWJ1ZWQgbG9jYWxlIGFuZCB3aG9zZSB0eXBlJ3MgdGVtcGxhdGUKKyAgICAgICAqIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cyBfQ2hhclQgYW5kIF9UcmFpdHMgd2VyZSB0aGUgc2FtZSBhcyB0aG9zZQorICAgICAgICogb2YgQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyAgVGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX2xjciBBICUgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcmV0dXJucyBfX2lzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUxLCBfVUludFR5cGUxIF9fYTEsIF9VSW50VHlwZTEgX19jMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX20xLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZTEsIF9fYTEsCisJCSAgIF9fYzEsIF9fbTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgX1VJbnRUeXBlIF9NX3g7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIENvbXBhcmVzIHR3byBsaW5lYXIgY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsCisJICAgICAgIF9fYywgX19tPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN0ZDo6bGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsCisJICAgICAgIF9fYywgX19tPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKgorICAgKiBBIGdlbmVyYWxpemVkIGZlZWRiYWNrIHNoaWZ0IHJlZ2lzdGVyIGRpc2NyZXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgKgorICAgKiBUaGlzIGFsZ29yaXRobSBhdm9pZHMgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIGFuZCBpcyBkZXNpZ25lZCB0byBiZQorICAgKiBmcmllbmRseSB0byBhIHBpcGVsaW5lZCBhcmNoaXRlY3R1cmUuICBJZiB0aGUgcGFyYW1ldGVycyBhcmUgY2hvc2VuCisgICAqIGNvcnJlY3RseSwgdGhpcyBnZW5lcmF0b3Igd2lsbCBwcm9kdWNlIG51bWJlcnMgd2l0aCBhIHZlcnkgbG9uZyBwZXJpb2QgYW5kCisgICAqIGZhaXJseSBnb29kIGFwcGFyZW50IGVudHJvcHksIGFsdGhvdWdoIHN0aWxsIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcuCisgICAqCisgICAqIFRoZSBiZXN0IHdheSB0byB1c2UgdGhpcyBnZW5lcmF0b3IgaXMgd2l0aCB0aGUgcHJlZGVmaW5lZCBtdDE5OTM3IGNsYXNzLgorICAgKgorICAgKiBUaGlzIGFsZ29yaXRobSB3YXMgb3JpZ2luYWxseSBpbnZlbnRlZCBieSBNYWtvdG8gTWF0c3Vtb3RvIGFuZAorICAgKiBUYWt1amkgTmlzaGltdXJhLgorICAgKgorICAgKiBAdmFyIHdvcmRfc2l6ZSAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIGVsZW1lbnQgb2YgdGhlIHN0YXRlIHZlY3Rvci4KKyAgICogQHZhciBzdGF0ZV9zaXplICBUaGUgZGVncmVlIG9mIHJlY3Vyc2lvbi4KKyAgICogQHZhciBzaGlmdF9zaXplICBUaGUgcGVyaW9kIHBhcmFtZXRlci4KKyAgICogQHZhciBtYXNrX2JpdHMgICBUaGUgc2VwYXJhdGlvbiBwb2ludCBiaXQgaW5kZXguCisgICAqIEB2YXIgcGFyYW1ldGVyX2EgVGhlIGxhc3Qgcm93IG9mIHRoZSB0d2lzdCBtYXRyaXguCisgICAqIEB2YXIgb3V0cHV0X3UgICAgVGhlIGZpcnN0IHJpZ2h0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKiBAdmFyIG91dHB1dF9zICAgIFRoZSBmaXJzdCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKiBAdmFyIG91dHB1dF9iICAgIFRoZSBmaXJzdCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggbWFzay4KKyAgICogQHZhciBvdXRwdXRfdCAgICBUaGUgc2Vjb25kIGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB2YXIgb3V0cHV0X2MgICAgVGhlIHNlY29uZCBsZWZ0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggbWFzay4KKyAgICogQHZhciBvdXRwdXRfbCAgICBUaGUgc2Vjb25kIHJpZ2h0LXNoaWZ0IHRlbXBlcmluZyBtYXRyaXggcGFyYW1ldGVyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LAorCSAgIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgY2xhc3MgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1VJbnRUeXBlPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAic3Vic3RpdHV0aW5nIF9VSW50VHlwZSBub3QgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydCgxdSA8PSBfX20gJiYgX19tIDw9IF9fbiwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19tIG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19yIDw9IF9fdywgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyAiCisJCSAgICAiX19yIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX3UgPD0gX193LCAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nICIKKwkJICAgICJfX3Ugb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fcyA8PSBfX3csICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgIgorCQkgICAgIl9fcyBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX190IDw9IF9fdywgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyAiCisJCSAgICAiX190IG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2wgPD0gX193LCAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nICIKKwkJICAgICJfX2wgb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fdyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cywKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX193IG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2EgPD0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMSksCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fYSBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19iIDw9IChfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDEpLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX2Igb3V0IG9mIGJvdW5kIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYyA8PSAoX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxKSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19jIG91dCBvZiBib3VuZCIpOworICAgICAgc3RhdGljX2Fzc2VydChfX2QgPD0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlIC0gMSksCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fZCBvdXQgb2YgYm91bmQiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19mIDw9IChfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDEpLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX2Ygb3V0IG9mIGJvdW5kIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIF9VSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICB3b3JkX3NpemUgICAgICAgICAgICAgICAgID0gX193OworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICBzdGF0ZV9zaXplICAgICAgICAgICAgICAgID0gX19uOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICBzaGlmdF9zaXplICAgICAgICAgICAgICAgID0gX19tOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICBtYXNrX2JpdHMgICAgICAgICAgICAgICAgID0gX19yOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSB4b3JfbWFzayAgICAgICAgICAgICAgICAgID0gX19hOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICB0ZW1wZXJpbmdfdSAgICAgICAgICAgICAgID0gX191OworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfZCAgICAgICAgICAgICAgID0gX19kOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICB0ZW1wZXJpbmdfcyAgICAgICAgICAgICAgID0gX19zOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfYiAgICAgICAgICAgICAgID0gX19iOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICB0ZW1wZXJpbmdfdCAgICAgICAgICAgICAgID0gX190OworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSB0ZW1wZXJpbmdfYyAgICAgICAgICAgICAgID0gX19jOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICB0ZW1wZXJpbmdfbCAgICAgICAgICAgICAgID0gX19sOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBpbml0aWFsaXphdGlvbl9tdWx0aXBsaWVyID0gX19mOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBkZWZhdWx0X3NlZWQgPSA1NDg5dTsKKworICAgICAgLy8gY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgZnVuY3Rpb24KKyAgICAgIGV4cGxpY2l0CisgICAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZShyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKQorICAgICAgeyBzZWVkKF9fc2QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSAlbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICBlbmdpbmUgc2VlZGVkIGZyb20gdGhlIHNlZWQgc2VxdWVuY2UgQHAgX19xLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3EgdGhlIHNlZWQgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8X1NzZXEsIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPjo6dmFsdWU+CisJICAgICAgIDo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUoX1NzZXEmIF9fcSkKKyAgICAgICAgeyBzZWVkKF9fcSk7IH0KKworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisJdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB2YWx1ZSBpbiB0aGUgb3V0cHV0IHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gMDsgfTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSBpbiB0aGUgb3V0cHV0IHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtYXgoKQorICAgICAgeyByZXR1cm4gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERpc2NhcmQgYSBzZXF1ZW5jZSBvZiByYW5kb20gbnVtYmVycy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgICAgeworCWZvciAoOyBfX3ogIT0gMFVMTDsgLS1fX3opCisJICAoKnRoaXMpKCk7CisgICAgICB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHR3byAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgICAgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgICAgICogICAgICAgICAgd291bGQgYmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUmIF9fbGhzLAorCQkgY29uc3QgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX2xocy5fTV94LCBfX2xocy5fTV94ICsgc3RhdGVfc2l6ZSwgX19yaHMuX01feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUxLAorCSAgICAgICBzaXplX3QgX193MSwgc2l6ZV90IF9fbjEsCisJICAgICAgIHNpemVfdCBfX20xLCBzaXplX3QgX19yMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2ExLCBzaXplX3QgX191MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2QxLCBzaXplX3QgX19zMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2IxLCBzaXplX3QgX190MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2MxLCBzaXplX3QgX19sMSwgX1VJbnRUeXBlMSBfX2YxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBzdGQ6Om1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZTEsIF9fdzEsIF9fbjEsCisJCSAgIF9fbTEsIF9fcjEsIF9fYTEsIF9fdTEsIF9fZDEsIF9fczEsIF9fYjEsIF9fdDEsIF9fYzEsCisJCSAgIF9fbDEsIF9fZjE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUxLAorCSAgICAgICBzaXplX3QgX193MSwgc2l6ZV90IF9fbjEsCisJICAgICAgIHNpemVfdCBfX20xLCBzaXplX3QgX19yMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2ExLCBzaXplX3QgX191MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2QxLCBzaXplX3QgX19zMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2IxLCBzaXplX3QgX190MSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2MxLCBzaXplX3QgX19sMSwgX1VJbnRUeXBlMSBfX2YxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6Om1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZTEsIF9fdzEsIF9fbjEsIF9fbTEsCisJCSAgIF9fcjEsIF9fYTEsIF9fdTEsIF9fZDEsIF9fczEsIF9fYjEsIF9fdDEsIF9fYzEsCisJCSAgIF9fbDEsIF9fZjE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgX1VJbnRUeXBlIF9NX3hbc3RhdGVfc2l6ZV07CisgICAgICBzaXplX3QgICAgX01fcDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICUgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgJSBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LAorCSAgIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsIF9VSW50VHlwZSBfX2Y+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLAorCSAgICAgICBfX3IsIF9fYSwgX191LCBfX2QsIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3RkOjptZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIFRoZSBNYXJzYWdsaWEtWmFtYW4gZ2VuZXJhdG9yLgorICAgKgorICAgKiBUaGlzIGlzIGEgbW9kZWwgb2YgYSBHZW5lcmFsaXplZCBGaWJvbmFjY2kgZGlzY3JldGUgcmFuZG9tIG51bWJlcgorICAgKiBnZW5lcmF0b3IsIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgU1dDIGdlbmVyYXRvci4KKyAgICoKKyAgICogQSBkaXNjcmV0ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGF0IHByb2R1Y2VzIHBzZXVkb3JhbmRvbQorICAgKiBudW1iZXJzIHVzaW5nOgorICAgKiBAZlsKKyAgICogICAgIHhfe2l9XGxlZnRhcnJvdyh4X3tpIC0gc30gLSB4X3tpIC0gcn0gLSBjYXJyeV97aS0xfSkgXGJtb2QgbSAKKyAgICogQGZdCisgICAqCisgICAqIFRoZSBzaXplIG9mIHRoZSBzdGF0ZSBpcyBAZiRyQGYkCisgICAqIGFuZCB0aGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIGdlbmVyYXRvciBpcyBAZiQobV5yIC0gbV5zIC0gMSlAZiQuCisgICAqCisgICAqIEB2YXIgX01feCAgICAgVGhlIHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IuICBUaGlzIGlzIGEgcmluZyBidWZmZXIuCisgICAqIEB2YXIgX01fY2FycnkgVGhlIGNhcnJ5LgorICAgKiBAdmFyIF9NX3AgICAgIEN1cnJlbnQgaW5kZXggb2YgeChpIC0gcikuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgY2xhc3Mgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdW5zaWduZWQ8X1VJbnRUeXBlPjo6dmFsdWUsICJ0ZW1wbGF0ZSBhcmd1bWVudCAiCisJCSAgICAic3Vic3RpdHV0aW5nIF9VSW50VHlwZSBub3QgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSIpOworICAgICAgc3RhdGljX2Fzc2VydCgwdSA8IF9fcyAmJiBfX3MgPCBfX3IsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgc3Vic3RpdHV0aW5nIF9fcyBvdXQgb2YgYm91bmRzIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KDB1IDwgX193ICYmIF9fdyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cywKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX193IG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VJbnRUeXBlIHJlc3VsdF90eXBlOworCisgICAgICAvLyBwYXJhbWV0ZXIgdmFsdWVzCisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgIHdvcmRfc2l6ZSAgICA9IF9fdzsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90ICAgICAgc2hvcnRfbGFnICAgID0gX19zOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgICAgICBsb25nX2xhZyAgICAgPSBfX3I7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIGRlZmF1bHRfc2VlZCA9IDE5NzgwNTAzdTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhbiBleHBsaWNpdGx5IHNlZWRlZCAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZShyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKQorICAgICAgeyBzZWVkKF9fc2QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSAlc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlciBlbmdpbmUKKyAgICAgICAqICAgICAgICBzZWVkZWQgZnJvbSB0aGUgc2VlZCBzZXF1ZW5jZSBAcCBfX3EuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSB0aGUgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU+Ojp2YWx1ZT4KKwkgICAgICAgOjp0eXBlPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZShfU3NlcSYgX19xKQorICAgICAgICB7IHNlZWQoX19xKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiR4XzBAZiQgb2YgdGhlIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBnZW5lcmF0b3IuCisgICAgICAgKgorICAgICAgICogTjE2ODhbNC4xOV0gbW9kaWZpZXMgdGhpcyBhcyBmb2xsb3dzLiAgSWYgQHAgX192YWx1ZSA9PSAwLAorICAgICAgICogc2V0cyB2YWx1ZSB0byAxOTc4MDUwMy4gIEluIGFueSBjYXNlLCB3aXRoIGEgbGluZWFyCisgICAgICAgKiBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIGxjZyhpKSBoYXZpbmcgcGFyYW1ldGVycyBAZiQgbV97bGNnfSA9CisgICAgICAgKiAyMTQ3NDgzNTYzLCBhX3tsY2d9ID0gNDAwMTQsIGNfe2xjZ30gPSAwLCBhbmQgbGNnKDApID0gdmFsdWUKKyAgICAgICAqIEBmJCwgc2V0cyBAZiQgeF97LXJ9IFxkb3RzIHhfey0xfSBAZiQgdG8gQGYkIGxjZygxKSBcYm1vZCBtCisgICAgICAgKiBcZG90cyBsY2cocikgXGJtb2QgbSBAZiQgcmVzcGVjdGl2ZWx5LiAgSWYgQGYkIHhfey0xfSA9IDAgQGYkCisgICAgICAgKiBzZXQgY2FycnkgdG8gMSwgb3RoZXJ3aXNlIHNldHMgY2FycnkgdG8gMC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3NkID0gZGVmYXVsdF9zZWVkKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VlZHMgdGhlIGluaXRpYWwgc3RhdGUgQGYkeF8wQGYkIG9mIHRoZQorICAgICAgICogJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisJdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBpbmNsdXNpdmUgbWluaW11bSB2YWx1ZSBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tCisgICAgICAgKiBpbnRlZ2VycyByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWluKCkKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgaW5jbHVzaXZlIG1heGltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbQorICAgICAgICogaW50ZWdlcnMgcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpCisgICAgICB7IHJldHVybiBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGlzY2FyZCBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCisgICAgICB7CisJZm9yICg7IF9feiAhPSAwVUxMOyAtLV9feikKKwkgICgqdGhpcykoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGdlbmVyYXRvciBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgICBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAgICAgKiAgICAgICAgICB3b3VsZCBiZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lJiBfX2xocywKKwkJIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuIHN0ZDo6ZXF1YWwoX19saHMuX01feCwgX19saHMuX01feCArIGxvbmdfbGFnLCBfX3Jocy5fTV94KTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICogICAgICAgIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIHNpemVfdCBfX3cxLCBzaXplX3QgX19zMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6c3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlMSwgX193MSwKKwkJICAgX19zMSwgX19yMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZTEsIHNpemVfdCBfX3cxLCBzaXplX3QgX19zMSwgc2l6ZV90IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIHN0ZDo6c3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlMSwgX193MSwKKwkJICAgX19zMSwgX19yMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICBfVUludFR5cGUgIF9NX3hbbG9uZ19sYWddOworICAgICAgX1VJbnRUeXBlICBfTV9jYXJyeTsKKyAgICAgIHNpemVfdCAgICAgX01fcDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUgcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgZ2VuZXJhdG9yIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LAorCSAgICAgICBfX3MsIF9fcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdGQ6OnN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LAorCSAgICAgICBfX3MsIF9fcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgZnJvbSBzb21lIGJhc2UgZW5naW5lIGJ5IGRpc2NhcmRpbmcgYmxvY2tzIG9mCisgICAqIGRhdGEuCisgICAqCisgICAqIDAgPD0gQHAgX19yIDw9IEBwIF9fcAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fcCwgc2l6ZV90IF9fcj4KKyAgICBjbGFzcyBkaXNjYXJkX2Jsb2NrX2VuZ2luZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoMSA8PSBfX3IgJiYgX19yIDw9IF9fcCwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgX19yIG91dCBvZiBib3VuZHMiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGJsb2NrX3NpemUgPSBfX3A7CisgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCB1c2VkX2Jsb2NrID0gX19yOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIFRoZSB1bmRlcmx5aW5nIGVuZ2luZSBpcyBkZWZhdWx0IGNvbnN0cnVjdGVkIGFzIHdlbGwuCisgICAgICAgKi8KKyAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lKCkKKyAgICAgIDogX01fYigpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIHJuZyBBbiBleGlzdGluZyAoYmFzZSBjbGFzcykgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lKGNvbnN0IF9SYW5kb21OdW1iZXJFbmdpbmUmIF9fcm5lKQorICAgICAgOiBfTV9iKF9fcm5lKSwgX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZSBjb25zdHJ1Y3RzIGEgJWRpc2NhcmRfYmxvY2tfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb3BpZXMgYW4gZXhpc3RpbmcgYmFzZSBjbGFzcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEBwYXJhbSBybmcgQW4gZXhpc3RpbmcgKGJhc2UgY2xhc3MpIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZShfUmFuZG9tTnVtYmVyRW5naW5lJiYgX19ybmUpCisgICAgICA6IF9NX2Ioc3RkOjptb3ZlKF9fcm5lKSksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNlZWQgY29uc3RydWN0cyBhICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29uc3RydWN0cyB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIHNlZWRlZCB3aXRoIEBwIF9fcy4KKyAgICAgICAqIEBwYXJhbSBfX3MgQSBzZWVkIHZhbHVlIGZvciB0aGUgYmFzZSBjbGFzcyBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZShyZXN1bHRfdHlwZSBfX3MpCisgICAgICA6IF9NX2IoX19zKSwgX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdG9yIGNvbnN0cnVjdCBhICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxfU3NlcSwgZGlzY2FyZF9ibG9ja19lbmdpbmU+Ojp2YWx1ZQorCQkgICAgICAgJiYgIXN0ZDo6aXNfc2FtZTxfU3NlcSwgX1JhbmRvbU51bWJlckVuZ2luZT46OnZhbHVlPgorCSAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lKF9Tc2VxJiBfX3EpCisJOiBfTV9iKF9fcSksIF9NX24oMCkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdAorICAgICAgICogICAgICAgIHNlZWQgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZCgpCisgICAgICB7CisJX01fYi5zZWVkKCk7CisJX01fbiA9IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdAorICAgICAgICogICAgICAgIHNlZWQgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MpCisgICAgICB7CisJX01fYi5zZWVkKF9fcyk7CisJX01fbiA9IDA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gc2VlZAorICAgICAgICogICAgICAgIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIF9fcSBBIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICAgIHsKKwkgIF9NX2Iuc2VlZChfX3EpOworCSAgX01fbiA9IDA7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqICAgICAgICBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IF9SYW5kb21OdW1iZXJFbmdpbmUmCisgICAgICBiYXNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2I7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpCisgICAgICB7IHJldHVybiBfUmFuZG9tTnVtYmVyRW5naW5lOjptaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9SYW5kb21OdW1iZXJFbmdpbmU6Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERpc2NhcmQgYSBzZXF1ZW5jZSBvZiByYW5kb20gbnVtYmVycy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgICAgeworCWZvciAoOyBfX3ogIT0gMFVMTDsgLS1fX3opCisJICAoKnRoaXMpKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAgICAgKiAgICAgICAgICB3b3VsZCBiZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZSYgX19saHMsCisJCSBjb25zdCBkaXNjYXJkX2Jsb2NrX2VuZ2luZSYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocy5fTV9iID09IF9fcmhzLl9NX2IgJiYgX19saHMuX01fbiA9PSBfX3Jocy5fTV9uOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlZGlzY2FyZF9ibG9ja19lbmdpbmUgcmFuZG9tCisgICAgICAgKiAgICAgICAgbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTEsIHNpemVfdCBfX3AxLCBzaXplX3QgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3Qgc3RkOjpkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lMSwKKwkJICAgX19wMSwgX19yMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lCisgICAgICAgKiAgICAgICAgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAqICAgICAgICBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lMSwgc2l6ZV90IF9fcDEsIHNpemVfdCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6OmRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUxLAorCQkgICBfX3AxLCBfX3IxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9SYW5kb21OdW1iZXJFbmdpbmUgX01fYjsKKyAgICAgIHNpemVfdCBfTV9uOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gJWRpc2NhcmRfYmxvY2tfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAqCisgICAqIEBwYXJhbSBfX2xocyBBICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVkaXNjYXJkX2Jsb2NrX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgKiAgICAgICAgICB3b3VsZCBiZSBkaWZmZXJlbnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6ZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLAorCSAgICAgICBfX3I+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3RkOjpkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsCisJICAgICAgIF9fcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKworICAvKioKKyAgICogUHJvZHVjZXMgcmFuZG9tIG51bWJlcnMgYnkgY29tYmluaW5nIHJhbmRvbSBudW1iZXJzIGZyb20gc29tZSBiYXNlCisgICAqIGVuZ2luZSB0byBwcm9kdWNlIHJhbmRvbSBudW1iZXJzIHdpdGggYSBzcGVjaWZpZXMgbnVtYmVyIG9mIGJpdHMgQHAgX193LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fdywgdHlwZW5hbWUgX1VJbnRUeXBlPgorICAgIGNsYXNzIGluZGVwZW5kZW50X2JpdHNfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3Vuc2lnbmVkPF9VSW50VHlwZT46OnZhbHVlLCAidGVtcGxhdGUgYXJndW1lbnQgIgorCQkgICAgInN1YnN0aXR1dGluZyBfVUludFR5cGUgbm90IGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoMHUgPCBfX3cgJiYgX193IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1VJbnRUeXBlPjo6ZGlnaXRzLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IHN1YnN0aXR1dGluZyBfX3cgb3V0IG9mIGJvdW5kcyIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogVGhlIHVuZGVybHlpbmcgZW5naW5lIGlzIGRlZmF1bHQgY29uc3RydWN0ZWQgYXMgd2VsbC4KKyAgICAgICAqLworICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoKQorICAgICAgOiBfTV9iKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUoY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYgX19ybmUpCisgICAgICA6IF9NX2IoX19ybmUpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdHMgYSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIHJuZyBBbiBleGlzdGluZyAoYmFzZSBjbGFzcykgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGluZGVwZW5kZW50X2JpdHNfZW5naW5lKF9SYW5kb21OdW1iZXJFbmdpbmUmJiBfX3JuZSkKKyAgICAgIDogX01fYihzdGQ6Om1vdmUoX19ybmUpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VlZCBjb25zdHJ1Y3RzIGEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUgc2VlZGVkIHdpdGggQHAgX19zLgorICAgICAgICogQHBhcmFtIF9fcyBBIHNlZWQgdmFsdWUgZm9yIHRoZSBiYXNlIGNsYXNzIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGluZGVwZW5kZW50X2JpdHNfZW5naW5lKHJlc3VsdF90eXBlIF9fcykKKyAgICAgIDogX01fYihfX3MpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0b3IgY29uc3RydWN0IGEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIEEgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwlzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZT46OnZhbHVlCisJCSAgICAgICAmJiAhc3RkOjppc19zYW1lPF9Tc2VxLCBfUmFuZG9tTnVtYmVyRW5naW5lPjo6dmFsdWU+CisgICAgICAgICAgICAgICA6OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGluZGVwZW5kZW50X2JpdHNfZW5naW5lKF9Tc2VxJiBfX3EpCisgICAgICAgIDogX01fYihfX3EpCisgICAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgICAqICAgICAgICBzZWVkIGZvciB0aGUgdW5kZXJseWluZyBiYXNlIGNsYXNzIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQoKQorICAgICAgeyBfTV9iLnNlZWQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgICAqICAgICAgICBzZWVkIGZvciB0aGUgdW5kZXJseWluZyBiYXNlIGNsYXNzIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNlZWQocmVzdWx0X3R5cGUgX19zKQorICAgICAgeyBfTV9iLnNlZWQoX19zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGdpdmVuCisgICAgICAgKiAgICAgICAgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgICB7IF9NX2Iuc2VlZChfX3EpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZQorICAgICAgICogICAgICAgIG9iamVjdC4KKyAgICAgICAqLworICAgICAgY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYKKyAgICAgIGJhc2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWluKCkKKyAgICAgIHsgcmV0dXJuIDBVOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtYXgoKQorICAgICAgeyByZXR1cm4gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWUgLSAxOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERpc2NhcmQgYSBzZXF1ZW5jZSBvZiByYW5kb20gbnVtYmVycy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZGlzY2FyZCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQorICAgICAgeworCWZvciAoOyBfX3ogIT0gMFVMTDsgLS1fX3opCisJICAoKnRoaXMpKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG5leHQgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyB0d28gJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZXMgb2YgZ2VuZXJhdGVkIHZhbHVlcworICAgICAgICogICAgICAgICAgd291bGQgYmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUmIF9fbGhzLAorCQkgY29uc3QgaW5kZXBlbmRlbnRfYml0c19lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMuX01fYiA9PSBfX3Jocy5fTV9iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZQorICAgICAgICogICAgICAgIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgKiAgICAgICAgQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogICAgICAgICAgYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgc3RkOjppbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLAorCQkgICBfX3csIF9VSW50VHlwZT4mIF9feCkKKwl7CisJICBfX2lzID4+IF9feC5fTV9iOworCSAgcmV0dXJuIF9faXM7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SYW5kb21OdW1iZXJFbmdpbmUgX01fYjsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAqCisgICAqIEBwYXJhbSBfX2xocyBBICVpbmRlcGVuZGVudF9iaXRzX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICogICAgICAgICAgd291bGQgYmUgZGlmZmVyZW50LCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX193LCB0eXBlbmFtZSBfVUludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6aW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX193LAorCSAgICAgICBfVUludFR5cGU+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3RkOjppbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3csCisJICAgICAgIF9VSW50VHlwZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJWluZGVwZW5kZW50X2JpdHNfZW5naW5lIHJhbmRvbQorICAgKiAgICAgICAgbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlaW5kZXBlbmRlbnRfYml0c19lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogICAgICAgICAgYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX193LCB0eXBlbmFtZSBfVUludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN0ZDo6aW5kZXBlbmRlbnRfYml0c19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwKKwkgICAgICAgX193LCBfVUludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgX19vcyA8PCBfX3guYmFzZSgpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBQcm9kdWNlcyByYW5kb20gbnVtYmVycyBieSBjb21iaW5pbmcgcmFuZG9tIG51bWJlcnMgZnJvbSBzb21lCisgICAqIGJhc2UgZW5naW5lIHRvIHByb2R1Y2UgcmFuZG9tIG51bWJlcnMgd2l0aCBhIHNwZWNpZmllcyBudW1iZXIgb2YgYml0cworICAgKiBAcCBfX3cuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rPgorICAgIGNsYXNzIHNodWZmbGVfb3JkZXJfZW5naW5lCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydCgxdSA8PSBfX2ssICJ0ZW1wbGF0ZSBhcmd1bWVudCBzdWJzdGl0dXRpbmcgIgorCQkgICAgIl9fayBvdXQgb2YgYm91bmQiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHRhYmxlX3NpemUgPSBfX2s7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVzaHVmZmxlX29yZGVyX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogVGhlIHVuZGVybHlpbmcgZW5naW5lIGlzIGRlZmF1bHQgY29uc3RydWN0ZWQgYXMgd2VsbC4KKyAgICAgICAqLworICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoKQorICAgICAgOiBfTV9iKCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVzaHVmZmxlX29yZGVyX2VuZ2luZSBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQ29waWVzIGFuIGV4aXN0aW5nIGJhc2UgY2xhc3MgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKiBAcGFyYW0gcm5nIEFuIGV4aXN0aW5nIChiYXNlIGNsYXNzKSBlbmdpbmUgb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYgX19ybmUpCisgICAgICA6IF9NX2IoX19ybmUpCisgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlIGNvbnN0cnVjdHMgYSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIHJuZyBBbiBleGlzdGluZyAoYmFzZSBjbGFzcykgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKF9SYW5kb21OdW1iZXJFbmdpbmUmJiBfX3JuZSkKKyAgICAgIDogX01fYihzdGQ6Om1vdmUoX19ybmUpKQorICAgICAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2VlZCBjb25zdHJ1Y3RzIGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUgc2VlZGVkIHdpdGggQHAgX19zLgorICAgICAgICogQHBhcmFtIF9fcyBBIHNlZWQgdmFsdWUgZm9yIHRoZSBiYXNlIGNsYXNzIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHNodWZmbGVfb3JkZXJfZW5naW5lKHJlc3VsdF90eXBlIF9fcykKKyAgICAgIDogX01fYihfX3MpCisgICAgICB7IF9NX2luaXRpYWxpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0b3IgY29uc3RydWN0IGEgJXNodWZmbGVfb3JkZXJfZW5naW5lIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19xIEEgc2VlZCBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwlzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19zYW1lPF9Tc2VxLCBzaHVmZmxlX29yZGVyX2VuZ2luZT46OnZhbHVlCisJCSAgICAgICAmJiAhc3RkOjppc19zYW1lPF9Tc2VxLCBfUmFuZG9tTnVtYmVyRW5naW5lPjo6dmFsdWU+CisJICAgICAgIDo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgc2h1ZmZsZV9vcmRlcl9lbmdpbmUoX1NzZXEmIF9fcSkKKyAgICAgICAgOiBfTV9iKF9fcSkKKyAgICAgICAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZWVkcyB0aGUgJXNodWZmbGVfb3JkZXJfZW5naW5lIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHNlZWQKKyAgICAgICAgICAgICAgICBmb3IgdGhlIHVuZGVybHlpbmcgYmFzZSBjbGFzcyBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKCkKKyAgICAgIHsKKwlfTV9iLnNlZWQoKTsKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2VlZHMgdGhlICVzaHVmZmxlX29yZGVyX2VuZ2luZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBzZWVkCisgICAgICAgKiAgICAgICAgZm9yIHRoZSB1bmRlcmx5aW5nIGJhc2UgY2xhc3MgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZChyZXN1bHRfdHlwZSBfX3MpCisgICAgICB7CisJX01fYi5zZWVkKF9fcyk7CisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNlZWRzIHRoZSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHNlZWQKKyAgICAgICAqICAgICAgICBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBfX3EgQSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgICB7CisJICBfTV9iLnNlZWQoX19xKTsKKwkgIF9NX2luaXRpYWxpemUoKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgY29uc3QgX1JhbmRvbU51bWJlckVuZ2luZSYKKyAgICAgIGJhc2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlCisgICAgICBtaW4oKQorICAgICAgeyByZXR1cm4gX1JhbmRvbU51bWJlckVuZ2luZTo6bWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZQorICAgICAgbWF4KCkKKyAgICAgIHsgcmV0dXJuIF9SYW5kb21OdW1iZXJFbmdpbmU6Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogRGlzY2FyZCBhIHNlcXVlbmNlIG9mIHJhbmRvbSBudW1iZXJzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBkaXNjYXJkKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCisgICAgICB7CisJZm9yICg7IF9feiAhPSAwVUxMOyAtLV9feikKKwkgICgqdGhpcykoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMKKyAgICAgICAqIG9mIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5maW5pdGUgc2VxdWVuY2VzIG9mIGdlbmVyYXRlZCB2YWx1ZXMKKyAgICAgICAqICAgICAgICAgIHdvdWxkIGJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc2h1ZmZsZV9vcmRlcl9lbmdpbmUmIF9fbGhzLAorCQkgY29uc3Qgc2h1ZmZsZV9vcmRlcl9lbmdpbmUmIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMuX01fYiA9PSBfX3Jocy5fTV9iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tCisgICAgICAgKiAgICAgICAgbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0KKwlAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVzaHVmZmxlX29yZGVyX2VuZ2luZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZTEsIHNpemVfdCBfX2sxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBzdGQ6OnNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUxLAorCQkgICBfX2sxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUKKyAgICAgICAqICAgICAgICByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICogICAgICAgIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlc2h1ZmZsZV9vcmRlcl9lbmdpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUxLCBzaXplX3QgX19rMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgc3RkOjpzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lMSwgX19rMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkIF9NX2luaXRpYWxpemUoKQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fazsgKytfX2kpCisJICBfTV92W19faV0gPSBfTV9iKCk7CisJX01feSA9IF9NX2IoKTsKKyAgICAgIH0KKworICAgICAgX1JhbmRvbU51bWJlckVuZ2luZSBfTV9iOworICAgICAgcmVzdWx0X3R5cGUgX01fdltfX2tdOworICAgICAgcmVzdWx0X3R5cGUgX01feTsKKyAgICB9OworCisgIC8qKgorICAgKiBDb21wYXJlcyB0d28gJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMKKyAgICogb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICoKKyAgICogQHBhcmFtIF9fbGhzIEEgJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJXNodWZmbGVfb3JkZXJfZW5naW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluZmluaXRlIHNlcXVlbmNlcyBvZiBnZW5lcmF0ZWQgdmFsdWVzCisgICAqICAgICAgICAgIHdvdWxkIGJlIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9faz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLAorCSAgICAgICBfX2s+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3RkOjpzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLAorCSAgICAgICBfX2s+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisKKyAgLyoqCisgICAqIFRoZSBjbGFzc2ljIE1pbmltdW0gU3RhbmRhcmQgcmFuZDAgb2YgTGV3aXMsIEdvb2RtYW4sIGFuZCBNaWxsZXIuCisgICAqLworICB0eXBlZGVmIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHVpbnRfZmFzdDMyX3QsIDE2ODA3VUwsIDBVTCwgMjE0NzQ4MzY0N1VMPgorICBtaW5zdGRfcmFuZDA7CisKKyAgLyoqCisgICAqIEFuIGFsdGVybmF0aXZlIExDUiAoTGVobWVyIEdlbmVyYXRvciBmdW5jdGlvbikuCisgICAqLworICB0eXBlZGVmIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHVpbnRfZmFzdDMyX3QsIDQ4MjcxVUwsIDBVTCwgMjE0NzQ4MzY0N1VMPgorICBtaW5zdGRfcmFuZDsKKworICAvKioKKyAgICogVGhlIGNsYXNzaWMgTWVyc2VubmUgVHdpc3Rlci4KKyAgICoKKyAgICogUmVmZXJlbmNlOgorICAgKiBNLiBNYXRzdW1vdG8gYW5kIFQuIE5pc2hpbXVyYSwgTWVyc2VubmUgVHdpc3RlcjogQSA2MjMtRGltZW5zaW9uYWxseQorICAgKiBFcXVpZGlzdHJpYnV0ZWQgVW5pZm9ybSBQc2V1ZG8tUmFuZG9tIE51bWJlciBHZW5lcmF0b3IsIEFDTSBUcmFuc2FjdGlvbnMKKyAgICogb24gTW9kZWxpbmcgYW5kIENvbXB1dGVyIFNpbXVsYXRpb24sIFZvbC4gOCwgTm8uIDEsIEphbnVhcnkgMTk5OCwgcHAgMy0zMC4KKyAgICovCisgIHR5cGVkZWYgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8CisgICAgdWludF9mYXN0MzJfdCwKKyAgICAzMiwgNjI0LCAzOTcsIDMxLAorICAgIDB4OTkwOGIwZGZVTCwgMTEsCisgICAgMHhmZmZmZmZmZlVMLCA3LAorICAgIDB4OWQyYzU2ODBVTCwgMTUsCisgICAgMHhlZmM2MDAwMFVMLCAxOCwgMTgxMjQzMzI1M1VMPiBtdDE5OTM3OworCisgIC8qKgorICAgKiBBbiBhbHRlcm5hdGl2ZSBNZXJzZW5uZSBUd2lzdGVyLgorICAgKi8KKyAgdHlwZWRlZiBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTwKKyAgICB1aW50X2Zhc3Q2NF90LAorICAgIDY0LCAzMTIsIDE1NiwgMzEsCisgICAgMHhiNTAyNmY1YWE5NjYxOWU5VUxMLCAyOSwKKyAgICAweDU1NTU1NTU1NTU1NTU1NTVVTEwsIDE3LAorICAgIDB4NzFkNjdmZmZlZGE2MDAwMFVMTCwgMzcsCisgICAgMHhmZmY3ZWVlMDAwMDAwMDAwVUxMLCA0MywKKyAgICA2MzY0MTM2MjIzODQ2NzkzMDA1VUxMPiBtdDE5OTM3XzY0OworCisgIHR5cGVkZWYgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8dWludF9mYXN0MzJfdCwgMjQsIDEwLCAyND4KKyAgICByYW5sdXgyNF9iYXNlOworCisgIHR5cGVkZWYgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8dWludF9mYXN0NjRfdCwgNDgsIDUsIDEyPgorICAgIHJhbmx1eDQ4X2Jhc2U7CisKKyAgdHlwZWRlZiBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxyYW5sdXgyNF9iYXNlLCAyMjMsIDIzPiByYW5sdXgyNDsKKworICB0eXBlZGVmIGRpc2NhcmRfYmxvY2tfZW5naW5lPHJhbmx1eDQ4X2Jhc2UsIDM4OSwgMTE+IHJhbmx1eDQ4OworCisgIHR5cGVkZWYgc2h1ZmZsZV9vcmRlcl9lbmdpbmU8bWluc3RkX3JhbmQwLCAyNTY+IGtudXRoX2I7CisKKyAgdHlwZWRlZiBtaW5zdGRfcmFuZDAgZGVmYXVsdF9yYW5kb21fZW5naW5lOworCisgIC8qKgorICAgKiBBIHN0YW5kYXJkIGludGVyZmFjZSB0byBhIHBsYXRmb3JtLXNwZWNpZmljIG5vbi1kZXRlcm1pbmlzdGljCisgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChpZiBhbnkgYXJlIGF2YWlsYWJsZSkuCisgICAqLworICBjbGFzcyByYW5kb21fZGV2aWNlCisgIHsKKyAgcHVibGljOgorICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSB2YWx1ZS4gKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCByZXN1bHRfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbnMKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9SQU5ET01fVFIxCisKKyAgICBleHBsaWNpdAorICAgIHJhbmRvbV9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIF9fdG9rZW4gPSAiL2Rldi91cmFuZG9tIikKKyAgICB7CisgICAgICBpZiAoKF9fdG9rZW4gIT0gIi9kZXYvdXJhbmRvbSIgJiYgX190b2tlbiAhPSAiL2Rldi9yYW5kb20iKQorCSAgfHwgIShfTV9maWxlID0gc3RkOjpmb3BlbihfX3Rva2VuLmNfc3RyKCksICJyYiIpKSkKKwlzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oInJhbmRvbV9kZXZpY2U6OiIKKwkJCQkgICAgICAgInJhbmRvbV9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmKSIpKTsKKyAgICB9CisKKyAgICB+cmFuZG9tX2RldmljZSgpCisgICAgeyBzdGQ6OmZjbG9zZShfTV9maWxlKTsgfQorCisjZWxzZQorCisgICAgZXhwbGljaXQKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3Rva2VuID0gIm10MTk5MzciKQorICAgIDogX01fbXQoX01fc3RydG91bChfX3Rva2VuKSkgeyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZworICAgIF9NX3N0cnRvdWwoY29uc3Qgc3RkOjpzdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgX19yZXQgPSA1NDg5VUw7CisgICAgICBpZiAoX19zdHIgIT0gIm10MTk5MzciKQorCXsKKwkgIGNvbnN0IGNoYXIqIF9fbnB0ciA9IF9fc3RyLmNfc3RyKCk7CisJICBjaGFyKiBfX2VuZHB0cjsKKwkgIF9fcmV0ID0gc3RkOjpzdHJ0b3VsKF9fbnB0ciwgJl9fZW5kcHRyLCAwKTsKKwkgIGlmICgqX19ucHRyID09ICdcMCcgfHwgKl9fZW5kcHRyICE9ICdcMCcpCisJICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigicmFuZG9tX2RldmljZTo6X01fc3RydG91bCIKKwkJCQkJICAgIihjb25zdCBzdGQ6OnN0cmluZyYpIikpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgcHVibGljOgorCisjZW5kaWYKKworICAgIHJlc3VsdF90eXBlCisgICAgbWluKCkgY29uc3QKKyAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWluKCk7IH0KKworICAgIHJlc3VsdF90eXBlCisgICAgbWF4KCkgY29uc3QKKyAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgIGRvdWJsZQorICAgIGVudHJvcHkoKSBjb25zdAorICAgIHsgcmV0dXJuIDAuMDsgfQorCisgICAgcmVzdWx0X3R5cGUKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEKKyAgICAgIHJlc3VsdF90eXBlIF9fcmV0OworICAgICAgc3RkOjpmcmVhZChyZWludGVycHJldF9jYXN0PHZvaWQqPigmX19yZXQpLCBzaXplb2YocmVzdWx0X3R5cGUpLAorCQkgMSwgX01fZmlsZSk7CisgICAgICByZXR1cm4gX19yZXQ7CisjZWxzZQorICAgICAgcmV0dXJuIF9NX210KCk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBObyBjb3B5IGZ1bmN0aW9ucy4KKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHJhbmRvbV9kZXZpY2UmKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCByYW5kb21fZGV2aWNlJikgPSBkZWxldGU7CisKKyAgcHJpdmF0ZToKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9SQU5ET01fVFIxCisgICAgRklMRSogICAgICAgIF9NX2ZpbGU7CisjZWxzZQorICAgIG10MTk5MzcgICAgICBfTV9tdDsKKyNlbmRpZgorICB9OworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV9nZW5lcmF0b3JzCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zIFJhbmRvbSBOdW1iZXIgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb20KKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX3VuaWZvcm0gVW5pZm9ybSBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgVW5pZm9ybSBkaXNjcmV0ZSBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKiBBIGRpc2NyZXRlIHJhbmRvbSBkaXN0cmlidXRpb24gb24gdGhlIHJhbmdlIEBmJFttaW4sIG1heF1AZiQgd2l0aCBlcXVhbAorICAgKiBwcm9iYWJpbGl0eSB0aHJvdWdob3V0IHRoZSByYW5nZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX0ludFR5cGUgX19hID0gMCwKKwkJICAgX0ludFR5cGUgX19iID0gc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpKQorCTogX01fYShfX2EpLCBfTV9iKF9fYikKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYSA8PSBfTV9iKTsKKwl9CisKKwlyZXN1bHRfdHlwZQorCWEoKSBjb25zdAorCXsgcmV0dXJuIF9NX2E7IH0KKworCXJlc3VsdF90eXBlCisJYigpIGNvbnN0CisJeyByZXR1cm4gX01fYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iOyB9CisKKyAgICAgIHByaXZhdGU6CisJX0ludFR5cGUgX01fYTsKKwlfSW50VHlwZSBfTV9iOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24oX0ludFR5cGUgX19hID0gMCwKKwkJCSAgIF9JbnRUeXBlIF9fYiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIHRoZSB1bmlmb3JtIGludGVnZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5hKCk7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmNsdXNpdmUgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5hKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+YigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdW5pZm9ybSBpbnRlZ2VyIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiBfX2QxLnBhcmFtKCkgPT0gX19kMi5wYXJhbSgpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdW5pZm9ybSBpbnRlZ2VyIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgY29uc3Qgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+Jik7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICV1bmlmb3JtX2ludF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgKgorICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+Jik7CisKKworICAvKioKKyAgICogQGJyaWVmIFVuaWZvcm0gY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBBIGNvbnRpbnVvdXMgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvbiB0aGUgcmFuZ2UgW21pbiwgbWF4KSB3aXRoIGVxdWFsCisgICAqIHByb2JhYmlsaXR5IHRocm91Z2hvdXQgdGhlIHJhbmdlLiAgVGhlIFVSTkcgc2hvdWxkIGJlIHJlYWwtdmFsdWVkIGFuZAorICAgKiBkZWxpdmVyIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIDEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9hKF9fYSksIF9NX2IoX19iKQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9hIDw9IF9NX2IpOworCX0KKworCXJlc3VsdF90eXBlCisJYSgpIGNvbnN0CisJeyByZXR1cm4gX01fYTsgfQorCisJcmVzdWx0X3R5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2I7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fYTsKKwlfUmVhbFR5cGUgX01fYjsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbWluIFtJTl0gIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fbWF4IFtJTl0gIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkJCV9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fYSwgX19iKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIERvZXMgbm90aGluZyBmb3IgdGhlIHVuaWZvcm0gcmVhbCBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmEoKTsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgYigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGluY2x1c2l2ZSBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBpbmNsdXNpdmUgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5iKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgdGhpcy0+cGFyYW0oKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKwl7CisJICBfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgICBfX2F1cm5nKF9fdXJuZyk7CisJICByZXR1cm4gKF9fYXVybmcoKSAqIChfX3AuYigpIC0gX19wLmEoKSkpICsgX19wLmEoKTsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHVuaWZvcm0gcmVhbCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiBfX2QxLnBhcmFtKCkgPT0gX19kMi5wYXJhbSgpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gdW5pZm9ybSByZWFsIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAldW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqICAgICAgICAgIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIGNvbnN0IHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+Jik7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICV1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mKTsKKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc191bmlmb3JtCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX25vcm1hbCBOb3JtYWwgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgbm9ybWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxcbXUsXHNpZ21hKSA9IFxmcmFjezF9e1xzaWdtYSBcc3FydHsyIFxwaX19CisgICAqICAgICAgICAgICAgZV57LSBcZnJhY3t7eCAtIFxtdX1eIHsyfX17MiBcc2lnbWEgXiB7Mn19IH0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIG5vcm1hbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX21lYW4gPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX3N0ZGRldiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX21lYW4oX19tZWFuKSwgX01fc3RkZGV2KF9fc3RkZGV2KQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zdGRkZXYgPiBfUmVhbFR5cGUoMCkpOworCX0KKworCV9SZWFsVHlwZQorCW1lYW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX21lYW47IH0KKworCV9SZWFsVHlwZQorCXN0ZGRldigpIGNvbnN0CisJeyByZXR1cm4gX01fc3RkZGV2OyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiAoX19wMS5fTV9tZWFuID09IF9fcDIuX01fbWVhbgorCQkgICYmIF9fcDEuX01fc3RkZGV2ID09IF9fcDIuX01fc3RkZGV2KTsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9tZWFuOworCV9SZWFsVHlwZSBfTV9zdGRkZXY7CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIHBhcmFtZXRlcnMgQGYkbWVhbkBmJCBhbmQKKyAgICAgICAqIHN0YW5kYXJkIGRldmlhdGlvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb24ocmVzdWx0X3R5cGUgX19tZWFuID0gcmVzdWx0X3R5cGUoMCksCisJCQkgIHJlc3VsdF90eXBlIF9fc3RkZGV2ID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbWVhbiwgX19zdGRkZXYpLCBfTV9zYXZlZF9hdmFpbGFibGUoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9zYXZlZF9hdmFpbGFibGUoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fc2F2ZWRfYXZhaWxhYmxlID0gZmFsc2U7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG1lYW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubWVhbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIHN0ZGRldigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5zdGRkZXYoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCB0aGlzLT5wYXJhbSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIG5vcm1hbCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxPgorCWZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QxLAorCQkgICBjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9fZDIpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHBhcmFtX3R5cGUgIF9NX3BhcmFtOworICAgICAgcmVzdWx0X3R5cGUgX01fc2F2ZWQ7CisgICAgICBib29sICAgICAgICBfTV9zYXZlZF9hdmFpbGFibGU7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBub3JtYWwgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxtLHMpID0gXGZyYWN7MX17c3hcc3FydHsyXHBpfX0KKyAgICogICAgICAgICAgICAgICAgXGV4cHstXGZyYWN7KFxsbnt4fSAtIG0pXjJ9ezJzXjJ9fSAKKyAgICogQGZdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fbSA9IF9SZWFsVHlwZSgwKSwKKwkJICAgX1JlYWxUeXBlIF9fcyA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX20oX19tKSwgX01fcyhfX3MpCisJeyB9CisKKwlfUmVhbFR5cGUKKwltKCkgY29uc3QKKwl7IHJldHVybiBfTV9tOyB9CisKKwlfUmVhbFR5cGUKKwlzKCkgY29uc3QKKwl7IHJldHVybiBfTV9zOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX20gPT0gX19wMi5fTV9tICYmIF9fcDEuX01fcyA9PSBfX3AyLl9NX3M7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbTsKKwlfUmVhbFR5cGUgX01fczsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX20gPSBfUmVhbFR5cGUoMCksCisJCQkgICAgIF9SZWFsVHlwZSBfX3MgPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbSwgX19zKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBsb2dub3JtYWxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tKCk7IH0KKworICAgICAgX1JlYWxUeXBlCisgICAgICBzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnMoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsgcmV0dXJuIHN0ZDo6ZXhwKF9fcC5zKCkgKiBfTV9uZChfX3VybmcpICsgX19wLm0oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGxvZ25vcm1hbCBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMSwKKwkJICAgY29uc3Qgc3RkOjpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QyKQorICAgICAgICB7IHJldHVybiAoX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKQorCQkgICYmIF9fZDEuX01fbmQgPT0gX19kMi5fTV9uZCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVsb2dub3JtYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgc3RkOjpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9uZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGxvZ25vcm1hbCBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBnYW1tYSBjb250aW51b3VzIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgZ2FtbWEgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpczoKKyAgICogQGZbCisgICAqICAgICBwKHh8XGFscGhhLFxiZXRhKSA9IFxmcmFjezF9e1xiZXRhXEdhbW1hKFxhbHBoYSl9CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICh4L1xiZXRhKV57XGFscGhhIC0gMX0gZV57LXgvXGJldGF9IAorICAgKiBAZl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBnYW1tYV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX2FscGhhX3ZhbCA9IF9SZWFsVHlwZSgxKSwKKwkJICAgX1JlYWxUeXBlIF9fYmV0YV92YWwgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9hbHBoYShfX2FscGhhX3ZhbCksIF9NX2JldGEoX19iZXRhX3ZhbCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fYWxwaGEgPiBfUmVhbFR5cGUoMCkpOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCV9SZWFsVHlwZQorCWFscGhhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hbHBoYTsgfQorCisJX1JlYWxUeXBlCisJYmV0YSgpIGNvbnN0CisJeyByZXR1cm4gX01fYmV0YTsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gKF9fcDEuX01fYWxwaGEgPT0gX19wMi5fTV9hbHBoYQorCQkgICYmIF9fcDEuX01fYmV0YSA9PSBfX3AyLl9NX2JldGEpOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCV9SZWFsVHlwZSBfTV9hbHBoYTsKKwlfUmVhbFR5cGUgX01fYmV0YTsKKworCV9SZWFsVHlwZSBfTV9tYWxwaGEsIF9NX2EyOworICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBnYW1tYSBkaXN0cmlidXRpb24gd2l0aCBwYXJhbWV0ZXJzCisgICAgICAgKiBAZiRcYWxwaGFAZiQgYW5kIEBmJFxiZXRhQGYkLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZ2FtbWFfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX2FscGhhX3ZhbCA9IF9SZWFsVHlwZSgxKSwKKwkJCSBfUmVhbFR5cGUgX19iZXRhX3ZhbCA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hbHBoYV92YWwsIF9fYmV0YV92YWwpLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIEBmJFxhbHBoYUBmJCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGFscGhhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmFscGhhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQGYkXGJldGFAZiQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBiZXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmJldGEoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZ2FtbWEgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgICAgKiAgICAgICAgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAorICAgICAgICogICAgICAgIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMSwKKwkJICAgY29uc3Qgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9fZDIpCisgICAgICAgIHsgcmV0dXJuIChfX2QxLnBhcmFtKCkgPT0gX19kMi5wYXJhbSgpCisJCSAgJiYgX19kMS5fTV9uZCA9PSBfX2QyLl9NX25kKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2FtbWFfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfTV9uZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGdhbW1hIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCQljb25zdCBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZiRwKHh8bikgPSBcZnJhY3t4Xnsobi8yKSAtIDF9ZV57LXgvMn19e1xHYW1tYShuLzIpIDJee24vMn19QGYkCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9uKF9fbikKKwl7IH0KKworCV9SZWFsVHlwZQorCW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX247IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbiA9PSBfX3AyLl9NX247IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb24oX1JlYWxUeXBlIF9fbiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19uKSwgX01fZ2QoX19uIC8gMikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKSwgX01fZ2QoX19wLm4oKSAvIDIpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fZ2QucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5uKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIDIgKiBfTV9nZChfX3VybmcpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIHBhcmFtX3R5cGU7CisJICByZXR1cm4gMiAqIF9NX2dkKF9fdXJuZywgcGFyYW1fdHlwZShfX3AubigpIC8gMikpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIENoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHRoZSBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZQorICAgICAgICogICAgICAgIGdlbmVyYXRlZCBhcmUgZXF1YWwuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9fZDEsCisJCSAgIGNvbnN0IHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QyKQorICAgICAgICB7IHJldHVybiBfX2QxLnBhcmFtKCkgPT0gX19kMi5wYXJhbSgpICYmIF9fZDEuX01fZ2QgPT0gX19kMi5fTV9nZDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWNoaV9zcXVhcmVkX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlY2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgc3RkOjpjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6OmdhbW1hX2Rpc3RyaWJ1dGlvbjxyZXN1bHRfdHlwZT4gX01fZ2Q7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBDaGktc3F1YXJlZCBkaXN0cmlidXRpb25zIGFyZSBkaWZmZXJlbnQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6Y2hpX3NxdWFyZWRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgY2F1Y2h5X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZiRwKHh8YSxiKSA9IChccGkgYiAoMSArIChcZnJhY3t4LWF9e2J9KV4yKSleey0xfUBmJAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGNhdWNoeV9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgY2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9hKF9fYSksIF9NX2IoX19iKQorCXsgfQorCisJX1JlYWxUeXBlCisJYSgpIGNvbnN0CisJeyByZXR1cm4gX01fYTsgfQorCisJX1JlYWxUeXBlCisJYigpIGNvbnN0CisJeyByZXR1cm4gX01fYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX2E7CisJX1JlYWxUeXBlIF9NX2I7CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgY2F1Y2h5X2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDApLAorCQkJICBfUmVhbFR5cGUgX19iID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9wYXJhbShfX2EsIF9fYikKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY2F1Y2h5X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmEoKTsgfQorCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgcHJpdmF0ZToKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBDYXVjaHkgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6OmNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIENhdWNoeSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgJWNhdWNoeV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlY2F1Y2h5X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAqIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIGNvbnN0IHN0ZDo6Y2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+Jik7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICVjYXVjaHlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194IEEgJWNhdWNoeV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIHN0ZDo6Y2F1Y2h5X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+Jik7CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZmlzaGVyX2ZfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqIEBmWworICAgKiAgICAgcCh4fG0sbikgPSBcZnJhY3tcR2FtbWEoKG0rbikvMil9e1xHYW1tYShtLzIpXEdhbW1hKG4vMil9CisgICAqICAgICAgICAgICAgICAgIChcZnJhY3ttfXtufSlee20vMn0geF57KG0vMiktMX0KKyAgICogICAgICAgICAgICAgICAgKDEgKyBcZnJhY3tteH17bn0pXnstKG0rbikvMn0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19tID0gX1JlYWxUeXBlKDEpLAorCQkgICBfUmVhbFR5cGUgX19uID0gX1JlYWxUeXBlKDEpKQorCTogX01fbShfX20pLCBfTV9uKF9fbikKKwl7IH0KKworCV9SZWFsVHlwZQorCW0oKSBjb25zdAorCXsgcmV0dXJuIF9NX207IH0KKworCV9SZWFsVHlwZQorCW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX247IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbSA9PSBfX3AyLl9NX20gJiYgX19wMS5fTV9uID09IF9fcDIuX01fbjsgfQorCisgICAgICBwcml2YXRlOgorCV9SZWFsVHlwZSBfTV9tOworCV9SZWFsVHlwZSBfTV9uOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19tID0gX1JlYWxUeXBlKDEpLAorCQkJICAgIF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbSwgX19uKSwgX01fZ2RfeChfX20gLyAyKSwgX01fZ2RfeShfX24gLyAyKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBmaXNoZXJfZl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9nZF94KF9fcC5tKCkgLyAyKSwgX01fZ2RfeShfX3AubigpIC8gMikKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9NX2dkX3gucmVzZXQoKTsKKwlfTV9nZF95LnJlc2V0KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICoKKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLm0oKTsgfQorCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiAoX01fZ2RfeChfX3VybmcpICogbigpKSAvIChfTV9nZF95KF9fdXJuZykgKiBtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIHBhcmFtX3R5cGU7CisJICByZXR1cm4gKChfTV9nZF94KF9fdXJuZywgcGFyYW1fdHlwZShfX3AubSgpIC8gMikpICogbigpKQorCQkgIC8gKF9NX2dkX3koX191cm5nLCBwYXJhbV90eXBlKF9fcC5uKCkgLyAyKSkgKiBtKCkpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBGaXNoZXIgZiBkaXN0cmlidXRpb25zIGhhdmUKKyAgICAgICAqICAgICAgICB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCB0aGUgc2VxdWVuY2VzIHRoYXQgd291bGQKKyAgICAgICAqICAgICAgICBiZSBnZW5lcmF0ZWQgYXJlIGVxdWFsLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX2QxLAorCQkgICBjb25zdCBzdGQ6OmZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMikKKyAgICAgICAgeyByZXR1cm4gKF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCkKKwkJICAmJiBfX2QxLl9NX2dkX3ggPT0gX19kMi5fTV9nZF94CisJCSAgJiYgX19kMS5fTV9nZF95ID09IF9fZDIuX01fZ2RfeSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBjb25zdCBzdGQ6OmZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVmaXNoZXJfZl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWZpc2hlcl9mX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIHN0ZDo6ZmlzaGVyX2ZfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkX3gsIF9NX2dkX3k7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBGaXNoZXIgZiBkaXN0cmlidXRpb25zIGFyZSBkaWZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEEgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpczoKKyAgICogQGZbCisgICAqICAgICBwKHh8bikgPSBcZnJhY3sxfXtcc3FydChuXHBpKX0gXGZyYWN7XEdhbW1hKChuKzEpLzIpfXtcR2FtbWEobi8yKX0KKyAgICogICAgICAgICAgICAgICgxICsgXGZyYWN7eF4yfXtufSkgXnstKG4rMSkvMn0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHN0dWRlbnRfdF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8X1JlYWxUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9uKF9fbikKKwl7IH0KKworCV9SZWFsVHlwZQorCW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX247IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbiA9PSBfX3AyLl9NX247IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fbjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdHVkZW50X3RfZGlzdHJpYnV0aW9uKF9SZWFsVHlwZSBfX24gPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX3BhcmFtKF9fbiksIF9NX25kKCksIF9NX2dkKF9fbiAvIDIsIDIpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHN0dWRlbnRfdF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpLCBfTV9nZChfX3AubigpIC8gMiwgMikKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworCV9NX25kLnJlc2V0KCk7CisJX01fZ2QucmVzZXQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0ubigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgICB7IHJldHVybiBfTV9uZChfX3VybmcpICogc3RkOjpzcXJ0KG4oKSAvIF9NX2dkKF9fdXJuZykpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+OjpwYXJhbV90eXBlCisJICAgIHBhcmFtX3R5cGU7CisJCisJICBjb25zdCByZXN1bHRfdHlwZSBfX2cgPSBfTV9nZChfX3VybmcsIHBhcmFtX3R5cGUoX19wLm4oKSAvIDIsIDIpKTsKKwkgIHJldHVybiBfTV9uZChfX3VybmcpICogc3RkOjpzcXJ0KF9fcC5uKCkgLyBfX2cpOworICAgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBTdHVkZW50IHQgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6OnN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9fZDEsCisJCSAgIGNvbnN0IHN0ZDo6c3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX19kMikKKyAgICAgICAgeyByZXR1cm4gKF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCkKKwkJICAmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQgJiYgX19kMS5fTV9nZCA9PSBfX2QyLl9NX2dkKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXN0dWRlbnRfdF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXN0dWRlbnRfdF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3Qgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEV4dHJhY3RzIGEgJXN0dWRlbnRfdF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJXN0dWRlbnRfdF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6OnN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworCisgICAgICBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX25kOworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9NX2dkOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gU3R1ZGVudCB0IGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpzdHVkZW50X3RfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6c3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyogQH0gKi8gLy8gZ3JvdXAgcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfbm9ybWFsCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX2Jlcm5vdWxsaSBCZXJub3VsbGkgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgQmVybm91bGxpIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBHZW5lcmF0ZXMgYSBzZXF1ZW5jZSBvZiB0cnVlIGFuZCBmYWxzZSB2YWx1ZXMgd2l0aCBsaWtlbGlob29kIEBmJHBAZiQKKyAgICogdGhhdCB0cnVlIHdpbGwgY29tZSB1cCBhbmQgQGYkKDEgLSBwKUBmJCB0aGF0IGZhbHNlIHdpbGwgYXBwZWFyLgorICAgKi8KKyAgY2xhc3MgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbgorICB7CisgIHB1YmxpYzoKKyAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb25fdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHBhcmFtX3R5cGUoZG91YmxlIF9fcCA9IDAuNSkKKyAgICAgIDogX01fcChfX3ApCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV9wID49IDAuMCkgJiYgKF9NX3AgPD0gMS4wKSk7CisgICAgICB9CisKKyAgICAgIGRvdWJsZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wOyB9CisKKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisgICAgICB7IHJldHVybiBfX3AxLl9NX3AgPT0gX19wMi5fTV9wOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgZG91YmxlIF9NX3A7CisgICAgfTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uIHdpdGggbGlrZWxpaG9vZCBAcCBwLgorICAgICAqCisgICAgICogQHBhcmFtIF9fcCAgW0lOXSAgVGhlIGxpa2VsaWhvb2Qgb2YgYSB0cnVlIHJlc3VsdCBiZWluZyByZXR1cm5lZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGluIHRoZSBpbnRlcnZhbCBAZiRbMCwgMV1AZiQuCisgICAgICovCisgICAgZXhwbGljaXQKKyAgICBiZXJub3VsbGlfZGlzdHJpYnV0aW9uKGRvdWJsZSBfX3AgPSAwLjUpCisgICAgOiBfTV9wYXJhbShfX3ApCisgICAgeyB9CisKKyAgICBleHBsaWNpdAorICAgIGJlcm5vdWxsaV9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgIDogX01fcGFyYW0oX19wKQorICAgIHsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAqCisgICAgICogRG9lcyBub3RoaW5nIGZvciBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgdm9pZAorICAgIHJlc2V0KCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgQHAgcCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICBkb3VibGUKKyAgICBwKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wYXJhbS5wKCk7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgcGFyYW1fdHlwZQorICAgIHBhcmFtKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgcmVzdWx0X3R5cGUKKyAgICBtaW4oKSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptaW4oKTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgcmVzdWx0X3R5cGUKKyAgICBtYXgoKSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCB0aGlzLT5wYXJhbSgpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCWlmICgoX19hdXJuZygpIC0gX19hdXJuZy5taW4oKSkKKwkgICAgIDwgX19wLnAoKSAqIChfX2F1cm5nLm1heCgpIC0gX19hdXJuZy5taW4oKSkpCisJICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEJlcm5vdWxsaSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMuCisgICAqLworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6YmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX19kMSwKKwkgICAgIGNvbnN0IHN0ZDo6YmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX19kMikKKyAgeyByZXR1cm4gX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIEJlcm5vdWxsaSBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9fZDEsCisJICAgICBjb25zdCBzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9fZDIpCisgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAqCisgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgY29uc3Qgc3RkOjpiZXJub3VsbGlfZGlzdHJpYnV0aW9uJik7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBhICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgc3RkOjpiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgeworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX19wOworICAgICAgX194LnBhcmFtKGJlcm5vdWxsaV9kaXN0cmlidXRpb246OnBhcmFtX3R5cGUoX19wKSk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgYmlub21pYWwgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgYmlub21pYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZiRwKGl8dCxwKSA9IFxiaW5vbXtufXtpfSBwXmkgKDEgLSBwKV57dCAtIGl9QGYkIHdoZXJlIEBmJHRAZiQKKyAgICogYW5kIEBmJHBAZiQgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfaW50ZWdyYWw8X0ludFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYW4gaW50ZWdyYWwgdHlwZSIpOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSByYW5nZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCWZyaWVuZCBjbGFzcyBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9JbnRUeXBlIF9fdCA9IF9JbnRUeXBlKDEpLCBkb3VibGUgX19wID0gMC41KQorCTogX01fdChfX3QpLCBfTV9wKF9fcCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3QgPj0gX0ludFR5cGUoMCkpCisJCQkJJiYgKF9NX3AgPj0gMC4wKQorCQkJCSYmIChfTV9wIDw9IDEuMCkpOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCV9JbnRUeXBlCisJdCgpIGNvbnN0CisJeyByZXR1cm4gX01fdDsgfQorCisJZG91YmxlCisJcCgpIGNvbnN0CisJeyByZXR1cm4gX01fcDsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV90ID09IF9fcDIuX01fdCAmJiBfX3AxLl9NX3AgPT0gX19wMi5fTV9wOyB9CisKKyAgICAgIHByaXZhdGU6CisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCV9JbnRUeXBlIF9NX3Q7CisJZG91YmxlIF9NX3A7CisKKwlkb3VibGUgX01fcTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJZG91YmxlIF9NX2QxLCBfTV9kMiwgX01fczEsIF9NX3MyLCBfTV9jLAorCSAgICAgICBfTV9hMSwgX01fYTEyMywgX01fcywgX01fbGYsIF9NX2xwMXA7CisjZW5kaWYKKwlib29sICAgX01fZWFzeTsKKyAgICAgIH07CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBleHBsaWNpdAorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uKF9JbnRUeXBlIF9fdCA9IF9JbnRUeXBlKDEpLAorCQkJICAgIGRvdWJsZSBfX3AgPSAwLjUpCisgICAgICA6IF9NX3BhcmFtKF9fdCwgX19wKSwgX01fbmQoKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gQHAgdCBwYXJhbWV0ZXIuCisgICAgICAgKi8KKyAgICAgIF9JbnRUeXBlCisgICAgICB0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gQHAgcCBwYXJhbWV0ZXIuCisgICAgICAgKi8KKyAgICAgIGRvdWJsZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gYmlub21pYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkCisgICAgICAgKiAgICAgICAgYmUgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxPgorCWZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX19kMSwKKwkJICAgY29uc3Qgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX19kMikKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJeyByZXR1cm4gX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKSAmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQ7IH0KKyNlbHNlCisgICAgICAgIHsgcmV0dXJuIF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJWJpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgY29uc3Qgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yCisgICAgICAgKiAgICAgICAgICBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6OmJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlfTV93YWl0aW5nKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsIF9JbnRUeXBlIF9fdCk7CisKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisKKyAgICAgIC8vIE5COiBVbnVzZWQgd2hlbiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIGlzIHVuZGVmaW5lZC4KKyAgICAgIHN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IF9NX25kOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gYmlub21pYWwgZGlzdHJpYnV0aW9ucyBhcmUgZGlmZmVyZW50LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6Ymlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIGRpc2NyZXRlIGdlb21ldHJpYyByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBnZW9tZXRyaWMgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpcworICAgKiBAZiRwKGl8cCkgPSBwKDEgLSBwKV57aX1AZiQgd2hlcmUgQGYkcEBmJCBpcyB0aGUgcGFyYW1ldGVyIG9mIHRoZQorICAgKiBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPF9JbnRUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGFuIGludGVncmFsIHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCWZyaWVuZCBjbGFzcyBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShkb3VibGUgX19wID0gMC41KQorCTogX01fcChfX3ApCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV9wID4gMC4wKQorCQkJICAgICAmJiAoX01fcCA8IDEuMCkpOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCWRvdWJsZQorCXAoKSBjb25zdAorCXsgcmV0dXJuIF9NX3A7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fcCA9PSBfX3AyLl9NX3A7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpCisJeyBfTV9sb2dfMV9wID0gc3RkOjpsb2coMS4wIC0gX01fcCk7IH0KKworCWRvdWJsZSBfTV9wOworCisJZG91YmxlIF9NX2xvZ18xX3A7CisgICAgICB9OworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb24oZG91YmxlIF9fcCA9IDAuNSkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqIERvZXMgbm90aGluZyBmb3IgdGhlIGdlb21ldHJpYyBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXIgQHAgcC4KKyAgICAgICAqLworICAgICAgZG91YmxlCisgICAgICBwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLnAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKwl7IHJldHVybiB0aGlzLT5vcGVyYXRvcigpKF9fdXJuZywgdGhpcy0+cGFyYW0oKSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSAgIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCk7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGdlb21ldHJpYyBkaXN0cmlidXRpb25zIGhhdmUKKyAgICogICAgICAgIHRoZSBzYW1lIHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiBfX2QxLnBhcmFtKCkgPT0gX19kMi5wYXJhbSgpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZ2VvbWV0cmljIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgKiAgICAgICAgZGlmZmVyZW50IHBhcmFtZXRlcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgKgorICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194ICBBICVnZW9tZXRyaWNfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJICAgICAgIGNvbnN0IHN0ZDo6Z2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mKTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgKgorICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBfX3ggIEEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgc3RkOjpnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYpOworCisKKyAgLyoqCisgICAqIEBicmllZiBBIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBuZWdhdGl2ZSBiaW5vbWlhbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqIEBmJHAoaSkgPSBcYmlub217bn17aX0gcF5pICgxIC0gcClee3QgLSBpfUBmJCB3aGVyZSBAZiR0QGYkCisgICAqIGFuZCBAZiRwQGYkIGFyZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQ+CisgICAgY2xhc3MgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2ludGVncmFsPF9JbnRUeXBlPjo6dmFsdWUsCisJCSAgICAidGVtcGxhdGUgYXJndW1lbnQgbm90IGFuIGludGVncmFsIHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAvKiogUGFyYW1ldGVyIHR5cGUuICovCisgICAgICBzdHJ1Y3QgcGFyYW1fdHlwZQorICAgICAgeworCXR5cGVkZWYgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfSW50VHlwZSBfX2sgPSAxLCBkb3VibGUgX19wID0gMC41KQorCTogX01fayhfX2spLCBfTV9wKF9fcCkKKwl7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX2sgPiAwKSAmJiAoX01fcCA+IDAuMCkgJiYgKF9NX3AgPD0gMS4wKSk7CisJfQorCisJX0ludFR5cGUKKwlrKCkgY29uc3QKKwl7IHJldHVybiBfTV9rOyB9CisKKwlkb3VibGUKKwlwKCkgY29uc3QKKwl7IHJldHVybiBfTV9wOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2sgPT0gX19wMi5fTV9rICYmIF9fcDEuX01fcCA9PSBfX3AyLl9NX3A7IH0KKworICAgICAgcHJpdmF0ZToKKwlfSW50VHlwZSBfTV9rOworCWRvdWJsZSBfTV9wOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbihfSW50VHlwZSBfX2sgPSAxLCBkb3VibGUgX19wID0gMC41KQorICAgICAgOiBfTV9wYXJhbShfX2ssIF9fcCksIF9NX2dkKF9faywgKDEuMCAtIF9fcCkgLyBfX3ApCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCksIF9NX2dkKF9fcC5rKCksICgxLjAgLSBfX3AucCgpKSAvIF9fcC5wKCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fZ2QucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIEBmJGtAZiQgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9JbnRUeXBlCisgICAgICBrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmsoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIEBmJHBAZiQgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIGRvdWJsZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gcmVzdWx0X3R5cGUoMCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gbmVnYXRpdmUgYmlub21pYWwgZGlzdHJpYnV0aW9ucyBoYXZlCisgICAgICAgKiAgICAgICAgdGhlIHNhbWUgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlCisgICAgICAgKiAgICAgICAgZ2VuZXJhdGVkIGFyZSBlcXVhbC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mIF9fZDEsCisJCSAgIGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mIF9fZDIpCisgICAgICAgIHsgcmV0dXJuIF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCkgJiYgX19kMS5fTV9nZCA9PSBfX2QyLl9NX2dkOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluc2VydHMgYSAlbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbQorICAgICAgICogICAgICAgIG51bWJlciBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqICAgICAgICAgIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBkaXN0cmlidXRpb24gQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggQSAlbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6Om5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgc3RkOjpnYW1tYV9kaXN0cmlidXRpb248ZG91YmxlPiBfTV9nZDsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6Om5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6bmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX2Jlcm5vdWxsaQorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByYW5kb21fZGlzdHJpYnV0aW9uc19wb2lzc29uIFBvaXNzb24gRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgUG9pc3NvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBQb2lzc29uIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gaXMKKyAgICogQGYkcChpfFxtdSkgPSBcZnJhY3tcbXVeaX17aSF9IGVeey1cbXV9QGYkIHdoZXJlIEBmJFxtdUBmJCBpcyB0aGUKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludD4KKyAgICBjbGFzcyBwb2lzc29uX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlICByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShkb3VibGUgX19tZWFuID0gMS4wKQorCTogX01fbWVhbihfX21lYW4pCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX21lYW4gPiAwLjApOworCSAgX01faW5pdGlhbGl6ZSgpOworCX0KKworCWRvdWJsZQorCW1lYW4oKSBjb25zdAorCXsgcmV0dXJuIF9NX21lYW47IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbWVhbiA9PSBfX3AyLl9NX21lYW47IH0KKworICAgICAgcHJpdmF0ZToKKwkvLyBIb3N0cyBlaXRoZXIgbG9nKG1lYW4pIG9yIHRoZSB0aHJlc2hvbGQgb2YgdGhlIHNpbXBsZSBtZXRob2QuCisJdm9pZAorCV9NX2luaXRpYWxpemUoKTsKKworCWRvdWJsZSBfTV9tZWFuOworCisJZG91YmxlIF9NX2xtX3RocjsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJZG91YmxlIF9NX2xmbSwgX01fc20sIF9NX2QsIF9NX3NjeCwgX01fMWN4LCBfTV9jMmIsIF9NX2NiOworI2VuZGlmCisgICAgICB9OworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uKGRvdWJsZSBfX21lYW4gPSAxLjApCisgICAgICA6IF9NX3BhcmFtKF9fbWVhbiksIF9NX25kKCkKKyAgICAgIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb24oY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgOiBfTV9wYXJhbShfX3ApLCBfTV9uZCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgX01fbmQucmVzZXQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gcGFyYW1ldGVyIEBwIG1lYW4uCisgICAgICAgKi8KKyAgICAgIGRvdWJsZQorICAgICAgbWVhbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbS5tZWFuKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICAgLyoqCisJKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFBvaXNzb24gZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisJKiAgICAgICAgcGFyYW1ldGVycyBhbmQgdGhlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZAorCSogICAgICAgIGFyZSBlcXVhbC4KKwkqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUxPiYgX19kMSwKKwkJICAgY29uc3Qgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+JiBfX2QyKQorI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgeyByZXR1cm4gX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKSAmJiBfX2QxLl9NX25kID09IF9fZDIuX01fbmQ7IH0KKyNlbHNlCisgICAgICAgIHsgcmV0dXJuIF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKworICAgICAgLy8gTkI6IFVudXNlZCB3aGVuIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEgaXMgdW5kZWZpbmVkLgorICAgICAgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gX01fbmQ7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBQb2lzc29uIGRpc3RyaWJ1dGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gIShfX2QxID09IF9fZDIpOyB9CisKKworICAvKioKKyAgICogQGJyaWVmIEFuIGV4cG9uZW50aWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBleHBvbmVudGlhbCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzCisgICAqIEBmJHAoeHxcbGFtYmRhKSA9IFxsYW1iZGEgZV57LVxsYW1iZGEgeH1AZiQuCisgICAqCisgICAqIDx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgorICAgKiA8Y2FwdGlvbiBhbGlnbj10b3A+RGlzdHJpYnV0aW9uIFN0YXRpc3RpY3M8L2NhcHRpb24+CisgICAqIDx0cj48dGQ+TWVhbjwvdGQ+PHRkPkBmJFxmcmFjezF9e1xsYW1iZGF9QGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPk1lZGlhbjwvdGQ+PHRkPkBmJFxmcmFje1xsbiAyfXtcbGFtYmRhfUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5Nb2RlPC90ZD48dGQ+QGYkemVyb0BmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5SYW5nZTwvdGQ+PHRkPkBmJFswLCBcaW5mdHldQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPlN0YW5kYXJkIERldmlhdGlvbjwvdGQ+PHRkPkBmJFxmcmFjezF9e1xsYW1iZGF9QGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiBkaXN0cmlidXRpb25fdHlwZTsKKworCWV4cGxpY2l0CisJcGFyYW1fdHlwZShfUmVhbFR5cGUgX19sYW1iZGEgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9sYW1iZGEoX19sYW1iZGEpCisJeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2xhbWJkYSA+IF9SZWFsVHlwZSgwKSk7CisJfQorCisJX1JlYWxUeXBlCisJbGFtYmRhKCkgY29uc3QKKwl7IHJldHVybiBfTV9sYW1iZGE7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fbGFtYmRhID09IF9fcDIuX01fbGFtYmRhOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX2xhbWJkYTsKKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGFuIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiB3aXRoIGludmVyc2Ugc2NhbGUKKyAgICAgICAqICAgICAgICBwYXJhbWV0ZXIgQGYkXGxhbWJkYUBmJC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbihjb25zdCByZXN1bHRfdHlwZSYgX19sYW1iZGEgPSByZXN1bHRfdHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19sYW1iZGEpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBIYXMgbm8gZWZmZWN0IG9uIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbnMuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGludmVyc2Ugc2NhbGUgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbGFtYmRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmxhbWJkYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJlc3VsdF90eXBlKDApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGxlYXN0IHVwcGVyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdlbmVyYXRpbmcgZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApCisJeworCSAgX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgICAgX19hdXJuZyhfX3VybmcpOworCSAgcmV0dXJuIC1zdGQ6OmxvZyhfX2F1cm5nKCkpIC8gX19wLmxhbWJkYSgpOworCX0KKworICAgIHByaXZhdGU6CisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuIF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBleHBvbmVudGlhbCBkaXN0cmlidXRpb25zIGhhdmUgZGlmZmVyZW50CisgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICogYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgY29uc3Qgc3RkOjpleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYpOworCisgIC8qKgorICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194IEEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgc3RkOjpleHBvbmVudGlhbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYpOworCisKKyAgLyoqCisgICAqIEBicmllZiBBIHdlaWJ1bGxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9uIGlzOgorICAgKiBAZlsKKyAgICogICAgIHAoeHxcYWxwaGEsXGJldGEpID0gXGZyYWN7XGFscGhhfXtcYmV0YX0gKFxmcmFje3h9e1xiZXRhfSlee1xhbHBoYS0xfQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBcZXhweygtKFxmcmFje3h9e1xiZXRhfSleXGFscGhhKX0gCisgICAqIEBmXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHdlaWJ1bGxfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisKKwlleHBsaWNpdAorCXBhcmFtX3R5cGUoX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgxKSwKKwkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKwk6IF9NX2EoX19hKSwgX01fYihfX2IpCisJeyB9CisKKwlfUmVhbFR5cGUKKwlhKCkgY29uc3QKKwl7IHJldHVybiBfTV9hOyB9CisKKwlfUmVhbFR5cGUKKwliKCkgY29uc3QKKwl7IHJldHVybiBfTV9iOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2EgPT0gX19wMi5fTV9hICYmIF9fcDEuX01fYiA9PSBfX3AyLl9NX2I7IH0KKworICAgICAgcHJpdmF0ZToKKwlfUmVhbFR5cGUgX01fYTsKKwlfUmVhbFR5cGUgX01fYjsKKyAgICAgIH07CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB3ZWlidWxsX2Rpc3RyaWJ1dGlvbihfUmVhbFR5cGUgX19hID0gX1JlYWxUeXBlKDEpLAorCQkJICAgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRhQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgQGYkYkBmJCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBiKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgcHJpdmF0ZToKKyAgICAgIHBhcmFtX3R5cGUgX01fcGFyYW07CisgICAgfTsKKworICAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFdlaWJ1bGwgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgKiAgICAgICAgcGFyYW1ldGVycy4KKyAgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6d2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjp3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuIF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCk7IH0KKworICAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIFdlaWJ1bGwgZGlzdHJpYnV0aW9ucyBoYXZlIGRpZmZlcmVudAorICAgICogICAgICAgIHBhcmFtZXRlcnMuCisgICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OndlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6d2VpYnVsbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAld2VpYnVsbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAld2VpYnVsbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCSAgICAgICBjb25zdCBzdGQ6OndlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mKTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJXdlaWJ1bGxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICoKKyAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgKiBAcGFyYW0gX194IEEgJXdlaWJ1bGxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgKgorICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCSAgICAgICBzdGQ6OndlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mKTsKKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKiBAZlsKKyAgICogICAgIHAoeHxhLGIpID0gXGZyYWN7MX17Yn0KKyAgICogICAgICAgICAgICAgICAgXGV4cCggXGZyYWN7YS14fXtifSAtIFxleHAoXGZyYWN7YS14fXtifSkpIAorICAgKiBAZl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+IGRpc3RyaWJ1dGlvbl90eXBlOworCisJZXhwbGljaXQKKwlwYXJhbV90eXBlKF9SZWFsVHlwZSBfX2EgPSBfUmVhbFR5cGUoMCksCisJCSAgIF9SZWFsVHlwZSBfX2IgPSBfUmVhbFR5cGUoMSkpCisJOiBfTV9hKF9fYSksIF9NX2IoX19iKQorCXsgfQorCisJX1JlYWxUeXBlCisJYSgpIGNvbnN0CisJeyByZXR1cm4gX01fYTsgfQorCisJX1JlYWxUeXBlCisJYigpIGNvbnN0CisJeyByZXR1cm4gX01fYjsgfQorCisJZnJpZW5kIGJvb2wKKwlvcGVyYXRvcj09KGNvbnN0IHBhcmFtX3R5cGUmIF9fcDEsIGNvbnN0IHBhcmFtX3R5cGUmIF9fcDIpCisJeyByZXR1cm4gX19wMS5fTV9hID09IF9fcDIuX01fYSAmJiBfX3AxLl9NX2IgPT0gX19wMi5fTV9iOyB9CisKKyAgICAgIHByaXZhdGU6CisJX1JlYWxUeXBlIF9NX2E7CisJX1JlYWxUeXBlIF9NX2I7CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24oX1JlYWxUeXBlIF9fYSA9IF9SZWFsVHlwZSgwKSwKKwkJCQkgX1JlYWxUeXBlIF9fYiA9IF9SZWFsVHlwZSgxKSkKKyAgICAgIDogX01fcGFyYW0oX19hLCBfX2IpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBAZiRhQGYkIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW0uYSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybiB0aGUgQGYkYkBmJCBwYXJhbWV0ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBiKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtLmIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCB0aGlzLT5wYXJhbSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgIHByaXZhdGU6CisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGV4dHJlbWUgdmFsdWUgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZSBzYW1lCisgICAgKiAgICAgICAgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OmV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKTsgfQorCisgIC8qKgorICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBleHRyZW1lIHZhbHVlIGRpc3RyaWJ1dGlvbnMgaGF2ZSBkaWZmZXJlbnQKKyAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSAlZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICoKKyAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCAgQSAlZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCSAgICAgICBjb25zdCBzdGQ6OmV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mKTsKKworICAvKioKKyAgICogQGJyaWVmIEV4dHJhY3RzIGEgJWV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAqCisgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIF9feCBBICVleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAqICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICoKKyAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkgICAgICAgc3RkOjpleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+Jik7CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGRpc2NyZXRlIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMKKyAgICoKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50PgorICAgIGNsYXNzIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxfSW50VHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhbiBpbnRlZ3JhbCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9JbnRUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT47CisKKwlwYXJhbV90eXBlKCkKKwk6IF9NX3Byb2IoKSwgX01fY3AoKQorCXsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yIF9fd2JlZ2luLAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yIF9fd2VuZCkKKwkgIDogX01fcHJvYihfX3diZWdpbiwgX193ZW5kKSwgX01fY3AoKQorCSAgeyBfTV9pbml0aWFsaXplKCk7IH0KKworCXBhcmFtX3R5cGUoaW5pdGlhbGl6ZXJfbGlzdDxkb3VibGU+IF9fd2lsKQorCTogX01fcHJvYihfX3dpbC5iZWdpbigpLCBfX3dpbC5lbmQoKSksIF9NX2NwKCkKKwl7IF9NX2luaXRpYWxpemUoKTsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJICBwYXJhbV90eXBlKHNpemVfdCBfX253LCBkb3VibGUgX194bWluLCBkb3VibGUgX194bWF4LAorCQkgICAgIF9GdW5jIF9fZncpOworCisJLy8gU2VlOiBodHRwOi8vY3BwLW5leHQuY29tL2FyY2hpdmUvMjAxMC8xMC9pbXBsaWNpdC1tb3ZlLW11c3QtZ28vCisJcGFyYW1fdHlwZShjb25zdCBwYXJhbV90eXBlJikgPSBkZWZhdWx0OworCXBhcmFtX3R5cGUmIG9wZXJhdG9yPShjb25zdCBwYXJhbV90eXBlJikgPSBkZWZhdWx0OworCisJc3RkOjp2ZWN0b3I8ZG91YmxlPgorCXByb2JhYmlsaXRpZXMoKSBjb25zdAorCXsgcmV0dXJuIF9NX3Byb2IuZW1wdHkoKSA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMSwgMS4wKSA6IF9NX3Byb2I7IH0KKworCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBwYXJhbV90eXBlJiBfX3AxLCBjb25zdCBwYXJhbV90eXBlJiBfX3AyKQorCXsgcmV0dXJuIF9fcDEuX01fcHJvYiA9PSBfX3AyLl9NX3Byb2I7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9wcm9iOworCXN0ZDo6dmVjdG9yPGRvdWJsZT4gX01fY3A7CisgICAgICB9OworCisgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJZGlzY3JldGVfZGlzdHJpYnV0aW9uKF9JbnB1dEl0ZXJhdG9yIF9fd2JlZ2luLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IgX193ZW5kKQorCTogX01fcGFyYW0oX193YmVnaW4sIF9fd2VuZCkKKwl7IH0KKworICAgICAgZGlzY3JldGVfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8ZG91YmxlPiBfX3dsKQorICAgICAgOiBfTV9wYXJhbShfX3dsKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCWRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywgZG91YmxlIF9feG1pbiwgZG91YmxlIF9feG1heCwKKwkJCSAgICAgIF9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX253LCBfX3htaW4sIF9feG1heCwgX19mdykKKwl7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHByb2JhYmlsaXRpZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPgorICAgICAgcHJvYmFiaWxpdGllcygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX3Byb2IuZW1wdHkoKQorCSAgPyBzdGQ6OnZlY3Rvcjxkb3VibGU+KDEsIDEuMCkgOiBfTV9wYXJhbS5fTV9wcm9iOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHBhcmFtX3R5cGUKKyAgICAgIHBhcmFtKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNldHMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqIEBwYXJhbSBfX3BhcmFtIFRoZSBuZXcgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwYXJhbShjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeyBfTV9wYXJhbSA9IF9fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgZ3JlYXRlc3QgbG93ZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiByZXN1bHRfdHlwZSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01fcHJvYi5lbXB0eSgpCisJICA/IHJlc3VsdF90eXBlKDApIDogcmVzdWx0X3R5cGUoX01fcGFyYW0uX01fcHJvYi5zaXplKCkgLSAxKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCB0aGlzLT5wYXJhbSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVkaXNjcmV0ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWRpc2NyZXRlX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6ZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlZGlzY3JldGVfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVkaXNjcmV0ZV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yCisgICAgICAgKiAgICAgICAgICBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisJZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mLAorCQkgICBzdGQ6OmRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBkaXNjcmV0ZSBkaXN0cmlidXRpb25zIGhhdmUgdGhlIHNhbWUKKyAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6OmRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiBfX2QxLnBhcmFtKCkgPT0gX19kMi5wYXJhbSgpOyB9CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgaGF2ZSBkaWZmZXJlbnQKKyAgICAqICAgICAgICBwYXJhbWV0ZXJzLgorICAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6ZGlzY3JldGVfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qKgorICAgKiBAYnJpZWYgQSBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIHBpZWNld2lzZSBjb25zdGFudCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxfUmVhbFR5cGU+Ojp2YWx1ZSwKKwkJICAgICJ0ZW1wbGF0ZSBhcmd1bWVudCBub3QgYSBmbG9hdGluZyBwb2ludCB0eXBlIik7CisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHJhbmdlIG9mIHRoZSBkaXN0cmlidXRpb24uICovCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIC8qKiBQYXJhbWV0ZXIgdHlwZS4gKi8KKyAgICAgIHN0cnVjdCBwYXJhbV90eXBlCisgICAgICB7CisJdHlwZWRlZiBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjsKKworCXBhcmFtX3R5cGUoKQorCTogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpCisJeyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKwkgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3JCIF9fYmZpcnN0LAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSAgICAgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKTsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCSAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19iaSwgX0Z1bmMgX19mdyk7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwkgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIF9SZWFsVHlwZSBfX3htaW4sIF9SZWFsVHlwZSBfX3htYXgsCisJCSAgICAgX0Z1bmMgX19mdyk7CisKKwkvLyBTZWU6IGh0dHA6Ly9jcHAtbmV4dC5jb20vYXJjaGl2ZS8yMDEwLzEwL2ltcGxpY2l0LW1vdmUtbXVzdC1nby8KKwlwYXJhbV90eXBlKGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisJcGFyYW1fdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisKKwlzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisJaW50ZXJ2YWxzKCkgY29uc3QKKwl7CisJICBpZiAoX01faW50LmVtcHR5KCkpCisJICAgIHsKKwkgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9fdG1wKDIpOworCSAgICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICAgIHJldHVybiBfX3RtcDsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01faW50OworCX0KKworCXN0ZDo6dmVjdG9yPGRvdWJsZT4KKwlkZW5zaXRpZXMoKSBjb25zdAorCXsgcmV0dXJuIF9NX2Rlbi5lbXB0eSgpID8gc3RkOjp2ZWN0b3I8ZG91YmxlPigxLCAxLjApIDogX01fZGVuOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiBfX3AxLl9NX2ludCA9PSBfX3AyLl9NX2ludCAmJiBfX3AxLl9NX2RlbiA9PSBfX3AyLl9NX2RlbjsgfQorCisgICAgICBwcml2YXRlOgorCXZvaWQKKwlfTV9pbml0aWFsaXplKCk7CisKKwlzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9NX2ludDsKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX2RlbjsKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX2NwOworICAgICAgfTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3JCLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvclc+CisJcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihfSW5wdXRJdGVyYXRvckIgX19iZmlyc3QsCisJCQkJCV9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCQkJCV9JbnB1dEl0ZXJhdG9yVyBfX3diZWdpbikKKwk6IF9NX3BhcmFtKF9fYmZpcnN0LCBfX2JlbmQsIF9fd2JlZ2luKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwlwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLAorCQkJCQlfRnVuYyBfX2Z3KQorCTogX01fcGFyYW0oX19ibCwgX19mdykKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisJcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywKKwkJCQkJX1JlYWxUeXBlIF9feG1pbiwgX1JlYWxUeXBlIF9feG1heCwKKwkJCQkJX0Z1bmMgX19mdykKKwk6IF9NX3BhcmFtKF9fbncsIF9feG1pbiwgX194bWF4LCBfX2Z3KQorCXsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbihjb25zdCBwYXJhbV90eXBlJiBfX3ApCisgICAgICA6IF9NX3BhcmFtKF9fcCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgYSB2ZWN0b3Igb2YgdGhlIGludGVydmFscy4KKyAgICAgICAqLworICAgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPgorICAgICAgaW50ZXJ2YWxzKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fcGFyYW0uX01faW50LmVtcHR5KCkpCisJICB7CisJICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX190bXAoMik7CisJICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICByZXR1cm4gX190bXA7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIF9NX3BhcmFtLl9NX2ludDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyBhIHZlY3RvciBvZiB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0aWVzLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+CisgICAgICBkZW5zaXRpZXMoKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9kZW4uZW1wdHkoKQorCSAgPyBzdGQ6OnZlY3Rvcjxkb3VibGU+KDEsIDEuMCkgOiBfTV9wYXJhbS5fTV9kZW47CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcGFyYW1fdHlwZQorICAgICAgcGFyYW0oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGFyYW07IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2V0cyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICogQHBhcmFtIF9fcGFyYW0gVGhlIG5ldyBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBhcmFtKGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7IF9NX3BhcmFtID0gX19wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBncmVhdGVzdCBsb3dlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01faW50LmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMCkgOiBfTV9wYXJhbS5fTV9pbnQuZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgbGVhc3QgdXBwZXIgYm91bmQgdmFsdWUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX2ludC5lbXB0eSgpCisJICA/IHJlc3VsdF90eXBlKDEpIDogX01fcGFyYW0uX01faW50LmJhY2soKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2VuZXJhdGluZyBmdW5jdGlvbnMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorCXsgcmV0dXJuIHRoaXMtPm9wZXJhdG9yKCkoX191cm5nLCB0aGlzLT5wYXJhbSgpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJICAgY29uc3QgcGFyYW1fdHlwZSYgX19wKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5zZXJ0cyBhICVwaWVjZXdpc2VfY29uc3Rhbl9kaXN0cmlidXRpb24gcmFuZG9tCisgICAgICAgKiAgICAgICAgbnVtYmVyIGRpc3RyaWJ1dGlvbiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwaWVjZXdpc2VfY29uc3Rhbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBFeHRyYWN0cyBhICVwaWVjZXdpc2VfY29uc3Rhbl9kaXN0cmlidXRpb24gcmFuZG9tCisgICAgICAgKiAgICAgICAgbnVtYmVyIGRpc3RyaWJ1dGlvbiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCBBICVwaWVjZXdpc2VfY29uc3Rhbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yCisgICAgICAgKiAgICAgICAgICBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorCWZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKwlvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiwKKwkJICAgc3RkOjpwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+Jik7CisKKyAgICBwcml2YXRlOgorICAgICAgcGFyYW1fdHlwZSBfTV9wYXJhbTsKKyAgICB9OworCisgIC8qKgorICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBwaWVjZXdpc2UgY29uc3RhbnQgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZQorICAgICogICAgICAgIHNhbWUgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuIF9fZDEucGFyYW0oKSA9PSBfX2QyLnBhcmFtKCk7IH0KKworICAvKioKKyAgICAqIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGllY2V3aXNlIGNvbnN0YW50IGRpc3RyaWJ1dGlvbnMgaGF2ZSAKKyAgICAqICAgICAgICBkaWZmZXJlbnQgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QyKQorICAgIHsgcmV0dXJuICEoX19kMSA9PSBfX2QyKTsgfQorCisKKyAgLyoqCisgICAqIEBicmllZiBBIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIHBpZWNld2lzZSBsaW5lYXIgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcworICAgKgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PF9SZWFsVHlwZT46OnZhbHVlLAorCQkgICAgInRlbXBsYXRlIGFyZ3VtZW50IG5vdCBhIGZsb2F0aW5nIHBvaW50IHR5cGUiKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworICAgICAgLyoqIFBhcmFtZXRlciB0eXBlLiAqLworICAgICAgc3RydWN0IHBhcmFtX3R5cGUKKyAgICAgIHsKKwl0eXBlZGVmIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gZGlzdHJpYnV0aW9uX3R5cGU7CisJZnJpZW5kIGNsYXNzIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT47CisKKwlwYXJhbV90eXBlKCkKKwk6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKSwgX01fbSgpCisJeyB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKwkgIHBhcmFtX3R5cGUoX0lucHV0SXRlcmF0b3JCIF9fYmZpcnN0LAorCQkgICAgIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSAgICAgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKTsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCSAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19ibCwgX0Z1bmMgX19mdyk7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwkgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIF9SZWFsVHlwZSBfX3htaW4sIF9SZWFsVHlwZSBfX3htYXgsCisJCSAgICAgX0Z1bmMgX19mdyk7CisKKwkvLyBTZWU6IGh0dHA6Ly9jcHAtbmV4dC5jb20vYXJjaGl2ZS8yMDEwLzEwL2ltcGxpY2l0LW1vdmUtbXVzdC1nby8KKwlwYXJhbV90eXBlKGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisJcGFyYW1fdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHBhcmFtX3R5cGUmKSA9IGRlZmF1bHQ7CisKKwlzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisJaW50ZXJ2YWxzKCkgY29uc3QKKwl7CisJICBpZiAoX01faW50LmVtcHR5KCkpCisJICAgIHsKKwkgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9fdG1wKDIpOworCSAgICAgIF9fdG1wWzFdID0gX1JlYWxUeXBlKDEpOworCSAgICAgIHJldHVybiBfX3RtcDsKKwkgICAgfQorCSAgZWxzZQorCSAgICByZXR1cm4gX01faW50OworCX0KKworCXN0ZDo6dmVjdG9yPGRvdWJsZT4KKwlkZW5zaXRpZXMoKSBjb25zdAorCXsgcmV0dXJuIF9NX2Rlbi5lbXB0eSgpID8gc3RkOjp2ZWN0b3I8ZG91YmxlPigyLCAxLjApIDogX01fZGVuOyB9CisKKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPT0oY29uc3QgcGFyYW1fdHlwZSYgX19wMSwgY29uc3QgcGFyYW1fdHlwZSYgX19wMikKKwl7IHJldHVybiAoX19wMS5fTV9pbnQgPT0gX19wMi5fTV9pbnQKKwkJICAmJiBfX3AxLl9NX2RlbiA9PSBfX3AyLl9NX2Rlbik7IH0KKworICAgICAgcHJpdmF0ZToKKwl2b2lkCisJX01faW5pdGlhbGl6ZSgpOworCisJc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfTV9pbnQ7CisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9kZW47CisJc3RkOjp2ZWN0b3I8ZG91YmxlPiBfTV9jcDsKKwlzdGQ6OnZlY3Rvcjxkb3VibGU+IF9NX207CisgICAgICB9OworCisgICAgICBleHBsaWNpdAorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oKQorICAgICAgOiBfTV9wYXJhbSgpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3JCLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvclc+CisJcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24oX0lucHV0SXRlcmF0b3JCIF9fYmZpcnN0LAorCQkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCQkJICAgICAgX0lucHV0SXRlcmF0b3JXIF9fd2JlZ2luKQorCTogX01fcGFyYW0oX19iZmlyc3QsIF9fYmVuZCwgX193YmVnaW4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorCXBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLAorCQkJCSAgICAgIF9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX2JsLCBfX2Z3KQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKwlwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbihzaXplX3QgX19udywKKwkJCQkgICAgICBfUmVhbFR5cGUgX194bWluLCBfUmVhbFR5cGUgX194bWF4LAorCQkJCSAgICAgIF9GdW5jIF9fZncpCisJOiBfTV9wYXJhbShfX253LCBfX3htaW4sIF9feG1heCwgX19mdykKKwl7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uKGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIDogX01fcGFyYW0oX19wKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogUmVzZXRzIHRoZSBkaXN0cmlidXRpb24gc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gdGhlIGludGVydmFscyBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+CisgICAgICBpbnRlcnZhbHMoKSBjb25zdAorICAgICAgeworCWlmIChfTV9wYXJhbS5fTV9pbnQuZW1wdHkoKSkKKwkgIHsKKwkgICAgc3RkOjp2ZWN0b3I8X1JlYWxUeXBlPiBfX3RtcCgyKTsKKwkgICAgX190bXBbMV0gPSBfUmVhbFR5cGUoMSk7CisJICAgIHJldHVybiBfX3RtcDsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gX01fcGFyYW0uX01faW50OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIHByb2JhYmlsaXR5IGRlbnNpdGllcyBvZiB0aGUKKyAgICAgICAqICAgICAgICBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4KKyAgICAgIGRlbnNpdGllcygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX3BhcmFtLl9NX2Rlbi5lbXB0eSgpCisJICA/IHN0ZDo6dmVjdG9yPGRvdWJsZT4oMiwgMS4wKSA6IF9NX3BhcmFtLl9NX2RlbjsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgcGFyYW1ldGVyIHNldCBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBwYXJhbV90eXBlCisgICAgICBwYXJhbSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wYXJhbTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZXRzIHRoZSBwYXJhbWV0ZXIgc2V0IG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19wYXJhbSBUaGUgbmV3IHBhcmFtZXRlciBzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcGFyYW0oY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsgX01fcGFyYW0gPSBfX3BhcmFtOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFJldHVybnMgdGhlIGdyZWF0ZXN0IGxvd2VyIGJvdW5kIHZhbHVlIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9wYXJhbS5fTV9pbnQuZW1wdHkoKQorCSAgPyByZXN1bHRfdHlwZSgwKSA6IF9NX3BhcmFtLl9NX2ludC5mcm9udCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXR1cm5zIHRoZSBsZWFzdCB1cHBlciBib3VuZCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fcGFyYW0uX01faW50LmVtcHR5KCkKKwkgID8gcmVzdWx0X3R5cGUoMSkgOiBfTV9wYXJhbS5fTV9pbnQuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZW5lcmF0aW5nIGZ1bmN0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisJeyByZXR1cm4gdGhpcy0+b3BlcmF0b3IoKShfX3VybmcsIHRoaXMtPnBhcmFtKCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgICBjb25zdCBwYXJhbV90eXBlJiBfX3ApOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbnNlcnRzIGEgJXBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogICAgICAgICAgYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRXh0cmFjdHMgYSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgIGRpc3RyaWJ1dGlvbiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvcgorICAgICAgICogICAgICAgICAgc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKwlmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisJb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYsCisJCSAgIHN0ZDo6cGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mKTsKKworICAgIHByaXZhdGU6CisgICAgICBwYXJhbV90eXBlIF9NX3BhcmFtOworICAgIH07CisKKyAgLyoqCisgICAgKiBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdHdvIHBpZWNld2lzZSBsaW5lYXIgZGlzdHJpYnV0aW9ucyBoYXZlIHRoZQorICAgICogICAgICAgIHNhbWUgcGFyYW1ldGVycy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjpwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX2QxLAorCSAgICAgICBjb25zdCBzdGQ6OnBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeyByZXR1cm4gX19kMS5wYXJhbSgpID09IF9fZDIucGFyYW0oKTsgfQorCisgIC8qKgorICAgICogQGJyaWVmIFJldHVybiB0cnVlIGlmIHR3byBwaWVjZXdpc2UgbGluZWFyIGRpc3RyaWJ1dGlvbnMgaGF2ZQorICAgICogICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGQ6OnBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDEsCisJICAgICAgIGNvbnN0IHN0ZDo6cGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMikKKyAgICB7IHJldHVybiAhKF9fZDEgPT0gX19kMik7IH0KKworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV9kaXN0cmlidXRpb25zX3BvaXNzb24KKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb21fZGlzdHJpYnV0aW9ucworCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCByYW5kb21fdXRpbGl0aWVzIFJhbmRvbSBOdW1iZXIgVXRpbGl0aWVzCisgICAqIEBpbmdyb3VwIHJhbmRvbQorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIFRoZSBzZWVkX3NlcSBjbGFzcyBnZW5lcmF0ZXMgc2VxdWVuY2VzIG9mIHNlZWRzIGZvciByYW5kb20KKyAgICogICAgICAgIG51bWJlciBnZW5lcmF0b3JzLgorICAgKi8KKyAgY2xhc3Mgc2VlZF9zZXEKKyAgeworCisgIHB1YmxpYzoKKyAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHNlZWQgdmFsZXMuICovCisgICAgdHlwZWRlZiB1aW50X2xlYXN0MzJfdCByZXN1bHRfdHlwZTsKKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICAgIHNlZWRfc2VxKCkKKyAgICA6IF9NX3YoKQorICAgIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgICBzZWVkX3NlcShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0ludFR5cGU+IGlsKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgc2VlZF9zZXEoX0lucHV0SXRlcmF0b3IgX19iZWdpbiwgX0lucHV0SXRlcmF0b3IgX19lbmQpOworCisgICAgLy8gZ2VuZXJhdGluZyBmdW5jdGlvbnMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBnZW5lcmF0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19iZWdpbiwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZW5kKTsKKworICAgIC8vIHByb3BlcnR5IGZ1bmN0aW9ucworICAgIHNpemVfdCBzaXplKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV92LnNpemUoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgT3V0cHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBwYXJhbShPdXRwdXRJdGVyYXRvciBfX2Rlc3QpIGNvbnN0CisgICAgICB7IHN0ZDo6Y29weShfTV92LmJlZ2luKCksIF9NX3YuZW5kKCksIF9fZGVzdCk7IH0KKworICBwcml2YXRlOgorICAgIC8vLworICAgIHN0ZDo6dmVjdG9yPHJlc3VsdF90eXBlPiBfTV92OworICB9OworCisgIC8qIEB9ICovIC8vIGdyb3VwIHJhbmRvbV91dGlsaXRpZXMKKworICAvKiBAfSAqLyAvLyBncm91cCByYW5kb20KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmFuZG9tLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yYW5kb20udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjZhZjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmFuZG9tLnRjYwpAQCAtMCwwICsxLDI4MzAgQEAKKy8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9yYW5kb20udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmFuZG9tfQorICovCisKKyNpZm5kZWYgX1JBTkRPTV9UQ0MKKyNkZWZpbmUgX1JBTkRPTV9UQ0MgMQorCisjaW5jbHVkZSA8bnVtZXJpYz4gLy8gc3RkOjphY2N1bXVsYXRlIGFuZCBzdGQ6OnBhcnRpYWxfc3VtCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICAvKgorICAgKiAoRnVydGhlcikgaW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgICovCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvLyBHZW5lcmFsIGNhc2UgZm9yIHggPSAoYXggKyBjKSBtb2QgbSAtLSB1c2UgU2NocmFnZSdzIGFsZ29yaXRobSB0bworICAgIC8vIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cuCisgICAgLy8KKyAgICAvLyBCZWNhdXNlIGEgYW5kIGMgYXJlIGNvbXBpbGUtdGltZSBpbnRlZ3JhbCBjb25zdGFudHMgdGhlIGNvbXBpbGVyCisgICAgLy8ga2luZGx5IGVsaWRlcyBhbnkgdW5yZWFjaGFibGUgcGF0aHMuCisgICAgLy8KKyAgICAvLyBQcmVjb25kaXRpb25zOiAgYSA+IDAsIG0gPiAwLgorICAgIC8vCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19tLCBfVHAgX19hLCBfVHAgX19jLCBib29sPgorICAgICAgc3RydWN0IF9Nb2QKKyAgICAgIHsKKwlzdGF0aWMgX1RwCisJX19jYWxjKF9UcCBfX3gpCisJeworCSAgaWYgKF9fYSA9PSAxKQorCSAgICBfX3ggJT0gX19tOworCSAgZWxzZQorCSAgICB7CisJICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX3EgPSBfX20gLyBfX2E7CisJICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX3IgPSBfX20gJSBfX2E7CisKKwkgICAgICBfVHAgX190MSA9IF9fYSAqIChfX3ggJSBfX3EpOworCSAgICAgIF9UcCBfX3QyID0gX19yICogKF9feCAvIF9fcSk7CisJICAgICAgaWYgKF9fdDEgPj0gX190MikKKwkJX194ID0gX190MSAtIF9fdDI7CisJICAgICAgZWxzZQorCQlfX3ggPSBfX20gLSBfX3QyICsgX190MTsKKwkgICAgfQorCisJICBpZiAoX19jICE9IDApCisJICAgIHsKKwkgICAgICBjb25zdCBfVHAgX19kID0gX19tIC0gX194OworCSAgICAgIGlmIChfX2QgPiBfX2MpCisJCV9feCArPSBfX2M7CisJICAgICAgZWxzZQorCQlfX3ggPSBfX2MgLSBfX2Q7CisJICAgIH0KKwkgIHJldHVybiBfX3g7CisJfQorICAgICAgfTsKKworICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgbSA9PSAwIC0tIHVzZSB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGFzIG1vZHVsbworICAgIC8vIG9wZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fbSwgX1RwIF9fYSwgX1RwIF9fYz4KKyAgICAgIHN0cnVjdCBfTW9kPF9UcCwgX19tLCBfX2EsIF9fYywgdHJ1ZT4KKyAgICAgIHsKKwlzdGF0aWMgX1RwCisJX19jYWxjKF9UcCBfX3gpCisJeyByZXR1cm4gX19hICogX194ICsgX19jOyB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICAgIF9PdXRwdXRJdGVyYXRvcgorICAgICAgX190cmFuc2Zvcm0oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1VuYXJ5T3BlcmF0aW9uIF9fdW5hcnlfb3ApCisgICAgICB7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJICAqX19yZXN1bHQgPSBfX3VuYXJ5X29wKCpfX2ZpcnN0KTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjptdWx0aXBsaWVyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6aW5jcmVtZW50OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6bW9kdWx1czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OmRlZmF1bHRfc2VlZDsKKworICAvKioKKyAgICogU2VlZHMgdGhlIExDUiB3aXRoIGludGVncmFsIHZhbHVlIEBwIF9fcywgYWRqdXN0ZWQgc28gdGhhdCB0aGUKKyAgICogcmluZyBpZGVudGl0eSBpcyBuZXZlciBhIG1lbWJlciBvZiB0aGUgY29udmVyZ2VuY2Ugc2V0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIHZvaWQKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjoKKyAgICBzZWVkKHJlc3VsdF90eXBlIF9fcykKKyAgICB7CisgICAgICBpZiAoKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fbT4oX19jKSA9PSAwKQorCSAgJiYgKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIF9fbT4oX19zKSA9PSAwKSkKKwlfTV94ID0gMTsKKyAgICAgIGVsc2UKKwlfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19tPihfX3MpOworICAgIH0KKworICAvKioKKyAgICogU2VlZHMgdGhlIExDUiBlbmdpbmUgd2l0aCBhIHZhbHVlIGdlbmVyYXRlZCBieSBAcCBfX3EuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NzZXE+CisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NsYXNzPF9Tc2VxPjo6dmFsdWU+Ojp0eXBlCisgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZTxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjoKKyAgICAgIHNlZWQoX1NzZXEmIF9fcSkKKyAgICAgIHsKKwljb25zdCBfVUludFR5cGUgX19rMCA9IF9fbSA9PSAwID8gc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjpkaWdpdHMKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RkOjpfX2xnKF9fbSk7CisJY29uc3QgX1VJbnRUeXBlIF9fayA9IChfX2swICsgMzEpIC8gMzI7CisJdWludF9sZWFzdDMyX3QgX19hcnJbX19rICsgM107CisJX19xLmdlbmVyYXRlKF9fYXJyICsgMCwgX19hcnIgKyBfX2sgKyAzKTsKKwlfVUludFR5cGUgX19mYWN0b3IgPSAxdTsKKwlfVUludFR5cGUgX19zdW0gPSAwdTsKKwlmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX2s7ICsrX19qKQorCSAgeworCSAgICBfX3N1bSArPSBfX2FycltfX2ogKyAzXSAqIF9fZmFjdG9yOworCSAgICBfX2ZhY3RvciAqPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgMzI+OjpfX3ZhbHVlOworCSAgfQorCXNlZWQoX19zdW0pOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmU8X1VJbnRUeXBlLAorCQkJCQkJX19hLCBfX2MsIF9fbT4mIF9fbGNyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworCisgICAgICBfX29zIDw8IF9fbGNyLl9NX3g7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20sCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4mIF9fbGNyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjKTsKKworICAgICAgX19pcyA+PiBfX2xjci5fTV94OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp3b3JkX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpzdGF0ZV9zaXplOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6c2hpZnRfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46Om1hc2tfYml0czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46Onhvcl9tYXNrOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX3U7CisgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19zOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX2I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+Ojp0ZW1wZXJpbmdfdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsCisJICAgc2l6ZV90IF9fdywgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICBjb25zdGV4cHIgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj46OnRlbXBlcmluZ19jOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6dGVtcGVyaW5nX2w7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLAorCSAgIHNpemVfdCBfX3csIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2Y+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbl9tdWx0aXBsaWVyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIGNvbnN0ZXhwciBfVUludFR5cGUKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6ZGVmYXVsdF9zZWVkOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIHZvaWQKKyAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fZCwKKwkJCSAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6CisgICAgc2VlZChyZXN1bHRfdHlwZSBfX3NkKQorICAgIHsKKyAgICAgIF9NX3hbMF0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLAorCV9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX3NkKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgc3RhdGVfc2l6ZTsgKytfX2kpCisJeworCSAgX1VJbnRUeXBlIF9feCA9IF9NX3hbX19pIC0gMV07CisJICBfX3ggXj0gX194ID4+IChfX3cgLSAyKTsKKwkgIF9feCAqPSBfX2Y7CisJICBfX3ggKz0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19uPihfX2kpOworCSAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwKKwkgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9feCk7CisJfQorICAgICAgX01fcCA9IHN0YXRlX3NpemU7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwKKwkgICBzaXplX3QgX193LCBzaXplX3QgX19uLCBzaXplX3QgX19tLCBzaXplX3QgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIHNpemVfdCBfX3UsIF9VSW50VHlwZSBfX2QsIHNpemVfdCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgc2l6ZV90IF9fdCwgX1VJbnRUeXBlIF9fYywgc2l6ZV90IF9fbCwKKwkgICBfVUludFR5cGUgX19mPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Tc2VxPgorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jbGFzczxfU3NlcT46OnZhbHVlPjo6dHlwZQorICAgICAgbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX2QsCisJCQkgICAgICBfX3MsIF9fYiwgX190LCBfX2MsIF9fbCwgX19mPjo6CisgICAgICBzZWVkKF9Tc2VxJiBfX3EpCisgICAgICB7CisJY29uc3QgX1VJbnRUeXBlIF9fdXBwZXJfbWFzayA9ICh+X1VJbnRUeXBlKCkpIDw8IF9fcjsKKwljb25zdCBzaXplX3QgX19rID0gKF9fdyArIDMxKSAvIDMyOworCXVpbnRfbGVhc3QzMl90IF9fYXJyW19fbiAqIF9fa107CisJX19xLmdlbmVyYXRlKF9fYXJyICsgMCwgX19hcnIgKyBfX24gKiBfX2spOworCisJYm9vbCBfX3plcm8gPSB0cnVlOworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IHN0YXRlX3NpemU7ICsrX19pKQorCSAgeworCSAgICBfVUludFR5cGUgX19mYWN0b3IgPSAxdTsKKwkgICAgX1VJbnRUeXBlIF9fc3VtID0gMHU7CisJICAgIGZvciAoc2l6ZV90IF9faiA9IDA7IF9faiA8IF9fazsgKytfX2opCisJICAgICAgeworCQlfX3N1bSArPSBfX2FycltfX2sgKiBfX2kgKyBfX2pdICogX19mYWN0b3I7CisJCV9fZmFjdG9yICo9IF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCAzMj46Ol9fdmFsdWU7CisJICAgICAgfQorCSAgICBfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLAorCSAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX3N1bSk7CisKKwkgICAgaWYgKF9femVybykKKwkgICAgICB7CisJCWlmIChfX2kgPT0gMCkKKwkJICB7CisJCSAgICBpZiAoKF9NX3hbMF0gJiBfX3VwcGVyX21hc2spICE9IDB1KQorCQkgICAgICBfX3plcm8gPSBmYWxzZTsKKwkJICB9CisJCWVsc2UgaWYgKF9NX3hbX19pXSAhPSAwdSkKKwkJICBfX3plcm8gPSBmYWxzZTsKKwkgICAgICB9CisJICB9CisgICAgICAgIGlmIChfX3plcm8pCisgICAgICAgICAgX01feFswXSA9IF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3cgLSAxPjo6X192YWx1ZTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csCisJICAgc2l6ZV90IF9fbiwgc2l6ZV90IF9fbSwgc2l6ZV90IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBzaXplX3QgX191LCBfVUludFR5cGUgX19kLCBzaXplX3QgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIHNpemVfdCBfX3QsIF9VSW50VHlwZSBfX2MsIHNpemVfdCBfX2wsCisJICAgX1VJbnRUeXBlIF9fZj4KKyAgICB0eXBlbmFtZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjpyZXN1bHRfdHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXJfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19kLAorCQkJICAgIF9fcywgX19iLCBfX3QsIF9fYywgX19sLCBfX2Y+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICAvLyBSZWxvYWQgdGhlIHZlY3RvciAtIGNvc3QgaXMgTyhuKSBhbW9ydGl6ZWQgb3ZlciBuIGNhbGxzLgorICAgICAgaWYgKF9NX3AgPj0gc3RhdGVfc2l6ZSkKKwl7CisJICBjb25zdCBfVUludFR5cGUgX191cHBlcl9tYXNrID0gKH5fVUludFR5cGUoKSkgPDwgX19yOworCSAgY29uc3QgX1VJbnRUeXBlIF9fbG93ZXJfbWFzayA9IH5fX3VwcGVyX21hc2s7CisKKwkgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IChfX24gLSBfX20pOyArK19faykKKwkgICAgeworCSAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgICAgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICAgICAgX01feFtfX2tdID0gKF9NX3hbX19rICsgX19tXSBeIChfX3kgPj4gMSkKKwkJCSAgIF4gKChfX3kgJiAweDAxKSA/IF9fYSA6IDApKTsKKwkgICAgfQorCisJICBmb3IgKHNpemVfdCBfX2sgPSAoX19uIC0gX19tKTsgX19rIDwgKF9fbiAtIDEpOyArK19faykKKwkgICAgeworCSAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgICAgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICAgICAgX01feFtfX2tdID0gKF9NX3hbX19rICsgKF9fbSAtIF9fbildIF4gKF9feSA+PiAxKQorCQkJICAgXiAoKF9feSAmIDB4MDEpID8gX19hIDogMCkpOworCSAgICB9CisKKwkgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19uIC0gMV0gJiBfX3VwcGVyX21hc2spCisJCQkgICB8IChfTV94WzBdICYgX19sb3dlcl9tYXNrKSk7CisJICBfTV94W19fbiAtIDFdID0gKF9NX3hbX19tIC0gMV0gXiAoX195ID4+IDEpCisJCQkgICBeICgoX195ICYgMHgwMSkgPyBfX2EgOiAwKSk7CisJICBfTV9wID0gMDsKKwl9CisKKyAgICAgIC8vIENhbGN1bGF0ZSBvKHgoaSkpLgorICAgICAgcmVzdWx0X3R5cGUgX196ID0gX01feFtfTV9wKytdOworICAgICAgX196IF49IChfX3ogPj4gX191KSAmIF9fZDsKKyAgICAgIF9feiBePSAoX196IDw8IF9fcykgJiBfX2I7CisgICAgICBfX3ogXj0gKF9feiA8PCBfX3QpICYgX19jOworICAgICAgX196IF49IChfX3ogPj4gX19sKTsKKworICAgICAgcmV0dXJuIF9fejsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2YsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uIC0gMTsgKytfX2kpCisJX19vcyA8PCBfX3guX01feFtfX2ldIDw8IF9fc3BhY2U7CisgICAgICBfX29zIDw8IF9feC5fTV94W19fbiAtIDFdOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LAorCSAgIHNpemVfdCBfX24sIHNpemVfdCBfX20sIHNpemVfdCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgc2l6ZV90IF9fdSwgX1VJbnRUeXBlIF9fZCwgc2l6ZV90IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBzaXplX3QgX190LCBfVUludFR5cGUgX19jLCBzaXplX3QgX19sLAorCSAgIF9VSW50VHlwZSBfX2YsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fZCwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2wsIF9fZj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJX19pcyA+PiBfX3guX01feFtfX2ldOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+Ojp3b3JkX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+OjpzaG9ydF9sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsIF9fdywgX19zLCBfX3I+Ojpsb25nX2xhZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgY29uc3RleHByIF9VSW50VHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OmRlZmF1bHRfc2VlZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgdm9pZAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIHNlZWQocmVzdWx0X3R5cGUgX192YWx1ZSkKKyAgICB7CisgICAgICBzdGQ6OmxpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lPHJlc3VsdF90eXBlLCA0MDAxNHUsIDB1LCAyMTQ3NDgzNTYzdT4KKwlfX2xjZyhfX3ZhbHVlID09IDB1ID8gZGVmYXVsdF9zZWVkIDogX192YWx1ZSk7CisKKyAgICAgIGNvbnN0IHNpemVfdCBfX24gPSAoX193ICsgMzEpIC8gMzI7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IGxvbmdfbGFnOyArK19faSkKKwl7CisJICBfVUludFR5cGUgX19zdW0gPSAwdTsKKwkgIF9VSW50VHlwZSBfX2ZhY3RvciA9IDF1OworCSAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwkgICAgeworCSAgICAgIF9fc3VtICs9IF9fZGV0YWlsOjpfX21vZDx1aW50X2xlYXN0MzJfdCwKKwkJICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8dWludF9sZWFzdDMyX3QsIDMyPjo6X192YWx1ZT4KKwkJCSAoX19sY2coKSkgKiBfX2ZhY3RvcjsKKwkgICAgICBfX2ZhY3RvciAqPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgMzI+OjpfX3ZhbHVlOworCSAgICB9CisJICBfTV94W19faV0gPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLAorCSAgICBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX19zdW0pOworCX0KKyAgICAgIF9NX2NhcnJ5ID0gKF9NX3hbbG9uZ19sYWcgLSAxXSA9PSAwKSA/IDEgOiAwOworICAgICAgX01fcCA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgc2l6ZV90IF9fdywgc2l6ZV90IF9fcywgc2l6ZV90IF9fcj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3NlcT4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY2xhc3M8X1NzZXE+Ojp2YWx1ZT46OnR5cGUKKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgICAgc2VlZChfU3NlcSYgX19xKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2sgPSAoX193ICsgMzEpIC8gMzI7CisJdWludF9sZWFzdDMyX3QgX19hcnJbX19yICogX19rXTsKKwlfX3EuZ2VuZXJhdGUoX19hcnIgKyAwLCBfX2FyciArIF9fciAqIF9fayk7CisKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJICB7CisJICAgIF9VSW50VHlwZSBfX3N1bSA9IDB1OworCSAgICBfVUludFR5cGUgX19mYWN0b3IgPSAxdTsKKwkgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19rOyArK19faikKKwkgICAgICB7CisJCV9fc3VtICs9IF9fYXJyW19fayAqIF9faSArIF9fal0gKiBfX2ZhY3RvcjsKKwkJX19mYWN0b3IgKj0gX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIDMyPjo6X192YWx1ZTsKKwkgICAgICB9CisJICAgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsCisJICAgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fc3VtKTsKKwkgIH0KKwlfTV9jYXJyeSA9IChfTV94W2xvbmdfbGFnIC0gMV0gPT0gMCkgPyAxIDogMDsKKwlfTV9wID0gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3I+CisgICAgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmU8X1VJbnRUeXBlLCBfX3csIF9fcywgX19yPjo6CisJICAgICByZXN1bHRfdHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIC8vIERlcml2ZSBzaG9ydCBsYWcgaW5kZXggZnJvbSBjdXJyZW50IGluZGV4LgorICAgICAgbG9uZyBfX3BzID0gX01fcCAtIHNob3J0X2xhZzsKKyAgICAgIGlmIChfX3BzIDwgMCkKKwlfX3BzICs9IGxvbmdfbGFnOworCisgICAgICAvLyBDYWxjdWxhdGUgbmV3IHgoaSkgd2l0aG91dCBvdmVyZmxvdyBvciBkaXZpc2lvbi4KKyAgICAgIC8vIE5COiBUaGFua3MgdG8gdGhlIHJlcXVpcmVtZW50cyBmb3IgX1VJbnRUeXBlLCBfTV94W19NX3BdICsgX01fY2FycnkKKyAgICAgIC8vIGNhbm5vdCBvdmVyZmxvdy4KKyAgICAgIF9VSW50VHlwZSBfX3hpOworICAgICAgaWYgKF9NX3hbX19wc10gPj0gX01feFtfTV9wXSArIF9NX2NhcnJ5KQorCXsKKwkgIF9feGkgPSBfTV94W19fcHNdIC0gX01feFtfTV9wXSAtIF9NX2NhcnJ5OworCSAgX01fY2FycnkgPSAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX3hpID0gKF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlCisJCSAgLSBfTV94W19NX3BdIC0gX01fY2FycnkgKyBfTV94W19fcHNdKTsKKwkgIF9NX2NhcnJ5ID0gMTsKKwl9CisgICAgICBfTV94W19NX3BdID0gX194aTsKKworICAgICAgLy8gQWRqdXN0IGN1cnJlbnQgaW5kZXggdG8gbG9vcCBhcm91bmQgaW4gcmluZyBidWZmZXIuCisgICAgICBpZiAoKytfTV9wID49IGxvbmdfbGFnKQorCV9NX3AgPSAwOworCisgICAgICByZXR1cm4gX194aTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBzaXplX3QgX193LCBzaXplX3QgX19zLCBzaXplX3QgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZTxfVUludFR5cGUsCisJCQkJCQlfX3csIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCV9fb3MgPDwgX194Ll9NX3hbX19pXSA8PCBfX3NwYWNlOworICAgICAgX19vcyA8PCBfX3guX01fY2Fycnk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVUludFR5cGUsIHNpemVfdCBfX3csIHNpemVfdCBfX3MsIHNpemVfdCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfZW5naW5lPF9VSW50VHlwZSwgX193LCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisJX19pcyA+PiBfX3guX01feFtfX2ldOworICAgICAgX19pcyA+PiBfX3guX01fY2Fycnk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19wLCBzaXplX3QgX19yPgorICAgIGNvbnN0ZXhwciBzaXplX3QKKyAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsIF9fcj46OmJsb2NrX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9fcCwgc2l6ZV90IF9fcj4KKyAgICBjb25zdGV4cHIgc2l6ZV90CisgICAgZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwgX19wLCBfX3I+Ojp1c2VkX2Jsb2NrOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3I+CisgICAgdHlwZW5hbWUgZGlzY2FyZF9ibG9ja19lbmdpbmU8X1JhbmRvbU51bWJlckVuZ2luZSwKKwkJCSAgIF9fcCwgX19yPjo6cmVzdWx0X3R5cGUKKyAgICBkaXNjYXJkX2Jsb2NrX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3AsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIGlmIChfTV9uID49IHVzZWRfYmxvY2spCisJeworCSAgX01fYi5kaXNjYXJkKGJsb2NrX3NpemUgLSBfTV9uKTsKKwkgIF9NX24gPSAwOworCX0KKyAgICAgICsrX01fbjsKKyAgICAgIHJldHVybiBfTV9iKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsCisJICAgICAgIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBfX29zIDw8IF9feC5iYXNlKCkgPDwgX19zcGFjZSA8PCBfX3guX01fbjsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3AsIHNpemVfdCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGRpc2NhcmRfYmxvY2tfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fYiA+PiBfX3guX01fbjsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX3csIHR5cGVuYW1lIF9VSW50VHlwZT4KKyAgICB0eXBlbmFtZSBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3csIF9VSW50VHlwZT46OgorICAgICAgcmVzdWx0X3R5cGUKKyAgICBpbmRlcGVuZGVudF9iaXRzX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX3csIF9VSW50VHlwZT46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIGNvbnN0IGxvbmcgZG91YmxlIF9fciA9IHN0YXRpY19jYXN0PGxvbmcgZG91YmxlPihfTV9iLm1heCgpKQorCQkJICAgIC0gc3RhdGljX2Nhc3Q8bG9uZyBkb3VibGU+KF9NX2IubWluKCkpICsgMS4wTDsKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbSA9IHN0ZDo6bG9nKF9fcikgLyBzdGQ6OmxvZygyLjBMKTsKKyAgICAgIHJlc3VsdF90eXBlIF9fbiwgX19uMCwgX195MCwgX195MSwgX19zMCwgX19zMTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IDI7ICsrX19pKQorCXsKKwkgIF9fbiA9IChfX3cgKyBfX20gLSAxKSAvIF9fbSArIF9faTsKKwkgIF9fbjAgPSBfX24gLSBfX3cgJSBfX247CisJICBjb25zdCByZXN1bHRfdHlwZSBfX3cwID0gX193IC8gX19uOworCSAgY29uc3QgcmVzdWx0X3R5cGUgX193MSA9IF9fdzAgKyAxOworCSAgX19zMCA9IHJlc3VsdF90eXBlKDEpIDw8IF9fdzA7CisJICBfX3MxID0gcmVzdWx0X3R5cGUoMSkgPDwgX193MTsKKwkgIF9feTAgPSBfX3MwICogKF9fciAvIF9fczApOworCSAgX195MSA9IF9fczEgKiAoX19yIC8gX19zMSk7CisJICBpZiAoX19yIC0gX195MCA8PSBfX3kwIC8gX19uKQorCSAgICBicmVhazsKKwl9CisKKyAgICAgIHJlc3VsdF90eXBlIF9fc3VtID0gMDsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjA7ICsrX19rKQorCXsKKwkgIHJlc3VsdF90eXBlIF9fdTsKKwkgIGRvCisJICAgIF9fdSA9IF9NX2IoKSAtIF9NX2IubWluKCk7CisJICB3aGlsZSAoX191ID49IF9feTApOworCSAgX19zdW0gPSBfX3MwICogX19zdW0gKyBfX3UgJSBfX3MwOworCX0KKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IF9fbjA7IF9fayA8IF9fbjsgKytfX2spCisJeworCSAgcmVzdWx0X3R5cGUgX191OworCSAgZG8KKwkgICAgX191ID0gX01fYigpIC0gX01fYi5taW4oKTsKKwkgIHdoaWxlIChfX3UgPj0gX195MSk7CisJICBfX3N1bSA9IF9fczEgKiBfX3N1bSArIF9fdSAlIF9fczE7CisJfQorICAgICAgcmV0dXJuIF9fc3VtOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21OdW1iZXJFbmdpbmUsIHNpemVfdCBfX2s+CisgICAgY29uc3RleHByIHNpemVfdAorICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz46OnRhYmxlX3NpemU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbU51bWJlckVuZ2luZSwgc2l6ZV90IF9faz4KKyAgICB0eXBlbmFtZSBzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX2s+OjpyZXN1bHRfdHlwZQorICAgIHNodWZmbGVfb3JkZXJfZW5naW5lPF9SYW5kb21OdW1iZXJFbmdpbmUsIF9faz46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIHNpemVfdCBfX2ogPSBfX2sgKiAoKF9NX3kgLSBfTV9iLm1pbigpKQorCQkJICAvIChfTV9iLm1heCgpIC0gX01fYi5taW4oKSArIDEuMEwpKTsKKyAgICAgIF9NX3kgPSBfTV92W19fal07CisgICAgICBfTV92W19fal0gPSBfTV9iKCk7CisKKyAgICAgIHJldHVybiBfTV95OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX2s+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIF9fb3MgPDwgX194LmJhc2UoKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fazsgKytfX2kpCisJX19vcyA8PCBfX3NwYWNlIDw8IF9feC5fTV92W19faV07CisgICAgICBfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3k7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tTnVtYmVyRW5naW5lLCBzaXplX3QgX19rLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzaHVmZmxlX29yZGVyX2VuZ2luZTxfUmFuZG9tTnVtYmVyRW5naW5lLCBfX2s+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV9iOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19rOyArK19faSkKKwlfX2lzID4+IF9feC5fTV92W19faV07CisgICAgICBfX2lzID4+IF9feC5fTV95OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPHR5cGVuYW1lCisJICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGU+Ojp0eXBlIF9fdXJuZ3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8cmVzdWx0X3R5cGU+Ojp0eXBlIF9fdXR5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPChzaXplb2YoX191cm5ndHlwZSkKKwkJCQkJICAgPiBzaXplb2YoX191dHlwZSkpLAorCSAgX191cm5ndHlwZSwgX191dHlwZT46OnR5cGUgX191Y3R5cGU7CisKKwljb25zdCBfX3VjdHlwZSBfX3VybmdtaW4gPSBfX3VybmcubWluKCk7CisJY29uc3QgX191Y3R5cGUgX191cm5nbWF4ID0gX191cm5nLm1heCgpOworCWNvbnN0IF9fdWN0eXBlIF9fdXJuZ3JhbmdlID0gX191cm5nbWF4IC0gX191cm5nbWluOworCWNvbnN0IF9fdWN0eXBlIF9fdXJhbmdlCisJICA9IF9fdWN0eXBlKF9fcGFyYW0uYigpKSAtIF9fdWN0eXBlKF9fcGFyYW0uYSgpKTsKKworCV9fdWN0eXBlIF9fcmV0OworCisJaWYgKF9fdXJuZ3JhbmdlID4gX191cmFuZ2UpCisJICB7CisJICAgIC8vIGRvd25zY2FsaW5nCisJICAgIGNvbnN0IF9fdWN0eXBlIF9fdWVyYW5nZSA9IF9fdXJhbmdlICsgMTsgLy8gX191cmFuZ2UgY2FuIGJlIHplcm8KKwkgICAgY29uc3QgX191Y3R5cGUgX19zY2FsaW5nID0gX191cm5ncmFuZ2UgLyBfX3VlcmFuZ2U7CisJICAgIGNvbnN0IF9fdWN0eXBlIF9fcGFzdCA9IF9fdWVyYW5nZSAqIF9fc2NhbGluZzsKKwkgICAgZG8KKwkgICAgICBfX3JldCA9IF9fdWN0eXBlKF9fdXJuZygpKSAtIF9fdXJuZ21pbjsKKwkgICAgd2hpbGUgKF9fcmV0ID49IF9fcGFzdCk7CisJICAgIF9fcmV0IC89IF9fc2NhbGluZzsKKwkgIH0KKwllbHNlIGlmIChfX3VybmdyYW5nZSA8IF9fdXJhbmdlKQorCSAgeworCSAgICAvLyB1cHNjYWxpbmcKKwkgICAgLyoKKwkgICAgICBOb3RlIHRoYXQgZXZlcnkgdmFsdWUgaW4gWzAsIHVyYW5nZV0KKwkgICAgICBjYW4gYmUgd3JpdHRlbiB1bmlxdWVseSBhcworCisJICAgICAgKHVybmdyYW5nZSArIDEpICogaGlnaCArIGxvdworCisJICAgICAgd2hlcmUKKworCSAgICAgIGhpZ2ggaW4gWzAsIHVyYW5nZSAvICh1cm5ncmFuZ2UgKyAxKV0KKworCSAgICAgIGFuZAorCQorCSAgICAgIGxvdyBpbiBbMCwgdXJuZ3JhbmdlXS4KKwkgICAgKi8KKwkgICAgX191Y3R5cGUgX190bXA7IC8vIHdyYXBhcm91bmQgY29udHJvbAorCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgX191Y3R5cGUgX191ZXJuZ3JhbmdlID0gX191cm5ncmFuZ2UgKyAxOworCQlfX3RtcCA9IChfX3Vlcm5ncmFuZ2UgKiBvcGVyYXRvcigpCisJCQkgKF9fdXJuZywgcGFyYW1fdHlwZSgwLCBfX3VyYW5nZSAvIF9fdWVybmdyYW5nZSkpKTsKKwkJX19yZXQgPSBfX3RtcCArIChfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW4pOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcmV0ID4gX191cmFuZ2UgfHwgX19yZXQgPCBfX3RtcCk7CisJICB9CisJZWxzZQorCSAgX19yZXQgPSBfX3VjdHlwZShfX3VybmcoKSkgLSBfX3VybmdtaW47CisKKwlyZXR1cm4gX19yZXQgKyBfX3BhcmFtLmEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBfX29zIDw8IF9feC5hKCkgPDwgX19zcGFjZSA8PCBfX3guYigpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfSW50VHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmEoKSA8PCBfX3NwYWNlIDw8IF9feC5iKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSB1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fYSwgX19iKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmVybm91bGxpX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5wKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCS8vIEFib3V0IHRoZSBlcHNpbG9uIHRoaW5nIHNlZSB0aGlzIHRocmVhZDoKKwkvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNi0xMC9tc2cwMDk3MS5odG1sCisJY29uc3QgZG91YmxlIF9fbmFmID0KKwkgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkpIC8gMjsKKwkvLyBUaGUgbGFyZ2VzdCBfUmVhbFR5cGUgY29udmVydGlibGUgdG8gX0ludFR5cGUuCisJY29uc3QgZG91YmxlIF9fdGhyID0KKwkgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSArIF9fbmFmOworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJZG91YmxlIF9fY2FuZDsKKwlkbworCSAgX19jYW5kID0gc3RkOjpmbG9vcihzdGQ6OmxvZyhfX2F1cm5nKCkpIC8gX19wYXJhbS5fTV9sb2dfMV9wKTsKKwl3aGlsZSAoX19jYW5kID49IF9fdGhyKTsKKworCXJldHVybiByZXN1bHRfdHlwZShfX2NhbmQgKyBfX25hZik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnAoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX19wOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGdlb21ldHJpY19kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlKF9fcCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgbmVnYXRpdmVfYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJY29uc3QgZG91YmxlIF9feSA9IF9NX2dkKF9fdXJuZyk7CisKKwkvLyBYWFggSXMgdGhlIGNvbnN0cnVjdG9yIHRvbyBzbG93PworCXN0ZDo6cG9pc3Nvbl9kaXN0cmlidXRpb248cmVzdWx0X3R5cGU+IF9fcG9pc3NvbihfX3kpOworCXJldHVybiBfX3BvaXNzb24oX191cm5nKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIG5lZ2F0aXZlX2Jpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Z2FtbWFfZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPjo6cGFyYW1fdHlwZQorCSAgcGFyYW1fdHlwZTsKKwkKKwljb25zdCBkb3VibGUgX195ID0KKwkgIF9NX2dkKF9fdXJuZywgcGFyYW1fdHlwZShfX3AuaygpLCAoMS4wIC0gX19wLnAoKSkgLyBfX3AucCgpKSk7CisKKwlzdGQ6OnBvaXNzb25fZGlzdHJpYnV0aW9uPHJlc3VsdF90eXBlPiBfX3BvaXNzb24oX195KTsKKwlyZXR1cm4gX19wb2lzc29uKF9fdXJuZyk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19vcy53aWRlbignICcpKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guaygpIDw8IF9fc3BhY2UgPDwgX194LnAoKQorCSAgIDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfSW50VHlwZSBfX2s7CisgICAgICBkb3VibGUgX19wOworICAgICAgX19pcyA+PiBfX2sgPj4gX19wID4+IF9feC5fTV9nZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBuZWdhdGl2ZV9iaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2ssIF9fcCkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdm9pZAorICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfTV9tZWFuID49IDEyKQorCXsKKwkgIGNvbnN0IGRvdWJsZSBfX20gPSBzdGQ6OmZsb29yKF9NX21lYW4pOworCSAgX01fbG1fdGhyID0gc3RkOjpsb2coX01fbWVhbik7CisJICBfTV9sZm0gPSBzdGQ6OmxnYW1tYShfX20gKyAxKTsKKwkgIF9NX3NtID0gc3RkOjpzcXJ0KF9fbSk7CisKKwkgIGNvbnN0IGRvdWJsZSBfX3BpXzQgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMOworCSAgY29uc3QgZG91YmxlIF9fZHggPSBzdGQ6OnNxcnQoMiAqIF9fbSAqIHN0ZDo6bG9nKDMyICogX19tCisJCQkJCQkJICAgICAgLyBfX3BpXzQpKTsKKwkgIF9NX2QgPSBzdGQ6OnJvdW5kKHN0ZDo6bWF4KDYuMCwgc3RkOjptaW4oX19tLCBfX2R4KSkpOworCSAgY29uc3QgZG91YmxlIF9fY3ggPSAyICogX19tICsgX01fZDsKKwkgIF9NX3NjeCA9IHN0ZDo6c3FydChfX2N4IC8gMik7CisJICBfTV8xY3ggPSAxIC8gX19jeDsKKworCSAgX01fYzJiID0gc3RkOjpzcXJ0KF9fcGlfNCAqIF9fY3gpICogc3RkOjpleHAoX01fMWN4KTsKKwkgIF9NX2NiID0gMiAqIF9fY3ggKiBzdGQ6OmV4cCgtX01fZCAqIF9NXzFjeCAqICgxICsgX01fZCAvIDIpKQorCQkvIF9NX2Q7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJX01fbG1fdGhyID0gc3RkOjpleHAoLV9NX21lYW4pOworICAgICAgfQorCisgIC8qKgorICAgKiBBIHJlamVjdGlvbiBhbGdvcml0aG0gd2hlbiBtZWFuID49IDEyIGFuZCBhIHNpbXBsZSBtZXRob2QgYmFzZWQKKyAgICogdXBvbiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdW5pZm9ybSByYW5kb20gdmFyaWF0ZXMgb3RoZXJ3aXNlLgorICAgKiBOQjogVGhlIGZvcm1lciBpcyBhdmFpbGFibGUgb25seSBpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAqIGlzIGRlZmluZWQuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBYLCBTZWN0cy4gMy4zICYgMy40ICgrIEVycmF0YSEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJaWYgKF9fcGFyYW0ubWVhbigpID49IDEyKQorCSAgeworCSAgICBkb3VibGUgX194OworCisJICAgIC8vIFNlZSBjb21tZW50cyBhYm92ZS4uLgorCSAgICBjb25zdCBkb3VibGUgX19uYWYgPQorCSAgICAgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkpIC8gMjsKKwkgICAgY29uc3QgZG91YmxlIF9fdGhyID0KKwkgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKworCSAgICBjb25zdCBkb3VibGUgX19tID0gc3RkOjpmbG9vcihfX3BhcmFtLm1lYW4oKSk7CisJICAgIC8vIHNxcnQocGkgLyAyKQorCSAgICBjb25zdCBkb3VibGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICAgIGNvbnN0IGRvdWJsZSBfX2MxID0gX19wYXJhbS5fTV9zbSAqIF9fc3BpXzI7CisJICAgIGNvbnN0IGRvdWJsZSBfX2MyID0gX19wYXJhbS5fTV9jMmIgKyBfX2MxOworCSAgICBjb25zdCBkb3VibGUgX19jMyA9IF9fYzIgKyAxOworCSAgICBjb25zdCBkb3VibGUgX19jNCA9IF9fYzMgKyAxOworCSAgICAvLyBlXigxIC8gNzgpCisJICAgIGNvbnN0IGRvdWJsZSBfX2UxNzggPSAxLjAxMjkwMzA0NzkzMjAwMTg1ODMxODU1MTQ3Nzc1MTI5ODNMOworCSAgICBjb25zdCBkb3VibGUgX19jNSA9IF9fYzQgKyBfX2UxNzg7CisJICAgIGNvbnN0IGRvdWJsZSBfX2MgPSBfX3BhcmFtLl9NX2NiICsgX19jNTsKKwkgICAgY29uc3QgZG91YmxlIF9fMmN4ID0gMiAqICgyICogX19tICsgX19wYXJhbS5fTV9kKTsKKworCSAgICBib29sIF9fcmVqZWN0ID0gdHJ1ZTsKKwkgICAgZG8KKwkgICAgICB7CisJCWNvbnN0IGRvdWJsZSBfX3UgPSBfX2MgKiBfX2F1cm5nKCk7CisJCWNvbnN0IGRvdWJsZSBfX2UgPSAtc3RkOjpsb2coX19hdXJuZygpKTsKKworCQlkb3VibGUgX193ID0gMC4wOworCisJCWlmIChfX3UgPD0gX19jMSkKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSAtc3RkOjphYnMoX19uKSAqIF9fcGFyYW0uX01fc20gLSAxOworCQkgICAgX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkgICAgX193ID0gLV9fbiAqIF9fbiAvIDI7CisJCSAgICBpZiAoX194IDwgLV9fbSkKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19jMikKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSAxICsgc3RkOjphYnMoX19uKSAqIF9fcGFyYW0uX01fc2N4OworCQkgICAgX194ID0gc3RkOjpjZWlsKF9feSk7CisJCSAgICBfX3cgPSBfX3kgKiAoMiAtIF9feSkgKiBfX3BhcmFtLl9NXzFjeDsKKwkJICAgIGlmIChfX3ggPiBfX3BhcmFtLl9NX2QpCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYzMpCisJCSAgLy8gTkI6IFRoaXMgY2FzZSBub3QgaW4gdGhlIGJvb2ssIG5vciBpbiB0aGUgRXJyYXRhLAorCQkgIC8vIGJ1dCBzaG91bGQgYmUgb2suLi4KKwkJICBfX3ggPSAtMTsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzQpCisJCSAgX194ID0gMDsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzUpCisJCSAgX194ID0gMTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3YgPSAtc3RkOjpsb2coX19hdXJuZygpKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSBfX3BhcmFtLl9NX2QKKwkJCQkgICAgICsgX192ICogX18yY3ggLyBfX3BhcmFtLl9NX2Q7CisJCSAgICBfX3ggPSBzdGQ6OmNlaWwoX195KTsKKwkJICAgIF9fdyA9IC1fX3BhcmFtLl9NX2QgKiBfX3BhcmFtLl9NXzFjeCAqICgxICsgX195IC8gMik7CisJCSAgfQorCisJCV9fcmVqZWN0ID0gKF9fdyAtIF9fZSAtIF9feCAqIF9fcGFyYW0uX01fbG1fdGhyCisJCQkgICAgPiBfX3BhcmFtLl9NX2xmbSAtIHN0ZDo6bGdhbW1hKF9feCArIF9fbSArIDEpKTsKKworCQlfX3JlamVjdCB8PSBfX3ggKyBfX20gPj0gX190aHI7CisKKwkgICAgICB9IHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgcmV0dXJuIHJlc3VsdF90eXBlKF9feCArIF9fbSArIF9fbmFmKTsKKwkgIH0KKwllbHNlCisjZW5kaWYKKwkgIHsKKwkgICAgX0ludFR5cGUgICAgIF9feCA9IDA7CisJICAgIGRvdWJsZSBfX3Byb2QgPSAxLjA7CisKKwkgICAgZG8KKwkgICAgICB7CisJCV9fcHJvZCAqPSBfX2F1cm5nKCk7CisJCV9feCArPSAxOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcHJvZCA+IF9fcGFyYW0uX01fbG1fdGhyKTsKKworCSAgICByZXR1cm4gX194IC0gMTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm1lYW4oKSA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGRvdWJsZSBfX21lYW47CisgICAgICBfX2lzID4+IF9fbWVhbiA+PiBfX3guX01fbmQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGU+OjpwYXJhbV90eXBlKF9fbWVhbikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdm9pZAorICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGU6OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBfX3AxMiA9IF9NX3AgPD0gMC41ID8gX01fcCA6IDEuMCAtIF9NX3A7CisKKyAgICAgIF9NX2Vhc3kgPSB0cnVlOworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgaWYgKF9NX3QgKiBfX3AxMiA+PSA4KQorCXsKKwkgIF9NX2Vhc3kgPSBmYWxzZTsKKwkgIGNvbnN0IGRvdWJsZSBfX25wID0gc3RkOjpmbG9vcihfTV90ICogX19wMTIpOworCSAgY29uc3QgZG91YmxlIF9fcGEgPSBfX25wIC8gX01fdDsKKwkgIGNvbnN0IGRvdWJsZSBfXzFwID0gMSAtIF9fcGE7CisKKwkgIGNvbnN0IGRvdWJsZSBfX3BpXzQgPSAwLjc4NTM5ODE2MzM5NzQ0ODMwOTYxNTY2MDg0NTgxOTg3NTdMOworCSAgY29uc3QgZG91YmxlIF9fZDF4ID0KKwkgICAgc3RkOjpzcXJ0KF9fbnAgKiBfXzFwICogc3RkOjpsb2coMzIgKiBfX25wCisJCQkJCSAgICAgLyAoODEgKiBfX3BpXzQgKiBfXzFwKSkpOworCSAgX01fZDEgPSBzdGQ6OnJvdW5kKHN0ZDo6bWF4KDEuMCwgX19kMXgpKTsKKwkgIGNvbnN0IGRvdWJsZSBfX2QyeCA9CisJICAgIHN0ZDo6c3FydChfX25wICogX18xcCAqIHN0ZDo6bG9nKDMyICogX01fdCAqIF9fMXAKKwkJCQkJICAgICAvIChfX3BpXzQgKiBfX3BhKSkpOworCSAgX01fZDIgPSBzdGQ6OnJvdW5kKHN0ZDo6bWF4KDEuMCwgX19kMngpKTsKKworCSAgLy8gc3FydChwaSAvIDIpCisJICBjb25zdCBkb3VibGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICBfTV9zMSA9IHN0ZDo6c3FydChfX25wICogX18xcCkgKiAoMSArIF9NX2QxIC8gKDQgKiBfX25wKSk7CisJICBfTV9zMiA9IHN0ZDo6c3FydChfX25wICogX18xcCkgKiAoMSArIF9NX2QyIC8gKDQgKiBfTV90ICogX18xcCkpOworCSAgX01fYyA9IDIgKiBfTV9kMSAvIF9fbnA7CisJICBfTV9hMSA9IHN0ZDo6ZXhwKF9NX2MpICogX01fczEgKiBfX3NwaV8yOworCSAgY29uc3QgZG91YmxlIF9fYTEyID0gX01fYTEgKyBfTV9zMiAqIF9fc3BpXzI7CisJICBjb25zdCBkb3VibGUgX19zMXMgPSBfTV9zMSAqIF9NX3MxOworCSAgX01fYTEyMyA9IF9fYTEyICsgKHN0ZDo6ZXhwKF9NX2QxIC8gKF9NX3QgKiBfXzFwKSkKKwkJCSAgICAgKiAyICogX19zMXMgLyBfTV9kMQorCQkJICAgICAqIHN0ZDo6ZXhwKC1fTV9kMSAqIF9NX2QxIC8gKDIgKiBfX3MxcykpKTsKKwkgIGNvbnN0IGRvdWJsZSBfX3MycyA9IF9NX3MyICogX01fczI7CisJICBfTV9zID0gKF9NX2ExMjMgKyAyICogX19zMnMgLyBfTV9kMgorCQkgICogc3RkOjpleHAoLV9NX2QyICogX01fZDIgLyAoMiAqIF9fczJzKSkpOworCSAgX01fbGYgPSAoc3RkOjpsZ2FtbWEoX19ucCArIDEpCisJCSAgICsgc3RkOjpsZ2FtbWEoX01fdCAtIF9fbnAgKyAxKSk7CisJICBfTV9scDFwID0gc3RkOjpsb2coX19wYSAvIF9fMXApOworCisJICBfTV9xID0gLXN0ZDo6bG9nKDEgLSAoX19wMTIgLSBfX3BhKSAvIF9fMXApOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZgorCV9NX3EgPSAtc3RkOjpsb2coMSAtIF9fcDEyKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBfTV93YWl0aW5nKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsIF9JbnRUeXBlIF9fdCkKKyAgICAgIHsKKwlfSW50VHlwZSBfX3ggPSAwOworCWRvdWJsZSBfX3N1bSA9IDAuMDsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWRvCisJICB7CisJICAgIGNvbnN0IGRvdWJsZSBfX2UgPSAtc3RkOjpsb2coX19hdXJuZygpKTsKKwkgICAgX19zdW0gKz0gX19lIC8gKF9fdCAtIF9feCk7CisJICAgIF9feCArPSAxOworCSAgfQorCXdoaWxlIChfX3N1bSA8PSBfTV9wYXJhbS5fTV9xKTsKKworCXJldHVybiBfX3ggLSAxOworICAgICAgfQorCisgIC8qKgorICAgKiBBIHJlamVjdGlvbiBhbGdvcml0aG0gd2hlbiB0ICogcCA+PSA4IGFuZCBhIHNpbXBsZSB3YWl0aW5nIHRpbWUKKyAgICogbWV0aG9kIC0gdGhlIHNlY29uZCBpbiB0aGUgcmVmZXJlbmNlZCBib29rIC0gb3RoZXJ3aXNlLgorICAgKiBOQjogVGhlIGZvcm1lciBpcyBhdmFpbGFibGUgb25seSBpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAqIGlzIGRlZmluZWQuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBYLCBTZWN0LiA0ICgrIEVycmF0YSEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCXJlc3VsdF90eXBlIF9fcmV0OworCWNvbnN0IF9JbnRUeXBlIF9fdCA9IF9fcGFyYW0udCgpOworCWNvbnN0IGRvdWJsZSBfX3AgPSBfX3BhcmFtLnAoKTsKKwljb25zdCBkb3VibGUgX19wMTIgPSBfX3AgPD0gMC41ID8gX19wIDogMS4wIC0gX19wOworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCWlmICghX19wYXJhbS5fTV9lYXN5KQorCSAgeworCSAgICBkb3VibGUgX194OworCisJICAgIC8vIFNlZSBjb21tZW50cyBhYm92ZS4uLgorCSAgICBjb25zdCBkb3VibGUgX19uYWYgPQorCSAgICAgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkpIC8gMjsKKwkgICAgY29uc3QgZG91YmxlIF9fdGhyID0KKwkgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKworCSAgICBjb25zdCBkb3VibGUgX19ucCA9IHN0ZDo6Zmxvb3IoX190ICogX19wMTIpOworCisJICAgIC8vIHNxcnQocGkgLyAyKQorCSAgICBjb25zdCBkb3VibGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICAgIGNvbnN0IGRvdWJsZSBfX2ExID0gX19wYXJhbS5fTV9hMTsKKwkgICAgY29uc3QgZG91YmxlIF9fYTEyID0gX19hMSArIF9fcGFyYW0uX01fczIgKiBfX3NwaV8yOworCSAgICBjb25zdCBkb3VibGUgX19hMTIzID0gX19wYXJhbS5fTV9hMTIzOworCSAgICBjb25zdCBkb3VibGUgX19zMXMgPSBfX3BhcmFtLl9NX3MxICogX19wYXJhbS5fTV9zMTsKKwkgICAgY29uc3QgZG91YmxlIF9fczJzID0gX19wYXJhbS5fTV9zMiAqIF9fcGFyYW0uX01fczI7CisKKwkgICAgYm9vbCBfX3JlamVjdDsKKwkgICAgZG8KKwkgICAgICB7CisJCWNvbnN0IGRvdWJsZSBfX3UgPSBfX3BhcmFtLl9NX3MgKiBfX2F1cm5nKCk7CisKKwkJZG91YmxlIF9fdjsKKworCQlpZiAoX191IDw9IF9fYTEpCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBkb3VibGUgX195ID0gX19wYXJhbS5fTV9zMSAqIHN0ZDo6YWJzKF9fbik7CisJCSAgICBfX3JlamVjdCA9IF9feSA+PSBfX3BhcmFtLl9NX2QxOworCQkgICAgaWYgKCFfX3JlamVjdCkKKwkJICAgICAgeworCQkJY29uc3QgZG91YmxlIF9fZSA9IC1zdGQ6OmxvZyhfX2F1cm5nKCkpOworCQkJX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkJX192ID0gLV9fZSAtIF9fbiAqIF9fbiAvIDIgKyBfX3BhcmFtLl9NX2M7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKF9fdSA8PSBfX2ExMikKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSBfX3BhcmFtLl9NX3MyICogc3RkOjphYnMoX19uKTsKKwkJICAgIF9fcmVqZWN0ID0gX195ID49IF9fcGFyYW0uX01fZDI7CisJCSAgICBpZiAoIV9fcmVqZWN0KQorCQkgICAgICB7CisJCQljb25zdCBkb3VibGUgX19lID0gLXN0ZDo6bG9nKF9fYXVybmcoKSk7CisJCQlfX3ggPSBzdGQ6OmZsb29yKC1fX3kpOworCQkJX192ID0gLV9fZSAtIF9fbiAqIF9fbiAvIDI7CisJCSAgICAgIH0KKwkJICB9CisJCWVsc2UgaWYgKF9fdSA8PSBfX2ExMjMpCisJCSAgeworCQkgICAgY29uc3QgZG91YmxlIF9fZTEgPSAtc3RkOjpsb2coX19hdXJuZygpKTsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX2UyID0gLXN0ZDo6bG9nKF9fYXVybmcoKSk7CisKKwkJICAgIGNvbnN0IGRvdWJsZSBfX3kgPSBfX3BhcmFtLl9NX2QxCisJCQkJICAgICArIDIgKiBfX3MxcyAqIF9fZTEgLyBfX3BhcmFtLl9NX2QxOworCQkgICAgX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkgICAgX192ID0gKC1fX2UyICsgX19wYXJhbS5fTV9kMSAqICgxIC8gKF9fdCAtIF9fbnApCisJCQkJCQkgICAgLV9feSAvICgyICogX19zMXMpKSk7CisJCSAgICBfX3JlamVjdCA9IGZhbHNlOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IGRvdWJsZSBfX2UxID0gLXN0ZDo6bG9nKF9fYXVybmcoKSk7CisJCSAgICBjb25zdCBkb3VibGUgX19lMiA9IC1zdGQ6OmxvZyhfX2F1cm5nKCkpOworCisJCSAgICBjb25zdCBkb3VibGUgX195ID0gX19wYXJhbS5fTV9kMgorCQkJCSAgICAgKyAyICogX19zMnMgKiBfX2UxIC8gX19wYXJhbS5fTV9kMjsKKwkJICAgIF9feCA9IHN0ZDo6Zmxvb3IoLV9feSk7CisJCSAgICBfX3YgPSAtX19lMiAtIF9fcGFyYW0uX01fZDIgKiBfX3kgLyAoMiAqIF9fczJzKTsKKwkJICAgIF9fcmVqZWN0ID0gZmFsc2U7CisJCSAgfQorCisJCV9fcmVqZWN0ID0gX19yZWplY3QgfHwgX194IDwgLV9fbnAgfHwgX194ID4gX190IC0gX19ucDsKKwkJaWYgKCFfX3JlamVjdCkKKwkJICB7CisJCSAgICBjb25zdCBkb3VibGUgX19sZnggPQorCQkgICAgICBzdGQ6OmxnYW1tYShfX25wICsgX194ICsgMSkKKwkJICAgICAgKyBzdGQ6OmxnYW1tYShfX3QgLSAoX19ucCArIF9feCkgKyAxKTsKKwkJICAgIF9fcmVqZWN0ID0gX192ID4gX19wYXJhbS5fTV9sZiAtIF9fbGZ4CisJCQkgICAgICsgX194ICogX19wYXJhbS5fTV9scDFwOworCQkgIH0KKworCQlfX3JlamVjdCB8PSBfX3ggKyBfX25wID49IF9fdGhyOworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcmVqZWN0KTsKKworCSAgICBfX3ggKz0gX19ucCArIF9fbmFmOworCisJICAgIGNvbnN0IF9JbnRUeXBlIF9feiA9IF9NX3dhaXRpbmcoX191cm5nLCBfX3QgLSBfSW50VHlwZShfX3gpKTsKKwkgICAgX19yZXQgPSBfSW50VHlwZShfX3gpICsgX196OworCSAgfQorCWVsc2UKKyNlbmRpZgorCSAgX19yZXQgPSBfTV93YWl0aW5nKF9fdXJuZywgX190KTsKKworCWlmIChfX3AxMiAhPSBfX3ApCisJICBfX3JldCA9IF9fdCAtIF9fcmV0OworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC50KCkgPDwgX19zcGFjZSA8PCBfX3gucCgpCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX0ludFR5cGUgX190OworICAgICAgZG91YmxlIF9fcDsKKyAgICAgIF9faXMgPj4gX190ID4+IF9fcCA+PiBfX3guX01fbmQ7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlPjo6CisJCXBhcmFtX3R5cGUoX190LCBfX3ApKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmxhbWJkYSgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2xhbWJkYTsKKyAgICAgIF9faXMgPj4gX19sYW1iZGE7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbGFtYmRhKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICAvKioKKyAgICogUG9sYXIgbWV0aG9kIGR1ZSB0byBNYXJzYWdsaWEuCisgICAqCisgICAqIERldnJveWUsIEwuIE5vbi1Vbmlmb3JtIFJhbmRvbSBWYXJpYXRlcyBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcsCisgICAqIE5ldyBZb3JrLCAxOTg2LCBDaC4gViwgU2VjdC4gNC40LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJcmVzdWx0X3R5cGUgX19yZXQ7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCByZXN1bHRfdHlwZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWlmIChfTV9zYXZlZF9hdmFpbGFibGUpCisJICB7CisJICAgIF9NX3NhdmVkX2F2YWlsYWJsZSA9IGZhbHNlOworCSAgICBfX3JldCA9IF9NX3NhdmVkOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgcmVzdWx0X3R5cGUgX194LCBfX3ksIF9fcjI7CisJICAgIGRvCisJICAgICAgeworCQlfX3ggPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworCQlfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX19hdXJuZygpIC0gMS4wOworCQlfX3IyID0gX194ICogX194ICsgX195ICogX195OworCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fcjIgPiAxLjAgfHwgX19yMiA9PSAwLjApOworCisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbXVsdCA9IHN0ZDo6c3FydCgtMiAqIHN0ZDo6bG9nKF9fcjIpIC8gX19yMik7CisJICAgIF9NX3NhdmVkID0gX194ICogX19tdWx0OworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSB0cnVlOworCSAgICBfX3JldCA9IF9feSAqIF9fbXVsdDsKKwkgIH0KKworCV9fcmV0ID0gX19yZXQgKiBfX3BhcmFtLnN0ZGRldigpICsgX19wYXJhbS5tZWFuKCk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdGQ6Om5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX19kMSwKKwkgICAgICAgY29uc3Qgc3RkOjpub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9fZDIpCisgICAgeworICAgICAgaWYgKF9fZDEuX01fcGFyYW0gPT0gX19kMi5fTV9wYXJhbQorCSAgJiYgX19kMS5fTV9zYXZlZF9hdmFpbGFibGUgPT0gX19kMi5fTV9zYXZlZF9hdmFpbGFibGUpCisJeworCSAgaWYgKF9fZDEuX01fc2F2ZWRfYXZhaWxhYmxlCisJICAgICAgJiYgX19kMS5fTV9zYXZlZCA9PSBfX2QyLl9NX3NhdmVkKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGVsc2UgaWYoIV9fZDEuX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGVsc2UKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5tZWFuKCkgPDwgX19zcGFjZSA8PCBfX3guc3RkZGV2KCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9zYXZlZF9hdmFpbGFibGU7CisgICAgICBpZiAoX194Ll9NX3NhdmVkX2F2YWlsYWJsZSkKKwlfX29zIDw8IF9fc3BhY2UgPDwgX194Ll9NX3NhdmVkOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBkb3VibGUgX19tZWFuLCBfX3N0ZGRldjsKKyAgICAgIF9faXMgPj4gX19tZWFuID4+IF9fc3RkZGV2CisJICAgPj4gX194Ll9NX3NhdmVkX2F2YWlsYWJsZTsKKyAgICAgIGlmIChfX3guX01fc2F2ZWRfYXZhaWxhYmxlKQorCV9faXMgPj4gX194Ll9NX3NhdmVkOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19tZWFuLCBfX3N0ZGRldikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm0oKSA8PCBfX3NwYWNlIDw8IF9feC5zKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGxvZ25vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbSwgX19zOworICAgICAgX19pcyA+PiBfX20gPj4gX19zID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCQlwYXJhbV90eXBlKF9fbSwgX19zKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjptYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5uKCkgPDwgX19zcGFjZSA8PCBfX3guX01fZ2Q7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbjsKKyAgICAgIF9faXMgPj4gX19uID4+IF9feC5fTV9nZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBjaGlfc3F1YXJlZF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19uKSk7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJX1JlYWxUeXBlIF9fdTsKKwlkbworCSAgX191ID0gX19hdXJuZygpOworCXdoaWxlIChfX3UgPT0gMC41KTsKKworCWNvbnN0IF9SZWFsVHlwZSBfX3BpID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TDsKKwlyZXR1cm4gX19wLmEoKSArIF9fcC5iKCkgKiBzdGQ6OnRhbihfX3BpICogX191KTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBjYXVjaHlfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYSwgX19iOworICAgICAgX19pcyA+PiBfX2EgPj4gX19iOworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGNhdWNoeV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hLCBfX2IpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm0oKSA8PCBfX3NwYWNlIDw8IF9feC5uKCkKKwkgICA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZF94IDw8IF9fc3BhY2UgPDwgX194Ll9NX2dkX3k7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBmaXNoZXJfZl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbSwgX19uOworICAgICAgX19pcyA+PiBfX20gPj4gX19uID4+IF9feC5fTV9nZF94ID4+IF9feC5fTV9nZF95OworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGZpc2hlcl9mX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX20sIF9fbikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194Lm4oKSA8PCBfX3NwYWNlIDw8IF9feC5fTV9uZCA8PCBfX3NwYWNlIDw8IF9feC5fTV9nZDsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHN0dWRlbnRfdF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fbjsKKyAgICAgIF9faXMgPj4gX19uID4+IF9feC5fTV9uZCA+PiBfX3guX01fZ2Q7CisgICAgICBfX3gucGFyYW0odHlwZW5hbWUgc3R1ZGVudF90X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlKF9fbikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgX01fbWFscGhhID0gX01fYWxwaGEgPCAxLjAgPyBfTV9hbHBoYSArIF9SZWFsVHlwZSgxLjApIDogX01fYWxwaGE7CisKKyAgICAgIGNvbnN0IF9SZWFsVHlwZSBfX2ExID0gX01fbWFscGhhIC0gX1JlYWxUeXBlKDEuMCkgLyBfUmVhbFR5cGUoMy4wKTsKKyAgICAgIF9NX2EyID0gX1JlYWxUeXBlKDEuMCkgLyBzdGQ6OnNxcnQoX1JlYWxUeXBlKDkuMCkgKiBfX2ExKTsKKyAgICB9CisKKyAgLyoqCisgICAqIE1hcnNhZ2xpYSwgRy4gYW5kIFRzYW5nLCBXLiBXLgorICAgKiAiQSBTaW1wbGUgTWV0aG9kIGZvciBHZW5lcmF0aW5nIEdhbW1hIFZhcmlhYmxlcyIKKyAgICogQUNNIFRyYW5zYWN0aW9ucyBvbiBNYXRoZW1hdGljYWwgU29mdHdhcmUsIDI2LCAzLCAzNjMtMzcyLCAyMDAwLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCSBjb25zdCBwYXJhbV90eXBlJiBfX3BhcmFtKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwlyZXN1bHRfdHlwZSBfX3UsIF9fdiwgX19uOworCWNvbnN0IHJlc3VsdF90eXBlIF9fYTEgPSAoX19wYXJhbS5fTV9tYWxwaGEKKwkJCQkgIC0gX1JlYWxUeXBlKDEuMCkgLyBfUmVhbFR5cGUoMy4wKSk7CisKKwlkbworCSAgeworCSAgICBkbworCSAgICAgIHsKKwkJX19uID0gX01fbmQoX191cm5nKTsKKwkJX192ID0gcmVzdWx0X3R5cGUoMS4wKSArIF9fcGFyYW0uX01fYTIgKiBfX247IAorCSAgICAgIH0KKwkgICAgd2hpbGUgKF9fdiA8PSAwLjApOworCisJICAgIF9fdiA9IF9fdiAqIF9fdiAqIF9fdjsKKwkgICAgX191ID0gX19hdXJuZygpOworCSAgfQorCXdoaWxlIChfX3UgPiByZXN1bHRfdHlwZSgxLjApIC0gMC4zMzEgKiBfX24gKiBfX24gKiBfX24gKiBfX24KKwkgICAgICAgJiYgKHN0ZDo6bG9nKF9fdSkgPiAoMC41ICogX19uICogX19uICsgX19hMQorCQkJCSAgICAqICgxLjAgLSBfX3YgKyBzdGQ6OmxvZyhfX3YpKSkpKTsKKworCWlmIChfX3BhcmFtLmFscGhhKCkgPT0gX19wYXJhbS5fTV9tYWxwaGEpCisJICByZXR1cm4gX19hMSAqIF9fdiAqIF9fcGFyYW0uYmV0YSgpOworCWVsc2UKKwkgIHsKKwkgICAgZG8KKwkgICAgICBfX3UgPSBfX2F1cm5nKCk7CisJICAgIHdoaWxlIChfX3UgPT0gMC4wKTsKKwkgICAgCisJICAgIHJldHVybiAoc3RkOjpwb3coX191LCByZXN1bHRfdHlwZSgxLjApIC8gX19wYXJhbS5hbHBoYSgpKQorCQkgICAgKiBfX2ExICogX192ICogX19wYXJhbS5iZXRhKCkpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LmFscGhhKCkgPDwgX19zcGFjZSA8PCBfX3guYmV0YSgpCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX1JlYWxUeXBlIF9fYWxwaGFfdmFsLCBfX2JldGFfdmFsOworICAgICAgX19pcyA+PiBfX2FscGhhX3ZhbCA+PiBfX2JldGFfdmFsID4+IF9feC5fTV9uZDsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisJCXBhcmFtX3R5cGUoX19hbHBoYV92YWwsIF9fYmV0YV92YWwpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcCkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIHJlc3VsdF90eXBlPgorCSAgX19hdXJuZyhfX3VybmcpOworCXJldHVybiBfX3AuYigpICogc3RkOjpwb3coLXN0ZDo6bG9nKF9fYXVybmcoKSksCisJCQkJICByZXN1bHRfdHlwZSgxKSAvIF9fcC5hKCkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHdlaWJ1bGxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSB3ZWlidWxsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgZXh0cmVtZV92YWx1ZV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wKQorICAgICAgeworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgcmVzdWx0X3R5cGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisJcmV0dXJuIF9fcC5hKCkgLSBfX3AuYigpICogc3RkOjpsb2coLXN0ZDo6bG9nKF9fYXVybmcoKSkpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guYSgpIDw8IF9fc3BhY2UgPDwgX194LmIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGV4dHJlbWVfdmFsdWVfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9SZWFsVHlwZSBfX2EsIF9fYjsKKyAgICAgIF9faXMgPj4gX19hID4+IF9fYjsKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBleHRyZW1lX3ZhbHVlX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkJcGFyYW1fdHlwZShfX2EsIF9fYikpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdm9pZAorICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGU6OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIGlmIChfTV9wcm9iLnNpemUoKSA8IDIpCisJeworCSAgX01fcHJvYi5jbGVhcigpOworCSAgcmV0dXJuOworCX0KKworICAgICAgY29uc3QgZG91YmxlIF9fc3VtID0gc3RkOjphY2N1bXVsYXRlKF9NX3Byb2IuYmVnaW4oKSwKKwkJCQkJICAgX01fcHJvYi5lbmQoKSwgMC4wKTsKKyAgICAgIC8vIE5vdyBub3JtYWxpemUgdGhlIHByb2JhYmlsaXRlcy4KKyAgICAgIF9fZGV0YWlsOjpfX3RyYW5zZm9ybShfTV9wcm9iLmJlZ2luKCksIF9NX3Byb2IuZW5kKCksIF9NX3Byb2IuYmVnaW4oKSwKKwkJCSAgc3RkOjpiaW5kMm5kKHN0ZDo6ZGl2aWRlczxkb3VibGU+KCksIF9fc3VtKSk7CisgICAgICAvLyBBY2N1bXVsYXRlIHBhcnRpYWwgc3Vtcy4KKyAgICAgIF9NX2NwLnJlc2VydmUoX01fcHJvYi5zaXplKCkpOworICAgICAgc3RkOjpwYXJ0aWFsX3N1bShfTV9wcm9iLmJlZ2luKCksIF9NX3Byb2IuZW5kKCksCisJCSAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoX01fY3ApKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCBjdW11bGF0aXZlIHByb2JhYmlsaXR5IGlzIG9uZS4KKyAgICAgIF9NX2NwW19NX2NwLnNpemUoKSAtIDFdID0gMS4wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuYz4KKyAgICAgIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShzaXplX3QgX19udywgZG91YmxlIF9feG1pbiwgZG91YmxlIF9feG1heCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01fcHJvYigpLCBfTV9jcCgpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fbiA9IF9fbncgPT0gMCA/IDEgOiBfX253OworCWNvbnN0IGRvdWJsZSBfX2RlbHRhID0gKF9feG1heCAtIF9feG1pbikgLyBfX247CisKKwlfTV9wcm9iLnJlc2VydmUoX19uKTsKKwlmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX253OyArK19faykKKwkgIF9NX3Byb2IucHVzaF9iYWNrKF9fZncoX194bWluICsgX19rICogX19kZWx0YSArIDAuNSAqIF9fZGVsdGEpKTsKKworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHJldHVybiByZXN1bHRfdHlwZSgwKTsKKworCV9fZGV0YWlsOjpfQWRhcHRvcjxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgZG91YmxlPgorCSAgX19hdXJuZyhfX3VybmcpOworCisJY29uc3QgZG91YmxlIF9fcCA9IF9fYXVybmcoKTsKKwlhdXRvIF9fcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX3BhcmFtLl9NX2NwLmJlZ2luKCksCisJCQkJICAgICAgX19wYXJhbS5fTV9jcC5lbmQoKSwgX19wKTsKKworCXJldHVybiBfX3BvcyAtIF9fcGFyYW0uX01fY3AuYmVnaW4oKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4X2RpZ2l0czEwKTsKKworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBfX3Byb2IgPSBfX3gucHJvYmFiaWxpdGllcygpOworICAgICAgX19vcyA8PCBfX3Byb2Iuc2l6ZSgpOworICAgICAgZm9yIChhdXRvIF9fZGl0ID0gX19wcm9iLmJlZ2luKCk7IF9fZGl0ICE9IF9fcHJvYi5lbmQoKTsgKytfX2RpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9fZGl0OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBkaXNjcmV0ZV9kaXN0cmlidXRpb248X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBzaXplX3QgX19uOworICAgICAgX19pcyA+PiBfX247CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19wcm9iX3ZlYzsKKyAgICAgIF9fcHJvYl92ZWMucmVzZXJ2ZShfX24pOworICAgICAgZm9yICg7IF9fbiAhPSAwOyAtLV9fbikKKwl7CisJICBkb3VibGUgX19wcm9iOworCSAgX19pcyA+PiBfX3Byb2I7CisJICBfX3Byb2JfdmVjLnB1c2hfYmFjayhfX3Byb2IpOworCX0KKworICAgICAgX194LnBhcmFtKHR5cGVuYW1lIGRpc2NyZXRlX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZT46OgorCQlwYXJhbV90eXBlKF9fcHJvYl92ZWMuYmVnaW4oKSwgX19wcm9iX3ZlYy5lbmQoKSkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgIF9NX2luaXRpYWxpemUoKQorICAgIHsKKyAgICAgIGlmIChfTV9pbnQuc2l6ZSgpIDwgMgorCSAgfHwgKF9NX2ludC5zaXplKCkgPT0gMgorCSAgICAgICYmIF9NX2ludFswXSA9PSBfUmVhbFR5cGUoMCkKKwkgICAgICAmJiBfTV9pbnRbMV0gPT0gX1JlYWxUeXBlKDEpKSkKKwl7CisJICBfTV9pbnQuY2xlYXIoKTsKKwkgIF9NX2Rlbi5jbGVhcigpOworCSAgcmV0dXJuOworCX0KKworICAgICAgY29uc3QgZG91YmxlIF9fc3VtID0gc3RkOjphY2N1bXVsYXRlKF9NX2Rlbi5iZWdpbigpLAorCQkJCQkgICBfTV9kZW4uZW5kKCksIDAuMCk7CisKKyAgICAgIF9fZGV0YWlsOjpfX3RyYW5zZm9ybShfTV9kZW4uYmVnaW4oKSwgX01fZGVuLmVuZCgpLCBfTV9kZW4uYmVnaW4oKSwKKwkJCSAgICBzdGQ6OmJpbmQybmQoc3RkOjpkaXZpZGVzPGRvdWJsZT4oKSwgX19zdW0pKTsKKworICAgICAgX01fY3AucmVzZXJ2ZShfTV9kZW4uc2l6ZSgpKTsKKyAgICAgIHN0ZDo6cGFydGlhbF9zdW0oX01fZGVuLmJlZ2luKCksIF9NX2Rlbi5lbmQoKSwKKwkJICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihfTV9jcCkpOworCisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBpcyBvbmUuCisgICAgICBfTV9jcFtfTV9jcC5zaXplKCkgLSAxXSA9IDEuMDsKKworICAgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX01fZGVuLnNpemUoKTsgKytfX2spCisJX01fZGVuW19fa10gLz0gX01faW50W19fayArIDFdIC0gX01faW50W19fa107CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvckIsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yVz4KKyAgICAgIHBpZWNld2lzZV9jb25zdGFudF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yQiBfX2JiZWdpbiwKKwkJIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSBfSW5wdXRJdGVyYXRvclcgX193YmVnaW4pCisgICAgICA6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKQorICAgICAgeworCWlmIChfX2JiZWdpbiAhPSBfX2JlbmQpCisJICB7CisJICAgIGZvciAoOzspCisJICAgICAgeworCQlfTV9pbnQucHVzaF9iYWNrKCpfX2JiZWdpbik7CisJCSsrX19iYmVnaW47CisJCWlmIChfX2JiZWdpbiA9PSBfX2JlbmQpCisJCSAgYnJlYWs7CisKKwkJX01fZGVuLnB1c2hfYmFjaygqX193YmVnaW4pOworCQkrK19fd2JlZ2luOworCSAgICAgIH0KKwkgIH0KKworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmM+CisgICAgICBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OnBhcmFtX3R5cGU6OgorICAgICAgcGFyYW1fdHlwZShpbml0aWFsaXplcl9saXN0PF9SZWFsVHlwZT4gX19ibCwgX0Z1bmMgX19mdykKKyAgICAgIDogX01faW50KCksIF9NX2RlbigpLCBfTV9jcCgpCisgICAgICB7CisJX01faW50LnJlc2VydmUoX19ibC5zaXplKCkpOworCWZvciAoYXV0byBfX2JpdGVyID0gX19ibC5iZWdpbigpOyBfX2JpdGVyICE9IF9fYmwuZW5kKCk7ICsrX19iaXRlcikKKwkgIF9NX2ludC5wdXNoX2JhY2soKl9fYml0ZXIpOworCisJX01fZGVuLnJlc2VydmUoX01faW50LnNpemUoKSAtIDEpOworCWZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9NX2ludC5zaXplKCkgLSAxOyArK19faykKKwkgIF9NX2Rlbi5wdXNoX2JhY2soX19mdygwLjUgKiAoX01faW50W19fayArIDFdICsgX01faW50W19fa10pKSk7CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICAgIHBhcmFtX3R5cGUoc2l6ZV90IF9fbncsIF9SZWFsVHlwZSBfX3htaW4sIF9SZWFsVHlwZSBfX3htYXgsIF9GdW5jIF9fZncpCisgICAgICA6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX24gPSBfX253ID09IDAgPyAxIDogX19udzsKKwljb25zdCBfUmVhbFR5cGUgX19kZWx0YSA9IChfX3htYXggLSBfX3htaW4pIC8gX19uOworCisJX01faW50LnJlc2VydmUoX19uICsgMSk7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDw9IF9fbnc7ICsrX19rKQorCSAgX01faW50LnB1c2hfYmFjayhfX3htaW4gKyBfX2sgKiBfX2RlbHRhKTsKKworCV9NX2Rlbi5yZXNlcnZlKF9fbik7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19udzsgKytfX2spCisJICBfTV9kZW4ucHVzaF9iYWNrKF9fZncoX01faW50W19fa10gKyAwLjUgKiBfX2RlbHRhKSk7CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJIGNvbnN0IHBhcmFtX3R5cGUmIF9fcGFyYW0pCisgICAgICB7CisJX19kZXRhaWw6Ol9BZGFwdG9yPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBkb3VibGU+CisJICBfX2F1cm5nKF9fdXJuZyk7CisKKwljb25zdCBkb3VibGUgX19wID0gX19hdXJuZygpOworCWlmIChfX3BhcmFtLl9NX2NwLmVtcHR5KCkpCisJICByZXR1cm4gX19wOworCisJYXV0byBfX3BvcyA9IHN0ZDo6bG93ZXJfYm91bmQoX19wYXJhbS5fTV9jcC5iZWdpbigpLAorCQkJCSAgICAgIF9fcGFyYW0uX01fY3AuZW5kKCksIF9fcCk7CisJY29uc3Qgc2l6ZV90IF9faSA9IF9fcG9zIC0gX19wYXJhbS5fTV9jcC5iZWdpbigpOworCisJY29uc3QgZG91YmxlIF9fcHJlZiA9IF9faSA+IDAgPyBfX3BhcmFtLl9NX2NwW19faSAtIDFdIDogMC4wOworCisJcmV0dXJuIF9fcGFyYW0uX01faW50W19faV0gKyAoX19wIC0gX19wcmVmKSAvIF9fcGFyYW0uX01fZGVuW19faV07CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX19pbnQgPSBfX3guaW50ZXJ2YWxzKCk7CisgICAgICBfX29zIDw8IF9faW50LnNpemUoKSAtIDE7CisKKyAgICAgIGZvciAoYXV0byBfX3hpdCA9IF9faW50LmJlZ2luKCk7IF9feGl0ICE9IF9faW50LmVuZCgpOyArK19feGl0KQorCV9fb3MgPDwgX19zcGFjZSA8PCAqX194aXQ7CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19kZW4gPSBfX3guZGVuc2l0aWVzKCk7CisgICAgICBmb3IgKGF1dG8gX19kaXQgPSBfX2Rlbi5iZWdpbigpOyBfX2RpdCAhPSBfX2Rlbi5lbmQoKTsgKytfX2RpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9fZGl0OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcGllY2V3aXNlX2NvbnN0YW50X2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBzaXplX3QgX19uOworICAgICAgX19pcyA+PiBfX247CisKKyAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX19pbnRfdmVjOworICAgICAgX19pbnRfdmVjLnJlc2VydmUoX19uICsgMSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPD0gX19uOyArK19faSkKKwl7CisJICBfUmVhbFR5cGUgX19pbnQ7CisJICBfX2lzID4+IF9faW50OworCSAgX19pbnRfdmVjLnB1c2hfYmFjayhfX2ludCk7CisJfQorCisgICAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IF9fZGVuX3ZlYzsKKyAgICAgIF9fZGVuX3ZlYy5yZXNlcnZlKF9fbik7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCXsKKwkgIGRvdWJsZSBfX2RlbjsKKwkgIF9faXMgPj4gX19kZW47CisJICBfX2Rlbl92ZWMucHVzaF9iYWNrKF9fZGVuKTsKKwl9CisKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBwaWVjZXdpc2VfY29uc3RhbnRfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorCSAgcGFyYW1fdHlwZShfX2ludF92ZWMuYmVnaW4oKSwgX19pbnRfdmVjLmVuZCgpLCBfX2Rlbl92ZWMuYmVnaW4oKSkpOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjpwYXJhbV90eXBlOjoKKyAgICBfTV9pbml0aWFsaXplKCkKKyAgICB7CisgICAgICBpZiAoX01faW50LnNpemUoKSA8IDIKKwkgIHx8IChfTV9pbnQuc2l6ZSgpID09IDIKKwkgICAgICAmJiBfTV9pbnRbMF0gPT0gX1JlYWxUeXBlKDApCisJICAgICAgJiYgX01faW50WzFdID09IF9SZWFsVHlwZSgxKQorCSAgICAgICYmIF9NX2RlblswXSA9PSBfTV9kZW5bMV0pKQorCXsKKwkgIF9NX2ludC5jbGVhcigpOworCSAgX01fZGVuLmNsZWFyKCk7CisJICByZXR1cm47CisJfQorCisgICAgICBkb3VibGUgX19zdW0gPSAwLjA7CisgICAgICBfTV9jcC5yZXNlcnZlKF9NX2ludC5zaXplKCkgLSAxKTsKKyAgICAgIF9NX20ucmVzZXJ2ZShfTV9pbnQuc2l6ZSgpIC0gMSk7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfTV9pbnQuc2l6ZSgpIC0gMTsgKytfX2spCisJeworCSAgY29uc3QgX1JlYWxUeXBlIF9fZGVsdGEgPSBfTV9pbnRbX19rICsgMV0gLSBfTV9pbnRbX19rXTsKKwkgIF9fc3VtICs9IDAuNSAqIChfTV9kZW5bX19rICsgMV0gKyBfTV9kZW5bX19rXSkgKiBfX2RlbHRhOworCSAgX01fY3AucHVzaF9iYWNrKF9fc3VtKTsKKwkgIF9NX20ucHVzaF9iYWNrKChfTV9kZW5bX19rICsgMV0gLSBfTV9kZW5bX19rXSkgLyBfX2RlbHRhKTsKKwl9CisKKyAgICAgIC8vICBOb3cgbm9ybWFsaXplIHRoZSBkZW5zaXRpZXMuLi4KKyAgICAgIF9fZGV0YWlsOjpfX3RyYW5zZm9ybShfTV9kZW4uYmVnaW4oKSwgX01fZGVuLmVuZCgpLCBfTV9kZW4uYmVnaW4oKSwKKwkJCSAgc3RkOjpiaW5kMm5kKHN0ZDo6ZGl2aWRlczxkb3VibGU+KCksIF9fc3VtKSk7CisgICAgICAvLyAgLi4uIGFuZCBwYXJ0aWFsIHN1bXMuLi4gCisgICAgICBfX2RldGFpbDo6X190cmFuc2Zvcm0oX01fY3AuYmVnaW4oKSwgX01fY3AuZW5kKCksIF9NX2NwLmJlZ2luKCksCisJCQkgICAgc3RkOjpiaW5kMm5kKHN0ZDo6ZGl2aWRlczxkb3VibGU+KCksIF9fc3VtKSk7CisgICAgICAvLyAgLi4uIGFuZCBzbG9wZXMuCisgICAgICBfX2RldGFpbDo6X190cmFuc2Zvcm0oX01fbS5iZWdpbigpLCBfTV9tLmVuZCgpLCBfTV9tLmJlZ2luKCksCisJCQkgICAgc3RkOjpiaW5kMm5kKHN0ZDo6ZGl2aWRlczxkb3VibGU+KCksIF9fc3VtKSk7CisgICAgICAvLyAgTWFrZSBzdXJlIHRoZSBsYXN0IGN1bXVsYXRpdmUgcHJvYmFibGlsaXR5IGlzIG9uZS4KKyAgICAgIF9NX2NwW19NX2NwLnNpemUoKSAtIDFdID0gMS4wOworICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yQiwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3JXPgorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKF9JbnB1dEl0ZXJhdG9yQiBfX2JiZWdpbiwKKwkJIF9JbnB1dEl0ZXJhdG9yQiBfX2JlbmQsCisJCSBfSW5wdXRJdGVyYXRvclcgX193YmVnaW4pCisgICAgICA6IF9NX2ludCgpLCBfTV9kZW4oKSwgX01fY3AoKSwgX01fbSgpCisgICAgICB7CisJZm9yICg7IF9fYmJlZ2luICE9IF9fYmVuZDsgKytfX2JiZWdpbiwgKytfX3diZWdpbikKKwkgIHsKKwkgICAgX01faW50LnB1c2hfYmFjaygqX19iYmVnaW4pOworCSAgICBfTV9kZW4ucHVzaF9iYWNrKCpfX3diZWdpbik7CisJICB9CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKGluaXRpYWxpemVyX2xpc3Q8X1JlYWxUeXBlPiBfX2JsLCBfRnVuYyBfX2Z3KQorICAgICAgOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCksIF9NX20oKQorICAgICAgeworCV9NX2ludC5yZXNlcnZlKF9fYmwuc2l6ZSgpKTsKKwlfTV9kZW4ucmVzZXJ2ZShfX2JsLnNpemUoKSk7CisJZm9yIChhdXRvIF9fYml0ZXIgPSBfX2JsLmJlZ2luKCk7IF9fYml0ZXIgIT0gX19ibC5lbmQoKTsgKytfX2JpdGVyKQorCSAgeworCSAgICBfTV9pbnQucHVzaF9iYWNrKCpfX2JpdGVyKTsKKwkgICAgX01fZGVuLnB1c2hfYmFjayhfX2Z3KCpfX2JpdGVyKSk7CisJICB9CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jPgorICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cGFyYW1fdHlwZTo6CisgICAgICBwYXJhbV90eXBlKHNpemVfdCBfX253LCBfUmVhbFR5cGUgX194bWluLCBfUmVhbFR5cGUgX194bWF4LCBfRnVuYyBfX2Z3KQorICAgICAgOiBfTV9pbnQoKSwgX01fZGVuKCksIF9NX2NwKCksIF9NX20oKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX24gPSBfX253ID09IDAgPyAxIDogX19udzsKKwljb25zdCBfUmVhbFR5cGUgX19kZWx0YSA9IChfX3htYXggLSBfX3htaW4pIC8gX19uOworCisJX01faW50LnJlc2VydmUoX19uICsgMSk7CisJX01fZGVuLnJlc2VydmUoX19uICsgMSk7CisJZm9yIChzaXplX3QgX19rID0gMDsgX19rIDw9IF9fbnc7ICsrX19rKQorCSAgeworCSAgICBfTV9pbnQucHVzaF9iYWNrKF9feG1pbiArIF9fayAqIF9fZGVsdGEpOworCSAgICBfTV9kZW4ucHVzaF9iYWNrKF9fZncoX01faW50W19fa10gKyBfX2RlbHRhKSk7CisJICB9CisKKwlfTV9pbml0aWFsaXplKCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgdHlwZW5hbWUgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIHBpZWNld2lzZV9saW5lYXJfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCQkgY29uc3QgcGFyYW1fdHlwZSYgX19wYXJhbSkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0FkYXB0b3I8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGRvdWJsZT4KKwkgIF9fYXVybmcoX191cm5nKTsKKworCWNvbnN0IGRvdWJsZSBfX3AgPSBfX2F1cm5nKCk7CisJaWYgKF9fcGFyYW0uX01fY3AuZW1wdHkoKSkKKwkgIHJldHVybiBfX3A7CisKKwlhdXRvIF9fcG9zID0gc3RkOjpsb3dlcl9ib3VuZChfX3BhcmFtLl9NX2NwLmJlZ2luKCksCisJCQkJICAgICAgX19wYXJhbS5fTV9jcC5lbmQoKSwgX19wKTsKKwljb25zdCBzaXplX3QgX19pID0gX19wb3MgLSBfX3BhcmFtLl9NX2NwLmJlZ2luKCk7CisKKwljb25zdCBkb3VibGUgX19wcmVmID0gX19pID4gMCA/IF9fcGFyYW0uX01fY3BbX19pIC0gMV0gOiAwLjA7CisKKwljb25zdCBkb3VibGUgX19hID0gMC41ICogX19wYXJhbS5fTV9tW19faV07CisJY29uc3QgZG91YmxlIF9fYiA9IF9fcGFyYW0uX01fZGVuW19faV07CisJY29uc3QgZG91YmxlIF9fY20gPSBfX3AgLSBfX3ByZWY7CisKKwlfUmVhbFR5cGUgX194ID0gX19wYXJhbS5fTV9pbnRbX19pXTsKKwlpZiAoX19hID09IDApCisJICBfX3ggKz0gX19jbSAvIF9fYjsKKwllbHNlCisJICB7CisJICAgIGNvbnN0IGRvdWJsZSBfX2QgPSBfX2IgKiBfX2IgKyA0LjAgKiBfX2EgKiBfX2NtOworCSAgICBfX3ggKz0gMC41ICogKHN0ZDo6c3FydChfX2QpIC0gX19iKSAvIF9fYTsKKyAgICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9feDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46Om1heF9kaWdpdHMxMCk7CisKKyAgICAgIHN0ZDo6dmVjdG9yPF9SZWFsVHlwZT4gX19pbnQgPSBfX3guaW50ZXJ2YWxzKCk7CisgICAgICBfX29zIDw8IF9faW50LnNpemUoKSAtIDE7CisKKyAgICAgIGZvciAoYXV0byBfX3hpdCA9IF9faW50LmJlZ2luKCk7IF9feGl0ICE9IF9faW50LmVuZCgpOyArK19feGl0KQorCV9fb3MgPDwgX19zcGFjZSA8PCAqX194aXQ7CisKKyAgICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gX19kZW4gPSBfX3guZGVuc2l0aWVzKCk7CisgICAgICBmb3IgKGF1dG8gX19kaXQgPSBfX2Rlbi5iZWdpbigpOyBfX2RpdCAhPSBfX2Rlbi5lbmQoKTsgKytfX2RpdCkKKwlfX29zIDw8IF9fc3BhY2UgPDwgKl9fZGl0OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcGllY2V3aXNlX2xpbmVhcl9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgc2l6ZV90IF9fbjsKKyAgICAgIF9faXMgPj4gX19uOworCisgICAgICBzdGQ6OnZlY3RvcjxfUmVhbFR5cGU+IF9faW50X3ZlYzsKKyAgICAgIF9faW50X3ZlYy5yZXNlcnZlKF9fbiArIDEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDw9IF9fbjsgKytfX2kpCisJeworCSAgX1JlYWxUeXBlIF9faW50OworCSAgX19pcyA+PiBfX2ludDsKKwkgIF9faW50X3ZlYy5wdXNoX2JhY2soX19pbnQpOworCX0KKworICAgICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBfX2Rlbl92ZWM7CisgICAgICBfX2Rlbl92ZWMucmVzZXJ2ZShfX24gKyAxKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8PSBfX247ICsrX19pKQorCXsKKwkgIGRvdWJsZSBfX2RlbjsKKwkgIF9faXMgPj4gX19kZW47CisJICBfX2Rlbl92ZWMucHVzaF9iYWNrKF9fZGVuKTsKKwl9CisKKyAgICAgIF9feC5wYXJhbSh0eXBlbmFtZSBwaWVjZXdpc2VfbGluZWFyX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKwkgIHBhcmFtX3R5cGUoX19pbnRfdmVjLmJlZ2luKCksIF9faW50X3ZlYy5lbmQoKSwgX19kZW5fdmVjLmJlZ2luKCkpKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlPgorICAgIHNlZWRfc2VxOjpzZWVkX3NlcShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0ludFR5cGU+IF9faWwpCisgICAgeworICAgICAgZm9yIChhdXRvIF9faXRlciA9IF9faWwuYmVnaW4oKTsgX19pdGVyICE9IF9faWwuZW5kKCk7ICsrX19pdGVyKQorCV9NX3YucHVzaF9iYWNrKF9fZGV0YWlsOjpfX21vZDxyZXN1bHRfdHlwZSwKKwkJICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIDMyPjo6X192YWx1ZT4oKl9faXRlcikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBzZWVkX3NlcTo6c2VlZF9zZXEoX0lucHV0SXRlcmF0b3IgX19iZWdpbiwgX0lucHV0SXRlcmF0b3IgX19lbmQpCisgICAgeworICAgICAgZm9yIChfSW5wdXRJdGVyYXRvciBfX2l0ZXIgPSBfX2JlZ2luOyBfX2l0ZXIgIT0gX19lbmQ7ICsrX19pdGVyKQorCV9NX3YucHVzaF9iYWNrKF9fZGV0YWlsOjpfX21vZDxyZXN1bHRfdHlwZSwKKwkJICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIDMyPjo6X192YWx1ZT4oKl9faXRlcikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIHNlZWRfc2VxOjpnZW5lcmF0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19iZWdpbiwKKwkJICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2VuZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAgICAgIF9UeXBlOworCisgICAgICBpZiAoX19iZWdpbiA9PSBfX2VuZCkKKwlyZXR1cm47CisKKyAgICAgIHN0ZDo6ZmlsbChfX2JlZ2luLCBfX2VuZCwgX1R5cGUoMHg4YjhiOGI4YnUpKTsKKworICAgICAgY29uc3Qgc2l6ZV90IF9fbiA9IF9fZW5kIC0gX19iZWdpbjsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3MgPSBfTV92LnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3QgPSAoX19uID49IDYyMykgPyAxMQorCQkgICAgICAgOiAoX19uID49ICA2OCkgPyA3CisJCSAgICAgICA6IChfX24gPj0gIDM5KSA/IDUKKwkJICAgICAgIDogKF9fbiA+PSAgIDcpID8gMworCQkgICAgICAgOiAoX19uIC0gMSkgLyAyOworICAgICAgY29uc3Qgc2l6ZV90IF9fcCA9IChfX24gLSBfX3QpIC8gMjsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3EgPSBfX3AgKyBfX3Q7CisgICAgICBjb25zdCBzaXplX3QgX19tID0gc3RkOjptYXgoX19zICsgMSwgX19uKTsKKworICAgICAgZm9yIChzaXplX3QgX19rID0gMDsgX19rIDwgX19tOyArK19faykKKwl7CisJICBfVHlwZSBfX2FyZyA9IChfX2JlZ2luW19fayAlIF9fbl0KKwkJCSBeIF9fYmVnaW5bKF9fayArIF9fcCkgJSBfX25dCisJCQkgXiBfX2JlZ2luWyhfX2sgLSAxKSAlIF9fbl0pOworCSAgX1R5cGUgX19yMSA9IF9fYXJnIF4gKF9fYXJnID4+IDI3KTsKKwkgIF9fcjEgPSBfX2RldGFpbDo6X19tb2Q8X1R5cGUsIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMTY2NDUyNXUsIDB1PihfX3IxKTsKKwkgIF9UeXBlIF9fcjIgPSBfX3IxOworCSAgaWYgKF9fayA9PSAwKQorCSAgICBfX3IyICs9IF9fczsKKwkgIGVsc2UgaWYgKF9fayA8PSBfX3MpCisJICAgIF9fcjIgKz0gX19rICUgX19uICsgX01fdltfX2sgLSAxXTsKKwkgIGVsc2UKKwkgICAgX19yMiArPSBfX2sgJSBfX247CisJICBfX3IyID0gX19kZXRhaWw6Ol9fbW9kPF9UeXBlLAorCSAgICAgICAgICAgX19kZXRhaWw6Ol9TaGlmdDxfVHlwZSwgMzI+OjpfX3ZhbHVlPihfX3IyKTsKKwkgIF9fYmVnaW5bKF9fayArIF9fcCkgJSBfX25dICs9IF9fcjE7CisJICBfX2JlZ2luWyhfX2sgKyBfX3EpICUgX19uXSArPSBfX3IyOworCSAgX19iZWdpbltfX2sgJSBfX25dID0gX19yMjsKKwl9CisKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IF9fbTsgX19rIDwgX19tICsgX19uOyArK19faykKKwl7CisJICBfVHlwZSBfX2FyZyA9IChfX2JlZ2luW19fayAlIF9fbl0KKwkJCSArIF9fYmVnaW5bKF9fayArIF9fcCkgJSBfX25dCisJCQkgKyBfX2JlZ2luWyhfX2sgLSAxKSAlIF9fbl0pOworCSAgX1R5cGUgX19yMyA9IF9fYXJnIF4gKF9fYXJnID4+IDI3KTsKKwkgIF9fcjMgPSBfX2RldGFpbDo6X19tb2Q8X1R5cGUsIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgMTU2NjA4Mzk0MXUsIDB1PihfX3IzKTsKKwkgIF9UeXBlIF9fcjQgPSBfX3IzIC0gX19rICUgX19uOworCSAgX19yNCA9IF9fZGV0YWlsOjpfX21vZDxfVHlwZSwKKwkgICAgICAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1R5cGUsIDMyPjo6X192YWx1ZT4oX19yNCk7CisJICBfX2JlZ2luWyhfX2sgKyBfX3ApICUgX19uXSBePSBfX3IzOworCSAgX19iZWdpblsoX19rICsgX19xKSAlIF9fbl0gXj0gX19yNDsKKwkgIF9fYmVnaW5bX19rICUgX19uXSA9IF9fcjQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHNpemVfdCBfX2JpdHMsCisJICAgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgX1JlYWxUeXBlCisgICAgZ2VuZXJhdGVfY2Fub25pY2FsKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90IF9fYgorCT0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8c2l6ZV90PihzdGQ6Om51bWVyaWNfbGltaXRzPF9SZWFsVHlwZT46OmRpZ2l0cyksCisgICAgICAgICAgICAgICAgICAgX19iaXRzKTsKKyAgICAgIGNvbnN0IGxvbmcgZG91YmxlIF9fciA9IHN0YXRpY19jYXN0PGxvbmcgZG91YmxlPihfX3VybmcubWF4KCkpCisJCQkgICAgLSBzdGF0aWNfY2FzdDxsb25nIGRvdWJsZT4oX191cm5nLm1pbigpKSArIDEuMEw7CisgICAgICBjb25zdCBzaXplX3QgX19sb2cyciA9IHN0ZDo6bG9nKF9fcikgLyBzdGQ6OmxvZygyLjBMKTsKKyAgICAgIHNpemVfdCBfX2sgPSBzdGQ6Om1heDxzaXplX3Q+KDFVTCwgKF9fYiArIF9fbG9nMnIgLSAxVUwpIC8gX19sb2cycik7CisgICAgICBfUmVhbFR5cGUgX19zdW0gPSBfUmVhbFR5cGUoMCk7CisgICAgICBfUmVhbFR5cGUgX190bXAgPSBfUmVhbFR5cGUoMSk7CisgICAgICBmb3IgKDsgX19rICE9IDA7IC0tX19rKQorCXsKKwkgIF9fc3VtICs9IF9SZWFsVHlwZShfX3VybmcoKSAtIF9fdXJuZy5taW4oKSkgKiBfX3RtcDsKKwkgIF9fdG1wICo9IF9fcjsKKwl9CisgICAgICByZXR1cm4gX19zdW0gLyBfX3RtcDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmFuZ2VfYWNjZXNzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmFuZ2VfYWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2Mzc5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yYW5nZV9hY2Nlc3MuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gPHJhbmdlX2FjY2Vzcy5oPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvcmFuZ2VfYWNjZXNzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1JBTkdFX0FDQ0VTU19ICisjZGVmaW5lIF9HTElCQ1hYX1JBTkdFX0FDQ0VTU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgICogICAgICAgICAgdGhlIGNvbnRhaW5lci4KKyAgICogIEBwYXJhbSAgY29udCAgQ29udGFpbmVyLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYXV0bworICAgIGJlZ2luKF9Db250YWluZXImIF9fY29udCkgLT4gZGVjbHR5cGUoX19jb250LmJlZ2luKCkpCisgICAgeyByZXR1cm4gX19jb250LmJlZ2luKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb25zdCBjb250YWluZXIuCisgICAqICBAcGFyYW0gIGNvbnQgIENvbnRhaW5lci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Db250YWluZXI+CisgICAgaW5saW5lIGF1dG8KKyAgICBiZWdpbihjb25zdCBfQ29udGFpbmVyJiBfX2NvbnQpIC0+IGRlY2x0eXBlKF9fY29udC5iZWdpbigpKQorICAgIHsgcmV0dXJuIF9fY29udC5iZWdpbigpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb250YWluZXIuCisgICAqICBAcGFyYW0gIGNvbnQgIENvbnRhaW5lci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Db250YWluZXI+CisgICAgaW5saW5lIGF1dG8KKyAgICBlbmQoX0NvbnRhaW5lciYgX19jb250KSAtPiBkZWNsdHlwZShfX2NvbnQuZW5kKCkpCisgICAgeyByZXR1cm4gX19jb250LmVuZCgpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb25zdCBjb250YWluZXIuCisgICAqICBAcGFyYW0gIGNvbnQgIENvbnRhaW5lci4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Db250YWluZXI+CisgICAgaW5saW5lIGF1dG8KKyAgICBlbmQoY29uc3QgX0NvbnRhaW5lciYgX19jb250KSAtPiBkZWNsdHlwZShfX2NvbnQuZW5kKCkpCisgICAgeyByZXR1cm4gX19jb250LmVuZCgpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkuCisgICAqICBAcGFyYW0gIGFyciAgQXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIHNpemVfdCBfTm0+CisgICAgaW5saW5lIF9UcCoKKyAgICBiZWdpbihfVHAgKCZfX2FycilbX05tXSkKKyAgICB7IHJldHVybiBfX2FycjsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudAorICAgKiAgICAgICAgICBvZiB0aGUgYXJyYXkuCisgICAqICBAcGFyYW0gIGFyciAgQXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIHNpemVfdCBfTm0+CisgICAgaW5saW5lIF9UcCoKKyAgICBlbmQoX1RwICgmX19hcnIpW19ObV0pCisgICAgeyByZXR1cm4gX19hcnIgKyBfTm07IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX1JBTkdFX0FDQ0VTU19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXguaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWEwYzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXguaApAQCAtMCwwICsxLDI1MTcgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBiaXRzL3JlZ2V4LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKy8qKgorICogQGRlZmdyb3VwIHJlZ2V4IFJlZ3VsYXIgRXhwcmVzc2lvbnMKKyAqIEEgZmFjaWxpdHkgZm9yIHBlcmZvcm1pbmcgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2hpbmcuCisgKi8KKyAvL0B7CisKKyAgLy8gWzcuN10gQ2xhc3MgcmVnZXhfdHJhaXRzCisgIC8qKgorICAgKiBAYnJpZWYgRGVzY3JpYmVzIGFzcGVjdHMgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqCisgICAqIEEgcmVndWxhciBleHByZXNzaW9uIHRyYWl0cyBjbGFzcyB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzIG9mIAorICAgKiBzZWN0aW9uIFsyOC43XS4KKyAgICoKKyAgICogVGhlIGNsYXNzICVyZWdleCBpcyBwYXJhbWV0ZXJpemVkIGFyb3VuZCBhIHNldCBvZiByZWxhdGVkIHR5cGVzIGFuZAorICAgKiBmdW5jdGlvbnMgdXNlZCB0byBjb21wbGV0ZSB0aGUgZGVmaW5pdGlvbiBvZiBpdHMgc2VtYW50aWNzLiAgVGhpcyBjbGFzcworICAgKiBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiBzdWNoIGEgdHJhaXRzIGNsYXNzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGU+CisgICAgc3RydWN0IHJlZ2V4X3RyYWl0cworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaF90eXBlICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IHN0cmluZ190eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmxvY2FsZSAgICAgICAgICAgICAgICAgIGxvY2FsZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmN0eXBlX2Jhc2U6Om1hc2sgICAgICAgIGNoYXJfY2xhc3NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0IHRyYWl0cyBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3RyYWl0cygpCisgICAgICB7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2l2ZXMgdGhlIGxlbmd0aCBvZiBhIEMtc3R5bGUgc3RyaW5nIHN0YXJ0aW5nIGF0IEBwIF9fcC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19wIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJldHdlZW4gQHAgKl9fcCBhbmQgdGhlIGZpcnN0CisgICAgICAgKiBkZWZhdWx0LWluaXRpYWxpemVkIHZhbHVlIG9mIHR5cGUgQHAgY2hhcl90eXBlLiAgSW4gb3RoZXIgd29yZHMsIHVzZXMKKyAgICAgICAqIHRoZSBDLXN0cmluZyBhbGdvcml0aG0gZm9yIGRldGVybWluaW5nIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBvZgorICAgICAgICogY2hhcmFjdGVycy4KKyAgICAgICAqLworICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90CisgICAgICBsZW5ndGgoY29uc3QgY2hhcl90eXBlKiBfX3ApCisgICAgICB7IHJldHVybiBzdHJpbmdfdHlwZTo6dHJhaXRzX3R5cGU6Omxlbmd0aChfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFBlcmZvcm1zIHRoZSBpZGVudGl0eSB0cmFuc2xhdGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gYyBBIGNoYXJhY3RlciB0byB0aGUgbG9jYWxlLXNwZWNpZmljIGNoYXJhY3RlciBzZXQuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgYy4KKyAgICAgICAqLworICAgICAgY2hhcl90eXBlCisgICAgICB0cmFuc2xhdGUoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYzsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBUcmFuc2xhdGVzIGEgY2hhcmFjdGVyIGludG8gYSBjYXNlLWluc2Vuc2l0aXZlIGVxdWl2YWxlbnQuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGMgQSBjaGFyYWN0ZXIgdG8gdGhlIGxvY2FsZS1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbG93ZXItY2FzZSBlcXVpdmFsZW50IG9mIGMuCisgICAgICAgKiBAdGhyb3dzIHN0ZDo6YmFkX2Nhc3QgaWYgdGhlIGltYnVlZCBsb2NhbGUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY3R5cGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdHJhbnNsYXRlX25vY2FzZShjaGFyX3R5cGUgX19jKSBjb25zdAorICAgICAgeworCXVzaW5nIHN0ZDo6Y3R5cGU7CisJdXNpbmcgc3RkOjp1c2VfZmFjZXQ7CisJcmV0dXJuIHVzZV9mYWNldDxjdHlwZTxjaGFyX3R5cGU+ID4oX01fbG9jYWxlKS50b2xvd2VyKF9fYyk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBzb3J0IGtleSBmb3IgYSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBSZXR1cm5zIGEgc29ydCBrZXkgZm9yIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgZGVzaWduYXRlZCBieSB0aGUKKyAgICAgICAqIGl0ZXJhdG9yIHJhbmdlIFtGMSwgRjIpIHN1Y2ggdGhhdCBpZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtHMSwgRzIpCisgICAgICAgKiBzb3J0cyBiZWZvcmUgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbSDEsIEgyKSB0aGVuCisgICAgICAgKiB2LnRyYW5zZm9ybShHMSwgRzIpIDwgdi50cmFuc2Zvcm0oSDEsIEgyKS4KKyAgICAgICAqCisgICAgICAgKiBXaGF0IHRoaXMgcmVhbGx5IGRvZXMgaXMgcHJvdmlkZSBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBjb21wYXJlIGEKKyAgICAgICAqIHN0cmluZyB0byBtdWx0aXBsZSBvdGhlciBzdHJpbmdzIGluIGxvY2FsZXMgd2l0aCBmYW5jeSBjb2xsYXRpb24KKyAgICAgICAqIHJ1bGVzIGFuZCBlcXVpdmFsZW5jZSBjbGFzc2VzLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgbG9jYWxlLXNwZWNpZmljIHNvcnQga2V5IGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHJhbmdlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGNvbGxhdGUKKyAgICAgICAqICAgICAgICAgZmFjZXQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgdHJhbnNmb3JtKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdAorICAgICAgICB7CisJICB1c2luZyBzdGQ6OmNvbGxhdGU7CisJICB1c2luZyBzdGQ6OnVzZV9mYWNldDsKKwkgIGNvbnN0IGNvbGxhdGU8X0NoX3R5cGU+JiBfX2ModXNlX2ZhY2V0PAorCQkJCSAgICAgICBjb2xsYXRlPF9DaF90eXBlPiA+KF9NX2xvY2FsZSkpOworCSAgc3RyaW5nX3R5cGUgX19zKF9fZmlyc3QsIF9fbGFzdCk7CisJICByZXR1cm4gX19jLnRyYW5zZm9ybShfX3MuZGF0YSgpLCBfX3MuZGF0YSgpICsgX19zLnNpemUoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgc29ydCBrZXkgZm9yIGEgY2hhcmFjdGVyIHNlcXVlbmNlLCBpbmRlcGVuZGFudCBvZiBjYXNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogRWZmZWN0czogaWYgdHlwZWlkKHVzZV9mYWNldDxjb2xsYXRlPF9DaF90eXBlPiA+KSA9PQorICAgICAgICogdHlwZWlkKGNvbGxhdGVfYnluYW1lPF9DaF90eXBlPikgYW5kIHRoZSBmb3JtIG9mIHRoZSBzb3J0IGtleQorICAgICAgICogcmV0dXJuZWQgYnkgY29sbGF0ZV9ieW5hbWU8X0NoX3R5cGU+Ojp0cmFuc2Zvcm0oZmlyc3QsIGxhc3QpIGlzIGtub3duCisgICAgICAgKiBhbmQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgcHJpbWFyeSBzb3J0IGtleSB0aGVuIHJldHVybnMgdGhhdCBrZXksCisgICAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgdHJhbnNmb3JtX3ByaW1hcnkoX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIHN0cmluZ190eXBlKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvbGxhdGlvbiBlbGVtZW50IGJ5IG5hbWUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY29sbGF0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjb2xsYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICogCisgICAgICAgKiBAcmV0dXJucyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgdGhhdCByZXByZXNlbnRzIHRoZQorICAgICAgICogY29sbGF0aW5nIGVsZW1lbnQgY29uc2lzdGluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkKKyAgICAgICAqIHRoZSBpdGVyYXRvciByYW5nZSBbZmlyc3QsIGxhc3QpLiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZSBpcyBub3QgYSB2YWxpZCBjb2xsYXRpbmcgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICBsb29rdXBfY29sbGF0ZW5hbWUoX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIHN0cmluZ190eXBlKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTWFwcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRvIGEgbmFtZWQgY2hhcmFjdGVyCisgICAgICAgKiAgICAgICAgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBpY2FzZSBpZ25vcmVzIHRoZSBjYXNlIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiBuYW1lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGFuIHVuc3BlY2lmaWVkIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhcmFjdGVyCisgICAgICAgKiBjbGFzc2lmaWNhdGlvbiBuYW1lZCBieSB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkgdGhlCisgICAgICAgKiBpdGVyYXRvciByYW5nZSBbZmlyc3QsIGxhc3QpLiBJZiBAcCBpY2FzZSBpcyB0cnVlLCB0aGUgcmV0dXJuZWQgbWFzaworICAgICAgICogaWRlbnRpZmllcyB0aGUgY2xhc3NpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycworICAgICAgICogdG8gYmUgbWF0Y2hlZCAoZm9yIGV4YW1wbGUsIFtbOmxvd2VyOl1dIGlzIHRoZSBzYW1lIGFzIFtbOmFscGhhOl1dKSwKKyAgICAgICAqIG90aGVyd2lzZSBhIGNhc2UtZGVwZW5kYW50IGNsYXNzaWZpY2F0aW9uIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlCisgICAgICAgKiByZXR1cm5lZCBzaGFsbCBiZSBpbmRlcGVuZGVudCBvZiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZS4gSWYgdGhlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQgdGhlbiByZXR1cm5zIGEgdmFsdWUKKyAgICAgICAqIHRoYXQgY29tcGFyZXMgZXF1YWwgdG8gMC4KKyAgICAgICAqCisgICAgICAgKiBBdCBsZWFzdCB0aGUgZm9sbG93aW5nIG5hbWVzIChvciB0aGVpciB3aWRlLWNoYXJhY3RlciBlcXVpdmFsZW50KSBhcmUKKyAgICAgICAqIHN1cHBvcnRlZC4KKyAgICAgICAqIC0gZAorICAgICAgICogLSB3CisgICAgICAgKiAtIHMKKyAgICAgICAqIC0gYWxudW0KKyAgICAgICAqIC0gYWxwaGEKKyAgICAgICAqIC0gYmxhbmsKKyAgICAgICAqIC0gY250cmwKKyAgICAgICAqIC0gZGlnaXQKKyAgICAgICAqIC0gZ3JhcGgKKyAgICAgICAqIC0gbG93ZXIKKyAgICAgICAqIC0gcHJpbnQKKyAgICAgICAqIC0gcHVuY3QKKyAgICAgICAqIC0gc3BhY2UKKyAgICAgICAqIC0gdXBwZXIKKyAgICAgICAqIC0geGRpZ2l0CisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgY2hhcl9jbGFzc190eXBlCisgICAgICAgIGxvb2t1cF9jbGFzc25hbWUoX0Z3ZF9pdGVyIF9fZmlyc3QsIF9Gd2RfaXRlciBfX2xhc3QsCisJICAgICAgICAgICAgICAgICBib29sIF9faWNhc2UgPSBmYWxzZSkgY29uc3QKKwl7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERldGVybWluZXMgaWYgQHAgYyBpcyBhIG1lbWJlciBvZiBhbiBpZGVudGlmaWVkIGNsYXNzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjIGEgY2hhcmFjdGVyLgorICAgICAgICogQHBhcmFtIGYgYSBjbGFzcyB0eXBlIChhcyByZXR1cm5lZCBmcm9tIGxvb2t1cF9jbGFzc25hbWUpLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBAcCBjIGlzIGEgbWVtYmVyIG9mIHRoZSBjbGFzc2lmaWNhdGlvbgorICAgICAgICogcmVwcmVzZW50ZWQgYnkgQHAgZiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnRzIGEgZGlnaXQgdG8gYW4gaW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjaCAgICBhIGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBkaWdpdC4KKyAgICAgICAqIEBwYXJhbSByYWRpeCB0aGUgcmFkaXggaWYgdGhlIG51bWVyaWMgY29udmVyc2lvbiAobGltaXRlZCB0byA4LCAxMCwKKyAgICAgICAqICAgICAgICAgICAgICBvciAxNikuCisgICAgICAgKiAKKyAgICAgICAqIEByZXR1cm5zIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZGlnaXQgY2ggaW4gYmFzZSByYWRpeCBpZiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBjaCBpcyBhIHZhbGlkIGRpZ2l0IGluIGJhc2UgcmFkaXg7IG90aGVyd2lzZSByZXR1cm5zIC0xLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIHZhbHVlKF9DaF90eXBlIF9fY2gsIGludCBfX3JhZGl4KSBjb25zdDsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW1idWVzIHRoZSByZWdleF90cmFpdHMgb2JqZWN0IHdpdGggYSBjb3B5IG9mIGEgbmV3IGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gbG9jIEEgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgcHJldmlvdXMgbG9jYWxlIGluIHVzZSBieSB0aGUgcmVnZXhfdHJhaXRzCisgICAgICAgKiAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQG5vdGUgQ2FsbGluZyBpbWJ1ZSB3aXRoIGEgZGlmZmVyZW50IGxvY2FsZSB0aGFuIHRoZSBvbmUgY3VycmVudGx5IGluCisgICAgICAgKiAgICAgICB1c2UgaW52YWxpZGF0ZXMgYWxsIGNhY2hlZCBkYXRhIGhlbGQgYnkgKnRoaXMuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fbG9jYWxlLCBfX2xvYyk7CisJcmV0dXJuIF9fbG9jOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29weSBvZiB0aGUgY3VycmVudCBsb2NhbGUgaW4gdXNlIGJ5IHRoZSByZWdleF90cmFpdHMKKyAgICAgICAqIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sb2NhbGU7IH0KKyAgICAgIAorICAgIHByb3RlY3RlZDoKKyAgICAgIGxvY2FsZV90eXBlIF9NX2xvY2FsZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGJvb2wKKyAgICByZWdleF90cmFpdHM8X0NoX3R5cGU+OjoKKyAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3QKKyAgICB7CisgICAgICB1c2luZyBzdGQ6OmN0eXBlOworICAgICAgdXNpbmcgc3RkOjp1c2VfZmFjZXQ7CisgICAgICBjb25zdCBjdHlwZTxfQ2hfdHlwZT4mIF9fY3R5cGUodXNlX2ZhY2V0PAorCQkJCSAgICAgY3R5cGU8X0NoX3R5cGU+ID4oX01fbG9jYWxlKSk7CisgICAgICAKKyAgICAgIGlmIChfX2N0eXBlLmlzKF9fZiwgX19jKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIAorICAgICAgLy8gc3BlY2lhbCBjYXNlIG9mIHVuZGVyc2NvcmUgaW4gW1s6dzpdXQorICAgICAgaWYgKF9fYyA9PSBfX2N0eXBlLndpZGVuKCdfJykpCisJeworCSAgY29uc3QgY2hhciBfX3diW10gPSAidyI7CisJICBjaGFyX2NsYXNzX3R5cGUgX193dCA9IHRoaXMtPmxvb2t1cF9jbGFzc25hbWUoX193YiwKKwkJCQkJCQlfX3diICsgc2l6ZW9mKF9fd2IpKTsKKwkgIGlmIChfX2YgfCBfX3d0KQorCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgCisgICAgICAvLyBzcGVjaWFsIGNhc2Ugb2YgW1s6c3BhY2U6XV0gaW4gW1s6Ymxhbms6XV0KKyAgICAgIGlmIChfX2N0eXBlLmlzKHN0ZDo6Y3R5cGVfYmFzZTo6c3BhY2UsIF9fYykpCisJeworCSAgY29uc3QgY2hhciBfX2JiW10gPSAiYmxhbmsiOworCSAgY2hhcl9jbGFzc190eXBlIF9fYnQgPSB0aGlzLT5sb29rdXBfY2xhc3NuYW1lKF9fYmIsCisJCQkJCQkJX19iYiArIHNpemVvZihfX2JiKSk7CisJICBpZiAoX19mIHwgX19idCkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorICAgICAgCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGludAorICAgIHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT46OgorICAgIHZhbHVlKF9DaF90eXBlIF9fY2gsIGludCBfX3JhZGl4KSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6YmFzaWNfaXN0cmluZ3N0cmVhbTxfQ2hfdHlwZT4gX19pcyhzdHJpbmdfdHlwZSgxLCBfX2NoKSk7CisgICAgICBpbnQgX192OworICAgICAgaWYgKF9fcmFkaXggPT0gOCkKKwlfX2lzID4+IHN0ZDo6b2N0OworICAgICAgZWxzZSBpZiAoX19yYWRpeCA9PSAxNikKKwlfX2lzID4+IHN0ZDo6aGV4OworICAgICAgX19pcyA+PiBfX3Y7CisgICAgICByZXR1cm4gX19pcy5mYWlsKCkgPyAtMSA6IF9fdjsKKyAgICB9CisKKyAgLy8gWzcuOF0gQ2xhc3MgYmFzaWNfcmVnZXgKKyAgLyoqCisgICAqIE9iamVjdHMgb2Ygc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyAgICogY29uc3RydWN0ZWQgZnJvbSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVyIHR5cGUgQHAgX0NoX3R5cGUuCisgICAqCisgICAqIFN0b3JhZ2UgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgYWxsb2NhdGVkIGFuZCBkZWFsbG9jYXRlZCBhcworICAgKiBuZWNlc3NhcnkgYnkgdGhlIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhpcyBjbGFzcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzID0gcmVnZXhfdHJhaXRzPF9DaF90eXBlPiA+CisgICAgY2xhc3MgYmFzaWNfcmVnZXgKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9DaF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9SeF90cmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6c3RyaW5nX3R5cGUgICBzdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZmxhZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6bG9jYWxlX3R5cGUgICBsb2NhbGVfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSBDb25zdGFudHMKKyAgICAgICAqIHN0ZCBbMjguOC4xXSgxKQorICAgICAgICovCisgICAgICAvL0B7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGljYXNlCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjppY2FzZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgbm9zdWJzCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpub3N1YnM7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIG9wdGltaXplCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpvcHRpbWl6ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgY29sbGF0ZQorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Y29sbGF0ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgRUNNQVNjcmlwdAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdDsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6OmJhc2ljOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6ZXh0ZW5kZWQ7CisgICAgICBzdGF0aWMgY29uc3RleHByIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGF3aworICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6YXdrOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBncmVwCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpncmVwOworICAgICAgc3RhdGljIGNvbnN0ZXhwciByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBlZ3JlcAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6ZWdyZXA7CisgICAgICAvL0B9CisKKyAgICAgIC8vIFs3LjguMl0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIHRoYXQgZG9lcyBub3QgbWF0Y2ggYW55CisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KCkKKyAgICAgIDogX01fZmxhZ3MocmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KSwKKyAgICAgICAgX01fYXV0b21hdG9uKF9fcmVnZXg6Ol9fY29tcGlsZTxjb25zdCBfQ2hfdHlwZSosIF9SeF90cmFpdHM+KDAsIDAsCisgICAgICAgICAgICAgICAgICAgICBfTV90cmFpdHMsIF9NX2ZsYWdzKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHNlcXVlbmNlCisgICAgICAgKiBbcCwgcCArIGNoYXJfdHJhaXRzPF9DaF90eXBlPjo6bGVuZ3RoKHApKSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBwIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcKKyAgICAgICAqICAgICAgICAgIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBwIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IF9DaF90eXBlKiBfX3AsCisJCSAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgIDogX01fZmxhZ3MoX19mKSwKKyAgICAgICAgX01fYXV0b21hdG9uKF9fcmVnZXg6Ol9fY29tcGlsZShfX3AsIF9fcCArIF9SeF90cmFpdHM6Omxlbmd0aChfX3ApLAorICAgICAgICAJCQkJX01fdHJhaXRzLCBfTV9mbGFncykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBzZXF1ZW5jZQorICAgICAgICogW3AsIHAgKyBsZW4pIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcCAgIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBsZW4gVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBmICAgRmxhZ3MgaW5kaWNhdGluZyB0aGUgc3ludGF4IHJ1bGVzIGFuZCBvcHRpb25zLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgcCBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IF9DaF90eXBlKiBfX3AsIHN0ZDo6c2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mKQorICAgICAgOiBfTV9mbGFncyhfX2YpLAorICAgICAgICBfTV9hdXRvbWF0b24oX19yZWdleDo6X19jb21waWxlKF9fcCwgX19wICsgX19sZW4sIF9NX3RyYWl0cywgX01fZmxhZ3MpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHktY29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcmhzIEEgQHAgcmVnZXggb2JqZWN0LgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleChjb25zdCBiYXNpY19yZWdleCYgX19yaHMpCisgICAgICA6IF9NX2ZsYWdzKF9fcmhzLl9NX2ZsYWdzKSwgX01fdHJhaXRzKF9fcmhzLl9NX3RyYWl0cyksCisgICAgICAgIF9NX2F1dG9tYXRvbihfX3Jocy5fTV9hdXRvbWF0b24pCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZS1jb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSByaHMgQSBAcCByZWdleCBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IGJhc2ljX3JlZ2V4JiYgX19yaHMpIG5vZXhjZXB0CisgICAgICA6IF9NX2ZsYWdzKF9fcmhzLl9NX2ZsYWdzKSwgX01fdHJhaXRzKF9fcmhzLl9NX3RyYWl0cyksCisgICAgICAgIF9NX2F1dG9tYXRvbihzdGQ6Om1vdmUoX19yaHMuX01fYXV0b21hdG9uKSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHN0cmluZworICAgICAgICogQHAgcyBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIGluIEBwIGYuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBmIEZsYWdzIGluZGljYXRpbmcgdGhlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIHMgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLAorCQkgICAgX0NoX2FsbG9jPiYgX19zLAorCQkgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKwk6IF9NX2ZsYWdzKF9fZiksCisJICBfTV9hdXRvbWF0b24oX19yZWdleDo6X19jb21waWxlKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksCisJICAJCQkJICBfTV90cmFpdHMsIF9NX2ZsYWdzKSkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgcmFuZ2UKKyAgICAgICAqIFtmaXJzdCwgbGFzdCkgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgc3RhcnQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gbGFzdCAgVGhlIGVuZCBvZiBhIHJhbmdlIGNvbnRhaW5pbmcgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBmICAgICBUaGUgZm9ybWF0IGZsYWdzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBbZmlyc3QsIGxhc3QpIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCSAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwKKwkgIF9NX2F1dG9tYXRvbihfX3JlZ2V4OjpfX2NvbXBpbGUoX19maXJzdCwgX19sYXN0LCBfTV90cmFpdHMsIF9NX2ZsYWdzKSkKKyAgICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBsICBUaGUgaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgICAqIEBwYXJhbSBmICBUaGUgZm9ybWF0IGZsYWdzIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBsIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoaW5pdGlhbGl6ZXJfbGlzdDxfQ2hfdHlwZT4gX19sLAorCQkgIGZsYWdfdHlwZSBfX2YgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisgICAgICA6IF9NX2ZsYWdzKF9fZiksCisgICAgICAgIF9NX2F1dG9tYXRvbihfX3JlZ2V4OjpfX2NvbXBpbGUoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwKKyAgICAgICAgCQkJCV9NX3RyYWl0cywgX01fZmxhZ3MpKQorICAgICAgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlc3Ryb3lzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB+YmFzaWNfcmVnZXgoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgb25lIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhbm90aGVyLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19yZWdleCYgX19yaHMpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIE1vdmUtYXNzaWducyBvbmUgcmVndWxhciBleHByZXNzaW9uIHRvIGFub3RoZXIuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgb3BlcmF0b3I9KGJhc2ljX3JlZ2V4JiYgX19yaHMpIG5vZXhjZXB0CisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RkOjptb3ZlKF9fcmhzKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVwbGFjZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBhIG5ldyBvbmUgY29uc3RydWN0ZWQgZnJvbQorICAgICAgICogYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBudWxsLXRlcm1pbmF0ZWQgQy1zdHlsZSBzdHJpbmcKKyAgICAgICAqICAgICAgICBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfQ2hfdHlwZSogX19wKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcCwgZmxhZ3MoKSk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmVwbGFjZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBhIG5ldyBvbmUgY29uc3RydWN0ZWQgZnJvbQorICAgICAgICogYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIEEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZXJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBiYXNpY19yZWdleCYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3R5cGVyYWl0cywgX0FsbG9jYXRvcj4mIF9fcykKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcywgZmxhZ3MoKSk7IH0KKworICAgICAgLy8gWzcuOC4zXSBhc3NpZ24KKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIHRoZSByZWFsIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHJocyBBbm90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIHsKKwliYXNpY19yZWdleCBfX3RtcChfX3Jocyk7CisJdGhpcy0+c3dhcChfX3RtcCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBUaGUgbW92ZS1hc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSByaHMgQW5vdGhlciByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihiYXNpY19yZWdleCYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgeworCWJhc2ljX3JlZ2V4IF9fdG1wKHN0ZDo6bW92ZShfX3JocykpOworCXRoaXMtPnN3YXAoX190bXApOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhCisgICAgICAgKiBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcCAgICAgQSBwb2ludGVyIHRvIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcKKyAgICAgICAqICAgICAgICAgICAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IF9DaF90eXBlKiBfX3AsCisJICAgICBmbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX3ApLCBfX2ZsYWdzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdCBmcm9tIGEKKyAgICAgICAqIEMtc3R5bGUgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcCAgICAgQSBwb2ludGVyIHRvIGEgQy1zdHlsZSBzdHJpbmcgY29udGFpbmluZyBhCisgICAgICAgKiAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKiBAcGFyYW0gbGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gc3RyaW5nLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IF9DaF90eXBlKiBfX3AsIHN0ZDo6c2l6ZV90IF9fbGVuLCBmbGFnX3R5cGUgX19mbGFncykKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihzdHJpbmdfdHlwZShfX3AsIF9fbGVuKSwgX19mbGFncyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhIAorICAgICAgICogc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyAgICAgQSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogKnRoaXMgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBhc3NpZ24oY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHlwZXJhaXRzLCBfQWxsb2NhdG9yPiYgX19zLAorCSAgICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICB7IAorCSAgYmFzaWNfcmVnZXggX190bXAoX19zLCBfX2YpOworCSAgdGhpcy0+c3dhcChfX3RtcCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIHN0YXJ0IG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGxhc3QgIFRoZSBlbmQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIHAgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogcGF0dGVybiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gQHAgZmxhZ3MuICBJZiByZWdleF9lcnJvciBpcyB0aHJvd24sCisgICAgICAgKiB0aGUgb2JqZWN0IHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgYmFzaWNfcmVnZXgmCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGZsYWdfdHlwZSBfX2ZsYWdzID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19maXJzdCwgX19sYXN0KSwgX19mbGFncyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGwgICAgIEFuIGluaXRpYWxpemVyIGxpc3QgcmVwcmVzZW50aW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBsIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IKKyAgICAgICAqIGlzIHRocm93biwgdGhlIG9iamVjdCByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDxfQ2hfdHlwZT4gX19sLAorCSAgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2YpOyB9CisKKyAgICAgIC8vIFs3LjguNF0gY29uc3Qgb3BlcmF0aW9ucworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbnVtYmVyIG9mIG1hcmtlZCBzdWJleHByZXNzaW9ucyB3aXRoaW4gdGhlIHJlZ3VsYXIKKyAgICAgICAqIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGludAorICAgICAgbWFya19jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hdXRvbWF0b24tPl9NX3N1Yl9jb3VudCgpIC0gMTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBmbGFncyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBvciBpbiB0aGUgbGFzdCBjYWxsIHRvIGFzc2lnbigpLgorICAgICAgICovCisgICAgICBmbGFnX3R5cGUKKyAgICAgIGZsYWdzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZsYWdzOyB9CisgICAgICAKKyAgICAgIC8vIFs3LjguNV0gbG9jYWxlCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbWJ1ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBsb2MgQSBsb2NhbGUuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsgcmV0dXJuIF9NX3RyYWl0cy5pbWJ1ZShfX2xvYyk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbG9jYWxlIGN1cnJlbnRseSBpbWJ1ZWQgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogICAgICAgIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90cmFpdHMuZ2V0bG9jKCk7IH0KKyAgICAgIAorICAgICAgLy8gWzcuOC42XSBzd2FwCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSByaHMgQW5vdGhlciByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZmxhZ3MsICAgICBfX3Jocy5fTV9mbGFncyk7CisJc3RkOjpzd2FwKF9NX3RyYWl0cywgICAgX19yaHMuX01fdHJhaXRzKTsKKwlzdGQ6OnN3YXAoX01fYXV0b21hdG9uLCBfX3Jocy5fTV9hdXRvbWF0b24pOworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0cikKKyAgICAgIHsgX01fYXV0b21hdG9uLT5fTV9kb3QoX19vc3RyKTsgfQorI2VuZGlmCisgICAgICAKKyAgICAgIGNvbnN0IF9fcmVnZXg6Ol9BdXRvbWF0b25QdHImCisgICAgICBfTV9nZXRfYXV0b21hdG9uKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2F1dG9tYXRvbjsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgZmxhZ190eXBlICAgICAgICAgICAgICBfTV9mbGFnczsKKyAgICAgIF9SeF90cmFpdHMgICAgICAgICAgICAgX01fdHJhaXRzOworICAgICAgX19yZWdleDo6X0F1dG9tYXRvblB0ciBfTV9hdXRvbWF0b247CisgICAgfTsKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9ucy4gKi8KKyAgdHlwZWRlZiBiYXNpY19yZWdleDxjaGFyPiAgICByZWdleDsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFN0YW5kYXJkIHdpZGUtY2hhcmFjdGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICovCisgIHR5cGVkZWYgYmFzaWNfcmVnZXg8d2NoYXJfdD4gd3JlZ2V4OworI2VuZGlmCisKKworICAvLyBbNy44LjZdIGJhc2ljX3JlZ2V4IHN3YXAKKyAgLyoqCisgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19saHMsCisJIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisKKyAgLy8gWzcuOV0gQ2xhc3MgdGVtcGxhdGUgc3ViX21hdGNoCisgIC8qKgorICAgKiBBIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSBhIHBhcnRpY3VsYXIgbWFya2VkIHN1Yi1leHByZXNzaW9uLgorICAgKgorICAgKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBlc3NlbnRpYWxseSBhIHBhaXIgb2YgaXRlcmF0b3JzIG1hcmtpbmcgYQorICAgKiBtYXRjaGVkIHN1YmV4cHJlc3Npb24gd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2guIFN1Y2gKKyAgICogb2JqZWN0cyBjYW4gYmUgY29udmVydGVkIHRvIGFuZCBjb21wYXJlZCB3aXRoIHN0ZDo6YmFzaWNfc3RyaW5nIG9iamVjdHMKKyAgICogb2YgYSBzaW1pbGFyIGJhc2UgY2hhcmFjdGVyIHR5cGUgYXMgdGhlIHBhdHRlcm4gbWF0Y2hlZCBieSB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uLgorICAgKgorICAgKiBUaGUgaXRlcmF0b3JzIHRoYXQgbWFrZSB1cCB0aGUgcGFpciBhcmUgdGhlIHVzdWFsIGhhbGYtb3BlbiBpbnRlcnZhbAorICAgKiByZWZlcmVuY2luZyB0aGUgYWN0dWFsIG9yaWdpbmFsIHBhdHRlcm4gbWF0Y2hlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgY2xhc3Mgc3ViX21hdGNoIDogcHVibGljIHN0ZDo6cGFpcjxfQmlJdGVyLCBfQmlJdGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaUl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPHZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICBib29sIG1hdGNoZWQ7CisgICAgICAKKyAgICAgIGNvbnN0ZXhwciBzdWJfbWF0Y2goKSA6IG1hdGNoZWQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoaW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIGxlbmd0aCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5tYXRjaGVkID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5maXJzdCwgdGhpcy0+c2Vjb25kKSA6IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIFRoaXMgaXMgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gb3BlcmF0b3IuICBJdCBpcyBpZGVudGljYWwgdG8gdGhlCisgICAgICAgKiBzdHIoKSBtZW1iZXIgZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgd2lsbCB3YW50IHRvIHBvcCB1cCBpbgorICAgICAgICogdW5leHBlY3RlZCBwbGFjZXMgYW5kIGNhdXNlIGEgZ3JlYXQgZGVhbCBvZiBjb25mdXNpb24gYW5kIGN1cnNpbmcKKyAgICAgICAqIGZyb20gdGhlIHVud2FyeS4KKyAgICAgICAqLworICAgICAgb3BlcmF0b3Igc3RyaW5nX3R5cGUoKSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5tYXRjaGVkCisJICA/IHN0cmluZ190eXBlKHRoaXMtPmZpcnN0LCB0aGlzLT5zZWNvbmQpCisJICA6IHN0cmluZ190eXBlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPm1hdGNoZWQKKwkgID8gc3RyaW5nX3R5cGUodGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkKKwkgIDogc3RyaW5nX3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBhbmQgYW5vdGhlciBtYXRjaGVkIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBzIEFub3RoZXIgbWF0Y2hlZCBzZXF1ZW5jZSB0byBjb21wYXJlIHRvIHRoaXMgb25lLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPTAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBzLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3Qgc3ViX21hdGNoJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcy5zdHIoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBzdWJfbWF0Y2ggdG8gYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQSBzdHJpbmcgdG8gY29tcGFyZSB0byB0aGlzIHN1Yl9tYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYmVmb3JlIEBwIHMuCisgICAgICAgKiBAcmV0dmFsID0wIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIEBwIHMuCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYWZ0ZXIgQHAgcy4KKyAgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IHN0cmluZ190eXBlJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcyk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBzdWJfbWF0Y2ggdG8gYSBDLXN0eWxlIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyBBIEMtc3R5bGUgc3RyaW5nIHRvIGNvbXBhcmUgdG8gdGhpcyBzdWJfbWF0Y2guCisgICAgICAgKgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGJlZm9yZSBAcCBzLgorICAgICAgICogQHJldHZhbCA9MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2UgaXMgZXF1aXZhbGVudCB0byBAcCBzLgorICAgICAgICogQHJldHZhbCA8MCB0aGlzIG1hdGNoZWQgc2VxdWVuY2Ugd2lsbCBjb2xsYXRlIGFmdGVyIEBwIHMuCisgICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCB2YWx1ZV90eXBlKiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcyk7IH0KKyAgICB9OworICAKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVnZXggc3VibWF0Y2ggb3ZlciBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNzdWJfbWF0Y2g7CisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVnZXggc3VibWF0Y2ggb3ZlciBhIHN0YW5kYXJkIHN0cmluZy4gKi8KKyAgdHlwZWRlZiBzdWJfbWF0Y2g8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNzdWJfbWF0Y2g7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLyoqIEBicmllZiBSZWdleCBzdWJtYXRjaCBvdmVyIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3N1Yl9tYXRjaDsKKyAgLyoqIEBicmllZiBSZWdleCBzdWJtYXRjaCBvdmVyIGEgc3RhbmRhcmQgd2lkZSBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3N1Yl9tYXRjaDsKKyNlbmRpZgorCisgIC8vIFs3LjkuMl0gc3ViX21hdGNoIG5vbi1tZW1iZXIgb3BlcmF0b3JzCisgIAorICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgIT0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIHR3byByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2hlcy4KKyAgICogQHBhcmFtIGxocyBGaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgU2Vjb25kIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpIDw9IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID49IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzLmNfc3RyKCkpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzLmNfc3RyKCkpID4gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgc3VjY2VlZHMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLCAKKwkgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3QgcHJlY2VkZSBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMuY19zdHIoKSkgPT0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMuY19zdHIoKSkgPCAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQ2hfdHJhaXRzLCBjbGFzcyBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3QgcHJlY2VkZSBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCBjbGFzcyBfQ2hfdHJhaXRzLCBjbGFzcyBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSBDIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgQyBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA9PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhbiBpdGVyYXRvciB2YWx1ZSBhbmQgYSByZWd1bGFyCisgICAqICAgICAgICBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMuY29tcGFyZShfX2xocykgPiAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgcG9pbnRlciB0byBhIHN0cmluZz8KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID09IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7CisgICAgICByZXR1cm4gX19yaHMuY29tcGFyZSh0eXBlbmFtZSBzdWJfbWF0Y2g8X0JpX2l0ZXI+OjpzdHJpbmdfdHlwZSgxLCBfX2xocykpCisgICAgICAgICAgICAgPT0gMDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgaW5lcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwodHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeworICAgICAgcmV0dXJuIF9fcmhzLmNvbXBhcmUodHlwZW5hbWUgc3ViX21hdGNoPF9CaV9pdGVyPjo6c3RyaW5nX3R5cGUoMSwgX19saHMpKQorICAgICAgICAgICAgID4gMDsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19yaHMgPCBfX2xocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYQorICAgKiAgICAgICAgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsKKyAgICAgIHJldHVybiBfX2xocy5jb21wYXJlKHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlfaXRlcj46OnN0cmluZ190eXBlKDEsIF9fcmhzKSkKKyAgICAgICAgICAgICA9PSAwOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsKKyAgICAgIHJldHVybiBfX2xocy5jb21wYXJlKHR5cGVuYW1lIHN1Yl9tYXRjaDxfQmlfaXRlcj46OnN0cmluZ190eXBlKDEsIF9fcmhzKSkKKyAgICAgICAgICAgICA8IDA7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19yaHMgPCBfX2xoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBjb25zdCBzdHJpbmcgcmVmZXJlbmNlLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBJbnNlcnRzIGEgbWF0Y2hlZCBzdHJpbmcgaW50byBhbiBvdXRwdXQgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW0gb3MgVGhlIG91dHB1dCBzdHJlYW0uCisgICAqIEBwYXJhbSBtICBBIHN1Ym1hdGNoIHN0cmluZy4KKyAgICoKKyAgICogQHJldHVybnMgdGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3VibWF0Y2ggc3RyaW5nIGluc2VydGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZQorICAgIGJhc2ljX29zdHJlYW08X0NoX3R5cGUsIF9DaF90cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hfdHlwZSwgX0NoX3RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbSkKKyAgICB7IHJldHVybiBfX29zIDw8IF9fbS5zdHIoKTsgfQorCisgIC8vIFs3LjEwXSBDbGFzcyB0ZW1wbGF0ZSBtYXRjaF9yZXN1bHRzCisKKyAgLyoKKyAgICogU3BlY2lhbCBzdWJfbWF0Y2ggb2JqZWN0IHJlcHJlc2VudGluZyBhbiB1bm1hdGNoZWQgc3ViLWV4cHJlc3Npb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYKKyAgICBfX3VubWF0Y2hlZF9zdWIoKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+IF9fdW5tYXRjaGVkID0gc3ViX21hdGNoPF9CaV9pdGVyPigpOworICAgICAgcmV0dXJuIF9fdW5tYXRjaGVkOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFRoZSByZXN1bHRzIG9mIGEgbWF0Y2ggb3Igc2VhcmNoIG9wZXJhdGlvbi4KKyAgICoKKyAgICogQSBjb2xsZWN0aW9uIG9mIGNoYXJhY3RlciBzZXF1ZW5jZXMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgb2YgYSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gbWF0Y2guICBTdG9yYWdlIGZvciB0aGUgY29sbGVjdGlvbiBpcyBhbGxvY2F0ZWQgYW5kIGZyZWVkIGFzCisgICAqIG5lY2Vzc2FyeSBieSB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZSBtYXRjaF9yZXN1bHRzLgorICAgKgorICAgKiBUaGlzIGNsYXNzIHNhdGlzZmllcyB0aGUgU2VxdWVuY2UgcmVxdWlyZW1lbnRzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAorICAgKiBvbmx5IHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIGEgY29uc3QtcXVhbGlmaWVkIFNlcXVlbmNlIGFyZSBzdXBwb3J0ZWQuCisgICAqCisgICAqIFRoZSBzdWJfbWF0Y2ggb2JqZWN0IHN0b3JlZCBhdCBpbmRleCAwIHJlcHJlc2VudHMgc3ViLWV4cHJlc3Npb24gMCwgaS5lLgorICAgKiB0aGUgd2hvbGUgbWF0Y2guIEluIHRoaXMgY2FzZSB0aGUgJXN1Yl9tYXRjaCBtZW1iZXIgbWF0Y2hlZCBpcyBhbHdheXMgdHJ1ZS4KKyAgICogVGhlIHN1Yl9tYXRjaCBvYmplY3Qgc3RvcmVkIGF0IGluZGV4IG4gZGVub3RlcyB3aGF0IG1hdGNoZWQgdGhlIG1hcmtlZAorICAgKiBzdWItZXhwcmVzc2lvbiBuIHdpdGhpbiB0aGUgbWF0Y2hlZCBleHByZXNzaW9uLiBJZiB0aGUgc3ViLWV4cHJlc3Npb24gbgorICAgKiBwYXJ0aWNpcGF0ZWQgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggdGhlbiB0aGUgJXN1Yl9tYXRjaCBtZW1iZXIKKyAgICogbWF0Y2hlZCBldmFsdWF0ZXMgdG8gdHJ1ZSwgYW5kIG1lbWJlcnMgZmlyc3QgYW5kIHNlY29uZCBkZW5vdGUgdGhlIHJhbmdlCisgICAqIG9mIGNoYXJhY3RlcnMgW2ZpcnN0LCBzZWNvbmQpIHdoaWNoIGZvcm1lZCB0aGF0IG1hdGNoLiBPdGhlcndpc2UgbWF0Y2hlZAorICAgKiBpcyBmYWxzZSwgYW5kIG1lbWJlcnMgZmlyc3QgYW5kIHNlY29uZCBwb2ludCB0byB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZQorICAgKiB0aGF0IHdhcyBzZWFyY2hlZC4KKyAgICoKKyAgICogQG5vc3ViZ3JvdXBpbmcKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBhbGxvY2F0b3I8c3ViX21hdGNoPF9CaV9pdGVyPiA+ID4KKyAgICBjbGFzcyBtYXRjaF9yZXN1bHRzCisgICAgOiBwcml2YXRlIHN0ZDo6dmVjdG9yPHN1Yl9tYXRjaDxfQmlfaXRlcj4sIF9BbGxvY2F0b3I+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICAvKgorICAgICAgICogVGhlIHZlY3RvciBiYXNlIGlzIGVtcHR5IGlmIHRoaXMgZG9lcyBub3QgcmVwcmVzZW50IGEgc3VjY2Vzc2Z1bCBtYXRjaC4KKyAgICAgICAqIE90aGVyd2lzZSBpdCBjb250YWlucyBuKzMgZWxlbWVudHMgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIG1hcmtlZAorICAgICAgICogc3ViLWV4cHJlc3Npb25zOgorICAgICAgICogWzBdIGVudGlyZSBtYXRjaAorICAgICAgICogWzFdIDFzdCBtYXJrZWQgc3ViZXhwcmVzc2lvbgorICAgICAgICogLi4uCisgICAgICAgKiBbbl0gbnRoIG1hcmtlZCBzdWJleHByZXNzaW9uCisgICAgICAgKiBbbisxXSBwcmVmaXgKKyAgICAgICAqIFtuKzJdIHN1ZmZpeAorICAgICAgICovCisgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN1Yl9tYXRjaDxfQmlfaXRlcj4sIF9BbGxvY2F0b3I+ICAgIF9CYXNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLj8gUHVibGljIFR5cGVzCisgICAgICAgKi8KKyAgICAgIC8vQHsKKyAgICAgIHR5cGVkZWYgc3ViX21hdGNoPF9CaV9pdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdF9yZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgLyogVE9ETzogbmVlZHMgYWxsb2NhdG9yX3RyYWl0cyAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+ICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZTsKKyAgICAgIC8vQH0KKyAgCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAyOC4xMC4xIENvbnN0cnVjdGlvbiwgQ29weWluZywgYW5kIERlc3RydWN0aW9uCisgICAgICAgKi8KKyAgICAgIC8vQHsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGRlZmF1bHQgJW1hdGNoX3Jlc3VsdHMgY29udGFpbmVyLgorICAgICAgICogQHBvc3Qgc2l6ZSgpIHJldHVybnMgMCBhbmQgc3RyKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtYXRjaF9yZXN1bHRzKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2VfdHlwZShfX2EpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29weSBjb25zdHJ1Y3RzIGEgJW1hdGNoX3Jlc3VsdHMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMoY29uc3QgbWF0Y2hfcmVzdWx0cyYgX19yaHMpCisgICAgICA6IF9CYXNlX3R5cGUoX19yaHMpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTW92ZSBjb25zdHJ1Y3RzIGEgJW1hdGNoX3Jlc3VsdHMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMobWF0Y2hfcmVzdWx0cyYmIF9fcmhzKSBub2V4Y2VwdAorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3JocykpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyByaHMgdG8gKnRoaXMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbWF0Y2hfcmVzdWx0cyYgX19yaHMpCisgICAgICB7CisJbWF0Y2hfcmVzdWx0cyhfX3Jocykuc3dhcCgqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBNb3ZlLWFzc2lnbnMgcmhzIHRvICp0aGlzLgorICAgICAgICovCisgICAgICBtYXRjaF9yZXN1bHRzJgorICAgICAgb3BlcmF0b3I9KG1hdGNoX3Jlc3VsdHMmJiBfX3JocykKKyAgICAgIHsKKwltYXRjaF9yZXN1bHRzKHN0ZDo6bW92ZShfX3JocykpLnN3YXAoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVzdHJveXMgYSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIH5tYXRjaF9yZXN1bHRzKCkKKyAgICAgIHsgfQorICAgICAgCisgICAgICAvL0B9CisKKyAgICAgIC8vIDI4LjEwLjIsIHN0YXRlOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZSAlbWF0Y2hfcmVzdWx0cyBpcyByZWFkeS4KKyAgICAgICAqIEByZXR2YWwgdHJ1ZSAgIFRoZSBvYmplY3QgaGFzIGEgZnVsbHktZXN0YWJsaXNoZWQgcmVzdWx0IHN0YXRlLgorICAgICAgICogQHJldHZhbCBmYWxzZSAgVGhlIG9iamVjdCBpcyBub3QgcmVhZHkuCisgICAgICAgKi8KKyAgICAgIGJvb2wgcmVhZHkoKSBjb25zdCB7IHJldHVybiAhX0Jhc2VfdHlwZTo6ZW1wdHkoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDI4LjEwLjIgU2l6ZQorICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG51bWJlciBvZiBtYXRjaGVzIGFuZCBzdWJtYXRjaGVzLgorICAgICAgICoKKyAgICAgICAqIFRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3IgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBiZSBlaXRoZXIgMAorICAgICAgICogaWYgdGhlcmUgd2FzIG5vIG1hdGNoIG9yIG1hcmtfY291bnQoKSArIDEgaWYgYSBtYXRjaCB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAqIFNvbWUgbWF0Y2hlcyBtYXkgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGVzIGZvdW5kLgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeworICAgICAgCXNpemVfdHlwZSBfX3NpemUgPSBfQmFzZV90eXBlOjpzaXplKCk7CisgICAgICAJcmV0dXJuIChfX3NpemUgJiYgX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXSgwKS5tYXRjaGVkKSA/IF9fc2l6ZSAtIDIgOiAwOworICAgICAgfQorICAgICAgCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6Om1heF9zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZSAlbWF0Y2hfcmVzdWx0cyBjb250YWlucyBubyByZXN1bHRzLgorICAgICAgICogQHJldHZhbCB0cnVlIFRoZSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QgaXMgZW1wdHkuCisgICAgICAgKiBAcmV0dmFsIGZhbHNlIFRoZSAlbWF0Y2hfcmVzdWx0cyBvYmplY3QgaXMgbm90IGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorICAgICAgCisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuMyBFbGVtZW50IEFjY2VzcworICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLgorICAgICAgICogQHBhcmFtIHN1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2gsIG9yIHRoZQorICAgICAgICogbGVuZ3RoIG9mIHRoZSBlbnRpcmUgbWF0Y2ggaWYgQHAgc3ViIGlzIHplcm8gKHRoZSBkZWZhdWx0KS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBsZW5ndGgoc2l6ZV90eXBlIF9fc3ViID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICgqdGhpcylbX19zdWJdLmxlbmd0aCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQKKyAgICAgICAqIHNlcXVlbmNlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1Ym1hdGNoLCB1bmxlc3MgdGhlIHZhbHVlIG9mIEBwIHN1YgorICAgICAgICogaXMgemVybyAodGhlIGRlZmF1bHQpLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2Zmc2V0CisgICAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldCBzZXF1ZW5jZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAgICogbWF0Y2guCisgICAgICAgKgorICAgICAgICogUmV0dXJucyAtMSBpZiBAcCBzdWIgaXMgb3V0IG9mIHJhbmdlLgorICAgICAgICovCisgICAgICBkaWZmZXJlbmNlX3R5cGUKKyAgICAgIHBvc2l0aW9uKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9fc3ViIDwgc2l6ZSgpID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5wcmVmaXgoKS5maXJzdCwKKwkJCQkJICAgICAgKCp0aGlzKVtfX3N1Yl0uZmlyc3QpIDogLTE7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoIG9yIHN1Ym1hdGNoIGNvbnZlcnRlZCB0byBhIHN0cmluZyB0eXBlLgorICAgICAgICogQHBhcmFtIHN1YiBpbmRpY2F0ZXMgdGhlIHN1Ym1hdGNoLgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc3VibWF0Y2ggKG9yIG1hdGNoLCBpZiBAcCBzdWIgaXMgemVybykgZXh0cmFjdGVkCisgICAgICAgKiBmcm9tIHRoZSB0YXJnZXQgcmFuZ2UgYW5kIGNvbnZlcnRlZCB0byB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdHlwZS4KKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIHN0cihzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gKCp0aGlzKVtfX3N1Yl0uc3RyKCk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVmZXJlbmNlIGZvciB0aGUgbWF0Y2ggb3Igc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKiBAcHJlICAgcmVhZHkoKSA9PSB0cnVlCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2gsIG9yIHRoZSBlbnRpcmUKKyAgICAgICAqIG1hdGNoIGlmIEBwIHN1YiBpcyB6ZXJvLgorICAgICAgICoKKyAgICAgICAqIElmIEBwIHN1YiA+PSBzaXplKCkgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSAlc3ViX21hdGNoIHdpdGggYQorICAgICAgICogc3BlY2lhbCB2YWx1ZSBpbmRpY2F0aW5nIG5vIHN1Ym1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fc3ViKSBjb25zdAorICAgICAgeyAKKyAgICAgIAlfR0xJQkNYWF9ERUJVR19BU1NFUlQoIHJlYWR5KCkgKTsKKyAgICAgIAlyZXR1cm4gX19zdWIgPCBzaXplKCkKKwkgICAgICAgPyAgX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfX3N1YikKKwkgICAgICAgOiBfX3VubWF0Y2hlZF9zdWI8X0JpX2l0ZXI+KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSAlc3ViX21hdGNoIHJlcHJlc2VudGluZyB0aGUgbWF0Y2ggcHJlZml4LgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlZmVyZW5jZSB0byBhICVzdWJfbWF0Y2ggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAqIHBhcnQgb2YgdGhlIHRhcmdldCByYW5nZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGFuZCB0aGUKKyAgICAgICAqIHN0YXJ0IG9mIHRoZSBtYXRjaC4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBwcmVmaXgoKSBjb25zdAorICAgICAgeworICAgICAgCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCggcmVhZHkoKSApOworICAgICAgCXJldHVybiAhZW1wdHkoKQorICAgICAgCSAgICAgICA/IF9CYXNlX3R5cGU6Om9wZXJhdG9yW10oX0Jhc2VfdHlwZTo6c2l6ZSgpIC0gMikKKwkgICAgICAgOiBfX3VubWF0Y2hlZF9zdWI8X0JpX2l0ZXI+KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSAlc3ViX21hdGNoIHJlcHJlc2VudGluZyB0aGUgbWF0Y2ggc3VmZml4LgorICAgICAgICogQHByZSAgIHJlYWR5KCkgPT0gdHJ1ZQorICAgICAgICoKKyAgICAgICAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlZmVyZW5jZSB0byBhICVzdWJfbWF0Y2ggb2JqZWN0IHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAqIHBhcnQgb2YgdGhlIHRhcmdldCByYW5nZSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG1hdGNoIGFuZCB0aGUgZW5kIG9mCisgICAgICAgKiB0aGUgdGFyZ2V0IHJhbmdlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHN1ZmZpeCgpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKCByZWFkeSgpICk7CisJcmV0dXJuICFlbXB0eSgpCisJICAgICAgID8gX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfQmFzZV90eXBlOjpzaXplKCkgLSAxKQorCSAgICAgICA6IF9fdW5tYXRjaGVkX3N1YjxfQmlfaXRlcj4oKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlICVzdWJfbWF0Y2ggY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmJlZ2luKCk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlICVzdWJfbWF0Y2ggY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZV90eXBlOjpjYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gIWVtcHR5KCkgPyBfQmFzZV90eXBlOjplbmQoKSAtIDIgOiBfQmFzZV90eXBlOjplbmQoKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGVuZCgpOyB9CisKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC40IEZvcm1hdHRpbmcKKyAgICAgICAqCisgICAgICAgKiBUaGVzZSBmdW5jdGlvbnMgcGVyZm9ybSBmb3JtYXR0ZWQgc3Vic3RpdHV0aW9uIG9mIHRoZSBtYXRjaGVkCisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2VzIGludG8gdGhlaXIgdGFyZ2V0LiAgVGhlIGZvcm1hdCBzcGVjaWZpZXJzIGFuZAorICAgICAgICogZXNjYXBlIHNlcXVlbmNlcyBhY2NlcHRlZCBieSB0aGVzZSBmdW5jdGlvbnMgYXJlIGRldGVybWluZWQgYnkKKyAgICAgICAqIHRoZWlyIEBwIGZsYWdzIHBhcmFtZXRlciBhcyBkb2N1bWVudGVkIGFib3ZlLgorICAgICAgICovCisgICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0X2l0ZXI+CisgICAgICAgIF9PdXRfaXRlcgorICAgICAgICBmb3JtYXQoX091dF9pdGVyIF9fb3V0LCBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2ZpcnN0LAorCSAgICAgICBjb25zdCBjaGFyX3R5cGUqIF9fZm10X2xhc3QsCisJICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkgICAgICAgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgICB7IHJldHVybiBfX291dDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dF9pdGVyLCB0eXBlbmFtZSBfU3QsIHR5cGVuYW1lIF9TYT4KKyAgICAgICAgX091dF9pdGVyCisgICAgICAgIGZvcm1hdChfT3V0X2l0ZXIgX19vdXQsIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TdCwgX1NhPiYgX19mbXQsCisJICAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkgICAgICAgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIGZvcm1hdChfX291dCwgX19mbXQuZGF0YSgpLCBfX2ZtdC5kYXRhKCkgKyBfX2ZtdC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX091dF9pdGVyLCB0eXBlbmFtZSBfU3QsIHR5cGVuYW1lIF9TYT4KKyAgICAgICAgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZSwgX1N0LCBfU2E+CisgICAgICAgIGZvcm1hdChjb25zdCBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCBfU3QsIF9TYT4mIF9fZm10LAorCSAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIGJhc2ljX3N0cmluZzxjaGFyX3R5cGUsIF9TdCwgX1NhPiBfX3Jlc3VsdDsKKyAgICAgICAgICBmb3JtYXQoc3RkOjpiYWNrX2luc2VydGVyKF9fcmVzdWx0KSwgX19mbXQsIF9fZmxhZ3MpOworICAgICAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBwcmUgICByZWFkeSgpID09IHRydWUKKyAgICAgICAqLworICAgICAgc3RyaW5nX3R5cGUKKyAgICAgIGZvcm1hdChjb25zdCBjaGFyX3R5cGUqIF9fZm10LAorCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCSAgICAgPSByZWdleF9jb25zdGFudHM6OmZvcm1hdF9kZWZhdWx0KSBjb25zdAorICAgICAgeworICAgICAgICBzdHJpbmdfdHlwZSBfX3Jlc3VsdDsKKyAgICAgICAgZm9ybWF0KHN0ZDo6YmFja19pbnNlcnRlcihfX3Jlc3VsdCksCisgICAgICAgICAgICAgICBfX2ZtdCArIGNoYXJfdHJhaXRzPGNoYXJfdHlwZT46Omxlbmd0aChfX2ZtdCksCisgICAgICAgICAgICAgICBfX2ZsYWdzKTsKKyAgICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICAvL0B9IAorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjUgQWxsb2NhdG9yCisgICAgICAgKi8KKyAgICAgIC8vQHsgCisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0b3IuCisgICAgICAgKi8KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmdldF9hbGxvY2F0b3IoKTsgfQorICAgICAgCisgICAgICAvL0B9IAorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjYgU3dhcAorICAgICAgICovCisgICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byBtYXRjaF9yZXN1bHRzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hdGNoX3Jlc3VsdHMmIF9fdGhhdCkKKyAgICAgIHsgX0Jhc2VfdHlwZTo6c3dhcChfX3RoYXQpOyB9CisgICAgICAvL0B9IAorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBfX3JlZ2V4OjpfU3BlY2lhbGl6ZWRSZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPjsKKyAgICB9OworICAKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjbWF0Y2g7CisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc21hdGNoOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NtYXRjaDsKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c21hdGNoOworI2VuZGlmCisKKyAgLy8gbWF0Y2hfcmVzdWx0cyBjb21wYXJpc29ucworICAvKioKKyAgICogQGJyaWVmIENvbXBhcmVzIHR3byBtYXRjaF9yZXN1bHRzIGZvciBlcXVhbGl0eS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgcmVmZXIgdG8gdGhlIHNhbWUgbWF0Y2gsCisgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tMSwKKwkgICAgICAgY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbTIpCisgICAgeworICAgICAgaWYgKF9fbTEucmVhZHkoKSAhPSBfX20yLnJlYWR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghX19tMS5yZWFkeSgpKSAgLy8gYm90aCBhcmUgbm90IHJlYWR5CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgaWYgKF9fbTEuZW1wdHkoKSAhPSBfX20yLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChfX20xLmVtcHR5KCkpICAgLy8gYm90aCBhcmUgZW1wdHkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gX19tMS5wcmVmaXgoKSA9PSBfX20yLnByZWZpeCgpCisgICAgICAgICYmIF9fbTEuc2l6ZSgpID09IF9fbTIuc2l6ZSgpCisgICAgICAgICYmIHN0ZDo6ZXF1YWwoX19tMS5iZWdpbigpLCBfX20xLmVuZCgpLCBfX20yLmJlZ2luKCkpCisgICAgICAgICYmIF9fbTEuc3VmZml4KCkgPT0gX19tMi5zdWZmaXgoKTsKKyAgICB9CisKKyAgLyoqCisgICAqIEBicmllZiBDb21wYXJlcyB0d28gbWF0Y2hfcmVzdWx0cyBmb3IgaW5lcXVhbGl0eS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG1hdGNoLAorICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbTEsCisJICAgICAgIGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20yKQorICAgIHsgcmV0dXJuICEoX19tMSA9PSBfX20yKTsgfQorCisgIC8vIFs3LjEwLjZdIG1hdGNoX3Jlc3VsdHMgc3dhcAorICAvKioKKyAgICogQGJyaWVmIFN3YXBzIHR3byBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gbGhzIEEgbWF0Y2ggcmVzdWx0LgorICAgKiBAcGFyYW0gcmhzIEEgbWF0Y2ggcmVzdWx0LgorICAgKgorICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHR3byBtYXRjaF9yZXN1bHRzIG9iamVjdHMgYXJlIHN3YXBwZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIC8vIFs3LjExLjJdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X21hdGNoCisgIC8qKgorICAgKiBAbmFtZSBNYXRjaGluZywgU2VhcmNoaW5nLCBhbmQgUmVwbGFjaW5nCisgICAqLworICAvL0B7CisKKyAgLyoqCisgICAqIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGFsbCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkuCisgICAqCisgICAqIEBwYXJhbSBzICAgICBTdGFydCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gZSAgICAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gbSAgICAgVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSByZSAgICBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZmxhZ3MgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqCisgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X21hdGNoKF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLAorICAgICAgICAgICAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lLAorICAgICAgICAgICAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiAgICAgX19tLAorICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKyAgICAgICAgICAgICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSAgICAgICAgIF9fZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7CisgICAgICBfX3JlZ2V4OjpfQXV0b21hdG9uUHRyIF9fYSA9IF9fcmUuX01fZ2V0X2F1dG9tYXRvbigpOworICAgICAgX19yZWdleDo6X0F1dG9tYXRvbjo6X1NpemVUIF9fc3ogPSBfX2EtPl9NX3N1Yl9jb3VudCgpOworICAgICAgX19yZWdleDo6X1NwZWNpYWxpemVkQ3Vyc29yPF9CaV9pdGVyPiBfX2NzKF9fcywgX19lKTsKKyAgICAgIF9fcmVnZXg6Ol9TcGVjaWFsaXplZFJlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+IF9fcihfX3N6LCBfX2NzLCBfX20pOworICAgICAgX19yZWdleDo6X0dyZXBfbWF0Y2hlciBfX21hdGNoZXIoX19jcywgX19yLCBfX2EsIF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9fbVswXS5tYXRjaGVkOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhbGwgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpLgorICAgKgorICAgKiBAcGFyYW0gZmlyc3QgQmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBsYXN0ICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSByZSAgICBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZmxhZ3MgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgYm9vbAorICAgIHJlZ2V4X21hdGNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgCisgICAgICBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyPiBfX3doYXQ7CisgICAgICByZXR1cm4gcmVnZXhfbWF0Y2goX19maXJzdCwgX19sYXN0LCBfX3doYXQsIF9fcmUsIF9fZmxhZ3MpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIERldGVybWluZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBzICBUaGUgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gbSAgVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSByZSBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZiAgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCW1hdGNoX3Jlc3VsdHM8Y29uc3QgX0NoX3R5cGUqLCBfQWxsb2NhdG9yPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9tYXRjaChfX3MsIF9fcyArIF9SeF90cmFpdHM6Omxlbmd0aChfX3MpLCBfX20sIF9fcmUsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIERldGVybWluZXMgaWYgdGhlcmUgaXMgYSBtYXRjaCBiZXR3ZWVuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gQHAgZQorICAgKiBhbmQgYSBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSBzICAgICBUaGUgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gbSAgICAgVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSByZSAgICBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZmxhZ3MgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2MsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9tYXRjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcywKKwkJbWF0Y2hfcmVzdWx0czx0eXBlbmFtZSBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIAorCQlfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+Ojpjb25zdF9pdGVyYXRvciwgX0FsbG9jYXRvcj4mIF9fbSwKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fbSwgX19yZSwgX19mbGFncyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIHMgIFRoZSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSByZSBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZiAgQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgY2xhc3MgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fcmUsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIHMgICAgIFtJTl0gVGhlIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIHJlICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIGZsYWdzIFtJTl0gQ29udHJvbHMgaG93IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZC4KKyAgICoKKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIGV4aXN0cy4KKyAgICogQHJldHZhbCBmYWxzZSBPdGhlcndpc2UuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfU3RyX2FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3RyYWl0cywgX1N0cl9hbGxvY2F0b3I+JiBfX3MsCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQk9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9tYXRjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX3JlLCBfX2ZsYWdzKTsgfQorCisgIC8vIFs3LjExLjNdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X3NlYXJjaAorICAvKioKKyAgICogU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHJhbmdlLgorICAgKiBAcGFyYW0gZmlyc3QgW0lOXSAgVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gbGFzdCAgW0lOXSAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIG0gICAgIFtPVVRdIFRoZSBtYXRjaCByZXN1bHRzLgorICAgKiBAcGFyYW0gcmUgICAgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcsIHRoZSBjb250ZW50IG9mICVtIGlzCisgICAqICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCSA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIC8qKgorICAgKiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgcmFuZ2UuCisgICAqIEBwYXJhbSBmaXJzdCBbSU5dICBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBsYXN0ICBbSU5dICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gcmUgICAgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gX193aGF0OworICAgICAgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX2ZpcnN0LCBfX2xhc3QsIF9fd2hhdCwgX19yZSwgX19mbGFncyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIEMtc3RyaW5nLgorICAgKiBAcGFyYW0gcyBbSU5dICBBIEMtc3RyaW5nIHRvIHNlYXJjaCBmb3IgdGhlIHJlZ2V4LgorICAgKiBAcGFyYW0gbSBbT1VUXSBUaGUgc2V0IG9mIHJlZ2V4IG1hdGNoZXMuCisgICAqIEBwYXJhbSBlIFtJTl0gIFRoZSByZWdleCB0byBzZWFyY2ggZm9yIGluIEBwIHMuCisgICAqIEBwYXJhbSBmIFtJTl0gIFRoZSBzZWFyY2ggZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLCB0aGUgY29udGVudCBvZiAlbSBpcworICAgKiAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyAgICogQGRvY3RvZG8KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCBjbGFzcyBfQWxsb2NhdG9yLCBjbGFzcyBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCSBtYXRjaF9yZXN1bHRzPGNvbnN0IF9DaF90eXBlKiwgX0FsbG9jYXRvcj4mIF9fbSwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCSA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiByZWdleF9zZWFyY2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19tLCBfX2UsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBDLXN0cmluZy4KKyAgICogQHBhcmFtIHMgW0lOXSAgVGhlIEMtc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIGUgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZiBbSU5dICBTZWFyY2ggcG9saWN5IGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQGRvY3RvZG8KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKGNvbnN0IF9DaF90eXBlKiBfX3MsCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHN0cmluZy4KKyAgICogQHBhcmFtIHMgICAgIFtJTl0gIFRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gZSAgICAgW0lOXSAgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfU3RyaW5nX2FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsCisJCSBfU3RyaW5nX2FsbG9jYXRvcj4mIF9fcywKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fZSwgX19mbGFncyk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBzdHJpbmcuCisgICAqIEBwYXJhbSBzIFtJTl0gIEEgQysrIHN0cmluZyB0byBzZWFyY2ggZm9yIHRoZSByZWdleC4KKyAgICogQHBhcmFtIG0gW09VVF0gVGhlIHNldCBvZiByZWdleCBtYXRjaGVzLgorICAgKiBAcGFyYW0gZSBbSU5dICBUaGUgcmVnZXggdG8gc2VhcmNoIGZvciBpbiBAcCBzLgorICAgKiBAcGFyYW0gZiBbSU5dICBUaGUgc2VhcmNoIGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2MsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0NoX3R5cGUsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGUsIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcywKKwkJIG1hdGNoX3Jlc3VsdHM8dHlwZW5hbWUgYmFzaWNfc3RyaW5nPF9DaF90eXBlLAorCQkgX0NoX3RyYWl0cywgX0NoX2FsbG9jPjo6Y29uc3RfaXRlcmF0b3IsIF9BbGxvY2F0b3I+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fbSwgX19lLCBfX2YpOyB9CisKKyAgLy8gc3RkIFsyOC4xMS40XSBGdW5jdGlvbiB0ZW1wbGF0ZSByZWdleF9yZXBsYWNlCisgIC8qKgorICAgKiBAZG9jdG9kbworICAgKiBAcGFyYW0gb3V0CisgICAqIEBwYXJhbSBmaXJzdAorICAgKiBAcGFyYW0gbGFzdAorICAgKiBAcGFyYW0gZQorICAgKiBAcGFyYW0gZm10CisgICAqIEBwYXJhbSBmbGFncworICAgKgorICAgKiBAcmV0dXJucyBvdXQKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3V0X2l0ZXIsIHR5cGVuYW1lIF9CaV9pdGVyLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMsIHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGlubGluZSBfT3V0X2l0ZXIKKyAgICByZWdleF9yZXBsYWNlKF9PdXRfaXRlciBfX291dCwgX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fZm10LAorCQkgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7IHJldHVybiBfX291dDsgfQorCisgIC8qKgorICAgKiBAZG9jdG9kbworICAgKiBAcGFyYW0gcworICAgKiBAcGFyYW0gZQorICAgKiBAcGFyYW0gZm10CisgICAqIEBwYXJhbSBmbGFncworICAgKgorICAgKiBAcmV0dXJucyBhIGNvcHkgb2Ygc3RyaW5nIEBwIHMgd2l0aCByZXBsYWNlbWVudHMuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUnhfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfdHlwZT4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaF90eXBlPgorICAgIHJlZ2V4X3JlcGxhY2UoY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlPiYgX19zLAorCQkgIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19lLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fZm10LAorCQkgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCkKKyAgICB7CisgICAgICBiYXNpY19zdHJpbmc8X0NoX3R5cGU+IF9fcmVzdWx0OworICAgICAgcmVnZXhfcmVwbGFjZShzdGQ6OmJhY2tfaW5zZXJ0ZXIoX19yZXN1bHQpLAorCQkgICAgX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19lLCBfX2ZtdCwgX19mbGFncyk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8vQH0KKworICAvLyBzdGQgWzI4LjEyXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF9pdGVyYXRvcgorICAvKioKKyAgICogQW4gaXRlcmF0b3IgYWRhcHRvciB0aGF0IHdpbGwgcHJvdmlkZSByZXBlYXRlZCBjYWxscyBvZiByZWdleF9zZWFyY2ggb3ZlciAKKyAgICogYSByYW5nZSB1bnRpbCBubyBtb3JlIG1hdGNoZXMgcmVtYWluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyByZWdleF9pdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiAgcmVnZXhfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFByb3ZpZGVzIGEgc2luZ3VsYXIgaXRlcmF0b3IsIHVzZWZ1bCBmb3IgaW5kaWNhdGluZworICAgICAgICogb25lLXBhc3QtdGhlLWVuZCBvZiBhIHJhbmdlLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfaXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICBbSU5dIFRoZSBzdGFydCBvZiBhIHRleHQgcmFuZ2UgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCByYW5nZSB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoLgorICAgICAgICogQHBhcmFtIG0gIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvcHkgY29uc3RydWN0cyBhICVyZWdleF9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlKgorICAgICAgb3BlcmF0b3ItPigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIHRoZXNlIG1lbWJlcnMgYXJlIHNob3duIGZvciBleHBvc2l0aW9uIG9ubHk6CisgICAgICBfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjsKKyAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgIGNvbnN0IHJlZ2V4X3R5cGUqICAgICAgICAgICAgICAgIHByZWdleDsKKyAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzOworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgbWF0Y2g7CisgICAgfTsKKyAgCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF9pdGVyYXRvcjsKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3JlZ2V4X2l0ZXJhdG9yOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfaXRlcmF0b3I7CisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfaXRlcmF0b3I7CisjZW5kaWYKKworICAvLyBbNy4xMi4yXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF90b2tlbl9pdGVyYXRvcgorICAvKioKKyAgICogSXRlcmF0ZXMgb3ZlciBzdWJtYXRjaGVzIGluIGEgcmFuZ2UgKG9yIEBhIHNwbGl0cyBhIHRleHQgc3RyaW5nKS4KKyAgICoKKyAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpdGVyYXRvciBpcyB0byBlbnVtZXJhdGUgYWxsLCBvciBhbGwgc3BlY2lmaWVkLAorICAgKiBtYXRjaGVzIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHRleHQgcmFuZ2UuICBUaGUgZGVyZWZlcmVuY2VkCisgICAqIHZhbHVlIG9mIGFuIGl0ZXJhdG9yIG9mIHRoaXMgY2xhc3MgaXMgYSBzdGQ6OnN1Yl9tYXRjaCBvYmplY3QuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSA9IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+IHJlZ2V4X3R5cGU7CisgICAgICB0eXBlZGVmIHN1Yl9tYXRjaDxfQmlfaXRlcj4gICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiAKKyAgICAgICAqIEEgZGVmYXVsdC1jb25zdHJ1Y3RlZCAlcmVnZXhfdG9rZW5faXRlcmF0b3IgaXMgYSBzaW5ndWxhciBpdGVyYXRvcgorICAgICAgICogdGhhdCB3aWxsIGNvbXBhcmUgZXF1YWwgdG8gdGhlIG9uZS1wYXN0LXRoZS1lbmQgdmFsdWUgZm9yIGFueQorICAgICAgICogaXRlcmF0b3Igb2YgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gYSAgICAgICAgICBbSU5dIFRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gYiAgICAgICAgICBbSU5dIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIHJlICAgICAgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiBAcGFyYW0gc3VibWF0Y2ggICBbSU5dIFdoaWNoIHN1Ym1hdGNoIHRvIHJldHVybi4gIFRoZXJlIGFyZSBzb21lCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgdmFsdWVzIGZvciB0aGlzIHBhcmFtZXRlcjoKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSAtMSBlYWNoIGVudW1lcmF0ZWQgc3ViZXhwcmVzc2lvbiBkb2VzIE5PVAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gKGFrYSBmaWVsZAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0dGluZykKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSAwIHRoZSBlbnRpcmUgc3RyaW5nIG1hdGNoaW5nIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cHJlc3Npb24gaXMgcmV0dXJuZWQgZm9yIGVhY2ggbWF0Y2gKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIC0gPjAgZW51bWVyYXRlcyBvbmx5IHRoZSBpbmRpY2F0ZWQKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJleHByZXNzaW9uIGZyb20gYSBtYXRjaCB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiBAcGFyYW0gbSAgICAgICAgICBbSU5dIFBvbGljeSBmbGFncyBmb3IgbWF0Y2ggcnVsZXMuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwKKwkJCSAgIGludCBfX3N1Ym1hdGNoID0gMCwKKwkJCSAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorCQkJICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBiICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgICAgICAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICAgICAqIEBwYXJhbSBzdWJtYXRjaGVzIFtJTl0gQSBsaXN0IG9mIHN1YmV4cHJlc3Npb25zIHRvIHJldHVybiBmb3IgZWFjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggd2l0aGluIHRoZSB0ZXh0LgorICAgICAgICogQHBhcmFtIG0gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgICoKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsCisJCQkgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgX19zdWJtYXRjaGVzLAorCQkJICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCQkgICAgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLi4uCisgICAgICAgKiBAcGFyYW0gYSAgICAgICAgICBbSU5dIFRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gYiAgICAgICAgICBbSU5dIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIHJlICAgICAgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiBAcGFyYW0gc3VibWF0Y2hlcyBbSU5dIEEgbGlzdCBvZiBzdWJleHByZXNzaW9ucyB0byByZXR1cm4gZm9yIGVhY2gKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBtICAgICAgICAgIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX05tPgorICAgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwKKwkJCSAgICAgY29uc3QgcmVnZXhfdHlwZSYgX19yZSwKKwkJCSAgICAgY29uc3QgaW50ICgmX19zdWJtYXRjaGVzKVtfTm1dLAorCQkJICAgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAcGFyYW0gcmhzIFtJTl0gQSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gY29weS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGFub3RoZXIuCisgICAgICAgKiBAcGFyYW0gcmhzIFtJTl0gQSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gY29weS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb21wYXJlcyBhICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBhbm90aGVyIGZvciBlcXVhbGl0eS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGFub3RoZXIgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCByZWdleF90b2tlbl9pdGVyYXRvciYgX19yaHMpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXJlZmVyZW5jZXMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3QgdmFsdWVfdHlwZSYKKyAgICAgIG9wZXJhdG9yKigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTZWxlY3RzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIG1lbWJlci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlKgorICAgICAgb3BlcmF0b3ItPigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbmNyZW1lbnRzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBQb3N0aW5jcmVtZW50cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworICAgICAgCisgICAgcHJpdmF0ZTogLy8gZGF0YSBtZW1iZXJzIGZvciBleHBvc2l0aW9uIG9ubHk6CisgICAgICB0eXBlZGVmIHJlZ2V4X2l0ZXJhdG9yPF9CaV9pdGVyLCBfQ2hfdHlwZSwgX1J4X3RyYWl0cz4gcG9zaXRpb25faXRlcmF0b3I7CisKKyAgICAgIHBvc2l0aW9uX2l0ZXJhdG9yIF9fcG9zaXRpb247CisgICAgICBjb25zdCB2YWx1ZV90eXBlKiBfX3Jlc3VsdDsKKyAgICAgIHZhbHVlX3R5cGUgICAgICAgIF9fc3VmZml4OworICAgICAgc3RkOjpzaXplX3QgICAgICAgX19uOworICAgICAgc3RkOjp2ZWN0b3I8aW50PiAgX19zdWJzOworICAgIH07CisKKyAgLyoqIEBicmllZiBUb2tlbiBpdGVyYXRvciBmb3IgQy1zdHlsZSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KKyAgdHlwZWRlZiByZWdleF90b2tlbl9pdGVyYXRvcjxjb25zdCBjaGFyKj4gICAgICAgICAgICAgY3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBzdGFuZGFyZCBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzcmVnZXhfdG9rZW5faXRlcmF0b3I7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgLyoqIEBicmllZiBUb2tlbiBpdGVyYXRvciBmb3IgQy1zdHlsZSBOVUxMLXRlcm1pbmF0ZWQgd2lkZSBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBzdGFuZGFyZCB3aWRlLWNoYXJhY3RlciBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPHdzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiB3c3JlZ2V4X3Rva2VuX2l0ZXJhdG9yOworI2VuZGlmCisgIAorICAvL0B9IC8vIGdyb3VwIHJlZ2V4CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9jb21waWxlci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1YzRmYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9jb21waWxlci5oCkBAIC0wLDAgKzEsMTEwOSBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfY29tcGlsZXIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcmVnZXgKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgc3RydWN0IF9TY2FubmVyX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IF9TdGF0ZVQ7CisKKyAgICBzdGF0aWMgY29uc3RleHByIF9TdGF0ZVQgX1Nfc3RhdGVfYXRfc3RhcnQgICAgPSAxIDw8IDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBfU3RhdGVUIF9TX3N0YXRlX2luX2JyYWNlICAgID0gMSA8PCAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgX1N0YXRlVCBfU19zdGF0ZV9pbl9icmFja2V0ICA9IDEgPDwgMzsKKworICAgIHZpcnR1YWwgfl9TY2FubmVyX2Jhc2UoKSB7IH07CisgIH07CisKKyAgLy8KKyAgLy8gQGJyaWVmIFNjYW5zIGFuIGlucHV0IHJhbmdlIGZvciByZWdleCB0b2tlbnMuCisgIC8vCisgIC8vIFRoZSAlX1NjYW5uZXIgY2xhc3MgaW50ZXJwcmV0cyB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gaW4gdGhlIGlucHV0CisgIC8vIHJhbmdlIHBhc3NlZCB0byBpdHMgY29uc3RydWN0b3IgYXMgYSBzZXF1ZW5jZSBvZiBwYXJzZSB0b2tlbnMgcGFzc2VkIHRvCisgIC8vIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29tcGlsZXIuICBUaGUgc2VxdWVuY2Ugb2YgdG9rZW5zIHByb3ZpZGVkIGRlcGVuZHMKKyAgLy8gb24gdGhlIGZsYWcgc2V0dGluZ3MgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcjogIGRpZmZlcmVudCByZWd1bGFyCisgIC8vIGV4cHJlc3Npb24gZ3JhbW1hcnMgd2lsbCBpbnRlcnByZXQgdGhlIHNhbWUgaW5wdXQgcGF0dGVybiBpbgorICAvLyBzeW50YWN0aWNhbGx5IGRpZmZlcmVudCB3YXlzLgorICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBjbGFzcyBfU2Nhbm5lcjogcHVibGljIF9TY2FubmVyX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfSW5wdXRJdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSXRlcmF0b3JUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3JUPjo6dmFsdWVfdHlwZSBfQ2hhclQ7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TdHJpbmdUOworICAgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSAgICAgICAgICAgICAgICAgICBfRmxhZ1Q7CisgICAgICB0eXBlZGVmIGNvbnN0IHN0ZDo6Y3R5cGU8X0NoYXJUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DdHlwZVQ7CisKKyAgICAgIC8vIFRva2VuIHR5cGVzIHJldHVybmVkIGZyb20gdGhlIHNjYW5uZXIuCisgICAgICBlbnVtIF9Ub2tlblQKKyAgICAgIHsKKwlfU190b2tlbl9hbnljaGFyLAorCV9TX3Rva2VuX2JhY2tyZWYsCisJX1NfdG9rZW5fYnJhY2tldF9iZWdpbiwKKwlfU190b2tlbl9icmFja2V0X2VuZCwKKwlfU190b2tlbl9pbnZlcnNlX2NsYXNzLAorCV9TX3Rva2VuX2NoYXJfY2xhc3NfbmFtZSwKKwlfU190b2tlbl9jbG9zdXJlMCwKKwlfU190b2tlbl9jbG9zdXJlMSwKKwlfU190b2tlbl9jb2xsZWxlbV9tdWx0aSwKKwlfU190b2tlbl9jb2xsZWxlbV9zaW5nbGUsCisJX1NfdG9rZW5fY29sbHN5bWJvbCwKKwlfU190b2tlbl9jb21tYSwKKwlfU190b2tlbl9kYXNoLAorCV9TX3Rva2VuX2R1cF9jb3VudCwKKwlfU190b2tlbl9lb2YsCisJX1NfdG9rZW5fZXF1aXZfY2xhc3NfbmFtZSwKKwlfU190b2tlbl9pbnRlcnZhbF9iZWdpbiwKKwlfU190b2tlbl9pbnRlcnZhbF9lbmQsCisJX1NfdG9rZW5fbGluZV9iZWdpbiwKKwlfU190b2tlbl9saW5lX2VuZCwKKwlfU190b2tlbl9vcHQsCisJX1NfdG9rZW5fb3IsCisJX1NfdG9rZW5fb3JkX2NoYXIsCisJX1NfdG9rZW5fcXVvdGVkX2NoYXIsCisJX1NfdG9rZW5fc3ViZXhwcl9iZWdpbiwKKwlfU190b2tlbl9zdWJleHByX2VuZCwKKwlfU190b2tlbl93b3JkX2JlZ2luLAorCV9TX3Rva2VuX3dvcmRfZW5kLAorCV9TX3Rva2VuX3Vua25vd24KKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICBfU2Nhbm5lcihfSXRlcmF0b3JUIF9fYmVnaW4sIF9JdGVyYXRvclQgX19lbmQsIF9GbGFnVCBfX2ZsYWdzLAorCSAgICAgICBzdGQ6OmxvY2FsZSBfX2xvYykKKyAgICAgIDogX01fY3VycmVudChfX2JlZ2luKSAsIF9NX2VuZChfX2VuZCkgLCBfTV9mbGFncyhfX2ZsYWdzKSwKKyAgICAgICAgX01fY3R5cGUoc3RkOjp1c2VfZmFjZXQ8X0N0eXBlVD4oX19sb2MpKSwgX01fc3RhdGUoX1Nfc3RhdGVfYXRfc3RhcnQpCisgICAgICB7IF9NX2FkdmFuY2UoKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZHZhbmNlKCk7CisKKyAgICAgIF9Ub2tlblQKKyAgICAgIF9NX3Rva2VuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1clRva2VuOyB9CisKKyAgICAgIGNvbnN0IF9TdHJpbmdUJgorICAgICAgX01fdmFsdWUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VyVmFsdWU7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBzdGQ6Om9zdHJlYW0mCisgICAgICBfTV9wcmludChzdGQ6Om9zdHJlYW0mKTsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VhdF9lc2NhcGUoKTsKKworICAgICAgdm9pZAorICAgICAgX01fc2Nhbl9pbl9icmFjZSgpOworCisgICAgICB2b2lkCisgICAgICBfTV9zY2FuX2luX2JyYWNrZXQoKTsKKworICAgICAgdm9pZAorICAgICAgX01fZWF0X2NoYXJjbGFzcygpOworCisgICAgICB2b2lkCisgICAgICBfTV9lYXRfZXF1aXZjbGFzcygpOworCisgICAgICB2b2lkCisgICAgICBfTV9lYXRfY29sbHN5bWJvbCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9JdGVyYXRvclQgIF9NX2N1cnJlbnQ7CisgICAgICBfSXRlcmF0b3JUICBfTV9lbmQ7CisgICAgICBfRmxhZ1QgICAgICBfTV9mbGFnczsKKyAgICAgIF9DdHlwZVQmICAgIF9NX2N0eXBlOworICAgICAgX1Rva2VuVCAgICAgX01fY3VyVG9rZW47CisgICAgICBfU3RyaW5nVCAgICBfTV9jdXJWYWx1ZTsKKyAgICAgIF9TdGF0ZVQgICAgIF9NX3N0YXRlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fYWR2YW5jZSgpCisgICAgeworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZW9mOworCSAgcmV0dXJuOworCX0KKworICAgICAgX0NoYXJUIF9fYyA9ICpfTV9jdXJyZW50OworICAgICAgaWYgKF9NX3N0YXRlICYgX1Nfc3RhdGVfaW5fYnJhY2tldCkKKwl7CisJICBfTV9zY2FuX2luX2JyYWNrZXQoKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoX01fc3RhdGUgJiBfU19zdGF0ZV9pbl9icmFjZSkKKwl7CisJICBfTV9zY2FuX2luX2JyYWNlKCk7CisJICByZXR1cm47CisJfQorI2lmIDAKKyAgICAgIC8vIFRPRE86IHJlLWVuYWJsZSBsaW5lIGFuY2hvcnMgd2hlbiBfTV9hc3NlcnRpb24gaXMgaW1wbGVtZW50ZWQuCisgICAgICAvLyBTZWUgUFIgbGlic3RkYysrLzQ3NzI0CisgICAgICBlbHNlIGlmIChfTV9zdGF0ZSAmIF9TX3N0YXRlX2F0X3N0YXJ0ICYmIF9fYyA9PSBfTV9jdHlwZS53aWRlbignXicpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fbGluZV9iZWdpbjsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJyQnKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2xpbmVfZW5kOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyNlbmRpZgorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcuJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9hbnljaGFyOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignKicpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fY2xvc3VyZTA7CisJICArK19NX2N1cnJlbnQ7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcrJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9jbG9zdXJlMTsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ3wnKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignWycpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fYnJhY2tldF9iZWdpbjsKKwkgIF9NX3N0YXRlIHw9IChfU19zdGF0ZV9pbl9icmFja2V0IHwgX1Nfc3RhdGVfYXRfc3RhcnQpOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignXFwnKSkKKwl7CisJICBfTV9lYXRfZXNjYXBlKCk7CisJICByZXR1cm47CisJfQorICAgICAgZWxzZSBpZiAoIShfTV9mbGFncyAmIChyZWdleF9jb25zdGFudHM6OmJhc2ljIHwgcmVnZXhfY29uc3RhbnRzOjpncmVwKSkpCisJeworCSAgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignKCcpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9zdWJleHByX2JlZ2luOworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbignKScpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9zdWJleHByX2VuZDsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ3snKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5faW50ZXJ2YWxfYmVnaW47CisJICAgICAgX01fc3RhdGUgfD0gX1Nfc3RhdGVfaW5fYnJhY2U7CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKworICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcmRfY2hhcjsKKyAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworICAgICAgKytfTV9jdXJyZW50OworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX3NjYW5faW5fYnJhY2UoKQorICAgIHsKKyAgICAgIGlmIChfTV9jdHlwZS5pcyhfQ3R5cGVUOjpkaWdpdCwgKl9NX2N1cnJlbnQpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZHVwX2NvdW50OworCSAgX01fY3VyVmFsdWUuYXNzaWduKDEsICpfTV9jdXJyZW50KTsKKwkgICsrX01fY3VycmVudDsKKwkgIHdoaWxlIChfTV9jdXJyZW50ICE9IF9NX2VuZAorCQkgJiYgX01fY3R5cGUuaXMoX0N0eXBlVDo6ZGlnaXQsICpfTV9jdXJyZW50KSkKKwkgICAgeworCSAgICAgIF9NX2N1clZhbHVlICs9ICpfTV9jdXJyZW50OworCSAgICAgICsrX01fY3VycmVudDsKKwkgICAgfQorCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCcsJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9jb21tYTsKKwkgICsrX01fY3VycmVudDsKKwkgIHJldHVybjsKKwl9CisgICAgICBpZiAoX01fZmxhZ3MgJiAocmVnZXhfY29uc3RhbnRzOjpiYXNpYyB8IHJlZ2V4X2NvbnN0YW50czo6Z3JlcCkpCisJeworCSAgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCdcXCcpKQorCSAgICBfTV9lYXRfZXNjYXBlKCk7CisJfQorICAgICAgZWxzZSAKKwl7CisJICBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJ30nKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5faW50ZXJ2YWxfZW5kOworCSAgICAgIF9NX3N0YXRlICY9IH5fU19zdGF0ZV9pbl9icmFjZTsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9zY2FuX2luX2JyYWNrZXQoKQorICAgIHsKKyAgICAgIGlmIChfTV9zdGF0ZSAmIF9TX3N0YXRlX2F0X3N0YXJ0ICYmICpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCdeJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9pbnZlcnNlX2NsYXNzOworCSAgX01fc3RhdGUgJj0gfl9TX3N0YXRlX2F0X3N0YXJ0OworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCdbJykpCisJeworCSAgKytfTV9jdXJyZW50OworCSAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9lb2Y7CisJICAgICAgcmV0dXJuOworCSAgICB9CisKKwkgIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignLicpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9jb2xsc3ltYm9sOworCSAgICAgIF9NX2VhdF9jb2xsc3ltYm9sKCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBlbHNlIGlmICgqX01fY3VycmVudCA9PSBfTV9jdHlwZS53aWRlbignOicpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9jaGFyX2NsYXNzX25hbWU7CisJICAgICAgX01fZWF0X2NoYXJjbGFzcygpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZSBpZiAoKl9NX2N1cnJlbnQgPT0gX01fY3R5cGUud2lkZW4oJz0nKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZXF1aXZfY2xhc3NfbmFtZTsKKwkgICAgICBfTV9lYXRfZXF1aXZjbGFzcygpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCX0KKyAgICAgIGVsc2UgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCctJykpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9kYXNoOworCSAgKytfTV9jdXJyZW50OworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKCpfTV9jdXJyZW50ID09IF9NX2N0eXBlLndpZGVuKCddJykpCisJeworCSAgaWYgKCEoX01fZmxhZ3MgJiByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisJICAgICAgfHwgIShfTV9zdGF0ZSAmIF9TX3N0YXRlX2F0X3N0YXJ0KSkKKwkgICAgeworCSAgICAgIC8vIHNwZWNpYWwgY2FzZTogb25seSBpZiAgX25vdF8gY2hyIGZpcnN0IGFmdGVyCisJICAgICAgLy8gJ1snIG9yICdbXicgYW5kIGlmIG5vdCBFQ01Bc2NyaXB0CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9icmFja2V0X2VuZDsKKwkgICAgICArK19NX2N1cnJlbnQ7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9jb2xsZWxlbV9zaW5nbGU7CisgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgKl9NX2N1cnJlbnQpOworICAgICAgKytfTV9jdXJyZW50OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9lYXRfZXNjYXBlKCkKKyAgICB7CisgICAgICArK19NX2N1cnJlbnQ7CisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJeworCSAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9lb2Y7CisJICByZXR1cm47CisJfQorICAgICAgX0NoYXJUIF9fYyA9ICpfTV9jdXJyZW50OworICAgICAgKytfTV9jdXJyZW50OworCisgICAgICBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcoJykpCisJeworCSAgaWYgKCEoX01fZmxhZ3MgJiAocmVnZXhfY29uc3RhbnRzOjpiYXNpYyB8IHJlZ2V4X2NvbnN0YW50czo6Z3JlcCkpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcmRfY2hhcjsKKwkgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX3N1YmV4cHJfYmVnaW47CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCcpJykpCisJeworCSAgaWYgKCEoX01fZmxhZ3MgJiAocmVnZXhfY29uc3RhbnRzOjpiYXNpYyB8IHJlZ2V4X2NvbnN0YW50czo6Z3JlcCkpKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9vcmRfY2hhcjsKKwkgICAgICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX3N1YmV4cHJfZW5kOworCX0KKyAgICAgIGVsc2UgaWYgKF9fYyA9PSBfTV9jdHlwZS53aWRlbigneycpKQorCXsKKwkgIGlmICghKF9NX2ZsYWdzICYgKHJlZ2V4X2NvbnN0YW50czo6YmFzaWMgfCByZWdleF9jb25zdGFudHM6OmdyZXApKSkKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3JkX2NoYXI7CisJICAgICAgX01fY3VyVmFsdWUuYXNzaWduKDEsIF9fYyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5faW50ZXJ2YWxfYmVnaW47CisJICAgICAgX01fc3RhdGUgfD0gX1Nfc3RhdGVfaW5fYnJhY2U7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChfX2MgPT0gX01fY3R5cGUud2lkZW4oJ30nKSkKKwl7CisJICBpZiAoIShfTV9mbGFncyAmIChyZWdleF9jb25zdGFudHM6OmJhc2ljIHwgcmVnZXhfY29uc3RhbnRzOjpncmVwKSkpCisJICAgIHsKKwkgICAgICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX29yZF9jaGFyOworCSAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCBfX2MpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoIShfTV9zdGF0ZSAmJiBfU19zdGF0ZV9pbl9icmFjZSkpCisJCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9iYWRicmFjZSk7CisJICAgICAgX01fc3RhdGUgJj0gfl9TX3N0YXRlX2luX2JyYWNlOworCSAgICAgIF9NX2N1clRva2VuID0gX1NfdG9rZW5faW50ZXJ2YWxfZW5kOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCd4JykpCisJeworCSAgKytfTV9jdXJyZW50OworCSAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCSAgICB7CisJICAgICAgX01fY3VyVG9rZW4gPSBfU190b2tlbl9lb2Y7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBpZiAoX01fY3R5cGUuaXMoX0N0eXBlVDo6ZGlnaXQsICpfTV9jdXJyZW50KSkKKwkgICAgeworCSAgICAgIF9NX2N1clZhbHVlLmFzc2lnbigxLCAqX01fY3VycmVudCk7CisJICAgICAgKytfTV9jdXJyZW50OworCSAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwkJeworCQkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fZW9mOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIGlmIChfTV9jdHlwZS5pcyhfQ3R5cGVUOjpkaWdpdCwgKl9NX2N1cnJlbnQpKQorCQl7CisJCSAgX01fY3VyVmFsdWUgKz0gKl9NX2N1cnJlbnQ7CisJCSAgKytfTV9jdXJyZW50OworCQkgIHJldHVybjsKKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoX19jID09IF9NX2N0eXBlLndpZGVuKCdeJykKKwkgICAgICAgfHwgX19jID09IF9NX2N0eXBlLndpZGVuKCcuJykKKwkgICAgICAgfHwgX19jID09IF9NX2N0eXBlLndpZGVuKCcqJykKKwkgICAgICAgfHwgX19jID09IF9NX2N0eXBlLndpZGVuKCckJykKKwkgICAgICAgfHwgX19jID09IF9NX2N0eXBlLndpZGVuKCdcXCcpKQorCXsKKwkgIF9NX2N1clRva2VuID0gX1NfdG9rZW5fb3JkX2NoYXI7CisJICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKwl9CisgICAgICBlbHNlIGlmIChfTV9jdHlwZS5pcyhfQ3R5cGVUOjpkaWdpdCwgX19jKSkKKwl7CisJICBfTV9jdXJUb2tlbiA9IF9TX3Rva2VuX2JhY2tyZWY7CisJICBfTV9jdXJWYWx1ZS5hc3NpZ24oMSwgX19jKTsKKwl9CisgICAgICBlbHNlCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2VzY2FwZSk7CisgICAgfQorCisKKyAgLy8gRWF0cyBhIGNoYXJhY3RlciBjbGFzcyBvciB0aHJvd25zIGFuIGV4Y2VwdGlvbi4KKyAgLy8gY3VycmVudCBwb2ludCB0byAnOicgZGVsaW1pdGVyIG9uIGVudHJ5LCBjaGFyIGFmdGVyICddJyBvbiByZXR1cm4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fZWF0X2NoYXJjbGFzcygpCisgICAgeworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICc6JworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jdHlwZSk7CisgICAgICBmb3IgKF9NX2N1clZhbHVlLmNsZWFyKCk7CisJICAgX01fY3VycmVudCAhPSBfTV9lbmQgJiYgKl9NX2N1cnJlbnQgIT0gX01fY3R5cGUud2lkZW4oJzonKTsKKwkgICArK19NX2N1cnJlbnQpCisJX01fY3VyVmFsdWUgKz0gKl9NX2N1cnJlbnQ7CisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2N0eXBlKTsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnOicKKyAgICAgIGlmICgqX01fY3VycmVudCAhPSBfTV9jdHlwZS53aWRlbignXScpKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jdHlwZSk7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJ10nCisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9TY2FubmVyPF9JbnB1dEl0ZXJhdG9yPjo6CisgICAgX01fZWF0X2VxdWl2Y2xhc3MoKQorICAgIHsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnPScKKyAgICAgIGlmIChfTV9jdXJyZW50ID09IF9NX2VuZCkKKwlfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfY29sbGF0ZSk7CisgICAgICBmb3IgKF9NX2N1clZhbHVlLmNsZWFyKCk7CisJICAgX01fY3VycmVudCAhPSBfTV9lbmQgJiYgKl9NX2N1cnJlbnQgIT0gX01fY3R5cGUud2lkZW4oJz0nKTsKKwkgICArK19NX2N1cnJlbnQpCisJX01fY3VyVmFsdWUgKz0gKl9NX2N1cnJlbnQ7CisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGUpOworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICc9JworICAgICAgaWYgKCpfTV9jdXJyZW50ICE9IF9NX2N0eXBlLndpZGVuKCddJykpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGUpOworICAgICAgKytfTV9jdXJyZW50OyAvLyBza2lwICddJworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfU2Nhbm5lcjxfSW5wdXRJdGVyYXRvcj46OgorICAgIF9NX2VhdF9jb2xsc3ltYm9sKCkKKyAgICB7CisgICAgICArK19NX2N1cnJlbnQ7IC8vIHNraXAgJy4nCisgICAgICBpZiAoX01fY3VycmVudCA9PSBfTV9lbmQpCisJX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2NvbGxhdGUpOworICAgICAgZm9yIChfTV9jdXJWYWx1ZS5jbGVhcigpOworCSAgIF9NX2N1cnJlbnQgIT0gX01fZW5kICYmICpfTV9jdXJyZW50ICE9IF9NX2N0eXBlLndpZGVuKCcuJyk7CisJICAgKytfTV9jdXJyZW50KQorCV9NX2N1clZhbHVlICs9ICpfTV9jdXJyZW50OworICAgICAgaWYgKF9NX2N1cnJlbnQgPT0gX01fZW5kKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jb2xsYXRlKTsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnLicKKyAgICAgIGlmICgqX01fY3VycmVudCAhPSBfTV9jdHlwZS53aWRlbignXScpKQorCV9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9jb2xsYXRlKTsKKyAgICAgICsrX01fY3VycmVudDsgLy8gc2tpcCAnXScKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6Om9zdHJlYW0mCisgICAgX1NjYW5uZXI8X0lucHV0SXRlcmF0b3I+OjoKKyAgICBfTV9wcmludChzdGQ6Om9zdHJlYW0mIG9zdHIpCisgICAgeworICAgICAgc3dpdGNoIChfTV9jdXJUb2tlbikKKyAgICAgIHsKKwljYXNlIF9TX3Rva2VuX2FueWNoYXI6CisJICBvc3RyIDw8ICJhbnktY2hhcmFjdGVyXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9iYWNrcmVmOgorCSAgb3N0ciA8PCAiYmFja3JlZlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fYnJhY2tldF9iZWdpbjoKKwkgIG9zdHIgPDwgImJyYWNrZXQtYmVnaW5cbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2JyYWNrZXRfZW5kOgorCSAgb3N0ciA8PCAiYnJhY2tldC1lbmRcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2NoYXJfY2xhc3NfbmFtZToKKwkgIG9zdHIgPDwgImNoYXItY2xhc3MtbmFtZSBcIiIgPDwgX01fY3VyVmFsdWUgPDwgIlwiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jbG9zdXJlMDoKKwkgIG9zdHIgPDwgImNsb3N1cmUwXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jbG9zdXJlMToKKwkgIG9zdHIgPDwgImNsb3N1cmUxXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jb2xsZWxlbV9tdWx0aToKKwkgIG9zdHIgPDwgImNvbGwtZWxlbS1tdWx0aSBcIiIgPDwgX01fY3VyVmFsdWUgPDwgIlwiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9jb2xsZWxlbV9zaW5nbGU6CisJICBvc3RyIDw8ICJjb2xsLWVsZW0tc2luZ2xlIFwiIiA8PCBfTV9jdXJWYWx1ZSA8PCAiXCJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2NvbGxzeW1ib2w6CisJICBvc3RyIDw8ICJjb2xsc3ltYm9sIFwiIiA8PCBfTV9jdXJWYWx1ZSA8PCAiXCJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2NvbW1hOgorCSAgb3N0ciA8PCAiY29tbWFcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2Rhc2g6CisJICBvc3RyIDw8ICJkYXNoXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9kdXBfY291bnQ6CisJICBvc3RyIDw8ICJkdXAgY291bnQ6ICIgPDwgX01fY3VyVmFsdWUgPDwgIlxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fZW9mOgorCSAgb3N0ciA8PCAiRU9GXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9lcXVpdl9jbGFzc19uYW1lOgorCSAgb3N0ciA8PCAiZXF1aXYtY2xhc3MtbmFtZSBcIiIgPDwgX01fY3VyVmFsdWUgPDwgIlwiXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9pbnRlcnZhbF9iZWdpbjoKKwkgIG9zdHIgPDwgImludGVydmFsIGJlZ2luXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9pbnRlcnZhbF9lbmQ6CisJICBvc3RyIDw8ICJpbnRlcnZhbCBlbmRcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX2xpbmVfYmVnaW46CisJICBvc3RyIDw8ICJsaW5lIGJlZ2luXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9saW5lX2VuZDoKKwkgIG9zdHIgPDwgImxpbmUgZW5kXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9vcHQ6CisJICBvc3RyIDw8ICJvcHRcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX29yOgorCSAgb3N0ciA8PCAib3JcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX29yZF9jaGFyOgorCSAgb3N0ciA8PCAib3JkaW5hcnkgY2hhcmFjdGVyOiBcIiIgPDwgX01fdmFsdWUoKSA8PCAiXCJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX3F1b3RlZF9jaGFyOgorCSAgb3N0ciA8PCAicXVvdGVkIGNoYXJcbiI7CisJICBicmVhazsKKwljYXNlIF9TX3Rva2VuX3N1YmV4cHJfYmVnaW46CisJICBvc3RyIDw8ICJzdWJleHByIGJlZ2luXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl9zdWJleHByX2VuZDoKKwkgIG9zdHIgPDwgInN1YmV4cHIgZW5kXG4iOworCSAgYnJlYWs7CisJY2FzZSBfU190b2tlbl93b3JkX2JlZ2luOgorCSAgb3N0ciA8PCAid29yZCBiZWdpblxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fd29yZF9lbmQ6CisJICBvc3RyIDw8ICJ3b3JkIGVuZFxuIjsKKwkgIGJyZWFrOworCWNhc2UgX1NfdG9rZW5fdW5rbm93bjoKKwkgIG9zdHIgPDwgIi0tIHVua25vd24gdG9rZW4gLS1cbiI7CisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHVybiBvc3RyOworICAgIH0KKyNlbmRpZgorCisgIC8vIEJ1aWxkcyBhbiBORkEgZnJvbSBhbiBpbnB1dCBpdGVyYXRvciBpbnRlcnZhbC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgY2xhc3MgX0NvbXBpbGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0luSXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0l0ZXJUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5JdGVyPjo6dmFsdWVfdHlwZSBfQ2hhclQ7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD4gICAgICAgICAgICAgICAgICAgICAgICAgIF9TdHJpbmdUOworICAgICAgdHlwZWRlZiByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSAgICAgICAgICAgICAgICBfRmxhZ1Q7CisKKyAgICBwdWJsaWM6CisgICAgICBfQ29tcGlsZXIoY29uc3QgX0luSXRlciYgX19iLCBjb25zdCBfSW5JdGVyJiBfX2UsCisJCV9UcmFpdHNUJiBfX3RyYWl0cywgX0ZsYWdUIF9fZmxhZ3MpOworCisgICAgICBjb25zdCBfTmZhJgorICAgICAgX01fbmZhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0YXRlX3N0b3JlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfU2Nhbm5lcjxfSW5JdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9TY2FubmVyVDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NjYW5uZXJUOjpfVG9rZW5UICAgICAgICAgICAgICAgICAgICBfVG9rZW5UOworICAgICAgdHlwZWRlZiBzdGQ6OnN0YWNrPF9TdGF0ZVNlcSwgc3RkOjp2ZWN0b3I8X1N0YXRlU2VxPiA+IF9TdGFja1Q7CisgICAgICB0eXBlZGVmIF9SYW5nZU1hdGNoZXI8X0luSXRlciwgX1RyYWl0c1Q+ICAgICAgICAgICAgICAgX1JNYXRjaGVyVDsKKworICAgICAgLy8gYWNjZXB0cyBhIHNwZWNpZmljIHRva2VuIG9yIHJldHVybnMgZmFsc2UuCisgICAgICBib29sCisgICAgICBfTV9tYXRjaF90b2tlbihfVG9rZW5UIF9fdG9rZW4pOworCisgICAgICB2b2lkCisgICAgICBfTV9kaXNqdW5jdGlvbigpOworCisgICAgICBib29sCisgICAgICBfTV9hbHRlcm5hdGl2ZSgpOworCisgICAgICBib29sCisgICAgICBfTV90ZXJtKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2Fzc2VydGlvbigpOworCisgICAgICBib29sCisgICAgICBfTV9xdWFudGlmaWVyKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2F0b20oKTsKKworICAgICAgYm9vbAorICAgICAgX01fYnJhY2tldF9leHByZXNzaW9uKCk7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2JyYWNrZXRfbGlzdChfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9mb2xsb3dfbGlzdChfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9mb2xsb3dfbGlzdDIoX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fZXhwcmVzc2lvbl90ZXJtKF9STWF0Y2hlclQmIF9fbWF0Y2hlcik7CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3JhbmdlX2V4cHJlc3Npb24oX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fc3RhcnRfcmFuZ2UoX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgYm9vbAorICAgICAgX01fY29sbGF0aW5nX3N5bWJvbChfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9lcXVpdmFsZW5jZV9jbGFzcyhfUk1hdGNoZXJUJiBfX21hdGNoZXIpOworCisgICAgICBib29sCisgICAgICBfTV9jaGFyYWN0ZXJfY2xhc3MoX1JNYXRjaGVyVCYgX19tYXRjaGVyKTsKKworICAgICAgaW50CisgICAgICBfTV9jdXJfaW50X3ZhbHVlKGludCBfX3JhZGl4KTsKKworICAgIHByaXZhdGU6CisgICAgICBfVHJhaXRzVCYgICAgICBfTV90cmFpdHM7CisgICAgICBfU2Nhbm5lclQgICAgICBfTV9zY2FubmVyOworICAgICAgX1N0cmluZ1QgICAgICAgX01fY3VyX3ZhbHVlOworICAgICAgX05mYSAgICAgICAgICAgX01fc3RhdGVfc3RvcmU7CisgICAgICBfU3RhY2tUICAgICAgICBfTV9zdGFjazsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9Db21waWxlcihjb25zdCBfSW5JdGVyJiBfX2IsIGNvbnN0IF9Jbkl0ZXImIF9fZSwgX1RyYWl0c1QmIF9fdHJhaXRzLAorCSAgICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46Ol9GbGFnVCBfX2ZsYWdzKQorICAgIDogX01fdHJhaXRzKF9fdHJhaXRzKSwgX01fc2Nhbm5lcihfX2IsIF9fZSwgX19mbGFncywgX01fdHJhaXRzLmdldGxvYygpKSwKKyAgICAgIF9NX3N0YXRlX3N0b3JlKF9fZmxhZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfU3RhcnRUYWdnZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9TdGFydDsKKyAgICAgIHR5cGVkZWYgX0VuZFRhZ2dlcjxfSW5JdGVyLCBfVHJhaXRzVD4gX0VuZDsKKworICAgICAgX1N0YXRlU2VxIF9fcihfTV9zdGF0ZV9zdG9yZSwKKyAgICAgIAkJICAgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9zdWJleHByX2JlZ2luKF9TdGFydCgwKSkpOworICAgICAgX01fZGlzanVuY3Rpb24oKTsKKyAgICAgIGlmICghX01fc3RhY2suZW1wdHkoKSkKKwl7CisJICBfX3IuX01fYXBwZW5kKF9NX3N0YWNrLnRvcCgpKTsKKwkgIF9NX3N0YWNrLnBvcCgpOworCX0KKyAgICAgIF9fci5fTV9hcHBlbmQoX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X3N1YmV4cHJfZW5kKDAsIF9FbmQoMCkpKTsKKyAgICAgIF9fci5fTV9hcHBlbmQoX01fc3RhdGVfc3RvcmUuX01faW5zZXJ0X2FjY2VwdCgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX21hdGNoX3Rva2VuKF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46Ol9Ub2tlblQgdG9rZW4pCisgICAgeyAKKyAgICAgIGlmICh0b2tlbiA9PSBfTV9zY2FubmVyLl9NX3Rva2VuKCkpCisJeworCSAgX01fY3VyX3ZhbHVlID0gX01fc2Nhbm5lci5fTV92YWx1ZSgpOworCSAgX01fc2Nhbm5lci5fTV9hZHZhbmNlKCk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIHZvaWQKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9kaXNqdW5jdGlvbigpCisgICAgeworICAgICAgdGhpcy0+X01fYWx0ZXJuYXRpdmUoKTsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX29yKSkKKwl7CisJICBfU3RhdGVTZXEgX19hbHQxID0gX01fc3RhY2sudG9wKCk7IF9NX3N0YWNrLnBvcCgpOworCSAgdGhpcy0+X01fZGlzanVuY3Rpb24oKTsKKwkgIF9TdGF0ZVNlcSBfX2FsdDIgPSBfTV9zdGFjay50b3AoKTsgX01fc3RhY2sucG9wKCk7CisJICBfTV9zdGFjay5wdXNoKF9TdGF0ZVNlcShfX2FsdDEsIF9fYWx0MikpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2FsdGVybmF0aXZlKCkKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01fdGVybSgpKQorCXsKKwkgIF9TdGF0ZVNlcSBfX3JlID0gX01fc3RhY2sudG9wKCk7IF9NX3N0YWNrLnBvcCgpOworCSAgdGhpcy0+X01fYWx0ZXJuYXRpdmUoKTsKKwkgIGlmICghX01fc3RhY2suZW1wdHkoKSkKKwkgICAgeworCSAgICAgIF9fcmUuX01fYXBwZW5kKF9NX3N0YWNrLnRvcCgpKTsKKwkgICAgICBfTV9zdGFjay5wb3AoKTsKKwkgICAgfQorCSAgX01fc3RhY2sucHVzaChfX3JlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3Rlcm0oKQorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9hc3NlcnRpb24oKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIGlmICh0aGlzLT5fTV9hdG9tKCkpCisJeworCSAgdGhpcy0+X01fcXVhbnRpZmllcigpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYXNzZXJ0aW9uKCkKKyAgICB7CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9saW5lX2JlZ2luKSkKKwl7CisJICAvLyBfX20ucHVzaChfTWF0Y2hlcjo6X1Nfb3Bjb2RlX2xpbmVfYmVnaW4pOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fbGluZV9lbmQpKQorCXsKKwkgIC8vIF9fbS5wdXNoKF9NYXRjaGVyOjpfU19vcGNvZGVfbGluZV9lbmQpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fd29yZF9iZWdpbikpCisJeworCSAgLy8gX19tLnB1c2goX01hdGNoZXI6Ol9TX29wY29kZV93b3JkX2JlZ2luKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3dvcmRfZW5kKSkKKwl7CisJICAvLyBfX20ucHVzaChfTWF0Y2hlcjo6X1Nfb3Bjb2RlX3dvcmRfZW5kKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3F1YW50aWZpZXIoKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2Nsb3N1cmUwKSkKKwl7CisJICBpZiAoX01fc3RhY2suZW1wdHkoKSkKKwkgICAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZHJlcGVhdCk7CisJICBfU3RhdGVTZXEgX19yKF9NX3N0YWNrLnRvcCgpLCAtMSk7CisJICBfX3IuX01fYXBwZW5kKF9fci5fTV9mcm9udCgpKTsKKwkgIF9NX3N0YWNrLnBvcCgpOworCSAgX01fc3RhY2sucHVzaChfX3IpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY2xvc3VyZTEpKQorCXsKKwkgIGlmIChfTV9zdGFjay5lbXB0eSgpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhdGVfc3RvcmUsCisJCQlfTV9zdGF0ZV9zdG9yZS4KKwkJCV9NX2luc2VydF9hbHQoX1NfaW52YWxpZF9zdGF0ZV9pZCwKKwkJCQkgICAgICBfTV9zdGFjay50b3AoKS5fTV9mcm9udCgpKSk7CisJICBfTV9zdGFjay50b3AoKS5fTV9hcHBlbmQoX19yKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX29wdCkpCisJeworCSAgaWYgKF9NX3N0YWNrLmVtcHR5KCkpCisJICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhY2sudG9wKCksIC0xKTsKKwkgIF9NX3N0YWNrLnBvcCgpOworCSAgX01fc3RhY2sucHVzaChfX3IpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5faW50ZXJ2YWxfYmVnaW4pKQorCXsKKwkgIGlmIChfTV9zdGFjay5lbXB0eSgpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkcmVwZWF0KTsKKwkgIGlmICghX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kdXBfY291bnQpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYmFkYnJhY2UpOworCSAgX1N0YXRlU2VxIF9fcihfTV9zdGFjay50b3AoKSk7CisJICBpbnQgX19taW5fcmVwID0gX01fY3VyX2ludF92YWx1ZSgxMCk7CisJICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX21pbl9yZXA7ICsrX19pKQorCSAgICBfTV9zdGFjay50b3AoKS5fTV9hcHBlbmQoX19yLl9NX2Nsb25lKCkpOyAKKwkgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2NvbW1hKSkKKwkgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fZHVwX2NvdW50KSkKKwkgICAgICB7CisJCWludCBfX24gPSBfTV9jdXJfaW50X3ZhbHVlKDEwKSAtIF9fbWluX3JlcDsKKwkJaWYgKF9fbiA8IDApCisJCSAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX2JhZGJyYWNlKTsKKwkJZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwkJICB7CisJCSAgICBfU3RhdGVTZXEgX19yKF9NX3N0YXRlX3N0b3JlLAorCQkJCSAgX01fc3RhdGVfc3RvcmUuCisJCQkJICBfTV9pbnNlcnRfYWx0KF9TX2ludmFsaWRfc3RhdGVfaWQsCisJCQkJCQlfTV9zdGFjay50b3AoKS5fTV9mcm9udCgpKSk7CisJCSAgICBfTV9zdGFjay50b3AoKS5fTV9hcHBlbmQoX19yKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlfU3RhdGVTZXEgX19yKF9NX3N0YWNrLnRvcCgpLCAtMSk7CisJCV9fci5fTV9wdXNoX2JhY2soX19yLl9NX2Zyb250KCkpOworCQlfTV9zdGFjay5wb3AoKTsKKwkJX01fc3RhY2sucHVzaChfX3IpOworCSAgICAgIH0KKwkgIGlmICghX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9pbnRlcnZhbF9lbmQpKQorCSAgICBfX3Rocm93X3JlZ2V4X2Vycm9yKHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfYnJhY2UpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYXRvbSgpCisgICAgeworICAgICAgdHlwZWRlZiBfQ2hhck1hdGNoZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9DTWF0Y2hlcjsKKyAgICAgIHR5cGVkZWYgX1N0YXJ0VGFnZ2VyPF9Jbkl0ZXIsIF9UcmFpdHNUPiBfU3RhcnQ7CisgICAgICB0eXBlZGVmIF9FbmRUYWdnZXI8X0luSXRlciwgX1RyYWl0c1Q+IF9FbmQ7CisKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2FueWNoYXIpKQorCXsKKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9NX3N0YXRlX3N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9BbnlNYXRjaGVyKSkpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fb3JkX2NoYXIpKQorCXsKKwkgIF9NX3N0YWNrLnB1c2goX1N0YXRlU2VxKF9NX3N0YXRlX3N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9DTWF0Y2hlcihfTV9jdXJfdmFsdWVbMF0sIF9NX3RyYWl0cykpKSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9xdW90ZWRfY2hhcikpCisJeworCSAgLy8gbm90ZSB0aGF0IGluIHRoZSBFQ01BIGdyYW1tYXIsIHRoaXMgY2FzZSBjb3ZlcnMgYmFja3JlZnMuCisJICBfTV9zdGFjay5wdXNoKF9TdGF0ZVNlcShfTV9zdGF0ZV9zdG9yZSwKKwkJCQkgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyCisJCQkJICAoX0NNYXRjaGVyKF9NX2N1cl92YWx1ZVswXSwgX01fdHJhaXRzKSkpKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2JhY2tyZWYpKQorCXsKKwkgIC8vIF9fbS5wdXNoKF9NYXRjaGVyOjpfU19vcGNvZGVfb3JkY2hhciwgX01fY3VyX3ZhbHVlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3N1YmV4cHJfYmVnaW4pKQorCXsKKwkgIGludCBfX21hcmsgPSBfTV9zdGF0ZV9zdG9yZS5fTV9zdWJfY291bnQoKTsKKwkgIF9TdGF0ZVNlcSBfX3IoX01fc3RhdGVfc3RvcmUsCisJCQlfTV9zdGF0ZV9zdG9yZS4KKwkJCV9NX2luc2VydF9zdWJleHByX2JlZ2luKF9TdGFydChfX21hcmspKSk7CisJICB0aGlzLT5fTV9kaXNqdW5jdGlvbigpOworCSAgaWYgKCFfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX3N1YmV4cHJfZW5kKSkKKwkgICAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3BhcmVuKTsKKwkgIGlmICghX01fc3RhY2suZW1wdHkoKSkKKwkgICAgeworCSAgICAgIF9fci5fTV9hcHBlbmQoX01fc3RhY2sudG9wKCkpOworCSAgICAgIF9NX3N0YWNrLnBvcCgpOworCSAgICB9CisJICBfX3IuX01fYXBwZW5kKF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9zdWJleHByX2VuZAorCQkJKF9fbWFyaywgX0VuZChfX21hcmspKSk7CisJICBfTV9zdGFjay5wdXNoKF9fcik7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gX01fYnJhY2tldF9leHByZXNzaW9uKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9icmFja2V0X2V4cHJlc3Npb24oKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2JyYWNrZXRfYmVnaW4pKQorCXsKKwkgIF9STWF0Y2hlclQgX19tYXRjaGVyKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fbGluZV9iZWdpbiksCisJCQkgICAgICAgX01fdHJhaXRzKTsKKwkgIGlmICghX01fYnJhY2tldF9saXN0KF9fbWF0Y2hlcikKKwkgICAgICB8fCAhX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9icmFja2V0X2VuZCkpCisJICAgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9icmFjayk7CisJICBfTV9zdGFjay5wdXNoKF9TdGF0ZVNlcShfTV9zdGF0ZV9zdG9yZSwKKwkJCQkgIF9NX3N0YXRlX3N0b3JlLl9NX2luc2VydF9tYXRjaGVyKF9fbWF0Y2hlcikpKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgLy8gSWYgdGhlIGRhc2ggaXMgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBicmFja2V0IGV4cHJlc3Npb24sIGl0IGlzIG5vdAorICAvLyBzcGVjaWFsLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fYnJhY2tldF9saXN0KF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fZm9sbG93X2xpc3QoX19tYXRjaGVyKSkKKwl7CisJICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kYXNoKSkKKwkgICAgX19tYXRjaGVyLl9NX2FkZF9jaGFyKF9NX2N1cl92YWx1ZVswXSk7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9mb2xsb3dfbGlzdChfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeyByZXR1cm4gX01fZXhwcmVzc2lvbl90ZXJtKF9fbWF0Y2hlcikgJiYgX01fZm9sbG93X2xpc3QyKF9fbWF0Y2hlcik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fZm9sbG93X2xpc3QyKF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fZXhwcmVzc2lvbl90ZXJtKF9fbWF0Y2hlcikpCisJcmV0dXJuIF9NX2ZvbGxvd19saXN0MihfX21hdGNoZXIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9leHByZXNzaW9uX3Rlcm0oX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIHJldHVybiAoX01fY29sbGF0aW5nX3N5bWJvbChfX21hdGNoZXIpCisJICAgICAgfHwgX01fY2hhcmFjdGVyX2NsYXNzKF9fbWF0Y2hlcikKKwkgICAgICB8fCBfTV9lcXVpdmFsZW5jZV9jbGFzcyhfX21hdGNoZXIpCisJICAgICAgfHwgKF9NX3N0YXJ0X3JhbmdlKF9fbWF0Y2hlcikKKwkJICAmJiBfTV9yYW5nZV9leHByZXNzaW9uKF9fbWF0Y2hlcikpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX3JhbmdlX2V4cHJlc3Npb24oX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmICghX01fY29sbGF0aW5nX3N5bWJvbChfX21hdGNoZXIpKQorCWlmICghX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kYXNoKSkKKwkgIF9fdGhyb3dfcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl9yYW5nZSk7CisgICAgICBfX21hdGNoZXIuX01fbWFrZV9yYW5nZSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9zdGFydF9yYW5nZShfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeyByZXR1cm4gX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9kYXNoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXIsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIGJvb2wKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9jb2xsYXRpbmdfc3ltYm9sKF9STWF0Y2hlclQmIF9fbWF0Y2hlcikKKyAgICB7CisgICAgICBpZiAoX01fbWF0Y2hfdG9rZW4oX1NjYW5uZXJUOjpfU190b2tlbl9jb2xsZWxlbV9zaW5nbGUpKQorCXsKKwkgIF9fbWF0Y2hlci5fTV9hZGRfY2hhcihfTV9jdXJfdmFsdWVbMF0pOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY29sbHN5bWJvbCkpCisJeworCSAgX19tYXRjaGVyLl9NX2FkZF9jb2xsYXRpbmdfZWxlbWVudChfTV9jdXJfdmFsdWUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBib29sCisgICAgX0NvbXBpbGVyPF9Jbkl0ZXIsIF9UcmFpdHNUPjo6CisgICAgX01fZXF1aXZhbGVuY2VfY2xhc3MoX1JNYXRjaGVyVCYgX19tYXRjaGVyKQorICAgIHsKKyAgICAgIGlmIChfTV9tYXRjaF90b2tlbihfU2Nhbm5lclQ6Ol9TX3Rva2VuX2VxdWl2X2NsYXNzX25hbWUpKQorCXsKKwkgIF9fbWF0Y2hlci5fTV9hZGRfZXF1aXZhbGVuY2VfY2xhc3MoX01fY3VyX3ZhbHVlKTsKKwkgIHJldHVybiB0cnVlOworCX0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgYm9vbAorICAgIF9Db21waWxlcjxfSW5JdGVyLCBfVHJhaXRzVD46OgorICAgIF9NX2NoYXJhY3Rlcl9jbGFzcyhfUk1hdGNoZXJUJiBfX21hdGNoZXIpCisgICAgeworICAgICAgaWYgKF9NX21hdGNoX3Rva2VuKF9TY2FubmVyVDo6X1NfdG9rZW5fY2hhcl9jbGFzc19uYW1lKSkKKwl7CisJICBfX21hdGNoZXIuX01fYWRkX2NoYXJhY3Rlcl9jbGFzcyhfTV9jdXJfdmFsdWUpOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyLCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBpbnQKKyAgICBfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+OjoKKyAgICBfTV9jdXJfaW50X3ZhbHVlKGludCBfX3JhZGl4KQorICAgIHsKKyAgICAgIGludCBfX3YgPSAwOworICAgICAgZm9yICh0eXBlbmFtZSBfU3RyaW5nVDo6c2l6ZV90eXBlIF9faSA9IDA7CisJICAgX19pIDwgX01fY3VyX3ZhbHVlLmxlbmd0aCgpOyArK19faSkKKwlfX3YgPV9fdiAqIF9fcmFkaXggKyBfTV90cmFpdHMudmFsdWUoX01fY3VyX3ZhbHVlW19faV0sIF9fcmFkaXgpOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlciwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgX0F1dG9tYXRvblB0cgorICAgIF9fY29tcGlsZShjb25zdCBfSW5JdGVyJiBfX2IsIGNvbnN0IF9Jbkl0ZXImIF9fZSwgX1RyYWl0c1QmIF9fdCwKKwkgICAgICByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBfX2YpCisgICAgeyByZXR1cm4gX0F1dG9tYXRvblB0cihuZXcgX05mYShfQ29tcGlsZXI8X0luSXRlciwgX1RyYWl0c1Q+KF9fYiwgX19lLCBfX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mKS5fTV9uZmEoKSkpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19yZWdleAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKy8qIHZpbTogc2V0IHRzPTggc3c9MiBzdHM9MjogKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9jb25zdGFudHMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGRlZjNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMzAxIEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleF9jb25zdGFudHMuaAorICogIEBicmllZiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgdGhlIHN0ZCByZWdleCBsaWJyYXJ5LgorICoKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKy8qKgorICogQG5hbWVzcGFjZSBzdGQ6OnJlZ2V4X2NvbnN0YW50cworICogQGJyaWVmIElTTyBDKystMHggZW50aXRpZXMgc3ViIG5hbWVzcGFjZSBmb3IgcmVnZXguCisgKi8KK25hbWVzcGFjZSByZWdleF9jb25zdGFudHMKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBuYW1lIDUuMSBSZWd1bGFyIEV4cHJlc3Npb24gU3ludGF4IE9wdGlvbnMKKyAgICovCisgIC8vQHsKKyAgZW51bSBfX3N5bnRheF9vcHRpb24KKyAgICB7CisgICAgICBfU19pY2FzZSwKKyAgICAgIF9TX25vc3VicywKKyAgICAgIF9TX29wdGltaXplLAorICAgICAgX1NfY29sbGF0ZSwKKyAgICAgIF9TX0VDTUFTY3JpcHQsCisgICAgICBfU19iYXNpYywKKyAgICAgIF9TX2V4dGVuZGVkLAorICAgICAgX1NfYXdrLAorICAgICAgX1NfZ3JlcCwKKyAgICAgIF9TX2VncmVwLAorICAgICAgX1Nfc3ludGF4X2xhc3QKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgVGhpcyBpcyBhIGJpdG1hc2sgdHlwZSBpbmRpY2F0aW5nIGhvdyB0byBpbnRlcnByZXQgdGhlIHJlZ2V4LgorICAgKgorICAgKiBUaGUgQGMgc3ludGF4X29wdGlvbl90eXBlIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnV0IGl0IGlzIHZhbGlkIHRvCisgICAqIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIHRoZXNlIHZhbHVlcyBhbmQgZXhwZWN0IHRoZSByaWdodCB0aGluZyB0bworICAgKiBoYXBwZW4uCisgICAqCisgICAqIEEgdmFsaWQgdmFsdWUgb2YgdHlwZSBzeW50YXhfb3B0aW9uX3R5cGUgc2hhbGwgaGF2ZSBleGFjdGx5IG9uZSBvZiB0aGUKKyAgICogZWxlbWVudHMgQGMgRUNNQVNjcmlwdCwgQGMgYmFzaWMsIEBjIGV4dGVuZGVkLCBAYyBhd2ssIEBjIGdyZXAsIEBjIGVncmVwCisgICAqICVzZXQuCisgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGludCBzeW50YXhfb3B0aW9uX3R5cGU7CisKKyAgLyoqIAorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgb2YgcmVndWxhciBleHByZXNzaW9ucyBhZ2FpbnN0IGEgY2hhcmFjdGVyCisgICAqIHNlcXVlbmNlIHNoYWxsIGJlIHBlcmZvcm1lZCB3aXRob3V0IHJlZ2FyZCB0byBjYXNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgaWNhc2UgICAgICA9IDEgPDwgX1NfaWNhc2U7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHdoZW4gYSByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCBhZ2FpbnN0IGEgY2hhcmFjdGVyCisgICAqIGNvbnRhaW5lciBzZXF1ZW5jZSwgbm8gc3ViLWV4cHJlc3Npb24gbWF0Y2hlcyBhcmUgdG8gYmUgc3RvcmVkIGluIHRoZQorICAgKiBzdXBwbGllZCBtYXRjaF9yZXN1bHRzIHN0cnVjdHVyZS4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIG5vc3VicyAgICAgPSAxIDw8IF9TX25vc3ViczsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgc2hvdWxkIHBheSBtb3JlIGF0dGVudGlvbiB0bworICAgKiB0aGUgc3BlZWQgd2l0aCB3aGljaCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBtYXRjaGVkLCBhbmQgbGVzcyB0byB0aGUKKyAgICogc3BlZWQgd2l0aCB3aGljaCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBhcmUgY29uc3RydWN0ZWQuIE90aGVyd2lzZQorICAgKiBpdCBoYXMgbm8gZGV0ZWN0YWJsZSBlZmZlY3Qgb24gdGhlIHByb2dyYW0gb3V0cHV0LgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBzeW50YXhfb3B0aW9uX3R5cGUgb3B0aW1pemUgICA9IDEgPDwgX1Nfb3B0aW1pemU7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IGNoYXJhY3RlciByYW5nZXMgb2YgdGhlIGZvcm0gW2EtYl0gc2hvdWxkIGJlIGxvY2FsZQorICAgKiBzZW5zaXRpdmUuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBjb2xsYXRlICAgID0gMSA8PCBfU19jb2xsYXRlOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBFQ01BU2NyaXB0IGluIEVDTUEtMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQKKyAgICogTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBhcworICAgKiBtb2RpZmllZCBpbiBzZWN0aW9uIFsyOC4xM10uICBUaGlzIGdyYW1tYXIgaXMgc2ltaWxhciB0byB0aGF0IGRlZmluZWQKKyAgICogaW4gdGhlIFBFUkwgc2NyaXB0aW5nIGxhbmd1YWdlIGJ1dCBleHRlbmRlZCB3aXRoIGVsZW1lbnRzIGZvdW5kIGluIHRoZQorICAgKiBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gZ3JhbW1hci4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIEVDTUFTY3JpcHQgPSAxIDw8IF9TX0VDTUFTY3JpcHQ7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEsCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIEJhc2UgRGVmaW5pdGlvbnMgYW5kCisgICAqIEhlYWRlcnMsIFNlY3Rpb24gOSwgUmVndWxhciBFeHByZXNzaW9ucyBbSUVFRSwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAtLQorICAgKiBQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBJRUVFIFN0YW5kYXJkIDEwMDMuMS0yMDAxXS4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgc3ludGF4X29wdGlvbl90eXBlIGJhc2ljICAgICAgPSAxIDw8IF9TX2Jhc2ljOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25zIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLAorICAgKiBQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBCYXNlIERlZmluaXRpb25zIGFuZCBIZWFkZXJzLAorICAgKiBTZWN0aW9uIDksIFJlZ3VsYXIgRXhwcmVzc2lvbnMuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZCAgID0gMSA8PCBfU19leHRlbmRlZDsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgUE9TSVggdXRpbGl0eSBhd2sgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcworICAgKiBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIGV4dGVuZGVkLCBleGNlcHQgdGhhdCBDLXN0eWxlIGVzY2FwZQorICAgKiBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZC4gIFRoZXNlIHNlcXVlbmNlcyBhcmU6CisgICAqIFxcXFwsIFxcYSwgXFxiLCBcXGYsIFxcbiwgXFxyLCBcXHQgLCBcXHYsIFxcJmFwb3M7LCAmYXBvczssCisgICAqIGFuZCBcXGRkZCAod2hlcmUgZGRkIGlzIG9uZSwgdHdvLCBvciB0aHJlZSBvY3RhbCBkaWdpdHMpLiAgCisgICAqLworICBzdGF0aWMgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBhd2sgICAgICAgID0gMSA8PCBfU19hd2s7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIHV0aWxpdHkgZ3JlcCBpbiBJRUVFIFN0ZCAxMDAzLjEtMjAwMS4gIFRoaXMgb3B0aW9uIGlzCisgICAqIGlkZW50aWNhbCB0byBzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMsIGV4Y2VwdCB0aGF0IG5ld2xpbmVzIGFyZSB0cmVhdGVkCisgICAqIGFzIHdoaXRlc3BhY2UuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBncmVwICAgICAgID0gMSA8PCBfU19ncmVwOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgd2hlbiBnaXZlbiB0aGUgLUUgb3B0aW9uIGluCisgICAqIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSAKKyAgICogZXh0ZW5kZWQsIGV4Y2VwdCB0aGF0IG5ld2xpbmVzIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIHN5bnRheF9vcHRpb25fdHlwZSBlZ3JlcCAgICAgID0gMSA8PCBfU19lZ3JlcDsKKworICAvL0B9CisKKyAgLyoqCisgICAqIEBuYW1lIDUuMiBNYXRjaGluZyBSdWxlcworICAgKgorICAgKiBNYXRjaGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBbZmlyc3QsCisgICAqIGxhc3QpIHByb2NlZWRzIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGdyYW1tYXIgc3BlY2lmaWVkIGZvciB0aGUKKyAgICogcmVndWxhciBleHByZXNzaW9uIG9iamVjdCwgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBlZmZlY3RzIGxpc3RlZAorICAgKiBiZWxvdyBmb3IgYW55IGJpdG1hc2sgZWxlbWVudHMgc2V0LgorICAgKgorICAgKi8KKyAgLy9AeworCisgIGVudW0gX19tYXRjaF9mbGFnCisgICAgeworICAgICAgX1Nfbm90X2JvbCwKKyAgICAgIF9TX25vdF9lb2wsCisgICAgICBfU19ub3RfYm93LAorICAgICAgX1Nfbm90X2VvdywKKyAgICAgIF9TX2FueSwKKyAgICAgIF9TX25vdF9udWxsLAorICAgICAgX1NfY29udGludW91cywKKyAgICAgIF9TX3ByZXZfYXZhaWwsCisgICAgICBfU19zZWQsCisgICAgICBfU19ub19jb3B5LAorICAgICAgX1NfZmlyc3Rfb25seSwKKyAgICAgIF9TX21hdGNoX2ZsYWdfbGFzdAorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlIGluZGljYXRpbmcgcmVnZXggbWF0Y2hpbmcgcnVsZXMuCisgICAqCisgICAqIFRoZSBAYyBtYXRjaF9mbGFnX3R5cGUgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICogcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIHJpZ2h0IHRoaW5nIHRvCisgICAqIGhhcHBlbi4KKyAgICovCisgIHR5cGVkZWYgc3RkOjpiaXRzZXQ8X1NfbWF0Y2hfZmxhZ19sYXN0PiBtYXRjaF9mbGFnX3R5cGU7CisKKyAgLyoqCisgICAqIFRoZSBkZWZhdWx0IG1hdGNoaW5nIHJ1bGVzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfZGVmYXVsdCAgICAgPSAwOworCisgIC8qKgorICAgKiBUaGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0CisgICAqIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSwgc28gdGhlIGNoYXJhY3RlciAoXikgaW4gdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgbWF0Y2ggW2ZpcnN0LCBmaXJzdCkuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm9sICAgICA9IDEgPDwgX1Nfbm90X2JvbDsKKworICAvKioKKyAgICogVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0CisgICAqIGlzIG5vdCBhdCB0aGUgZW5kIG9mIGEgbGluZSwgc28gdGhlIGNoYXJhY3RlciAoJCkgaW4gdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgbWF0Y2ggW2xhc3QsIGxhc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X2VvbCAgICAgPSAxIDw8IF9TX25vdF9lb2w7CisgICAKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIFxcYiBpcyBub3QgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWItc2VxdWVuY2UKKyAgICogW2ZpcnN0LGZpcnN0KS4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9ib3cgICAgID0gMSA8PCBfU19ub3RfYm93OworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBcXGIgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHN1Yi1zZXF1ZW5jZQorICAgKiBbbGFzdCxsYXN0KS4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9lb3cgICAgID0gMSA8PCBfU19ub3RfZW93OworICAgCisgIC8qKgorICAgKiBJZiBtb3JlIHRoYW4gb25lIG1hdGNoIGlzIHBvc3NpYmxlIHRoZW4gYW55IG1hdGNoIGlzIGFuIGFjY2VwdGFibGUKKyAgICogcmVzdWx0LgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfYW55ICAgICAgICAgPSAxIDw8IF9TX2FueTsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gZG9lcyBub3QgbWF0Y2ggYW4gZW1wdHkgc2VxdWVuY2UuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfbnVsbCAgICA9IDEgPDwgX1Nfbm90X251bGw7CisgICAKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIG9ubHkgbWF0Y2hlcyBhIHN1Yi1zZXF1ZW5jZSB0aGF0IGJlZ2lucyBhdCBmaXJzdCAuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9jb250aW51b3VzICA9IDEgPDwgX1NfY29udGludW91czsKKyAgIAorICAvKioKKyAgICogLS1maXJzdCBpcyBhIHZhbGlkIGl0ZXJhdG9yIHBvc2l0aW9uLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRoZW4gdGhlCisgICAqIGZsYWdzIG1hdGNoX25vdF9ib2wgYW5kIG1hdGNoX25vdF9ib3cgYXJlIGlnbm9yZWQgYnkgdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBhbGdvcml0aG1zIDI4LjExIGFuZCBpdGVyYXRvcnMgMjguMTIuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9wcmV2X2F2YWlsICA9IDEgPDwgX1NfcHJldl9hdmFpbDsKKworICAvKioKKyAgICogV2hlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpcyB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzdHJpbmcsIHRoZQorICAgKiBuZXcgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBFQ01BU2NyaXB0IHJlcGxhY2UKKyAgICogZnVuY3Rpb24gaW4gRUNNQS0gMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQgTGFuZ3VhZ2UKKyAgICogU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBwYXJ0IDE1LjUuNC4xMQorICAgKiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UuIEluIGFkZGl0aW9uLCBkdXJpbmcgc2VhcmNoIGFuZCByZXBsYWNlCisgICAqIG9wZXJhdGlvbnMgYWxsIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAqIGFyZSBsb2NhdGVkIGFuZCByZXBsYWNlZCwgYW5kIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCB0aGF0IGRpZCBub3QgbWF0Y2gKKyAgICogdGhlIGV4cHJlc3Npb24gYXJlIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqIAorICAgKiBGb3JtYXQgc3RyaW5ncyAoZnJvbSBFQ01BLTI2MiBbMTUuNS40LjExXSk6CisgICAqIEBsaSAkJCAgVGhlIGRvbGxhci1zaWduIGl0c2VsZiAoJCkKKyAgICogQGxpICQmICBUaGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqIEBsaSAkYCAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgcHJlY2VkZXMgdGhlIG1hdGNoZWQgc3Vic3RyaW5nLgorICAgKiAgICAgICAgIFRoaXMgd291bGQgYmUgbWF0Y2hfcmVzdWx0czo6cHJlZml4KCkuCisgICAqIEBsaSAkJyAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgZm9sbG93cyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqICAgICAgICAgVGhpcyB3b3VsZCBiZSBtYXRjaF9yZXN1bHRzOjpzdWZmaXgoKS4KKyAgICogQGxpICRuICBUaGUgbnRoIGNhcHR1cmUsIHdoZXJlIG4gaXMgaW4gWzEsOV0gYW5kICRuIGlzIG5vdCBmb2xsb3dlZCBieSBhCisgICAqICAgICAgICAgZGVjaW1hbCBkaWdpdC4gIElmIG4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUKKyAgICogICAgICAgICBpcyB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuICBJZiBuID4KKyAgICogICAgICAgICBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICogQGxpICRubiBUaGUgbm50aCBjYXB0dXJlLCB3aGVyZSBubiBpcyBhIHR3by1kaWdpdCBkZWNpbWFsIG51bWJlciBvbgorICAgKiAgICAgICAgIFswMSwgOTldLiAgSWYgbm4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUgaXMKKyAgICogICAgICAgICB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuIElmCisgICAqICAgICAgICAgbm4gPiBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgbWF0Y2hfZmxhZ190eXBlIGZvcm1hdF9kZWZhdWx0ICAgID0gMDsKKworICAvKioKKyAgICogV2hlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpcyB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzdHJpbmcsIHRoZQorICAgKiBuZXcgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBQT1NJWCBzZWQgdXRpbGl0eQorICAgKiBpbiBJRUVFIFN0ZCAxMDAzLjEtIDIwMDEgW0lFRUUsIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgLS0gUG9ydGFibGUKKyAgICogT3BlcmF0aW5nIFN5c3RlbSBJbnRlcmZhY2UgKFBPU0lYKSwgSUVFRSBTdGFuZGFyZCAxMDAzLjEtMjAwMV0uCisgICAqLworICBzdGF0aWMgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfc2VkICAgICAgICA9IDEgPDwgX1Nfc2VkOworCisgIC8qKgorICAgKiBEdXJpbmcgYSBzZWFyY2ggYW5kIHJlcGxhY2Ugb3BlcmF0aW9uLCBzZWN0aW9ucyBvZiB0aGUgY2hhcmFjdGVyCisgICAqIGNvbnRhaW5lciBzZXF1ZW5jZSBiZWluZyBzZWFyY2hlZCB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uIHNoYWxsIG5vdCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfbm9fY29weSAgICA9IDEgPDwgX1Nfbm9fY29weTsKKworICAvKioKKyAgICogV2hlbiBzcGVjaWZpZWQgZHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgb25seSB0aGUgZmlyc3QKKyAgICogb2NjdXJyZW5jZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHNoYWxsIGJlIHJlcGxhY2VkLgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X2ZpcnN0X29ubHkgPSAxIDw8IF9TX2ZpcnN0X29ubHk7CisKKyAgLy9AfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cworfSAvLyBuYW1lc3BhY2UKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X2N1cnNvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X2N1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWFjMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXhfY3Vyc29yLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfY3Vyc29yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3JlZ2V4Cit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEFCQyBmb3IgcGF0dGVybiBtYXRjaGluZworICBzdHJ1Y3QgX1BhdHRlcm5DdXJzb3IKKyAgeworICAgIHZpcnR1YWwgfl9QYXR0ZXJuQ3Vyc29yKCkgeyB9OworICAgIHZpcnR1YWwgdm9pZCBfTV9uZXh0KCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBfTV9hdF9lbmQoKSBjb25zdCA9IDA7CisgIH07CisKKyAgLy8gUHJvdmlkZXMgYSBjdXJzb3IgaW50byB0aGUgc3BlY2lmaWMgdGFyZ2V0IHN0cmluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJUPgorICAgIGNsYXNzIF9TcGVjaWFsaXplZEN1cnNvcgorICAgIDogcHVibGljIF9QYXR0ZXJuQ3Vyc29yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIF9TcGVjaWFsaXplZEN1cnNvcihjb25zdCBfRndkSXRlclQmIF9fYiwgY29uc3QgX0Z3ZEl0ZXJUIF9fZSkKKyAgICAgIDogX01fYihfX2IpLCBfTV9jKF9fYiksIF9NX2UoX19lKQorICAgICAgeyB9CisKKyAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Gd2RJdGVyVD46OnZhbHVlX3R5cGUKKyAgICAgIF9NX2N1cnJlbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKl9NX2M7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbmV4dCgpCisgICAgICB7ICsrX01fYzsgfQorCisgICAgICBfRndkSXRlclQKKyAgICAgIF9NX3BvcygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jOyB9CisKKyAgICAgIGNvbnN0IF9Gd2RJdGVyVCYKKyAgICAgIF9NX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2I7IH0KKworICAgICAgY29uc3QgX0Z3ZEl0ZXJUJgorICAgICAgX01fZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2U7IH0KKworICAgICAgYm9vbAorICAgICAgX01fYXRfZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2MgPT0gX01fZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9Gd2RJdGVyVCBfTV9iOworICAgICAgX0Z3ZEl0ZXJUIF9NX2M7CisgICAgICBfRndkSXRlclQgX01fZTsKKyAgICB9OworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBjdXJzb3Igc3BlY2lhbGl6ZWQgZm9yIGFuIGl0ZXJhdG9yIGNsYXNzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkSXRlclQ+CisgICAgaW5saW5lIF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+CisgICAgX19jdXJzb3IoY29uc3QgX0Z3ZEl0ZXJUJiBfX2IsIGNvbnN0IF9Gd2RJdGVyVCBfX2UpCisgICAgeyByZXR1cm4gX1NwZWNpYWxpemVkQ3Vyc29yPF9Gd2RJdGVyVD4oX19iLCBfX2UpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19yZWdleAorfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9lcnJvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3YTBmYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9lcnJvci5oCkBAIC0wLDAgKzEsMTYxIEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSBiaXRzL3JlZ2V4X2Vycm9yLmgKKyAqIEBicmllZiBFcnJvciBhbmQgZXhjZXB0aW9uIG9iamVjdHMgZm9yIHRoZSBzdGQgcmVnZXggbGlicmFyeS4KKyAqCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAbmFtZSA1LjMgRXJyb3IgVHlwZXMKKyAgICovCisgIC8vQHsKKyAKKyAgZW51bSBlcnJvcl90eXBlCisgICAgeworICAgICAgX1NfZXJyb3JfY29sbGF0ZSwKKyAgICAgIF9TX2Vycm9yX2N0eXBlLAorICAgICAgX1NfZXJyb3JfZXNjYXBlLAorICAgICAgX1NfZXJyb3JfYmFja3JlZiwKKyAgICAgIF9TX2Vycm9yX2JyYWNrLAorICAgICAgX1NfZXJyb3JfcGFyZW4sCisgICAgICBfU19lcnJvcl9icmFjZSwKKyAgICAgIF9TX2Vycm9yX2JhZGJyYWNlLAorICAgICAgX1NfZXJyb3JfcmFuZ2UsCisgICAgICBfU19lcnJvcl9zcGFjZSwKKyAgICAgIF9TX2Vycm9yX2JhZHJlcGVhdCwKKyAgICAgIF9TX2Vycm9yX2NvbXBsZXhpdHksCisgICAgICBfU19lcnJvcl9zdGFjaywKKyAgICAgIF9TX2Vycm9yX2xhc3QKKyAgICB9OworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBjb2xsYXRpbmcgZWxlbWVudCBuYW1lLiAqLworICBzdGF0aWMgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfY29sbGF0ZShfU19lcnJvcl9jb2xsYXRlKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY2hhcmFjdGVyIGNsYXNzIG5hbWUuICovCisgIHN0YXRpYyBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9jdHlwZShfU19lcnJvcl9jdHlwZSk7CisKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGVzY2FwZWQgY2hhcmFjdGVyLCBvciBhIHRyYWlsaW5nCisgICAqIGVzY2FwZS4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9lc2NhcGUoX1NfZXJyb3JfZXNjYXBlKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgYmFjayByZWZlcmVuY2UuICovCisgIHN0YXRpYyBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9iYWNrcmVmKF9TX2Vycm9yX2JhY2tyZWYpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCBbIGFuZCBdLiAqLworICBzdGF0aWMgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfYnJhY2soX1NfZXJyb3JfYnJhY2spOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCAoIGFuZCApLiAqLworICBzdGF0aWMgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfcGFyZW4oX1NfZXJyb3JfcGFyZW4pOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCB7IGFuZCB9ICovCisgIHN0YXRpYyBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9icmFjZShfU19lcnJvcl9icmFjZSk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIHJhbmdlIGluIGEge30gZXhwcmVzc2lvbi4gKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX2JhZGJyYWNlKF9TX2Vycm9yX2JhZGJyYWNlKTsKKworICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY2hhcmFjdGVyIHJhbmdlLAorICAgKiBzdWNoIGFzIFtiLWFdIGluIG1vc3QgZW5jb2RpbmdzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX3JhbmdlKF9TX2Vycm9yX3JhbmdlKTsKKworICAvKioKKyAgICogVGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gY29udmVydCB0aGUgZXhwcmVzc2lvbiBpbnRvIGEKKyAgICogZmluaXRlIHN0YXRlIG1hY2hpbmUuCisgICAqLworICBzdGF0aWMgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3Jfc3BhY2UoX1NfZXJyb3Jfc3BhY2UpOworCisgIC8qKgorICAgKiBPbmUgb2YgPGVtPio/K3s8ZW0+IHdhcyBub3QgcHJlY2VkZWQgYnkgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqLworICBzdGF0aWMgY29uc3RleHByIGVycm9yX3R5cGUgZXJyb3JfYmFkcmVwZWF0KF9TX2Vycm9yX2JhZHJlcGVhdCk7CisKKyAgLyoqCisgICAqIFRoZSBjb21wbGV4aXR5IG9mIGFuIGF0dGVtcHRlZCBtYXRjaCBhZ2FpbnN0IGEgcmVndWxhciBleHByZXNzaW9uCisgICAqIGV4Y2VlZGVkIGEgcHJlLXNldCBsZXZlbC4KKyAgICovCisgIHN0YXRpYyBjb25zdGV4cHIgZXJyb3JfdHlwZSBlcnJvcl9jb21wbGV4aXR5KF9TX2Vycm9yX2NvbXBsZXhpdHkpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAgICogcmVndWxhciBleHByZXNzaW9uIGNvdWxkIG1hdGNoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0ZXhwciBlcnJvcl90eXBlIGVycm9yX3N0YWNrKF9TX2Vycm9yX3N0YWNrKTsKKworICAvL0B9CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cworCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFs3LjhdIENsYXNzIHJlZ2V4X2Vycm9yCisgIC8qKgorICAgKiBAYnJpZWYgQSByZWd1bGFyIGV4cHJlc3Npb24gZXhjZXB0aW9uIGNsYXNzLgorICAgKiBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeSB0aHJvd3Mgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIG9uIGVycm9yLgorICAgKi8KKyAgY2xhc3MgcmVnZXhfZXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX01fY29kZTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSByZWdleF9lcnJvciBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWNvZGUgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICovCisgICAgZXhwbGljaXQKKyAgICByZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX19lY29kZSk7CisKKyAgICB2aXJ0dWFsIH5yZWdleF9lcnJvcigpIHRocm93KCk7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgR2V0cyB0aGUgcmVnZXggZXJyb3IgY29kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm5zIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqLworICAgIHJlZ2V4X2NvbnN0YW50czo6ZXJyb3JfdHlwZQorICAgIGNvZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2NvZGU7IH0KKyAgfTsKKworCisgIHZvaWQKKyAgX190aHJvd19yZWdleF9lcnJvcihyZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX19lY29kZSk7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMmJiMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9ncmVwX21hdGNoZXIuaApAQCAtMCwwICsxLDEzMiBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtyZWdleH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBjbGFzcyBzdWJfbWF0Y2g7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgY2xhc3MgbWF0Y2hfcmVzdWx0czsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIAorbmFtZXNwYWNlIF9fcmVnZXgKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gQSBfUmVzdWx0cyBmYWNhZGUgc3BlY2lhbGl6ZWQgZm9yIHdyYXBwaW5nIGEgdGVtcGxhdGVkIG1hdGNoX3Jlc3VsdHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGNsYXNzIF9TcGVjaWFsaXplZFJlc3VsdHMKKyAgICA6IHB1YmxpYyBfUmVzdWx0cworICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBfU3BlY2lhbGl6ZWRSZXN1bHRzKGNvbnN0IF9BdXRvbWF0b246Ol9TaXplVCBfX3NpemUsCisJCQkgIGNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+JiBfX2N1cnNvciwKKwkJCSAgbWF0Y2hfcmVzdWx0czxfRndkSXRlclQsIF9BbGxvYz4mIF9fbSk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9wb3MoaW50IF9faSwgaW50IF9faiwgY29uc3QgX1BhdHRlcm5DdXJzb3ImIF9fcGMpOworCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbWF0Y2hlZChpbnQgX19pLCBib29sIF9faXNfbWF0Y2hlZCkKKyAgICAgIHsgX01fcmVzdWx0cy5hdChfX2kpLm1hdGNoZWQgPSBfX2lzX21hdGNoZWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICBtYXRjaF9yZXN1bHRzPF9Gd2RJdGVyVCwgX0FsbG9jPiYgX01fcmVzdWx0czsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9TcGVjaWFsaXplZFJlc3VsdHM8X0Z3ZEl0ZXJULCBfQWxsb2M+OjoKKyAgICBfU3BlY2lhbGl6ZWRSZXN1bHRzKGNvbnN0IF9BdXRvbWF0b246Ol9TaXplVCBfX3NpemUsCisgICAgCQkJY29uc3QgX1NwZWNpYWxpemVkQ3Vyc29yPF9Gd2RJdGVyVD4mIF9fY3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcmVzdWx0czxfRndkSXRlclQsIF9BbGxvYz4mIF9fbSkKKyAgICA6IF9NX3Jlc3VsdHMoX19tKQorICAgIHsKKyAgICAgIF9NX3Jlc3VsdHMuY2xlYXIoKTsKKyAgICAgIF9NX3Jlc3VsdHMucmVzZXJ2ZShfX3NpemUgKyAyKTsKKyAgICAgIF9NX3Jlc3VsdHMucmVzaXplKF9fc2l6ZSk7CisgICAgICB0eXBlbmFtZSBtYXRjaF9yZXN1bHRzPF9Gd2RJdGVyVCwgX0FsbG9jPjo6dmFsdWVfdHlwZSBfX3NtOworICAgICAgX19zbS5maXJzdCA9IF9fc20uc2Vjb25kID0gX19jdXJzb3IuX01fYmVnaW4oKTsKKyAgICAgIF9NX3Jlc3VsdHMucHVzaF9iYWNrKF9fc20pOworICAgICAgX19zbS5maXJzdCA9IF9fc20uc2Vjb25kID0gX19jdXJzb3IuX01fZW5kKCk7CisgICAgICBfTV9yZXN1bHRzLnB1c2hfYmFjayhfX3NtKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJULCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9TcGVjaWFsaXplZFJlc3VsdHM8X0Z3ZEl0ZXJULCBfQWxsb2M+OjoKKyAgICBfTV9zZXRfcG9zKGludCBfX2ksIGludCBfX2osIGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3BjKQorICAgIHsgCisgICAgICB0eXBlZGVmIGNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfRndkSXRlclQ+JiBfQ3Vyc29yVDsKKyAgICAgIF9DdXJzb3JUIF9fYyA9IHN0YXRpY19jYXN0PF9DdXJzb3JUPihfX3BjKTsKKyAgICAgIGlmIChfX2ogPT0gMCkKKwlfTV9yZXN1bHRzLmF0KF9faSkuZmlyc3QgPSBfX2MuX01fcG9zKCk7CisgICAgICBlbHNlCisJX01fcmVzdWx0cy5hdChfX2kpLnNlY29uZCA9IF9fYy5fTV9wb3MoKSsxOworICAgIH0KKworICAvLyBBIHN0YWNrIG9mIHN0YXRlcyB1c2VkIGluIGV2YWx1YXRpbmcgdGhlIE5GQS4KKyAgdHlwZWRlZiBzdGQ6OnN0YWNrPF9TdGF0ZUlkVCwgc3RkOjp2ZWN0b3I8X1N0YXRlSWRUPiA+IF9TdGF0ZVN0YWNrOworCisgIC8vIEV4ZWN1dGVzIGEgcmVndWxhciBleHByZXNzaW9uIE5GQS9ERkEgb3ZlciBhIHJhbmdlIHVzaW5nIGEgdmFyaWFudCBvZgorICAvLyB0aGUgcGFyYWxsZWwgZXhlY3V0aW9uIGFsZ29yaXRobSBmZWF0dXJlZCBpbiB0aGUgZ3JlcCB1dGlsaXR5LCBtb2RpZmllZAorICAvLyB0byB1c2UgTGF1cmlrYXJpIHRhZ3MuCisgIGNsYXNzIF9HcmVwX21hdGNoZXIKKyAgeworICBwdWJsaWM6CisgICAgX0dyZXBfbWF0Y2hlcihfUGF0dGVybkN1cnNvciYgICAgICAgICAgICAgICAgICAgX19wLAorCQkgIF9SZXN1bHRzJiAgICAgICAgICAgICAgICAgICAgICAgICBfX3IsCisJCSAgY29uc3QgX0F1dG9tYXRvblB0ciYgICAgICAgICAgICAgIF9fYXV0b21hdG9uLAorCQkgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlICBfX2ZsYWdzKTsKKworICBwcml2YXRlOgorICAgIF9TdGF0ZVNldAorICAgIF9NX2VfY2xvc3VyZShfU3RhdGVJZFQgX19pKTsKKworICAgIF9TdGF0ZVNldAorICAgIF9NX2VfY2xvc3VyZShjb25zdCBfU3RhdGVTZXQmIF9fcyk7CisKKyAgICBfU3RhdGVTZXQKKyAgICBfTV9lX2Nsb3N1cmUoX1N0YXRlU3RhY2smIF9fc3RhY2ssIGNvbnN0IF9TdGF0ZVNldCYgX19zKTsKKworICBwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfTmZhPiAgICAgICAgX01fbmZhOworICAgIF9QYXR0ZXJuQ3Vyc29yJiAgICAgICAgICAgICAgICAgICAgX01fcGF0dGVybjsKKyAgICBfUmVzdWx0cyYgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX3Jlc3VsdHM7CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgX19yZWdleAorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLnRjYz4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9ncmVwX21hdGNoZXIudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X2dyZXBfbWF0Y2hlci50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyOGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9yZWdleF9ncmVwX21hdGNoZXIudGNjCkBAIC0wLDAgKzEsMTc5IEBACisvLyBjbGFzcyB0ZW1wbGF0ZSByZWdleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgYml0cy9yZWdleF9ncmVwX21hdGNoZXIudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworI2luY2x1ZGUgPHJlZ2V4PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZQoreworICAvLyBBIHN0YWNrIG9mIHN0YXRlcyB1c2VkIGluIGV2YWx1YXRpbmcgdGhlIE5GQS4KKyAgdHlwZWRlZiBzdGQ6OnN0YWNrPHN0ZDo6X19yZWdleDo6X1N0YXRlSWRULAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpfX3JlZ2V4OjpfU3RhdGVJZFQ+CisJCSAgICAgPiBfU3RhdGVTdGFjazsKKworICAvLyBPYnRhaW5zIHRoZSBuZXh0IHN0YXRlIHNldCBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBzZXQgX19zIGFuZCB0aGUgY3VycmVudAorICAvLyBpbnB1dCBjaGFyYWN0ZXIuCisgIGlubGluZSBzdGQ6Ol9fcmVnZXg6Ol9TdGF0ZVNldAorICBfX21vdmUoY29uc3Qgc3RkOjpfX3JlZ2V4OjpfUGF0dGVybkN1cnNvciYgX19wLAorICAgICAgICAgY29uc3Qgc3RkOjpfX3JlZ2V4OjpfTmZhJiBfX25mYSwKKyAgICAgICAgIGNvbnN0IHN0ZDo6X19yZWdleDo6X1N0YXRlU2V0JiBfX3MpCisgIHsKKyAgICBzdGQ6Ol9fcmVnZXg6Ol9TdGF0ZVNldCBfX207CisgICAgZm9yIChzdGQ6Ol9fcmVnZXg6Ol9TdGF0ZVNldDo6Y29uc3RfaXRlcmF0b3IgX19pID0gX19zLmJlZ2luKCk7CisJIF9faSAhPSBfX3MuZW5kKCk7ICsrX19pKQorICAgICAgeworCWlmICgqX19pID09IHN0ZDo6X19yZWdleDo6X1NfaW52YWxpZF9zdGF0ZV9pZCkKKwkgIGNvbnRpbnVlOworCisJY29uc3Qgc3RkOjpfX3JlZ2V4OjpfU3RhdGUmIF9fc3RhdGUgPSBfX25mYVsqX19pXTsKKwlpZiAoX19zdGF0ZS5fTV9vcGNvZGUgPT0gc3RkOjpfX3JlZ2V4OjpfU19vcGNvZGVfbWF0Y2gKKwkgICAgJiYgX19zdGF0ZS5fTV9tYXRjaGVzKF9fcCkpCisJICBfX20uaW5zZXJ0KF9fc3RhdGUuX01fbmV4dCk7CisgICAgICB9CisgICAgcmV0dXJuIF9fbTsKKyAgfQorCisgIC8vIHJldHVybnMgdHJ1ZSBpZiAoX19zIGludGVyc2VjdCBfX3QpIGlzIG5vdCBlbXB0eQorICBpbmxpbmUgYm9vbAorICBfX2luY2x1ZGVzX3NvbWUoY29uc3Qgc3RkOjpfX3JlZ2V4OjpfU3RhdGVTZXQmIF9fcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6X19yZWdleDo6X1N0YXRlU2V0JiBfX3QpCisgIHsKKyAgICBpZiAoX19zLnNpemUoKSA+IDAgJiYgX190LnNpemUoKSA+IDApCisgICAgICB7CisJc3RkOjpfX3JlZ2V4OjpfU3RhdGVTZXQ6OmNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QgPSBfX3MuYmVnaW4oKTsKKwlzdGQ6Ol9fcmVnZXg6Ol9TdGF0ZVNldDo6Y29uc3RfaXRlcmF0b3IgX19zZWNvbmQgPSBfX3QuYmVnaW4oKTsKKwl3aGlsZSAoX19maXJzdCAhPSBfX3MuZW5kKCkgJiYgX19zZWNvbmQgIT0gX190LmVuZCgpKQorCSAgeworCSAgICBpZiAoKl9fZmlyc3QgPCAqX19zZWNvbmQpCisJICAgICAgKytfX2ZpcnN0OworCSAgICBlbHNlIGlmICgqX19zZWNvbmQgPCAqX19maXJzdCkKKwkgICAgICArK19fc2Vjb25kOworCSAgICBlbHNlCisJICAgICAgcmV0dXJuIHRydWU7CisJICB9CisgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgYW4gaWRlbnRpZmllZCBzdGF0ZSBfX3UgaXMgbm90IGFscmVhZHkgaW4gdGhlIGN1cnJlbnQgc3RhdGUgc2V0IF9fZSwKKyAgLy8gaW5zZXJ0IGl0IGFuZCBwdXNoIGl0IG9uIHRoZSBjdXJyZW50IHN0YXRlIHN0YWNrIF9fcy4KKyAgaW5saW5lIHZvaWQKKyAgX19hZGRfdmlzaXRlZF9zdGF0ZShjb25zdCBzdGQ6Ol9fcmVnZXg6Ol9TdGF0ZUlkVCBfX3UsCisgICAgICAgICAgICAgICAgICAgICAgX1N0YXRlU3RhY2smICAgICAgICAgICAgICAgICAgX19zLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6X19yZWdleDo6X1N0YXRlU2V0JiAgICAgIF9fZSkKKyAgeworICAgIGlmIChfX2UuY291bnQoX191KSA9PSAwKQorICAgICAgeworCV9fZS5pbnNlcnQoX191KTsKKwlfX3MucHVzaChfX3UpOworICAgICAgfQorICB9CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgX19yZWdleAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBpbmxpbmUgX0dyZXBfbWF0Y2hlcjo6CisgIF9HcmVwX21hdGNoZXIoX1BhdHRlcm5DdXJzb3ImIF9fcCwgX1Jlc3VsdHMmIF9fciwKKwkJY29uc3QgX0F1dG9tYXRvblB0ciYgX19uZmEsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MpCisgIDogX01fbmZhKHN0YXRpY19wb2ludGVyX2Nhc3Q8X05mYT4oX19uZmEpKSwgX01fcGF0dGVybihfX3ApLCBfTV9yZXN1bHRzKF9fcikKKyAgeworICAgIF9fcmVnZXg6Ol9TdGF0ZVNldCBfX3QgPSB0aGlzLT5fTV9lX2Nsb3N1cmUoX01fbmZhLT5fTV9zdGFydCgpKTsKKyAgICBmb3IgKDsgIV9NX3BhdHRlcm4uX01fYXRfZW5kKCk7IF9NX3BhdHRlcm4uX01fbmV4dCgpKQorICAgICAgX190ID0gdGhpcy0+X01fZV9jbG9zdXJlKF9fbW92ZShfTV9wYXR0ZXJuLCAqX01fbmZhLCBfX3QpKTsKKworICAgIF9NX3Jlc3VsdHMuX01fc2V0X21hdGNoZWQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW5jbHVkZXNfc29tZShfTV9uZmEtPl9NX2ZpbmFsX3N0YXRlcygpLCBfX3QpKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIGUtY2xvc3VyZSBzZXQgZm9yIHRoZSBpbml0aWFsIHN0YXRlIF9faS4KKyAgaW5saW5lIF9TdGF0ZVNldCBfR3JlcF9tYXRjaGVyOjoKKyAgX01fZV9jbG9zdXJlKF9TdGF0ZUlkVCBfX2kpCisgIHsKKyAgICBfU3RhdGVTZXQgX19zOworICAgIF9fcy5pbnNlcnQoX19pKTsKKyAgICBfU3RhdGVTdGFjayBfX3N0YWNrOworICAgIF9fc3RhY2sucHVzaChfX2kpOworICAgIHJldHVybiB0aGlzLT5fTV9lX2Nsb3N1cmUoX19zdGFjaywgX19zKTsKKyAgfQorCisgIC8vIENyZWF0ZXMgdGhlIGUtY2xvc3VyZSBzZXQgZm9yIGFuIGFyYml0cmFyeSBzdGF0ZSBzZXQgX19zLgorICBpbmxpbmUgX1N0YXRlU2V0IF9HcmVwX21hdGNoZXI6OgorICBfTV9lX2Nsb3N1cmUoY29uc3QgX1N0YXRlU2V0JiBfX3MpCisgIHsKKyAgICBfU3RhdGVTdGFjayBfX3N0YWNrOworICAgIGZvciAoX1N0YXRlU2V0Ojpjb25zdF9pdGVyYXRvciBfX2kgPSBfX3MuYmVnaW4oKTsgX19pICE9IF9fcy5lbmQoKTsgKytfX2kpCisgICAgICBfX3N0YWNrLnB1c2goKl9faSk7CisgICAgcmV0dXJuIHRoaXMtPl9NX2VfY2xvc3VyZShfX3N0YWNrLCBfX3MpOworICB9CisKKyAgaW5saW5lIF9TdGF0ZVNldCBfR3JlcF9tYXRjaGVyOjoKKyAgX01fZV9jbG9zdXJlKF9TdGF0ZVN0YWNrJiBfX3N0YWNrLCBjb25zdCBfU3RhdGVTZXQmIF9fcykKKyAgeworICAgIF9TdGF0ZVNldCBfX2UgPSBfX3M7CisgICAgd2hpbGUgKCFfX3N0YWNrLmVtcHR5KCkpCisgICAgICB7CisJX1N0YXRlSWRUIF9fdCA9IF9fc3RhY2sudG9wKCk7IF9fc3RhY2sucG9wKCk7CisJaWYgKF9fdCA9PSBfU19pbnZhbGlkX3N0YXRlX2lkKQorCSAgY29udGludWU7CisJLy8gZm9yIGVhY2ggX191IHdpdGggZWRnZSBmcm9tIF9fdCB0byBfX3UgbGFiZWxlZCBlIGRvIC4uLgorCWNvbnN0IF9TdGF0ZSYgX19zdGF0ZSA9IF9NX25mYS0+b3BlcmF0b3JbXShfX3QpOworCXN3aXRjaCAoX19zdGF0ZS5fTV9vcGNvZGUpCisJICB7CisJICBjYXNlIF9TX29wY29kZV9hbHRlcm5hdGl2ZToKKwkgICAgX19hZGRfdmlzaXRlZF9zdGF0ZShfX3N0YXRlLl9NX25leHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIF9fYWRkX3Zpc2l0ZWRfc3RhdGUoX19zdGF0ZS5fTV9hbHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIGJyZWFrOworCSAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9iZWdpbjoKKwkgICAgX19hZGRfdmlzaXRlZF9zdGF0ZShfX3N0YXRlLl9NX25leHQsIF9fc3RhY2ssIF9fZSk7CisJICAgIF9fc3RhdGUuX01fdGFnZ2VyKF9NX3BhdHRlcm4sIF9NX3Jlc3VsdHMpOworCSAgICBicmVhazsKKwkgIGNhc2UgX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kOgorCSAgICBfX2FkZF92aXNpdGVkX3N0YXRlKF9fc3RhdGUuX01fbmV4dCwgX19zdGFjaywgX19lKTsKKwkgICAgX19zdGF0ZS5fTV90YWdnZXIoX01fcGF0dGVybiwgX01fcmVzdWx0cyk7CisJICAgIF9NX3Jlc3VsdHMuX01fc2V0X21hdGNoZWQoX19zdGF0ZS5fTV9zdWJleHByLCB0cnVlKTsKKwkgICAgYnJlYWs7CisJICBjYXNlIF9TX29wY29kZV9hY2NlcHQ6CisJICAgIF9fYWRkX3Zpc2l0ZWRfc3RhdGUoX19zdGF0ZS5fTV9uZXh0LCBfX3N0YWNrLCBfX2UpOworCSAgICBicmVhazsKKwkgIGRlZmF1bHQ6CisJICAgIGJyZWFrOworCSAgfQorICAgICAgfQorICAgIHJldHVybiBfX2U7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX3JlZ2V4Cit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X25mYS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X25mYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTY1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXhfbmZhLmgKQEAgLTAsMCArMSw0MDAgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqICBAZmlsZSBiaXRzL3JlZ2V4X25mYS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cmVnZXh9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19yZWdleAoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBCYXNlIGNsYXNzIGZvciwgdW0sIGF1dG9tYXRhLiAgQ291bGQgYmUgYW4gTkZBIG9yIGEgREZBLiAgWW91ciBjaG9pY2UuCisgIGNsYXNzIF9BdXRvbWF0b24KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgX1NpemVUOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsCisgICAgfl9BdXRvbWF0b24oKSB7IH0KKworICAgIHZpcnR1YWwgX1NpemVUCisgICAgX01fc3ViX2NvdW50KCkgY29uc3QgPSAwOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYKKyAgICBfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIpIGNvbnN0ID0gMDsKKyNlbmRpZgorICB9OworCisgIC8vIEdlbmVyaWMgc2hhcmVkIHBvaW50ZXIgdG8gYW4gYXV0b21hdG9uLiAgCisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPF9BdXRvbWF0b24+IF9BdXRvbWF0b25QdHI7CisKKyAgLy8gT3BlcmF0aW9uIGNvZGVzIHRoYXQgZGVmaW5lIHRoZSB0eXBlIG9mIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgYmFzZSBORkEKKyAgLy8gdGhhdCByZXByZXNlbnRzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgIGVudW0gX09wY29kZQorICB7CisgICAgICBfU19vcGNvZGVfdW5rbm93biAgICAgICA9ICAgMCwKKyAgICAgIF9TX29wY29kZV9hbHRlcm5hdGl2ZSAgID0gICAxLAorICAgICAgX1Nfb3Bjb2RlX3N1YmV4cHJfYmVnaW4gPSAgIDQsCisgICAgICBfU19vcGNvZGVfc3ViZXhwcl9lbmQgICA9ICAgNSwKKyAgICAgIF9TX29wY29kZV9tYXRjaCAgICAgICAgID0gMTAwLAorICAgICAgX1Nfb3Bjb2RlX2FjY2VwdCAgICAgICAgPSAyNTUKKyAgfTsKKworICAvLyBQcm92aWRlcyBhIGdlbmVyaWMgZmFjYWRlIGZvciBhIHRlbXBsYXRlZCBtYXRjaF9yZXN1bHRzLgorICBzdHJ1Y3QgX1Jlc3VsdHMKKyAgeworICAgIHZpcnR1YWwgdm9pZCBfTV9zZXRfcG9zKGludCBfX2ksIGludCBfX2osIGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3ApID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgX01fc2V0X21hdGNoZWQoaW50IF9faSwgYm9vbCBfX2lzX21hdGNoZWQpID0gMDsKKyAgfTsKKworICAvLyBUYWdzIGN1cnJlbnQgc3RhdGUgKGZvciBzdWJleHByIGJlZ2luL2VuZCkuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkIChjb25zdCBfUGF0dGVybkN1cnNvciYsIF9SZXN1bHRzJik+IF9UYWdnZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJULCB0eXBlbmFtZSBfVHJhaXRzVD4KKyAgICBzdHJ1Y3QgX1N0YXJ0VGFnZ2VyCisgICAgeworICAgICAgZXhwbGljaXQKKyAgICAgIF9TdGFydFRhZ2dlcihpbnQgX19pKQorICAgICAgOiBfTV9pbmRleChfX2kpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYywgX1Jlc3VsdHMmIF9fcikKKyAgICAgIHsgX19yLl9NX3NldF9wb3MoX01faW5kZXgsIDAsIF9fcGMpOyB9CisKKyAgICAgIGludCAgICAgICBfTV9pbmRleDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RJdGVyVCwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgc3RydWN0IF9FbmRUYWdnZXIKKyAgICB7CisgICAgICBleHBsaWNpdAorICAgICAgX0VuZFRhZ2dlcihpbnQgX19pKQorICAgICAgOiBfTV9pbmRleChfX2kpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYywgX1Jlc3VsdHMmIF9fcikKKyAgICAgIHsgX19yLl9NX3NldF9wb3MoX01faW5kZXgsIDEsIF9fcGMpOyB9CisKKyAgICAgIGludCAgICAgICBfTV9pbmRleDsKKyAgICAgIF9Gd2RJdGVyVCBfTV9wb3M7CisgICAgfTsKKyAgLy8gSW5kaWNhdGVzIGlmIGN1cnJlbnQgc3RhdGUgbWF0Y2hlcyBjdXJzb3IgY3VycmVudC4KKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2wgKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJik+IF9NYXRjaGVyOworCisgIC8vIE1hdGNoZXMgYW55IGNoYXJhY3RlcgorICBpbmxpbmUgYm9vbAorICBfQW55TWF0Y2hlcihjb25zdCBfUGF0dGVybkN1cnNvciYpCisgIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBNYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyVCwgdHlwZW5hbWUgX1RyYWl0c1Q+CisgICAgc3RydWN0IF9DaGFyTWF0Y2hlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0c1Q6OmNoYXJfdHlwZSBjaGFyX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfQ2hhck1hdGNoZXIoY2hhcl90eXBlIF9fYywgY29uc3QgX1RyYWl0c1QmIF9fdCA9IF9UcmFpdHNUKCkpCisgICAgICA6IF9NX3RyYWl0cyhfX3QpLCBfTV9jKF9NX3RyYWl0cy50cmFuc2xhdGUoX19jKSkKKyAgICAgIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYXR0ZXJuQ3Vyc29yJiBfX3BjKSBjb25zdAorICAgICAgeworCXR5cGVkZWYgY29uc3QgX1NwZWNpYWxpemVkQ3Vyc29yPF9Jbkl0ZXJUPiYgX0N1cnNvclQ7CisJX0N1cnNvclQgX19jID0gc3RhdGljX2Nhc3Q8X0N1cnNvclQ+KF9fcGMpOworCXJldHVybiBfTV90cmFpdHMudHJhbnNsYXRlKF9fYy5fTV9jdXJyZW50KCkpID09IF9NX2M7CisgICAgICB9CisKKyAgICAgIGNvbnN0IF9UcmFpdHNUJiBfTV90cmFpdHM7CisgICAgICBjaGFyX3R5cGUgICAgICAgX01fYzsKKyAgICB9OworCisgIC8vIE1hdGNoZXMgYSBjaGFyYWN0ZXIgcmFuZ2UgKGJyYWNrZXQgZXhwcmVzc2lvbikKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlclQsIHR5cGVuYW1lIF9UcmFpdHNUPgorICAgIHN0cnVjdCBfUmFuZ2VNYXRjaGVyCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzVDo6Y2hhcl90eXBlIF9DaGFyVDsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPiAgICBfU3RyaW5nVDsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9SYW5nZU1hdGNoZXIoYm9vbCBfX2lzX25vbl9tYXRjaGluZywgY29uc3QgX1RyYWl0c1QmIF9fdCA9IF9UcmFpdHNUKCkpCisgICAgICA6IF9NX3RyYWl0cyhfX3QpLCBfTV9pc19ub25fbWF0Y2hpbmcoX19pc19ub25fbWF0Y2hpbmcpCisgICAgICB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfUGF0dGVybkN1cnNvciYgX19wYykgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIGNvbnN0IF9TcGVjaWFsaXplZEN1cnNvcjxfSW5JdGVyVD4mIF9DdXJzb3JUOworCV9DdXJzb3JUIF9fYyA9IHN0YXRpY19jYXN0PF9DdXJzb3JUPihfX3BjKTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fYWRkX2NoYXIoX0NoYXJUIF9fYykKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfY29sbGF0aW5nX2VsZW1lbnQoY29uc3QgX1N0cmluZ1QmIF9fcykKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfZXF1aXZhbGVuY2VfY2xhc3MoY29uc3QgX1N0cmluZ1QmIF9fcykKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfY2hhcmFjdGVyX2NsYXNzKGNvbnN0IF9TdHJpbmdUJiBfX3MpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbWFrZV9yYW5nZSgpCisgICAgICB7IH0KKworICAgICAgY29uc3QgX1RyYWl0c1QmIF9NX3RyYWl0czsKKyAgICAgIGJvb2wgICAgICAgICAgICBfTV9pc19ub25fbWF0Y2hpbmc7CisgICAgfTsKKworICAvLyBJZGVudGlmaWVzIGEgc3RhdGUgaW4gdGhlIE5GQS4KKyAgdHlwZWRlZiBpbnQgX1N0YXRlSWRUOworCisgIC8vIFRoZSBzcGVjaWFsIGNhc2UgaW4gd2hpY2ggYSBzdGF0ZSBpZGVudGlmaWVyIGlzIG5vdCBhbiBpbmRleC4KKyAgc3RhdGljIGNvbnN0IF9TdGF0ZUlkVCBfU19pbnZhbGlkX3N0YXRlX2lkICA9IC0xOworCisKKyAgLy8gQW4gaW5kaXZpZHVhbCBzdGF0ZSBpbiBhbiBORkEKKyAgLy8KKyAgLy8gSW4gdGhpcyBjYXNlIGEgInN0YXRlIiBpcyBhbiBlbnRyeSBpbiB0aGUgTkZBIGRlZmluaXRpb24gY291cGxlZCB3aXRoIGl0cworICAvLyBvdXRnb2luZyB0cmFuc2l0aW9uKHMpLiAgQWxsIHN0YXRlcyBoYXZlIGEgc2luZ2xlIG91dGdvaW5nIHRyYW5zaXRpb24sCisgIC8vIGV4Y2VwdCBmb3IgYWNjZXB0aW5nIHN0YXRlcyAod2hpY2ggaGF2ZSBubyBvdXRnb2luZyB0cmFuc2l0aW9ucykgYW5kIGFsdAorICAvLyBzdGF0ZXMsIHdoaWNoIGhhdmUgdHdvIG91dGdvaW5nIHRyYW5zaXRpb25zLgorICAvLworICBzdHJ1Y3QgX1N0YXRlCisgIHsKKyAgICB0eXBlZGVmIGludCAgX09wY29kZVQ7CisKKyAgICBfT3Bjb2RlVCAgICAgX01fb3Bjb2RlOyAgICAvLyB0eXBlIG9mIG91dGdvaW5nIHRyYW5zaXRpb24KKyAgICBfU3RhdGVJZFQgICAgX01fbmV4dDsgICAgICAvLyBvdXRnb2luZyB0cmFuc2l0aW9uCisgICAgX1N0YXRlSWRUICAgIF9NX2FsdDsgICAgICAgLy8gZm9yIF9TX29wY29kZV9hbHRlcm5hdGl2ZQorICAgIHVuc2lnbmVkIGludCBfTV9zdWJleHByOyAgIC8vIGZvciBfU19vcGNvZGVfc3ViZXhwcl8qCisgICAgX1RhZ2dlciAgICAgIF9NX3RhZ2dlcjsgICAgLy8gZm9yIF9TX29wY29kZV9zdWJleHByXyoKKyAgICBfTWF0Y2hlciAgICAgX01fbWF0Y2hlczsgICAvLyBmb3IgX1Nfb3Bjb2RlX21hdGNoCisKKyAgICBleHBsaWNpdCBfU3RhdGUoX09wY29kZVQgX19vcGNvZGUpCisgICAgOiBfTV9vcGNvZGUoX19vcGNvZGUpLCBfTV9uZXh0KF9TX2ludmFsaWRfc3RhdGVfaWQpCisgICAgeyB9CisKKyAgICBfU3RhdGUoY29uc3QgX01hdGNoZXImIF9fbSkKKyAgICA6IF9NX29wY29kZShfU19vcGNvZGVfbWF0Y2gpLCBfTV9uZXh0KF9TX2ludmFsaWRfc3RhdGVfaWQpLCBfTV9tYXRjaGVzKF9fbSkKKyAgICB7IH0KKworICAgIF9TdGF0ZShfT3Bjb2RlVCBfX29wY29kZSwgdW5zaWduZWQgaW50IF9fcywgY29uc3QgX1RhZ2dlciYgX190KQorICAgIDogX01fb3Bjb2RlKF9fb3Bjb2RlKSwgX01fbmV4dChfU19pbnZhbGlkX3N0YXRlX2lkKSwgX01fc3ViZXhwcihfX3MpLAorICAgICAgX01fdGFnZ2VyKF9fdCkKKyAgICB7IH0KKworICAgIF9TdGF0ZShfU3RhdGVJZFQgX19uZXh0LCBfU3RhdGVJZFQgX19hbHQpCisgICAgOiBfTV9vcGNvZGUoX1Nfb3Bjb2RlX2FsdGVybmF0aXZlKSwgX01fbmV4dChfX25leHQpLCBfTV9hbHQoX19hbHQpCisgICAgeyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIHN0ZDo6b3N0cmVhbSYKKyAgICBfTV9wcmludChzdGQ6Om9zdHJlYW0mIG9zdHIpIGNvbnN0OworCisgICAgLy8gUHJpbnRzIGdyYXBodml6IGRvdCBjb21tYW5kcyBmb3Igc3RhdGUuCisgICAgc3RkOjpvc3RyZWFtJgorICAgIF9NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0ciwgX1N0YXRlSWRUIF9faWQpIGNvbnN0OworI2VuZGlmCisgIH07CisKKyAgCisgIC8vIFRoZSBHcmVwIE1hdGNoZXIgd29ya3Mgb24gc2V0cyBvZiBzdGF0ZXMuICBIZXJlIGFyZSBzZXRzIG9mIHN0YXRlcy4KKyAgdHlwZWRlZiBzdGQ6OnNldDxfU3RhdGVJZFQ+IF9TdGF0ZVNldDsKKworIC8vIEEgY29sbGVjdGlvbiBvZiBhbGwgc3RhdGVzIG1ha2luZyB1cCBhbiBORkEKKyAgLy8KKyAgLy8gQW4gTkZBIGlzIGEgNC10dXBsZSBNID0gKEssIFMsIHMsIEYpLCB3aGVyZQorICAvLyAgICBLIGlzIGEgZmluaXRlIHNldCBvZiBzdGF0ZXMsCisgIC8vICAgIFMgaXMgdGhlIGFscGhhYmV0IG9mIHRoZSBORkEsCisgIC8vICAgIHMgaXMgdGhlIGluaXRpYWwgc3RhdGUsCisgIC8vICAgIEYgaXMgYSBzZXQgb2YgZmluYWwgKGFjY2VwdGluZykgc3RhdGVzLgorICAvLworICAvLyBUaGlzIE5GQSBjbGFzcyBpcyB0ZW1wbGF0ZWQgb24gUywgYSB0eXBlIHRoYXQgd2lsbCBob2xkIHZhbHVlcyBvZiB0aGUKKyAgLy8gdW5kZXJseWluZyBhbHBoYWJldCAod2l0aG91dCByZWdhcmQgdG8gc2VtYW50aWNzIG9mIHRoYXQgYWxwaGFiZXQpLiAgVGhlCisgIC8vIG90aGVyIGVsZW1lbnRzIG9mIHRoZSB0dXBsZSBhcmUgZ2VuZXJhdGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIE5GQQorICAvLyBhbmQgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGFjY2Vzc29yIG1lbWJlciBmdW5jdGlvbnMuCisgIC8vCisgIGNsYXNzIF9OZmEKKyAgOiBwdWJsaWMgX0F1dG9tYXRvbiwgcHVibGljIHN0ZDo6dmVjdG9yPF9TdGF0ZT4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfU3RhdGVUOworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgX1NpemVUOworICAgIHR5cGVkZWYgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgX0ZsYWdUOworCisgIHB1YmxpYzoKKyAgICBfTmZhKF9GbGFnVCBfX2YpCisgICAgOiBfTV9mbGFncyhfX2YpLCBfTV9zdGFydF9zdGF0ZSgwKSwgX01fc3ViZXhwcl9jb3VudCgwKQorICAgIHsgfQorCisgICAgfl9OZmEoKQorICAgIHsgfQorCisgICAgX0ZsYWdUCisgICAgX01fb3B0aW9ucygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZmxhZ3M7IH0KKworICAgIF9TdGF0ZUlkVAorICAgIF9NX3N0YXJ0KCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdGFydF9zdGF0ZTsgfQorCisgICAgY29uc3QgX1N0YXRlU2V0JgorICAgIF9NX2ZpbmFsX3N0YXRlcygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fYWNjZXB0aW5nX3N0YXRlczsgfQorCisgICAgX1NpemVUCisgICAgX01fc3ViX2NvdW50KCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdWJleHByX2NvdW50OyB9CisKKyAgICBfU3RhdGVJZFQKKyAgICBfTV9pbnNlcnRfYWNjZXB0KCkKKyAgICB7CisgICAgICB0aGlzLT5wdXNoX2JhY2soX1N0YXRlVChfU19vcGNvZGVfYWNjZXB0KSk7CisgICAgICBfTV9hY2NlcHRpbmdfc3RhdGVzLmluc2VydCh0aGlzLT5zaXplKCktMSk7CisgICAgICByZXR1cm4gdGhpcy0+c2l6ZSgpLTE7CisgICAgfQorCisgICAgX1N0YXRlSWRUCisgICAgX01faW5zZXJ0X2FsdChfU3RhdGVJZFQgX19uZXh0LCBfU3RhdGVJZFQgX19hbHQpCisgICAgeworICAgICAgdGhpcy0+cHVzaF9iYWNrKF9TdGF0ZVQoX19uZXh0LCBfX2FsdCkpOworICAgICAgcmV0dXJuIHRoaXMtPnNpemUoKS0xOworICAgIH0KKworICAgIF9TdGF0ZUlkVAorICAgIF9NX2luc2VydF9tYXRjaGVyKF9NYXRjaGVyIF9fbSkKKyAgICB7CisgICAgICB0aGlzLT5wdXNoX2JhY2soX1N0YXRlVChfX20pKTsKKyAgICAgIHJldHVybiB0aGlzLT5zaXplKCktMTsKKyAgICB9CisKKyAgICBfU3RhdGVJZFQKKyAgICBfTV9pbnNlcnRfc3ViZXhwcl9iZWdpbihjb25zdCBfVGFnZ2VyJiBfX3QpCisgICAgeworICAgICAgdGhpcy0+cHVzaF9iYWNrKF9TdGF0ZVQoX1Nfb3Bjb2RlX3N1YmV4cHJfYmVnaW4sIF9NX3N1YmV4cHJfY291bnQrKywgX190KSk7CisgICAgICByZXR1cm4gdGhpcy0+c2l6ZSgpLTE7CisgICAgfQorCisgICAgX1N0YXRlSWRUIAorICAgIF9NX2luc2VydF9zdWJleHByX2VuZCh1bnNpZ25lZCBpbnQgX19pLCBjb25zdCBfVGFnZ2VyJiBfX3QpCisgICAgeworICAgICAgdGhpcy0+cHVzaF9iYWNrKF9TdGF0ZVQoX1Nfb3Bjb2RlX3N1YmV4cHJfZW5kLCBfX2ksIF9fdCkpOworICAgICAgcmV0dXJuIHRoaXMtPnNpemUoKS0xOworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgc3RkOjpvc3RyZWFtJgorICAgIF9NX2RvdChzdGQ6Om9zdHJlYW0mIF9fb3N0cikgY29uc3Q7CisjZW5kaWYKKworICBwcml2YXRlOgorICAgIF9GbGFnVCAgICAgX01fZmxhZ3M7CisgICAgX1N0YXRlSWRUICBfTV9zdGFydF9zdGF0ZTsKKyAgICBfU3RhdGVTZXQgIF9NX2FjY2VwdGluZ19zdGF0ZXM7CisgICAgX1NpemVUICAgICBfTV9zdWJleHByX2NvdW50OworICB9OworCisgIC8vIERlc2NyaWJlcyBhIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlICVfU3RhdGUsIGl0cyBjdXJyZW50IHN0YXJ0IGFuZCBlbmQocykuCisgIC8vCisgIC8vIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGZyYWdtZW50cyBvZiBhbiBORkEgZHVyaW5nIGNvbnN0cnVjdGlvbi4KKyAgY2xhc3MgX1N0YXRlU2VxCisgIHsKKyAgcHVibGljOgorICAgIC8vIENvbnN0cnVjdHMgYSBzaW5nbGUtbm9kZSBzZXF1ZW5jZQorICAgIF9TdGF0ZVNlcShfTmZhJiBfX3NzLCBfU3RhdGVJZFQgX19zLCBfU3RhdGVJZFQgX19lID0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgICA6IF9NX25mYShfX3NzKSwgX01fc3RhcnQoX19zKSwgX01fZW5kMShfX3MpLCBfTV9lbmQyKF9fZSkKKyAgICB7IH0KKyAgICAvLyBDb25zdHJ1Y3RzIGEgc3BsaXQgc2VxdWVuY2UgZnJvbSB0d28gb3RoZXIgc2VxdWVuY2NlcworICAgIF9TdGF0ZVNlcShjb25zdCBfU3RhdGVTZXEmIF9fZTEsIGNvbnN0IF9TdGF0ZVNlcSYgX19lMikKKyAgICA6IF9NX25mYShfX2UxLl9NX25mYSksCisgICAgICBfTV9zdGFydChfTV9uZmEuX01faW5zZXJ0X2FsdChfX2UxLl9NX3N0YXJ0LCBfX2UyLl9NX3N0YXJ0KSksCisgICAgICBfTV9lbmQxKF9fZTEuX01fZW5kMSksIF9NX2VuZDIoX19lMi5fTV9lbmQxKQorICAgIHsgfQorCisgICAgLy8gQ29uc3RydWN0cyBhIHNwbGl0IHNlcXVlbmNlIGZyb20gYSBzaW5nbGUgc2VxdWVuY2UKKyAgICBfU3RhdGVTZXEoY29uc3QgX1N0YXRlU2VxJiBfX2UsIF9TdGF0ZUlkVCBfX2lkKQorICAgIDogX01fbmZhKF9fZS5fTV9uZmEpLAorICAgICAgX01fc3RhcnQoX01fbmZhLl9NX2luc2VydF9hbHQoX19pZCwgX19lLl9NX3N0YXJ0KSksCisgICAgICBfTV9lbmQxKF9faWQpLCBfTV9lbmQyKF9fZS5fTV9lbmQxKQorICAgIHsgfQorCisgICAgLy8gQ29uc3RydWN0cyBhIGNvcHkgb2YgYSAlX1N0YXRlU2VxCisgICAgX1N0YXRlU2VxKGNvbnN0IF9TdGF0ZVNlcSYgX19yaHMpCisgICAgOiBfTV9uZmEoX19yaHMuX01fbmZhKSwgX01fc3RhcnQoX19yaHMuX01fc3RhcnQpLAorICAgICAgX01fZW5kMShfX3Jocy5fTV9lbmQxKSwgX01fZW5kMihfX3Jocy5fTV9lbmQyKQorICAgIHsgfQorCisKKyAgICBfU3RhdGVTZXEmIG9wZXJhdG9yPShjb25zdCBfU3RhdGVTZXEmIF9fcmhzKTsKKworICAgIF9TdGF0ZUlkVAorICAgIF9NX2Zyb250KCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdGFydDsgfQorCisgICAgLy8gRXh0ZW5kcyBhIHNlcXVlbmNlIGJ5IG9uZS4KKyAgICB2b2lkCisgICAgX01fcHVzaF9iYWNrKF9TdGF0ZUlkVCBfX2lkKTsKKworICAgIC8vIEV4dGVuZHMgYW5kIG1heWJlIGpvaW5zIGEgc2VxdWVuY2UuCisgICAgdm9pZAorICAgIF9NX2FwcGVuZChfU3RhdGVJZFQgX19pZCk7CisKKyAgICB2b2lkCisgICAgX01fYXBwZW5kKF9TdGF0ZVNlcSYgX19yaHMpOworCisgICAgLy8gQ2xvbmVzIGFuIGVudGlyZSBzZXF1ZW5jZS4KKyAgICBfU3RhdGVJZFQKKyAgICBfTV9jbG9uZSgpOworCisgIHByaXZhdGU6CisgICAgX05mYSYgICAgIF9NX25mYTsKKyAgICBfU3RhdGVJZFQgX01fc3RhcnQ7CisgICAgX1N0YXRlSWRUIF9NX2VuZDE7CisgICAgX1N0YXRlSWRUIF9NX2VuZDI7CisKKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX3JlZ2V4Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2luY2x1ZGUgPGJpdHMvcmVnZXhfbmZhLnRjYz4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X25mYS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvcmVnZXhfbmZhLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTRhNmNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3JlZ2V4X25mYS50Y2MKQEAgLTAsMCArMSwxNzQgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHJlZ2V4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIGJpdHMvcmVnZXhfbmZhLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3JlZ2V4fQorICovCisjaW5jbHVkZSA8cmVnZXg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcmVnZXgKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworaW5saW5lIHN0ZDo6b3N0cmVhbSYgX1N0YXRlOjoKK19NX3ByaW50KHN0ZDo6b3N0cmVhbSYgb3N0cikgY29uc3QKK3sKKyAgc3dpdGNoIChfTV9vcGNvZGUpCisgIHsKKyAgICBjYXNlIF9TX29wY29kZV9hbHRlcm5hdGl2ZToKKyAgICAgIG9zdHIgPDwgImFsdCBuZXh0PSIgPDwgX01fbmV4dCA8PCAiIGFsdD0iIDw8IF9NX2FsdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX3N1YmV4cHJfYmVnaW46CisgICAgICBvc3RyIDw8ICJzdWJleHByIGJlZ2luIG5leHQ9IiA8PCBfTV9uZXh0IDw8ICIgaW5kZXg9IiA8PCBfTV9zdWJleHByOworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9lbmQ6CisgICAgICBvc3RyIDw8ICJzdWJleHByIGVuZCBuZXh0PSIgPDwgX01fbmV4dCA8PCAiIGluZGV4PSIgPDwgX01fc3ViZXhwcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgX1Nfb3Bjb2RlX21hdGNoOgorICAgICAgb3N0ciA8PCAibWF0Y2ggbmV4dD0iIDw8IF9NX25leHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9hY2NlcHQ6CisgICAgICBvc3RyIDw8ICJhY2NlcHQgbmV4dD0iIDw8IF9NX25leHQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb3N0ciA8PCAidW5rbm93biBuZXh0PSIgPDwgX01fbmV4dDsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBvc3RyOworfQorCisvLyBQcmludHMgZ3JhcGh2aXogZG90IGNvbW1hbmRzIGZvciBzdGF0ZS4KK2lubGluZSBzdGQ6Om9zdHJlYW0mIF9TdGF0ZTo6CitfTV9kb3Qoc3RkOjpvc3RyZWFtJiBfX29zdHIsIF9TdGF0ZUlkVCBfX2lkKSBjb25zdAoreworICBzd2l0Y2ggKF9NX29wY29kZSkKKyAgeworICAgIGNhc2UgX1Nfb3Bjb2RlX2FsdGVybmF0aXZlOgorICAgICAgX19vc3RyIDw8IF9faWQgPDwgIiBbbGFiZWw9XCIiIDw8IF9faWQgPDwgIlxcbkFMVFwiXTtcbiIgCisgICAgICAgICAgICAgPDwgX19pZCA8PCAiIC0+ICIgPDwgX01fbmV4dAorICAgICAgICAgICAgIDw8ICIgW2xhYmVsPVwiZXBzaWxvblwiLCB0YWlscG9ydD1cInNcIl07XG4iCisgICAgICAgICAgICAgPDwgX19pZCA8PCAiIC0+ICIgPDwgX01fYWx0IAorICAgICAgICAgICAgIDw8ICIgW2xhYmVsPVwiZXBzaWxvblwiLCB0YWlscG9ydD1cIm5cIl07XG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9iZWdpbjoKKyAgICAgIF9fb3N0ciA8PCBfX2lkIDw8ICIgW2xhYmVsPVwiIiA8PCBfX2lkIDw8ICJcXG5TQkVHSU4gIgorICAgICAgICAgICAgIDw8IF9NX3N1YmV4cHIgPDwgIlwiXTtcbiIgCisgICAgICAgICAgICAgPDwgX19pZCA8PCAiIC0+ICIgPDwgX01fbmV4dCA8PCAiIFtsYWJlbD1cImVwc2lsb25cIl07XG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfc3ViZXhwcl9lbmQ6CisgICAgICBfX29zdHIgPDwgX19pZCA8PCAiIFtsYWJlbD1cIiIgPDwgX19pZCA8PCAiXFxuU0VORCAiCisgICAgICAgICAgICAgPDwgX01fc3ViZXhwciA8PCAiXCJdO1xuIiAKKyAgICAgICAgICAgICA8PCBfX2lkIDw8ICIgLT4gIiA8PCBfTV9uZXh0IDw8ICIgW2xhYmVsPVwiZXBzaWxvblwiXTtcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIF9TX29wY29kZV9tYXRjaDoKKyAgICAgIF9fb3N0ciA8PCBfX2lkIDw8ICIgW2xhYmVsPVwiIiA8PCBfX2lkIDw8ICJcXG5NQVRDSFwiXTtcbiIgCisgICAgICAgICAgICAgPDwgX19pZCA8PCAiIC0+ICIgPDwgX01fbmV4dCA8PCAiIFtsYWJlbD1cIjxtYXRjaD5cIl07XG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBfU19vcGNvZGVfYWNjZXB0OgorICAgICAgX19vc3RyIDw8IF9faWQgPDwgIiBbbGFiZWw9XCIiIDw8IF9faWQgPDwgIlxcbkFDQ1wiXTtcbiIgOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIF9fb3N0ciA8PCBfX2lkIDw8ICIgW2xhYmVsPVwiIiA8PCBfX2lkIDw8ICJcXG5VTktcIl07XG4iIAorICAgICAgICAgICAgIDw8IF9faWQgPDwgIiAtPiAiIDw8IF9NX25leHQgPDwgIiBbbGFiZWw9XCI/XCJdO1xuIjsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBfX29zdHI7Cit9CisKK2lubGluZSBzdGQ6Om9zdHJlYW0mIF9OZmE6OgorX01fZG90KHN0ZDo6b3N0cmVhbSYgX19vc3RyKSBjb25zdAoreworICBfX29zdHIgPDwgImRpZ3JhcGggX05mYSB7XG4iCisgICA8PCAiICByYW5rZGlyPUxSO1xuIjsKKyAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMDsgX19pIDwgdGhpcy0+c2l6ZSgpOyArK19faSkKKyAgeyB0aGlzLT5hdChfX2kpLl9NX2RvdChfX29zdHIsIF9faSk7IH0KKyAgX19vc3RyIDw8ICJ9XG4iOworICByZXR1cm4gX19vc3RyOworfQorI2VuZGlmCisKK2lubGluZSBfU3RhdGVTZXEmIF9TdGF0ZVNlcTo6CitvcGVyYXRvcj0oY29uc3QgX1N0YXRlU2VxJiBfX3JocykKK3sKKyAgX01fc3RhcnQgPSBfX3Jocy5fTV9zdGFydDsKKyAgX01fZW5kMSAgPSBfX3Jocy5fTV9lbmQxOworICBfTV9lbmQyICA9IF9fcmhzLl9NX2VuZDI7CisgIHJldHVybiAqdGhpczsKK30KKworaW5saW5lIHZvaWQgX1N0YXRlU2VxOjoKK19NX3B1c2hfYmFjayhfU3RhdGVJZFQgX19pZCkKK3sKKyAgaWYgKF9NX2VuZDEgIT0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgICBfTV9uZmFbX01fZW5kMV0uX01fbmV4dCA9IF9faWQ7CisgIF9NX2VuZDEgPSBfX2lkOworfQorCitpbmxpbmUgdm9pZCBfU3RhdGVTZXE6OgorX01fYXBwZW5kKF9TdGF0ZUlkVCBfX2lkKQoreworICBpZiAoX01fZW5kMiAhPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICB7CisgICAgaWYgKF9NX2VuZDIgPT0gX01fZW5kMSkKKyAgICAgIF9NX25mYVtfTV9lbmQyXS5fTV9hbHQgPSBfX2lkOworICAgIGVsc2UKKyAgICAgIF9NX25mYVtfTV9lbmQyXS5fTV9uZXh0ID0gX19pZDsKKyAgICBfTV9lbmQyID0gX1NfaW52YWxpZF9zdGF0ZV9pZDsKKyAgfQorICBpZiAoX01fZW5kMSAhPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICAgIF9NX25mYVtfTV9lbmQxXS5fTV9uZXh0ID0gX19pZDsKKyAgX01fZW5kMSA9IF9faWQ7Cit9CisKK2lubGluZSB2b2lkIF9TdGF0ZVNlcTo6CitfTV9hcHBlbmQoX1N0YXRlU2VxJiBfX3JocykKK3sKKyAgaWYgKF9NX2VuZDIgIT0gX1NfaW52YWxpZF9zdGF0ZV9pZCkKKyAgeworICAgIGlmIChfTV9lbmQyID09IF9NX2VuZDEpCisgICAgICBfTV9uZmFbX01fZW5kMl0uX01fYWx0ID0gX19yaHMuX01fc3RhcnQ7CisgICAgZWxzZQorICAgICAgX01fbmZhW19NX2VuZDJdLl9NX25leHQgPSBfX3Jocy5fTV9zdGFydDsKKyAgICBfTV9lbmQyID0gX1NfaW52YWxpZF9zdGF0ZV9pZDsKKyAgfQorICBpZiAoX19yaHMuX01fZW5kMiAhPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICAgIF9NX2VuZDIgPSBfX3Jocy5fTV9lbmQyOworICBpZiAoX01fZW5kMSAhPSBfU19pbnZhbGlkX3N0YXRlX2lkKQorICAgIF9NX25mYVtfTV9lbmQxXS5fTV9uZXh0ID0gX19yaHMuX01fc3RhcnQ7CisgIF9NX2VuZDEgPSBfX3Jocy5fTV9lbmQxOworfQorCisvLyBAdG9kbyBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KK2lubGluZSBfU3RhdGVJZFQgX1N0YXRlU2VxOjoKK19NX2Nsb25lKCkKK3sgcmV0dXJuIDA7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX3JlZ2V4Cit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3NoYXJlZF9wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zaGFyZWRfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhYzM4MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zaGFyZWRfcHRyLmgKQEAgLTAsMCArMSw1NjkgQEAKKy8vIHNoYXJlZF9wdHIgYW5kIHdlYWtfcHRyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBHQ0MgTm90ZTogQmFzZWQgb24gZmlsZXMgZnJvbSB2ZXJzaW9uIDEuMzIuMCBvZiB0aGUgQm9vc3QgbGlicmFyeS4KKworLy8gIHNoYXJlZF9jb3VudC5ocHAKKy8vICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YgYW5kIE11bHRpIE1lZGlhIEx0ZC4KKworLy8gIHNoYXJlZF9wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEdyZWcgQ29sdmluIGFuZCBCZW1hbiBEYXdlcy4KKy8vICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YKKworLy8gIHdlYWtfcHRyLmhwcAorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIERpbW92CisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLyoqIEBmaWxlIGJpdHMvc2hhcmVkX3B0ci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2RlZmluZSBfU0hBUkVEX1BUUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvc2hhcmVkX3B0cl9iYXNlLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLy8vIDIuMi4zLjcgc2hhcmVkX3B0ciBJL08KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoLCB0eXBlbmFtZSBfVHIsIHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgc3RkOjpiYXNpY19vc3RyZWFtPF9DaCwgX1RyPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2gsIF9Ucj4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fcCkKKyAgICB7CisgICAgICBfX29zIDw8IF9fcC5nZXQoKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICAvLy8gMi4yLjMuMTAgc2hhcmVkX3B0ciBnZXRfZGVsZXRlciAoZXhwZXJpbWVudGFsKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsLCB0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9EZWwqCisgICAgZ2V0X2RlbGV0ZXIoY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19wKQorICAgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X0RlbCo+KF9fcC5fTV9nZXRfZGVsZXRlcih0eXBlaWQoX0RlbCkpKTsKKyNlbHNlCisgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHNtYXJ0IHBvaW50ZXIgd2l0aCByZWZlcmVuY2UtY291bnRlZCBjb3B5IHNlbWFudGljcy4KKyAgICoKKyAgICogIFRoZSBvYmplY3QgcG9pbnRlZCB0byBpcyBkZWxldGVkIHdoZW4gdGhlIGxhc3Qgc2hhcmVkX3B0ciBwb2ludGluZyB0bworICAgKiAgaXQgaXMgZGVzdHJveWVkIG9yIHJlc2V0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgc2hhcmVkX3B0ciA6IHB1YmxpYyBfX3NoYXJlZF9wdHI8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhbiBlbXB0eSAlc2hhcmVkX3B0ci4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpPT0wICYmIGdldCgpPT0wCisgICAgICAgKi8KKyAgICAgIGNvbnN0ZXhwciBzaGFyZWRfcHRyKCkKKyAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oKSB7IH0KKworICAgICAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyJikgPSBkZWZhdWx0OyAvLyBuZXZlciB0aHJvd3MKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSAlc2hhcmVkX3B0ciB0aGF0IG93bnMgdGhlIHBvaW50ZXIgQGEgX19wLgorICAgICAgICogIEBwYXJhbSAgX19wICBBIHBvaW50ZXIgdGhhdCBpcyBjb252ZXJ0aWJsZSB0byBlbGVtZW50X3R5cGUqLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBjIGRlbGV0ZSBAYSBfX3AgaXMgY2FsbGVkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWV4cGxpY2l0IHNoYXJlZF9wdHIoX1RwMSogX19wKQorICAgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KF9fcCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgJXNoYXJlZF9wdHIgdGhhdCBvd25zIHRoZSBwb2ludGVyIEBhIF9fcAorICAgICAgICogICAgICAgICAgYW5kIHRoZSBkZWxldGVyIEBhIF9fZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyLgorICAgICAgICogIEBwYXJhbSAgX19kICBBIGRlbGV0ZXIuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKSA9PSAxICYmIGdldCgpID09IF9fcAorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MsIGluIHdoaWNoIGNhc2UgQGEgX19kKF9fcCkgaXMgY2FsbGVkLgorICAgICAgICoKKyAgICAgICAqICBSZXF1aXJlbWVudHM6IF9EZWxldGVyJ3MgY29weSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBtdXN0CisgICAgICAgKiAgbm90IHRocm93CisgICAgICAgKgorICAgICAgICogIF9fc2hhcmVkX3B0ciB3aWxsIHJlbGVhc2UgX19wIGJ5IGNhbGxpbmcgX19kKF9fcCkKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisJc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPihfX3AsIF9fZCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgJXNoYXJlZF9wdHIgdGhhdCBvd25zIGEgbnVsbCBwb2ludGVyCisgICAgICAgKiAgICAgICAgICBhbmQgdGhlIGRlbGV0ZXIgQGEgX19kLgorICAgICAgICogIEBwYXJhbSAgX19wICBBIG51bGwgcG9pbnRlciBjb25zdGFudC4KKyAgICAgICAqICBAcGFyYW0gIF9fZCAgQSBkZWxldGVyLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBhIF9fZChfX3ApIGlzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZW1lbnRzOiBfRGVsZXRlcidzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdAorICAgICAgICogIG5vdCB0aHJvdworICAgICAgICoKKyAgICAgICAqICBUaGUgbGFzdCBvd25lciB3aWxsIGNhbGwgX19kKF9fcCkKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbGV0ZXI+CisJc2hhcmVkX3B0cihudWxscHRyX3QgX19wLCBfRGVsZXRlciBfX2QpCisgICAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oX19wLCBfX2QpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgcG9pbnRlciBAYSBfX3AKKyAgICAgICAqICAgICAgICAgIGFuZCB0aGUgZGVsZXRlciBAYSBfX2QuCisgICAgICAgKiAgQHBhcmFtICBfX3AgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fZCAgQSBkZWxldGVyLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbiBhbGxvY2F0b3IuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKSA9PSAxICYmIGdldCgpID09IF9fcAorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MsIGluIHdoaWNoIGNhc2UgQGEgX19kKF9fcCkgaXMgY2FsbGVkLgorICAgICAgICoKKyAgICAgICAqICBSZXF1aXJlbWVudHM6IF9EZWxldGVyJ3MgY29weSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBtdXN0CisgICAgICAgKiAgbm90IHRocm93IF9BbGxvYydzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdCBub3QKKyAgICAgICAqICB0aHJvdy4KKyAgICAgICAqCisgICAgICAgKiAgX19zaGFyZWRfcHRyIHdpbGwgcmVsZWFzZSBfX3AgYnkgY2FsbGluZyBfX2QoX19wKQorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorCXNoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QsIF9BbGxvYyBfX2EpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgb3ducyBhIG51bGwgcG9pbnRlcgorICAgICAgICogICAgICAgICAgYW5kIHRoZSBkZWxldGVyIEBhIF9fZC4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBudWxsIHBvaW50ZXIgY29uc3RhbnQuCisgICAgICAgKiAgQHBhcmFtICBfX2QgIEEgZGVsZXRlci4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICogIEBwb3N0ICAgdXNlX2NvdW50KCkgPT0gMSAmJiBnZXQoKSA9PSBfX3AKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6YmFkX2FsbG9jLCBpbiB3aGljaCBjYXNlIEBhIF9fZChfX3ApIGlzIGNhbGxlZC4KKyAgICAgICAqCisgICAgICAgKiAgUmVxdWlyZW1lbnRzOiBfRGVsZXRlcidzIGNvcHkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgbXVzdAorICAgICAgICogIG5vdCB0aHJvdyBfQWxsb2MncyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG11c3Qgbm90CisgICAgICAgKiAgdGhyb3cuCisgICAgICAgKgorICAgICAgICogIFRoZSBsYXN0IG93bmVyIHdpbGwgY2FsbCBfX2QoX19wKQorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorCXNoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19wLCBfX2QsIHN0ZDo6bW92ZShfX2EpKSB7IH0KKworICAgICAgLy8gQWxpYXNpbmcgY29uc3RydWN0b3IKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3RzIGEgJXNoYXJlZF9wdHIgaW5zdGFuY2UgdGhhdCBzdG9yZXMgQGEgX19wCisgICAgICAgKiAgICAgICAgICBhbmQgc2hhcmVzIG93bmVyc2hpcCB3aXRoIEBhIF9fci4KKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSAlc2hhcmVkX3B0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBwb2ludGVyIHRoYXQgd2lsbCByZW1haW4gdmFsaWQgd2hpbGUgQGEgKl9fciBpcyB2YWxpZC4KKyAgICAgICAqICBAcG9zdCAgIGdldCgpID09IF9fcCAmJiB1c2VfY291bnQoKSA9PSBfX3IudXNlX2NvdW50KCkKKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBAYyBzaGFyZWRfcHRyIHRvIGEgc3ViLW9iamVjdAorICAgICAgICogIG9mIGFuIG9iamVjdCBtYW5hZ2VkIGJ5IGFuIGV4aXN0aW5nIEBjIHNoYXJlZF9wdHIuCisgICAgICAgKgorICAgICAgICogQGNvZGUKKyAgICAgICAqIHNoYXJlZF9wdHI8IHBhaXI8aW50LGludD4gPiBwaWkobmV3IHBhaXI8aW50LGludD4oKSk7CisgICAgICAgKiBzaGFyZWRfcHRyPGludD4gcGkocGlpLCAmcGlpLT5maXJzdCk7CisgICAgICAgKiBhc3NlcnQocGlpLnVzZV9jb3VudCgpID09IDIpOworICAgICAgICogQGVuZGNvZGUKKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fciwgX1RwKiBfX3ApCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IsIF9fcCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSWYgQGEgX19yIGlzIGVtcHR5LCBjb25zdHJ1Y3RzIGFuIGVtcHR5ICVzaGFyZWRfcHRyOworICAgICAgICogICAgICAgICAgb3RoZXJ3aXNlIGNvbnN0cnVjdCBhICVzaGFyZWRfcHRyIHRoYXQgc2hhcmVzIG93bmVyc2hpcAorICAgICAgICogICAgICAgICAgd2l0aCBAYSBfX3IuCisgICAgICAgKiAgQHBhcmFtICBfX3IgIEEgJXNoYXJlZF9wdHIuCisgICAgICAgKiAgQHBvc3QgICBnZXQoKSA9PSBfX3IuZ2V0KCkgJiYgdXNlX2NvdW50KCkgPT0gX19yLnVzZV9jb3VudCgpCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfVHAxKiwgX1RwKj46OnZhbHVlPjo6dHlwZT4KKwlzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikKKyAgICAgICAgOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUtY29uc3RydWN0cyBhICVzaGFyZWRfcHRyIGluc3RhbmNlIGZyb20gQGEgX19yLgorICAgICAgICogIEBwYXJhbSAgX19yICBBICVzaGFyZWRfcHRyIHJ2YWx1ZS4KKyAgICAgICAqICBAcG9zdCAgICp0aGlzIGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUgb2YgQGEgX19yLCBAYSBfX3IgaXMgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHNoYXJlZF9wdHIoc2hhcmVkX3B0ciYmIF9fcikKKyAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oc3RkOjptb3ZlKF9fcikpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1vdmUtY29uc3RydWN0cyBhICVzaGFyZWRfcHRyIGluc3RhbmNlIGZyb20gQGEgX19yLgorICAgICAgICogIEBwYXJhbSAgX19yICBBICVzaGFyZWRfcHRyIHJ2YWx1ZS4KKyAgICAgICAqICBAcG9zdCAgICp0aGlzIGNvbnRhaW5zIHRoZSBvbGQgdmFsdWUgb2YgQGEgX19yLCBAYSBfX3IgaXMgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfVHAxKiwgX1RwKj46OnZhbHVlPjo6dHlwZT4KKwlzaGFyZWRfcHRyKHNoYXJlZF9wdHI8X1RwMT4mJiBfX3IpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihzdGQ6Om1vdmUoX19yKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0cyBhICVzaGFyZWRfcHRyIHRoYXQgc2hhcmVzIG93bmVyc2hpcCB3aXRoIEBhIF9fcgorICAgICAgICogICAgICAgICAgYW5kIHN0b3JlcyBhIGNvcHkgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGluIEBhIF9fci4KKyAgICAgICAqICBAcGFyYW0gIF9fciAgQSB3ZWFrX3B0ci4KKyAgICAgICAqICBAcG9zdCAgIHVzZV9jb3VudCgpID09IF9fci51c2VfY291bnQoKQorICAgICAgICogIEB0aHJvdyAgYmFkX3dlYWtfcHRyIHdoZW4gX19yLmV4cGlyZWQoKSwKKyAgICAgICAqICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGNvbnN0cnVjdG9yIGhhcyBubyBlZmZlY3QuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJZXhwbGljaXQgc2hhcmVkX3B0cihjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXNoYXJlZF9wdHIoc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcikKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KHN0ZDo6bW92ZShfX3IpKSB7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfRGVsPgorCXNoYXJlZF9wdHIoc3RkOjp1bmlxdWVfcHRyPF9UcDEsIF9EZWw+JiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oc3RkOjptb3ZlKF9fcikpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBhbiBlbXB0eSAlc2hhcmVkX3B0ci4KKyAgICAgICAqICBAcGFyYW0gIF9fcCAgQSBudWxsIHBvaW50ZXIgY29uc3RhbnQuCisgICAgICAgKiAgQHBvc3QgICB1c2VfY291bnQoKSA9PSAwICYmIGdldCgpID09IG51bGxwdHIKKyAgICAgICAqLworICAgICAgY29uc3RleHByIHNoYXJlZF9wdHIobnVsbHB0cl90IF9fcCkKKyAgICAgIDogX19zaGFyZWRfcHRyPF9UcD4oX19wKSB7IH0KKworICAgICAgc2hhcmVkX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHImKSA9IGRlZmF1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKwl7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJc2hhcmVkX3B0ciYKKwlvcGVyYXRvcj0oc3RkOjphdXRvX3B0cjxfVHAxPiYmIF9fcikKKwl7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KHN0ZDo6bW92ZShfX3IpKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisjZW5kaWYKKworICAgICAgc2hhcmVkX3B0ciYKKyAgICAgIG9wZXJhdG9yPShzaGFyZWRfcHRyJiYgX19yKQorICAgICAgeworCXRoaXMtPl9fc2hhcmVkX3B0cjxfVHA+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKF9fcikpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwMT4KKwlzaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzaGFyZWRfcHRyPF9UcDE+JiYgX19yKQorCXsKKwkgIHRoaXMtPl9fc2hhcmVkX3B0cjxfVHA+OjpvcGVyYXRvcj0oc3RkOjptb3ZlKF9fcikpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlzaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzdGQ6OnVuaXF1ZV9wdHI8X1RwMSwgX0RlbD4mJiBfX3IpCisJeworCSAgdGhpcy0+X19zaGFyZWRfcHRyPF9UcD46Om9wZXJhdG9yPShzdGQ6Om1vdmUoX19yKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgbm9uLXN0YW5kYXJkLCBpdCBpcyB1c2VkIGJ5IGFsbG9jYXRlX3NoYXJlZC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJc2hhcmVkX3B0cihfU3BfbWFrZV9zaGFyZWRfdGFnIF9fdGFnLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3RhZywgX19hLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJZnJpZW5kIHNoYXJlZF9wdHI8X1RwMT4KKwlhbGxvY2F0ZV9zaGFyZWQoY29uc3QgX0FsbG9jJiBfX2EsIF9BcmdzJiYuLi4gX19hcmdzKTsKKyAgICB9OworCisgIC8vIDIwLjguMTMuMi43IHNoYXJlZF9wdHIgY29tcGFyaXNvbnMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19hLCBjb25zdCBzaGFyZWRfcHRyPF9UcDI+JiBfX2IpCisgICAgeyByZXR1cm4gX19hLmdldCgpID09IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2EsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiBfX2EuZ2V0KCkgPT0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fYikKKyAgICB7IHJldHVybiBudWxscHRyID09IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwgY29uc3Qgc2hhcmVkX3B0cjxfVHAyPiYgX19iKQorICAgIHsgcmV0dXJuIF9fYS5nZXQoKSAhPSBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19hLCBudWxscHRyX3QpCisgICAgeyByZXR1cm4gX19hLmdldCgpICE9IG51bGxwdHI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3Qgc2hhcmVkX3B0cjxfVHA+JiBfX2IpCisgICAgeyByZXR1cm4gbnVsbHB0ciAhPSBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fYSwgY29uc3Qgc2hhcmVkX3B0cjxfVHAyPiYgX19iKQorICAgIHsgcmV0dXJuIF9fYS5nZXQoKSA8IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbGVzczxzaGFyZWRfcHRyPF9UcD4+IDogcHVibGljIF9TcF9sZXNzPHNoYXJlZF9wdHI8X1RwPj4KKyAgICB7IH07CisKKyAgLy8gMjAuOC4xMy4yLjkgc2hhcmVkX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNoYXJlZF9wdHI8X1RwPiYgX19hLCBzaGFyZWRfcHRyPF9UcD4mIF9fYikKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICAvLyAyMC44LjEzLjIuMTAgc2hhcmVkX3B0ciBjYXN0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBzdGF0aWNfcG9pbnRlcl9jYXN0KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikKKyAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4oX19yLCBzdGF0aWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgY29uc3RfcG9pbnRlcl9jYXN0KGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikKKyAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4oX19yLCBjb25zdF9jYXN0PF9UcCo+KF9fci5nZXQoKSkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBkeW5hbWljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisgICAgeworICAgICAgaWYgKF9UcCogX19wID0gZHluYW1pY19jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisJcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fcCk7CisgICAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgc21hcnQgcG9pbnRlciB3aXRoIHdlYWsgc2VtYW50aWNzLgorICAgKgorICAgKiAgV2l0aCBmb3J3YXJkaW5nIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3Mgd2Vha19wdHIgOiBwdWJsaWMgX193ZWFrX3B0cjxfVHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciB3ZWFrX3B0cigpCisgICAgICA6IF9fd2Vha19wdHI8X1RwPigpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJd2Vha19wdHIoY29uc3Qgd2Vha19wdHI8X1RwMT4mIF9fcikKKwk6IF9fd2Vha19wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJd2Vha19wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorCTogX193ZWFrX3B0cjxfVHA+KF9fcikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJd2Vha19wdHImCisJb3BlcmF0b3I9KGNvbnN0IHdlYWtfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworCXsKKwkgIHRoaXMtPl9fd2Vha19wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXdlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworCXsKKwkgIHRoaXMtPl9fd2Vha19wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICBzaGFyZWRfcHRyPF9UcD4KKyAgICAgIGxvY2soKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKyNpZmRlZiBfX0dUSFJFQURTCisJaWYgKHRoaXMtPmV4cGlyZWQoKSkKKwkgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKTsKKworCV9fdHJ5CisJICB7CisJICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKnRoaXMpOworCSAgfQorCV9fY2F0Y2goY29uc3QgYmFkX3dlYWtfcHRyJikKKwkgIHsKKwkgICAgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPigpOworCSAgfQorI2Vsc2UKKwlyZXR1cm4gdGhpcy0+ZXhwaXJlZCgpID8gc2hhcmVkX3B0cjxfVHA+KCkgOiBzaGFyZWRfcHRyPF9UcD4oKnRoaXMpOworI2VuZGlmCisgICAgICB9CisgICAgfTsKKworICAvLyAyMC44LjEzLjMuNyB3ZWFrX3B0ciBzcGVjaWFsaXplZCBhbGdvcml0aG1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHdlYWtfcHRyPF9UcD4mIF9fYSwgd2Vha19wdHI8X1RwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisKKyAgLy8vIFByaW1hcnkgdGVtcGxhdGUgb3duZXJfbGVzcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M7CisKKyAgLy8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2Ygb3duZXJfbGVzcyBmb3Igc2hhcmVkX3B0ci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBvd25lcl9sZXNzPHNoYXJlZF9wdHI8X1RwPj4KKyAgICA6IHB1YmxpYyBfU3Bfb3duZXJfbGVzczxzaGFyZWRfcHRyPF9UcD4sIHdlYWtfcHRyPF9UcD4+CisgICAgeyB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIG93bmVyX2xlc3MgZm9yIHdlYWtfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M8d2Vha19wdHI8X1RwPj4KKyAgICA6IHB1YmxpYyBfU3Bfb3duZXJfbGVzczx3ZWFrX3B0cjxfVHA+LCBzaGFyZWRfcHRyPF9UcD4+CisgICAgeyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgYWxsb3dpbmcgdXNlIG9mIG1lbWJlciBmdW5jdGlvbiBzaGFyZWRfZnJvbV90aGlzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIGNvbnN0ZXhwciBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyhjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIHsgfQorCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICB+ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpCisgICAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBzaGFyZWRfcHRyPGNvbnN0IF9UcD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxjb25zdCBfVHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXZvaWQKKwlfTV93ZWFrX2Fzc2lnbihfVHAxKiBfX3AsIGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mIF9fbikgY29uc3QKKwl7IF9NX3dlYWtfdGhpcy5fTV9hc3NpZ24oX19wLCBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJZnJpZW5kIHZvaWQKKwlfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDw+JiBfX3BuLAorCQkJCQkgY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMqIF9fcGUsCisJCQkJCSBjb25zdCBfVHAxKiBfX3B4KQorCXsKKwkgIGlmIChfX3BlICE9IDApCisJICAgIF9fcGUtPl9NX3dlYWtfYXNzaWduKGNvbnN0X2Nhc3Q8X1RwMSo+KF9fcHgpLCBfX3BuKTsKKwl9CisKKyAgICAgIG11dGFibGUgd2Vha19wdHI8X1RwPiAgX01fd2Vha190aGlzOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBpcyBvd25lZCBieSBhIHNoYXJlZF9wdHIuCisgICAqICBAcGFyYW0gIF9fYSAgICAgQW4gYWxsb2NhdG9yLgorICAgKiAgQHBhcmFtICBfX2FyZ3MgIEFyZ3VtZW50cyBmb3IgdGhlIEBhIF9UcCBvYmplY3QncyBjb25zdHJ1Y3Rvci4KKyAgICogIEByZXR1cm4gQSBzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QuCisgICAqICBAdGhyb3cgIEFuIGV4Y2VwdGlvbiB0aHJvd24gZnJvbSBAYSBfQWxsb2M6OmFsbG9jYXRlIG9yIGZyb20gdGhlCisgICAqICAgICAgICAgIGNvbnN0cnVjdG9yIG9mIEBhIF9UcC4KKyAgICoKKyAgICogIEEgY29weSBvZiBAYSBfX2Egd2lsbCBiZSB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNoYXJlZF9wdHIKKyAgICogIGFuZCB0aGUgbmV3IG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgYWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9TcF9tYWtlX3NoYXJlZF90YWcoKSwgX19hLAorCQkJICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ3JlYXRlIGFuIG9iamVjdCB0aGF0IGlzIG93bmVkIGJ5IGEgc2hhcmVkX3B0ci4KKyAgICogIEBwYXJhbSAgX19hcmdzICBBcmd1bWVudHMgZm9yIHRoZSBAYSBfVHAgb2JqZWN0J3MgY29uc3RydWN0b3IuCisgICAqICBAcmV0dXJuIEEgc2hhcmVkX3B0ciB0aGF0IG93bnMgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LgorICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYywgb3IgYW4gZXhjZXB0aW9uIHRocm93biBmcm9tIHRoZQorICAgKiAgICAgICAgICBjb25zdHJ1Y3RvciBvZiBAYSBfVHAuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBzaGFyZWRfcHRyPF9UcD4KKyAgICBtYWtlX3NoYXJlZChfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PF9UcD46OnR5cGUgX1RwX25jOworICAgICAgcmV0dXJuIHN0ZDo6YWxsb2NhdGVfc2hhcmVkPF9UcD4oc3RkOjphbGxvY2F0b3I8X1RwX25jPigpLAorCQkJCSAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfcHRyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc2g8c2hhcmVkX3B0cjxfVHA+PgorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248c2hhcmVkX3B0cjxfVHA+LCBzaXplX3Q+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHNoYXJlZF9wdHI8X1RwPiYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpoYXNoPF9UcCo+KCkoX19zLmdldCgpKTsgfQorICAgIH07CisKKyAgLy8gQH0gZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX1NIQVJFRF9QVFJfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3NoYXJlZF9wdHJfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3NoYXJlZF9wdHJfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYWRjMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc2hhcmVkX3B0cl9iYXNlLmgKQEAgLTAsMCArMSwxMzg2IEBACisvLyBzaGFyZWRfcHRyIGFuZCB3ZWFrX3B0ciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBHQ0MgTm90ZTogQmFzZWQgb24gZmlsZXMgZnJvbSB2ZXJzaW9uIDEuMzIuMCBvZiB0aGUgQm9vc3QgbGlicmFyeS4KKworLy8gIHNoYXJlZF9jb3VudC5ocHAKKy8vICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YgYW5kIE11bHRpIE1lZGlhIEx0ZC4KKworLy8gIHNoYXJlZF9wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEdyZWcgQ29sdmluIGFuZCBCZW1hbiBEYXdlcy4KKy8vICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgUGV0ZXIgRGltb3YKKworLy8gIHdlYWtfcHRyLmhwcAorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAyIFBldGVyIERpbW92CisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLyoqIEBmaWxlIGJpdHMvc2hhcmVkX3B0cl9iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXttZW1vcnl9CisgKi8KKworI2lmbmRlZiBfU0hBUkVEX1BUUl9CQVNFX0gKKyNkZWZpbmUgX1NIQVJFRF9QVFJfQkFTRV9IIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgLyoqCisgICAqICBAYnJpZWYgIEV4Y2VwdGlvbiBwb3NzaWJseSB0aHJvd24gYnkgQGMgc2hhcmVkX3B0ci4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIGJhZF93ZWFrX3B0ciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNoYXIgY29uc3QqCisgICAgd2hhdCgpIGNvbnN0IHRocm93KCk7CisKKyAgICB2aXJ0dWFsIH5iYWRfd2Vha19wdHIoKSB0aHJvdygpOyAgICAKKyAgfTsKKworICAvLyBTdWJzdGl0dXRlIGZvciBiYWRfd2Vha19wdHIgb2JqZWN0IGluIHRoZSBjYXNlIG9mIC1mbm8tZXhjZXB0aW9ucy4KKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19iYWRfd2Vha19wdHIoKQorICB7CisjaWYgX19FWENFUFRJT05TCisgICAgdGhyb3cgYmFkX3dlYWtfcHRyKCk7CisjZWxzZQorICAgIF9fYnVpbHRpbl9hYm9ydCgpOworI2VuZGlmCisgIH0KKworICB1c2luZyBfX2dudV9jeHg6Ol9Mb2NrX3BvbGljeTsKKyAgdXNpbmcgX19nbnVfY3h4OjpfX2RlZmF1bHRfbG9ja19wb2xpY3k7CisgIHVzaW5nIF9fZ251X2N4eDo6X1Nfc2luZ2xlOworICB1c2luZyBfX2dudV9jeHg6Ol9TX211dGV4OworICB1c2luZyBfX2dudV9jeHg6Ol9TX2F0b21pYzsKKworICAvLyBFbXB0eSBoZWxwZXIgY2xhc3MgZXhjZXB0IHdoZW4gdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIF9TX211dGV4LgorICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9NdXRleF9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoZSBhdG9taWMgcG9saWN5IHVzZXMgZnVsbHktZmVuY2VkIGJ1aWx0aW5zLCBzaW5nbGUgZG9lc24ndCBjYXJlLgorICAgICAgZW51bSB7IF9TX25lZWRfYmFycmllcnMgPSAwIH07CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX011dGV4X2Jhc2U8X1NfbXV0ZXg+CisgICAgOiBwdWJsaWMgX19nbnVfY3h4OjpfX211dGV4CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoaXMgcG9saWN5IGlzIHVzZWQgd2hlbiBhdG9taWMgYnVpbHRpbnMgYXJlIG5vdCBhdmFpbGFibGUuCisgICAgICAvLyBUaGUgcmVwbGFjZW1lbnQgYXRvbWljIG9wZXJhdGlvbnMgbWlnaHQgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeQorICAgICAgLy8gbWVtb3J5IGJhcnJpZXJzLgorICAgICAgZW51bSB7IF9TX25lZWRfYmFycmllcnMgPSAxIH07CisgICAgfTsKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9TcF9jb3VudGVkX2Jhc2UKKyAgICA6IHB1YmxpYyBfTXV0ZXhfYmFzZTxfTHA+CisgICAgeworICAgIHB1YmxpYzogIAorICAgICAgX1NwX2NvdW50ZWRfYmFzZSgpCisgICAgICA6IF9NX3VzZV9jb3VudCgxKSwgX01fd2Vha19jb3VudCgxKSB7IH0KKyAgICAgIAorICAgICAgdmlydHVhbAorICAgICAgfl9TcF9jb3VudGVkX2Jhc2UoKSAvLyBub3Rocm93IAorICAgICAgeyB9CisgIAorICAgICAgLy8gQ2FsbGVkIHdoZW4gX01fdXNlX2NvdW50IGRyb3BzIHRvIHplcm8sIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcworICAgICAgLy8gbWFuYWdlZCBieSAqdGhpcy4KKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGlzcG9zZSgpID0gMDsgLy8gbm90aHJvdworICAgICAgCisgICAgICAvLyBDYWxsZWQgd2hlbiBfTV93ZWFrX2NvdW50IGRyb3BzIHRvIHplcm8uCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSAvLyBub3Rocm93CisgICAgICB7IGRlbGV0ZSB0aGlzOyB9CisgICAgICAKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJikgPSAwOworCisgICAgICB2b2lkCisgICAgICBfTV9hZGRfcmVmX2NvcHkoKQorICAgICAgeyBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAxKTsgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkZF9yZWZfbG9jaygpOworICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9yZWxlYXNlKCkgLy8gbm90aHJvdworICAgICAgeworICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiAgRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fdXNlX2NvdW50KTsKKwlpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgLTEpID09IDEpCisJICB7CisgICAgICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fdXNlX2NvdW50KTsKKwkgICAgX01fZGlzcG9zZSgpOworCSAgICAvLyBUaGVyZSBtdXN0IGJlIGEgbWVtb3J5IGJhcnJpZXIgYmV0d2VlbiBkaXNwb3NlKCkgYW5kIGRlc3Ryb3koKQorCSAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgZWZmZWN0cyBvZiBkaXNwb3NlKCkgYXJlIG9ic2VydmVkIGluIHRoZQorCSAgICAvLyB0aHJlYWQgdGhhdCBydW5zIGRlc3Ryb3koKS4KKwkgICAgLy8gU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwNS0xMS9tc2cwMDEzNi5odG1sCisJICAgIGlmIChfTXV0ZXhfYmFzZTxfTHA+OjpfU19uZWVkX2JhcnJpZXJzKQorCSAgICAgIHsKKwkgICAgICAgIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVI7CisJICAgICAgICBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUjsKKwkgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fd2Vha19jb3VudCk7CisJICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fd2Vha19jb3VudCwKKwkJCQkJCSAgICAgICAtMSkgPT0gMSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgICAgIF9NX2Rlc3Ryb3koKTsKKyAgICAgICAgICAgICAgfQorCSAgfQorICAgICAgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3dlYWtfYWRkX3JlZigpIC8vIG5vdGhyb3cKKyAgICAgIHsgX19nbnVfY3h4OjpfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9NX3dlYWtfY291bnQsIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3dlYWtfcmVsZWFzZSgpIC8vIG5vdGhyb3cKKyAgICAgIHsKKyAgICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gRm9yIG1vcmUgaW5mbyBzZWUgYml0cy9jKytjb25maWcuCisgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fd2Vha19jb3VudCk7CisJaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV93ZWFrX2NvdW50LCAtMSkgPT0gMSkKKwkgIHsKKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgaWYgKF9NdXRleF9iYXNlPF9McD46Ol9TX25lZWRfYmFycmllcnMpCisJICAgICAgeworCSAgICAgICAgLy8gU2VlIF9NX3JlbGVhc2UoKSwKKwkgICAgICAgIC8vIGRlc3Ryb3koKSBtdXN0IG9ic2VydmUgcmVzdWx0cyBvZiBkaXNwb3NlKCkKKwkgICAgICAgIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVI7CisJICAgICAgICBfR0xJQkNYWF9XUklURV9NRU1fQkFSUklFUjsKKwkgICAgICB9CisJICAgIF9NX2Rlc3Ryb3koKTsKKwkgIH0KKyAgICAgIH0KKyAgCisgICAgICBsb25nCisgICAgICBfTV9nZXRfdXNlX2NvdW50KCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeworICAgICAgICAvLyBObyBtZW1vcnkgYmFycmllciBpcyB1c2VkIGhlcmUgc28gdGhlcmUgaXMgbm8gc3luY2hyb25pemF0aW9uCisgICAgICAgIC8vIHdpdGggb3RoZXIgdGhyZWFkcy4KKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3Qgdm9sYXRpbGUgX0F0b21pY193b3JkJj4oX01fdXNlX2NvdW50KTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6ICAKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2UoX1NwX2NvdW50ZWRfYmFzZSBjb25zdCYpOworICAgICAgX1NwX2NvdW50ZWRfYmFzZSYgb3BlcmF0b3I9KF9TcF9jb3VudGVkX2Jhc2UgY29uc3QmKTsKKworICAgICAgX0F0b21pY193b3JkICBfTV91c2VfY291bnQ7ICAgICAvLyAjc2hhcmVkCisgICAgICBfQXRvbWljX3dvcmQgIF9NX3dlYWtfY291bnQ7ICAgIC8vICN3ZWFrICsgKCNzaGFyZWQgIT0gMCkKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1Nfc2luZ2xlPjo6CisgICAgX01fYWRkX3JlZl9sb2NrKCkKKyAgICB7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSkgPT0gMCkKKwl7CisJICBfTV91c2VfY291bnQgPSAwOworCSAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX2Jhc2U8X1NfbXV0ZXg+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIF9fZ251X2N4eDo6X19zY29wZWRfbG9jayBzZW50cnkoKnRoaXMpOworICAgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIDEpID09IDApCisJeworCSAgX01fdXNlX2NvdW50ID0gMDsKKwkgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTw+IAorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19hdG9taWM+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIC8vIFBlcmZvcm0gbG9jay1mcmVlIGFkZC1pZi1ub3QtemVybyBvcGVyYXRpb24uCisgICAgICBfQXRvbWljX3dvcmQgX19jb3VudDsKKyAgICAgIGRvCisJeworCSAgX19jb3VudCA9IF9NX3VzZV9jb3VudDsKKwkgIGlmIChfX2NvdW50ID09IDApCisJICAgIF9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisJICAKKwkgIC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZSB3aXRoIHRoZSBvbGQgdmFsdWUgKyAxLCBhcworCSAgLy8gbG9uZyBhcyBpdCdzIG5vdCBjaGFuZ2VkIG1lYW53aGlsZS4gCisJfQorICAgICAgd2hpbGUgKCFfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCZfTV91c2VfY291bnQsIF9fY291bnQsCisJCQkJCSAgIF9fY291bnQgKyAxKSk7CisgICAgfQorCisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3NoYXJlZF9wdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fd2Vha19wdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHNoYXJlZF9wdHI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHdlYWtfcHRyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3Qgb3duZXJfbGVzczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM7CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3dlYWtfY291bnQ7CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3NoYXJlZF9jb3VudDsKKworCisgIC8vIENvdW50ZWQgcHRyIHdpdGggbm8gZGVsZXRlciBvciBhbGxvY2F0b3Igc3VwcG9ydAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9TcF9jb3VudGVkX3B0ciA6IHB1YmxpYyBfU3BfY291bnRlZF9iYXNlPF9McD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9TcF9jb3VudGVkX3B0cihfUHRyIF9fcCkKKyAgICAgIDogX01fcHRyKF9fcCkgeyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGlzcG9zZSgpIC8vIG5vdGhyb3cKKyAgICAgIHsgZGVsZXRlIF9NX3B0cjsgfQorCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSAvLyBub3Rocm93CisgICAgICB7IGRlbGV0ZSB0aGlzOyB9CisKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJikKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgX1NwX2NvdW50ZWRfcHRyKGNvbnN0IF9TcF9jb3VudGVkX3B0ciYpID0gZGVsZXRlOworICAgICAgX1NwX2NvdW50ZWRfcHRyJiBvcGVyYXRvcj0oY29uc3QgX1NwX2NvdW50ZWRfcHRyJikgPSBkZWxldGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHRyICAgICAgICAgICAgIF9NX3B0cjsgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TcF9jb3VudGVkX3B0cjxudWxscHRyX3QsIF9TX3NpbmdsZT46Ol9NX2Rpc3Bvc2UoKSB7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9wdHI8bnVsbHB0cl90LCBfU19tdXRleD46Ol9NX2Rpc3Bvc2UoKSB7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9wdHI8bnVsbHB0cl90LCBfU19hdG9taWM+OjpfTV9kaXNwb3NlKCkgeyB9CisKKyAgLy8gU3VwcG9ydCBmb3IgY3VzdG9tIGRlbGV0ZXIgYW5kL29yIGFsbG9jYXRvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHRyLCB0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9TcF9jb3VudGVkX2RlbGV0ZXIgOiBwdWJsaWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlCisJICByZWJpbmQ8X1NwX2NvdW50ZWRfZGVsZXRlcj46Om90aGVyIF9NeV9hbGxvY190eXBlOworCisgICAgICAvLyBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgdGhlIERlbGV0ZXIgYW5kIGFsc28gYWN0cyBhcyBhbiBhbGxvY2F0b3IuCisgICAgICAvLyBVc2VkIHRvIGRpc3Bvc2Ugb2YgdGhlIG93bmVkIHBvaW50ZXIgYW5kIHRoZSBpbnRlcm5hbCByZWZjb3VudAorICAgICAgLy8gUmVxdWlyZXMgdGhhdCBjb3BpZXMgb2YgX0FsbG9jIGNhbiBmcmVlIGVhY2ggb3RoZXIncyBtZW1vcnkuCisgICAgICBzdHJ1Y3QgX015X0RlbGV0ZXIKKyAgICAgIDogcHVibGljIF9NeV9hbGxvY190eXBlICAgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICAgIHsKKwlfRGVsZXRlciBfTV9kZWw7ICAgICAgICAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworCV9NeV9EZWxldGVyKF9EZWxldGVyIF9fZCwgY29uc3QgX0FsbG9jJiBfX2EpCisJOiBfTXlfYWxsb2NfdHlwZShfX2EpLCBfTV9kZWwoX19kKSB7IH0KKyAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBfX2QoX19wKSBtdXN0IG5vdCB0aHJvdy4KKyAgICAgIF9TcF9jb3VudGVkX2RlbGV0ZXIoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgIDogX01fcHRyKF9fcCksIF9NX2RlbChfX2QsIF9BbGxvYygpKSB7IH0KKworICAgICAgLy8gX19kKF9fcCkgbXVzdCBub3QgdGhyb3cuCisgICAgICBfU3BfY291bnRlZF9kZWxldGVyKF9QdHIgX19wLCBfRGVsZXRlciBfX2QsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgOiBfTV9wdHIoX19wKSwgX01fZGVsKF9fZCwgX19hKSB7IH0KKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgLy8gbm90aHJvdworICAgICAgeyBfTV9kZWwuX01fZGVsKF9NX3B0cik7IH0KKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kZXN0cm95KCkgLy8gbm90aHJvdworICAgICAgeworCV9NeV9hbGxvY190eXBlIF9fYShfTV9kZWwpOworCXRoaXMtPn5fU3BfY291bnRlZF9kZWxldGVyKCk7CisJX19hLmRlYWxsb2NhdGUodGhpcywgMSk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKQorICAgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKyAgICAgICAgcmV0dXJuIF9fdGkgPT0gdHlwZWlkKF9EZWxldGVyKSA/ICZfTV9kZWwuX01fZGVsIDogMDsKKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHRyICAgICAgICAgICAgIF9NX3B0cjsgIC8vIGNvcHkgY29uc3RydWN0b3IgbXVzdCBub3QgdGhyb3cKKyAgICAgIF9NeV9EZWxldGVyICAgICAgX01fZGVsOyAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworICAgIH07CisKKyAgLy8gaGVscGVycyBmb3IgbWFrZV9zaGFyZWQgLyBhbGxvY2F0ZV9zaGFyZWQKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9TcF9kZXN0cm95X2lucGxhY2UKKyAgICB7CisgICAgICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0IHsgaWYgKF9fcCkgX19wLT5+X1RwKCk7IH0KKyAgICB9OworCisgIHN0cnVjdCBfU3BfbWFrZV9zaGFyZWRfdGFnIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYywgX0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfU3BfY291bnRlZF9wdHJfaW5wbGFjZQorICAgIDogcHVibGljIF9TcF9jb3VudGVkX2RlbGV0ZXI8X1RwKiwgX1NwX2Rlc3Ryb3lfaW5wbGFjZTxfVHA+LCBfQWxsb2MsIF9McD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9TcF9jb3VudGVkX2RlbGV0ZXI8X1RwKiwgX1NwX2Rlc3Ryb3lfaW5wbGFjZTxfVHA+LCBfQWxsb2MsIF9McD4KKwlfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIF9TcF9jb3VudGVkX3B0cl9pbnBsYWNlKF9BbGxvYyBfX2EpCisgICAgICA6IF9CYXNlX3R5cGUoc3RhdGljX2Nhc3Q8X1RwKj4oMCksIF9TcF9kZXN0cm95X2lucGxhY2U8X1RwPigpLCBfX2EpCisgICAgICAsIF9NX3N0b3JhZ2UoKQorICAgICAgeworCXZvaWQqIF9fcCA9ICZfTV9zdG9yYWdlOworCTo6bmV3IChfX3ApIF9UcCgpOyAgLy8gbWlnaHQgdGhyb3cKKwlfQmFzZV90eXBlOjpfTV9wdHIgPSBzdGF0aWNfY2FzdDxfVHAqPihfX3ApOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlfU3BfY291bnRlZF9wdHJfaW5wbGFjZShfQWxsb2MgX19hLCBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9CYXNlX3R5cGUoc3RhdGljX2Nhc3Q8X1RwKj4oMCksIF9TcF9kZXN0cm95X2lucGxhY2U8X1RwPigpLCBfX2EpCisJLCBfTV9zdG9yYWdlKCkKKwl7CisJICB2b2lkKiBfX3AgPSAmX01fc3RvcmFnZTsKKwkgIDo6bmV3IChfX3ApIF9UcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyAgLy8gbWlnaHQgdGhyb3cKKwkgIF9CYXNlX3R5cGU6Ol9NX3B0ciA9IHN0YXRpY19jYXN0PF9UcCo+KF9fcCk7CisJfQorCisgICAgICAvLyBPdmVycmlkZSBiZWNhdXNlIHRoZSBhbGxvY2F0b3IgbmVlZHMgdG8ga25vdyB0aGUgZHluYW1pYyB0eXBlCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3koKSAvLyBub3Rocm93CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlCisJICAgIHJlYmluZDxfU3BfY291bnRlZF9wdHJfaW5wbGFjZT46Om90aGVyIF9NeV9hbGxvY190eXBlOworCV9NeV9hbGxvY190eXBlIF9fYShfQmFzZV90eXBlOjpfTV9kZWwpOworCXRoaXMtPn5fU3BfY291bnRlZF9wdHJfaW5wbGFjZSgpOworCV9fYS5kZWFsbG9jYXRlKHRoaXMsIDEpOworICAgICAgfQorCisgICAgICAvLyBTbmVha3kgdHJpY2sgc28gX19zaGFyZWRfcHRyIGNhbiBnZXQgdGhlIG1hbmFnZWQgcG9pbnRlcgorICAgICAgdmlydHVhbCB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpCisgICAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorCXJldHVybiBfX3RpID09IHR5cGVpZChfU3BfbWFrZV9zaGFyZWRfdGFnKQorCSAgICAgICA/IHN0YXRpY19jYXN0PHZvaWQqPigmX01fc3RvcmFnZSkKKwkgICAgICAgOiBfQmFzZV90eXBlOjpfTV9nZXRfZGVsZXRlcihfX3RpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZW5hbWUgYWxpZ25lZF9zdG9yYWdlPHNpemVvZihfVHApLCBhbGlnbm1lbnRfb2Y8X1RwPjo6dmFsdWU+Ojp0eXBlCisJX01fc3RvcmFnZTsKKyAgICB9OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX19zaGFyZWRfY291bnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIF9fc2hhcmVkX2NvdW50KCkgOiBfTV9waSgwKSAvLyBub3Rocm93CisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0cj4KKyAgICAgICAgZXhwbGljaXQKKwlfX3NoYXJlZF9jb3VudChfUHRyIF9fcCkgOiBfTV9waSgwKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfTV9waSA9IG5ldyBfU3BfY291bnRlZF9wdHI8X1B0ciwgX0xwPihfX3ApOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIGRlbGV0ZSBfX3A7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9EZWxldGVyPgorCV9fc2hhcmVkX2NvdW50KF9QdHIgX19wLCBfRGVsZXRlciBfX2QpIDogX01fcGkoMCkKKwl7CisJICAvLyBUaGUgYWxsb2NhdG9yJ3MgdmFsdWVfdHlwZSBkb2Vzbid0IG1hdHRlciwgd2lsbCByZWJpbmQgaXQgYW55d2F5LgorCSAgdHlwZWRlZiBzdGQ6OmFsbG9jYXRvcjxpbnQ+IF9BbGxvYzsKKwkgIHR5cGVkZWYgX1NwX2NvdW50ZWRfZGVsZXRlcjxfUHRyLCBfRGVsZXRlciwgX0FsbG9jLCBfTHA+IF9TcF9jZF90eXBlOworCSAgdHlwZWRlZiBzdGQ6OmFsbG9jYXRvcjxfU3BfY2RfdHlwZT4gX0FsbG9jMjsKKwkgIF9BbGxvYzIgX19hMjsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfTV9waSA9IF9fYTIuYWxsb2NhdGUoMSk7CisJICAgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9NX3BpKSkgX1NwX2NkX3R5cGUoX19wLCBfX2QpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9fZChfX3ApOyAvLyBDYWxsIF9EZWxldGVyIG9uIF9fcC4KKwkgICAgICBpZiAoX01fcGkpCisJCV9fYTIuZGVhbGxvY2F0ZShzdGF0aWNfY2FzdDxfU3BfY2RfdHlwZSo+KF9NX3BpKSwgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9EZWxldGVyLCB0eXBlbmFtZSBfQWxsb2M+CisJX19zaGFyZWRfY291bnQoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCwgX0FsbG9jIF9fYSkgOiBfTV9waSgwKQorCXsKKwkgIHR5cGVkZWYgX1NwX2NvdW50ZWRfZGVsZXRlcjxfUHRyLCBfRGVsZXRlciwgX0FsbG9jLCBfTHA+IF9TcF9jZF90eXBlOworCSAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfU3BfY2RfdHlwZT46Om90aGVyIF9BbGxvYzI7CisJICBfQWxsb2MyIF9fYTIoX19hKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfTV9waSA9IF9fYTIuYWxsb2NhdGUoMSk7CisJICAgICAgOjpuZXcoc3RhdGljX2Nhc3Q8dm9pZCo+KF9NX3BpKSkgX1NwX2NkX3R5cGUoX19wLCBfX2QsIF9fYSk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX19kKF9fcCk7IC8vIENhbGwgX0RlbGV0ZXIgb24gX19wLgorCSAgICAgIGlmIChfTV9waSkKKwkJX19hMi5kZWFsbG9jYXRlKHN0YXRpY19jYXN0PF9TcF9jZF90eXBlKj4oX01fcGkpLCAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MsIHR5cGVuYW1lLi4uIF9BcmdzPgorCV9fc2hhcmVkX2NvdW50KF9TcF9tYWtlX3NoYXJlZF90YWcsIF9UcCosIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9waSgwKQorCXsKKwkgIHR5cGVkZWYgX1NwX2NvdW50ZWRfcHRyX2lucGxhY2U8X1RwLCBfQWxsb2MsIF9McD4gX1NwX2NwX3R5cGU7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9TcF9jcF90eXBlPjo6b3RoZXIgX0FsbG9jMjsKKwkgIF9BbGxvYzIgX19hMihfX2EpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9NX3BpID0gX19hMi5hbGxvY2F0ZSgxKTsKKwkgICAgICA6Om5ldyhzdGF0aWNfY2FzdDx2b2lkKj4oX01fcGkpKSBfU3BfY3BfdHlwZShfX2EsCisJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIGlmIChfTV9waSkKKwkJX19hMi5kZWFsbG9jYXRlKHN0YXRpY19jYXN0PF9TcF9jcF90eXBlKj4oX01fcGkpLCAxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGF1dG9fcHRyPF9UcD4gdG8gcHJvdmlkZSB0aGUgc3Ryb25nIGd1YXJhbnRlZS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgZXhwbGljaXQKKwlfX3NoYXJlZF9jb3VudChzdGQ6OmF1dG9fcHRyPF9UcD4mJiBfX3IpCisJOiBfTV9waShuZXcgX1NwX2NvdW50ZWRfcHRyPF9UcCosIF9McD4oX19yLmdldCgpKSkKKwl7IF9fci5yZWxlYXNlKCk7IH0KKyNlbmRpZgorCisgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHVuaXF1ZV9wdHI8X1RwLF9EZWw+IHRvIHByb3ZpZGUgdGhlIHN0cm9uZyBndWFyYW50ZWUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EZWw+CisgICAgICAgIGV4cGxpY2l0CisJX19zaGFyZWRfY291bnQoc3RkOjp1bmlxdWVfcHRyPF9UcCwgX0RlbD4mJiBfX3IpCisJOiBfTV9waShfU19jcmVhdGVfZnJvbV91cChzdGQ6Om1vdmUoX19yKSkpCisJeyBfX3IucmVsZWFzZSgpOyB9CisKKyAgICAgIC8vIFRocm93IGJhZF93ZWFrX3B0ciB3aGVuIF9fci5fTV9nZXRfdXNlX2NvdW50KCkgPT0gMC4KKyAgICAgIGV4cGxpY2l0IF9fc2hhcmVkX2NvdW50KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpOworCisgICAgICB+X19zaGFyZWRfY291bnQoKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fcmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBfX3NoYXJlZF9jb3VudChjb25zdCBfX3NoYXJlZF9jb3VudCYgX19yKQorICAgICAgOiBfTV9waShfX3IuX01fcGkpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV9hZGRfcmVmX2NvcHkoKTsKKyAgICAgIH0KKworICAgICAgX19zaGFyZWRfY291bnQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfY291bnQmIF9fcikgLy8gbm90aHJvdworICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJaWYgKF9fdG1wICE9IF9NX3BpKQorCSAgeworCSAgICBpZiAoX190bXAgIT0gMCkKKwkgICAgICBfX3RtcC0+X01fYWRkX3JlZl9jb3B5KCk7CisJICAgIGlmIChfTV9waSAhPSAwKQorCSAgICAgIF9NX3BpLT5fTV9yZWxlYXNlKCk7CisJICAgIF9NX3BpID0gX190bXA7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fc2hhcmVkX2NvdW50JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCV9fci5fTV9waSA9IF9NX3BpOworCV9NX3BpID0gX190bXA7CisgICAgICB9CisKKyAgICAgIGxvbmcKKyAgICAgIF9NX2dldF91c2VfY291bnQoKSBjb25zdCAvLyBub3Rocm93CisgICAgICB7IHJldHVybiBfTV9waSAhPSAwID8gX01fcGktPl9NX2dldF91c2VfY291bnQoKSA6IDA7IH0KKworICAgICAgYm9vbAorICAgICAgX01fdW5pcXVlKCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeyByZXR1cm4gdGhpcy0+X01fZ2V0X3VzZV9jb3VudCgpID09IDE7IH0KKworICAgICAgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcGkgPyBfTV9waS0+X01fZ2V0X2RlbGV0ZXIoX190aSkgOiAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2xlc3MoY29uc3QgX19zaGFyZWRfY291bnQmIF9fcmhzKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpsZXNzPF9TcF9jb3VudGVkX2Jhc2U8X0xwPio+KCkodGhpcy0+X01fcGksIF9fcmhzLl9NX3BpKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9sZXNzKGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfU3BfY291bnRlZF9iYXNlPF9McD4qPigpKHRoaXMtPl9NX3BpLCBfX3Jocy5fTV9waSk7IH0KKworICAgICAgLy8gRnJpZW5kIGZ1bmN0aW9uIGluamVjdGVkIGludG8gZW5jbG9zaW5nIG5hbWVzcGFjZSBhbmQgZm91bmQgYnkgQURMCisgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX19zaGFyZWRfY291bnQmIF9fYSwgY29uc3QgX19zaGFyZWRfY291bnQmIF9fYikKKyAgICAgIHsgcmV0dXJuIF9fYS5fTV9waSA9PSBfX2IuX01fcGk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgX193ZWFrX2NvdW50PF9McD47CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RlbD4KKwlzdGF0aWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KgorCV9TX2NyZWF0ZV9mcm9tX3VwKHN0ZDo6dW5pcXVlX3B0cjxfVHAsIF9EZWw+JiYgX19yLAorCSAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfcmVmZXJlbmNlPF9EZWw+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKwl7CisJICByZXR1cm4gbmV3IF9TcF9jb3VudGVkX2RlbGV0ZXI8X1RwKiwgX0RlbCwgc3RkOjphbGxvY2F0b3I8X1RwPiwKKwkgICAgX0xwPihfX3IuZ2V0KCksIF9fci5nZXRfZGVsZXRlcigpKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RlbD4KKwlzdGF0aWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+KgorCV9TX2NyZWF0ZV9mcm9tX3VwKHN0ZDo6dW5pcXVlX3B0cjxfVHAsIF9EZWw+JiYgX19yLAorCSAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19yZWZlcmVuY2U8X0RlbD46OnZhbHVlPjo6dHlwZSogPSAwKQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPF9EZWw+Ojp0eXBlIF9EZWwxOworCSAgdHlwZWRlZiBzdGQ6OnJlZmVyZW5jZV93cmFwcGVyPF9EZWwxPiBfRGVsMjsKKwkgIHJldHVybiBuZXcgX1NwX2NvdW50ZWRfZGVsZXRlcjxfVHAqLCBfRGVsMiwgc3RkOjphbGxvY2F0b3I8X1RwPiwKKwkgICAgX0xwPihfX3IuZ2V0KCksIHN0ZDo6cmVmKF9fci5nZXRfZGVsZXRlcigpKSk7CisJfQorCisgICAgICBfU3BfY291bnRlZF9iYXNlPF9McD4qICBfTV9waTsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBjbGFzcyBfX3dlYWtfY291bnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIF9fd2Vha19jb3VudCgpIDogX01fcGkoMCkgLy8gbm90aHJvdworICAgICAgeyB9CisKKyAgICAgIF9fd2Vha19jb3VudChjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3IpIDogX01fcGkoX19yLl9NX3BpKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fd2Vha19hZGRfcmVmKCk7CisgICAgICB9CisKKyAgICAgIF9fd2Vha19jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKSA6IF9NX3BpKF9fci5fTV9waSkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfYWRkX3JlZigpOworICAgICAgfQorCisgICAgICB+X193ZWFrX2NvdW50KCkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworICAgICAgfQorCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCWlmIChfX3RtcCAhPSAwKQorCSAgX190bXAtPl9NX3dlYWtfYWRkX3JlZigpOworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworCV9NX3BpID0gX190bXA7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlpZiAoX190bXAgIT0gMCkKKwkgIF9fdG1wLT5fTV93ZWFrX2FkZF9yZWYoKTsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX3JlbGVhc2UoKTsKKwlfTV9waSA9IF9fdG1wOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fc3dhcChfX3dlYWtfY291bnQ8X0xwPiYgX19yKSAvLyBub3Rocm93CisgICAgICB7CisJX1NwX2NvdW50ZWRfYmFzZTxfTHA+KiBfX3RtcCA9IF9fci5fTV9waTsKKwlfX3IuX01fcGkgPSBfTV9waTsKKwlfTV9waSA9IF9fdG1wOworICAgICAgfQorCisgICAgICBsb25nCisgICAgICBfTV9nZXRfdXNlX2NvdW50KCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeyByZXR1cm4gX01fcGkgIT0gMCA/IF9NX3BpLT5fTV9nZXRfdXNlX2NvdW50KCkgOiAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2xlc3MoY29uc3QgX193ZWFrX2NvdW50JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfU3BfY291bnRlZF9iYXNlPF9McD4qPigpKHRoaXMtPl9NX3BpLCBfX3Jocy5fTV9waSk7IH0KKworICAgICAgYm9vbAorICAgICAgX01fbGVzcyhjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfU3BfY291bnRlZF9iYXNlPF9McD4qPigpKHRoaXMtPl9NX3BpLCBfX3Jocy5fTV9waSk7IH0KKworICAgICAgLy8gRnJpZW5kIGZ1bmN0aW9uIGluamVjdGVkIGludG8gZW5jbG9zaW5nIG5hbWVzcGFjZSBhbmQgZm91bmQgYnkgQURMCisgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX193ZWFrX2NvdW50JiBfX2EsIGNvbnN0IF9fd2Vha19jb3VudCYgX19iKQorICAgICAgeyByZXR1cm4gX19hLl9NX3BpID09IF9fYi5fTV9waTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9jb3VudDxfTHA+OworCisgICAgICBfU3BfY291bnRlZF9iYXNlPF9McD4qICBfTV9waTsKKyAgICB9OworCisgIC8vIE5vdyB0aGF0IF9fd2Vha19jb3VudCBpcyBkZWZpbmVkIHdlIGNhbiBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RvcjoKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfY291bnQ8X0xwPjo6IF9fc2hhcmVkX2NvdW50KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpCisgICAgOiBfTV9waShfX3IuX01fcGkpCisgICAgeworICAgICAgaWYgKF9NX3BpICE9IDApCisJX01fcGktPl9NX2FkZF9yZWZfbG9jaygpOworICAgICAgZWxzZQorCV9fdGhyb3dfYmFkX3dlYWtfcHRyKCk7CisgICAgfQorCisKKyAgLy8gU3VwcG9ydCBmb3IgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisKKyAgLy8gRnJpZW5kIG9mIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAsIHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgdm9pZAorICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mLAorCQkJCSAgICAgY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAxLAorCQkJCSAgICAgX0xwPiosIGNvbnN0IF9UcDIqKTsKKworICAvLyBGcmllbmQgb2YgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgdm9pZAorICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mLAorCQkJCSAgICAgY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwMT4qLAorCQkJCSAgICAgY29uc3QgX1RwMiopOworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiwgLi4uKQorICAgIHsgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fc2hhcmVkX3B0cgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCAgIGVsZW1lbnRfdHlwZTsKKworICAgICAgY29uc3RleHByIF9fc2hhcmVkX3B0cigpCisgICAgICA6IF9NX3B0cigwKSwgX01fcmVmY291bnQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWV4cGxpY2l0IF9fc2hhcmVkX3B0cihfVHAxKiBfX3ApCisgICAgICAgIDogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fcCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICBzdGF0aWNfYXNzZXJ0KCBzaXplb2YoX1RwMSkgPiAwLCAiaW5jb21wbGV0ZSB0eXBlIiApOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyPgorCV9fc2hhcmVkX3B0cihfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKwk6IF9NX3B0cihfX3ApLCBfTV9yZWZjb3VudChfX3AsIF9fZCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICAvLyBUT0RPIHJlcXVpcmVzIF9EZWxldGVyIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBfX2QoX19wKSB3ZWxsLWZvcm1lZAorCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyLCB0eXBlbmFtZSBfQWxsb2M+CisJX19zaGFyZWRfcHRyKF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fcCwgX19kLCBzdGQ6Om1vdmUoX19hKSkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICAvLyBUT0RPIHJlcXVpcmVzIF9EZWxldGVyIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBfX2QoX19wKSB3ZWxsLWZvcm1lZAorCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EZWxldGVyPgorCV9fc2hhcmVkX3B0cihudWxscHRyX3QgX19wLCBfRGVsZXRlciBfX2QpCisJOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KF9fcCwgX19kKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRGVsZXRlciwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBfX3NoYXJlZF9wdHIobnVsbHB0cl90IF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorCTogX01fcHRyKDApLCBfTV9yZWZjb3VudChfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpCisJeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IsIF9UcCogX19wKQorCTogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbmV2ZXIgdGhyb3dzCisJeyB9CisKKyAgICAgIF9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHImKSA9IGRlZmF1bHQ7IC8vIG5ldmVyIHRocm93cworICAgICAgX19zaGFyZWRfcHRyJiBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfcHRyJikgPSBkZWZhdWx0OyAvLyBuZXZlciB0aHJvd3MKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCV9fc2hhcmVkX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworCXsgfQorCisgICAgICBfX3NoYXJlZF9wdHIoX19zaGFyZWRfcHRyJiYgX19yKQorICAgICAgOiBfTV9wdHIoX19yLl9NX3B0ciksIF9NX3JlZmNvdW50KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJX01fcmVmY291bnQuX01fc3dhcChfX3IuX01fcmVmY291bnQpOworCV9fci5fTV9wdHIgPSAwOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1RwMSosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisJX19zaGFyZWRfcHRyKF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiYgX19yKQorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudCgpIC8vIG5ldmVyIHRocm93cworCXsKKwkgIF9NX3JlZmNvdW50Ll9NX3N3YXAoX19yLl9NX3JlZmNvdW50KTsKKwkgIF9fci5fTV9wdHIgPSAwOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlleHBsaWNpdCBfX3NoYXJlZF9wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG1heSB0aHJvdworCXsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKworCSAgLy8gSXQgaXMgbm93IHNhZmUgdG8gY29weSBfX3IuX01fcHRyLCBhcworCSAgLy8gX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSBkaWQgbm90IHRocm93LgorCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwl9CisKKyAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gdGhpcyBjb25zdHJ1Y3RvciBoYXMgbm8gZWZmZWN0LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlfX3NoYXJlZF9wdHIoc3RkOjp1bmlxdWVfcHRyPF9UcDEsIF9EZWw+JiYgX19yKQorCTogX01fcHRyKF9fci5nZXQoKSksIF9NX3JlZmNvdW50KCkKKwl7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICBfVHAxKiBfX3RtcCA9IF9fci5nZXQoKTsKKwkgIF9NX3JlZmNvdW50ID0gX19zaGFyZWRfY291bnQ8X0xwPihzdGQ6Om1vdmUoX19yKSk7CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX190bXAsIF9fdG1wKTsKKwl9CisKKyNpZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgLy8gUG9zdGNvbmRpdGlvbjogdXNlX2NvdW50KCkgPT0gMSBhbmQgX19yLmdldCgpID09IDAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX19zaGFyZWRfcHRyKHN0ZDo6YXV0b19wdHI8X1RwMT4mJiBfX3IpCisJOiBfTV9wdHIoX19yLmdldCgpKSwgX01fcmVmY291bnQoKQorCXsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIHN0YXRpY19hc3NlcnQoIHNpemVvZihfVHAxKSA+IDAsICJpbmNvbXBsZXRlIHR5cGUiICk7CisJICBfVHAxKiBfX3RtcCA9IF9fci5nZXQoKTsKKwkgIF9NX3JlZmNvdW50ID0gX19zaGFyZWRfY291bnQ8X0xwPihzdGQ6Om1vdmUoX19yKSk7CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX190bXAsIF9fdG1wKTsKKwl9CisjZW5kaWYKKworICAgICAgLyogVE9ETzogdXNlIGRlbGVnYXRpbmcgY29uc3RydWN0b3IgKi8KKyAgICAgIGNvbnN0ZXhwciBfX3NoYXJlZF9wdHIobnVsbHB0cl90KQorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlfX3NoYXJlZF9wdHImCisJb3BlcmF0b3I9KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpIC8vIG5ldmVyIHRocm93cworCXsKKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsgLy8gX19zaGFyZWRfY291bnQ6Om9wPSBkb2Vzbid0IHRocm93CisJICByZXR1cm4gKnRoaXM7CisJfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJX19zaGFyZWRfcHRyJgorCW9wZXJhdG9yPShzdGQ6OmF1dG9fcHRyPF9UcDE+JiYgX19yKQorCXsKKwkgIF9fc2hhcmVkX3B0cihzdGQ6Om1vdmUoX19yKSkuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisKKyAgICAgIF9fc2hhcmVkX3B0ciYKKyAgICAgIG9wZXJhdG9yPShfX3NoYXJlZF9wdHImJiBfX3IpCisgICAgICB7CisJX19zaGFyZWRfcHRyKHN0ZDo6bW92ZShfX3IpKS5zd2FwKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcDE+CisJX19zaGFyZWRfcHRyJgorCW9wZXJhdG9yPShfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYmIF9fcikKKwl7CisJICBfX3NoYXJlZF9wdHIoc3RkOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbD4KKwlfX3NoYXJlZF9wdHImCisJb3BlcmF0b3I9KHN0ZDo6dW5pcXVlX3B0cjxfVHAxLCBfRGVsPiYmIF9fcikKKwl7CisJICBfX3NoYXJlZF9wdHIoc3RkOjptb3ZlKF9fcikpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgX19zaGFyZWRfcHRyKCkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwl2b2lkCisJcmVzZXQoX1RwMSogX19wKSAvLyBfVHAxIG11c3QgYmUgY29tcGxldGUuCisJeworCSAgLy8gQ2F0Y2ggc2VsZi1yZXNldCBlcnJvcnMuCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wID09IDAgfHwgX19wICE9IF9NX3B0cik7CisJICBfX3NoYXJlZF9wdHIoX19wKS5zd2FwKCp0aGlzKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyPgorCXZvaWQKKwlyZXNldChfVHAxKiBfX3AsIF9EZWxldGVyIF9fZCkKKwl7IF9fc2hhcmVkX3B0cihfX3AsIF9fZCkuc3dhcCgqdGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXIsIHR5cGVuYW1lIF9BbGxvYz4KKwl2b2lkCisgICAgICAgIHJlc2V0KF9UcDEqIF9fcCwgX0RlbGV0ZXIgX19kLCBfQWxsb2MgX19hKQorICAgICAgICB7IF9fc2hhcmVkX3B0cihfX3AsIF9fZCwgc3RkOjptb3ZlKF9fYSkpLnN3YXAoKnRoaXMpOyB9CisKKyAgICAgIC8vIEFsbG93IGNsYXNzIGluc3RhbnRpYXRpb24gd2hlbiBfVHAgaXMgW2N2LXF1YWxdIHZvaWQuCisgICAgICB0eXBlbmFtZSBzdGQ6OmFkZF9sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9wdHIgIT0gMCk7CisJcmV0dXJuICpfTV9wdHI7CisgICAgICB9CisKKyAgICAgIF9UcCoKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fcHRyICE9IDApOworCXJldHVybiBfTV9wdHI7CisgICAgICB9CisKKyAgICAgIF9UcCoKKyAgICAgIGdldCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisKKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3B0ciA9PSAwID8gZmFsc2UgOiB0cnVlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIHVuaXF1ZSgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fdW5pcXVlKCk7IH0KKworICAgICAgbG9uZworICAgICAgdXNlX2NvdW50KCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV9nZXRfdXNlX2NvdW50KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX290aGVyKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fcHRyLCBfX290aGVyLl9NX3B0cik7CisJX01fcmVmY291bnQuX01fc3dhcChfX290aGVyLl9NX3JlZmNvdW50KTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlib29sCisJb3duZXJfYmVmb3JlKF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+IGNvbnN0JiBfX3JocykgY29uc3QKKwl7IHJldHVybiBfTV9yZWZjb3VudC5fTV9sZXNzKF9fcmhzLl9NX3JlZmNvdW50KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWJvb2wKKwlvd25lcl9iZWZvcmUoX193ZWFrX3B0cjxfVHAxLCBfTHA+IGNvbnN0JiBfX3JocykgY29uc3QKKwl7IHJldHVybiBfTV9yZWZjb3VudC5fTV9sZXNzKF9fcmhzLl9NX3JlZmNvdW50KTsgfQorCisjaWZkZWYgX19HWFhfUlRUSQorICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgbm9uLXN0YW5kYXJkLCBpdCBpcyB1c2VkIGJ5IGFsbG9jYXRlX3NoYXJlZC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisJX19zaGFyZWRfcHRyKF9TcF9tYWtlX3NoYXJlZF90YWcgX190YWcsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICAgIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fcHRyKCksIF9NX3JlZmNvdW50KF9fdGFnLCAoX1RwKikwLCBfX2EsCisJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsKKwkgIC8vIF9NX3B0ciBuZWVkcyB0byBwb2ludCB0byB0aGUgbmV3bHkgY29uc3RydWN0ZWQgb2JqZWN0LgorCSAgLy8gVGhpcyByZWxpZXMgb24gX1NwX2NvdW50ZWRfcHRyX2lucGxhY2U6Ol9NX2dldF9kZWxldGVyLgorCSAgdm9pZCogX19wID0gX01fcmVmY291bnQuX01fZ2V0X2RlbGV0ZXIodHlwZWlkKF9fdGFnKSk7CisJICBfTV9wdHIgPSBzdGF0aWNfY2FzdDxfVHAqPihfX3ApOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9NX3B0ciwgX01fcHRyKTsKKwl9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBzdHJ1Y3QgX0RlbGV0ZXIKKyAgICAgICAgeworICAgICAgICAgIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcHRyKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9NX2FsbG9jLmRlc3Ryb3koX19wdHIpOworICAgICAgICAgICAgX01fYWxsb2MuZGVhbGxvY2F0ZShfX3B0ciwgMSk7CisgICAgICAgICAgfQorICAgICAgICAgIF9BbGxvYyBfTV9hbGxvYzsKKyAgICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jLCB0eXBlbmFtZS4uLiBfQXJncz4KKwlfX3NoYXJlZF9wdHIoX1NwX21ha2Vfc2hhcmVkX3RhZyBfX3RhZywgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJOiBfTV9wdHIoKSwgX01fcmVmY291bnQoKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyIF9BbGxvYzI7CisgICAgICAgICAgX0RlbGV0ZXI8X0FsbG9jMj4gX19kZWwgPSB7IF9BbGxvYzIoX19hKSB9OworICAgICAgICAgIF9NX3B0ciA9IF9fZGVsLl9NX2FsbG9jLmFsbG9jYXRlKDEpOworCSAgX190cnkKKwkgICAgeworICAgICAgICAgICAgICBfX2RlbC5fTV9hbGxvYy5jb25zdHJ1Y3QoX01fcHRyLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworICAgICAgICAgICAgICBfX2RlbC5fTV9hbGxvYy5kZWFsbG9jYXRlKF9NX3B0ciwgMSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKyAgICAgICAgICBfX3NoYXJlZF9jb3VudDxfTHA+IF9fY291bnQoX01fcHRyLCBfX2RlbCwgX19kZWwuX01fYWxsb2MpOworICAgICAgICAgIF9NX3JlZmNvdW50Ll9NX3N3YXAoX19jb3VudCk7CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX01fcHRyLCBfTV9wdHIpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDEsIHR5cGVuYW1lIF9BbGxvYywKKwkgICAgICAgdHlwZW5hbWUuLi4gX0FyZ3M+CisJZnJpZW5kIF9fc2hhcmVkX3B0cjxfVHAxLCBfTHAxPgorCV9fYWxsb2NhdGVfc2hhcmVkKGNvbnN0IF9BbGxvYyYgX19hLCBfQXJncyYmLi4uIF9fYXJncyk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCoKKyAgICAgIF9NX2dldF9kZWxldGVyKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBfX3RpKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X2RlbGV0ZXIoX190aSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9wdHI7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fd2Vha19wdHI7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9EZWwsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPgorCWZyaWVuZCBfRGVsKiBnZXRfZGVsZXRlcihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwMT4mKTsKKworICAgICAgX1RwKgkgICAJICAgX01fcHRyOyAgICAgICAgIC8vIENvbnRhaW5lZCBwb2ludGVyLgorICAgICAgX19zaGFyZWRfY291bnQ8X0xwPiAgX01fcmVmY291bnQ7ICAgIC8vIFJlZmVyZW5jZSBjb3VudGVyLgorICAgIH07CisKKworICAvLyAyMC44LjEzLjIuNyBzaGFyZWRfcHRyIGNvbXBhcmlzb25zCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAyLCBfTHA+JiBfX2IpCisgICAgeyByZXR1cm4gX19hLmdldCgpID09IF9fYi5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19hLCBudWxscHRyX3QpCisgICAgeyByZXR1cm4gX19hLmdldCgpID09IG51bGxwdHI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KG51bGxwdHJfdCwgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19iKQorICAgIHsgcmV0dXJuIG51bGxwdHIgPT0gX19iLmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMiwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fYSwKKwkgICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcDIsIF9McD4mIF9fYikKKyAgICB7IHJldHVybiBfX2EuZ2V0KCkgIT0gX19iLmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiBfX2EuZ2V0KCkgIT0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0obnVsbHB0cl90LCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2IpCisgICAgeyByZXR1cm4gbnVsbHB0ciAhPSBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2EsCisJICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcDIsIF9McD4mIF9fYikKKyAgICB7IHJldHVybiBfX2EuZ2V0KCkgPCBfX2IuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3A+CisgICAgc3RydWN0IF9TcF9sZXNzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfU3AsIF9TcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9TcCYgX19saHMsIGNvbnN0IF9TcCYgX19yaHMpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfU3A6OmVsZW1lbnRfdHlwZSBlbGVtZW50X3R5cGU7CisJcmV0dXJuIHN0ZDo6bGVzczxlbGVtZW50X3R5cGUqPigpKF9fbGhzLmdldCgpLCBfX3Jocy5nZXQoKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgc3RydWN0IGxlc3M8X19zaGFyZWRfcHRyPF9UcCwgX0xwPj4KKyAgICA6IHB1YmxpYyBfU3BfbGVzczxfX3NoYXJlZF9wdHI8X1RwLCBfTHA+PgorICAgIHsgfTsKKworICAvLyAyLjIuMy44IHNoYXJlZF9wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYikKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICAvLyAyLjIuMy45IHNoYXJlZF9wdHIgY2FzdHMKKworICAvLyBUaGUgc2VlbWluZ2x5IGVxdWl2YWxlbnQgY29kZToKKyAgLy8gc2hhcmVkX3B0cjxfVHAsIF9McD4oc3RhdGljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKyAgLy8gd2lsbCBldmVudHVhbGx5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLCBhdHRlbXB0aW5nIHRvCisgIC8vIGRlbGV0ZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuCisgIC8vLyBzdGF0aWNfcG9pbnRlcl9jYXN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIHN0YXRpY19wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgc3RhdGljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSk7IH0KKworICAvLyBUaGUgc2VlbWluZ2x5IGVxdWl2YWxlbnQgY29kZToKKyAgLy8gc2hhcmVkX3B0cjxfVHAsIF9McD4oY29uc3RfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorICAvLyB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsIGF0dGVtcHRpbmcgdG8KKyAgLy8gZGVsZXRlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4KKyAgLy8vIGNvbnN0X3BvaW50ZXJfY2FzdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBjb25zdF9wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgY29uc3RfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKTsgfQorCisgIC8vIFRoZSBzZWVtaW5nbHkgZXF1aXZhbGVudCBjb2RlOgorICAvLyBzaGFyZWRfcHRyPF9UcCwgX0xwPihkeW5hbWljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKyAgLy8gd2lsbCBldmVudHVhbGx5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLCBhdHRlbXB0aW5nIHRvCisgIC8vIGRlbGV0ZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuCisgIC8vLyBkeW5hbWljX3BvaW50ZXJfY2FzdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBkeW5hbWljX3BvaW50ZXJfY2FzdChjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorICAgIHsKKyAgICAgIGlmIChfVHAqIF9fcCA9IGR5bmFtaWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorCXJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19wKTsKKyAgICAgIHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KCk7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fd2Vha19wdHIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworCisgICAgICBjb25zdGV4cHIgX193ZWFrX3B0cigpCisgICAgICA6IF9NX3B0cigwKSwgX01fcmVmY291bnQoKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgfQorCisgICAgICAvLyBHZW5lcmF0ZWQgY29weSBjb25zdHJ1Y3RvciwgYXNzaWdubWVudCwgZGVzdHJ1Y3RvciBhcmUgZmluZS4KKworICAgICAgLy8gVGhlICJvYnZpb3VzIiBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uOgorICAgICAgLy8KKyAgICAgIC8vICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgLy8gICAgX193ZWFrX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICAgIC8vICAgIDogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgLy8gICAgeyB9CisgICAgICAvLworICAgICAgLy8gaGFzIGEgc2VyaW91cyBwcm9ibGVtLgorICAgICAgLy8KKyAgICAgIC8vICBfX3IuX01fcHRyIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBpbnZhbGlkYXRlZC4gVGhlIF9NX3B0cihfX3IuX01fcHRyKQorICAgICAgLy8gIGNvbnZlcnNpb24gbWF5IHJlcXVpcmUgYWNjZXNzIHRvICpfX3IuX01fcHRyICh2aXJ0dWFsIGluaGVyaXRhbmNlKS4KKyAgICAgIC8vCisgICAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gYXZvaWQgc3B1cmlvdXMgYWNjZXNzIHZpb2xhdGlvbnMgc2luY2UKKyAgICAgIC8vIGluIG11bHRpdGhyZWFkZWQgcHJvZ3JhbXMgX19yLl9NX3B0ciBtYXkgYmUgaW52YWxpZGF0ZWQgYXQgYW55IHBvaW50LgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCV9fd2Vha19wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7IF9NX3B0ciA9IF9fci5sb2NrKCkuZ2V0KCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9UcDEqLCBfVHAqPjo6dmFsdWU+Ojp0eXBlPgorCV9fd2Vha19wdHIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKwk6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSAvLyBuZXZlciB0aHJvd3MKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlfX3dlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikgLy8gbmV2ZXIgdGhyb3dzCisJeworCSAgX01fcHRyID0gX19yLmxvY2soKS5nZXQoKTsKKwkgIF9NX3JlZmNvdW50ID0gX19yLl9NX3JlZmNvdW50OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKwlfX3dlYWtfcHRyJgorCW9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKwl7CisJICBfTV9wdHIgPSBfX3IuX01fcHRyOworCSAgX01fcmVmY291bnQgPSBfX3IuX01fcmVmY291bnQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgICBsb2NrKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisjaWZkZWYgX19HVEhSRUFEUworCS8vIE9wdGltaXphdGlvbjogYXZvaWQgdGhyb3cgb3ZlcmhlYWQuCisJaWYgKGV4cGlyZWQoKSkKKwkgIHJldHVybiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCk7CisKKwlfX3RyeQorCSAgeworCSAgICByZXR1cm4gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigqdGhpcyk7CisJICB9CisJX19jYXRjaChjb25zdCBiYWRfd2Vha19wdHImKQorCSAgeworCSAgICAvLyBROiBIb3cgY2FuIHdlIGdldCBoZXJlPworCSAgICAvLyBBOiBBbm90aGVyIHRocmVhZCBtYXkgaGF2ZSBpbnZhbGlkYXRlZCByIGFmdGVyIHRoZQorCSAgICAvLyAgICB1c2VfY291bnQgdGVzdCBhYm92ZS4KKwkgICAgcmV0dXJuIF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKTsKKwkgIH0KKworI2Vsc2UKKwkvLyBPcHRpbWl6YXRpb246IGF2b2lkIHRyeS9jYXRjaCBvdmVyaGVhZCB3aGVuIHNpbmdsZSB0aHJlYWRlZC4KKwlyZXR1cm4gZXhwaXJlZCgpID8gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpCisJCQkgOiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCp0aGlzKTsKKworI2VuZGlmCisgICAgICB9IC8vIFhYWCBNVAorCisgICAgICBsb25nCisgICAgICB1c2VfY291bnQoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKTsgfQorCisgICAgICBib29sCisgICAgICBleHBpcmVkKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV9nZXRfdXNlX2NvdW50KCkgPT0gMDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCWJvb2wKKwlvd25lcl9iZWZvcmUoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcmhzKSBjb25zdAorCXsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2xlc3MoX19yaHMuX01fcmVmY291bnQpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJYm9vbAorCW93bmVyX2JlZm9yZShjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcmhzKSBjb25zdAorCXsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2xlc3MoX19yaHMuX01fcmVmY291bnQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IF9fd2Vha19wdHIoKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fd2Vha19wdHImIF9fcykgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJc3RkOjpzd2FwKF9NX3B0ciwgX19zLl9NX3B0cik7CisJX01fcmVmY291bnQuX01fc3dhcChfX3MuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFVzZWQgYnkgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbihfVHAqIF9fcHRyLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3JlZmNvdW50KQorICAgICAgeworCV9NX3B0ciA9IF9fcHRyOworCV9NX3JlZmNvdW50ID0gX19yZWZjb3VudDsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9wdHI7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fd2Vha19wdHI7CisgICAgICBmcmllbmQgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAsIF9McD47CisgICAgICBmcmllbmQgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwPjsKKworICAgICAgX1RwKgkgCSBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiAgX01fcmVmY291bnQ7ICAgIC8vIFJlZmVyZW5jZSBjb3VudGVyLgorICAgIH07CisKKyAgLy8gMjAuOC4xMy4zLjcgd2Vha19wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3dlYWtfcHRyPF9UcCwgX0xwPiYgX19hLCBfX3dlYWtfcHRyPF9UcCwgX0xwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBzdHJ1Y3QgX1NwX293bmVyX2xlc3MgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX2xocywgY29uc3QgX1RwJiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fbGhzLm93bmVyX2JlZm9yZShfX3Jocyk7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fbGhzLCBjb25zdCBfVHAxJiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fbGhzLm93bmVyX2JlZm9yZShfX3Jocyk7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAxJiBfX2xocywgY29uc3QgX1RwJiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fbGhzLm93bmVyX2JlZm9yZShfX3Jocyk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBzdHJ1Y3Qgb3duZXJfbGVzczxfX3NoYXJlZF9wdHI8X1RwLCBfTHA+PgorICAgIDogcHVibGljIF9TcF9vd25lcl9sZXNzPF9fc2hhcmVkX3B0cjxfVHAsIF9McD4sIF9fd2Vha19wdHI8X1RwLCBfTHA+PgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgc3RydWN0IG93bmVyX2xlc3M8X193ZWFrX3B0cjxfVHAsIF9McD4+CisgICAgOiBwdWJsaWMgX1NwX293bmVyX2xlc3M8X193ZWFrX3B0cjxfVHAsIF9McD4sIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4+CisgICAgeyB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgY29uc3RleHByIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyhjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzJikgeyB9CisKKyAgICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICB+X19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorCisgICAgcHVibGljOgorICAgICAgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpCisgICAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgICAgX19zaGFyZWRfcHRyPGNvbnN0IF9UcCwgX0xwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8Y29uc3QgX1RwLCBfTHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXZvaWQKKwlfTV93ZWFrX2Fzc2lnbihfVHAxKiBfX3AsIGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mIF9fbikgY29uc3QKKwl7IF9NX3dlYWtfdGhpcy5fTV9hc3NpZ24oX19wLCBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJZnJpZW5kIHZvaWQKKwlfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3BuLAorCQkJCQkgY29uc3QgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyogX19wZSwKKwkJCQkJIGNvbnN0IF9UcDEqIF9fcHgpCisJeworCSAgaWYgKF9fcGUgIT0gMCkKKwkgICAgX19wZS0+X01fd2Vha19hc3NpZ24oY29uc3RfY2FzdDxfVHAxKj4oX19weCksIF9fcG4pOworCX0KKworICAgICAgbXV0YWJsZSBfX3dlYWtfcHRyPF9UcCwgX0xwPiAgX01fd2Vha190aGlzOworICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHAsIHR5cGVuYW1lIF9BbGxvYywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBfX2FsbG9jYXRlX3NoYXJlZChjb25zdCBfQWxsb2MmIF9fYSwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4oX1NwX21ha2Vfc2hhcmVkX3RhZygpLCBfX2EsCisJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBfX21ha2Vfc2hhcmVkKF9BcmdzJiYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8X1RwPjo6dHlwZSBfVHBfbmM7CisgICAgICByZXR1cm4gc3RkOjpfX2FsbG9jYXRlX3NoYXJlZDxfVHAsIF9McD4oc3RkOjphbGxvY2F0b3I8X1RwX25jPigpLAorCQkJCQkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBfX3NoYXJlZF9wdHIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBzdHJ1Y3QgaGFzaDxfX3NoYXJlZF9wdHI8X1RwLCBfTHA+PgorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X19zaGFyZWRfcHRyPF9UcCwgX0xwPiwgc2l6ZV90PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omhhc2g8X1RwKj4oKShfX3MuZ2V0KCkpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX1NIQVJFRF9QVFJfQkFTRV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc2xpY2VfYXJyYXkuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zbGljZV9hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZmFlMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc2xpY2VfYXJyYXkuaApAQCAtMCwwICsxLDI3NSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gc2xpY2VfYXJyYXkgY2xhc3MuCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOSwKKy8vIDIwMTAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3NsaWNlX2FycmF5LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfU0xJQ0VfQVJSQVlfSAorI2RlZmluZSBfU0xJQ0VfQVJSQVlfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBudW1lcmljX2FycmF5cworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgQ2xhc3MgZGVmaW5pbmcgb25lLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIFRoZSBzbGljZSBjbGFzcyByZXByZXNlbnRzIGEgb25lLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheSwKKyAgICogIHNwZWNpZmllZCBieSB0aHJlZSBwYXJhbWV0ZXJzOiBzdGFydCBvZmZzZXQsIHNpemUsIGFuZCBzdHJpZGUuICBUaGUKKyAgICogIHN0YXJ0IG9mZnNldCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IHRoYXQgaXMgcGFydAorICAgKiAgb2YgdGhlIHN1YnNldC4gIFRoZSBzaXplIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN1YnNldC4KKyAgICogIFN0cmlkZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHN1Y2Nlc3NpdmUgYXJyYXkgZWxlbWVudCB0byBpbmNsdWRlCisgICAqICBpbiB0aGUgc3Vic2V0LgorICAgKgorICAgKiAgRm9yIGV4YW1wbGUsIHdpdGggYW4gYXJyYXkgb2Ygc2l6ZSAxMCwgYW5kIGEgc2xpY2Ugd2l0aCBvZmZzZXQgMSwgc2l6ZSAzCisgICAqICBhbmQgc3RyaWRlIDIsIHRoZSBzdWJzZXQgY29uc2lzdHMgb2YgYXJyYXkgZWxlbWVudHMgMSwgMywgYW5kIDUuCisgICAqLworICBjbGFzcyBzbGljZQorICB7CisgIHB1YmxpYzoKKyAgICAvLy8gIENvbnN0cnVjdCBhbiBlbXB0eSBzbGljZS4KKyAgICBzbGljZSgpOworCisgICAgLyoqCisgICAgICogIEBicmllZiAgQ29uc3RydWN0IGEgc2xpY2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBvICBPZmZzZXQgaW4gYXJyYXkgb2YgZmlyc3QgZWxlbWVudC4KKyAgICAgKiAgQHBhcmFtICBkICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc2xpY2UuCisgICAgICogIEBwYXJhbSAgcyAgU3RyaWRlIGJldHdlZW4gYXJyYXkgZWxlbWVudHMuCisgICAgICovCisgICAgc2xpY2Uoc2l6ZV90LCBzaXplX3QsIHNpemVfdCk7CisKKyAgICAvLy8gIFJldHVybiBhcnJheSBvZmZzZXQgb2YgZmlyc3Qgc2xpY2UgZWxlbWVudC4KKyAgICBzaXplX3Qgc3RhcnQoKSBjb25zdDsKKyAgICAvLy8gIFJldHVybiBzaXplIG9mIHNsaWNlLgorICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgLy8vICBSZXR1cm4gYXJyYXkgc3RyaWRlIG9mIHNsaWNlLgorICAgIHNpemVfdCBzdHJpZGUoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHNpemVfdCBfTV9vZmY7ICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgIHNpemVfdCBfTV9zejsJCQkvLyBzaXplCisgICAgc2l6ZV90IF9NX3N0OwkJCS8vIHN0cmlkZSB1bml0CisgIH07CisKKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyA1NDMuIHZhbGFycmF5IHNsaWNlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5saW5lCisgIHNsaWNlOjpzbGljZSgpIAorICA6IF9NX29mZigwKSwgX01fc3ooMCksIF9NX3N0KDApIHt9CisKKyAgaW5saW5lCisgIHNsaWNlOjpzbGljZShzaXplX3QgX19vLCBzaXplX3QgX19kLCBzaXplX3QgX19zKQorICA6IF9NX29mZihfX28pLCBfTV9zeihfX2QpLCBfTV9zdChfX3MpIHt9CisKKyAgaW5saW5lIHNpemVfdAorICBzbGljZTo6c3RhcnQoKSBjb25zdAorICB7IHJldHVybiBfTV9vZmY7IH0KKworICBpbmxpbmUgc2l6ZV90CisgIHNsaWNlOjpzaXplKCkgY29uc3QKKyAgeyByZXR1cm4gX01fc3o7IH0KKworICBpbmxpbmUgc2l6ZV90CisgIHNsaWNlOjpzdHJpZGUoKSBjb25zdAorICB7IHJldHVybiBfTV9zdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWZlcmVuY2UgdG8gb25lLWRpbWVuc2lvbmFsIHN1YnNldCBvZiBhbiBhcnJheS4KKyAgICoKKyAgICogIEEgc2xpY2VfYXJyYXkgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheQorICAgKiAgc3BlY2lmaWVkIGJ5IGEgc2xpY2UuICBUaGUgd2F5IHRvIGdldCBhIHNsaWNlX2FycmF5IGlzIHRvIGNhbGwKKyAgICogIG9wZXJhdG9yW10oc2xpY2UpIG9uIGEgdmFsYXJyYXkuICBUaGUgcmV0dXJuZWQgc2xpY2VfYXJyYXkgdGhlbiBwZXJtaXRzCisgICAqICBjYXJyeWluZyBvcGVyYXRpb25zIG91dCBvbiB0aGUgcmVmZXJlbmNlZCBzdWJzZXQgb2YgZWxlbWVudHMgaW4gdGhlCisgICAqICBvcmlnaW5hbCB2YWxhcnJheS4gIEZvciBleGFtcGxlLCBvcGVyYXRvcis9KHZhbGFycmF5KSB3aWxsIGFkZCB2YWx1ZXMKKyAgICogIHRvIHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgaW4gdGhlIHVuZGVybHlpbmcgdmFsYXJyYXkgdGhpcyBzbGljZV9hcnJheQorICAgKiAgcmVmZXJzIHRvLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgRWxlbWVudCB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHNsaWNlX2FycmF5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDI1My4gdmFsYXJyYXkgaGVscGVyIGZ1bmN0aW9ucyBhcmUgYWxtb3N0IGVudGlyZWx5IHVzZWxlc3MKKworICAgICAgLy8vICBDb3B5IGNvbnN0cnVjdG9yLiAgQm90aCBzbGljZXMgcmVmZXIgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBhcnJheS4KKyAgICAgIHNsaWNlX2FycmF5KGNvbnN0IHNsaWNlX2FycmF5Jik7CisKKyAgICAgIC8vLyAgQXNzaWdubWVudCBvcGVyYXRvci4gIEFzc2lnbnMgc2xpY2UgZWxlbWVudHMgdG8gY29ycmVzcG9uZGluZworICAgICAgLy8vICBlbGVtZW50cyBvZiBAYSBhLgorICAgICAgc2xpY2VfYXJyYXkmIG9wZXJhdG9yPShjb25zdCBzbGljZV9hcnJheSYpOworCisgICAgICAvLy8gIEFzc2lnbiBzbGljZSBlbGVtZW50cyB0byBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIE11bHRpcGx5IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIERpdmlkZSBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBNb2R1bG8gc2xpY2UgZWxlbWVudHMgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdm9pZCBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgQWRkIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiB0byBzbGljZSBlbGVtZW50cy4KKyAgICAgIHZvaWQgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIFN1YnRyYWN0IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdiBmcm9tIHNsaWNlIGVsZW1lbnRzLgorICAgICAgdm9pZCBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgTG9naWNhbCB4b3Igc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMb2dpY2FsIGFuZCBzbGljZSBlbGVtZW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3ImPShjb25zdCB2YWxhcnJheTxfVHA+JikgY29uc3Q7CisgICAgICAvLy8gIExvZ2ljYWwgb3Igc2xpY2UgZWxlbWVudHMgd2l0aCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yfD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBMZWZ0IHNoaWZ0IHNsaWNlIGVsZW1lbnRzIGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZvaWQgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpIGNvbnN0OworICAgICAgLy8vICBSaWdodCBzaGlmdCBzbGljZSBlbGVtZW50cyBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2b2lkIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PF9UcD4mKSBjb25zdDsKKyAgICAgIC8vLyAgQXNzaWduIGFsbCBzbGljZSBlbGVtZW50cyB0byBAYSB0LgorICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX1RwICYpIGNvbnN0OworICAgICAgLy8gICAgICAgIH5zbGljZV9hcnJheSAoKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yKj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yLz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yKz0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yLT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yJj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yfD0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2b2lkIG9wZXJhdG9yPDw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKSBjb25zdDsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdm9pZCBvcGVyYXRvcj4+PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JikgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgZnJpZW5kIGNsYXNzIHZhbGFycmF5PF9UcD47CisgICAgICBzbGljZV9hcnJheShfQXJyYXk8X1RwPiwgY29uc3Qgc2xpY2UmKTsKKworICAgICAgY29uc3Qgc2l6ZV90ICAgICAgX01fc3o7CisgICAgICBjb25zdCBzaXplX3QgICAgICBfTV9zdHJpZGU7CisgICAgICBjb25zdCBfQXJyYXk8X1RwPiBfTV9hcnJheTsKKworICAgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgICBzbGljZV9hcnJheSgpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHNsaWNlX2FycmF5PF9UcD46OnNsaWNlX2FycmF5KF9BcnJheTxfVHA+IF9fYSwgY29uc3Qgc2xpY2UmIF9fcykKKyAgICA6IF9NX3N6KF9fcy5zaXplKCkpLCBfTV9zdHJpZGUoX19zLnN0cmlkZSgpKSwKKyAgICAgIF9NX2FycmF5KF9fYS5iZWdpbigpICsgX19zLnN0YXJ0KCkpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHNsaWNlX2FycmF5PF9UcD46OnNsaWNlX2FycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIGEpCisgICAgOiBfTV9zeihhLl9NX3N6KSwgX01fc3RyaWRlKGEuX01fc3RyaWRlKSwgX01fYXJyYXkoYS5fTV9hcnJheSkge30KKworICAvLyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIC8vICAgIGlubGluZSBzbGljZV9hcnJheTxfVHA+Ojp+c2xpY2VfYXJyYXkgKCkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHNsaWNlX2FycmF5PF9UcD4mCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9fYSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fYXJyYXksIF9fYS5fTV9zeiwgX19hLl9NX3N0cmlkZSwKKwkJCSAgIF9NX2FycmF5LCBfTV9zdHJpZGUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfTV9hcnJheSwgX01fc3osIF9NX3N0cmlkZSwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNsaWNlX2FycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPihfX3YpLCBfTV9hcnJheSwgX01fc3osIF9NX3N0cmlkZSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgaW5saW5lIHZvaWQKKyAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JiBfX2UpIGNvbnN0CisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2UsIF9NX3N6LCBfTV9hcnJheSwgX01fc3RyaWRlKTsgfQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorI2RlZmluZSBfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKF9PcCxfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSB2b2lkCQkJCQkJCQlcCisgICAgc2xpY2VfYXJyYXk8X1RwPjo6b3BlcmF0b3IgX09wIyM9KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgY29uc3QJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX01fYXJyYXksIF9NX3N6LCBfTV9zdHJpZGUsIF9BcnJheTxfVHA+KF9fdikpO1wKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CQkJCSAgICAgICAgICAgICAgICBcCisgICAgICBpbmxpbmUgdm9pZAkJCQkJCQlcCisgICAgICBzbGljZV9hcnJheTxfVHA+OjpvcGVyYXRvciBfT3AjIz0oY29uc3QgX0V4cHI8X0RvbSxfVHA+JiBfX2UpIGNvbnN0XAorICAgICAgewkJCQkJCQkJCVwKKwkgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfTV9hcnJheSwgX01fc3RyaWRlLCBfX2UsIF9NX3N6KTsJXAorICAgICAgfQorCisKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigvLCBfX2RpdmlkZXMpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKK19ERUZJTkVfVkFMQVJSQVlfT1BFUkFUT1IoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUiheLCBfX2JpdHdpc2VfeG9yKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKDw8LCBfX3NoaWZ0X2xlZnQpCitfREVGSU5FX1ZBTEFSUkFZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9PUEVSQVRPUgorCisgIC8vIEB9IGdyb3VwIG51bWVyaWNfYXJyYXlzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TTElDRV9BUlJBWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3N0cmVhbS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3N0cmVhbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliOWE1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zc3RyZWFtLnRjYwpAQCAtMCwwICsxLDI5MCBAQAorLy8gU3RyaW5nIGJhc2VkIHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvc3N0cmVhbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzc3RyZWFtfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy43ICBTdHJpbmctYmFzZWQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfU1NUUkVBTV9UQ0MKKyNkZWZpbmUgX1NTVFJFQU1fVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OmludF90eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYykKKyAgICB7CisgICAgICBpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIGlmICh0aGlzLT5lYmFjaygpIDwgdGhpcy0+Z3B0cigpKQorCXsKKwkgIC8vIFRyeSB0byBwdXQgYmFjayBfX2MgaW50byBpbnB1dCBzZXF1ZW5jZSBpbiBvbmUgb2YgdGhyZWUgd2F5cy4KKwkgIC8vIE9yZGVyIHRoZXNlIHRlc3RzIGRvbmUgaW4gaXMgdW5zcGVjaWZpZWQgYnkgdGhlIHN0YW5kYXJkLgorCSAgY29uc3QgYm9vbCBfX3Rlc3Rlb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCBfX3JldCk7CisJICBpZiAoIV9fdGVzdGVvZikKKwkgICAgeworCSAgICAgIGNvbnN0IGJvb2wgX190ZXN0ZXEgPSB0cmFpdHNfdHlwZTo6ZXEodHJhaXRzX3R5cGU6OgorCQkJCQkJICAgIHRvX2NoYXJfdHlwZShfX2MpLAorCQkJCQkJICAgIHRoaXMtPmdwdHIoKVstMV0pOwkgIAorCSAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gdGhpcy0+X01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisJICAgICAgaWYgKF9fdGVzdGVxIHx8IF9fdGVzdG91dCkKKwkJeworCQkgIHRoaXMtPmdidW1wKC0xKTsKKwkJICBpZiAoIV9fdGVzdGVxKQorCQkgICAgKnRoaXMtPmdwdHIoKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICBfX3JldCA9IF9fYzsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0aGlzLT5nYnVtcCgtMSk7CisJICAgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6bm90X2VvZihfX2MpOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdHlwZW5hbWUgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6aW50X3R5cGUKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBvdmVyZmxvdyhpbnRfdHlwZSBfX2MpCisgICAgeworICAgICAgY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSB0aGlzLT5fTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KCFfX3Rlc3RvdXQsIGZhbHNlKSkKKwlyZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworCisgICAgICBjb25zdCBib29sIF9fdGVzdGVvZiA9IHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSk7CisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3Rlc3Rlb2YsIGZhbHNlKSkKKwlyZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19jYXBhY2l0eSA9IF9NX3N0cmluZy5jYXBhY2l0eSgpOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19tYXhfc2l6ZSA9IF9NX3N0cmluZy5tYXhfc2l6ZSgpOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3RwdXQgPSB0aGlzLT5wcHRyKCkgPCB0aGlzLT5lcHB0cigpOworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoIV9fdGVzdHB1dCAmJiBfX2NhcGFjaXR5ID09IF9fbWF4X3NpemUsIGZhbHNlKSkKKwlyZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworCisgICAgICAvLyBUcnkgdG8gYXBwZW5kIF9fYyBpbnRvIG91dHB1dCBzZXF1ZW5jZSBpbiBvbmUgb2YgdHdvIHdheXMuCisgICAgICAvLyBPcmRlciB0aGVzZSB0ZXN0cyBkb25lIGluIGlzIHVuc3BlY2lmaWVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2NvbnYgPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisgICAgICBpZiAoIV9fdGVzdHB1dCkKKwl7CisJICAvLyBOQjogU3RhcnQgb3N0cmluZ3N0cmVhbSBidWZmZXJzIGF0IDUxMiBjaGFycy4gIFRoaXMgaXMgYW4KKwkgIC8vIGV4cGVyaW1lbnRhbCB2YWx1ZSAocHJvbm91bmNlZCAiYXJiaXRyYXJ5IiBpbiBzb21lIG9mIHRoZQorCSAgLy8gaGlwcGVyIEVuZ2xpc2gtc3BlYWtpbmcgY291bnRyaWVzKSwgYW5kIGNhbiBiZSBjaGFuZ2VkIHRvCisJICAvLyBzdWl0IHBhcnRpY3VsYXIgbmVlZHMuCisJICAvLworCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gMTY5LiBCYWQgZWZmaWNpZW5jeSBvZiBvdmVyZmxvdygpIG1hbmRhdGVkCisJICAvLyA0MzIuIHN0cmluZ2J1Zjo6b3ZlcmZsb3coKSBtYWtlcyBvbmx5IG9uZSB3cml0ZSBwb3NpdGlvbgorCSAgLy8gICAgICBhdmFpbGFibGUKKwkgIGNvbnN0IF9fc2l6ZV90eXBlIF9fb3B0X2xlbiA9IHN0ZDo6bWF4KF9fc2l6ZV90eXBlKDIgKiBfX2NhcGFjaXR5KSwKKwkJCQkJCSBfX3NpemVfdHlwZSg1MTIpKTsKKwkgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19vcHRfbGVuLCBfX21heF9zaXplKTsKKwkgIF9fc3RyaW5nX3R5cGUgX190bXA7CisJICBfX3RtcC5yZXNlcnZlKF9fbGVuKTsKKwkgIGlmICh0aGlzLT5wYmFzZSgpKQorCSAgICBfX3RtcC5hc3NpZ24odGhpcy0+cGJhc2UoKSwgdGhpcy0+ZXBwdHIoKSAtIHRoaXMtPnBiYXNlKCkpOworCSAgX190bXAucHVzaF9iYWNrKF9fY29udik7CisJICBfTV9zdHJpbmcuc3dhcChfX3RtcCk7CisJICBfTV9zeW5jKGNvbnN0X2Nhc3Q8Y2hhcl90eXBlKj4oX01fc3RyaW5nLmRhdGEoKSksCisJCSAgdGhpcy0+Z3B0cigpIC0gdGhpcy0+ZWJhY2soKSwgdGhpcy0+cHB0cigpIC0gdGhpcy0+cGJhc2UoKSk7CisJfQorICAgICAgZWxzZQorCSp0aGlzLT5wcHRyKCkgPSBfX2NvbnY7CisgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICAgIHJldHVybiBfX2M7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjppbnRfdHlwZQorICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIHVuZGVyZmxvdygpCisgICAgeworICAgICAgaW50X3R5cGUgX19yZXQgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gdGhpcy0+X01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGlmIChfX3Rlc3RpbikKKwl7CisJICAvLyBVcGRhdGUgZWdwdHIoKSB0byBtYXRjaCB0aGUgYWN0dWFsIHN0cmluZyBlbmQuCisJICBfTV91cGRhdGVfZWdwdHIoKTsKKworCSAgaWYgKHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCkpCisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnBvc190eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgeworICAgICAgcG9zX3R5cGUgX19yZXQgPSAgcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsKKyAgICAgIGJvb2wgX190ZXN0aW4gPSAoaW9zX2Jhc2U6OmluICYgdGhpcy0+X01fbW9kZSAmIF9fbW9kZSkgIT0gMDsKKyAgICAgIGJvb2wgX190ZXN0b3V0ID0gKGlvc19iYXNlOjpvdXQgJiB0aGlzLT5fTV9tb2RlICYgX19tb2RlKSAhPSAwOworICAgICAgY29uc3QgYm9vbCBfX3Rlc3Rib3RoID0gX190ZXN0aW4gJiYgX190ZXN0b3V0ICYmIF9fd2F5ICE9IGlvc19iYXNlOjpjdXI7CisgICAgICBfX3Rlc3RpbiAmPSAhKF9fbW9kZSAmIGlvc19iYXNlOjpvdXQpOworICAgICAgX190ZXN0b3V0ICY9ICEoX19tb2RlICYgaW9zX2Jhc2U6OmluKTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDUzLiBiYXNpY19zdHJpbmdidWY6OnNlZWtvZmYgbmVlZCBub3QgYWx3YXlzIGZhaWwgZm9yIGFuIGVtcHR5IHN0cmVhbS4KKyAgICAgIGNvbnN0IGNoYXJfdHlwZSogX19iZWcgPSBfX3Rlc3RpbiA/IHRoaXMtPmViYWNrKCkgOiB0aGlzLT5wYmFzZSgpOworICAgICAgaWYgKChfX2JlZyB8fCAhX19vZmYpICYmIChfX3Rlc3RpbiB8fCBfX3Rlc3RvdXQgfHwgX190ZXN0Ym90aCkpCisJeworCSAgX01fdXBkYXRlX2VncHRyKCk7CisKKwkgIG9mZl90eXBlIF9fbmV3b2ZmaSA9IF9fb2ZmOworCSAgb2ZmX3R5cGUgX19uZXdvZmZvID0gX19uZXdvZmZpOworCSAgaWYgKF9fd2F5ID09IGlvc19iYXNlOjpjdXIpCisJICAgIHsKKwkgICAgICBfX25ld29mZmkgKz0gdGhpcy0+Z3B0cigpIC0gX19iZWc7CisJICAgICAgX19uZXdvZmZvICs9IHRoaXMtPnBwdHIoKSAtIF9fYmVnOworCSAgICB9CisJICBlbHNlIGlmIChfX3dheSA9PSBpb3NfYmFzZTo6ZW5kKQorCSAgICBfX25ld29mZm8gPSBfX25ld29mZmkgKz0gdGhpcy0+ZWdwdHIoKSAtIF9fYmVnOworCisJICBpZiAoKF9fdGVzdGluIHx8IF9fdGVzdGJvdGgpCisJICAgICAgJiYgX19uZXdvZmZpID49IDAKKwkgICAgICAmJiB0aGlzLT5lZ3B0cigpIC0gX19iZWcgPj0gX19uZXdvZmZpKQorCSAgICB7CisJICAgICAgdGhpcy0+c2V0Zyh0aGlzLT5lYmFjaygpLCB0aGlzLT5lYmFjaygpICsgX19uZXdvZmZpLAorCQkJIHRoaXMtPmVncHRyKCkpOworCSAgICAgIF9fcmV0ID0gcG9zX3R5cGUoX19uZXdvZmZpKTsKKwkgICAgfQorCSAgaWYgKChfX3Rlc3RvdXQgfHwgX190ZXN0Ym90aCkKKwkgICAgICAmJiBfX25ld29mZm8gPj0gMAorCSAgICAgICYmIHRoaXMtPmVncHRyKCkgLSBfX2JlZyA+PSBfX25ld29mZm8pCisJICAgIHsKKwkgICAgICBfTV9wYnVtcCh0aGlzLT5wYmFzZSgpLCB0aGlzLT5lcHB0cigpLCBfX25ld29mZm8pOworCSAgICAgIF9fcmV0ID0gcG9zX3R5cGUoX19uZXdvZmZvKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnBvc190eXBlCisgICAgYmFzaWNfc3RyaW5nYnVmPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgc2Vla3Bvcyhwb3NfdHlwZSBfX3NwLCBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlKQorICAgIHsKKyAgICAgIHBvc190eXBlIF9fcmV0ID0gIHBvc190eXBlKG9mZl90eXBlKC0xKSk7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gKGlvc19iYXNlOjppbiAmIHRoaXMtPl9NX21vZGUgJiBfX21vZGUpICE9IDA7CisgICAgICBjb25zdCBib29sIF9fdGVzdG91dCA9IChpb3NfYmFzZTo6b3V0ICYgdGhpcy0+X01fbW9kZSAmIF9fbW9kZSkgIT0gMDsKKworICAgICAgY29uc3QgY2hhcl90eXBlKiBfX2JlZyA9IF9fdGVzdGluID8gdGhpcy0+ZWJhY2soKSA6IHRoaXMtPnBiYXNlKCk7CisgICAgICBpZiAoKF9fYmVnIHx8ICFvZmZfdHlwZShfX3NwKSkgJiYgKF9fdGVzdGluIHx8IF9fdGVzdG91dCkpCisJeworCSAgX01fdXBkYXRlX2VncHRyKCk7CisKKwkgIGNvbnN0IG9mZl90eXBlIF9fcG9zKF9fc3ApOworCSAgY29uc3QgYm9vbCBfX3Rlc3Rwb3MgPSAoMCA8PSBfX3BvcworCQkJCSAgJiYgX19wb3MgPD0gdGhpcy0+ZWdwdHIoKSAtIF9fYmVnKTsKKwkgIGlmIChfX3Rlc3Rwb3MpCisJICAgIHsKKwkgICAgICBpZiAoX190ZXN0aW4pCisJCXRoaXMtPnNldGcodGhpcy0+ZWJhY2soKSwgdGhpcy0+ZWJhY2soKSArIF9fcG9zLAorCQkJICAgdGhpcy0+ZWdwdHIoKSk7CisJICAgICAgaWYgKF9fdGVzdG91dCkKKwkJX01fcGJ1bXAodGhpcy0+cGJhc2UoKSwgdGhpcy0+ZXBwdHIoKSwgX19wb3MpOworCSAgICAgIF9fcmV0ID0gX19zcDsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9zeW5jKGNoYXJfdHlwZSogX19iYXNlLCBfX3NpemVfdHlwZSBfX2ksIF9fc2l6ZV90eXBlIF9fbykKKyAgICB7CisgICAgICBjb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAgICAgIGNvbnN0IGJvb2wgX190ZXN0b3V0ID0gX01fbW9kZSAmIGlvc19iYXNlOjpvdXQ7CisgICAgICBjaGFyX3R5cGUqIF9fZW5kZyA9IF9fYmFzZSArIF9NX3N0cmluZy5zaXplKCk7CisgICAgICBjaGFyX3R5cGUqIF9fZW5kcCA9IF9fYmFzZSArIF9NX3N0cmluZy5jYXBhY2l0eSgpOworCisgICAgICBpZiAoX19iYXNlICE9IF9NX3N0cmluZy5kYXRhKCkpCisJeworCSAgLy8gc2V0YnVmOiBfX2kgPT0gc2l6ZSBvZiBidWZmZXIgYXJlYSAoX01fc3RyaW5nLnNpemUoKSA9PSAwKS4KKwkgIF9fZW5kZyArPSBfX2k7CisJICBfX2kgPSAwOworCSAgX19lbmRwID0gX19lbmRnOworCX0KKworICAgICAgaWYgKF9fdGVzdGluKQorCXRoaXMtPnNldGcoX19iYXNlLCBfX2Jhc2UgKyBfX2ksIF9fZW5kZyk7CisgICAgICBpZiAoX190ZXN0b3V0KQorCXsKKwkgIF9NX3BidW1wKF9fYmFzZSwgX19lbmRwLCBfX28pOworCSAgLy8gZWdwdHIoKSBhbHdheXMgdHJhY2tzIHRoZSBzdHJpbmcgZW5kLiAgV2hlbiAhX190ZXN0aW4sCisJICAvLyBmb3IgdGhlIGNvcnJlY3QgZnVuY3Rpb25pbmcgb2YgdGhlIHN0cmVhbWJ1ZiBpbmxpbmVzCisJICAvLyB0aGUgb3RoZXIgZ2V0IGFyZWEgcG9pbnRlcnMgYXJlIGlkZW50aWNhbC4KKwkgIGlmICghX190ZXN0aW4pCisJICAgIHRoaXMtPnNldGcoX19lbmRnLCBfX2VuZGcsIF9fZW5kZyk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3BidW1wKGNoYXJfdHlwZSogX19wYmVnLCBjaGFyX3R5cGUqIF9fcGVuZCwgb2ZmX3R5cGUgX19vZmYpCisgICAgeworICAgICAgdGhpcy0+c2V0cChfX3BiZWcsIF9fcGVuZCk7CisgICAgICB3aGlsZSAoX19vZmYgPiBfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8aW50Pjo6X19tYXgpCisJeworCSAgdGhpcy0+cGJ1bXAoX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4KTsKKwkgIF9fb2ZmIC09IF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21heDsKKwl9CisgICAgICB0aGlzLT5wYnVtcChfX29mZik7CisgICAgfQorCisgIC8vIEluaGliaXQgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgZm9yIHJlcXVpcmVkIGluc3RhbnRpYXRpb25zLAorICAvLyB3aGljaCBhcmUgZGVmaW5lZCB2aWEgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgZWxzZXdoZXJlLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nYnVmPGNoYXI+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbTxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW08Y2hhcj47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW08Y2hhcj47CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfc3RyaW5nYnVmPHdjaGFyX3Q+OworICBleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbTx3Y2hhcl90PjsKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJpbmdzdHJlYW08d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW08d2NoYXJfdD47CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfYWxnby5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9hbGdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2MDI2YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfYWxnby5oCkBAIC0wLDAgKzEsNjMyMCBAQAorLy8gQWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwKKy8vIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfYWxnby5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7YWxnb3JpdGhtfQorICovCisKKyNpZm5kZWYgX1NUTF9BTEdPX0gKKyNkZWZpbmUgX1NUTF9BTEdPX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGxpYj4gICAgICAgICAgICAgLy8gZm9yIHJhbmQKKyNpbmNsdWRlIDxiaXRzL2FsZ29yaXRobWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2hlYXAuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF90ZW1wYnVmLmg+ICAvLyBmb3IgX1RlbXBvcmFyeV9idWZmZXIKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjaW5jbHVkZSA8cmFuZG9tPiAgICAgLy8gZm9yIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gZm9yIHN0ZDo6YmluZAorI2VuZGlmCisKKy8vIFNlZSBjb25jZXB0X2NoZWNrLmggZm9yIHRoZSBfX2dsaWJjeHhfKl9yZXF1aXJlcyBtYWNyb3MuCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gU3dhcHMgdGhlIG1lZGlhbiB2YWx1ZSBvZiAqX19hLCAqX19iIGFuZCAqX19jIHRvICpfX2EKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVkaWFuX2ZpcnN0KF9JdGVyYXRvciBfX2EsIF9JdGVyYXRvciBfX2IsIF9JdGVyYXRvciBfX2MpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICBpZiAoKl9fYSA8ICpfX2IpCisJeworCSAgaWYgKCpfX2IgPCAqX19jKQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2EsIF9fYik7CisJICBlbHNlIGlmICgqX19hIDwgKl9fYykKKwkgICAgc3RkOjppdGVyX3N3YXAoX19hLCBfX2MpOworCX0KKyAgICAgIGVsc2UgaWYgKCpfX2EgPCAqX19jKQorCXJldHVybjsKKyAgICAgIGVsc2UgaWYgKCpfX2IgPCAqX19jKQorCXN0ZDo6aXRlcl9zd2FwKF9fYSwgX19jKTsKKyAgICAgIGVsc2UKKwlzdGQ6Oml0ZXJfc3dhcChfX2EsIF9fYik7CisgICAgfQorCisgIC8vLyBTd2FwcyB0aGUgbWVkaWFuIHZhbHVlIG9mICpfX2EsICpfX2IgYW5kICpfX2MgdW5kZXIgX19jb21wIHRvICpfX2EKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19tb3ZlX21lZGlhbl9maXJzdChfSXRlcmF0b3IgX19hLCBfSXRlcmF0b3IgX19iLCBfSXRlcmF0b3IgX19jLAorCQkJX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeUZ1bmN0aW9uQ29uY2VwdDxfQ29tcGFyZSwgYm9vbCwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgaWYgKF9fY29tcCgqX19hLCAqX19iKSkKKwl7CisJICBpZiAoX19jb21wKCpfX2IsICpfX2MpKQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2EsIF9fYik7CisJICBlbHNlIGlmIChfX2NvbXAoKl9fYSwgKl9fYykpCisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fYSwgX19jKTsKKwl9CisgICAgICBlbHNlIGlmIChfX2NvbXAoKl9fYSwgKl9fYykpCisJcmV0dXJuOworICAgICAgZWxzZSBpZiAoX19jb21wKCpfX2IsICpfX2MpKQorCXN0ZDo6aXRlcl9zd2FwKF9fYSwgX19jKTsKKyAgICAgIGVsc2UKKwlzdGQ6Oml0ZXJfc3dhcChfX2EsIF9fYik7CisgICAgfQorCisgIC8vIGZvcl9lYWNoCisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kKCkgZm9yIHRoZSBJbnB1dCBJdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfSW5wdXRJdGVyYXRvcgorICAgIF9fZmluZChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX1RwJiBfX3ZhbCwgaW5wdXRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhKCpfX2ZpcnN0ID09IF9fdmFsKSkKKwkrK19fZmlyc3Q7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kX2lmKCkgZm9yIHRoZSBJbnB1dCBJdGVyYXRvciBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBfX2ZpbmRfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSsrX19maXJzdDsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhbiBvdmVybG9hZCB1c2VkIGJ5IGZpbmQoKSBmb3IgdGhlIFJBSSBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX2ZpbmQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX1RwJiBfX3ZhbCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOworCisgICAgICBmb3IgKDsgX190cmlwX2NvdW50ID4gMDsgLS1fX3RyaXBfY291bnQpCisJeworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwl9CisKKyAgICAgIHN3aXRjaCAoX19sYXN0IC0gX19maXJzdCkKKwl7CisJY2FzZSAzOgorCSAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDI6CisJICBpZiAoKl9fZmlyc3QgPT0gX192YWwpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMToKKwkgIGlmICgqX19maXJzdCA9PSBfX3ZhbCkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJICByZXR1cm4gX19sYXN0OworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYW4gb3ZlcmxvYWQgdXNlZCBieSBmaW5kX2lmKCkgZm9yIHRoZSBSQUkgY2FzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fZmluZF9pZihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOworCisgICAgICBmb3IgKDsgX190cmlwX2NvdW50ID4gMDsgLS1fX3RyaXBfY291bnQpCisJeworCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCisJICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCX0KKworICAgICAgc3dpdGNoIChfX2xhc3QgLSBfX2ZpcnN0KQorCXsKKwljYXNlIDM6CisJICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAyOgorCSAgaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMToKKwkgIGlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwkgIHJldHVybiBfX2xhc3Q7CisJfQorICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vLyBUaGlzIGlzIGFuIG92ZXJsb2FkIHVzZWQgYnkgZmluZF9pZl9ub3QoKSBmb3IgdGhlIElucHV0IEl0ZXJhdG9yIGNhc2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfSW5wdXRJdGVyYXRvcgorICAgIF9fZmluZF9pZl9ub3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9QcmVkaWNhdGUgX19wcmVkLCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmIGJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJKytfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGFuIG92ZXJsb2FkIHVzZWQgYnkgZmluZF9pZl9ub3QoKSBmb3IgdGhlIFJBSSBjYXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX19maW5kX2lmX25vdChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJICBfUHJlZGljYXRlIF9fcHJlZCwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9fdHJpcF9jb3VudCA9IChfX2xhc3QgLSBfX2ZpcnN0KSA+PiAyOworCisgICAgICBmb3IgKDsgX190cmlwX2NvdW50ID4gMDsgLS1fX3RyaXBfY291bnQpCisJeworCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKworCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwl9CisKKyAgICAgIHN3aXRjaCAoX19sYXN0IC0gX19maXJzdCkKKwl7CisJY2FzZSAzOgorCSAgaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgICsrX19maXJzdDsKKwljYXNlIDI6CisJICBpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0KSkpCisJICAgIHJldHVybiBfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCWNhc2UgMToKKwkgIGlmICghYm9vbChfX3ByZWQoKl9fZmlyc3QpKSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJICByZXR1cm4gX19sYXN0OworCX0KKyAgICB9CisjZW5kaWYKKworICAvLyBzZXRfZGlmZmVyZW5jZQorICAvLyBzZXRfaW50ZXJzZWN0aW9uCisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAvLyBzZXRfdW5pb24KKyAgLy8gZm9yX2VhY2gKKyAgLy8gZmluZAorICAvLyBmaW5kX2lmCisgIC8vIGZpbmRfZmlyc3Rfb2YKKyAgLy8gYWRqYWNlbnRfZmluZAorICAvLyBjb3VudAorICAvLyBjb3VudF9pZgorICAvLyBzZWFyY2gKKworLy8gTG9jYWwgbW9kaWZpY2F0aW9uOiBpZiBfX2dvb2dsZV9zdGxfZGVidWdfY29tcGFyZSBpcyBkZWZpbmVkIHRvCisvLyBub24temVybyB2YWx1ZSwgY2hlY2sgc29ydCBwcmVkaWNhdGUgZm9yIHN0cmljdCB3ZWFrIG9yZGVyaW5nLgorLy8gR29vZ2xlIHJlZiBiLzE3MzEyMDAuCisjaWYgX19nb29nbGVfc3RsX2RlYnVnX2NvbXBhcmUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbXBhcmU+CisgIHN0cnVjdCBfQ2hlY2tlZENvbXBhcmUgeworICAgIF9Db21wYXJlIF9NX2NvbXBhcmU7CisKKyAgICBfQ2hlY2tlZENvbXBhcmUoY29uc3QgX0NvbXBhcmUgJiBfX2NvbXApOiBfTV9jb21wYXJlKF9fY29tcCkgeyB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIHsKKyAgICAgIGlmIChfTV9jb21wYXJlKF9feCwgX194KSkKKyAgICAgICAgX190aHJvd19ydW50aW1lX2Vycm9yKCJzdHJpY3Qgd2VhayBvcmRlcmluZzogKF9feCBMVCBfX3gpICE9IGZhbHNlIik7CisgICAgICBpZiAoX01fY29tcGFyZShfX3ksIF9feSkpCisgICAgICAgIF9fdGhyb3dfcnVudGltZV9lcnJvcigic3RyaWN0IHdlYWsgb3JkZXJpbmc6IChfX3kgTFQgX195KSAhPSBmYWxzZSIpOworICAgICAgYm9vbCBsdCA9IF9NX2NvbXBhcmUoX194LCBfX3kpOworICAgICAgaWYgKGx0ICYmIF9NX2NvbXBhcmUoX195LCBfX3gpKQorICAgICAgICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoInN0cmljdCB3ZWFrIG9yZGVyaW5nOiAoKF9feCBMVCBfX3kpICYmIChfX3kgTFQgX194KSkgIT0gZmFsc2UiKTsKKyAgICAgIHJldHVybiBsdDsKKyAgICB9CisKKyAgICAvLyBEaWZmZXJlbnQgdHlwZXM7IGNhbid0IHBlcmZvcm0gYW55IGNoZWNrcy4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwMSYgX194LCBjb25zdCBfVHAyJiBfX3kpIHsKKyAgICAgIHJldHVybiBfTV9jb21wYXJlKF9feCwgX195KTsKKyAgICB9CisgIH07CisjIGRlZmluZSBfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkgX0NoZWNrZWRDb21wYXJlPF9fdHlwZW9mX18oX19jb21wKT4oX19jb21wKQorI2Vsc2UKKyMgZGVmaW5lIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSBfX2NvbXAKKyNlbmRpZgorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX0ludGVnZXIsIGNvbnN0IF9UcCYpCisgICAqICBvdmVybG9hZGVkIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19zZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLAorCSAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfX24gPSBfX2NvdW50OworCSAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworCSAgKytfX2k7CisJICB3aGlsZSAoX19pICE9IF9fbGFzdCAmJiBfX24gIT0gMSAmJiAqX19pID09IF9fdmFsKQorCSAgICB7CisJICAgICAgKytfX2k7CisJICAgICAgLS1fX247CisJICAgIH0KKwkgIGlmIChfX24gPT0gMSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBpZiAoX19pID09IF9fbGFzdCkKKwkgICAgcmV0dXJuIF9fbGFzdDsKKwkgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZCgrK19faSwgX19sYXN0LCBfX3ZhbCk7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICBzZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfSW50ZWdlciwgY29uc3QgX1RwJikKKyAgICogIG92ZXJsb2FkZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcgorICAgIF9fc2VhcmNoX24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAorCSAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLCAKKwkgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXI+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fdGFpbFNpemUgPSBfX2xhc3QgLSBfX2ZpcnN0OworICAgICAgY29uc3QgX0Rpc3RhbmNlVHlwZSBfX3BhdHRTaXplID0gX19jb3VudDsKKworICAgICAgaWYgKF9fdGFpbFNpemUgPCBfX3BhdHRTaXplKQorICAgICAgICByZXR1cm4gX19sYXN0OworCisgICAgICBjb25zdCBfRGlzdGFuY2VUeXBlIF9fc2tpcE9mZnNldCA9IF9fcGF0dFNpemUgLSAxOworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sb29rQWhlYWQgPSBfX2ZpcnN0ICsgX19za2lwT2Zmc2V0OworICAgICAgX190YWlsU2l6ZSAtPSBfX3BhdHRTaXplOworCisgICAgICB3aGlsZSAoMSkgLy8gdGhlIG1haW4gbG9vcC4uLgorCXsKKwkgIC8vIF9fbG9va0FoZWFkIGhlcmUgaXMgYWx3YXlzIHBvaW50aW5nIHRvIHRoZSBsYXN0IGVsZW1lbnQgb2YgbmV4dCAKKwkgIC8vIHBvc3NpYmxlIG1hdGNoLgorCSAgd2hpbGUgKCEoKl9fbG9va0FoZWFkID09IF9fdmFsKSkgLy8gdGhlIHNraXAgbG9vcC4uLgorCSAgICB7CisJICAgICAgaWYgKF9fdGFpbFNpemUgPCBfX3BhdHRTaXplKQorCQlyZXR1cm4gX19sYXN0OyAgLy8gRmFpbHVyZQorCSAgICAgIF9fbG9va0FoZWFkICs9IF9fcGF0dFNpemU7CisJICAgICAgX190YWlsU2l6ZSAtPSBfX3BhdHRTaXplOworCSAgICB9CisJICBfRGlzdGFuY2VUeXBlIF9fcmVtYWluZGVyID0gX19za2lwT2Zmc2V0OworCSAgZm9yIChfUmFuZG9tQWNjZXNzSXRlciBfX2JhY2tUcmFjayA9IF9fbG9va0FoZWFkIC0gMTsgCisJICAgICAgICpfX2JhY2tUcmFjayA9PSBfX3ZhbDsgLS1fX2JhY2tUcmFjaykKKwkgICAgeworCSAgICAgIGlmICgtLV9fcmVtYWluZGVyID09IDApCisJCXJldHVybiAoX19sb29rQWhlYWQgLSBfX3NraXBPZmZzZXQpOyAvLyBTdWNjZXNzCisJICAgIH0KKwkgIGlmIChfX3JlbWFpbmRlciA+IF9fdGFpbFNpemUpCisJICAgIHJldHVybiBfX2xhc3Q7IC8vIEZhaWx1cmUKKwkgIF9fbG9va0FoZWFkICs9IF9fcmVtYWluZGVyOworCSAgX190YWlsU2l6ZSAtPSBfX3JlbWFpbmRlcjsKKwl9CisgICAgfQorCisgIC8vIHNlYXJjaF9uCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICBzZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfSW50ZWdlciwgY29uc3QgX1RwJiwKKyAgICoJICAgICAgIF9CaW5hcnlQcmVkaWNhdGUpCisgICAqICBvdmVybG9hZGVkIGZvciBmb3J3YXJkIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19zZWFyY2hfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfSW50ZWdlciBfX2NvdW50LCBjb25zdCBfVHAmIF9fdmFsLAorCSAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsIF9fdmFsKSkpCisgICAgICAgICsrX19maXJzdDsKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJICAgIF9fbiA9IF9fY291bnQ7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisJICArK19faTsKKwkgIHdoaWxlIChfX2kgIT0gX19sYXN0ICYmIF9fbiAhPSAxICYmIGJvb2woX19iaW5hcnlfcHJlZCgqX19pLCBfX3ZhbCkpKQorCSAgICB7CisJICAgICAgKytfX2k7CisJICAgICAgLS1fX247CisJICAgIH0KKwkgIGlmIChfX24gPT0gMSkKKwkgICAgcmV0dXJuIF9fZmlyc3Q7CisJICBpZiAoX19pID09IF9fbGFzdCkKKwkgICAgcmV0dXJuIF9fbGFzdDsKKwkgIF9fZmlyc3QgPSArK19faTsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdAorCQkgJiYgIWJvb2woX19iaW5hcnlfcHJlZCgqX19maXJzdCwgX192YWwpKSkKKwkgICAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX2xhc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZAorICAgKiAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX0ludGVnZXIsIGNvbnN0IF9UcCYsCisgICAqCSAgICAgICBfQmluYXJ5UHJlZGljYXRlKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXIKKyAgICBfX3NlYXJjaF9uKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyIF9fbGFzdCwKKwkgICAgICAgX0ludGVnZXIgX19jb3VudCwgY29uc3QgX1RwJiBfX3ZhbCwKKwkgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLCBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX190YWlsU2l6ZSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBjb25zdCBfRGlzdGFuY2VUeXBlIF9fcGF0dFNpemUgPSBfX2NvdW50OworCisgICAgICBpZiAoX190YWlsU2l6ZSA8IF9fcGF0dFNpemUpCisgICAgICAgIHJldHVybiBfX2xhc3Q7CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZVR5cGUgX19za2lwT2Zmc2V0ID0gX19wYXR0U2l6ZSAtIDE7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xvb2tBaGVhZCA9IF9fZmlyc3QgKyBfX3NraXBPZmZzZXQ7CisgICAgICBfX3RhaWxTaXplIC09IF9fcGF0dFNpemU7CisKKyAgICAgIHdoaWxlICgxKSAvLyB0aGUgbWFpbiBsb29wLi4uCisJeworCSAgLy8gX19sb29rQWhlYWQgaGVyZSBpcyBhbHdheXMgcG9pbnRpbmcgdG8gdGhlIGxhc3QgZWxlbWVudCBvZiBuZXh0IAorCSAgLy8gcG9zc2libGUgbWF0Y2guCisJICB3aGlsZSAoIWJvb2woX19iaW5hcnlfcHJlZCgqX19sb29rQWhlYWQsIF9fdmFsKSkpIC8vIHRoZSBza2lwIGxvb3AuLi4KKwkgICAgeworCSAgICAgIGlmIChfX3RhaWxTaXplIDwgX19wYXR0U2l6ZSkKKwkJcmV0dXJuIF9fbGFzdDsgIC8vIEZhaWx1cmUKKwkgICAgICBfX2xvb2tBaGVhZCArPSBfX3BhdHRTaXplOworCSAgICAgIF9fdGFpbFNpemUgLT0gX19wYXR0U2l6ZTsKKwkgICAgfQorCSAgX0Rpc3RhbmNlVHlwZSBfX3JlbWFpbmRlciA9IF9fc2tpcE9mZnNldDsKKwkgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXIgX19iYWNrVHJhY2sgPSBfX2xvb2tBaGVhZCAtIDE7IAorCSAgICAgICBfX2JpbmFyeV9wcmVkKCpfX2JhY2tUcmFjaywgX192YWwpOyAtLV9fYmFja1RyYWNrKQorCSAgICB7CisJICAgICAgaWYgKC0tX19yZW1haW5kZXIgPT0gMCkKKwkJcmV0dXJuIChfX2xvb2tBaGVhZCAtIF9fc2tpcE9mZnNldCk7IC8vIFN1Y2Nlc3MKKwkgICAgfQorCSAgaWYgKF9fcmVtYWluZGVyID4gX190YWlsU2l6ZSkKKwkgICAgcmV0dXJuIF9fbGFzdDsgLy8gRmFpbHVyZQorCSAgX19sb29rQWhlYWQgKz0gX19yZW1haW5kZXI7CisJICBfX3RhaWxTaXplIC09IF9fcmVtYWluZGVyOworCX0KKyAgICB9CisKKyAgLy8gZmluZF9lbmQgZm9yIGZvcndhcmQgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBfX2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcsIGZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCXJldHVybiBfX2xhc3QxOworICAgICAgZWxzZQorCXsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fcmVzdWx0ID0gX19sYXN0MTsKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19uZXdfcmVzdWx0CisJCT0gX0dMSUJDWFhfU1REX0E6OnNlYXJjaChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOworCSAgICAgIGlmIChfX25ld19yZXN1bHQgPT0gX19sYXN0MSkKKwkJcmV0dXJuIF9fcmVzdWx0OworCSAgICAgIGVsc2UKKwkJeworCQkgIF9fcmVzdWx0ID0gX19uZXdfcmVzdWx0OworCQkgIF9fZmlyc3QxID0gX19uZXdfcmVzdWx0OworCQkgICsrX19maXJzdDE7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBfX2ZpbmRfZW5kKF9Gb3J3YXJkSXRlcmF0b3IxIF9fZmlyc3QxLCBfRm9yd2FyZEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcsIGZvcndhcmRfaXRlcmF0b3JfdGFnLAorCSAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm4gX19sYXN0MTsKKyAgICAgIGVsc2UKKwl7CisJICBfRm9yd2FyZEl0ZXJhdG9yMSBfX3Jlc3VsdCA9IF9fbGFzdDE7CisJICB3aGlsZSAoMSkKKwkgICAgeworCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbmV3X3Jlc3VsdAorCQk9IF9HTElCQ1hYX1NURF9BOjpzZWFyY2goX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLAorCQkJCQkgX19sYXN0MiwgX19jb21wKTsKKwkgICAgICBpZiAoX19uZXdfcmVzdWx0ID09IF9fbGFzdDEpCisJCXJldHVybiBfX3Jlc3VsdDsKKwkgICAgICBlbHNlCisJCXsKKwkJICBfX3Jlc3VsdCA9IF9fbmV3X3Jlc3VsdDsKKwkJICBfX2ZpcnN0MSA9IF9fbmV3X3Jlc3VsdDsKKwkJICArK19fZmlyc3QxOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgIC8vIGZpbmRfZW5kIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycyAobXVjaCBmYXN0ZXIpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjI+CisgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEKKyAgICBfX2ZpbmRfZW5kKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fZmlyc3QxLAorCSAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMj4pCisKKyAgICAgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMT4gX1Jldkl0ZXJhdG9yMTsKKyAgICAgIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMj4gX1Jldkl0ZXJhdG9yMjsKKworICAgICAgX1Jldkl0ZXJhdG9yMSBfX3JsYXN0MShfX2ZpcnN0MSk7CisgICAgICBfUmV2SXRlcmF0b3IyIF9fcmxhc3QyKF9fZmlyc3QyKTsKKyAgICAgIF9SZXZJdGVyYXRvcjEgX19ycmVzdWx0ID0gX0dMSUJDWFhfU1REX0E6OnNlYXJjaChfUmV2SXRlcmF0b3IxKF9fbGFzdDEpLAorCQkJCQkJICAgICAgIF9fcmxhc3QxLAorCQkJCQkJICAgICAgIF9SZXZJdGVyYXRvcjIoX19sYXN0MiksCisJCQkJCQkgICAgICAgX19ybGFzdDIpOworCisgICAgICBpZiAoX19ycmVzdWx0ID09IF9fcmxhc3QxKQorCXJldHVybiBfX2xhc3QxOworICAgICAgZWxzZQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fcmVzdWx0ID0gX19ycmVzdWx0LmJhc2UoKTsKKwkgIHN0ZDo6YWR2YW5jZShfX3Jlc3VsdCwgLXN0ZDo6ZGlzdGFuY2UoX19maXJzdDIsIF9fbGFzdDIpKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxLCB0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxCisgICAgX19maW5kX2VuZChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIgX19maXJzdDIsCisJICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywKKwkgICAgICAgX0JpbmFyeVByZWRpY2F0ZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPikKKworICAgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxPiBfUmV2SXRlcmF0b3IxOworICAgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyPiBfUmV2SXRlcmF0b3IyOworCisgICAgICBfUmV2SXRlcmF0b3IxIF9fcmxhc3QxKF9fZmlyc3QxKTsKKyAgICAgIF9SZXZJdGVyYXRvcjIgX19ybGFzdDIoX19maXJzdDIpOworICAgICAgX1Jldkl0ZXJhdG9yMSBfX3JyZXN1bHQgPSBzdGQ6OnNlYXJjaChfUmV2SXRlcmF0b3IxKF9fbGFzdDEpLCBfX3JsYXN0MSwKKwkJCQkJICAgIF9SZXZJdGVyYXRvcjIoX19sYXN0MiksIF9fcmxhc3QyLAorCQkJCQkgICAgX19jb21wKTsKKworICAgICAgaWYgKF9fcnJlc3VsdCA9PSBfX3JsYXN0MSkKKwlyZXR1cm4gX19sYXN0MTsKKyAgICAgIGVsc2UKKwl7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX3Jlc3VsdCA9IF9fcnJlc3VsdC5iYXNlKCk7CisJICBzdGQ6OmFkdmFuY2UoX19yZXN1bHQsIC1zdGQ6OmRpc3RhbmNlKF9fZmlyc3QyLCBfX2xhc3QyKSk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgRmluZCBsYXN0IG1hdGNoaW5nIHN1YnNlcXVlbmNlIGluIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIFN0YXJ0IG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBFbmQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIHNlcXVlbmNlIHRvIG1hdGNoLgorICAgKiAgQHBhcmFtICBsYXN0MiAgIEVuZCBvZiBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogIEByZXR1cm4gICBUaGUgbGFzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MS0obGFzdDItZmlyc3QyKSkgc3VjaCB0aGF0IEBjICooaStOKSA9PSBAcCAqKGZpcnN0MitOKQorICAgKiAgZm9yIGVhY2ggQGMgTiBpbiB0aGUgcmFuZ2UgQHAgWzAsbGFzdDItZmlyc3QyKSwgb3IgQHAgbGFzdDEgaWYgbm8KKyAgICogIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtmaXJzdDEsbGFzdDEpIGZvciBhIHN1Yi1zZXF1ZW5jZSB0aGF0IGNvbXBhcmVzCisgICAqICBlcXVhbCB2YWx1ZS1ieS12YWx1ZSB3aXRoIHRoZSBzZXF1ZW5jZSBnaXZlbiBieSBAcCBbZmlyc3QyLGxhc3QyKSBhbmQKKyAgICogIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN1Yi1zZXF1ZW5jZSwgb3IKKyAgICogIEBwIGxhc3QxIGlmIHRoZSBzdWItc2VxdWVuY2UgaXMgbm90IGZvdW5kLiAgVGhlIHN1Yi1zZXF1ZW5jZSB3aWxsIGJlIHRoZQorICAgKiAgbGFzdCBzdWNoIHN1YnNlcXVlbmNlIGNvbnRhaW5lZCBpbiBbZmlyc3QsbGFzdDEpLgorICAgKgorICAgKiAgQmVjYXVzZSB0aGUgc3ViLXNlcXVlbmNlIG11c3QgbGllIGNvbXBsZXRlbHkgd2l0aGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MSkgaXQgbXVzdCBzdGFydCBhdCBhIHBvc2l0aW9uIGxlc3MgdGhhbgorICAgKiAgQHAgbGFzdDEtKGxhc3QyLWZpcnN0Mikgd2hlcmUgQHAgbGFzdDItZmlyc3QyIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgICAqICBzdWItc2VxdWVuY2UuCisgICAqICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIEBjIGkgd2lsbCBiZSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdDEsbGFzdDEtKGxhc3QyLWZpcnN0MikpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBmaW5kX2VuZChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fZmluZF9lbmQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDEpLAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdDIpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBtYXRjaGluZyBzdWJzZXF1ZW5jZSBpbiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBTdGFydCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogIEBwYXJhbSAgbGFzdDIgICBFbmQgb2Ygc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqICBAcGFyYW0gIGNvbXAgICAgVGhlIHByZWRpY2F0ZSB0byB1c2UuCisgICAqICBAcmV0dXJuICAgVGhlIGxhc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdDEsbGFzdDEtKGxhc3QyLWZpcnN0MikpIHN1Y2ggdGhhdCBAYyBwcmVkaWNhdGUoKihpK04pLCBAcAorICAgKiAgKGZpcnN0MitOKSkgaXMgdHJ1ZSBmb3IgZWFjaCBAYyBOIGluIHRoZSByYW5nZSBAcCBbMCxsYXN0Mi1maXJzdDIpLCBvcgorICAgKiAgQHAgbGFzdDEgaWYgbm8gc3VjaCBpdGVyYXRvciBleGlzdHMuCisgICAqCisgICAqICBTZWFyY2hlcyB0aGUgcmFuZ2UgQHAgW2ZpcnN0MSxsYXN0MSkgZm9yIGEgc3ViLXNlcXVlbmNlIHRoYXQgY29tcGFyZXMKKyAgICogIGVxdWFsIHZhbHVlLWJ5LXZhbHVlIHdpdGggdGhlIHNlcXVlbmNlIGdpdmVuIGJ5IEBwIFtmaXJzdDIsbGFzdDIpIHVzaW5nCisgICAqICBjb21wIGFzIGEgcHJlZGljYXRlIGFuZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQorICAgKiAgc3ViLXNlcXVlbmNlLCBvciBAcCBsYXN0MSBpZiB0aGUgc3ViLXNlcXVlbmNlIGlzIG5vdCBmb3VuZC4gIFRoZQorICAgKiAgc3ViLXNlcXVlbmNlIHdpbGwgYmUgdGhlIGxhc3Qgc3VjaCBzdWJzZXF1ZW5jZSBjb250YWluZWQgaW4KKyAgICogIFtmaXJzdCxsYXN0MSkuCisgICAqCisgICAqICBCZWNhdXNlIHRoZSBzdWItc2VxdWVuY2UgbXVzdCBsaWUgY29tcGxldGVseSB3aXRoaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QxLGxhc3QxKSBpdCBtdXN0IHN0YXJ0IGF0IGEgcG9zaXRpb24gbGVzcyB0aGFuCisgICAqICBAcCBsYXN0MS0obGFzdDItZmlyc3QyKSB3aGVyZSBAcCBsYXN0Mi1maXJzdDIgaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICogIHN1Yi1zZXF1ZW5jZS4KKyAgICogIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmV0dXJuZWQgaXRlcmF0b3IgQGMgaSB3aWxsIGJlIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MS0obGFzdDItZmlyc3QyKSkKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IxCisgICAgZmluZF9lbmQoX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MiwKKwkgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICByZXR1cm4gc3RkOjpfX2ZpbmRfZW5kKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0MiwKKwkJCSAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QxKSwKKwkJCSAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QyKSwKKwkJCSAgICAgX19jb21wKTsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHRoYXQgYSBwcmVkaWNhdGUgaXMgdHJ1ZSBmb3IgYWxsIHRoZSBlbGVtZW50cworICAgKiAgICAgICAgICBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIGNoZWNrIGlzIHRydWUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFJldHVybnMgdHJ1ZSBpZiBAcCBwcmVkIGlzIHRydWUgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdCxsYXN0KSwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBhbGxfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7IHJldHVybiBfX2xhc3QgPT0gc3RkOjpmaW5kX2lmX25vdChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHRoYXQgYSBwcmVkaWNhdGUgaXMgZmFsc2UgZm9yIGFsbCB0aGUgZWxlbWVudHMKKyAgICogICAgICAgICAgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIHRoZSBjaGVjayBpcyB0cnVlLCBmYWxzZSBvdGhlcndpc2UuCisgICAqCisgICAqICBSZXR1cm5zIHRydWUgaWYgQHAgcHJlZCBpcyBmYWxzZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0LGxhc3QpLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG5vbmVfb2YoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7IHJldHVybiBfX2xhc3QgPT0gX0dMSUJDWFhfU1REX0E6OmZpbmRfaWYoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB0aGF0IGEgcHJlZGljYXRlIGlzIGZhbHNlIGZvciBhdCBsZWFzdCBhbiBlbGVtZW50CisgICAqICAgICAgICAgIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBwcmVkICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgY2hlY2sgaXMgdHJ1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKgorICAgKiAgUmV0dXJucyB0cnVlIGlmIGFuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgc3VjaCB0aGF0CisgICAqICBAcCBwcmVkIGlzIHRydWUsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgYW55X29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeyByZXR1cm4gIXN0ZDo6bm9uZV9vZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRmluZCB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHNlcXVlbmNlIGZvciB3aGljaCBhCisgICAqICAgICAgICAgIHByZWRpY2F0ZSBpcyBmYWxzZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBwcmVkICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KQorICAgKiAgc3VjaCB0aGF0IEBwIHByZWQoKmkpIGlzIGZhbHNlLCBvciBAcCBsYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2lmX25vdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHJldHVybiBzdGQ6Ol9fZmluZF9pZl9ub3QoX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBpcyBwYXJ0aXRpb25lZC4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWQgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBpcyBwYXJ0aW9uZWQgYnkgQHAgcHJlZCwKKyAgICogIGkuZS4gaWYgYWxsIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSBAcCBwcmVkIGFwcGVhciBiZWZvcmUgdGhvc2UgdGhhdAorICAgKiAgZG8gbm90LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX3BhcnRpdGlvbmVkKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgX19maXJzdCA9IHN0ZDo6ZmluZF9pZl9ub3QoX19maXJzdCwgX19sYXN0LCBfX3ByZWQpOworICAgICAgcmV0dXJuIHN0ZDo6bm9uZV9vZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGaW5kIHRoZSBwYXJ0aXRpb24gcG9pbnQgb2YgYSBwYXJ0aXRpb25lZCByYW5nZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBwcmVkICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgQHAgbWlkIHN1Y2ggdGhhdCBAcCBhbGxfb2YoZmlyc3QsIG1pZCwgcHJlZCkKKyAgICogICAgICAgICAgIGFuZCBAcCBub25lX29mKG1pZCwgbGFzdCwgcHJlZCkgYXJlIGJvdGggdHJ1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcGFydGl0aW9uX3BvaW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICAvLyBBIHNwZWNpZmljIGRlYnVnLW1vZGUgdGVzdCB3aWxsIGJlIG5lY2Vzc2FyeS4uLgorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2hhbGY7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlOworCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9faGFsZiA9IF9fbGVuID4+IDE7CisJICBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX19wcmVkKCpfX21pZGRsZSkpCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJICBlbHNlCisJICAgIF9fbGVuID0gX19oYWxmOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKyNlbmRpZgorCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZW1vdmluZyBlbGVtZW50cyBvZiBhIGdpdmVuIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgdmFsdWUgICBUaGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgbm90IGVxdWFsIHRvIEBwIHZhbHVlCisgICAqICB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIHJlc3VsdC4KKyAgICogIHJlbW92ZV9jb3B5KCkgaXMgc3RhYmxlLCBzbyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKKyAgICogIGNvcGllZCBpcyB1bmNoYW5nZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICByZW1vdmVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmICghKCpfX2ZpcnN0ID09IF9fdmFsdWUpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSBhIHNlcXVlbmNlLCByZW1vdmluZyBlbGVtZW50cyBmb3Igd2hpY2ggYSBwcmVkaWNhdGUgaXMgdHJ1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWQgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIGZvciB3aGljaAorICAgKiAgQHAgcHJlZCByZXR1cm5zIGZhbHNlIHRvIHRoZSByYW5nZSBiZWdpbm5pbmcgYXQgQHAgcmVzdWx0LgorICAgKgorICAgKiAgcmVtb3ZlX2NvcHlfaWYoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJlbW92ZV9jb3B5X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAvKioKKyAgICogIEBicmllZiBDb3B5IHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIGZvciB3aGljaCBhIHByZWRpY2F0ZSBpcyB0cnVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcHJlZCAgICBBIHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgZm9yIHdoaWNoCisgICAqICBAcCBwcmVkIHJldHVybnMgdHJ1ZSB0byB0aGUgcmFuZ2UgYmVnaW5uaW5nIGF0IEBwIHJlc3VsdC4KKyAgICoKKyAgICogIGNvcHlfaWYoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgY29waWVkIGlzIHVuY2hhbmdlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIGNvcHlfaWYoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19jb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgZm9yICg7IF9fbiA+IDA7IC0tX19uKQorCXsKKwkgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX2NvcHlfbihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiBzdGQ6OmNvcHkoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19yZXN1bHQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsZmlyc3QrbikgaW50byBbcmVzdWx0LHJlc3VsdCtuKS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBuICAgICAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBjb3B5LgorICAgKiAgQHBhcmFtICByZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgcmVzdWx0K24uCisgICAqCisgICAqICBUaGlzIGlubGluZSBmdW5jdGlvbiB3aWxsIGJvaWwgZG93biB0byBhIGNhbGwgdG8gQGMgbWVtbW92ZSB3aGVuZXZlcgorICAgKiAgcG9zc2libGUuICBGYWlsaW5nIHRoYXQsIGlmIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzIGFyZSBwYXNzZWQsIHRoZW4gdGhlCisgICAqICBsb29wIGNvdW50IHdpbGwgYmUga25vd24gKGFuZCB0aGVyZWZvcmUgYSBjYW5kaWRhdGUgZm9yIGNvbXBpbGVyCisgICAqICBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgdW5yb2xsaW5nKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIF9PdXRwdXRJdGVyYXRvcgorICAgIGNvcHlfbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICByZXR1cm4gc3RkOjpfX2NvcHlfbihfX2ZpcnN0LCBfX24sIF9fcmVzdWx0LAorCQkJICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29weSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSB0byBzZXBhcmF0ZSBvdXRwdXQgc2VxdWVuY2VzCisgICAqICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB0cnV0aCB2YWx1ZSBvZiBhIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgb3V0X3RydWUgICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG91dF9mYWxzZSAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBwcmVkICAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIEEgcGFpciBkZXNpZ25hdGluZyB0aGUgZW5kcyBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlcy4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBmb3Igd2hpY2gKKyAgICogIEBwIHByZWQgcmV0dXJucyB0cnVlIHRvIHRoZSByYW5nZSBiZWdpbm5pbmcgYXQgQHAgb3V0X3RydWUKKyAgICogIGFuZCBlYWNoIGVsZW1lbnQgZm9yIHdoaWNoIEBwIHByZWQgcmV0dXJucyBmYWxzZSB0byBAcCBvdXRfZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IxLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcjIsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgcGFpcjxfT3V0cHV0SXRlcmF0b3IxLCBfT3V0cHV0SXRlcmF0b3IyPgorICAgIHBhcnRpdGlvbl9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgX091dHB1dEl0ZXJhdG9yMSBfX291dF90cnVlLCBfT3V0cHV0SXRlcmF0b3IyIF9fb3V0X2ZhbHNlLAorCQkgICBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IxLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvcjIsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIAorICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICB7CisJICAgICpfX291dF90cnVlID0gKl9fZmlyc3Q7CisJICAgICsrX19vdXRfdHJ1ZTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgICpfX291dF9mYWxzZSA9ICpfX2ZpcnN0OworCSAgICArK19fb3V0X2ZhbHNlOworCSAgfQorCisgICAgICByZXR1cm4gcGFpcjxfT3V0cHV0SXRlcmF0b3IxLCBfT3V0cHV0SXRlcmF0b3IyPihfX291dF90cnVlLCBfX291dF9mYWxzZSk7CisgICAgfQorI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgUmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbHVlICBUaGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBBbGwgZWxlbWVudHMgZXF1YWwgdG8gQHAgdmFsdWUgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdCxsYXN0KS4KKyAgICoKKyAgICogIHJlbW92ZSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBub3QgcmVtb3ZlZCBpcyB1bmNoYW5nZWQuCisgICAqCisgICAqICBFbGVtZW50cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBhbmQgQHAgbGFzdAorICAgKiAgYXJlIHN0aWxsIHByZXNlbnQsIGJ1dCB0aGVpciB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICByZW1vdmUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX19maXJzdCA9IF9HTElCQ1hYX1NURF9BOjpmaW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZSk7CisgICAgICBpZihfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIGZvcig7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmKCEoKl9fZmlyc3QgPT0gX192YWx1ZSkpCisgICAgICAgICAgeworICAgICAgICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisgICAgICAgICAgICArK19fcmVzdWx0OworICAgICAgICAgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUmVtb3ZlIGVsZW1lbnRzIGZyb20gYSBzZXF1ZW5jZSB1c2luZyBhIHByZWRpY2F0ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcHJlZCAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIEFsbCBlbGVtZW50cyBmb3Igd2hpY2ggQHAgcHJlZCByZXR1cm5zIHRydWUgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdCxsYXN0KS4KKyAgICoKKyAgICogIHJlbW92ZV9pZigpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBub3QgcmVtb3ZlZCBpcyB1bmNoYW5nZWQuCisgICAqCisgICAqICBFbGVtZW50cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZSBhbmQgQHAgbGFzdAorICAgKiAgYXJlIHN0aWxsIHByZXNlbnQsIGJ1dCB0aGVpciB2YWx1ZSBpcyB1bnNwZWNpZmllZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcmVtb3ZlX2lmKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6ZmluZF9pZihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7CisgICAgICBpZihfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIGZvcig7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisgICAgICAgIGlmKCFib29sKF9fcHJlZCgqX19maXJzdCkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgICAgICAgKytfX3Jlc3VsdDsKKyAgICAgICAgICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlbW92ZSBjb25zZWN1dGl2ZSBkdXBsaWNhdGUgdmFsdWVzIGZyb20gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIFJlbW92ZXMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIGVhY2ggZ3JvdXAgb2YgY29uc2VjdXRpdmUKKyAgICogIHZhbHVlcyB0aGF0IGNvbXBhcmUgZXF1YWwuCisgICAqICB1bmlxdWUoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgbm90IHJlbW92ZWQgaXMgdW5jaGFuZ2VkLgorICAgKiAgRWxlbWVudHMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgYW5kIEBwIGxhc3QKKyAgICogIGFyZSBzdGlsbCBwcmVzZW50LCBidXQgdGhlaXIgdmFsdWUgaXMgdW5zcGVjaWZpZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbGl0eUNvbXBhcmFibGVDb25jZXB0PAorCQkgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgLy8gU2tpcCB0aGUgYmVnaW5uaW5nLCBpZiBhbHJlYWR5IHVuaXF1ZS4KKyAgICAgIF9fZmlyc3QgPSBfR0xJQkNYWF9TVERfQTo6YWRqYWNlbnRfZmluZChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2xhc3Q7CisKKyAgICAgIC8vIERvIHRoZSByZWFsIGNvcHkgd29yay4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19kZXN0ID0gX19maXJzdDsKKyAgICAgICsrX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghKCpfX2Rlc3QgPT0gKl9fZmlyc3QpKQorCSAgKisrX19kZXN0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisgICAgICByZXR1cm4gKytfX2Rlc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlbW92ZSBjb25zZWN1dGl2ZSB2YWx1ZXMgZnJvbSBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBiaW5hcnlfcHJlZCAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgUmVtb3ZlcyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IGZyb20gZWFjaCBncm91cCBvZiBjb25zZWN1dGl2ZQorICAgKiAgdmFsdWVzIGZvciB3aGljaCBAcCBiaW5hcnlfcHJlZCByZXR1cm5zIHRydWUuCisgICAqICB1bmlxdWUoKSBpcyBzdGFibGUsIHNvIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGFyZQorICAgKiAgbm90IHJlbW92ZWQgaXMgdW5jaGFuZ2VkLgorICAgKiAgRWxlbWVudHMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UgYW5kIEBwIGxhc3QKKyAgICogIGFyZSBzdGlsbCBwcmVzZW50LCBidXQgdGhlaXIgdmFsdWUgaXMgdW5zcGVjaWZpZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVuaXF1ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIC8vIFNraXAgdGhlIGJlZ2lubmluZywgaWYgYWxyZWFkeSB1bmlxdWUuCisgICAgICBfX2ZpcnN0ID0gX0dMSUJDWFhfU1REX0E6OmFkamFjZW50X2ZpbmQoX19maXJzdCwgX19sYXN0LCBfX2JpbmFyeV9wcmVkKTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworCisgICAgICAvLyBEbyB0aGUgcmVhbCBjb3B5IHdvcmsuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZGVzdCA9IF9fZmlyc3Q7CisgICAgICArK19fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoIWJvb2woX19iaW5hcnlfcHJlZCgqX19kZXN0LCAqX19maXJzdCkpKQorCSAgKisrX19kZXN0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisgICAgICByZXR1cm4gKytfX2Rlc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZCB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvcikKKyAgICogIG92ZXJsb2FkZWQgZm9yIGZvcndhcmQgaXRlcmF0b3JzIGFuZCBvdXRwdXQgaXRlcmF0b3IgYXMgcmVzdWx0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX191bmlxdWVfY29weShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJICBmb3J3YXJkX2l0ZXJhdG9yX3RhZywgb3V0cHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIGRpc3BhdGNoaW5nIGZ1bmN0aW9uCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisJaWYgKCEoKl9fZmlyc3QgPT0gKl9fbmV4dCkpCisJICB7CisJICAgIF9fZmlyc3QgPSBfX25leHQ7CisJICAgICorK19fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICB9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yLCBfSW5wdXRJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgaW5wdXQgaXRlcmF0b3JzIGFuZCBvdXRwdXQgaXRlcmF0b3IgYXMgcmVzdWx0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJICBpbnB1dF9pdGVyYXRvcl90YWcsIG91dHB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gdGFrZW4gY2FyZSBvZiBpbiBkaXNwYXRjaGluZyBmdW5jdGlvbgorICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3ZhbHVlID0gKl9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSBfX3ZhbHVlOworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCEoX192YWx1ZSA9PSAqX19maXJzdCkpCisJICB7CisJICAgIF9fdmFsdWUgPSAqX19maXJzdDsKKwkgICAgKisrX19yZXN1bHQgPSBfX3ZhbHVlOworCSAgfQorICAgICAgcmV0dXJuICsrX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiB1Z2xpZmllZCB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRJdGVyYXRvcikKKyAgICogIG92ZXJsb2FkZWQgZm9yIGlucHV0IGl0ZXJhdG9ycyBhbmQgZm9yd2FyZCBpdGVyYXRvciBhcyByZXN1bHQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkgIGlucHV0X2l0ZXJhdG9yX3RhZywgZm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gdGFrZW4gY2FyZSBvZiBpbiBkaXNwYXRjaGluZyBmdW5jdGlvbgorICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoISgqX19yZXN1bHQgPT0gKl9fZmlyc3QpKQorCSAgKisrX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQKKyAgICogIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yLCBfSW5wdXRJdGVyYXRvciwgX091dHB1dEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSkKKyAgICogIG92ZXJsb2FkZWQgZm9yIGZvcndhcmQgaXRlcmF0b3JzIGFuZCBvdXRwdXQgaXRlcmF0b3IgYXMgcmVzdWx0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisJCSAgZm9yd2FyZF9pdGVyYXRvcl90YWcsIG91dHB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMgLS0gaXRlcmF0b3JzIGFscmVhZHkgY2hlY2tlZAorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisJaWYgKCFib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKSkKKwkgIHsKKwkgICAgX19maXJzdCA9IF9fbmV4dDsKKwkgICAgKisrX19yZXN1bHQgPSAqX19maXJzdDsKKwkgIH0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQKKyAgICogIHVuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yLCBfSW5wdXRJdGVyYXRvciwgX091dHB1dEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgX0JpbmFyeVByZWRpY2F0ZSkKKyAgICogIG92ZXJsb2FkZWQgZm9yIGlucHV0IGl0ZXJhdG9ycyBhbmQgb3V0cHV0IGl0ZXJhdG9yIGFzIHJlc3VsdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIF9fdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkLAorCQkgIGlucHV0X2l0ZXJhdG9yX3RhZywgb3V0cHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSBpdGVyYXRvcnMgYWxyZWFkeSBjaGVja2VkCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfX3ZhbHVlID0gKl9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSBfX3ZhbHVlOworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJaWYgKCFib29sKF9fYmluYXJ5X3ByZWQoX192YWx1ZSwgKl9fZmlyc3QpKSkKKwkgIHsKKwkgICAgX192YWx1ZSA9ICpfX2ZpcnN0OworCSAgICAqKytfX3Jlc3VsdCA9IF9fdmFsdWU7CisJICB9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkCisgICAqICB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciwgX0lucHV0SXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgIF9CaW5hcnlQcmVkaWNhdGUpCisgICAqICBvdmVybG9hZGVkIGZvciBpbnB1dCBpdGVyYXRvcnMgYW5kIGZvcndhcmQgaXRlcmF0b3IgYXMgcmVzdWx0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaXF1ZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQsCisJCSAgaW5wdXRfaXRlcmF0b3JfdGFnLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSBpdGVyYXRvcnMgYWxyZWFkeSBjaGVja2VkCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICghYm9vbChfX2JpbmFyeV9wcmVkKCpfX3Jlc3VsdCwgKl9fZmlyc3QpKSkKKwkgICorK19fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIHVnbGlmaWVkIHJldmVyc2UoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yKQorICAgKiAgb3ZlcmxvYWRlZCBmb3IgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIHdoaWxlICh0cnVlKQorCWlmIChfX2ZpcnN0ID09IF9fbGFzdCB8fCBfX2ZpcnN0ID09IC0tX19sYXN0KQorCSAgcmV0dXJuOworCWVsc2UKKwkgIHsKKwkgICAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKwkgICAgKytfX2ZpcnN0OworCSAgfQorICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gdWdsaWZpZWQgcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IpCisgICAqICBvdmVybG9hZGVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JldmVyc2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybjsKKyAgICAgIC0tX19sYXN0OworICAgICAgd2hpbGUgKF9fZmlyc3QgPCBfX2xhc3QpCisJeworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKwkgICsrX19maXJzdDsKKwkgIC0tX19sYXN0OworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUmV2ZXJzZSBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIHJldmVyc2UoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpLAorICAgKiAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0IGV0Yy4KKyAgICogIEZvciBldmVyeSBAYyBpIHN1Y2ggdGhhdCBAcCAwPD1pPD0obGFzdC1maXJzdCkvMiksIEBwIHJldmVyc2UoKQorICAgKiAgc3dhcHMgQHAgKihmaXJzdCtpKSBhbmQgQHAgKihsYXN0LShpKzEpKQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcmV2ZXJzZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBzdGQ6Ol9fcmV2ZXJzZShfX2ZpcnN0LCBfX2xhc3QsIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmV2ZXJzaW5nIGl0cyBlbGVtZW50cy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIGRlc2lnbmF0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSB0byB0aGUgcmFuZ2UKKyAgICogIEBwIFtyZXN1bHQscmVzdWx0KyhsYXN0LWZpcnN0KSkgc3VjaCB0aGF0IHRoZSBvcmRlciBvZiB0aGUKKyAgICogIGVsZW1lbnRzIGlzIHJldmVyc2VkLgorICAgKiAgRm9yIGV2ZXJ5IEBjIGkgc3VjaCB0aGF0IEBwIDA8PWk8PShsYXN0LWZpcnN0KSwgQHAgcmV2ZXJzZV9jb3B5KCkKKyAgICogIHBlcmZvcm1zIHRoZSBhc3NpZ25tZW50IEBwICoocmVzdWx0KyhsYXN0LWZpcnN0KS1pKSA9ICooZmlyc3QraSkuCisgICAqICBUaGUgcmFuZ2VzIEBwIFtmaXJzdCxsYXN0KSBhbmQgQHAgW3Jlc3VsdCxyZXN1bHQrKGxhc3QtZmlyc3QpKQorICAgKiAgbXVzdCBub3Qgb3ZlcmxhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJldmVyc2VfY29weShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgLS1fX2xhc3Q7CisJICAqX19yZXN1bHQgPSAqX19sYXN0OworCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHJvdGF0ZSBhbGdvcml0aG0gc3BlY2lhbGl6ZWQgb24gUkFJcy4KKyAgICogIEl0IHJldHVybnMgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHR3byBpbnRlZ2VyIHZhbHVlcy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0V1Y2xpZGVhblJpbmdFbGVtZW50PgorICAgIF9FdWNsaWRlYW5SaW5nRWxlbWVudAorICAgIF9fZ2NkKF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX20sIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX24pCisgICAgeworICAgICAgd2hpbGUgKF9fbiAhPSAwKQorCXsKKwkgIF9FdWNsaWRlYW5SaW5nRWxlbWVudCBfX3QgPSBfX20gJSBfX247CisJICBfX20gPSBfX247CisJICBfX24gPSBfX3Q7CisJfQorICAgICAgcmV0dXJuIF9fbTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSByb3RhdGUgYWxnb3JpdGhtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JvdGF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlLAorCSAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX2xhc3QgID09IF9fbWlkZGxlKQorCXJldHVybjsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0MiA9IF9fbWlkZGxlOworICAgICAgZG8KKwl7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX2ZpcnN0Mik7CisJICArK19fZmlyc3Q7CisJICArK19fZmlyc3QyOworCSAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUpCisJICAgIF9fbWlkZGxlID0gX19maXJzdDI7CisJfQorICAgICAgd2hpbGUgKF9fZmlyc3QyICE9IF9fbGFzdCk7CisKKyAgICAgIF9fZmlyc3QyID0gX19taWRkbGU7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MiAhPSBfX2xhc3QpCisJeworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19maXJzdDIpOworCSAgKytfX2ZpcnN0OworCSAgKytfX2ZpcnN0MjsKKwkgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlKQorCSAgICBfX21pZGRsZSA9IF9fZmlyc3QyOworCSAgZWxzZSBpZiAoX19maXJzdDIgPT0gX19sYXN0KQorCSAgICBfX2ZpcnN0MiA9IF9fbWlkZGxlOworCX0KKyAgICB9CisKKyAgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgcm90YXRlIGFsZ29yaXRobS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX19yb3RhdGUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorCisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX2xhc3QgID09IF9fbWlkZGxlKQorCXJldHVybjsKKworICAgICAgc3RkOjpfX3JldmVyc2UoX19maXJzdCwgIF9fbWlkZGxlLCBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZygpKTsKKyAgICAgIHN0ZDo6X19yZXZlcnNlKF9fbWlkZGxlLCBfX2xhc3QsICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbWlkZGxlICYmIF9fbWlkZGxlICE9IF9fbGFzdCkKKwl7CisJICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCAtLV9fbGFzdCk7CisJICArK19fZmlyc3Q7CisJfQorCisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSkKKwlzdGQ6Ol9fcmV2ZXJzZShfX21pZGRsZSwgX19sYXN0LCAgIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnKCkpOworICAgICAgZWxzZQorCXN0ZDo6X19yZXZlcnNlKF9fZmlyc3QsICBfX21pZGRsZSwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcoKSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgcm90YXRlIGFsZ29yaXRobS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX3JvdGF0ZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwKKwkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbWlkZGxlIHx8IF9fbGFzdCAgPT0gX19taWRkbGUpCisJcmV0dXJuOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAgIC0gX19maXJzdDsKKyAgICAgIF9EaXN0YW5jZSBfX2sgPSBfX21pZGRsZSAtIF9fZmlyc3Q7CisKKyAgICAgIGlmIChfX2sgPT0gX19uIC0gX19rKQorCXsKKwkgIHN0ZDo6c3dhcF9yYW5nZXMoX19maXJzdCwgX19taWRkbGUsIF9fbWlkZGxlKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3AgPSBfX2ZpcnN0OworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIGlmIChfX2sgPCBfX24gLSBfX2spCisJICAgIHsKKwkgICAgICBpZiAoX19pc19wb2QoX1ZhbHVlVHlwZSkgJiYgX19rID09IDEpCisJCXsKKwkJICBfVmFsdWVUeXBlIF9fdCA9IF9HTElCQ1hYX01PVkUoKl9fcCk7CisJCSAgX0dMSUJDWFhfTU9WRTMoX19wICsgMSwgX19wICsgX19uLCBfX3ApOworCQkgICooX19wICsgX19uIC0gMSkgPSBfR0xJQkNYWF9NT1ZFKF9fdCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcSA9IF9fcCArIF9fazsKKwkgICAgICBmb3IgKF9EaXN0YW5jZSBfX2kgPSAwOyBfX2kgPCBfX24gLSBfX2s7ICsrIF9faSkKKwkJeworCQkgIHN0ZDo6aXRlcl9zd2FwKF9fcCwgX19xKTsKKwkJICArK19fcDsKKwkJICArK19fcTsKKwkJfQorCSAgICAgIF9fbiAlPSBfX2s7CisJICAgICAgaWYgKF9fbiA9PSAwKQorCQlyZXR1cm47CisJICAgICAgc3RkOjpzd2FwKF9fbiwgX19rKTsKKwkgICAgICBfX2sgPSBfX24gLSBfX2s7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fayA9IF9fbiAtIF9fazsKKwkgICAgICBpZiAoX19pc19wb2QoX1ZhbHVlVHlwZSkgJiYgX19rID09IDEpCisJCXsKKwkJICBfVmFsdWVUeXBlIF9fdCA9IF9HTElCQ1hYX01PVkUoKihfX3AgKyBfX24gLSAxKSk7CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wLCBfX3AgKyBfX24gLSAxLCBfX3AgKyBfX24pOworCQkgICpfX3AgPSBfR0xJQkNYWF9NT1ZFKF9fdCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcSA9IF9fcCArIF9fbjsKKwkgICAgICBfX3AgPSBfX3EgLSBfX2s7CisJICAgICAgZm9yIChfRGlzdGFuY2UgX19pID0gMDsgX19pIDwgX19uIC0gX19rOyArKyBfX2kpCisJCXsKKwkJICAtLV9fcDsKKwkJICAtLV9fcTsKKwkJICBzdGQ6Oml0ZXJfc3dhcChfX3AsIF9fcSk7CisJCX0KKwkgICAgICBfX24gJT0gX19rOworCSAgICAgIGlmIChfX24gPT0gMCkKKwkJcmV0dXJuOworCSAgICAgIHN0ZDo6c3dhcChfX24sIF9fayk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJvdGF0ZSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG1pZGRsZSAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSb3RhdGVzIHRoZSBlbGVtZW50cyBvZiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIGJ5IEBwIChtaWRkbGUtZmlyc3QpCisgICAqICBwb3NpdGlvbnMgc28gdGhhdCB0aGUgZWxlbWVudCBhdCBAcCBtaWRkbGUgaXMgbW92ZWQgdG8gQHAgZmlyc3QsIHRoZQorICAgKiAgZWxlbWVudCBhdCBAcCBtaWRkbGUrMSBpcyBtb3ZlZCB0byBAZmlyc3QrMSBhbmQgc28gb24gZm9yIGVhY2ggZWxlbWVudAorICAgKiAgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KS4KKyAgICoKKyAgICogIFRoaXMgZWZmZWN0aXZlbHkgc3dhcHMgdGhlIHJhbmdlcyBAcCBbZmlyc3QsbWlkZGxlKSBhbmQKKyAgICogIEBwIFttaWRkbGUsbGFzdCkuCisgICAqCisgICAqICBQZXJmb3JtcyBAcCAqKGZpcnN0KyhuKyhsYXN0LW1pZGRsZSkpJShsYXN0LWZpcnN0KSk9KihmaXJzdCtuKSBmb3IKKyAgICogIGVhY2ggQHAgbiBpbiB0aGUgcmFuZ2UgQHAgWzAsbGFzdC1maXJzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICByb3RhdGUoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlLAorCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5CisJX0l0ZXJUeXBlOworICAgICAgc3RkOjpfX3JvdGF0ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfSXRlclR5cGUoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcm90YXRpbmcgaXRzIGVsZW1lbnRzLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbWlkZGxlICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgdG8gdGhlIHJhbmdlCisgICAqICBiZWdpbm5pbmcgYXQgQHJlc3VsdCwgcm90YXRpbmcgdGhlIGNvcGllZCBlbGVtZW50cyBieSBAcCAobWlkZGxlLWZpcnN0KQorICAgKiAgcG9zaXRpb25zIHNvIHRoYXQgdGhlIGVsZW1lbnQgYXQgQHAgbWlkZGxlIGlzIG1vdmVkIHRvIEBwIHJlc3VsdCwgdGhlCisgICAqICBlbGVtZW50IGF0IEBwIG1pZGRsZSsxIGlzIG1vdmVkIHRvIEByZXN1bHQrMSBhbmQgc28gb24gZm9yIGVhY2ggZWxlbWVudAorICAgKiAgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KS4KKyAgICoKKyAgICogIFBlcmZvcm1zIEBwICoocmVzdWx0KyhuKyhsYXN0LW1pZGRsZSkpJShsYXN0LWZpcnN0KSk9KihmaXJzdCtuKSBmb3IKKyAgICogIGVhY2ggQHAgbiBpbiB0aGUgcmFuZ2UgQHAgWzAsbGFzdC1maXJzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICByb3RhdGVfY29weShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUsCisgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZGRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3B5KF9fbWlkZGxlLCBfX2xhc3QsIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fcGFydGl0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCV9QcmVkaWNhdGUgX19wcmVkLCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX3ByZWQoKl9fZmlyc3QpKQorCWlmICgrK19fZmlyc3QgPT0gX19sYXN0KQorCSAgcmV0dXJuIF9fZmlyc3Q7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKworICAgICAgd2hpbGUgKCsrX19uZXh0ICE9IF9fbGFzdCkKKwlpZiAoX19wcmVkKCpfX25leHQpKQorCSAgeworCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX25leHQpOworCSAgICArK19fZmlyc3Q7CisJICB9CisKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IKKyAgICBfX3BhcnRpdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQlfUHJlZGljYXRlIF9fcHJlZCwgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgd2hpbGUgKHRydWUpCisJICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgICByZXR1cm4gX19maXJzdDsKKwkgICAgZWxzZSBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgICArK19fZmlyc3Q7CisJICAgIGVsc2UKKwkgICAgICBicmVhazsKKwkgIC0tX19sYXN0OworCSAgd2hpbGUgKHRydWUpCisJICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgICByZXR1cm4gX19maXJzdDsKKwkgICAgZWxzZSBpZiAoIWJvb2woX19wcmVkKCpfX2xhc3QpKSkKKwkgICAgICAtLV9fbGFzdDsKKwkgICAgZWxzZQorCSAgICAgIGJyZWFrOworCSAgc3RkOjppdGVyX3N3YXAoX19maXJzdCwgX19sYXN0KTsKKwkgICsrX19maXJzdDsKKwl9CisgICAgfQorCisgIC8vIHBhcnRpdGlvbgorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9QcmVkaWNhdGUsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX19pbnBsYWNlX3N0YWJsZV9wYXJ0aXRpb24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgIF9QcmVkaWNhdGUgX19wcmVkLCBfRGlzdGFuY2UgX19sZW4pCisgICAgeworICAgICAgaWYgKF9fbGVuID09IDEpCisJcmV0dXJuIF9fcHJlZCgqX19maXJzdCkgPyBfX2xhc3QgOiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisgICAgICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9fbGVuIC8gMik7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fYmVnaW4gPSBzdGQ6Ol9faW5wbGFjZV9zdGFibGVfcGFydGl0aW9uKF9fZmlyc3QsCisJCQkJCQkJCSBfX21pZGRsZSwKKwkJCQkJCQkJIF9fcHJlZCwKKwkJCQkJCQkJIF9fbGVuIC8gMik7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZW5kID0gc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX21pZGRsZSwgX19sYXN0LAorCQkJCQkJCSAgICAgICBfX3ByZWQsCisJCQkJCQkJICAgICAgIF9fbGVuCisJCQkJCQkJICAgICAgIC0gX19sZW4gLyAyKTsKKyAgICAgIHN0ZDo6cm90YXRlKF9fYmVnaW4sIF9fbWlkZGxlLCBfX2VuZCk7CisgICAgICBzdGQ6OmFkdmFuY2UoX19iZWdpbiwgc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19lbmQpKTsKKyAgICAgIHJldHVybiBfX2JlZ2luOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUG9pbnRlciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkJX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkJX1ByZWRpY2F0ZSBfX3ByZWQsIF9EaXN0YW5jZSBfX2xlbiwKKwkJCQlfUG9pbnRlciBfX2J1ZmZlciwKKwkJCQlfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkKKyAgICB7CisgICAgICBpZiAoX19sZW4gPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0MSA9IF9fZmlyc3Q7CisJICBfUG9pbnRlciBfX3Jlc3VsdDIgPSBfX2J1ZmZlcjsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkKKwkgICAgICB7CisJCSpfX3Jlc3VsdDEgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKwkJKytfX3Jlc3VsdDE7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkqX19yZXN1bHQyID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdCk7CisJCSsrX19yZXN1bHQyOworCSAgICAgIH0KKwkgIF9HTElCQ1hYX01PVkUzKF9fYnVmZmVyLCBfX3Jlc3VsdDIsIF9fcmVzdWx0MSk7CisJICByZXR1cm4gX19yZXN1bHQxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkZGxlID0gX19maXJzdDsKKwkgIHN0ZDo6YWR2YW5jZShfX21pZGRsZSwgX19sZW4gLyAyKTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19iZWdpbiA9CisJICAgIHN0ZDo6X19zdGFibGVfcGFydGl0aW9uX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX3ByZWQsCisJCQkJCSAgICAgX19sZW4gLyAyLCBfX2J1ZmZlciwKKwkJCQkJICAgICBfX2J1ZmZlcl9zaXplKTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19lbmQgPQorCSAgICBzdGQ6Ol9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LCBfX3ByZWQsCisJCQkJCSAgICAgX19sZW4gLSBfX2xlbiAvIDIsCisJCQkJCSAgICAgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOworCSAgc3RkOjpyb3RhdGUoX19iZWdpbiwgX19taWRkbGUsIF9fZW5kKTsKKwkgIHN0ZDo6YWR2YW5jZShfX2JlZ2luLCBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX2VuZCkpOworCSAgcmV0dXJuIF9fYmVnaW47CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBNb3ZlIGVsZW1lbnRzIGZvciB3aGljaCBhIHByZWRpY2F0ZSBpcyB0cnVlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICogICAgICAgICBvZiBhIHNlcXVlbmNlLCBwcmVzZXJ2aW5nIHJlbGF0aXZlIG9yZGVyaW5nLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWQgICAgQSBwcmVkaWNhdGUgZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIEBwIG1pZGRsZSBzdWNoIHRoYXQgQHAgcHJlZChpKSBpcyB0cnVlIGZvciBlYWNoCisgICAqICBpdGVyYXRvciBAcCBpIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbWlkZGxlKSBhbmQgZmFsc2UgZm9yIGVhY2ggQHAgaQorICAgKiAgaW4gdGhlIHJhbmdlIEBwIFttaWRkbGUsbGFzdCkuCisgICAqCisgICAqICBQZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyBAcCBwYXJ0aXRpb24oKSB3aXRoIHRoZSBhZGRpdGlvbmFsCisgICAqICBndWFyYW50ZWUgdGhhdCB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZWxlbWVudHMgaW4gZWFjaCBncm91cCBpcworICAgKiAgcHJlc2VydmVkLCBzbyBhbnkgdHdvIGVsZW1lbnRzIEBwIHggYW5kIEBwIHkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbGFzdCkgc3VjaCB0aGF0IEBwIHByZWQoeCk9PXByZWQoeSkgd2lsbCBoYXZlIHRoZSBzYW1lCisgICAqICByZWxhdGl2ZSBvcmRlcmluZyBhZnRlciBjYWxsaW5nIEBwIHN0YWJsZV9wYXJ0aXRpb24oKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgc3RhYmxlX3BhcnRpdGlvbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBlbHNlCisJeworCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgICAgX1ZhbHVlVHlwZTsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgICAgX0Rpc3RhbmNlVHlwZTsKKworCSAgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1ZhbHVlVHlwZT4gX19idWYoX19maXJzdCwKKwkJCQkJCQkJX19sYXN0KTsKKwlpZiAoX19idWYuc2l6ZSgpID4gMCkKKwkgIHJldHVybgorCSAgICBzdGQ6Ol9fc3RhYmxlX3BhcnRpdGlvbl9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKKwkJCQkJICBfRGlzdGFuY2VUeXBlKF9fYnVmLnJlcXVlc3RlZF9zaXplKCkpLAorCQkJCQkgIF9fYnVmLmJlZ2luKCksCisJCQkJCSAgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpKTsKKwllbHNlCisJICByZXR1cm4KKwkgICAgc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3BhcnRpdGlvbihfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwKKwkJCQkJIF9EaXN0YW5jZVR5cGUoX19idWYucmVxdWVzdGVkX3NpemUoKSkpOworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9faGVhcF9zZWxlY3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgc3RkOjptYWtlX2hlYXAoX19maXJzdCwgX19taWRkbGUpOworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19taWRkbGU7IF9faSA8IF9fbGFzdDsgKytfX2kpCisJaWYgKCpfX2kgPCAqX19maXJzdCkKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19pKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2hlYXBfc2VsZWN0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgc3RkOjptYWtlX2hlYXAoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7CisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX21pZGRsZTsgX19pIDwgX19sYXN0OyArK19faSkKKwlpZiAoX19jb21wKCpfX2ksICpfX2ZpcnN0KSkKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19pLCBfX2NvbXApOworICAgIH0KKworICAvLyBwYXJ0aWFsX3NvcnQKKworICAvKioKKyAgICogIEBicmllZiBDb3B5IHRoZSBzbWFsbGVzdCBlbGVtZW50cyBvZiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0X2ZpcnN0ICAgQSByYW5kb20tYWNjZXNzIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHRfbGFzdCAgICBBbm90aGVyIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgYW5kIHNvcnRzIHRoZSBzbWFsbGVzdCBOIHZhbHVlcyBmcm9tIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkKKyAgICogIHRvIHRoZSByYW5nZSBiZWdpbm5pbmcgYXQgQHAgcmVzdWx0X2ZpcnN0LCB3aGVyZSB0aGUgbnVtYmVyIG9mCisgICAqICBlbGVtZW50cyB0byBiZSBjb3BpZWQsIEBwIE4sIGlzIHRoZSBzbWFsbGVyIG9mIEBwIChsYXN0LWZpcnN0KSBhbmQKKyAgICogIEBwIChyZXN1bHRfbGFzdC1yZXN1bHRfZmlyc3QpLgorICAgKiAgQWZ0ZXIgdGhlIHNvcnQgaWYgQHAgaSBhbmQgQGogYXJlIGl0ZXJhdG9ycyBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtyZXN1bHRfZmlyc3QscmVzdWx0X2ZpcnN0K04pIHN1Y2ggdGhhdCBAaSBwcmVjZWRlcyBAaiB0aGVuCisgICAqICBAcCAqajwqaSBpcyBmYWxzZS4KKyAgICogIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBAcCByZXN1bHRfZmlyc3QrTi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9maXJzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX0lucHV0VmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9PdXRwdXRWYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfSW5wdXRWYWx1ZVR5cGUsCisJCQkJICBfT3V0cHV0VmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X0lucHV0VmFsdWVUeXBlLAorCQkJCSAgICAgICAgICAgICAgICAgICAgIF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X2xhc3QpOworCisgICAgICBpZiAoX19yZXN1bHRfZmlyc3QgPT0gX19yZXN1bHRfbGFzdCkKKwlyZXR1cm4gX19yZXN1bHRfbGFzdDsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9yZWFsX2xhc3QgPSBfX3Jlc3VsdF9maXJzdDsKKyAgICAgIHdoaWxlKF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fcmVzdWx0X3JlYWxfbGFzdCAhPSBfX3Jlc3VsdF9sYXN0KQorCXsKKwkgICpfX3Jlc3VsdF9yZWFsX2xhc3QgPSAqX19maXJzdDsKKwkgICsrX19yZXN1bHRfcmVhbF9sYXN0OworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHN0ZDo6bWFrZV9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QpOworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIGlmICgqX19maXJzdCA8ICpfX3Jlc3VsdF9maXJzdCkKKwkgICAgc3RkOjpfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJICAgICAgIF9EaXN0YW5jZVR5cGUoX19yZXN1bHRfcmVhbF9sYXN0CisJCQkJCSAgICAgLSBfX3Jlc3VsdF9maXJzdCksCisJCQkgICAgICAgX0lucHV0VmFsdWVUeXBlKCpfX2ZpcnN0KSk7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgc3RkOjpzb3J0X2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCk7CisgICAgICByZXR1cm4gX19yZXN1bHRfcmVhbF9sYXN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3B5IHRoZSBzbWFsbGVzdCBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlIGZvcgorICAgKiAgICAgICAgIGNvbXBhcmlzb24uCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHRfZmlyc3QgICBBIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHJlc3VsdF9sYXN0ICAgIEFub3RoZXIgcmFuZG9tLWFjY2VzcyBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIHJlc3VsdGluZyBzZXF1ZW5jZS4KKyAgICoKKyAgICogIENvcGllcyBhbmQgc29ydHMgdGhlIHNtYWxsZXN0IE4gdmFsdWVzIGZyb20gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KQorICAgKiAgdG8gdGhlIHJhbmdlIGJlZ2lubmluZyBhdCBAcCByZXN1bHRfZmlyc3QsIHdoZXJlIHRoZSBudW1iZXIgb2YKKyAgICogIGVsZW1lbnRzIHRvIGJlIGNvcGllZCwgQHAgTiwgaXMgdGhlIHNtYWxsZXIgb2YgQHAgKGxhc3QtZmlyc3QpIGFuZAorICAgKiAgQHAgKHJlc3VsdF9sYXN0LXJlc3VsdF9maXJzdCkuCisgICAqICBBZnRlciB0aGUgc29ydCBpZiBAcCBpIGFuZCBAaiBhcmUgaXRlcmF0b3JzIGluIHRoZSByYW5nZQorICAgKiAgQHAgW3Jlc3VsdF9maXJzdCxyZXN1bHRfZmlyc3QrTikgc3VjaCB0aGF0IEBpIHByZWNlZGVzIEBqIHRoZW4KKyAgICogIEBwIGNvbXAoKmosKmkpIGlzIGZhbHNlLgorICAgKiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIEBwIHJlc3VsdF9maXJzdCtOLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBwYXJ0aWFsX3NvcnRfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX3Jlc3VsdF9maXJzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X2xhc3QsCisJCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfSW5wdXRWYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX091dHB1dFZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X0lucHV0VmFsdWVUeXBlLAorCQkJCSAgX091dHB1dFZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfSW5wdXRWYWx1ZVR5cGUsIF9PdXRwdXRWYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX091dHB1dFZhbHVlVHlwZSwgX091dHB1dFZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX3Jlc3VsdF9maXJzdCwgX19yZXN1bHRfbGFzdCk7CisKKyAgICAgIGlmIChfX3Jlc3VsdF9maXJzdCA9PSBfX3Jlc3VsdF9sYXN0KQorCXJldHVybiBfX3Jlc3VsdF9sYXN0OworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fcmVzdWx0X3JlYWxfbGFzdCA9IF9fcmVzdWx0X2ZpcnN0OworICAgICAgd2hpbGUoX19maXJzdCAhPSBfX2xhc3QgJiYgX19yZXN1bHRfcmVhbF9sYXN0ICE9IF9fcmVzdWx0X2xhc3QpCisJeworCSAgKl9fcmVzdWx0X3JlYWxfbGFzdCA9ICpfX2ZpcnN0OworCSAgKytfX3Jlc3VsdF9yZWFsX2xhc3Q7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgc3RkOjptYWtlX2hlYXAoX19yZXN1bHRfZmlyc3QsIF9fcmVzdWx0X3JlYWxfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSk7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19maXJzdCwgKl9fcmVzdWx0X2ZpcnN0KSkKKwkgICAgc3RkOjpfX2FkanVzdF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJICAgICAgIF9EaXN0YW5jZVR5cGUoX19yZXN1bHRfcmVhbF9sYXN0CisJCQkJCSAgICAgLSBfX3Jlc3VsdF9maXJzdCksCisJCQkgICAgICAgX0lucHV0VmFsdWVUeXBlKCpfX2ZpcnN0KSwKKwkJCSAgICAgICBfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkpOworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHN0ZDo6c29ydF9oZWFwKF9fcmVzdWx0X2ZpcnN0LCBfX3Jlc3VsdF9yZWFsX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICBfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkpOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3JlYWxfbGFzdDsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgX191bmd1YXJkZWRfbGluZWFyX2luc2VydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX192YWwgPSBfR0xJQkNYWF9NT1ZFKCpfX2xhc3QpOworICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbmV4dCA9IF9fbGFzdDsKKyAgICAgIC0tX19uZXh0OworICAgICAgd2hpbGUgKF9fdmFsIDwgKl9fbmV4dCkKKwl7CisJICAqX19sYXN0ID0gX0dMSUJDWFhfTU9WRSgqX19uZXh0KTsKKwkgIF9fbGFzdCA9IF9fbmV4dDsKKwkgIC0tX19uZXh0OworCX0KKyAgICAgICpfX2xhc3QgPSBfR0xJQkNYWF9NT1ZFKF9fdmFsKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9fdmFsID0gX0dMSUJDWFhfTU9WRSgqX19sYXN0KTsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX25leHQgPSBfX2xhc3Q7CisgICAgICAtLV9fbmV4dDsKKyAgICAgIHdoaWxlIChfX2NvbXAoX192YWwsICpfX25leHQpKQorCXsKKwkgICpfX2xhc3QgPSBfR0xJQkNYWF9NT1ZFKCpfX25leHQpOworCSAgX19sYXN0ID0gX19uZXh0OworCSAgLS1fX25leHQ7CisJfQorICAgICAgKl9fbGFzdCA9IF9HTElCQ1hYX01PVkUoX192YWwpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCXsKKwkgIGlmICgqX19pIDwgKl9fZmlyc3QpCisJICAgIHsKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCQlfX3ZhbCA9IF9HTElCQ1hYX01PVkUoKl9faSk7CisJICAgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdCwgX19pLCBfX2kgKyAxKTsKKwkgICAgICAqX19maXJzdCA9IF9HTElCQ1hYX01PVkUoX192YWwpOworCSAgICB9CisJICBlbHNlCisJICAgIHN0ZDo6X191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2kpOworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzb3J0IHJvdXRpbmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9faW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuOworCisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2ZpcnN0ICsgMTsgX19pICE9IF9fbGFzdDsgKytfX2kpCisJeworCSAgaWYgKF9fY29tcCgqX19pLCAqX19maXJzdCkpCisJICAgIHsKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCQlfX3ZhbCA9IF9HTElCQ1hYX01PVkUoKl9faSk7CisJICAgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdCwgX19pLCBfX2kgKyAxKTsKKwkgICAgICAqX19maXJzdCA9IF9HTElCQ1hYX01PVkUoX192YWwpOworCSAgICB9CisJICBlbHNlCisJICAgIHN0ZDo6X191bmd1YXJkZWRfbGluZWFyX2luc2VydChfX2ksIF9fY29tcCk7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdDsgX19pICE9IF9fbGFzdDsgKytfX2kpCisJc3RkOjpfX3VuZ3VhcmRlZF9saW5lYXJfaW5zZXJ0KF9faSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmd1YXJkZWRfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBmb3IgKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OyBfX2kgIT0gX19sYXN0OyArK19faSkKKwlzdGQ6Ol9fdW5ndWFyZGVkX2xpbmVhcl9pbnNlcnQoX19pLCBfX2NvbXApOworICAgIH0KKworICAvKioKKyAgICogIEBkb2N0b2RvCisgICAqICBUaGlzIGNvbnRyb2xzIHNvbWUgYXNwZWN0IG9mIHRoZSBzb3J0IHJvdXRpbmVzLgorICAqLworICBlbnVtIHsgX1NfdGhyZXNob2xkID0gMTYgfTsKKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19sYXN0IC0gX19maXJzdCA+IGludChfU190aHJlc2hvbGQpKQorCXsKKwkgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2ZpcnN0ICsgaW50KF9TX3RocmVzaG9sZCkpOworCSAgc3RkOjpfX3VuZ3VhcmRlZF9pbnNlcnRpb25fc29ydChfX2ZpcnN0ICsgaW50KF9TX3RocmVzaG9sZCksIF9fbGFzdCk7CisJfQorICAgICAgZWxzZQorCXN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19maW5hbF9pbnNlcnRpb25fc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19sYXN0IC0gX19maXJzdCA+IGludChfU190aHJlc2hvbGQpKQorCXsKKwkgIHN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2ZpcnN0ICsgaW50KF9TX3RocmVzaG9sZCksIF9fY29tcCk7CisJICBzdGQ6Ol9fdW5ndWFyZGVkX2luc2VydGlvbl9zb3J0KF9fZmlyc3QgKyBpbnQoX1NfdGhyZXNob2xkKSwgX19sYXN0LAorCQkJCQkgIF9fY29tcCk7CisJfQorICAgICAgZWxzZQorCXN0ZDo6X19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3Bpdm90KQorICAgIHsKKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIHdoaWxlICgqX19maXJzdCA8IF9fcGl2b3QpCisJICAgICsrX19maXJzdDsKKwkgIC0tX19sYXN0OworCSAgd2hpbGUgKF9fcGl2b3QgPCAqX19sYXN0KQorCSAgICAtLV9fbGFzdDsKKwkgIGlmICghKF9fZmlyc3QgPCBfX2xhc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7CisJICArK19fZmlyc3Q7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX191bmd1YXJkZWRfcGFydGl0aW9uKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkJICBjb25zdCBfVHAmIF9fcGl2b3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICB3aGlsZSAoX19jb21wKCpfX2ZpcnN0LCBfX3Bpdm90KSkKKwkgICAgKytfX2ZpcnN0OworCSAgLS1fX2xhc3Q7CisJICB3aGlsZSAoX19jb21wKF9fcGl2b3QsICpfX2xhc3QpKQorCSAgICAtLV9fbGFzdDsKKwkgIGlmICghKF9fZmlyc3QgPCBfX2xhc3QpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbGFzdCk7CisJICArK19fZmlyc3Q7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIF9fdW5ndWFyZGVkX3BhcnRpdGlvbl9waXZvdChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCQlfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZCA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkgLyAyOworICAgICAgc3RkOjpfX21vdmVfbWVkaWFuX2ZpcnN0KF9fZmlyc3QsIF9fbWlkLCAoX19sYXN0IC0gMSkpOworICAgICAgcmV0dXJuIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uKF9fZmlyc3QgKyAxLCBfX2xhc3QsICpfX2ZpcnN0KTsKKyAgICB9CisKKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbi4uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3VuZ3VhcmRlZF9wYXJ0aXRpb25fcGl2b3QoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkJX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZCA9IF9fZmlyc3QgKyAoX19sYXN0IC0gX19maXJzdCkgLyAyOworICAgICAgc3RkOjpfX21vdmVfbWVkaWFuX2ZpcnN0KF9fZmlyc3QsIF9fbWlkLCAoX19sYXN0IC0gMSksIF9fY29tcCk7CisgICAgICByZXR1cm4gc3RkOjpfX3VuZ3VhcmRlZF9wYXJ0aXRpb24oX19maXJzdCArIDEsIF9fbGFzdCwgKl9fZmlyc3QsIF9fY29tcCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgIHZvaWQKKyAgICBfX2ludHJvc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgX1NpemUgX19kZXB0aF9saW1pdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IGludChfU190aHJlc2hvbGQpKQorCXsKKwkgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApCisJICAgIHsKKwkgICAgICBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC0tX19kZXB0aF9saW1pdDsKKwkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2N1dCA9CisJICAgIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9fZmlyc3QsIF9fbGFzdCk7CisJICBzdGQ6Ol9faW50cm9zb3J0X2xvb3AoX19jdXQsIF9fbGFzdCwgX19kZXB0aF9saW1pdCk7CisJICBfX2xhc3QgPSBfX2N1dDsKKwl9CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc29ydCByb3V0aW5lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19pbnRyb3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkgICAgIF9TaXplIF9fZGVwdGhfbGltaXQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IGludChfU190aHJlc2hvbGQpKQorCXsKKwkgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApCisJICAgIHsKKwkgICAgICBfR0xJQkNYWF9TVERfQTo6cGFydGlhbF9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19sYXN0LCBfX2NvbXApOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgLS1fX2RlcHRoX2xpbWl0OworCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fY3V0ID0KKwkgICAgc3RkOjpfX3VuZ3VhcmRlZF9wYXJ0aXRpb25fcGl2b3QoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworCSAgc3RkOjpfX2ludHJvc29ydF9sb29wKF9fY3V0LCBfX2xhc3QsIF9fZGVwdGhfbGltaXQsIF9fY29tcCk7CisJICBfX2xhc3QgPSBfX2N1dDsKKwl9CisgICAgfQorCisgIC8vIHNvcnQKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplPgorICAgIHZvaWQKKyAgICBfX2ludHJvc2VsZWN0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19udGgsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX1NpemUgX19kZXB0aF9saW1pdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgd2hpbGUgKF9fbGFzdCAtIF9fZmlyc3QgPiAzKQorCXsKKwkgIGlmIChfX2RlcHRoX2xpbWl0ID09IDApCisJICAgIHsKKwkgICAgICBzdGQ6Ol9faGVhcF9zZWxlY3QoX19maXJzdCwgX19udGggKyAxLCBfX2xhc3QpOworCisJICAgICAgLy8gUGxhY2UgdGhlIG50aCBsYXJnZXN0IGVsZW1lbnQgaW4gaXRzIGZpbmFsIHBvc2l0aW9uLgorCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbnRoKTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwkgIC0tX19kZXB0aF9saW1pdDsKKwkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2N1dCA9CisJICAgIHN0ZDo6X191bmd1YXJkZWRfcGFydGl0aW9uX3Bpdm90KF9fZmlyc3QsIF9fbGFzdCk7CisJICBpZiAoX19jdXQgPD0gX19udGgpCisJICAgIF9fZmlyc3QgPSBfX2N1dDsKKwkgIGVsc2UKKwkgICAgX19sYXN0ID0gX19jdXQ7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2ludHJvc2VsZWN0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19udGgsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX1NpemUgX19kZXB0aF9saW1pdCwKKwkJICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMykKKwl7CisJICBpZiAoX19kZXB0aF9saW1pdCA9PSAwKQorCSAgICB7CisJICAgICAgc3RkOjpfX2hlYXBfc2VsZWN0KF9fZmlyc3QsIF9fbnRoICsgMSwgX19sYXN0LCBfX2NvbXApOworCSAgICAgIC8vIFBsYWNlIHRoZSBudGggbGFyZ2VzdCBlbGVtZW50IGluIGl0cyBmaW5hbCBwb3NpdGlvbi4KKwkgICAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX250aCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICAtLV9fZGVwdGhfbGltaXQ7CisJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19jdXQgPQorCSAgICBzdGQ6Ol9fdW5ndWFyZGVkX3BhcnRpdGlvbl9waXZvdChfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCk7CisJICBpZiAoX19jdXQgPD0gX19udGgpCisJICAgIF9fZmlyc3QgPSBfX2N1dDsKKwkgIGVsc2UKKwkgICAgX19sYXN0ID0gX19jdXQ7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKyAgICB9CisKKyAgLy8gbnRoX2VsZW1lbnQKKworICAvLyBsb3dlcl9ib3VuZCBtb3ZlZCB0byBzdGxfYWxnb2Jhc2UuaAorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB3aGljaCBAYSB2YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHBhcmFtICBjb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCA8ZW0+bm90IGxlc3MKKyAgICogICAgICAgICAgIHRoYW48L2VtPiBAYSB2YWwsIG9yIGVuZCgpIGlmIGV2ZXJ5IGVsZW1lbnQgaXMgbGVzcworICAgKiAgICAgICAgICAgdGhhbiBAYSB2YWwuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdHMgb24gb3JkZXJpbmcgYXMKKyAgICogIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzb3J0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBsb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQljb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX19maXJzdCwgX19sYXN0LAorCQkJCQkJX192YWwsIF9fY29tcCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX21pZGRsZSwgX192YWwpKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX2xlbiA9IF9faGFsZjsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIGxhc3QgcG9zaXRpb24gaW4gd2hpY2ggQGEgdmFsIGNvdWxkIGJlIGluc2VydGVkCisgICAqICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JkZXJpbmcuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICB2YWwgICAgIFRoZSBzZWFyY2ggdGVybS4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGdyZWF0ZXIgdGhhbiBAYSB2YWwsCisgICAqICAgICAgICAgICBvciBlbmQoKSBpZiBubyBlbGVtZW50cyBhcmUgZ3JlYXRlciB0aGFuIEBhIHZhbC4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIHVwcGVyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoX192YWwgPCAqX19taWRkbGUpCisJICAgIF9fbGVuID0gX19oYWxmOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgbGFzdCBwb3NpdGlvbiBpbiB3aGljaCBAYSB2YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHBhcmFtICBjb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgZ3JlYXRlciB0aGFuIEBhIHZhbCwKKyAgICogICAgICAgICAgIG9yIGVuZCgpIGlmIG5vIGVsZW1lbnRzIGFyZSBncmVhdGVyIHRoYW4gQGEgdmFsLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3RzIG9uIG9yZGVyaW5nIGFzCisgICAqICB0aGUgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIGluaXRpYWwgc29ydC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgdXBwZXJfYm91bmQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1RwLCBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCV9fdmFsLCBfX2NvbXApOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9EaXN0YW5jZVR5cGUgX19oYWxmID0gX19sZW4gPj4gMTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKShfX3ZhbCwgKl9fbWlkZGxlKSkKKwkgICAgX19sZW4gPSBfX2hhbGY7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBsYXJnZXN0IHN1YnJhbmdlIGluIHdoaWNoIEBhIHZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIGF0IGFueSBwbGFjZSBpbiBpdCB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiAgQW4gcGFpciBvZiBpdGVyYXRvcnMgZGVmaW5pbmcgdGhlIHN1YnJhbmdlLgorICAgKiAgQGluZ3JvdXAgYmluYXJ5X3NlYXJjaF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIEBjb2RlCisgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGxvd2VyX2JvdW5kKGZpcnN0LCBsYXN0LCB2YWwpLAorICAgKiAgICAgICAgICAgICAgICAgICB1cHBlcl9ib3VuZChmaXJzdCwgbGFzdCwgdmFsKSkKKyAgICogIEBlbmRjb2RlCisgICAqICBidXQgZG9lcyBub3QgYWN0dWFsbHkgY2FsbCB0aG9zZSBmdW5jdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1RwLCBfVmFsdWVUeXBlPikJCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7ICAgICAgCisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9EaXN0YW5jZVR5cGUgX19oYWxmID0gX19sZW4gPj4gMTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKCpfX21pZGRsZSA8IF9fdmFsKQorCSAgICB7CisJICAgICAgX19maXJzdCA9IF9fbWlkZGxlOworCSAgICAgICsrX19maXJzdDsKKwkgICAgICBfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX192YWwgPCAqX19taWRkbGUpCisJICAgIF9fbGVuID0gX19oYWxmOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xlZnQgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLAorCQkJCQkJCSBfX3ZhbCk7CisJICAgICAgc3RkOjphZHZhbmNlKF9fZmlyc3QsIF9fbGVuKTsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmlnaHQgPSBzdGQ6OnVwcGVyX2JvdW5kKCsrX19taWRkbGUsIF9fZmlyc3QsCisJCQkJCQkJICBfX3ZhbCk7CisJICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4oX19sZWZ0LCBfX3JpZ2h0KTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+KF9fZmlyc3QsIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgbGFyZ2VzdCBzdWJyYW5nZSBpbiB3aGljaCBAYSB2YWwgY291bGQgYmUgaW5zZXJ0ZWQKKyAgICogICAgICAgICBhdCBhbnkgcGxhY2UgaW4gaXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JkZXJpbmcuCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgdmFsICAgICBUaGUgc2VhcmNoIHRlcm0uCisgICAqICBAcGFyYW0gIGNvbXAgICAgQSBmdW5jdG9yIHRvIHVzZSBmb3IgY29tcGFyaXNvbnMuCisgICAqICBAcmV0dXJuICBBbiBwYWlyIG9mIGl0ZXJhdG9ycyBkZWZpbmluZyB0aGUgc3VicmFuZ2UuCisgICAqICBAaW5ncm91cCBiaW5hcnlfc2VhcmNoX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgKiAgQGNvZGUKKyAgICogICAgc3RkOjptYWtlX3BhaXIobG93ZXJfYm91bmQoZmlyc3QsIGxhc3QsIHZhbCwgY29tcCksCisgICAqICAgICAgICAgICAgICAgICAgIHVwcGVyX2JvdW5kKGZpcnN0LCBsYXN0LCB2YWwsIGNvbXApKQorICAgKiAgQGVuZGNvZGUKKyAgICogIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBjYWxsIHRob3NlIGZ1bmN0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgZXF1YWxfcmFuZ2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9UcCwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCQlfX3ZhbCwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCV9fdmFsLCBfX2NvbXApOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICB3aGlsZSAoX19sZW4gPiAwKQorCXsKKwkgIF9EaXN0YW5jZVR5cGUgX19oYWxmID0gX19sZW4gPj4gMTsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0OworCSAgc3RkOjphZHZhbmNlKF9fbWlkZGxlLCBfX2hhbGYpOworCSAgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19taWRkbGUsIF9fdmFsKSkKKwkgICAgeworCSAgICAgIF9fZmlyc3QgPSBfX21pZGRsZTsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgX19sZW4gPSBfX2xlbiAtIF9faGFsZiAtIDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKShfX3ZhbCwgKl9fbWlkZGxlKSkKKwkgICAgX19sZW4gPSBfX2hhbGY7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGVmdCA9IHN0ZDo6bG93ZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsCisJCQkJCQkJIF9fdmFsLCBfX2NvbXApOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0LCBfX2xlbik7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3JpZ2h0ID0gc3RkOjp1cHBlcl9ib3VuZCgrK19fbWlkZGxlLCBfX2ZpcnN0LAorCQkJCQkJCSAgX192YWwsIF9fY29tcCk7CisJICAgICAgcmV0dXJuIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4oX19sZWZ0LCBfX3JpZ2h0KTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBwYWlyPF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3I+KF9fZmlyc3QsIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZWxlbWVudCBleGlzdHMgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSB2YWwgKG9yIGl0cyBlcXVpdmFsZW50KSBpcyBpbiBbQGEgZmlyc3QsQGEgbGFzdCBdLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgcmV0dXJuIGFuIGl0ZXJhdG9yIHRvIEBhIHZhbC4gIEZvcgorICAgKiAgdGhhdCwgdXNlIHN0ZDo6ZmluZCBvciBhIGNvbnRhaW5lcidzIHNwZWNpYWxpemVkIGZpbmQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGJvb2wKKyAgICBiaW5hcnlfc2VhcmNoKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1RwLCBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2kgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fZmlyc3QsIF9fbGFzdCwgX192YWwpOworICAgICAgcmV0dXJuIF9faSAhPSBfX2xhc3QgJiYgIShfX3ZhbCA8ICpfX2kpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZWxlbWVudCBleGlzdHMgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHBhcmFtICBjb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSB2YWwgKG9yIGl0cyBlcXVpdmFsZW50KSBpcyBpbiBbQGEgZmlyc3QsQGEgbGFzdCBdLgorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWN0dWFsbHkgcmV0dXJuIGFuIGl0ZXJhdG9yIHRvIEBhIHZhbC4gIEZvcgorICAgKiAgdGhhdCwgdXNlIHN0ZDo6ZmluZCBvciBhIGNvbnRhaW5lcidzIHNwZWNpYWxpemVkIGZpbmQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICoKKyAgICogIFRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdHMgb24gb3JkZXJpbmcgYXMKKyAgICogIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaW5pdGlhbCBzb3J0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBiaW5hcnlfc2VhcmNoKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9fdmFsLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1RwLCBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcl9wcmVkKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCV9fdmFsLCBfX2NvbXApOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyX3ByZWQoX19maXJzdCwgX19sYXN0LAorCQkJCQkJX192YWwsIF9fY29tcCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19pID0gc3RkOjpsb3dlcl9ib3VuZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsLCBfX2NvbXApOworICAgICAgcmV0dXJuIF9faSAhPSBfX2xhc3QgJiYgIWJvb2woX19DaGVja2VkQ29tcGFyZShfX2NvbXApKF9fdmFsLCAqX19pKSk7CisgICAgfQorCisgIC8vIG1lcmdlCisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBfX21lcmdlX2FkYXB0aXZlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgdm9pZAorICAgIF9fbW92ZV9tZXJnZV9hZGFwdGl2ZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdDIpOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QxKTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIGlmIChfX2ZpcnN0MSAhPSBfX2xhc3QxKQorCV9HTElCQ1hYX01PVkUzKF9fZmlyc3QxLCBfX2xhc3QxLCBfX3Jlc3VsdCk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgX19tZXJnZV9hZGFwdGl2ZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgX19tb3ZlX21lcmdlX2FkYXB0aXZlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCQkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0Mik7CisJICAgICAgKytfX2ZpcnN0MjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gX0dMSUJDWFhfTU9WRSgqX19maXJzdDEpOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgaWYgKF9fZmlyc3QxICE9IF9fbGFzdDEpCisJX0dMSUJDWFhfTU9WRTMoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBfX21lcmdlX2FkYXB0aXZlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjM+CisgICAgdm9pZAorICAgIF9fbW92ZV9tZXJnZV9hZGFwdGl2ZV9iYWNrd2FyZChfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fZmlyc3QyLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fbGFzdDIsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjMgX19yZXN1bHQpCisgICAgeworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJeworCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdDIsIF9fbGFzdDIsIF9fcmVzdWx0KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBlbHNlIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCXJldHVybjsKKworICAgICAgLS1fX2xhc3QxOworICAgICAgLS1fX2xhc3QyOworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgaWYgKCpfX2xhc3QyIDwgKl9fbGFzdDEpCisJICAgIHsKKwkgICAgICAqLS1fX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fbGFzdDEpOworCSAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCQl7CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdDIsICsrX19sYXN0MiwgX19yZXN1bHQpOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIC0tX19sYXN0MTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKi0tX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2xhc3QyKTsKKwkgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwkJcmV0dXJuOworCSAgICAgIC0tX19sYXN0MjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBfX21lcmdlX2FkYXB0aXZlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjMsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21vdmVfbWVyZ2VfYWRhcHRpdmVfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19maXJzdDEsCisJCQkJICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEgX19sYXN0MSwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IzIF9fcmVzdWx0LAorCQkJCSAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwl7CisJICBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2ZpcnN0MiwgX19sYXN0MiwgX19yZXN1bHQpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UgaWYgKF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuOworCisgICAgICAtLV9fbGFzdDE7CisgICAgICAtLV9fbGFzdDI7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICBpZiAoX19jb21wKCpfX2xhc3QyLCAqX19sYXN0MSkpCisJICAgIHsKKwkgICAgICAqLS1fX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fbGFzdDEpOworCSAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxKQorCQl7CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdDIsICsrX19sYXN0MiwgX19yZXN1bHQpOworCQkgIHJldHVybjsKKwkJfQorCSAgICAgIC0tX19sYXN0MTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgKi0tX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2xhc3QyKTsKKwkgICAgICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKKwkJcmV0dXJuOworCSAgICAgIC0tX19sYXN0MjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBtZXJnZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcjEsIHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMQorICAgIF9fcm90YXRlX2FkYXB0aXZlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fZmlyc3QsCisJCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IxIF9fbWlkZGxlLAorCQkgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMSBfX2xhc3QsCisJCSAgICAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCisJCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IyIF9fYnVmZmVyLAorCQkgICAgICBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkKKyAgICB7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yMiBfX2J1ZmZlcl9lbmQ7CisgICAgICBpZiAoX19sZW4xID4gX19sZW4yICYmIF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIGlmIChfX2xlbjIpCisJICAgIHsKKwkgICAgICBfX2J1ZmZlcl9lbmQgPSBfR0xJQkNYWF9NT1ZFMyhfX21pZGRsZSwgX19sYXN0LCBfX2J1ZmZlcik7CisJICAgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIF9HTElCQ1hYX01PVkUzKF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fZmlyc3QpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfX2ZpcnN0OworCX0KKyAgICAgIGVsc2UgaWYgKF9fbGVuMSA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIGlmIChfX2xlbjEpCisJICAgIHsKKwkgICAgICBfX2J1ZmZlcl9lbmQgPSBfR0xJQkNYWF9NT1ZFMyhfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIpOworCSAgICAgIF9HTElCQ1hYX01PVkUzKF9fbWlkZGxlLCBfX2xhc3QsIF9fZmlyc3QpOworCSAgICAgIHJldHVybiBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfX2J1ZmZlciwgX19idWZmZXJfZW5kLCBfX2xhc3QpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfX2xhc3Q7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0ZDo6cm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOworCSAgc3RkOjphZHZhbmNlKF9fZmlyc3QsIHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fbGFzdCkpOworCSAgcmV0dXJuIF9fZmlyc3Q7CisJfQorICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIG1lcmdlIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2UsCisJICAgdHlwZW5hbWUgX1BvaW50ZXI+CisgICAgdm9pZAorICAgIF9fbWVyZ2VfYWRhcHRpdmUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorCQkgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkKKyAgICB7CisgICAgICBpZiAoX19sZW4xIDw9IF9fbGVuMiAmJiBfX2xlbjEgPD0gX19idWZmZXJfc2l6ZSkKKwl7CisJICBfUG9pbnRlciBfX2J1ZmZlcl9lbmQgPSBfR0xJQkNYWF9NT1ZFMyhfX2ZpcnN0LCBfX21pZGRsZSwgX19idWZmZXIpOworCSAgc3RkOjpfX21vdmVfbWVyZ2VfYWRhcHRpdmUoX19idWZmZXIsIF9fYnVmZmVyX2VuZCwgX19taWRkbGUsIF9fbGFzdCwKKwkJCQkgICAgIF9fZmlyc3QpOworCX0KKyAgICAgIGVsc2UgaWYgKF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIF9Qb2ludGVyIF9fYnVmZmVyX2VuZCA9IF9HTElCQ1hYX01PVkUzKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyKTsKKwkgIHN0ZDo6X19tb3ZlX21lcmdlX2FkYXB0aXZlX2JhY2t3YXJkKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwKKwkJCQkJICAgICAgX19idWZmZXJfZW5kLCBfX2xhc3QpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CisJICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7CisJICBfRGlzdGFuY2UgX19sZW4yMiA9IDA7CisJICBpZiAoX19sZW4xID4gX19sZW4yKQorCSAgICB7CisJICAgICAgX19sZW4xMSA9IF9fbGVuMSAvIDI7CisJICAgICAgc3RkOjphZHZhbmNlKF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKKwkgICAgICBfX3NlY29uZF9jdXQgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fbWlkZGxlLCBfX2xhc3QsCisJCQkJCSAgICAgICpfX2ZpcnN0X2N1dCk7CisJICAgICAgX19sZW4yMiA9IHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOworCSAgICAgIHN0ZDo6YWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOworCSAgICAgIF9fZmlyc3RfY3V0ID0gc3RkOjp1cHBlcl9ib3VuZChfX2ZpcnN0LCBfX21pZGRsZSwKKwkJCQkJICAgICAqX19zZWNvbmRfY3V0KTsKKwkgICAgICBfX2xlbjExID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCk7CisJICAgIH0KKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19uZXdfbWlkZGxlID0KKwkgICAgc3RkOjpfX3JvdGF0ZV9hZGFwdGl2ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCwKKwkJCQkgICBfX2xlbjEgLSBfX2xlbjExLCBfX2xlbjIyLCBfX2J1ZmZlciwKKwkJCQkgICBfX2J1ZmZlcl9zaXplKTsKKwkgIHN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLCBfX2xlbjExLAorCQkJCV9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwkgIHN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX25ld19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sYXN0LAorCQkJCV9fbGVuMSAtIF9fbGVuMTEsCisJCQkJX19sZW4yIC0gX19sZW4yMiwgX19idWZmZXIsIF9fYnVmZmVyX3NpemUpOworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBtZXJnZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLCAKKwkgICB0eXBlbmFtZSBfUG9pbnRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbWVyZ2VfYWRhcHRpdmUoX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX21pZGRsZSwKKwkJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICBfRGlzdGFuY2UgX19sZW4xLCBfRGlzdGFuY2UgX19sZW4yLAorCQkgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwKKwkJICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fbGVuMSA8PSBfX2xlbjIgJiYgX19sZW4xIDw9IF9fYnVmZmVyX3NpemUpCisJeworCSAgX1BvaW50ZXIgX19idWZmZXJfZW5kID0gX0dMSUJDWFhfTU9WRTMoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKwkgIHN0ZDo6X19tb3ZlX21lcmdlX2FkYXB0aXZlKF9fYnVmZmVyLCBfX2J1ZmZlcl9lbmQsIF9fbWlkZGxlLCBfX2xhc3QsCisJCQkJICAgICBfX2ZpcnN0LCBfX2NvbXApOworCX0KKyAgICAgIGVsc2UgaWYgKF9fbGVuMiA8PSBfX2J1ZmZlcl9zaXplKQorCXsKKwkgIF9Qb2ludGVyIF9fYnVmZmVyX2VuZCA9IF9HTElCQ1hYX01PVkUzKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyKTsKKwkgIHN0ZDo6X19tb3ZlX21lcmdlX2FkYXB0aXZlX2JhY2t3YXJkKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwKKwkJCQkJICAgICAgX19idWZmZXJfZW5kLCBfX2xhc3QsIF9fY29tcCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdF9jdXQgPSBfX2ZpcnN0OworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX3NlY29uZF9jdXQgPSBfX21pZGRsZTsKKwkgIF9EaXN0YW5jZSBfX2xlbjExID0gMDsKKwkgIF9EaXN0YW5jZSBfX2xlbjIyID0gMDsKKwkgIGlmIChfX2xlbjEgPiBfX2xlbjIpCisJICAgIHsKKwkgICAgICBfX2xlbjExID0gX19sZW4xIC8gMjsKKwkgICAgICBzdGQ6OmFkdmFuY2UoX19maXJzdF9jdXQsIF9fbGVuMTEpOworCSAgICAgIF9fc2Vjb25kX2N1dCA9IHN0ZDo6bG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9fZmlyc3RfY3V0LAorCQkJCQkgICAgICBfX2NvbXApOworCSAgICAgIF9fbGVuMjIgPSBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfX2xlbjIyID0gX19sZW4yIC8gMjsKKwkgICAgICBzdGQ6OmFkdmFuY2UoX19zZWNvbmRfY3V0LCBfX2xlbjIyKTsKKwkgICAgICBfX2ZpcnN0X2N1dCA9IHN0ZDo6dXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQsCisJCQkJCSAgICAgX19jb21wKTsKKwkgICAgICBfX2xlbjExID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCk7CisJICAgIH0KKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19uZXdfbWlkZGxlID0KKwkgICAgc3RkOjpfX3JvdGF0ZV9hZGFwdGl2ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCwKKwkJCQkgICBfX2xlbjEgLSBfX2xlbjExLCBfX2xlbjIyLCBfX2J1ZmZlciwKKwkJCQkgICBfX2J1ZmZlcl9zaXplKTsKKwkgIHN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLCBfX2xlbjExLAorCQkJCV9fbGVuMjIsIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworCSAgc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsCisJCQkJX19sZW4xIC0gX19sZW4xMSwKKwkJCQlfX2xlbjIgLSBfX2xlbjIyLCBfX2J1ZmZlciwKKwkJCQlfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworCX0KKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBtZXJnZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19taWRkbGUsCisJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIpCisgICAgeworICAgICAgaWYgKF9fbGVuMSA9PSAwIHx8IF9fbGVuMiA9PSAwKQorCXJldHVybjsKKyAgICAgIGlmIChfX2xlbjEgKyBfX2xlbjIgPT0gMikKKwl7CisJICBpZiAoKl9fbWlkZGxlIDwgKl9fZmlyc3QpCisJICAgIHN0ZDo6aXRlcl9zd2FwKF9fZmlyc3QsIF9fbWlkZGxlKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3RfY3V0ID0gX19maXJzdDsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19zZWNvbmRfY3V0ID0gX19taWRkbGU7CisgICAgICBfRGlzdGFuY2UgX19sZW4xMSA9IDA7CisgICAgICBfRGlzdGFuY2UgX19sZW4yMiA9IDA7CisgICAgICBpZiAoX19sZW4xID4gX19sZW4yKQorCXsKKwkgIF9fbGVuMTEgPSBfX2xlbjEgLyAyOworCSAgc3RkOjphZHZhbmNlKF9fZmlyc3RfY3V0LCBfX2xlbjExKTsKKwkgIF9fc2Vjb25kX2N1dCA9IHN0ZDo6bG93ZXJfYm91bmQoX19taWRkbGUsIF9fbGFzdCwgKl9fZmlyc3RfY3V0KTsKKwkgIF9fbGVuMjIgPSBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX2xlbjIyID0gX19sZW4yIC8gMjsKKwkgIHN0ZDo6YWR2YW5jZShfX3NlY29uZF9jdXQsIF9fbGVuMjIpOworCSAgX19maXJzdF9jdXQgPSBzdGQ6OnVwcGVyX2JvdW5kKF9fZmlyc3QsIF9fbWlkZGxlLCAqX19zZWNvbmRfY3V0KTsKKwkgIF9fbGVuMTEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fZmlyc3RfY3V0KTsKKwl9CisgICAgICBzdGQ6OnJvdGF0ZShfX2ZpcnN0X2N1dCwgX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbmV3X21pZGRsZSA9IF9fZmlyc3RfY3V0OworICAgICAgc3RkOjphZHZhbmNlKF9fbmV3X21pZGRsZSwgc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19zZWNvbmRfY3V0KSk7CisgICAgICBzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19maXJzdF9jdXQsIF9fbmV3X21pZGRsZSwKKwkJCQkgIF9fbGVuMTEsIF9fbGVuMjIpOworICAgICAgc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fbmV3X21pZGRsZSwgX19zZWNvbmRfY3V0LCBfX2xhc3QsCisJCQkJICBfX2xlbjEgLSBfX2xlbjExLCBfX2xlbjIgLSBfX2xlbjIyKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBtZXJnZSByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19taWRkbGUsCisJCQkgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9EaXN0YW5jZSBfX2xlbjEsIF9EaXN0YW5jZSBfX2xlbjIsCisJCQkgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgaWYgKF9fbGVuMSA9PSAwIHx8IF9fbGVuMiA9PSAwKQorCXJldHVybjsKKyAgICAgIGlmIChfX2xlbjEgKyBfX2xlbjIgPT0gMikKKwl7CisJICBpZiAoX19jb21wKCpfX21pZGRsZSwgKl9fZmlyc3QpKQorCSAgICBzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisJICByZXR1cm47CisJfQorICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ZpcnN0X2N1dCA9IF9fZmlyc3Q7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fc2Vjb25kX2N1dCA9IF9fbWlkZGxlOworICAgICAgX0Rpc3RhbmNlIF9fbGVuMTEgPSAwOworICAgICAgX0Rpc3RhbmNlIF9fbGVuMjIgPSAwOworICAgICAgaWYgKF9fbGVuMSA+IF9fbGVuMikKKwl7CisJICBfX2xlbjExID0gX19sZW4xIC8gMjsKKwkgIHN0ZDo6YWR2YW5jZShfX2ZpcnN0X2N1dCwgX19sZW4xMSk7CisJICBfX3NlY29uZF9jdXQgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fbWlkZGxlLCBfX2xhc3QsICpfX2ZpcnN0X2N1dCwKKwkJCQkJICBfX2NvbXApOworCSAgX19sZW4yMiA9IHN0ZDo6ZGlzdGFuY2UoX19taWRkbGUsIF9fc2Vjb25kX2N1dCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9fbGVuMjIgPSBfX2xlbjIgLyAyOworCSAgc3RkOjphZHZhbmNlKF9fc2Vjb25kX2N1dCwgX19sZW4yMik7CisJICBfX2ZpcnN0X2N1dCA9IHN0ZDo6dXBwZXJfYm91bmQoX19maXJzdCwgX19taWRkbGUsICpfX3NlY29uZF9jdXQsCisJCQkJCSBfX2NvbXApOworCSAgX19sZW4xMSA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19maXJzdF9jdXQpOworCX0KKyAgICAgIHN0ZDo6cm90YXRlKF9fZmlyc3RfY3V0LCBfX21pZGRsZSwgX19zZWNvbmRfY3V0KTsKKyAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19uZXdfbWlkZGxlID0gX19maXJzdF9jdXQ7CisgICAgICBzdGQ6OmFkdmFuY2UoX19uZXdfbWlkZGxlLCBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX3NlY29uZF9jdXQpKTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX2ZpcnN0X2N1dCwgX19uZXdfbWlkZGxlLAorCQkJCSAgX19sZW4xMSwgX19sZW4yMiwgX19jb21wKTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX25ld19taWRkbGUsIF9fc2Vjb25kX2N1dCwgX19sYXN0LAorCQkJCSAgX19sZW4xIC0gX19sZW4xMSwgX19sZW4yIC0gX19sZW4yMiwgX19jb21wKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTWVyZ2VzIHR3byBzb3J0ZWQgcmFuZ2VzIGluIHBsYWNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG1pZGRsZSAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIE1lcmdlcyB0d28gc29ydGVkIGFuZCBjb25zZWN1dGl2ZSByYW5nZXMsIFtmaXJzdCxtaWRkbGUpIGFuZAorICAgKiAgW21pZGRsZSxsYXN0KSwgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiBbZmlyc3QsbGFzdCkuICBUaGUgb3V0cHV0IHdpbGwKKyAgICogIGJlIHNvcnRlZC4gIFRoZSBzb3J0IGlzIEBlIHN0YWJsZSwgdGhhdCBpcywgZm9yIGVxdWl2YWxlbnQKKyAgICogIGVsZW1lbnRzIGluIHRoZSB0d28gcmFuZ2VzLCBlbGVtZW50cyBmcm9tIHRoZSBmaXJzdCByYW5nZSB3aWxsIGFsd2F5cworICAgKiAgY29tZSBiZWZvcmUgZWxlbWVudHMgZnJvbSB0aGUgc2Vjb25kLgorICAgKgorICAgKiAgSWYgZW5vdWdoIGFkZGl0aW9uYWwgbWVtb3J5IGlzIGF2YWlsYWJsZSwgdGhpcyB0YWtlcyAobGFzdC1maXJzdCktMQorICAgKiAgY29tcGFyaXNvbnMuICBPdGhlcndpc2UgYW4gTmxvZ04gYWxnb3JpdGhtIGlzIHVzZWQsIHdoZXJlIE4gaXMKKyAgICogIGRpc3RhbmNlKGZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAgICAgICAgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgICAgICBfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX21pZGRsZSB8fCBfX21pZGRsZSA9PSBfX2xhc3QpCisJcmV0dXJuOworCisgICAgICBfRGlzdGFuY2VUeXBlIF9fbGVuMSA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX0Rpc3RhbmNlVHlwZSBfX2xlbjIgPSBzdGQ6OmRpc3RhbmNlKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBfVGVtcG9yYXJ5X2J1ZmZlcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVmFsdWVUeXBlPiBfX2J1ZihfX2ZpcnN0LAorCQkJCQkJCQkgIF9fbGFzdCk7CisgICAgICBpZiAoX19idWYuYmVnaW4oKSA9PSAwKQorCXN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LCBfX2xlbjEsIF9fbGVuMik7CisgICAgICBlbHNlCisJc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLAorCQkJICAgICAgX19idWYuYmVnaW4oKSwgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTWVyZ2VzIHR3byBzb3J0ZWQgcmFuZ2VzIGluIHBsYWNlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG1pZGRsZSAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBjb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIE1lcmdlcyB0d28gc29ydGVkIGFuZCBjb25zZWN1dGl2ZSByYW5nZXMsIFtmaXJzdCxtaWRkbGUpIGFuZAorICAgKiAgW21pZGRsZSxsYXN0KSwgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbiBbZmlyc3QsbGFzdCkuICBUaGUgb3V0cHV0IHdpbGwKKyAgICogIGJlIHNvcnRlZC4gIFRoZSBzb3J0IGlzIEBlIHN0YWJsZSwgdGhhdCBpcywgZm9yIGVxdWl2YWxlbnQKKyAgICogIGVsZW1lbnRzIGluIHRoZSB0d28gcmFuZ2VzLCBlbGVtZW50cyBmcm9tIHRoZSBmaXJzdCByYW5nZSB3aWxsIGFsd2F5cworICAgKiAgY29tZSBiZWZvcmUgZWxlbWVudHMgZnJvbSB0aGUgc2Vjb25kLgorICAgKgorICAgKiAgSWYgZW5vdWdoIGFkZGl0aW9uYWwgbWVtb3J5IGlzIGF2YWlsYWJsZSwgdGhpcyB0YWtlcyAobGFzdC1maXJzdCktMQorICAgKiAgY29tcGFyaXNvbnMuICBPdGhlcndpc2UgYW4gTmxvZ04gYWxnb3JpdGhtIGlzIHVzZWQsIHdoZXJlIE4gaXMKKyAgICogIGRpc3RhbmNlKGZpcnN0LGxhc3QpLgorICAgKgorICAgKiAgVGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWZmZWN0cyBvbiBvcmRlcmluZyBhcworICAgKiAgdGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHRoZSBpbml0aWFsIHNvcnQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBpbnBsYWNlX21lcmdlKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbWlkZGxlLAorCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19sYXN0LAorCQkgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgICAgICAgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCSAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgX1ZhbHVlVHlwZSwgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3ByZWQoX19maXJzdCwgX19taWRkbGUsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3ByZWQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19taWRkbGUgfHwgX19taWRkbGUgPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgY29uc3QgX0Rpc3RhbmNlVHlwZSBfX2xlbjEgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZVR5cGUgX19sZW4yID0gc3RkOjpkaXN0YW5jZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgX1RlbXBvcmFyeV9idWZmZXI8X0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgX1ZhbHVlVHlwZT4gX19idWYoX19maXJzdCwKKwkJCQkJCQkJICBfX2xhc3QpOworICAgICAgaWYgKF9fYnVmLmJlZ2luKCkgPT0gMCkKKwlzdGQ6Ol9fbWVyZ2Vfd2l0aG91dF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwgX19sZW4xLAorCQkJCSAgICBfX2xlbjIsIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSk7CisgICAgICBlbHNlCisJc3RkOjpfX21lcmdlX2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fbGVuMSwgX19sZW4yLAorCQkJICAgICAgX19idWYuYmVnaW4oKSwgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpLAorCQkJICAgICAgX19DaGVja2VkQ29tcGFyZShfX2NvbXApKTsKKyAgICB9CisKKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIF9fbWVyZ2Vfc29ydF9sb29wIHJvdXRpbmVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tb3ZlX21lcmdlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QyKTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0MSk7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRTMoX19maXJzdDIsIF9fbGFzdDIsCisJCQkgICAgX0dMSUJDWFhfTU9WRTMoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCSAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgX19tZXJnZV9zb3J0X2xvb3Agcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgX19tb3ZlX21lcmdlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoX19jb21wKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QyKTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0MSk7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRTMoX19maXJzdDIsIF9fbGFzdDIsCisJCQkgICAgX0dMSUJDWFhfTU9WRTMoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCSAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3NvcnRfbG9vcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IxIF9fZmlyc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19sYXN0LAorCQkgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyIF9fcmVzdWx0LAorCQkgICAgICBfRGlzdGFuY2UgX19zdGVwX3NpemUpCisgICAgeworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fdHdvX3N0ZXAgPSAyICogX19zdGVwX3NpemU7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID49IF9fdHdvX3N0ZXApCisJeworCSAgX19yZXN1bHQgPSBzdGQ6Ol9fbW92ZV9tZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQkJICAgICAgIF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwKKwkJCQkgICAgICAgX19maXJzdCArIF9fdHdvX3N0ZXAsIF9fcmVzdWx0KTsKKwkgIF9fZmlyc3QgKz0gX190d29fc3RlcDsKKwl9CisKKyAgICAgIF9fc3RlcF9zaXplID0gc3RkOjptaW4oX0Rpc3RhbmNlKF9fbGFzdCAtIF9fZmlyc3QpLCBfX3N0ZXBfc2l6ZSk7CisgICAgICBzdGQ6Ol9fbW92ZV9tZXJnZShfX2ZpcnN0LCBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQlfX2ZpcnN0ICsgX19zdGVwX3NpemUsIF9fbGFzdCwgX19yZXN1bHQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IxLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbWVyZ2Vfc29ydF9sb29wKF9SYW5kb21BY2Nlc3NJdGVyYXRvcjEgX19maXJzdCwKKwkJICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yMSBfX2xhc3QsCisJCSAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcjIgX19yZXN1bHQsIF9EaXN0YW5jZSBfX3N0ZXBfc2l6ZSwKKwkJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX3R3b19zdGVwID0gMiAqIF9fc3RlcF9zaXplOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX3R3b19zdGVwKQorCXsKKwkgIF9fcmVzdWx0ID0gc3RkOjpfX21vdmVfbWVyZ2UoX19maXJzdCwgX19maXJzdCArIF9fc3RlcF9zaXplLAorCQkJCSAgICAgICBfX2ZpcnN0ICsgX19zdGVwX3NpemUsCisJCQkJICAgICAgIF9fZmlyc3QgKyBfX3R3b19zdGVwLAorCQkJCSAgICAgICBfX3Jlc3VsdCwgX19jb21wKTsKKwkgIF9fZmlyc3QgKz0gX190d29fc3RlcDsKKwl9CisgICAgICBfX3N0ZXBfc2l6ZSA9IHN0ZDo6bWluKF9EaXN0YW5jZShfX2xhc3QgLSBfX2ZpcnN0KSwgX19zdGVwX3NpemUpOworCisgICAgICBzdGQ6Ol9fbW92ZV9tZXJnZShfX2ZpcnN0LF9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwKKwkJCV9fZmlyc3QgKyBfX3N0ZXBfc2l6ZSwgX19sYXN0LCBfX3Jlc3VsdCwgX19jb21wKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgdm9pZAorICAgIF9fY2h1bmtfaW5zZXJ0aW9uX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkJICAgX0Rpc3RhbmNlIF9fY2h1bmtfc2l6ZSkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2NodW5rX3NpemUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUpOworCSAgX19maXJzdCArPSBfX2NodW5rX3NpemU7CisJfQorICAgICAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2NodW5rX2luc2VydGlvbl9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9EaXN0YW5jZSBfX2NodW5rX3NpemUsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+PSBfX2NodW5rX3NpemUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fZmlyc3QgKyBfX2NodW5rX3NpemUsIF9fY29tcCk7CisJICBfX2ZpcnN0ICs9IF9fY2h1bmtfc2l6ZTsKKwl9CisgICAgICBzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworICAgIH0KKworICBlbnVtIHsgX1NfY2h1bmtfc2l6ZSA9IDcgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Qb2ludGVyPgorICAgIHZvaWQKKyAgICBfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZTsKKworICAgICAgY29uc3QgX0Rpc3RhbmNlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIGNvbnN0IF9Qb2ludGVyIF9fYnVmZmVyX2xhc3QgPSBfX2J1ZmZlciArIF9fbGVuOworCisgICAgICBfRGlzdGFuY2UgX19zdGVwX3NpemUgPSBfU19jaHVua19zaXplOworICAgICAgc3RkOjpfX2NodW5rX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19zdGVwX3NpemUpOworCisgICAgICB3aGlsZSAoX19zdGVwX3NpemUgPCBfX2xlbikKKwl7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwgX19idWZmZXIsIF9fc3RlcF9zaXplKTsKKwkgIF9fc3RlcF9zaXplICo9IDI7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fYnVmZmVyLCBfX2J1ZmZlcl9sYXN0LCBfX2ZpcnN0LCBfX3N0ZXBfc2l6ZSk7CisJICBfX3N0ZXBfc2l6ZSAqPSAyOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUG9pbnRlciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9fbWVyZ2Vfc29ydF93aXRoX2J1ZmZlcihfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1BvaW50ZXIgX19idWZmZXIsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2U7CisKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBjb25zdCBfUG9pbnRlciBfX2J1ZmZlcl9sYXN0ID0gX19idWZmZXIgKyBfX2xlbjsKKworICAgICAgX0Rpc3RhbmNlIF9fc3RlcF9zaXplID0gX1NfY2h1bmtfc2l6ZTsKKyAgICAgIHN0ZDo6X19jaHVua19pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsIF9fc3RlcF9zaXplLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19zdGVwX3NpemUgPCBfX2xlbikKKwl7CisJICBzdGQ6Ol9fbWVyZ2Vfc29ydF9sb29wKF9fZmlyc3QsIF9fbGFzdCwgX19idWZmZXIsCisJCQkJIF9fc3RlcF9zaXplLCBfX2NvbXApOworCSAgX19zdGVwX3NpemUgKj0gMjsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X2xvb3AoX19idWZmZXIsIF9fYnVmZmVyX2xhc3QsIF9fZmlyc3QsCisJCQkJIF9fc3RlcF9zaXplLCBfX2NvbXApOworCSAgX19zdGVwX3NpemUgKj0gMjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1BvaW50ZXIsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIHZvaWQKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKKyAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3QgKyBfX2xlbjsKKyAgICAgIGlmIChfX2xlbiA+IF9fYnVmZmVyX3NpemUpCisJeworCSAgc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLAorCQkJCSAgICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwkgIHN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RkOjpfX21lcmdlX3NvcnRfd2l0aF9idWZmZXIoX19maXJzdCwgX19taWRkbGUsIF9fYnVmZmVyKTsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyKTsKKwl9CisgICAgICBzdGQ6Ol9fbWVyZ2VfYWRhcHRpdmUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCwKKwkJCSAgICBfRGlzdGFuY2UoX19taWRkbGUgLSBfX2ZpcnN0KSwKKwkJCSAgICBfRGlzdGFuY2UoX19sYXN0IC0gX19taWRkbGUpLAorCQkJICAgIF9fYnVmZmVyLCBfX2J1ZmZlcl9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUG9pbnRlciwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2UsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Qb2ludGVyIF9fYnVmZmVyLCBfRGlzdGFuY2UgX19idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX19sZW4gPSAoX19sYXN0IC0gX19maXJzdCArIDEpIC8gMjsKKyAgICAgIGNvbnN0IF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3QgKyBfX2xlbjsKKyAgICAgIGlmIChfX2xlbiA+IF9fYnVmZmVyX3NpemUpCisJeworCSAgc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwKKwkJCQkgICAgICBfX2J1ZmZlcl9zaXplLCBfX2NvbXApOworCSAgc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLAorCQkJCSAgICAgIF9fYnVmZmVyX3NpemUsIF9fY29tcCk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2J1ZmZlciwgX19jb21wKTsKKwkgIHN0ZDo6X19tZXJnZV9zb3J0X3dpdGhfYnVmZmVyKF9fbWlkZGxlLCBfX2xhc3QsIF9fYnVmZmVyLCBfX2NvbXApOworCX0KKyAgICAgIHN0ZDo6X19tZXJnZV9hZGFwdGl2ZShfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorCQkJICAgIF9EaXN0YW5jZShfX21pZGRsZSAtIF9fZmlyc3QpLAorCQkJICAgIF9EaXN0YW5jZShfX2xhc3QgLSBfX21pZGRsZSksCisJCQkgICAgX19idWZmZXIsIF9fYnVmZmVyX3NpemUsCisJCQkgICAgX19jb21wKTsKKyAgICB9CisKKyAgLy8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSBzdGFibGUgc29ydGluZyByb3V0aW5lcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPCAxNSkKKwl7CisJICBzdGQ6Ol9faW5zZXJ0aW9uX3NvcnQoX19maXJzdCwgX19sYXN0KTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fbWlkZGxlLCBfX2xhc3QpOworICAgICAgc3RkOjpfX21lcmdlX3dpdGhvdXRfYnVmZmVyKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsCisJCQkJICBfX21pZGRsZSAtIF9fZmlyc3QsCisJCQkJICBfX2xhc3QgLSBfX21pZGRsZSk7CisgICAgfQorCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgc3RhYmxlIHNvcnRpbmcgcm91dGluZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIF9faW5wbGFjZV9zdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGlmIChfX2xhc3QgLSBfX2ZpcnN0IDwgMTUpCisJeworCSAgc3RkOjpfX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKwkgIHJldHVybjsKKwl9CisgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUgPSBfX2ZpcnN0ICsgKF9fbGFzdCAtIF9fZmlyc3QpIC8gMjsKKyAgICAgIHN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2NvbXApOworICAgICAgc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19taWRkbGUsIF9fbGFzdCwgX19jb21wKTsKKyAgICAgIHN0ZDo6X19tZXJnZV93aXRob3V0X2J1ZmZlcihfX2ZpcnN0LCBfX21pZGRsZSwgX19sYXN0LAorCQkJCSAgX19taWRkbGUgLSBfX2ZpcnN0LAorCQkJCSAgX19sYXN0IC0gX19taWRkbGUsCisJCQkJICBfX2NvbXApOworICAgIH0KKworICAvLyBzdGFibGVfc29ydAorCisgIC8vIFNldCBhbGdvcml0aG1zOiBpbmNsdWRlcywgc2V0X3VuaW9uLCBzZXRfaW50ZXJzZWN0aW9uLCBzZXRfZGlmZmVyZW5jZSwKKyAgLy8gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLiAgQWxsIG9mIHRoZXNlIGFsZ29yaXRobXMgaGF2ZSB0aGUgcHJlY29uZGl0aW9uCisgIC8vIHRoYXQgdGhlaXIgaW5wdXQgcmFuZ2VzIGFyZSBzb3J0ZWQgYW5kIHRoZSBwb3N0Y29uZGl0aW9uIHRoYXQgdGhlaXIgb3V0cHV0CisgIC8vIHJhbmdlcyBhcmUgc29ydGVkLgorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBleGlzdHMgaW4gYSByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QxICBTdGFydCBvZiBzZWFyY2ggcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIHNlYXJjaCByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBzZXF1ZW5jZQorICAgKiAgQHBhcmFtICBsYXN0MiAgIEVuZCBvZiBzZXF1ZW5jZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZWFjaCBlbGVtZW50IGluIFtmaXJzdDIsbGFzdDIpIGlzIGNvbnRhaW5lZCBpbiBvcmRlcgorICAgKiAgd2l0aGluIFtmaXJzdDEsbGFzdDEpLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGV4cGVjdHMgYm90aCBbZmlyc3QxLGxhc3QxKSBhbmQgW2ZpcnN0MixsYXN0MikgdG8gYmUKKyAgICogIHNvcnRlZC4gIFNlYXJjaGVzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZWFjaCBlbGVtZW50IGluIFtmaXJzdDIsbGFzdDIpCisgICAqICB3aXRoaW4gW2ZpcnN0MSxsYXN0MSkuICBUaGUgaXRlcmF0b3JzIG92ZXIgZWFjaCByYW5nZSBvbmx5IG1vdmUgZm9yd2FyZCwKKyAgICogIHNvIHRoaXMgaXMgYSBsaW5lYXIgYWxnb3JpdGhtLiAgSWYgYW4gZWxlbWVudCBpbiBbZmlyc3QyLGxhc3QyKSBpcyBub3QKKyAgICogIGZvdW5kIGJlZm9yZSB0aGUgc2VhcmNoIGl0ZXJhdG9yIHJlYWNoZXMgQGEgbGFzdDIsIGZhbHNlIGlzIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBib29sCisgICAgaW5jbHVkZXMoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgIHJldHVybiBmYWxzZTsKKwllbHNlIGlmKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgICsrX19maXJzdDE7CisJZWxzZQorCSAgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MjsKKworICAgICAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIERldGVybWluZXMgd2hldGhlciBhbGwgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSBleGlzdHMgaW4gYSByYW5nZQorICAgKiAgdXNpbmcgY29tcGFyaXNvbi4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgU3RhcnQgb2Ygc2VhcmNoIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEVuZCBvZiBzZWFyY2ggcmFuZ2UuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgU3RhcnQgb2Ygc2VxdWVuY2UKKyAgICogIEBwYXJhbSAgbGFzdDIgICBFbmQgb2Ygc2VxdWVuY2UuCisgICAqICBAcGFyYW0gIGNvbXAgICAgQ29tcGFyaXNvbiBmdW5jdGlvbiB0byB1c2UuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIGVhY2ggZWxlbWVudCBpbiBbZmlyc3QyLGxhc3QyKSBpcyBjb250YWluZWQgaW4gb3JkZXIKKyAgICogIHdpdGhpbiBbZmlyc3QxLGxhc3QxKSBhY2NvcmRpbmcgdG8gY29tcC4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBleHBlY3RzIGJvdGggW2ZpcnN0MSxsYXN0MSkgYW5kIFtmaXJzdDIsbGFzdDIpIHRvIGJlCisgICAqICBzb3J0ZWQuICBTZWFyY2hlcyBmb3IgdGhlIHByZXNlbmNlIG9mIGVhY2ggZWxlbWVudCBpbiBbZmlyc3QyLGxhc3QyKQorICAgKiAgd2l0aGluIFtmaXJzdDEsbGFzdDEpLCB1c2luZyBjb21wIHRvIGRlY2lkZS4gIFRoZSBpdGVyYXRvcnMgb3ZlciBlYWNoCisgICAqICByYW5nZSBvbmx5IG1vdmUgZm9yd2FyZCwgc28gdGhpcyBpcyBhIGxpbmVhciBhbGdvcml0aG0uICBJZiBhbiBlbGVtZW50CisgICAqICBpbiBbZmlyc3QyLGxhc3QyKSBpcyBub3QgZm91bmQgYmVmb3JlIHRoZSBzZWFyY2ggaXRlcmF0b3IgcmVhY2hlcyBAYQorICAgKiAgbGFzdDIsIGZhbHNlIGlzIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgaW5jbHVkZXMoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCQkJCSAgX1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCWlmIChfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgcmV0dXJuIGZhbHNlOworCWVsc2UgaWYoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICsrX19maXJzdDE7CisJZWxzZQorCSAgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MjsKKworICAgICAgcmV0dXJuIF9fZmlyc3QyID09IF9fbGFzdDI7CisgICAgfQorCisgIC8vIG50aF9lbGVtZW50CisgIC8vIG1lcmdlCisgIC8vIHNldF9kaWZmZXJlbmNlCisgIC8vIHNldF9pbnRlcnNlY3Rpb24KKyAgLy8gc2V0X3VuaW9uCisgIC8vIHN0YWJsZV9zb3J0CisgIC8vIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZQorICAvLyBtaW5fZWxlbWVudAorICAvLyBtYXhfZWxlbWVudAorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIG5leHQgQGEgZGljdGlvbmFyeSBvcmRlcmluZy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBGYWxzZSBpZiB3cmFwcGVkIHRvIGZpcnN0IHBlcm11dGF0aW9uLCB0cnVlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFRyZWF0cyBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSByYW5nZSBhcyBhIHNldCBvZiBAYSBkaWN0aW9uYXJ5IHNvcnRlZAorICAgKiAgc2VxdWVuY2VzLiAgUGVybXV0ZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgaW50byB0aGUgbmV4dCBvbmUgb2YgdGhpcyBzZXQuCisgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgc2VxdWVuY2VzIHRvIGdlbmVyYXRlLiAgSWYgdGhlIHNlcXVlbmNlCisgICAqICBpcyB0aGUgbGFyZ2VzdCBvZiB0aGUgc2V0LCB0aGUgc21hbGxlc3QgaXMgZ2VuZXJhdGVkIGFuZCBmYWxzZSByZXR1cm5lZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICBib29sCisgICAgbmV4dF9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICArK19faTsKKyAgICAgIGlmIChfX2kgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9faSA9IF9fbGFzdDsKKyAgICAgIC0tX19pOworCisgICAgICBmb3IoOzspCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2lpID0gX19pOworCSAgLS1fX2k7CisJICBpZiAoKl9faSA8ICpfX2lpKQorCSAgICB7CisJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ogPSBfX2xhc3Q7CisJICAgICAgd2hpbGUgKCEoKl9faSA8ICotLV9faikpCisJCXt9CisJICAgICAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2opOworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2lpLCBfX2xhc3QpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBpZiAoX19pID09IF9fZmlyc3QpCisJICAgIHsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIG5leHQgQGEgZGljdGlvbmFyeSBvcmRlcmluZyB1c2luZworICAgKiAgICAgICAgICBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBjb21wICAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBGYWxzZSBpZiB3cmFwcGVkIHRvIGZpcnN0IHBlcm11dGF0aW9uLCB0cnVlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFRyZWF0cyBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgYXMgYSBzZXQgb2YKKyAgICogIEBhIGRpY3Rpb25hcnkgc29ydGVkIHNlcXVlbmNlcyBvcmRlcmVkIGJ5IEBhIGNvbXAuICBQZXJtdXRlcyB0aGUgY3VycmVudAorICAgKiAgc2VxdWVuY2UgaW50byB0aGUgbmV4dCBvbmUgb2YgdGhpcyBzZXQuICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUKKyAgICogIHNlcXVlbmNlcyB0byBnZW5lcmF0ZS4gIElmIHRoZSBzZXF1ZW5jZSBpcyB0aGUgbGFyZ2VzdCBvZiB0aGUgc2V0LCB0aGUKKyAgICogIHNtYWxsZXN0IGlzIGdlbmVyYXRlZCBhbmQgZmFsc2UgcmV0dXJuZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBuZXh0X3Blcm11dGF0aW9uKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19maXJzdCwKKwkJICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICArK19faTsKKyAgICAgIGlmIChfX2kgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9faSA9IF9fbGFzdDsKKyAgICAgIC0tX19pOworCisgICAgICBmb3IoOzspCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2lpID0gX19pOworCSAgLS1fX2k7CisJICBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ksICpfX2lpKSkKKwkgICAgeworCSAgICAgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19qID0gX19sYXN0OworCSAgICAgIHdoaWxlICghYm9vbChfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9faSwgKi0tX19qKSkpCisJCXt9CisJICAgICAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2opOworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2lpLCBfX2xhc3QpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBpZiAoX19pID09IF9fZmlyc3QpCisJICAgIHsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIHByZXZpb3VzIEBhIGRpY3Rpb25hcnkgb3JkZXJpbmcuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHJldHVybiAgRmFsc2UgaWYgd3JhcHBlZCB0byBsYXN0IHBlcm11dGF0aW9uLCB0cnVlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFRyZWF0cyBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSByYW5nZSBhcyBhIHNldCBvZiBAYSBkaWN0aW9uYXJ5IHNvcnRlZAorICAgKiAgc2VxdWVuY2VzLiAgUGVybXV0ZXMgdGhlIGN1cnJlbnQgc2VxdWVuY2UgaW50byB0aGUgcHJldmlvdXMgb25lIG9mIHRoaXMKKyAgICogIHNldC4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBzZXF1ZW5jZXMgdG8gZ2VuZXJhdGUuICBJZiB0aGUKKyAgICogIHNlcXVlbmNlIGlzIHRoZSBzbWFsbGVzdCBvZiB0aGUgc2V0LCB0aGUgbGFyZ2VzdCBpcyBnZW5lcmF0ZWQgYW5kIGZhbHNlCisgICAqICByZXR1cm5lZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4KKyAgICBib29sCisgICAgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGlyZWN0aW9uYWxJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faSA9IF9fZmlyc3Q7CisgICAgICArK19faTsKKyAgICAgIGlmIChfX2kgPT0gX19sYXN0KQorCXJldHVybiBmYWxzZTsKKyAgICAgIF9faSA9IF9fbGFzdDsKKyAgICAgIC0tX19pOworCisgICAgICBmb3IoOzspCisJeworCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2lpID0gX19pOworCSAgLS1fX2k7CisJICBpZiAoKl9faWkgPCAqX19pKQorCSAgICB7CisJICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2ogPSBfX2xhc3Q7CisJICAgICAgd2hpbGUgKCEoKi0tX19qIDwgKl9faSkpCisJCXt9CisJICAgICAgc3RkOjppdGVyX3N3YXAoX19pLCBfX2opOworCSAgICAgIHN0ZDo6cmV2ZXJzZShfX2lpLCBfX2xhc3QpOworCSAgICAgIHJldHVybiB0cnVlOworCSAgICB9CisJICBpZiAoX19pID09IF9fZmlyc3QpCisJICAgIHsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gZmFsc2U7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJtdXRlIHJhbmdlIGludG8gdGhlIHByZXZpb3VzIEBhIGRpY3Rpb25hcnkgb3JkZXJpbmcgdXNpbmcKKyAgICogICAgICAgICAgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgY29tcCAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgRmFsc2UgaWYgd3JhcHBlZCB0byBsYXN0IHBlcm11dGF0aW9uLCB0cnVlIG90aGVyd2lzZS4KKyAgICoKKyAgICogIFRyZWF0cyBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgYXMgYSBzZXQgb2YKKyAgICogIEBhIGRpY3Rpb25hcnkgc29ydGVkIHNlcXVlbmNlcyBvcmRlcmVkIGJ5IEBhIGNvbXAuICBQZXJtdXRlcyB0aGUgY3VycmVudAorICAgKiAgc2VxdWVuY2UgaW50byB0aGUgcHJldmlvdXMgb25lIG9mIHRoaXMgc2V0LiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZQorICAgKiAgbW9yZSBzZXF1ZW5jZXMgdG8gZ2VuZXJhdGUuICBJZiB0aGUgc2VxdWVuY2UgaXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBzZXQsCisgICAqICB0aGUgbGFyZ2VzdCBpcyBnZW5lcmF0ZWQgYW5kIGZhbHNlIHJldHVybmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBib29sCisgICAgcHJldl9wZXJtdXRhdGlvbihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2xhc3QsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIGZhbHNlOworICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBfX2kgPSBfX2ZpcnN0OworICAgICAgKytfX2k7CisgICAgICBpZiAoX19pID09IF9fbGFzdCkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBfX2kgPSBfX2xhc3Q7CisgICAgICAtLV9faTsKKworICAgICAgZm9yKDs7KQorCXsKKwkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX19paSA9IF9faTsKKwkgIC0tX19pOworCSAgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19paSwgKl9faSkpCisJICAgIHsKKwkgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9faiA9IF9fbGFzdDsKKwkgICAgICB3aGlsZSAoIWJvb2woX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCotLV9faiwgKl9faSkpKQorCQl7fQorCSAgICAgIHN0ZDo6aXRlcl9zd2FwKF9faSwgX19qKTsKKwkgICAgICBzdGQ6OnJldmVyc2UoX19paSwgX19sYXN0KTsKKwkgICAgICByZXR1cm4gdHJ1ZTsKKwkgICAgfQorCSAgaWYgKF9faSA9PSBfX2ZpcnN0KQorCSAgICB7CisJICAgICAgc3RkOjpyZXZlcnNlKF9fZmlyc3QsIF9fbGFzdCk7CisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorICAgIH0KKworICAvLyByZXBsYWNlCisgIC8vIHJlcGxhY2VfaWYKKworICAvKioKKyAgICogIEBicmllZiBDb3B5IGEgc2VxdWVuY2UsIHJlcGxhY2luZyBlYWNoIGVsZW1lbnQgb2Ygb25lIHZhbHVlIHdpdGggYW5vdGhlcgorICAgKiAgICAgICAgIHZhbHVlLgorICAgKiAgQHBhcmFtICBmaXJzdCAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgICAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgICAgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgb2xkX3ZhbHVlICBUaGUgdmFsdWUgdG8gYmUgcmVwbGFjZWQuCisgICAqICBAcGFyYW0gIG5ld192YWx1ZSAgVGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgKiAgQHJldHVybiAgIFRoZSBlbmQgb2YgdGhlIG91dHB1dCBzZXF1ZW5jZSwgQHAgcmVzdWx0KyhsYXN0LWZpcnN0KS4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIGlucHV0IHJhbmdlIEBwIFtmaXJzdCxsYXN0KSB0byB0aGUKKyAgICogIG91dHB1dCByYW5nZSBAcCBbcmVzdWx0LHJlc3VsdCsobGFzdC1maXJzdCkpIHJlcGxhY2luZyBlbGVtZW50cworICAgKiAgZXF1YWwgdG8gQHAgb2xkX3ZhbHVlIHdpdGggQHAgbmV3X3ZhbHVlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmVwbGFjZV9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJIGNvbnN0IF9UcCYgX19vbGRfdmFsdWUsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJaWYgKCpfX2ZpcnN0ID09IF9fb2xkX3ZhbHVlKQorCSAgKl9fcmVzdWx0ID0gX19uZXdfdmFsdWU7CisJZWxzZQorCSAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVwbGFjaW5nIGVhY2ggdmFsdWUgZm9yIHdoaWNoIGEgcHJlZGljYXRlCisgICAqICAgICAgICAgcmV0dXJucyB0cnVlIHdpdGggYW5vdGhlciB2YWx1ZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICAgICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWQgICAgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcGFyYW0gIG5ld192YWx1ZSAgVGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgKiAgQHJldHVybiAgIFRoZSBlbmQgb2YgdGhlIG91dHB1dCBzZXF1ZW5jZSwgQHAgcmVzdWx0KyhsYXN0LWZpcnN0KS4KKyAgICoKKyAgICogIENvcGllcyBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSB0byB0aGUgcmFuZ2UKKyAgICogIEBwIFtyZXN1bHQscmVzdWx0KyhsYXN0LWZpcnN0KSkgcmVwbGFjaW5nIGVsZW1lbnRzIGZvciB3aGljaAorICAgKiAgQHAgcHJlZCByZXR1cm5zIHRydWUgd2l0aCBAcCBuZXdfdmFsdWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsCisJICAgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1RwPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHJlcGxhY2VfY29weV9pZihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsCisJCSAgICBfUHJlZGljYXRlIF9fcHJlZCwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19yZXN1bHQpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICAqX19yZXN1bHQgPSBfX25ld192YWx1ZTsKKwllbHNlCisJICAqX19yZXN1bHQgPSAqX19maXJzdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIGFyZSBzb3J0ZWQuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB0aGUgZWxlbWVudHMgYXJlIHNvcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgaXNfc29ydGVkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeyByZXR1cm4gc3RkOjppc19zb3J0ZWRfdW50aWwoX19maXJzdCwgX19sYXN0KSA9PSBfX2xhc3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIGFyZSBzb3J0ZWQKKyAgICogICAgICAgICAgYWNjb3JkaW5nIHRvIGEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgdGhlIGVsZW1lbnRzIGFyZSBzb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBpc19zb3J0ZWQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeyByZXR1cm4gc3RkOjppc19zb3J0ZWRfdW50aWwoX19maXJzdCwgX19sYXN0LCBfX2NvbXApID09IF9fbGFzdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHRoZSBlbmQgb2YgYSBzb3J0ZWQgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGxhc3QgaXRlcmF0b3IgaSBpbiBbZmlyc3QsIGxhc3QpCisgICAqICAgICAgICAgICBmb3Igd2hpY2ggdGhlIHJhbmdlIFtmaXJzdCwgaSkgaXMgc29ydGVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBpc19zb3J0ZWRfdW50aWwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKwlpZiAoKl9fbmV4dCA8ICpfX2ZpcnN0KQorCSAgcmV0dXJuIF9fbmV4dDsKKyAgICAgIHJldHVybiBfX25leHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHRoZSBlbmQgb2YgYSBzb3J0ZWQgc2VxdWVuY2UgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBsYXN0IGl0ZXJhdG9yIGkgaW4gW2ZpcnN0LCBsYXN0KQorICAgKiAgICAgICAgICAgZm9yIHdoaWNoIHRoZSByYW5nZSBbZmlyc3QsIGkpIGlzIHNvcnRlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIGlzX3NvcnRlZF91bnRpbChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fbGFzdDsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgZm9yICgrK19fbmV4dDsgX19uZXh0ICE9IF9fbGFzdDsgX19maXJzdCA9IF9fbmV4dCwgKytfX25leHQpCisJaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19uZXh0LCAqX19maXJzdCkpCisJICByZXR1cm4gX19uZXh0OworICAgICAgcmV0dXJuIF9fbmV4dDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERldGVybWluZXMgbWluIGFuZCBtYXggYXQgb25jZSBhcyBhbiBvcmRlcmVkIHBhaXIuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gIEEgcGFpcihiLCBhKSBpZiBiIGlzIHNtYWxsZXIgdGhhbiBhLCBwYWlyKGEsIGIpIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+CisgICAgbWlubWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9UcD4pCisKKyAgICAgIHJldHVybiBfX2IgPCBfX2EgPyBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+KF9fYiwgX19hKQorCSAgICAgICAgICAgICAgIDogcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2EsIF9fYik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIG1pbiBhbmQgbWF4IGF0IG9uY2UgYXMgYW4gb3JkZXJlZCBwYWlyLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGEgIEEgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIGIgIEFub3RoZXIgdGhpbmcgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcGFyYW0gIGNvbXAgIEEgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9yIGNvbXBhcmlzb24gZnVuY3RvckBlbmRsaW5rLgorICAgKiAgQHJldHVybiAgQSBwYWlyKGIsIGEpIGlmIGIgaXMgc21hbGxlciB0aGFuIGEsIHBhaXIoYSwgYikgb3RoZXJ3aXNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+CisgICAgbWlubWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYiwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHJldHVybiBfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoX19iLCBfX2EpCisgICAgICAgICAgPyBwYWlyPGNvbnN0IF9UcCYsIGNvbnN0IF9UcCY+KF9fYiwgX19hKQorICAgICAgICAgIDogcGFpcjxjb25zdCBfVHAmLCBjb25zdCBfVHAmPihfX2EsIF9fYik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYSBwYWlyIG9mIGl0ZXJhdG9ycyBwb2ludGluZyB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorICAgKiAgICAgICAgICBlbGVtZW50cyBpbiBhIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIG1ha2VfcGFpcihtLCBNKSwgd2hlcmUgbSBpcyB0aGUgZmlyc3QgaXRlcmF0b3IgaSBpbiAKKyAgICogICAgICAgICAgIFtmaXJzdCwgbGFzdCkgc3VjaCB0aGF0IG5vIG90aGVyIGVsZW1lbnQgaW4gdGhlIHJhbmdlIGlzCisgICAqICAgICAgICAgICBzbWFsbGVyLCBhbmQgd2hlcmUgTSBpcyB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtmaXJzdCwgbGFzdCkKKyAgICogICAgICAgICAgIHN1Y2ggdGhhdCBubyBvdGhlciBlbGVtZW50IGluIHRoZSByYW5nZSBpcyBsYXJnZXIuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgcGFpcjxfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIG1pbm1heF9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QKKwkgIHx8ICsrX19uZXh0ID09IF9fbGFzdCkKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoX19maXJzdCwgX19maXJzdCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taW4sIF9fbWF4OworICAgICAgaWYgKCpfX25leHQgPCAqX19maXJzdCkKKwl7CisJICBfX21pbiA9IF9fbmV4dDsKKwkgIF9fbWF4ID0gX19maXJzdDsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19taW4gPSBfX2ZpcnN0OworCSAgX19tYXggPSBfX25leHQ7CisJfQorCisgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgKytfX2ZpcnN0OworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgX19uZXh0ID0gX19maXJzdDsKKwkgIGlmICgrK19fbmV4dCA9PSBfX2xhc3QpCisJICAgIHsKKwkgICAgICBpZiAoKl9fZmlyc3QgPCAqX19taW4pCisJCV9fbWluID0gX19maXJzdDsKKwkgICAgICBlbHNlIGlmICghKCpfX2ZpcnN0IDwgKl9fbWF4KSkKKwkJX19tYXggPSBfX2ZpcnN0OworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmICgqX19uZXh0IDwgKl9fZmlyc3QpCisJICAgIHsKKwkgICAgICBpZiAoKl9fbmV4dCA8ICpfX21pbikKKwkJX19taW4gPSBfX25leHQ7CisJICAgICAgaWYgKCEoKl9fZmlyc3QgPCAqX19tYXgpKQorCQlfX21heCA9IF9fZmlyc3Q7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmICgqX19maXJzdCA8ICpfX21pbikKKwkJX19taW4gPSBfX2ZpcnN0OworCSAgICAgIGlmICghKCpfX25leHQgPCAqX19tYXgpKQorCQlfX21heCA9IF9fbmV4dDsKKwkgICAgfQorCisJICBfX2ZpcnN0ID0gX19uZXh0OworCSAgKytfX2ZpcnN0OworCX0KKworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fbWluLCBfX21heCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYSBwYWlyIG9mIGl0ZXJhdG9ycyBwb2ludGluZyB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorICAgKiAgICAgICAgICBlbGVtZW50cyBpbiBhIHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgY29tcCAgIENvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIG1ha2VfcGFpcihtLCBNKSwgd2hlcmUgbSBpcyB0aGUgZmlyc3QgaXRlcmF0b3IgaSBpbiAKKyAgICogICAgICAgICAgIFtmaXJzdCwgbGFzdCkgc3VjaCB0aGF0IG5vIG90aGVyIGVsZW1lbnQgaW4gdGhlIHJhbmdlIGlzCisgICAqICAgICAgICAgICBzbWFsbGVyLCBhbmQgd2hlcmUgTSBpcyB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtmaXJzdCwgbGFzdCkKKyAgICogICAgICAgICAgIHN1Y2ggdGhhdCBubyBvdGhlciBlbGVtZW50IGluIHRoZSByYW5nZSBpcyBsYXJnZXIuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHBhaXI8X0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBtaW5tYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdAorCSAgfHwgKytfX25leHQgPT0gX19sYXN0KQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2ZpcnN0LCBfX2ZpcnN0KTsKKworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pbiwgX19tYXg7CisgICAgICBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX25leHQsICpfX2ZpcnN0KSkKKwl7CisJICBfX21pbiA9IF9fbmV4dDsKKwkgIF9fbWF4ID0gX19maXJzdDsKKwl9CisgICAgICBlbHNlCisJeworCSAgX19taW4gPSBfX2ZpcnN0OworCSAgX19tYXggPSBfX25leHQ7CisJfQorCisgICAgICBfX2ZpcnN0ID0gX19uZXh0OworICAgICAgKytfX2ZpcnN0OworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgX19uZXh0ID0gX19maXJzdDsKKwkgIGlmICgrK19fbmV4dCA9PSBfX2xhc3QpCisJICAgIHsKKwkgICAgICBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0LCAqX19taW4pKQorCQlfX21pbiA9IF9fZmlyc3Q7CisJICAgICAgZWxzZSBpZiAoIV9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19maXJzdCwgKl9fbWF4KSkKKwkJX19tYXggPSBfX2ZpcnN0OworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGlmIChfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9fbmV4dCwgKl9fZmlyc3QpKQorCSAgICB7CisJICAgICAgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19uZXh0LCAqX19taW4pKQorCQlfX21pbiA9IF9fbmV4dDsKKwkgICAgICBpZiAoIV9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19maXJzdCwgKl9fbWF4KSkKKwkJX19tYXggPSBfX2ZpcnN0OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0LCAqX19taW4pKQorCQlfX21pbiA9IF9fZmlyc3Q7CisJICAgICAgaWYgKCFfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9fbmV4dCwgKl9fbWF4KSkKKwkJX19tYXggPSBfX25leHQ7CisJICAgIH0KKworCSAgX19maXJzdCA9IF9fbmV4dDsKKwkgICsrX19maXJzdDsKKwl9CisKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX21pbiwgX19tYXgpOworICAgIH0KKworICAvLyBOMjcyMiArIERSIDkxNS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBtaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCkKKyAgICB7IHJldHVybiAqc3RkOjptaW5fZWxlbWVudChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9UcAorICAgIG1pbihpbml0aWFsaXplcl9saXN0PF9UcD4gX19sLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeyByZXR1cm4gKnN0ZDo6bWluX2VsZW1lbnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19jb21wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgbWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wpCisgICAgeyByZXR1cm4gKnN0ZDo6bWF4X2VsZW1lbnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBfVHAKKyAgICBtYXgoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsgcmV0dXJuICpzdGQ6Om1heF9lbGVtZW50KF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fY29tcCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHBhaXI8X1RwLCBfVHA+CisgICAgbWlubWF4KGluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2wpCisgICAgeworICAgICAgcGFpcjxjb25zdCBfVHAqLCBjb25zdCBfVHAqPiBfX3AgPQorCXN0ZDo6bWlubWF4X2VsZW1lbnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKl9fcC5maXJzdCwgKl9fcC5zZWNvbmQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSBwYWlyPF9UcCwgX1RwPgorICAgIG1pbm1heChpbml0aWFsaXplcl9saXN0PF9UcD4gX19sLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgcGFpcjxjb25zdCBfVHAqLCBjb25zdCBfVHAqPiBfX3AgPQorCXN0ZDo6bWlubWF4X2VsZW1lbnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19jb21wKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigqX19wLmZpcnN0LCAqX19wLnNlY29uZCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDaGVja3Mgd2hldGhlciBhIHBlcm11dGFpb24gb2YgdGhlIHNlY29uZCBzZXF1ZW5jZSBpcyBlcXVhbAorICAgKiAgICAgICAgICB0byB0aGUgZmlyc3Qgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcmV0dXJuIHRydWUgaWYgdGhlcmUgZXhpc3RzIGEgcGVybXV0YXRpb24gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZQorICAgKiAgICAgICAgICBbZmlyc3QyLCBmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpKSwgYmVnaW5uaW5nIHdpdGggCisgICAqICAgICAgICAgIEZvcndhcmRJdGVyYXRvcjIgYmVnaW4sIHN1Y2ggdGhhdCBlcXVhbChmaXJzdDEsIGxhc3QxLCBiZWdpbikKKyAgICogICAgICAgICAgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBib29sCisgICAgaXNfcGVybXV0YXRpb24oX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fZmlyc3QyKQorICAgIHsKKyAgICAgIC8vIEVmZmljaWVudGx5IGNvbXBhcmUgaWRlbnRpY2FsIHByZWZpeGVzOiAgTyhOKSBpZiBzZXF1ZW5jZXMKKyAgICAgIC8vIGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlpZiAoISgqX19maXJzdDEgPT0gKl9fZmlyc3QyKSkKKwkgIGJyZWFrOworCisgICAgICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwlyZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gRXN0YWJsaXNoIF9fbGFzdDIgYXNzdW1pbmcgZXF1YWwgcmFuZ2VzIGJ5IGl0ZXJhdGluZyBvdmVyIHRoZQorICAgICAgLy8gcmVzdCBvZiB0aGUgbGlzdC4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIgPSBfX2ZpcnN0MjsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX2xhc3QyLCBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QxLCBfX2xhc3QxKSk7CisgICAgICBmb3IgKF9Gb3J3YXJkSXRlcmF0b3IxIF9fc2NhbiA9IF9fZmlyc3QxOyBfX3NjYW4gIT0gX19sYXN0MTsgKytfX3NjYW4pCisJeworCSAgaWYgKF9fc2NhbiAhPSBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0MSwgX19zY2FuLCAqX19zY2FuKSkKKwkgICAgY29udGludWU7IC8vIFdlJ3ZlIHNlZW4gdGhpcyBvbmUgYmVmb3JlLgorCisJICBhdXRvIF9fbWF0Y2hlcyA9IHN0ZDo6Y291bnQoX19maXJzdDIsIF9fbGFzdDIsICpfX3NjYW4pOworCSAgaWYgKDAgPT0gX19tYXRjaGVzCisJICAgICAgfHwgc3RkOjpjb3VudChfX3NjYW4sIF9fbGFzdDEsICpfX3NjYW4pICE9IF9fbWF0Y2hlcykKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgYSBwZXJtdXRhdGlvbiBvZiB0aGUgc2Vjb25kIHNlcXVlbmNlIGlzIGVxdWFsCisgICAqICAgICAgICAgIHRvIHRoZSBmaXJzdCBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgcHJlZCAgICBBIGJpbmFyeSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuIHRydWUgaWYgdGhlcmUgZXhpc3RzIGEgcGVybXV0YXRpb24gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZQorICAgKiAgICAgICAgICBbZmlyc3QyLCBmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpKSwgYmVnaW5uaW5nIHdpdGggCisgICAqICAgICAgICAgIEZvcndhcmRJdGVyYXRvcjIgYmVnaW4sIHN1Y2ggdGhhdCBlcXVhbChmaXJzdDEsIGxhc3QxLCBiZWdpbiwKKyAgICogICAgICAgICAgcHJlZCkgcmV0dXJucyB0cnVlOyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGJvb2wKKyAgICBpc19wZXJtdXRhdGlvbihfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIC8vIEVmZmljaWVudGx5IGNvbXBhcmUgaWRlbnRpY2FsIHByZWZpeGVzOiAgTyhOKSBpZiBzZXF1ZW5jZXMKKyAgICAgIC8vIGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlpZiAoIWJvb2woX19wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkpCisJICBicmVhazsKKworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEpCisJcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIEVzdGFibGlzaCBfX2xhc3QyIGFzc3VtaW5nIGVxdWFsIHJhbmdlcyBieSBpdGVyYXRpbmcgb3ZlciB0aGUKKyAgICAgIC8vIHJlc3Qgb2YgdGhlIGxpc3QuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2xhc3QyID0gX19maXJzdDI7CisgICAgICBzdGQ6OmFkdmFuY2UoX19sYXN0Miwgc3RkOjpkaXN0YW5jZShfX2ZpcnN0MSwgX19sYXN0MSkpOworICAgICAgZm9yIChfRm9yd2FyZEl0ZXJhdG9yMSBfX3NjYW4gPSBfX2ZpcnN0MTsgX19zY2FuICE9IF9fbGFzdDE7ICsrX19zY2FuKQorCXsKKwkgIHVzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKKworCSAgaWYgKF9fc2NhbiAhPSBfR0xJQkNYWF9TVERfQTo6ZmluZF9pZihfX2ZpcnN0MSwgX19zY2FuLAorCQkJCQkJc3RkOjpiaW5kKF9fcHJlZCwgXzEsICpfX3NjYW4pKSkKKwkgICAgY29udGludWU7IC8vIFdlJ3ZlIHNlZW4gdGhpcyBvbmUgYmVmb3JlLgorCSAgCisJICBhdXRvIF9fbWF0Y2hlcyA9IHN0ZDo6Y291bnRfaWYoX19maXJzdDIsIF9fbGFzdDIsCisJCQkJCSBzdGQ6OmJpbmQoX19wcmVkLCBfMSwgKl9fc2NhbikpOworCSAgaWYgKDAgPT0gX19tYXRjaGVzCisJICAgICAgfHwgc3RkOjpjb3VudF9pZihfX3NjYW4sIF9fbGFzdDEsCisJCQkgICAgICAgc3RkOjpiaW5kKF9fcHJlZCwgXzEsICpfX3NjYW4pKSAhPSBfX21hdGNoZXMpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKyAgLyoqCisgICAqICBAYnJpZWYgU2h1ZmZsZSB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSB1c2luZyBhIHVuaWZvcm0gcmFuZG9tCisgICAqICAgICAgICAgbnVtYmVyIGdlbmVyYXRvci4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBnICAgICAgIEEgVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciAoMjYuNS4xLjMpLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJlb3JkZXJzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIHVzaW5nIEBwIGcgdG8KKyAgICogIHByb3ZpZGUgcmFuZG9tIG51bWJlcnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICB2b2lkCisgICAgc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImJiBfX2cpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8X0Rpc3RhbmNlVHlwZT46OnR5cGUgX191ZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxfX3VkX3R5cGU+IF9fZGlzdHJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kaXN0cl90eXBlOjpwYXJhbV90eXBlIF9fcF90eXBlOworICAgICAgX19kaXN0cl90eXBlIF9fZDsKKworICAgICAgZm9yIChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19pID0gX19maXJzdCArIDE7IF9faSAhPSBfX2xhc3Q7ICsrX19pKQorCXN0ZDo6aXRlcl9zd2FwKF9faSwgX19maXJzdCArIF9fZChfX2csIF9fcF90eXBlKDAsIF9faSAtIF9fZmlyc3QpKSk7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICAvKioKKyAgICogIEBicmllZiBBcHBseSBhIGZ1bmN0aW9uIHRvIGV2ZXJ5IGVsZW1lbnQgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBmICAgICAgQSB1bmFyeSBmdW5jdGlvbiBvYmplY3QuCisgICAqICBAcmV0dXJuICAgQHAgZiAoc3RkOjptb3ZlKEBwIGYpIGluIEMrKzB4KS4KKyAgICoKKyAgICogIEFwcGxpZXMgdGhlIGZ1bmN0aW9uIG9iamVjdCBAcCBmIHRvIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdCxsYXN0KS4gIEBwIGYgbXVzdCBub3QgbW9kaWZ5IHRoZSBvcmRlciBvZiB0aGUgc2VxdWVuY2UuCisgICAqICBJZiBAcCBmIGhhcyBhIHJldHVybiB2YWx1ZSBpdCBpcyBpZ25vcmVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0Z1bmN0aW9uPgorICAgIF9GdW5jdGlvbgorICAgIGZvcl9lYWNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX0Z1bmN0aW9uIF9fZikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCV9fZigqX19maXJzdCk7CisgICAgICByZXR1cm4gX0dMSUJDWFhfTU9WRShfX2YpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgdmFsdWUgaW4gYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICB2YWwgICAgVGhlIHZhbHVlIHRvIGZpbmQuCisgICAqICBAcmV0dXJuICAgVGhlIGZpcnN0IGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KQorICAgKiAgc3VjaCB0aGF0IEBjICppID09IEBwIHZhbCwgb3IgQHAgbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCQl0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICByZXR1cm4gc3RkOjpfX2ZpbmQoX19maXJzdCwgX19sYXN0LCBfX3ZhbCwKKwkJICAgICAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZCB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHNlcXVlbmNlIGZvciB3aGljaCBhCisgICAqICAgICAgICAgcHJlZGljYXRlIGlzIHRydWUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcHJlZCAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkKKyAgICogIHN1Y2ggdGhhdCBAcCBwcmVkKCppKSBpcyB0cnVlLCBvciBAcCBsYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcmV0dXJuIHN0ZDo6X19maW5kX2lmKF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLAorCQkJICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBGaW5kIGVsZW1lbnQgZnJvbSBhIHNldCBpbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBTdGFydCBvZiByYW5nZSB0byBzZWFyY2guCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBtYXRjaCBjYW5kaWRhdGVzLgorICAgKiAgQHBhcmFtICBsYXN0MiAgIEVuZCBvZiBtYXRjaCBjYW5kaWRhdGVzLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MSkgc3VjaCB0aGF0IEBjICppID09IEBwICooaTIpIHN1Y2ggdGhhdCBpMiBpcyBhbgorICAgKiAgaXRlcmF0b3IgaW4gW2ZpcnN0MixsYXN0MiksIG9yIEBwIGxhc3QxIGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtmaXJzdDEsbGFzdDEpIGZvciBhbiBlbGVtZW50IHRoYXQgaXMgZXF1YWwgdG8KKyAgICogIHNvbWUgZWxlbWVudCBpbiB0aGUgcmFuZ2UgW2ZpcnN0MixsYXN0MikuICBJZiBmb3VuZCwgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgKiAgaW4gdGhlIHJhbmdlIFtmaXJzdDEsbGFzdDEpLCBvdGhlcndpc2UgcmV0dXJucyBAcCBsYXN0MS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2ZpcnN0X29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvciBfX2xhc3QxLAorCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxKQorCWZvciAoX0ZvcndhcmRJdGVyYXRvciBfX2l0ZXIgPSBfX2ZpcnN0MjsgX19pdGVyICE9IF9fbGFzdDI7ICsrX19pdGVyKQorCSAgaWYgKCpfX2ZpcnN0MSA9PSAqX19pdGVyKQorCSAgICByZXR1cm4gX19maXJzdDE7CisgICAgICByZXR1cm4gX19sYXN0MTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbmQgZWxlbWVudCBmcm9tIGEgc2V0IGluIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIFN0YXJ0IG9mIHJhbmdlIHRvIHNlYXJjaC4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBFbmQgb2YgcmFuZ2UgdG8gc2VhcmNoLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIG1hdGNoIGNhbmRpZGF0ZXMuCisgICAqICBAcGFyYW0gIGxhc3QyICAgRW5kIG9mIG1hdGNoIGNhbmRpZGF0ZXMuCisgICAqICBAcGFyYW0gIGNvbXAgICAgUHJlZGljYXRlIHRvIHVzZS4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdDEsbGFzdDEpIHN1Y2ggdGhhdCBAYyBjb21wKCppLCBAcCAqKGkyKSkgaXMgdHJ1ZSBhbmQgaTIgaXMgYW4KKyAgICogIGl0ZXJhdG9yIGluIFtmaXJzdDIsbGFzdDIpLCBvciBAcCBsYXN0MSBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKworICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtmaXJzdDEsbGFzdDEpIGZvciBhbiBlbGVtZW50IHRoYXQgaXMKKyAgICogIGVxdWFsIHRvIHNvbWUgZWxlbWVudCBpbiB0aGUgcmFuZ2UgW2ZpcnN0MixsYXN0MikuICBJZiBmb3VuZCwKKyAgICogIHJldHVybnMgYW4gaXRlcmF0b3IgaW4gdGhlIHJhbmdlIFtmaXJzdDEsbGFzdDEpLCBvdGhlcndpc2UKKyAgICogIHJldHVybnMgQHAgbGFzdDEuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0lucHV0SXRlcmF0b3IKKyAgICBmaW5kX2ZpcnN0X29mKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvciBfX2xhc3QxLAorCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0MiwKKwkJICBfQmluYXJ5UHJlZGljYXRlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0JpbmFyeVByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSkKKwlmb3IgKF9Gb3J3YXJkSXRlcmF0b3IgX19pdGVyID0gX19maXJzdDI7IF9faXRlciAhPSBfX2xhc3QyOyArK19faXRlcikKKwkgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19pdGVyKSkKKwkgICAgcmV0dXJuIF9fZmlyc3QxOworICAgICAgcmV0dXJuIF9fbGFzdDE7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbmQgdHdvIGFkamFjZW50IHZhbHVlcyBpbiBhIHNlcXVlbmNlIHRoYXQgYXJlIGVxdWFsLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBzdWNoIHRoYXQgQGMgaSBhbmQgQGMgaSsxIGFyZSBib3RoCisgICAqICB2YWxpZCBpdGVyYXRvcnMgaW4gQHAgW2ZpcnN0LGxhc3QpIGFuZCBzdWNoIHRoYXQgQGMgKmkgPT0gQGMgKihpKzEpLAorICAgKiAgb3IgQHAgbGFzdCBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsaXR5Q29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19sYXN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworICAgICAgd2hpbGUoKytfX25leHQgIT0gX19sYXN0KQorCXsKKwkgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZCB0d28gYWRqYWNlbnQgdmFsdWVzIGluIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGJpbmFyeV9wcmVkICAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIHN1Y2ggdGhhdCBAYyBpIGFuZCBAYyBpKzEgYXJlIGJvdGgKKyAgICogIHZhbGlkIGl0ZXJhdG9ycyBpbiBAcCBbZmlyc3QsbGFzdCkgYW5kIHN1Y2ggdGhhdAorICAgKiAgQHAgYmluYXJ5X3ByZWQoKmksKihpKzEpKSBpcyB0cnVlLCBvciBAcCBsYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IKKyAgICogIGV4aXN0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZmluZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2xhc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSgrK19fbmV4dCAhPSBfX2xhc3QpCisJeworCSAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQorCSAgICByZXR1cm4gX19maXJzdDsKKwkgIF9fZmlyc3QgPSBfX25leHQ7CisJfQorICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgYSB2YWx1ZSBpbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbHVlICBUaGUgdmFsdWUgdG8gYmUgY291bnRlZC4KKyAgICogIEByZXR1cm4gICBUaGUgbnVtYmVyIG9mIGl0ZXJhdG9ycyBAYyBpIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkKKyAgICogIGZvciB3aGljaCBAYyAqaSA9PSBAcCB2YWx1ZQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiA9IDA7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoKl9fZmlyc3QgPT0gX192YWx1ZSkKKwkgICsrX19uOworICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ291bnQgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgZm9yIHdoaWNoIGEgcHJlZGljYXRlIGlzIHRydWUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcHJlZCAgIEEgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBudW1iZXIgb2YgaXRlcmF0b3JzIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KQorICAgKiAgZm9yIHdoaWNoIEBwIHByZWQoKmkpIGlzIHRydWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGNvdW50X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9VbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1ByZWRpY2F0ZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAwOworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICArK19fbjsKKyAgICAgIHJldHVybiBfX247CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNlYXJjaCBhIHNlcXVlbmNlIGZvciBhIG1hdGNoaW5nIHN1Yi1zZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QyICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MS0obGFzdDItZmlyc3QyKSkgc3VjaCB0aGF0IEBjICooaStOKSA9PSBAcCAqKGZpcnN0MitOKQorICAgKiAgZm9yIGVhY2ggQGMgTiBpbiB0aGUgcmFuZ2UgQHAgWzAsbGFzdDItZmlyc3QyKSwgb3IgQHAgbGFzdDEgaWYgbm8KKyAgICogIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtmaXJzdDEsbGFzdDEpIGZvciBhIHN1Yi1zZXF1ZW5jZSB0aGF0IGNvbXBhcmVzCisgICAqICBlcXVhbCB2YWx1ZS1ieS12YWx1ZSB3aXRoIHRoZSBzZXF1ZW5jZSBnaXZlbiBieSBAcCBbZmlyc3QyLGxhc3QyKSBhbmQKKyAgICogIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN1Yi1zZXF1ZW5jZSwgb3IKKyAgICogIEBwIGxhc3QxIGlmIHRoZSBzdWItc2VxdWVuY2UgaXMgbm90IGZvdW5kLgorICAgKgorICAgKiAgQmVjYXVzZSB0aGUgc3ViLXNlcXVlbmNlIG11c3QgbGllIGNvbXBsZXRlbHkgd2l0aGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MSkgaXQgbXVzdCBzdGFydCBhdCBhIHBvc2l0aW9uIGxlc3MgdGhhbgorICAgKiAgQHAgbGFzdDEtKGxhc3QyLWZpcnN0Mikgd2hlcmUgQHAgbGFzdDItZmlyc3QyIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgICAqICBzdWItc2VxdWVuY2UuCisgICAqICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIEBjIGkgd2lsbCBiZSBpbiB0aGUgcmFuZ2UKKyAgICogIEBwIFtmaXJzdDEsbGFzdDEtKGxhc3QyLWZpcnN0MikpCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yMQorICAgIHNlYXJjaChfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyYXRvcjIgX19sYXN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsT3BDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDIsIF9fbGFzdDIpOworCisgICAgICAvLyBUZXN0IGZvciBlbXB0eSByYW5nZXMKKyAgICAgIGlmIChfX2ZpcnN0MSA9PSBfX2xhc3QxIHx8IF9fZmlyc3QyID09IF9fbGFzdDIpCisJcmV0dXJuIF9fZmlyc3QxOworCisgICAgICAvLyBUZXN0IGZvciBhIHBhdHRlcm4gb2YgbGVuZ3RoIDEuCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yMiBfX3AxKF9fZmlyc3QyKTsKKyAgICAgIGlmICgrK19fcDEgPT0gX19sYXN0MikKKwlyZXR1cm4gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CisKKyAgICAgIC8vIEdlbmVyYWwgY2FzZS4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fcDsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IxIF9fY3VycmVudCA9IF9fZmlyc3QxOworCisgICAgICBmb3IgKDs7KQorCXsKKwkgIF9fZmlyc3QxID0gX0dMSUJDWFhfU1REX0E6OmZpbmQoX19maXJzdDEsIF9fbGFzdDEsICpfX2ZpcnN0Mik7CisJICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwkgICAgcmV0dXJuIF9fbGFzdDE7CisKKwkgIF9fcCA9IF9fcDE7CisJICBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKKwkgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQorCSAgICByZXR1cm4gX19sYXN0MTsKKworCSAgd2hpbGUgKCpfX2N1cnJlbnQgPT0gKl9fcCkKKwkgICAgeworCSAgICAgIGlmICgrK19fcCA9PSBfX2xhc3QyKQorCQlyZXR1cm4gX19maXJzdDE7CisJICAgICAgaWYgKCsrX19jdXJyZW50ID09IF9fbGFzdDEpCisJCXJldHVybiBfX2xhc3QxOworCSAgICB9CisJICArK19fZmlyc3QxOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0MTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU2VhcmNoIGEgc2VxdWVuY2UgZm9yIGEgbWF0Y2hpbmcgc3ViLXNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QxICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdDIgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdDIgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWRpY2F0ZSAgQSBiaW5hcnkgcHJlZGljYXRlLgorICAgKiAgQHJldHVybiAgIFRoZSBmaXJzdCBpdGVyYXRvciBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0MSxsYXN0MS0obGFzdDItZmlyc3QyKSkgc3VjaCB0aGF0CisgICAqICBAcCBwcmVkaWNhdGUoKihpK04pLCooZmlyc3QyK04pKSBpcyB0cnVlIGZvciBlYWNoIEBjIE4gaW4gdGhlIHJhbmdlCisgICAqICBAcCBbMCxsYXN0Mi1maXJzdDIpLCBvciBAcCBsYXN0MSBpZiBubyBzdWNoIGl0ZXJhdG9yIGV4aXN0cy4KKyAgICoKKyAgICogIFNlYXJjaGVzIHRoZSByYW5nZSBAcCBbZmlyc3QxLGxhc3QxKSBmb3IgYSBzdWItc2VxdWVuY2UgdGhhdCBjb21wYXJlcworICAgKiAgZXF1YWwgdmFsdWUtYnktdmFsdWUgd2l0aCB0aGUgc2VxdWVuY2UgZ2l2ZW4gYnkgQHAgW2ZpcnN0MixsYXN0MiksCisgICAqICB1c2luZyBAcCBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5LCBhbmQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgKiAgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHN1Yi1zZXF1ZW5jZSwgb3IgQHAgbGFzdDEgaWYgbm8gc3VjaAorICAgKiAgaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgQHNlZSBzZWFyY2goX0ZvcndhcmRJdGVyMSwgX0ZvcndhcmRJdGVyMSwgX0ZvcndhcmRJdGVyMiwgX0ZvcndhcmRJdGVyMikKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjEsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgX0ZvcndhcmRJdGVyYXRvcjEKKyAgICBzZWFyY2goX0ZvcndhcmRJdGVyYXRvcjEgX19maXJzdDEsIF9Gb3J3YXJkSXRlcmF0b3IxIF9fbGFzdDEsCisJICAgX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIsIF9Gb3J3YXJkSXRlcmF0b3IyIF9fbGFzdDIsCisJICAgX0JpbmFyeVByZWRpY2F0ZSAgX19wcmVkaWNhdGUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9CaW5hcnlQcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIC8vIFRlc3QgZm9yIGVtcHR5IHJhbmdlcworICAgICAgaWYgKF9fZmlyc3QxID09IF9fbGFzdDEgfHwgX19maXJzdDIgPT0gX19sYXN0MikKKwlyZXR1cm4gX19maXJzdDE7CisKKyAgICAgIC8vIFRlc3QgZm9yIGEgcGF0dGVybiBvZiBsZW5ndGggMS4KKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IyIF9fcDEoX19maXJzdDIpOworICAgICAgaWYgKCsrX19wMSA9PSBfX2xhc3QyKQorCXsKKwkgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxCisJCSAmJiAhYm9vbChfX3ByZWRpY2F0ZSgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorCSAgICArK19fZmlyc3QxOworCSAgcmV0dXJuIF9fZmlyc3QxOworCX0KKworICAgICAgLy8gR2VuZXJhbCBjYXNlLgorICAgICAgX0ZvcndhcmRJdGVyYXRvcjIgX19wOworICAgICAgX0ZvcndhcmRJdGVyYXRvcjEgX19jdXJyZW50ID0gX19maXJzdDE7CisKKyAgICAgIGZvciAoOzspCisJeworCSAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEKKwkJICYmICFib29sKF9fcHJlZGljYXRlKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkpCisJICAgICsrX19maXJzdDE7CisJICBpZiAoX19maXJzdDEgPT0gX19sYXN0MSkKKwkgICAgcmV0dXJuIF9fbGFzdDE7CisKKwkgIF9fcCA9IF9fcDE7CisJICBfX2N1cnJlbnQgPSBfX2ZpcnN0MTsKKwkgIGlmICgrK19fY3VycmVudCA9PSBfX2xhc3QxKQorCSAgICByZXR1cm4gX19sYXN0MTsKKworCSAgd2hpbGUgKF9fcHJlZGljYXRlKCpfX2N1cnJlbnQsICpfX3ApKQorCSAgICB7CisJICAgICAgaWYgKCsrX19wID09IF9fbGFzdDIpCisJCXJldHVybiBfX2ZpcnN0MTsKKwkgICAgICBpZiAoKytfX2N1cnJlbnQgPT0gX19sYXN0MSkKKwkJcmV0dXJuIF9fbGFzdDE7CisJICAgIH0KKwkgICsrX19maXJzdDE7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3QxOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFNlYXJjaCBhIHNlcXVlbmNlIGZvciBhIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBjb3VudCAgVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMuCisgICAqICBAcGFyYW0gIHZhbCAgICBUaGUgdmFsdWUgdG8gZmluZC4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QtY291bnQpCisgICAqICBzdWNoIHRoYXQgQGMgKihpK04pID09IEBwIHZhbCBmb3IgZWFjaCBAYyBOIGluIHRoZSByYW5nZSBAcCBbMCxjb3VudCksCisgICAqICBvciBAcCBsYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBmb3IgQHAgY291bnQgY29uc2VjdXRpdmUgZWxlbWVudHMKKyAgICogIGVxdWFsIHRvIEBwIHZhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLCBfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2NvdW50IDw9IDApCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBpZiAoX19jb3VudCA9PSAxKQorCXJldHVybiBfR0xJQkNYWF9TVERfQTo6ZmluZChfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsKTsKKyAgICAgIHJldHVybiBzdGQ6Ol9fc2VhcmNoX24oX19maXJzdCwgX19sYXN0LCBfX2NvdW50LCBfX3ZhbCwKKwkJCSAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBTZWFyY2ggYSBzZXF1ZW5jZSBmb3IgYSBudW1iZXIgb2YgY29uc2VjdXRpdmUgdmFsdWVzIHVzaW5nIGEKKyAgICogICAgICAgICBwcmVkaWNhdGUuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgICAgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBjb3VudCAgICAgICAgVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2YWx1ZXMuCisgICAqICBAcGFyYW0gIHZhbCAgICAgICAgICBUaGUgdmFsdWUgdG8gZmluZC4KKyAgICogIEBwYXJhbSAgYmluYXJ5X3ByZWQgIEEgYmluYXJ5IHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBUaGUgZmlyc3QgaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QtY291bnQpCisgICAqICBzdWNoIHRoYXQgQHAgYmluYXJ5X3ByZWQoKihpK04pLHZhbCkgaXMgdHJ1ZSBmb3IgZWFjaCBAYyBOIGluIHRoZQorICAgKiAgcmFuZ2UgQHAgWzAsY291bnQpLCBvciBAcCBsYXN0IGlmIG5vIHN1Y2ggaXRlcmF0b3IgZXhpc3RzLgorICAgKgorICAgKiAgU2VhcmNoZXMgdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBmb3IgQHAgY291bnQgY29uc2VjdXRpdmUgZWxlbWVudHMKKyAgICogIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIHJldHVybnMgdHJ1ZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0ludGVnZXIsIHR5cGVuYW1lIF9UcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICBfRm9yd2FyZEl0ZXJhdG9yCisgICAgc2VhcmNoX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIF9JbnRlZ2VyIF9fY291bnQsIGNvbnN0IF9UcCYgX192YWwsCisJICAgICBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQmluYXJ5UHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fY291bnQgPD0gMCkKKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIGlmIChfX2NvdW50ID09IDEpCisJeworCSAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICFib29sKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsIF9fdmFsKSkpCisJICAgICsrX19maXJzdDsKKwkgIHJldHVybiBfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBzdGQ6Ol9fc2VhcmNoX24oX19maXJzdCwgX19sYXN0LCBfX2NvdW50LCBfX3ZhbCwgX19iaW5hcnlfcHJlZCwKKwkJCSAgICAgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiBQZXJmb3JtIGFuIG9wZXJhdGlvbiBvbiBhIHNlcXVlbmNlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICAgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgdW5hcnlfb3AgIEEgdW5hcnkgb3BlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gb3V0cHV0IGl0ZXJhdG9yIGVxdWFsIHRvIEBwIHJlc3VsdCsobGFzdC1maXJzdCkuCisgICAqCisgICAqICBBcHBsaWVzIHRoZSBvcGVyYXRvciB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGlucHV0IHJhbmdlIGFuZCBhc3NpZ25zCisgICAqICB0aGUgcmVzdWx0cyB0byBzdWNjZXNzaXZlIGVsZW1lbnRzIG9mIHRoZSBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBFdmFsdWF0ZXMgQHAgKihyZXN1bHQrTik9dW5hcnlfb3AoKihmaXJzdCtOKSkgZm9yIGVhY2ggQGMgTiBpbiB0aGUKKyAgICogIHJhbmdlIEBwIFswLGxhc3QtZmlyc3QpLgorICAgKgorICAgKiAgQHAgdW5hcnlfb3AgbXVzdCBub3QgYWx0ZXIgaXRzIGFyZ3VtZW50LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9VbmFyeU9wZXJhdGlvbj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICB0cmFuc2Zvcm0oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX1VuYXJ5T3BlcmF0aW9uIF9fdW5hcnlfb3ApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorICAgICAgICAgICAgLy8gInRoZSB0eXBlIHJldHVybmVkIGJ5IGEgX1VuYXJ5T3BlcmF0aW9uIgorICAgICAgICAgICAgX190eXBlb2ZfXyhfX3VuYXJ5X29wKCpfX2ZpcnN0KSk+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fcmVzdWx0KQorCSpfX3Jlc3VsdCA9IF9fdW5hcnlfb3AoKl9fZmlyc3QpOworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBQZXJmb3JtIGFuIG9wZXJhdGlvbiBvbiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHR3byBzZXF1ZW5jZXMuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QxICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHJlc3VsdCAgICAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBiaW5hcnlfb3AgIEEgYmluYXJ5IG9wZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEFuIG91dHB1dCBpdGVyYXRvciBlcXVhbCB0byBAcCByZXN1bHQrKGxhc3QtZmlyc3QpLgorICAgKgorICAgKiAgQXBwbGllcyB0aGUgb3BlcmF0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gdGhlIHR3bworICAgKiAgaW5wdXQgcmFuZ2VzIGFuZCBhc3NpZ25zIHRoZSByZXN1bHRzIHRvIHN1Y2Nlc3NpdmUgZWxlbWVudHMgb2YgdGhlCisgICAqICBvdXRwdXQgc2VxdWVuY2UuCisgICAqICBFdmFsdWF0ZXMgQHAgKihyZXN1bHQrTik9YmluYXJ5X29wKCooZmlyc3QxK04pLCooZmlyc3QyK04pKSBmb3IgZWFjaAorICAgKiAgQGMgTiBpbiB0aGUgcmFuZ2UgQHAgWzAsbGFzdDEtZmlyc3QxKS4KKyAgICoKKyAgICogIEBwIGJpbmFyeV9vcCBtdXN0IG5vdCBhbHRlciBlaXRoZXIgb2YgaXRzIGFyZ3VtZW50cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHRyYW5zZm9ybShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCSAgICAgIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgIC8vICJ0aGUgdHlwZSByZXR1cm5lZCBieSBhIF9CaW5hcnlPcGVyYXRpb24iCisgICAgICAgICAgICBfX3R5cGVvZl9fKF9fYmluYXJ5X29wKCpfX2ZpcnN0MSwqX19maXJzdDIpKT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MiwgKytfX3Jlc3VsdCkKKwkqX19yZXN1bHQgPSBfX2JpbmFyeV9vcCgqX19maXJzdDEsICpfX2ZpcnN0Mik7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJlcGxhY2UgZWFjaCBvY2N1cnJlbmNlIG9mIG9uZSB2YWx1ZSBpbiBhIHNlcXVlbmNlIHdpdGggYW5vdGhlcgorICAgKiAgICAgICAgIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG9sZF92YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHJlcGxhY2VkLgorICAgKiAgQHBhcmFtICBuZXdfdmFsdWUgIFRoZSByZXBsYWNlbWVudCB2YWx1ZS4KKyAgICogIEByZXR1cm4gICByZXBsYWNlKCkgcmV0dXJucyBubyB2YWx1ZS4KKyAgICoKKyAgICogIEZvciBlYWNoIGl0ZXJhdG9yIEBjIGkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBpZiBAYyAqaSA9PQorICAgKiAgQHAgb2xkX3ZhbHVlIHRoZW4gdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBuZXdfdmFsdWUgaXMgcGVyZm9ybWVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2UoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX1RwJiBfX29sZF92YWx1ZSwgY29uc3QgX1RwJiBfX25ld192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSwgX1RwPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcCwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoKl9fZmlyc3QgPT0gX19vbGRfdmFsdWUpCisJICAqX19maXJzdCA9IF9fbmV3X3ZhbHVlOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXBsYWNlIGVhY2ggdmFsdWUgaW4gYSBzZXF1ZW5jZSBmb3Igd2hpY2ggYSBwcmVkaWNhdGUgcmV0dXJucworICAgKiAgICAgICAgIHRydWUgd2l0aCBhbm90aGVyIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICAgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHByZWQgICAgICAgQSBwcmVkaWNhdGUuCisgICAqICBAcGFyYW0gIG5ld192YWx1ZSAgVGhlIHJlcGxhY2VtZW50IHZhbHVlLgorICAgKiAgQHJldHVybiAgIHJlcGxhY2VfaWYoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgRm9yIGVhY2ggaXRlcmF0b3IgQGMgaSBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIGlmIEBwIHByZWQoKmkpCisgICAqICBpcyB0cnVlIHRoZW4gdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBuZXdfdmFsdWUgaXMgcGVyZm9ybWVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIHJlcGxhY2VfaWYoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgX1ByZWRpY2F0ZSBfX3ByZWQsIGNvbnN0IF9UcCYgX19uZXdfdmFsdWUpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmIChfX3ByZWQoKl9fZmlyc3QpKQorCSAgKl9fZmlyc3QgPSBfX25ld192YWx1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQXNzaWduIHRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBvYmplY3QgdG8gZWFjaCB2YWx1ZSBpbiBhCisgICAqICAgICAgICAgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGdlbiAgICBBIGZ1bmN0aW9uIG9iamVjdCB0YWtpbmcgbm8gYXJndW1lbnRzIGFuZCByZXR1cm5pbmcKKyAgICogICAgICAgICAgICAgICAgIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisgICAqICBAcmV0dXJuICAgZ2VuZXJhdGUoKSByZXR1cm5zIG5vIHZhbHVlLgorICAgKgorICAgKiAgUGVyZm9ybXMgdGhlIGFzc2lnbm1lbnQgQGMgKmkgPSBAcCBnZW4oKSBmb3IgZWFjaCBAYyBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICBnZW5lcmF0ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgX0dlbmVyYXRvciBfX2dlbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9HZW5lcmF0b3JDb25jZXB0PF9HZW5lcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX2dlbigpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBc3NpZ24gdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIG9iamVjdCB0byBlYWNoIHZhbHVlIGluIGEKKyAgICogICAgICAgICBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLgorICAgKiAgQHBhcmFtICBnZW4gICAgQSBmdW5jdGlvbiBvYmplY3QgdGFraW5nIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJuaW5nCisgICAqICAgICAgICAgICAgICAgICBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorICAgKiAgQHJldHVybiAgIFRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCBAcCBmaXJzdCtuCisgICAqCisgICAqICBQZXJmb3JtcyB0aGUgYXNzaWdubWVudCBAYyAqaSA9IEBwIGdlbigpIGZvciBlYWNoIEBjIGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsZmlyc3QrbikuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiA4NjUuIE1vcmUgYWxnb3JpdGhtcyB0aGF0IHRocm93IGF3YXkgaW5mb3JtYXRpb24KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0dlbmVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBnZW5lcmF0ZV9uKF9PdXRwdXRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIF9HZW5lcmF0b3IgX19nZW4pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKyAgICAgICAgICAgIC8vICJ0aGUgdHlwZSByZXR1cm5lZCBieSBhIF9HZW5lcmF0b3IiCisgICAgICAgICAgICBfX3R5cGVvZl9fKF9fZ2VuKCkpPikKKworICAgICAgZm9yIChfX2RlY2x0eXBlKF9fbiArIDApIF9fbml0ZXIgPSBfX247CisJICAgX19uaXRlciA+IDA7IC0tX19uaXRlciwgKytfX2ZpcnN0KQorCSpfX2ZpcnN0ID0gX19nZW4oKTsKKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVtb3ZpbmcgY29uc2VjdXRpdmUgZHVwbGljYXRlIHZhbHVlcy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQW4gaXRlcmF0b3IgZGVzaWduYXRpbmcgdGhlIGVuZCBvZiB0aGUgcmVzdWx0aW5nIHNlcXVlbmNlLgorICAgKgorICAgKiAgQ29waWVzIGVhY2ggZWxlbWVudCBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIHRvIHRoZSByYW5nZQorICAgKiAgYmVnaW5uaW5nIGF0IEBwIHJlc3VsdCwgZXhjZXB0IHRoYXQgb25seSB0aGUgZmlyc3QgZWxlbWVudCBpcyBjb3BpZWQKKyAgICogIGZyb20gZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbC4KKyAgICogIHVuaXF1ZV9jb3B5KCkgaXMgc3RhYmxlLCBzbyB0aGUgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUKKyAgICogIGNvcGllZCBpcyB1bmNoYW5nZWQuCisgICAqCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiAyNDEuIERvZXMgdW5pcXVlX2NvcHkoKSByZXF1aXJlIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBBc3NpZ25hYmxlPworICAgKiAgCisgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAqICBEUiA1MzguIDI0MSBhZ2FpbjogRG9lcyB1bmlxdWVfY29weSgpIHJlcXVpcmUgQ29weUNvbnN0cnVjdGlibGUgYW5kIAorICAgKiAgQXNzaWduYWJsZT8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX091dHB1dEl0ZXJhdG9yCisgICAgdW5pcXVlX2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdW5pcXVlX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKwkJCQlzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCksCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcHkgYSBzZXF1ZW5jZSwgcmVtb3ZpbmcgY29uc2VjdXRpdmUgdmFsdWVzIHVzaW5nIGEgcHJlZGljYXRlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgICAgICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgICAgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICAgICAgIEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgYmluYXJ5X3ByZWQgIEEgYmluYXJ5IHByZWRpY2F0ZS4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBkZXNpZ25hdGluZyB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgc2VxdWVuY2UuCisgICAqCisgICAqICBDb3BpZXMgZWFjaCBlbGVtZW50IGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgdG8gdGhlIHJhbmdlCisgICAqICBiZWdpbm5pbmcgYXQgQHAgcmVzdWx0LCBleGNlcHQgdGhhdCBvbmx5IHRoZSBmaXJzdCBlbGVtZW50IGlzIGNvcGllZAorICAgKiAgZnJvbSBncm91cHMgb2YgY29uc2VjdXRpdmUgZWxlbWVudHMgZm9yIHdoaWNoIEBwIGJpbmFyeV9wcmVkIHJldHVybnMKKyAgICogIHRydWUuCisgICAqICB1bmlxdWVfY29weSgpIGlzIHN0YWJsZSwgc28gdGhlIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlCisgICAqICBjb3BpZWQgaXMgdW5jaGFuZ2VkLgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgRFIgMjQxLiBEb2VzIHVuaXF1ZV9jb3B5KCkgcmVxdWlyZSBDb3B5Q29uc3RydWN0aWJsZSBhbmQgQXNzaWduYWJsZT8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBfT3V0cHV0SXRlcmF0b3IKKyAgICB1bmlxdWVfY29weShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHByZWRpY2F0ZXMgY2hlY2tlZCBsYXRlcgorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICByZXR1cm4gc3RkOjpfX3VuaXF1ZV9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9fYmluYXJ5X3ByZWQsCisJCQkJc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpLAorCQkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX3Jlc3VsdCkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFJhbmRvbWx5IHNodWZmbGUgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSZW9yZGVyIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIHVzaW5nIGEgcmFuZG9tCisgICAqICBkaXN0cmlidXRpb24sIHNvIHRoYXQgZXZlcnkgcG9zc2libGUgb3JkZXJpbmcgb2YgdGhlIHNlcXVlbmNlIGlzCisgICAqICBlcXVhbGx5IGxpa2VseS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcmFuZG9tX3NodWZmbGUoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCWZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwkgIHN0ZDo6aXRlcl9zd2FwKF9faSwgX19maXJzdCArIChzdGQ6OnJhbmQoKSAlICgoX19pIC0gX19maXJzdCkgKyAxKSkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTaHVmZmxlIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcmFuZG9tIG51bWJlcgorICAgKiAgICAgICAgIGdlbmVyYXRvci4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByYW5kICAgIFRoZSBSTkcgZnVuY3RvciBvciBmdW5jdGlvbi4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSZW9yZGVycyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSB1c2luZyBAcCByYW5kIHRvCisgICAqICBwcm92aWRlIGEgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gQ2FsbGluZyBAcCByYW5kKE4pIGZvciBhIHBvc2l0aXZlCisgICAqICBpbnRlZ2VyIEBwIE4gc2hvdWxkIHJldHVybiBhIHJhbmRvbWx5IGNob3NlbiBpbnRlZ2VyIGZyb20gdGhlCisgICAqICByYW5nZSBbMCxOKS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIHZvaWQKKyAgICByYW5kb21fc2h1ZmZsZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCQkgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiYgX19yYW5kKQorI2Vsc2UKKwkJICAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQorI2VuZGlmCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybjsKKyAgICAgIGZvciAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9faSA9IF9fZmlyc3QgKyAxOyBfX2kgIT0gX19sYXN0OyArK19faSkKKwlzdGQ6Oml0ZXJfc3dhcChfX2ksIF9fZmlyc3QgKyBfX3JhbmQoKF9faSAtIF9fZmlyc3QpICsgMSkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIE1vdmUgZWxlbWVudHMgZm9yIHdoaWNoIGEgcHJlZGljYXRlIGlzIHRydWUgdG8gdGhlIGJlZ2lubmluZworICAgKiAgICAgICAgIG9mIGEgc2VxdWVuY2UuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcHJlZCAgICBBIHByZWRpY2F0ZSBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgQHAgbWlkZGxlIHN1Y2ggdGhhdCBAcCBwcmVkKGkpIGlzIHRydWUgZm9yIGVhY2gKKyAgICogIGl0ZXJhdG9yIEBwIGkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxtaWRkbGUpIGFuZCBmYWxzZSBmb3IgZWFjaCBAcCBpCisgICAqICBpbiB0aGUgcmFuZ2UgQHAgW21pZGRsZSxsYXN0KS4KKyAgICoKKyAgICogIEBwIHByZWQgbXVzdCBub3QgbW9kaWZ5IGl0cyBvcGVyYW5kLiBAcCBwYXJ0aXRpb24oKSBkb2VzIG5vdCBwcmVzZXJ2ZQorICAgKiAgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGluIGVhY2ggZ3JvdXAsIHVzZQorICAgKiAgQHAgc3RhYmxlX3BhcnRpdGlvbigpIGlmIHRoaXMgaXMgbmVlZGVkLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgcGFydGl0aW9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1ByZWRpY2F0ZSAgIF9fcHJlZCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlQcmVkaWNhdGVDb25jZXB0PF9QcmVkaWNhdGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19wYXJ0aXRpb24oX19maXJzdCwgX19sYXN0LCBfX3ByZWQsCisJCQkgICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworCisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCB0aGUgc21hbGxlc3QgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBtaWRkbGUgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgc21hbGxlc3QgQHAgKG1pZGRsZS1maXJzdCkgZWxlbWVudHMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbGFzdCkgYW5kIG1vdmVzIHRoZW0gdG8gdGhlIHJhbmdlIEBwIFtmaXJzdCxtaWRkbGUpLiBUaGUKKyAgICogIG9yZGVyIG9mIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFttaWRkbGUsbGFzdCkgaXMKKyAgICogIHVuZGVmaW5lZC4KKyAgICogIEFmdGVyIHRoZSBzb3J0IGlmIEBwIGkgYW5kIEBqIGFyZSBpdGVyYXRvcnMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbWlkZGxlKSBzdWNoIHRoYXQgQGkgcHJlY2VkZXMgQGogYW5kIEBrIGlzIGFuIGl0ZXJhdG9yIGluCisgICAqICB0aGUgcmFuZ2UgQHAgW21pZGRsZSxsYXN0KSB0aGVuIEBwICpqPCppIGFuZCBAcCAqazwqaSBhcmUgYm90aCBmYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcGFydGlhbF9zb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQkgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19taWRkbGUpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fbWlkZGxlLCBfX2xhc3QpOworCisgICAgICBzdGQ6Ol9faGVhcF9zZWxlY3QoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7CisgICAgICBzdGQ6OnNvcnRfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgdGhlIHNtYWxsZXN0IGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UgdXNpbmcgYSBwcmVkaWNhdGUKKyAgICogICAgICAgICBmb3IgY29tcGFyaXNvbi4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBtaWRkbGUgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgc21hbGxlc3QgQHAgKG1pZGRsZS1maXJzdCkgZWxlbWVudHMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbGFzdCkgYW5kIG1vdmVzIHRoZW0gdG8gdGhlIHJhbmdlIEBwIFtmaXJzdCxtaWRkbGUpLiBUaGUKKyAgICogIG9yZGVyIG9mIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFttaWRkbGUsbGFzdCkgaXMKKyAgICogIHVuZGVmaW5lZC4KKyAgICogIEFmdGVyIHRoZSBzb3J0IGlmIEBwIGkgYW5kIEBqIGFyZSBpdGVyYXRvcnMgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbWlkZGxlKSBzdWNoIHRoYXQgQGkgcHJlY2VkZXMgQGogYW5kIEBrIGlzIGFuIGl0ZXJhdG9yIGluCisgICAqICB0aGUgcmFuZ2UgQHAgW21pZGRsZSxsYXN0KSB0aGVuIEBwICpjb21wKGosKmkpIGFuZCBAcCBjb21wKCprLCppKQorICAgKiAgYXJlIGJvdGggZmFsc2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBwYXJ0aWFsX3NvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsCisJCSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19taWRkbGUsCisJCSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCQkgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUsIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbWlkZGxlKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX21pZGRsZSwgX19sYXN0KTsKKworICAgICAgc3RkOjpfX2hlYXBfc2VsZWN0KF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QsIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSk7CisgICAgICBzdGQ6OnNvcnRfaGVhcChfX2ZpcnN0LCBfX21pZGRsZSwgX19DaGVja2VkQ29tcGFyZShfX2NvbXApKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCBhIHNlcXVlbmNlIGp1c3QgZW5vdWdoIHRvIGZpbmQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG50aCAgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICoKKyAgICogIFJlYXJyYW5nZXMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgc28gdGhhdCBAcCAqbnRoCisgICAqICBpcyB0aGUgc2FtZSBlbGVtZW50IHRoYXQgd291bGQgaGF2ZSBiZWVuIGluIHRoYXQgcG9zaXRpb24gaGFkIHRoZQorICAgKiAgd2hvbGUgc2VxdWVuY2UgYmVlbiBzb3J0ZWQuCisgICAqICB3aG9sZSBzZXF1ZW5jZSBiZWVuIHNvcnRlZC4gVGhlIGVsZW1lbnRzIGVpdGhlciBzaWRlIG9mIEBwICpudGggYXJlCisgICAqICBub3QgY29tcGxldGVseSBzb3J0ZWQsIGJ1dCBmb3IgYW55IGl0ZXJhdG9yIEBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0LG50aCkgYW5kIGFueSBpdGVyYXRvciBAaiBpbiB0aGUgcmFuZ2UgQHAgW250aCxsYXN0KSBpdAorICAgKiAgaG9sZHMgdGhhdCBAcCAqajwqaSBpcyBmYWxzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX250aCwKKwkJX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbnRoKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX250aCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0IHx8IF9fbnRoID09IF9fbGFzdCkKKwlyZXR1cm47CisKKyAgICAgIHN0ZDo6X19pbnRyb3NlbGVjdChfX2ZpcnN0LCBfX250aCwgX19sYXN0LAorCQkJIHN0ZDo6X19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTb3J0IGEgc2VxdWVuY2UganVzdCBlbm91Z2ggdG8gZmluZCBhIHBhcnRpY3VsYXIgcG9zaXRpb24KKyAgICogICAgICAgICB1c2luZyBhIHByZWRpY2F0ZSBmb3IgY29tcGFyaXNvbi4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBudGggICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBSZWFycmFuZ2VzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIHNvIHRoYXQgQHAgKm50aAorICAgKiAgaXMgdGhlIHNhbWUgZWxlbWVudCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBpbiB0aGF0IHBvc2l0aW9uIGhhZCB0aGUKKyAgICogIHdob2xlIHNlcXVlbmNlIGJlZW4gc29ydGVkLiBUaGUgZWxlbWVudHMgZWl0aGVyIHNpZGUgb2YgQHAgKm50aCBhcmUKKyAgICogIG5vdCBjb21wbGV0ZWx5IHNvcnRlZCwgYnV0IGZvciBhbnkgaXRlcmF0b3IgQGkgaW4gdGhlIHJhbmdlCisgICAqICBAcCBbZmlyc3QsbnRoKSBhbmQgYW55IGl0ZXJhdG9yIEBqIGluIHRoZSByYW5nZSBAcCBbbnRoLGxhc3QpIGl0CisgICAqICBob2xkcyB0aGF0IEBwIGNvbXAoKmosKmkpIGlzIGZhbHNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGlubGluZSB2b2lkCisgICAgbnRoX2VsZW1lbnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX250aCwKKwkJX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlLCBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX250aCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19udGgsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCB8fCBfX250aCA9PSBfX2xhc3QpCisJcmV0dXJuOworCisgICAgICBzdGQ6Ol9faW50cm9zZWxlY3QoX19maXJzdCwgX19udGgsIF9fbGFzdCwKKwkJCSBzdGQ6Ol9fbGcoX19sYXN0IC0gX19maXJzdCkgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgaW4gYXNjZW5kaW5nIG9yZGVyLAorICAgKiAgc3VjaCB0aGF0IEBwICooaSsxKTwqaSBpcyBmYWxzZSBmb3IgZWFjaCBpdGVyYXRvciBAcCBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0LGxhc3QtMSkuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBub3QgcHJlc2VydmVkLCB1c2UKKyAgICogIEBwIHN0YWJsZV9zb3J0KCkgaWYgdGhpcyBpcyBuZWVkZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHNvcnQoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBzdGQ6Ol9faW50cm9zb3J0X2xvb3AoX19maXJzdCwgX19sYXN0LAorCQkJCXN0ZDo6X19sZyhfX2xhc3QgLSBfX2ZpcnN0KSAqIDIpOworCSAgc3RkOjpfX2ZpbmFsX2luc2VydGlvbl9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBTb3J0IHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlIHVzaW5nIGEgcHJlZGljYXRlIGZvciBjb21wYXJpc29uLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBpbiBhc2NlbmRpbmcgb3JkZXIsCisgICAqICBzdWNoIHRoYXQgQHAgY29tcCgqKGkrMSksKmkpIGlzIGZhbHNlIGZvciBldmVyeSBpdGVyYXRvciBAcCBpIGluIHRoZQorICAgKiAgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QtMSkuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBub3QgcHJlc2VydmVkLCB1c2UKKyAgICogIEBwIHN0YWJsZV9zb3J0KCkgaWYgdGhpcyBpcyBuZWVkZWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzb3J0KF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLCBfVmFsdWVUeXBlLAorCQkJCSAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIHN0ZDo6X19pbnRyb3NvcnRfbG9vcChfX2ZpcnN0LCBfX2xhc3QsCisJCQkJc3RkOjpfX2xnKF9fbGFzdCAtIF9fZmlyc3QpICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19DaGVja2VkQ29tcGFyZShfX2NvbXApKTsKKwkgIHN0ZDo6X19maW5hbF9pbnNlcnRpb25fc29ydChfX2ZpcnN0LCBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBNZXJnZXMgdHdvIHNvcnRlZCByYW5nZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBBbiBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QyICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSBtZXJnZWQgcmFuZ2UuCisgICAqICBAcmV0dXJuICAgICAgICAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgPGVtPm5vdCBsZXNzCisgICAqICAgICAgICAgICAgICAgICAgdGhhbjwvZW0+IEBhIHZhbC4KKyAgICoKKyAgICogIE1lcmdlcyB0aGUgcmFuZ2VzIFtmaXJzdDEsbGFzdDEpIGFuZCBbZmlyc3QyLGxhc3QyKSBpbnRvIHRoZSBzb3J0ZWQgcmFuZ2UKKyAgICogIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MS1maXJzdDEpICsgKGxhc3QyLWZpcnN0MikpLiAgQm90aCBpbnB1dCByYW5nZXMKKyAgICogIG11c3QgYmUgc29ydGVkLCBhbmQgdGhlIG91dHB1dCByYW5nZSBtdXN0IG5vdCBvdmVybGFwIHdpdGggZWl0aGVyIG9mCisgICAqICB0aGUgaW5wdXQgcmFuZ2VzLiAgVGhlIHNvcnQgaXMgQGUgc3RhYmxlLCB0aGF0IGlzLCBmb3IgZXF1aXZhbGVudAorICAgKiAgZWxlbWVudHMgaW4gdGhlIHR3byByYW5nZXMsIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IHJhbmdlIHdpbGwgYWx3YXlzCisgICAqICBjb21lIGJlZm9yZSBlbGVtZW50cyBmcm9tIHRoZSBzZWNvbmQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJeworCSAgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgfQorCSAgKytfX3Jlc3VsdDsKKwl9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCBzdGQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkgICAgX19yZXN1bHQpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTWVyZ2VzIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBBbm90aGVyIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MiAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHJlc3VsdCAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbWVyZ2VkIHJhbmdlLgorICAgKiAgQHBhcmFtICBjb21wICAgIEEgZnVuY3RvciB0byB1c2UgZm9yIGNvbXBhcmlzb25zLgorICAgKiAgQHJldHVybiAgICAgICAgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50ICJub3QgbGVzcworICAgKiAgICAgICAgICAgICAgICAgIHRoYW4iIEBhIHZhbC4KKyAgICoKKyAgICogIE1lcmdlcyB0aGUgcmFuZ2VzIFtmaXJzdDEsbGFzdDEpIGFuZCBbZmlyc3QyLGxhc3QyKSBpbnRvIHRoZSBzb3J0ZWQgcmFuZ2UKKyAgICogIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MS1maXJzdDEpICsgKGxhc3QyLWZpcnN0MikpLiAgQm90aCBpbnB1dCByYW5nZXMKKyAgICogIG11c3QgYmUgc29ydGVkLCBhbmQgdGhlIG91dHB1dCByYW5nZSBtdXN0IG5vdCBvdmVybGFwIHdpdGggZWl0aGVyIG9mCisgICAqICB0aGUgaW5wdXQgcmFuZ2VzLiAgVGhlIHNvcnQgaXMgQGUgc3RhYmxlLCB0aGF0IGlzLCBmb3IgZXF1aXZhbGVudAorICAgKiAgZWxlbWVudHMgaW4gdGhlIHR3byByYW5nZXMsIGVsZW1lbnRzIGZyb20gdGhlIGZpcnN0IHJhbmdlIHdpbGwgYWx3YXlzCisgICAqICBjb21lIGJlZm9yZSBlbGVtZW50cyBmcm9tIHRoZSBzZWNvbmQuCisgICAqCisgICAqICBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlZmZlY3RzIG9uIG9yZGVyaW5nIGFzCisgICAqICB0aGUgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIGluaXRpYWwgc29ydC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBtZXJnZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19jb21wKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0X3ByZWQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxLCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyKQorCXsKKwkgIGlmIChfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoX19maXJzdDIsIF9fbGFzdDIsIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCSAgICBfX3Jlc3VsdCkpOworICAgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIFNvcnQgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UsIHByZXNlcnZpbmcgdGhlIHJlbGF0aXZlIG9yZGVyCisgICAqICAgICAgICAgb2YgZXF1aXZhbGVudCBlbGVtZW50cy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBOb3RoaW5nLgorICAgKgorICAgKiAgU29ydHMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBAcCBbZmlyc3QsbGFzdCkgaW4gYXNjZW5kaW5nIG9yZGVyLAorICAgKiAgc3VjaCB0aGF0IEBwICooaSsxKTwqaSBpcyBmYWxzZSBmb3IgZWFjaCBpdGVyYXRvciBAcCBpIGluIHRoZSByYW5nZQorICAgKiAgQHAgW2ZpcnN0LGxhc3QtMSkuCisgICAqCisgICAqICBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZXF1aXZhbGVudCBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQsIHNvIGFueSB0d28KKyAgICogIGVsZW1lbnRzIEBwIHggYW5kIEBwIHkgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBzdWNoIHRoYXQKKyAgICogIEBwIHg8eSBpcyBmYWxzZSBhbmQgQHAgeTx4IGlzIGZhbHNlIHdpbGwgaGF2ZSB0aGUgc2FtZSByZWxhdGl2ZQorICAgKiAgb3JkZXJpbmcgYWZ0ZXIgY2FsbGluZyBAcCBzdGFibGVfc29ydCgpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIF9UZW1wb3JhcnlfYnVmZmVyPF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgX1ZhbHVlVHlwZT4gX19idWYoX19maXJzdCwKKwkJCQkJCQkJIF9fbGFzdCk7CisgICAgICBpZiAoX19idWYuYmVnaW4oKSA9PSAwKQorCXN0ZDo6X19pbnBsYWNlX3N0YWJsZV9zb3J0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBlbHNlCisJc3RkOjpfX3N0YWJsZV9zb3J0X2FkYXB0aXZlKF9fZmlyc3QsIF9fbGFzdCwgX19idWYuYmVnaW4oKSwKKwkJCQkgICAgX0Rpc3RhbmNlVHlwZShfX2J1Zi5zaXplKCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU29ydCB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZSB1c2luZyBhIHByZWRpY2F0ZSBmb3IgY29tcGFyaXNvbiwKKyAgICogICAgICAgICBwcmVzZXJ2aW5nIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBlcXVpdmFsZW50IGVsZW1lbnRzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICAgQW5vdGhlciBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY29tcCAgICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBpbiBhc2NlbmRpbmcgb3JkZXIsCisgICAqICBzdWNoIHRoYXQgQHAgY29tcCgqKGkrMSksKmkpIGlzIGZhbHNlIGZvciBlYWNoIGl0ZXJhdG9yIEBwIGkgaW4gdGhlCisgICAqICByYW5nZSBAcCBbZmlyc3QsbGFzdC0xKS4KKyAgICoKKyAgICogIFRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBlcXVpdmFsZW50IGVsZW1lbnRzIGlzIHByZXNlcnZlZCwgc28gYW55IHR3bworICAgKiAgZWxlbWVudHMgQHAgeCBhbmQgQHAgeSBpbiB0aGUgcmFuZ2UgQHAgW2ZpcnN0LGxhc3QpIHN1Y2ggdGhhdAorICAgKiAgQHAgY29tcCh4LHkpIGlzIGZhbHNlIGFuZCBAcCBjb21wKHkseCkgaXMgZmFsc2Ugd2lsbCBoYXZlIHRoZSBzYW1lCisgICAqICByZWxhdGl2ZSBvcmRlcmluZyBhZnRlciBjYWxsaW5nIEBwIHN0YWJsZV9zb3J0KCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzdGFibGVfc29ydChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkJX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlLAorCQkJCSAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX1RlbXBvcmFyeV9idWZmZXI8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBfVmFsdWVUeXBlPiBfX2J1ZihfX2ZpcnN0LAorCQkJCQkJCQkgX19sYXN0KTsKKyAgICAgIGlmIChfX2J1Zi5iZWdpbigpID09IDApCisJc3RkOjpfX2lucGxhY2Vfc3RhYmxlX3NvcnQoX19maXJzdCwgX19sYXN0LCBfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkpOworICAgICAgZWxzZQorCXN0ZDo6X19zdGFibGVfc29ydF9hZGFwdGl2ZShfX2ZpcnN0LCBfX2xhc3QsIF9fYnVmLmJlZ2luKCksCisJCQkJICAgIF9EaXN0YW5jZVR5cGUoX19idWYuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSk7CisgICAgfQorCisKKyAgLyoqCisgICAqICBAYnJpZWYgUmV0dXJuIHRoZSB1bmlvbiBvZiB0d28gc29ydGVkIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICBlYWNoIHJhbmdlIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoCisgICAqICByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBvdGhlciwKKyAgICogIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZSBpdGVyYXRvciBhZHZhbmNlZC4gIElmIGFuIGVsZW1lbnQgaXMKKyAgICogIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcywgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZmlyc3QgcmFuZ2UgaXMgY29waWVkIGFuZAorICAgKiAgYm90aCByYW5nZXMgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dAorICAgKiAgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfdW5pb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICAgICsrX19maXJzdDE7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICAgKytfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QyOworCSAgICB9CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoX19maXJzdDIsIF9fbGFzdDIsIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCSAgICBfX3Jlc3VsdCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBSZXR1cm4gdGhlIHVuaW9uIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nIGEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MiAgIEVuZCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIGNvbXAgICAgVGhlIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgZWFjaCByYW5nZSBpbiBvcmRlciB0byB0aGUgb3V0cHV0IHJhbmdlLiAgSXRlcmF0b3JzIGluY3JlbWVudCBmb3IgZWFjaAorICAgKiAgcmFuZ2UuICBXaGVuIHRoZSBjdXJyZW50IGVsZW1lbnQgb2Ygb25lIHJhbmdlIGlzIGxlc3MgdGhhbiB0aGUgb3RoZXIKKyAgICogIGFjY29yZGluZyB0byBAYSBjb21wLCB0aGF0IGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZWQuCisgICAqICBJZiBhbiBlcXVpdmFsZW50IGVsZW1lbnQgYWNjb3JkaW5nIHRvIEBhIGNvbXAgaXMgY29udGFpbmVkIGluIGJvdGgKKyAgICogIHJhbmdlcywgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZmlyc3QgcmFuZ2UgaXMgY29waWVkIGFuZCBib3RoIHJhbmdlcworICAgKiAgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfdW5pb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCSAgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICB9CisJICBlbHNlIGlmIChfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9fZmlyc3QyLCAqX19maXJzdDEpKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QyOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgICArK19fZmlyc3QxOworCSAgICAgICsrX19maXJzdDI7CisJICAgIH0KKwkgICsrX19yZXN1bHQ7CisJfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0Miwgc3RkOjpjb3B5KF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkJICAgIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBzb3J0ZWQgcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBTdGFydCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBFbmQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgU3RhcnQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MiAgIEVuZCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIGJvdGggcmFuZ2VzIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoCisgICAqICByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBvdGhlciwKKyAgICogIHRoYXQgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiBhbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcywgdGhlCisgICAqICBlbGVtZW50IGZyb20gdGhlIGZpcnN0IHJhbmdlIGlzIGNvcGllZCBhbmQgYm90aCByYW5nZXMgYWR2YW5jZS4gIFRoZQorICAgKiAgb3V0cHV0IHJhbmdlIG1heSBub3Qgb3ZlcmxhcCBlaXRoZXIgaW5wdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfaW50ZXJzZWN0aW9uKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJICAgICBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IxPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgICsrX19maXJzdDE7CisJZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgKytfX2ZpcnN0MjsKKwllbHNlCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MTsKKwkgICAgKytfX2ZpcnN0MTsKKwkgICAgKytfX2ZpcnN0MjsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNvcnRlZCByYW5nZXMgdXNpbmcgY29tcGFyaXNvbgorICAgKiAgZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHBhcmFtICBjb21wICAgIFRoZSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBFbmQgb2YgdGhlIG91dHB1dCByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBpdGVyYXRlcyBvdmVyIGJvdGggcmFuZ2VzLCBjb3B5aW5nIGVsZW1lbnRzIHByZXNlbnQgaW4KKyAgICogIGJvdGggcmFuZ2VzIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoCisgICAqICByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBvdGhlcgorICAgKiAgYWNjb3JkaW5nIHRvIEBhIGNvbXAsIHRoYXQgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiBhbiBlbGVtZW50IGlzCisgICAqICBjb250YWluZWQgaW4gYm90aCByYW5nZXMgYWNjb3JkaW5nIHRvIEBhIGNvbXAsIHRoZSBlbGVtZW50IGZyb20gdGhlCisgICAqICBmaXJzdCByYW5nZSBpcyBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0IHJhbmdlIG1heSBub3QKKyAgICogIG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9pbnRlcnNlY3Rpb24oX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgICsrX19maXJzdDE7CisJZWxzZSBpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0MiwgKl9fZmlyc3QxKSkKKwkgICsrX19maXJzdDI7CisJZWxzZQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc29ydGVkIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNldF9hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgU3RhcnQgb2YgZmlyc3QgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QxICAgRW5kIG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdDIgICBFbmQgb2Ygc2Vjb25kIHJhbmdlLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICB0aGUgZmlyc3QgcmFuZ2UgYnV0IG5vdCB0aGUgc2Vjb25kIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQorICAgKiAgZmlyc3QgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQsIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZQorICAgKiAgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgcmFuZ2UgaXMgbGVzcywKKyAgICogIHRoZSBpdGVyYXRvciBhZHZhbmNlcywgYnV0IG5vIGVsZW1lbnQgaXMgY29waWVkLiAgSWYgYW4gZWxlbWVudCBpcworICAgKiAgY29udGFpbmVkIGluIGJvdGggcmFuZ2VzLCBubyBlbGVtZW50cyBhcmUgY29waWVkIGFuZCBib3RoIHJhbmdlcworICAgKiAgYWR2YW5jZS4gIFRoZSBvdXRwdXQgcmFuZ2UgbWF5IG5vdCBvdmVybGFwIGVpdGhlciBpbnB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCSAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTI7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICBfVmFsdWVUeXBlMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUyLCBfVmFsdWVUeXBlMT4pCQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpCisJaWYgKCpfX2ZpcnN0MSA8ICpfX2ZpcnN0MikKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UgaWYgKCpfX2ZpcnN0MiA8ICpfX2ZpcnN0MSkKKwkgICsrX19maXJzdDI7CisJZWxzZQorCSAgeworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nIGNvbXBhcmlzb24KKyAgICogIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgY29tcCAgICBUaGUgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICB0aGUgZmlyc3QgcmFuZ2UgYnV0IG5vdCB0aGUgc2Vjb25kIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBJdGVyYXRvcnMgaW5jcmVtZW50IGZvciBlYWNoIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQorICAgKiAgZmlyc3QgcmFuZ2UgaXMgbGVzcyB0aGFuIHRoZSBzZWNvbmQgYWNjb3JkaW5nIHRvIEBhIGNvbXAsIHRoYXQgZWxlbWVudAorICAgKiAgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZXMuICBJZiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQorICAgKiAgc2Vjb25kIHJhbmdlIGlzIGxlc3MsIG5vIGVsZW1lbnQgaXMgY29waWVkIGFuZCB0aGUgaXRlcmF0b3IgYWR2YW5jZXMuCisgICAqICBJZiBhbiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcyBhY2NvcmRpbmcgdG8gQGEgY29tcCwgbm8KKyAgICogIGVsZW1lbnRzIGFyZSBjb3BpZWQgYW5kIGJvdGggcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0IHJhbmdlIG1heSBub3QKKyAgICogIG92ZXJsYXAgZWl0aGVyIGlucHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHNldF9kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCSAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCSAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICArK19fZmlyc3QyOworCWVsc2UKKwkgIHsKKwkgICAgKytfX2ZpcnN0MTsKKwkgICAgKytfX2ZpcnN0MjsKKwkgIH0KKyAgICAgIHJldHVybiBzdGQ6OmNvcHkoX19maXJzdDEsIF9fbGFzdDEsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNvcnRlZCByYW5nZXMuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEByZXR1cm4gIEVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlLgorICAgKiAgQGluZ3JvdXAgc2V0X2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIGl0ZXJhdGVzIG92ZXIgYm90aCByYW5nZXMsIGNvcHlpbmcgZWxlbWVudHMgcHJlc2VudCBpbgorICAgKiAgb25lIHJhbmdlIGJ1dCBub3QgdGhlIG90aGVyIGluIG9yZGVyIHRvIHRoZSBvdXRwdXQgcmFuZ2UuICBJdGVyYXRvcnMKKyAgICogIGluY3JlbWVudCBmb3IgZWFjaCByYW5nZS4gIFdoZW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiBvbmUgcmFuZ2UgaXMgbGVzcworICAgKiAgdGhhbiB0aGUgb3RoZXIsIHRoYXQgZWxlbWVudCBpcyBjb3BpZWQgYW5kIHRoZSBpdGVyYXRvciBhZHZhbmNlcy4gIElmIGFuCisgICAqICBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBib3RoIHJhbmdlcywgbm8gZWxlbWVudHMgYXJlIGNvcGllZCBhbmQgYm90aAorICAgKiAgcmFuZ2VzIGFkdmFuY2UuICBUaGUgb3V0cHV0IHJhbmdlIG1heSBub3Qgb3ZlcmxhcCBlaXRoZXIgaW5wdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5PcENvbmNlcHQ8X1ZhbHVlVHlwZTIsIF9WYWx1ZVR5cGUxPikJCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX19maXJzdDIsIF9fbGFzdDIsIF9fZmlyc3QxKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDE7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZSBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgeworCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDI7CisJICAgICsrX19maXJzdDI7CisJICAgICsrX19yZXN1bHQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICArK19fZmlyc3QxOworCSAgICArK19fZmlyc3QyOworCSAgfQorICAgICAgcmV0dXJuIHN0ZDo6Y29weShfX2ZpcnN0MiwgX19sYXN0Miwgc3RkOjpjb3B5KF9fZmlyc3QxLAorCQkJCQkJICAgIF9fbGFzdDEsIF9fcmVzdWx0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBzb3J0ZWQgcmFuZ2VzIHVzaW5nCisgICAqICBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIFN0YXJ0IG9mIGZpcnN0IHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEVuZCBvZiBmaXJzdCByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBTdGFydCBvZiBzZWNvbmQgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QyICAgRW5kIG9mIHNlY29uZCByYW5nZS4KKyAgICogIEBwYXJhbSAgY29tcCAgICBUaGUgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHJldHVybiAgRW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UuCisgICAqICBAaW5ncm91cCBzZXRfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gaXRlcmF0ZXMgb3ZlciBib3RoIHJhbmdlcywgY29weWluZyBlbGVtZW50cyBwcmVzZW50IGluCisgICAqICBvbmUgcmFuZ2UgYnV0IG5vdCB0aGUgb3RoZXIgaW4gb3JkZXIgdG8gdGhlIG91dHB1dCByYW5nZS4gIEl0ZXJhdG9ycworICAgKiAgaW5jcmVtZW50IGZvciBlYWNoIHJhbmdlLiAgV2hlbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIG9uZSByYW5nZSBpcyBsZXNzCisgICAqICB0aGFuIHRoZSBvdGhlciBhY2NvcmRpbmcgdG8gQGEgY29tcCwgdGhhdCBlbGVtZW50IGlzIGNvcGllZCBhbmQgdGhlCisgICAqICBpdGVyYXRvciBhZHZhbmNlcy4gIElmIGFuIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIGJvdGggcmFuZ2VzIGFjY29yZGluZworICAgKiAgdG8gQGEgY29tcCwgbm8gZWxlbWVudHMgYXJlIGNvcGllZCBhbmQgYm90aCByYW5nZXMgYWR2YW5jZS4gIFRoZSBvdXRwdXQKKyAgICogIHJhbmdlIG1heSBub3Qgb3ZlcmxhcCBlaXRoZXIgaW5wdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIsCisJCQkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCSAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkJCQkgIF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X0NvbXBhcmUsCisJCQkJICBfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIsIF9fY29tcCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9fZmlyc3QyLCBfX2xhc3QyLCBfX2ZpcnN0MSwgX19jb21wKTsKKworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwlpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKKwkgIHsKKwkgICAgKl9fcmVzdWx0ID0gKl9fZmlyc3QxOworCSAgICArK19fZmlyc3QxOworCSAgICArK19fcmVzdWx0OworCSAgfQorCWVsc2UgaWYgKF9fQ2hlY2tlZENvbXBhcmUoX19jb21wKSgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0MjsKKwkgICAgKytfX2ZpcnN0MjsKKwkgICAgKytfX3Jlc3VsdDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgICsrX19maXJzdDE7CisJICAgICsrX19maXJzdDI7CisJICB9CisgICAgICByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QyLCBfX2xhc3QyLCAKKwkJICAgICAgIHN0ZDo6Y29weShfX2ZpcnN0MSwgX19sYXN0MSwgX19yZXN1bHQpKTsKKyAgICB9CisKKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHNtYWxsZXN0IHZhbHVlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBtaW5fZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoKl9fZmlyc3QgPCAqX19yZXN1bHQpCisJICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIG1pbmltdW0gZWxlbWVudCBpbiBhIHJhbmdlIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGNvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIHNtYWxsZXN0IHZhbHVlCisgICAqICBhY2NvcmRpbmcgdG8gY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIG1pbl9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCV9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0PF9Db21wYXJlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwlpZiAoX19DaGVja2VkQ29tcGFyZShfX2NvbXApKCpfX2ZpcnN0LCAqX19yZXN1bHQpKQorCSAgX19yZXN1bHQgPSBfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIHRoZSBtYXhpbXVtIGVsZW1lbnQgaW4gYSByYW5nZS4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgdGhlIGxhcmdlc3QgdmFsdWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIG1heF9lbGVtZW50KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmICgqX19yZXN1bHQgPCAqX19maXJzdCkKKwkgIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiB0aGUgbWF4aW11bSBlbGVtZW50IGluIGEgcmFuZ2UgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgY29tcCAgIENvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbGFyZ2VzdCB2YWx1ZQorICAgKiAgYWNjb3JkaW5nIHRvIGNvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBtYXhfZWxlbWVudChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQlfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfQ29tcGFyZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0dXJuIF9fZmlyc3Q7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0ID0gX19maXJzdDsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCWlmIChfX0NoZWNrZWRDb21wYXJlKF9fY29tcCkoKl9fcmVzdWx0LCAqX19maXJzdCkpCisJICBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisjdW5kZWYgX19DaGVja2VkQ29tcGFyZQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9BTEdPX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfYWxnb2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfYWxnb2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNkY2I5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9hbGdvYmFzZS5oCkBAIC0wLDAgKzEsMTIxMSBAQAorLy8gQ29yZSBhbGdvcml0aG1pYyBmYWNpbGl0aWVzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKy8vIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2FsZ29iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXthbGdvcml0aG19CisgKi8KKworI2lmbmRlZiBfU1RMX0FMR09CQVNFX0gKKyNkZWZpbmUgX1NUTF9BTEdPQkFTRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPiAvLyBGb3Igc3RkOjpzd2FwIGFuZCBfR0xJQkNYWF9NT1ZFCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDA0LTA4L21zZzAwMTY3Lmh0bWw6IGluIGEKKyAgLy8gbnV0c2hlbGwsIHdlIGFyZSBwYXJ0aWFsbHkgaW1wbGVtZW50aW5nIHRoZSByZXNvbHV0aW9uIG9mIERSIDE4NywKKyAgLy8gd2hlbiBpdCdzIHNhZmUsIGkuZS4sIHRoZSB2YWx1ZV90eXBlcyBhcmUgZXF1YWwuCisgIHRlbXBsYXRlPGJvb2wgX0Jvb2xUeXBlPgorICAgIHN0cnVjdCBfX2l0ZXJfc3dhcAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IxLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgaXRlcl9zd2FwKF9Gb3J3YXJkSXRlcmF0b3IxIF9fYSwgX0ZvcndhcmRJdGVyYXRvcjIgX19iKQorICAgICAgICB7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisgICAgICAgICAgICBfVmFsdWVUeXBlMTsKKyAgICAgICAgICBfVmFsdWVUeXBlMSBfX3RtcCA9IF9HTElCQ1hYX01PVkUoKl9fYSk7CisgICAgICAgICAgKl9fYSA9IF9HTElCQ1hYX01PVkUoKl9fYik7CisgICAgICAgICAgKl9fYiA9IF9HTElCQ1hYX01PVkUoX190bXApOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19pdGVyX3N3YXA8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgICAgIHN0YXRpYyB2b2lkIAorICAgICAgICBpdGVyX3N3YXAoX0ZvcndhcmRJdGVyYXRvcjEgX19hLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2IpCisgICAgICAgIHsKKyAgICAgICAgICBzd2FwKCpfX2EsICpfX2IpOworICAgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIGl0ZXJhdG9ycy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgYSAgQW4gaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGIgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgTm90aGluZy4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gc3dhcHMgdGhlIHZhbHVlcyBwb2ludGVkIHRvIGJ5IHR3byBpdGVyYXRvcnMsIG5vdCB0aGUKKyAgICogIGl0ZXJhdG9ycyB0aGVtc2VsdmVzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgaW5saW5lIHZvaWQKKyAgICBpdGVyX3N3YXAoX0ZvcndhcmRJdGVyYXRvcjEgX19hLCBfRm9yd2FyZEl0ZXJhdG9yMiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVmFsdWVUeXBlMSwKKwkJCQkgIF9WYWx1ZVR5cGUyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9WYWx1ZVR5cGUyLAorCQkJCSAgX1ZhbHVlVHlwZTE+KQorCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yMT46OnJlZmVyZW5jZQorCV9SZWZlcmVuY2VUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3IyPjo6cmVmZXJlbmNlCisJX1JlZmVyZW5jZVR5cGUyOworICAgICAgc3RkOjpfX2l0ZXJfc3dhcDxfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46Ol9fdmFsdWUKKwkmJiBfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxJiwgX1JlZmVyZW5jZVR5cGUxPjo6X192YWx1ZQorCSYmIF9fYXJlX3NhbWU8X1ZhbHVlVHlwZTImLCBfUmVmZXJlbmNlVHlwZTI+OjpfX3ZhbHVlPjo6CisJaXRlcl9zd2FwKF9fYSwgX19iKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgU3dhcCB0aGUgZWxlbWVudHMgb2YgdHdvIHNlcXVlbmNlcy4KKyAgICogIEBpbmdyb3VwIG11dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QxICAgQSBmb3J3YXJkIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIEEgZm9yd2FyZCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBpdGVyYXRvciBlcXVhbCB0byBAcCBmaXJzdDIrKGxhc3QxLWZpcnN0MSkuCisgICAqCisgICAqICBTd2FwcyBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdDEsbGFzdDEpIHdpdGggdGhlCisgICAqICBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdDIsKGxhc3QxLWZpcnN0MSkpLgorICAgKiAgVGhlIHJhbmdlcyBtdXN0IG5vdCBvdmVybGFwLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcjI+CisgICAgX0ZvcndhcmRJdGVyYXRvcjIKKyAgICBzd2FwX3JhbmdlcyhfRm9yd2FyZEl0ZXJhdG9yMSBfX2ZpcnN0MSwgX0ZvcndhcmRJdGVyYXRvcjEgX19sYXN0MSwKKwkJX0ZvcndhcmRJdGVyYXRvcjIgX19maXJzdDIpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9Gb3J3YXJkSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX0ZvcndhcmRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdDEsIF9fbGFzdDEpOworCisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwlzdGQ6Oml0ZXJfc3dhcChfX2ZpcnN0MSwgX19maXJzdDIpOworICAgICAgcmV0dXJuIF9fZmlyc3QyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUaGlzIGRvZXMgd2hhdCB5b3UgdGhpbmsgaXQgZG9lcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBhICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBiICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHJldHVybiAgIFRoZSBsZXNzZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBzaW1wbGUgY2xhc3NpYyBnZW5lcmljIGltcGxlbWVudGF0aW9uLiAgSXQgd2lsbCB3b3JrIG9uCisgICAqICB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkIG9uY2UsIHVubGlrZSBhCisgICAqICBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIG1pbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVHA+KQorICAgICAgLy9yZXR1cm4gX19iIDwgX19hID8gX19iIDogX19hOworICAgICAgaWYgKF9fYiA8IF9fYSkKKwlyZXR1cm4gX19iOworICAgICAgcmV0dXJuIF9fYTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBkb2VzIHdoYXQgeW91IHRoaW5rIGl0IGRvZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gICBUaGUgZ3JlYXRlciBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICoKKyAgICogIFRoaXMgaXMgdGhlIHNpbXBsZSBjbGFzc2ljIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uICBJdCB3aWxsIHdvcmsgb24KKyAgICogIHRlbXBvcmFyeSBleHByZXNzaW9ucywgc2luY2UgdGhleSBhcmUgb25seSBldmFsdWF0ZWQgb25jZSwgdW5saWtlIGEKKyAgICogIHByZXByb2Nlc3NvciBtYWNyby4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9UcD4pCisgICAgICAvL3JldHVybiAgX19hIDwgX19iID8gX19iIDogX19hOworICAgICAgaWYgKF9fYSA8IF9fYikKKwlyZXR1cm4gX19iOworICAgICAgcmV0dXJuIF9fYTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBkb2VzIHdoYXQgeW91IHRoaW5rIGl0IGRvZXMuCisgICAqICBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgYSAgQSB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgYiAgQW5vdGhlciB0aGluZyBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEBwYXJhbSAgY29tcCAgQSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvckBlbmRsaW5rLgorICAgKiAgQHJldHVybiAgIFRoZSBsZXNzZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIHdpbGwgd29yayBvbiB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkCisgICAqICBvbmNlLCB1bmxpa2UgYSBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy9yZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IF9fYiA6IF9fYTsKKyAgICAgIGlmIChfX2NvbXAoX19iLCBfX2EpKQorCXJldHVybiBfX2I7CisgICAgICByZXR1cm4gX19hOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUaGlzIGRvZXMgd2hhdCB5b3UgdGhpbmsgaXQgZG9lcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBhICBBIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBiICBBbm90aGVyIHRoaW5nIG9mIGFyYml0cmFyeSB0eXBlLgorICAgKiAgQHBhcmFtICBjb21wICBBIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yQGVuZGxpbmsuCisgICAqICBAcmV0dXJuICAgVGhlIGdyZWF0ZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAqCisgICAqICBUaGlzIHdpbGwgd29yayBvbiB0ZW1wb3JhcnkgZXhwcmVzc2lvbnMsIHNpbmNlIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkCisgICAqICBvbmNlLCB1bmxpa2UgYSBwcmVwcm9jZXNzb3IgbWFjcm8uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBtYXgoY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy9yZXR1cm4gX19jb21wKF9fYSwgX19iKSA/IF9fYiA6IF9fYTsKKyAgICAgIGlmIChfX2NvbXAoX19hLCBfX2IpKQorCXJldHVybiBfX2I7CisgICAgICByZXR1cm4gX19hOworICAgIH0KKworICAvLyBJZiBfSXRlcmF0b3IgaXMgYSBfX25vcm1hbF9pdGVyYXRvciByZXR1cm4gaXRzIGJhc2UgKGEgcGxhaW4gcG9pbnRlciwKKyAgLy8gbm9ybWFsbHkpIG90aGVyd2lzZSByZXR1cm4gaXQgdW50b3VjaGVkLiAgU2VlIGNvcHksIGZpbGwsIC4uLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfTml0ZXJfYmFzZQorICAgIDogX0l0ZXJfYmFzZTxfSXRlcmF0b3IsIF9faXNfbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvcj46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX05pdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfdHlwZQorICAgIF9fbml0ZXJfYmFzZShfSXRlcmF0b3IgX19pdCkKKyAgICB7IHJldHVybiBzdGQ6Ol9OaXRlcl9iYXNlPF9JdGVyYXRvcj46Ol9TX2Jhc2UoX19pdCk7IH0KKworICAvLyBMaWtld2lzZSwgZm9yIG1vdmVfaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX01pdGVyX2Jhc2UKKyAgICA6IF9JdGVyX2Jhc2U8X0l0ZXJhdG9yLCBfX2lzX21vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6X192YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSBfTWl0ZXJfYmFzZTxfSXRlcmF0b3I+OjppdGVyYXRvcl90eXBlCisgICAgX19taXRlcl9iYXNlKF9JdGVyYXRvciBfX2l0KQorICAgIHsgcmV0dXJuIHN0ZDo6X01pdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6X1NfYmFzZShfX2l0KTsgfQorCisgIC8vIEFsbCBvZiB0aGVzZSBhdXhpbGlhcnkgc3RydWN0cyBzZXJ2ZSB0d28gcHVycG9zZXMuICAoMSkgUmVwbGFjZQorICAvLyBjYWxscyB0byBjb3B5IHdpdGggbWVtbW92ZSB3aGVuZXZlciBwb3NzaWJsZS4gIChNZW1tb3ZlLCBub3QgbWVtY3B5LAorICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHJhbmdlcyBhcmUgcGVybWl0dGVkIHRvIG92ZXJsYXAuKQorICAvLyAoMikgSWYgd2UncmUgdXNpbmcgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMsIHRoZW4gd3JpdGUgdGhlIGxvb3AgYXMKKyAgLy8gYSBmb3IgbG9vcCB3aXRoIGFuIGV4cGxpY2l0IGNvdW50LgorCisgIHRlbXBsYXRlPGJvb2wsIGJvb2wsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgICAgICBzdGF0aWMgX09JCisgICAgICAgIF9fY29weV9tKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwgKytfX2ZpcnN0KQorCSAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYXRlZ29yeT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmU8dHJ1ZSwgZmFsc2UsIF9DYXRlZ29yeT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICAgICAgc3RhdGljIF9PSQorICAgICAgICBfX2NvcHlfbShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgICAgICB7CisJICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19yZXN1bHQsICsrX19maXJzdCkKKwkgICAgKl9fcmVzdWx0ID0gc3RkOjptb3ZlKCpfX2ZpcnN0KTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmU8ZmFsc2UsIGZhbHNlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICAgICAgc3RhdGljIF9PSQorICAgICAgICBfX2NvcHlfbShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgICAgICB7IAorCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJPjo6ZGlmZmVyZW5jZV90eXBlIF9EaXN0YW5jZTsKKwkgIGZvcihfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pCisJICAgIHsKKwkgICAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgKytfX3Jlc3VsdDsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZTx0cnVlLCBmYWxzZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJLCB0eXBlbmFtZSBfT0k+CisgICAgICAgIHN0YXRpYyBfT0kKKyAgICAgICAgX19jb3B5X20oX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QsIF9PSSBfX3Jlc3VsdCkKKyAgICAgICAgeyAKKwkgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JST46OmRpZmZlcmVuY2VfdHlwZSBfRGlzdGFuY2U7CisJICBmb3IoX0Rpc3RhbmNlIF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKQorCSAgICB7CisJICAgICAgKl9fcmVzdWx0ID0gc3RkOjptb3ZlKCpfX2ZpcnN0KTsKKwkgICAgICArK19fZmlyc3Q7CisJICAgICAgKytfX3Jlc3VsdDsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworI2VuZGlmCisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlPgorICAgIHN0cnVjdCBfX2NvcHlfbW92ZTxfSXNNb3ZlLCB0cnVlLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZz4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBfVHAqCisgICAgICAgIF9fY29weV9tKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpCisgICAgICAgIHsKKwkgIGNvbnN0IHB0cmRpZmZfdCBfTnVtID0gX19sYXN0IC0gX19maXJzdDsKKwkgIGlmIChfTnVtKQorCSAgICBfX2J1aWx0aW5fbWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiBfTnVtKTsKKwkgIHJldHVybiBfX3Jlc3VsdCArIF9OdW07CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfSUksIHR5cGVuYW1lIF9PST4KKyAgICBpbmxpbmUgX09JCisgICAgX19jb3B5X21vdmVfYShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCwgX09JIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JST46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZUk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfT0k+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGVPOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5OworICAgICAgY29uc3QgYm9vbCBfX3NpbXBsZSA9IChfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZUkpCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9JST46Ol9fdmFsdWUKKwkgICAgICAgICAgICAgICAgICAgICAmJiBfX2lzX3BvaW50ZXI8X09JPjo6X192YWx1ZQorCQkJICAgICAmJiBfX2FyZV9zYW1lPF9WYWx1ZVR5cGVJLCBfVmFsdWVUeXBlTz46Ol9fdmFsdWUpOworCisgICAgICByZXR1cm4gc3RkOjpfX2NvcHlfbW92ZTxfSXNNb3ZlLCBfX3NpbXBsZSwKKwkgICAgICAgICAgICAgICAgICAgICAgX0NhdGVnb3J5Pjo6X19jb3B5X20oX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7CisgICAgfQorCisgIC8vIEhlbHBlcnMgZm9yIHN0cmVhbWJ1ZiBpdGVyYXRvcnMgKGVpdGhlciBpc3RyZWFtIG9yIG9zdHJlYW0pLgorICAvLyBOQjogYXZvaWQgaW5jbHVkaW5nIDxpb3Nmd2Q+LCByZWxhdGl2ZWx5IGxhcmdlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBvc3RyZWFtYnVmX2l0ZXJhdG9yOworCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIAorCSAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPiA+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihfQ2hhclQqLCBfQ2hhclQqLAorCQkgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgY2hhcl90cmFpdHM8X0NoYXJUPiA+KTsKKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLCAKKwkgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4gPjo6X190eXBlCisgICAgX19jb3B5X21vdmVfYTIoY29uc3QgX0NoYXJUKiwgY29uc3QgX0NoYXJUKiwKKwkJICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIGNoYXJfdHJhaXRzPF9DaGFyVD4gPik7CisKKyAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQ+CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwKKwkJCQkgICAgX0NoYXJUKj46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4sCisJCSAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBjaGFyX3RyYWl0czxfQ2hhclQ+ID4sIF9DaGFyVCopOworCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0lJLCB0eXBlbmFtZSBfT0k+CisgICAgaW5saW5lIF9PSQorICAgIF9fY29weV9tb3ZlX2EyKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgeworICAgICAgcmV0dXJuIF9PSShzdGQ6Ol9fY29weV9tb3ZlX2E8X0lzTW92ZT4oc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdCksCisJCQkJCSAgICAgc3RkOjpfX25pdGVyX2Jhc2UoX19sYXN0KSwKKwkJCQkJICAgICBzdGQ6Ol9fbml0ZXJfYmFzZShfX3Jlc3VsdCkpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIHJlc3VsdCArIChmaXJzdCAtIGxhc3QpCisgICAqCisgICAqICBUaGlzIGlubGluZSBmdW5jdGlvbiB3aWxsIGJvaWwgZG93biB0byBhIGNhbGwgdG8gQGMgbWVtbW92ZSB3aGVuZXZlcgorICAgKiAgcG9zc2libGUuICBGYWlsaW5nIHRoYXQsIGlmIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzIGFyZSBwYXNzZWQsIHRoZW4gdGhlCisgICAqICBsb29wIGNvdW50IHdpbGwgYmUga25vd24gKGFuZCB0aGVyZWZvcmUgYSBjYW5kaWRhdGUgZm9yIGNvbXBpbGVyCisgICAqICBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgdW5yb2xsaW5nKS4gIFJlc3VsdCBtYXkgbm90IGJlIGNvbnRhaW5lZCB3aXRoaW4KKyAgICogIFtmaXJzdCxsYXN0KTsgdGhlIGNvcHlfYmFja3dhcmQgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICoKKyAgICogIE5vdGUgdGhhdCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgcmFuZ2UgaXMgcGVybWl0dGVkIHRvIGJlIGNvbnRhaW5lZAorICAgKiAgd2l0aGluIFtmaXJzdCxsYXN0KS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJLCB0eXBlbmFtZSBfT0k+CisgICAgaW5saW5lIF9PSQorICAgIGNvcHkoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QsIF9PSSBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUk+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X09JLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIChzdGQ6Ol9fY29weV9tb3ZlX2EyPF9faXNfbW92ZV9pdGVyYXRvcjxfSUk+OjpfX3ZhbHVlPgorCSAgICAgIChzdGQ6Ol9fbWl0ZXJfYmFzZShfX2ZpcnN0KSwgc3RkOjpfX21pdGVyX2Jhc2UoX19sYXN0KSwKKwkgICAgICAgX19yZXN1bHQpKTsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAvKioKKyAgICogIEBicmllZiBNb3ZlcyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGludG8gcmVzdWx0LgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICByZXN1bHQgKyAoZmlyc3QgLSBsYXN0KQorICAgKgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuICBSZXN1bHQgbWF5IG5vdCBiZSBjb250YWluZWQgd2l0aGluCisgICAqICBbZmlyc3QsbGFzdCk7IHRoZSBtb3ZlX2JhY2t3YXJkIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAqCisgICAqICBOb3RlIHRoYXQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHJhbmdlIGlzIHBlcm1pdHRlZCB0byBiZSBjb250YWluZWQKKyAgICogIHdpdGhpbiBbZmlyc3QsbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSSwgdHlwZW5hbWUgX09JPgorICAgIGlubGluZSBfT0kKKyAgICBtb3ZlKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0LCBfT0kgX19yZXN1bHQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PSSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JST46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fY29weV9tb3ZlX2EyPHRydWU+KHN0ZDo6X19taXRlcl9iYXNlKF9fZmlyc3QpLAorCQkJCSAgICAgICBzdGQ6Ol9fbWl0ZXJfYmFzZShfX2xhc3QpLCBfX3Jlc3VsdCk7CisgICAgfQorCisjZGVmaW5lIF9HTElCQ1hYX01PVkUzKF9UcCwgX1VwLCBfVnApIHN0ZDo6bW92ZShfVHAsIF9VcCwgX1ZwKQorI2Vsc2UKKyNkZWZpbmUgX0dMSUJDWFhfTU9WRTMoX1RwLCBfVXAsIF9WcCkgc3RkOjpjb3B5KF9UcCwgX1VwLCBfVnApCisjZW5kaWYKKworICB0ZW1wbGF0ZTxib29sLCBib29sLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmVfYmFja3dhcmQKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgICAgICBzdGF0aWMgX0JJMgorICAgICAgICBfX2NvcHlfbW92ZV9iKF9CSTEgX19maXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpCisgICAgICAgIHsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgKi0tX19yZXN1bHQgPSAqLS1fX2xhc3Q7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2F0ZWdvcnk+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkPHRydWUsIGZhbHNlLCBfQ2F0ZWdvcnk+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICAgICAgc3RhdGljIF9CSTIKKyAgICAgICAgX19jb3B5X21vdmVfYihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgICAgICB7CisJICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICAgICotLV9fcmVzdWx0ID0gc3RkOjptb3ZlKCotLV9fbGFzdCk7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fY29weV9tb3ZlX2JhY2t3YXJkPGZhbHNlLCBmYWxzZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICAgICAgc3RhdGljIF9CSTIKKyAgICAgICAgX19jb3B5X21vdmVfYihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgICAgICB7CisJICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OmRpZmZlcmVuY2VfdHlwZSBfX247CisJICBmb3IgKF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKQorCSAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmVfYmFja3dhcmQ8dHJ1ZSwgZmFsc2UsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9CSTEsIHR5cGVuYW1lIF9CSTI+CisgICAgICAgIHN0YXRpYyBfQkkyCisgICAgICAgIF9fY29weV9tb3ZlX2IoX0JJMSBfX2ZpcnN0LCBfQkkxIF9fbGFzdCwgX0JJMiBfX3Jlc3VsdCkKKyAgICAgICAgeworCSAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTE+OjpkaWZmZXJlbmNlX3R5cGUgX19uOworCSAgZm9yIChfX24gPSBfX2xhc3QgLSBfX2ZpcnN0OyBfX24gPiAwOyAtLV9fbikKKwkgICAgKi0tX19yZXN1bHQgPSBzdGQ6Om1vdmUoKi0tX19sYXN0KTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZT4KKyAgICBzdHJ1Y3QgX19jb3B5X21vdmVfYmFja3dhcmQ8X0lzTW92ZSwgdHJ1ZSwgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWc+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgX1RwKgorICAgICAgICBfX2NvcHlfbW92ZV9iKGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpCisgICAgICAgIHsKKwkgIGNvbnN0IHB0cmRpZmZfdCBfTnVtID0gX19sYXN0IC0gX19maXJzdDsKKwkgIGlmIChfTnVtKQorCSAgICBfX2J1aWx0aW5fbWVtbW92ZShfX3Jlc3VsdCAtIF9OdW0sIF9fZmlyc3QsIHNpemVvZihfVHApICogX051bSk7CisJICByZXR1cm4gX19yZXN1bHQgLSBfTnVtOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICBpbmxpbmUgX0JJMgorICAgIF9fY29weV9tb3ZlX2JhY2t3YXJkX2EoX0JJMSBfX2ZpcnN0LCBfQkkxIF9fbGFzdCwgX0JJMiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTI+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKKyAgICAgIGNvbnN0IGJvb2wgX19zaW1wbGUgPSAoX19pc190cml2aWFsKF9WYWx1ZVR5cGUxKQorCSAgICAgICAgICAgICAgICAgICAgICYmIF9faXNfcG9pbnRlcjxfQkkxPjo6X192YWx1ZQorCSAgICAgICAgICAgICAgICAgICAgICYmIF9faXNfcG9pbnRlcjxfQkkyPjo6X192YWx1ZQorCQkJICAgICAmJiBfX2FyZV9zYW1lPF9WYWx1ZVR5cGUxLCBfVmFsdWVUeXBlMj46Ol9fdmFsdWUpOworCisgICAgICByZXR1cm4gc3RkOjpfX2NvcHlfbW92ZV9iYWNrd2FyZDxfSXNNb3ZlLCBfX3NpbXBsZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NhdGVnb3J5Pjo6X19jb3B5X21vdmVfYihfX2ZpcnN0LAorCQkJCQkJCQkgX19sYXN0LAorCQkJCQkJCQkgX19yZXN1bHQpOworICAgIH0KKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9CSTEsIHR5cGVuYW1lIF9CSTI+CisgICAgaW5saW5lIF9CSTIKKyAgICBfX2NvcHlfbW92ZV9iYWNrd2FyZF9hMihfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHJldHVybiBfQkkyKHN0ZDo6X19jb3B5X21vdmVfYmFja3dhcmRfYTxfSXNNb3ZlPgorCQkgIChzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0KSwgc3RkOjpfX25pdGVyX2Jhc2UoX19sYXN0KSwKKwkJICAgc3RkOjpfX25pdGVyX2Jhc2UoX19yZXN1bHQpKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGludG8gcmVzdWx0LgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgQSBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIHJlc3VsdCAtIChmaXJzdCAtIGxhc3QpCisgICAqCisgICAqICBUaGUgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjb3B5LCBidXQgc3RhcnRzIGF0IHRoZSBlbmQgb2YgdGhlCisgICAqICByYW5nZSBhbmQgd29ya3MgaXRzIHdheSB0byB0aGUgc3RhcnQsIHJldHVybmluZyB0aGUgc3RhcnQgb2YgdGhlIHJlc3VsdC4KKyAgICogIFRoaXMgaW5saW5lIGZ1bmN0aW9uIHdpbGwgYm9pbCBkb3duIHRvIGEgY2FsbCB0byBAYyBtZW1tb3ZlIHdoZW5ldmVyCisgICAqICBwb3NzaWJsZS4gIEZhaWxpbmcgdGhhdCwgaWYgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMgYXJlIHBhc3NlZCwgdGhlbiB0aGUKKyAgICogIGxvb3AgY291bnQgd2lsbCBiZSBrbm93biAoYW5kIHRoZXJlZm9yZSBhIGNhbmRpZGF0ZSBmb3IgY29tcGlsZXIKKyAgICogIG9wdGltaXphdGlvbnMgc3VjaCBhcyB1bnJvbGxpbmcpLgorICAgKgorICAgKiAgUmVzdWx0IG1heSBub3QgYmUgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KS4gIFVzZSBjb3B5IGluc3RlYWQuICBOb3RlCisgICAqICB0aGF0IHRoZSBzdGFydCBvZiB0aGUgb3V0cHV0IHJhbmdlIG1heSBvdmVybGFwIFtmaXJzdCxsYXN0KS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JJMSwgdHlwZW5hbWUgX0JJMj4KKyAgICBpbmxpbmUgX0JJMgorICAgIGNvcHlfYmFja3dhcmQoX0JJMSBfX2ZpcnN0LCBfQkkxIF9fbGFzdCwgX0JJMiBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3JDb25jZXB0PF9CSTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X0JJMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTE+Ojp2YWx1ZV90eXBlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHJldHVybiAoc3RkOjpfX2NvcHlfbW92ZV9iYWNrd2FyZF9hMjxfX2lzX21vdmVfaXRlcmF0b3I8X0JJMT46Ol9fdmFsdWU+CisJICAgICAgKHN0ZDo6X19taXRlcl9iYXNlKF9fZmlyc3QpLCBzdGQ6Ol9fbWl0ZXJfYmFzZShfX2xhc3QpLAorCSAgICAgICBfX3Jlc3VsdCkpOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8qKgorICAgKiAgQGJyaWVmIE1vdmVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHJlc3VsdCBBIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmVzdWx0IC0gKGZpcnN0IC0gbGFzdCkKKyAgICoKKyAgICogIFRoZSBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIG1vdmUsIGJ1dCBzdGFydHMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICogIHJhbmdlIGFuZCB3b3JrcyBpdHMgd2F5IHRvIHRoZSBzdGFydCwgcmV0dXJuaW5nIHRoZSBzdGFydCBvZiB0aGUgcmVzdWx0LgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuCisgICAqCisgICAqICBSZXN1bHQgbWF5IG5vdCBiZSBpbiB0aGUgcmFuZ2UgKGZpcnN0LGxhc3RdLiAgVXNlIG1vdmUgaW5zdGVhZC4gIE5vdGUKKyAgICogIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgcmFuZ2UgbWF5IG92ZXJsYXAgW2ZpcnN0LGxhc3QpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQkkxLCB0eXBlbmFtZSBfQkkyPgorICAgIGlubGluZSBfQkkyCisgICAgbW92ZV9iYWNrd2FyZChfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpZGlyZWN0aW9uYWxJdGVyYXRvckNvbmNlcHQ8X0JJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDxfQkkyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JJMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQkkyPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19jb3B5X21vdmVfYmFja3dhcmRfYTI8dHJ1ZT4oc3RkOjpfX21pdGVyX2Jhc2UoX19maXJzdCksCisJCQkJCQlzdGQ6Ol9fbWl0ZXJfYmFzZShfX2xhc3QpLAorCQkJCQkJX19yZXN1bHQpOworICAgIH0KKworI2RlZmluZSBfR0xJQkNYWF9NT1ZFX0JBQ0tXQVJEMyhfVHAsIF9VcCwgX1ZwKSBzdGQ6Om1vdmVfYmFja3dhcmQoX1RwLCBfVXAsIF9WcCkKKyNlbHNlCisjZGVmaW5lIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9UcCwgX1VwLCBfVnApIHN0ZDo6Y29weV9iYWNrd2FyZChfVHAsIF9VcCwgX1ZwKQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IV9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWUsIHZvaWQ+OjpfX3R5cGUKKyAgICBfX2ZpbGxfYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorIAkgICAgIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fdmFsdWU7CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX3NjYWxhcjxfVHA+OjpfX3ZhbHVlLCB2b2lkPjo6X190eXBlCisgICAgX19maWxsX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX190bXAgPSBfX3ZhbHVlOworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJKl9fZmlyc3QgPSBfX3RtcDsKKyAgICB9CisKKyAgLy8gU3BlY2lhbGl6YXRpb246IGZvciBjaGFyIHR5cGVzIHdlIGNhbiB1c2UgbWVtc2V0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2J5dGU8X1RwPjo6X192YWx1ZSwgdm9pZD46Ol9fdHlwZQorICAgIF9fZmlsbF9hKF9UcCogX19maXJzdCwgX1RwKiBfX2xhc3QsIGNvbnN0IF9UcCYgX19jKQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX3RtcCA9IF9fYzsKKyAgICAgIF9fYnVpbHRpbl9tZW1zZXQoX19maXJzdCwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oX190bXApLAorCQkgICAgICAgX19sYXN0IC0gX19maXJzdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEZpbGxzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgd2l0aCBjb3BpZXMgb2YgdmFsdWUuCisgICAqICBAaW5ncm91cCBtdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0ICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QgICBBIGZvcndhcmQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbHVlICBBIHJlZmVyZW5jZS10by1jb25zdCBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhIHJhbmdlIHdpdGggY29waWVzIG9mIHRoZSBzYW1lIHZhbHVlLiAgRm9yIGNoYXIKKyAgICogIHR5cGVzIGZpbGxpbmcgY29udGlndW91cyBhcmVhcyBvZiBtZW1vcnksIHRoaXMgYmVjb21lcyBhbiBpbmxpbmUgY2FsbAorICAgKiAgdG8gQGMgbWVtc2V0IG9yIEBjIHdtZW1zZXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIGZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHN0ZDo6X19maWxsX2Eoc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdCksIHN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdCksCisJCSAgICBfX3ZhbHVlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IV9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWUsIF9PdXRwdXRJdGVyYXRvcj46Ol9fdHlwZQorICAgIF9fZmlsbF9uX2EoX091dHB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGZvciAoX19kZWNsdHlwZShfX24gKyAwKSBfX25pdGVyID0gX19uOworCSAgIF9fbml0ZXIgPiAwOyAtLV9fbml0ZXIsICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fdmFsdWU7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19zY2FsYXI8X1RwPjo6X192YWx1ZSwgX091dHB1dEl0ZXJhdG9yPjo6X190eXBlCisgICAgX19maWxsX25fYShfT3V0cHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fdG1wID0gX192YWx1ZTsKKyAgICAgIGZvciAoX19kZWNsdHlwZShfX24gKyAwKSBfX25pdGVyID0gX19uOworCSAgIF9fbml0ZXIgPiAwOyAtLV9fbml0ZXIsICsrX19maXJzdCkKKwkqX19maXJzdCA9IF9fdG1wOworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2J5dGU8X1RwPjo6X192YWx1ZSwgX1RwKj46Ol9fdHlwZQorICAgIF9fZmlsbF9uX2EoX1RwKiBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX19jKQorICAgIHsKKyAgICAgIHN0ZDo6X19maWxsX2EoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19jKTsKKyAgICAgIHJldHVybiBfX2ZpcnN0ICsgX19uOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaWxscyB0aGUgcmFuZ2UgW2ZpcnN0LGZpcnN0K24pIHdpdGggY29waWVzIG9mIHZhbHVlLgorICAgKiAgQGluZ3JvdXAgbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBuICAgICAgVGhlIGNvdW50IG9mIGNvcGllcyB0byBwZXJmb3JtLgorICAgKiAgQHBhcmFtICB2YWx1ZSAgQSByZWZlcmVuY2UtdG8tY29uc3Qgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICAgVGhlIGl0ZXJhdG9yIGF0IGZpcnN0K24uCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgcmFuZ2Ugd2l0aCBjb3BpZXMgb2YgdGhlIHNhbWUgdmFsdWUuICBGb3IgY2hhcgorICAgKiAgdHlwZXMgZmlsbGluZyBjb250aWd1b3VzIGFyZWFzIG9mIG1lbW9yeSwgdGhpcyBiZWNvbWVzIGFuIGlubGluZSBjYWxsCisgICAqICB0byBAYyBtZW1zZXQgb3IgQCB3bWVtc2V0LgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgRFIgODY1LiBNb3JlIGFsZ29yaXRobXMgdGhhdCB0aHJvdyBhd2F5IGluZm9ybWF0aW9uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PSSwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX09JCisgICAgZmlsbF9uKF9PSSBfX2ZpcnN0LCBfU2l6ZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X09JLCBfVHA+KQorCisgICAgICByZXR1cm4gX09JKHN0ZDo6X19maWxsX25fYShzdGQ6Ol9fbml0ZXJfYmFzZShfX2ZpcnN0KSwgX19uLCBfX3ZhbHVlKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0Jvb2xUeXBlPgorICAgIHN0cnVjdCBfX2VxdWFsCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICAgICAgc3RhdGljIGJvb2wKKyAgICAgICAgZXF1YWwoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLCBfSUkyIF9fZmlyc3QyKQorICAgICAgICB7CisJICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKKwkgICAgaWYgKCEoKl9fZmlyc3QxID09ICpfX2ZpcnN0MikpCisJICAgICAgcmV0dXJuIGZhbHNlOworCSAgcmV0dXJuIHRydWU7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2VxdWFsPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgYm9vbAorICAgICAgICBlcXVhbChjb25zdCBfVHAqIF9fZmlyc3QxLCBjb25zdCBfVHAqIF9fbGFzdDEsIGNvbnN0IF9UcCogX19maXJzdDIpCisgICAgICAgIHsKKwkgIHJldHVybiAhX19idWlsdGluX21lbWNtcChfX2ZpcnN0MSwgX19maXJzdDIsIHNpemVvZihfVHApCisJCQkJICAgKiAoX19sYXN0MSAtIF9fZmlyc3QxKSk7CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lJMSwgdHlwZW5hbWUgX0lJMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fZXF1YWxfYXV4KF9JSTEgX19maXJzdDEsIF9JSTEgX19sYXN0MSwgX0lJMiBfX2ZpcnN0MikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTI+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGUyOworICAgICAgY29uc3QgYm9vbCBfX3NpbXBsZSA9IChfX2lzX2ludGVnZXI8X1ZhbHVlVHlwZTE+OjpfX3ZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9JSTE+OjpfX3ZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgJiYgX19pc19wb2ludGVyPF9JSTI+OjpfX3ZhbHVlCisJCQkgICAgICYmIF9fYXJlX3NhbWU8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPjo6X192YWx1ZSk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fZXF1YWw8X19zaW1wbGU+OjplcXVhbChfX2ZpcnN0MSwgX19sYXN0MSwgX19maXJzdDIpOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19sY19yYWkKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgICAgICBzdGF0aWMgX0lJMQorICAgICAgICBfX25ld2xhc3QxKF9JSTEsIF9JSTEgX19sYXN0MSwgX0lJMiwgX0lJMikKKyAgICAgICAgeyByZXR1cm4gX19sYXN0MTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUk+CisgICAgICAgIHN0YXRpYyBib29sCisgICAgICAgIF9fY25kMihfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkKKyAgICAgICAgeyByZXR1cm4gX19maXJzdCAhPSBfX2xhc3Q7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19sY19yYWk8cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUkxLCB0eXBlbmFtZSBfUkFJMj4KKyAgICAgICAgc3RhdGljIF9SQUkxCisgICAgICAgIF9fbmV3bGFzdDEoX1JBSTEgX19maXJzdDEsIF9SQUkxIF9fbGFzdDEsCisJCSAgIF9SQUkyIF9fZmlyc3QyLCBfUkFJMiBfX2xhc3QyKQorICAgICAgICB7CisJICBjb25zdCB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JBSTE+OjpkaWZmZXJlbmNlX3R5cGUKKwkgICAgX19kaWZmMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKwkgIGNvbnN0IHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUkFJMj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICBfX2RpZmYyID0gX19sYXN0MiAtIF9fZmlyc3QyOworCSAgcmV0dXJuIF9fZGlmZjIgPCBfX2RpZmYxID8gX19maXJzdDEgKyBfX2RpZmYyIDogX19sYXN0MTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SQUk+CisgICAgICAgIHN0YXRpYyBib29sCisgICAgICAgIF9fY25kMihfUkFJLCBfUkFJKQorICAgICAgICB7IHJldHVybiB0cnVlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Cb29sVHlwZT4KKyAgICBzdHJ1Y3QgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZQorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgICAgIHN0YXRpYyBib29sIF9fbGMoX0lJMSwgX0lJMSwgX0lJMiwgX0lJMik7CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Cb29sVHlwZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgICAgYm9vbAorICAgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZTxfQm9vbFR5cGU+OjoKKyAgICAgIF9fbGMoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLCBfSUkyIF9fZmlyc3QyLCBfSUkyIF9fbGFzdDIpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTE7CisJdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTI7CisJdHlwZWRlZiBzdGQ6Ol9fbGNfcmFpPF9DYXRlZ29yeTEsIF9DYXRlZ29yeTI+IAlfX3JhaV90eXBlOworCQorCV9fbGFzdDEgPSBfX3JhaV90eXBlOjpfX25ld2xhc3QxKF9fZmlyc3QxLCBfX2xhc3QxLAorCQkJCQkgX19maXJzdDIsIF9fbGFzdDIpOworCWZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fcmFpX3R5cGU6Ol9fY25kMihfX2ZpcnN0MiwgX19sYXN0Mik7CisJICAgICArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCSAgeworCSAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgICAgIHJldHVybiB0cnVlOworCSAgICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwlyZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworICAgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZTx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBzdGF0aWMgYm9vbAorICAgICAgICBfX2xjKGNvbnN0IF9UcCogX19maXJzdDEsIGNvbnN0IF9UcCogX19sYXN0MSwKKwkgICAgIGNvbnN0IF9VcCogX19maXJzdDIsIGNvbnN0IF9VcCogX19sYXN0MikKKwl7CisJICBjb25zdCBzaXplX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOworCSAgY29uc3Qgc2l6ZV90IF9fbGVuMiA9IF9fbGFzdDIgLSBfX2ZpcnN0MjsKKwkgIGNvbnN0IGludCBfX3Jlc3VsdCA9IF9fYnVpbHRpbl9tZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLAorCQkJCQkJc3RkOjptaW4oX19sZW4xLCBfX2xlbjIpKTsKKwkgIHJldHVybiBfX3Jlc3VsdCAhPSAwID8gX19yZXN1bHQgPCAwIDogX19sZW4xIDwgX19sZW4yOworCX0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTI+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlX2F1eChfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsCisJCQkJICBfSUkyIF9fZmlyc3QyLCBfSUkyIF9fbGFzdDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKyAgICAgIGNvbnN0IGJvb2wgX19zaW1wbGUgPQorCShfX2lzX2J5dGU8X1ZhbHVlVHlwZTE+OjpfX3ZhbHVlICYmIF9faXNfYnl0ZTxfVmFsdWVUeXBlMj46Ol9fdmFsdWUKKwkgJiYgIV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfVmFsdWVUeXBlMT46Ol9faXNfc2lnbmVkCisJICYmICFfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1ZhbHVlVHlwZTI+OjpfX2lzX3NpZ25lZAorCSAmJiBfX2lzX3BvaW50ZXI8X0lJMT46Ol9fdmFsdWUKKwkgJiYgX19pc19wb2ludGVyPF9JSTI+OjpfX3ZhbHVlKTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19sZXhpY29ncmFwaGljYWxfY29tcGFyZTxfX3NpbXBsZT46Ol9fbGMoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkJICAgIF9fZmlyc3QyLCBfX2xhc3QyKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHdoaWNoIEBhIHZhbCBjb3VsZCBiZSBpbnNlcnRlZAorICAgKiAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yZGVyaW5nLgorICAgKiAgQHBhcmFtICBmaXJzdCAgIEFuIGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgIEFub3RoZXIgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHZhbCAgICAgVGhlIHNlYXJjaCB0ZXJtLgorICAgKiAgQHJldHVybiAgICAgICAgIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IDxlbT5ub3QgbGVzcworICAgKiAgICAgICAgICAgICAgICAgIHRoYW48L2VtPiBAYSB2YWwsIG9yIGVuZCgpIGlmIGV2ZXJ5IGVsZW1lbnQgaXMgbGVzcyB0aGFuIAorICAgKiAgICAgICAgICAgICAgICAgIEBhIHZhbC4KKyAgICogIEBpbmdyb3VwIGJpbmFyeV9zZWFyY2hfYWxnb3JpdGhtcworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIGxvd2VyX2JvdW5kKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCWNvbnN0IF9UcCYgX192YWwpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuT3BDb25jZXB0PF9WYWx1ZVR5cGUsIF9UcD4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX19maXJzdCwgX19sYXN0LCBfX3ZhbCk7CisKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xlbiA+IDApCisJeworCSAgX0Rpc3RhbmNlVHlwZSBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgX0ZvcndhcmRJdGVyYXRvciBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICBzdGQ6OmFkdmFuY2UoX19taWRkbGUsIF9faGFsZik7CisJICBpZiAoKl9fbWlkZGxlIDwgX192YWwpCisJICAgIHsKKwkgICAgICBfX2ZpcnN0ID0gX19taWRkbGU7CisJICAgICAgKytfX2ZpcnN0OworCSAgICAgIF9fbGVuID0gX19sZW4gLSBfX2hhbGYgLSAxOworCSAgICB9CisJICBlbHNlCisJICAgIF9fbGVuID0gX19oYWxmOworCX0KKyAgICAgIHJldHVybiBfX2ZpcnN0OworICAgIH0KKworICAvLy8gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIHNvcnQgcm91dGluZXMgYW5kIGZvciByYW5kb20udGNjLgorICAvLyAgUHJlY29uZGl0aW9uOiBfX24gPiAwLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2l6ZT4KKyAgICBpbmxpbmUgX1NpemUKKyAgICBfX2xnKF9TaXplIF9fbikKKyAgICB7CisgICAgICBfU2l6ZSBfX2s7CisgICAgICBmb3IgKF9fayA9IDA7IF9fbiAhPSAwOyBfX24gPj49IDEpCisJKytfX2s7CisgICAgICByZXR1cm4gX19rIC0gMTsKKyAgICB9CisKKyAgaW5saW5lIGludAorICBfX2xnKGludCBfX24pCisgIHsgcmV0dXJuIHNpemVvZihpbnQpICogX19DSEFSX0JJVF9fICAtIDEgLSBfX2J1aWx0aW5fY2x6KF9fbik7IH0KKworICBpbmxpbmUgbG9uZworICBfX2xnKGxvbmcgX19uKQorICB7IHJldHVybiBzaXplb2YobG9uZykgKiBfX0NIQVJfQklUX18gLSAxIC0gX19idWlsdGluX2NsemwoX19uKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgX19sZyhsb25nIGxvbmcgX19uKQorICB7IHJldHVybiBzaXplb2YobG9uZyBsb25nKSAqIF9fQ0hBUl9CSVRfXyAtIDEgLSBfX2J1aWx0aW5fY2x6bGwoX19uKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICAvKioKKyAgICogIEBicmllZiBUZXN0cyBhIHJhbmdlIGZvciBlbGVtZW50LXdpc2UgZXF1YWxpdHkuCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEEgYm9vbGVhbiB0cnVlIG9yIGZhbHNlLgorICAgKgorICAgKiAgVGhpcyBjb21wYXJlcyB0aGUgZWxlbWVudHMgb2YgdHdvIHJhbmdlcyB1c2luZyBAYyA9PSBhbmQgcmV0dXJucyB0cnVlIG9yCisgICAqICBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhlCisgICAqICByYW5nZXMgYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLCBfSUkyIF9fZmlyc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUkyPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxPcENvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkxPjo6dmFsdWVfdHlwZSwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JSTI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fZXF1YWxfYXV4KHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QxKSwKKwkJCSAgICAgIHN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdDEpLAorCQkJICAgICAgc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdDIpKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgVGVzdHMgYSByYW5nZSBmb3IgZWxlbWVudC13aXNlIGVxdWFsaXR5LgorICAgKiAgQGluZ3JvdXAgbm9uX211dGF0aW5nX2FsZ29yaXRobXMKKyAgICogIEBwYXJhbSAgZmlyc3QxICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSBiaW5hcnlfcHJlZCBBIGJpbmFyeSBwcmVkaWNhdGUgQGxpbmsgZnVuY3RvcnMKKyAgICogICAgICAgICAgICAgICAgICBmdW5jdG9yQGVuZGxpbmsuCisgICAqICBAcmV0dXJuICAgICAgICAgQSBib29sZWFuIHRydWUgb3IgZmFsc2UuCisgICAqCisgICAqICBUaGlzIGNvbXBhcmVzIHRoZSBlbGVtZW50cyBvZiB0d28gcmFuZ2VzIHVzaW5nIHRoZSBiaW5hcnlfcHJlZAorICAgKiAgcGFyYW1ldGVyLCBhbmQgcmV0dXJucyB0cnVlIG9yCisgICAqICBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgdGhlCisgICAqICByYW5nZXMgYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUl0ZXIxLCB0eXBlbmFtZSBfSUl0ZXIyLCB0eXBlbmFtZSBfQmluYXJ5UHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgZXF1YWwoX0lJdGVyMSBfX2ZpcnN0MSwgX0lJdGVyMSBfX2xhc3QxLAorCSAgX0lJdGVyMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSXRlcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSUl0ZXIyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCWlmICghYm9vbChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkpCisJICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgUGVyZm9ybXMgQGIgZGljdGlvbmFyeSBjb21wYXJpc29uIG9uIHJhbmdlcy4KKyAgICogIEBpbmdyb3VwIHNvcnRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MiAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIEEgYm9vbGVhbiB0cnVlIG9yIGZhbHNlLgorICAgKgorICAgKiAgPGVtPlJldHVybnMgdHJ1ZSBpZiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZGVmaW5lZCBieSB0aGUgcmFuZ2UKKyAgICogIFtmaXJzdDEsbGFzdDEpIGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMKKyAgICogIGRlZmluZWQgYnkgdGhlIHJhbmdlIFtmaXJzdDIsbGFzdDIpLiAgUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuPC9lbT4KKyAgICogIChRdW90ZWQgZnJvbSBbMjUuMy44XS8xLikgIElmIHRoZSBpdGVyYXRvcnMgYXJlIGFsbCBjaGFyYWN0ZXIgcG9pbnRlcnMsCisgICAqICB0aGVuIHRoaXMgaXMgYW4gaW5saW5lIGNhbGwgdG8gQGMgbWVtY21wLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSUkxLCB0eXBlbmFtZSBfSUkyPgorICAgIGlubGluZSBib29sCisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lJMSBfX2ZpcnN0MSwgX0lJMSBfX2xhc3QxLAorCQkJICAgIF9JSTIgX19maXJzdDIsIF9JSTIgX19sYXN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlMjsKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbk9wQ29uY2VwdDxfVmFsdWVUeXBlMiwgX1ZhbHVlVHlwZTE+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIHJldHVybiBzdGQ6Ol9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfYXV4KHN0ZDo6X19uaXRlcl9iYXNlKF9fZmlyc3QxKSwKKwkJCQkJCXN0ZDo6X19uaXRlcl9iYXNlKF9fbGFzdDEpLAorCQkJCQkJc3RkOjpfX25pdGVyX2Jhc2UoX19maXJzdDIpLAorCQkJCQkJc3RkOjpfX25pdGVyX2Jhc2UoX19sYXN0MikpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBQZXJmb3JtcyBAYiBkaWN0aW9uYXJ5IGNvbXBhcmlzb24gb24gcmFuZ2VzLgorICAgKiAgQGluZ3JvdXAgc29ydGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QyICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGNvbXAgIEEgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JAZW5kbGluay4KKyAgICogIEByZXR1cm4gICBBIGJvb2xlYW4gdHJ1ZSBvciBmYWxzZS4KKyAgICoKKyAgICogIFRoZSBzYW1lIGFzIHRoZSBmb3VyLXBhcmFtZXRlciBAYyBsZXhpY29ncmFwaGljYWxfY29tcGFyZSwgYnV0IHVzZXMgdGhlCisgICAqICBjb21wIHBhcmFtZXRlciBpbnN0ZWFkIG9mIEBjIDwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JSTEsIHR5cGVuYW1lIF9JSTIsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGJvb2wKKyAgICBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSUkxIF9fZmlyc3QxLCBfSUkxIF9fbGFzdDEsCisJCQkgICAgX0lJMiBfX2ZpcnN0MiwgX0lJMiBfX2xhc3QyLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lJMT46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSUkyPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5MjsKKyAgICAgIHR5cGVkZWYgc3RkOjpfX2xjX3JhaTxfQ2F0ZWdvcnkxLCBfQ2F0ZWdvcnkyPiAJX19yYWlfdHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lJMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JSTI+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIF9fbGFzdDEgPSBfX3JhaV90eXBlOjpfX25ld2xhc3QxKF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7CisgICAgICBmb3IgKDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX3JhaV90eXBlOjpfX2NuZDIoX19maXJzdDIsIF9fbGFzdDIpOworCSAgICsrX19maXJzdDEsICsrX19maXJzdDIpCisJeworCSAgaWYgKF9fY29tcCgqX19maXJzdDEsICpfX2ZpcnN0MikpCisJICAgIHJldHVybiB0cnVlOworCSAgaWYgKF9fY29tcCgqX19maXJzdDIsICpfX2ZpcnN0MSkpCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDEgPT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kcyB0aGUgcGxhY2VzIGluIHJhbmdlcyB3aGljaCBkb24ndCBtYXRjaC4KKyAgICogIEBpbmdyb3VwIG5vbl9tdXRhdGluZ19hbGdvcml0aG1zCisgICAqICBAcGFyYW0gIGZpcnN0MSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGxhc3QxICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgQSBwYWlyIG9mIGl0ZXJhdG9ycyBwb2ludGluZyB0byB0aGUgZmlyc3QgbWlzbWF0Y2guCisgICAqCisgICAqICBUaGlzIGNvbXBhcmVzIHRoZSBlbGVtZW50cyBvZiB0d28gcmFuZ2VzIHVzaW5nIEBjID09IGFuZCByZXR1cm5zIGEgcGFpcgorICAgKiAgb2YgaXRlcmF0b3JzLiAgVGhlIGZpcnN0IGl0ZXJhdG9yIHBvaW50cyBpbnRvIHRoZSBmaXJzdCByYW5nZSwgdGhlCisgICAqICBzZWNvbmQgaXRlcmF0b3IgcG9pbnRzIGludG8gdGhlIHNlY29uZCByYW5nZSwgYW5kIHRoZSBlbGVtZW50cyBwb2ludGVkCisgICAqICB0byBieSB0aGUgaXRlcmF0b3JzIGFyZSBub3QgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyPgorICAgIHBhaXI8X0lucHV0SXRlcmF0b3IxLCBfSW5wdXRJdGVyYXRvcjI+CisgICAgbWlzbWF0Y2goX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9FcXVhbE9wQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjI+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICpfX2ZpcnN0MSA9PSAqX19maXJzdDIpCisgICAgICAgIHsKKwkgICsrX19maXJzdDE7CisJICArK19fZmlyc3QyOworICAgICAgICB9CisgICAgICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRmluZHMgdGhlIHBsYWNlcyBpbiByYW5nZXMgd2hpY2ggZG9uJ3QgbWF0Y2guCisgICAqICBAaW5ncm91cCBub25fbXV0YXRpbmdfYWxnb3JpdGhtcworICAgKiAgQHBhcmFtICBmaXJzdDEgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0MSAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtIGJpbmFyeV9wcmVkIEEgYmluYXJ5IHByZWRpY2F0ZSBAbGluayBmdW5jdG9ycworICAgKiAgICAgICAgIGZ1bmN0b3JAZW5kbGluay4KKyAgICogIEByZXR1cm4gICBBIHBhaXIgb2YgaXRlcmF0b3JzIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBtaXNtYXRjaC4KKyAgICoKKyAgICogIFRoaXMgY29tcGFyZXMgdGhlIGVsZW1lbnRzIG9mIHR3byByYW5nZXMgdXNpbmcgdGhlIGJpbmFyeV9wcmVkCisgICAqICBwYXJhbWV0ZXIsIGFuZCByZXR1cm5zIGEgcGFpcgorICAgKiAgb2YgaXRlcmF0b3JzLiAgVGhlIGZpcnN0IGl0ZXJhdG9yIHBvaW50cyBpbnRvIHRoZSBmaXJzdCByYW5nZSwgdGhlCisgICAqICBzZWNvbmQgaXRlcmF0b3IgcG9pbnRzIGludG8gdGhlIHNlY29uZCByYW5nZSwgYW5kIHRoZSBlbGVtZW50cyBwb2ludGVkCisgICAqICB0byBieSB0aGUgaXRlcmF0b3JzIGFyZSBub3QgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgcGFpcjxfSW5wdXRJdGVyYXRvcjEsIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBtaXNtYXRjaChfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCSAgICAgX0lucHV0SXRlcmF0b3IyIF9fZmlyc3QyLCBfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIGJvb2woX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpKQorICAgICAgICB7CisJICArK19fZmlyc3QxOworCSAgKytfX2ZpcnN0MjsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHBhaXI8X0lucHV0SXRlcmF0b3IxLCBfSW5wdXRJdGVyYXRvcjI+KF9fZmlyc3QxLCBfX2ZpcnN0Mik7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0FMR08KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBOQjogVGhpcyBmaWxlIGlzIGluY2x1ZGVkIHdpdGhpbiBtYW55IG90aGVyIEMrKyBpbmNsdWRlcywgYXMgYSB3YXkKKy8vIG9mIGdldHRpbmcgdGhlIGJhc2UgYWxnb3JpdGhtcy4gU28sIG1ha2Ugc3VyZSB0aGF0IHBhcmFsbGVsIGJpdHMKKy8vIGNvbWUgaW4gdG9vIGlmIHJlcXVlc3RlZC4gCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgaW5jbHVkZSA8cGFyYWxsZWwvYWxnb2Jhc2UuaD4KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfYnZlY3Rvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9idmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmMTBkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfYnZlY3Rvci5oCkBAIC0wLDAgKzEsMTA2MSBAQAorLy8gdmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKy8vIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OQorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2J2ZWN0b3IuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZlY3Rvcn0KKyAqLworCisjaWZuZGVmIF9TVExfQlZFQ1RPUl9ICisjZGVmaW5lIF9TVExfQlZFQ1RPUl9IIDEKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfQml0X3R5cGU7CisgIGVudW0geyBfU193b3JkX2JpdCA9IGludChfX0NIQVJfQklUX18gKiBzaXplb2YoX0JpdF90eXBlKSkgfTsKKworICBzdHJ1Y3QgX0JpdF9yZWZlcmVuY2UKKyAgeworICAgIF9CaXRfdHlwZSAqIF9NX3A7CisgICAgX0JpdF90eXBlIF9NX21hc2s7CisKKyAgICBfQml0X3JlZmVyZW5jZShfQml0X3R5cGUgKiBfX3gsIF9CaXRfdHlwZSBfX3kpCisgICAgOiBfTV9wKF9feCksIF9NX21hc2soX195KSB7IH0KKworICAgIF9CaXRfcmVmZXJlbmNlKCkgOiBfTV9wKDApLCBfTV9tYXNrKDApIHsgfQorCisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgeyByZXR1cm4gISEoKl9NX3AgJiBfTV9tYXNrKTsgfQorCisgICAgX0JpdF9yZWZlcmVuY2UmCisgICAgb3BlcmF0b3I9KGJvb2wgX194KQorICAgIHsKKyAgICAgIGlmIChfX3gpCisJKl9NX3AgfD0gX01fbWFzazsKKyAgICAgIGVsc2UKKwkqX01fcCAmPSB+X01fbWFzazsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBfQml0X3JlZmVyZW5jZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkKKyAgICB7IHJldHVybiAqdGhpcyA9IGJvb2woX194KTsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgY29uc3QKKyAgICB7IHJldHVybiBib29sKCp0aGlzKSA9PSBib29sKF9feCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9feCkgY29uc3QKKyAgICB7IHJldHVybiAhYm9vbCgqdGhpcykgJiYgYm9vbChfX3gpOyB9CisKKyAgICB2b2lkCisgICAgZmxpcCgpCisgICAgeyAqX01fcCBePSBfTV9tYXNrOyB9CisgIH07CisKKyAgc3RydWN0IF9CaXRfaXRlcmF0b3JfYmFzZQorICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIGJvb2w+CisgIHsKKyAgICBfQml0X3R5cGUgKiBfTV9wOworICAgIHVuc2lnbmVkIGludCBfTV9vZmZzZXQ7CisKKyAgICBfQml0X2l0ZXJhdG9yX2Jhc2UoX0JpdF90eXBlICogX194LCB1bnNpZ25lZCBpbnQgX195KQorICAgIDogX01fcChfX3gpLCBfTV9vZmZzZXQoX195KSB7IH0KKworICAgIHZvaWQKKyAgICBfTV9idW1wX3VwKCkKKyAgICB7CisgICAgICBpZiAoX01fb2Zmc2V0KysgPT0gaW50KF9TX3dvcmRfYml0KSAtIDEpCisJeworCSAgX01fb2Zmc2V0ID0gMDsKKwkgICsrX01fcDsKKwl9CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX2J1bXBfZG93bigpCisgICAgeworICAgICAgaWYgKF9NX29mZnNldC0tID09IDApCisJeworCSAgX01fb2Zmc2V0ID0gaW50KF9TX3dvcmRfYml0KSAtIDE7CisJICAtLV9NX3A7CisJfQorICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9pbmNyKHB0cmRpZmZfdCBfX2kpCisgICAgeworICAgICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9faSArIF9NX29mZnNldDsKKyAgICAgIF9NX3AgKz0gX19uIC8gaW50KF9TX3dvcmRfYml0KTsKKyAgICAgIF9fbiA9IF9fbiAlIGludChfU193b3JkX2JpdCk7CisgICAgICBpZiAoX19uIDwgMCkKKwl7CisJICBfX24gKz0gaW50KF9TX3dvcmRfYml0KTsKKwkgIC0tX01fcDsKKwl9CisgICAgICBfTV9vZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KF9fbik7CisgICAgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gX01fcCA9PSBfX2kuX01fcCAmJiBfTV9vZmZzZXQgPT0gX19pLl9NX29mZnNldDsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9faSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gX01fcCA8IF9faS5fTV9wCisJICAgICB8fCAoX01fcCA9PSBfX2kuX01fcCAmJiBfTV9vZmZzZXQgPCBfX2kuX01fb2Zmc2V0KTsKKyAgICB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9faSkgY29uc3QKKyAgICB7IHJldHVybiAhKCp0aGlzID09IF9faSk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX0JpdF9pdGVyYXRvcl9iYXNlJiBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gX19pIDwgKnRoaXM7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX19pKSBjb25zdAorICAgIHsgcmV0dXJuICEoX19pIDwgKnRoaXMpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9faSkgY29uc3QKKyAgICB7IHJldHVybiAhKCp0aGlzIDwgX19pKTsgfQorICB9OworCisgIGlubGluZSBwdHJkaWZmX3QKKyAgb3BlcmF0b3ItKGNvbnN0IF9CaXRfaXRlcmF0b3JfYmFzZSYgX194LCBjb25zdCBfQml0X2l0ZXJhdG9yX2Jhc2UmIF9feSkKKyAgeworICAgIHJldHVybiAoaW50KF9TX3dvcmRfYml0KSAqIChfX3guX01fcCAtIF9feS5fTV9wKQorCSAgICArIF9feC5fTV9vZmZzZXQgLSBfX3kuX01fb2Zmc2V0KTsKKyAgfQorCisgIHN0cnVjdCBfQml0X2l0ZXJhdG9yIDogcHVibGljIF9CaXRfaXRlcmF0b3JfYmFzZQorICB7CisgICAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UqIHBvaW50ZXI7CisgICAgdHlwZWRlZiBfQml0X2l0ZXJhdG9yICAgaXRlcmF0b3I7CisKKyAgICBfQml0X2l0ZXJhdG9yKCkgOiBfQml0X2l0ZXJhdG9yX2Jhc2UoMCwgMCkgeyB9CisKKyAgICBfQml0X2l0ZXJhdG9yKF9CaXRfdHlwZSAqIF9feCwgdW5zaWduZWQgaW50IF9feSkKKyAgICA6IF9CaXRfaXRlcmF0b3JfYmFzZShfX3gsIF9feSkgeyB9CisKKyAgICByZWZlcmVuY2UKKyAgICBvcGVyYXRvciooKSBjb25zdAorICAgIHsgcmV0dXJuIHJlZmVyZW5jZShfTV9wLCAxVUwgPDwgX01fb2Zmc2V0KTsgfQorCisgICAgaXRlcmF0b3ImCisgICAgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgX01fYnVtcF91cCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIF9NX2J1bXBfdXAoKTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBpdGVyYXRvciYKKyAgICBvcGVyYXRvci0tKCkKKyAgICB7CisgICAgICBfTV9idW1wX2Rvd24oKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIG9wZXJhdG9yLS0oaW50KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICBfTV9idW1wX2Rvd24oKTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBpdGVyYXRvciYKKyAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX2kpCisgICAgeworICAgICAgX01faW5jcihfX2kpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yJgorICAgIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9faSkKKyAgICB7CisgICAgICAqdGhpcyArPSAtX19pOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0CisgICAgeworICAgICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcCArPSBfX2k7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9faSkgY29uc3QKKyAgICB7CisgICAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOworICAgICAgcmV0dXJuIF9fdG1wIC09IF9faTsKKyAgICB9CisKKyAgICByZWZlcmVuY2UKKyAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0CisgICAgeyByZXR1cm4gKigqdGhpcyArIF9faSk7IH0KKyAgfTsKKworICBpbmxpbmUgX0JpdF9pdGVyYXRvcgorICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0JpdF9pdGVyYXRvciYgX194KQorICB7IHJldHVybiBfX3ggKyBfX247IH0KKworICBzdHJ1Y3QgX0JpdF9jb25zdF9pdGVyYXRvciA6IHB1YmxpYyBfQml0X2l0ZXJhdG9yX2Jhc2UKKyAgeworICAgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgY29uc3QgYm9vbCogICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgX0JpdF9jb25zdF9pdGVyYXRvcigpIDogX0JpdF9pdGVyYXRvcl9iYXNlKDAsIDApIHsgfQorCisgICAgX0JpdF9jb25zdF9pdGVyYXRvcihfQml0X3R5cGUgKiBfX3gsIHVuc2lnbmVkIGludCBfX3kpCisgICAgOiBfQml0X2l0ZXJhdG9yX2Jhc2UoX194LCBfX3kpIHsgfQorCisgICAgX0JpdF9jb25zdF9pdGVyYXRvcihjb25zdCBfQml0X2l0ZXJhdG9yJiBfX3gpCisgICAgOiBfQml0X2l0ZXJhdG9yX2Jhc2UoX194Ll9NX3AsIF9feC5fTV9vZmZzZXQpIHsgfQorCisgICAgY29uc3RfcmVmZXJlbmNlCisgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICB7IHJldHVybiBfQml0X3JlZmVyZW5jZShfTV9wLCAxVUwgPDwgX01fb2Zmc2V0KTsgfQorCisgICAgY29uc3RfaXRlcmF0b3ImCisgICAgb3BlcmF0b3IrKygpCisgICAgeworICAgICAgX01fYnVtcF91cCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIF9NX2J1bXBfdXAoKTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciYKKyAgICBvcGVyYXRvci0tKCkKKyAgICB7CisgICAgICBfTV9idW1wX2Rvd24oKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIG9wZXJhdG9yLS0oaW50KQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICBfTV9idW1wX2Rvd24oKTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciYKKyAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX2kpCisgICAgeworICAgICAgX01faW5jcihfX2kpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yJgorICAgIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9faSkKKyAgICB7CisgICAgICAqdGhpcyArPSAtX19pOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yIAorICAgIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisgICAgICByZXR1cm4gX190bXAgKz0gX19pOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0CisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX190bXAgPSAqdGhpczsKKyAgICAgIHJldHVybiBfX3RtcCAtPSBfX2k7CisgICAgfQorCisgICAgY29uc3RfcmVmZXJlbmNlCisgICAgb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdAorICAgIHsgcmV0dXJuICooKnRoaXMgKyBfX2kpOyB9CisgIH07CisKKyAgaW5saW5lIF9CaXRfY29uc3RfaXRlcmF0b3IKKyAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9CaXRfY29uc3RfaXRlcmF0b3ImIF9feCkKKyAgeyByZXR1cm4gX194ICsgX19uOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19maWxsX2J2ZWN0b3IoX0JpdF9pdGVyYXRvciBfX2ZpcnN0LCBfQml0X2l0ZXJhdG9yIF9fbGFzdCwgYm9vbCBfX3gpCisgIHsKKyAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKyAgICAgICpfX2ZpcnN0ID0gX194OworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgZmlsbChfQml0X2l0ZXJhdG9yIF9fZmlyc3QsIF9CaXRfaXRlcmF0b3IgX19sYXN0LCBjb25zdCBib29sJiBfX3gpCisgIHsKKyAgICBpZiAoX19maXJzdC5fTV9wICE9IF9fbGFzdC5fTV9wKQorICAgICAgeworCXN0ZDo6ZmlsbChfX2ZpcnN0Ll9NX3AgKyAxLCBfX2xhc3QuX01fcCwgX194ID8gfjAgOiAwKTsKKwlfX2ZpbGxfYnZlY3RvcihfX2ZpcnN0LCBfQml0X2l0ZXJhdG9yKF9fZmlyc3QuX01fcCArIDEsIDApLCBfX3gpOworCV9fZmlsbF9idmVjdG9yKF9CaXRfaXRlcmF0b3IoX19sYXN0Ll9NX3AsIDApLCBfX2xhc3QsIF9feCk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgX19maWxsX2J2ZWN0b3IoX19maXJzdCwgX19sYXN0LCBfX3gpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfQnZlY3Rvcl9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfQml0X3R5cGU+OjpvdGhlcgorICAgICAgICBfQml0X2FsbG9jX3R5cGU7CisgICAgICAKKyAgICAgIHN0cnVjdCBfQnZlY3Rvcl9pbXBsCisgICAgICA6IHB1YmxpYyBfQml0X2FsbG9jX3R5cGUKKyAgICAgIHsKKwlfQml0X2l0ZXJhdG9yIAlfTV9zdGFydDsKKwlfQml0X2l0ZXJhdG9yIAlfTV9maW5pc2g7CisJX0JpdF90eXBlKiAJX01fZW5kX29mX3N0b3JhZ2U7CisKKwlfQnZlY3Rvcl9pbXBsKCkKKwk6IF9CaXRfYWxsb2NfdHlwZSgpLCBfTV9zdGFydCgpLCBfTV9maW5pc2goKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKyAKKwlfQnZlY3Rvcl9pbXBsKGNvbnN0IF9CaXRfYWxsb2NfdHlwZSYgX19hKQorCTogX0JpdF9hbGxvY190eXBlKF9fYSksIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKQorCXsgfQorICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfQml0X2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfQml0X2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X0JpdF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGNvbnN0IF9CaXRfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9CaXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQml0X2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgX0J2ZWN0b3JfYmFzZSgpCisgICAgICA6IF9NX2ltcGwoKSB7IH0KKyAgICAgIAorICAgICAgX0J2ZWN0b3JfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgX0J2ZWN0b3JfYmFzZShfQnZlY3Rvcl9iYXNlJiYgX194KQorICAgICAgOiBfTV9pbXBsKF9feC5fTV9nZXRfQml0X2FsbG9jYXRvcigpKQorICAgICAgeworCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3guX01faW1wbC5fTV9zdGFydDsKKwl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9feC5fTV9pbXBsLl9NX2ZpbmlzaDsKKwl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX194Ll9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2U7CisJX194Ll9NX2ltcGwuX01fc3RhcnQgPSBfQml0X2l0ZXJhdG9yKCk7CisJX194Ll9NX2ltcGwuX01fZmluaXNoID0gX0JpdF9pdGVyYXRvcigpOworCV9feC5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gMDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB+X0J2ZWN0b3JfYmFzZSgpCisgICAgICB7IHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0J2ZWN0b3JfaW1wbCBfTV9pbXBsOworCisgICAgICBfQml0X3R5cGUqCisgICAgICBfTV9hbGxvY2F0ZShzaXplX3QgX19uKQorICAgICAgeyByZXR1cm4gX01faW1wbC5hbGxvY2F0ZSgoX19uICsgaW50KF9TX3dvcmRfYml0KSAtIDEpCisJCQkJLyBpbnQoX1Nfd29yZF9iaXQpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlKCkKKyAgICAgIHsKKwlpZiAoX01faW1wbC5fTV9zdGFydC5fTV9wKQorCSAgX01faW1wbC5kZWFsbG9jYXRlKF9NX2ltcGwuX01fc3RhcnQuX01fcCwKKwkJCSAgICAgX01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX2ltcGwuX01fc3RhcnQuX01fcCk7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisvLyBEZWNsYXJlIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiB2ZWN0b3I8VCwgQWxsb2M+LgorI2luY2x1ZGUgPGJpdHMvc3RsX3ZlY3Rvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvKioKKyAgICogIEBicmllZiAgQSBzcGVjaWFsaXphdGlvbiBvZiB2ZWN0b3IgZm9yIGJvb2xlYW5zIHdoaWNoIG9mZmVycyBmaXhlZCB0aW1lCisgICAqICBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBlbGVtZW50cyBpbiBhbnkgb3JkZXIuCisgICAqCisgICAqICBOb3RlIHRoYXQgdmVjdG9yPGJvb2w+IGRvZXMgbm90IGFjdHVhbGx5IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3IgYmVpbmcKKyAgICogIGEgY29udGFpbmVyLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSByZWZlcmVuY2UgYW5kIHBvaW50ZXIgdHlwZXMgYXJlIG5vdAorICAgKiAgcmVhbGx5IHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGJvb2wuICBTZWUgRFI5NiBmb3IgZGV0YWlscy4gIEBzZWUKKyAgICogIHZlY3RvciBmb3IgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbi4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgSW4gc29tZSB0ZXJtaW5vbG9neSBhICV2ZWN0b3IgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGR5bmFtaWMKKyAgICogIEMtc3R5bGUgYXJyYXksIGl0IG9mZmVycyBmYXN0IGFuZCBlZmZpY2llbnQgYWNjZXNzIHRvIGluZGl2aWR1YWwKKyAgICogIGVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgc2F2ZXMgdGhlIHVzZXIgZnJvbSB3b3JyeWluZyBhYm91dAorICAgKiAgbWVtb3J5IGFuZCBzaXplIGFsbG9jYXRpb24uICBTdWJzY3JpcHRpbmcgKCBAYyBbXSApIGFjY2VzcyBpcworICAgKiAgYWxzbyBwcm92aWRlZCBhcyB3aXRoIEMtc3R5bGUgYXJyYXlzLgorICAqLwordGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICBjbGFzcyB2ZWN0b3I8Ym9vbCwgX0FsbG9jPiA6IHByb3RlY3RlZCBfQnZlY3Rvcl9iYXNlPF9BbGxvYz4KKyAgeworICAgIHR5cGVkZWYgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+CQkJIF9CYXNlOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIGhhc2g7CisjZW5kaWYKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgX0JpdF9yZWZlcmVuY2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IGJvb2wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBfQml0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiAgICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAJCSBhbGxvY2F0b3JfdHlwZTsKKworICAgIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgIHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KKworICBwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX0Jhc2U6Ol9NX2FsbG9jYXRlOworICAgIHVzaW5nIF9CYXNlOjpfTV9kZWFsbG9jYXRlOworICAgIHVzaW5nIF9CYXNlOjpfTV9nZXRfQml0X2FsbG9jYXRvcjsKKworICBwdWJsaWM6CisgICAgdmVjdG9yKCkKKyAgICA6IF9CYXNlKCkgeyB9CisKKyAgICBleHBsaWNpdAorICAgIHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX0Jhc2UoX19hKSB7IH0KKworICAgIGV4cGxpY2l0CisgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IGJvb2wmIF9fdmFsdWUgPSBib29sKCksIAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsKKyAgICAgIF9NX2luaXRpYWxpemUoX19uKTsKKyAgICAgIHN0ZDo6ZmlsbCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIAorCQlfX3ZhbHVlID8gfjAgOiAwKTsKKyAgICB9CisKKyAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3gpCisgICAgOiBfQmFzZShfX3guX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSkKKyAgICB7CisgICAgICBfTV9pbml0aWFsaXplKF9feC5zaXplKCkpOworICAgICAgX01fY29weV9hbGlnbmVkKF9feC5iZWdpbigpLCBfX3guZW5kKCksIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgdmVjdG9yKHZlY3RvciYmIF9feCkKKyAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSB7IH0KKworICAgIHZlY3Rvcihpbml0aWFsaXplcl9saXN0PGJvb2w+IF9fbCwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICA6IF9CYXNlKF9fYSkKKyAgICB7CisgICAgICBfTV9pbml0aWFsaXplX3JhbmdlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksCisJCQkgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKCkpOworICAgIH0KKyNlbmRpZgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwlfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgICAgfQorCisgICAgfnZlY3RvcigpIHsgfQorCisgICAgdmVjdG9yJgorICAgIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9feCkKKyAgICB7CisgICAgICBpZiAoJl9feCA9PSB0aGlzKQorCXJldHVybiAqdGhpczsKKyAgICAgIGlmIChfX3guc2l6ZSgpID4gY2FwYWNpdHkoKSkKKwl7CisJICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisJICBfTV9pbml0aWFsaXplKF9feC5zaXplKCkpOworCX0KKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX01fY29weV9hbGlnbmVkKF9feC5iZWdpbigpLCBfX3guZW5kKCksCisJCQkJCQliZWdpbigpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHZlY3RvciYKKyAgICBvcGVyYXRvcj0odmVjdG9yJiYgX194KQorICAgIHsKKyAgICAgIC8vIE5COiBEUiAxMjA0LgorICAgICAgLy8gTkI6IERSIDY3NS4KKyAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgICB0aGlzLT5zd2FwKF9feCk7IAorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZlY3RvciYKKyAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDxib29sPiBfX2wpCisgICAgeworICAgICAgdGhpcy0+YXNzaWduIChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGFzc2lnbigpLCBhIGdlbmVyYWxpemVkIGFzc2lnbm1lbnQgbWVtYmVyIGZ1bmN0aW9uLiAgVHdvCisgICAgLy8gdmVyc2lvbnM6IG9uZSB0aGF0IHRha2VzIGEgY291bnQsIGFuZCBvbmUgdGhhdCB0YWtlcyBhIHJhbmdlLgorICAgIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCisgICAgLy8gb3Igbm90IHRoZSB0eXBlIGlzIGFuIGludGVnZXIuCisgICAgdm9pZAorICAgIGFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBib29sJiBfX3gpCisgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9feCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwlfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHZvaWQKKyAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDxib29sPiBfX2wpCisgICAgeyB0aGlzLT5hc3NpZ24oX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgaXRlcmF0b3IKKyAgICBiZWdpbigpCisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgY29uc3RfaXRlcmF0b3IKKyAgICBiZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgaXRlcmF0b3IKKyAgICBlbmQoKQorICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIGVuZCgpIGNvbnN0CisgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9maW5pc2g7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICByYmVnaW4oKQorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgcmJlZ2luKCkgY29uc3QKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJlbmQoKQorICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICByZW5kKCkgY29uc3QKKyAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgY2JlZ2luKCkgY29uc3QKKyAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICBjb25zdF9pdGVyYXRvcgorICAgIGNlbmQoKSBjb25zdAorICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgY3JiZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICBjcmVuZCgpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICBzaXplX3R5cGUKKyAgICBzaXplKCkgY29uc3QKKyAgICB7IHJldHVybiBzaXplX3R5cGUoZW5kKCkgLSBiZWdpbigpKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgbWF4X3NpemUoKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2lzaXplID0KKwlfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZGlmZmVyZW5jZV90eXBlPjo6X19tYXgKKwktIGludChfU193b3JkX2JpdCkgKyAxOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fYXNpemUgPSBfTV9nZXRfQml0X2FsbG9jYXRvcigpLm1heF9zaXplKCk7CisgICAgICByZXR1cm4gKF9fYXNpemUgPD0gX19pc2l6ZSAvIGludChfU193b3JkX2JpdCkKKwkgICAgICA/IF9fYXNpemUgKiBpbnQoX1Nfd29yZF9iaXQpIDogX19pc2l6ZSk7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgY2FwYWNpdHkoKSBjb25zdAorICAgIHsgcmV0dXJuIHNpemVfdHlwZShjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlLCAwKQorCQkgICAgICAgLSBiZWdpbigpKTsgfQorCisgICAgYm9vbAorICAgIGVtcHR5KCkgY29uc3QKKyAgICB7IHJldHVybiBiZWdpbigpID09IGVuZCgpOyB9CisKKyAgICByZWZlcmVuY2UKKyAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgcmV0dXJuICppdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AKKwkJICAgICAgICsgX19uIC8gaW50KF9TX3dvcmRfYml0KSwgX19uICUgaW50KF9TX3dvcmRfYml0KSk7CisgICAgfQorCisgICAgY29uc3RfcmVmZXJlbmNlCisgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiAqY29uc3RfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wCisJCQkgICAgICsgX19uIC8gaW50KF9TX3dvcmRfYml0KSwgX19uICUgaW50KF9TX3dvcmRfYml0KSk7CisgICAgfQorCisgIHByb3RlY3RlZDoKKyAgICB2b2lkCisgICAgX01fcmFuZ2VfY2hlY2soc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKyAgICAgICAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJ2ZWN0b3I8Ym9vbD46Ol9NX3JhbmdlX2NoZWNrIikpOworICAgIH0KKworICBwdWJsaWM6CisgICAgcmVmZXJlbmNlCisgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICB7IF9NX3JhbmdlX2NoZWNrKF9fbik7IHJldHVybiAoKnRoaXMpW19fbl07IH0KKworICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeyBfTV9yYW5nZV9jaGVjayhfX24pOyByZXR1cm4gKCp0aGlzKVtfX25dOyB9CisKKyAgICB2b2lkCisgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19uKTsKKworICAgIHJlZmVyZW5jZQorICAgIGZyb250KCkKKyAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgY29uc3RfcmVmZXJlbmNlCisgICAgZnJvbnQoKSBjb25zdAorICAgIHsgcmV0dXJuICpiZWdpbigpOyB9CisKKyAgICByZWZlcmVuY2UKKyAgICBiYWNrKCkKKyAgICB7IHJldHVybiAqKGVuZCgpIC0gMSk7IH0KKworICAgIGNvbnN0X3JlZmVyZW5jZQorICAgIGJhY2soKSBjb25zdAorICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIERSIDQ2NC4gU3VnZ2VzdGlvbiBmb3IgbmV3IG1lbWJlciBmdW5jdGlvbnMgaW4gc3RhbmRhcmQgY29udGFpbmVycy4KKyAgICAvLyBOLkIuIERSIDQ2NCBzYXlzIG5vdGhpbmcgYWJvdXQgdmVjdG9yPGJvb2w+IGJ1dCB3ZSBuZWVkIHNvbWV0aGluZworICAgIC8vIGhlcmUgZHVlIHRvIHRoZSB3YXkgd2UgYXJlIGltcGxlbWVudGluZyBEUiA0NjQgaW4gdGhlIGRlYnVnLW1vZGUKKyAgICAvLyB2ZWN0b3IgY2xhc3MuCisgICAgdm9pZAorICAgIGRhdGEoKSB7IH0KKworICAgIHZvaWQKKyAgICBwdXNoX2JhY2soYm9vbCBfX3gpCisgICAgeworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3AgIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSkKKyAgICAgICAgKnRoaXMtPl9NX2ltcGwuX01fZmluaXNoKysgPSBfX3g7CisgICAgICBlbHNlCisgICAgICAgIF9NX2luc2VydF9hdXgoZW5kKCksIF9feCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAodmVjdG9yJiBfX3gpCisgICAgeworICAgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIF9feC5fTV9pbXBsLl9NX3N0YXJ0KTsKKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX194Ll9NX2ltcGwuX01fZmluaXNoKTsKKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlLCAKKwkJX194Ll9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisgICAgICBzdGQ6Ol9fYWxsb2Nfc3dhcDx0eXBlbmFtZSBfQmFzZTo6X0JpdF9hbGxvY190eXBlPjo6CisJX1NfZG9faXQoX01fZ2V0X0JpdF9hbGxvY2F0b3IoKSwgX194Ll9NX2dldF9CaXRfYWxsb2NhdG9yKCkpOworICAgIH0KKworICAgIC8vIFsyMy4yLjVdLzEsIHRoaXJkLXRvLWxhc3QgZW50cnkgaW4gc3lub3BzaXMgbGlzdGluZworICAgIHN0YXRpYyB2b2lkCisgICAgc3dhcChyZWZlcmVuY2UgX194LCByZWZlcmVuY2UgX195KQorICAgIHsKKyAgICAgIGJvb2wgX190bXAgPSBfX3g7CisgICAgICBfX3ggPSBfX3k7CisgICAgICBfX3kgPSBfX3RtcDsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBib29sJiBfX3ggPSBib29sKCkpCisgICAgeworICAgICAgY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3AgIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCSAgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkKKyAgICAgICAgKnRoaXMtPl9NX2ltcGwuX01fZmluaXNoKysgPSBfX3g7CisgICAgICBlbHNlCisgICAgICAgIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgX194KTsKKyAgICAgIHJldHVybiBiZWdpbigpICsgX19uOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisJICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgICAgfQorCisgICAgdm9pZAorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBib29sJiBfX3gpCisgICAgeyBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wLCBpbml0aWFsaXplcl9saXN0PGJvb2w+IF9fbCkKKyAgICB7IHRoaXMtPmluc2VydChfX3AsIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgIHZvaWQKKyAgICBwb3BfYmFjaygpCisgICAgeyAtLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICBpdGVyYXRvcgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgpKQorICAgICAgICBzdGQ6OmNvcHkoX19wb3NpdGlvbiArIDEsIGVuZCgpLCBfX3Bvc2l0aW9uKTsKKyAgICAgIC0tdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisgICAgICByZXR1cm4gX19wb3NpdGlvbjsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX2xhc3QsIGVuZCgpLCBfX2ZpcnN0KSk7CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBib29sIF9feCA9IGJvb2woKSkKKyAgICB7CisgICAgICBpZiAoX19uZXdfc2l6ZSA8IHNpemUoKSkKKyAgICAgICAgX01fZXJhc2VfYXRfZW5kKGJlZ2luKCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgZWxzZQorICAgICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXplKCksIF9feCk7CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB2b2lkCisgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgeyBzdGQ6Ol9fc2hyaW5rX3RvX2ZpdDx2ZWN0b3I+OjpfU19kb19pdCgqdGhpcyk7IH0KKyNlbmRpZgorCisgICAgdm9pZAorICAgIGZsaXAoKQorICAgIHsKKyAgICAgIGZvciAoX0JpdF90eXBlICogX19wID0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wOworCSAgIF9fcCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOyArK19fcCkKKyAgICAgICAgKl9fcCA9IH4qX19wOworICAgIH0KKworICAgIHZvaWQKKyAgICBjbGVhcigpCisgICAgeyBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSk7IH0KKworICAgCisgIHByb3RlY3RlZDoKKyAgICAvLyBQcmVjb25kaXRpb246IF9fZmlyc3QuX01fb2Zmc2V0ID09IDAgJiYgX19yZXN1bHQuX01fb2Zmc2V0ID09IDAuCisgICAgaXRlcmF0b3IKKyAgICBfTV9jb3B5X2FsaWduZWQoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0LAorCQkgICAgaXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgX0JpdF90eXBlKiBfX3EgPSBzdGQ6OmNvcHkoX19maXJzdC5fTV9wLCBfX2xhc3QuX01fcCwgX19yZXN1bHQuX01fcCk7CisgICAgICByZXR1cm4gc3RkOjpjb3B5KGNvbnN0X2l0ZXJhdG9yKF9fbGFzdC5fTV9wLCAwKSwgX19sYXN0LAorCQkgICAgICAgaXRlcmF0b3IoX19xLCAwKSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQml0X3R5cGUqIF9fcSA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbik7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gKF9fcQorCQkJCQkgKyAoKF9fbiArIGludChfU193b3JkX2JpdCkgLSAxKQorCQkJCQkgICAgLyBpbnQoX1Nfd29yZF9iaXQpKSk7CisgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgIH0KKworICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIF9fdHJ1ZV90eXBlKQorICAgICAgeworCV9NX2luaXRpYWxpemUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pKTsKKwlzdGQ6OmZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wLCAKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlLCBfX3ggPyB+MCA6IDApOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkIAorICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QsIAorCQkJICAgIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZV9yYW5nZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgcHVzaF9iYWNrKCpfX2ZpcnN0KTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwlfTV9pbml0aWFsaXplKF9fbik7CisJc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisgICAgICB9CisKKyAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJIF9fZmFsc2VfdHlwZSkKKyAgICAgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBfX2xhc3QsIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAgIHZvaWQKKyAgICBfTV9maWxsX2Fzc2lnbihzaXplX3QgX19uLCBib29sIF9feCkKKyAgICB7CisgICAgICBpZiAoX19uID4gc2l6ZSgpKQorCXsKKwkgIHN0ZDo6ZmlsbCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3AsIAorCQkgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSwgX194ID8gfjAgOiAwKTsKKwkgIGluc2VydChlbmQoKSwgX19uIC0gc2l6ZSgpLCBfX3gpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSArIF9fbik7CisJICBzdGQ6OmZpbGwodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9wLCAKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsIF9feCA/IH4wIDogMCk7CisJfQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlpdGVyYXRvciBfX2N1ciA9IGJlZ2luKCk7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IGVuZCgpOyArK19fY3VyLCArK19fZmlyc3QpCisJICAqX19jdXIgPSAqX19maXJzdDsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICBfTV9lcmFzZV9hdF9lbmQoX19jdXIpOworCWVsc2UKKwkgIGluc2VydChlbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKyAgICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisJaWYgKF9fbGVuIDwgc2l6ZSgpKQorCSAgX01fZXJhc2VfYXRfZW5kKHN0ZDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIGJlZ2luKCkpKTsKKwllbHNlCisJICB7CisJICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBfX2ZpcnN0OworCSAgICBzdGQ6OmFkdmFuY2UoX19taWQsIHNpemUoKSk7CisJICAgIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CisJICAgIGluc2VydChlbmQoKSwgX19taWQsIF9fbGFzdCk7CisJICB9CisgICAgICB9CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LAorCQkJIF9fdHJ1ZV90eXBlKQorICAgICAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKwkJCSBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgX19mYWxzZV90eXBlKQorICAgICAgeyBfTV9pbnNlcnRfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwKKwkJCXN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7IH0KKworICAgIHZvaWQKKyAgICBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBib29sIF9feCk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9yYW5nZShpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgCisJCSAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICB7CisJICAgIF9fcG9zID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CisJICAgICsrX19wb3M7CisJICB9CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX01faW5zZXJ0X3JhbmdlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgIHZvaWQKKyAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGJvb2wgX194KTsKKworICAgIHNpemVfdHlwZQorICAgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUgX19uLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKG1heF9zaXplKCkgLSBzaXplKCkgPCBfX24pCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKF9fcykpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBzdGQ6Om1heChzaXplKCksIF9fbik7CisgICAgICByZXR1cm4gKF9fbGVuIDwgc2l6ZSgpIHx8IF9fbGVuID4gbWF4X3NpemUoKSkgPyBtYXhfc2l6ZSgpIDogX19sZW47CisgICAgfQorCisgICAgdm9pZAorICAgIF9NX2VyYXNlX2F0X2VuZChpdGVyYXRvciBfX3BvcykKKyAgICB7IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX19wb3M7IH0KKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciB2ZWN0b3I8Ym9vbD4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgaGFzaDxfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPiYpIGNvbnN0IG5vZXhjZXB0OworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfS8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9jb25zdHJ1Y3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfY29uc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmYmE5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfY29uc3RydWN0LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vIG5vbnN0YW5kYXJkIGNvbnN0cnVjdCBhbmQgZGVzdHJveSBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LAorLy8gMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX2NvbnN0cnVjdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1NUTF9DT05TVFJVQ1RfSAorI2RlZmluZSBfU1RMX0NPTlNUUlVDVF9IIDEKKworI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIGFuIG9iamVjdCBpbiBleGlzdGluZyBtZW1vcnkgYnkgaW52b2tpbmcgYW4gYWxsb2NhdGVkCisgICAqIG9iamVjdCdzIGNvbnN0cnVjdG9yIHdpdGggYW4gaW5pdGlhbGl6ZXIuCisgICAqLworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIHZvaWQKKyAgICBfQ29uc3RydWN0KF9UMSogX19wLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7IDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPihfX3ApKSBfVDEoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgaW5saW5lIHZvaWQKKyAgICBfQ29uc3RydWN0KF9UMSogX19wLCBjb25zdCBfVDImIF9fdmFsdWUpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIDo6bmV3KHN0YXRpY19jYXN0PHZvaWQqPihfX3ApKSBfVDEoX192YWx1ZSk7CisgICAgfQorI2VuZGlmCisKKyAgLyoqCisgICAqIERlc3Ryb3kgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IGEgcG9pbnRlciB0eXBlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3koX1RwKiBfX3BvaW50ZXIpCisgICAgeyBfX3BvaW50ZXItPn5fVHAoKTsgfQorCisgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9EZXN0cm95X2F1eAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fZGVzdHJveShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorCXsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgICBzdGQ6Ol9EZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoKl9fZmlyc3QpKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9EZXN0cm95X2F1eDx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fZGVzdHJveShfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yKSB7IH0KKyAgICB9OworCisgIC8qKgorICAgKiBEZXN0cm95IGEgcmFuZ2Ugb2Ygb2JqZWN0cy4gIElmIHRoZSB2YWx1ZV90eXBlIG9mIHRoZSBvYmplY3QgaGFzCisgICAqIGEgdHJpdmlhbCBkZXN0cnVjdG9yLCB0aGUgY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIGFsbCBvZiB0aGlzCisgICAqIGF3YXksIG90aGVyd2lzZSB0aGUgb2JqZWN0cycgZGVzdHJ1Y3RvcnMgbXVzdCBiZSBpbnZva2VkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9EZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlX3R5cGU7CisgICAgICBzdGQ6Ol9EZXN0cm95X2F1eDxfX2hhc190cml2aWFsX2Rlc3RydWN0b3IoX1ZhbHVlX3R5cGUpPjo6CisJX19kZXN0cm95KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgfQorCisgIC8qKgorICAgKiBEZXN0cm95IGEgcmFuZ2Ugb2Ygb2JqZWN0cyB1c2luZyB0aGUgc3VwcGxpZWQgYWxsb2NhdG9yLiAgRm9yCisgICAqIG5vbmRlZmF1bHQgYWxsb2NhdG9ycyB3ZSBkbyBub3Qgb3B0aW1pemUgYXdheSBpbnZvY2F0aW9uIG9mIAorICAgKiBkZXN0cm95KCkgZXZlbiBpZiBfVHAgaGFzIGEgdHJpdmlhbCBkZXN0cnVjdG9yLgorICAgKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPiBjbGFzcyBhbGxvY2F0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgX0Rlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19hbGxvYy5kZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoKl9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIGFsbG9jYXRvcjxfVHA+JikKKyAgICB7CisgICAgICBfRGVzdHJveShfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9DT05TVFJVQ1RfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2RlcXVlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2RlcXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5YjViNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfZGVxdWUuaApAQCAtMCwwICsxLDE5NzkgQEAKKy8vIERlcXVlIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKy8vIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9kZXF1ZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZGVxdWV9CisgKi8KKworI2lmbmRlZiBfU1RMX0RFUVVFX0gKKyNkZWZpbmUgX1NUTF9ERVFVRV9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBjb250cm9scyB0aGUgc2l6ZSBvZiBtZW1vcnkgbm9kZXMuCisgICAqICBAcGFyYW0gIHNpemUgIFRoZSBzaXplIG9mIGFuIGVsZW1lbnQuCisgICAqICBAcmV0dXJuICAgVGhlIG51bWJlciAobm90IGJ5dGUgc2l6ZSkgb2YgZWxlbWVudHMgcGVyIG5vZGUuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHN0YXJ0ZWQgb2ZmIGFzIGEgY29tcGlsZXIga2x1ZGdlIGZyb20gU0dJLCBidXQKKyAgICogIHNlZW1zIHRvIGJlIGEgdXNlZnVsIHdyYXBwZXIgYXJvdW5kIGEgcmVwZWF0ZWQgY29uc3RhbnQKKyAgICogIGV4cHJlc3Npb24uICBUaGUgQGIgNTEyIGlzIHR1bmFibGUgKGFuZCBubyBvdGhlciBjb2RlIG5lZWRzIHRvCisgICAqICBjaGFuZ2UpLCBidXQgbm8gaW52ZXN0aWdhdGlvbiBoYXMgYmVlbiBkb25lIHNpbmNlIGluaGVyaXRpbmcgdGhlCisgICAqICBTR0kgY29kZS4gIFRvdWNoIF9HTElCQ1hYX0RFUVVFX0JVRl9TSVpFIG9ubHkgaWYgeW91IGtub3cgd2hhdAorICAgKiAgeW91IGFyZSBkb2luZywgaG93ZXZlcjogY2hhbmdpbmcgaXQgYnJlYWtzIHRoZSBiaW5hcnkKKyAgICogIGNvbXBhdGliaWxpdHkhIQorICAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFUVVFX0JVRl9TSVpFCisjZGVmaW5lIF9HTElCQ1hYX0RFUVVFX0JVRl9TSVpFIDUxMgorI2VuZGlmCisKKyAgaW5saW5lIHNpemVfdAorICBfX2RlcXVlX2J1Zl9zaXplKHNpemVfdCBfX3NpemUpCisgIHsgcmV0dXJuIChfX3NpemUgPCBfR0xJQkNYWF9ERVFVRV9CVUZfU0laRQorCSAgICA/IHNpemVfdChfR0xJQkNYWF9ERVFVRV9CVUZfU0laRSAvIF9fc2l6ZSkgOiBzaXplX3QoMSkpOyB9CisKKworICAvKioKKyAgICogIEBicmllZiBBIGRlcXVlOjppdGVyYXRvci4KKyAgICoKKyAgICogIFF1aXRlIGEgYml0IG9mIGludGVsbGlnZW5jZSBoZXJlLiAgTXVjaCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBvZgorICAgKiAgZGVxdWUgaXMgYWN0dWFsbHkgcGFzc2VkIG9mZiB0byB0aGlzIGNsYXNzLiAgQSBkZXF1ZSBob2xkcyB0d28KKyAgICogIG9mIHRoZXNlIGludGVybmFsbHksIG1hcmtpbmcgaXRzIHZhbGlkIHJhbmdlLiAgQWNjZXNzIHRvCisgICAqICBlbGVtZW50cyBpcyBkb25lIGFzIG9mZnNldHMgb2YgZWl0aGVyIG9mIHRob3NlIHR3bywgcmVseWluZyBvbgorICAgKiAgb3BlcmF0b3Igb3ZlcmxvYWRpbmcgaW4gdGhpcyBjbGFzcy4KKyAgICoKKyAgICogIEFsbCB0aGUgZnVuY3Rpb25zIGFyZSBvcCBvdmVybG9hZHMgZXhjZXB0IGZvciBfTV9zZXRfbm9kZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmLCB0eXBlbmFtZSBfUHRyPgorICAgIHN0cnVjdCBfRGVxdWVfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+ICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgc3RhdGljIHNpemVfdCBfU19idWZmZXJfc2l6ZSgpCisgICAgICB7IHJldHVybiBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKTsgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NYXBfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX0RlcXVlX2l0ZXJhdG9yICAgICAgICAgICAgICAgICBfU2VsZjsKKworICAgICAgX1RwKiBfTV9jdXI7CisgICAgICBfVHAqIF9NX2ZpcnN0OworICAgICAgX1RwKiBfTV9sYXN0OworICAgICAgX01hcF9wb2ludGVyIF9NX25vZGU7CisKKyAgICAgIF9EZXF1ZV9pdGVyYXRvcihfVHAqIF9feCwgX01hcF9wb2ludGVyIF9feSkKKyAgICAgIDogX01fY3VyKF9feCksIF9NX2ZpcnN0KCpfX3kpLAorICAgICAgICBfTV9sYXN0KCpfX3kgKyBfU19idWZmZXJfc2l6ZSgpKSwgX01fbm9kZShfX3kpIHsgfQorCisgICAgICBfRGVxdWVfaXRlcmF0b3IoKQorICAgICAgOiBfTV9jdXIoMCksIF9NX2ZpcnN0KDApLCBfTV9sYXN0KDApLCBfTV9ub2RlKDApIHsgfQorCisgICAgICBfRGVxdWVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkKKyAgICAgIDogX01fY3VyKF9feC5fTV9jdXIpLCBfTV9maXJzdChfX3guX01fZmlyc3QpLAorICAgICAgICBfTV9sYXN0KF9feC5fTV9sYXN0KSwgX01fbm9kZShfX3guX01fbm9kZSkgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9jdXI7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXI7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwkrK19NX2N1cjsKKwlpZiAoX01fY3VyID09IF9NX2xhc3QpCisJICB7CisJICAgIF9NX3NldF9ub2RlKF9NX25vZGUgKyAxKTsKKwkgICAgX01fY3VyID0gX01fZmlyc3Q7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwkrKyp0aGlzOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlpZiAoX01fY3VyID09IF9NX2ZpcnN0KQorCSAgeworCSAgICBfTV9zZXRfbm9kZShfTV9ub2RlIC0gMSk7CisJICAgIF9NX2N1ciA9IF9NX2xhc3Q7CisJICB9CisJLS1fTV9jdXI7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwktLSp0aGlzOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7CisJY29uc3QgZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19uICsgKF9NX2N1ciAtIF9NX2ZpcnN0KTsKKwlpZiAoX19vZmZzZXQgPj0gMCAmJiBfX29mZnNldCA8IGRpZmZlcmVuY2VfdHlwZShfU19idWZmZXJfc2l6ZSgpKSkKKwkgIF9NX2N1ciArPSBfX247CisJZWxzZQorCSAgeworCSAgICBjb25zdCBkaWZmZXJlbmNlX3R5cGUgX19ub2RlX29mZnNldCA9CisJICAgICAgX19vZmZzZXQgPiAwID8gX19vZmZzZXQgLyBkaWZmZXJlbmNlX3R5cGUoX1NfYnVmZmVyX3NpemUoKSkKKwkgICAgICAgICAgICAgICAgICAgOiAtZGlmZmVyZW5jZV90eXBlKCgtX19vZmZzZXQgLSAxKQorCQkJCQkgICAgICAvIF9TX2J1ZmZlcl9zaXplKCkpIC0gMTsKKwkgICAgX01fc2V0X25vZGUoX01fbm9kZSArIF9fbm9kZV9vZmZzZXQpOworCSAgICBfTV9jdXIgPSBfTV9maXJzdCArIChfX29mZnNldCAtIF9fbm9kZV9vZmZzZXQKKwkJCQkgKiBkaWZmZXJlbmNlX3R5cGUoX1NfYnVmZmVyX3NpemUoKSkpOworCSAgfQorCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJcmV0dXJuIF9fdG1wICs9IF9fbjsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7IHJldHVybiAqdGhpcyArPSAtX19uOyB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCXJldHVybiBfX3RtcCAtPSBfX247CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KKworICAgICAgLyoqIAorICAgICAgICogIFByZXBhcmVzIHRvIHRyYXZlcnNlIG5ld19ub2RlLiAgU2V0cyBldmVyeXRoaW5nIGV4Y2VwdAorICAgICAgICogIF9NX2N1ciwgd2hpY2ggc2hvdWxkIHRoZXJlZm9yZSBiZSBzZXQgYnkgdGhlIGNhbGxlcgorICAgICAgICogIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMsIGJhc2VkIG9uIF9NX2ZpcnN0IGFuZCBfTV9sYXN0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbm9kZShfTWFwX3BvaW50ZXIgX19uZXdfbm9kZSkKKyAgICAgIHsKKwlfTV9ub2RlID0gX19uZXdfbm9kZTsKKwlfTV9maXJzdCA9ICpfX25ld19ub2RlOworCV9NX2xhc3QgPSBfTV9maXJzdCArIGRpZmZlcmVuY2VfdHlwZShfU19idWZmZXJfc2l6ZSgpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIE5vdGU6IHdlIGFsc28gcHJvdmlkZSBvdmVybG9hZHMgd2hvc2Ugb3BlcmFuZHMgYXJlIG9mIHRoZSBzYW1lIHR5cGUgaW4KKyAgLy8gb3JkZXIgdG8gYXZvaWQgYW1iaWd1b3VzIG92ZXJsb2FkIHJlc29sdXRpb24gd2hlbiBzdGQ6OnJlbF9vcHMgb3BlcmF0b3JzCisgIC8vIGFyZSBpbiBzY29wZSAoZm9yIGFkZGl0aW9uYWwgZGV0YWlscywgc2VlIGxpYnN0ZGMrKy8zNjI4KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1ciA9PSBfX3kuX01fY3VyOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZSLCBfUHRyUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3gsCisJICAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPiYgX194LAorCSAgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX194LAorCSAgICAgIGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlKSA/IChfX3guX01fY3VyIDwgX195Ll9NX2N1cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKF9feC5fTV9ub2RlIDwgX195Ll9NX25vZGUpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUmVmTCwgdHlwZW5hbWUgX1B0ckwsCisJICAgdHlwZW5hbWUgX1JlZlIsIHR5cGVuYW1lIF9QdHJSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlKSA/IChfX3guX01fY3VyIDwgX195Ll9NX2N1cikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoX194Ll9NX25vZGUgPCBfX3kuX01fbm9kZSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+JiBfX3gsCisJICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWZMLCB0eXBlbmFtZSBfUHRyTCwKKwkgICB0eXBlbmFtZSBfUmVmUiwgdHlwZW5hbWUgX1B0clI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICAgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZlIsIF9QdHJSPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gQWNjb3JkaW5nIHRvIHRoZSByZXNvbHV0aW9uIG9mIERSMTc5IG5vdCBvbmx5IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24KKyAgLy8gb3BlcmF0b3JzIGJ1dCBhbHNvIG9wZXJhdG9yLSBtdXN0IGFjY2VwdCBtaXhlZCBpdGVyYXRvci9jb25zdF9pdGVyYXRvcgorICAvLyBwYXJhbWV0ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9SZWYsIHR5cGVuYW1lIF9QdHI+CisgICAgaW5saW5lIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCwKKwkgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPiYgX195KQorICAgIHsKKyAgICAgIHJldHVybiB0eXBlbmFtZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmLCBfUHRyPjo6ZGlmZmVyZW5jZV90eXBlCisJKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWYsIF9QdHI+OjpfU19idWZmZXJfc2l6ZSgpKQorCSogKF9feC5fTV9ub2RlIC0gX195Ll9NX25vZGUgLSAxKSArIChfX3guX01fY3VyIC0gX194Ll9NX2ZpcnN0KQorCSsgKF9feS5fTV9sYXN0IC0gX195Ll9NX2N1cik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZkwsIHR5cGVuYW1lIF9QdHJMLAorCSAgIHR5cGVuYW1lIF9SZWZSLCB0eXBlbmFtZSBfUHRyUj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZkwsIF9QdHJMPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD4mIF9feCwKKwkgICAgICBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmUiwgX1B0clI+JiBfX3kpCisgICAgeworICAgICAgcmV0dXJuIHR5cGVuYW1lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9SZWZMLCBfUHRyTD46OmRpZmZlcmVuY2VfdHlwZQorCShfRGVxdWVfaXRlcmF0b3I8X1RwLCBfUmVmTCwgX1B0ckw+OjpfU19idWZmZXJfc2l6ZSgpKQorCSogKF9feC5fTV9ub2RlIC0gX195Ll9NX25vZGUgLSAxKSArIChfX3guX01fY3VyIC0gX194Ll9NX2ZpcnN0KQorCSsgKF9feS5fTV9sYXN0IC0gX195Ll9NX2N1cik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1JlZiwgdHlwZW5hbWUgX1B0cj4KKyAgICBpbmxpbmUgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4mIF9feCkKKyAgICB7IHJldHVybiBfX3ggKyBfX247IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIGZpbGwoY29uc3QgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4mLAorCSBjb25zdCBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiYsIGNvbnN0IF9UcCYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIGNvcHkoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIGNvcHkoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19maXJzdCwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19sYXN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBzdGQ6OmNvcHkoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4oX19maXJzdCksCisJCSAgICAgICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2xhc3QpLAorCQkgICAgICAgX19yZXN1bHQpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgY29weV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPgorICAgIGNvcHlfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19maXJzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2xhc3QsCisJCSAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gX19yZXN1bHQpCisgICAgeyByZXR1cm4gc3RkOjpjb3B5X2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsCisJCQkJY29uc3QgX1RwJiwgY29uc3QgX1RwKj4oX19maXJzdCksCisJCQkJX0RlcXVlX2l0ZXJhdG9yPF9UcCwKKwkJCQljb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2xhc3QpLAorCQkJCV9fcmVzdWx0KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiwKKwkgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgY29uc3QgX1RwJiwgY29uc3QgX1RwKj4sCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2ZpcnN0LAorCSBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2xhc3QsCisJIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2ZpcnN0KSwKKwkJICAgICAgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fbGFzdCksCisJCSAgICAgICBfX3Jlc3VsdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX0RlcXVlX2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4KKyAgICBtb3ZlX2JhY2t3YXJkKF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+KTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+CisgICAgbW92ZV9iYWNrd2FyZChfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX2ZpcnN0LAorCQkgIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+IF9fbGFzdCwKKwkJICBfRGVxdWVfaXRlcmF0b3I8X1RwLCBfVHAmLCBfVHAqPiBfX3Jlc3VsdCkKKyAgICB7IHJldHVybiBzdGQ6Om1vdmVfYmFja3dhcmQoX0RlcXVlX2l0ZXJhdG9yPF9UcCwKKwkJCQljb25zdCBfVHAmLCBjb25zdCBfVHAqPihfX2ZpcnN0KSwKKwkJCQlfRGVxdWVfaXRlcmF0b3I8X1RwLAorCQkJCWNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+KF9fbGFzdCksCisJCQkJX19yZXN1bHQpOyB9CisjZW5kaWYKKworICAvKioKKyAgICogIERlcXVlIGJhc2UgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSB1bmlmaWVkIGZhY2UgZm9yICVkZXF1ZSdzCisgICAqICBhbGxvY2F0aW9uLiAgVGhpcyBjbGFzcydzIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFsbG9jYXRlIGFuZAorICAgKiAgZGVhbGxvY2F0ZSAoYnV0IGRvIG5vdCBpbml0aWFsaXplKSBzdG9yYWdlLiAgVGhpcyBtYWtlcyAlZXhjZXB0aW9uCisgICAqICBzYWZldHkgZWFzaWVyLgorICAgKgorICAgKiAgTm90aGluZyBpbiB0aGlzIGNsYXNzIGV2ZXIgY29uc3RydWN0cyBvciBkZXN0cm95cyBhbiBhY3R1YWwgVHAgZWxlbWVudC4KKyAgICogIChEZXF1ZSBoYW5kbGVzIHRoYXQgaXRzZWxmLikgIE9ubHkvQWxsIG1lbW9yeSBtYW5hZ2VtZW50IGlzIHBlcmZvcm1lZAorICAgKiAgaGVyZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX0RlcXVlX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisgICAgICB0eXBlZGVmIF9EZXF1ZV9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+ICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfRGVxdWVfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgX0RlcXVlX2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXAoMCk7IH0KKworICAgICAgX0RlcXVlX2Jhc2Uoc2l6ZV90IF9fbnVtX2VsZW1lbnRzKQorICAgICAgOiBfTV9pbXBsKCkKKyAgICAgIHsgX01faW5pdGlhbGl6ZV9tYXAoX19udW1fZWxlbWVudHMpOyB9CisKKyAgICAgIF9EZXF1ZV9iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EsIHNpemVfdCBfX251bV9lbGVtZW50cykKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7IF9NX2luaXRpYWxpemVfbWFwKF9fbnVtX2VsZW1lbnRzKTsgfQorCisgICAgICBfRGVxdWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTV9pbXBsKF9fYSkKKyAgICAgIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9EZXF1ZV9iYXNlKF9EZXF1ZV9iYXNlJiYgX194KQorICAgICAgOiBfTV9pbXBsKF9feC5fTV9nZXRfVHBfYWxsb2NhdG9yKCkpCisgICAgICB7CisJX01faW5pdGlhbGl6ZV9tYXAoMCk7CisJaWYgKF9feC5fTV9pbXBsLl9NX21hcCkKKwkgIHsKKwkgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIF9feC5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX3guX01faW1wbC5fTV9maW5pc2gpOworCSAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9tYXAsIF9feC5fTV9pbXBsLl9NX21hcCk7CisJICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplLCBfX3guX01faW1wbC5fTV9tYXBfc2l6ZSk7CisJICB9CisgICAgICB9CisjZW5kaWYKKworICAgICAgfl9EZXF1ZV9iYXNlKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvL1RoaXMgc3RydWN0IGVuY2Fwc3VsYXRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0ZDo6ZGVxdWUKKyAgICAgIC8vc3RhbmRhcmQgY29udGFpbmVyIGFuZCBhdCB0aGUgc2FtZSB0aW1lIG1ha2VzIHVzZSBvZiB0aGUgRUJPCisgICAgICAvL2ZvciBlbXB0eSBhbGxvY2F0b3JzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHAqPjo6b3RoZXIgX01hcF9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyICBfVHBfYWxsb2NfdHlwZTsKKworICAgICAgc3RydWN0IF9EZXF1ZV9pbXBsCisgICAgICA6IHB1YmxpYyBfVHBfYWxsb2NfdHlwZQorICAgICAgeworCV9UcCoqIF9NX21hcDsKKwlzaXplX3QgX01fbWFwX3NpemU7CisJaXRlcmF0b3IgX01fc3RhcnQ7CisJaXRlcmF0b3IgX01fZmluaXNoOworCisJX0RlcXVlX2ltcGwoKQorCTogX1RwX2FsbG9jX3R5cGUoKSwgX01fbWFwKDApLCBfTV9tYXBfc2l6ZSgwKSwKKwkgIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpCisJeyB9CisKKwlfRGVxdWVfaW1wbChjb25zdCBfVHBfYWxsb2NfdHlwZSYgX19hKQorCTogX1RwX2FsbG9jX3R5cGUoX19hKSwgX01fbWFwKDApLCBfTV9tYXBfc2l6ZSgwKSwKKwkgIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpCisJeyB9CisgICAgICB9OworCisgICAgICBfVHBfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9UcF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGNvbnN0IF9UcF9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX1RwX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgX01hcF9hbGxvY190eXBlCisgICAgICBfTV9nZXRfbWFwX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTWFwX2FsbG9jX3R5cGUoX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisgICAgICBfVHAqCisgICAgICBfTV9hbGxvY2F0ZV9ub2RlKCkKKyAgICAgIHsgCisJcmV0dXJuIF9NX2ltcGwuX1RwX2FsbG9jX3R5cGU6OmFsbG9jYXRlKF9fZGVxdWVfYnVmX3NpemUoc2l6ZW9mKF9UcCkpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9UcCogX19wKQorICAgICAgeworCV9NX2ltcGwuX1RwX2FsbG9jX3R5cGU6OmRlYWxsb2NhdGUoX19wLCBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKSk7CisgICAgICB9CisKKyAgICAgIF9UcCoqCisgICAgICBfTV9hbGxvY2F0ZV9tYXAoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2dldF9tYXBfYWxsb2NhdG9yKCkuYWxsb2NhdGUoX19uKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX21hcChfVHAqKiBfX3AsIHNpemVfdCBfX24pCisgICAgICB7IF9NX2dldF9tYXBfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShfX3AsIF9fbik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHZvaWQgX01faW5pdGlhbGl6ZV9tYXAoc2l6ZV90KTsKKyAgICAgIHZvaWQgX01fY3JlYXRlX25vZGVzKF9UcCoqIF9fbnN0YXJ0LCBfVHAqKiBfX25maW5pc2gpOworICAgICAgdm9pZCBfTV9kZXN0cm95X25vZGVzKF9UcCoqIF9fbnN0YXJ0LCBfVHAqKiBfX25maW5pc2gpOworICAgICAgZW51bSB7IF9TX2luaXRpYWxfbWFwX3NpemUgPSA4IH07CisKKyAgICAgIF9EZXF1ZV9pbXBsIF9NX2ltcGw7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIH5fRGVxdWVfYmFzZSgpCisgICAgeworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fbWFwKQorCXsKKwkgIF9NX2Rlc3Ryb3lfbm9kZXModGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9ub2RlLAorCQkJICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSArIDEpOworCSAgX01fZGVhbGxvY2F0ZV9tYXAodGhpcy0+X01faW1wbC5fTV9tYXAsIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUpOworCX0KKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgTGF5b3V0IHN0b3JhZ2UuCisgICAqICBAcGFyYW0gIG51bV9lbGVtZW50cyAgVGhlIGNvdW50IG9mIFQncyBmb3Igd2hpY2ggdG8gYWxsb2NhdGUgc3BhY2UKKyAgICogICAgICAgICAgICAgICAgICAgICAgICBhdCBmaXJzdC4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgVGhlIGluaXRpYWwgdW5kZXJseWluZyBtZW1vcnkgbGF5b3V0IGlzIGEgYml0IGNvbXBsaWNhdGVkLi4uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2luaXRpYWxpemVfbWFwKHNpemVfdCBfX251bV9lbGVtZW50cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19udW1fbm9kZXMgPSAoX19udW1fZWxlbWVudHMvIF9fZGVxdWVfYnVmX3NpemUoc2l6ZW9mKF9UcCkpCisJCQkJICArIDEpOworCisgICAgICB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplID0gc3RkOjptYXgoKHNpemVfdCkgX1NfaW5pdGlhbF9tYXBfc2l6ZSwKKwkJCQkJICAgc2l6ZV90KF9fbnVtX25vZGVzICsgMikpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9tYXAgPSBfTV9hbGxvY2F0ZV9tYXAodGhpcy0+X01faW1wbC5fTV9tYXBfc2l6ZSk7CisKKyAgICAgIC8vIEZvciAic21hbGwiIG1hcHMgKG5lZWRpbmcgbGVzcyB0aGFuIF9NX21hcF9zaXplIG5vZGVzKSwgYWxsb2NhdGlvbgorICAgICAgLy8gc3RhcnRzIGluIHRoZSBtaWRkbGUgZWxlbWVudHMgYW5kIGdyb3dzIG91dHdhcmRzLiAgU28gbnN0YXJ0IG1heSBiZQorICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiBfTV9tYXAsIGJ1dCBmb3Igc21hbGwgbWFwcyBpdCBtYXkgYmUgYXMgZmFyIGluIGFzCisgICAgICAvLyBfTV9tYXArMy4KKworICAgICAgX1RwKiogX19uc3RhcnQgPSAodGhpcy0+X01faW1wbC5fTV9tYXAKKwkJCSsgKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgLSBfX251bV9ub2RlcykgLyAyKTsKKyAgICAgIF9UcCoqIF9fbmZpbmlzaCA9IF9fbnN0YXJ0ICsgX19udW1fbm9kZXM7CisKKyAgICAgIF9fdHJ5CisJeyBfTV9jcmVhdGVfbm9kZXMoX19uc3RhcnQsIF9fbmZpbmlzaCk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9NX2RlYWxsb2NhdGVfbWFwKHRoaXMtPl9NX2ltcGwuX01fbWFwLCB0aGlzLT5fTV9pbXBsLl9NX21hcF9zaXplKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwID0gMDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUgPSAwOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorCisgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX3NldF9ub2RlKF9fbnN0YXJ0KTsKKyAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX3NldF9ub2RlKF9fbmZpbmlzaCAtIDEpOworICAgICAgdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgPSBfTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0OworICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyID0gKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0CisJCQkJCSsgX19udW1fZWxlbWVudHMKKwkJCQkJJSBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfRGVxdWVfYmFzZTxfVHAsIF9BbGxvYz46OgorICAgIF9NX2NyZWF0ZV9ub2RlcyhfVHAqKiBfX25zdGFydCwgX1RwKiogX19uZmluaXNoKQorICAgIHsKKyAgICAgIF9UcCoqIF9fY3VyOworICAgICAgX190cnkKKwl7CisJICBmb3IgKF9fY3VyID0gX19uc3RhcnQ7IF9fY3VyIDwgX19uZmluaXNoOyArK19fY3VyKQorCSAgICAqX19jdXIgPSB0aGlzLT5fTV9hbGxvY2F0ZV9ub2RlKCk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX01fZGVzdHJveV9ub2RlcyhfX25zdGFydCwgX19jdXIpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9kZXN0cm95X25vZGVzKF9UcCoqIF9fbnN0YXJ0LCBfVHAqKiBfX25maW5pc2gpCisgICAgeworICAgICAgZm9yIChfVHAqKiBfX24gPSBfX25zdGFydDsgX19uIDwgX19uZmluaXNoOyArK19fbikKKwlfTV9kZWFsbG9jYXRlX25vZGUoKl9fbik7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHN0YW5kYXJkIGNvbnRhaW5lciB1c2luZyBmaXhlZC1zaXplIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAorICAgKiAgY29uc3RhbnQtdGltZSBtYW5pcHVsYXRpb24gb2YgZWxlbWVudHMgYXQgZWl0aGVyIGVuZC4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPiwgaW5jbHVkaW5nIHRoZQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjgiPm9wdGlvbmFsIHNlcXVlbmNlIHJlcXVpcmVtZW50czwvYT4uCisgICAqCisgICAqICBJbiBwcmV2aW91cyBIUC9TR0kgdmVyc2lvbnMgb2YgZGVxdWUsIHRoZXJlIHdhcyBhbiBleHRyYSB0ZW1wbGF0ZQorICAgKiAgcGFyYW1ldGVyIHNvIHVzZXJzIGNvdWxkIGNvbnRyb2wgdGhlIG5vZGUgc2l6ZS4gIFRoaXMgZXh0ZW5zaW9uIHR1cm5lZAorICAgKiAgb3V0IHRvIHZpb2xhdGUgdGhlIEMrKyBzdGFuZGFyZCAoaXQgY2FuIGJlIGRldGVjdGVkIHVzaW5nIHRlbXBsYXRlCisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKSwgYW5kIGl0IHdhcyByZW1vdmVkLgorICAgKgorICAgKiAgSGVyZSdzIGhvdyBhIGRlcXVlPFRwPiBtYW5hZ2VzIG1lbW9yeS4gIEVhY2ggZGVxdWUgaGFzIDQgbWVtYmVyczoKKyAgICoKKyAgICogIC0gVHAqKiAgICAgICAgX01fbWFwCisgICAqICAtIHNpemVfdCAgICAgIF9NX21hcF9zaXplCisgICAqICAtIGl0ZXJhdG9yICAgIF9NX3N0YXJ0LCBfTV9maW5pc2gKKyAgICoKKyAgICogIG1hcF9zaXplIGlzIGF0IGxlYXN0IDguICAlbWFwIGlzIGFuIGFycmF5IG9mIG1hcF9zaXplCisgICAqICBwb2ludGVycy10by1AYW5vZGVzLiAgKFRoZSBuYW1lICVtYXAgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUKKyAgICogIHN0ZDo6bWFwIGNsYXNzLCBhbmQgQGIgbm9kZXMgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoCisgICAqICBzdGQ6Omxpc3QncyB1c2FnZSBvZiBAYSBub2RlLikKKyAgICoKKyAgICogIEEgQGEgbm9kZSBoYXMgbm8gc3BlY2lmaWMgdHlwZSBuYW1lIGFzIHN1Y2gsIGJ1dCBpdCBpcyByZWZlcnJlZAorICAgKiAgdG8gYXMgQGEgbm9kZSBpbiB0aGlzIGZpbGUuICBJdCBpcyBhIHNpbXBsZSBhcnJheS1vZi1UcC4gIElmIFRwCisgICAqICBpcyB2ZXJ5IGxhcmdlLCB0aGVyZSB3aWxsIGJlIG9uZSBUcCBlbGVtZW50IHBlciBub2RlIChpLmUuLCBhbgorICAgKiAgQGEgYXJyYXkgb2Ygb25lKS4gIEZvciBub24taHVnZSBUcCdzLCBub2RlIHNpemUgaXMgaW52ZXJzZWx5CisgICAqICByZWxhdGVkIHRvIFRwIHNpemU6IHRoZSBsYXJnZXIgdGhlIFRwLCB0aGUgZmV3ZXIgVHAncyB3aWxsIGZpdAorICAgKiAgaW4gYSBub2RlLiAgVGhlIGdvYWwgaGVyZSBpcyB0byBrZWVwIHRoZSB0b3RhbCBzaXplIG9mIGEgbm9kZQorICAgKiAgcmVsYXRpdmVseSBzbWFsbCBhbmQgY29uc3RhbnQgb3ZlciBkaWZmZXJlbnQgVHAncywgdG8gaW1wcm92ZQorICAgKiAgYWxsb2NhdG9yIGVmZmljaWVuY3kuCisgICAqCisgICAqICBOb3QgZXZlcnkgcG9pbnRlciBpbiB0aGUgJW1hcCBhcnJheSB3aWxsIHBvaW50IHRvIGEgbm9kZS4gIElmCisgICAqICB0aGUgaW5pdGlhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGRlcXVlIGlzIHNtYWxsLCB0aGUKKyAgICogIC9taWRkbGUvICVtYXAgcG9pbnRlcnMgd2lsbCBiZSB2YWxpZCwgYW5kIHRoZSBvbmVzIGF0IHRoZSBlZGdlcworICAgKiAgd2lsbCBiZSB1bnVzZWQuICBUaGlzIHNhbWUgc2l0dWF0aW9uIHdpbGwgYXJpc2UgYXMgdGhlICVtYXAKKyAgICogIGdyb3dzOiBhdmFpbGFibGUgJW1hcCBwb2ludGVycywgaWYgYW55LCB3aWxsIGJlIG9uIHRoZSBlbmRzLiAgQXMKKyAgICogIG5ldyBub2RlcyBhcmUgY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiB0aGUgJW1hcCdzIHBvaW50ZXJzIG5lZWQKKyAgICogIHRvIGJlIGNvcGllZCBAYSBvdXR3YXJkLgorICAgKgorICAgKiAgQ2xhc3MgaW52YXJpYW50czoKKyAgICogLSBGb3IgYW55IG5vbnNpbmd1bGFyIGl0ZXJhdG9yIGk6CisgICAqICAgIC0gaS5ub2RlIHBvaW50cyB0byBhIG1lbWJlciBvZiB0aGUgJW1hcCBhcnJheS4gIChZZXMsIHlvdSByZWFkIHRoYXQKKyAgICogICAgICBjb3JyZWN0bHk6ICBpLm5vZGUgZG9lcyBub3QgYWN0dWFsbHkgcG9pbnQgdG8gYSBub2RlLikgIFRoZSBtZW1iZXIgb2YKKyAgICogICAgICB0aGUgJW1hcCBhcnJheSBpcyB3aGF0IGFjdHVhbGx5IHBvaW50cyB0byB0aGUgbm9kZS4KKyAgICogICAgLSBpLmZpcnN0ID09ICooaS5ub2RlKSAgICAoVGhpcyBwb2ludHMgdG8gdGhlIG5vZGUgKGZpcnN0IFRwIGVsZW1lbnQpLikKKyAgICogICAgLSBpLmxhc3QgID09IGkuZmlyc3QgKyBub2RlX3NpemUKKyAgICogICAgLSBpLmN1ciBpcyBhIHBvaW50ZXIgaW4gdGhlIHJhbmdlIFtpLmZpcnN0LCBpLmxhc3QpLiAgTk9URToKKyAgICogICAgICB0aGUgaW1wbGljYXRpb24gb2YgdGhpcyBpcyB0aGF0IGkuY3VyIGlzIGFsd2F5cyBhIGRlcmVmZXJlbmNlYWJsZQorICAgKiAgICAgIHBvaW50ZXIsIGV2ZW4gaWYgaSBpcyBhIHBhc3QtdGhlLWVuZCBpdGVyYXRvci4KKyAgICogLSBTdGFydCBhbmQgRmluaXNoIGFyZSBhbHdheXMgbm9uc2luZ3VsYXIgaXRlcmF0b3JzLiAgTk9URTogdGhpcworICAgKiBtZWFucyB0aGF0IGFuIGVtcHR5IGRlcXVlIG11c3QgaGF2ZSBvbmUgbm9kZSwgYSBkZXF1ZSB3aXRoIDxOCisgICAqIGVsZW1lbnRzICh3aGVyZSBOIGlzIHRoZSBub2RlIGJ1ZmZlciBzaXplKSBtdXN0IGhhdmUgb25lIG5vZGUsIGEKKyAgICogZGVxdWUgd2l0aCBOIHRocm91Z2ggKDJOLTEpIGVsZW1lbnRzIG11c3QgaGF2ZSB0d28gbm9kZXMsIGV0Yy4KKyAgICogLSBGb3IgZXZlcnkgbm9kZSBvdGhlciB0aGFuIHN0YXJ0Lm5vZGUgYW5kIGZpbmlzaC5ub2RlLCBldmVyeQorICAgKiBlbGVtZW50IGluIHRoZSBub2RlIGlzIGFuIGluaXRpYWxpemVkIG9iamVjdC4gIElmIHN0YXJ0Lm5vZGUgPT0KKyAgICogZmluaXNoLm5vZGUsIHRoZW4gW3N0YXJ0LmN1ciwgZmluaXNoLmN1cikgYXJlIGluaXRpYWxpemVkCisgICAqIG9iamVjdHMsIGFuZCB0aGUgZWxlbWVudHMgb3V0c2lkZSB0aGF0IHJhbmdlIGFyZSB1bmluaXRpYWxpemVkCisgICAqIHN0b3JhZ2UuICBPdGhlcndpc2UsIFtzdGFydC5jdXIsIHN0YXJ0Lmxhc3QpIGFuZCBbZmluaXNoLmZpcnN0LAorICAgKiBmaW5pc2guY3VyKSBhcmUgaW5pdGlhbGl6ZWQgb2JqZWN0cywgYW5kIFtzdGFydC5maXJzdCwgc3RhcnQuY3VyKQorICAgKiBhbmQgW2ZpbmlzaC5jdXIsIGZpbmlzaC5sYXN0KSBhcmUgdW5pbml0aWFsaXplZCBzdG9yYWdlLgorICAgKiAtIFslbWFwLCAlbWFwICsgbWFwX3NpemUpIGlzIGEgdmFsaWQsIG5vbi1lbXB0eSByYW5nZS4KKyAgICogLSBbc3RhcnQubm9kZSwgZmluaXNoLm5vZGVdIGlzIGEgdmFsaWQgcmFuZ2UgY29udGFpbmVkIHdpdGhpbgorICAgKiAgIFslbWFwLCAlbWFwICsgbWFwX3NpemUpLgorICAgKiAtIEEgcG9pbnRlciBpbiB0aGUgcmFuZ2UgWyVtYXAsICVtYXAgKyBtYXBfc2l6ZSkgcG9pbnRzIHRvIGFuIGFsbG9jYXRlZAorICAgKiAgIG5vZGUgaWYgYW5kIG9ubHkgaWYgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIHJhbmdlCisgICAqICAgW3N0YXJ0Lm5vZGUsIGZpbmlzaC5ub2RlXS4KKyAgICoKKyAgICogIEhlcmUncyB0aGUgbWFnaWM6ICBub3RoaW5nIGluIGRlcXVlIGlzIEBiIGF3YXJlIG9mIHRoZSBkaXNjb250aWd1b3VzCisgICAqICBzdG9yYWdlIQorICAgKgorICAgKiAgVGhlIG1lbW9yeSBzZXR1cCBhbmQgbGF5b3V0IG9jY3VycyBpbiB0aGUgcGFyZW50LCBfQmFzZSwgYW5kIHRoZSBpdGVyYXRvcgorICAgKiAgY2xhc3MgaXMgZW50aXJlbHkgcmVzcG9uc2libGUgZm9yIEBhIGxlYXBpbmcgZnJvbSBvbmUgbm9kZSB0byB0aGUgbmV4dC4KKyAgICogIEFsbCB0aGUgaW1wbGVtZW50YXRpb24gcm91dGluZXMgZm9yIGRlcXVlIGl0c2VsZiB3b3JrIG9ubHkgdGhyb3VnaCB0aGUKKyAgICogIHN0YXJ0IGFuZCBmaW5pc2ggaXRlcmF0b3JzLiAgVGhpcyBrZWVwcyB0aGUgcm91dGluZXMgc2ltcGxlIGFuZCBzYW5lLAorICAgKiAgYW5kIHdlIGNhbiB1c2Ugb3RoZXIgc3RhbmRhcmQgYWxnb3JpdGhtcyBhcyB3ZWxsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGRlcXVlIDogcHJvdGVjdGVkIF9EZXF1ZV9iYXNlPF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9UcCwgX0FsbG9jX3ZhbHVlX3R5cGUsIF9TYW1lVHlwZUNvbmNlcHQpCisKKyAgICAgIHR5cGVkZWYgX0RlcXVlX2Jhc2U8X1RwLCBfQWxsb2M+ICAgICAgICAgICBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9UcF9hbGxvY190eXBlCSBfVHBfYWxsb2NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBwb2ludGVyKiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NYXBfcG9pbnRlcjsKKworICAgICAgc3RhdGljIHNpemVfdCBfU19idWZmZXJfc2l6ZSgpCisgICAgICB7IHJldHVybiBfX2RlcXVlX2J1Zl9zaXplKHNpemVvZihfVHApKTsgfQorCisgICAgICAvLyBGdW5jdGlvbnMgY29udHJvbGxpbmcgbWVtb3J5IGxheW91dCwgYW5kIG5vdGhpbmcgZWxzZS4KKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbml0aWFsaXplX21hcDsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9jcmVhdGVfbm9kZXM7CisgICAgICB1c2luZyBfQmFzZTo6X01fZGVzdHJveV9ub2RlczsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZV9ub2RlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2RlYWxsb2NhdGVfbm9kZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZV9tYXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fZGVhbGxvY2F0ZV9tYXA7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X1RwX2FsbG9jYXRvcjsKKworICAgICAgLyoqIAorICAgICAgICogIEEgdG90YWwgb2YgZm91ciBkYXRhIG1lbWJlcnMgYWNjdW11bGF0ZWQgZG93biB0aGUgaGllcmFyY2h5LgorICAgICAgICogIE1heSBiZSBhY2Nlc3NlZCB2aWEgX01faW1wbC4qCisgICAgICAgKi8KKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbXBsOworCisgICAgcHVibGljOgorICAgICAgLy8gWzIzLjIuMS4xXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvLyAoYXNzaWduKCkgYW5kIGdldF9hbGxvY2F0b3IoKSBhcmUgYWxzbyBsaXN0ZWQgaW4gdGhpcyBzZWN0aW9uKQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGRlcXVlKCkKKyAgICAgIDogX0Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWRlcXVlIHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX0Jhc2UoX19hLCAwKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlZGVxdWUgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlZGVxdWUgd2l0aCBAYSBuIGRlZmF1bHQKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGRlcXVlKHNpemVfdHlwZSBfX24pCisgICAgICA6IF9CYXNlKF9fbikKKyAgICAgIHsgX01fZGVmYXVsdF9pbml0aWFsaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJWRlcXVlIHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICB2YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAlZGVxdWUgd2l0aCBAYSBuIGNvcGllcyBvZiBAYSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSwgX19uKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX192YWx1ZSk7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlZGVxdWUgd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIHZhbHVlICBBbiBlbGVtZW50IHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICVkZXF1ZSB3aXRoIEBhIG4gY29waWVzIG9mIEBhIHZhbHVlLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSA9IHZhbHVlX3R5cGUoKSwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSwgX19uKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX192YWx1ZSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVEZXF1ZSBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlZGVxdWUgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWRlcXVlIHVzZXMgYSBjb3B5IG9mIHRoZSBhbGxvY2F0aW9uIG9iamVjdCB1c2VkCisgICAgICAgKiAgYnkgQGEgeC4KKyAgICAgICAqLworICAgICAgZGVxdWUoY29uc3QgZGVxdWUmIF9feCkKKyAgICAgIDogX0Jhc2UoX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSwgX194LnNpemUoKSkKKyAgICAgIHsgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9feC5iZWdpbigpLCBfX3guZW5kKCksIAorCQkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlRGVxdWUgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWRlcXVlIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVkZXF1ZSBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgeC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgeCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVkZXF1ZS4KKyAgICAgICAqLworICAgICAgZGVxdWUoZGVxdWUmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlZGVxdWUgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogIEBwYXJhbSAgbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVkZXF1ZSBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBsLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIHdpbGwgY2FsbCB0aGUgZWxlbWVudCB0eXBlJ3MgY29weSBjb25zdHJ1Y3RvciBOIHRpbWVzCisgICAgICAgKiAgKHdoZXJlIE4gaXMgbC5zaXplKCkpIGFuZCBkbyBubyBtZW1vcnkgcmVhbGxvY2F0aW9uLgorICAgICAgICovCisgICAgICBkZXF1ZShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsKKwlfTV9yYW5nZV9pbml0aWFsaXplKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksCisJCQkgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlZGVxdWUgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlZGVxdWUgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20gW2ZpcnN0LAorICAgICAgICogIGxhc3QpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaXRlcmF0b3JzIGFyZSBmb3J3YXJkLCBiaWRpcmVjdGlvbmFsLCBvciByYW5kb20tYWNjZXNzLCB0aGVuCisgICAgICAgKiAgdGhpcyB3aWxsIGNhbGwgdGhlIGVsZW1lbnRzJyBjb3B5IGNvbnN0cnVjdG9yIE4gdGltZXMgKHdoZXJlIE4gaXMKKyAgICAgICAqICBkaXN0YW5jZShmaXJzdCxsYXN0KSkgYW5kIGRvIG5vIG1lbW9yeSByZWFsbG9jYXRpb24uICBCdXQgaWYgb25seQorICAgICAgICogIGlucHV0IGl0ZXJhdG9ycyBhcmUgdXNlZCwgdGhlbiB0aGlzIHdpbGwgZG8gYXQgbW9zdCAyTiBjYWxscyB0byB0aGUKKyAgICAgICAqICBjb3B5IGNvbnN0cnVjdG9yLCBhbmQgbG9nTiBtZW1vcnkgcmVhbGxvY2F0aW9ucy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fYSkKKyAgICAgICAgeworCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBUaGUgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB+ZGVxdWUoKQorICAgICAgeyBfTV9kZXN0cm95X2RhdGEoYmVnaW4oKSwgZW5kKCksIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlRGVxdWUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWRlcXVlIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgeCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5IGNvbnN0cnVjdG9yLAorICAgICAgICogIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGRlcXVlJiBfX3gpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJURlcXVlIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWRlcXVlIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSB4IGFyZSBtb3ZlZCBpbnRvIHRoaXMgZGVxdWUgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgeCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJWRlcXVlLgorICAgICAgICovCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShkZXF1ZSYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGFuIGluaXRpYWxpemVyIGxpc3QgdG8gYSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJWRlcXVlIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIGwuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVkZXF1ZSBhbmQgdGhhdCB0aGUKKyAgICAgICAqICByZXN1bHRpbmcgJWRlcXVlJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgKiAgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSBnaXZlbiB2YWx1ZSB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqICBAcGFyYW0gIHZhbCAgVmFsdWUgdG8gYmUgYXNzaWduZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZGVxdWUgd2l0aCBAYSBuIGNvcGllcyBvZiB0aGUgZ2l2ZW4KKyAgICAgICAqICB2YWx1ZS4gIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlCisgICAgICAgKiAgJWRlcXVlIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJWRlcXVlJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcworICAgICAgICogIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKQorICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSByYW5nZSB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVkZXF1ZSB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgcmFuZ2UgW2ZpcnN0LGxhc3QpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlZGVxdWUgYW5kIHRoYXQgdGhlCisgICAgICAgKiAgcmVzdWx0aW5nICVkZXF1ZSdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBlbGVtZW50cworICAgICAgICogIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlZGVxdWUgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJWRlcXVlIGFuZCB0aGF0IHRoZQorICAgICAgICogIHJlc3VsdGluZyAlZGVxdWUncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKyAgICAgICAqICBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlCisgICAgICAgKiAgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgb3JkaW5hcnkgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lCisgICAgICAgKiAgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMKKyAgICAgICAqICBkb25lIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVkZXF1ZS4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIG9yZGluYXJ5IGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWRlcXVlLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAlZGVxdWUuICBJdGVyYXRpb24gaXMKKyAgICAgICAqICBkb25lIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorI2VuZGlmCisKKyAgICAgIC8vIFsyMy4yLjEuMl0gY2FwYWNpdHkKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAlZGVxdWUuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydDsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAlZGVxdWUuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9nZXRfVHBfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbmV3X3NpemUgIE51bWJlciBvZiBlbGVtZW50cyB0aGUgJWRlcXVlIHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlZGVxdWUncyBjdXJyZW50IHNpemUgdGhlICVkZXF1ZSBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMgYXJlIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc2l6ZSgpOworCWlmIChfX25ld19zaXplID4gX19sZW4pCisJICBfTV9kZWZhdWx0X2FwcGVuZChfX25ld19zaXplIC0gX19sZW4pOworCWVsc2UgaWYgKF9fbmV3X3NpemUgPCBfX2xlbikKKwkgIF9NX2VyYXNlX2F0X2VuZCh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0CisJCQkgICsgZGlmZmVyZW5jZV90eXBlKF9fbmV3X3NpemUpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAlZGVxdWUgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBuZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlZGVxdWUgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICB4ICBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlZGVxdWUgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVkZXF1ZSdzIGN1cnJlbnQgc2l6ZSB0aGUgJWRlcXVlIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZQorICAgICAgICogICVkZXF1ZSBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBwb3B1bGF0ZWQgd2l0aCBnaXZlbgorICAgICAgICogIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKwlpZiAoX19uZXdfc2l6ZSA+IF9fbGVuKQorCSAgaW5zZXJ0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisJZWxzZSBpZiAoX19uZXdfc2l6ZSA8IF9fbGVuKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbmV3X3NpemUgIE51bWJlciBvZiBlbGVtZW50cyB0aGUgJWRlcXVlIHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB3aXRoIHdoaWNoIG5ldyBlbGVtZW50cyBzaG91bGQgYmUgcG9wdWxhdGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJWRlcXVlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAlZGVxdWUncyBjdXJyZW50IHNpemUgdGhlICVkZXF1ZSBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZSB0aGUKKyAgICAgICAqICAlZGVxdWUgaXMgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGggZ2l2ZW4KKyAgICAgICAqICBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIHZhbHVlX3R5cGUgX194ID0gdmFsdWVfdHlwZSgpKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKTsKKwlpZiAoX19uZXdfc2l6ZSA+IF9fbGVuKQorCSAgaW5zZXJ0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLCBfX25ld19zaXplIC0gX19sZW4sIF9feCk7CisJZWxzZSBpZiAoX19uZXdfc2l6ZSA8IF9fbGVuKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQKKwkJCSAgKyBkaWZmZXJlbmNlX3R5cGUoX19uZXdfc2l6ZSkpOworICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqICBBIG5vbi1iaW5kaW5nIHJlcXVlc3QgdG8gcmVkdWNlIG1lbW9yeSB1c2UuICAqLworICAgICAgdm9pZAorICAgICAgc2hyaW5rX3RvX2ZpdCgpCisgICAgICB7IHN0ZDo6X19zaHJpbmtfdG9fZml0PGRlcXVlPjo6X1NfZG9faXQoKnRoaXMpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSAlZGVxdWUgaXMgZW1wdHkuICAoVGh1cyBiZWdpbigpIHdvdWxkCisgICAgICAgKiAgZXF1YWwgZW5kKCkuKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9PSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OyB9CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU3Vic2NyaXB0IGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnRbZGlmZmVyZW5jZV90eXBlKF9fbildOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnRbZGlmZmVyZW5jZV90eXBlKF9fbildOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gU2FmZXR5IGNoZWNrIHVzZWQgb25seSBmcm9tIGF0KCkuCisgICAgICB2b2lkCisgICAgICBfTV9yYW5nZV9jaGVjayhzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCWlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJkZXF1ZTo6X01fcmFuZ2VfY2hlY2siKSk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBuIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGRlcXVlLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhyb3dzIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfTV9yYW5nZV9jaGVjayhfX24pOworCXJldHVybiAoKnRoaXMpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBuIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlciBpcyBmaXJzdAorICAgICAgICogIGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGRlcXVlLiAgVGhlIGZ1bmN0aW9uIHRocm93cworICAgICAgICogIG91dF9vZl9yYW5nZSBpZiB0aGUgY2hlY2sgZmFpbHMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfTV9yYW5nZV9jaGVjayhfX24pOworCXJldHVybiAoKnRoaXMpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlZGVxdWUuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlZGVxdWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlCisgICAgICAgKiAgJWRlcXVlLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCWl0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CisJLS1fX3RtcDsKKwlyZXR1cm4gKl9fdG1wOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWRlcXVlLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CisJLS1fX3RtcDsKKwlyZXR1cm4gKl9fdG1wOworICAgICAgfQorCisgICAgICAvLyBbMjMuMi4xLjJdIG1vZGlmaWVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZnJvbnQgb2YgdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuCisgICAgICAgKiAgZWxlbWVudCBhdCB0aGUgZnJvbnQgb2YgdGhlICVkZXF1ZSBhbmQgYXNzaWducyB0aGUgZ2l2ZW4KKyAgICAgICAqICBkYXRhIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlZGVxdWUgdGhpcyBvcGVyYXRpb24KKyAgICAgICAqICBjYW4gYmUgZG9uZSBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgIT0gdGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9maXJzdCkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIgLSAxLCBfX3gpOworCSAgICAtLXRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3B1c2hfZnJvbnRfYXV4KF9feCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgcHVzaF9mcm9udCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyBlbXBsYWNlX2Zyb250KHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlICVkZXF1ZS4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuCisgICAgICAgKiAgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSAlZGVxdWUgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEKKyAgICAgICAqICB0byBpdC4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWRlcXVlIHRoaXMgb3BlcmF0aW9uIGNhbiBiZQorICAgICAgICogIGRvbmUgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyCisJICAgICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2xhc3QgLSAxKQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmNvbnN0cnVjdCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9jdXIsIF9feCk7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3B1c2hfYmFja19hdXgoX194KTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlZGVxdWUgYnkgb25lLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBmaXJzdCBlbGVtZW50J3MgZGF0YSBpcworICAgICAgICogIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2Zyb250KCkgaXMgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCWlmICh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2N1cgorCSAgICAhPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2xhc3QgLSAxKQorCSAgeworCSAgICB0aGlzLT5fTV9pbXBsLmRlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydC5fTV9jdXIpOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyOworCSAgfQorCWVsc2UKKwkgIF9NX3BvcF9mcm9udF9hdXgoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGxhc3QgZWxlbWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgSXQgc2hyaW5rcyB0aGUgJWRlcXVlIGJ5IG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgbGFzdCBlbGVtZW50J3MgZGF0YSBpcworICAgICAgICogIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2JhY2soKSBpcyBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyCisJICAgICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2ZpcnN0KQorCSAgeworCSAgICAtLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cjsKKwkgICAgdGhpcy0+X01faW1wbC5kZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLl9NX2N1cik7CisJICB9CisJZWxzZQorCSAgX01fcG9wX2JhY2tfYXV4KCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGFuIG9iamVjdCBpbiAlZGVxdWUgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBhcmdzICBBcmd1bWVudHMuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW4gb2JqZWN0IG9mIHR5cGUgVCBjb25zdHJ1Y3RlZAorICAgICAgICogIHdpdGggVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHZhbHVlIGludG8gJWRlcXVlIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlIGJlZm9yZSB0aGUKKyAgICAgICAqICBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgZ2l2ZW4gcnZhbHVlIGludG8gJWRlcXVlIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHJ2YWx1ZSBiZWZvcmUgdGhlCisgICAgICAgKiAgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBlbXBsYWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYW4gaW5pdGlhbGl6ZXIgbGlzdCBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBwICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIGwgaW50byB0aGUgJWRlcXVlIGJlZm9yZSB0aGUgbG9jYXRpb24KKyAgICAgICAqICBzcGVjaWZpZWQgYnkgQGEgcC4gIFRoaXMgaXMga25vd24gYXMgPGVtPmxpc3QgaW5zZXJ0PC9lbT4uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19wLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIG51bWJlciBvZiBjb3BpZXMgb2YgZ2l2ZW4gZGF0YSBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBnaXZlbgorICAgICAgICogIGRhdGEgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgcG9zaXRpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9NX2ZpbGxfaW5zZXJ0KF9fcG9zaXRpb24sIF9fbiwgX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgYSByYW5nZSBpbnRvIHRoZSAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWRlcXVlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbZmlyc3QsbGFzdCkgaW50byB0aGUgJWRlcXVlIGJlZm9yZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCisgICAgICAgKiAgYnkgQGEgcG9zLiAgVGhpcyBpcyBrbm93biBhcyA8ZW0+cmFuZ2UgaW5zZXJ0PC9lbT4uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbnNlcnRfZGlzcGF0Y2goX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBlbGVtZW50IGF0IGdpdmVuIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0IGVsZW1lbnQgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgdGh1cworICAgICAgICogIHNob3J0ZW4gdGhlICVkZXF1ZSBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIFRoZSB1c2VyIGlzIGNhdXRpb25lZCB0aGF0CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMKKyAgICAgICAqICBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4KKyAgICAgICAqICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgbGFzdAorICAgICAgICogICAgICAgICAgIHByaW9yIHRvIGVyYXNpbmcgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGFuZAorICAgICAgICogIHNob3J0ZW4gdGhlICVkZXF1ZSBhY2NvcmRpbmdseS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHVzZXIgaXMgY2F1dGlvbmVkIHRoYXQKKyAgICAgICAqICB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlZGVxdWUuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVkZXF1ZSBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBkZXF1ZXMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICAoRm91ciBwb2ludGVycywgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChkMSxkMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZGVxdWUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX194Ll9NX2ltcGwuX01fc3RhcnQpOworCXN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX194Ll9NX2ltcGwuX01fZmluaXNoKTsKKwlzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9tYXAsIF9feC5fTV9pbXBsLl9NX21hcCk7CisJc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUsIF9feC5fTV9pbXBsLl9NX21hcF9zaXplKTsKKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisJc3RkOjpfX2FsbG9jX3N3YXA8X1RwX2FsbG9jX3R5cGU+OjpfU19kb19pdChfTV9nZXRfVHBfYWxsb2NhdG9yKCksCisJCQkJCQkgICAgX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlCisgICAgICAgKiAgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzCisgICAgICAgKiAgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9lcmFzZV9hdF9lbmQoYmVnaW4oKSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgX190cnVlX3R5cGUpCisgICAgICAgIHsKKwkgIF9NX2luaXRpYWxpemVfbWFwKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSk7CisJICBfTV9maWxsX2luaXRpYWxpemUoX194KTsKKwl9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgIF9fZmFsc2VfdHlwZSkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OgorCSAgICBpdGVyYXRvcl9jYXRlZ29yeSBfSXRlckNhdGVnb3J5OworCSAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfX2ZpcnN0LCBfX2xhc3QsIF9JdGVyQ2F0ZWdvcnkoKSk7CisJfQorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBpbml0aWFsaXplX2Rpc3BhdGNoIGFib3ZlCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmlsbHMgdGhlIGRlcXVlIHdpdGggd2hhdGV2ZXIgaXMgaW4gW2ZpcnN0LGxhc3QpLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBpdGVyYXRvcnMgYXJlIGFjdHVhbGx5IGZvcndhcmQgaXRlcmF0b3JzIChvciBiZXR0ZXIpLCB0aGVuIHRoZQorICAgICAgICogIG1lbW9yeSBsYXlvdXQgY2FuIGJlIGRvbmUgYWxsIGF0IG9uY2UuICBFbHNlIHdlIG1vdmUgZm9yd2FyZCB1c2luZworICAgICAgICogIHB1c2hfYmFjayBvbiBlYWNoIHZhbHVlIGZyb20gdGhlIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGluaXRpYWxpemVfZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpOworICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmlsbHMgdGhlICVkZXF1ZSB3aXRoIGNvcGllcyBvZiB2YWx1ZS4KKyAgICAgICAqICBAcGFyYW0gIHZhbHVlICBJbml0aWFsIHZhbHVlLgorICAgICAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgICAgICogIEBwcmUgX01fc3RhcnQgYW5kIF9NX2ZpbmlzaCBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwKKyAgICAgICAqICBidXQgbm9uZSBvZiB0aGUgJWRlcXVlJ3MgZWxlbWVudHMgaGF2ZSB5ZXQgYmVlbiBjb25zdHJ1Y3RlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSB1c2VyIHByb3ZpZGVzIGFuIGV4cGxpY2l0IHNpemUKKyAgICAgICAqICAod2l0aCBvciB3aXRob3V0IGFuIGV4cGxpY2l0IGV4ZW1wbGFyIHZhbHVlKS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fZmlsbF9pbml0aWFsaXplKGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsdWUpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8vIGNhbGxlZCBieSBkZXF1ZShuKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmCisKKyAgICAgIC8vIEludGVybmFsIGFzc2lnbiBmdW5jdGlvbnMgZm9sbG93LiAgVGhlICpfYXV4IGZ1bmN0aW9ucyBkbyB0aGUgYWN0dWFsCisgICAgICAvLyBhc3NpZ25tZW50IHdvcmsgZm9yIHRoZSByYW5nZSB2ZXJzaW9ucy4KKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgYXNzaWduIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisJICBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGFzc2lnbl9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBzZWNvbmQgYXNzaWduX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgaWYgKF9fbGVuID4gc2l6ZSgpKQorCSAgICB7CisJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJICAgICAgc3RkOjphZHZhbmNlKF9fbWlkLCBzaXplKCkpOworCSAgICAgIHN0ZDo6Y29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CisJICAgICAgaW5zZXJ0KGVuZCgpLCBfX21pZCwgX19sYXN0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfTV9lcmFzZV9hdF9lbmQoc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgYmVnaW4oKSkpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGFzc2lnbihuLHQpLCBhbmQgdGhlIHJhbmdlIGFzc2lnbiB3aGVuIGl0IHR1cm5zIG91dAorICAgICAgLy8gdG8gYmUgdGhlIHNhbWUgdGhpbmcuCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2Fzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICAgIHsKKwlpZiAoX19uID4gc2l6ZSgpKQorCSAgeworCSAgICBzdGQ6OmZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKKwkgICAgaW5zZXJ0KGVuZCgpLCBfX24gLSBzaXplKCksIF9fdmFsKTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9NX2VyYXNlX2F0X2VuZChiZWdpbigpICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCSAgICBzdGQ6OmZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgLy9AeworICAgICAgLy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHB1c2hfKiBhbmQgcG9wXyouCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkIF9NX3B1c2hfYmFja19hdXgoY29uc3QgdmFsdWVfdHlwZSYpOworCisgICAgICB2b2lkIF9NX3B1c2hfZnJvbnRfYXV4KGNvbnN0IHZhbHVlX3R5cGUmKTsKKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZCBfTV9wdXNoX2JhY2tfYXV4KF9BcmdzJiYuLi4gX19hcmdzKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQgX01fcHVzaF9mcm9udF9hdXgoX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIHZvaWQgX01fcG9wX2JhY2tfYXV4KCk7CisKKyAgICAgIHZvaWQgX01fcG9wX2Zyb250X2F1eCgpOworICAgICAgLy9AfQorCisgICAgICAvLyBJbnRlcm5hbCBpbnNlcnQgZnVuY3Rpb25zIGZvbGxvdy4gIFRoZSAqX2F1eCBmdW5jdGlvbnMgZG8gdGhlIGFjdHVhbAorICAgICAgLy8gaW5zZXJ0aW9uIHdvcmsgd2hlbiBhbGwgc2hvcnRjdXRzIGZhaWwuCisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgaW5zZXJ0IHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywKKwkJCSAgIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX194LCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3gpOyB9CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgcmFuZ2UgaW5zZXJ0IHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCisJCQkgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjoKKwkgICAgaXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJDYXRlZ29yeTsKKyAgICAgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KF9fcG9zLCBfX2ZpcnN0LCBfX2xhc3QsIF9JdGVyQ2F0ZWdvcnkoKSk7CisJfQorCisgICAgICAvLyBjYWxsZWQgYnkgdGhlIHNlY29uZCBpbnNlcnRfZGlzcGF0Y2ggYWJvdmUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3JhbmdlX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3MsIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIGNhbGxlZCBieSB0aGUgc2Vjb25kIGluc2VydF9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpOworCisgICAgICAvLyBDYWxsZWQgYnkgaW5zZXJ0KHAsbix4KSwgYW5kIHRoZSByYW5nZSBpbnNlcnQgd2hlbiBpdCB0dXJucyBvdXQgdG8gYmUKKyAgICAgIC8vIHRoZSBzYW1lIHRoaW5nLiAgQ2FuIHVzZSBmaWxsIGZ1bmN0aW9ucyBpbiBvcHRpbWFsIHNpdHVhdGlvbnMsCisgICAgICAvLyBvdGhlcndpc2UgcGFzc2VzIG9mZiB0byBpbnNlcnRfYXV4KHAsbix4KS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisgICAgICAvLyBjYWxsZWQgYnkgaW5zZXJ0KHAseCkKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLy8gY2FsbGVkIGJ5IGluc2VydChwLG4seCkgdmlhIGZpbGxfaW5zZXJ0CisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisgICAgICAvLyBjYWxsZWQgYnkgcmFuZ2VfaW5zZXJ0X2F1eCBmb3IgZm9yd2FyZCBpdGVyYXRvcnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3BvcywKKwkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgc2l6ZV90eXBlIF9fbik7CisKKworICAgICAgLy8gSW50ZXJuYWwgZXJhc2UgZnVuY3Rpb25zIGZvbGxvdy4KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9kYXRhX2F1eChpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpOworCisgICAgICAvLyBDYWxsZWQgYnkgfmRlcXVlKCkuCisgICAgICAvLyBOQjogRG9lc24ndCBkZWFsbG9jYXRlIHRoZSBub2Rlcy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYzE+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fZGVzdHJveV9kYXRhKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0FsbG9jMSYpCisgICAgICAgIHsgX01fZGVzdHJveV9kYXRhX2F1eChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Rlc3Ryb3lfZGF0YShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIGNvbnN0IHN0ZDo6YWxsb2NhdG9yPF9UcD4mKQorICAgICAgeworCWlmICghX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yKHZhbHVlX3R5cGUpKQorCSAgX01fZGVzdHJveV9kYXRhX2F1eChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgfQorCisgICAgICAvLyBDYWxsZWQgYnkgZXJhc2UocTEsIHEyKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2F0X2JlZ2luKGl0ZXJhdG9yIF9fcG9zKQorICAgICAgeworCV9NX2Rlc3Ryb3lfZGF0YShiZWdpbigpLCBfX3BvcywgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwlfTV9kZXN0cm95X25vZGVzKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZSwgX19wb3MuX01fbm9kZSk7CisJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fcG9zOworICAgICAgfQorCisgICAgICAvLyBDYWxsZWQgYnkgZXJhc2UocTEsIHEyKSwgcmVzaXplKCksIGNsZWFyKCksIF9NX2Fzc2lnbl9hdXgsCisgICAgICAvLyBfTV9maWxsX2Fzc2lnbiwgb3BlcmF0b3I9LgorICAgICAgdm9pZAorICAgICAgX01fZXJhc2VfYXRfZW5kKGl0ZXJhdG9yIF9fcG9zKQorICAgICAgeworCV9NX2Rlc3Ryb3lfZGF0YShfX3BvcywgZW5kKCksIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJX01fZGVzdHJveV9ub2RlcyhfX3Bvcy5fTV9ub2RlICsgMSwKKwkJCSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9ub2RlICsgMSk7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX3BvczsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBDYWxsZWQgYnkgcmVzaXplKHN6KS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pOworI2VuZGlmCisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBNZW1vcnktaGFuZGxpbmcgaGVscGVycyBmb3IgdGhlIHByZXZpb3VzIGludGVybmFsIGluc2VydCBmdW5jdGlvbnMuCisgICAgICBpdGVyYXRvcgorICAgICAgX01fcmVzZXJ2ZV9lbGVtZW50c19hdF9mcm9udChzaXplX3R5cGUgX19uKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX3ZhY2FuY2llcyA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fY3VyCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0Ll9NX2ZpcnN0OworCWlmIChfX24gPiBfX3ZhY2FuY2llcykKKwkgIF9NX25ld19lbGVtZW50c19hdF9mcm9udChfX24gLSBfX3ZhY2FuY2llcyk7CisJcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgLSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX3Jlc2VydmVfZWxlbWVudHNfYXRfYmFjayhzaXplX3R5cGUgX19uKQorICAgICAgeworCWNvbnN0IHNpemVfdHlwZSBfX3ZhY2FuY2llcyA9ICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaC5fTV9sYXN0CisJCQkJICAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fY3VyKSAtIDE7CisJaWYgKF9fbiA+IF9fdmFjYW5jaWVzKQorCSAgX01fbmV3X2VsZW1lbnRzX2F0X2JhY2soX19uIC0gX192YWNhbmNpZXMpOworCXJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9uZXdfZWxlbWVudHNfYXRfZnJvbnQoc2l6ZV90eXBlIF9fbmV3X2VsZW1lbnRzKTsKKworICAgICAgdm9pZAorICAgICAgX01fbmV3X2VsZW1lbnRzX2F0X2JhY2soc2l6ZV90eXBlIF9fbmV3X2VsZW1lbnRzKTsKKyAgICAgIC8vQH0KKworCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgTWVtb3J5LWhhbmRsaW5nIGhlbHBlcnMgZm9yIHRoZSBtYWpvciAlbWFwLgorICAgICAgICoKKyAgICAgICAqICBNYWtlcyBzdXJlIHRoZSBfTV9tYXAgaGFzIHNwYWNlIGZvciBuZXcgbm9kZXMuICBEb2VzIG5vdAorICAgICAgICogIGFjdHVhbGx5IGFkZCB0aGUgbm9kZXMuICBDYW4gaW52YWxpZGF0ZSBfTV9tYXAgcG9pbnRlcnMuCisgICAgICAgKiAgKEFuZCBjb25zZXF1ZW50bHksICVkZXF1ZSBpdGVyYXRvcnMuKQorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV9yZXNlcnZlX21hcF9hdF9iYWNrKHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCA9IDEpCisgICAgICB7CisJaWYgKF9fbm9kZXNfdG9fYWRkICsgMSA+IHRoaXMtPl9NX2ltcGwuX01fbWFwX3NpemUKKwkgICAgLSAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fbm9kZSAtIHRoaXMtPl9NX2ltcGwuX01fbWFwKSkKKwkgIF9NX3JlYWxsb2NhdGVfbWFwKF9fbm9kZXNfdG9fYWRkLCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Jlc2VydmVfbWFwX2F0X2Zyb250KHNpemVfdHlwZSBfX25vZGVzX3RvX2FkZCA9IDEpCisgICAgICB7CisJaWYgKF9fbm9kZXNfdG9fYWRkID4gc2l6ZV90eXBlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQuX01fbm9kZQorCQkJCSAgICAgICAtIHRoaXMtPl9NX2ltcGwuX01fbWFwKSkKKwkgIF9NX3JlYWxsb2NhdGVfbWFwKF9fbm9kZXNfdG9fYWRkLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fcmVhbGxvY2F0ZV9tYXAoc2l6ZV90eXBlIF9fbm9kZXNfdG9fYWRkLCBib29sIF9fYWRkX2F0X2Zyb250KTsKKyAgICAgIC8vQH0KKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIERlcXVlIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIHggIEEgJWRlcXVlLgorICAgKiAgQHBhcmFtICB5ICBBICVkZXF1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIGRlcXVlcyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgZGVxdWVzLiAgRGVxdWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLAorICAgKiAgYW5kIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKQorICAgICAgICAgICAgICYmIHN0ZDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIERlcXVlIG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICB4ICBBICVkZXF1ZS4KKyAgICogIEBwYXJhbSAgeSAgQSAlZGVxdWUgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgQGEgeCBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gQGEgeS4KKyAgICoKKyAgICogIFRoaXMgaXMgYSB0b3RhbCBvcmRlcmluZyByZWxhdGlvbi4gIEl0IGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUKKyAgICogIGRlcXVlcy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkJICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6ZGVxdWU6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGRlcXVlPF9UcCxfQWxsb2M+JiBfX3gsIGRlcXVlPF9UcCxfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyN1bmRlZiBfR0xJQkNYWF9ERVFVRV9CVUZfU0laRQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX0RFUVVFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfZnVuY3Rpb24uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfZnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY1NWZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9mdW5jdGlvbi5oCkBAIC0wLDAgKzEsNzM0IEBACisvLyBGdW5jdG9yIGltcGxlbWVudGF0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9mdW5jdGlvbi5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZnVuY3Rpb25hbH0KKyAqLworCisjaWZuZGVmIF9TVExfRlVOQ1RJT05fSAorI2RlZmluZSBfU1RMX0ZVTkNUSU9OX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjAuMy4xIGJhc2UgY2xhc3NlcworICAvKiogQGRlZmdyb3VwIGZ1bmN0b3JzIEZ1bmN0aW9uIE9iamVjdHMKKyAgICogQGluZ3JvdXAgdXRpbGl0aWVzCisgICAqCisgICAqICBGdW5jdGlvbiBvYmplY3RzLCBvciBAZSBmdW5jdG9ycywgYXJlIG9iamVjdHMgd2l0aCBhbiBAYyBvcGVyYXRvcigpCisgICAqICBkZWZpbmVkIGFuZCBhY2Nlc3NpYmxlLiAgVGhleSBjYW4gYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBhbGdvcml0aG0KKyAgICogIHRlbXBsYXRlcyBhbmQgdXNlZCBpbiBwbGFjZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIuICBOb3Qgb25seSBpcyB0aGUKKyAgICogIHJlc3VsdGluZyBleHByZXNzaXZlbmVzcyBvZiB0aGUgbGlicmFyeSBpbmNyZWFzZWQsIGJ1dCB0aGUgZ2VuZXJhdGVkCisgICAqICBjb2RlIGNhbiBiZSBtb3JlIGVmZmljaWVudCB0aGFuIHdoYXQgeW91IG1pZ2h0IHdyaXRlIGJ5IGhhbmQuICBXaGVuIHdlCisgICAqICByZWZlciB0byBAYSBmdW5jdG9ycywgdGhlbiwgZ2VuZXJhbGx5IHdlIGluY2x1ZGUgZnVuY3Rpb24gcG9pbnRlcnMgaW4KKyAgICogIHRoZSBkZXNjcmlwdGlvbiBhcyB3ZWxsLgorICAgKgorICAgKiAgT2Z0ZW4sIGZ1bmN0b3JzIGFyZSBvbmx5IGNyZWF0ZWQgYXMgdGVtcG9yYXJpZXMgcGFzc2VkIHRvIGFsZ29yaXRobQorICAgKiAgY2FsbHMsIHJhdGhlciB0aGFuIGJlaW5nIGNyZWF0ZWQgYXMgbmFtZWQgdmFyaWFibGVzLgorICAgKgorICAgKiAgVHdvIGV4YW1wbGVzIHRha2VuIGZyb20gdGhlIHN0YW5kYXJkIGl0c2VsZiBmb2xsb3cuICBUbyBwZXJmb3JtIGEKKyAgICogIGJ5LWVsZW1lbnQgYWRkaXRpb24gb2YgdHdvIHZlY3RvcnMgQGMgYSBhbmQgQGMgYiBjb250YWluaW5nIEBjIGRvdWJsZSwKKyAgICogIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBAYyBhLCB1c2UKKyAgICogIFxjb2RlCisgICAqICB0cmFuc2Zvcm0gKGEuYmVnaW4oKSwgYS5lbmQoKSwgYi5iZWdpbigpLCBhLmJlZ2luKCksIHBsdXM8ZG91YmxlPigpKTsKKyAgICogIFxlbmRjb2RlCisgICAqICBUbyBuZWdhdGUgZXZlcnkgZWxlbWVudCBpbiBAYyBhLCB1c2UKKyAgICogIFxjb2RlCisgICAqICB0cmFuc2Zvcm0oYS5iZWdpbigpLCBhLmVuZCgpLCBhLmJlZ2luKCksIG5lZ2F0ZTxkb3VibGU+KCkpOworICAgKiAgXGVuZGNvZGUKKyAgICogIFRoZSBhZGRpdGlvbiBhbmQgbmVnYXRpb24gZnVuY3Rpb25zIHdpbGwgYmUgaW5saW5lZCBkaXJlY3RseS4KKyAgICoKKyAgICogIFRoZSBzdGFuZGFyZCBmdW5jdG9ycyBhcmUgZGVyaXZlZCBmcm9tIHN0cnVjdHMgbmFtZWQgQGMgdW5hcnlfZnVuY3Rpb24KKyAgICogIGFuZCBAYyBiaW5hcnlfZnVuY3Rpb24uICBUaGVzZSB0d28gY2xhc3NlcyBjb250YWluIG5vdGhpbmcgYnV0IHR5cGVkZWZzLAorICAgKiAgdG8gYWlkIGluIGdlbmVyaWMgKHRlbXBsYXRlKSBwcm9ncmFtbWluZy4gIElmIHlvdSB3cml0ZSB5b3VyIG93bgorICAgKiAgZnVuY3RvcnMsIHlvdSBtaWdodCBjb25zaWRlciBkb2luZyB0aGUgc2FtZS4KKyAgICoKKyAgICogIEB7CisgICAqLworICAvKioKKyAgICogIFRoaXMgaXMgb25lIG9mIHRoZSBAbGluayBmdW5jdG9ycyBmdW5jdG9yIGJhc2UgY2xhc3Nlc0BlbmRsaW5rLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgdW5hcnlfZnVuY3Rpb24KKyAgICB7CisgICAgICAvLy8gQGMgYXJndW1lbnRfdHlwZSBpcyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQKKyAgICAgIHR5cGVkZWYgX0FyZyAJYXJndW1lbnRfdHlwZTsgICAKKworICAgICAgLy8vIEBjIHJlc3VsdF90eXBlIGlzIHRoZSByZXR1cm4gdHlwZQorICAgICAgdHlwZWRlZiBfUmVzdWx0IAlyZXN1bHRfdHlwZTsgIAorICAgIH07CisKKyAgLyoqCisgICAqICBUaGlzIGlzIG9uZSBvZiB0aGUgQGxpbmsgZnVuY3RvcnMgZnVuY3RvciBiYXNlIGNsYXNzZXNAZW5kbGluay4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcxLCB0eXBlbmFtZSBfQXJnMiwgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBzdHJ1Y3QgYmluYXJ5X2Z1bmN0aW9uCisgICAgeworICAgICAgLy8vIEBjIGZpcnN0X2FyZ3VtZW50X3R5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICB0eXBlZGVmIF9BcmcxIAlmaXJzdF9hcmd1bWVudF90eXBlOyAKKworICAgICAgLy8vIEBjIHNlY29uZF9hcmd1bWVudF90eXBlIGlzIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICAgIHR5cGVkZWYgX0FyZzIgCXNlY29uZF9hcmd1bWVudF90eXBlOworCisgICAgICAvLy8gQGMgcmVzdWx0X3R5cGUgaXMgdGhlIHJldHVybiB0eXBlCisgICAgICB0eXBlZGVmIF9SZXN1bHQgCXJlc3VsdF90eXBlOworICAgIH07CisgIC8qKiBAfSAgKi8KKworICAvLyAyMC4zLjIgYXJpdGhtZXRpYworICAvKiogQGRlZmdyb3VwIGFyaXRobWV0aWNfZnVuY3RvcnMgQXJpdGhtZXRpYyBDbGFzc2VzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBCZWNhdXNlIGJhc2ljIG1hdGggb2Z0ZW4gbmVlZHMgdG8gYmUgZG9uZSBkdXJpbmcgYW4gYWxnb3JpdGhtLAorICAgKiAgdGhlIGxpYnJhcnkgcHJvdmlkZXMgZnVuY3RvcnMgZm9yIHRob3NlIG9wZXJhdGlvbnMuICBTZWUgdGhlCisgICAqICBkb2N1bWVudGF0aW9uIGZvciBAbGluayBmdW5jdG9ycyB0aGUgYmFzZSBjbGFzc2VzQGVuZGxpbmsKKyAgICogIGZvciBleGFtcGxlcyBvZiB0aGVpciB1c2UuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYXJpdGhtZXRpY19mdW5jdG9ycyBtYXRoIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcGx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICsgX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtaW51cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IC0gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggKiBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGFyaXRobWV0aWNfZnVuY3RvcnMgbWF0aCBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGRpdmlkZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAvIF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgYXJpdGhtZXRpY19mdW5jdG9ycyBtYXRoIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbW9kdWx1cyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICUgX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBhcml0aG1ldGljX2Z1bmN0b3JzIG1hdGggZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBuZWdhdGUgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfVHA+CisgICAgeworICAgICAgX1RwCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gLV9feDsgfQorICAgIH07CisgIC8qKiBAfSAgKi8KKworICAvLyAyMC4zLjMgY29tcGFyaXNvbnMKKyAgLyoqIEBkZWZncm91cCBjb21wYXJpc29uX2Z1bmN0b3JzIENvbXBhcmlzb24gQ2xhc3NlcworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgVGhlIGxpYnJhcnkgcHJvdmlkZXMgc2l4IHdyYXBwZXIgZnVuY3RvcnMgZm9yIGFsbCB0aGUgYmFzaWMgY29tcGFyaXNvbnMKKyAgICogIGluIEMrKywgbGlrZSBAYyA8LgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGVxdWFsX3RvIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA9PSBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IG5vdF9lcXVhbF90byA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggIT0gX195OyB9CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBjb21wYXJpc29uX2Z1bmN0b3JzIGNvbXBhcmlzb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBncmVhdGVyIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA+IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPCBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGNvbXBhcmlzb25fZnVuY3RvcnMgY29tcGFyaXNvbiBmdW5jdG9yc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGdyZWF0ZXJfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID49IF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgY29tcGFyaXNvbl9mdW5jdG9ycyBjb21wYXJpc29uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbGVzc19lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIGJvb2w+CisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPD0gX195OyB9CisgICAgfTsKKyAgLyoqIEB9ICAqLworCisgIC8vIDIwLjMuNCBsb2dpY2FsIG9wZXJhdGlvbnMKKyAgLyoqIEBkZWZncm91cCBsb2dpY2FsX2Z1bmN0b3JzIEJvb2xlYW4gT3BlcmF0aW9ucyBDbGFzc2VzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBIZXJlIGFyZSB3cmFwcGVyIGZ1bmN0b3JzIGZvciBCb29sZWFuIG9wZXJhdGlvbnM6IEBjICYmLCBAYyB8fCwKKyAgICogIGFuZCBAYyAhLgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGxvZ2ljYWxfZnVuY3RvcnMgQm9vbGVhbiBvcGVyYXRpb25zIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbG9naWNhbF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCwgX1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICYmIF9feTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbG9naWNhbF9mdW5jdG9ycyBCb29sZWFuIG9wZXJhdGlvbnMgZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBsb2dpY2FsX29yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgYm9vbD4KKyAgICB7CisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCB8fCBfX3k7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGxvZ2ljYWxfZnVuY3RvcnMgQm9vbGVhbiBvcGVyYXRpb25zIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbG9naWNhbF9ub3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBib29sPgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAhX194OyB9CisgICAgfTsKKyAgLyoqIEB9ICAqLworCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgNjYwLiBNaXNzaW5nIEJpdHdpc2UgT3BlcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBiaXRfYW5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJiBfX3k7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYml0X29yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9UcCwgX1RwPgorICAgIHsKKyAgICAgIF9UcAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggfCBfX3k7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYml0X3hvciA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLCBfVHAsIF9UcD4KKyAgICB7CisgICAgICBfVHAKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IF4gX195OyB9CisgICAgfTsKKworICAvLyAyMC4zLjUgbmVnYXRvcnMKKyAgLyoqIEBkZWZncm91cCBuZWdhdG9ycyBOZWdhdG9ycworICAgKiBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgVGhlIGZ1bmN0aW9ucyBAYyBub3QxIGFuZCBAYyBub3QyIGVhY2ggdGFrZSBhIHByZWRpY2F0ZSBmdW5jdG9yCisgICAqICBhbmQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIEBjIHVuYXJ5X25lZ2F0ZSBvcgorICAgKiAgQGMgYmluYXJ5X25lZ2F0ZSwgcmVzcGVjdGl2ZWx5LiAgVGhlc2UgY2xhc3NlcyBhcmUgZnVuY3RvcnMgd2hvc2UKKyAgICogIEBjIG9wZXJhdG9yKCkgcGVyZm9ybXMgdGhlIHN0b3JlZCBwcmVkaWNhdGUgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucworICAgKiAgdGhlIG5lZ2F0aW9uIG9mIHRoZSByZXN1bHQuCisgICAqCisgICAqICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSB2ZWN0b3Igb2YgaW50ZWdlcnMgYW5kIGEgdHJpdmlhbCBwcmVkaWNhdGUsCisgICAqICBcY29kZQorICAgKiAgc3RydWN0IEludEdyZWF0ZXJUaGFuVGhyZWUKKyAgICogICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxpbnQsIGJvb2w+CisgICAqICB7CisgICAqICAgICAgYm9vbCBvcGVyYXRvcigpIChpbnQgeCkgeyByZXR1cm4geCA+IDM7IH0KKyAgICogIH07CisgICAqCisgICAqICBzdGQ6OmZpbmRfaWYgKHYuYmVnaW4oKSwgdi5lbmQoKSwgbm90MShJbnRHcmVhdGVyVGhhblRocmVlKCkpKTsKKyAgICogIFxlbmRjb2RlCisgICAqICBUaGUgY2FsbCB0byBAYyBmaW5kX2lmIHdpbGwgbG9jYXRlIHRoZSBmaXJzdCBpbmRleCAoaSkgb2YgQGMgdiBmb3Igd2hpY2gKKyAgICogIDxjb2RlPiEodltpXSA+IDMpPC9jb2RlPiBpcyB0cnVlLgorICAgKgorICAgKiAgVGhlIG5vdDEvdW5hcnlfbmVnYXRlIGNvbWJpbmF0aW9uIHdvcmtzIG9uIHByZWRpY2F0ZXMgdGFraW5nIGEgc2luZ2xlCisgICAqICBhcmd1bWVudC4gIFRoZSBub3QyL2JpbmFyeV9uZWdhdGUgY29tYmluYXRpb24gd29ya3Mgb24gcHJlZGljYXRlcyB3aGljaAorICAgKiAgdGFrZSB0d28gYXJndW1lbnRzLgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG5lZ2F0b3JzIG5lZ2F0aW9uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgY2xhc3MgdW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSwgYm9vbD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1ByZWRpY2F0ZSBfTV9wcmVkOworCisgICAgcHVibGljOgorICAgICAgZXhwbGljaXQKKyAgICAgIHVuYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICFfTV9wcmVkKF9feCk7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG5lZ2F0b3JzIG5lZ2F0aW9uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPgorICAgIG5vdDEoY29uc3QgX1ByZWRpY2F0ZSYgX19wcmVkKQorICAgIHsgcmV0dXJuIHVuYXJ5X25lZ2F0ZTxfUHJlZGljYXRlPihfX3ByZWQpOyB9CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgbmVnYXRvcnMgbmVnYXRpb24gZnVuY3RvcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBjbGFzcyBiaW5hcnlfbmVnYXRlCisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisJCQkgICAgIHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNlY29uZF9hcmd1bWVudF90eXBlLCBib29sPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfUHJlZGljYXRlIF9NX3ByZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgYmluYXJ5X25lZ2F0ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feCwKKwkJIGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNlY29uZF9hcmd1bWVudF90eXBlJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiAhX01fcHJlZChfX3gsIF9feSk7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG5lZ2F0b3JzIG5lZ2F0aW9uIGZ1bmN0b3JzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJpbmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4KKyAgICBub3QyKGNvbnN0IF9QcmVkaWNhdGUmIF9fcHJlZCkKKyAgICB7IHJldHVybiBiaW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7IH0KKyAgLyoqIEB9ICAqLworCisgIC8vIDIwLjMuNyBhZGFwdG9ycyBwb2ludGVycyBmdW5jdGlvbnMKKyAgLyoqIEBkZWZncm91cCBwb2ludGVyX2FkYXB0b3JzIEFkYXB0b3JzIGZvciBwb2ludGVycyB0byBmdW5jdGlvbnMKKyAgICogQGluZ3JvdXAgZnVuY3RvcnMKKyAgICoKKyAgICogIFRoZSBhZHZhbnRhZ2Ugb2YgZnVuY3Rpb24gb2JqZWN0cyBvdmVyIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBpcyB0aGF0CisgICAqICB0aGUgb2JqZWN0cyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBkZWNsYXJlIG5lc3RlZCB0eXBlZGVmcyBkZXNjcmliaW5nCisgICAqICB0aGVpciBhcmd1bWVudCBhbmQgcmVzdWx0IHR5cGVzIHdpdGggdW5pZm9ybSBuYW1lcyAoZS5nLiwgQGMgcmVzdWx0X3R5cGUKKyAgICogIGZyb20gdGhlIGJhc2UgY2xhc3NlcyBAYyB1bmFyeV9mdW5jdGlvbiBhbmQgQGMgYmluYXJ5X2Z1bmN0aW9uKS4KKyAgICogIFNvbWV0aW1lcyB0aG9zZSB0eXBlZGVmcyBhcmUgcmVxdWlyZWQsIG5vdCBqdXN0IG9wdGlvbmFsLgorICAgKgorICAgKiAgQWRhcHRvcnMgYXJlIHByb3ZpZGVkIHRvIHR1cm4gcG9pbnRlcnMgdG8gdW5hcnkgKHNpbmdsZS1hcmd1bWVudCkgYW5kCisgICAqICBiaW5hcnkgKGRvdWJsZS1hcmd1bWVudCkgZnVuY3Rpb25zIGludG8gZnVuY3Rpb24gb2JqZWN0cy4gIFRoZQorICAgKiAgbG9uZy13aW5kZWQgZnVuY3RvciBAYyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIGlzIGNvbnN0cnVjdGVkIHdpdGggYQorICAgKiAgZnVuY3Rpb24gcG9pbnRlciBAYyBmLCBhbmQgaXRzIEBjIG9wZXJhdG9yKCkgY2FsbGVkIHdpdGggYXJndW1lbnQgQGMgeAorICAgKiAgcmV0dXJucyBAYyBmKHgpLiAgVGhlIGZ1bmN0b3IgQGMgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gZG9lcyB0aGUgc2FtZQorICAgKiAgdGhpbmcsIGJ1dCB3aXRoIGEgZG91YmxlLWFyZ3VtZW50IEBjIGYgYW5kIEBjIG9wZXJhdG9yKCkuCisgICAqCisgICAqICBUaGUgZnVuY3Rpb24gQGMgcHRyX2Z1biB0YWtlcyBhIHBvaW50ZXItdG8tZnVuY3Rpb24gQGMgZiBhbmQgY29uc3RydWN0cworICAgKiAgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGZ1bmN0b3IuCisgICAqCisgICAqICBAeworICAgKi8KKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBjbGFzcyBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcpOworCisgICAgcHVibGljOgorICAgICAgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbigpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnKSkKKyAgICAgIDogX01fcHRyKF9feCkgeyB9CisKKyAgICAgIF9SZXN1bHQKKyAgICAgIG9wZXJhdG9yKCkoX0FyZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wdHIoX194KTsgfQorICAgIH07CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZywgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBpbmxpbmUgcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PgorICAgIHB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZykpCisgICAgeyByZXR1cm4gcG9pbnRlcl90b191bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PihfX3gpOyB9CisKKyAgLy8vIE9uZSBvZiB0aGUgQGxpbmsgcG9pbnRlcl9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZzEsIHR5cGVuYW1lIF9BcmcyLCB0eXBlbmFtZSBfUmVzdWx0PgorICAgIGNsYXNzIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uCisgICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX1Jlc3VsdD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX1Jlc3VsdCAoKl9NX3B0cikoX0FyZzEsIF9BcmcyKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnMSwgX0FyZzIpKQorICAgICAgOiBfTV9wdHIoX194KSB7IH0KKworICAgICAgX1Jlc3VsdAorICAgICAgb3BlcmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3B0cihfX3gsIF9feSk7IH0KKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIHBvaW50ZXJfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzQGVuZGxpbmsuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcxLCB0eXBlbmFtZSBfQXJnMiwgdHlwZW5hbWUgX1Jlc3VsdD4KKyAgICBpbmxpbmUgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfUmVzdWx0PgorICAgIHB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkKKyAgICB7IHJldHVybiBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9SZXN1bHQ+KF9feCk7IH0KKyAgLyoqIEB9ICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0lkZW50aXR5IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfVHA+CisgICAgeworICAgICAgX1RwJgorICAgICAgb3BlcmF0b3IoKShfVHAmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorCisgICAgICBjb25zdCBfVHAmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX194OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcj4KKyAgICBzdHJ1Y3QgX1NlbGVjdDFzdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFpciwKKwkJCQkJICAgICAgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGU+CisgICAgeworICAgICAgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKF9QYWlyJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKworICAgICAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYWlyJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpcjI+CisgICAgICAgIHR5cGVuYW1lIF9QYWlyMjo6Zmlyc3RfdHlwZSYKKyAgICAgICAgb3BlcmF0b3IoKShfUGFpcjImIF9feCkgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX194LmZpcnN0OyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyMj4KKyAgICAgICAgY29uc3QgdHlwZW5hbWUgX1BhaXIyOjpmaXJzdF90eXBlJgorICAgICAgICBvcGVyYXRvcigpKGNvbnN0IF9QYWlyMiYgX194KSBjb25zdAorICAgICAgICB7IHJldHVybiBfX3guZmlyc3Q7IH0KKyNlbmRpZgorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXI+CisgICAgc3RydWN0IF9TZWxlY3QybmQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsCisJCQkJCSAgICAgIHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZT4KKyAgICB7CisgICAgICB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUmCisgICAgICBvcGVyYXRvcigpKF9QYWlyJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3guc2Vjb25kOyB9CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX1BhaXImIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feC5zZWNvbmQ7IH0KKyAgICB9OworCisgIC8vIDIwLjMuOCBhZGFwdG9ycyBwb2ludGVycyBtZW1iZXJzCisgIC8qKiBAZGVmZ3JvdXAgbWVtb3J5X2FkYXB0b3JzIEFkYXB0b3JzIGZvciBwb2ludGVycyB0byBtZW1iZXJzCisgICAqIEBpbmdyb3VwIGZ1bmN0b3JzCisgICAqCisgICAqICBUaGVyZSBhcmUgYSB0b3RhbCBvZiA4ID0gMl4zIGZ1bmN0aW9uIG9iamVjdHMgaW4gdGhpcyBmYW1pbHkuCisgICAqICAgKDEpIE1lbWJlciBmdW5jdGlvbnMgdGFraW5nIG5vIGFyZ3VtZW50cyB2cyBtZW1iZXIgZnVuY3Rpb25zIHRha2luZworICAgKiAgICAgICAgb25lIGFyZ3VtZW50LgorICAgKiAgICgyKSBDYWxsIHRocm91Z2ggcG9pbnRlciB2cyBjYWxsIHRocm91Z2ggcmVmZXJlbmNlLgorICAgKiAgICgzKSBDb25zdCB2cyBub24tY29uc3QgbWVtYmVyIGZ1bmN0aW9uLgorICAgKgorICAgKiAgQWxsIG9mIHRoaXMgY29tcGxleGl0eSBpcyBpbiB0aGUgZnVuY3Rpb24gb2JqZWN0cyB0aGVtc2VsdmVzLiAgWW91IGNhbgorICAgKiAgIGlnbm9yZSBpdCBieSB1c2luZyB0aGUgaGVscGVyIGZ1bmN0aW9uIG1lbV9mdW4gYW5kIG1lbV9mdW5fcmVmLAorICAgKiAgIHdoaWNoIGNyZWF0ZSB3aGljaGV2ZXIgdHlwZSBvZiBhZGFwdG9yIGlzIGFwcHJvcHJpYXRlLgorICAgKgorICAgKiAgQHsKKyAgICovCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBtZW1fZnVuX3QoX1JldCAoX1RwOjoqX19wZikoKSkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoKTsKKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb25zdF9tZW1fZnVuX3QoX1JldCAoX1RwOjoqX19wZikoKSBjb25zdCkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoKSBjb25zdDsKKyAgICB9OworCisgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIG1lbW9yeV9hZGFwdG9ycyBhZGFwdG9ycyBmb3IgbWVtYmVyCisgIC8vLyBwb2ludGVyc0BlbmRsaW5rLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgbWVtX2Z1bl9yZWZfdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBtZW1fZnVuX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpCisgICAgICA6IF9NX2YoX19wZikgeyB9CisKKyAgICAgIF9SZXQKKyAgICAgIG9wZXJhdG9yKCkoX1RwJiBfX3IpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19yLipfTV9mKSgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoKTsKKyAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLCBfUmV0PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RfbWVtX2Z1bl9yZWZfdChfUmV0IChfVHA6OipfX3BmKSgpIGNvbnN0KQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fci4qX01fZikoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIG1lbV9mdW4xX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosIF9BcmcsIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBtZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoX0FyZyk7CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIGNvbnN0X21lbV9mdW4xX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosIF9BcmcsIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb25zdF9tZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNvbnN0KQorICAgICAgOiBfTV9mKF9fcGYpIHsgfQorCisgICAgICBfUmV0CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX3AtPipfTV9mKShfX3gpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIG1lbV9mdW4xX3JlZl90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9BcmcsIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBtZW1fZnVuMV9yZWZfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19yLipfTV9mKShfX3gpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoX0FyZyk7CisgICAgfTsKKworICAvLy8gT25lIG9mIHRoZSBAbGluayBtZW1vcnlfYWRhcHRvcnMgYWRhcHRvcnMgZm9yIG1lbWJlcgorICAvLy8gcG9pbnRlcnNAZW5kbGluay4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIGNvbnN0X21lbV9mdW4xX3JlZl90IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsIF9BcmcsIF9SZXQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBjb25zdF9tZW1fZnVuMV9yZWZfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSBjb25zdCkKKyAgICAgIDogX01fZihfX3BmKSB7IH0KKworICAgICAgX1JldAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19yLipfTV9mKShfX3gpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JldCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7CisgICAgfTsKKworICAvLyBNZW1fZnVuIGFkYXB0b3IgaGVscGVyIGZ1bmN0aW9ucy4gIFRoZXJlIGFyZSBvbmx5IHR3bzoKKyAgLy8gbWVtX2Z1biBhbmQgbWVtX2Z1bl9yZWYuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgbWVtX2Z1bl90PF9SZXQsIF9UcD4KKyAgICBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoKSkKKyAgICB7IHJldHVybiBtZW1fZnVuX3Q8X1JldCwgX1RwPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuX3Q8X1JldCwgX1RwPgorICAgIG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpIGNvbnN0KQorICAgIHsgcmV0dXJuIGNvbnN0X21lbV9mdW5fdDxfUmV0LCBfVHA+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIG1lbV9mdW5fcmVmX3Q8X1JldCwgX1RwPgorICAgIG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6Kl9fZikoKSkKKyAgICB7IHJldHVybiBtZW1fZnVuX3JlZl90PF9SZXQsIF9UcD4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3RfbWVtX2Z1bl9yZWZfdDxfUmV0LCBfVHA+CisgICAgbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKSgpIGNvbnN0KQorICAgIHsgcmV0dXJuIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1JldCwgX1RwPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGlubGluZSBtZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykpCisgICAgeyByZXR1cm4gbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmV0LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Bcmc+CisgICAgaW5saW5lIGNvbnN0X21lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPgorICAgIG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXQsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBpbmxpbmUgbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPgorICAgIG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykpCisgICAgeyByZXR1cm4gbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JldCwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICAvKiogQH0gICovCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmICFkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSB8fCBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorIyBpbmNsdWRlIDxiYWNrd2FyZC9iaW5kZXJzLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9TVExfRlVOQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9oZWFwLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2hlYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDBmYzY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9oZWFwLmgKQEAgLTAsMCArMSw1ODEgQEAKKy8vIEhlYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfaGVhcC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7cXVldWV9CisgKi8KKworI2lmbmRlZiBfU1RMX0hFQVBfSAorI2RlZmluZSBfU1RMX0hFQVBfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBoZWFwX2FsZ29yaXRobXMgSGVhcAorICAgKiBAaW5ncm91cCBzb3J0aW5nX2FsZ29yaXRobXMKKyAgICovCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX0Rpc3RhbmNlCisgICAgX19pc19oZWFwX3VudGlsKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19uKQorICAgIHsKKyAgICAgIF9EaXN0YW5jZSBfX3BhcmVudCA9IDA7CisgICAgICBmb3IgKF9EaXN0YW5jZSBfX2NoaWxkID0gMTsgX19jaGlsZCA8IF9fbjsgKytfX2NoaWxkKQorCXsKKwkgIGlmIChfX2ZpcnN0W19fcGFyZW50XSA8IF9fZmlyc3RbX19jaGlsZF0pCisJICAgIHJldHVybiBfX2NoaWxkOworCSAgaWYgKChfX2NoaWxkICYgMSkgPT0gMCkKKwkgICAgKytfX3BhcmVudDsKKwl9CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBfRGlzdGFuY2UKKyAgICBfX2lzX2hlYXBfdW50aWwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9EaXN0YW5jZSBfX24sCisJCSAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgX0Rpc3RhbmNlIF9fcGFyZW50ID0gMDsKKyAgICAgIGZvciAoX0Rpc3RhbmNlIF9fY2hpbGQgPSAxOyBfX2NoaWxkIDwgX19uOyArK19fY2hpbGQpCisJeworCSAgaWYgKF9fY29tcChfX2ZpcnN0W19fcGFyZW50XSwgX19maXJzdFtfX2NoaWxkXSkpCisJICAgIHJldHVybiBfX2NoaWxkOworCSAgaWYgKChfX2NoaWxkICYgMSkgPT0gMCkKKwkgICAgKytfX3BhcmVudDsKKwl9CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICAvLyBfX2lzX2hlYXAsIGEgcHJlZGljYXRlIHRlc3Rpbmcgd2hldGhlciBvciBub3QgYSByYW5nZSBpcyBhIGhlYXAuCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gZXh0ZW5zaW9uLCBub3QgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9faXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9fbikKKyAgICB7IHJldHVybiBzdGQ6Ol9faXNfaGVhcF91bnRpbChfX2ZpcnN0LCBfX24pID09IF9fbjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmUsCisJICAgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19pc19oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfQ29tcGFyZSBfX2NvbXAsIF9EaXN0YW5jZSBfX24pCisgICAgeyByZXR1cm4gc3RkOjpfX2lzX2hlYXBfdW50aWwoX19maXJzdCwgX19uLCBfX2NvbXApID09IF9fbjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9faXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7IHJldHVybiBzdGQ6Ol9faXNfaGVhcChfX2ZpcnN0LCBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9faXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeyByZXR1cm4gc3RkOjpfX2lzX2hlYXAoX19maXJzdCwgX19jb21wLCBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkpOyB9CisKKyAgLy8gSGVhcC1tYW5pcHVsYXRpb24gZnVuY3Rpb25zOiBwdXNoX2hlYXAsIHBvcF9oZWFwLCBtYWtlX2hlYXAsIHNvcnRfaGVhcCwKKyAgLy8gKyBpc19oZWFwIGFuZCBpc19oZWFwX3VudGlsIGluIEMrKzB4LgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fcHVzaF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCQlfRGlzdGFuY2UgX19ob2xlSW5kZXgsIF9EaXN0YW5jZSBfX3RvcEluZGV4LCBfVHAgX192YWx1ZSkKKyAgICB7CisgICAgICBfRGlzdGFuY2UgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisgICAgICB3aGlsZSAoX19ob2xlSW5kZXggPiBfX3RvcEluZGV4ICYmICooX19maXJzdCArIF9fcGFyZW50KSA8IF9fdmFsdWUpCisJeworCSAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX0dMSUJDWFhfTU9WRSgqKF9fZmlyc3QgKyBfX3BhcmVudCkpOworCSAgX19ob2xlSW5kZXggPSBfX3BhcmVudDsKKwkgIF9fcGFyZW50ID0gKF9faG9sZUluZGV4IC0gMSkgLyAyOworCX0KKyAgICAgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoX192YWx1ZSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQdXNoIGFuIGVsZW1lbnQgb250byBhIGhlYXAuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIGhlYXAgKyBlbGVtZW50LgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwdXNoZXMgdGhlIGVsZW1lbnQgYXQgbGFzdC0xIG9udG8gdGhlIHZhbGlkIGhlYXAgb3ZlciB0aGUKKyAgICogIHJhbmdlIFtmaXJzdCxsYXN0LTEpLiAgQWZ0ZXIgY29tcGxldGlvbiwgW2ZpcnN0LGxhc3QpIGlzIGEgdmFsaWQgaGVhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgcHVzaF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfX2ZpcnN0LCBfX2xhc3QgLSAxKTsKKworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqKF9fbGFzdCAtIDEpKTsKKyAgICAgIHN0ZDo6X19wdXNoX2hlYXAoX19maXJzdCwgX0Rpc3RhbmNlVHlwZSgoX19sYXN0IC0gX19maXJzdCkgLSAxKSwKKwkJICAgICAgIF9EaXN0YW5jZVR5cGUoMCksIF9HTElCQ1hYX01PVkUoX192YWx1ZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX3B1c2hfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX0Rpc3RhbmNlIF9faG9sZUluZGV4LAorCQlfRGlzdGFuY2UgX190b3BJbmRleCwgX1RwIF9fdmFsdWUsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICBfRGlzdGFuY2UgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisgICAgICB3aGlsZSAoX19ob2xlSW5kZXggPiBfX3RvcEluZGV4CisJICAgICAmJiBfX2NvbXAoKihfX2ZpcnN0ICsgX19wYXJlbnQpLCBfX3ZhbHVlKSkKKwl7CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fcGFyZW50KSk7CisJICBfX2hvbGVJbmRleCA9IF9fcGFyZW50OworCSAgX19wYXJlbnQgPSAoX19ob2xlSW5kZXggLSAxKSAvIDI7CisJfQorICAgICAgKihfX2ZpcnN0ICsgX19ob2xlSW5kZXgpID0gX0dMSUJDWFhfTU9WRShfX3ZhbHVlKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFB1c2ggYW4gZWxlbWVudCBvbnRvIGEgaGVhcCB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIGhlYXAgKyBlbGVtZW50LgorICAgKiAgQHBhcmFtICBjb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwdXNoZXMgdGhlIGVsZW1lbnQgYXQgbGFzdC0xIG9udG8gdGhlIHZhbGlkIGhlYXAgb3ZlciB0aGUKKyAgICogIHJhbmdlIFtmaXJzdCxsYXN0LTEpLiAgQWZ0ZXIgY29tcGxldGlvbiwgW2ZpcnN0LGxhc3QpIGlzIGEgdmFsaWQgaGVhcC4KKyAgICogIENvbXBhcmUgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIGNvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBwdXNoX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgIF9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwkgIF9EaXN0YW5jZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9fZmlyc3QsIF9fbGFzdCAtIDEsIF9fY29tcCk7CisKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoKihfX2xhc3QgLSAxKSk7CisgICAgICBzdGQ6Ol9fcHVzaF9oZWFwKF9fZmlyc3QsIF9EaXN0YW5jZVR5cGUoKF9fbGFzdCAtIF9fZmlyc3QpIC0gMSksCisJCSAgICAgICBfRGlzdGFuY2VUeXBlKDApLCBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpLCBfX2NvbXApOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwgdHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX2FkanVzdF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCisJCSAgX0Rpc3RhbmNlIF9fbGVuLCBfVHAgX192YWx1ZSkKKyAgICB7CisgICAgICBjb25zdCBfRGlzdGFuY2UgX190b3BJbmRleCA9IF9faG9sZUluZGV4OworICAgICAgX0Rpc3RhbmNlIF9fc2Vjb25kQ2hpbGQgPSBfX2hvbGVJbmRleDsKKyAgICAgIHdoaWxlIChfX3NlY29uZENoaWxkIDwgKF9fbGVuIC0gMSkgLyAyKQorCXsKKwkgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKKwkgIGlmICgqKF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKSA8ICooX19maXJzdCArIChfX3NlY29uZENoaWxkIC0gMSkpKQorCSAgICBfX3NlY29uZENoaWxkLS07CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fc2Vjb25kQ2hpbGQpKTsKKwkgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZDsKKwl9CisgICAgICBpZiAoKF9fbGVuICYgMSkgPT0gMCAmJiBfX3NlY29uZENoaWxkID09IChfX2xlbiAtIDIpIC8gMikKKwl7CisJICBfX3NlY29uZENoaWxkID0gMiAqIChfX3NlY29uZENoaWxkICsgMSk7CisJICAqKF9fZmlyc3QgKyBfX2hvbGVJbmRleCkgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdAorCQkJCQkJICAgICArIChfX3NlY29uZENoaWxkIC0gMSkpKTsKKwkgIF9faG9sZUluZGV4ID0gX19zZWNvbmRDaGlsZCAtIDE7CisJfQorICAgICAgc3RkOjpfX3B1c2hfaGVhcChfX2ZpcnN0LCBfX2hvbGVJbmRleCwgX190b3BJbmRleCwKKwkJICAgICAgIF9HTElCQ1hYX01PVkUoX192YWx1ZSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKwlfRGlzdGFuY2VUeXBlOworCisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKCpfX3Jlc3VsdCk7CisgICAgICAqX19yZXN1bHQgPSBfR0xJQkNYWF9NT1ZFKCpfX2ZpcnN0KTsKKyAgICAgIHN0ZDo6X19hZGp1c3RfaGVhcChfX2ZpcnN0LCBfRGlzdGFuY2VUeXBlKDApLAorCQkJIF9EaXN0YW5jZVR5cGUoX19sYXN0IC0gX19maXJzdCksCisJCQkgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBQb3AgYW4gZWxlbWVudCBvZmYgYSBoZWFwLgorICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiBoZWFwLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwb3BzIHRoZSB0b3Agb2YgdGhlIGhlYXAuICBUaGUgZWxlbWVudHMgZmlyc3QgYW5kIGxhc3QtMQorICAgKiAgYXJlIHN3YXBwZWQgYW5kIFtmaXJzdCxsYXN0LTEpIGlzIG1hZGUgaW50byBhIGhlYXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDxfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX2hlYXAoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgLS1fX2xhc3Q7CisgICAgICBzdGQ6Ol9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xhc3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZSwKKwkgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIHZvaWQKKyAgICBfX2FkanVzdF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfRGlzdGFuY2UgX19ob2xlSW5kZXgsCisJCSAgX0Rpc3RhbmNlIF9fbGVuLCBfVHAgX192YWx1ZSwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIGNvbnN0IF9EaXN0YW5jZSBfX3RvcEluZGV4ID0gX19ob2xlSW5kZXg7CisgICAgICBfRGlzdGFuY2UgX19zZWNvbmRDaGlsZCA9IF9faG9sZUluZGV4OworICAgICAgd2hpbGUgKF9fc2Vjb25kQ2hpbGQgPCAoX19sZW4gLSAxKSAvIDIpCisJeworCSAgX19zZWNvbmRDaGlsZCA9IDIgKiAoX19zZWNvbmRDaGlsZCArIDEpOworCSAgaWYgKF9fY29tcCgqKF9fZmlyc3QgKyBfX3NlY29uZENoaWxkKSwKKwkJICAgICAqKF9fZmlyc3QgKyAoX19zZWNvbmRDaGlsZCAtIDEpKSkpCisJICAgIF9fc2Vjb25kQ2hpbGQtLTsKKwkgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0ICsgX19zZWNvbmRDaGlsZCkpOworCSAgX19ob2xlSW5kZXggPSBfX3NlY29uZENoaWxkOworCX0KKyAgICAgIGlmICgoX19sZW4gJiAxKSA9PSAwICYmIF9fc2Vjb25kQ2hpbGQgPT0gKF9fbGVuIC0gMikgLyAyKQorCXsKKwkgIF9fc2Vjb25kQ2hpbGQgPSAyICogKF9fc2Vjb25kQ2hpbGQgKyAxKTsKKwkgICooX19maXJzdCArIF9faG9sZUluZGV4KSA9IF9HTElCQ1hYX01PVkUoKihfX2ZpcnN0CisJCQkJCQkgICAgICsgKF9fc2Vjb25kQ2hpbGQgLSAxKSkpOworCSAgX19ob2xlSW5kZXggPSBfX3NlY29uZENoaWxkIC0gMTsKKwl9CisgICAgICBzdGQ6Ol9fcHVzaF9oZWFwKF9fZmlyc3QsIF9faG9sZUluZGV4LCBfX3RvcEluZGV4LCAKKwkJICAgICAgIF9HTElCQ1hYX01PVkUoX192YWx1ZSksIF9fY29tcCk7ICAgICAgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3BvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19yZXN1bHQsIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCV9EaXN0YW5jZVR5cGU7CisKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoKl9fcmVzdWx0KTsKKyAgICAgICpfX3Jlc3VsdCA9IF9HTElCQ1hYX01PVkUoKl9fZmlyc3QpOworICAgICAgc3RkOjpfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9EaXN0YW5jZVR5cGUoMCksCisJCQkgX0Rpc3RhbmNlVHlwZShfX2xhc3QgLSBfX2ZpcnN0KSwKKwkJCSBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpLCBfX2NvbXApOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUG9wIGFuIGVsZW1lbnQgb2ZmIGEgaGVhcCB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAcGFyYW0gIGNvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IgdG8gdXNlLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBwb3BzIHRoZSB0b3Agb2YgdGhlIGhlYXAuICBUaGUgZWxlbWVudHMgZmlyc3QgYW5kIGxhc3QtMQorICAgKiAgYXJlIHN3YXBwZWQgYW5kIFtmaXJzdCxsYXN0LTEpIGlzIG1hZGUgaW50byBhIGhlYXAuICBDb21wYXJpc29ucyBhcmUKKyAgICogIG1hZGUgdXNpbmcgY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHBvcF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wKTsKKworICAgICAgLS1fX2xhc3Q7CisgICAgICBzdGQ6Ol9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xhc3QsIF9fY29tcCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSBoZWFwIG92ZXIgYSByYW5nZS4KKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIGhlYXAuCisgICAqICBAcGFyYW0gIGxhc3QgICBFbmQgb2YgaGVhcC4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gbWFrZXMgdGhlIGVsZW1lbnRzIGluIFtmaXJzdCxsYXN0KSBpbnRvIGEgaGVhcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIHZvaWQKKyAgICBtYWtlX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgX0Rpc3RhbmNlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fbGFzdCAtIF9fZmlyc3QgPCAyKQorCXJldHVybjsKKworICAgICAgY29uc3QgX0Rpc3RhbmNlVHlwZSBfX2xlbiA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBfRGlzdGFuY2VUeXBlIF9fcGFyZW50ID0gKF9fbGVuIC0gMikgLyAyOworICAgICAgd2hpbGUgKHRydWUpCisJeworCSAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqKF9fZmlyc3QgKyBfX3BhcmVudCkpOworCSAgc3RkOjpfX2FkanVzdF9oZWFwKF9fZmlyc3QsIF9fcGFyZW50LCBfX2xlbiwgX0dMSUJDWFhfTU9WRShfX3ZhbHVlKSk7CisJICBpZiAoX19wYXJlbnQgPT0gMCkKKwkgICAgcmV0dXJuOworCSAgX19wYXJlbnQtLTsKKwl9CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25zdHJ1Y3QgYSBoZWFwIG92ZXIgYSByYW5nZSB1c2luZyBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAcGFyYW0gIGNvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IgdG8gdXNlLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiBtYWtlcyB0aGUgZWxlbWVudHMgaW4gW2ZpcnN0LGxhc3QpIGludG8gYSBoZWFwLgorICAgKiAgQ29tcGFyaXNvbnMgYXJlIG1hZGUgdXNpbmcgY29tcC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICB2b2lkCisgICAgbWFrZV9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJICBfVmFsdWVUeXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisJICBfRGlzdGFuY2VUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19sYXN0IC0gX19maXJzdCA8IDIpCisJcmV0dXJuOworCisgICAgICBjb25zdCBfRGlzdGFuY2VUeXBlIF9fbGVuID0gX19sYXN0IC0gX19maXJzdDsKKyAgICAgIF9EaXN0YW5jZVR5cGUgX19wYXJlbnQgPSAoX19sZW4gLSAyKSAvIDI7CisgICAgICB3aGlsZSAodHJ1ZSkKKwl7CisJICBfVmFsdWVUeXBlIF9fdmFsdWUgPSBfR0xJQkNYWF9NT1ZFKCooX19maXJzdCArIF9fcGFyZW50KSk7CisJICBzdGQ6Ol9fYWRqdXN0X2hlYXAoX19maXJzdCwgX19wYXJlbnQsIF9fbGVuLCBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpLAorCQkJICAgICBfX2NvbXApOworCSAgaWYgKF9fcGFyZW50ID09IDApCisJICAgIHJldHVybjsKKwkgIF9fcGFyZW50LS07CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgU29ydCBhIGhlYXAuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIGhlYXAuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgICoKKyAgICogIFRoaXMgb3BlcmF0aW9uIHNvcnRzIHRoZSB2YWxpZCBoZWFwIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICB2b2lkCisgICAgc29ydF9oZWFwKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIHdoaWxlIChfX2xhc3QgLSBfX2ZpcnN0ID4gMSkKKwl7CisJICAtLV9fbGFzdDsKKwkgIHN0ZDo6X19wb3BfaGVhcChfX2ZpcnN0LCBfX2xhc3QsIF9fbGFzdCk7CisJfQorICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgU29ydCBhIGhlYXAgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgaGVhcC4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiBoZWFwLgorICAgKiAgQHBhcmFtICBjb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gc29ydHMgdGhlIHZhbGlkIGhlYXAgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KS4KKyAgICogIENvbXBhcmlzb25zIGFyZSBtYWRlIHVzaW5nIGNvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgdm9pZAorICAgIHNvcnRfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19oZWFwX3ByZWQoX19maXJzdCwgX19sYXN0LCBfX2NvbXApOworCisgICAgICB3aGlsZSAoX19sYXN0IC0gX19maXJzdCA+IDEpCisJeworCSAgLS1fX2xhc3Q7CisJICBzdGQ6Ol9fcG9wX2hlYXAoX19maXJzdCwgX19sYXN0LCBfX2xhc3QsIF9fY29tcCk7CisJfQorICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8qKgorICAgKiAgQGJyaWVmICBTZWFyY2ggdGhlIGVuZCBvZiBhIGhlYXAuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG5vdCBpbiB0aGUgaGVhcC4KKyAgICogIEBpbmdyb3VwIGhlYXBfYWxnb3JpdGhtcworICAgKgorICAgKiAgVGhpcyBvcGVyYXRpb24gcmV0dXJucyB0aGUgbGFzdCBpdGVyYXRvciBpIGluIFtmaXJzdCwgbGFzdCkgZm9yIHdoaWNoCisgICAqICB0aGUgcmFuZ2UgW2ZpcnN0LCBpKSBpcyBhIGhlYXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgaXNfaGVhcF91bnRpbChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gX19maXJzdCArIHN0ZDo6X19pc19oZWFwX3VudGlsKF9fZmlyc3QsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwKKwkJCQkJCQkJICAgX19sYXN0KSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBTZWFyY2ggdGhlIGVuZCBvZiBhIGhlYXAgdXNpbmcgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGNvbXAgICBDb21wYXJpc29uIGZ1bmN0b3IgdG8gdXNlLgorICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgbm90IGluIHRoZSBoZWFwLgorICAgKiAgQGluZ3JvdXAgaGVhcF9hbGdvcml0aG1zCisgICAqCisgICAqICBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBsYXN0IGl0ZXJhdG9yIGkgaW4gW2ZpcnN0LCBsYXN0KSBmb3Igd2hpY2gKKyAgICogIHRoZSByYW5nZSBbZmlyc3QsIGkpIGlzIGEgaGVhcC4gIENvbXBhcmlzb25zIGFyZSBtYWRlIHVzaW5nIGNvbXAuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX0NvbXBhcmU+CisgICAgaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIGlzX2hlYXBfdW50aWwoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJCSAgX0NvbXBhcmUgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gX19maXJzdCArIHN0ZDo6X19pc19oZWFwX3VudGlsKF9fZmlyc3QsIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwKKwkJCQkJCQkJICAgX19sYXN0KSwKKwkJCQkJICAgIF9fY29tcCk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXRlcm1pbmVzIHdoZXRoZXIgYSByYW5nZSBpcyBhIGhlYXAuCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEVuZCBvZiByYW5nZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgcmFuZ2UgaXMgYSBoZWFwLCBmYWxzZSBvdGhlcndpc2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7IHJldHVybiBzdGQ6OmlzX2hlYXBfdW50aWwoX19maXJzdCwgX19sYXN0KSA9PSBfX2xhc3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmFuZ2UgaXMgYSBoZWFwIHVzaW5nIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0ICAgRW5kIG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBjb21wICAgQ29tcGFyaXNvbiBmdW5jdG9yIHRvIHVzZS4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgcmFuZ2UgaXMgYSBoZWFwLCBmYWxzZSBvdGhlcndpc2UuCisgICAqICBAaW5ncm91cCBoZWFwX2FsZ29yaXRobXMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgIF9Db21wYXJlIF9fY29tcCkKKyAgICB7IHJldHVybiBzdGQ6OmlzX2hlYXBfdW50aWwoX19maXJzdCwgX19sYXN0LCBfX2NvbXApID09IF9fbGFzdDsgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfSEVBUF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzMTA3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfaXRlcmF0b3IuaApAQCAtMCwwICsxLDExMzEgQEAKKy8vIEl0ZXJhdG9ycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9pdGVyYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKgorICogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHJldmVyc2VfaXRlcmF0b3IsIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yLAorICogIGZyb250X2luc2VydF9pdGVyYXRvciwgaW5zZXJ0X2l0ZXJhdG9yLCBfX25vcm1hbF9pdGVyYXRvciwgYW5kIHRoZWlyCisgKiAgc3VwcG9ydGluZyBmdW5jdGlvbnMgYW5kIG92ZXJsb2FkZWQgb3BlcmF0b3JzLgorICovCisKKyNpZm5kZWYgX1NUTF9JVEVSQVRPUl9ICisjZGVmaW5lIF9TVExfSVRFUkFUT1JfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGl0ZXJhdG9ycworICAgKiBAeworICAgKi8KKworICAvLyAyNC40LjEgUmV2ZXJzZSBpdGVyYXRvcnMKKyAgLyoqCisgICAqICBCaWRpcmVjdGlvbmFsIGFuZCByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBoYXZlIGNvcnJlc3BvbmRpbmcgcmV2ZXJzZQorICAgKiAgJWl0ZXJhdG9yIGFkYXB0b3JzIHRoYXQgaXRlcmF0ZSB0aHJvdWdoIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiB0aGUKKyAgICogIG9wcG9zaXRlIGRpcmVjdGlvbi4gIFRoZXkgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmVzIGFzIHRoZSBjb3JyZXNwb25kaW5nCisgICAqICBpdGVyYXRvcnMuICBUaGUgZnVuZGFtZW50YWwgcmVsYXRpb24gYmV0d2VlbiBhIHJldmVyc2UgJWl0ZXJhdG9yIGFuZCBpdHMKKyAgICogIGNvcnJlc3BvbmRpbmcgJWl0ZXJhdG9yIEBjIGkgaXMgZXN0YWJsaXNoZWQgYnkgdGhlIGlkZW50aXR5OgorICAgKiAgQGNvZGUKKyAgICogICAgICAmKihyZXZlcnNlX2l0ZXJhdG9yKGkpKSA9PSAmKihpIC0gMSkKKyAgICogIEBlbmRjb2RlCisgICAqCisgICAqICA8ZW0+VGhpcyBtYXBwaW5nIGlzIGRpY3RhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgd2hpbGUgdGhlcmUgaXMgYWx3YXlzIGEKKyAgICogIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mIGFuIGFycmF5LCB0aGVyZSBtaWdodCBub3QgYmUgYSB2YWxpZCBwb2ludGVyCisgICAqICBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiBhbiBhcnJheS48L2VtPiBbMjQuNC4xXS8xLDIKKyAgICoKKyAgICogIFJldmVyc2UgaXRlcmF0b3JzIGNhbiBiZSB0cmlja3kgYW5kIHN1cnByaXNpbmcgYXQgZmlyc3QuICBUaGVpcgorICAgKiAgc2VtYW50aWNzIG1ha2Ugc2Vuc2UsIGhvd2V2ZXIsIGFuZCB0aGUgdHJpY2tpbmVzcyBpcyBhIHNpZGUgZWZmZWN0IG9mCisgICAqICB0aGUgcmVxdWlyZW1lbnQgdGhhdCB0aGUgaXRlcmF0b3JzIG11c3QgYmUgc2FmZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGNsYXNzIHJldmVyc2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisJCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlLAorCQkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlLAorCQkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cmVmZXJlbmNlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSXRlcmF0b3IgY3VycmVudDsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPgkJX190cmFpdHNfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlpdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpkaWZmZXJlbmNlX3R5cGUJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpwb2ludGVyCQlwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpyZWZlcmVuY2UJCXJlZmVyZW5jZTsKKworICAgICAgLyoqCisgICAgICAgKiAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZGVmYXVsdC1pbml0aWFsaXplcyBtZW1iZXIgQHAgY3VycmVudC4KKyAgICAgICAqICBJZiBpdCBpcyBhIHBvaW50ZXIsIHRoYXQgbWVhbnMgaXQgaXMgemVyby1pbml0aWFsaXplZC4KKyAgICAgICovCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMzUgTm8gc3BlY2lmaWNhdGlvbiBvZiBkZWZhdWx0IGN0b3IgZm9yIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IoKSA6IGN1cnJlbnQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgVGhpcyAlaXRlcmF0b3Igd2lsbCBtb3ZlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gdGhhdCBAcCB4IGRvZXMuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IoaXRlcmF0b3JfdHlwZSBfX3gpIDogY3VycmVudChfX3gpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBUaGUgY29weSBjb25zdHJ1Y3RvciBpcyBub3JtYWwuCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCByZXZlcnNlX2l0ZXJhdG9yJiBfX3gpCisgICAgICA6IGN1cnJlbnQoX194LmN1cnJlbnQpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBBIHJldmVyc2VfaXRlcmF0b3IgYWNyb3NzIG90aGVyIHR5cGVzIGNhbiBiZSBjb3BpZWQgaW4gdGhlIG5vcm1hbAorICAgICAgICogIGZhc2hpb24uCisgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXI+CisgICAgICAgIHJldmVyc2VfaXRlcmF0b3IoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcj4mIF9feCkKKwk6IGN1cnJlbnQoX194LmJhc2UoKSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIEBjIGN1cnJlbnQsIHRoZSAlaXRlcmF0b3IgdXNlZCBmb3IgdW5kZXJseWluZyB3b3JrLgorICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yX3R5cGUKKyAgICAgIGJhc2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gY3VycmVudDsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUT0RPCisgICAgICAgKgorICAgICAgICogIEBkb2N0b2RvCisgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9JdGVyYXRvciBfX3RtcCA9IGN1cnJlbnQ7CisJcmV0dXJuICotLV9fdG1wOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUT0RPCisgICAgICAgKgorICAgICAgICogIEBkb2N0b2RvCisgICAgICAqLworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUT0RPCisgICAgICAgKgorICAgICAgICogIEBkb2N0b2RvCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCS0tY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIFRPRE8KKyAgICAgICAqCisgICAgICAgKiAgQGRvY3RvZG8KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlyZXZlcnNlX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisJLS1jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVE9ETworICAgICAgICoKKyAgICAgICAqICBAZG9jdG9kbworICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwkrK2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUT0RPCisgICAgICAgKgorICAgICAgICogIEBkb2N0b2RvCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJcmV2ZXJzZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworCSsrY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIFRPRE8KKyAgICAgICAqCisgICAgICAgKiAgQGRvY3RvZG8KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoY3VycmVudCAtIF9fbik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVE9ETworICAgICAgICoKKyAgICAgICAqICBAZG9jdG9kbworICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7CisJY3VycmVudCAtPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcmV0dXJuICBUT0RPCisgICAgICAgKgorICAgICAgICogIEBkb2N0b2RvCisgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGN1cnJlbnQgKyBfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIFRPRE8KKyAgICAgICAqCisgICAgICAgKiAgQGRvY3RvZG8KKyAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCWN1cnJlbnQgKz0gX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVE9ETworICAgICAgICoKKyAgICAgICAqICBAZG9jdG9kbworICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gKigqdGhpcyArIF9fbik7IH0KKyAgICB9OworCisgIC8vQHsKKyAgLyoqCisgICAqICBAcGFyYW0gIHggIEEgJXJldmVyc2VfaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHkgIEEgJXJldmVyc2VfaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICBBIHNpbXBsZSBib29sLgorICAgKgorICAgKiAgUmV2ZXJzZSBpdGVyYXRvcnMgZm9yd2FyZCBtYW55IG9wZXJhdGlvbnMgdG8gdGhlaXIgdW5kZXJseWluZyBiYXNlKCkKKyAgICogIGl0ZXJhdG9ycy4gIE90aGVycyBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Ygb25lIGFub3RoZXIuCisgICAqCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSB0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+CisgICAgb3BlcmF0b3IrKHR5cGVuYW1lIHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIF9fbiwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCkKKyAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4oX194LmJhc2UoKSAtIF9fbik7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIERSIDI4MC4gQ29tcGFyaXNvbiBvZiByZXZlcnNlX2l0ZXJhdG9yIHRvIGNvbnN0IHJldmVyc2VfaXRlcmF0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5iYXNlKCkgPT0gX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIDwgX194LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIC8vIERSIDY4NS4KKyAgICBpbmxpbmUgYXV0bworICAgIG9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIC0+IGRlY2x0eXBlKF9feS5iYXNlKCkgLSBfX3guYmFzZSgpKQorI2Vsc2UKKyAgICBpbmxpbmUgdHlwZW5hbWUgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3JMPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisjZW5kaWYKKyAgICB7IHJldHVybiBfX3kuYmFzZSgpIC0gX194LmJhc2UoKTsgfQorICAvL0B9CisKKyAgLy8gMjQuNC4yLjIuMSBiYWNrX2luc2VydF9pdGVyYXRvcgorICAvKioKKyAgICogIEBicmllZiAgVHVybnMgYXNzaWdubWVudCBpbnRvIGluc2VydGlvbi4KKyAgICoKKyAgICogIFRoZXNlIGFyZSBvdXRwdXQgaXRlcmF0b3JzLCBjb25zdHJ1Y3RlZCBmcm9tIGEgY29udGFpbmVyLW9mLVQuCisgICAqICBBc3NpZ25pbmcgYSBUIHRvIHRoZSBpdGVyYXRvciBhcHBlbmRzIGl0IHRvIHRoZSBjb250YWluZXIgdXNpbmcKKyAgICogIHB1c2hfYmFjay4KKyAgICoKKyAgICogIFRpcDogIFVzaW5nIHRoZSBiYWNrX2luc2VydGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGVzZSBpdGVyYXRvcnMgY2FuCisgICAqICBzYXZlIHR5cGluZy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBjbGFzcyBiYWNrX2luc2VydF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBBIG5lc3RlZCB0eXBlZGVmIGZvciB0aGUgdHlwZSBvZiB3aGF0ZXZlciBjb250YWluZXIgeW91IHVzZWQuCisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICAgIC8vLyBUaGUgb25seSB3YXkgdG8gY3JlYXRlIHRoaXMgJWl0ZXJhdG9yIGlzIHdpdGggYSBjb250YWluZXIuCisgICAgICBleHBsaWNpdAorICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHBhcmFtICB2YWx1ZSAgQW4gaW5zdGFuY2Ugb2Ygd2hhdGV2ZXIgdHlwZQorICAgICAgICogICAgICAgICAgICAgICAgIGNvbnRhaW5lcl90eXBlOjpjb25zdF9yZWZlcmVuY2UgaXM7IHByZXN1bWFibHkgYQorICAgICAgICogICAgICAgICAgICAgICAgIHJlZmVyZW5jZS10by1jb25zdCBUIGZvciBjb250YWluZXI8VD4uCisgICAgICAgKiAgQHJldHVybiAgVGhpcyAlaXRlcmF0b3IsIGZvciBjaGFpbmVkIG9wZXJhdGlvbnMuCisgICAgICAgKgorICAgICAgICogIFRoaXMga2luZCBvZiAlaXRlcmF0b3IgZG9lc24ndCByZWFsbHkgaGF2ZSBhIEBhIHBvc2l0aW9uIGluIHRoZQorICAgICAgICogIGNvbnRhaW5lciAoeW91IGNhbiB0aGluayBvZiB0aGUgcG9zaXRpb24gYXMgYmVpbmcgcGVybWFuZW50bHkgYXQKKyAgICAgICAqICB0aGUgZW5kLCBpZiB5b3UgbGlrZSkuICBBc3NpZ25pbmcgYSB2YWx1ZSB0byB0aGUgJWl0ZXJhdG9yIHdpbGwKKyAgICAgICAqICBhbHdheXMgYXBwZW5kIHRoZSB2YWx1ZSB0byB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIuCisgICAgICAqLworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfcmVmZXJlbmNlIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5wdXNoX2JhY2soX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2Vsc2UKKyAgICAgIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJY29udGFpbmVyLT5wdXNoX2JhY2soX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPnB1c2hfYmFjayhzdGQ6Om1vdmUoX192YWx1ZSkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuCisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuICAoVGhpcyAlaXRlcmF0b3IgZG9lcyBub3QgQGEgbW92ZS4pCisgICAgICBiYWNrX2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLiAgKFRoaXMgJWl0ZXJhdG9yIGRvZXMgbm90IEBhIG1vdmUuKQorICAgICAgYmFja19pbnNlcnRfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQHBhcmFtICB4ICBBIGNvbnRhaW5lciBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gIEFuIGluc3RhbmNlIG9mIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yIHdvcmtpbmcgb24gQHAgeC4KKyAgICoKKyAgICogIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBoZWxwcyBpbiBjcmVhdGluZyBiYWNrX2luc2VydF9pdGVyYXRvciBpbnN0YW5jZXMuCisgICAqICBUeXBpbmcgdGhlIG5hbWUgb2YgdGhlICVpdGVyYXRvciByZXF1aXJlcyBrbm93aW5nIHRoZSBwcmVjaXNlIGZ1bGwKKyAgICogIHR5cGUgb2YgdGhlIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHRlZGlvdXMgYW5kIGltcGVkZXMgZ2VuZXJpYworICAgKiAgcHJvZ3JhbW1pbmcuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGxldHMgeW91IHRha2UgYWR2YW50YWdlIG9mIGF1dG9tYXRpYworICAgKiAgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbiwgbWFraW5nIHRoZSBjb21waWxlciBtYXRjaCB0aGUgY29ycmVjdAorICAgKiAgdHlwZXMgZm9yIHlvdS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYmFja19pbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4KKyAgICBiYWNrX2luc2VydGVyKF9Db250YWluZXImIF9feCkKKyAgICB7IHJldHVybiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFR1cm5zIGFzc2lnbm1lbnQgaW50byBpbnNlcnRpb24uCisgICAqCisgICAqICBUaGVzZSBhcmUgb3V0cHV0IGl0ZXJhdG9ycywgY29uc3RydWN0ZWQgZnJvbSBhIGNvbnRhaW5lci1vZi1ULgorICAgKiAgQXNzaWduaW5nIGEgVCB0byB0aGUgaXRlcmF0b3IgcHJlcGVuZHMgaXQgdG8gdGhlIGNvbnRhaW5lciB1c2luZworICAgKiAgcHVzaF9mcm9udC4KKyAgICoKKyAgICogIFRpcDogIFVzaW5nIHRoZSBmcm9udF9pbnNlcnRlciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlc2UgaXRlcmF0b3JzIGNhbgorICAgKiAgc2F2ZSB0eXBpbmcuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgY2xhc3MgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0NvbnRhaW5lciogY29udGFpbmVyOworCisgICAgcHVibGljOgorICAgICAgLy8vIEEgbmVzdGVkIHR5cGVkZWYgZm9yIHRoZSB0eXBlIG9mIHdoYXRldmVyIGNvbnRhaW5lciB5b3UgdXNlZC4KKyAgICAgIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICAgICAgLy8vIFRoZSBvbmx5IHdheSB0byBjcmVhdGUgdGhpcyAlaXRlcmF0b3IgaXMgd2l0aCBhIGNvbnRhaW5lci4KKyAgICAgIGV4cGxpY2l0IGZyb250X2luc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpIDogY29udGFpbmVyKCZfX3gpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIHZhbHVlICBBbiBpbnN0YW5jZSBvZiB3aGF0ZXZlciB0eXBlCisgICAgICAgKiAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBpczsgcHJlc3VtYWJseSBhCisgICAgICAgKiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLXRvLWNvbnN0IFQgZm9yIGNvbnRhaW5lcjxUPi4KKyAgICAgICAqICBAcmV0dXJuICBUaGlzICVpdGVyYXRvciwgZm9yIGNoYWluZWQgb3BlcmF0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBraW5kIG9mICVpdGVyYXRvciBkb2Vzbid0IHJlYWxseSBoYXZlIGEgQGEgcG9zaXRpb24gaW4gdGhlCisgICAgICAgKiAgY29udGFpbmVyICh5b3UgY2FuIHRoaW5rIG9mIHRoZSBwb3NpdGlvbiBhcyBiZWluZyBwZXJtYW5lbnRseSBhdAorICAgICAgICogIHRoZSBmcm9udCwgaWYgeW91IGxpa2UpLiAgQXNzaWduaW5nIGEgdmFsdWUgdG8gdGhlICVpdGVyYXRvciB3aWxsCisgICAgICAgKiAgYWx3YXlzIHByZXBlbmQgdGhlIHZhbHVlIHRvIHRoZSBmcm9udCBvZiB0aGUgY29udGFpbmVyLgorICAgICAgKi8KKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGZyb250X2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9yZWZlcmVuY2UgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPnB1c2hfZnJvbnQoX192YWx1ZSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2Vsc2UKKyAgICAgIGZyb250X2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+cHVzaF9mcm9udChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZyb250X2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPnB1c2hfZnJvbnQoc3RkOjptb3ZlKF9fdmFsdWUpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLgorICAgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGZyb250X2luc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFNpbXBseSByZXR1cm5zICp0aGlzLiAgKFRoaXMgJWl0ZXJhdG9yIGRvZXMgbm90IEBhIG1vdmUuKQorICAgICAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBwYXJhbSAgeCAgQSBjb250YWluZXIgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAqICBAcmV0dXJuICBBbiBpbnN0YW5jZSBvZiBmcm9udF9pbnNlcnRfaXRlcmF0b3Igd29ya2luZyBvbiBAcCB4LgorICAgKgorICAgKiAgVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGhlbHBzIGluIGNyZWF0aW5nIGZyb250X2luc2VydF9pdGVyYXRvciBpbnN0YW5jZXMuCisgICAqICBUeXBpbmcgdGhlIG5hbWUgb2YgdGhlICVpdGVyYXRvciByZXF1aXJlcyBrbm93aW5nIHRoZSBwcmVjaXNlIGZ1bGwKKyAgICogIHR5cGUgb2YgdGhlIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHRlZGlvdXMgYW5kIGltcGVkZXMgZ2VuZXJpYworICAgKiAgcHJvZ3JhbW1pbmcuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGxldHMgeW91IHRha2UgYWR2YW50YWdlIG9mIGF1dG9tYXRpYworICAgKiAgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbiwgbWFraW5nIHRoZSBjb21waWxlciBtYXRjaCB0aGUgY29ycmVjdAorICAgKiAgdHlwZXMgZm9yIHlvdS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+CisgICAgZnJvbnRfaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194KQorICAgIHsgcmV0dXJuIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFR1cm5zIGFzc2lnbm1lbnQgaW50byBpbnNlcnRpb24uCisgICAqCisgICAqICBUaGVzZSBhcmUgb3V0cHV0IGl0ZXJhdG9ycywgY29uc3RydWN0ZWQgZnJvbSBhIGNvbnRhaW5lci1vZi1ULgorICAgKiAgQXNzaWduaW5nIGEgVCB0byB0aGUgaXRlcmF0b3IgaW5zZXJ0cyBpdCBpbiB0aGUgY29udGFpbmVyIGF0IHRoZQorICAgKiAgJWl0ZXJhdG9yJ3MgcG9zaXRpb24sIHJhdGhlciB0aGFuIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZSBhdCB0aGF0CisgICAqICBwb3NpdGlvbi4KKyAgICoKKyAgICogIChTZXF1ZW5jZXMgd2lsbCBhY3R1YWxseSBpbnNlcnQgYSBAZSBjb3B5IG9mIHRoZSB2YWx1ZSBiZWZvcmUgdGhlCisgICAqICAlaXRlcmF0b3IncyBwb3NpdGlvbi4pCisgICAqCisgICAqICBUaXA6ICBVc2luZyB0aGUgaW5zZXJ0ZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZXNlIGl0ZXJhdG9ycyBjYW4KKyAgICogIHNhdmUgdHlwaW5nLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGNsYXNzIGluc2VydF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9Db250YWluZXIqIGNvbnRhaW5lcjsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yIGl0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAvLy8gQSBuZXN0ZWQgdHlwZWRlZiBmb3IgdGhlIHR5cGUgb2Ygd2hhdGV2ZXIgY29udGFpbmVyIHlvdSB1c2VkLgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworCisgICAgICAvKioKKyAgICAgICAqICBUaGUgb25seSB3YXkgdG8gY3JlYXRlIHRoaXMgJWl0ZXJhdG9yIGlzIHdpdGggYSBjb250YWluZXIgYW5kIGFuCisgICAgICAgKiAgaW5pdGlhbCBwb3NpdGlvbiAoYSBub3JtYWwgJWl0ZXJhdG9yIGludG8gdGhlIGNvbnRhaW5lcikuCisgICAgICAqLworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pKQorICAgICAgOiBjb250YWluZXIoJl9feCksIGl0ZXIoX19pKSB7fQorCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIHZhbHVlICBBbiBpbnN0YW5jZSBvZiB3aGF0ZXZlciB0eXBlCisgICAgICAgKiAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBpczsgcHJlc3VtYWJseSBhCisgICAgICAgKiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLXRvLWNvbnN0IFQgZm9yIGNvbnRhaW5lcjxUPi4KKyAgICAgICAqICBAcmV0dXJuICBUaGlzICVpdGVyYXRvciwgZm9yIGNoYWluZWQgb3BlcmF0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBraW5kIG9mICVpdGVyYXRvciBtYWludGFpbnMgaXRzIG93biBwb3NpdGlvbiBpbiB0aGUKKyAgICAgICAqICBjb250YWluZXIuICBBc3NpZ25pbmcgYSB2YWx1ZSB0byB0aGUgJWl0ZXJhdG9yIHdpbGwgaW5zZXJ0IHRoZQorICAgICAgICogIHZhbHVlIGludG8gdGhlIGNvbnRhaW5lciBhdCB0aGUgcGxhY2UgYmVmb3JlIHRoZSAlaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoZSBwb3NpdGlvbiBpcyBtYWludGFpbmVkIHN1Y2ggdGhhdCBzdWJzZXF1ZW50IGFzc2lnbm1lbnRzIHdpbGwKKyAgICAgICAqICBpbnNlcnQgdmFsdWVzIGltbWVkaWF0ZWx5IGFmdGVyIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgICAvLyB2ZWN0b3IgdiBjb250YWlucyBBIGFuZCBaCisgICAgICAgKgorICAgICAgICogICAgIGluc2VydF9pdGVyYXRvciBpICh2LCArK3YuYmVnaW4oKSk7CisgICAgICAgKiAgICAgaSA9IDE7CisgICAgICAgKiAgICAgaSA9IDI7CisgICAgICAgKiAgICAgaSA9IDM7CisgICAgICAgKgorICAgICAgICogICAgIC8vIHZlY3RvciB2IGNvbnRhaW5zIEEsIDEsIDIsIDMsIGFuZCBaCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICovCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0odHlwZW5hbWUgX0NvbnRhaW5lcjo6Y29uc3RfcmVmZXJlbmNlIF9fdmFsdWUpCisgICAgICB7CisJaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0KGl0ZXIsIF9fdmFsdWUpOworCSsraXRlcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZWxzZQorICAgICAgaW5zZXJ0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0KGl0ZXIsIF9fdmFsdWUpOworCSsraXRlcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPSh0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiYgX192YWx1ZSkKKyAgICAgIHsKKwlpdGVyID0gY29udGFpbmVyLT5pbnNlcnQoaXRlciwgc3RkOjptb3ZlKF9fdmFsdWUpKTsKKwkrK2l0ZXI7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4KKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gU2ltcGx5IHJldHVybnMgKnRoaXMuICAoVGhpcyAlaXRlcmF0b3IgZG9lcyBub3QgQGEgbW92ZS4pCisgICAgICBpbnNlcnRfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBTaW1wbHkgcmV0dXJucyAqdGhpcy4gIChUaGlzICVpdGVyYXRvciBkb2VzIG5vdCBAYSBtb3ZlLikKKyAgICAgIGluc2VydF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQHBhcmFtICB4ICBBIGNvbnRhaW5lciBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICogIEByZXR1cm4gIEFuIGluc3RhbmNlIG9mIGluc2VydF9pdGVyYXRvciB3b3JraW5nIG9uIEBwIHguCisgICAqCisgICAqICBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gaGVscHMgaW4gY3JlYXRpbmcgaW5zZXJ0X2l0ZXJhdG9yIGluc3RhbmNlcy4KKyAgICogIFR5cGluZyB0aGUgbmFtZSBvZiB0aGUgJWl0ZXJhdG9yIHJlcXVpcmVzIGtub3dpbmcgdGhlIHByZWNpc2UgZnVsbAorICAgKiAgdHlwZSBvZiB0aGUgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdGVkaW91cyBhbmQgaW1wZWRlcyBnZW5lcmljCisgICAqICBwcm9ncmFtbWluZy4gIFVzaW5nIHRoaXMgZnVuY3Rpb24gbGV0cyB5b3UgdGFrZSBhZHZhbnRhZ2Ugb2YgYXV0b21hdGljCisgICAqICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLCBtYWtpbmcgdGhlIGNvbXBpbGVyIG1hdGNoIHRoZSBjb3JyZWN0CisgICAqICB0eXBlcyBmb3IgeW91LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyLCB0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPgorICAgIGluc2VydGVyKF9Db250YWluZXImIF9feCwgX0l0ZXJhdG9yIF9faSkKKyAgICB7CisgICAgICByZXR1cm4gaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9feCwKKwkJCQkJIHR5cGVuYW1lIF9Db250YWluZXI6Oml0ZXJhdG9yKF9faSkpOworICAgIH0KKworICAvLyBAfSBncm91cCBpdGVyYXRvcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gVGhpcyBpdGVyYXRvciBhZGFwdGVyIGlzIEBhIG5vcm1hbCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBkb2VzIG5vdAorICAvLyBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhbnkgb2YgdGhlIG9wZXJhdG9ycyBvZiBpdHMgaXRlcmF0b3IKKyAgLy8gcGFyYW1ldGVyLiAgSXRzIHByaW1hcnkgcHVycG9zZSBpcyB0byBjb252ZXJ0IGFuIGl0ZXJhdG9yIHRoYXQgaXMKKyAgLy8gbm90IGEgY2xhc3MsIGUuZy4gYSBwb2ludGVyLCBpbnRvIGFuIGl0ZXJhdG9yIHRoYXQgaXMgYSBjbGFzcy4KKyAgLy8gVGhlIF9Db250YWluZXIgcGFyYW1ldGVyIGV4aXN0cyBzb2xlbHkgc28gdGhhdCBkaWZmZXJlbnQgY29udGFpbmVycworICAvLyB1c2luZyB0aGlzIHRlbXBsYXRlIGNhbiBpbnN0YW50aWF0ZSBkaWZmZXJlbnQgdHlwZXMsIGV2ZW4gaWYgdGhlCisgIC8vIF9JdGVyYXRvciBwYXJhbWV0ZXIgaXMgdGhlIHNhbWUuCisgIHVzaW5nIHN0ZDo6aXRlcmF0b3JfdHJhaXRzOworICB1c2luZyBzdGQ6Oml0ZXJhdG9yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgY2xhc3MgX19ub3JtYWxfaXRlcmF0b3IKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX0l0ZXJhdG9yIF9NX2N1cnJlbnQ7CisKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4JCV9fdHJhaXRzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvcgkJCQkJaXRlcmF0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnZhbHVlX3R5cGUgIAl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6cmVmZXJlbmNlIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OnBvaW50ZXIgICAJcG9pbnRlcjsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9fbm9ybWFsX2l0ZXJhdG9yKCkgOiBfTV9jdXJyZW50KF9JdGVyYXRvcigpKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yKGNvbnN0IF9JdGVyYXRvciYgX19pKSA6IF9NX2N1cnJlbnQoX19pKSB7IH0KKworICAgICAgLy8gQWxsb3cgaXRlcmF0b3IgdG8gY29uc3RfaXRlcmF0b3IgY29udmVyc2lvbgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXI+CisgICAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yKGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyLAorCQkJICB0eXBlbmFtZSBfX2VuYWJsZV9pZjwKKyAgICAgIAkgICAgICAgKHN0ZDo6X19hcmVfc2FtZTxfSXRlciwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6cG9pbnRlcj46Ol9fdmFsdWUpLAorCQkgICAgICBfQ29udGFpbmVyPjo6X190eXBlPiYgX19pKQorICAgICAgICA6IF9NX2N1cnJlbnQoX19pLmJhc2UoKSkgeyB9CisKKyAgICAgIC8vIEZvcndhcmQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAqX01fY3VycmVudDsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgX19ub3JtYWxfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwkrK19NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiBfX25vcm1hbF9pdGVyYXRvcihfTV9jdXJyZW50KyspOyB9CisKKyAgICAgIC8vIEJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgICAgICBfX25vcm1hbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsgcmV0dXJuIF9fbm9ybWFsX2l0ZXJhdG9yKF9NX2N1cnJlbnQtLSk7IH0KKworICAgICAgLy8gUmFuZG9tIGFjY2VzcyBpdGVyYXRvciByZXF1aXJlbWVudHMKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2N1cnJlbnRbX19uXTsgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pCisgICAgICB7IF9NX2N1cnJlbnQgKz0gX19uOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgX19ub3JtYWxfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKyhjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fbm9ybWFsX2l0ZXJhdG9yKF9NX2N1cnJlbnQgKyBfX24pOyB9CisKKyAgICAgIF9fbm9ybWFsX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsgX01fY3VycmVudCAtPSBfX247IHJldHVybiAqdGhpczsgfQorCisgICAgICBfX25vcm1hbF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX19ub3JtYWxfaXRlcmF0b3IoX01fY3VycmVudCAtIF9fbik7IH0KKworICAgICAgY29uc3QgX0l0ZXJhdG9yJgorICAgICAgYmFzZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9jdXJyZW50OyB9CisgICAgfTsKKworICAvLyBOb3RlOiBJbiB3aGF0IGZvbGxvd3MsIHRoZSBsZWZ0LSBhbmQgcmlnaHQtaGFuZC1zaWRlIGl0ZXJhdG9ycyBhcmUKKyAgLy8gYWxsb3dlZCB0byB2YXJ5IGluIHR5cGVzIChjb25jZXB0dWFsbHkgaW4gY3YtcXVhbGlmaWNhdGlvbikgc28gdGhhdAorICAvLyBjb21wYXJpc29uIGJldHdlZW4gY3YtcXVhbGlmaWVkIGFuZCBub24tY3YtcXVhbGlmaWVkIGl0ZXJhdG9ycyBiZQorICAvLyB2YWxpZC4gIEhvd2V2ZXIsIHRoZSBncmVlZHkgYW5kIHVuZnJpZW5kbHkgb3BlcmF0b3JzIGluIHN0ZDo6cmVsX29wcworICAvLyB3aWxsIG1ha2Ugb3ZlcmxvYWQgcmVzb2x1dGlvbiBhbWJpZ3VvdXMgKHdoZW4gaW4gc2NvcGUpIGlmIHdlIGRvbid0CisgIC8vIHByb3ZpZGUgb3ZlcmxvYWRzIHdob3NlIG9wZXJhbmRzIGFyZSBvZiB0aGUgc2FtZSB0eXBlLiAgQ2FuIHNvbWVvbmUKKyAgLy8gcmVtaW5kIG1lIHdoYXQgZ2VuZXJpYyBwcm9ncmFtbWluZyBpcyBhYm91dD8gLS0gR2FieQorCisgIC8vIEZvcndhcmQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPT0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7IH0KKworICAvLyBSYW5kb20gYWNjZXNzIGl0ZXJhdG9yIHJlcXVpcmVtZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDwgX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9Db250YWluZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID4gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIDw9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX0NvbnRhaW5lcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9Db250YWluZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID49IF9fcmhzLmJhc2UoKTsgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gQWNjb3JkaW5nIHRvIHRoZSByZXNvbHV0aW9uIG9mIERSMTc5IG5vdCBvbmx5IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24KKyAgLy8gb3BlcmF0b3JzIGJ1dCBhbHNvIG9wZXJhdG9yLSBtdXN0IGFjY2VwdCBtaXhlZCBpdGVyYXRvci9jb25zdF9pdGVyYXRvcgorICAvLyBwYXJhbWV0ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgLy8gRFIgNjg1LgorICAgIGlubGluZSBhdXRvCisgICAgb3BlcmF0b3ItKGNvbnN0IF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9Db250YWluZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgLT4gZGVjbHR5cGUoX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpKQorI2Vsc2UKKyAgICBpbmxpbmUgdHlwZW5hbWUgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX0NvbnRhaW5lcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX0NvbnRhaW5lcj4mIF9fcmhzKQorI2VuZGlmCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSB0eXBlbmFtZSBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19saHMsCisJICAgICAgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIGlubGluZSBfX25vcm1hbF9pdGVyYXRvcjxfSXRlcmF0b3IsIF9Db250YWluZXI+CisgICAgb3BlcmF0b3IrKHR5cGVuYW1lIF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgICAgIF9fbiwgY29uc3QgX19ub3JtYWxfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfQ29udGFpbmVyPiYgX19pKQorICAgIHsgcmV0dXJuIF9fbm9ybWFsX2l0ZXJhdG9yPF9JdGVyYXRvciwgX0NvbnRhaW5lcj4oX19pLmJhc2UoKSArIF9fbik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBpdGVyYXRvcnMKKyAgICogQHsKKyAgICovCisKKyAgLy8gMjQuNC4zICBNb3ZlIGl0ZXJhdG9ycworICAvKioKKyAgICogIENsYXNzIHRlbXBsYXRlIG1vdmVfaXRlcmF0b3IgaXMgYW4gaXRlcmF0b3IgYWRhcHRlciB3aXRoIHRoZSBzYW1lCisgICAqICBiZWhhdmlvciBhcyB0aGUgdW5kZXJseWluZyBpdGVyYXRvciBleGNlcHQgdGhhdCBpdHMgZGVyZWZlcmVuY2UKKyAgICogIG9wZXJhdG9yIGltcGxpY2l0bHkgY29udmVydHMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nCisgICAqICBpdGVyYXRvcidzIGRlcmVmZXJlbmNlIG9wZXJhdG9yIHRvIGFuIHJ2YWx1ZSByZWZlcmVuY2UuICBTb21lCisgICAqICBnZW5lcmljIGFsZ29yaXRobXMgY2FuIGJlIGNhbGxlZCB3aXRoIG1vdmUgaXRlcmF0b3JzIHRvIHJlcGxhY2UKKyAgICogIGNvcHlpbmcgd2l0aCBtb3ZpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgY2xhc3MgbW92ZV9pdGVyYXRvcgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgdHlwZWRlZiBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPgkJX190cmFpdHNfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkJCQlpdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3RyYWl0c190eXBlOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX190cmFpdHNfdHlwZTo6dmFsdWVfdHlwZSAgCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdHJhaXRzX3R5cGU6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvLyBOQjogRFIgNjgwLgorICAgICAgdHlwZWRlZiBfSXRlcmF0b3IJCQkJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmJgkJCQlyZWZlcmVuY2U7CisKKyAgICAgIG1vdmVfaXRlcmF0b3IoKQorICAgICAgOiBfTV9jdXJyZW50KCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBtb3ZlX2l0ZXJhdG9yKGl0ZXJhdG9yX3R5cGUgX19pKQorICAgICAgOiBfTV9jdXJyZW50KF9faSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyPgorCW1vdmVfaXRlcmF0b3IoY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcj4mIF9faSkKKwk6IF9NX2N1cnJlbnQoX19pLmJhc2UoKSkgeyB9CisKKyAgICAgIGl0ZXJhdG9yX3R5cGUKKyAgICAgIGJhc2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om1vdmUoKl9NX2N1cnJlbnQpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudDsgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbW92ZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJbW92ZV9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIG1vdmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwktLV9NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwltb3ZlX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisJLS1fTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgbW92ZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBtb3ZlX2l0ZXJhdG9yKF9NX2N1cnJlbnQgKyBfX24pOyB9CisKKyAgICAgIG1vdmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcis9KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7CisJX01fY3VycmVudCArPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtb3ZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0oZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1vdmVfaXRlcmF0b3IoX01fY3VycmVudCAtIF9fbik7IH0KKyAgICAKKyAgICAgIG1vdmVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBfX24pCisgICAgICB7IAorCV9NX2N1cnJlbnQgLT0gX19uOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Om1vdmUoX01fY3VycmVudFtfX25dKTsgfQorICAgIH07CisKKyAgLy8gTm90ZTogU2VlIF9fbm9ybWFsX2l0ZXJhdG9yIG9wZXJhdG9ycyBub3RlIGZyb20gR2FieSB0byB1bmRlcnN0YW5kCisgIC8vIHdoeSB0aGVyZSBhcmUgYWx3YXlzIDIgdmVyc2lvbnMgZm9yIG1vc3Qgb2YgdGhlIG1vdmVfaXRlcmF0b3IKKyAgLy8gb3BlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvckw+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpIDwgX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYmFzZSgpIDwgX195LmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JSPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgIGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yUj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3JMPiYgX194LAorCSAgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwKKwkgICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8gRFIgNjg1LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSPgorICAgIGlubGluZSBhdXRvCisgICAgb3BlcmF0b3ItKGNvbnN0IG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yTD4mIF9feCwKKwkgICAgICBjb25zdCBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvclI+JiBfX3kpCisgICAgLT4gZGVjbHR5cGUoX194LmJhc2UoKSAtIF9feS5iYXNlKCkpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSAtIF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIGF1dG8KKyAgICBvcGVyYXRvci0oY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpCisgICAgLT4gZGVjbHR5cGUoX194LmJhc2UoKSAtIF9feS5iYXNlKCkpCisgICAgeyByZXR1cm4gX194LmJhc2UoKSAtIF9feS5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgaW5saW5lIG1vdmVfaXRlcmF0b3I8X0l0ZXJhdG9yPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sCisJICAgICAgY29uc3QgbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gpCisgICAgeyByZXR1cm4gX194ICsgX19uOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBtb3ZlX2l0ZXJhdG9yPF9JdGVyYXRvcj4KKyAgICBtYWtlX21vdmVfaXRlcmF0b3IoY29uc3QgX0l0ZXJhdG9yJiBfX2kpCisgICAgeyByZXR1cm4gbW92ZV9pdGVyYXRvcjxfSXRlcmF0b3I+KF9faSk7IH0KKworICAvLyBAfSBncm91cCBpdGVyYXRvcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZGVmaW5lIF9HTElCQ1hYX01BS0VfTU9WRV9JVEVSQVRPUihfSXRlcikgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoX0l0ZXIpCisjZWxzZQorI2RlZmluZSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX0l0ZXIpIChfSXRlcikKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2YWE5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oCkBAIC0wLDAgKzEsMjAzIEBACisvLyBGdW5jdGlvbnMgdXNlZCBieSBpdGVyYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk4CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlIGdlbmVyYWwgaXRlcmF0b3ItcmVsYXRlZCB1dGlsaXR5CisgKiAgZnVuY3Rpb25zLCBzdWNoIGFzIGRpc3RhbmNlKCkgYW5kIGFkdmFuY2UoKS4KKyAqLworCisjaWZuZGVmIF9TVExfSVRFUkFUT1JfQkFTRV9GVU5DU19ICisjZGVmaW5lIF9TVExfSVRFUkFUT1JfQkFTRV9GVU5DU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorCisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMDsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fZmlyc3Q7CisJICArK19fbjsKKwl9CisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBfX2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCQkJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPikKKyAgICAgIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBIGdlbmVyYWxpemF0aW9uIG9mIHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0uCisgICAqCisgICAqICBSZXR1cm5zIEBjIG4gc3VjaCB0aGF0IGZpcnN0ICsgbiA9PSBsYXN0LiAgVGhpcyByZXF1aXJlcyB0aGF0IEBwIGxhc3QKKyAgICogIG11c3QgYmUgcmVhY2hhYmxlIGZyb20gQHAgZmlyc3QuICBOb3RlIHRoYXQgQGMgbiBtYXkgYmUgbmVnYXRpdmUuCisgICAqCisgICAqICBGb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMsIHRoaXMgdXNlcyB0aGVpciBAYyArIGFuZCBAYyAtIG9wZXJhdGlvbnMKKyAgICogIGFuZCBhcmUgY29uc3RhbnQgdGltZS4gIEZvciBvdGhlciAlaXRlcmF0b3IgY2xhc3NlcyB0aGV5IGFyZSBsaW5lYXIgdGltZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIGRpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIF9fZGlzdGFuY2UKKyAgICAgIHJldHVybiBzdGQ6Ol9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LAorCQkJICAgICBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSB2b2lkCisgICAgX19hZHZhbmNlKF9JbnB1dEl0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICB3aGlsZSAoX19uLS0pCisJKytfX2k7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fYWR2YW5jZShfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCisJICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+KQorICAgICAgaWYgKF9fbiA+IDApCisgICAgICAgIHdoaWxlIChfX24tLSkKKwkgICsrX19pOworICAgICAgZWxzZQorICAgICAgICB3aGlsZSAoX19uKyspCisJICAtLV9faTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2FkdmFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sCisgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2kgKz0gX19uOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBBIGdlbmVyYWxpemF0aW9uIG9mIHBvaW50ZXIgYXJpdGhtZXRpYy4KKyAgICogIEBwYXJhbSAgaSAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIG4gIFRoZSBAYSBkZWx0YSBieSB3aGljaCB0byBjaGFuZ2UgQHAgaS4KKyAgICogIEByZXR1cm4gIE5vdGhpbmcuCisgICAqCisgICAqICBUaGlzIGluY3JlbWVudHMgQHAgaSBieSBAcCBuLiAgRm9yIGJpZGlyZWN0aW9uYWwgYW5kIHJhbmRvbSBhY2Nlc3MKKyAgICogIGl0ZXJhdG9ycywgQHAgbiBtYXkgYmUgbmVnYXRpdmUsIGluIHdoaWNoIGNhc2UgQHAgaSBpcyBkZWNyZW1lbnRlZC4KKyAgICoKKyAgICogIEZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycywgdGhpcyB1c2VzIHRoZWlyIEBjICsgYW5kIEBjIC0gb3BlcmF0aW9ucworICAgKiAgYW5kIGFyZSBjb25zdGFudCB0aW1lLiAgRm9yIG90aGVyICVpdGVyYXRvciBjbGFzc2VzIHRoZXkgYXJlIGxpbmVhciB0aW1lLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX0Rpc3RhbmNlPgorICAgIGlubGluZSB2b2lkCisgICAgYWR2YW5jZShfSW5wdXRJdGVyYXRvciYgX19pLCBfRGlzdGFuY2UgX19uKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzIC0tIHRha2VuIGNhcmUgb2YgaW4gX19hZHZhbmNlCisgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19kID0gX19uOworICAgICAgc3RkOjpfX2FkdmFuY2UoX19pLCBfX2QsIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2kpKTsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBuZXh0KF9Gb3J3YXJkSXRlcmF0b3IgX194LCB0eXBlbmFtZQorCSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAxKQorICAgIHsKKyAgICAgIHN0ZDo6YWR2YW5jZShfX3gsIF9fbik7CisgICAgICByZXR1cm4gX194OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yPgorICAgIGlubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yCisgICAgcHJldihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9feCwgdHlwZW5hbWUKKwkgaXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMSkgCisgICAgeworICAgICAgc3RkOjphZHZhbmNlKF9feCwgLV9fbik7CisgICAgICByZXR1cm4gX194OworICAgIH0KKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9TVExfSVRFUkFUT1JfQkFTRV9GVU5DU19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDRkYzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaApAQCAtMCwwICsxLDIyOSBAQAorLy8gVHlwZXMgdXNlZCBpbiBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZ2VuZXJhbCBpdGVyYXRvci1yZWxhdGVkIHV0aWxpdHkgdHlwZXMsCisgKiAgc3VjaCBhcyBpdGVyYXRvcl90cmFpdHMgYW5kIHN0cnVjdCBpdGVyYXRvci4KKyAqLworCisjaWZuZGVmIF9TVExfSVRFUkFUT1JfQkFTRV9UWVBFU19ICisjZGVmaW5lIF9TVExfSVRFUkFUT1JfQkFTRV9UWVBFU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPHR5cGVfdHJhaXRzPiAgLy8gRm9yIF9HTElCQ1hYX0hBU19ORVNURURfVFlQRQorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBkZWZncm91cCBpdGVyYXRvcnMgSXRlcmF0b3JzCisgICAqICBBYnN0cmFjdGlvbnMgZm9yIHVuaWZvcm0gaXRlcmF0aW5nIHRocm91Z2ggdmFyaW91cyB1bmRlcmx5aW5nIHR5cGVzLgorICAqLworICAvL0B7IAorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGl0ZXJhdG9yX3RhZ3MgSXRlcmF0b3IgVGFncworICAgKiAgVGhlc2UgYXJlIGVtcHR5IHR5cGVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBpdGVyYXRvcnMuICBUaGUKKyAgICogIGRpc3RpbmN0aW9uIGlzIG5vdCBtYWRlIGJ5IHdoYXQgdGhleSBjb250YWluLCBidXQgc2ltcGx5IGJ5IHdoYXQgdGhleQorICAgKiAgYXJlLiAgRGlmZmVyZW50IHVuZGVybHlpbmcgYWxnb3JpdGhtcyBjYW4gdGhlbiBiZSB1c2VkIGJhc2VkIG9uIHRoZQorICAgKiAgZGlmZmVyZW50IG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGRpZmZlcmVudCBpdGVyYXRvciB0eXBlcy4KKyAgKi8KKyAgLy9AeyAKKyAgLy8vICBNYXJraW5nIGlucHV0IGl0ZXJhdG9ycy4KKyAgc3RydWN0IGlucHV0X2l0ZXJhdG9yX3RhZyB7IH07CisKKyAgLy8vICBNYXJraW5nIG91dHB1dCBpdGVyYXRvcnMuCisgIHN0cnVjdCBvdXRwdXRfaXRlcmF0b3JfdGFnIHsgfTsKKworICAvLy8gRm9yd2FyZCBpdGVyYXRvcnMgc3VwcG9ydCBhIHN1cGVyc2V0IG9mIGlucHV0IGl0ZXJhdG9yIG9wZXJhdGlvbnMuCisgIHN0cnVjdCBmb3J3YXJkX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBpbnB1dF9pdGVyYXRvcl90YWcgeyB9OworCisgIC8vLyBCaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycyBzdXBwb3J0IGEgc3VwZXJzZXQgb2YgZm9yd2FyZCBpdGVyYXRvcgorICAvLy8gb3BlcmF0aW9ucy4KKyAgc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnIHsgfTsKKworICAvLy8gUmFuZG9tLWFjY2VzcyBpdGVyYXRvcnMgc3VwcG9ydCBhIHN1cGVyc2V0IG9mIGJpZGlyZWN0aW9uYWwKKyAgLy8vIGl0ZXJhdG9yIG9wZXJhdGlvbnMuCisgIHN0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyA6IHB1YmxpYyBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyB7IH07CisgIC8vQH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29tbW9uICVpdGVyYXRvciBjbGFzcy4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgZG9lcyBub3RoaW5nIGJ1dCBkZWZpbmUgbmVzdGVkIHR5cGVkZWZzLiAgJUl0ZXJhdG9yIGNsYXNzZXMKKyAgICogIGNhbiBpbmhlcml0IGZyb20gdGhpcyBjbGFzcyB0byBzYXZlIHNvbWUgd29yay4gIFRoZSB0eXBlZGVmcyBhcmUgdGhlbgorICAgKiAgdXNlZCBpbiBzcGVjaWFsaXphdGlvbnMgYW5kIG92ZXJsb2FkaW5nLgorICAgKgorICAgKiAgSW4gcGFydGljdWxhciwgdGhlcmUgYXJlIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHJlcXVpcmVtZW50cworICAgKiAgc3VjaCBhcyBAYyBvcGVyYXRvcisrIGFuZCB0aGUgbGlrZS4gIChIb3cgY291bGQgdGhlcmUgYmU/KQorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2F0ZWdvcnksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0Rpc3RhbmNlID0gcHRyZGlmZl90LAorICAgICAgICAgICB0eXBlbmFtZSBfUG9pbnRlciA9IF9UcCosIHR5cGVuYW1lIF9SZWZlcmVuY2UgPSBfVHAmPgorICAgIHN0cnVjdCBpdGVyYXRvcgorICAgIHsKKyAgICAgIC8vLyBPbmUgb2YgdGhlIEBsaW5rIGl0ZXJhdG9yX3RhZ3MgdGFnIHR5cGVzQGVuZGxpbmsuCisgICAgICB0eXBlZGVmIF9DYXRlZ29yeSAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICAvLy8gVGhlIHR5cGUgInBvaW50ZWQgdG8iIGJ5IHRoZSBpdGVyYXRvci4KKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworICAgICAgLy8vIERpc3RhbmNlIGJldHdlZW4gaXRlcmF0b3JzIGlzIHJlcHJlc2VudGVkIGFzIHRoaXMgdHlwZS4KKyAgICAgIHR5cGVkZWYgX0Rpc3RhbmNlICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvLy8gVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBwb2ludGVyLXRvLXZhbHVlX3R5cGUuCisgICAgICB0eXBlZGVmIF9Qb2ludGVyICAgcG9pbnRlcjsKKyAgICAgIC8vLyBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHJlZmVyZW5jZS10by12YWx1ZV90eXBlLgorICAgICAgdHlwZWRlZiBfUmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBUcmFpdHMgY2xhc3MgZm9yIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgZG9lcyBub3RoaW5nIGJ1dCBkZWZpbmUgbmVzdGVkIHR5cGVkZWZzLiAgVGhlIGdlbmVyYWwKKyAgICogIHZlcnNpb24gc2ltcGx5IEBhIGZvcndhcmRzIHRoZSBuZXN0ZWQgdHlwZWRlZnMgZnJvbSB0aGUgSXRlcmF0b3IKKyAgICogIGFyZ3VtZW50LiAgU3BlY2lhbGl6ZWQgdmVyc2lvbnMgZm9yIHBvaW50ZXJzIGFuZCBwb2ludGVycy10by1jb25zdAorICAgKiAgcHJvdmlkZSB0aWdodGVyLCBtb3JlIGNvcnJlY3Qgc2VtYW50aWNzLgorICAqLworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKK19HTElCQ1hYX0hBU19ORVNURURfVFlQRShpdGVyYXRvcl9jYXRlZ29yeSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsCisJICAgYm9vbCA9IF9faGFzX2l0ZXJhdG9yX2NhdGVnb3J5PF9JdGVyYXRvcj46OnZhbHVlPgorICAgIHN0cnVjdCBfX2l0ZXJhdG9yX3RyYWl0cyB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBfX2l0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3IsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHMKKyAgICA6IHB1YmxpYyBfX2l0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+IHsgfTsKKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6ZGlmZmVyZW5jZV90eXBlICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgIH07CisjZW5kaWYKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHM8X1RwKj4KKyAgICB7CisgICAgICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgY29uc3QgcG9pbnRlciB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHM8Y29uc3QgX1RwKj4KKyAgICB7CisgICAgICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgfTsKKworICAvKioKKyAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGEgcGFydCBvZiB0aGUgQysrIHN0YW5kYXJkIGJ1dCBpcyBzeW50YWN0aWMKKyAgICogIHN1Z2FyIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZSBvbmx5LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkKKyAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJikKKyAgICB7IHJldHVybiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRlZ29yeSgpOyB9CisKKyAgLy9AfQorCisgIC8vIElmIF9JdGVyYXRvciBoYXMgYSBiYXNlIHJldHVybnMgaXQgb3RoZXJ3aXNlIF9JdGVyYXRvciBpcyByZXR1cm5lZAorICAvLyB1bnRvdWNoZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCBib29sIF9IYXNCYXNlPgorICAgIHN0cnVjdCBfSXRlcl9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfSXRlcmF0b3IgaXRlcmF0b3JfdHlwZTsKKyAgICAgIHN0YXRpYyBpdGVyYXRvcl90eXBlIF9TX2Jhc2UoX0l0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBfX2l0OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9JdGVyX2Jhc2U8X0l0ZXJhdG9yLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0l0ZXJhdG9yOjppdGVyYXRvcl90eXBlIGl0ZXJhdG9yX3R5cGU7CisgICAgICBzdGF0aWMgaXRlcmF0b3JfdHlwZSBfU19iYXNlKF9JdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gX19pdC5iYXNlKCk7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX0lURVJBVE9SX0JBU0VfVFlQRVNfSCAqLworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2xpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTBhYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX2xpc3QuaApAQCAtMCwwICsxLDE2NTAgQEAKKy8vIExpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorLy8gMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfbGlzdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bGlzdH0KKyAqLworCisjaWZuZGVmIF9TVExfTElTVF9ICisjZGVmaW5lIF9TVExfTElTVF9IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8Yml0cy9jb21wYXRpYmlsaXR5LWxpc3QuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvLyBTdXBwb3J0aW5nIHN0cnVjdHVyZXMgYXJlIHNwbGl0IGludG8gY29tbW9uIGFuZCB0ZW1wbGF0ZWQKKyAgICAvLyB0eXBlczsgdGhlIGxhdHRlciBwdWJsaWNseSBpbmhlcml0cyBmcm9tIHRoZSBmb3JtZXIgaW4gYW4KKyAgICAvLyBlZmZvcnQgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24uICBUaGlzIHJlc3VsdHMgaW4gc29tZQorICAgIC8vICJuZWVkbGVzcyIgc3RhdGljX2Nhc3QnaW5nIGxhdGVyIG9uLCBidXQgaXQncyBhbGwgc2FmZQorICAgIC8vIGRvd25jYXN0aW5nLgorCisgICAgLy8vIENvbW1vbiBwYXJ0IG9mIGEgbm9kZSBpbiB0aGUgJWxpc3QuIAorICAgIHN0cnVjdCBfTGlzdF9ub2RlX2Jhc2UKKyAgICB7CisgICAgICBfTGlzdF9ub2RlX2Jhc2UqIF9NX25leHQ7CisgICAgICBfTGlzdF9ub2RlX2Jhc2UqIF9NX3ByZXY7CisgICAgICAKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBzd2FwKF9MaXN0X25vZGVfYmFzZSYgX194LCBfTGlzdF9ub2RlX2Jhc2UmIF9feSkgdGhyb3cgKCkKKyAgICAgIHsKKyAgICAgICAgc3RkOjpfTGlzdF9ub2RlX2Jhc2U6OnN3YXAocmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAmPihfX3gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICY+KF9feSkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV90cmFuc2ZlcihfTGlzdF9ub2RlX2Jhc2UqIGNvbnN0IF9fZmlyc3QsCisJCSAgX0xpc3Rfbm9kZV9iYXNlKiBjb25zdCBfX2xhc3QpIHRocm93ICgpCisgICAgICB7CisgICAgICAgIChyZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICo+KHRoaXMpKS0+dHJhbnNmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAqIGNvbnN0PihfX2ZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICogY29uc3Q+KF9fbGFzdCkpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9yZXZlcnNlKCkgdGhyb3cgKCkKKyAgICAgIHsKKyAgICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpfTGlzdF9ub2RlX2Jhc2UgKj4odGhpcykpLT5yZXZlcnNlKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2hvb2soX0xpc3Rfbm9kZV9iYXNlKiBjb25zdCBfX3Bvc2l0aW9uKSB0aHJvdyAoKQorICAgICAgeworICAgICAgICAocmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAqPih0aGlzKSktPmhvb2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6Ol9MaXN0X25vZGVfYmFzZSAqIGNvbnN0PihfX3Bvc2l0aW9uKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3VuaG9vaygpIHRocm93ICgpCisgICAgICB7CisgICAgICAgIChyZWludGVycHJldF9jYXN0PHN0ZDo6X0xpc3Rfbm9kZV9iYXNlICo+KHRoaXMpKS0+dW5ob29rKCk7CisgICAgICB9CisgICAgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvLy8gQW4gYWN0dWFsIG5vZGUgaW4gdGhlICVsaXN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9MaXN0X25vZGUgOiBwdWJsaWMgX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZQorICAgIHsKKyAgICAgIC8vLzwgVXNlcidzIGRhdGEuCisgICAgICBfVHAgX01fZGF0YTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX0xpc3Rfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKwk6IF9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2UoKSwgX01fZGF0YShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pIAorICAgICAgICB7IH0KKyNlbmRpZgorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBsaXN0OjppdGVyYXRvci4KKyAgICoKKyAgICogIEFsbCB0aGUgZnVuY3Rpb25zIGFyZSBvcCBvdmVybG9hZHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0xpc3RfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIF9MaXN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICAgICAgX1NlbGY7CisgICAgICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgICAgICAgX05vZGU7CisKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgX0xpc3RfaXRlcmF0b3IoKQorICAgICAgOiBfTV9ub2RlKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTGlzdF9pdGVyYXRvcihfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlKiBfX3gpCisgICAgICA6IF9NX25vZGUoX194KSB7IH0KKworICAgICAgLy8gTXVzdCBkb3duY2FzdCBmcm9tIF9MaXN0X25vZGVfYmFzZSB0byBfTGlzdF9ub2RlIHRvIGdldCB0byBfTV9kYXRhLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X05vZGUqPihfTV9ub2RlKS0+X01fZGF0YTsgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2Yoc3RhdGljX2Nhc3Q8X05vZGUqPihfTV9ub2RlKS0+X01fZGF0YSk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9uZXh0OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvci0tKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfTV9ub2RlLT5fTV9wcmV2OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlICE9IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIC8vIFRoZSBvbmx5IG1lbWJlciBwb2ludHMgdG8gdGhlICVsaXN0IGVsZW1lbnQuCisgICAgICBfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlKiBfTV9ub2RlOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBsaXN0Ojpjb25zdF9pdGVyYXRvci4KKyAgICoKKyAgICogIEFsbCB0aGUgZnVuY3Rpb25zIGFyZSBvcCBvdmVybG9hZHMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0xpc3RfY29uc3RfaXRlcmF0b3IKKyAgICB7CisgICAgICB0eXBlZGVmIF9MaXN0X2NvbnN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgX1NlbGY7CisgICAgICB0eXBlZGVmIGNvbnN0IF9MaXN0X25vZGU8X1RwPiAgICAgICAgICAgICAgX05vZGU7CisgICAgICB0eXBlZGVmIF9MaXN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICAgICAgaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKworICAgICAgX0xpc3RfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfTV9ub2RlKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTGlzdF9jb25zdF9pdGVyYXRvcihjb25zdCBfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlKiBfX3gpCisgICAgICA6IF9NX25vZGUoX194KSB7IH0KKworICAgICAgX0xpc3RfY29uc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9feCkKKyAgICAgIDogX01fbm9kZShfX3guX01fbm9kZSkgeyB9CisKKyAgICAgIC8vIE11c3QgZG93bmNhc3QgZnJvbSBMaXN0X25vZGVfYmFzZSB0byBfTGlzdF9ub2RlIHRvIGdldCB0bworICAgICAgLy8gX01fZGF0YS4KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Ob2RlKj4oX01fbm9kZSktPl9NX2RhdGE7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9Ob2RlKj4oX01fbm9kZSktPl9NX2RhdGEpOyB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX25leHQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fbm9kZSA9IF9NX25vZGUtPl9NX3ByZXY7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2VsZgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJX1NlbGYgX190bXAgPSAqdGhpczsKKwlfTV9ub2RlID0gX01fbm9kZS0+X01fcHJldjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgPT0gX194Ll9NX25vZGU7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbm9kZSAhPSBfX3guX01fbm9kZTsgfQorCisgICAgICAvLyBUaGUgb25seSBtZW1iZXIgcG9pbnRzIHRvIHRoZSAlbGlzdCBlbGVtZW50LgorICAgICAgY29uc3QgX19kZXRhaWw6Ol9MaXN0X25vZGVfYmFzZSogX01fbm9kZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9MaXN0X2l0ZXJhdG9yPF9WYWw+JiBfX3gsCisJICAgICAgIGNvbnN0IF9MaXN0X2NvbnN0X2l0ZXJhdG9yPF9WYWw+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfTGlzdF9pdGVyYXRvcjxfVmFsPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgX0xpc3RfY29uc3RfaXRlcmF0b3I8X1ZhbD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fbm9kZSAhPSBfX3kuX01fbm9kZTsgfQorCisKKyAgLy8vIFNlZSBiaXRzL3N0bF9kZXF1ZS5oJ3MgX0RlcXVlX2Jhc2UgZm9yIGFuIGV4cGxhbmF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfTGlzdF9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIE5PVEEgQkVORQorICAgICAgLy8gVGhlIHN0b3JlZCBpbnN0YW5jZSBpcyBub3QgYWN0dWFsbHkgb2YgImFsbG9jYXRvcl90eXBlIidzCisgICAgICAvLyB0eXBlLiAgSW5zdGVhZCB3ZSByZWJpbmQgdGhlIHR5cGUgdG8KKyAgICAgIC8vIEFsbG9jYXRvcjxMaXN0X25vZGU8VHA+Piwgd2hpY2ggYWNjb3JkaW5nIHRvIFsyMC4xLjVdLzQKKyAgICAgIC8vIHNob3VsZCBwcm9iYWJseSBiZSB0aGUgc2FtZS4gIExpc3Rfbm9kZTxUcD4gaXMgbm90IHRoZSBzYW1lCisgICAgICAvLyBzaXplIGFzIFRwIChpdCdzIHR3byBwb2ludGVycyBsYXJnZXIpLCBhbmQgc3BlY2lhbGl6YXRpb25zIG9uCisgICAgICAvLyBUcCBtYXkgZ28gdW51c2VkIGJlY2F1c2UgTGlzdF9ub2RlPFRwPiBpcyBiZWluZyBib3VuZAorICAgICAgLy8gaW5zdGVhZC4KKyAgICAgIC8vCisgICAgICAvLyBXZSBwdXQgdGhpcyB0byB0aGUgdGVzdCBpbiB0aGUgY29uc3RydWN0b3JzIGFuZCBpbgorICAgICAgLy8gZ2V0X2FsbG9jYXRvciwgd2hlcmUgd2UgdXNlIGNvbnZlcnNpb25zIGJldHdlZW4KKyAgICAgIC8vIGFsbG9jYXRvcl90eXBlIGFuZCBfTm9kZV9hbGxvY190eXBlLiBUaGUgY29udmVyc2lvbiBpcworICAgICAgLy8gcmVxdWlyZWQgYnkgdGFibGUgMzIgaW4gWzIwLjEuNV0uCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9MaXN0X25vZGU8X1RwPiA+OjpvdGhlcgorICAgICAgICBfTm9kZV9hbGxvY190eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyIF9UcF9hbGxvY190eXBlOworCisgICAgICBzdHJ1Y3QgX0xpc3RfaW1wbCAKKyAgICAgIDogcHVibGljIF9Ob2RlX2FsbG9jX3R5cGUKKyAgICAgIHsKKwlfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlIF9NX25vZGU7CisKKwlfTGlzdF9pbXBsKCkKKwk6IF9Ob2RlX2FsbG9jX3R5cGUoKSwgX01fbm9kZSgpCisJeyB9CisKKwlfTGlzdF9pbXBsKGNvbnN0IF9Ob2RlX2FsbG9jX3R5cGUmIF9fYSkKKwk6IF9Ob2RlX2FsbG9jX3R5cGUoX19hKSwgX01fbm9kZSgpCisJeyB9CisgICAgICB9OworCisgICAgICBfTGlzdF9pbXBsIF9NX2ltcGw7CisKKyAgICAgIF9MaXN0X25vZGU8X1RwPioKKyAgICAgIF9NX2dldF9ub2RlKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX05vZGVfYWxsb2NfdHlwZTo6YWxsb2NhdGUoMSk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgX01fcHV0X25vZGUoX0xpc3Rfbm9kZTxfVHA+KiBfX3ApCisgICAgICB7IF9NX2ltcGwuX05vZGVfYWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisgICAgICAKKyAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Ob2RlX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9Ob2RlX2FsbG9jX3R5cGUqPigmdGhpcy0+X01faW1wbCk7IH0KKworICAgICAgY29uc3QgX05vZGVfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBfVHBfYWxsb2NfdHlwZQorICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfVHBfYWxsb2NfdHlwZShfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOyB9CisKKyAgICAgIF9MaXN0X2Jhc2UoKQorICAgICAgOiBfTV9pbXBsKCkKKyAgICAgIHsgX01faW5pdCgpOyB9CisKKyAgICAgIF9MaXN0X2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7IF9NX2luaXQoKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9MaXN0X2Jhc2UoX0xpc3RfYmFzZSYmIF9feCkKKyAgICAgIDogX01faW1wbChfX3guX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpCisgICAgICB7CisJX01faW5pdCgpOworCV9fZGV0YWlsOjpfTGlzdF9ub2RlX2Jhc2U6OnN3YXAodGhpcy0+X01faW1wbC5fTV9ub2RlLCAKKwkJCQkJX194Ll9NX2ltcGwuX01fbm9kZSk7CQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIFRoaXMgaXMgd2hhdCBhY3R1YWxseSBkZXN0cm95cyB0aGUgbGlzdC4KKyAgICAgIH5fTGlzdF9iYXNlKCkKKyAgICAgIHsgX01fY2xlYXIoKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jbGVhcigpOworCisgICAgICB2b2lkCisgICAgICBfTV9pbml0KCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQgPSAmdGhpcy0+X01faW1wbC5fTV9ub2RlOworICAgICAgICB0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fcHJldiA9ICZ0aGlzLT5fTV9pbXBsLl9NX25vZGU7CisgICAgICB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciB3aXRoIGxpbmVhciB0aW1lIGFjY2VzcyB0byBlbGVtZW50cywKKyAgICogIGFuZCBmaXhlZCB0aW1lIGluc2VydGlvbi9kZWxldGlvbiBhdCBhbnkgcG9pbnQgaW4gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LCBpbmNsdWRpbmcgdGhlCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OCI+b3B0aW9uYWwgc2VxdWVuY2UgcmVxdWlyZW1lbnRzPC9hPiB3aXRoIHRoZQorICAgKiAgJWV4Y2VwdGlvbiBvZiBAYyBhdCBhbmQgQGMgb3BlcmF0b3JbXS4KKyAgICoKKyAgICogIFRoaXMgaXMgYSBAZSBkb3VibHkgQGUgbGlua2VkICVsaXN0LiAgVHJhdmVyc2FsIHVwIGFuZCBkb3duIHRoZQorICAgKiAgJWxpc3QgcmVxdWlyZXMgbGluZWFyIHRpbWUsIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIGVsZW1lbnRzIChvcgorICAgKiAgQGUgbm9kZXMpIGlzIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUKKyAgICogIGNoYW5nZSB0YWtlcyBwbGFjZS4gIFVubGlrZSBzdGQ6OnZlY3RvciBhbmQgc3RkOjpkZXF1ZSwKKyAgICogIHJhbmRvbS1hY2Nlc3MgaXRlcmF0b3JzIGFyZSBub3QgcHJvdmlkZWQsIHNvIHN1YnNjcmlwdGluZyAoIEBjCisgICAqICBbXSApIGFjY2VzcyBpcyBub3QgYWxsb3dlZC4gIEZvciBhbGdvcml0aG1zIHdoaWNoIG9ubHkgbmVlZAorICAgKiAgc2VxdWVudGlhbCBhY2Nlc3MsIHRoaXMgbGFjayBtYWtlcyBubyBkaWZmZXJlbmNlLgorICAgKgorICAgKiAgQWxzbyB1bmxpa2UgdGhlIG90aGVyIHN0YW5kYXJkIGNvbnRhaW5lcnMsIHN0ZDo6bGlzdCBwcm92aWRlcworICAgKiAgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyAldW5pcXVlIHRvIGxpbmtlZCBsaXN0cywgc3VjaCBhcworICAgKiAgc3BsaWNpbmcsIHNvcnRpbmcsIGFuZCBpbi1wbGFjZSByZXZlcnNhbC4KKyAgICoKKyAgICogIEEgY291cGxlIHBvaW50cyBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgbGlzdDxUcD46CisgICAqCisgICAqICBGaXJzdCwgd2UgbmV2ZXIgYWN0dWFsbHkgYWxsb2NhdGUgYSBUcCwgd2UgYWxsb2NhdGUKKyAgICogIExpc3Rfbm9kZTxUcD4ncyBhbmQgdHJ1c3QgWzIwLjEuNV0vNCB0byBEVFJULiAgVGhpcyBpcyB0byBlbnN1cmUKKyAgICogIHRoYXQgYWZ0ZXIgZWxlbWVudHMgZnJvbSAlbGlzdDxYLEFsbG9jMT4gYXJlIHNwbGljZWQgaW50bworICAgKiAgJWxpc3Q8WCxBbGxvYzI+LCBkZXN0cm95aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHNlY29uZCAlbGlzdCBpcyBhCisgICAqICB2YWxpZCBvcGVyYXRpb24sIGkuZS4sIEFsbG9jMSBnaXZldGggYW5kIEFsbG9jMiB0YWtldGggYXdheS4KKyAgICoKKyAgICogIFNlY29uZCwgYSAlbGlzdCBjb25jZXB0dWFsbHkgcmVwcmVzZW50ZWQgYXMKKyAgICogIEBjb2RlCisgICAqICAgIEEgPC0tLT4gQiA8LS0tPiBDIDwtLS0+IEQKKyAgICogIEBlbmRjb2RlCisgICAqICBpcyBhY3R1YWxseSBjaXJjdWxhcjsgYSBsaW5rIGV4aXN0cyBiZXR3ZWVuIEEgYW5kIEQuICBUaGUgJWxpc3QKKyAgICogIGNsYXNzIGhvbGRzIChhcyBpdHMgb25seSBkYXRhIG1lbWJlcikgYSBwcml2YXRlIGxpc3Q6Oml0ZXJhdG9yCisgICAqICBwb2ludGluZyB0byBAZSBELCBub3QgdG8gQGUgQSEgIFRvIGdldCB0byB0aGUgaGVhZCBvZiB0aGUgJWxpc3QsCisgICAqICB3ZSBzdGFydCBhdCB0aGUgdGFpbCBhbmQgbW92ZSBmb3J3YXJkIGJ5IG9uZS4gIFdoZW4gdGhpcyBtZW1iZXIKKyAgICogIGl0ZXJhdG9yJ3MgbmV4dC9wcmV2aW91cyBwb2ludGVycyByZWZlciB0byBpdHNlbGYsIHRoZSAlbGlzdCBpcworICAgKiAgJWVtcHR5LiAKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBsaXN0IDogcHJvdGVjdGVkIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp2YWx1ZV90eXBlICAgICAgICAgICAgICAgIF9BbGxvY192YWx1ZV90eXBlOworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfVHAsIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgICB0eXBlZGVmIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+ICAgICAgICAgICAgICAgICAgICBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Ol9UcF9hbGxvY190eXBlCQkgX1RwX2FsbG9jX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9MaXN0X2l0ZXJhdG9yPF9UcD4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX0xpc3RfY29uc3RfaXRlcmF0b3I8X1RwPiAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIE5vdGUgdGhhdCBwb2ludGVycy10by1fTm9kZSdzIGNhbiBiZSBjdG9yLWNvbnZlcnRlZCB0bworICAgICAgLy8gaXRlcmF0b3IgdHlwZXMuCisgICAgICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPgkJCQkgX05vZGU7CisKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbXBsOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX3B1dF9ub2RlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2dldF9ub2RlOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2dldF9UcF9hbGxvY2F0b3I7CisgICAgICB1c2luZyBfQmFzZTo6X01fZ2V0X05vZGVfYWxsb2NhdG9yOworCisgICAgICAvKioKKyAgICAgICAqICBAcGFyYW0gIHggIEFuIGluc3RhbmNlIG9mIHVzZXIgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgQWxsb2NhdGVzIHNwYWNlIGZvciBhIG5ldyBub2RlIGFuZCBjb25zdHJ1Y3RzIGEgY29weSBvZiBAYSB4IGluIGl0LgorICAgICAgICovCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfTm9kZSogX19wID0gdGhpcy0+X01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeworCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkuY29uc3RydWN0CisJICAgICAgKHN0ZDo6X19hZGRyZXNzb2YoX19wLT5fTV9kYXRhKSwgX194KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fcHV0X25vZGUoX19wKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX05vZGUqCisgICAgICAgIF9NX2NyZWF0ZV9ub2RlKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9Ob2RlKiBfX3AgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmNvbnN0cnVjdChfX3AsCisJCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9NX3B1dF9ub2RlKF9fcCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIHJldHVybiBfX3A7CisJfQorI2VuZGlmCisKKyAgICBwdWJsaWM6CisgICAgICAvLyBbMjMuMi4yLjFdIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kKKyAgICAgIC8vIChhc3NpZ24oKSBhbmQgZ2V0X2FsbG9jYXRvcigpIGFyZSBhbHNvIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24pCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgbGlzdCgpCisgICAgICA6IF9CYXNlKCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfQmFzZShfX2EpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWxpc3Qgd2l0aCBAYSBuIGRlZmF1bHQKKyAgICAgICAqICBjb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoKQorICAgICAgeyBfTV9kZWZhdWx0X2luaXRpYWxpemUoX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlbGlzdCB3aXRoIGNvcGllcyBvZiBhbiBleGVtcGxhciBlbGVtZW50LgorICAgICAgICogIEBwYXJhbSAgbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICogIEBwYXJhbSAgdmFsdWUgIEFuIGVsZW1lbnQgdG8gY29weS4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICVsaXN0IHdpdGggQGEgbiBjb3BpZXMgb2YgQGEgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVsaXN0IHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICB2YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBmaWxscyB0aGUgJWxpc3Qgd2l0aCBAYSBuIGNvcGllcyBvZiBAYSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSA9IHZhbHVlX3R5cGUoKSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWxpc3QgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24gb2JqZWN0IHVzZWQKKyAgICAgICAqICBieSBAYSB4LgorICAgICAgICovCisgICAgICBsaXN0KGNvbnN0IGxpc3QmIF9feCkKKyAgICAgIDogX0Jhc2UoX194Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKQorICAgICAgeyBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9feC5iZWdpbigpLCBfX3guZW5kKCksIF9fZmFsc2VfdHlwZSgpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWxpc3QgY29udGFpbnMgdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIHguCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIHggYXJlIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlbGlzdC4KKyAgICAgICAqLworICAgICAgbGlzdChsaXN0JiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJWxpc3QgZnJvbSBhbiBpbml0aWFsaXplcl9saXN0CisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbGlzdCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXJfbGlzdCBAYSBsLiAgVGhpcyBpcyBsaW5lYXIgaW4gbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIGxpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7IF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19mYWxzZV90eXBlKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbGlzdCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVsaXN0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW0BhIGZpcnN0LEBhIGxhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiAod2hlcmUgTiBpcworICAgICAgICogIGRpc3RhbmNlKEBhIGZpcnN0LEBhIGxhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGxpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIDogX0Jhc2UoX19hKQorICAgICAgICB7IAorCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqICBObyBleHBsaWNpdCBkdG9yIG5lZWRlZCBhcyB0aGUgX0Jhc2UgZHRvciB0YWtlcyBjYXJlIG9mCisgICAgICAgKiAgdGhpbmdzLiAgVGhlIF9CYXNlIGR0b3Igb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgbm90ZQorICAgICAgICogIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10bworICAgICAgICogIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAqICB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWxpc3Qgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSB4IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkKKyAgICAgICAqICBjb25zdHJ1Y3RvciwgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBsaXN0JiBfX3gpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJUxpc3QgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlbGlzdCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgeCBhcmUgbW92ZWQgaW50byB0aGlzICVsaXN0ICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIHggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVsaXN0CisgICAgICAgKi8KKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0obGlzdCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTGlzdCBpbml0aWFsaXplciBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0IG9mIHZhbHVlX3R5cGUuCisgICAgICAgKgorICAgICAgICogIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAlbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMKKyAgICAgICAqICBpbiB0aGUgaW5pdGlhbGl6ZXJfbGlzdCBAYSBsLiAgVGhpcyBpcyBsaW5lYXIgaW4gbC5zaXplKCkuCisgICAgICAgKi8KKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYSBnaXZlbiB2YWx1ZSB0byBhICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICogIEBwYXJhbSAgdmFsICBWYWx1ZSB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVsaXN0IHdpdGggQGEgbiBjb3BpZXMgb2YgdGhlIGdpdmVuCisgICAgICAgKiAgdmFsdWUuICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlbGlzdAorICAgICAgICogIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgJWxpc3QncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIHJhbmdlIHRvIGEgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlbGlzdCB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgcmFuZ2UgW0BhIGZpcnN0LEBhIGxhc3QpLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAlbGlzdCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJWxpc3QncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YKKyAgICAgICAqICBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYW4gaW50ZWdyYWwgdHlwZS4gIElmIHNvLCBpdCdzIG5vdCBhbiBpdGVyYXRvci4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbnMgYW4gaW5pdGlhbGl6ZXJfbGlzdCB0byBhICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBSZXBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGUgJWxpc3Qgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgaW4gdGhlIGluaXRpYWxpemVyX2xpc3QgQGEgbC4gIFRoaXMgaXMgbGluZWFyIGluIGwuc2l6ZSgpLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8vIGl0ZXJhdG9ycworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlCisgICAgICAgKiAgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fbm9kZS5fTV9uZXh0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkgZWxlbWVudAorICAgICAgICogIG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdAorICAgICAgICogIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UgZWxlbWVudAorICAgICAgICogIG9yZGVyLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8KKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBmaXJzdCBlbGVtZW50IGluIHRoZSAlbGlzdC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fbmV4dCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0CisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZ0aGlzLT5fTV9pbXBsLl9NX25vZGUpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvCisgICAgICAgKiAgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJWxpc3QuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICVsaXN0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcmV2ZXJzZQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBbMjMuMi4yLjJdIGNhcGFjaXR5CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICVsaXN0IGlzIGVtcHR5LiAgKFRodXMgYmVnaW4oKSB3b3VsZCBlcXVhbAorICAgICAgICogIGVuZCgpLikKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX25leHQgPT0gJnRoaXMtPl9NX2ltcGwuX01fbm9kZTsgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgJWxpc3QuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgc2l6ZSgpIG9mIHRoZSBsYXJnZXN0IHBvc3NpYmxlICVsaXN0LiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkubWF4X3NpemUoKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXNpemVzIHRoZSAlbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gbmV3X3NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlbGlzdCBzaG91bGQgY29udGFpbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgJWxpc3QncworICAgICAgICogIGN1cnJlbnQgc2l6ZSB0aGUgJWxpc3QgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgZGVmYXVsdAorICAgICAgICogIGNvbnN0cnVjdGVkIGVsZW1lbnRzIGFyZSBhcHBlbmRlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFJlc2l6ZXMgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSBuZXdfc2l6ZSBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICVsaXN0IHNob3VsZCBjb250YWluLgorICAgICAgICogIEBwYXJhbSB4IERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICVsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgJWxpc3QncworICAgICAgICogIGN1cnJlbnQgc2l6ZSB0aGUgJWxpc3QgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UgdGhlICVsaXN0IGlzCisgICAgICAgKiAgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGggZ2l2ZW4gZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBSZXNpemVzIHRoZSAlbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gbmV3X3NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAlbGlzdCBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0geCBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlbGlzdCB0byB0aGUgc3BlY2lmaWVkIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlICVsaXN0J3MKKyAgICAgICAqICBjdXJyZW50IHNpemUgdGhlICVsaXN0IGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZSAlbGlzdCBpcworICAgICAgICogIGV4dGVuZGVkIGFuZCBuZXcgZWxlbWVudHMgYXJlIHBvcHVsYXRlZCB3aXRoIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgdmFsdWVfdHlwZSBfX3ggPSB2YWx1ZV90eXBlKCkpOworI2VuZGlmCisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJWxpc3QuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlbGlzdC4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QgZWxlbWVudAorICAgICAgICogIG9mIHRoZSAlbGlzdC4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsgCisJaXRlcmF0b3IgX190bXAgPSBlbmQoKTsKKwktLV9fdG1wOworCXJldHVybiAqX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlbGlzdC4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgCisJY29uc3RfaXRlcmF0b3IgX190bXAgPSBlbmQoKTsKKwktLV9fdG1wOworCXJldHVybiAqX190bXA7CisgICAgICB9CisKKyAgICAgIC8vIFsyMy4yLjIuM10gbW9kaWZpZXJzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBmcm9udCBvZiB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICB4ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGZyb250IG9mIHRoZSAlbGlzdCBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0YQorICAgICAgICogIHRvIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUKKyAgICAgICAqICBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQKKyAgICAgICAqICByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0KGJlZ2luKCksIF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHRoaXMtPl9NX2luc2VydChiZWdpbigpLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9mcm9udChfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeyB0aGlzLT5fTV9pbnNlcnQoYmVnaW4oKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCBzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlbGlzdCBieQorICAgICAgICogIG9uZS4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUKKyAgICAgICAqICBpbiBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0bworICAgICAgICogIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncyBkYXRhCisgICAgICAgKiAgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3BfZnJvbnQoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2UoYmVnaW4oKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGFuCisgICAgICAgKiAgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSAlbGlzdCBhbmQgYXNzaWducyB0aGUgZ2l2ZW4gZGF0YSB0bworICAgICAgICogIGl0LiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZG9uZQorICAgICAgICogIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQKKyAgICAgICAqICByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyB0aGlzLT5fTV9pbnNlcnQoZW5kKCksIF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgdGhpcy0+X01faW5zZXJ0KGVuZCgpLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgICB7IHRoaXMtPl9NX2luc2VydChlbmQoKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBsYXN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gIEl0IHNocmlua3MgdGhlICVsaXN0IGJ5CisgICAgICAgKiAgb25lLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZG9uZQorICAgICAgICogIGluIGNvbnN0YW50IHRpbWUsIGFuZCBvbmx5IGludmFsaWRhdGVzIGl0ZXJhdG9ycy9yZWZlcmVuY2VzIHRvCisgICAgICAgKiAgdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgbGFzdCBlbGVtZW50J3MgZGF0YQorICAgICAgICogIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wX2JhY2soKSBpcyBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2UoaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9ub2RlLl9NX3ByZXYpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0cyBvYmplY3QgaW4gJWxpc3QgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBIGNvbnN0X2l0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgYXJncyAgQXJndW1lbnRzLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGFuIG9iamVjdCBvZiB0eXBlIFQgY29uc3RydWN0ZWQKKyAgICAgICAqICB3aXRoIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSBiZWZvcmUgdGhlIHNwZWNpZmllZAorICAgICAgICogIGxvY2F0aW9uLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzIG9wZXJhdGlvbiBjYW4KKyAgICAgICAqICBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycworICAgICAgICogIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncyk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHZhbHVlIGludG8gJWxpc3QgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGluc2VydGVkIGRhdGEuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBjb3B5IG9mIHRoZSBnaXZlbiB2YWx1ZSBiZWZvcmUKKyAgICAgICAqICB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgRHVlIHRvIHRoZSBuYXR1cmUgb2YgYSAlbGlzdCB0aGlzCisgICAgICAgKiAgb3BlcmF0aW9uIGNhbiBiZSBkb25lIGluIGNvbnN0YW50IHRpbWUsIGFuZCBkb2VzIG5vdAorICAgICAgICogIGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHJ2YWx1ZSBpbnRvICVsaXN0IGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICB4ICBEYXRhIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBkYXRhLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGEgY29weSBvZiB0aGUgZ2l2ZW4gcnZhbHVlIGJlZm9yZQorICAgICAgICogIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBhICVsaXN0IHRoaXMKKyAgICAgICAqICBvcGVyYXRpb24gY2FuIGJlIGRvbmUgaW4gY29uc3RhbnQgdGltZSwgYW5kIGRvZXMgbm90CisgICAgICAgKiAgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBlbXBsYWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGFuIGluaXRpYWxpemVyX2xpc3QgaW50byAlbGlzdAorICAgICAgICogICAgICAgICAgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHAgIEFuIGl0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiB2YWx1ZV90eXBlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplcl9saXN0IEBhIGwgaW50byB0aGUgJWxpc3QgYmVmb3JlIHRoZSBsb2NhdGlvbgorICAgICAgICogIHNwZWNpZmllZCBieSBAYSBwLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIG9wZXJhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbnNlcnRlZCBhbmQKKyAgICAgICAqICBkb2VzIG5vdCBpbnZhbGlkYXRlIGl0ZXJhdG9ycyBhbmQgcmVmZXJlbmNlcy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3AsIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgbnVtYmVyIG9mIGNvcGllcyBvZiBnaXZlbiBkYXRhIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29waWVzIG9mIHRoZQorICAgICAgICogIGdpdmVuIGRhdGEgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgQGEgcG9zaXRpb24uCisgICAgICAgKgorICAgICAgICogIFRoaXMgb3BlcmF0aW9uIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluc2VydGVkIGFuZAorICAgICAgICogIGRvZXMgbm90IGludmFsaWRhdGUgaXRlcmF0b3JzIGFuZCByZWZlcmVuY2VzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyAgCisJbGlzdCBfX3RtcChfX24sIF9feCwgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOworCXNwbGljZShfX3Bvc2l0aW9uLCBfX3RtcCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBhIHJhbmdlIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEFuIGl0ZXJhdG9yIGludG8gdGhlICVsaXN0LgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUgcmFuZ2UgW0BhCisgICAgICAgKiAgZmlyc3QsQGEgbGFzdCkgaW50byB0aGUgJWxpc3QgYmVmb3JlIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkKKyAgICAgICAqICBAYSBwb3NpdGlvbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW5zZXJ0ZWQgYW5kCisgICAgICAgKiAgZG9lcyBub3QgaW52YWxpZGF0ZSBpdGVyYXRvcnMgYW5kIHJlZmVyZW5jZXMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIGxpc3QgX190bXAoX19maXJzdCwgX19sYXN0LCBfTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisJICBzcGxpY2UoX19wb3NpdGlvbiwgX190bXApOworCX0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgZWxlbWVudCBhdCBnaXZlbiBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBJdGVyYXRvciBwb2ludGluZyB0byBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgbmV4dCBlbGVtZW50IChvciBlbmQoKSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBlcmFzZSB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRodXMKKyAgICAgICAqICBzaG9ydGVuIHRoZSAlbGlzdCBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJWxpc3QgdGhpcyBvcGVyYXRpb24gY2FuIGJlIGRvbmUgaW4KKyAgICAgICAqICBjb25zdGFudCB0aW1lLCBhbmQgb25seSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMvcmVmZXJlbmNlcyB0bworICAgICAgICogIHRoZSBlbGVtZW50IGJlaW5nIHJlbW92ZWQuICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQKKyAgICAgICAqICBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4KKyAgICAgICAqICBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5IEBhIGxhc3QKKyAgICAgICAqICAgICAgICAgICBwcmlvciB0byBlcmFzaW5nIChvciBlbmQoKSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBlcmFzZSB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIEBhCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpIGFuZCBzaG9ydGVuIHRoZSAlbGlzdCBhY2NvcmRpbmdseS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgbGluZWFyIHRpbWUgaW4gdGhlIHNpemUgb2YgdGhlIHJhbmdlIGFuZCBvbmx5CisgICAgICAgKiAgaW52YWxpZGF0ZXMgaXRlcmF0b3JzL3JlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnQgYmVpbmcgcmVtb3ZlZC4KKyAgICAgICAqICBUaGUgdXNlciBpcyBhbHNvIGNhdXRpb25lZCB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlCisgICAgICAgKiAgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlCisgICAgICAgKiAgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyCisgICAgICAgKiAgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwl3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJICBfX2ZpcnN0ID0gZXJhc2UoX19maXJzdCk7CisJcmV0dXJuIF9fbGFzdDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJWxpc3Qgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gbGlzdHMgaW4gY29uc3RhbnQKKyAgICAgICAqICB0aW1lLiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMKKyAgICAgICAqICBzcGVjaWFsaXplZCBzdWNoIHRoYXQgc3RkOjpzd2FwKGwxLGwyKSB3aWxsIGZlZWQgdG8gdGhpcworICAgICAgICogIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKGxpc3QmIF9feCkKKyAgICAgIHsKKwlfX2RldGFpbDo6X0xpc3Rfbm9kZV9iYXNlOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fbm9kZSwgCisJCQkJCV9feC5fTV9pbXBsLl9NX25vZGUpOworCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKwlzdGQ6Ol9fYWxsb2Nfc3dhcDx0eXBlbmFtZSBfQmFzZTo6X05vZGVfYWxsb2NfdHlwZT46OgorCSAgX1NfZG9faXQoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCksIF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZQorICAgICAgICogIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4KKyAgICAgICAqICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisgICAgICAgIF9CYXNlOjpfTV9jbGVhcigpOworICAgICAgICBfQmFzZTo6X01faW5pdCgpOworICAgICAgfQorCisgICAgICAvLyBbMjMuMi4yLjRdIGxpc3Qgb3BlcmF0aW9ucworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgY29udGVudHMgb2YgYW5vdGhlciAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYmVmb3JlLgorICAgICAgICogIEBwYXJhbSAgeCAgU291cmNlIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFRoZSBlbGVtZW50cyBvZiBAYSB4IGFyZSBpbnNlcnRlZCBpbiBjb25zdGFudCB0aW1lIGluIGZyb250IG9mCisgICAgICAgKiAgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBAYSBwb3NpdGlvbi4gIEBhIHggYmVjb21lcyBhbiBlbXB0eQorICAgICAgICogIGxpc3QuCisgICAgICAgKgorICAgICAgICogIFJlcXVpcmVzIHRoaXMgIT0gQGEgeC4KKyAgICAgICAqLworICAgICAgdm9pZAorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorI2VuZGlmCisgICAgICB7CisJaWYgKCFfX3guZW1wdHkoKSkKKwkgIHsKKwkgICAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhfX3gpOworCisJICAgIHRoaXMtPl9NX3RyYW5zZmVyKF9fcG9zaXRpb24sIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOworCSAgfQorICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpCisgICAgICB7IHNwbGljZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBlbGVtZW50IGZyb20gYW5vdGhlciAlbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBpbnNlcnQgYmVmb3JlLgorICAgICAgICogIEBwYXJhbSAgeCAgU291cmNlIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBpICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZWxlbWVudCB0byBtb3ZlLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBlbGVtZW50IGluIGxpc3QgQGEgeCByZWZlcmVuY2VkIGJ5IEBhIGkgYW5kCisgICAgICAgKiAgaW5zZXJ0cyBpdCBpbnRvIHRoZSBjdXJyZW50IGxpc3QgYmVmb3JlIEBhIHBvc2l0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2kpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorI2VuZGlmCisgICAgICB7CisJaXRlcmF0b3IgX19qID0gX19pOworCSsrX19qOworCWlmIChfX3Bvc2l0aW9uID09IF9faSB8fCBfX3Bvc2l0aW9uID09IF9faikKKwkgIHJldHVybjsKKworCWlmICh0aGlzICE9ICZfX3gpCisJICBfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzKF9feCk7CisKKwl0aGlzLT5fTV90cmFuc2ZlcihfX3Bvc2l0aW9uLCBfX2ksIF9faik7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9faSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCByYW5nZSBmcm9tIGFub3RoZXIgJWxpc3QuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGJlZm9yZS4KKyAgICAgICAqICBAcGFyYW0gIHggIFNvdXJjZSBsaXN0LgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBzdGFydCBvZiByYW5nZSBpbiB4LgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGVuZCBvZiByYW5nZSBpbiB4LgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIGVsZW1lbnRzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgYW5kIGluc2VydHMgdGhlbQorICAgICAgICogIGJlZm9yZSBAYSBwb3NpdGlvbiBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICoKKyAgICAgICAqICBVbmRlZmluZWQgaWYgQGEgcG9zaXRpb24gaXMgaW4gW2ZpcnN0LGxhc3QpLgorICAgICAgICovCisgICAgICB2b2lkCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgaXRlcmF0b3IgX19sYXN0KQorI2Vsc2UKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBpdGVyYXRvciBfX2xhc3QpCisjZW5kaWYKKyAgICAgIHsKKwlpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJICB7CisJICAgIGlmICh0aGlzICE9ICZfX3gpCisJICAgICAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhfX3gpOworCisJICAgIHRoaXMtPl9NX3RyYW5zZmVyKF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisJICB9CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhbGwgZWxlbWVudHMgZXF1YWwgdG8gdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIHRvIHJlbW92ZS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyBldmVyeSBlbGVtZW50IGluIHRoZSBsaXN0IGVxdWFsIHRvIEBhIHZhbHVlLgorICAgICAgICogIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluIGxpc3Qgb3JkZXIuICBOb3RlIHRoYXQgdGhpcworICAgICAgICogIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZShjb25zdCBfVHAmIF9fdmFsdWUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhbGwgZWxlbWVudHMgc2F0aXNmeWluZyBhIHByZWRpY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gIFByZWRpY2F0ZSAgVW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyBldmVyeSBlbGVtZW50IGluIHRoZSBsaXN0IGZvciB3aGljaCB0aGUgcHJlZGljYXRlCisgICAgICAgKiAgcmV0dXJucyB0cnVlLiAgUmVtYWluaW5nIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUKKyAgICAgICAqICB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUKKyAgICAgICAqICBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICByZW1vdmVfaWYoX1ByZWRpY2F0ZSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGNvbnNlY3V0aXZlIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhY2ggY29uc2VjdXRpdmUgc2V0IG9mIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgdmFsdWUsCisgICAgICAgKiAgcmVtb3ZlIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gIFJlbWFpbmluZyBlbGVtZW50cyBzdGF5IGluCisgICAgICAgKiAgbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZQorICAgICAgICogIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsCisgICAgICAgKiAgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZworICAgICAgICogIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHVuaXF1ZSgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLgorICAgICAgICogIEBwYXJhbSAgQmluYXJ5UHJlZGljYXRlICBCaW5hcnkgcHJlZGljYXRlIGZ1bmN0aW9uIG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGVhY2ggY29uc2VjdXRpdmUgc2V0IG9mIGVsZW1lbnRzIFtmaXJzdCxsYXN0KSB0aGF0CisgICAgICAgKiAgc2F0aXNmeSBwcmVkaWNhdGUoZmlyc3QsaSkgd2hlcmUgaSBpcyBhbiBpdGVyYXRvciBpbgorICAgICAgICogIFtmaXJzdCxsYXN0KSwgcmVtb3ZlIGFsbCBidXQgdGhlIGZpcnN0IG9uZS4gIFJlbWFpbmluZworICAgICAgICogIGVsZW1lbnRzIHN0YXkgaW4gbGlzdCBvcmRlci4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkKKyAgICAgICAqICBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUKKyAgICAgICAqICBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuCisgICAgICAgKiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpbmFyeVByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTWVyZ2Ugc29ydGVkIGxpc3RzLgorICAgICAgICogIEBwYXJhbSAgeCAgU29ydGVkIGxpc3QgdG8gbWVyZ2UuCisgICAgICAgKgorICAgICAgICogIEFzc3VtZXMgdGhhdCBib3RoIEBhIHggYW5kIHRoaXMgbGlzdCBhcmUgc29ydGVkIGFjY29yZGluZyB0bworICAgICAgICogIG9wZXJhdG9yPCgpLiAgTWVyZ2VzIGVsZW1lbnRzIG9mIEBhIHggaW50byB0aGlzIGxpc3QgaW4KKyAgICAgICAqICBzb3J0ZWQgb3JkZXIsIGxlYXZpbmcgQGEgeCBlbXB0eSB3aGVuIGNvbXBsZXRlLiAgRWxlbWVudHMgaW4KKyAgICAgICAqICB0aGlzIGxpc3QgcHJlY2VkZSBlbGVtZW50cyBpbiBAYSB4IHRoYXQgYXJlIGVxdWFsLgorICAgICAgICovCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmJiBfX3gpOworCisgICAgICB2b2lkCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX3gpKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmIF9feCk7CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNZXJnZSBzb3J0ZWQgbGlzdHMgYWNjb3JkaW5nIHRvIGNvbXBhcmlzb24gZnVuY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICB4ICBTb3J0ZWQgbGlzdCB0byBtZXJnZS4KKyAgICAgICAqICBAcGFyYW0gU3RyaWN0V2Vha09yZGVyaW5nIENvbXBhcmlzb24gZnVuY3Rpb24gZGVmaW5pbmcKKyAgICAgICAqICBzb3J0IG9yZGVyLgorICAgICAgICoKKyAgICAgICAqICBBc3N1bWVzIHRoYXQgYm90aCBAYSB4IGFuZCB0aGlzIGxpc3QgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAqICBTdHJpY3RXZWFrT3JkZXJpbmcuICBNZXJnZXMgZWxlbWVudHMgb2YgQGEgeCBpbnRvIHRoaXMgbGlzdAorICAgICAgICogIGluIHNvcnRlZCBvcmRlciwgbGVhdmluZyBAYSB4IGVtcHR5IHdoZW4gY29tcGxldGUuICBFbGVtZW50cworICAgICAgICogIGluIHRoaXMgbGlzdCBwcmVjZWRlIGVsZW1lbnRzIGluIEBhIHggdGhhdCBhcmUgZXF1aXZhbGVudAorICAgICAgICogIGFjY29yZGluZyB0byBTdHJpY3RXZWFrT3JkZXJpbmcoKS4KKyAgICAgICAqLworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGxpc3QmJiwgX1N0cmljdFdlYWtPcmRlcmluZyk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UobGlzdCYgX194LCBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgICAgeyBtZXJnZShzdGQ6Om1vdmUoX194KSwgX19jb21wKTsgfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2UobGlzdCYsIF9TdHJpY3RXZWFrT3JkZXJpbmcpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV2ZXJzZSB0aGUgZWxlbWVudHMgaW4gbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgaW4gbGluZWFyIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJldmVyc2UoKQorICAgICAgeyB0aGlzLT5fTV9pbXBsLl9NX25vZGUuX01fcmV2ZXJzZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU29ydCB0aGUgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIFNvcnRzIHRoZSBlbGVtZW50cyBvZiB0aGlzIGxpc3QgaW4gTmxvZ04gdGltZS4gIEVxdWl2YWxlbnQKKyAgICAgICAqICBlbGVtZW50cyByZW1haW4gaW4gbGlzdCBvcmRlci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc29ydCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNvcnQgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byBjb21wYXJpc29uIGZ1bmN0aW9uLgorICAgICAgICoKKyAgICAgICAqICBTb3J0cyB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0IGluIE5sb2dOIHRpbWUuICBFcXVpdmFsZW50CisgICAgICAgKiAgZWxlbWVudHMgcmVtYWluIGluIGxpc3Qgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwgX190cnVlX3R5cGUpCisgICAgICAgIHsgX01fZmlsbF9pbml0aWFsaXplKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSwgX194KTsgfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IGxpc3Qobix2LGEpLCBhbmQgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHdoZW4gaXQgdHVybnMgb3V0CisgICAgICAvLyB0byBiZSB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJZm9yICg7IF9fbjsgLS1fX24pCisJICBwdXNoX2JhY2soX194KTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBDYWxsZWQgYnkgbGlzdChuKS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlZmF1bHRfaW5pdGlhbGl6ZShzaXplX3R5cGUgX19uKQorICAgICAgeworCWZvciAoOyBfX247IC0tX19uKQorCSAgZW1wbGFjZV9iYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIENhbGxlZCBieSByZXNpemUoc3opLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9hcHBlbmQoc2l6ZV90eXBlIF9fbik7CisjZW5kaWYKKworICAgICAgLy8gSW50ZXJuYWwgYXNzaWduIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgYXNzaWduIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzOC4gQW1iaWd1aXR5IGluIHRoZSAiZG8gdGhlIHJpZ2h0IHRoaW5nIiBjbGF1c2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsLCBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2Fzc2lnbihfX24sIF9fdmFsKTsgfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGFzc2lnbiB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9fZmFsc2VfdHlwZSk7CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24obix0KSwgYW5kIHRoZSByYW5nZSBhc3NpZ24gd2hlbiBpdCB0dXJucyBvdXQKKyAgICAgIC8vIHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpOworCisKKyAgICAgIC8vIE1vdmVzIHRoZSBlbGVtZW50cyBmcm9tIFtmaXJzdCxsYXN0KSBiZWZvcmUgcG9zaXRpb24uCisgICAgICB2b2lkCisgICAgICBfTV90cmFuc2ZlcihpdGVyYXRvciBfX3Bvc2l0aW9uLCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9fcG9zaXRpb24uX01fbm9kZS0+X01fdHJhbnNmZXIoX19maXJzdC5fTV9ub2RlLCBfX2xhc3QuX01fbm9kZSk7IH0KKworICAgICAgLy8gSW5zZXJ0cyBuZXcgZWxlbWVudCBhdCBwb3NpdGlvbiBnaXZlbiBhbmQgd2l0aCB2YWx1ZSBnaXZlbi4KKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisgICAgICAgIF9Ob2RlKiBfX3RtcCA9IF9NX2NyZWF0ZV9ub2RlKF9feCk7CisgICAgICAgIF9fdG1wLT5fTV9ob29rKF9fcG9zaXRpb24uX01fbm9kZSk7CisgICAgICB9CisjZWxzZQorICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICB2b2lkCisgICAgICAgX01faW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorICAgICAgIHsKKwkgX05vZGUqIF9fdG1wID0gX01fY3JlYXRlX25vZGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgX190bXAtPl9NX2hvb2soX19wb3NpdGlvbi5fTV9ub2RlKTsKKyAgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gRXJhc2VzIGVsZW1lbnQgYXQgcG9zaXRpb24gZ2l2ZW4uCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworICAgICAgICBfX3Bvc2l0aW9uLl9NX25vZGUtPl9NX3VuaG9vaygpOworICAgICAgICBfTm9kZSogX19uID0gc3RhdGljX2Nhc3Q8X05vZGUqPihfX3Bvc2l0aW9uLl9NX25vZGUpOworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLmRlc3Ryb3koX19uKTsKKyNlbHNlCisJX01fZ2V0X1RwX2FsbG9jYXRvcigpLmRlc3Ryb3koc3RkOjpfX2FkZHJlc3NvZihfX24tPl9NX2RhdGEpKTsKKyNlbmRpZgorICAgICAgICBfTV9wdXRfbm9kZShfX24pOworICAgICAgfQorCisgICAgICAvLyBUbyBpbXBsZW1lbnQgdGhlIHNwbGljZSAoYW5kIG1lcmdlKSBiaXRzIG9mIE4xNTk5LgorICAgICAgdm9pZAorICAgICAgX01fY2hlY2tfZXF1YWxfYWxsb2NhdG9ycyhsaXN0JiBfX3gpCisgICAgICB7CisJaWYgKHN0ZDo6X19hbGxvY19uZXE8dHlwZW5hbWUgX0Jhc2U6Ol9Ob2RlX2FsbG9jX3R5cGU+OjoKKwkgICAgX1NfZG9faXQoX01fZ2V0X05vZGVfYWxsb2NhdG9yKCksIF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkpCisJICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJsaXN0OjpfTV9jaGVja19lcXVhbF9hbGxvY2F0b3JzIikpOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIExpc3QgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgeCAgQSAlbGlzdC4KKyAgICogIEBwYXJhbSAgeSAgQSAlbGlzdCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIGxpc3RzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YKKyAgICogIHRoZSBsaXN0cy4gIExpc3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlCisgICAqICBlcXVhbCwgYW5kIGlmIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBsaXN0PF9UcCwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2VuZDEgPSBfX3guZW5kKCk7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2VuZDIgPSBfX3kuZW5kKCk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTEgPSBfX3guYmVnaW4oKTsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTIgPSBfX3kuYmVnaW4oKTsKKyAgICAgIHdoaWxlIChfX2kxICE9IF9fZW5kMSAmJiBfX2kyICE9IF9fZW5kMiAmJiAqX19pMSA9PSAqX19pMikKKwl7CisJICArK19faTE7CisJICArK19faTI7CisJfQorICAgICAgcmV0dXJuIF9faTEgPT0gX19lbmQxICYmIF9faTIgPT0gX19lbmQyOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgTGlzdCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgeCAgQSAlbGlzdC4KKyAgICogIEBwYXJhbSAgeSAgQSAlbGlzdCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSB5LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbGlzdHMuICBUaGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHdpdGggQGMgPC4KKyAgICoKKyAgICogIFNlZSBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgZm9yIGhvdyB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkJICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjpsaXN0Ojpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBsaXN0PF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX0xJU1RfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9tYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiZWY4YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbWFwLmgKQEAgLTAsMCArMSw5NDEgQEAKKy8vIE1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisvLyAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9tYXAuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21hcH0KKyAqLworCisjaWZuZGVmIF9TVExfTUFQX0gKKyNkZWZpbmUgX1NUTF9NQVBfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgbWFkZSB1cCBvZiAoa2V5LHZhbHVlKSBwYWlycywgd2hpY2ggY2FuIGJlCisgICAqICByZXRyaWV2ZWQgYmFzZWQgb24gYSBrZXksIGluIGxvZ2FyaXRobWljIHRpbWUuCisgICAqCisgICAqICBAaW5ncm91cCBhc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhbgorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjkiPmFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4gKHVzaW5nIHVuaXF1ZSBrZXlzKS4KKyAgICogIEZvciBhIEBjIG1hcDxLZXksVD4gdGhlIGtleV90eXBlIGlzIEtleSwgdGhlIG1hcHBlZF90eXBlIGlzIFQsIGFuZCB0aGUKKyAgICogIHZhbHVlX3R5cGUgaXMgc3RkOjpwYWlyPGNvbnN0IEtleSxUPi4KKyAgICoKKyAgICogIE1hcHMgc3VwcG9ydCBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4KKyAgICoKKyAgICogIFRoZSBwcml2YXRlIHRyZWUgZGF0YSBpcyBkZWNsYXJlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBmb3IgbWFwIGFuZAorICAgKiAgbXVsdGltYXA7IHRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGVudGlyZWx5IGluIGhvdyB0aGUgdHJlZSBmdW5jdGlvbnMgYXJlCisgICAqICBjYWxsZWQgKCpfdW5pcXVlIHZlcnN1cyAqX2VxdWFsLCBzYW1lIGFzIHRoZSBzdGFuZGFyZCkuCisgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorICAgICAgICAgICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgbWFwCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9Db21wYXJlLCBib29sLCBfS2V5LCBfS2V5LAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKHZhbHVlX3R5cGUsIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgY2xhc3MgdmFsdWVfY29tcGFyZQorICAgICAgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248dmFsdWVfdHlwZSwgdmFsdWVfdHlwZSwgYm9vbD4KKyAgICAgIHsKKwlmcmllbmQgY2xhc3MgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz47CisgICAgICBwcm90ZWN0ZWQ6CisJX0NvbXBhcmUgY29tcDsKKworCXZhbHVlX2NvbXBhcmUoX0NvbXBhcmUgX19jKQorCTogY29tcChfX2MpIHsgfQorCisgICAgICBwdWJsaWM6CisJYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KSBjb25zdAorCXsgcmV0dXJuIGNvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpOyB9CisgICAgICB9OworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vLyBUaGlzIHR1cm5zIGEgcmVkLWJsYWNrIHRyZWUgaW50byBhIFttdWx0aV1tYXAuIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXIgCisgICAgICAgIF9QYWlyX2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIF9TZWxlY3Qxc3Q8dmFsdWVfdHlwZT4sCisJCSAgICAgICBrZXlfY29tcGFyZSwgX1BhaXJfYWxsb2NfdHlwZT4gX1JlcF90eXBlOworCisgICAgICAvLy8gVGhlIGFjdHVhbCB0cmVlIHN0cnVjdHVyZS4KKyAgICAgIF9SZXBfdHlwZSBfTV90OworCisgICAgcHVibGljOgorICAgICAgLy8gbWFueSBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGRpZmZlcmVudGx5IGluIElTTywgYnV0IHRoZSBmb2xsb3dpbmcgYXJlCisgICAgICAvLyAiZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQiCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gWzIzLjMuMS4xXSBjb25zdHJ1Y3QvY29weS9kZXN0cm95CisgICAgICAvLyAoZ2V0X2FsbG9jYXRvcigpIGlzIG5vcm1hbGx5IGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24sIGJ1dCBzZWVtcyB0byBoYXZlCisgICAgICAvLyBiZWVuIGFjY2lkZW50YWxseSBvbWl0dGVkIGluIHRoZSBwcmludGVkIHN0YW5kYXJkKQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIG1hcCgpCisgICAgICA6IF9NX3QoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJW1hcCB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgY29tcCAgQSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVtYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJW1hcCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QKKyAgICAgICAqICB1c2VkIGJ5IEBhIHguCisgICAgICAgKi8KKyAgICAgIG1hcChjb25zdCBtYXAmIF9feCkKKyAgICAgIDogX01fdChfX3guX01fdCkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVtYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJW1hcCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgeC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgeCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtYXAuCisgICAgICAgKi8KKyAgICAgIG1hcChtYXAmJiBfX3gpCisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9feC5fTV90KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW1hcCBmcm9tIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSAgY29tcCAgQSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgbC4KKyAgICAgICAqICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOCisgICAgICAgKiAgb3RoZXJ3aXNlICh3aGVyZSBOIGlzIEBhIGwuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fYyA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2MsIF9fYSkKKyAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbWFwIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbWFwIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tIFtmaXJzdCxsYXN0KS4KKyAgICAgICAqICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOCisgICAgICAgKiAgb3RoZXJ3aXNlICh3aGVyZSBOIGlzIGRpc3RhbmNlKGZpcnN0LGxhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJOiBfTV90KCkKKyAgICAgICAgeyBfTV90Ll9NX2luc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtYXAgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBjb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20gW2ZpcnN0LGxhc3QpLgorICAgICAgICogIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzIGFscmVhZHkgc29ydGVkLCBhbmQgTmxvZ04KKyAgICAgICAqICBvdGhlcndpc2UgKHdoZXJlIE4gaXMgZGlzdGFuY2UoZmlyc3QsbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV90KF9fY29tcCwgX19hKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIC8vIEZJWE1FIFRoZXJlIGlzIG5vIGR0b3IgZGVjbGFyZWQsIGJ1dCB3ZSBzaG91bGQgaGF2ZSBzb21ldGhpbmcKKyAgICAgIC8vIGdlbmVyYXRlZCBieSBEb3h5Z2VuLiAgSSBkb24ndCBrbm93IHdoYXQgdGFncyB0byBhZGQgdG8gdGhpcworICAgICAgLy8gcGFyYWdyYXBoIHRvIG1ha2UgdGhhdCBoYXBwZW46CisgICAgICAvKioKKyAgICAgICAqICBUaGUgZHRvciBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCBub3RlIHRoYXQgaWYgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkKKyAgICAgICAqICB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU1hcCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgeCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5IGNvbnN0cnVjdG9yLAorICAgICAgICogIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtYXAmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU1hcCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVtYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIHggYXJlIG1vdmVkIGludG8gdGhpcyBtYXAgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgeCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJW1hcC4KKyAgICAgICAqLworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KG1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTWFwIGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlbWFwIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplciBsaXN0IEBhIGwuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVtYXAgYW5kCisgICAgICAgKiAgdGhhdCB0aGUgcmVzdWx0aW5nICVtYXAncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvLyBpdGVyYXRvcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWlyIGluIHRoZQorICAgICAgICogICVtYXAuCisgICAgICAgKiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhaXIKKyAgICAgICAqICBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0bworICAgICAgICogIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgbGFzdCBwYWlyIGluCisgICAgICAgKiAgdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZSBiZWZvcmUgdGhlCisgICAgICAgKiAgZmlyc3QgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lCisgICAgICAgKiAgYmVmb3JlIHRoZSBmaXJzdCBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZworICAgICAgICogIG9yZGVyIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFpcgorICAgICAgICogIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBwYWlyIGluIHRoZSAlbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0bworICAgICAgICogIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IHBhaXIgaW4gdGhlICVtYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nCisgICAgICAgKiAgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5CisgICAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSAlbWFwIGlzIGVtcHR5LiAgKFRodXMgYmVnaW4oKSB3b3VsZCBlcXVhbAorICAgICAgICogIGVuZCgpLikKKyAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKworICAgICAgLyoqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlICVtYXAuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisKKyAgICAgIC8qKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlICVtYXAuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKworICAgICAgLy8gWzIzLjMuMS4yXSBlbGVtZW50IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgKCBAYyBbXSApIGFjY2VzcyB0byAlbWFwIGRhdGEuCisgICAgICAgKiAgQHBhcmFtICBrICBUaGUga2V5IGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXRyaWV2ZWQuCisgICAgICAgKiAgQHJldHVybiAgQSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgb2YgdGhlIChrZXksZGF0YSkgJXBhaXIuCisgICAgICAgKgorICAgICAgICogIEFsbG93cyBmb3IgZWFzeSBsb29rdXAgd2l0aCB0aGUgc3Vic2NyaXB0ICggQGMgW10gKQorICAgICAgICogIG9wZXJhdG9yLiAgUmV0dXJucyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHNwZWNpZmllZCBpbgorICAgICAgICogIHN1YnNjcmlwdC4gIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIGEgcGFpciB3aXRoIHRoYXQga2V5CisgICAgICAgKiAgaXMgY3JlYXRlZCB1c2luZyBkZWZhdWx0IHZhbHVlcywgd2hpY2ggaXMgdGhlbiByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgTG9va3VwIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeworCS8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQ8bWFwcGVkX3R5cGU+KQorCisJaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKKwkvLyBfX2ktPmZpcnN0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIF9fay4KKwlpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQorICAgICAgICAgIF9faSA9IGluc2VydChfX2ksIHZhbHVlX3R5cGUoX19rLCBtYXBwZWRfdHlwZSgpKSk7CisJcmV0dXJuICgqX19pKS5zZWNvbmQ7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGtleV90eXBlJiYgX19rKQorICAgICAgeworCS8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisJX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9EZWZhdWx0Q29uc3RydWN0aWJsZUNvbmNlcHQ8bWFwcGVkX3R5cGU+KQorCisJaXRlcmF0b3IgX19pID0gbG93ZXJfYm91bmQoX19rKTsKKwkvLyBfX2ktPmZpcnN0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVpdmFsZW50IHRvIF9fay4KKwlpZiAoX19pID09IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQorICAgICAgICAgIF9faSA9IGluc2VydChfX2ksIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bW92ZShfX2spLCBtYXBwZWRfdHlwZSgpKSk7CisJcmV0dXJuICgqX19pKS5zZWNvbmQ7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgNDY0LiBTdWdnZXN0aW9uIGZvciBuZXcgbWVtYmVyIGZ1bmN0aW9ucyBpbiBzdGFuZGFyZCBjb250YWluZXJzLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gJW1hcCBkYXRhLgorICAgICAgICogIEBwYXJhbSAgayAgVGhlIGtleSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0cmlldmVkLgorICAgICAgICogIEByZXR1cm4gIEEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIHdob3NlIGtleSBpcyBlcXVpdmFsZW50IHRvIEBhIGssIGlmCisgICAgICAgKiAgICAgICAgICAgc3VjaCBhIGRhdGEgaXMgcHJlc2VudCBpbiB0aGUgJW1hcC4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBubyBzdWNoIGRhdGEgaXMgcHJlc2VudC4KKyAgICAgICAqLworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeworCWl0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CisJaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpfX2kpLmZpcnN0KSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigibWFwOjphdCIpKTsKKwlyZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgICAgIH0KKworICAgICAgY29uc3QgbWFwcGVkX3R5cGUmCisgICAgICBhdChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgeworCWNvbnN0X2l0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CisJaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpfX2kpLmZpcnN0KSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigibWFwOjphdCIpKTsKKwlyZXR1cm4gKCpfX2kpLnNlY29uZDsKKyAgICAgIH0KKworICAgICAgLy8gbW9kaWZpZXJzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICVtYXAuCisKKyAgICAgICAqICBAcGFyYW0gIHggIFBhaXIgdG8gYmUgaW5zZXJ0ZWQgKHNlZSBzdGQ6Om1ha2VfcGFpciBmb3IgZWFzeSBjcmVhdGlvbiAKKyAgICAgICAqCSAgICAgb2YgcGFpcnMpLgorCisgICAgICAgKiAgQHJldHVybiAgQSBwYWlyLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBpdGVyYXRvciB0aGF0IAorICAgICAgICogICAgICAgICAgIHBvaW50cyB0byB0aGUgcG9zc2libHkgaW5zZXJ0ZWQgcGFpciwgYW5kIHRoZSBzZWNvbmQgaXMgCisgICAgICAgKiAgICAgICAgICAgYSBib29sIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgcGFpciB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gaW5zZXJ0IGEgKGtleSwgdmFsdWUpICVwYWlyIGludG8gdGhlICVtYXAuCisgICAgICAgKiAgQSAlbWFwIHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhICVwYWlyIGlzIG9ubHkgaW5zZXJ0ZWQgaWYgaXRzCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCAodGhlIGtleSkgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgJW1hcC4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF91bmlxdWUoX194KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF91bmlxdWUoc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhIGxpc3Qgb2Ygc3RkOjpwYWlycyBpbnRvIHRoZSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgcGFpcnMgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19saXN0KQorICAgICAgeyBpbnNlcnQoX19saXN0LmJlZ2luKCksIF9fbGlzdC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgc3RkOjpwYWlyIGludG8gdGhlICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIHBhaXIgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgeCAgUGFpciB0byBiZSBpbnNlcnRlZCAoc2VlIHN0ZDo6bWFrZV9wYWlyIGZvciBlYXN5IGNyZWF0aW9uCisgICAgICAgKiAgICAgICAgICAgICBvZiBwYWlycykuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGVsZW1lbnQgd2l0aCBrZXkgb2YgQGEgeCAobWF5CisgICAgICAgKiAgICAgICAgICAgb3IgbWF5IG5vdCBiZSB0aGUgJXBhaXIgcGFzc2VkIGluKS4KKyAgICAgICAqCisKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgd2hldGhlciB0aGUgaW5zZXJ0aW9uCisgICAgICAgKiAgdG9vayBwbGFjZSwgYW5kIHRodXMgZG9lcyBub3QgcmV0dXJuIGEgYm9vbGVhbiBsaWtlIHRoZQorICAgICAgICogIHNpbmdsZS1hcmd1bWVudCBpbnNlcnQoKSBkb2VzLiAgTm90ZSB0aGF0IHRoZSBmaXJzdAorICAgICAgICogIHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5IGltcHJvdmUgdGhlCisgICAgICAgKiAgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIFNlZQorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqICBmb3IgbW9yZSBvbiBAYSBoaW50aW5nLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZSAoaWYgdGhlIGhpbnQgaXMgbm90IHRha2VuKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbHNlCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF91bmlxdWVfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZV8oX19wb3NpdGlvbiwKKwkJCQkJc3RkOjpmb3J3YXJkPF9QYWlyPihfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGluc2VydCBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVtYXAuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBwb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2ggCisgICAgICAgKiAgICAgICAgICBlbGVtZW50IGV4aXN0cywgZW5kKCkgaXMgcmV0dXJuZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFuIGVsZW1lbnQsIHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuCisgICAgICAgKiAgaXRlcmF0b3IsIGZyb20gYSAlbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMKKyAgICAgICAqICB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nCisgICAgICAgKiAgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisKKyAgICAgIC8vIExXRyAyMDU5LgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4KKyAgICAgICAqICBpdGVyYXRvciwgZnJvbSBhICVtYXAuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcKKyAgICAgICAqICB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleS4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSBvZiBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYWxsIHRoZSBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQorICAgICAgICogIGEgJW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtmaXJzdCxsYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW1hcC4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gVGhlIGl0ZXJhdG9yIEBhIGxhc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtYXAuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGF0IGlmCisgICAgICAgKiAgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkCisgICAgICAgKiAgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlbWFwLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlbWFwIG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvIG1hcHMgaW4gY29uc3RhbnQKKyAgICAgICAqICB0aW1lLiAgKEl0IGlzIG9ubHkgc3dhcHBpbmcgYSBwb2ludGVyLCBhbiBpbnRlZ2VyLCBhbmQgYW4KKyAgICAgICAqICBpbnN0YW5jZSBvZiB0aGUgQGMgQ29tcGFyZSB0eXBlICh3aGljaCBpdHNlbGYgaXMgb2Z0ZW4KKyAgICAgICAqICBzdGF0ZWxlc3MgYW5kIGVtcHR5KSwgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKSAgTm90ZQorICAgICAgICogIHRoYXQgdGhlIGdsb2JhbCBzdGQ6OnN3YXAoKSBmdW5jdGlvbiBpcyBzcGVjaWFsaXplZCBzdWNoCisgICAgICAgKiAgdGhhdCBzdGQ6OnN3YXAobTEsbTIpIHdpbGwgZmVlZCB0byB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hcCYgX194KQorICAgICAgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYSAlbWFwLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seQorICAgICAgICogIGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZQorICAgICAgICogIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4KKyAgICAgICAqICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX3QuY2xlYXIoKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtYXAgd2FzCisgICAgICAgKiAgY29uc3RydWN0ZWQuCisgICAgICAgKi8KKyAgICAgIGtleV9jb21wYXJlCisgICAgICBrZXlfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHZhbHVlIGNvbXBhcmlzb24gb2JqZWN0LCBidWlsdCBmcm9tIHRoZSBrZXkgY29tcGFyaXNvbgorICAgICAgICogIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtYXAgd2FzIGNvbnN0cnVjdGVkLgorICAgICAgICovCisgICAgICB2YWx1ZV9jb21wYXJlCisgICAgICB2YWx1ZV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHZhbHVlX2NvbXBhcmUoX01fdC5rZXlfY29tcCgpKTsgfQorCisgICAgICAvLyBbMjMuMy4xLjNdIG1hcCBvcGVyYXRpb25zCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSAlcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciAlcGFpci4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIHRoZQorICAgICAgICogIHBhc3QtdGhlLWVuZCAoIEBjIGVuZCgpICkgaXRlcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYSAlbWFwLgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSAlcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlcgorICAgICAgICogICAgICAgICAgIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3RhbnQKKyAgICAgICAqICBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyICVwYWlyLiBJZiB1bnN1Y2Nlc3NmdWwgaXQKKyAgICAgICAqICByZXR1cm5zIHRoZSBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGltYXBzOyBmb3IgbWFwIHRoZSByZXN1bHQgd2lsbAorICAgICAgICogIGVpdGhlciBiZSAwIChub3QgcHJlc2VudCkgb3IgMSAocHJlc2VudCkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpID09IF9NX3QuZW5kKCkgPyAwIDogMTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIGZpcnN0IGVsZW1lbnQgZXF1YWwgdG8gb3IgZ3JlYXRlcgorICAgICAgICogICAgICAgICAgIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgc3Vic2VxdWVuY2Ugb2YgZWxlbWVudHMKKyAgICAgICAqICB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGtleS4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBoYXMgYSBncmVhdGVyIHZhbHVlIHRoYW4gZ2l2ZW4ga2V5CisgICAgICAgKiAgb3IgZW5kKCkgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICAgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHN1YnNlcXVlbmNlIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBrZXkuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyBhbiBpdGVyYXRvcgorICAgICAgICogIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaGFzIGEgZ3JlYXRlciB2YWx1ZSB0aGFuIGdpdmVuIGtleQorICAgICAgICogIG9yIGVuZCgpIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudAorICAgICAgICogICAgICAgICAgZ3JlYXRlciB0aGFuIGtleSwgb3IgZW5kKCkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgZW5kIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgaXRlcmF0b3IKKyAgICAgICAqICAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFBhaXIgb2YgaXRlcmF0b3JzIHRoYXQgcG9zc2libHkgcG9pbnRzIHRvIHRoZSBzdWJzZXF1ZW5jZQorICAgICAgICogICAgICAgICAgIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgKiAgQGNvZGUKKyAgICAgICAqICAgIHN0ZDo6bWFrZV9wYWlyKGMubG93ZXJfYm91bmQodmFsKSwKKyAgICAgICAqICAgICAgICAgICAgICAgICAgIGMudXBwZXJfYm91bmQodmFsKSkKKyAgICAgICAqICBAZW5kY29kZQorICAgICAgICogIChidXQgaXMgZmFzdGVyIHRoYW4gbWFraW5nIHRoZSBjYWxscyBzZXBhcmF0ZWx5KS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBwcm9iYWJseSBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aW1hcHMuCisgICAgICAgKi8KKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cworICAgICAgICogICAgICAgICAgIHRvIHRoZSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGltYXBzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mLAorCQkgICBjb25zdCBtYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBtYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgY29uc3QgbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mKTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYXAgZXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgICogIEBwYXJhbSAgeCAgQSAlbWFwLgorICAgKiAgQHBhcmFtICB5ICBBICVtYXAgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBtYXBzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtYXBzLiAgTWFwcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIHRoZWlyIHNpemVzIGFyZSBlcXVhbCwKKyAgICogIGFuZCBpZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGNvbXBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgTWFwIG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICB4ICBBICVtYXAuCisgICAqICBAcGFyYW0gIHkgIEEgJW1hcCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSB5LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbWFwcy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV90IDwgX195Ll9NX3Q7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I9PQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8vIFNlZSBzdGQ6Om1hcDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJIG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbXVsdGltYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbXVsdGltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU4ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9tdWx0aW1hcC5oCkBAIC0wLDAgKzEsODU5IEBACisvLyBNdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisvLyAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9tdWx0aW1hcC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWFwfQorICovCisKKyNpZm5kZWYgX1NUTF9NVUxUSU1BUF9ICisjZGVmaW5lIF9TVExfTVVMVElNQVBfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvKioKKyAgICogIEBicmllZiBBIHN0YW5kYXJkIGNvbnRhaW5lciBtYWRlIHVwIG9mIChrZXksdmFsdWUpIHBhaXJzLCB3aGljaCBjYW4gYmUKKyAgICogIHJldHJpZXZlZCBiYXNlZCBvbiBhIGtleSwgaW4gbG9nYXJpdGhtaWMgdGltZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGFzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGFuCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OSI+YXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPiAodXNpbmcgZXF1aXZhbGVudAorICAgKiAga2V5cykuICBGb3IgYSBAYyBtdWx0aW1hcDxLZXksVD4gdGhlIGtleV90eXBlIGlzIEtleSwgdGhlIG1hcHBlZF90eXBlCisgICAqICBpcyBULCBhbmQgdGhlIHZhbHVlX3R5cGUgaXMgc3RkOjpwYWlyPGNvbnN0IEtleSxUPi4KKyAgICoKKyAgICogIE11bHRpbWFwcyBzdXBwb3J0IGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAgKgorICAgKiAgVGhlIHByaXZhdGUgdHJlZSBkYXRhIGlzIGRlY2xhcmVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGZvciBtYXAgYW5kCisgICAqICBtdWx0aW1hcDsgdGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgZW50aXJlbHkgaW4gaG93IHRoZSB0cmVlIGZ1bmN0aW9ucyBhcmUKKyAgICogIGNhbGxlZCAoKl91bmlxdWUgdmVyc3VzICpfZXF1YWwsIHNhbWUgYXMgdGhlIHN0YW5kYXJkKS4KKyAgKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICAgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG11bHRpbWFwCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9Db21wYXJlLCBib29sLCBfS2V5LCBfS2V5LAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKHZhbHVlX3R5cGUsIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQkKKworICAgIHB1YmxpYzoKKyAgICAgIGNsYXNzIHZhbHVlX2NvbXBhcmUKKyAgICAgIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+CisgICAgICB7CisJZnJpZW5kIGNsYXNzIG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz47CisgICAgICBwcm90ZWN0ZWQ6CisJX0NvbXBhcmUgY29tcDsKKworCXZhbHVlX2NvbXBhcmUoX0NvbXBhcmUgX19jKQorCTogY29tcChfX2MpIHsgfQorCisgICAgICBwdWJsaWM6CisJYm9vbCBvcGVyYXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KSBjb25zdAorCXsgcmV0dXJuIGNvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpOyB9CisgICAgICB9OworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vLyBUaGlzIHR1cm5zIGEgcmVkLWJsYWNrIHRyZWUgaW50byBhIFttdWx0aV1tYXAuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciAKKyAgICAgICAgX1BhaXJfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZTxrZXlfdHlwZSwgdmFsdWVfdHlwZSwgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwKKwkJICAgICAgIGtleV9jb21wYXJlLCBfUGFpcl9hbGxvY190eXBlPiBfUmVwX3R5cGU7CisgICAgICAvLy8gVGhlIGFjdHVhbCB0cmVlIHN0cnVjdHVyZS4KKyAgICAgIF9SZXBfdHlwZSBfTV90OworCisgICAgcHVibGljOgorICAgICAgLy8gbWFueSBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGRpZmZlcmVudGx5IGluIElTTywgYnV0IHRoZSBmb2xsb3dpbmcgYXJlCisgICAgICAvLyAiZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQiCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9QYWlyX2FsbG9jX3R5cGU6OnBvaW50ZXIgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcl9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXJfYWxsb2NfdHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gWzIzLjMuMl0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLy8gKGdldF9hbGxvY2F0b3IoKSBpcyBhbHNvIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24pCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAoKQorICAgICAgOiBfTV90KCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICVtdWx0aW1hcCB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgY29tcCAgQSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBtdWx0aW1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpbWFwIGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVtdWx0aW1hcCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlbXVsdGltYXAgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24gb2JqZWN0CisgICAgICAgKiAgdXNlZCBieSBAYSB4LgorICAgICAgICovCisgICAgICBtdWx0aW1hcChjb25zdCBtdWx0aW1hcCYgX194KQorICAgICAgOiBfTV90KF9feC5fTV90KSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aW1hcCBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgIHggIEEgJW11bHRpbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aW1hcCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgeC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgeCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtdWx0aW1hcC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAobXVsdGltYXAmJiBfX3gpCisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9feC5fTV90KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW11bHRpbWFwIGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBjb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aW1hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIHRoZSBpbml0aWFsaXplcl9saXN0LiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgbGlzdCBpcyBhbHJlYWR5CisgICAgICAgKiAgc29ydGVkLCBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzIEBhIF9fbC5zaXplKCkpLgorICAgICAgICovCisgICAgICBtdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX19hKQorICAgICAgeyBfTV90Ll9NX2luc2VydF9lcXVhbChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW11bHRpbWFwIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlbXVsdGltYXAgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAgICAqICBbZmlyc3QsbGFzdCkuICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwKKyAgICAgICAqICBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzIGRpc3RhbmNlKGZpcnN0LGxhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwk6IF9NX3QoKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbXVsdGltYXAgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBjb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aW1hcCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtmaXJzdCxsYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzIGFscmVhZHkgc29ydGVkLAorICAgICAgICogIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMgZGlzdGFuY2UoZmlyc3QsbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICA6IF9NX3QoX19jb21wLCBfX2EpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvLyBGSVhNRSBUaGVyZSBpcyBubyBkdG9yIGRlY2xhcmVkLCBidXQgd2Ugc2hvdWxkIGhhdmUgc29tZXRoaW5nIGdlbmVyYXRlZAorICAgICAgLy8gYnkgRG94eWdlbi4gIEkgZG9uJ3Qga25vdyB3aGF0IHRhZ3MgdG8gYWRkIHRvIHRoaXMgcGFyYWdyYXBoIHRvIG1ha2UKKyAgICAgIC8vIHRoYXQgaGFwcGVuOgorICAgICAgLyoqCisgICAgICAgKiAgVGhlIGR0b3Igb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgbm90ZSB0aGF0IGlmIHRoZSBlbGVtZW50cworICAgICAgICogIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55CisgICAgICAgKiAgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aW1hcCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlbXVsdGltYXAgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSB4IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkgY29uc3RydWN0b3IsCisgICAgICAgKiAgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpbWFwIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJW11bHRpbWFwIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSB4IGFyZSBtb3ZlZCBpbnRvIHRoaXMgbXVsdGltYXAgKHdpdGhvdXQgY29weWluZykuCisgICAgICAgKiAgQGEgeCBpcyBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgbXVsdGltYXAuCisgICAgICAgKi8KKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KG11bHRpbWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aW1hcCBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJW11bHRpbWFwIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cworICAgICAgICogIGluIHRoZSBpbml0aWFsaXplciBsaXN0IEBhIGwuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICVtdWx0aW1hcCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJW11bHRpbWFwJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvLyBpdGVyYXRvcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWlyIGluIHRoZQorICAgICAgICogICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiAga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhaXIKKyAgICAgICAqICBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0bworICAgICAgICogIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0IHBhaXIgaW4KKyAgICAgICAqICB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAqICBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgbGFzdCBwYWlyIGluCisgICAgICAgKiAgdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICogIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IHBhaXIgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gb25lCisgICAgICAgKiAgYmVmb3JlIHRoZSBmaXJzdCBwYWlyIGluIHRoZSAlbXVsdGltYXAuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIGRlc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWlyCisgICAgICAgKiAgaW4gdGhlICVtdWx0aW1hcC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8KKyAgICAgICAqICB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVuZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlcgorICAgICAgICogIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIG9uZQorICAgICAgICogIGJlZm9yZSB0aGUgZmlyc3QgcGFpciBpbiB0aGUgJW11bHRpbWFwLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBkZXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eQorICAgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgJW11bHRpbWFwIGlzIGVtcHR5LiAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsgfQorCisgICAgICAvKiogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJW11bHRpbWFwLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnNpemUoKTsgfQorCisgICAgICAvKiogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAlbXVsdGltYXAuICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKworICAgICAgLy8gbW9kaWZpZXJzCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICB4ICBQYWlyIHRvIGJlIGluc2VydGVkIChzZWUgc3RkOjptYWtlX3BhaXIgZm9yIGVhc3kgY3JlYXRpb24KKyAgICAgICAqICAgICAgICAgICAgIG9mIHBhaXJzKS4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCAoa2V5LHZhbHVlKSBwYWlyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYSAoa2V5LCB2YWx1ZSkgcGFpciBpbnRvIHRoZSAlbXVsdGltYXAuCisgICAgICAgKiAgQ29udHJhcnkgdG8gYSBzdGQ6Om1hcCB0aGUgJW11bHRpbWFwIGRvZXMgbm90IHJlbHkgb24gdW5pcXVlIGtleXMgYW5kCisgICAgICAgKiAgdGh1cyBtdWx0aXBsZSBwYWlycyB3aXRoIHRoZSBzYW1lIGtleSBjYW4gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsKF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsKHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSW5zZXJ0cyBhIHN0ZDo6cGFpciBpbnRvIHRoZSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIHBhaXIgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgeCAgUGFpciB0byBiZSBpbnNlcnRlZCAoc2VlIHN0ZDo6bWFrZV9wYWlyIGZvciBlYXN5IGNyZWF0aW9uCisgICAgICAgKiAgICAgICAgICAgICBvZiBwYWlycykuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgKGtleSx2YWx1ZSkgcGFpci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGEgKGtleSwgdmFsdWUpIHBhaXIgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIENvbnRyYXJ5IHRvIGEgc3RkOjptYXAgdGhlICVtdWx0aW1hcCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZAorICAgICAgICogIHRodXMgbXVsdGlwbGUgcGFpcnMgd2l0aCB0aGUgc2FtZSBrZXkgY2FuIGJlIGluc2VydGVkLgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG9ubHkgYSBoaW50IGFuZCBjYW4gcG90ZW50aWFsbHkKKyAgICAgICAqICBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgaW5zZXJ0aW9uIHByb2Nlc3MuICBBIGJhZCBoaW50IHdvdWxkCisgICAgICAgKiAgY2F1c2Ugbm8gZ2FpbnMgaW4gZWZmaWNpZW5jeS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIG1vcmUgb24gQGEgaGludGluZywgc2VlOgorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MDdjaDE3Lmh0bWwKKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWxfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgX1BhaXImJiBfX3gpCisgICAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X2VxdWFsXyhfX3Bvc2l0aW9uLAorCQkJCSAgICAgICBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBhdHRlbXB0cyB0byBpbnNlcnQgYSByYW5nZQorICAgICAgICogIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYSBsaXN0IG9mIHN0ZDo6cGFpcnMgaW50byB0aGUgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgcGFpcnMgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBBbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAgICAgICAqICAgICAgICAgIEBhIHBvc2l0aW9uIHByaW9yIHRvIHRoZSBlbGVtZW50IGJlaW5nIGVyYXNlZC4gSWYgbm8gc3VjaCAKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhICVtdWx0aW1hcC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LAorICAgICAgICogIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorCisgICAgICAvLyBMV0cgMjA1OS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhICVtdWx0aW1hcC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LAorICAgICAgICogIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcworICAgICAgICogIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbGwgZWxlbWVudHMgbG9jYXRlZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gYQorICAgICAgICogICVtdWx0aW1hcC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5lcmFzZShfX3gpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTMwLiBBc3NvY2lhdGl2ZSBlcmFzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhIFtmaXJzdCxsYXN0KSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbHNlCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIGJlIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJW11bHRpbWFwLgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlbXVsdGltYXAuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVtdWx0aW1hcCBvZiB0aGUgc2FtZSBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZXhjaGFuZ2VzIHRoZSBlbGVtZW50cyBiZXR3ZWVuIHR3byBtdWx0aW1hcHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICAoSXQgaXMgb25seSBzd2FwcGluZyBhIHBvaW50ZXIsIGFuIGludGVnZXIsIGFuZCBhbiBpbnN0YW5jZSBvZgorICAgICAgICogIHRoZSBAYyBDb21wYXJlIHR5cGUgKHdoaWNoIGl0c2VsZiBpcyBvZnRlbiBzdGF0ZWxlc3MgYW5kIGVtcHR5KSwgc28gaXQKKyAgICAgICAqICBzaG91bGQgYmUgcXVpdGUgZmFzdC4pCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKG0xLG0yKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aW1hcCYgX194KQorICAgICAgeyBfTV90LnN3YXAoX194Ll9NX3QpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyBhbGwgZWxlbWVudHMgaW4gYSAlbXVsdGltYXAuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5CisgICAgICAgKiAgZXJhc2VzIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIKKyAgICAgICAqICBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX3QuY2xlYXIoKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnMKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdGhlIGtleSBjb21wYXJpc29uIG9iamVjdCBvdXQgb2Ygd2hpY2ggdGhlICVtdWx0aW1hcAorICAgICAgICogIHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgdmFsdWUgY29tcGFyaXNvbiBvYmplY3QsIGJ1aWx0IGZyb20gdGhlIGtleSBjb21wYXJpc29uCisgICAgICAgKiAgb2JqZWN0IG91dCBvZiB3aGljaCB0aGUgJW11bHRpbWFwIHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgICAqLworICAgICAgdmFsdWVfY29tcGFyZQorICAgICAgdmFsdWVfY29tcCgpIGNvbnN0CisgICAgICB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KKworICAgICAgLy8gbXVsdGltYXAgb3BlcmF0aW9ucworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFRyaWVzIHRvIGxvY2F0ZSBhbiBlbGVtZW50IGluIGEgJW11bHRpbWFwLgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsCisgICAgICAgKiAgICAgICAgICAgb3IgZW5kKCkgaWYgbm90IGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyICVwYWlyLiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVtdWx0aW1hcC4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlcgorICAgICAgICogICAgICAgICAgIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgY29uc3RhbnQKKyAgICAgICAqICBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyICVwYWlyLiAgSWYgdW5zdWNjZXNzZnVsIGl0CisgICAgICAgKiAgcmV0dXJucyB0aGUgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlycyB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5jb3VudChfX3gpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIChrZXksIHZhbHVlKSBwYWlyIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudCBlcXVhbCB0byBvciBncmVhdGVyCisgICAgICAgKiAgICAgICAgICAgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBhIGdyZWF0ZXIgdmFsdWUgdGhhbiBnaXZlbiBrZXkKKyAgICAgICAqICBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSBvZiAoa2V5LCB2YWx1ZSkgcGFpciB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHBvaW50aW5nIHRvIGZpcnN0IGVsZW1lbnQKKyAgICAgICAqICAgICAgICAgICBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgc3Vic2VxdWVuY2Ugb2YgZWxlbWVudHMKKyAgICAgICAqICB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGtleS4gIElmIHVuc3VjY2Vzc2Z1bCB0aGUgaXRlcmF0b3Igd2lsbCBwb2ludAorICAgICAgICogIHRvIHRoZSBuZXh0IGdyZWF0ZXN0IGVsZW1lbnQgb3IsIGlmIG5vIHN1Y2ggZ3JlYXRlciBlbGVtZW50IGV4aXN0cywgdG8KKyAgICAgICAqICBlbmQoKS4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBlbmQgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBlbmQgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXIgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciBwb2ludGluZyB0byBmaXJzdCBpdGVyYXRvcgorICAgICAgICogICAgICAgICAgIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXJzIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMgdG8gdGhlIHN1YnNlcXVlbmNlCisgICAgICAgKiAgICAgICAgICAgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjptYWtlX3BhaXIoYy5sb3dlcl9ib3VuZCh2YWwpLAorICAgICAgICogICAgICAgICAgICAgICAgICAgYy51cHBlcl9ib3VuZCh2YWwpKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKiAgKGJ1dCBpcyBmYXN0ZXIgdGhhbiBtYWtpbmcgdGhlIGNhbGxzIHNlcGFyYXRlbHkpLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgKGtleSwgdmFsdWUpIHBhaXJzIHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMKKyAgICAgICAqICAgICAgICAgICB0byB0aGUgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjptYWtlX3BhaXIoYy5sb3dlcl9ib3VuZCh2YWwpLAorICAgICAgICogICAgICAgICAgICAgICAgICAgYy51cHBlcl9ib3VuZCh2YWwpKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKiAgKGJ1dCBpcyBmYXN0ZXIgdGhhbiBtYWtpbmcgdGhlIGNhbGxzIHNlcGFyYXRlbHkpLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGltYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgIGNvbnN0IG11bHRpbWFwPF9LMSwgX1QxLCBfQzEsIF9BMT4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGltYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYsCisJCSAgY29uc3QgbXVsdGltYXA8X0sxLCBfVDEsIF9DMSwgX0ExPiYpOworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNdWx0aW1hcCBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICB4ICBBICVtdWx0aW1hcC4KKyAgICogIEBwYXJhbSAgeSAgQSAlbXVsdGltYXAgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBtYXBzIGFyZSBlcXVhbC4KKyAgICoKKyAgICogIFRoaXMgaXMgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtdWx0aW1hcHMuICBNdWx0aW1hcHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsCisgICAqICBhbmQgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKyAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fdCA9PSBfX3kuX01fdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBNdWx0aW1hcCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgeCAgQSAlbXVsdGltYXAuCisgICAqICBAcGFyYW0gIHkgIEEgJW11bHRpbWFwIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtdWx0aW1hcHMuICBUaGUgZWxlbWVudHMgbXVzdCBiZSBjb21wYXJhYmxlIHdpdGggQGMgPC4KKyAgICoKKyAgICogIFNlZSBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKCkgZm9yIGhvdyB0aGUgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcj09CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgLy8vIFNlZSBzdGQ6Om11bHRpbWFwOjpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorICAgICAgICAgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX01VTFRJTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbXVsdGlzZXQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbXVsdGlzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ4OTE2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9tdWx0aXNldC5oCkBAIC0wLDAgKzEsNzM4IEBACisvLyBNdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisvLyAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfbXVsdGlzZXQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3NldH0KKyAqLworCisjaWZuZGVmIF9TVExfTVVMVElTRVRfSAorI2RlZmluZSBfU1RMX01VTFRJU0VUX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgbWFkZSB1cCBvZiBlbGVtZW50cywgd2hpY2ggY2FuIGJlIHJldHJpZXZlZAorICAgKiAgaW4gbG9nYXJpdGhtaWMgdGltZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGFzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGFuCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OSI+YXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPiAodXNpbmcgZXF1aXZhbGVudAorICAgKiAga2V5cykuICBGb3IgYSBAYyBtdWx0aXNldDxLZXk+IHRoZSBrZXlfdHlwZSBhbmQgdmFsdWVfdHlwZSBhcmUgS2V5LgorICAgKgorICAgKiAgTXVsdGlzZXRzIHN1cHBvcnQgYmlkaXJlY3Rpb25hbCBpdGVyYXRvcnMuCisgICAqCisgICAqICBUaGUgcHJpdmF0ZSB0cmVlIGRhdGEgaXMgZGVjbGFyZWQgZXhhY3RseSB0aGUgc2FtZSB3YXkgZm9yIHNldCBhbmQKKyAgICogIG11bHRpc2V0OyB0aGUgZGlzdGluY3Rpb24gaXMgbWFkZSBlbnRpcmVseSBpbiBob3cgdGhlIHRyZWUgZnVuY3Rpb25zIGFyZQorICAgKiAgY2FsbGVkICgqX3VuaXF1ZSB2ZXJzdXMgKl9lcXVhbCwgc2FtZSBhcyB0aGUgc3RhbmRhcmQpLgorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBtdWx0aXNldAorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICAgICBfQWxsb2NfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfS2V5LCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXM0KF9Db21wYXJlLCBib29sLCBfS2V5LCBfS2V5LAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMyKF9LZXksIF9BbGxvY192YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQkKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgdHlwZWRlZiBfS2V5ICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvYyAgIGFsbG9jYXRvcl90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vLyBUaGlzIHR1cm5zIGEgcmVkLWJsYWNrIHRyZWUgaW50byBhIFttdWx0aV1zZXQuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9LZXk+OjpvdGhlciBfS2V5X2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIF9JZGVudGl0eTx2YWx1ZV90eXBlPiwKKwkJICAgICAgIGtleV9jb21wYXJlLCBfS2V5X2FsbG9jX3R5cGU+IF9SZXBfdHlwZTsKKyAgICAgIC8vLyBUaGUgYWN0dWFsIHRyZWUgc3RydWN0dXJlLgorICAgICAgX1JlcF90eXBlIF9NX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6cG9pbnRlciAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OmNvbnN0X3BvaW50ZXIgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpyZWZlcmVuY2UgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpjb25zdF9yZWZlcmVuY2UgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEwMy4gc2V0OjppdGVyYXRvciBpcyByZXF1aXJlZCB0byBiZSBtb2RpZmlhYmxlLAorICAgICAgLy8gYnV0IHRoaXMgYWxsb3dzIG1vZGlmaWNhdGlvbiBvZiBrZXlzLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgbm8gZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIG11bHRpc2V0KCkKKyAgICAgIDogX01fdCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlbXVsdGlzZXQgd2l0aCBubyBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIGNvbXAgIENvbXBhcmF0b3IgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIG11bHRpc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlbXVsdGlzZXQgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aXNldCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIFtmaXJzdCxsYXN0KS4gIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIHJhbmdlIGlzIGFscmVhZHkgc29ydGVkLAorICAgICAgICogIGFuZCBObG9nTiBvdGhlcndpc2UgKHdoZXJlIE4gaXMgZGlzdGFuY2UoZmlyc3QsbGFzdCkpLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCTogX01fdCgpCisgICAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJ1aWxkcyBhICVtdWx0aXNldCBmcm9tIGEgcmFuZ2UuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGNvbXAgIEEgY29tcGFyaXNvbiBmdW5jdG9yLgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiAgQ3JlYXRlIGEgJW11bHRpc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpLiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgcmFuZ2UgaXMgYWxyZWFkeSBzb3J0ZWQsCisgICAgICAgKiAgYW5kIE5sb2dOIG90aGVyd2lzZSAod2hlcmUgTiBpcyBkaXN0YW5jZShmaXJzdCxsYXN0KSkuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSBjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV90KF9fY29tcCwgX19hKQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGlzZXQgY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJW11bHRpc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aXNldCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QgdXNlZAorICAgICAgICogIGJ5IEBhIHguCisgICAgICAgKi8KKyAgICAgIG11bHRpc2V0KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICA6IF9NX3QoX194Ll9NX3QpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlTXVsdGlzZXQgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJW11bHRpc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVtdWx0aXNldCBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgeC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgeCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtdWx0aXNldC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQobXVsdGlzZXQmJiBfX3gpCisgICAgICA6IF9NX3Qoc3RkOjptb3ZlKF9feC5fTV90KSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQnVpbGRzIGEgJW11bHRpc2V0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBjb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVtdWx0aXNldCBjb25zaXN0aW5nIG9mIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgZnJvbQorICAgICAgICogIHRoZSBsaXN0LiAgVGhpcyBpcyBsaW5lYXIgaW4gTiBpZiB0aGUgbGlzdCBpcyBhbHJlYWR5IHNvcnRlZCwKKyAgICAgICAqICBhbmQgTmxvZ04gb3RoZXJ3aXNlICh3aGVyZSBOIGlzIEBhIGwuc2l6ZSgpKS4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01fdChfX2NvbXAsIF9fYSkKKyAgICAgIHsgX01fdC5fTV9pbnNlcnRfZXF1YWwoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVNdWx0aXNldCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlbXVsdGlzZXQgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSB4IGFyZSBjb3BpZWQsIGJ1dCB1bmxpa2UgdGhlIGNvcHkgY29uc3RydWN0b3IsCisgICAgICAgKiAgdGhlIGFsbG9jYXRvciBvYmplY3QgaXMgbm90IGNvcGllZC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJW11bHRpc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSB4IGFyZSBtb3ZlZCBpbnRvIHRoaXMgJW11bHRpc2V0ICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIHggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICVtdWx0aXNldC4KKyAgICAgICAqLworICAgICAgbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0obXVsdGlzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJU11bHRpc2V0IGxpc3QgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAlbXVsdGlzZXQgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyIGxpc3QgQGEgbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJW11bHRpc2V0IGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAlbXVsdGlzZXQncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gYWNjZXNzb3JzOgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGNvbXBhcmlzb24gb2JqZWN0LgorICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICAgICAgLy8vICBSZXR1cm5zIHRoZSBjb21wYXJpc29uIG9iamVjdC4KKyAgICAgIHZhbHVlX2NvbXBhcmUKKyAgICAgIHZhbHVlX2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgICAgICAvLy8gIFJldHVybnMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9iamVjdC4KKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgaW4gdGhlICVtdWx0aXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJW11bHRpc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBhc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QucmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgbGFzdCBlbGVtZW50IGluIHRoZSAlbXVsdGlzZXQuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBkZXNjZW5kaW5nIG9yZGVyCisgICAgICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnJlbmQoKTsgfQorI2VuZGlmCisKKyAgICAgIC8vLyAgUmV0dXJucyB0cnVlIGlmIHRoZSAlc2V0IGlzIGVtcHR5LgorICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnNpemUoKTsgfQorCisgICAgICAvLy8gIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3dhcHMgZGF0YSB3aXRoIGFub3RoZXIgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlbXVsdGlzZXQgb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gbXVsdGlzZXRzIGluIGNvbnN0YW50IHRpbWUuCisgICAgICAgKiAgKEl0IGlzIG9ubHkgc3dhcHBpbmcgYSBwb2ludGVyLCBhbiBpbnRlZ2VyLCBhbmQgYW4gaW5zdGFuY2Ugb2YgdGhlIEBjCisgICAgICAgKiAgQ29tcGFyZSB0eXBlICh3aGljaCBpdHNlbGYgaXMgb2Z0ZW4gc3RhdGVsZXNzIGFuZCBlbXB0eSksIHNvIGl0IHNob3VsZAorICAgICAgICogIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcChzMSxzMikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGlzZXQmIF9feCkKKyAgICAgIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorCisgICAgICAvLyBpbnNlcnQvZXJhc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJbnNlcnRzIGFuIGVsZW1lbnQgaW50byB0aGUgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgeCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuICBDb250cmFyeQorICAgICAgICogIHRvIGEgc3RkOjpzZXQgdGhlICVtdWx0aXNldCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzCisgICAgICAgKiAgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGVsZW1lbnQgY2FuIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbChfX3gpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWwoc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgeCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYW4gZWxlbWVudCBpbnRvIHRoZSAlbXVsdGlzZXQuICBDb250cmFyeQorICAgICAgICogIHRvIGEgc3RkOjpzZXQgdGhlICVtdWx0aXNldCBkb2VzIG5vdCByZWx5IG9uIHVuaXF1ZSBrZXlzIGFuZCB0aHVzCisgICAgICAgKiAgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGVsZW1lbnQgY2FuIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuIHBvdGVudGlhbGx5CisgICAgICAgKiAgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQgaGludCB3b3VsZAorICAgICAgICogIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKiAgZm9yIG1vcmUgb24gQGEgaGludGluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0aW9uIHJlcXVpcmVzIGxvZ2FyaXRobWljIHRpbWUgKGlmIHRoZSBoaW50IGlzIG5vdCB0YWtlbikuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5fTV9pbnNlcnRfZXF1YWxfKF9fcG9zaXRpb24sIF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Ll9NX2luc2VydF9lcXVhbF8oX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCB0cmllcyB0byBpbnNlcnQgYSByYW5nZSBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiAgQ29tcGxleGl0eSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIHJhbmdlIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX3QuX01faW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBlbGVtZW50cyBpbnRvIHRoZSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBsaXN0ICBBIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBvZiBlbGVtZW50cworICAgICAgICogICAgICAgICAgICAgICAgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIENvbXBsZXhpdHkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSByYW5nZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDEzMC4gQXNzb2NpYXRpdmUgZXJhc2Ugc2hvdWxkIHJldHVybiBhbiBpdGVyYXRvci4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYW4gZWxlbWVudCBmcm9tIGEgJW11bHRpc2V0LgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZworICAgICAgICogICAgICAgICAgQGEgcG9zaXRpb24gcHJpb3IgdG8gdGhlIGVsZW1lbnQgYmVpbmcgZXJhc2VkLiBJZiBubyBzdWNoIAorICAgICAgICogICAgICAgICAgZWxlbWVudCBleGlzdHMsIGVuZCgpIGlzIHJldHVybmVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJW11bHRpc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsCisgICAgICAgKiAgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CisjZWxzZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEVyYXNlcyBhbiBlbGVtZW50IGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJW11bHRpc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnQsCisgICAgICAgKiAgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgaXRzZWxmIGEgcG9pbnRlciwgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzCisgICAgICAgKiAgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgX01fdC5lcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBlcmFzZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZXJhc2VzIGFsbCBlbGVtZW50cyBsb2NhdGVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSBhCisgICAgICAgKiAgJW11bHRpc2V0LgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIGJlIGVyYXNlZC4KKyAgICAgICAqICBAcmV0dXJuIFRoZSBpdGVyYXRvciBAYSBsYXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdAorICAgICAgICogIHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbZmlyc3QsbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVtdWx0aXNldC4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGZyb20gYSAlbXVsdGlzZXQuCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywgdGhlIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdAorICAgICAgICogIHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MKKyAgICAgICAqICByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIGVsZW1lbnRzIGluIGEgJW11bHRpc2V0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gb25seQorICAgICAgICogIGVyYXNlcyB0aGUgZWxlbWVudHMsIGFuZCB0aGF0IGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBwb2ludGVycywKKyAgICAgICAqICB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQgaW4gYW55IHdheS4gIE1hbmFnaW5nIHRoZSBwb2ludGVyCisgICAgICAgKiAgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV90LmNsZWFyKCk7IH0KKworICAgICAgLy8gbXVsdGlzZXQgb3BlcmF0aW9uczoKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgb2YgZWxlbWVudHMgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZCBrZXkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuY291bnQoX194KTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuICBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVHJpZXMgdG8gbG9jYXRlIGFuIGVsZW1lbnQgaW4gYSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgeCAgRWxlbWVudCB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHNvdWdodC1hZnRlciBlbGVtZW50LCBvciBlbmQoKSBpZiBub3QKKyAgICAgICAqICAgICAgICAgICBmb3VuZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGtleSBhbmQgdHJpZXMgdG8gbG9jYXRlIHRoZSBlbGVtZW50IHdpdGggd2hpY2gKKyAgICAgICAqICB0aGUga2V5IG1hdGNoZXMuICBJZiBzdWNjZXNzZnVsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIHNvdWdodCBhZnRlciBlbGVtZW50LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgdGhlCisgICAgICAgKiAgcGFzdC10aGUtZW5kICggQGMgZW5kKCkgKSBpdGVyYXRvci4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGJlZ2lubmluZyBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHBvaW50aW5nIHRvIGZpcnN0IGVsZW1lbnQgZXF1YWwgdG8gb3IgZ3JlYXRlcgorICAgICAgICogICAgICAgICAgIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgc3Vic2VxdWVuY2Ugb2YgZWxlbWVudHMKKyAgICAgICAqICB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGtleS4gIElmIHVuc3VjY2Vzc2Z1bCBpdCByZXR1cm5zIGFuIGl0ZXJhdG9yCisgICAgICAgKiAgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBoYXMgYSBncmVhdGVyIHZhbHVlIHRoYW4gZ2l2ZW4ga2V5CisgICAgICAgKiAgb3IgZW5kKCkgaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIHRoZSBlbmQgb2YgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50CisgICAgICAgKiAgICAgICAgICBncmVhdGVyIHRoYW4ga2V5LCBvciBlbmQoKS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEZpbmRzIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgUGFpciBvZiBpdGVyYXRvcnMgdGhhdCBwb3NzaWJseSBwb2ludHMgdG8gdGhlIHN1YnNlcXVlbmNlCisgICAgICAgKiAgICAgICAgICAgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAqICBAY29kZQorICAgICAgICogICAgc3RkOjptYWtlX3BhaXIoYy5sb3dlcl9ib3VuZCh2YWwpLAorICAgICAgICogICAgICAgICAgICAgICAgICAgYy51cHBlcl9ib3VuZCh2YWwpKQorICAgICAgICogIEBlbmRjb2RlCisgICAgICAgKiAgKGJ1dCBpcyBmYXN0ZXIgdGhhbiBtYWtpbmcgdGhlIGNhbGxzIHNlcGFyYXRlbHkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb2JhYmx5IG9ubHkgbWFrZXMgc2Vuc2UgZm9yIG11bHRpc2V0cy4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVxdWFsX3JhbmdlKF9feCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aXNldDxfSzEsIF9DMSwgX0ExPiYsCisJCSAgIGNvbnN0IG11bHRpc2V0PF9LMSwgX0MxLCBfQTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LMSwgdHlwZW5hbWUgX0MxLCB0eXBlbmFtZSBfQTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPCAoY29uc3QgbXVsdGlzZXQ8X0sxLCBfQzEsIF9BMT4mLAorCQkgICBjb25zdCBtdWx0aXNldDxfSzEsIF9DMSwgX0ExPiYpOworICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE11bHRpc2V0IGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIHggIEEgJW11bHRpc2V0LgorICAgKiAgQHBhcmFtICB5ICBBICVtdWx0aXNldCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIG11bHRpc2V0cyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbXVsdGlzZXRzLgorICAgKiAgTXVsdGlzZXRzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLCBhbmQgaWYKKyAgICogIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgY29tcGFyZSBlcXVhbC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fdCA9PSBfX3kuX01fdDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBNdWx0aXNldCBvcmRlcmluZyByZWxhdGlvbi4KKyAgICogIEBwYXJhbSAgeCAgQSAlbXVsdGlzZXQuCisgICAqICBAcGFyYW0gIHkgIEEgJW11bHRpc2V0IG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICBtYXBzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyAgUmV0dXJucyAhKHggPT0geSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8vLyAgUmV0dXJucyB5IDwgeC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBtdWx0aXNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LF9Db21wYXJlLF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gIFJldHVybnMgISh5IDwgeCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAvLy8gIFJldHVybnMgISh4IDwgeSkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6bXVsdGlzZXQ6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1NUTF9NVUxUSVNFVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX251bWVyaWMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfbnVtZXJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmM2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX251bWVyaWMuaApAQCAtMCwwICsxLDM4NyBAQAorLy8gTnVtZXJpYyBmdW5jdGlvbnMgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorLy8gMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfbnVtZXJpYy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bnVtZXJpY30KKyAqLworCisjaWZuZGVmIF9TVExfTlVNRVJJQ19ICisjZGVmaW5lIF9TVExfTlVNRVJJQ19IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+IC8vIEZvciBfR0xJQkNYWF9NT1ZFCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIENyZWF0ZSBhIHJhbmdlIG9mIHNlcXVlbnRpYWxseSBpbmNyZWFzaW5nIHZhbHVlcy4KKyAgICoKKyAgICogIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHJhbmdlIEBwIFtmaXJzdCxsYXN0KSBhc3NpZ25zIEBwIHZhbHVlIGFuZAorICAgKiAgaW5jcmVtZW50cyBAcCB2YWx1ZSBhcyBpZiBieSBAcCArK3ZhbHVlLgorICAgKgorICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgdmFsdWUgIFN0YXJ0aW5nIHZhbHVlLgorICAgKiAgQHJldHVybiAgTm90aGluZy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgaW90YShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAgX192YWx1ZSkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9NdXRhYmxlX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcCwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwl7CisJICAqX19maXJzdCA9IF9fdmFsdWU7CisJICArK19fdmFsdWU7CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKworICAvKioKKyAgICogIEBicmllZiAgQWNjdW11bGF0ZSB2YWx1ZXMgaW4gYSByYW5nZS4KKyAgICoKKyAgICogIEFjY3VtdWxhdGVzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSB1c2luZyBvcGVyYXRvcisoKS4gIFRoZQorICAgKiAgaW5pdGlhbCB2YWx1ZSBpcyBAYSBpbml0LiAgVGhlIHZhbHVlcyBhcmUgcHJvY2Vzc2VkIGluIG9yZGVyLgorICAgKgorICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgIEVuZCBvZiByYW5nZS4KKyAgICogIEBwYXJhbSAgaW5pdCAgU3RhcnRpbmcgdmFsdWUgdG8gYWRkIG90aGVyIHZhbHVlcyB0by4KKyAgICogIEByZXR1cm4gIFRoZSBmaW5hbCBzdW0uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19pbml0ID0gX19pbml0ICsgKl9fZmlyc3Q7CisgICAgICByZXR1cm4gX19pbml0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQWNjdW11bGF0ZSB2YWx1ZXMgaW4gYSByYW5nZSB3aXRoIG9wZXJhdGlvbi4KKyAgICoKKyAgICogIEFjY3VtdWxhdGVzIHRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSB1c2luZyB0aGUgZnVuY3Rpb24KKyAgICogIG9iamVjdCBAYSBiaW5hcnlfb3AuICBUaGUgaW5pdGlhbCB2YWx1ZSBpcyBAYSBpbml0LiAgVGhlIHZhbHVlcyBhcmUKKyAgICogIHByb2Nlc3NlZCBpbiBvcmRlci4KKyAgICoKKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0ICBFbmQgb2YgcmFuZ2UuCisgICAqICBAcGFyYW0gIGluaXQgIFN0YXJ0aW5nIHZhbHVlIHRvIGFkZCBvdGhlciB2YWx1ZXMgdG8uCisgICAqICBAcGFyYW0gIGJpbmFyeV9vcCAgRnVuY3Rpb24gb2JqZWN0IHRvIGFjY3VtdWxhdGUgd2l0aC4KKyAgICogIEByZXR1cm4gIFRoZSBmaW5hbCBzdW0uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIGlubGluZSBfVHAKKyAgICBhY2N1bXVsYXRlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX1RwIF9faW5pdCwKKwkgICAgICAgX0JpbmFyeU9wZXJhdGlvbiBfX2JpbmFyeV9vcCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJX19pbml0ID0gX19iaW5hcnlfb3AoX19pbml0LCAqX19maXJzdCk7CisgICAgICByZXR1cm4gX19pbml0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgQ29tcHV0ZSBpbm5lciBwcm9kdWN0IG9mIHR3byByYW5nZXMuCisgICAqCisgICAqICBTdGFydGluZyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgQGEgaW5pdCwgbXVsdGlwbGllcyBzdWNjZXNzaXZlCisgICAqICBlbGVtZW50cyBmcm9tIHRoZSB0d28gcmFuZ2VzIGFuZCBhZGRzIGVhY2ggcHJvZHVjdCBpbnRvIHRoZSBhY2N1bXVsYXRlZAorICAgKiAgdmFsdWUgdXNpbmcgb3BlcmF0b3IrKCkuICBUaGUgdmFsdWVzIGluIHRoZSByYW5nZXMgYXJlIHByb2Nlc3NlZCBpbgorICAgKiAgb3JkZXIuCisgICAqCisgICAqICBAcGFyYW0gIGZpcnN0MSAgU3RhcnQgb2YgcmFuZ2UgMS4KKyAgICogIEBwYXJhbSAgbGFzdDEgIEVuZCBvZiByYW5nZSAxLgorICAgKiAgQHBhcmFtICBmaXJzdDIgIFN0YXJ0IG9mIHJhbmdlIDIuCisgICAqICBAcGFyYW0gIGluaXQgIFN0YXJ0aW5nIHZhbHVlIHRvIGFkZCBvdGhlciB2YWx1ZXMgdG8uCisgICAqICBAcmV0dXJuICBUaGUgZmluYWwgaW5uZXIgcHJvZHVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9UcCBfX2luaXQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IxPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3IyPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MSwgX19sYXN0MSk7CisKKyAgICAgIGZvciAoOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQorCV9faW5pdCA9IF9faW5pdCArICgqX19maXJzdDEgKiAqX19maXJzdDIpOworICAgICAgcmV0dXJuIF9faW5pdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbXB1dGUgaW5uZXIgcHJvZHVjdCBvZiB0d28gcmFuZ2VzLgorICAgKgorICAgKiAgU3RhcnRpbmcgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIEBhIGluaXQsIGFwcGxpZXMgQGEgYmluYXJ5X29wMiB0bworICAgKiAgc3VjY2Vzc2l2ZSBlbGVtZW50cyBmcm9tIHRoZSB0d28gcmFuZ2VzIGFuZCBhY2N1bXVsYXRlcyBlYWNoIHJlc3VsdCBpbnRvCisgICAqICB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgdXNpbmcgQGEgYmluYXJ5X29wMS4gIFRoZSB2YWx1ZXMgaW4gdGhlIHJhbmdlcyBhcmUKKyAgICogIHByb2Nlc3NlZCBpbiBvcmRlci4KKyAgICoKKyAgICogIEBwYXJhbSAgZmlyc3QxICBTdGFydCBvZiByYW5nZSAxLgorICAgKiAgQHBhcmFtICBsYXN0MSAgRW5kIG9mIHJhbmdlIDEuCisgICAqICBAcGFyYW0gIGZpcnN0MiAgU3RhcnQgb2YgcmFuZ2UgMi4KKyAgICogIEBwYXJhbSAgaW5pdCAgU3RhcnRpbmcgdmFsdWUgdG8gYWRkIG90aGVyIHZhbHVlcyB0by4KKyAgICogIEBwYXJhbSAgYmluYXJ5X29wMSAgRnVuY3Rpb24gb2JqZWN0IHRvIGFjY3VtdWxhdGUgd2l0aC4KKyAgICogIEBwYXJhbSAgYmluYXJ5X29wMiAgRnVuY3Rpb24gb2JqZWN0IHRvIGFwcGx5IHRvIHBhaXJzIG9mIGlucHV0IHZhbHVlcy4KKyAgICogIEByZXR1cm4gIFRoZSBmaW5hbCBpbm5lciBwcm9kdWN0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uMSwgdHlwZW5hbWUgX0JpbmFyeU9wZXJhdGlvbjI+CisgICAgaW5saW5lIF9UcAorICAgIGlubmVyX3Byb2R1Y3QoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLCBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsIF9UcCBfX2luaXQsCisJCSAgX0JpbmFyeU9wZXJhdGlvbjEgX19iaW5hcnlfb3AxLAorCQkgIF9CaW5hcnlPcGVyYXRpb24yIF9fYmluYXJ5X29wMikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjE+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcjI+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKworICAgICAgZm9yICg7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19maXJzdDEsICsrX19maXJzdDIpCisJX19pbml0ID0gX19iaW5hcnlfb3AxKF9faW5pdCwgX19iaW5hcnlfb3AyKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSk7CisgICAgICByZXR1cm4gX19pbml0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGxpc3Qgb2YgcGFydGlhbCBzdW1zCisgICAqCisgICAqICBBY2N1bXVsYXRlcyB0aGUgdmFsdWVzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgdXNpbmcgdGhlIEBjICsgb3BlcmF0b3IuCisgICAqICBBcyBlYWNoIHN1Y2Nlc3NpdmUgaW5wdXQgdmFsdWUgaXMgYWRkZWQgaW50byB0aGUgdG90YWwsIHRoYXQgcGFydGlhbCBzdW0KKyAgICogIGlzIHdyaXR0ZW4gdG8gQHAgcmVzdWx0LiAgVGhlcmVmb3JlLCB0aGUgZmlyc3QgdmFsdWUgaW4gQHAgcmVzdWx0IGlzIHRoZQorICAgKiAgZmlyc3QgdmFsdWUgb2YgdGhlIGlucHV0LCB0aGUgc2Vjb25kIHZhbHVlIGluIEBwIHJlc3VsdCBpcyB0aGUgc3VtIG9mIHRoZQorICAgKiAgZmlyc3QgYW5kIHNlY29uZCBpbnB1dCB2YWx1ZXMsIGFuZCBzbyBvbi4KKyAgICoKKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0ICBFbmQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIHJlc3VsdCAgT3V0cHV0IHRvIHdyaXRlIHN1bXMgdG8uCisgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyBqdXN0IGJleW9uZCB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gcmVzdWx0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICBwYXJ0aWFsX3N1bShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCV9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgX1ZhbHVlVHlwZTsKKworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9PdXRwdXRJdGVyYXRvckNvbmNlcHQ8X091dHB1dEl0ZXJhdG9yLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBfVmFsdWVUeXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgX1ZhbHVlVHlwZSBfX3ZhbHVlID0gKl9fZmlyc3Q7CisgICAgICAqX19yZXN1bHQgPSBfX3ZhbHVlOworICAgICAgd2hpbGUgKCsrX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgX192YWx1ZSA9IF9fdmFsdWUgKyAqX19maXJzdDsKKwkgICorK19fcmVzdWx0ID0gX192YWx1ZTsKKwl9CisgICAgICByZXR1cm4gKytfX3Jlc3VsdDsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBsaXN0IG9mIHBhcnRpYWwgc3VtcworICAgKgorICAgKiAgQWNjdW11bGF0ZXMgdGhlIHZhbHVlcyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIHVzaW5nIEBwIGJpbmFyeV9vcC4KKyAgICogIEFzIGVhY2ggc3VjY2Vzc2l2ZSBpbnB1dCB2YWx1ZSBpcyBhZGRlZCBpbnRvIHRoZSB0b3RhbCwgdGhhdCBwYXJ0aWFsIHN1bQorICAgKiAgaXMgd3JpdHRlbiB0byBAYSByZXN1bHQuICBUaGVyZWZvcmUsIHRoZSBmaXJzdCB2YWx1ZSBpbiBAcCByZXN1bHQgaXMgdGhlCisgICAqICBmaXJzdCB2YWx1ZSBvZiB0aGUgaW5wdXQsIHRoZSBzZWNvbmQgdmFsdWUgaW4gQHAgcmVzdWx0IGlzIHRoZSBzdW0gb2YgdGhlCisgICAqICBmaXJzdCBhbmQgc2Vjb25kIGlucHV0IHZhbHVlcywgYW5kIHNvIG9uLgorICAgKgorICAgKiAgQHBhcmFtICBmaXJzdCAgU3RhcnQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIGxhc3QgIEVuZCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgcmVzdWx0ICBPdXRwdXQgdG8gd3JpdGUgc3VtcyB0by4KKyAgICogIEBwYXJhbSAgYmluYXJ5X29wICBGdW5jdGlvbiBvYmplY3QuCisgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyBqdXN0IGJleW9uZCB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gcmVzdWx0LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfQmluYXJ5T3BlcmF0aW9uPgorICAgIF9PdXRwdXRJdGVyYXRvcgorICAgIHBhcnRpYWxfc3VtKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LCBfQmluYXJ5T3BlcmF0aW9uIF9fYmluYXJ5X29wKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6dmFsdWVfdHlwZSBfVmFsdWVUeXBlOworCisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgIF9WYWx1ZVR5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICBfVmFsdWVUeXBlIF9fdmFsdWUgPSAqX19maXJzdDsKKyAgICAgICpfX3Jlc3VsdCA9IF9fdmFsdWU7CisgICAgICB3aGlsZSAoKytfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICBfX3ZhbHVlID0gX19iaW5hcnlfb3AoX192YWx1ZSwgKl9fZmlyc3QpOworCSAgKisrX19yZXN1bHQgPSBfX3ZhbHVlOworCX0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGRpZmZlcmVuY2VzIGJldHdlZW4gYWRqYWNlbnQgdmFsdWVzLgorICAgKgorICAgKiAgQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGphY2VudCB2YWx1ZXMgaW4gdGhlIHJhbmdlCisgICAqICBbZmlyc3QsbGFzdCkgdXNpbmcgb3BlcmF0b3ItKCkgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIEBhIHJlc3VsdC4KKyAgICoKKyAgICogIEBwYXJhbSAgZmlyc3QgIFN0YXJ0IG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICBsYXN0ICBFbmQgb2YgaW5wdXQgcmFuZ2UuCisgICAqICBAcGFyYW0gIHJlc3VsdCAgT3V0cHV0IHRvIHdyaXRlIHN1bXMgdG8uCisgICAqICBAcmV0dXJuICBJdGVyYXRvciBwb2ludGluZyBqdXN0IGJleW9uZCB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gcmVzdWx0LgorICAgKgorICAgKiAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgKiAgRFIgNTM5LiBwYXJ0aWFsX3N1bSBhbmQgYWRqYWNlbnRfZGlmZmVyZW5jZSBzaG91bGQgbWVudGlvbiByZXF1aXJlbWVudHMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIF9WYWx1ZVR5cGUgX190bXAgPSAqX19maXJzdDsKKwkgICorK19fcmVzdWx0ID0gX190bXAgLSBfX3ZhbHVlOworCSAgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoX190bXApOworCX0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGRpZmZlcmVuY2VzIGJldHdlZW4gYWRqYWNlbnQgdmFsdWVzLgorICAgKgorICAgKiAgQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGphY2VudCB2YWx1ZXMgaW4gdGhlIHJhbmdlCisgICAqICBbZmlyc3QsbGFzdCkgdXNpbmcgdGhlIGZ1bmN0aW9uIG9iamVjdCBAYSBiaW5hcnlfb3AgYW5kIHdyaXRlcyB0aGUKKyAgICogIHJlc3VsdCB0byBAYSByZXN1bHQuCisgICAqCisgICAqICBAcGFyYW0gIGZpcnN0ICBTdGFydCBvZiBpbnB1dCByYW5nZS4KKyAgICogIEBwYXJhbSAgbGFzdCAgRW5kIG9mIGlucHV0IHJhbmdlLgorICAgKiAgQHBhcmFtICByZXN1bHQgIE91dHB1dCB0byB3cml0ZSBzdW1zIHRvLgorICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcganVzdCBiZXlvbmQgdGhlIHZhbHVlcyB3cml0dGVuIHRvIHJlc3VsdC4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICogIERSIDUzOS4gcGFydGlhbF9zdW0gYW5kIGFkamFjZW50X2RpZmZlcmVuY2Ugc2hvdWxkIG1lbnRpb24gcmVxdWlyZW1lbnRzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9CaW5hcnlPcGVyYXRpb24+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgYWRqYWNlbnRfZGlmZmVyZW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQlfT3V0cHV0SXRlcmF0b3IgX19yZXN1bHQsIF9CaW5hcnlPcGVyYXRpb24gX19iaW5hcnlfb3ApCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlIF9WYWx1ZVR5cGU7CisKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgX1ZhbHVlVHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICAgIF9WYWx1ZVR5cGUgX192YWx1ZSA9ICpfX2ZpcnN0OworICAgICAgKl9fcmVzdWx0ID0gX192YWx1ZTsKKyAgICAgIHdoaWxlICgrK19fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgIF9WYWx1ZVR5cGUgX190bXAgPSAqX19maXJzdDsKKwkgICorK19fcmVzdWx0ID0gX19iaW5hcnlfb3AoX190bXAsIF9fdmFsdWUpOworCSAgX192YWx1ZSA9IF9HTElCQ1hYX01PVkUoX190bXApOworCX0KKyAgICAgIHJldHVybiArK19fcmVzdWx0OworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfTlVNRVJJQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3BhaXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfcGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTM3YjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3BhaXIuaApAQCAtMCwwICsxLDI3OSBAQAorLy8gUGFpciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9wYWlyLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt1dGlsaXR5fQorICovCisKKyNpZm5kZWYgX1NUTF9QQUlSX0gKKyNkZWZpbmUgX1NUTF9QQUlSX0ggMQorCisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+IC8vIGZvciBzdGQ6Om1vdmUgLyBzdGQ6OmZvcndhcmQsIGFuZCBzdGQ6OnN3YXAKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+IC8vIGZvciBzdGQ6Ol9fZGVjYXlfYW5kX3N0cmlwIHRvbworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vLyBwaWVjZXdpc2VfY29uc3RydWN0X3QKKyAgc3RydWN0IHBpZWNld2lzZV9jb25zdHJ1Y3RfdCB7IH07CisKKyAgLy8vIHBpZWNld2lzZV9jb25zdHJ1Y3QKKyAgY29uc3RleHByIHBpZWNld2lzZV9jb25zdHJ1Y3RfdCBwaWVjZXdpc2VfY29uc3RydWN0ID0gcGllY2V3aXNlX2NvbnN0cnVjdF90KCk7CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uPgorICAgIGNsYXNzIHR1cGxlOworCisgIHRlbXBsYXRlPGludC4uLj4KKyAgICBzdHJ1Y3QgX0luZGV4X3R1cGxlOworI2VuZGlmCisKKyAgLy8vIFN0cnVjdCBob2xkaW5nIHR3byBvYmplY3RzIG9mIGFyYml0cmFyeSB0eXBlLgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBzdHJ1Y3QgcGFpcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1QxIGZpcnN0X3R5cGU7ICAgIC8vLyBAYyBmaXJzdF90eXBlIGlzIHRoZSBmaXJzdCBib3VuZCB0eXBlCisgICAgICB0eXBlZGVmIF9UMiBzZWNvbmRfdHlwZTsgICAvLy8gQGMgc2Vjb25kX3R5cGUgaXMgdGhlIHNlY29uZCBib3VuZCB0eXBlCisKKyAgICAgIF9UMSBmaXJzdDsgICAgICAgICAgICAgICAgIC8vLyBAYyBmaXJzdCBpcyBhIGNvcHkgb2YgdGhlIGZpcnN0IG9iamVjdAorICAgICAgX1QyIHNlY29uZDsgICAgICAgICAgICAgICAgLy8vIEBjIHNlY29uZCBpcyBhIGNvcHkgb2YgdGhlIHNlY29uZCBvYmplY3QKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjY1LiAgc3RkOjpwYWlyOjpwYWlyKCkgZWZmZWN0cyBvdmVybHkgcmVzdHJpY3RpdmUKKyAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIEBjIGZpcnN0IGFuZCBAYyBzZWNvbmQgdXNpbmcgdGhlaXIKKyAgICAgICAqICByZXNwZWN0aXZlIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgKi8KKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBwYWlyKCkKKyAgICAgIDogZmlyc3QoKSwgc2Vjb25kKCkgeyB9CisKKyAgICAgIC8qKiBUd28gb2JqZWN0cyBtYXkgYmUgcGFzc2VkIHRvIGEgQGMgcGFpciBjb25zdHJ1Y3RvciB0byBiZSBjb3BpZWQuICAqLworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIHBhaXIoY29uc3QgX1QxJiBfX2EsIGNvbnN0IF9UMiYgX19iKQorICAgICAgOiBmaXJzdChfX2EpLCBzZWNvbmQoX19iKSB7IH0KKworICAgICAgLyoqIFRoZXJlIGlzIGFsc28gYSB0ZW1wbGF0ZWQgY29weSBjdG9yIGZvciB0aGUgQGMgcGFpciBjbGFzcyBpdHNlbGYuICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisJX0dMSUJDWFhfQ09OU1RFWFBSIHBhaXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkKKwk6IGZpcnN0KF9fcC5maXJzdCksIHNlY29uZChfX3Auc2Vjb25kKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBjb25zdGV4cHIgcGFpcihjb25zdCBwYWlyJikgPSBkZWZhdWx0OworCisgICAgICAvLyBJbXBsaWNpdC4KKyAgICAgIC8vIHBhaXIocGFpciYmKSA9IGRlZmF1bHQ7CisKKyAgICAgIC8vIERSIDgxMS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9VMSwgX1QxPjo6dmFsdWU+Ojp0eXBlPgorCXBhaXIoX1UxJiYgX194LCBjb25zdCBfVDImIF9feSkKKwk6IGZpcnN0KHN0ZDo6Zm9yd2FyZDxfVTE+KF9feCkpLCBzZWNvbmQoX195KSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UyLCBjbGFzcyA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1UyLCBfVDI+Ojp2YWx1ZT46OnR5cGU+CisJcGFpcihjb25zdCBfVDEmIF9feCwgX1UyJiYgX195KQorCTogZmlyc3QoX194KSwgc2Vjb25kKHN0ZDo6Zm9yd2FyZDxfVTI+KF9feSkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMiwgY2xhc3MgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9VMSwgX1QxPjo6dmFsdWUKKwkJCSAgICAgICYmIHN0ZDo6aXNfY29udmVydGlibGU8X1UyLCBfVDI+Ojp2YWx1ZT46OnR5cGU+CisJcGFpcihfVTEmJiBfX3gsIF9VMiYmIF9feSkKKwk6IGZpcnN0KHN0ZDo6Zm9yd2FyZDxfVTE+KF9feCkpLCBzZWNvbmQoc3RkOjpmb3J3YXJkPF9VMj4oX195KSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgorCXBhaXIocGFpcjxfVTEsIF9VMj4mJiBfX3ApCisJOiBmaXJzdChzdGQ6OmZvcndhcmQ8X1UxPihfX3AuZmlyc3QpKSwKKwkgIHNlY29uZChzdGQ6OmZvcndhcmQ8X1UyPihfX3Auc2Vjb25kKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzLi4uIF9BcmdzMSwgY2xhc3MuLi4gX0FyZ3MyPgorCXBhaXIocGllY2V3aXNlX2NvbnN0cnVjdF90LAorCSAgICAgdHVwbGU8X0FyZ3MxLi4uPiBfX2ZpcnN0LCB0dXBsZTxfQXJnczIuLi4+IF9fc2Vjb25kKQorCTogZmlyc3QoX19jb25zPGZpcnN0X3R5cGU+KHN0ZDo6bW92ZShfX2ZpcnN0KSkpLAorCSAgc2Vjb25kKF9fY29uczxzZWNvbmRfdHlwZT4oc3RkOjptb3ZlKF9fc2Vjb25kKSkpIHsgfQorCisgICAgICBwYWlyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHBhaXImIF9fcCkKKyAgICAgIHsKKwlmaXJzdCA9IF9fcC5maXJzdDsKKwlzZWNvbmQgPSBfX3Auc2Vjb25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcGFpciYKKyAgICAgIG9wZXJhdG9yPShwYWlyJiYgX19wKQorICAgICAgeworCWZpcnN0ID0gc3RkOjptb3ZlKF9fcC5maXJzdCk7CisJc2Vjb25kID0gc3RkOjptb3ZlKF9fcC5zZWNvbmQpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisJcGFpciYKKwlvcGVyYXRvcj0oY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkKKwl7CisJICBmaXJzdCA9IF9fcC5maXJzdDsKKwkgIHNlY29uZCA9IF9fcC5zZWNvbmQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4KKwlwYWlyJgorCW9wZXJhdG9yPShwYWlyPF9VMSwgX1UyPiYmIF9fcCkKKwl7CisJICBmaXJzdCA9IHN0ZDo6bW92ZShfX3AuZmlyc3QpOworCSAgc2Vjb25kID0gc3RkOjptb3ZlKF9fcC5zZWNvbmQpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdm9pZAorICAgICAgc3dhcChwYWlyJiBfX3ApCisgICAgICB7CisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAoZmlyc3QsIF9fcC5maXJzdCk7CisJc3dhcChzZWNvbmQsIF9fcC5zZWNvbmQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisJc3RhdGljIF9UcAorCV9fY29ucyh0dXBsZTxfQXJncy4uLj4mJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwlzdGF0aWMgX1RwCisJX19kb19jb25zKHR1cGxlPF9BcmdzLi4uPiYmLCBjb25zdCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+Jik7CisjZW5kaWYKKyAgICB9OworCisgIC8vLyBUd28gcGFpcnMgb2YgdGhlIHNhbWUgdHlwZSBhcmUgZXF1YWwgaWZmIHRoZWlyIG1lbWJlcnMgYXJlIGVxdWFsLgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmZpcnN0ID09IF9feS5maXJzdCAmJiBfX3guc2Vjb25kID09IF9feS5zZWNvbmQ7IH0KKworICAvLy8gPGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvdXRpbGl0aWVzLmh0bWw+CisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5maXJzdCA8IF9feS5maXJzdAorCSAgICAgfHwgKCEoX195LmZpcnN0IDwgX194LmZpcnN0KSAmJiBfX3guc2Vjb25kIDwgX195LnNlY29uZCk7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcj09IHRvIGZpbmQgdGhlIHJlc3VsdC4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcjwgdG8gZmluZCB0aGUgcmVzdWx0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAvLy8gVXNlcyBAYyBvcGVyYXRvcjwgdG8gZmluZCB0aGUgcmVzdWx0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3gsIGNvbnN0IHBhaXI8X1QxLCBfVDI+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vIFVzZXMgQGMgb3BlcmF0b3I8IHRvIGZpbmQgdGhlIHJlc3VsdC4KKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgLy8vIFNlZSBzdGQ6OnBhaXI6OnN3YXAoKS4KKyAgLy8gTm90ZTogIG5vIHN0ZDo6c3dhcCBvdmVybG9hZHMgaW4gQysrMDMgbW9kZSwgdGhpcyBoYXMgcGVyZm9ybWFuY2UKKyAgLy8gICAgICAgIGltcGxpY2F0aW9ucywgc2VlLCBlZywgbGlic3RkYysrLzM4NDY2LgorICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAocGFpcjxfVDEsIF9UMj4mIF9feCwgcGFpcjxfVDEsIF9UMj4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKyNlbmRpZgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgY29udmVuaWVuY2Ugd3JhcHBlciBmb3IgY3JlYXRpbmcgYSBwYWlyIGZyb20gdHdvIG9iamVjdHMuCisgICAqICBAcGFyYW0gIHggIFRoZSBmaXJzdCBvYmplY3QuCisgICAqICBAcGFyYW0gIHkgIFRoZSBzZWNvbmQgb2JqZWN0LgorICAgKiAgQHJldHVybiAgIEEgbmV3bHktY29uc3RydWN0ZWQgcGFpcjw+IG9iamVjdCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KKyAgICoKKyAgICogIFRoZSBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IHRoZSBvYmplY3RzIGJlIHBhc3NlZCBieSByZWZlcmVuY2UtdG8tY29uc3QsCisgICAqICBidXQgTFdHIGlzc3VlICMxODEgc2F5cyB0aGV5IHNob3VsZCBiZSBwYXNzZWQgYnkgY29uc3QgdmFsdWUuICBXZSBmb2xsb3cKKyAgICogIHRoZSBMV0cgYnkgZGVmYXVsdC4KKyAgICovCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMTgxLiAgbWFrZV9wYWlyKCkgdW5pbnRlbmRlZCBiZWhhdmlvcgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vIE5COiBEUiA3MDYuCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIGlubGluZSBwYWlyPHR5cGVuYW1lIF9fZGVjYXlfYW5kX3N0cmlwPF9UMT46Ol9fdHlwZSwKKwkJdHlwZW5hbWUgX19kZWNheV9hbmRfc3RyaXA8X1QyPjo6X190eXBlPgorICAgIG1ha2VfcGFpcihfVDEmJiBfX3gsIF9UMiYmIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZGVjYXlfYW5kX3N0cmlwPF9UMT46Ol9fdHlwZSBfX2RzX3R5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfVDI+OjpfX3R5cGUgX19kc190eXBlMjsKKyAgICAgIHR5cGVkZWYgcGFpcjxfX2RzX3R5cGUxLCBfX2RzX3R5cGUyPiAJICAgICAgX19wYWlyX3R5cGU7CisgICAgICByZXR1cm4gX19wYWlyX3R5cGUoc3RkOjpmb3J3YXJkPF9UMT4oX194KSwgc3RkOjpmb3J3YXJkPF9UMj4oX195KSk7CisgICAgfQorI2Vsc2UKKyAgdGVtcGxhdGU8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CisgICAgaW5saW5lIHBhaXI8X1QxLCBfVDI+CisgICAgbWFrZV9wYWlyKF9UMSBfX3gsIF9UMiBfX3kpCisgICAgeyByZXR1cm4gcGFpcjxfVDEsIF9UMj4oX194LCBfX3kpOyB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9QQUlSX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfcXVldWUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjIwMDcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9xdWV1ZS5oCkBAIC0wLDAgKzEsNTU5IEBACisvLyBRdWV1ZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksCisvLyAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfcXVldWUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3F1ZXVlfQorICovCisKKyNpZm5kZWYgX1NUTF9RVUVVRV9ICisjZGVmaW5lIF9TVExfUVVFVUVfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEEgc3RhbmRhcmQgY29udGFpbmVyIGdpdmluZyBGSUZPIGJlaGF2aW9yLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBNZWV0cyBtYW55IG9mIHRoZSByZXF1aXJlbWVudHMgb2YgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sCisgICAqICBidXQgZG9lcyBub3QgZGVmaW5lIGFueXRoaW5nIHRvIGRvIHdpdGggaXRlcmF0b3JzLiAgVmVyeSBmZXcgb2YgdGhlCisgICAqICBvdGhlciBzdGFuZGFyZCBjb250YWluZXIgaW50ZXJmYWNlcyBhcmUgZGVmaW5lZC4KKyAgICoKKyAgICogIFRoaXMgaXMgbm90IGEgdHJ1ZSBjb250YWluZXIsIGJ1dCBhbiBAZSBhZGFwdG9yLiAgSXQgaG9sZHMgYW5vdGhlcgorICAgKiAgY29udGFpbmVyLCBhbmQgcHJvdmlkZXMgYSB3cmFwcGVyIGludGVyZmFjZSB0byB0aGF0IGNvbnRhaW5lci4gIFRoZQorICAgKiAgd3JhcHBlciBpcyB3aGF0IGVuZm9yY2VzIHN0cmljdCBmaXJzdC1pbi1maXJzdC1vdXQgJXF1ZXVlIGJlaGF2aW9yLgorICAgKgorICAgKiAgVGhlIHNlY29uZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZworICAgKiAgc2VxdWVuY2UvY29udGFpbmVyLiAgSXQgZGVmYXVsdHMgdG8gc3RkOjpkZXF1ZSwgYnV0IGl0IGNhbiBiZSBhbnkgdHlwZQorICAgKiAgdGhhdCBzdXBwb3J0cyBAYyBmcm9udCwgQGMgYmFjaywgQGMgcHVzaF9iYWNrLCBhbmQgQGMgcG9wX2Zyb250LAorICAgKiAgc3VjaCBhcyBzdGQ6Omxpc3Qgb3IgYW4gYXBwcm9wcmlhdGUgdXNlci1kZWZpbmVkIHR5cGUuCisgICAqCisgICAqICBNZW1iZXJzIG5vdCBmb3VuZCBpbiBAYSBub3JtYWwgY29udGFpbmVycyBhcmUgQGMgY29udGFpbmVyX3R5cGUsCisgICAqICB3aGljaCBpcyBhIHR5cGVkZWYgZm9yIHRoZSBzZWNvbmQgU2VxdWVuY2UgcGFyYW1ldGVyLCBhbmQgQGMgcHVzaCBhbmQKKyAgICogIEBjIHBvcCwgd2hpY2ggYXJlIHN0YW5kYXJkICVxdWV1ZS9GSUZPIG9wZXJhdGlvbnMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlID0gZGVxdWU8X1RwPiA+CisgICAgY2xhc3MgcXVldWUKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgX1NlcXVlbmNlX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfRnJvbnRJbnNlcnRpb25TZXF1ZW5jZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfQmFja0luc2VydGlvblNlcXVlbmNlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfU2VxdWVuY2VfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1NlcTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+JiwgY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9TZXExPgorICAgICAgICBmcmllbmQgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+JiwgY29uc3QgcXVldWU8X1RwMSwgX1NlcTE+Jik7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvKioKKyAgICAgICAqICAnYycgaXMgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyLiAgTWFpbnRhaW5lcnMgd29uZGVyaW5nIHdoeQorICAgICAgICogIHRoaXMgaXNuJ3QgdWdsaWZpZWQgYXMgcGVyIHN0eWxlIGd1aWRlbGluZXMgc2hvdWxkIG5vdGUgdGhhdAorICAgICAgICogIHRoaXMgbmFtZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLCBbMjMuMi4zLjFdLiAgKFdoeT8KKyAgICAgICAqICBQcmVzdW1hYmx5IGZvciB0aGUgc2FtZSByZWFzb24gdGhhdCBpdCdzIHByb3RlY3RlZCBpbnN0ZWFkCisgICAgICAgKiAgb2YgcHJpdmF0ZTogdG8gYWxsb3cgZGVyaXZhdGlvbi4gIEJ1dCBub25lIG9mIHRoZSBvdGhlcgorICAgICAgICogIGNvbnRhaW5lcnMgYWxsb3cgZm9yIGRlcml2YXRpb24uICBPZGQuKQorICAgICAgICovCisgICAgICBfU2VxdWVuY2UgYzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleHBsaWNpdAorICAgICAgcXVldWUoY29uc3QgX1NlcXVlbmNlJiBfX2MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhfX2MpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBxdWV1ZShjb25zdCBfU2VxdWVuY2UmIF9fYykKKyAgICAgIDogYyhfX2MpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgcXVldWUoX1NlcXVlbmNlJiYgX19jID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoc3RkOjptb3ZlKF9fYykpIHsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXF1ZXVlIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLmVtcHR5KCk7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICVxdWV1ZS4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXJldHVybiBjLmZyb250KCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5iYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlICVxdWV1ZS4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVxdWV1ZSBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgJXF1ZXVlIGFuZCBhc3NpZ25zIHRoZSBnaXZlbiBkYXRhCisgICAgICAgKiAgdG8gaXQuICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgICAgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soX194KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHB1c2godmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyBjLmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVxdWV1ZSBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlcXVldWUgYnkgb25lLgorICAgICAgICogIFRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhlIG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nCisgICAgICAgKiAgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGZpcnN0IGVsZW1lbnQncworICAgICAgICogIGRhdGEgaXMgbmVlZGVkLCBpdCBzaG91bGQgYmUgcmV0cmlldmVkIGJlZm9yZSBwb3AoKSBpcworICAgICAgICogIGNhbGxlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcG9wKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwljLnBvcF9mcm9udCgpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocXVldWUmIF9fcSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChjLCBfX3EuYyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBRdWV1ZSBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICB4ICBBICVxdWV1ZS4KKyAgICogIEBwYXJhbSAgeSAgQSAlcXVldWUgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBxdWV1ZXMgYXJlIGVxdWFsLgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gIENvbXBsZXhpdHkgYW5kIHNlbWFudGljcyBkZXBlbmQgb24gdGhlCisgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlIHR5cGUsIGJ1dCB0aGUgZXhwZWN0ZWQgcnVsZXMgYXJlOiAgdGhpcyByZWxhdGlvbiBpcworICAgKiAgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZSBzZXF1ZW5jZXMsIGFuZCBxdWV1ZXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAorICAgKiAgaWYgdGhlaXIgc2VxdWVuY2VzIGNvbXBhcmUgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX194LCBjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmMgPT0gX195LmM7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUXVldWUgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIHggIEEgJXF1ZXVlLgorICAgKiAgQHBhcmFtICB5ICBBICVxdWV1ZSBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSB5LgorICAgKgorICAgKiAgVGhpcyBpcyBhbiB0b3RhbCBvcmRlcmluZyByZWxhdGlvbi4gIENvbXBsZXhpdHkgYW5kIHNlbWFudGljcworICAgKiAgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHR5cGUsIGJ1dCB0aGUgZXhwZWN0ZWQgcnVsZXMKKyAgICogIGFyZTogdGhpcyByZWxhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIHNlcXVlbmNlcywgdGhlCisgICAqICBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LCBhbmQKKyAgICogIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBpcyB1c3VhbGx5IHVzZWQgdG8gbWFrZSB0aGUKKyAgICogIGRldGVybWluYXRpb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYyA8IF9feS5jOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX194LCBjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feCwgY29uc3QgcXVldWU8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHF1ZXVlPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAocXVldWU8X1RwLCBfU2VxPiYgX194LCBxdWV1ZTxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHF1ZXVlPF9UcCwgX1NlcT4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB1c2VzX2FsbG9jYXRvcjxfU2VxLCBfQWxsb2M+Ojp0eXBlIHsgfTsKKyNlbmRpZgorCisgIC8qKgorICAgKiAgQGJyaWVmICBBIHN0YW5kYXJkIGNvbnRhaW5lciBhdXRvbWF0aWNhbGx5IHNvcnRpbmcgaXRzIGNvbnRlbnRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBUaGlzIGlzIG5vdCBhIHRydWUgY29udGFpbmVyLCBidXQgYW4gQGUgYWRhcHRvci4gIEl0IGhvbGRzCisgICAqICBhbm90aGVyIGNvbnRhaW5lciwgYW5kIHByb3ZpZGVzIGEgd3JhcHBlciBpbnRlcmZhY2UgdG8gdGhhdAorICAgKiAgY29udGFpbmVyLiAgVGhlIHdyYXBwZXIgaXMgd2hhdCBlbmZvcmNlcyBwcmlvcml0eS1iYXNlZCBzb3J0aW5nIAorICAgKiAgYW5kICVxdWV1ZSBiZWhhdmlvci4gIFZlcnkgZmV3IG9mIHRoZSBzdGFuZGFyZCBjb250YWluZXIvc2VxdWVuY2UKKyAgICogIGludGVyZmFjZSByZXF1aXJlbWVudHMgYXJlIG1ldCAoZS5nLiwgaXRlcmF0b3JzKS4KKyAgICoKKyAgICogIFRoZSBzZWNvbmQgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcKKyAgICogIHNlcXVlbmNlL2NvbnRhaW5lci4gIEl0IGRlZmF1bHRzIHRvIHN0ZDo6dmVjdG9yLCBidXQgaXQgY2FuIGJlCisgICAqICBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIEBjIGZyb250KCksIEBjIHB1c2hfYmFjaywgQGMgcG9wX2JhY2ssCisgICAqICBhbmQgcmFuZG9tLWFjY2VzcyBpdGVyYXRvcnMsIHN1Y2ggYXMgc3RkOjpkZXF1ZSBvciBhbgorICAgKiAgYXBwcm9wcmlhdGUgdXNlci1kZWZpbmVkIHR5cGUuCisgICAqCisgICAqICBUaGUgdGhpcmQgdGVtcGxhdGUgcGFyYW1ldGVyIHN1cHBsaWVzIHRoZSBtZWFucyBvZiBtYWtpbmcKKyAgICogIHByaW9yaXR5IGNvbXBhcmlzb25zLiAgSXQgZGVmYXVsdHMgdG8gQGMgbGVzczx2YWx1ZV90eXBlPiBidXQKKyAgICogIGNhbiBiZSBhbnl0aGluZyBkZWZpbmluZyBhIHN0cmljdCB3ZWFrIG9yZGVyaW5nLgorICAgKgorICAgKiAgTWVtYmVycyBub3QgZm91bmQgaW4gQGEgbm9ybWFsIGNvbnRhaW5lcnMgYXJlIEBjIGNvbnRhaW5lcl90eXBlLAorICAgKiAgd2hpY2ggaXMgYSB0eXBlZGVmIGZvciB0aGUgc2Vjb25kIFNlcXVlbmNlIHBhcmFtZXRlciwgYW5kIEBjCisgICAqICBwdXNoLCBAYyBwb3AsIGFuZCBAYyB0b3AsIHdoaWNoIGFyZSBzdGFuZGFyZCAlcXVldWUgb3BlcmF0aW9ucy4KKyAgICoKKyAgICogIEBub3RlIE5vIGVxdWFsaXR5L2NvbXBhcmlzb24gb3BlcmF0b3JzIGFyZSBwcm92aWRlZCBmb3IKKyAgICogICVwcmlvcml0eV9xdWV1ZS4KKyAgICoKKyAgICogIEBub3RlIFNvcnRpbmcgb2YgdGhlIGVsZW1lbnRzIHRha2VzIHBsYWNlIGFzIHRoZXkgYXJlIGFkZGVkIHRvLAorICAgKiAgYW5kIHJlbW92ZWQgZnJvbSwgdGhlICVwcmlvcml0eV9xdWV1ZSB1c2luZyB0aGUKKyAgICogICVwcmlvcml0eV9xdWV1ZSdzIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgYWNjZXNzIHRoZSBlbGVtZW50cworICAgKiAgYnkgb3RoZXIgbWVhbnMsIGFuZCBjaGFuZ2UgdGhlaXIgZGF0YSBzdWNoIHRoYXQgdGhlIHNvcnRpbmcKKyAgICogIG9yZGVyIHdvdWxkIGJlIGRpZmZlcmVudCwgdGhlICVwcmlvcml0eV9xdWV1ZSB3aWxsIG5vdCByZS1zb3J0CisgICAqICB0aGUgZWxlbWVudHMgZm9yIHlvdS4gIChIb3cgY291bGQgaXQga25vdyB0byBkbyBzbz8pCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlID0gdmVjdG9yPF9UcD4sCisJICAgdHlwZW5hbWUgX0NvbXBhcmUgID0gbGVzczx0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGU+ID4KKyAgICBjbGFzcyBwcmlvcml0eV9xdWV1ZQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSBfU2VxdWVuY2VfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfU2VxdWVuY2UsIF9TZXF1ZW5jZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1NlcXVlbmNlLCBfUmFuZG9tQWNjZXNzQ29udGFpbmVyQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfU2VxdWVuY2VfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczQoX0NvbXBhcmUsIGJvb2wsIF9UcCwgX1RwLAorCQkJCV9CaW5hcnlGdW5jdGlvbkNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiAgICAgICAgICBfU2VxdWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyAgU2VlIHF1ZXVlOjpjIGZvciBub3RlcyBvbiB0aGVzZSBuYW1lcy4KKyAgICAgIF9TZXF1ZW5jZSAgYzsKKyAgICAgIF9Db21wYXJlICAgY29tcDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIG5vIGVsZW1lbnRzLgorICAgICAgICovCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleHBsaWNpdAorICAgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgX0NvbXBhcmUmIF9feCA9IF9Db21wYXJlKCksCisJCSAgICAgY29uc3QgX1NlcXVlbmNlJiBfX3MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhfX3MpLCBjb21wKF9feCkKKyAgICAgIHsgc3RkOjptYWtlX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBfQ29tcGFyZSYgX194LAorCQkgICAgIGNvbnN0IF9TZXF1ZW5jZSYgX19zKQorICAgICAgOiBjKF9fcyksIGNvbXAoX194KQorICAgICAgeyBzdGQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBfQ29tcGFyZSYgX194ID0gX0NvbXBhcmUoKSwKKwkJICAgICBfU2VxdWVuY2UmJiBfX3MgPSBfU2VxdWVuY2UoKSkKKyAgICAgIDogYyhzdGQ6Om1vdmUoX19zKSksIGNvbXAoX194KQorICAgICAgeyBzdGQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlcXVldWUgZnJvbSBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBIGNvbXBhcmlzb24gZnVuY3RvciBkZXNjcmliaW5nIGEgc3RyaWN0IHdlYWsgb3JkZXJpbmcuCisgICAgICAgKiAgQHBhcmFtICBzICBBbiBpbml0aWFsIHNlcXVlbmNlIHdpdGggd2hpY2ggdG8gc3RhcnQuCisgICAgICAgKgorICAgICAgICogIEJlZ2lucyBieSBjb3B5aW5nIEBhIHMsIGluc2VydGluZyBhIGNvcHkgb2YgdGhlIGVsZW1lbnRzCisgICAgICAgKiAgZnJvbSBAYSBbZmlyc3QsbGFzdCkgaW50byB0aGUgY29weSBvZiBAYSBzLCB0aGVuIG9yZGVyaW5nCisgICAgICAgKiAgdGhlIGNvcHkgYWNjb3JkaW5nIHRvIEBhIHguCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZ1bmN0aW9uIG9iamVjdHMsIHNlZSB0aGUKKyAgICAgICAqICBkb2N1bWVudGF0aW9uIG9uIEBsaW5rIGZ1bmN0b3JzIGZ1bmN0b3IgYmFzZQorICAgICAgICogIGNsYXNzZXNAZW5kbGluay4KKyAgICAgICAqLworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3ggPSBfQ29tcGFyZSgpLAorCQkgICAgICAgY29uc3QgX1NlcXVlbmNlJiBfX3MgPSBfU2VxdWVuY2UoKSkKKwk6IGMoX19zKSwgY29tcChfX3gpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKwkgIHN0ZDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorI2Vsc2UKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBwcmlvcml0eV9xdWV1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgICBjb25zdCBfQ29tcGFyZSYgX194LAorCQkgICAgICAgY29uc3QgX1NlcXVlbmNlJiBfX3MpCisJOiBjKF9fcyksIGNvbXAoX194KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIGMuaW5zZXJ0KGMuZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisJICBzdGQ6Om1ha2VfaGVhcChjLmJlZ2luKCksIGMuZW5kKCksIGNvbXApOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHByaW9yaXR5X3F1ZXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX3ggPSBfQ29tcGFyZSgpLAorCQkgICAgICAgX1NlcXVlbmNlJiYgX19zID0gX1NlcXVlbmNlKCkpCisJOiBjKHN0ZDo6bW92ZShfX3MpKSwgY29tcChfX3gpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgYy5pbnNlcnQoYy5lbmQoKSwgX19maXJzdCwgX19sYXN0KTsKKwkgIHN0ZDo6bWFrZV9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXF1ZXVlIGlzIGVtcHR5LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBjLmVtcHR5KCk7IH0KKworICAgICAgLyoqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICVxdWV1ZS4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlcXVldWUuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5mcm9udCgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSAlcXVldWUuCisgICAgICAgKiAgQHBhcmFtICB4ICBEYXRhIHRvIGJlIGFkZGVkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCAlcXVldWUgb3BlcmF0aW9uLgorICAgICAgICogIFRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhlIG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nCisgICAgICAgKiAgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHB1c2goY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWMucHVzaF9iYWNrKF9feCk7CisJc3RkOjpwdXNoX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBwdXNoKHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJYy5wdXNoX2JhY2soc3RkOjptb3ZlKF9feCkpOworCXN0ZDo6cHVzaF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgYy5lbXBsYWNlX2JhY2soc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHN0ZDo6cHVzaF9oZWFwKGMuYmVnaW4oKSwgYy5lbmQoKSwgY29tcCk7CisJfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBmaXJzdCBlbGVtZW50LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgdHlwaWNhbCAlcXVldWUgb3BlcmF0aW9uLiAgSXQgc2hyaW5rcyB0aGUgJXF1ZXVlCisgICAgICAgKiAgYnkgb25lLiAgVGhlIHRpbWUgY29tcGxleGl0eSBvZiB0aGUgb3BlcmF0aW9uIGRlcGVuZHMgb24gdGhlCisgICAgICAgKiAgdW5kZXJseWluZyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IG5vIGRhdGEgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgZmlyc3QgZWxlbWVudCdzCisgICAgICAgKiAgZGF0YSBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcCgpIGlzCisgICAgICAgKiAgY2FsbGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwb3AoKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpOworCXN0ZDo6cG9wX2hlYXAoYy5iZWdpbigpLCBjLmVuZCgpLCBjb21wKTsKKwljLnBvcF9iYWNrKCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3dhcChwcmlvcml0eV9xdWV1ZSYgX19wcSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChjLCBfX3BxLmMpOworCXN3YXAoY29tcCwgX19wcS5jb21wKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH07CisKKyAgLy8gTm8gZXF1YWxpdHkvY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIHByb3ZpZGVkIGZvciBwcmlvcml0eV9xdWV1ZS4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcXVlbmNlLCB0eXBlbmFtZSBfQ29tcGFyZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAocHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2UsIF9Db21wYXJlPiYgX194LAorCSBwcmlvcml0eV9xdWV1ZTxfVHAsIF9TZXF1ZW5jZSwgX0NvbXBhcmU+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxdWVuY2UsIHR5cGVuYW1lIF9Db21wYXJlLAorCSAgIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8cHJpb3JpdHlfcXVldWU8X1RwLCBfU2VxdWVuY2UsIF9Db21wYXJlPiwgX0FsbG9jPgorICAgIDogcHVibGljIHVzZXNfYWxsb2NhdG9yPF9TZXF1ZW5jZSwgX0FsbG9jPjo6dHlwZSB7IH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9RVUVVRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfcmF3X3N0b3JhZ2VfaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzlhNjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9TVExfUkFXX1NUT1JBR0VfSVRFUkFUT1JfSAorI2RlZmluZSBfU1RMX1JBV19TVE9SQUdFX0lURVJBVE9SX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBUaGlzIGl0ZXJhdG9yIGNsYXNzIGxldHMgYWxnb3JpdGhtcyBzdG9yZSB0aGVpciByZXN1bHRzIGludG8KKyAgICogIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgorICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX091dHB1dEl0ZXJhdG9yLCBjbGFzcyBfVHA+CisgICAgY2xhc3MgcmF3X3N0b3JhZ2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3V0cHV0SXRlcmF0b3IgX01faXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvcihfT3V0cHV0SXRlcmF0b3IgX194KQorICAgICAgOiBfTV9pdGVyKF9feCkge30KKworICAgICAgcmF3X3N0b3JhZ2VfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fZWxlbWVudCkKKyAgICAgIHsKKwlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX01faXRlciksIF9fZWxlbWVudCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfT3V0cHV0SXRlcmF0b3IsIF9UcD4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwkrK19NX2l0ZXI7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByYXdfc3RvcmFnZV9pdGVyYXRvcjxfT3V0cHV0SXRlcmF0b3IsIF9UcD4KKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCXJhd19zdG9yYWdlX2l0ZXJhdG9yPF9PdXRwdXRJdGVyYXRvciwgX1RwPiBfX3RtcCA9ICp0aGlzOworCSsrX01faXRlcjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfcmVsb3BzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3JlbG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNzllNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3JlbG9wcy5oCkBAIC0wLDAgKzEsMTM1IEBACisvLyBzdGQ6OnJlbF9vcHMgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA4LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3JlbG9wcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dXRpbGl0eX0KKyAqCisgKiAgSW5jbHVzaW9uIG9mIHRoaXMgZmlsZSBoYXMgYmVlbiByZW1vdmVkIGZyb20KKyAqICBhbGwgb2YgdGhlIG90aGVyIFNUTCBoZWFkZXJzIGZvciBzYWZldHkgcmVhc29ucywgZXhjZXB0IHN0ZF91dGlsaXR5LmguCisgKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgdGhyZWFkIG9mIGFib3V0IHR3ZW50eSBtZXNzYWdlcyBzdGFydGluZworICogIHdpdGggaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAxLTAxL21zZzAwMjIzLmh0bWwsIG9yCisgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL2ZhcS5odG1sI2ZhcS5hbWJpZ3VvdXNfb3ZlcmxvYWRzCisgKgorICogIFNob3J0IHN1bW1hcnk6IHRoZSByZWxfb3BzIG9wZXJhdG9ycyBzaG91bGQgYmUgYXZvaWRlZCBmb3IgdGhlIHByZXNlbnQuCisgKi8KKworI2lmbmRlZiBfU1RMX1JFTE9QU19ICisjZGVmaW5lIF9TVExfUkVMT1BTX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgbmFtZXNwYWNlIHJlbF9vcHMKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqIEBuYW1lc3BhY2Ugc3RkOjpyZWxfb3BzCisgICAgICogIEBicmllZiAgVGhlIGdlbmVyYXRlZCByZWxhdGlvbmFsIG9wZXJhdG9ycyBhcmUgc2VxdWVzdGVyZWQgaGVyZS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyAhPSBmb3IgYXJiaXRyYXJ5IHR5cGVzLCBpbiB0ZXJtcyBvZiBAYyA9PS4KKyAgICAgKiAgQHBhcmFtICB4ICBBIHRoaW5nLgorICAgICAqICBAcGFyYW0gIHkgIEFub3RoZXIgdGhpbmcuCisgICAgICogIEByZXR1cm4gICB4ICE9IHkKKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHVzZXMgQGMgPT0gdG8gZGV0ZXJtaW5lIGl0cyByZXN1bHQuCisgICAgICovCisgICAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyA+IGZvciBhcmJpdHJhcnkgdHlwZXMsIGluIHRlcm1zIG9mIEBjIDwuCisgICAgICogIEBwYXJhbSAgeCAgQSB0aGluZy4KKyAgICAgKiAgQHBhcmFtICB5ICBBbm90aGVyIHRoaW5nLgorICAgICAqICBAcmV0dXJuICAgeCA+IHkKKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIHVzZXMgQGMgPCB0byBkZXRlcm1pbmUgaXRzIHJlc3VsdC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPihjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyA8PSBmb3IgYXJiaXRyYXJ5IHR5cGVzLCBpbiB0ZXJtcyBvZiBAYyA8LgorICAgICAqICBAcGFyYW0gIHggIEEgdGhpbmcuCisgICAgICogIEBwYXJhbSAgeSAgQW5vdGhlciB0aGluZy4KKyAgICAgKiAgQHJldHVybiAgIHggPD0geQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gdXNlcyBAYyA8IHRvIGRldGVybWluZSBpdHMgcmVzdWx0LgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICAgIC8qKgorICAgICAqICBAYnJpZWYgRGVmaW5lcyBAYyA+PSBmb3IgYXJiaXRyYXJ5IHR5cGVzLCBpbiB0ZXJtcyBvZiBAYyA8LgorICAgICAqICBAcGFyYW0gIHggIEEgdGhpbmcuCisgICAgICogIEBwYXJhbSAgeSAgQW5vdGhlciB0aGluZy4KKyAgICAgKiAgQHJldHVybiAgIHggPj0geQorICAgICAqCisgICAgICogIFRoaXMgZnVuY3Rpb24gdXNlcyBAYyA8IHRvIGRldGVybWluZSBpdHMgcmVzdWx0LgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I+PShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgcmVsX29wcworCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9TVExfUkVMT1BTX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDBmODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3NldC5oCkBAIC0wLDAgKzEsNzUzIEBACisvLyBTZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorLy8gMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfc2V0LmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzZXR9CisgKi8KKworI2lmbmRlZiBfU1RMX1NFVF9ICisjZGVmaW5lIF9TVExfU0VUX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgbWFkZSB1cCBvZiB1bmlxdWUga2V5cywgd2hpY2ggY2FuIGJlCisgICAqICByZXRyaWV2ZWQgaW4gbG9nYXJpdGhtaWMgdGltZS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGFzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjYiPnJldmVyc2libGUgY29udGFpbmVyPC9hPiwgYW5kIGFuCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2OSI+YXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPiAodXNpbmcgdW5pcXVlIGtleXMpLgorICAgKgorICAgKiAgU2V0cyBzdXBwb3J0IGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLgorICAgKgorICAgKiAgQHBhcmFtICBLZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIENvbXBhcmUgIENvbXBhcmlzb24gZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGxlc3M8S2V5Pi4KKyAgICogIEBwYXJhbSAgQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8S2V5Pi4KKyAgICoKKyAgICogIFRoZSBwcml2YXRlIHRyZWUgZGF0YSBpcyBkZWNsYXJlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBmb3Igc2V0IGFuZAorICAgKiAgbXVsdGlzZXQ7IHRoZSBkaXN0aW5jdGlvbiBpcyBtYWRlIGVudGlyZWx5IGluIGhvdyB0aGUgdHJlZSBmdW5jdGlvbnMgYXJlCisgICAqICBjYWxsZWQgKCpfdW5pcXVlIHZlcnN1cyAqX2VxdWFsLCBzYW1lIGFzIHRoZSBzdGFuZGFyZCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBzZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnZhbHVlX3R5cGUgICAgICAgICAgICAgICAgICAgX0FsbG9jX3ZhbHVlX3R5cGU7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0tleSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzNChfQ29tcGFyZSwgYm9vbCwgX0tleSwgX0tleSwKKwkJCQlfQmluYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfS2V5LCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVkZWZzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgX0tleSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIC8vQH0KKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9LZXk+OjpvdGhlciBfS2V5X2FsbG9jX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIF9JZGVudGl0eTx2YWx1ZV90eXBlPiwKKwkJICAgICAgIGtleV9jb21wYXJlLCBfS2V5X2FsbG9jX3R5cGU+IF9SZXBfdHlwZTsKKyAgICAgIF9SZXBfdHlwZSBfTV90OyAgLy8gUmVkLWJsYWNrIHRyZWUgcmVwcmVzZW50aW5nIHNldC4KKworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyAgSXRlcmF0b3ItcmVsYXRlZCB0eXBlZGVmcy4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0tleV9hbGxvY190eXBlOjpwb2ludGVyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9LZXlfYWxsb2NfdHlwZTo6Y29uc3RfcG9pbnRlciAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OnJlZmVyZW5jZSAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfS2V5X2FsbG9jX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMTAzLiBzZXQ6Oml0ZXJhdG9yIGlzIHJlcXVpcmVkIHRvIGJlIG1vZGlmaWFibGUsCisgICAgICAvLyBidXQgdGhpcyBhbGxvd3MgbW9kaWZpY2F0aW9uIG9mIGtleXMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAvL0B9CisKKyAgICAgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgc2V0KCkKKyAgICAgIDogX01fdCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAlc2V0IHdpdGggbm8gZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBjb21wICBDb21wYXJhdG9yIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV90KF9fY29tcCwgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlc2V0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tIFtmaXJzdCxsYXN0KS4KKyAgICAgICAqICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOCisgICAgICAgKiAgb3RoZXJ3aXNlICh3aGVyZSBOIGlzIGRpc3RhbmNlKGZpcnN0LGxhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKwk6IF9NX3QoKQorCXsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlc2V0IGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgY29tcCAgQSBjb21wYXJpc29uIGZ1bmN0b3IuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAlc2V0IGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tIFtmaXJzdCxsYXN0KS4KKyAgICAgICAqICBUaGlzIGlzIGxpbmVhciBpbiBOIGlmIHRoZSByYW5nZSBpcyBhbHJlYWR5IHNvcnRlZCwgYW5kIE5sb2dOCisgICAgICAgKiAgb3RoZXJ3aXNlICh3aGVyZSBOIGlzIGRpc3RhbmNlKGZpcnN0LGxhc3QpKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV90KF9fY29tcCwgX19hKQorCXsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlU2V0IGNvcHkgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICVzZXQgb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJXNldCB1c2VzIGEgY29weSBvZiB0aGUgYWxsb2NhdGlvbiBvYmplY3QgdXNlZAorICAgICAgICogIGJ5IEBhIHguCisgICAgICAgKi8KKyAgICAgIHNldChjb25zdCBzZXQmIF9feCkKKyAgICAgIDogX01fdChfX3guX01fdCkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJVNldCBtb3ZlIGNvbnN0cnVjdG9yCisgICAgICAgKiAgQHBhcmFtIHggIEEgJXNldCBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlc2V0IGNvbnRhaW5zIHRoZSBleGFjdCBjb250ZW50cyBvZiBAYSB4LgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSB4IGFyZSBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQgJXNldC4KKyAgICAgICAqLworICAgICAgc2V0KHNldCYmIF9feCkKKyAgICAgIDogX01fdChzdGQ6Om1vdmUoX194Ll9NX3QpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAlc2V0IGZyb20gYW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBjb21wICBBIGNvbXBhcmlzb24gZnVuY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGEgIEFuIGFsbG9jYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICVzZXQgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAgICogIFRoaXMgaXMgbGluZWFyIGluIE4gaWYgdGhlIGxpc3QgaXMgYWxyZWFkeSBzb3J0ZWQsIGFuZCBObG9nTgorICAgICAgICogIG90aGVyd2lzZSAod2hlcmUgTiBpcyBAYSBsLnNpemUoKSkuCisgICAgICAgKi8KKyAgICAgIHNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9NX3QoX19jb21wLCBfX2EpCisgICAgICB7IF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVNldCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgZWxlbWVudHMgb2YgQGEgeCBhcmUgY29waWVkLCBidXQgdW5saWtlIHRoZSBjb3B5IGNvbnN0cnVjdG9yLAorICAgICAgICogIHRoZSBhbGxvY2F0b3Igb2JqZWN0IGlzIG5vdCBjb3BpZWQuCisgICAgICAgKi8KKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBzZXQmIF9feCkKKyAgICAgIHsKKwlfTV90ID0gX194Ll9NX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlU2V0IG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0geCAgQSAlc2V0IG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSB4IGFyZSBtb3ZlZCBpbnRvIHRoaXMgJXNldCAod2l0aG91dCBjb3B5aW5nKS4KKyAgICAgICAqICBAYSB4IGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCAlc2V0LgorICAgICAgICovCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisgICAgICAJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVTZXQgbGlzdCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICVzZXQgd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyIGxpc3QgQGEgbC4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXNldCBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXNldCdzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gYWNjZXNzb3JzOgorCisgICAgICAvLy8gIFJldHVybnMgdGhlIGNvbXBhcmlzb24gb2JqZWN0IHdpdGggd2hpY2ggdGhlICVzZXQgd2FzIGNvbnN0cnVjdGVkLgorICAgICAga2V5X2NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Qua2V5X2NvbXAoKTsgfQorICAgICAgLy8vICBSZXR1cm5zIHRoZSBjb21wYXJpc29uIG9iamVjdCB3aXRoIHdoaWNoIHRoZSAlc2V0IHdhcyBjb25zdHJ1Y3RlZC4KKyAgICAgIHZhbHVlX2NvbXBhcmUKKyAgICAgIHZhbHVlX2NvbXAoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CisgICAgICAvLy8gIFJldHVybnMgdGhlIGFsbG9jYXRvciBvYmplY3Qgd2l0aCB3aGljaCB0aGUgJXNldCB3YXMgY29uc3RydWN0ZWQuCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZworICAgICAgICogIHRvIHRoZSBrZXlzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nCisgICAgICAgKiAgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5lbmQoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAlc2V0LiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gZGVzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcKKyAgICAgICAqICB0byB0aGUga2V5cy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGxhc3QgcGFpciBpbiB0aGUgJXNldC4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIGRlc2NlbmRpbmcgb3JkZXIKKyAgICAgICAqICBhY2NvcmRpbmcgdG8gdGhlIGtleXMuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CisjZW5kaWYKKworICAgICAgLy8vICBSZXR1cm5zIHRydWUgaWYgdGhlICVzZXQgaXMgZW1wdHkuCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90LmVtcHR5KCk7IH0KKworICAgICAgLy8vICBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3Quc2l6ZSgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAlc2V0LgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwcyBkYXRhIHdpdGggYW5vdGhlciAlc2V0LgorICAgICAgICogIEBwYXJhbSAgeCAgQSAlc2V0IG9mIHRoZSBzYW1lIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBleGNoYW5nZXMgdGhlIGVsZW1lbnRzIGJldHdlZW4gdHdvIHNldHMgaW4gY29uc3RhbnQgdGltZS4KKyAgICAgICAqICAoSXQgaXMgb25seSBzd2FwcGluZyBhIHBvaW50ZXIsIGFuIGludGVnZXIsIGFuZCBhbiBpbnN0YW5jZSBvZgorICAgICAgICogIHRoZSBAYyBDb21wYXJlIHR5cGUgKHdoaWNoIGl0c2VsZiBpcyBvZnRlbiBzdGF0ZWxlc3MgYW5kIGVtcHR5KSwgc28gaXQKKyAgICAgICAqICBzaG91bGQgYmUgcXVpdGUgZmFzdC4pCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBnbG9iYWwgc3RkOjpzd2FwKCkgZnVuY3Rpb24gaXMgc3BlY2lhbGl6ZWQgc3VjaCB0aGF0CisgICAgICAgKiAgc3RkOjpzd2FwKHMxLHMyKSB3aWxsIGZlZWQgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3dhcChzZXQmIF9feCkKKyAgICAgIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQorCisgICAgICAvLyBpbnNlcnQvZXJhc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBdHRlbXB0cyB0byBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgeCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBIHBhaXIsIG9mIHdoaWNoIHRoZSBmaXJzdCBlbGVtZW50IGlzIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgICAgICAgICAgdG8gdGhlIHBvc3NpYmx5IGluc2VydGVkIGVsZW1lbnQsIGFuZCB0aGUgc2Vjb25kIGlzIGEgYm9vbAorICAgICAgICogICAgICAgICAgIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgYWN0dWFsbHkgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgJXNldC4gIEEgJXNldAorICAgICAgICogIHJlbGllcyBvbiB1bmlxdWUga2V5cyBhbmQgdGh1cyBhbiBlbGVtZW50IGlzIG9ubHkgaW5zZXJ0ZWQgaWYgaXQgaXMKKyAgICAgICAqICBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSAlc2V0LgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRpb24gcmVxdWlyZXMgbG9nYXJpdGhtaWMgdGltZS4KKyAgICAgICAqLworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8dHlwZW5hbWUgX1JlcF90eXBlOjppdGVyYXRvciwgYm9vbD4gX19wID0KKwkgIF9NX3QuX01faW5zZXJ0X3VuaXF1ZShfX3gpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPHR5cGVuYW1lIF9SZXBfdHlwZTo6aXRlcmF0b3IsIGJvb2w+IF9fcCA9CisJICBfTV90Ll9NX2luc2VydF91bmlxdWUoc3RkOjptb3ZlKF9feCkpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEF0dGVtcHRzIHRvIGluc2VydCBhbiBlbGVtZW50IGludG8gdGhlICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgdGhhdCBzZXJ2ZXMgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRoZQorICAgICAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIGJlIGluc2VydGVkLgorICAgICAgICogIEBwYXJhbSAgeCAgRWxlbWVudCB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZWxlbWVudCB3aXRoIGtleSBvZiBAYSB4IChtYXkKKyAgICAgICAqICAgICAgICAgICBvciBtYXkgbm90IGJlIHRoZSBlbGVtZW50IHBhc3NlZCBpbikuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNvbmNlcm5lZCBhYm91dCB3aGV0aGVyIHRoZSBpbnNlcnRpb24gdG9vayBwbGFjZSwKKyAgICAgICAqICBhbmQgdGh1cyBkb2VzIG5vdCByZXR1cm4gYSBib29sZWFuIGxpa2UgdGhlIHNpbmdsZS1hcmd1bWVudCBpbnNlcnQoKQorICAgICAgICogIGRvZXMuICBOb3RlIHRoYXQgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBvbmx5IGEgaGludCBhbmQgY2FuCisgICAgICAgKiAgcG90ZW50aWFsbHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGluc2VydGlvbiBwcm9jZXNzLiAgQSBiYWQKKyAgICAgICAqICBoaW50IHdvdWxkIGNhdXNlIG5vIGdhaW5zIGluIGVmZmljaWVuY3kuCisgICAgICAgKgorICAgICAgICogIEZvciBtb3JlIG9uIEBhIGhpbnRpbmcsIHNlZToKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDA3Y2gxNy5odG1sCisgICAgICAgKgorICAgICAgICogIEluc2VydGlvbiByZXF1aXJlcyBsb2dhcml0aG1pYyB0aW1lIChpZiB0aGUgaGludCBpcyBub3QgdGFrZW4pLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZV8oX19wb3NpdGlvbiwgX194KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuX01faW5zZXJ0X3VuaXF1ZV8oX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEEgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBhdHRlbXB0cyB0byBpbnNlcnQgYSByYW5nZQorICAgICAgICogIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorCXsgX01fdC5fTV9pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQXR0ZW1wdHMgdG8gaW5zZXJ0IGEgbGlzdCBvZiBlbGVtZW50cyBpbnRvIHRoZSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgbGlzdCAgQSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gb2YgZWxlbWVudHMKKyAgICAgICAqICAgICAgICAgICAgICAgIHRvIGJlIGluc2VydGVkLgorICAgICAgICoKKyAgICAgICAqICBDb21wbGV4aXR5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgcmFuZ2UgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgKiAgICAgICAgICBAYSBwb3NpdGlvbiBwcmlvciB0byB0aGUgZWxlbWVudCBiZWluZyBlcmFzZWQuIElmIG5vIHN1Y2gKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnQgZXhpc3RzLCBlbmQoKSBpcyByZXR1cm5lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYW4gZWxlbWVudCwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gaXRlcmF0b3IsCisgICAgICAgKiAgZnJvbSBhICVzZXQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kCisgICAgICAgKiAgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90CisgICAgICAgKiAgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbHNlCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGFuIGVsZW1lbnQgZnJvbSBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbiBlbGVtZW50LCBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBpdGVyYXRvciwKKyAgICAgICAqICBmcm9tIGEgJXNldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQKKyAgICAgICAqICB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QKKyAgICAgICAqICB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzCisgICAgICAgKiAgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX3QuZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IG9mIGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZXJhc2VkLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGVyYXNlcyBhbGwgdGhlIGVsZW1lbnRzIGxvY2F0ZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCisgICAgICAgKiAgYSAlc2V0LgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZgorICAgICAgICogIHRoZSBlbGVtZW50IGlzIGl0c2VsZiBhIHBvaW50ZXIsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZAorICAgICAgICogIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRXJhc2VzIGEgW2ZpcnN0LGxhc3QpIHJhbmdlIG9mIGVsZW1lbnRzIGZyb20gYSAlc2V0LgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UgdG8gYmUKKyAgICAgICAqICAgICAgICAgICAgICAgICBlcmFzZWQuCisgICAgICAgKiAgQHBhcmFtICBsYXN0ICBJdGVyYXRvciBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiBUaGUgaXRlcmF0b3IgQGEgbGFzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBFcmFzZXMgYSBbZmlyc3QsbGFzdCkgcmFuZ2Ugb2YgZWxlbWVudHMgZnJvbSBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgIGVyYXNlZC4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIGJlIGVyYXNlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBlcmFzZXMgYSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBmcm9tIGEgJXNldC4KKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUgZWxlbWVudCwgYW5kIHRoYXQgaWYKKyAgICAgICAqICB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMgbm90IHRvdWNoZWQKKyAgICAgICAqICBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBFcmFzZXMgYWxsIGVsZW1lbnRzIGluIGEgJXNldC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9ubHkgZXJhc2VzCisgICAgICAgKiAgdGhlIGVsZW1lbnRzLCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgcG9pbnRlcnMsIHRoZQorICAgICAgICogIHBvaW50ZWQtdG8gbWVtb3J5IGlzIG5vdCB0b3VjaGVkIGluIGFueSB3YXkuICBNYW5hZ2luZyB0aGUgcG9pbnRlciBpcworICAgICAgICogIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgX01fdC5jbGVhcigpOyB9CisKKyAgICAgIC8vIHNldCBvcGVyYXRpb25zOgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICB4ICBFbGVtZW50IHRvIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgTnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkIGtleS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBtdWx0aXNldHM7IGZvciBzZXQgdGhlIHJlc3VsdCB3aWxsCisgICAgICAgKiAgZWl0aGVyIGJlIDAgKG5vdCBwcmVzZW50KSBvciAxIChwcmVzZW50KS4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCkgPT0gX01fdC5lbmQoKSA/IDAgOiAxOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUcmllcyB0byBsb2NhdGUgYW4gZWxlbWVudCBpbiBhICVzZXQuCisgICAgICAgKiAgQHBhcmFtICB4ICBFbGVtZW50IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gc291Z2h0LWFmdGVyIGVsZW1lbnQsIG9yIGVuZCgpIGlmIG5vdAorICAgICAgICogICAgICAgICAgIGZvdW5kLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEga2V5IGFuZCB0cmllcyB0byBsb2NhdGUgdGhlIGVsZW1lbnQgd2l0aCB3aGljaAorICAgICAgICogIHRoZSBrZXkgbWF0Y2hlcy4gIElmIHN1Y2Nlc3NmdWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgc291Z2h0IGFmdGVyIGVsZW1lbnQuICBJZiB1bnN1Y2Nlc3NmdWwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAqICBwYXN0LXRoZS1lbmQgKCBAYyBlbmQoKSApIGl0ZXJhdG9yLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBGaW5kcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Vic2VxdWVuY2UgbWF0Y2hpbmcgZ2l2ZW4ga2V5LgorICAgICAgICogIEBwYXJhbSAgeCAgS2V5IHRvIGJlIGxvY2F0ZWQuCisgICAgICAgKiAgQHJldHVybiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZmlyc3QgZWxlbWVudCBlcXVhbCB0byBvciBncmVhdGVyCisgICAgICAgKiAgICAgICAgICAgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBzdWJzZXF1ZW5jZSBvZiBlbGVtZW50cworICAgICAgICogIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5LiAgSWYgdW5zdWNjZXNzZnVsIGl0IHJldHVybnMgYW4gaXRlcmF0b3IKKyAgICAgICAqICBwb2ludGluZyB0byB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBhIGdyZWF0ZXIgdmFsdWUgdGhhbiBnaXZlbiBrZXkKKyAgICAgICAqICBvciBlbmQoKSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgdGhlIGVuZCBvZiBhIHN1YnNlcXVlbmNlIG1hdGNoaW5nIGdpdmVuIGtleS4KKyAgICAgICAqICBAcGFyYW0gIHggIEtleSB0byBiZSBsb2NhdGVkLgorICAgICAgICogIEByZXR1cm4gSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQKKyAgICAgICAqICAgICAgICAgIGdyZWF0ZXIgdGhhbiBrZXksIG9yIGVuZCgpLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRmluZHMgYSBzdWJzZXF1ZW5jZSBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKiAgQHBhcmFtICB4ICBLZXkgdG8gYmUgbG9jYXRlZC4KKyAgICAgICAqICBAcmV0dXJuICBQYWlyIG9mIGl0ZXJhdG9ycyB0aGF0IHBvc3NpYmx5IHBvaW50cyB0byB0aGUgc3Vic2VxdWVuY2UKKyAgICAgICAqICAgICAgICAgICBtYXRjaGluZyBnaXZlbiBrZXkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0bworICAgICAgICogIEBjb2RlCisgICAgICAgKiAgICBzdGQ6Om1ha2VfcGFpcihjLmxvd2VyX2JvdW5kKHZhbCksCisgICAgICAgKiAgICAgICAgICAgICAgICAgICBjLnVwcGVyX2JvdW5kKHZhbCkpCisgICAgICAgKiAgQGVuZGNvZGUKKyAgICAgICAqICAoYnV0IGlzIGZhc3RlciB0aGFuIG1ha2luZyB0aGUgY2FsbHMgc2VwYXJhdGVseSkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvYmFibHkgb25seSBtYWtlcyBzZW5zZSBmb3IgbXVsdGlzZXRzLgorICAgICAgICovCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3QuZXF1YWxfcmFuZ2UoX194KTsgfQorICAgICAgLy9AfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSzEsIHR5cGVuYW1lIF9DMSwgdHlwZW5hbWUgX0ExPgorCWZyaWVuZCBib29sCisJb3BlcmF0b3I9PShjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mLCBjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0sxLCB0eXBlbmFtZSBfQzEsIHR5cGVuYW1lIF9BMT4KKwlmcmllbmQgYm9vbAorCW9wZXJhdG9yPChjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mLCBjb25zdCBzZXQ8X0sxLCBfQzEsIF9BMT4mKTsKKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFNldCBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICB4ICBBICVzZXQuCisgICAqICBAcGFyYW0gIHkgIEEgJXNldCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiB0aGUgc2l6ZSBhbmQgZWxlbWVudHMgb2YgdGhlIHNldHMgYXJlIGVxdWFsLgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gIEl0IGlzIGxpbmVhciBpbiB0aGUgc2l6ZSBvZiB0aGUgc2V0cy4KKyAgICogIFNldHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsIGFuZCBpZgorICAgKiAgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7IH0KKworICAvKioKKyAgICogIEBicmllZiAgU2V0IG9yZGVyaW5nIHJlbGF0aW9uLgorICAgKiAgQHBhcmFtICB4ICBBICVzZXQuCisgICAqICBAcGFyYW0gIHkgIEEgJXNldCBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSB5LgorICAgKgorICAgKiAgVGhpcyBpcyBhIHRvdGFsIG9yZGVyaW5nIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgbWFwcy4gIFRoZSBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LgorICAgKgorICAgKiAgU2VlIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBmb3IgaG93IHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsgfQorCisgIC8vLyAgUmV0dXJucyAhKHggPT0geSkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vICBSZXR1cm5zIHkgPCB4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyAgUmV0dXJucyAhKHkgPCB4KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgLy8vICBSZXR1cm5zICEoeCA8IHkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICAvLy8gU2VlIHN0ZDo6c2V0Ojpzd2FwKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy9uYW1lc3BhY2Ugc3RkCisjZW5kaWYgLyogX1NUTF9TRVRfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9zdGFjay5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF9zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzhiYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3N0YWNrLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8vIFN0YWNrIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwKKy8vIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3N0bF9zdGFjay5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RhY2t9CisgKi8KKworI2lmbmRlZiBfU1RMX1NUQUNLX0gKKyNkZWZpbmUgX1NUTF9TVEFDS19IIDEKKworI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiAgQSBzdGFuZGFyZCBjb250YWluZXIgZ2l2aW5nIEZJTE8gYmVoYXZpb3IuCisgICAqCisgICAqICBAaW5ncm91cCBzZXF1ZW5jZXMKKyAgICoKKyAgICogIE1lZXRzIG1hbnkgb2YgdGhlIHJlcXVpcmVtZW50cyBvZiBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwKKyAgICogIGJ1dCBkb2VzIG5vdCBkZWZpbmUgYW55dGhpbmcgdG8gZG8gd2l0aCBpdGVyYXRvcnMuICBWZXJ5IGZldyBvZiB0aGUKKyAgICogIG90aGVyIHN0YW5kYXJkIGNvbnRhaW5lciBpbnRlcmZhY2VzIGFyZSBkZWZpbmVkLgorICAgKgorICAgKiAgVGhpcyBpcyBub3QgYSB0cnVlIGNvbnRhaW5lciwgYnV0IGFuIEBlIGFkYXB0b3IuICBJdCBob2xkcworICAgKiAgYW5vdGhlciBjb250YWluZXIsIGFuZCBwcm92aWRlcyBhIHdyYXBwZXIgaW50ZXJmYWNlIHRvIHRoYXQKKyAgICogIGNvbnRhaW5lci4gIFRoZSB3cmFwcGVyIGlzIHdoYXQgZW5mb3JjZXMgc3RyaWN0CisgICAqICBmaXJzdC1pbi1sYXN0LW91dCAlc3RhY2sgYmVoYXZpb3IuCisgICAqCisgICAqICBUaGUgc2Vjb25kIHRlbXBsYXRlIHBhcmFtZXRlciBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nCisgICAqICBzZXF1ZW5jZS9jb250YWluZXIuICBJdCBkZWZhdWx0cyB0byBzdGQ6OmRlcXVlLCBidXQgaXQgY2FuIGJlCisgICAqICBhbnkgdHlwZSB0aGF0IHN1cHBvcnRzIEBjIGJhY2ssIEBjIHB1c2hfYmFjaywgYW5kIEBjIHBvcF9mcm9udCwKKyAgICogIHN1Y2ggYXMgc3RkOjpsaXN0LCBzdGQ6OnZlY3Rvciwgb3IgYW4gYXBwcm9wcmlhdGUgdXNlci1kZWZpbmVkCisgICAqICB0eXBlLgorICAgKgorICAgKiAgTWVtYmVycyBub3QgZm91bmQgaW4gQGEgbm9ybWFsIGNvbnRhaW5lcnMgYXJlIEBjIGNvbnRhaW5lcl90eXBlLAorICAgKiAgd2hpY2ggaXMgYSB0eXBlZGVmIGZvciB0aGUgc2Vjb25kIFNlcXVlbmNlIHBhcmFtZXRlciwgYW5kIEBjCisgICAqICBwdXNoLCBAYyBwb3AsIGFuZCBAYyB0b3AsIHdoaWNoIGFyZSBzdGFuZGFyZCAlc3RhY2svRklMTworICAgKiAgb3BlcmF0aW9ucy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxdWVuY2UgPSBkZXF1ZTxfVHA+ID4KKyAgICBjbGFzcyBzdGFjaworICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6dmFsdWVfdHlwZSBfU2VxdWVuY2VfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfU2VxdWVuY2UsIF9CYWNrSW5zZXJ0aW9uU2VxdWVuY2VDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMihfVHAsIF9TZXF1ZW5jZV92YWx1ZV90eXBlLCBfU2FtZVR5cGVDb25jZXB0KQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfU2VxMT4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBzdGFjazxfVHAxLCBfU2VxMT4mLCBjb25zdCBzdGFjazxfVHAxLCBfU2VxMT4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1NlcTE+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBzdGFjazxfVHAxLCBfU2VxMT4mLCBjb25zdCBzdGFjazxfVHAxLCBfU2VxMT4mKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjp2YWx1ZV90eXBlICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6cmVmZXJlbmNlICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6c2l6ZV90eXBlICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmICAgICAgICAgIF9TZXF1ZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vICBTZWUgcXVldWU6OmMgZm9yIG5vdGVzIG9uIHRoaXMgbmFtZS4KKyAgICAgIF9TZXF1ZW5jZSBjOworCisgICAgcHVibGljOgorICAgICAgLy8gWFhYIHJlbW92ZWQgb2xkIGRlZiBjdG9yLCBhZGRlZCBkZWYgYXJnIHRvIHRoaXMgb25lIHRvIG1hdGNoIDE0ODgyCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZXhwbGljaXQKKyAgICAgIHN0YWNrKGNvbnN0IF9TZXF1ZW5jZSYgX19jID0gX1NlcXVlbmNlKCkpCisgICAgICA6IGMoX19jKSB7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgc3RhY2soY29uc3QgX1NlcXVlbmNlJiBfX2MpCisgICAgICA6IGMoX19jKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHN0YWNrKF9TZXF1ZW5jZSYmIF9fYyA9IF9TZXF1ZW5jZSgpKQorICAgICAgOiBjKHN0ZDo6bW92ZShfX2MpKSB7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICVzdGFjayBpcyBlbXB0eS4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gYy5lbXB0eSgpOyB9CisKKyAgICAgIC8qKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAlc3RhY2suICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGMuc2l6ZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBhdCB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RhY2suCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgdG9wKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKTsKKwlyZXR1cm4gYy5iYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXN0YWNrLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcCgpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJcmV0dXJuIGMuYmFjaygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFkZCBkYXRhIHRvIHRoZSB0b3Agb2YgdGhlICVzdGFjay4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgYWRkZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVzdGFjayBvcGVyYXRpb24uICBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhbgorICAgICAgICogIGVsZW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgJXN0YWNrIGFuZCBhc3NpZ25zIHRoZSBnaXZlbiBkYXRhCisgICAgICAgKiAgdG8gaXQuICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgICAgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBwdXNoKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soX194KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHB1c2godmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgYy5wdXNoX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2UoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyBjLmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmVzIGZpcnN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsICVzdGFjayBvcGVyYXRpb24uICBJdCBzaHJpbmtzIHRoZSAlc3RhY2sKKyAgICAgICAqICBieSBvbmUuICBUaGUgdGltZSBjb21wbGV4aXR5IG9mIHRoZSBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUKKyAgICAgICAqICB1bmRlcmx5aW5nIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgbm8gZGF0YSBpcyByZXR1cm5lZCwgYW5kIGlmIHRoZSBmaXJzdCBlbGVtZW50J3MKKyAgICAgICAqICBkYXRhIGlzIG5lZWRlZCwgaXQgc2hvdWxkIGJlIHJldHJpZXZlZCBiZWZvcmUgcG9wKCkgaXMKKyAgICAgICAqICBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcCgpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX25vbmVtcHR5KCk7CisJYy5wb3BfYmFjaygpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoc3RhY2smIF9fcykKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChjLCBfX3MuYyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBTdGFjayBlcXVhbGl0eSBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICB4ICBBICVzdGFjay4KKyAgICogIEBwYXJhbSAgeSAgQSAlc3RhY2sgb2YgdGhlIHNhbWUgdHlwZSBhcyBAYSB4LgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZmYgdGhlIHNpemUgYW5kIGVsZW1lbnRzIG9mIHRoZSBzdGFja3MgYXJlIGVxdWFsLgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gIENvbXBsZXhpdHkgYW5kIHNlbWFudGljcworICAgKiAgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHR5cGUsIGJ1dCB0aGUgZXhwZWN0ZWQgcnVsZXMKKyAgICogIGFyZTogdGhpcyByZWxhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIHNlcXVlbmNlcywgYW5kCisgICAqICBzdGFja3MgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzZXF1ZW5jZXMgY29tcGFyZQorICAgKiAgZXF1YWwuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmMgPT0gX195LmM7IH0KKworICAvKioKKyAgICogIEBicmllZiAgU3RhY2sgb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIHggIEEgJXN0YWNrLgorICAgKiAgQHBhcmFtICB5ICBBICVzdGFjayBvZiB0aGUgc2FtZSB0eXBlIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBUcnVlIGlmZiBAYSB4IGlzIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiBAYSB5LgorICAgKgorICAgKiAgVGhpcyBpcyBhbiB0b3RhbCBvcmRlcmluZyByZWxhdGlvbi4gIENvbXBsZXhpdHkgYW5kIHNlbWFudGljcworICAgKiAgZGVwZW5kIG9uIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIHR5cGUsIGJ1dCB0aGUgZXhwZWN0ZWQgcnVsZXMKKyAgICogIGFyZTogdGhpcyByZWxhdGlvbiBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIHNlcXVlbmNlcywgdGhlCisgICAqICBlbGVtZW50cyBtdXN0IGJlIGNvbXBhcmFibGUgd2l0aCBAYyA8LCBhbmQKKyAgICogIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKSBpcyB1c3VhbGx5IHVzZWQgdG8gbWFrZSB0aGUKKyAgICogIGRldGVybWluYXRpb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guYyA8IF9feS5jOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX194LCBjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9TZXE+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feCwgY29uc3Qgc3RhY2s8X1RwLCBfU2VxPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBzdGFjazxfVHAsIF9TZXE+JiBfX3gsIGNvbnN0IHN0YWNrPF9UcCwgX1NlcT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1NlcT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoc3RhY2s8X1RwLCBfU2VxPiYgX194LCBzdGFjazxfVHAsIF9TZXE+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2VxLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IHVzZXNfYWxsb2NhdG9yPHN0YWNrPF9UcCwgX1NlcT4sIF9BbGxvYz4KKyAgICA6IHB1YmxpYyB1c2VzX2FsbG9jYXRvcjxfU2VxLCBfQWxsb2M+Ojp0eXBlIHsgfTsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfU1RMX1NUQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfdGVtcGJ1Zi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF90ZW1wYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5ZGFjOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfdGVtcGJ1Zi5oCkBAIC0wLDAgKzEsMjczIEBACisvLyBUZW1wb3JhcnkgYnVmZmVyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3RlbXBidWYuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9TVExfVEVNUEJVRl9ICisjZGVmaW5lIF9TVExfVEVNUEJVRl9IIDEKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBBbGxvY2F0ZXMgYSB0ZW1wb3JhcnkgYnVmZmVyLgorICAgKiAgQHBhcmFtICBsZW4gIFRoZSBudW1iZXIgb2Ygb2JqZWN0cyBvZiB0eXBlIFRwLgorICAgKiAgQHJldHVybiBTZWUgZnVsbCBkZXNjcmlwdGlvbi4KKyAgICoKKyAgICogIFJlaW52ZW50aW5nIHRoZSB3aGVlbCwgYnV0IHRoaXMgdGltZSB3aXRoIHByZXR0aWVyIHNwb2tlcyEKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gb2J0YWluIHN0b3JhZ2UgZm9yIEBjIGxlbiBhZGphY2VudCBUcAorICAgKiAgb2JqZWN0cy4gIFRoZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjb25zdHJ1Y3RlZCwgb2YgY291cnNlLgorICAgKiAgQSBwYWlyPD4gaXMgcmV0dXJuZWQgY29udGFpbmluZyA8ZW0+dGhlIGJ1ZmZlciBzIGFkZHJlc3MgYW5kCisgICAqICBjYXBhY2l0eSAoaW4gdGhlIHVuaXRzIG9mIHNpemVvZihUcCkpLCBvciBhIHBhaXIgb2YgMCB2YWx1ZXMgaWYKKyAgICogIG5vIHN0b3JhZ2UgY2FuIGJlIG9idGFpbmVkLjwvZW0+ICBOb3RlIHRoYXQgdGhlIGNhcGFjaXR5IG9idGFpbmVkCisgICAqICBtYXkgYmUgbGVzcyB0aGFuIHRoYXQgcmVxdWVzdGVkIGlmIHRoZSBtZW1vcnkgaXMgdW5hdmFpbGFibGU7CisgICAqICB5b3Ugc2hvdWxkIGNvbXBhcmUgbGVuIHdpdGggdGhlIC5zZWNvbmQgcmV0dXJuIHZhbHVlLgorICAgKgorICAgKiBQcm92aWRlcyB0aGUgbm90aHJvdyBleGNlcHRpb24gZ3VhcmFudGVlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHBhaXI8X1RwKiwgcHRyZGlmZl90PgorICAgIGdldF90ZW1wb3JhcnlfYnVmZmVyKHB0cmRpZmZfdCBfX2xlbikKKyAgICB7CisgICAgICBjb25zdCBwdHJkaWZmX3QgX19tYXggPQorCV9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxwdHJkaWZmX3Q+OjpfX21heCAvIHNpemVvZihfVHApOworICAgICAgaWYgKF9fbGVuID4gX19tYXgpCisJX19sZW4gPSBfX21heDsKKyAgICAgIAorICAgICAgd2hpbGUgKF9fbGVuID4gMCkgCisJeworCSAgX1RwKiBfX3RtcCA9IHN0YXRpY19jYXN0PF9UcCo+KDo6b3BlcmF0b3IgbmV3KF9fbGVuICogc2l6ZW9mKF9UcCksIAorCQkJCQkJCXN0ZDo6bm90aHJvdykpOworCSAgaWYgKF9fdG1wICE9IDApCisJICAgIHJldHVybiBzdGQ6OnBhaXI8X1RwKiwgcHRyZGlmZl90PihfX3RtcCwgX19sZW4pOworCSAgX19sZW4gLz0gMjsKKwl9CisgICAgICByZXR1cm4gc3RkOjpwYWlyPF9UcCosIHB0cmRpZmZfdD4oc3RhdGljX2Nhc3Q8X1RwKj4oMCksIDApOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBUaGUgY29tcGFuaW9uIHRvIGdldF90ZW1wb3JhcnlfYnVmZmVyKCkuCisgICAqICBAcGFyYW0gIHAgIEEgYnVmZmVyIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGdldF90ZW1wb3JhcnlfYnVmZmVyLgorICAgKiAgQHJldHVybiAgIE5vbmUuCisgICAqCisgICAqICBGcmVlcyB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgcC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHJldHVybl90ZW1wb3JhcnlfYnVmZmVyKF9UcCogX19wKQorICAgIHsgOjpvcGVyYXRvciBkZWxldGUoX19wLCBzdGQ6Om5vdGhyb3cpOyB9CisKKworICAvKioKKyAgICogIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiB0d28gcGxhY2VzOiBzdGxfYWxnby5oIGFuZCBleHQvbWVtb3J5LAorICAgKiAgd2hlcmUgaXQgaXMgd3JhcHBlZCBhcyB0aGUgdGVtcG9yYXJ5X2J1ZmZlciBjbGFzcy4gIFNlZQorICAgKiAgdGVtcG9yYXJ5X2J1ZmZlciBkb2NzIGZvciBtb3JlIG5vdGVzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9UZW1wb3JhcnlfYnVmZmVyCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yLCBfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgcG9pbnRlciAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgIHNpemVfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHNpemVfdHlwZSAgX01fb3JpZ2luYWxfbGVuOworICAgICAgc2l6ZV90eXBlICBfTV9sZW47CisgICAgICBwb2ludGVyICAgIF9NX2J1ZmZlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBBcyBwZXIgVGFibGUgbXVtYmxlLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2xlbjsgfQorCisgICAgICAvLy8gUmV0dXJucyB0aGUgc2l6ZSByZXF1ZXN0ZWQgYnkgdGhlIGNvbnN0cnVjdG9yOyBtYXkgYmUgPnNpemUoKS4KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmVxdWVzdGVkX3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fb3JpZ2luYWxfbGVuOyB9CisKKyAgICAgIC8vLyBBcyBwZXIgVGFibGUgbXVtYmxlLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9NX2J1ZmZlcjsgfQorCisgICAgICAvLy8gQXMgcGVyIFRhYmxlIG11bWJsZS4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gX01fYnVmZmVyICsgX01fbGVuOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIHRlbXBvcmFyeSBidWZmZXIgb2YgYSBzaXplIHNvbWV3aGVyZSBiZXR3ZWVuCisgICAgICAgKiB6ZXJvIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIF9UZW1wb3JhcnlfYnVmZmVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpOworCisgICAgICB+X1RlbXBvcmFyeV9idWZmZXIoKQorICAgICAgeworCXN0ZDo6X0Rlc3Ryb3koX01fYnVmZmVyLCBfTV9idWZmZXIgKyBfTV9sZW4pOworCXN0ZDo6cmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoX01fYnVmZmVyKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAvLyBEaXNhYmxlIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICBfVGVtcG9yYXJ5X2J1ZmZlcihjb25zdCBfVGVtcG9yYXJ5X2J1ZmZlciYpOworCisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1RlbXBvcmFyeV9idWZmZXImKTsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8Ym9vbD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2NvbnN0cnVjdF9idWZfZGlzcGF0Y2gKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdWNyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1RwJiBfX3ZhbHVlKQorICAgICAgICB7CisJICBpZihfX2ZpcnN0ID09IF9fbGFzdCkKKwkgICAgcmV0dXJuOworCisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19maXJzdCksCisJCQkgICAgICBfR0xJQkNYWF9NT1ZFKF9fdmFsdWUpKTsKKwkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcHJldiA9IF9fY3VyOworCSAgICAgICsrX19jdXI7CisJICAgICAgZm9yKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyLCArK19fcHJldikKKwkJc3RkOjpfQ29uc3RydWN0KHN0ZDo6X19hZGRyZXNzb2YoKl9fY3VyKSwKKwkJCQlfR0xJQkNYWF9NT1ZFKCpfX3ByZXYpKTsKKwkgICAgICBfX3ZhbHVlID0gX0dMSUJDWFhfTU9WRSgqX19wcmV2KTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2NvbnN0cnVjdF9idWZfZGlzcGF0Y2g8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdWNyKF9Gb3J3YXJkSXRlcmF0b3IsIF9Gb3J3YXJkSXRlcmF0b3IsIF9UcCYpIHsgfQorICAgIH07CisKKyAgLy8gQ29uc3RydWN0cyBvYmplY3RzIGluIHRoZSByYW5nZSBbZmlyc3QsIGxhc3QpLgorICAvLyBOb3RlIHRoYXQgd2hpbGUgdGhlc2UgbmV3IG9iamVjdHMgd2lsbCB0YWtlIHZhbGlkIHZhbHVlcywKKyAgLy8gdGhlaXIgZXhhY3QgdmFsdWUgaXMgbm90IGRlZmluZWQuIEluIHBhcnRpY3VsYXIgdGhleSBtYXkKKyAgLy8gYmUgJ21vdmVkIGZyb20nLgorICAvLworICAvLyBXaGlsZSBfX3ZhbHVlIG1heSBhbHRlcmVkIGR1cmluZyB0aGlzIGFsZ29yaXRobSwgaXQgd2lsbCBoYXZlCisgIC8vIHRoZSBzYW1lIHZhbHVlIHdoZW4gdGhlIGFsZ29yaXRobSBmaW5pc2hlcywgdW5sZXNzIG9uZSBvZiB0aGUKKyAgLy8gY29uc3RydWN0aW9ucyB0aHJvd3MuCisgIC8vCisgIC8vIFJlcXVpcmVtZW50czogX0ZvcndhcmRJdGVyYXRvcjo6dmFsdWVfdHlwZShfVHAmJikgaXMgdmFsaWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCQkgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJCSAgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmX2Rpc3BhdGNoPAorICAgICAgICBfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKF9WYWx1ZVR5cGUpPjo6CisJICBfX3VjcihfX2ZpcnN0LCBfX2xhc3QsIF9fdmFsdWUpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgX1RlbXBvcmFyeV9idWZmZXI8X0ZvcndhcmRJdGVyYXRvciwgX1RwPjo6CisgICAgX1RlbXBvcmFyeV9idWZmZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICA6IF9NX29yaWdpbmFsX2xlbihzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCkpLAorICAgICAgX01fbGVuKDApLCBfTV9idWZmZXIoMCkKKyAgICB7CisgICAgICBfX3RyeQorCXsKKwkgIHN0ZDo6cGFpcjxwb2ludGVyLCBzaXplX3R5cGU+IF9fcChzdGQ6OmdldF90ZW1wb3JhcnlfYnVmZmVyPAorCQkJCQkgICAgdmFsdWVfdHlwZT4oX01fb3JpZ2luYWxfbGVuKSk7CisJICBfTV9idWZmZXIgPSBfX3AuZmlyc3Q7CisJICBfTV9sZW4gPSBfX3Auc2Vjb25kOworCSAgaWYoX01fYnVmZmVyKQorCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb25zdHJ1Y3RfYnVmKF9NX2J1ZmZlciwgX01fYnVmZmVyICsgX01fbGVuLAorCQkJCQkgICAgICAgKl9fZmlyc3QpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6cmV0dXJuX3RlbXBvcmFyeV9idWZmZXIoX01fYnVmZmVyKTsKKwkgIF9NX2J1ZmZlciA9IDA7CisJICBfTV9sZW4gPSAwOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9URU1QQlVGX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF90cmVlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3RyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2U5NTY0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF90cmVlLmgKQEAgLTAsMCArMSwxNjUxIEBACisvLyBSQiB0cmVlIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwKKy8vIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKi8KKworLyoqIEBmaWxlIGJpdHMvc3RsX3RyZWUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21hcCBvciBzZXR9CisgKi8KKworI2lmbmRlZiBfU1RMX1RSRUVfSAorI2RlZmluZSBfU1RMX1RSRUVfSCAxCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gUmVkLWJsYWNrIHRyZWUgY2xhc3MsIGRlc2lnbmVkIGZvciB1c2UgaW4gaW1wbGVtZW50aW5nIFNUTAorICAvLyBhc3NvY2lhdGl2ZSBjb250YWluZXJzIChzZXQsIG11bHRpc2V0LCBtYXAsIGFuZCBtdWx0aW1hcCkuIFRoZQorICAvLyBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIGFsZ29yaXRobXMgYXJlIGJhc2VkIG9uIHRob3NlIGluIENvcm1lbiwKKyAgLy8gTGVpc2Vyc29uLCBhbmQgUml2ZXN0LCBJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyAoTUlUIFByZXNzLAorICAvLyAxOTkwKSwgZXhjZXB0IHRoYXQKKyAgLy8KKyAgLy8gKDEpIHRoZSBoZWFkZXIgY2VsbCBpcyBtYWludGFpbmVkIHdpdGggbGlua3Mgbm90IG9ubHkgdG8gdGhlIHJvb3QKKyAgLy8gYnV0IGFsc28gdG8gdGhlIGxlZnRtb3N0IG5vZGUgb2YgdGhlIHRyZWUsIHRvIGVuYWJsZSBjb25zdGFudAorICAvLyB0aW1lIGJlZ2luKCksIGFuZCB0byB0aGUgcmlnaHRtb3N0IG5vZGUgb2YgdGhlIHRyZWUsIHRvIGVuYWJsZQorICAvLyBsaW5lYXIgdGltZSBwZXJmb3JtYW5jZSB3aGVuIHVzZWQgd2l0aCB0aGUgZ2VuZXJpYyBzZXQgYWxnb3JpdGhtcworICAvLyAoc2V0X3VuaW9uLCBldGMuKQorICAvLyAKKyAgLy8gKDIpIHdoZW4gYSBub2RlIGJlaW5nIGRlbGV0ZWQgaGFzIHR3byBjaGlsZHJlbiBpdHMgc3VjY2Vzc29yIG5vZGUKKyAgLy8gaXMgcmVsaW5rZWQgaW50byBpdHMgcGxhY2UsIHJhdGhlciB0aGFuIGNvcGllZCwgc28gdGhhdCB0aGUgb25seQorICAvLyBpdGVyYXRvcnMgaW52YWxpZGF0ZWQgYXJlIHRob3NlIHJlZmVycmluZyB0byB0aGUgZGVsZXRlZCBub2RlLgorCisgIGVudW0gX1JiX3RyZWVfY29sb3IgeyBfU19yZWQgPSBmYWxzZSwgX1NfYmxhY2sgPSB0cnVlIH07CisKKyAgc3RydWN0IF9SYl90cmVlX25vZGVfYmFzZQorICB7CisgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9CYXNlX3B0cjsKKyAgICB0eXBlZGVmIGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX0NvbnN0X0Jhc2VfcHRyOworCisgICAgX1JiX3RyZWVfY29sb3IJX01fY29sb3I7CisgICAgX0Jhc2VfcHRyCQlfTV9wYXJlbnQ7CisgICAgX0Jhc2VfcHRyCQlfTV9sZWZ0OworICAgIF9CYXNlX3B0cgkJX01fcmlnaHQ7CisKKyAgICBzdGF0aWMgX0Jhc2VfcHRyCisgICAgX1NfbWluaW11bShfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX2xlZnQgIT0gMCkgX194ID0gX194LT5fTV9sZWZ0OworICAgICAgcmV0dXJuIF9feDsKKyAgICB9CisKKyAgICBzdGF0aWMgX0NvbnN0X0Jhc2VfcHRyCisgICAgX1NfbWluaW11bShfQ29uc3RfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX2xlZnQgIT0gMCkgX194ID0gX194LT5fTV9sZWZ0OworICAgICAgcmV0dXJuIF9feDsKKyAgICB9CisKKyAgICBzdGF0aWMgX0Jhc2VfcHRyCisgICAgX1NfbWF4aW11bShfQmFzZV9wdHIgX194KQorICAgIHsKKyAgICAgIHdoaWxlIChfX3gtPl9NX3JpZ2h0ICE9IDApIF9feCA9IF9feC0+X01fcmlnaHQ7CisgICAgICByZXR1cm4gX194OworICAgIH0KKworICAgIHN0YXRpYyBfQ29uc3RfQmFzZV9wdHIKKyAgICBfU19tYXhpbXVtKF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgeworICAgICAgd2hpbGUgKF9feC0+X01fcmlnaHQgIT0gMCkgX194ID0gX194LT5fTV9yaWdodDsKKyAgICAgIHJldHVybiBfX3g7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgc3RydWN0IF9SYl90cmVlX25vZGUgOiBwdWJsaWMgX1JiX3RyZWVfbm9kZV9iYXNlCisgICAgeworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWw+KiBfTGlua190eXBlOworICAgICAgX1ZhbCBfTV92YWx1ZV9maWVsZDsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgX1JiX3RyZWVfbm9kZShfQXJncyYmLi4uIF9fYXJncykKKwk6IF9SYl90cmVlX25vZGVfYmFzZSgpLAorCSAgX01fdmFsdWVfZmllbGQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7IH0KKyNlbmRpZgorICAgIH07CisKKyAgX0dMSUJDWFhfUFVSRSBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2luY3JlbWVudChfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgX0dMSUJDWFhfUFVSRSBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2luY3JlbWVudChjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgX0dMSUJDWFhfUFVSRSBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2RlY3JlbWVudChfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgX0dMSUJDWFhfUFVSRSBjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqCisgIF9SYl90cmVlX2RlY3JlbWVudChjb25zdCBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feCkgdGhyb3cgKCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmJfdHJlZV9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwKiBwb2ludGVyOworCisgICAgICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8X1RwPiAgICAgICAgX1NlbGY7CisgICAgICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZTo6X0Jhc2VfcHRyIF9CYXNlX3B0cjsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVHA+KiAgICAgICAgICAgX0xpbmtfdHlwZTsKKworICAgICAgX1JiX3RyZWVfaXRlcmF0b3IoKQorICAgICAgOiBfTV9ub2RlKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfUmJfdHJlZV9pdGVyYXRvcihfTGlua190eXBlIF9feCkKKyAgICAgIDogX01fbm9kZShfX3gpIHsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPihfTV9ub2RlKS0+X01fdmFsdWVfZmllbGQ7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+CisJCQkJKF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZCk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX1JiX3RyZWVfaW5jcmVtZW50KF9NX25vZGUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9SYl90cmVlX2luY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fbm9kZSA9IF9SYl90cmVlX2RlY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfUmJfdHJlZV9kZWNyZW1lbnQoX01fbm9kZSk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKworICAgICAgX0Jhc2VfcHRyIF9NX25vZGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiBwb2ludGVyOworCisgICAgICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9UcD4gaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjxfVHA+ICAgICAgICBfU2VsZjsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlOjpfQ29uc3RfQmFzZV9wdHIgX0Jhc2VfcHRyOworICAgICAgdHlwZWRlZiBjb25zdCBfUmJfdHJlZV9ub2RlPF9UcD4qICAgICAgICAgICBfTGlua190eXBlOworCisgICAgICBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcigpCisgICAgICA6IF9NX25vZGUoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yKF9MaW5rX3R5cGUgX194KQorICAgICAgOiBfTV9ub2RlKF9feCkgeyB9CisKKyAgICAgIF9SYl90cmVlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX2l0KQorICAgICAgOiBfTV9ub2RlKF9faXQuX01fbm9kZSkgeyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9jb25zdF9jYXN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJhdG9yOjpfTGlua190eXBlPgorCQkJKGNvbnN0X2Nhc3Q8dHlwZW5hbWUgaXRlcmF0b3I6Ol9CYXNlX3B0cj4oX01fbm9kZSkpKTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfTGlua190eXBlPihfTV9ub2RlKS0+X01fdmFsdWVfZmllbGQ7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+CisJCQkJKF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZCk7IH0KKworICAgICAgX1NlbGYmCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9ub2RlID0gX1JiX3RyZWVfaW5jcmVtZW50KF9NX25vZGUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1NlbGYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9TZWxmIF9fdG1wID0gKnRoaXM7CisJX01fbm9kZSA9IF9SYl90cmVlX2luY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIF9TZWxmJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fbm9kZSA9IF9SYl90cmVlX2RlY3JlbWVudChfTV9ub2RlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX25vZGUgPSBfUmJfdHJlZV9kZWNyZW1lbnQoX01fbm9kZSk7CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TZWxmJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgX1NlbGYmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKworICAgICAgX0Jhc2VfcHRyIF9NX25vZGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsPiYgX194LAorICAgICAgICAgICAgICAgY29uc3QgX1JiX3RyZWVfY29uc3RfaXRlcmF0b3I8X1ZhbD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fbm9kZSA9PSBfX3kuX01fbm9kZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWw+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9SYl90cmVlX2l0ZXJhdG9yPF9WYWw+JiBfX3gsCisgICAgICAgICAgICAgICBjb25zdCBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjxfVmFsPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9ub2RlICE9IF9feS5fTV9ub2RlOyB9CisKKyAgdm9pZAorICBfUmJfdHJlZV9pbnNlcnRfYW5kX3JlYmFsYW5jZShjb25zdCBib29sIF9faW5zZXJ0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSogX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlJiBfX2hlYWRlcikgdGhyb3cgKCk7CisKKyAgX1JiX3RyZWVfbm9kZV9iYXNlKgorICBfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlKF9SYl90cmVlX25vZGVfYmFzZSogY29uc3QgX196LAorCQkJICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSYgX19oZWFkZXIpIHRocm93ICgpOworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbD4gPgorICAgIGNsYXNzIF9SYl90cmVlCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfUmJfdHJlZV9ub2RlPF9WYWw+ID46Om90aGVyCisgICAgICAgICAgICAgIF9Ob2RlX2FsbG9jYXRvcjsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlKiBfQmFzZV9wdHI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX0NvbnN0X0Jhc2VfcHRyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfS2V5IGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVmFsIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWw+KiBfTGlua190eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfUmJfdHJlZV9ub2RlPF9WYWw+KiBfQ29uc3RfTGlua190eXBlOworICAgICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Ob2RlX2FsbG9jYXRvciYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X05vZGVfYWxsb2NhdG9yKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisgICAgICAKKyAgICAgIGNvbnN0IF9Ob2RlX2FsbG9jYXRvciYKKyAgICAgIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2NhdG9yKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKTsgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fZ2V0X25vZGUoKQorICAgICAgeyByZXR1cm4gX01faW1wbC5fTm9kZV9hbGxvY2F0b3I6OmFsbG9jYXRlKDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3B1dF9ub2RlKF9MaW5rX3R5cGUgX19wKQorICAgICAgeyBfTV9pbXBsLl9Ob2RlX2FsbG9jYXRvcjo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9CisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9MaW5rX3R5cGUKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfTGlua190eXBlIF9fdG1wID0gX01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeyBnZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0CisJICAgICAgKHN0ZDo6X19hZGRyZXNzb2YoX190bXAtPl9NX3ZhbHVlX2ZpZWxkKSwgX194KTsgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9wdXRfbm9kZShfX3RtcCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9ub2RlKF9MaW5rX3R5cGUgX19wKQorICAgICAgeworCWdldF9hbGxvY2F0b3IoKS5kZXN0cm95KHN0ZDo6X19hZGRyZXNzb2YoX19wLT5fTV92YWx1ZV9maWVsZCkpOworCV9NX3B1dF9ub2RlKF9fcCk7CisgICAgICB9CisjZWxzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIF9MaW5rX3R5cGUKKyAgICAgICAgX01fY3JlYXRlX25vZGUoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0xpbmtfdHlwZSBfX3RtcCA9IF9NX2dldF9ub2RlKCk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuY29uc3RydWN0KF9fdG1wLAorCQkJCQkgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX01fcHV0X25vZGUoX190bXApOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICByZXR1cm4gX190bXA7CisJfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95X25vZGUoX0xpbmtfdHlwZSBfX3ApCisgICAgICB7CisJX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkuZGVzdHJveShfX3ApOworCV9NX3B1dF9ub2RlKF9fcCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fY2xvbmVfbm9kZShfQ29uc3RfTGlua190eXBlIF9feCkKKyAgICAgIHsKKwlfTGlua190eXBlIF9fdG1wID0gX01fY3JlYXRlX25vZGUoX194LT5fTV92YWx1ZV9maWVsZCk7CisJX190bXAtPl9NX2NvbG9yID0gX194LT5fTV9jb2xvcjsKKwlfX3RtcC0+X01fbGVmdCA9IDA7CisJX190bXAtPl9NX3JpZ2h0ID0gMDsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5X2NvbXBhcmUsIAorCSAgICAgICBib29sIF9Jc19wb2RfY29tcGFyYXRvciA9IF9faXNfcG9kKF9LZXlfY29tcGFyZSk+CisgICAgICAgIHN0cnVjdCBfUmJfdHJlZV9pbXBsIDogcHVibGljIF9Ob2RlX2FsbG9jYXRvcgorICAgICAgICB7CisJICBfS2V5X2NvbXBhcmUJCV9NX2tleV9jb21wYXJlOworCSAgX1JiX3RyZWVfbm9kZV9iYXNlIAlfTV9oZWFkZXI7CisJICBzaXplX3R5cGUgCQlfTV9ub2RlX2NvdW50OyAvLyBLZWVwcyB0cmFjayBvZiBzaXplIG9mIHRyZWUuCisKKwkgIF9SYl90cmVlX2ltcGwoKQorCSAgOiBfTm9kZV9hbGxvY2F0b3IoKSwgX01fa2V5X2NvbXBhcmUoKSwgX01faGVhZGVyKCksCisJICAgIF9NX25vZGVfY291bnQoMCkKKwkgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisKKwkgIF9SYl90cmVlX2ltcGwoY29uc3QgX0tleV9jb21wYXJlJiBfX2NvbXAsIGNvbnN0IF9Ob2RlX2FsbG9jYXRvciYgX19hKQorCSAgOiBfTm9kZV9hbGxvY2F0b3IoX19hKSwgX01fa2V5X2NvbXBhcmUoX19jb21wKSwgX01faGVhZGVyKCksCisJICAgIF9NX25vZGVfY291bnQoMCkKKwkgIHsgX01faW5pdGlhbGl6ZSgpOyB9CisKKwlwcml2YXRlOgorCSAgdm9pZAorCSAgX01faW5pdGlhbGl6ZSgpCisJICB7CisJICAgIHRoaXMtPl9NX2hlYWRlci5fTV9jb2xvciA9IF9TX3JlZDsKKwkgICAgdGhpcy0+X01faGVhZGVyLl9NX3BhcmVudCA9IDA7CisJICAgIHRoaXMtPl9NX2hlYWRlci5fTV9sZWZ0ID0gJnRoaXMtPl9NX2hlYWRlcjsKKwkgICAgdGhpcy0+X01faGVhZGVyLl9NX3JpZ2h0ID0gJnRoaXMtPl9NX2hlYWRlcjsKKwkgIH0JICAgIAorCX07CisKKyAgICAgIC8vIExvY2FsIG1vZGlmaWNhdGlvbjogaWYgX19nb29nbGVfc3RsX2RlYnVnX3JidHJlZSBpcyBkZWZpbmVkIHRvCisgICAgICAvLyBub24temVybyB2YWx1ZSwgY2hlY2sgc29ydCBwcmVkaWNhdGUgZm9yIHN0cmljdCB3ZWFrIG9yZGVyaW5nLgorICAgICAgLy8gR29vZ2xlIHJlZiBiLzE3MzEyMDAuCisjaWYgX19nb29nbGVfc3RsX2RlYnVnX3JidHJlZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleUNvbXBhcmU+CisgICAgICBzdHJ1Y3QgX0NoZWNrZWRDb21wYXJlIHsKKyAgICAgICAgX0tleUNvbXBhcmUgX01fa2V5X2NvbXBhcmU7CisKKyAgICAgICAgX0NoZWNrZWRDb21wYXJlKCk6IF9NX2tleV9jb21wYXJlKCkgeyB9CisgICAgICAgIF9DaGVja2VkQ29tcGFyZShjb25zdCBfS2V5Q29tcGFyZSAmIF9fY29tcCk6IF9NX2tleV9jb21wYXJlKF9fY29tcCkgeyB9CisKKwkvLyBUZW1wbGF0ZSBhcmcgcmVxdWlyZWQgdG8gYXZvaWQgZHVwbGljYXRpbmcgY29kZSBpbiB0aGUgdHdvIG9wKCkKKwkvLyBvcGVyYXRvcnMgYmVsb3cuICBVc2VyLXByb3ZpZGVkIF9NX2tleV9jb21wYXJlIG1heSBub3QgYmUgY29uc3QsCisJLy8gYnV0IG5lZWRzIHRvIGJlIGNhbGxhYmxlIGZyb20gb3VyIGNvbnN0IG9wKCkuCisJLy8gR29vZ2xlIHJlZi4gYi8xNzMxMjAwLgorCXRlbXBsYXRlIDx0eXBlbmFtZSBfS2V5Q29tcGFyZVQ+CisgICAgICAgIHN0YXRpYyBib29sIF9NX2NvbXBhcmVfd2l0aChfS2V5Q29tcGFyZVQmIF9fY29tcCwgY29uc3QgX0tleSYgX194LCBjb25zdCBfS2V5JiBfX3kpIHsKKyAgICAgICAgICBpZiAoX19jb21wKF9feCwgX194KSkKKyAgICAgICAgICAgIF9fdGhyb3dfcnVudGltZV9lcnJvcigic3RyaWN0IHdlYWsgb3JkZXJpbmc6IChfX3ggTFQgX194KSAhPSBmYWxzZSIpOworICAgICAgICAgIGlmIChfX2NvbXAoX195LCBfX3kpKQorICAgICAgICAgICAgX190aHJvd19ydW50aW1lX2Vycm9yKCJzdHJpY3Qgd2VhayBvcmRlcmluZzogKF9feSBMVCBfX3kpICE9IGZhbHNlIik7CisgICAgICAgICAgYm9vbCBsdCA9IF9fY29tcChfX3gsIF9feSk7CisgICAgICAgICAgaWYgKGx0ICYmIF9fY29tcChfX3ksIF9feCkpCisgICAgICAgICAgICBfX3Rocm93X3J1bnRpbWVfZXJyb3IoInN0cmljdCB3ZWFrIG9yZGVyaW5nOiAoKF9feCBMVCBfX3kpICYmIChfX3kgTFQgX194KSkgIT0gZmFsc2UiKTsKKyAgICAgICAgICByZXR1cm4gbHQ7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9LZXkmIF9feCwgY29uc3QgX0tleSYgX195KSBjb25zdCB7CisJICByZXR1cm4gX01fY29tcGFyZV93aXRoKF9NX2tleV9jb21wYXJlLCBfX3gsIF9feSk7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX0tleSYgX194LCBjb25zdCBfS2V5JiBfX3kpIHsKKwkgIHJldHVybiBfTV9jb21wYXJlX3dpdGgoX01fa2V5X2NvbXBhcmUsIF9feCwgX195KTsKKyAgICAgICAgfQorCisgICAgICAgIG9wZXJhdG9yIF9LZXlDb21wYXJlKCkgY29uc3QgeyByZXR1cm4gX01fa2V5X2NvbXBhcmU7IH0KKyAgICAgIH07CisKKyAgICAgIF9SYl90cmVlX2ltcGw8X0NoZWNrZWRDb21wYXJlPF9Db21wYXJlPiA+IF9NX2ltcGw7CisjZWxzZQorICAgICAgX1JiX3RyZWVfaW1wbDxfQ29tcGFyZT4gX01faW1wbDsKKyNlbmRpZgorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0Jhc2VfcHRyJgorICAgICAgX01fcm9vdCgpCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9wYXJlbnQ7IH0KKworICAgICAgX0NvbnN0X0Jhc2VfcHRyCisgICAgICBfTV9yb290KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3BhcmVudDsgfQorCisgICAgICBfQmFzZV9wdHImCisgICAgICBfTV9sZWZ0bW9zdCgpCisgICAgICB7IHJldHVybiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9sZWZ0OyB9CisKKyAgICAgIF9Db25zdF9CYXNlX3B0cgorICAgICAgX01fbGVmdG1vc3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fbGVmdDsgfQorCisgICAgICBfQmFzZV9wdHImCisgICAgICBfTV9yaWdodG1vc3QoKQorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcmlnaHQ7IH0KKworICAgICAgX0NvbnN0X0Jhc2VfcHRyCisgICAgICBfTV9yaWdodG1vc3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcmlnaHQ7IH0KKworICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fYmVnaW4oKQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4odGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcGFyZW50KTsgfQorCisgICAgICBfQ29uc3RfTGlua190eXBlCisgICAgICBfTV9iZWdpbigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+CisJICAodGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fcGFyZW50KTsKKyAgICAgIH0KKworICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fZW5kKCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcik7IH0KKworICAgICAgX0NvbnN0X0xpbmtfdHlwZQorICAgICAgX01fZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+KCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcik7IH0KKworICAgICAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZQorICAgICAgX1NfdmFsdWUoX0NvbnN0X0xpbmtfdHlwZSBfX3gpCisgICAgICB7IHJldHVybiBfX3gtPl9NX3ZhbHVlX2ZpZWxkOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBfS2V5JgorICAgICAgX1Nfa2V5KF9Db25zdF9MaW5rX3R5cGUgX194KQorICAgICAgeyByZXR1cm4gX0tleU9mVmFsdWUoKShfU192YWx1ZShfX3gpKTsgfQorCisgICAgICBzdGF0aWMgX0xpbmtfdHlwZQorICAgICAgX1NfbGVmdChfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oX194LT5fTV9sZWZ0KTsgfQorCisgICAgICBzdGF0aWMgX0NvbnN0X0xpbmtfdHlwZQorICAgICAgX1NfbGVmdChfQ29uc3RfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4oX194LT5fTV9sZWZ0KTsgfQorCisgICAgICBzdGF0aWMgX0xpbmtfdHlwZQorICAgICAgX1NfcmlnaHQoX0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+KF9feC0+X01fcmlnaHQpOyB9CisKKyAgICAgIHN0YXRpYyBfQ29uc3RfTGlua190eXBlCisgICAgICBfU19yaWdodChfQ29uc3RfQmFzZV9wdHIgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4oX194LT5fTV9yaWdodCk7IH0KKworICAgICAgc3RhdGljIGNvbnN0X3JlZmVyZW5jZQorICAgICAgX1NfdmFsdWUoX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9Db25zdF9MaW5rX3R5cGU+KF9feCktPl9NX3ZhbHVlX2ZpZWxkOyB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBfS2V5JgorICAgICAgX1Nfa2V5KF9Db25zdF9CYXNlX3B0ciBfX3gpCisgICAgICB7IHJldHVybiBfS2V5T2ZWYWx1ZSgpKF9TX3ZhbHVlKF9feCkpOyB9CisKKyAgICAgIHN0YXRpYyBfQmFzZV9wdHIKKyAgICAgIF9TX21pbmltdW0oX0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWluaW11bShfX3gpOyB9CisKKyAgICAgIHN0YXRpYyBfQ29uc3RfQmFzZV9wdHIKKyAgICAgIF9TX21pbmltdW0oX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWluaW11bShfX3gpOyB9CisKKyAgICAgIHN0YXRpYyBfQmFzZV9wdHIKKyAgICAgIF9TX21heGltdW0oX0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfX3gpOyB9CisKKyAgICAgIHN0YXRpYyBfQ29uc3RfQmFzZV9wdHIKKyAgICAgIF9TX21heGltdW0oX0NvbnN0X0Jhc2VfcHRyIF9feCkKKyAgICAgIHsgcmV0dXJuIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfX3gpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGU+ICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjx2YWx1ZV90eXBlPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgIHByaXZhdGU6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF8oX0NvbnN0X0Jhc2VfcHRyIF9feCwgX0NvbnN0X0Jhc2VfcHRyIF9feSwgX0FyZyYmIF9fdik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF9sb3dlcihfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX195LCBfQXJnJiYgX192KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKF9BcmcmJiBfX3gpOworI2Vsc2UKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfKF9Db25zdF9CYXNlX3B0ciBfX3gsIF9Db25zdF9CYXNlX3B0ciBfX3ksCisJCSBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMzMuIEluc2VydGlvbiBoaW50cyBpbiBhc3NvY2lhdGl2ZSBjb250YWluZXJzLgorICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF9sb3dlcihfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX195LCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjZW5kaWYKKworICAgICAgX0xpbmtfdHlwZQorICAgICAgX01fY29weShfQ29uc3RfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ApOworCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZShfTGlua190eXBlIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9sb3dlcl9ib3VuZChfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ksCisJCSAgICAgY29uc3QgX0tleSYgX19rKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIF9NX2xvd2VyX2JvdW5kKF9Db25zdF9MaW5rX3R5cGUgX194LCBfQ29uc3RfTGlua190eXBlIF9feSwKKwkJICAgICBjb25zdCBfS2V5JiBfX2spIGNvbnN0OworCisgICAgICBpdGVyYXRvcgorICAgICAgX01fdXBwZXJfYm91bmQoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX195LAorCQkgICAgIGNvbnN0IF9LZXkmIF9fayk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBfTV91cHBlcl9ib3VuZChfQ29uc3RfTGlua190eXBlIF9feCwgX0NvbnN0X0xpbmtfdHlwZSBfX3ksCisJCSAgICAgY29uc3QgX0tleSYgX19rKSBjb25zdDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgICAgICBfUmJfdHJlZSgpIHsgfQorCisgICAgICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faW1wbChfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIF9SYl90cmVlKGNvbnN0IF9SYl90cmVlJiBfX3gpCisgICAgICA6IF9NX2ltcGwoX194Ll9NX2ltcGwuX01fa2V5X2NvbXBhcmUsIF9feC5fTV9nZXRfTm9kZV9hbGxvY2F0b3IoKSkKKyAgICAgIHsKKwlpZiAoX194Ll9NX3Jvb3QoKSAhPSAwKQorCSAgeworCSAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9iZWdpbigpLCBfTV9lbmQoKSk7CisJICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CisJICAgIF9NX3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOworCSAgICBfTV9pbXBsLl9NX25vZGVfY291bnQgPSBfX3guX01faW1wbC5fTV9ub2RlX2NvdW50OworCSAgfQorICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9SYl90cmVlKF9SYl90cmVlJiYgX194KTsKKyNlbmRpZgorCisgICAgICB+X1JiX3RyZWUoKQorICAgICAgeyBfTV9lcmFzZShfTV9iZWdpbigpKTsgfQorCisgICAgICBfUmJfdHJlZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUmJfdHJlZSYgX194KTsKKworICAgICAgLy8gQWNjZXNzb3JzLgorICAgICAgX0NvbXBhcmUKKyAgICAgIGtleV9jb21wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX01fa2V5X2NvbXBhcmU7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgCisJcmV0dXJuIGl0ZXJhdG9yKHN0YXRpY19jYXN0PF9MaW5rX3R5cGU+CisJCQkodGhpcy0+X01faW1wbC5fTV9oZWFkZXIuX01fbGVmdCkpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyAKKwlyZXR1cm4gY29uc3RfaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4KKwkJCSAgICAgICh0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9sZWZ0KSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8X0xpbmtfdHlwZT4oJnRoaXMtPl9NX2ltcGwuX01faGVhZGVyKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IAorCXJldHVybiBjb25zdF9pdGVyYXRvcihzdGF0aWNfY2FzdDxfQ29uc3RfTGlua190eXBlPgorCQkJICAgICAgKCZ0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcikpOworICAgICAgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW1wbC5fTV9ub2RlX2NvdW50ID09IDA7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ltcGwuX01fbm9kZV9jb3VudDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLm1heF9zaXplKCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChfUmJfdHJlZSYgX190KTsgICAgICAKKworICAgICAgLy8gSW5zZXJ0L2VyYXNlLgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgICBfTV9pbnNlcnRfdW5pcXVlKF9BcmcmJiBfX3gpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBfTV9pbnNlcnRfZXF1YWwoX0FyZyYmIF9feCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIF9NX2luc2VydF91bmlxdWVfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmcmJiBfX3gpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBfTV9pbnNlcnRfZXF1YWxfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmcmJiBfX3gpOworI2Vsc2UKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBfTV9pbnNlcnRfdW5pcXVlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2luc2VydF91bmlxdWVfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfZXF1YWxfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5zZXJ0X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfZXF1YWwoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9hdXgoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX2F1eChjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpOworCisgICAgcHVibGljOgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwljb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9IF9fcG9zaXRpb247CisJKytfX3Jlc3VsdDsKKwlfTV9lcmFzZV9hdXgoX19wb3NpdGlvbik7CisJcmV0dXJuIF9fcmVzdWx0Ll9NX2NvbnN0X2Nhc3QoKTsKKyAgICAgIH0KKworICAgICAgLy8gTFdHIDIwNTkuCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpdGVyYXRvciBfX3Jlc3VsdCA9IF9fcG9zaXRpb247CisJKytfX3Jlc3VsdDsKKwlfTV9lcmFzZV9hdXgoX19wb3NpdGlvbik7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9NX2VyYXNlX2F1eChfX3Bvc2l0aW9uKTsgfQorCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfTV9lcmFzZV9hdXgoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAxMzAuIEFzc29jaWF0aXZlIGVyYXNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9NX2VyYXNlX2F1eChfX2ZpcnN0LCBfX2xhc3QpOworCXJldHVybiBfX2xhc3QuX01fY29uc3RfY2FzdCgpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX01fZXJhc2VfYXV4KF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfTV9lcmFzZV9hdXgoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisgICAgICB2b2lkCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSogX19maXJzdCwgY29uc3Qga2V5X3R5cGUqIF9fbGFzdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsKKyAgICAgICAgX01fZXJhc2UoX01fYmVnaW4oKSk7CisgICAgICAgIF9NX2xlZnRtb3N0KCkgPSBfTV9lbmQoKTsKKyAgICAgICAgX01fcm9vdCgpID0gMDsKKyAgICAgICAgX01fcmlnaHRtb3N0KCkgPSBfTV9lbmQoKTsKKyAgICAgICAgX01faW1wbC5fTV9ub2RlX2NvdW50ID0gMDsKKyAgICAgIH0KKworICAgICAgLy8gU2V0IG9wZXJhdGlvbnMuCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKQorICAgICAgeyByZXR1cm4gX01fbG93ZXJfYm91bmQoX01fYmVnaW4oKSwgX01fZW5kKCksIF9fayk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sb3dlcl9ib3VuZChfTV9iZWdpbigpLCBfTV9lbmQoKSwgX19rKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsgcmV0dXJuIF9NX3VwcGVyX2JvdW5kKF9NX2JlZ2luKCksIF9NX2VuZCgpLCBfX2spOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdXBwZXJfYm91bmQoX01fYmVnaW4oKSwgX01fZW5kKCksIF9fayk7IH0KKworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdDsKKworICAgICAgLy8gRGVidWdnaW5nLgorICAgICAgYm9vbAorICAgICAgX19yYl92ZXJpZnkoKSBjb25zdDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeworICAgICAgcmV0dXJuIF9feC5zaXplKCkgPT0gX195LnNpemUoKQorCSAgICAgJiYgc3RkOjplcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3kuYmVnaW4oKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksIAorCQkJCQkgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194LAorCSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX1JiX3RyZWUoX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiYgX194KQorICAgIDogX01faW1wbChfX3guX01faW1wbC5fTV9rZXlfY29tcGFyZSwgX194Ll9NX2dldF9Ob2RlX2FsbG9jYXRvcigpKQorICAgIHsKKyAgICAgIGlmIChfX3guX01fcm9vdCgpICE9IDApCisJeworCSAgX01fcm9vdCgpID0gX194Ll9NX3Jvb3QoKTsKKwkgIF9NX2xlZnRtb3N0KCkgPSBfX3guX01fbGVmdG1vc3QoKTsKKwkgIF9NX3JpZ2h0bW9zdCgpID0gX194Ll9NX3JpZ2h0bW9zdCgpOworCSAgX01fcm9vdCgpLT5fTV9wYXJlbnQgPSBfTV9lbmQoKTsKKworCSAgX194Ll9NX3Jvb3QoKSA9IDA7CisJICBfX3guX01fbGVmdG1vc3QoKSA9IF9feC5fTV9lbmQoKTsKKwkgIF9feC5fTV9yaWdodG1vc3QoKSA9IF9feC5fTV9lbmQoKTsKKworCSAgdGhpcy0+X01faW1wbC5fTV9ub2RlX2NvdW50ID0gX194Ll9NX2ltcGwuX01fbm9kZV9jb3VudDsKKwkgIF9feC5fTV9pbXBsLl9NX25vZGVfY291bnQgPSAwOworCX0KKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4mCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvcj0oY29uc3QgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0gJl9feCkKKwl7CisJICAvLyBOb3RlIHRoYXQgX0tleSBtYXkgYmUgYSBjb25zdGFudCB0eXBlLgorCSAgY2xlYXIoKTsKKwkgIF9NX2ltcGwuX01fa2V5X2NvbXBhcmUgPSBfX3guX01faW1wbC5fTV9rZXlfY29tcGFyZTsKKwkgIGlmIChfX3guX01fcm9vdCgpICE9IDApCisJICAgIHsKKwkgICAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9iZWdpbigpLCBfTV9lbmQoKSk7CisJICAgICAgX01fbGVmdG1vc3QoKSA9IF9TX21pbmltdW0oX01fcm9vdCgpKTsKKwkgICAgICBfTV9yaWdodG1vc3QoKSA9IF9TX21heGltdW0oX01fcm9vdCgpKTsKKwkgICAgICBfTV9pbXBsLl9NX25vZGVfY291bnQgPSBfX3guX01faW1wbC5fTV9ub2RlX2NvdW50OworCSAgICB9CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIF9NX2luc2VydF8oX0NvbnN0X0Jhc2VfcHRyIF9feCwgX0NvbnN0X0Jhc2VfcHRyIF9fcCwgX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0XyhfQ29uc3RfQmFzZV9wdHIgX194LCBfQ29uc3RfQmFzZV9wdHIgX19wLCBjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBib29sIF9faW5zZXJ0X2xlZnQgPSAoX194ICE9IDAgfHwgX19wID09IF9NX2VuZCgpCisJCQkgICAgfHwgX01faW1wbC5fTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIAorCQkJCQkJICAgICAgX1Nfa2V5KF9fcCkpKTsKKworICAgICAgX0xpbmtfdHlwZSBfX3ogPSBfTV9jcmVhdGVfbm9kZShfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCisgICAgICBfUmJfdHJlZV9pbnNlcnRfYW5kX3JlYmFsYW5jZShfX2luc2VydF9sZWZ0LCBfX3osCisJCQkJICAgIGNvbnN0X2Nhc3Q8X0Jhc2VfcHRyPihfX3ApLCAgCisJCQkJICAgIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyKTsKKyAgICAgICsrX01faW1wbC5fTV9ub2RlX2NvdW50OworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9feik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyNlbmRpZgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgX01faW5zZXJ0X2xvd2VyKF9CYXNlX3B0ciBfX3gsIF9CYXNlX3B0ciBfX3AsIF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF9sb3dlcihfQmFzZV9wdHIgX194LCBfQmFzZV9wdHIgX19wLCBjb25zdCBfVmFsJiBfX3YpCisjZW5kaWYKKyAgICB7CisgICAgICBib29sIF9faW5zZXJ0X2xlZnQgPSAoX194ICE9IDAgfHwgX19wID09IF9NX2VuZCgpCisJCQkgICAgfHwgIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fcCksCisJCQkJCQkgICAgICAgX0tleU9mVmFsdWUoKShfX3YpKSk7CisKKyAgICAgIF9MaW5rX3R5cGUgX196ID0gX01fY3JlYXRlX25vZGUoX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKworICAgICAgX1JiX3RyZWVfaW5zZXJ0X2FuZF9yZWJhbGFuY2UoX19pbnNlcnRfbGVmdCwgX196LCBfX3AsICAKKwkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9oZWFkZXIpOworICAgICAgKytfTV9pbXBsLl9NX25vZGVfY291bnQ7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICBfTV9pbnNlcnRfZXF1YWxfbG93ZXIoX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0X2VxdWFsX2xvd2VyKGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIF9MaW5rX3R5cGUgX194ID0gX01fYmVnaW4oKTsKKyAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fZW5kKCk7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgX195ID0gX194OworCSAgX194ID0gIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9LZXlPZlZhbHVlKCkoX192KSkgPworCSAgICAgICAgX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKKwl9CisgICAgICByZXR1cm4gX01faW5zZXJ0X2xvd2VyKF9feCwgX195LCBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS29WLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9Lb1YsIF9Db21wYXJlLCBfQWxsb2M+OjpfTGlua190eXBlCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tvViwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2NvcHkoX0NvbnN0X0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX19wKQorICAgIHsKKyAgICAgIC8vIFN0cnVjdHVyYWwgY29weS4gIF9feCBhbmQgX19wIG11c3QgYmUgbm9uLW51bGwuCisgICAgICBfTGlua190eXBlIF9fdG9wID0gX01fY2xvbmVfbm9kZShfX3gpOworICAgICAgX190b3AtPl9NX3BhcmVudCA9IF9fcDsKKworICAgICAgX190cnkKKwl7CisJICBpZiAoX194LT5fTV9yaWdodCkKKwkgICAgX190b3AtPl9NX3JpZ2h0ID0gX01fY29weShfU19yaWdodChfX3gpLCBfX3RvcCk7CisJICBfX3AgPSBfX3RvcDsKKwkgIF9feCA9IF9TX2xlZnQoX194KTsKKworCSAgd2hpbGUgKF9feCAhPSAwKQorCSAgICB7CisJICAgICAgX0xpbmtfdHlwZSBfX3kgPSBfTV9jbG9uZV9ub2RlKF9feCk7CisJICAgICAgX19wLT5fTV9sZWZ0ID0gX195OworCSAgICAgIF9feS0+X01fcGFyZW50ID0gX19wOworCSAgICAgIGlmIChfX3gtPl9NX3JpZ2h0KQorCQlfX3ktPl9NX3JpZ2h0ID0gX01fY29weShfU19yaWdodChfX3gpLCBfX3kpOworCSAgICAgIF9fcCA9IF9feTsKKwkgICAgICBfX3ggPSBfU19sZWZ0KF9feCk7CisJICAgIH0KKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9lcmFzZShfX3RvcCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgICByZXR1cm4gX190b3A7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlKF9MaW5rX3R5cGUgX194KQorICAgIHsKKyAgICAgIC8vIEVyYXNlIHdpdGhvdXQgcmViYWxhbmNpbmcuCisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgX01fZXJhc2UoX1NfcmlnaHQoX194KSk7CisJICBfTGlua190eXBlIF9feSA9IF9TX2xlZnQoX194KTsKKwkgIF9NX2Rlc3Ryb3lfbm9kZShfX3gpOworCSAgX194ID0gX195OworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCSAgICAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fbG93ZXJfYm91bmQoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX195LAorCQkgICBjb25zdCBfS2V5JiBfX2spCisgICAgeworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCWlmICghX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKKwkgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCWVsc2UKKwkgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisgICAgICByZXR1cm4gaXRlcmF0b3IoX195KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCSAgICAgIF9Db21wYXJlLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fbG93ZXJfYm91bmQoX0NvbnN0X0xpbmtfdHlwZSBfX3gsIF9Db25zdF9MaW5rX3R5cGUgX195LAorCQkgICBjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgeworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCWlmICghX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKKwkgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCWVsc2UKKwkgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX195KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCSAgICAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fdXBwZXJfYm91bmQoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX195LAorCQkgICBjb25zdCBfS2V5JiBfX2spCisgICAgeworICAgICAgd2hpbGUgKF9feCAhPSAwKQorCWlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpKQorCSAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJZWxzZQorCSAgX194ID0gX1NfcmlnaHQoX194KTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX3kpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJICAgICAgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBfTV91cHBlcl9ib3VuZChfQ29uc3RfTGlua190eXBlIF9feCwgX0NvbnN0X0xpbmtfdHlwZSBfX3ksCisJCSAgIGNvbnN0IF9LZXkmIF9faykgY29uc3QKKyAgICB7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSkpCisJICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwllbHNlCisJICBfX3ggPSBfU19yaWdodChfX3gpOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9feSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6aXRlcmF0b3IsCisJIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgZXF1YWxfcmFuZ2UoY29uc3QgX0tleSYgX19rKQorICAgIHsKKyAgICAgIF9MaW5rX3R5cGUgX194ID0gX01fYmVnaW4oKTsKKyAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fZW5kKCk7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCisJICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CisJICBlbHNlIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpKQorCSAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9MaW5rX3R5cGUgX194dShfX3gpLCBfX3l1KF9feSk7CisJICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CisJICAgICAgX194dSA9IF9TX3JpZ2h0KF9feHUpOworCSAgICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLAorCQkgICAgICAgICAgaXRlcmF0b3I+KF9NX2xvd2VyX2JvdW5kKF9feCwgX195LCBfX2spLAorCQkJCSAgICBfTV91cHBlcl9ib3VuZChfX3h1LCBfX3l1LCBfX2spKTsKKwkgICAgfQorCX0KKyAgICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4oaXRlcmF0b3IoX195KSwKKwkJCQkgICAgICBpdGVyYXRvcihfX3kpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwKKwkJCSAgIF9Db21wYXJlLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciwKKwkgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCQkgICBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3I+CisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgeworICAgICAgX0NvbnN0X0xpbmtfdHlwZSBfX3ggPSBfTV9iZWdpbigpOworICAgICAgX0NvbnN0X0xpbmtfdHlwZSBfX3kgPSBfTV9lbmQoKTsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwl7CisJICBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKKwkgICAgX194ID0gX1NfcmlnaHQoX194KTsKKwkgIGVsc2UgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSkpCisJICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX0NvbnN0X0xpbmtfdHlwZSBfX3h1KF9feCksIF9feXUoX195KTsKKwkgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKKwkgICAgICBfX3h1ID0gX1NfcmlnaHQoX194dSk7CisJICAgICAgcmV0dXJuIHBhaXI8Y29uc3RfaXRlcmF0b3IsCisJCSAgICAgICAgICBjb25zdF9pdGVyYXRvcj4oX01fbG93ZXJfYm91bmQoX194LCBfX3ksIF9fayksCisJCQkJCSAgX01fdXBwZXJfYm91bmQoX194dSwgX195dSwgX19rKSk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+KGNvbnN0X2l0ZXJhdG9yKF9feSksCisJCQkJCQkgIGNvbnN0X2l0ZXJhdG9yKF9feSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBzd2FwKF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPiYgX190KQorICAgIHsKKyAgICAgIGlmIChfTV9yb290KCkgPT0gMCkKKwl7CisJICBpZiAoX190Ll9NX3Jvb3QoKSAhPSAwKQorCSAgICB7CisJICAgICAgX01fcm9vdCgpID0gX190Ll9NX3Jvb3QoKTsKKwkgICAgICBfTV9sZWZ0bW9zdCgpID0gX190Ll9NX2xlZnRtb3N0KCk7CisJICAgICAgX01fcmlnaHRtb3N0KCkgPSBfX3QuX01fcmlnaHRtb3N0KCk7CisJICAgICAgX01fcm9vdCgpLT5fTV9wYXJlbnQgPSBfTV9lbmQoKTsKKwkgICAgICAKKwkgICAgICBfX3QuX01fcm9vdCgpID0gMDsKKwkgICAgICBfX3QuX01fbGVmdG1vc3QoKSA9IF9fdC5fTV9lbmQoKTsKKwkgICAgICBfX3QuX01fcmlnaHRtb3N0KCkgPSBfX3QuX01fZW5kKCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlIGlmIChfX3QuX01fcm9vdCgpID09IDApCisJeworCSAgX190Ll9NX3Jvb3QoKSA9IF9NX3Jvb3QoKTsKKwkgIF9fdC5fTV9sZWZ0bW9zdCgpID0gX01fbGVmdG1vc3QoKTsKKwkgIF9fdC5fTV9yaWdodG1vc3QoKSA9IF9NX3JpZ2h0bW9zdCgpOworCSAgX190Ll9NX3Jvb3QoKS0+X01fcGFyZW50ID0gX190Ll9NX2VuZCgpOworCSAgCisJICBfTV9yb290KCkgPSAwOworCSAgX01fbGVmdG1vc3QoKSA9IF9NX2VuZCgpOworCSAgX01fcmlnaHRtb3N0KCkgPSBfTV9lbmQoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgc3RkOjpzd2FwKF9NX3Jvb3QoKSxfX3QuX01fcm9vdCgpKTsKKwkgIHN0ZDo6c3dhcChfTV9sZWZ0bW9zdCgpLF9fdC5fTV9sZWZ0bW9zdCgpKTsKKwkgIHN0ZDo6c3dhcChfTV9yaWdodG1vc3QoKSxfX3QuX01fcmlnaHRtb3N0KCkpOworCSAgCisJICBfTV9yb290KCktPl9NX3BhcmVudCA9IF9NX2VuZCgpOworCSAgX190Ll9NX3Jvb3QoKS0+X01fcGFyZW50ID0gX190Ll9NX2VuZCgpOworCX0KKyAgICAgIC8vIE5vIG5lZWQgdG8gc3dhcCBoZWFkZXIncyBjb2xvciBhcyBpdCBkb2VzIG5vdCBjaGFuZ2UuCisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9ub2RlX2NvdW50LCBfX3QuX01faW1wbC5fTV9ub2RlX2NvdW50KTsKKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9pbXBsLl9NX2tleV9jb21wYXJlLCBfX3QuX01faW1wbC5fTV9rZXlfY29tcGFyZSk7CisgICAgICAKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPF9Ob2RlX2FsbG9jYXRvcj46OgorCV9TX2RvX2l0KF9NX2dldF9Ob2RlX2FsbG9jYXRvcigpLCBfX3QuX01fZ2V0X05vZGVfYWxsb2NhdG9yKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICBwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLAorCQkJICAgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yLCBib29sPgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICBfTV9pbnNlcnRfdW5pcXVlKF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF91bmlxdWUoY29uc3QgX1ZhbCYgX192KQorI2VuZGlmCisgICAgeworICAgICAgX0xpbmtfdHlwZSBfX3ggPSBfTV9iZWdpbigpOworICAgICAgX0xpbmtfdHlwZSBfX3kgPSBfTV9lbmQoKTsKKyAgICAgIGJvb2wgX19jb21wID0gdHJ1ZTsKKyAgICAgIHdoaWxlIChfX3ggIT0gMCkKKwl7CisJICBfX3kgPSBfX3g7CisJICBfX2NvbXAgPSBfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192KSwgX1Nfa2V5KF9feCkpOworCSAgX194ID0gX19jb21wID8gX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKKwl9CisgICAgICBpdGVyYXRvciBfX2ogPSBpdGVyYXRvcihfX3kpOworICAgICAgaWYgKF9fY29tcCkKKwl7CisJICBpZiAoX19qID09IGJlZ2luKCkpCisJICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPgorCSAgICAgIChfTV9pbnNlcnRfKF9feCwgX195LCBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpLCB0cnVlKTsKKwkgIGVsc2UKKwkgICAgLS1fX2o7CisJfQorICAgICAgaWYgKF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fai5fTV9ub2RlKSwgX0tleU9mVmFsdWUoKShfX3YpKSkKKwlyZXR1cm4gcGFpcjxpdGVyYXRvciwgYm9vbD4KKwkgIChfTV9pbnNlcnRfKF9feCwgX195LCBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpLCB0cnVlKTsKKyAgICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLCBib29sPihfX2osIGZhbHNlKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICBfTV9pbnNlcnRfZXF1YWwoX0FyZyYmIF9fdikKKyNlbHNlCisgICAgX01faW5zZXJ0X2VxdWFsKGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIF9MaW5rX3R5cGUgX194ID0gX01fYmVnaW4oKTsKKyAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fZW5kKCk7CisgICAgICB3aGlsZSAoX194ICE9IDApCisJeworCSAgX195ID0gX194OworCSAgX194ID0gX01faW1wbC5fTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tleShfX3gpKSA/CisJICAgICAgICBfU19sZWZ0KF9feCkgOiBfU19yaWdodChfX3gpOworCX0KKyAgICAgIHJldHVybiBfTV9pbnNlcnRfKF9feCwgX195LCBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisjZW5kaWYKKyAgICB0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIF9NX2luc2VydF91bmlxdWVfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF91bmlxdWVfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9WYWwmIF9fdikKKyNlbmRpZgorICAgIHsKKyAgICAgIC8vIGVuZCgpCisgICAgICBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IF9NX2VuZCgpKQorCXsKKwkgIGlmIChzaXplKCkgPiAwCisJICAgICAgJiYgX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX01fcmlnaHRtb3N0KCkpLCAKKwkJCQkJX0tleU9mVmFsdWUoKShfX3YpKSkKKwkgICAgcmV0dXJuIF9NX2luc2VydF8oMCwgX01fcmlnaHRtb3N0KCksIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICBlbHNlCisJICAgIHJldHVybiBfTV9pbnNlcnRfdW5pcXVlKF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSkuZmlyc3Q7CisJfQorICAgICAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksCisJCQkJICAgICAgX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSkpKQorCXsKKwkgIC8vIEZpcnN0LCB0cnkgYmVmb3JlLi4uCisJICBjb25zdF9pdGVyYXRvciBfX2JlZm9yZSA9IF9fcG9zaXRpb247CisJICBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IF9NX2xlZnRtb3N0KCkpIC8vIGJlZ2luKCkKKwkgICAgcmV0dXJuIF9NX2luc2VydF8oX01fbGVmdG1vc3QoKSwgX01fbGVmdG1vc3QoKSwKKwkJCSAgICAgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICBlbHNlIGlmIChfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleSgoLS1fX2JlZm9yZSkuX01fbm9kZSksIAorCQkJCQkgIF9LZXlPZlZhbHVlKCkoX192KSkpCisJICAgIHsKKwkgICAgICBpZiAoX1NfcmlnaHQoX19iZWZvcmUuX01fbm9kZSkgPT0gMCkKKwkJcmV0dXJuIF9NX2luc2VydF8oMCwgX19iZWZvcmUuX01fbm9kZSwKKwkJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICAgICAgZWxzZQorCQlyZXR1cm4gX01faW5zZXJ0XyhfX3Bvc2l0aW9uLl9NX25vZGUsCisJCQkJICBfX3Bvc2l0aW9uLl9NX25vZGUsCisJCQkJICBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfTV9pbnNlcnRfdW5pcXVlKF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSkuZmlyc3Q7CisJfQorICAgICAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX19wb3NpdGlvbi5fTV9ub2RlKSwKKwkJCQkgICAgICBfS2V5T2ZWYWx1ZSgpKF9fdikpKQorCXsKKwkgIC8vIC4uLiB0aGVuIHRyeSBhZnRlci4KKwkgIGNvbnN0X2l0ZXJhdG9yIF9fYWZ0ZXIgPSBfX3Bvc2l0aW9uOworCSAgaWYgKF9fcG9zaXRpb24uX01fbm9kZSA9PSBfTV9yaWdodG1vc3QoKSkKKwkgICAgcmV0dXJuIF9NX2luc2VydF8oMCwgX01fcmlnaHRtb3N0KCksCisJCQkgICAgICBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCSAgZWxzZSBpZiAoX01faW1wbC5fTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksCisJCQkJCSAgX1Nfa2V5KCgrK19fYWZ0ZXIpLl9NX25vZGUpKSkKKwkgICAgeworCSAgICAgIGlmIChfU19yaWdodChfX3Bvc2l0aW9uLl9NX25vZGUpID09IDApCisJCXJldHVybiBfTV9pbnNlcnRfKDAsIF9fcG9zaXRpb24uX01fbm9kZSwKKwkJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICAgICAgZWxzZQorCQlyZXR1cm4gX01faW5zZXJ0XyhfX2FmdGVyLl9NX25vZGUsIF9fYWZ0ZXIuX01fbm9kZSwKKwkJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9NX2luc2VydF91bmlxdWUoX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKS5maXJzdDsKKwl9CisgICAgICBlbHNlCisJLy8gRXF1aXZhbGVudCBrZXlzLgorCXJldHVybiBfX3Bvc2l0aW9uLl9NX2NvbnN0X2Nhc3QoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorI2VuZGlmCisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICBfTV9pbnNlcnRfZXF1YWxfKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmcmJiBfX3YpCisjZWxzZQorICAgIF9NX2luc2VydF9lcXVhbF8oY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1ZhbCYgX192KQorI2VuZGlmCisgICAgeworICAgICAgLy8gZW5kKCkKKyAgICAgIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gX01fZW5kKCkpCisJeworCSAgaWYgKHNpemUoKSA+IDAKKwkgICAgICAmJiAhX01faW1wbC5fTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksCisJCQkJCSBfU19rZXkoX01fcmlnaHRtb3N0KCkpKSkKKwkgICAgcmV0dXJuIF9NX2luc2VydF8oMCwgX01fcmlnaHRtb3N0KCksCisJCQkgICAgICBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCSAgZWxzZQorCSAgICByZXR1cm4gX01faW5zZXJ0X2VxdWFsKF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJfQorICAgICAgZWxzZSBpZiAoIV9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSksCisJCQkJICAgICAgIF9LZXlPZlZhbHVlKCkoX192KSkpCisJeworCSAgLy8gRmlyc3QsIHRyeSBiZWZvcmUuLi4KKwkgIGNvbnN0X2l0ZXJhdG9yIF9fYmVmb3JlID0gX19wb3NpdGlvbjsKKwkgIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gX01fbGVmdG1vc3QoKSkgLy8gYmVnaW4oKQorCSAgICByZXR1cm4gX01faW5zZXJ0XyhfTV9sZWZ0bW9zdCgpLCBfTV9sZWZ0bW9zdCgpLAorCQkJICAgICAgX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKwkgIGVsc2UgaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192KSwKKwkJCQkJICAgX1Nfa2V5KCgtLV9fYmVmb3JlKS5fTV9ub2RlKSkpCisJICAgIHsKKwkgICAgICBpZiAoX1NfcmlnaHQoX19iZWZvcmUuX01fbm9kZSkgPT0gMCkKKwkJcmV0dXJuIF9NX2luc2VydF8oMCwgX19iZWZvcmUuX01fbm9kZSwKKwkJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICAgICAgZWxzZQorCQlyZXR1cm4gX01faW5zZXJ0XyhfX3Bvc2l0aW9uLl9NX25vZGUsCisJCQkJICBfX3Bvc2l0aW9uLl9NX25vZGUsCisJCQkJICBfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCSAgICB9CisJICBlbHNlCisJICAgIHJldHVybiBfTV9pbnNlcnRfZXF1YWwoX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgLy8gLi4uIHRoZW4gdHJ5IGFmdGVyLiAgCisJICBjb25zdF9pdGVyYXRvciBfX2FmdGVyID0gX19wb3NpdGlvbjsKKwkgIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gX01fcmlnaHRtb3N0KCkpCisJICAgIHJldHVybiBfTV9pbnNlcnRfKDAsIF9NX3JpZ2h0bW9zdCgpLAorCQkJICAgICAgX0dMSUJDWFhfRk9SV0FSRChfQXJnLCBfX3YpKTsKKwkgIGVsc2UgaWYgKCFfTV9pbXBsLl9NX2tleV9jb21wYXJlKF9TX2tleSgoKytfX2FmdGVyKS5fTV9ub2RlKSwKKwkJCQkJICAgX0tleU9mVmFsdWUoKShfX3YpKSkKKwkgICAgeworCSAgICAgIGlmIChfU19yaWdodChfX3Bvc2l0aW9uLl9NX25vZGUpID09IDApCisJCXJldHVybiBfTV9pbnNlcnRfKDAsIF9fcG9zaXRpb24uX01fbm9kZSwKKwkJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICAgICAgZWxzZQorCQlyZXR1cm4gX01faW5zZXJ0XyhfX2FmdGVyLl9NX25vZGUsIF9fYWZ0ZXIuX01fbm9kZSwKKwkJCQkgIF9HTElCQ1hYX0ZPUldBUkQoX0FyZywgX192KSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgcmV0dXJuIF9NX2luc2VydF9lcXVhbF9sb3dlcihfR0xJQkNYWF9GT1JXQVJEKF9BcmcsIF9fdikpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tvViwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NtcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPGNsYXNzIF9JST4KKyAgICAgIHZvaWQKKyAgICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9Lb1YsIF9DbXAsIF9BbGxvYz46OgorICAgICAgX01faW5zZXJ0X3VuaXF1ZShfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkKKyAgICAgIHsKKwlmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwkgIF9NX2luc2VydF91bmlxdWVfKGVuZCgpLCAqX19maXJzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tvViwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NtcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPGNsYXNzIF9JST4KKyAgICAgIHZvaWQKKyAgICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9Lb1YsIF9DbXAsIF9BbGxvYz46OgorICAgICAgX01faW5zZXJ0X2VxdWFsKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0KQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgX01faW5zZXJ0X2VxdWFsXyhlbmQoKSwgKl9fZmlyc3QpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlX2F1eChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgIHsKKyAgICAgIF9MaW5rX3R5cGUgX195ID0KKwlzdGF0aWNfY2FzdDxfTGlua190eXBlPihfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlCisJCQkJKGNvbnN0X2Nhc3Q8X0Jhc2VfcHRyPihfX3Bvc2l0aW9uLl9NX25vZGUpLAorCQkJCSB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlcikpOworICAgICAgX01fZGVzdHJveV9ub2RlKF9feSk7CisgICAgICAtLV9NX2ltcGwuX01fbm9kZV9jb3VudDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgX01fZXJhc2VfYXV4KGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBiZWdpbigpICYmIF9fbGFzdCA9PSBlbmQoKSkKKwljbGVhcigpOworICAgICAgZWxzZQorCXdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIGVyYXNlKF9fZmlyc3QrKyk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBlcmFzZShjb25zdCBfS2V5JiBfX3gpCisgICAgeworICAgICAgcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+IF9fcCA9IGVxdWFsX3JhbmdlKF9feCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKKyAgICAgIGVyYXNlKF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICByZXR1cm4gX19vbGRfc2l6ZSAtIHNpemUoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgZXJhc2UoY29uc3QgX0tleSogX19maXJzdCwgY29uc3QgX0tleSogX19sYXN0KQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwllcmFzZSgqX19maXJzdCsrKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCSAgICAgIF9Db21wYXJlLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgZmluZChjb25zdCBfS2V5JiBfX2spCisgICAgeworICAgICAgaXRlcmF0b3IgX19qID0gX01fbG93ZXJfYm91bmQoX01fYmVnaW4oKSwgX01fZW5kKCksIF9fayk7CisgICAgICByZXR1cm4gKF9faiA9PSBlbmQoKQorCSAgICAgIHx8IF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLAorCQkJCQlfU19rZXkoX19qLl9NX25vZGUpKSkgPyBlbmQoKSA6IF9fajsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbCwgdHlwZW5hbWUgX0tleU9mVmFsdWUsCisgICAgICAgICAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsCisJCSAgICAgIF9Db21wYXJlLCBfQWxsb2M+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6CisgICAgZmluZChjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgeworICAgICAgY29uc3RfaXRlcmF0b3IgX19qID0gX01fbG93ZXJfYm91bmQoX01fYmVnaW4oKSwgX01fZW5kKCksIF9fayk7CisgICAgICByZXR1cm4gKF9faiA9PSBlbmQoKQorCSAgICAgIHx8IF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX19rLCAKKwkJCQkJX1Nfa2V5KF9fai5fTV9ub2RlKSkpID8gZW5kKCkgOiBfX2o7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWwsIHR5cGVuYW1lIF9LZXlPZlZhbHVlLAorICAgICAgICAgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWwsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJlLCBfQWxsb2M+OjoKKyAgICBjb3VudChjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgeworICAgICAgcGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+IF9fcCA9IGVxdWFsX3JhbmdlKF9fayk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uID0gc3RkOjpkaXN0YW5jZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOworICAgICAgcmV0dXJuIF9fbjsKKyAgICB9CisKKyAgX0dMSUJDWFhfUFVSRSB1bnNpZ25lZCBpbnQKKyAgX1JiX3RyZWVfYmxhY2tfY291bnQoY29uc3QgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9SYl90cmVlX25vZGVfYmFzZSogX19yb290KSB0aHJvdyAoKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsLCB0eXBlbmFtZSBfS2V5T2ZWYWx1ZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBib29sCisgICAgX1JiX3RyZWU8X0tleSxfVmFsLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46Ol9fcmJfdmVyaWZ5KCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01faW1wbC5fTV9ub2RlX2NvdW50ID09IDAgfHwgYmVnaW4oKSA9PSBlbmQoKSkKKwlyZXR1cm4gX01faW1wbC5fTV9ub2RlX2NvdW50ID09IDAgJiYgYmVnaW4oKSA9PSBlbmQoKQorCSAgICAgICAmJiB0aGlzLT5fTV9pbXBsLl9NX2hlYWRlci5fTV9sZWZ0ID09IF9NX2VuZCgpCisJICAgICAgICYmIHRoaXMtPl9NX2ltcGwuX01faGVhZGVyLl9NX3JpZ2h0ID09IF9NX2VuZCgpOworCisgICAgICB1bnNpZ25lZCBpbnQgX19sZW4gPSBfUmJfdHJlZV9ibGFja19jb3VudChfTV9sZWZ0bW9zdCgpLCBfTV9yb290KCkpOworICAgICAgZm9yIChjb25zdF9pdGVyYXRvciBfX2l0ID0gYmVnaW4oKTsgX19pdCAhPSBlbmQoKTsgKytfX2l0KQorCXsKKwkgIF9Db25zdF9MaW5rX3R5cGUgX194ID0gc3RhdGljX2Nhc3Q8X0NvbnN0X0xpbmtfdHlwZT4oX19pdC5fTV9ub2RlKTsKKwkgIF9Db25zdF9MaW5rX3R5cGUgX19MID0gX1NfbGVmdChfX3gpOworCSAgX0NvbnN0X0xpbmtfdHlwZSBfX1IgPSBfU19yaWdodChfX3gpOworCisJICBpZiAoX194LT5fTV9jb2xvciA9PSBfU19yZWQpCisJICAgIGlmICgoX19MICYmIF9fTC0+X01fY29sb3IgPT0gX1NfcmVkKQorCQl8fCAoX19SICYmIF9fUi0+X01fY29sb3IgPT0gX1NfcmVkKSkKKwkgICAgICByZXR1cm4gZmFsc2U7CisKKwkgIGlmIChfX0wgJiYgX01faW1wbC5fTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX1Nfa2V5KF9fTCkpKQorCSAgICByZXR1cm4gZmFsc2U7CisJICBpZiAoX19SICYmIF9NX2ltcGwuX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fUiksIF9TX2tleShfX3gpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBpZiAoIV9fTCAmJiAhX19SICYmIF9SYl90cmVlX2JsYWNrX2NvdW50KF9feCwgX01fcm9vdCgpKSAhPSBfX2xlbikKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworICAgICAgaWYgKF9NX2xlZnRtb3N0KCkgIT0gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9NX3Jvb3QoKSkpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKF9NX3JpZ2h0bW9zdCgpICE9IF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfTV9yb290KCkpKQorCXJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfdW5pbml0aWFsaXplZC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0bF91bmluaXRpYWxpemVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjZTU0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfdW5pbml0aWFsaXplZC5oCkBAIC0wLDAgKzEsNjU1IEBACisvLyBSYXcgbWVtb3J5IG1hbmlwdWxhdG9ycyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsCisvLyAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfdW5pbml0aWFsaXplZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX1NUTF9VTklOSVRJQUxJWkVEX0gKKyNkZWZpbmUgX1NUTF9VTklOSVRJQUxJWkVEX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8Ym9vbCBfVHJpdmlhbFZhbHVlVHlwZXM+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9jb3B5CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyBfRm9yd2FyZEl0ZXJhdG9yCisgICAgICAgIF9fdW5pbml0X2NvcHkoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0KQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19yZXN1bHQ7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QsICsrX19jdXIpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksICpfX2ZpcnN0KTsKKwkgICAgICByZXR1cm4gX19jdXI7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgc3RkOjpfRGVzdHJveShfX3Jlc3VsdCwgX19jdXIpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfY29weTx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICBzdGF0aWMgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgICBfX3VuaW5pdF9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICAgICAgeyByZXR1cm4gc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBpbnRvIHJlc3VsdC4KKyAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICBsYXN0ICAgQW4gaW5wdXQgaXRlcmF0b3IuCisgICAqICBAcGFyYW0gIHJlc3VsdCBBbiBvdXRwdXQgaXRlcmF0b3IuCisgICAqICBAcmV0dXJuICAgcmVzdWx0ICsgKGZpcnN0IC0gbGFzdCkKKyAgICoKKyAgICogIExpa2UgY29weSgpLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhbiBpbml0aWFsaXplZCBvdXRwdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgdW5pbml0aWFsaXplZF9jb3B5KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICByZXR1cm4gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weTwoX19pc190cml2aWFsKF9WYWx1ZVR5cGUxKQorCQkJCQkmJiBfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZTIpKT46OgorCV9fdW5pbml0X2NvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7CisgICAgfQorCisKKyAgdGVtcGxhdGU8Ym9vbCBfVHJpdmlhbFZhbHVlVHlwZT4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2ZpbGwKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdW5pbml0X2ZpbGwoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgY29uc3QgX1RwJiBfX3gpCisgICAgICAgIHsKKwkgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworCSAgX190cnkKKwkgICAgeworCSAgICAgIGZvciAoOyBfX2N1ciAhPSBfX2xhc3Q7ICsrX19jdXIpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksIF9feCk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1cik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9maWxsPHRydWU+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9maWxsKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIGNvbnN0IF9UcCYgX194KQorICAgICAgICB7IHN0ZDo6ZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgdmFsdWUgeCBpbnRvIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkuCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICB4ICAgICAgVGhlIHNvdXJjZSB2YWx1ZS4KKyAgICogIEByZXR1cm4gICBOb3RoaW5nLgorICAgKgorICAgKiAgTGlrZSBmaWxsKCksIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemVkIG91dHB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgICBjb25zdCBfVHAmIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGU7CisKKyAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGw8X19pc190cml2aWFsKF9WYWx1ZVR5cGUpPjo6CisJX191bmluaXRfZmlsbChfX2ZpcnN0LCBfX2xhc3QsIF9feCk7CisgICAgfQorCisKKyAgdGVtcGxhdGU8Ym9vbCBfVHJpdmlhbFZhbHVlVHlwZT4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2ZpbGxfbgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdW5pbml0X2ZpbGxfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwKKwkJCWNvbnN0IF9UcCYgX194KQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksIF9feCk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgc3RkOjpfRGVzdHJveShfX2ZpcnN0LCBfX2N1cik7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5pbml0aWFsaXplZF9maWxsX248dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgdm9pZAorICAgICAgICBfX3VuaW5pdF9maWxsX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJCQljb25zdCBfVHAmIF9feCkKKyAgICAgICAgeyBzdGQ6OmZpbGxfbihfX2ZpcnN0LCBfX24sIF9feCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENvcGllcyB0aGUgdmFsdWUgeCBpbnRvIHRoZSByYW5nZSBbZmlyc3QsZmlyc3QrbikuCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbiAgICAgIFRoZSBudW1iZXIgb2YgY29waWVzIHRvIG1ha2UuCisgICAqICBAcGFyYW0gIHggICAgICBUaGUgc291cmNlIHZhbHVlLgorICAgKiAgQHJldHVybiAgIE5vdGhpbmcuCisgICAqCisgICAqICBMaWtlIGZpbGxfbigpLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhbiBpbml0aWFsaXplZCBvdXRwdXQgcmFuZ2UuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgY29uc3QgX1RwJiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX248X19pc190cml2aWFsKF9WYWx1ZVR5cGUpPjo6CisJX191bmluaXRfZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194KTsKKyAgICB9CisKKyAgLy8gRXh0ZW5zaW9uczogdmVyc2lvbnMgb2YgdW5pbml0aWFsaXplZF9jb3B5LCB1bmluaXRpYWxpemVkX2ZpbGwsCisgIC8vICBhbmQgdW5pbml0aWFsaXplZF9maWxsX24gdGhhdCB0YWtlIGFuIGFsbG9jYXRvciBwYXJhbWV0ZXIuCisgIC8vICBXZSBkaXNwYXRjaCBiYWNrIHRvIHRoZSBzdGFuZGFyZCB2ZXJzaW9ucyB3aGVuIHdlJ3JlIGdpdmVuIHRoZQorICAvLyAgZGVmYXVsdCBhbGxvY2F0b3IuICBGb3Igbm9uZGVmYXVsdCBhbGxvY2F0b3JzIHdlIGRvIG5vdCB1c2UgCisgIC8vICBhbnkgb2YgdGhlIFBPRCBvcHRpbWl6YXRpb25zLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X2EoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19yZXN1bHQ7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0LCArK19fY3VyKQorCSAgICBfX2FsbG9jLmNvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksICpfX2ZpcnN0KTsKKwkgIHJldHVybiBfX2N1cjsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIGFsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX19maXJzdCksCisJCQkJCSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IoX19sYXN0KSwKKwkJCQkJIF9fcmVzdWx0LCBfX2FsbG9jKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBjb25zdCBfVHAmIF9feCwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yICg7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikKKwkgICAgX19hbGxvYy5jb25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCBfX3gpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgICBjb25zdCBfVHAmIF9feCwgYWxsb2NhdG9yPF9UcDI+JikKKyAgICB7IHN0ZDo6dW5pbml0aWFsaXplZF9maWxsKF9fZmlyc3QsIF9fbGFzdCwgX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICB2b2lkCisgICAgX191bmluaXRpYWxpemVkX2ZpbGxfbl9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLCAKKwkJCSAgICAgY29uc3QgX1RwJiBfX3gsIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fZmlyc3Q7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKKwkgICAgX19hbGxvYy5jb25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCBfX3gpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9UcDI+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIAorCQkJICAgICBjb25zdCBfVHAmIF9feCwgYWxsb2NhdG9yPF9UcDI+JikKKyAgICB7IHN0ZDo6dW5pbml0aWFsaXplZF9maWxsX24oX19maXJzdCwgX19uLCBfX3gpOyB9CisKKworICAvLyBFeHRlbnNpb25zOiBfX3VuaW5pdGlhbGl6ZWRfY29weV9tb3ZlLCBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9jb3B5LAorICAvLyBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9tb3ZlLCBfX3VuaW5pdGlhbGl6ZWRfbW92ZV9maWxsLgorICAvLyBBbGwgb2YgdGhlc2UgYWxnb3JpdGhtcyB0YWtlIGEgdXNlci1zdXBwbGllZCBhbGxvY2F0b3IsIHdoaWNoIGlzIHVzZWQKKyAgLy8gZm9yIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24uCisKKyAgLy8gX191bmluaXRpYWxpemVkX2NvcHlfbW92ZQorICAvLyBDb3BpZXMgW2ZpcnN0MSwgbGFzdDEpIGludG8gW3Jlc3VsdCwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSksIGFuZAorICAvLyAgbW92ZSBbZmlyc3QyLCBsYXN0MikgaW50bworICAvLyAgW3Jlc3VsdCwgcmVzdWx0ICsgKGxhc3QxIC0gZmlyc3QxKSArIChsYXN0MiAtIGZpcnN0MikpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMiwKKwkgICB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbW92ZShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2ZpcnN0MiwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyLAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCwKKwkJCSAgICAgIF9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCQkgICBfX3Jlc3VsdCwKKwkJCQkJCQkgICBfX2FsbG9jKTsKKyAgICAgIF9fdHJ5CisJeworCSAgcmV0dXJuIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpcnN0MiwgX19sYXN0MiwgX19taWQsIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fbWlkLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gX191bmluaXRpYWxpemVkX21vdmVfY29weQorICAvLyBNb3ZlcyBbZmlyc3QxLCBsYXN0MSkgaW50byBbcmVzdWx0LCByZXN1bHQgKyAobGFzdDEgLSBmaXJzdDEpKSwgYW5kCisgIC8vICBjb3BpZXMgW2ZpcnN0MiwgbGFzdDIpIGludG8KKyAgLy8gIFtyZXN1bHQsIHJlc3VsdCArIChsYXN0MSAtIGZpcnN0MSkgKyAobGFzdDIgLSBmaXJzdDIpKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjIsCisJICAgdHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgX0ZvcndhcmRJdGVyYXRvcgorICAgIF9fdW5pbml0aWFsaXplZF9tb3ZlX2NvcHkoX0lucHV0SXRlcmF0b3IxIF9fZmlyc3QxLAorCQkJICAgICAgX0lucHV0SXRlcmF0b3IxIF9fbGFzdDEsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisJCQkgICAgICBfSW5wdXRJdGVyYXRvcjIgX19sYXN0MiwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsCisJCQkgICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQgPSBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19maXJzdDEsIF9fbGFzdDEsCisJCQkJCQkJICAgX19yZXN1bHQsCisJCQkJCQkJICAgX19hbGxvYyk7CisgICAgICBfX3RyeQorCXsKKwkgIHJldHVybiBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdDIsIF9fbGFzdDIsIF9fbWlkLCBfX2FsbG9jKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX21pZCwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorICAKKyAgLy8gX191bmluaXRpYWxpemVkX2ZpbGxfbW92ZQorICAvLyBGaWxscyBbcmVzdWx0LCBtaWQpIHdpdGggeCwgYW5kIG1vdmVzIFtmaXJzdCwgbGFzdCkgaW50bworICAvLyAgW21pZCwgbWlkICsgKGxhc3QgLSBmaXJzdCkpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9tb3ZlKF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIF9Gb3J3YXJkSXRlcmF0b3IgX19taWQsCisJCQkgICAgICBjb25zdCBfVHAmIF9feCwgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoX19yZXN1bHQsIF9fbWlkLCBfX3gsIF9fYWxsb2MpOworICAgICAgX190cnkKKwl7CisJICByZXR1cm4gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fZmlyc3QsIF9fbGFzdCwgX19taWQsIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19yZXN1bHQsIF9fbWlkLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgLy8gX191bmluaXRpYWxpemVkX21vdmVfZmlsbAorICAvLyBNb3ZlcyBbZmlyc3QxLCBsYXN0MSkgaW50byBbZmlyc3QyLCBmaXJzdDIgKyAobGFzdDEgLSBmaXJzdDEpKSwgYW5kCisgIC8vICBmaWxscyBbZmlyc3QyICsgKGxhc3QxIC0gZmlyc3QxKSwgbGFzdDIpIHdpdGggeC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgX191bmluaXRpYWxpemVkX21vdmVfZmlsbChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0MSwgX0lucHV0SXRlcmF0b3IgX19sYXN0MSwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdDIsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdDIsIGNvbnN0IF9UcCYgX194LAorCQkJICAgICAgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkMiA9IHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYShfX2ZpcnN0MSwgX19sYXN0MSwKKwkJCQkJCQkgICAgX19maXJzdDIsCisJCQkJCQkJICAgIF9fYWxsb2MpOworICAgICAgX190cnkKKwl7CisJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX2EoX19taWQyLCBfX2xhc3QyLCBfX3gsIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdDIsIF9fbWlkMiwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgLy8gRXh0ZW5zaW9uczogX191bmluaXRpYWxpemVkX2RlZmF1bHQsIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X24sCisgIC8vIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EsIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYS4KKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF8xCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKQorCQlzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpKTsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX191bmluaXRpYWxpemVkX2RlZmF1bHRfMTx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICAgIHN0YXRpYyB2b2lkCisgICAgICAgIF9fdW5pbml0X2RlZmF1bHQoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwkgICAgX1ZhbHVlVHlwZTsKKworCSAgc3RkOjpmaWxsKF9fZmlyc3QsIF9fbGFzdCwgX1ZhbHVlVHlwZSgpKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTxib29sIF9Ucml2aWFsVmFsdWVUeXBlPgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uXzEKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uKQorICAgICAgICB7CisJICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19maXJzdDsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBmb3IgKDsgX19uID4gMDsgLS1fX24sICsrX19jdXIpCisJCXN0ZDo6X0NvbnN0cnVjdChzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1cikpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIpOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uXzE8dHJ1ZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICAgICAgc3RhdGljIHZvaWQKKyAgICAgICAgX191bmluaXRfZGVmYXVsdF9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgICBfVmFsdWVUeXBlOworCisJICBzdGQ6OmZpbGxfbihfX2ZpcnN0LCBfX24sIF9WYWx1ZVR5cGUoKSk7CisJfQorICAgIH07CisKKyAgLy8gX191bmluaXRpYWxpemVkX2RlZmF1bHQKKyAgLy8gRmlsbHMgW2ZpcnN0LCBsYXN0KSB3aXRoIHN0ZDo6ZGlzdGFuY2UoZmlyc3QsIGxhc3QpIGRlZmF1bHQKKyAgLy8gY29uc3RydWN0ZWQgdmFsdWVfdHlwZXMocykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0XzE8X19pc190cml2aWFsKF9WYWx1ZVR5cGUpPjo6CisJX191bmluaXRfZGVmYXVsdChfX2ZpcnN0LCBfX2xhc3QpOworICAgIH0KKworICAvLyBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uCisgIC8vIEZpbGxzIFtmaXJzdCwgZmlyc3QgKyBuKSB3aXRoIG4gZGVmYXVsdCBjb25zdHJ1Y3RlZCB2YWx1ZV90eXBlKHMpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24pCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlOworCisgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fMTxfX2lzX3RyaXZpYWwoX1ZhbHVlVHlwZSk+OjoKKwlfX3VuaW5pdF9kZWZhdWx0X24oX19maXJzdCwgX19uKTsKKyAgICB9CisKKyB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICBpbmxpbmUgYXV0bworICAgX0NvbnN0cnVjdF9kZWZhdWx0X2FfaW1wbChfVHAqIF9fcHRyLCBfQWxsb2NhdG9yJiBfX2FsbG9jLCB2b2lkKikKKyAgIC0+IGRlY2x0eXBlKF9fYWxsb2MuY29uc3RydWN0KF9fcHRyKSkKKyAgIHsgcmV0dXJuIF9fYWxsb2MuY29uc3RydWN0KF9fcHRyKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgIGlubGluZSB2b2lkCisgICBfQ29uc3RydWN0X2RlZmF1bHRfYV9pbXBsKF9UcCogX19wdHIsIF9BbGxvY2F0b3ImIF9fYWxsb2MsIC4uLikKKyAgIHsgX0NvbnN0cnVjdChfX3B0cik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICBpbmxpbmUgdm9pZAorICAgX0NvbnN0cnVjdF9kZWZhdWx0X2EoX1RwKiBfX3B0ciwgX0FsbG9jYXRvciYgX19hbGxvYykKKyAgIHsgX0NvbnN0cnVjdF9kZWZhdWx0X2FfaW1wbChfX3B0ciwgX19hbGxvYywgbnVsbHB0cik7IH0KKworICAvLyBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9hCisgIC8vIEZpbGxzIFtmaXJzdCwgbGFzdCkgd2l0aCBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KSBkZWZhdWx0CisgIC8vIGNvbnN0cnVjdGVkIHZhbHVlX3R5cGVzKHMpLCBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBhbGxvY2F0b3IgYWxsb2MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICBfQWxsb2NhdG9yJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19jdXIgPSBfX2ZpcnN0OworICAgICAgX190cnkKKwl7CisJICBmb3IgKDsgX19jdXIgIT0gX19sYXN0OyArK19fY3VyKQorCSAgICBfQ29uc3RydWN0X2RlZmF1bHRfYShzdGQ6Ol9fYWRkcmVzc29mKCpfX2N1ciksIF9fYWxsb2MpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6X0Rlc3Ryb3koX19maXJzdCwgX19jdXIsIF9fYWxsb2MpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9hKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkJICAgICAgYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKworICAvLyBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EKKyAgLy8gRmlsbHMgW2ZpcnN0LCBmaXJzdCArIG4pIHdpdGggbiBkZWZhdWx0IGNvbnN0cnVjdGVkIHZhbHVlX3R5cGVzKHMpLAorICAvLyBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBhbGxvY2F0b3IgYWxsb2MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sIAorCQkJCV9BbGxvY2F0b3ImIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2N1ciA9IF9fZmlyc3Q7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKKwkgICAgX0NvbnN0cnVjdF9kZWZhdWx0X2Eoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCBfX2FsbG9jKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fZmlyc3QsIF9fY3VyLCBfX2FsbG9jKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdW5pbml0aWFsaXplZF9kZWZhdWx0X25fYShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwgCisJCQkJYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uKF9fZmlyc3QsIF9fbik7IH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwKKwkgICB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fbiwKKwkJCSAgIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQsIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fY3VyID0gX19yZXN1bHQ7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX24gPiAwOyAtLV9fbiwgKytfX2ZpcnN0LCArK19fY3VyKQorCSAgICBzdGQ6Ol9Db25zdHJ1Y3Qoc3RkOjpfX2FkZHJlc3NvZigqX19jdXIpLCAqX19maXJzdCk7CisJICByZXR1cm4gX19jdXI7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgc3RkOjpfRGVzdHJveShfX3Jlc3VsdCwgX19jdXIpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLAorCSAgIHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgaW5saW5lIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX24sCisJCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fcmVzdWx0LAorCQkJICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19maXJzdCArIF9fbiwgX19yZXN1bHQpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsZmlyc3QrbikgaW50byByZXN1bHQuCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbiAgICAgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29weS4KKyAgICogIEBwYXJhbSAgcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gIHJlc3VsdCArIG4KKyAgICoKKyAgICogIExpa2UgY29weV9uKCksIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGFuIGluaXRpYWxpemVkIG91dHB1dCByYW5nZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgIGlubGluZSBfRm9yd2FyZEl0ZXJhdG9yCisgICAgdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19uLAorCQkJIF9Gb3J3YXJkSXRlcmF0b3IgX19yZXN1bHQpCisgICAgeyByZXR1cm4gc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9fZmlyc3QsIF9fbiwgX19yZXN1bHQsCisJCQkJCSBzdGQ6Ol9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NUTF9VTklOSVRJQUxJWkVEX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdGxfdmVjdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiN2ZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RsX3ZlY3Rvci5oCkBAIC0wLDAgKzEsMTM5OCBAQAorLy8gVmVjdG9yIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKy8vIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzICBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgYml0cy9zdGxfdmVjdG9yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2ZWN0b3J9CisgKi8KKworI2lmbmRlZiBfU1RMX1ZFQ1RPUl9ICisjZGVmaW5lIF9TVExfVkVDVE9SX0ggMQorCisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV9mdW5jcy5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIKKworICAvLy8gU2VlIGJpdHMvc3RsX2RlcXVlLmgncyBfRGVxdWVfYmFzZSBmb3IgYW4gZXhwbGFuYXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBfVmVjdG9yX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9UcD46Om90aGVyIF9UcF9hbGxvY190eXBlOworCisgICAgICBzdHJ1Y3QgX1ZlY3Rvcl9pbXBsIAorICAgICAgOiBwdWJsaWMgX1RwX2FsbG9jX3R5cGUKKyAgICAgIHsKKwl0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cG9pbnRlciBfTV9zdGFydDsKKwl0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cG9pbnRlciBfTV9maW5pc2g7CisJdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OnBvaW50ZXIgX01fZW5kX29mX3N0b3JhZ2U7CisKKwlfVmVjdG9yX2ltcGwoKQorCTogX1RwX2FsbG9jX3R5cGUoKSwgX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKworCV9WZWN0b3JfaW1wbChfVHBfYWxsb2NfdHlwZSBjb25zdCYgX19hKQorCTogX1RwX2FsbG9jX3R5cGUoX19hKSwgX01fc3RhcnQoMCksIF9NX2ZpbmlzaCgwKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkKKwl7IH0KKyAgICAgIH07CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX1RwX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxfVHBfYWxsb2NfdHlwZSo+KCZ0aGlzLT5fTV9pbXBsKTsgfQorCisgICAgICBjb25zdCBfVHBfYWxsb2NfdHlwZSYKKyAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9UcF9hbGxvY190eXBlKj4oJnRoaXMtPl9NX2ltcGwpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7IH0KKworICAgICAgX1ZlY3Rvcl9iYXNlKCkKKyAgICAgIDogX01faW1wbCgpIHsgfQorCisgICAgICBfVmVjdG9yX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpIHsgfQorCisgICAgICBfVmVjdG9yX2Jhc2Uoc2l6ZV90IF9fbikKKyAgICAgIDogX01faW1wbCgpCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbik7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uOworICAgICAgfQorCisgICAgICBfVmVjdG9yX2Jhc2Uoc2l6ZV90IF9fbiwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX01faW1wbChfX2EpCisgICAgICB7CisJdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbik7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0OworCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19uOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9WZWN0b3JfYmFzZShfVmVjdG9yX2Jhc2UmJiBfX3gpCisgICAgICA6IF9NX2ltcGwoX194Ll9NX2dldF9UcF9hbGxvY2F0b3IoKSkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX194Ll9NX2ltcGwuX01fc3RhcnQ7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX3guX01faW1wbC5fTV9maW5pc2g7CisJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9feC5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOworCV9feC5fTV9pbXBsLl9NX3N0YXJ0ID0gMDsKKwlfX3guX01faW1wbC5fTV9maW5pc2ggPSAwOworCV9feC5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gMDsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB+X1ZlY3Rvcl9iYXNlKCkKKyAgICAgIHsgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCSAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIF9WZWN0b3JfaW1wbCBfTV9pbXBsOworCisgICAgICB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cG9pbnRlcgorICAgICAgX01fYWxsb2NhdGUoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9fbiAhPSAwID8gX01faW1wbC5hbGxvY2F0ZShfX24pIDogMDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlKHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpwb2ludGVyIF9fcCwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlpZiAoX19wKQorCSAgX01faW1wbC5kZWFsbG9jYXRlKF9fcCwgX19uKTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgd2hpY2ggb2ZmZXJzIGZpeGVkIHRpbWUgYWNjZXNzIHRvCisgICAqICBpbmRpdmlkdWFsIGVsZW1lbnRzIGluIGFueSBvcmRlci4KKyAgICoKKyAgICogIEBpbmdyb3VwIHNlcXVlbmNlcworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NiI+cmV2ZXJzaWJsZSBjb250YWluZXI8L2E+LCBhbmQgYQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjciPnNlcXVlbmNlPC9hPiwgaW5jbHVkaW5nIHRoZQorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjNjgiPm9wdGlvbmFsIHNlcXVlbmNlIHJlcXVpcmVtZW50czwvYT4gd2l0aCB0aGUKKyAgICogICVleGNlcHRpb24gb2YgQGMgcHVzaF9mcm9udCBhbmQgQGMgcG9wX2Zyb250LgorICAgKgorICAgKiAgSW4gc29tZSB0ZXJtaW5vbG9neSBhICV2ZWN0b3IgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGR5bmFtaWMKKyAgICogIEMtc3R5bGUgYXJyYXksIGl0IG9mZmVycyBmYXN0IGFuZCBlZmZpY2llbnQgYWNjZXNzIHRvIGluZGl2aWR1YWwKKyAgICogIGVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgc2F2ZXMgdGhlIHVzZXIgZnJvbSB3b3JyeWluZyBhYm91dAorICAgKiAgbWVtb3J5IGFuZCBzaXplIGFsbG9jYXRpb24uICBTdWJzY3JpcHRpbmcgKCBAYyBbXSApIGFjY2VzcyBpcworICAgKiAgYWxzbyBwcm92aWRlZCBhcyB3aXRoIEMtc3R5bGUgYXJyYXlzLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIHZlY3RvciA6IHByb3RlY3RlZCBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+CisgICAgeworICAgICAgLy8gQ29uY2VwdCByZXF1aXJlbWVudHMuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICAgICAgICAgICBfQWxsb2NfdmFsdWVfdHlwZTsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVHAsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczIoX1RwLCBfQWxsb2NfdmFsdWVfdHlwZSwgX1NhbWVUeXBlQ29uY2VwdCkKKyAgICAgIAorICAgICAgdHlwZWRlZiBfVmVjdG9yX2Jhc2U8X1RwLCBfQWxsb2M+CQkJIF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6X1RwX2FsbG9jX3R5cGUJCSBfVHBfYWxsb2NfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwCQkJCQkgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwX2FsbG9jX3R5cGU6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHBfYWxsb2NfdHlwZTo6Y29uc3RfcmVmZXJlbmNlICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIHZlY3Rvcj4gaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8Y29uc3RfcG9pbnRlciwgdmVjdG9yPgorICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4JCSByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzaXplX3QJCQkJCSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdAkJCQkJIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgCQkgYWxsb2NhdG9yX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB1c2luZyBfQmFzZTo6X01fYWxsb2NhdGU7CisgICAgICB1c2luZyBfQmFzZTo6X01fZGVhbGxvY2F0ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9pbXBsOworICAgICAgdXNpbmcgX0Jhc2U6Ol9NX2dldF9UcF9hbGxvY2F0b3I7CisKKyAgICAgIGJvb2wgX01faXNfdmFsaWQoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gKHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPT0gMAorCQkmJiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID09IDAKKwkJJiYgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPT0gMCkKKwkgICAgICB8fCAodGhpcy0+X01faW1wbC5fTV9zdGFydCA8PSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaAorCQkgICYmIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoIDw9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJICAmJiB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0IDwgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBbMjMuMi40LjFdIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kKKyAgICAgIC8vIChhc3NpZ24oKSBhbmQgZ2V0X2FsbG9jYXRvcigpIGFyZSBhbHNvIGxpc3RlZCBpbiB0aGlzIHNlY3Rpb24pCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBubyBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgdmVjdG9yKCkKKyAgICAgIDogX0Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGVzIGEgJXZlY3RvciB3aXRoIG5vIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3Rvcihjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfQmFzZShfX2EpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICV2ZWN0b3Igd2l0aCBkZWZhdWx0IGNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBpbml0aWFsbHkgY3JlYXRlLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAldmVjdG9yIHdpdGggQGEgbiBkZWZhdWx0CisgICAgICAgKiAgY29uc3RydWN0ZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoX19uKQorICAgICAgeyBfTV9kZWZhdWx0X2luaXRpYWxpemUoX19uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZXMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIGFuIGV4ZW1wbGFyIGVsZW1lbnQuCisgICAgICAgKiAgQHBhcmFtICBuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjcmVhdGUuCisgICAgICAgKiAgQHBhcmFtICB2YWx1ZSAgQW4gZWxlbWVudCB0byBjb3B5LgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSAldmVjdG9yIHdpdGggQGEgbiBjb3BpZXMgb2YgQGEgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlLAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19hKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlcyBhICV2ZWN0b3Igd2l0aCBjb3BpZXMgb2YgYW4gZXhlbXBsYXIgZWxlbWVudC4KKyAgICAgICAqICBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gaW5pdGlhbGx5IGNyZWF0ZS4KKyAgICAgICAqICBAcGFyYW0gIHZhbHVlICBBbiBlbGVtZW50IHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgZmlsbHMgdGhlICV2ZWN0b3Igd2l0aCBAYSBuIGNvcGllcyBvZiBAYSB2YWx1ZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbHVlID0gdmFsdWVfdHlwZSgpLAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19hKQorICAgICAgeyBfTV9maWxsX2luaXRpYWxpemUoX19uLCBfX3ZhbHVlKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVZlY3RvciBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgQSAldmVjdG9yIG9mIGlkZW50aWNhbCBlbGVtZW50IGFuZCBhbGxvY2F0b3IgdHlwZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICV2ZWN0b3IgdXNlcyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRpb24KKyAgICAgICAqICBvYmplY3QgdXNlZCBieSBAYSB4LiAgQWxsIHRoZSBlbGVtZW50cyBvZiBAYSB4IGFyZSBjb3BpZWQsCisgICAgICAgKiAgYnV0IGFueSBleHRyYSBtZW1vcnkgaW4KKyAgICAgICAqICBAYSB4IChmb3IgZmFzdCBleHBhbnNpb24pIHdpbGwgbm90IGJlIGNvcGllZC4KKyAgICAgICAqLworICAgICAgdmVjdG9yKGNvbnN0IHZlY3RvciYgX194KQorICAgICAgOiBfQmFzZShfX3guc2l6ZSgpLCBfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKQorICAgICAgeyB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9CisJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX194LmJlZ2luKCksIF9feC5lbmQoKSwKKwkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICAlVmVjdG9yIG1vdmUgY29uc3RydWN0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICV2ZWN0b3Igb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJXZlY3RvciBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YgQGEgeC4KKyAgICAgICAqICBUaGUgY29udGVudHMgb2YgQGEgeCBhcmUgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICV2ZWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZlY3Rvcih2ZWN0b3ImJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAldmVjdG9yIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKiAgQHBhcmFtICBhICBBbiBhbGxvY2F0b3IuCisgICAgICAgKgorICAgICAgICogIENyZWF0ZSBhICV2ZWN0b3IgY29uc2lzdGluZyBvZiBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgbC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyB3aWxsIGNhbGwgdGhlIGVsZW1lbnQgdHlwZSdzIGNvcHkgY29uc3RydWN0b3IgTiB0aW1lcworICAgICAgICogICh3aGVyZSBOIGlzIEBhIGwuc2l6ZSgpKSBhbmQgZG8gbm8gbWVtb3J5IHJlYWxsb2NhdGlvbi4KKyAgICAgICAqLworICAgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsKKwlfTV9yYW5nZV9pbml0aWFsaXplKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksCisJCQkgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCdWlsZHMgYSAldmVjdG9yIGZyb20gYSByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgYSAgQW4gYWxsb2NhdG9yLgorICAgICAgICoKKyAgICAgICAqICBDcmVhdGUgYSAldmVjdG9yIGNvbnNpc3Rpbmcgb2YgY29waWVzIG9mIHRoZSBlbGVtZW50cyBmcm9tCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgaXRlcmF0b3JzIGFyZSBmb3J3YXJkLCBiaWRpcmVjdGlvbmFsLCBvcgorICAgICAgICogIHJhbmRvbS1hY2Nlc3MsIHRoZW4gdGhpcyB3aWxsIGNhbGwgdGhlIGVsZW1lbnRzJyBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IgTiB0aW1lcyAod2hlcmUgTiBpcyBkaXN0YW5jZShmaXJzdCxsYXN0KSkgYW5kIGRvCisgICAgICAgKiAgbm8gbWVtb3J5IHJlYWxsb2NhdGlvbi4gIEJ1dCBpZiBvbmx5IGlucHV0IGl0ZXJhdG9ycyBhcmUKKyAgICAgICAqICB1c2VkLCB0aGVuIHRoaXMgd2lsbCBkbyBhdCBtb3N0IDJOIGNhbGxzIHRvIHRoZSBjb3B5CisgICAgICAgKiAgY29uc3RydWN0b3IsIGFuZCBsb2dOIG1lbW9yeSByZWFsbG9jYXRpb25zLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdmVjdG9yKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2EpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiAgVGhlIGR0b3Igb25seSBlcmFzZXMgdGhlIGVsZW1lbnRzLCBhbmQgbm90ZSB0aGF0IGlmIHRoZQorICAgICAgICogIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUgcG9pbnRlZC10byBtZW1vcnkgaXMKKyAgICAgICAqICBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMgdGhlIHVzZXIncworICAgICAgICogIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB+dmVjdG9yKCkKKyAgICAgIHsgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgICVWZWN0b3IgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHggIEEgJXZlY3RvciBvZiBpZGVudGljYWwgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIGVsZW1lbnRzIG9mIEBhIHggYXJlIGNvcGllZCwgYnV0IGFueSBleHRyYSBtZW1vcnkgaW4KKyAgICAgICAqICBAYSB4IChmb3IgZmFzdCBleHBhbnNpb24pIHdpbGwgbm90IGJlIGNvcGllZC4gIFVubGlrZSB0aGUKKyAgICAgICAqICBjb3B5IGNvbnN0cnVjdG9yLCB0aGUgYWxsb2NhdG9yIG9iamVjdCBpcyBub3QgY29waWVkLgorICAgICAgICovCisgICAgICB2ZWN0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3gpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVZlY3RvciBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICV2ZWN0b3Igb2YgaWRlbnRpY2FsIGVsZW1lbnQgYW5kIGFsbG9jYXRvciB0eXBlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGNvbnRlbnRzIG9mIEBhIHggYXJlIG1vdmVkIGludG8gdGhpcyAldmVjdG9yICh3aXRob3V0IGNvcHlpbmcpLgorICAgICAgICogIEBhIHggaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkICV2ZWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPSh2ZWN0b3ImJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgJVZlY3RvciBsaXN0IGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBsICBBbiBpbml0aWFsaXplcl9saXN0LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgJXZlY3RvciB3aXRoIGNvcGllcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlCisgICAgICAgKiAgaW5pdGlhbGl6ZXIgbGlzdCBAYSBsLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhlIGFzc2lnbm1lbnQgY29tcGxldGVseSBjaGFuZ2VzIHRoZSAldmVjdG9yIGFuZAorICAgICAgICogIHRoYXQgdGhlIHJlc3VsdGluZyAldmVjdG9yJ3Mgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyCisgICAgICAgKiAgb2YgZWxlbWVudHMgYXNzaWduZWQuICBPbGQgZGF0YSBtYXkgYmUgbG9zdC4KKyAgICAgICAqLworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ25zIGEgZ2l2ZW4gdmFsdWUgdG8gYSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIGFzc2lnbmVkLgorICAgICAgICogIEBwYXJhbSAgdmFsICBWYWx1ZSB0byBiZSBhc3NpZ25lZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICV2ZWN0b3Igd2l0aCBAYSBuIGNvcGllcyBvZiB0aGUgZ2l2ZW4KKyAgICAgICAqICB2YWx1ZS4gIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlCisgICAgICAgKiAgJXZlY3RvciBhbmQgdGhhdCB0aGUgcmVzdWx0aW5nICV2ZWN0b3IncyBzaXplIGlzIHRoZSBzYW1lIGFzCisgICAgICAgKiAgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhIHJhbmdlIHRvIGEgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIGxhc3QgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBmaWxscyBhICV2ZWN0b3Igd2l0aCBjb3BpZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZQorICAgICAgICogIHJhbmdlIFtmaXJzdCxsYXN0KS4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoZSBhc3NpZ25tZW50IGNvbXBsZXRlbHkgY2hhbmdlcyB0aGUgJXZlY3RvciBhbmQKKyAgICAgICAqICB0aGF0IHRoZSByZXN1bHRpbmcgJXZlY3RvcidzIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWJlcgorICAgICAgICogIG9mIGVsZW1lbnRzIGFzc2lnbmVkLiAgT2xkIGRhdGEgbWF5IGJlIGxvc3QuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWducyBhbiBpbml0aWFsaXplciBsaXN0IHRvIGEgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGwgIEFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSAldmVjdG9yIHdpdGggY29waWVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAqICBpbml0aWFsaXplciBsaXN0IEBhIGwuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGUgYXNzaWdubWVudCBjb21wbGV0ZWx5IGNoYW5nZXMgdGhlICV2ZWN0b3IgYW5kCisgICAgICAgKiAgdGhhdCB0aGUgcmVzdWx0aW5nICV2ZWN0b3IncyBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIKKyAgICAgICAqICBvZiBlbGVtZW50cyBhc3NpZ25lZC4gIE9sZCBkYXRhIG1heSBiZSBsb3N0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vLyBHZXQgYSBjb3B5IG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBvYmplY3QuCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gb3JkaW5hcnkKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeworI2lmIF9fZ29vZ2xlX3N0bF9kZWJ1Z19kYW5nbGluZ192ZWN0b3IKKyAgICAgICAgaWYgKCF0aGlzLT5fTV9pc192YWxpZCgpKQorICAgICAgICAgIF9fdGhyb3dfbG9naWNfZXJyb3IoImJlZ2luKCkgb24gY29ycnVwdCAoZGFuZ2xpbmc/KSB2ZWN0b3IiKTsKKyNlbmRpZgorCXJldHVybiBpdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZQorICAgICAgICogIGZpcnN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7CisjaWYgX19nb29nbGVfc3RsX2RlYnVnX2RhbmdsaW5nX3ZlY3RvcgorICAgICAgICBpZiAoIXRoaXMtPl9NX2lzX3ZhbGlkKCkpCisgICAgICAgICAgX190aHJvd19sb2dpY19lcnJvcigiYmVnaW4oKSBvbiBjb3JydXB0IChkYW5nbGluZz8pIHZlY3RvciIpOworI2VuZGlmCisJcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdAorICAgICAgICogIGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbiBvcmRpbmFyeQorICAgICAgICogIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeworI2lmIF9fZ29vZ2xlX3N0bF9kZWJ1Z19kYW5nbGluZ192ZWN0b3IKKyAgICAgICAgaWYgKCF0aGlzLT5fTV9pc192YWxpZCgpKQorICAgICAgICAgIF9fdGhyb3dfbG9naWNfZXJyb3IoImVuZCgpIG9uIGNvcnJ1cHQgKGRhbmdsaW5nPykgdmVjdG9yIik7CisjZW5kaWYKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsKKyNpZiBfX2dvb2dsZV9zdGxfZGVidWdfZGFuZ2xpbmdfdmVjdG9yCisgICAgICAgIGlmICghdGhpcy0+X01faXNfdmFsaWQoKSkKKyAgICAgICAgICBfX3Rocm93X2xvZ2ljX2Vycm9yKCJlbmQoKSBvbiBjb3JydXB0IChkYW5nbGluZz8pIHZlY3RvciIpOworI2VuZGlmCisJcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUKKyAgICAgICAqICBsYXN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlCisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUKKyAgICAgICAqICBiZWZvcmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlICV2ZWN0b3IuICBJdGVyYXRpb24gaXMgZG9uZQorICAgICAgICogIGluIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlCisgICAgICAgKiAgZmlyc3QgZWxlbWVudCBpbiB0aGUgJXZlY3Rvci4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIG9yZGluYXJ5CisgICAgICAgKiAgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QKKyAgICAgICAqICB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICBvcmRpbmFyeSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uIGlzIGRvbmUgaW4KKyAgICAgICAqICByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byBvbmUgYmVmb3JlIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAldmVjdG9yLiAgSXRlcmF0aW9uCisgICAgICAgKiAgaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBbMjMuMi40LjJdIGNhcGFjaXR5CisgICAgICAvKiogIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgJXZlY3Rvci4gICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeworI2lmIF9fZ29vZ2xlX3N0bF9kZWJ1Z19kYW5nbGluZ192ZWN0b3IKKyAgICAgICAgaWYgKCF0aGlzLT5fTV9pc192YWxpZCgpKQorICAgICAgICAgIF9fdGhyb3dfbG9naWNfZXJyb3IoInNpemUoKSBvbiBjb3JydXB0IChkYW5nbGluZz8pIHZlY3RvciIpOworI2VuZGlmCisJcmV0dXJuIHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworICAgICAgfQorCisgICAgICAvKiogIFJldHVybnMgdGhlIHNpemUoKSBvZiB0aGUgbGFyZ2VzdCBwb3NzaWJsZSAldmVjdG9yLiAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZ2V0X1RwX2FsbG9jYXRvcigpLm1heF9zaXplKCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBuZXdfc2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIHRoZSAldmVjdG9yIHNob3VsZCBjb250YWluLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgJXJlc2l6ZSB0aGUgJXZlY3RvciB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlIG51bWJlciBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgKiAgJXZlY3RvcidzIGN1cnJlbnQgc2l6ZSB0aGUgJXZlY3RvciBpcyB0cnVuY2F0ZWQsIG90aGVyd2lzZQorICAgICAgICogIGRlZmF1bHQgY29uc3RydWN0ZWQgZWxlbWVudHMgYXJlIGFwcGVuZGVkLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUpCisgICAgICB7CisJaWYgKF9fbmV3X3NpemUgPiBzaXplKCkpCisJICBfTV9kZWZhdWx0X2FwcGVuZChfX25ld19zaXplIC0gc2l6ZSgpKTsKKwllbHNlIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKQorCSAgX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX25ld19zaXplKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXNpemVzIHRoZSAldmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbmV3X3NpemUgIE51bWJlciBvZiBlbGVtZW50cyB0aGUgJXZlY3RvciBzaG91bGQgY29udGFpbi4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgd2l0aCB3aGljaCBuZXcgZWxlbWVudHMgc2hvdWxkIGJlIHBvcHVsYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsICVyZXNpemUgdGhlICV2ZWN0b3IgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICogIG51bWJlciBvZiBlbGVtZW50cy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICV2ZWN0b3IncyBjdXJyZW50IHNpemUgdGhlICV2ZWN0b3IgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgJXZlY3RvciBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBwb3B1bGF0ZWQgd2l0aAorICAgICAgICogIGdpdmVuIGRhdGEuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCWlmIChfX25ld19zaXplID4gc2l6ZSgpKQorCSAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gc2l6ZSgpLCBfX3gpOworCWVsc2UgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpCisJICBfTV9lcmFzZV9hdF9lbmQodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbmV3X3NpemUpOworICAgICAgfQorI2Vsc2UKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJXZlY3RvciB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgICAqICBAcGFyYW0gIG5ld19zaXplICBOdW1iZXIgb2YgZWxlbWVudHMgdGhlICV2ZWN0b3Igc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICB4ICBEYXRhIHdpdGggd2hpY2ggbmV3IGVsZW1lbnRzIHNob3VsZCBiZSBwb3B1bGF0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAldmVjdG9yIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgZWxlbWVudHMuICBJZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICAqICAldmVjdG9yJ3MgY3VycmVudCBzaXplIHRoZSAldmVjdG9yIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlCisgICAgICAgKiAgdGhlICV2ZWN0b3IgaXMgZXh0ZW5kZWQgYW5kIG5ldyBlbGVtZW50cyBhcmUgcG9wdWxhdGVkIHdpdGgKKyAgICAgICAqICBnaXZlbiBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbmV3X3NpemUsIHZhbHVlX3R5cGUgX194ID0gdmFsdWVfdHlwZSgpKQorICAgICAgeworCWlmIChfX25ld19zaXplID4gc2l6ZSgpKQorCSAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXplIC0gc2l6ZSgpLCBfX3gpOworCWVsc2UgaWYgKF9fbmV3X3NpemUgPCBzaXplKCkpCisJICBfTV9lcmFzZV9hdF9lbmQodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbmV3X3NpemUpOworICAgICAgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqICBBIG5vbi1iaW5kaW5nIHJlcXVlc3QgdG8gcmVkdWNlIGNhcGFjaXR5KCkgdG8gc2l6ZSgpLiAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHNocmlua190b19maXQoKQorICAgICAgeyBzdGQ6Ol9fc2hyaW5rX3RvX2ZpdDx2ZWN0b3I+OjpfU19kb19pdCgqdGhpcyk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB0aGUgJXZlY3RvciBjYW4KKyAgICAgICAqICBob2xkIGJlZm9yZSBuZWVkaW5nIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5LgorICAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNhcGFjaXR5KCkgY29uc3QKKyAgICAgIHsKKyNpZiBfX2dvb2dsZV9zdGxfZGVidWdfZGFuZ2xpbmdfdmVjdG9yCisgICAgICAgIGlmICghdGhpcy0+X01faXNfdmFsaWQoKSkKKyAgICAgICAgICBfX3Rocm93X2xvZ2ljX2Vycm9yKCJjYXBhY2l0eSgpIG9uIGNvcnJ1cHQgKGRhbmdsaW5nPykgdmVjdG9yIik7CisjZW5kaWYKKwlyZXR1cm4gc2l6ZV90eXBlKHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgJXZlY3RvciBpcyBlbXB0eS4gIChUaHVzIGJlZ2luKCkgd291bGQKKyAgICAgICAqICBlcXVhbCBlbmQoKS4pCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJlZ2luKCkgPT0gZW5kKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBdHRlbXB0IHRvIHByZWFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHNwZWNpZmllZCBudW1iZXIgb2YKKyAgICAgICAqICAgICAgICAgIGVsZW1lbnRzLgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVpcmVkLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIEBhIG4gZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJlc2VydmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlCisgICAgICAgKiAgJXZlY3RvciB0byBob2xkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVsZW1lbnRzLiAgSWYgdGhlCisgICAgICAgKiAgbnVtYmVyIHJlcXVlc3RlZCBpcyBtb3JlIHRoYW4gbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYWR2YW50YWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpZiBvcHRpbWFsIGNvZGUgaXMgYQorICAgICAgICogIG5lY2Vzc2l0eSBhbmQgdGhlIHVzZXIgY2FuIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgKiAgdGhhdCB3aWxsIGJlIHJlcXVpcmVkLCB0aGUgdXNlciBjYW4gcmVzZXJ2ZSB0aGUgbWVtb3J5IGluCisgICAgICAgKiAgJWFkdmFuY2UsIGFuZCB0aHVzIHByZXZlbnQgYSBwb3NzaWJsZSByZWFsbG9jYXRpb24gb2YgbWVtb3J5CisgICAgICAgKiAgYW5kIGNvcHlpbmcgb2YgJXZlY3RvciBkYXRhLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pOworCisgICAgICAvLyBlbGVtZW50IGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICoKKyAgICAgICAqICBMb2NhbCBtb2RpZmljYXRpb246IHJhbmdlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGlmCisgICAgICAgKiAgX19nb29nbGVfc3RsX2RlYnVnX3ZlY3RvciBpcyBkZWZpbmVkIHRvIG5vbi16ZXJvLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKyNpZiBfX2dvb2dsZV9zdGxfZGVidWdfdmVjdG9yCisJX01fcmFuZ2VfY2hlY2soX19uKTsKKyNlbmRpZgorCXJldHVybiAqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICoKKyAgICAgICAqICBMb2NhbCBtb2RpZmljYXRpb246IHJhbmdlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGlmCisgICAgICAgKiAgX19nb29nbGVfc3RsX2RlYnVnX3ZlY3RvciBpcyBkZWZpbmVkIHRvIG5vbi16ZXJvLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKyNpZiBfX2dvb2dsZV9zdGxfZGVidWdfdmVjdG9yCisJX01fcmFuZ2VfY2hlY2soX19uKTsKKyNlbmRpZgorCXJldHVybiAqKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX24pOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIFNhZmV0eSBjaGVjayB1c2VkIG9ubHkgZnJvbSBhdCgpLgorICAgICAgdm9pZAorICAgICAgX01fcmFuZ2VfY2hlY2soc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlpZiAoX19uID49IHRoaXMtPnNpemUoKSkKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigidmVjdG9yOjpfTV9yYW5nZV9jaGVjayIpKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlCisgICAgICAgKiAgYWNjZXNzZWQuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBuIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHZlY3Rvci4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRocm93cyBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX01fcmFuZ2VfY2hlY2soX19uKTsKKwlyZXR1cm4gKCp0aGlzKVtfX25dOyAKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUKKyAgICAgICAqICBhY2Nlc3NlZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gZGF0YS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBuIGlzIGFuIGludmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZm9yIHNhZmVyIGRhdGEgYWNjZXNzLiAgVGhlIHBhcmFtZXRlcgorICAgICAgICogIGlzIGZpcnN0IGNoZWNrZWQgdGhhdCBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIHZlY3Rvci4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRocm93cyBvdXRfb2ZfcmFuZ2UgaWYgdGhlIGNoZWNrIGZhaWxzLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJX01fcmFuZ2VfY2hlY2soX19uKTsKKwlyZXR1cm4gKCp0aGlzKVtfX25dOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGZpcnN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICV2ZWN0b3IuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKmJlZ2luKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBsYXN0CisgICAgICAgKiAgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBvZiB0aGUgJXZlY3Rvci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICAvLyBkYXRhIGFjY2VzcworICAgICAgLyoqCisgICAgICAgKiAgIFJldHVybnMgYSBwb2ludGVyIHN1Y2ggdGhhdCBbZGF0YSgpLCBkYXRhKCkgKyBzaXplKCkpIGlzIGEgdmFsaWQKKyAgICAgICAqICAgcmFuZ2UuICBGb3IgYSBub24tZW1wdHkgJXZlY3RvciwgZGF0YSgpID09ICZmcm9udCgpLgorICAgICAgICovCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9UcCoKKyNlbHNlCisgICAgICBwb2ludGVyCisjZW5kaWYKKyAgICAgIGRhdGEoKQorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihmcm9udCgpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0IF9UcCoKKyNlbHNlCisgICAgICBjb25zdF9wb2ludGVyCisjZW5kaWYKKyAgICAgIGRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihmcm9udCgpKTsgfQorCisgICAgICAvLyBbMjMuMi40LjNdIG1vZGlmaWVycworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBZGQgZGF0YSB0byB0aGUgZW5kIG9mIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBhZGRlZC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIHR5cGljYWwgc3RhY2sgb3BlcmF0aW9uLiAgVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAqICBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlICV2ZWN0b3IgYW5kIGFzc2lnbnMgdGhlIGdpdmVuIGRhdGEKKyAgICAgICAqICB0byBpdC4gIER1ZSB0byB0aGUgbmF0dXJlIG9mIGEgJXZlY3RvciB0aGlzIG9wZXJhdGlvbiBjYW4gYmUKKyAgICAgICAqICBkb25lIGluIGNvbnN0YW50IHRpbWUgaWYgdGhlICV2ZWN0b3IgaGFzIHByZWFsbG9jYXRlZCBzcGFjZQorICAgICAgICogIGF2YWlsYWJsZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2ggIT0gdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9feCk7CisJICAgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJICB9CisJZWxzZQorCSAgX01faW5zZXJ0X2F1eChlbmQoKSwgX194KTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2sodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlcyBsYXN0IGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaXMgYSB0eXBpY2FsIHN0YWNrIG9wZXJhdGlvbi4gSXQgc2hyaW5rcyB0aGUgJXZlY3RvciBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCBubyBkYXRhIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGxhc3QgZWxlbWVudCdzCisgICAgICAgKiAgZGF0YSBpcyBuZWVkZWQsIGl0IHNob3VsZCBiZSByZXRyaWV2ZWQgYmVmb3JlIHBvcF9iYWNrKCkgaXMKKyAgICAgICAqICBjYWxsZWQuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwktLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCXRoaXMtPl9NX2ltcGwuZGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGFuIG9iamVjdCBpbiAldmVjdG9yIGJlZm9yZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIGFyZ3MgIEFyZ3VtZW50cy4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhbiBvYmplY3Qgb2YgdHlwZSBUIGNvbnN0cnVjdGVkCisgICAgICAgKiAgd2l0aCBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGZvciBhICV2ZWN0b3IKKyAgICAgICAqICBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseSB1c2VkIHRoZSB1c2VyIHNob3VsZCBjb25zaWRlciB1c2luZworICAgICAgICogIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpOworI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0cyBnaXZlbiB2YWx1ZSBpbnRvICV2ZWN0b3IgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHZhbHVlIGJlZm9yZQorICAgICAgICogIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uICBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIG9wZXJhdGlvbgorICAgICAgICogIGNvdWxkIGJlIGV4cGVuc2l2ZSBmb3IgYSAldmVjdG9yIGFuZCBpZiBpdCBpcyBmcmVxdWVudGx5CisgICAgICAgKiAgdXNlZCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGdpdmVuIHJ2YWx1ZSBpbnRvICV2ZWN0b3IgYmVmb3JlIHNwZWNpZmllZCBpdGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgeCAgRGF0YSB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcmV0dXJuICBBbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgaW5zZXJ0ZWQgZGF0YS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBhIGNvcHkgb2YgdGhlIGdpdmVuIHJ2YWx1ZSBiZWZvcmUKKyAgICAgICAqICB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24KKyAgICAgICAqICBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseQorICAgICAgICogIHVzZWQgdGhlIHVzZXIgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGFuIGluaXRpYWxpemVyX2xpc3QgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgbCAgQW4gaW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluc2VydCBjb3BpZXMgb2YgdGhlIGRhdGEgaW4gdGhlIAorICAgICAgICogIGluaXRpYWxpemVyX2xpc3QgQGEgbCBpbnRvIHRoZSAldmVjdG9yIGJlZm9yZSB0aGUgbG9jYXRpb24KKyAgICAgICAqICBzcGVjaWZpZWQgYnkgQGEgcG9zaXRpb24uCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhhdCB0aGlzIGtpbmQgb2Ygb3BlcmF0aW9uIGNvdWxkIGJlIGV4cGVuc2l2ZSBmb3IgYQorICAgICAgICogICV2ZWN0b3IgYW5kIGlmIGl0IGlzIGZyZXF1ZW50bHkgdXNlZCB0aGUgdXNlciBzaG91bGQKKyAgICAgICAqICBjb25zaWRlciB1c2luZyBzdGQ6Omxpc3QuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fcG9zaXRpb24sIF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgbnVtYmVyIG9mIGNvcGllcyBvZiBnaXZlbiBkYXRhIGludG8gdGhlICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgQW4gaXRlcmF0b3IgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4KKyAgICAgICAqICBAcGFyYW0gIHggIERhdGEgdG8gYmUgaW5zZXJ0ZWQuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvcGllcyBvZgorICAgICAgICogIHRoZSBnaXZlbiBkYXRhIGJlZm9yZSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IEBhIHBvc2l0aW9uLgorICAgICAgICoKKyAgICAgICAqICBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIG9wZXJhdGlvbiBjb3VsZCBiZSBleHBlbnNpdmUgZm9yIGEKKyAgICAgICAqICAldmVjdG9yIGFuZCBpZiBpdCBpcyBmcmVxdWVudGx5IHVzZWQgdGhlIHVzZXIgc2hvdWxkCisgICAgICAgKiAgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyBfTV9maWxsX2luc2VydChfX3Bvc2l0aW9uLCBfX24sIF9feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnRzIGEgcmFuZ2UgaW50byB0aGUgJXZlY3Rvci4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBBbiBpdGVyYXRvciBpbnRvIHRoZSAldmVjdG9yLgorICAgICAgICogIEBwYXJhbSAgZmlyc3QgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGNvcGllcyBvZiB0aGUgZGF0YSBpbiB0aGUgcmFuZ2UKKyAgICAgICAqICBbZmlyc3QsbGFzdCkgaW50byB0aGUgJXZlY3RvciBiZWZvcmUgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAorICAgICAgICogIGJ5IEBhIHBvcy4KKyAgICAgICAqCisgICAgICAgKiAgTm90ZSB0aGF0IHRoaXMga2luZCBvZiBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGZvciBhCisgICAgICAgKiAgJXZlY3RvciBhbmQgaWYgaXQgaXMgZnJlcXVlbnRseSB1c2VkIHRoZSB1c2VyIHNob3VsZAorICAgICAgICogIGNvbnNpZGVyIHVzaW5nIHN0ZDo6bGlzdC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGFuIGludGVncmFsIHR5cGUuICBJZiBzbywgaXQncyBub3QgYW4gaXRlcmF0b3IuCisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19pc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X190eXBlIF9JbnRlZ3JhbDsKKwkgIF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGVsZW1lbnQgYXQgZ2l2ZW4gcG9zaXRpb24uCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gZWxlbWVudCB0byBiZSBlcmFzZWQuCisgICAgICAgKiAgQHJldHVybiAgQW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQgZWxlbWVudCAob3IgZW5kKCkpLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgZXJhc2UgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aHVzCisgICAgICAgKiAgc2hvcnRlbiB0aGUgJXZlY3RvciBieSBvbmUuCisgICAgICAgKgorICAgICAgICogIE5vdGUgVGhpcyBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGFuZCBpZiBpdCBpcworICAgICAgICogIGZyZXF1ZW50bHkgdXNlZCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICogIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50LCBhbmQgdGhhdCBpZiB0aGUgZWxlbWVudCBpcyBpdHNlbGYgYSBwb2ludGVyLAorICAgICAgICogIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcKKyAgICAgICAqICB0aGUgcG9pbnRlciBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbik7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCisgICAgICAgKiAgQHBhcmFtICBmaXJzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgdG8gYmUgZXJhc2VkLgorICAgICAgICogIEBwYXJhbSAgbGFzdCAgSXRlcmF0b3IgcG9pbnRpbmcgdG8gb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudCB0byBiZQorICAgICAgICogICAgICAgICAgICAgICAgZXJhc2VkLgorICAgICAgICogIEByZXR1cm4gIEFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkgQGEgbGFzdAorICAgICAgICogICAgICAgICAgIHByaW9yIHRvIGVyYXNpbmcgKG9yIGVuZCgpKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LGxhc3QpIGFuZAorICAgICAgICogIHNob3J0ZW4gdGhlICV2ZWN0b3IgYWNjb3JkaW5nbHkuCisgICAgICAgKgorICAgICAgICogIE5vdGUgVGhpcyBvcGVyYXRpb24gY291bGQgYmUgZXhwZW5zaXZlIGFuZCBpZiBpdCBpcworICAgICAgICogIGZyZXF1ZW50bHkgdXNlZCB0aGUgdXNlciBzaG91bGQgY29uc2lkZXIgdXNpbmcgc3RkOjpsaXN0LgorICAgICAgICogIFRoZSB1c2VyIGlzIGFsc28gY2F1dGlvbmVkIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcworICAgICAgICogIHRoZSBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlCisgICAgICAgKiAgcG9pbnRlcnMsIHRoZSBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LgorICAgICAgICogIE1hbmFnaW5nIHRoZSBwb2ludGVyIGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkuCisgICAgICAgKi8KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN3YXBzIGRhdGEgd2l0aCBhbm90aGVyICV2ZWN0b3IuCisgICAgICAgKiAgQHBhcmFtICB4ICBBICV2ZWN0b3Igb2YgdGhlIHNhbWUgZWxlbWVudCBhbmQgYWxsb2NhdG9yIHR5cGVzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGV4Y2hhbmdlcyB0aGUgZWxlbWVudHMgYmV0d2VlbiB0d28gdmVjdG9ycyBpbiBjb25zdGFudCB0aW1lLgorICAgICAgICogIChUaHJlZSBwb2ludGVycywgc28gaXQgc2hvdWxkIGJlIHF1aXRlIGZhc3QuKQorICAgICAgICogIE5vdGUgdGhhdCB0aGUgZ2xvYmFsIHN0ZDo6c3dhcCgpIGZ1bmN0aW9uIGlzIHNwZWNpYWxpemVkIHN1Y2ggdGhhdAorICAgICAgICogIHN0ZDo6c3dhcCh2MSx2Mikgd2lsbCBmZWVkIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiBfX3gpCisgICAgICB7CisjaWYgX19nb29nbGVfc3RsX2RlYnVnX2RhbmdsaW5nX3ZlY3RvcgorICAgICAgICBpZiAoIXRoaXMtPl9NX2lzX3ZhbGlkKCkgfHwgIV9feC5fTV9pc192YWxpZCgpKQorICAgICAgICAgIF9fdGhyb3dfbG9naWNfZXJyb3IoInN3YXAoKSBvbiBjb3JydXB0IChkYW5nbGluZz8pIHZlY3RvciIpOworI2VuZGlmCisJc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIF9feC5fTV9pbXBsLl9NX3N0YXJ0KTsKKwlzdGQ6OnN3YXAodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9feC5fTV9pbXBsLl9NX2ZpbmlzaCk7CisJc3RkOjpzd2FwKHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UsCisJCSAgX194Ll9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpOworCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKwlzdGQ6Ol9fYWxsb2Nfc3dhcDxfVHBfYWxsb2NfdHlwZT46Ol9TX2RvX2l0KF9NX2dldF9UcF9hbGxvY2F0b3IoKSwKKwkJCQkJCSAgICBfX3guX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgRXJhc2VzIGFsbCB0aGUgZWxlbWVudHMuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IGVyYXNlcyB0aGUKKyAgICAgICAqICBlbGVtZW50cywgYW5kIHRoYXQgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIHBvaW50ZXJzLCB0aGUKKyAgICAgICAqICBwb2ludGVkLXRvIG1lbW9yeSBpcyBub3QgdG91Y2hlZCBpbiBhbnkgd2F5LiAgTWFuYWdpbmcgdGhlIHBvaW50ZXIgaXMKKyAgICAgICAqICB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisjaWYgX19nb29nbGVfc3RsX2RlYnVnX2RhbmdsaW5nX3ZlY3RvcgorICAgICAgICBpZiAoIXRoaXMtPl9NX2lzX3ZhbGlkKCkpCisgICAgICAgICAgX190aHJvd19sb2dpY19lcnJvcigiY2xlYXIoKSBvbiBjb3JydXB0IChkYW5nbGluZz8pIHZlY3RvciIpOworI2VuZGlmCisJX01fZXJhc2VfYXRfZW5kKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLyoqCisgICAgICAgKiAgTWVtb3J5IGV4cGFuc2lvbiBoYW5kbGVyLiAgVXNlcyB0aGUgbWVtYmVyIGFsbG9jYXRpb24gZnVuY3Rpb24gdG8KKyAgICAgICAqICBvYnRhaW4gQGEgbiBieXRlcyBvZiBtZW1vcnksIGFuZCB0aGVuIGNvcGllcyBbZmlyc3QsbGFzdCkgaW50byBpdC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgcG9pbnRlcgorICAgICAgICBfTV9hbGxvY2F0ZV9hbmRfY29weShzaXplX3R5cGUgX19uLAorCQkJICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBwb2ludGVyIF9fcmVzdWx0ID0gdGhpcy0+X01fYWxsb2NhdGUoX19uKTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIHJldHVybiBfX3Jlc3VsdDsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBfTV9kZWFsbG9jYXRlKF9fcmVzdWx0LCBfX24pOworCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJfQorCisKKyAgICAgIC8vIEludGVybmFsIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgY29uc3RydWN0b3IgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01faW5pdGlhbGl6ZV9kaXNwYXRjaChfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9fdmFsdWUsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7CisJICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPQorCSAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX24pOworCSAgX01fZmlsbF9pbml0aWFsaXplKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oX19uKSwgX192YWx1ZSk7CisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGNvbnN0cnVjdG9yIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbml0aWFsaXplX2Rpc3BhdGNoKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCSAgICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjoKKwkgICAgaXRlcmF0b3JfY2F0ZWdvcnkgX0l0ZXJDYXRlZ29yeTsKKwkgIF9NX3JhbmdlX2luaXRpYWxpemUoX19maXJzdCwgX19sYXN0LCBfSXRlckNhdGVnb3J5KCkpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5pdGlhbGl6ZV9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5pdGlhbGl6ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgICAgIHsKKwkgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgICBwdXNoX2JhY2soKl9fZmlyc3QpOworCX0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgaW5pdGlhbGl6ZV9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbml0aWFsaXplKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgICAgeworCSAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSB0aGlzLT5fTV9hbGxvY2F0ZShfX24pOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX247CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9CisJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX2ZpcnN0LCBfX2xhc3QsCisJCQkJCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJfQorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIGZpcnN0IGluaXRpYWxpemVfZGlzcGF0Y2ggYWJvdmUgYW5kIGJ5IHRoZQorICAgICAgLy8gdmVjdG9yKG4sdmFsdWUsYSkgY29uc3RydWN0b3IuCisgICAgICB2b2lkCisgICAgICBfTV9maWxsX2luaXRpYWxpemUoc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwlzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX25fYSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX24sIF9fdmFsdWUsIAorCQkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8vIENhbGxlZCBieSB0aGUgdmVjdG9yKG4pIGNvbnN0cnVjdG9yLgorICAgICAgdm9pZAorICAgICAgX01fZGVmYXVsdF9pbml0aWFsaXplKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwgX19uLCAKKwkJCQkJIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIEludGVybmFsIGFzc2lnbiBmdW5jdGlvbnMgZm9sbG93LiAgVGhlICpfYXV4IGZ1bmN0aW9ucyBkbyB0aGUgYWN0dWFsCisgICAgICAvLyBhc3NpZ25tZW50IHdvcmsgZm9yIHRoZSByYW5nZSB2ZXJzaW9ucy4KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBhc3NpZ24gdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQorICAgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgcmFuZ2UgYXNzaWduIHRvIGltcGxlbWVudCBbMjMuMS4xXS85CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkJICAgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisJICBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGFzc2lnbl9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCSAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSBzZWNvbmQgYXNzaWduX2Rpc3BhdGNoIGFib3ZlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2Fzc2lnbl9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIENhbGxlZCBieSBhc3NpZ24obix0KSwgYW5kIHRoZSByYW5nZSBhc3NpZ24gd2hlbiBpdCB0dXJucyBvdXQKKyAgICAgIC8vIHRvIGJlIHRoZSBzYW1lIHRoaW5nLgorICAgICAgdm9pZAorICAgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpOworCisKKyAgICAgIC8vIEludGVybmFsIGluc2VydCBmdW5jdGlvbnMgZm9sbG93LgorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIHJhbmdlIGluc2VydCB0byBpbXBsZW1lbnQgWzIzLjEuMV0vOQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsIF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsCisJCQkgICBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9maWxsX2luc2VydChfX3BvcywgX19uLCBfX3ZhbCk7IH0KKworICAgICAgLy8gQ2FsbGVkIGJ5IHRoZSByYW5nZSBpbnNlcnQgdG8gaW1wbGVtZW50IFsyMy4xLjFdLzkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0lucHV0SXRlcmF0b3IgX19maXJzdCwKKwkJCSAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgX19mYWxzZV90eXBlKQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yPjo6CisJICAgIGl0ZXJhdG9yX2NhdGVnb3J5IF9JdGVyQ2F0ZWdvcnk7CisJICBfTV9yYW5nZV9pbnNlcnQoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0l0ZXJDYXRlZ29yeSgpKTsKKwl9CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGluc2VydF9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJX0lucHV0SXRlcmF0b3IgX19sYXN0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyk7CisKKyAgICAgIC8vIENhbGxlZCBieSB0aGUgc2Vjb25kIGluc2VydF9kaXNwYXRjaCBhYm92ZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCV9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gQ2FsbGVkIGJ5IGluc2VydChwLG4seCksIGFuZCB0aGUgcmFuZ2UgaW5zZXJ0IHdoZW4gaXQgdHVybnMgb3V0IHRvIGJlCisgICAgICAvLyB0aGUgc2FtZSB0aGluZy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8vIENhbGxlZCBieSByZXNpemUobikuCisgICAgICB2b2lkCisgICAgICBfTV9kZWZhdWx0X2FwcGVuZChzaXplX3R5cGUgX19uKTsKKyNlbmRpZgorCisgICAgICAvLyBDYWxsZWQgYnkgaW5zZXJ0KHAseCkKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KTsKKyNlbHNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKTsKKyNlbmRpZgorCisgICAgICAvLyBDYWxsZWQgYnkgdGhlIGxhdHRlci4KKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fY2hlY2tfbGVuKHNpemVfdHlwZSBfX24sIGNvbnN0IGNoYXIqIF9fcykgY29uc3QKKyAgICAgIHsKKwlpZiAobWF4X3NpemUoKSAtIHNpemUoKSA8IF9fbikKKwkgIF9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTihfX3MpKTsKKworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHNpemUoKSArIHN0ZDo6bWF4KHNpemUoKSwgX19uKTsKKwlyZXR1cm4gKF9fbGVuIDwgc2l6ZSgpIHx8IF9fbGVuID4gbWF4X3NpemUoKSkgPyBtYXhfc2l6ZSgpIDogX19sZW47CisgICAgICB9CisKKyAgICAgIC8vIEludGVybmFsIGVyYXNlIGZ1bmN0aW9ucyBmb2xsb3cuCisKKyAgICAgIC8vIENhbGxlZCBieSBlcmFzZShxMSxxMiksIGNsZWFyKCksIHJlc2l6ZSgpLCBfTV9maWxsX2Fzc2lnbiwKKyAgICAgIC8vIF9NX2Fzc2lnbl9hdXguCisgICAgICB2b2lkCisgICAgICBfTV9lcmFzZV9hdF9lbmQocG9pbnRlciBfX3BvcykKKyAgICAgIHsKKwlzdGQ6Ol9EZXN0cm95KF9fcG9zLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fcG9zOworICAgICAgfQorICAgIH07CisKKworICAvKioKKyAgICogIEBicmllZiAgVmVjdG9yIGVxdWFsaXR5IGNvbXBhcmlzb24uCisgICAqICBAcGFyYW0gIHggIEEgJXZlY3Rvci4KKyAgICogIEBwYXJhbSAgeSAgQSAldmVjdG9yIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIHRoZSBzaXplIGFuZCBlbGVtZW50cyBvZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwuCisgICAqCisgICAqICBUaGlzIGlzIGFuIGVxdWl2YWxlbmNlIHJlbGF0aW9uLiAgSXQgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIHRoZQorICAgKiAgdmVjdG9ycy4gIFZlY3RvcnMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudCBpZiB0aGVpciBzaXplcyBhcmUgZXF1YWwsCisgICAqICBhbmQgaWYgY29ycmVzcG9uZGluZyBlbGVtZW50cyBjb21wYXJlIGVxdWFsLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5zaXplKCkgPT0gX195LnNpemUoKQorCSAgICAgICYmIHN0ZDo6ZXF1YWwoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX195LmJlZ2luKCkpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBWZWN0b3Igb3JkZXJpbmcgcmVsYXRpb24uCisgICAqICBAcGFyYW0gIHggIEEgJXZlY3Rvci4KKyAgICogIEBwYXJhbSAgeSAgQSAldmVjdG9yIG9mIHRoZSBzYW1lIHR5cGUgYXMgQGEgeC4KKyAgICogIEByZXR1cm4gIFRydWUgaWZmIEBhIHggaXMgbGV4aWNvZ3JhcGhpY2FsbHkgbGVzcyB0aGFuIEBhIHkuCisgICAqCisgICAqICBUaGlzIGlzIGEgdG90YWwgb3JkZXJpbmcgcmVsYXRpb24uICBJdCBpcyBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlCisgICAqICB2ZWN0b3JzLiAgVGhlIGVsZW1lbnRzIG11c3QgYmUgY29tcGFyYWJsZSB3aXRoIEBjIDwuCisgICAqCisgICAqICBTZWUgc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgpIGZvciBob3cgdGhlIGRldGVybWluYXRpb24gaXMgbWFkZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194LCBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLAorCQkJCQkgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPT0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vLyBTZWUgc3RkOjp2ZWN0b3I6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfU1RMX1ZFQ1RPUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RyZWFtX2l0ZXJhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RyZWFtX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjYTk2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdHJlYW1faXRlcmF0b3IuaApAQCAtMCwwICsxLDIyMSBAQAorLy8gU3RyZWFtIGl0ZXJhdG9ycworCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDQsIDIwMDUsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvc3RyZWFtX2l0ZXJhdG9yLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpdGVyYXRvcn0KKyAqLworCisjaWZuZGVmIF9TVFJFQU1fSVRFUkFUT1JfSAorI2RlZmluZSBfU1RSRUFNX0lURVJBVE9SX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGl0ZXJhdG9ycworICAgKiBAeworICAgKi8KKworICAvLy8gUHJvdmlkZXMgaW5wdXQgaXRlcmF0b3Igc2VtYW50aWNzIGZvciBzdHJlYW1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCA9IGNoYXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LCB0eXBlbmFtZSBfRGlzdCA9IHB0cmRpZmZfdD4KKyAgICBjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3I8aW5wdXRfaXRlcmF0b3JfdGFnLCBfVHAsIF9EaXN0LCBjb25zdCBfVHAqLCBjb25zdCBfVHAmPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+IGlzdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBpc3RyZWFtX3R5cGUqCV9NX3N0cmVhbTsKKyAgICAgIF9UcAkJX01fdmFsdWU7CisgICAgICBib29sCQlfTV9vazsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyAgQ29uc3RydWN0IGVuZCBvZiBpbnB1dCBzdHJlYW0gaXRlcmF0b3IuCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgaXN0cmVhbV9pdGVyYXRvcigpCisgICAgICA6IF9NX3N0cmVhbSgwKSwgX01fdmFsdWUoKSwgX01fb2soZmFsc2UpIHt9CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IHN0YXJ0IG9mIGlucHV0IHN0cmVhbSBpdGVyYXRvci4KKyAgICAgIGlzdHJlYW1faXRlcmF0b3IoaXN0cmVhbV90eXBlJiBfX3MpCisgICAgICA6IF9NX3N0cmVhbSgmX19zKQorICAgICAgeyBfTV9yZWFkKCk7IH0KKworICAgICAgaXN0cmVhbV9pdGVyYXRvcihjb25zdCBpc3RyZWFtX2l0ZXJhdG9yJiBfX29iaikKKyAgICAgIDogX01fc3RyZWFtKF9fb2JqLl9NX3N0cmVhbSksIF9NX3ZhbHVlKF9fb2JqLl9NX3ZhbHVlKSwKKyAgICAgICAgX01fb2soX19vYmouX01fb2spCisgICAgICB7IH0KKworICAgICAgY29uc3QgX1RwJgorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfTV9vaywKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19kZXJlZl9pc3RyZWFtKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCXJldHVybiBfTV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgY29uc3QgX1RwKgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CisKKyAgICAgIGlzdHJlYW1faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfTV9vaywKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbmNfaXN0cmVhbSkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwlfTV9yZWFkKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpc3RyZWFtX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfTV9vaywKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbmNfaXN0cmVhbSkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwlpc3RyZWFtX2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CisJX01fcmVhZCgpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01fZXF1YWwoY29uc3QgaXN0cmVhbV9pdGVyYXRvciYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gKF9NX29rID09IF9feC5fTV9vaykgJiYgKCFfTV9vayB8fCBfTV9zdHJlYW0gPT0gX194Ll9NX3N0cmVhbSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9yZWFkKCkKKyAgICAgIHsKKwlfTV9vayA9IChfTV9zdHJlYW0gJiYgKl9NX3N0cmVhbSkgPyB0cnVlIDogZmFsc2U7CisJaWYgKF9NX29rKQorCSAgeworCSAgICAqX01fc3RyZWFtID4+IF9NX3ZhbHVlOworCSAgICBfTV9vayA9ICpfTV9zdHJlYW0gPyB0cnVlIDogZmFsc2U7CisJICB9CisgICAgICB9CisgICAgfTsKKworICAvLy8gIFJldHVybiB0cnVlIGlmIHggYW5kIHkgYXJlIGJvdGggZW5kIG9yIG5vdCBlbmQsIG9yIHggYW5kIHkgYXJlIHRoZSBzYW1lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0Rpc3Q+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfQ2hhclQsIF9UcmFpdHMsIF9EaXN0PiYgX194LAorCSAgICAgICBjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIC8vLyAgUmV0dXJuIGZhbHNlIGlmIHggYW5kIHkgYXJlIGJvdGggZW5kIG9yIG5vdCBlbmQsIG9yIHggYW5kIHkgYXJlIHRoZSBzYW1lLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9EaXN0PgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0NoYXJULCBfVHJhaXRzLCBfRGlzdD4mIF9feCwKKwkgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRvcjxfVHAsIF9DaGFyVCwgX1RyYWl0cywgX0Rpc3Q+JiBfX3kpCisgICAgeyByZXR1cm4gIV9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFByb3ZpZGVzIG91dHB1dCBpdGVyYXRvciBzZW1hbnRpY3MgZm9yIHN0cmVhbXMuCisgICAqCisgICAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGl0ZXJhdG9yIHRvIHdyaXRlIHRvIGFuIG9zdHJlYW0uICBUaGUgdHlwZSBUcCBpcworICAgKiAgdGhlIG9ubHkgdHlwZSB3cml0dGVuIGJ5IHRoaXMgaXRlcmF0b3IgYW5kIHRoZXJlIG11c3QgYmUgYW4KKyAgICogIG9wZXJhdG9yPDwoVHApIGRlZmluZWQuCisgICAqCisgICAqICBAcGFyYW0gIFRwICBUaGUgdHlwZSB0byB3cml0ZSB0byB0aGUgb3N0cmVhbS4KKyAgICogIEBwYXJhbSAgQ2hhclQgIFRoZSBvc3RyZWFtIGNoYXJfdHlwZS4KKyAgICogIEBwYXJhbSAgVHJhaXRzICBUaGUgb3N0cmVhbSBjaGFyX3RyYWl0cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2hhclQgPSBjaGFyLAorICAgICAgICAgICB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3Mgb3N0cmVhbV9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBQdWJsaWMgdHlwZWRlZgorICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiBvc3RyZWFtX3R5cGU7CisgICAgICAvL0B9CisKKyAgICBwcml2YXRlOgorICAgICAgb3N0cmVhbV90eXBlKglfTV9zdHJlYW07CisgICAgICBjb25zdCBfQ2hhclQqCV9NX3N0cmluZzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBvc3RyZWFtLgorICAgICAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIF9fcykgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZygwKSB7fQorCisgICAgICAvKioKKyAgICAgICAqICBDb25zdHJ1Y3QgZnJvbSBhbiBvc3RyZWFtLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVsaW1pdGVyIHN0cmluZyBAYSBjIGlzIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBhZnRlciBldmVyeSBUcAorICAgICAgICogIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbS4gIFRoZSBkZWxpbWl0ZXIgaXMgbm90IGNvcGllZCwgYW5kIHRodXMgbXVzdAorICAgICAgICogIG5vdCBiZSBkZXN0cm95ZWQgd2hpbGUgdGhpcyBpdGVyYXRvciBpcyBpbiB1c2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVW5kZXJseWluZyBvc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAgICogIEBwYXJhbSAgYyAgQ2hhclQgZGVsaW1pdGVyIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAqLworICAgICAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFtX3R5cGUmIF9fcywgY29uc3QgX0NoYXJUKiBfX2MpCisgICAgICA6IF9NX3N0cmVhbSgmX19zKSwgX01fc3RyaW5nKF9fYykgIHsgfQorCisgICAgICAvLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgIG9zdHJlYW1faXRlcmF0b3IoY29uc3Qgb3N0cmVhbV9pdGVyYXRvciYgX19vYmopCisgICAgICA6IF9NX3N0cmVhbShfX29iai5fTV9zdHJlYW0pLCBfTV9zdHJpbmcoX19vYmouX01fc3RyaW5nKSAgeyB9CisKKyAgICAgIC8vLyBXcml0ZXMgQGEgdmFsdWUgdG8gdW5kZXJseWluZyBvc3RyZWFtIHVzaW5nIG9wZXJhdG9yPDwuICBJZgorICAgICAgLy8vIGNvbnN0cnVjdGVkIHdpdGggZGVsaW1pdGVyIHN0cmluZywgd3JpdGVzIGRlbGltaXRlciB0byBvc3RyZWFtLgorICAgICAgb3N0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoX01fc3RyZWFtICE9IDAsCisJCQkJX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfb3V0cHV0X29zdHJlYW0pCisJCQkJLl9NX2l0ZXJhdG9yKCp0aGlzKSk7CisJKl9NX3N0cmVhbSA8PCBfX3ZhbHVlOworCWlmIChfTV9zdHJpbmcpICpfTV9zdHJlYW0gPDwgX01fc3RyaW5nOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgb3N0cmVhbV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBvc3RyZWFtX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBvc3RyZWFtX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgLy8gQH0gZ3JvdXAgaXRlcmF0b3JzCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RyZWFtYnVmLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdHJlYW1idWYudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjg1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvc3RyZWFtYnVmLnRjYwpAQCAtMCwwICsxLDE3NiBAQAorLy8gU3RyZWFtIGJ1ZmZlciBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3N0cmVhbWJ1Zi50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtzdHJlYW1idWZ9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjUgIFN0cmVhbSBidWZmZXJzCisvLworCisjaWZuZGVmIF9TVFJFQU1CVUZfVENDCisjZGVmaW5lIF9TVFJFQU1CVUZfVENDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0cmVhbXNpemUKKyAgICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPjo6CisgICAgeHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIHdoaWxlIChfX3JldCA8IF9fbikKKwl7CisJICBjb25zdCBzdHJlYW1zaXplIF9fYnVmX2xlbiA9IHRoaXMtPmVncHRyKCkgLSB0aGlzLT5ncHRyKCk7CisJICBpZiAoX19idWZfbGVuKQorCSAgICB7CisJICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX3JlbWFpbmluZyA9IF9fbiAtIF9fcmV0OworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19sZW4gPSBzdGQ6Om1pbihfX2J1Zl9sZW4sIF9fcmVtYWluaW5nKTsKKwkgICAgICB0cmFpdHNfdHlwZTo6Y29weShfX3MsIHRoaXMtPmdwdHIoKSwgX19sZW4pOworCSAgICAgIF9fcmV0ICs9IF9fbGVuOworCSAgICAgIF9fcyArPSBfX2xlbjsKKwkgICAgICB0aGlzLT5fX3NhZmVfZ2J1bXAoX19sZW4pOworCSAgICB9CisKKwkgIGlmIChfX3JldCA8IF9fbikKKwkgICAgeworCSAgICAgIGNvbnN0IGludF90eXBlIF9fYyA9IHRoaXMtPnVmbG93KCk7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCQl7CisJCSAgdHJhaXRzX3R5cGU6OmFzc2lnbigqX19zKyssIHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX19jKSk7CisJCSAgKytfX3JldDsKKwkJfQorCSAgICAgIGVsc2UKKwkJYnJlYWs7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdHJlYW1zaXplCisgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHhzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RyZWFtc2l6ZSBfX3JldCA9IDA7CisgICAgICB3aGlsZSAoX19yZXQgPCBfX24pCisJeworCSAgY29uc3Qgc3RyZWFtc2l6ZSBfX2J1Zl9sZW4gPSB0aGlzLT5lcHB0cigpIC0gdGhpcy0+cHB0cigpOworCSAgaWYgKF9fYnVmX2xlbikKKwkgICAgeworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX19yZW1haW5pbmcgPSBfX24gLSBfX3JldDsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbGVuID0gc3RkOjptaW4oX19idWZfbGVuLCBfX3JlbWFpbmluZyk7CisJICAgICAgdHJhaXRzX3R5cGU6OmNvcHkodGhpcy0+cHB0cigpLCBfX3MsIF9fbGVuKTsKKwkgICAgICBfX3JldCArPSBfX2xlbjsKKwkgICAgICBfX3MgKz0gX19sZW47CisJICAgICAgdGhpcy0+X19zYWZlX3BidW1wKF9fbGVuKTsKKwkgICAgfQorCisJICBpZiAoX19yZXQgPCBfX24pCisJICAgIHsKKwkgICAgICBpbnRfdHlwZSBfX2MgPSB0aGlzLT5vdmVyZmxvdyh0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKl9fcykpOworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKwkJeworCQkgICsrX19yZXQ7CisJCSAgKytfX3M7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICAvLyBDb25jZWl2YWJseSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIGltcGxlbWVudCBidWZmZXItdG8tYnVmZmVyCisgIC8vIGNvcGllcywgaWYgdGhpcyB3YXMgZXZlciBkZXNpcmVkIGluIGFuIHVuLWFtYmlndW91cyB3YXkgYnkgdGhlCisgIC8vIHN0YW5kYXJkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYmluLAorCQkJICBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiogX19zYm91dCwKKwkJCSAgYm9vbCYgX19pbmVvZikKKyAgICB7CisgICAgICBzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIF9faW5lb2YgPSB0cnVlOworICAgICAgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgX19jID0gX19zYmluLT5zZ2V0YygpOworICAgICAgd2hpbGUgKCFfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9UcmFpdHM6OmVvZigpKSkKKwl7CisJICBfX2MgPSBfX3Nib3V0LT5zcHV0YyhfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKSk7CisJICBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfVHJhaXRzOjplb2YoKSkpCisJICAgIHsKKwkgICAgICBfX2luZW9mID0gZmFsc2U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICsrX19yZXQ7CisJICBfX2MgPSBfX3NiaW4tPnNuZXh0YygpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnMoYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JpbiwKKwkJICAgICAgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2JvdXQpCisgICAgeworICAgICAgYm9vbCBfX2luZW9mOworICAgICAgcmV0dXJuIF9fY29weV9zdHJlYW1idWZzX2VvZihfX3NiaW4sIF9fc2JvdXQsIF9faW5lb2YpOworICAgIH0KKworICAvLyBJbmhpYml0IGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGZvciByZXF1aXJlZCBpbnN0YW50aWF0aW9ucywKKyAgLy8gd2hpY2ggYXJlIGRlZmluZWQgdmlhIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGVsc2V3aGVyZS4KKyNpZiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPjsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiosCisJCSAgICAgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiopOworICBleHRlcm4gdGVtcGxhdGUKKyAgICBzdHJlYW1zaXplCisgICAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mKGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiosCisJCQkgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiosIGJvb2wmKTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD47CisgIGV4dGVybiB0ZW1wbGF0ZQorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmcyhiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qLAorCQkgICAgICBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qKTsKKyAgZXh0ZXJuIHRlbXBsYXRlCisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qLAorCQkJICBiYXNpY19zdHJlYW1idWY8d2NoYXJfdD4qLCBib29sJik7CisjZW5kaWYKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdHJlYW1idWZfaXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2FlNjc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oCkBAIC0wLDAgKzEsNDAyIEBACisvLyBTdHJlYW1idWYgaXRlcmF0b3JzCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aXRlcmF0b3J9CisgKi8KKworI2lmbmRlZiBfU1RSRUFNQlVGX0lURVJBVE9SX0gKKyNkZWZpbmUgX1NUUkVBTUJVRl9JVEVSQVRPUl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgICAgCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBpdGVyYXRvcnMKKyAgICogQHsKKyAgICovCisKKyAgLy8gMjQuNS4zIFRlbXBsYXRlIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3IKKyAgLy8vIFByb3ZpZGVzIGlucHV0IGl0ZXJhdG9yIHNlbWFudGljcyBmb3Igc3RyZWFtYnVmcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcjxpbnB1dF9pdGVyYXRvcl90YWcsIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUsCisJCSAgICAgIF9DaGFyVCosIF9DaGFyVCY+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4JCXN0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCWlzdHJlYW1fdHlwZTsKKyAgICAgIC8vQH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKwlmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsCisJCSAgICAgICAgICAgICAgICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiA+OjpfX3R5cGUKKwljb3B5KGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sCisJICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+KTsKKworICAgICAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQyPgorCWZyaWVuZCB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQyPjo6X192YWx1ZSwgCisJCQkJCSAgICAgICBfQ2hhclQyKj46Ol9fdHlwZQorCV9fY29weV9tb3ZlX2EyKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sCisJCSAgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LCBfQ2hhclQyKik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVDI+CisJZnJpZW5kIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLAorCQkJICAgICAgICAgICAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiA+OjpfX3R5cGUKKwlmaW5kKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sCisJICAgICBjb25zdCBfQ2hhclQyJik7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gMjQuNS4zIGlzdHJlYW1idWZfaXRlcmF0b3IKKyAgICAgIC8vIHAgMQorICAgICAgLy8gSWYgdGhlIGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZCAoc3RyZWFtYnVmX3R5cGU6OnNnZXRjKCkKKyAgICAgIC8vIHJldHVybnMgdHJhaXRzX3R5cGU6OmVvZigpKSwgdGhlIGl0ZXJhdG9yIGJlY29tZXMgZXF1YWwgdG8KKyAgICAgIC8vIHRoZSAiZW5kIG9mIHN0cmVhbSIgaXRlcmF0b3IgdmFsdWUuCisgICAgICAvLyBOQjogVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoZSAiZW5kIG9mIHN0cmVhbSIgdmFsdWUKKyAgICAgIC8vIGlzIEVPRiwgb3IgLTEuCisgICAgICBtdXRhYmxlIHN0cmVhbWJ1Zl90eXBlKglfTV9zYnVmOworICAgICAgbXV0YWJsZSBpbnRfdHlwZQkJX01fYzsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyAgQ29uc3RydWN0IGVuZCBvZiBpbnB1dCBzdHJlYW0gaXRlcmF0b3IuCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgaXN0cmVhbWJ1Zl9pdGVyYXRvcigpIHRocm93KCkKKyAgICAgIDogX01fc2J1ZigwKSwgX01fYyh0cmFpdHNfdHlwZTo6ZW9mKCkpIHsgfQorCisgICAgICAvLy8gIENvbnN0cnVjdCBzdGFydCBvZiBpbnB1dCBzdHJlYW0gaXRlcmF0b3IuCisgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yKGlzdHJlYW1fdHlwZSYgX19zKSB0aHJvdygpCisgICAgICA6IF9NX3NidWYoX19zLnJkYnVmKCkpLCBfTV9jKHRyYWl0c190eXBlOjplb2YoKSkgeyB9CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IHN0YXJ0IG9mIHN0cmVhbWJ1ZiBpdGVyYXRvci4KKyAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3Ioc3RyZWFtYnVmX3R5cGUqIF9fcykgdGhyb3coKQorICAgICAgOiBfTV9zYnVmKF9fcyksIF9NX2ModHJhaXRzX3R5cGU6OmVvZigpKSB7IH0KKworICAgICAgLy8vICBSZXR1cm4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIHBvaW50ZWQgdG8gYnkgaXRlcmF0b3IuICBUaGlzIHJldHVybnMKKyAgICAgIC8vLyAgc3RyZWFtYnVmLnNnZXRjKCkuICBJdCBjYW5ub3QgYmUgYXNzaWduZWQuICBOQjogVGhlIHJlc3VsdCBvZgorICAgICAgLy8vICBvcGVyYXRvciooKSBvbiBhbiBlbmQgb2Ygc3RyZWFtIGlzIHVuZGVmaW5lZC4KKyAgICAgIGNoYXJfdHlwZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworCS8vIERlcmVmZXJlbmNpbmcgYSBwYXN0LXRoZS1lbmQgaXN0cmVhbWJ1Zl9pdGVyYXRvciBpcyBhCisJLy8gbGlic3RkYysrIGV4dGVuc2lvbgorCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKCFfTV9hdF9lb2YoKSwKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19kZXJlZl9pc3RyZWFtYnVmKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworI2VuZGlmCisJcmV0dXJuIHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoX01fZ2V0KCkpOworICAgICAgfQorCisgICAgICAvLy8gQWR2YW5jZSB0aGUgaXRlcmF0b3IuICBDYWxscyBzdHJlYW1idWYuc2J1bXBjKCkuCisgICAgICBpc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX2NvbmQoIV9NX2F0X2VvZigpLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luY19pc3RyZWFtYnVmKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCWlmIChfTV9zYnVmKQorCSAgeworCSAgICBfTV9zYnVmLT5zYnVtcGMoKTsKKwkgICAgX01fYyA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgIH0KKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBBZHZhbmNlIHRoZSBpdGVyYXRvci4gIENhbGxzIHN0cmVhbWJ1Zi5zYnVtcGMoKS4KKyAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19jb25kKCFfTV9hdF9lb2YoKSwKKwkJCQlfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbmNfaXN0cmVhbWJ1ZikKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKworCWlzdHJlYW1idWZfaXRlcmF0b3IgX19vbGQgPSAqdGhpczsKKwlpZiAoX01fc2J1ZikKKwkgIHsKKwkgICAgX19vbGQuX01fYyA9IF9NX3NidWYtPnNidW1wYygpOworCSAgICBfTV9jID0gdHJhaXRzX3R5cGU6OmVvZigpOworCSAgfQorCXJldHVybiBfX29sZDsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTEwIGlzdHJlYW1idWZfaXRlcmF0b3I6OmVxdWFsIG5vdCBjb25zdAorICAgICAgLy8gTkI6IHRoZXJlIGlzIGFsc28gbnVtYmVyIDExMSAoTkFELCBGdXR1cmUpIHBlbmRpbmcgb24gdGhpcyBmdW5jdGlvbi4KKyAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBib3RoIGl0ZXJhdG9ycyBhcmUgZW5kIG9yIGJvdGggYXJlIG5vdCBlbmQuCisgICAgICBib29sCisgICAgICBlcXVhbChjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yJiBfX2IpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9hdF9lb2YoKSA9PSBfX2IuX01fYXRfZW9mKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBpbnRfdHlwZQorICAgICAgX01fZ2V0KCkgY29uc3QKKyAgICAgIHsKKwljb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwlpbnRfdHlwZSBfX3JldCA9IF9fZW9mOworCWlmIChfTV9zYnVmKQorCSAgeworCSAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfTV9jLCBfX2VvZikpCisJICAgICAgX19yZXQgPSBfTV9jOworCSAgICBlbHNlIGlmICghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKChfX3JldCA9IF9NX3NidWYtPnNnZXRjKCkpLAorCQkJCQkgICAgICAgX19lb2YpKQorCSAgICAgIF9NX2MgPSBfX3JldDsKKwkgICAgZWxzZQorCSAgICAgIF9NX3NidWYgPSAwOworCSAgfQorCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01fYXRfZW9mKCkgY29uc3QKKyAgICAgIHsKKwljb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKwlyZXR1cm4gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9NX2dldCgpLCBfX2VvZik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX19hLAorCSAgICAgICBjb25zdCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4mIF9fYikKKyAgICB7IHJldHVybiBfX2EuZXF1YWwoX19iKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+JiBfX2EsCisJICAgICAgIGNvbnN0IGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiYgX19iKQorICAgIHsgcmV0dXJuICFfX2EuZXF1YWwoX19iKTsgfQorCisgIC8vLyBQcm92aWRlcyBvdXRwdXQgaXRlcmF0b3Igc2VtYW50aWNzIGZvciBzdHJlYW1idWZzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3Mgb3N0cmVhbWJ1Zl9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yPG91dHB1dF9pdGVyYXRvcl90YWcsIHZvaWQsIHZvaWQsIHZvaWQsIHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgLy9AeworICAgICAgLy8vIFB1YmxpYyB0eXBlZGVmcworICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiBzdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgb3N0cmVhbV90eXBlOworICAgICAgLy9AfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyPgorCWZyaWVuZCB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQyPjo6X192YWx1ZSwKKwkJICAgICAgICAgICAgICAgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+ID46Ol9fdHlwZQorCWNvcHkoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwKKwkgICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4pOworCisgICAgcHJpdmF0ZToKKyAgICAgIHN0cmVhbWJ1Zl90eXBlKglfTV9zYnVmOworICAgICAgYm9vbAkJX01fZmFpbGVkOworCisgICAgcHVibGljOgorICAgICAgLy8vICBDb25zdHJ1Y3Qgb3V0cHV0IGl0ZXJhdG9yIGZyb20gb3N0cmVhbS4KKyAgICAgIG9zdHJlYW1idWZfaXRlcmF0b3Iob3N0cmVhbV90eXBlJiBfX3MpIHRocm93ICgpCisgICAgICA6IF9NX3NidWYoX19zLnJkYnVmKCkpLCBfTV9mYWlsZWQoIV9NX3NidWYpIHsgfQorCisgICAgICAvLy8gIENvbnN0cnVjdCBvdXRwdXQgaXRlcmF0b3IgZnJvbSBzdHJlYW1idWYuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yKHN0cmVhbWJ1Zl90eXBlKiBfX3MpIHRocm93ICgpCisgICAgICA6IF9NX3NidWYoX19zKSwgX01fZmFpbGVkKCFfTV9zYnVmKSB7IH0KKworICAgICAgLy8vICBXcml0ZSBjaGFyYWN0ZXIgdG8gc3RyZWFtYnVmLiAgQ2FsbHMgc3RyZWFtYnVmLnNwdXRjKCkuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpCisgICAgICB7CisJaWYgKCFfTV9mYWlsZWQgJiYKKwkgICAgX1RyYWl0czo6ZXFfaW50X3R5cGUoX01fc2J1Zi0+c3B1dGMoX19jKSwgX1RyYWl0czo6ZW9mKCkpKQorCSAgX01fZmFpbGVkID0gdHJ1ZTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXR1cm4gKnRoaXMuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIC8vLyBSZXR1cm4gKnRoaXMuCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLy8gUmV0dXJuICp0aGlzLgorICAgICAgb3N0cmVhbWJ1Zl9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHByZXZpb3VzIG9wZXJhdG9yPSgpIGZhaWxlZC4KKyAgICAgIGJvb2wKKyAgICAgIGZhaWxlZCgpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIF9NX2ZhaWxlZDsgfQorCisgICAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yJgorICAgICAgX01fcHV0KGNvbnN0IF9DaGFyVCogX193cywgc3RyZWFtc2l6ZSBfX2xlbikKKyAgICAgIHsKKwlpZiAoX19idWlsdGluX2V4cGVjdCghX01fZmFpbGVkLCB0cnVlKQorCSAgICAmJiBfX2J1aWx0aW5fZXhwZWN0KHRoaXMtPl9NX3NidWYtPnNwdXRuKF9fd3MsIF9fbGVuKSAhPSBfX2xlbiwKKwkJCQlmYWxzZSkpCisJICBfTV9mYWlsZWQgPSB0cnVlOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIE92ZXJsb2FkcyBmb3Igc3RyZWFtYnVmIGl0ZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsCisgICAgCSAgICAgICAgICAgICAgICAgCSAgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gPjo6X190eXBlCisgICAgY29weShpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19maXJzdCwKKwkgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fbGFzdCwKKwkgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+IF9fcmVzdWx0KQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0Ll9NX3NidWYgJiYgIV9fbGFzdC5fTV9zYnVmICYmICFfX3Jlc3VsdC5fTV9mYWlsZWQpCisJeworCSAgYm9vbCBfX2luZW9mOworCSAgX19jb3B5X3N0cmVhbWJ1ZnNfZW9mKF9fZmlyc3QuX01fc2J1ZiwgX19yZXN1bHQuX01fc2J1ZiwgX19pbmVvZik7CisJICBpZiAoIV9faW5lb2YpCisJICAgIF9fcmVzdWx0Ll9NX2ZhaWxlZCA9IHRydWU7CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTxib29sIF9Jc01vdmUsIHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLCAKKyAgICAJCQkJICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihfQ2hhclQqIF9fZmlyc3QsIF9DaGFyVCogX19sYXN0LAorCQkgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19yZXN1bHQpCisgICAgeworICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX251bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBpZiAoX19udW0gPiAwKQorCV9fcmVzdWx0Ll9NX3B1dChfX2ZpcnN0LCBfX251bSk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsCisJCQkJICAgIG9zdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBfX2NvcHlfbW92ZV9hMihjb25zdCBfQ2hhclQqIF9fZmlyc3QsIGNvbnN0IF9DaGFyVCogX19sYXN0LAorCQkgICBvc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19yZXN1bHQpCisgICAgeworICAgICAgY29uc3Qgc3RyZWFtc2l6ZSBfX251bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgICBpZiAoX19udW0gPiAwKQorCV9fcmVzdWx0Ll9NX3B1dChfX2ZpcnN0LCBfX251bSk7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPGJvb2wgX0lzTW92ZSwgdHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVD46Ol9fdmFsdWUsIAorICAgIAkJCQkgICAgX0NoYXJUKj46Ol9fdHlwZQorICAgIF9fY29weV9tb3ZlX2EyKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2ZpcnN0LAorCQkgICBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19sYXN0LCBfQ2hhclQqIF9fcmVzdWx0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgX19pc19pdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzX2l0ZXJhdG9yX3R5cGU6OnRyYWl0c190eXBlICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc19pdGVyYXRvcl90eXBlOjpzdHJlYW1idWZfdHlwZSAgc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAgICAgICAgICAgICAgIGludF90eXBlOworCisgICAgICBpZiAoX19maXJzdC5fTV9zYnVmICYmICFfX2xhc3QuX01fc2J1ZikKKwl7CisJICBzdHJlYW1idWZfdHlwZSogX19zYiA9IF9fZmlyc3QuX01fc2J1ZjsKKwkgIGludF90eXBlIF9fYyA9IF9fc2ItPnNnZXRjKCk7CisJICB3aGlsZSAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJICAgIHsKKwkgICAgICBjb25zdCBzdHJlYW1zaXplIF9fbiA9IF9fc2ItPmVncHRyKCkgLSBfX3NiLT5ncHRyKCk7CisJICAgICAgaWYgKF9fbiA+IDEpCisJCXsKKwkJICB0cmFpdHNfdHlwZTo6Y29weShfX3Jlc3VsdCwgX19zYi0+Z3B0cigpLCBfX24pOworCQkgIF9fc2ItPl9fc2FmZV9nYnVtcChfX24pOworCQkgIF9fcmVzdWx0ICs9IF9fbjsKKwkJICBfX2MgPSBfX3NiLT51bmRlcmZsb3coKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgICpfX3Jlc3VsdCsrID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgIF9fYyA9IF9fc2ItPnNuZXh0YygpOworCQl9CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfY2hhcjxfQ2hhclQ+OjpfX3ZhbHVlLAorCQkgIAkJICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiA+OjpfX3R5cGUKKyAgICBmaW5kKGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUPiBfX2ZpcnN0LAorCSBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVD4gX19sYXN0LCBjb25zdCBfQ2hhclQmIF9fdmFsKQorICAgIHsKKyAgICAgIHR5cGVkZWYgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQ+ICAgICAgICAgICAgICAgICAgX19pc19pdGVyYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzX2l0ZXJhdG9yX3R5cGU6OnRyYWl0c190eXBlICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc19pdGVyYXRvcl90eXBlOjpzdHJlYW1idWZfdHlwZSAgc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZSAgICAgICAgICAgICAgIGludF90eXBlOworCisgICAgICBpZiAoX19maXJzdC5fTV9zYnVmICYmICFfX2xhc3QuX01fc2J1ZikKKwl7CisJICBjb25zdCBpbnRfdHlwZSBfX2l2YWwgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX192YWwpOworCSAgc3RyZWFtYnVmX3R5cGUqIF9fc2IgPSBfX2ZpcnN0Ll9NX3NidWY7CisJICBpbnRfdHlwZSBfX2MgPSBfX3NiLT5zZ2V0YygpOworCSAgd2hpbGUgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpCisJCSAmJiAhdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19pdmFsKSkKKwkgICAgeworCSAgICAgIHN0cmVhbXNpemUgX19uID0gX19zYi0+ZWdwdHIoKSAtIF9fc2ItPmdwdHIoKTsKKwkgICAgICBpZiAoX19uID4gMSkKKwkJeworCQkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zYi0+Z3B0cigpLAorCQkJCQkJCV9fbiwgX192YWwpOworCQkgIGlmIChfX3ApCisJCSAgICBfX24gPSBfX3AgLSBfX3NiLT5ncHRyKCk7CisJCSAgX19zYi0+X19zYWZlX2didW1wKF9fbik7CisJCSAgX19jID0gX19zYi0+c2dldGMoKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJX19jID0gX19zYi0+c25leHRjKCk7CisJICAgIH0KKworCSAgaWYgKCF0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoX19jLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorCSAgICBfX2ZpcnN0Ll9NX2MgPSBfX2M7CisJICBlbHNlCisJICAgIF9fZmlyc3QuX01fc2J1ZiA9IDA7CisJfQorICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisvLyBAfSBncm91cCBpdGVyYXRvcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdHJpbmdmd2QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy9zdHJpbmdmd2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJkNDljCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3N0cmluZ2Z3ZC5oCkBAIC0wLDAgKzEsODggQEAKKy8vIFN0cmluZyBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwKKy8vIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3N0cmluZ2Z3ZC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7c3RyaW5nfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMSBTdHJpbmdzIGxpYnJhcnkKKy8vCisKKyNpZm5kZWYgX1NUUklOR0ZXRF9ICisjZGVmaW5lIF9TVFJJTkdGV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYWxsb2NhdG9yOworCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIHN0cmluZ3MgU3RyaW5ncworICAgKgorICAgKiAgQHsKKyAgKi8KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisgICAgICAgICAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmc7CisKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgY2hhcl90cmFpdHM8Y2hhcj47CisKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcj4gICAgc3RyaW5nOyAgIC8vLyBBIHN0cmluZyBvZiBAYyBjaGFyCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+IHN0cnVjdCBjaGFyX3RyYWl0czx3Y2hhcl90PjsKKworICB0eXBlZGVmIGJhc2ljX3N0cmluZzx3Y2hhcl90PiB3c3RyaW5nOyAgIC8vLyBBIHN0cmluZyBvZiBAYyB3Y2hhcl90CisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSBcCisgICAgICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKSkKKworICB0ZW1wbGF0ZTw+IHN0cnVjdCBjaGFyX3RyYWl0czxjaGFyMTZfdD47CisgIHRlbXBsYXRlPD4gc3RydWN0IGNoYXJfdHJhaXRzPGNoYXIzMl90PjsKKworICB0eXBlZGVmIGJhc2ljX3N0cmluZzxjaGFyMTZfdD4gdTE2c3RyaW5nOyAvLy8gQSBzdHJpbmcgb2YgQGMgY2hhcjE2X3QKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcjMyX3Q+IHUzMnN0cmluZzsgLy8vIEEgc3RyaW5nIG9mIEBjIGNoYXIzMl90CisKKyNlbmRpZgorICAvKiogQH0gICovCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCS8vIF9TVFJJTkdGV0RfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3VuaXF1ZV9wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy91bmlxdWVfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZDg2MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy91bmlxdWVfcHRyLmgKQEAgLTAsMCArMSw1MTEgQEAKKy8vIHVuaXF1ZV9wdHIgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3VuaXF1ZV9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le21lbW9yeX0KKyAqLworCisjaWZuZGVmIF9VTklRVUVfUFRSX0gKKyNkZWZpbmUgX1VOSVFVRV9QVFJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBwb2ludGVyX2Fic3RyYWN0aW9ucworICAgKiBAeworICAgKi8KKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSwgZGVmYXVsdF9kZWxldGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgZGVmYXVsdF9kZWxldGUKKyAgICB7CisgICAgICBjb25zdGV4cHIgZGVmYXVsdF9kZWxldGUoKSA9IGRlZmF1bHQ7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9VcCosIF9UcCo+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGRlZmF1bHRfZGVsZXRlKGNvbnN0IGRlZmF1bHRfZGVsZXRlPF9VcD4mKSB7IH0KKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcHRyKSBjb25zdAorICAgICAgeworCXN0YXRpY19hc3NlcnQoc2l6ZW9mKF9UcCk+MCwKKwkJICAgICAgImNhbid0IGRlbGV0ZSBwb2ludGVyIHRvIGluY29tcGxldGUgdHlwZSIpOworCWRlbGV0ZSBfX3B0cjsKKyAgICAgIH0KKyAgICB9OworCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgNzQwIC0gb21pdCBzcGVjaWFsaXphdGlvbiBmb3IgYXJyYXkgb2JqZWN0cyB3aXRoIGEgY29tcGlsZSB0aW1lIGxlbmd0aAorICAvLy8gU3BlY2lhbGl6YXRpb24sIGRlZmF1bHRfZGVsZXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGRlZmF1bHRfZGVsZXRlPF9UcFtdPgorICAgIHsKKyAgICAgIGNvbnN0ZXhwciBkZWZhdWx0X2RlbGV0ZSgpID0gZGVmYXVsdDsKKworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShfVHAqIF9fcHRyKSBjb25zdAorICAgICAgeworCXN0YXRpY19hc3NlcnQoc2l6ZW9mKF9UcCk+MCwKKwkJICAgICAgImNhbid0IGRlbGV0ZSBwb2ludGVyIHRvIGluY29tcGxldGUgdHlwZSIpOworCWRlbGV0ZSBbXSBfX3B0cjsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiB2b2lkIG9wZXJhdG9yKCkoX1VwKikgY29uc3QgPSBkZWxldGU7CisgICAgfTsKKworICAvLy8gMjAuNy4xMi4yIHVuaXF1ZV9wdHIgZm9yIHNpbmdsZSBvYmplY3RzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAgPSBkZWZhdWx0X2RlbGV0ZTxfVHA+ID4KKyAgICBjbGFzcyB1bmlxdWVfcHRyCisgICAgeworICAgICAgLy8gdXNlIFNGSU5BRSB0byBkZXRlcm1pbmUgd2hldGhlciBfRGVsOjpwb2ludGVyIGV4aXN0cworICAgICAgY2xhc3MgX1BvaW50ZXIKKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJICBzdGF0aWMgdHlwZW5hbWUgX1VwOjpwb2ludGVyIF9fdGVzdCh0eXBlbmFtZSBfVXA6OnBvaW50ZXIqKTsKKworCXRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwkgIHN0YXRpYyBfVHAqIF9fdGVzdCguLi4pOworCisJdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9EcD46OnR5cGUgX0RlbDsKKworICAgICAgcHVibGljOgorCXR5cGVkZWYgZGVjbHR5cGUoIF9fdGVzdDxfRGVsPigwKSkgdHlwZTsKKyAgICAgIH07CisKKyAgICAgIHR5cGVkZWYgc3RkOjp0dXBsZTx0eXBlbmFtZSBfUG9pbnRlcjo6dHlwZSwgX0RwPiAgX190dXBsZV90eXBlOworICAgICAgX190dXBsZV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV90OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUG9pbnRlcjo6dHlwZSAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlOworICAgICAgdHlwZWRlZiBfRHAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZXJfdHlwZTsKKworICAgICAgLy8gQ29uc3RydWN0b3JzLgorICAgICAgY29uc3RleHByIHVuaXF1ZV9wdHIoKQorICAgICAgOiBfTV90KCkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaXF1ZV9wdHIocG9pbnRlciBfX3ApCisgICAgICA6IF9NX3QoX19wLCBkZWxldGVyX3R5cGUoKSkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwKKwkgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c3RkOjppc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJICAgIGRlbGV0ZXJfdHlwZSwgY29uc3QgZGVsZXRlcl90eXBlJj46OnR5cGUgX19kKQorICAgICAgOiBfTV90KF9fcCwgX19kKSB7IH0KKworICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwKKwkgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxkZWxldGVyX3R5cGU+Ojp0eXBlJiYgX19kKQorICAgICAgOiBfTV90KHN0ZDo6bW92ZShfX3ApLCBzdGQ6Om1vdmUoX19kKSkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgICJydmFsdWUgZGVsZXRlciBib3VuZCB0byByZWZlcmVuY2UiKTsgfQorCisgICAgICBjb25zdGV4cHIgdW5pcXVlX3B0cihudWxscHRyX3QpCisgICAgICA6IF9NX3QoKQorICAgICAgeyBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvaW50ZXI8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgImNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsgfQorCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdG9ycy4KKyAgICAgIHVuaXF1ZV9wdHIodW5pcXVlX3B0ciYmIF9fdSkKKyAgICAgIDogX01fdChfX3UucmVsZWFzZSgpLCBzdGQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmCisJICA8c3RkOjppc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9VcCwgX0VwPjo6cG9pbnRlciwKKwkJCSAgICAgICBwb2ludGVyPjo6dmFsdWUKKwkgICAmJiAhc3RkOjppc19hcnJheTxfVXA+Ojp2YWx1ZQorCSAgICYmICgoc3RkOjppc19yZWZlcmVuY2U8X0RwPjo6dmFsdWUKKwkJJiYgc3RkOjppc19zYW1lPF9FcCwgX0RwPjo6dmFsdWUpCisJICAgICAgIHx8ICghc3RkOjppc19yZWZlcmVuY2U8X0RwPjo6dmFsdWUKKwkJICAgJiYgc3RkOjppc19jb252ZXJ0aWJsZTxfRXAsIF9EcD46OnZhbHVlKSk+CisJICAgICA6OnR5cGU+CisJdW5pcXVlX3B0cih1bmlxdWVfcHRyPF9VcCwgX0VwPiYmIF9fdSkKKwk6IF9NX3QoX191LnJlbGVhc2UoKSwgc3RkOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpKQorCXsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1VwKiwgX1RwKj46OnZhbHVlCisJCSAgICAgICAmJiBzdGQ6OmlzX3NhbWU8X0RwLAorCQkJCSAgICAgICBkZWZhdWx0X2RlbGV0ZTxfVHA+Pjo6dmFsdWU+Ojp0eXBlPgorCXVuaXF1ZV9wdHIoYXV0b19wdHI8X1VwPiYmIF9fdSkKKwk6IF9NX3QoX191LnJlbGVhc2UoKSwgZGVsZXRlcl90eXBlKCkpIHsgfQorI2VuZGlmCisKKyAgICAgIC8vIERlc3RydWN0b3IuCisgICAgICB+dW5pcXVlX3B0cigpIHsgcmVzZXQoKTsgfQorCisgICAgICAvLyBBc3NpZ25tZW50LgorICAgICAgdW5pcXVlX3B0ciYKKyAgICAgIG9wZXJhdG9yPSh1bmlxdWVfcHRyJiYgX191KQorICAgICAgeworCXJlc2V0KF9fdS5yZWxlYXNlKCkpOworCWdldF9kZWxldGVyKCkgPSBzdGQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcCwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCXN0ZDo6ZW5hYmxlX2lmCisJICA8c3RkOjppc19jb252ZXJ0aWJsZTx0eXBlbmFtZSB1bmlxdWVfcHRyPF9VcCwgX0VwPjo6cG9pbnRlciwKKwkJCSAgICAgICBwb2ludGVyPjo6dmFsdWUKKwkgICAmJiAhc3RkOjppc19hcnJheTxfVXA+Ojp2YWx1ZT46OnR5cGU+CisJdW5pcXVlX3B0ciYKKwlvcGVyYXRvcj0odW5pcXVlX3B0cjxfVXAsIF9FcD4mJiBfX3UpCisJeworCSAgcmVzZXQoX191LnJlbGVhc2UoKSk7CisJICBnZXRfZGVsZXRlcigpID0gc3RkOjpmb3J3YXJkPF9FcD4oX191LmdldF9kZWxldGVyKCkpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdW5pcXVlX3B0ciYKKyAgICAgIG9wZXJhdG9yPShudWxscHRyX3QpCisgICAgICB7CisJcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIE9ic2VydmVycy4KKyAgICAgIHR5cGVuYW1lIHN0ZDo6YWRkX2x2YWx1ZV9yZWZlcmVuY2U8ZWxlbWVudF90eXBlPjo6dHlwZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZ2V0KCkgIT0gcG9pbnRlcigpKTsKKwlyZXR1cm4gKmdldCgpOworICAgICAgfQorCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZ2V0KCkgIT0gcG9pbnRlcigpKTsKKwlyZXR1cm4gZ2V0KCk7CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGdldCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwwPihfTV90KTsgfQorCisgICAgICBkZWxldGVyX3R5cGUmCisgICAgICBnZXRfZGVsZXRlcigpCisgICAgICB7IHJldHVybiBzdGQ6OmdldDwxPihfTV90KTsgfQorCisgICAgICBjb25zdCBkZWxldGVyX3R5cGUmCisgICAgICBnZXRfZGVsZXRlcigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwxPihfTV90KTsgfQorCisgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGdldCgpID09IHBvaW50ZXIoKSA/IGZhbHNlIDogdHJ1ZTsgfQorCisgICAgICAvLyBNb2RpZmllcnMuCisgICAgICBwb2ludGVyCisgICAgICByZWxlYXNlKCkKKyAgICAgIHsKKwlwb2ludGVyIF9fcCA9IGdldCgpOworCXN0ZDo6Z2V0PDA+KF9NX3QpID0gcG9pbnRlcigpOworCXJldHVybiBfX3A7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KHBvaW50ZXIgX19wID0gcG9pbnRlcigpKQorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKHN0ZDo6Z2V0PDA+KF9NX3QpLCBfX3ApOworCWlmIChfX3AgIT0gcG9pbnRlcigpKQorCSAgZ2V0X2RlbGV0ZXIoKShfX3ApOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVuaXF1ZV9wdHImIF9fdSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChfTV90LCBfX3UuX01fdCk7CisgICAgICB9CisKKyAgICAgIC8vIERpc2FibGUgY29weSBmcm9tIGx2YWx1ZS4KKyAgICAgIHVuaXF1ZV9wdHIoY29uc3QgdW5pcXVlX3B0ciYpID0gZGVsZXRlOworICAgICAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKKyAgfTsKKworICAvLy8gMjAuNy4xMi4zIHVuaXF1ZV9wdHIgZm9yIGFycmF5IG9iamVjdHMgd2l0aCBhIHJ1bnRpbWUgbGVuZ3RoCisgIC8vIFt1bmlxdWUucHRyLnJ1bnRpbWVdCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgNzQwIC0gb21pdCBzcGVjaWFsaXphdGlvbiBmb3IgYXJyYXkgb2JqZWN0cyB3aXRoIGEgY29tcGlsZSB0aW1lIGxlbmd0aAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBjbGFzcyB1bmlxdWVfcHRyPF9UcFtdLCBfRHA+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OnR1cGxlPF9UcCosIF9EcD4gIAlfX3R1cGxlX3R5cGU7CisgICAgICBfX3R1cGxlX3R5cGUgCQkJX01fdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwKgkJIAlwb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAJCSAJZWxlbWVudF90eXBlOworICAgICAgdHlwZWRlZiBfRHAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZXJfdHlwZTsKKworICAgICAgLy8gQ29uc3RydWN0b3JzLgorICAgICAgY29uc3RleHByIHVuaXF1ZV9wdHIoKQorICAgICAgOiBfTV90KCkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIHVuaXF1ZV9wdHIocG9pbnRlciBfX3ApCisgICAgICA6IF9NX3QoX19wLCBkZWxldGVyX3R5cGUoKSkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2ludGVyPGRlbGV0ZXJfdHlwZT46OnZhbHVlLAorCQkgICAgICJjb25zdHJ1Y3RlZCB3aXRoIG51bGwgZnVuY3Rpb24gcG9pbnRlciBkZWxldGVyIik7IH0KKworICAgICAgdW5pcXVlX3B0cihwb2ludGVyIF9fcCwKKwkgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8c3RkOjppc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJICAgICAgZGVsZXRlcl90eXBlLCBjb25zdCBkZWxldGVyX3R5cGUmPjo6dHlwZSBfX2QpCisgICAgICA6IF9NX3QoX19wLCBfX2QpIHsgfQorCisgICAgICB1bmlxdWVfcHRyKHBvaW50ZXIgX19wLAorCQkgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnR5cGUgJiYgX19kKQorICAgICAgOiBfTV90KHN0ZDo6bW92ZShfX3ApLCBzdGQ6Om1vdmUoX19kKSkKKyAgICAgIHsgc3RhdGljX2Fzc2VydCghc3RkOjppc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgICJydmFsdWUgZGVsZXRlciBib3VuZCB0byByZWZlcmVuY2UiKTsgfQorCisgICAgICBjb25zdGV4cHIgdW5pcXVlX3B0cihudWxscHRyX3QpCisgICAgICA6IF9NX3QoKQorICAgICAgeyBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvaW50ZXI8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgICAgImNvbnN0cnVjdGVkIHdpdGggbnVsbCBmdW5jdGlvbiBwb2ludGVyIGRlbGV0ZXIiKTsgfQorCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdG9ycy4KKyAgICAgIHVuaXF1ZV9wdHIodW5pcXVlX3B0ciYmIF9fdSkKKyAgICAgIDogX01fdChfX3UucmVsZWFzZSgpLCBzdGQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKwl1bmlxdWVfcHRyKHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiYgX191KQorCTogX01fdChfX3UucmVsZWFzZSgpLCBzdGQ6OmZvcndhcmQ8X0VwPihfX3UuZ2V0X2RlbGV0ZXIoKSkpCisJeyB9CisKKyAgICAgIC8vIERlc3RydWN0b3IuCisgICAgICB+dW5pcXVlX3B0cigpIHsgcmVzZXQoKTsgfQorCisgICAgICAvLyBBc3NpZ25tZW50LgorICAgICAgdW5pcXVlX3B0ciYKKyAgICAgIG9wZXJhdG9yPSh1bmlxdWVfcHRyJiYgX191KQorICAgICAgeworCXJlc2V0KF9fdS5yZWxlYXNlKCkpOworCWdldF9kZWxldGVyKCkgPSBzdGQ6OmZvcndhcmQ8ZGVsZXRlcl90eXBlPihfX3UuZ2V0X2RlbGV0ZXIoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKwl1bmlxdWVfcHRyJgorCW9wZXJhdG9yPSh1bmlxdWVfcHRyPF9VcCwgX0VwPiYmIF9fdSkKKwl7CisJICByZXNldChfX3UucmVsZWFzZSgpKTsKKwkgIGdldF9kZWxldGVyKCkgPSBzdGQ6OmZvcndhcmQ8X0VwPihfX3UuZ2V0X2RlbGV0ZXIoKSk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB1bmlxdWVfcHRyJgorICAgICAgb3BlcmF0b3I9KG51bGxwdHJfdCkKKyAgICAgIHsKKwlyZXNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gT2JzZXJ2ZXJzLgorICAgICAgdHlwZW5hbWUgc3RkOjphZGRfbHZhbHVlX3JlZmVyZW5jZTxlbGVtZW50X3R5cGU+Ojp0eXBlCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGdldCgpICE9IHBvaW50ZXIoKSk7CisJcmV0dXJuIGdldCgpW19faV07CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGdldCgpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwwPihfTV90KTsgfQorCisgICAgICBkZWxldGVyX3R5cGUmCisgICAgICBnZXRfZGVsZXRlcigpCisgICAgICB7IHJldHVybiBzdGQ6OmdldDwxPihfTV90KTsgfQorCisgICAgICBjb25zdCBkZWxldGVyX3R5cGUmCisgICAgICBnZXRfZGVsZXRlcigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmdldDwxPihfTV90KTsgfQorCisgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGdldCgpID09IHBvaW50ZXIoKSA/IGZhbHNlIDogdHJ1ZTsgfQorCisgICAgICAvLyBNb2RpZmllcnMuCisgICAgICBwb2ludGVyCisgICAgICByZWxlYXNlKCkKKyAgICAgIHsKKwlwb2ludGVyIF9fcCA9IGdldCgpOworCXN0ZDo6Z2V0PDA+KF9NX3QpID0gcG9pbnRlcigpOworCXJldHVybiBfX3A7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KHBvaW50ZXIgX19wID0gcG9pbnRlcigpKQorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKHN0ZDo6Z2V0PDA+KF9NX3QpLCBfX3ApOworCWlmIChfX3AgIT0gbnVsbHB0cikKKwkgIGdldF9kZWxldGVyKCkoX19wKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQobnVsbHB0cl90KQorICAgICAgeworCXBvaW50ZXIgX19wID0gZ2V0KCk7CisJc3RkOjpnZXQ8MD4oX01fdCkgPSBwb2ludGVyKCk7CisJaWYgKF9fcCAhPSBudWxscHRyKQorCSAgZ2V0X2RlbGV0ZXIoKShfX3ApOworICAgICAgfQorCisgICAgICAvLyBEUiA4MjEuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJdm9pZCByZXNldChfVXApID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHVuaXF1ZV9wdHImIF9fdSkKKyAgICAgIHsKKwl1c2luZyBzdGQ6OnN3YXA7CisJc3dhcChfTV90LCBfX3UuX01fdCk7CisgICAgICB9CisKKyAgICAgIC8vIERpc2FibGUgY29weSBmcm9tIGx2YWx1ZS4KKyAgICAgIHVuaXF1ZV9wdHIoY29uc3QgdW5pcXVlX3B0ciYpID0gZGVsZXRlOworICAgICAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKKworICAgICAgLy8gRGlzYWJsZSBjb25zdHJ1Y3Rpb24gZnJvbSBjb252ZXJ0aWJsZSBwb2ludGVyIHR5cGVzLgorICAgICAgLy8gKE4yMzE1IC0gMjAuNi41LjMuMSkKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKwl1bmlxdWVfcHRyKF9VcCosIHR5cGVuYW1lCisJCSAgIHN0ZDo6Y29uZGl0aW9uYWw8c3RkOjppc19yZWZlcmVuY2U8ZGVsZXRlcl90eXBlPjo6dmFsdWUsCisJCSAgIGRlbGV0ZXJfdHlwZSwgY29uc3QgZGVsZXRlcl90eXBlJj46OnR5cGUsCisJCSAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1VwKiwKKwkJICAgcG9pbnRlcj46OnZhbHVlPjo6dHlwZSogPSAwKSA9IGRlbGV0ZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorCXVuaXF1ZV9wdHIoX1VwKiwgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlbGV0ZXJfdHlwZT46OnR5cGUmJiwKKwkJICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfVXAqLAorCQkgICBwb2ludGVyPjo6dmFsdWU+Ojp0eXBlKiA9IDApID0gZGVsZXRlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisJZXhwbGljaXQKKwl1bmlxdWVfcHRyKF9VcCosIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1VwKiwKKwkJICAgcG9pbnRlcj46OnZhbHVlPjo6dHlwZSogPSAwKSA9IGRlbGV0ZTsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3guZ2V0KCkgPT0gX195LmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiBfX3guZ2V0KCkgPT0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3kpCisgICAgeyByZXR1cm4gbnVsbHB0ciA9PSBfX3kuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICAgY29uc3QgdW5pcXVlX3B0cjxfVXAsIF9FcD4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feC5nZXQoKSA9PSBfX3kuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsIG51bGxwdHJfdCkKKyAgICB7IHJldHVybiBfX3guZ2V0KCkgIT0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShudWxscHRyX3QsIGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3kpCisgICAgeyByZXR1cm4gbnVsbHB0ciAhPSBfX3kuZ2V0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9EcCwKKwkgICB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lIF9FcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LAorCSAgICAgIGNvbnN0IHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiBfX3kpCisgICAgeyByZXR1cm4gX194LmdldCgpIDwgX195LmdldCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAsCisJICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHVuaXF1ZV9wdHI8X1RwLCBfRHA+JiBfX3gsCisJICAgICAgIGNvbnN0IHVuaXF1ZV9wdHI8X1VwLCBfRXA+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kuZ2V0KCkgPCBfX3guZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfRHAsCisJICAgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfRXA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9feCwKKwkgICAgICBjb25zdCB1bmlxdWVfcHRyPF9VcCwgX0VwPiYgX195KQorICAgIHsgcmV0dXJuIF9feS5nZXQoKSA8IF9feC5nZXQoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwLAorCSAgIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX0VwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCB1bmlxdWVfcHRyPF9UcCwgX0RwPiYgX194LAorCSAgICAgICBjb25zdCB1bmlxdWVfcHRyPF9VcCwgX0VwPiYgX195KQorICAgIHsgcmV0dXJuICEoX194LmdldCgpIDwgX195LmdldCgpKTsgfQorCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHVuaXF1ZV9wdHIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0RwPgorICAgIHN0cnVjdCBoYXNoPHVuaXF1ZV9wdHI8X1RwLCBfRHA+PgorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248dW5pcXVlX3B0cjxfVHAsIF9EcD4sIHNpemVfdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdW5pcXVlX3B0cjxfVHAsIF9EcD4mIF9fdSkgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwl0eXBlZGVmIHVuaXF1ZV9wdHI8X1RwLCBfRHA+IF9VUDsKKwlyZXR1cm4gc3RkOjpoYXNoPHR5cGVuYW1lIF9VUDo6cG9pbnRlcj4oKShfX3UuZ2V0KCkpOworICAgICAgfQorICAgIH07CisKKyAgLy8gQH0gZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1VOSVFVRV9QVFJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3Vub3JkZXJlZF9tYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy91bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3YmFiMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy91bm9yZGVyZWRfbWFwLmgKQEAgLTAsMCArMSw0MDkgQEAKKy8vIHVub3JkZXJlZF9tYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3Vub3JkZXJlZF9tYXAuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9tYXB9CisgKi8KKworI2lmbmRlZiBfVU5PUkRFUkVEX01BUF9ICisjZGVmaW5lIF9VTk9SREVSRURfTUFQX0gKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLy8gTkI6IFdoZW4gd2UgZ2V0IHR5cGVkZWYgdGVtcGxhdGVzIHRoZXNlIGNsYXNzIGRlZmluaXRpb25zCisgIC8vIHdpbGwgYmUgdW5uZWNlc3NhcnkuCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX21hcAorICAgIDogcHVibGljIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9BbGxvYywKKwkJCXN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwgCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9BbGxvYywKKwkJCSBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgZmFsc2UsIHRydWU+CisgICAgICAgIF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3Vub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksCisJICAgICAgX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX191bm9yZGVyZWRfbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCAKKwkJCXNpemVfdHlwZSBfX24gPSAwLAorCQkJY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksIAorCQkJY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLCAKKwkJCWNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkJX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKwl7IH0KKworICAgICAgX191bm9yZGVyZWRfbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fbiwgX19oZiwKKwkgICAgICBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksCisJICAgICAgX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICBfX3Vub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUgPSBmYWxzZT4KKyAgICBjbGFzcyBfX3Vub3JkZXJlZF9tdWx0aW1hcAorICAgIDogcHVibGljIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sCisJCQlfQWxsb2MsCisJCQlzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlPF9LZXksIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LAorCQkJIF9BbGxvYywKKwkJCSBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgZmFsc2UsIGZhbHNlPgorICAgICAgICBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBleHBsaWNpdAorICAgICAgX191bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksCisJICAgICAgX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKyAgICAgIHsgfQorCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfX3Vub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgCisJCQkgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCQkgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkJX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKyAgICAgICAgeyB9CisKKyAgICAgIF9fdW5vcmRlcmVkX211bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX24sIF9faGYsCisJICAgICAgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLAorCSAgICAgIF9fZXFsLCBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPigpLCBfX2EpCisgICAgICB7IH0KKworICAgICAgX191bm9yZGVyZWRfbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsCisJIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLAorCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgICAgICAgY29uc3QgX191bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2MsCisJICAgICAgIF9fY2FjaGVfaGFzaF9jb2RlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywKKwkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLAorCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLAorCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgICAgICAgY29uc3QgX191bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywKKwkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2MsCisJICAgICAgIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSAgICAgICBjb25zdCBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLAorCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgdW5pcXVlIGtleXMgKGNvbnRhaW5pbmcKKyAgICogIGF0IG1vc3Qgb25lIG9mIGVhY2gga2V5IHZhbHVlKSB0aGF0IGFzc29jaWF0ZXMgdmFsdWVzIG9mIGFub3RoZXIgdHlwZQorICAgKiAgd2l0aCB0aGUga2V5cy4KKyAgICoKKyAgICogIEBpbmdyb3VwIHVub3JkZXJlZF9hc3NvY2lhdGl2ZV9jb250YWluZXJzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGFuZAorICAgKiAgPGEgaHJlZj0idGFibGVzLmh0bWwjeHgiPnVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXI8L2E+CisgICAqCisgICAqICBAcGFyYW0gIEtleSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgVHAgIFR5cGUgb2YgbWFwcGVkIG9iamVjdHMuCisgICAqICBAcGFyYW0gIEhhc2ggIEhhc2hpbmcgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGhhc2g8VmFsdWU+LgorICAgKiAgQHBhcmFtICBQcmVkICBQcmVkaWNhdGUgZnVuY3Rpb24gb2JqZWN0IHR5cGUsIGRlZmF1bHRzIHRvIGVxdWFsX3RvPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgQWxsb2MgIEFsbG9jYXRvciB0eXBlLCBkZWZhdWx0cyB0byBhbGxvY2F0b3I8S2V5Pi4KKyAgICoKKyAgICogVGhlIHJlc3VsdGluZyB2YWx1ZSB0eXBlIG9mIHRoZSBjb250YWluZXIgaXMgc3RkOjpwYWlyPGNvbnN0IEtleSwgVHA+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X0tleT4sCisJICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX21hcAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+ICBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX21hcChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksIAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKyAgCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIGVxdWl2YWxlbnQga2V5cworICAgKiAgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgb2YgZWFjaCBrZXkgdmFsdWUpIHRoYXQgYXNzb2NpYXRlcworICAgKiAgdmFsdWVzIG9mIGFub3RoZXIgdHlwZSB3aXRoIHRoZSBrZXlzLgorICAgKgorICAgKiAgQGluZ3JvdXAgdW5vcmRlcmVkX2Fzc29jaWF0aXZlX2NvbnRhaW5lcnMKKyAgICoKKyAgICogIE1lZXRzIHRoZSByZXF1aXJlbWVudHMgb2YgYSA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPiwgYW5kCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCN4eCI+dW5vcmRlcmVkIGFzc29jaWF0aXZlIGNvbnRhaW5lcjwvYT4KKyAgICoKKyAgICogIEBwYXJhbSAgS2V5ICBUeXBlIG9mIGtleSBvYmplY3RzLgorICAgKiAgQHBhcmFtICBUcCAgVHlwZSBvZiBtYXBwZWQgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKgorICAgKiBUaGUgcmVzdWx0aW5nIHZhbHVlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBpcyBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBUcD4uCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGltYXAKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX191bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4gIF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkJIHNpemVfdHlwZSBfX24gPSAwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLyogX1VOT1JERVJFRF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3Vub3JkZXJlZF9zZXQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy91bm9yZGVyZWRfc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzNTBiYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy91bm9yZGVyZWRfc2V0LmgKQEAgLTAsMCArMSw0MDEgQEAKKy8vIHVub3JkZXJlZF9zZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3Vub3JkZXJlZF9zZXQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3Vub3JkZXJlZF9zZXR9CisgKi8KKworI2lmbmRlZiBfVU5PUkRFUkVEX1NFVF9ICisjZGVmaW5lIF9VTk9SREVSRURfU0VUX0gKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLy8gTkI6IFdoZW4gd2UgZ2V0IHR5cGVkZWYgdGVtcGxhdGVzIHRoZXNlIGNsYXNzIGRlZmluaXRpb25zCisgIC8vIHdpbGwgYmUgdW5uZWNlc3NhcnkuCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X1ZhbHVlPiwKKwkgICBjbGFzcyBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUgPSBmYWxzZT4KKyAgICBjbGFzcyBfX3Vub3JkZXJlZF9zZXQKKyAgICA6IHB1YmxpYyBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQlzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCV9IYXNoLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJX19jYWNoZV9oYXNoX2NvZGUsIHRydWUsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBfSGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfQWxsb2MsCisJCQkgc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgdHJ1ZSwgdHJ1ZT4KKyAgICAgICAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJICAgICAgc3RkOjpfSWRlbnRpdHk8dmFsdWVfdHlwZT4oKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfX3Vub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIAorCQkJc2l6ZV90eXBlIF9fbiA9IDAsCisJCQljb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCQljb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkJY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkJc3RkOjpfSWRlbnRpdHk8dmFsdWVfdHlwZT4oKSwgX19hKQorICAgICAgICB7IH0KKworICAgICAgX191bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fbiwgX19oZiwKKwkgICAgICBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksIF9fZXFsLAorCSAgICAgIHN0ZDo6X0lkZW50aXR5PHZhbHVlX3R5cGU+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICBfX3Vub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX211bHRpc2V0CisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0FsbG9jLAorCQkJc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ByZWQsCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCSBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCBmYWxzZT4KKyAgICAgICAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkgICAgICBzdGQ6Ol9JZGVudGl0eTx2YWx1ZV90eXBlPigpLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX191bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIAorCQkJICAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksIAorCQkJICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksIF9fZXFsLAorCQlzdGQ6Ol9JZGVudGl0eTx2YWx1ZV90eXBlPigpLCBfX2EpCisgICAgICAgIHsgfQorCisgICAgICBfX3Vub3JkZXJlZF9tdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19uLCBfX2hmLAorCSAgICAgIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJICAgICAgc3RkOjpfSWRlbnRpdHk8dmFsdWVfdHlwZT4oKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIF9fdW5vcmRlcmVkX211bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2MsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoX191bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgX191bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsCisJIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywKKwkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9fdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLAorCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2MsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX191bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2MsCisJICAgICAgIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSAgICAgICBjb25zdCBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywKKwkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2MsCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX191bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywKKwkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9fdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2MsCisJICAgICAgIF9fY2FjaGVfaGFzaF9jb2RlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLAorCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4mIF9feCwKKwkgICAgICAgY29uc3QgX191bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywKKwkgICAgICAgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlIGVsZW1lbnRzJyBrZXlzIGFyZQorICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBWYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9zZXQKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCAKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLCAKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLCAKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IH0KKworICAgICAgdW5vcmRlcmVkX3NldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLmJlZ2luKCksIF9fbC5lbmQoKSwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlCisgICAqICBlbGVtZW50cycga2V5cyBhcmUgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBWYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aXNldAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCAKKwkJCSAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksIAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLCAKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9lcXVhbChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8qIF9VTk9SREVSRURfU0VUX0ggKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3ZhbGFycmF5X2FmdGVyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmFsYXJyYXlfYWZ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDQwZmFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3ZhbGFycmF5X2FmdGVyLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGludGVybmFsIF9NZXRhIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9hZnRlci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dmFsYXJyYXl9CisgKi8KKworLy8gV3JpdHRlbiBieSBHYWJyaWVsIERvcyBSZWlzIDxHYWJyaWVsLkRvcy1SZWlzQGNtbGEuZW5zLWNhY2hhbi5mcj4KKworI2lmbmRlZiBfVkFMQVJSQVlfQUZURVJfSAorI2RlZmluZSBfVkFMQVJSQVlfQUZURVJfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vCisgIC8vIGdzbGljZV9hcnJheSBjbG9zdXJlLgorICAvLworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIGNsYXNzIF9HQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0dCYXNlIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX01fZXhwciAoX19lKSwgX01faW5kZXgoX19pKSB7fQorICAgICAgCisgICAgICB2YWx1ZV90eXBlCisgICAgICBvcGVyYXRvcltdIChzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXhwcltfTV9pbmRleFtfX2ldXTsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUgKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luZGV4LnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9Eb20mCSAgICAgIF9NX2V4cHI7CisgICAgICBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfTV9pbmRleDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfR0Jhc2U8X0FycmF5PF9UcD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfR0Jhc2UgKF9BcnJheTxfVHA+IF9fYSwgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX19pKQorICAgICAgOiBfTV9hcnJheSAoX19hKSwgX01faW5kZXgoX19pKSB7fQorICAgICAgCisgICAgICB2YWx1ZV90eXBlCisgICAgICBvcGVyYXRvcltdIChzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYXJyYXkuX01fZGF0YVtfTV9pbmRleFtfX2ldXTsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUgKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2luZGV4LnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+ICAgICAgIF9NX2FycmF5OworICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX01faW5kZXg7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfR0Nsb3M8X0V4cHIsIF9Eb20+CisgICAgOiBfR0Jhc2U8X0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HQmFzZTxfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0dDbG9zIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fZSwgX19pKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfR0Nsb3M8X1ZhbEFycmF5LCBfVHA+CisgICAgOiBfR0Jhc2U8X0FycmF5PF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dCYXNlPF9BcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9HQ2xvcyAoX0FycmF5PF9UcD4gX19hLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgICA6IF9CYXNlIChfX2EsIF9faSkge30KKyAgICB9OworCisgIC8vCisgIC8vIGluZGlyZWN0X2FycmF5IGNsb3N1cmUKKyAgLy8KKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBjbGFzcyBfSUJhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9JQmFzZSAoY29uc3QgX0RvbSYgX19lLCBjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpCisgICAgICA6IF9NX2V4cHIgKF9fZSksIF9NX2luZGV4IChfX2kpIHt9CisgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHByW19NX2luZGV4W19faV1dOyB9CisgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9pbmRleC5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfRG9tJgkgICAgICBfTV9leHByOworICAgICAgY29uc3QgdmFsYXJyYXk8c2l6ZV90PiYgX01faW5kZXg7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfSUNsb3M8X0V4cHIsIF9Eb20+CisgICAgOiBfSUJhc2U8X0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9JQmFzZTxfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0lDbG9zIChjb25zdCBfRG9tJiBfX2UsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fZSwgX19pKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfSUNsb3M8X1ZhbEFycmF5LCBfVHA+CisgICAgOiBfSUJhc2U8dmFsYXJyYXk8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfSUJhc2U8dmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgX0lDbG9zIChjb25zdCB2YWxhcnJheTxfVHA+JiBfX2EsIGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICAgIDogX0Jhc2UgKF9fYSwgX19pKSB7fQorICAgIH07CisgIAorICAvLworICAvLyBjbGFzcyBfRXhwcgorICAvLworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9FeHByCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIF9FeHByKGNvbnN0IF9DbG9zJik7CisKKyAgICAgIGNvbnN0IF9DbG9zJiBvcGVyYXRvcigpKCkgY29uc3Q7CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShzbGljZSkgY29uc3Q7CisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JikgY29uc3Q7CisKKyAgICAgIF9FeHByPF9VbkNsb3M8X191bmFyeV9wbHVzLCBzdGQ6Ol9FeHByLCBfQ2xvcz4sIHZhbHVlX3R5cGU+CisgICAgICBvcGVyYXRvcisoKSBjb25zdDsKKworICAgICAgX0V4cHI8X1VuQ2xvczxfX25lZ2F0ZSwgc3RkOjpfRXhwciwgX0Nsb3M+LCB2YWx1ZV90eXBlPgorICAgICAgb3BlcmF0b3ItKCkgY29uc3Q7CisKKyAgICAgIF9FeHByPF9VbkNsb3M8X19iaXR3aXNlX25vdCwgc3RkOjpfRXhwciwgX0Nsb3M+LCB2YWx1ZV90eXBlPgorICAgICAgb3BlcmF0b3J+KCkgY29uc3Q7CisKKyAgICAgIF9FeHByPF9VbkNsb3M8X19sb2dpY2FsX25vdCwgc3RkOjpfRXhwciwgX0Nsb3M+LCBib29sPgorICAgICAgb3BlcmF0b3IhKCkgY29uc3Q7CisKKyAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgICB2YWx1ZV90eXBlIHN1bSgpIGNvbnN0OworCisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBzaGlmdChpbnQpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gY3NoaWZ0KGludCkgY29uc3Q7CisKKyAgICAgIHZhbHVlX3R5cGUgbWluKCkgY29uc3Q7CisgICAgICB2YWx1ZV90eXBlIG1heCgpIGNvbnN0OworCisgICAgICB2YWxhcnJheTx2YWx1ZV90eXBlPiBhcHBseSh2YWx1ZV90eXBlICgqKShjb25zdCB2YWx1ZV90eXBlJikpIGNvbnN0OworICAgICAgdmFsYXJyYXk8dmFsdWVfdHlwZT4gYXBwbHkodmFsdWVfdHlwZSAoKikodmFsdWVfdHlwZSkpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9DbG9zIF9NX2Nsb3N1cmU7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpfRXhwcihjb25zdCBfQ2xvcyYgX19jKSA6IF9NX2Nsb3N1cmUoX19jKSB7fQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9DbG9zJgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpvcGVyYXRvcigpKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9jbG9zdXJlOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICB7IHJldHVybiBfTV9jbG9zdXJlW19faV07IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om9wZXJhdG9yW10oc2xpY2UgX19zKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcylbX19zXTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKVtfX2dzXTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX19tKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcylbX19tXTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKVtfX2ldOworICAgICAgcmV0dXJuIF9fdjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OnNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2Nsb3N1cmUuc2l6ZSgpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgIF9FeHByPF9DbG9zLCBfVHA+OjpzaGlmdChpbnQgX19uKSBjb25zdAorICAgIHsKKyAgICAgIHZhbGFycmF5PF9UcD4gX192ID0gdmFsYXJyYXk8X1RwPigqdGhpcykuc2hpZnQoX19uKTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6Y3NoaWZ0KGludCBfX24pIGNvbnN0CisgICAgeworICAgICAgdmFsYXJyYXk8X1RwPiBfX3YgPSB2YWxhcnJheTxfVHA+KCp0aGlzKS5jc2hpZnQoX19uKTsKKyAgICAgIHJldHVybiBfX3Y7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4KKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6YXBwbHkoX1RwIF9fZihjb25zdCBfVHAmKSkgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpLmFwcGx5KF9fZik7CisgICAgICByZXR1cm4gX192OworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OmFwcGx5KF9UcCBfX2YoX1RwKSkgY29uc3QKKyAgICB7CisgICAgICB2YWxhcnJheTxfVHA+IF9fdiA9IHZhbGFycmF5PF9UcD4oKnRoaXMpLmFwcGx5KF9fZik7CisgICAgICByZXR1cm4gX192OworICAgIH0KKworICAvLyBYWFg6IHJlcGxhY2UgdGhpcyB3aXRoIGEgbW9yZSByb2J1c3Qgc3VtbWF0aW9uIGFsZ29yaXRobS4KKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46OnN1bSgpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90IF9fbiA9IF9NX2Nsb3N1cmUuc2l6ZSgpOworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiBfVHAoKTsKKyAgICAgIGVsc2UKKwl7CisJICBfVHAgX19zID0gX01fY2xvc3VyZVstLV9fbl07CisJICB3aGlsZSAoX19uICE9IDApCisJICAgIF9fcyArPSBfTV9jbG9zdXJlWy0tX19uXTsKKwkgIHJldHVybiBfX3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0Nsb3MsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX0V4cHI8X0Nsb3MsIF9UcD46Om1pbigpIGNvbnN0CisgICAgeyByZXR1cm4gX192YWxhcnJheV9taW4oX01fY2xvc3VyZSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2xvcywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfRXhwcjxfQ2xvcywgX1RwPjo6bWF4KCkgY29uc3QKKyAgICB7IHJldHVybiBfX3ZhbGFycmF5X21heChfTV9jbG9zdXJlKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20sIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0V4cHI8X1VuQ2xvczxfX2xvZ2ljYWxfbm90LCBfRXhwciwgX0RvbT4sIGJvb2w+CisgICAgX0V4cHI8X0RvbSwgX1RwPjo6b3BlcmF0b3IhKCkgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIF9VbkNsb3M8X19sb2dpY2FsX25vdCwgc3RkOjpfRXhwciwgX0RvbT4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIGJvb2w+KF9DbG9zdXJlKHRoaXMtPl9NX2Nsb3N1cmUpKTsKKyAgICB9CisKKyNkZWZpbmUgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SKF9PcCwgX05hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tLCB0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9VbkNsb3M8X05hbWUsIHN0ZDo6X0V4cHIsIF9Eb20+LCBfVHA+ICAgICAgICAgICAgICAgICAgIFwKKyAgICBfRXhwcjxfRG9tLCBfVHA+OjpvcGVyYXRvciBfT3AoKSBjb25zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9VbkNsb3M8X05hbWUsIHN0ZDo6X0V4cHIsIF9Eb20+IF9DbG9zdXJlOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZSh0aGlzLT5fTV9jbG9zdXJlKSk7ICAgICAgICAgICAgXAorICAgIH0KKworICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9PUEVSQVRPUigrLCBfX3VuYXJ5X3BsdXMpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SKC0sIF9fbmVnYXRlKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9PUEVSQVRPUih+LCBfX2JpdHdpc2Vfbm90KQorCisjdW5kZWYgX0RFRklORV9FWFBSX1VOQVJZX09QRVJBVE9SCisKKyNkZWZpbmUgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUihfT3AsIF9OYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbTEsIGNsYXNzIF9Eb20yPgkJCQkJXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX0V4cHIsIF9FeHByLCBfRG9tMSwgX0RvbTI+LCAgICAgICAgICAgXAorICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCBfRXhwcjxfRG9tMSwgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+JiBfX3YsICAgXAorCSAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20yLCB0eXBlbmFtZSBfRG9tMjo6dmFsdWVfdHlwZT4mIF9fdykgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb20xOjp2YWx1ZV90eXBlIF9Bcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfQXJnPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX0V4cHIsIF9Eb20xLCBfRG9tMj4gX0Nsb3N1cmU7ICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9WYWx1ZT4oX0Nsb3N1cmUoX192KCksIF9fdygpKSk7ICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX0NvbnN0YW50LCBfRG9tLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX192LCAgICAgXAorICAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJiBfX3QpICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9Bcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX0FyZz46OnJlc3VsdF90eXBlIF9WYWx1ZTsgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX0V4cHIsIF9Db25zdGFudCwgX0RvbSwgX0FyZz4gX0Nsb3N1cmU7ICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVmFsdWU+KF9DbG9zdXJlKF9fdigpLCBfX3QpKTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX0NvbnN0YW50LCBfRXhwciwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPjo6cmVzdWx0X3R5cGU+IFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSYgX190LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgY29uc3QgX0V4cHI8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fdikgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfQXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdW48X05hbWUsIF9Bcmc+OjpyZXN1bHRfdHlwZSBfVmFsdWU7ICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X05hbWUsIF9Db25zdGFudCwgX0V4cHIsIF9BcmcsIF9Eb20+IF9DbG9zdXJlOyAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1ZhbHVlPihfQ2xvc3VyZShfX3QsIF9fdigpKSk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9FeHByLCBfVmFsQXJyYXksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4sICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT46OnJlc3VsdF90eXBlPiBcCisgICAgb3BlcmF0b3IgX09wKGNvbnN0IF9FeHByPF9Eb20sdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fZSwgICAgICBcCisgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGFycmF5PHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+JiBfX3YpICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX0FyZzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfQXJnPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfRXhwciwgX1ZhbEFycmF5LCBfRG9tLCBfQXJnPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9WYWx1ZT4oX0Nsb3N1cmUoX19lKCksIF9fdikpOyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9FeHByLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+OjpyZXN1bHRfdHlwZT4gXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX192LCAgICAgICAgXAorICAgICAgICAgICAgICAgICBjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1ZhbHVlOyAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfRXhwciwgX1RwLCBfRG9tPiBfQ2xvc3VyZTsgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVmFsdWU+KF9DbG9zdXJlKF9fdiwgX19lICgpKSk7ICAgICAgICAgICAgXAorICAgIH0KKworICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoKywgX19wbHVzKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoLSwgX19taW51cykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKCosIF9fbXVsdGlwbGllcykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKC8sIF9fZGl2aWRlcykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKCUsIF9fbW9kdWx1cykKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKF4sIF9fYml0d2lzZV94b3IpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUigmLCBfX2JpdHdpc2VfYW5kKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IofCwgX19iaXR3aXNlX29yKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPDwsIF9fc2hpZnRfbGVmdCkKKyAgICBfREVGSU5FX0VYUFJfQklOQVJZX09QRVJBVE9SKD4+LCBfX3NoaWZ0X3JpZ2h0KQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoJiYsIF9fbG9naWNhbF9hbmQpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUih8fCwgX19sb2dpY2FsX29yKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPT0sIF9fZXF1YWxfdG8pCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUighPSwgX19ub3RfZXF1YWxfdG8pCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig8LCBfX2xlc3MpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig+LCBfX2dyZWF0ZXIpCisgICAgX0RFRklORV9FWFBSX0JJTkFSWV9PUEVSQVRPUig8PSwgX19sZXNzX2VxdWFsKQorICAgIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IoPj0sIF9fZ3JlYXRlcl9lcXVhbCkKKworI3VuZGVmIF9ERUZJTkVfRVhQUl9CSU5BUllfT1BFUkFUT1IKKworI2RlZmluZSBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oX05hbWUsIF9VTmFtZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9VbkNsb3M8X1VOYW1lLCBfRXhwciwgX0RvbT4sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfTmFtZShjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX1VuQ2xvczxfVU5hbWUsIF9FeHByLCBfRG9tPiBfQ2xvc3VyZTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lKCkpKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlubGluZSBfRXhwcjxfVW5DbG9zPF9VTmFtZSwgX1ZhbEFycmF5LCBfVHA+LCBfVHA+ICAgICAgICAgICAgICAgICAgIFwKKyAgICBfTmFtZShjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfVW5DbG9zPF9VTmFtZSwgX1ZhbEFycmF5LCBfVHA+IF9DbG9zdXJlOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX3YpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGFicywgX0FicykKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oY29zLCBfQ29zKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihhY29zLCBfQWNvcykKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oY29zaCwgX0Nvc2gpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHNpbiwgX1NpbikKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oYXNpbiwgX0FzaW4pCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHNpbmgsIF9TaW5oKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTih0YW4sIF9UYW4pCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHRhbmgsIF9UYW5oKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihhdGFuLCBfQXRhbikKKyAgICBfREVGSU5FX0VYUFJfVU5BUllfRlVOQ1RJT04oZXhwLCBfRXhwKQorICAgIF9ERUZJTkVfRVhQUl9VTkFSWV9GVU5DVElPTihsb2csIF9Mb2cpCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKGxvZzEwLCBfTG9nMTApCisgICAgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OKHNxcnQsIF9TcXJ0KQorCisjdW5kZWYgX0RFRklORV9FWFBSX1VOQVJZX0ZVTkNUSU9OCisKKyNkZWZpbmUgX0RFRklORV9FWFBSX0JJTkFSWV9GVU5DVElPTihfRnVuLCBfVUZ1bikJCSAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20xLCBjbGFzcyBfRG9tMj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9FeHByLCBfRXhwciwgX0RvbTEsIF9Eb20yPiwgICAgICAgICAgXAorCQkgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9GdW4oY29uc3QgX0V4cHI8X0RvbTEsIHR5cGVuYW1lIF9Eb20xOjp2YWx1ZV90eXBlPiYgX19lMSwgICAgICAgICBcCisJIGNvbnN0IF9FeHByPF9Eb20yLCB0eXBlbmFtZSBfRG9tMjo6dmFsdWVfdHlwZT4mIF9fZTIpCSAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTE6OnZhbHVlX3R5cGUgX1RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9FeHByLCBfRG9tMSwgX0RvbTI+IF9DbG9zdXJlOyAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lMSgpLCBfX2UyKCkpKTsgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9FeHByLCBfVmFsQXJyYXksIF9Eb20sICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiwgICAgICAgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lLCAgICAgICAgICAgIFwKKwkgY29uc3QgdmFsYXJyYXk8dHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fdikgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9WYWxBcnJheSwgX0RvbSwgX1RwPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lKCksIF9fdikpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX0V4cHIsICAgICAgICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPiwgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWxhcnJheT4mIF9fdiwgICAgICAgICAgICAgICAgIFwKKwkgY29uc3QgX0V4cHI8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fZSkgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX1ZhbEFycmF5LCBfRXhwciwgX1RwLCBfRG9tPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX192LCBfX2UoKSkpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9FeHByLCBfQ29uc3RhbnQsIF9Eb20sICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiwgICAgICAgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCBfRXhwcjxfRG9tLCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiYgX19lLCAgICAgICAgICAgIFwKKwkgY29uc3QgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSYgX190KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0V4cHIsIF9Db25zdGFudCwgX0RvbSwgX1RwPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX19lKCksIF9fdCkpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9Db25zdGFudCwgX0V4cHIsICAgICAgICAgICAgICAgICAgICAgXAorCQkJICB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlLCBfRG9tPiwgICAgICAgICAgICBcCisJCSB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX0Z1bihjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJiBfX3QsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgY29uc3QgX0V4cHI8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4mIF9fZSkgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSBfVHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfVUZ1biwgX0NvbnN0YW50LCBfRXhwciwgX1RwLCBfRG9tPiBfQ2xvc3VyZTsgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoX190LCBfX2UoKSkpOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4sIF9UcD4gXAorICAgIF9GdW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3cpICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X1VGdW4sIF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4gX0Nsb3N1cmU7XAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKF9fdiwgX193KSk7ICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5saW5lIF9FeHByPF9CaW5DbG9zPF9VRnVuLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+LCBfVHA+IFwKKyAgICBfRnVuKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgY29uc3QgX1RwJiBfX3QpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9VRnVuLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+IF9DbG9zdXJlO1wKKyAgICAgIHJldHVybiBfRXhwcjxfQ2xvc3VyZSwgX1RwPihfQ2xvc3VyZShfX3YsIF9fdCkpOyAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCSAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X1VGdW4sIF9Db25zdGFudCwgX1ZhbEFycmF5LCBfVHAsIF9UcD4sIF9UcD4gXAorICAgIF9GdW4oY29uc3QgX1RwJiBfX3QsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHR5cGVkZWYgX0JpbkNsb3M8X1VGdW4sIF9Db25zdGFudCwgX1ZhbEFycmF5LCBfVHAsIF9UcD4gX0Nsb3N1cmU7XAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfVHA+KF9DbG9zdXJlKF9fdCwgX192KSk7ICAgICAgICAgICAgICAgICBcCisgICAgfQorCitfREVGSU5FX0VYUFJfQklOQVJZX0ZVTkNUSU9OKGF0YW4yLCBfQXRhbjIpCitfREVGSU5FX0VYUFJfQklOQVJZX0ZVTkNUSU9OKHBvdywgX1BvdykKKworI3VuZGVmIF9ERUZJTkVfRVhQUl9CSU5BUllfRlVOQ1RJT04KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0NQUF9WQUxBUlJBWV9BRlRFUl9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmFsYXJyYXlfYXJyYXkuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy92YWxhcnJheV9hcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTlmM2YKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmFsYXJyYXlfYXJyYXkuaApAQCAtMCwwICsxLDY5NSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gaW50ZXJuYWwgX0FycmF5IGhlbHBlciBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvdmFsYXJyYXlfYXJyYXkuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BEUFRNYXRocy5FTlMtQ2FjaGFuLkZyPgorCisjaWZuZGVmIF9WQUxBUlJBWV9BUlJBWV9ICisjZGVmaW5lIF9WQUxBUlJBWV9BUlJBWV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8bmV3PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8KKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBvbiByYXcgcG9pbnRlcnMKKyAgLy8KKworICAvLyBXZSBnZXQgbWVtb3J5IGJ5IHRoZSBvbGQgZmFzaGlvbiB3YXkKKyAgaW5saW5lIHZvaWQqCisgIF9fdmFsYXJyYXlfZ2V0X21lbW9yeShzaXplX3QgX19uKQorICB7IHJldHVybiBvcGVyYXRvciBuZXcoX19uKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwKl9fcmVzdHJpY3RfXworICAgIF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2Uoc2l6ZV90IF9fbikKKyAgICB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKl9fcmVzdHJpY3RfXz4KKwkoc3RkOjpfX3ZhbGFycmF5X2dldF9tZW1vcnkoX19uICogc2l6ZW9mKF9UcCkpKTsKKyAgICB9CisKKyAgLy8gUmV0dXJuIG1lbW9yeSB0byB0aGUgc3lzdGVtCisgIGlubGluZSB2b2lkCisgIF9fdmFsYXJyYXlfcmVsZWFzZV9tZW1vcnkodm9pZCogX19wKQorICB7IG9wZXJhdG9yIGRlbGV0ZShfX3ApOyB9CisKKyAgLy8gVHVybiBhIHJhdy1tZW1vcnkgaW50byBhbiBhcnJheSBvZiBfVHAgZmlsbGVkIHdpdGggX1RwKCkKKyAgLy8gVGhpcyBpcyByZXF1aXJlZCBpbiAndmFsYXJyYXk8VD4gdihuKTsnCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbD4KKyAgICBzdHJ1Y3QgX0FycmF5X2RlZmF1bHRfY3RvcgorICAgIHsKKyAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpc24ndCBleGNlcHRpb24gc2FmZS4gIEJ1dAorICAgICAgLy8gdmFsYXJyYXlzIGFyZW4ndCByZXF1aXJlZCB0byBiZSBleGNlcHRpb24gc2FmZS4KKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9faXQoX1RwKiBfX2IsIF9UcCogX19lKQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgbmV3KF9fYisrKSBfVHAoKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2RlZmF1bHRfY3RvcjxfVHAsIHRydWU+CisgICAgeworICAgICAgLy8gRm9yIGZ1bmRhbWVudGFsIHR5cGVzLCBpdCBzdWZmaWNlcyB0byBzYXkgJ21lbXNldCgpJworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChfVHAqIF9fYiwgX1RwKiBfX2UpCisgICAgICB7IF9fYnVpbHRpbl9tZW1zZXQoX19iLCAwLCAoX19lIC0gX19iKSAqIHNpemVvZihfVHApKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9kZWZhdWx0X2NvbnN0cnVjdChfVHAqIF9fYiwgX1RwKiBfX2UpCisgICAgeworICAgICAgX0FycmF5X2RlZmF1bHRfY3RvcjxfVHAsIF9faXNfc2NhbGFyPF9UcD46Ol9fdmFsdWU+OjpfU19kb19pdChfX2IsIF9fZSk7CisgICAgfQorCisgIC8vIFR1cm4gYSByYXctbWVtb3J5IGludG8gYW4gYXJyYXkgb2YgX1RwIGZpbGxlZCB3aXRoIF9fdAorICAvLyBUaGlzIGlzIHRoZSByZXF1aXJlZCBpbiB2YWxhcnJheTxUPiB2KG4sIHQpLiAgQWxzbworICAvLyB1c2VkIGluIHZhbGFycmF5PD46OnJlc2l6ZSgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2w+CisgICAgc3RydWN0IF9BcnJheV9pbml0X2N0b3IKKyAgICB7CisgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXNuJ3QgZXhjZXB0aW9uIHNhZmUuICBCdXQKKyAgICAgIC8vIHZhbGFycmF5cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgZXhjZXB0aW9uIHNhZmUuCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KF9UcCogX19iLCBfVHAqIF9fZSwgY29uc3QgX1RwIF9fdCkKKyAgICAgIHsKKwl3aGlsZSAoX19iICE9IF9fZSkKKwkgIG5ldyhfX2IrKykgX1RwKF9fdCk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9BcnJheV9pbml0X2N0b3I8X1RwLCB0cnVlPgorICAgIHsKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgX1NfZG9faXQoX1RwKiBfX2IsIF9UcCogX19lLCBjb25zdCBfVHAgX190KQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgKl9fYisrID0gX190OworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsX2NvbnN0cnVjdChfVHAqIF9fYiwgX1RwKiBfX2UsIGNvbnN0IF9UcCBfX3QpCisgICAgeworICAgICAgX0FycmF5X2luaXRfY3RvcjxfVHAsIF9faXNfdHJpdmlhbChfVHApPjo6X1NfZG9faXQoX19iLCBfX2UsIF9fdCk7CisgICAgfQorCisgIC8vCisgIC8vIGNvcHktY29uc3RydWN0IHJhdyBhcnJheSBbX19vLCAqKSBmcm9tIHBsYWluIGFycmF5IFtfX2IsIF9fZSkKKyAgLy8gV2UgY2FuJ3QganVzdCBzYXkgJ21lbWNweSgpJworICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2w+CisgICAgc3RydWN0IF9BcnJheV9jb3B5X2N0b3IKKyAgICB7CisgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXNuJ3QgZXhjZXB0aW9uIHNhZmUuICBCdXQKKyAgICAgIC8vIHZhbGFycmF5cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgZXhjZXB0aW9uIHNhZmUuCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIF9TX2RvX2l0KGNvbnN0IF9UcCogX19iLCBjb25zdCBfVHAqIF9fZSwgX1RwKiBfX3Jlc3RyaWN0X18gX19vKQorICAgICAgeworCXdoaWxlIChfX2IgIT0gX19lKQorCSAgbmV3KF9fbysrKSBfVHAoKl9fYisrKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2NvcHlfY3RvcjxfVHAsIHRydWU+CisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChjb25zdCBfVHAqIF9fYiwgY29uc3QgX1RwKiBfX2UsIF9UcCogX19yZXN0cmljdF9fIF9fbykKKyAgICAgIHsgX19idWlsdGluX21lbWNweShfX28sIF9fYiwgKF9fZSAtIF9fYikgKiBzaXplb2YoX1RwKSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoY29uc3QgX1RwKiBfX2IsIGNvbnN0IF9UcCogX19lLAorCQkJICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19vKQorICAgIHsKKyAgICAgIF9BcnJheV9jb3B5X2N0b3I8X1RwLCBfX2lzX3RyaXZpYWwoX1RwKT46Ol9TX2RvX2l0KF9fYiwgX19lLCBfX28pOworICAgIH0KKworICAvLyBjb3B5LWNvbnN0cnVjdCByYXcgYXJyYXkgW19fbywgKikgZnJvbSBzdHJpZGVkIGFycmF5IF9fYVs8X19uIDogX19zPl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5X2NvbnN0cnVjdCAoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBzaXplX3QgX19uLAorCQkJICAgICAgIHNpemVfdCBfX3MsIF9UcCogX19yZXN0cmljdF9fIF9fbykKKyAgICB7CisgICAgICBpZiAoX19pc190cml2aWFsKF9UcCkpCisJd2hpbGUgKF9fbi0tKQorCSAgeworCSAgICAqX19vKysgPSAqX19hOworCSAgICBfX2EgKz0gX19zOworCSAgfQorICAgICAgZWxzZQorCXdoaWxlIChfX24tLSkKKwkgIHsKKwkgICAgbmV3KF9fbysrKSBfVHAoKl9fYSk7CisJICAgIF9fYSArPSBfX3M7CisJICB9CisgICAgfQorCisgIC8vIGNvcHktY29uc3RydWN0IHJhdyBhcnJheSBbX19vLCAqKSBmcm9tIGluZGV4ZWQgYXJyYXkgX19hW19faVs8X19uPl1dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QgKGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYSwKKwkJCSAgICAgICBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCQkgICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19vLCBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIGlmIChfX2lzX3RyaXZpYWwoX1RwKSkKKwl3aGlsZSAoX19uLS0pCisJICAqX19vKysgPSBfX2FbKl9faSsrXTsKKyAgICAgIGVsc2UKKwl3aGlsZSAoX19uLS0pCisJICBuZXcgKF9fbysrKSBfVHAoX19hWypfX2krK10pOworICAgIH0KKworICAvLyBEbyB0aGUgbmVjZXNzYXJ5IGNsZWFudXAgd2hlbiB3ZSdyZSBkb25lIHdpdGggYXJyYXlzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX1RwKiBfX2IsIF9UcCogX19lKQorICAgIHsKKyAgICAgIGlmICghX19pc190cml2aWFsKF9UcCkpCisJd2hpbGUgKF9fYiAhPSBfX2UpCisJICB7CisJICAgIF9fYi0+fl9UcCgpOworCSAgICArK19fYjsKKwkgIH0KKyAgICB9CisKKyAgLy8gRmlsbCBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gd2l0aCBfX3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9UcCogX19yZXN0cmljdF9fIF9fYSwgc2l6ZV90IF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgd2hpbGUgKF9fbi0tKQorCSpfX2ErKyA9IF9fdDsKKyAgICB9CisgIAorICAvLyBmaWxsIHN0cmlkZWQgYXJyYXkgX19hWzxfX24tMSA6IF9fcz5dIHdpdGggX190CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfZmlsbChfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sCisJCSAgICBzaXplX3QgX19zLCBjb25zdCBfVHAmIF9fdCkKKyAgICB7IAorICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgX19hICs9IF9fcykKKwkqX19hID0gX190OworICAgIH0KKworICAvLyBmaWxsIGluZGlyZWN0IGFycmF5IF9fYVtfX2lbPF9fbj5dXSB3aXRoIF9faQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwoX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCSAgICBzaXplX3QgX19uLCBjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qLCArK19faSkKKwlfX2FbKl9faV0gPSBfX3Q7CisgICAgfQorICAKKyAgLy8gY29weSBwbGFpbiBhcnJheSBfX2FbPF9fbj5dIGluIF9fYls8X19uPl0KKyAgLy8gRm9yIG5vbi1mdW5kYW1lbnRhbCB0eXBlcywgaXQgaXMgd3JvbmcgdG8gc2F5ICdtZW1jcHkoKScKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfQXJyYXlfY29waWVyCisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sIF9UcCogX19yZXN0cmljdF9fIF9fYikKKyAgICAgIHsKKwl3aGlsZShfX24tLSkKKwkgICpfX2IrKyA9ICpfX2ErKzsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0FycmF5X2NvcGllcjxfVHAsIHRydWU+CisgICAgeworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBfU19kb19pdChjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sIF9UcCogX19yZXN0cmljdF9fIF9fYikKKyAgICAgIHsgX19idWlsdGluX21lbWNweShfX2IsIF9fYSwgX19uICogc2l6ZW9mIChfVHApKTsgfQorICAgIH07CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW50byBhIHBsYXkgYXJyYXkgX19iWzw+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19hLCBzaXplX3QgX19uLAorCQkgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19iKQorICAgIHsKKyAgICAgIF9BcnJheV9jb3BpZXI8X1RwLCBfX2lzX3RyaXZpYWwoX1RwKT46Ol9TX2RvX2l0KF9fYSwgX19uLCBfX2IpOworICAgIH0KKworICAvLyBDb3B5IHN0cmlkZWQgYXJyYXkgX19hWzxfX24gOiBfX3M+XSBpbiBwbGFpbiBfX2JbPF9fbj5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IpCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX2IsIF9fYSArPSBfX3MpCisJKl9fYiA9ICpfX2E7CisgICAgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSAgX19hWzxfX24+XSBpbnRvIGEgc3RyaWRlZCBhcnJheSBfX2JbPF9fbiA6IF9fcz5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIF9UcCogX19yZXN0cmljdF9fIF9fYiwKKwkJICAgIHNpemVfdCBfX24sIHNpemVfdCBfX3MpCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX2EsIF9fYiArPSBfX3MpCisJKl9fYiA9ICpfX2E7CisgICAgfQorCisgIC8vIENvcHkgc3RyaWRlZCBhcnJheSBfX3NyY1s8X19uIDogX19zMT5dIGludG8gYW5vdGhlcgorICAvLyBzdHJpZGVkIGFycmF5IF9fZHN0WzwgOiBfX3MyPl0uICBUaGVpciBzaXplcyBtdXN0IG1hdGNoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18gX19zcmMsIHNpemVfdCBfX24sIHNpemVfdCBfX3MxLAorCQkgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19kc3QsIHNpemVfdCBfX3MyKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9fbjsgKytfX2kpCisJX19kc3RbX19pICogX19zMl0gPSBfX3NyY1tfX2kgKiBfX3MxXTsKKyAgICB9CisKKyAgLy8gQ29weSBhbiBpbmRleGVkIGFycmF5IF9fYVtfX2lbPF9fbj5dXSBpbiBwbGFpbiBhcnJheSBfX2JbPF9fbj5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsCisJCSAgICBjb25zdCBzaXplX3QqIF9fcmVzdHJpY3RfXyBfX2ksCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IsIHNpemVfdCBfX24pCisgICAgeworICAgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19uOyArK19faiwgKytfX2IsICsrX19pKQorCSpfX2IgPSBfX2FbKl9faV07CisgICAgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSBfX2FbPF9fbj5dIGluIGFuIGluZGV4ZWQgYXJyYXkgX19iW19faVs8X19uPl1dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX2EsIHNpemVfdCBfX24sCisJCSAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX2IsIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faSkKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qLCArK19fYSwgKytfX2kpCisJX19iWypfX2ldID0gKl9fYTsKKyAgICB9CisKKyAgLy8gQ29weSB0aGUgX19uIGZpcnN0IGVsZW1lbnRzIG9mIGFuIGluZGV4ZWQgYXJyYXkgX19zcmNbPF9faT5dIGludG8KKyAgLy8gYW5vdGhlciBpbmRleGVkIGFycmF5IF9fZHN0WzxfX2o+XS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fc3JjLCBzaXplX3QgX19uLAorCQkgICAgY29uc3Qgc2l6ZV90KiBfX3Jlc3RyaWN0X18gX19pLAorCQkgICAgX1RwKiBfX3Jlc3RyaWN0X18gX19kc3QsIGNvbnN0IHNpemVfdCogX19yZXN0cmljdF9fIF9faikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2sgPCBfX247ICsrX19rKQorCV9fZHN0WypfX2orK10gPSBfX3NyY1sqX19pKytdOworICAgIH0KKworICAvLworICAvLyBDb21wdXRlIHRoZSBzdW0gb2YgZWxlbWVudHMgaW4gcmFuZ2UgW19fZiwgX19sKQorICAvLyBUaGlzIGlzIGEgbmFpdmUgYWxnb3JpdGhtLiAgSXQgc3VmZmVycyBmcm9tIGNhbmNlbGxpbmcuCisgIC8vIEluIHRoZSBmdXR1cmUgdHJ5IHRvIHNwZWNpYWxpemUKKyAgLy8gZm9yIF9UcCA9IGZsb2F0LCBkb3VibGUsIGxvbmcgZG91YmxlIHVzaW5nIGEgbW9yZSBhY2N1cmF0ZQorICAvLyBhbGdvcml0aG0uCisgIC8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX192YWxhcnJheV9zdW0oY29uc3QgX1RwKiBfX2YsIGNvbnN0IF9UcCogX19sKQorICAgIHsKKyAgICAgIF9UcCBfX3IgPSBfVHAoKTsKKyAgICAgIHdoaWxlIChfX2YgIT0gX19sKQorCV9fciArPSAqX19mKys7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLyBDb21wdXRlIHRoZSBwcm9kdWN0IG9mIGFsbCBlbGVtZW50cyBpbiByYW5nZSBbX19mLCBfX2wpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX192YWxhcnJheV9wcm9kdWN0KGNvbnN0IF9UcCogX19mLCBjb25zdCBfVHAqIF9fbCkKKyAgICB7CisgICAgICBfVHAgX19yID0gX1RwKDEpOworICAgICAgd2hpbGUgKF9fZiAhPSBfX2wpCisJX19yID0gX19yICogKl9fZisrOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgLy8gQ29tcHV0ZSB0aGUgbWluL21heCBvZiBhbiBhcnJheS1leHByZXNzaW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UYT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX1RhOjp2YWx1ZV90eXBlCisgICAgX192YWxhcnJheV9taW4oY29uc3QgX1RhJiBfX2EpCisgICAgeworICAgICAgc2l6ZV90IF9fcyA9IF9fYS5zaXplKCk7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UYTo6dmFsdWVfdHlwZSBfVmFsdWVfdHlwZTsKKyAgICAgIF9WYWx1ZV90eXBlIF9fciA9IF9fcyA9PSAwID8gX1ZhbHVlX3R5cGUoKSA6IF9fYVswXTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9fczsgKytfX2kpCisJeworCSAgX1ZhbHVlX3R5cGUgX190ID0gX19hW19faV07CisJICBpZiAoX190IDwgX19yKQorCSAgICBfX3IgPSBfX3Q7CisJfQorICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RhPgorICAgIGlubGluZSB0eXBlbmFtZSBfVGE6OnZhbHVlX3R5cGUKKyAgICBfX3ZhbGFycmF5X21heChjb25zdCBfVGEmIF9fYSkKKyAgICB7CisgICAgICBzaXplX3QgX19zID0gX19hLnNpemUoKTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RhOjp2YWx1ZV90eXBlIF9WYWx1ZV90eXBlOworICAgICAgX1ZhbHVlX3R5cGUgX19yID0gX19zID09IDAgPyBfVmFsdWVfdHlwZSgpIDogX19hWzBdOworICAgICAgZm9yIChzaXplX3QgX19pID0gMTsgX19pIDwgX19zOyArK19faSkKKwl7CisJICBfVmFsdWVfdHlwZSBfX3QgPSBfX2FbX19pXTsKKwkgIGlmIChfX3QgPiBfX3IpCisJICAgIF9fciA9IF9fdDsKKwl9CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICAvLworICAvLyBIZWxwZXIgY2xhc3MgX0FycmF5LCBmaXJzdCBsYXllciBvZiB2YWxhcnJheSBhYnN0cmFjdGlvbi4KKyAgLy8gQWxsIG9wZXJhdGlvbnMgb24gdmFsYXJyYXkgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0aGlzIGNsYXNzCisgIC8vIHdoZW5ldmVyIHBvc3NpYmxlLiAtLSBnZHIKKyAgLy8KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9BcnJheQorICAgIHsKKyAgICAgIGV4cGxpY2l0IF9BcnJheShzaXplX3QpOworICAgICAgZXhwbGljaXQgX0FycmF5KF9UcCogY29uc3QgX19yZXN0cmljdF9fKTsKKyAgICAgIGV4cGxpY2l0IF9BcnJheShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisgICAgICBfQXJyYXkoY29uc3QgX1RwKiBfX3Jlc3RyaWN0X18sIHNpemVfdCk7CisgICAgICAKKyAgICAgIF9UcCogYmVnaW4oKSBjb25zdDsKKyAgICAgIAorICAgICAgX1RwKiBjb25zdCBfX3Jlc3RyaWN0X18gX01fZGF0YTsKKyAgICB9OworCisKKyAgLy8gQ29weS1jb25zdHJ1Y3QgcGxhaW4gYXJyYXkgX19iWzxfX24+XSBmcm9tIGluZGV4ZWQgYXJyYXkgX19hW19faVs8X19uPl1dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2ksCisJCQkgICAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19hLl9NX2RhdGEsIF9faS5fTV9kYXRhLAorCQkJCSAgICAgX19iLl9NX2RhdGEsIF9fbik7IH0KKworICAvLyBDb3B5LWNvbnN0cnVjdCBwbGFpbiBhcnJheSBfX2JbPF9fbj5dIGZyb20gc3RyaWRlZCBhcnJheSBfX2FbPF9fbiA6IF9fcz5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zLAorCQkJICAgICAgX0FycmF5PF9UcD4gX19iKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9fYS5fTV9kYXRhLCBfX24sIF9fcywgX19iLl9NX2RhdGEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsIChfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIGNvbnN0IF9UcCYgX190KQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX19hLl9NX2RhdGEsIF9fbiwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfZmlsbChfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIHNpemVfdCBfX3MsIGNvbnN0IF9UcCYgX190KQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2ZpbGwoX19hLl9NX2RhdGEsIF9fbiwgX19zLCBfX3QpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9maWxsKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PHNpemVfdD4gX19pLAorCQkgICAgc2l6ZV90IF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfX2EuX01fZGF0YSwgX19pLl9NX2RhdGEsIF9fbiwgX190KTsgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSBfX2FbPF9fbj5dIGludG8gYSBwbGF5IGFycmF5IF9fYls8Pl0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19iKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2RhdGEsIF9fbiwgX19iLl9NX2RhdGEpOyB9CisKKyAgLy8gQ29weSBzdHJpZGVkIGFycmF5IF9fYVs8X19uIDogX19zPl0gaW4gcGxhaW4gX19iWzxfX24+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zLCBfQXJyYXk8X1RwPiBfX2IpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19uLCBfX3MsIF9fYi5fTV9kYXRhKTsgfQorCisgIC8vIENvcHkgYSBwbGFpbiBhcnJheSAgX19hWzxfX24+XSBpbnRvIGEgc3RyaWRlZCBhcnJheSBfX2JbPF9fbiA6IF9fcz5dCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxfVHA+IF9fYiwgc2l6ZV90IF9fbiwgc2l6ZV90IF9fcykKKyAgICB7IF9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19iLl9NX2RhdGEsIF9fbiwgX19zKTsgfQorCisgIC8vIENvcHkgc3RyaWRlZCBhcnJheSBfX3NyY1s8X19uIDogX19zMT5dIGludG8gYW5vdGhlcgorICAvLyBzdHJpZGVkIGFycmF5IF9fZHN0WzwgOiBfX3MyPl0uICBUaGVpciBzaXplcyBtdXN0IG1hdGNoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zMSwKKyAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19zMikKKyAgICB7IHN0ZDo6X192YWxhcnJheV9jb3B5KF9fYS5fTV9kYXRhLCBfX24sIF9fczEsIF9fYi5fTV9kYXRhLCBfX3MyKTsgfQorCisgIC8vIENvcHkgYW4gaW5kZXhlZCBhcnJheSBfX2FbX19pWzxfX24+XV0gaW4gcGxhaW4gYXJyYXkgX19iWzxfX24+XQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2ksCisJCSAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2EuX01fZGF0YSwgX19pLl9NX2RhdGEsIF9fYi5fTV9kYXRhLCBfX24pOyB9CisKKyAgLy8gQ29weSBhIHBsYWluIGFycmF5IF9fYVs8X19uPl0gaW4gYW4gaW5kZXhlZCBhcnJheSBfX2JbX19pWzxfX24+XV0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19iLAorCQkgICAgX0FycmF5PHNpemVfdD4gX19pKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19hLl9NX2RhdGEsIF9fbiwgX19iLl9NX2RhdGEsIF9faS5fTV9kYXRhKTsgfQorCisgIC8vIENvcHkgdGhlIF9fbiBmaXJzdCBlbGVtZW50cyBvZiBhbiBpbmRleGVkIGFycmF5IF9fc3JjWzxfX2k+XSBpbnRvCisgIC8vIGFub3RoZXIgaW5kZXhlZCBhcnJheSBfX2RzdFs8X19qPl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX3NyYywgc2l6ZV90IF9fbiwgX0FycmF5PHNpemVfdD4gX19pLAorICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2RzdCwgX0FycmF5PHNpemVfdD4gX19qKQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9fc3JjLl9NX2RhdGEsIF9fbiwgX19pLl9NX2RhdGEsCisJCSAgICBfX2RzdC5fTV9kYXRhLCBfX2ouX01fZGF0YSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfQXJyYXk8X1RwPjo6X0FycmF5KHNpemVfdCBfX24pCisgICAgOiBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX24pKQorICAgIHsgc3RkOjpfX3ZhbGFycmF5X2RlZmF1bHRfY29uc3RydWN0KF9NX2RhdGEsIF9NX2RhdGEgKyBfX24pOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIF9BcnJheTxfVHA+OjpfQXJyYXkoX1RwKiBjb25zdCBfX3Jlc3RyaWN0X18gX19wKQorICAgIDogX01fZGF0YSAoX19wKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfQXJyYXk8X1RwPjo6X0FycmF5KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikKKyAgICA6IF9NX2RhdGEgKF9fdi5fTV9kYXRhKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICBfQXJyYXk8X1RwPjo6X0FycmF5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fIF9fYiwgc2l6ZV90IF9fcykKKyAgICA6IF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fcykpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19iLCBfX3MsIF9NX2RhdGEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAqCisgICAgX0FycmF5PF9UcD46OmJlZ2luICgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fZGF0YTsgfQorCisjZGVmaW5lIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkgICAgICAgIAkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIGNvbnN0IF9UcCYgX190KSBcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIGZvciAoX1RwKiBfX3AgPSBfX2EuX01fZGF0YTsgX19wIDwgX19hLl9NX2RhdGEgKyBfX247ICsrX19wKQlcCisgICAgICAgICpfX3AgX09wIyM9IF9fdDsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sIF9BcnJheTxfVHA+IF9fYikgXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOwkJCQkJCVwKKyAgICAgIGZvciAoX1RwKiBfX3EgPSBfX2IuX01fZGF0YTsgX19xIDwgX19iLl9NX2RhdGEgKyBfX247ICsrX19wLCArK19fcSkgXAorICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsCSAgICAgICAgCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbikJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX3ApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqX19wIF9PcCMjPSBfX2VbX19pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCQkJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBzaXplX3QgX19zLAlcCisJICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iKQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19xKF9fYi5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKF9UcCogX19wID0gX19hLl9NX2RhdGE7IF9fcCA8IF9fYS5fTV9kYXRhICsgX19zICogX19uOyAgICAgICBcCisJICAgX19wICs9IF9fcywgKytfX3EpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKl9fcCBfT3AjIz0gKl9fcTsJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxfVHA+IF9fYiwJCVwKKwkJICAgICAgICAgICAgIHNpemVfdCBfX24sIHNpemVfdCBfX3MpCQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfVHAqIF9fcShfX2IuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOyBfX3AgPCBfX2EuX01fZGF0YSArIF9fbjsgICAgICAgICAgICAgXAorCSAgICsrX19wLCBfX3EgKz0gX19zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpfX3AgX09wIyM9ICpfX3E7CQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4JCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fcywJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uKQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19wKF9fYS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCBfX3AgKz0gX19zKSAgICAgICAgICAgICAgICBcCisgICAgICAgICpfX3AgX09wIyM9IF9fZVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSwJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQXJyYXk8X1RwPiBfX2IsIHNpemVfdCBfX24pCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9UcCogX19xKF9fYi5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBmb3IgKHNpemVfdCogX19qID0gX19pLl9NX2RhdGE7IF9faiA8IF9faS5fTV9kYXRhICsgX19uOyAgICAgICAgICBcCisgICAgICAgICAgICsrX19qLCArK19fcSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fYS5fTV9kYXRhWypfX2pdIF9PcCMjPSAqX19xOwkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgaW5saW5lIHZvaWQJCQkJCSAgICAgICAgCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fbiwJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBfQXJyYXk8c2l6ZV90PiBfX2kpCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgX1RwKiBfX3AoX19hLl9NX2RhdGEpOwkJCQkJCVwKKyAgICAgIGZvciAoc2l6ZV90KiBfX2ogPSBfX2kuX01fZGF0YTsgX19qPF9faS5fTV9kYXRhICsgX19uOyAgICAgICAgICAgIFwKKwkgICArK19faiwgKytfX3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqX19wIF9PcCMjPSBfX2IuX01fZGF0YVsqX19qXTsJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSwJXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UsIHNpemVfdCBfX24pCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgc2l6ZV90KiBfX2ooX19pLl9NX2RhdGEpOwkgICAgICAgIAkJCQlcCisgICAgICBmb3IgKHNpemVfdCBfX2sgPSAwOyBfX2s8X19uOyArK19faywgKytfX2opCQkJXAorICAgICAgICBfX2EuX01fZGF0YVsqX19qXSBfT3AjIz0gX19lW19fa107CQkJCVwKKyAgICB9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIHZvaWQJCQkJCQkJCVwKKyAgICBfQXJyYXlfYXVnbWVudGVkXyMjX05hbWUoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19uKQkJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBib29sKiBfX29rKF9fbS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcSA9IF9fYi5fTV9kYXRhOyBfX3EgPCBfX2IuX01fZGF0YSArIF9fbjsgICAgICAgICAgICAgXAorCSAgICsrX19xLCArK19fb2ssICsrX19wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgd2hpbGUgKCEgKl9fb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7CQkJCQkJICAgICAgICAJXAorICAgICAgICAgICAgICArK19fb2s7CQkJCQkJCVwKKyAgICAgICAgICAgICAgKytfX3A7CQkJCQkJCVwKKyAgICAgICAgICAgIH0JCQkJCQkJCVwKKyAgICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4JCQkJCQlcCisgICAgdm9pZAkJCQkJCQkJXAorICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPiBfX2EsIHNpemVfdCBfX24sCQlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BcnJheTxfVHA+IF9fYiwgX0FycmF5PGJvb2w+IF9fbSkgICAJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBib29sKiBfX29rKF9fbS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBfVHAqIF9fcShfX2IuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChfVHAqIF9fcCA9IF9fYS5fTV9kYXRhOyBfX3AgPCBfX2EuX01fZGF0YSArIF9fbjsgICAgICAgICAgICAgXAorCSAgICsrX19wLCArK19fb2ssICsrX19xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgd2hpbGUgKCEgKl9fb2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7CQkJCQkgICAgICAgIAkJXAorICAgICAgICAgICAgICArK19fb2s7CQkJCQkJCVwKKyAgICAgICAgICAgICAgKytfX3E7CQkJCQkJCVwKKyAgICAgICAgICAgIH0JCQkJCQkJCVwKKyAgICAgICAgICAqX19wIF9PcCMjPSAqX19xOwkJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4JCQkJCVwKKyAgICB2b2lkCQkJCQkJCQlcCisgICAgX0FycmF5X2F1Z21lbnRlZF8jI19OYW1lKF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PGJvb2w+IF9fbSwgIAlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbikJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBib29sKiBfX29rKF9fbS5fTV9kYXRhKTsJCQkJCQlcCisgICAgICBfVHAqIF9fcChfX2EuX01fZGF0YSk7CQkJCQkJXAorICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX29rLCArK19fcCkgICAgICAgICAgICAgXAorICAgICAgICB7CSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKKyAgICAgICAgICB3aGlsZSAoISAqX19vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsJCSAgICAgICAgIAkJCQkJXAorCSAgICAgICsrX19vazsJCQkJCQkJXAorICAgICAgICAgICAgICArK19fcDsJCQkJCQkJXAorICAgICAgICAgICAgfQkJCQkJCQkJXAorICAgICAgICAgICpfX3AgX09wIyM9IF9fZVtfX2ldOwkJCQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorICAgIH0KKworICAgX0RFRklORV9BUlJBWV9GVU5DVElPTigrLCBfX3BsdXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKC0sIF9fbWludXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKCosIF9fbXVsdGlwbGllcykKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oLywgX19kaXZpZGVzKQorICAgX0RFRklORV9BUlJBWV9GVU5DVElPTiglLCBfX21vZHVsdXMpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKF4sIF9fYml0d2lzZV94b3IpCisgICBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OKHwsIF9fYml0d2lzZV9vcikKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oJiwgX19iaXR3aXNlX2FuZCkKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oPDwsIF9fc2hpZnRfbGVmdCkKKyAgIF9ERUZJTkVfQVJSQVlfRlVOQ1RJT04oPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX0FSUkFZX0ZVTkNUSU9OCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworIyBpbmNsdWRlIDxiaXRzL3ZhbGFycmF5X2FycmF5LnRjYz4KKworI2VuZGlmIC8qIF9BUlJBWV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmFsYXJyYXlfYXJyYXkudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3ZhbGFycmF5X2FycmF5LnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzIwNzA3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3ZhbGFycmF5X2FycmF5LnRjYwpAQCAtMCwwICsxLDI0NSBAQAorLy8gVGhlIHRlbXBsYXRlIGFuZCBpbmxpbmVzIGZvciB0aGUgLSotIEMrKyAtKi0gaW50ZXJuYWwgX0FycmF5IGhlbHBlciBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAzLCAyMDA1LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9hcnJheS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2YWxhcnJheX0KKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfVkFMQVJSQVlfQVJSQVlfVENDCisjZGVmaW5lIF9WQUxBUlJBWV9BUlJBWV9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2ZpbGwoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBfQXJyYXk8Ym9vbD4gX19tLAorCQkgICAgY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICAgX1RwKiBfX3AgPSBfX2EuX01fZGF0YTsKKyAgICAgIGJvb2wqIF9fb2sgKF9fbS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faT0wOyBfX2kgPCBfX247ICsrX19pLCArK19fb2ssICsrX19wKQorCXsKKwkgIHdoaWxlICghKl9fb2spCisJICB7CisJICAgICsrX19vazsKKwkgICAgKytfX3A7CisJICB9CisJICAqX19wID0gX190OworCX0KKyAgICB9CisKKyAgLy8gQ29weSBuIGVsZW1lbnRzIG9mIGEgaW50byBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBiLiAgV2hlbiBtIGlzCisgIC8vIGZhbHNlLCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIGEgaXMgc2tpcHBlZC4gIG0gbXVzdCBjb250YWluCisgIC8vIGF0IGxlYXN0IG4gdHJ1ZSBlbGVtZW50cy4gIGEgbXVzdCBjb250YWluIGF0IGxlYXN0IG4gZWxlbWVudHMgYW5kCisgIC8vIGVub3VnaCBlbGVtZW50cyB0byBtYXRjaCB1cCB3aXRoIG0gdGhyb3VnaCB0aGUgbnRoIHRydWUgZWxlbWVudAorICAvLyBvZiBtLiAgSS5lLiAgaWYgbiBpcyAxMCwgbSBoYXMgMTUgZWxlbWVudHMgd2l0aCA1IGZhbHNlIGZvbGxvd2VkCisgIC8vIGJ5IDEwIHRydWUsIGEgbXVzdCBoYXZlIDE1IGVsZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxib29sPiBfX20sIF9BcnJheTxfVHA+IF9fYiwKKwkJICAgIHNpemVfdCBfX24pCisgICAgeworICAgICAgX1RwKiBfX3AgKF9fYS5fTV9kYXRhKTsKKyAgICAgIGJvb2wqIF9fb2sgKF9fbS5fTV9kYXRhKTsKKyAgICAgIGZvciAoX1RwKiBfX3EgPSBfX2IuX01fZGF0YTsgX19xIDwgX19iLl9NX2RhdGEgKyBfX247CisJICAgKytfX3EsICsrX19vaywgKytfX3ApCisJeworCSAgd2hpbGUgKCEgKl9fb2spCisJICAgIHsKKwkgICAgICArK19fb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgICpfX3EgPSAqX19wOworCX0KKyAgICB9CisKKyAgLy8gQ29weSBuIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGZyb20gYSBpbnRvIGVsZW1lbnRzIG9mIGIuICBFbGVtZW50cworICAvLyBvZiBiIGFyZSBza2lwcGVkIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgbSBpcyBmYWxzZS4gIG0KKyAgLy8gbXVzdCBjb250YWluIGF0IGxlYXN0IG4gdHJ1ZSBlbGVtZW50cy4gIGIgbXVzdCBoYXZlIGF0IGxlYXN0IGFzCisgIC8vIG1hbnkgZWxlbWVudHMgYXMgdGhlIGluZGV4IG9mIHRoZSBudGggdHJ1ZSBlbGVtZW50IG9mIG0uICBJLmUuIGlmCisgIC8vIG0gaGFzIDE1IGVsZW1lbnRzIHdpdGggNSBmYWxzZSBmb2xsb3dlZCBieSAxMCB0cnVlLCBiIG11c3QgaGF2ZQorICAvLyBhdCBsZWFzdCAxNSBlbGVtZW50cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoX0FycmF5PF9UcD4gX19hLCBzaXplX3QgX19uLCBfQXJyYXk8X1RwPiBfX2IsCisJCSAgICBfQXJyYXk8Ym9vbD4gX19tKQorICAgIHsKKyAgICAgIF9UcCogX19xIChfX2IuX01fZGF0YSk7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBmb3IgKF9UcCogX19wID0gX19hLl9NX2RhdGE7IF9fcCA8IF9fYS5fTV9kYXRhK19fbjsKKwkgICArK19fcCwgKytfX29rLCArK19fcSkKKwl7CisJICB3aGlsZSAoISAqX19vaykKKwkgICAgeworCSAgICAgICsrX19vazsKKwkgICAgICArK19fcTsKKwkgICAgfQorCSAgKl9fcSA9ICpfX3A7CisJfQorICAgIH0KKworICAvLyBDb3B5IG4gZWxlbWVudHMgZnJvbSBhIGludG8gZWxlbWVudHMgb2YgYi4gIEVsZW1lbnRzIG9mIGEgYXJlCisgIC8vIHNraXBwZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBtIGlzIGZhbHNlLiAgRWxlbWVudHMgb2YKKyAgLy8gYiBhcmUgc2tpcHBlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIGsgaXMgZmFsc2UuICBtIGFuZAorICAvLyBrIG11c3QgY29udGFpbiBhdCBsZWFzdCBuIHRydWUgZWxlbWVudHMuICBhIGFuZCBiIG11c3QgaGF2ZSBhdAorICAvLyBsZWFzdCBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBpbmRleCBvZiB0aGUgbnRoIHRydWUgZWxlbWVudCBvZiBtLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weShfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxib29sPiBfX20sIHNpemVfdCBfX24sCisJCSAgICBfQXJyYXk8X1RwPiBfX2IsIF9BcnJheTxib29sPiBfX2spCisgICAgeworICAgICAgX1RwKiBfX3AgKF9fYS5fTV9kYXRhKTsKKyAgICAgIF9UcCogX19xIChfX2IuX01fZGF0YSk7CisgICAgICBib29sKiBfX3NyY29rIChfX20uX01fZGF0YSk7CisgICAgICBib29sKiBfX2RzdG9rIChfX2suX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247CisJICAgKytfX3NyY29rLCArK19fcCwgKytfX2RzdG9rLCArK19fcSwgKytfX2kpCisJeworCSAgd2hpbGUgKCEgKl9fc3Jjb2spCisJICAgIHsKKwkgICAgICArK19fc3Jjb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgIHdoaWxlICghICpfX2RzdG9rKSAKKwkgICAgeworCSAgICAgICsrX19kc3RvazsKKwkgICAgICArK19fcTsKKwkgICAgfQorCSAgKl9fcSA9ICpfX3A7CisJfQorICAgIH0KKworICAvLyBDb3B5IG4gY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgZSBpbnRvIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIGEuCisgIC8vIEkuZS4gYVtpXSA9IGVbaV0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwgX0FycmF5PF9UcD4gX19hKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fcCkKKwkqX19wID0gX19lW19faV07CisgICAgfQorCisgIC8vIENvcHkgbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBlIGludG8gZWxlbWVudHMgb2YgYSB1c2luZyBzdHJpZGUKKyAgLy8gcy4gIEkuZS4sIGFbMF0gPSBlWzBdLCBhW3NdID0gZVsxXSwgYVsyKnNdID0gZVsyXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uLAorCQkgICAgIF9BcnJheTxfVHA+IF9fYSwgc2l6ZV90IF9fcykKKyAgICB7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgX19wICs9IF9fcykKKwkqX19wID0gX19lW19faV07CisgICAgfQorCisgIC8vIENvcHkgbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiBlIGludG8gZWxlbWVudHMgb2YgYSBpbmRleGVkIGJ5CisgIC8vIGNvbnRlbnRzIG9mIGkuICBJLmUuLCBhW2lbMF1dID0gZVswXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBjbGFzcyBfRG9tPgorICAgIHZvaWQKKyAgICBfX3ZhbGFycmF5X2NvcHkoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uLAorCQkgICAgX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8c2l6ZV90PiBfX2kpCisgICAgeworICAgICAgc2l6ZV90KiBfX2ogKF9faS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjsgKytfX2ssICsrX19qKQorCV9fYS5fTV9kYXRhWypfX2pdID0gX19lW19fa107CisgICAgfQorCisgIC8vIENvcHkgbiBlbGVtZW50cyBvZiBlIGluZGV4ZWQgYnkgY29udGVudHMgb2YgZiBpbnRvIGVsZW1lbnRzIG9mIGEKKyAgLy8gaW5kZXhlZCBieSBjb250ZW50cyBvZiBpLiAgSS5lLiwgYVtpWzBdXSA9IGVbZlswXV0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KF9BcnJheTxfVHA+IF9fZSwgX0FycmF5PHNpemVfdD4gX19mLAorCQkgICAgc2l6ZV90IF9fbiwgCisJCSAgICBfQXJyYXk8X1RwPiBfX2EsIF9BcnJheTxzaXplX3Q+IF9faSkKKyAgICB7CisgICAgICBzaXplX3QqIF9fZyAoX19mLl9NX2RhdGEpOworICAgICAgc2l6ZV90KiBfX2ogKF9faS5fTV9kYXRhKTsKKyAgICAgIGZvciAoc2l6ZV90IF9fayA9IDA7IF9fayA8IF9fbjsgKytfX2ssICsrX19qLCArK19fZykgCisJX19hLl9NX2RhdGFbKl9fal0gPSBfX2UuX01fZGF0YVsqX19nXTsKKyAgICB9CisKKyAgLy8gQ29weSBuIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIGUgaW50byBlbGVtZW50cyBvZiBhLiAgRWxlbWVudHMgb2YKKyAgLy8gYSBhcmUgc2tpcHBlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIG0gaXMgZmFsc2UuICBtIG11c3QKKyAgLy8gaGF2ZSBhdCBsZWFzdCBuIHRydWUgZWxlbWVudHMgYW5kIGEgbXVzdCBoYXZlIGF0IGxlYXN0IGFzIG1hbnkKKyAgLy8gZWxlbWVudHMgYXMgdGhlIGluZGV4IG9mIHRoZSBudGggdHJ1ZSBlbGVtZW50IG9mIG0uICBJLmUuIGlmIG0KKyAgLy8gaGFzIDUgZmFsc2UgZm9sbG93ZWQgYnkgMTAgdHJ1ZSBlbGVtZW50cyBhbmQgbiA9PSAxMCwgYSBtdXN0IGhhdmUKKyAgLy8gYXQgbGVhc3QgMTUgZWxlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgY2xhc3MgX0RvbT4KKyAgICB2b2lkCisgICAgX192YWxhcnJheV9jb3B5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSwgc2l6ZV90IF9fbiwKKwkJICAgIF9BcnJheTxfVHA+IF9fYSwgX0FycmF5PGJvb2w+IF9fbSkKKyAgICB7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBfVHAqIF9fcCAoX19hLl9NX2RhdGEpOworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19uOyArK19faSwgKytfX29rLCArK19fcCkKKwl7CisJICB3aGlsZSAoISAqX19vaykKKwkgICAgeworCSAgICAgICsrX19vazsKKwkgICAgICArK19fcDsKKwkgICAgfQorCSAgKl9fcCA9IF9fZVtfX2ldOworCX0KKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGNsYXNzIF9Eb20+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lLCBzaXplX3QgX19uLAorCQkJICAgICAgX0FycmF5PF9UcD4gX19hKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pLCArK19fcCkKKwluZXcgKF9fcCkgX1RwKF9fZVtfX2ldKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX0FycmF5PF9UcD4gX19hLCBfQXJyYXk8Ym9vbD4gX19tLAorCQkJICAgICAgX0FycmF5PF9UcD4gX19iLCBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIF9UcCogX19wIChfX2EuX01fZGF0YSk7CisgICAgICBib29sKiBfX29rIChfX20uX01fZGF0YSk7CisgICAgICBmb3IgKF9UcCogX19xID0gX19iLl9NX2RhdGE7IF9fcSA8IF9fYi5fTV9kYXRhK19fbjsgKytfX3EsICsrX19vaywgKytfX3ApCisJeworCSAgd2hpbGUgKCEgKl9fb2spCisJICAgIHsKKwkgICAgICArK19fb2s7CisJICAgICAgKytfX3A7CisJICAgIH0KKwkgIG5ldyAoX19xKSBfVHAoKl9fcCk7CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1ZBTEFSUkFZX0FSUkFZX1RDQyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3ZhbGFycmF5X2JlZm9yZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzL3ZhbGFycmF5X2JlZm9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTVmNzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmFsYXJyYXlfYmVmb3JlLmgKQEAgLTAsMCArMSw3MzQgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGludGVybmFsIF9NZXRhIGNsYXNzLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy92YWxhcnJheV9iZWZvcmUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3ZhbGFycmF5fQorICovCisKKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8R2FicmllbC5Eb3MtUmVpc0BjbWxhLmVucy1jYWNoYW4uZnI+CisKKyNpZm5kZWYgX1ZBTEFSUkFZX0JFRk9SRV9ICisjZGVmaW5lIF9WQUxBUlJBWV9CRUZPUkVfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc2xpY2VfYXJyYXkuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vCisgIC8vIEltcGxlbWVudGluZyBhIGxvb3NlbmVkIHZhbGFycmF5IHJldHVybiB2YWx1ZSBpcyB0cmlja3kuCisgIC8vIEZpcnN0IHdlIG5lZWQgdG8gbWVldCAyNi4zLjEvMzogd2Ugc2hvdWxkIG5vdCBhZGQgbW9yZSB0aGFuCisgIC8vIHR3byBsZXZlbHMgb2YgdGVtcGxhdGUgbmVzdGluZy4gVGhlcmVmb3JlIHdlIHJlc29ydCB0byB0ZW1wbGF0ZQorICAvLyB0ZW1wbGF0ZSB0byAiZmxhdHRlbiIgbG9vc2VuZWQgcmV0dXJuIHZhbHVlIHR5cGVzLgorICAvLyBBdCBzb21lIHBvaW50IHdlIHVzZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIHRvIHJlbW92ZSBvbmUgbGV2ZWwKKyAgLy8gdGVtcGxhdGUgbmVzdGluZyBkdWUgdG8gX0V4cHI8PgorICAvLworCisgIC8vIFRoaXMgY2xhc3MgaXMgTk9UIGRlZmluZWQuIEl0IGRvZXNuJ3QgbmVlZCB0by4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gY2xhc3MgX0NvbnN0YW50OworCisgIC8vIEltcGxlbWVudGF0aW9ucyBvZiB1bmFyeSBmdW5jdGlvbnMgYXBwbGllZCB0byB2YWxhcnJheTw+cy4KKyAgLy8gSSB1c2UgaGFyZC1jb2RlZCBvYmplY3QgZnVuY3Rpb25zIGhlcmUgaW5zdGVhZCBvZiBhIGdlbmVyaWMKKyAgLy8gYXBwcm9hY2ggbGlrZSBwb2ludGVycyB0byBmdW5jdGlvbjoKKyAgLy8gICAgMSkgY29ycmVjdG5lc3M6IHNvbWUgZnVuY3Rpb25zIHRha2UgcmVmZXJlbmNlcywgb3RoZXJzIHZhbHVlcy4KKyAgLy8gICAgICAgd2UgY2FuJ3QgZGVkdWNlIHRoZSBjb3JyZWN0IHR5cGUgYWZ0ZXJ3YXJkcy4KKyAgLy8gICAgMikgZWZmaWNpZW5jeSAtLSBvYmplY3QgZnVuY3Rpb25zIGNhbiBiZSBlYXNpbHkgaW5saW5lZAorICAvLyAgICAzKSBiZSBLb2VuaWctbG9va3VwLWZyaWVuZGx5CisKKyAgc3RydWN0IF9BYnMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gYWJzKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0NvcworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBjb3MoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfQWNvcworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBhY29zKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0Nvc2gKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gY29zaChfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9TaW4KKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gc2luKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0FzaW4KKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX190KSBjb25zdAorICAgICAgeyByZXR1cm4gYXNpbihfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9TaW5oCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpbmgoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfVGFuCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRhbihfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9BdGFuCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGF0YW4oX190KTsgfQorICB9OworCisgIHN0cnVjdCBfVGFuaAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiB0YW5oKF9fdCk7IH0KKyAgfTsKKworICBzdHJ1Y3QgX0V4cAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBleHAoX190KTsgfQorICB9OworCisgIHN0cnVjdCBfTG9nCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGxvZyhfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9Mb2cxMAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBsb2cxMChfX3QpOyB9CisgIH07CisKKyAgc3RydWN0IF9TcXJ0CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNxcnQoX190KTsgfQorICB9OworCisgIC8vIEluIHRoZSBwYXN0LCB3ZSB1c2VkIHRvIHRhaWxvciBvcGVyYXRvciBhcHBsaWNhdGlvbnMgc2VtYW50aWNzCisgIC8vIHRvIHRoZSBzcGVjaWFsaXphdGlvbiBvZiBzdGFuZGFyZCBmdW5jdGlvbiBvYmplY3RzIChpLmUuIHBsdXM8PiwgZXRjLikKKyAgLy8gVGhhdCBpcyBpbmNvcnJlY3QuICBUaGVyZWZvcmUgd2UgcHJvdmlkZSBvdXIgb3duIHN1cnJvZ2F0ZXMuCisKKyAgc3RydWN0IF9fdW5hcnlfcGx1cworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiArX190OyB9CisgIH07CisKKyAgc3RydWN0IF9fbmVnYXRlCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIC1fX3Q7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19iaXR3aXNlX25vdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3QpIGNvbnN0CisgICAgICB7IHJldHVybiB+X190OyB9CisgIH07CisKKyAgc3RydWN0IF9fcGx1cworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICsgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbWludXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAtIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX211bHRpcGxpZXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAqIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2RpdmlkZXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAvIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX21vZHVsdXMKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAlIF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2JpdHdpc2VfeG9yCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggXiBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19iaXR3aXNlX2FuZAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ICYgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fYml0d2lzZV9vcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IHwgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fc2hpZnRfbGVmdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IDw8IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX3NoaWZ0X3JpZ2h0CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPj4gX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbG9naWNhbF9hbmQKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggJiYgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fbG9naWNhbF9vcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCB8fCBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19sb2dpY2FsX25vdAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gIV9feDsgfQorICB9OworCisgIHN0cnVjdCBfX2VxdWFsX3RvCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194ID09IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX25vdF9lcXVhbF90bworICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCAhPSBfX3k7IH0KKyAgfTsKKworICBzdHJ1Y3QgX19sZXNzCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX194IDwgX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fZ3JlYXRlcgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA+IF9feTsgfQorICB9OworCisgIHN0cnVjdCBfX2xlc3NfZXF1YWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggPD0gX195OyB9CisgIH07CisKKyAgc3RydWN0IF9fZ3JlYXRlcl9lcXVhbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feCA+PSBfX3k7IH0KKyAgfTsKKworICAvLyBUaGUgZmV3IGJpbmFyeSBmdW5jdGlvbnMgd2UgbWlzcy4KKyAgc3RydWN0IF9BdGFuMgorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gYXRhbjIoX194LCBfX3kpOyB9CisgIH07CisKKyAgc3RydWN0IF9Qb3cKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHBvdyhfX3gsIF9feSk7IH0KKyAgfTsKKworCisgIC8vIFdlIG5lZWQgdGhlc2UgYml0cyBpbiBvcmRlciB0byByZWNvdmVyIHRoZSByZXR1cm4gdHlwZSBvZgorICAvLyBzb21lIGZ1bmN0aW9ucy9vcGVyYXRvcnMgbm93IHRoYXQgd2UncmUgbm8gbG9uZ2VyIHVzaW5nCisgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vIHNldmVyYWwgc3BlY2lhbGl6YXRpb25zIGZvciByZWxhdGlvbmFsIG9wZXJhdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xvZ2ljYWxfbm90LCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xvZ2ljYWxfYW5kLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xvZ2ljYWxfb3IsIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fbGVzcywgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19ncmVhdGVyLCBfVHA+CisgICAgeworICAgICAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2Z1bjxfX2xlc3NfZXF1YWwsIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZnVuPF9fZ3JlYXRlcl9lcXVhbCwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19lcXVhbF90bywgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19mdW48X19ub3RfZXF1YWxfdG8sIF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIGJvb2wgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLworICAvLyBBcHBseSBmdW5jdGlvbiB0YWtpbmcgYSB2YWx1ZS9jb25zdCByZWZlcmVuY2UgY2xvc3VyZQorICAvLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Eb20sIHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX0Z1bkJhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9GdW5CYXNlKGNvbnN0IF9Eb20mIF9fZSwgdmFsdWVfdHlwZSBfX2YoX0FyZykpCisgICAgICA6IF9NX2V4cHIoX19lKSwgX01fZnVuYyhfX2YpIHt9CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZnVuYyAoX01fZXhwcltfX2ldKTsgfQorCisgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2V4cHIuc2l6ZSAoKTt9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0RvbSYgX01fZXhwcjsKKyAgICAgIHZhbHVlX3R5cGUgKCpfTV9mdW5jKShfQXJnKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9WYWxGdW5DbG9zPF9FeHByLF9Eb20+IDogX0Z1bkJhc2U8X0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlIF9UcDsKKworICAgICAgX1ZhbEZ1bkNsb3MoY29uc3QgX0RvbSYgX19lLCBfVHAgX19mKF9UcCkpIDogX0Jhc2UoX19lLCBfX2YpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9WYWxGdW5DbG9zPF9WYWxBcnJheSxfVHA+IDogX0Z1bkJhc2U8dmFsYXJyYXk8X1RwPiwgX1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bkJhc2U8dmFsYXJyYXk8X1RwPiwgX1RwPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisKKyAgICAgIF9WYWxGdW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgX1RwIF9fZihfVHApKSA6IF9CYXNlKF9fdiwgX19mKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX1JlZkZ1bkNsb3M8X0V4cHIsIF9Eb20+CisgICAgOiBfRnVuQmFzZTxfRG9tLCBjb25zdCB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlJj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPF9Eb20sIGNvbnN0IHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUmPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSBfVHA7CisKKyAgICAgIF9SZWZGdW5DbG9zKGNvbnN0IF9Eb20mIF9fZSwgX1RwIF9fZihjb25zdCBfVHAmKSkKKyAgICAgIDogX0Jhc2UoX19lLCBfX2YpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZGdW5DbG9zPF9WYWxBcnJheSwgX1RwPgorICAgIDogX0Z1bkJhc2U8dmFsYXJyYXk8X1RwPiwgY29uc3QgX1RwJj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5CYXNlPHZhbGFycmF5PF9UcD4sIGNvbnN0IF9UcCY+IF9CYXNlOworICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKworICAgICAgX1JlZkZ1bkNsb3MoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBfVHAgX19mKGNvbnN0IF9UcCYpKQorICAgICAgOiBfQmFzZShfX3YsIF9fZikge30KKyAgICB9OworCisgIC8vCisgIC8vIFVuYXJ5IGV4cHJlc3Npb24gY2xvc3VyZS4KKyAgLy8KKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0FyZz4KKyAgICBjbGFzcyBfVW5CYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FyZzo6dmFsdWVfdHlwZSBfVnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcGVyLCBfVnQ+OjpyZXN1bHRfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfVW5CYXNlKGNvbnN0IF9BcmcmIF9fZSkgOiBfTV9leHByKF9fZSkge30KKworICAgICAgdmFsdWVfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfT3BlcigpKF9NX2V4cHJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByLnNpemUoKTsgfQorICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9BcmcmIF9NX2V4cHI7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX1VuQ2xvczxfT3BlciwgX0V4cHIsIF9Eb20+CisgICAgOiBfVW5CYXNlPF9PcGVyLCBfRG9tPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0RvbSBfQXJnOworICAgICAgdHlwZWRlZiBfVW5CYXNlPF9PcGVyLCBfRG9tPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX1VuQ2xvcyhjb25zdCBfQXJnJiBfX2UpIDogX0Jhc2UoX19lKSB7fQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1VuQ2xvczxfT3BlciwgX1ZhbEFycmF5LCBfVHA+CisgICAgOiBfVW5CYXNlPF9PcGVyLCB2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHZhbGFycmF5PF9UcD4gX0FyZzsKKyAgICAgIHR5cGVkZWYgX1VuQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiA+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfVW5DbG9zKGNvbnN0IF9BcmcmIF9fZSkgOiBfQmFzZShfX2UpIHt9CisgICAgfTsKKworCisgIC8vCisgIC8vIEJpbmFyeSBleHByZXNzaW9uIGNsb3N1cmUuCisgIC8vCisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9GaXJzdEFyZywgY2xhc3MgX1NlY29uZEFyZz4KKyAgICBjbGFzcyBfQmluQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9GaXJzdEFyZzo6dmFsdWVfdHlwZSBfVnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcGVyLCBfVnQ+OjpyZXN1bHRfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQmFzZShjb25zdCBfRmlyc3RBcmcmIF9fZTEsIGNvbnN0IF9TZWNvbmRBcmcmIF9fZTIpCisgICAgICA6IF9NX2V4cHIxKF9fZTEpLCBfTV9leHByMihfX2UyKSB7fQorCisgICAgICB2YWx1ZV90eXBlIG9wZXJhdG9yW10oc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9PcGVyKCkoX01fZXhwcjFbX19pXSwgX01fZXhwcjJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByMS5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfRmlyc3RBcmcmIF9NX2V4cHIxOworICAgICAgY29uc3QgX1NlY29uZEFyZyYgX01fZXhwcjI7CisgICAgfTsKKworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfQ2xvcz4KKyAgICBjbGFzcyBfQmluQmFzZTIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2xvczo6dmFsdWVfdHlwZSBfVnQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcGVyLCBfVnQ+OjpyZXN1bHRfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQmFzZTIoY29uc3QgX0Nsb3MmIF9fZSwgY29uc3QgX1Z0JiBfX3QpCisgICAgICA6IF9NX2V4cHIxKF9fZSksIF9NX2V4cHIyKF9fdCkge30KKworICAgICAgdmFsdWVfdHlwZSBvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfT3BlcigpKF9NX2V4cHIxW19faV0sIF9NX2V4cHIyKTsgfQorCisgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2V4cHIxLnNpemUoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9DbG9zJiBfTV9leHByMTsKKyAgICAgIGNvbnN0IF9WdCYgX01fZXhwcjI7CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0Nsb3M+CisgICAgY2xhc3MgX0JpbkJhc2UxCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Nsb3M6OnZhbHVlX3R5cGUgX1Z0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfT3BlciwgX1Z0Pjo6cmVzdWx0X3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkJhc2UxKGNvbnN0IF9WdCYgX190LCBjb25zdCBfQ2xvcyYgX19lKQorICAgICAgOiBfTV9leHByMShfX3QpLCBfTV9leHByMihfX2UpIHt9CisKKyAgICAgIHZhbHVlX3R5cGUgb3BlcmF0b3JbXShzaXplX3QgX19pKSBjb25zdAorICAgICAgeyByZXR1cm4gX09wZXIoKShfTV9leHByMSwgX01fZXhwcjJbX19pXSk7IH0KKworICAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfTV9leHByMi5zaXplKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBfVnQmIF9NX2V4cHIxOworICAgICAgY29uc3QgX0Nsb3MmIF9NX2V4cHIyOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIGNsYXNzIF9Eb20xLCBjbGFzcyBfRG9tMj4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9FeHByLCBfRXhwciwgX0RvbTEsIF9Eb20yPgorICAgIDogX0JpbkJhc2U8X09wZXIsIF9Eb20xLCBfRG9tMj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlPF9PcGVyLCBfRG9tMSwgX0RvbTI+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfRG9tMSYgX19lMSwgY29uc3QgX0RvbTImIF9fZTIpIDogX0Jhc2UoX19lMSwgX19lMikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLF9WYWxBcnJheSwgX1ZhbEFycmF5LCBfVHAsIF9UcD4KKyAgICA6IF9CaW5CYXNlPF9PcGVyLCB2YWxhcnJheTxfVHA+LCB2YWxhcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5CYXNlPF9PcGVyLCB2YWxhcnJheTxfVHA+LCB2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdiwgY29uc3QgdmFsYXJyYXk8X1RwPiYgX193KQorICAgICAgOiBfQmFzZShfX3YsIF9fdykge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlciwgX0V4cHIsIF9WYWxBcnJheSwgX0RvbSwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4KKyAgICA6IF9CaW5CYXNlPF9PcGVyLCBfRG9tLCB2YWxhcnJheTx0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlPiA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2U8X09wZXIsX0RvbSx2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IF9Eb20mIF9fZTEsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fZTIpCisgICAgICA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9WYWxBcnJheSwgX0V4cHIsIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUsIF9Eb20+CisgICAgOiBfQmluQmFzZTxfT3BlciwgdmFsYXJyYXk8dHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZT4sX0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX1RwOworICAgICAgdHlwZWRlZiBfQmluQmFzZTxfT3BlciwgdmFsYXJyYXk8X1RwPiwgX0RvbT4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fZTEsIGNvbnN0IF9Eb20mIF9fZTIpCisgICAgICA6IF9CYXNlKF9fZTEsIF9fZTIpIHt9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfT3BlciwgY2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX0JpbkNsb3M8X09wZXIsIF9FeHByLCBfQ29uc3RhbnQsIF9Eb20sIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGU+CisgICAgOiBfQmluQmFzZTI8X09wZXIsIF9Eb20+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIF9UcDsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UyPF9PcGVyLF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfRG9tJiBfX2UxLCBjb25zdCBfVHAmIF9fZTIpIDogX0Jhc2UoX19lMSwgX19lMikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCBjbGFzcyBfRG9tPgorICAgIHN0cnVjdCBfQmluQ2xvczxfT3BlciwgX0NvbnN0YW50LCBfRXhwciwgdHlwZW5hbWUgX0RvbTo6dmFsdWVfdHlwZSwgX0RvbT4KKyAgICA6IF9CaW5CYXNlMTxfT3BlciwgX0RvbT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Eb206OnZhbHVlX3R5cGUgX1RwOworICAgICAgdHlwZWRlZiBfQmluQmFzZTE8X09wZXIsIF9Eb20+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICBfQmluQ2xvcyhjb25zdCBfVHAmIF9fZTEsIGNvbnN0IF9Eb20mIF9fZTIpIDogX0Jhc2UoX19lMSwgX19lMikge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfVmFsQXJyYXksIF9Db25zdGFudCwgX1RwLCBfVHA+CisgICAgOiBfQmluQmFzZTI8X09wZXIsIHZhbGFycmF5PF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UyPF9PcGVyLHZhbGFycmF5PF9UcD4gPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgX0JpbkNsb3MoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCBfVHAmIF9fdCkgOiBfQmFzZShfX3YsIF9fdCkge30KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9PcGVyLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9CaW5DbG9zPF9PcGVyLCBfQ29uc3RhbnQsIF9WYWxBcnJheSwgX1RwLCBfVHA+CisgICAgOiBfQmluQmFzZTE8X09wZXIsIHZhbGFycmF5PF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbkJhc2UxPF9PcGVyLCB2YWxhcnJheTxfVHA+ID4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIF9CaW5DbG9zKGNvbnN0IF9UcCYgX190LCBjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YpIDogX0Jhc2UoX190LCBfX3YpIHt9CisgICAgfTsKKworICAgIC8vCisgICAgLy8gc2xpY2VfYXJyYXkgY2xvc3VyZS4KKyAgICAvLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRG9tPiAKKyAgICBjbGFzcyBfU0Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRG9tOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9TQmFzZSAoY29uc3QgX0RvbSYgX19lLCBjb25zdCBzbGljZSYgX19zKQorICAgICAgOiBfTV9leHByIChfX2UpLCBfTV9zbGljZSAoX19zKSB7fQorICAgICAgICAKKyAgICAgIHZhbHVlX3R5cGUKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdCBfX2kpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9leHByW19NX3NsaWNlLnN0YXJ0ICgpICsgX19pICogX01fc2xpY2Uuc3RyaWRlICgpXTsgfQorICAgICAgICAKKyAgICAgIHNpemVfdAorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zbGljZS5zaXplICgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgY29uc3QgX0RvbSYgX01fZXhwcjsKKyAgICAgIGNvbnN0IHNsaWNlJiBfTV9zbGljZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfU0Jhc2U8X0FycmF5PF9UcD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworICAgICAgCisgICAgICBfU0Jhc2UgKF9BcnJheTxfVHA+IF9fYSwgY29uc3Qgc2xpY2UmIF9fcykKKyAgICAgIDogX01fYXJyYXkgKF9fYS5fTV9kYXRhK19fcy5zdGFydCgpKSwgX01fc2l6ZSAoX19zLnNpemUoKSksCisJX01fc3RyaWRlIChfX3Muc3RyaWRlKCkpIHt9CisgICAgICAgIAorICAgICAgdmFsdWVfdHlwZQorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90IF9faSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2FycmF5Ll9NX2RhdGFbX19pICogX01fc3RyaWRlXTsgfQorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc2l6ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IF9BcnJheTxfVHA+IF9NX2FycmF5OworICAgICAgY29uc3Qgc2l6ZV90IF9NX3NpemU7CisgICAgICBjb25zdCBzaXplX3QgX01fc3RyaWRlOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBzdHJ1Y3QgX1NDbG9zPF9FeHByLCBfRG9tPgorICAgIDogX1NCYXNlPF9Eb20+CisgICAgeworICAgICAgdHlwZWRlZiBfU0Jhc2U8X0RvbT4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9TQ2xvcyAoY29uc3QgX0RvbSYgX19lLCBjb25zdCBzbGljZSYgX19zKSA6IF9CYXNlIChfX2UsIF9fcykge30KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1NDbG9zPF9WYWxBcnJheSwgX1RwPgorICAgIDogX1NCYXNlPF9BcnJheTxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmICBfU0Jhc2U8X0FycmF5PF9UcD4gPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX1RwIHZhbHVlX3R5cGU7CisgICAgICAKKyAgICAgIF9TQ2xvcyAoX0FycmF5PF9UcD4gX19hLCBjb25zdCBzbGljZSYgX19zKSA6IF9CYXNlIChfX2EsIF9fcykge30KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfQ1BQX1ZBTEFSUkFZX0JFRk9SRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmVjdG9yLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0cy92ZWN0b3IudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjNmNzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2JpdHMvdmVjdG9yLnRjYwpAQCAtMCwwICsxLDc4OCBAQAorLy8gVmVjdG9yIGltcGxlbWVudGF0aW9uIChvdXQgb2YgbGluZSkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorLy8gMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBiaXRzL3ZlY3Rvci50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt2ZWN0b3J9CisgKi8KKworI2lmbmRlZiBfVkVDVE9SX1RDQworI2RlZmluZSBfVkVDVE9SX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJX190aHJvd19sZW5ndGhfZXJyb3IoX19OKCJ2ZWN0b3I6OnJlc2VydmUiKSk7CisgICAgICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IF9fbikKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsKKwkgIHBvaW50ZXIgX190bXAgPSBfTV9hbGxvY2F0ZV9hbmRfY29weShfX24sCisJCSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IodGhpcy0+X01faW1wbC5fTV9zdGFydCksCisJCSBfR0xJQkNYWF9NQUtFX01PVkVfSVRFUkFUT1IodGhpcy0+X01faW1wbC5fTV9maW5pc2gpKTsKKwkgIHN0ZDo6X0Rlc3Ryb3kodGhpcy0+X01faW1wbC5fTV9zdGFydCwgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3RtcDsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX190bXAgKyBfX29sZF9zaXplOworCSAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX247CisJfQorICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgdm9pZAorICAgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UpCisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgfQorCWVsc2UKKwkgIF9NX2luc2VydF9hdXgoZW5kKCksIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworICAgICAgaWYgKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICE9IHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkgICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpCisJeworCSAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QodGhpcy0+X01faW1wbC5fTV9maW5pc2gsIF9feCk7CisJICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCX0KKyAgICAgIGVsc2UKKwl7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKwkgIGlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCSAgICB7CisJICAgICAgX1RwIF9feF9jb3B5ID0gX194OworCSAgICAgIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feF9jb3B5KSk7CisJICAgIH0KKwkgIGVsc2UKKyNlbmRpZgorCSAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CisJfQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX24pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgeworICAgICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgpKQorCV9HTElCQ1hYX01PVkUzKF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7CisgICAgICAtLXRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworICAgICAgdGhpcy0+X01faW1wbC5kZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoKTsKKyAgICAgIHJldHVybiBfX3Bvc2l0aW9uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppdGVyYXRvcgorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICBpZiAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgaWYgKF9fbGFzdCAhPSBlbmQoKSkKKwkgICAgX0dMSUJDWFhfTU9WRTMoX19sYXN0LCBlbmQoKSwgX19maXJzdCk7CisJICBfTV9lcmFzZV9hdF9lbmQoX19maXJzdC5iYXNlKCkgKyAoZW5kKCkgLSBfX2xhc3QpKTsKKwl9CisgICAgICByZXR1cm4gX19maXJzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPiYKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX194KQorICAgIHsKKyNpZiBfX2dvb2dsZV9zdGxfZGVidWdfZGFuZ2xpbmdfdmVjdG9yCisgICAgICBpZiAoIXRoaXMtPl9NX2lzX3ZhbGlkKCkgfHwgIV9feC5fTV9pc192YWxpZCgpKQorCV9fdGhyb3dfbG9naWNfZXJyb3IoIm9wZXJhdG9yPSgpIG9uIGNvcnJ1cHQgKGRhbmdsaW5nPykgdmVjdG9yIik7CisjZW5kaWYKKyAgICAgIGlmICgmX194ICE9IHRoaXMpCisJeworCSAgY29uc3Qgc2l6ZV90eXBlIF9feGxlbiA9IF9feC5zaXplKCk7CisJICBpZiAoX194bGVuID4gY2FwYWNpdHkoKSkKKwkgICAgeworCSAgICAgIHBvaW50ZXIgX190bXAgPSBfTV9hbGxvY2F0ZV9hbmRfY29weShfX3hsZW4sIF9feC5iZWdpbigpLAorCQkJCQkJICAgX194LmVuZCgpKTsKKwkgICAgICBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3RtcDsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9feGxlbjsKKwkgICAgfQorCSAgZWxzZSBpZiAoc2l6ZSgpID49IF9feGxlbikKKwkgICAgeworCSAgICAgIHN0ZDo6X0Rlc3Ryb3koc3RkOjpjb3B5KF9feC5iZWdpbigpLCBfX3guZW5kKCksIGJlZ2luKCkpLAorCQkJICAgIGVuZCgpLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdGQ6OmNvcHkoX194Ll9NX2ltcGwuX01fc3RhcnQsIF9feC5fTV9pbXBsLl9NX3N0YXJ0ICsgc2l6ZSgpLAorCQkJdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9feC5fTV9pbXBsLl9NX3N0YXJ0ICsgc2l6ZSgpLAorCQkJCQkgIF9feC5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgKyBfX3hsZW47CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgX01fZmlsbF9hc3NpZ24oc2l6ZV90IF9fbiwgY29uc3QgdmFsdWVfdHlwZSYgX192YWwpCisgICAgeworICAgICAgaWYgKF9fbiA+IGNhcGFjaXR5KCkpCisJeworCSAgdmVjdG9yIF9fdG1wKF9fbiwgX192YWwsIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICBfX3RtcC5zd2FwKCp0aGlzKTsKKwl9CisgICAgICBlbHNlIGlmIChfX24gPiBzaXplKCkpCisJeworCSAgc3RkOjpmaWxsKGJlZ2luKCksIGVuZCgpLCBfX3ZhbCk7CisJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9maWxsX25fYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJX19uIC0gc2l6ZSgpLCBfX3ZhbCwKKwkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbiAtIHNpemUoKTsKKwl9CisgICAgICBlbHNlCisgICAgICAgIF9NX2VyYXNlX2F0X2VuZChzdGQ6OmZpbGxfbih0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCBfX24sIF9fdmFsKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgICBfTV9hc3NpZ25fYXV4KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCXBvaW50ZXIgX19jdXIodGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fY3VyICE9IHRoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgICAgKytfX2N1ciwgKytfX2ZpcnN0KQorCSAgKl9fY3VyID0gKl9fZmlyc3Q7CisJaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgX01fZXJhc2VfYXRfZW5kKF9fY3VyKTsKKwllbHNlCisJICBpbnNlcnQoZW5kKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwljb25zdCBzaXplX3R5cGUgX19sZW4gPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisKKwlpZiAoX19sZW4gPiBjYXBhY2l0eSgpKQorCSAgeworCSAgICBwb2ludGVyIF9fdG1wKF9NX2FsbG9jYXRlX2FuZF9jb3B5KF9fbGVuLCBfX2ZpcnN0LCBfX2xhc3QpKTsKKwkgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkgICAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX3RtcDsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ICsgX19sZW47CisJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaDsKKwkgIH0KKwllbHNlIGlmIChzaXplKCkgPj0gX19sZW4pCisJICBfTV9lcmFzZV9hdF9lbmQoc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgdGhpcy0+X01faW1wbC5fTV9zdGFydCkpOworCWVsc2UKKwkgIHsKKwkgICAgX0ZvcndhcmRJdGVyYXRvciBfX21pZCA9IF9fZmlyc3Q7CisJICAgIHN0ZDo6YWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKKwkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPQorCSAgICAgIHN0ZDo6X191bmluaXRpYWxpemVkX2NvcHlfYShfX21pZCwgX19sYXN0LAorCQkJCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICB9CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgIHR5cGVuYW1lIHZlY3RvcjxfVHAsIF9BbGxvYz46Oml0ZXJhdG9yCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIF9fbiA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworCWlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJICAgICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpCisJICB7CisJICAgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgICArK3RoaXMtPl9NX2ltcGwuX01fZmluaXNoOworCSAgfQorCWVsc2UKKwkgIF9NX2luc2VydF9hdXgoX19wb3NpdGlvbiwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01faW1wbC5fTV9zdGFydCArIF9fbik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX2luc2VydF9hdXgoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPF9UcCwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyNlbmRpZgorICAgIHsKKyAgICAgIGlmICh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCXsKKwkgIHRoaXMtPl9NX2ltcGwuY29uc3RydWN0KHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCSAgX0dMSUJDWFhfTU9WRSgqKHRoaXMtPl9NX2ltcGwuX01fZmluaXNoCisJCQkJCQkgIC0gMSkpKTsKKwkgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisJICBfVHAgX194X2NvcHkgPSBfX3g7CisjZW5kaWYKKwkgIF9HTElCQ1hYX01PVkVfQkFDS1dBUkQzKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSAyLAorCQkJCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSAxKTsKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKwkgICpfX3Bvc2l0aW9uID0gX194X2NvcHk7CisjZWxzZQorCSAgKl9fcG9zaXRpb24gPSBfVHAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyNlbmRpZgorCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPQorCSAgICBfTV9jaGVja19sZW4oc2l6ZV90eXBlKDEpLCAidmVjdG9yOjpfTV9pbnNlcnRfYXV4Iik7CisJICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19iZWZvcmUgPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKKwkgIHBvaW50ZXIgX19uZXdfc3RhcnQodGhpcy0+X01fYWxsb2NhdGUoX19sZW4pKTsKKwkgIHBvaW50ZXIgX19uZXdfZmluaXNoKF9fbmV3X3N0YXJ0KTsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlIHRocmVlIG9wZXJhdGlvbnMgaXMgZGljdGF0ZWQgYnkgdGhlIEMrKzB4CisJICAgICAgLy8gY2FzZSwgd2hlcmUgdGhlIG1vdmVzIGNvdWxkIGFsdGVyIGEgbmV3IGVsZW1lbnQgYmVsb25naW5nCisJICAgICAgLy8gdG8gdGhlIGV4aXN0aW5nIHZlY3Rvci4gIFRoaXMgaXMgYW4gaXNzdWUgb25seSBmb3IgY2FsbGVycworCSAgICAgIC8vIHRha2luZyB0aGUgZWxlbWVudCBieSBjb25zdCBsdmFsdWUgcmVmIChzZWUgMjMuMS8xMykuCisJICAgICAgdGhpcy0+X01faW1wbC5jb25zdHJ1Y3QoX19uZXdfc3RhcnQgKyBfX2VsZW1zX2JlZm9yZSwKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCQkJCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisjZWxzZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9feCk7CisjZW5kaWYKKwkgICAgICBfX25ld19maW5pc2ggPSAwOworCisJICAgICAgX19uZXdfZmluaXNoID0KKwkJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQkJCSAgICBfX3Bvc2l0aW9uLmJhc2UoKSwgX19uZXdfc3RhcnQsCisJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgICsrX19uZXdfZmluaXNoOworCisJICAgICAgX19uZXdfZmluaXNoID0KKwkJc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICBfX25ld19maW5pc2gsCisJCQkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICBpZiAoIV9fbmV3X2ZpbmlzaCkKKwkJdGhpcy0+X01faW1wbC5kZXN0cm95KF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUpOworCSAgICAgIGVsc2UKKwkJc3RkOjpfRGVzdHJveShfX25ld19zdGFydCwgX19uZXdfZmluaXNoLCBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICBfTV9kZWFsbG9jYXRlKHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsCisJCQl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQktIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICBfTV9maWxsX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgeworICAgICAgaWYgKF9fbiAhPSAwKQorCXsKKwkgIGlmIChzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCkgPj0gX19uKQorCSAgICB7CisJICAgICAgdmFsdWVfdHlwZSBfX3hfY29weSA9IF9feDsKKwkgICAgICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRlciA9IGVuZCgpIC0gX19wb3NpdGlvbjsKKwkgICAgICBwb2ludGVyIF9fb2xkX2ZpbmlzaCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisJICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pCisJCXsKKwkJICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2ggLSBfX24sCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJICAgICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX247CisJCSAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCSAgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gpOworCQkgIHN0ZDo6ZmlsbChfX3Bvc2l0aW9uLmJhc2UoKSwgX19wb3NpdGlvbi5iYXNlKCkgKyBfX24sCisJCQkgICAgX194X2NvcHkpOworCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQlfX24gLSBfX2VsZW1zX2FmdGVyLAorCQkJCQkJX194X2NvcHksCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisJCSAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fcG9zaXRpb24uYmFzZSgpLCBfX29sZF9maW5pc2gsCisJCQkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkgICAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fZWxlbXNfYWZ0ZXI7CisJCSAgc3RkOjpmaWxsKF9fcG9zaXRpb24uYmFzZSgpLCBfX29sZF9maW5pc2gsIF9feF9jb3B5KTsKKwkJfQorCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQlfTV9jaGVja19sZW4oX19uLCAidmVjdG9yOjpfTV9maWxsX2luc2VydCIpOworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2JlZm9yZSA9IF9fcG9zaXRpb24gLSBiZWdpbigpOworCSAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQodGhpcy0+X01fYWxsb2NhdGUoX19sZW4pKTsKKwkgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJICAgICAgX190cnkKKwkJeworCQkgIC8vIFNlZSBfTV9pbnNlcnRfYXV4IGFib3ZlLgorCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2ZpbGxfbl9hKF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUsCisJCQkJCQlfX24sIF9feCwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgX19uZXdfZmluaXNoID0gMDsKKworCQkgIF9fbmV3X2ZpbmlzaCA9CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCV9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJX19uZXdfc3RhcnQsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIF9fbmV3X2ZpbmlzaCArPSBfX247CisKKwkJICBfX25ld19maW5pc2ggPQorCQkgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQlfX25ld19maW5pc2gsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQl9CisJICAgICAgX19jYXRjaCguLi4pCisJCXsKKwkJICBpZiAoIV9fbmV3X2ZpbmlzaCkKKwkJICAgIHN0ZDo6X0Rlc3Ryb3koX19uZXdfc3RhcnQgKyBfX2VsZW1zX2JlZm9yZSwKKwkJCQkgIF9fbmV3X3N0YXJ0ICsgX19lbGVtc19iZWZvcmUgKyBfX24sCisJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIGVsc2UKKwkJICAgIHN0ZDo6X0Rlc3Ryb3koX19uZXdfc3RhcnQsIF9fbmV3X2ZpbmlzaCwKKwkJCQkgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCwgX19sZW4pOworCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQl9CisJICAgICAgc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCSAgICAgIF9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgICAgLSB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0KTsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CisJICAgIH0KKwl9CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgIF9NX2RlZmF1bHRfYXBwZW5kKHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fbiAhPSAwKQorCXsKKwkgIGlmIChzaXplX3R5cGUodGhpcy0+X01faW1wbC5fTV9lbmRfb2Zfc3RvcmFnZQorCQkJLSB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCkgPj0gX19uKQorCSAgICB7CisJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfZGVmYXVsdF9uX2EodGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCSAgICAgICBfX24sIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19uOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQlfTV9jaGVja19sZW4oX19uLCAidmVjdG9yOjpfTV9kZWZhdWx0X2FwcGVuZCIpOworCSAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+c2l6ZSgpOworCSAgICAgIHBvaW50ZXIgX19uZXdfc3RhcnQodGhpcy0+X01fYWxsb2NhdGUoX19sZW4pKTsKKwkgICAgICBwb2ludGVyIF9fbmV3X2ZpbmlzaChfX25ld19zdGFydCk7CisJICAgICAgX190cnkKKwkJeworCQkgIF9fbmV3X2ZpbmlzaCA9CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJX19uZXdfc3RhcnQsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIHN0ZDo6X191bmluaXRpYWxpemVkX2RlZmF1bHRfbl9hKF9fbmV3X2ZpbmlzaCwgX19uLAorCQkJCQkJICAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBfX25ld19maW5pc2ggKz0gX19uOworCQl9CisJICAgICAgX19jYXRjaCguLi4pCisJCXsKKwkJICBzdGQ6Ol9EZXN0cm95KF9fbmV3X3N0YXJ0LCBfX25ld19maW5pc2gsCisJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0LCBfX2xlbik7CisJCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCX0KKwkgICAgICBzdGQ6Ol9EZXN0cm95KHRoaXMtPl9NX2ltcGwuX01fc3RhcnQsIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJICAgICAgX01fZGVhbGxvY2F0ZSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LAorCQkJICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAgICAtIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQpOworCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKKwkgICAgICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIHZlY3RvcjxfVHAsIF9BbGxvYz46OgorICAgICAgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCSAgeworCSAgICBfX3BvcyA9IGluc2VydChfX3BvcywgKl9fZmlyc3QpOworCSAgICArK19fcG9zOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8X1RwLCBfQWxsb2M+OjoKKyAgICAgIF9NX3JhbmdlX2luc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90eXBlIF9fbiA9IHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsKKwkgICAgaWYgKHNpemVfdHlwZSh0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlCisJCQkgIC0gdGhpcy0+X01faW1wbC5fTV9maW5pc2gpID49IF9fbikKKwkgICAgICB7CisJCWNvbnN0IHNpemVfdHlwZSBfX2VsZW1zX2FmdGVyID0gZW5kKCkgLSBfX3Bvc2l0aW9uOworCQlwb2ludGVyIF9fb2xkX2ZpbmlzaCh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCk7CisJCWlmIChfX2VsZW1zX2FmdGVyID4gX19uKQorCQkgIHsKKwkJICAgIHN0ZDo6X191bmluaXRpYWxpemVkX21vdmVfYSh0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCAtIF9fbiwKKwkJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJdGhpcy0+X01faW1wbC5fTV9maW5pc2gsCisJCQkJCQlfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2ggKz0gX19uOworCQkgICAgX0dMSUJDWFhfTU9WRV9CQUNLV0FSRDMoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCSAgICBfX29sZF9maW5pc2ggLSBfX24sIF9fb2xkX2ZpbmlzaCk7CisJCSAgICBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKKwkJICAgIHN0ZDo6YWR2YW5jZShfX21pZCwgX19lbGVtc19hZnRlcik7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9jb3B5X2EoX19taWQsIF9fbGFzdCwKKwkJCQkJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoLAorCQkJCQkJX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IF9fbiAtIF9fZWxlbXNfYWZ0ZXI7CisJCSAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCQlfX29sZF9maW5pc2gsCisJCQkJCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCV9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCSAgICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOworCQkgICAgc3RkOjpjb3B5KF9fZmlyc3QsIF9fbWlkLCBfX3Bvc2l0aW9uKTsKKwkJICB9CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQljb25zdCBzaXplX3R5cGUgX19sZW4gPQorCQkgIF9NX2NoZWNrX2xlbihfX24sICJ2ZWN0b3I6Ol9NX3JhbmdlX2luc2VydCIpOworCQlwb2ludGVyIF9fbmV3X3N0YXJ0KHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKSk7CisJCXBvaW50ZXIgX19uZXdfZmluaXNoKF9fbmV3X3N0YXJ0KTsKKwkJX190cnkKKwkJICB7CisJCSAgICBfX25ld19maW5pc2ggPQorCQkgICAgICBzdGQ6Ol9fdW5pbml0aWFsaXplZF9tb3ZlX2EodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCQkJCSAgX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCQkgIF9fbmV3X3N0YXJ0LAorCQkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgX19uZXdfZmluaXNoID0KKwkJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfY29weV9hKF9fZmlyc3QsIF9fbGFzdCwKKwkJCQkJCSAgX19uZXdfZmluaXNoLAorCQkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgICAgX19uZXdfZmluaXNoID0KKwkJICAgICAgc3RkOjpfX3VuaW5pdGlhbGl6ZWRfbW92ZV9hKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCQkJCSAgX19uZXdfZmluaXNoLAorCQkJCQkJICBfTV9nZXRfVHBfYWxsb2NhdG9yKCkpOworCQkgIH0KKwkJX19jYXRjaCguLi4pCisJCSAgeworCQkgICAgc3RkOjpfRGVzdHJveShfX25ld19zdGFydCwgX19uZXdfZmluaXNoLAorCQkJCSAgX01fZ2V0X1RwX2FsbG9jYXRvcigpKTsKKwkJICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsIF9fbGVuKTsKKwkJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQkgIH0KKwkJc3RkOjpfRGVzdHJveSh0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0LCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwKKwkJCSAgICAgIF9NX2dldF9UcF9hbGxvY2F0b3IoKSk7CisJCV9NX2RlYWxsb2NhdGUodGhpcy0+X01faW1wbC5fTV9zdGFydCwKKwkJCSAgICAgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UKKwkJCSAgICAgIC0gdGhpcy0+X01faW1wbC5fTV9zdGFydCk7CisJCXRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBfX25ld19zdGFydDsKKwkJdGhpcy0+X01faW1wbC5fTV9maW5pc2ggPSBfX25ld19maW5pc2g7CisJCXRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworCisgIC8vIHZlY3Rvcjxib29sPgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgdmVjdG9yPGJvb2wsIF9BbGxvYz46OgorICAgIHJlc2VydmUoc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBpZiAoX19uID4gdGhpcy0+bWF4X3NpemUoKSkKKwlfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oInZlY3Rvcjo6cmVzZXJ2ZSIpKTsKKyAgICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgX19uKQorCXsKKwkgIF9CaXRfdHlwZSogX19xID0gdGhpcy0+X01fYWxsb2NhdGUoX19uKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gX01fY29weV9hbGlnbmVkKGJlZ2luKCksIGVuZCgpLAorCQkJCQkJICAgIGl0ZXJhdG9yKF9fcSwgMCkpOworCSAgdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gKF9fcSArIChfX24gKyBpbnQoX1Nfd29yZF9iaXQpIC0gMSkKKwkJCQkJICAgICAvIGludChfU193b3JkX2JpdCkpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8Ym9vbCwgX0FsbG9jPjo6CisgICAgX01fZmlsbF9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3gpCisgICAgeworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybjsKKyAgICAgIGlmIChjYXBhY2l0eSgpIC0gc2l6ZSgpID49IF9fbikKKwl7CisJICBzdGQ6OmNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksCisJCQkgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOworCSAgc3RkOjpmaWxsKF9fcG9zaXRpb24sIF9fcG9zaXRpb24gKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSAKKwkgICAgX01fY2hlY2tfbGVuKF9fbiwgInZlY3Rvcjxib29sPjo6X01fZmlsbF9pbnNlcnQiKTsKKwkgIF9CaXRfdHlwZSAqIF9fcSA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKTsKKwkgIGl0ZXJhdG9yIF9faSA9IF9NX2NvcHlfYWxpZ25lZChiZWdpbigpLCBfX3Bvc2l0aW9uLAorCQkJCQkgaXRlcmF0b3IoX19xLCAwKSk7CisJICBzdGQ6OmZpbGwoX19pLCBfX2kgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSwgX194KTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoID0gc3RkOjpjb3B5KF9fcG9zaXRpb24sIGVuZCgpLAorCQkJCQkgICAgICBfX2kgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CisJICB0aGlzLT5fTV9kZWFsbG9jYXRlKCk7CisJICB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gKF9fcSArICgoX19sZW4KKwkJCQkJCSAgICAgKyBpbnQoX1Nfd29yZF9iaXQpIC0gMSkKKwkJCQkJCSAgICAvIGludChfU193b3JkX2JpdCkpKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICB2ZWN0b3I8Ym9vbCwgX0FsbG9jPjo6CisgICAgICBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCAKKwkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7CisJaWYgKF9fZmlyc3QgIT0gX19sYXN0KQorCSAgeworCSAgICBzaXplX3R5cGUgX19uID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pCisJICAgICAgeworCQlzdGQ6OmNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwgZW5kKCksCisJCQkJICAgdGhpcy0+X01faW1wbC5fTV9maW5pc2gKKwkJCQkgICArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKKwkJc3RkOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19wb3NpdGlvbik7CisJCXRoaXMtPl9NX2ltcGwuX01fZmluaXNoICs9IGRpZmZlcmVuY2VfdHlwZShfX24pOworCSAgICAgIH0KKwkgICAgZWxzZQorCSAgICAgIHsKKwkJY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0KKwkJICBfTV9jaGVja19sZW4oX19uLCAidmVjdG9yPGJvb2w+OjpfTV9pbnNlcnRfcmFuZ2UiKTsKKwkJX0JpdF90eXBlICogX19xID0gdGhpcy0+X01fYWxsb2NhdGUoX19sZW4pOworCQlpdGVyYXRvciBfX2kgPSBfTV9jb3B5X2FsaWduZWQoYmVnaW4oKSwgX19wb3NpdGlvbiwKKwkJCQkJICAgICAgIGl0ZXJhdG9yKF9fcSwgMCkpOworCQlfX2kgPSBzdGQ6OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOworCQl0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHN0ZDo6Y29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKwkJdGhpcy0+X01fZGVhbGxvY2F0ZSgpOworCQl0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlID0gKF9fcQorCQkJCQkJICAgKyAoKF9fbGVuCisJCQkJCQkgICAgICAgKyBpbnQoX1Nfd29yZF9iaXQpIC0gMSkKKwkJCQkJCSAgICAgIC8gaW50KF9TX3dvcmRfYml0KSkpOworCQl0aGlzLT5fTV9pbXBsLl9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICB2ZWN0b3I8Ym9vbCwgX0FsbG9jPjo6CisgICAgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBib29sIF9feCkKKyAgICB7CisgICAgICBpZiAodGhpcy0+X01faW1wbC5fTV9maW5pc2guX01fcCAhPSB0aGlzLT5fTV9pbXBsLl9NX2VuZF9vZl9zdG9yYWdlKQorCXsKKwkgIHN0ZDo6Y29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCwgCisJCQkgICAgIHRoaXMtPl9NX2ltcGwuX01fZmluaXNoICsgMSk7CisJICAqX19wb3NpdGlvbiA9IF9feDsKKwkgICsrdGhpcy0+X01faW1wbC5fTV9maW5pc2g7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9CisJICAgIF9NX2NoZWNrX2xlbihzaXplX3R5cGUoMSksICJ2ZWN0b3I8Ym9vbD46Ol9NX2luc2VydF9hdXgiKTsKKwkgIF9CaXRfdHlwZSAqIF9fcSA9IHRoaXMtPl9NX2FsbG9jYXRlKF9fbGVuKTsKKwkgIGl0ZXJhdG9yIF9faSA9IF9NX2NvcHlfYWxpZ25lZChiZWdpbigpLCBfX3Bvc2l0aW9uLAorCQkJCQkgaXRlcmF0b3IoX19xLCAwKSk7CisJICAqX19pKysgPSBfX3g7CisJICB0aGlzLT5fTV9pbXBsLl9NX2ZpbmlzaCA9IHN0ZDo6Y29weShfX3Bvc2l0aW9uLCBlbmQoKSwgX19pKTsKKwkgIHRoaXMtPl9NX2RlYWxsb2NhdGUoKTsKKwkgIHRoaXMtPl9NX2ltcGwuX01fZW5kX29mX3N0b3JhZ2UgPSAoX19xICsgKChfX2xlbgorCQkJCQkJICAgICArIGludChfU193b3JkX2JpdCkgLSAxKQorCQkJCQkJICAgIC8gaW50KF9TX3dvcmRfYml0KSkpOworCSAgdGhpcy0+X01faW1wbC5fTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzaXplX3QKKyAgICBoYXNoPF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj46OgorICAgIG9wZXJhdG9yKCkoY29uc3QgX0dMSUJDWFhfU1REX0M6OnZlY3Rvcjxib29sLCBfQWxsb2M+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgeworICAgICAgc2l6ZV90IF9faGFzaCA9IDA7CisgICAgICB1c2luZyBfR0xJQkNYWF9TVERfQzo6X1Nfd29yZF9iaXQ7CisgICAgICB1c2luZyBfR0xJQkNYWF9TVERfQzo6X0JpdF90eXBlOworCisgICAgICBjb25zdCBzaXplX3QgX193b3JkcyA9IF9fYi5zaXplKCkgLyBfU193b3JkX2JpdDsKKyAgICAgIGlmIChfX3dvcmRzKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX2NsZW5ndGggPSBfX3dvcmRzICogc2l6ZW9mKF9CaXRfdHlwZSk7CisJICBfX2hhc2ggPSBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19iLl9NX2ltcGwuX01fc3RhcnQuX01fcCwgX19jbGVuZ3RoKTsKKwl9CisKKyAgICAgIGNvbnN0IHNpemVfdCBfX2V4dHJhYml0cyA9IF9fYi5zaXplKCkgJSBfU193b3JkX2JpdDsKKyAgICAgIGlmIChfX2V4dHJhYml0cykKKwl7CisJICBfQml0X3R5cGUgX19oaXdvcmQgPSAqX19iLl9NX2ltcGwuX01fZmluaXNoLl9NX3A7CisJICBfX2hpd29yZCAmPSB+KCh+c3RhdGljX2Nhc3Q8X0JpdF90eXBlPigwKSkgPDwgX19leHRyYWJpdHMpOworCisJICBjb25zdCBzaXplX3QgX19jbGVuZ3RoCisJICAgID0gKF9fZXh0cmFiaXRzICsgX19DSEFSX0JJVF9fIC0gMSkgLyBfX0NIQVJfQklUX187CisJICBpZiAoX193b3JkcykKKwkgICAgX19oYXNoID0gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKCZfX2hpd29yZCwgX19jbGVuZ3RoLCBfX2hhc2gpOworCSAgZWxzZQorCSAgICBfX2hhc2ggPSBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goJl9faGl3b3JkLCBfX2NsZW5ndGgpOworCX0KKworICAgICAgcmV0dXJuIF9faGFzaDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgLyogX1ZFQ1RPUl9UQ0MgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0c2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9iaXRzZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NzFiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvYml0c2V0CkBAIC0wLDAgKzEsMTU3OCBAQAorLy8gPGJpdHNldD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorLy8gMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OAorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvYml0c2V0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0JJVFNFVAorI2RlZmluZSBfR0xJQkNYWF9CSVRTRVQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPiAgIC8vIEZvciBpbnZhbGlkX2FyZ3VtZW50LCBvdXRfb2ZfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJmbG93X2Vycm9yCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvY3h4YWJpX2ZvcmNlZC5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEICAoX19DSEFSX0JJVF9fICogX19TSVpFT0ZfTE9OR19fKQorI2RlZmluZSBfR0xJQkNYWF9CSVRTRVRfV09SRFMoX19uKSBcCisgICgoX19uKSAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEICsgXAorICAgKChfX24pICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQgPT0gMCA/IDAgOiAxKSkKKworI2RlZmluZSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfVUxMIChfX0NIQVJfQklUX18gKiBfX1NJWkVPRl9MT05HX0xPTkdfXykKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisKKyAgLyoqCisgICAqICBCYXNlIGNsYXNzLCBnZW5lcmFsIGNhc2UuICBJdCBpcyBhIGNsYXNzIGludmFyaWFudCB0aGF0IF9OdyB3aWxsIGJlCisgICAqICBub25uZWdhdGl2ZS4KKyAgICoKKyAgICogIFNlZSBkb2N1bWVudGF0aW9uIGZvciBiaXRzZXQuCisgICovCisgIHRlbXBsYXRlPHNpemVfdCBfTnc+CisgICAgc3RydWN0IF9CYXNlX2JpdHNldAorICAgIHsKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfV29yZFQ7CisKKyAgICAgIC8vLyAwIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB3b3JkLgorICAgICAgX1dvcmRUIAkJX01fd1tfTnddOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX0Jhc2VfYml0c2V0KCkKKyAgICAgIDogX01fdygpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0ZXhwciBfQmFzZV9iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICAgICAgOiBfTV93KHsgX1dvcmRUKF9fdmFsKQorI2lmIF9fU0laRU9GX0xPTkdfTE9OR19fID4gX19TSVpFT0ZfTE9OR19fCisJICAgICAgICwgX1dvcmRUKF9fdmFsID4+IF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEKQorI2VuZGlmCisgICAgICAgfSkgeyB9CisjZWxzZQorICAgICAgX0Jhc2VfYml0c2V0KHVuc2lnbmVkIGxvbmcgX192YWwpCisgICAgICA6IF9NX3coKQorICAgICAgeyBfTV93WzBdID0gX192YWw7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgX1Nfd2hpY2h3b3JkKHNpemVfdCBfX3BvcyApCisgICAgICB7IHJldHVybiBfX3BvcyAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJ5dGUoc2l6ZV90IF9fcG9zICkKKyAgICAgIHsgcmV0dXJuIChfX3BvcyAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEKSAvIF9fQ0hBUl9CSVRfXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgX1Nfd2hpY2hiaXQoc2l6ZV90IF9fcG9zICkKKyAgICAgIHsgcmV0dXJuIF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9TX21hc2tiaXQoc2l6ZV90IF9fcG9zICkKKyAgICAgIHsgcmV0dXJuIChzdGF0aWNfY2FzdDxfV29yZFQ+KDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7IH0KKworICAgICAgX1dvcmRUJgorICAgICAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpCisgICAgICB7IHJldHVybiBfTV93W19TX3doaWNod29yZChfX3BvcyldOyB9CisKKyAgICAgIF9Xb3JkVAorICAgICAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV93W19TX3doaWNod29yZChfX3BvcyldOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3QgX1dvcmRUKgorICAgICAgX01fZ2V0ZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV93OyB9CisjZW5kaWYKKworICAgICAgX1dvcmRUJgorICAgICAgX01faGl3b3JkKCkKKyAgICAgIHsgcmV0dXJuIF9NX3dbX053IC0gMV07IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX01faGl3b3JkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3dbX053IC0gMV07IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fYW5kKGNvbnN0IF9CYXNlX2JpdHNldDxfTnc+JiBfX3gpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9NX3dbX19pXSAmPSBfX3guX01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19vcihjb25zdCBfQmFzZV9iaXRzZXQ8X053PiYgX194KQorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdzsgX19pKyspCisJICBfTV93W19faV0gfD0gX194Ll9NX3dbX19pXTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9feG9yKGNvbnN0IF9CYXNlX2JpdHNldDxfTnc+JiBfX3gpCisgICAgICB7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9NX3dbX19pXSBePSBfX3guX01fd1tfX2ldOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19sZWZ0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KTsKKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpOworCisgICAgICB2b2lkCisgICAgICBfTV9kb19mbGlwKCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX01fd1tfX2ldID0gfl9NX3dbX19pXTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fc2V0KCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgX01fd1tfX2ldID0gfnN0YXRpY19jYXN0PF9Xb3JkVD4oMCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3Jlc2V0KCkKKyAgICAgIHsgX19idWlsdGluX21lbXNldChfTV93LCAwLCBfTncgKiBzaXplb2YoX1dvcmRUKSk7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfZXF1YWwoY29uc3QgX0Jhc2VfYml0c2V0PF9Odz4mIF9feCkgY29uc3QKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7ICsrX19pKQorCSAgaWYgKF9NX3dbX19pXSAhPSBfX3guX01fd1tfX2ldKQorCSAgICByZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIHNpemVfdAorICAgICAgX01fYXJlX2FsbF9hdXgoKSBjb25zdAorICAgICAgeworCWZvciAoc2l6ZV90IF9faSA9IDA7IF9faSA8IF9OdyAtIDE7IF9faSsrKQorCSAgaWYgKF9NX3dbX19pXSAhPSB+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKSkKKwkgICAgcmV0dXJuIDA7CisJcmV0dXJuICgoX053IC0gMSkgKiBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRAorCQkrIF9fYnVpbHRpbl9wb3Bjb3VudGwoX01faGl3b3JkKCkpKTsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfYW55KCkgY29uc3QKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfTnc7IF9faSsrKQorCSAgaWYgKF9NX3dbX19pXSAhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKQorCSAgICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHNpemVfdAorICAgICAgX01fZG9fY291bnQoKSBjb25zdAorICAgICAgeworCXNpemVfdCBfX3Jlc3VsdCA9IDA7CisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwkgIF9fcmVzdWx0ICs9IF9fYnVpbHRpbl9wb3Bjb3VudGwoX01fd1tfX2ldKTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHVuc2lnbmVkIGxvbmcKKyAgICAgIF9NX2RvX3RvX3Vsb25nKCkgY29uc3Q7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICBfTV9kb190b191bGxvbmcoKSBjb25zdDsKKyNlbmRpZgorCisgICAgICAvLyBmaW5kIGZpcnN0ICJvbiIgYml0CisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdDsKKworICAgICAgLy8gZmluZCB0aGUgbmV4dCAib24iIGJpdCB0aGF0IGZvbGxvd3MgInByZXYiCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfbmV4dChzaXplX3QgX19wcmV2LCBzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0OworICAgIH07CisKKyAgLy8gRGVmaW5pdGlvbnMgb2Ygbm9uLWlubGluZSBmdW5jdGlvbnMgZnJvbSBfQmFzZV9iaXRzZXQuCisgIHRlbXBsYXRlPHNpemVfdCBfTnc+CisgICAgdm9pZAorICAgIF9CYXNlX2JpdHNldDxfTnc+OjpfTV9kb19sZWZ0X3NoaWZ0KHNpemVfdCBfX3NoaWZ0KQorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fc2hpZnQgIT0gMCwgMSkpCisJeworCSAgY29uc3Qgc2l6ZV90IF9fd3NoaWZ0ID0gX19zaGlmdCAvIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOworCSAgY29uc3Qgc2l6ZV90IF9fb2Zmc2V0ID0gX19zaGlmdCAlIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JEOworCisJICBpZiAoX19vZmZzZXQgPT0gMCkKKwkgICAgZm9yIChzaXplX3QgX19uID0gX053IC0gMTsgX19uID49IF9fd3NoaWZ0OyAtLV9fbikKKwkgICAgICBfTV93W19fbl0gPSBfTV93W19fbiAtIF9fd3NoaWZ0XTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSAoX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQgCisJCQkJCSAgIC0gX19vZmZzZXQpOworCSAgICAgIGZvciAoc2l6ZV90IF9fbiA9IF9OdyAtIDE7IF9fbiA+IF9fd3NoaWZ0OyAtLV9fbikKKwkJX01fd1tfX25dID0gKChfTV93W19fbiAtIF9fd3NoaWZ0XSA8PCBfX29mZnNldCkKKwkJCSAgICAgfCAoX01fd1tfX24gLSBfX3dzaGlmdCAtIDFdID4+IF9fc3ViX29mZnNldCkpOworCSAgICAgIF9NX3dbX193c2hpZnRdID0gX01fd1swXSA8PCBfX29mZnNldDsKKwkgICAgfQorCisJICBzdGQ6OmZpbGwoX01fdyArIDAsIF9NX3cgKyBfX3dzaGlmdCwgc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHZvaWQKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90IF9fc2hpZnQpCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zaGlmdCAhPSAwLCAxKSkKKwl7CisJICBjb25zdCBzaXplX3QgX193c2hpZnQgPSBfX3NoaWZ0IC8gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7CisJICBjb25zdCBzaXplX3QgX19vZmZzZXQgPSBfX3NoaWZ0ICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7CisJICBjb25zdCBzaXplX3QgX19saW1pdCA9IF9OdyAtIF9fd3NoaWZ0IC0gMTsKKworCSAgaWYgKF9fb2Zmc2V0ID09IDApCisJICAgIGZvciAoc2l6ZV90IF9fbiA9IDA7IF9fbiA8PSBfX2xpbWl0OyArK19fbikKKwkgICAgICBfTV93W19fbl0gPSBfTV93W19fbiArIF9fd3NoaWZ0XTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0IHNpemVfdCBfX3N1Yl9vZmZzZXQgPSAoX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJCQkJICAgLSBfX29mZnNldCk7CisJICAgICAgZm9yIChzaXplX3QgX19uID0gMDsgX19uIDwgX19saW1pdDsgKytfX24pCisJCV9NX3dbX19uXSA9ICgoX01fd1tfX24gKyBfX3dzaGlmdF0gPj4gX19vZmZzZXQpCisJCQkgICAgIHwgKF9NX3dbX19uICsgX193c2hpZnQgKyAxXSA8PCBfX3N1Yl9vZmZzZXQpKTsKKwkgICAgICBfTV93W19fbGltaXRdID0gX01fd1tfTnctMV0gPj4gX19vZmZzZXQ7CisJICAgIH0KKwkgIAorCSAgc3RkOjpmaWxsKF9NX3cgKyBfX2xpbWl0ICsgMSwgX01fdyArIF9Odywgc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX053PgorICAgIHVuc2lnbmVkIGxvbmcKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fdG9fdWxvbmcoKSBjb25zdAorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDE7IF9faSA8IF9OdzsgKytfX2kpCisJaWYgKF9NX3dbX19pXSkKKwkgIF9fdGhyb3dfb3ZlcmZsb3dfZXJyb3IoX19OKCJfQmFzZV9iaXRzZXQ6Ol9NX2RvX3RvX3Vsb25nIikpOworICAgICAgcmV0dXJuIF9NX3dbMF07CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fdG9fdWxsb25nKCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBib29sIF9fZHcgPSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSA+IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faSA9IDEgKyBfX2R3OyBfX2kgPCBfTnc7ICsrX19pKQorCWlmIChfTV93W19faV0pCisJICBfX3Rocm93X292ZXJmbG93X2Vycm9yKF9fTigiX0Jhc2VfYml0c2V0OjpfTV9kb190b191bGxvbmciKSk7CisKKyAgICAgIGlmIChfX2R3KQorCXJldHVybiBfTV93WzBdICsgKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oX01fd1sxXSkKKwkJCSAgPDwgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpOworICAgICAgcmV0dXJuIF9NX3dbMF07CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICBzaXplX3QKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fZmluZF9maXJzdChzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0CisgICAgeworICAgICAgZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX053OyBfX2krKykKKwl7CisJICBfV29yZFQgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKwkgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiAoX19pICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJICAgICsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCX0KKyAgICAgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9Odz4KKyAgICBzaXplX3QKKyAgICBfQmFzZV9iaXRzZXQ8X053Pjo6X01fZG9fZmluZF9uZXh0KHNpemVfdCBfX3ByZXYsIHNpemVfdCBfX25vdF9mb3VuZCkgY29uc3QKKyAgICB7CisgICAgICAvLyBtYWtlIGJvdW5kIGluY2x1c2l2ZQorICAgICAgKytfX3ByZXY7CisKKyAgICAgIC8vIGNoZWNrIG91dCBvZiBib3VuZHMKKyAgICAgIGlmIChfX3ByZXYgPj0gX053ICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpCisJcmV0dXJuIF9fbm90X2ZvdW5kOworCisgICAgICAvLyBzZWFyY2ggZmlyc3Qgd29yZAorICAgICAgc2l6ZV90IF9faSA9IF9TX3doaWNod29yZChfX3ByZXYpOworICAgICAgX1dvcmRUIF9fdGhpc3dvcmQgPSBfTV93W19faV07CisKKyAgICAgIC8vIG1hc2sgb2ZmIGJpdHMgYmVsb3cgYm91bmQKKyAgICAgIF9fdGhpc3dvcmQgJj0gKH5zdGF0aWNfY2FzdDxfV29yZFQ+KDApKSA8PCBfU193aGljaGJpdChfX3ByZXYpOworCisgICAgICBpZiAoX190aGlzd29yZCAhPSBzdGF0aWNfY2FzdDxfV29yZFQ+KDApKQorCXJldHVybiAoX19pICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJKyBfX2J1aWx0aW5fY3R6bChfX3RoaXN3b3JkKSk7CisKKyAgICAgIC8vIGNoZWNrIHN1YnNlcXVlbnQgd29yZHMKKyAgICAgIF9faSsrOworICAgICAgZm9yICg7IF9faSA8IF9OdzsgX19pKyspCisJeworCSAgX190aGlzd29yZCA9IF9NX3dbX19pXTsKKwkgIGlmIChfX3RoaXN3b3JkICE9IHN0YXRpY19jYXN0PF9Xb3JkVD4oMCkpCisJICAgIHJldHVybiAoX19pICogX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQKKwkJICAgICsgX19idWlsdGluX2N0emwoX190aGlzd29yZCkpOworCX0KKyAgICAgIC8vIG5vdCBmb3VuZCwgc28gcmV0dXJuIGFuIGluZGljYXRpb24gb2YgZmFpbHVyZS4KKyAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICB9IC8vIGVuZCBfTV9kb19maW5kX25leHQKKworICAvKioKKyAgICogIEJhc2UgY2xhc3MsIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB3b3JkLgorICAgKgorICAgKiAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGJpdHNldC4KKyAgKi8KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfQmFzZV9iaXRzZXQ8MT4KKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworICAgICAgX1dvcmRUIF9NX3c7CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfQmFzZV9iaXRzZXQoKQorICAgICAgOiBfTV93KDApCisgICAgICB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBjb25zdGV4cHIgX0Jhc2VfYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyNlbHNlCisgICAgICBfQmFzZV9iaXRzZXQodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyNlbmRpZgorICAgICAgOiBfTV93KF9fdmFsKQorICAgICAgeyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaHdvcmQoc2l6ZV90IF9fcG9zICkKKyAgICAgIHsgcmV0dXJuIF9fcG9zIC8gX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYnl0ZShzaXplX3QgX19wb3MgKQorICAgICAgeyByZXR1cm4gKF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpIC8gX19DSEFSX0JJVF9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2l6ZV90CisgICAgICBfU193aGljaGJpdChzaXplX3QgX19wb3MgKQorICAgICAgeyAgcmV0dXJuIF9fcG9zICUgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQ7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9TX21hc2tiaXQoc2l6ZV90IF9fcG9zICkKKyAgICAgIHsgcmV0dXJuIChzdGF0aWNfY2FzdDxfV29yZFQ+KDEpKSA8PCBfU193aGljaGJpdChfX3Bvcyk7IH0KKworICAgICAgX1dvcmRUJgorICAgICAgX01fZ2V0d29yZChzaXplX3QpCisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyAgICAgIF9Xb3JkVAorICAgICAgX01fZ2V0d29yZChzaXplX3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3QgX1dvcmRUKgorICAgICAgX01fZ2V0ZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiAmX01fdzsgfQorI2VuZGlmCisKKyAgICAgIF9Xb3JkVCYKKyAgICAgIF9NX2hpd29yZCgpCisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2hpd29yZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV93OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2FuZChjb25zdCBfQmFzZV9iaXRzZXQ8MT4mIF9feCkKKyAgICAgIHsgX01fdyAmPSBfX3guX01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19vcihjb25zdCBfQmFzZV9iaXRzZXQ8MT4mIF9feCkKKyAgICAgIHsgX01fdyB8PSBfX3guX01fdzsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb194b3IoY29uc3QgX0Jhc2VfYml0c2V0PDE+JiBfX3gpCisgICAgICB7IF9NX3cgXj0gX194Ll9NX3c7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fbGVmdF9zaGlmdChzaXplX3QgX19zaGlmdCkKKyAgICAgIHsgX01fdyA8PD0gX19zaGlmdDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19yaWdodF9zaGlmdChzaXplX3QgX19zaGlmdCkKKyAgICAgIHsgX01fdyA+Pj0gX19zaGlmdDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19mbGlwKCkKKyAgICAgIHsgX01fdyA9IH5fTV93OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldCgpCisgICAgICB7IF9NX3cgPSB+c3RhdGljX2Nhc3Q8X1dvcmRUPigwKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kb19yZXNldCgpCisgICAgICB7IF9NX3cgPSAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2VxdWFsKGNvbnN0IF9CYXNlX2JpdHNldDwxPiYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdyA9PSBfX3guX01fdzsgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2FyZV9hbGxfYXV4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGwoX01fdyk7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfYW55KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3cgIT0gMDsgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudGwoX01fdyk7IH0KKworICAgICAgdW5zaWduZWQgbG9uZworICAgICAgX01fZG9fdG9fdWxvbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdzsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX01fZG9fdG9fdWxsb25nKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3c7IH0KKyNlbmRpZgorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90IF9fbm90X2ZvdW5kKSBjb25zdAorICAgICAgeworICAgICAgICBpZiAoX01fdyAhPSAwKQorICAgICAgICAgIHJldHVybiBfX2J1aWx0aW5fY3R6bChfTV93KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICAgIH0KKworICAgICAgLy8gZmluZCB0aGUgbmV4dCAib24iIGJpdCB0aGF0IGZvbGxvd3MgInByZXYiCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfbmV4dChzaXplX3QgX19wcmV2LCBzaXplX3QgX19ub3RfZm91bmQpIGNvbnN0CisgICAgICB7CisJKytfX3ByZXY7CisJaWYgKF9fcHJldiA+PSAoKHNpemVfdCkgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1dPUkQpKQorCSAgcmV0dXJuIF9fbm90X2ZvdW5kOworCisJX1dvcmRUIF9feCA9IF9NX3cgPj4gX19wcmV2OworCWlmIChfX3ggIT0gMCkKKwkgIHJldHVybiBfX2J1aWx0aW5fY3R6bChfX3gpICsgX19wcmV2OworCWVsc2UKKwkgIHJldHVybiBfX25vdF9mb3VuZDsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcywgc3BlY2lhbGl6YXRpb24gZm9yIG5vIHN0b3JhZ2UgKHplcm8tbGVuZ3RoICViaXRzZXQpLgorICAgKgorICAgKiAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGJpdHNldC4KKyAgKi8KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfQmFzZV9iaXRzZXQ8MD4KKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgX0Jhc2VfYml0c2V0KCkKKyAgICAgIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0ZXhwciBfQmFzZV9iaXRzZXQodW5zaWduZWQgbG9uZyBsb25nKQorI2Vsc2UKKyAgICAgIF9CYXNlX2JpdHNldCh1bnNpZ25lZCBsb25nKQorI2VuZGlmCisgICAgICB7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNod29yZChzaXplX3QgX19wb3MgKQorICAgICAgeyByZXR1cm4gX19wb3MgLyBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgX1Nfd2hpY2hieXRlKHNpemVfdCBfX3BvcyApCisgICAgICB7IHJldHVybiAoX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRCkgLyBfX0NIQVJfQklUX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaXplX3QKKyAgICAgIF9TX3doaWNoYml0KHNpemVfdCBfX3BvcyApCisgICAgICB7ICByZXR1cm4gX19wb3MgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9Xb3JkVAorICAgICAgX1NfbWFza2JpdChzaXplX3QgX19wb3MgKQorICAgICAgeyByZXR1cm4gKHN0YXRpY19jYXN0PF9Xb3JkVD4oMSkpIDw8IF9TX3doaWNoYml0KF9fcG9zKTsgfQorCisgICAgICAvLyBUaGlzIHdvdWxkIG5vcm1hbGx5IGdpdmUgYWNjZXNzIHRvIHRoZSBkYXRhLiAgVGhlIGJvdW5kcy1jaGVja2luZworICAgICAgLy8gaW4gdGhlIGJpdHNldCBjbGFzcyB3aWxsIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBnZXR0aW5nIHRoaXMgZmFyLAorICAgICAgLy8gYnV0ICgxKSBpdCBtdXN0IHN0aWxsIHJldHVybiBhbiBsdmFsdWUgdG8gY29tcGlsZSwgYW5kICgyKSB0aGUKKyAgICAgIC8vIHVzZXIgbWlnaHQgY2FsbCBfVW5jaGVja2VkX3NldCBkaXJlY3RseSwgaW4gd2hpY2ggY2FzZSB0aGlzIC9uZWVkcy8KKyAgICAgIC8vIHRvIGZhaWwuICBMZXQncyBub3QgcGVuYWxpemUgemVyby1sZW5ndGggdXNlcnMgdW5sZXNzIHRoZXkgYWN0dWFsbHkKKyAgICAgIC8vIG1ha2UgYW4gdW5jaGVja2VkIGNhbGw7IGFsbCB0aGUgbWVtb3J5IHVnbGluZXNzIGlzIHRoZXJlZm9yZQorICAgICAgLy8gbG9jYWxpemVkIHRvIHRoaXMgc2luZ2xlIHNob3VsZC1uZXZlci1nZXQtdGhpcy1mYXIgZnVuY3Rpb24uCisgICAgICBfV29yZFQmCisgICAgICBfTV9nZXR3b3JkKHNpemVfdCkKKyAgICAgIHsgCisJX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJfQmFzZV9iaXRzZXQ6Ol9NX2dldHdvcmQiKSk7IAorCXJldHVybiAqbmV3IF9Xb3JkVDsgCisgICAgICB9CisKKyAgICAgIF9Xb3JkVAorICAgICAgX01fZ2V0d29yZChzaXplX3QgX19wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBfV29yZFQKKyAgICAgIF9NX2hpd29yZCgpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2FuZChjb25zdCBfQmFzZV9iaXRzZXQ8MD4mKQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX29yKGNvbnN0IF9CYXNlX2JpdHNldDwwPiYpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9feG9yKGNvbnN0IF9CYXNlX2JpdHNldDwwPiYpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fbGVmdF9zaGlmdChzaXplX3QpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmlnaHRfc2hpZnQoc2l6ZV90KQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX2ZsaXAoKQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldCgpCisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fZG9fcmVzZXQoKQorICAgICAgeyB9CisKKyAgICAgIC8vIEFyZSBhbGwgZW1wdHkgYml0c2V0cyBlcXVhbCB0byBlYWNoIG90aGVyPyAgQXJlIHRoZXkgZXF1YWwgdG8KKyAgICAgIC8vIHRoZW1zZWx2ZXM/ICBIb3cgdG8gY29tcGFyZSBhIHRoaW5nIHdoaWNoIGhhcyBubyBzdGF0ZT8gIFdoYXQgaXMKKyAgICAgIC8vIHRoZSBzb3VuZCBvZiBvbmUgemVyby1sZW5ndGggYml0c2V0IGNsYXBwaW5nPworICAgICAgYm9vbAorICAgICAgX01faXNfZXF1YWwoY29uc3QgX0Jhc2VfYml0c2V0PDA+JikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgc2l6ZV90CisgICAgICBfTV9hcmVfYWxsX2F1eCgpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2FueSgpIGNvbnN0CisgICAgICB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgdW5zaWduZWQgbG9uZworICAgICAgX01fZG9fdG9fdWxvbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX01fZG9fdG9fdWxsb25nKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCisgICAgICAvLyBOb3JtYWxseSAibm90IGZvdW5kIiBpcyB0aGUgc2l6ZSwgYnV0IHRoYXQgY291bGQgYWxzbyBiZQorICAgICAgLy8gbWlzaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXggaW4gdGhpcyBjb3JuZXIgY2FzZS4gIE9oIHdlbGwuCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfZmlyc3Qoc2l6ZV90KSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICBzaXplX3QKKyAgICAgIF9NX2RvX2ZpbmRfbmV4dChzaXplX3QsIHNpemVfdCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH0KKyAgICB9OworCisKKyAgLy8gSGVscGVyIGNsYXNzIHRvIHplcm8gb3V0IHRoZSB1bnVzZWQgaGlnaC1vcmRlciBiaXRzIGluIHRoZSBoaWdoZXN0IHdvcmQuCisgIHRlbXBsYXRlPHNpemVfdCBfRXh0cmFiaXRzPgorICAgIHN0cnVjdCBfU2FuaXRpemUKKyAgICB7CisgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX1dvcmRUOworCisgICAgICBzdGF0aWMgdm9pZCAKKyAgICAgIF9TX2RvX3Nhbml0aXplKF9Xb3JkVCYgX192YWwpCisgICAgICB7IF9fdmFsICY9IH4oKH5zdGF0aWNfY2FzdDxfV29yZFQ+KDApKSA8PCBfRXh0cmFiaXRzKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfU2FuaXRpemU8MD4KKyAgICB7IAorICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKworICAgICAgc3RhdGljIHZvaWQgCisgICAgICBfU19kb19zYW5pdGl6ZShfV29yZFQpIHsgfSAKKyAgICB9OworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYiwgYm9vbCA9IF9OYiA8IF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9VTEw+CisgICAgc3RydWN0IF9TYW5pdGl6ZV92YWwKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX1NfZG9fc2FuaXRpemVfdmFsKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIF9fdmFsOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHN0cnVjdCBfU2FuaXRpemVfdmFsPF9OYiwgdHJ1ZT4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZworICAgICAgX1NfZG9fc2FuaXRpemVfdmFsKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgICAgIHsgcmV0dXJuIF9fdmFsICYgfigofnN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oMCkpIDw8IF9OYik7IH0KKyAgICB9OworI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSAlYml0c2V0IGNsYXNzIHJlcHJlc2VudHMgYSBAZSBmaXhlZC1zaXplIHNlcXVlbmNlIG9mIGJpdHMuCisgICAqCisgICAqICBAaW5ncm91cCBjb250YWluZXJzCisgICAqCisgICAqICAoTm90ZSB0aGF0ICViaXRzZXQgZG9lcyBAZSBub3QgbWVldCB0aGUgZm9ybWFsIHJlcXVpcmVtZW50cyBvZiBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NSI+Y29udGFpbmVyPC9hPi4gIE1haW5seSwgaXQgbGFja3MgaXRlcmF0b3JzLikKKyAgICoKKyAgICogIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCwgQGEgTmIsIG1heSBiZSBhbnkgbm9uLW5lZ2F0aXZlIG51bWJlciwKKyAgICogIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBiaXRzIChlLmcuLCAiMCIsICIxMiIsICIxMDI0KjEwMjQiKS4KKyAgICoKKyAgICogIEluIHRoZSBnZW5lcmFsIHVub3B0aW1pemVkIGNhc2UsIHN0b3JhZ2UgaXMgYWxsb2NhdGVkIGluIHdvcmQtc2l6ZWQKKyAgICogIGJsb2Nrcy4gIExldCBCIGJlIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIHdvcmQsIHRoZW4gKE5iKyhCLTEpKS9CCisgICAqICB3b3JkcyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JhZ2UuICBCIC0gTmIlQiBiaXRzIGFyZSB1bnVzZWQuICAoVGhleSBhcmUKKyAgICogIHRoZSBoaWdoLW9yZGVyIGJpdHMgaW4gdGhlIGhpZ2hlc3Qgd29yZC4pICBJdCBpcyBhIGNsYXNzIGludmFyaWFudAorICAgKiAgdGhhdCB0aG9zZSB1bnVzZWQgYml0cyBhcmUgYWx3YXlzIHplcm8uCisgICAqCisgICAqICBJZiB5b3UgdGhpbmsgb2YgJWJpdHNldCBhcyA8ZW0+YSBzaW1wbGUgYXJyYXkgb2YgYml0czwvZW0+LCBiZQorICAgKiAgYXdhcmUgdGhhdCB5b3VyIG1lbnRhbCBwaWN0dXJlIGlzIHJldmVyc2VkOiBhICViaXRzZXQgYmVoYXZlcworICAgKiAgdGhlIHNhbWUgd2F5IGFzIGJpdHMgaW4gaW50ZWdlcnMgZG8sIHdpdGggdGhlIGJpdCBhdCBpbmRleCAwIGluCisgICAqICB0aGUgPGVtPmxlYXN0IHNpZ25pZmljYW50IC8gcmlnaHQtaGFuZDwvZW0+IHBvc2l0aW9uLCBhbmQgdGhlIGJpdCBhdAorICAgKiAgaW5kZXggTmItMSBpbiB0aGUgPGVtPm1vc3Qgc2lnbmlmaWNhbnQgLyBsZWZ0LWhhbmQ8L2VtPiBwb3NpdGlvbi4KKyAgICogIFRodXMsIHVubGlrZSBvdGhlciBjb250YWluZXJzLCBhICViaXRzZXQncyBpbmRleCA8ZW0+Y291bnRzIGZyb20KKyAgICogIHJpZ2h0IHRvIGxlZnQ8L2VtPiwgdG8gcHV0IGl0IHZlcnkgbG9vc2VseS4KKyAgICoKKyAgICogIFRoaXMgYmVoYXZpb3IgaXMgcHJlc2VydmVkIHdoZW4gdHJhbnNsYXRpbmcgdG8gYW5kIGZyb20gc3RyaW5ncy4gIEZvcgorICAgKiAgZXhhbXBsZSwgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHByb2JhYmx5IHByaW50cworICAgKiAgPGVtPmIoJmFwb3M7YSZhcG9zOykgaXMgMDAwMTEwMDAwMTwvZW0+IG9uIGEgbW9kZXJuIEFTQ0lJIHN5c3RlbS4KKyAgICoKKyAgICogIEBjb2RlCisgICAqICAgICAjaW5jbHVkZSA8Yml0c2V0PgorICAgKiAgICAgI2luY2x1ZGUgPGlvc3RyZWFtPgorICAgKiAgICAgI2luY2x1ZGUgPHNzdHJlYW0+CisgICAqCisgICAqICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgKgorICAgKiAgICAgaW50IG1haW4oKQorICAgKiAgICAgeworICAgKiAgICAgICAgIGxvbmcgICAgICAgICBhID0gJ2EnOworICAgKiAgICAgICAgIGJpdHNldDwxMD4gICBiKGEpOworICAgKgorICAgKiAgICAgICAgIGNvdXQgPDwgImIoJ2EnKSBpcyAiIDw8IGIgPDwgZW5kbDsKKyAgICoKKyAgICogICAgICAgICBvc3RyaW5nc3RyZWFtIHM7CisgICAqICAgICAgICAgcyA8PCBiOworICAgKiAgICAgICAgIHN0cmluZyAgc3RyID0gcy5zdHIoKTsKKyAgICogICAgICAgICBjb3V0IDw8ICJpbmRleCAzIGluIHRoZSBzdHJpbmcgaXMgIiA8PCBzdHJbM10gPDwgIiBidXRcbiIKKyAgICogICAgICAgICAgICAgIDw8ICJpbmRleCAzIGluIHRoZSBiaXRzZXQgaXMgIiA8PCBiWzNdIDw8IGVuZGw7CisgICAqICAgICB9CisgICAqICBAZW5kY29kZQorICAgKgorICAgKiAgQWxzbyBzZWU6CisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDEyY2gzM3MwMi5odG1sCisgICAqICBmb3IgYSBkZXNjcmlwdGlvbiBvZiBleHRlbnNpb25zLgorICAgKgorICAgKiAgTW9zdCBvZiB0aGUgYWN0dWFsIGNvZGUgaXNuJ3QgY29udGFpbmVkIGluICViaXRzZXQ8PiBpdHNlbGYsIGJ1dCBpbiB0aGUKKyAgICogIGJhc2UgY2xhc3MgX0Jhc2VfYml0c2V0LiAgVGhlIGJhc2UgY2xhc3Mgd29ya3Mgd2l0aCB3aG9sZSB3b3Jkcywgbm90IHdpdGgKKyAgICogIGluZGl2aWR1YWwgYml0cy4gIFRoaXMgYWxsb3dzIHVzIHRvIHNwZWNpYWxpemUgX0Jhc2VfYml0c2V0IGZvciB0aGUKKyAgICogIGltcG9ydGFudCBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlICViaXRzZXQgaXMgb25seSBhIHNpbmdsZSB3b3JkLgorICAgKgorICAgKiAgRXh0cmEgY29uZnVzaW9uIGNhbiByZXN1bHQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHN0b3JhZ2UgZm9yCisgICAqICBfQmFzZV9iaXRzZXQgQGUgaXMgYSByZWd1bGFyIGFycmF5LCBhbmQgaXMgaW5kZXhlZCBhcyBzdWNoLiAgVGhpcyBpcworICAgKiAgY2FyZWZ1bGx5IGVuY2Fwc3VsYXRlZC4KKyAgKi8KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBjbGFzcyBiaXRzZXQKKyAgICA6IHByaXZhdGUgX0Jhc2VfYml0c2V0PF9HTElCQ1hYX0JJVFNFVF9XT1JEUyhfTmIpPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfQmFzZV9iaXRzZXQ8X0dMSUJDWFhfQklUU0VUX1dPUkRTKF9OYik+IF9CYXNlOworICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9Xb3JkVDsKKworICAgICAgdm9pZAorICAgICAgX01fZG9fc2FuaXRpemUoKQorICAgICAgeyAKKwl0eXBlZGVmIF9TYW5pdGl6ZTxfTmIgJSBfR0xJQkNYWF9CSVRTRVRfQklUU19QRVJfV09SRD4gX19zYW5pdGl6ZV90eXBlOworCV9fc2FuaXRpemVfdHlwZTo6X1NfZG9fc2FuaXRpemUodGhpcy0+X01faGl3b3JkKCkpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgaGFzaDsKKyNlbmRpZgorCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgVGhpcyBlbmNhcHN1bGF0ZXMgdGhlIGNvbmNlcHQgb2YgYSBzaW5nbGUgYml0LiAgQW4gaW5zdGFuY2Ugb2YgdGhpcworICAgICAgICogIGNsYXNzIGlzIGEgcHJveHkgZm9yIGFuIGFjdHVhbCBiaXQ7IHRoaXMgd2F5IHRoZSBpbmRpdmlkdWFsIGJpdAorICAgICAgICogIG9wZXJhdGlvbnMgYXJlIGRvbmUgYXMgZmFzdGVyIHdvcmQtc2l6ZSBiaXR3aXNlIGluc3RydWN0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgTW9zdCB1c2VycyB3aWxsIG5ldmVyIG5lZWQgdG8gdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGNvbnZlcnNpb25zCisgICAgICAgKiAgdG8gYW5kIGZyb20gYm9vbCBhcmUgYXV0b21hdGljIGFuZCBzaG91bGQgYmUgdHJhbnNwYXJlbnQuICBPdmVybG9hZGVkCisgICAgICAgKiAgb3BlcmF0b3JzIGhlbHAgdG8gcHJlc2VydmUgdGhlIGlsbHVzaW9uLgorICAgICAgICoKKyAgICAgICAqICAoT24gYSB0eXBpY2FsIHN5c3RlbSwgdGhpcyA8ZW0+Yml0ICVyZWZlcmVuY2U8L2VtPiBpcyA2NAorICAgICAgICogIHRpbWVzIHRoZSBzaXplIG9mIGFuIGFjdHVhbCBiaXQuICBIYS4pCisgICAgICAgKi8KKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgeworCWZyaWVuZCBjbGFzcyBiaXRzZXQ7CisKKwlfV29yZFQqCV9NX3dwOworCXNpemVfdCAJX01fYnBvczsKKwkKKwkvLyBsZWZ0IHVuZGVmaW5lZAorCXJlZmVyZW5jZSgpOworCQorICAgICAgcHVibGljOgorCXJlZmVyZW5jZShiaXRzZXQmIF9fYiwgc2l6ZV90IF9fcG9zKQorCXsKKwkgIF9NX3dwID0gJl9fYi5fTV9nZXR3b3JkKF9fcG9zKTsKKwkgIF9NX2Jwb3MgPSBfQmFzZTo6X1Nfd2hpY2hiaXQoX19wb3MpOworCX0KKworCX5yZWZlcmVuY2UoKQorCXsgfQorCisJLy8gRm9yIGJbaV0gPSBfX3g7CisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShib29sIF9feCkKKwl7CisJICBpZiAoX194KQorCSAgICAqX01fd3AgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICBlbHNlCisJICAgICpfTV93cCAmPSB+X0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJLy8gRm9yIGJbaV0gPSBiW19fal07CisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShjb25zdCByZWZlcmVuY2UmIF9faikKKwl7CisJICBpZiAoKCooX19qLl9NX3dwKSAmIF9CYXNlOjpfU19tYXNrYml0KF9fai5fTV9icG9zKSkpCisJICAgICpfTV93cCB8PSBfQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKwkgIGVsc2UKKwkgICAgKl9NX3dwICY9IH5fQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwkvLyBGbGlwcyB0aGUgYml0CisJYm9vbAorCW9wZXJhdG9yfigpIGNvbnN0CisJeyByZXR1cm4gKCooX01fd3ApICYgX0Jhc2U6Ol9TX21hc2tiaXQoX01fYnBvcykpID09IDA7IH0KKworCS8vIEZvciBfX3ggPSBiW2ldOworCW9wZXJhdG9yIGJvb2woKSBjb25zdAorCXsgcmV0dXJuICgqKF9NX3dwKSAmIF9CYXNlOjpfU19tYXNrYml0KF9NX2Jwb3MpKSAhPSAwOyB9CisKKwkvLyBGb3IgYltpXS5mbGlwKCk7CisJcmVmZXJlbmNlJgorCWZsaXAoKQorCXsKKwkgICpfTV93cCBePSBfQmFzZTo6X1NfbWFza2JpdChfTV9icG9zKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgICB9OworICAgICAgZnJpZW5kIGNsYXNzIHJlZmVyZW5jZTsKKworICAgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgICAgLy8vIEFsbCBiaXRzIHNldCB0byB6ZXJvLgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJpdHNldCgpCisgICAgICB7IH0KKworICAgICAgLy8vIEluaXRpYWwgYml0cyBiaXR3aXNlLWNvcGllZCBmcm9tIGEgc2luZ2xlIHdvcmQgKG90aGVycyBzZXQgdG8gemVybykuCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0ZXhwciBiaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICAgICAgOiBfQmFzZShfU2FuaXRpemVfdmFsPF9OYj46Ol9TX2RvX3Nhbml0aXplX3ZhbChfX3ZhbCkpIHsgfQorI2Vsc2UKKyAgICAgIGJpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKQorICAgICAgOiBfQmFzZShfX3ZhbCkKKyAgICAgIHsgX01fZG9fc2FuaXRpemUoKTsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVXNlIGEgc3Vic2V0IG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgcyAgQSBzdHJpbmcgb2YgQGEgMCBhbmQgQGEgMSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gQGEgcyB0byB1c2U7CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gemVyby4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBwb3MgaXMgYmlnZ2VyIHRoZSBzaXplIG9mIEBhIHMuCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmludmFsaWRfYXJndW1lbnQgIElmIGEgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHN0cmluZworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBuZWl0aGVyIEBhIDAgbm9yIEBhIDEuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCWV4cGxpY2l0CisJYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLAorCSAgICAgICBzaXplX3QgX19wb3NpdGlvbiA9IDApCisJOiBfQmFzZSgpCisJeworCSAgaWYgKF9fcG9zaXRpb24gPiBfX3Muc2l6ZSgpKQorCSAgICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6Yml0c2V0IGluaXRpYWwgcG9zaXRpb24gIgorCQkJCSAgICAgIm5vdCB2YWxpZCIpKTsKKwkgIF9NX2NvcHlfZnJvbV9zdHJpbmcoX19zLCBfX3Bvc2l0aW9uLAorCQkJICAgICAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zLAorCQkJICAgICAgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVXNlIGEgc3Vic2V0IG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgcyAgQSBzdHJpbmcgb2YgQGEgMCBhbmQgQGEgMSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIEluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gQGEgcyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICBuICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb3B5LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgQGEgcy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6aW52YWxpZF9hcmd1bWVudCAgSWYgYSBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgc3RyaW5nCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5laXRoZXIgQGEgMCBub3IgQGEgMS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zLAorCSAgICAgICBzaXplX3QgX19wb3NpdGlvbiwgc2l6ZV90IF9fbikKKwk6IF9CYXNlKCkKKwl7CisJICBpZiAoX19wb3NpdGlvbiA+IF9fcy5zaXplKCkpCisJICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpiaXRzZXQgaW5pdGlhbCBwb3NpdGlvbiAiCisJCQkJICAgICAibm90IHZhbGlkIikpOworCSAgX01fY29weV9mcm9tX3N0cmluZyhfX3MsIF9fcG9zaXRpb24sIF9fbiwgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwliaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsCisJICAgICAgIHNpemVfdCBfX3Bvc2l0aW9uLCBzaXplX3QgX19uLAorCSAgICAgICBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKCkKKwl7CisJICBpZiAoX19wb3NpdGlvbiA+IF9fcy5zaXplKCkpCisJICAgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpiaXRzZXQgaW5pdGlhbCBwb3NpdGlvbiAiCisJCQkJICAgICAibm90IHZhbGlkIikpOworCSAgX01fY29weV9mcm9tX3N0cmluZyhfX3MsIF9fcG9zaXRpb24sIF9fbiwgX196ZXJvLCBfX29uZSk7CisJfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGZyb20gYSBjaGFyYWN0ZXIgJWFycmF5LgorICAgICAgICogIEBwYXJhbSAgc3RyICBBbiAlYXJyYXkgb2YgY2hhcmFjdGVycyBAYSB6ZXJvIGFuZCBAYSBvbmUuCisgICAgICAgKiAgQHBhcmFtICBuICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtICB6ZXJvIFRoZSBjaGFyYWN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgMC4KKyAgICAgICAqICBAcGFyYW0gIG9uZSAgVGhlIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSAxLgorICAgICAgICogIEB0aHJvdyAgc3RkOjppbnZhbGlkX2FyZ3VtZW50ICBJZiBhIGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSBzdHJpbmcKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbmVpdGhlciBAYSB6ZXJvIG5vciBAYSBvbmUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYml0c2V0KGNvbnN0IF9DaGFyVCogX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46OnNpemVfdHlwZSBfX24KKwkgICAgICAgPSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpucG9zLAorCSAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorICAgICAgICA6IF9CYXNlKCkKKyAgICAgICAgeworCSAgaWYgKCFfX3N0cikKKwkgICAgX190aHJvd19sb2dpY19lcnJvcihfX04oImJpdHNldDo6Yml0c2V0KGNvbnN0IF9DaGFyVCosIC4uLikiKSk7CisKKwkgIGlmIChfX24gPT0gc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPjo6bnBvcykKKwkgICAgX19uID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+OjpsZW5ndGgoX19zdHIpOworCSAgX01fY29weV9mcm9tX3B0cjxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPj4oX19zdHIsIF9fbiwgMCwKKwkJCQkJCQkgICAgIF9fbiwgX196ZXJvLAorCQkJCQkJCSAgICAgX19vbmUpOworCX0KKyNlbmRpZgorCisgICAgICAvLyAyMy4zLjUuMiBiaXRzZXQgb3BlcmF0aW9uczoKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlcmF0aW9ucyBvbiBiaXRzZXRzLgorICAgICAgICogIEBwYXJhbSAgcmhzICBBIHNhbWUtc2l6ZWQgYml0c2V0LgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBzaG91bGQgYmUgc2VsZi1leHBsYW5hdG9yeS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvciY9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19hbmQoX19yaHMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcnw9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykKKyAgICAgIHsKKwl0aGlzLT5fTV9kb19vcihfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yXj0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKQorICAgICAgeworCXRoaXMtPl9NX2RvX3hvcihfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZXJhdGlvbnMgb24gYml0c2V0cy4KKyAgICAgICAqICBAcGFyYW0gIHBvc2l0aW9uICBUaGUgbnVtYmVyIG9mIHBsYWNlcyB0byBzaGlmdC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2Ugc2hvdWxkIGJlIHNlbGYtZXhwbGFuYXRvcnkuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I8PD0oc2l6ZV90IF9fcG9zaXRpb24pCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19wb3NpdGlvbiA8IF9OYiwgMSkpCisJICB7CisJICAgIHRoaXMtPl9NX2RvX2xlZnRfc2hpZnQoX19wb3NpdGlvbik7CisJICAgIHRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJICB9CisJZWxzZQorCSAgdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I+Pj0oc2l6ZV90IF9fcG9zaXRpb24pCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19wb3NpdGlvbiA8IF9OYiwgMSkpCisJICB7CisJICAgIHRoaXMtPl9NX2RvX3JpZ2h0X3NoaWZ0KF9fcG9zaXRpb24pOworCSAgICB0aGlzLT5fTV9kb19zYW5pdGl6ZSgpOworCSAgfQorCWVsc2UKKwkgIHRoaXMtPl9NX2RvX3Jlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBUaGVzZSB2ZXJzaW9ucyBvZiBzaW5nbGUtYml0IHNldCwgcmVzZXQsIGZsaXAsIGFuZCB0ZXN0IGFyZQorICAgICAgICogIGV4dGVuc2lvbnMgZnJvbSB0aGUgU0dJIHZlcnNpb24uICBUaGV5IGRvIG5vIHJhbmdlIGNoZWNraW5nLgorICAgICAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBfVW5jaGVja2VkX3NldChzaXplX3QgX19wb3MpCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgfD0gX0Jhc2U6Ol9TX21hc2tiaXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBfVW5jaGVja2VkX3NldChzaXplX3QgX19wb3MsIGludCBfX3ZhbCkKKyAgICAgIHsKKwlpZiAoX192YWwpCisJICB0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSB8PSBfQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJZWxzZQorCSAgdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgX1VuY2hlY2tlZF9yZXNldChzaXplX3QgX19wb3MpCisgICAgICB7CisJdGhpcy0+X01fZ2V0d29yZChfX3BvcykgJj0gfl9CYXNlOjpfU19tYXNrYml0KF9fcG9zKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgX1VuY2hlY2tlZF9mbGlwKHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwl0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSBePSBfQmFzZTo6X1NfbWFza2JpdChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBib29sCisgICAgICBfVW5jaGVja2VkX3Rlc3Qoc2l6ZV90IF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gKCh0aGlzLT5fTV9nZXR3b3JkKF9fcG9zKSAmIF9CYXNlOjpfU19tYXNrYml0KF9fcG9zKSkKKwkJIT0gc3RhdGljX2Nhc3Q8X1dvcmRUPigwKSk7IH0KKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLy8gU2V0LCByZXNldCwgYW5kIGZsaXAuCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU2V0cyBldmVyeSBiaXQgdG8gdHJ1ZS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBzZXQoKQorICAgICAgeworCXRoaXMtPl9NX2RvX3NldCgpOworCXRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU2V0cyBhIGdpdmVuIGJpdCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHBhcmFtICB2YWwgIEVpdGhlciB0cnVlIG9yIGZhbHNlLCBkZWZhdWx0cyB0byB0cnVlLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KHNpemVfdCBfX3Bvc2l0aW9uLCBib29sIF9fdmFsID0gdHJ1ZSkKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA+PSBfTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6c2V0IikpOworCXJldHVybiBfVW5jaGVja2VkX3NldChfX3Bvc2l0aW9uLCBfX3ZhbCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGV2ZXJ5IGJpdCB0byBmYWxzZS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICByZXNldCgpCisgICAgICB7CisJdGhpcy0+X01fZG9fcmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBTZXRzIGEgZ2l2ZW4gYml0IHRvIGZhbHNlLgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIFRoZSBpbmRleCBvZiB0aGUgYml0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKgorICAgICAgICogIFNhbWUgYXMgd3JpdGluZyBAYyBzZXQocG9zLGZhbHNlKS4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICByZXNldChzaXplX3QgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA+PSBfTmIpCisJICBfX3Rocm93X291dF9vZl9yYW5nZShfX04oImJpdHNldDo6cmVzZXQiKSk7CisJcmV0dXJuIF9VbmNoZWNrZWRfcmVzZXQoX19wb3NpdGlvbik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUb2dnbGVzIGV2ZXJ5IGJpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUuCisgICAgICAgKi8KKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgZmxpcCgpCisgICAgICB7CisJdGhpcy0+X01fZG9fZmxpcCgpOworCXRoaXMtPl9NX2RvX3Nhbml0aXplKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVG9nZ2xlcyBhIGdpdmVuIGJpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgVGhlIGluZGV4IG9mIHRoZSBiaXQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgcG9zIGlzIGJpZ2dlciB0aGUgc2l6ZSBvZiB0aGUgJXNldC4KKyAgICAgICAqLworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKHNpemVfdCBfX3Bvc2l0aW9uKQorICAgICAgeworCWlmIChfX3Bvc2l0aW9uID49IF9OYikKKwkgIF9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYml0c2V0OjpmbGlwIikpOworCXJldHVybiBfVW5jaGVja2VkX2ZsaXAoX19wb3NpdGlvbik7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vLyBTZWUgdGhlIG5vLWFyZ3VtZW50IGZsaXAoKS4KKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcn4oKSBjb25zdAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oKnRoaXMpLmZsaXAoKTsgfQorCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFycmF5LWluZGV4aW5nIHN1cHBvcnQuCisgICAgICAgKiAgQHBhcmFtICBwb3NpdGlvbiAgSW5kZXggaW50byB0aGUgJWJpdHNldC4KKyAgICAgICAqICBAcmV0dXJuIEEgYm9vbCBmb3IgYSA8ZW0+Y29uc3QgJWJpdHNldDwvZW0+LiAgRm9yIG5vbi1jb25zdAorICAgICAgICogICAgICAgICAgIGJpdHNldHMsIGFuIGluc3RhbmNlIG9mIHRoZSByZWZlcmVuY2UgcHJveHkgY2xhc3MuCisgICAgICAgKiAgQG5vdGUgIFRoZXNlIG9wZXJhdG9ycyBkbyBubyByYW5nZSBjaGVja2luZyBhbmQgdGhyb3cgbm8gZXhjZXB0aW9ucywKKyAgICAgICAqICAgICAgICAgYXMgcmVxdWlyZWQgYnkgRFIgMTEgdG8gdGhlIHN0YW5kYXJkLgorICAgICAgICoKKyAgICAgICAqICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGFscmVhZHkKKyAgICAgICAqICByZXNvbHZlcyBEUiAxMSAoaXRlbXMgMSBhbmQgMiksIGJ1dCBkb2VzIG5vdCBkbyB0aGUgcmFuZ2UtY2hlY2tpbmcKKyAgICAgICAqICByZXF1aXJlZCBieSB0aGF0IERSJ3MgcmVzb2x1dGlvbi4gIC1wbWUKKyAgICAgICAqICBUaGUgRFIgaGFzIHNpbmNlIGJlZW4gY2hhbmdlZDogIHJhbmdlLWNoZWNraW5nIGlzIGEgcHJlY29uZGl0aW9uCisgICAgICAgKiAgKHVzZXJzJyByZXNwb25zaWJpbGl0eSksIGFuZCB0aGVzZSBmdW5jdGlvbnMgbXVzdCBub3QgdGhyb3cuICAtcG1lCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcywgX19wb3NpdGlvbik7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3NpdGlvbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9VbmNoZWNrZWRfdGVzdChfX3Bvc2l0aW9uKTsgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmV0dXJucyBhIG51bWVyaWNhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJWJpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgaW50ZWdyYWwgZXF1aXZhbGVudCBvZiB0aGUgYml0cy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3ZlcmZsb3dfZXJyb3IgIElmIHRoZXJlIGFyZSB0b28gbWFueSBiaXRzIHRvIGJlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRlZCBpbiBhbiBAYyB1bnNpZ25lZCBAYyBsb25nLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nCisgICAgICB0b191bG9uZygpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kb190b191bG9uZygpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdW5zaWduZWQgbG9uZyBsb25nCisgICAgICB0b191bGxvbmcoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fdG9fdWxsb25nKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgUmV0dXJucyBhIGNoYXJhY3RlciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJWJpdHNldC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgc3RyaW5nIGVxdWl2YWxlbnQgb2YgdGhlIGJpdHMuCisgICAgICAgKgorICAgICAgICogIE5vdGUgdGhlIG9yZGVyaW5nIG9mIHRoZSBiaXRzOiAgZGVjcmVhc2luZyBjaGFyYWN0ZXIgcG9zaXRpb25zCisgICAgICAgKiAgY29ycmVzcG9uZCB0byBpbmNyZWFzaW5nIGJpdCBwb3NpdGlvbnMgKHNlZSB0aGUgbWFpbiBjbGFzcyBub3RlcyBmb3IKKyAgICAgICAqICBhbiBleGFtcGxlKS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+CisJdG9fc3RyaW5nKCkgY29uc3QKKwl7CisJICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gX19yZXN1bHQ7CisJICBfTV9jb3B5X3RvX3N0cmluZyhfX3Jlc3VsdCwgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IF9fcmVzdWx0OworCSAgX01fY29weV90b19zdHJpbmcoX19yZXN1bHQsIF9femVybywgX19vbmUpOworCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM0LiBiaXRzZXQ6OnRvX3N0cmluZygpIGhhcmQgdG8gdXNlLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKCkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4NTMuIHRvX3N0cmluZyBuZWVkcyB1cGRhdGluZyB3aXRoIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZygpIGNvbnN0CisJeworCSAgcmV0dXJuIHRvX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisJc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisJdG9fc3RyaW5nKF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKSBjb25zdAorCXsKKwkgIHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPihfX3plcm8sIF9fb25lKTsKKwl9CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRvX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LAorCSAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPigpOworICAgICAgfQorCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgICB0b19zdHJpbmcoY2hhciBfX3plcm8sIGNoYXIgX19vbmUgPSAnMScpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRvX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LAorCSAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPihfX3plcm8sIF9fb25lKTsKKyAgICAgIH0KKworICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3Igc3RyaW5nIG9wZXJhdGlvbnMuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fY29weV9mcm9tX3B0cihjb25zdCBfQ2hhclQqLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90LAorCQkJIF9DaGFyVCwgX0NoYXJUKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJdm9pZAorCV9NX2NvcHlfZnJvbV9zdHJpbmcoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULAorCQkJICAgIF9UcmFpdHMsIF9BbGxvYz4mIF9fcywgc2l6ZV90IF9fcG9zLCBzaXplX3QgX19uLAorCQkJICAgIF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSkKKwl7IF9NX2NvcHlfZnJvbV9wdHI8X0NoYXJULCBfVHJhaXRzPihfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpLCBfX3BvcywgX19uLAorCQkJCQkgICAgX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJdm9pZAorICAgICAgICBfTV9jb3B5X3RvX3N0cmluZyhzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mLAorCQkJICBfQ2hhclQsIF9DaGFyVCkgY29uc3Q7CisKKyAgICAgIC8vIE5COiBCYWNrd2FyZCBjb21wYXQuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwl2b2lkCisJX01fY29weV9mcm9tX3N0cmluZyhjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsCisJCQkgICAgX1RyYWl0cywgX0FsbG9jPiYgX19zLCBzaXplX3QgX19wb3MsIHNpemVfdCBfX24pCisJeyBfTV9jb3B5X2Zyb21fc3RyaW5nKF9fcywgX19wb3MsIF9fbiwgX0NoYXJUKCcwJyksIF9DaGFyVCgnMScpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwl2b2lkCisgICAgICAgIF9NX2NvcHlfdG9fc3RyaW5nKHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cyxfQWxsb2M+JiBfX3MpIGNvbnN0CisJeyBfTV9jb3B5X3RvX3N0cmluZyhfX3MsIF9DaGFyVCgnMCcpLCBfQ2hhclQoJzEnKSk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIGFyZSBzZXQuCisgICAgICBzaXplX3QKKyAgICAgIGNvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2RvX2NvdW50KCk7IH0KKworICAgICAgLy8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzLgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIHNpemVfdAorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTmI7IH0KKworICAgICAgLy9AeworICAgICAgLy8vIFRoZXNlIGNvbXBhcmlzb25zIGZvciBlcXVhbGl0eS9pbmVxdWFsaXR5IGFyZSwgd2VsbCwgQGUgYml0d2lzZS4KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01faXNfZXF1YWwoX19yaHMpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX2lzX2VxdWFsKF9fcmhzKTsgfQorICAgICAgLy9AfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgVGVzdHMgdGhlIHZhbHVlIG9mIGEgYml0LgorICAgICAgICogIEBwYXJhbSAgcG9zaXRpb24gIFRoZSBpbmRleCBvZiBhIGJpdC4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgdmFsdWUgYXQgQGEgcG9zLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIHBvcyBpcyBiaWdnZXIgdGhlIHNpemUgb2YgdGhlICVzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIHRlc3Qoc2l6ZV90IF9fcG9zaXRpb24pIGNvbnN0CisgICAgICB7CisJaWYgKF9fcG9zaXRpb24gPj0gX05iKQorCSAgX190aHJvd19vdXRfb2ZfcmFuZ2UoX19OKCJiaXRzZXQ6OnRlc3QiKSk7CisJcmV0dXJuIF9VbmNoZWNrZWRfdGVzdChfX3Bvc2l0aW9uKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgNjkzLiBzdGQ6OmJpdHNldDo6YWxsKCkgbWlzc2luZy4KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB3aGV0aGVyIGFsbCB0aGUgYml0cyBhcmUgb24uCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBhbGwgdGhlIGJpdHMgYXJlIHNldC4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgYWxsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2FyZV9hbGxfYXV4KCkgPT0gX05iOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB3aGV0aGVyIGFueSBvZiB0aGUgYml0cyBhcmUgb24uCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgYml0IGlzIHNldC4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgYW55KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2lzX2FueSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBUZXN0cyB3aGV0aGVyIGFueSBvZiB0aGUgYml0cyBhcmUgb24uCisgICAgICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBub25lIG9mIHRoZSBiaXRzIGFyZSBzZXQuCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG5vbmUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX2lzX2FueSgpOyB9CisKKyAgICAgIC8vQHsKKyAgICAgIC8vLyBTZWxmLWV4cGxhbmF0b3J5LgorICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yPDwoc2l6ZV90IF9fcG9zaXRpb24pIGNvbnN0CisgICAgICB7IHJldHVybiBiaXRzZXQ8X05iPigqdGhpcykgPDw9IF9fcG9zaXRpb247IH0KKworICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yPj4oc2l6ZV90IF9fcG9zaXRpb24pIGNvbnN0CisgICAgICB7IHJldHVybiBiaXRzZXQ8X05iPigqdGhpcykgPj49IF9fcG9zaXRpb247IH0KKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0ICJvbiIgYml0LgorICAgICAgICogIEByZXR1cm4gIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYml0IHNldCwgb3Igc2l6ZSgpIGlmIG5vdCBmb3VuZC4KKyAgICAgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAgICAgKiAgQHNhICBfRmluZF9uZXh0CisgICAgICAgKi8KKyAgICAgIHNpemVfdAorICAgICAgX0ZpbmRfZmlyc3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fZmluZF9maXJzdChfTmIpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZHMgdGhlIGluZGV4IG9mIHRoZSBuZXh0ICJvbiIgYml0IGFmdGVyIHByZXYuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGluZGV4IG9mIHRoZSBuZXh0IGJpdCBzZXQsIG9yIHNpemUoKSBpZiBub3QgZm91bmQuCisgICAgICAgKiAgQHBhcmFtICBwcmV2ICBXaGVyZSB0byBzdGFydCBzZWFyY2hpbmcuCisgICAgICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgICAgICogIEBzYSAgX0ZpbmRfZmlyc3QKKyAgICAgICAqLworICAgICAgc2l6ZV90CisgICAgICBfRmluZF9uZXh0KHNpemVfdCBfX3ByZXYgKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fZG9fZmluZF9uZXh0KF9fcHJldiwgX05iKTsgfQorICAgIH07CisKKyAgLy8gRGVmaW5pdGlvbnMgb2Ygbm9uLWlubGluZSBtZW1iZXIgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICAgIHZvaWQKKyAgICAgIGJpdHNldDxfTmI+OjoKKyAgICAgIF9NX2NvcHlfZnJvbV9wdHIoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdCBfX2xlbiwKKwkJICAgICAgIHNpemVfdCBfX3Bvcywgc2l6ZV90IF9fbiwgX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lKQorICAgICAgeworCXJlc2V0KCk7CisJY29uc3Qgc2l6ZV90IF9fbmJpdHMgPSBzdGQ6Om1pbihfTmIsIHN0ZDo6bWluKF9fbiwgX19sZW4gLSBfX3BvcykpOworCWZvciAoc2l6ZV90IF9faSA9IF9fbmJpdHM7IF9faSA+IDA7IC0tX19pKQorCSAgeworCSAgICBjb25zdCBfQ2hhclQgX19jID0gX19zW19fcG9zICsgX19uYml0cyAtIF9faV07CisJICAgIGlmIChfVHJhaXRzOjplcShfX2MsIF9femVybykpCisJICAgICAgOworCSAgICBlbHNlIGlmIChfVHJhaXRzOjplcShfX2MsIF9fb25lKSkKKwkgICAgICBfVW5jaGVja2VkX3NldChfX2kgLSAxKTsKKwkgICAgZWxzZQorCSAgICAgIF9fdGhyb3dfaW52YWxpZF9hcmd1bWVudChfX04oImJpdHNldDo6X01fY29weV9mcm9tX3B0ciIpKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorICAgICAgdm9pZAorICAgICAgYml0c2V0PF9OYj46OgorICAgICAgX01fY29weV90b19zdHJpbmcoc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3MsCisJCQlfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUpIGNvbnN0CisgICAgICB7CisJX19zLmFzc2lnbihfTmIsIF9femVybyk7CisJZm9yIChzaXplX3QgX19pID0gX05iOyBfX2kgPiAwOyAtLV9faSkKKwkgIGlmIChfVW5jaGVja2VkX3Rlc3QoX19pIC0gMSkpCisJICAgIF9UcmFpdHM6OmFzc2lnbihfX3NbX05iIC0gX19pXSwgX19vbmUpOworICAgICAgfQorCisgIC8vIDIzLjMuNS4zIGJpdHNldCBvcGVyYXRpb25zOgorICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmICBHbG9iYWwgYml0d2lzZSBvcGVyYXRpb25zIG9uIGJpdHNldHMuCisgICAqICBAcGFyYW0gIHggIEEgYml0c2V0LgorICAgKiAgQHBhcmFtICB5ICBBIGJpdHNldCBvZiB0aGUgc2FtZSBzaXplIGFzIEBhIHguCisgICAqICBAcmV0dXJuICBBIG5ldyBiaXRzZXQuCisgICAqCisgICAqICBUaGVzZSBzaG91bGQgYmUgc2VsZi1leHBsYW5hdG9yeS4KKyAgKi8KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBpbmxpbmUgYml0c2V0PF9OYj4KKyAgICBvcGVyYXRvciYoY29uc3QgYml0c2V0PF9OYj4mIF9feCwgY29uc3QgYml0c2V0PF9OYj4mIF9feSkKKyAgICB7CisgICAgICBiaXRzZXQ8X05iPiBfX3Jlc3VsdChfX3gpOworICAgICAgX19yZXN1bHQgJj0gX195OworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGlubGluZSBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yfChjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsKKyAgICAgIGJpdHNldDxfTmI+IF9fcmVzdWx0KF9feCk7CisgICAgICBfX3Jlc3VsdCB8PSBfX3k7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlIDxzaXplX3QgX05iPgorICAgIGlubGluZSBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yXihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsKKyAgICAgIGJpdHNldDxfTmI+IF9fcmVzdWx0KF9feCk7CisgICAgICBfX3Jlc3VsdCBePSBfX3k7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorICAvL0B9CisKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiBHbG9iYWwgSS9PIG9wZXJhdG9ycyBmb3IgYml0c2V0cy4KKyAgICoKKyAgICogIERpcmVjdCBJL08gYmV0d2VlbiBzdHJlYW1zIGFuZCBiaXRzZXRzIGlzIHN1cHBvcnRlZC4gIE91dHB1dCBpcworICAgKiAgc3RyYWlnaHRmb3J3YXJkLiAgSW5wdXQgd2lsbCBza2lwIHdoaXRlc3BhY2UsIG9ubHkgYWNjZXB0IEBhIDAgYW5kIEBhIDEKKyAgICogIGNoYXJhY3RlcnMsIGFuZCB3aWxsIG9ubHkgZXh0cmFjdCBhcyBtYW55IGRpZ2l0cyBhcyB0aGUgJWJpdHNldCB3aWxsCisgICAqICBob2xkLgorICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIHNpemVfdCBfTmI+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYml0c2V0PF9OYj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZSAgICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4gX190bXA7CisgICAgICBfX3RtcC5yZXNlcnZlKF9OYik7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDMwMy4gQml0c2V0IGlucHV0IG9wZXJhdG9yIHVuZGVyc3BlY2lmaWVkCisgICAgICBjb25zdCBjaGFyX3R5cGUgX196ZXJvID0gX19pcy53aWRlbignMCcpOworICAgICAgY29uc3QgY2hhcl90eXBlIF9fb25lID0gX19pcy53aWRlbignMScpOworCisgICAgICB0eXBlbmFtZSBfX2lvc19iYXNlOjppb3N0YXRlIF9fc3RhdGUgPSBfX2lvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX3NlbnRyeShfX2lzKTsKKyAgICAgIGlmIChfX3NlbnRyeSkKKwl7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgZm9yIChzaXplX3QgX19pID0gX05iOyBfX2kgPiAwOyAtLV9faSkKKwkJeworCQkgIHN0YXRpYyB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCQkgIAorCQkgIHR5cGVuYW1lIF9UcmFpdHM6OmludF90eXBlIF9fYzEgPSBfX2lzLnJkYnVmKCktPnNidW1wYygpOworCQkgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MxLCBfX2VvZikpCisJCSAgICB7CisJCSAgICAgIF9fc3RhdGUgfD0gX19pb3NfYmFzZTo6ZW9mYml0OworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGNvbnN0IGNoYXJfdHlwZSBfX2MyID0gX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYzEpOworCQkgICAgICBpZiAoX1RyYWl0czo6ZXEoX19jMiwgX196ZXJvKSkKKwkJCV9fdG1wLnB1c2hfYmFjayhfX3plcm8pOworCQkgICAgICBlbHNlIGlmIChfVHJhaXRzOjplcShfX2MyLCBfX29uZSkpCisJCQlfX3RtcC5wdXNoX2JhY2soX19vbmUpOworCQkgICAgICBlbHNlIGlmIChfVHJhaXRzOjoKKwkJCSAgICAgICBlcV9pbnRfdHlwZShfX2lzLnJkYnVmKCktPnNwdXRiYWNrYyhfX2MyKSwKKwkJCQkJICAgX19lb2YpKQorCQkJeworCQkJICBfX3N0YXRlIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faXMuX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsJCQorCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeyBfX2lzLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7IH0KKwl9CisKKyAgICAgIGlmIChfX3RtcC5lbXB0eSgpICYmIF9OYikKKwlfX3N0YXRlIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBlbHNlCisJX194Ll9NX2NvcHlfZnJvbV9zdHJpbmcoX190bXAsIHN0YXRpY19jYXN0PHNpemVfdD4oMCksIF9OYiwKKwkJCQlfX3plcm8sIF9fb25lKTsKKyAgICAgIGlmIChfX3N0YXRlKQorCV9faXMuc2V0c3RhdGUoX19zdGF0ZSk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgc2l6ZV90IF9OYj4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiaXRzZXQ8X05iPiYgX194KQorICAgIHsKKyAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cz4gX190bXA7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICBjb25zdCBjdHlwZTxfQ2hhclQ+JiBfX2N0ID0gdXNlX2ZhY2V0PGN0eXBlPF9DaGFyVD4gPihfX29zLmdldGxvYygpKTsKKyAgICAgIF9feC5fTV9jb3B5X3RvX3N0cmluZyhfX3RtcCwgX19jdC53aWRlbignMCcpLCBfX2N0LndpZGVuKCcxJykpOworICAgICAgcmV0dXJuIF9fb3MgPDwgX190bXA7CisgICAgfQorICAvL0B9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQ09OVEFJTkVSCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI3VuZGVmIF9HTElCQ1hYX0JJVFNFVF9XT1JEUworI3VuZGVmIF9HTElCQ1hYX0JJVFNFVF9CSVRTX1BFUl9XT1JECisjdW5kZWYgX0dMSUJDWFhfQklUU0VUX0JJVFNfUEVSX1VMTAorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiAxMTgyLgorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBiaXRzZXQuCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgc3RydWN0IGhhc2g8X0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfR0xJQkNYWF9TVERfQzo6Yml0c2V0PF9OYj4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19jbGVuZ3RoID0gKF9OYiArIF9fQ0hBUl9CSVRfXyAtIDEpIC8gX19DSEFSX0JJVF9fOworCXJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19iLl9NX2dldGRhdGEoKSwgX19jbGVuZ3RoKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfR0xJQkNYWF9TVERfQzo6Yml0c2V0PDA+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX0dMSUJDWFhfU1REX0M6OmJpdHNldDwwPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0dMSUJDWFhfU1REX0M6OmJpdHNldDwwPiYpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiAwOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL2JpdHNldD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL2JpdHNldD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfQklUU0VUICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2Nhc3NlcnQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2Nhc3NlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4YWY2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2Fzc2VydApAQCAtMCwwICsxLDQ1IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGNhc3NlcnQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBhc3NlcnQuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE5LjIgIEFzc2VydGlvbnMKKy8vCisKKy8vIE5vIGluY2x1ZGUgZ3VhcmRzIG9uIHRoaXMgaGVhZGVyLi4uCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGFzc2VydC5oPgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jY29tcGxleCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2NvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMTdlOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2NvbXBsZXgKQEAgLTAsMCArMSw0NCBAQAorLy8gPGNjb21wbGV4PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2NvbXBsZXgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfR0xJQkNYWF9DQ09NUExFWAorI2RlZmluZSBfR0xJQkNYWF9DQ09NUExFWCAxCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSU5DTFVERV9BU19UUjEpCisjICBlcnJvciBDKysweCBoZWFkZXIgY2Fubm90IGJlIGluY2x1ZGVkIGZyb20gVFIxIGhlYWRlcgorI2VuZGlmCisKKyNpbmNsdWRlIDxjb21wbGV4PgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2N0eXBlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jY3R5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlZDY5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2N0eXBlCkBAIC0wLDAgKzEsOTYgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jY3R5cGUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBjdHlwZS5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogPGNjeXRwZT4KKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DQ1RZUEUKKyNkZWZpbmUgX0dMSUJDWFhfQ0NUWVBFIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8Y3R5cGUuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBpc2FsbnVtCisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzY250cmwKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNncmFwaAorI3VuZGVmIGlzbG93ZXIKKyN1bmRlZiBpc3ByaW50CisjdW5kZWYgaXNwdW5jdAorI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc3VwcGVyCisjdW5kZWYgaXN4ZGlnaXQKKyN1bmRlZiB0b2xvd2VyCisjdW5kZWYgdG91cHBlcgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6aXNhbG51bTsKKyAgdXNpbmcgOjppc2FscGhhOworICB1c2luZyA6OmlzY250cmw7CisgIHVzaW5nIDo6aXNkaWdpdDsKKyAgdXNpbmcgOjppc2dyYXBoOworICB1c2luZyA6OmlzbG93ZXI7CisgIHVzaW5nIDo6aXNwcmludDsKKyAgdXNpbmcgOjppc3B1bmN0OworICB1c2luZyA6Omlzc3BhY2U7CisgIHVzaW5nIDo6aXN1cHBlcjsKKyAgdXNpbmcgOjppc3hkaWdpdDsKKyAgdXNpbmcgOjp0b2xvd2VyOworICB1c2luZyA6OnRvdXBwZXI7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0NUWVBFX1RSMQorCisjdW5kZWYgaXNibGFuaworCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6aXNibGFuazsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9DVFlQRV9UUjEKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jZXJybm8gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NlcnJubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDUxY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jZXJybm8KQEAgLTAsMCArMSw1MyBAQAorLy8gVGhlIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY2Vycm5vCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgZXJybm8uaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE5LjMgIEVycm9yIG51bWJlcnMKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0VSUk5PCisjZGVmaW5lIF9HTElCQ1hYX0NFUlJOTyAxCisKKy8vIEFkaGVyZSB0byBzZWN0aW9uIDE3LjQuMS4yIGNsYXVzZSA1IG9mIElTTyAxNDg4MjoxOTk4CisjaWZuZGVmIGVycm5vCisjZGVmaW5lIGVycm5vIGVycm5vCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NmZW52IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jZmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAxMGEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jZmVudgpAQCAtMCwwICsxLDg0IEBACisvLyA8Y2ZlbnY+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jZmVudgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DRkVOVgorI2RlZmluZSBfR0xJQkNYWF9DRkVOViAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9GRU5WX0gKKyMgaW5jbHVkZSA8ZmVudi5oPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyN1bmRlZiBmZWNsZWFyZXhjZXB0CisjdW5kZWYgZmVnZXRleGNlcHRmbGFnCisjdW5kZWYgZmVyYWlzZWV4Y2VwdAorI3VuZGVmIGZlc2V0ZXhjZXB0ZmxhZworI3VuZGVmIGZldGVzdGV4Y2VwdAorI3VuZGVmIGZlZ2V0cm91bmQKKyN1bmRlZiBmZXNldHJvdW5kCisjdW5kZWYgZmVnZXRlbnYKKyN1bmRlZiBmZWhvbGRleGNlcHQKKyN1bmRlZiBmZXNldGVudgorI3VuZGVmIGZldXBkYXRlZW52CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjpmZW52X3Q7CisgIHVzaW5nIDo6ZmV4Y2VwdF90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyA6OmZlY2xlYXJleGNlcHQ7CisgIHVzaW5nIDo6ZmVnZXRleGNlcHRmbGFnOworICB1c2luZyA6OmZlcmFpc2VleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRleGNlcHRmbGFnOworICB1c2luZyA6OmZldGVzdGV4Y2VwdDsKKworICB1c2luZyA6OmZlZ2V0cm91bmQ7CisgIHVzaW5nIDo6ZmVzZXRyb3VuZDsKKworICB1c2luZyA6OmZlZ2V0ZW52OworICB1c2luZyA6OmZlaG9sZGV4Y2VwdDsKKyAgdXNpbmcgOjpmZXNldGVudjsKKyAgdXNpbmcgOjpmZXVwZGF0ZWVudjsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX0NGRU5WCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NmbG9hdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2Zsb2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTgxZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NmbG9hdApAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2Zsb2F0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgZmxvYXQuaCwKKyAqICBhbmQgaXRzIGNvbnRlbnRzIGFyZSAobW9zdGx5KSB0aGUgc2FtZSBhcyB0aGF0IGhlYWRlciwgYnV0IGFyZSBhbGwKKyAqICBjb250YWluZWQgaW4gdGhlIG5hbWVzcGFjZSBAYyBzdGQgKGV4Y2VwdCBmb3IgbmFtZXMgd2hpY2ggYXJlIGRlZmluZWQKKyAqICBhcyBtYWNyb3MgaW4gQykuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDE4LjIuMiAgSW1wbGVtZW50YXRpb24gcHJvcGVydGllczogQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NGTE9BVAorI2RlZmluZSBfR0xJQkNYWF9DRkxPQVQgMQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgIGlmIGRlZmluZWQoX0dMSUJDWFhfSU5DTFVERV9BU19UUjEpCisjICAgIGVycm9yIEMrKzB4IGhlYWRlciBjYW5ub3QgYmUgaW5jbHVkZWQgZnJvbSBUUjEgaGVhZGVyCisjICBlbmRpZgorIyAgaWZuZGVmIERFQ0lNQUxfRElHCisjICAgIGRlZmluZSBERUNJTUFMX0RJRyBfX0RFQ0lNQUxfRElHX18KKyMgIGVuZGlmCisjICBpZm5kZWYgRkxUX0VWQUxfTUVUSE9ECisjICAgIGRlZmluZSBGTFRfRVZBTF9NRVRIT0QgX19GTFRfRVZBTF9NRVRIT0RfXworIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2hyb25vIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jaHJvbm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZWQyYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2hyb25vCkBAIC0wLDAgKzEsNzIzIEBACisvLyA8Y2hyb25vPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2hyb25vCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NIUk9OTworI2RlZmluZSBfR0xJQkNYWF9DSFJPTk8gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8cmF0aW8+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGN0aW1lPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICAvKioKKyAgICogQGRlZmdyb3VwIGNocm9ubyBUaW1lCisgICAqIEBpbmdyb3VwIHV0aWxpdGllcworICAgKgorICAgKiBDbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIHRpbWUuCisgICAqIEB7CisgICAqLworCisgIC8qKiBAbmFtZXNwYWNlIHN0ZDo6Y2hyb25vCisgICAqICBAYnJpZWYgSVNPIEMrKyAweCBlbnRpdGllcyBzdWIgbmFtZXNwYWNlIGZvciB0aW1lIGFuZCBkYXRlLgorICAgKi8KKyAgbmFtZXNwYWNlIGNocm9ubworICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kID0gcmF0aW88MT4+CisgICAgICBzdHJ1Y3QgZHVyYXRpb247CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIgPSB0eXBlbmFtZSBfQ2xvY2s6OmR1cmF0aW9uPgorICAgICAgc3RydWN0IHRpbWVfcG9pbnQ7CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgLy8gMjAuOC4yLjMgc3BlY2lhbGl6YXRpb24gb2YgY29tbW9uX3R5cGUgKGZvciBkdXJhdGlvbikKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLCB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgc3RydWN0IGNvbW1vbl90eXBlPGNocm9ubzo6ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwKKwkJICAgICAgIGNocm9ubzo6ZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19zdGF0aWNfZ2NkPF9QZXJpb2QxOjpudW0sIF9QZXJpb2QyOjpudW0+IAlfX2djZF9udW07CisgICAgICB0eXBlZGVmIF9fc3RhdGljX2djZDxfUGVyaW9kMTo6ZGVuLCBfUGVyaW9kMjo6ZGVuPiAJX19nY2RfZGVuOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlCQlfX2NyOworICAgICAgdHlwZWRlZiByYXRpbzxfX2djZF9udW06OnZhbHVlLAorCQkgICAgKF9QZXJpb2QxOjpkZW4gLyBfX2djZF9kZW46OnZhbHVlKSAqIF9QZXJpb2QyOjpkZW4+IF9fcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgY2hyb25vOjpkdXJhdGlvbjxfX2NyLCBfX3I+IAkJCXR5cGU7CisgICAgfTsKKworICAvLyAyMC44LjIuMyBzcGVjaWFsaXphdGlvbiBvZiBjb21tb25fdHlwZSAoZm9yIHRpbWVfcG9pbnQpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTxjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4sCisJCSAgICAgICBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLCBfRHVyMj46OnR5cGUgCQlfX2N0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfX2N0PiAJCQl0eXBlOworICAgIH07CitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICBuYW1lc3BhY2UgY2hyb25vCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vIFByaW1hcnkgdGVtcGxhdGUgZm9yIGR1cmF0aW9uX2Nhc3QgaW1wbC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DRiwgdHlwZW5hbWUgX0NSLAorCSAgICAgYm9vbCBfTnVtSXNPbmUgPSBmYWxzZSwgYm9vbCBfRGVuSXNPbmUgPSBmYWxzZT4KKyAgICAgIHN0cnVjdCBfX2R1cmF0aW9uX2Nhc3RfaW1wbAorICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisJICBzdGF0aWMgY29uc3RleHByIF9Ub0R1cgorCSAgX19jYXN0KGNvbnN0IGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QpCisJICB7CisJICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpyZXAJCQlfX3RvX3JlcDsKKwkgICAgcmV0dXJuIF9Ub0R1cihzdGF0aWNfY2FzdDxfX3RvX3JlcD4oc3RhdGljX2Nhc3Q8X0NSPihfX2QuY291bnQoKSkKKwkgICAgICAqIHN0YXRpY19jYXN0PF9DUj4oX0NGOjpudW0pCisJICAgICAgLyBzdGF0aWNfY2FzdDxfQ1I+KF9DRjo6ZGVuKSkpOworCSAgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub0R1ciwgdHlwZW5hbWUgX0NGLCB0eXBlbmFtZSBfQ1I+CisgICAgICBzdHJ1Y3QgX19kdXJhdGlvbl9jYXN0X2ltcGw8X1RvRHVyLCBfQ0YsIF9DUiwgdHJ1ZSwgdHJ1ZT4KKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCSAgc3RhdGljIGNvbnN0ZXhwciBfVG9EdXIKKwkgIF9fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cmVwCQkJX190b19yZXA7CisJICAgIHJldHVybiBfVG9EdXIoc3RhdGljX2Nhc3Q8X190b19yZXA+KF9fZC5jb3VudCgpKSk7CisJICB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvRHVyLCB0eXBlbmFtZSBfQ0YsIHR5cGVuYW1lIF9DUj4KKyAgICAgIHN0cnVjdCBfX2R1cmF0aW9uX2Nhc3RfaW1wbDxfVG9EdXIsIF9DRiwgX0NSLCB0cnVlLCBmYWxzZT4KKyAgICAgIHsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCSAgc3RhdGljIGNvbnN0ZXhwciBfVG9EdXIKKwkgIF9fY2FzdChjb25zdCBkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19kKQorCSAgeworCSAgICB0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cmVwCQkJX190b19yZXA7CisJICAgIHJldHVybiBfVG9EdXIoc3RhdGljX2Nhc3Q8X190b19yZXA+KAorCSAgICAgIHN0YXRpY19jYXN0PF9DUj4oX19kLmNvdW50KCkpIC8gc3RhdGljX2Nhc3Q8X0NSPihfQ0Y6OmRlbikpKTsKKwkgIH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DRiwgdHlwZW5hbWUgX0NSPgorICAgICAgc3RydWN0IF9fZHVyYXRpb25fY2FzdF9pbXBsPF9Ub0R1ciwgX0NGLCBfQ1IsIGZhbHNlLCB0cnVlPgorICAgICAgeworCXRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisJICBzdGF0aWMgY29uc3RleHByIF9Ub0R1cgorCSAgX19jYXN0KGNvbnN0IGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX2QpCisJICB7CisJICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpyZXAJCQlfX3RvX3JlcDsKKwkgICAgcmV0dXJuIF9Ub0R1cihzdGF0aWNfY2FzdDxfX3RvX3JlcD4oCisJICAgICAgc3RhdGljX2Nhc3Q8X0NSPihfX2QuY291bnQoKSkgKiBzdGF0aWNfY2FzdDxfQ1I+KF9DRjo6bnVtKSkpOworCSAgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCBfX2lzX2R1cmF0aW9uCisgICAgICA6IHN0ZDo6ZmFsc2VfdHlwZQorICAgICAgeyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIHN0cnVjdCBfX2lzX2R1cmF0aW9uPGR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+PgorICAgICAgOiBzdGQ6OnRydWVfdHlwZQorICAgICAgeyB9OworCisgICAgLy8vIGR1cmF0aW9uX2Nhc3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGVuYWJsZV9pZjxfX2lzX2R1cmF0aW9uPF9Ub0R1cj46OnZhbHVlLAorCQkJCV9Ub0R1cj46OnR5cGUKKyAgICAgIGR1cmF0aW9uX2Nhc3QoY29uc3QgZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fZCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9Ub0R1cjo6cGVyaW9kCQkJCV9fdG9fcGVyaW9kOworCXR5cGVkZWYgdHlwZW5hbWUgX1RvRHVyOjpyZXAJCQkJX190b19yZXA7CisJdHlwZWRlZiByYXRpb19kaXZpZGU8X1BlcmlvZCwgX190b19wZXJpb2Q+IAkJX19yX2RpdjsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcl9kaXY6OnR5cGUgCQkJCV9fY2Y7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX3RvX3JlcCwgX1JlcCwgaW50bWF4X3Q+Ojp0eXBlCisJICAJCQkJCQkJX19jcjsKKwl0eXBlZGVmICBfX2R1cmF0aW9uX2Nhc3RfaW1wbDxfVG9EdXIsIF9fY2YsIF9fY3IsCisJCQkJICAgICAgX19jZjo6bnVtID09IDEsIF9fY2Y6OmRlbiA9PSAxPiBfX2RjOworCXJldHVybiBfX2RjOjpfX2Nhc3QoX19kKTsKKyAgICAgIH0KKworICAgIC8vLyB0cmVhdF9hc19mbG9hdGluZ19wb2ludAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXA+CisgICAgICBzdHJ1Y3QgdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQKKyAgICAgIDogaXNfZmxvYXRpbmdfcG9pbnQ8X1JlcD4KKyAgICAgIHsgfTsKKworICAgIC8vLyBkdXJhdGlvbl92YWx1ZXMKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwPgorICAgICAgc3RydWN0IGR1cmF0aW9uX3ZhbHVlcworICAgICAgeworCXN0YXRpYyBjb25zdGV4cHIgX1JlcAorCXplcm8oKQorCXsgcmV0dXJuIF9SZXAoMCk7IH0KKworCXN0YXRpYyBjb25zdGV4cHIgX1JlcAorCW1heCgpCisJeyByZXR1cm4gbnVtZXJpY19saW1pdHM8X1JlcD46Om1heCgpOyB9CisKKwlzdGF0aWMgY29uc3RleHByIF9SZXAKKwltaW4oKQorCXsgcmV0dXJuIG51bWVyaWNfbGltaXRzPF9SZXA+OjptaW4oKTsgfQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICBzdHJ1Y3QgX19pc19yYXRpbworICAgICAgOiBzdGQ6OmZhbHNlX3R5cGUKKyAgICAgIHsgfTsKKworICAgIHRlbXBsYXRlPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4+CisgICAgICBzdHJ1Y3QgX19pc19yYXRpbzxyYXRpbzxfTnVtLCBfRGVuPj4KKyAgICAgIDogc3RkOjp0cnVlX3R5cGUKKyAgICAgIHsgfTsKKworICAgIC8vLyBkdXJhdGlvbgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBzdHJ1Y3QgZHVyYXRpb24KKyAgICAgIHsKKwl0eXBlZGVmIF9SZXAJCQkJCQlyZXA7CisJdHlwZWRlZiBfUGVyaW9kIAkJCQkJcGVyaW9kOworCisJc3RhdGljX2Fzc2VydCghX19pc19kdXJhdGlvbjxfUmVwPjo6dmFsdWUsICJyZXAgY2Fubm90IGJlIGEgZHVyYXRpb24iKTsKKwlzdGF0aWNfYXNzZXJ0KF9faXNfcmF0aW88X1BlcmlvZD46OnZhbHVlLAorCQkgICAgICAicGVyaW9kIG11c3QgYmUgYSBzcGVjaWFsaXphdGlvbiBvZiByYXRpbyIpOworCXN0YXRpY19hc3NlcnQoX1BlcmlvZDo6bnVtID4gMCwgInBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlIik7CisKKwkvLyAyMC44LjMuMSBjb25zdHJ1Y3Rpb24gLyBjb3B5IC8gZGVzdHJveQorCWNvbnN0ZXhwciBkdXJhdGlvbigpIDogX19yKCkgeyB9CisKKwljb25zdGV4cHIgZHVyYXRpb24oY29uc3QgZHVyYXRpb24mKSA9IGRlZmF1bHQ7CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBlbmFibGVfaWY8aXNfY29udmVydGlibGU8X1JlcDIsIHJlcD46OnZhbHVlCisJCQkgJiYgKHRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PHJlcD46OnZhbHVlCisJCQkgICAgIHx8ICF0cmVhdF9hc19mbG9hdGluZ19wb2ludDxfUmVwMj46OnZhbHVlKT46OnR5cGU+CisJICBjb25zdGV4cHIgZXhwbGljaXQgZHVyYXRpb24oY29uc3QgX1JlcDImIF9fcmVwKQorCSAgOiBfX3Ioc3RhdGljX2Nhc3Q8cmVwPihfX3JlcCkpIHsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIGVuYWJsZV9pZjx0cmVhdF9hc19mbG9hdGluZ19wb2ludDxyZXA+Ojp2YWx1ZQorCQkJIHx8IChyYXRpb19kaXZpZGU8X1BlcmlvZDIsIHBlcmlvZD46OnR5cGU6OmRlbiA9PSAxCisJCQkgICAgICYmICF0cmVhdF9hc19mbG9hdGluZ19wb2ludDxfUmVwMj46OnZhbHVlKT46OnR5cGU+CisJICBjb25zdGV4cHIgZHVyYXRpb24oY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19kKQorCSAgOiBfX3IoZHVyYXRpb25fY2FzdDxkdXJhdGlvbj4oX19kKS5jb3VudCgpKSB7IH0KKworCX5kdXJhdGlvbigpID0gZGVmYXVsdDsKKwlkdXJhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IGR1cmF0aW9uJikgPSBkZWZhdWx0OworCisJLy8gMjAuOC4zLjIgb2JzZXJ2ZXIKKwljb25zdGV4cHIgcmVwCisJY291bnQoKSBjb25zdAorCXsgcmV0dXJuIF9fcjsgfQorCisJLy8gMjAuOC4zLjMgYXJpdGhtZXRpYworCWNvbnN0ZXhwciBkdXJhdGlvbgorCW9wZXJhdG9yKygpIGNvbnN0CisJeyByZXR1cm4gKnRoaXM7IH0KKworCWNvbnN0ZXhwciBkdXJhdGlvbgorCW9wZXJhdG9yLSgpIGNvbnN0CisJeyByZXR1cm4gZHVyYXRpb24oLV9fcik7IH0KKworCWR1cmF0aW9uJgorCW9wZXJhdG9yKysoKQorCXsKKwkgICsrX19yOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWR1cmF0aW9uCisJb3BlcmF0b3IrKyhpbnQpCisJeyByZXR1cm4gZHVyYXRpb24oX19yKyspOyB9CisKKwlkdXJhdGlvbiYKKwlvcGVyYXRvci0tKCkKKwl7CisJICAtLV9fcjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlkdXJhdGlvbgorCW9wZXJhdG9yLS0oaW50KQorCXsgcmV0dXJuIGR1cmF0aW9uKF9fci0tKTsgfQorCisJZHVyYXRpb24mCisJb3BlcmF0b3IrPShjb25zdCBkdXJhdGlvbiYgX19kKQorCXsKKwkgIF9fciArPSBfX2QuY291bnQoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwlkdXJhdGlvbiYKKwlvcGVyYXRvci09KGNvbnN0IGR1cmF0aW9uJiBfX2QpCisJeworCSAgX19yIC09IF9fZC5jb3VudCgpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWR1cmF0aW9uJgorCW9wZXJhdG9yKj0oY29uc3QgcmVwJiBfX3JocykKKwl7CisJICBfX3IgKj0gX19yaHM7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJZHVyYXRpb24mCisJb3BlcmF0b3IvPShjb25zdCByZXAmIF9fcmhzKQorCXsKKwkgIF9fciAvPSBfX3JoczsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKwkvLyBEUiA5MzQuCisJdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDIgPSByZXA+CisJICB0eXBlbmFtZSBlbmFibGVfaWY8IXRyZWF0X2FzX2Zsb2F0aW5nX3BvaW50PF9SZXAyPjo6dmFsdWUsCisJCQkgICAgIGR1cmF0aW9uJj46OnR5cGUKKwkgIG9wZXJhdG9yJT0oY29uc3QgcmVwJiBfX3JocykKKwkgIHsKKwkgICAgX19yICU9IF9fcmhzOworCSAgICByZXR1cm4gKnRoaXM7CisJICB9CisKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMiA9IHJlcD4KKwkgIHR5cGVuYW1lIGVuYWJsZV9pZjwhdHJlYXRfYXNfZmxvYXRpbmdfcG9pbnQ8X1JlcDI+Ojp2YWx1ZSwKKwkJCSAgICAgZHVyYXRpb24mPjo6dHlwZQorCSAgb3BlcmF0b3IlPShjb25zdCBkdXJhdGlvbiYgX19kKQorCSAgeworCSAgICBfX3IgJT0gX19kLmNvdW50KCk7CisJICAgIHJldHVybiAqdGhpczsKKwkgIH0KKworCS8vIDIwLjguMy40IHNwZWNpYWwgdmFsdWVzCisJc3RhdGljIGNvbnN0ZXhwciBkdXJhdGlvbgorCXplcm8oKQorCXsgcmV0dXJuIGR1cmF0aW9uKGR1cmF0aW9uX3ZhbHVlczxyZXA+Ojp6ZXJvKCkpOyB9CisKKwlzdGF0aWMgY29uc3RleHByIGR1cmF0aW9uCisJbWluKCkKKwl7IHJldHVybiBkdXJhdGlvbihkdXJhdGlvbl92YWx1ZXM8cmVwPjo6bWluKCkpOyB9CisKKwlzdGF0aWMgY29uc3RleHByIGR1cmF0aW9uCisJbWF4KCkKKwl7IHJldHVybiBkdXJhdGlvbihkdXJhdGlvbl92YWx1ZXM8cmVwPjo6bWF4KCkpOyB9CisKKyAgICAgIHByaXZhdGU6CisJcmVwIF9fcjsKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBpbmxpbmUgdHlwZW5hbWUgY29tbW9uX3R5cGU8ZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiwKKwkJCQkgIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4+Ojp0eXBlCisgICAgICBvcGVyYXRvcisoY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2N0OworCXJldHVybiBfX2N0KF9fbGhzKSArPSBfX3JoczsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGlubGluZSB0eXBlbmFtZSBjb21tb25fdHlwZTxkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+LAorCQkJCSAgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPj46OnR5cGUKKyAgICAgIG9wZXJhdG9yLShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+CQkJX19kdXIxOworCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9fZHVyMSxfX2R1cjI+Ojp0eXBlCV9fY3Q7CisJcmV0dXJuIF9fY3QoX19saHMpIC09IF9fcmhzOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9SZXAyLCBib29sID0KKwkgICAgIGlzX2NvbnZlcnRpYmxlPF9SZXAyLAorCQkJICAgIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGU+Ojp2YWx1ZT4KKyAgICAgIHN0cnVjdCBfX2NvbW1vbl9yZXBfdHlwZSB7IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1JlcDI+CisgICAgICBzdHJ1Y3QgX19jb21tb25fcmVwX3R5cGU8X1JlcDEsIF9SZXAyLCB0cnVlPgorICAgICAgeyB0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9SZXAxLCBfUmVwMj46OnR5cGUgdHlwZTsgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kLCB0eXBlbmFtZSBfUmVwMj4KKyAgICAgIGlubGluZSBkdXJhdGlvbjx0eXBlbmFtZSBfX2NvbW1vbl9yZXBfdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlLCBfUGVyaW9kPgorICAgICAgb3BlcmF0b3IqKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiYgX19kLCBjb25zdCBfUmVwMiYgX19zKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSAJX19jcjsKKwlyZXR1cm4gZHVyYXRpb248X19jciwgX1BlcmlvZD4oX19kKSAqPSBfX3M7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1JlcDI+CisgICAgICBpbmxpbmUgZHVyYXRpb248dHlwZW5hbWUgX19jb21tb25fcmVwX3R5cGU8X1JlcDIsIF9SZXAxPjo6dHlwZSwgX1BlcmlvZD4KKyAgICAgIG9wZXJhdG9yKihjb25zdCBfUmVwMSYgX19zLCBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZD4mIF9fZCkKKyAgICAgIHsgcmV0dXJuIF9fZCAqIF9fczsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QsIHR5cGVuYW1lIF9SZXAyPgorICAgICAgaW5saW5lIGR1cmF0aW9uPHR5cGVuYW1lIF9fY29tbW9uX3JlcF90eXBlPF9SZXAxLCB0eXBlbmFtZQorCWVuYWJsZV9pZjwhX19pc19kdXJhdGlvbjxfUmVwMj46OnZhbHVlLCBfUmVwMj46OnR5cGU+Ojp0eXBlLCBfUGVyaW9kPgorICAgICAgb3BlcmF0b3IvKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kPiYgX19kLCBjb25zdCBfUmVwMiYgX19zKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X1JlcDEsIF9SZXAyPjo6dHlwZSAJX19jcjsKKwlyZXR1cm4gZHVyYXRpb248X19jciwgX1BlcmlvZD4oX19kKSAvPSBfX3M7CisgICAgICB9CisKKyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGlubGluZSB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlCisgICAgICBvcGVyYXRvci8oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2N0OworCXJldHVybiBfX2N0KF9fbGhzKS5jb3VudCgpIC8gX19jdChfX3JocykuY291bnQoKTsKKyAgICAgIH0KKworICAgIC8vIERSIDkzNC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1JlcDI+CisgICAgICBpbmxpbmUgZHVyYXRpb248dHlwZW5hbWUgX19jb21tb25fcmVwX3R5cGU8X1JlcDEsIHR5cGVuYW1lCisJZW5hYmxlX2lmPCFfX2lzX2R1cmF0aW9uPF9SZXAyPjo6dmFsdWUsIF9SZXAyPjo6dHlwZT46OnR5cGUsIF9QZXJpb2Q+CisgICAgICBvcGVyYXRvciUoY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2Q+JiBfX2QsIGNvbnN0IF9SZXAyJiBfX3MpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfUmVwMSwgX1JlcDI+Ojp0eXBlIAlfX2NyOworCXJldHVybiBkdXJhdGlvbjxfX2NyLCBfUGVyaW9kPihfX2QpICU9IF9fczsKKyAgICAgIH0KKworICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgaW5saW5lIHR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sCisJCQkJICBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZQorICAgICAgb3BlcmF0b3IlKGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQljb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4JCQlfX2R1cjE7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+CQkJX19kdXIyOworCXR5cGVkZWYgdHlwZW5hbWUgY29tbW9uX3R5cGU8X19kdXIxLF9fZHVyMj46OnR5cGUJX19jdDsKKwlyZXR1cm4gX19jdChfX2xocykgJT0gX19yaHM7CisgICAgICB9CisKKyAgICAvLyBjb21wYXJpc29ucworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAxLCB0eXBlbmFtZSBfUGVyaW9kMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGlubGluZSBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJIGNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPgkJCV9fZHVyMTsKKwl0eXBlZGVmIGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4JCQlfX2R1cjI7CisJdHlwZWRlZiB0eXBlbmFtZSBjb21tb25fdHlwZTxfX2R1cjEsX19kdXIyPjo6dHlwZQlfX2N0OworCXJldHVybiBfX2N0KF9fbGhzKS5jb3VudCgpID09IF9fY3QoX19yaHMpLmNvdW50KCk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7CisJdHlwZWRlZiBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+CQkJX19kdXIxOworCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9fZHVyMSxfX2R1cjI+Ojp0eXBlCV9fY3Q7CisJcmV0dXJuIF9fY3QoX19saHMpLmNvdW50KCkgPCBfX2N0KF9fcmhzKS5jb3VudCgpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQkgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcDEsIHR5cGVuYW1lIF9QZXJpb2QxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcjw9KGNvbnN0IGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4mIF9fbGhzLAorCQkgY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPihjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX3JocyA8IF9fbGhzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfUmVwMiwgdHlwZW5hbWUgX1BlcmlvZDI+CisgICAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yPj0oY29uc3QgZHVyYXRpb248X1JlcDEsIF9QZXJpb2QxPiYgX19saHMsCisJCSBjb25zdCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPCBfX3Jocyk7IH0KKworICAgIC8vLyBuYW5vc2Vjb25kcworICAgIHR5cGVkZWYgZHVyYXRpb248aW50NjRfdCwgbmFubz4gCW5hbm9zZWNvbmRzOworCisgICAgLy8vIG1pY3Jvc2Vjb25kcworICAgIHR5cGVkZWYgZHVyYXRpb248aW50NjRfdCwgbWljcm8+IAltaWNyb3NlY29uZHM7CisKKyAgICAvLy8gbWlsbGlzZWNvbmRzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQ2NF90LCBtaWxsaT4gCW1pbGxpc2Vjb25kczsKKworICAgIC8vLyBzZWNvbmRzCisgICAgdHlwZWRlZiBkdXJhdGlvbjxpbnQ2NF90PiAJCXNlY29uZHM7CisKKyAgICAvLy8gbWludXRlcworICAgIHR5cGVkZWYgZHVyYXRpb248aW50LCByYXRpbzwgNjA+PiAJbWludXRlczsKKworICAgIC8vLyBob3VycworICAgIHR5cGVkZWYgZHVyYXRpb248aW50LCByYXRpbzwzNjAwPj4gCWhvdXJzOworCisgICAgLy8vIHRpbWVfcG9pbnQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXI+CisgICAgICBzdHJ1Y3QgdGltZV9wb2ludAorICAgICAgeworCXR5cGVkZWYgX0Nsb2NrCQkJICAJCQljbG9jazsKKwl0eXBlZGVmIF9EdXIJCSAgCQkJCWR1cmF0aW9uOworCXR5cGVkZWYgdHlwZW5hbWUgZHVyYXRpb246OnJlcAkgIAkJCXJlcDsKKwl0eXBlZGVmIHR5cGVuYW1lIGR1cmF0aW9uOjpwZXJpb2QJCQlwZXJpb2Q7CisKKwljb25zdGV4cHIgdGltZV9wb2ludCgpIDogX19kKGR1cmF0aW9uOjp6ZXJvKCkpCisJeyB9CisKKwljb25zdGV4cHIgZXhwbGljaXQgdGltZV9wb2ludChjb25zdCBkdXJhdGlvbiYgX19kdXIpCisJOiBfX2QoX19kdXIpCisJeyB9CisKKwkvLyBjb252ZXJzaW9ucworCXRlbXBsYXRlPHR5cGVuYW1lIF9EdXIyPgorCSAgY29uc3RleHByIHRpbWVfcG9pbnQoY29uc3QgdGltZV9wb2ludDxjbG9jaywgX0R1cjI+JiBfX3QpCisJICA6IF9fZChfX3QudGltZV9zaW5jZV9lcG9jaCgpKQorCSAgeyB9CisKKwkvLyBvYnNlcnZlcgorCWNvbnN0ZXhwciBkdXJhdGlvbgorCXRpbWVfc2luY2VfZXBvY2goKSBjb25zdAorCXsgcmV0dXJuIF9fZDsgfQorCisJLy8gYXJpdGhtZXRpYworCXRpbWVfcG9pbnQmCisJb3BlcmF0b3IrPShjb25zdCBkdXJhdGlvbiYgX19kdXIpCisJeworCSAgX19kICs9IF9fZHVyOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCXRpbWVfcG9pbnQmCisJb3BlcmF0b3ItPShjb25zdCBkdXJhdGlvbiYgX19kdXIpCisJeworCSAgX19kIC09IF9fZHVyOworCSAgcmV0dXJuICp0aGlzOworCX0KKworCS8vIHNwZWNpYWwgdmFsdWVzCisJc3RhdGljIGNvbnN0ZXhwciB0aW1lX3BvaW50CisJbWluKCkKKwl7IHJldHVybiB0aW1lX3BvaW50KGR1cmF0aW9uOjptaW4oKSk7IH0KKworCXN0YXRpYyBjb25zdGV4cHIgdGltZV9wb2ludAorCW1heCgpCisJeyByZXR1cm4gdGltZV9wb2ludChkdXJhdGlvbjo6bWF4KCkpOyB9CisKKyAgICAgIHByaXZhdGU6CisJZHVyYXRpb24gX19kOworICAgICAgfTsKKworICAgIC8vLyB0aW1lX3BvaW50X2Nhc3QKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9EdXIsIHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cj4KKyAgICAgIGlubGluZSBjb25zdGV4cHIgdHlwZW5hbWUgZW5hYmxlX2lmPF9faXNfZHVyYXRpb248X1RvRHVyPjo6dmFsdWUsCisJCQkJdGltZV9wb2ludDxfQ2xvY2ssIF9Ub0R1cj4+Ojp0eXBlCisgICAgICB0aW1lX3BvaW50X2Nhc3QoY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXI+JiBfX3QpCisgICAgICB7CisJdHlwZWRlZiB0aW1lX3BvaW50PF9DbG9jaywgX1RvRHVyPiAJCQlfX3RpbWVfcG9pbnQ7CisJcmV0dXJuIF9fdGltZV9wb2ludChkdXJhdGlvbl9jYXN0PF9Ub0R1cj4oX190LnRpbWVfc2luY2VfZXBvY2goKSkpOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyMSwKKwkgICAgIHR5cGVuYW1lIF9SZXAyLCB0eXBlbmFtZSBfUGVyaW9kMj4KKyAgICAgIGlubGluZSB0aW1lX3BvaW50PF9DbG9jaywKKwl0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyMSwgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPj46OnR5cGU+CisgICAgICBvcGVyYXRvcisoY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCWNvbnN0IGR1cmF0aW9uPF9SZXAyLCBfUGVyaW9kMj4mIF9fcmhzKQorICAgICAgeworCXR5cGVkZWYgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPgkJCV9fZHVyMjsKKwl0eXBlZGVmIHR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLF9fZHVyMj46OnR5cGUJX19jdDsKKwl0eXBlZGVmIHRpbWVfcG9pbnQ8X0Nsb2NrLCBfX2N0PiAJCQlfX3RpbWVfcG9pbnQ7CisJcmV0dXJuIF9fdGltZV9wb2ludChfX2xocykgKz0gX19yaHM7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwMSwgdHlwZW5hbWUgX1BlcmlvZDEsCisJICAgICB0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIyPgorICAgICAgaW5saW5lIHRpbWVfcG9pbnQ8X0Nsb2NrLAorCXR5cGVuYW1lIGNvbW1vbl90eXBlPGR1cmF0aW9uPF9SZXAxLCBfUGVyaW9kMT4sIF9EdXIyPjo6dHlwZT4KKyAgICAgIG9wZXJhdG9yKyhjb25zdCBkdXJhdGlvbjxfUmVwMSwgX1BlcmlvZDE+JiBfX2xocywKKwkJY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX3JocyArIF9fbGhzOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLAorCSAgICAgdHlwZW5hbWUgX1JlcDIsIHR5cGVuYW1lIF9QZXJpb2QyPgorICAgICAgaW5saW5lIHRpbWVfcG9pbnQ8X0Nsb2NrLAorCXR5cGVuYW1lIGNvbW1vbl90eXBlPF9EdXIxLCBkdXJhdGlvbjxfUmVwMiwgX1BlcmlvZDI+Pjo6dHlwZT4KKyAgICAgIG9wZXJhdG9yLShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJY29uc3QgZHVyYXRpb248X1JlcDIsIF9QZXJpb2QyPiYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocyArICgtX19yaHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGlubGluZSB0eXBlbmFtZSBjb21tb25fdHlwZTxfRHVyMSwgX0R1cjI+Ojp0eXBlCisgICAgICBvcGVyYXRvci0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCWNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMudGltZV9zaW5jZV9lcG9jaCgpIC0gX19yaHMudGltZV9zaW5jZV9lcG9jaCgpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGlubGluZSBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjE+JiBfX2xocywKKwkJIGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMj4mIF9fcmhzKQorICAgICAgeyByZXR1cm4gX19saHMudGltZV9zaW5jZV9lcG9jaCgpID09IF9fcmhzLnRpbWVfc2luY2VfZXBvY2goKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyMSwgdHlwZW5hbWUgX0R1cjI+CisgICAgICBpbmxpbmUgY29uc3RleHByIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIxPiYgX19saHMsCisJCSBjb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGlubGluZSBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQljb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuICBfX2xocy50aW1lX3NpbmNlX2Vwb2NoKCkgPCBfX3Jocy50aW1lX3NpbmNlX2Vwb2NoKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcjw9KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQkgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fcmhzIDwgX19saHMpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXIxLCB0eXBlbmFtZSBfRHVyMj4KKyAgICAgIGlubGluZSBjb25zdGV4cHIgYm9vbAorICAgICAgb3BlcmF0b3I+KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQljb25zdCB0aW1lX3BvaW50PF9DbG9jaywgX0R1cjI+JiBfX3JocykKKyAgICAgIHsgcmV0dXJuIF9fcmhzIDwgX19saHM7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cjEsIHR5cGVuYW1lIF9EdXIyPgorICAgICAgaW5saW5lIGNvbnN0ZXhwciBib29sCisgICAgICBvcGVyYXRvcj49KGNvbnN0IHRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyMT4mIF9fbGhzLAorCQkgY29uc3QgdGltZV9wb2ludDxfQ2xvY2ssIF9EdXIyPiYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzIDwgX19yaHMpOyB9CisKKyAgICAvLy8gc3lzdGVtX2Nsb2NrCisgICAgc3RydWN0IHN5c3RlbV9jbG9jaworICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQ0xPQ0tfUkVBTFRJTUUKKyAgICAgIHR5cGVkZWYgY2hyb25vOjpuYW5vc2Vjb25kcyAgICAgCQkJCWR1cmF0aW9uOworI2VsaWYgZGVmaW5lZChfR0xJQkNYWF9VU0VfR0VUVElNRU9GREFZKQorICAgICAgdHlwZWRlZiBjaHJvbm86Om1pY3Jvc2Vjb25kcyAgICAJCQkJZHVyYXRpb247CisjZWxzZQorICAgICAgdHlwZWRlZiBjaHJvbm86OnNlY29uZHMJICAgICAgCQkJCWR1cmF0aW9uOworI2VuZGlmCisKKyAgICAgIHR5cGVkZWYgZHVyYXRpb246OnJlcCAgICAJCQkJCXJlcDsKKyAgICAgIHR5cGVkZWYgZHVyYXRpb246OnBlcmlvZCAJCQkJCXBlcmlvZDsKKyAgICAgIHR5cGVkZWYgY2hyb25vOjp0aW1lX3BvaW50PHN5c3RlbV9jbG9jaywgZHVyYXRpb24+IAl0aW1lX3BvaW50OworCisgICAgICBzdGF0aWNfYXNzZXJ0KHN5c3RlbV9jbG9jazo6ZHVyYXRpb246Om1pbigpCisJCSAgICA8IHN5c3RlbV9jbG9jazo6ZHVyYXRpb246Onplcm8oKSwKKwkJICAgICJhIGNsb2NrJ3MgbWluaW11bSBkdXJhdGlvbiBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0cyBlcG9jaCIpOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfbW9ub3RvbmljID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyB0aW1lX3BvaW50CisgICAgICBub3coKSB0aHJvdyAoKTsKKworICAgICAgLy8gTWFwIHRvIEMgQVBJCisgICAgICBzdGF0aWMgc3RkOjp0aW1lX3QKKyAgICAgIHRvX3RpbWVfdChjb25zdCB0aW1lX3BvaW50JiBfX3QpCisgICAgICB7CisJcmV0dXJuIHN0ZDo6dGltZV90KGR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpzZWNvbmRzPgorCQkJICAgKF9fdC50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCkpOworICAgICAgfQorCisgICAgICBzdGF0aWMgdGltZV9wb2ludAorICAgICAgZnJvbV90aW1lX3Qoc3RkOjp0aW1lX3QgX190KQorICAgICAgeworCXR5cGVkZWYgY2hyb25vOjp0aW1lX3BvaW50PHN5c3RlbV9jbG9jaywgc2Vjb25kcz4JX19mcm9tOworCXJldHVybiB0aW1lX3BvaW50X2Nhc3Q8c3lzdGVtX2Nsb2NrOjpkdXJhdGlvbj4KKwkgICAgICAgKF9fZnJvbShjaHJvbm86OnNlY29uZHMoX190KSkpOworICAgICAgfQorICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQ0xPQ0tfTU9OT1RPTklDCisgICAgLy8vIG1vbm90b25pY19jbG9jaworICAgIHN0cnVjdCBtb25vdG9uaWNfY2xvY2sKKyAgICB7CisgICAgICB0eXBlZGVmIGNocm9ubzo6bmFub3NlY29uZHMgCQkJCWR1cmF0aW9uOworICAgICAgdHlwZWRlZiBkdXJhdGlvbjo6cmVwCSAgCQkJCXJlcDsKKyAgICAgIHR5cGVkZWYgZHVyYXRpb246OnBlcmlvZAkgIAkJCQlwZXJpb2Q7CisgICAgICB0eXBlZGVmIGNocm9ubzo6dGltZV9wb2ludDxtb25vdG9uaWNfY2xvY2ssIGR1cmF0aW9uPiAJdGltZV9wb2ludDsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX21vbm90b25pYyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyB0aW1lX3BvaW50CisgICAgICBub3coKTsKKyAgICB9OworI2Vsc2UKKyAgICB0eXBlZGVmIHN5c3RlbV9jbG9jayBtb25vdG9uaWNfY2xvY2s7CisjZW5kaWYKKworICAgIHR5cGVkZWYgc3lzdGVtX2Nsb2NrIGhpZ2hfcmVzb2x1dGlvbl9jbG9jazsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgY2hyb25vCisKKyAgLy8gQH0gZ3JvdXAgY2hyb25vCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy9fR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vX0dMSUJDWFhfQ0hST05PCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NpbnR0eXBlcyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2ludHR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzMzNDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NpbnR0eXBlcwpAQCAtMCwwICsxLDg3IEBACisvLyA8Y2ludHR5cGVzPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2ludHR5cGVzCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NJTlRUWVBFUworI2RlZmluZSBfR0xJQkNYWF9DSU5UVFlQRVMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworLy8gRm9yIDguMTEuMS8xIChzZWUgQzk5LCBOb3RlIDE4NCkKKyNpZiBfR0xJQkNYWF9IQVZFX0lOVFRZUEVTX0gKKyMgaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjICBkZWZpbmUgX1VOREVGX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIGRlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworIyBlbmRpZgorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorIyBpZmRlZiBfVU5ERUZfX1NURENfRk9STUFUX01BQ1JPUworIyAgdW5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIHVuZGVmIF9VTkRFRl9fU1REQ19GT1JNQVRfTUFDUk9TCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfVFIxCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gdHlwZXMKKyAgdXNpbmcgOjppbWF4ZGl2X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6aW1heGFiczsKKworICAvLyBNYXkgY29sbGlkZSB3aXRoIF9Mb25nbG9uZyBhYnMoX0xvbmdsb25nKSwgYW5kIGlzIG5vdCBkZXNjcmliZWQKKyAgLy8gYW55d2hlcmUgb3V0c2lkZSB0aGUgc3lub3BzaXMuICBMaWtlbHksIGEgZGVmZWN0LgorICAvLworICAvLyBpbnRtYXhfdCBhYnMoaW50bWF4X3QpCisKKyAgdXNpbmcgOjppbWF4ZGl2OworCisgIC8vIExpa2V3aXNlLCB3aXRoIGxsZGl2X3QgZGl2KF9Mb25nbG9uZywgX0xvbmdsb25nKS4KKyAgLy8KKyAgLy8gaW1heGRpdl90IGRpdihpbnRtYXhfdCwgaW50bWF4X3QpCisKKyAgdXNpbmcgOjpzdHJ0b2ltYXg7CisgIHVzaW5nIDo6c3RydG91bWF4OworCisjaWYgZGVmaW5lZChfR0xJQkNYWF9VU0VfV0NIQVJfVCkgJiYgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19XQ0hBUl9UX1RSMQorICB1c2luZyA6Ondjc3RvaW1heDsKKyAgdXNpbmcgOjp3Y3N0b3VtYXg7CisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19UUjEKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DSU5UVFlQRVMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2lzbzY0NiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2lzbzY0NgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU5NGFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jaXNvNjQ2CkBAIC0wLDAgKzEsMzQgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjaXNvNjQ2CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgaXNvNjQ2LmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NsaW1pdHMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NsaW1pdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4MGZjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2xpbWl0cwpAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY2xpbWl0cworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIGxpbWl0cy5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMi4yICBJbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzOiBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NMSU1JVFMKKyNkZWZpbmUgX0dMSUJDWFhfQ0xJTUlUUyAxCisKKyNpZm5kZWYgTExPTkdfTUlOCisjZGVmaW5lIExMT05HX01JTiAoLV9fTE9OR19MT05HX01BWF9fIC0gMSkKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01BWAorI2RlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyNlbmRpZgorCisjaWZuZGVmIFVMTE9OR19NQVgKKyNkZWZpbmUgVUxMT05HX01BWCAoX19MT05HX0xPTkdfTUFYX18gKiAyVUxMICsgMSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2xvY2FsZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY2xvY2FsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE2YmZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jbG9jYWxlCkBAIC0wLDAgKzEsNjAgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY2xvY2FsZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIGxvY2FsZS5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMi4yICBJbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzOiBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ0xPQ0FMRQorI2RlZmluZSBfR0xJQkNYWF9DTE9DQUxFIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8bG9jYWxlLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgc2V0bG9jYWxlCisjdW5kZWYgbG9jYWxlY29udgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6bGNvbnY7CisgIHVzaW5nIDo6c2V0bG9jYWxlOworICB1c2luZyA6OmxvY2FsZWNvbnY7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NtYXRoIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jbWF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZThjZDEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jbWF0aApAQCAtMCwwICsxLDE2NDcgQEAKKy8vIC0qLSBDKysgLSotIEMgZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NtYXRoCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgbWF0aC5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjYuNSAgQyBsaWJyYXJ5CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaWZuZGVmIF9HTElCQ1hYX0NNQVRICisjZGVmaW5lIF9HTElCQ1hYX0NNQVRIIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8bWF0aC5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGFicworI3VuZGVmIGRpdgorI3VuZGVmIGFjb3MKKyN1bmRlZiBhc2luCisjdW5kZWYgYXRhbgorI3VuZGVmIGF0YW4yCisjdW5kZWYgY2VpbAorI3VuZGVmIGNvcworI3VuZGVmIGNvc2gKKyN1bmRlZiBleHAKKyN1bmRlZiBmYWJzCisjdW5kZWYgZmxvb3IKKyN1bmRlZiBmbW9kCisjdW5kZWYgZnJleHAKKyN1bmRlZiBsZGV4cAorI3VuZGVmIGxvZworI3VuZGVmIGxvZzEwCisjdW5kZWYgbW9kZgorI3VuZGVmIHBvdworI3VuZGVmIHNpbgorI3VuZGVmIHNpbmgKKyN1bmRlZiBzcXJ0CisjdW5kZWYgdGFuCisjdW5kZWYgdGFuaAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgaW5saW5lIGRvdWJsZQorICBhYnMoZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZhYnMoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBhYnMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2YoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhYnMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGFicyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzKF9feCk7IH0KKworICB1c2luZyA6OmFjb3M7CisKKyAgaW5saW5lIGZsb2F0CisgIGFjb3MoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2YoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhY29zKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhY29zKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2Fjb3MoX194KTsgfQorCisgIHVzaW5nIDo6YXNpbjsKKworICBpbmxpbmUgZmxvYXQKKyAgYXNpbihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGFzaW4obG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgYXNpbihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hc2luKF9feCk7IH0KKworICB1c2luZyA6OmF0YW47CisKKyAgaW5saW5lIGZsb2F0CisgIGF0YW4oZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbmYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhdGFuKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW5sKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhdGFuKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2F0YW4oX194KTsgfQorCisgIHVzaW5nIDo6YXRhbjI7CisKKyAgaW5saW5lIGZsb2F0CisgIGF0YW4yKGZsb2F0IF9feSwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbjJmKF9feSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhdGFuMihsb25nIGRvdWJsZSBfX3ksIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2F0YW4ybChfX3ksIF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgYXRhbjIoX1RwIF9feSwgX1VwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGF0YW4yKF9fdHlwZShfX3kpLCBfX3R5cGUoX194KSk7CisgICAgfQorCisgIHVzaW5nIDo6Y2VpbDsKKworICBpbmxpbmUgZmxvYXQKKyAgY2VpbChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jZWlsZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNlaWwobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2VpbGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNlaWwoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY2VpbChfX3gpOyB9CisKKyAgdXNpbmcgOjpjb3M7CisKKyAgaW5saW5lIGZsb2F0CisgIGNvcyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3NmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29zKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nvc2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNvcyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3MoX194KTsgfQorCisgIHVzaW5nIDo6Y29zaDsKKworICBpbmxpbmUgZmxvYXQKKyAgY29zaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3NoZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvc2gobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29zaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNvc2goX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY29zaChfX3gpOyB9CisKKyAgdXNpbmcgOjpleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGV4cChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZXhwKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHAoX194KTsgfQorCisgIHVzaW5nIDo6ZmFiczsKKworICBpbmxpbmUgZmxvYXQKKyAgZmFicyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZhYnMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmFic2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGZhYnMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZmFicyhfX3gpOyB9CisKKyAgdXNpbmcgOjpmbG9vcjsKKworICBpbmxpbmUgZmxvYXQKKyAgZmxvb3IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmxvb3JmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZmxvb3IobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmxvb3JsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBmbG9vcihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbG9vcihfX3gpOyB9CisKKyAgdXNpbmcgOjpmbW9kOworCisgIGlubGluZSBmbG9hdAorICBmbW9kKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1vZGYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZtb2QobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbW9kbChfX3gsIF9feSk7IH0KKworICB1c2luZyA6OmZyZXhwOworCisgIGlubGluZSBmbG9hdAorICBmcmV4cChmbG9hdCBfX3gsIGludCogX19leHApCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mcmV4cGYoX194LCBfX2V4cCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZnJleHAobG9uZyBkb3VibGUgX194LCBpbnQqIF9fZXhwKQorICB7IHJldHVybiBfX2J1aWx0aW5fZnJleHBsKF9feCwgX19leHApOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgZnJleHAoX1RwIF9feCwgaW50KiBfX2V4cCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZnJleHAoX194LCBfX2V4cCk7IH0KKworICB1c2luZyA6OmxkZXhwOworCisgIGlubGluZSBmbG9hdAorICBsZGV4cChmbG9hdCBfX3gsIGludCBfX2V4cCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xkZXhwZihfX3gsIF9fZXhwKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsZGV4cChsb25nIGRvdWJsZSBfX3gsIGludCBfX2V4cCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xkZXhwbChfX3gsIF9fZXhwKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICBsZGV4cChfVHAgX194LCBpbnQgX19leHApCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZGV4cChfX3gsIF9fZXhwKTsgfQorCisgIHVzaW5nIDo6bG9nOworCisgIGlubGluZSBmbG9hdAorICBsb2coZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxvZyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2dsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2coX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbG9nKF9feCk7IH0KKworICB1c2luZyA6OmxvZzEwOworCisgIGlubGluZSBmbG9hdAorICBsb2cxMChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxMGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsb2cxMChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxMGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzEwKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZzEwKF9feCk7IH0KKworICB1c2luZyA6Om1vZGY7CisKKyAgaW5saW5lIGZsb2F0CisgIG1vZGYoZmxvYXQgX194LCBmbG9hdCogX19pcHRyKQorICB7IHJldHVybiBfX2J1aWx0aW5fbW9kZmYoX194LCBfX2lwdHIpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIG1vZGYobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSogX19pcHRyKQorICB7IHJldHVybiBfX2J1aWx0aW5fbW9kZmwoX194LCBfX2lwdHIpOyB9CisKKyAgdXNpbmcgOjpwb3c7CisKKyAgaW5saW5lIGZsb2F0CisgIHBvdyhmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2YoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHBvdyhsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2woX194LCBfX3kpOyB9CisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAvLyBEUiA1NTAuIFdoYXQgc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiBwb3coZmxvYXQsaW50KSBiZT8KKyAgaW5saW5lIGRvdWJsZQorICBwb3coZG91YmxlIF9feCwgaW50IF9faSkKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2koX194LCBfX2kpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIHBvdyhmbG9hdCBfX3gsIGludCBfX24pCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9wb3dpZihfX3gsIF9fbik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcG93KGxvbmcgZG91YmxlIF9feCwgaW50IF9fbikKKyAgeyByZXR1cm4gX19idWlsdGluX3Bvd2lsKF9feCwgX19uKTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZQorICAgIHBvdyhfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gcG93KF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHVzaW5nIDo6c2luOworCisgIGlubGluZSBmbG9hdAorICBzaW4oZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2luZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNpbihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaW5sKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzaW4oX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2luKF9feCk7IH0KKworICB1c2luZyA6OnNpbmg7CisKKyAgaW5saW5lIGZsb2F0CisgIHNpbmgoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2luaGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzaW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NpbmhsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzaW5oKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3NpbmgoX194KTsgfQorCisgIHVzaW5nIDo6c3FydDsKKworICBpbmxpbmUgZmxvYXQKKyAgc3FydChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zcXJ0ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNxcnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc3FydGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNxcnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc3FydChfX3gpOyB9CisKKyAgdXNpbmcgOjp0YW47CisKKyAgaW5saW5lIGZsb2F0CisgIHRhbihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW5mKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgdGFuKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RhbmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRhbihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW4oX194KTsgfQorCisgIHVzaW5nIDo6dGFuaDsKKworICBpbmxpbmUgZmxvYXQKKyAgdGFuaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90YW5oZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHRhbmgobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdGFuaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRhbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fdGFuaChfX3gpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSAorI2lmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDCisKKy8vIFRoZXNlIGFyZSBwb3NzaWJsZSBtYWNyb3MgaW1wb3J0ZWQgZnJvbSBDOTktbGFuZC4KKyN1bmRlZiBmcGNsYXNzaWZ5CisjdW5kZWYgaXNmaW5pdGUKKyN1bmRlZiBpc2luZgorI3VuZGVmIGlzbmFuCisjdW5kZWYgaXNub3JtYWwKKyN1bmRlZiBzaWduYml0CisjdW5kZWYgaXNncmVhdGVyCisjdW5kZWYgaXNncmVhdGVyZXF1YWwKKyN1bmRlZiBpc2xlc3MKKyN1bmRlZiBpc2xlc3NlcXVhbAorI3VuZGVmIGlzbGVzc2dyZWF0ZXIKKyN1bmRlZiBpc3Vub3JkZXJlZAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICBpbmxpbmUgaW50CisgIGZwY2xhc3NpZnkoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZnBjbGFzc2lmeShGUF9OQU4sIEZQX0lORklOSVRFLCBGUF9OT1JNQUwsCisJCQkJRlBfU1VCTk9STUFMLCBGUF9aRVJPLCBfX3gpOyB9CisKKyAgaW5saW5lIGludAorICBmcGNsYXNzaWZ5KGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQlGUF9TVUJOT1JNQUwsIEZQX1pFUk8sIF9feCk7IH0KKworICBpbmxpbmUgaW50CisgIGZwY2xhc3NpZnkobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZnBjbGFzc2lmeShGUF9OQU4sIEZQX0lORklOSVRFLCBGUF9OT1JNQUwsCisJCQkJRlBfU1VCTk9STUFMLCBGUF9aRVJPLCBfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBmcGNsYXNzaWZ5KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX194ICE9IDAgPyBGUF9OT1JNQUwgOiBGUF9aRVJPOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNmaW5pdGUoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNmaW5pdGUoX194KTsgfQorCisgIGlubGluZSBib29sCisgIGlzZmluaXRlKGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX3gpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNmaW5pdGUobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNmaW5pdGUoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgYm9vbD46Ol9fdHlwZQorICAgIGlzZmluaXRlKF9UcCBfX3gpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGlubGluZSBib29sCisgIGlzaW5mKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzaW5mKF9feCk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc2luZihkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNpbmYoX194KTsgfQorCisgIGlubGluZSBib29sCisgIGlzaW5mKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzaW5mKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGJvb2w+OjpfX3R5cGUKKyAgICBpc2luZihfVHAgX194KQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNuYW4oZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW4oX194KTsgfQorCisgIGlubGluZSBib29sCisgIGlzbmFuKGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3gpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNuYW4obG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNuYW4oX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgYm9vbD46Ol9fdHlwZQorICAgIGlzbmFuKF9UcCBfX3gpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICBpbmxpbmUgYm9vbAorICBpc25vcm1hbChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3gpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNub3JtYWwoZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbm9ybWFsKF9feCk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc25vcm1hbChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBib29sPjo6X190eXBlCisgICAgaXNub3JtYWwoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX3ggIT0gMCA/IHRydWUgOiBmYWxzZTsgfQorCisgIGlubGluZSBib29sCisgIHNpZ25iaXQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3gpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgc2lnbmJpdChkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3gpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgc2lnbmJpdChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zaWduYml0KF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGJvb2w+OjpfX3R5cGUKKyAgICBzaWduYml0KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX194IDwgMCA/IHRydWUgOiBmYWxzZTsgfQorCisgIGlubGluZSBib29sCisgIGlzZ3JlYXRlcihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc2dyZWF0ZXIoZG91YmxlIF9feCwgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc2dyZWF0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXIoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lIHR5cGVuYW1lCisgICAgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwoX19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSksIGJvb2w+OjpfX3R5cGUKKyAgICBpc2dyZWF0ZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNncmVhdGVyZXF1YWwoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3gsIF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc2dyZWF0ZXJlcXVhbChkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNncmVhdGVyZXF1YWwobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXJlcXVhbChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzZ3JlYXRlcmVxdWFsKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXNsZXNzKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9feCwgX195KTsgfQorCisgIGlubGluZSBib29sCisgIGlzbGVzcyhkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9feCwgX195KTsgfQorCisgIGlubGluZSBib29sCisgIGlzbGVzcyhsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzcyhfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzbGVzcyhfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzcyhfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgYm9vbAorICBpc2xlc3NlcXVhbChmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9feCwgX195KTsgfQorCisgIGlubGluZSBib29sCisgIGlzbGVzc2VxdWFsKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NlcXVhbChfX3gsIF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc2xlc3NlcXVhbChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXNsZXNzZXF1YWwoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NlcXVhbChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgYm9vbAorICBpc2xlc3NncmVhdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXNsZXNzZ3JlYXRlcihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc2xlc3NncmVhdGVyKGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsgfQorCisgIGlubGluZSBib29sCisgIGlzbGVzc2dyZWF0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZQorICAgIF9fZ251X2N4eDo6X19lbmFibGVfaWY8KF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUpLCBib29sPjo6X190eXBlCisgICAgaXNsZXNzZ3JlYXRlcihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXN1bm9yZGVyZWQoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3gsIF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBpc3Vub3JkZXJlZChkb3VibGUgX194LCBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faXN1bm9yZGVyZWQoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgaXN1bm9yZGVyZWQobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPChfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlKSwgYm9vbD46Ol9fdHlwZQorICAgIGlzdW5vcmRlcmVkKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXN1bm9yZGVyZWQoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyNlbHNlCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBmcGNsYXNzaWZ5KF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9mcGNsYXNzaWZ5KEZQX05BTiwgRlBfSU5GSU5JVEUsIEZQX05PUk1BTCwKKwkJCQkgIEZQX1NVQk5PUk1BTCwgRlBfWkVSTywgX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzZmluaXRlKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2Zpbml0ZShfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNpbmYoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzaW5mKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc25hbihfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNuYW4oX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbm9ybWFsKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25vcm1hbChfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgc2lnbmJpdChfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5fc2lnbmJpdChfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNncmVhdGVyKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcihfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNncmVhdGVyZXF1YWwoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNncmVhdGVyZXF1YWwoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzcyhfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3MoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzbGVzc2VxdWFsKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2VxdWFsKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2xlc3NncmVhdGVyKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbGVzc2dyZWF0ZXIoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzdW5vcmRlcmVkKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzdW5vcmRlcmVkKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDICovCisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisKKyN1bmRlZiBhY29zaAorI3VuZGVmIGFjb3NoZgorI3VuZGVmIGFjb3NobAorI3VuZGVmIGFzaW5oCisjdW5kZWYgYXNpbmhmCisjdW5kZWYgYXNpbmhsCisjdW5kZWYgYXRhbmgKKyN1bmRlZiBhdGFuaGYKKyN1bmRlZiBhdGFuaGwKKyN1bmRlZiBjYnJ0CisjdW5kZWYgY2JydGYKKyN1bmRlZiBjYnJ0bAorI3VuZGVmIGNvcHlzaWduCisjdW5kZWYgY29weXNpZ25mCisjdW5kZWYgY29weXNpZ25sCisjdW5kZWYgZXJmCisjdW5kZWYgZXJmZgorI3VuZGVmIGVyZmwKKyN1bmRlZiBlcmZjCisjdW5kZWYgZXJmY2YKKyN1bmRlZiBlcmZjbAorI3VuZGVmIGV4cDIKKyN1bmRlZiBleHAyZgorI3VuZGVmIGV4cDJsCisjdW5kZWYgZXhwbTEKKyN1bmRlZiBleHBtMWYKKyN1bmRlZiBleHBtMWwKKyN1bmRlZiBmZGltCisjdW5kZWYgZmRpbWYKKyN1bmRlZiBmZGltbAorI3VuZGVmIGZtYQorI3VuZGVmIGZtYWYKKyN1bmRlZiBmbWFsCisjdW5kZWYgZm1heAorI3VuZGVmIGZtYXhmCisjdW5kZWYgZm1heGwKKyN1bmRlZiBmbWluCisjdW5kZWYgZm1pbmYKKyN1bmRlZiBmbWlubAorI3VuZGVmIGh5cG90CisjdW5kZWYgaHlwb3RmCisjdW5kZWYgaHlwb3RsCisjdW5kZWYgaWxvZ2IKKyN1bmRlZiBpbG9nYmYKKyN1bmRlZiBpbG9nYmwKKyN1bmRlZiBsZ2FtbWEKKyN1bmRlZiBsZ2FtbWFmCisjdW5kZWYgbGdhbW1hbAorI3VuZGVmIGxscmludAorI3VuZGVmIGxscmludGYKKyN1bmRlZiBsbHJpbnRsCisjdW5kZWYgbGxyb3VuZAorI3VuZGVmIGxscm91bmRmCisjdW5kZWYgbGxyb3VuZGwKKyN1bmRlZiBsb2cxcAorI3VuZGVmIGxvZzFwZgorI3VuZGVmIGxvZzFwbAorI3VuZGVmIGxvZzIKKyN1bmRlZiBsb2cyZgorI3VuZGVmIGxvZzJsCisjdW5kZWYgbG9nYgorI3VuZGVmIGxvZ2JmCisjdW5kZWYgbG9nYmwKKyN1bmRlZiBscmludAorI3VuZGVmIGxyaW50ZgorI3VuZGVmIGxyaW50bAorI3VuZGVmIGxyb3VuZAorI3VuZGVmIGxyb3VuZGYKKyN1bmRlZiBscm91bmRsCisjdW5kZWYgbmFuCisjdW5kZWYgbmFuZgorI3VuZGVmIG5hbmwKKyN1bmRlZiBuZWFyYnlpbnQKKyN1bmRlZiBuZWFyYnlpbnRmCisjdW5kZWYgbmVhcmJ5aW50bAorI3VuZGVmIG5leHRhZnRlcgorI3VuZGVmIG5leHRhZnRlcmYKKyN1bmRlZiBuZXh0YWZ0ZXJsCisjdW5kZWYgbmV4dHRvd2FyZAorI3VuZGVmIG5leHR0b3dhcmRmCisjdW5kZWYgbmV4dHRvd2FyZGwKKyN1bmRlZiByZW1haW5kZXIKKyN1bmRlZiByZW1haW5kZXJmCisjdW5kZWYgcmVtYWluZGVybAorI3VuZGVmIHJlbXF1bworI3VuZGVmIHJlbXF1b2YKKyN1bmRlZiByZW1xdW9sCisjdW5kZWYgcmludAorI3VuZGVmIHJpbnRmCisjdW5kZWYgcmludGwKKyN1bmRlZiByb3VuZAorI3VuZGVmIHJvdW5kZgorI3VuZGVmIHJvdW5kbAorI3VuZGVmIHNjYWxibG4KKyN1bmRlZiBzY2FsYmxuZgorI3VuZGVmIHNjYWxibG5sCisjdW5kZWYgc2NhbGJuCisjdW5kZWYgc2NhbGJuZgorI3VuZGVmIHNjYWxibmwKKyN1bmRlZiB0Z2FtbWEKKyN1bmRlZiB0Z2FtbWFmCisjdW5kZWYgdGdhbW1hbAorI3VuZGVmIHRydW5jCisjdW5kZWYgdHJ1bmNmCisjdW5kZWYgdHJ1bmNsCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyB0eXBlcworICB1c2luZyA6OmRvdWJsZV90OworICB1c2luZyA6OmZsb2F0X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6YWNvc2g7CisgIHVzaW5nIDo6YWNvc2hmOworICB1c2luZyA6OmFjb3NobDsKKworICB1c2luZyA6OmFzaW5oOworICB1c2luZyA6OmFzaW5oZjsKKyAgdXNpbmcgOjphc2luaGw7CisKKyAgdXNpbmcgOjphdGFuaDsKKyAgdXNpbmcgOjphdGFuaGY7CisgIHVzaW5nIDo6YXRhbmhsOworCisgIHVzaW5nIDo6Y2JydDsKKyAgdXNpbmcgOjpjYnJ0ZjsKKyAgdXNpbmcgOjpjYnJ0bDsKKworICB1c2luZyA6OmNvcHlzaWduOworICB1c2luZyA6OmNvcHlzaWduZjsKKyAgdXNpbmcgOjpjb3B5c2lnbmw7CisKKyAgdXNpbmcgOjplcmY7CisgIHVzaW5nIDo6ZXJmZjsKKyAgdXNpbmcgOjplcmZsOworCisgIHVzaW5nIDo6ZXJmYzsKKyAgdXNpbmcgOjplcmZjZjsKKyAgdXNpbmcgOjplcmZjbDsKKworICB1c2luZyA6OmV4cDI7CisgIHVzaW5nIDo6ZXhwMmY7CisgIHVzaW5nIDo6ZXhwMmw7CisKKyAgdXNpbmcgOjpleHBtMTsKKyAgdXNpbmcgOjpleHBtMWY7CisgIHVzaW5nIDo6ZXhwbTFsOworCisgIHVzaW5nIDo6ZmRpbTsKKyAgdXNpbmcgOjpmZGltZjsKKyAgdXNpbmcgOjpmZGltbDsKKworICB1c2luZyA6OmZtYTsKKyAgdXNpbmcgOjpmbWFmOworICB1c2luZyA6OmZtYWw7CisKKyAgdXNpbmcgOjpmbWF4OworICB1c2luZyA6OmZtYXhmOworICB1c2luZyA6OmZtYXhsOworCisgIHVzaW5nIDo6Zm1pbjsKKyAgdXNpbmcgOjpmbWluZjsKKyAgdXNpbmcgOjpmbWlubDsKKworICB1c2luZyA6Omh5cG90OworICB1c2luZyA6Omh5cG90ZjsKKyAgdXNpbmcgOjpoeXBvdGw7CisKKyAgdXNpbmcgOjppbG9nYjsKKyAgdXNpbmcgOjppbG9nYmY7CisgIHVzaW5nIDo6aWxvZ2JsOworCisgIHVzaW5nIDo6bGdhbW1hOworICB1c2luZyA6OmxnYW1tYWY7CisgIHVzaW5nIDo6bGdhbW1hbDsKKworICB1c2luZyA6OmxscmludDsKKyAgdXNpbmcgOjpsbHJpbnRmOworICB1c2luZyA6OmxscmludGw7CisKKyAgdXNpbmcgOjpsbHJvdW5kOworICB1c2luZyA6Omxscm91bmRmOworICB1c2luZyA6Omxscm91bmRsOworCisgIHVzaW5nIDo6bG9nMXA7CisgIHVzaW5nIDo6bG9nMXBmOworICB1c2luZyA6OmxvZzFwbDsKKworICB1c2luZyA6OmxvZzI7CisgIHVzaW5nIDo6bG9nMmY7CisgIHVzaW5nIDo6bG9nMmw7CisKKyAgdXNpbmcgOjpsb2diOworICB1c2luZyA6OmxvZ2JmOworICB1c2luZyA6OmxvZ2JsOworCisgIHVzaW5nIDo6bHJpbnQ7CisgIHVzaW5nIDo6bHJpbnRmOworICB1c2luZyA6OmxyaW50bDsKKworICB1c2luZyA6Omxyb3VuZDsKKyAgdXNpbmcgOjpscm91bmRmOworICB1c2luZyA6Omxyb3VuZGw7CisKKyAgdXNpbmcgOjpuYW47CisgIHVzaW5nIDo6bmFuZjsKKyAgdXNpbmcgOjpuYW5sOworCisgIHVzaW5nIDo6bmVhcmJ5aW50OworICB1c2luZyA6Om5lYXJieWludGY7CisgIHVzaW5nIDo6bmVhcmJ5aW50bDsKKworICB1c2luZyA6Om5leHRhZnRlcjsKKyAgdXNpbmcgOjpuZXh0YWZ0ZXJmOworICB1c2luZyA6Om5leHRhZnRlcmw7CisKKyAgdXNpbmcgOjpuZXh0dG93YXJkOworICB1c2luZyA6Om5leHR0b3dhcmRmOworICB1c2luZyA6Om5leHR0b3dhcmRsOworCisgIHVzaW5nIDo6cmVtYWluZGVyOworICB1c2luZyA6OnJlbWFpbmRlcmY7CisgIHVzaW5nIDo6cmVtYWluZGVybDsKKworICB1c2luZyA6OnJlbXF1bzsKKyAgdXNpbmcgOjpyZW1xdW9mOworICB1c2luZyA6OnJlbXF1b2w7CisKKyAgdXNpbmcgOjpyaW50OworICB1c2luZyA6OnJpbnRmOworICB1c2luZyA6OnJpbnRsOworCisgIHVzaW5nIDo6cm91bmQ7CisgIHVzaW5nIDo6cm91bmRmOworICB1c2luZyA6OnJvdW5kbDsKKworICB1c2luZyA6OnNjYWxibG47CisgIHVzaW5nIDo6c2NhbGJsbmY7CisgIHVzaW5nIDo6c2NhbGJsbmw7CisKKyAgdXNpbmcgOjpzY2FsYm47CisgIHVzaW5nIDo6c2NhbGJuZjsKKyAgdXNpbmcgOjpzY2FsYm5sOworCisgIHVzaW5nIDo6dGdhbW1hOworICB1c2luZyA6OnRnYW1tYWY7CisgIHVzaW5nIDo6dGdhbW1hbDsKKworICB1c2luZyA6OnRydW5jOworICB1c2luZyA6OnRydW5jZjsKKyAgdXNpbmcgOjp0cnVuY2w7CisKKyAgLy8vIEFkZGl0aW9uYWwgb3ZlcmxvYWRzLgorICBpbmxpbmUgZmxvYXQKKyAgYWNvc2goZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2hmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYWNvc2gobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYWNvc2hsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhY29zaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaChfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGFzaW5oKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5oZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGFzaW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5obChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgYXNpbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmgoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBhdGFuaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhdGFuaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGF0YW5oKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2F0YW5oKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgY2JydChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYnJ0ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNicnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2JydGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGNicnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fY2JydChfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGNvcHlzaWduKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29weXNpZ25mKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjb3B5c2lnbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2NvcHlzaWdubChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgY29weXNpZ24oX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGNvcHlzaWduKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBlcmYoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVyZihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBlcmYoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgZXJmYyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVyZmMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmY2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGVyZmMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmYyhfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGV4cDIoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMmYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHAyKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cDJsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBleHAyKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cDIoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBleHBtMShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMWYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHBtMShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cG0xKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgZmRpbShmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZkaW1mKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBmZGltKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmRpbWwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlLAorCQkJCSAgICBfVHA+OjpfX3R5cGUsIF9VcD46Ol9fdHlwZQorICAgIGZkaW0oX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZkaW0oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGZtYShmbG9hdCBfX3gsIGZsb2F0IF9feSwgZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1hZihfX3gsIF9feSwgX196KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBmbWEobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3ksIGxvbmcgZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtYWwoX194LCBfX3ksIF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX1ZwPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1ZwPjo6X192YWx1ZSwKKwkJCQkgICAgX1RwPjo6X190eXBlLCBfVXAsIF9WcD46Ol9fdHlwZQorICAgIGZtYShfVHAgX194LCBfVXAgX195LCBfVnAgX196KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzxfVHAsIF9VcCwgX1ZwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbWEoX190eXBlKF9feCksIF9fdHlwZShfX3kpLCBfX3R5cGUoX196KSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBmbWF4KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1heGYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZtYXgobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWF4bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgZm1heChfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1heChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZm1pbihmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtaW5mKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBmbWluKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1pbmwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlLAorCQkJCSAgICBfVHA+OjpfX3R5cGUsIF9VcD46Ol9fdHlwZQorICAgIGZtaW4oX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZtaW4oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGh5cG90KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faHlwb3RmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBoeXBvdChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2h5cG90bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgIGh5cG90KF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBoeXBvdChfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgaW50CisgIGlsb2diKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lsb2diZihfX3gpOyB9CisKKyAgaW5saW5lIGludAorICBpbG9nYihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9pbG9nYmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlsb2diKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2lsb2diKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgbGdhbW1hKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xnYW1tYWYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsZ2FtbWEobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGdhbW1hbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgbGdhbW1hKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xnYW1tYShfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBsbHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyaW50ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBsbHJpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyaW50bChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgbG9uZyBsb25nPjo6X190eXBlCisgICAgbGxyaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xscmludChfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBsbHJvdW5kKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nCisgIGxscm91bmQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbGxyb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nPjo6X190eXBlCisgICAgbGxyb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgbG9nMXAoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXBmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbG9nMXAobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMXBsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2cxcChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcChfX3gpOyB9CisKKyAgLy8gRFIgNTY4LgorICBpbmxpbmUgZmxvYXQKKyAgbG9nMihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cyZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxvZzIobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzIoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbG9nMihfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGxvZ2IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nYmYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsb2diKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZ2JsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBsb2diKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZ2IoX194KTsgfQorCisgIGlubGluZSBsb25nCisgIGxyaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyaW50ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcKKyAgbHJpbnQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nPjo6X190eXBlCisgICAgbHJpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnQoX194KTsgfQorCisgIGlubGluZSBsb25nCisgIGxyb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZworICBscm91bmQobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJvdW5kbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgbG9uZz46Ol9fdHlwZQorICAgIGxyb3VuZChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBuZWFyYnlpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50ZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIG5lYXJieWludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBuZWFyYnlpbnQoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fbmVhcmJ5aW50KF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgbmV4dGFmdGVyKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dGFmdGVyZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbmV4dGFmdGVyKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dGFmdGVybChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgbmV4dGFmdGVyKF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBuZXh0YWZ0ZXIoX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIG5leHR0b3dhcmQoZmxvYXQgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbmV4dHRvd2FyZChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmRsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIG5leHR0b3dhcmQoX1RwIF9feCwgbG9uZyBkb3VibGUgX195KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0dG93YXJkKF9feCwgX195KTsgfQorCisgIGlubGluZSBmbG9hdAorICByZW1haW5kZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1haW5kZXJmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByZW1haW5kZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1haW5kZXJsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSwKKwkJCQkgICAgX1RwPjo6X190eXBlLCBfVXA+OjpfX3R5cGUKKyAgICByZW1haW5kZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHJlbWFpbmRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgcmVtcXVvKGZsb2F0IF9feCwgZmxvYXQgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2YoX194LCBfX3ksIF9fcHF1byk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmVtcXVvKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2woX194LCBfX3ksIF9fcHF1byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgcmVtcXVvKF9UcCBfX3gsIF9VcCBfX3ksIGludCogX19wcXVvKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gcmVtcXVvKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSwgX19wcXVvKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcmludGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByaW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3JpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICByaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JpbnQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICByb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JvdW5kKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgc2NhbGJsbihmbG9hdCBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5mKF9feCwgX19leCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc2NhbGJsbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5sKF9feCwgX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzY2FsYmxuKF9UcCBfX3gsIGxvbmcgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJsbihfX3gsIF9fZXgpOyB9CisgCisgIGlubGluZSBmbG9hdAorICBzY2FsYm4oZmxvYXQgX194LCBpbnQgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibmYoX194LCBfX2V4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzY2FsYm4obG9uZyBkb3VibGUgX194LCBpbnQgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibmwoX194LCBfX2V4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNjYWxibihfVHAgX194LCBpbnQgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJuKF9feCwgX19leCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgdGdhbW1hKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYWYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICB0Z2FtbWEobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdGdhbW1hbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgdGdhbW1hKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYShfX3gpOyB9CisgCisgIGlubGluZSBmbG9hdAorICB0cnVuYyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuY2YoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICB0cnVuYyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuY2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRydW5jKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3RydW5jKF9feCk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NvbXBsZXggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYzQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY29tcGxleApAQCAtMCwwICsxLDE5MzMgQEAKKy8vIFRoZSB0ZW1wbGF0ZSBhbmQgaW5saW5lcyBmb3IgdGhlIC0qLSBDKysgLSotIGNvbXBsZXggbnVtYmVyIGNsYXNzZXMuCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NvbXBsZXgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNi4yICBDb21wbGV4IE51bWJlcnMKKy8vIE5vdGU6IHRoaXMgaXMgbm90IGEgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbi4KKy8vIEluaXRpYWxseSBpbXBsZW1lbnRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPgorLy8gSW1wcm92ZWQgYnkgR2FicmllbCBEb3MgUmVpcyA8ZG9zcmVpc0BjbWxhLmVucy1jYWNoYW4uZnI+CisvLworCisjaWZuZGVmIF9HTElCQ1hYX0NPTVBMRVgKKyNkZWZpbmUgX0dMSUJDWFhfQ09NUExFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jcHBfdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBjb21wbGV4X251bWJlcnMgQ29tcGxleCBOdW1iZXJzCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgY29tcGxleCBudW1iZXJzLgorICAgKiBAeworICAgKi8KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjbGFzcyBjb21wbGV4OworICB0ZW1wbGF0ZTw+IGNsYXNzIGNvbXBsZXg8ZmxvYXQ+OworICB0ZW1wbGF0ZTw+IGNsYXNzIGNvbXBsZXg8ZG91YmxlPjsKKyAgdGVtcGxhdGU8PiBjbGFzcyBjb21wbGV4PGxvbmcgZG91YmxlPjsKKworICAvLy8gIFJldHVybiBtYWduaXR1ZGUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBfVHAgYWJzKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gIFJldHVybiBwaGFzZSBhbmdsZSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IF9UcCBhcmcoY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyAgUmV0dXJuIEBhIHogbWFnbml0dWRlIHNxdWFyZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gX1RwIG5vcm0oY29uc3QgY29tcGxleDxfVHA+Jik7CisKKyAgLy8vICBSZXR1cm4gY29tcGxleCBjb25qdWdhdGUgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gY29uaihjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vICBSZXR1cm4gY29tcGxleCB3aXRoIG1hZ25pdHVkZSBAYSByaG8gYW5kIGFuZ2xlIEBhIHRoZXRhLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb2xhcihjb25zdCBfVHAmLCBjb25zdCBfVHAmID0gMCk7CisKKyAgLy8gVHJhbnNjZW5kZW50YWxzOgorICAvLy8gUmV0dXJuIGNvbXBsZXggY29zaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IGNvcyhjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IGh5cGVyYm9saWMgY29zaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IGNvc2goY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBiYXNlIGUgZXhwb25lbnRpYWwgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gZXhwKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggbmF0dXJhbCBsb2dhcml0aG0gb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gbG9nKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggYmFzZSAxMCBsb2dhcml0aG0gb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gbG9nMTAoY29uc3QgY29tcGxleDxfVHA+Jik7CisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vIERSIDg0NC4KKyAgLy8vIFJldHVybiBAYSB4IHRvIHRoZSBAYSB5J3RoIHBvd2VyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb3coY29uc3QgY29tcGxleDxfVHA+JiwgaW50KTsKKyNlbmRpZgorICAvLy8gUmV0dXJuIEBhIHggdG8gdGhlIEBhIHkndGggcG93ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHBvdyhjb25zdCBjb21wbGV4PF9UcD4mLCBjb25zdCBfVHAmKTsKKyAgLy8vIFJldHVybiBAYSB4IHRvIHRoZSBAYSB5J3RoIHBvd2VyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb3coY29uc3QgY29tcGxleDxfVHA+JiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBAYSB4IHRvIHRoZSBAYSB5J3RoIHBvd2VyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBwb3coY29uc3QgX1RwJiwgY29uc3QgY29tcGxleDxfVHA+Jik7CisgIC8vLyBSZXR1cm4gY29tcGxleCBzaW5lIG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHNpbihjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IGh5cGVyYm9saWMgc2luZSBvZiBAYSB6LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IGNvbXBsZXg8X1RwPiBzaW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggc3F1YXJlIHJvb3Qgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gc3FydChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgLy8vIFJldHVybiBjb21wbGV4IHRhbmdlbnQgb2YgQGEgei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBjb21wbGV4PF9UcD4gdGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYpOworICAvLy8gUmV0dXJuIGNvbXBsZXggaHlwZXJib2xpYyB0YW5nZW50IG9mIEBhIHouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gY29tcGxleDxfVHA+IHRhbmgoY29uc3QgY29tcGxleDxfVHA+Jik7CisgICAgCisgICAgCisgIC8vIDI2LjIuMiAgUHJpbWFyeSB0ZW1wbGF0ZSBjbGFzcyBjb21wbGV4CisgIC8qKgorICAgKiAgVGVtcGxhdGUgdG8gcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycy4KKyAgICoKKyAgICogIFNwZWNpYWxpemF0aW9ucyBmb3IgZmxvYXQsIGRvdWJsZSwgYW5kIGxvbmcgZG91YmxlIGFyZSBwYXJ0IG9mIHRoZQorICAgKiAgbGlicmFyeS4gIFJlc3VsdHMgd2l0aCBhbnkgb3RoZXIgdHlwZSBhcmUgbm90IGd1YXJhbnRlZWQuCisgICAqCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIHJlYWwgYW5kIGltYWdpbmFyeSB2YWx1ZXMuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgY29tcGxleAorICAgIHsKKyAgICAgIC8vLyBWYWx1ZSB0eXBlZGVmLgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorICAgICAgLy8vICBEZWZhdWx0IGNvbnN0cnVjdG9yLiAgRmlyc3QgcGFyYW1ldGVyIGlzIHgsIHNlY29uZCBwYXJhbWV0ZXIgaXMgeS4KKyAgICAgIC8vLyAgVW5zcGVjaWZpZWQgcGFyYW1ldGVycyBkZWZhdWx0IHRvIDAuCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBfVHAmIF9fciA9IF9UcCgpLCBjb25zdCBfVHAmIF9faSA9IF9UcCgpKQorICAgICAgOiBfTV9yZWFsKF9fciksIF9NX2ltYWcoX19pKSB7IH0KKworICAgICAgLy8gTGV0cyB0aGUgY29tcGlsZXIgc3ludGhlc2l6ZSB0aGUgY29weSBjb25zdHJ1Y3RvciAgIAorICAgICAgLy8gY29tcGxleCAoY29uc3QgY29tcGxleDxfVHA+Jik7CisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorCTogX01fcmVhbChfX3oucmVhbCgpKSwgX01faW1hZyhfX3ouaW1hZygpKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIGNvbnN0ZXhwciBfVHAgCisgICAgICByZWFsKCkgY29uc3QgeyByZXR1cm4gX01fcmVhbDsgfQorCisgICAgICBjb25zdGV4cHIgX1RwIAorICAgICAgaW1hZygpIGNvbnN0IHsgcmV0dXJuIF9NX2ltYWc7IH0KKyNlbHNlCisgICAgICAvLy8gIFJldHVybiByZWFsIHBhcnQgb2YgY29tcGxleCBudW1iZXIuCisgICAgICBfVHAmIAorICAgICAgcmVhbCgpIHsgcmV0dXJuIF9NX3JlYWw7IH0KKworICAgICAgLy8vICBSZXR1cm4gcmVhbCBwYXJ0IG9mIGNvbXBsZXggbnVtYmVyLgorICAgICAgY29uc3QgX1RwJiAKKyAgICAgIHJlYWwoKSBjb25zdCB7IHJldHVybiBfTV9yZWFsOyB9CisKKyAgICAgIC8vLyAgUmV0dXJuIGltYWdpbmFyeSBwYXJ0IG9mIGNvbXBsZXggbnVtYmVyLgorICAgICAgX1RwJiAKKyAgICAgIGltYWcoKSB7IHJldHVybiBfTV9pbWFnOyB9CisKKyAgICAgIC8vLyAgUmV0dXJuIGltYWdpbmFyeSBwYXJ0IG9mIGNvbXBsZXggbnVtYmVyLgorICAgICAgY29uc3QgX1RwJiAKKyAgICAgIGltYWcoKSBjb25zdCB7IHJldHVybiBfTV9pbWFnOyB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gRFIgMzg3LiBzdGQ6OmNvbXBsZXggb3Zlci1lbmNhcHN1bGF0ZWQuCisgICAgICB2b2lkIAorICAgICAgcmVhbChfVHAgX192YWwpIHsgX01fcmVhbCA9IF9fdmFsOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBpbWFnKF9UcCBfX3ZhbCkgeyBfTV9pbWFnID0gX192YWw7IH0KKworICAgICAgLy8vIEFzc2lnbiB0aGlzIGNvbXBsZXggbnVtYmVyIHRvIHNjYWxhciBAYSB0LgorICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvcj0oY29uc3QgX1RwJik7CisgICAgICAKKyAgICAgIC8vLyBBZGQgQGEgdCB0byB0aGlzIGNvbXBsZXggbnVtYmVyLgorICAgICAgLy8gMjYuMi41LzEKKyAgICAgIGNvbXBsZXg8X1RwPiYKKyAgICAgIG9wZXJhdG9yKz0oY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX01fcmVhbCArPSBfX3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gU3VidHJhY3QgQGEgdCBmcm9tIHRoaXMgY29tcGxleCBudW1iZXIuCisgICAgICAvLyAyNi4yLjUvMworICAgICAgY29tcGxleDxfVHA+JgorICAgICAgb3BlcmF0b3ItPShjb25zdCBfVHAmIF9fdCkKKyAgICAgIHsKKwlfTV9yZWFsIC09IF9fdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBNdWx0aXBseSB0aGlzIGNvbXBsZXggbnVtYmVyIGJ5IEBhIHQuCisgICAgICBjb21wbGV4PF9UcD4mIG9wZXJhdG9yKj0oY29uc3QgX1RwJik7CisgICAgICAvLy8gRGl2aWRlIHRoaXMgY29tcGxleCBudW1iZXIgYnkgQGEgdC4KKyAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3IvPShjb25zdCBfVHAmKTsKKworICAgICAgLy8gTGV0cyB0aGUgY29tcGlsZXIgc3ludGhlc2l6ZSB0aGUKKyAgICAgIC8vIGNvcHkgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICAgIC8vIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3I9IChjb25zdCBjb21wbGV4PF9UcD4mKTsKKyAgICAgIC8vLyBBc3NpZ24gdGhpcyBjb21wbGV4IG51bWJlciB0byBjb21wbGV4IEBhIHouCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1VwPiYpOworICAgICAgLy8vIEFkZCBAYSB6IHRvIHRoaXMgY29tcGxleCBudW1iZXIuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9VcD4mKTsKKyAgICAgIC8vLyBTdWJ0cmFjdCBAYSB6IGZyb20gdGhpcyBjb21wbGV4IG51bWJlci4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1VwPiYpOworICAgICAgLy8vIE11bHRpcGx5IHRoaXMgY29tcGxleCBudW1iZXIgYnkgQGEgei4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgY29tcGxleDxfVHA+JiBvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1VwPiYpOworICAgICAgLy8vIERpdmlkZSB0aGlzIGNvbXBsZXggbnVtYmVyIGJ5IEBhIHouCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGNvbXBsZXg8X1RwPiYgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9VcD4mKTsKKworICAgICAgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBjb21wbGV4IF9fcmVwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1RwIF9NX3JlYWw7CisgICAgICBfVHAgX01faW1hZzsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX1RwJiBfX3QpCisgICAgeworICAgICBfTV9yZWFsID0gX190OworICAgICBfTV9pbWFnID0gX1RwKCk7CisgICAgIHJldHVybiAqdGhpczsKKyAgICB9IAorCisgIC8vIDI2LjIuNS81CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvcio9KGNvbnN0IF9UcCYgX190KQorICAgIHsKKyAgICAgIF9NX3JlYWwgKj0gX190OworICAgICAgX01faW1hZyAqPSBfX3Q7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIDI2LjIuNS83CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4mCisgICAgY29tcGxleDxfVHA+OjpvcGVyYXRvci89KGNvbnN0IF9UcCYgX190KQorICAgIHsKKyAgICAgIF9NX3JlYWwgLz0gX190OworICAgICAgX01faW1hZyAvPSBfX3Q7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IGNvbXBsZXg8X1VwPiYgX196KQorICAgIHsKKyAgICAgIF9NX3JlYWwgPSBfX3oucmVhbCgpOworICAgICAgX01faW1hZyA9IF9fei5pbWFnKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIDI2LjIuNS85CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3IrPShjb25zdCBjb21wbGV4PF9VcD4mIF9feikKKyAgICB7CisgICAgICBfTV9yZWFsICs9IF9fei5yZWFsKCk7CisgICAgICBfTV9pbWFnICs9IF9fei5pbWFnKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIC8vIDI2LjIuNS8xMQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yLT0oY29uc3QgY29tcGxleDxfVXA+JiBfX3opCisgICAgeworICAgICAgX01fcmVhbCAtPSBfX3oucmVhbCgpOworICAgICAgX01faW1hZyAtPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAvLyAyNi4yLjUvMTMKKyAgLy8gWFhYOiBUaGlzIGlzIGEgZ3JhbW1hciBzY2hvb2wgaW1wbGVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgY29tcGxleDxfVHA+JgorICAgIGNvbXBsZXg8X1RwPjo6b3BlcmF0b3IqPShjb25zdCBjb21wbGV4PF9VcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19yID0gX01fcmVhbCAqIF9fei5yZWFsKCkgLSBfTV9pbWFnICogX196LmltYWcoKTsKKyAgICAgIF9NX2ltYWcgPSBfTV9yZWFsICogX196LmltYWcoKSArIF9NX2ltYWcgKiBfX3oucmVhbCgpOworICAgICAgX01fcmVhbCA9IF9fcjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgLy8gMjYuMi41LzE1CisgIC8vIFhYWDogVGhpcyBpcyBhIGdyYW1tYXIgc2Nob29sIGltcGxlbWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgIGNvbXBsZXg8X1RwPiYKKyAgICBjb21wbGV4PF9UcD46Om9wZXJhdG9yLz0oY29uc3QgY29tcGxleDxfVXA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9fciA9ICBfTV9yZWFsICogX196LnJlYWwoKSArIF9NX2ltYWcgKiBfX3ouaW1hZygpOworICAgICAgY29uc3QgX1RwIF9fbiA9IHN0ZDo6bm9ybShfX3opOworICAgICAgX01faW1hZyA9IChfTV9pbWFnICogX196LnJlYWwoKSAtIF9NX3JlYWwgKiBfX3ouaW1hZygpKSAvIF9fbjsKKyAgICAgIF9NX3JlYWwgPSBfX3IgLyBfX247CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIAorICAvLyBPcGVyYXRvcnM6CisgIC8vQHsKKyAgLy8vICBSZXR1cm4gbmV3IGNvbXBsZXggdmFsdWUgQGEgeCBwbHVzIEBhIHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yICs9IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IrKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBfVHAmIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yICs9IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9UcCYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX195OworICAgICAgX19yICs9IF9feDsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICAvL0B9CisKKyAgLy9AeworICAvLy8gIFJldHVybiBuZXcgY29tcGxleCB2YWx1ZSBAYSB4IG1pbnVzIEBhIHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX19yID0gX194OworICAgICAgX19yIC09IF9feTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLShjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1RwJiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAtPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fcihfX3gsIC1fX3kuaW1hZygpKTsKKyAgICAgIF9fciAtPSBfX3kucmVhbCgpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIC8vQH0KKworICAvL0B7CisgIC8vLyAgUmV0dXJuIG5ldyBjb21wbGV4IHZhbHVlIEBhIHggdGltZXMgQGEgeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvciooY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgKj0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvciooY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgKj0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvciooY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3k7CisgICAgICBfX3IgKj0gX194OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIC8vQH0KKworICAvL0B7CisgIC8vLyAgUmV0dXJuIG5ldyBjb21wbGV4IHZhbHVlIEBhIHggZGl2aWRlZCBieSBAYSB5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yLyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeworICAgICAgY29tcGxleDxfVHA+IF9fciA9IF9feDsKKyAgICAgIF9fciAvPSBfX3k7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci8oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgLz0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBvcGVyYXRvci8oY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3IgPSBfX3g7CisgICAgICBfX3IgLz0gX195OworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisgIC8vQH0KKworICAvLy8gIFJldHVybiBAYSB4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIG9wZXJhdG9yKyhjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKKyAgICB7IHJldHVybiBfX3g7IH0KKworICAvLy8gIFJldHVybiBjb21wbGV4IG5lZ2F0aW9uIG9mIEBhIHguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgb3BlcmF0b3ItKGNvbnN0IGNvbXBsZXg8X1RwPiYgX194KQorICAgIHsgIHJldHVybiBjb21wbGV4PF9UcD4oLV9feC5yZWFsKCksIC1fX3guaW1hZygpKTsgfQorCisgIC8vQHsKKyAgLy8vICBSZXR1cm4gdHJ1ZSBpZiBAYSB4IGlzIGVxdWFsIHRvIEBhIHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3gucmVhbCgpID09IF9feS5yZWFsKCkgJiYgX194LmltYWcoKSA9PSBfX3kuaW1hZygpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsgcmV0dXJuIF9feC5yZWFsKCkgPT0gX195ICYmIF9feC5pbWFnKCkgPT0gX1RwKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX194ID09IF9feS5yZWFsKCkgJiYgX1RwKCkgPT0gX195LmltYWcoKTsgfQorICAvL0B9CisKKyAgLy9AeworICAvLy8gIFJldHVybiBmYWxzZSBpZiBAYSB4IGlzIGVxdWFsIHRvIEBhIHkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3gucmVhbCgpICE9IF9feS5yZWFsKCkgfHwgX194LmltYWcoKSAhPSBfX3kuaW1hZygpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsgcmV0dXJuIF9feC5yZWFsKCkgIT0gX195IHx8IF9feC5pbWFnKCkgIT0gX1RwKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUiBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfVHAmIF9feCwgY29uc3QgY29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gX194ICE9IF9feS5yZWFsKCkgfHwgX1RwKCkgIT0gX195LmltYWcoKTsgfQorICAvL0B9CisKKyAgLy8vICBFeHRyYWN0aW9uIG9wZXJhdG9yIGZvciBjb21wbGV4IHZhbHVlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBjb21wbGV4PF9UcD4mIF9feCkKKyAgICB7CisgICAgICBfVHAgX19yZV94LCBfX2ltX3g7CisgICAgICBfQ2hhclQgX19jaDsKKyAgICAgIF9faXMgPj4gX19jaDsKKyAgICAgIGlmIChfX2NoID09ICcoJykgCisJeworCSAgX19pcyA+PiBfX3JlX3ggPj4gX19jaDsKKwkgIGlmIChfX2NoID09ICcsJykgCisJICAgIHsKKwkgICAgICBfX2lzID4+IF9faW1feCA+PiBfX2NoOworCSAgICAgIGlmIChfX2NoID09ICcpJykgCisJCV9feCA9IGNvbXBsZXg8X1RwPihfX3JlX3gsIF9faW1feCk7CisJICAgICAgZWxzZQorCQlfX2lzLnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwkgICAgfQorCSAgZWxzZSBpZiAoX19jaCA9PSAnKScpIAorCSAgICBfX3ggPSBfX3JlX3g7CisJICBlbHNlCisJICAgIF9faXMuc2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCX0KKyAgICAgIGVsc2UgCisJeworCSAgX19pcy5wdXRiYWNrKF9fY2gpOworCSAgX19pcyA+PiBfX3JlX3g7CisJICBfX3ggPSBfX3JlX3g7CisJfQorICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIC8vLyAgSW5zZXJ0aW9uIG9wZXJhdG9yIGZvciBjb21wbGV4IHZhbHVlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgICAgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBjb25zdCBjb21wbGV4PF9UcD4mIF9feCkKKyAgICB7CisgICAgICBiYXNpY19vc3RyaW5nc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gX19zOworICAgICAgX19zLmZsYWdzKF9fb3MuZmxhZ3MoKSk7CisgICAgICBfX3MuaW1idWUoX19vcy5nZXRsb2MoKSk7CisgICAgICBfX3MucHJlY2lzaW9uKF9fb3MucHJlY2lzaW9uKCkpOworICAgICAgX19zIDw8ICcoJyA8PCBfX3gucmVhbCgpIDw8ICcsJyA8PCBfX3guaW1hZygpIDw8ICcpJzsKKyAgICAgIHJldHVybiBfX29zIDw8IF9fcy5zdHIoKTsKKyAgICB9CisKKyAgLy8gVmFsdWVzCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdGV4cHIgX1RwCisgICAgcmVhbChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3oucmVhbCgpOyB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3RleHByIF9UcAorICAgIGltYWcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX196LmltYWcoKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAmCisgICAgcmVhbChjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3oucmVhbCgpOyB9CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29uc3QgX1RwJgorICAgIHJlYWwoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX196LnJlYWwoKTsgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcCYKKyAgICBpbWFnKGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fei5pbWFnKCk7IH0KKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAmCisgICAgaW1hZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX3ouaW1hZygpOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjcvMyBhYnMoX196KTogIFJldHVybnMgdGhlIG1hZ25pdHVkZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19jb21wbGV4X2Ficyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX3kgPSBfX3ouaW1hZygpOworICAgICAgY29uc3QgX1RwIF9fcyA9IHN0ZDo6bWF4KGFicyhfX3gpLCBhYnMoX195KSk7CisgICAgICBpZiAoX19zID09IF9UcCgpKSAgLy8gd2VsbCAuLi4KKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgIF9feCAvPSBfX3M7IAorICAgICAgX195IC89IF9fczsKKyAgICAgIHJldHVybiBfX3MgKiBzcXJ0KF9feCAqIF9feCArIF9feSAqIF9feSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBmbG9hdAorICBfX2NvbXBsZXhfYWJzKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2NhYnNmKF9feik7IH0KKworICBpbmxpbmUgZG91YmxlCisgIF9fY29tcGxleF9hYnMoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2NhYnMoX196KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYWJzKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWJzbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhYnMoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9hYnMoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIGFicyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2FicyhfX3opOyB9CisjZW5kaWYgIAorCisKKyAgLy8gMjYuMi43LzQ6IGFyZyhfX3opOiBSZXR1cm5zIHRoZSBwaGFzZSBhbmdsZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19jb21wbGV4X2FyZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiAgYXRhbjIoX196LmltYWcoKSwgX196LnJlYWwoKSk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgZmxvYXQKKyAgX19jb21wbGV4X2FyZyhfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXJnZihfX3opOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBfX2NvbXBsZXhfYXJnKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXJnKF9feik7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FyZyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FyZ2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgYXJnKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfYXJnKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBhcmcoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9hcmcoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi43LzU6IG5vcm0oX196KSByZXR1cm5zIHRoZSBzcXVhcmVkIG1hZ25pdHVkZSBvZiBfX3ouCisgIC8vICAgICBBcyBkZWZpbmVkLCBub3JtKCkgaXMgLW5vdC0gYSBub3JtIGlzIHRoZSBjb21tb24gbWF0aGVtYXRpY2FsCisgIC8vICAgICBzZW5zIHVzZWQgaW4gbnVtZXJpY3MuICBUaGUgaGVscGVyIGNsYXNzIF9Ob3JtX2hlbHBlcjw+IHRyaWVzIHRvCisgIC8vICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJ1aWx0aW4gZmxvYXRpbmcgcG9pbnQgYW5kIHRoZSByZXN0LCBzbyBhcworICAvLyAgICAgdG8gZGVsaXZlciBhbiBhbnN3ZXIgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHJlYWwgdmFsdWUuCisgIHRlbXBsYXRlPGJvb2w+CisgICAgc3RydWN0IF9Ob3JtX2hlbHBlcgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIGlubGluZSBfVHAgX1NfZG9faXQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgICAgICBjb25zdCBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgICAgICByZXR1cm4gX194ICogX194ICsgX195ICogX195OworICAgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9Ob3JtX2hlbHBlcjx0cnVlPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIGlubGluZSBfVHAgX1NfZG9faXQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19yZXMgPSBzdGQ6OmFicyhfX3opOworICAgICAgICAgIHJldHVybiBfX3JlcyAqIF9fcmVzOworICAgICAgICB9CisgICAgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgbm9ybShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICByZXR1cm4gX05vcm1faGVscGVyPF9faXNfZmxvYXRpbmc8X1RwPjo6X192YWx1ZSAKKwkmJiAhX0dMSUJDWFhfRkFTVF9NQVRIPjo6X1NfZG9faXQoX196KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBwb2xhcihjb25zdCBfVHAmIF9fcmhvLCBjb25zdCBfVHAmIF9fdGhldGEpCisgICAgeyByZXR1cm4gY29tcGxleDxfVHA+KF9fcmhvICogY29zKF9fdGhldGEpLCBfX3JobyAqIHNpbihfX3RoZXRhKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvbmooY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gY29tcGxleDxfVHA+KF9fei5yZWFsKCksIC1fX3ouaW1hZygpKTsgfQorICAKKyAgLy8gVHJhbnNjZW5kZW50YWxzCisKKyAgLy8gMjYuMi44LzEgY29zKF9feik6ICBSZXR1cm5zIHRoZSBjb3NpbmUgb2YgX196LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9jb3MoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBjb25zdCBfVHAgX195ID0gX196LmltYWcoKTsKKyAgICAgIHJldHVybiBjb21wbGV4PF9UcD4oY29zKF9feCkgKiBjb3NoKF9feSksIC1zaW4oX194KSAqIHNpbmgoX195KSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfY29zKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2Njb3NmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9jb3MoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2Njb3MoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfY29zKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBjb3MoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9jb3MoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvcyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2NvcyhfX3opOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjgvMiBjb3NoKF9feik6IFJldHVybnMgdGhlIGh5cGVyYm9saWMgY29zaW5lIG9mIF9fei4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfY29zaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3kgPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihjb3NoKF9feCkgKiBjb3MoX195KSwgc2luaChfX3gpICogc2luKF9feSkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2Nvc2goX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY2Nvc2hmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9jb3NoKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9jb3NoKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jY29zaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgY29zaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2Nvc2goX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGNvc2goY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9jb3NoKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuOC8zIGV4cChfX3opOiBSZXR1cm5zIHRoZSBjb21wbGV4IGJhc2UgZSBleHBvbmVudGlhbCBvZiB4CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2V4cChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBzdGQ6OnBvbGFyKGV4cChfX3oucmVhbCgpKSwgX196LmltYWcoKSk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2V4cChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jZXhwZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfZXhwKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jZXhwKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2V4cChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2V4cGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgZXhwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfZXhwKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBleHAoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9leHAoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi44LzUgbG9nKF9feik6IFJldHVybnMgdGhlIG5hdHVyYWwgY29tcGxleCBsb2dhcml0aG0gb2YgX196LgorICAvLyAgICAgICAgICAgICAgICAgICAgVGhlIGJyYW5jaCBjdXQgaXMgYWxvbmcgdGhlIG5lZ2F0aXZlIGF4aXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2xvZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBjb21wbGV4PF9UcD4obG9nKHN0ZDo6YWJzKF9feikpLCBzdGQ6OmFyZyhfX3opKTsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfbG9nKF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2Nsb2dmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9sb2coX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2Nsb2coX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfbG9nKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jbG9nbChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBsb2coY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9sb2coX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGxvZyhjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X2xvZyhfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIGxvZzEwKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6bG9nKF9feikgLyBsb2coX1RwKDEwLjApKTsgfQorCisgIC8vIDI2LjIuOC8xMCBzaW4oX196KTogUmV0dXJucyB0aGUgc2luZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3Npbihjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3kgPSBfX3ouaW1hZygpOworICAgICAgcmV0dXJuIGNvbXBsZXg8X1RwPihzaW4oX194KSAqIGNvc2goX195KSwgY29zKF9feCkgKiBzaW5oKF9feSkpOyAKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9zaW4oX19jb21wbGV4X18gZmxvYXQgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NpbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3NpbihfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NpbihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9zaW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NzaW5sKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHNpbihjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NpbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgc2luKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc2luKF9feik7IH0KKyNlbmRpZgorCisgIC8vIDI2LjIuOC8xMSBzaW5oKF9feik6IFJldHVybnMgdGhlIGh5cGVyYm9saWMgc2luZSBvZiBfX3ouCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3NpbmgoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9feCA9IF9fei5yZWFsKCk7CisgICAgICBjb25zdCBfVHAgIF9feSA9IF9fei5pbWFnKCk7CisgICAgICByZXR1cm4gY29tcGxleDxfVHA+KHNpbmgoX194KSAqIGNvcyhfX3kpLCBjb3NoKF9feCkgKiBzaW4oX195KSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfc2luaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jc2luaGYoX196KTsgfSAgICAgIAorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3NpbmgoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2NzaW5oKF9feik7IH0gICAgICAKKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3NpbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NzaW5obChfX3opOyB9ICAgICAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBzaW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc2luaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgc2luaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3NpbmgoX196KTsgfQorI2VuZGlmCisKKyAgLy8gMjYuMi44LzEzIHNxcnQoX196KTogUmV0dXJucyB0aGUgY29tcGxleCBzcXVhcmUgcm9vdCBvZiBfX3ouCisgIC8vICAgICAgICAgICAgICAgICAgICAgVGhlIGJyYW5jaCBjdXQgaXMgb24gdGhlIG5lZ2F0aXZlIGF4aXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfc3FydChjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBfVHAgX194ID0gX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX3kgPSBfX3ouaW1hZygpOworCisgICAgICBpZiAoX194ID09IF9UcCgpKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdCA9IHNxcnQoYWJzKF9feSkgLyAyKTsKKyAgICAgICAgICByZXR1cm4gY29tcGxleDxfVHA+KF9fdCwgX195IDwgX1RwKCkgPyAtX190IDogX190KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdCA9IHNxcnQoMiAqIChzdGQ6OmFicyhfX3opICsgYWJzKF9feCkpKTsKKyAgICAgICAgICBfVHAgX191ID0gX190IC8gMjsKKyAgICAgICAgICByZXR1cm4gX194ID4gX1RwKCkKKyAgICAgICAgICAgID8gY29tcGxleDxfVHA+KF9fdSwgX195IC8gX190KQorICAgICAgICAgICAgOiBjb21wbGV4PF9UcD4oYWJzKF9feSkgLyBfX3QsIF9feSA8IF9UcCgpID8gLV9fdSA6IF9fdSk7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9zcXJ0KF9fY29tcGxleF9fIGZsb2F0IF9feikgeyByZXR1cm4gX19idWlsdGluX2NzcXJ0ZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfc3FydChfX2NvbXBsZXhfXyBkb3VibGUgX196KSB7IHJldHVybiBfX2J1aWx0aW5fY3NxcnQoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfc3FydChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3NxcnRsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIHNxcnQoY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF9zcXJ0KF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBzcXJ0KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfc3FydChfX3opOyB9CisjZW5kaWYKKworICAvLyAyNi4yLjgvMTQgdGFuKF9feik6ICBSZXR1cm4gdGhlIGNvbXBsZXggdGFuZ2VudCBvZiBfX3ouCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF90YW4oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjpzaW4oX196KSAvIHN0ZDo6Y29zKF9feik7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X3RhbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfdGFuKF9fY29tcGxleF9fIGRvdWJsZSBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3Rhbihjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3RhbmwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgdGFuKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfdGFuKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICB0YW4oY29uc3QgY29tcGxleDxfVHA+JiBfX3opIHsgcmV0dXJuIF9fY29tcGxleF90YW4oX196KTsgfQorI2VuZGlmCisKKworICAvLyAyNi4yLjgvMTUgdGFuaChfX3opOiAgUmV0dXJucyB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIF9fei4KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X3RhbmgoY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjpzaW5oKF9feikgLyBzdGQ6OmNvc2goX196KTsgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfdGFuaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opIHsgcmV0dXJuIF9fYnVpbHRpbl9jdGFuaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X3RhbmgoX19jb21wbGV4X18gZG91YmxlIF9feikgeyByZXR1cm4gX19idWlsdGluX2N0YW5oKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X3RhbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2N0YW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICB0YW5oKGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KSB7IHJldHVybiBfX2NvbXBsZXhfdGFuaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgdGFuaChjb25zdCBjb21wbGV4PF9UcD4mIF9feikgeyByZXR1cm4gX19jb21wbGV4X3RhbmgoX196KTsgfQorI2VuZGlmCisKKworICAvLyAyNi4yLjgvOSAgcG93KF9feCwgX195KTogUmV0dXJucyB0aGUgY29tcGxleCBwb3dlciBiYXNlIG9mIF9feAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VkIHRvIHRoZSBfX3ktdGggcG93ZXIuICBUaGUgYnJhbmNoCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQgaXMgb24gdGhlIG5lZ2F0aXZlIGF4aXMuCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfcG93X3Vuc2lnbmVkKGNvbXBsZXg8X1RwPiBfX3gsIHVuc2lnbmVkIF9fbikKKyAgICB7CisgICAgICBjb21wbGV4PF9UcD4gX195ID0gX19uICUgMiA/IF9feCA6IGNvbXBsZXg8X1RwPigxKTsKKworICAgICAgd2hpbGUgKF9fbiA+Pj0gMSkKKyAgICAgICAgeworICAgICAgICAgIF9feCAqPSBfX3g7CisgICAgICAgICAgaWYgKF9fbiAlIDIpCisgICAgICAgICAgICBfX3kgKj0gX194OworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX3k7CisgICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gRFIgODQ0LiBjb21wbGV4IHBvdyByZXR1cm4gdHlwZSBpcyBhbWJpZ3VvdXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196LCBpbnQgX19uKQorICAgIHsKKyAgICAgIHJldHVybiBfX24gPCAwCisgICAgICAgID8gY29tcGxleDxfVHA+KDEpIC8gc3RkOjpfX2NvbXBsZXhfcG93X3Vuc2lnbmVkKF9feiwgLV9fbikKKyAgICAgICAgOiBzdGQ6Ol9fY29tcGxleF9wb3dfdW5zaWduZWQoX196LCBfX24pOworICAgIH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3QgY29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsKKyNpZm5kZWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYCisgICAgICBpZiAoX194ID09IF9UcCgpKQorCXJldHVybiBfVHAoKTsKKyNlbmRpZgorICAgICAgaWYgKF9feC5pbWFnKCkgPT0gX1RwKCkgJiYgX194LnJlYWwoKSA+IF9UcCgpKQorICAgICAgICByZXR1cm4gcG93KF9feC5yZWFsKCksIF9feSk7CisKKyAgICAgIGNvbXBsZXg8X1RwPiBfX3QgPSBzdGQ6OmxvZyhfX3gpOworICAgICAgcmV0dXJuIHN0ZDo6cG9sYXIoZXhwKF9feSAqIF9fdC5yZWFsKCkpLCBfX3kgKiBfX3QuaW1hZygpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX3ggPT0gX1RwKCkgPyBfVHAoKSA6IHN0ZDo6ZXhwKF9feSAqIHN0ZDo6bG9nKF9feCkpOyB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVgKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9wb3coX19jb21wbGV4X18gZmxvYXQgX194LCBfX2NvbXBsZXhfXyBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcG93ZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9wb3coX19jb21wbGV4X18gZG91YmxlIF9feCwgX19jb21wbGV4X18gZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nwb3coX194LCBfX3kpOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9wb3coY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feCwKKwkJY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2Nwb3dsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfcG93KF9feC5fX3JlcCgpLCBfX3kuX19yZXAoKSk7IH0KKyNlbHNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgY29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IGNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBjb21wbGV4PF9UcD4mIF9feSkKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfcG93KF9feCwgX195KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IGNvbXBsZXg8X1RwPiYgX195KQorICAgIHsKKyAgICAgIHJldHVybiBfX3ggPiBfVHAoKSA/IHN0ZDo6cG9sYXIocG93KF9feCwgX195LnJlYWwoKSksCisJCQkJICAgICAgX195LmltYWcoKSAqIGxvZyhfX3gpKQorCSAgICAgICAgICAgICAgICAgOiBzdGQ6OnBvdyhjb21wbGV4PF9UcD4oX194KSwgX195KTsKKyAgICB9CisKKyAgLy8gMjYuMi4zICBjb21wbGV4IHNwZWNpYWxpemF0aW9ucworICAvLyBjb21wbGV4PGZsb2F0PiBzcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGNvbXBsZXg8ZmxvYXQ+CisgICAgeworICAgICAgdHlwZWRlZiBmbG9hdCB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBmbG9hdCBfQ29tcGxleFQ7CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KF9Db21wbGV4VCBfX3opIDogX01fdmFsdWUoX196KSB7IH0KKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoZmxvYXQgX19yID0gMC4wZiwgZmxvYXQgX19pID0gMC4wZikKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLy8gVGhlIGxpc3QtaW5pdGlhbGl6YXRpb24gZXh0ZW5zaW9uIHRvIF9fY29tcGxleF9fIHR5cGVzIGlzCisgICAgICAvLyBub3QgYXZhaWxhYmxlIGluIEdDQyA0LjYuICBUaHVzIGxpYnN0ZGMrKy80ODc2MCBjYW5ub3QgYmUKKyAgICAgIC8vIGZpeGVkIGluIEMrKzB4IG1vZGUsIHVuZm9ydHVuYXRlbHkuCisgICAgICA6IF9NX3ZhbHVlKF9fciArIF9faSAqIDEuMGZpKSB7IH0KKyNlbHNlCisgICAgICB7CisJX19yZWFsX18gX01fdmFsdWUgPSBfX3I7CisJX19pbWFnX18gX01fdmFsdWUgPSBfX2k7CisgICAgICB9CisjZW5kaWYKKworICAgICAgZXhwbGljaXQgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisgICAgICBleHBsaWNpdCBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwkKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIGNvbnN0ZXhwciBmbG9hdCAKKyAgICAgIHJlYWwoKSBjb25zdCB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdGV4cHIgZmxvYXQgCisgICAgICBpbWFnKCkgY29uc3QgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbHNlCisgICAgICBmbG9hdCYgCisgICAgICByZWFsKCkgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgZmxvYXQmIAorICAgICAgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9ICAgICAgCisKKyAgICAgIGZsb2F0JiAKKyAgICAgIGltYWcoKSB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdCBmbG9hdCYgCisgICAgICBpbWFnKCkgY29uc3QgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIHZvaWQgCisgICAgICByZWFsKGZsb2F0IF9fdmFsKSB7IF9fcmVhbF9fIF9NX3ZhbHVlID0gX192YWw7IH0KKworICAgICAgdm9pZCAKKyAgICAgIGltYWcoZmxvYXQgX192YWwpIHsgX19pbWFnX18gX01fdmFsdWUgPSBfX3ZhbDsgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3I9KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSA9IF9fZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcis9KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSArPSBfX2Y7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3ItPShmbG9hdCBfX2YpCisgICAgICB7CisJX01fdmFsdWUgLT0gX19mOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yKj0oZmxvYXQgX19mKQorICAgICAgeworCV9NX3ZhbHVlICo9IF9fZjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvci89KGZsb2F0IF9fZikKKyAgICAgIHsKKwlfTV92YWx1ZSAvPSBfX2Y7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBMZXQgdGhlIGNvbXBpbGVyIHN5bnRoZXNpemUgdGhlIGNvcHkgYW5kIGFzc2lnbm1lbnQKKyAgICAgIC8vIG9wZXJhdG9yLiAgSXQgYWx3YXlzIGRvZXMgYSBwcmV0dHkgZ29vZCBqb2IuCisgICAgICAvLyBjb21wbGV4JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleCYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9UcD4mICBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcis9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlICs9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSArPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvci09KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9fcmVhbF9fIF9NX3ZhbHVlIC09IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSAtPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9Db21wbGV4VCBfX3Q7CisJICBfX3JlYWxfXyBfX3QgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX190ID0gX196LmltYWcoKTsKKwkgIF9NX3ZhbHVlICo9IF9fdDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICAgICAgY29tcGxleCYKKyAgICAgICAgb3BlcmF0b3IvPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfQ29tcGxleFQgX190OworCSAgX19yZWFsX18gX190ID0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9fdCA9IF9fei5pbWFnKCk7CisJICBfTV92YWx1ZSAvPSBfX3Q7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIF9Db21wbGV4VCBfX3JlcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0NvbXBsZXhUIF9NX3ZhbHVlOworICAgIH07CisKKyAgLy8gMjYuMi4zICBjb21wbGV4IHNwZWNpYWxpemF0aW9ucworICAvLyBjb21wbGV4PGRvdWJsZT4gc3BlY2lhbGl6YXRpb24KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBjb21wbGV4PGRvdWJsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfX2NvbXBsZXhfXyBkb3VibGUgX0NvbXBsZXhUOworCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChfQ29tcGxleFQgX196KSA6IF9NX3ZhbHVlKF9feikgeyB9CisKKyAgICAgIF9HTElCQ1hYX0NPTlNURVhQUiBjb21wbGV4KGRvdWJsZSBfX3IgPSAwLjAsIGRvdWJsZSBfX2kgPSAwLjApCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8vIFRoZSBsaXN0LWluaXRpYWxpemF0aW9uIGV4dGVuc2lvbiB0byBfX2NvbXBsZXhfXyB0eXBlcyBpcworICAgICAgLy8gbm90IGF2YWlsYWJsZSBpbiBHQ0MgNC42LiAgVGh1cyBsaWJzdGRjKysvNDg3NjAgY2Fubm90IGJlCisgICAgICAvLyBmaXhlZCBpbiBDKysweCBtb2RlLCB1bmZvcnR1bmF0ZWx5LgorICAgICAgOiBfTV92YWx1ZShfX3IgKyBfX2kgKiAxLjBpKSB7IH0KKyNlbHNlCisgICAgICB7CisJX19yZWFsX18gX01fdmFsdWUgPSBfX3I7CisJX19pbWFnX18gX01fdmFsdWUgPSBfX2k7CisgICAgICB9CisjZW5kaWYKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgICAgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgICAgICBleHBsaWNpdCBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGxvbmcgZG91YmxlPiYpOwkKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIGNvbnN0ZXhwciBkb3VibGUgCisgICAgICByZWFsKCkgY29uc3QgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3RleHByIGRvdWJsZSAKKyAgICAgIGltYWcoKSBjb25zdCB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorI2Vsc2UKKyAgICAgIGRvdWJsZSYgCisgICAgICByZWFsKCkgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgY29uc3QgZG91YmxlJiAKKyAgICAgIHJlYWwoKSBjb25zdCB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBkb3VibGUmIAorICAgICAgaW1hZygpIHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0IGRvdWJsZSYgCisgICAgICBpbWFnKCkgY29uc3QgeyByZXR1cm4gX19pbWFnX18gX01fdmFsdWU7IH0KKyNlbmRpZgorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiAzODcuIHN0ZDo6Y29tcGxleCBvdmVyLWVuY2Fwc3VsYXRlZC4KKyAgICAgIHZvaWQgCisgICAgICByZWFsKGRvdWJsZSBfX3ZhbCkgeyBfX3JlYWxfXyBfTV92YWx1ZSA9IF9fdmFsOyB9CisKKyAgICAgIHZvaWQgCisgICAgICBpbWFnKGRvdWJsZSBfX3ZhbCkgeyBfX2ltYWdfXyBfTV92YWx1ZSA9IF9fdmFsOyB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcj0oZG91YmxlIF9fZCkKKyAgICAgIHsKKwlfTV92YWx1ZSA9IF9fZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcis9KGRvdWJsZSBfX2QpCisgICAgICB7CisJX01fdmFsdWUgKz0gX19kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKwkKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvci09KGRvdWJsZSBfX2QpCisgICAgICB7CisJX01fdmFsdWUgLT0gX19kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yKj0oZG91YmxlIF9fZCkKKyAgICAgIHsKKwlfTV92YWx1ZSAqPSBfX2Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IvPShkb3VibGUgX19kKQorICAgICAgeworCV9NX3ZhbHVlIC89IF9fZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBjb21waWxlciB3aWxsIHN5bnRoZXNpemUgdGhpcywgZWZmaWNpZW50bHkuCisgICAgICAvLyBjb21wbGV4JiBvcGVyYXRvcj0oY29uc3QgY29tcGxleCYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfTV92YWx1ZSA9IF9fei5pbWFnKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yKz0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgKz0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlICs9IF9fei5pbWFnKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yLT0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgLT0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlIC09IF9fei5pbWFnKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisgICAgICAgIG9wZXJhdG9yKj0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX0NvbXBsZXhUIF9fdDsKKwkgIF9fcmVhbF9fIF9fdCA9IF9fei5yZWFsKCk7CisJICBfX2ltYWdfXyBfX3QgPSBfX3ouaW1hZygpOworCSAgX01fdmFsdWUgKj0gX190OworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvci89KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9Db21wbGV4VCBfX3Q7CisJICBfX3JlYWxfXyBfX3QgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX190ID0gX196LmltYWcoKTsKKwkgIF9NX3ZhbHVlIC89IF9fdDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgX0NvbXBsZXhUIF9fcmVwKCkgY29uc3QgeyByZXR1cm4gX01fdmFsdWU7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfQ29tcGxleFQgX01fdmFsdWU7CisgICAgfTsKKworICAvLyAyNi4yLjMgIGNvbXBsZXggc3BlY2lhbGl6YXRpb25zCisgIC8vIGNvbXBsZXg8bG9uZyBkb3VibGU+IHNwZWNpYWxpemF0aW9uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgY29tcGxleDxsb25nIGRvdWJsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fY29tcGxleF9fIGxvbmcgZG91YmxlIF9Db21wbGV4VDsKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoX0NvbXBsZXhUIF9feikgOiBfTV92YWx1ZShfX3opIHsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChsb25nIGRvdWJsZSBfX3IgPSAwLjBMLCAKKwkJCQkgbG9uZyBkb3VibGUgX19pID0gMC4wTCkKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLy8gVGhlIGxpc3QtaW5pdGlhbGl6YXRpb24gZXh0ZW5zaW9uIHRvIF9fY29tcGxleF9fIHR5cGVzIGlzCisgICAgICAvLyBub3QgYXZhaWxhYmxlIGluIEdDQyA0LjYuICBUaHVzIGxpYnN0ZGMrKy80ODc2MCBjYW5ub3QgYmUKKyAgICAgIC8vIGZpeGVkIGluIEMrKzB4IG1vZGUsIHVuZm9ydHVuYXRlbHkuCisgICAgICA6IF9NX3ZhbHVlKF9fciArIF9faSAqIDEuMExpKSB7IH0KKyNlbHNlCisgICAgICB7CisJX19yZWFsX18gX01fdmFsdWUgPSBfX3I7CisJX19pbWFnX18gX01fdmFsdWUgPSBfX2k7CisgICAgICB9CisjZW5kaWYKKworICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbXBsZXgoY29uc3QgY29tcGxleDxmbG9hdD4mIF9feikKKyAgICAgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgY29tcGxleChjb25zdCBjb21wbGV4PGRvdWJsZT4mIF9feikKKyAgICAgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDM4Ny4gc3RkOjpjb21wbGV4IG92ZXItZW5jYXBzdWxhdGVkLgorICAgICAgY29uc3RleHByIGxvbmcgZG91YmxlIAorICAgICAgcmVhbCgpIGNvbnN0IHsgcmV0dXJuIF9fcmVhbF9fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0ZXhwciBsb25nIGRvdWJsZSAKKyAgICAgIGltYWcoKSBjb25zdCB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorI2Vsc2UKKyAgICAgIGxvbmcgZG91YmxlJiAKKyAgICAgIHJlYWwoKSB7IHJldHVybiBfX3JlYWxfXyBfTV92YWx1ZTsgfQorCisgICAgICBjb25zdCBsb25nIGRvdWJsZSYgCisgICAgICByZWFsKCkgY29uc3QgeyByZXR1cm4gX19yZWFsX18gX01fdmFsdWU7IH0KKworICAgICAgbG9uZyBkb3VibGUmIAorICAgICAgaW1hZygpIHsgcmV0dXJuIF9faW1hZ19fIF9NX3ZhbHVlOyB9CisKKyAgICAgIGNvbnN0IGxvbmcgZG91YmxlJiAKKyAgICAgIGltYWcoKSBjb25zdCB7IHJldHVybiBfX2ltYWdfXyBfTV92YWx1ZTsgfQorI2VuZGlmCisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDM4Ny4gc3RkOjpjb21wbGV4IG92ZXItZW5jYXBzdWxhdGVkLgorICAgICAgdm9pZCAKKyAgICAgIHJlYWwobG9uZyBkb3VibGUgX192YWwpIHsgX19yZWFsX18gX01fdmFsdWUgPSBfX3ZhbDsgfQorCisgICAgICB2b2lkIAorICAgICAgaW1hZyhsb25nIGRvdWJsZSBfX3ZhbCkgeyBfX2ltYWdfXyBfTV92YWx1ZSA9IF9fdmFsOyB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvcj0obG9uZyBkb3VibGUgX19yKQorICAgICAgeworCV9NX3ZhbHVlID0gX19yOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yKz0obG9uZyBkb3VibGUgX19yKQorICAgICAgeworCV9NX3ZhbHVlICs9IF9fcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGNvbXBsZXgmCisgICAgICBvcGVyYXRvci09KGxvbmcgZG91YmxlIF9fcikKKyAgICAgIHsKKwlfTV92YWx1ZSAtPSBfX3I7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBjb21wbGV4JgorICAgICAgb3BlcmF0b3IqPShsb25nIGRvdWJsZSBfX3IpCisgICAgICB7CisJX01fdmFsdWUgKj0gX19yOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgY29tcGxleCYKKyAgICAgIG9wZXJhdG9yLz0obG9uZyBkb3VibGUgX19yKQorICAgICAgeworCV9NX3ZhbHVlIC89IF9fcjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vIFRoZSBjb21waWxlciBrbm93cyBob3cgdG8gZG8gdGhpcyBlZmZpY2llbnRseQorICAgICAgLy8gY29tcGxleCYgb3BlcmF0b3I9KGNvbnN0IGNvbXBsZXgmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgPSBfX3ouaW1hZygpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb21wbGV4JgorCW9wZXJhdG9yKz0oY29uc3QgY29tcGxleDxfVHA+JiBfX3opCisJeworCSAgX19yZWFsX18gX01fdmFsdWUgKz0gX196LnJlYWwoKTsKKwkgIF9faW1hZ19fIF9NX3ZhbHVlICs9IF9fei5pbWFnKCk7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGNvbXBsZXgmCisJb3BlcmF0b3ItPShjb25zdCBjb21wbGV4PF9UcD4mIF9feikKKwl7CisJICBfX3JlYWxfXyBfTV92YWx1ZSAtPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX01fdmFsdWUgLT0gX196LmltYWcoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKwlvcGVyYXRvcio9KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9Db21wbGV4VCBfX3Q7CisJICBfX3JlYWxfXyBfX3QgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX190ID0gX196LmltYWcoKTsKKwkgIF9NX3ZhbHVlICo9IF9fdDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29tcGxleCYKKwlvcGVyYXRvci89KGNvbnN0IGNvbXBsZXg8X1RwPiYgX196KQorCXsKKwkgIF9Db21wbGV4VCBfX3Q7CisJICBfX3JlYWxfXyBfX3QgPSBfX3oucmVhbCgpOworCSAgX19pbWFnX18gX190ID0gX196LmltYWcoKTsKKwkgIF9NX3ZhbHVlIC89IF9fdDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgX0NvbXBsZXhUIF9fcmVwKCkgY29uc3QgeyByZXR1cm4gX01fdmFsdWU7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfQ29tcGxleFQgX01fdmFsdWU7CisgICAgfTsKKworICAvLyBUaGVzZSBiaXRzIGhhdmUgdG8gYmUgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUsIHNvIHRoYXQgdGhlCisgIC8vIHNwZWNpYWxpemF0aW9ucyBoYXZlIGFsbCBiZWVuIGRlZmluZWQuCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgY29tcGxleDxmbG9hdD46OmNvbXBsZXgoY29uc3QgY29tcGxleDxkb3VibGU+JiBfX3opCisgIDogX01fdmFsdWUoX196Ll9fcmVwKCkpIHsgfQorCisgIGlubGluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyAgY29tcGxleDxmbG9hdD46OmNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feikKKyAgOiBfTV92YWx1ZShfX3ouX19yZXAoKSkgeyB9CisKKyAgaW5saW5lIF9HTElCQ1hYX0NPTlNURVhQUgorICBjb21wbGV4PGRvdWJsZT46OmNvbXBsZXgoY29uc3QgY29tcGxleDxsb25nIGRvdWJsZT4mIF9feikKKyAgOiBfTV92YWx1ZShfX3ouX19yZXAoKSkgeyB9CisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuCisgIC8vIE5COiAgVGhpcyBzeW50YXggaXMgYSBHTlUgZXh0ZW5zaW9uLgorI2lmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY29tcGxleDxmbG9hdD4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IGNvbXBsZXg8ZmxvYXQ+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBjb21wbGV4PGRvdWJsZT4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IGNvbXBsZXg8ZG91YmxlPiYpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgY29tcGxleDxsb25nIGRvdWJsZT4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBjb21wbGV4PGZsb2F0PiYpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBjb25zdCBjb21wbGV4PGZsb2F0PiYpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBjb21wbGV4PGRvdWJsZT4mKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgY29uc3QgY29tcGxleDxkb3VibGU+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIGNvbnN0IGNvbXBsZXg8bG9uZyBkb3VibGU+Jik7CisjZW5kaWYKKyNlbmRpZgorCisgIC8vIEB9IGdyb3VwIGNvbXBsZXhfbnVtYmVycworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTZWUgZXh0L3R5cGVfdHJhaXRzLmggZm9yIHRoZSBwcmltYXJ5IHRlbXBsYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlXzI8c3RkOjpjb21wbGV4PF9UcD4sIF9VcD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+IF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3Byb21vdGVfMjxfVHAsIHN0ZDo6Y29tcGxleDxfVXA+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGU+IF9fdHlwZTsKKyAgICB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgc3RydWN0IF9fcHJvbW90ZV8yPHN0ZDo6Y29tcGxleDxfVHA+LCBzdGQ6OmNvbXBsZXg8X1VwPiA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3RkOjpjb21wbGV4PHR5cGVuYW1lIF9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlPiBfX3R5cGU7CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGFjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXRhbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIC8vIERSIDU5NS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBfVHAgICAgICAgICAgICAgICBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4gX190ID0gc3RkOjphc2luKF9feik7CisgICAgICBjb25zdCBfVHAgX19waV8yID0gMS41NzA3OTYzMjY3OTQ4OTY2MTkyMzEzMjE2OTE2Mzk3NTE0TDsKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfX3BpXzIgLSBfX3QucmVhbCgpLCAtX190LmltYWcoKSk7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2Fjb3MoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hY29zKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvcyhfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hY29zKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2woX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3MoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYWNvcyhfX3opIFs4LjEuMl0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2Fjb3MsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjUuMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvcyhfX3opOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2FzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBzdGQ6OmNvbXBsZXg8X1RwPiBfX3QoLV9fei5pbWFnKCksIF9fei5yZWFsKCkpOworICAgICAgX190ID0gc3RkOjphc2luaChfX3QpOworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9fdC5pbWFnKCksIC1fX3QucmVhbCgpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXNpbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2lubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luKF9feikgWzguMS4zXS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXNpbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luKF9feik7IH0KKyNlbmRpZgorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2F0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19yMiA9IF9fei5yZWFsKCkgKiBfX3oucmVhbCgpOworICAgICAgY29uc3QgX1RwIF9feCA9IF9UcCgxLjApIC0gX19yMiAtIF9fei5pbWFnKCkgKiBfX3ouaW1hZygpOworCisgICAgICBfVHAgX19udW0gPSBfX3ouaW1hZygpICsgX1RwKDEuMCk7CisgICAgICBfVHAgX19kZW4gPSBfX3ouaW1hZygpIC0gX1RwKDEuMCk7CisKKyAgICAgIF9fbnVtID0gX19yMiArIF9fbnVtICogX19udW07CisgICAgICBfX2RlbiA9IF9fcjIgKyBfX2RlbiAqIF9fZGVuOworCisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX1RwKDAuNSkgKiBhdGFuMihfVHAoMi4wKSAqIF9fei5yZWFsKCksIF9feCksCisJCQkgICAgICAgX1RwKDAuMjUpICogbG9nKF9fbnVtIC8gX19kZW4pKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhdGFuKF9feikgWzguMS40XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hdGFuKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hY29zaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIC8vIEthaGFuJ3MgZm9ybXVsYS4KKyAgICAgIHJldHVybiBfVHAoMi4wKSAqIHN0ZDo6bG9nKHN0ZDo6c3FydChfVHAoMC41KSAqIChfX3ogKyBfVHAoMS4wKSkpCisJCQkJICsgc3RkOjpzcXJ0KF9UcCgwLjUpICogKF9feiAtIF9UcCgxLjApKSkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hY29zaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2hmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hY29zaChfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NoKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2Fjb3NoKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYWNvc2hsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvc2goX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYWNvc2goX196KSBbOC4xLjVdLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhY29zaCwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNi4xLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYWNvc2goX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2FzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgc3RkOjpjb21wbGV4PF9UcD4gX190KChfX3oucmVhbCgpIC0gX196LmltYWcoKSkKKwkJCSAgICAqIChfX3oucmVhbCgpICsgX196LmltYWcoKSkgKyBfVHAoMS4wKSwKKwkJCSAgICBfVHAoMi4wKSAqIF9fei5yZWFsKCkgKiBfX3ouaW1hZygpKTsKKyAgICAgIF9fdCA9IHN0ZDo6c3FydChfX3QpOworCisgICAgICByZXR1cm4gc3RkOjpsb2coX190ICsgX196KTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXNpbmgoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5oZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYXNpbmgoX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hc2luaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2FzaW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW5oKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFzaW5oKF9feikgWzguMS42XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXNpbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNi4yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbmgoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2F0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9faTIgPSBfX3ouaW1hZygpICogX196LmltYWcoKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggPSBfVHAoMS4wKSAtIF9faTIgLSBfX3oucmVhbCgpICogX196LnJlYWwoKTsKKworICAgICAgX1RwIF9fbnVtID0gX1RwKDEuMCkgKyBfX3oucmVhbCgpOworICAgICAgX1RwIF9fZGVuID0gX1RwKDEuMCkgLSBfX3oucmVhbCgpOworCisgICAgICBfX251bSA9IF9faTIgKyBfX251bSAqIF9fbnVtOworICAgICAgX19kZW4gPSBfX2kyICsgX19kZW4gKiBfX2RlbjsKKworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9UcCgwLjI1KSAqIChsb2coX19udW0pIC0gbG9nKF9fZGVuKSksCisJCQkgICAgICAgX1RwKDAuNSkgKiBhdGFuMihfVHAoMi4wKSAqIF9fei5pbWFnKCksIF9feCkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hdGFuaChfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmhmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9hdGFuaChfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5oKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW5oKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmhsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbmgoX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICAvLy8gYXRhbmgoX196KSBbOC4xLjddLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhdGFuaCwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNi4zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbmgoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbmgoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICAvLy8gZmFicyhfX3opIFs4LjEuOF0uCisgICAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWJzLCBkZWZpbmVkCisgICAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjguMS4KKyAgICBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjphYnMoX196KTsgfQorCisgIC8vLyBBZGRpdGlvbmFsIG92ZXJsb2FkcyBbOC4xLjldLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGFyZyhfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyNpZiAoX0dMSUJDWFhfVVNFX0M5OV9NQVRIICYmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDKQorICAgICAgcmV0dXJuIHN0ZDo6c2lnbmJpdChfX3gpID8gX190eXBlKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUwpCisJICAgICAgICAgICAgICAgICAgICAgICA6IF9fdHlwZSgpOworI2Vsc2UKKyAgICAgIHJldHVybiBzdGQ6OmFyZyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpKTsKKyNlbmRpZgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGltYWcoX1RwKQorICAgIHsgcmV0dXJuIF9UcCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBub3JtKF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fdHlwZShfX3gpICogX190eXBlKF9feCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgcmVhbChfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1VwJiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhfX3R5cGUoX194KSwgc3RkOjpjb21wbGV4PF9fdHlwZT4oX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3Qgc3RkOjpjb21wbGV4PF9VcD4mIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHN0ZDo6cG93KHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feCksCisJCSAgICAgIHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feSkpOworICAgIH0KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgLy8gRFIgNzgxLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IHByb2ooY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfcHJvaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2RlbiA9IChfX3oucmVhbCgpICogX196LnJlYWwoKQorCQkJICsgX196LmltYWcoKSAqIF9fei5pbWFnKCkgKyBfVHAoMS4wKSk7CisKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPigoX1RwKDIuMCkgKiBfX3oucmVhbCgpKSAvIF9fZGVuLAorCQkJICAgICAgIChfVHAoMi4wKSAqIF9fei5pbWFnKCkpIC8gX19kZW4pOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWAorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X3Byb2ooX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY3Byb2pmKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gZG91YmxlCisgIF9fY29tcGxleF9wcm9qKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcHJvaihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9wcm9qKGNvbnN0IF9fY29tcGxleF9fIGxvbmcgZG91YmxlJiBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jcHJvamwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBwcm9qKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X3Byb2ooX196Ll9fcmVwKCkpOyB9CisjZWxzZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgcHJvaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9wcm9qKF9feik7IH0KKyNlbmRpZgorCisgIC8vIERSIDExMzcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgcHJvaihfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgY29uaihfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmICAvKiBfR0xJQkNYWF9DT01QTEVYICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NvbXBsZXguaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzU5MjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NvbXBsZXguaApAQCAtMCwwICsxLDQyIEBACisvLyAtKi0gQysrIC0qLSBjb21wYXRpYmlsaXR5IGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjb21wbGV4LmgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Y2NvbXBsZXg+CisjZWxzZQorIyBpZiBfR0xJQkNYWF9IQVZFX0NPTVBMRVhfSAorIyAgaW5jbHVkZV9uZXh0IDxjb21wbGV4Lmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9DT01QTEVYX0gKKyNkZWZpbmUgX0dMSUJDWFhfQ09NUExFWF9IIDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NvbmRpdGlvbl92YXJpYWJsZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY29uZGl0aW9uX3ZhcmlhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjVkYzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NvbmRpdGlvbl92YXJpYWJsZQpAQCAtMCwwICsxLDI4MSBAQAorLy8gPGNvbmRpdGlvbl92YXJpYWJsZT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NvbmRpdGlvbl92YXJpYWJsZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DT05ESVRJT05fVkFSSUFCTEUKKyNkZWZpbmUgX0dMSUJDWFhfQ09ORElUSU9OX1ZBUklBQkxFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtdXRleD4gLy8gdW5pcXVlX2xvY2sKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSEFTX0dUSFJFQURTKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgY29uZGl0aW9uX3ZhcmlhYmxlcyBDb25kaXRpb24gVmFyaWFibGVzCisgICAqIEBpbmdyb3VwIGNvbmN1cnJlbmN5CisgICAqCisgICAqIENsYXNzZXMgZm9yIGNvbmRpdGlvbl92YXJpYWJsZSBzdXBwb3J0LgorICAgKiBAeworICAgKi8KKworICAvLy8gY3Zfc3RhdHVzCisgIGVudW0gY2xhc3MgY3Zfc3RhdHVzIHsgbm9fdGltZW91dCwgdGltZW91dCB9OworICAKKyAgLy8vIGNvbmRpdGlvbl92YXJpYWJsZQorICBjbGFzcyBjb25kaXRpb25fdmFyaWFibGUKKyAgeworICAgIHR5cGVkZWYgY2hyb25vOjpzeXN0ZW1fY2xvY2sJX19jbG9ja190OworICAgIHR5cGVkZWYgX19ndGhyZWFkX2NvbmRfdAkJX19uYXRpdmVfdHlwZTsKKyAgICBfX25hdGl2ZV90eXBlCQkJX01fY29uZDsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCW5hdGl2ZV9oYW5kbGVfdHlwZTsKKworICAgIGNvbmRpdGlvbl92YXJpYWJsZSgpIHRocm93ICgpOworICAgIH5jb25kaXRpb25fdmFyaWFibGUoKSB0aHJvdyAoKTsKKworICAgIGNvbmRpdGlvbl92YXJpYWJsZShjb25zdCBjb25kaXRpb25fdmFyaWFibGUmKSA9IGRlbGV0ZTsKKyAgICBjb25kaXRpb25fdmFyaWFibGUmIG9wZXJhdG9yPShjb25zdCBjb25kaXRpb25fdmFyaWFibGUmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQKKyAgICBub3RpZnlfb25lKCk7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X2FsbCgpOworCisgICAgdm9pZAorICAgIHdhaXQodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2spOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIHdhaXQodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2ssIF9QcmVkaWNhdGUgX19wKQorICAgICAgeworCXdoaWxlICghX19wKCkpCisJICB3YWl0KF9fbG9jayk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfdW50aWwodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2ssCisJCSBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X19jbG9ja190LCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeyByZXR1cm4gX193YWl0X3VudGlsX2ltcGwoX19sb2NrLCBfX2F0aW1lKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfdW50aWwodW5pcXVlX2xvY2s8bXV0ZXg+JiBfX2xvY2ssCisJCSBjb25zdCBjaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBfRHVyYXRpb24+JiBfX2F0aW1lKQorICAgICAgeworCS8vIERSIDg4NyAtIFN5bmMgdW5rbm93biBjbG9jayB0byBrbm93biBjbG9jay4KKwljb25zdCB0eXBlbmFtZSBfQ2xvY2s6OnRpbWVfcG9pbnQgX19jX2VudHJ5ID0gX0Nsb2NrOjpub3coKTsKKwljb25zdCBfX2Nsb2NrX3Q6OnRpbWVfcG9pbnQgX19zX2VudHJ5ID0gX19jbG9ja190Ojpub3coKTsKKwljb25zdCBjaHJvbm86Om5hbm9zZWNvbmRzIF9fZGVsdGEgPSBfX2F0aW1lIC0gX19jX2VudHJ5OworCWNvbnN0IF9fY2xvY2tfdDo6dGltZV9wb2ludCBfX3NfYXRpbWUgPSBfX3NfZW50cnkgKyBfX2RlbHRhOworCisJcmV0dXJuIF9fd2FpdF91bnRpbF9pbXBsKF9fbG9jaywgX19zX2F0aW1lKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgYm9vbAorICAgICAgd2FpdF91bnRpbCh1bmlxdWVfbG9jazxtdXRleD4mIF9fbG9jaywKKwkJIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUsCisJCSBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsKKwl3aGlsZSAoIV9fcCgpKQorCSAgaWYgKHdhaXRfdW50aWwoX19sb2NrLCBfX2F0aW1lKSA9PSBjdl9zdGF0dXM6OnRpbWVvdXQpCisJICAgIHJldHVybiBfX3AoKTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfZm9yKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCSAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeyByZXR1cm4gd2FpdF91bnRpbChfX2xvY2ssIF9fY2xvY2tfdDo6bm93KCkgKyBfX3J0aW1lKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZCwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIGJvb2wKKyAgICAgIHdhaXRfZm9yKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCSAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lLAorCSAgICAgICBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsgcmV0dXJuIHdhaXRfdW50aWwoX19sb2NrLCBfX2Nsb2NrX3Q6Om5vdygpICsgX19ydGltZSwgc3RkOjptb3ZlKF9fcCkpOyB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiAmX01fY29uZDsgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIF9fd2FpdF91bnRpbF9pbXBsKHVuaXF1ZV9sb2NrPG11dGV4PiYgX19sb2NrLAorCQkJY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsKKwljaHJvbm86OnRpbWVfcG9pbnQ8X19jbG9ja190LCBjaHJvbm86OnNlY29uZHM+IF9fcyA9CisJICBjaHJvbm86OnRpbWVfcG9pbnRfY2FzdDxjaHJvbm86OnNlY29uZHM+KF9fYXRpbWUpOworCisJY2hyb25vOjpuYW5vc2Vjb25kcyBfX25zID0KKwkgIGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om5hbm9zZWNvbmRzPihfX2F0aW1lIC0gX19zKTsKKworCV9fZ3RocmVhZF90aW1lX3QgX190cyA9CisJICB7CisJICAgIHN0YXRpY19jYXN0PHN0ZDo6dGltZV90PihfX3MudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpLAorCSAgICBzdGF0aWNfY2FzdDxsb25nPihfX25zLmNvdW50KCkpCisJICB9OworCisJX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0KCZfTV9jb25kLCBfX2xvY2subXV0ZXgoKS0+bmF0aXZlX2hhbmRsZSgpLAorCQkJCSAmX190cyk7CisKKwlyZXR1cm4gKF9DbG9jazo6bm93KCkgPCBfX2F0aW1lCisJCT8gY3Zfc3RhdHVzOjpub190aW1lb3V0IDogY3Zfc3RhdHVzOjp0aW1lb3V0KTsKKyAgICAgIH0KKyAgfTsKKworICAvLy8gY29uZGl0aW9uX3ZhcmlhYmxlX2FueQorICAvLyBMaWtlIGFib3ZlLCBidXQgbXV0ZXggaXMgbm90IHJlcXVpcmVkIHRvIGhhdmUgdHJ5X2xvY2suCisgIGNsYXNzIGNvbmRpdGlvbl92YXJpYWJsZV9hbnkKKyAgeworICAgIHR5cGVkZWYgY2hyb25vOjpzeXN0ZW1fY2xvY2sJX19jbG9ja190OworICAgIGNvbmRpdGlvbl92YXJpYWJsZQkJCV9NX2NvbmQ7CisgICAgbXV0ZXgJCQkJX01fbXV0ZXg7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgY29uZGl0aW9uX3ZhcmlhYmxlOjpuYXRpdmVfaGFuZGxlX3R5cGUJbmF0aXZlX2hhbmRsZV90eXBlOworCisgICAgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSgpIHRocm93ICgpOworICAgIH5jb25kaXRpb25fdmFyaWFibGVfYW55KCkgdGhyb3cgKCk7CisKKyAgICBjb25kaXRpb25fdmFyaWFibGVfYW55KGNvbnN0IGNvbmRpdGlvbl92YXJpYWJsZV9hbnkmKSA9IGRlbGV0ZTsKKyAgICBjb25kaXRpb25fdmFyaWFibGVfYW55JiBvcGVyYXRvcj0oY29uc3QgY29uZGl0aW9uX3ZhcmlhYmxlX2FueSYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIG5vdGlmeV9vbmUoKQorICAgIHsKKyAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IF9fbG9jayhfTV9tdXRleCk7CisgICAgICBfTV9jb25kLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgbm90aWZ5X2FsbCgpCisgICAgeworICAgICAgbG9ja19ndWFyZDxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKyAgICAgIF9NX2NvbmQubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrPgorICAgICAgdm9pZAorICAgICAgd2FpdChfTG9jayYgX19sb2NrKQorICAgICAgeworCS8vIHNjb3BlZCB1bmxvY2sgLSB1bmxvY2tzIGluIGN0b3IsIHJlLWxvY2tzIGluIGR0b3IKKwlzdHJ1Y3QgX1VubG9jayB7CisJICBleHBsaWNpdCBfVW5sb2NrKF9Mb2NrJiBfX2xrKSA6IF9NX2xvY2soX19saykgeyBfX2xrLnVubG9jaygpOyB9CisJICB+X1VubG9jaygpIG5vZXhjZXB0KGZhbHNlKQorCSAgeworCSAgICBpZiAodW5jYXVnaHRfZXhjZXB0aW9uKCkpCisJICAgICAgX190cnkgeyBfTV9sb2NrLmxvY2soKTsgfSBfX2NhdGNoKC4uLikgeyB9CisJICAgIGVsc2UKKwkgICAgICBfTV9sb2NrLmxvY2soKTsKKwkgIH0KKwkgIF9Mb2NrJiBfTV9sb2NrOworCX07CisKKwl1bmlxdWVfbG9jazxtdXRleD4gX19teV9sb2NrKF9NX211dGV4KTsKKwlfVW5sb2NrIF9fdW5sb2NrKF9fbG9jayk7CisJLy8gX01fbXV0ZXggbXVzdCBiZSB1bmxvY2tlZCBiZWZvcmUgcmUtbG9ja2luZyBfX2xvY2sgc28gbW92ZQorCS8vIG93bmVyc2hpcCBvZiBfTV9tdXRleCBsb2NrIHRvIGFuIG9iamVjdCB3aXRoIHNob3J0ZXIgbGlmZXRpbWUuCisJdW5pcXVlX2xvY2s8bXV0ZXg+IF9fbXlfbG9jazIoc3RkOjptb3ZlKF9fbXlfbG9jaykpOworCV9NX2NvbmQud2FpdChfX215X2xvY2syKTsKKyAgICAgIH0KKyAgICAgIAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0xvY2ssIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICB3YWl0KF9Mb2NrJiBfX2xvY2ssIF9QcmVkaWNhdGUgX19wKQorICAgICAgeworCXdoaWxlICghX19wKCkpCisJICB3YWl0KF9fbG9jayk7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfdW50aWwoX0xvY2smIF9fbG9jaywKKwkJIGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7CisgICAgICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX215X2xvY2soX01fbXV0ZXgpOworICAgICAgICBfX2xvY2sudW5sb2NrKCk7CisgICAgICAgIGN2X3N0YXR1cyBfX3N0YXR1cyA9IF9NX2NvbmQud2FpdF91bnRpbChfX215X2xvY2ssIF9fYXRpbWUpOworICAgICAgICBfX2xvY2subG9jaygpOworICAgICAgICByZXR1cm4gX19zdGF0dXM7CisgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX0Nsb2NrLAorCSAgICAgdHlwZW5hbWUgX0R1cmF0aW9uLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgYm9vbAorICAgICAgd2FpdF91bnRpbChfTG9jayYgX19sb2NrLAorCQkgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSwKKwkJIF9QcmVkaWNhdGUgX19wKQorICAgICAgeworCXdoaWxlICghX19wKCkpCisJICBpZiAod2FpdF91bnRpbChfX2xvY2ssIF9fYXRpbWUpID09IGN2X3N0YXR1czo6dGltZW91dCkKKwkgICAgcmV0dXJuIF9fcCgpOworCXJldHVybiB0cnVlOworICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0xvY2ssIHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICBjdl9zdGF0dXMKKyAgICAgIHdhaXRfZm9yKF9Mb2NrJiBfX2xvY2ssIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7IHJldHVybiB3YWl0X3VudGlsKF9fbG9jaywgX19jbG9ja190Ojpub3coKSArIF9fcnRpbWUpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTG9jaywgdHlwZW5hbWUgX1JlcCwKKwkgICAgIHR5cGVuYW1lIF9QZXJpb2QsIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICBib29sCisgICAgICB3YWl0X2ZvcihfTG9jayYgX19sb2NrLAorCSAgICAgICBjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lLCBfUHJlZGljYXRlIF9fcCkKKyAgICAgIHsgcmV0dXJuIHdhaXRfdW50aWwoX19sb2NrLCBfX2Nsb2NrX3Q6Om5vdygpICsgX19ydGltZSwgc3RkOjptb3ZlKF9fcCkpOyB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiBfTV9jb25kLm5hdGl2ZV9oYW5kbGUoKTsgfQorICB9OworCisgIC8vIEB9IGdyb3VwIGNvbmRpdGlvbl92YXJpYWJsZXMKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX0hBU19HVEhSRUFEUyAmJiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9DT05ESVRJT05fVkFSSUFCTEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3NldGptcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3NldGptcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODMyODAxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jc2V0am1wCkBAIC0wLDAgKzEsNjMgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY3NldGptcAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHNldGptcC5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNC42ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NFVEpNUAorI2RlZmluZSBfR0xJQkNYWF9DU0VUSk1QIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8c2V0am1wLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgbG9uZ2ptcAorCisvLyBBZGhlcmUgdG8gc2VjdGlvbiAxNy40LjEuMiBjbGF1c2UgNSBvZiBJU08gMTQ4ODI6MTk5OAorI2lmbmRlZiBzZXRqbXAKKyNkZWZpbmUgc2V0am1wKGVudikgc2V0am1wIChlbnYpCisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OmptcF9idWY7CisgIHVzaW5nIDo6bG9uZ2ptcDsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3NpZ25hbCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3NpZ25hbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYwZDY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jc2lnbmFsCkBAIC0wLDAgKzEsNTkgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY3NpZ25hbAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHNpZ25hbC5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNC42ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NJR05BTAorI2RlZmluZSBfR0xJQkNYWF9DU0lHTkFMIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8c2lnbmFsLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgcmFpc2UKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OnNpZ19hdG9taWNfdDsKKyAgdXNpbmcgOjpzaWduYWw7CisgIHVzaW5nIDo6cmFpc2U7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRhcmcgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRhcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNzM4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGFyZwpAQCAtMCwwICsxLDU5IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGFyZworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0ZGFyZy5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNC42ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NUREFSRworI2RlZmluZSBfR0xJQkNYWF9DU1REQVJHIDEKKworLy8gQWRoZXJlIHRvIHNlY3Rpb24gMTcuNC4xLjIgY2xhdXNlIDUgb2YgSVNPIDE0ODgyOjE5OTgKKyNpZm5kZWYgdmFfZW5kCisjZGVmaW5lIHZhX2VuZChhcCkgdmFfZW5kIChhcCkKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6dmFfbGlzdDsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGJvb2wgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRib29sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDI4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRib29sCkBAIC0wLDAgKzEsNDQgQEAKKy8vIDxjc3RkYm9vbD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2NzdGRib29sCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NUREJPT0wKKyNkZWZpbmUgX0dMSUJDWFhfQ1NUREJPT0wgMQorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjICBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorIyAgaWYgX0dMSUJDWFhfSEFWRV9TVERCT09MX0gKKyMgICAgaW5jbHVkZSA8c3RkYm9vbC5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGRlZiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWE3MzgzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jc3RkZGVmCkBAIC0wLDAgKzEsNDQgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgY3N0ZGRlZgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0ZGRlZi5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMTguMSAgVHlwZXMKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRpbnQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRpbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4MTQzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGludApAQCAtMCwwICsxLDEwNiBAQAorLy8gPGNzdGRpbnQ+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jc3RkaW50CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NTVERJTlQKKyNkZWZpbmUgX0dMSUJDWFhfQ1NURElOVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisvLyBGb3IgOC4yMi4xLzEgKHNlZSBDOTksIE5vdGVzIDIxOSwgMjIwLCAyMjIpCisjaWYgX0dMSUJDWFhfSEFWRV9TVERJTlRfSAorIyBpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworIyAgZGVmaW5lIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjIGVuZGlmCisjIGlmbmRlZiBfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICBkZWZpbmUgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGlmZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgIHVuZGVmIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgIHVuZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgZW5kaWYKKyMgaWZkZWYgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgdW5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgdW5kZWYgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OmludDhfdDsKKyAgdXNpbmcgOjppbnQxNl90OworICB1c2luZyA6OmludDMyX3Q7CisgIHVzaW5nIDo6aW50NjRfdDsKKworICB1c2luZyA6OmludF9mYXN0OF90OworICB1c2luZyA6OmludF9mYXN0MTZfdDsKKyAgdXNpbmcgOjppbnRfZmFzdDMyX3Q7CisgIHVzaW5nIDo6aW50X2Zhc3Q2NF90OworCisgIHVzaW5nIDo6aW50X2xlYXN0OF90OworICB1c2luZyA6OmludF9sZWFzdDE2X3Q7CisgIHVzaW5nIDo6aW50X2xlYXN0MzJfdDsKKyAgdXNpbmcgOjppbnRfbGVhc3Q2NF90OworCisgIHVzaW5nIDo6aW50bWF4X3Q7CisgIHVzaW5nIDo6aW50cHRyX3Q7CisgIAorICB1c2luZyA6OnVpbnQ4X3Q7CisgIHVzaW5nIDo6dWludDE2X3Q7CisgIHVzaW5nIDo6dWludDMyX3Q7CisgIHVzaW5nIDo6dWludDY0X3Q7CisKKyAgdXNpbmcgOjp1aW50X2Zhc3Q4X3Q7CisgIHVzaW5nIDo6dWludF9mYXN0MTZfdDsKKyAgdXNpbmcgOjp1aW50X2Zhc3QzMl90OworICB1c2luZyA6OnVpbnRfZmFzdDY0X3Q7CisKKyAgdXNpbmcgOjp1aW50X2xlYXN0OF90OworICB1c2luZyA6OnVpbnRfbGVhc3QxNl90OworICB1c2luZyA6OnVpbnRfbGVhc3QzMl90OworICB1c2luZyA6OnVpbnRfbGVhc3Q2NF90OworCisgIHVzaW5nIDo6dWludG1heF90OworICB1c2luZyA6OnVpbnRwdHJfdDsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgLy8gX0dMSUJDWFhfQ1NURElOVApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jc3RkaW8gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdGRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk3MDRkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jc3RkaW8KQEAgLTAsMCArMSwxODUgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jc3RkaW8KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyBzdGRpby5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuOC4yICBDIExpYnJhcnkgZmlsZXMKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DU1RESU8KKyNkZWZpbmUgX0dMSUJDWFhfQ1NURElPIDEKKworLy8gR2V0IHJpZCBvZiB0aG9zZSBtYWNyb3MgZGVmaW5lZCBpbiA8c3RkaW8uaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBjbGVhcmVycgorI3VuZGVmIGZjbG9zZQorI3VuZGVmIGZlb2YKKyN1bmRlZiBmZXJyb3IKKyN1bmRlZiBmZmx1c2gKKyN1bmRlZiBmZ2V0YworI3VuZGVmIGZnZXRwb3MKKyN1bmRlZiBmZ2V0cworI3VuZGVmIGZvcGVuCisjdW5kZWYgZnByaW50ZgorI3VuZGVmIGZwdXRjCisjdW5kZWYgZnB1dHMKKyN1bmRlZiBmcmVhZAorI3VuZGVmIGZyZW9wZW4KKyN1bmRlZiBmc2NhbmYKKyN1bmRlZiBmc2VlaworI3VuZGVmIGZzZXRwb3MKKyN1bmRlZiBmdGVsbAorI3VuZGVmIGZ3cml0ZQorI3VuZGVmIGdldGMKKyN1bmRlZiBnZXRjaGFyCisjdW5kZWYgZ2V0cworI3VuZGVmIHBlcnJvcgorI3VuZGVmIHByaW50ZgorI3VuZGVmIHB1dGMKKyN1bmRlZiBwdXRjaGFyCisjdW5kZWYgcHV0cworI3VuZGVmIHJlbW92ZQorI3VuZGVmIHJlbmFtZQorI3VuZGVmIHJld2luZAorI3VuZGVmIHNjYW5mCisjdW5kZWYgc2V0YnVmCisjdW5kZWYgc2V0dmJ1ZgorI3VuZGVmIHNwcmludGYKKyN1bmRlZiBzc2NhbmYKKyN1bmRlZiB0bXBmaWxlCisjdW5kZWYgdG1wbmFtCisjdW5kZWYgdW5nZXRjCisjdW5kZWYgdmZwcmludGYKKyN1bmRlZiB2cHJpbnRmCisjdW5kZWYgdnNwcmludGYKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OkZJTEU7CisgIHVzaW5nIDo6ZnBvc190OworCisgIHVzaW5nIDo6Y2xlYXJlcnI7CisgIHVzaW5nIDo6ZmNsb3NlOworICB1c2luZyA6OmZlb2Y7CisgIHVzaW5nIDo6ZmVycm9yOworICB1c2luZyA6OmZmbHVzaDsKKyAgdXNpbmcgOjpmZ2V0YzsKKyAgdXNpbmcgOjpmZ2V0cG9zOworICB1c2luZyA6OmZnZXRzOworICB1c2luZyA6OmZvcGVuOworICB1c2luZyA6OmZwcmludGY7CisgIHVzaW5nIDo6ZnB1dGM7CisgIHVzaW5nIDo6ZnB1dHM7CisgIHVzaW5nIDo6ZnJlYWQ7CisgIHVzaW5nIDo6ZnJlb3BlbjsKKyAgdXNpbmcgOjpmc2NhbmY7CisgIHVzaW5nIDo6ZnNlZWs7CisgIHVzaW5nIDo6ZnNldHBvczsKKyAgdXNpbmcgOjpmdGVsbDsKKyAgdXNpbmcgOjpmd3JpdGU7CisgIHVzaW5nIDo6Z2V0YzsKKyAgdXNpbmcgOjpnZXRjaGFyOworICB1c2luZyA6OmdldHM7CisgIHVzaW5nIDo6cGVycm9yOworICB1c2luZyA6OnByaW50ZjsKKyAgdXNpbmcgOjpwdXRjOworICB1c2luZyA6OnB1dGNoYXI7CisgIHVzaW5nIDo6cHV0czsKKyAgdXNpbmcgOjpyZW1vdmU7CisgIHVzaW5nIDo6cmVuYW1lOworICB1c2luZyA6OnJld2luZDsKKyAgdXNpbmcgOjpzY2FuZjsKKyAgdXNpbmcgOjpzZXRidWY7CisgIHVzaW5nIDo6c2V0dmJ1ZjsKKyAgdXNpbmcgOjpzcHJpbnRmOworICB1c2luZyA6OnNzY2FuZjsKKyAgdXNpbmcgOjp0bXBmaWxlOworICB1c2luZyA6OnRtcG5hbTsKKyAgdXNpbmcgOjp1bmdldGM7CisgIHVzaW5nIDo6dmZwcmludGY7CisgIHVzaW5nIDo6dnByaW50ZjsKKyAgdXNpbmcgOjp2c3ByaW50ZjsKK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKKyN1bmRlZiBzbnByaW50ZgorI3VuZGVmIHZmc2NhbmYKKyN1bmRlZiB2c2NhbmYKKyN1bmRlZiB2c25wcmludGYKKyN1bmRlZiB2c3NjYW5mCisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NIRUNLIHx8IF9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICBleHRlcm4gIkMiIGludAorICAoc25wcmludGYpKGNoYXIgKiBfX3Jlc3RyaWN0LCBzdGQ6OnNpemVfdCwgY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIC4uLikKKyAgdGhyb3cgKCk7CisgIGV4dGVybiAiQyIgaW50CisgICh2ZnNjYW5mKShGSUxFICogX19yZXN0cmljdCwgY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIF9fZ251Y192YV9saXN0KTsKKyAgZXh0ZXJuICJDIiBpbnQgKHZzY2FuZikoY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIF9fZ251Y192YV9saXN0KTsKKyAgZXh0ZXJuICJDIiBpbnQKKyAgKHZzbnByaW50ZikoY2hhciAqIF9fcmVzdHJpY3QsIHN0ZDo6c2l6ZV90LCBjb25zdCBjaGFyICogX19yZXN0cmljdCwKKwkgICAgICBfX2dudWNfdmFfbGlzdCkgdGhyb3cgKCk7CisgIGV4dGVybiAiQyIgaW50CisgICh2c3NjYW5mKShjb25zdCBjaGFyICogX19yZXN0cmljdCwgY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIF9fZ251Y192YV9saXN0KQorICB0aHJvdyAoKTsKKyNlbmRpZgorCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICB1c2luZyA6OnNucHJpbnRmOworICB1c2luZyA6OnZmc2NhbmY7CisgIHVzaW5nIDo6dnNjYW5mOworICB1c2luZyA6OnZzbnByaW50ZjsKKyAgdXNpbmcgOjp2c3NjYW5mOworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBfX2dudV9jeHgKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6Ol9fZ251X2N4eDo6c25wcmludGY7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp2ZnNjYW5mOworICB1c2luZyA6Ol9fZ251X2N4eDo6dnNjYW5mOworICB1c2luZyA6Ol9fZ251X2N4eDo6dnNucHJpbnRmOworICB1c2luZyA6Ol9fZ251X2N4eDo6dnNzY2FuZjsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGxpYiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0ZGxpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc1MzBkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jc3RkbGliCkBAIC0wLDAgKzEsMjU1IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3N0ZGxpYgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHN0ZGxpYi5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjAuNC42ICBDIGxpYnJhcnkKKy8vCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfQ1NURExJQgorI2RlZmluZSBfR0xJQkNYWF9DU1RETElCIDEKKworI2lmICFfR0xJQkNYWF9IT1NURUQKKy8vIFRoZSBDIHN0YW5kYXJkIGRvZXMgbm90IHJlcXVpcmUgYSBmcmVlc3RhbmRpbmcgaW1wbGVtZW50YXRpb24gdG8KKy8vIHByb3ZpZGUgPHN0ZGxpYi5oPi4gIEhvd2V2ZXIsIHRoZSBDKysgc3RhbmRhcmQgZG9lcyBzdGlsbCByZXF1aXJlCisvLyA8Y3N0ZGxpYj4gLS0gYnV0IG9ubHkgdGhlIGZ1bmN0aW9uYWxpdHkgbWVudGlvbmVkIGluCisvLyBbbGliLnN1cHBvcnQuc3RhcnQudGVybV0uCisKKyNkZWZpbmUgRVhJVF9TVUNDRVNTIDAKKyNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKKworbmFtZXNwYWNlIHN0ZAoreworICBleHRlcm4gIkMiIHZvaWQgYWJvcnQodm9pZCkgdGhyb3cgKCkgX0dMSUJDWFhfTk9SRVRVUk47CisgIGV4dGVybiAiQyIgaW50IGF0ZXhpdCh2b2lkICgqKSgpKSB0aHJvdyAoKTsKKyAgZXh0ZXJuICJDIiB2b2lkIGV4aXQoaW50KSB0aHJvdyAoKSBfR0xJQkNYWF9OT1JFVFVSTjsKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZWxzZQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHN0ZGxpYi5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGFib3J0CisjdW5kZWYgYWJzCisjdW5kZWYgYXRleGl0CisjdW5kZWYgYXRvZgorI3VuZGVmIGF0b2kKKyN1bmRlZiBhdG9sCisjdW5kZWYgYnNlYXJjaAorI3VuZGVmIGNhbGxvYworI3VuZGVmIGRpdgorI3VuZGVmIGV4aXQKKyN1bmRlZiBmcmVlCisjdW5kZWYgZ2V0ZW52CisjdW5kZWYgbGFicworI3VuZGVmIGxkaXYKKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBtYmxlbgorI3VuZGVmIG1ic3Rvd2NzCisjdW5kZWYgbWJ0b3djCisjdW5kZWYgcXNvcnQKKyN1bmRlZiByYW5kCisjdW5kZWYgcmVhbGxvYworI3VuZGVmIHNyYW5kCisjdW5kZWYgc3RydG9kCisjdW5kZWYgc3RydG9sCisjdW5kZWYgc3RydG91bAorI3VuZGVmIHN5c3RlbQorI3VuZGVmIHdjc3RvbWJzCisjdW5kZWYgd2N0b21iCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyA6OmRpdl90OworICB1c2luZyA6OmxkaXZfdDsKKworICB1c2luZyA6OmFib3J0OworICB1c2luZyA6OmFiczsKKyAgdXNpbmcgOjphdGV4aXQ7CisgIHVzaW5nIDo6YXRvZjsKKyAgdXNpbmcgOjphdG9pOworICB1c2luZyA6OmF0b2w7CisgIHVzaW5nIDo6YnNlYXJjaDsKKyAgdXNpbmcgOjpjYWxsb2M7CisgIHVzaW5nIDo6ZGl2OworICB1c2luZyA6OmV4aXQ7CisgIHVzaW5nIDo6ZnJlZTsKKyAgdXNpbmcgOjpnZXRlbnY7CisgIHVzaW5nIDo6bGFiczsKKyAgdXNpbmcgOjpsZGl2OworICB1c2luZyA6Om1hbGxvYzsKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX01CU1RBVEVfVAorICB1c2luZyA6Om1ibGVuOworICB1c2luZyA6Om1ic3Rvd2NzOworICB1c2luZyA6Om1idG93YzsKKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVZFX01CU1RBVEVfVAorICB1c2luZyA6OnFzb3J0OworICB1c2luZyA6OnJhbmQ7CisgIHVzaW5nIDo6cmVhbGxvYzsKKyAgdXNpbmcgOjpzcmFuZDsKKyAgdXNpbmcgOjpzdHJ0b2Q7CisgIHVzaW5nIDo6c3RydG9sOworICB1c2luZyA6OnN0cnRvdWw7CisgIHVzaW5nIDo6c3lzdGVtOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHVzaW5nIDo6d2NzdG9tYnM7CisgIHVzaW5nIDo6d2N0b21iOworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyAgaW5saW5lIGxvbmcKKyAgYWJzKGxvbmcgX19pKSB7IHJldHVybiBsYWJzKF9faSk7IH0KKworICBpbmxpbmUgbGRpdl90CisgIGRpdihsb25nIF9faSwgbG9uZyBfX2opIHsgcmV0dXJuIGxkaXYoX19pLCBfX2opOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIF9HTElCQ1hYX1VTRV9DOTkKKworI3VuZGVmIF9FeGl0CisjdW5kZWYgbGxhYnMKKyN1bmRlZiBsbGRpdgorI3VuZGVmIGF0b2xsCisjdW5kZWYgc3RydG9sbAorI3VuZGVmIHN0cnRvdWxsCisjdW5kZWYgc3RydG9mCisjdW5kZWYgc3RydG9sZAorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6OmxsZGl2X3Q7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NIRUNLIHx8IF9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICBleHRlcm4gIkMiIHZvaWQgKF9FeGl0KShpbnQpIHRocm93ICgpIF9HTElCQ1hYX05PUkVUVVJOOworI2VuZGlmCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICB1c2luZyA6Ol9FeGl0OworI2VuZGlmCisKKyAgaW5saW5lIGxvbmcgbG9uZworICBhYnMobG9uZyBsb25nIF9feCkgeyByZXR1cm4gX194ID49IDAgPyBfX3ggOiAtX194OyB9CisKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6OmxsYWJzOworCisgIGlubGluZSBsbGRpdl90CisgIGRpdihsb25nIGxvbmcgX19uLCBsb25nIGxvbmcgX19kKQorICB7IGxsZGl2X3QgX19xOyBfX3EucXVvdCA9IF9fbiAvIF9fZDsgX19xLnJlbSA9IF9fbiAlIF9fZDsgcmV0dXJuIF9fcTsgfQorCisgIHVzaW5nIDo6bGxkaXY7CisjZW5kaWYKKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0NIRUNLIHx8IF9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgZXh0ZXJuICJDIiBsb25nIGxvbmcgaW50IChhdG9sbCkoY29uc3QgY2hhciAqKSB0aHJvdyAoKTsKKyAgZXh0ZXJuICJDIiBsb25nIGxvbmcgaW50CisgICAgKHN0cnRvbGwpKGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LCBjaGFyICoqIF9fcmVzdHJpY3QsIGludCkgdGhyb3cgKCk7CisgIGV4dGVybiAiQyIgdW5zaWduZWQgbG9uZyBsb25nIGludAorICAgIChzdHJ0b3VsbCkoY29uc3QgY2hhciAqIF9fcmVzdHJpY3QsIGNoYXIgKiogX19yZXN0cmljdCwgaW50KSB0aHJvdyAoKTsKKyNlbmRpZgorI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIDo6YXRvbGw7CisgIHVzaW5nIDo6c3RydG9sbDsKKyAgdXNpbmcgOjpzdHJ0b3VsbDsKKyNlbmRpZgorICB1c2luZyA6OnN0cnRvZjsKKyAgdXNpbmcgOjpzdHJ0b2xkOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIF9fZ251X2N4eAorCituYW1lc3BhY2Ugc3RkCit7CisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgOjpfX2dudV9jeHg6OmxsZGl2X3Q7CisjZW5kaWYKKyAgdXNpbmcgOjpfX2dudV9jeHg6Ol9FeGl0OworICB1c2luZyA6Ol9fZ251X2N4eDo6YWJzOworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIDo6X19nbnVfY3h4OjpsbGFiczsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OmRpdjsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OmxsZGl2OworI2VuZGlmCisgIHVzaW5nIDo6X19nbnVfY3h4OjphdG9sbDsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnN0cnRvZjsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnN0cnRvbGw7CisgIHVzaW5nIDo6X19nbnVfY3h4OjpzdHJ0b3VsbDsKKyAgdXNpbmcgOjpfX2dudV9jeHg6OnN0cnRvbGQ7Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKK25hbWVzcGFjZSBzdGQKK3sKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICAvLyB0eXBlcworICB1c2luZyBzdGQ6OmxsZGl2X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIHN0ZDo6bGxhYnM7CisgIHVzaW5nIHN0ZDo6bGxkaXY7CisjZW5kaWYKKworICB1c2luZyBzdGQ6OmF0b2xsOworICB1c2luZyBzdGQ6OnN0cnRvbGw7CisgIHVzaW5nIHN0ZDo6c3RydG91bGw7CisKKyAgdXNpbmcgc3RkOjpzdHJ0b2Y7CisgIHVzaW5nIHN0ZDo6c3RydG9sZDsKKworICAvLyBvdmVybG9hZHMKKyAgdXNpbmcgc3RkOjphYnM7CisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgdXNpbmcgc3RkOjpkaXY7CisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9DOTkKKworI2VuZGlmIC8vICFfR0xJQkNYWF9IT1NURUQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdHJpbmcgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2NzdHJpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzM2ZhMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3N0cmluZwpAQCAtMCwwICsxLDEyNSBAQAorLy8gLSotIEMrKyAtKi0gZm9yd2FyZGluZyBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBjc3RyaW5nCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGZpbGUuICBZb3Ugc2hvdWxkIEBjIFwjaW5jbHVkZSB0aGlzIGZpbGUKKyAqICBpbiB5b3VyIHByb2dyYW1zLCByYXRoZXIgdGhhbiBhbnkgb2YgdGhlIEBhICouaCBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqCisgKiAgVGhpcyBpcyB0aGUgQysrIHZlcnNpb24gb2YgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgQGMgc3RyaW5nLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMC40LjYgIEMgbGlicmFyeQorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DU1RSSU5HCisjZGVmaW5lIF9HTElCQ1hYX0NTVFJJTkcgMQorCisvLyBHZXQgcmlkIG9mIHRob3NlIG1hY3JvcyBkZWZpbmVkIGluIDxzdHJpbmcuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBtZW1jaHIKKyN1bmRlZiBtZW1jbXAKKyN1bmRlZiBtZW1jcHkKKyN1bmRlZiBtZW1tb3ZlCisjdW5kZWYgbWVtc2V0CisjdW5kZWYgc3RyY2F0CisjdW5kZWYgc3RyY2hyCisjdW5kZWYgc3RyY21wCisjdW5kZWYgc3RyY29sbAorI3VuZGVmIHN0cmNweQorI3VuZGVmIHN0cmNzcG4KKyN1bmRlZiBzdHJlcnJvcgorI3VuZGVmIHN0cmxlbgorI3VuZGVmIHN0cm5jYXQKKyN1bmRlZiBzdHJuY21wCisjdW5kZWYgc3RybmNweQorI3VuZGVmIHN0cnBicmsKKyN1bmRlZiBzdHJyY2hyCisjdW5kZWYgc3Ryc3BuCisjdW5kZWYgc3Ryc3RyCisjdW5kZWYgc3RydG9rCisjdW5kZWYgc3RyeGZybQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgOjptZW1jaHI7CisgIHVzaW5nIDo6bWVtY21wOworICB1c2luZyA6Om1lbWNweTsKKyAgdXNpbmcgOjptZW1tb3ZlOworICB1c2luZyA6Om1lbXNldDsKKyAgdXNpbmcgOjpzdHJjYXQ7CisgIHVzaW5nIDo6c3RyY21wOworICB1c2luZyA6OnN0cmNvbGw7CisgIHVzaW5nIDo6c3RyY3B5OworICB1c2luZyA6OnN0cmNzcG47CisgIHVzaW5nIDo6c3RyZXJyb3I7CisgIHVzaW5nIDo6c3RybGVuOworICB1c2luZyA6OnN0cm5jYXQ7CisgIHVzaW5nIDo6c3RybmNtcDsKKyAgdXNpbmcgOjpzdHJuY3B5OworICB1c2luZyA6OnN0cnNwbjsKKyAgdXNpbmcgOjpzdHJ0b2s7CisgIHVzaW5nIDo6c3RyeGZybTsKKyAgdXNpbmcgOjpzdHJjaHI7CisgIHVzaW5nIDo6c3RycGJyazsKKyAgdXNpbmcgOjpzdHJyY2hyOworICB1c2luZyA6OnN0cnN0cjsKKworI2lmbmRlZiBfX0NPUlJFQ1RfSVNPX0NQUF9TVFJJTkdfSF9QUk9UTworICBpbmxpbmUgdm9pZCoKKyAgbWVtY2hyKHZvaWQqIF9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gX19idWlsdGluX21lbWNocihfX3MsIF9fYywgX19uKTsgfQorCisgIGlubGluZSBjaGFyKgorICBzdHJjaHIoY2hhciogX19zLCBpbnQgX19uKQorICB7IHJldHVybiBfX2J1aWx0aW5fc3RyY2hyKF9fcywgX19uKTsgfQorCisgIGlubGluZSBjaGFyKgorICBzdHJwYnJrKGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJwYnJrKF9fczEsIF9fczIpOyB9CisKKyAgaW5saW5lIGNoYXIqCisgIHN0cnJjaHIoY2hhciogX19zLCBpbnQgX19uKQorICB7IHJldHVybiBfX2J1aWx0aW5fc3RycmNocihfX3MsIF9fbik7IH0KKworICBpbmxpbmUgY2hhcioKKyAgc3Ryc3RyKGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJzdHIoX19zMSwgX19zMik7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jdGdtYXRoIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jdGdtYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNTEwMDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2N0Z21hdGgKQEAgLTAsMCArMSw0MSBAQAorLy8gPGN0Z21hdGg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jdGdtYXRoCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1RHTUFUSAorI2RlZmluZSBfR0xJQkNYWF9DVEdNQVRIIDEKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyAgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8Y21hdGg+CisjZW5kaWYKKworI2VuZGlmIAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2N0aW1lIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jdGltZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVlNzkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jdGltZQpAQCAtMCwwICsxLDc3IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3RpbWUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyB0aW1lLmgsCisgKiAgYW5kIGl0cyBjb250ZW50cyBhcmUgKG1vc3RseSkgdGhlIHNhbWUgYXMgdGhhdCBoZWFkZXIsIGJ1dCBhcmUgYWxsCisgKiAgY29udGFpbmVkIGluIHRoZSBuYW1lc3BhY2UgQGMgc3RkIChleGNlcHQgZm9yIG5hbWVzIHdoaWNoIGFyZSBkZWZpbmVkCisgKiAgYXMgbWFjcm9zIGluIEMpLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMC41ICBEYXRlIGFuZCB0aW1lCisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBfR0xJQkNYWF9DVElNRQorI2RlZmluZSBfR0xJQkNYWF9DVElNRSAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHRpbWUuaD4gaW4gbGlldSBvZiByZWFsIGZ1bmN0aW9ucy4KKyN1bmRlZiBjbG9jaworI3VuZGVmIGRpZmZ0aW1lCisjdW5kZWYgbWt0aW1lCisjdW5kZWYgdGltZQorI3VuZGVmIGFzY3RpbWUKKyN1bmRlZiBjdGltZQorI3VuZGVmIGdtdGltZQorI3VuZGVmIGxvY2FsdGltZQorI3VuZGVmIHN0cmZ0aW1lCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgdXNpbmcgOjpjbG9ja190OworICB1c2luZyA6OnRpbWVfdDsKKyAgdXNpbmcgOjp0bTsKKworICB1c2luZyA6OmNsb2NrOworICB1c2luZyA6OmRpZmZ0aW1lOworICB1c2luZyA6Om1rdGltZTsKKyAgdXNpbmcgOjp0aW1lOworICB1c2luZyA6OmFzY3RpbWU7CisgIHVzaW5nIDo6Y3RpbWU7CisgIHVzaW5nIDo6Z210aW1lOworICB1c2luZyA6OmxvY2FsdGltZTsKKyAgdXNpbmcgOjpzdHJmdGltZTsKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jd2NoYXIgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2N3Y2hhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmIxMTY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jd2NoYXIKQEAgLTAsMCArMSwzMDUgQEAKKy8vIC0qLSBDKysgLSotIGZvcndhcmRpbmcgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9jd2NoYXIKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgZmlsZS4gIFlvdSBzaG91bGQgQGMgXCNpbmNsdWRlIHRoaXMgZmlsZQorICogIGluIHlvdXIgcHJvZ3JhbXMsIHJhdGhlciB0aGFuIGFueSBvZiB0aGUgQGEgKi5oIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICoKKyAqICBUaGlzIGlzIHRoZSBDKysgdmVyc2lvbiBvZiB0aGUgU3RhbmRhcmQgQyBMaWJyYXJ5IGhlYWRlciBAYyB3Y2hhci5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjEuNAorLy8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmIF9HTElCQ1hYX0hBVkVfV0NIQVJfSAorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9DV0NIQVIKKyNkZWZpbmUgX0dMSUJDWFhfQ1dDSEFSIDEKKworLy8gTmVlZCB0byBkbyBhIGJpdCBvZiB0cmlja2VyeSBoZXJlIHdpdGggbWJzdGF0ZV90IGFzIGNoYXJfdHJhaXRzCisvLyBhc3N1bWVzIGl0IGlzIGluIHdjaGFyLmgsIHJlZ2FyZGxlc3Mgb2Ygd2NoYXJfdCBzcGVjaWFsaXphdGlvbnMuCisjaWZuZGVmIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UCitleHRlcm4gIkMiCit7CisgIHR5cGVkZWYgc3RydWN0CisgIHsKKyAgICBpbnQgX19maWxsWzZdOworICB9IG1ic3RhdGVfdDsKK30KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6bWJzdGF0ZV90OworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHdjaGFyLmg+IGluIGxpZXUgb2YgcmVhbCBmdW5jdGlvbnMuCisjdW5kZWYgYnRvd2MKKyN1bmRlZiBmZ2V0d2MKKyN1bmRlZiBmZ2V0d3MKKyN1bmRlZiBmcHV0d2MKKyN1bmRlZiBmcHV0d3MKKyN1bmRlZiBmd2lkZQorI3VuZGVmIGZ3cHJpbnRmCisjdW5kZWYgZndzY2FuZgorI3VuZGVmIGdldHdjCisjdW5kZWYgZ2V0d2NoYXIKKyN1bmRlZiBtYnJsZW4KKyN1bmRlZiBtYnJ0b3djCisjdW5kZWYgbWJzaW5pdAorI3VuZGVmIG1ic3J0b3djcworI3VuZGVmIHB1dHdjCisjdW5kZWYgcHV0d2NoYXIKKyN1bmRlZiBzd3ByaW50ZgorI3VuZGVmIHN3c2NhbmYKKyN1bmRlZiB1bmdldHdjCisjdW5kZWYgdmZ3cHJpbnRmCisjaWYgX0dMSUJDWFhfSEFWRV9WRldTQ0FORgorIyB1bmRlZiB2ZndzY2FuZgorI2VuZGlmCisjdW5kZWYgdnN3cHJpbnRmCisjaWYgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORgorIyB1bmRlZiB2c3dzY2FuZgorI2VuZGlmCisjdW5kZWYgdndwcmludGYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYKKyMgdW5kZWYgdndzY2FuZgorI2VuZGlmCisjdW5kZWYgd2NydG9tYgorI3VuZGVmIHdjc2NhdAorI3VuZGVmIHdjc2NocgorI3VuZGVmIHdjc2NtcAorI3VuZGVmIHdjc2NvbGwKKyN1bmRlZiB3Y3NjcHkKKyN1bmRlZiB3Y3Njc3BuCisjdW5kZWYgd2NzZnRpbWUKKyN1bmRlZiB3Y3NsZW4KKyN1bmRlZiB3Y3NuY2F0CisjdW5kZWYgd2NzbmNtcAorI3VuZGVmIHdjc25jcHkKKyN1bmRlZiB3Y3NwYnJrCisjdW5kZWYgd2NzcmNocgorI3VuZGVmIHdjc3J0b21icworI3VuZGVmIHdjc3NwbgorI3VuZGVmIHdjc3N0cgorI3VuZGVmIHdjc3RvZAorI2lmIF9HTElCQ1hYX0hBVkVfV0NTVE9GCisjIHVuZGVmIHdjc3RvZgorI2VuZGlmCisjdW5kZWYgd2NzdG9rCisjdW5kZWYgd2NzdG9sCisjdW5kZWYgd2NzdG91bAorI3VuZGVmIHdjc3hmcm0KKyN1bmRlZiB3Y3RvYgorI3VuZGVmIHdtZW1jaHIKKyN1bmRlZiB3bWVtY21wCisjdW5kZWYgd21lbWNweQorI3VuZGVmIHdtZW1tb3ZlCisjdW5kZWYgd21lbXNldAorI3VuZGVmIHdwcmludGYKKyN1bmRlZiB3c2NhbmYKKworI2lmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyA6OndpbnRfdDsKKworICB1c2luZyA6OmJ0b3djOworICB1c2luZyA6OmZnZXR3YzsKKyAgdXNpbmcgOjpmZ2V0d3M7CisgIHVzaW5nIDo6ZnB1dHdjOworICB1c2luZyA6OmZwdXR3czsKKyAgdXNpbmcgOjpmd2lkZTsKKyAgdXNpbmcgOjpmd3ByaW50ZjsKKyAgdXNpbmcgOjpmd3NjYW5mOworICB1c2luZyA6OmdldHdjOworICB1c2luZyA6OmdldHdjaGFyOworICB1c2luZyA6Om1icmxlbjsKKyAgdXNpbmcgOjptYnJ0b3djOworICB1c2luZyA6Om1ic2luaXQ7CisgIHVzaW5nIDo6bWJzcnRvd2NzOworICB1c2luZyA6OnB1dHdjOworICB1c2luZyA6OnB1dHdjaGFyOworI2lmbmRlZiBfR0xJQkNYWF9IQVZFX0JST0tFTl9WU1dQUklOVEYKKyAgdXNpbmcgOjpzd3ByaW50ZjsKKyNlbmRpZgorICB1c2luZyA6OnN3c2NhbmY7CisgIHVzaW5nIDo6dW5nZXR3YzsKKyAgdXNpbmcgOjp2ZndwcmludGY7CisjaWYgX0dMSUJDWFhfSEFWRV9WRldTQ0FORgorICB1c2luZyA6OnZmd3NjYW5mOworI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX0hBVkVfQlJPS0VOX1ZTV1BSSU5URgorICB1c2luZyA6OnZzd3ByaW50ZjsKKyNlbmRpZgorI2lmIF9HTElCQ1hYX0hBVkVfVlNXU0NBTkYKKyAgdXNpbmcgOjp2c3dzY2FuZjsKKyNlbmRpZgorICB1c2luZyA6OnZ3cHJpbnRmOworI2lmIF9HTElCQ1hYX0hBVkVfVldTQ0FORgorICB1c2luZyA6OnZ3c2NhbmY7CisjZW5kaWYKKyAgdXNpbmcgOjp3Y3J0b21iOworICB1c2luZyA6Ondjc2NhdDsKKyAgdXNpbmcgOjp3Y3NjbXA7CisgIHVzaW5nIDo6d2NzY29sbDsKKyAgdXNpbmcgOjp3Y3NjcHk7CisgIHVzaW5nIDo6d2NzY3NwbjsKKyAgdXNpbmcgOjp3Y3NmdGltZTsKKyAgdXNpbmcgOjp3Y3NsZW47CisgIHVzaW5nIDo6d2NzbmNhdDsKKyAgdXNpbmcgOjp3Y3NuY21wOworICB1c2luZyA6Ondjc25jcHk7CisgIHVzaW5nIDo6d2NzcnRvbWJzOworICB1c2luZyA6Ondjc3NwbjsKKyAgdXNpbmcgOjp3Y3N0b2Q7CisjaWYgX0dMSUJDWFhfSEFWRV9XQ1NUT0YKKyAgdXNpbmcgOjp3Y3N0b2Y7CisjZW5kaWYKKyAgdXNpbmcgOjp3Y3N0b2s7CisgIHVzaW5nIDo6d2NzdG9sOworICB1c2luZyA6Ondjc3RvdWw7CisgIHVzaW5nIDo6d2NzeGZybTsKKyAgdXNpbmcgOjp3Y3RvYjsKKyAgdXNpbmcgOjp3bWVtY21wOworICB1c2luZyA6OndtZW1jcHk7CisgIHVzaW5nIDo6d21lbW1vdmU7CisgIHVzaW5nIDo6d21lbXNldDsKKyAgdXNpbmcgOjp3cHJpbnRmOworICB1c2luZyA6OndzY2FuZjsKKyAgdXNpbmcgOjp3Y3NjaHI7CisgIHVzaW5nIDo6d2NzcGJyazsKKyAgdXNpbmcgOjp3Y3NyY2hyOworICB1c2luZyA6Ondjc3N0cjsKKyAgdXNpbmcgOjp3bWVtY2hyOworCisjaWZuZGVmIF9fQ09SUkVDVF9JU09fQ1BQX1dDSEFSX0hfUFJPVE8KKyAgaW5saW5lIHdjaGFyX3QqCisgIHdjc2Nocih3Y2hhcl90KiBfX3AsIHdjaGFyX3QgX19jKQorICB7IHJldHVybiB3Y3NjaHIoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19wKSwgX19jKTsgfQorCisgIGlubGluZSB3Y2hhcl90KgorICB3Y3NwYnJrKHdjaGFyX3QqIF9fczEsIGNvbnN0IHdjaGFyX3QqIF9fczIpCisgIHsgcmV0dXJuIHdjc3BicmsoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19zMSksIF9fczIpOyB9CisKKyAgaW5saW5lIHdjaGFyX3QqCisgIHdjc3JjaHIod2NoYXJfdCogX19wLCB3Y2hhcl90IF9fYykKKyAgeyByZXR1cm4gd2NzcmNocihjb25zdF9jYXN0PGNvbnN0IHdjaGFyX3QqPihfX3ApLCBfX2MpOyB9CisKKyAgaW5saW5lIHdjaGFyX3QqCisgIHdjc3N0cih3Y2hhcl90KiBfX3MxLCBjb25zdCB3Y2hhcl90KiBfX3MyKQorICB7IHJldHVybiB3Y3NzdHIoY29uc3RfY2FzdDxjb25zdCB3Y2hhcl90Kj4oX19zMSksIF9fczIpOyB9CisKKyAgaW5saW5lIHdjaGFyX3QqCisgIHdtZW1jaHIod2NoYXJfdCogX19wLCB3Y2hhcl90IF9fYywgc2l6ZV90IF9fbikKKyAgeyByZXR1cm4gd21lbWNocihjb25zdF9jYXN0PGNvbnN0IHdjaGFyX3QqPihfX3ApLCBfX2MsIF9fbik7IH0KKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisKKyN1bmRlZiB3Y3N0b2xkCisjdW5kZWYgd2NzdG9sbAorI3VuZGVmIHdjc3RvdWxsCisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NIRUNLIHx8IF9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICBleHRlcm4gIkMiIGxvbmcgZG91YmxlCisgICAgKHdjc3RvbGQpKGNvbnN0IHdjaGFyX3QgKiBfX3Jlc3RyaWN0LCB3Y2hhcl90ICoqIF9fcmVzdHJpY3QpIHRocm93ICgpOworI2VuZGlmCisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfRFlOQU1JQworICB1c2luZyA6Ondjc3RvbGQ7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19DSEVDSyB8fCBfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIGV4dGVybiAiQyIgbG9uZyBsb25nIGludAorICAgICh3Y3N0b2xsKShjb25zdCB3Y2hhcl90ICogX19yZXN0cmljdCwgd2NoYXJfdCAqKiBfX3Jlc3RyaWN0LCBpbnQpIHRocm93ICgpOworICBleHRlcm4gIkMiIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKKyAgICAod2NzdG91bGwpKGNvbnN0IHdjaGFyX3QgKiBfX3Jlc3RyaWN0LCB3Y2hhcl90ICoqIF9fcmVzdHJpY3QsIGludCkgdGhyb3cgKCk7CisjZW5kaWYKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQworICB1c2luZyA6Ondjc3RvbGw7CisgIHVzaW5nIDo6d2NzdG91bGw7CisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIF9fZ251X2N4eAorCituYW1lc3BhY2Ugc3RkCit7CisgIHVzaW5nIDo6X19nbnVfY3h4Ojp3Y3N0b2xkOworICB1c2luZyA6Ol9fZ251X2N4eDo6d2NzdG9sbDsKKyAgdXNpbmcgOjpfX2dudV9jeHg6Ondjc3RvdWxsOworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKKyNlbmRpZiAvL19HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZAoreworI2lmIF9HTElCQ1hYX0hBVkVfV0NTVE9GCisgIHVzaW5nIHN0ZDo6d2NzdG9mOworI2VuZGlmCisjaWYgX0dMSUJDWFhfSEFWRV9WRldTQ0FORgorICB1c2luZyBzdGQ6OnZmd3NjYW5mOworI2VuZGlmCisjaWYgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORgorICB1c2luZyBzdGQ6OnZzd3NjYW5mOworI2VuZGlmCisjaWYgX0dMSUJDWFhfSEFWRV9WV1NDQU5GCisgIHVzaW5nIHN0ZDo6dndzY2FuZjsKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorICB1c2luZyBzdGQ6Ondjc3RvbGQ7CisgIHVzaW5nIHN0ZDo6d2NzdG9sbDsKKyAgdXNpbmcgc3RkOjp3Y3N0b3VsbDsKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3djdHlwZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3djdHlwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDE3YjY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9jd2N0eXBlCkBAIC0wLDAgKzEsMTI3IEBACisvLyAtKi0gQysrIC0qLSBmb3J3YXJkaW5nIGhlYWRlci4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvY3djdHlwZQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBmaWxlLiAgWW91IHNob3VsZCBAYyBcI2luY2x1ZGUgdGhpcyBmaWxlCisgKiAgaW4geW91ciBwcm9ncmFtcywgcmF0aGVyIHRoYW4gYW55IG9mIHRoZSBAYSAqLmggaW1wbGVtZW50YXRpb24gZmlsZXMuCisgKgorICogIFRoaXMgaXMgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkgaGVhZGVyIEBjIHdjdHlwZS5oLAorICogIGFuZCBpdHMgY29udGVudHMgYXJlIChtb3N0bHkpIHRoZSBzYW1lIGFzIHRoYXQgaGVhZGVyLCBidXQgYXJlIGFsbAorICogIGNvbnRhaW5lZCBpbiB0aGUgbmFtZXNwYWNlIEBjIHN0ZCAoZXhjZXB0IGZvciBuYW1lcyB3aGljaCBhcmUgZGVmaW5lZAorICogIGFzIG1hY3JvcyBpbiBDKS4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogPGN3Y3R5cGU+CisvLworCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWYgX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSAorCisjaWYgX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fIDwgMTAKKy8vIFdvcmsgYXJvdW5kIGdsaWJjIEJaIDk2OTQKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8d2N0eXBlLmg+CisjZW5kaWYgLy8gX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSAorCisjaWZuZGVmIF9HTElCQ1hYX0NXQ1RZUEUKKyNkZWZpbmUgX0dMSUJDWFhfQ1dDVFlQRSAxCisKKy8vIEdldCByaWQgb2YgdGhvc2UgbWFjcm9zIGRlZmluZWQgaW4gPHdjdHlwZS5oPiBpbiBsaWV1IG9mIHJlYWwgZnVuY3Rpb25zLgorI3VuZGVmIGlzd2FsbnVtCisjdW5kZWYgaXN3YWxwaGEKKyNpZiBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LCisjIHVuZGVmIGlzd2JsYW5rCisjZW5kaWYKKyN1bmRlZiBpc3djbnRybAorI3VuZGVmIGlzd2N0eXBlCisjdW5kZWYgaXN3ZGlnaXQKKyN1bmRlZiBpc3dncmFwaAorI3VuZGVmIGlzd2xvd2VyCisjdW5kZWYgaXN3cHJpbnQKKyN1bmRlZiBpc3dwdW5jdAorI3VuZGVmIGlzd3NwYWNlCisjdW5kZWYgaXN3dXBwZXIKKyN1bmRlZiBpc3d4ZGlnaXQKKyN1bmRlZiB0b3djdHJhbnMKKyN1bmRlZiB0b3dsb3dlcgorI3VuZGVmIHRvd3VwcGVyCisjdW5kZWYgd2N0cmFucworI3VuZGVmIHdjdHlwZQorCisjaWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZAoreworICB1c2luZyA6OndjdHJhbnNfdDsKKyAgdXNpbmcgOjp3Y3R5cGVfdDsKKyAgdXNpbmcgOjp3aW50X3Q7CisKKyAgdXNpbmcgOjppc3dhbG51bTsKKyAgdXNpbmcgOjppc3dhbHBoYTsKKyNpZiBfR0xJQkNYWF9IQVZFX0lTV0JMQU5LCisgIHVzaW5nIDo6aXN3Ymxhbms7CisjZW5kaWYKKyAgdXNpbmcgOjppc3djbnRybDsKKyAgdXNpbmcgOjppc3djdHlwZTsKKyAgdXNpbmcgOjppc3dkaWdpdDsKKyAgdXNpbmcgOjppc3dncmFwaDsKKyAgdXNpbmcgOjppc3dsb3dlcjsKKyAgdXNpbmcgOjppc3dwcmludDsKKyAgdXNpbmcgOjppc3dwdW5jdDsKKyAgdXNpbmcgOjppc3dzcGFjZTsKKyAgdXNpbmcgOjppc3d1cHBlcjsKKyAgdXNpbmcgOjppc3d4ZGlnaXQ7CisgIHVzaW5nIDo6dG93Y3RyYW5zOworICB1c2luZyA6OnRvd2xvd2VyOworICB1c2luZyA6OnRvd3VwcGVyOworICB1c2luZyA6OndjdHJhbnM7CisgIHVzaW5nIDo6d2N0eXBlOworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCituYW1lc3BhY2Ugc3RkCit7CisjaWYgX0dMSUJDWFhfSEFWRV9JU1dCTEFOSworICB1c2luZyBzdGQ6Omlzd2JsYW5rOworI2VuZGlmICAKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX0NXQ1RZUEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvY3h4YWJpLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2N4eGFiaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzA4NWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2N4eGFiaS5oCkBAIC0wLDAgKzEsNjI2IEBACisvLyBBQkkgU3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKy8vCisvLyBHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gV3JpdHRlbiBieSBOYXRoYW4gU2lkd2VsbCwgQ29kZXNvdXJjZXJ5IExMQywgPG5hdGhhbkBjb2Rlc291cmNlcnkuY29tPgorCisvKiBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIG5ldyBhYmkgZW50cnkgcG9pbnRzIGludG8gdGhlIHJ1bnRpbWUuIEl0IGlzIG5vdAorICAgbm9ybWFsbHkgbmVjZXNzYXJ5IGZvciB1c2VyIHByb2dyYW1zIHRvIGluY2x1ZGUgdGhpcyBoZWFkZXIsIG9yIHVzZSB0aGUKKyAgIGVudHJ5IHBvaW50cyBkaXJlY3RseS4gSG93ZXZlciwgdGhpcyBoZWFkZXIgaXMgYXZhaWxhYmxlIHNob3VsZCB0aGF0IGJlCisgICBuZWVkZWQuCisKKyAgIFNvbWUgb2YgdGhlIGVudHJ5IHBvaW50cyBhcmUgaW50ZW5kZWQgZm9yIGJvdGggQyBhbmQgQysrLCB0aHVzIHRoaXMgaGVhZGVyCisgICBpcyBpbmNsdWRhYmxlIGZyb20gYm90aCBDIGFuZCBDKysuIFRob3VnaCB0aGUgQysrIHNwZWNpZmljIHBhcnRzIGFyZSBub3QKKyAgIGF2YWlsYWJsZSBpbiBDLCBuYXR1cmFsbHkgZW5vdWdoLiAgKi8KKworLyoqIEBmaWxlIGN4eGFiaS5oCisgKiAgVGhlIGhlYWRlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEMrKyBBQkkuCisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX0gKKyNkZWZpbmUgX0NYWEFCSV9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfdHdlYWtzLmg+CisjaW5jbHVkZSA8Yml0cy9jeHhhYmlfZm9yY2VkLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworbmFtZXNwYWNlIF9fY3h4YWJpdjEKK3sKKyAgZXh0ZXJuICJDIgorICB7CisjZW5kaWYKKworICB0eXBlZGVmIF9fY3hhX2NkdG9yX3JldHVybl90eXBlICgqX19jeGFfY2R0b3JfdHlwZSkodm9pZCAqKTsKKworICAvLyBBbGxvY2F0ZSBhcnJheS4KKyAgdm9pZCoKKyAgX19jeGFfdmVjX25ldyhzaXplX3QgX19lbGVtZW50X2NvdW50LCBzaXplX3QgX19lbGVtZW50X3NpemUsCisJCXNpemVfdCBfX3BhZGRpbmdfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2NvbnN0cnVjdG9yLAorCQlfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgdm9pZCoKKyAgX19jeGFfdmVjX25ldzIoc2l6ZV90IF9fZWxlbWVudF9jb3VudCwgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fY29uc3RydWN0b3IsCisJCSBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvciwgdm9pZCAqKCpfX2FsbG9jKSAoc2l6ZV90KSwKKwkJIHZvaWQgKCpfX2RlYWxsb2MpICh2b2lkKikpOworCisgIHZvaWQqCisgIF9fY3hhX3ZlY19uZXczKHNpemVfdCBfX2VsZW1lbnRfY291bnQsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJIHNpemVfdCBfX3BhZGRpbmdfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2NvbnN0cnVjdG9yLAorCQkgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IsIHZvaWQgKigqX19hbGxvYykgKHNpemVfdCksCisJCSB2b2lkICgqX19kZWFsbG9jKSAodm9pZCosIHNpemVfdCkpOworCisgIC8vIENvbnN0cnVjdCBhcnJheS4KKyAgX19jeGFfdmVjX2N0b3JfcmV0dXJuX3R5cGUKKyAgX19jeGFfdmVjX2N0b3Iodm9pZCogX19hcnJheV9hZGRyZXNzLCBzaXplX3QgX19lbGVtZW50X2NvdW50LAorCQkgc2l6ZV90IF9fZWxlbWVudF9zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fY29uc3RydWN0b3IsCisJCSBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgX19jeGFfdmVjX2N0b3JfcmV0dXJuX3R5cGUKKyAgX19jeGFfdmVjX2NjdG9yKHZvaWQqIF9fZGVzdF9hcnJheSwgdm9pZCogX19zcmNfYXJyYXksCisJCSAgc2l6ZV90IF9fZWxlbWVudF9jb3VudCwgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgIF9fY3hhX2NkdG9yX3JldHVybl90eXBlICgqX19jb25zdHJ1Y3RvcikgKHZvaWQqLCB2b2lkKiksCisJCSAgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IpOworCisgIC8vIERlc3RydWN0IGFycmF5LgorICB2b2lkCisgIF9fY3hhX3ZlY19kdG9yKHZvaWQqIF9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IF9fZWxlbWVudF9jb3VudCwKKwkJIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IpOworCisgIHZvaWQKKyAgX19jeGFfdmVjX2NsZWFudXAodm9pZCogX19hcnJheV9hZGRyZXNzLCBzaXplX3QgX19lbGVtZW50X2NvdW50LCBzaXplX3QgX19zLAorCQkgICAgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IpIF9HTElCQ1hYX05PVEhST1c7CisKKyAgLy8gRGVzdHJ1Y3QgYW5kIHJlbGVhc2UgYXJyYXkuCisgIHZvaWQKKyAgX19jeGFfdmVjX2RlbGV0ZSh2b2lkKiBfX2FycmF5X2FkZHJlc3MsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJICAgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3Rvcik7CisKKyAgdm9pZAorICBfX2N4YV92ZWNfZGVsZXRlMih2b2lkKiBfX2FycmF5X2FkZHJlc3MsIHNpemVfdCBfX2VsZW1lbnRfc2l6ZSwKKwkJICAgIHNpemVfdCBfX3BhZGRpbmdfc2l6ZSwgX19jeGFfY2R0b3JfdHlwZSBfX2Rlc3RydWN0b3IsCisJCSAgICB2b2lkICgqX19kZWFsbG9jKSAodm9pZCopKTsKKworICB2b2lkCisgIF9fY3hhX3ZlY19kZWxldGUzKHZvaWQqIF9fYXJyYXlfYWRkcmVzcywgc2l6ZV90IF9fZWxlbWVudF9zaXplLAorCQkgICAgc2l6ZV90IF9fcGFkZGluZ19zaXplLCBfX2N4YV9jZHRvcl90eXBlIF9fZGVzdHJ1Y3RvciwKKwkJICAgIHZvaWQgKCpfX2RlYWxsb2MpICh2b2lkKiwgc2l6ZV90KSk7CisKKyAgaW50CisgIF9fY3hhX2d1YXJkX2FjcXVpcmUoX19ndWFyZCopOworCisgIHZvaWQKKyAgX19jeGFfZ3VhcmRfcmVsZWFzZShfX2d1YXJkKikgX0dMSUJDWFhfTk9USFJPVzsKKworICB2b2lkCisgIF9fY3hhX2d1YXJkX2Fib3J0KF9fZ3VhcmQqKSBfR0xJQkNYWF9OT1RIUk9XOworCisgIC8vIFB1cmUgdmlydHVhbCBmdW5jdGlvbnMuCisgIHZvaWQKKyAgX19jeGFfcHVyZV92aXJ0dWFsKHZvaWQpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvLyBFeGNlcHRpb24gaGFuZGxpbmcuCisgIHZvaWQKKyAgX19jeGFfYmFkX2Nhc3QoKTsKKworICB2b2lkCisgIF9fY3hhX2JhZF90eXBlaWQoKTsKKworICAvLyBEU08gZGVzdHJ1Y3Rpb24uCisgIGludAorICBfX2N4YV9hdGV4aXQodm9pZCAoKikodm9pZCopLCB2b2lkKiwgdm9pZCopIF9HTElCQ1hYX05PVEhST1c7CisKKyAgaW50CisgIF9fY3hhX2ZpbmFsaXplKHZvaWQqKTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIERlbWFuZ2xpbmcgcm91dGluZS4KKyAgICogIEFCSS1tYW5kYXRlZCBlbnRyeSBwb2ludCBpbiB0aGUgQysrIHJ1bnRpbWUgbGlicmFyeSBmb3IgZGVtYW5nbGluZy4KKyAgICoKKyAgICogIEBwYXJhbSBfX21hbmdsZWRfbmFtZSBBIE5VTC10ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmcKKyAgICogIGNvbnRhaW5pbmcgdGhlIG5hbWUgdG8gYmUgZGVtYW5nbGVkLgorICAgKgorICAgKiAgQHBhcmFtIF9fb3V0cHV0X2J1ZmZlciBBIHJlZ2lvbiBvZiBtZW1vcnksIGFsbG9jYXRlZCB3aXRoCisgICAqICBtYWxsb2MsIG9mIEBhICpfX2xlbmd0aCBieXRlcywgaW50byB3aGljaCB0aGUgZGVtYW5nbGVkIG5hbWUgaXMKKyAgICogIHN0b3JlZC4gIElmIEBhIF9fb3V0cHV0X2J1ZmZlciBpcyBub3QgbG9uZyBlbm91Z2gsIGl0IGlzCisgICAqICBleHBhbmRlZCB1c2luZyByZWFsbG9jLiAgQGEgX19vdXRwdXRfYnVmZmVyIG1heSBpbnN0ZWFkIGJlIE5VTEw7CisgICAqICBpbiB0aGF0IGNhc2UsIHRoZSBkZW1hbmdsZWQgbmFtZSBpcyBwbGFjZWQgaW4gYSByZWdpb24gb2YgbWVtb3J5CisgICAqICBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MuCisgICAqCisgICAqICBAcGFyYW0gX19sZW5ndGggSWYgQGEgX19sZW5ndGggaXMgbm9uLU5VTEwsIHRoZSBsZW5ndGggb2YgdGhlCisgICAqICBidWZmZXIgY29udGFpbmluZyB0aGUgZGVtYW5nbGVkIG5hbWUgaXMgcGxhY2VkIGluIEBhICpfX2xlbmd0aC4KKyAgICoKKyAgICogIEBwYXJhbSBfX3N0YXR1cyBAYSAqX19zdGF0dXMgaXMgc2V0IHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICogICAwOiBUaGUgZGVtYW5nbGluZyBvcGVyYXRpb24gc3VjY2VlZGVkLgorICAgKiAgLTE6IEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvY2N1cnJlZC4KKyAgICogIC0yOiBAYSBtYW5nbGVkX25hbWUgaXMgbm90IGEgdmFsaWQgbmFtZSB1bmRlciB0aGUgQysrIEFCSSBtYW5nbGluZyBydWxlcy4KKyAgICogIC0zOiBPbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkLgorICAgKgorICAgKiAgQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBOVUwtdGVybWluYXRlZCBkZW1hbmdsZWQKKyAgICogIG5hbWUsIG9yIE5VTEwgaWYgdGhlIGRlbWFuZ2xpbmcgZmFpbHMuICBUaGUgY2FsbGVyIGlzCisgICAqICByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoaXMgbWVtb3J5IHVzaW5nIEBjIGZyZWUuCisgICAqCisgICAqICBUaGUgZGVtYW5nbGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEMrKyBBQkkgbWFuZ2xpbmcgcnVsZXMsCisgICAqICB3aXRoIEdOVSBleHRlbnNpb25zLiBGb3IgZXhhbXBsZSwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluCisgICAqICBfX2dudV9jeHg6Ol9fdmVyYm9zZV90ZXJtaW5hdGVfaGFuZGxlci4KKyAgICoKKyAgICogIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDEyY2gzOS5odG1sCisgICAqICBmb3Igb3RoZXIgZXhhbXBsZXMgb2YgdXNlLgorICAgKgorICAgKiAgQG5vdGUgVGhlIHNhbWUgZGVtYW5nbGluZyBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSB2aWEKKyAgICogIGxpYmliZXJ0eSAoQGMgPGxpYmliZXJ0eS9kZW1hbmdsZS5oPiBhbmQgQGMgbGliaWJlcnR5LmEpIGluIEdDQworICAgKiAgMy4xIGFuZCBsYXRlciwgYnV0IHRoYXQgcmVxdWlyZXMgZXhwbGljaXQgaW5zdGFsbGF0aW9uIChAYworICAgKiAgLS1lbmFibGUtaW5zdGFsbC1saWJpYmVydHkpIGFuZCB1c2VzIGEgZGlmZmVyZW50IEFQSSwgYWx0aG91Z2gKKyAgICogIHRoZSBBQkkgaXMgdW5jaGFuZ2VkLgorICAgKi8KKyAgY2hhcioKKyAgX19jeGFfZGVtYW5nbGUoY29uc3QgY2hhciogX19tYW5nbGVkX25hbWUsIGNoYXIqIF9fb3V0cHV0X2J1ZmZlciwKKwkJIHNpemVfdCogX19sZW5ndGgsIGludCogX19zdGF0dXMpOworI2lmZGVmIF9fY3BsdXNwbHVzCisgIH0KK30gLy8gbmFtZXNwYWNlIF9fY3h4YWJpdjEKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPHR5cGVpbmZvPgorCituYW1lc3BhY2UgX19jeHhhYml2MQoreworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBpbnQsIGZsb2F0IGV0Yy4KKyAgY2xhc3MgX19mdW5kYW1lbnRhbF90eXBlX2luZm8gOiBwdWJsaWMgc3RkOjp0eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBfX2Z1bmRhbWVudGFsX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24pIDogc3RkOjp0eXBlX2luZm8oX19uKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X19mdW5kYW1lbnRhbF90eXBlX2luZm8oKTsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBhcnJheSBvYmplY3RzLgorICBjbGFzcyBfX2FycmF5X3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fYXJyYXlfdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2FycmF5X3R5cGVfaW5mbygpOworICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGZ1bmN0aW9ucyAoYm90aCBtZW1iZXIgYW5kIG5vbi1tZW1iZXIpLgorICBjbGFzcyBfX2Z1bmN0aW9uX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fZnVuY3Rpb25fdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2Z1bmN0aW9uX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2lzX2Z1bmN0aW9uX3AoKSBjb25zdDsKKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBlbnVtZXJhdGlvbnMuCisgIGNsYXNzIF9fZW51bV90eXBlX2luZm8gOiBwdWJsaWMgc3RkOjp0eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQKKyAgICBfX2VudW1fdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbikgOiBzdGQ6OnR5cGVfaW5mbyhfX24pIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX2VudW1fdHlwZV9pbmZvKCk7CisgIH07CisKKyAgLy8gQ29tbW9uIHR5cGUgaW5mb3JtYXRpb24gZm9yIHNpbXBsZSBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyLgorICBjbGFzcyBfX3BiYXNlX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICB1bnNpZ25lZCBpbnQgCQlfX2ZsYWdzOyAvLyBRdWFsaWZpY2F0aW9uIG9mIHRoZSB0YXJnZXQgb2JqZWN0LgorICAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiAJX19wb2ludGVlOyAvLyBUeXBlIG9mIHBvaW50ZWQgdG8gb2JqZWN0LgorCisgICAgZXhwbGljaXQKKyAgICBfX3BiYXNlX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24sIGludCBfX3F1YWxzLAorCQkgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyogX190eXBlKQorICAgIDogc3RkOjp0eXBlX2luZm8oX19uKSwgX19mbGFncyhfX3F1YWxzKSwgX19wb2ludGVlKF9fdHlwZSkKKyAgICB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X19wYmFzZV90eXBlX2luZm8oKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4KKyAgICBlbnVtIF9fbWFza3MKKyAgICAgIHsKKwlfX2NvbnN0X21hc2sgPSAweDEsCisJX192b2xhdGlsZV9tYXNrID0gMHgyLAorCV9fcmVzdHJpY3RfbWFzayA9IDB4NCwKKwlfX2luY29tcGxldGVfbWFzayA9IDB4OCwKKwlfX2luY29tcGxldGVfY2xhc3NfbWFzayA9IDB4MTAKKyAgICAgIH07CisKKyAgcHJvdGVjdGVkOgorICAgIF9fcGJhc2VfdHlwZV9pbmZvKGNvbnN0IF9fcGJhc2VfdHlwZV9pbmZvJik7CisKKyAgICBfX3BiYXNlX3R5cGVfaW5mbyYKKyAgICBvcGVyYXRvcj0oY29uc3QgX19wYmFzZV90eXBlX2luZm8mKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX2NhdGNoKGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBfX3Rocl90eXBlLCB2b2lkKiogX190aHJfb2JqLAorCSAgICAgICB1bnNpZ25lZCBpbnQgX19vdXRlcikgY29uc3Q7CisKKyAgICBpbmxpbmUgdmlydHVhbCBib29sCisgICAgX19wb2ludGVyX2NhdGNoKGNvbnN0IF9fcGJhc2VfdHlwZV9pbmZvKiBfX3Rocl90eXBlLCB2b2lkKiogX190aHJfb2JqLAorCQkgICAgdW5zaWduZWQgX19vdXRlcikgY29uc3Q7CisgIH07CisKKyAgLy8gVHlwZSBpbmZvcm1hdGlvbiBmb3Igc2ltcGxlIHBvaW50ZXJzLgorICBjbGFzcyBfX3BvaW50ZXJfdHlwZV9pbmZvIDogcHVibGljIF9fcGJhc2VfdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0CisgICAgX19wb2ludGVyX3R5cGVfaW5mbyhjb25zdCBjaGFyKiBfX24sIGludCBfX3F1YWxzLAorCQkJY29uc3Qgc3RkOjp0eXBlX2luZm8qIF9fdHlwZSkKKyAgICA6IF9fcGJhc2VfdHlwZV9pbmZvIChfX24sIF9fcXVhbHMsIF9fdHlwZSkgeyB9CisKKworICAgIHZpcnR1YWwKKyAgICB+X19wb2ludGVyX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbnMuCisgICAgdmlydHVhbCBib29sCisgICAgX19pc19wb2ludGVyX3AoKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbAorICAgIF9fcG9pbnRlcl9jYXRjaChjb25zdCBfX3BiYXNlX3R5cGVfaW5mbyogX190aHJfdHlwZSwgdm9pZCoqIF9fdGhyX29iaiwKKwkJICAgIHVuc2lnbmVkIF9fb3V0ZXIpIGNvbnN0OworICB9OworCisgIGNsYXNzIF9fY2xhc3NfdHlwZV9pbmZvOworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGEgcG9pbnRlciB0byBtZW1iZXIgdmFyaWFibGUuCisgIGNsYXNzIF9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvIDogcHVibGljIF9fcGJhc2VfdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fY2xhc3NfdHlwZV9pbmZvKiBfX2NvbnRleHQ7ICAgLy8gQ2xhc3Mgb2YgdGhlIG1lbWJlci4KKworICAgIGV4cGxpY2l0CisgICAgX19wb2ludGVyX3RvX21lbWJlcl90eXBlX2luZm8oY29uc3QgY2hhciogX19uLCBpbnQgX19xdWFscywKKwkJCQkgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBfX3R5cGUsCisJCQkJICBfX2NsYXNzX3R5cGVfaW5mbyogX19rbGFzcykKKyAgICA6IF9fcGJhc2VfdHlwZV9pbmZvKF9fbiwgX19xdWFscywgX190eXBlKSwgX19jb250ZXh0KF9fa2xhc3MpIHsgfQorCisgICAgdmlydHVhbAorICAgIH5fX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbygpOworCisgIHByb3RlY3RlZDoKKyAgICBfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbyhjb25zdCBfX3BvaW50ZXJfdG9fbWVtYmVyX3R5cGVfaW5mbyYpOworCisgICAgX19wb2ludGVyX3RvX21lbWJlcl90eXBlX2luZm8mCisgICAgb3BlcmF0b3I9KGNvbnN0IF9fcG9pbnRlcl90b19tZW1iZXJfdHlwZV9pbmZvJik7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIG1lbWJlciBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX3BvaW50ZXJfY2F0Y2goY29uc3QgX19wYmFzZV90eXBlX2luZm8qIF9fdGhyX3R5cGUsIHZvaWQqKiBfX3Rocl9vYmosCisJCSAgICB1bnNpZ25lZCBfX291dGVyKSBjb25zdDsKKyAgfTsKKworICAvLyBIZWxwZXIgY2xhc3MgZm9yIF9fdm1pX2NsYXNzX3R5cGUuCisgIGNsYXNzIF9fYmFzZV9jbGFzc190eXBlX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgY29uc3QgX19jbGFzc190eXBlX2luZm8qIAlfX2Jhc2VfdHlwZTsgIC8vIEJhc2UgY2xhc3MgdHlwZS4KKyAgICBsb25nIAkJCV9fb2Zmc2V0X2ZsYWdzOyAgLy8gT2Zmc2V0IGFuZCBpbmZvLgorCisgICAgZW51bSBfX29mZnNldF9mbGFnc19tYXNrcworICAgICAgeworCV9fdmlydHVhbF9tYXNrID0gMHgxLAorCV9fcHVibGljX21hc2sgPSAweDIsCisJX19od21fYml0ID0gMiwKKwlfX29mZnNldF9zaGlmdCA9IDggICAgICAgICAgLy8gQml0cyB0byBzaGlmdCBvZmZzZXQuCisgICAgICB9OworCisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCBtZW1iZXIgZnVuY3Rpb25zLgorICAgIGJvb2wKKyAgICBfX2lzX3ZpcnR1YWxfcCgpIGNvbnN0CisgICAgeyByZXR1cm4gX19vZmZzZXRfZmxhZ3MgJiBfX3ZpcnR1YWxfbWFzazsgfQorCisgICAgYm9vbAorICAgIF9faXNfcHVibGljX3AoKSBjb25zdAorICAgIHsgcmV0dXJuIF9fb2Zmc2V0X2ZsYWdzICYgX19wdWJsaWNfbWFzazsgfQorCisgICAgcHRyZGlmZl90CisgICAgX19vZmZzZXQoKSBjb25zdAorICAgIHsKKyAgICAgIC8vIFRoaXMgc2hpZnQsIGJlaW5nIG9mIGEgc2lnbmVkIHR5cGUsIGlzIGltcGxlbWVudGF0aW9uCisgICAgICAvLyBkZWZpbmVkLiBHQ0MgaW1wbGVtZW50cyBzdWNoIHNoaWZ0cyBhcyBhcml0aG1ldGljLCB3aGljaCBpcworICAgICAgLy8gd2hhdCB3ZSB3YW50LgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oX19vZmZzZXRfZmxhZ3MpID4+IF9fb2Zmc2V0X3NoaWZ0OworICAgIH0KKyAgfTsKKworICAvLyBUeXBlIGluZm9ybWF0aW9uIGZvciBhIGNsYXNzLgorICBjbGFzcyBfX2NsYXNzX3R5cGVfaW5mbyA6IHB1YmxpYyBzdGQ6OnR5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdAorICAgIF9fY2xhc3NfdHlwZV9pbmZvIChjb25zdCBjaGFyICpfX24pIDogdHlwZV9pbmZvKF9fbikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fY2xhc3NfdHlwZV9pbmZvICgpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlcy4KKyAgICAvLyBUaGUgdHlwZSBzdWJfa2luZCB0ZWxscyB1cyBhYm91dCBob3cgYSBiYXNlIG9iamVjdCBpcyBjb250YWluZWQKKyAgICAvLyB3aXRoaW4gYSBkZXJpdmVkIG9iamVjdC4gV2Ugb2Z0ZW4gZG8gdGhpcyBsYXppbHksIGhlbmNlIHRoZQorICAgIC8vIFVOS05PV04gdmFsdWUuIEF0IG90aGVyIHRpbWVzIHdlIG1heSB1c2UgTk9UX0NPTlRBSU5FRCB0byBtZWFuCisgICAgLy8gbm90IHB1YmxpY2x5IGNvbnRhaW5lZC4KKyAgICBlbnVtIF9fc3ViX2tpbmQKKyAgICAgIHsKKwkvLyBXZSBoYXZlIG5vIGlkZWEuCisJX191bmtub3duID0gMCwKKworCS8vIE5vdCBjb250YWluZWQgd2l0aGluIHVzIChpbiBzb21lIGNpcmN1bXN0YW5jZXMgdGhpcyBtaWdodAorCS8vIG1lYW4gbm90IGNvbnRhaW5lZCBwdWJsaWNseSkKKwlfX25vdF9jb250YWluZWQsCisKKwkvLyBDb250YWluZWQgYW1iaWd1b3VzbHkuCisJX19jb250YWluZWRfYW1iaWcsCisKKwkvLyBWaWEgYSB2aXJ0dWFsIHBhdGguCisJX19jb250YWluZWRfdmlydHVhbF9tYXNrID0gX19iYXNlX2NsYXNzX3R5cGVfaW5mbzo6X192aXJ0dWFsX21hc2ssCisKKwkvLyBWaWEgYSBwdWJsaWMgcGF0aC4KKwlfX2NvbnRhaW5lZF9wdWJsaWNfbWFzayA9IF9fYmFzZV9jbGFzc190eXBlX2luZm86Ol9fcHVibGljX21hc2ssCisKKwkvLyBDb250YWluZWQgd2l0aGluIHVzLgorCV9fY29udGFpbmVkX21hc2sgPSAxIDw8IF9fYmFzZV9jbGFzc190eXBlX2luZm86Ol9faHdtX2JpdCwKKworCV9fY29udGFpbmVkX3ByaXZhdGUgPSBfX2NvbnRhaW5lZF9tYXNrLAorCV9fY29udGFpbmVkX3B1YmxpYyA9IF9fY29udGFpbmVkX21hc2sgfCBfX2NvbnRhaW5lZF9wdWJsaWNfbWFzaworICAgICAgfTsKKworICAgIHN0cnVjdCBfX3VwY2FzdF9yZXN1bHQ7CisgICAgc3RydWN0IF9fZHluY2FzdF9yZXN1bHQ7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX3VwY2FzdChjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3RfdHlwZSwgdm9pZCoqX19vYmpfcHRyKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fY2F0Y2goY29uc3QgdHlwZV9pbmZvKiBfX3Rocl90eXBlLCB2b2lkKiogX190aHJfb2JqLAorCSAgICAgICB1bnNpZ25lZCBfX291dGVyKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgLy8gSGVscGVyIGZvciB1cGNhc3QuIFNlZSBpZiBEU1QgaXMgdXMsIG9yIG9uZSBvZiBvdXIgYmFzZXMuCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIG5vdCBmb3VuZCwgdHJ1ZSBpZiBmb3VuZC4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX3VwY2FzdChjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3QsIGNvbnN0IHZvaWQqIF9fb2JqLAorCQlfX3VwY2FzdF9yZXN1bHQmIF9fcmVzdHJpY3QgX19yZXN1bHQpIGNvbnN0OworCisgICAgLy8gSW5kaWNhdGUgd2hldGhlciBTUkNfUFRSIG9mIHR5cGUgU1JDX1RZUEUgaXMgY29udGFpbmVkIHB1YmxpY2x5CisgICAgLy8gd2l0aGluIE9CSl9QVFIuIE9CSl9QVFIgcG9pbnRzIHRvIGEgYmFzZSBvYmplY3Qgb2Ygb3VyIHR5cGUsCisgICAgLy8gd2hpY2ggaXMgdGhlIGRlc3RpbmF0aW9uIHR5cGUuIFNSQzJEU1QgaW5kaWNhdGVzIGhvdyBTUkMKKyAgICAvLyBvYmplY3RzIG1pZ2h0IGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyB0eXBlLiAgSWYgU1JDX1BUUiBpcyBvbmUKKyAgICAvLyBvZiBvdXIgU1JDX1RZUEUgYmFzZXMsIGluZGljYXRlIHRoZSB2aXJ0dWFsaXR5LiBSZXR1cm5zCisgICAgLy8gbm90X2NvbnRhaW5lZCBmb3Igbm9uIGNvbnRhaW5tZW50IG9yIHByaXZhdGUgY29udGFpbm1lbnQuCisgICAgaW5saW5lIF9fc3ViX2tpbmQKKyAgICBfX2ZpbmRfcHVibGljX3NyYyhwdHJkaWZmX3QgX19zcmMyZHN0LCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCSAgICAgIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLAorCQkgICAgICBjb25zdCB2b2lkKiBfX3NyY19wdHIpIGNvbnN0OworCisgICAgLy8gSGVscGVyIGZvciBkeW5hbWljIGNhc3QuIEFDQ0VTU19QQVRIIGdpdmVzIHRoZSBhY2Nlc3MgZnJvbSB0aGUKKyAgICAvLyBtb3N0IGRlcml2ZWQgb2JqZWN0IHRvIHRoaXMgYmFzZS4gRFNUX1RZUEUgaW5kaWNhdGVzIHRoZQorICAgIC8vIGRlc2lyZWQgdHlwZSB3ZSB3YW50LiBPQkpfUFRSIHBvaW50cyB0byBhIGJhc2Ugb2Ygb3VyIHR5cGUKKyAgICAvLyB3aXRoaW4gdGhlIGNvbXBsZXRlIG9iamVjdC4gU1JDX1RZUEUgaW5kaWNhdGVzIHRoZSBzdGF0aWMgdHlwZQorICAgIC8vIHN0YXJ0ZWQgZnJvbSBhbmQgU1JDX1BUUiBwb2ludHMgdG8gdGhhdCBiYXNlIHdpdGhpbiB0aGUgbW9zdAorICAgIC8vIGRlcml2ZWQgb2JqZWN0LiBGaWxsIGluIFJFU1VMVCB3aXRoIHdoYXQgd2UgZmluZC4gUmV0dXJuIHRydWUKKyAgICAvLyBpZiB3ZSBoYXZlIGxvY2F0ZWQgYW4gYW1iaWd1b3VzIG1hdGNoLgorICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fZHluY2FzdChwdHJkaWZmX3QgX19zcmMyZHN0LCBfX3N1Yl9raW5kIF9fYWNjZXNzX3BhdGgsCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3RfdHlwZSwgY29uc3Qgdm9pZCogX19vYmpfcHRyLAorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsIGNvbnN0IHZvaWQqIF9fc3JjX3B0ciwKKwkJIF9fZHluY2FzdF9yZXN1bHQmIF9fcmVzdWx0KSBjb25zdDsKKworICAgIC8vIEhlbHBlciBmb3IgZmluZF9wdWJsaWNfc3Vib2JqLiBTUkMyRFNUIGluZGljYXRlcyBob3cgU1JDX1RZUEUKKyAgICAvLyBiYXNlcyBhcmUgaW5oZXJpdGVkIGJ5IHRoZSB0eXBlIHN0YXJ0ZWQgZnJvbSAtLSB3aGljaCBpcyBub3QKKyAgICAvLyBuZWNlc3NhcmlseSB0aGUgY3VycmVudCB0eXBlLiBUaGUgY3VycmVudCB0eXBlIHdpbGwgYmUgYSBiYXNlCisgICAgLy8gb2YgdGhlIGRlc3RpbmF0aW9uIHR5cGUuICBPQkpfUFRSIHBvaW50cyB0byB0aGUgY3VycmVudCBiYXNlLgorICAgIHZpcnR1YWwgX19zdWJfa2luZAorICAgIF9fZG9fZmluZF9wdWJsaWNfc3JjKHB0cmRpZmZfdCBfX3NyYzJkc3QsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19zcmNfdHlwZSwKKwkJCSBjb25zdCB2b2lkKiBfX3NyY19wdHIpIGNvbnN0OworICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3Mgd2l0aCBhIHNpbmdsZSBub24tdmlydHVhbCBiYXNlLgorICBjbGFzcyBfX3NpX2NsYXNzX3R5cGVfaW5mbyA6IHB1YmxpYyBfX2NsYXNzX3R5cGVfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19iYXNlX3R5cGU7CisKKyAgICBleHBsaWNpdAorICAgIF9fc2lfY2xhc3NfdHlwZV9pbmZvKGNvbnN0IGNoYXIgKl9fbiwgY29uc3QgX19jbGFzc190eXBlX2luZm8gKl9fYmFzZSkKKyAgICA6IF9fY2xhc3NfdHlwZV9pbmZvKF9fbiksIF9fYmFzZV90eXBlKF9fYmFzZSkgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfl9fc2lfY2xhc3NfdHlwZV9pbmZvKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIF9fc2lfY2xhc3NfdHlwZV9pbmZvKGNvbnN0IF9fc2lfY2xhc3NfdHlwZV9pbmZvJik7CisKKyAgICBfX3NpX2NsYXNzX3R5cGVfaW5mbyYKKyAgICBvcGVyYXRvcj0oY29uc3QgX19zaV9jbGFzc190eXBlX2luZm8mKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX2R5bmNhc3QocHRyZGlmZl90IF9fc3JjMmRzdCwgX19zdWJfa2luZCBfX2FjY2Vzc19wYXRoLAorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0X3R5cGUsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLCBjb25zdCB2b2lkKiBfX3NyY19wdHIsCisJCSBfX2R5bmNhc3RfcmVzdWx0JiBfX3Jlc3VsdCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIF9fc3ViX2tpbmQKKyAgICBfX2RvX2ZpbmRfcHVibGljX3NyYyhwdHJkaWZmX3QgX19zcmMyZHN0LCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsCisJCQkgY29uc3Qgdm9pZCogX19zdWJfcHRyKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fdXBjYXN0KGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKl9fZHN0LCBjb25zdCB2b2lkKl9fb2JqLAorCQlfX3VwY2FzdF9yZXN1bHQmIF9fcmVzdHJpY3QgX19yZXN1bHQpIGNvbnN0OworICB9OworCisgIC8vIFR5cGUgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3Mgd2l0aCBtdWx0aXBsZSBhbmQvb3IgdmlydHVhbCBiYXNlcy4KKyAgY2xhc3MgX192bWlfY2xhc3NfdHlwZV9pbmZvIDogcHVibGljIF9fY2xhc3NfdHlwZV9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIHVuc2lnbmVkIGludCAJCV9fZmxhZ3M7ICAvLyBEZXRhaWxzIGFib3V0IHRoZSBjbGFzcyBoaWVyYXJjaHkuCisgICAgdW5zaWduZWQgaW50IAkJX19iYXNlX2NvdW50OyAgLy8gTnVtYmVyIG9mIGRpcmVjdCBiYXNlcy4KKworICAgIC8vIFRoZSBhcnJheSBvZiBiYXNlcyB1c2VzIHRoZSB0cmFpbGluZyBhcnJheSBzdHJ1Y3QgaGFjayBzbyB0aGlzCisgICAgLy8gY2xhc3MgaXMgbm90IGNvbnN0cnVjdGFibGUgd2l0aCBhIG5vcm1hbCBjb25zdHJ1Y3Rvci4gSXQgaXMKKyAgICAvLyBpbnRlcm5hbGx5IGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuCisgICAgX19iYXNlX2NsYXNzX3R5cGVfaW5mbyAJX19iYXNlX2luZm9bMV07ICAvLyBBcnJheSBvZiBiYXNlcy4KKworICAgIGV4cGxpY2l0CisgICAgX192bWlfY2xhc3NfdHlwZV9pbmZvKGNvbnN0IGNoYXIqIF9fbiwgaW50IF9fX2ZsYWdzKQorICAgIDogX19jbGFzc190eXBlX2luZm8oX19uKSwgX19mbGFncyhfX19mbGFncyksIF9fYmFzZV9jb3VudCgwKSB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+X192bWlfY2xhc3NfdHlwZV9pbmZvKCk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGVzLgorICAgIGVudW0gX19mbGFnc19tYXNrcworICAgICAgeworCV9fbm9uX2RpYW1vbmRfcmVwZWF0X21hc2sgPSAweDEsIC8vIERpc3RpbmN0IGluc3RhbmNlIG9mIHJlcGVhdGVkIGJhc2UuCisJX19kaWFtb25kX3NoYXBlZF9tYXNrID0gMHgyLCAvLyBEaWFtb25kIHNoYXBlZCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKwlfX2ZsYWdzX3Vua25vd25fbWFzayA9IDB4MTAKKyAgICAgIH07CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIEltcGxlbWVudGF0aW9uIGRlZmluZWQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBfX2RvX2R5bmNhc3QocHRyZGlmZl90IF9fc3JjMmRzdCwgX19zdWJfa2luZCBfX2FjY2Vzc19wYXRoLAorCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fZHN0X3R5cGUsIGNvbnN0IHZvaWQqIF9fb2JqX3B0ciwKKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLCBjb25zdCB2b2lkKiBfX3NyY19wdHIsCisJCSBfX2R5bmNhc3RfcmVzdWx0JiBfX3Jlc3VsdCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIF9fc3ViX2tpbmQKKyAgICBfX2RvX2ZpbmRfcHVibGljX3NyYyhwdHJkaWZmX3QgX19zcmMyZHN0LCBjb25zdCB2b2lkKiBfX29ial9wdHIsCisJCQkgY29uc3QgX19jbGFzc190eXBlX2luZm8qIF9fc3JjX3R5cGUsCisJCQkgY29uc3Qgdm9pZCogX19zcmNfcHRyKSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbAorICAgIF9fZG9fdXBjYXN0KGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX2RzdCwgY29uc3Qgdm9pZCogX19vYmosCisJCV9fdXBjYXN0X3Jlc3VsdCYgX19yZXN0cmljdCBfX3Jlc3VsdCkgY29uc3Q7CisgIH07CisKKyAgLy8gRHluYW1pYyBjYXN0IHJ1bnRpbWUuCisgIC8vIHNyYzJkc3QgaGFzIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgdmFsdWVzCisgIC8vICA+LTE6IHNyY190eXBlIGlzIGEgdW5pcXVlIHB1YmxpYyBub24tdmlydHVhbCBiYXNlIG9mIGRzdF90eXBlCisgIC8vICAgICAgIGRzdF9wdHIgKyBzcmMyZHN0ID09IHNyY19wdHIKKyAgLy8gICAtMTogdW5zcGVjaWZpZWQgcmVsYXRpb25zaGlwCisgIC8vICAgLTI6IHNyY190eXBlIGlzIG5vdCBhIHB1YmxpYyBiYXNlIG9mIGRzdF90eXBlCisgIC8vICAgLTM6IHNyY190eXBlIGlzIGEgbXVsdGlwbGUgcHVibGljIG5vbi12aXJ0dWFsIGJhc2Ugb2YgZHN0X3R5cGUKKyAgZXh0ZXJuICJDIiB2b2lkKgorICBfX2R5bmFtaWNfY2FzdChjb25zdCB2b2lkKiBfX3NyY19wdHIsIC8vIFN0YXJ0aW5nIG9iamVjdC4KKwkJIGNvbnN0IF9fY2xhc3NfdHlwZV9pbmZvKiBfX3NyY190eXBlLCAvLyBTdGF0aWMgdHlwZSBvZiBvYmplY3QuCisJCSBjb25zdCBfX2NsYXNzX3R5cGVfaW5mbyogX19kc3RfdHlwZSwgLy8gRGVzaXJlZCB0YXJnZXQgdHlwZS4KKwkJIHB0cmRpZmZfdCBfX3NyYzJkc3QpOyAvLyBIb3cgc3JjIGFuZCBkc3QgYXJlIHJlbGF0ZWQuCisKKworICAvLyBSZXR1cm5zIHRoZSB0eXBlX2luZm8gZm9yIHRoZSBjdXJyZW50bHkgaGFuZGxlZCBleGNlcHRpb24gWzE1LjMvOF0sIG9yCisgIC8vIG51bGwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgZXh0ZXJuICJDIiBzdGQ6OnR5cGVfaW5mbyoKKyAgX19jeGFfY3VycmVudF9leGNlcHRpb25fdHlwZSgpIF9HTElCQ1hYX05PVEhST1cgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKKyAgLy8gQSBtYWdpYyBwbGFjZWhvbGRlciBjbGFzcyB0aGF0IGNhbiBiZSBjYXVnaHQgYnkgcmVmZXJlbmNlCisgIC8vIHRvIHJlY29nbml6ZSBmb3JlaWduIGV4Y2VwdGlvbnMuCisgIGNsYXNzIF9fZm9yZWlnbl9leGNlcHRpb24KKyAgeworICAgIHZpcnR1YWwgfl9fZm9yZWlnbl9leGNlcHRpb24oKSBfR0xJQkNYWF9OT1RIUk9XOworICAgIHZpcnR1YWwgdm9pZCBfX3B1cmVfZHVtbXkoKSA9IDA7IC8vIHByZXZlbnQgY2F0Y2ggYnkgdmFsdWUKKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorCisvKiogQG5hbWVzcGFjZSBhYmkKKyAqICBAYnJpZWYgVGhlIGNyb3NzLXZlbmRvciBDKysgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZS4gQQorICogIG5hbWVzcGFjZSBhbGlhcyB0byBfX2N4eGFiaXYxLCBidXQgdXNlciBwcm9ncmFtcyBzaG91bGQgdXNlIHRoZQorICogIGFsaWFzICdhYmknLgorICoKKyAqICBBIGJyaWVmIG92ZXJ2aWV3IG9mIGFuIEFCSSBpcyBnaXZlbiBpbiB0aGUgbGlic3RkYysrIEZBUSwgcXVlc3Rpb24KKyAqICA1LjggKHlvdSBtYXkgaGF2ZSBhIGNvcHkgb2YgdGhlIEZBUSBsb2NhbGx5LCBvciB5b3UgY2FuIHZpZXcgdGhlIG9ubGluZQorICogIHZlcnNpb24gYXQgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL2ZhcS9pbmRleC5odG1sIzVfOCkuCisgKgorICogIEdDQyBzdWJzY3JpYmVzIHRvIGEgY3Jvc3MtdmVuZG9yIEFCSSBmb3IgQysrLCBzb21ldGltZXMKKyAqICBjYWxsZWQgdGhlIElBNjQgQUJJIGJlY2F1c2UgaXQgaGFwcGVucyB0byBiZSB0aGUgbmF0aXZlIEFCSSBmb3IgdGhhdAorICogIHBsYXRmb3JtLiAgSXQgaXMgc3VtbWFyaXplZCBhdCBodHRwOi8vd3d3LmNvZGVzb3VyY2VyeS5jb20vY3h4LWFiaS8KKyAqICBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IHNwZWNpZmljYXRpb24uCisgKgorICogIEZvciB1c2VycyBvZiBHQ0MgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMueCwgZW50cnkgcG9pbnRzIGFyZQorICogIGF2YWlsYWJsZSBpbiA8Y3h4YWJpLmg+LCB3aGljaCBub3RlcywgPGVtPidJdCBpcyBub3Qgbm9ybWFsbHkKKyAqICBuZWNlc3NhcnkgZm9yIHVzZXIgcHJvZ3JhbXMgdG8gaW5jbHVkZSB0aGlzIGhlYWRlciwgb3IgdXNlIHRoZQorICogIGVudHJ5IHBvaW50cyBkaXJlY3RseS4gIEhvd2V2ZXIsIHRoaXMgaGVhZGVyIGlzIGF2YWlsYWJsZSBzaG91bGQKKyAqICB0aGF0IGJlIG5lZWRlZC4nPC9lbT4KKyovCituYW1lc3BhY2UgYWJpID0gX19jeHhhYml2MTsKKworbmFtZXNwYWNlIF9fZ251X2N4eAoreworICAvKioKKyAgICogIEBicmllZiBFeGNlcHRpb24gdGhyb3duIGJ5IF9fY3hhX2d1YXJkX2FjcXVpcmUuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqCisgICAqICA2Ljdbc3RtdC5kY2xdLzQ6IElmIGNvbnRyb2wgcmUtZW50ZXJzIHRoZSBkZWNsYXJhdGlvbiAocmVjdXJzaXZlbHkpCisgICAqICB3aGlsZSB0aGUgb2JqZWN0IGlzIGJlaW5nIGluaXRpYWxpemVkLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICAgKgorICAgKiAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlIGEgbGlicmFyeSBmdW5jdGlvbiB0byBoYW5kbGUgbG9ja2luZywgd2UgbWlnaHQKKyAgICogIGFzIHdlbGwgY2hlY2sgZm9yIHRoaXMgc2l0dWF0aW9uIGFuZCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAqICBXZSB1c2UgdGhlIHNlY29uZCBieXRlIG9mIHRoZSBndWFyZCB2YXJpYWJsZSB0byByZW1lbWJlciB0aGF0IHdlJ3JlCisgICAqICBpbiB0aGUgbWlkZGxlIG9mIGFuIGluaXRpYWxpemF0aW9uLgorICAgKi8KKyAgY2xhc3MgcmVjdXJzaXZlX2luaXRfZXJyb3I6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICByZWN1cnNpdmVfaW5pdF9lcnJvcigpIHRocm93KCkgeyB9CisgICAgdmlydHVhbCB+cmVjdXJzaXZlX2luaXRfZXJyb3IoKSB0aHJvdyAoKTsKKyAgfTsKK30KKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjZW5kaWYgLy8gX19DWFhBQklfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9iaXRzZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2JpdHNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTkyOWU3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9iaXRzZXQKQEAgLTAsMCArMSw0MTkgQEAKKy8vIERlYnVnZ2luZyBiaXRzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvYml0c2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19CSVRTRVQKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfQklUU0VUCisKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpiaXRzZXQgd2l0aCBhZGRpdGlvbmFsIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHNpemVfdCBfTmI+CisgICAgY2xhc3MgYml0c2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+CisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgLCBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlX2Jhc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgLy8gSW4gQysrMHggd2UgcmVseSBvbiBub3JtYWwgcmVmZXJlbmNlIHR5cGUgdG8gcHJlc2VydmUgdGhlIHByb3BlcnR5CisgICAgICAvLyBvZiBiaXRzZXQgdG8gYmUgdXNlIGFzIGEgbGl0ZXJhbC4KKyAgICAgIC8vIFRPRE86IEZpbmQgYW4gb3RoZXIgc29sdXRpb24uCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisjZWxzZQorICAgICAgLy8gYml0IHJlZmVyZW5jZToKKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgOiBwcml2YXRlIF9CYXNlOjpyZWZlcmVuY2UKKyAgICAgICAgLCBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yX2Jhc2UKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgX0Jhc2VfcmVmOworCisJZnJpZW5kIGNsYXNzIGJpdHNldDsKKwlyZWZlcmVuY2UoKTsKKworCXJlZmVyZW5jZShjb25zdCBfQmFzZV9yZWYmIF9fYmFzZSwKKwkJICBiaXRzZXQqIF9fc2VxIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKKwk6IF9CYXNlX3JlZihfX2Jhc2UpCisJLCBfU2FmZV9pdGVyYXRvcl9iYXNlKF9fc2VxLCBmYWxzZSkKKwl7IH0KKworICAgICAgcHVibGljOgorCXJlZmVyZW5jZShjb25zdCByZWZlcmVuY2UmIF9feCkKKwk6IF9CYXNlX3JlZihfX3gpCisJLCBfU2FmZV9pdGVyYXRvcl9iYXNlKF9feCwgZmFsc2UpCisJeyB9CisKKwlyZWZlcmVuY2UmCisJb3BlcmF0b3I9KGJvb2wgX194KQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19iYWRfYml0c2V0X3dyaXRlKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgKnN0YXRpY19jYXN0PF9CYXNlX3JlZio+KHRoaXMpID0gX194OworCSAgcmV0dXJuICp0aGlzOworCX0KKworCXJlZmVyZW5jZSYKKwlvcGVyYXRvcj0oY29uc3QgcmVmZXJlbmNlJiBfX3gpCisJeworCSAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX194Ll9NX3Npbmd1bGFyKCksCisJCQkgICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF9yZWFkKQorCQkJCS5fTV9pdGVyYXRvcihfX3gpKTsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19iYWRfYml0c2V0X3dyaXRlKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgKnN0YXRpY19jYXN0PF9CYXNlX3JlZio+KHRoaXMpID0gX194OworCSAgcmV0dXJuICp0aGlzOworCX0KKworCWJvb2wKKwlvcGVyYXRvcn4oKSBjb25zdAorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPl9NX3Npbmd1bGFyKCksCisJCQkgICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF9yZWFkKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgcmV0dXJuIH4oKnN0YXRpY19jYXN0PGNvbnN0IF9CYXNlX3JlZio+KHRoaXMpKTsKKwl9CisKKwlvcGVyYXRvciBib29sKCkgY29uc3QKKwl7CisJICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISB0aGlzLT5fTV9zaW5ndWxhcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfYmFkX2JpdHNldF9yZWFkKQorCQkJCS5fTV9pdGVyYXRvcigqdGhpcykpOworCSAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQmFzZV9yZWYqPih0aGlzKTsKKwl9CisKKwlyZWZlcmVuY2UmCisJZmxpcCgpCisJeworCSAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgdGhpcy0+X01fc2luZ3VsYXIoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2JhZF9iaXRzZXRfZmxpcCkKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMpKTsKKwkgIF9CYXNlX3JlZjo6ZmxpcCgpOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICAgIH07CisjZW5kaWYKKworICAgICAgLy8gMjMuMy41LjEgY29uc3RydWN0b3JzOgorICAgICAgX0dMSUJDWFhfQ09OU1RFWFBSIGJpdHNldCgpIDogX0Jhc2UoKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBjb25zdGV4cHIgYml0c2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyNlbHNlCisgICAgICBiaXRzZXQodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyNlbmRpZgorICAgICAgOiBfQmFzZShfX3ZhbCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBiaXRzZXQoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+JiBfX3N0ciwKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19wb3MgPSAwLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX24gPSAoc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpucG9zKSkKKwk6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uKSB7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzk2LiB3aGF0IGFyZSBjaGFyYWN0ZXJzIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cywgY2xhc3MgX0FsbG9jPgorCWJpdHNldChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX3BvcywKKwkgICAgICAgdHlwZW5hbWUgc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpzaXplX3R5cGUKKwkgICAgICAgX19uLAorCSAgICAgICBfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uLCBfX3plcm8sIF9fb25lKSB7IH0KKworICAgICAgYml0c2V0KGNvbnN0IF9CYXNlJiBfX3gpIDogX0Jhc2UoX194KSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJpdHNldChjb25zdCBfQ2hhclQqIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpzaXplX3R5cGUgX19uCisJICAgICAgID0gc3RkOjpiYXNpY19zdHJpbmc8X0NoYXJUPjo6bnBvcywKKwkgICAgICAgX0NoYXJUIF9femVybyA9IF9DaGFyVCgnMCcpLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkKKwk6IF9CYXNlKF9fc3RyLCBfX24sIF9femVybywgX19vbmUpIHsgfQorI2VuZGlmCisKKyAgICAgIC8vIDIzLjMuNS4yIGJpdHNldCBvcGVyYXRpb25zOgorICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvciY9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykKKyAgICAgIHsKKwlfTV9iYXNlKCkgJj0gX19yaHM7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yfD0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKQorICAgICAgeworCV9NX2Jhc2UoKSB8PSBfX3JoczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3JePShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpCisgICAgICB7CisJX01fYmFzZSgpIF49IF9fcmhzOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcjw8PShzaXplX3QgX19wb3MpCisgICAgICB7CisJX01fYmFzZSgpIDw8PSBfX3BvczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3I+Pj0oc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9NX2Jhc2UoKSA+Pj0gX19wb3M7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHNldCgpCisgICAgICB7CisJX0Jhc2U6OnNldCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTg2LiBiaXRzZXQ6OnNldCgpIHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGJvb2wKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KHNpemVfdCBfX3BvcywgYm9vbCBfX3ZhbCA9IHRydWUpCisgICAgICB7CisJX0Jhc2U6OnNldChfX3BvcywgX192YWwpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICByZXNldCgpCisgICAgICB7CisJX0Jhc2U6OnJlc2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlfQmFzZTo6cmVzZXQoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4gb3BlcmF0b3J+KCkgY29uc3QgeyByZXR1cm4gYml0c2V0KH5fTV9iYXNlKCkpOyB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgZmxpcCgpCisgICAgICB7CisJX0Jhc2U6OmZsaXAoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgZmxpcChzaXplX3QgX19wb3MpCisgICAgICB7CisJX0Jhc2U6OmZsaXAoX19wb3MpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxMS4gQml0c2V0IG1pbm9yIHByb2JsZW1zCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19zdWJzY3JpcHQoX19wb3MpOworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisJcmV0dXJuIF9NX2Jhc2UoKVtfX3Bvc107CisjZWxzZQorCXJldHVybiByZWZlcmVuY2UoX01fYmFzZSgpW19fcG9zXSwgdGhpcyk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTEuIEJpdHNldCBtaW5vciBwcm9ibGVtcworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3MpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX3Bvcyk7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX3Bvc107CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjp0b191bG9uZzsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdXNpbmcgX0Jhc2U6OnRvX3VsbG9uZzsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9iYXNlKCkudGVtcGxhdGUgdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2Jhc2UoKS50ZW1wbGF0ZQorCSAgICB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KF9femVybywgX19vbmUpOworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM0LiBiaXRzZXQ6OnRvX3N0cmluZygpIGhhcmQgdG8gdXNlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4NTMuIHRvX3N0cmluZyBuZWVkcyB1cGRhdGluZyB3aXRoIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7CisJICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7CisJfQorCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgeworCXJldHVybiB0b19zdHJpbmc8Y2hhcixzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4oKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgICAgdG9fc3RyaW5nKGNoYXIgX196ZXJvLCBjaGFyIF9fb25lID0gJzEnKSBjb25zdAorICAgICAgeworCXJldHVybiB0b19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKKwkgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4oX196ZXJvLCBfX29uZSk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKSA9PSBfX3JoczsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKSAhPSBfX3JoczsgfQorCisgICAgICB1c2luZyBfQmFzZTo6dGVzdDsKKyAgICAgIHVzaW5nIF9CYXNlOjphbGw7CisgICAgICB1c2luZyBfQmFzZTo6YW55OworICAgICAgdXNpbmcgX0Jhc2U6Om5vbmU7CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcjw8KHNpemVfdCBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9NX2Jhc2UoKSA8PCBfX3Bvcyk7IH0KKworICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yPj4oc2l6ZV90IF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX01fYmFzZSgpID4+IF9fcG9zKTsgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yJihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgJj0gX195OyB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yfChjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgfD0gX195OyB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yXihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgXj0gX195OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpCisgICAgeyByZXR1cm4gX19pcyA+PiBfX3guX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpCisgICAgeyByZXR1cm4gX19vcyA8PCBfX3guX01fYmFzZSgpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIGJpdHNldC4KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBzdHJ1Y3QgaGFzaDxfX2RlYnVnOjpiaXRzZXQ8X05iPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fZGVidWc6OmJpdHNldDxfTmI+PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2RlYnVnOjpiaXRzZXQ8X05iPiYgX19iKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpoYXNoPF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPj4oKShfX2IuX01fYmFzZSgpKTsgfQorICAgIH07CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9kZWJ1Zy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYThlMmEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2RlYnVnLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIERlYnVnZ2luZyBzdXBwb3J0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL2RlYnVnLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX01BQ1JPX1NXSVRDSF9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX01BQ1JPX1NXSVRDSF9IIDEKKworLyoqIE1hY3JvcyBhbmQgbmFtZXNwYWNlcyB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvdXRzaWRlIG9mIGRlYnVnCisgKiAgd3JhcHBlcnMgdG8gdmVyaWZ5IGNlcnRhaW4gcHJvcGVydGllcy4gVGhlIF9fZ2xpYmN4eF9yZXF1aXJlc194eHgKKyAqICBtYWNyb3MgYXJlIG1lcmVseSB3cmFwcGVycyBhcm91bmQgdGhlIF9fZ2xpYmN4eF9jaGVja194eHggd3JhcHBlcnMKKyAqICB3aGVuIHdlIGFyZSBjb21waWxpbmcgd2l0aCBkZWJ1ZyBtb2RlLCBidXQgZGlzYXBwZWFyIHdoZW4gd2UgYXJlCisgKiAgaW4gcmVsZWFzZSBtb2RlIHNvIHRoYXQgdGhlcmUgaXMgbm8gY2hlY2tpbmcgcGVyZm9ybWVkIGluLCBlLmcuLAorICogIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGFsZ29yaXRobXMuCisqLworCisvLyBEZWJ1ZyBtb2RlIG5hbWVzcGFjZXMuCisKKy8qKgorICogQG5hbWVzcGFjZSBzdGQ6Ol9fZGVidWcKKyAqIEBicmllZiBHTlUgZGVidWcgY29kZSwgcmVwbGFjZXMgc3RhbmRhcmQgYmVoYXZpb3Igd2l0aCBkZWJ1ZyBiZWhhdmlvci4KKyAqLworbmFtZXNwYWNlIHN0ZAoreyAKKyAgbmFtZXNwYWNlIF9fZGVidWcgeyB9IAorfQorCisvKiogQG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworICogIEBicmllZiBHTlUgZGVidWcgY2xhc3NlcyBmb3IgcHVibGljIHVzZS4KKyovCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6X19kZWJ1ZzsKK30KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVRworCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX0NvbmRpdGlvbikKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfQ29uZGl0aW9uKQorIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfT05MWShfU3RhdGVtZW50KSA7CisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfQ29uZCxfTXNnKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWQoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWRfc2V0KF9GaXJzdDEsX0xhc3QxLF9GaXJzdDIpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc29ydGVkX3NldF9wcmVkKF9GaXJzdDEsX0xhc3QxLF9GaXJzdDIsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfRmlyc3QsX0xhc3QpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19ub25lbXB0eSgpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9TdHJpbmcpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfU3RyaW5nLF9MZW4pCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3Vic2NyaXB0KF9OKQorCisjZWxzZQorCisjIGluY2x1ZGUgPGRlYnVnL21hY3Jvcy5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfQ29uZGl0aW9uKSBfX2dsaWJjeHhfYXNzZXJ0KF9Db25kaXRpb24pCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9Db25kaXRpb24pIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfQ29uZGl0aW9uKQorI2Vsc2UKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfQ29uZGl0aW9uKQorI2VuZGlmCisKKyMgZGVmaW5lIF9HTElCQ1hYX0RFQlVHX09OTFkoX1N0YXRlbWVudCkgX1N0YXRlbWVudAorCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfY29uZChfQ29uZCxfTXNnKSBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0NvbmQsX01zZykKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19zb3J0ZWQoX0ZpcnN0LF9MYXN0KSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX0ZpcnN0LF9MYXN0LF9QcmVkKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MikgXAorICAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3NldChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3NvcnRlZF9zZXRfcHJlZChfRmlyc3QxLF9MYXN0MSxfRmlyc3QyLF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfc2V0X3ByZWQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MixfUHJlZCkKKyMgZGVmaW5lIF9fZ2xpYmN4eF9yZXF1aXJlc19wYXJ0aXRpb25lZF9sb3dlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQlcCisgICAgIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF9sb3dlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3BhcnRpdGlvbmVkX3VwcGVyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCVwKKyAgICAgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKF9GaXJzdCxfTGFzdCxfVmFsdWUpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfbG93ZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF9sb3dlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfcGFydGl0aW9uZWRfdXBwZXJfcHJlZChfRmlyc3QsX0xhc3QsX1ZhbHVlLF9QcmVkKSBcCisgICAgIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF91cHBlcl9wcmVkKF9GaXJzdCxfTGFzdCxfVmFsdWUsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfaGVhcChfRmlyc3QsX0xhc3QpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX2hlYXAoX0ZpcnN0LF9MYXN0KQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX2hlYXBfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpIFwKKyAgICAgX19nbGliY3h4X2NoZWNrX2hlYXBfcHJlZChfRmlyc3QsX0xhc3QsX1ByZWQpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfbm9uZW1wdHkoKSBfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfU3RyaW5nKSBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9TdHJpbmcpCisjIGRlZmluZSBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfU3RyaW5nLF9MZW4pCVwKKyAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX1N0cmluZyxfTGVuKQorIyBkZWZpbmUgX19nbGliY3h4X3JlcXVpcmVzX3N1YnNjcmlwdChfTikgX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfTikKKworIyBpbmNsdWRlIDxkZWJ1Zy9mdW5jdGlvbnMuaD4KKworI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9ERUJVR19NQUNST19TV0lUQ0hfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9kZXF1ZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvZGVxdWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0ZDhjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvZGVxdWUKQEAgLTAsMCArMSw1NjAgQEAKKy8vIERlYnVnZ2luZyBkZXF1ZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9kZXF1ZQorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfREVRVUUKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfREVRVUUgMQorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpkZXF1ZSB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGRlcXVlCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OmRlcXVlPF9UcCwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPGRlcXVlPF9UcCwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgIF9HTElCQ1hYX1NURF9DOjpkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8ZGVxdWU+IF9TYWZlX2Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsZGVxdWU+CisJCQkJCQkgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvcixkZXF1ZT4KKwkJCQkJCSAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjIuMS4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2EpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pIHsgfQorCisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBkZXF1ZShzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGRlcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19hKQorICAgICAgICB7IH0KKworICAgICAgZGVxdWUoY29uc3QgZGVxdWUmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICBkZXF1ZShjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZGVxdWUoZGVxdWUmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSwgX1NhZmVfYmFzZSgpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBkZXF1ZShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorI2VuZGlmCisKKyAgICAgIH5kZXF1ZSgpIHsgfQorCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBkZXF1ZSYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGRlcXVlJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBkZXF1ZSYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9fbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjphc3NpZ24oX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCX0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX190KQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19uLCBfX3QpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hZnRlcl9udGgoZGlmZmVyZW5jZV90eXBlIF9fbikKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfQWZ0ZXJfbnRoX2Zyb208X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9BZnRlcl9udGg7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfQWZ0ZXJfbnRoKF9fbiwgX0Jhc2U6OmJlZ2luKCkpKTsKKyAgICAgIH0KKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIC8vIDIzLjIuMS4yIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6KQorICAgICAgeworCWJvb2wgX19pbnZhbGlkYXRlX2FsbCA9IF9fc3ogPiB0aGlzLT5zaXplKCk7CisJaWYgKF9fc3ogPCB0aGlzLT5zaXplKCkpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX3N6KTsKKworCV9CYXNlOjpyZXNpemUoX19zeik7CisKKwlpZiAoX19pbnZhbGlkYXRlX2FsbCkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgY29uc3QgX1RwJiBfX2MpCisgICAgICB7CisJYm9vbCBfX2ludmFsaWRhdGVfYWxsID0gX19zeiA+IHRoaXMtPnNpemUoKTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCisJX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCisJaWYgKF9faW52YWxpZGF0ZV9hbGwpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgX1RwIF9fYyA9IF9UcCgpKQorICAgICAgeworCWJvb2wgX19pbnZhbGlkYXRlX2FsbCA9IF9fc3ogPiB0aGlzLT5zaXplKCk7CisJaWYgKF9fc3ogPCB0aGlzLT5zaXplKCkpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX3N6KTsKKworCV9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKworCWlmIChfX2ludmFsaWRhdGVfYWxsKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHVzaW5nIF9CYXNlOjpzaHJpbmtfdG9fZml0OworI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICAvLyAyMy4yLjEuMyBtb2RpZmllcnM6CisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9CYXNlOjpwdXNoX2Zyb250KF9feCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9CYXNlOjpwdXNoX2JhY2soX194KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoX1RwJiYgX194KQorICAgICAgeyBlbXBsYWNlX2Zyb250KHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soX1RwJiYgX194KQorICAgICAgeyBlbXBsYWNlX2JhY2soc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGVtcGxhY2VfZnJvbnQoX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0Jhc2U6OmVtcGxhY2VfZnJvbnQoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0Jhc2U6OmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjppbnNlcnQoX19wLCBfX2wpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19uLCBfX3gpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJCSAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCX0KKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfQmFzZTo6YmVnaW4oKSkpOworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKC0tX0Jhc2U6OmVuZCgpKSk7CisJX0Jhc2U6OnBvcF9iYWNrKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcG9zaXRpb24uYmFzZSgpOworCWlmIChfX3ZpY3RpbSA9PSBfQmFzZTo6YmVnaW4oKSB8fCBfX3ZpY3RpbSA9PSBfQmFzZTo6ZW5kKCktMSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3ZpY3RpbSksIHRoaXMpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCSAgfQorICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisJaWYgKF9fZmlyc3QuYmFzZSgpID09IF9fbGFzdC5iYXNlKCkpCisJICByZXR1cm4gX19maXJzdDsKKyAgICAgICAgZWxzZSBpZiAoX19maXJzdC5iYXNlKCkgPT0gX0Jhc2U6OmJlZ2luKCkKKwkJIHx8IF9fbGFzdC5iYXNlKCkgPT0gX0Jhc2U6OmVuZCgpKQorCSAgeworCSAgICB0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKwkgICAgZm9yIChfQmFzZV9pdGVyYXRvciBfX3Bvc2l0aW9uID0gX19maXJzdC5iYXNlKCk7CisJCSBfX3Bvc2l0aW9uICE9IF9fbGFzdC5iYXNlKCk7ICsrX19wb3NpdGlvbikKKwkgICAgICB7CisJCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24pKTsKKwkgICAgICB9CisJICAgIF9fdHJ5CisJICAgICAgeworCQlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwKKwkJCQl0aGlzKTsKKwkgICAgICB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJdGhpcy0+X01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwKKwkJCQkJCV9fbGFzdC5iYXNlKCkpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGRlcXVlJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID09IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDw9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBkZXF1ZTxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsIGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2Zvcm1hdHRlci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9mb3JtYXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVhNTAyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9mb3JtYXR0ZXIuaApAQCAtMCwwICsxLDQxNSBAQAorLy8gRGVidWctbW9kZSBlcnJvciBmb3JtYXR0aW5nIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL2Zvcm1hdHRlci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19GT1JNQVRURVJfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19GT1JNQVRURVJfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8dHlwZWluZm8+CisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB1c2luZyBzdGQ6OnR5cGVfaW5mbzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgYm9vbCBfX2NoZWNrX3Npbmd1bGFyKF9JdGVyYXRvciYpOworCisgIGNsYXNzIF9TYWZlX3NlcXVlbmNlX2Jhc2U7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX3NlcXVlbmNlOworCisgIGVudW0gX0RlYnVnX21zZ19pZAorICB7CisgICAgLy8gR2VuZXJhbCBjaGVja3MKKyAgICBfX21zZ192YWxpZF9yYW5nZSwKKyAgICBfX21zZ19pbnNlcnRfc2luZ3VsYXIsCisgICAgX19tc2dfaW5zZXJ0X2RpZmZlcmVudCwKKyAgICBfX21zZ19lcmFzZV9iYWQsCisgICAgX19tc2dfZXJhc2VfZGlmZmVyZW50LAorICAgIF9fbXNnX3N1YnNjcmlwdF9vb2IsCisgICAgX19tc2dfZW1wdHksCisgICAgX19tc2dfdW5wYXJ0aXRpb25lZCwKKyAgICBfX21zZ191bnBhcnRpdGlvbmVkX3ByZWQsCisgICAgX19tc2dfdW5zb3J0ZWQsCisgICAgX19tc2dfdW5zb3J0ZWRfcHJlZCwKKyAgICBfX21zZ19ub3RfaGVhcCwKKyAgICBfX21zZ19ub3RfaGVhcF9wcmVkLAorICAgIC8vIHN0ZDo6Yml0c2V0IGNoZWNrcworICAgIF9fbXNnX2JhZF9iaXRzZXRfd3JpdGUsCisgICAgX19tc2dfYmFkX2JpdHNldF9yZWFkLAorICAgIF9fbXNnX2JhZF9iaXRzZXRfZmxpcCwKKyAgICAvLyBzdGQ6Omxpc3QgY2hlY2tzCisgICAgX19tc2dfc2VsZl9zcGxpY2UsCisgICAgX19tc2dfc3BsaWNlX2FsbG9jLAorICAgIF9fbXNnX3NwbGljZV9iYWQsCisgICAgX19tc2dfc3BsaWNlX290aGVyLAorICAgIF9fbXNnX3NwbGljZV9vdmVybGFwLAorICAgIC8vIGl0ZXJhdG9yIGNoZWNrcworICAgIF9fbXNnX2luaXRfc2luZ3VsYXIsCisgICAgX19tc2dfaW5pdF9jb3B5X3Npbmd1bGFyLAorICAgIF9fbXNnX2luaXRfY29uc3Rfc2luZ3VsYXIsCisgICAgX19tc2dfY29weV9zaW5ndWxhciwKKyAgICBfX21zZ19iYWRfZGVyZWYsCisgICAgX19tc2dfYmFkX2luYywKKyAgICBfX21zZ19iYWRfZGVjLAorICAgIF9fbXNnX2l0ZXJfc3Vic2NyaXB0X29vYiwKKyAgICBfX21zZ19hZHZhbmNlX29vYiwKKyAgICBfX21zZ19yZXRyZWF0X29vYiwKKyAgICBfX21zZ19pdGVyX2NvbXBhcmVfYmFkLAorICAgIF9fbXNnX2NvbXBhcmVfZGlmZmVyZW50LAorICAgIF9fbXNnX2l0ZXJfb3JkZXJfYmFkLAorICAgIF9fbXNnX29yZGVyX2RpZmZlcmVudCwKKyAgICBfX21zZ19kaXN0YW5jZV9iYWQsCisgICAgX19tc2dfZGlzdGFuY2VfZGlmZmVyZW50LAorICAgIC8vIGlzdHJlYW1faXRlcmF0b3IKKyAgICBfX21zZ19kZXJlZl9pc3RyZWFtLAorICAgIF9fbXNnX2luY19pc3RyZWFtLAorICAgIC8vIG9zdHJlYW1faXRlcmF0b3IKKyAgICBfX21zZ19vdXRwdXRfb3N0cmVhbSwKKyAgICAvLyBpc3RyZWFtYnVmX2l0ZXJhdG9yCisgICAgX19tc2dfZGVyZWZfaXN0cmVhbWJ1ZiwKKyAgICBfX21zZ19pbmNfaXN0cmVhbWJ1ZiwKKyAgICAvLyBmb3J3YXJkX2xpc3QKKyAgICBfX21zZ19pbnNlcnRfYWZ0ZXJfZW5kLAorICAgIF9fbXNnX2VyYXNlX2FmdGVyX2JhZCwKKyAgICBfX21zZ192YWxpZF9yYW5nZTIKKyAgfTsKKworICBjbGFzcyBfRXJyb3JfZm9ybWF0dGVyCisgIHsKKyAgICAvLy8gV2hldGhlciBhbiBpdGVyYXRvciBpcyBjb25zdGFudCwgbXV0YWJsZSwgb3IgdW5rbm93bgorICAgIGVudW0gX0NvbnN0bmVzcworICAgIHsKKyAgICAgIF9fdW5rbm93bl9jb25zdG5lc3MsCisgICAgICBfX2NvbnN0X2l0ZXJhdG9yLAorICAgICAgX19tdXRhYmxlX2l0ZXJhdG9yLAorICAgICAgX19sYXN0X2NvbnN0bmVzcworICAgIH07CisKKyAgICAvLyBUaGUgc3RhdGUgb2YgdGhlIGl0ZXJhdG9yIChmaW5lLWdyYWluZWQpLCBpZiB3ZSBrbm93IGl0LgorICAgIGVudW0gX0l0ZXJhdG9yX3N0YXRlCisgICAgeworICAgICAgX191bmtub3duX3N0YXRlLAorICAgICAgX19zaW5ndWxhciwgICAgICAvLyBzaW5ndWxhciwgbWF5IHN0aWxsIGJlIGF0dGFjaGVkIHRvIGEgc2VxdWVuY2UKKyAgICAgIF9fYmVnaW4sICAgICAgICAgLy8gZGVyZWZlcmVuY2VhYmxlLCBhbmQgYXQgdGhlIGJlZ2lubmluZworICAgICAgX19taWRkbGUsICAgICAgICAvLyBkZXJlZmVyZW5jZWFibGUsIG5vdCBhdCB0aGUgYmVnaW5uaW5nCisgICAgICBfX2VuZCwgICAgICAgICAgIC8vIHBhc3QtdGhlLWVuZCwgbWF5IGJlIGF0IGJlZ2lubmluZyBpZiBzZXF1ZW5jZSBlbXB0eQorICAgICAgX19iZWZvcmVfYmVnaW4sICAvLyBiZWZvcmUgYmVnaW4KKyAgICAgIF9fbGFzdF9zdGF0ZQorICAgIH07CisKKyAgICAvLyBUYWdzIGRlbm90aW5nIHRoZSB0eXBlIG9mIHBhcmFtZXRlciBmb3IgY29uc3RydWN0aW9uCisgICAgc3RydWN0IF9Jc19pdGVyYXRvciB7IH07CisgICAgc3RydWN0IF9Jc19zZXF1ZW5jZSB7IH07CisKKyAgICAvLyBBIHBhcmFtZXRlciB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UKKyAgICBzdHJ1Y3QgX1BhcmFtZXRlcgorICAgIHsKKyAgICAgIGVudW0KKyAgICAgIHsKKwlfX3VudXNlZF9wYXJhbSwKKwlfX2l0ZXJhdG9yLAorCV9fc2VxdWVuY2UsCisJX19pbnRlZ2VyLAorCV9fc3RyaW5nCisgICAgICB9IF9NX2tpbmQ7CisKKyAgICAgIHVuaW9uCisgICAgICB7CisJLy8gV2hlbiBfTV9raW5kID09IF9faXRlcmF0b3IKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiAgICAgIF9NX25hbWU7CisJICBjb25zdCB2b2lkKiAgICAgIF9NX2FkZHJlc3M7CisJICBjb25zdCB0eXBlX2luZm8qIF9NX3R5cGU7CisJICBfQ29uc3RuZXNzICAgICAgIF9NX2NvbnN0bmVzczsKKwkgIF9JdGVyYXRvcl9zdGF0ZSAgX01fc3RhdGU7CisJICBjb25zdCB2b2lkKiAgICAgIF9NX3NlcXVlbmNlOworCSAgY29uc3QgdHlwZV9pbmZvKiBfTV9zZXFfdHlwZTsKKwl9IF9NX2l0ZXJhdG9yOworCisJLy8gV2hlbiBfTV9raW5kID09IF9fc2VxdWVuY2UKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiAgICAgIF9NX25hbWU7CisJICBjb25zdCB2b2lkKiAgICAgIF9NX2FkZHJlc3M7CisJICBjb25zdCB0eXBlX2luZm8qIF9NX3R5cGU7CisJfSBfTV9zZXF1ZW5jZTsKKworCS8vIFdoZW4gX01fa2luZCA9PSBfX2ludGVnZXIKKwlzdHJ1Y3QKKwl7CisJICBjb25zdCBjaGFyKiBfTV9uYW1lOworCSAgbG9uZyAgICAgICAgX01fdmFsdWU7CisJfSBfTV9pbnRlZ2VyOworCisJLy8gV2hlbiBfTV9raW5kID09IF9fc3RyaW5nCisJc3RydWN0CisJeworCSAgY29uc3QgY2hhciogX01fbmFtZTsKKwkgIGNvbnN0IGNoYXIqIF9NX3ZhbHVlOworCX0gX01fc3RyaW5nOworICAgICAgfSBfTV92YXJpYW50OworCisgICAgICBfUGFyYW1ldGVyKCkgOiBfTV9raW5kKF9fdW51c2VkX3BhcmFtKSwgX01fdmFyaWFudCgpIHsgfQorCisgICAgICBfUGFyYW1ldGVyKGxvbmcgX192YWx1ZSwgY29uc3QgY2hhciogX19uYW1lKSAKKyAgICAgIDogX01fa2luZChfX2ludGVnZXIpLCBfTV92YXJpYW50KCkKKyAgICAgIHsKKwlfTV92YXJpYW50Ll9NX2ludGVnZXIuX01fbmFtZSA9IF9fbmFtZTsKKwlfTV92YXJpYW50Ll9NX2ludGVnZXIuX01fdmFsdWUgPSBfX3ZhbHVlOworICAgICAgfQorCisgICAgICBfUGFyYW1ldGVyKGNvbnN0IGNoYXIqIF9fdmFsdWUsIGNvbnN0IGNoYXIqIF9fbmFtZSkgCisgICAgICA6IF9NX2tpbmQoX19zdHJpbmcpLCBfTV92YXJpYW50KCkKKyAgICAgIHsKKwlfTV92YXJpYW50Ll9NX3N0cmluZy5fTV9uYW1lID0gX19uYW1lOworCV9NX3ZhcmlhbnQuX01fc3RyaW5nLl9NX3ZhbHVlID0gX192YWx1ZTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgICAgIF9QYXJhbWV0ZXIoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2l0LAorCQkgICBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19pdGVyYXRvcikKKwk6IF9NX2tpbmQoX19pdGVyYXRvciksICBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9CisJICAgIHN0ZDo6X19hcmVfc2FtZTxfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4sCisJICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yPjo6CisJICAgICAgX192YWx1ZSA/IF9fbXV0YWJsZV9pdGVyYXRvciA6IF9fY29uc3RfaXRlcmF0b3I7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gX19pdC5fTV9nZXRfc2VxdWVuY2UoKTsKKyNpZmRlZiBfX0dYWF9SVFRJCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gJnR5cGVpZChfU2VxdWVuY2UpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworI2VuZGlmCisKKwkgIGlmIChfX2l0Ll9NX3Npbmd1bGFyKCkpCisJICAgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX3Npbmd1bGFyOworCSAgZWxzZQorCSAgICB7CisJICAgICAgaWYgKF9faXQuX01faXNfYmVmb3JlX2JlZ2luKCkpCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2JlZm9yZV9iZWdpbjsKKwkgICAgICBlbHNlIGlmIChfX2l0Ll9NX2lzX2VuZCgpKQorCQlfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19lbmQ7CisJICAgICAgZWxzZSBpZiAoX19pdC5fTV9pc19iZWdpbigpKQorCQlfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3N0YXRlID0gX19iZWdpbjsKKwkgICAgICBlbHNlCisJCV9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX21pZGRsZTsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1R5cGU+CisgICAgICAgIF9QYXJhbWV0ZXIoY29uc3QgX1R5cGUqJiBfX2l0LCBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19pdGVyYXRvcikKKyAgICAgICAgOiBfTV9raW5kKF9faXRlcmF0b3IpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9hZGRyZXNzID0gJl9faXQ7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gJnR5cGVpZChfX2l0KTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3R5cGUgPSAwOworI2VuZGlmCisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX2NvbnN0bmVzcyA9IF9fbXV0YWJsZV9pdGVyYXRvcjsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc3RhdGUgPSBfX2l0PyBfX3Vua25vd25fc3RhdGUgOiBfX3Npbmd1bGFyOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXF1ZW5jZSA9IDA7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gMDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UeXBlPgorICAgICAgICBfUGFyYW1ldGVyKF9UeXBlKiYgX19pdCwgY29uc3QgY2hhciogX19uYW1lLCBfSXNfaXRlcmF0b3IpCisgICAgICAgIDogX01fa2luZChfX2l0ZXJhdG9yKSwgX01fdmFyaWFudCgpCisgICAgICAgIHsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fYWRkcmVzcyA9ICZfX2l0OworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9ICZ0eXBlaWQoX19pdCk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gMDsKKyNlbmRpZgorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9jb25zdG5lc3MgPSBfX2NvbnN0X2l0ZXJhdG9yOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9IF9faXQ/IF9fdW5rbm93bl9zdGF0ZSA6IF9fc2luZ3VsYXI7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcXVlbmNlID0gMDsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fc2VxX3R5cGUgPSAwOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgICAgICBfUGFyYW1ldGVyKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgY29uc3QgY2hhciogX19uYW1lLCBfSXNfaXRlcmF0b3IpCisgICAgICAgIDogX01fa2luZChfX2l0ZXJhdG9yKSwgX01fdmFyaWFudCgpCisgICAgICAgIHsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fYWRkcmVzcyA9ICZfX2l0OworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01faXRlcmF0b3IuX01fdHlwZSA9ICZ0eXBlaWQoX19pdCk7CisjZWxzZQorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV90eXBlID0gMDsKKyNlbmRpZgorCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9jb25zdG5lc3MgPSBfX3Vua25vd25fY29uc3RuZXNzOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zdGF0ZSA9CisJICAgIF9fZ251X2RlYnVnOjpfX2NoZWNrX3Npbmd1bGFyKF9faXQpPyBfX3Npbmd1bGFyIDogX191bmtub3duX3N0YXRlOworCSAgX01fdmFyaWFudC5fTV9pdGVyYXRvci5fTV9zZXF1ZW5jZSA9IDA7CisJICBfTV92YXJpYW50Ll9NX2l0ZXJhdG9yLl9NX3NlcV90eXBlID0gMDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgICAgX1BhcmFtZXRlcihjb25zdCBfU2FmZV9zZXF1ZW5jZTxfU2VxdWVuY2U+JiBfX3NlcSwKKwkJICAgY29uc3QgY2hhciogX19uYW1lLCBfSXNfc2VxdWVuY2UpCisgICAgICAgIDogX01fa2luZChfX3NlcXVlbmNlKSwgX01fdmFyaWFudCgpCisgICAgICAgIHsKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fbmFtZSA9IF9fbmFtZTsKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fYWRkcmVzcyA9CisJICAgIHN0YXRpY19jYXN0PGNvbnN0IF9TZXF1ZW5jZSo+KCZfX3NlcSk7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV90eXBlID0gJnR5cGVpZChfU2VxdWVuY2UpOworI2Vsc2UKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fdHlwZSA9IDA7CisjZW5kaWYKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICAgICAgX1BhcmFtZXRlcihjb25zdCBfU2VxdWVuY2UmIF9fc2VxLCBjb25zdCBjaGFyKiBfX25hbWUsIF9Jc19zZXF1ZW5jZSkKKyAgICAgICAgOiBfTV9raW5kKF9fc2VxdWVuY2UpLCBfTV92YXJpYW50KCkKKyAgICAgICAgeworCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV9uYW1lID0gX19uYW1lOworCSAgX01fdmFyaWFudC5fTV9zZXF1ZW5jZS5fTV9hZGRyZXNzID0gJl9fc2VxOworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIF9NX3ZhcmlhbnQuX01fc2VxdWVuY2UuX01fdHlwZSA9ICZ0eXBlaWQoX1NlcXVlbmNlKTsKKyNlbHNlCisJICBfTV92YXJpYW50Ll9NX3NlcXVlbmNlLl9NX3R5cGUgPSAwOworI2VuZGlmCisJfQorCisgICAgICB2b2lkCisgICAgICBfTV9wcmludF9maWVsZChjb25zdCBfRXJyb3JfZm9ybWF0dGVyKiBfX2Zvcm1hdHRlciwKKwkJICAgICBjb25zdCBjaGFyKiBfX25hbWUpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBfTV9wcmludF9kZXNjcmlwdGlvbihjb25zdCBfRXJyb3JfZm9ybWF0dGVyKiBfX2Zvcm1hdHRlcikgY29uc3Q7CisgICAgfTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX1BhcmFtZXRlcjsKKworICBwdWJsaWM6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICAgIF9NX2l0ZXJhdG9yKGNvbnN0IF9JdGVyYXRvciYgX19pdCwgY29uc3QgY2hhciogX19uYW1lID0gMCkgIGNvbnN0CisgICAgICB7CisJaWYgKF9NX251bV9wYXJhbWV0ZXJzIDwgc3RkOjpzaXplX3QoX19tYXhfcGFyYW1ldGVycykpCisJICBfTV9wYXJhbWV0ZXJzW19NX251bV9wYXJhbWV0ZXJzKytdID0gX1BhcmFtZXRlcihfX2l0LCBfX25hbWUsCisJCQkJCQkJICBfSXNfaXRlcmF0b3IoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9pbnRlZ2VyKGxvbmcgX192YWx1ZSwgY29uc3QgY2hhciogX19uYW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fbnVtX3BhcmFtZXRlcnMgPCBzdGQ6OnNpemVfdChfX21heF9wYXJhbWV0ZXJzKSkKKwlfTV9wYXJhbWV0ZXJzW19NX251bV9wYXJhbWV0ZXJzKytdID0gX1BhcmFtZXRlcihfX3ZhbHVlLCBfX25hbWUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0IF9FcnJvcl9mb3JtYXR0ZXImCisgICAgX01fc3RyaW5nKGNvbnN0IGNoYXIqIF9fdmFsdWUsIGNvbnN0IGNoYXIqIF9fbmFtZSA9IDApIGNvbnN0CisgICAgeworICAgICAgaWYgKF9NX251bV9wYXJhbWV0ZXJzIDwgc3RkOjpzaXplX3QoX19tYXhfcGFyYW1ldGVycykpCisJX01fcGFyYW1ldGVyc1tfTV9udW1fcGFyYW1ldGVycysrXSA9IF9QYXJhbWV0ZXIoX192YWx1ZSwgX19uYW1lKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgICBjb25zdCBfRXJyb3JfZm9ybWF0dGVyJgorICAgICAgX01fc2VxdWVuY2UoY29uc3QgX1NlcXVlbmNlJiBfX3NlcSwgY29uc3QgY2hhciogX19uYW1lID0gMCkgY29uc3QKKyAgICAgIHsKKwlpZiAoX01fbnVtX3BhcmFtZXRlcnMgPCBzdGQ6OnNpemVfdChfX21heF9wYXJhbWV0ZXJzKSkKKwkgIF9NX3BhcmFtZXRlcnNbX01fbnVtX3BhcmFtZXRlcnMrK10gPSBfUGFyYW1ldGVyKF9fc2VxLCBfX25hbWUsCisJCQkJCQkJICBfSXNfc2VxdWVuY2UoKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9tZXNzYWdlKGNvbnN0IGNoYXIqIF9fdGV4dCkgY29uc3QKKyAgICB7IF9NX3RleHQgPSBfX3RleHQ7IHJldHVybiAqdGhpczsgfQorCisgICAgY29uc3QgX0Vycm9yX2Zvcm1hdHRlciYKKyAgICBfTV9tZXNzYWdlKF9EZWJ1Z19tc2dfaWQgX19pZCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICBfR0xJQkNYWF9OT1JFVFVSTiB2b2lkCisgICAgX01fZXJyb3IoKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIF9FcnJvcl9mb3JtYXR0ZXIoY29uc3QgY2hhciogX19maWxlLCBzdGQ6OnNpemVfdCBfX2xpbmUpCisgICAgOiBfTV9maWxlKF9fZmlsZSksIF9NX2xpbmUoX19saW5lKSwgX01fbnVtX3BhcmFtZXRlcnMoMCksIF9NX3RleHQoMCksCisgICAgICBfTV9tYXhfbGVuZ3RoKDc4KSwgX01fY29sdW1uKDEpLCBfTV9maXJzdF9saW5lKHRydWUpLCBfTV93b3Jkd3JhcChmYWxzZSkKKyAgICB7IF9NX2dldF9tYXhfbGVuZ3RoKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Zvcm1hdF93b3JkKGNoYXIqLCBpbnQsIGNvbnN0IGNoYXIqLCBfVHApIGNvbnN0IHRocm93ICgpOworCisgICAgdm9pZAorICAgIF9NX3ByaW50X3dvcmQoY29uc3QgY2hhciogX193b3JkKSBjb25zdDsKKworICAgIHZvaWQKKyAgICBfTV9wcmludF9zdHJpbmcoY29uc3QgY2hhciogX19zdHJpbmcpIGNvbnN0OworCisgICAgdm9pZAorICAgIF9NX2dldF9tYXhfbGVuZ3RoKCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICBlbnVtIHsgX19tYXhfcGFyYW1ldGVycyA9IDkgfTsKKworICAgIGNvbnN0IGNoYXIqICAgICAgICAgX01fZmlsZTsKKyAgICBzdGQ6OnNpemVfdCAgICAgICAgIF9NX2xpbmU7CisgICAgbXV0YWJsZSBfUGFyYW1ldGVyICBfTV9wYXJhbWV0ZXJzW19fbWF4X3BhcmFtZXRlcnNdOworICAgIG11dGFibGUgc3RkOjpzaXplX3QgX01fbnVtX3BhcmFtZXRlcnM7CisgICAgbXV0YWJsZSBjb25zdCBjaGFyKiBfTV90ZXh0OworICAgIG11dGFibGUgc3RkOjpzaXplX3QgX01fbWF4X2xlbmd0aDsKKyAgICBlbnVtIHsgX01faW5kZW50ID0gNCB9IDsKKyAgICBtdXRhYmxlIHN0ZDo6c2l6ZV90IF9NX2NvbHVtbjsKKyAgICBtdXRhYmxlIGJvb2wgICAgICAgIF9NX2ZpcnN0X2xpbmU7CisgICAgbXV0YWJsZSBib29sICAgICAgICBfTV93b3Jkd3JhcDsKKworICBwdWJsaWM6CisgICAgc3RhdGljIF9FcnJvcl9mb3JtYXR0ZXIKKyAgICBfTV9hdChjb25zdCBjaGFyKiBfX2ZpbGUsIHN0ZDo6c2l6ZV90IF9fbGluZSkKKyAgICB7IHJldHVybiBfRXJyb3JfZm9ybWF0dGVyKF9fZmlsZSwgX19saW5lKTsgfQorICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2ZvcndhcmRfbGlzdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvZm9yd2FyZF9saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYmQ3NWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2ZvcndhcmRfbGlzdApAQCAtMCwwICsxLDc0MSBAQAorLy8gPGZvcndhcmRfbGlzdD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9mb3J3YXJkX2xpc3QKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX0ZPUldBUkRfTElTVAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19GT1JXQVJEX0xJU1QgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpmb3J3YXJkX2xpc3Qgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGZvcndhcmRfbGlzdAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8Zm9yd2FyZF9saXN0PiBfU2FmZV9iYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciAgICAgICBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwKKwkJCQkJICBmb3J3YXJkX2xpc3Q+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgZm9yd2FyZF9saXN0PiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gMjMuMi4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9fYWwpIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2UoX19saXN0LCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdC5fTV9iYXNlKCkpLCBfX2FsKQorICAgICAgeworCXRoaXMtPl9NX3N3YXAoX19saXN0KTsKKyAgICAgIH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fYWwpCisgICAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICA6IF9CYXNlKF9fbGlzdCkKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSkpCisgICAgICB7CisJdGhpcy0+X01fc3dhcChfX2xpc3QpOworICAgICAgfQorCisgICAgICBmb3J3YXJkX2xpc3Qoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19pbCwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICB+Zm9yd2FyZF9saXN0KCkKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2xpc3Q7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShmb3J3YXJkX2xpc3QmJiBfX2xpc3QpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwljbGVhcigpOworCXN3YXAoX19saXN0KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19pbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6OmFzc2lnbihfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdmFsKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICAgIHsKKwlfQmFzZTo6YXNzaWduKF9faWwpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWZvcmVfYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZm9yZV9iZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWZvcmVfYmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6Y2JlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpjYmVmb3JlX2JlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpjZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICAvLyBtb2Rp76yBZXJzOgorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wbGFjZV9mcm9udDsKKyAgICAgIHVzaW5nIF9CYXNlOjpwdXNoX2Zyb250OworCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW3RoaXNdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICB7IHJldHVybiBfX2l0ID09IHRoaXMtPl9NX2Jhc2UoKS5jYmVnaW4oKTsgfSk7CisJX0Jhc2U6OnBvcF9mcm9udCgpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlpdGVyYXRvcgorCWVtcGxhY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlX2FmdGVyKF9fcG9zLmJhc2UoKSwKKwkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkJCSAgdGhpcyk7CisgICAgICAgCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydF9hZnRlcihfX3Bvcy5iYXNlKCksIF9fdmFsKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIF9UcCYmIF9fdmFsKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0X2FmdGVyKF9fcG9zLmJhc2UoKSwgc3RkOjptb3ZlKF9fdmFsKSksCisJCSAgICAgICAJdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnRfYWZ0ZXIoX19wb3MuYmFzZSgpLCBfX24sIF9fdmFsKSwKKwkJICAgICAgIAl0aGlzKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3BvcywKKyAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydF9yYW5nZV9hZnRlcihfX3BvcywgX19maXJzdCwgX19sYXN0KTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0X2FmdGVyKF9fcG9zLmJhc2UoKSwKKwkJCQkJICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCQkJICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKSwKKwkJCSAgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihjb25zdF9pdGVyYXRvciBfX3Bvcywgc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X2FmdGVyKF9fcG9zKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydF9hZnRlcihfX3Bvcy5iYXNlKCksIF9faWwpLCB0aGlzKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBfQmFzZV9pdGVyYXRvcgorICAgICAgX01fZXJhc2VfYWZ0ZXIoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19wb3MpCisgICAgICB7CisJX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19uZXh0ID0gc3RkOjpuZXh0KF9fcG9zKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFtfX25leHRdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICB7IHJldHVybiBfX2l0ID09IF9fbmV4dDsgfSk7CisJcmV0dXJuIF9CYXNlOjplcmFzZV9hZnRlcihfX3Bvcyk7CisgICAgICB9CisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9hZnRlcihfX3Bvcyk7CisJcmV0dXJuIGl0ZXJhdG9yKF9NX2VyYXNlX2FmdGVyKF9fcG9zLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2VfYWZ0ZXIoX19wb3MsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3ZpY3RpbSA9IHN0ZDo6bmV4dChfX3Bvcy5iYXNlKCkpOworCSAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UyKQorCQkJCSAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCisJCQkJICAuX01faXRlcmF0b3IoX19wb3MsICJwb3MiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2VfYWZ0ZXIoX19wb3MuYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX19saXN0KTsKKwl0aGlzLT5fTV9zd2FwKF9fbGlzdCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwl0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworCS8vIGlmIF9fc3ogPCBzaXplKCksIGludmFsaWRhdGUgYWxsIGl0ZXJhdG9ycyBpbiBbYmVnaW4rX19zeiwgZW5kKCkKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fZW5kID0gX0Jhc2U6OmVuZCgpOworCWZvciAoc2l6ZV90eXBlIF9faSA9IF9fc3o7IF9fdmljdGltICE9IF9fZW5kICYmIF9faSA+IDA7IC0tX19pKQorCSAgKytfX3ZpY3RpbTsKKworCWZvciAoOyBfX3ZpY3RpbSAhPSBfX2VuZDsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihbX192aWN0aW1dKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeyByZXR1cm4gX19pdCA9PSBfX3ZpY3RpbTsgfSk7CisJICB9CisKKwlfX3RyeQorCSAgeworCSAgICBfQmFzZTo6cmVzaXplKF9fc3opOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICB0aGlzLT5fTV9yZXZhbGlkYXRlX3Npbmd1bGFyKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCB2YWx1ZV90eXBlJiBfX3ZhbCkKKyAgICAgIHsKKwl0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworCS8vIGlmIF9fc3ogPCBzaXplKCksIGludmFsaWRhdGUgYWxsIGl0ZXJhdG9ycyBpbiBbYmVnaW4rX19zeiwgZW5kKCkpCisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX2VuZCA9IF9CYXNlOjplbmQoKTsKKwlmb3IgKHNpemVfdHlwZSBfX2kgPSBfX3N6OyBfX3ZpY3RpbSAhPSBfX2VuZCAmJiBfX2kgPiAwOyAtLV9faSkKKwkgICsrX192aWN0aW07CisKKwlmb3IgKDsgX192aWN0aW0gIT0gX19lbmQ7ICsrX192aWN0aW0pCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoW19fdmljdGltXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgICAgIHsgcmV0dXJuIF9faXQgPT0gX192aWN0aW07IH0pOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX3ZhbCk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4zLjUgZm9yd2FyZF9saXN0IG9wZXJhdGlvbnM6CisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIHsKKyAgICAgICAgX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX2xpc3QgIT0gdGhpcywKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NlbGZfc3BsaWNlKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpKTsKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwgWyZfX2xpc3RdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICB7CisJICAgIHJldHVybiBfX2l0ICE9IF9fbGlzdC5fTV9iYXNlKCkuY2JlZm9yZV9iZWdpbigpCisJCSAgICYmIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5lbmQoKTsKKwkgIH0pOworCV9CYXNlOjpzcGxpY2VfYWZ0ZXIoX19wb3MuYmFzZSgpLCBzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCwKKwkJICAgY29uc3RfaXRlcmF0b3IgX19pKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX19wb3MpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2kuX01fYmVmb3JlX2RlcmVmZXJlbmNlYWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX2JhZCkKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2ksICJfX2kiKSk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9faS5fTV9hdHRhY2hlZF90bygmX19saXN0KSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9vdGhlcikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2ksICJfX2kiKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKF9fbGlzdCwgIl9fbGlzdCIpKTsKKworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAyNTAuIHNwbGljaW5nIGludmFsaWRhdGVzIGl0ZXJhdG9ycworCV9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fbmV4dCA9IHN0ZDo6bmV4dChfX2kuYmFzZSgpKTsKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwgW19fbmV4dF0oX0Jhc2VfY29uc3RfaXRlcmF0b3IgX19pdCkKKwkgIHsgcmV0dXJuIF9faXQgPT0gX19uZXh0OyB9KTsKKwlfQmFzZTo6c3BsaWNlX2FmdGVyKF9fcG9zLmJhc2UoKSwgc3RkOjptb3ZlKF9fbGlzdC5fTV9iYXNlKCkpLAorCQkJICAgIF9faS5iYXNlKCkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoY29uc3RfaXRlcmF0b3IgX19wb3MsIGZvcndhcmRfbGlzdCYmIF9fbGlzdCwKKwkJICAgY29uc3RfaXRlcmF0b3IgX19iZWZvcmUsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKyAgICAgICAgX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfX3Bvcyk7CisJX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fYmVmb3JlLCBfX2xhc3QpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2JlZm9yZS5fTV9hdHRhY2hlZF90bygmX19saXN0KSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9vdGhlcikKKwkJCSAgICAgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJsaXN0IikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2JlZm9yZSwgImJlZm9yZSIpKTsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19iZWZvcmUuX01fZGVyZWZlcmVuY2VhYmxlKCkKKwkJCSAgICAgIHx8IF9fYmVmb3JlLl9NX2lzX2JlZm9yZV9iZWdpbigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UyKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKF9fbGlzdCwgImxpc3QiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9fYmVmb3JlLCAiYmVmb3JlIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2JlZm9yZSAhPSBfX2xhc3QsCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX19saXN0LCAibGlzdCIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19iZWZvcmUsICJiZWZvcmUiKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gc3RkOjpuZXh0KF9fYmVmb3JlLmJhc2UoKSk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX19saXN0Ll9NX2Jhc2UoKS5lbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlMikKKwkJCQkgIC5fTV9zZXF1ZW5jZShfX2xpc3QsICJsaXN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2JlZm9yZSwgImJlZm9yZSIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX2xpc3QgIT0gdGhpcyB8fCBfX3RtcCAhPSBfX3Bvcy5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfc3BsaWNlX292ZXJsYXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLl9NX2l0ZXJhdG9yKF9fdG1wLCAicG9zaXRpb24iKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fYmVmb3JlLCAiYmVmb3JlIikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgIC8vIDI1MC4gc3BsaWNpbmcgaW52YWxpZGF0ZXMgaXRlcmF0b3JzCisJICAgIHRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX19saXN0LCBbX190bXBdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeyByZXR1cm4gX19pdCA9PSBfX3RtcDsgfSk7CisJICB9CisKKwlfQmFzZTo6c3BsaWNlX2FmdGVyKF9fcG9zLmJhc2UoKSwgc3RkOjptb3ZlKF9fbGlzdC5fTV9iYXNlKCkpLAorCQkJICAgIF9fYmVmb3JlLmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZShjb25zdCBfVHAmIF9fdmFsKQorICAgICAgeworCV9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWZvcmVfYmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX29sZCA9IF9feCsrOworCXdoaWxlIChfX3ggIT0gX0Jhc2U6OmVuZCgpKQorCSAgeworCSAgICBpZiAoKl9feCA9PSBfX3ZhbCkKKwkgICAgICBfX3ggPSBfTV9lcmFzZV9hZnRlcihfX29sZCk7CisJICAgIGVsc2UKKwkgICAgICBfX29sZCA9IF9feCsrOworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZD4KKyAgICAgICAgdm9pZAorICAgICAgICByZW1vdmVfaWYoX1ByZWQgX19wcmVkKQorCXsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWZvcmVfYmVnaW4oKTsKKwkgIF9CYXNlX2l0ZXJhdG9yIF9fb2xkID0gX194Kys7CisJICB3aGlsZSAoX194ICE9IF9CYXNlOjplbmQoKSkKKwkgICAgeworCSAgICAgIGlmIChfX3ByZWQoKl9feCkpCisJCV9feCA9IF9NX2VyYXNlX2FmdGVyKF9fb2xkKTsKKwkgICAgICBlbHNlCisJCV9fb2xkID0gX194Kys7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHVuaXF1ZSgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fbGFzdCA9IF9CYXNlOjplbmQoKTsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm47CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gc3RkOjpuZXh0KF9fZmlyc3QpOworCXdoaWxlIChfX25leHQgIT0gX19sYXN0KQorCSAgeworCSAgICBpZiAoKl9fZmlyc3QgPT0gKl9fbmV4dCkKKwkgICAgICBfX25leHQgPSBfTV9lcmFzZV9hZnRlcihfX2ZpcnN0KTsKKwkgICAgZWxzZQorCSAgICAgIF9fZmlyc3QgPSBfX25leHQrKzsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpblByZWQ+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5QcmVkIF9fYmluYXJ5X3ByZWQpCisJeworCSAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19sYXN0ID0gX0Jhc2U6OmVuZCgpOworCSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICByZXR1cm47CisJICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBzdGQ6Om5leHQoX19maXJzdCk7CisJICB3aGlsZSAoX19uZXh0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIGlmIChfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0LCAqX19uZXh0KSkKKwkJX19uZXh0ID0gX01fZXJhc2VfYWZ0ZXIoX19maXJzdCk7CisJICAgICAgZWxzZQorCQlfX2ZpcnN0ID0gX19uZXh0Kys7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIHsKKwlpZiAodGhpcyAhPSAmX19saXN0KQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0Jhc2U6OmJlZ2luKCksIF9CYXNlOjplbmQoKSk7CisJICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9fbGlzdC5fTV9iYXNlKCkuYmVnaW4oKSwKKwkJCQkgX19saXN0Ll9NX2Jhc2UoKS5lbmQoKSk7CisJICB0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9fbGlzdCwgWyZfX2xpc3RdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgIHsKKwkgICAgICByZXR1cm4gX19pdCAhPSBfX2xpc3QuX01fYmFzZSgpLmNiZWZvcmVfYmVnaW4oKQorCQkgICAgICYmIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jZW5kKCk7CisJICAgIH0pOworCSAgX0Jhc2U6Om1lcmdlKHN0ZDo6bW92ZShfX2xpc3QuX01fYmFzZSgpKSk7CisJfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29tcD4KKyAgICAgICAgdm9pZAorICAgICAgICBtZXJnZShmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIF9Db21wIF9fY29tcCkKKwl7CisJICBpZiAodGhpcyAhPSAmX19saXN0KQorCSAgeworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX0Jhc2U6OmJlZ2luKCksIF9CYXNlOjplbmQoKSwgX19jb21wKTsKKwkgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9fbGlzdC5fTV9iYXNlKCkuYmVnaW4oKSwKKwkJCQkJX19saXN0Ll9NX2Jhc2UoKS5lbmQoKSwgX19jb21wKTsKKwkgICAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX2xpc3QsCisJCQkJICAgICAgWyZfX2xpc3RdKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9faXQpCisJICAgICAgeworCSAgICAgICAgcmV0dXJuIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCkKKwkJICAgICAgICYmIF9faXQgIT0gX19saXN0Ll9NX2Jhc2UoKS5jZW5kKCk7CisJICAgICAgfSk7CisJICAgIF9CYXNlOjptZXJnZShzdGQ6Om1vdmUoX19saXN0Ll9NX2Jhc2UoKSksIF9fY29tcCk7CisJICB9CisJfQorCisgICAgICB1c2luZyBfQmFzZTo6c29ydDsKKyAgICAgIHVzaW5nIF9CYXNlOjpyZXZlcnNlOworCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKFt0aGlzXShfQmFzZV9jb25zdF9pdGVyYXRvciBfX2l0KQorCSAgeworCSAgICByZXR1cm4gX19pdCAhPSB0aGlzLT5fTV9iYXNlKCkuY2JlZm9yZV9iZWdpbigpCisJCSAgICYmIF9faXQgIT0gdGhpcy0+X01fYmFzZSgpLmNlbmQoKTsKKwkgIH0pOworICAgICAgfQorICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3JfYmFzZSBfU2FmZV9pdGVyYXRvcl9iYXNlOworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX3N3YXBfYXV4KGZvcndhcmRfbGlzdCYgX19saHMsCisJCSAgX1NhZmVfaXRlcmF0b3JfYmFzZSomIF9fbGhzX2l0ZXJhdG9ycywKKwkJICBmb3J3YXJkX2xpc3QmIF9fcmhzLAorCQkgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqJiBfX3Joc19pdGVyYXRvcnMpOworICAgICAgdm9pZCBfTV9zd2FwKGZvcndhcmRfbGlzdCYgX19saXN0KTsKKyAgICB9OworCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fc3dhcF9hdXgoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19saHMsCisJCV9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcl9iYXNlKiYgX19saHNfaXRlcmF0b3JzLAorCQlmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX3JocywKKwkJX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yX2Jhc2UqJiBfX3Joc19pdGVyYXRvcnMpCisgICAgeworICAgICAgdXNpbmcgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yX2Jhc2U7CisgICAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2JiZWdpbl9pdHMgPSAwOworICAgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX19sYXN0X2JiZWdpbiA9IDA7CisgICAgICBmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlciA9IF9fbGhzX2l0ZXJhdG9yczsgX19pdGVyOykKKwl7CisJICAvLyBFdmVuIGl0ZXJhdG9yIGFyZSBjYXN0ZWQgdG8gY29uc3RfaXRlcmF0b3IsIG5vdCBhIHByb2JsZW0uCisJICBjb25zdF9pdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxjb25zdF9pdGVyYXRvcio+KF9faXRlcik7CisJICBfX2l0ZXIgPSBfX2l0ZXItPl9NX25leHQ7CisJICBpZiAoX192aWN0aW0tPmJhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCkuY2JlZm9yZV9iZWdpbigpKQorCSAgICB7CisJICAgICAgX192aWN0aW0tPl9NX3VubGluaygpOworCSAgICAgIGlmIChfX2xoc19pdGVyYXRvcnMgPT0gX192aWN0aW0pCisJCV9fbGhzX2l0ZXJhdG9ycyA9IF9fdmljdGltLT5fTV9uZXh0OworCSAgICAgIGlmIChfX2JiZWdpbl9pdHMpCisJCXsKKwkJICBfX3ZpY3RpbS0+X01fbmV4dCA9IF9fYmJlZ2luX2l0czsKKwkJICBfX2JiZWdpbl9pdHMtPl9NX3ByaW9yID0gX192aWN0aW07CisJCX0KKwkgICAgICBlbHNlCisJCV9fbGFzdF9iYmVnaW4gPSBfX3ZpY3RpbTsKKwkgICAgICBfX2JiZWdpbl9pdHMgPSBfX3ZpY3RpbTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBfX3ZpY3RpbS0+X01fc2VxdWVuY2UgPSAmX19saHM7CisJfQorCisgICAgICBpZiAoX19iYmVnaW5faXRzKQorCXsKKwkgIGlmIChfX3Joc19pdGVyYXRvcnMpCisJICAgIHsKKwkgICAgICBfX3Joc19pdGVyYXRvcnMtPl9NX3ByaW9yID0gX19sYXN0X2JiZWdpbjsKKwkgICAgICBfX2xhc3RfYmJlZ2luLT5fTV9uZXh0ID0gX19yaHNfaXRlcmF0b3JzOworCSAgICB9CisJICBfX3Joc19pdGVyYXRvcnMgPSBfX2JiZWdpbl9pdHM7CisJfQorICAgIH0KKworICAvKiBTcGVjaWFsIGZvcndhcmRfbGlzdCBfTV9zd2FwIHZlcnNpb24gdGhhdCBkbyBub3Qgc3dhcCB0aGUKKyAgICogYmVmb3JlLWJlZ2luIG93bmVyc2hpcC4qLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPjo6CisgICAgX01fc3dhcChmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2xpc3QpCisgICAgeworICAgICAgX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7CisgICAgICBzdGQ6OnN3YXAodGhpcy0+X01faXRlcmF0b3JzLCBfX2xpc3QuX01faXRlcmF0b3JzKTsKKyAgICAgIHN0ZDo6c3dhcCh0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnMsIF9fbGlzdC5fTV9jb25zdF9pdGVyYXRvcnMpOworICAgICAgLy8gVXNlbGVzcywgYWx3YXlzIDEgb24gZm9yd2FyZF9saXN0CisgICAgICAvL3N0ZDo6c3dhcCh0aGlzLT5fTV92ZXJzaW9uLCBfX2xpc3QuX01fdmVyc2lvbik7CisgICAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3RoaXNfaXRzID0gdGhpcy0+X01faXRlcmF0b3JzOworICAgICAgX01fc3dhcF9hdXgoX19saXN0LCBfX2xpc3QuX01faXRlcmF0b3JzLCAqdGhpcywgdGhpcy0+X01faXRlcmF0b3JzKTsKKyAgICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fdGhpc19jb25zdF9pdHMgPSB0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnM7CisgICAgICBfTV9zd2FwX2F1eChfX2xpc3QsIF9fbGlzdC5fTV9jb25zdF9pdGVyYXRvcnMsICp0aGlzLCB0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnMpOworICAgICAgX01fc3dhcF9hdXgoKnRoaXMsIF9fdGhpc19pdHMsIF9fbGlzdCwgX19saXN0Ll9NX2l0ZXJhdG9ycyk7CisgICAgICBfTV9zd2FwX2F1eCgqdGhpcywgX190aGlzX2NvbnN0X2l0cywgX19saXN0LCBfX2xpc3QuX01fY29uc3RfaXRlcmF0b3JzKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gX19seC5fTV9iYXNlKCkgPT0gX19seS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIF9fbHguX01fYmFzZSgpIDwgX19seS5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4ID09IF9fbHkpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIChfX2x5IDwgX19seCk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHggPCBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIFNlZSBzdGQ6OmZvcndhcmRfbGlzdDo6c3dhcCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKwkgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IF9fbHguc3dhcChfX2x5KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfQmVmb3JlQmVnaW5IZWxwZXI8c3RkOjpfX2RlYnVnOjpmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6X19kZWJ1Zzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiBfU2VxdWVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgX0l0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Oml0ZXJhdG9yX3R5cGUgX0Jhc2VJdDsKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9NX0lzKF9CYXNlSXQgX19pdCwgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkKKyAgICAgIHsgcmV0dXJuIF9faXQgPT0gX19zZXEtPl9NX2Jhc2UoKS5jYmVmb3JlX2JlZ2luKCk7IH0KKyAgICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvZnVuY3Rpb25zLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWQ5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMzgzIEBACisvLyBEZWJ1Z2dpbmcgc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9mdW5jdGlvbnMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfRlVOQ1RJT05TX0gKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfRlVOQ1RJT05TX0ggMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+IC8vIGZvciBpdGVyYXRvcl90cmFpdHMsIGNhdGVnb3JpZXMKKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPiAgICAgICAgIC8vIGZvciBfX2lzX2ludGVnZXIKKyNpbmNsdWRlIDxkZWJ1Zy9mb3JtYXR0ZXIuaD4KKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX2l0ZXJhdG9yOworCisgIC8vIEFuIGFyYml0cmFyeSBpdGVyYXRvciBwb2ludGVyIGlzIG5vdCBzaW5ndWxhci4KKyAgaW5saW5lIGJvb2wKKyAgX19jaGVja19zaW5ndWxhcl9hdXgoY29uc3Qgdm9pZCopIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gV2UgbWF5IGhhdmUgYW4gaXRlcmF0b3IgdGhhdCBkZXJpdmVzIGZyb20gX1NhZmVfaXRlcmF0b3JfYmFzZSBidXQgaXNuJ3QKKyAgLy8gYSBfU2FmZV9pdGVyYXRvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zaW5ndWxhcihfSXRlcmF0b3ImIF9feCkKKyAgICB7IHJldHVybiBfX2NoZWNrX3Npbmd1bGFyX2F1eCgmX194KTsgfQorCisgIC8qKiBOb24tTlVMTCBwb2ludGVycyBhcmUgbm9uc2luZ3VsYXIuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc2luZ3VsYXIoY29uc3QgX1RwKiBfX3B0cikKKyAgICB7IHJldHVybiBfX3B0ciA9PSAwOyB9CisKKyAgLyoqIFNhZmUgaXRlcmF0b3JzIGtub3cgaWYgdGhleSBhcmUgc2luZ3VsYXIuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zaW5ndWxhcihjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9feCkKKyAgICB7IHJldHVybiBfX3guX01fc2luZ3VsYXIoKTsgfQorCisgIC8qKiBBc3N1bWUgdGhhdCBzb21lIGFyYml0cmFyeSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUsIGJlY2F1c2Ugd2UKKyAgICAgIGNhbid0IHByb3ZlIHRoYXQgaXQgaXNuJ3QuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfZGVyZWZlcmVuY2VhYmxlKF9JdGVyYXRvciYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8qKiBOb24tTlVMTCBwb2ludGVycyBhcmUgZGVyZWZlcmVuY2VhYmxlLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX2RlcmVmZXJlbmNlYWJsZShjb25zdCBfVHAqIF9fcHRyKQorICAgIHsgcmV0dXJuIF9fcHRyOyB9CisKKyAgLyoqIFNhZmUgaXRlcmF0b3JzIGtub3cgaWYgdGhleSBhcmUgc2luZ3VsYXIuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19kZXJlZmVyZW5jZWFibGUoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3gpCisgICAgeyByZXR1cm4gX194Ll9NX2RlcmVmZXJlbmNlYWJsZSgpOyB9CisKKyAgLyoqIElmIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBpcworICAgKiAgbm9ubmVnYXRpdmUsIGFzc3VtZSB0aGUgcmFuZ2UgaXMgdmFsaWQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fdmFsaWRfcmFuZ2VfYXV4Mihjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fZmlyc3QsCisJCSAgICAgICBjb25zdCBfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9fbGFzdCwKKwkJICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gX19sYXN0IC0gX19maXJzdCA+PSAwOyB9CisKKyAgLyoqIENhbid0IHRlc3QgZm9yIGEgdmFsaWQgcmFuZ2Ugd2l0aCBpbnB1dCBpdGVyYXRvcnMsIGJlY2F1c2UKKyAgICogIGl0ZXJhdGlvbiBtYXkgYmUgZGVzdHJ1Y3RpdmUuIFNvIHdlIGp1c3QgYXNzdW1lIHRoYXQgdGhlIHJhbmdlCisgICAqICBpcyB2YWxpZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3ZhbGlkX3JhbmdlX2F1eDIoY29uc3QgX0lucHV0SXRlcmF0b3ImLCBjb25zdCBfSW5wdXRJdGVyYXRvciYsCisJCSAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLyoqIFdlIHNheSB0aGF0IGludGVncmFsIHR5cGVzIGZvciBhIHZhbGlkIHJhbmdlLCBhbmQgZGVmZXIgdG8gb3RoZXIKKyAgICogIHJvdXRpbmVzIHRvIHJlYWxpemUgd2hhdCB0byBkbyB3aXRoIGludGVncmFsIHR5cGVzIGluc3RlYWQgb2YKKyAgICogIGl0ZXJhdG9ycy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVncmFsPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZV9hdXgoY29uc3QgX0ludGVncmFsJiwgY29uc3QgX0ludGVncmFsJiwgc3RkOjpfX3RydWVfdHlwZSkKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgLyoqIFdlIGhhdmUgaXRlcmF0b3JzLCBzbyBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBpdGVyYXRvcnMgdGhhdCBhcmUKKyAgICogIHRvIHNlZSBpZiB3ZSBjYW4gY2hlY2sgdGhlIHJhbmdlIGFoZWFkIG9mIHRpbWUuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZV9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fZmlyc3QsCisJCSAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsIHN0ZDo6X19mYWxzZV90eXBlKQorICB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5CisgICAgICBfQ2F0ZWdvcnk7CisgICAgcmV0dXJuIF9fdmFsaWRfcmFuZ2VfYXV4MihfX2ZpcnN0LCBfX2xhc3QsIF9DYXRlZ29yeSgpKTsKKyAgfQorCisgIC8qKiBEb24ndCBrbm93IHdoYXQgdGhlc2UgaXRlcmF0b3JzIGFyZSwgb3IgaWYgdGhleSBhcmUgZXZlbgorICAgKiAgaXRlcmF0b3JzICh3ZSBtYXkgZ2V0IGFuIGludGVncmFsIHR5cGUgZm9yIElucHV0SXRlcmF0b3IpLCBzbworICAgKiAgc2VlIGlmIHRoZXkgYXJlIGludGVncmFsIGFuZCBwYXNzIHRoZW0gb24gdG8gdGhlIG5leHQgcGhhc2UKKyAgICogIG90aGVyd2lzZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3ZhbGlkX3JhbmdlKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworICAgICAgcmV0dXJuIF9fdmFsaWRfcmFuZ2VfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworICAgIH0KKworICAvKiogU2FmZSBpdGVyYXRvcnMga25vdyBob3cgdG8gY2hlY2sgaWYgdGhleSBmb3JtIGEgdmFsaWQgcmFuZ2UuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgX192YWxpZF9yYW5nZShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fZmlyc3QsCisJCSAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xhc3QpCisgICAgeyByZXR1cm4gX19maXJzdC5fTV92YWxpZF9yYW5nZShfX2xhc3QpOyB9CisKKyAgLyogQ2hlY2tzIHRoYXQgW2ZpcnN0LCBsYXN0KSBpcyBhIHZhbGlkIHJhbmdlLCBhbmQgdGhlbiByZXR1cm5zCisgICAqIF9fZmlyc3QuIFRoaXMgcm91dGluZSBpcyB1c2VmdWwgd2hlbiB3ZSBjYW4ndCB1c2UgYSBzZXBhcmF0ZQorICAgKiBhc3NlcnRpb24gc3RhdGVtZW50IGJlY2F1c2UsIGUuZy4sIHdlIGFyZSBpbiBhIGNvbnN0cnVjdG9yLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgX0lucHV0SXRlcmF0b3IKKyAgICBfX2NoZWNrX3ZhbGlkX3JhbmdlKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LAorCQkJY29uc3QgX0lucHV0SXRlcmF0b3ImIF9fbGFzdAorCQkJX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgcmV0dXJuIF9fZmlyc3Q7CisgICAgfQorCisgIC8qKiBDaGVja3MgdGhhdCBfX3MgaXMgbm9uLU5VTEwgb3IgX19uID09IDAsIGFuZCB0aGVuIHJldHVybnMgX19zLiAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9JbnRlZ2VyPgorICAgIGlubGluZSBjb25zdCBfQ2hhclQqCisgICAgX19jaGVja19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsCisJCSAgIGNvbnN0IF9JbnRlZ2VyJiBfX24gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworICAgICAgX19nbGliY3h4X2Fzc2VydChfX3MgIT0gMCB8fCBfX24gPT0gMCk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIC8qKiBDaGVja3MgdGhhdCBfX3MgaXMgbm9uLU5VTEwgYW5kIHRoZW4gcmV0dXJucyBfX3MuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgY29uc3QgX0NoYXJUKgorICAgIF9fY2hlY2tfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworICAgICAgX19nbGliY3h4X2Fzc2VydChfX3MgIT0gMCk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfX3M7CisgICAgfQorCisgIC8vIENhbid0IGNoZWNrIGlmIGFuIGlucHV0IGl0ZXJhdG9yIHNlcXVlbmNlIGlzIHNvcnRlZCwgYmVjYXVzZSB3ZQorICAvLyBjYW4ndCBzdGVwIHRocm91Z2ggdGhlIHNlcXVlbmNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX2F1eChjb25zdCBfSW5wdXRJdGVyYXRvciYsIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIENhbiB2ZXJpZnkgaWYgYSBmb3J3YXJkIGl0ZXJhdG9yIHNlcXVlbmNlIGlzIGluIGZhY3Qgc29ydGVkIHVzaW5nCisgIC8vIHN0ZDo6X19pc19zb3J0ZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsKKyAgICAgIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKKyAgICAgIGZvciAoKytfX25leHQ7IF9fbmV4dCAhPSBfX2xhc3Q7IF9fZmlyc3QgPSBfX25leHQsICsrX19uZXh0KQorICAgICAgICBpZiAoKl9fbmV4dCA8ICpfX2ZpcnN0KQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8vIENhbid0IGNoZWNrIGlmIGFuIGlucHV0IGl0ZXJhdG9yIHNlcXVlbmNlIGlzIHNvcnRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzdGVwCisgIC8vIHRocm91Z2ggdGhlIHNlcXVlbmNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX2F1eChjb25zdCBfSW5wdXRJdGVyYXRvciYsIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiwKKyAgICAgICAgICAgICAgICAgICAgICAgX1ByZWRpY2F0ZSwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIENhbiB2ZXJpZnkgaWYgYSBmb3J3YXJkIGl0ZXJhdG9yIHNlcXVlbmNlIGlzIGluIGZhY3Qgc29ydGVkIHVzaW5nCisgIC8vIHN0ZDo6X19pc19zb3J0ZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICBfUHJlZGljYXRlIF9fcHJlZCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKyAgICAgICAgaWYgKF9fcHJlZCgqX19uZXh0LCAqX19maXJzdCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgLy8gRGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgc29ydGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfQ2F0ZWdvcnk7CisKKyAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSA8IG9wZXJhdG9yIGZvciBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2UgaXMgYQorICAgICAgLy8gU3RyaWN0V2Vha09yZGVyaW5nIGJ5IGNoZWNraW5nIHRoYXQgaXQgaXMgaXJyZWZsZXhpdmUuCisgICAgICBfX2dsaWJjeHhfYXNzZXJ0KF9fZmlyc3QgPT0gX19sYXN0IHx8ICEoKl9fZmlyc3QgPCAqX19maXJzdCkpOworCisgICAgICByZXR1cm4gX19jaGVja19zb3J0ZWRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX0NhdGVnb3J5KCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkKGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2ZpcnN0LCBjb25zdCBfSW5wdXRJdGVyYXRvciYgX19sYXN0LAorICAgICAgICAgICAgICAgICAgIF9QcmVkaWNhdGUgX19wcmVkKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeQorICAgICAgICBfQ2F0ZWdvcnk7CisKKyAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBwcmVkaWNhdGUgaXMgU3RyaWN0V2Vha09yZGVyaW5nIGJ5IGNoZWNraW5nIHRoYXQgaXQKKyAgICAgIC8vIGlzIGlycmVmbGV4aXZlLgorICAgICAgX19nbGliY3h4X2Fzc2VydChfX2ZpcnN0ID09IF9fbGFzdCB8fCAhX19wcmVkKCpfX2ZpcnN0LCAqX19maXJzdCkpOworCisgICAgICByZXR1cm4gX19jaGVja19zb3J0ZWRfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19wcmVkLCBfQ2F0ZWdvcnkoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfc2V0X2F1eChjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwKKwkJCSAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsCisJCQkgICBzdGQ6Ol9fdHJ1ZV90eXBlKQorICAgIHsgcmV0dXJuIF9fY2hlY2tfc29ydGVkKF9fZmlyc3QsIF9fbGFzdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX3NldF9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImLAorCQkJICAgY29uc3QgX0lucHV0SXRlcmF0b3ImLAorCQkJICAgc3RkOjpfX2ZhbHNlX3R5cGUpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19zb3J0ZWRfc2V0X2F1eChjb25zdCBfSW5wdXRJdGVyYXRvciYgX19maXJzdCwKKwkJCSAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yJiBfX2xhc3QsCisJCQkgICBfUHJlZGljYXRlIF9fcHJlZCwgc3RkOjpfX3RydWVfdHlwZSkKKyAgICB7IHJldHVybiBfX2NoZWNrX3NvcnRlZChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX3NldF9hdXgoY29uc3QgX0lucHV0SXRlcmF0b3ImLAorCQkJICAgY29uc3QgX0lucHV0SXRlcmF0b3ImLCBfUHJlZGljYXRlLAorCQkJICAgc3RkOjpfX2ZhbHNlX3R5cGUpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIC4uLiBzcGVjaWFsIHZhcmlhbnQgdXNlZCBpbiBzdGQ6Om1lcmdlLCBzdGQ6OmluY2x1ZGVzLCBzdGQ6OnNldF8qLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjEsIHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMj4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfc29ydGVkX3NldChjb25zdCBfSW5wdXRJdGVyYXRvcjEmIF9fZmlyc3QsCisJCSAgICAgICBjb25zdCBfSW5wdXRJdGVyYXRvcjEmIF9fbGFzdCwKKwkJICAgICAgIGNvbnN0IF9JbnB1dEl0ZXJhdG9yMiYpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlCisJX1ZhbHVlVHlwZTE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9fYXJlX3NhbWU8X1ZhbHVlVHlwZTEsIF9WYWx1ZVR5cGUyPjo6X190eXBlCisJX1NhbWVUeXBlOworICAgICAgcmV0dXJuIF9fY2hlY2tfc29ydGVkX3NldF9hdXgoX19maXJzdCwgX19sYXN0LCBfU2FtZVR5cGUoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yMSwgdHlwZW5hbWUgX0lucHV0SXRlcmF0b3IyLAorCSAgIHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3NvcnRlZF9zZXQoY29uc3QgX0lucHV0SXRlcmF0b3IxJiBfX2ZpcnN0LAorCQkgICAgICAgY29uc3QgX0lucHV0SXRlcmF0b3IxJiBfX2xhc3QsCisJCSAgICAgICBjb25zdCBfSW5wdXRJdGVyYXRvcjImLCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMT46OnZhbHVlX3R5cGUKKwlfVmFsdWVUeXBlMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3IyPjo6dmFsdWVfdHlwZQorCV9WYWx1ZVR5cGUyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6X19hcmVfc2FtZTxfVmFsdWVUeXBlMSwgX1ZhbHVlVHlwZTI+OjpfX3R5cGUKKwlfU2FtZVR5cGU7CisgICAgICByZXR1cm4gX19jaGVja19zb3J0ZWRfc2V0X2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9fcHJlZCwgX1NhbWVUeXBlKCkpOworICAgfQorCisgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgLy8gMjcwLiBCaW5hcnkgc2VhcmNoIHJlcXVpcmVtZW50cyBvdmVybHkgc3RyaWN0CisgIC8vIERldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIHBhcnRpdGlvbmVkIHcuci50LiB0aGlzIGVsZW1lbnQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfcGFydGl0aW9uZWRfbG93ZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgKl9fZmlyc3QgPCBfX3ZhbHVlKQorCSsrX19maXJzdDsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhKCpfX2ZpcnN0IDwgX192YWx1ZSkpCisJKytfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fZmlyc3QgPT0gX19sYXN0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJCSAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFsdWUpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0ICYmICEoX192YWx1ZSA8ICpfX2ZpcnN0KSkKKwkrK19fZmlyc3Q7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgX192YWx1ZSA8ICpfX2ZpcnN0KQorCSsrX19maXJzdDsKKyAgICAgIHJldHVybiBfX2ZpcnN0ID09IF9fbGFzdDsKKyAgICB9CisKKyAgLy8gRGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgcGFydGl0aW9uZWQgdy5yLnQuIHRoaXMgZWxlbWVudC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUHJlZD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fY2hlY2tfcGFydGl0aW9uZWRfbG93ZXIoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkJICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkJCSAgICAgIF9QcmVkIF9fcHJlZCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgYm9vbChfX3ByZWQoKl9fZmlyc3QsIF9fdmFsdWUpKSkKKwkrK19fZmlyc3Q7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgIWJvb2woX19wcmVkKCpfX2ZpcnN0LCBfX3ZhbHVlKSkpCisJKytfX2ZpcnN0OworICAgICAgcmV0dXJuIF9fZmlyc3QgPT0gX19sYXN0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9QcmVkPgorICAgIGlubGluZSBib29sCisgICAgX19jaGVja19wYXJ0aXRpb25lZF91cHBlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCisJCQkgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCQkJICAgICAgX1ByZWQgX19wcmVkKQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCAmJiAhYm9vbChfX3ByZWQoX192YWx1ZSwgKl9fZmlyc3QpKSkKKwkrK19fZmlyc3Q7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QgJiYgYm9vbChfX3ByZWQoX192YWx1ZSwgKl9fZmlyc3QpKSkKKwkrK19fZmlyc3Q7CisgICAgICByZXR1cm4gX19maXJzdCA9PSBfX2xhc3Q7CisgICAgfQorfSAvLyBuYW1lc3BhY2UgX19nbnVfZGVidWcKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMmM1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbGlzdApAQCAtMCwwICsxLDc0NCBAQAorLy8gRGVidWdnaW5nIGxpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTElTVAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19MSVNUIDEKKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjpsaXN0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgbGlzdAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpsaXN0PF9UcCwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPGxpc3Q8X1RwLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bGlzdDxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8bGlzdD4gIF9TYWZlX2Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBsaXN0PgorCQkJCQkJICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIGxpc3Q+CisJCQkJCQkgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4yLjIuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGxpc3QoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2EpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgICA6IF9CYXNlKF9fbikgeyB9CisKKyAgICAgIGxpc3Qoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSA9IF9UcCgpLAorCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgIF9fbGFzdCkpLAorICAgICAgICAgICAgICBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fYSkKKyAgICAgIHsgfQorCisKKyAgICAgIGxpc3QoY29uc3QgbGlzdCYgX194KQorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIGxpc3QoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSwgX1NhZmVfYmFzZSgpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGxpc3QobGlzdCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpLCBfU2FmZV9iYXNlKCkKKyAgICAgIHsgdGhpcy0+X01fc3dhcChfX3gpOyB9CisKKyAgICAgIGxpc3QoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICA6IF9CYXNlKF9fbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorI2VuZGlmCisKKyAgICAgIH5saXN0KCkgeyB9CisKKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbGlzdCYgX194KQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGxpc3QmCisgICAgICBvcGVyYXRvcj0obGlzdCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCWNsZWFyKCk7CisJc3dhcChfX3gpOworICAgICAgCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9fbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6OmFzc2lnbihfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMi4yLjIgY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3opCisgICAgICB7CisJdGhpcy0+X01fZGV0YWNoX3Npbmd1bGFyKCk7CisKKwkvLyBpZiBfX3N6IDwgc2l6ZSgpLCBpbnZhbGlkYXRlIGFsbCBpdGVyYXRvcnMgaW4gW2JlZ2luK19fc3osIGVuZCgpKQorCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJZm9yIChzaXplX3R5cGUgX19pID0gX19zejsgX192aWN0aW0gIT0gX19lbmQgJiYgX19pID4gMDsgLS1fX2kpCisJICArK19fdmljdGltOworCisJZm9yICg7IF9fdmljdGltICE9IF9fZW5kOyArK19fdmljdGltKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgdGhpcy0+X01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKwl0aGlzLT5fTV9kZXRhY2hfc2luZ3VsYXIoKTsKKworCS8vIGlmIF9fc3ogPCBzaXplKCksIGludmFsaWRhdGUgYWxsIGl0ZXJhdG9ycyBpbiBbYmVnaW4rX19zeiwgZW5kKCkpCisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX2VuZCA9IF9CYXNlOjplbmQoKTsKKwlmb3IgKHNpemVfdHlwZSBfX2kgPSBfX3N6OyBfX3ZpY3RpbSAhPSBfX2VuZCAmJiBfX2kgPiAwOyAtLV9faSkKKwkgICsrX192aWN0aW07CisKKwlmb3IgKDsgX192aWN0aW0gIT0gX19lbmQ7ICsrX192aWN0aW0pCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisKKwlfX3RyeQorCSAgeworCSAgICBfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3JldmFsaWRhdGVfc2luZ3VsYXIoKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBfVHAgX19jID0gX1RwKCkpCisgICAgICB7CisJdGhpcy0+X01fZGV0YWNoX3Npbmd1bGFyKCk7CisKKwkvLyBpZiBfX3N6IDwgc2l6ZSgpLCBpbnZhbGlkYXRlIGFsbCBpdGVyYXRvcnMgaW4gW2JlZ2luK19fc3osIGVuZCgpKQorCV9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19lbmQgPSBfQmFzZTo6ZW5kKCk7CisJZm9yIChzaXplX3R5cGUgX19pID0gX19zejsgX192aWN0aW0gIT0gX19lbmQgJiYgX19pID4gMDsgLS1fX2kpCisJICArK19fdmljdGltOworCisJZm9yICg7IF9fdmljdGltICE9IF9fZW5kOyArK19fdmljdGltKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCisJX190cnkKKwkgIHsKKwkgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICB0aGlzLT5fTV9yZXZhbGlkYXRlX3Npbmd1bGFyKCk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMi4zIG1vZGlmaWVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjpwdXNoX2Zyb250OworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHVzaW5nIF9CYXNlOjplbXBsYWNlX2Zyb250OworI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX0Jhc2U6OmJlZ2luKCkpKTsKKwlfQmFzZTo6cG9wX2Zyb250KCk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpwdXNoX2JhY2s7CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdXNpbmcgX0Jhc2U6OmVtcGxhY2VfYmFjazsKKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoLS1fQmFzZTo6ZW5kKCkpKTsKKwlfQmFzZTo6cG9wX2JhY2soKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpLCB0aGlzKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9UcCYmIF9feCkKKyAgICAgIHsgcmV0dXJuIGVtcGxhY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcCwgX19sKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQkJCSAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9CYXNlX2l0ZXJhdG9yCisgICAgICBfTV9lcmFzZShfQmFzZV9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24pKTsKKwlyZXR1cm4gX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOworICAgICAgfQorICAgIHB1YmxpYzoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX01fZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19wb3NpdGlvbiwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19wb3NpdGlvbi5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJICAgICAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fcG9zaXRpb24sICJwb3NpdGlvbiIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobGlzdCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgLy8gMjMuMi4yLjQgbGlzdCBvcGVyYXRpb25zOgorICAgICAgdm9pZAorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorI2VuZGlmCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX3ggIT0gdGhpcywKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NlbGZfc3BsaWNlKQorCQkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpKTsKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9feCwgX05vdF9lcXVhbChfX3guX01fYmFzZSgpLmVuZCgpKSk7CisJX0Jhc2U6OnNwbGljZShfX3Bvc2l0aW9uLmJhc2UoKSwgX0dMSUJDWFhfTU9WRShfX3guX01fYmFzZSgpKSk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCkKKyAgICAgIHsgc3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9faSkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisjZW5kaWYKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCisJLy8gV2UgdXNlZCB0byBwZXJmb3JtIHRoZSBzcGxpY2VfYWxsb2MgY2hlY2s6ICBub3QgYW55bW9yZSwgcmVkdW5kYW50CisJLy8gYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSByZWxldmFudCBiaXRzIG9mIE4xNTk5LgorCisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9faS5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9iYWQpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19pLCAiX19pIikpOworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2kuX01fYXR0YWNoZWRfdG8oJl9feCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2Vfb3RoZXIpCisJCQkgICAgIC5fTV9pdGVyYXRvcihfX2ksICJfX2kiKS5fTV9zZXF1ZW5jZShfX3gsICJfX3giKSk7CisKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMjUwLiBzcGxpY2luZyBpbnZhbGlkYXRlcyBpdGVyYXRvcnMKKwl0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9feCwgX0VxdWFsKF9faS5iYXNlKCkpKTsKKwlfQmFzZTo6c3BsaWNlKF9fcG9zaXRpb24uYmFzZSgpLCBfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLAorCQkgICAgICBfX2kuYmFzZSgpKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194LCBpdGVyYXRvciBfX2kpCisgICAgICB7IHNwbGljZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSwgX19pKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmJiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBpdGVyYXRvciBfX2xhc3QpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwKKwkgICAgIGl0ZXJhdG9yIF9fbGFzdCkKKyNlbmRpZgorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZmlyc3QuX01fYXR0YWNoZWRfdG8oJl9feCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zcGxpY2Vfb3RoZXIpCisJCQkgICAgICAuX01fc2VxdWVuY2UoX194LCAieCIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikpOworCisJLy8gV2UgdXNlZCB0byBwZXJmb3JtIHRoZSBzcGxpY2VfYWxsb2MgY2hlY2s6ICBub3QgYW55bW9yZSwgcmVkdW5kYW50CisJLy8gYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSByZWxldmFudCBiaXRzIG9mIE4xNTk5LgorCisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3RtcCA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX190bXAgIT0gX19sYXN0LmJhc2UoKTsgKytfX3RtcCkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdG1wICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCZfX3ggIT0gdGhpcyB8fCBfX3RtcCAhPSBfX3Bvc2l0aW9uLAorCQkJCV9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3NwbGljZV9vdmVybGFwKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fdG1wLCAicG9zaXRpb24iKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAvLyAyNTAuIHNwbGljaW5nIGludmFsaWRhdGVzIGl0ZXJhdG9ycworCSAgICB0aGlzLT5fTV90cmFuc2Zlcl9mcm9tX2lmKF9feCwgX0VxdWFsKF9fdG1wKSk7CisJICB9CisKKwlfQmFzZTo6c3BsaWNlKF9fcG9zaXRpb24uYmFzZSgpLCBfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLAorCQkgICAgICBfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBzcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgICAgeworCWZvciAoX0Jhc2VfaXRlcmF0b3IgX194ID0gX0Jhc2U6OmJlZ2luKCk7IF9feCAhPSBfQmFzZTo6ZW5kKCk7ICkKKwkgIHsKKwkgICAgaWYgKCpfX3ggPT0gX192YWx1ZSkKKwkgICAgICBfX3ggPSBfTV9lcmFzZShfX3gpOworCSAgICBlbHNlCisJICAgICAgKytfX3g7CisJICB9CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQorICAgICAgICB7CisJICBmb3IgKF9CYXNlX2l0ZXJhdG9yIF9feCA9IF9CYXNlOjpiZWdpbigpOyBfX3ggIT0gX0Jhc2U6OmVuZCgpOyApCisJICAgIHsKKwkgICAgICBpZiAoX19wcmVkKCpfX3gpKQorCQlfX3ggPSBfTV9lcmFzZShfX3gpOworCSAgICAgIGVsc2UKKwkJKytfX3g7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHVuaXF1ZSgpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCV9CYXNlX2l0ZXJhdG9yIF9fbGFzdCA9IF9CYXNlOjplbmQoKTsKKwlpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICByZXR1cm47CisJX0Jhc2VfaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsgKytfX25leHQ7CisJd2hpbGUgKF9fbmV4dCAhPSBfX2xhc3QpCisJICB7CisJICAgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KQorCSAgICAgIF9fbmV4dCA9IF9NX2VyYXNlKF9fbmV4dCk7CisJICAgIGVsc2UKKwkgICAgICBfX2ZpcnN0ID0gX19uZXh0Kys7CisJICB9CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKKyAgICAgICAgeworCSAgX0Jhc2VfaXRlcmF0b3IgX19maXJzdCA9IF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2VfaXRlcmF0b3IgX19sYXN0ID0gX0Jhc2U6OmVuZCgpOworCSAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCSAgICByZXR1cm47CisJICBfQmFzZV9pdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OyArK19fbmV4dDsKKwkgIHdoaWxlIChfX25leHQgIT0gX19sYXN0KQorCSAgICB7CisJICAgICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpfX25leHQpKQorCQlfX25leHQgPSBfTV9lcmFzZShfX25leHQpOworCSAgICAgIGVsc2UKKwkJX19maXJzdCA9IF9fbmV4dCsrOworCSAgICB9CisJfQorCisgICAgICB2b2lkCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG1lcmdlKGxpc3QmJiBfX3gpCisjZWxzZQorICAgICAgbWVyZ2UobGlzdCYgX194KQorI2VuZGlmCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDMwMC4gbGlzdDo6bWVyZ2UoKSBzcGVjaWZpY2F0aW9uIGluY29tcGxldGUKKwlpZiAodGhpcyAhPSAmX194KQorCSAgeworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9CYXNlOjpiZWdpbigpLCBfQmFzZTo6ZW5kKCkpOworCSAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkKF9feC5iZWdpbigpLmJhc2UoKSwgX194LmVuZCgpLmJhc2UoKSk7CisJICAgIHRoaXMtPl9NX3RyYW5zZmVyX2Zyb21faWYoX194LCBfTm90X2VxdWFsKF9feC5fTV9iYXNlKCkuZW5kKCkpKTsKKwkgICAgX0Jhc2U6Om1lcmdlKF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSkpOworCSAgfQorICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmIF9feCkKKyAgICAgIHsgbWVyZ2Uoc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NvbXBhcmU+CisgICAgICAgIHZvaWQKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgICBtZXJnZShsaXN0JiYgX194LCBfQ29tcGFyZSBfX2NvbXApCisjZWxzZQorICAgICAgICBtZXJnZShsaXN0JiBfX3gsIF9Db21wYXJlIF9fY29tcCkKKyNlbmRpZgorICAgICAgICB7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisJICBpZiAodGhpcyAhPSAmX194KQorCSAgICB7CisJICAgICAgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9CYXNlOjpiZWdpbigpLCBfQmFzZTo6ZW5kKCksCisJCQkJCSAgX19jb21wKTsKKwkgICAgICBfX2dsaWJjeHhfY2hlY2tfc29ydGVkX3ByZWQoX194LmJlZ2luKCkuYmFzZSgpLCBfX3guZW5kKCkuYmFzZSgpLAorCQkJCQkgIF9fY29tcCk7CisJICAgICAgdGhpcy0+X01fdHJhbnNmZXJfZnJvbV9pZihfX3gsIF9Ob3RfZXF1YWwoX194Ll9NX2Jhc2UoKS5lbmQoKSkpOworCSAgICAgIF9CYXNlOjptZXJnZShfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLCBfX2NvbXApOworCSAgICB9CisJfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wYXJlPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGxpc3QmIF9feCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgICB7IG1lcmdlKHN0ZDo6bW92ZShfX3gpLCBfX2NvbXApOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc29ydCgpIHsgX0Jhc2U6OnNvcnQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX3ByZWQpIHsgX0Jhc2U6OnNvcnQoX19wcmVkKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6cmV2ZXJzZTsKKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tYWNyb3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwYmVjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbWFjcm9zLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8vIERlYnVnZ2luZyBzdXBwb3J0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL21hY3Jvcy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19NQUNST1NfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19NQUNST1NfSCAxCisKKy8qKgorICogTWFjcm9zIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvIHZlcmlmeSBjZXJ0YWluCisgKiBwcm9wZXJ0aWVzLiBUaGVzZSBtYWNyb3MgbWF5IG9ubHkgYmUgdXNlZCBkaXJlY3RseSBieSB0aGUgZGVidWcKKyAqIHdyYXBwZXJzLiBOb3RlIHRoYXQgdGhlc2UgYXJlIG1hY3JvcyAoaW5zdGVhZCBvZiB0aGUgbW9yZSBvYnZpb3VzbHkKKyAqIEBhIGNvcnJlY3QgY2hvaWNlIG9mIG1ha2luZyB0aGVtIGZ1bmN0aW9ucykgYmVjYXVzZSB3ZSBuZWVkIGxpbmUgYW5kCisgKiBmaWxlIGluZm9ybWF0aW9uIGF0IHRoZSBjYWxsIHNpdGUsIHRvIG1pbmltaXplIHRoZSBkaXN0YW5jZSBiZXR3ZWVuCisgKiB0aGUgdXNlciBlcnJvciBhbmQgd2hlcmUgdGhlIGVycm9yIGlzIHJlcG9ydGVkLgorICoKKyAqLworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0NvbmRpdGlvbixfRXJyb3JNZXNzYWdlKQkJICAgICAgICBcCisgIGRvIAkJCQkJCQkJCVwKKyAgewkJCQkJCQkJCVwKKyAgICBpZiAoISAoX0NvbmRpdGlvbikpCQkJCQkJCVwKKyAgICAgIF9fZ251X2RlYnVnOjpfRXJyb3JfZm9ybWF0dGVyOjpfTV9hdChfX0ZJTEVfXywgX19MSU5FX18pCSAgICAgICAgXAorCSAgLl9FcnJvck1lc3NhZ2UuX01fZXJyb3IoKTsJCQkJCVwKKyAgfSB3aGlsZSAoZmFsc2UpCisKKy8vIFZlcmlmeSB0aGF0IFtfRmlyc3QsIF9MYXN0KSBmb3JtcyBhIHZhbGlkIGl0ZXJhdG9yIHJhbmdlLgorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X192YWxpZF9yYW5nZShfRmlyc3QsIF9MYXN0KSwJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGluc2VydCBpbnRvICp0aGlzIHdpdGggdGhlIGl0ZXJhdG9yIF9Qb3NpdGlvbi4KKyAqICBJbnNlcnRpb24gaW50byBhIGNvbnRhaW5lciBhdCBhIHNwZWNpZmljIHBvc2l0aW9uIHJlcXVpcmVzIHRoYXQKKyAqICB0aGUgaXRlcmF0b3IgYmUgbm9uc2luZ3VsYXIsIGVpdGhlciBkZXJlZmVyZW5jZWFibGUgb3IgcGFzdC10aGUtZW5kLAorICogIGFuZCB0aGF0IGl0IHJlZmVyZW5jZSB0aGUgc2VxdWVuY2Ugd2UgYXJlIGluc2VydGluZyBpbnRvLiBOb3RlIHRoYXQKKyAqICB0aGlzIG1hY3JvIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgY29udGFpbmVyIGlzIGFfU2FmZV9zZXF1ZW5jZSBhbmQKKyAqICB0aGUgaXRlcmF0b3IgaXMgYSBfU2FmZV9pdGVyYXRvci4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX1Bvc2l0aW9uKQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9Qb3NpdGlvbi5fTV9zaW5ndWxhcigpLAkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2luc2VydF9zaW5ndWxhcikgXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKTsJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfUG9zaXRpb24uX01fYXR0YWNoZWRfdG8odGhpcyksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbnNlcnRfZGlmZmVyZW50KSBcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gaW5zZXJ0IGludG8gKnRoaXMgYWZ0ZXIgdGhlIGl0ZXJhdG9yIF9Qb3NpdGlvbi4KKyAqICBJbnNlcnRpb24gaW50byBhIGNvbnRhaW5lciBhZnRlciBhIHNwZWNpZmljIHBvc2l0aW9uIHJlcXVpcmVzIHRoYXQKKyAqICB0aGUgaXRlcmF0b3IgYmUgbm9uc2luZ3VsYXIsIGVpdGhlciBkZXJlZmVyZW5jZWFibGUgb3IgYmVmb3JlLWJlZ2luLAorICogIGFuZCB0aGF0IGl0IHJlZmVyZW5jZSB0aGUgc2VxdWVuY2Ugd2UgYXJlIGluc2VydGluZyBpbnRvLiBOb3RlIHRoYXQKKyAqICB0aGlzIG1hY3JvIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgY29udGFpbmVyIGlzIGFfU2FmZV9zZXF1ZW5jZSBhbmQKKyAqICB0aGUgaXRlcmF0b3IgaXMgYSBfU2FmZV9pdGVyYXRvci4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfYWZ0ZXIoX1Bvc2l0aW9uKQkJCQlcCitfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9Qb3NpdGlvbik7CQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9Qb3NpdGlvbi5fTV9pc19lbmQoKSwJCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19pbnNlcnRfYWZ0ZXJfZW5kKQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gaW5zZXJ0IHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhdG9yIHJhbmdlCisgKiAgW19GaXJzdCwgX0xhc3QpIGludG8gKnRoaXMgd2l0aCB0aGUgaXRlcmF0b3IgX1Bvc2l0aW9uLiAgSW5zZXJ0aW9uCisgKiAgaW50byBhIGNvbnRhaW5lciBhdCBhIHNwZWNpZmljIHBvc2l0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGl0ZXJhdG9yCisgKiAgYmUgbm9uc2luZ3VsYXIgKGkuZS4sIGVpdGhlciBkZXJlZmVyZW5jZWFibGUgb3IgcGFzdC10aGUtZW5kKSwKKyAqICB0aGF0IGl0IHJlZmVyZW5jZSB0aGUgc2VxdWVuY2Ugd2UgYXJlIGluc2VydGluZyBpbnRvLCBhbmQgdGhhdCB0aGUKKyAqICBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBMYXN0KSBpcyBhIHZhbGlkIChwb3NzaWJseSBlbXB0eSkKKyAqICByYW5nZS4gTm90ZSB0aGF0IHRoaXMgbWFjcm8gaXMgb25seSB2YWxpZCB3aGVuIHRoZSBjb250YWluZXIgaXMgYQorICogIF9TYWZlX3NlcXVlbmNlIGFuZCB0aGUgaXRlcmF0b3IgaXMgYSBfU2FmZV9pdGVyYXRvci4KKyAqCisgKiAgQHRvZG8gV2Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIGNoZWNrIGZvciBub25pbnRlcmZlcmVuY2Ugb2YKKyAqICBfUG9zaXRpb24gYW5kIHRoZSByYW5nZSBbX0ZpcnN0LCBfTGFzdCksIGJ1dCB0aGF0IGNhbid0IChpbgorICogIGdlbmVyYWwpIGJlIGRvbmUuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0X3JhbmdlKF9Qb3NpdGlvbixfRmlyc3QsX0xhc3QpCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX19nbGliY3h4X2NoZWNrX2luc2VydChfUG9zaXRpb24pCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gaW5zZXJ0IHRoZSB2YWx1ZXMgaW4gdGhlIGl0ZXJhdG9yIHJhbmdlCisgKiAgW19GaXJzdCwgX0xhc3QpIGludG8gKnRoaXMgYWZ0ZXIgdGhlIGl0ZXJhdG9yIF9Qb3NpdGlvbi4gIEluc2VydGlvbgorICogIGludG8gYSBjb250YWluZXIgYWZ0ZXIgYSBzcGVjaWZpYyBwb3NpdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBpdGVyYXRvcgorICogIGJlIG5vbnNpbmd1bGFyIChpLmUuLCBlaXRoZXIgZGVyZWZlcmVuY2VhYmxlIG9yIHBhc3QtdGhlLWVuZCksCisgKiAgdGhhdCBpdCByZWZlcmVuY2UgdGhlIHNlcXVlbmNlIHdlIGFyZSBpbnNlcnRpbmcgaW50bywgYW5kIHRoYXQgdGhlCisgKiAgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgTGFzdCkgaXMgYSB2YWxpZCAocG9zc2libHkgZW1wdHkpCisgKiAgcmFuZ2UuIE5vdGUgdGhhdCB0aGlzIG1hY3JvIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgY29udGFpbmVyIGlzIGEKKyAqICBfU2FmZV9zZXF1ZW5jZSBhbmQgdGhlIGl0ZXJhdG9yIGlzIGEgX1NhZmVfaXRlcmF0b3IuCisgKgorICogIEB0b2RvIFdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBjaGVjayBmb3Igbm9uaW50ZXJmZXJlbmNlIG9mCisgKiAgX1Bvc2l0aW9uIGFuZCB0aGUgcmFuZ2UgW19GaXJzdCwgX0xhc3QpLCBidXQgdGhhdCBjYW4ndCAoaW4KKyAqICBnZW5lcmFsKSBiZSBkb25lLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2luc2VydF9yYW5nZV9hZnRlcihfUG9zaXRpb24sX0ZpcnN0LF9MYXN0KQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX19nbGliY3h4X2NoZWNrX2luc2VydF9hZnRlcihfUG9zaXRpb24pCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgaXRlcmF0b3IKKyAqIF9Qb3NpdGlvbi4gV2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50IGlmIHRoZSBfUG9zaXRpb24gaXRlcmF0b3IgaXMKKyAqIGRlcmVmZXJlbmNlYWJsZSBhbmQgcmVmZXJlbmNlcyB0aGlzIHNlcXVlbmNlLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2VyYXNlKF9Qb3NpdGlvbikJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9Qb3NpdGlvbi5fTV9kZXJlZmVyZW5jZWFibGUoKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2JhZCkJICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX1Bvc2l0aW9uLCAjX1Bvc2l0aW9uKSk7CQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX1Bvc2l0aW9uLl9NX2F0dGFjaGVkX3RvKHRoaXMpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfZGlmZmVyZW50KSAgICBcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGl0ZXJhdG9yCisgKiBfUG9zaXRpb24uIFdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudCBpZiB0aGUgX1Bvc2l0aW9uIGl0ZXJhdG9yIGlzCisgKiBiZWZvcmUgYSBkZXJlZmVyZW5jZWFibGUgb25lIGFuZCByZWZlcmVuY2VzIHRoaXMgc2VxdWVuY2UuCisqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfYWZ0ZXIoX1Bvc2l0aW9uKQkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX1Bvc2l0aW9uLl9NX2JlZm9yZV9kZXJlZmVyZW5jZWFibGUoKSwJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfZXJhc2VfYWZ0ZXJfYmFkKQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9Qb3NpdGlvbiwgI19Qb3NpdGlvbikpOwkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9Qb3NpdGlvbi5fTV9hdHRhY2hlZF90byh0aGlzKSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2RpZmZlcmVudCkJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfUG9zaXRpb24sICNfUG9zaXRpb24pKQorCisvKiogVmVyaWZ5IHRoYXQgd2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgcmFuZ2UKKyAqICBbX0ZpcnN0LCBfTGFzdCkuIFdlIGNhbiBlcmFzZSB0aGUgZWxlbWVudHMgaWYgW19GaXJzdCwgX0xhc3QpIGlzIGEKKyAqICB2YWxpZCBpdGVyYXRvciByYW5nZSB3aXRoaW4gdGhpcyBzZXF1ZW5jZS4KKyovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfRmlyc3QsX0xhc3QpCQkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfRmlyc3QuX01fYXR0YWNoZWRfdG8odGhpcyksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9kaWZmZXJlbnQpICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpCisKKy8qKiBWZXJpZnkgdGhhdCB3ZSBjYW4gZXJhc2UgdGhlIGVsZW1lbnRzIGluIHRoZSBpdGVyYXRvciByYW5nZQorICogIChfRmlyc3QsIF9MYXN0KS4gV2UgY2FuIGVyYXNlIHRoZSBlbGVtZW50cyBpZiAoX0ZpcnN0LCBfTGFzdCkgaXMgYQorICogIHZhbGlkIGl0ZXJhdG9yIHJhbmdlIHdpdGhpbiB0aGlzIHNlcXVlbmNlLgorKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlX2FmdGVyKF9GaXJzdCxfTGFzdCkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX0ZpcnN0Ll9NX2Nhbl9jb21wYXJlKF9MYXN0KSwJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VyYXNlX2RpZmZlcmVudCkJXAorCQkgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkpOwkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfRmlyc3QuX01fYXR0YWNoZWRfdG8odGhpcyksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19lcmFzZV9kaWZmZXJlbnQpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KSk7CQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GaXJzdCAhPSBfTGFzdCwJCQkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UyKQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSk7CQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9GaXJzdC5fTV9pbmNyZW1lbnRhYmxlKCksCQkJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZTIpCVwKKwkJICAgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpKTsJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoIV9MYXN0Ll9NX2lzX2JlZm9yZV9iZWdpbigpLAkJCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UyKQlcCisJCSAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkJCQlcCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBzdWJzY3JpcHQgX04gaXMgbGVzcyB0aGFuIHRoZSBjb250YWluZXIncyBzaXplLgorI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9OKQkJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9OIDwgdGhpcy0+c2l6ZSgpLAkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3N1YnNjcmlwdF9vb2IpICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQkJCVwKKwkJICAgICAgLl9NX2ludGVnZXIoX04sICNfTikJCQkJXAorCQkgICAgICAuX01faW50ZWdlcih0aGlzLT5zaXplKCksICJzaXplIikpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBjb250YWluZXIgaXMgbm9uZW1wdHkKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCkJCQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSghIHRoaXMtPmVtcHR5KCksCQkJCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX2VtcHR5KQkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuX01fc2VxdWVuY2UoKnRoaXMsICJ0aGlzIikpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgc29ydGVkCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWQoX0ZpcnN0LF9MYXN0KQkJCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3NvcnRlZChfRmlyc3QsIF9MYXN0KSwJXAorCQkgICAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnNvcnRlZCkJICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkKKworLyoqIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgc29ydGVkIGJ5IHRoZQorICAgIHByZWRpY2F0ZSBfUHJlZC4gKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9wcmVkKF9GaXJzdCxfTGFzdCxfUHJlZCkJCQlcCitfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX0ZpcnN0LF9MYXN0KTsJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fZ251X2RlYnVnOjpfX2NoZWNrX3NvcnRlZChfRmlyc3QsIF9MYXN0LCBfUHJlZCksIFwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5zb3J0ZWRfcHJlZCkgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KQkJCVwKKwkJICAgICAgLl9NX3N0cmluZygjX1ByZWQpKQorCisvLyBTcGVjaWFsIHZhcmlhbnQgZm9yIHN0ZDo6bWVyZ2UsIHN0ZDo6aW5jbHVkZXMsIHN0ZDo6c2V0XyoKKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3NvcnRlZF9zZXQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MikJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QxLF9MYXN0MSk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19nbnVfZGVidWc6Ol9fY2hlY2tfc29ydGVkX3NldChfRmlyc3QxLCBfTGFzdDEsIF9GaXJzdDIpLAkJXAorICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ191bnNvcnRlZCkJCQkJXAorICAuX01faXRlcmF0b3IoX0ZpcnN0MSwgI19GaXJzdDEpCQkJCQlcCisgIC5fTV9pdGVyYXRvcihfTGFzdDEsICNfTGFzdDEpKQorCisvLyBMaWtld2lzZSB3aXRoIGEgX1ByZWQuCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zb3J0ZWRfc2V0X3ByZWQoX0ZpcnN0MSxfTGFzdDEsX0ZpcnN0MixfUHJlZCkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdDEsX0xhc3QxKTsgICAgICAgIAkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWSgJCQkJCQkJXAorICBfX2dudV9kZWJ1Zzo6X19jaGVja19zb3J0ZWRfc2V0KF9GaXJzdDEsIF9MYXN0MSwgX0ZpcnN0MiwgX1ByZWQpLAlcCisgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3Vuc29ydGVkX3ByZWQpCQkJCVwKKyAgLl9NX2l0ZXJhdG9yKF9GaXJzdDEsICNfRmlyc3QxKQkJCQkJXAorICAuX01faXRlcmF0b3IoX0xhc3QxLCAjX0xhc3QxKQkJCQkJCVwKKyAgLl9NX3N0cmluZygjX1ByZWQpKQorCisvKiogVmVyaWZ5IHRoYXQgdGhlIGl0ZXJhdG9yIHJhbmdlIFtfRmlyc3QsIF9MYXN0KSBpcyBwYXJ0aXRpb25lZAorICAgIHcuci50LiB0aGUgdmFsdWUgX1ZhbHVlLiAqLworI2RlZmluZSBfX2dsaWJjeHhfY2hlY2tfcGFydGl0aW9uZWRfbG93ZXIoX0ZpcnN0LF9MYXN0LF9WYWx1ZSkJCVwKK19fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfRmlyc3QsX0xhc3QpOwkJCQlcCitfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19nbnVfZGVidWc6Ol9fY2hlY2tfcGFydGl0aW9uZWRfbG93ZXIoX0ZpcnN0LCBfTGFzdCwgXAorCQkJCQkJCSAgICBfVmFsdWUpLAlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3VucGFydGl0aW9uZWQpICAgICAgXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfVmFsdWUpKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19wYXJ0aXRpb25lZF91cHBlcihfRmlyc3QsX0xhc3QsX1ZhbHVlKQkJXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X19jaGVja19wYXJ0aXRpb25lZF91cHBlcihfRmlyc3QsIF9MYXN0LCBcCisJCQkJCQkJICAgIF9WYWx1ZSksCVwKKwkJICAgICAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdW5wYXJ0aXRpb25lZCkgICAgICBcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkJCQlcCisJCSAgICAgIC5fTV9zdHJpbmcoI19WYWx1ZSkpCisKKy8qKiBWZXJpZnkgdGhhdCB0aGUgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgX0xhc3QpIGlzIHBhcnRpdGlvbmVkCisgICAgdy5yLnQuIHRoZSB2YWx1ZSBfVmFsdWUgYW5kIHByZWRpY2F0ZSBfUHJlZC4gKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX2xvd2VyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkgXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X19jaGVja19wYXJ0aXRpb25lZF9sb3dlcihfRmlyc3QsIF9MYXN0LCBcCisJCQkJCQkJIF9WYWx1ZSwgX1ByZWQpLCBcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3VucGFydGl0aW9uZWRfcHJlZCkgXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfUHJlZCkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zdHJpbmcoI19WYWx1ZSkpCisKKy8qKiBWZXJpZnkgdGhhdCB0aGUgaXRlcmF0b3IgcmFuZ2UgW19GaXJzdCwgX0xhc3QpIGlzIHBhcnRpdGlvbmVkCisgICAgdy5yLnQuIHRoZSB2YWx1ZSBfVmFsdWUgYW5kIHByZWRpY2F0ZSBfUHJlZC4gKi8KKyNkZWZpbmUgX19nbGliY3h4X2NoZWNrX3BhcnRpdGlvbmVkX3VwcGVyX3ByZWQoX0ZpcnN0LF9MYXN0LF9WYWx1ZSxfUHJlZCkgXAorX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9GaXJzdCxfTGFzdCk7CQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2dudV9kZWJ1Zzo6X19jaGVja19wYXJ0aXRpb25lZF91cHBlcihfRmlyc3QsIF9MYXN0LCBcCisJCQkJCQkJIF9WYWx1ZSwgX1ByZWQpLCBcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3VucGFydGl0aW9uZWRfcHJlZCkgXAorCQkgICAgICAuX01faXRlcmF0b3IoX0ZpcnN0LCAjX0ZpcnN0KQkJCVwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9MYXN0LCAjX0xhc3QpCQkJXAorCQkgICAgICAuX01fc3RyaW5nKCNfUHJlZCkJCQkJXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9zdHJpbmcoI19WYWx1ZSkpCisKKy8vIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgYSBoZWFwCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19oZWFwKF9GaXJzdCxfTGFzdCkJCQkJXAorX0dMSUJDWFhfREVCVUdfVkVSSUZZKHN0ZDo6X19pc19oZWFwKF9GaXJzdCwgX0xhc3QpLAkJICAgICAgICBcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX25vdF9oZWFwKQkgICAgICAgIFwKKwkJICAgICAgLl9NX2l0ZXJhdG9yKF9GaXJzdCwgI19GaXJzdCkJCQlcCisJCSAgICAgIC5fTV9pdGVyYXRvcihfTGFzdCwgI19MYXN0KSkKKworLyoqIFZlcmlmeSB0aGF0IHRoZSBpdGVyYXRvciByYW5nZSBbX0ZpcnN0LCBfTGFzdCkgaXMgYSBoZWFwCisgICAgdy5yLnQuIHRoZSBwcmVkaWNhdGUgX1ByZWQuICovCisjZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19oZWFwX3ByZWQoX0ZpcnN0LF9MYXN0LF9QcmVkKQkJCVwKK19HTElCQ1hYX0RFQlVHX1ZFUklGWShzdGQ6Ol9faXNfaGVhcChfRmlyc3QsIF9MYXN0LCBfUHJlZCksCQlcCisJCSAgICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX25vdF9oZWFwX3ByZWQpICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC5fTV9pdGVyYXRvcihfRmlyc3QsICNfRmlyc3QpCQkJXAorCQkgICAgICAuX01faXRlcmF0b3IoX0xhc3QsICNfTGFzdCkJCQlcCisJCSAgICAgIC5fTV9zdHJpbmcoI19QcmVkKSkKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFOVElDCisjICBkZWZpbmUgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfU3RyaW5nKSBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX1N0cmluZyAhPSAwKQorIyAgZGVmaW5lIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9TdHJpbmcsX0xlbikgXAorICAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfU3RyaW5nICE9IDAgfHwgX0xlbiA9PSAwKQorI2Vsc2UKKyMgIGRlZmluZSBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9TdHJpbmcpCisjICBkZWZpbmUgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX1N0cmluZyxfTGVuKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tYXAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDE2YjcxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tYXAKQEAgLTAsMCArMSwzNyBAQAorLy8gRGVidWdnaW5nIG1hcC9tdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDkKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9tYXAKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX01BUAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19NQVAgMQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGRlYnVnL21hcC5oPgorI2luY2x1ZGUgPGRlYnVnL211bHRpbWFwLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3Nzk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbWFwLmgKQEAgLTAsMCArMSw0NzUgQEAKKy8vIERlYnVnZ2luZyBtYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvbWFwLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX01BUF9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX01BUF9IIDEKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjptYXAgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyBtYXAKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6bWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiBfQmFzZTsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPG1hcD4gX1NhZmVfYmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8dHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yLCBtYXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjx0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IsIG1hcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gMjMuMy4xLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBtYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksCisJCV9fY29tcCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICBtYXAoY29uc3QgbWFwJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBtYXAobWFwJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSksIF9TYWZlX2Jhc2UoKQorICAgICAgeyB0aGlzLT5fTV9zd2FwKF9feCk7IH0KKworICAgICAgbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fYyA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2MsIF9fYSksIF9TYWZlX2Jhc2UoKSB7IH0KKyNlbmRpZgorCisgICAgICB+bWFwKCkgeyB9CisKKyAgICAgIG1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0obWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTMzLiBtYXAgbWlzc2luZyBnZXRfYWxsb2NhdG9yKCkKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvciAKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyAyMy4zLjEuMiBlbGVtZW50IGFjY2VzczoKKyAgICAgIHVzaW5nIF9CYXNlOjpvcGVyYXRvcltdOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX194KTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwkgIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMKKwkgICAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSk7CisJICByZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSAgIF9fcmVzLnNlY29uZCk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2xpc3QpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19saXN0KTsgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpLCB0aGlzKTsKKwl9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbi5iYXNlKCkpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gZXJhc2UoY29uc3RfaXRlcmF0b3IoX19wb3NpdGlvbikpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19wb3NpdGlvbik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19wb3NpdGlvbi5iYXNlKCkpKTsKKwlfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9CYXNlOjpmaW5kKF9feCk7CisJaWYgKF9fdmljdGltID09IF9CYXNlOjplbmQoKSkKKwkgIHJldHVybiAwOworCWVsc2UKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgICAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobWFwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gMjMuMy4xLjMgbWFwIG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJiAKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfTm90X2VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfTm90X2VxdWFsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX05vdF9lcXVhbChfTV9iYXNlKCkuZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbXVsdGltYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvbXVsdGltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmUxOTc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tdWx0aW1hcC5oCkBAIC0wLDAgKzEsNDU1IEBACisvLyBEZWJ1Z2dpbmcgbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvbXVsdGltYXAuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfTVVMVElNQVBfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19NVUxUSU1BUF9IIDEKKworI2luY2x1ZGUgPGRlYnVnL3NhZmVfc2VxdWVuY2UuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjptdWx0aW1hcCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG11bHRpbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxtdWx0aW1hcDxfS2V5LCBfVHAsCisJCQkJCQkgIF9Db21wYXJlLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxtdWx0aW1hcD4gX1NhZmVfYmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwgbXVsdGltYXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGltYXA+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgbXVsdGltYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCQljb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwKKwkgICAgICBfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIG11bHRpbWFwKGNvbnN0IG11bHRpbWFwJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgbXVsdGltYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSwgX1NhZmVfYmFzZSgpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG11bHRpbWFwKG11bHRpbWFwJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSksIF9TYWZlX2Jhc2UoKQorICAgICAgeyB0aGlzLT5fTV9zd2FwKF9feCk7IH0KKworICAgICAgbXVsdGltYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2MgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2MsIF9fYSksIF9TYWZlX2Jhc2UoKSB7IH0KKyNlbmRpZgorCisgICAgICB+bXVsdGltYXAoKSB7IH0KKworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBtdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShtdWx0aW1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9feCksIHRoaXMpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfUGFpciwKKwkJCQkJCSAgdmFsdWVfdHlwZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KF9QYWlyJiYgX194KQorICAgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSksIHRoaXMpOyB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbGlzdCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2xpc3QpOyB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbHNlCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorI2VuZGlmCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KSwgdGhpcyk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfUGFpciwKKwkJCQkJCSAgdmFsdWVfdHlwZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIF9QYWlyJiYgX194KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCSAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfUGFpcj4oX194KSksIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uLmJhc2UoKSkpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX3Bvc2l0aW9uKSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3Bvc2l0aW9uLmJhc2UoKSkpOworCV9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fdmljdGltcyA9CisJICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlzaXplX3R5cGUgX19jb3VudCA9IDA7CisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfX3ZpY3RpbXMuZmlyc3Q7CisJd2hpbGUgKF9fdmljdGltICE9ICBfX3ZpY3RpbXMuc2Vjb25kKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0rKyk7CisJICAgICsrX19jb3VudDsKKwkgIH0KKwlyZXR1cm4gX19jb3VudDsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCV9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aW1hcCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJdGhpcy0+X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIDIzLjMuMS4zIG11bHRpbWFwIG9wZXJhdGlvbnM6CisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQsIHRoaXMpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FsbCgpCisgICAgICB7CisJdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X05vdF9lcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX05vdF9lcXVhbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9Ob3RfZXF1YWwoX0Jhc2U6OmVuZCgpKSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbXVsdGltYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19kZWJ1ZworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tdWx0aXNldC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9tdWx0aXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MDhmYjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL211bHRpc2V0LmgKQEAgLTAsMCArMSw0NDEgQEAKKy8vIERlYnVnZ2luZyBtdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9tdWx0aXNldC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19NVUxUSVNFVF9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX01VTFRJU0VUX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6Om11bHRpc2V0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyBtdWx0aXNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8bXVsdGlzZXQ+IF9TYWZlX2Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgICB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZQkgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBtdWx0aXNldD4KKyAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgbXVsdGlzZXQ+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgbXVsdGlzZXQoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCQljb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG11bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksCisJCV9fY29tcCwgX19hKSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICBtdWx0aXNldChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgbXVsdGlzZXQobXVsdGlzZXQmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKSwgX1NhZmVfYmFzZSgpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX194KTsgfQorCisgICAgICBtdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fY29tcCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tdWx0aXNldCgpIHsgfQorCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBtdWx0aXNldCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KG11bHRpc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyBtb2RpZmllcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX194KSwgdGhpcyk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKSwgdGhpcyk7IH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpLCB0aGlzKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX3Bvc2l0aW9uKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgc3RkOjptb3ZlKF9feCkpLAorCQkJdGhpcyk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJdm9pZAorCWluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisJeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX192aWN0aW1zID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXNpemVfdHlwZSBfX2NvdW50ID0gMDsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fdmljdGltcy5maXJzdDsKKwl3aGlsZSAoX192aWN0aW0gIT0gX192aWN0aW1zLnNlY29uZCkKKwkgIHsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgICAgX0Jhc2U6OmVyYXNlKF9fdmljdGltKyspOworCSAgICArK19fY291bnQ7CisJICB9CisJcmV0dXJuIF9fY291bnQ7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX192aWN0aW0gIT0gX19sYXN0LmJhc2UoKTsgKytfX3ZpY3RpbSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdmljdGltICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX192aWN0aW0pKTsKKwkgIH0KKwlfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksIF9fbGFzdC5iYXNlKCkpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGlzZXQmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIC8vIG9ic2VydmVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjprZXlfY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjp2YWx1ZV9jb21wOworCisgICAgICAvLyBtdWx0aXNldCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4gX19yZXMgPQorCSAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfTm90X2VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfTm90X2VxdWFsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX05vdF9lcXVhbChfQmFzZTo6ZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBzd2FwKG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorCSBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guc3dhcChfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2FmZV9iYXNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3NhZmVfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDgwMDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3NhZmVfYmFzZS5oCkBAIC0wLDAgKzEsMjU1IEBACisvLyBTYWZlIHNlcXVlbmNlL2l0ZXJhdG9yIGJhc2UgaW1wbGVtZW50YXRpb24gIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfYmFzZS5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX0JBU0VfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX0JBU0VfSCAxCisKKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKworbmFtZXNwYWNlIF9fZ251X2RlYnVnCit7CisgIGNsYXNzIF9TYWZlX3NlcXVlbmNlX2Jhc2U7CisKKyAgLyoqIFxicmllZiBCYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBhIEBhIHNhZmUgaXRlcmF0b3IuCisgICAqCisgICAqICBUaGUgJV9TYWZlX2l0ZXJhdG9yX2Jhc2UgYmFzZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5CisgICAqICBvZiBhIHNhZmUgaXRlcmF0b3IgdGhhdCBpcyBub3Qgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGl0ZXJhdG9yCisgICAqICB0eXBlLiBJdCBjb250YWlucyBhIHBvaW50ZXIgYmFjayB0byB0aGUgc2VxdWVuY2UgaXQgcmVmZXJlbmNlcworICAgKiAgYWxvbmcgd2l0aCBpdGVyYXRvciB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBwb2ludGVycyB0byBmb3JtIGEKKyAgICogIGRvdWJseS1saW5rZWQgbGlzdCBvZiBpdGVyYXRvcnMgcmVmZXJlbmNlZCBieSB0aGUgY29udGFpbmVyLgorICAgKgorICAgKiAgVGhpcyBjbGFzcyBtdXN0IG5vdCBwZXJmb3JtIGFueSBvcGVyYXRpb25zIHRoYXQgY2FuIHRocm93IGFuCisgICAqICBleGNlcHRpb24sIG9yIHRoZSBleGNlcHRpb24gZ3VhcmFudGVlcyBvZiBkZXJpdmVkIGl0ZXJhdG9ycyB3aWxsCisgICAqICBiZSBicm9rZW4uCisgICAqLworICBjbGFzcyBfU2FmZV9pdGVyYXRvcl9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIC8qKiBUaGUgc2VxdWVuY2UgdGhpcyBpdGVyYXRvciByZWZlcmVuY2VzOyBtYXkgYmUgTlVMTCB0byBpbmRpY2F0ZQorCWEgc2luZ3VsYXIgaXRlcmF0b3IuICovCisgICAgX1NhZmVfc2VxdWVuY2VfYmFzZSogX01fc2VxdWVuY2U7CisKKyAgICAvKiogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaXRlcmF0b3IuIFRoZSBzZW50aW5lbCB2YWx1ZSAwIGlzCisgICAgICogIHVzZWQgdG8gaW5kaWNhdGUgYW4gaW52YWxpZGF0ZWQgaXRlcmF0b3IgKGkuZS4sIG9uZSB0aGF0IGlzCisgICAgICogIHNpbmd1bGFyIGJlY2F1c2Ugb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBjb250YWluZXIpLiBUaGlzCisgICAgICogIHZlcnNpb24gbnVtYmVyIG11c3QgZXF1YWwgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZQorICAgICAqICByZWZlcmVuY2VkIGJ5IF9NX3NlcXVlbmNlIGZvciB0aGUgaXRlcmF0b3IgdG8gYmUKKyAgICAgKiAgbm9uLXNpbmd1bGFyLgorICAgICAqLworICAgIHVuc2lnbmVkIGludCAgICAgICAgIF9NX3ZlcnNpb247CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgcHJldmlvdXMgaXRlcmF0b3IgaW4gdGhlIHNlcXVlbmNlJ3MgbGlzdCBvZgorCWl0ZXJhdG9ycy4gT25seSB2YWxpZCB3aGVuIF9NX3NlcXVlbmNlICE9IE5VTEwuICovCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSogX01fcHJpb3I7CisKKyAgICAvKiogUG9pbnRlciB0byB0aGUgbmV4dCBpdGVyYXRvciBpbiB0aGUgc2VxdWVuY2UncyBsaXN0IG9mCisJaXRlcmF0b3JzLiBPbmx5IHZhbGlkIHdoZW4gX01fc2VxdWVuY2UgIT0gTlVMTC4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9uZXh0OworCisgIHByb3RlY3RlZDoKKyAgICAvKiogSW5pdGlhbGl6ZXMgdGhlIGl0ZXJhdG9yIGFuZCBtYWtlcyBpdCBzaW5ndWxhci4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKCkKKyAgICA6IF9NX3NlcXVlbmNlKDApLCBfTV92ZXJzaW9uKDApLCBfTV9wcmlvcigwKSwgX01fbmV4dCgwKQorICAgIHsgfQorCisgICAgLyoqIEluaXRpYWxpemUgdGhlIGl0ZXJhdG9yIHRvIHJlZmVyZW5jZSB0aGUgc2VxdWVuY2UgcG9pbnRlZCB0bworICAgICAqICBieSBAcF9fc2VxLiBAcCBfX2NvbnN0YW50IGlzIHRydWUgd2hlbiB3ZSBhcmUgaW5pdGlhbGl6aW5nIGEKKyAgICAgKiAgY29uc3RhbnQgaXRlcmF0b3IsIGFuZCBmYWxzZSBpZiBpdCBpcyBhIG11dGFibGUgaXRlcmF0b3IuIE5vdGUKKyAgICAgKiAgdGhhdCBAcCBfX3NlcSBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgaXRlcmF0b3Igd2lsbCBiZQorICAgICAqICBzaW5ndWxhci4gT3RoZXJ3aXNlLCB0aGUgaXRlcmF0b3Igd2lsbCByZWZlcmVuY2UgQHAgX19zZXEgYW5kCisgICAgICogIGJlIG5vbnNpbmd1bGFyLgorICAgICAqLworICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEsIGJvb2wgX19jb25zdGFudCkKKyAgICA6IF9NX3NlcXVlbmNlKDApLCBfTV92ZXJzaW9uKDApLCBfTV9wcmlvcigwKSwgX01fbmV4dCgwKQorICAgIHsgdGhpcy0+X01fYXR0YWNoKGNvbnN0X2Nhc3Q8X1NhZmVfc2VxdWVuY2VfYmFzZSo+KF9fc2VxKSwgX19jb25zdGFudCk7IH0KKworICAgIC8qKiBJbml0aWFsaXplcyB0aGUgaXRlcmF0b3IgdG8gcmVmZXJlbmNlIHRoZSBzYW1lIHNlcXVlbmNlIHRoYXQKKwlAcCBfX3ggZG9lcy4gQHAgX19jb25zdGFudCBpcyB0cnVlIGlmIHRoaXMgaXMgYSBjb25zdGFudAorCWl0ZXJhdG9yLCBhbmQgZmFsc2UgaWYgaXQgaXMgbXV0YWJsZS4gKi8KKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmIF9feCwgYm9vbCBfX2NvbnN0YW50KQorICAgIDogX01fc2VxdWVuY2UoMCksIF9NX3ZlcnNpb24oMCksIF9NX3ByaW9yKDApLCBfTV9uZXh0KDApCisgICAgeyB0aGlzLT5fTV9hdHRhY2goX194Ll9NX3NlcXVlbmNlLCBfX2NvbnN0YW50KTsgfQorCisgICAgX1NhZmVfaXRlcmF0b3JfYmFzZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgX1NhZmVfaXRlcmF0b3JfYmFzZSYpOworCisgICAgZXhwbGljaXQKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmKTsKKworICAgIH5fU2FmZV9pdGVyYXRvcl9iYXNlKCkgeyB0aGlzLT5fTV9kZXRhY2goKTsgfQorCisgICAgLyoqIEZvciB1c2UgaW4gX1NhZmVfaXRlcmF0b3IuICovCisgICAgX19nbnVfY3h4OjpfX211dGV4JiBfTV9nZXRfbXV0ZXgoKSB0aHJvdyAoKTsKKworICBwdWJsaWM6CisgICAgLyoqIEF0dGFjaGVzIHRoaXMgaXRlcmF0b3IgdG8gdGhlIGdpdmVuIHNlcXVlbmNlLCBkZXRhY2hpbmcgaXQKKyAgICAgKglmcm9tIHdoYXRldmVyIHNlcXVlbmNlIGl0IHdhcyBhdHRhY2hlZCB0byBvcmlnaW5hbGx5LiBJZiB0aGUKKyAgICAgKgluZXcgc2VxdWVuY2UgaXMgdGhlIE5VTEwgcG9pbnRlciwgdGhlIGl0ZXJhdG9yIGlzIGxlZnQKKyAgICAgKgl1bmF0dGFjaGVkLgorICAgICAqLworICAgIHZvaWQgX01fYXR0YWNoKF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxLCBib29sIF9fY29uc3RhbnQpOworCisgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgIHZvaWQgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSwgYm9vbCBfX2NvbnN0YW50KSB0aHJvdyAoKTsKKworICAgIC8qKiBEZXRhY2ggdGhlIGl0ZXJhdG9yIGZvciB3aGF0ZXZlciBzZXF1ZW5jZSBpdCBpcyBhdHRhY2hlZCB0bywKKyAgICAgKglpZiBhbnkuCisgICAgKi8KKyAgICB2b2lkIF9NX2RldGFjaCgpOworCisgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgIHZvaWQgX01fZGV0YWNoX3NpbmdsZSgpIHRocm93ICgpOworCisgICAgLyoqIERldGVybWluZXMgaWYgd2UgYXJlIGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBzZXF1ZW5jZS4gKi8KKyAgICBib29sIF9NX2F0dGFjaGVkX3RvKGNvbnN0IF9TYWZlX3NlcXVlbmNlX2Jhc2UqIF9fc2VxKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3NlcXVlbmNlID09IF9fc2VxOyB9CisKKyAgICAvKiogSXMgdGhpcyBpdGVyYXRvciBzaW5ndWxhcj8gKi8KKyAgICBfR0xJQkNYWF9QVVJFIGJvb2wgX01fc2luZ3VsYXIoKSBjb25zdCB0aHJvdyAoKTsKKworICAgIC8qKiBDYW4gd2UgY29tcGFyZSB0aGlzIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBpdGVyYXRvciBAcCBfX3g/CisJUmV0dXJucyB0cnVlIGlmIGJvdGggaXRlcmF0b3JzIGFyZSBub25zaW5ndWxhciBhbmQgcmVmZXJlbmNlCisJdGhlIHNhbWUgc2VxdWVuY2UuICovCisgICAgX0dMSUJDWFhfUFVSRSBib29sIF9NX2Nhbl9jb21wYXJlKGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UmIF9feCkgY29uc3QgdGhyb3cgKCk7CisKKyAgICAvKiogSW52YWxpZGF0ZSB0aGUgaXRlcmF0b3IsIG1ha2luZyBpdCBzaW5ndWxhci4gKi8KKyAgICB2b2lkCisgICAgX01faW52YWxpZGF0ZSgpCisgICAgeyBfTV92ZXJzaW9uID0gMDsgfQorCisgICAgLyoqIFJlc2V0IGFsbCBtZW1iZXIgdmFyaWFibGVzICovCisgICAgdm9pZAorICAgIF9NX3Jlc2V0KCkgdGhyb3cgKCk7CisKKyAgICAvKiogVW5saW5rIGl0c2VsZiAqLworICAgIHZvaWQKKyAgICBfTV91bmxpbmsoKSB0aHJvdyAoKQorICAgIHsKKyAgICAgIGlmIChfTV9wcmlvcikKKwlfTV9wcmlvci0+X01fbmV4dCA9IF9NX25leHQ7CisgICAgICBpZiAoX01fbmV4dCkKKwlfTV9uZXh0LT5fTV9wcmlvciA9IF9NX3ByaW9yOworICAgIH0KKyAgfTsKKworICAvKioKKyAgICogQGJyaWVmIEJhc2UgY2xhc3MgdGhhdCBzdXBwb3J0cyB0cmFja2luZyBvZiBpdGVyYXRvcnMgdGhhdAorICAgKiByZWZlcmVuY2UgYSBzZXF1ZW5jZS4KKyAgICoKKyAgICogVGhlICVfU2FmZV9zZXF1ZW5jZV9iYXNlIGNsYXNzIHByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yCisgICAqIHRyYWNraW5nIGl0ZXJhdG9ycyBpbnRvIGEgc2VxdWVuY2UuIFNlcXVlbmNlcyB0aGF0IHRyYWNrCisgICAqIGl0ZXJhdG9ycyBtdXN0IGRlcml2ZWQgZnJvbSAlX1NhZmVfc2VxdWVuY2VfYmFzZSBwdWJsaWNseSwgc28KKyAgICogdGhhdCBzYWZlIGl0ZXJhdG9ycyAod2hpY2ggaW5oZXJpdCBfU2FmZV9pdGVyYXRvcl9iYXNlKSBjYW4KKyAgICogYXR0YWNoIHRvIHRoZW0uIFRoaXMgY2xhc3MgY29udGFpbnMgdHdvIGxpbmtlZCBsaXN0cyBvZgorICAgKiBpdGVyYXRvcnMsIG9uZSBmb3IgY29uc3RhbnQgaXRlcmF0b3JzIGFuZCBvbmUgZm9yIG11dGFibGUKKyAgICogaXRlcmF0b3JzLCBhbmQgYSB2ZXJzaW9uIG51bWJlciB0aGF0IGFsbG93cyB2ZXJ5IGZhc3QKKyAgICogaW52YWxpZGF0aW9uIG9mIGFsbCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhlIGNvbnRhaW5lci4KKyAgICoKKyAgICogVGhpcyBjbGFzcyBtdXN0IGVuc3VyZSB0aGF0IG5vIG9wZXJhdGlvbiBvbiBpdCBtYXkgdGhyb3cgYW4KKyAgICogZXhjZXB0aW9uLCBvdGhlcndpc2UgQGEgc2FmZSBzZXF1ZW5jZXMgbWF5IGZhaWwgdG8gcHJvdmlkZSB0aGUKKyAgICogZXhjZXB0aW9uLXNhZmV0eSBndWFyYW50ZWVzIHJlcXVpcmVkIGJ5IHRoZSBDKysgc3RhbmRhcmQuCisgICAqLworICBjbGFzcyBfU2FmZV9zZXF1ZW5jZV9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIC8vLyBUaGUgbGlzdCBvZiBtdXRhYmxlIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSB0aGlzIGNvbnRhaW5lcgorICAgIF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9NX2l0ZXJhdG9yczsKKworICAgIC8vLyBUaGUgbGlzdCBvZiBjb25zdGFudCBpdGVyYXRvcnMgdGhhdCByZWZlcmVuY2UgdGhpcyBjb250YWluZXIKKyAgICBfU2FmZV9pdGVyYXRvcl9iYXNlKiBfTV9jb25zdF9pdGVyYXRvcnM7CisKKyAgICAvLy8gVGhlIGNvbnRhaW5lciB2ZXJzaW9uIG51bWJlci4gVGhpcyBudW1iZXIgbWF5IG5ldmVyIGJlIDAuCisgICAgbXV0YWJsZSB1bnNpZ25lZCBpbnQgX01fdmVyc2lvbjsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGEgdmVyc2lvbiBudW1iZXIgb2YgMSBhbmQgbm8gaXRlcmF0b3JzCisgICAgX1NhZmVfc2VxdWVuY2VfYmFzZSgpCisgICAgOiBfTV9pdGVyYXRvcnMoMCksIF9NX2NvbnN0X2l0ZXJhdG9ycygwKSwgX01fdmVyc2lvbigxKQorICAgIHsgfQorCisgICAgLyoqIE5vdGlmeSBhbGwgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoaXMgc2VxdWVuY2UgdGhhdCB0aGUKKwlzZXF1ZW5jZSBpcyBiZWluZyBkZXN0cm95ZWQuICovCisgICAgfl9TYWZlX3NlcXVlbmNlX2Jhc2UoKQorICAgIHsgdGhpcy0+X01fZGV0YWNoX2FsbCgpOyB9CisKKyAgICAvKiogRGV0YWNoIGFsbCBpdGVyYXRvcnMsIGxlYXZpbmcgdGhlbSBzaW5ndWxhci4gKi8KKyAgICB2b2lkCisgICAgX01fZGV0YWNoX2FsbCgpOworCisgICAgLyoqIERldGFjaCBhbGwgc2luZ3VsYXIgaXRlcmF0b3JzLgorICAgICAqICBAcG9zdCBmb3IgYWxsIGl0ZXJhdG9ycyBpIGF0dGFjaGVkIHRvIHRoaXMgc2VxdWVuY2UsCisgICAgICogICBpLT5fTV92ZXJzaW9uID09IF9NX3ZlcnNpb24uCisgICAgICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9zaW5ndWxhcigpOworCisgICAgLyoqIFJldmFsaWRhdGVzIGFsbCBhdHRhY2hlZCBzaW5ndWxhciBpdGVyYXRvcnMuICBUaGlzIG1ldGhvZCBtYXkKKyAgICAgKiAgYmUgdXNlZCB0byB2YWxpZGF0ZSBpdGVyYXRvcnMgdGhhdCB3ZXJlIGludmFsaWRhdGVkIGJlZm9yZQorICAgICAqICAoYnV0IGZvciBzb21lIHJlYXNvbiwgc3VjaCBhcyBhbiBleGNlcHRpb24sIG5lZWQgdG8gYmVjb21lCisgICAgICogIHZhbGlkIGFnYWluKS4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgX01fcmV2YWxpZGF0ZV9zaW5ndWxhcigpOworCisgICAgLyoqIFN3YXAgdGhpcyBzZXF1ZW5jZSB3aXRoIHRoZSBnaXZlbiBzZXF1ZW5jZS4gVGhpcyBvcGVyYXRpb24KKyAgICAgKiAgYWxzbyBzd2FwcyBvd25lcnNoaXAgb2YgdGhlIGl0ZXJhdG9ycywgc28gdGhhdCB3aGVuIHRoZQorICAgICAqICBvcGVyYXRpb24gaXMgY29tcGxldGUgYWxsIGl0ZXJhdG9ycyB0aGF0IG9yaWdpbmFsbHkgcmVmZXJlbmNlZAorICAgICAqICBvbmUgY29udGFpbmVyIG5vdyByZWZlcmVuY2UgdGhlIG90aGVyIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICB2b2lkCisgICAgX01fc3dhcChfU2FmZV9zZXF1ZW5jZV9iYXNlJiBfX3gpOworCisgICAgLyoqIEZvciB1c2UgaW4gX1NhZmVfc2VxdWVuY2UuICovCisgICAgX19nbnVfY3h4OjpfX211dGV4JiBfTV9nZXRfbXV0ZXgoKSB0aHJvdyAoKTsKKworICBwdWJsaWM6CisgICAgLyoqIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMuICovCisgICAgdm9pZAorICAgIF9NX2ludmFsaWRhdGVfYWxsKCkgY29uc3QKKyAgICB7IGlmICgrK19NX3ZlcnNpb24gPT0gMCkgX01fdmVyc2lvbiA9IDE7IH0KKworICAgIC8qKiBBdHRhY2ggYW4gaXRlcmF0b3IgdG8gdGhpcyBzZXF1ZW5jZS4gKi8KKyAgICB2b2lkCisgICAgX01fYXR0YWNoKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQsIGJvb2wgX19jb25zdGFudCk7CisKKyAgICAvKiogTGlrZXdpc2UgYnV0IG5vdCB0aHJlYWQgc2FmZS4gKi8KKyAgICB2b2lkCisgICAgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0LCBib29sIF9fY29uc3RhbnQpIHRocm93ICgpOworCisgICAgLyoqIERldGFjaCBhbiBpdGVyYXRvciBmcm9tIHRoaXMgc2VxdWVuY2UgKi8KKyAgICB2b2lkCisgICAgX01fZGV0YWNoKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXQpOworCisgICAgLyoqIExpa2V3aXNlIGJ1dCBub3QgdGhyZWFkIHNhZmUuICovCisgICAgdm9pZAorICAgIF9NX2RldGFjaF9zaW5nbGUoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdCkgdGhyb3cgKCk7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2FmZV9pdGVyYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zYWZlX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3YzNiYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2FmZV9pdGVyYXRvci5oCkBAIC0wLDAgKzEsNjg5IEBACisvLyBTYWZlIGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX2l0ZXJhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1NBRkVfSVRFUkFUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX0lURVJBVE9SX0ggMQorCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9tYWNyb3MuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9mdW5jdGlvbnMuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9wYWlyLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPiAvLyBmb3IgX0l0ZXJfYmFzZQorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgLyoqIEhlbHBlciBzdHJ1Y3QgdG8gZGVhbCB3aXRoIHNlcXVlbmNlIG9mZmVyaW5nIGEgYmVmb3JlX2JlZ2luCisgICAqICBpdGVyYXRvci4KKyAgICoqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHN0cnVjdCBfQmVmb3JlQmVnaW5IZWxwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgX0l0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSXQ6Oml0ZXJhdG9yX3R5cGUgX0Jhc2VJdDsKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9NX0lzKF9CYXNlSXQgX19pdCwgY29uc3QgX1NlcXVlbmNlKiBfX3NlcSkKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfTsKKworICAvKiogSXRlcmF0b3JzIHRoYXQgZGVyaXZlIGZyb20gX1NhZmVfaXRlcmF0b3JfYmFzZSBidXQgdGhhdCBhcmVuJ3QKKyAgICogIF9TYWZlX2l0ZXJhdG9ycyBjYW4gYmUgZGV0ZXJtaW5lZCBzaW5ndWxhciBvciBub24tc2luZ3VsYXIgdmlhCisgICAqICBfU2FmZV9pdGVyYXRvcl9iYXNlLgorICAgKi8KKyAgaW5saW5lIGJvb2wgCisgIF9fY2hlY2tfc2luZ3VsYXJfYXV4KGNvbnN0IF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9feCkKKyAgeyByZXR1cm4gX194LT5fTV9zaW5ndWxhcigpOyB9CisKKyAgLyoqIFxicmllZiBTYWZlIGl0ZXJhdG9yIHdyYXBwZXIuCisgICAqCisgICAqICBUaGUgY2xhc3MgdGVtcGxhdGUgJV9TYWZlX2l0ZXJhdG9yIGlzIGEgd3JhcHBlciBhcm91bmQgYW4KKyAgICogIGl0ZXJhdG9yIHRoYXQgdHJhY2tzIHRoZSBpdGVyYXRvcidzIG1vdmVtZW50IGFtb25nIHNlcXVlbmNlcyBhbmQKKyAgICogIGNoZWNrcyB0aGF0IG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSAic2FmZSIgaXRlcmF0b3IgYXJlCisgICAqICBsZWdhbC4gSW4gYWRkaXRpb25hbCB0byB0aGUgYmFzaWMgaXRlcmF0b3Igb3BlcmF0aW9ucyAod2hpY2ggYXJlCisgICAqICB2YWxpZGF0ZWQsIGFuZCB0aGVuIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyBpdGVyYXRvciksCisgICAqICAlX1NhZmVfaXRlcmF0b3IgaGFzIG1lbWJlciBmdW5jdGlvbnMgZm9yIGl0ZXJhdG9yIGludmFsaWRhdGlvbiwKKyAgICogIGF0dGFjaGluZy9kZXRhY2hpbmcgdGhlIGl0ZXJhdG9yIGZyb20gc2VxdWVuY2VzLCBhbmQgcXVlcnlpbmcKKyAgICogIHRoZSBpdGVyYXRvcidzIHN0YXRlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfaXRlcmF0b3IgOiBwdWJsaWMgX1NhZmVfaXRlcmF0b3JfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1NhZmVfaXRlcmF0b3IgX1NlbGY7CisKKyAgICAgIC8qKiBUaGUgcHJlY2lzaW9uIHRvIHdoaWNoIHdlIGNhbiBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4KKyAgICAgICAqICB0d28gaXRlcmF0b3JzLgorICAgICAgICovCisgICAgICBlbnVtIF9EaXN0YW5jZV9wcmVjaXNpb24KKwl7CisJICBfX2RwX2VxdWFsaXR5LCAvLzwgQ2FuIGNvbXBhcmUgaXRlcmF0b3IgZXF1YWxpdHksIG9ubHkKKwkgIF9fZHBfc2lnbiwgICAgIC8vPCBDYW4gZGV0ZXJtaW5lIGVxdWFsaXR5IGFuZCBvcmRlcmluZworCSAgX19kcF9leGFjdCAgICAgLy88IENhbiBkZXRlcm1pbmUgZGlzdGFuY2UgcHJlY2lzZWx5CisJfTsKKworICAgICAgLy8vIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgLy8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgY29uc3RhbnQgaXRlcmF0b3IuCisgICAgICBib29sCisgICAgICBfTV9jb25zdGFudCgpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCXJldHVybiBzdGQ6Ol9fYXJlX3NhbWU8Y29uc3RfaXRlcmF0b3IsIF9TYWZlX2l0ZXJhdG9yPjo6X192YWx1ZTsKKyAgICAgIH0KKworICAgICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+IF9UcmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9JdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjp2YWx1ZV90eXBlICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9pbnRlciAgICAgICAgICAgcG9pbnRlcjsKKworICAgICAgLy8vIEBwb3N0IHRoZSBpdGVyYXRvciBpcyBzaW5ndWxhciBhbmQgdW5hdHRhY2hlZAorICAgICAgX1NhZmVfaXRlcmF0b3IoKSA6IF9NX2N1cnJlbnQoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU2FmZSBpdGVyYXRvciBjb25zdHJ1Y3Rpb24gZnJvbSBhbiB1bnNhZmUgaXRlcmF0b3IgYW5kCisgICAgICAgKiBpdHMgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogQHByZSBAcCBzZXEgaXMgbm90IE5VTEwKKyAgICAgICAqIEBwb3N0IHRoaXMgaXMgbm90IHNpbmd1bGFyCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yKGNvbnN0IF9JdGVyYXRvciYgX19pLCBjb25zdCBfU2VxdWVuY2UqIF9fc2VxKQorICAgICAgOiBfU2FmZV9pdGVyYXRvcl9iYXNlKF9fc2VxLCBfTV9jb25zdGFudCgpKSwgX01fY3VycmVudChfX2kpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgdGhpcy0+X01fc2luZ3VsYXIoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfaW5pdF9zaW5ndWxhcikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0aW9uLgorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvcihjb25zdCBfU2FmZV9pdGVyYXRvciYgX194KQorICAgICAgOiBfU2FmZV9pdGVyYXRvcl9iYXNlKF9feCwgX01fY29uc3RhbnQoKSksIF9NX2N1cnJlbnQoX194Ll9NX2N1cnJlbnQpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19pbml0X2NvcHlfc2luZ3VsYXIpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcihfX3gsICJvdGhlciIpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIENvbnZlcnRpbmcgY29uc3RydWN0b3IgZnJvbSBhIG11dGFibGUgaXRlcmF0b3IgdG8gYQorICAgICAgICogIGNvbnN0YW50IGl0ZXJhdG9yLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRhYmxlSXRlcmF0b3I+CisgICAgICAgIF9TYWZlX2l0ZXJhdG9yKAorICAgICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9NdXRhYmxlSXRlcmF0b3IsCisgICAgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwoc3RkOjpfX2FyZV9zYW1lPF9NdXRhYmxlSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1NlcXVlbmNlOjppdGVyYXRvcjo6aXRlcmF0b3JfdHlwZT46Ol9fdmFsdWUpLAorICAgICAgICAgICAgICAgICAgIF9TZXF1ZW5jZT46Ol9fdHlwZT4mIF9feCkKKwk6IF9TYWZlX2l0ZXJhdG9yX2Jhc2UoX194LCBfTV9jb25zdGFudCgpKSwgX01fY3VycmVudChfX3guYmFzZSgpKQorICAgICAgICB7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyBEUiA0MDguIElzIHZlY3RvcjxyZXZlcnNlX2l0ZXJhdG9yPGNoYXIqPiA+IGZvcmJpZGRlbj8KKwkgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCQl8fCBfX3guYmFzZSgpID09IF9JdGVyYXRvcigpLAorCQkJCV9NX21lc3NhZ2UoX19tc2dfaW5pdF9jb25zdF9zaW5ndWxhcikKKwkJCQkuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikKKwkJCQkuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGFzc2lnbm1lbnQuCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yJiBfX3gpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDQwOC4gSXMgdmVjdG9yPHJldmVyc2VfaXRlcmF0b3I8Y2hhcio+ID4gZm9yYmlkZGVuPworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSghX194Ll9NX3Npbmd1bGFyKCkKKwkJCSAgICAgIHx8IF9feC5fTV9jdXJyZW50ID09IF9JdGVyYXRvcigpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19jb3B5X3Npbmd1bGFyKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpCisJCQkgICAgICAuX01faXRlcmF0b3IoX194LCAib3RoZXIiKSk7CisJX01fY3VycmVudCA9IF9feC5fTV9jdXJyZW50OworCXRoaXMtPl9NX2F0dGFjaChfX3guX01fc2VxdWVuY2UpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIGRlcmVmZXJlbmNlLgorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgZGVyZWZlcmVuY2VhYmxlCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fZGVyZWZlcmVuY2VhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9kZXJlZikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcywgInRoaXMiKSk7CisJcmV0dXJuICpfTV9jdXJyZW50OworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgSXRlcmF0b3IgZGVyZWZlcmVuY2UuCisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZXJlZmVyZW5jZWFibGUKKyAgICAgICAqICBAdG9kbyBNYWtlIHRoaXMgY29ycmVjdCB3LnIudC4gaXRlcmF0b3JzIHRoYXQgcmV0dXJuIHByb3hpZXMKKyAgICAgICAqICBAdG9kbyBVc2UgYWRkcmVzc29mKCkgaW5zdGVhZCBvZiAmIG9wZXJhdG9yCisgICAgICAgKi8KKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZXJlZmVyZW5jZWFibGUoKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYmFkX2RlcmVmKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlyZXR1cm4gJipfTV9jdXJyZW50OworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gSW5wdXQgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHByZWluY3JlbWVudAorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgaW5jcmVtZW50YWJsZQorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9pbmNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9pbmMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCSsrX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBwb3N0aW5jcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBpbmNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01faW5jcmVtZW50YWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfaW5jKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlfU2FmZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJKytfTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tIEJpZGlyZWN0aW9uYWwgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEl0ZXJhdG9yIHByZWRlY3JlbWVudAorICAgICAgICogIEBwcmUgaXRlcmF0b3IgaXMgZGVjcmVtZW50YWJsZQorICAgICAgICovCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9kZWNyZW1lbnRhYmxlKCksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2JhZF9kZWMpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMsICJ0aGlzIikpOworCS0tX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBJdGVyYXRvciBwb3N0ZGVjcmVtZW50CisgICAgICAgKiAgQHByZSBpdGVyYXRvciBpcyBkZWNyZW1lbnRhYmxlCisgICAgICAgKi8KKyAgICAgIF9TYWZlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fZGVjcmVtZW50YWJsZSgpLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19iYWRfZGVjKQorCQkJICAgICAgLl9NX2l0ZXJhdG9yKCp0aGlzLCAidGhpcyIpKTsKKwlfU2FmZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJLS1fTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tIFJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IgcmVxdWlyZW1lbnRzIC0tLS0tLQorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1ZFUklGWSh0aGlzLT5fTV9jYW5fYWR2YW5jZShfX24pCisJCQkgICAgICAmJiB0aGlzLT5fTV9jYW5fYWR2YW5jZShfX24rMSksCisJCQkgICAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfc3Vic2NyaXB0X29vYikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcykuX01faW50ZWdlcihfX24pKTsKKworCXJldHVybiBfTV9jdXJyZW50W19fbl07CisgICAgICB9CisKKyAgICAgIF9TYWZlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19WRVJJRlkodGhpcy0+X01fY2FuX2FkdmFuY2UoX19uKSwKKwkJCSAgICAgIF9NX21lc3NhZ2UoX19tc2dfYWR2YW5jZV9vb2IpCisJCQkgICAgICAuX01faXRlcmF0b3IoKnRoaXMpLl9NX2ludGVnZXIoX19uKSk7CisJX01fY3VycmVudCArPSBfX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2FmZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9TYWZlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwlfX3RtcCArPSBfX247CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICBfU2FmZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLT0oY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfVkVSSUZZKHRoaXMtPl9NX2Nhbl9hZHZhbmNlKC1fX24pLAorCQkJICAgICAgX01fbWVzc2FnZShfX21zZ19yZXRyZWF0X29vYikKKwkJCSAgICAgIC5fTV9pdGVyYXRvcigqdGhpcykuX01faW50ZWdlcihfX24pKTsKKwlfTV9jdXJyZW50ICs9IC1fX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfU2FmZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9TYWZlX2l0ZXJhdG9yIF9fdG1wKCp0aGlzKTsKKwlfX3RtcCAtPSBfX247CisJcmV0dXJuIF9fdG1wOworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0gVXRpbGl0aWVzIC0tLS0tLQorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICAgKi8KKyAgICAgIF9JdGVyYXRvcgorICAgICAgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29udmVyc2lvbiB0byB1bmRlcmx5aW5nIG5vbi1kZWJ1ZyBpdGVyYXRvciB0byBhbGxvdworICAgICAgICogYmV0dGVyIGludGVyYWN0aW9uIHdpdGggbm9uLWRlYnVnIGNvbnRhaW5lcnMuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIF9JdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgLyoqIEF0dGFjaCBpdGVyYXRvciB0byB0aGUgZ2l2ZW4gc2VxdWVuY2UuICovCisgICAgICB2b2lkCisgICAgICBfTV9hdHRhY2goX1NhZmVfc2VxdWVuY2VfYmFzZSogX19zZXEpCisgICAgICB7CisJX1NhZmVfaXRlcmF0b3JfYmFzZTo6X01fYXR0YWNoKF9fc2VxLCBfTV9jb25zdGFudCgpKTsKKyAgICAgIH0KKworICAgICAgLyoqIExpa2V3aXNlLCBidXQgbm90IHRocmVhZC1zYWZlLiAqLworICAgICAgdm9pZAorICAgICAgX01fYXR0YWNoX3NpbmdsZShfU2FmZV9zZXF1ZW5jZV9iYXNlKiBfX3NlcSkKKyAgICAgIHsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlOjpfTV9hdHRhY2hfc2luZ2xlKF9fc2VxLCBfTV9jb25zdGFudCgpKTsKKyAgICAgIH0KKworICAgICAgLy8vIElzIHRoZSBpdGVyYXRvciBkZXJlZmVyZW5jZWFibGU/CisgICAgICBib29sCisgICAgICBfTV9kZXJlZmVyZW5jZWFibGUoKSBjb25zdAorICAgICAgeyByZXR1cm4gIXRoaXMtPl9NX3Npbmd1bGFyKCkgJiYgIV9NX2lzX2VuZCgpICYmICFfTV9pc19iZWZvcmVfYmVnaW4oKTsgfQorCisgICAgICAvLy8gSXMgdGhlIGl0ZXJhdG9yIGJlZm9yZSBhIGRlcmVmZXJlbmNlYWJsZSBvbmU/CisgICAgICBib29sCisgICAgICBfTV9iZWZvcmVfZGVyZWZlcmVuY2VhYmxlKCkgY29uc3QKKyAgICAgIHsKKwlfU2VsZiBfX2l0ID0gKnRoaXM7CisJcmV0dXJuIF9faXQuX01faW5jcmVtZW50YWJsZSgpICYmICgrK19faXQpLl9NX2RlcmVmZXJlbmNlYWJsZSgpOworICAgICAgfQorCisgICAgICAvLy8gSXMgdGhlIGl0ZXJhdG9yIGluY3JlbWVudGFibGU/CisgICAgICBib29sCisgICAgICBfTV9pbmNyZW1lbnRhYmxlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICF0aGlzLT5fTV9zaW5ndWxhcigpICYmICFfTV9pc19lbmQoKTsgfQorCisgICAgICAvLyBJcyB0aGUgaXRlcmF0b3IgZGVjcmVtZW50YWJsZT8KKyAgICAgIGJvb2wKKyAgICAgIF9NX2RlY3JlbWVudGFibGUoKSBjb25zdCB7IHJldHVybiAhX01fc2luZ3VsYXIoKSAmJiAhX01faXNfYmVnaW4oKTsgfQorCisgICAgICAvLyBDYW4gd2UgYWR2YW5jZSB0aGUgaXRlcmF0b3IgQHAgX19uIHN0ZXBzIChAcCBfX24gbWF5IGJlIG5lZ2F0aXZlKQorICAgICAgYm9vbAorICAgICAgX01fY2FuX2FkdmFuY2UoY29uc3QgZGlmZmVyZW5jZV90eXBlJiBfX24pIGNvbnN0OworCisgICAgICAvLyBJcyB0aGUgaXRlcmF0b3IgcmFuZ2UgWyp0aGlzLCBfX3JocykgdmFsaWQ/CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfT3RoZXI+CisgICAgICAgIGJvb2wKKyAgICAgICAgX01fdmFsaWRfcmFuZ2UoY29uc3QgX1NhZmVfaXRlcmF0b3I8X090aGVyLCBfU2VxdWVuY2U+JiBfX3JocykgY29uc3Q7CisKKyAgICAgIC8vIFRoZSBzZXF1ZW5jZSB0aGlzIGl0ZXJhdG9yIHJlZmVyZW5jZXMuCisgICAgICBjb25zdCBfU2VxdWVuY2UqCisgICAgICBfTV9nZXRfc2VxdWVuY2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgX1NlcXVlbmNlKj4oX01fc2VxdWVuY2UpOyB9CisKKyAgICAvKiogRGV0ZXJtaW5lIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBpdGVyYXRvcnMgd2l0aCBzb21lIGtub3duCisgICAgICoJcHJlY2lzaW9uLgorICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yMSwgdHlwZW5hbWUgX0l0ZXJhdG9yMj4KKyAgICAgIHN0YXRpYyBzdGQ6OnBhaXI8ZGlmZmVyZW5jZV90eXBlLCBfRGlzdGFuY2VfcHJlY2lzaW9uPgorICAgICAgX01fZ2V0X2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvcjEmIF9fbGhzLCBjb25zdCBfSXRlcmF0b3IyJiBfX3JocykKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3IxPjo6aXRlcmF0b3JfY2F0ZWdvcnkKKwkgIF9DYXRlZ29yeTsKKyAgICAgICAgcmV0dXJuIF9NX2dldF9kaXN0YW5jZShfX2xocywgX19yaHMsIF9DYXRlZ29yeSgpKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcjEsIHR5cGVuYW1lIF9JdGVyYXRvcjI+CisgICAgICBzdGF0aWMgc3RkOjpwYWlyPGRpZmZlcmVuY2VfdHlwZSwgX0Rpc3RhbmNlX3ByZWNpc2lvbj4KKyAgICAgIF9NX2dldF9kaXN0YW5jZShjb25zdCBfSXRlcmF0b3IxJiBfX2xocywgY29uc3QgX0l0ZXJhdG9yMiYgX19yaHMsCisJCSAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgICB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX3JocyAtIF9fbGhzLCBfX2RwX2V4YWN0KTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yMSwgdHlwZW5hbWUgX0l0ZXJhdG9yMj4KKyAgICAgIHN0YXRpYyBzdGQ6OnBhaXI8ZGlmZmVyZW5jZV90eXBlLCBfRGlzdGFuY2VfcHJlY2lzaW9uPgorICAgICAgX01fZ2V0X2Rpc3RhbmNlKGNvbnN0IF9JdGVyYXRvcjEmIF9fbGhzLCBjb25zdCBfSXRlcmF0b3IyJiBfX3JocywKKwkJICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpCisgICAgICB7IHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2xocyA9PSBfX3Jocz8gMCA6IDEsIF9fZHBfZXF1YWxpdHkpOyB9CisKKyAgICAgIC8vLyBJcyB0aGlzIGl0ZXJhdG9yIGVxdWFsIHRvIHRoZSBzZXF1ZW5jZSdzIGJlZ2luKCkgaXRlcmF0b3I/CisgICAgICBib29sIF9NX2lzX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJhc2UoKSA9PSBfTV9nZXRfc2VxdWVuY2UoKS0+X01fYmFzZSgpLmJlZ2luKCk7IH0KKworICAgICAgLy8vIElzIHRoaXMgaXRlcmF0b3IgZXF1YWwgdG8gdGhlIHNlcXVlbmNlJ3MgZW5kKCkgaXRlcmF0b3I/CisgICAgICBib29sIF9NX2lzX2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBiYXNlKCkgPT0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5lbmQoKTsgfQorCisgICAgICAvLy8gSXMgdGhpcyBpdGVyYXRvciBlcXVhbCB0byB0aGUgc2VxdWVuY2UncyBiZWZvcmVfYmVnaW4oKSBpdGVyYXRvciBpZgorICAgICAgLy8vIGFueT8KKyAgICAgIGJvb2wgX01faXNfYmVmb3JlX2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CZWZvcmVCZWdpbkhlbHBlcjxfU2VxdWVuY2U+OjpfTV9JcyhiYXNlKCksIF9NX2dldF9zZXF1ZW5jZSgpKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2NvbXBhcmVfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA9PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorICAgICAgICAgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX2NvbXBhcmVfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2NvbXBhcmVfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorICAgICAgICAgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfY29tcGFyZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfY29tcGFyZV9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA8IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA8IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19pdGVyX29yZGVyX2JhZCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX2xocy5fTV9jYW5fY29tcGFyZShfX3JocyksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19vcmRlcl9kaWZmZXJlbnQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICByZXR1cm4gX19saHMuYmFzZSgpIDw9IF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisgICAgICAgICAgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWSghIF9fbGhzLl9NX3Npbmd1bGFyKCkgJiYgISBfX3Jocy5fTV9zaW5ndWxhcigpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfaXRlcl9vcmRlcl9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfb3JkZXJfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fbGhzLAorICAgICAgICAgICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX2l0ZXJfb3JkZXJfYmFkKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fbGhzLl9NX2Nhbl9jb21wYXJlKF9fcmhzKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fbXNnX29yZGVyX2RpZmZlcmVudCkKKwkJCSAgICAuX01faXRlcmF0b3IoX19saHMsICJsaHMiKQorCQkJICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgPj0gX19yaHMuYmFzZSgpOworICAgIH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBEUjE3OSBub3Qgb25seSB0aGUgdmFyaW91cyBjb21wYXJpc29uCisgIC8vIG9wZXJhdG9ycyBidXQgYWxzbyBvcGVyYXRvci0gbXVzdCBhY2NlcHQgbWl4ZWQgaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IKKyAgLy8gcGFyYW1ldGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSB0eXBlbmFtZSBfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICBvcGVyYXRvci0oY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgY29uc3QgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKCEgX19saHMuX01fc2luZ3VsYXIoKSAmJiAhIF9fcmhzLl9NX3Npbmd1bGFyKCksCisJCQkgICAgX01fbWVzc2FnZShfX21zZ19kaXN0YW5jZV9iYWQpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAuX01faXRlcmF0b3IoX19yaHMsICJyaHMiKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgIF9NX21lc3NhZ2UoX19tc2dfZGlzdGFuY2VfZGlmZmVyZW50KQorCQkJICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgcmV0dXJuIF9fbGhzLmJhc2UoKSAtIF9fcmhzLmJhc2UoKTsKKyAgICB9CisKKyAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgICBpbmxpbmUgdHlwZW5hbWUgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+OjpkaWZmZXJlbmNlX3R5cGUKKyAgICAgb3BlcmF0b3ItKGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgIHsKKyAgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoISBfX2xocy5fTV9zaW5ndWxhcigpICYmICEgX19yaHMuX01fc2luZ3VsYXIoKSwKKwkJCSAgICAgX01fbWVzc2FnZShfX21zZ19kaXN0YW5jZV9iYWQpCisJCQkgICAgIC5fTV9pdGVyYXRvcihfX2xocywgImxocyIpCisJCQkgICAgIC5fTV9pdGVyYXRvcihfX3JocywgInJocyIpKTsKKyAgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19saHMuX01fY2FuX2NvbXBhcmUoX19yaHMpLAorCQkJICAgICBfTV9tZXNzYWdlKF9fbXNnX2Rpc3RhbmNlX2RpZmZlcmVudCkKKwkJCSAgICAgLl9NX2l0ZXJhdG9yKF9fbGhzLCAibGhzIikKKwkJCSAgICAgLl9NX2l0ZXJhdG9yKF9fcmhzLCAicmhzIikpOworICAgICAgIHJldHVybiBfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCk7CisgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+CisgICAgb3BlcmF0b3IrKHR5cGVuYW1lIF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvcixfU2VxdWVuY2U+OjpkaWZmZXJlbmNlX3R5cGUgX19uLAorCSAgICAgIGNvbnN0IF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19pKQorICAgIHsgcmV0dXJuIF9faSArIF9fbjsgfQorCisgIC8vIEhlbHBlciBzdHJ1Y3QgdG8gZGV0ZWN0IHJhbmRvbSBhY2Nlc3Mgc2FmZSBpdGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBzdHJ1Y3QgX19pc19zYWZlX3JhbmRvbV9pdGVyYXRvcgorICAgIHsKKyAgICAgIGVudW0geyBfX3ZhbHVlID0gMCB9OworICAgICAgdHlwZWRlZiBzdGQ6Ol9fZmFsc2VfdHlwZSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBzdHJ1Y3QgX19pc19zYWZlX3JhbmRvbV9pdGVyYXRvcjxfU2FmZV9pdGVyYXRvcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4gPgorICAgIDogc3RkOjpfX2FyZV9zYW1lPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6CisJCSAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5PgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3I+CisgICAgc3RydWN0IF9TaXRlcl9iYXNlCisgICAgOiBzdGQ6Ol9JdGVyX2Jhc2U8X0l0ZXJhdG9yLCBfX2lzX3NhZmVfcmFuZG9tX2l0ZXJhdG9yPF9JdGVyYXRvcj46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIC8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBiYXNlIGl0ZXJhdG9yIG9mIHJhbmRvbSBhY2Nlc3Mgc2FmZSBpdGVyYXRvcgorICAgICAgaW4gb3JkZXIgdG8gcmVkdWNlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiBkZWJ1ZyBtb2RlLiAgTGltaXRlZCB0byByYW5kb20KKyAgICAgIGFjY2VzcyBpdGVyYXRvciBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IGNhdGVnb3J5IGZvciB3aGljaCBpdCBpcyBwb3NzaWJsZQorICAgICAgdG8gY2hlY2sgZm9yIGNvcnJlY3QgaXRlcmF0b3JzIG9yZGVyIGluIHRoZSBfX3ZhbGlkX3JhbmdlIGZ1bmN0aW9uCisgICAgICB0aGFua3MgdG8gdGhlIDwgb3BlcmF0b3IuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX1NpdGVyX2Jhc2U8X0l0ZXJhdG9yPjo6aXRlcmF0b3JfdHlwZQorICAgIF9fYmFzZShfSXRlcmF0b3IgX19pdCkKKyAgICB7IHJldHVybiBfU2l0ZXJfYmFzZTxfSXRlcmF0b3I+OjpfU19iYXNlKF9faXQpOyB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci50Y2M+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zYWZlX2l0ZXJhdG9yLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2FmZV9pdGVyYXRvci50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyNjQwYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2FmZV9pdGVyYXRvci50Y2MKQEAgLTAsMCArMSwxMDYgQEAKKy8vIERlYnVnZ2luZyBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAob3V0IG9mIGxpbmUpIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfaXRlcmF0b3IudGNjCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TQUZFX0lURVJBVE9SX1RDQworI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TQUZFX0lURVJBVE9SX1RDQyAxCisKK25hbWVzcGFjZSBfX2dudV9kZWJ1ZworeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBib29sCisgICAgX1NhZmVfaXRlcmF0b3I8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+OjoKKyAgICBfTV9jYW5fYWR2YW5jZShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfZGVidWdfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnN0X2RlYnVnX2l0ZXJhdG9yOjppdGVyYXRvcl90eXBlIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBpZiAodGhpcy0+X01fc2luZ3VsYXIoKSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBpZiAoX19uID09IDApCisJcmV0dXJuIHRydWU7CisgICAgICBpZiAoX19uIDwgMCkKKwl7CisJICBjb25zdF9pdGVyYXRvciBfX2JlZ2luID0gX01fZ2V0X3NlcXVlbmNlKCktPl9NX2Jhc2UoKS5iZWdpbigpOworCSAgc3RkOjpwYWlyPGRpZmZlcmVuY2VfdHlwZSwgX0Rpc3RhbmNlX3ByZWNpc2lvbj4gX19kaXN0ID0KKwkgICAgdGhpcy0+X01fZ2V0X2Rpc3RhbmNlKF9fYmVnaW4sIGJhc2UoKSk7CisJICBib29sIF9fb2sgPSAgKChfX2Rpc3Quc2Vjb25kID09IF9fZHBfZXhhY3QgJiYgX19kaXN0LmZpcnN0ID49IC1fX24pCisJCQl8fCAoX19kaXN0LnNlY29uZCAhPSBfX2RwX2V4YWN0ICYmIF9fZGlzdC5maXJzdCA+IDApKTsKKwkgIHJldHVybiBfX29rOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdF9pdGVyYXRvciBfX2VuZCA9IF9NX2dldF9zZXF1ZW5jZSgpLT5fTV9iYXNlKCkuZW5kKCk7CisJICBzdGQ6OnBhaXI8ZGlmZmVyZW5jZV90eXBlLCBfRGlzdGFuY2VfcHJlY2lzaW9uPiBfX2Rpc3QgPQorCSAgICB0aGlzLT5fTV9nZXRfZGlzdGFuY2UoYmFzZSgpLCBfX2VuZCk7CisJICBib29sIF9fb2sgPSAoKF9fZGlzdC5zZWNvbmQgPT0gX19kcF9leGFjdCAmJiBfX2Rpc3QuZmlyc3QgPj0gX19uKQorCQkgICAgICAgfHwgKF9fZGlzdC5zZWNvbmQgIT0gX19kcF9leGFjdCAmJiBfX2Rpc3QuZmlyc3QgPiAwKSk7CisJICByZXR1cm4gX19vazsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdGhlcj4KKyAgICAgIGJvb2wKKyAgICAgIF9TYWZlX2l0ZXJhdG9yPF9JdGVyYXRvciwgX1NlcXVlbmNlPjo6CisgICAgICBfTV92YWxpZF9yYW5nZShjb25zdCBfU2FmZV9pdGVyYXRvcjxfT3RoZXIsIF9TZXF1ZW5jZT4mIF9fcmhzKSBjb25zdAorICAgICAgeworCWlmICghX01fY2FuX2NvbXBhcmUoX19yaHMpKQorCSAgcmV0dXJuIGZhbHNlOworCisJLyogRGV0ZXJtaW5lIGlmIHdlIGNhbiBvcmRlciB0aGUgaXRlcmF0b3JzIHdpdGhvdXQgdGhlIGhlbHAgb2YKKwkgICB0aGUgY29udGFpbmVyICovCisJc3RkOjpwYWlyPGRpZmZlcmVuY2VfdHlwZSwgX0Rpc3RhbmNlX3ByZWNpc2lvbj4gX19kaXN0ID0KKwkgIHRoaXMtPl9NX2dldF9kaXN0YW5jZShiYXNlKCksIF9fcmhzLmJhc2UoKSk7CisJc3dpdGNoIChfX2Rpc3Quc2Vjb25kKSB7CisJY2FzZSBfX2RwX2VxdWFsaXR5OgorCSAgaWYgKF9fZGlzdC5maXJzdCA9PSAwKQorCSAgICByZXR1cm4gdHJ1ZTsKKwkgIGJyZWFrOworCisJY2FzZSBfX2RwX3NpZ246CisJY2FzZSBfX2RwX2V4YWN0OgorCSAgcmV0dXJuIF9fZGlzdC5maXJzdCA+PSAwOworCX0KKworCS8qIFdlIGNhbiBvbmx5IHRlc3QgZm9yIGVxdWFsaXR5LCBidXQgY2hlY2sgaWYgb25lIG9mIHRoZQorCSAgIGl0ZXJhdG9ycyBpcyBhdCBhbiBleHRyZW1lLiAqLworCS8qIE9wdGltIGZvciBjbGFzc2ljIFtiZWdpbiwgaXQpIG9yIFtpdCwgZW5kKSByYW5nZXMsIGxpbWl0IGNoZWNrcworCSAqIHdoZW4gY29kZSBpcyB2YWxpZC4gKi8KKwlpZiAoX01faXNfYmVnaW4oKSB8fCBfX3Jocy5fTV9pc19lbmQoKSkKKwkgIHJldHVybiB0cnVlOworCWlmIChfTV9pc19lbmQoKSB8fCBfX3Jocy5fTV9pc19iZWdpbigpKQorCSAgcmV0dXJuIGZhbHNlOworCisJLy8gQXNzdW1lIHRoYXQgdGhpcyBpcyBhIHZhbGlkIHJhbmdlOyB3ZSBjYW4ndCBjaGVjayBhbnl0aGluZyBlbHNlCisJcmV0dXJuIHRydWU7CisgICAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zYWZlX3NlcXVlbmNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3NhZmVfc2VxdWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzFmNGMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zYWZlX3NlcXVlbmNlLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vIFNhZmUgc2VxdWVuY2UgaW1wbGVtZW50YXRpb24gIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NhZmVfc2VxdWVuY2UuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9ICisjZGVmaW5lIF9HTElCQ1hYX0RFQlVHX1NBRkVfU0VRVUVOQ0VfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGRlYnVnL21hY3Jvcy5oPgorI2luY2x1ZGUgPGRlYnVnL2Z1bmN0aW9ucy5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfYmFzZS5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgY2xhc3MgX1NhZmVfaXRlcmF0b3I7CisKKyAgLyoqIEEgc2ltcGxlIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkLWluCisgICAqICB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHN0b3JlZCB2YWx1ZS4gSXQgc2F2ZXMgdHlwaW5nIG92ZXIKKyAgICogIHVzaW5nIGJvdGggYmluZDFzdCBhbmQgbm90X2VxdWFsLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1R5cGU+CisgICAgY2xhc3MgX05vdF9lcXVhbF90bworICAgIHsKKyAgICAgIF9UeXBlIF9fdmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBfTm90X2VxdWFsX3RvKGNvbnN0IF9UeXBlJiBfX3YpIDogX192YWx1ZShfX3YpIHsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9UeXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ZhbHVlICE9IF9feDsgfQorICAgIH07CisKKyAgLyoqIEEgc2ltcGxlIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkLWluCisgICAqICB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgc3RvcmVkIHZhbHVlLiAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1R5cGU+CisgICAgY2xhc3MgX0VxdWFsX3RvCisgICAgeworICAgICAgX1R5cGUgX192YWx1ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IF9FcXVhbF90byhjb25zdCBfVHlwZSYgX192KSA6IF9fdmFsdWUoX192KSB7IH0KKworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfVHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gX192YWx1ZSA9PSBfX3g7IH0KKyAgICB9OworCisgIC8qKiBBIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBnaXZlbiByYW5kb20gYWNjZXNzCisgICAgICBpdGVyYXRvciBpcyBhdCBsZWFzdCBAYyBuIHN0ZXBzIGF3YXkgZnJvbSB0aGUgZ2l2ZW4gaXRlcmF0b3IuICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKyAgICBjbGFzcyBfQWZ0ZXJfbnRoX2Zyb20KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICBfSXRlcmF0b3IgX01fYmFzZTsKKyAgICAgIGRpZmZlcmVuY2VfdHlwZSBfTV9uOworCisgICAgcHVibGljOgorICAgICAgX0FmdGVyX250aF9mcm9tKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uLCBjb25zdCBfSXRlcmF0b3ImIF9fYmFzZSkKKyAgICAgIDogX01fYmFzZShfX2Jhc2UpLCBfTV9uKF9fbikgeyB9CisKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0l0ZXJhdG9yJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBfX3ggLSBfTV9iYXNlID49IF9NX247IH0KKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGEgQGEgc2FmZSBzZXF1ZW5jZSB0eXBlIHRoYXQKKyAgICogdHJhY2tzIGl0ZXJhdG9ycyB0aGF0IHJlZmVyZW5jZSBpdC4KKyAgICoKKyAgICogVGhlIGNsYXNzIHRlbXBsYXRlICVfU2FmZV9zZXF1ZW5jZSBzaW1wbGlmaWVzIHRoZSBjb25zdHJ1Y3Rpb24gb2YKKyAgICogQGEgc2FmZSBzZXF1ZW5jZXMgdGhhdCB0cmFjayB0aGUgaXRlcmF0b3JzIHRoYXQgcmVmZXJlbmNlIHRoZQorICAgKiBzZXF1ZW5jZSwgc28gdGhhdCB0aGUgaXRlcmF0b3JzIGFyZSBub3RpZmllZCBvZiBjaGFuZ2VzIGluIHRoZQorICAgKiBzZXF1ZW5jZSB0aGF0IG1heSBhZmZlY3QgdGhlaXIgb3BlcmF0aW9uLCBlLmcuLCBpZiB0aGUgY29udGFpbmVyCisgICAqIGludmFsaWRhdGVzIGl0cyBpdGVyYXRvcnMgb3IgaXMgZGVzdHJ1Y3RlZC4gVGhpcyBjbGFzcyB0ZW1wbGF0ZQorICAgKiBtYXkgb25seSBiZSB1c2VkIGJ5IGRlcml2aW5nIGZyb20gaXQgYW5kIHBhc3NpbmcgdGhlIG5hbWUgb2YgdGhlCisgICAqIGRlcml2ZWQgY2xhc3MgYXMgaXRzIHRlbXBsYXRlIHBhcmFtZXRlciB2aWEgdGhlIGN1cmlvdXNseQorICAgKiByZWN1cnJpbmcgdGVtcGxhdGUgcGF0dGVybi4gVGhlIGRlcml2ZWQgY2xhc3MgbXVzdCBoYXZlIEBjCisgICAqIGl0ZXJhdG9yIGFuZCBAY29uc3RfaXRlcmF0b3IgdHlwZXMgdGhhdCBhcmUgaW5zdGFudGlhdGlvbnMgb2YKKyAgICogY2xhc3MgdGVtcGxhdGUgX1NhZmVfaXRlcmF0b3IgZm9yIHRoaXMgc2VxdWVuY2UuIEl0ZXJhdG9ycyB3aWxsCisgICAqIHRoZW4gYmUgdHJhY2tlZCBhdXRvbWF0aWNhbGx5LgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGNsYXNzIF9TYWZlX3NlcXVlbmNlIDogcHVibGljIF9TYWZlX3NlcXVlbmNlX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLyoqIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMgQGMgeCB0aGF0IHJlZmVyZW5jZSB0aGlzIHNlcXVlbmNlLAorCSAgYXJlIG5vdCBzaW5ndWxhciwgYW5kIGZvciB3aGljaCBAYyBwcmVkKHgpIHJldHVybnMgQGMKKwkgIHRydWUuIEBjIHByZWQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIG5vcm1hbCBpdGVyYXRvcnMgbmVzdGVkCisJICBpbiB0aGUgc2FmZSBvbmVzLiAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnZhbGlkYXRlX2lmKF9QcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgLyoqIFRyYW5zZmVycyBhbGwgaXRlcmF0b3JzIEBjIHggdGhhdCByZWZlcmVuY2UgQGMgZnJvbSBzZXF1ZW5jZSwKKwkgIGFyZSBub3Qgc2luZ3VsYXIsIGFuZCBmb3Igd2hpY2ggQGMgcHJlZCh4KSByZXR1cm5zIEBjCisJICB0cnVlLiBAYyBwcmVkIHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBub3JtYWwgaXRlcmF0b3JzIG5lc3RlZAorCSAgaW4gdGhlIHNhZmUgb25lcy4gKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fdHJhbnNmZXJfZnJvbV9pZihfU2FmZV9zZXF1ZW5jZSYgX19mcm9tLCBfUHJlZGljYXRlIF9fcHJlZCk7CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X2RlYnVnCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYz4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3NhZmVfc2VxdWVuY2UudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjAyOTVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYwpAQCAtMCwwICsxLDE1MCBAQAorLy8gU2FmZSBzZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbiAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy9zYWZlX3NlcXVlbmNlLnRjYworICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0FGRV9TRVFVRU5DRV9UQ0MgMQorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QcmVkaWNhdGU+CisgICAgICB2b2lkCisgICAgICBfU2FmZV9zZXF1ZW5jZTxfU2VxdWVuY2U+OjoKKyAgICAgIF9NX2ludmFsaWRhdGVfaWYoX1ByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1NlcXVlbmNlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisJX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSh0aGlzLT5fTV9nZXRfbXV0ZXgoKSk7CisgICAgICAgIGZvciAoX1NhZmVfaXRlcmF0b3JfYmFzZSogX19pdGVyID0gX01faXRlcmF0b3JzOyBfX2l0ZXI7KQorCSAgeworCSAgICBpdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxpdGVyYXRvcio+KF9faXRlcik7CisJICAgIF9faXRlciA9IF9faXRlci0+X01fbmV4dDsKKwkgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJICAgICAgeworCQlfX3ZpY3RpbS0+X01faW52YWxpZGF0ZSgpOworCSAgICAgIH0KKwkgIH0KKworICAgICAgICBmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlcjIgPSBfTV9jb25zdF9pdGVyYXRvcnM7IF9faXRlcjI7KQorCSAgeworCSAgICBjb25zdF9pdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxjb25zdF9pdGVyYXRvcio+KF9faXRlcjIpOworCSAgICBfX2l0ZXIyID0gX19pdGVyMi0+X01fbmV4dDsKKwkgICAgaWYgKCFfX3ZpY3RpbS0+X01fc2luZ3VsYXIoKSAmJiBfX3ByZWQoX192aWN0aW0tPmJhc2UoKSkpCisJICAgICAgeworCQlfX3ZpY3RpbS0+X01faW52YWxpZGF0ZSgpOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ByZWRpY2F0ZT4KKyAgICAgIHZvaWQKKyAgICAgIF9TYWZlX3NlcXVlbmNlPF9TZXF1ZW5jZT46OgorICAgICAgX01fdHJhbnNmZXJfZnJvbV9pZihfU2FmZV9zZXF1ZW5jZSYgX19mcm9tLCBfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgIHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9TZXF1ZW5jZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKwlfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3RyYW5zZmVyZWRfaXRlcmF0b3JzID0gMDsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzID0gMDsKKwlfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2xhc3RfaXRlcmF0b3IgPSAwOworCV9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9fbGFzdF9jb25zdF9pdGVyYXRvciA9IDA7CisJeworCSAgLy8gV2UgbG9jayBfX2Zyb20gZmlyc3QgYW5kIGRldGFjaCBpdGVyYXRvcihzKSB0byB0cmFuc2ZlcgorCSAgX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeShfX2Zyb20uX01fZ2V0X211dGV4KCkpOworCisgICAgICAgICAgZm9yIChfU2FmZV9pdGVyYXRvcl9iYXNlKiBfX2l0ZXIgPSBfX2Zyb20uX01faXRlcmF0b3JzOyBfX2l0ZXI7KQorCSAgICB7CisJICAgICAgaXRlcmF0b3IqIF9fdmljdGltID0gc3RhdGljX2Nhc3Q8aXRlcmF0b3IqPihfX2l0ZXIpOworCSAgICAgIF9faXRlciA9IF9faXRlci0+X01fbmV4dDsKKwkgICAgICBpZiAoIV9fdmljdGltLT5fTV9zaW5ndWxhcigpICYmIF9fcHJlZChfX3ZpY3RpbS0+YmFzZSgpKSkKKwkJeworCQkgIF9fdmljdGltLT5fTV9kZXRhY2hfc2luZ2xlKCk7CisJCSAgaWYgKF9fdHJhbnNmZXJlZF9pdGVyYXRvcnMpCisJCSAgICB7CisJCSAgICAgIF9fdmljdGltLT5fTV9uZXh0ID0gX190cmFuc2ZlcmVkX2l0ZXJhdG9yczsKKwkJICAgICAgX190cmFuc2ZlcmVkX2l0ZXJhdG9ycy0+X01fcHJpb3IgPSBfX3ZpY3RpbTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBfX2xhc3RfaXRlcmF0b3IgPSBfX3ZpY3RpbTsKKwkJICBfX3ZpY3RpbS0+X01fc2VxdWVuY2UgPSB0aGlzOworCQkgIF9fdmljdGltLT5fTV92ZXJzaW9uID0gdGhpcy0+X01fdmVyc2lvbjsKKwkJICBfX3RyYW5zZmVyZWRfaXRlcmF0b3JzID0gX192aWN0aW07CisJCX0KKwkgICAgfQorCisJICBmb3IgKF9TYWZlX2l0ZXJhdG9yX2Jhc2UqIF9faXRlcjIgPSBfX2Zyb20uX01fY29uc3RfaXRlcmF0b3JzOworCQkgX19pdGVyMjspCisJICAgIHsKKwkgICAgICBjb25zdF9pdGVyYXRvciogX192aWN0aW0gPSBzdGF0aWNfY2FzdDxjb25zdF9pdGVyYXRvcio+KF9faXRlcjIpOworCSAgICAgIF9faXRlcjIgPSBfX2l0ZXIyLT5fTV9uZXh0OworCSAgICAgIGlmICghX192aWN0aW0tPl9NX3Npbmd1bGFyKCkgJiYgX19wcmVkKF9fdmljdGltLT5iYXNlKCkpKQorCQl7CisJCSAgX192aWN0aW0tPl9NX2RldGFjaF9zaW5nbGUoKTsKKwkJICBpZiAoX190cmFuc2ZlcmVkX2NvbnN0X2l0ZXJhdG9ycykKKwkJICAgIHsKKwkJICAgICAgX192aWN0aW0tPl9NX25leHQgPSBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzOworCQkgICAgICBfX3RyYW5zZmVyZWRfY29uc3RfaXRlcmF0b3JzLT5fTV9wcmlvciA9IF9fdmljdGltOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIF9fbGFzdF9jb25zdF9pdGVyYXRvciA9IF9fdmljdGltOworCQkgIF9fdmljdGltLT5fTV9zZXF1ZW5jZSA9IHRoaXM7CisJCSAgX192aWN0aW0tPl9NX3ZlcnNpb24gPSB0aGlzLT5fTV92ZXJzaW9uOworCQkgIF9fdHJhbnNmZXJlZF9jb25zdF9pdGVyYXRvcnMgPSBfX3ZpY3RpbTsKKwkJfQorCSAgICB9CisJfQorCisJLy8gTm93IHdlIGNhbiBsb2NrICp0aGlzIGFuZCBhZGQgdGhlIHRyYW5zZmVyZWQgaXRlcmF0b3JzIGlmIGFueQorCWlmIChfX2xhc3RfaXRlcmF0b3IgfHwgX19sYXN0X2NvbnN0X2l0ZXJhdG9yKQorCSAgeworCSAgICBfX2dudV9jeHg6Ol9fc2NvcGVkX2xvY2sgc2VudHJ5KHRoaXMtPl9NX2dldF9tdXRleCgpKTsKKwkgICAgaWYgKF9fbGFzdF9pdGVyYXRvcikKKwkgICAgICB7CisJCWlmICh0aGlzLT5fTV9pdGVyYXRvcnMpCisJCSAgeworCQkgICAgdGhpcy0+X01faXRlcmF0b3JzLT5fTV9wcmlvciA9IF9fbGFzdF9pdGVyYXRvcjsKKwkJICAgIF9fbGFzdF9pdGVyYXRvci0+X01fbmV4dCA9IHRoaXMtPl9NX2l0ZXJhdG9yczsKKwkJICB9CisJCXRoaXMtPl9NX2l0ZXJhdG9ycyA9IF9fdHJhbnNmZXJlZF9pdGVyYXRvcnM7CisJICAgICAgfQorCSAgICBpZiAoX19sYXN0X2NvbnN0X2l0ZXJhdG9yKQorCSAgICAgIHsKKwkJaWYgKHRoaXMtPl9NX2NvbnN0X2l0ZXJhdG9ycykKKwkJICB7CisJCSAgICB0aGlzLT5fTV9jb25zdF9pdGVyYXRvcnMtPl9NX3ByaW9yID0gX19sYXN0X2NvbnN0X2l0ZXJhdG9yOworCQkgICAgX19sYXN0X2NvbnN0X2l0ZXJhdG9yLT5fTV9uZXh0ID0gdGhpcy0+X01fY29uc3RfaXRlcmF0b3JzOworCQkgIH0KKwkJdGhpcy0+X01fY29uc3RfaXRlcmF0b3JzID0gX190cmFuc2ZlcmVkX2NvbnN0X2l0ZXJhdG9yczsKKwkgICAgICB9CisJICB9CisgICAgICB9Cit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmM2VhNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2V0CkBAIC0wLDAgKzEsMzcgQEAKKy8vIERlYnVnZ2luZyBzZXQvbXVsdGlzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA5CisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc2V0CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TRVQKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU0VUIDEKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxkZWJ1Zy9zZXQuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9tdWx0aXNldC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYTRjNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3NldC5oCkBAIC0wLDAgKzEsNDQ5IEBACisvLyBEZWJ1Z2dpbmcgc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3NldC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TRVRfSAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19TRVRfSCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KSAKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OnNldCB3aXRoIHNhZmV0eS9jaGVja2luZy9kZWJ1ZyBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3Mgc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnNldDxfS2V5LF9Db21wYXJlLF9BbGxvY2F0b3I+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTxzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjpzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8c2V0PiBfU2FmZV9iYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAga2V5X2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICB2YWx1ZV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLCBzZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgc2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjMuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgc2V0KGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCQkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwKKwkJX19jb21wLCBfX2EpIHsgfQorCisgICAgICBzZXQoY29uc3Qgc2V0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzZXQoc2V0JiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSksIF9TYWZlX2Jhc2UoKQorICAgICAgeyB0aGlzLT5fTV9zd2FwKF9feCk7IH0KKworICAgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSksIF9TYWZlX2Jhc2UoKSB7IH0KKyNlbmRpZgorCisgICAgICB+c2V0KCkgeyB9CisKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBzZXQmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICAgIC8vIGl0ZXJhdG9yczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gbW9kaWZpZXJzOgorICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3gpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKTsKKwlyZXR1cm4gc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksCisJCQkJCSBfX3Jlcy5zZWNvbmQpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCksIHRoaXMpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbiwgdmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBzdGQ6Om1vdmUoX194KSksCisJCQl0aGlzKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fcG9zaXRpb24uYmFzZSgpKSk7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0gPSBfQmFzZTo6ZmluZChfX3gpOworCWlmIChfX3ZpY3RpbSA9PSBfQmFzZTo6ZW5kKCkpCisgICAgICAgICAgcmV0dXJuIDA7CisJZWxzZQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICByZXR1cm4gMTsKKwkgIH0KKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCWZvciAoX0Jhc2VfY29uc3RfaXRlcmF0b3IgX192aWN0aW0gPSBfX2ZpcnN0LmJhc2UoKTsKKwkgICAgIF9fdmljdGltICE9IF9fbGFzdC5iYXNlKCk7ICsrX192aWN0aW0pCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX1ZFUklGWShfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCksCisJCQkJICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ192YWxpZF9yYW5nZSkKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2ZpcnN0LCAiZmlyc3QiKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fbGFzdCwgImxhc3QiKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICB9CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2l0ZXJhdG9yIF9fdmljdGltID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3ZpY3RpbSAhPSBfX2xhc3QuYmFzZSgpOyArK19fdmljdGltKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgfQorCV9CYXNlOjplcmFzZShfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChzZXQmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIC8vIG9ic2VydmVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjprZXlfY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjp2YWx1ZV9jb21wOworCisgICAgICAvLyBzZXQgb3BlcmF0aW9uczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpLCB0aGlzKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCksIHRoaXMpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSwgdGhpcyk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKyAgICAgICAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorICAgICAgICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9NX2Jhc2UoKS5lbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIHN3YXAoc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorCSBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnN3YXAoX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX2RlYnVnCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3N0cmluZyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDczZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3N0cmluZwpAQCAtMCwwICsxLDExMTMgQEAKKy8vIERlYnVnZ2luZyBzdHJpbmcgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvc3RyaW5nCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGRlYnVnIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9ERUJVR19TVFJJTkcKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfU1RSSU5HIDEKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2UgX19nbnVfZGVidWcKK3sKKyAgLy8vIENsYXNzIHN0ZDo6YmFzaWNfc3RyaW5nIHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX3N0cmluZworICAgIDogcHVibGljIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jYXRvcj4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsCisJCQkJCQkgICAgICBfQWxsb2NhdG9yPiA+CisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8YmFzaWNfc3RyaW5nPiAgICAgX1NhZmVfYmFzZTsKKworICBwdWJsaWM6CisgICAgLy8gdHlwZXM6CisgICAgdHlwZWRlZiBfVHJhaXRzCQkJCSAgICAgICB0cmFpdHNfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgICAgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJCSAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8dHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yLCBiYXNpY19zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8dHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmc+IGNvbnN0X2l0ZXJhdG9yOworCisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+ICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgdXNpbmcgX0Jhc2U6Om5wb3M7CisKKyAgICAvLyAyMS4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICBleHBsaWNpdCBiYXNpY19zdHJpbmcoY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsgfQorCisgICAgLy8gUHJvdmlkZXMgY29udmVyc2lvbiBmcm9tIGEgcmVsZWFzZS1tb2RlIHN0cmluZyB0byBhIGRlYnVnLW1vZGUgc3RyaW5nCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9CYXNlJiBfX2Jhc2UpIDogX0Jhc2UoX19iYXNlKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vIDQyLiBzdHJpbmcgY3RvcnMgc3BlY2lmeSB3cm9uZyBkZWZhdWx0IGFsbG9jYXRvcgorICAgIGJhc2ljX3N0cmluZyhjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIDogX0Jhc2UoX19zdHIsIDAsIF9CYXNlOjpucG9zLCBfX3N0ci5nZXRfYWxsb2NhdG9yKCkpLCBfU2FmZV9iYXNlKCkKKyAgICB7IH0KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA0Mi4gc3RyaW5nIGN0b3JzIHNwZWNpZnkgd3JvbmcgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICBzaXplX3R5cGUgX19uID0gX0Jhc2U6Om5wb3MsCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICA6IF9CYXNlKF9fc3RyLCBfX3BvcywgX19uLCBfX2EpCisgICAgeyB9CisKKyAgICBiYXNpY19zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICA6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3N0cmluZyhfX3MsIF9fbiksIF9fbiwgX19hKQorICAgIHsgfQorCisgICAgYmFzaWNfc3RyaW5nKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja19zdHJpbmcoX19zKSwgX19hKQorICAgIHsgdGhpcy0+YXNzaWduKF9fcyk7IH0KKworICAgIGJhc2ljX3N0cmluZyhzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLAorCQkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX24sIF9fYywgX19hKQorICAgIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmcoX0lucHV0SXRlcmF0b3IgX19iZWdpbiwgX0lucHV0SXRlcmF0b3IgX19lbmQsCisJCSAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2JlZ2luLAorCQkJCQkJCQkgICBfX2VuZCkpLAorCSAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19lbmQpLCBfX2EpCisgICAgICB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgYmFzaWNfc3RyaW5nKGJhc2ljX3N0cmluZyYmIF9fc3RyKQorICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fc3RyKSkKKyAgICB7IH0KKworICAgIGJhc2ljX3N0cmluZyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wsCisJCSBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgOiBfQmFzZShfX2wsIF9fYSkKKyAgICB7IH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgfmJhc2ljX3N0cmluZygpIHsgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgICpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX19zdHI7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3M7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcj0oX0NoYXJUIF9fYykKKyAgICB7CisgICAgICAqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9fYzsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3I9KGJhc2ljX3N0cmluZyYmIF9fc3RyKQorICAgIHsKKyAgICAgICpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gc3RkOjptb3ZlKF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X0NoYXJUPiBfX2wpCisgICAgeworICAgICAgKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX2w7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgLy8gMjEuMy4yIGl0ZXJhdG9yczoKKyAgICBpdGVyYXRvcgorICAgIGJlZ2luKCkKKyAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgYmVnaW4oKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgaXRlcmF0b3IKKyAgICBlbmQoKQorICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kKCkgY29uc3QKKyAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgcmJlZ2luKCkKKyAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgIHJiZWdpbigpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICByZW5kKCkKKyAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgcmVuZCgpIGNvbnN0CisgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgLy8gMjEuMy4zIGNhcGFjaXR5OgorICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgIHVzaW5nIF9CYXNlOjpsZW5ndGg7CisgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgdm9pZAorICAgIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9CYXNlOjpyZXNpemUoX19uLCBfX2MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgcmVzaXplKHNpemVfdHlwZSBfX24pCisgICAgeyB0aGlzLT5yZXNpemUoX19uLCBfQ2hhclQoKSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgdXNpbmcgX0Jhc2U6OnNocmlua190b19maXQ7CisjZW5kaWYKKworICAgIHVzaW5nIF9CYXNlOjpjYXBhY2l0eTsKKyAgICB1c2luZyBfQmFzZTo6cmVzZXJ2ZTsKKworICAgIHZvaWQKKyAgICBjbGVhcigpCisgICAgeworICAgICAgX0Jhc2U6OmNsZWFyKCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgIH0KKworICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKworICAgIC8vIDIxLjMuNCBlbGVtZW50IGFjY2VzczoKKyAgICBjb25zdF9yZWZlcmVuY2UKKyAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX19wb3MgPD0gdGhpcy0+c2l6ZSgpLAorCQkJICAgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3N1YnNjcmlwdF9vb2IpCisJCQkgICAgLl9NX3NlcXVlbmNlKCp0aGlzLCAidGhpcyIpCisJCQkgICAgLl9NX2ludGVnZXIoX19wb3MsICJfX3BvcyIpCisJCQkgICAgLl9NX2ludGVnZXIodGhpcy0+c2l6ZSgpLCAic2l6ZSIpKTsKKyAgICAgIHJldHVybiBfTV9iYXNlKClbX19wb3NdOworICAgIH0KKworICAgIHJlZmVyZW5jZQorICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fcG9zKQorICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworICAgICAgX19nbGliY3h4X2NoZWNrX3N1YnNjcmlwdChfX3Bvcyk7CisjZWxzZQorICAgICAgLy8gYXMgYW4gZXh0ZW5zaW9uIHYzIGFsbG93cyBzW3Muc2l6ZSgpXSB3aGVuIHMgaXMgbm9uLWNvbnN0LgorICAgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fcG9zIDw9IHRoaXMtPnNpemUoKSwKKwkJCSAgICBfTV9tZXNzYWdlKF9fZ251X2RlYnVnOjpfX21zZ19zdWJzY3JpcHRfb29iKQorCQkJICAgIC5fTV9zZXF1ZW5jZSgqdGhpcywgInRoaXMiKQorCQkJICAgIC5fTV9pbnRlZ2VyKF9fcG9zLCAiX19wb3MiKQorCQkJICAgIC5fTV9pbnRlZ2VyKHRoaXMtPnNpemUoKSwgInNpemUiKSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBfTV9iYXNlKClbX19wb3NdOworICAgIH0KKworICAgIHVzaW5nIF9CYXNlOjphdDsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgdXNpbmcgX0Jhc2U6OmZyb250OworICAgIHVzaW5nIF9CYXNlOjpiYWNrOworI2VuZGlmCisKKyAgICAvLyAyMS4zLjUgbW9kaWZpZXJzOgorICAgIGJhc2ljX3N0cmluZyYKKyAgICBvcGVyYXRvcis9KGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgeworICAgICAgX01fYmFzZSgpICs9IF9fc3RyOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3IrPShjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICBfTV9iYXNlKCkgKz0gX19zOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgb3BlcmF0b3IrPShfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9NX2Jhc2UoKSArPSBfX2M7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgYmFzaWNfc3RyaW5nJgorICAgIG9wZXJhdG9yKz0oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgIHsKKyAgICAgIF9NX2Jhc2UoKSArPSBfX2w7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIF9CYXNlOjphcHBlbmQoX19zdHIpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXBwZW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fc3RyLCBfX3BvcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFwcGVuZChjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fcyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhcHBlbmQoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6YXBwZW5kKF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICBhcHBlbmQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCV9CYXNlOjphcHBlbmQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJICAgICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAvLyA3LiBzdHJpbmcgY2xhdXNlIG1pbm9yIHByb2JsZW1zCisgICAgdm9pZAorICAgIHB1c2hfYmFjayhfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIF9CYXNlOjpwdXNoX2JhY2soX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9feCkKKyAgICB7CisgICAgICBfQmFzZTo6YXNzaWduKF9feCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihiYXNpY19zdHJpbmcmJiBfX3gpCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihzdGQ6Om1vdmUoX194KSk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGFzc2lnbihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihfX3N0ciwgX19wb3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgX0Jhc2U6OmFzc2lnbihfX3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgX0Jhc2U6OmFzc2lnbihfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX0Jhc2U6OmFzc2lnbihfX24sIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgYmFzaWNfc3RyaW5nJgorICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlfQmFzZTo6YXNzaWduKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCSAgICAgIF9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgIGJhc2ljX3N0cmluZyYKKyAgICBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgIHsKKyAgICAgIF9CYXNlOjphc3NpZ24oX19sKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpCisgICAgeworICAgICAgX0Jhc2U6Omluc2VydChfX3BvczEsIF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIGluc2VydChzaXplX3R5cGUgX19wb3MxLCBjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLAorCSAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX0Jhc2U6Omluc2VydChfX3BvczEsIF9fc3RyLCBfX3BvczIsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zLCBfX24sIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yCisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcCk7CisgICAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fcC5iYXNlKCksIF9fYyk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcCk7CisgICAgICBfQmFzZTo6aW5zZXJ0KF9fcC5iYXNlKCksIF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydF9yYW5nZShfX3AsIF9fZmlyc3QsIF9fbGFzdCk7CisJX0Jhc2U6Omluc2VydChfX3AuYmFzZSgpLCBfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJCSAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB2b2lkCisgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wKTsKKyAgICAgIF9CYXNlOjppbnNlcnQoX19wLmJhc2UoKSwgX19sKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgfQorI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgZXJhc2Uoc2l6ZV90eXBlIF9fcG9zID0gMCwgc2l6ZV90eXBlIF9fbiA9IF9CYXNlOjpucG9zKQorICAgIHsKKyAgICAgIF9CYXNlOjplcmFzZShfX3BvcywgX19uKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgaXRlcmF0b3IKKyAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZShfX3Bvc2l0aW9uKTsKKyAgICAgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICB9CisKKyAgICBpdGVyYXRvcgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorICAgICAgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJCQkgICAgICAgX19sYXN0LmJhc2UoKSk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX3BvczEsIF9fbjEsIF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJICAgIHNpemVfdHlwZSBfX3BvczIsIHNpemVfdHlwZSBfX24yKQorICAgIHsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zMSwgX19uMSwgX19zdHIsIF9fcG9zMiwgX19uMik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICBzaXplX3R5cGUgX19uMikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nX2xlbihfX3MsIF9fbjIpOworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgX19uMik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9fcG9zLCBfX24xLCBfX3MpOworICAgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcmCisgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX3BvcywgX19uMSwgX19uMiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0cikKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX2kxLmJhc2UoKSwgX19pMi5iYXNlKCksIF9fc3RyKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9faTEsIF9faTIpOworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgX0Jhc2U6OnJlcGxhY2UoX19pMS5iYXNlKCksIF9faTIuYmFzZSgpLCBfX3MsIF9fbik7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGJhc2ljX3N0cmluZyYKKyAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIGNvbnN0IF9DaGFyVCogX19zKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2kxLCBfX2kyKTsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIF9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19zKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgYmFzaWNfc3RyaW5nJgorICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisgICAgICBfQmFzZTo6cmVwbGFjZShfX2kxLmJhc2UoKSwgX19pMi5iYXNlKCksIF9fbiwgX19jKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBiYXNpY19zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgX0lucHV0SXRlcmF0b3IgX19qMSwgX0lucHV0SXRlcmF0b3IgX19qMikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19pMSwgX19pMik7CisJX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fajEsIF9fajIpOworCV9CYXNlOjpyZXBsYWNlKF9faTEuYmFzZSgpLCBfX2kyLmJhc2UoKSwgX19qMSwgX19qMik7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgYmFzaWNfc3RyaW5nJiByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJCQkgICAgc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2kxLCBfX2kyKTsKKwlfQmFzZTo6cmVwbGFjZShfX2kxLmJhc2UoKSwgX19pMi5iYXNlKCksIF9fbCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAgIHNpemVfdHlwZQorICAgIGNvcHkoX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24sIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgcmV0dXJuIF9CYXNlOjpjb3B5KF9fcywgX19uLCBfX3Bvcyk7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAoYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3gpCisgICAgeworICAgICAgX0Jhc2U6OnN3YXAoX194KTsKKyAgICAgIHRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICBfX3guX01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICB9CisKKyAgICAvLyAyMS4zLjYgc3RyaW5nIG9wZXJhdGlvbnM6CisgICAgY29uc3QgX0NoYXJUKgorICAgIGNfc3RyKCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcmVzID0gX0Jhc2U6OmNfc3RyKCk7CisgICAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICAgIGNvbnN0IF9DaGFyVCoKKyAgICBkYXRhKCkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcmVzID0gX0Jhc2U6OmRhdGEoKTsKKyAgICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmQoX19zdHIsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZChfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgcmZpbmQoY29uc3QgYmFzaWNfc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OnJmaW5kKF9fc3RyLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgcmV0dXJuIF9CYXNlOjpyZmluZChfX3MsIF9fcG9zLCBfX24pOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OnJmaW5kKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdAorICAgIHsgcmV0dXJuIF9CYXNlOjpyZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9maXJzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X29mKF9fc3RyLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9vZihfX3MsIF9fcG9zKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfb2YoX19jLCBfX3Bvcyk7IH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCAKKwkJIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfb2YoX19zdHIsIF9fcG9zKTsgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IF9CYXNlOjpucG9zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19zKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X29mKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X29mKF9fYywgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBiYXNpY19zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgIHsgcmV0dXJuIF9CYXNlOjpmaW5kX2ZpcnN0X25vdF9vZihfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHJldHVybiBfQmFzZTo6ZmluZF9maXJzdF9ub3Rfb2YoX19zLCBfX3BvcywgX19uKTsKKyAgICB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfZmlyc3Rfbm90X29mKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfZmlyc3Rfbm90X29mKF9fYywgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJCQkJICBzaXplX3R5cGUgX19wb3MgPSBfQmFzZTo6bnBvcykgY29uc3QKKyAgICB7IHJldHVybiBfQmFzZTo6ZmluZF9sYXN0X25vdF9vZihfX3N0ciwgX19wb3MpOyB9CisKKyAgICBzaXplX3R5cGUKKyAgICBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MsIF9fbik7CisgICAgfQorCisgICAgc2l6ZV90eXBlCisgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3MpOworICAgICAgcmV0dXJuIF9CYXNlOjpmaW5kX2xhc3Rfbm90X29mKF9fcywgX19wb3MpOworICAgIH0KKworICAgIHNpemVfdHlwZQorICAgIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmZpbmRfbGFzdF9ub3Rfb2YoX19jLCBfX3Bvcyk7IH0KKworICAgIGJhc2ljX3N0cmluZworICAgIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gX0Jhc2U6Om5wb3MpIGNvbnN0CisgICAgeyByZXR1cm4gYmFzaWNfc3RyaW5nKF9CYXNlOjpzdWJzdHIoX19wb3MsIF9fbikpOyB9CisKKyAgICBpbnQKKyAgICBjb21wYXJlKGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19zdHIpOyB9CisKKyAgICBpbnQKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLAorCQkgIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3N0cik7IH0KKworICAgIGludAorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IGJhc2ljX3N0cmluZyYgX19zdHIsCisJICAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeyByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3N0ciwgX19wb3MyLCBfX24yKTsgfQorCisgICAgaW50CisgICAgY29tcGFyZShjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19zKTsKKyAgICB9CisKKyAgICAvLyAgX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgIC8vICA1LiBzdHJpbmc6OmNvbXBhcmUgc3BlY2lmaWNhdGlvbiBxdWVzdGlvbmFibGUKKyAgICBpbnQKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2hlY2tfc3RyaW5nKF9fcyk7CisgICAgICByZXR1cm4gX0Jhc2U6OmNvbXBhcmUoX19wb3MxLCBfX24xLCBfX3MpOworICAgIH0KKworICAgIC8vICBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgLy8gIDUuIHN0cmluZzo6Y29tcGFyZSBzcGVjaWZpY2F0aW9uIHF1ZXN0aW9uYWJsZQorICAgIGludAorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZ19sZW4oX19zLCBfX24yKTsKKyAgICAgIHJldHVybiBfQmFzZTo6Y29tcGFyZShfX3BvczEsIF9fbjEsIF9fcywgX19uMik7CisgICAgfQorCisgICAgX0Jhc2UmCisgICAgX01fYmFzZSgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBjb25zdCBfQmFzZSYKKyAgICBfTV9iYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIHVzaW5nIF9TYWZlX2Jhc2U6Ol9NX2ludmFsaWRhdGVfYWxsOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+CisgICAgb3BlcmF0b3IrKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4oX19saHMpICs9IF9fcmhzOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4KKyAgICBvcGVyYXRvcisoY29uc3QgX0NoYXJUKiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19saHMpOworICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPihfX2xocykgKz0gX19yaHM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+CisgICAgb3BlcmF0b3IrKF9DaGFyVCBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPigxLCBfX2xocykgKz0gX19yaHM7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPgorICAgIG9wZXJhdG9yKyhjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+KF9fbGhzKSArPSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4KKyAgICBvcGVyYXRvcisoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBfQ2hhclQgX19yaHMpCisgICAgeyByZXR1cm4gYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+KF9fbGhzKSArPSBfX3JoczsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19saHMpOworICAgICAgcmV0dXJuIF9fbGhzID09IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgIT0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPCBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19saHMpOworICAgICAgcmV0dXJuIF9fbGhzIDw9IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfQ2hhclQqIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jaGVja19zdHJpbmcoX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3JoczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPj0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX2xocyk7CisgICAgICByZXR1cm4gX19saHMgPiBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULF9UcmFpdHMsX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeworICAgICAgX19nbGliY3h4X2NoZWNrX3N0cmluZyhfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHM7CisgICAgfQorCisgIC8vIDIxLjMuNy44OgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19saHMsCisJIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2NhdG9yPiYgX19zdHIpCisgICAgeyByZXR1cm4gX19vcyA8PCBfX3N0ci5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19zdHIpCisgICAgeworICAgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19yZXMgPSBfX2lzID4+IF9fc3RyLl9NX2Jhc2UoKTsKKyAgICAgIF9fc3RyLl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICByZXR1cm4gX19yZXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULF9UcmFpdHM+JgorICAgIGdldGxpbmUoc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19pcywKKwkgICAgYmFzaWNfc3RyaW5nPF9DaGFyVCxfVHJhaXRzLF9BbGxvY2F0b3I+JiBfX3N0ciwgX0NoYXJUIF9fZGVsaW0pCisgICAgeworICAgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19yZXMgPSBnZXRsaW5lKF9faXMsCisJCQkJCQkJICBfX3N0ci5fTV9iYXNlKCksCisJCQkJCQkJX19kZWxpbSk7CisgICAgICBfX3N0ci5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgcmV0dXJuIF9fcmVzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYKKyAgICBnZXRsaW5lKHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsX1RyYWl0cz4mIF9faXMsCisJICAgIGJhc2ljX3N0cmluZzxfQ2hhclQsX1RyYWl0cyxfQWxsb2NhdG9yPiYgX19zdHIpCisgICAgeworICAgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiYgX19yZXMgPSBnZXRsaW5lKF9faXMsCisJCQkJCQkJICBfX3N0ci5fTV9iYXNlKCkpOworICAgICAgX19zdHIuX01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIHJldHVybiBfX3JlczsKKyAgICB9CisKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcj4gICAgc3RyaW5nOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdHlwZWRlZiBiYXNpY19zdHJpbmc8d2NoYXJfdD4gd3N0cmluZzsKKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBfX2dudV9kZWJ1ZworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvdW5vcmRlcmVkX21hcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvdW5vcmRlcmVkX21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2IxZTljCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWJ1Zy91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsNjI2IEBACisvLyBEZWJ1Z2dpbmcgdW5vcmRlcmVkX21hcC91bm9yZGVyZWRfbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZGVidWcvdW5vcmRlcmVkX21hcAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBkZWJ1ZyBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVCVUdfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19VTk9SREVSRURfTUFQIDEKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxkZWJ1Zy9zYWZlX3NlcXVlbmNlLmg+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9pdGVyYXRvci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX2RlYnVnCit7CisgIC8vLyBDbGFzcyBzdGQ6OnVub3JkZXJlZF9tYXAgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9LZXk+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwKKwkJCQkJCSAgICAgICBfUHJlZCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLAorCQkJCQkgICAgX1ByZWQsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTx1bm9yZGVyZWRfbWFwPiBfU2FmZV9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX21hcD4gaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9jb25zdF9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbWFwPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCAKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLCAKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLCAKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19uLAorCQlfX2hmLCBfX2VxbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwKGNvbnN0IHVub3JkZXJlZF9tYXAmIF9feCkgCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgdW5vcmRlcmVkX21hcChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAodW5vcmRlcmVkX21hcCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbWFwJiYgX194KQorICAgICAgeworICAgCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tYXAmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCV9TYWZlX2Jhc2U6Ol9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yIAorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIC8vIGxvY2FsIHZlcnNpb25zCisgICAgICB1c2luZyBfQmFzZTo6YmVnaW47CisgICAgICB1c2luZyBfQmFzZTo6ZW5kOworICAgICAgdXNpbmcgX0Jhc2U6OmNiZWdpbjsKKyAgICAgIHVzaW5nIF9CYXNlOjpjZW5kOworCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19vYmopOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgX19vYmopLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfUGFpciwKKwkJCQkJCSAgdmFsdWVfdHlwZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX29iaikKKyAgICAgICAgeworCSAgc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBib29sPiBfX3JlcyA9CisJICAgIF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIF9QYWlyJiYgX19vYmopCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9faGludC5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKSwKKwkJCSAgdGhpcyk7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6Omluc2VydChfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXQoMCk7CisJX0Jhc2VfaXRlcmF0b3IgX192aWN0aW0oX0Jhc2U6OmZpbmQoX19rZXkpKTsKKwlpZiAoX192aWN0aW0gIT0gX0Jhc2U6OmVuZCgpKQorCSAgeworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3ZpY3RpbSkpOworCSAgICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgICBfX3JldCA9IDE7CisJICB9CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2UoX19pdCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX19pdC5iYXNlKCkpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9faXQuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2l0KQorICAgICAgeyByZXR1cm4gZXJhc2UoY29uc3RfaXRlcmF0b3IoX19pdCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJZm9yIChfQmFzZV9jb25zdF9pdGVyYXRvciBfX3RtcCA9IF9fZmlyc3QuYmFzZSgpOworCSAgICAgX190bXAgIT0gX19sYXN0LmJhc2UoKTsgKytfX3RtcCkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfVkVSSUZZKF9fdG1wICE9IF9CYXNlOjplbmQoKSwKKwkJCQkgIF9NX21lc3NhZ2UoX19nbnVfZGVidWc6Ol9fbXNnX3ZhbGlkX3JhbmdlKQorCQkJCSAgLl9NX2l0ZXJhdG9yKF9fZmlyc3QsICJmaXJzdCIpCisJCQkJICAuX01faXRlcmF0b3IoX19sYXN0LCAibGFzdCIpKTsKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9pZihfRXF1YWwoX190bXApKTsKKwkgIH0KKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCSAgICAgX19sYXN0LmJhc2UoKSksIHRoaXMpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ludmFsaWRhdGVfYWxsKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9fZ251X2RlYnVnOjpfTm90X2VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfTm90X2VxdWFsOworCXRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX05vdF9lcXVhbChfQmFzZTo6ZW5kKCkpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisKKyAgLy8vIENsYXNzIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwIHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLAorCQkJCQkJX1ByZWQsIF9BbGxvYz4sCisgICAgICBwdWJsaWMgX19nbnVfZGVidWc6Ol9TYWZlX3NlcXVlbmNlPHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLAorCQkJCQkJCSAgICBfUHJlZCwgX0FsbG9jPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsCisJCQkJCQkgX1ByZWQsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTx1bm9yZGVyZWRfbXVsdGltYXA+IF9TYWZlX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X0VxdWFsX3RvPF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfRXF1YWw7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcjxfQmFzZV9pdGVyYXRvciwKKwkJCQkJICB1bm9yZGVyZWRfbXVsdGltYXA+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX211bHRpbWFwPiBjb25zdF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLCAKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9CYXNlKF9fZ251X2RlYnVnOjpfX2Jhc2UoX19nbnVfZGVidWc6Ol9fY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwKKwkJCQkJCQkJICAgICBfX2xhc3QpKSwKKwkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpLCBfX24sCisJCV9faGYsIF9fZXFsLCBfX2EpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmIF9feCkgCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IF9CYXNlJiBfX3gpIAorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCh1bm9yZGVyZWRfbXVsdGltYXAmJiBfX3gpIAorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkJIHNpemVfdHlwZSBfX24gPSAwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9tdWx0aW1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCWNsZWFyKCk7CisJc3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tdWx0aW1hcCYgX194KQorICAgICAgeworCV9CYXNlOjpzd2FwKF9feCk7CisJX1NhZmVfYmFzZTo6X01fc3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IgCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgLy8gbG9jYWwgdmVyc2lvbnMKKyAgICAgIHVzaW5nIF9CYXNlOjpiZWdpbjsKKyAgICAgIHVzaW5nIF9CYXNlOjplbmQ7CisgICAgICB1c2luZyBfQmFzZTo6Y2JlZ2luOworICAgICAgdXNpbmcgX0Jhc2U6OmNlbmQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fb2JqKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBfX29iaiksIHRoaXMpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX29iaikKKyAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fb2JqKSksIHRoaXMpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisJaXRlcmF0b3IKKwlpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBfUGFpciYmIF9fb2JqKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwkgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9faGludC5iYXNlKCksCisJCQkJCXN0ZDo6Zm9yd2FyZDxfUGFpcj4oX19vYmopKSwKKwkJCSAgdGhpcyk7CisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6Omluc2VydChfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwl9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXQoMCk7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19wYWlyID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcGFpci5maXJzdDsgX192aWN0aW0gIT0gX19wYWlyLnNlY29uZDspCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSsrKTsKKwkgICAgKytfX3JldDsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX2l0KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX2l0LmJhc2UoKSkpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19pdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3RtcCkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJICAgICBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3Vub3JkZXJlZF9zZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3Vub3JkZXJlZF9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyMWEzYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvdW5vcmRlcmVkX3NldApAQCAtMCwwICsxLDYwNCBAQAorLy8gRGVidWdnaW5nIHVub3JkZXJlZF9zZXQvdW5vcmRlcmVkX211bHRpc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlYnVnL3Vub3JkZXJlZF9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1VOT1JERVJFRF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfREVCVUdfVU5PUkRFUkVEX1NFVCAxCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjp1bm9yZGVyZWRfc2V0IHdpdGggc2FmZXR5L2NoZWNraW5nL2RlYnVnIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9IYXNoID0gc3RkOjpoYXNoPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9WYWx1ZT4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX3NldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjp1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTx1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsCisJCQkJCQkgICAgICAgX1ByZWQsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwKKwkJCQkJICAgIF9QcmVkLCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8dW5vcmRlcmVkX3NldD4gX1NhZmVfYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2RlYnVnOjpfRXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9FcXVhbDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9zZXQ+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX3NldD4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwgCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fbiwKKwkJX19oZiwgX19lcWwsIF9fYSksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgdW5vcmRlcmVkX3NldChjb25zdCB1bm9yZGVyZWRfc2V0JiBfX3gpIAorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQoY29uc3QgX0Jhc2UmIF9feCkgCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSB7IH0KKworICAgICAgdW5vcmRlcmVkX3NldCh1bm9yZGVyZWRfc2V0JiYgX194KSAKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCSAgICBzaXplX3R5cGUgX19uID0gMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9zZXQmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9zZXQmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCV9TYWZlX2Jhc2U6Ol9NX3N3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yIAorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIC8vIGxvY2FsIHZlcnNpb25zCisgICAgICB1c2luZyBfQmFzZTo6YmVnaW47CisgICAgICB1c2luZyBfQmFzZTo6ZW5kOworICAgICAgdXNpbmcgX0Jhc2U6OmNiZWdpbjsKKyAgICAgIHVzaW5nIF9CYXNlOjpjZW5kOworCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJdHlwZWRlZiBzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcGFpcl90eXBlOworCV9fcGFpcl90eXBlIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2hpbnQsIGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBfX29iaiksIHRoaXMpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9fb2JqKQorICAgICAgeworCXR5cGVkZWYgc3RkOjpwYWlyPHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciwgYm9vbD4gX19wYWlyX3R5cGU7CisJX19wYWlyX3R5cGUgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX29iaikpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCwgdGhpcyksIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCB2YWx1ZV90eXBlJiYgX19vYmopCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2luc2VydChfX2hpbnQpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9faGludC5iYXNlKCksIHN0ZDo6bW92ZShfX29iaikpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfX2dsaWJjeHhfY2hlY2tfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwkgIF9CYXNlOjppbnNlcnQoX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSk7CisJfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9fa2V5KSwgdGhpcyk7IH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwl0eXBlZGVmIHN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcGFpcl90eXBlOworCV9fcGFpcl90eXBlIF9fcmVzID0gX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvciwgY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7CisJc3RkOjpwYWlyPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLCBfQmFzZV9jb25zdF9pdGVyYXRvcj4KKwkgIF9fcmVzID0gX0Jhc2U6OmVxdWFsX3JhbmdlKF9fa2V5KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QsIHRoaXMpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kLCB0aGlzKSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeworCXNpemVfdHlwZSBfX3JldCgwKTsKKwlfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbShfQmFzZTo6ZmluZChfX2tleSkpOworCWlmIChfX3ZpY3RpbSAhPSBfQmFzZTo6ZW5kKCkpCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICAgIF9fcmV0ID0gMTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX2l0KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX2l0LmJhc2UoKSkpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19pdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3RtcCkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJICAgICBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKworICAvLy8gQ2xhc3Mgc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQgd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0hhc2ggPSBzdGQ6Omhhc2g8X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfUHJlZCA9IHN0ZDo6ZXF1YWxfdG88X1ZhbHVlPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGlzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+LAorICAgICAgcHVibGljIF9fZ251X2RlYnVnOjpfU2FmZV9zZXF1ZW5jZTx1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwKKwkJCQkJCQkgICAgX1ByZWQsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLAorCQkJCQkJIF9QcmVkLCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8dW5vcmRlcmVkX211bHRpc2V0PiBfU2FmZV9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfaXRlcmF0b3IsCisJCQkJCSAgdW5vcmRlcmVkX211bHRpc2V0PiBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2NvbnN0X2l0ZXJhdG9yLAorCQkJCQkgIHVub3JkZXJlZF9tdWx0aXNldD4gY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkJICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwgCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksIAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZ251X2RlYnVnOjpfX2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsCisJCQkJCQkJCSAgICAgX19sYXN0KSksCisJCV9fZ251X2RlYnVnOjpfX2Jhc2UoX19sYXN0KSwgX19uLAorCQlfX2hmLCBfX2VxbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JiBfX3gpIAorICAgICAgOiBfQmFzZShfX3gpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChjb25zdCBfQmFzZSYgX194KSAKKyAgICAgIDogX0Jhc2UoX194KSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQodW5vcmRlcmVkX211bHRpc2V0JiYgX194KSAKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpLCBfU2FmZV9iYXNlKCkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSwgX1NhZmVfYmFzZSgpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX211bHRpc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGlzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisgICAgICAgIC8vIE5COiBEUiA2NzUuCisJY2xlYXIoKTsKKwlzd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0JiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnN3YXAoX194KTsKKwlfU2FmZV9iYXNlOjpfTV9zd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsKKwlfQmFzZTo6Y2xlYXIoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOyB9CisKKyAgICAgIC8vIGxvY2FsIHZlcnNpb25zCisgICAgICB1c2luZyBfQmFzZTo6YmVnaW47CisgICAgICB1c2luZyBfQmFzZTo6ZW5kOworICAgICAgdXNpbmcgX0Jhc2U6OmNiZWdpbjsKKyAgICAgIHVzaW5nIF9CYXNlOjpjZW5kOworCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX29iaiksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19oaW50LCBjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9faGludCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19oaW50LmJhc2UoKSwgX19vYmopLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX19vYmopCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX29iaikpLCB0aGlzKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faGludCwgdmFsdWVfdHlwZSYmIF9fb2JqKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19oaW50KTsKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX2hpbnQuYmFzZSgpLCBzdGQ6Om1vdmUoX19vYmopKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgX19nbGliY3h4X2NoZWNrX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisJICBfQmFzZTo6aW5zZXJ0KF9fZ251X2RlYnVnOjpfX2Jhc2UoX19maXJzdCksCisJCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCkpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX19rZXkpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX2tleSksIHRoaXMpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7CisJdHlwZWRlZiBzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3BhaXJfdHlwZTsKKwlfX3BhaXJfdHlwZSBfX3JlcyA9IF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+CisJICBfX3JlcyA9IF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0LCB0aGlzKSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCwgdGhpcykpOworICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXQoMCk7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19wYWlyID0KKwkgIF9CYXNlOjplcXVhbF9yYW5nZShfX2tleSk7CisJZm9yIChfQmFzZV9pdGVyYXRvciBfX3ZpY3RpbSA9IF9fcGFpci5maXJzdDsgX192aWN0aW0gIT0gX19wYWlyLnNlY29uZDspCisJICB7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfaWYoX0VxdWFsKF9fdmljdGltKSk7CisJICAgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSsrKTsKKwkgICAgKytfX3JldDsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2l0KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19lcmFzZShfX2l0KTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX2l0LmJhc2UoKSkpOworCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19pdC5iYXNlKCkpLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IHJldHVybiBlcmFzZShjb25zdF9pdGVyYXRvcihfX2l0KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfZXJhc2VfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKwlmb3IgKF9CYXNlX2NvbnN0X2l0ZXJhdG9yIF9fdG1wID0gX19maXJzdC5iYXNlKCk7CisJICAgICBfX3RtcCAhPSBfX2xhc3QuYmFzZSgpOyArK19fdG1wKQorCSAgeworCSAgICBfR0xJQkNYWF9ERUJVR19WRVJJRlkoX190bXAgIT0gX0Jhc2U6OmVuZCgpLAorCQkJCSAgX01fbWVzc2FnZShfX2dudV9kZWJ1Zzo6X19tc2dfdmFsaWRfcmFuZ2UpCisJCQkJICAuX01faXRlcmF0b3IoX19maXJzdCwgImZpcnN0IikKKwkJCQkgIC5fTV9pdGVyYXRvcihfX2xhc3QsICJsYXN0IikpOworCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbChfX3RtcCkpOworCSAgfQorCXJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisJCQkJICAgICBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW52YWxpZGF0ZV9hbGwoKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9Ob3RfZXF1YWxfdG88X0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9Ob3RfZXF1YWw7CisJdGhpcy0+X01faW52YWxpZGF0ZV9pZihfTm90X2VxdWFsKF9CYXNlOjplbmQoKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3ZlY3RvciBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVidWcvdmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjFmODgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlYnVnL3ZlY3RvcgpAQCAtMCwwICsxLDYxMCBAQAorLy8gRGVidWdnaW5nIHZlY3RvciBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBkZWJ1Zy92ZWN0b3IKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0RFQlVHX1ZFQ1RPUgorI2RlZmluZSBfR0xJQkNYWF9ERUJVR19WRUNUT1IgMQorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZGVidWcvc2FmZV9zZXF1ZW5jZS5oPgorI2luY2x1ZGUgPGRlYnVnL3NhZmVfaXRlcmF0b3IuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19kZWJ1ZworeworICAvLy8gQ2xhc3Mgc3RkOjp2ZWN0b3Igd2l0aCBzYWZldHkvY2hlY2tpbmcvZGVidWcgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIHZlY3RvcgorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiwKKyAgICAgIHB1YmxpYyBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8dmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnZlY3RvcjxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfc2VxdWVuY2U8dmVjdG9yPiAgICAgICAgICAgICAgX1NhZmVfYmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9FcXVhbF90bzxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0VxdWFsOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPF9CYXNlX2l0ZXJhdG9yLHZlY3Rvcj4KKyAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8X0Jhc2VfY29uc3RfaXRlcmF0b3IsdmVjdG9yPgorICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4yLjQuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3Rvcihjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSksIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkoMCkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pLCBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KF9fbikgeyB9CisKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX24pIHsgfQorI2Vsc2UKKyAgICAgIGV4cGxpY2l0CisgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX24pIHsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICAgIDogX0Jhc2UoX19nbnVfZGVidWc6Ol9fYmFzZShfX2dudV9kZWJ1Zzo6X19jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LAorCQkJCQkJCQkgICAgIF9fbGFzdCkpLAorCQlfX2dudV9kZWJ1Zzo6X19iYXNlKF9fbGFzdCksIF9fYSksCisJICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KDApCisgICAgICAgIHsgX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsgfQorCisgICAgICB2ZWN0b3IoY29uc3QgdmVjdG9yJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX3guc2l6ZSgpKSB7IH0KKworICAgICAgLy8vIENvbnN0cnVjdGlvbiBmcm9tIGEgcmVsZWFzZS1tb2RlIHZlY3RvcgorICAgICAgdmVjdG9yKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCksIF9TYWZlX2Jhc2UoKSwgX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX3guc2l6ZSgpKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSksIF9TYWZlX2Jhc2UoKSwKKwlfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KHRoaXMtPnNpemUoKSkKKyAgICAgIHsKKwl0aGlzLT5fTV9zd2FwKF9feCk7CisJX194Ll9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSAwOworICAgICAgfQorCisgICAgICB2ZWN0b3IoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2EpLCBfU2FmZV9iYXNlKCksCisJX01fZ3VhcmFudGVlZF9jYXBhY2l0eShfX2wuc2l6ZSgpKSB7IH0KKyNlbmRpZgorCisgICAgICB+dmVjdG9yKCkgeyB9CisKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9feDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPSh2ZWN0b3ImJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwljbGVhcigpOworCXN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZlY3RvciYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9fbDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCSAgX0Jhc2U6OmFzc2lnbihfX2dudV9kZWJ1Zzo6X19iYXNlKF9fZmlyc3QpLAorCQkJX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCX0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX191KQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19uLCBfX3UpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX2wpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjQuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbihfX3N6KTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCV9CYXNlOjpyZXNpemUoX19zeik7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJX01fdXBkYXRlX2d1YXJhbnRlZWRfY2FwYWNpdHkoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKwlib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbihfX3N6KTsKKwlpZiAoX19zeiA8IHRoaXMtPnNpemUoKSkKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fc3opOworCV9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgX1RwIF9fYyA9IF9UcCgpKQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKF9fc3opOworCWlmIChfX3N6IDwgdGhpcy0+c2l6ZSgpKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19zeik7CisJX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworCWlmIChfX3JlYWxsb2MpCisJICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisgICAgICB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB1c2luZyBfQmFzZTo6c2hyaW5rX3RvX2ZpdDsKKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGNhcGFjaXR5KCkgY29uc3QKKyAgICAgIHsKKyNpZmRlZiBfR0xJQkNYWF9ERUJVR19QRURBTlRJQworCXJldHVybiBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5OworI2Vsc2UKKwlyZXR1cm4gX0Jhc2U6OmNhcGFjaXR5KCk7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworCisgICAgICB2b2lkCisgICAgICByZXNlcnZlKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJYm9vbCBfX3JlYWxsb2MgPSBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24oX19uKTsKKwlfQmFzZTo6cmVzZXJ2ZShfX24pOworCWlmIChfX24gPiBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5KQorCSAgX01fZ3VhcmFudGVlZF9jYXBhY2l0eSA9IF9fbjsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKyAgICAgIH0KKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfc3Vic2NyaXB0KF9fbik7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6ZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX25vbmVtcHR5KCk7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19ub25lbXB0eSgpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyBEUiA0NjQuIFN1Z2dlc3Rpb24gZm9yIG5ldyBtZW1iZXIgZnVuY3Rpb25zIGluIHN0YW5kYXJkIGNvbnRhaW5lcnMuCisgICAgICB1c2luZyBfQmFzZTo6ZGF0YTsKKworICAgICAgLy8gMjMuMi40LjMgbW9kaWZpZXJzOgorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KQorICAgICAgeworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIDEpOworCV9CYXNlOjpwdXNoX2JhY2soX194KTsKKwlpZiAoX19yZWFsbG9jKQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwlfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCA9IF9UcD4KKyAgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwhc3RkOjpfX2FyZV9zYW1lPF9VcCwgYm9vbD46Ol9fdmFsdWUsCisJCQkJCXZvaWQ+OjpfX3R5cGUKKyAgICAgICAgcHVzaF9iYWNrKF9UcCYmIF9feCkKKwl7IGVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgZW1wbGFjZV9iYWNrKF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIGJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIDEpOworCSAgX0Jhc2U6OmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCSAgaWYgKF9fcmVhbGxvYykKKwkgICAgdGhpcy0+X01faW52YWxpZGF0ZV9hbGwoKTsKKwkgIF9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfbm9uZW1wdHkoKTsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9FcXVhbCgtLV9CYXNlOjplbmQoKSkpOworCV9CYXNlOjpwb3BfYmFjaygpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBlbXBsYWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJICBib29sIF9fcmVhbGxvYyA9IF9NX3JlcXVpcmVzX3JlYWxsb2NhdGlvbih0aGlzLT5zaXplKCkgKyAxKTsKKwkgIGRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fcG9zaXRpb24uYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJICBfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplbXBsYWNlKF9fcG9zaXRpb24uYmFzZSgpLAorCQkJCQkJc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKwkgIGlmIChfX3JlYWxsb2MpCisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJICBlbHNlCisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwkgIF9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJICByZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9fZ2xpYmN4eF9jaGVja19pbnNlcnQoX19wb3NpdGlvbik7CisJYm9vbCBfX3JlYWxsb2MgPSBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24odGhpcy0+c2l6ZSgpICsgMSk7CisJZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZV9pdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9feCk7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJZWxzZQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19vZmZzZXQpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXAgPSBfVHA+CisgICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8IXN0ZDo6X19hcmVfc2FtZTxfVXAsIGJvb2w+OjpfX3ZhbHVlLAorCQkJCQlpdGVyYXRvcj46Ol9fdHlwZQorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgICB7IHJldHVybiBlbXBsYWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IHRoaXMtPmluc2VydChfX3Bvc2l0aW9uLCBfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKwlfX2dsaWJjeHhfY2hlY2tfaW5zZXJ0KF9fcG9zaXRpb24pOworCWJvb2wgX19yZWFsbG9jID0gX01fcmVxdWlyZXNfcmVhbGxvY2F0aW9uKHRoaXMtPnNpemUoKSArIF9fbik7CisJZGlmZmVyZW5jZV90eXBlIF9fb2Zmc2V0ID0gX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisJaWYgKF9fcmVhbGxvYykKKwkgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisJZWxzZQorCSAgdGhpcy0+X01faW52YWxpZGF0ZV9hZnRlcl9udGgoX19vZmZzZXQpOworCV9NX3VwZGF0ZV9ndWFyYW50ZWVkX2NhcGFjaXR5KCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9jaGVja19pbnNlcnRfcmFuZ2UoX19wb3NpdGlvbiwgX19maXJzdCwgX19sYXN0KTsKKworCSAgLyogSGFyZCB0byBndWVzcyBpZiBpbnZhbGlkYXRpb24gd2lsbCBvY2N1ciwgYmVjYXVzZSBfX2xhc3QKKwkgICAgIC0gX19maXJzdCBjYW4ndCBiZSBjYWxjdWxhdGVkIGluIGFsbCBjYXNlcywgc28gd2UganVzdAorCSAgICAgcHVudCBoZXJlIGJ5IGNoZWNraW5nIGlmIGl0IGRpZCBvY2N1ci4gKi8KKwkgIF9CYXNlX2l0ZXJhdG9yIF9fb2xkX2JlZ2luID0gX01fYmFzZSgpLmJlZ2luKCk7CisJICBkaWZmZXJlbmNlX3R5cGUgX19vZmZzZXQgPSBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpOworCSAgX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX19nbnVfZGVidWc6Ol9fYmFzZShfX2ZpcnN0KSwKKwkJCQkJICAgX19nbnVfZGVidWc6Ol9fYmFzZShfX2xhc3QpKTsKKworCSAgaWYgKF9NX2Jhc2UoKS5iZWdpbigpICE9IF9fb2xkX2JlZ2luKQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FsbCgpOworCSAgZWxzZQorCSAgICB0aGlzLT5fTV9pbnZhbGlkYXRlX2FmdGVyX250aChfX29mZnNldCk7CisJICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpOworCX0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX19nbGliY3h4X2NoZWNrX2VyYXNlKF9fcG9zaXRpb24pOworCWRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fcG9zaXRpb24uYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJX0Jhc2VfaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbi5iYXNlKCkpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCS8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkvLyAxNTEuIGNhbid0IGN1cnJlbnRseSBjbGVhcigpIGVtcHR5IGNvbnRhaW5lcgorCV9fZ2xpYmN4eF9jaGVja19lcmFzZV9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisJaWYgKF9fZmlyc3QuYmFzZSgpICE9IF9fbGFzdC5iYXNlKCkpCisJICB7CisJICAgIGRpZmZlcmVuY2VfdHlwZSBfX29mZnNldCA9IF9fZmlyc3QuYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCk7CisJICAgIF9CYXNlX2l0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVyYXNlKF9fZmlyc3QuYmFzZSgpLAorCQkJCQkJX19sYXN0LmJhc2UoKSk7CisJICAgIHRoaXMtPl9NX2ludmFsaWRhdGVfYWZ0ZXJfbnRoKF9fb2Zmc2V0KTsKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKwkgIH0KKwllbHNlCisJICByZXR1cm4gX19maXJzdDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh2ZWN0b3ImIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworCXRoaXMtPl9NX3N3YXAoX194KTsKKyAgICAgICAgc3RkOjpzd2FwKF9NX2d1YXJhbnRlZWRfY2FwYWNpdHksIF9feC5fTV9ndWFyYW50ZWVkX2NhcGFjaXR5KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworCV9CYXNlOjpjbGVhcigpOworCXRoaXMtPl9NX2ludmFsaWRhdGVfYWxsKCk7CisgICAgICAgIF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkgPSAwOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5OworCisgICAgICBib29sCisgICAgICBfTV9yZXF1aXJlc19yZWFsbG9jYXRpb24oc2l6ZV90eXBlIF9fZWxlbWVudHMpCisgICAgICB7IHJldHVybiBfX2VsZW1lbnRzID4gdGhpcy0+Y2FwYWNpdHkoKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV91cGRhdGVfZ3VhcmFudGVlZF9jYXBhY2l0eSgpCisgICAgICB7CisJaWYgKHRoaXMtPnNpemUoKSA+IF9NX2d1YXJhbnRlZWRfY2FwYWNpdHkpCisJICBfTV9ndWFyYW50ZWVkX2NhcGFjaXR5ID0gdGhpcy0+c2l6ZSgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnZhbGlkYXRlX2FmdGVyX250aChkaWZmZXJlbmNlX3R5cGUgX19uKQorICAgICAgeworCXR5cGVkZWYgX19nbnVfZGVidWc6Ol9BZnRlcl9udGhfZnJvbTxfQmFzZV9jb25zdF9pdGVyYXRvcj4gX0FmdGVyX250aDsKKwl0aGlzLT5fTV9pbnZhbGlkYXRlX2lmKF9BZnRlcl9udGgoX19uLCBfQmFzZTo6YmVnaW4oKSkpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fZGVidWcKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHZlY3Rvcjxib29sPi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCBoYXNoPF9fZGVidWc6OnZlY3Rvcjxib29sLCBfQWxsb2M+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19kZWJ1Zzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZGVidWc6OnZlY3Rvcjxib29sLCBfQWxsb2M+JiBfX2IpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Omhhc2g8X0dMSUJDWFhfU1REX0M6OnZlY3Rvcjxib29sLCBfQWxsb2M+PigpCisJICAoX19iLl9NX2Jhc2UoKSk7IH0KKyAgICB9OworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVjaW1hbC9kZWNpbWFsIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWNpbWFsL2RlY2ltYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1YjgxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVjaW1hbC9kZWNpbWFsCkBAIC0wLDAgKzEsNDg1IEBACisvLyA8ZGVjaW1hbD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlY2ltYWwvZGVjaW1hbAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8gSVNPL0lFQyBUUiAyNDczMyAKKy8vIFdyaXR0ZW4gYnkgSmFuaXMgSm9obnNvbiA8amFuaXMxODdAdXMuaWJtLmNvbT4KKworI2lmbmRlZiBfR0xJQkNYWF9ERUNJTUFMCisjZGVmaW5lIF9HTElCQ1hYX0RFQ0lNQUwgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCisjaWZuZGVmIF9HTElCQ1hYX1VTRV9ERUNJTUFMX0ZMT0FUCisjZXJyb3IgVGhpcyBmaWxlIHJlcXVpcmVzIGNvbXBpbGVyIGFuZCBsaWJyYXJ5IHN1cHBvcnQgZm9yIElTTy9JRUMgVFIgMjQ3MzMgXAordGhhdCBpcyBjdXJyZW50bHkgbm90IGF2YWlsYWJsZS4KKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKKyAgLyoqCisgICAgKiBAZGVmZ3JvdXAgZGVjaW1hbCBEZWNpbWFsIEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMKKyAgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAgKgorICAgICogQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBkZWNpbWFsIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCisgICAgKiBAeworICAgICovCisKKyAgLyoqIEBuYW1lc3BhY2Ugc3RkOjpkZWNpbWFsCisgICAgKiBAYnJpZWYgSVNPL0lFQyBUUiAyNDczMyBEZWNpbWFsIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCisgICAgKi8KK25hbWVzcGFjZSBkZWNpbWFsCit7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgY2xhc3MgZGVjaW1hbDMyOworICBjbGFzcyBkZWNpbWFsNjQ7CisgIGNsYXNzIGRlY2ltYWwxMjg7CisKKyAgLy8gMy4yLjUgIEluaXRpYWxpemF0aW9uIGZyb20gY29lZmZpY2llbnQgYW5kIGV4cG9uZW50LgorICBzdGF0aWMgZGVjaW1hbDMyIG1ha2VfZGVjaW1hbDMyKGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHApOworICBzdGF0aWMgZGVjaW1hbDMyIG1ha2VfZGVjaW1hbDMyKHVuc2lnbmVkIGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHApOworICBzdGF0aWMgZGVjaW1hbDY0IG1ha2VfZGVjaW1hbDY0KGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHApOworICBzdGF0aWMgZGVjaW1hbDY0IG1ha2VfZGVjaW1hbDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBfX2NvZWZmLCBpbnQgX19leHApOworICBzdGF0aWMgZGVjaW1hbDEyOCBtYWtlX2RlY2ltYWwxMjgobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cCk7CisgIHN0YXRpYyBkZWNpbWFsMTI4IG1ha2VfZGVjaW1hbDEyOCh1bnNpZ25lZCBsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwKTsKKworICAvLy8gTm9uLWNvbmZvcm1pbmcgZXh0ZW5zaW9uOiBDb252ZXJzaW9uIHRvIGludGVncmFsIHR5cGUuCisgIGxvbmcgbG9uZyBkZWNpbWFsMzJfdG9fbG9uZ19sb25nKGRlY2ltYWwzMiBfX2QpOworICBsb25nIGxvbmcgZGVjaW1hbDY0X3RvX2xvbmdfbG9uZyhkZWNpbWFsNjQgX19kKTsKKyAgbG9uZyBsb25nIGRlY2ltYWwxMjhfdG9fbG9uZ19sb25nKGRlY2ltYWwxMjggX19kKTsKKyAgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWwzMiBfX2QpOworICBsb25nIGxvbmcgZGVjaW1hbF90b19sb25nX2xvbmcoZGVjaW1hbDY0IF9fZCk7CisgIGxvbmcgbG9uZyBkZWNpbWFsX3RvX2xvbmdfbG9uZyhkZWNpbWFsMTI4IF9fZCk7CisKKyAgLy8gMy4yLjYgIENvbnZlcnNpb24gdG8gZ2VuZXJpYyBmbG9hdGluZy1wb2ludCB0eXBlLgorICBmbG9hdCBkZWNpbWFsMzJfdG9fZmxvYXQoZGVjaW1hbDMyIF9fZCk7CisgIGZsb2F0IGRlY2ltYWw2NF90b19mbG9hdChkZWNpbWFsNjQgX19kKTsKKyAgZmxvYXQgZGVjaW1hbDEyOF90b19mbG9hdChkZWNpbWFsMTI4IF9fZCk7CisgIGZsb2F0IGRlY2ltYWxfdG9fZmxvYXQoZGVjaW1hbDMyIF9fZCk7CisgIGZsb2F0IGRlY2ltYWxfdG9fZmxvYXQoZGVjaW1hbDY0IF9fZCk7CisgIGZsb2F0IGRlY2ltYWxfdG9fZmxvYXQoZGVjaW1hbDEyOCBfX2QpOworCisgIGRvdWJsZSBkZWNpbWFsMzJfdG9fZG91YmxlKGRlY2ltYWwzMiBfX2QpOworICBkb3VibGUgZGVjaW1hbDY0X3RvX2RvdWJsZShkZWNpbWFsNjQgX19kKTsKKyAgZG91YmxlIGRlY2ltYWwxMjhfdG9fZG91YmxlKGRlY2ltYWwxMjggX19kKTsKKyAgZG91YmxlIGRlY2ltYWxfdG9fZG91YmxlKGRlY2ltYWwzMiBfX2QpOworICBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDY0IF9fZCk7CisgIGRvdWJsZSBkZWNpbWFsX3RvX2RvdWJsZShkZWNpbWFsMTI4IF9fZCk7CisKKyAgbG9uZyBkb3VibGUgZGVjaW1hbDMyX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwzMiBfX2QpOworICBsb25nIGRvdWJsZSBkZWNpbWFsNjRfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDY0IF9fZCk7CisgIGxvbmcgZG91YmxlIGRlY2ltYWwxMjhfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDEyOCBfX2QpOworICBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwzMiBfX2QpOworICBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWw2NCBfX2QpOworICBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwxMjggX19kKTsKKworICAvLyAzLjIuNyAgVW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisgIGRlY2ltYWwzMiAgb3BlcmF0b3IrKGRlY2ltYWwzMiBfX3Jocyk7CisgIGRlY2ltYWw2NCAgb3BlcmF0b3IrKGRlY2ltYWw2NCBfX3Jocyk7CisgIGRlY2ltYWwxMjggb3BlcmF0b3IrKGRlY2ltYWwxMjggX19yaHMpOworICBkZWNpbWFsMzIgIG9wZXJhdG9yLShkZWNpbWFsMzIgX19yaHMpOworICBkZWNpbWFsNjQgIG9wZXJhdG9yLShkZWNpbWFsNjQgX19yaHMpOworICBkZWNpbWFsMTI4IG9wZXJhdG9yLShkZWNpbWFsMTI4IF9fcmhzKTsKKworICAvLyAzLjIuOCAgQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0b3JzLgorI2RlZmluZSBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQyhfT3AsIF9UMSwgX1QyLCBfVDMpCVwKKyAgX1QxIG9wZXJhdG9yIF9PcChfVDIgX19saHMsIF9UMyBfX3Jocyk7CisjZGVmaW5lIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKF9PcCwgX1RwKQkJXAorICBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgaW50IF9fcmhzKTsJCQlcCisgIF9UcCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCB1bnNpZ25lZCBpbnQgX19yaHMpOwkJXAorICBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgbG9uZyBfX3Jocyk7CQkJXAorICBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgdW5zaWduZWQgbG9uZyBfX3Jocyk7CQlcCisgIF9UcCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBsb25nIGxvbmcgX19yaHMpOwkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Jocyk7CVwKKyAgX1RwIG9wZXJhdG9yIF9PcChpbnQgX19saHMsIF9UcCBfX3Jocyk7CQkJXAorICBfVHAgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGludCBfX2xocywgX1RwIF9fcmhzKTsJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcChsb25nIF9fbGhzLCBfVHAgX19yaHMpOwkJCVwKKyAgX1RwIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIF9fbGhzLCBfVHAgX19yaHMpOwkJXAorICBfVHAgb3BlcmF0b3IgX09wKGxvbmcgbG9uZyBfX2xocywgX1RwIF9fcmhzKTsJCQlcCisgIF9UcCBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBsb25nIF9fbGhzLCBfVHAgX19yaHMpOworCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCssIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKywgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCssIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLSwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgtLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLSwgZGVjaW1hbDEyOCkKKworICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgqLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCosIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgqLCBkZWNpbWFsMTI4KQorCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC8sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLywgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC8sIGRlY2ltYWwxMjgpCisKKyN1bmRlZiBfREVDTEFSRV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQworI3VuZGVmIF9ERUNMQVJFX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UCisKKyAgLy8gMy4yLjkgIENvbXBhcmlzb24gb3BlcmF0b3JzLgorI2RlZmluZSBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oX09wLCBfVHApCQkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBkZWNpbWFsMzIgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBkZWNpbWFsNjQgX19yaHMpOwkJCVwKKyAgYm9vbCBvcGVyYXRvciBfT3AoX1RwIF9fbGhzLCBkZWNpbWFsMTI4IF9fcmhzKTsJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgaW50IF9fcmhzKTsJCQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIHVuc2lnbmVkIGludCBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGxvbmcgX19yaHMpOwkJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKF9UcCBfX2xocywgdW5zaWduZWQgbG9uZyBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIGxvbmcgbG9uZyBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChfVHAgX19saHMsIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Jocyk7CQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKGludCBfX2xocywgX1RwIF9fcmhzKTsJCQkJXAorICBib29sIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBpbnQgX19saHMsIF9UcCBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChsb25nIF9fbGhzLCBfVHAgX19yaHMpOwkJCQlcCisgIGJvb2wgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcChsb25nIGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CQkJXAorICBib29sIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIGxvbmcgX19saHMsIF9UcCBfX3Jocyk7CisKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD09LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig9PSwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPT0sIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKCE9LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTighPSwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oIT0sIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKDwsIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKDwsIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKDwsIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD49LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+PSwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPj0sIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD4sIGRlY2ltYWwzMikKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD4sIGRlY2ltYWw2NCkKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD4sIGRlY2ltYWwxMjgpCisKKyAgX0RFQ0xBUkVfREVDSU1BTF9DT01QQVJJU09OKD49LCBkZWNpbWFsMzIpCisgIF9ERUNMQVJFX0RFQ0lNQUxfQ09NUEFSSVNPTig+PSwgZGVjaW1hbDY0KQorICBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04oPj0sIGRlY2ltYWwxMjgpCisKKyN1bmRlZiBfREVDTEFSRV9ERUNJTUFMX0NPTVBBUklTT04KKworICAvLy8gMy4yLjIgIENsYXNzIGRlY2ltYWwzMi4KKyAgY2xhc3MgZGVjaW1hbDMyCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZmxvYXQgX19kZWNmbG9hdDMyIF9fYXR0cmlidXRlX18oKG1vZGUoU0QpKSk7CisKKyAgICAvLyAzLjIuMi4yICBDb25zdHJ1Y3QvY29weS9kZXN0cm95LgorICAgIGRlY2ltYWwzMigpCQkJCQk6IF9fdmFsKDAuZS0xMDFERikge30KKworICAgIC8vIDMuMi4yLjMgIENvbnZlcnNpb24gZnJvbSBmbG9hdGluZy1wb2ludCB0eXBlLgorICAgIGV4cGxpY2l0IGRlY2ltYWwzMihkZWNpbWFsNjQgX19kNjQpOworICAgIGV4cGxpY2l0IGRlY2ltYWwzMihkZWNpbWFsMTI4IF9fZDEyOCk7CisgICAgZXhwbGljaXQgZGVjaW1hbDMyKGZsb2F0IF9fcikJCTogX192YWwoX19yKSB7fQorICAgIGV4cGxpY2l0IGRlY2ltYWwzMihkb3VibGUgX19yKQkJOiBfX3ZhbChfX3IpIHt9CisgICAgZXhwbGljaXQgZGVjaW1hbDMyKGxvbmcgZG91YmxlIF9fcikJCTogX192YWwoX19yKSB7fQorCisgICAgLy8gMy4yLjIuNCAgQ29udmVyc2lvbiBmcm9tIGludGVncmFsIHR5cGUuCisgICAgZGVjaW1hbDMyKGludCBfX3opCQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwzMih1bnNpZ25lZCBpbnQgX196KQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwzMihsb25nIF9feikJCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDMyKHVuc2lnbmVkIGxvbmcgX196KQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDMyKGxvbmcgbG9uZyBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDMyKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3opCQk6IF9fdmFsKF9feikge30KKworICAgIC8vLyBDb25mb3JtaW5nIGV4dGVuc2lvbjogQ29udmVyc2lvbiBmcm9tIHNjYWxhciBkZWNpbWFsIHR5cGUuCisgICAgZGVjaW1hbDMyKF9fZGVjZmxvYXQzMiBfX3opCQkJOiBfX3ZhbChfX3opIHt9CisKKyAgICAvLyAzLjIuMi41ICBDb252ZXJzaW9uIHRvIGludGVncmFsIHR5cGUuIChESVNBQkxFRCkKKyAgICAvL29wZXJhdG9yIGxvbmcgbG9uZygpIGNvbnN0IHsgcmV0dXJuIChsb25nIGxvbmcpX192YWw7IH0KKworICAgIC8vIDMuMi4yLjYgIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9wZXJhdG9ycy4KKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yKysoKQorICAgIHsKKyAgICAgIF9fdmFsICs9IDE7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVjaW1hbDMyIG9wZXJhdG9yKysoaW50KQorICAgIHsKKyAgICAgIGRlY2ltYWwzMiBfX3RtcCA9ICp0aGlzOworICAgICAgX192YWwgKz0gMTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yLS0oKQorICAgIHsKKyAgICAgIF9fdmFsIC09IDE7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZGVjaW1hbDMyICAgb3BlcmF0b3ItLShpbnQpCisgICAgeworICAgICAgZGVjaW1hbDMyIF9fdG1wID0gKnRoaXM7CisgICAgICBfX3ZhbCAtPSAxOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIC8vIDMuMi4yLjcgIENvbXBvdW5kIGFzc2lnbm1lbnQuCisjZGVmaW5lIF9ERUNMQVJFX0RFQ0lNQUwzMl9DT01QT1VORF9BU1NJR05NRU5UKF9PcCkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKGRlY2ltYWwzMiBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AoZGVjaW1hbDY0IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcChkZWNpbWFsMTI4IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcChpbnQgX19yaHMpOwkJCVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBpbnQgX19yaHMpOwlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AobG9uZyBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDMyJiBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBfX3Jocyk7CVwKKyAgICBkZWNpbWFsMzImIG9wZXJhdG9yIF9PcChsb25nIGxvbmcgX19yaHMpOwkJXAorICAgIGRlY2ltYWwzMiYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Jocyk7CisKKyAgICBfREVDTEFSRV9ERUNJTUFMMzJfQ09NUE9VTkRfQVNTSUdOTUVOVCgrPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMMzJfQ09NUE9VTkRfQVNTSUdOTUVOVCgtPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMMzJfQ09NUE9VTkRfQVNTSUdOTUVOVCgqPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMMzJfQ09NUE9VTkRfQVNTSUdOTUVOVCgvPSkKKyN1bmRlZiBfREVDTEFSRV9ERUNJTUFMMzJfQ09NUE9VTkRfQVNTSUdOTUVOVAorCisgIHByaXZhdGU6CisgICAgX19kZWNmbG9hdDMyIF9fdmFsOworCisgIHB1YmxpYzoKKyAgICBfX2RlY2Zsb2F0MzIgX19nZXR2YWwodm9pZCkgeyByZXR1cm4gX192YWw7IH0KKyAgICB2b2lkIF9fc2V0dmFsKF9fZGVjZmxvYXQzMiBfX3gpIHsgX192YWwgPSBfX3g7IH0KKyAgfTsKKworICAvLy8gMy4yLjMgIENsYXNzIGRlY2ltYWw2NC4KKyAgY2xhc3MgZGVjaW1hbDY0CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZmxvYXQgX19kZWNmbG9hdDY0IF9fYXR0cmlidXRlX18oKG1vZGUoREQpKSk7CisKKyAgICAvLyAzLjIuMy4yICBDb25zdHJ1Y3QvY29weS9kZXN0cm95LgorICAgIGRlY2ltYWw2NCgpCQkJCQk6IF9fdmFsKDAuZS0zOThkZCkge30KKworICAgIC8vIDMuMi4zLjMgIENvbnZlcnNpb24gZnJvbSBmbG9hdGluZy1wb2ludCB0eXBlLgorCSAgICAgZGVjaW1hbDY0KGRlY2ltYWwzMiBkMzIpOworICAgIGV4cGxpY2l0IGRlY2ltYWw2NChkZWNpbWFsMTI4IGQxMjgpOworICAgIGV4cGxpY2l0IGRlY2ltYWw2NChmbG9hdCBfX3IpCQk6IF9fdmFsKF9fcikge30KKyAgICBleHBsaWNpdCBkZWNpbWFsNjQoZG91YmxlIF9fcikJCTogX192YWwoX19yKSB7fQorICAgIGV4cGxpY2l0IGRlY2ltYWw2NChsb25nIGRvdWJsZSBfX3IpCQk6IF9fdmFsKF9fcikge30KKworICAgIC8vIDMuMi4zLjQgIENvbnZlcnNpb24gZnJvbSBpbnRlZ3JhbCB0eXBlLgorICAgIGRlY2ltYWw2NChpbnQgX196KQkJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsNjQodW5zaWduZWQgaW50IF9feikJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsNjQobG9uZyBfX3opCQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWw2NCh1bnNpZ25lZCBsb25nIF9feikJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWw2NChsb25nIGxvbmcgX196KQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWw2NCh1bnNpZ25lZCBsb25nIGxvbmcgX196KQkJOiBfX3ZhbChfX3opIHt9CisKKyAgICAvLy8gQ29uZm9ybWluZyBleHRlbnNpb246IENvbnZlcnNpb24gZnJvbSBzY2FsYXIgZGVjaW1hbCB0eXBlLgorICAgIGRlY2ltYWw2NChfX2RlY2Zsb2F0NjQgX196KQkJCTogX192YWwoX196KSB7fQorCisgICAgLy8gMy4yLjMuNSAgQ29udmVyc2lvbiB0byBpbnRlZ3JhbCB0eXBlLiAoRElTQUJMRUQpCisgICAgLy9vcGVyYXRvciBsb25nIGxvbmcoKSBjb25zdCB7IHJldHVybiAobG9uZyBsb25nKV9fdmFsOyB9CisKKyAgICAvLyAzLjIuMy42ICBJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvcGVyYXRvcnMuCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBfX3ZhbCArPSAxOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGRlY2ltYWw2NCBvcGVyYXRvcisrKGludCkKKyAgICB7CisgICAgICBkZWNpbWFsNjQgX190bXAgPSAqdGhpczsKKyAgICAgIF9fdmFsICs9IDE7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvci0tKCkKKyAgICB7CisgICAgICBfX3ZhbCAtPSAxOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGRlY2ltYWw2NCBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICBkZWNpbWFsNjQgX190bXAgPSAqdGhpczsKKyAgICAgIF9fdmFsIC09IDE7CisgICAgICByZXR1cm4gX190bXA7CisgICAgfQorCisgICAgLy8gMy4yLjMuNyAgQ29tcG91bmQgYXNzaWdubWVudC4KKyNkZWZpbmUgX0RFQ0xBUkVfREVDSU1BTDY0X0NPTVBPVU5EX0FTU0lHTk1FTlQoX09wKQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AoZGVjaW1hbDMyIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcChkZWNpbWFsNjQgX19yaHMpOwkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKGRlY2ltYWwxMjggX19yaHMpOwkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKGludCBfX3Jocyk7CQkJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGludCBfX3Jocyk7CVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcChsb25nIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsNjQmIG9wZXJhdG9yIF9PcCh1bnNpZ25lZCBsb25nIF9fcmhzKTsJXAorICAgIGRlY2ltYWw2NCYgb3BlcmF0b3IgX09wKGxvbmcgbG9uZyBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDY0JiBvcGVyYXRvciBfT3AodW5zaWduZWQgbG9uZyBsb25nIF9fcmhzKTsKKworICAgIF9ERUNMQVJFX0RFQ0lNQUw2NF9DT01QT1VORF9BU1NJR05NRU5UKCs9KQorICAgIF9ERUNMQVJFX0RFQ0lNQUw2NF9DT01QT1VORF9BU1NJR05NRU5UKC09KQorICAgIF9ERUNMQVJFX0RFQ0lNQUw2NF9DT01QT1VORF9BU1NJR05NRU5UKCo9KQorICAgIF9ERUNMQVJFX0RFQ0lNQUw2NF9DT01QT1VORF9BU1NJR05NRU5UKC89KQorI3VuZGVmIF9ERUNMQVJFX0RFQ0lNQUw2NF9DT01QT1VORF9BU1NJR05NRU5UCisKKyAgcHJpdmF0ZToKKyAgICBfX2RlY2Zsb2F0NjQgX192YWw7CisKKyAgcHVibGljOgorICAgIF9fZGVjZmxvYXQ2NCBfX2dldHZhbCh2b2lkKSB7IHJldHVybiBfX3ZhbDsgfQorICAgIHZvaWQgX19zZXR2YWwoX19kZWNmbG9hdDY0IF9feCkgeyBfX3ZhbCA9IF9feDsgfQorICB9OworCisgIC8vLyAzLjIuNCAgQ2xhc3MgZGVjaW1hbDEyOC4KKyAgY2xhc3MgZGVjaW1hbDEyOAorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIGZsb2F0IF9fZGVjZmxvYXQxMjggX19hdHRyaWJ1dGVfXygobW9kZShURCkpKTsKKworICAgIC8vIDMuMi40LjIgIENvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kuCisgICAgZGVjaW1hbDEyOCgpCQkJCTogX192YWwoMC5lLTYxNzZETCkge30KKworICAgIC8vIDMuMi40LjMgIENvbnZlcnNpb24gZnJvbSBmbG9hdGluZy1wb2ludCB0eXBlLgorCSAgICAgZGVjaW1hbDEyOChkZWNpbWFsMzIgZDMyKTsKKwkgICAgIGRlY2ltYWwxMjgoZGVjaW1hbDY0IGQ2NCk7CisgICAgZXhwbGljaXQgZGVjaW1hbDEyOChmbG9hdCBfX3IpCQk6IF9fdmFsKF9fcikge30KKyAgICBleHBsaWNpdCBkZWNpbWFsMTI4KGRvdWJsZSBfX3IpCQk6IF9fdmFsKF9fcikge30KKyAgICBleHBsaWNpdCBkZWNpbWFsMTI4KGxvbmcgZG91YmxlIF9fcikJOiBfX3ZhbChfX3IpIHt9CisKKworICAgIC8vIDMuMi40LjQgIENvbnZlcnNpb24gZnJvbSBpbnRlZ3JhbCB0eXBlLgorICAgIGRlY2ltYWwxMjgoaW50IF9feikJCQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDEyOCh1bnNpZ25lZCBpbnQgX196KQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDEyOChsb25nIF9feikJCQk6IF9fdmFsKF9feikge30KKyAgICBkZWNpbWFsMTI4KHVuc2lnbmVkIGxvbmcgX196KQkJOiBfX3ZhbChfX3opIHt9CisgICAgZGVjaW1hbDEyOChsb25nIGxvbmcgX196KQkJCTogX192YWwoX196KSB7fQorICAgIGRlY2ltYWwxMjgodW5zaWduZWQgbG9uZyBsb25nIF9feikJCTogX192YWwoX196KSB7fQorCisgICAgLy8vIENvbmZvcm1pbmcgZXh0ZW5zaW9uOiBDb252ZXJzaW9uIGZyb20gc2NhbGFyIGRlY2ltYWwgdHlwZS4KKyAgICBkZWNpbWFsMTI4KF9fZGVjZmxvYXQxMjggX196KQkJOiBfX3ZhbChfX3opIHt9CisKKyAgICAvLyAzLjIuNC41ICBDb252ZXJzaW9uIHRvIGludGVncmFsIHR5cGUuIChESVNBQkxFRCkKKyAgICAvL29wZXJhdG9yIGxvbmcgbG9uZygpIGNvbnN0IHsgcmV0dXJuIChsb25nIGxvbmcpX192YWw7IH0KKworICAgIC8vIDMuMi40LjYgIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9wZXJhdG9ycy4KKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvcisrKCkKKyAgICB7CisgICAgICBfX3ZhbCArPSAxOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGRlY2ltYWwxMjggb3BlcmF0b3IrKyhpbnQpCisgICAgeworICAgICAgZGVjaW1hbDEyOCBfX3RtcCA9ICp0aGlzOworICAgICAgX192YWwgKz0gMTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvci0tKCkKKyAgICB7CisgICAgICBfX3ZhbCAtPSAxOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGRlY2ltYWwxMjggICBvcGVyYXRvci0tKGludCkKKyAgICB7CisgICAgICBkZWNpbWFsMTI4IF9fdG1wID0gKnRoaXM7CisgICAgICBfX3ZhbCAtPSAxOworICAgICAgcmV0dXJuIF9fdG1wOworICAgIH0KKworICAgIC8vIDMuMi40LjcgIENvbXBvdW5kIGFzc2lnbm1lbnQuCisjZGVmaW5lIF9ERUNMQVJFX0RFQ0lNQUwxMjhfQ09NUE9VTkRfQVNTSUdOTUVOVChfT3ApCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AoZGVjaW1hbDMyIF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AoZGVjaW1hbDY0IF9fcmhzKTsJCVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AoZGVjaW1hbDEyOCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKGludCBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGludCBfX3Jocyk7CVwKKyAgICBkZWNpbWFsMTI4JiBvcGVyYXRvciBfT3AobG9uZyBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgX19yaHMpOwlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKGxvbmcgbG9uZyBfX3Jocyk7CQlcCisgICAgZGVjaW1hbDEyOCYgb3BlcmF0b3IgX09wKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3Jocyk7CisKKyAgICBfREVDTEFSRV9ERUNJTUFMMTI4X0NPTVBPVU5EX0FTU0lHTk1FTlQoKz0pCisgICAgX0RFQ0xBUkVfREVDSU1BTDEyOF9DT01QT1VORF9BU1NJR05NRU5UKC09KQorICAgIF9ERUNMQVJFX0RFQ0lNQUwxMjhfQ09NUE9VTkRfQVNTSUdOTUVOVCgqPSkKKyAgICBfREVDTEFSRV9ERUNJTUFMMTI4X0NPTVBPVU5EX0FTU0lHTk1FTlQoLz0pCisjdW5kZWYgX0RFQ0xBUkVfREVDSU1BTDEyOF9DT01QT1VORF9BU1NJR05NRU5UCisKKyAgcHJpdmF0ZToKKyAgICBfX2RlY2Zsb2F0MTI4IF9fdmFsOworCisgIHB1YmxpYzoKKyAgICBfX2RlY2Zsb2F0MTI4IF9fZ2V0dmFsKHZvaWQpIHsgcmV0dXJuIF9fdmFsOyB9CisgICAgdm9pZCBfX3NldHZhbChfX2RlY2Zsb2F0MTI4IF9feCkgeyBfX3ZhbCA9IF9feDsgfQorICB9OworCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9ERUNJTUFMXyAxCisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBkZWNpbWFsCisgIC8vIEB9IGdyb3VwIGRlY2ltYWwKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjaW5jbHVkZSA8ZGVjaW1hbC9kZWNpbWFsLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9ERUNJTUFMICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlY2ltYWwvZGVjaW1hbC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWNpbWFsL2RlY2ltYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGYwNTczCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9kZWNpbWFsL2RlY2ltYWwuaApAQCAtMCwwICsxLDQ2OCBAQAorLy8gZGVjaW1hbCBjbGFzc2VzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGRlY2ltYWwvZGVjaW1hbC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZGVjaW1hbH0KKyAqLworCisvLyBJU08vSUVDIFRSIDI0NzMzCisvLyBXcml0dGVuIGJ5IEphbmlzIEpvaG5zb24gPGphbmlzMTg3QHVzLmlibS5jb20+CisKKyNpZm5kZWYgX0dMSUJDWFhfREVDSU1BTF9JTVBMCisjZGVmaW5lIF9HTElCQ1hYX0RFQ0lNQUxfSU1QTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgZGVjaW1hbAoreworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi5bMjM0XS4xICBDb25zdHJ1Y3QvY29weS9kZXN0cm95LgorCisgIGlubGluZSBkZWNpbWFsMzI6OmRlY2ltYWwzMihkZWNpbWFsNjQgX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDMyOjpkZWNpbWFsMzIoZGVjaW1hbDEyOCBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisgIGlubGluZSBkZWNpbWFsNjQ6OmRlY2ltYWw2NChkZWNpbWFsMzIgX19yKQk6IF9fdmFsKF9fci5fX2dldHZhbCgpKSB7fQorICBpbmxpbmUgZGVjaW1hbDY0OjpkZWNpbWFsNjQoZGVjaW1hbDEyOCBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisgIGlubGluZSBkZWNpbWFsMTI4OjpkZWNpbWFsMTI4KGRlY2ltYWwzMiBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisgIGlubGluZSBkZWNpbWFsMTI4OjpkZWNpbWFsMTI4KGRlY2ltYWw2NCBfX3IpCTogX192YWwoX19yLl9fZ2V0dmFsKCkpIHt9CisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLlsyMzRdLjYgIENvbXBvdW5kIGFzc2lnbm1lbnQuCisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDKF9PcDEsIF9PcDIsIF9UMSwgX1QyKQkgXAorICBpbmxpbmUgX1QxJiBfVDE6Om9wZXJhdG9yIF9PcDEoX1QyIF9fcmhzKQkJCQkgXAorICB7CQkJCQkJCQkJIFwKKyAgICBfX3NldHZhbChfX2dldHZhbCgpIF9PcDIgX19yaHMuX19nZXR2YWwoKSk7CQkJCSBcCisgICAgcmV0dXJuICp0aGlzOwkJCQkJCQkgXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgX1QyKQkgXAorICBpbmxpbmUgX1QxJiBfVDE6Om9wZXJhdG9yIF9PcDEoX1QyIF9fcmhzKQkJCQkgXAorICB7CQkJCQkJCQkJIFwKKyAgICBfX3NldHZhbChfX2dldHZhbCgpIF9PcDIgX19yaHMpOwkJCQkJIFwKKyAgICByZXR1cm4gKnRoaXM7CQkJCQkJCSBcCisgIH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoX09wMSwgX09wMiwgX1QxKQkJIFwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDKF9PcDEsIF9PcDIsIF9UMSwgZGVjaW1hbDMyKQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9ERUMoX09wMSwgX09wMiwgX1QxLCBkZWNpbWFsNjQpCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0RFQyhfT3AxLCBfT3AyLCBfVDEsIGRlY2ltYWwxMjgpCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVChfT3AxLCBfT3AyLCBfVDEsIGludCkJCSBcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UX0lOVChfT3AxLCBfT3AyLCBfVDEsIHVuc2lnbmVkIGludCkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCBsb25nKQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCB1bnNpZ25lZCBsb25nKVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UKF9PcDEsIF9PcDIsIF9UMSwgbG9uZyBsb25nKQkgXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVF9JTlQoX09wMSwgX09wMiwgX1QxLCB1bnNpZ25lZCBsb25nIGxvbmcpCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCs9LCArLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygtPSwgLSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoKj0sICosIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC89LCAvLCBkZWNpbWFsMzIpCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCs9LCArLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygtPSwgLSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoKj0sICosIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC89LCAvLCBkZWNpbWFsNjQpCisKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKCs9LCArLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUE9VTkRfQVNTSUdOTUVOVFMoLT0sIC0sIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QT1VORF9BU1NJR05NRU5UUygqPSwgKiwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTKC89LCAvLCBkZWNpbWFsMTI4KQorCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfREVDCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRfSU5UCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBPVU5EX0FTU0lHTk1FTlRTCisKKyAgLy8gRXh0ZW5zaW9uOiBDb252ZXJzaW9uIHRvIGludGVncmFsIHR5cGUuCisKKyAgaW5saW5lIGxvbmcgbG9uZyBkZWNpbWFsMzJfdG9fbG9uZ19sb25nKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWw2NF90b19sb25nX2xvbmcoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGxvbmcgbG9uZylfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcgZGVjaW1hbDEyOF90b19sb25nX2xvbmcoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGxvbmcpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBsb25nIGRlY2ltYWxfdG9fbG9uZ19sb25nKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAobG9uZyBsb25nKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgLy8gSVNPL0lFQyBUUiAyNDczMyAgMy4yLjUgIEluaXRpYWxpemF0aW9uIGZyb20gY29lZmZpY2llbnQgYW5kIGV4cG9uZW50LgorCisgIHN0YXRpYyBkZWNpbWFsMzIgbWFrZV9kZWNpbWFsMzIobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDMyIF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREY7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERjsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsMzIgbWFrZV9kZWNpbWFsMzIodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDMyIF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREY7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERjsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsNjQgbWFrZV9kZWNpbWFsNjQobG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDY0IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREQ7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsNjQgbWFrZV9kZWNpbWFsNjQodW5zaWduZWQgbG9uZyBsb25nIF9fY29lZmYsIGludCBfX2V4cG9uZW50KQorICB7CisgICAgZGVjaW1hbDY0IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREQ7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFERDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsMTI4IG1ha2VfZGVjaW1hbDEyOChsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwb25lbnQpCisgIHsKKyAgICBkZWNpbWFsMTI4IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREw7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFETDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIHN0YXRpYyBkZWNpbWFsMTI4IG1ha2VfZGVjaW1hbDEyOCh1bnNpZ25lZCBsb25nIGxvbmcgX19jb2VmZiwgaW50IF9fZXhwb25lbnQpCisgIHsKKyAgICBkZWNpbWFsMTI4IF9fZGVjZXhwID0gMSwgX19tdWx0aXBsaWVyOworCisgICAgaWYgKF9fZXhwb25lbnQgPCAwKQorICAgICAgeworCV9fbXVsdGlwbGllciA9IDEuRS0xREw7CisJX19leHBvbmVudCA9IC1fX2V4cG9uZW50OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIF9fbXVsdGlwbGllciA9IDEuRTFETDsKKworICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fZXhwb25lbnQ7ICsrX19pKQorICAgICAgX19kZWNleHAgKj0gX19tdWx0aXBsaWVyOworCisgICAgcmV0dXJuIF9fY29lZmYgKiBfX2RlY2V4cDsKKyAgfQorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi42ICBDb252ZXJzaW9uIHRvIGdlbmVyaWMgZmxvYXRpbmctcG9pbnQgdHlwZS4KKworICBpbmxpbmUgZmxvYXQgZGVjaW1hbDMyX3RvX2Zsb2F0KGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsNjRfdG9fZmxvYXQoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGZsb2F0KV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGZsb2F0IGRlY2ltYWwxMjhfdG9fZmxvYXQoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChmbG9hdClfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBmbG9hdCBkZWNpbWFsX3RvX2Zsb2F0KGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAoZmxvYXQpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgZG91YmxlIGRlY2ltYWwzMl90b19kb3VibGUoZGVjaW1hbDMyIF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbDY0X3RvX2RvdWJsZShkZWNpbWFsNjQgX19kKQorICB7IHJldHVybiAoZG91YmxlKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGRvdWJsZSBkZWNpbWFsMTI4X3RvX2RvdWJsZShkZWNpbWFsMTI4IF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDMyIF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBkb3VibGUgZGVjaW1hbF90b19kb3VibGUoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUgZGVjaW1hbDMyX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsNjRfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDY0IF9fZCkKKyAgeyByZXR1cm4gKGxvbmcgZG91YmxlKV9fZC5fX2dldHZhbCgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlIGRlY2ltYWwxMjhfdG9fbG9uZ19kb3VibGUoZGVjaW1hbDEyOCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwzMiBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWw2NCBfX2QpCisgIHsgcmV0dXJuIChsb25nIGRvdWJsZSlfX2QuX19nZXR2YWwoKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZSBkZWNpbWFsX3RvX2xvbmdfZG91YmxlKGRlY2ltYWwxMjggX19kKQorICB7IHJldHVybiAobG9uZyBkb3VibGUpX19kLl9fZ2V0dmFsKCk7IH0KKworICAvLyBJU08vSUVDIFRSIDI0NzMzICAzLjIuNyAgVW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX1VOQVJZX09QKF9PcCwgX1RwKQlcCisgIGlubGluZSBfVHAgb3BlcmF0b3IgX09wKF9UcCBfX3JocykJCVwKKyAgewkJCQkJCVwKKyAgICBfVHAgX190bXA7CQkJCQlcCisgICAgX190bXAuX19zZXR2YWwoMCBfT3AgX19yaHMuX19nZXR2YWwoKSk7CVwKKyAgICByZXR1cm4gX190bXA7CQkJCVwKKyAgfQorCisgIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUCgrLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUCgrLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUCgrLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AoLSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AoLSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfVU5BUllfT1AoLSwgZGVjaW1hbDEyOCkKKworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9VTkFSWV9PUAorCisgIC8vIElTTy9JRUMgVFIgMjQ3MzMgIDMuMi44ICBCaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQyhfT3AsIF9UMSwgX1QyLCBfVDMpCVwKKyAgaW5saW5lIF9UMSBvcGVyYXRvciBfT3AoX1QyIF9fbGhzLCBfVDMgX19yaHMpCQkJXAorICB7CQkJCQkJCQlcCisgICAgX1QxIF9fcmV0dmFsOwkJCQkJCVwKKyAgICBfX3JldHZhbC5fX3NldHZhbChfX2xocy5fX2dldHZhbCgpIF9PcCBfX3Jocy5fX2dldHZhbCgpKTsJXAorICAgIHJldHVybiBfX3JldHZhbDsJCQkJCQlcCisgIH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0JPVEgoX09wLCBfVDEsIF9UMiwgX1QzKQlcCisgIGlubGluZSBfVDEgb3BlcmF0b3IgX09wKF9UMiBfX2xocywgX1QzIF9fcmhzKQkJCVwKKyAgewkJCQkJCQkJXAorICAgIF9UMSBfX3JldHZhbDsJCQkJCQlcCisgICAgX19yZXR2YWwuX19zZXR2YWwoX19saHMuX19nZXR2YWwoKSBfT3AgX19yaHMuX19nZXR2YWwoKSk7CVwKKyAgICByZXR1cm4gX19yZXR2YWw7CQkJCQkJXAorICB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIF9UMikJCVwKKyAgaW5saW5lIF9UMSBvcGVyYXRvciBfT3AoX1QxIF9fbGhzLCBfVDIgX19yaHMpCQkJXAorICB7CQkJCQkJCQlcCisgICAgX1QxIF9fcmV0dmFsOwkJCQkJCVwKKyAgICBfX3JldHZhbC5fX3NldHZhbChfX2xocy5fX2dldHZhbCgpIF9PcCBfX3Jocyk7CQlcCisgICAgcmV0dXJuIF9fcmV0dmFsOwkJCQkJCVwKKyAgfQorCisjZGVmaW5lIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCBfVDIpCQlcCisgIGlubGluZSBfVDEgb3BlcmF0b3IgX09wKF9UMiBfX2xocywgX1QxIF9fcmhzKQkJCVwKKyAgewkJCQkJCQkJXAorICAgIF9UMSBfX3JldHZhbDsJCQkJCQlcCisgICAgX19yZXR2YWwuX19zZXR2YWwoX19saHMgX09wIF9fcmhzLl9fZ2V0dmFsKCkpOwkJXAorICAgIHJldHVybiBfX3JldHZhbDsJCQkJCQlcCisgIH0KKworI2RlZmluZSBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKF9PcCwgX1QxKQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgaW50KTsJCQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCB1bnNpZ25lZCBpbnQpOwlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCBsb25nKTsJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMoX09wLCBfVDEsIHVuc2lnbmVkIGxvbmcpOwlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfTEhTKF9PcCwgX1QxLCBsb25nIGxvbmcpOwkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX0xIUyhfT3AsIF9UMSwgdW5zaWduZWQgbG9uZyBsb25nKTsJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgaW50KTsJCQlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCB1bnNpZ25lZCBpbnQpOwlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCBsb25nKTsJCVwKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9SSFMoX09wLCBfVDEsIHVuc2lnbmVkIGxvbmcpOwlcCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfUkhTKF9PcCwgX1QxLCBsb25nIGxvbmcpOwkJXAorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUyhfT3AsIF9UMSwgdW5zaWduZWQgbG9uZyBsb25nKTsJXAorCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgrLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKywgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCssIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygrLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCssIGRlY2ltYWwxMjgpCisKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMzIsIGRlY2ltYWwzMiwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsNjQsIGRlY2ltYWwzMiwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgtLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyLCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygtLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLSwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC0sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLSwgZGVjaW1hbDEyOCkKKworICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwzMiwgZGVjaW1hbDMyLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoKiwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWw2NCwgZGVjaW1hbDMyLCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDY0LCBkZWNpbWFsNjQsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKCosIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMzIsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDY0LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKCosIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygqLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoKiwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgqLCBkZWNpbWFsMTI4KQorCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDMyLCBkZWNpbWFsMzIsIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0lOVCgvLCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDY0LCBkZWNpbWFsMzIsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsNjQsIGRlY2ltYWw2NCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWw2NCwgZGVjaW1hbDY0LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQoLywgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwzMiwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsNjQsIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9ERUMoLywgZGVjaW1hbDEyOCwgZGVjaW1hbDEyOCwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDKC8sIGRlY2ltYWwxMjgsIGRlY2ltYWwxMjgsIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9XSVRIX0RFQygvLCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfSU5UKC8sIGRlY2ltYWwxMjgpCisKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1dJVEhfREVDCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9CT1RICisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0JJTkFSWV9PUF9MSFMKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQklOQVJZX09QX1JIUworI3VuZGVmIF9ERUZJTkVfREVDSU1BTF9CSU5BUllfT1BfV0lUSF9JTlQKKworICAvLyBJU08vSUVDIFRSIDI0NzMzICAzLjIuOSAgQ29tcGFyaXNvbiBvcGVyYXRvcnMuCisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fQk9USChfT3AsIF9UMSwgX1QyKQlcCisgIGlubGluZSBib29sIG9wZXJhdG9yIF9PcChfVDEgX19saHMsIF9UMiBfX3JocykJXAorICB7IHJldHVybiBfX2xocy5fX2dldHZhbCgpIF9PcCBfX3Jocy5fX2dldHZhbCgpOyB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1QxLCBfVDIpCVwKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IgX09wKF9UMSBfX2xocywgX1QyIF9fcmhzKQlcCisgIHsgcmV0dXJuIF9fbGhzLl9fZ2V0dmFsKCkgX09wIF9fcmhzOyB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgX1QxLCBfVDIpCVwKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IgX09wKF9UMSBfX2xocywgX1QyIF9fcmhzKQlcCisgIHsgcmV0dXJuIF9fbGhzIF9PcCBfX3Jocy5fX2dldHZhbCgpOyB9CisKKyNkZWZpbmUgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKF9PcCwgX1RwKQkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fQk9USChfT3AsIF9UcCwgZGVjaW1hbDMyKQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9CT1RIKF9PcCwgX1RwLCBkZWNpbWFsNjQpCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0JPVEgoX09wLCBfVHAsIGRlY2ltYWwxMjgpCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UcCwgaW50KQkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1RwLCB1bnNpZ25lZCBpbnQpCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1RwLCBsb25nKQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9MSFMoX09wLCBfVHAsIHVuc2lnbmVkIGxvbmcpCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTKF9PcCwgX1RwLCBsb25nIGxvbmcpCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX0xIUyhfT3AsIF9UcCwgdW5zaWduZWQgbG9uZyBsb25nKQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIGludCwgX1RwKQkJCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgdW5zaWduZWQgaW50LCBfVHApCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgbG9uZywgX1RwKQkJXAorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9SSFMoX09wLCB1bnNpZ25lZCBsb25nLCBfVHApCVwKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTKF9PcCwgbG9uZyBsb25nLCBfVHApCQlcCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OX1JIUyhfT3AsIHVuc2lnbmVkIGxvbmcgbG9uZywgX1RwKQorCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg9PSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPT0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD09LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoIT0sIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKCE9LCBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyghPSwgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKDwsICBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg8LCAgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPCwgIGRlY2ltYWwxMjgpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg8PSwgZGVjaW1hbDMyKQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPD0sIGRlY2ltYWw2NCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKDw9LCBkZWNpbWFsMTI4KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPiwgIGRlY2ltYWwzMikKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD4sICBkZWNpbWFsNjQpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg+LCAgZGVjaW1hbDEyOCkKKyAgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TKD49LCBkZWNpbWFsMzIpCisgIF9ERUZJTkVfREVDSU1BTF9DT01QQVJJU09OUyg+PSwgZGVjaW1hbDY0KQorICBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTlMoPj0sIGRlY2ltYWwxMjgpCisKKyN1bmRlZiBfREVGSU5FX0RFQ0lNQUxfQ09NUEFSSVNPTl9CT1RICisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fTEhTCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05fUkhTCisjdW5kZWYgX0RFRklORV9ERUNJTUFMX0NPTVBBUklTT05TCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZGVjaW1hbAorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9ERUNJTUFMX0lNUEwgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZGVxdWUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlcXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDYwNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2RlcXVlCkBAIC0wLDAgKzEsNzcgQEAKKy8vIDxkZXF1ZT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvZGVxdWUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfREVRVUUKKyNkZWZpbmUgX0dMSUJDWFhfREVRVUUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdW5pbml0aWFsaXplZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2RlcXVlLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxiaXRzL2RlcXVlLnRjYz4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL2RlcXVlPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvZGVxdWU+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0RFUVVFICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4Y2VwdGlvbiBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXhjZXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzVhZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4Y2VwdGlvbgpAQCAtMCwwICsxLDE1OCBAQAorLy8gRXhjZXB0aW9uIEhhbmRsaW5nIHN1cHBvcnQgaGVhZGVyIGZvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsCisvLyAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleGNlcHRpb24KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX19FWENFUFRJT05fXworI2RlZmluZSBfX0VYQ0VQVElPTl9fCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCitleHRlcm4gIkMrKyIgeworCituYW1lc3BhY2Ugc3RkCit7CisgIC8qKgorICAgKiBAZGVmZ3JvdXAgZXhjZXB0aW9ucyBFeGNlcHRpb25zCisgICAqIEBpbmdyb3VwIGRpYWdub3N0aWNzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgcmVwb3J0aW5nIGVycm9ycyB2aWEgZXhjZXB0aW9uIGNsYXNzZXMuCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgZm9yIGFsbCBsaWJyYXJ5IGV4Y2VwdGlvbnMuCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIHN0YW5kYXJkCisgICAqICBsaWJyYXJ5LCBhbmQgYnkgY2VydGFpbiBsYW5ndWFnZSBleHByZXNzaW9ucy4gIFlvdSBhcmUgZnJlZSB0byBkZXJpdmUKKyAgICogIHlvdXIgb3duICVleGNlcHRpb24gY2xhc3Nlcywgb3IgdXNlIGEgZGlmZmVyZW50IGhpZXJhcmNoeSwgb3IgdG8KKyAgICogIHRocm93IG5vbi1jbGFzcyBkYXRhIChlLmcuLCBmdW5kYW1lbnRhbCB0eXBlcykuCisgICAqLworICBjbGFzcyBleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgZXhjZXB0aW9uKCkgdGhyb3coKSB7IH0KKyAgICB2aXJ0dWFsIH5leGNlcHRpb24oKSB0aHJvdygpOworCisgICAgLyoqIFJldHVybnMgYSBDLXN0eWxlIGNoYXJhY3RlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2VuZXJhbCBjYXVzZQorICAgICAqICBvZiB0aGUgY3VycmVudCBlcnJvci4gICovCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworICAvKiogSWYgYW4gJWV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpY2ggaXMgbm90IGxpc3RlZCBpbiBhIGZ1bmN0aW9uJ3MKKyAgICogICVleGNlcHRpb24gc3BlY2lmaWNhdGlvbiwgb25lIG9mIHRoZXNlIG1heSBiZSB0aHJvd24uICAqLworICBjbGFzcyBiYWRfZXhjZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICBiYWRfZXhjZXB0aW9uKCkgdGhyb3coKSB7IH0KKworICAgIC8vIFRoaXMgZGVjbGFyYXRpb24gaXMgbm90IHVzZWxlc3M6CisgICAgLy8gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjLTMuMC4yL2djY182Lmh0bWwjU0VDMTE4CisgICAgdmlydHVhbCB+YmFkX2V4Y2VwdGlvbigpIHRocm93KCk7CisKKyAgICAvLyBTZWUgY29tbWVudCBpbiBlaF9leGNlcHRpb24uY2MuCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworICAvLy8gSWYgeW91IHdyaXRlIGEgcmVwbGFjZW1lbnQgJXRlcm1pbmF0ZSBoYW5kbGVyLCBpdCBtdXN0IGJlIG9mIHRoaXMgdHlwZS4KKyAgdHlwZWRlZiB2b2lkICgqdGVybWluYXRlX2hhbmRsZXIpICgpOworCisgIC8vLyBJZiB5b3Ugd3JpdGUgYSByZXBsYWNlbWVudCAldW5leHBlY3RlZCBoYW5kbGVyLCBpdCBtdXN0IGJlIG9mIHRoaXMgdHlwZS4KKyAgdHlwZWRlZiB2b2lkICgqdW5leHBlY3RlZF9oYW5kbGVyKSAoKTsKKworICAvLy8gVGFrZXMgYSBuZXcgaGFuZGxlciBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudCwgcmV0dXJucyB0aGUgb2xkIGZ1bmN0aW9uLgorICB0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVybWluYXRlKHRlcm1pbmF0ZV9oYW5kbGVyKSB0aHJvdygpOworCisgIC8qKiBUaGUgcnVudGltZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiAlZXhjZXB0aW9uIGhhbmRsaW5nIG11c3QgYmUKKyAgICogIGFiYW5kb25lZCBmb3IgYW55IHJlYXNvbi4gIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBieSB0aGUgdXNlci4gICovCisgIHZvaWQgdGVybWluYXRlKCkgdGhyb3coKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CisKKyAgLy8vIFRha2VzIGEgbmV3IGhhbmRsZXIgZnVuY3Rpb24gYXMgYW4gYXJndW1lbnQsIHJldHVybnMgdGhlIG9sZCBmdW5jdGlvbi4KKyAgdW5leHBlY3RlZF9oYW5kbGVyIHNldF91bmV4cGVjdGVkKHVuZXhwZWN0ZWRfaGFuZGxlcikgdGhyb3coKTsKKworICAvKiogVGhlIHJ1bnRpbWUgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgYW4gJWV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpY2gKKyAgICogIHZpb2xhdGVzIHRoZSBmdW5jdGlvbidzICVleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gICovCisgIHZvaWQgdW5leHBlY3RlZCgpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKKworICAvKiogWzE4LjYuNF0vMTogICdSZXR1cm5zIHRydWUgYWZ0ZXIgY29tcGxldGluZyBldmFsdWF0aW9uIG9mIGEKKyAgICogIHRocm93LWV4cHJlc3Npb24gdW50aWwgZWl0aGVyIGNvbXBsZXRpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisgICAqICBleGNlcHRpb24tZGVjbGFyYXRpb24gaW4gdGhlIG1hdGNoaW5nIGhhbmRsZXIgb3IgZW50ZXJpbmcgQGMgdW5leHBlY3RlZCgpCisgICAqICBkdWUgdG8gdGhlIHRocm93OyBvciBhZnRlciBlbnRlcmluZyBAYyB0ZXJtaW5hdGUoKSBmb3IgYW55IHJlYXNvbgorICAgKiAgb3RoZXIgdGhhbiBhbiBleHBsaWNpdCBjYWxsIHRvIEBjIHRlcm1pbmF0ZSgpLiAgW05vdGU6IFRoaXMgaW5jbHVkZXMKKyAgICogIHN0YWNrIHVud2luZGluZyBbMTUuMl0uICBlbmQgbm90ZV0nCisgICAqCisgICAqICAyOiAnV2hlbiBAYyB1bmNhdWdodF9leGNlcHRpb24oKSBpcyB0cnVlLCB0aHJvd2luZyBhbgorICAgKiAgJWV4Y2VwdGlvbiBjYW4gcmVzdWx0IGluIGEgY2FsbCBvZiBAYyB0ZXJtaW5hdGUoKQorICAgKiAgKDE1LjUuMSkuJworICAgKi8KKyAgYm9vbCB1bmNhdWdodF9leGNlcHRpb24oKSB0aHJvdygpIF9fYXR0cmlidXRlX18gKChfX3B1cmVfXykpOworCisgIC8vIEB9IGdyb3VwIGV4Y2VwdGlvbnMKK30gLy8gbmFtZXNwYWNlIHN0ZAorCituYW1lc3BhY2UgX19nbnVfY3h4Cit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIEEgcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCB0ZXJtaW5hdGVfaGFuZGxlciB3aGljaAorICAgKiAgcHJpbnRzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlcm1pbmF0aW5nIGV4Y2VwdGlvbiAoaWYgYW55KQorICAgKiAgb24gc3RkZXJyLgorICAgKgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgQ2FsbAorICAgKiAgIEBjb2RlCisgICAqICAgICBzdGQ6OnNldF90ZXJtaW5hdGUoX19nbnVfY3h4OjpfX3ZlcmJvc2VfdGVybWluYXRlX2hhbmRsZXIpCisgICAqICAgQGVuZGNvZGUKKyAgICogIHRvIHVzZS4gIEZvciBtb3JlIGluZm8sIHNlZQorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQwMmNoMDZzMDIuaHRtbAorICAgKgorICAgKiAgSW4gMy40IGFuZCBsYXRlciwgdGhpcyBpcyBvbiBieSBkZWZhdWx0LgorICAgKi8KKyAgdm9pZCBfX3ZlcmJvc2VfdGVybWluYXRlX2hhbmRsZXIoKTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCit9IC8vIGV4dGVybiAiQysrIgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHBvcAorCisjaWYgKGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pIFwKKyAgICAgJiYgZGVmaW5lZChfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlNfNCkpCisjaW5jbHVkZSA8Yml0cy9leGNlcHRpb25fcHRyLmg+CisjaW5jbHVkZSA8Yml0cy9uZXN0ZWRfZXhjZXB0aW9uLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9hbGdvcml0aG0gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9hbGdvcml0aG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3YTAzYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2FsZ29yaXRobQpAQCAtMCwwICsxLDYwNSBAQAorLy8gQWxnb3JpdGhtIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LAorLy8gMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvYWxnb3JpdGhtCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9FWFRfQUxHT1JJVEhNCisjZGVmaW5lIF9FWFRfQUxHT1JJVEhNIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6bWluOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnOworICB1c2luZyBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnOworICB1c2luZyBzdGQ6Oml0ZXJhdG9yX3RyYWl0czsKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGNvcHlfbiAobm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZCkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1NpemUsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBwYWlyPF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+CisgICAgX19jb3B5X24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX1NpemUgX19jb3VudCwKKwkgICAgIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCwKKwkgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBmb3IgKCA7IF9fY291bnQgPiAwOyAtLV9fY291bnQpCisJeworCSAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJICArK19fcmVzdWx0OworCX0KKyAgICAgIHJldHVybiBwYWlyPF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+KF9fZmlyc3QsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JBSXRlcmF0b3IsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfT3V0cHV0SXRlcmF0b3I+CisgICAgaW5saW5lIHBhaXI8X1JBSXRlcmF0b3IsIF9PdXRwdXRJdGVyYXRvcj4KKyAgICBfX2NvcHlfbihfUkFJdGVyYXRvciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCSAgICAgX091dHB1dEl0ZXJhdG9yIF9fcmVzdWx0LAorCSAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgX1JBSXRlcmF0b3IgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7CisgICAgICByZXR1cm4gcGFpcjxfUkFJdGVyYXRvciwgX091dHB1dEl0ZXJhdG9yPihfX2xhc3QsIHN0ZDo6Y29weShfX2ZpcnN0LAorCQkJCQkJCQkgIF9fbGFzdCwKKwkJCQkJCQkJICBfX3Jlc3VsdCkpOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBDb3BpZXMgdGhlIHJhbmdlIFtmaXJzdCxmaXJzdCtjb3VudCkgaW50byBbcmVzdWx0LHJlc3VsdCtjb3VudCkuCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgY291bnQgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29weS4KKyAgICogIEBwYXJhbSAgcmVzdWx0IEFuIG91dHB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBIHN0ZDo6cGFpciBjb21wb3NlZCBvZiBmaXJzdCtjb3VudCBhbmQgcmVzdWx0K2NvdW50LgorICAgKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgVGhpcyBpbmxpbmUgZnVuY3Rpb24gd2lsbCBib2lsIGRvd24gdG8gYSBjYWxsIHRvIEBjIG1lbW1vdmUgd2hlbmV2ZXIKKyAgICogIHBvc3NpYmxlLiAgRmFpbGluZyB0aGF0LCBpZiByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycyBhcmUgcGFzc2VkLCB0aGVuIHRoZQorICAgKiAgbG9vcCBjb3VudCB3aWxsIGJlIGtub3duIChhbmQgdGhlcmVmb3JlIGEgY2FuZGlkYXRlIGZvciBjb21waWxlcgorICAgKiAgb3B0aW1pemF0aW9ucyBzdWNoIGFzIHVucm9sbGluZykuCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yPgorICAgIGlubGluZSBwYWlyPF9JbnB1dEl0ZXJhdG9yLCBfT3V0cHV0SXRlcmF0b3I+CisgICAgY29weV9uKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9PdXRwdXRJdGVyYXRvciBfX3Jlc3VsdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGU+KQorCisgICAgICByZXR1cm4gX19nbnVfY3h4OjpfX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKKwkJCQkgc3RkOjpfX2l0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgaW50CisgICAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9JbnB1dEl0ZXJhdG9yMSBfX2ZpcnN0MSwKKwkJCQkgICBfSW5wdXRJdGVyYXRvcjEgX19sYXN0MSwKKwkJCQkgICBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisJCQkJICAgX0lucHV0SXRlcmF0b3IyIF9fbGFzdDIpCisgICAgeworICAgICAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKKwl7CisJICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQorCSAgICByZXR1cm4gLTE7CisJICBpZiAoKl9fZmlyc3QyIDwgKl9fZmlyc3QxKQorCSAgICByZXR1cm4gMTsKKwkgICsrX19maXJzdDE7CisJICArK19fZmlyc3QyOworCX0KKyAgICAgIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKQorCXJldHVybiAhKF9fZmlyc3QxID09IF9fbGFzdDEpOworICAgICAgZWxzZQorCXJldHVybiAtMTsKKyAgICB9CisKKyAgaW5saW5lIGludAorICBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QyLAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QyKQorICB7CisgICAgY29uc3QgcHRyZGlmZl90IF9fbGVuMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKKyAgICBjb25zdCBwdHJkaWZmX3QgX19sZW4yID0gX19sYXN0MiAtIF9fZmlyc3QyOworICAgIGNvbnN0IGludCBfX3Jlc3VsdCA9IF9fYnVpbHRpbl9tZW1jbXAoX19maXJzdDEsIF9fZmlyc3QyLAorCQkJCQkgIG1pbihfX2xlbjEsIF9fbGVuMikpOworICAgIHJldHVybiBfX3Jlc3VsdCAhPSAwID8gX19yZXN1bHQKKwkJCSA6IChfX2xlbjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKKyAgfQorCisgIGlubGluZSBpbnQKKyAgX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IGNoYXIqIF9fZmlyc3QxLCBjb25zdCBjaGFyKiBfX2xhc3QxLAorCQkJCSBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19sYXN0MikKKyAgeworI2lmIENIQVJfTUFYID09IFNDSEFSX01BWAorICAgIHJldHVybiBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoKGNvbnN0IHNpZ25lZCBjaGFyKikgX19maXJzdDEsCisJCQkJCSAgKGNvbnN0IHNpZ25lZCBjaGFyKikgX19sYXN0MSwKKwkJCQkJICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MiwKKwkJCQkJICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKKyNlbHNlCisgICAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAorCQkJCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0MSwKKwkJCQkJICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QyLAorCQkJCQkgIChjb25zdCB1bnNpZ25lZCBjaGFyKikgX19sYXN0Mik7CisjZW5kaWYKKyAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIEBjIG1lbWNtcCBvbiBzdGVyb2lkcy4KKyAgICogIEBwYXJhbSAgZmlyc3QxICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdDEgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgZmlyc3QyICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdDIgICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEByZXR1cm4gICBBbiBpbnQsIGFzIHdpdGggQGMgbWVtY21wLgorICAgKgorICAgKiAgVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGxlc3MgdGhhbiB6ZXJvIGlmIHRoZSBmaXJzdCByYW5nZSBpcworICAgKiAgPGVtPmxleGlncmFwaGljYWxseSBsZXNzIHRoYW48L2VtPiB0aGUgc2Vjb25kLCBncmVhdGVyIHRoYW4gemVybworICAgKiAgaWYgdGhlIHNlY29uZCByYW5nZSBpcyA8ZW0+bGV4aWdyYXBoaWNhbGx5IGxlc3MgdGhhbjwvZW0+IHRoZQorICAgKiAgZmlyc3QsIGFuZCB6ZXJvIG90aGVyd2lzZS4KKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IxLCB0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcjI+CisgICAgaW50CisgICAgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyYXRvcjEgX19maXJzdDEsCisJCQkJIF9JbnB1dEl0ZXJhdG9yMSBfX2xhc3QxLAorCQkJCSBfSW5wdXRJdGVyYXRvcjIgX19maXJzdDIsCisJCQkJIF9JbnB1dEl0ZXJhdG9yMiBfX2xhc3QyKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMT4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yMj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcjE+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTGVzc1RoYW5Db21wYXJhYmxlQ29uY2VwdDwKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9yMj46OnZhbHVlX3R5cGU+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QxLCBfX2xhc3QxKTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0MiwgX19sYXN0Mik7CisKKyAgICAgIHJldHVybiBfX2xleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19maXJzdDEsIF9fbGFzdDEsIF9fZmlyc3QyLAorCQkJCQkgICAgX19sYXN0Mik7CisgICAgfQorCisgIC8vIGNvdW50IGFuZCBjb3VudF9pZjogdGhpcyB2ZXJzaW9uLCB3aG9zZSByZXR1cm4gdHlwZSBpcyB2b2lkLCB3YXMgcHJlc2VudAorICAvLyBpbiB0aGUgSFAgU1RMLCBhbmQgaXMgcmV0YWluZWQgYXMgYW4gZXh0ZW5zaW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfU2l6ZT4KKyAgICB2b2lkCisgICAgY291bnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgY29uc3QgX1RwJiBfX3ZhbHVlLAorCSAgX1NpemUmIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0VxdWFsaXR5Q29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OnZhbHVlX3R5cGUgPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRXF1YWxpdHlDb21wYXJhYmxlQ29uY2VwdDxfVHA+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisKKyAgICAgIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlpZiAoKl9fZmlyc3QgPT0gX192YWx1ZSkKKwkgICsrX19uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1ByZWRpY2F0ZSwgdHlwZW5hbWUgX1NpemU+CisgICAgdm9pZAorICAgIGNvdW50X2lmKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgIF9QcmVkaWNhdGUgX19wcmVkLAorCSAgICAgX1NpemUmIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1VuYXJ5UHJlZGljYXRlQ29uY2VwdDxfUHJlZGljYXRlLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJaWYgKF9fcHJlZCgqX19maXJzdCkpCisJICArK19fbjsKKyAgICB9CisKKyAgLy8gcmFuZG9tX3NhbXBsZSBhbmQgcmFuZG9tX3NhbXBsZV9uIChleHRlbnNpb25zLCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQpLgorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX091dHB1dEl0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfT3V0cHV0SXRlcmF0b3IKKyAgICByYW5kb21fc2FtcGxlX24oX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBjb25zdCBfRGlzdGFuY2UgX19uKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX091dHB1dEl0ZXJhdG9yQ29uY2VwdDxfT3V0cHV0SXRlcmF0b3IsCisJCXR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgX0Rpc3RhbmNlIF9fcmVtYWluaW5nID0gc3RkOjpkaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgX0Rpc3RhbmNlIF9fbSA9IG1pbihfX24sIF9fcmVtYWluaW5nKTsKKworICAgICAgd2hpbGUgKF9fbSA+IDApCisJeworCSAgaWYgKChzdGQ6OnJhbmQoKSAlIF9fcmVtYWluaW5nKSA8IF9fbSkKKwkgICAgeworCSAgICAgICpfX291dCA9ICpfX2ZpcnN0OworCSAgICAgICsrX19vdXQ7CisJICAgICAgLS1fX207CisJICAgIH0KKwkgIC0tX19yZW1haW5pbmc7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgcmV0dXJuIF9fb3V0OworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9PdXRwdXRJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfRGlzdGFuY2UsIHR5cGVuYW1lIF9SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgX091dHB1dEl0ZXJhdG9yCisgICAgcmFuZG9tX3NhbXBsZV9uKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXJhdG9yIF9fb3V0LCBjb25zdCBfRGlzdGFuY2UgX19uLAorCQkgICBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3JhbmQpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfT3V0cHV0SXRlcmF0b3JDb25jZXB0PF9PdXRwdXRJdGVyYXRvciwKKwkJdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9Gb3J3YXJkSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlGdW5jdGlvbkNvbmNlcHQ8CisJCV9SYW5kb21OdW1iZXJHZW5lcmF0b3IsIF9EaXN0YW5jZSwgX0Rpc3RhbmNlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICBfRGlzdGFuY2UgX19yZW1haW5pbmcgPSBzdGQ6OmRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfRGlzdGFuY2UgX19tID0gbWluKF9fbiwgX19yZW1haW5pbmcpOworCisgICAgICB3aGlsZSAoX19tID4gMCkKKwl7CisJICBpZiAoX19yYW5kKF9fcmVtYWluaW5nKSA8IF9fbSkKKwkgICAgeworCSAgICAgICpfX291dCA9ICpfX2ZpcnN0OworCSAgICAgICsrX19vdXQ7CisJICAgICAgLS1fX207CisJICAgIH0KKwkgIC0tX19yZW1haW5pbmc7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgcmV0dXJuIF9fb3V0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICBfX3JhbmRvbV9zYW1wbGUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fb3V0LAorCQkgICAgY29uc3QgX0Rpc3RhbmNlIF9fbikKKyAgICB7CisgICAgICBfRGlzdGFuY2UgX19tID0gMDsKKyAgICAgIF9EaXN0YW5jZSBfX3QgPSBfX247CisgICAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0ICYmIF9fbSA8IF9fbjsgKytfX20sICsrX19maXJzdCkKKwlfX291dFtfX21dID0gKl9fZmlyc3Q7CisKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwl7CisJICArK19fdDsKKwkgIF9EaXN0YW5jZSBfX00gPSBzdGQ6OnJhbmQoKSAlIChfX3QpOworCSAgaWYgKF9fTSA8IF9fbikKKwkgICAgX19vdXRbX19NXSA9ICpfX2ZpcnN0OworCSAgKytfX2ZpcnN0OworCX0KKyAgICAgIHJldHVybiBfX291dCArIF9fbTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yCisgICAgX19yYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX291dCwKKwkJICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fcmFuZCwKKwkJICAgIGNvbnN0IF9EaXN0YW5jZSBfX24pCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfVW5hcnlGdW5jdGlvbkNvbmNlcHQ8CisJICAgIF9SYW5kb21OdW1iZXJHZW5lcmF0b3IsIF9EaXN0YW5jZSwgX0Rpc3RhbmNlPikKKworICAgICAgX0Rpc3RhbmNlIF9fbSA9IDA7CisgICAgICBfRGlzdGFuY2UgX190ID0gX19uOworICAgICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdCAmJiBfX20gPCBfX247ICsrX19tLCArK19fZmlyc3QpCisJX19vdXRbX19tXSA9ICpfX2ZpcnN0OworCisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJeworCSAgKytfX3Q7CisJICBfRGlzdGFuY2UgX19NID0gX19yYW5kKF9fdCk7CisJICBpZiAoX19NIDwgX19uKQorCSAgICBfX291dFtfX01dID0gKl9fZmlyc3Q7CisJICArK19fZmlyc3Q7CisJfQorICAgICAgcmV0dXJuIF9fb3V0ICsgX19tOworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CisgICAgaW5saW5lIF9SYW5kb21BY2Nlc3NJdGVyYXRvcgorICAgIHJhbmRvbV9zYW1wbGUoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX291dF9maXJzdCwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19vdXRfbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9JbnB1dEl0ZXJhdG9yQ29uY2VwdDxfSW5wdXRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfUmFuZG9tQWNjZXNzSXRlcmF0b3JDb25jZXB0PAorCSAgICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QpOworCisgICAgICByZXR1cm4gX19yYW5kb21fc2FtcGxlKF9fZmlyc3QsIF9fbGFzdCwKKwkJCSAgICAgX19vdXRfZmlyc3QsIF9fb3V0X2xhc3QgLSBfX291dF9maXJzdCk7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwKKwkgICB0eXBlbmFtZSBfUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgIGlubGluZSBfUmFuZG9tQWNjZXNzSXRlcmF0b3IKKyAgICByYW5kb21fc2FtcGxlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19vdXRfZmlyc3QsCisJCSAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fb3V0X2xhc3QsCisJCSAgX1JhbmRvbU51bWJlckdlbmVyYXRvciYgX19yYW5kKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0lucHV0SXRlcmF0b3JDb25jZXB0PF9JbnB1dEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfTXV0YWJsZV9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX291dF9maXJzdCwgX19vdXRfbGFzdCk7CisKKyAgICAgIHJldHVybiBfX3JhbmRvbV9zYW1wbGUoX19maXJzdCwgX19sYXN0LAorCQkJICAgICBfX291dF9maXJzdCwgX19yYW5kLAorCQkJICAgICBfX291dF9sYXN0IC0gX19vdXRfZmlyc3QpOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHVzaW5nIHN0ZDo6aXNfaGVhcDsKKyNlbHNlCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPgorICAgIGlubGluZSBib29sCisgICAgaXNfaGVhcChfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9MZXNzVGhhbkNvbXBhcmFibGVDb25jZXB0PAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgcmV0dXJuIHN0ZDo6X19pc19oZWFwKF9fZmlyc3QsIF9fbGFzdCAtIF9fZmlyc3QpOworICAgIH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyYXRvciwgdHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX2hlYXAoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCisJICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yQ29uY2VwdDwKKwkJCQkgIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQ8X1N0cmljdFdlYWtPcmRlcmluZywKKwkgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9SYW5kb21BY2Nlc3NJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+Ojp2YWx1ZV90eXBlPikKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2ZpcnN0LCBfX2xhc3QpOworCisgICAgICByZXR1cm4gc3RkOjpfX2lzX2hlYXAoX19maXJzdCwgX19jb21wLCBfX2xhc3QgLSBfX2ZpcnN0KTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHVzaW5nIHN0ZDo6aXNfc29ydGVkOworI2Vsc2UKKyAgLy8gaXNfc29ydGVkLCBhIHByZWRpY2F0ZWQgdGVzdGluZyB3aGV0aGVyIGEgcmFuZ2UgaXMgc29ydGVkIGluCisgIC8vIG5vbmRlc2NlbmRpbmcgb3JkZXIuICBUaGlzIGlzIGFuIGV4dGVuc2lvbiwgbm90IHBhcnQgb2YgdGhlIEMrKworICAvLyBzdGFuZGFyZC4KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3I+CisgICAgYm9vbAorICAgIGlzX3NvcnRlZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0ZvcndhcmRJdGVyYXRvckNvbmNlcHQ8X0ZvcndhcmRJdGVyYXRvcj4pCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8CisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiB0cnVlOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKwlpZiAoKl9fbmV4dCA8ICpfX2ZpcnN0KQorCSAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1N0cmljdFdlYWtPcmRlcmluZz4KKyAgICBib29sCisgICAgaXNfc29ydGVkKF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgX1N0cmljdFdlYWtPcmRlcmluZyBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXJhdG9yPikKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5UHJlZGljYXRlQ29uY2VwdDxfU3RyaWN0V2Vha09yZGVyaW5nLAorCSAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUsCisJICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZT4pCisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19maXJzdCwgX19sYXN0KTsKKworICAgICAgaWYgKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiB0cnVlOworCisgICAgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisgICAgICBmb3IgKCsrX19uZXh0OyBfX25leHQgIT0gX19sYXN0OyBfX2ZpcnN0ID0gX19uZXh0LCArK19fbmV4dCkKKwlpZiAoX19jb21wKCpfX25leHQsICpfX2ZpcnN0KSkKKwkgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZiAgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhyZWUgdmFsdWVzLgorICAgKiAgQHBhcmFtICBhICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBiICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBjICBBIHZhbHVlLgorICAgKiAgQHJldHVybiBPbmUgb2YgQHAgYSwgQHAgYiBvciBAcCBjLgorICAgKgorICAgKiAgSWYgQGMge2wsbSxufSBpcyBzb21lIGNvbnZvbHV0aW9uIG9mIEBwIHthLGIsY30gc3VjaCB0aGF0IEBjIGw8PW08PW4KKyAgICogIHRoZW4gdGhlIHZhbHVlIHJldHVybmVkIHdpbGwgYmUgQGMgbS4KKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNvbnN0IF9UcCYKKyAgICBfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0xlc3NUaGFuQ29tcGFyYWJsZUNvbmNlcHQ8X1RwPikKKyAgICAgIGlmIChfX2EgPCBfX2IpCisJaWYgKF9fYiA8IF9fYykKKwkgIHJldHVybiBfX2I7CisJZWxzZSBpZiAoX19hIDwgX19jKQorCSAgcmV0dXJuIF9fYzsKKwllbHNlCisJICByZXR1cm4gX19hOworICAgICAgZWxzZSBpZiAoX19hIDwgX19jKQorCXJldHVybiBfX2E7CisgICAgICBlbHNlIGlmIChfX2IgPCBfX2MpCisJcmV0dXJuIF9fYzsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19iOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBGaW5kIHRoZSBtZWRpYW4gb2YgdGhyZWUgdmFsdWVzIHVzaW5nIGEgcHJlZGljYXRlIGZvciBjb21wYXJpc29uLgorICAgKiAgQHBhcmFtICBhICAgICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBiICAgICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBjICAgICBBIHZhbHVlLgorICAgKiAgQHBhcmFtICBjb21wICBBIGJpbmFyeSBwcmVkaWNhdGUuCisgICAqICBAcmV0dXJuIE9uZSBvZiBAcCBhLCBAcCBiIG9yIEBwIGMuCisgICAqCisgICAqICBJZiBAYyB7bCxtLG59IGlzIHNvbWUgY29udm9sdXRpb24gb2YgQHAge2EsYixjfSBzdWNoIHRoYXQgQHAgY29tcChsLG0pCisgICAqICBhbmQgQHAgY29tcChtLG4pIGFyZSBib3RoIHRydWUgdGhlbiB0aGUgdmFsdWUgcmV0dXJuZWQgd2lsbCBiZSBAYyBtLgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgIGNvbnN0IF9UcCYKKyAgICBfX21lZGlhbihjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIGNvbnN0IF9UcCYgX19jLCBfQ29tcGFyZSBfX2NvbXApCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQmluYXJ5RnVuY3Rpb25Db25jZXB0PF9Db21wYXJlLCBib29sLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBfVHAsIF9UcD4pCisgICAgICBpZiAoX19jb21wKF9fYSwgX19iKSkKKwlpZiAoX19jb21wKF9fYiwgX19jKSkKKwkgIHJldHVybiBfX2I7CisJZWxzZSBpZiAoX19jb21wKF9fYSwgX19jKSkKKwkgIHJldHVybiBfX2M7CisJZWxzZQorCSAgcmV0dXJuIF9fYTsKKyAgICAgIGVsc2UgaWYgKF9fY29tcChfX2EsIF9fYykpCisJcmV0dXJuIF9fYTsKKyAgICAgIGVsc2UgaWYgKF9fY29tcChfX2IsIF9fYykpCisJcmV0dXJuIF9fYzsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19iOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0VYVF9BTEdPUklUSE0gKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2FycmF5X2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvYXJyYXlfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2MWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2FycmF5X2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTU3IEBACisvLyBhcnJheSBhbGxvY2F0b3IgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L2FycmF5X2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfQVJSQVlfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0FSUkFZX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDx0cjEvYXJyYXk+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworIHVzaW5nIHN0ZDo6c2l6ZV90OworIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworCisgIC8vLyBCYXNlIGNsYXNzLgorIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBhcnJheV9hbGxvY2F0b3JfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIAlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIAl2YWx1ZV90eXBlOworCisgICAgICBwb2ludGVyCisgICAgICBhZGRyZXNzKHJlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBjb25zdF9wb2ludGVyCisgICAgICBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIsIHNpemVfdHlwZSkKKyAgICAgIHsgCisJLy8gRG9lcyBub3RoaW5nLgorICAgICAgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgdGhyb3coKSAKKyAgICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MDIuIHdyb25nIG5ldyBleHByZXNzaW9uIGluIFtzb21lX10gYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIHZvaWQgCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIAorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgdmFsdWVfdHlwZShfX3ZhbCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9UcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgdm9pZCAKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KKyAgICB9OyAgCisKKyAgLyoqCisgICAqICBAYnJpZWYgIEFuIGFsbG9jYXRvciB0aGF0IHVzZXMgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5LgorICAgKiAgVGhpcyBtZW1vcnkgY2FuIGJlIGV4dGVybmFsbHksIGdsb2JhbGx5LCBvciBvdGhlcndpc2UgYWxsb2NhdGVkLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJyYXkgPSBzdGQ6OnRyMTo6YXJyYXk8X1RwLCAxPiA+CisgICAgY2xhc3MgYXJyYXlfYWxsb2NhdG9yIDogcHVibGljIGFycmF5X2FsbG9jYXRvcl9iYXNlPF9UcD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgICAgIAlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICAJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAJcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIAljb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BcnJheQkJYXJyYXlfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBhcnJheV90eXBlKiAJX01fYXJyYXk7CisgICAgICBzaXplX3R5cGUgCV9NX3VzZWQ7CisKKyAgICBwdWJsaWM6CisgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9BcnJheTEgPSBfQXJyYXk+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIGFycmF5X2FsbG9jYXRvcjxfVHAxLCBfQXJyYXkxPiBvdGhlcjsgfTsKKworICAgICAgYXJyYXlfYWxsb2NhdG9yKGFycmF5X3R5cGUqIF9fYXJyYXkgPSAwKSB0aHJvdygpIAorICAgICAgOiBfTV9hcnJheShfX2FycmF5KSwgX01fdXNlZChzaXplX3R5cGUoKSkgeyB9CisKKyAgICAgIGFycmF5X2FsbG9jYXRvcihjb25zdCBhcnJheV9hbGxvY2F0b3ImIF9fbykgIHRocm93KCkgCisgICAgICA6IF9NX2FycmF5KF9fby5fTV9hcnJheSksIF9NX3VzZWQoX19vLl9NX3VzZWQpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfQXJyYXkxPgorICAgICAgICBhcnJheV9hbGxvY2F0b3IoY29uc3QgYXJyYXlfYWxsb2NhdG9yPF9UcDEsIF9BcnJheTE+JikgdGhyb3coKQorCTogX01fYXJyYXkoMCksIF9NX3VzZWQoc2l6ZV90eXBlKCkpIHsgfQorCisgICAgICB+YXJyYXlfYWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKQorICAgICAgeworCWlmIChfTV9hcnJheSA9PSAwIHx8IF9NX3VzZWQgKyBfX24gPiBfTV9hcnJheS0+c2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCXBvaW50ZXIgX19yZXQgPSBfTV9hcnJheS0+YmVnaW4oKSArIF9NX3VzZWQ7CisJX01fdXNlZCArPSBfX247CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJyYXk+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5X2FsbG9jYXRvcjxfVHAsIF9BcnJheT4mLAorCSAgICAgICBjb25zdCBhcnJheV9hbGxvY2F0b3I8X1RwLCBfQXJyYXk+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BcnJheT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXlfYWxsb2NhdG9yPF9UcCwgX0FycmF5PiYsIAorCSAgICAgICBjb25zdCBhcnJheV9hbGxvY2F0b3I8X1RwLCBfQXJyYXk+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvYXRvbWljaXR5LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9hdG9taWNpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM3NzUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvYXRvbWljaXR5LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vIFN1cHBvcnQgZm9yIGF0b21pYyBvcGVyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9hdG9taWNpdHkuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDSVRZX0gKKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDSVRZX0gJMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4KKyNpbmNsdWRlIDxiaXRzL2F0b21pY193b3JkLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBGdW5jdGlvbnMgZm9yIHBvcnRhYmxlIGF0b21pYyBhY2Nlc3MuCisgIC8vIFRvIGFic3RyYWN0IGxvY2tpbmcgcHJpbWl0aXZlcyBhY3Jvc3MgYWxsIHRocmVhZCBwb2xpY2llcywgdXNlOgorICAvLyBfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2gKKyAgLy8gX19hdG9taWNfYWRkX2Rpc3BhdGNoCisjaWZkZWYgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzQKKyAgc3RhdGljIGlubGluZSBfQXRvbWljX3dvcmQgCisgIF9fZXhjaGFuZ2VfYW5kX2FkZCh2b2xhdGlsZSBfQXRvbWljX3dvcmQqIF9fbWVtLCBpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKF9fbWVtLCBfX3ZhbCk7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgX19hdG9taWNfYWRkKHZvbGF0aWxlIF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeyBfX3N5bmNfZmV0Y2hfYW5kX2FkZChfX21lbSwgX192YWwpOyB9CisjZWxzZQorICBfQXRvbWljX3dvcmQKKyAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorICBfX2V4Y2hhbmdlX2FuZF9hZGQodm9sYXRpbGUgX0F0b21pY193b3JkKiwgaW50KSB0aHJvdyAoKTsKKworICB2b2lkCisgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyAgX19hdG9taWNfYWRkKHZvbGF0aWxlIF9BdG9taWNfd29yZCosIGludCkgdGhyb3cgKCk7CisjZW5kaWYKKworICBzdGF0aWMgaW5saW5lIF9BdG9taWNfd29yZAorICBfX2V4Y2hhbmdlX2FuZF9hZGRfc2luZ2xlKF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeworICAgIF9BdG9taWNfd29yZCBfX3Jlc3VsdCA9ICpfX21lbTsKKyAgICAqX19tZW0gKz0gX192YWw7CisgICAgcmV0dXJuIF9fcmVzdWx0OworICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkCisgIF9fYXRvbWljX2FkZF9zaW5nbGUoX0F0b21pY193b3JkKiBfX21lbSwgaW50IF9fdmFsKQorICB7ICpfX21lbSArPSBfX3ZhbDsgfQorCisgIHN0YXRpYyBpbmxpbmUgX0F0b21pY193b3JkCisgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyAgX19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeworI2lmZGVmIF9fR1RIUkVBRFMKKyAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisgICAgICByZXR1cm4gX19leGNoYW5nZV9hbmRfYWRkKF9fbWVtLCBfX3ZhbCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9fZXhjaGFuZ2VfYW5kX2FkZF9zaW5nbGUoX19tZW0sIF9fdmFsKTsKKyNlbHNlCisgICAgcmV0dXJuIF9fZXhjaGFuZ2VfYW5kX2FkZF9zaW5nbGUoX19tZW0sIF9fdmFsKTsKKyNlbmRpZgorICB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkCisgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyAgX19hdG9taWNfYWRkX2Rpc3BhdGNoKF9BdG9taWNfd29yZCogX19tZW0sIGludCBfX3ZhbCkKKyAgeworI2lmZGVmIF9fR1RIUkVBRFMKKyAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisgICAgICBfX2F0b21pY19hZGQoX19tZW0sIF9fdmFsKTsKKyAgICBlbHNlCisgICAgICBfX2F0b21pY19hZGRfc2luZ2xlKF9fbWVtLCBfX3ZhbCk7CisjZWxzZQorICAgIF9fYXRvbWljX2FkZF9zaW5nbGUoX19tZW0sIF9fdmFsKTsKKyNlbmRpZgorICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworLy8gRXZlbiBpZiB0aGUgQ1BVIGRvZXNuJ3QgbmVlZCBhIG1lbW9yeSBiYXJyaWVyLCB3ZSBuZWVkIHRvIGVuc3VyZQorLy8gdGhhdCB0aGUgY29tcGlsZXIgZG9lc24ndCByZW9yZGVyIG1lbW9yeSBhY2Nlc3NlcyBhY3Jvc3MgdGhlCisvLyBiYXJyaWVycy4KKyNpZm5kZWYgX0dMSUJDWFhfUkVBRF9NRU1fQkFSUklFUgorI2RlZmluZSBfR0xJQkNYWF9SRUFEX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfV1JJVEVfTUVNX0JBUlJJRVIKKyNkZWZpbmUgX0dMSUJDWFhfV1JJVEVfTUVNX0JBUlJJRVIgX19hc20gX192b2xhdGlsZSAoIiI6OjoibWVtb3J5IikKKyNlbmRpZgorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9iaXRtYXBfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9iaXRtYXBfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5M2MyYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2JpdG1hcF9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDExMTIgQEAKKy8vIEJpdG1hcCBBbGxvY2F0b3IuIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9iaXRtYXBfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9CSVRNQVBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0JJVE1BUF9BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PiAvLyBGb3Igc3RkOjpwYWlyLgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4gLy8gRm9yIF9fdGhyb3dfYmFkX2FsbG9jKCkuCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gRm9yIGdyZWF0ZXJfZXF1YWwsIGFuZCBsZXNzX2VxdWFsLgorI2luY2x1ZGUgPG5ldz4gLy8gRm9yIG9wZXJhdG9yIG5ldy4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPiAvLyBfR0xJQkNYWF9ERUJVR19BU1NFUlQKKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworLyoqIEBicmllZiBUaGUgY29uc3RhbnQgaW4gdGhlIGV4cHJlc3Npb24gYmVsb3cgaXMgdGhlIGFsaWdubWVudAorICogcmVxdWlyZWQgaW4gYnl0ZXMuCisgKi8KKyNkZWZpbmUgX0JBTExPQ19BTElHTl9CWVRFUyA4CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgICAvKiogQGNsYXNzICBfX21pbmlfdmVjdG9yIGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICAgKgorICAgICAqICBAYnJpZWYgIF9fbWluaV92ZWN0b3I8PiBpcyBhIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiB0aGUKKyAgICAgKiAgZnVsbC1mbGVkZ2VkIHN0ZDo6dmVjdG9yPD4uCisgICAgICoKKyAgICAgKiAgSXQgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciBidWlsdC1pbiB0eXBlcyBvciBQT0RzLiBOb3RhYmxlCisgICAgICogIGRpZmZlcmVuY2VzIGFyZToKKyAgICAgKiAKKyAgICAgKiAgQGRldGFpbAorICAgICAqICAxLiBOb3QgYWxsIGFjY2Vzc29yIGZ1bmN0aW9ucyBhcmUgcHJlc2VudC4KKyAgICAgKiAgMi4gVXNlZCBPTkxZIGZvciBQT0RzLgorICAgICAqICAzLiBObyBBbGxvY2F0b3IgdGVtcGxhdGUgYXJndW1lbnQuIFVzZXMgOjpvcGVyYXRvciBuZXcoKSB0byBnZXQKKyAgICAgKiAgbWVtb3J5LCBhbmQgOjpvcGVyYXRvciBkZWxldGUoKSB0byBmcmVlIGl0LgorICAgICAqICBDYXZlYXQ6IFRoZSBkdG9yIGRvZXMgTk9UIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQsIHNvIHRoaXMgYQorICAgICAqICBtZW1vcnktbGVha2luZyB2ZWN0b3IhCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX19taW5pX3ZlY3RvcgorICAgICAgeworCV9fbWluaV92ZWN0b3IoY29uc3QgX19taW5pX3ZlY3RvciYpOworCV9fbWluaV92ZWN0b3ImIG9wZXJhdG9yPShjb25zdCBfX21pbmlfdmVjdG9yJik7CisKKyAgICAgIHB1YmxpYzoKKwl0eXBlZGVmIF9UcCB2YWx1ZV90eXBlOworCXR5cGVkZWYgX1RwKiBwb2ludGVyOworCXR5cGVkZWYgX1RwJiByZWZlcmVuY2U7CisJdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKwl0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisJdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworCXR5cGVkZWYgcG9pbnRlciBpdGVyYXRvcjsKKworICAgICAgcHJpdmF0ZToKKwlwb2ludGVyIF9NX3N0YXJ0OworCXBvaW50ZXIgX01fZmluaXNoOworCXBvaW50ZXIgX01fZW5kX29mX3N0b3JhZ2U7CisKKwlzaXplX3R5cGUKKwlfTV9zcGFjZV9sZWZ0KCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fZmluaXNoOyB9CisKKwlwb2ludGVyCisJYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKwl7IHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPig6Om9wZXJhdG9yIG5ldyhfX24gKiBzaXplb2YoX1RwKSkpOyB9CisKKwl2b2lkCisJZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlKQorCXsgOjpvcGVyYXRvciBkZWxldGUoX19wKTsgfQorCisgICAgICBwdWJsaWM6CisJLy8gTWVtYmVycyB1c2VkOiBzaXplKCksIHB1c2hfYmFjaygpLCBwb3BfYmFjaygpLAorCS8vIGluc2VydChpdGVyYXRvciwgY29uc3RfcmVmZXJlbmNlKSwgZXJhc2UoaXRlcmF0b3IpLAorCS8vIGJlZ2luKCksIGVuZCgpLCBiYWNrKCksIG9wZXJhdG9yW10uCisKKwlfX21pbmlfdmVjdG9yKCkKKyAgICAgICAgOiBfTV9zdGFydCgwKSwgX01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSB7IH0KKworCXNpemVfdHlwZQorCXNpemUoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fZmluaXNoIC0gX01fc3RhcnQ7IH0KKworCWl0ZXJhdG9yCisJYmVnaW4oKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gdGhpcy0+X01fc3RhcnQ7IH0KKworCWl0ZXJhdG9yCisJZW5kKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIHRoaXMtPl9NX2ZpbmlzaDsgfQorCisJcmVmZXJlbmNlCisJYmFjaygpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiAqKHRoaXMtPmVuZCgpIC0gMSk7IH0KKworCXJlZmVyZW5jZQorCW9wZXJhdG9yW10oY29uc3Qgc2l6ZV90eXBlIF9fcG9zKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gdGhpcy0+X01fc3RhcnRbX19wb3NdOyB9CisKKwl2b2lkCisJaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBjb25zdF9yZWZlcmVuY2UgX194KTsKKworCXZvaWQKKwlwdXNoX2JhY2soY29uc3RfcmVmZXJlbmNlIF9feCkKKwl7CisJICBpZiAodGhpcy0+X01fc3BhY2VfbGVmdCgpKQorCSAgICB7CisJICAgICAgKnRoaXMtPmVuZCgpID0gX194OworCSAgICAgICsrdGhpcy0+X01fZmluaXNoOworCSAgICB9CisJICBlbHNlCisJICAgIHRoaXMtPmluc2VydCh0aGlzLT5lbmQoKSwgX194KTsKKwl9CisKKwl2b2lkCisJcG9wX2JhY2soKSB0aHJvdygpCisJeyAtLXRoaXMtPl9NX2ZpbmlzaDsgfQorCisJdm9pZAorCWVyYXNlKGl0ZXJhdG9yIF9fcG9zKSB0aHJvdygpOworCisJdm9pZAorCWNsZWFyKCkgdGhyb3coKQorCXsgdGhpcy0+X01fZmluaXNoID0gdGhpcy0+X01fc3RhcnQ7IH0KKyAgICAgIH07CisKKyAgICAvLyBPdXQgb2YgbGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICB2b2lkIF9fbWluaV92ZWN0b3I8X1RwPjo6CisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0X3JlZmVyZW5jZSBfX3gpCisgICAgICB7CisJaWYgKHRoaXMtPl9NX3NwYWNlX2xlZnQoKSkKKwkgIHsKKwkgICAgc2l6ZV90eXBlIF9fdG9fbW92ZSA9IHRoaXMtPl9NX2ZpbmlzaCAtIF9fcG9zOworCSAgICBpdGVyYXRvciBfX2Rlc3QgPSB0aGlzLT5lbmQoKTsKKwkgICAgaXRlcmF0b3IgX19zcmMgPSB0aGlzLT5lbmQoKSAtIDE7CisKKwkgICAgKyt0aGlzLT5fTV9maW5pc2g7CisJICAgIHdoaWxlIChfX3RvX21vdmUpCisJICAgICAgeworCQkqX19kZXN0ID0gKl9fc3JjOworCQktLV9fZGVzdDsgLS1fX3NyYzsgLS1fX3RvX21vdmU7CisJICAgICAgfQorCSAgICAqX19wb3MgPSBfX3g7CisJICB9CisJZWxzZQorCSAgeworCSAgICBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IHRoaXMtPnNpemUoKSA/IHRoaXMtPnNpemUoKSAqIDIgOiAxOworCSAgICBpdGVyYXRvciBfX25ld19zdGFydCA9IHRoaXMtPmFsbG9jYXRlKF9fbmV3X3NpemUpOworCSAgICBpdGVyYXRvciBfX2ZpcnN0ID0gdGhpcy0+YmVnaW4oKTsKKwkgICAgaXRlcmF0b3IgX19zdGFydCA9IF9fbmV3X3N0YXJ0OworCSAgICB3aGlsZSAoX19maXJzdCAhPSBfX3BvcykKKwkgICAgICB7CisJCSpfX3N0YXJ0ID0gKl9fZmlyc3Q7CisJCSsrX19zdGFydDsgKytfX2ZpcnN0OworCSAgICAgIH0KKwkgICAgKl9fc3RhcnQgPSBfX3g7CisJICAgICsrX19zdGFydDsKKwkgICAgd2hpbGUgKF9fZmlyc3QgIT0gdGhpcy0+ZW5kKCkpCisJICAgICAgeworCQkqX19zdGFydCA9ICpfX2ZpcnN0OworCQkrK19fc3RhcnQ7ICsrX19maXJzdDsKKwkgICAgICB9CisJICAgIGlmICh0aGlzLT5fTV9zdGFydCkKKwkgICAgICB0aGlzLT5kZWFsbG9jYXRlKHRoaXMtPl9NX3N0YXJ0LCB0aGlzLT5zaXplKCkpOworCisJICAgIHRoaXMtPl9NX3N0YXJ0ID0gX19uZXdfc3RhcnQ7CisJICAgIHRoaXMtPl9NX2ZpbmlzaCA9IF9fc3RhcnQ7CisJICAgIHRoaXMtPl9NX2VuZF9vZl9zdG9yYWdlID0gdGhpcy0+X01fc3RhcnQgKyBfX25ld19zaXplOworCSAgfQorICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgdm9pZCBfX21pbmlfdmVjdG9yPF9UcD46OgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3MpIHRocm93KCkKKyAgICAgIHsKKwl3aGlsZSAoX19wb3MgKyAxICE9IHRoaXMtPmVuZCgpKQorCSAgeworCSAgICAqX19wb3MgPSBfX3Bvc1sxXTsKKwkgICAgKytfX3BvczsKKwkgIH0KKwktLXRoaXMtPl9NX2ZpbmlzaDsKKyAgICAgIH0KKworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgc3RydWN0IF9fbXZfaXRlcl90cmFpdHMKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9UcDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX1RwOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIHN0cnVjdCBfX212X2l0ZXJfdHJhaXRzPF9UcCo+CisgICAgICB7CisJdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKwl0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB9OworCisgICAgZW51bSAKKyAgICAgIHsgCisJYml0c19wZXJfYnl0ZSA9IDgsCisJYml0c19wZXJfYmxvY2sgPSBzaXplb2Yoc2l6ZV90KSAqIHNpemVfdChiaXRzX3Blcl9ieXRlKSAKKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm9yd2FyZEl0ZXJhdG9yLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlPgorICAgICAgX0ZvcndhcmRJdGVyYXRvcgorICAgICAgX19sb3dlcl9ib3VuZChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCQkgICAgY29uc3QgX1RwJiBfX3ZhbCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX19tdl9pdGVyX3RyYWl0czxfRm9yd2FyZEl0ZXJhdG9yPjo6dmFsdWVfdHlwZQorCSAgX1ZhbHVlVHlwZTsKKwl0eXBlZGVmIHR5cGVuYW1lIF9fbXZfaXRlcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorCSAgX0Rpc3RhbmNlVHlwZTsKKworCV9EaXN0YW5jZVR5cGUgX19sZW4gPSBfX2xhc3QgLSBfX2ZpcnN0OworCV9EaXN0YW5jZVR5cGUgX19oYWxmOworCV9Gb3J3YXJkSXRlcmF0b3IgX19taWRkbGU7CisKKwl3aGlsZSAoX19sZW4gPiAwKQorCSAgeworCSAgICBfX2hhbGYgPSBfX2xlbiA+PiAxOworCSAgICBfX21pZGRsZSA9IF9fZmlyc3Q7CisJICAgIF9fbWlkZGxlICs9IF9faGFsZjsKKwkgICAgaWYgKF9fY29tcCgqX19taWRkbGUsIF9fdmFsKSkKKwkgICAgICB7CisJCV9fZmlyc3QgPSBfX21pZGRsZTsKKwkJKytfX2ZpcnN0OworCQlfX2xlbiA9IF9fbGVuIC0gX19oYWxmIC0gMTsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICBfX2xlbiA9IF9faGFsZjsKKwkgIH0KKwlyZXR1cm4gX19maXJzdDsKKyAgICAgIH0KKworICAgIC8qKiBAYnJpZWYgVGhlIG51bWJlciBvZiBCbG9ja3MgcG9pbnRlZCB0byBieSB0aGUgYWRkcmVzcyBwYWlyCisgICAgICogIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FkZHJQYWlyPgorICAgICAgaW5saW5lIHNpemVfdAorICAgICAgX19udW1fYmxvY2tzKF9BZGRyUGFpciBfX2FwKQorICAgICAgeyByZXR1cm4gKF9fYXAuc2Vjb25kIC0gX19hcC5maXJzdCkgKyAxOyB9CisKKyAgICAvKiogQGJyaWVmIFRoZSBudW1iZXIgb2YgQml0LW1hcHMgcG9pbnRlZCB0byBieSB0aGUgYWRkcmVzcyBwYWlyCisgICAgICogIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FkZHJQYWlyPgorICAgICAgaW5saW5lIHNpemVfdAorICAgICAgX19udW1fYml0bWFwcyhfQWRkclBhaXIgX19hcCkKKyAgICAgIHsgcmV0dXJuIF9fbnVtX2Jsb2NrcyhfX2FwKSAvIHNpemVfdChiaXRzX3Blcl9ibG9jayk7IH0KKworICAgIC8vIF9UcCBzaG91bGQgYmUgYSBwb2ludGVyIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX0luY2x1c2l2ZV9iZXR3ZWVuIAorICAgICAgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBzdGQ6OnBhaXI8X1RwLCBfVHA+LCBib29sPgorICAgICAgeworCXR5cGVkZWYgX1RwIHBvaW50ZXI7CisJcG9pbnRlciBfTV9wdHJfdmFsdWU7CisJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBhaXI8X1RwLCBfVHA+IF9CbG9ja19wYWlyOworCQorICAgICAgcHVibGljOgorCV9JbmNsdXNpdmVfYmV0d2Vlbihwb2ludGVyIF9fcHRyKSA6IF9NX3B0cl92YWx1ZShfX3B0cikgCisJeyB9CisJCisJYm9vbCAKKwlvcGVyYXRvcigpKF9CbG9ja19wYWlyIF9fYnApIGNvbnN0IHRocm93KCkKKwl7CisJICBpZiAoc3RkOjpsZXNzX2VxdWFsPHBvaW50ZXI+KCkoX01fcHRyX3ZhbHVlLCBfX2JwLnNlY29uZCkgCisJICAgICAgJiYgc3RkOjpncmVhdGVyX2VxdWFsPHBvaW50ZXI+KCkoX01fcHRyX3ZhbHVlLCBfX2JwLmZpcnN0KSkKKwkgICAgcmV0dXJuIHRydWU7CisJICBlbHNlCisJICAgIHJldHVybiBmYWxzZTsKKwl9CisgICAgICB9OworICAKKyAgICAvLyBVc2VkIHRvIHBhc3MgYSBGdW5jdG9yIHRvIGZ1bmN0aW9ucyBieSByZWZlcmVuY2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfRnVuY3Rvcl9SZWYgCisgICAgICA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9GdW5jdG9yOjphcmd1bWVudF90eXBlLCAKKwkJCQkgICB0eXBlbmFtZSBfRnVuY3Rvcjo6cmVzdWx0X3R5cGU+CisgICAgICB7CisJX0Z1bmN0b3ImIF9NX2ZyZWY7CisJCisgICAgICBwdWJsaWM6CisJdHlwZWRlZiB0eXBlbmFtZSBfRnVuY3Rvcjo6YXJndW1lbnRfdHlwZSBhcmd1bWVudF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0Z1bmN0b3I6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworCisJX0Z1bmN0b3JfUmVmKF9GdW5jdG9yJiBfX2ZyZWYpIDogX01fZnJlZihfX2ZyZWYpIAorCXsgfQorCisJcmVzdWx0X3R5cGUgCisJb3BlcmF0b3IoKShhcmd1bWVudF90eXBlIF9fYXJnKSAKKwl7IHJldHVybiBfTV9mcmVmKF9fYXJnKTsgfQorICAgICAgfTsKKworICAgIC8qKiBAY2xhc3MgIF9GZml0X2ZpbmRlciBiaXRtYXBfYWxsb2NhdG9yLmggYml0bWFwX2FsbG9jYXRvci5oCisgICAgICoKKyAgICAgKiAgQGJyaWVmICBUaGUgY2xhc3Mgd2hpY2ggYWN0cyBhcyBhIHByZWRpY2F0ZSBmb3IgYXBwbHlpbmcgdGhlCisgICAgICogIGZpcnN0LWZpdCBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY3kgZm9yIHRoZSBiaXRtYXAgYWxsb2NhdG9yLgorICAgICAqLworICAgIC8vIF9UcCBzaG91bGQgYmUgYSBwb2ludGVyIHR5cGUsIGFuZCBfQWxsb2MgaXMgdGhlIEFsbG9jYXRvciBmb3IKKyAgICAvLyB0aGUgdmVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIGNsYXNzIF9GZml0X2ZpbmRlciAKKyAgICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgc3RkOjpwYWlyPF9UcCwgX1RwPiwgYm9vbD4KKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cGFpcjxfVHAsIF9UcD4gX0Jsb2NrX3BhaXI7CisJdHlwZWRlZiB0eXBlbmFtZSBfX2RldGFpbDo6X19taW5pX3ZlY3RvcjxfQmxvY2tfcGFpcj4gX0JQVmVjdG9yOworCXR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjpkaWZmZXJlbmNlX3R5cGUgX0NvdW50ZXJfdHlwZTsKKworCXNpemVfdCogX01fcGJpdG1hcDsKKwlfQ291bnRlcl90eXBlIF9NX2RhdGFfb2Zmc2V0OworCisgICAgICBwdWJsaWM6CisJX0ZmaXRfZmluZGVyKCkgOiBfTV9wYml0bWFwKDApLCBfTV9kYXRhX29mZnNldCgwKQorCXsgfQorCisJYm9vbCAKKwlvcGVyYXRvcigpKF9CbG9ja19wYWlyIF9fYnApIHRocm93KCkKKwl7CisJICAvLyBTZXQgdGhlIF9yb3ZlciB0byB0aGUgbGFzdCBwaHlzaWNhbCBsb2NhdGlvbiBiaXRtYXAsCisJICAvLyB3aGljaCBpcyB0aGUgYml0bWFwIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGZpcnN0IGZyZWUKKwkgIC8vIGJsb2NrLiBUaHVzLCB0aGUgYml0bWFwcyBhcmUgaW4gZXhhY3QgcmV2ZXJzZSBvcmRlciBvZgorCSAgLy8gdGhlIGFjdHVhbCBtZW1vcnkgbGF5b3V0LiBTbywgd2UgY291bnQgZG93biB0aGUgYml0bWFwcywKKwkgIC8vIHdoaWNoIGlzIHRoZSBzYW1lIGFzIG1vdmluZyB1cCB0aGUgbWVtb3J5LgorCisJICAvLyBJZiB0aGUgdXNlZCBjb3VudCBzdG9yZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBCaXQgTWFwIGhlYWRlcnMKKwkgIC8vIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgT2JqZWN0cyB0aGF0IHRoZSBjdXJyZW50IEJsb2NrIGNhbgorCSAgLy8gc3RvcmUsIHRoZW4gdGhlcmUgaXMgZGVmaW5pdGVseSBubyBzcGFjZSBmb3IgYW5vdGhlciBzaW5nbGUKKwkgIC8vIG9iamVjdCwgc28ganVzdCByZXR1cm4gZmFsc2UuCisJICBfQ291bnRlcl90eXBlIF9fZGlmZiA9IF9fZGV0YWlsOjpfX251bV9iaXRtYXBzKF9fYnApOworCisJICBpZiAoKihyZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJCShfX2JwLmZpcnN0KSAtIChfX2RpZmYgKyAxKSkgPT0gX19kZXRhaWw6Ol9fbnVtX2Jsb2NrcyhfX2JwKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJICBzaXplX3QqIF9fcm92ZXIgPSByZWludGVycHJldF9jYXN0PHNpemVfdCo+KF9fYnAuZmlyc3QpIC0gMTsKKworCSAgZm9yIChfQ291bnRlcl90eXBlIF9faSA9IDA7IF9faSA8IF9fZGlmZjsgKytfX2kpCisJICAgIHsKKwkgICAgICBfTV9kYXRhX29mZnNldCA9IF9faTsKKwkgICAgICBpZiAoKl9fcm92ZXIpCisJCXsKKwkJICBfTV9wYml0bWFwID0gX19yb3ZlcjsKKwkJICByZXR1cm4gdHJ1ZTsKKwkJfQorCSAgICAgIC0tX19yb3ZlcjsKKwkgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKyAgICAKKwlzaXplX3QqCisJX01fZ2V0KCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX3BiaXRtYXA7IH0KKworCV9Db3VudGVyX3R5cGUKKwlfTV9vZmZzZXQoKSBjb25zdCB0aHJvdygpCisJeyByZXR1cm4gX01fZGF0YV9vZmZzZXQgKiBzaXplX3QoYml0c19wZXJfYmxvY2spOyB9CisgICAgICB9OworCisgICAgLyoqIEBjbGFzcyAgX0JpdG1hcF9jb3VudGVyIGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICAgKgorICAgICAqICBAYnJpZWYgIFRoZSBiaXRtYXAgY291bnRlciB3aGljaCBhY3RzIGFzIHRoZSBiaXRtYXAKKyAgICAgKiAgbWFuaXB1bGF0b3IsIGFuZCBtYW5hZ2VzIHRoZSBiaXQtbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBhbmQKKyAgICAgKiAgdGhlIHNlYXJjaGluZyBhbmQgaWRlbnRpZmljYXRpb24gZnVuY3Rpb25zIG9uIHRoZSBiaXQtbWFwLgorICAgICAqLworICAgIC8vIF9UcCBzaG91bGQgYmUgYSBwb2ludGVyIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY2xhc3MgX0JpdG1hcF9jb3VudGVyCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZQorCV9fZGV0YWlsOjpfX21pbmlfdmVjdG9yPHR5cGVuYW1lIHN0ZDo6cGFpcjxfVHAsIF9UcD4gPiBfQlBWZWN0b3I7CisJdHlwZWRlZiB0eXBlbmFtZSBfQlBWZWN0b3I6OnNpemVfdHlwZSBfSW5kZXhfdHlwZTsKKwl0eXBlZGVmIF9UcCBwb2ludGVyOworCisJX0JQVmVjdG9yJiBfTV92YnA7CisJc2l6ZV90KiBfTV9jdXJyX2JtYXA7CisJc2l6ZV90KiBfTV9sYXN0X2JtYXBfaW5fYmxvY2s7CisJX0luZGV4X3R5cGUgX01fY3Vycl9pbmRleDsKKyAgICAKKyAgICAgIHB1YmxpYzoKKwkvLyBVc2UgdGhlIDJuZCBwYXJhbWV0ZXIgd2l0aCBjYXJlLiBNYWtlIHN1cmUgdGhhdCBzdWNoIGFuCisJLy8gZW50cnkgZXhpc3RzIGluIHRoZSB2ZWN0b3IgYmVmb3JlIHBhc3NpbmcgdGhhdCBwYXJ0aWN1bGFyCisJLy8gaW5kZXggdG8gdGhpcyBjdG9yLgorCV9CaXRtYXBfY291bnRlcihfQlBWZWN0b3ImIFJ2YnAsIGxvbmcgX19pbmRleCA9IC0xKSA6IF9NX3ZicChSdmJwKQorCXsgdGhpcy0+X01fcmVzZXQoX19pbmRleCk7IH0KKyAgICAKKwl2b2lkIAorCV9NX3Jlc2V0KGxvbmcgX19pbmRleCA9IC0xKSB0aHJvdygpCisJeworCSAgaWYgKF9faW5kZXggPT0gLTEpCisJICAgIHsKKwkgICAgICBfTV9jdXJyX2JtYXAgPSAwOworCSAgICAgIF9NX2N1cnJfaW5kZXggPSBzdGF0aWNfY2FzdDxfSW5kZXhfdHlwZT4oLTEpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBfTV9jdXJyX2luZGV4ID0gX19pbmRleDsKKwkgIF9NX2N1cnJfYm1hcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4KKwkgICAgKF9NX3ZicFtfTV9jdXJyX2luZGV4XS5maXJzdCkgLSAxOworCSAgCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19pbmRleCA8PSAobG9uZylfTV92YnAuc2l6ZSgpIC0gMSk7CisJCisJICBfTV9sYXN0X2JtYXBfaW5fYmxvY2sgPSBfTV9jdXJyX2JtYXAKKwkgICAgLSAoKF9NX3ZicFtfTV9jdXJyX2luZGV4XS5zZWNvbmQgCisJCS0gX01fdmJwW19NX2N1cnJfaW5kZXhdLmZpcnN0ICsgMSkgCisJICAgICAgIC8gc2l6ZV90KGJpdHNfcGVyX2Jsb2NrKSAtIDEpOworCX0KKyAgICAKKwkvLyBEYW5nZXJvdXMgRnVuY3Rpb24hIFVzZSB3aXRoIGV4dHJlbWUgY2FyZS4gUGFzcyB0byB0aGlzCisJLy8gZnVuY3Rpb24gT05MWSB0aG9zZSB2YWx1ZXMgdGhhdCBhcmUga25vd24gdG8gYmUgY29ycmVjdCwKKwkvLyBvdGhlcndpc2UgdGhpcyB3aWxsIG1lc3MgdXAgYmlnIHRpbWUuCisJdm9pZAorCV9NX3NldF9pbnRlcm5hbF9iaXRtYXAoc2l6ZV90KiBfX25ld19pbnRlcm5hbF9tYXJrZXIpIHRocm93KCkKKwl7IF9NX2N1cnJfYm1hcCA9IF9fbmV3X2ludGVybmFsX21hcmtlcjsgfQorICAgIAorCWJvb2wKKwlfTV9maW5pc2hlZCgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybihfTV9jdXJyX2JtYXAgPT0gMCk7IH0KKyAgICAKKwlfQml0bWFwX2NvdW50ZXImCisJb3BlcmF0b3IrKygpIHRocm93KCkKKwl7CisJICBpZiAoX01fY3Vycl9ibWFwID09IF9NX2xhc3RfYm1hcF9pbl9ibG9jaykKKwkgICAgeworCSAgICAgIGlmICgrK19NX2N1cnJfaW5kZXggPT0gX01fdmJwLnNpemUoKSkKKwkJX01fY3Vycl9ibWFwID0gMDsKKwkgICAgICBlbHNlCisJCXRoaXMtPl9NX3Jlc2V0KF9NX2N1cnJfaW5kZXgpOworCSAgICB9CisJICBlbHNlCisJICAgIC0tX01fY3Vycl9ibWFwOworCSAgcmV0dXJuICp0aGlzOworCX0KKyAgICAKKwlzaXplX3QqCisJX01fZ2V0KCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2N1cnJfYm1hcDsgfQorICAgIAorCXBvaW50ZXIgCisJX01fYmFzZSgpIGNvbnN0IHRocm93KCkKKwl7IHJldHVybiBfTV92YnBbX01fY3Vycl9pbmRleF0uZmlyc3Q7IH0KKworCV9JbmRleF90eXBlCisJX01fb2Zmc2V0KCkgY29uc3QgdGhyb3coKQorCXsKKwkgIHJldHVybiBzaXplX3QoYml0c19wZXJfYmxvY2spCisJICAgICogKChyZWludGVycHJldF9jYXN0PHNpemVfdCo+KHRoaXMtPl9NX2Jhc2UoKSkgCisJCS0gX01fY3Vycl9ibWFwKSAtIDEpOworCX0KKyAgICAKKwlfSW5kZXhfdHlwZQorCV9NX3doZXJlKCkgY29uc3QgdGhyb3coKQorCXsgcmV0dXJuIF9NX2N1cnJfaW5kZXg7IH0KKyAgICAgIH07CisKKyAgICAvKiogQGJyaWVmICBNYXJrIGEgbWVtb3J5IGFkZHJlc3MgYXMgYWxsb2NhdGVkIGJ5IHJlLXNldHRpbmcgdGhlCisgICAgICogIGNvcnJlc3BvbmRpbmcgYml0IGluIHRoZSBiaXQtbWFwLgorICAgICAqLworICAgIGlubGluZSB2b2lkIAorICAgIF9fYml0X2FsbG9jYXRlKHNpemVfdCogX19wYm1hcCwgc2l6ZV90IF9fcG9zKSB0aHJvdygpCisgICAgeworICAgICAgc2l6ZV90IF9fbWFzayA9IDEgPDwgX19wb3M7CisgICAgICBfX21hc2sgPSB+X19tYXNrOworICAgICAgKl9fcGJtYXAgJj0gX19tYXNrOworICAgIH0KKyAgCisgICAgLyoqIEBicmllZiAgTWFyayBhIG1lbW9yeSBhZGRyZXNzIGFzIGZyZWUgYnkgc2V0dGluZyB0aGUKKyAgICAgKiAgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGJpdC1tYXAuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgCisgICAgX19iaXRfZnJlZShzaXplX3QqIF9fcGJtYXAsIHNpemVfdCBfX3BvcykgdGhyb3coKQorICAgIHsKKyAgICAgIHNpemVfdCBfX21hc2sgPSAxIDw8IF9fcG9zOworICAgICAgKl9fcGJtYXAgfD0gX19tYXNrOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogQGJyaWVmICBHZW5lcmljIFZlcnNpb24gb2YgdGhlIGJzZiBpbnN0cnVjdGlvbi4KKyAgICovCisgIGlubGluZSBzaXplX3QgCisgIF9CaXRfc2Nhbl9mb3J3YXJkKHNpemVfdCBfX251bSkKKyAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX2J1aWx0aW5fY3R6bChfX251bSkpOyB9CisKKyAgLyoqIEBjbGFzcyAgZnJlZV9saXN0IGJpdG1hcF9hbGxvY2F0b3IuaCBiaXRtYXBfYWxsb2NhdG9yLmgKKyAgICoKKyAgICogIEBicmllZiAgVGhlIGZyZWUgbGlzdCBjbGFzcyBmb3IgbWFuYWdpbmcgY2h1bmtzIG9mIG1lbW9yeSB0byBiZQorICAgKiAgZ2l2ZW4gdG8gYW5kIHJldHVybmVkIGJ5IHRoZSBiaXRtYXBfYWxsb2NhdG9yLgorICAgKi8KKyAgY2xhc3MgZnJlZV9saXN0CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgc2l6ZV90KiAJCQkJdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIF9fZGV0YWlsOjpfX21pbmlfdmVjdG9yPHZhbHVlX3R5cGU+IHZlY3Rvcl90eXBlOworICAgIHR5cGVkZWYgdmVjdG9yX3R5cGU6Oml0ZXJhdG9yIAkJaXRlcmF0b3I7CisgICAgdHlwZWRlZiBfX211dGV4CQkJCV9fbXV0ZXhfdHlwZTsKKworICBwcml2YXRlOgorICAgIHN0cnVjdCBfTFRfcG9pbnRlcl9jb21wYXJlCisgICAgeworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBzaXplX3QqIF9fcHVpLCAKKwkJIGNvbnN0IHNpemVfdCBfX2N1aSkgY29uc3QgdGhyb3coKQorICAgICAgeyByZXR1cm4gKl9fcHVpIDwgX19jdWk7IH0KKyAgICB9OworCisjaWYgZGVmaW5lZCBfX0dUSFJFQURTCisgICAgX19tdXRleF90eXBlJgorICAgIF9NX2dldF9tdXRleCgpCisgICAgeworICAgICAgc3RhdGljIF9fbXV0ZXhfdHlwZSBfU19tdXRleDsKKyAgICAgIHJldHVybiBfU19tdXRleDsKKyAgICB9CisjZW5kaWYKKworICAgIHZlY3Rvcl90eXBlJgorICAgIF9NX2dldF9mcmVlX2xpc3QoKQorICAgIHsKKyAgICAgIHN0YXRpYyB2ZWN0b3JfdHlwZSBfU19mcmVlX2xpc3Q7CisgICAgICByZXR1cm4gX1NfZnJlZV9saXN0OworICAgIH0KKworICAgIC8qKiBAYnJpZWYgIFBlcmZvcm1zIHZhbGlkYXRpb24gb2YgbWVtb3J5IGJhc2VkIG9uIHRoZWlyIHNpemUuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX2FkZHIgVGhlIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB0byBiZQorICAgICAqICB2YWxpZGF0ZWQuCisgICAgICoKKyAgICAgKiAgQGRldGFpbCAgVmFsaWRhdGVzIHRoZSBtZW1vcnkgYmxvY2sgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gYW5kCisgICAgICogIGFwcHJvcHJpYXRlbHkgcGVyZm9ybXMgdGhlIGFjdGlvbiBvZiBtYW5hZ2luZyB0aGUgZnJlZSBsaXN0IG9mCisgICAgICogIGJsb2NrcyBieSBhZGRpbmcgdGhpcyBibG9jayB0byB0aGUgZnJlZSBsaXN0IG9yIGRlbGV0aW5nIHRoaXMKKyAgICAgKiAgb3IgbGFyZ2VyIGJsb2NrcyBmcm9tIHRoZSBmcmVlIGxpc3QuCisgICAgICovCisgICAgdm9pZAorICAgIF9NX3ZhbGlkYXRlKHNpemVfdCogX19hZGRyKSB0aHJvdygpCisgICAgeworICAgICAgdmVjdG9yX3R5cGUmIF9fZnJlZV9saXN0ID0gX01fZ2V0X2ZyZWVfbGlzdCgpOworICAgICAgY29uc3QgdmVjdG9yX3R5cGU6OnNpemVfdHlwZSBfX21heF9zaXplID0gNjQ7CisgICAgICBpZiAoX19mcmVlX2xpc3Quc2l6ZSgpID49IF9fbWF4X3NpemUpCisJeworCSAgLy8gT2ssIHRoZSB0aHJlc2hvbGQgdmFsdWUgaGFzIGJlZW4gcmVhY2hlZC4gIFdlIGRldGVybWluZQorCSAgLy8gd2hpY2ggYmxvY2sgdG8gcmVtb3ZlIGZyb20gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuCisJICBpZiAoKl9fYWRkciA+PSAqX19mcmVlX2xpc3QuYmFjaygpKQorCSAgICB7CisJICAgICAgLy8gT2ssIHRoZSBuZXcgYmxvY2sgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZQorCSAgICAgIC8vIGxhc3QgYmxvY2sgaW4gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuIFdlIGp1c3QgZnJlZQorCSAgICAgIC8vIHRoZSBuZXcgYmxvY2suCisJICAgICAgOjpvcGVyYXRvciBkZWxldGUoc3RhdGljX2Nhc3Q8dm9pZCo+KF9fYWRkcikpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgbGFzdCBibG9jayBpbiB0aGUgbGlzdCBvZiBmcmVlIGxpc3RzLAorCSAgICAgIC8vIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmUgaW4gaXRzIGNvcnJlY3QgcG9zaXRpb24uCisJICAgICAgOjpvcGVyYXRvciBkZWxldGUoc3RhdGljX2Nhc3Q8dm9pZCo+KF9fZnJlZV9saXN0LmJhY2soKSkpOworCSAgICAgIF9fZnJlZV9saXN0LnBvcF9iYWNrKCk7CisJICAgIH0KKwl9CisJICAKKyAgICAgIC8vIEp1c3QgYWRkIHRoZSBibG9jayB0byB0aGUgbGlzdCBvZiBmcmVlIGxpc3RzIHVuY29uZGl0aW9uYWxseS4KKyAgICAgIGl0ZXJhdG9yIF9fdGVtcCA9IF9fZGV0YWlsOjpfX2xvd2VyX2JvdW5kCisJKF9fZnJlZV9saXN0LmJlZ2luKCksIF9fZnJlZV9saXN0LmVuZCgpLCAKKwkgKl9fYWRkciwgX0xUX3BvaW50ZXJfY29tcGFyZSgpKTsKKworICAgICAgLy8gV2UgbWF5IGluc2VydCB0aGUgbmV3IGZyZWUgbGlzdCBiZWZvcmUgX3RlbXA7CisgICAgICBfX2ZyZWVfbGlzdC5pbnNlcnQoX190ZW1wLCBfX2FkZHIpOworICAgIH0KKworICAgIC8qKiBAYnJpZWYgIERlY2lkZXMgd2hldGhlciB0aGUgd2FzdGFnZSBvZiBtZW1vcnkgaXMgYWNjZXB0YWJsZSBmb3IKKyAgICAgKiAgdGhlIGN1cnJlbnQgbWVtb3J5IHJlcXVlc3QgYW5kIHJldHVybnMgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIF9fYmxvY2tfc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYmxvY2sgYXZhaWxhYmxlIGluIHRoZSBmcmVlCisgICAgICogIGxpc3QuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIF9fcmVxdWlyZWRfc2l6ZSBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgbWVtb3J5IGJsb2NrLgorICAgICAqCisgICAgICogIEByZXR1cm4gdHJ1ZSBpZiB0aGUgd2FzdGFnZSBpbmN1cnJlZCBpcyBhY2NlcHRhYmxlLCBlbHNlIHJldHVybnMKKyAgICAgKiAgZmFsc2UuCisgICAgICovCisgICAgYm9vbCAKKyAgICBfTV9zaG91bGRfaV9naXZlKHNpemVfdCBfX2Jsb2NrX3NpemUsIAorCQkgICAgIHNpemVfdCBfX3JlcXVpcmVkX3NpemUpIHRocm93KCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3QgX19tYXhfd2FzdGFnZV9wZXJjZW50YWdlID0gMzY7CisgICAgICBpZiAoX19ibG9ja19zaXplID49IF9fcmVxdWlyZWRfc2l6ZSAmJiAKKwkgICgoKF9fYmxvY2tfc2l6ZSAtIF9fcmVxdWlyZWRfc2l6ZSkgKiAxMDAgLyBfX2Jsb2NrX3NpemUpCisJICAgPCBfX21heF93YXN0YWdlX3BlcmNlbnRhZ2UpKQorCXJldHVybiB0cnVlOworICAgICAgZWxzZQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcHVibGljOgorICAgIC8qKiBAYnJpZWYgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBibG9jayBvZiBtZW1vcnkgdG8gdGhlCisgICAgICogIGludGVybmFsIGZyZWUgbGlzdC4KKyAgICAgKgorICAgICAqICBAcGFyYW0gIF9fYWRkciBUaGUgcG9pbnRlciB0byB0aGUgbWVtb3J5IGJsb2NrIHRoYXQgd2FzIGdpdmVuCisgICAgICogIGJ5IGEgY2FsbCB0byB0aGUgX01fZ2V0IGZ1bmN0aW9uLgorICAgICAqLworICAgIGlubGluZSB2b2lkIAorICAgIF9NX2luc2VydChzaXplX3QqIF9fYWRkcikgdGhyb3coKQorICAgIHsKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKyAgICAgIF9fc2NvcGVkX2xvY2sgX19iZmxfbG9jayhfTV9nZXRfbXV0ZXgoKSk7CisjZW5kaWYKKyAgICAgIC8vIENhbGwgX01fdmFsaWRhdGUgdG8gZGVjaWRlIHdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aAorICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIGZyZWUgbGlzdC4KKyAgICAgIHRoaXMtPl9NX3ZhbGlkYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4oX19hZGRyKSAtIDEpOworICAgICAgLy8gU2VlIGRpc2N1c3Npb24gYXMgdG8gd2h5IHRoaXMgaXMgMSEKKyAgICB9CisgICAgCisgICAgLyoqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgYmxvY2sgb2YgbWVtb3J5IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgc2l6ZSBmcm9tIHRoZSBmcmVlIGxpc3QuCisgICAgICoKKyAgICAgKiAgQHBhcmFtICBfX3N6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiAgQHJldHVybiAgQSBwb2ludGVyIHRvIHRoZSBuZXcgbWVtb3J5IGJsb2NrIG9mIHNpemUgYXQgbGVhc3QKKyAgICAgKiAgZXF1YWwgdG8gdGhhdCByZXF1ZXN0ZWQuCisgICAgICovCisgICAgc2l6ZV90KgorICAgIF9NX2dldChzaXplX3QgX19zeikgdGhyb3coc3RkOjpiYWRfYWxsb2MpOworCisgICAgLyoqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBqdXN0IGNsZWFycyB0aGUgaW50ZXJuYWwgRnJlZSBMaXN0LCBhbmQKKyAgICAgKiAgZ2l2ZXMgYmFjayBhbGwgdGhlIG1lbW9yeSB0byB0aGUgT1MuCisgICAgICovCisgICAgdm9pZCAKKyAgICBfTV9jbGVhcigpOworICB9OworCisKKyAgLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjbGFzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBiaXRtYXBfYWxsb2NhdG9yOworCisgIC8vIFNwZWNpYWxpemUgZm9yIHZvaWQ6CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBiaXRtYXBfYWxsb2NhdG9yPHZvaWQ+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdm9pZCogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gUmVmZXJlbmNlLXRvLXZvaWQgbWVtYmVycyBhcmUgaW1wb3NzaWJsZS4KKyAgICAgIHR5cGVkZWYgdm9pZCAgdmFsdWVfdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKwl7CisJICB0eXBlZGVmIGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4gb3RoZXI7CisJfTsKKyAgICB9OworCisgIC8qKgorICAgKiBAYnJpZWYgQml0bWFwIEFsbG9jYXRvciwgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgICogQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIGJpdG1hcF9hbGxvY2F0b3IgOiBwcml2YXRlIGZyZWVfbGlzdAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IAkJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAJCXBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogIAkJY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICAgCQlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgIAkJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAJCXZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGZyZWVfbGlzdDo6X19tdXRleF90eXBlIAlfX211dGV4X3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKwl7CisJICB0eXBlZGVmIGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4gb3RoZXI7CisJfTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxzaXplX3QgX0JTaXplLCBzaXplX3QgX0FsaWduU2l6ZT4KKyAgICAgICAgc3RydWN0IGFsaWduZWRfc2l6ZQorCXsKKwkgIGVudW0KKwkgICAgeyAKKwkgICAgICBtb2R1bHVzID0gX0JTaXplICUgX0FsaWduU2l6ZSwKKwkgICAgICB2YWx1ZSA9IF9CU2l6ZSArIChtb2R1bHVzID8gX0FsaWduU2l6ZSAtIChtb2R1bHVzKSA6IDApCisJICAgIH07CisJfTsKKworICAgICAgc3RydWN0IF9BbGxvY19ibG9jaworICAgICAgeworCWNoYXIgX19NX3VudXNlZFthbGlnbmVkX3NpemU8c2l6ZW9mKHZhbHVlX3R5cGUpLAorCQkJX0JBTExPQ19BTElHTl9CWVRFUz46OnZhbHVlXTsKKyAgICAgIH07CisKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnBhaXI8X0FsbG9jX2Jsb2NrKiwgX0FsbG9jX2Jsb2NrKj4gX0Jsb2NrX3BhaXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXRhaWw6Ol9fbWluaV92ZWN0b3I8X0Jsb2NrX3BhaXI+IF9CUFZlY3RvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjppdGVyYXRvciBfQlBpdGVyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUHJlZGljYXRlPgorICAgICAgICBzdGF0aWMgX0JQaXRlcgorICAgICAgICBfU19maW5kKF9QcmVkaWNhdGUgX19wKQorICAgICAgICB7CisJICBfQlBpdGVyIF9fZmlyc3QgPSBfU19tZW1fYmxvY2tzLmJlZ2luKCk7CisJICB3aGlsZSAoX19maXJzdCAhPSBfU19tZW1fYmxvY2tzLmVuZCgpICYmICFfX3AoKl9fZmlyc3QpKQorCSAgICArK19fZmlyc3Q7CisJICByZXR1cm4gX19maXJzdDsKKwl9CisKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0RFQlVHCisgICAgICAvLyBDb21wbGV4aXR5OiBPKGxnKE4pKS4gV2hlcmUsIE4gaXMgdGhlIG51bWJlciBvZiBibG9jayBvZiBzaXplCisgICAgICAvLyBzaXplb2YodmFsdWVfdHlwZSkuCisgICAgICB2b2lkIAorICAgICAgX1NfY2hlY2tfZm9yX2ZyZWVfYmxvY2tzKCkgdGhyb3coKQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX19kZXRhaWw6Ol9GZml0X2ZpbmRlcjxfQWxsb2NfYmxvY2sqPiBfRkZGOworCV9CUGl0ZXIgX19icGkgPSBfU19maW5kKF9GRkYoKSk7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19icGkgPT0gX1NfbWVtX2Jsb2Nrcy5lbmQoKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqIEBicmllZiAgUmVzcG9uc2libGUgZm9yIGV4cG9uZW50aWFsbHkgZ3Jvd2luZyB0aGUgaW50ZXJuYWwKKyAgICAgICAqICBtZW1vcnkgcG9vbC4KKyAgICAgICAqCisgICAgICAgKiAgQHRocm93ICBzdGQ6OmJhZF9hbGxvYy4gSWYgbWVtb3J5IGNhbiBub3QgYmUgYWxsb2NhdGVkLgorICAgICAgICoKKyAgICAgICAqICBAZGV0YWlsICBDb21wbGV4aXR5OiBPKDEpLCBidXQgaW50ZXJuYWxseSBkZXBlbmRzIHVwb24gdGhlCisgICAgICAgKiAgY29tcGxleGl0eSBvZiB0aGUgZnVuY3Rpb24gZnJlZV9saXN0OjpfTV9nZXQuIFRoZSBwYXJ0IHdoZXJlCisgICAgICAgKiAgdGhlIGJpdG1hcCBoZWFkZXJzIGFyZSB3cml0dGVuIGhhcyBjb21wbGV4aXR5OiBPKFgpLHdoZXJlIFgKKyAgICAgICAqICBpcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyBvZiBzaXplIHNpemVvZih2YWx1ZV90eXBlKSB3aXRoaW4KKyAgICAgICAqICB0aGUgbmV3bHkgYWNxdWlyZWQgYmxvY2suIEhhdmluZyBhIHRpZ2h0IGJvdW5kLgorICAgICAgICovCisgICAgICB2b2lkIAorICAgICAgX1NfcmVmaWxsX3Bvb2woKSB0aHJvdyhzdGQ6OmJhZF9hbGxvYykKKyAgICAgIHsKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0RFQlVHCisJX1NfY2hlY2tfZm9yX2ZyZWVfYmxvY2tzKCk7CisjZW5kaWYKKworCWNvbnN0IHNpemVfdCBfX251bV9iaXRtYXBzID0gKF9TX2Jsb2NrX3NpemUKKwkJCQkgICAgICAvIHNpemVfdChfX2RldGFpbDo6Yml0c19wZXJfYmxvY2spKTsKKwljb25zdCBzaXplX3QgX19zaXplX3RvX2FsbG9jYXRlID0gc2l6ZW9mKHNpemVfdCkgCisJICArIF9TX2Jsb2NrX3NpemUgKiBzaXplb2YoX0FsbG9jX2Jsb2NrKSAKKwkgICsgX19udW1fYml0bWFwcyAqIHNpemVvZihzaXplX3QpOworCisJc2l6ZV90KiBfX3RlbXAgPQorCSAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPih0aGlzLT5fTV9nZXQoX19zaXplX3RvX2FsbG9jYXRlKSk7CisJKl9fdGVtcCA9IDA7CisJKytfX3RlbXA7CisKKwkvLyBUaGUgSGVhZGVyIGluZm9ybWF0aW9uIGdvZXMgYXQgdGhlIEJlZ2lubmluZyBvZiB0aGUgQmxvY2suCisJX0Jsb2NrX3BhaXIgX19icCA9IAorCSAgc3RkOjptYWtlX3BhaXIocmVpbnRlcnByZXRfY2FzdDxfQWxsb2NfYmxvY2sqPgorCQkJIChfX3RlbXAgKyBfX251bV9iaXRtYXBzKSwgCisJCQkgcmVpbnRlcnByZXRfY2FzdDxfQWxsb2NfYmxvY2sqPgorCQkJIChfX3RlbXAgKyBfX251bV9iaXRtYXBzKSAKKwkJCSArIF9TX2Jsb2NrX3NpemUgLSAxKTsKKwkKKwkvLyBGaWxsIHRoZSBWZWN0b3Igd2l0aCB0aGlzIGluZm9ybWF0aW9uLgorCV9TX21lbV9ibG9ja3MucHVzaF9iYWNrKF9fYnApOworCisJZm9yIChzaXplX3QgX19pID0gMDsgX19pIDwgX19udW1fYml0bWFwczsgKytfX2kpCisJICBfX3RlbXBbX19pXSA9IH5zdGF0aWNfY2FzdDxzaXplX3Q+KDApOyAvLyAxIEluZGljYXRlcyBhbGwgRnJlZS4KKworCV9TX2Jsb2NrX3NpemUgKj0gMjsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9CUFZlY3RvciBfU19tZW1fYmxvY2tzOworICAgICAgc3RhdGljIHNpemVfdCBfU19ibG9ja19zaXplOworICAgICAgc3RhdGljIF9fZGV0YWlsOjpfQml0bWFwX2NvdW50ZXI8X0FsbG9jX2Jsb2NrKj4gX1NfbGFzdF9yZXF1ZXN0OworICAgICAgc3RhdGljIHR5cGVuYW1lIF9CUFZlY3Rvcjo6c2l6ZV90eXBlIF9TX2xhc3RfZGVhbGxvY19pbmRleDsKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKyAgICAgIHN0YXRpYyBfX211dGV4X3R5cGUgX1NfbXV0OworI2VuZGlmCisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8qKiBAYnJpZWYgIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgc2luZ2xlIG9iamVjdCBvZiBzaXplCisgICAgICAgKiAgc2l6ZW9mKF9UcCkuCisgICAgICAgKgorICAgICAgICogIEB0aHJvdyAgc3RkOjpiYWRfYWxsb2MuIElmIG1lbW9yeSBjYW4gbm90IGJlIGFsbG9jYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQGRldGFpbCAgQ29tcGxleGl0eTogV29yc3QgY2FzZSBjb21wbGV4aXR5IGlzIE8oTiksIGJ1dCB0aGF0CisgICAgICAgKiAgaXMgaGFyZGx5IGV2ZXIgaGl0LiBJZiBhbmQgd2hlbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSBpcworICAgICAgICogIGVuY291bnRlcmVkLCB0aGUgbmV4dCBmZXcgY2FzZXMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBhCisgICAgICAgKiAgd29yc3QgY2FzZSBjb21wbGV4aXR5IG9mIE8oMSkhICBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBwZXJmb3JtcyB2ZXJ5IHdlbGwgb24gYXZlcmFnZS4gWW91IGNhbiBjb25zaWRlciB0aGlzCisgICAgICAgKiAgZnVuY3Rpb24gdG8gaGF2ZSBhIGNvbXBsZXhpdHkgcmVmZXJyZWQgdG8gY29tbW9ubHkgYXM6CisgICAgICAgKiAgQW1vcnRpemVkIENvbnN0YW50IHRpbWUuCisgICAgICAgKi8KKyAgICAgIHBvaW50ZXIgCisgICAgICBfTV9hbGxvY2F0ZV9zaW5nbGVfb2JqZWN0KCkgdGhyb3coc3RkOjpiYWRfYWxsb2MpCisgICAgICB7CisjaWYgZGVmaW5lZCBfX0dUSFJFQURTCisJX19zY29wZWRfbG9jayBfX2JpdF9sb2NrKF9TX211dCk7CisjZW5kaWYKKworCS8vIFRoZSBhbGdvcml0aG0gaXMgc29tZXRoaW5nIGxpa2UgdGhpczogVGhlIGxhc3RfcmVxdWVzdAorCS8vIHZhcmlhYmxlIHBvaW50cyB0byB0aGUgbGFzdCBhY2Nlc3NlZCBCaXQgTWFwLiBXaGVuIHN1Y2ggYQorCS8vIGNvbmRpdGlvbiBvY2N1cnMsIHdlIHRyeSB0byBmaW5kIGEgZnJlZSBibG9jayBpbiB0aGUKKwkvLyBjdXJyZW50IGJpdG1hcCwgb3Igc3VjY2VlZGluZyBiaXRtYXBzIHVudGlsIHRoZSBsYXN0IGJpdG1hcAorCS8vIGlzIHJlYWNoZWQuIElmIG5vIGZyZWUgYmxvY2sgdHVybnMgdXAsIHdlIHJlc29ydCB0byBGaXJzdAorCS8vIEZpdCBtZXRob2QuCisKKwkvLyBXQVJOSU5HOiBEbyBub3QgcmUtb3JkZXIgdGhlIGNvbmRpdGlvbiBpbiB0aGUgd2hpbGUKKwkvLyBzdGF0ZW1lbnQgYmVsb3csIGJlY2F1c2UgaXQgcmVsaWVzIG9uIEMrKydzIHNob3J0LWNpcmN1aXQKKwkvLyBldmFsdWF0aW9uLiBUaGUgcmV0dXJuIGZyb20gX1NfbGFzdF9yZXF1ZXN0LT5fTV9nZXQoKSB3aWxsCisJLy8gTk9UIGJlIGRlcmVmZXJlbmNlIGFibGUgaWYgX1NfbGFzdF9yZXF1ZXN0LT5fTV9maW5pc2hlZCgpCisJLy8gcmV0dXJucyB0cnVlLiBUaGlzIHdvdWxkIGluZXZpdGFibHkgbGVhZCB0byBhIE5VTEwgcG9pbnRlcgorCS8vIGRlcmVmZXJlbmNlIGlmIHRpbmtlcmVkIHdpdGguCisJd2hpbGUgKF9TX2xhc3RfcmVxdWVzdC5fTV9maW5pc2hlZCgpID09IGZhbHNlCisJICAgICAgICYmICgqKF9TX2xhc3RfcmVxdWVzdC5fTV9nZXQoKSkgPT0gMCkpCisJICBfU19sYXN0X3JlcXVlc3Qub3BlcmF0b3IrKygpOworCisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX1NfbGFzdF9yZXF1ZXN0Ll9NX2ZpbmlzaGVkKCkgPT0gdHJ1ZSwgZmFsc2UpKQorCSAgeworCSAgICAvLyBGYWxsIEJhY2sgdG8gRmlyc3QgRml0IGFsZ29yaXRobS4KKwkgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2RldGFpbDo6X0ZmaXRfZmluZGVyPF9BbGxvY19ibG9jayo+IF9GRkY7CisJICAgIF9GRkYgX19mZmY7CisJICAgIF9CUGl0ZXIgX19icGkgPSBfU19maW5kKF9fZGV0YWlsOjpfRnVuY3Rvcl9SZWY8X0ZGRj4oX19mZmYpKTsKKworCSAgICBpZiAoX19icGkgIT0gX1NfbWVtX2Jsb2Nrcy5lbmQoKSkKKwkgICAgICB7CisJCS8vIFNlYXJjaCB3YXMgc3VjY2Vzc2Z1bC4gT2ssIG5vdyBtYXJrIHRoZSBmaXJzdCBiaXQgZnJvbQorCQkvLyB0aGUgcmlnaHQgYXMgMCwgbWVhbmluZyBBbGxvY2F0ZWQuIFRoaXMgYml0IGlzIG9idGFpbmVkCisJCS8vIGJ5IGNhbGxpbmcgX01fZ2V0KCkgb24gX19mZmYuCisJCXNpemVfdCBfX256X2JpdCA9IF9CaXRfc2Nhbl9mb3J3YXJkKCpfX2ZmZi5fTV9nZXQoKSk7CisJCV9fZGV0YWlsOjpfX2JpdF9hbGxvY2F0ZShfX2ZmZi5fTV9nZXQoKSwgX19uel9iaXQpOworCisJCV9TX2xhc3RfcmVxdWVzdC5fTV9yZXNldChfX2JwaSAtIF9TX21lbV9ibG9ja3MuYmVnaW4oKSk7CisKKwkJLy8gTm93LCBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpdCB3ZSBtYXJrZWQgYXMgYWxsb2NhdGVkLgorCQlwb2ludGVyIF9fcmV0ID0gcmVpbnRlcnByZXRfY2FzdDxwb2ludGVyPgorCQkgIChfX2JwaS0+Zmlyc3QgKyBfX2ZmZi5fTV9vZmZzZXQoKSArIF9fbnpfYml0KTsKKwkJc2l6ZV90KiBfX3B1c2VfY291bnQgPSAKKwkJICByZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJCSAgKF9fYnBpLT5maXJzdCkgLSAoX19kZXRhaWw6Ol9fbnVtX2JpdG1hcHMoKl9fYnBpKSArIDEpOworCQkKKwkJKysoKl9fcHVzZV9jb3VudCk7CisJCXJldHVybiBfX3JldDsKKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCS8vIFNlYXJjaCB3YXMgdW5zdWNjZXNzZnVsLiBXZSBBZGQgbW9yZSBtZW1vcnkgdG8gdGhlCisJCS8vIHBvb2wgYnkgY2FsbGluZyBfU19yZWZpbGxfcG9vbCgpLgorCQlfU19yZWZpbGxfcG9vbCgpOworCisJCS8vIF9NX1Jlc2V0IHRoZSBfU19sYXN0X3JlcXVlc3Qgc3RydWN0dXJlIHRvIHRoZSBmaXJzdAorCQkvLyBmcmVlIGJsb2NrJ3MgYml0IG1hcC4KKwkJX1NfbGFzdF9yZXF1ZXN0Ll9NX3Jlc2V0KF9TX21lbV9ibG9ja3Muc2l6ZSgpIC0gMSk7CisKKwkJLy8gTm93LCBtYXJrIHRoYXQgYml0IGFzIGFsbG9jYXRlZC4KKwkgICAgICB9CisJICB9CisKKwkvLyBfU19sYXN0X3JlcXVlc3QgaG9sZHMgYSBwb2ludGVyIHRvIGEgdmFsaWQgYml0IG1hcCwgdGhhdAorCS8vIHBvaW50cyB0byBhIGZyZWUgYmxvY2sgaW4gbWVtb3J5LgorCXNpemVfdCBfX256X2JpdCA9IF9CaXRfc2Nhbl9mb3J3YXJkKCpfU19sYXN0X3JlcXVlc3QuX01fZ2V0KCkpOworCV9fZGV0YWlsOjpfX2JpdF9hbGxvY2F0ZShfU19sYXN0X3JlcXVlc3QuX01fZ2V0KCksIF9fbnpfYml0KTsKKworCXBvaW50ZXIgX19yZXQgPSByZWludGVycHJldF9jYXN0PHBvaW50ZXI+CisJICAoX1NfbGFzdF9yZXF1ZXN0Ll9NX2Jhc2UoKSArIF9TX2xhc3RfcmVxdWVzdC5fTV9vZmZzZXQoKSArIF9fbnpfYml0KTsKKworCXNpemVfdCogX19wdXNlX2NvdW50ID0gcmVpbnRlcnByZXRfY2FzdDxzaXplX3QqPgorCSAgKF9TX21lbV9ibG9ja3NbX1NfbGFzdF9yZXF1ZXN0Ll9NX3doZXJlKCldLmZpcnN0KQorCSAgLSAoX19kZXRhaWw6OgorCSAgICAgX19udW1fYml0bWFwcyhfU19tZW1fYmxvY2tzW19TX2xhc3RfcmVxdWVzdC5fTV93aGVyZSgpXSkgKyAxKTsKKworCSsrKCpfX3B1c2VfY291bnQpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqIEBicmllZiAgRGVhbGxvY2F0ZXMgbWVtb3J5IHRoYXQgYmVsb25ncyB0byBhIHNpbmdsZSBvYmplY3Qgb2YKKyAgICAgICAqICBzaXplIHNpemVvZihfVHApLgorICAgICAgICoKKyAgICAgICAqICBAZGV0YWlsICBDb21wbGV4aXR5OiBPKGxnKE4pKSwgYnV0IHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBoaXQKKyAgICAgICAqICBvZnRlbiEgIFRoaXMgaXMgYmVjYXVzZSBjb250YWluZXJzIHVzdWFsbHkgZGVhbGxvY2F0ZSBtZW1vcnkKKyAgICAgICAqICBjbG9zZSB0byBlYWNoIG90aGVyIGFuZCB0aGlzIGNhc2UgaXMgaGFuZGxlZCBpbiBPKDEpIHRpbWUgYnkKKyAgICAgICAqICB0aGUgZGVhbGxvY2F0ZSBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIF9NX2RlYWxsb2NhdGVfc2luZ2xlX29iamVjdChwb2ludGVyIF9fcCkgdGhyb3coKQorICAgICAgeworI2lmIGRlZmluZWQgX19HVEhSRUFEUworCV9fc2NvcGVkX2xvY2sgX19iaXRfbG9jayhfU19tdXQpOworI2VuZGlmCisJX0FsbG9jX2Jsb2NrKiBfX3JlYWxfcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X0FsbG9jX2Jsb2NrKj4oX19wKTsKKworCXR5cGVkZWYgdHlwZW5hbWUgX0JQVmVjdG9yOjppdGVyYXRvciBfSXRlcmF0b3I7CisJdHlwZWRlZiB0eXBlbmFtZSBfQlBWZWN0b3I6OmRpZmZlcmVuY2VfdHlwZSBfRGlmZmVyZW5jZV90eXBlOworCisJX0RpZmZlcmVuY2VfdHlwZSBfX2RpZmY7CisJbG9uZyBfX2Rpc3BsYWNlbWVudDsKKworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfU19sYXN0X2RlYWxsb2NfaW5kZXggPj0gMCk7CisKKwlfX2RldGFpbDo6X0luY2x1c2l2ZV9iZXR3ZWVuPF9BbGxvY19ibG9jayo+IF9faWJ0KF9fcmVhbF9wKTsKKwlpZiAoX19pYnQoX1NfbWVtX2Jsb2Nrc1tfU19sYXN0X2RlYWxsb2NfaW5kZXhdKSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9TX2xhc3RfZGVhbGxvY19pbmRleAorCQkJCSAgPD0gX1NfbWVtX2Jsb2Nrcy5zaXplKCkgLSAxKTsKKworCSAgICAvLyBJbml0aWFsIEFzc3VtcHRpb24gd2FzIGNvcnJlY3QhCisJICAgIF9fZGlmZiA9IF9TX2xhc3RfZGVhbGxvY19pbmRleDsKKwkgICAgX19kaXNwbGFjZW1lbnQgPSBfX3JlYWxfcCAtIF9TX21lbV9ibG9ja3NbX19kaWZmXS5maXJzdDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIF9JdGVyYXRvciBfaXRlciA9IF9TX2ZpbmQoX19pYnQpOworCisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfaXRlciAhPSBfU19tZW1fYmxvY2tzLmVuZCgpKTsKKworCSAgICBfX2RpZmYgPSBfaXRlciAtIF9TX21lbV9ibG9ja3MuYmVnaW4oKTsKKwkgICAgX19kaXNwbGFjZW1lbnQgPSBfX3JlYWxfcCAtIF9TX21lbV9ibG9ja3NbX19kaWZmXS5maXJzdDsKKwkgICAgX1NfbGFzdF9kZWFsbG9jX2luZGV4ID0gX19kaWZmOworCSAgfQorCisJLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlcmF0b3IgdGhhdCBoYXMgYmVlbiBmb3VuZC4KKwljb25zdCBzaXplX3QgX19yb3RhdGUgPSAoX19kaXNwbGFjZW1lbnQKKwkJCQkgJSBzaXplX3QoX19kZXRhaWw6OmJpdHNfcGVyX2Jsb2NrKSk7CisJc2l6ZV90KiBfX2JpdG1hcEMgPSAKKwkgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4KKwkgIChfU19tZW1fYmxvY2tzW19fZGlmZl0uZmlyc3QpIC0gMTsKKwlfX2JpdG1hcEMgLT0gKF9fZGlzcGxhY2VtZW50IC8gc2l6ZV90KF9fZGV0YWlsOjpiaXRzX3Blcl9ibG9jaykpOworICAgICAgCisJX19kZXRhaWw6Ol9fYml0X2ZyZWUoX19iaXRtYXBDLCBfX3JvdGF0ZSk7CisJc2l6ZV90KiBfX3B1c2VfY291bnQgPSByZWludGVycHJldF9jYXN0PHNpemVfdCo+CisJICAoX1NfbWVtX2Jsb2Nrc1tfX2RpZmZdLmZpcnN0KQorCSAgLSAoX19kZXRhaWw6Ol9fbnVtX2JpdG1hcHMoX1NfbWVtX2Jsb2Nrc1tfX2RpZmZdKSArIDEpOworCQorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgqX19wdXNlX2NvdW50ICE9IDApOworCisJLS0oKl9fcHVzZV9jb3VudCk7CisKKwlpZiAoX19idWlsdGluX2V4cGVjdCgqX19wdXNlX2NvdW50ID09IDAsIGZhbHNlKSkKKwkgIHsKKwkgICAgX1NfYmxvY2tfc2l6ZSAvPSAyOworCSAgCisJICAgIC8vIFdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoaXMgYmxvY2suCisJICAgIC8vIF9CbG9ja19wYWlyIF9fYnAgPSBfU19tZW1fYmxvY2tzW19fZGlmZl07CisJICAgIHRoaXMtPl9NX2luc2VydChfX3B1c2VfY291bnQpOworCSAgICBfU19tZW1fYmxvY2tzLmVyYXNlKF9TX21lbV9ibG9ja3MuYmVnaW4oKSArIF9fZGlmZik7CisKKwkgICAgLy8gUmVzZXQgdGhlIF9TX2xhc3RfcmVxdWVzdCB2YXJpYWJsZSB0byByZWZsZWN0IHRoZQorCSAgICAvLyBlcmFzZWQgYmxvY2suIFdlIGRvIHRoaXMgdG8gcHJvdGVjdCBmdXR1cmUgcmVxdWVzdHMKKwkgICAgLy8gYWZ0ZXIgdGhlIGxhc3QgYmxvY2sgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGEgcGFydGljdWxhcgorCSAgICAvLyBtZW1vcnkgQ2h1bmssIHdoaWNoIGluIHR1cm4gaGFzIGJlZW4gcmV0dXJuZWQgdG8gdGhlCisJICAgIC8vIGZyZWUgbGlzdCwgYW5kIGhlbmNlIGhhZCBiZWVuIGVyYXNlZCBmcm9tIHRoZSB2ZWN0b3IsCisJICAgIC8vIHNvIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3IgZ2V0cyByZWR1Y2VkIGJ5IDEuCisJICAgIGlmICgoX0RpZmZlcmVuY2VfdHlwZSlfU19sYXN0X3JlcXVlc3QuX01fd2hlcmUoKSA+PSBfX2RpZmYtLSkKKwkgICAgICBfU19sYXN0X3JlcXVlc3QuX01fcmVzZXQoX19kaWZmKTsgCisKKwkgICAgLy8gSWYgdGhlIEluZGV4IGludG8gdGhlIHZlY3RvciBvZiB0aGUgcmVnaW9uIG9mIG1lbW9yeQorCSAgICAvLyB0aGF0IG1pZ2h0IGhvbGQgdGhlIG5leHQgYWRkcmVzcyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvCisJICAgIC8vIGRlYWxsb2NhdGVkIG1heSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQgZHVlIHRvIHRoZSBhYm92ZQorCSAgICAvLyBlcmFzZSBwcm9jZWR1cmUgYmVpbmcgY2FsbGVkIG9uIHRoZSB2ZWN0b3IsIGhlbmNlIHdlCisJICAgIC8vIHRyeSB0byByZXN0b3JlIHRoaXMgaW52YXJpYW50IHRvby4KKwkgICAgaWYgKF9TX2xhc3RfZGVhbGxvY19pbmRleCA+PSBfU19tZW1fYmxvY2tzLnNpemUoKSkKKwkgICAgICB7CisJCV9TX2xhc3RfZGVhbGxvY19pbmRleCA9KF9fZGlmZiAhPSAtMSA/IF9fZGlmZiA6IDApOworCQlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX1NfbGFzdF9kZWFsbG9jX2luZGV4ID49IDApOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGJpdG1hcF9hbGxvY2F0b3IoKSB0aHJvdygpCisgICAgICB7IH0KKworICAgICAgYml0bWFwX2FsbG9jYXRvcihjb25zdCBiaXRtYXBfYWxsb2NhdG9yJikKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBiaXRtYXBfYWxsb2NhdG9yKGNvbnN0IGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4mKSB0aHJvdygpCisgICAgICAgIHsgfQorCisgICAgICB+Yml0bWFwX2FsbG9jYXRvcigpIHRocm93KCkKKyAgICAgIHsgfQorCisgICAgICBwb2ludGVyIAorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID4gdGhpcy0+bWF4X3NpemUoKSkKKwkgIHN0ZDo6X190aHJvd19iYWRfYWxsb2MoKTsKKworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fbiA9PSAxLCB0cnVlKSkKKwkgIHJldHVybiB0aGlzLT5fTV9hbGxvY2F0ZV9zaW5nbGVfb2JqZWN0KCk7CisJZWxzZQorCSAgeyAKKwkgICAgY29uc3Qgc2l6ZV90eXBlIF9fYiA9IF9fbiAqIHNpemVvZih2YWx1ZV90eXBlKTsKKwkgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8cG9pbnRlcj4oOjpvcGVyYXRvciBuZXcoX19iKSk7CisJICB9CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIgCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCB0eXBlbmFtZSBiaXRtYXBfYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyKQorICAgICAgeyByZXR1cm4gYWxsb2NhdGUoX19uKTsgfQorCisgICAgICB2b2lkIAorICAgICAgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbikgdGhyb3coKQorICAgICAgeworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcCAhPSAwLCB0cnVlKSkKKwkgIHsKKwkgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19uID09IDEsIHRydWUpKQorCSAgICAgIHRoaXMtPl9NX2RlYWxsb2NhdGVfc2luZ2xlX29iamVjdChfX3ApOworCSAgICBlbHNlCisJICAgICAgOjpvcGVyYXRvciBkZWxldGUoX19wKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgcG9pbnRlciAKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9fcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX19yKTsgfQorCisgICAgICBjb25zdF9wb2ludGVyIAorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX19yKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3IpOyB9CisKKyAgICAgIHNpemVfdHlwZSAKKyAgICAgIG1heF9zaXplKCkgY29uc3QgdGhyb3coKQorICAgICAgeyByZXR1cm4gc2l6ZV90eXBlKC0xKSAvIHNpemVvZih2YWx1ZV90eXBlKTsgfQorCisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdF9yZWZlcmVuY2UgX19kYXRhKQorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgdmFsdWVfdHlwZShfX2RhdGEpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVHAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQgCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKQorICAgICAgeyBfX3AtPn52YWx1ZV90eXBlKCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGJpdG1hcF9hbGxvY2F0b3I8X1RwMT4mLCAKKwkgICAgICAgY29uc3QgYml0bWFwX2FsbG9jYXRvcjxfVHAyPiYpIHRocm93KCkKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgIGJvb2wgCisgICAgb3BlcmF0b3IhPShjb25zdCBiaXRtYXBfYWxsb2NhdG9yPF9UcDE+JiwgCisJICAgICAgIGNvbnN0IGJpdG1hcF9hbGxvY2F0b3I8X1RwMj4mKSB0aHJvdygpIAorICB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9CUFZlY3RvcgorICAgIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X1NfbWVtX2Jsb2NrczsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc2l6ZV90IGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X1NfYmxvY2tfc2l6ZSA9IAorICAgIDIgKiBzaXplX3QoX19kZXRhaWw6OmJpdHNfcGVyX2Jsb2NrKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdHlwZW5hbWUgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfQlBWZWN0b3I6OnNpemVfdHlwZSAKKyAgICBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9TX2xhc3RfZGVhbGxvY19pbmRleCA9IDA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9fZGV0YWlsOjpfQml0bWFwX2NvdW50ZXIKKyAgICAgIDx0eXBlbmFtZSBiaXRtYXBfYWxsb2NhdG9yPF9UcD46Ol9BbGxvY19ibG9jayo+CisgICAgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfU19sYXN0X3JlcXVlc3QoX1NfbWVtX2Jsb2Nrcyk7CisKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRFMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHR5cGVuYW1lIGJpdG1hcF9hbGxvY2F0b3I8X1RwPjo6X19tdXRleF90eXBlCisgICAgYml0bWFwX2FsbG9jYXRvcjxfVHA+OjpfU19tdXQ7CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2dudV9jeHgKKworI2VuZGlmIAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9jYXN0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9jYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzODRmOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2Nhc3QuaApAQCAtMCwwICsxLDEyMSBAQAorLy8gPGNhc3QuaD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvY2FzdC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3BvaW50ZXIuaH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0NBU1RfSAorI2RlZmluZSBfR0xJQkNYWF9DQVNUX0ggMQorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaGVyZSB0byBhbGxvdyBjb250YWluZXJzIHRvIHN1cHBvcnQgbm9uIHN0YW5kYXJkCisgICAqIHBvaW50ZXIgdHlwZXMuICBGb3Igbm9ybWFsIHBvaW50ZXJzLCB0aGVzZSByZXNvbHZlIHRvIHRoZSB1c2Ugb2YgdGhlCisgICAqIHN0YW5kYXJkIGNhc3Qgb3BlcmF0aW9uLiAgRm9yIG90aGVyIHR5cGVzIHRoZSBmdW5jdGlvbnMgd2lsbCBwZXJmb3JtCisgICAqIHRoZSBhcHBycHJpYXRlIGNhc3QgdG8vZnJvbSB0aGUgY3VzdG9tIHBvaW50ZXIgY2xhc3Mgc28gbG9uZyBhcyB0aGF0CisgICAqIGNsYXNzIG1lZXRzIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgICogMSkgaGFzIGEgdHlwZWRlZiBlbGVtZW50X3R5cGUgd2hpY2ggbmFtZXMgdGVoZSB0eXBlIGl0IHBvaW50cyB0by4KKyAgICogMikgaGFzIGEgZ2V0KCkgY29uc3QgbWV0aG9kIHdoaWNoIHJldHVybnMgZWxlbWVudF90eXBlKi4KKyAgICogMykgaGFzIGEgY29uc3RydWN0b3Igd2hpY2ggY2FuIHRha2Ugb25lIGVsZW1lbnRfdHlwZSogYXJndW1lbnQuCisgICAqLworCisgIC8qKgorICAgKiBUaGlzIHR5cGUgc3VwcG9ydHMgdGhlIHNlbWFudGljcyBvZiB0aGUgcG9pbnRlciBjYXN0IG9wZXJhdG9ycyAoYmVsb3cuKQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZT4KKyAgICBzdHJ1Y3QgX0Nhc3RlcgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBfVG9UeXBlOjplbGVtZW50X3R5cGUqICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGU+CisgICAgc3RydWN0IF9DYXN0ZXI8X1RvVHlwZSo+CisgICAgeyB0eXBlZGVmIF9Ub1R5cGUqICB0eXBlOyB9OworCisgIC8qKgorICAgKiBDYXN0aW5nIG9wZXJhdGlvbnMgZm9yIGNhc2VzIHdoZXJlIF9Gcm9tVHlwZSBpcyBub3QgYSBzdGFuZGFyZCBwb2ludGVyLgorICAgKiBfVG9UeXBlIGNhbiBiZSBhIHN0YW5kYXJkIG9yIG5vbi1zdGFuZGFyZCBwb2ludGVyLiAgR2l2ZW4gdGhhdCBfRnJvbVR5cGUKKyAgICogaXMgbm90IGEgcG9pbnRlciwgaXQgbXVzdCBoYXZlIGEgZ2V0KCkgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgc3RhbmRhcmQKKyAgICogcG9pbnRlciBlcXVpdmFsZW50IG9mIHRoZSBhZGRyZXNzIGl0IHBvaW50cyB0bywgYW5kIG11c3QgaGF2ZSBhbgorICAgKiBlbGVtZW50X3R5cGUgdHlwZWRlZiB3aGljaCBuYW1lcyB0aGUgdHlwZSBpdCBwb2ludHMgdG8uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX3N0YXRpY19wb2ludGVyX2Nhc3QoY29uc3QgX0Zyb21UeXBlJiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKHN0YXRpY19jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnLmdldCgpKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX2R5bmFtaWNfcG9pbnRlcl9jYXN0KGNvbnN0IF9Gcm9tVHlwZSYgX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShkeW5hbWljX2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcuZ2V0KCkpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fY29uc3RfcG9pbnRlcl9jYXN0KGNvbnN0IF9Gcm9tVHlwZSYgX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShjb25zdF9jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnLmdldCgpKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVG9UeXBlLCB0eXBlbmFtZSBfRnJvbVR5cGU+CisgICAgaW5saW5lIF9Ub1R5cGUKKyAgICBfX3JlaW50ZXJwcmV0X3BvaW50ZXJfY2FzdChjb25zdCBfRnJvbVR5cGUmIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUocmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZy5nZXQoKSkpOyB9CisKKyAgLyoqCisgICAqIENhc3Rpbmcgb3BlcmF0aW9ucyBmb3IgY2FzZXMgd2hlcmUgX0Zyb21UeXBlIGlzIGEgc3RhbmRhcmQgcG9pbnRlci4KKyAgICogX1RvVHlwZSBjYW4gYmUgYSBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQgcG9pbnRlci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fc3RhdGljX3BvaW50ZXJfY2FzdChfRnJvbVR5cGUqIF9fYXJnKQorICAgIHsgcmV0dXJuIF9Ub1R5cGUoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fZHluYW1pY19wb2ludGVyX2Nhc3QoX0Zyb21UeXBlKiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKGR5bmFtaWNfY2FzdDx0eXBlbmFtZSBfQ2FzdGVyPF9Ub1R5cGU+OjoKKwkJICAgICB0eXBlPihfX2FyZykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvVHlwZSwgdHlwZW5hbWUgX0Zyb21UeXBlPgorICAgIGlubGluZSBfVG9UeXBlCisgICAgX19jb25zdF9wb2ludGVyX2Nhc3QoX0Zyb21UeXBlKiBfX2FyZykKKyAgICB7IHJldHVybiBfVG9UeXBlKGNvbnN0X2Nhc3Q8dHlwZW5hbWUgX0Nhc3RlcjxfVG9UeXBlPjo6CisJCSAgICAgdHlwZT4oX19hcmcpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Ub1R5cGUsIHR5cGVuYW1lIF9Gcm9tVHlwZT4KKyAgICBpbmxpbmUgX1RvVHlwZQorICAgIF9fcmVpbnRlcnByZXRfcG9pbnRlcl9jYXN0KF9Gcm9tVHlwZSogX19hcmcpCisgICAgeyByZXR1cm4gX1RvVHlwZShyZWludGVycHJldF9jYXN0PHR5cGVuYW1lIF9DYXN0ZXI8X1RvVHlwZT46OgorCQkgICAgIHR5cGU+KF9fYXJnKSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX19HTElCQ1hYX0NBU1RfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvY29kZWN2dF9zcGVjaWFsaXphdGlvbnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiOTVlZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2NvZGVjdnRfc3BlY2lhbGl6YXRpb25zLmgKQEAgLTAsMCArMSw1MTQgQEAKKy8vIExvY2FsZSBzdXBwb3J0IChjb2RlY3Z0KSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsCisvLyAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMi4xLjUgVGVtcGxhdGUgY2xhc3MgY29kZWN2dAorLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworLyoqIEBmaWxlIGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX0NPREVDVlRfU1BFQ0lBTElaQVRJT05TX0gKKyNkZWZpbmUgX0VYVF9DT0RFQ1ZUX1NQRUNJQUxJWkFUSU9OU19IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGljb252Lmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLy8gRXh0ZW5zaW9uIHRvIHVzZSBpY29udiBmb3IgZGVhbGluZyB3aXRoIGNoYXJhY3RlciBlbmNvZGluZ3MuCisgIC8vIFRoaXMgaW5jbHVkZXMgY29udmVyc2lvbnMgYW5kIGNvbXBhcmlzb25zIGJldHdlZW4gdmFyaW91cyBjaGFyYWN0ZXIKKyAgLy8gc2V0cy4gIFRoaXMgb2JqZWN0IGVuY2Fwc3VsYXRlcyBkYXRhIHRoYXQgbWF5IG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4KKyAgLy8gY2hhcl90cmFpdHMsIGNvZGVjdnQgYW5kIGN0eXBlLgorICBjbGFzcyBlbmNvZGluZ19zdGF0ZQorICB7CisgIHB1YmxpYzoKKyAgICAvLyBUeXBlczogCisgICAgLy8gTkI6IEEgY29udmVyc2lvbiBkZXNjcmlwdG9yIHN1YnN1bWVzIGFuZCBlbmhhbmNlcyB0aGUKKyAgICAvLyBmdW5jdGlvbmFsaXR5IG9mIGEgc2ltcGxlIHN0YXRlIHR5cGUgc3VjaCBhcyBtYnN0YXRlX3QuCisgICAgdHlwZWRlZiBpY29udl90CWRlc2NyaXB0b3JfdHlwZTsKKyAgICAKKyAgcHJvdGVjdGVkOgorICAgIC8vIE5hbWUgb2YgaW50ZXJuYWwgY2hhcmFjdGVyIHNldCBlbmNvZGluZy4KKyAgICBzdGQ6OnN0cmluZwkgICAgICAgCV9NX2ludF9lbmM7CisKKyAgICAvLyBOYW1lIG9mIGV4dGVybmFsIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcuCisgICAgc3RkOjpzdHJpbmcgIAlfTV9leHRfZW5jOworCisgICAgLy8gQ29udmVyc2lvbiBkZXNjcmlwdG9yIGJldHdlZW4gZXh0ZXJuYWwgZW5jb2RpbmcgdG8gaW50ZXJuYWwgZW5jb2RpbmcuCisgICAgZGVzY3JpcHRvcl90eXBlCV9NX2luX2Rlc2M7CisKKyAgICAvLyBDb252ZXJzaW9uIGRlc2NyaXB0b3IgYmV0d2VlbiBpbnRlcm5hbCBlbmNvZGluZyB0byBleHRlcm5hbCBlbmNvZGluZy4KKyAgICBkZXNjcmlwdG9yX3R5cGUJX01fb3V0X2Rlc2M7CisKKyAgICAvLyBUaGUgYnl0ZS1vcmRlciBtYXJrZXIgZm9yIHRoZSBleHRlcm5hbCBlbmNvZGluZywgaWYgbmVjZXNzYXJ5LgorICAgIGludAkJCV9NX2V4dF9ib207CisKKyAgICAvLyBUaGUgYnl0ZS1vcmRlciBtYXJrZXIgZm9yIHRoZSBpbnRlcm5hbCBlbmNvZGluZywgaWYgbmVjZXNzYXJ5LgorICAgIGludAkJCV9NX2ludF9ib207CisKKyAgICAvLyBOdW1iZXIgb2YgZXh0ZXJuYWwgYnl0ZXMgbmVlZGVkIHRvIGNvbnN0cnVjdCBvbmUgY29tcGxldGUKKyAgICAvLyBjaGFyYWN0ZXIgaW4gdGhlIGludGVybmFsIGVuY29kaW5nLgorICAgIC8vIE5COiAtMSBpbmRpY2F0ZXMgdmFyaWFibGUsIG9yIHN0YXRlZnVsLCBlbmNvZGluZ3MuCisgICAgaW50IAkJX01fYnl0ZXM7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IAorICAgIGVuY29kaW5nX3N0YXRlKCkgCisgICAgOiBfTV9pbl9kZXNjKDApLCBfTV9vdXRfZGVzYygwKSwgX01fZXh0X2JvbSgwKSwgX01faW50X2JvbSgwKSwgX01fYnl0ZXMoMCkKKyAgICB7IH0KKworICAgIGV4cGxpY2l0IAorICAgIGVuY29kaW5nX3N0YXRlKGNvbnN0IGNoYXIqIF9faW50LCBjb25zdCBjaGFyKiBfX2V4dCwgCisJCSAgIGludCBfX2lib20gPSAwLCBpbnQgX19lYm9tID0gMCwgaW50IF9fYnl0ZXMgPSAxKQorICAgIDogX01faW50X2VuYyhfX2ludCksIF9NX2V4dF9lbmMoX19leHQpLCBfTV9pbl9kZXNjKDApLCBfTV9vdXRfZGVzYygwKSwgCisgICAgICBfTV9leHRfYm9tKF9fZWJvbSksIF9NX2ludF9ib20oX19pYm9tKSwgX01fYnl0ZXMoX19ieXRlcykKKyAgICB7IGluaXQoKTsgfQorCisgICAgLy8gMjEuMS4yIHRyYWl0cyB0eXBlZGVmcworICAgIC8vIHA0CisgICAgLy8gdHlwZWRlZiBTVEFURV9UIHN0YXRlX3R5cGUKKyAgICAvLyByZXF1aXJlczogc3RhdGVfdHlwZSBzaGFsbCBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YKKyAgICAvLyBDb3B5Q29uc3RydWN0aWJsZSB0eXBlcyAoMjAuMS4zKQorICAgIC8vIE5COiBUaGlzIGRvZXMgbm90IHByZXNlcnZlIHRoZSBhY3R1YWwgc3RhdGUgb2YgdGhlIGNvbnZlcnNpb24KKyAgICAvLyBkZXNjcmlwdG9yIG1lbWJlciwgYnV0IGl0IGRvZXMgZHVwbGljYXRlIHRoZSBlbmNvZGluZworICAgIC8vIGluZm9ybWF0aW9uLgorICAgIGVuY29kaW5nX3N0YXRlKGNvbnN0IGVuY29kaW5nX3N0YXRlJiBfX29iaikgOiBfTV9pbl9kZXNjKDApLCBfTV9vdXRfZGVzYygwKQorICAgIHsgY29uc3RydWN0KF9fb2JqKTsgfQorCisgICAgLy8gTmVlZCBhc3NpZ25tZW50IG9wZXJhdG9yIGFzIHdlbGwuCisgICAgZW5jb2Rpbmdfc3RhdGUmCisgICAgb3BlcmF0b3I9KGNvbnN0IGVuY29kaW5nX3N0YXRlJiBfX29iaikKKyAgICB7CisgICAgICBjb25zdHJ1Y3QoX19vYmopOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5lbmNvZGluZ19zdGF0ZSgpCisgICAgeyBkZXN0cm95KCk7IH0gCisKKyAgICBib29sCisgICAgZ29vZCgpIGNvbnN0IHRocm93KCkKKyAgICB7IAorICAgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlIF9fZXJyID0gKGljb252X3QpKC0xKTsKKyAgICAgIGJvb2wgX190ZXN0ID0gX01faW5fZGVzYyAmJiBfTV9pbl9kZXNjICE9IF9fZXJyOyAKKyAgICAgIF9fdGVzdCAmPSAgX01fb3V0X2Rlc2MgJiYgX01fb3V0X2Rlc2MgIT0gX19lcnI7CisgICAgICByZXR1cm4gX190ZXN0OworICAgIH0KKyAgICAKKyAgICBpbnQKKyAgICBjaGFyYWN0ZXJfcmF0aW8oKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2J5dGVzOyB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZworICAgIGludGVybmFsX2VuY29kaW5nKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pbnRfZW5jOyB9CisKKyAgICBpbnQgCisgICAgaW50ZXJuYWxfYm9tKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9pbnRfYm9tOyB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZworICAgIGV4dGVybmFsX2VuY29kaW5nKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9leHRfZW5jOyB9CisKKyAgICBpbnQgCisgICAgZXh0ZXJuYWxfYm9tKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9leHRfYm9tOyB9CisKKyAgICBjb25zdCBkZXNjcmlwdG9yX3R5cGUmCisgICAgaW5fZGVzY3JpcHRvcigpIGNvbnN0CisgICAgeyByZXR1cm4gX01faW5fZGVzYzsgfQorCisgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlJgorICAgIG91dF9kZXNjcmlwdG9yKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9vdXRfZGVzYzsgfQorCisgIHByb3RlY3RlZDoKKyAgICB2b2lkCisgICAgaW5pdCgpCisgICAgeworICAgICAgY29uc3QgZGVzY3JpcHRvcl90eXBlIF9fZXJyID0gKGljb252X3QpKC0xKTsKKyAgICAgIGNvbnN0IGJvb2wgX19oYXZlX2VuY29kaW5ncyA9IF9NX2ludF9lbmMuc2l6ZSgpICYmIF9NX2V4dF9lbmMuc2l6ZSgpOworICAgICAgaWYgKCFfTV9pbl9kZXNjICYmIF9faGF2ZV9lbmNvZGluZ3MpCisJeworCSAgX01faW5fZGVzYyA9IGljb252X29wZW4oX01faW50X2VuYy5jX3N0cigpLCBfTV9leHRfZW5jLmNfc3RyKCkpOworCSAgaWYgKF9NX2luX2Rlc2MgPT0gX19lcnIpCisJICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiZW5jb2Rpbmdfc3RhdGU6Ol9NX2luaXQgIgorCQkJCSAgICAiY3JlYXRpbmcgaWNvbnYgaW5wdXQgZGVzY3JpcHRvciBmYWlsZWQiKSk7CisJfQorICAgICAgaWYgKCFfTV9vdXRfZGVzYyAmJiBfX2hhdmVfZW5jb2RpbmdzKQorCXsKKwkgIF9NX291dF9kZXNjID0gaWNvbnZfb3BlbihfTV9leHRfZW5jLmNfc3RyKCksIF9NX2ludF9lbmMuY19zdHIoKSk7CisJICBpZiAoX01fb3V0X2Rlc2MgPT0gX19lcnIpCisJICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiZW5jb2Rpbmdfc3RhdGU6Ol9NX2luaXQgIgorCQkJCSAgImNyZWF0aW5nIGljb252IG91dHB1dCBkZXNjcmlwdG9yIGZhaWxlZCIpKTsKKwl9CisgICAgfQorCisgICAgdm9pZAorICAgIGNvbnN0cnVjdChjb25zdCBlbmNvZGluZ19zdGF0ZSYgX19vYmopCisgICAgeworICAgICAgZGVzdHJveSgpOworICAgICAgX01faW50X2VuYyA9IF9fb2JqLl9NX2ludF9lbmM7CisgICAgICBfTV9leHRfZW5jID0gX19vYmouX01fZXh0X2VuYzsKKyAgICAgIF9NX2V4dF9ib20gPSBfX29iai5fTV9leHRfYm9tOworICAgICAgX01faW50X2JvbSA9IF9fb2JqLl9NX2ludF9ib207CisgICAgICBfTV9ieXRlcyA9IF9fb2JqLl9NX2J5dGVzOworICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBkZXN0cm95KCkgdGhyb3coKQorICAgIHsKKyAgICAgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSBfX2VyciA9IChpY29udl90KSgtMSk7CisgICAgICBpZiAoX01faW5fZGVzYyAmJiBfTV9pbl9kZXNjICE9IF9fZXJyKSAKKwl7CisJICBpY29udl9jbG9zZShfTV9pbl9kZXNjKTsKKwkgIF9NX2luX2Rlc2MgPSAwOworCX0KKyAgICAgIGlmIChfTV9vdXRfZGVzYyAmJiBfTV9vdXRfZGVzYyAhPSBfX2VycikgCisJeworCSAgaWNvbnZfY2xvc2UoX01fb3V0X2Rlc2MpOworCSAgX01fb3V0X2Rlc2MgPSAwOworCX0KKyAgICB9CisgIH07CisKKyAgLy8vIGVuY29kaW5nX2NoYXJfdHJhaXRzCisgIC8vIEN1c3RvbSB0cmFpdHMgdHlwZSB3aXRoIGVuY29kaW5nX3N0YXRlIGZvciB0aGUgc3RhdGUgdHlwZSwgYW5kIHRoZQorICAvLyBhc3NvY2lhdGVkIGZwb3M8ZW5jb2Rpbmdfc3RhdGU+IGZvciB0aGUgcG9zaXRpb24gdHlwZSwgYWxsIG90aGVyCisgIC8vIGJpdHMgZXF1aXZhbGVudCB0byB0aGUgcmVxdWlyZWQgY2hhcl90cmFpdHMgaW5zdGFudGlhdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgZW5jb2RpbmdfY2hhcl90cmFpdHMgOiBwdWJsaWMgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+CisgICAgeworICAgICAgdHlwZWRlZiBlbmNvZGluZ19zdGF0ZQkJCQlzdGF0ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmZwb3M8c3RhdGVfdHlwZT4JCXBvc190eXBlOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgX19nbnVfY3h4OjplbmNvZGluZ19zdGF0ZTsKKworICAvLy8gY29kZWN2dDxJbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+IHNwZWNpYWxpemF0aW9uLgorICAvLyBUaGlzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gdGFrZXMgYWR2YW50YWdlIG9mIGljb252IHRvIHByb3ZpZGUKKyAgLy8gY29kZSBjb252ZXJzaW9ucyBiZXR3ZWVuIGEgbGFyZ2UgbnVtYmVyIG9mIGNoYXJhY3RlciBlbmNvZGluZ3MuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBjbGFzcyBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+CisgICAgOiBwdWJsaWMgX19jb2RlY3Z0X2Fic3RyYWN0X2Jhc2U8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT4KKyAgICB7CisgICAgcHVibGljOiAgICAgIAorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIGNvZGVjdnRfYmFzZTo6cmVzdWx0CQkJcmVzdWx0OworICAgICAgdHlwZWRlZiBfSW50ZXJuVCAJCQkJCWludGVybl90eXBlOworICAgICAgdHlwZWRlZiBfRXh0ZXJuVCAJCQkJCWV4dGVybl90eXBlOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OmVuY29kaW5nX3N0YXRlIAkJc3RhdGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RhdGVfdHlwZTo6ZGVzY3JpcHRvcl90eXBlIAkJZGVzY3JpcHRvcl90eXBlOworCisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICBzdGF0aWMgbG9jYWxlOjppZCAJCWlkOworCisgICAgICBleHBsaWNpdCAKKyAgICAgIGNvZGVjdnQoc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4oX19yZWZzKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0IAorICAgICAgY29kZWN2dChzdGF0ZV90eXBlJiBfX2VuYywgc2l6ZV90IF9fcmVmcyA9IDApCisgICAgICA6IF9fY29kZWN2dF9hYnN0cmFjdF9iYXNlPGludGVybl90eXBlLCBleHRlcm5fdHlwZSwgc3RhdGVfdHlwZT4oX19yZWZzKQorICAgICAgeyB9CisKKyAgICAgcHJvdGVjdGVkOgorICAgICAgdmlydHVhbCAKKyAgICAgIH5jb2RlY3Z0KCkgeyB9CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb19vdXQoc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgaW50ZXJuX3R5cGUqIF9fZnJvbSwgCisJICAgICBjb25zdCBpbnRlcm5fdHlwZSogX19mcm9tX2VuZCwgY29uc3QgaW50ZXJuX3R5cGUqJiBfX2Zyb21fbmV4dCwKKwkgICAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgICBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3Q7CisKKyAgICAgIHZpcnR1YWwgcmVzdWx0CisgICAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLCAKKwkJIGV4dGVybl90eXBlKiBfX3RvX2VuZCwgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHJlc3VsdAorICAgICAgZG9faW4oc3RhdGVfdHlwZSYgX19zdGF0ZSwgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbSwgCisJICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBleHRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCAKKwkgICAgaW50ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludCAKKyAgICAgIGRvX2VuY29kaW5nKCkgY29uc3QgdGhyb3coKTsKKworICAgICAgdmlydHVhbCBib29sIAorICAgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCk7CisKKyAgICAgIHZpcnR1YWwgaW50IAorICAgICAgZG9fbGVuZ3RoKHN0YXRlX3R5cGUmLCBjb25zdCBleHRlcm5fdHlwZSogX19mcm9tLCAKKwkJY29uc3QgZXh0ZXJuX3R5cGUqIF9fZW5kLCBzaXplX3QgX19tYXgpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIGludCAKKyAgICAgIGRvX21heF9sZW5ndGgoKSBjb25zdCB0aHJvdygpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGxvY2FsZTo6aWQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6aWQ7CisKKyAgLy8gVGhpcyBhZGFwdG9yIHdvcmtzIGFyb3VuZCB0aGUgc2lnbmF0dXJlIHByb2JsZW1zIG9mIHRoZSBzZWNvbmQKKyAgLy8gYXJndW1lbnQgdG8gaWNvbnYoKTogIFNVU3YyIGFuZCBvdGhlcnMgdXNlICdjb25zdCBjaGFyKionLCBidXQgZ2xpYmMgMi4yCisgIC8vIHVzZXMgJ2NoYXIqKicsIHdoaWNoIG1hdGNoZXMgdGhlIFBPU0lYIDEwMDMuMS0yMDAxIHN0YW5kYXJkLgorICAvLyBVc2luZyB0aGlzIGFkYXB0b3IsIGcrKyB3aWxsIGRvIHRoZSB3b3JrIGZvciB1cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzaXplX3QKKyAgICBfX2ljb252X2FkYXB0b3Ioc2l6ZV90KCpfX2Z1bmMpKGljb252X3QsIF9UcCwgc2l6ZV90KiwgY2hhcioqLCBzaXplX3QqKSwKKyAgICAgICAgICAgICAgICAgICAgaWNvbnZfdCBfX2NkLCBjaGFyKiogX19pbmJ1Ziwgc2l6ZV90KiBfX2luYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBfX291dGJ1Ziwgc2l6ZV90KiBfX291dGJ5dGVzKQorICAgIHsgcmV0dXJuIF9fZnVuYyhfX2NkLCAoX1RwKV9faW5idWYsIF9faW5ieXRlcywgX19vdXRidWYsIF9fb3V0Ynl0ZXMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGNvZGVjdnRfYmFzZTo6cmVzdWx0CisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fb3V0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb20sIAorCSAgIGNvbnN0IGludGVybl90eXBlKiBfX2Zyb21fZW5kLCBjb25zdCBpbnRlcm5fdHlwZSomIF9fZnJvbV9uZXh0LAorCSAgIGV4dGVybl90eXBlKiBfX3RvLCBleHRlcm5fdHlwZSogX190b19lbmQsCisJICAgZXh0ZXJuX3R5cGUqJiBfX3RvX25leHQpIGNvbnN0CisgICAgeworICAgICAgcmVzdWx0IF9fcmV0ID0gY29kZWN2dF9iYXNlOjplcnJvcjsKKyAgICAgIGlmIChfX3N0YXRlLmdvb2QoKSkKKwl7CisJICBjb25zdCBkZXNjcmlwdG9yX3R5cGUmIF9fZGVzYyA9IF9fc3RhdGUub3V0X2Rlc2NyaXB0b3IoKTsKKwkgIGNvbnN0IHNpemVfdCBfX2ZtdWx0aXBsZSA9IHNpemVvZihpbnRlcm5fdHlwZSk7CisJICBzaXplX3QgX19mYnl0ZXMgPSBfX2ZtdWx0aXBsZSAqIChfX2Zyb21fZW5kIC0gX19mcm9tKTsKKwkgIGNvbnN0IHNpemVfdCBfX3RtdWx0aXBsZSA9IHNpemVvZihleHRlcm5fdHlwZSk7CisJICBzaXplX3QgX190Ynl0ZXMgPSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pOyAKKwkgIAorCSAgLy8gQXJndW1lbnQgbGlzdCBmb3IgaWNvbnYgc3BlY2lmaWVzIGEgYnl0ZSBzZXF1ZW5jZS4gVGh1cywKKwkgIC8vIGFsbCB0by9mcm9tIGFycmF5cyBtdXN0IGJlIGJydXRhbGx5IGNhc3RlZCB0byBjaGFyKi4KKwkgIGNoYXIqIF9fY3RvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX190byk7CisJICBjaGFyKiBfX2Nmcm9tOworCSAgc2l6ZV90IF9fY29udjsKKworCSAgLy8gU29tZSBlbmNvZGluZ3MgbmVlZCBhIGJ5dGUgb3JkZXIgbWFya2VyIGFzIHRoZSBmaXJzdCBpdGVtCisJICAvLyBpbiB0aGUgYnl0ZSBzdHJlYW0sIHRvIGRlc2lnbmF0ZSBlbmRpYW4tbmVzcy4gVGhlIGRlZmF1bHQKKwkgIC8vIHZhbHVlIGZvciB0aGUgYnl0ZSBvcmRlciBtYXJrZXIgaXMgTlVMTCwgc28gaWYgdGhpcyBpcworCSAgLy8gdGhlIGNhc2UsIGl0J3Mgbm90IG5lY2Vzc2FyeSBhbmQgd2UgY2FuIGp1c3QgZ28gb24gb3VyCisJICAvLyBtZXJyeSB3YXkuCisJICBpbnQgX19pbnRfYm9tID0gX19zdGF0ZS5pbnRlcm5hbF9ib20oKTsKKwkgIGlmIChfX2ludF9ib20pCisJICAgIHsJICAKKwkgICAgICBzaXplX3QgX19zaXplID0gX19mcm9tX2VuZCAtIF9fZnJvbTsKKwkgICAgICBpbnRlcm5fdHlwZSogX19jZml4ZWQgPSBzdGF0aWNfY2FzdDxpbnRlcm5fdHlwZSo+CisJCShfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihpbnRlcm5fdHlwZSkgKiAoX19zaXplICsgMSkpKTsKKwkgICAgICBfX2NmaXhlZFswXSA9IHN0YXRpY19jYXN0PGludGVybl90eXBlPihfX2ludF9ib20pOworCSAgICAgIGNoYXJfdHJhaXRzPGludGVybl90eXBlPjo6Y29weShfX2NmaXhlZCArIDEsIF9fZnJvbSwgX19zaXplKTsKKwkgICAgICBfX2Nmcm9tID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19jZml4ZWQpOworCSAgICAgIF9fY29udiA9IF9faWNvbnZfYWRhcHRvcihpY29udiwgX19kZXNjLCAmX19jZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19mYnl0ZXMsICZfX2N0bywgJl9fdGJ5dGVzKTsgCisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGludGVybl90eXBlKiBfX2NmaXhlZCA9IGNvbnN0X2Nhc3Q8aW50ZXJuX3R5cGUqPihfX2Zyb20pOworCSAgICAgIF9fY2Zyb20gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX2NmaXhlZCk7CisJICAgICAgX19jb252ID0gX19pY29udl9hZGFwdG9yKGljb252LCBfX2Rlc2MsICZfX2Nmcm9tLCAmX19mYnl0ZXMsIAorCQkJCSAgICAgICAmX19jdG8sICZfX3RieXRlcyk7IAorCSAgICB9CisKKwkgIGlmIChfX2NvbnYgIT0gc2l6ZV90KC0xKSkKKwkgICAgeworCSAgICAgIF9fZnJvbV9uZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnRlcm5fdHlwZSo+KF9fY2Zyb20pOworCSAgICAgIF9fdG9fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZXh0ZXJuX3R5cGUqPihfX2N0byk7CisJICAgICAgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6Om9rOworCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgaWYgKF9fZmJ5dGVzIDwgX19mbXVsdGlwbGUgKiAoX19mcm9tX2VuZCAtIF9fZnJvbSkpCisJCXsKKwkJICBfX2Zyb21fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50ZXJuX3R5cGUqPihfX2Nmcm9tKTsKKwkJICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGV4dGVybl90eXBlKj4oX19jdG8pOworCQkgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsOworCQl9CisJICAgICAgZWxzZQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6ZXJyb3I7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZXJuVCwgdHlwZW5hbWUgX0V4dGVyblQ+CisgICAgY29kZWN2dF9iYXNlOjpyZXN1bHQKKyAgICBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+OjoKKyAgICBkb191bnNoaWZ0KHN0YXRlX3R5cGUmIF9fc3RhdGUsIGV4dGVybl90eXBlKiBfX3RvLCAKKwkgICAgICAgZXh0ZXJuX3R5cGUqIF9fdG9fZW5kLCBleHRlcm5fdHlwZSomIF9fdG9fbmV4dCkgY29uc3QKKyAgICB7CisgICAgICByZXN1bHQgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworICAgICAgaWYgKF9fc3RhdGUuZ29vZCgpKQorCXsKKwkgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSYgX19kZXNjID0gX19zdGF0ZS5pbl9kZXNjcmlwdG9yKCk7CisJICBjb25zdCBzaXplX3QgX190bXVsdGlwbGUgPSBzaXplb2YoaW50ZXJuX3R5cGUpOworCSAgc2l6ZV90IF9fdGxlbiA9IF9fdG11bHRpcGxlICogKF9fdG9fZW5kIC0gX190byk7IAorCSAgCisJICAvLyBBcmd1bWVudCBsaXN0IGZvciBpY29udiBzcGVjaWZpZXMgYSBieXRlIHNlcXVlbmNlLiBUaHVzLAorCSAgLy8gYWxsIHRvL2Zyb20gYXJyYXlzIG11c3QgYmUgYnJ1dGFsbHkgY2FzdGVkIHRvIGNoYXIqLgorCSAgY2hhciogX19jdG8gPSByZWludGVycHJldF9jYXN0PGNoYXIqPihfX3RvKTsKKwkgIHNpemVfdCBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsX19kZXNjLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fY3RvLCAmX190bGVuKTsgCisJICAKKwkgIGlmIChfX2NvbnYgIT0gc2l6ZV90KC0xKSkKKwkgICAgeworCSAgICAgIF9fdG9fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZXh0ZXJuX3R5cGUqPihfX2N0byk7CisJICAgICAgaWYgKF9fdGxlbiA9PSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pKQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6bm9jb252OworCSAgICAgIGVsc2UgaWYgKF9fdGxlbiA9PSAwKQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6b2s7CisJICAgICAgZWxzZQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6cGFydGlhbDsKKwkgICAgfQorCSAgZWxzZSAKKwkgICAgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworCX0KKyAgICAgIHJldHVybiBfX3JldDsgCisgICAgfQorICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBjb2RlY3Z0X2Jhc2U6OnJlc3VsdAorICAgIGNvZGVjdnQ8X0ludGVyblQsIF9FeHRlcm5ULCBlbmNvZGluZ19zdGF0ZT46OgorICAgIGRvX2luKHN0YXRlX3R5cGUmIF9fc3RhdGUsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sIAorCSAgY29uc3QgZXh0ZXJuX3R5cGUqIF9fZnJvbV9lbmQsIGNvbnN0IGV4dGVybl90eXBlKiYgX19mcm9tX25leHQsCisJICBpbnRlcm5fdHlwZSogX190bywgaW50ZXJuX3R5cGUqIF9fdG9fZW5kLCAKKwkgIGludGVybl90eXBlKiYgX190b19uZXh0KSBjb25zdAorICAgIHsgCisgICAgICByZXN1bHQgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6OmVycm9yOworICAgICAgaWYgKF9fc3RhdGUuZ29vZCgpKQorCXsKKwkgIGNvbnN0IGRlc2NyaXB0b3JfdHlwZSYgX19kZXNjID0gX19zdGF0ZS5pbl9kZXNjcmlwdG9yKCk7CisJICBjb25zdCBzaXplX3QgX19mbXVsdGlwbGUgPSBzaXplb2YoZXh0ZXJuX3R5cGUpOworCSAgc2l6ZV90IF9fZmxlbiA9IF9fZm11bHRpcGxlICogKF9fZnJvbV9lbmQgLSBfX2Zyb20pOworCSAgY29uc3Qgc2l6ZV90IF9fdG11bHRpcGxlID0gc2l6ZW9mKGludGVybl90eXBlKTsKKwkgIHNpemVfdCBfX3RsZW4gPSBfX3RtdWx0aXBsZSAqIChfX3RvX2VuZCAtIF9fdG8pOyAKKwkgIAorCSAgLy8gQXJndW1lbnQgbGlzdCBmb3IgaWNvbnYgc3BlY2lmaWVzIGEgYnl0ZSBzZXF1ZW5jZS4gVGh1cywKKwkgIC8vIGFsbCB0by9mcm9tIGFycmF5cyBtdXN0IGJlIGJydXRhbGx5IGNhc3RlZCB0byBjaGFyKi4KKwkgIGNoYXIqIF9fY3RvID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX190byk7CisJICBjaGFyKiBfX2Nmcm9tOworCSAgc2l6ZV90IF9fY29udjsKKworCSAgLy8gU29tZSBlbmNvZGluZ3MgbmVlZCBhIGJ5dGUgb3JkZXIgbWFya2VyIGFzIHRoZSBmaXJzdCBpdGVtCisJICAvLyBpbiB0aGUgYnl0ZSBzdHJlYW0sIHRvIGRlc2lnbmF0ZSBlbmRpYW4tbmVzcy4gVGhlIGRlZmF1bHQKKwkgIC8vIHZhbHVlIGZvciB0aGUgYnl0ZSBvcmRlciBtYXJrZXIgaXMgTlVMTCwgc28gaWYgdGhpcyBpcworCSAgLy8gdGhlIGNhc2UsIGl0J3Mgbm90IG5lY2Vzc2FyeSBhbmQgd2UgY2FuIGp1c3QgZ28gb24gb3VyCisJICAvLyBtZXJyeSB3YXkuCisJICBpbnQgX19leHRfYm9tID0gX19zdGF0ZS5leHRlcm5hbF9ib20oKTsKKwkgIGlmIChfX2V4dF9ib20pCisJICAgIHsJICAKKwkgICAgICBzaXplX3QgX19zaXplID0gX19mcm9tX2VuZCAtIF9fZnJvbTsKKwkgICAgICBleHRlcm5fdHlwZSogX19jZml4ZWQgPSAgc3RhdGljX2Nhc3Q8ZXh0ZXJuX3R5cGUqPgorCQkoX19idWlsdGluX2FsbG9jYShzaXplb2YoZXh0ZXJuX3R5cGUpICogKF9fc2l6ZSArIDEpKSk7CisJICAgICAgX19jZml4ZWRbMF0gPSBzdGF0aWNfY2FzdDxleHRlcm5fdHlwZT4oX19leHRfYm9tKTsKKwkgICAgICBjaGFyX3RyYWl0czxleHRlcm5fdHlwZT46OmNvcHkoX19jZml4ZWQgKyAxLCBfX2Zyb20sIF9fc2l6ZSk7CisJICAgICAgX19jZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fY2ZpeGVkKTsKKwkgICAgICBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsIF9fZGVzYywgJl9fY2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19mbGVuLCAmX19jdG8sICZfX3RsZW4pOyAKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZXh0ZXJuX3R5cGUqIF9fY2ZpeGVkID0gY29uc3RfY2FzdDxleHRlcm5fdHlwZSo+KF9fZnJvbSk7CisJICAgICAgX19jZnJvbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fY2ZpeGVkKTsKKwkgICAgICBfX2NvbnYgPSBfX2ljb252X2FkYXB0b3IoaWNvbnYsIF9fZGVzYywgJl9fY2Zyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19mbGVuLCAmX19jdG8sICZfX3RsZW4pOyAKKwkgICAgfQorCisJICAKKwkgIGlmIChfX2NvbnYgIT0gc2l6ZV90KC0xKSkKKwkgICAgeworCSAgICAgIF9fZnJvbV9uZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBleHRlcm5fdHlwZSo+KF9fY2Zyb20pOworCSAgICAgIF9fdG9fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50ZXJuX3R5cGUqPihfX2N0byk7CisJICAgICAgX19yZXQgPSBjb2RlY3Z0X2Jhc2U6Om9rOworCSAgICB9CisJICBlbHNlIAorCSAgICB7CisJICAgICAgaWYgKF9fZmxlbiA8IHN0YXRpY19jYXN0PHNpemVfdD4oX19mcm9tX2VuZCAtIF9fZnJvbSkpCisJCXsKKwkJICBfX2Zyb21fbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZXh0ZXJuX3R5cGUqPihfX2Nmcm9tKTsKKwkJICBfX3RvX25leHQgPSByZWludGVycHJldF9jYXN0PGludGVybl90eXBlKj4oX19jdG8pOworCQkgIF9fcmV0ID0gY29kZWN2dF9iYXNlOjpwYXJ0aWFsOworCQl9CisJICAgICAgZWxzZQorCQlfX3JldCA9IGNvZGVjdnRfYmFzZTo6ZXJyb3I7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7IAorICAgIH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBpbnQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fZW5jb2RpbmcoKSBjb25zdCB0aHJvdygpCisgICAgeworICAgICAgaW50IF9fcmV0ID0gMDsKKyAgICAgIGlmIChzaXplb2YoX0V4dGVyblQpIDw9IHNpemVvZihfSW50ZXJuVCkpCisJX19yZXQgPSBzaXplb2YoX0ludGVyblQpIC8gc2l6ZW9mKF9FeHRlcm5UKTsKKyAgICAgIHJldHVybiBfX3JldDsgCisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGJvb2wgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fYWx3YXlzX25vY29udigpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiBmYWxzZTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVyblQsIHR5cGVuYW1lIF9FeHRlcm5UPgorICAgIGludCAKKyAgICBjb2RlY3Z0PF9JbnRlcm5ULCBfRXh0ZXJuVCwgZW5jb2Rpbmdfc3RhdGU+OjoKKyAgICBkb19sZW5ndGgoc3RhdGVfdHlwZSYsIGNvbnN0IGV4dGVybl90eXBlKiBfX2Zyb20sIAorCSAgICAgIGNvbnN0IGV4dGVybl90eXBlKiBfX2VuZCwgc2l6ZV90IF9fbWF4KSBjb25zdAorICAgIHsgcmV0dXJuIHN0ZDo6bWluKF9fbWF4LCBzdGF0aWNfY2FzdDxzaXplX3Q+KF9fZW5kIC0gX19mcm9tKSk7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDc0LiAgR2FyYmxlZCB0ZXh0IGZvciBjb2RlY3Z0Ojpkb19tYXhfbGVuZ3RoCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRlcm5ULCB0eXBlbmFtZSBfRXh0ZXJuVD4KKyAgICBpbnQgCisgICAgY29kZWN2dDxfSW50ZXJuVCwgX0V4dGVyblQsIGVuY29kaW5nX3N0YXRlPjo6CisgICAgZG9fbWF4X2xlbmd0aCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAxOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9jb25jdXJyZW5jZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvY29uY3VycmVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzhmNjNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvY29uY3VycmVuY2UuaApAQCAtMCwwICsxLDM4OSBAQAorLy8gU3VwcG9ydCBmb3IgY29uY3VycmVudCBwcm9ncmFtaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9jb25jdXJyZW5jZS5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfQ09OQ1VSUkVOQ0VfSAorI2RlZmluZSBfQ09OQ1VSUkVOQ0VfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4gCisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBBdmFpbGFibGUgbG9ja2luZyBwb2xpY2llczoKKyAgLy8gX1Nfc2luZ2xlICAgIHNpbmdsZS10aHJlYWRlZCBjb2RlIHRoYXQgZG9lc24ndCBuZWVkIHRvIGJlIGxvY2tlZC4KKyAgLy8gX1NfbXV0ZXggICAgIG11bHRpLXRocmVhZGVkIGNvZGUgdGhhdCByZXF1aXJlcyBhZGRpdGlvbmFsIHN1cHBvcnQKKyAgLy8gICAgICAgICAgICAgIGZyb20gZ3Roci5oIG9yIGFic3RyYWN0aW9uIGxheWVycyBpbiBjb25jdXJyZW5jZS5oLgorICAvLyBfU19hdG9taWMgICAgbXVsdGktdGhyZWFkZWQgY29kZSB1c2luZyBhdG9taWMgb3BlcmF0aW9ucy4KKyAgZW51bSBfTG9ja19wb2xpY3kgeyBfU19zaW5nbGUsIF9TX211dGV4LCBfU19hdG9taWMgfTsgCisKKyAgLy8gQ29tcGlsZSB0aW1lIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHByZWZlcmVkIGxvY2tpbmcgcG9saWN5IGluCisgIC8vIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgIHN0YXRpYyBjb25zdCBfTG9ja19wb2xpY3kgX19kZWZhdWx0X2xvY2tfcG9saWN5ID0gCisjaWZkZWYgX19HVEhSRUFEUworI2lmIChkZWZpbmVkKF9fR0NDX0hBVkVfU1lOQ19DT01QQVJFX0FORF9TV0FQXzIpIFwKKyAgICAgJiYgZGVmaW5lZChfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF80KSkKKyAgX1NfYXRvbWljOworI2Vsc2UKKyAgX1NfbXV0ZXg7CisjZW5kaWYKKyNlbHNlCisgIF9TX3NpbmdsZTsKKyNlbmRpZgorCisgIC8vIE5COiBBcyB0aGlzIGlzIHVzZWQgaW4gbGlic3VwYysrLCBuZWVkIHRvIG9ubHkgZGVwZW5kIG9uCisgIC8vIGV4Y2VwdGlvbi4gTm8gc3RkZXhjZXB0aW9uIGNsYXNzZXMsIG5vIHVzZSBvZiBzdGQ6OnN0cmluZy4KKyAgY2xhc3MgX19jb25jdXJyZW5jZV9sb2NrX2Vycm9yIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgY2hhciBjb25zdCoKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKQorICAgIHsgcmV0dXJuICJfX2dudV9jeHg6Ol9fY29uY3VycmVuY2VfbG9ja19lcnJvciI7IH0KKyAgfTsKKworICBjbGFzcyBfX2NvbmN1cnJlbmNlX3VubG9ja19lcnJvciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNoYXIgY29uc3QqCisgICAgd2hhdCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAiX19nbnVfY3h4OjpfX2NvbmN1cnJlbmNlX3VubG9ja19lcnJvciI7IH0KKyAgfTsKKworICBjbGFzcyBfX2NvbmN1cnJlbmNlX2Jyb2FkY2FzdF9lcnJvciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIGNoYXIgY29uc3QqCisgICAgd2hhdCgpIGNvbnN0IHRocm93KCkKKyAgICB7IHJldHVybiAiX19nbnVfY3h4OjpfX2NvbmN1cnJlbmNlX2Jyb2FkY2FzdF9lcnJvciI7IH0KKyAgfTsKKworICBjbGFzcyBfX2NvbmN1cnJlbmNlX3dhaXRfZXJyb3IgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gIl9fZ251X2N4eDo6X19jb25jdXJyZW5jZV93YWl0X2Vycm9yIjsgfQorICB9OworCisgIC8vIFN1YnN0aXR1dGUgZm9yIGNvbmN1cnJlbmNlX2Vycm9yIG9iamVjdCBpbiB0aGUgY2FzZSBvZiAtZm5vLWV4Y2VwdGlvbnMuCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfY29uY3VycmVuY2VfbG9ja19lcnJvcigpCisgIHsKKyNpZiBfX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBfX2NvbmN1cnJlbmNlX2xvY2tfZXJyb3IoKTsKKyNlbHNlCisgICAgX19idWlsdGluX2Fib3J0KCk7CisjZW5kaWYKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yKCkKKyAgeworI2lmIF9fRVhDRVBUSU9OUworICAgIHRocm93IF9fY29uY3VycmVuY2VfdW5sb2NrX2Vycm9yKCk7CisjZWxzZQorICAgIF9fYnVpbHRpbl9hYm9ydCgpOworI2VuZGlmCisgIH0KKworI2lmZGVmIF9fR1RIUkVBRF9IQVNfQ09ORAorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2NvbmN1cnJlbmNlX2Jyb2FkY2FzdF9lcnJvcigpCisgIHsKKyNpZiBfX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBfX2NvbmN1cnJlbmNlX2Jyb2FkY2FzdF9lcnJvcigpOworI2Vsc2UKKyAgICBfX2J1aWx0aW5fYWJvcnQoKTsKKyNlbmRpZgorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19jb25jdXJyZW5jZV93YWl0X2Vycm9yKCkKKyAgeworI2lmIF9fRVhDRVBUSU9OUworICAgIHRocm93IF9fY29uY3VycmVuY2Vfd2FpdF9lcnJvcigpOworI2Vsc2UKKyAgICBfX2J1aWx0aW5fYWJvcnQoKTsKKyNlbmRpZgorICB9CisjZW5kaWYKKyAKKyAgY2xhc3MgX19tdXRleCAKKyAgeworICBwcml2YXRlOgorICAgIF9fZ3RocmVhZF9tdXRleF90IF9NX211dGV4OworCisgICAgX19tdXRleChjb25zdCBfX211dGV4Jik7CisgICAgX19tdXRleCYgb3BlcmF0b3I9KGNvbnN0IF9fbXV0ZXgmKTsKKworICBwdWJsaWM6CisgICAgX19tdXRleCgpIAorICAgIHsgCisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKyNpZiBkZWZpbmVkIF9fR1RIUkVBRF9NVVRFWF9JTklUCisJICBfX2d0aHJlYWRfbXV0ZXhfdCBfX3RtcCA9IF9fR1RIUkVBRF9NVVRFWF9JTklUOworCSAgX01fbXV0ZXggPSBfX3RtcDsKKyNlbHNlCisJICBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTigmX01fbXV0ZXgpOyAKKyNlbmRpZgorCX0KKyNlbmRpZiAKKyAgICB9CisKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIH5fX211dGV4KCkgCisgICAgeyAKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwlfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbXV0ZXgpOyAKKyAgICB9CisjZW5kaWYgCisKKyAgICB2b2lkIGxvY2soKQorICAgIHsKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9tdXRleF9sb2NrKCZfTV9tdXRleCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV9sb2NrX2Vycm9yKCk7CisJfQorI2VuZGlmCisgICAgfQorICAgIAorICAgIHZvaWQgdW5sb2NrKCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2d0aHJlYWRfbXV0ZXhfdCogZ3RocmVhZF9tdXRleCh2b2lkKQorICAgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisgIH07CisKKyAgY2xhc3MgX19yZWN1cnNpdmVfbXV0ZXggCisgIHsKKyAgcHJpdmF0ZToKKyAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgX01fbXV0ZXg7CisKKyAgICBfX3JlY3Vyc2l2ZV9tdXRleChjb25zdCBfX3JlY3Vyc2l2ZV9tdXRleCYpOworICAgIF9fcmVjdXJzaXZlX211dGV4JiBvcGVyYXRvcj0oY29uc3QgX19yZWN1cnNpdmVfbXV0ZXgmKTsKKworICBwdWJsaWM6CisgICAgX19yZWN1cnNpdmVfbXV0ZXgoKSAKKyAgICB7IAorI2lmIF9fR1RIUkVBRFMKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwl7CisjaWYgZGVmaW5lZCBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKwkgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCBfX3RtcCA9IF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVDsKKwkgIF9NX211dGV4ID0gX190bXA7CisjZWxzZQorCSAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7IAorI2VuZGlmCisJfQorI2VuZGlmIAorICAgIH0KKworI2lmIF9fR1RIUkVBRFMgJiYgISBkZWZpbmVkIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAgIH5fX3JlY3Vyc2l2ZV9tdXRleCgpCisgICAgeworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCV9TX2Rlc3Ryb3koJl9NX211dGV4KTsKKyAgICB9CisjZW5kaWYKKworICAgIHZvaWQgbG9jaygpCisgICAgeyAKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jaygmX01fbXV0ZXgpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfbG9ja19lcnJvcigpOworCX0KKyNlbmRpZgorICAgIH0KKyAgICAKKyAgICB2b2lkIHVubG9jaygpCisgICAgeyAKKyNpZiBfX0dUSFJFQURTCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJeworCSAgaWYgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV91bmxvY2tfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QqIGd0aHJlYWRfcmVjdXJzaXZlX211dGV4KHZvaWQpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyAgICAvLyBGSVhNRTogZ3RocmVhZHMgZG9lc24ndCBkZWZpbmUgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95CisgICAgLy8gc28gd2UgbmVlZCB0byBvYnRhaW4gYSBfX2d0aHJlYWRfbXV0ZXhfdCB0byBkZXN0cm95CisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX014LCB0eXBlbmFtZSBfUm0+CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZGVzdHJveV93aW4zMihfTXgqIF9fbXgsIF9SbSBjb25zdCogX19ybXgpCisgICAgICB7CisgICAgICAgIF9fbXgtPmNvdW50ZXIgPSBfX3JteC0+Y291bnRlcjsKKyAgICAgICAgX19teC0+c2VtYSA9IF9fcm14LT5zZW1hOworICAgICAgICBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveShfX214KTsKKyAgICAgIH0KKworICAgIC8vIG1hdGNoZXMgYSBndGhyLXdpbjMyLmggcmVjdXJzaXZlIG11dGV4CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JtPgorICAgICAgc3RhdGljIHR5cGVuYW1lIF9fZW5hYmxlX2lmPHNpemVvZigmX1JtOjpzZW1hKSwgdm9pZD46Ol9fdHlwZQorICAgICAgX1NfZGVzdHJveShfUm0qIF9fbXgpCisgICAgICB7CisgICAgICAgIF9fZ3RocmVhZF9tdXRleF90IF9fdG1wOworICAgICAgICBfU19kZXN0cm95X3dpbjMyKCZfX3RtcCwgX19teCk7CisgICAgICB9CisKKyAgICAvLyBtYXRjaGVzIGEgcmVjdXJzaXZlIG11dGV4IHdpdGggYSBtZW1iZXIgJ2FjdHVhbCcKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUm0+CisgICAgICBzdGF0aWMgdHlwZW5hbWUgX19lbmFibGVfaWY8c2l6ZW9mKCZfUm06OmFjdHVhbCksIHZvaWQ+OjpfX3R5cGUKKyAgICAgIF9TX2Rlc3Ryb3koX1JtKiBfX214KQorICAgICAgeyBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX19teC0+YWN0dWFsKTsgfQorCisgICAgLy8gbWF0Y2hlcyB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgbXV0ZXggdHlwZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SbT4KKyAgICAgIHN0YXRpYyB0eXBlbmFtZQorICAgICAgX19lbmFibGVfaWY8c3RkOjpfX2FyZV9zYW1lPF9SbSwgX19ndGhyZWFkX211dGV4X3Q+OjpfX3ZhbHVlLAorICAgICAgICB2b2lkPjo6X190eXBlCisgICAgICBfU19kZXN0cm95KF9SbSogX19teCkKKyAgICAgIHsgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3koX19teCk7IH0KKyNlbmRpZgorICB9OworCisgIC8vLyBTY29wZWQgbG9jayBpZGlvbS4KKyAgLy8gQWNxdWlyZSB0aGUgbXV0ZXggaGVyZSB3aXRoIGEgY29uc3RydWN0b3IgY2FsbCwgdGhlbiByZWxlYXNlIHdpdGgKKyAgLy8gdGhlIGRlc3RydWN0b3IgY2FsbCBpbiBhY2NvcmRhbmNlIHdpdGggUkFJSSBzdHlsZS4KKyAgY2xhc3MgX19zY29wZWRfbG9jaworICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fbXV0ZXggX19tdXRleF90eXBlOworCisgIHByaXZhdGU6CisgICAgX19tdXRleF90eXBlJiBfTV9kZXZpY2U7CisKKyAgICBfX3Njb3BlZF9sb2NrKGNvbnN0IF9fc2NvcGVkX2xvY2smKTsKKyAgICBfX3Njb3BlZF9sb2NrJiBvcGVyYXRvcj0oY29uc3QgX19zY29wZWRfbG9jayYpOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBfX3Njb3BlZF9sb2NrKF9fbXV0ZXhfdHlwZSYgX19uYW1lKSA6IF9NX2RldmljZShfX25hbWUpCisgICAgeyBfTV9kZXZpY2UubG9jaygpOyB9CisKKyAgICB+X19zY29wZWRfbG9jaygpIHRocm93KCkKKyAgICB7IF9NX2RldmljZS51bmxvY2soKTsgfQorICB9OworCisjaWZkZWYgX19HVEhSRUFEX0hBU19DT05ECisgIGNsYXNzIF9fY29uZAorICB7CisgIHByaXZhdGU6CisgICAgX19ndGhyZWFkX2NvbmRfdCBfTV9jb25kOworCisgICAgX19jb25kKGNvbnN0IF9fY29uZCYpOworICAgIF9fY29uZCYgb3BlcmF0b3I9KGNvbnN0IF9fY29uZCYpOworCisgIHB1YmxpYzoKKyAgICBfX2NvbmQoKSAKKyAgICB7IAorI2lmIF9fR1RIUkVBRFMKKyAgICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwl7CisjaWYgZGVmaW5lZCBfX0dUSFJFQURfQ09ORF9JTklUCisJICBfX2d0aHJlYWRfY29uZF90IF9fdG1wID0gX19HVEhSRUFEX0NPTkRfSU5JVDsKKwkgIF9NX2NvbmQgPSBfX3RtcDsKKyNlbHNlCisJICBfX0dUSFJFQURfQ09ORF9JTklUX0ZVTkNUSU9OKCZfTV9jb25kKTsKKyNlbmRpZgorCX0KKyNlbmRpZiAKKyAgICB9CisKKyNpZiBfX0dUSFJFQURTICYmICEgZGVmaW5lZCBfX0dUSFJFQURfQ09ORF9JTklUCisgICAgfl9fY29uZCgpIAorICAgIHsgCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wKCkpCisJX19ndGhyZWFkX2NvbmRfZGVzdHJveSgmX01fY29uZCk7IAorICAgIH0KKyNlbmRpZiAKKworICAgIHZvaWQgYnJvYWRjYXN0KCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCXsKKwkgIGlmIChfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QoJl9NX2NvbmQpICE9IDApCisJICAgIF9fdGhyb3dfY29uY3VycmVuY2VfYnJvYWRjYXN0X2Vycm9yKCk7CisJfQorI2VuZGlmCisgICAgfQorCisgICAgdm9pZCB3YWl0KF9fbXV0ZXggKm11dGV4KQorICAgIHsKKyNpZiBfX0dUSFJFQURTCisgICAgICB7CisJICBpZiAoX19ndGhyZWFkX2NvbmRfd2FpdCgmX01fY29uZCwgbXV0ZXgtPmd0aHJlYWRfbXV0ZXgoKSkgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV93YWl0X2Vycm9yKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIHdhaXRfcmVjdXJzaXZlKF9fcmVjdXJzaXZlX211dGV4ICptdXRleCkKKyAgICB7CisjaWYgX19HVEhSRUFEUworICAgICAgeworCSAgaWYgKF9fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlKCZfTV9jb25kLAorCQkJCQkgICAgbXV0ZXgtPmd0aHJlYWRfcmVjdXJzaXZlX211dGV4KCkpCisJICAgICAgIT0gMCkKKwkgICAgX190aHJvd19jb25jdXJyZW5jZV93YWl0X2Vycm9yKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH07CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2RlYnVnX2FsbG9jYXRvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvZGVidWdfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhNWVhNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2RlYnVnX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTI3IEBACisvLyBBbGxvY2F0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L2RlYnVnX2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfREVCVUdfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX0RFQlVHX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworCisgIC8qKgorICAgKiAgQGJyaWVmICBBIG1ldGEtYWxsb2NhdG9yIHdpdGggZGVidWdnaW5nIGJpdHMsIGFzIHBlciBbMjAuNF0uCisgICAqICBAaW5ncm91cCBhbGxvY2F0b3JzCisgICAqCisgICAqICBUaGlzIGlzIHByZWNpc2VseSB0aGUgYWxsb2NhdG9yIGRlZmluZWQgaW4gdGhlIEMrKyBTdGFuZGFyZC4gCisgICAqICAgIC0gYWxsIGFsbG9jYXRpb24gY2FsbHMgb3BlcmF0b3IgbmV3CisgICAqICAgIC0gYWxsIGRlYWxsb2NhdGlvbiBjYWxscyBvcGVyYXRvciBkZWxldGUKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBkZWJ1Z19hbGxvY2F0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnNpemVfdHlwZSAgICAgICAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmRpZmZlcmVuY2VfdHlwZQlkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlciAgICAgICAJcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpjb25zdF9wb2ludGVyICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cmVmZXJlbmNlICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dmFsdWVfdHlwZSAgICAgICB2YWx1ZV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9NX2V4dHJhIGlzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICAvLyBleHRyYSBzcGFjZSB3aGVyZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuCisgICAgICBzaXplX3R5cGUgCQlfTV9leHRyYTsKKyAgICAgIAorICAgICAgX0FsbG9jCQkJX01fYWxsb2NhdG9yOworCisgICAgcHVibGljOgorICAgICAgZGVidWdfYWxsb2NhdG9yKCkKKyAgICAgIHsKKwljb25zdCBzaXplX3QgX19vYmpfc2l6ZSA9IHNpemVvZih2YWx1ZV90eXBlKTsKKwlfTV9leHRyYSA9IChzaXplb2Yoc2l6ZV90eXBlKSArIF9fb2JqX3NpemUgLSAxKSAvIF9fb2JqX3NpemU7IAorICAgICAgfQorICAgICAgCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBwb2ludGVyIF9fcmVzID0gX01fYWxsb2NhdG9yLmFsbG9jYXRlKF9fbiArIF9NX2V4dHJhKTsgICAgICAKKwlzaXplX3R5cGUqIF9fcHMgPSByZWludGVycHJldF9jYXN0PHNpemVfdHlwZSo+KF9fcmVzKTsKKwkqX19wcyA9IF9fbjsKKyAgICAgICAgcmV0dXJuIF9fcmVzICsgX01fZXh0cmE7CisgICAgICB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqIF9faGludCkKKyAgICAgIHsKKyAgICAgICAgcG9pbnRlciBfX3JlcyA9IF9NX2FsbG9jYXRvci5hbGxvY2F0ZShfX24gKyBfTV9leHRyYSwgX19oaW50KTsKKwlzaXplX3R5cGUqIF9fcHMgPSByZWludGVycHJldF9jYXN0PHNpemVfdHlwZSo+KF9fcmVzKTsKKwkqX19wcyA9IF9fbjsKKyAgICAgICAgcmV0dXJuIF9fcmVzICsgX01fZXh0cmE7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fcCkKKwkgIHsKKwkgICAgcG9pbnRlciBfX3JlYWxfcCA9IF9fcCAtIF9NX2V4dHJhOworCSAgICBpZiAoKnJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90eXBlKj4oX19yZWFsX3ApICE9IF9fbikKKwkgICAgICB7CisJCXRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZGVidWdfYWxsb2NhdG9yOjpkZWFsbG9jYXRlIgorCQkJCQkgIiB3cm9uZyBzaXplIik7CisJICAgICAgfQorCSAgICBfTV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3JlYWxfcCwgX19uICsgX01fZXh0cmEpOworCSAgfQorCWVsc2UKKwkgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiZGVidWdfYWxsb2NhdG9yOjpkZWFsbG9jYXRlIG51bGwgcG9pbnRlciIpOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9lbmNfZmlsZWJ1Zi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvZW5jX2ZpbGVidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThkMzMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvZW5jX2ZpbGVidWYuaApAQCAtMCwwICsxLDY1IEBACisvLyBmaWxlYnVmIHdpdGggZW5jb2Rpbmcgc3RhdGUgdHlwZSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9lbmNfZmlsZWJ1Zi5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfRVhUX0VOQ19GSUxFQlVGX0gKKyNkZWZpbmUgX0VYVF9FTkNfRklMRUJVRl9IIDEKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIGNsYXNzIGVuY19maWxlYnVmLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgY2xhc3MgZW5jX2ZpbGVidWYKKyAgICA6IHB1YmxpYyBzdGQ6OmJhc2ljX2ZpbGVidWY8X0NoYXJULCBlbmNvZGluZ19jaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBlbmNvZGluZ19jaGFyX3RyYWl0czxfQ2hhclQ+ICAgICAJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpzdGF0ZV90eXBlCXN0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZQlwb3NfdHlwZTsKKworICAgICAgZW5jX2ZpbGVidWYoc3RhdGVfdHlwZSYgX19zdGF0ZSkKKyAgICAgIDogc3RkOjpiYXNpY19maWxlYnVmPF9DaGFyVCwgZW5jb2RpbmdfY2hhcl90cmFpdHM8X0NoYXJUPiA+KCkKKyAgICAgIHsgdGhpcy0+X01fc3RhdGVfYmVnID0gX19zdGF0ZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzOgorICAgICAgLy8gU2V0IHN0YXRlIHR5cGUgdG8gc29tZXRoaW5nIHVzZWZ1bC4KKyAgICAgIC8vIFNvbWV0aGluZyBtb3JlIHRoYW4gY29weWNvbnN0cnVjdGlibGUgaXMgbmVlZGVkIGhlcmUsIHNvCisgICAgICAvLyByZXF1aXJlIGRlZmF1bHQgYW5kIGNvcHkgY29uc3RydWN0aWJsZSArIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoc3RhdGVfdHlwZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9leHRwdHJfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9leHRwdHJfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNzZhYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2V4dHB0cl9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDE4MSBAQAorLy8gPGV4dHB0cl9hbGxvY2F0b3IuaD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogIEBmaWxlIGV4dC9leHRwdHJfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqCisgKiAgQGF1dGhvciBCb2IgV2FsdGVycworICoKKyAqIEFuIGV4YW1wbGUgYWxsb2NhdG9yIHdoaWNoIHVzZXMgYW4gYWx0ZXJuYXRpdmUgcG9pbnRlciB0eXBlIGZyb20KKyAqIGJpdHMvcG9pbnRlci5oLiAgU3VwcG9ydHMgdGVzdCBjYXNlcyB3aGljaCBjb25maXJtIGNvbnRhaW5lciBzdXBwb3J0CisgKiBmb3IgYWx0ZXJuYXRpdmUgcG9pbnRlcnMuCisgKi8KKworI2lmbmRlZiBfRVhUUFRSX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9FWFRQVFJfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxleHQvcG9pbnRlci5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBicmllZiBBbiBleGFtcGxlIGFsbG9jYXRvciB3aGljaCB1c2VzIGEgbm9uLXN0YW5kYXJkIHBvaW50ZXIgdHlwZS4KKyAgICogQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiBUaGlzIGFsbG9jYXRvciBzcGVjaWZpZXMgdGhhdCBjb250YWluZXJzIHVzZSBhICdyZWxhdGl2ZSBwb2ludGVyJyBhcyBpdCdzCisgICAqIHBvaW50ZXIgdHlwZS4gIChTZWUgZXh0L3BvaW50ZXIuaCkgIE1lbW9yeSBhbGxvY2F0aW9uIGluIHRoaXMgZXhhbXBsZQorICAgKiBpcyBzdGlsbCBwZXJmb3JtZWQgdXNpbmcgc3RkOjphbGxvY2F0b3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX0V4dFB0cl9hbGxvY2F0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLyBOb3RlIHRoZSBub24tc3RhbmRhcmQgcG9pbnRlciB0eXBlcy4KKyAgICAgIHR5cGVkZWYgX1BvaW50ZXJfYWRhcHRlcjxfUmVsYXRpdmVfcG9pbnRlcl9pbXBsPF9UcD4gPiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyPF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8Y29uc3QgX1RwPiA+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiBvdGhlcjsgfTsKKworICAgICAgX0V4dFB0cl9hbGxvY2F0b3IoKSB0aHJvdygpIAorICAgICAgOiBfTV9yZWFsX2FsbG9jKCkgeyB9CisKKyAgICAgIF9FeHRQdHJfYWxsb2NhdG9yKGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yICZfX3JhcmcpIHRocm93KCkKKyAgICAgIDogX01fcmVhbF9hbGxvYyhfX3JhcmcuX01fcmVhbF9hbGxvYykgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX0V4dFB0cl9hbGxvY2F0b3IoY29uc3QgX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiYgX19yYXJnKSB0aHJvdygpCisgICAgICAgIDogX01fcmVhbF9hbGxvYyhfX3JhcmcuX01fZ2V0VW5kZXJseWluZ0ltcCgpKSB7IH0KKworICAgICAgfl9FeHRQdHJfYWxsb2NhdG9yKCkgdGhyb3coKQorICAgICAgeyB9CisKKyAgICAgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHBvaW50ZXIgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgdm9pZCogX19oaW50ID0gMCkKKyAgICAgIHsgcmV0dXJuIF9NX3JlYWxfYWxsb2MuYWxsb2NhdGUoX19uLF9faGludCk7IH0KKworICAgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgICAgeyBfTV9yZWFsX2FsbG9jLmRlYWxsb2NhdGUoX19wLmdldCgpLCBfX24pOyB9CisKKyAgICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90eXBlPjo6bWF4KCkgLyBzaXplb2YoX1RwKTsgfQorCisgICAgICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICAgIHsgOjpuZXcoX19wLmdldCgpKSBfVHAoX192YWwpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgICAgeyA6Om5ldyhfX3AuZ2V0KCkpIF9UcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKQorICAgICAgeyBfX3AtPn5fVHAoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiYgX19yYXJnKQorICAgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jID09IF9fcmFyZy5fTV9nZXRVbmRlcmx5aW5nSW1wKCk7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX0V4dFB0cl9hbGxvY2F0b3ImIF9fcmFyZykKKyAgICAgIHsgcmV0dXJuIF9NX3JlYWxfYWxsb2MgPT0gX19yYXJnLl9NX3JlYWxfYWxsb2M7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvciE9KGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mIF9fcmFyZykKKyAgICAgICAgeyByZXR1cm4gX01fcmVhbF9hbGxvYyAhPSBfX3JhcmcuX01fZ2V0VW5kZXJseWluZ0ltcCgpOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IF9FeHRQdHJfYWxsb2NhdG9yJiBfX3JhcmcpCisgICAgICB7IHJldHVybiBfTV9yZWFsX2FsbG9jICE9IF9fcmFyZy5fTV9yZWFsX2FsbG9jOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIGZyaWVuZCB2b2lkCisgICAgICAgIHN3YXAoX0V4dFB0cl9hbGxvY2F0b3I8X1VwPiYsIF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4mKTsKKworICAgICAgLy8gQSBtZXRob2Qgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIGNvbnN0IHN0ZDo6YWxsb2NhdG9yPF9UcD4mCisgICAgICBfTV9nZXRVbmRlcmx5aW5nSW1wKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlYWxfYWxsb2M7IH0KKworICAgIHByaXZhdGU6CisgICAgICBzdGQ6OmFsbG9jYXRvcjxfVHA+ICBfTV9yZWFsX2FsbG9jOworICAgIH07CisKKyAgLy8gX0V4dFB0cl9hbGxvY2F0b3I8dm9pZD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfRXh0UHRyX2FsbG9jYXRvcjx2b2lkPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90ICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICAvLyBOb3RlIHRoZSBub24tc3RhbmRhcmQgcG9pbnRlciB0eXBlcworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyPF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8dm9pZD4gPiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyPF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8Y29uc3Qgdm9pZD4gPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIF9FeHRQdHJfYWxsb2NhdG9yPF9VcD4gb3RoZXI7IH07CisKKyAgICBwcml2YXRlOgorICAgICAgc3RkOjphbGxvY2F0b3I8dm9pZD4gIF9NX3JlYWxfYWxsb2M7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9FeHRQdHJfYWxsb2NhdG9yPF9UcD4mIF9fbGFyZywgX0V4dFB0cl9hbGxvY2F0b3I8X1RwPiYgX19yYXJnKQorICAgIHsKKyAgICAgIHN0ZDo6YWxsb2NhdG9yPF9UcD4gX190bXAoIF9fcmFyZy5fTV9yZWFsX2FsbG9jICk7CisgICAgICBfX3JhcmcuX01fcmVhbF9hbGxvYyA9IF9fbGFyZy5fTV9yZWFsX2FsbG9jOworICAgICAgX19sYXJnLl9NX3JlYWxfYWxsb2MgPSBfX3RtcDsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9FWFRQVFJfQUxMT0NBVE9SX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2Z1bmN0aW9uYWwgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9mdW5jdGlvbmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOGFjZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9mdW5jdGlvbmFsCkBAIC0wLDAgKzEsNDI3IEBACisvLyBGdW5jdGlvbmFsIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGV4dC9mdW5jdGlvbmFsCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9FWFRfRlVOQ1RJT05BTAorI2RlZmluZSBfRVhUX0ZVTkNUSU9OQUwgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6dW5hcnlfZnVuY3Rpb247CisgIHVzaW5nIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uOworICB1c2luZyBzdGQ6Om1lbV9mdW4xX3Q7CisgIHVzaW5nIHN0ZDo6Y29uc3RfbWVtX2Z1bjFfdDsKKyAgdXNpbmcgc3RkOjptZW1fZnVuMV9yZWZfdDsKKyAgdXNpbmcgc3RkOjpjb25zdF9tZW1fZnVuMV9yZWZfdDsKKworICAvKiogVGhlIEBjIGlkZW50aXR5X2VsZW1lbnQgZnVuY3Rpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgQysrCisgICAqICBzdGFuZGFyZDsgU0dJIHByb3ZpZGVkIHRoZW0gYXMgYW4gZXh0ZW5zaW9uLiAgSXRzIGFyZ3VtZW50IGlzIGFuCisgICAqICBvcGVyYXRpb24sIGFuZCBpdHMgcmV0dXJuIHZhbHVlIGlzIHRoZSBpZGVudGl0eSBlbGVtZW50IGZvciB0aGF0CisgICAqICBvcGVyYXRpb24uICBJdCBpcyBvdmVybG9hZGVkIGZvciBhZGRpdGlvbiBhbmQgbXVsdGlwbGljYXRpb24sCisgICAqICBhbmQgeW91IGNhbiBvdmVybG9hZCBpdCBmb3IgeW91ciBvd24gbmVmYXJpb3VzIG9wZXJhdGlvbnMuCisgICAqCisgICAqICBAYWRkdG9ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAeworICAgKi8KKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgaWRlbnRpdHlfZWxlbWVudChzdGQ6OnBsdXM8X1RwPikKKyAgICB7IHJldHVybiBfVHAoMCk7IH0KKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBpZGVudGl0eV9lbGVtZW50KHN0ZDo6bXVsdGlwbGllczxfVHA+KQorICAgIHsgcmV0dXJuIF9UcCgxKTsgfQorICAvKiogQH0gICovCisgIAorICAvKiogQXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBiaW5kZXJzLCBTR0kgcHJvdmlkZWQgY29tcG9zaXRpb24gZnVuY3RvcnMgYW5kCisgICAqICB3cmFwcGVyIGZ1bmN0aW9ucyB0byBhaWQgaW4gdGhlaXIgY3JlYXRpb24uICBUaGUgQGMgdW5hcnlfY29tcG9zZQorICAgKiAgZnVuY3RvciBpcyBjb25zdHJ1Y3RlZCBmcm9tIHR3byBmdW5jdGlvbnMvZnVuY3RvcnMsIEBjIGYgYW5kIEBjIGcuCisgICAqICBDYWxsaW5nIEBjIG9wZXJhdG9yKCkgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCBAYyB4IHJldHVybnMgQGMgZihnKHgpKS4KKyAgICogIFRoZSBmdW5jdGlvbiBAYyBjb21wb3NlMSB0YWtlcyB0aGUgdHdvIGZ1bmN0aW9ucyBhbmQgY29uc3RydWN0cyBhCisgICAqICBAYyB1bmFyeV9jb21wb3NlIHZhcmlhYmxlIGZvciB5b3UuCisgICAqCisgICAqICBAYyBiaW5hcnlfY29tcG9zZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRocmVlIGZ1bmN0b3JzLCBAYyBmLCBAYyBnMSwKKyAgICogIGFuZCBAYyBnMi4gIEl0cyBAYyBvcGVyYXRvcigpIHJldHVybnMgQGMgZihnMSh4KSxnMih4KSkuICBUaGUgZnVuY3Rpb24KKyAgICogIEBjb21wb3NlMiB0YWtlcyBmLCBnMSwgYW5kIGcyLCBhbmQgY29uc3RydWN0cyB0aGUgQGMgYmluYXJ5X2NvbXBvc2UKKyAgICogIGluc3RhbmNlIGZvciB5b3UuICBGb3IgZXhhbXBsZSwgaWYgQGMgZiByZXR1cm5zIGFuIGludCwgdGhlbgorICAgKiAgXGNvZGUKKyAgICogIGludCBhbnN3ZXIgPSAoY29tcG9zZTIoZixnMSxnMikpKHgpOworICAgKiAgXGVuZGNvZGUKKyAgICogIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIFxjb2RlCisgICAqICBpbnQgdGVtcDEgPSBnMSh4KTsKKyAgICogIGludCB0ZW1wMiA9IGcyKHgpOworICAgKiAgaW50IGFuc3dlciA9IGYodGVtcDEsdGVtcDIpOworICAgKiAgXGVuZGNvZGUKKyAgICogIEJ1dCB0aGUgZmlyc3QgZm9ybSBpcyBtb3JlIGNvbXBhY3QsIGFuZCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBhcyBhCisgICAqICBmdW5jdG9yIHRvIG90aGVyIGFsZ29yaXRobXMuCisgICAqCisgICAqICBAYWRkdG9ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAeworICAgKi8KKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KKyAgICBjbGFzcyB1bmFyeV9jb21wb3NlCisgICAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUsCisJCQkgICAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfT3BlcmF0aW9uMSBfTV9mbjE7CisgICAgICBfT3BlcmF0aW9uMiBfTV9mbjI7CisKKyAgICBwdWJsaWM6CisgICAgICB1bmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3kpCisgICAgICA6IF9NX2ZuMShfX3gpLCBfTV9mbjIoX195KSB7fQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZuMShfTV9mbjIoX194KSk7IH0KKyAgICB9OworCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+CisgICAgaW5saW5lIHVuYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yPgorICAgIGNvbXBvc2UxKGNvbnN0IF9PcGVyYXRpb24xJiBfX2ZuMSwgY29uc3QgX09wZXJhdGlvbjImIF9fZm4yKQorICAgIHsgcmV0dXJuIHVuYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjI+KF9fZm4xLCBfX2ZuMik7IH0KKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9uMz4KKyAgICBjbGFzcyBiaW5hcnlfY29tcG9zZQorICAgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRpb24yOjphcmd1bWVudF90eXBlLAorCQkJICAgIHR5cGVuYW1lIF9PcGVyYXRpb24xOjpyZXN1bHRfdHlwZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX09wZXJhdGlvbjEgX01fZm4xOworICAgICAgX09wZXJhdGlvbjIgX01fZm4yOworICAgICAgX09wZXJhdGlvbjMgX01fZm4zOworICAgICAgCisgICAgcHVibGljOgorICAgICAgYmluYXJ5X2NvbXBvc2UoY29uc3QgX09wZXJhdGlvbjEmIF9feCwgY29uc3QgX09wZXJhdGlvbjImIF9feSwKKwkJICAgICBjb25zdCBfT3BlcmF0aW9uMyYgX196KQorICAgICAgOiBfTV9mbjEoX194KSwgX01fZm4yKF9feSksIF9NX2ZuMyhfX3opIHsgfQorCisgICAgICB0eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZuMShfTV9mbjIoX194KSwgX01fZm4zKF9feCkpOyB9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9uMz4KKyAgICBpbmxpbmUgYmluYXJ5X2NvbXBvc2U8X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4KKyAgICBjb21wb3NlMihjb25zdCBfT3BlcmF0aW9uMSYgX19mbjEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX2ZuMiwKKwkgICAgIGNvbnN0IF9PcGVyYXRpb24zJiBfX2ZuMykKKyAgICB7IHJldHVybiBiaW5hcnlfY29tcG9zZTxfT3BlcmF0aW9uMSwgX09wZXJhdGlvbjIsIF9PcGVyYXRpb24zPgorCShfX2ZuMSwgX19mbjIsIF9fZm4zKTsgfQorICAvKiogQH0gICovCisKKyAgLyoqIEFzIGFuIGV4dGVuc2lvbiwgU0dJIHByb3ZpZGVkIGEgZnVuY3RvciBjYWxsZWQgQGMgaWRlbnRpdHkuICBXaGVuIGEKKyAgICogIGZ1bmN0b3IgaXMgcmVxdWlyZWQgYnV0IG5vIG9wZXJhdGlvbnMgYXJlIGRlc2lyZWQsIHRoaXMgY2FuIGJlIHVzZWQgYXMgYQorICAgKiAgcGFzcy10aHJvdWdoLiAgSXRzIEBjIG9wZXJhdG9yKCkgcmV0dXJucyBpdHMgYXJndW1lbnQgdW5jaGFuZ2VkLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9UcD4KKyAgICBzdHJ1Y3QgaWRlbnRpdHkgOiBwdWJsaWMgc3RkOjpfSWRlbnRpdHk8X1RwPiB7fTsKKworICAvKiogQGMgc2VsZWN0MXN0IGFuZCBAYyBzZWxlY3QybmQgYXJlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgU0dJLiAgVGhlaXIKKyAgICogIEBjIG9wZXJhdG9yKClzCisgICAqICB0YWtlIGEgQGMgc3RkOjpwYWlyIGFzIGFuIGFyZ3VtZW50LCBhbmQgcmV0dXJuIGVpdGhlciB0aGUgZmlyc3QgbWVtYmVyCisgICAqICBvciB0aGUgc2Vjb25kIG1lbWJlciwgcmVzcGVjdGl2ZWx5LiAgVGhleSBjYW4gYmUgdXNlZCAoZXNwZWNpYWxseSB3aXRoCisgICAqICB0aGUgY29tcG9zaXRpb24gZnVuY3RvcnMpIHRvIEBhIHN0cmlwIGRhdGEgZnJvbSBhIHNlcXVlbmNlIGJlZm9yZQorICAgKiAgcGVyZm9ybWluZyB0aGUgcmVtYWluZGVyIG9mIGFuIGFsZ29yaXRobS4KKyAgICoKKyAgICogIEBhZGR0b2dyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEB7CisgICAqLworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CisgICAgc3RydWN0IHNlbGVjdDFzdCA6IHB1YmxpYyBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+IHt9OworCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfUGFpcj4KKyAgICBzdHJ1Y3Qgc2VsZWN0Mm5kIDogcHVibGljIHN0ZDo6X1NlbGVjdDJuZDxfUGFpcj4ge307CisgIC8qKiBAfSAgKi8KKworICAvLyBleHRlbnNpb24gZG9jdW1lbnRlZCBuZXh0CisgIHRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CisgICAgc3RydWN0IF9Qcm9qZWN0MXN0IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9BcmcxPgorICAgIHsKKyAgICAgIF9BcmcxCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiBfX3gsIGNvbnN0IF9BcmcyJikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9feDsgfQorICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KKyAgICBzdHJ1Y3QgX1Byb2plY3QybmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLCBfQXJnMiwgX0FyZzI+CisgICAgeworICAgICAgX0FyZzIKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25zdCBfQXJnMiYgX195KSBjb25zdAorICAgICAgeyByZXR1cm4gX195OyB9CisgICAgfTsKKworICAvKiogVGhlIEBjIG9wZXJhdG9yKCkgb2YgdGhlIEBjIHByb2plY3Qxc3QgZnVuY3RvciB0YWtlcyB0d28gYXJiaXRyYXJ5CisgICAqICBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IG9uZSwgd2hpbGUgQGMgcHJvamVjdDJuZCByZXR1cm5zIHRoZQorICAgKiAgc2Vjb25kIG9uZS4gIFRoZXkgYXJlIGV4dGVuc2lvbnMgcHJvdmlkZWQgYnkgU0dJLgorICAgKgorICAgKiAgQGFkZHRvZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQHsKKyAgICovCisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4KKyAgICBzdHJ1Y3QgcHJvamVjdDFzdCA6IHB1YmxpYyBfUHJvamVjdDFzdDxfQXJnMSwgX0FyZzI+IHt9OworCisgIC8vLyBBbiBcbGluayBTR0lleHRlbnNpb25zIFNHSSBleHRlbnNpb24gXGVuZGxpbmsuCisgIHRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+CisgICAgc3RydWN0IHByb2plY3QybmQgOiBwdWJsaWMgX1Byb2plY3QybmQ8X0FyZzEsIF9BcmcyPiB7fTsKKyAgLyoqIEB9ICAqLworCisgIC8vIGV4dGVuc2lvbiBkb2N1bWVudGVkIG5leHQKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgc3RydWN0IF9Db25zdGFudF92b2lkX2Z1bgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3ZhbDsKKworICAgICAgX0NvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX01fdmFsKF9fdikge30KKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUmCisgICAgICBvcGVyYXRvcigpKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3ZhbDsgfQorICAgIH07CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9Bcmd1bWVudD4KKyAgICBzdHJ1Y3QgX0NvbnN0YW50X3VuYXJ5X2Z1bgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0FyZ3VtZW50IGFyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmICBfUmVzdWx0ICByZXN1bHRfdHlwZTsKKyAgICAgIHJlc3VsdF90eXBlIF9NX3ZhbDsKKyAgICAgIAorICAgICAgX0NvbnN0YW50X3VuYXJ5X2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9NX3ZhbChfX3YpIHt9CisKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQXJndW1lbnQmKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdmFsOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyPgorICAgIHN0cnVjdCBfQ29uc3RhbnRfYmluYXJ5X2Z1bgorICAgIHsKKyAgICAgIHR5cGVkZWYgIF9BcmcxICAgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgIF9BcmcyICAgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmICBfUmVzdWx0IHJlc3VsdF90eXBlOworICAgICAgX1Jlc3VsdCBfTV92YWw7CisKKyAgICAgIF9Db25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikgOiBfTV92YWwoX192KSB7fQorICAgICAgCisgICAgICBjb25zdCByZXN1bHRfdHlwZSYKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25zdCBfQXJnMiYpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV92YWw7IH0KKyAgICB9OworCisgIC8qKiBUaGVzZSB0aHJlZSBmdW5jdG9ycyBhcmUgZWFjaCBjb25zdHJ1Y3RlZCBmcm9tIGEgc2luZ2xlIGFyYml0cmFyeQorICAgKiAgdmFyaWFibGUvdmFsdWUuICBMYXRlciwgdGhlaXIgQGMgb3BlcmF0b3IoKXMgY29tcGxldGVseSBpZ25vcmUgYW55CisgICAqICBhcmd1bWVudHMgcGFzc2VkLCBhbmQgcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWUuCisgICAqICAtIEBjIGNvbnN0YW50X3ZvaWRfZnVuJ3MgQGMgb3BlcmF0b3IoKSB0YWtlcyBubyBhcmd1bWVudHMKKyAgICogIC0gQGMgY29uc3RhbnRfdW5hcnlfZnVuJ3MgQGMgb3BlcmF0b3IoKSB0YWtlcyBvbmUgYXJndW1lbnQgKGlnbm9yZWQpCisgICAqICAtIEBjIGNvbnN0YW50X2JpbmFyeV9mdW4ncyBAYyBvcGVyYXRvcigpIHRha2VzIHR3byBhcmd1bWVudHMgKGlnbm9yZWQpCisgICAqCisgICAqICBUaGUgaGVscGVyIGNyZWF0b3IgZnVuY3Rpb25zIEBjIGNvbnN0YW50MCwgQGMgY29uc3RhbnQxLCBhbmQKKyAgICogIEBjIGNvbnN0YW50MiBlYWNoIHRha2UgYSBAYSByZXN1bHQgYXJndW1lbnQgYW5kIGNvbnN0cnVjdCB2YXJpYWJsZXMgb2YKKyAgICogIHRoZSBhcHByb3ByaWF0ZSBmdW5jdG9yIHR5cGUuCisgICAqCisgICAqICBAYWRkdG9ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAeworICAgKi8KKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgc3RydWN0IGNvbnN0YW50X3ZvaWRfZnVuCisgICAgOiBwdWJsaWMgX0NvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+CisgICAgeworICAgICAgY29uc3RhbnRfdm9pZF9mdW4oY29uc3QgX1Jlc3VsdCYgX192KQorICAgICAgOiBfQ29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4oX192KSB7fQorICAgIH07CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9Bcmd1bWVudCA9IF9SZXN1bHQ+CisgICAgc3RydWN0IGNvbnN0YW50X3VuYXJ5X2Z1biA6IHB1YmxpYyBfQ29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9Bcmd1bWVudD4KKyAgICB7CisgICAgICBjb25zdGFudF91bmFyeV9mdW4oY29uc3QgX1Jlc3VsdCYgX192KQorICAgICAgOiBfQ29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsIF9Bcmd1bWVudD4oX192KSB7fQorICAgIH07CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQsIGNsYXNzIF9BcmcxID0gX1Jlc3VsdCwgY2xhc3MgX0FyZzIgPSBfQXJnMT4KKyAgICBzdHJ1Y3QgY29uc3RhbnRfYmluYXJ5X2Z1bgorICAgIDogcHVibGljIF9Db25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsIF9BcmcxLCBfQXJnMj4KKyAgICB7CisgICAgICBjb25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikKKyAgICAgIDogX0NvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX0FyZzEsIF9BcmcyPihfX3YpIHt9CisgICAgfTsKKworICAvLy8gQW4gXGxpbmsgU0dJZXh0ZW5zaW9ucyBTR0kgZXh0ZW5zaW9uIFxlbmRsaW5rLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KKyAgICBpbmxpbmUgY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4KKyAgICBjb25zdGFudDAoY29uc3QgX1Jlc3VsdCYgX192YWwpCisgICAgeyByZXR1cm4gY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4oX192YWwpOyB9CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgaW5saW5lIGNvbnN0YW50X3VuYXJ5X2Z1bjxfUmVzdWx0LCBfUmVzdWx0PgorICAgIGNvbnN0YW50MShjb25zdCBfUmVzdWx0JiBfX3ZhbCkKKyAgICB7IHJldHVybiBjb25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCwgX1Jlc3VsdD4oX192YWwpOyB9CisKKyAgLy8vIEFuIFxsaW5rIFNHSWV4dGVuc2lvbnMgU0dJIGV4dGVuc2lvbiBcZW5kbGluay4KKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CisgICAgaW5saW5lIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0LF9SZXN1bHQ+CisgICAgY29uc3RhbnQyKGNvbnN0IF9SZXN1bHQmIF9fdmFsKQorICAgIHsgcmV0dXJuIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCwgX1Jlc3VsdCwgX1Jlc3VsdD4oX192YWwpOyB9CisgIC8qKiBAfSAgKi8KKworICAvKiogVGhlIEBjIHN1YnRyYWN0aXZlX3JuZyBjbGFzcyBpcyBkb2N1bWVudGVkIG9uCisgICAqICA8YSBocmVmPSJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvIj5TR0kncyBzaXRlPC9hPi4KKyAgICogIE5vdGUgdGhhdCB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IEBjIGludCBpcyAzMiBiaXRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKi8KKyAgY2xhc3Mgc3VidHJhY3RpdmVfcm5nCisgIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PgorICB7CisgIHByaXZhdGU6CisgICAgdW5zaWduZWQgaW50IF9NX3RhYmxlWzU1XTsKKyAgICBzaXplX3QgX01faW5kZXgxOworICAgIHNpemVfdCBfTV9pbmRleDI7CisKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm5zIGEgbnVtYmVyIGxlc3MgdGhhbiB0aGUgYXJndW1lbnQuCisgICAgdW5zaWduZWQgaW50CisgICAgb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgX19saW1pdCkKKyAgICB7CisgICAgICBfTV9pbmRleDEgPSAoX01faW5kZXgxICsgMSkgJSA1NTsKKyAgICAgIF9NX2luZGV4MiA9IChfTV9pbmRleDIgKyAxKSAlIDU1OworICAgICAgX01fdGFibGVbX01faW5kZXgxXSA9IF9NX3RhYmxlW19NX2luZGV4MV0gLSBfTV90YWJsZVtfTV9pbmRleDJdOworICAgICAgcmV0dXJuIF9NX3RhYmxlW19NX2luZGV4MV0gJSBfX2xpbWl0OworICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9pbml0aWFsaXplKHVuc2lnbmVkIGludCBfX3NlZWQpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IF9fayA9IDE7CisgICAgICBfTV90YWJsZVs1NF0gPSBfX3NlZWQ7CisgICAgICBzaXplX3QgX19pOworICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NDsgX19pKyspCisJeworCSAgc2l6ZV90IF9faWkgPSAoMjEgKiAoX19pICsgMSkgJSA1NSkgLSAxOworCSAgX01fdGFibGVbX19paV0gPSBfX2s7CisJICBfX2sgPSBfX3NlZWQgLSBfX2s7CisJICBfX3NlZWQgPSBfTV90YWJsZVtfX2lpXTsKKwl9CisgICAgICBmb3IgKGludCBfX2xvb3AgPSAwOyBfX2xvb3AgPCA0OyBfX2xvb3ArKykKKwl7CisJICBmb3IgKF9faSA9IDA7IF9faSA8IDU1OyBfX2krKykKKyAgICAgICAgICAgIF9NX3RhYmxlW19faV0gPSBfTV90YWJsZVtfX2ldIC0gX01fdGFibGVbKDEgKyBfX2kgKyAzMCkgJSA1NV07CisJfQorICAgICAgX01faW5kZXgxID0gMDsKKyAgICAgIF9NX2luZGV4MiA9IDMxOworICAgIH0KKworICAgIC8vLyBDdG9yIGFsbG93aW5nIHlvdSB0byBpbml0aWFsaXplIHRoZSBzZWVkLgorICAgIHN1YnRyYWN0aXZlX3JuZyh1bnNpZ25lZCBpbnQgX19zZWVkKQorICAgIHsgX01faW5pdGlhbGl6ZShfX3NlZWQpOyB9CisKKyAgICAvLy8gRGVmYXVsdCBjdG9yOyBpbml0aWFsaXplcyBpdHMgc3RhdGUgd2l0aCBzb21lIG51bWJlciB5b3UgZG9uJ3Qgc2VlLgorICAgIHN1YnRyYWN0aXZlX3JuZygpCisgICAgeyBfTV9pbml0aWFsaXplKDE2MTgwMzM5OHUpOyB9CisgIH07CisKKyAgLy8gTWVtX2Z1biBhZGFwdG9yIGhlbHBlciBmdW5jdGlvbnMgbWVtX2Z1bjEgYW5kIG1lbV9mdW4xX3JlZiwKKyAgLy8gcHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZXkgYXJlIG5vIGxvbmdlciBwYXJ0IG9mCisgIC8vIHRoZSBDKysgc3RhbmRhcmQuCisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICAgIGlubGluZSBtZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpKQorICAgIHsgcmV0dXJuIG1lbV9mdW4xX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KKyAgICBpbmxpbmUgY29uc3RfbWVtX2Z1bjFfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bjEoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKKyAgICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV90PF9SZXQsIF9UcCwgX0FyZz4oX19mKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CisgICAgaW5saW5lIG1lbV9mdW4xX3JlZl90PF9SZXQsIF9UcCwgX0FyZz4KKyAgICBtZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKKyAgICB7IHJldHVybiBtZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+KF9fZik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgorICAgIGlubGluZSBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LCBfVHAsIF9Bcmc+CisgICAgbWVtX2Z1bjFfcmVmKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCisgICAgeyByZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCwgX1RwLCBfQXJnPihfX2YpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2hhc2hfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvaGFzaF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjNDM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2hhc2hfbWFwCkBAIC0wLDAgKzEsNjAwIEBACisvLyBIYXNoaW5nIG1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgYmFja3dhcmQvaGFzaF9tYXAKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0JBQ0tXQVJEX0hBU0hfTUFQCisjZGVmaW5lIF9CQUNLV0FSRF9IQVNIX01BUCAxCisKKyNpZm5kZWYgX0dMSUJDWFhfUEVSTUlUX0JBQ0tXQVJEX0hBU0gKKyNpbmNsdWRlICJiYWNrd2FyZF93YXJuaW5nLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8YmFja3dhcmQvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OmVxdWFsX3RvOworICB1c2luZyBzdGQ6OmFsbG9jYXRvcjsKKyAgdXNpbmcgc3RkOjpwYWlyOworICB1c2luZyBzdGQ6Ol9TZWxlY3Qxc3Q7CisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuID0gaGFzaDxfS2V5PiwKKwkgICBjbGFzcyBfRXF1YWxLZXkgPSBlcXVhbF90bzxfS2V5PiwgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGhhc2hfbWFwCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxwYWlyPGNvbnN0IF9LZXksIF9UcD4sX0tleSwgX0hhc2hGbiwKKwkJCV9TZWxlY3Qxc3Q8cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJCQlfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworCisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBkYXRhX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aGFzaGVyIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfZXF1YWwga2V5X2VxdWFsOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIAorICAgICAgaGFzaGVyCisgICAgICBoYXNoX2Z1bmN0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0Lmhhc2hfZnVuY3QoKTsgfQorCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5rZXlfZXEoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5nZXRfYWxsb2NhdG9yKCk7IH0KKworICAgICAgaGFzaF9tYXAoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKyAgCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tYXAoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgICAgICAKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBzd2FwKGhhc2hfbWFwJiBfX2hzKQorICAgICAgeyBfTV9odC5zd2FwKF9faHMuX01faHQpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9LMSwgY2xhc3MgX1QxLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PSAoY29uc3QgaGFzaF9tYXA8X0sxLCBfVDEsIF9IRiwgX0VxSywgX0FsPiYsCisJCSAgICBjb25zdCBoYXNoX21hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfdW5pcXVlX25vcmVzaXplKF9fb2JqKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpCisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5maW5kKF9fa2V5KTsgfQorCisgICAgICBfVHAmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmRfb3JfaW5zZXJ0KHZhbHVlX3R5cGUoX19rZXksIF9UcCgpKSkuc2Vjb25kOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKworICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sIGNsYXNzIF9FcWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgICAgICAgY29uc3QgaGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMikKKyAgICB7IHJldHVybiBfX2htMS5fTV9odCA9PSBfX2htMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0hhc2hGbiwgY2xhc3MgX0VxbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX21hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuICEoX19obTEgPT0gX19obTIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTEsCisJIGhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxbEtleSwgX0FsbG9jPiYgX19obTIpCisgICAgeyBfX2htMS5zd2FwKF9faG0yKTsgfQorCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLAorCSAgIGNsYXNzIF9IYXNoRm4gPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBoYXNoX211bHRpbWFwCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfS2V5LCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1RwLCBfU0dJQXNzaWduYWJsZUNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9IYXNoRm4sIHNpemVfdCwgX0tleSwgX1VuYXJ5RnVuY3Rpb25Db25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfRXF1YWxLZXksIF9LZXksIF9LZXksIF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0KQorCQorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGhhc2h0YWJsZTxwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9LZXksIF9IYXNoRm4sCisJCQlfU2VsZWN0MXN0PHBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfRXF1YWxLZXksIF9BbGxvYz4KKyAgICAgICAgICBfSHQ7CisKKyAgICAgIF9IdCBfTV9odDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIGRhdGFfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX211bHRpbWFwKCkKKyAgICAgIDogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24pCisgICAgICA6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBoYXNoX211bHRpbWFwKHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9tdWx0aW1hcChzaXplX3R5cGUgX19uLCBjb25zdCBoYXNoZXImIF9faGYsIGNvbnN0IGtleV9lcXVhbCYgX19lcWwsCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCkKKwk6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLCBzaXplX3R5cGUgX19uLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X3NpemUoKTsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbXB0eSgpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoaGFzaF9tdWx0aW1hcCYgX19ocykKKyAgICAgIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSzEsIGNsYXNzIF9UMSwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aW1hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+JiwKKwkJICAgY29uc3QgaGFzaF9tdWx0aW1hcDxfSzEsIF9UMSwgX0hGLCBfRXFLLCBfQWw+Jik7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBfTV9odC5iZWdpbigpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gX01faHQuZW5kKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeyByZXR1cm4gX01faHQuaW5zZXJ0X2VxdWFsKF9fb2JqKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZixfX2wpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgICB7IF9NX2h0LmVyYXNlKF9faXQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZiwgaXRlcmF0b3IgX19sKQorICAgICAgeyBfTV9odC5lcmFzZShfX2YsIF9fbCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5idWNrZXRfY291bnQoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQubWF4X2J1Y2tldF9jb3VudCgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgZWxlbXNfaW5fYnVja2V0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbGVtc19pbl9idWNrZXQoX19uKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuIF9faG0xLl9NX2h0ID09IF9faG0yLl9NX2h0OyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0xLAorCSAgICAgICBjb25zdCBoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hGLCBfRXFLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgcmV0dXJuICEoX19obTEgPT0gX19obTIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCBjbGFzcyBfRXFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaEZuLCBfRXFsS2V5LCBfQWxsb2M+JiBfX2htMSwKKwkgaGFzaF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoRm4sIF9FcWxLZXksIF9BbGxvYz4mIF9faG0yKQorICAgIHsgX19obTEuc3dhcChfX2htMik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGZvciBoYXNoX21hcAorICAvLyBhbmQgaGFzaF9tdWx0aW1hcC4KKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaEZuLCAgY2xhc3MgX0VxS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9tYXA8X0tleSwgX1RwLCBfSGFzaEZuLCAKKwkJCQkJICAgICAgX0VxS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoRm4sICBjbGFzcyBfRXFLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwKKwkJCQkJCSAgIF9FcUtleSwgX0FsbG9jPiA+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4OjpoYXNoX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2hGbiwgX0VxS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvaGFzaF9zZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9oYXNoX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTEwZmVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvaGFzaF9zZXQKQEAgLTAsMCArMSw1NjggQEAKKy8vIEhhc2hpbmcgc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICovCisKKy8qKiBAZmlsZSBiYWNrd2FyZC9oYXNoX3NldAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuCisgKi8KKworI2lmbmRlZiBfQkFDS1dBUkRfSEFTSF9TRVQKKyNkZWZpbmUgX0JBQ0tXQVJEX0hBU0hfU0VUIDEKKworI2lmbmRlZiBfR0xJQkNYWF9QRVJNSVRfQkFDS1dBUkRfSEFTSAorI2luY2x1ZGUgImJhY2t3YXJkX3dhcm5pbmcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiYWNrd2FyZC9oYXNodGFibGUuaD4KKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6ZXF1YWxfdG87CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X0lkZW50aXR5OworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24gID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9WYWx1ZT4sCisJICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIGhhc2hfc2V0CisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVmFsdWUsIF9TR0lBc3NpZ25hYmxlQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0hhc2hGY24sIHNpemVfdCwgX1ZhbHVlLCBfVW5hcnlGdW5jdGlvbkNvbmNlcHQpCisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMzKF9FcXVhbEtleSwgX1ZhbHVlLCBfVmFsdWUsIF9CaW5hcnlQcmVkaWNhdGVDb25jZXB0KQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaGFzaHRhYmxlPF9WYWx1ZSwgX1ZhbHVlLCBfSGFzaEZjbiwgX0lkZW50aXR5PF9WYWx1ZT4sCisJCQlfRXF1YWxLZXksIF9BbGxvYz4gX0h0OworICAgICAgX0h0IF9NX2h0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpoYXNoZXIgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmtleV9lcXVhbCBrZXlfZXF1YWw7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0h0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3QoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuaGFzaF9mdW5jdCgpOyB9CisKKyAgICAgIGtleV9lcXVhbAorICAgICAga2V5X2VxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmtleV9lcSgpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgICBoYXNoX3NldCgpCisgICAgICA6IF9NX2h0KDEwMCwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorCisgICAgICBleHBsaWNpdAorICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZikKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgaGFzaF9zZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7fQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wpCisJOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24pCisJOiBfTV9odChfX24sIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfdW5pcXVlKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSBjb25zdCBoYXNoZXImIF9faGYpCisJOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX3NldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX01faHQoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisgICAgICAKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX3NldCYgX19ocykKKyAgICAgIHsgX01faHQuc3dhcChfX2hzLl9NX2h0KTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSEYsIGNsYXNzIF9FcUssIGNsYXNzIF9BbD4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBoYXNoX3NldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICBjb25zdCBoYXNoX3NldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mKTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJlZ2luKCk7IH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5lbmQoKTsgfQorCisgICAgICBwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworCXBhaXI8dHlwZW5hbWUgX0h0OjppdGVyYXRvciwgYm9vbD4gX19wID0gX01faHQuaW5zZXJ0X3VuaXF1ZShfX29iaik7CisJcmV0dXJuIHBhaXI8aXRlcmF0b3IsYm9vbD4oX19wLmZpcnN0LCBfX3Auc2Vjb25kKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF91bmlxdWUoX19mLCBfX2wpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7CisJcGFpcjx0eXBlbmFtZSBfSHQ6Oml0ZXJhdG9yLCBib29sPiBfX3AKKwkgID0gX01faHQuaW5zZXJ0X3VuaXF1ZV9ub3Jlc2l6ZShfX29iaik7CisJcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGJvb2w+KF9fcC5maXJzdCwgX19wLnNlY29uZCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAge3JldHVybiBfTV9odC5lcmFzZShfX2tleSk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19mLCBpdGVyYXRvciBfX2wpCisgICAgICB7IF9NX2h0LmVyYXNlKF9fZiwgX19sKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IF9NX2h0LmNsZWFyKCk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX2hpbnQpCisgICAgICB7IF9NX2h0LnJlc2l6ZShfX2hpbnQpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisgICAgICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgICAgICAgY29uc3QgaGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMikKKyAgICB7IHJldHVybiBfX2hzMS5fTV9odCA9PSBfX2hzMi5fTV9odDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMxLAorCSAgICAgICBjb25zdCBoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLCBfRXF1YWxLZXksIF9BbGxvYz4mIF9faHMyKQorICAgIHsgcmV0dXJuICEoX19oczEgPT0gX19oczIpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hhc2hGY24sIGNsYXNzIF9FcXVhbEtleSwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChoYXNoX3NldDxfVmFsLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+JiBfX2hzMSwKKwkgaGFzaF9zZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyBfX2hzMS5zd2FwKF9faHMyKTsgfQorCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoRmNuID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9FcXVhbEtleSA9IGVxdWFsX3RvPF9WYWx1ZT4sCisJICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIGhhc2hfbXVsdGlzZXQKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9WYWx1ZSwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzMyhfSGFzaEZjbiwgc2l6ZV90LCBfVmFsdWUsIF9VbmFyeUZ1bmN0aW9uQ29uY2VwdCkKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlczMoX0VxdWFsS2V5LCBfVmFsdWUsIF9WYWx1ZSwgX0JpbmFyeVByZWRpY2F0ZUNvbmNlcHQpCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBoYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9IYXNoRmNuLCBfSWRlbnRpdHk8X1ZhbHVlPiwKKwkJCV9FcXVhbEtleSwgX0FsbG9jPiBfSHQ7CisgICAgICBfSHQgX01faHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6Omhhc2hlciBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6a2V5X2VxdWFsIGtleV9lcXVhbDsKKyAgICAgIAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfSHQ6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9IdDo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICAKKyAgICAgIGhhc2hlcgorICAgICAgaGFzaF9mdW5jdCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5oYXNoX2Z1bmN0KCk7IH0KKyAgICAgIAorICAgICAga2V5X2VxdWFsCisgICAgICBrZXlfZXEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQua2V5X2VxKCk7IH0KKyAgICAgIAorICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZ2V0X2FsbG9jYXRvcigpOyB9CisKKyAgICAgIGhhc2hfbXVsdGlzZXQoKQorICAgICAgOiBfTV9odCgxMDAsIGhhc2hlcigpLCBrZXlfZXF1YWwoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KKworICAgICAgZXhwbGljaXQKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX01faHQoX19uLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpIHt9CisKKyAgICAgIGhhc2hfbXVsdGlzZXQoc2l6ZV90eXBlIF9fbiwgY29uc3QgaGFzaGVyJiBfX2hmKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQorICAgICAgCisgICAgICBoYXNoX211bHRpc2V0KHNpemVfdHlwZSBfX24sIGNvbnN0IGhhc2hlciYgX19oZiwgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfTV9odChfX24sIF9faGYsIF9fZXFsLCBfX2EpIHt9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBoYXNoX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorCTogX01faHQoMTAwLCBoYXNoZXIoKSwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbikKKwk6IF9NX2h0KF9fbiwgaGFzaGVyKCksIGtleV9lcXVhbCgpLCBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsIF9fbCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGhhc2hfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsIHNpemVfdHlwZSBfX24sCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZikKKwk6IF9NX2h0KF9fbiwgX19oZiwga2V5X2VxdWFsKCksIGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIHsgX01faHQuaW5zZXJ0X2VxdWFsKF9fZiwgX19sKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgaGFzaF9tdWx0aXNldChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwgc2l6ZV90eXBlIF9fbiwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmLCBjb25zdCBrZXlfZXF1YWwmIF9fZXFsLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKwk6IF9NX2h0KF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgICAgeyBfTV9odC5pbnNlcnRfZXF1YWwoX19mLCBfX2wpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5zaXplKCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVtcHR5KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChoYXNoX211bHRpc2V0JiBocykKKyAgICAgIHsgX01faHQuc3dhcChocy5fTV9odCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1ZhbCwgY2xhc3MgX0hGLCBjbGFzcyBfRXFLLCBjbGFzcyBfQWw+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9tdWx0aXNldDxfVmFsLCBfSEYsIF9FcUssIF9BbD4mLAorCQkgICBjb25zdCBoYXNoX211bHRpc2V0PF9WYWwsIF9IRiwgX0VxSywgX0FsPiYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuYmVnaW4oKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVuZCgpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWwoX19vYmopOyB9CisgIAorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sKQorICAgICAgICB7IF9NX2h0Lmluc2VydF9lcXVhbChfX2YsX19sKTsgfQorICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfbm9yZXNpemUoY29uc3QgdmFsdWVfdHlwZSYgX19vYmopCisgICAgICB7IHJldHVybiBfTV9odC5pbnNlcnRfZXF1YWxfbm9yZXNpemUoX19vYmopOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmZpbmQoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuY291bnQoX19rZXkpOyB9CisKKyAgICAgIHBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gX01faHQuZXF1YWxfcmFuZ2UoX19rZXkpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9fa2V5KQorICAgICAgeyByZXR1cm4gX01faHQuZXJhc2UoX19rZXkpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19pdCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19pdCk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2YsIGl0ZXJhdG9yIF9fbCkKKyAgICAgIHsgX01faHQuZXJhc2UoX19mLCBfX2wpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyBfTV9odC5jbGVhcigpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19oaW50KQorICAgICAgeyBfTV9odC5yZXNpemUoX19oaW50KTsgfQorICAKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmJ1Y2tldF9jb3VudCgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X2J1Y2tldF9jb3VudCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9odC5tYXhfYnVja2V0X2NvdW50KCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBlbGVtc19pbl9idWNrZXQoc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2h0LmVsZW1zX2luX2J1Y2tldChfX24pOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gX19oczEuX01faHQgPT0gX19oczIuX01faHQ7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJICAgICAgIGNvbnN0IGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyByZXR1cm4gIShfX2hzMSA9PSBfX2hzMik7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczEsCisJIGhhc2hfbXVsdGlzZXQ8X1ZhbCwgX0hhc2hGY24sIF9FcXVhbEtleSwgX0FsbG9jPiYgX19oczIpCisgICAgeyBfX2hzMS5zd2FwKF9faHMyKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBTcGVjaWFsaXphdGlvbiBvZiBpbnNlcnRfaXRlcmF0b3Igc28gdGhhdCBpdCB3aWxsIHdvcmsgZm9yIGhhc2hfc2V0CisgIC8vIGFuZCBoYXNoX211bHRpc2V0LgorICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoRmNuLCBjbGFzcyBfRXF1YWxLZXksIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpoYXNoX3NldDxfVmFsdWUsIF9IYXNoRmNuLAorCQkJCQkgICAgICBfRXF1YWxLZXksIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6aGFzaF9zZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CisgICAgICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisKKyAgICAgIGluc2VydF9pdGVyYXRvcihfQ29udGFpbmVyJiBfX3gpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvcikKKyAgICAgIDogY29udGFpbmVyKCZfX3gpIHt9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29udGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKQorICAgICAgeworCWNvbnRhaW5lci0+aW5zZXJ0KF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICAKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaEZjbiwgY2xhc3MgX0VxdWFsS2V5LCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgaW5zZXJ0X2l0ZXJhdG9yPF9fZ251X2N4eDo6aGFzaF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoRmNuLAorCQkJCQkJICAgX0VxdWFsS2V5LCBfQWxsb2M+ID4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Omhhc2hfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaEZjbiwgX0VxdWFsS2V5LCBfQWxsb2M+CisgICAgICAgIF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KQorICAgICAgOiBjb250YWluZXIoJl9feCkge30KKyAgICAgIAorICAgICAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IpCisgICAgICA6IGNvbnRhaW5lcigmX194KSB7fQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkKKyAgICAgIHsKKwljb250YWluZXItPmluc2VydChfX3ZhbHVlKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9pdGVyYXRvciBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L2l0ZXJhdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOGY0MzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9pdGVyYXRvcgpAQCAtMCwwICsxLDExNiBAQAorLy8gSFAvU0dJIGl0ZXJhdG9yIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTgKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvaXRlcmF0b3IKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLgorICovCisKKyNpZm5kZWYgX0VYVF9JVEVSQVRPUgorI2RlZmluZSBfRVhUX0lURVJBVE9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBUaGVyZSBhcmUgdHdvIHNpZ25hdHVyZXMgZm9yIGRpc3RhbmNlLiAgSW4gYWRkaXRpb24gdG8gdGhlIG9uZQorICAvLyB0YWtpbmcgdHdvIGl0ZXJhdG9ycyBhbmQgcmV0dXJuaW5nIGEgcmVzdWx0LCB0aGVyZSBpcyBhbm90aGVyCisgIC8vIHRha2luZyB0d28gaXRlcmF0b3JzIGFuZCBhIHJlZmVyZW5jZS10by1yZXN1bHQgdmFyaWFibGUsIGFuZAorICAvLyByZXR1cm5pbmcgbm90aGluZy4gIFRoZSBsYXR0ZXIgc2VlbXMgdG8gYmUgYW4gU0dJIGV4dGVuc2lvbi4KKyAgLy8gLS0gcGVkd2FyZHMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfRGlzdGFuY2UmIF9fbiwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeworICAgICAgLy8gY29uY2VwdCByZXF1aXJlbWVudHMKKyAgICAgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfSW5wdXRJdGVyYXRvckNvbmNlcHQ8X0lucHV0SXRlcmF0b3I+KQorICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCXsKKwkgICsrX19maXJzdDsKKwkgICsrX19uOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCB0eXBlbmFtZSBfRGlzdGFuY2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBfX2Rpc3RhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2ZpcnN0LCBfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBfRGlzdGFuY2UmIF9fbiwgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9SYW5kb21BY2Nlc3NJdGVyYXRvckNvbmNlcHQ8CisJCQkJICBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+KQorICAgICAgX19uICs9IF9fbGFzdCAtIF9fZmlyc3Q7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3IsIHR5cGVuYW1lIF9EaXN0YW5jZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIGRpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKyAgICAgICAgICAgICBfRGlzdGFuY2UmIF9fbikKKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cyAtLSB0YWtlbiBjYXJlIG9mIGluIF9fZGlzdGFuY2UKKyAgICAgIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24sIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9tYWxsb2NfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9tYWxsb2NfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhOTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L21hbGxvY19hbGxvY2F0b3IuaApAQCAtMCwwICsxLDEzNyBAQAorLy8gQWxsb2NhdG9yIHRoYXQgd3JhcHMgIkMiIG1hbGxvYyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvbWFsbG9jX2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfTUFMTE9DX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9NQUxMT0NfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdXNpbmcgc3RkOjpzaXplX3Q7CisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworCisgIC8qKgorICAgKiAgQGJyaWVmICBBbiBhbGxvY2F0b3IgdGhhdCB1c2VzIG1hbGxvYy4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIFRoaXMgaXMgcHJlY2lzZWx5IHRoZSBhbGxvY2F0b3IgZGVmaW5lZCBpbiB0aGUgQysrIFN0YW5kYXJkLiAKKyAgICogICAgLSBhbGwgYWxsb2NhdGlvbiBjYWxscyBtYWxsb2MKKyAgICogICAgLSBhbGwgZGVhbGxvY2F0aW9uIGNhbGxzIGZyZWUKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBtYWxsb2NfYWxsb2NhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1RwJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIG1hbGxvY19hbGxvY2F0b3I8X1RwMT4gb3RoZXI7IH07CisKKyAgICAgIG1hbGxvY19hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorCisgICAgICBtYWxsb2NfYWxsb2NhdG9yKGNvbnN0IG1hbGxvY19hbGxvY2F0b3ImKSB0aHJvdygpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBtYWxsb2NfYWxsb2NhdG9yKGNvbnN0IG1hbGxvY19hbGxvY2F0b3I8X1RwMT4mKSB0aHJvdygpIHsgfQorCisgICAgICB+bWFsbG9jX2FsbG9jYXRvcigpIHRocm93KCkgeyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIC8vIE5COiBfX24gaXMgcGVybWl0dGVkIHRvIGJlIDAuICBUaGUgQysrIHN0YW5kYXJkIHNheXMgbm90aGluZworICAgICAgLy8gYWJvdXQgd2hhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHdoZW4gX19uID09IDAuCisgICAgICBwb2ludGVyCisgICAgICBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApCisgICAgICB7CisJaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwlwb2ludGVyIF9fcmV0ID0gc3RhdGljX2Nhc3Q8X1RwKj4oc3RkOjptYWxsb2MoX19uICogc2l6ZW9mKF9UcCkpKTsKKwlpZiAoIV9fcmV0KQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLy8gX19wIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmUgYSBudWxsIHBvaW50ZXIuCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUpCisgICAgICB7IHN0ZDo6ZnJlZShzdGF0aWNfY2FzdDx2b2lkKj4oX19wKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkgCisgICAgICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dIGFsbG9jYXRvcjo6Y29uc3RydWN0CisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSAKKyAgICAgIHsgOjpuZXcoKHZvaWQgKilfX3ApIHZhbHVlX3R5cGUoX192YWwpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQXJncyYmLi4uIF9fYXJncykgCisJeyA6Om5ldygodm9pZCAqKV9fcCkgX1RwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKyNlbmRpZgorCisgICAgICB2b2lkIAorICAgICAgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfX3AtPn5fVHAoKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtYWxsb2NfYWxsb2NhdG9yPF9UcD4mLCBjb25zdCBtYWxsb2NfYWxsb2NhdG9yPF9UcD4mKQorICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbWFsbG9jX2FsbG9jYXRvcjxfVHA+JiwgY29uc3QgbWFsbG9jX2FsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvbWVtb3J5IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvbWVtb3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2ZlMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9tZW1vcnkKQEAgLTAsMCArMSwxOTggQEAKKy8vIE1lbW9yeSBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvbWVtb3J5CisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkgKHBvc3NpYmx5CisgKiAgY29udGFpbmluZyBleHRlbnNpb25zIGZyb20gdGhlIEhQL1NHSSBTVEwgc3Vic2V0KS4KKyAqLworCisjaWZuZGVmIF9FWFRfTUVNT1JZCisjZGVmaW5lIF9FWFRfTUVNT1JZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGJpdHMvc3RsX3RlbXBidWYuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworICB1c2luZyBzdGQ6OnBhaXI7CisgIHVzaW5nIHN0ZDo6X19pdGVyYXRvcl9jYXRlZ29yeTsKKyAgdXNpbmcgc3RkOjpfVGVtcG9yYXJ5X2J1ZmZlcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyPgorICAgIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX3Jlc3VsdDsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yICg7IF9fY291bnQgPiAwIDsgLS1fX2NvdW50LCArK19fZmlyc3QsICsrX19jdXIpCisJICAgIHN0ZDo6X0NvbnN0cnVjdCgmKl9fY3VyLCAqX19maXJzdCk7CisJICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fY3VyKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1cik7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SYW5kb21BY2Nlc3NJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyPgorICAgIGlubGluZSBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbihfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorCQkJICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZykKKyAgICB7CisgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3VudDsKKyAgICAgIHJldHVybiAocGFpcjxfUmFuZG9tQWNjZXNzSXRlciwgX0ZvcndhcmRJdGVyPgorCSAgICAgIChfX2xhc3QsIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXI+CisgICAgaW5saW5lIHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgorICAgIF9fdW5pbml0aWFsaXplZF9jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAorCQkJICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIF9fZ251X2N4eDo6X191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKKwkJCQkJICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29waWVzIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgaW50byByZXN1bHQuCisgICAqICBAcGFyYW0gIGZpcnN0ICBBbiBpbnB1dCBpdGVyYXRvci4KKyAgICogIEBwYXJhbSAgbGFzdCAgIEFuIGlucHV0IGl0ZXJhdG9yLgorICAgKiAgQHBhcmFtICByZXN1bHQgQW4gb3V0cHV0IGl0ZXJhdG9yLgorICAgKiAgQHJldHVybiAgIHJlc3VsdCArIChmaXJzdCAtIGxhc3QpCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqCisgICAqICBMaWtlIGNvcHkoKSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgYW4gaW5pdGlhbGl6ZWQgb3V0cHV0IHJhbmdlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyLCB0eXBlbmFtZSBfU2l6ZSwgdHlwZW5hbWUgX0ZvcndhcmRJdGVyPgorICAgIGlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KKyAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCisJCQkgX0ZvcndhcmRJdGVyIF9fcmVzdWx0KQorICAgIHsgcmV0dXJuIF9fZ251X2N4eDo6X191bmluaXRpYWxpemVkX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCwKKwkJCQkJICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoX19maXJzdCkpOyB9CisKKworICAvLyBBbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIHVuaW5pdGlhbGl6ZWRfY29weV9uIHRoYXQgY29uc3RydWN0cworICAvLyBhbmQgZGVzdHJveXMgb2JqZWN0cyB3aXRoIGEgdXNlci1wcm92aWRlZCBhbGxvY2F0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbl9hKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKKwkJCSAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorCQkJICAgICBfQWxsb2NhdG9yIF9fYWxsb2MpCisgICAgeworICAgICAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19yZXN1bHQ7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoOyBfX2NvdW50ID4gMCA7IC0tX19jb3VudCwgKytfX2ZpcnN0LCArK19fY3VyKQorCSAgICBfX2FsbG9jLmNvbnN0cnVjdCgmKl9fY3VyLCAqX19maXJzdCk7CisJICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+KF9fZmlyc3QsIF9fY3VyKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBzdGQ6Ol9EZXN0cm95KF9fcmVzdWx0LCBfX2N1ciwgX19hbGxvYyk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXIsIHR5cGVuYW1lIF9TaXplLCB0eXBlbmFtZSBfRm9yd2FyZEl0ZXIsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcGFpcjxfSW5wdXRJdGVyLCBfRm9yd2FyZEl0ZXI+CisgICAgX191bmluaXRpYWxpemVkX2NvcHlfbl9hKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKKwkJCSAgICAgX0ZvcndhcmRJdGVyIF9fcmVzdWx0LAorCQkJICAgICBzdGQ6OmFsbG9jYXRvcjxfVHA+KQorICAgIHsKKyAgICAgIHJldHVybiBfX2dudV9jeHg6OnVuaW5pdGlhbGl6ZWRfY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLyoqCisgICAqICBUaGlzIGNsYXNzIHByb3ZpZGVzIHNpbWlsYXIgYmVoYXZpb3IgYW5kIHNlbWFudGljcyBvZiB0aGUgc3RhbmRhcmQKKyAgICogIGZ1bmN0aW9ucyBnZXRfdGVtcG9yYXJ5X2J1ZmZlcigpIGFuZCByZXR1cm5fdGVtcG9yYXJ5X2J1ZmZlcigpLCBidXQKKyAgICogIGVuY2Fwc3VsYXRlZCBpbiBhIHR5cGUgdmFndWVseSByZXNlbWJsaW5nIGEgc3RhbmRhcmQgY29udGFpbmVyLgorICAgKgorICAgKiAgQnkgZGVmYXVsdCwgYSB0ZW1wb3JhcnlfYnVmZmVyPEl0ZXI+IHN0b3JlcyBzcGFjZSBmb3Igb2JqZWN0cyBvZgorICAgKiAgd2hhdGV2ZXIgdHlwZSB0aGUgSXRlciBpdGVyYXRvciBwb2ludHMgdG8uICBJdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEKKyAgICogIHR5cGljYWwgW2ZpcnN0LGxhc3QpIHJhbmdlLCBhbmQgcHJvdmlkZXMgdGhlIGJlZ2luKCksIGVuZCgpLCBzaXplKCkKKyAgICogIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyByZXF1ZXN0ZWRfc2l6ZSgpLiAgRm9yIG5vbi10cml2aWFsIHR5cGVzLCBjb3BpZXMKKyAgICogIG9mICpmaXJzdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmFnZS4KKyAgICoKKyAgICogIEBjIG1hbGxvYyBpcyB1c2VkIHRvIG9idGFpbiB1bmRlcmx5aW5nIHN0b3JhZ2UuCisgICAqCisgICAqICBMaWtlIGdldF90ZW1wb3JhcnlfYnVmZmVyKCksIG5vdCBhbGwgdGhlIHJlcXVlc3RlZCBtZW1vcnkgbWF5IGJlCisgICAqICBhdmFpbGFibGUuICBJZGVhbGx5LCB0aGUgY3JlYXRlZCBidWZmZXIgd2lsbCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhCisgICAqICBjb3B5IG9mIFtmaXJzdCxsYXN0KSwgYnV0IGlmIHNpemUoKSBpcyBsZXNzIHRoYW4gcmVxdWVzdGVkX3NpemUoKSwKKyAgICogIHRoZW4gdGhpcyBkaWRuJ3QgaGFwcGVuLgorICAgKgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwCisJICAgID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0ZvcndhcmRJdGVyYXRvcj46OnZhbHVlX3R5cGUgPgorICAgIHN0cnVjdCB0ZW1wb3JhcnlfYnVmZmVyIDogcHVibGljIF9UZW1wb3JhcnlfYnVmZmVyPF9Gb3J3YXJkSXRlcmF0b3IsIF9UcD4KKyAgICB7CisgICAgICAvLy8gUmVxdWVzdHMgc3RvcmFnZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIGNvcHkgb2YgW2ZpcnN0LGxhc3QpLgorICAgICAgdGVtcG9yYXJ5X2J1ZmZlcihfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQorICAgICAgOiBfVGVtcG9yYXJ5X2J1ZmZlcjxfRm9yd2FyZEl0ZXJhdG9yLCBfVHA+KF9fZmlyc3QsIF9fbGFzdCkgeyB9CisgICAgICAKKyAgICAgIC8vLyBEZXN0cm95cyBvYmplY3RzIGFuZCBmcmVlcyBzdG9yYWdlLgorICAgICAgfnRlbXBvcmFyeV9idWZmZXIoKSB7IH0KKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9tdF9hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L210X2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZWFjMjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9tdF9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDc1NCBAQAorLy8gTVQtb3B0aW1pemVkIGFsbG9jYXRvciAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvbXRfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9NVF9BTExPQ0FUT1JfSAorI2RlZmluZSBfTVRfQUxMT0NBVE9SX0ggMQorCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworICB0eXBlZGVmIHZvaWQgKCpfX2Rlc3Ryb3lfaGFuZGxlcikodm9pZCopOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBwb29sIG9iamVjdC4KKyAgc3RydWN0IF9fcG9vbF9iYXNlCisgIHsKKyAgICAvLyBVc2luZyBzaG9ydCBpbnQgYXMgdHlwZSBmb3IgdGhlIGJpbm1hcCBpbXBsaWVzIHdlIGFyZSBuZXZlcgorICAgIC8vIGNhY2hpbmcgYmxvY2tzIGxhcmdlciB0aGFuIDMyNzY4IHdpdGggdGhpcyBhbGxvY2F0b3IuCisgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX0Jpbm1hcF90eXBlOworCisgICAgLy8gVmFyaWFibGVzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBiZWhhdmlvciBvZiB0aGUgYWxsb2NhdG9yLAorICAgIC8vIGFzc2lnbmVkIGFuZCBleHBsYWluZWQgaW4gZGV0YWlsIGJlbG93LgorICAgIHN0cnVjdCBfVHVuZQorICAgICB7CisgICAgICAvLyBDb21waWxlIHRpbWUgY29uc3RhbnRzIGZvciB0aGUgZGVmYXVsdCBfVHVuZSB2YWx1ZXMuCisgICAgICBlbnVtIHsgX1NfYWxpZ24gPSA4IH07CisgICAgICBlbnVtIHsgX1NfbWF4X2J5dGVzID0gMTI4IH07CisgICAgICBlbnVtIHsgX1NfbWluX2JpbiA9IDggfTsKKyAgICAgIGVudW0geyBfU19jaHVua19zaXplID0gNDA5NiAtIDQgKiBzaXplb2Yodm9pZCopIH07CisgICAgICBlbnVtIHsgX1NfbWF4X3RocmVhZHMgPSA0MDk2IH07CisgICAgICBlbnVtIHsgX1NfZnJlZWxpc3RfaGVhZHJvb20gPSAxMCB9OworCisgICAgICAvLyBBbGlnbm1lbnQgbmVlZGVkLgorICAgICAgLy8gTkI6IEluIGFueSBjYXNlIG11c3QgYmUgPj0gc2l6ZW9mKF9CbG9ja19yZWNvcmQpLCB0aGF0CisgICAgICAvLyBpcyA0IG9uIDMyIGJpdCBtYWNoaW5lcyBhbmQgOCBvbiA2NCBiaXQgbWFjaGluZXMuCisgICAgICBzaXplX3QJX01fYWxpZ247CisgICAgICAKKyAgICAgIC8vIEFsbG9jYXRpb24gcmVxdWVzdHMgKGFmdGVyIHJvdW5kLXVwIHRvIHBvd2VyIG9mIDIpIGJlbG93CisgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYWxsb2NhdG9yLiBBIHJhdyBuZXcvCisgICAgICAvLyBjYWxsIHdpbGwgYmUgdXNlZCBmb3IgcmVxdWVzdHMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZS4KKyAgICAgIC8vIE5COiBNdXN0IGJlIG11Y2ggc21hbGxlciB0aGFuIF9NX2NodW5rX3NpemUgYW5kIGluIGFueQorICAgICAgLy8gY2FzZSA8PSAzMjc2OC4KKyAgICAgIHNpemVfdAlfTV9tYXhfYnl0ZXM7IAorCisgICAgICAvLyBTaXplIGluIGJ5dGVzIG9mIHRoZSBzbWFsbGVzdCBiaW4uCisgICAgICAvLyBOQjogTXVzdCBiZSBhIHBvd2VyIG9mIDIgYW5kID49IF9NX2FsaWduIChhbmQgb2YgY291cnNlCisgICAgICAvLyBtdWNoIHNtYWxsZXIgdGhhbiBfTV9tYXhfYnl0ZXMpLgorICAgICAgc2l6ZV90CV9NX21pbl9iaW47CisKKyAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGZyYWdtZW50aW5nIGFuZCBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mCisgICAgICAvLyBuZXcoKSBjYWxscyB3ZSBhbHdheXMgcmVxdWVzdCBuZXcgbWVtb3J5IHVzaW5nIHRoaXMKKyAgICAgIC8vIHZhbHVlLiBCYXNlZCBvbiBwcmV2aW91cyBkaXNjdXNzaW9ucyBvbiB0aGUgbGlic3RkYysrCisgICAgICAvLyBtYWlsaW5nIGxpc3Qgd2UgaGF2ZSBjaG9zZW4gdGhlIHZhbHVlIGJlbG93LgorICAgICAgLy8gU2VlIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMS0wNy9tc2cwMDA3Ny5odG1sCisgICAgICAvLyBOQjogQXQgbGVhc3Qgb25lIG9yZGVyIG9mIG1hZ25pdHVkZSA+IF9NX21heF9ieXRlcy4gCisgICAgICBzaXplX3QJX01fY2h1bmtfc2l6ZTsKKworICAgICAgLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCB0aHJlYWRzLiBGb3IKKyAgICAgIC8vIHNpbmdsZS10aHJlYWRlZCBvcGVyYXRpb24sIHVzZSBvbmUuIE1heGltdW0gdmFsdWVzIHdpbGwKKyAgICAgIC8vIHZhcnkgZGVwZW5kaW5nIG9uIGRldGFpbHMgb2YgdGhlIHVuZGVybHlpbmcgc3lzdGVtLiAoRm9yCisgICAgICAvLyBpbnN0YW5jZSwgTGludXggMi40LjE4IHJlcG9ydHMgNDA3MCBpbgorICAgICAgLy8gL3Byb2Mvc3lzL2tlcm5lbC90aHJlYWRzLW1heCwgd2hpbGUgTGludXggMi42LjYgcmVwb3J0cworICAgICAgLy8gNjU1MzQpCisgICAgICBzaXplX3QgCV9NX21heF90aHJlYWRzOworCisgICAgICAvLyBFYWNoIHRpbWUgYSBkZWFsbG9jYXRpb24gb2NjdXJzIGluIGEgdGhyZWFkZWQgYXBwbGljYXRpb24KKyAgICAgIC8vIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4KKyAgICAgIC8vIF9NX2ZyZWVsaXN0X2hlYWRyb29tICUgb2YgdXNlZCBtZW1vcnkgb24gdGhlIGZyZWVsaXN0LiBJZgorICAgICAgLy8gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHJlY29yZHMgaXMgbW9yZSB0aGFuCisgICAgICAvLyBfTV9mcmVlbGlzdF9oZWFkcm9vbSAlIG9mIHRoZSBmcmVlbGlzdCwgd2UgbW92ZSB0aGVzZQorICAgICAgLy8gcmVjb3JkcyBiYWNrIHRvIHRoZSBnbG9iYWwgcG9vbC4KKyAgICAgIHNpemVfdCAJX01fZnJlZWxpc3RfaGVhZHJvb207CisgICAgICAKKyAgICAgIC8vIFNldCB0byB0cnVlIGZvcmNlcyBhbGwgYWxsb2NhdGlvbnMgdG8gdXNlIG5ldygpLgorICAgICAgYm9vbCAJX01fZm9yY2VfbmV3OyAKKyAgICAgIAorICAgICAgZXhwbGljaXQKKyAgICAgIF9UdW5lKCkKKyAgICAgIDogX01fYWxpZ24oX1NfYWxpZ24pLCBfTV9tYXhfYnl0ZXMoX1NfbWF4X2J5dGVzKSwgX01fbWluX2JpbihfU19taW5fYmluKSwKKyAgICAgIF9NX2NodW5rX3NpemUoX1NfY2h1bmtfc2l6ZSksIF9NX21heF90aHJlYWRzKF9TX21heF90aHJlYWRzKSwgCisgICAgICBfTV9mcmVlbGlzdF9oZWFkcm9vbShfU19mcmVlbGlzdF9oZWFkcm9vbSksIAorICAgICAgX01fZm9yY2VfbmV3KHN0ZDo6Z2V0ZW52KCJHTElCQ1hYX0ZPUkNFX05FVyIpID8gdHJ1ZSA6IGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfVHVuZShzaXplX3QgX19hbGlnbiwgc2l6ZV90IF9fbWF4Yiwgc2l6ZV90IF9fbWluYmluLCBzaXplX3QgX19jaHVuaywgCisJICAgIHNpemVfdCBfX21heHRocmVhZHMsIHNpemVfdCBfX2hlYWRyb29tLCBib29sIF9fZm9yY2UpIAorICAgICAgOiBfTV9hbGlnbihfX2FsaWduKSwgX01fbWF4X2J5dGVzKF9fbWF4YiksIF9NX21pbl9iaW4oX19taW5iaW4pLAorICAgICAgX01fY2h1bmtfc2l6ZShfX2NodW5rKSwgX01fbWF4X3RocmVhZHMoX19tYXh0aHJlYWRzKSwKKyAgICAgIF9NX2ZyZWVsaXN0X2hlYWRyb29tKF9faGVhZHJvb20pLCBfTV9mb3JjZV9uZXcoX19mb3JjZSkKKyAgICAgIHsgfQorICAgIH07CisgICAgCisgICAgc3RydWN0IF9CbG9ja19hZGRyZXNzCisgICAgeworICAgICAgdm9pZCogCQkJX01faW5pdGlhbDsKKyAgICAgIF9CbG9ja19hZGRyZXNzKiAJCV9NX25leHQ7CisgICAgfTsKKyAgICAKKyAgICBjb25zdCBfVHVuZSYKKyAgICBfTV9nZXRfb3B0aW9ucygpIGNvbnN0CisgICAgeyByZXR1cm4gX01fb3B0aW9uczsgfQorCisgICAgdm9pZAorICAgIF9NX3NldF9vcHRpb25zKF9UdW5lIF9fdCkKKyAgICB7IAorICAgICAgaWYgKCFfTV9pbml0KQorCV9NX29wdGlvbnMgPSBfX3Q7CisgICAgfQorCisgICAgYm9vbAorICAgIF9NX2NoZWNrX3RocmVzaG9sZChzaXplX3QgX19ieXRlcykKKyAgICB7IHJldHVybiBfX2J5dGVzID4gX01fb3B0aW9ucy5fTV9tYXhfYnl0ZXMgfHwgX01fb3B0aW9ucy5fTV9mb3JjZV9uZXc7IH0KKworICAgIHNpemVfdAorICAgIF9NX2dldF9iaW5tYXAoc2l6ZV90IF9fYnl0ZXMpCisgICAgeyByZXR1cm4gX01fYmlubWFwW19fYnl0ZXNdOyB9CisKKyAgICBzaXplX3QKKyAgICBfTV9nZXRfYWxpZ24oKQorICAgIHsgcmV0dXJuIF9NX29wdGlvbnMuX01fYWxpZ247IH0KKworICAgIGV4cGxpY2l0IAorICAgIF9fcG9vbF9iYXNlKCkgCisgICAgOiBfTV9vcHRpb25zKF9UdW5lKCkpLCBfTV9iaW5tYXAoMCksIF9NX2luaXQoZmFsc2UpIHsgfQorCisgICAgZXhwbGljaXQgCisgICAgX19wb29sX2Jhc2UoY29uc3QgX1R1bmUmIF9fb3B0aW9ucykKKyAgICA6IF9NX29wdGlvbnMoX19vcHRpb25zKSwgX01fYmlubWFwKDApLCBfTV9pbml0KGZhbHNlKSB7IH0KKworICBwcml2YXRlOgorICAgIGV4cGxpY2l0IAorICAgIF9fcG9vbF9iYXNlKGNvbnN0IF9fcG9vbF9iYXNlJik7CisKKyAgICBfX3Bvb2xfYmFzZSYKKyAgICBvcGVyYXRvcj0oY29uc3QgX19wb29sX2Jhc2UmKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gQ29uZmlndXJhdGlvbiBvcHRpb25zLgorICAgIF9UdW5lIAkgICAgICAgCQlfTV9vcHRpb25zOworICAgIAorICAgIF9CaW5tYXBfdHlwZSogCQlfTV9iaW5tYXA7CisKKyAgICAvLyBDb25maWd1cmF0aW9uIG9mIHRoZSBwb29sIG9iamVjdCB2aWEgX01fb3B0aW9ucyBjYW4gaGFwcGVuCisgICAgLy8gYWZ0ZXIgY29uc3RydWN0aW9uIGJ1dCBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIEFmdGVyCisgICAgLy8gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUsIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIHRydWUuCisgICAgYm9vbCAJCQlfTV9pbml0OworICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgIERhdGEgZGVzY3JpYmluZyB0aGUgdW5kZXJseWluZyBtZW1vcnkgcG9vbCwgcGFyYW1ldGVyaXplZCBvbgorICAgKiAgdGhyZWFkaW5nIHN1cHBvcnQuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9UaHJlYWQ+CisgICAgY2xhc3MgX19wb29sOworCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3Igc2luZ2xlIHRocmVhZC4KKyAgdGVtcGxhdGU8PgorICAgIGNsYXNzIF9fcG9vbDxmYWxzZT4gOiBwdWJsaWMgX19wb29sX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdW5pb24gX0Jsb2NrX3JlY29yZAorICAgICAgeworCS8vIFBvaW50cyB0byB0aGUgYmxvY2tfcmVjb3JkIG9mIHRoZSBuZXh0IGZyZWUgYmxvY2suCisJX0Jsb2NrX3JlY29yZCogCQkJX01fbmV4dDsKKyAgICAgIH07CisKKyAgICAgIHN0cnVjdCBfQmluX3JlY29yZAorICAgICAgeworCS8vIEFuICJhcnJheSIgb2YgcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGZyZWUgYmxvY2suCisJX0Jsb2NrX3JlY29yZCoqCQkJX01fZmlyc3Q7CisKKwkvLyBBIGxpc3Qgb2YgdGhlIGluaXRpYWwgYWRkcmVzc2VzIG9mIGFsbCBhbGxvY2F0ZWQgYmxvY2tzLgorCV9CbG9ja19hZGRyZXNzKgkJICAgICAJX01fYWRkcmVzczsKKyAgICAgIH07CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfb25jZSgpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX01faW5pdCA9PSBmYWxzZSwgZmFsc2UpKQorCSAgX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95KCkgdGhyb3coKTsKKworICAgICAgY2hhciogCisgICAgICBfTV9yZXNlcnZlX2Jsb2NrKHNpemVfdCBfX2J5dGVzLCBjb25zdCBzaXplX3QgX190aHJlYWRfaWQpOworICAgIAorICAgICAgdm9pZAorICAgICAgX01fcmVjbGFpbV9ibG9jayhjaGFyKiBfX3AsIHNpemVfdCBfX2J5dGVzKSB0aHJvdyAoKTsKKyAgICAKKyAgICAgIHNpemVfdCAKKyAgICAgIF9NX2dldF90aHJlYWRfaWQoKSB7IHJldHVybiAwOyB9CisgICAgICAKKyAgICAgIGNvbnN0IF9CaW5fcmVjb3JkJgorICAgICAgX01fZ2V0X2JpbihzaXplX3QgX193aGljaCkKKyAgICAgIHsgcmV0dXJuIF9NX2JpbltfX3doaWNoXTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9hZGp1c3RfZnJlZWxpc3QoY29uc3QgX0Jpbl9yZWNvcmQmLCBfQmxvY2tfcmVjb3JkKiwgc2l6ZV90KQorICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0IF9fcG9vbCgpIAorICAgICAgOiBfTV9iaW4oMCksIF9NX2Jpbl9zaXplKDEpIHsgfQorCisgICAgICBleHBsaWNpdCBfX3Bvb2woY29uc3QgX19wb29sX2Jhc2U6Ol9UdW5lJiBfX3R1bmUpIAorICAgICAgOiBfX3Bvb2xfYmFzZShfX3R1bmUpLCBfTV9iaW4oMCksIF9NX2Jpbl9zaXplKDEpIHsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEFuICJhcnJheSIgb2YgYmluX3JlY29yZHMgZWFjaCBvZiB3aGljaCByZXByZXNlbnRzIGEgc3BlY2lmaWMKKyAgICAgIC8vIHBvd2VyIG9mIDIgc2l6ZS4gTWVtb3J5IHRvIHRoaXMgImFycmF5IiBpcyBhbGxvY2F0ZWQgaW4KKyAgICAgIC8vIF9NX2luaXRpYWxpemUoKS4KKyAgICAgIF9CaW5fcmVjb3JkKgkJIF9NX2JpbjsKKyAgICAgIAorICAgICAgLy8gQWN0dWFsIHZhbHVlIGNhbGN1bGF0ZWQgaW4gX01faW5pdGlhbGl6ZSgpLgorICAgICAgc2l6ZV90IAkgICAgICAgCSAgICAgCV9NX2Jpbl9zaXplOyAgICAgCisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoKTsKKyAgfTsKKyAKKyNpZmRlZiBfX0dUSFJFQURTCisgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgdGhyZWFkIGVuYWJsZWQsIHZpYSBndGhyZWFkcy5oLgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgX19wb29sPHRydWU+IDogcHVibGljIF9fcG9vbF9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIEVhY2ggcmVxdWVzdGluZyB0aHJlYWQgaXMgYXNzaWduZWQgYW4gaWQgcmFuZ2luZyBmcm9tIDEgdG8KKyAgICAgIC8vIF9TX21heF90aHJlYWRzLiBUaHJlYWQgaWQgMCBpcyB1c2VkIGFzIGEgZ2xvYmFsIG1lbW9yeSBwb29sLgorICAgICAgLy8gSW4gb3JkZXIgdG8gZ2V0IGNvbnN0YW50IHBlcmZvcm1hbmNlIG9uIHRoZSB0aHJlYWQgYXNzaWdubWVudAorICAgICAgLy8gcm91dGluZSwgd2Uga2VlcCBhIGxpc3Qgb2YgZnJlZSBpZHMuIFdoZW4gYSB0aHJlYWQgZmlyc3QKKyAgICAgIC8vIHJlcXVlc3RzIG1lbW9yeSB3ZSByZW1vdmUgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGlzIGxpc3QgYW5kCisgICAgICAvLyBzdG9yZXMgdGhlIGFkZHJlc3MgaW4gYSBfX2d0aHJlYWRfa2V5LiBXaGVuIGluaXRpYWxpemluZyB0aGUKKyAgICAgIC8vIF9fZ3RocmVhZF9rZXkgd2Ugc3BlY2lmeSBhIGRlc3RydWN0b3IuIFdoZW4gdGhpcyBkZXN0cnVjdG9yCisgICAgICAvLyAoaS5lLiB0aGUgdGhyZWFkIGRpZXMpIGlzIGNhbGxlZCwgd2UgcmV0dXJuIHRoZSB0aHJlYWQgaWQgdG8KKyAgICAgIC8vIHRoZSBmcm9udCBvZiB0aGlzIGxpc3QuCisgICAgICBzdHJ1Y3QgX1RocmVhZF9yZWNvcmQKKyAgICAgIHsKKwkvLyBQb2ludHMgdG8gbmV4dCBmcmVlIHRocmVhZCBpZCByZWNvcmQuIE5VTEwgaWYgbGFzdCByZWNvcmQgaW4gbGlzdC4KKwlfVGhyZWFkX3JlY29yZCoJCQlfTV9uZXh0OworCQorCS8vIFRocmVhZCBpZCByYW5naW5nIGZyb20gMSB0byBfU19tYXhfdGhyZWFkcy4KKwlzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2lkOworICAgICAgfTsKKyAgICAgIAorICAgICAgdW5pb24gX0Jsb2NrX3JlY29yZAorICAgICAgeworCS8vIFBvaW50cyB0byB0aGUgYmxvY2tfcmVjb3JkIG9mIHRoZSBuZXh0IGZyZWUgYmxvY2suCisJX0Jsb2NrX3JlY29yZCoJCQlfTV9uZXh0OworCQorCS8vIFRoZSB0aHJlYWQgaWQgb2YgdGhlIHRocmVhZCB3aGljaCBoYXMgcmVxdWVzdGVkIHRoaXMgYmxvY2suCisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBfTV90aHJlYWRfaWQ7CisgICAgICB9OworICAgICAgCisgICAgICBzdHJ1Y3QgX0Jpbl9yZWNvcmQKKyAgICAgIHsKKwkvLyBBbiAiYXJyYXkiIG9mIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBmcmVlIGJsb2NrIGZvciBlYWNoCisJLy8gdGhyZWFkIGlkLiBNZW1vcnkgdG8gdGhpcyAiYXJyYXkiIGlzIGFsbG9jYXRlZCBpbgorCS8vIF9TX2luaXRpYWxpemUoKSBmb3IgX1NfbWF4X3RocmVhZHMgKyBnbG9iYWwgcG9vbCAwLgorCV9CbG9ja19yZWNvcmQqKgkJCV9NX2ZpcnN0OworCQorCS8vIEEgbGlzdCBvZiB0aGUgaW5pdGlhbCBhZGRyZXNzZXMgb2YgYWxsIGFsbG9jYXRlZCBibG9ja3MuCisJX0Jsb2NrX2FkZHJlc3MqCQkgICAgIAlfTV9hZGRyZXNzOworCisJLy8gQW4gImFycmF5IiBvZiBjb3VudGVycyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGFtb3VudCBvZgorCS8vIGJsb2NrcyB0aGF0IGFyZSBvbiB0aGUgZnJlZWxpc3QvdXNlZCBmb3IgZWFjaCB0aHJlYWQgaWQuCisJLy8gLSBOb3RlIHRoYXQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBhbGxvY2F0ZWQgX01fdXNlZCAiYXJyYXkiCisJLy8gICBhY3R1YWxseSBob3N0cyAoYXRvbWljKSBjb3VudGVycyBvZiByZWNsYWltZWQgYmxvY2tzOiAgaW4KKwkvLyAgIF9NX3Jlc2VydmVfYmxvY2sgYW5kIGluIF9NX3JlY2xhaW1fYmxvY2sgdGhvc2UgbnVtYmVycyBhcmUKKwkvLyAgIHN1YnRyYWN0ZWQgZnJvbSB0aGUgZmlyc3Qgb25lcyB0byBvYnRhaW4gdGhlIGFjdHVhbCBzaXplCisJLy8gICBvZiB0aGUgIndvcmtpbmcgc2V0IiBvZiB0aGUgZ2l2ZW4gdGhyZWFkLgorCS8vIC0gTWVtb3J5IHRvIHRoZXNlICJhcnJheXMiIGlzIGFsbG9jYXRlZCBpbiBfU19pbml0aWFsaXplKCkKKwkvLyAgIGZvciBfU19tYXhfdGhyZWFkcyArIGdsb2JhbCBwb29sIDAuCisJc2l6ZV90KgkJCQlfTV9mcmVlOworCXNpemVfdCoJCQkgICAgICAgIF9NX3VzZWQ7CisJCisJLy8gRWFjaCBiaW4gaGFzIGl0cyBvd24gbXV0ZXggd2hpY2ggaXMgdXNlZCB0byBlbnN1cmUgZGF0YQorCS8vIGludGVncml0eSB3aGlsZSBjaGFuZ2luZyAib3duZXJzaGlwIiBvbiBhIGJsb2NrLiAgVGhlIG11dGV4CisJLy8gaXMgaW5pdGlhbGl6ZWQgaW4gX1NfaW5pdGlhbGl6ZSgpLgorCV9fZ3RocmVhZF9tdXRleF90KiAgICAgICAgICAgICAgX01fbXV0ZXg7CisgICAgICB9OworICAgICAgCisgICAgICAvLyBYWFggR0xJQkNYWF9BQkkgRGVwcmVjYXRlZAorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZShfX2Rlc3Ryb3lfaGFuZGxlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemVfb25jZSgpCisgICAgICB7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX01faW5pdCA9PSBmYWxzZSwgZmFsc2UpKQorCSAgX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9kZXN0cm95KCkgdGhyb3coKTsKKworICAgICAgY2hhciogCisgICAgICBfTV9yZXNlcnZlX2Jsb2NrKHNpemVfdCBfX2J5dGVzLCBjb25zdCBzaXplX3QgX190aHJlYWRfaWQpOworICAgIAorICAgICAgdm9pZAorICAgICAgX01fcmVjbGFpbV9ibG9jayhjaGFyKiBfX3AsIHNpemVfdCBfX2J5dGVzKSB0aHJvdyAoKTsKKyAgICAKKyAgICAgIGNvbnN0IF9CaW5fcmVjb3JkJgorICAgICAgX01fZ2V0X2JpbihzaXplX3QgX193aGljaCkKKyAgICAgIHsgcmV0dXJuIF9NX2JpbltfX3doaWNoXTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9hZGp1c3RfZnJlZWxpc3QoY29uc3QgX0Jpbl9yZWNvcmQmIF9fYmluLCBfQmxvY2tfcmVjb3JkKiBfX2Jsb2NrLCAKKwkJCSBzaXplX3QgX190aHJlYWRfaWQpCisgICAgICB7CisJaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCSAgeworCSAgICBfX2Jsb2NrLT5fTV90aHJlYWRfaWQgPSBfX3RocmVhZF9pZDsKKwkgICAgLS1fX2Jpbi5fTV9mcmVlW19fdGhyZWFkX2lkXTsKKwkgICAgKytfX2Jpbi5fTV91c2VkW19fdGhyZWFkX2lkXTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgLy8gWFhYIEdMSUJDWFhfQUJJIERlcHJlY2F0ZWQKKyAgICAgIF9HTElCQ1hYX0NPTlNUIHZvaWQgCisgICAgICBfTV9kZXN0cm95X3RocmVhZF9rZXkodm9pZCopIHRocm93ICgpOworCisgICAgICBzaXplX3QgCisgICAgICBfTV9nZXRfdGhyZWFkX2lkKCk7CisKKyAgICAgIGV4cGxpY2l0IF9fcG9vbCgpIAorICAgICAgOiBfTV9iaW4oMCksIF9NX2Jpbl9zaXplKDEpLCBfTV90aHJlYWRfZnJlZWxpc3QoMCkgCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQgX19wb29sKGNvbnN0IF9fcG9vbF9iYXNlOjpfVHVuZSYgX190dW5lKSAKKyAgICAgIDogX19wb29sX2Jhc2UoX190dW5lKSwgX01fYmluKDApLCBfTV9iaW5fc2l6ZSgxKSwgCisJX01fdGhyZWFkX2ZyZWVsaXN0KDApIAorICAgICAgeyB9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gQW4gImFycmF5IiBvZiBiaW5fcmVjb3JkcyBlYWNoIG9mIHdoaWNoIHJlcHJlc2VudHMgYSBzcGVjaWZpYworICAgICAgLy8gcG93ZXIgb2YgMiBzaXplLiBNZW1vcnkgdG8gdGhpcyAiYXJyYXkiIGlzIGFsbG9jYXRlZCBpbgorICAgICAgLy8gX01faW5pdGlhbGl6ZSgpLgorICAgICAgX0Jpbl9yZWNvcmQqCQlfTV9iaW47CisKKyAgICAgIC8vIEFjdHVhbCB2YWx1ZSBjYWxjdWxhdGVkIGluIF9NX2luaXRpYWxpemUoKS4KKyAgICAgIHNpemVfdCAJICAgICAgIAkgICAgIAlfTV9iaW5fc2l6ZTsKKworICAgICAgX1RocmVhZF9yZWNvcmQqIAkJX01fdGhyZWFkX2ZyZWVsaXN0OworICAgICAgdm9pZCoJCQlfTV90aHJlYWRfZnJlZWxpc3RfaW5pdGlhbDsKKworICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZSgpOworICAgIH07CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcCwgYm9vbCBfVGhyZWFkPgorICAgIHN0cnVjdCBfX2NvbW1vbl9wb29sCisgICAgeworICAgICAgdHlwZWRlZiBfUG9vbFRwPF9UaHJlYWQ+IAkJcG9vbF90eXBlOworICAgICAgCisgICAgICBzdGF0aWMgcG9vbF90eXBlJgorICAgICAgX1NfZ2V0X3Bvb2woKQorICAgICAgeyAKKwlzdGF0aWMgcG9vbF90eXBlIF9TX3Bvb2w7CisJcmV0dXJuIF9TX3Bvb2w7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcCwgYm9vbCBfVGhyZWFkPgorICAgIHN0cnVjdCBfX2NvbW1vbl9wb29sX2Jhc2U7CisKKyAgdGVtcGxhdGU8dGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHA+CisgICAgc3RydWN0IF9fY29tbW9uX3Bvb2xfYmFzZTxfUG9vbFRwLCBmYWxzZT4gCisgICAgOiBwdWJsaWMgX19jb21tb25fcG9vbDxfUG9vbFRwLCBmYWxzZT4KKyAgICB7CisgICAgICB1c2luZyAgX19jb21tb25fcG9vbDxfUG9vbFRwLCBmYWxzZT46Ol9TX2dldF9wb29sOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfaW5pdGlhbGl6ZV9vbmNlKCkKKyAgICAgIHsKKwlzdGF0aWMgYm9vbCBfX2luaXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19pbml0ID09IGZhbHNlLCBmYWxzZSkpCisJICB7CisJICAgIF9TX2dldF9wb29sKCkuX01faW5pdGlhbGl6ZV9vbmNlKCk7IAorCSAgICBfX2luaXQgPSB0cnVlOworCSAgfQorICAgICAgfQorICAgIH07CisKKyNpZmRlZiBfX0dUSFJFQURTCisgIHRlbXBsYXRlPHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwPgorICAgIHN0cnVjdCBfX2NvbW1vbl9wb29sX2Jhc2U8X1Bvb2xUcCwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBfX2NvbW1vbl9wb29sPF9Qb29sVHAsIHRydWU+CisgICAgeworICAgICAgdXNpbmcgIF9fY29tbW9uX3Bvb2w8X1Bvb2xUcCwgdHJ1ZT46Ol9TX2dldF9wb29sOworICAgICAgCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfaW5pdGlhbGl6ZSgpIAorICAgICAgeyBfU19nZXRfcG9vbCgpLl9NX2luaXRpYWxpemVfb25jZSgpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbml0aWFsaXplX29uY2UoKQorICAgICAgeyAKKwlzdGF0aWMgYm9vbCBfX2luaXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QoX19pbml0ID09IGZhbHNlLCBmYWxzZSkpCisJICB7CisJICAgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AoKSkKKwkgICAgICB7CisJCS8vIE9uIHNvbWUgcGxhdGZvcm1zLCBfX2d0aHJlYWRfb25jZV90IGlzIGFuIGFnZ3JlZ2F0ZS4KKwkJc3RhdGljIF9fZ3RocmVhZF9vbmNlX3QgX19vbmNlID0gX19HVEhSRUFEX09OQ0VfSU5JVDsKKwkJX19ndGhyZWFkX29uY2UoJl9fb25jZSwgX1NfaW5pdGlhbGl6ZSk7CisJICAgICAgfQorCisJICAgIC8vIERvdWJsZSBjaGVjayBpbml0aWFsaXphdGlvbi4gTWF5IGJlIG5lY2Vzc2FyeSBvbiBzb21lCisJICAgIC8vIHN5c3RlbXMgZm9yIHByb3BlciBjb25zdHJ1Y3Rpb24gd2hlbiBub3QgY29tcGlsaW5nIHdpdGgKKwkgICAgLy8gdGhyZWFkIGZsYWdzLgorCSAgICBfU19nZXRfcG9vbCgpLl9NX2luaXRpYWxpemVfb25jZSgpOyAKKwkgICAgX19pbml0ID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICB9OworI2VuZGlmCisKKyAgLy8vIFBvbGljeSBmb3Igc2hhcmVkIF9fcG9vbCBvYmplY3RzLgorICB0ZW1wbGF0ZTx0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcCwgYm9vbCBfVGhyZWFkPgorICAgIHN0cnVjdCBfX2NvbW1vbl9wb29sX3BvbGljeSA6IHB1YmxpYyBfX2NvbW1vbl9wb29sX2Jhc2U8X1Bvb2xUcCwgX1RocmVhZD4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0ZW1wbGF0ZSA8Ym9vbD4gY2xhc3MgX1Bvb2xUcDEgPSBfUG9vbFRwLCAKKwkgICAgICAgYm9vbCBfVGhyZWFkMSA9IF9UaHJlYWQ+CisgICAgICAgIHN0cnVjdCBfTV9yZWJpbmQKKyAgICAgICAgeyB0eXBlZGVmIF9fY29tbW9uX3Bvb2xfcG9saWN5PF9Qb29sVHAxLCBfVGhyZWFkMT4gb3RoZXI7IH07CisKKyAgICAgIHVzaW5nICBfX2NvbW1vbl9wb29sX2Jhc2U8X1Bvb2xUcCwgX1RocmVhZD46Ol9TX2dldF9wb29sOworICAgICAgdXNpbmcgIF9fY29tbW9uX3Bvb2xfYmFzZTxfUG9vbFRwLCBfVGhyZWFkPjo6X1NfaW5pdGlhbGl6ZV9vbmNlOworICB9OworIAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHAsIGJvb2wgX1RocmVhZD4KKyAgICBzdHJ1Y3QgX19wZXJfdHlwZV9wb29sCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1Bvb2xUcDxfVGhyZWFkPiAJCXBvb2xfdHlwZTsKKyAgICAgIAorICAgICAgc3RhdGljIHBvb2xfdHlwZSYKKyAgICAgIF9TX2dldF9wb29sKCkKKyAgICAgIHsgCisJLy8gU2FuZSBkZWZhdWx0cyBmb3IgdGhlIF9Qb29sVHAuCisJdHlwZWRlZiB0eXBlbmFtZSBwb29sX3R5cGU6Ol9CbG9ja19yZWNvcmQgX0Jsb2NrX3JlY29yZDsKKwljb25zdCBzdGF0aWMgc2l6ZV90IF9fYSA9IChfX2FsaWdub2ZfXyhfVHApID49IHNpemVvZihfQmxvY2tfcmVjb3JkKQorCQkJCSAgID8gX19hbGlnbm9mX18oX1RwKSA6IHNpemVvZihfQmxvY2tfcmVjb3JkKSk7CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9fcG9vbF9iYXNlOjpfVHVuZSBfVHVuZTsKKwlzdGF0aWMgX1R1bmUgX1NfdHVuZShfX2EsIHNpemVvZihfVHApICogNjQsCisJCQkgICAgIHNpemVvZihfVHApICogMiA+PSBfX2EgPyBzaXplb2YoX1RwKSAqIDIgOiBfX2EsCisJCQkgICAgIHNpemVvZihfVHApICogc2l6ZV90KF9UdW5lOjpfU19jaHVua19zaXplKSwKKwkJCSAgICAgX1R1bmU6Ol9TX21heF90aHJlYWRzLAorCQkJICAgICBfVHVuZTo6X1NfZnJlZWxpc3RfaGVhZHJvb20sCisJCQkgICAgIHN0ZDo6Z2V0ZW52KCJHTElCQ1hYX0ZPUkNFX05FVyIpID8gdHJ1ZSA6IGZhbHNlKTsKKwlzdGF0aWMgcG9vbF90eXBlIF9TX3Bvb2woX1NfdHVuZSk7CisJcmV0dXJuIF9TX3Bvb2w7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwLCBib29sIF9UaHJlYWQ+CisgICAgc3RydWN0IF9fcGVyX3R5cGVfcG9vbF9iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdGVtcGxhdGUgPGJvb2w+IGNsYXNzIF9Qb29sVHA+CisgICAgc3RydWN0IF9fcGVyX3R5cGVfcG9vbF9iYXNlPF9UcCwgX1Bvb2xUcCwgZmFsc2U+IAorICAgIDogcHVibGljIF9fcGVyX3R5cGVfcG9vbDxfVHAsIF9Qb29sVHAsIGZhbHNlPiAKKyAgICB7CisgICAgICB1c2luZyAgX19wZXJfdHlwZV9wb29sPF9UcCwgX1Bvb2xUcCwgZmFsc2U+OjpfU19nZXRfcG9vbDsKKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2luaXRpYWxpemVfb25jZSgpCisgICAgICB7CisJc3RhdGljIGJvb2wgX19pbml0OworCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9faW5pdCA9PSBmYWxzZSwgZmFsc2UpKQorCSAgeworCSAgICBfU19nZXRfcG9vbCgpLl9NX2luaXRpYWxpemVfb25jZSgpOyAKKwkgICAgX19pbml0ID0gdHJ1ZTsKKwkgIH0KKyAgICAgIH0KKyAgICB9OworCisgI2lmZGVmIF9fR1RIUkVBRFMKKyB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwPgorICAgIHN0cnVjdCBfX3Blcl90eXBlX3Bvb2xfYmFzZTxfVHAsIF9Qb29sVHAsIHRydWU+IAorICAgIDogcHVibGljIF9fcGVyX3R5cGVfcG9vbDxfVHAsIF9Qb29sVHAsIHRydWU+IAorICAgIHsKKyAgICAgIHVzaW5nICBfX3Blcl90eXBlX3Bvb2w8X1RwLCBfUG9vbFRwLCB0cnVlPjo6X1NfZ2V0X3Bvb2w7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19pbml0aWFsaXplKCkgCisgICAgICB7IF9TX2dldF9wb29sKCkuX01faW5pdGlhbGl6ZV9vbmNlKCk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2luaXRpYWxpemVfb25jZSgpCisgICAgICB7IAorCXN0YXRpYyBib29sIF9faW5pdDsKKwlpZiAoX19idWlsdGluX2V4cGVjdChfX2luaXQgPT0gZmFsc2UsIGZhbHNlKSkKKwkgIHsKKwkgICAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCgpKQorCSAgICAgIHsKKwkJLy8gT24gc29tZSBwbGF0Zm9ybXMsIF9fZ3RocmVhZF9vbmNlX3QgaXMgYW4gYWdncmVnYXRlLgorCQlzdGF0aWMgX19ndGhyZWFkX29uY2VfdCBfX29uY2UgPSBfX0dUSFJFQURfT05DRV9JTklUOworCQlfX2d0aHJlYWRfb25jZSgmX19vbmNlLCBfU19pbml0aWFsaXplKTsKKwkgICAgICB9CisKKwkgICAgLy8gRG91YmxlIGNoZWNrIGluaXRpYWxpemF0aW9uLiBNYXkgYmUgbmVjZXNzYXJ5IG9uIHNvbWUKKwkgICAgLy8gc3lzdGVtcyBmb3IgcHJvcGVyIGNvbnN0cnVjdGlvbiB3aGVuIG5vdCBjb21waWxpbmcgd2l0aAorCSAgICAvLyB0aHJlYWQgZmxhZ3MuCisJICAgIF9TX2dldF9wb29sKCkuX01faW5pdGlhbGl6ZV9vbmNlKCk7IAorCSAgICBfX2luaXQgPSB0cnVlOworCSAgfQorICAgICAgfQorICAgIH07CisjZW5kaWYKKworICAvLy8gUG9saWN5IGZvciBpbmRpdmlkdWFsIF9fcG9vbCBvYmplY3RzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwLCBib29sIF9UaHJlYWQ+CisgICAgc3RydWN0IF9fcGVyX3R5cGVfcG9vbF9wb2xpY3kgCisgICAgOiBwdWJsaWMgX19wZXJfdHlwZV9wb29sX2Jhc2U8X1RwLCBfUG9vbFRwLCBfVGhyZWFkPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHRlbXBsYXRlIDxib29sPiBjbGFzcyBfUG9vbFRwMSA9IF9Qb29sVHAsIAorCSAgICAgICBib29sIF9UaHJlYWQxID0gX1RocmVhZD4KKyAgICAgICAgc3RydWN0IF9NX3JlYmluZAorICAgICAgICB7IHR5cGVkZWYgX19wZXJfdHlwZV9wb29sX3BvbGljeTxfVHAxLCBfUG9vbFRwMSwgX1RocmVhZDE+IG90aGVyOyB9OworCisgICAgICB1c2luZyAgX19wZXJfdHlwZV9wb29sX2Jhc2U8X1RwLCBfUG9vbFRwLCBfVGhyZWFkPjo6X1NfZ2V0X3Bvb2w7CisgICAgICB1c2luZyAgX19wZXJfdHlwZV9wb29sX2Jhc2U8X1RwLCBfUG9vbFRwLCBfVGhyZWFkPjo6X1NfaW5pdGlhbGl6ZV9vbmNlOworICB9OworCisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIF9UcCBkZXBlbmRlbnQgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9fbXRfYWxsb2NfYmFzZSAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgcG9pbnRlcgorICAgICAgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX194KTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QgdGhyb3coKSAKKyAgICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MDIuIHdyb25nIG5ldyBleHByZXNzaW9uIGluIFtzb21lX10gYWxsb2NhdG9yOjpjb25zdHJ1Y3QKKyAgICAgIHZvaWQgCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IF9UcCYgX192YWwpIAorICAgICAgeyA6Om5ldygodm9pZCAqKV9fcCkgX1RwKF9fdmFsKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB2b2lkCisgICAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyA6Om5ldygodm9pZCAqKV9fcCkgX1RwKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKyNlbmRpZgorCisgICAgICB2b2lkIAorICAgICAgZGVzdHJveShwb2ludGVyIF9fcCkgeyBfX3AtPn5fVHAoKTsgfQorICAgIH07CisKKyNpZmRlZiBfX0dUSFJFQURTCisjZGVmaW5lIF9fdGhyZWFkX2RlZmF1bHQgdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgX190aHJlYWRfZGVmYXVsdCBmYWxzZQorI2VuZGlmCisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoaXMgaXMgYSBmaXhlZCBzaXplIChwb3dlciBvZiAyKSBhbGxvY2F0b3Igd2hpY2ggLSB3aGVuCisgICAqICBjb21waWxlZCB3aXRoIHRocmVhZCBzdXBwb3J0IC0gd2lsbCBtYWludGFpbiBvbmUgZnJlZWxpc3QgcGVyCisgICAqICBzaXplIHBlciB0aHJlYWQgcGx1cyBhIEBhIGdsb2JhbCBvbmUuIFN0ZXBzIGFyZSB0YWtlbiB0byBsaW1pdAorICAgKiAgdGhlIHBlciB0aHJlYWQgZnJlZWxpc3Qgc2l6ZXMgKGJ5IHJldHVybmluZyBleGNlc3MgYmFjayB0bworICAgKiAgdGhlIEBhIGdsb2JhbCBsaXN0KS4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIEZ1cnRoZXIgZGV0YWlsczoKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTJjaDMyLmh0bWwKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgCisJICAgdHlwZW5hbWUgX1Bvb2xwID0gX19jb21tb25fcG9vbF9wb2xpY3k8X19wb29sLCBfX3RocmVhZF9kZWZhdWx0PiA+CisgICAgY2xhc3MgX19tdF9hbGxvYyA6IHB1YmxpYyBfX210X2FsbG9jX2Jhc2U8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAJZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgIAlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqICAgICAgICAgICAgICAgIAljb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgICAgICAgICAgICAgICAgIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAgICAgICAgICAgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1Bvb2xwICAgICAgCQkJX19wb2xpY3lfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1Bvb2xwOjpwb29sX3R5cGUJX19wb29sX3R5cGU7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9Qb29scDEgPSBfUG9vbHA+CisgICAgICAgIHN0cnVjdCByZWJpbmQKKyAgICAgICAgeyAKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1Bvb2xwMTo6dGVtcGxhdGUgX01fcmViaW5kPF9UcDE+OjpvdGhlciBwb2xfdHlwZTsKKwkgIHR5cGVkZWYgX19tdF9hbGxvYzxfVHAxLCBwb2xfdHlwZT4gb3RoZXI7CisJfTsKKworICAgICAgX19tdF9hbGxvYygpIHRocm93KCkgeyB9CisKKyAgICAgIF9fbXRfYWxsb2MoY29uc3QgX19tdF9hbGxvYyYpIHRocm93KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9Qb29scDE+CisgICAgICAgIF9fbXRfYWxsb2MoY29uc3QgX19tdF9hbGxvYzxfVHAxLCBfUG9vbHAxPiYpIHRocm93KCkgeyB9CisKKyAgICAgIH5fX210X2FsbG9jKCkgdGhyb3coKSB7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKTsKKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90eXBlIF9fbik7CisKKyAgICAgIGNvbnN0IF9fcG9vbF9iYXNlOjpfVHVuZQorICAgICAgX01fZ2V0X29wdGlvbnMoKQorICAgICAgeyAKKwkvLyBSZXR1cm4gYSBjb3B5LCBub3QgYSByZWZlcmVuY2UsIGZvciBleHRlcm5hbCBjb25zdW1wdGlvbi4KKwlyZXR1cm4gX19wb2xpY3lfdHlwZTo6X1NfZ2V0X3Bvb2woKS5fTV9nZXRfb3B0aW9ucygpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfb3B0aW9ucyhfX3Bvb2xfYmFzZTo6X1R1bmUgX190KQorICAgICAgeyBfX3BvbGljeV90eXBlOjpfU19nZXRfcG9vbCgpLl9NX3NldF9vcHRpb25zKF9fdCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1Bvb2xwPgorICAgIHR5cGVuYW1lIF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+Ojpwb2ludGVyCisgICAgX19tdF9hbGxvYzxfVHAsIF9Qb29scD46OgorICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqKQorICAgIHsKKyAgICAgIGlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCXN0ZDo6X190aHJvd19iYWRfYWxsb2MoKTsKKworICAgICAgX19wb2xpY3lfdHlwZTo6X1NfaW5pdGlhbGl6ZV9vbmNlKCk7CisKKyAgICAgIC8vIFJlcXVlc3RzIGxhcmdlciB0aGFuIF9NX21heF9ieXRlcyBhcmUgaGFuZGxlZCBieSBvcGVyYXRvcgorICAgICAgLy8gbmV3L2RlbGV0ZSBkaXJlY3RseS4KKyAgICAgIF9fcG9vbF90eXBlJiBfX3Bvb2wgPSBfX3BvbGljeV90eXBlOjpfU19nZXRfcG9vbCgpOworICAgICAgY29uc3Qgc2l6ZV90IF9fYnl0ZXMgPSBfX24gKiBzaXplb2YoX1RwKTsKKyAgICAgIGlmIChfX3Bvb2wuX01fY2hlY2tfdGhyZXNob2xkKF9fYnl0ZXMpKQorCXsKKwkgIHZvaWQqIF9fcmV0ID0gOjpvcGVyYXRvciBuZXcoX19ieXRlcyk7CisJICByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKj4oX19yZXQpOworCX0KKyAgICAgIAorICAgICAgLy8gUm91bmQgdXAgdG8gcG93ZXIgb2YgMiBhbmQgZmlndXJlIG91dCB3aGljaCBiaW4gdG8gdXNlLgorICAgICAgY29uc3Qgc2l6ZV90IF9fd2hpY2ggPSBfX3Bvb2wuX01fZ2V0X2Jpbm1hcChfX2J5dGVzKTsKKyAgICAgIGNvbnN0IHNpemVfdCBfX3RocmVhZF9pZCA9IF9fcG9vbC5fTV9nZXRfdGhyZWFkX2lkKCk7CisgICAgICAKKyAgICAgIC8vIEZpbmQgb3V0IGlmIHdlIGhhdmUgYmxvY2tzIG9uIG91ciBmcmVlbGlzdC4gIElmIHNvLCBnbyBhaGVhZAorICAgICAgLy8gYW5kIHVzZSB0aGVtIGRpcmVjdGx5IHdpdGhvdXQgaGF2aW5nIHRvIGxvY2sgYW55dGhpbmcuCisgICAgICBjaGFyKiBfX2M7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fcG9vbF90eXBlOjpfQmluX3JlY29yZCBfQmluX3JlY29yZDsKKyAgICAgIGNvbnN0IF9CaW5fcmVjb3JkJiBfX2JpbiA9IF9fcG9vbC5fTV9nZXRfYmluKF9fd2hpY2gpOworICAgICAgaWYgKF9fYmluLl9NX2ZpcnN0W19fdGhyZWFkX2lkXSkKKwl7CisJICAvLyBBbHJlYWR5IHJlc2VydmVkLgorCSAgdHlwZWRlZiB0eXBlbmFtZSBfX3Bvb2xfdHlwZTo6X0Jsb2NrX3JlY29yZCBfQmxvY2tfcmVjb3JkOworCSAgX0Jsb2NrX3JlY29yZCogX19ibG9jayA9IF9fYmluLl9NX2ZpcnN0W19fdGhyZWFkX2lkXTsKKwkgIF9fYmluLl9NX2ZpcnN0W19fdGhyZWFkX2lkXSA9IF9fYmxvY2stPl9NX25leHQ7CisJICAKKwkgIF9fcG9vbC5fTV9hZGp1c3RfZnJlZWxpc3QoX19iaW4sIF9fYmxvY2ssIF9fdGhyZWFkX2lkKTsKKwkgIF9fYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fYmxvY2spICsgX19wb29sLl9NX2dldF9hbGlnbigpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvLyBOdWxsLCByZXNlcnZlLgorCSAgX19jID0gX19wb29sLl9NX3Jlc2VydmVfYmxvY2soX19ieXRlcywgX190aHJlYWRfaWQpOworCX0KKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxfVHAqPihzdGF0aWNfY2FzdDx2b2lkKj4oX19jKSk7CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUG9vbHA+CisgICAgdm9pZAorICAgIF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+OjoKKyAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KF9fcCAhPSAwLCB0cnVlKSkKKwl7CisJICAvLyBSZXF1ZXN0cyBsYXJnZXIgdGhhbiBfTV9tYXhfYnl0ZXMgYXJlIGhhbmRsZWQgYnkKKwkgIC8vIG9wZXJhdG9ycyBuZXcvZGVsZXRlIGRpcmVjdGx5LgorCSAgX19wb29sX3R5cGUmIF9fcG9vbCA9IF9fcG9saWN5X3R5cGU6Ol9TX2dldF9wb29sKCk7CisJICBjb25zdCBzaXplX3QgX19ieXRlcyA9IF9fbiAqIHNpemVvZihfVHApOworCSAgaWYgKF9fcG9vbC5fTV9jaGVja190aHJlc2hvbGQoX19ieXRlcykpCisJICAgIDo6b3BlcmF0b3IgZGVsZXRlKF9fcCk7CisJICBlbHNlCisJICAgIF9fcG9vbC5fTV9yZWNsYWltX2Jsb2NrKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fcCksIF9fYnl0ZXMpOworCX0KKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Qb29scD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19tdF9hbGxvYzxfVHAsIF9Qb29scD4mLCBjb25zdCBfX210X2FsbG9jPF9UcCwgX1Bvb2xwPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfUG9vbHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9fbXRfYWxsb2M8X1RwLCBfUG9vbHA+JiwgY29uc3QgX19tdF9hbGxvYzxfVHAsIF9Qb29scD4mKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyN1bmRlZiBfX3RocmVhZF9kZWZhdWx0CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9uZXdfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9uZXdfYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkNWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L25ld19hbGxvY2F0b3IuaApAQCAtMCwwICsxLDEzNCBAQAorLy8gQWxsb2NhdG9yIHRoYXQgd3JhcHMgb3BlcmF0b3IgbmV3IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9uZXdfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9ORVdfQUxMT0NBVE9SX0gKKyNkZWZpbmUgX05FV19BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEFuIGFsbG9jYXRvciB0aGF0IHVzZXMgZ2xvYmFsIG5ldywgYXMgcGVyIFsyMC40XS4KKyAgICogIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICoKKyAgICogIFRoaXMgaXMgcHJlY2lzZWx5IHRoZSBhbGxvY2F0b3IgZGVmaW5lZCBpbiB0aGUgQysrIFN0YW5kYXJkLiAKKyAgICogICAgLSBhbGwgYWxsb2NhdGlvbiBjYWxscyBvcGVyYXRvciBuZXcKKyAgICogICAgLSBhbGwgZGVhbGxvY2F0aW9uIGNhbGxzIG9wZXJhdG9yIGRlbGV0ZQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIG5ld19hbGxvY2F0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcCogICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgc3RydWN0IHJlYmluZAorICAgICAgICB7IHR5cGVkZWYgbmV3X2FsbG9jYXRvcjxfVHAxPiBvdGhlcjsgfTsKKworICAgICAgbmV3X2FsbG9jYXRvcigpIHRocm93KCkgeyB9CisKKyAgICAgIG5ld19hbGxvY2F0b3IoY29uc3QgbmV3X2FsbG9jYXRvciYpIHRocm93KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIG5ld19hbGxvY2F0b3IoY29uc3QgbmV3X2FsbG9jYXRvcjxfVHAxPiYpIHRocm93KCkgeyB9CisKKyAgICAgIH5uZXdfYWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgY29uc3RfcG9pbnRlcgorICAgICAgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9feCk7IH0KKworICAgICAgLy8gTkI6IF9fbiBpcyBwZXJtaXR0ZWQgdG8gYmUgMC4gIFRoZSBDKysgc3RhbmRhcmQgc2F5cyBub3RoaW5nCisgICAgICAvLyBhYm91dCB3aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgd2hlbiBfX24gPT0gMC4KKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCkKKyAgICAgIHsgCisJaWYgKF9fbiA+IHRoaXMtPm1heF9zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8X1RwKj4oOjpvcGVyYXRvciBuZXcoX19uICogc2l6ZW9mKF9UcCkpKTsKKyAgICAgIH0KKworICAgICAgLy8gX19wIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYmUgYSBudWxsIHBvaW50ZXIuCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUpCisgICAgICB7IDo6b3BlcmF0b3IgZGVsZXRlKF9fcCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkgCisgICAgICB7IHJldHVybiBzaXplX3QoLTEpIC8gc2l6ZW9mKF9UcCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDAyLiB3cm9uZyBuZXcgZXhwcmVzc2lvbiBpbiBbc29tZV9dIGFsbG9jYXRvcjo6Y29uc3RydWN0CisgICAgICB2b2lkIAorICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9fdmFsKSAKKyAgICAgIHsgOjpuZXcoKHZvaWQgKilfX3ApIF9UcChfX3ZhbCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIF9BcmdzJiYuLi4gX19hcmdzKQorCXsgOjpuZXcoKHZvaWQgKilfX3ApIF9UcChzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOyB9CisjZW5kaWYKKworICAgICAgdm9pZCAKKyAgICAgIGRlc3Ryb3kocG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgbmV3X2FsbG9jYXRvcjxfVHA+JiwgY29uc3QgbmV3X2FsbG9jYXRvcjxfVHA+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG5ld19hbGxvY2F0b3I8X1RwPiYsIGNvbnN0IG5ld19hbGxvY2F0b3I8X1RwPiYpCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L251bWVyaWMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9udW1lcmljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODkxNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9udW1lcmljCkBAIC0wLDAgKzEsMTUyIEBACisvLyBOdW1lcmljIGV4dGVuc2lvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA1LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L251bWVyaWMKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLiAKKyAqLworCisjaWZuZGVmIF9FWFRfTlVNRVJJQworI2RlZmluZSBfRVhUX05VTUVSSUMgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2NvbmNlcHRfY2hlY2suaD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8ZXh0L2Z1bmN0aW9uYWw+IC8vIEZvciBpZGVudGl0eV9lbGVtZW50CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBSZXR1cm5zIF9feCAqKiBfX24sIHdoZXJlIF9fbiA+PSAwLiAgX05vdGUgdGhhdCAibXVsdGlwbGljYXRpb24iCisgIC8vIGlzIHJlcXVpcmVkIHRvIGJlIGFzc29jaWF0aXZlLCBidXQgbm90IG5lY2Vzc2FyaWx5IGNvbW11dGF0aXZlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9JbnRlZ2VyLCB0eXBlbmFtZSBfTW9ub2lkT3BlcmF0aW9uPgorICAgIF9UcAorICAgIF9fcG93ZXIoX1RwIF9feCwgX0ludGVnZXIgX19uLCBfTW9ub2lkT3BlcmF0aW9uIF9fbW9ub2lkX29wKQorICAgIHsKKyAgICAgIGlmIChfX24gPT0gMCkKKwlyZXR1cm4gaWRlbnRpdHlfZWxlbWVudChfX21vbm9pZF9vcCk7CisgICAgICBlbHNlCisJeworCSAgd2hpbGUgKChfX24gJiAxKSA9PSAwKQorCSAgICB7CisJICAgICAgX19uID4+PSAxOworCSAgICAgIF9feCA9IF9fbW9ub2lkX29wKF9feCwgX194KTsKKwkgICAgfQorCisJICBfVHAgX19yZXN1bHQgPSBfX3g7CisJICBfX24gPj49IDE7CisJICB3aGlsZSAoX19uICE9IDApCisJICAgIHsKKwkgICAgICBfX3ggPSBfX21vbm9pZF9vcChfX3gsIF9feCk7CisJICAgICAgaWYgKChfX24gJiAxKSAhPSAwKQorCQlfX3Jlc3VsdCA9IF9fbW9ub2lkX29wKF9fcmVzdWx0LCBfX3gpOworCSAgICAgIF9fbiA+Pj0gMTsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICBpbmxpbmUgX1RwCisgICAgX19wb3dlcihfVHAgX194LCBfSW50ZWdlciBfX24pCisgICAgeyByZXR1cm4gX19wb3dlcihfX3gsIF9fbiwgc3RkOjptdWx0aXBsaWVzPF9UcD4oKSk7IH0KKworICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIC8vIEFsaWFzIGZvciB0aGUgaW50ZXJuYWwgbmFtZSBfX3Bvd2VyLiAgTm90ZSB0aGF0IHBvd2VyIGlzIGFuIGV4dGVuc2lvbiwKKyAgLy8gbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSW50ZWdlciwgdHlwZW5hbWUgX01vbm9pZE9wZXJhdGlvbj4KKyAgICBpbmxpbmUgX1RwCisgICAgcG93ZXIoX1RwIF9feCwgX0ludGVnZXIgX19uLCBfTW9ub2lkT3BlcmF0aW9uIF9fbW9ub2lkX29wKQorICAgIHsgcmV0dXJuIF9fcG93ZXIoX194LCBfX24sIF9fbW9ub2lkX29wKTsgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICBpbmxpbmUgX1RwCisgICAgcG93ZXIoX1RwIF9feCwgX0ludGVnZXIgX19uKQorICAgIHsgcmV0dXJuIF9fcG93ZXIoX194LCBfX24pOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB1c2luZyBzdGQ6OmlvdGE7CisjZWxzZQorICAvKioKKyAgICogIFRoaXMgaXMgYW4gU0dJIGV4dGVuc2lvbi4KKyAgICogIEBpbmdyb3VwIFNHSWV4dGVuc2lvbnMKKyAgICogIEBkb2N0b2RvCisgICovCisgIC8vIGlvdGEgaXMgbm90IHBhcnQgb2YgdGhlIEMrKyBzdGFuZGFyZC4gIEl0IGlzIGFuIGV4dGVuc2lvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyLCB0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIGlvdGEoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIF9UcCBfX3ZhbHVlKQorICAgIHsKKyAgICAgIC8vIGNvbmNlcHQgcmVxdWlyZW1lbnRzCisgICAgICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX011dGFibGVfRm9yd2FyZEl0ZXJhdG9yQ29uY2VwdDxfRm9yd2FyZEl0ZXI+KQorICAgICAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwLAorCSAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxfRm9yd2FyZEl0ZXI+Ojp2YWx1ZV90eXBlPikKKworICAgICAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQorCSpfX2ZpcnN0KysgPSBfX3ZhbHVlKys7CisgICAgfQorI2VuZGlmICAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvbnVtZXJpY190cmFpdHMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L251bWVyaWNfdHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0ZTI5OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L251bWVyaWNfdHJhaXRzLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L251bWVyaWNfdHJhaXRzLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9FWFRfTlVNRVJJQ19UUkFJVFMKKyNkZWZpbmUgX0VYVF9OVU1FUklDX1RSQUlUUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBDb21waWxlIHRpbWUgY29uc3RhbnRzIGZvciBidWlsdGluIHR5cGVzLgorICAvLyBTYWRseSBzdGQ6Om51bWVyaWNfbGltaXRzIG1lbWJlciBmdW5jdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yIHRoaXMuCisjZGVmaW5lIF9fZ2xpYmN4eF9zaWduZWQoX1RwKSAoKF9UcCkoLTEpIDwgMCkKKyNkZWZpbmUgX19nbGliY3h4X2RpZ2l0cyhfVHApIFwKKyAgKHNpemVvZihfVHApICogX19DSEFSX0JJVF9fIC0gX19nbGliY3h4X3NpZ25lZChfVHApKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9taW4oX1RwKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkKF9UcCkgPyAoX1RwKTEgPDwgX19nbGliY3h4X2RpZ2l0cyhfVHApIDogKF9UcCkwKQorCisjZGVmaW5lIF9fZ2xpYmN4eF9tYXgoX1RwKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkKF9UcCkgPyBcCisgICAoKCgoKF9UcCkxIDw8IChfX2dsaWJjeHhfZGlnaXRzKF9UcCkgLSAxKSkgLSAxKSA8PCAxKSArIDEpIDogfihfVHApMCkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgc3RydWN0IF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcgorICAgIHsKKyAgICAgIC8vIE9ubHkgaW50ZWdlcnMgZm9yIGluaXRpYWxpemF0aW9uIG9mIG1lbWJlciBjb25zdGFudC4KKyAgICAgIHN0YXRpYyBjb25zdCBfVmFsdWUgX19taW4gPSBfX2dsaWJjeHhfbWluKF9WYWx1ZSk7CisgICAgICBzdGF0aWMgY29uc3QgX1ZhbHVlIF9fbWF4ID0gX19nbGliY3h4X21heChfVmFsdWUpOworCisgICAgICAvLyBOQjogdGhlc2UgdHdvIGFsc28gYXZhaWxhYmxlIGluIHN0ZDo6bnVtZXJpY19saW1pdHMgYXMgY29tcGlsZQorICAgICAgLy8gdGltZSBjb25zdGFudHMsIGJ1dCA8bGltaXRzPiBpcyBiaWcgYW5kIHdlIGF2b2lkIGluY2x1ZGluZyBpdC4KKyAgICAgIHN0YXRpYyBjb25zdCBib29sIF9faXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZChfVmFsdWUpOworICAgICAgc3RhdGljIGNvbnN0IGludCBfX2RpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMoX1ZhbHVlKTsgICAgICAKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBfVmFsdWUgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT46Ol9fbWluOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBfVmFsdWUgX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT46Ol9fbWF4OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBib29sIF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxfVmFsdWU+OjpfX2lzX3NpZ25lZDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWU+CisgICAgY29uc3QgaW50IF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxfVmFsdWU+OjpfX2RpZ2l0czsKKworI3VuZGVmIF9fZ2xpYmN4eF9zaWduZWQKKyN1bmRlZiBfX2dsaWJjeHhfZGlnaXRzCisjdW5kZWYgX19nbGliY3h4X21pbgorI3VuZGVmIF9fZ2xpYmN4eF9tYXgKKworI2RlZmluZSBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfRnZhbCwgX0R2YWwsIF9MRHZhbCkgXAorICAoc3RkOjpfX2FyZV9zYW1lPF9UcCwgZmxvYXQ+OjpfX3ZhbHVlID8gX0Z2YWwgXAorICAgOiBzdGQ6Ol9fYXJlX3NhbWU8X1RwLCBkb3VibGU+OjpfX3ZhbHVlID8gX0R2YWwgOiBfTER2YWwpCisKKyNkZWZpbmUgX19nbGliY3h4X21heF9kaWdpdHMxMChfVHApIFwKKyAgKDIgKyBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfX0ZMVF9NQU5UX0RJR19fLCBfX0RCTF9NQU5UX0RJR19fLCBcCisJCQkgIF9fTERCTF9NQU5UX0RJR19fKSAqIDY0M0wgLyAyMTM2KQorCisjZGVmaW5lIF9fZ2xpYmN4eF9kaWdpdHMxMChfVHApIFwKKyAgX19nbGliY3h4X2Zsb2F0aW5nKF9UcCwgX19GTFRfRElHX18sIF9fREJMX0RJR19fLCBfX0xEQkxfRElHX18pCisKKyNkZWZpbmUgX19nbGliY3h4X21heF9leHBvbmVudDEwKF9UcCkgXAorICBfX2dsaWJjeHhfZmxvYXRpbmcoX1RwLCBfX0ZMVF9NQVhfMTBfRVhQX18sIF9fREJMX01BWF8xMF9FWFBfXywgXAorCQkgICAgIF9fTERCTF9NQVhfMTBfRVhQX18pCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nCisgICAgeworICAgICAgLy8gT25seSBmbG9hdGluZyBwb2ludCB0eXBlcy4gU2VlIE4xODIyLiAKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgX19tYXhfZGlnaXRzMTAgPSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwKF9WYWx1ZSk7CisKKyAgICAgIC8vIFNlZSBhYm92ZSBjb21tZW50Li4uCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2lzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgY29uc3QgaW50IF9fZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAoX1ZhbHVlKTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgX19tYXhfZXhwb25lbnQxMCA9IF9fZ2xpYmN4eF9tYXhfZXhwb25lbnQxMChfVmFsdWUpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGludCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT46Ol9fbWF4X2RpZ2l0czEwOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBjb25zdCBib29sIF9fbnVtZXJpY190cmFpdHNfZmxvYXRpbmc8X1ZhbHVlPjo6X19pc19zaWduZWQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGludCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT46Ol9fZGlnaXRzMTA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIGNvbnN0IGludCBfX251bWVyaWNfdHJhaXRzX2Zsb2F0aW5nPF9WYWx1ZT46Ol9fbWF4X2V4cG9uZW50MTA7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfX251bWVyaWNfdHJhaXRzCisgICAgOiBwdWJsaWMgX19jb25kaXRpb25hbF90eXBlPHN0ZDo6X19pc19pbnRlZ2VyPF9WYWx1ZT46Ol9fdmFsdWUsCisJCQkJX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPF9WYWx1ZT4sCisJCQkJX19udW1lcmljX3RyYWl0c19mbG9hdGluZzxfVmFsdWU+ID46Ol9fdHlwZQorICAgIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjdW5kZWYgX19nbGliY3h4X2Zsb2F0aW5nCisjdW5kZWYgX19nbGliY3h4X21heF9kaWdpdHMxMAorI3VuZGVmIF9fZ2xpYmN4eF9kaWdpdHMxMAorI3VuZGVmIF9fZ2xpYmN4eF9tYXhfZXhwb25lbnQxMAorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2VjM2I3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcApAQCAtMCwwICsxLDcwMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYXNzb2NfY29udGFpbmVyLmhwcAorICogQ29udGFpbnMgYXNzb2NpYXRpdmUgY29udGFpbmVycy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0FTU09DX0NOVE5SX0hQUAorI2RlZmluZSBQQl9EU19BU1NPQ19DTlROUl9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVsaXN0Lmg+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2guaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvdHJhaXRzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLyoqIEBkZWZncm91cCBwYmRzIFBvbGljeS1CYXNlZCBEYXRhIFN0cnVjdHVyZXMKKyAgICogIEBpbmdyb3VwIGV4dGVuc2lvbnMKKyAgICoKKyAgICogIFRoaXMgaXMgYSBsaWJyYXJ5IG9mIHBvbGljeS1iYXNlZCBlbGVtZW50YXJ5IGRhdGEgc3RydWN0dXJlczoKKyAgICogIGFzc29jaWF0aXZlIGNvbnRhaW5lcnMgYW5kIHByaW9yaXR5IHF1ZXVlcy4gSXQgaXMgZGVzaWduZWQgZm9yCisgICAqICBoaWdoLXBlcmZvcm1hbmNlLCBmbGV4aWJpbGl0eSwgc2VtYW50aWMgc2FmZXR5LCBhbmQgY29uZm9ybWFuY2UKKyAgICogIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRhaW5lcnMgaW4gc3RkIChleGNlcHQgZm9yIHNvbWUgcG9pbnRzCisgICAqICB3aGVyZSBpdCBkaWZmZXJzIGJ5IGRlc2lnbikuCisgICAqCisgICAqICBGb3IgZGV0YWlscywgc2VlOiAKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9leHQvcGJfZHMvaW5kZXguaHRtbAorICAgKgorICAgKiAgQHsKKyAgICovCisgCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICBkZXRhaWw6OmNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBUYWcsIFBvbGljeV9UbCwgQWxsb2NhdG9yPjo6dHlwZQorCisgIC8vLyBBbiBhYnN0cmFjdCBiYXNpYyBhc3NvY2lhdGl2ZSBjb250YWluZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgCisJICAgdHlwZW5hbWUgTWFwcGVkLCAKKwkgICB0eXBlbmFtZSBUYWcsIAorCSAgIHR5cGVuYW1lIFBvbGljeV9UbCwgCisJICAgdHlwZW5hbWUgQWxsb2NhdG9yPgorICBjbGFzcyBjb250YWluZXJfYmFzZSA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX0JBU0VfQ19ERUMgCQkJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFRhZyAJCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKworICAgIC8vIGtleV90eXBlCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjp2YWx1ZV90eXBlIGtleV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnRlbXBsYXRlIHJlYmluZDxrZXlfdHlwZT46Om90aGVyIGtleV9yZWJpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfcmViaW5kOjpyZWZlcmVuY2UgCQlrZXlfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X3JlYmluZDo6Y29uc3RfcmVmZXJlbmNlIAljb25zdF9rZXlfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X3JlYmluZDo6cG9pbnRlciAJCWtleV9wb2ludGVyOworICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X3JlYmluZDo6Y29uc3RfcG9pbnRlciAJCWNvbnN0X2tleV9wb2ludGVyOworCisgICAgLy8gbWFwcGVkX3R5cGUKKyAgICB0eXBlZGVmIE1hcHBlZCAJCQkJCW1hcHBlZF90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnRlbXBsYXRlIHJlYmluZDxtYXBwZWRfdHlwZT46Om90aGVyIG1hcHBlZF9yZWJpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfcmViaW5kOjpyZWZlcmVuY2UgCQltYXBwZWRfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbWFwcGVkX3JlYmluZDo6Y29uc3RfcmVmZXJlbmNlCWNvbnN0X21hcHBlZF9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfcmViaW5kOjpwb2ludGVyIAkJbWFwcGVkX3BvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfcmViaW5kOjpjb25zdF9wb2ludGVyIAljb25zdF9tYXBwZWRfcG9pbnRlcjsKKworICAgIC8vIHZhbHVlX3R5cGUKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dmFsdWVfdHlwZSAJCXZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciB2YWx1ZV9yZWJpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9yZWJpbmQ6OnJlZmVyZW5jZQkJcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfcmViaW5kOjpjb25zdF9yZWZlcmVuY2UgCWNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3JlYmluZDo6cG9pbnRlciAJCXBvaW50ZXI7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9yZWJpbmQ6OmNvbnN0X3BvaW50ZXIgCWNvbnN0X3BvaW50ZXI7CisKKyAgICAvLyBpdGVyYXRvcnMKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCQlwb2ludF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRfaXRlcmF0b3IgCWNvbnN0X3BvaW50X2l0ZXJhdG9yOworCisgICAgdmlydHVhbAorICAgIH5jb250YWluZXJfYmFzZSgpIHsgfQorCisgIHByb3RlY3RlZDoKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfTkFNRSAJCWNvbnRhaW5lcl9iYXNlCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyN1bmRlZiBQQl9EU19DTEFTU19OQU1FCisgIH07CisKKyN1bmRlZiBQQl9EU19CQVNFX0NfREVDCisKKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgY29udGFpbmVyX2Jhc2U8S2V5LCBNYXBwZWQsIFRhZywgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXBwZW5kPCBcCisgIHR5cGVuYW1lIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNyZWF0ZTQ8SGFzaF9GbiwgRXFfRm4sIFJlc2l6ZV9Qb2xpY3ksIGRldGFpbDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBTdG9yZV9IYXNoPiA+Ojp0eXBlLCBQb2xpY3lfVEw+Ojp0eXBlLCBBbGxvY2F0b3I+CisKKyAgLy8vIEFuIGFic3RyYWN0IGJhc2ljIGhhc2gtYmFzZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgIHR5cGVuYW1lIEhhc2hfRm4sCisJICAgdHlwZW5hbWUgRXFfRm4sCisJICAgdHlwZW5hbWUgUmVzaXplX1BvbGljeSwKKwkgICBib29sIFN0b3JlX0hhc2gsCisJICAgdHlwZW5hbWUgVGFnLAorCSAgIHR5cGVuYW1lIFBvbGljeV9UTCwKKwkgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgIGNsYXNzIGJhc2ljX2hhc2hfdGFibGUgOiBwdWJsaWMgUEJfRFNfQkFTRV9DX0RFQworICB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbAorICAgIH5iYXNpY19oYXNoX3RhYmxlKCkgeyB9CisKKyAgcHJvdGVjdGVkOgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIGJhc2ljX2hhc2hfdGFibGUKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI3VuZGVmIFBCX0RTX0NMQVNTX05BTUUKKworICBwcml2YXRlOgorICAgIGJhc2ljX2hhc2hfdGFibGUmIAorICAgIG9wZXJhdG9yPShjb25zdCBiYXNlX3R5cGUmKTsKKyAgfTsKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICBiYXNpY19oYXNoX3RhYmxlPEtleSwgTWFwcGVkLAlIYXNoX0ZuLCBFcV9GbiwgUmVzaXplX1BvbGljeSwgU3RvcmVfSGFzaCwgXAorCQkgICBjY19oYXNoX3RhZywJXAorCSAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y3JlYXRlMTxDb21iX0hhc2hfRm4+Ojp0eXBlLCBBbGxvY2F0b3I+CisKKyAgLy8vIEEgY29uY3JldGUgY29sbGlzaW9uLWNoYWluaW5nIGhhc2gtYmFzZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgIHR5cGVuYW1lIEhhc2hfRm4gPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfaGFzaF9mbjxLZXk+Ojp0eXBlLAorCSAgIHR5cGVuYW1lIEVxX0ZuID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X2VxX2ZuPEtleT46OnR5cGUsCisJICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuID0gZGV0YWlsOjpkZWZhdWx0X2NvbWJfaGFzaF9mbjo6dHlwZSwKKwkgICB0eXBlbmFtZSBSZXNpemVfUG9saWN5ID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X3Jlc2l6ZV9wb2xpY3k8Q29tYl9IYXNoX0ZuPjo6dHlwZSwKKwkgICBib29sIFN0b3JlX0hhc2ggPSBkZXRhaWw6OmRlZmF1bHRfc3RvcmVfaGFzaCwKKwkgICB0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIGNjX2hhc2hfdGFibGUgOiAgcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyAJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEhhc2hfRm4gCQloYXNoX2ZuOworICAgIHR5cGVkZWYgRXFfRm4gCQllcV9mbjsKKyAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgCXJlc2l6ZV9wb2xpY3k7CisgICAgdHlwZWRlZiBDb21iX0hhc2hfRm4gCWNvbWJfaGFzaF9mbjsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgY2NfaGFzaF90YWJsZSgpIHsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBIYXNoX0ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBjY19oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgpIAorICAgIDogYmFzZV90eXBlKGgpIHsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kCisgICAgLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLyBvYmplY3QuCisgICAgY2NfaGFzaF90YWJsZShjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSkKKyAgICA6IGJhc2VfdHlwZShoLCBlKSB7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2hhc2hfZm4gd2lsbCBiZQorICAgIC8vIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIHJfZXFfZm4KKyAgICAvLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQKKyAgICAvLyByX2NvbWJfaGFzaF9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9oYXNoX2ZuIG9iamVjdCBvZiB0aGUKKyAgICAvLyBjb250YWluZXIgb2JqZWN0LgorICAgIGNjX2hhc2hfdGFibGUoY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsIGNvbnN0IGNvbWJfaGFzaF9mbiYgY2gpCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY2gpIHsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9lcV9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8gcl9jb21iX2hhc2hfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfaGFzaF9mbiBvYmplY3Qgb2YgdGhlCisgICAgLy8gY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcmVzaXplX3BvbGljeSB3aWxsIGJlIGNvcGllZCBieSB0aGUKKyAgICAvLyByZXNpemVfcG9saWN5IG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBjY19oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX2hhc2hfZm4mIGNoLCAKKwkJICBjb25zdCByZXNpemVfcG9saWN5JiBycCkgICAgCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY2gsIHJwKSB7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGNjX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGNjX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgpCisgICAgOiBiYXNlX3R5cGUoaCkKKyAgICB7IGNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLyBhbmQgcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLyBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgY2NfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUpCisgICAgOiBiYXNlX3R5cGUoaCwgZSkKKyAgICB7IGNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vIG9iamVjdCwgYW5kIHJfY29tYl9oYXNoX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX2hhc2hfZm4KKyAgICAvLyBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgY2NfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUsCisJCSAgY29uc3QgY29tYl9oYXNoX2ZuJiBjaCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjaCkKKyAgICB7IGNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vIG9iamVjdCwgcl9jb21iX2hhc2hfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfaGFzaF9mbgorICAgIC8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcmVzaXplX3BvbGljeSB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSByZXNpemVfcG9saWN5IG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBjY19oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgCisJCSAgY29uc3QgY29tYl9oYXNoX2ZuJiBjaCwgY29uc3QgcmVzaXplX3BvbGljeSYgcnApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY2gsIHJwKQorICAgIHsgY29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgY2NfaGFzaF90YWJsZShjb25zdCBjY19oYXNoX3RhYmxlJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikKKyAgICB7IH0KKworICAgIHZpcnR1YWwKKyAgICB+Y2NfaGFzaF90YWJsZSgpIHsgfQorCisgICAgY2NfaGFzaF90YWJsZSYgCisgICAgb3BlcmF0b3I9KGNvbnN0IGNjX2hhc2hfdGFibGUmIG90aGVyKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZvdGhlcikKKwl7CisJICBjY19oYXNoX3RhYmxlIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKGNjX2hhc2hfdGFibGUmIG90aGVyKQorICAgIHsgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsgfQorICB9OworCisjdW5kZWYgUEJfRFNfQkFTRV9DX0RFQworCisKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQyBcCisgIGJhc2ljX2hhc2hfdGFibGU8S2V5LCBNYXBwZWQsCUhhc2hfRm4sIEVxX0ZuLCBSZXNpemVfUG9saWN5LCBTdG9yZV9IYXNoLCBcCisJCSAgIGdwX2hhc2hfdGFnLCBcCisJCSAgIHR5cGVuYW1lIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNyZWF0ZTI8Q29tYl9Qcm9iZV9GbiwgUHJvYmVfRm4+Ojp0eXBlLCBBbGxvY2F0b3I+CisKKyAgLy8vIEEgY29uY3JldGUgZ2VuZXJhbC1wcm9iaW5nIGhhc2gtYmFzZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgIHR5cGVuYW1lIEhhc2hfRm4gPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfaGFzaF9mbjxLZXk+Ojp0eXBlLAorCSAgIHR5cGVuYW1lIEVxX0ZuID0gdHlwZW5hbWUgZGV0YWlsOjpkZWZhdWx0X2VxX2ZuPEtleT46OnR5cGUsCisJICAgdHlwZW5hbWUgQ29tYl9Qcm9iZV9GbiA9IGRldGFpbDo6ZGVmYXVsdF9jb21iX2hhc2hfZm46OnR5cGUsCisJICAgdHlwZW5hbWUgUHJvYmVfRm4gPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfcHJvYmVfZm48Q29tYl9Qcm9iZV9Gbj46OnR5cGUsCisJICAgdHlwZW5hbWUgUmVzaXplX1BvbGljeSA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9yZXNpemVfcG9saWN5PENvbWJfUHJvYmVfRm4+Ojp0eXBlLAorCSAgIGJvb2wgU3RvcmVfSGFzaCA9IGRldGFpbDo6ZGVmYXVsdF9zdG9yZV9oYXNoLAorCSAgIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgZ3BfaGFzaF90YWJsZSA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0JBU0VfQ19ERUMgCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBIYXNoX0ZuIAkJaGFzaF9mbjsKKyAgICB0eXBlZGVmIEVxX0ZuIAkJZXFfZm47CisgICAgdHlwZWRlZiBDb21iX1Byb2JlX0ZuCWNvbWJfcHJvYmVfZm47CisgICAgdHlwZWRlZiBQcm9iZV9GbiAJCXByb2JlX2ZuOworICAgIHR5cGVkZWYgUmVzaXplX1BvbGljeSAJcmVzaXplX3BvbGljeTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgZ3BfaGFzaF90YWJsZSgpIHsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgpCisgICAgOiBiYXNlX3R5cGUoaCkgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9oYXNoX2ZuIHdpbGwgYmUKKyAgICAvLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCBhbmQKKyAgICAvLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlKQorICAgIDogYmFzZV90eXBlKGgsIGUpIHsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9lcV9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZAorICAgIC8vIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbiBvYmplY3Qgb2YKKyAgICAvLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjcCkgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9oYXNoX2ZuIHdpbGwgYmUKKyAgICAvLyBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LCByX2VxX2ZuCisgICAgLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGVxX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLyByX2NvbWJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNvbWJfcHJvYmVfZm4gb2JqZWN0IG9mCisgICAgLy8gdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZCByX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZQorICAgIC8vIHByb2JlX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCwgCisJCSAgY29uc3QgcHJvYmVfZm4mIHApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3AsIHApIHsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIHNvbWUgcG9saWN5IG9iamVjdHMuIHJfaGFzaF9mbiB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9lcV9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8gcl9jb21iX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBjb21iX3Byb2JlX2ZuIG9iamVjdCBvZgorICAgIC8vIHRoZSBjb250YWluZXIgb2JqZWN0LCByX3Byb2JlX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBwcm9iZV9mbgorICAgIC8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcmVzaXplX3BvbGljeSB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBSZXNpemVfUG9saWN5IG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBncF9oYXNoX3RhYmxlKGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCwgCisJCSAgY29uc3QgcHJvYmVfZm4mIHAsIGNvbnN0IHJlc2l6ZV9wb2xpY3kmIHJwKQorICAgIDogYmFzZV90eXBlKGgsIGUsIGNwLCBwLCBycCkgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBncF9oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLyBzb21lIHBvbGljeSBvYmplY3RzLiBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9oYXNoX2ZuCisgICAgLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGhhc2hfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgpCisgICAgOiBiYXNlX3R5cGUoaCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLyBhbmQgcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLyBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgZ3BfaGFzaF90YWJsZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgaGFzaF9mbiYgaCwgY29uc3QgZXFfZm4mIGUpCisgICAgOiBiYXNlX3R5cGUoaCwgZSkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8gc29tZSBwb2xpY3kgb2JqZWN0cy4gVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfaGFzaF9mbgorICAgIC8vIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBoYXNoX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwKKyAgICAvLyByX2VxX2ZuIHdpbGwgYmUgY29waWVkIGJ5IHRoZSBlcV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lcgorICAgIC8vIG9iamVjdCwgYW5kIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbgorICAgIC8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBncF9oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgCisJCSAgY29uc3QgY29tYl9wcm9iZV9mbiYgY3ApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3ApCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLyBvYmplY3QsIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbgorICAgIC8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgYW5kIHJfcHJvYmVfZm4gd2lsbCBiZSBjb3BpZWQKKyAgICAvLyBieSB0aGUgcHJvYmVfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGdwX2hhc2hfdGFibGUoSXQgZmlyc3QsIEl0IGxhc3QsIGNvbnN0IGhhc2hfZm4mIGgsIGNvbnN0IGVxX2ZuJiBlLCAKKwkJICBjb25zdCBjb21iX3Byb2JlX2ZuJiBjcCwgY29uc3QgcHJvYmVfZm4mIHApCisgICAgOiBiYXNlX3R5cGUoaCwgZSwgY3AsIHApCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMuIFRoZSB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZAorICAgIC8vIGxhc3RfaXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb250YWluZXIgb2JqZWN0LiByX2hhc2hfZm4KKyAgICAvLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgaGFzaF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsCisgICAgLy8gcl9lcV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgZXFfZm4gb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLyBvYmplY3QsIHJfY29tYl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieSB0aGUgY29tYl9wcm9iZV9mbgorICAgIC8vIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdCwgcl9wcm9iZV9mbiB3aWxsIGJlIGNvcGllZCBieQorICAgIC8vIHRoZSBwcm9iZV9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QsIGFuZAorICAgIC8vIHJfcmVzaXplX3BvbGljeSB3aWxsIGJlIGNvcGllZCBieSB0aGUgcmVzaXplX3BvbGljeSBvYmplY3Qgb2YKKyAgICAvLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBncF9oYXNoX3RhYmxlKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBoYXNoX2ZuJiBoLCBjb25zdCBlcV9mbiYgZSwgCisJCSAgY29uc3QgY29tYl9wcm9iZV9mbiYgY3AsIGNvbnN0IHByb2JlX2ZuJiBwLCAKKwkJICBjb25zdCByZXNpemVfcG9saWN5JiBycCkKKyAgICA6IGJhc2VfdHlwZShoLCBlLCBjcCwgcCwgcnApCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIGdwX2hhc2hfdGFibGUoY29uc3QgZ3BfaGFzaF90YWJsZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYpb3RoZXIpCisgICAgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfmdwX2hhc2hfdGFibGUoKSB7IH0KKworICAgIGdwX2hhc2hfdGFibGUmIAorICAgIG9wZXJhdG9yPShjb25zdCBncF9oYXNoX3RhYmxlJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgZ3BfaGFzaF90YWJsZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcChncF9oYXNoX3RhYmxlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICBjb250YWluZXJfYmFzZTxLZXksIE1hcHBlZCwgVGFnLCBQb2xpY3lfVGwsIEFsbG9jYXRvcj4KKworICAvLy8gQW4gYWJzdHJhY3QgYmFzaWMgdHJlZS1saWtlICh0cmVlLCB0cmllKSBhc3NvY2lhdGl2ZSBjb250YWluZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBUYWcsIAorCSAgIHR5cGVuYW1lIE5vZGVfVXBkYXRlLCB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgY2xhc3MgYmFzaWNfdHJlZSA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0JBU0VfQ19ERUMgCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBOb2RlX1VwZGF0ZSAJbm9kZV91cGRhdGU7CisKKyAgICB2aXJ0dWFsCisgICAgfmJhc2ljX3RyZWUoKSB7IH0KKworICBwcm90ZWN0ZWQ6CisjZGVmaW5lIFBCX0RTX0NMQVNTX05BTUUgCQliYXNpY190cmVlCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyN1bmRlZiBQQl9EU19DTEFTU19OQU1FCisgIH07CisKKyN1bmRlZiBQQl9EU19CQVNFX0NfREVDCisKKworI2RlZmluZSBQQl9EU19UUkVFX05PREVfQU5EX0lUX1RSQUlUU19DX0RFQyBcCisgIGRldGFpbDo6dHJlZV90cmFpdHM8S2V5LCBNYXBwZWQsQ21wX0ZuLE5vZGVfVXBkYXRlLFRhZywgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICBiYXNpY190cmVlPEtleSxNYXBwZWQsVGFnLHR5cGVuYW1lIFBCX0RTX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0NfREVDOjpub2RlX3VwZGF0ZSwgXAorCSAgICAgdHlwZW5hbWUgX19nbnVfY3h4Ojp0eXBlbGlzdDo6Y3JlYXRlMjxDbXBfRm4sIFBCX0RTX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0NfREVDID46OnR5cGUsIEFsbG9jYXRvcj4KKworICAvLy8gQSBjb25jcmV0ZSBiYXNpYyB0cmVlLWJhc2VkIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiA9IHN0ZDo6bGVzczxLZXk+LAorCSAgIHR5cGVuYW1lIFRhZyA9IHJiX3RyZWVfdGFnLAorCSAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3IsIHR5cGVuYW1lIENtcF9Gbl8sIHR5cGVuYW1lIEFsbG9jYXRvcl8+CisgIGNsYXNzIE5vZGVfVXBkYXRlID0gX19nbnVfcGJkczo6bnVsbF90cmVlX25vZGVfdXBkYXRlLAorCSAgIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgdHJlZSA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0JBU0VfQ19ERUMgCWJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgLy8gQ29tcGFyaXNvbiBmdW5jdG9yIHR5cGUuCisgICAgdHlwZWRlZiBDbXBfRm4gCQljbXBfZm47CisKKyAgICB0cmVlKCkgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9jbXBfZm4gd2lsbCBiZSBjb3BpZWQKKyAgICAvLyBieSB0aGUgQ21wX0ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0cmVlKGNvbnN0IGNtcF9mbiYgYykKKyAgICA6IGJhc2VfdHlwZShjKSB7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIHRyZWUoSXQgZmlyc3QsIEl0IGxhc3QpCisgICAgeyBiYXNlX3R5cGU6OmNvcHlfZnJvbV9yYW5nZShmaXJzdCwgbGFzdCk7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzIGFuZAorICAgIC8vIHNvbWUgcG9saWN5IG9iamVjdHMgVGhlIHZhbHVlX3R5cGVzIGJldHdlZW4gZmlyc3RfaXQgYW5kCisgICAgLy8gbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBvYmplY3QuIHJfY21wX2ZuCisgICAgLy8gd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGNtcF9mbiBvYmplY3Qgb2YgdGhlIGNvbnRhaW5lciBvYmplY3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgdHJlZShJdCBmaXJzdCwgSXQgbGFzdCwgY29uc3QgY21wX2ZuJiBjKQorICAgICAgOiBiYXNlX3R5cGUoYykKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgdHJlZShjb25zdCB0cmVlJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfnRyZWUoKSB7IH0KKworICAgIHRyZWUmIAorICAgIG9wZXJhdG9yPShjb25zdCB0cmVlJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgdHJlZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcCh0cmVlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKyN1bmRlZiBQQl9EU19UUkVFX05PREVfQU5EX0lUX1RSQUlUU19DX0RFQworCisKKyNkZWZpbmUgUEJfRFNfVFJJRV9OT0RFX0FORF9JVFNfVFJBSVRTIFwKKyAgZGV0YWlsOjp0cmllX3RyYWl0czxLZXksTWFwcGVkLEVfQWNjZXNzX1RyYWl0cyxOb2RlX1VwZGF0ZSxUYWcsQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICBiYXNpY190cmVlPEtleSxNYXBwZWQsVGFnLCB0eXBlbmFtZSBQQl9EU19UUklFX05PREVfQU5EX0lUU19UUkFJVFM6Om5vZGVfdXBkYXRlLCBcCisJICAgICB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjcmVhdGUyPEVfQWNjZXNzX1RyYWl0cywgUEJfRFNfVFJJRV9OT0RFX0FORF9JVFNfVFJBSVRTID46OnR5cGUsIEFsbG9jYXRvcj4KKworICAvLy8gQSBjb25jcmV0ZSBiYXNpYyB0cmllLWJhc2VkIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICB0eXBlbmFtZSBFX0FjY2Vzc19UcmFpdHMgPSB0eXBlbmFtZSBkZXRhaWw6OmRlZmF1bHRfdHJpZV9lX2FjY2Vzc190cmFpdHM8S2V5Pjo6dHlwZSwKKwkgICB0eXBlbmFtZSBUYWcgPSBwYXRfdHJpZV90YWcsCisJICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3IsCisJCSAgICB0eXBlbmFtZSBFX0FjY2Vzc19UcmFpdHNfLAorCQkgICAgdHlwZW5hbWUgQWxsb2NhdG9yXz4KKyAgY2xhc3MgTm9kZV9VcGRhdGUgPSBudWxsX3RyaWVfbm9kZV91cGRhdGUsCisJICAgdHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBjbGFzcyB0cmllIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIC8vIEVsZW1lbnQgYWNjZXNzIHRyYWl0cyB0eXBlLgorICAgIHR5cGVkZWYgRV9BY2Nlc3NfVHJhaXRzIGVfYWNjZXNzX3RyYWl0czsKKworICAgIHRyaWUoKSB7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljeSBvYmplY3RzLiByX2VfYWNjZXNzX3RyYWl0cyB3aWxsCisgICAgLy8gYmUgY29waWVkIGJ5IHRoZSBFX0FjY2Vzc19UcmFpdHMgb2JqZWN0IG9mIHRoZSBjb250YWluZXIKKyAgICAvLyBvYmplY3QuCisgICAgdHJpZShjb25zdCBlX2FjY2Vzc190cmFpdHMmIHQpCisgICAgOiBiYXNlX3R5cGUodCkgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICB0cmllKEl0IGZpcnN0LCBJdCBsYXN0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcyBhbmQKKyAgICAvLyBzb21lIHBvbGljeSBvYmplY3RzLiBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICB0cmllKEl0IGZpcnN0LCBJdCBsYXN0LCBjb25zdCBlX2FjY2Vzc190cmFpdHMmIHQpCisgICAgOiBiYXNlX3R5cGUodCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0LCBsYXN0KTsgfQorCisgICAgdHJpZShjb25zdCB0cmllJiBvdGhlcikKKyAgICA6IGJhc2VfdHlwZSgoY29uc3QgYmFzZV90eXBlJilvdGhlcikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfnRyaWUoKSB7IH0KKworICAgIHRyaWUmIAorICAgIG9wZXJhdG9yPShjb25zdCB0cmllJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgdHJpZSB0bXAob3RoZXIpOworCSAgc3dhcCh0bXApOworCX0KKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc3dhcCh0cmllJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKyN1bmRlZiBQQl9EU19UUklFX05PREVfQU5EX0lUU19UUkFJVFMKKworCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICBjb250YWluZXJfYmFzZTxLZXksIE1hcHBlZCwgbGlzdF91cGRhdGVfdGFnLCBcCisJCSB0eXBlbmFtZSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjcmVhdGUyPEVxX0ZuLCBVcGRhdGVfUG9saWN5Pjo6dHlwZSwgQWxsb2NhdG9yPgorCisgIC8vLyBBIGxpc3QtdXBkYXRlIGJhc2VkIGFzc29jaWF0aXZlIGNvbnRhaW5lci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICBjbGFzcyBFcV9GbiA9IHR5cGVuYW1lIGRldGFpbDo6ZGVmYXVsdF9lcV9mbjxLZXk+Ojp0eXBlLAorCSAgIGNsYXNzIFVwZGF0ZV9Qb2xpY3kgPSBkZXRhaWw6OmRlZmF1bHRfdXBkYXRlX3BvbGljeTo6dHlwZSwKKwkgICBjbGFzcyBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIGxpc3RfdXBkYXRlIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyAJYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEVxX0ZuIAkJZXFfZm47CisgICAgdHlwZWRlZiBVcGRhdGVfUG9saWN5IAl1cGRhdGVfcG9saWN5OworICAgIHR5cGVkZWYgQWxsb2NhdG9yIAkJYWxsb2NhdG9yOworCisgICAgbGlzdF91cGRhdGUoKSB7IH0KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2luZyBfX2l0ZXJhdG9ycyB0byBhIHJhbmdlIG9mIHZhbHVlX3R5cGVzLiBUaGUKKyAgICAvLyB2YWx1ZV90eXBlcyBiZXR3ZWVuIGZpcnN0X2l0IGFuZCBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50bworICAgIC8vIHRoZSBjb250YWluZXIgb2JqZWN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgIGxpc3RfdXBkYXRlKEl0IGZpcnN0LCBJdCBsYXN0KQorICAgIHsgYmFzZV90eXBlOjpjb3B5X2Zyb21fcmFuZ2UoZmlyc3QsIGxhc3QpOyB9CisKKyAgICBsaXN0X3VwZGF0ZShjb25zdCBsaXN0X3VwZGF0ZSYgb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoKGNvbnN0IGJhc2VfdHlwZSYpb3RoZXIpIHsgfQorCisgICAgdmlydHVhbAorICAgIH5saXN0X3VwZGF0ZSgpIHsgfQorCisgICAgbGlzdF91cGRhdGUmIAorICAgIG9wZXJhdG9yPShjb25zdCBsaXN0X3VwZGF0ZSYgb3RoZXIpCisgICAgeworICAgICAgaWYgKHRoaXMgIT0mIG90aGVyKQorCXsKKwkgIGxpc3RfdXBkYXRlIHRtcChvdGhlcik7CisJICBzd2FwKHRtcCk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHZvaWQKKyAgICBzd2FwKGxpc3RfdXBkYXRlJiBvdGhlcikKKyAgICB7IGJhc2VfdHlwZTo6c3dhcChvdGhlcik7IH0KKyAgfTsKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworICAvLyBAfSBncm91cCBwYmRzCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iYXNpY190cmVlX3BvbGljeS9iYXNpY190cmVlX3BvbGljeV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iYXNpY190cmVlX3BvbGljeS9iYXNpY190cmVlX3BvbGljeV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E5MGRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L2Jhc2ljX3RyZWVfcG9saWN5X2Jhc2UuaHBwCkBAIC0wLDAgKzEsMTczIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiYXNpY190cmVlX3BvbGljeV9iYXNlLmhwcAorICogQ29udGFpbnMgYSBiYXNlIGNsYXNzIGZvciB0cmVlX2xpa2UgcG9saWNpZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UUkVFX0xJS0VfUE9MSUNZX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX1RSRUVfTElLRV9QT0xJQ1lfQkFTRV9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMJCQkJCQlcCisgICAgYmFzaWNfdHJlZV9wb2xpY3lfYmFzZTwJCQkJCQlcCisJCQkJCQkJQ29uc3RfTm9kZV9JdGVyYXRvciwgXAorCQkJCQkJCU5vZGVfSXRlcmF0b3IsCVwKKwkJCQkJCQlBbGxvY2F0b3I+CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCSAgICAgdHlwZW5hbWUgTm9kZV9JdGVyYXRvciwKKwkgICAgIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgYmFzaWNfdHJlZV9wb2xpY3lfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3I6OnZhbHVlX3R5cGUgaXRfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwgaXRfdHlwZT46OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV90eXBlOjpmaXJzdF90eXBlIGtleV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl0eXBlbmFtZSByZW1vdmVfY29uc3Q8CisJa2V5X3R5cGU+Ojp0eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCXZhbHVlX3R5cGU+Ojp0eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl0eXBlbmFtZSByZW1vdmVfY29uc3Q8CisJdmFsdWVfdHlwZT46OnR5cGU+OjpvdGhlcjo6cmVmZXJlbmNlCisgICAgICByZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXR5cGVuYW1lIHJlbW92ZV9jb25zdDwKKwl2YWx1ZV90eXBlPjo6dHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICBzdGF0aWMgaW5saW5lIGNvbnN0X2tleV9yZWZlcmVuY2UKKyAgICAgIGV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKKyAgICAgIHsKKwlyZXR1cm4gKHJfdmFsLmZpcnN0KTsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBpdF90eXBlCisgICAgICBlbmQoKSA9IDA7CisKKyAgICAgIGl0X3R5cGUKKyAgICAgIGVuZF9pdGVyYXRvcigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5lbmQoKSk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwKKyAgICAgIH5iYXNpY190cmVlX3BvbGljeV9iYXNlKCkKKyAgICAgIHsgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgc3RydWN0IGJhc2ljX3RyZWVfcG9saWN5X2Jhc2U8CisgICAgICBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorICAgICAgQ29uc3RfTm9kZV9JdGVyYXRvciwKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yOjp2YWx1ZV90eXBlIGl0X3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8IGl0X3R5cGU+Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSBrZXlfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCWtleV90eXBlPjo6dHlwZT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIGNvbnN0X2tleV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXR5cGVuYW1lIHJlbW92ZV9jb25zdDwKKwl2YWx1ZV90eXBlPjo6dHlwZT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCXZhbHVlX3R5cGU+Ojp0eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl0eXBlbmFtZSByZW1vdmVfY29uc3Q8CisJdmFsdWVfdHlwZT46OnR5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgc3RhdGljIGlubGluZSBjb25zdF9rZXlfcmVmZXJlbmNlCisgICAgICBleHRyYWN0X2tleShjb25zdF9yZWZlcmVuY2Ugcl92YWwpCisgICAgICB7CisJcmV0dXJuIChyX3ZhbCk7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgaXRfdHlwZQorICAgICAgZW5kKCkgY29uc3QgPSAwOworCisgICAgICBpdF90eXBlCisgICAgICBlbmRfaXRlcmF0b3IoKSBjb25zdAorICAgICAgeworCXJldHVybiAoZW5kKCkpOworICAgICAgfQorCisgICAgICB2aXJ0dWFsCisgICAgICB+YmFzaWNfdHJlZV9wb2xpY3lfYmFzZSgpCisgICAgICB7IH0KKyAgICB9OworCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJFRV9MSUtFX1BPTElDWV9CQVNFX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjAwZjJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHAKQEAgLTAsMCArMSw2NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbnVsbF9ub2RlX21ldGFkYXRhLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRyZWUtbGlrZSBjbGFzc2VzLgorICovCisKKyNpZm5kZWYgUEJfRFNfMF9OT0RFX01FVEFEQVRBX0hQUAorI2RlZmluZSBQQl9EU18wX05PREVfTUVUQURBVEFfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgY2xhc3MgRGF0YSwgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBkdW1jb25zdF9ub2RlX2l0ZXJhdG9yCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVzX3RyYWl0czxLZXksIERhdGEsIEFsbG9jYXRvciwgZmFsc2U+Ojpwb2ludGVyIGNvbnN0X2l0ZXJhdG9yOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0X3JlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgfTsKKworICAgIHN0cnVjdCBudWxsX25vZGVfbWV0YWRhdGEKKyAgICB7IH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iYXNpY190cmVlX3BvbGljeS90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvdHJhaXRzLmhwcApAQCAtMCwwICsxLDg1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdHJlZS1saWtlIGNsYXNzZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeyAgICAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBEYXRhLAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuXywKKwkJICAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgY2xhc3MgVGFnLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIERhdGEsCisJICAgICBjbGFzcyBFX0FjY2Vzc19UcmFpdHMsCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBFX0FjY2Vzc19UcmFpdHNfLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBUYWcsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHRyaWVfdHJhaXRzOworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFpdHMuaHBwPgorCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19OT0RFX0FORF9JVF9UUkFJVFNfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHlwZXMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3R5cGVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWMxMzk3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3R5cGVzLmhwcApAQCAtMCwwICsxLDIxMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgYmFzaWNfdHlwZXMuaHBwCisgKiBDb250YWlucyBiYXNpYyB0eXBlcyB1c2VkIGJ5IGNvbnRhaW5lcnMuCisgKi8KKworI2lmbmRlZiBQQl9EU19CQVNJQ19UWVBFU19IUFAKKyNkZWZpbmUgUEJfRFNfQkFTSUNfVFlQRVNfSFBQCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIEFsbG9jYXRvciwgYm9vbCBTdG9yZV9IYXNoPgorICAgIHN0cnVjdCB2YWx1ZV90eXBlX2Jhc2U7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiBvZiB2YWx1ZV90eXBlX2Jhc2UgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBoYXNoIHZhbHVlCisgICAgICogaXMgbm90IHN0b3JlZCBhbG9uZ3NpZGUgZWFjaCB2YWx1ZS4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgdmFsdWVfdHlwZV9iYXNlPEtleSwgTWFwcGVkLCBBbGxvY2F0b3IsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8TWFwcGVkPjo6b3RoZXIgbWFwcGVkX3R5cGVfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OnZhbHVlX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6cG9pbnRlciBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbWFwcGVkX3R5cGVfYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIGNvbnN0X21hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OnJlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9tYXBwZWRfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPHN0ZDo6cGFpcjxjb25zdCBLZXksIE1hcHBlZD4gPjo6b3RoZXIgdmFsdWVfdHlwZV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGVfYWxsb2NhdG9yOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGVfYWxsb2NhdG9yOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGVfYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGVfYWxsb2NhdG9yOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV90eXBlX2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgc3RydWN0IHN0b3JlZF92YWx1ZV90eXBlCisgICAgICB7CisJdmFsdWVfdHlwZSBtX3ZhbHVlOworICAgICAgfTsKKyAgICB9OworCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gb2YgdmFsdWVfdHlwZV9iYXNlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaGFzaCB2YWx1ZQorICAgICAqIGlzIHN0b3JlZCBhbG9uZ3NpZGUgZWFjaCB2YWx1ZS4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgdmFsdWVfdHlwZV9iYXNlPEtleSwgTWFwcGVkLCBBbGxvY2F0b3IsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxNYXBwZWQ+OjpvdGhlciBtYXBwZWRfdHlwZV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6dmFsdWVfdHlwZSBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbWFwcGVkX3R5cGVfYWxsb2NhdG9yOjpwb2ludGVyIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6cmVmZXJlbmNlIG1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X21hcHBlZF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8c3RkOjpwYWlyPGNvbnN0IEtleSwgTWFwcGVkPiA+OjpvdGhlciB2YWx1ZV90eXBlX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGVfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICBzdHJ1Y3Qgc3RvcmVkX3ZhbHVlX3R5cGUKKyAgICAgIHsKKwl2YWx1ZV90eXBlIG1fdmFsdWU7CisJdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgbV9oYXNoOworICAgICAgfTsKKyAgICB9OworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgdmFsdWVfdHlwZV9iYXNlPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgQWxsb2NhdG9yLCBmYWxzZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHZhbHVlX3R5cGVfYmFzZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGhhc2ggdmFsdWUKKyAgICAgKiBpcyBub3Qgc3RvcmVkIGFsb25nc2lkZSBlYWNoIHZhbHVlLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgdmFsdWVfdHlwZV9iYXNlPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgQWxsb2NhdG9yLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPG51bGxfbWFwcGVkX3R5cGU+OjpvdGhlciBtYXBwZWRfdHlwZV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6dmFsdWVfdHlwZSBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbWFwcGVkX3R5cGVfYWxsb2NhdG9yOjpwb2ludGVyIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6cmVmZXJlbmNlIG1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X21hcHBlZF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgS2V5IHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyIHZhbHVlX3R5cGVfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV90eXBlX2FsbG9jYXRvcjo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV90eXBlX2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV90eXBlX2FsbG9jYXRvcjo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHN0cnVjdCBzdG9yZWRfdmFsdWVfdHlwZQorICAgICAgeworCXZhbHVlX3R5cGUgbV92YWx1ZTsKKyAgICAgIH07CisKKyAgICAgIHN0YXRpYyBudWxsX21hcHBlZF90eXBlIHNfbnVsbF9tYXBwZWQ7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgbnVsbF9tYXBwZWRfdHlwZSBQQl9EU19DTEFTU19DX0RFQzo6c19udWxsX21hcHBlZDsKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHZhbHVlX3R5cGVfYmFzZTxLZXksIG51bGxfbWFwcGVkX3R5cGUsIEFsbG9jYXRvciwgdHJ1ZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHZhbHVlX3R5cGVfYmFzZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGhhc2ggdmFsdWUKKyAgICAgKiBpcyBzdG9yZWQgYWxvbmdzaWRlIGVhY2ggdmFsdWUuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIHN0cnVjdCB2YWx1ZV90eXBlX2Jhc2U8S2V5LCBudWxsX21hcHBlZF90eXBlLCBBbGxvY2F0b3IsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxudWxsX21hcHBlZF90eXBlPjo6b3RoZXIgbWFwcGVkX3R5cGVfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OnZhbHVlX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1hcHBlZF90eXBlX2FsbG9jYXRvcjo6cG9pbnRlciBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbWFwcGVkX3R5cGVfYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIGNvbnN0X21hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OnJlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtYXBwZWRfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9tYXBwZWRfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIEtleSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlciB2YWx1ZV90eXBlX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfdHlwZV9hbGxvY2F0b3I6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3R5cGVfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICBzdHJ1Y3Qgc3RvcmVkX3ZhbHVlX3R5cGUKKyAgICAgIHsKKwl2YWx1ZV90eXBlIG1fdmFsdWU7CisJdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgbV9oYXNoOworICAgICAgfTsKKworICAgICAgc3RhdGljIG51bGxfbWFwcGVkX3R5cGUgc19udWxsX21hcHBlZDsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBudWxsX21hcHBlZF90eXBlIFBCX0RTX0NMQVNTX0NfREVDOjpzX251bGxfbWFwcGVkOworCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQ+CisgICAgc3RydWN0IG5vX3Rocm93X2NvcGllcworICAgIHsKKyAgICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBpc19zaW1wbGU8S2V5Pjo6dmFsdWUgJiYgaXNfc2ltcGxlPE1hcHBlZD46OnZhbHVlPiBpbmRpY2F0b3I7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleT4KKyAgICBzdHJ1Y3Qgbm9fdGhyb3dfY29waWVzPEtleSwgbnVsbF9tYXBwZWRfdHlwZT4KKyAgICB7CisgICAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGludCwgaXNfc2ltcGxlPEtleT46OnZhbHVlPiBpbmRpY2F0b3I7CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgzNjkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHAKQEAgLTAsMCArMSw0OTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbl9zZWFyY2hfdHJlZV8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworLyoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBhbiBpZGVhIGZyb20gdGhlIFNHSSBTVEwgKHVzaW5nIGEgQGEgaGVhZGVyIG5vZGUKKyAqICAgIHdoaWNoIGlzIG5lZWRlZCBmb3IgZWZmaWNpZW50IGl0ZXJhdGlvbikuCisgKi8KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZXFfZm4vZXFfYnlfbGVzcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQwkJCQkJCVwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgY2xhc3MgQ21wX0ZuLAkJXAorCSAgICAgY2xhc3MgTm9kZV9BbmRfSXRfVHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NMQVNTX05BTUUJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX2RhdGFfCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FCQkJXAorICAgIGJpbl9zZWFyY2hfdHJlZV9ub19kYXRhXworI2VuZGlmIAorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQkJXAorICAgIFBCX0RTX0NMQVNTX05BTUU8CQkJCQkJCVwKKwkJCQkJCUtleSwJCQlcCisJCQkJCQlNYXBwZWQsCQkJXAorCQkJCQkJQ21wX0ZuLAkJCVwKKwkJCQkJCU5vZGVfQW5kX0l0X1RyYWl0cywJXAorCQkJCQkJQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQwkJCQlcCisgICAgdHlwZXNfdHJhaXRzPAkJCQlcCisJCQkJCQlLZXksCQlcCisJCQkJCQlNYXBwZWQsCQlcCisJCQkJCQlBbGxvY2F0b3IsCVwKKwkJCQkJCWZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMJCQkJCVwKKyAgICBkZWJ1Z19tYXBfYmFzZTxLZXksCWVxX2J5X2xlc3M8S2V5LCBDbXBfRm4+LCBcCisJICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKS5maXJzdAorI2RlZmluZSBQQl9EU19WMlMoWCkgKFgpLnNlY29uZAorI2RlZmluZSBQQl9EU19FUDJWUChYKSYgKChYKS0+bV92YWx1ZSkKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1YyRihYKSAoWCkKKyNkZWZpbmUgUEJfRFNfVjJTKFgpIE1hcHBlZF9EYXRhKCkKKyNkZWZpbmUgUEJfRFNfRVAyVlAoWCkmICgoWCktPm1fdmFsdWUuZmlyc3QpCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisjZGVmaW5lIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQwkJCQkJXAorICAgIHRyZWVfdHJhY2VfYmFzZTwJCQkJCQkJXAorCQkJCQkJCQkJdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpjb25zdF9ub2RlX2l0ZXJhdG9yLCBcCisJCQkJCQkJCQl0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfaXRlcmF0b3IsIFwKKwkJCQkJCQkJCUNtcF9GbiwJXAorCQkJCQkJCQkJdHJ1ZSwgXAorCQkJCQkJCQkJQWxsb2NhdG9yPgorI2VuZGlmIAorCisgICAgLyoqCisgICAgICogY2xhc3MgZGVzY3JpcHRpb24gPSAiOGl8XHw0cmVlICQzNHJjfC18IDdyMzMgNzQ4MTMuIj4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgY2xhc3MgTm9kZV9BbmRfSXRfVHJhaXRzLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIFBCX0RTX0NMQVNTX05BTUUgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwdWJsaWMgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYgCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorICAgICAgcHVibGljIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQywKKyNlbmRpZiAKKyAgICAgIHB1YmxpYyBDbXBfRm4sCisgICAgICBwdWJsaWMgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDLAorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV91cGRhdGUKKyAgICB7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZT46Om90aGVyCisgICAgICBub2RlX2FsbG9jYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6dmFsdWVfdHlwZSBub2RlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG5vZGVfYWxsb2NhdG9yOjpwb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMgdHJhaXRzX2Jhc2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6bnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyCisgICAgICBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBjb25kX2RlYWx0b3I8IG5vZGUsIEFsbG9jYXRvcj4gY29uZF9kZWFsdG9yX3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBkZWJ1Z19iYXNlOworI2VuZGlmIAorCisgICAgcHVibGljOgorCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDOjprZXlfdHlwZSBrZXlfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUM6OmtleV9wb2ludGVyIGtleV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUM6OmNvbnN0X2tleV9wb2ludGVyCisgICAgICBjb25zdF9rZXlfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUM6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDOjpjb25zdF9rZXlfcmVmZXJlbmNlCisgICAgICBjb25zdF9rZXlfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUM6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUM6Om1hcHBlZF9wb2ludGVyCisgICAgICBtYXBwZWRfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDOjpjb25zdF9tYXBwZWRfcG9pbnRlcgorICAgICAgY29uc3RfbWFwcGVkX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQzo6bWFwcGVkX3JlZmVyZW5jZQorICAgICAgbWFwcGVkX3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDOjpjb25zdF9tYXBwZWRfcmVmZXJlbmNlCisgICAgICBjb25zdF9tYXBwZWRfcmVmZXJlbmNlOworI2VuZGlmIAorCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQzo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQzo6cG9pbnRlciBwb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQzo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQzo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpwb2ludF9pdGVyYXRvciBwb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6OmNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX2l0ZXJhdG9yIG5vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIGNtcF9mbjsKKworICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX3VwZGF0ZSBub2RlX3VwZGF0ZTsKKworICAgIHB1YmxpYzoKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRSgpOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4sIGNvbnN0IG5vZGVfdXBkYXRlJiByX3VwZGF0ZSk7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICB+UEJfRFNfQ0xBU1NfTkFNRSgpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBDbXBfRm4mIAorICAgICAgZ2V0X2NtcF9mbigpOworCisgICAgICBjb25zdCBDbXBfRm4mIAorICAgICAgZ2V0X2NtcF9mbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpOworCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpOworCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSk7CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBiZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZW5kKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHZvaWQKKyAgICAgIHZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZV9taW5fbWF4KCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2ltcF9lbXB0eShjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgaW5zZXJ0X2xlYWZfbmV3KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlLCBub2RlX3BvaW50ZXIgcF9uZCwgYm9vbCBsZWZ0X25kKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X25ld19ub2RlX2Zvcl9sZWFmX2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfbmV3X25vZGVfZm9yX2xlYWZfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxub2RlX3BvaW50ZXIsIGJvb2w+CisgICAgICBlcmFzZShub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICB1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUobm9kZV9wb2ludGVyIHBfbmQpOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgY2xlYXJfaW1wKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjwKKwlwb2ludF9pdGVyYXRvciwKKwlib29sPgorICAgICAgaW5zZXJ0X2xlYWYoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcm90YXRlX2xlZnQobm9kZV9wb2ludGVyIHBfeCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByb3RhdGVfcmlnaHQobm9kZV9wb2ludGVyIHBfeSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByb3RhdGVfcGFyZW50KG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgcF9uZCwgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiBwX3VwZGF0ZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICB1cGRhdGVfdG9fdG9wKG5vZGVfcG9pbnRlciBwX25kLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgdXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiBwX3VwZGF0ZSk7CisKKyAgICAgIGJvb2wKKyAgICAgIGpvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICB2b2lkCisgICAgICBqb2luX2ZpbmlzaChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICBib29sCisgICAgICBzcGxpdF9wcmVwKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0X2ZpbmlzaChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJlY3Vyc2l2ZV9jb3VudChub2RlX3BvaW50ZXIgcF9uZCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdDsKKyNlbmRpZiAKKworICAgIHByaXZhdGU6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9pdGVyYXRvcnMoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnRfd2l0aF9sZWZ0KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudF93aXRoX3JpZ2h0KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2NvbnNpc3RlbnRfd2l0aF9kZWJ1Z19iYXNlKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21pbigpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbWluX2ltcChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9tYXgoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21heF9pbXAoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfc2l6ZSgpIGNvbnN0OworCisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjwgY29uc3RfcG9pbnRlciwgY29uc3RfcG9pbnRlcj4gbm9kZV9jb25zaXN0ZW50X3Q7CisKKyAgICAgIG5vZGVfY29uc2lzdGVudF90CisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50Xyhjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICAgIHZvaWQKKyAgICAgIGluaXRpYWxpemUoKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWN1cnNpdmVfY29weV9ub2RlKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfaGVhZDsKKworICAgICAgc2l6ZV90eXBlIG1fc2l6ZTsKKworICAgICAgc3RhdGljIG5vZGVfYWxsb2NhdG9yIHNfbm9kZV9hbGxvY2F0b3I7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcm90YXRlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisKKyN1bmRlZiBQQl9EU19DTEFTU19OQU1FCisKKyN1bmRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKworI3VuZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDCisKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisjdW5kZWYgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDCisjZW5kaWYgCisKKyN1bmRlZiBQQl9EU19WMkYKKyN1bmRlZiBQQl9EU19FUDJWUAorI3VuZGVmIFBCX0RTX1YyUworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uZF9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uZF9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDU3NGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9jb25kX2R0b3JfZW50cnlfZGVhbHRvci5ocHAKQEAgLTAsMCArMSw3MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uZF9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCisgKiBDb250YWlucyBhIGJpbmFyeSB0cmVlIGNvbnRhaW5lciBjb25kaXRpb25hbCBkZWFsbG9jYXRvcgorICovCisKK2NsYXNzIGJpbl9zZWFyY2hfdHJlZV9jb25kX2R0b3JfZW50cnlfZGVhbHRvcl8KK3sKK3B1YmxpYzoKKyAgaW5saW5lCisgIGJpbl9zZWFyY2hfdHJlZV9jb25kX2R0b3JfZW50cnlfZGVhbHRvcl8obm9kZV9wb2ludGVyIHBfbmQpIDogbV9wX25kKHBfbmQpLAorCQkJCQkJCQltX25vX2FjdGlvbl9kdG9yKGZhbHNlKQorICB7IH0KKworICBpbmxpbmUgdm9pZAorICBzZXRfbm9fYWN0aW9uX2R0b3IoKQorICB7CisgICAgbV9ub19hY3Rpb25fZHRvciA9IHRydWU7CisgIH0KKworICBpbmxpbmUKKyAgfmJpbl9zZWFyY2hfdHJlZV9jb25kX2R0b3JfZW50cnlfZGVhbHRvcl8oKQorICB7CisgICAgaWYgKG1fbm9fYWN0aW9uX2R0b3IpCisgICAgICByZXR1cm47CisKKyAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxOb2RlPjo6b3RoZXIoKS4KKyAgICAgIGRlYWxsb2NhdGUobV9wX25kLCAxKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIG5vZGVfcG9pbnRlciBtX3BfbmQ7CisKKyAgYm9vbCBtX25vX2FjdGlvbl9kdG9yOworfTsKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2NvbmRfa2V5X2R0b3JfZW50cnlfZGVhbHRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyZWNlYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2NvbmRfa2V5X2R0b3JfZW50cnlfZGVhbHRvci5ocHAKQEAgLTAsMCArMSw4MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcAorICogQ29udGFpbnMgYSBiaW5hcnkgdHJlZSBjb250YWluZXIgY29uZGl0aW9uYWwgZGVhbGxvY2F0b3IKKyAqLworCitjbGFzcyBiaW5fc2VhY2hfdHJlZV9jb25kX2tleV9kdG9yX2VudHJ5X2RlYWx0b3JfCit7CitwdWJsaWM6CisgIGlubGluZQorICBiaW5fc2VhY2hfdHJlZV9jb25kX2tleV9kdG9yX2VudHJ5X2RlYWx0b3JfKG5vZGVfcG9pbnRlciBwX25kKSA6IG1fcF9uZChwX25kKSwKKwkJCQkJCQkJICAgbV9ub19hY3Rpb25fZHRvcihmYWxzZSksCisJCQkJCQkJCSAgIG1fa2V5X2Rlc3RydWN0KGZhbHNlKQorICB7IH0KKworICBpbmxpbmUgdm9pZAorICBzZXRfbm9fYWN0aW9uX2R0b3IoKQorICB7CisgICAgbV9ub19hY3Rpb25fZHRvciA9IHRydWU7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBzZXRfa2V5X2Rlc3RydWN0KCkKKyAgeworICAgIG1fa2V5X2Rlc3RydWN0ID0gdHJ1ZTsKKyAgfQorCisgIGlubGluZQorICB+YmluX3NlYWNoX3RyZWVfY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yXygpCisgIHsKKyAgICBpZiAobV9ub19hY3Rpb25fZHRvcikKKyAgICAgIHJldHVybjsKKworICAgIGlmIChtX2tleV9kZXN0cnVjdCkKKyAgICAgIG1fcF9uZC0+bV92YWx1ZS5maXJzdC5+S2V5KCk7CisKKyAgICBiaW5fdHJlZV9iYXNlOjpzX2FsbG9jLmRlYWxsb2NhdGUobV9wX25kLCAxKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIG5vZGVfcG9pbnRlciBtX3BfbmQ7CisKKyAgYm9vbCBtX25vX2FjdGlvbl9kdG9yOworCisgIGJvb2wgbV9rZXlfZGVzdHJ1Y3Q7Cit9OworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDIxOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19ub2RlX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoKSA6IG1fcF9oZWFkKHNfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLCBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBDbXBfRm4ocl9jbXBfZm4pLCBtX3BfaGVhZChzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4sIGNvbnN0IG5vZGVfdXBkYXRlJiByX25vZGVfdXBkYXRlKSA6CisgIENtcF9GbihyX2NtcF9mbiksCisgIG5vZGVfdXBkYXRlKHJfbm9kZV91cGRhdGUpLAorICBtX3BfaGVhZChzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwKKyAgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGRlYnVnX2Jhc2Uob3RoZXIpLAorI2VuZGlmIAorI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyAgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDKG90aGVyKSwKKyNlbmRpZiAKKyAgQ21wX0ZuKG90aGVyKSwKKyAgbm9kZV91cGRhdGUob3RoZXIpLAorICBtX3BfaGVhZChzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwKKyAgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgbV9zaXplID0gb3RoZXIubV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLnN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKworICAgIF9fdHJ5CisgICAgICB7CisgICAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgICAgICAgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCAhPSAwKQorCSAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKyAgICAgICAgbV9zaXplID0gb3RoZXIubV9zaXplOworICAgICAgICBpbml0aWFsaXplX21pbl9tYXgoKTsKKyAgICAgIH0KKyAgICBfX2NhdGNoKC4uLikKKyAgICAgIHsKKyAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpOykKKwlzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX2hlYWQsIDEpOworICAgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfT05MWShzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuc3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKChDbXBfRm4mICkoKnRoaXMpLCAoQ21wX0ZuJiApb3RoZXIpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5zdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzd2FwKG90aGVyKTspCisgIHN0ZDo6c3dhcChtX3BfaGVhZCwgb3RoZXIubV9wX2hlYWQpOworICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorflBCX0RTX0NMQVNTX05BTUUoKQoreworICBjbGVhcigpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX2hlYWQsIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7CisgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gMDsKKyAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gbV9wX2hlYWQ7CisgIG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBtX3BfaGVhZDsKKyAgbV9zaXplID0gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY3Vyc2l2ZV9jb3B5X25vZGUoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuICgwKTsKKworICBub2RlX3BvaW50ZXIgcF9yZXQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBfX3RyeQorICAgIHsKKyAgICAgIG5ldyAocF9yZXQpIG5vZGUoKnBfbmQpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfcmV0LCAxKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBwX3JldC0+bV9wX2xlZnQgPSBwX3JldC0+bV9wX3JpZ2h0ID0gMDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIHBfcmV0LT5tX3BfbGVmdCA9IHJlY3Vyc2l2ZV9jb3B5X25vZGUocF9uZC0+bV9wX2xlZnQpOworICAgICAgcF9yZXQtPm1fcF9yaWdodCA9IHJlY3Vyc2l2ZV9jb3B5X25vZGUocF9uZC0+bV9wX3JpZ2h0KTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGNsZWFyX2ltcChwX3JldCk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgaWYgKHBfcmV0LT5tX3BfbGVmdCAhPSAwKQorICAgIHBfcmV0LT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9IHBfcmV0OworCisgIGlmIChwX3JldC0+bV9wX3JpZ2h0ICE9IDApCisgICAgcF9yZXQtPm1fcF9yaWdodC0+bV9wX3BhcmVudCA9IHBfcmV0OworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3JldCk7KQorICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplX21pbl9tYXgoKQoreworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICB7CisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gbV9wX2hlYWQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHsKKyAgICBub2RlX3BvaW50ZXIgcF9taW4gPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgICB3aGlsZSAocF9taW4tPm1fcF9sZWZ0ICE9IDApCisgICAgICBwX21pbiA9IHBfbWluLT5tX3BfbGVmdDsKKyAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBwX21pbjsKKyAgfQorCisgIHsKKyAgICBub2RlX3BvaW50ZXIgcF9tYXggPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgICB3aGlsZSAocF9tYXgtPm1fcF9yaWdodCAhPSAwKQorICAgICAgcF9tYXggPSBwX21heC0+bV9wX3JpZ2h0OworICAgIG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBwX21heDsKKyAgfQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzAwMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgc3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7CisgIGFzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZSgpOworICBhc3NlcnRfc2l6ZSgpOworICBhc3NlcnRfaXRlcmF0b3JzKCk7CisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPT0gMCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpIGNvbnN0Cit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZCAhPSAwKTsKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfbGVmdCA9PSBtX3BfaGVhZCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBtX3BfaGVhZCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID09IG1fcF9oZWFkKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZC0+bV9wX2xlZnQgIT0gbV9wX2hlYWQpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfcmlnaHQgIT0gbV9wX2hlYWQpOworICAgIH0KKworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKyAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgYXNzZXJ0X21pbigpOworICBhc3NlcnRfbWF4KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdAoreworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50XyhwX25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2NvbnNpc3RlbnRfdAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X25vZGVfY29uc2lzdGVudF8oY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcigoY29uc3RfcG9pbnRlcikwLChjb25zdF9wb2ludGVyKTApKTsKKworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfbGVmdChwX25kKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudF93aXRoX3JpZ2h0KHBfbmQpOworCisgIGNvbnN0IHN0ZDo6cGFpcjxjb25zdF9wb2ludGVyLCBjb25zdF9wb2ludGVyPgorICAgIGxfcmFuZ2UgPSBhc3NlcnRfbm9kZV9jb25zaXN0ZW50XyhwX25kLT5tX3BfbGVmdCk7CisKKyAgaWYgKGxfcmFuZ2Uuc2Vjb25kICE9IDApCisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKmxfcmFuZ2Uuc2Vjb25kKSwKKwkJCQkJICAgICBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKTsKKworICBjb25zdCBzdGQ6OnBhaXI8Y29uc3RfcG9pbnRlciwgY29uc3RfcG9pbnRlcj4KKyAgICByX3JhbmdlID0gYXNzZXJ0X25vZGVfY29uc2lzdGVudF8ocF9uZC0+bV9wX3JpZ2h0KTsKKworICBpZiAocl9yYW5nZS5maXJzdCAhPSAwKQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLAorCQkJCQkgICAgIFBCX0RTX1YyRigqcl9yYW5nZS5maXJzdCkpKTsKKworICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKChsX3JhbmdlLmZpcnN0ICE9IDApPyBsX3JhbmdlLmZpcnN0IDomIHBfbmQtPm1fdmFsdWUsKHJfcmFuZ2Uuc2Vjb25kICE9IDApPyByX3JhbmdlLnNlY29uZCA6JiBwX25kLT5tX3ZhbHVlKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50X3dpdGhfbGVmdChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkgY29uc3QKK3sKKyAgaWYgKHBfbmQtPm1fcF9sZWZ0ID09IDApCisgICAgcmV0dXJuOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX2xlZnQtPm1fcF9wYXJlbnQgPT0gcF9uZCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghQ21wX0ZuOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSwKKwkJCQkJICAgIFBCX0RTX1YyRihwX25kLT5tX3BfbGVmdC0+bV92YWx1ZSkpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnRfd2l0aF9yaWdodChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkgY29uc3QKK3sKKyAgaWYgKHBfbmQtPm1fcF9yaWdodCA9PSAwKQorICAgIHJldHVybjsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9yaWdodC0+bV9wX3BhcmVudCA9PSBwX25kKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fcF9yaWdodC0+bV92YWx1ZSksCisJCQkJICAgICAgIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21pbigpIGNvbnN0Cit7CisgIGFzc2VydF9taW5faW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9taW5faW1wKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gbV9wX2hlYWQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9uZC0+bV9wX2xlZnQgPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCA9PSBtX3BfaGVhZC0+bV9wX2xlZnQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgYXNzZXJ0X21pbl9pbXAocF9uZC0+bV9wX2xlZnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heCgpIGNvbnN0Cit7CisgIGFzc2VydF9tYXhfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9tYXhfaW1wKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZC0+bV9wX3JpZ2h0ID09IG1fcF9oZWFkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfbmQtPm1fcF9yaWdodCA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kID09IG1fcF9oZWFkLT5tX3BfcmlnaHQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhc3NlcnRfbWF4X2ltcChwX25kLT5tX3BfcmlnaHQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2l0ZXJhdG9ycygpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBpdGVyYXRlZF9udW0gPSAwOworICBjb25zdF9pdGVyYXRvciBwcmV2X2l0ID0gZW5kKCk7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgKytpdCkKKyAgICB7CisgICAgICArK2l0ZXJhdGVkX251bTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsb3dlcl9ib3VuZChQQl9EU19WMkYoKml0KSkubV9wX25kID09IGl0Lm1fcF9uZCk7CisgICAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZF9pdCA9IHVwcGVyX2JvdW5kKFBCX0RTX1YyRigqaXQpKTsKKyAgICAgIC0tdXBwZXJfYm91bmRfaXQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQodXBwZXJfYm91bmRfaXQubV9wX25kID09IGl0Lm1fcF9uZCk7CisKKyAgICAgIGlmIChwcmV2X2l0ICE9IGVuZCgpKQorCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCpwcmV2X2l0KSwKKwkJCQkJCSBQQl9EU19WMkYoKml0KSkpOworICAgICAgcHJldl9pdCA9IGl0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXRlcmF0ZWRfbnVtID09IG1fc2l6ZSk7CisgIHNpemVfdHlwZSByZXZlcnNlX2l0ZXJhdGVkX251bSA9IDA7CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9wcmV2X2l0ID0gcmVuZCgpOworICBmb3IgKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdCA9IHJiZWdpbigpOyByZXZlcnNlX2l0ICE9IHJlbmQoKTsKKyAgICAgICArK3JldmVyc2VfaXQpCisgICAgeworICAgICAgKytyZXZlcnNlX2l0ZXJhdGVkX251bTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsb3dlcl9ib3VuZCgKKwkJCQkgICBQQl9EU19WMkYoKnJldmVyc2VfaXQpKS5tX3BfbmQgPT0gcmV2ZXJzZV9pdC5tX3BfbmQpOworCisgICAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZF9pdCA9IHVwcGVyX2JvdW5kKFBCX0RTX1YyRigqcmV2ZXJzZV9pdCkpOworICAgICAgLS11cHBlcl9ib3VuZF9pdDsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh1cHBlcl9ib3VuZF9pdC5tX3BfbmQgPT0gcmV2ZXJzZV9pdC5tX3BfbmQpOworICAgICAgaWYgKHJldmVyc2VfcHJldl9pdCAhPSByZW5kKCkpCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKCpyZXZlcnNlX3ByZXZfaXQpLAorCQkJCQkJICBQQl9EU19WMkYoKnJldmVyc2VfaXQpKSk7CisgICAgICByZXZlcnNlX3ByZXZfaXQgPSByZXZlcnNlX2l0OworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHJldmVyc2VfaXRlcmF0ZWRfbnVtID09IG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoKSBjb25zdAoreworICBkZWJ1Z19iYXNlOjpjaGVja19zaXplKG1fc2l6ZSk7CisgIGFzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZShtX3BfaGVhZC0+bV9wX3BhcmVudCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfY29uc2lzdGVudF93aXRoX2RlYnVnX2Jhc2UoY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQpIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSk7CisgIGFzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZShwX25kLT5tX3BfbGVmdCk7CisgIGFzc2VydF9jb25zaXN0ZW50X3dpdGhfZGVidWdfYmFzZShwX25kLT5tX3BfcmlnaHQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3NpemUoKSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocmVjdXJzaXZlX2NvdW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KSA9PSBtX3NpemUpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTY2M2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEyMCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWN0dWFsX2VyYXNlX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX3otPm1fdmFsdWUpKSk7CisKKyAgcF96LT5+bm9kZSgpOworCisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX3osIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICBpZiAobV9zaXplID09IDEpCisgICAgeworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gbV9wX2hlYWQtPm1fcF9yaWdodCA9IG1fcF9oZWFkOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisKKyAgICAgICsraXQ7CisKKyAgICAgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IGl0Lm1fcF9uZDsKKyAgICB9CisgIGVsc2UgaWYgKG1fcF9oZWFkLT5tX3BfcmlnaHQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisKKyAgICAgIC0taXQ7CisKKyAgICAgIG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBpdC5tX3BfbmQ7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKworICAgIGNsZWFyX2ltcChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisKKyAgbV9zaXplID0gMDsKKworICBpbml0aWFsaXplKCk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpOykKKworICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoc3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyX2ltcChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm47CisKKyAgY2xlYXJfaW1wKHBfbmQtPm1fcF9sZWZ0KTsKKworICBjbGVhcl9pbXAocF9uZC0+bV9wX3JpZ2h0KTsKKworICBwX25kLT5+bm9kZSgpOworCisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX25kLCAxKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyYzdmMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxODIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3BvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citsb3dlcl9ib3VuZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkoCisJCQkgICBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksCisJCQkgICByX2tleSkpCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworICAgIGVsc2UKKyAgICAgIHsKKwlwX3BvdCA9IHBfbmQ7CisKKwlwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisKKyAgcmV0dXJuIChpdGVyYXRvcihwX3BvdCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbG93ZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfcG90ID0gbV9wX2hlYWQ7CisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKAorCQkJICAgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLAorCQkJICAgcl9rZXkpKQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKyAgICBlbHNlCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorCisgIHJldHVybiAoaXRlcmF0b3IocF9wb3QpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwcGVyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwKKwkJCSAgIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kLAorCisJICBwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKworICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKHBfcG90KSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cHBlcl9ib3VuZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBub2RlX3BvaW50ZXIgcF9wb3QgPSBtX3BfaGVhZDsKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksCisJCQkgICBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKQorICAgICAgeworCXBfcG90ID0gcF9uZCwKKworCSAgcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgcmV0dXJuIChwb2ludF9pdGVyYXRvcihwX3BvdCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKworICAgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKChwX3BvdCAhPSBtX3BfaGVhZCYmICBDbXBfRm46Om9wZXJhdG9yKCkoCisJCQkJCQkJCSByX2tleSwKKwkJCQkJCQkJIFBCX0RTX1YyRihwX3BvdC0+bV92YWx1ZSkpKT8KKwkJCW1fcF9oZWFkIDogcF9wb3QpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKworICAgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgcmV0dXJuIGNvbnN0X3BvaW50X2l0ZXJhdG9yKChwX3BvdCAhPSBtX3BfaGVhZCYmICBDbXBfRm46Om9wZXJhdG9yKCkoCisJCQkJCQkJCSAgICAgICByX2tleSwKKwkJCQkJCQkJICAgICAgIFBCX0RTX1YyRihwX3BvdC0+bV92YWx1ZSkpKT8KKwkJCSAgICAgIG1fcF9oZWFkIDogcF9wb3QpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U0NjExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDY0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sKKyAgcmV0dXJuIChtX3NpemUgPT0gMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAobV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAoc19ub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjVhZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2xlYWYoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoc3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgaWYgKG1fc2l6ZSA9PSAwKQorICAgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcigKKwkJCSAgICAgaW5zZXJ0X2ltcF9lbXB0eShyX3ZhbHVlKSwKKwkJCSAgICAgdHJ1ZSkpOworCisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IG1fcF9oZWFkOworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoCisJCQkgICAgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLAorCQkJICAgIFBCX0RTX1YyRihyX3ZhbHVlKSkpCisgICAgICB7CisJcF9wb3QgPSBwX25kOworCisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgaWYgKHBfcG90ID09IG1fcF9oZWFkKQorICAgIHJldHVybiAoc3RkOjptYWtlX3BhaXIoCisJCQkgICBpbnNlcnRfbGVhZl9uZXcocl92YWx1ZSwgIG1fcF9oZWFkLT5tX3BfcmlnaHQsIGZhbHNlKSwKKwkJCSAgIHRydWUpKTsKKworICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKSgKKwkJCSAgUEJfRFNfVjJGKHJfdmFsdWUpLAorCQkJICBQQl9EU19WMkYocF9wb3QtPm1fdmFsdWUpKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKworICAgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoCisJCQkJCQkJUEJfRFNfVjJGKHJfdmFsdWUpKSk7CisKKyAgICAgIHJldHVybiAoc3RkOjptYWtlX3BhaXIocF9wb3QsIGZhbHNlKSk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KAorCQkJCQkJCSAgUEJfRFNfVjJGKHJfdmFsdWUpKSk7CisKKyAgcF9uZCA9IHBfcG90LT5tX3BfbGVmdDsKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKAorCQkJICAgaW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIHBfcG90LCB0cnVlKSwKKwkJCSAgIHRydWUpKTsKKworICB3aGlsZSAocF9uZC0+bV9wX3JpZ2h0ICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKworICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKAorCQkJIGluc2VydF9sZWFmX25ldyhyX3ZhbHVlLCBwX25kLCBmYWxzZSksCisJCQkgdHJ1ZSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2xlYWZfbmV3KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlLCBub2RlX3BvaW50ZXIgcF9uZCwgYm9vbCBsZWZ0X25kKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPQorICAgIGdldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQoICAgICAgICAgICAgcl92YWx1ZSwgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisKKyAgaWYgKGxlZnRfbmQpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9sZWZ0ID09IDApOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKENtcF9Gbjo6b3BlcmF0b3IoKSgKKwkJCQkJICBQQl9EU19WMkYocl92YWx1ZSksCisJCQkJCSAgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSk7CisKKyAgICAgIHBfbmQtPm1fcF9sZWZ0ID0gcF9uZXdfbmQ7CisKKyAgICAgIGlmIChtX3BfaGVhZC0+bV9wX2xlZnQgPT0gcF9uZCkKKwltX3BfaGVhZC0+bV9wX2xlZnQgPSBwX25ld19uZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX3JpZ2h0ID09IDApOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKENtcF9Gbjo6b3BlcmF0b3IoKSgKKwkJCQkJICBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksCisJCQkJCSAgUEJfRFNfVjJGKHJfdmFsdWUpKSk7CisKKyAgICAgIHBfbmQtPm1fcF9yaWdodCA9IHBfbmV3X25kOworCisgICAgICBpZiAobV9wX2hlYWQtPm1fcF9yaWdodCA9PSBwX25kKQorCW1fcF9oZWFkLT5tX3BfcmlnaHQgPSBwX25ld19uZDsKKyAgICB9CisKKyAgcF9uZXdfbmQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfbmV3X25kLT5tX3BfbGVmdCA9IHBfbmV3X25kLT5tX3BfcmlnaHQgPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kKSk7CisKKyAgdXBkYXRlX3RvX3RvcChwX25ld19uZCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KAorCQkJCQkgICAgUEJfRFNfVjJGKHJfdmFsdWUpKSk7CisKKyAgcmV0dXJuIChpdGVyYXRvcihwX25ld19uZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcF9lbXB0eShjb25zdF9yZWZlcmVuY2Ugcl92YWx1ZSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25vZGUgPQorICAgIGdldF9uZXdfbm9kZV9mb3JfbGVhZl9pbnNlcnQoICAgICAgICByX3ZhbHVlLCB0cmFpdHNfYmFzZTo6bV9ub190aHJvd19jb3BpZXNfaW5kaWNhdG9yKTsKKworICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0KKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfbmV3X25vZGU7CisKKyAgcF9uZXdfbm9kZS0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworCisgIHBfbmV3X25vZGUtPm1fcF9sZWZ0ID0gcF9uZXdfbm9kZS0+bV9wX3JpZ2h0ID0gMDsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoCisJCQkJCSAgICBQQl9EU19WMkYocl92YWx1ZSkpKTsKKworICB1cGRhdGVfdG9fdG9wKG1fcF9oZWFkLT5tX3BfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworICByZXR1cm4gKGl0ZXJhdG9yKHBfbmV3X25vZGUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X25vZGVfZm9yX2xlYWZfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV3X25kID0gc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfbmV3X25kKTsKKworICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPigKKwkJCSAgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPigmcF9uZXdfbmQtPm1fdmFsdWUpKSkKKyAgICB0eXBlbmFtZSBub2RlOjp2YWx1ZV90eXBlKHJfdmFsKTsKKworICBjb25kLnNldF9ub19hY3Rpb24oKTsKKworICBwX25ld19uZC0+bV9wX2xlZnQgPSBwX25ld19uZC0+bV9wX3JpZ2h0ID0gMDsKKworICArK21fc2l6ZTsKKworICByZXR1cm4gKHBfbmV3X25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmV3X25vZGVfZm9yX2xlYWZfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KAorCQkJICBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KCZwX25ld19uZC0+bV92YWx1ZSkpKQorICAgIHR5cGVuYW1lIG5vZGU6OnZhbHVlX3R5cGUocl92YWwpOworCisgIHBfbmV3X25kLT5tX3BfbGVmdCA9IHBfbmV3X25kLT5tX3BfcmlnaHQgPSAwOworCisgICsrbV9zaXplOworCisgIHJldHVybiAocF9uZXdfbmQpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmNmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICByZXR1cm4gKGl0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfbGVmdCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfbGVmdCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sKKyAgcmV0dXJuIChpdGVyYXRvcihtX3BfaGVhZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9pdGVyYXRvcihtX3BfaGVhZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityYmVnaW4oKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9yaWdodCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityYmVnaW4oKQoreworICByZXR1cm4gKHJldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9yaWdodCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpyZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityZW5kKCkKK3sKKyAgcmV0dXJuIChyZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbmQoKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IobV9wX2hlYWQpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3Rfbm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9iZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiAoY29uc3Rfbm9kZV9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX3BhcmVudCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkKK3sKKyAgcmV0dXJuIChub2RlX2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfcGFyZW50KSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X25vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9ub2RlX2l0ZXJhdG9yKDApKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKQoreworICByZXR1cm4gKG5vZGVfaXRlcmF0b3IoMCkpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlYTQ1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL25vZGVfaXRlcmF0b3JzLmhwcApAQCAtMCwwICsxLDIzNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbm9kZV9pdGVyYXRvcnMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKyNkZWZpbmUgUEJfRFNfQklOX1NFQVJDSF9UUkVFX05PREVfSVRFUkFUT1JTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfPAkJCQkJXAorCQkJCQkJCU5vZGUsCQlcCisJCQkJCQkJQ29uc3RfSXRlcmF0b3IsCVwKKwkJCQkJCQlJdGVyYXRvciwJXAorCQkJCQkJCUFsbG9jYXRvcj4KKworICAgIC8vIENvbnN0IG5vZGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwKKwkgICAgIGNsYXNzIENvbnN0X0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgSXRlcmF0b3IsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfCisgICAgeworICAgIHByaXZhdGU6CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBOb2RlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKworICAgICAgLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAvLyBEaWZmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8gX19JdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIENvbnN0X0l0ZXJhdG9yIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vIF9fSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgQ29uc3RfSXRlcmF0b3IgcmVmZXJlbmNlOworCisgICAgICAvLyBfX0l0ZXJhdG9yJ3MgX19jb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgQ29uc3RfSXRlcmF0b3IgY29uc3RfcmVmZXJlbmNlOworCisgICAgICAvLyBNZXRhZGF0YSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlOjptZXRhZGF0YV90eXBlIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIC8vIENvbnN0IG1ldGFkYXRhIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbWV0YWRhdGFfdHlwZT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIGNvbnN0X21ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgIHB1YmxpYzoKKworICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIC8qCisJaW5saW5lCisJYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfKCkKKyAgICAgICovCisKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X25vZGVfaXRfKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kID0gMCkgOiBtX3BfbmQoY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpKQorICAgICAgeyB9CisKKyAgICAgIC8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChDb25zdF9JdGVyYXRvcihtX3BfbmQpKTsKKyAgICAgIH0KKworICAgICAgLy8gTWV0YWRhdGEgYWNjZXNzLgorICAgICAgaW5saW5lIGNvbnN0X21ldGFkYXRhX3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKG1fcF9uZC0+Z2V0X21ldGFkYXRhKCkpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIHRoZSBfX2NvbnN0IG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBsZWZ0IG5vZGUuCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisgICAgICBnZXRfbF9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMobV9wX25kLT5tX3BfbGVmdCkpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIHRoZSBfX2NvbnN0IG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByaWdodCBub2RlLgorICAgICAgaW5saW5lIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQworICAgICAgZ2V0X3JfY2hpbGQoKSBjb25zdAorICAgICAgeworCXJldHVybiAoUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDKG1fcF9uZC0+bV9wX3JpZ2h0KSk7CisgICAgICB9CisKKyAgICAgIC8vIENvbXBhcmVzIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChtX3BfbmQgPT0gb3RoZXIubV9wX25kKTsKKyAgICAgIH0KKworICAgICAgLy8gQ29tcGFyZXMgKG5lZ2F0aXZlbHkpIHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChtX3BfbmQgIT0gb3RoZXIubV9wX25kKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbmQ7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX25vZGVfaXRfPAkJCQkJXAorCQkJCQkJTm9kZSwJCVwKKwkJCQkJCUNvbnN0X0l0ZXJhdG9yLCBcCisJCQkJCQlJdGVyYXRvciwJXAorCQkJCQkJQWxsb2NhdG9yPgorCisgICAgLy8gTm9kZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLAorCSAgICAgY2xhc3MgQ29uc3RfSXRlcmF0b3IsCisJICAgICBjbGFzcyBJdGVyYXRvciwKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF8gOiAKKyAgICAgIHB1YmxpYyBQQl9EU19UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKworICAgIHsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIE5vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorCisgICAgICAvLyBfX0l0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgICAgIHR5cGVkZWYgSXRlcmF0b3IgdmFsdWVfdHlwZTsKKworICAgICAgLy8gX19JdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiBJdGVyYXRvciByZWZlcmVuY2U7CisKKyAgICAgIC8vIF9fSXRlcmF0b3IncyBfX2NvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiBJdGVyYXRvciBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAvKgorCWlubGluZQorCWJpbl9zZWFyY2hfdHJlZV9ub2RlX2l0XygpOworICAgICAgKi8KKworICAgICAgaW5saW5lCisgICAgICBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF8oY29uc3Qgbm9kZV9wb2ludGVyIHBfbmQgPSAwKSA6IFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQygKKwkJCQkJCQkJCQkJCQkgICAgY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpKQorICAgICAgeyB9CisKKyAgICAgIC8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSBJdGVyYXRvcgorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKEl0ZXJhdG9yKFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQzo6bV9wX25kKSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHVybnMgdGhlIG5vZGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBsZWZ0IG5vZGUuCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisgICAgICBnZXRfbF9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIChQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMoCisJCQkJCQkgICAgIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQzo6bV9wX25kLT5tX3BfbGVmdCkpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIHRoZSBub2RlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlnaHQgbm9kZS4KKyAgICAgIGlubGluZSBQQl9EU19UUkVFX05PREVfSVRFUkFUT1JfQ0xBU1NfQ19ERUMKKyAgICAgIGdldF9yX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKFBCX0RTX1RSRUVfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQygKKwkJCQkJCSAgICAgUEJfRFNfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDOjptX3BfbmQtPm1fcF9yaWdodCkpOworICAgICAgfQorCisgICAgfTsKKworI3VuZGVmIFBCX0RTX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DTEFTU19DX0RFQworCisjdW5kZWYgUEJfRFNfVFJFRV9OT0RFX0lURVJBVE9SX0NMQVNTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9pbnRfaXRlcmF0b3JzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZGY2OAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAKQEAgLTAsMCArMSwzODEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBvaW50X2l0ZXJhdG9ycy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX0ZJTkRfSVRFUkFUT1JTX0hQUAorI2RlZmluZSBQQl9EU19CSU5fU0VBUkNIX1RSRUVfRklORF9JVEVSQVRPUlNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQwkJCQkJXAorICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CQkJCQkJXAorCQkJCQkJTm9kZV9Qb2ludGVyLAkJXAorCQkJCQkJVmFsdWVfVHlwZSwJCVwKKwkJCQkJCVBvaW50ZXIsCQlcCisJCQkJCQlDb25zdF9Qb2ludGVyLAkJXAorCQkJCQkJUmVmZXJlbmNlLAkJXAorCQkJCQkJQ29uc3RfUmVmZXJlbmNlLAlcCisJCQkJCQlJc19Gb3J3YXJkX0l0ZXJhdG9yLAlcCisJCQkJCQlBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDCQkJCQlcCisgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0XzwJCQkJCQlcCisJCQkJCQlOb2RlX1BvaW50ZXIsCQlcCisJCQkJCQlWYWx1ZV9UeXBlLAkJXAorCQkJCQkJUG9pbnRlciwJCVwKKwkJCQkJCUNvbnN0X1BvaW50ZXIsCQlcCisJCQkJCQlSZWZlcmVuY2UsCQlcCisJCQkJCQlDb25zdF9SZWZlcmVuY2UsCVwKKwkJCQkJCSFJc19Gb3J3YXJkX0l0ZXJhdG9yLAlcCisJCQkJCQlBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfVFJFRV9JVF9DX0RFQwkJCQkJCVwKKyAgICBiaW5fc2VhcmNoX3RyZWVfaXRfPAkJCQkJCVwKKwkJCQkJCU5vZGVfUG9pbnRlciwJCVwKKwkJCQkJCVZhbHVlX1R5cGUsCQlcCisJCQkJCQlQb2ludGVyLAkJXAorCQkJCQkJQ29uc3RfUG9pbnRlciwJCVwKKwkJCQkJCVJlZmVyZW5jZSwJCVwKKwkJCQkJCUNvbnN0X1JlZmVyZW5jZSwJXAorCQkJCQkJSXNfRm9yd2FyZF9JdGVyYXRvciwJXAorCQkJCQkJQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX1RSRUVfT0RJUl9JVF9DX0RFQwkJCQkJXAorICAgIGJpbl9zZWFyY2hfdHJlZV9pdF88CQkJCQkJXAorCQkJCQkJCU5vZGVfUG9pbnRlciwJXAorCQkJCQkJCVZhbHVlX1R5cGUsCVwKKwkJCQkJCQlQb2ludGVyLAlcCisJCQkJCQkJQ29uc3RfUG9pbnRlciwJXAorCQkJCQkJCVJlZmVyZW5jZSwJXAorCQkJCQkJCUNvbnN0X1JlZmVyZW5jZSwgXAorCQkJCQkJCSFJc19Gb3J3YXJkX0l0ZXJhdG9yLCBcCisJCQkJCQkJQWxsb2NhdG9yPgorCisgICAgLy8gQ29uc3QgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9Qb2ludGVyLAorCSAgICAgdHlwZW5hbWUgVmFsdWVfVHlwZSwKKwkgICAgIHR5cGVuYW1lIFBvaW50ZXIsCisJICAgICB0eXBlbmFtZSBDb25zdF9Qb2ludGVyLAorCSAgICAgdHlwZW5hbWUgUmVmZXJlbmNlLAorCSAgICAgdHlwZW5hbWUgQ29uc3RfUmVmZXJlbmNlLAorCSAgICAgYm9vbCBJc19Gb3J3YXJkX0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF8KKyAgICB7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIFBvaW50ZXIgcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBDb25zdF9Qb2ludGVyIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgUmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBDb25zdF9SZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgcHVibGljOgorCisgICAgICBpbmxpbmUKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF8oY29uc3QgTm9kZV9Qb2ludGVyIHBfbmQgPSAwKSAKKyAgICAgIDogbV9wX25kKGNvbnN0X2Nhc3Q8Tm9kZV9Qb2ludGVyPihwX25kKSkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF8oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDJiBvdGhlcikgCisgICAgICA6IG1fcF9uZChvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIHsKKwltX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUKKyAgICAgIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3I9KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJbV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQgIT0gMCk7CisJcmV0dXJuICZtX3BfbmQtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZCAhPSAwKTsKKwlyZXR1cm4gbV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDICYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfbmQgPT0gb3RoZXIubV9wX25kOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX1RSRUVfQ09OU1RfT0RJUl9JVF9DX0RFQyAmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kID09IG90aGVyLm1fcF9uZDsgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCAhPSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCAhPSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZCAhPSAwKTsKKwlpbmMoaW50ZWdyYWxfY29uc3RhbnQ8aW50LElzX0ZvcndhcmRfSXRlcmF0b3I+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCVBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMgcmV0X2l0KG1fcF9uZCk7CisJb3BlcmF0b3IrKygpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCWRlYyhpbnRlZ3JhbF9jb25zdGFudDxpbnQsSXNfRm9yd2FyZF9JdGVyYXRvcj4oKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQworICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyByZXRfaXQobV9wX25kKTsKKwlvcGVyYXRvci0tKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBpbmMoZmFsc2VfdHlwZSkKKyAgICAgIHsgZGVjKHRydWVfdHlwZSgpKTsgfQorCisgICAgICB2b2lkCisgICAgICBpbmModHJ1ZV90eXBlKQorICAgICAgeworCWlmIChtX3BfbmQtPnNwZWNpYWwoKSYmIAorCSAgICBtX3BfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPT0gbV9wX25kKQorCSAgeworCSAgICBtX3BfbmQgPSBtX3BfbmQtPm1fcF9sZWZ0OworCSAgICByZXR1cm47CisJICB9CisKKwlpZiAobV9wX25kLT5tX3BfcmlnaHQgIT0gMCkKKwkgIHsKKwkgICAgbV9wX25kID0gbV9wX25kLT5tX3BfcmlnaHQ7CisJICAgIHdoaWxlIChtX3BfbmQtPm1fcF9sZWZ0ICE9IDApCisJICAgICAgbV9wX25kID0gbV9wX25kLT5tX3BfbGVmdDsKKwkgICAgcmV0dXJuOworCSAgfQorCisJTm9kZV9Qb2ludGVyIHBfeSA9IG1fcF9uZC0+bV9wX3BhcmVudDsKKwl3aGlsZSAobV9wX25kID09IHBfeS0+bV9wX3JpZ2h0KQorCSAgeworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHBfeSA9IHBfeS0+bV9wX3BhcmVudDsKKwkgIH0KKworCWlmIChtX3BfbmQtPm1fcF9yaWdodCAhPSBwX3kpCisJICBtX3BfbmQgPSBwX3k7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBkZWMoZmFsc2VfdHlwZSkKKyAgICAgIHsgaW5jKHRydWVfdHlwZSgpKTsgfQorCisgICAgICB2b2lkCisgICAgICBkZWModHJ1ZV90eXBlKQorICAgICAgeworCWlmIChtX3BfbmQtPnNwZWNpYWwoKSAmJiBtX3BfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPT0gbV9wX25kKQorCSAgeworCSAgICBtX3BfbmQgPSBtX3BfbmQtPm1fcF9yaWdodDsKKwkgICAgcmV0dXJuOworCSAgfQorCisJaWYgKG1fcF9uZC0+bV9wX2xlZnQgIT0gMCkKKwkgIHsKKwkgICAgTm9kZV9Qb2ludGVyIHBfeSA9IG1fcF9uZC0+bV9wX2xlZnQ7CisJICAgIHdoaWxlIChwX3ktPm1fcF9yaWdodCAhPSAwKQorCSAgICAgIHBfeSA9IHBfeS0+bV9wX3JpZ2h0OworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHJldHVybjsKKwkgIH0KKworCU5vZGVfUG9pbnRlciBwX3kgPSBtX3BfbmQtPm1fcF9wYXJlbnQ7CisJd2hpbGUgKG1fcF9uZCA9PSBwX3ktPm1fcF9sZWZ0KQorCSAgeworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHBfeSA9IHBfeS0+bV9wX3BhcmVudDsKKwkgIH0KKwlpZiAobV9wX25kLT5tX3BfbGVmdCAhPSBwX3kpCisJICBtX3BfbmQgPSBwX3k7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICBOb2RlX1BvaW50ZXIgbV9wX25kOworICAgIH07CisKKyAgICAvLyBJdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1BvaW50ZXIsCisJICAgICB0eXBlbmFtZSBWYWx1ZV9UeXBlLAorCSAgICAgdHlwZW5hbWUgUG9pbnRlciwKKwkgICAgIHR5cGVuYW1lIENvbnN0X1BvaW50ZXIsCisJICAgICB0eXBlbmFtZSBSZWZlcmVuY2UsCisJICAgICB0eXBlbmFtZSBDb25zdF9SZWZlcmVuY2UsCisJICAgICBib29sIElzX0ZvcndhcmRfSXRlcmF0b3IsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgYmluX3NlYXJjaF90cmVlX2l0XyA6IAorICAgICAgcHVibGljIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMKKworICAgIHsKKworICAgIHB1YmxpYzoKKworICAgICAgaW5saW5lCisgICAgICBiaW5fc2VhcmNoX3RyZWVfaXRfKGNvbnN0IE5vZGVfUG9pbnRlciBwX25kID0gMCkgCisgICAgICA6IFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMoKE5vZGVfUG9pbnRlcilwX25kKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgYmluX3NlYXJjaF90cmVlX2l0Xyhjb25zdCBQQl9EU19UUkVFX09ESVJfSVRfQ19ERUMmIG90aGVyKSAKKyAgICAgIDogUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQyhvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19UUkVFX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBQQl9EU19UUkVFX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIHsKKwliYXNlX2l0X3R5cGU6Om1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZQorICAgICAgUEJfRFNfVFJFRV9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfVFJFRV9PRElSX0lUX0NfREVDJiBvdGhlcikKKyAgICAgIHsKKwliYXNlX2l0X3R5cGU6Om1fcF9uZCA9IG90aGVyLm1fcF9uZDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDOjpwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV9pdF90eXBlOjptX3BfbmQgIT0gMCk7CisJcmV0dXJuICZiYXNlX2l0X3R5cGU6Om1fcF9uZC0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUM6OnJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV9pdF90eXBlOjptX3BfbmQgIT0gMCk7CisJcmV0dXJuIGJhc2VfaXRfdHlwZTo6bV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfVFJFRV9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDOjogb3BlcmF0b3IrKygpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfSVRfQ19ERUMKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCVBCX0RTX1RSRUVfSVRfQ19ERUMgcmV0X2l0KGJhc2VfaXRfdHlwZTo6bV9wX25kKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX1RSRUVfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJUEJfRFNfVFJFRV9DT05TVF9JVF9DX0RFQzo6IG9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19UUkVFX0lUX0NfREVDCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlQQl9EU19UUkVFX0lUX0NfREVDIHJldF9pdChiYXNlX2l0X3R5cGU6Om1fcF9uZCk7CisJb3BlcmF0b3ItLSgpOworCXJldHVybiByZXRfaXQ7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIFBCX0RTX1RSRUVfQ09OU1RfSVRfQ19ERUMgYmFzZV9pdF90eXBlOworICAgIH07CisKKyN1bmRlZiBQQl9EU19UUkVFX0NPTlNUX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfVFJFRV9DT05TVF9PRElSX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfVFJFRV9JVF9DX0RFQworI3VuZGVmIFBCX0RTX1RSRUVfT0RJUl9JVF9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2YzMDdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworQ21wX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jbXBfZm4oKQoreworICByZXR1cm4gKCp0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkgY29uc3QKK3sKKyAgcmV0dXJuICgqdGhpcyk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JfZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZGQxZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTIwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByX2VyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPiAwKTsKKyAgLS1tX3NpemU7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShlcmFzZV9leGlzdGluZyhQQl9EU19WMkYocF96LT5tX3ZhbHVlKSkpOworCisgIHBfei0+fm5vZGUoKTsKKworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF96LCAxKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgaWYgKG1fc2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IG1fcF9oZWFkLT5tX3BfcmlnaHQgPSBtX3BfaGVhZDsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobV9wX2hlYWQtPm1fcF9sZWZ0ID09IHBfeikKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX3opOworCisgICAgICArK2l0OworCisgICAgICBtX3BfaGVhZC0+bV9wX2xlZnQgPSBpdC5tX3BfbmQ7CisgICAgfQorICBlbHNlIGlmIChtX3BfaGVhZC0+bV9wX3JpZ2h0ID09IHBfeikKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX3opOworCisgICAgICAtLWl0OworCisgICAgICBtX3BfaGVhZC0+bV9wX3JpZ2h0ID0gaXQubV9wX25kOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCisKKyAgICBjbGVhcl9pbXAobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworCisgIG1fc2l6ZSA9IDA7CisKKyAgaW5pdGlhbGl6ZSgpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2xlYXIoKTspCisKKyAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGNsZWFyX2ltcChwX25kLT5tX3BfbGVmdCk7CisKKyAgY2xlYXJfaW1wKHBfbmQtPm1fcF9yaWdodCk7CisKKyAgcF9uZC0+fk5vZGUoKTsKKworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3JvdGF0ZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg5Y2E2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcm90YXRlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTU2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByb3RhdGVfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcHMgZm9yIHJvdGF0aW5nIG5vZGVzLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorcm90YXRlX2xlZnQobm9kZV9wb2ludGVyIHBfeCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfeSA9IHBfeC0+bV9wX3JpZ2h0OworCisgIHBfeC0+bV9wX3JpZ2h0ID0gcF95LT5tX3BfbGVmdDsKKworICBpZiAocF95LT5tX3BfbGVmdCAhPSAwKQorICAgIHBfeS0+bV9wX2xlZnQtPm1fcF9wYXJlbnQgPSBwX3g7CisKKyAgcF95LT5tX3BfcGFyZW50ID0gcF94LT5tX3BfcGFyZW50OworCisgIGlmIChwX3ggPT0gbV9wX2hlYWQtPm1fcF9wYXJlbnQpCisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3k7CisgIGVsc2UgaWYgKHBfeCA9PSBwX3gtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3k7CisgIGVsc2UKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeTsKKworICBwX3ktPm1fcF9sZWZ0ID0gcF94OworICBwX3gtPm1fcF9wYXJlbnQgPSBwX3k7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3kpOykKKworICAgIGFwcGx5X3VwZGF0ZShwX3gsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBhcHBseV91cGRhdGUocF94LT5tX3BfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cityb3RhdGVfcmlnaHQobm9kZV9wb2ludGVyIHBfeCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfeSA9IHBfeC0+bV9wX2xlZnQ7CisKKyAgcF94LT5tX3BfbGVmdCA9IHBfeS0+bV9wX3JpZ2h0OworCisgIGlmIChwX3ktPm1fcF9yaWdodCAhPSAwKQorICAgIHBfeS0+bV9wX3JpZ2h0LT5tX3BfcGFyZW50ID0gcF94OworCisgIHBfeS0+bV9wX3BhcmVudCA9IHBfeC0+bV9wX3BhcmVudDsKKworICBpZiAocF94ID09IG1fcF9oZWFkLT5tX3BfcGFyZW50KQorICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF95OworICBlbHNlIGlmIChwX3ggPT0gcF94LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQpCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQgPSBwX3k7CisgIGVsc2UKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF95OworCisgIHBfeS0+bV9wX3JpZ2h0ID0gcF94OworICBwX3gtPm1fcF9wYXJlbnQgPSBwX3k7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3kpOykKKworICAgIGFwcGx5X3VwZGF0ZShwX3gsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBhcHBseV91cGRhdGUocF94LT5tX3BfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cityb3RhdGVfcGFyZW50KG5vZGVfcG9pbnRlciBwX25kKQoreworICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworCisgIGlmIChwX25kID09IHBfcGFyZW50LT5tX3BfbGVmdCkKKyAgICByb3RhdGVfcmlnaHQocF9wYXJlbnQpOworICBlbHNlCisgICAgcm90YXRlX2xlZnQocF9wYXJlbnQpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX2xlZnQgPT0gcF9wYXJlbnQgfHwKKwkJICAgcF9uZC0+bV9wX3JpZ2h0ID09IHBfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithcHBseV91cGRhdGUobm9kZV9wb2ludGVyIC8qcF9uZCovLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIgLypwX3VwZGF0ZSovKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciBwX25kLCBOb2RlX1VwZGF0ZV8qICAvKnBfdXBkYXRlKi8pCit7CisgIG5vZGVfdXBkYXRlOjpvcGVyYXRvcigpKAorCQkJICAgbm9kZV9pdGVyYXRvcihwX25kKSwKKwkJCSAgIGNvbnN0X25vZGVfaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8bm9kZV9wb2ludGVyPigwKSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV90b190b3Aobm9kZV9wb2ludGVyIHBfbmQsIE5vZGVfVXBkYXRlXyogcF91cGRhdGUpCit7CisgIHdoaWxlIChwX25kICE9IG1fcF9oZWFkKQorICAgIHsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX25kLCBwX3VwZGF0ZSk7CisKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfdG9fdG9wKG5vZGVfcG9pbnRlciAvKnBfbmQqLywgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyIC8qcF91cGRhdGUqLykKK3sgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRjMzA4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE0NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgaWYgKG90aGVyLm1fc2l6ZSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGNvbnN0IGJvb2wgZ3JlYXRlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYobV9wX2hlYWQtPm1fcF9yaWdodC0+bV92YWx1ZSksIFBCX0RTX1YyRihvdGhlci5tX3BfaGVhZC0+bV9wX2xlZnQtPm1fdmFsdWUpKTsKKworICBjb25zdCBib29sIGxlc3NlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYob3RoZXIubV9wX2hlYWQtPm1fcF9yaWdodC0+bV92YWx1ZSksIFBCX0RTX1YyRihtX3BfaGVhZC0+bV9wX2xlZnQtPm1fdmFsdWUpKTsKKworICBpZiAoIWdyZWF0ZXIgJiYgIWxlc3NlcikKKyAgICBfX3Rocm93X2pvaW5fZXJyb3IoKTsKKworICBpZiAobGVzc2VyKQorICAgIHZhbHVlX3N3YXAob3RoZXIpOworCisgIG1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6am9pbihvdGhlcik7KQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fZmluaXNoKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgaW5pdGlhbGl6ZV9taW5fbWF4KCk7CisgIG90aGVyLmluaXRpYWxpemUoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0X3ByZXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgIG90aGVyLmNsZWFyKCk7CisKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihtX3BfaGVhZC0+bV9wX2xlZnQtPm1fdmFsdWUpKSkKKyAgICB7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmICghQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYobV9wX2hlYWQtPm1fcF9yaWdodC0+bV92YWx1ZSkpKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChtX3NpemUgPT0gMSkKKyAgICB7CisgICAgICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3BsaXQocl9rZXksKENtcF9GbiYgKSgqdGhpcyksIG90aGVyKTspCisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfZmluaXNoKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgb3RoZXIuaW5pdGlhbGl6ZV9taW5fbWF4KCk7CisgIG90aGVyLm1fc2l6ZSA9IHN0ZDo6ZGlzdGFuY2Uob3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCkpOworICBtX3NpemUgLT0gb3RoZXIubV9zaXplOworICBpbml0aWFsaXplX21pbl9tYXgoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjdXJzaXZlX2NvdW50KG5vZGVfcG9pbnRlciBwKSBjb25zdAoreworICBpZiAocCA9PSAwKQorICAgIHJldHVybiAwOworICByZXR1cm4gMSArIHJlY3Vyc2l2ZV9jb3VudChwLT5tX3BfbGVmdCkgKyByZWN1cnNpdmVfY291bnQocC0+bV9wX3JpZ2h0KTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjMzBjMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5fc2VhcmNoX3RyZWVfL3RyYWl0cy5ocHAKQEAgLTAsMCArMSwyNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKyNkZWZpbmUgUEJfRFNfQklOX1NFQVJDSF9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9wb2ludF9pdGVyYXRvcnMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9ub2RlX2l0ZXJhdG9ycy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBOb2RlLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBiaW5fc2VhcmNoX3RyZWVfdHJhaXRzCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlc190cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBBbGxvY2F0b3IsCisgICAgICBmYWxzZT4KKyAgICAgIHR5cGVfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBOb2RlIG5vZGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CisJdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwl0cnVlLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X3BvaW50X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfaXRfPAorCXR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UsCisJdHJ1ZSwKKwlBbGxvY2F0b3I+CisgICAgICBwb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgYmluX3NlYXJjaF90cmVlX2NvbnN0X2l0XzwKKwl0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlub2RlPjo6b3RoZXI6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnZhbHVlX3R5cGUsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnBvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3BvaW50ZXIsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OnJlZmVyZW5jZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcmVmZXJlbmNlLAorCWZhbHNlLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9pdF88CisJdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwlmYWxzZSwKKwlBbGxvY2F0b3I+CisgICAgICByZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3Rfbm9kZV9pdF88CisJTm9kZSwKKwljb25zdF9wb2ludF9pdGVyYXRvciwKKwlwb2ludF9pdGVyYXRvciwKKwlBbGxvY2F0b3I+CisgICAgICBjb25zdF9ub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfbm9kZV9pdF88CisJTm9kZSwKKwljb25zdF9wb2ludF9pdGVyYXRvciwKKwlwb2ludF9pdGVyYXRvciwKKwlBbGxvY2F0b3I+CisgICAgICBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBOb2RlX1VwZGF0ZTwKKwljb25zdF9ub2RlX2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCUFsbG9jYXRvcj4KKyAgICAgIG5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmCisgICAgICBfX2dudV9wYmRzOjpudWxsX3RyZWVfbm9kZV91cGRhdGU8CisJY29uc3Rfbm9kZV9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlBbGxvY2F0b3I+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBOb2RlLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBiaW5fc2VhcmNoX3RyZWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF9tYXBwZWRfdHlwZSwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgTm9kZSwKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVzX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfbWFwcGVkX3R5cGUsCisgICAgICBBbGxvY2F0b3IsCisgICAgICBmYWxzZT4KKyAgICAgIHR5cGVfdHJhaXRzOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBOb2RlIG5vZGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9pdF88CisJdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbm9kZT46Om90aGVyOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjp2YWx1ZV90eXBlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpwb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9wb2ludGVyLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpyZWZlcmVuY2UsCisJdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSwKKwl0cnVlLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X3BvaW50X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIGNvbnN0X3BvaW50X2l0ZXJhdG9yIHBvaW50X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5fc2VhcmNoX3RyZWVfY29uc3RfaXRfPAorCXR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6Y29uc3RfcG9pbnRlciwKKwl0eXBlbmFtZSB0eXBlX3RyYWl0czo6cmVmZXJlbmNlLAorCXR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9yZWZlcmVuY2UsCisJZmFsc2UsCisJQWxsb2NhdG9yPgorICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbl9zZWFyY2hfdHJlZV9jb25zdF9ub2RlX2l0XzwKKwlOb2RlLAorCWNvbnN0X3BvaW50X2l0ZXJhdG9yLAorCXBvaW50X2l0ZXJhdG9yLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3Rfbm9kZV9pdGVyYXRvciBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBOb2RlX1VwZGF0ZTwKKwljb25zdF9ub2RlX2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCUFsbG9jYXRvcj4KKyAgICAgIG5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmCisgICAgICBfX2dudV9wYmRzOjpudWxsX3RyZWVfbm9kZV91cGRhdGU8CisJY29uc3Rfbm9kZV9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlBbGxvY2F0b3I+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9iaW5hcnlfaGVhcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmNiYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2JpbmFyeV9oZWFwXy5ocHAKQEAgLTAsMCArMSwzNTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGJpbmFyeV9oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeSBoZWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX0hQUAorCisvKgorICogQmFzZWQgb24gQ0xSUy4KKyAqLworCisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X3ByZWQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3Jlc2l6ZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHA+CisjaWZkZWYgUEJfRFNfQklOQVJZX0hFQVBfVFJBQ0VfCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGJpbmFyeV9oZWFwXzxWYWx1ZV9UeXBlLCBDbXBfRm4sIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19FTlRSWV9DTVBfREVDIFwKKyAgICBlbnRyeV9jbXA8VmFsdWVfVHlwZSwgQ21wX0ZuLCBpc19zaW1wbGU8VmFsdWVfVHlwZT46OnZhbHVlLCBBbGxvY2F0b3I+Ojp0eXBlCisKKyNkZWZpbmUgUEJfRFNfUkVTSVpFX1BPTElDWV9ERUMJXAorICAgIF9fZ251X3BiZHM6OmRldGFpbDo6cmVzaXplX3BvbGljeTx0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZT4KKworICAgIC8qKgorICAgICAqIGNsYXNzIGRlc2NyaXB0aW9uID0gIkJhc2UgY2xhc3MgZm9yIHNvbWUgdHlwZXMgb2YgaDNhcCQiPgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCBjbGFzcyBDbXBfRm4sIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBiaW5hcnlfaGVhcF8gOiBwdWJsaWMgUEJfRFNfRU5UUllfQ01QX0RFQywKKwkJCSBwdWJsaWMgUEJfRFNfUkVTSVpFX1BPTElDWV9ERUMKKyAgICB7CisKKyAgICBwcml2YXRlOgorICAgICAgZW51bQorCXsKKwkgIHNpbXBsZV92YWx1ZSA9IGlzX3NpbXBsZTxWYWx1ZV9UeXBlPjo6dmFsdWUKKwl9OworCisgICAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGludCwgc2ltcGxlX3ZhbHVlPiBub190aHJvd19jb3BpZXNfdDsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJVmFsdWVfVHlwZT46Om90aGVyCisgICAgICB2YWx1ZV9hbGxvY2F0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9fY29uZGl0aW9uYWxfdHlwZTwKKwlzaW1wbGVfdmFsdWUsCisJVmFsdWVfVHlwZSwKKwl0eXBlbmFtZSB2YWx1ZV9hbGxvY2F0b3I6OnBvaW50ZXI+OjpfX3R5cGUKKyAgICAgIGVudHJ5OworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwllbnRyeT46Om90aGVyCisgICAgICBlbnRyeV9hbGxvY2F0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfRU5UUllfQ01QX0RFQyBlbnRyeV9jbXA7CisKKyAgICAgIHR5cGVkZWYgUEJfRFNfUkVTSVpFX1BPTElDWV9ERUMgcmVzaXplX3BvbGljeTsKKworICAgICAgdHlwZWRlZgorICAgICAgY29uZF9kZWFsdG9yPAorCVZhbHVlX1R5cGUsCisJQWxsb2NhdG9yPgorICAgICAgY29uZF9kZWFsdG9yX3Q7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9wb2ludF9pdGVyYXRvcl88CisJdmFsdWVfdHlwZSwKKwllbnRyeSwKKwlzaW1wbGVfdmFsdWUsCisJQWxsb2NhdG9yPgorICAgICAgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRfaXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGJpbmFyeV9oZWFwX2NvbnN0X2l0ZXJhdG9yXzwKKwl2YWx1ZV90eXBlLAorCWVudHJ5LAorCXNpbXBsZV92YWx1ZSwKKwlBbGxvY2F0b3I+CisgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBDbXBfRm4gY21wX2ZuOworCisgICAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKworICAgIHB1YmxpYzoKKworICAgICAgYmluYXJ5X2hlYXBfKCk7CisKKyAgICAgIGJpbmFyeV9oZWFwXyhjb25zdCBDbXBfRm4mIHJfY21wX2ZuKTsKKworICAgICAgYmluYXJ5X2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgfmJpbmFyeV9oZWFwXygpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBDbXBfRm4mIAorICAgICAgZ2V0X2NtcF9mbigpOworCisgICAgICBjb25zdCBDbXBfRm4mIAorICAgICAgZ2V0X2NtcF9mbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHB1c2goY29uc3RfcmVmZXJlbmNlIHJfdmFsKTsKKworICAgICAgdm9pZAorICAgICAgbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgdG9wKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGVyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQgcHJlZCk7CisKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgZXJhc2VfYXQoZW50cnlfcG9pbnRlciBhX2VudHJpZXMsIHNpemVfdHlwZSBzaXplLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBlcmFzZV9hdChlbnRyeV9wb2ludGVyIGFfZW50cmllcywgc2l6ZV90eXBlIHNpemUsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgdm9pZAorICAgICAgc3BsaXQoUHJlZCBwcmVkLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KTsKKworICAgIHByaXZhdGU6CisKKyAgICAgIHZvaWQKKyAgICAgIHZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluc2VydF92YWx1ZShjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5zZXJ0X3ZhbHVlKHZhbHVlX3R5cGUgdmFsLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5zZXJ0X2VudHJ5KGVudHJ5IGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVzaXplX2Zvcl9pbnNlcnRfaWZfbmVlZGVkKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwX3ZhbHVlX2ltcChlbnRyeV9wb2ludGVyIHBfZSwgdmFsdWVfdHlwZSBuZXdfdmFsLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcF92YWx1ZV9pbXAoZW50cnlfcG9pbnRlciBwX2UsIGNvbnN0X3JlZmVyZW5jZSByX25ld192YWwsIGZhbHNlX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBmaXgoZW50cnlfcG9pbnRlciBwX2UpOworCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3BfaW1wKHRydWVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcF9pbXAoZmFsc2VfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBsZWZ0X2NoaWxkKHNpemVfdHlwZSBpKTsKKworICAgICAgaW5saW5lIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIHJpZ2h0X2NoaWxkKHNpemVfdHlwZSBpKTsKKworICAgICAgaW5saW5lIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIHBhcmVudChzaXplX3R5cGUgaSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZXNpemVfZm9yX2VyYXNlX2lmX25lZWRlZCgpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgc2l6ZV90eXBlCisgICAgICBwYXJ0aXRpb24oUHJlZCBwcmVkKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2VfZW50cnkoY29uc3QgZW50cnkmIHJfZSwgZmFsc2VfdHlwZSkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlX2VudHJ5KGNvbnN0IGVudHJ5JiByX2UsIHRydWVfdHlwZSkgY29uc3Q7CisjZW5kaWYgCisKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGVudHJ5X2FsbG9jYXRvciBzX2VudHJ5X2FsbG9jYXRvcjsKKworICAgICAgc3RhdGljIHZhbHVlX2FsbG9jYXRvciBzX3ZhbHVlX2FsbG9jYXRvcjsKKworICAgICAgc3RhdGljIG5vX3Rocm93X2NvcGllc190IHNfbm9fdGhyb3dfY29waWVzX2luZDsKKworICAgICAgc2l6ZV90eXBlIG1fc2l6ZTsKKworICAgICAgc2l6ZV90eXBlIG1fYWN0dWFsX3NpemU7CisKKyAgICAgIGVudHJ5X3BvaW50ZXIgbV9hX2VudHJpZXM7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19FTlRSWV9DTVBfREVDCisjdW5kZWYgUEJfRFNfUkVTSVpFX1BPTElDWV9ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg2ZjVlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIHRhYmxlJ3MgY29uc3QgZmluZCBhbmQgaW5zZXJ0CisgKiAgICAgbWV0aG9kcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTkFSWV9IRUFQX0NPTlNUX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19CSU5BUllfSEVBUF9DT05TVF9JVEVSQVRPUl9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfPFZhbHVlX1R5cGUsIEVudHJ5LCBTaW1wbGUsIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBiaW5hcnlfaGVhcF9jb25zdF9wb2ludF9pdGVyYXRvcl88VmFsdWVfVHlwZSwgRW50cnksIFNpbXBsZSwgQWxsb2NhdG9yPgorCisgICAgLy8gQ29uc3QgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLAorCSAgICAgdHlwZW5hbWUgRW50cnksCisJICAgICBib29sIFNpbXBsZSwKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8gOiBwdWJsaWMgUEJfRFNfQkFTRV9DX0RFQworICAgIHsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFBCX0RTX0JBU0VfQ19ERUM6OmVudHJ5X3BvaW50ZXIgZW50cnlfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKworICAgICAgLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vIERpZmZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICAvLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIHBvaW50ZXI7CisKKyAgICAgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworCisgICAgICAvLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfKGVudHJ5X3BvaW50ZXIgcF9lKSA6IGJhc2VfdHlwZShwX2UpCisgICAgICB7IH0KKworICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfY29uc3RfaXRlcmF0b3JfKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9pdGVyYXRvcl8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6IGJhc2VfdHlwZShvdGhlcikKKyAgICAgIHsgfQorCisgICAgICAvLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gYmFzZV90eXBlOjptX3BfZSA9PSBvdGhlci5tX3BfZTsKKyAgICAgIH0KKworICAgICAgLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeworCXJldHVybiBiYXNlX3R5cGU6Om1fcF9lICE9IG90aGVyLm1fcF9lOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfQ0xBU1NfQ19ERUMmIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX2UgIT0gMCk7CisJaW5jKCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfQ0xBU1NfQ19ERUMKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCVBCX0RTX0NMQVNTX0NfREVDIHJldF9pdChiYXNlX3R5cGU6Om1fcF9lKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBpbmMoKQorICAgICAgeyArK2Jhc2VfdHlwZTo6bV9wX2U7IH0KKyAgICB9OworCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19CQVNFX0NfREVDCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzVlODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDE0NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGUncyBjb25zdCBmaW5kIGFuZCBpbnNlcnQKKyAqICAgICBtZXRob2RzLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfQ09OU1RfRklORF9JVEVSQVRPUl9IUFAKKyNkZWZpbmUgUEJfRFNfQklOQVJZX0hFQVBfQ09OU1RfRklORF9JVEVSQVRPUl9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICAvLyBDb25zdCBwb2ludC10eXBlIGl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIEVudHJ5LCBib29sIFNpbXBsZSwgCisJICAgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgY2xhc3MgYmluYXJ5X2hlYXBfY29uc3RfcG9pbnRfaXRlcmF0b3JfCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8RW50cnk+OjpvdGhlcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICAvLyBEaWZmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgLy8gSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIC8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHBvaW50ZXI7CisKKyAgICAgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8dmFsdWVfdHlwZT46Om90aGVyOjpyZWZlcmVuY2UKKyAgICAgIHJlZmVyZW5jZTsKKworICAgICAgLy8gSXRlcmF0b3IncyBjb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPHZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGlubGluZQorICAgICAgYmluYXJ5X2hlYXBfY29uc3RfcG9pbnRfaXRlcmF0b3JfKGVudHJ5X3BvaW50ZXIgcF9lKSA6IG1fcF9lKHBfZSkKKyAgICAgIHsgfQorCisgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9wb2ludF9pdGVyYXRvcl8oKSA6IG1fcF9lKDApIHsgfQorCisgICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAgaW5saW5lCisgICAgICBiaW5hcnlfaGVhcF9jb25zdF9wb2ludF9pdGVyYXRvcl8oY29uc3QgYmluYXJ5X2hlYXBfY29uc3RfcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikKKyAgICAgIDogbV9wX2Uob3RoZXIubV9wX2UpCisgICAgICB7IH0KKworICAgICAgLy8gQWNjZXNzLgorICAgICAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfZSAhPSAwKTsKKwlyZXR1cm4gdG9fcHRyKGludGVncmFsX2NvbnN0YW50PGludCwgU2ltcGxlPigpKTsKKyAgICAgIH0KKworICAgICAgLy8gQWNjZXNzLgorICAgICAgaW5saW5lIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX2UgIT0gMCk7CisJcmV0dXJuICp0b19wdHIoaW50ZWdyYWxfY29uc3RhbnQ8aW50LCBTaW1wbGU+KCkpOworICAgICAgfQorCisgICAgICAvLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGJpbmFyeV9oZWFwX2NvbnN0X3BvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3BfZSA9PSBvdGhlci5tX3BfZTsgfQorCisgICAgICAvLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBiaW5hcnlfaGVhcF9jb25zdF9wb2ludF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX2UgIT0gb3RoZXIubV9wX2U7IH0KKworICAgIHByaXZhdGU6CisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRlcgorICAgICAgdG9fcHRyKHRydWVfdHlwZSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9lOyB9CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludGVyCisgICAgICB0b19wdHIoZmFsc2VfdHlwZSkgY29uc3QKKyAgICAgIHsgcmV0dXJuICptX3BfZTsgfQorCisgICAgcHVibGljOgorICAgICAgZW50cnlfcG9pbnRlciBtX3BfZTsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3YTAyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluYXJ5X2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbnRyeV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6dmFsdWVfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c192YWx1ZV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9fdGhyb3dfY29waWVzX3QKK1BCX0RTX0NMQVNTX0NfREVDOjpzX25vX3Rocm93X2NvcGllc19pbmQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgeworICAgICAgaW5zZXJ0X3ZhbHVlKCpmaXJzdF9pdCwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKyAgICAgICsrZmlyc3RfaXQ7CisgICAgfQorCisgIHN0ZDo6bWFrZV9oZWFwKG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwgc3RhdGljX2Nhc3Q8ZW50cnlfY21wJiA+KCp0aGlzKSk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5hcnlfaGVhcF8oKSA6CisgIG1fc2l6ZSgwKSwKKyAgbV9hY3R1YWxfc2l6ZShyZXNpemVfcG9saWN5OjptaW5fc2l6ZSksCisgIG1fYV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fYWN0dWFsX3NpemUpKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JpbmFyeV9oZWFwXyhjb25zdCBDbXBfRm4mIHJfY21wX2ZuKSA6CisgIGVudHJ5X2NtcChyX2NtcF9mbiksCisgIG1fc2l6ZSgwKSwKKyAgbV9hY3R1YWxfc2l6ZShyZXNpemVfcG9saWN5OjptaW5fc2l6ZSksCisgIG1fYV9lbnRyaWVzKHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG1fYWN0dWFsX3NpemUpKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JpbmFyeV9oZWFwXyhjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyAgZW50cnlfY21wKG90aGVyKSwKKyAgcmVzaXplX3BvbGljeShvdGhlciksCisgIG1fc2l6ZSgwKSwKKyAgbV9hY3R1YWxfc2l6ZShvdGhlci5tX2FjdHVhbF9zaXplKSwKKyAgbV9hX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9hY3R1YWxfc2l6ZSkpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX2VudHJpZXMgIT0gb3RoZXIubV9hX2VudHJpZXMpOworCisgIGNvbnN0X2l0ZXJhdG9yIGZpcnN0X2l0ID0gb3RoZXIuYmVnaW4oKTsKKyAgY29uc3RfaXRlcmF0b3IgbGFzdF9pdCA9IG90aGVyLmVuZCgpOworCisgIF9fdHJ5CisgICAgeworICAgICAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgICAgIHsKKwkgIGluc2VydF92YWx1ZSgqZmlyc3RfaXQsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisJICArK2ZpcnN0X2l0OworICAgICAgICB9CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKQorCWVyYXNlX2F0KG1fYV9lbnRyaWVzLCBpLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgICAgICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX2VudHJpZXMgIT0gb3RoZXIubV9hX2VudHJpZXMpOworCisgIHZhbHVlX3N3YXAob3RoZXIpOworICBzdGQ6OnN3YXAoKGVudHJ5X2NtcCYgKSgqdGhpcyksIChlbnRyeV9jbXAmIClvdGhlcik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBzdGQ6OnN3YXAobV9hX2VudHJpZXMsIG90aGVyLm1fYV9lbnRyaWVzKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKKyAgc3RkOjpzd2FwKG1fYWN0dWFsX3NpemUsIG90aGVyLm1fYWN0dWFsX3NpemUpOworICBzdGF0aWNfY2FzdDxyZXNpemVfcG9saWN5Kj4odGhpcyktPnN3YXAob3RoZXIpOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorfmJpbmFyeV9oZWFwXygpCit7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisgICAgZXJhc2VfYXQobV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZlY2ZkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoKSBjb25zdAoreworI2lmZGVmIFBCX0RTX1JFR1JFU1NJT04KKyAgc19lbnRyeV9hbGxvY2F0b3IuY2hlY2tfYWxsb2NhdGVkKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyNlbmRpZiAKKworICByZXNpemVfcG9saWN5Ojphc3NlcnRfdmFsaWQoKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA8PSBtX2FjdHVhbF9zaXplKTsKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX3NpemU7ICsraSkKKyAgICB7CisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorICAgICAgc192YWx1ZV9hbGxvY2F0b3IuY2hlY2tfYWxsb2NhdGVkKG1fYV9lbnRyaWVzW2ldLCAxKTsKKyNlbmRpZiAKKworICAgICAgaWYgKGxlZnRfY2hpbGQoaSkgPCBtX3NpemUpCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbnRyeV9jbXA6Om9wZXJhdG9yKCkobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW2xlZnRfY2hpbGQoaSldKSk7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwYXJlbnQobGVmdF9jaGlsZChpKSkgPT0gaSk7CisKKyAgICAgIGlmIChyaWdodF9jaGlsZChpKSA8IG1fc2l6ZSkKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbcmlnaHRfY2hpbGQoaSldKSk7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwYXJlbnQocmlnaHRfY2hpbGQoaSkpID09IGkpOworICAgIH0KK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9jbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTliNWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X2NtcC5ocHAKQEAgLTAsMCArMSw5MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZW50cnlfY21wLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9DTVBfSFBQCisjZGVmaW5lIFBCX0RTX0JJTkFSWV9IRUFQX0VOVFJZX0NNUF9IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgYm9vbCBOb19UaHJvdywKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgZW50cnlfY21wCisgICAgeworICAgICAgdHlwZWRlZiBDbXBfRm4gdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IGVudHJ5X2NtcDwKKyAgICAgIFZhbHVlX1R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBmYWxzZSwKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBWYWx1ZV9UeXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGVudHJ5OworCisgICAgICBzdHJ1Y3QgdHlwZSA6IHB1YmxpYyBDbXBfRm4KKyAgICAgIHsKKyAgICAgIHB1YmxpYzoKKwlpbmxpbmUKKwl0eXBlKCkKKwl7IH0KKworCWlubGluZQorCXR5cGUoY29uc3QgQ21wX0ZuJiBvdGhlcikgOiBDbXBfRm4ob3RoZXIpCisJeyB9CisKKwlpbmxpbmUgYm9vbAorCW9wZXJhdG9yKCkoZW50cnkgcF9saHMsICBlbnRyeSBwX3JocykgY29uc3QKKwl7CisJICByZXR1cm4gQ21wX0ZuOjpvcGVyYXRvcigpKCpwX2xocywgKiBwX3Jocyk7CisJfQorICAgICAgfTsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9DTVBfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2VudHJ5X3ByZWQuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9wcmVkLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODU1MjllCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lbnRyeV9wcmVkLmhwcApAQCAtMCwwICsxLDkzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlbnRyeV9wcmVkLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9QUkVEX0hQUAorI2RlZmluZSBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9QUkVEX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsCisJICAgICBjbGFzcyBQcmVkLAorCSAgICAgYm9vbCBOb19UaHJvdywKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgZW50cnlfcHJlZAorICAgIHsKKyAgICAgIHR5cGVkZWYgUHJlZCB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCBjbGFzcyBQcmVkLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IGVudHJ5X3ByZWQ8CisgICAgICBWYWx1ZV9UeXBlLAorICAgICAgUHJlZCwKKyAgICAgIGZhbHNlLAorICAgICAgQWxsb2NhdG9yPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIFZhbHVlX1R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgZW50cnk7CisKKyAgICAgIHN0cnVjdCB0eXBlIDogcHVibGljIFByZWQKKyAgICAgIHsKKyAgICAgIHB1YmxpYzoKKwlpbmxpbmUKKwl0eXBlKCkKKwl7IH0KKworCWlubGluZQorCXR5cGUoY29uc3QgUHJlZCYgb3RoZXIpIDogUHJlZChvdGhlcikKKwl7IH0KKworCWlubGluZSBib29sCisJb3BlcmF0b3IoKShlbnRyeSBwX3YpIGNvbnN0CisJeworCSAgcmV0dXJuIFByZWQ6Om9wZXJhdG9yKCkoKnBfdik7CisJfQorICAgICAgfTsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19CSU5BUllfSEVBUF9FTlRSWV9QUkVEX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0MjY1MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyNDIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX3NpemU7ICsraSkKKyAgICBlcmFzZV9hdChtX2FfZW50cmllcywgaSwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBhY3R1YWxfc2l6ZSA9IHJlc2l6ZV9wb2xpY3k6OmdldF9uZXdfc2l6ZV9mb3JfYXJiaXRyYXJ5KDApOworCisgICAgICBlbnRyeV9wb2ludGVyIGFfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKGFjdHVhbF9zaXplKTsKKworICAgICAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShhY3R1YWxfc2l6ZSk7CisKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9hX2VudHJpZXMsIG1fYWN0dWFsX3NpemUpOworCisgICAgICBtX2FjdHVhbF9zaXplID0gYWN0dWFsX3NpemU7CisKKyAgICAgIG1fYV9lbnRyaWVzID0gYV9lbnRyaWVzOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9CisKKyAgbV9zaXplID0gMDsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2F0KGVudHJ5X3BvaW50ZXIgYV9lbnRyaWVzLCBzaXplX3R5cGUgaSwgZmFsc2VfdHlwZSkKK3sKKyAgYV9lbnRyaWVzW2ldLT5+dmFsdWVfdHlwZSgpOworICBzX3ZhbHVlX2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfZW50cmllc1tpXSwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9hdChlbnRyeV9wb2ludGVyLCBzaXplX3R5cGUsIHRydWVfdHlwZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVtcHR5KCkpOworCisgIGVyYXNlX2F0KG1fYV9lbnRyaWVzLCAwLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgIHN0ZDo6cG9wX2hlYXAobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbV9zaXplLAorCQlzdGF0aWNfY2FzdDxlbnRyeV9jbXAmID4oKnRoaXMpKTsKKworICByZXNpemVfZm9yX2VyYXNlX2lmX25lZWRlZCgpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3NpemUgPiAwKTsKKyAgLS1tX3NpemU7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKworICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X3ByZWQ8dmFsdWVfdHlwZSwgUHJlZCwgc2ltcGxlX3ZhbHVlLCBBbGxvY2F0b3I+Ojp0eXBlCisgICAgcHJlZF90OworCisgIGNvbnN0IHNpemVfdHlwZSBsZWZ0ID0gcGFydGl0aW9uKHByZWRfdChwcmVkKSk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+PSBsZWZ0KTsKKworICBjb25zdCBzaXplX3R5cGUgZXJzZCA9IG1fc2l6ZSAtIGxlZnQ7CisKKyAgZm9yIChzaXplX3R5cGUgaSA9IGxlZnQ7IGkgPCBtX3NpemU7ICsraSkKKyAgICBlcmFzZV9hdChtX2FfZW50cmllcywgaSwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBhY3R1YWxfc2l6ZSA9CisJcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkobGVmdCk7CisKKyAgICAgIGVudHJ5X3BvaW50ZXIgYV9lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUoYWN0dWFsX3NpemUpOworCisgICAgICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbGVmdCwgYV9lbnRyaWVzKTsKKworICAgICAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisKKyAgICAgIG1fYWN0dWFsX3NpemUgPSBhY3R1YWxfc2l6ZTsKKworICAgICAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShtX2FjdHVhbF9zaXplKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsgfTsKKworICBtX3NpemUgPSBsZWZ0OworCisgIHN0ZDo6bWFrZV9oZWFwKG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwKKwkJIHN0YXRpY19jYXN0PGVudHJ5X2NtcCYgPigqdGhpcykpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgIHJldHVybiBlcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbXB0eSgpKTsKKworICBjb25zdCBzaXplX3R5cGUgZml4X3BvcyA9IGl0Lm1fcF9lIC0gbV9hX2VudHJpZXM7CisKKyAgc3RkOjpzd2FwKCppdC5tX3BfZSwgbV9hX2VudHJpZXNbbV9zaXplIC0gMV0pOworCisgIGVyYXNlX2F0KG1fYV9lbnRyaWVzLCBtX3NpemUgLSAxLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgIHJlc2l6ZV9mb3JfZXJhc2VfaWZfbmVlZGVkKCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoZml4X3BvcyA8PSBtX3NpemUpOworCisgIGlmIChmaXhfcG9zICE9IG1fc2l6ZSkKKyAgICBmaXgobV9hX2VudHJpZXMgKyBmaXhfcG9zKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfZm9yX2VyYXNlX2lmX25lZWRlZCgpCit7CisgIGlmICghcmVzaXplX3BvbGljeTo6cmVzaXplX25lZWRlZF9mb3Jfc2hyaW5rKG1fc2l6ZSkpCisgICAgcmV0dXJuOworCisgIF9fdHJ5CisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG5ld19hY3R1YWxfc2l6ZSA9CisJcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9zaHJpbmsoKTsKKworICAgICAgZW50cnlfcG9pbnRlciBhX25ld19lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X2FjdHVhbF9zaXplKTsKKworICAgICAgcmVzaXplX3BvbGljeTo6bm90aWZ5X3Nocmlua19yZXNpemUoKTsKKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAgICAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSAtIDEsIGFfbmV3X2VudHJpZXMpOworCisgICAgICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKworICAgICAgbV9hY3R1YWxfc2l6ZSA9IG5ld19hY3R1YWxfc2l6ZTsKKworICAgICAgbV9hX2VudHJpZXMgPSBhX25ld19lbnRyaWVzOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFydGl0aW9uKFByZWQgcHJlZCkKK3sKKyAgc2l6ZV90eXBlIGxlZnQgPSAwOworICBzaXplX3R5cGUgcmlnaHQgPSBtX3NpemUgLSAxOworCisgIHdoaWxlIChyaWdodCArIDEgIT0gbGVmdCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobGVmdCA8PSBtX3NpemUpOworCisgICAgICBpZiAoIXByZWQobV9hX2VudHJpZXNbbGVmdF0pKQorCSsrbGVmdDsKKyAgICAgIGVsc2UgaWYgKHByZWQobV9hX2VudHJpZXNbcmlnaHRdKSkKKwktLXJpZ2h0OworICAgICAgZWxzZQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsZWZ0IDwgcmlnaHQpOworCisJICBzdGQ6OnN3YXAobV9hX2VudHJpZXNbbGVmdF0sIG1fYV9lbnRyaWVzW3JpZ2h0XSk7CisKKwkgICsrbGVmdDsKKwkgIC0tcmlnaHQ7CisJfQorICAgIH0KKworICByZXR1cm4gbGVmdDsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vZmluZF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQ0YThjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsOTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wKCkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbXB0eSgpKTsKKworICByZXR1cm4gdG9wX2ltcChzX25vX3Rocm93X2NvcGllc19pbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcF9pbXAodHJ1ZV90eXBlKSBjb25zdAoreworICByZXR1cm4qIG1fYV9lbnRyaWVzOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcF9pbXAoZmFsc2VfdHlwZSkgY29uc3QKK3sKKyAgcmV0dXJuKiogbV9hX2VudHJpZXM7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdF9jaGlsZChzaXplX3R5cGUgaSkKK3sKKyAgcmV0dXJuIGkqICAyICsgMTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CityaWdodF9jaGlsZChzaXplX3R5cGUgaSkKK3sKKyAgcmV0dXJuIGkqICAyICsgMjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitwYXJlbnQoc2l6ZV90eXBlIGkpCit7CisgIHJldHVybiAoaSAtIDEpIC8gMjsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTI3OTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw2NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7CisgIHJldHVybiAobV9zaXplID09IDApOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreworICByZXR1cm4gKG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreworICByZXR1cm4gKHNfZW50cnlfYWxsb2NhdG9yLm1heF9zaXplKCkpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxM2EzY2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE4MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBpbnNlcnRfdmFsdWUocl92YWwsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisgIHN0ZDo6cHVzaF9oZWFwKG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwgCisJCSBzdGF0aWNfY2FzdDxlbnRyeV9jbXAmPigqdGhpcykpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKG1fYV9lbnRyaWVzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfdmFsdWUodmFsdWVfdHlwZSB2YWwsIHRydWVfdHlwZSkKK3sKKyAgcmVzaXplX2Zvcl9pbnNlcnRfaWZfbmVlZGVkKCk7CisKKyAgbV9hX2VudHJpZXNbbV9zaXplKytdID0gdmFsOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF92YWx1ZShjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCit7CisgIHJlc2l6ZV9mb3JfaW5zZXJ0X2lmX25lZWRlZCgpOworICBwb2ludGVyIHBfbmV3ID0gc192YWx1ZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgIGNvbmRfZGVhbHRvcl90IGNvbmQocF9uZXcpOworICBuZXcgKHBfbmV3KSB2YWx1ZV90eXBlKHJfdmFsKTsKKyAgY29uZC5zZXRfbm9fYWN0aW9uKCk7CisgIG1fYV9lbnRyaWVzW21fc2l6ZSsrXSA9IHBfbmV3OworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9lbnRyeShlbnRyeSBlKQoreworICByZXNpemVfZm9yX2luc2VydF9pZl9uZWVkZWQoKTsKKyAgbV9hX2VudHJpZXNbbV9zaXplKytdID0gZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfZm9yX2luc2VydF9pZl9uZWVkZWQoKQoreworICBpZiAoIXJlc2l6ZV9wb2xpY3k6OnJlc2l6ZV9uZWVkZWRfZm9yX2dyb3cobV9zaXplKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplIDwgbV9hY3R1YWxfc2l6ZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbnN0IHNpemVfdHlwZSBuZXdfYWN0dWFsX3NpemUgPSByZXNpemVfcG9saWN5OjpnZXRfbmV3X3NpemVfZm9yX2dyb3coKTsKKyAgZW50cnlfcG9pbnRlciBhX25ld19lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobmV3X2FjdHVhbF9zaXplKTsKKyAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2dyb3dfcmVzaXplKCk7CisgIHN0ZDo6Y29weShtX2FfZW50cmllcywgbV9hX2VudHJpZXMgKyBtX3NpemUsIGFfbmV3X2VudHJpZXMpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyAgbV9hY3R1YWxfc2l6ZSA9IG5ld19hY3R1YWxfc2l6ZTsKKyAgbV9hX2VudHJpZXMgPSBhX25ld19lbnRyaWVzOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgc3dhcF92YWx1ZV9pbXAoaXQubV9wX2UsIHJfbmV3X3ZhbCwgc19ub190aHJvd19jb3BpZXNfaW5kKTsKKyAgZml4KGl0Lm1fcF9lKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXgoZW50cnlfcG9pbnRlciBwX2UpCit7CisgIHNpemVfdHlwZSBpID0gcF9lIC0gbV9hX2VudHJpZXM7CisgIGlmIChpID4gMCAmJiBlbnRyeV9jbXA6Om9wZXJhdG9yKCkobV9hX2VudHJpZXNbcGFyZW50KGkpXSwgbV9hX2VudHJpZXNbaV0pKQorICAgIHsKKyAgICAgIHNpemVfdHlwZSBwYXJlbnRfaSA9IHBhcmVudChpKTsKKyAgICAgIHdoaWxlIChpID4gMCAKKwkgICAgICYmIGVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1twYXJlbnRfaV0sIG1fYV9lbnRyaWVzW2ldKSkKKyAgICAgICAgeworCSAgc3RkOjpzd2FwKG1fYV9lbnRyaWVzW2ldLCBtX2FfZW50cmllc1twYXJlbnRfaV0pOworCSAgaSA9IHBhcmVudF9pOworCSAgcGFyZW50X2kgPSBwYXJlbnQoaSk7CisgICAgICAgIH0KKworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICByZXR1cm47CisgICAgfQorCisgIHdoaWxlIChpIDwgbV9zaXplKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBsZWZ0X2NoaWxkX2kgPSBsZWZ0X2NoaWxkKGkpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIHJpZ2h0X2NoaWxkX2kgPSByaWdodF9jaGlsZChpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyaWdodF9jaGlsZF9pID4gbGVmdF9jaGlsZF9pKTsKKyAgICAgIGNvbnN0IGJvb2wgc21hbGxlcl90aGFuX2xlZnRfY2hpbGQgPSBsZWZ0X2NoaWxkX2kgPCBtX3NpemUgJiYgCisJZW50cnlfY21wOjpvcGVyYXRvcigpKG1fYV9lbnRyaWVzW2ldLCBtX2FfZW50cmllc1tsZWZ0X2NoaWxkX2ldKTsKKworICAgICAgY29uc3QgYm9vbCBzbWFsbGVyX3RoYW5fcmlnaHRfY2hpbGQgPSByaWdodF9jaGlsZF9pIDwgbV9zaXplICYmIAorCWVudHJ5X2NtcDo6b3BlcmF0b3IoKShtX2FfZW50cmllc1tpXSwgbV9hX2VudHJpZXNbcmlnaHRfY2hpbGRfaV0pOworCisgICAgICBjb25zdCBib29sIHN3YXBfd2l0aF9yX2NoaWxkID0gc21hbGxlcl90aGFuX3JpZ2h0X2NoaWxkICYmICghc21hbGxlcl90aGFuX2xlZnRfY2hpbGQgfHwgZW50cnlfY21wOjpvcGVyYXRvcigpKG1fYV9lbnRyaWVzW2xlZnRfY2hpbGRfaV0sIG1fYV9lbnRyaWVzW3JpZ2h0X2NoaWxkX2ldKSk7CisKKyAgICAgIGNvbnN0IGJvb2wgc3dhcF93aXRoX2xfY2hpbGQgPSAhc3dhcF93aXRoX3JfY2hpbGQgJiYgc21hbGxlcl90aGFuX2xlZnRfY2hpbGQ7CisKKyAgICAgIGlmIChzd2FwX3dpdGhfbF9jaGlsZCkKKyAgICAgICAgeworCSAgc3RkOjpzd2FwKG1fYV9lbnRyaWVzW2ldLCBtX2FfZW50cmllc1tsZWZ0X2NoaWxkX2ldKTsKKwkgIGkgPSBsZWZ0X2NoaWxkX2k7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHN3YXBfd2l0aF9yX2NoaWxkKQorICAgICAgICB7CisJICBzdGQ6OnN3YXAobV9hX2VudHJpZXNbaV0sIG1fYV9lbnRyaWVzW3JpZ2h0X2NoaWxkX2ldKTsKKwkgIGkgPSByaWdodF9jaGlsZF9pOworICAgICAgICB9CisgICAgICBlbHNlCisJaSA9IG1fc2l6ZTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcF92YWx1ZV9pbXAoZW50cnlfcG9pbnRlciBwX2UsIHZhbHVlX3R5cGUgbmV3X3ZhbCwgdHJ1ZV90eXBlKQoreworICAqIHBfZSA9IG5ld192YWw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcF92YWx1ZV9pbXAoZW50cnlfcG9pbnRlciBwX2UsIGNvbnN0X3JlZmVyZW5jZSByX25ld192YWwsIGZhbHNlX3R5cGUpCit7CisgIHZhbHVlX3R5cGUgdG1wKHJfbmV3X3ZhbCk7CisgICgqcF9lKS0+c3dhcCh0bXApOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjBhNjRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBiaW5hcnlfaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICByZXR1cm4gKGl0ZXJhdG9yKG1fYV9lbnRyaWVzKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpIGNvbnN0Cit7CisgIHJldHVybiAoY29uc3RfaXRlcmF0b3IobV9hX2VudHJpZXMpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7CisgIHJldHVybiAoaXRlcmF0b3IobV9hX2VudHJpZXMgKyBtX3NpemUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpIGNvbnN0Cit7CisgIHJldHVybiAoY29uc3RfaXRlcmF0b3IobV9hX2VudHJpZXMgKyBtX3NpemUpKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTdiODkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkKK3sKKyAgcmV0dXJuICgqdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpIGNvbnN0Cit7CisgIHJldHVybiAoKnRoaXMpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3Jlc2l6ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9yZXNpemVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODhmYjNkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9yZXNpemVfcG9saWN5LmhwcApAQCAtMCwwICsxLDI1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmVzaXplX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbmFyeV9oZWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfQklOQVJZX0hFQVBfUkVTSVpFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfQklOQVJZX0hFQVBfUkVTSVpFX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyByZXNpemVfcG9saWN5PFNpemVfVHlwZT4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICBjbGFzcyByZXNpemVfcG9saWN5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgICAgZW51bQorCXsKKwkgIG1pbl9zaXplID0gMTYKKwl9OworCisgICAgcHVibGljOgorICAgICAgaW5saW5lCisgICAgICByZXNpemVfcG9saWN5KCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICByZXNpemVfbmVlZGVkX2Zvcl9ncm93KHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIHJlc2l6ZV9uZWVkZWRfZm9yX3NocmluayhzaXplX3R5cGUgc2l6ZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBncm93X25lZWRlZChzaXplX3R5cGUgc2l6ZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBzaHJpbmtfbmVlZGVkKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZ2V0X25ld19zaXplX2Zvcl9ncm93KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGdldF9uZXdfc2l6ZV9mb3Jfc2hyaW5rKCkgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZ2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgbm90aWZ5X2dyb3dfcmVzaXplKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBub3RpZnlfc2hyaW5rX3Jlc2l6ZSgpOworCisgICAgICB2b2lkCisgICAgICBub3RpZnlfYXJiaXRyYXJ5KHNpemVfdHlwZSBhY3R1YWxfc2l6ZSk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3ZhbGlkKCkgY29uc3Q7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICBwcml2YXRlOgorICAgICAgZW51bQorCXsKKwkgIHJhdGlvID0gOCwKKwkgIGZhY3RvciA9IDIKKwl9OworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBtX25leHRfc2hyaW5rX3NpemU7CisgICAgICBzaXplX3R5cGUgbV9uZXh0X2dyb3dfc2l6ZTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmVzaXplX3BvbGljeSgpIDoKKyAgICAgIG1fbmV4dF9zaHJpbmtfc2l6ZSgwKSwKKyAgICAgIG1fbmV4dF9ncm93X3NpemUobWluX3NpemUpCisgICAgeyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBzdGQ6OnN3YXAobV9uZXh0X3Nocmlua19zaXplLCBvdGhlci5tX25leHRfc2hyaW5rX3NpemUpOworICAgICAgc3RkOjpzd2FwKG1fbmV4dF9ncm93X3NpemUsIG90aGVyLm1fbmV4dF9ncm93X3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIGJvb2wKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmVzaXplX25lZWRlZF9mb3JfZ3JvdyhzaXplX3R5cGUgc2l6ZSkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoc2l6ZSA8PSBtX25leHRfZ3Jvd19zaXplKTsKKyAgICAgIHJldHVybiBzaXplID09IG1fbmV4dF9ncm93X3NpemU7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgYm9vbAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByZXNpemVfbmVlZGVkX2Zvcl9zaHJpbmsoc2l6ZV90eXBlIHNpemUpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHNpemUgPD0gbV9uZXh0X2dyb3dfc2l6ZSk7CisgICAgICByZXR1cm4gc2l6ZSA9PSBtX25leHRfc2hyaW5rX3NpemU7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfbmV3X3NpemVfZm9yX2dyb3coKSBjb25zdAorICAgIHsgcmV0dXJuIG1fbmV4dF9ncm93X3NpemUqICBmYWN0b3I7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X25ld19zaXplX2Zvcl9zaHJpbmsoKSBjb25zdAorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBoYWxmX3NpemUgPSBtX25leHRfZ3Jvd19zaXplIC8gZmFjdG9yOworICAgICAgcmV0dXJuIHN0ZDo6bWF4KHN0YXRpY19jYXN0PHNpemVfdHlwZT4obWluX3NpemUpLCBoYWxmX3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkoc2l6ZV90eXBlIHNpemUpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIHJldCA9IG1pbl9zaXplOworICAgICAgd2hpbGUgKHJldCA8IHNpemUpCisJcmV0ICo9IGZhY3RvcjsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBub3RpZnlfZ3Jvd19yZXNpemUoKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fbmV4dF9ncm93X3NpemUgPj0gbWluX3NpemUpOworICAgICAgbV9uZXh0X2dyb3dfc2l6ZSAqPSBmYWN0b3I7CisgICAgICBtX25leHRfc2hyaW5rX3NpemUgPSBtX25leHRfZ3Jvd19zaXplIC8gcmF0aW87CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG5vdGlmeV9zaHJpbmtfcmVzaXplKCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIG1fbmV4dF9zaHJpbmtfc2l6ZSAvPSBmYWN0b3I7CisgICAgICBpZiAobV9uZXh0X3Nocmlua19zaXplID09IDEpCisJbV9uZXh0X3Nocmlua19zaXplID0gMDsKKworICAgICAgbV9uZXh0X2dyb3dfc2l6ZSA9CisJc3RkOjptYXgobV9uZXh0X2dyb3dfc2l6ZSAvIGZhY3Rvciwgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihtaW5fc2l6ZSkpOworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBub3RpZnlfYXJiaXRyYXJ5KHNpemVfdHlwZSBhY3R1YWxfc2l6ZSkKKyAgICB7CisgICAgICBtX25leHRfZ3Jvd19zaXplID0gYWN0dWFsX3NpemU7CisgICAgICBtX25leHRfc2hyaW5rX3NpemUgPSBtX25leHRfZ3Jvd19zaXplIC8gcmF0aW87CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBhc3NlcnRfdmFsaWQoKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX25leHRfc2hyaW5rX3NpemUgPT0gMCB8fAorCQkgICAgICAgbV9uZXh0X3Nocmlua19zaXplKiAgcmF0aW8gPT0gbV9uZXh0X2dyb3dfc2l6ZSk7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX25leHRfZ3Jvd19zaXplID49IG1pbl9zaXplKTsKKyAgICB9CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgdHJhY2UoKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAic2hyaW5rID0gIiA8PCBtX25leHRfc2hyaW5rX3NpemUgPDwKKwkiIGdyb3cgPSAiIDw8IG1fbmV4dF9ncm93X3NpemUgPDwgc3RkOjplbmRsOworICAgIH0KKyNlbmRpZiAKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk3NDQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTczIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICB0eXBlZGVmCisgICAgdHlwZW5hbWUgZW50cnlfcHJlZDwKKyAgICB2YWx1ZV90eXBlLAorICAgIFByZWQsCisgICAgc2ltcGxlX3ZhbHVlLAorICAgIEFsbG9jYXRvcj46OnR5cGUKKyAgICBwcmVkX3Q7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGxlZnQgPSBwYXJ0aXRpb24ocHJlZF90KHByZWQpKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID49IGxlZnQpOworCisgIGNvbnN0IHNpemVfdHlwZSBlcnNkID0gbV9zaXplIC0gbGVmdDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID49IGVyc2QpOworCisgIGNvbnN0IHNpemVfdHlwZSBhY3R1YWxfc2l6ZSA9CisgICAgcmVzaXplX3BvbGljeTo6Z2V0X25ld19zaXplX2Zvcl9hcmJpdHJhcnkobGVmdCk7CisKKyAgY29uc3Qgc2l6ZV90eXBlIG90aGVyX2FjdHVhbF9zaXplID0KKyAgICBvdGhlci5nZXRfbmV3X3NpemVfZm9yX2FyYml0cmFyeShlcnNkKTsKKworICBlbnRyeV9wb2ludGVyIGFfZW50cmllcyA9IDA7CisgIGVudHJ5X3BvaW50ZXIgYV9vdGhlcl9lbnRyaWVzID0gMDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGFfZW50cmllcyA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKGFjdHVhbF9zaXplKTsKKworICAgICAgYV9vdGhlcl9lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUob3RoZXJfYWN0dWFsX3NpemUpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgaWYgKGFfZW50cmllcyAhPSAwKQorCXNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUoYV9lbnRyaWVzLCBhY3R1YWxfc2l6ZSk7CisKKyAgICAgIGlmIChhX290aGVyX2VudHJpZXMgIT0gMCkKKwlzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfb3RoZXJfZW50cmllcywgb3RoZXJfYWN0dWFsX3NpemUpOworCisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9OworCisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgb3RoZXIubV9zaXplOyArK2kpCisgICAgZXJhc2VfYXQob3RoZXIubV9hX2VudHJpZXMsIGksIHNfbm9fdGhyb3dfY29waWVzX2luZCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGFjdHVhbF9zaXplID49IGxlZnQpOworICBzdGQ6OmNvcHkobV9hX2VudHJpZXMsIG1fYV9lbnRyaWVzICsgbGVmdCwgYV9lbnRyaWVzKTsKKyAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzICsgbGVmdCwgbV9hX2VudHJpZXMgKyBtX3NpemUsIGFfb3RoZXJfZW50cmllcyk7CisKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2FfZW50cmllcywgbV9hY3R1YWxfc2l6ZSk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUob3RoZXIubV9hX2VudHJpZXMsIG90aGVyLm1fYWN0dWFsX3NpemUpOworCisgIG1fYWN0dWFsX3NpemUgPSBhY3R1YWxfc2l6ZTsKKyAgb3RoZXIubV9hY3R1YWxfc2l6ZSA9IG90aGVyX2FjdHVhbF9zaXplOworCisgIG1fc2l6ZSA9IGxlZnQ7CisgIG90aGVyLm1fc2l6ZSA9IGVyc2Q7CisKKyAgbV9hX2VudHJpZXMgPSBhX2VudHJpZXM7CisgIG90aGVyLm1fYV9lbnRyaWVzID0gYV9vdGhlcl9lbnRyaWVzOworCisgIHN0ZDo6bWFrZV9oZWFwKG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwgc3RhdGljX2Nhc3Q8ZW50cnlfY21wJiA+KCp0aGlzKSk7CisgIHN0ZDo6bWFrZV9oZWFwKG90aGVyLm1fYV9lbnRyaWVzLCBvdGhlci5tX2FfZW50cmllcyArIG90aGVyLm1fc2l6ZSwgc3RhdGljX2Nhc3Q8ZW50cnlfY21wJiA+KG90aGVyKSk7CisKKyAgcmVzaXplX3BvbGljeTo6bm90aWZ5X2FyYml0cmFyeShtX2FjdHVhbF9zaXplKTsKKyAgb3RoZXIubm90aWZ5X2FyYml0cmFyeShvdGhlci5tX2FjdHVhbF9zaXplKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKworICBjb25zdCBzaXplX3R5cGUgbGVuID0gbV9zaXplICsgb3RoZXIubV9zaXplOworICBjb25zdCBzaXplX3R5cGUgYWN0dWFsX3NpemUgPSByZXNpemVfcG9saWN5OjpnZXRfbmV3X3NpemVfZm9yX2FyYml0cmFyeShsZW4pOworCisgIGVudHJ5X3BvaW50ZXIgYV9lbnRyaWVzID0gMDsKKyAgZW50cnlfcG9pbnRlciBhX290aGVyX2VudHJpZXMgPSAwOworCisgIF9fdHJ5CisgICAgeworICAgICAgYV9lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUoYWN0dWFsX3NpemUpOworICAgICAgYV9vdGhlcl9lbnRyaWVzID0gc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUocmVzaXplX3BvbGljeTo6bWluX3NpemUpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgaWYgKGFfZW50cmllcyAhPSAwKQorCXNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUoYV9lbnRyaWVzLCBhY3R1YWxfc2l6ZSk7CisKKyAgICAgIGlmIChhX290aGVyX2VudHJpZXMgIT0gMCkKKwlzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKGFfb3RoZXJfZW50cmllcywgcmVzaXplX3BvbGljeTo6bWluX3NpemUpOworCisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgc3RkOjpjb3B5KG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwgYV9lbnRyaWVzKTsKKyAgc3RkOjpjb3B5KG90aGVyLm1fYV9lbnRyaWVzLCBvdGhlci5tX2FfZW50cmllcyArIG90aGVyLm1fc2l6ZSwgYV9lbnRyaWVzICsgbV9zaXplKTsKKworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fYV9lbnRyaWVzLCBtX2FjdHVhbF9zaXplKTsKKyAgbV9hX2VudHJpZXMgPSBhX2VudHJpZXM7CisgIG1fc2l6ZSA9IGxlbjsKKyAgbV9hY3R1YWxfc2l6ZSA9IGFjdHVhbF9zaXplOworCisgIHJlc2l6ZV9wb2xpY3k6Om5vdGlmeV9hcmJpdHJhcnkoYWN0dWFsX3NpemUpOworCisgIHN0ZDo6bWFrZV9oZWFwKG1fYV9lbnRyaWVzLCBtX2FfZW50cmllcyArIG1fc2l6ZSwgc3RhdGljX2Nhc3Q8ZW50cnlfY21wJiA+KCp0aGlzKSk7CisKKyAgc19lbnRyeV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShvdGhlci5tX2FfZW50cmllcywgb3RoZXIubV9hY3R1YWxfc2l6ZSk7CisgIG90aGVyLm1fYV9lbnRyaWVzID0gYV9vdGhlcl9lbnRyaWVzOworICBvdGhlci5tX3NpemUgPSAwOworICBvdGhlci5tX2FjdHVhbF9zaXplID0gcmVzaXplX3BvbGljeTo6bWluX3NpemU7CisKKyAgb3RoZXIubm90aWZ5X2FyYml0cmFyeShyZXNpemVfcG9saWN5OjptaW5fc2l6ZSk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmluYXJ5X2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmJkNjZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2JpbmFyeV9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmluYXJ5X2hlYXAuCisgKi8KKworI2lmZGVmIFBCX0RTX0JJTkFSWV9IRUFQX1RSQUNFXworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2UoKSBjb25zdAoreworICBzdGQ6OmNlcnIgPDwgdGhpcyA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpjZXJyIDw8IG1fYV9lbnRyaWVzIDw8IHN0ZDo6ZW5kbDsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fc2l6ZTsgKytpKQorICAgIHRyYWNlX2VudHJ5KG1fYV9lbnRyaWVzW2ldLCBzX25vX3Rocm93X2NvcGllc19pbmQpOworCisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpjZXJyIDw8ICJzaXplID0gIiA8PCBtX3NpemUgPDwgIiAiIDw8ICJhY3R1YWxfc2l6ZSA9ICIgPDwgbV9hY3R1YWxfc2l6ZSA8PCBzdGQ6OmVuZGw7CisKKyAgcmVzaXplX3BvbGljeTo6dHJhY2UoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX2VudHJ5KGNvbnN0IGVudHJ5JiByX2UsIGZhbHNlX3R5cGUpIGNvbnN0Cit7CisgIHN0ZDo6Y291dCA8PCByX2UgPDwgIiAiIDw8KiByX2UgPDwgc3RkOjplbmRsOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2VfZW50cnkoY29uc3QgZW50cnkmIHJfZSwgdHJ1ZV90eXBlKSBjb25zdAoreworICBzdGQ6OmNvdXQgPDwgcl9lIDw8IHN0ZDo6ZW5kbDsKK30KKworI2VuZGlmIC8vICNpZmRlZiBQQl9EU19CSU5BUllfSEVBUF9UUkFDRV8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9iaW5vbWlhbF9oZWFwXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vYmlub21pYWxfaGVhcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGQ2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vYmlub21pYWxfaGVhcF8uaHBwCkBAIC0wLDAgKzEsMTE2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwXy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJpbm9taWFsIGhlYXAuCisgKi8KKworLyoKKyAqIEJpbm9taWFsIGhlYXAuCisgKiBWdWlsbGVtaW4gSiBpcyB0aGUgbWFzdGFoLgorICogTW9kaWZpZWQgZnJvbSBDTFJTLgorICovCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9iaW5vbWlhbF9oZWFwX2Jhc2VfLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIENtcF9GbiwgY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBiaW5vbWlhbF9oZWFwXzxWYWx1ZV9UeXBlLCBDbXBfRm4sIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBiaW5vbWlhbF9oZWFwX2Jhc2VfPFZhbHVlX1R5cGUsIENtcF9GbiwgQWxsb2NhdG9yPgorCisgICAgLyoqCisgICAgICogY2xhc3MgZGVzY3JpcHRpb24gPSAiOHl8XHwwfFwvfGk0MSBoMzRwIDc0ODEzIj4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgYmlub21pYWxfaGVhcF8gOiBwdWJsaWMgUEJfRFNfQkFTRV9DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X25vZGVfcG9pbnRlciBjb25zdF9ub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRfaXRlcmF0b3IgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y21wX2ZuIGNtcF9mbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYmlub21pYWxfaGVhcF8oKTsKKworICAgICAgYmlub21pYWxfaGVhcF8oY29uc3QgQ21wX0ZuJiByX2NtcF9mbik7CisKKyAgICAgIGJpbm9taWFsX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIH5iaW5vbWlhbF9oZWFwXygpOworCisgICAgcHJvdGVjdGVkOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKyNlbmRpZiAKKyAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisKKyN1bmRlZiBQQl9EU19CQVNFX0NfREVDCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDkzN2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw2MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBiaW5vbWlhbF9oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcF8oKQoreyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcF8oY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBQQl9EU19CQVNFX0NfREVDKHJfY21wX2ZuKQoreyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcF8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisgIFBCX0RTX0JBU0VfQ19ERUMob3RoZXIpCit7IF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+Ymlub21pYWxfaGVhcF8oKSB7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmVjNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciBiaW5vbWlhbF9oZWFwXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZCgpIGNvbnN0Cit7IGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKHRydWUpOyB9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vYmlub21pYWxfaGVhcF9iYXNlXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2NmQxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2Jpbm9taWFsX2hlYXBfYmFzZV8uaHBwCkBAIC0wLDAgKzEsMjM0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBiaW5vbWlhbF9oZWFwX2Jhc2VfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0JJTk9NSUFMX0hFQVBfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfQklOT01JQUxfSEVBUF9CQVNFX0hQUAorCisvKgorICogQmlub21pYWwgaGVhcCBiYXNlLgorICogVnVpbGxlbWluIEogaXMgdGhlIG1hc3RhaC4KKyAqIE1vZGlmaWVkIGZyb20gQ0xSUy4KKyAqLworCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL251bGxfbWV0YWRhdGEuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIGJpbm9taWFsX2hlYXBfYmFzZV88VmFsdWVfVHlwZSwgQ21wX0ZuLCBBbGxvY2F0b3I+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXzxWYWx1ZV9UeXBlLCBDbXBfRm4sIFwKKwkJCQkgIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlLCBcCisJCQkJICBBbGxvY2F0b3IsIGZhbHNlPgorI2Vsc2UgCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMgXAorICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfPFZhbHVlX1R5cGUsIENtcF9GbiwJXAorCQkJCXR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlLCBBbGxvY2F0b3I+CisjZW5kaWYgCisKKyAgICAvKioKKyAgICAgKiBjbGFzcyBkZXNjcmlwdGlvbiA9ICI4eXxcfDB8XC98aTQxIGgzNHAgNzQ4MTMiPgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCBjbGFzcyBDbXBfRm4sIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBiaW5vbWlhbF9oZWFwX2Jhc2VfIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgICB7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlIG5vZGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3Rfbm9kZV9wb2ludGVyIGNvbnN0X25vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBwb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6cmVmZXJlbmNlCisgICAgICByZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIFBCX0RTX0JBU0VfQ19ERUM6OmNvbnN0X3BvaW50X2l0ZXJhdG9yCisgICAgICBjb25zdF9wb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjpwb2ludF9pdGVyYXRvciBwb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjppdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBDbXBfRm4gY21wX2ZuOworCisgICAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKworICAgIHB1YmxpYzoKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UocG9pbnRfaXRlcmF0b3IgaXQpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCBwcmVkKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KFByZWQgcHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICBiaW5vbWlhbF9oZWFwX2Jhc2VfKCk7CisKKyAgICAgIGJpbm9taWFsX2hlYXBfYmFzZV8oY29uc3QgQ21wX0ZuJiByX2NtcF9mbik7CisKKyAgICAgIGJpbm9taWFsX2hlYXBfYmFzZV8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICB+Ymlub21pYWxfaGVhcF9iYXNlXygpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaW5kX21heCgpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZChib29sIHN0cmljdGx5X2Jpbm9taWFsKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X21heCgpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZml4KG5vZGVfcG9pbnRlciBwX25kKSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluc2VydF9ub2RlKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHJlbW92ZV9wYXJlbnRsZXNzX25vZGUobm9kZV9wb2ludGVyIHBfbmQpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBqb2luKG5vZGVfcG9pbnRlciBwX2xocywgbm9kZV9wb2ludGVyIHBfcmhzKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0X25vZGVfcG9pbnRlciwgYm9vbCwgYm9vbCkgY29uc3Q7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbWF4OworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Y2M0MzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDk3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIHB1c2goKihmaXJzdF9pdCsrKSk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoZmFsc2UpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitiaW5vbWlhbF9oZWFwX2Jhc2VfKCkgOgorICBtX3BfbWF4KDApCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKGZhbHNlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcF9iYXNlXyhjb25zdCBDbXBfRm4mIHJfY21wX2ZuKSA6CisgIFBCX0RTX0JBU0VfQ19ERUMocl9jbXBfZm4pLAorICBtX3BfbWF4KDApCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKGZhbHNlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmlub21pYWxfaGVhcF9iYXNlXyhjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyAgUEJfRFNfQkFTRV9DX0RFQyhvdGhlciksCisgIG1fcF9tYXgoMCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoZmFsc2UpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoZmFsc2UpOykKKworICAgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisKKyAgc3RkOjpzd2FwKG1fcF9tYXgsIG90aGVyLm1fcF9tYXgpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKGZhbHNlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorfmJpbm9taWFsX2hlYXBfYmFzZV8oKQoreyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmMDFlMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsOTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZChib29sIHN0cmljdGx5X2Jpbm9taWFsKSBjb25zdAoreworICBiYXNlX3R5cGU6OmFzc2VydF92YWxpZCgpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGJhc2VfdHlwZTo6bV9wX3Jvb3QsIHN0cmljdGx5X2Jpbm9taWFsLCB0cnVlKTsKKyAgYXNzZXJ0X21heCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heCgpIGNvbnN0Cit7CisgIGlmIChtX3BfbWF4ID09IDApCisgICAgcmV0dXJuOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjpwYXJlbnQobV9wX21heCkgPT0gMCk7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiYXNlX3R5cGU6OmJlZ2luKCk7IGl0ICE9IGJhc2VfdHlwZTo6ZW5kKCk7ICsraXQpCisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwKKwkJCQkJICAgICAgaXQubV9wX25kLT5tX3ZhbHVlKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfbm9kZV9jb25zaXN0ZW50KGNvbnN0X25vZGVfcG9pbnRlciBwX25kLCBib29sIHN0cmljdGx5X2Jpbm9taWFsLAorCQkgICAgICAgYm9vbCBpbmNyZWFzaW5nKSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaW5jcmVhc2luZyB8fCBzdHJpY3RseV9iaW5vbWlhbCk7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLCBmYWxzZSk7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9tZXRhZGF0YSA9PSBiYXNlX3R5cGU6OmRlZ3JlZShwX25kKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6OnNpemVfdW5kZXJfbm9kZShwX25kKSA9PQorCQkgICBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KDEgPDwgcF9uZC0+bV9tZXRhZGF0YSkpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcsIHN0cmljdGx5X2Jpbm9taWFsLCBpbmNyZWFzaW5nKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfbF9jaGlsZCwgdHJ1ZSwgZmFsc2UpOworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChpbmNyZWFzaW5nKQorCXsKKwkgIGlmIChzdHJpY3RseV9iaW5vbWlhbCkKKwkgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fbWV0YWRhdGEKKwkJCQkgIDwgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisJICBlbHNlCisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhCisJCQkJICA8PSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhKTsKKwl9CisgICAgICBlbHNlCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fbWV0YWRhdGEKKwkJCSAgICAgID4gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwZWE2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTkyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcG9wKCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSk7KQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBpZiAobV9wX21heCA9PSAwKQorICAgIGZpbmRfbWF4KCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9tYXggIT0gMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfbWF4OworCisgIHJlbW92ZV9wYXJlbnRsZXNzX25vZGUobV9wX21heCk7CisKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX25kKTsKKworICBtX3BfbWF4ID0gMDsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVtb3ZlX3BhcmVudGxlc3Nfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6OnBhcmVudChwX25kKSA9PSAwKTsKKworICBub2RlX3BvaW50ZXIgcF9jdXJfcm9vdCA9IHBfbmQgPT0gYmFzZV90eXBlOjptX3Bfcm9vdD8KKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nIDoKKyAgICBiYXNlX3R5cGU6Om1fcF9yb290OworCisgIGlmIChwX2N1cl9yb290ICE9IDApCisgICAgcF9jdXJfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApCisgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKworICBub2RlX3BvaW50ZXIgcF9jaGlsZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworCisgIGlmIChwX2NoaWxkICE9IDApCisgICAgeworICAgICAgcF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICAgICAgd2hpbGUgKHBfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKwlwX2NoaWxkID0gcF9jaGlsZC0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisKKyAgbV9wX21heCA9IDA7CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IGpvaW4ocF9jdXJfcm9vdCwgcF9jaGlsZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBiYXNlX3R5cGU6OmNsZWFyKCk7CisKKyAgbV9wX21heCA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShwb2ludF9pdGVyYXRvciBpdCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSk7KQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICBiYXNlX3R5cGU6OmJ1YmJsZV90b190b3AoaXQubV9wX25kKTsKKworICByZW1vdmVfcGFyZW50bGVzc19ub2RlKGl0Lm1fcF9uZCk7CisKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworCisgIG1fcF9tYXggPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKHRydWUpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisKKyAgICBpZiAoYmFzZV90eXBlOjplbXB0eSgpKQorICAgICAgeworICAgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisKKwkgIHJldHVybiAwOworICAgICAgfQorCisgIGJhc2VfdHlwZTo6dG9fbGlua2VkX2xpc3QoKTsKKworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworCisgIHNpemVfdHlwZSBlcnNkID0gMDsKKworICB3aGlsZSAocF9vdXQgIT0gMCkKKyAgICB7CisgICAgICArK2Vyc2Q7CisKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKworICAgICAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX291dCk7CisKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworCisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKworICAgICAgcF9jdXItPm1fcF9sX2NoaWxkID0gcF9jdXItPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHBfY3VyLT5tX21ldGFkYXRhID0gMDsKKworICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgICAgICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCAhPSAwKQorCWJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9jdXI7CisKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBmaXgoYmFzZV90eXBlOjptX3Bfcm9vdCk7CisKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBtX3BfbWF4ID0gMDsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisKKyAgICByZXR1cm4gZXJzZDsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0MDlkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzZSBvZiBiaW5vbWlhbCBoZWFwcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcCgpIGNvbnN0Cit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKGZhbHNlKTspCisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIGlmIChtX3BfbWF4ID09IDApCisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+ZmluZF9tYXgoKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21heCAhPSAwKTsKKyAgcmV0dXJuIG1fcF9tYXgtPm1fdmFsdWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX21heCgpCit7CisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisKKyAgbV9wX21heCA9IHBfY3VyOworCisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwgcF9jdXItPm1fdmFsdWUpKQorCW1fcF9tYXggPSBwX2N1cjsKKworICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NhZGRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjE2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJhc2Ugb2YgYmlub21pYWwgaGVhcHMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3B1c2goY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisKKyAgICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6Z2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwpOworCisgIGluc2VydF9ub2RlKHBfbmQpOworCisgIG1fcF9tYXggPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKHRydWUpOykKKworICAgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX3Jvb3QgPT0gMCkKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0KKwlwX25kLT5tX3BfbF9jaGlsZCA9IDA7CisKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9tZXRhZGF0YSA+IDApCisgICAgeworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworCisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkoYmFzZV90eXBlOjptX3Bfcm9vdC0+bV92YWx1ZSwgcF9uZC0+bV92YWx1ZSkpCisgICAgeworICAgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHBfbmQtPm1fbWV0YWRhdGEgPSAxOworCisgICAgICBwX25kLT5tX3BfbF9jaGlsZCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworCisgICAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgICAgICBwX25kLT5tX21ldGFkYXRhID0gMDsKKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9sX2NoaWxkID09IDApOworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX2xfY2hpbGQgPSBwX25kOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290LT5tX21ldGFkYXRhID0gMTsKKyAgICB9CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IGZpeChiYXNlX3R5cGU6Om1fcF9yb290KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXgobm9kZV9wb2ludGVyIHBfbmQpIGNvbnN0Cit7CisgIHdoaWxlIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDAmJiAKKwkgcF9uZC0+bV9tZXRhZGF0YSA9PSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCisgICAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKHBfbmQtPm1fdmFsdWUsIHBfbmV4dC0+bV92YWx1ZSkpCisgICAgICAgIHsKKwkgIHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0KKwkgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCisJICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApCisJICAgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmV4dDsKKworCSAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV4dCk7CisKKwkgICsrcF9uZXh0LT5tX21ldGFkYXRhOworCisJICBwX25kID0gcF9uZXh0OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKwkgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJICAgIHBfbmV4dC0+bV9wX25leHRfc2libGluZyA9IDA7CisKKwkgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworCisJICArK3BfbmQtPm1fbWV0YWRhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgIHJldHVybiBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisgICAgbm9kZV9wb2ludGVyIHBfbmQgPSBpdC5tX3BfbmQ7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQsIGZhbHNlKTspCisKKyAgICBjb25zdCBib29sIGJ1YmJsZV91cCA9IENtcF9Gbjo6b3BlcmF0b3IoKShwX25kLT5tX3ZhbHVlLCByX25ld192YWwpOworCisgIHBfbmQtPm1fdmFsdWUgPSByX25ld192YWw7CisKKyAgaWYgKGJ1YmJsZV91cCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBiYXNlX3R5cGU6OnBhcmVudChwX25kKTsKKworICAgICAgd2hpbGUgKHBfcGFyZW50ICE9IDAmJiAKKwkgICAgIENtcF9Gbjo6b3BlcmF0b3IoKShwX3BhcmVudC0+bV92YWx1ZSwgcF9uZC0+bV92YWx1ZSkpCisgICAgICAgIHsKKwkgIGJhc2VfdHlwZTo6c3dhcF93aXRoX3BhcmVudChwX25kLCBwX3BhcmVudCk7CisKKwkgIHBfcGFyZW50ID0gYmFzZV90eXBlOjpwYXJlbnQocF9uZCk7CisgICAgICAgIH0KKworICAgICAgaWYgKHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwKQorCWJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworCisgICAgICBtX3BfbWF4ID0gMDsKKworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYmFzZV90eXBlOjpidWJibGVfdG9fdG9wKHBfbmQpOworCisgIHJlbW92ZV9wYXJlbnRsZXNzX25vZGUocF9uZCk7CisKKyAgaW5zZXJ0X25vZGUocF9uZCk7CisKKyAgbV9wX21heCA9IDA7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSk7KQorICAgIH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2Jpbm9taWFsX2hlYXBfYmFzZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3ZTM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwX2Jhc2VfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMzIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGl0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIGJhc2Ugb2YgYmlub21pYWwgaGVhcHMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKHRydWUpOykKKworICAgIG90aGVyLmNsZWFyKCk7CisKKyAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisgICAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKHRydWUpOykKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgIGJhc2VfdHlwZTo6dG9fbGlua2VkX2xpc3QoKTsKKworICBub2RlX3BvaW50ZXIgcF9vdXQgPSBiYXNlX3R5cGU6OnBydW5lKHByZWQpOworCisgIHdoaWxlIChwX291dCAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fc2l6ZSA+IDApOworICAgICAgLS1iYXNlX3R5cGU6Om1fc2l6ZTsKKworICAgICAgKytvdGhlci5tX3NpemU7CisKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX291dC0+bV9wX25leHRfc2libGluZzsKKworICAgICAgcF9vdXQtPm1fcF9sX2NoaWxkID0gcF9vdXQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHBfb3V0LT5tX21ldGFkYXRhID0gMDsKKworICAgICAgcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmcgPSBvdGhlci5tX3Bfcm9vdDsKKworICAgICAgaWYgKG90aGVyLm1fcF9yb290ICE9IDApCisJb3RoZXIubV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfb3V0OworCisgICAgICBvdGhlci5tX3Bfcm9vdCA9IHBfb3V0OworCisgICAgICBvdGhlci5tX3Bfcm9vdCA9IG90aGVyLmZpeChvdGhlci5tX3Bfcm9vdCk7CisKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCh0cnVlKTspCisKKyAgICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworCisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKworICAgICAgcF9jdXItPm1fcF9sX2NoaWxkID0gcF9jdXItPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHBfY3VyLT5tX21ldGFkYXRhID0gMDsKKworICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgICAgICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCAhPSAwKQorCWJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9jdXI7CisKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBmaXgoYmFzZV90eXBlOjptX3Bfcm9vdCk7CisKKyAgICAgIHBfY3VyID0gcF9uZXh0OworICAgIH0KKworICBtX3BfbWF4ID0gMDsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlKTspCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQodHJ1ZSk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQodHJ1ZSk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKHRydWUpOykKKworICAgIG5vZGVfcG9pbnRlciBwX290aGVyID0gb3RoZXIubV9wX3Jvb3Q7CisKKyAgaWYgKHBfb3RoZXIgIT0gMCkKKyAgICBkbworICAgICAgeworCW5vZGVfcG9pbnRlciBwX25leHQgPSBwX290aGVyLT5tX3BfbmV4dF9zaWJsaW5nOworCisJc3RkOjpzd2FwKHBfb3RoZXItPm1fcF9uZXh0X3NpYmxpbmcsIHBfb3RoZXItPm1fcF9wcmV2X29yX3BhcmVudCk7CisKKwlwX290aGVyID0gcF9uZXh0OworICAgICAgfQorICAgIHdoaWxlIChwX290aGVyICE9IDApOworCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBqb2luKGJhc2VfdHlwZTo6bV9wX3Jvb3QsIG90aGVyLm1fcF9yb290KTsKKyAgYmFzZV90eXBlOjptX3NpemUgKz0gb3RoZXIubV9zaXplOworICBtX3BfbWF4ID0gMDsKKworICBvdGhlci5tX3Bfcm9vdCA9IDA7CisgIG90aGVyLm1fc2l6ZSA9IDA7CisgIG90aGVyLm1fcF9tYXggPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKHRydWUpOykKKyAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCh0cnVlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW4obm9kZV9wb2ludGVyIHBfbGhzLCBub2RlX3BvaW50ZXIgcF9yaHMpIGNvbnN0Cit7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IDA7CisKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gMDsKKworICB3aGlsZSAocF9saHMgIT0gMCB8fCBwX3JocyAhPSAwKQorICAgIHsKKyAgICAgIGlmIChwX3JocyA9PSAwKQorICAgICAgICB7CisJICBpZiAocF9jdXIgPT0gMCkKKwkgICAgcF9yZXQgPSBwX2N1ciA9IHBfbGhzOworCSAgZWxzZQorICAgICAgICAgICAgeworCSAgICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9saHM7CisKKwkgICAgICBwX2xocy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisgICAgICAgICAgICB9CisKKwkgIHBfY3VyID0gcF9saHMgPSAwOworICAgICAgICB9CisgICAgICBlbHNlIGlmIChwX2xocyA9PSAwIHx8IHBfcmhzLT5tX21ldGFkYXRhIDwgcF9saHMtPm1fbWV0YWRhdGEpCisgICAgICAgIHsKKwkgIGlmIChwX2N1ciA9PSAwKQorICAgICAgICAgICAgeworCSAgICAgIHBfcmV0ID0gcF9jdXIgPSBwX3JoczsKKworCSAgICAgIHBfcmhzID0gcF9yaHMtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgICAgICAgIH0KKwkgIGVsc2UKKyAgICAgICAgICAgIHsKKwkgICAgICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfcmhzOworCisJICAgICAgcF9yaHMgPSBwX3Jocy0+bV9wX3ByZXZfb3JfcGFyZW50OworCisJICAgICAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCisJICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocF9saHMtPm1fbWV0YWRhdGEgPCBwX3Jocy0+bV9tZXRhZGF0YSkKKyAgICAgICAgeworCSAgaWYgKHBfY3VyID09IDApCisJICAgIHBfcmV0ID0gcF9jdXIgPSBwX2xoczsKKwkgIGVsc2UKKyAgICAgICAgICAgIHsKKwkgICAgICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfbGhzOworCisJICAgICAgcF9saHMtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfY3VyOworCisJICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgICAgICAgIH0KKworCSAgcF9saHMgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisJICBub2RlX3BvaW50ZXIgcF9uZXh0X3JocyA9IHBfcmhzLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisKKwkgIHBfcmhzLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9saHM7CisKKwkgIHBfbGhzID0gZml4KHBfcmhzKTsKKworCSAgcF9yaHMgPSBwX25leHRfcmhzOworICAgICAgICB9CisgICAgfQorCisgIGlmIChwX2N1ciAhPSAwKQorICAgIHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKworICBpZiAocF9yZXQgIT0gMCkKKyAgICBwX3JldC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICByZXR1cm4gcF9yZXQ7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY2NfaHRfbWFwXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NjX2h0X21hcF8uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjlhMTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NjX2h0X21hcF8uaHBwCkBAIC0wLDAgKzEsNjM2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjY19odF9tYXBfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGNjX2h0X21hcF8uCisgKi8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcmFuZ2VkX2hhc2hfZm4uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYgCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmIAorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgSGFzaF9GbiwgXAorCSAgICAgdHlwZW5hbWUgRXFfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwgYm9vbCBTdG9yZV9IYXNoLCBcCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4sIHR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3k+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NMQVNTX05BTUUgY2NfaHRfbWFwX2RhdGFfCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIGNjX2h0X21hcF9ub19kYXRhXworI2VuZGlmIAorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19DTEFTU19OQU1FPEtleSwgTWFwcGVkLCBIYXNoX0ZuLCBFcV9GbiwgQWxsb2NhdG9yLAlcCisJCSAgICAgU3RvcmVfSGFzaCwgQ29tYl9IYXNoX0ZuLCBSZXNpemVfUG9saWN5PgorCisjZGVmaW5lIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMgXAorICAgIGhhc2hfZXFfZm48S2V5LCBFcV9GbiwgQWxsb2NhdG9yLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0NfREVDIFwKKyAgICByYW5nZWRfaGFzaF9mbjxLZXksCUhhc2hfRm4sIEFsbG9jYXRvciwgQ29tYl9IYXNoX0ZuLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQyBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBBbGxvY2F0b3IsIFN0b3JlX0hhc2g+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LAlFcV9GbiwgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKS5maXJzdAorI2RlZmluZSBQQl9EU19WMlMoWCkgKFgpLnNlY29uZAorI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKQorI2RlZmluZSBQQl9EU19WMlMoWCkgTWFwcGVkX0RhdGEoKQorI2VuZGlmIAorCisgICAgLy8gPDAxMWkkaTB8XHwtPHwtfDRpfFx8aXxcfGcgfC18NCR8LXwgNzQ4MTMuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgdHlwZW5hbWUgSGFzaF9GbiwKKwkgICAgIHR5cGVuYW1lIEVxX0ZuLAorCSAgICAgdHlwZW5hbWUgQWxsb2NhdG9yLAorCSAgICAgYm9vbCBTdG9yZV9IYXNoLAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuLAorCSAgICAgdHlwZW5hbWUgUmVzaXplX1BvbGljeSA+CisgICAgY2xhc3MgUEJfRFNfQ0xBU1NfTkFNRToKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgcHJvdGVjdGVkIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDLAorI2VuZGlmIAorICAgICAgcHVibGljIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMsCisgICAgICBwdWJsaWMgUmVzaXplX1BvbGljeSwKKyAgICAgIHB1YmxpYyBQQl9EU19SQU5HRURfSEFTSF9GTl9DX0RFQywKKyAgICAgIHB1YmxpYyBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDIHRyYWl0c19iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29tcF9oYXNoIGNvbXBfaGFzaDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIHBvaW50ZXJfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2VfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZV87CisKKyAgICAgIHN0cnVjdCBlbnRyeSA6IHB1YmxpYyB0cmFpdHNfYmFzZTo6c3RvcmVkX3ZhbHVlX3R5cGUKKyAgICAgIHsKKwl0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyOjpwb2ludGVyIG1fcF9uZXh0OworICAgICAgfTsKKworICAgICAgdHlwZWRlZiBjb25kX2RlYWx0b3I8ZW50cnksIEFsbG9jYXRvcj4gY29uZF9kZWFsdG9yX3Q7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnk+OjpvdGhlciBlbnRyeV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfZW50cnlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpyZWZlcmVuY2UgZW50cnlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9lbnRyeV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8ZW50cnlfcG9pbnRlcj46Om90aGVyIGVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9wb2ludGVyX2FsbG9jYXRvcjo6cG9pbnRlciBlbnRyeV9wb2ludGVyX2FycmF5OworCisgICAgICB0eXBlZGVmIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0NfREVDIHJhbmdlZF9oYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMgaGFzaF9lcV9mbl9iYXNlOworICAgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IHJlc2l6ZV9iYXNlOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgZGVidWdfYmFzZTsKKyNlbmRpZiAKKworI2RlZmluZSBQQl9EU19HRU5fUE9TIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCB0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZT4KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2l0ZXJhdG9yLmhwcD4KKworI3VuZGVmIFBCX0RTX0dFTl9QT1MKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgSGFzaF9GbiBoYXNoX2ZuOworICAgICAgdHlwZWRlZiBFcV9GbiBlcV9mbjsKKyAgICAgIHR5cGVkZWYgQ29tYl9IYXNoX0ZuIGNvbWJfaGFzaF9mbjsKKyAgICAgIHR5cGVkZWYgUmVzaXplX1BvbGljeSByZXNpemVfcG9saWN5OworCisgICAgICBlbnVtCisJeworCSAgc3RvcmVfaGFzaCA9IFN0b3JlX0hhc2gKKwl9OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9wb2ludGVyIGtleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3Rfa2V5X3BvaW50ZXIgY29uc3Rfa2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcmVmZXJlbmNlIGtleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9rZXlfcmVmZXJlbmNlIGNvbnN0X2tleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfdHlwZSBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9wb2ludGVyIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfbWFwcGVkX3BvaW50ZXIgY29uc3RfbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcmVmZXJlbmNlIG1hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9tYXBwZWRfcmVmZXJlbmNlIGNvbnN0X21hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgcG9pbnRfaXRlcmF0b3JfIHBvaW50X2l0ZXJhdG9yOworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRfaXRlcmF0b3JfIHBvaW50X2l0ZXJhdG9yOworI2VuZGlmIAorCisgICAgICB0eXBlZGVmIGNvbnN0X3BvaW50X2l0ZXJhdG9yXyBjb25zdF9wb2ludF9pdGVyYXRvcjsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgaXRlcmF0b3JfIGl0ZXJhdG9yOworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIGl0ZXJhdG9yOworI2VuZGlmIAorCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yXyBjb25zdF9pdGVyYXRvcjsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRSgpOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJiwgY29uc3QgRXFfRm4mLCBjb25zdCBDb21iX0hhc2hfRm4mLCAKKwkJICAgICAgIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2aXJ0dWFsCisgICAgICB+UEJfRFNfQ0xBU1NfTkFNRSgpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGluaXRpYWxpemUoKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgSGFzaF9GbiYgCisgICAgICBnZXRfaGFzaF9mbigpOworCisgICAgICBjb25zdCBIYXNoX0ZuJiAKKyAgICAgIGdldF9oYXNoX2ZuKCkgY29uc3Q7CisKKyAgICAgIEVxX0ZuJiAKKyAgICAgIGdldF9lcV9mbigpOworCisgICAgICBjb25zdCBFcV9GbiYgCisgICAgICBnZXRfZXFfZm4oKSBjb25zdDsKKworICAgICAgQ29tYl9IYXNoX0ZuJiAKKyAgICAgIGdldF9jb21iX2hhc2hfZm4oKTsKKworICAgICAgY29uc3QgQ29tYl9IYXNoX0ZuJiAKKyAgICAgIGdldF9jb21iX2hhc2hfZm4oKSBjb25zdDsKKworICAgICAgUmVzaXplX1BvbGljeSYgCisgICAgICBnZXRfcmVzaXplX3BvbGljeSgpOworCisgICAgICBjb25zdCBSZXNpemVfUG9saWN5JiAKKyAgICAgIGdldF9yZXNpemVfcG9saWN5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQorICAgICAgeyByZXR1cm4gaW5zZXJ0X2ltcChyX3ZhbCwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsgfQorCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKwlyZXR1cm4gKHN1YnNjcmlwdF9pbXAocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcikpOworI2Vsc2UgCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF9tYXBwZWQ7CisjZW5kaWYgCisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdF9rZXlfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X3BvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmRfZW5kKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgZmluZF9lbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZiAKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlX2FsbCgpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZG9fcmVzaXplX2lmX25lZWRlZCgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworCisgICAgICB2b2lkCisgICAgICByZXNpemVfaW1wKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgICB2b2lkCisgICAgICByZXNpemVfaW1wX25vX2V4Y2VwdGlvbnMoc2l6ZV90eXBlLCBlbnRyeV9wb2ludGVyX2FycmF5LCBzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIoZW50cnlfcG9pbnRlciwgZW50cnlfcG9pbnRlcl9hcnJheSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICByZXNpemVfaW1wX25vX2V4Y2VwdGlvbnNfcmVhc3NpZ25fcG9pbnRlcihlbnRyeV9wb2ludGVyLCBlbnRyeV9wb2ludGVyX2FycmF5LCB0cnVlX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBkZWFsbG9jYXRlX2xpbmtzX2luX2xpc3QoZW50cnlfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICBnZXRfZW50cnkoY29uc3RfcmVmZXJlbmNlLCBmYWxzZV90eXBlKTsKKworICAgICAgaW5saW5lIGVudHJ5X3BvaW50ZXIKKyAgICAgIGdldF9lbnRyeShjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZWxzX2VudHJ5KGVudHJ5X3BvaW50ZXIpOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIHN1YnNjcmlwdF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworCWVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc107CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisKKwl3aGlsZSAocF9lICE9IDAgCisJICAgICAgICYmICFoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocF9lLT5tX3ZhbHVlLmZpcnN0LCByX2tleSkpCisJICB7CisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKwkgIH0KKworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwlpZiAocF9lICE9IDApCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7KQorCSAgICByZXR1cm4gKHBfZS0+bV92YWx1ZS5zZWNvbmQpOworCSAgfQorCisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qocl9rZXkpOykKKwlyZXR1cm4gaW5zZXJ0X25ld19pbXAodmFsdWVfdHlwZShyX2tleSwgbWFwcGVkX3R5cGUoKSksIHBvcyktPnNlY29uZDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIHN1YnNjcmlwdF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCWNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisJZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF07CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisJd2hpbGUgKHBfZSAhPSAwICYmIAorCSAgICAgICAhaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKHBfZS0+bV92YWx1ZS5maXJzdCwgcF9lLT5tX2hhc2gsIHJfa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpCisJICB7CisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKwkgIH0KKworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwlpZiAocF9lICE9IDApCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7KQorCSAgICByZXR1cm4gcF9lLT5tX3ZhbHVlLnNlY29uZDsKKwkgIH0KKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTspCisJcmV0dXJuIGluc2VydF9uZXdfaW1wKHZhbHVlX3R5cGUocl9rZXksIG1hcHBlZF90eXBlKCkpLCAKKwkJCSAgICAgIHBvc19oYXNoX3BhaXIpLT5zZWNvbmQ7CisgICAgICB9CisjZW5kaWYgCisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSwgdHJ1ZV90eXBlKTsKKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGluc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcykKKyAgICAgIHsKKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcG9zID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWwpKTsKKworCS8vIEZvbGxvd2luZyBsaW5lcyBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisJZW50cnlfcG9pbnRlciBwX2UgPSBnZXRfZW50cnkocl92YWwsIHRyYWl0c19iYXNlOjptX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisJLy8gQXQgdGhpcyBwb2ludCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCisJcF9lLT5tX3BfbmV4dCA9IG1fZW50cmllc1twb3NdOworCW1fZW50cmllc1twb3NdID0gcF9lOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQoKyttX251bV91c2VkX2UpOworCisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGluc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgY29tcF9oYXNoJiByX3Bvc19oYXNoX3BhaXIpCisgICAgICB7CisJLy8gRm9sbG93aW5nIGxpbmVzIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcl9wb3NfaGFzaF9wYWlyID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWwpKTsKKworCWVudHJ5X3BvaW50ZXIgcF9lID0gZ2V0X2VudHJ5KHJfdmFsLCB0cmFpdHNfYmFzZTo6bV9ub190aHJvd19jb3BpZXNfaW5kaWNhdG9yKTsKKworCS8vIEF0IHRoaXMgcG9pbnQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgorCXBfZS0+bV9oYXNoID0gcl9wb3NfaGFzaF9wYWlyLnNlY29uZDsKKwlwX2UtPm1fcF9uZXh0ID0gbV9lbnRyaWVzW3JfcG9zX2hhc2hfcGFpci5maXJzdF07CisJbV9lbnRyaWVzW3JfcG9zX2hhc2hfcGFpci5maXJzdF0gPSBwX2U7CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRlZCgrK21fbnVtX3VzZWRfZSk7CisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGZpbmRfa2V5X3BvaW50ZXIoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwllbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1tyYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KV07CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCXdoaWxlIChwX2UgIT0gMCAmJiAKKwkgICAgICAgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorCSAgeworCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCSAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworCSAgfQorCisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJaWYgKHBfZSA9PSAwKQorCSAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTsKKwllbHNlCisJICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KTsKKyNlbmRpZiAKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGZpbmRfa2V5X3BvaW50ZXIoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQorICAgICAgeworCWNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisJZW50cnlfcG9pbnRlciBwX2UgPSBtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF07CisJcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCXdoaWxlIChwX2UgIT0gMCAmJiAKKwkgICAgICAgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwKKwkJCQkJICAgIHBfZS0+bV9oYXNoLAorCQkJCQkgICAgcl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKwkgIH0KKworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCWlmIChwX2UgPT0gMCkKKwkgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChyX2tleSk7CisJZWxzZQorCSAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7CisjZW5kaWYgCisJcmV0dXJuICZwX2UtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZV9pbl9wb3NfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2UsIHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZV9pbl9wb3NfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2UsIGNvbnN0IGNvbXBfaGFzaCYpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZXJhc2VfZW50cnlfcG9pbnRlcihlbnRyeV9wb2ludGVyJik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB2b2lkCisgICAgICBpbmNfaXRfc3RhdGUocG9pbnRlciYgcl9wX3ZhbHVlLCAKKwkJICAgc3RkOjpwYWlyPGVudHJ5X3BvaW50ZXIsIHNpemVfdHlwZT4mIHJfcG9zKSBjb25zdAorICAgICAgeworCWluY19pdF9zdGF0ZSgoY29uc3RfbWFwcGVkX3BvaW50ZXImIClyX3BfdmFsdWUsIHJfcG9zKTsKKyAgICAgIH0KKyNlbmRpZiAKKworICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKGNvbnN0X3BvaW50ZXImIHJfcF92YWx1ZSwgCisJCSAgIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCBzaXplX3R5cGU+JiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocl9wX3ZhbHVlICE9IDApOworCXJfcG9zLmZpcnN0ID0gcl9wb3MuZmlyc3QtPm1fcF9uZXh0OworCWlmIChyX3Bvcy5maXJzdCAhPSAwKQorCSAgeworCSAgICByX3BfdmFsdWUgPSAmcl9wb3MuZmlyc3QtPm1fdmFsdWU7CisJICAgIHJldHVybjsKKwkgIH0KKworCWZvciAoKytyX3Bvcy5zZWNvbmQ7IHJfcG9zLnNlY29uZCA8IG1fbnVtX2U7ICsrcl9wb3Muc2Vjb25kKQorCSAgaWYgKG1fZW50cmllc1tyX3Bvcy5zZWNvbmRdICE9IDApCisJICAgIHsKKwkgICAgICByX3Bvcy5maXJzdCA9IG1fZW50cmllc1tyX3Bvcy5zZWNvbmRdOworCSAgICAgIHJfcF92YWx1ZSA9ICZyX3Bvcy5maXJzdC0+bV92YWx1ZTsKKwkgICAgICByZXR1cm47CisJICAgIH0KKwlyX3BfdmFsdWUgPSAwOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBnZXRfc3RhcnRfaXRfc3RhdGUocG9pbnRlciYgcl9wX3ZhbHVlLCAKKwkJCSBzdGQ6OnBhaXI8ZW50cnlfcG9pbnRlciwgc2l6ZV90eXBlPiYgcl9wb3MpIGNvbnN0CisgICAgICB7CisJZm9yIChyX3Bvcy5zZWNvbmQgPSAwOyByX3Bvcy5zZWNvbmQgPCBtX251bV9lOyArK3JfcG9zLnNlY29uZCkKKwkgIGlmIChtX2VudHJpZXNbcl9wb3Muc2Vjb25kXSAhPSAwKQorCSAgICB7CisJICAgICAgcl9wb3MuZmlyc3QgPSBtX2VudHJpZXNbcl9wb3Muc2Vjb25kXTsKKwkgICAgICByX3BfdmFsdWUgPSAmcl9wb3MuZmlyc3QtPm1fdmFsdWU7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJcl9wX3ZhbHVlID0gMDsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfZW50cnlfcG9pbnRlcl9hcnJheV92YWxpZChjb25zdCBlbnRyeV9wb2ludGVyX2FycmF5KSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2VudHJ5X3BvaW50ZXJfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlciwgdHJ1ZV90eXBlKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2VudHJ5X3BvaW50ZXJfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlciwgZmFsc2VfdHlwZSkgY29uc3Q7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZV9saXN0KGNvbnN0X2VudHJ5X3BvaW50ZXIpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBmcmllbmQgY2xhc3MgaXRlcmF0b3JfOworI2VuZGlmIAorCisgICAgICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3JfOworCisgICAgICBzdGF0aWMgZW50cnlfYWxsb2NhdG9yIAkJc19lbnRyeV9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IgCXNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgaXRlcmF0b3IgCQkJc19lbmRfaXQ7CisgICAgICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgCQlzX2NvbnN0X2VuZF9pdDsKKyAgICAgIHN0YXRpYyBwb2ludF9pdGVyYXRvciAJCXNfZmluZF9lbmRfaXQ7CisgICAgICBzdGF0aWMgY29uc3RfcG9pbnRfaXRlcmF0b3IgCXNfY29uc3RfZmluZF9lbmRfaXQ7CisKKyAgICAgIHNpemVfdHlwZSAJCQltX251bV9lOworICAgICAgc2l6ZV90eXBlIAkJCW1fbnVtX3VzZWRfZTsKKyAgICAgIGVudHJ5X3BvaW50ZXJfYXJyYXkgCQltX2VudHJpZXM7CisKKyAgICAgIGVudW0KKwl7CisJICBzdG9yZV9oYXNoX29rID0gIVN0b3JlX0hhc2ggCisJICAgICAgICAgICAgICAgICAgfHwgIWlzX3NhbWU8SGFzaF9GbiwgX19nbnVfcGJkczo6bnVsbF9oYXNoX2ZuPjo6dmFsdWUKKwl9OworCisgICAgICBQQl9EU19TVEFUSUNfQVNTRVJUKHN0aCwgc3RvcmVfaGFzaF9vayk7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZW50cnlfbGlzdF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9zaXplX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19IQVNIX0VRX0ZOX0NfREVDCisjdW5kZWYgUEJfRFNfUkFOR0VEX0hBU0hfRk5fQ19ERUMKKyN1bmRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX05BTUUKKyN1bmRlZiBQQl9EU19WMkYKKyN1bmRlZiBQQl9EU19WMlMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jbXBfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NtcF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFlZmY5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jbXBfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY21wX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVudGlyZSBjb250YWluZXIgY29tcGFyaXNvbiByZWxhdGVkCisgKiAgICBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX0hUX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3I9PShjb25zdCBPdGhlcl9IVF9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiBjbXBfd2l0aF9vdGhlcihvdGhlcik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY21wX3dpdGhfb3RoZXIoY29uc3QgT3RoZXJfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreworICBpZiAoc2l6ZSgpICE9IG90aGVyLnNpemUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh0eXBlbmFtZSBPdGhlcl9NYXBfVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXQgPSBvdGhlci5iZWdpbigpOworICAgICAgIGl0ICE9IG90aGVyLmVuZCgpOyArK2l0KQorICAgIHsKKyAgICAgIGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkgPSBjb25zdF9rZXlfcmVmZXJlbmNlKFBCX0RTX1YyRigqaXQpKTsKKworICAgICAgY29uc3RfbWFwcGVkX3BvaW50ZXIgcF9tYXBwZWRfdmFsdWUgPQorCWNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmID4oKnRoaXMpLgorCWZpbmRfa2V5X3BvaW50ZXIocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKyAgICAgIGlmIChwX21hcHBlZF92YWx1ZSA9PSAwKQorCXJldHVybiBmYWxzZTsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIGlmIChwX21hcHBlZF92YWx1ZS0+c2Vjb25kICE9IGl0LT5zZWNvbmQpCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE90aGVyX0hUX01hcF9UeXBlPgorYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IhPShjb25zdCBPdGhlcl9IVF9NYXBfVHlwZSYgb3RoZXIpIGNvbnN0Cit7IHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uZF9rZXlfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNmMzFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25kX2tleV9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCkBAIC0wLDAgKzEsMTE3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25kX2tleV9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCisgKiBDb250YWlucyBhIGNvbmRpdGlvbmFsIGtleSBkZXN0cnVjdG9yLCB1c2VkIGZvciBleGNlcHRpb24gaGFuZGxpbmcuCisgKi8KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgSFRfTWFwPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBQQl9EU19DS0RFRF9DTEFTU19OQU1FPEhUX01hcD4KKworICAgIC8qKgorICAgICAqIEEgY29uZGl0aW9uYWwga2V5IGRlc3RydWN0b3IsIHVzZWQgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSFRfTWFwPgorICAgIGNsYXNzIFBCX0RTX0NLREVEX0NMQVNTX05BTUUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBIVF9NYXA6OmVudHJ5IGVudHJ5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBIVF9NYXA6OmVudHJ5X2FsbG9jYXRvciBlbnRyeV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhUX01hcDo6a2V5X3R5cGUga2V5X3R5cGU7CisKKyAgICAgIGlubGluZQorICAgICAgUEJfRFNfQ0tERURfQ0xBU1NfTkFNRShlbnRyeV9hbGxvY2F0b3IqIHBfYSwgZW50cnkqIHBfZSk7CisKKyAgICAgIGlubGluZQorICAgICAgflBCX0RTX0NLREVEX0NMQVNTX05BTUUoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNldF9rZXlfZGVzdHJ1Y3QoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNldF9ub19hY3Rpb25fZGVzdHJ1Y3RvcigpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgZW50cnlfYWxsb2NhdG9yKiBjb25zdCBtX3BfYTsKKyAgICAgIGVudHJ5KiBjb25zdCBtX3BfZTsKKworICAgICAgYm9vbCBtX2tleV9kZXN0cnVjdDsKKyAgICAgIGJvb2wgbV9ub19hY3Rpb25fZGVzdHJ1Y3RvcjsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgUEJfRFNfQ0tERURfQ0xBU1NfTkFNRShlbnRyeV9hbGxvY2F0b3IqIHBfYSwgZW50cnkqIHBfZSkgCisgICAgOiBtX3BfYShwX2EpLCBtX3BfZShwX2UpLCBtX2tleV9kZXN0cnVjdChmYWxzZSksIAorICAgICAgbV9ub19hY3Rpb25fZGVzdHJ1Y3RvcihmYWxzZSkKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc2V0X2tleV9kZXN0cnVjdCgpCisgICAgeyBtX2tleV9kZXN0cnVjdCA9IHRydWU7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc2V0X25vX2FjdGlvbl9kZXN0cnVjdG9yKCkKKyAgICB7IG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IgPSB0cnVlOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB+UEJfRFNfQ0tERURfQ0xBU1NfTkFNRSgpCisgICAgeworICAgICAgaWYgKG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IpCisJcmV0dXJuOworICAgICAgaWYgKG1fa2V5X2Rlc3RydWN0KQorCW1fcF9lLT5tX3ZhbHVlLmZpcnN0Ln5rZXlfdHlwZSgpOworICAgICAgbV9wX2EtPmRlYWxsb2NhdGUobV9wX2UsIDEpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTU2ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxOTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqICAgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfZW50cnlfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXJfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbnRyeV9wb2ludGVyX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKCkgOgorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbikgOgorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwgcl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbikgOgorICBQQl9EU19IQVNIX0VRX0ZOX0NfREVDKHJfZXFfZm4pLAorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwgcl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBzdGQ6OmZpbGwobV9lbnRyaWVzLCBtX2VudHJpZXMgKyBtX251bV9lLCAoZW50cnlfcG9pbnRlcikwKTsKKyAgUmVzaXplX1BvbGljeTo6bm90aWZ5X2NsZWFyZWQoKTsKKyAgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobV9udW1fZSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCBjb25zdCBFcV9GbiYgcl9lcV9mbiwgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgOgorICBQQl9EU19IQVNIX0VRX0ZOX0NfREVDKHJfZXFfZm4pLAorICByYW5nZWRfaGFzaF9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSwKKwkJICAgICAgcl9oYXNoX2ZuLCByX2NvbWJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4sIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4sIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmIHJfcmVzaXplX3BvbGljeSkgOgorICBQQl9EU19IQVNIX0VRX0ZOX0NfREVDKHJfZXFfZm4pLAorICBSZXNpemVfUG9saWN5KHJfcmVzaXplX3BvbGljeSksCisgIHJhbmdlZF9oYXNoX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLAorCQkgICAgICByX2hhc2hfZm4sIHJfY29tYl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X3BvaW50ZXJfYWxsb2NhdG9yLmFsbG9jYXRlKG1fbnVtX2UpKQoreworICBpbml0aWFsaXplKCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZGVidWdfYmFzZShvdGhlciksCisjZW5kaWYgCisgIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMob3RoZXIpLAorICByZXNpemVfYmFzZShvdGhlciksIHJhbmdlZF9oYXNoX2ZuX2Jhc2Uob3RoZXIpLAorICBtX251bV9lKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksIG1fbnVtX3VzZWRfZSgwKSwKKyAgbV9lbnRyaWVzKHNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9fdHJ5CisgICAgICB7CisgICAgICAgIGNvcHlfZnJvbV9yYW5nZShvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSk7CisgICAgICB9CisgICAgX19jYXRjaCguLi4pCisgICAgICB7CisgICAgICAgIGRlYWxsb2NhdGVfYWxsKCk7CisgICAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgfQorICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfQ0xBU1NfTkFNRSgpCit7IGRlYWxsb2NhdGVfYWxsKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKSk7CisKKyAgc3RkOjpzd2FwKG1fZW50cmllcywgb3RoZXIubV9lbnRyaWVzKTsKKyAgc3RkOjpzd2FwKG1fbnVtX2UsIG90aGVyLm1fbnVtX2UpOworICBzdGQ6OnN3YXAobV9udW1fdXNlZF9lLCBvdGhlci5tX251bV91c2VkX2UpOworICByYW5nZWRfaGFzaF9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgaGFzaF9lcV9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgcmVzaXplX2Jhc2U6OnN3YXAob3RoZXIpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcikpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitkZWFsbG9jYXRlX2FsbCgpCit7CisgIGNsZWFyKCk7CisgIHNfZW50cnlfcG9pbnRlcl9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX2VudHJpZXMsIG1fbnVtX2UpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7CisgIHN0ZDo6ZmlsbChtX2VudHJpZXMsIG1fZW50cmllcyArIG1fbnVtX2UsIGVudHJ5X3BvaW50ZXIoMCkpOworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChtX251bV9lKTsKKyAgUmVzaXplX1BvbGljeTo6bm90aWZ5X2NsZWFyZWQoKTsKKyAgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobV9udW1fZSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMWNjZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLAorICogICAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29uc3RydWN0b3JfaW5zZXJ0X25ld19pbXAoY29uc3RfbWFwcGVkX3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcywgCisJCQkgICBmYWxzZV90eXBlKQoreworICAvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBlbnRyeV9wb2ludGVyIHAgPSBnZXRfZW50cnkocl92YWwsIHRyYWl0c19iYXNlOjpzX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisgIC8vIEF0IHRoaXMgcG9pbnQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgorICBwLT5tX3BfbmV4dCA9IG1fZW50cmllc1twb3NdOworICBtX2VudHJpZXNbcG9zXSA9IHA7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhyX2tleSk7KQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI2ZmExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvciwKKyAqICAgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvbnN0cnVjdG9yX2luc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcywgdHJ1ZV90eXBlKQoreworICAvLyBGb2xsb3dpbmcgbGluZXMgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBlbnRyeV9wb2ludGVyIHAgPSBnZXRfZW50cnkocl92YWwsIHRyYWl0c19iYXNlOjpzX25vX3Rocm93X2NvcGllc19pbmRpY2F0b3IpOworCisgIC8vIEF0IHRoaXMgcG9pbnQgbm8gZXhjZXB0aW9ucyBjYW4gYmUgdGhyb3duLgorICBwLT5tX3BfbmV4dCA9IG1fZW50cmllc1twb3NdOworICBwLT5tX2hhc2ggPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKChjb25zdF9rZXlfcmVmZXJlbmNlKShQQl9EU19WMkYocC0+bV92YWx1ZSkpKS5zZWNvbmQ7CisKKyAgbV9lbnRyaWVzW3Bvc10gPSBwOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcocl9rZXkpOykKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmVkN2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShtX251bV91c2VkX2UpOworICBhc3NlcnRfZW50cnlfcG9pbnRlcl9hcnJheV92YWxpZChtX2VudHJpZXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X3BvaW50ZXJfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlcl9hcnJheSBhX3BfZW50cmllcykgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGl0ZXJhdGVkX251bV91c2VkX2UgPSAwOworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfZSA9IGFfcF9lbnRyaWVzW3Bvc107CisgICAgICB3aGlsZSAocF9lICE9IDApCisgICAgICAgIHsKKwkgICsraXRlcmF0ZWRfbnVtX3VzZWRfZTsKKwkgIGFzc2VydF9lbnRyeV9wb2ludGVyX3ZhbGlkKHBfZSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKwkgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgICAgIH0KKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdGVyYXRlZF9udW1fdXNlZF9lID09IG1fbnVtX3VzZWRfZSk7Cit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBiZWQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfZW50cnlfcG9pbnRlcl92YWxpZChjb25zdCBlbnRyeV9wb2ludGVyIHAsIGZhbHNlX3R5cGUpIGNvbnN0Cit7IGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKHAtPm1fdmFsdWUpKTsgfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2RlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxNzY3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2VudHJ5X3BvaW50ZXJfdmFsaWQoY29uc3QgZW50cnlfcG9pbnRlciBwX2UsIHRydWVfdHlwZSkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSk7CisgIGNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2UtPm1faGFzaCA9PSBwb3NfaGFzaF9wYWlyLnNlY29uZCk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZW50cnlfbGlzdF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZW50cnlfbGlzdF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk5OTExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lbnRyeV9saXN0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsOTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGVudHJ5X2xpc3RfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZW50cnktbGlzdCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZGVhbGxvY2F0ZV9saW5rc19pbl9saXN0KGVudHJ5X3BvaW50ZXIgcF9lKQoreworICB3aGlsZSAocF9lICE9IDApCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX2RlYWxsb2NfZSA9IHBfZTsKKyAgICAgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfZGVhbGxvY19lLCAxKTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9lbnRyeShjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHRydWVfdHlwZSkKK3sKKyAgLy8gRm9sbG93aW5nIGxpbmUgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBlbnRyeV9wb2ludGVyIHBfZSA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCisgIC8vIEZvbGxvd2luZyBsaW5lcyogY2Fubm90KiB0aHJvdyBhbiBleGNlcHRpb24uCisgIG5ldyAoJnBfZS0+bV92YWx1ZSkgdmFsdWVfdHlwZShyX3ZhbCk7CisgIHJldHVybiBwX2U7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9lbnRyeShjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCit7CisgIC8vIEZvbGxvd2luZyBsaW5lIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgZW50cnlfcG9pbnRlciBwX2UgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgY29uZF9kZWFsdG9yX3QgY29uZChwX2UpOworCisgIC8vIEZvbGxvd2luZyBsaW5lcyBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgIG5ldyAoJnBfZS0+bV92YWx1ZSkgdmFsdWVfdHlwZShyX3ZhbCk7CisgIGNvbmQuc2V0X25vX2FjdGlvbigpOworICByZXR1cm4gcF9lOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbHNfZW50cnkoZW50cnlfcG9pbnRlciBwX2UpCit7CisgIC8vIFRoZSBmb2xsb3dpbmcgbGluZXMgY2Fubm90IHRocm93IGV4Y2VwdGlvbnMgKHVubGVzcyBpZiBrZXktZGF0YSBkdG9ycyBkbykuCisgIHBfZS0+bV92YWx1ZS5+dmFsdWVfdHlwZSgpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfZSwgMSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZmViZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlcmFzZSByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2VudHJ5X3BvaW50ZXIoZW50cnlfcG9pbnRlciYgcl9wX2UpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6ZXJhc2VfZXhpc3RpbmcoUEJfRFNfVjJGKHJfcF9lLT5tX3ZhbHVlKSkpOworCisgIGVudHJ5X3BvaW50ZXIgcF9lID0gcl9wX2U7CisgIHJfcF9lID0gcl9wX2UtPm1fcF9uZXh0OworICByZWxzX2VudHJ5KHBfZSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX251bV91c2VkX2UgPiAwKTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZWQoLS1tX251bV91c2VkX2UpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIHNpemVfdHlwZSBudW1fZXJzZCA9IDA7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG1fbnVtX2U7ICsrcG9zKQorICAgIHsKKyAgICAgIHdoaWxlIChtX2VudHJpZXNbcG9zXSAhPSAwICYmIHByZWQobV9lbnRyaWVzW3Bvc10tPm1fdmFsdWUpKQorICAgICAgICB7CisJICArK251bV9lcnNkOworCSAgZW50cnlfcG9pbnRlciBwX25leHRfZSA9IG1fZW50cmllc1twb3NdLT5tX3BfbmV4dDsKKwkgIGVyYXNlX2VudHJ5X3BvaW50ZXIobV9lbnRyaWVzW3Bvc10pOworCSAgbV9lbnRyaWVzW3Bvc10gPSBwX25leHRfZTsKKyAgICAgICAgfQorCisgICAgICBlbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1twb3NdOworICAgICAgd2hpbGUgKHBfZSAhPSAwICYmIHBfZS0+bV9wX25leHQgIT0gMCkKKyAgICAgICAgeworCSAgaWYgKHByZWQocF9lLT5tX3BfbmV4dC0+bV92YWx1ZSkpCisgICAgICAgICAgICB7CisJICAgICAgKytudW1fZXJzZDsKKwkgICAgICBlcmFzZV9lbnRyeV9wb2ludGVyKHBfZS0+bV9wX25leHQpOworICAgICAgICAgICAgfQorCSAgZWxzZQorCSAgICBwX2UgPSBwX2UtPm1fcF9uZXh0OworICAgICAgICB9CisgICAgfQorCisgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgcmV0dXJuIG51bV9lcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB3aGlsZSAobV9lbnRyaWVzW3Bvc10gIT0gMCkKKyAgICAgIGVyYXNlX2VudHJ5X3BvaW50ZXIobV9lbnRyaWVzW3Bvc10pOworICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfY2xlYXJlZCgpOworfQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MTNlOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwMSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlcmFzZSByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgbm90IHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICByZXR1cm4gZXJhc2VfaW5fcG9zX2ltcChyX2tleSwgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2luX3Bvc19pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgc2l6ZV90eXBlIHBvcykKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc107CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisgIGlmIChwX2UgPT0gMCkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTspCisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgIHsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjogY2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7KQorICAgICAgZXJhc2VfZW50cnlfcG9pbnRlcihtX2VudHJpZXNbcG9zXSk7CisgICAgICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfbmV4dF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICAgIGlmIChwX25leHRfZSA9PSAwKQorICAgICAgICB7CisJICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTspCisgICAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmV4dF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgICB7CisJICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7KQorICAgICAgICAgIGVyYXNlX2VudHJ5X3BvaW50ZXIocF9lLT5tX3BfbmV4dCk7CisJICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisJICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgICBwX2UgPSBwX25leHRfZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIxYWNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsOTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGVyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZXJhc2UgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2luX3Bvc19pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgY29uc3QgY29tcF9oYXNoJiByX3Bvc19oYXNoX3BhaXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBlbnRyeV9wb2ludGVyIHBfZSA9IG1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdOworICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpOworICBpZiAocF9lID09IDApCisgICAgeworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OiBjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qocl9rZXkpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICBpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLCBwX2UtPm1faGFzaCwKKwkJCQkgIHJfa2V5LCByX3Bvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICB7CisgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7KQorICAgICAgZXJhc2VfZW50cnlfcG9pbnRlcihtX2VudHJpZXNbcl9wb3NfaGFzaF9wYWlyLmZpcnN0XSk7CisgICAgICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfbmV4dF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICAgIGlmIChwX25leHRfZSA9PSAwKQorICAgICAgICB7CisJICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTspCisgICAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmV4dF9lLT5tX3ZhbHVlKSwKKwkJCQkgICAgICBwX25leHRfZS0+bV9oYXNoLCByX2tleSwKKwkJCQkgICAgICByX3Bvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICAgICAgeworCSAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXkpOykKKyAgICAgICAgICBlcmFzZV9lbnRyeV9wb2ludGVyKHBfZS0+bV9wX25leHQpOworCSAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworCSAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworICAgICAgcF9lID0gcF9uZXh0X2U7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4NDk0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBmaW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGZpbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIHJldHVybiBmaW5kX2tleV9wb2ludGVyKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmID4oKnRoaXMpLmZpbmRfa2V5X3BvaW50ZXIocl9rZXksIAorCQkJCQl0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9lbmQoKQoreyByZXR1cm4gMDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9lbmQoKSBjb25zdAoreyByZXR1cm4gMDsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjUxYzkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2ZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBmaW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgZmluZCByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgc3RvcmVkLgorICovCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQyOTk2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGVudGlyZSBjb250YWluZXIgaW5mbyByZWxhdGVkCisgKiBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sgcmV0dXJuIG1fbnVtX3VzZWRfZTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIG1fZW50cnlfYWxsb2NhdG9yLm1heF9zaXplKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiAoc2l6ZSgpID09IDApOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcl9IVF9NYXBfVHlwZT4KK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yPT0oY29uc3QgT3RoZXJfSFRfTWFwX1R5cGUmIG90aGVyKSBjb25zdAoreyByZXR1cm4gY21wX3dpdGhfb3RoZXIob3RoZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdGhlcl9NYXBfVHlwZT4KK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NtcF93aXRoX290aGVyKGNvbnN0IE90aGVyX01hcF9UeXBlJiBvdGhlcikgY29uc3QKK3sKKyAgaWYgKHNpemUoKSAhPSBvdGhlci5zaXplKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodHlwZW5hbWUgT3RoZXJfTWFwX1R5cGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gb3RoZXIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBvdGhlci5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICBjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5ID0oY29uc3Rfa2V5X3JlZmVyZW5jZSlQQl9EU19WMkYoKml0KTsKKyAgICAgIGNvbnN0X21hcHBlZF9wb2ludGVyIHBfbWFwcGVkX3ZhbHVlID0KKwljb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDJiA+KCp0aGlzKS4KKwlmaW5kX2tleV9wb2ludGVyKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisgICAgICBpZiAocF9tYXBwZWRfdmFsdWUgPT0gMCkKKwlyZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpZiAocF9tYXBwZWRfdmFsdWUtPnNlY29uZCAhPSBpdC0+c2Vjb25kKQorCXJldHVybiBmYWxzZTsKKyNlbmRpZiAKKyAgICB9CisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJfSFRfTWFwX1R5cGU+Citib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvciE9KGNvbnN0IE90aGVyX0hUX01hcF9UeXBlJiBvdGhlcikgY29uc3QKK3sgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjc5ZGJlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGluc2VydCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTQyZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGluc2VydCByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgbm90IHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnRfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkgPSBQQl9EU19WMkYocl92YWwpOworICBjb25zdCBzaXplX3R5cGUgcG9zID0gcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc107CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgIHdoaWxlIChwX2UgIT0gMCAmJiAhaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLCAKKwkJCQkJCSAgICAgcl9rZXkpKQorICAgIHsKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKyAgICAgIHBfZSA9IHBfZS0+bV9wX25leHQ7CisgICAgfQorCisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKyAgaWYgKHBfZSAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSk7KQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCZwX2UtPm1fdmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qocl9rZXkpOykKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGluc2VydF9uZXdfaW1wKHJfdmFsLCBwb3MpLCB0cnVlKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiMGJkYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgaW5zZXJ0IHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHRydWVfdHlwZSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGNvbnN0X2tleV9yZWZlcmVuY2Uga2V5ID0gUEJfRFNfVjJGKHJfdmFsKTsKKyAgY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSk7CisgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc19oYXNoX3BhaXIuZmlyc3RdOworICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICB3aGlsZSAocF9lICE9IDAgJiYgIWhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwKKwkJCQkJCSAgICAgcF9lLT5tX2hhc2gsCisJCQkJCQkgICAga2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpCisgICAgeworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworICAgICAgcF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgICB9CisKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICBpZiAocF9lICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKGtleSk7KQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCZwX2UtPm1fdmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qoa2V5KTspCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X2ltcChyX3ZhbCwgcG9zX2hhc2hfcGFpciksIHRydWUpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NTkyYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDgzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgaXRlcmF0b3JzIHJlbGF0ZWQgZnVuY3Rpb25zLCBlLmcuLAorICogYmVnaW4oKS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19lbmRfaXQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2NvbnN0X2VuZF9pdDsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkKK3sKKyAgcG9pbnRlciBwX3ZhbHVlOworICBzdGQ6OnBhaXI8ZW50cnlfcG9pbnRlciwgc2l6ZV90eXBlPiBwb3M7CisgIGdldF9zdGFydF9pdF9zdGF0ZShwX3ZhbHVlLCBwb3MpOworICByZXR1cm4gaXRlcmF0b3IocF92YWx1ZSwgcG9zLCB0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7IHJldHVybiBzX2VuZF9pdDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICBwb2ludGVyIHBfdmFsdWU7CisgIHN0ZDo6cGFpcjxlbnRyeV9wb2ludGVyLCBzaXplX3R5cGU+IHBvczsKKyAgZ2V0X3N0YXJ0X2l0X3N0YXRlKHBfdmFsdWUsIHBvcyk7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcihwX3ZhbHVlLCBwb3MsIHRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIHNfY29uc3RfZW5kX2l0OyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTY2MWIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsODggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgcG9saWN5IGFjY2VzcworICogICAgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitIYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9oYXNoX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBIYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9oYXNoX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitFcV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZXFfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IEVxX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9lcV9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworQ29tYl9IYXNoX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jb21iX2hhc2hfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENvbWJfSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY29tYl9oYXNoX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYjgzOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJlc2l6ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemVfaWZfbmVlZGVkKCkKK3sKKyAgaWYgKCFyZXNpemVfYmFzZTo6aXNfcmVzaXplX25lZWRlZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25ld19zaXplKG1fbnVtX2UsIG1fbnVtX3VzZWRfZSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZShzaXplX3R5cGUgbGVuKQoreyByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShsZW4pKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKQoreworICBpZiAoIXJlc2l6ZV9iYXNlOjppc19yZXNpemVfbmVlZGVkKCkpCisgICAgcmV0dXJuOworCisgIF9fdHJ5CisgICAgeworICAgICAgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25ld19zaXplKG1fbnVtX2UsIG1fbnVtX3VzZWRfZSkpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeyB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGlmIChuZXdfc2l6ZSA9PSBtX251bV9lKQorICAgIHJldHVybjsKKworICBjb25zdCBzaXplX3R5cGUgb2xkX3NpemUgPSBtX251bV9lOworICBlbnRyeV9wb2ludGVyX2FycmF5IGFfcF9lbnRyaWVzX3Jlc2l6ZWQ7CisKKyAgLy8gRm9sbG93aW5nIGxpbmUgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICByYW5nZWRfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisKKyAgX190cnkKKyAgICB7CisgICAgICAvLyBGb2xsb3dpbmcgbGluZSBtaWdodCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICBhX3BfZW50cmllc19yZXNpemVkID0gc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICBtX251bV9lID0gbmV3X3NpemU7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICByYW5nZWRfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChvbGRfc2l6ZSk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgLy8gQXQgdGhpcyBwb2ludCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCisgIHJlc2l6ZV9pbXBfbm9fZXhjZXB0aW9ucyhuZXdfc2l6ZSwgYV9wX2VudHJpZXNfcmVzaXplZCwgb2xkX3NpemUpOworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9ub19leGNlcHRpb25zKHNpemVfdHlwZSBuZXdfc2l6ZSwgZW50cnlfcG9pbnRlcl9hcnJheSBhX3BfZW50cmllc19yZXNpemVkLCBzaXplX3R5cGUgb2xkX3NpemUpCit7CisgIHN0ZDo6ZmlsbChhX3BfZW50cmllc19yZXNpemVkLCBhX3BfZW50cmllc19yZXNpemVkICsgbV9udW1fZSwKKwkgICAgZW50cnlfcG9pbnRlcigwKSk7CisKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgb2xkX3NpemU7ICsrcG9zKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gbV9lbnRyaWVzW3Bvc107CisgICAgICB3aGlsZSAocF9lICE9IDApCisJcF9lID0gcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIocF9lLCBhX3BfZW50cmllc19yZXNpemVkLCAgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKyAgICB9CisKKyAgbV9udW1fZSA9IG5ld19zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9lbnRyeV9wb2ludGVyX2FycmF5X3ZhbGlkKGFfcF9lbnRyaWVzX3Jlc2l6ZWQpOykKKyAgc19lbnRyeV9wb2ludGVyX2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fZW50cmllcywgb2xkX3NpemUpOworICBtX2VudHJpZXMgPSBhX3BfZW50cmllc19yZXNpemVkOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc3NjMwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMsIHdoZW4gdGhlCisgKiAgICBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIoZW50cnlfcG9pbnRlciBwX2UsIGVudHJ5X3BvaW50ZXJfYXJyYXkgYV9wX2VudHJpZXNfcmVzaXplZCwgZmFsc2VfdHlwZSkKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIGhhc2hfcG9zID0KKyAgICByYW5nZWRfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTsKKworICBlbnRyeV9wb2ludGVyIGNvbnN0IHBfbmV4dF9lID0gcF9lLT5tX3BfbmV4dDsKKyAgcF9lLT5tX3BfbmV4dCA9IGFfcF9lbnRyaWVzX3Jlc2l6ZWRbaGFzaF9wb3NdOworICBhX3BfZW50cmllc19yZXNpemVkW2hhc2hfcG9zXSA9IHBfZTsKKyAgcmV0dXJuIHBfbmV4dF9lOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhZGI2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmVzaXplX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBjY19odF9tYXBfJ3MgcmVzaXplIHJlbGF0ZWQgZnVuY3Rpb25zLCB3aGVuIHRoZQorICogICAgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9ub19leGNlcHRpb25zX3JlYXNzaWduX3BvaW50ZXIoZW50cnlfcG9pbnRlciBwX2UsIGVudHJ5X3BvaW50ZXJfYXJyYXkgYV9wX2VudHJpZXNfcmVzaXplZCwgdHJ1ZV90eXBlKQoreworICBjb25zdCBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9CisgICAgcmFuZ2VkX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcF9lLT5tX2hhc2gpOworCisgIGVudHJ5X3BvaW50ZXIgY29uc3QgcF9uZXh0X2UgPSBwX2UtPm1fcF9uZXh0OworICBwX2UtPm1fcF9uZXh0ID0gYV9wX2VudHJpZXNfcmVzaXplZFtwb3NfaGFzaF9wYWlyLmZpcnN0XTsKKyAgYV9wX2VudHJpZXNfcmVzaXplZFtwb3NfaGFzaF9wYWlyLmZpcnN0XSA9IHBfZTsKKyAgcmV0dXJuIHBfbmV4dF9lOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9zaXplX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9zaXplX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWVjODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3NpemVfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2l6ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyBlbnRpcmUgY29udGFpbmVyIHNpemUgcmVsYXRlZAorICogICAgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBtX251bV91c2VkX2U7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlbXB0eSgpIGNvbnN0Cit7IHJldHVybiAoc2l6ZSgpID09IDApOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc19lbnRyeV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3N0YW5kYXJkX3BvbGljaWVzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jY19oYXNoX3RhYmxlX21hcF8vc3RhbmRhcmRfcG9saWNpZXMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzFlZTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3N0YW5kYXJkX3BvbGljaWVzLmhwcApAQCAtMCwwICsxLDQ2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzdGFuZGFyZF9wb2xpY2llcy5ocHAKKyAqIENvbnRhaW5zIHN0YW5kYXJkIHBvbGljaWVzIGZvciBjY19odF9tYXAgdHlwZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19DQ19IVF9NQVBfU1RBTkRBUkRfUE9MSUNJRVNfSFBQCisjZGVmaW5lIFBCX0RTX0NDX0hUX01BUF9TVEFOREFSRF9QT0xJQ0lFU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwPgorCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19DQ19IVF9NQVBfU1RBTkRBUkRfUE9MSUNJRVNfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY2NfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc5NzdkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGNjX2h0X21hcF8ncyB0cmFjZS1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2UoKSBjb25zdAoreworICBzdGQ6OmNlcnIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9udW1fZSkgPDwgIiAiIAorCSAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX251bV91c2VkX2UpIDw8IHN0ZDo6ZW5kbDsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaSkgPDwgIiAiOworICAgICAgdHJhY2VfbGlzdChtX2VudHJpZXNbaV0pOworICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9saXN0KGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9sKSBjb25zdAoreworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtX3VzZWRfZSA9IDA7CisgIHdoaWxlIChwX2wgIT0gMCkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgUEJfRFNfVjJGKHBfbC0+bV92YWx1ZSkgPDwgIiAiOworICAgICAgcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgICB9Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNDhhMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwCkBAIC0wLDAgKzEsMTI1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25kX2RlYWx0b3IuaHBwCisgKiBDb250YWlucyBhIGNvbmRpdGlvbmFsIGRlYWxsb2NhdG9yLgorICovCisKKyNpZm5kZWYgUEJfRFNfQ09ORF9ERUFMVE9SX0hQUAorI2RlZmluZSBQQl9EU19DT05EX0RFQUxUT1JfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ09ORF9ERUFMVE9SX0NMQVNTX1RfREVDCQlcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRW50cnksIGNsYXNzIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19DT05EX0RFQUxUT1JfQ0xBU1NfQ19ERUMJCQkJXAorICAgIGNvbmRfZGVhbHRvcjwJCQkJCQlcCisJCQkJCQlFbnRyeSwJCVwKKwkJCQkJCUFsbG9jYXRvcj4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEVudHJ5LCBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgY29uZF9kZWFsdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPEVudHJ5Pjo6b3RoZXIKKyAgICAgIGVudHJ5X2FsbG9jYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnBvaW50ZXIgZW50cnlfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIGlubGluZQorICAgICAgY29uZF9kZWFsdG9yKGVudHJ5X3BvaW50ZXIgcF9lKTsKKworICAgICAgaW5saW5lCisgICAgICB+Y29uZF9kZWFsdG9yKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzZXRfbm9fYWN0aW9uKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgZW50cnlfcG9pbnRlciBtX3BfZTsKKworICAgICAgYm9vbCBtX25vX2FjdGlvbl9kZXN0cnVjdG9yOworCisgICAgICBzdGF0aWMgZW50cnlfYWxsb2NhdG9yIHNfYWxsb2M7CisgICAgfTsKKworICAgIFBCX0RTX0NPTkRfREVBTFRPUl9DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NPTkRfREVBTFRPUl9DTEFTU19DX0RFQzo6ZW50cnlfYWxsb2NhdG9yCisgICAgUEJfRFNfQ09ORF9ERUFMVE9SX0NMQVNTX0NfREVDOjpzX2FsbG9jOworCisgICAgUEJfRFNfQ09ORF9ERUFMVE9SX0NMQVNTX1RfREVDCisgICAgaW5saW5lCisgICAgUEJfRFNfQ09ORF9ERUFMVE9SX0NMQVNTX0NfREVDOjoKKyAgICBjb25kX2RlYWx0b3IoZW50cnlfcG9pbnRlciBwX2UpIDoKKyAgICAgIG1fcF9lKHBfZSksCisgICAgICBtX25vX2FjdGlvbl9kZXN0cnVjdG9yKGZhbHNlKQorICAgIHsgfQorCisgICAgUEJfRFNfQ09ORF9ERUFMVE9SX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DT05EX0RFQUxUT1JfQ0xBU1NfQ19ERUM6OgorICAgIHNldF9ub19hY3Rpb24oKQorICAgIHsKKyAgICAgIG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IgPSB0cnVlOworICAgIH0KKworICAgIFBCX0RTX0NPTkRfREVBTFRPUl9DTEFTU19UX0RFQworICAgIGlubGluZQorICAgIFBCX0RTX0NPTkRfREVBTFRPUl9DTEFTU19DX0RFQzo6CisgICAgfmNvbmRfZGVhbHRvcigpCisgICAgeworICAgICAgaWYgKG1fbm9fYWN0aW9uX2Rlc3RydWN0b3IpCisgICAgICAgIHJldHVybjsKKworICAgICAgc19hbGxvYy5kZWFsbG9jYXRlKG1fcF9lLCAxKTsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DT05EX0RFQUxUT1JfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DT05EX0RFQUxUT1JfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19DT05EX0RFQUxUT1JfSFBQCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM5OTg4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcyBhcHBsaWNhYmxlIHRvIGRpZmZlcmVudCBjb250YWluZXJzLgorICovCisKK2lubGluZQorUEJfRFNfQ0xBU1NfTkFNRSgpCit7IH0KKworaW5saW5lCitQQl9EU19DTEFTU19OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX05BTUUmIG90aGVyKSAKKzogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmKW90aGVyKQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwPgoraW5saW5lCitQQl9EU19DTEFTU19OQU1FKFQwIHQwKSA6IGJhc2VfdHlwZSh0MCkKK3sgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+CitpbmxpbmUKK1BCX0RTX0NMQVNTX05BTUUoVDAgdDAsIFQxIHQxKSA6IGJhc2VfdHlwZSh0MCwgdDEpCit7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2lubGluZQorUEJfRFNfQ0xBU1NfTkFNRShUMCB0MCwgVDEgdDEsIFQyIHQyKSA6IGJhc2VfdHlwZSh0MCwgdDEsIHQyKQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgoraW5saW5lCitQQl9EU19DTEFTU19OQU1FKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzKSAKKzogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzKQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KK2lubGluZQorUEJfRFNfQ0xBU1NfTkFNRShUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQpIAorOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0KQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgdHlwZW5hbWUgVDU+CitpbmxpbmUKK1BCX0RTX0NMQVNTX05BTUUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSkgCis6IGJhc2VfdHlwZSh0MCwgdDEsIHQyLCB0MywgdDQsIHQ1KQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2PgoraW5saW5lCitQQl9EU19DTEFTU19OQU1FKFQwIHQwLCBUMSB0MSwgVDIgdDIsIFQzIHQzLCBUNCB0NCwgVDUgdDUsIFQ2IHQ2KSAKKzogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2KQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNz4KK2lubGluZQorUEJfRFNfQ0xBU1NfTkFNRShUMCB0MCwgVDEgdDEsIFQyIHQyLCBUMyB0MywgVDQgdDQsIFQ1IHQ1LCBUNiB0NiwgVDcgdDcpIAorOiBiYXNlX3R5cGUodDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3KQoreyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKwkgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDg+CitpbmxpbmUKK1BCX0RTX0NMQVNTX05BTUUoVDAgdDAsIFQxIHQxLCBUMiB0MiwgVDMgdDMsIFQ0IHQ0LCBUNSB0NSwgVDYgdDYsIFQ3IHQ3LCBUOCB0OCkKKzogYmFzZV90eXBlKHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDgpCit7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9jb250YWluZXJfYmFzZV9kaXNwYXRjaC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2guaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGQ4N2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2guaHBwCkBAIC0wLDAgKzEsMzMyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb250YWluZXJfYmFzZV9kaXNwYXRjaC5ocHAKKyAqIENvbnRhaW5zIGFuIGFzc29jaWF0aXZlIGNvbnRhaW5lciBkaXNwYXRjaGluZyBiYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfQVNTT0NfQ05UTlJfQkFTRV9EU19ESVNQQVRDSEVSX0hQUAorI2RlZmluZSBQQl9EU19BU1NPQ19DTlROUl9CQVNFX0RTX0RJU1BBVENIRVJfSFBQCisKKyNpbmNsdWRlIDxleHQvdHlwZWxpc3QuaD4KKworI2RlZmluZSBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKworI2RlZmluZSBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9sdV9tYXBfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorCisjZGVmaW5lIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHA+CisjdW5kZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCisjZGVmaW5lIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vcmJfdHJlZV8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisKKyNkZWZpbmUgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKworI2RlZmluZSBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsYXlfdHJlZV8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisKKyNkZWZpbmUgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL292X3RyZWVfbWFwXy5ocHA+CisjdW5kZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCisjZGVmaW5lIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorCisjZGVmaW5lIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisKKyNkZWZpbmUgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NjX2hhc2hfdGFibGVfbWFwXy9jY19odF9tYXBfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorCisjZGVmaW5lIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisKKyNkZWZpbmUgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcD4KKyN1bmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorCisjZGVmaW5lIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV8uaHBwPgorI3VuZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKworI2RlZmluZSBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BhdF90cmllXy5ocHA+CisjdW5kZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKyAgLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIERhdGFfU3RydWN0dXJlX1RhcSwKKwkgICB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIE1hcHBlZCwgdHlwZW5hbWUgUG9saWN5X1RsLCB0eXBlbmFtZSBBbGxvYz4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBNYXBwZWQsIGxpc3RfdXBkYXRlX3RhZywgCisJCQkJICAgUG9saWN5X1RsLCBBbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGx1X21hcF9kYXRhXzxLZXksIE1hcHBlZCwgYXQwdCwgQWxsb2MsIGF0MXQ+CXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgQWxsb2M+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgbGlzdF91cGRhdGVfdGFnLAorCQkJCSAgIFBvbGljeV9UbCwgQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBsdV9tYXBfbm9fZGF0YV88S2V5LCBudWxsX21hcHBlZF90eXBlLCBhdDB0LCBBbGxvYywgYXQxdD4gdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgcGF0X3RyaWVfdGFnLCBQb2xpY3lfVGwsIEFsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcGF0X3RyaWVfZGF0YV88S2V5LCBNYXBwZWQsIGF0MXQsIEFsbG9jPiAJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgQWxsb2M+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgcGF0X3RyaWVfdGFnLAorCQkJCSAgIFBvbGljeV9UbCwgQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBwYXRfdHJpZV9ub19kYXRhXzxLZXksIG51bGxfbWFwcGVkX3R5cGUsIGF0MXQsIEFsbG9jPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgQWxsb2M+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCByYl90cmVlX3RhZywgUG9saWN5X1RsLCBBbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJiX3RyZWVfZGF0YV88S2V5LCBNYXBwZWQsIGF0MHQsIGF0MXQsIEFsbG9jPiAJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgUG9saWN5X1RsLCB0eXBlbmFtZSBBbGxvYz4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX21hcHBlZF90eXBlLCByYl90cmVlX3RhZywKKwkJCQkgICBQb2xpY3lfVGwsIEFsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgcmJfdHJlZV9ub19kYXRhXzxLZXksIG51bGxfbWFwcGVkX3R5cGUsIGF0MHQsIGF0MXQsIEFsbG9jPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgQWxsb2M+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBzcGxheV90cmVlX3RhZywgCisJCQkJICAgUG9saWN5X1RsLCBBbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNwbGF5X3RyZWVfZGF0YV88S2V5LCBNYXBwZWQsIGF0MHQsIGF0MXQsIEFsbG9jPiAJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgUG9saWN5X1RsLCB0eXBlbmFtZSBBbGxvYz4KKyAgICBzdHJ1Y3QgY29udGFpbmVyX2Jhc2VfZGlzcGF0Y2g8S2V5LCBudWxsX21hcHBlZF90eXBlLCBzcGxheV90cmVlX3RhZywKKwkJCQkgICBQb2xpY3lfVGwsIEFsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgc3BsYXlfdHJlZV9ub19kYXRhXzxLZXksIG51bGxfbWFwcGVkX3R5cGUsIGF0MHQsIGF0MXQsIEFsbG9jPiB0eXBlOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIE1hcHBlZCwgb3ZfdHJlZV90YWcsIFBvbGljeV9UbCwgQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBvdl90cmVlX2RhdGFfPEtleSwgTWFwcGVkLCBhdDB0LCBhdDF0LCBBbGxvYz4gCXR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfbWFwcGVkX3R5cGUsIG92X3RyZWVfdGFnLAorCQkJCSAgIFBvbGljeV9UbCwgQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBvdl90cmVlX25vX2RhdGFfPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgYXQwdCwgYXQxdCwgQWxsb2M+IHR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgQWxsb2M+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBjY19oYXNoX3RhZywgUG9saWN5X1RsLCBBbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMj4JYXQyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDI6OnR5cGUJCQkgICAgCWF0MnQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMz4JYXQzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDM6OnR5cGUJCQkJYXQzdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCA0PiAJYXQ0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDQ6OnR5cGUJCQkgICAgCWF0NHQ7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGNjX2h0X21hcF9kYXRhXzxLZXksIE1hcHBlZCwgYXQwdCwgYXQxdCwgQWxsb2MsIGF0M3Q6OnZhbHVlLCAKKwkJCSAgICAgIGF0NHQsIGF0MnQ+IAkJCXR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfbWFwcGVkX3R5cGUsIGNjX2hhc2hfdGFnLCAKKwkJCQkgICBQb2xpY3lfVGwsIEFsbG9jPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDA+CWF0MDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQwOjp0eXBlCQkJICAgIAlhdDB0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDE+IAlhdDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MTo6dHlwZQkJCSAgICAJYXQxdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAyPglhdDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mjo6dHlwZQkJCSAgICAJYXQydDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAzPglhdDM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0Mzo6dHlwZQkJCQlhdDN0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDQ+IAlhdDQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NDo6dHlwZQkJCSAgICAJYXQ0dDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgY2NfaHRfbWFwX25vX2RhdGFfPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgYXQwdCwgYXQxdCwgQWxsb2MsIAorCQkJCSBhdDN0Ojp2YWx1ZSwgYXQ0dCwgYXQydD4gICAgCXR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIFBvbGljeV9UbCwgdHlwZW5hbWUgQWxsb2M+CisgICAgc3RydWN0IGNvbnRhaW5lcl9iYXNlX2Rpc3BhdGNoPEtleSwgTWFwcGVkLCBncF9oYXNoX3RhZywgUG9saWN5X1RsLCBBbGxvYz4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAwPglhdDA7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0MDo6dHlwZQkJCSAgICAJYXQwdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCAxPiAJYXQxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDE6OnR5cGUJCQkgICAgCWF0MXQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMj4JYXQyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDI6OnR5cGUJCQkgICAgCWF0MnQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMz4JYXQzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDM6OnR5cGUJCQkJYXQzdDsKKyAgICAgIHR5cGVkZWYgX19nbnVfY3h4Ojp0eXBlbGlzdDo6YXRfaW5kZXg8UG9saWN5X1RsLCA0PiAJYXQ0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDQ6OnR5cGUJCQkgICAgCWF0NHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgNT4gCWF0NTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQ1Ojp0eXBlCQkJICAgIAlhdDV0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBncF9odF9tYXBfZGF0YV88S2V5LCBNYXBwZWQsIGF0MHQsIGF0MXQsIEFsbG9jLCBhdDN0Ojp2YWx1ZSwgCisJCQkgICAgICBhdDR0LCBhdDV0LCBhdDJ0PiAJCXR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBQb2xpY3lfVGwsIHR5cGVuYW1lIEFsbG9jPgorICAgIHN0cnVjdCBjb250YWluZXJfYmFzZV9kaXNwYXRjaDxLZXksIG51bGxfbWFwcGVkX3R5cGUsIGdwX2hhc2hfdGFnLAorCQkJCSAgIFBvbGljeV9UbCwgQWxsb2M+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMD4JYXQwOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhdDA6OnR5cGUJCQkgICAgCWF0MHQ7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgMT4gCWF0MTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQxOjp0eXBlCQkJICAgIAlhdDF0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDI+CWF0MjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQyOjp0eXBlCQkJICAgIAlhdDJ0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDM+CWF0MzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQzOjp0eXBlCQkJCWF0M3Q7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmF0X2luZGV4PFBvbGljeV9UbCwgND4gCWF0NDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXQ0Ojp0eXBlCQkJICAgIAlhdDR0OworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnR5cGVsaXN0OjphdF9pbmRleDxQb2xpY3lfVGwsIDU+IAlhdDU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGF0NTo6dHlwZQkJCSAgICAJYXQ1dDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgZ3BfaHRfbWFwX25vX2RhdGFfPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgYXQwdCwgYXQxdCwgQWxsb2MsCisJCQkJIGF0M3Q6OnZhbHVlLCBhdDR0LCBhdDV0LCBhdDJ0Pgl0eXBlOworICB9OworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzc2MzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwCkBAIC0wLDAgKzEsMzQ2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGVidWdfbWFwX2Jhc2UuaHBwCisgKiBDb250YWlucyBhIGRlYnVnLW1vZGUgYmFzZSBmb3IgYWxsIG1hcHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfSFBQCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZXh0L3Rocm93X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vIE5lZWQgc3RkOjpwYWlyIG9zdHJlYW0gZXh0cmFjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICBpbmxpbmUgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vdXQsCisJICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgcCkKKyAgICB7IHJldHVybiAoX19vdXQgPDwgJygnIDw8IHAuZmlyc3QgPDwgJywnIDw8IHAuc2Vjb25kIDw8ICcpJyk7IH0KKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBFcV9GbiwgdHlwZW5hbWUgQ29uc3RfS2V5X1JlZmVyZW5jZT4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LCBFcV9GbiwgQ29uc3RfS2V5X1JlZmVyZW5jZT4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgY2xhc3MgRXFfRm4sIHR5cGVuYW1lIENvbnN0X0tleV9SZWZlcmVuY2U+CisgICAgY2xhc3MgZGVidWdfbWFwX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjphbGxvY2F0b3I8S2V5PiAJCWtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OnNpemVfdHlwZSAJc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBDb25zdF9LZXlfUmVmZXJlbmNlIAkJCWNvbnN0X2tleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6X0dMSUJDWFhfU1REX0M6Omxpc3Q8S2V5PiAJCWtleV9zZXQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9zZXQ6Oml0ZXJhdG9yIAkJa2V5X3NldF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X3NldDo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9rZXlfc2V0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OnRocm93X2FsbG9jYXRvcl9yYW5kb208S2V5PglrZXlfZGJfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfZGJfYWxsb2NhdG9yOjpuZXZlcl9hZGp1c3RvcgluZXZlcl9hZGp1c3RvcjsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIGRlYnVnX21hcF9iYXNlKCk7CisKKyAgICAgIGRlYnVnX21hcF9iYXNlKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIH5kZWJ1Z19tYXBfYmFzZSgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgaW5zZXJ0X25ldyhjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGVyYXNlX2V4aXN0aW5nKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpOworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgY2hlY2tfa2V5X2V4aXN0cyhjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNoZWNrX2tleV9kb2VzX25vdF9leGlzdChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNoZWNrX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENtcF9Gbj4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KGNvbnN0X2tleV9yZWZlcmVuY2UsIENtcF9GbiwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgam9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworCisgICAgICBjb25zdF9rZXlfc2V0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0OworCisgICAgICBrZXlfc2V0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpOworCisgICAgICBrZXlfc2V0IAltX2tleV9zZXQ7CisgICAgICBFcV9GbiAJbV9lcTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZGVidWdfbWFwX2Jhc2UoKQorICAgIHsgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGRlYnVnX21hcF9iYXNlKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOiBtX2tleV9zZXQob3RoZXIubV9rZXlfc2V0KQorICAgIHsgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIH5kZWJ1Z19tYXBfYmFzZSgpCisgICAgeyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBpbnNlcnRfbmV3KGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICAgIGlmIChmaW5kKHJfa2V5KSAhPSBtX2tleV9zZXQuZW5kKCkpCisJeworCSAgc3RkOjpjZXJyIDw8ICJpbnNlcnRfbmV3IGtleSBhbHJlYWR5IHByZXNlbnQgIiA8PCByX2tleSA8PCBzdGQ6OmVuZGw7CisJICBzdGQ6OmFib3J0OworCX0KKworICAgICAgbmV2ZXJfYWRqdXN0b3IgbmV2ZXI7CisgICAgICBfX3RyeQorCXsKKwkgIG1fa2V5X3NldC5wdXNoX2JhY2socl9rZXkpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIHN0ZDo6Y2VyciA8PCAiaW5zZXJ0X25ldyAiIDw8IHJfa2V5IDw8IHN0ZDo6ZW5kbDsKKwkgIHN0ZDo6YWJvcnQoKTsKKwl9CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZXJhc2VfZXhpc3RpbmcoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIGtleV9zZXRfaXRlcmF0b3IgaXQgPSBmaW5kKHJfa2V5KTsKKyAgICAgIGlmIChpdCA9PSBtX2tleV9zZXQuZW5kKCkpCisJeworCSAgc3RkOjpjZXJyIDw8ICJlcmFzZV9leGlzdGluZyIgPDwgcl9rZXkgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICAgIG1fa2V5X3NldC5lcmFzZShpdCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2xlYXIoKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgbV9rZXlfc2V0LmNsZWFyKCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGNoZWNrX2tleV9leGlzdHMoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIGlmIChmaW5kKHJfa2V5KSA9PSBtX2tleV9zZXQuZW5kKCkpCisJeworCSAgc3RkOjpjZXJyIDw8ICJjaGVja19rZXlfZXhpc3RzICIgPDwgcl9rZXkgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICBpZiAoZmluZChyX2tleSkgIT0gbV9rZXlfc2V0LmVuZCgpKQorCXsKKwkgIHVzaW5nIHN0ZDo6Y2VycjsKKwkgIHVzaW5nIHN0ZDo6ZW5kbDsKKwkgIGNlcnIgPDwgImNoZWNrX2tleV9kb2VzX25vdF9leGlzdCAiIDw8IHJfa2V5IDw8IGVuZGw7CisJICBzdGQ6OmFib3J0KCk7CisJfQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY2hlY2tfc2l6ZShzaXplX3R5cGUgc2l6ZSkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBrZXlfc2V0X3NpemUgPSBtX2tleV9zZXQuc2l6ZSgpOworICAgICAgaWYgKHNpemUgIT0ga2V5X3NldF9zaXplKQorCXsKKwkgIHN0ZDo6Y2VyciA8PCAiY2hlY2tfc2l6ZSAiIDw8IHNpemUKKwkJICAgIDw8ICIgIiA8PCBrZXlfc2V0X3NpemUgPDwgc3RkOjplbmRsOworCSAgc3RkOjphYm9ydCgpOworCX0KKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICBtX2tleV9zZXQuc3dhcChvdGhlci5tX2tleV9zZXQpOworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3Rfa2V5X3NldF9pdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICB0eXBlZGVmIGNvbnN0X2tleV9zZXRfaXRlcmF0b3IgaXRlcmF0b3JfdHlwZTsKKyAgICAgIGZvciAoaXRlcmF0b3JfdHlwZSBpdCA9IG1fa2V5X3NldC5iZWdpbigpOyBpdCAhPSBtX2tleV9zZXQuZW5kKCk7ICsraXQpCisJaWYgKG1fZXEoKml0LCByX2tleSkpCisJICByZXR1cm4gaXQ7CisgICAgICByZXR1cm4gbV9rZXlfc2V0LmVuZCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmtleV9zZXRfaXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZmluZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAga2V5X3NldF9pdGVyYXRvciBpdCA9IG1fa2V5X3NldC5iZWdpbigpOworICAgICAgd2hpbGUgKGl0ICE9IG1fa2V5X3NldC5lbmQoKSkKKwl7CisJICBpZiAobV9lcSgqaXQsIHJfa2V5KSkKKwkgICAgcmV0dXJuIGl0OworCSAgKytpdDsKKwl9CisgICAgICByZXR1cm4gaXQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGFzc2VydF92YWxpZCgpIGNvbnN0CisgICAgeworICAgICAgY29uc3Rfa2V5X3NldF9pdGVyYXRvciBwcmltZV9pdCA9IG1fa2V5X3NldC5iZWdpbigpOworICAgICAgd2hpbGUgKHByaW1lX2l0ICE9IG1fa2V5X3NldC5lbmQoKSkKKwl7CisJICBjb25zdF9rZXlfc2V0X2l0ZXJhdG9yIHNlY19pdCA9IHByaW1lX2l0OworCSAgKytzZWNfaXQ7CisJICB3aGlsZSAoc2VjX2l0ICE9IG1fa2V5X3NldC5lbmQoKSkKKwkgICAgeworCSAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghbV9lcSgqc2VjX2l0LCAqcHJpbWVfaXQpKTsKKwkgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIW1fZXEoKnByaW1lX2l0LCAqc2VjX2l0KSk7CisJICAgICAgKytzZWNfaXQ7CisJICAgIH0KKwkgICsrcHJpbWVfaXQ7CisJfQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ21wX0ZuPgorICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3BsaXQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgQ21wX0ZuIGNtcF9mbiwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIG90aGVyLmNsZWFyKCk7CisgICAgICBrZXlfc2V0X2l0ZXJhdG9yIGl0ID0gbV9rZXlfc2V0LmJlZ2luKCk7CisgICAgICB3aGlsZSAoaXQgIT0gbV9rZXlfc2V0LmVuZCgpKQorCWlmIChjbXBfZm4ocl9rZXksICogaXQpKQorCSAgeworCSAgICBvdGhlci5pbnNlcnRfbmV3KCppdCk7CisJICAgIGl0ID0gbV9rZXlfc2V0LmVyYXNlKGl0KTsKKwkgIH0KKwllbHNlCisJICArK2l0OworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBrZXlfc2V0X2l0ZXJhdG9yIGl0ID0gb3RoZXIubV9rZXlfc2V0LmJlZ2luKCk7CisgICAgICB3aGlsZSAoaXQgIT0gb3RoZXIubV9rZXlfc2V0LmVuZCgpKQorCXsKKwkgIGluc2VydF9uZXcoKml0KTsKKwkgIGl0ID0gb3RoZXIubV9rZXlfc2V0LmVyYXNlKGl0KTsKKwl9CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQob3RoZXIubV9rZXlfc2V0LmVtcHR5KCkpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9lcV9ieV9sZXNzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9lcV9mbi9lcV9ieV9sZXNzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzk1YmNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwCkBAIC0wLDAgKzEsNjggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGVxX2J5X2xlc3MuaHBwCisgKiBDb250YWlucyBhbiBlcXVpdmFsZW5jZSBmdW5jdGlvbi4KKyAqLworCisjaWZuZGVmIFBCX0RTX0VRX0JZX0xFU1NfSFBQCisjZGVmaW5lIFBCX0RTX0VRX0JZX0xFU1NfSFBQCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBDbXBfRm4+CisgICAgc3RydWN0IGVxX2J5X2xlc3MgOiBwcml2YXRlIENtcF9GbgorICAgIHsKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgS2V5JiByX2xocywgY29uc3QgS2V5JiByX3JocykgY29uc3QKKyAgICAgIHsKKwljb25zdCBib29sIGwgPSBDbXBfRm46Om9wZXJhdG9yKCkocl9saHMsIHJfcmhzKTsKKwljb25zdCBib29sIGcgPSBDbXBfRm46Om9wZXJhdG9yKCkocl9yaHMsIHJfbGhzKTsKKwlyZXR1cm4gIShsIHx8IGcpOworICAgICAgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19FUV9CWV9MRVNTX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMWMyNTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZXFfZm4vaGFzaF9lcV9mbi5ocHAKQEAgLTAsMCArMSwxNzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGhhc2hfZXFfZm4uaHBwCisgKiBDb250YWlucyAyIGVxaXZhbGVuY2UgZnVuY3Rpb25zLCBvbmUgZW1wbG95aW5nIGEgaGFzaCB2YWx1ZSwKKyAqICAgIGFuZCBvbmUgaWdub3JpbmcgaXQuCisgKi8KKworI2lmbmRlZiBQQl9EU19IQVNIX0VRX0ZOX0hQUAorI2RlZmluZSBQQl9EU19IQVNIX0VRX0ZOX0hQUAorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIGNsYXNzIEVxX0ZuLCBjbGFzcyBBbGxvY2F0b3IsIGJvb2wgU3RvcmVfSGFzaD4KKyAgICBzdHJ1Y3QgaGFzaF9lcV9mbjsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBFcV9GbiwgY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIEFsbG9jYXRvciwgZmFsc2U+CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiAxLSBUaGUgY2xpZW50IHJlcXVlc3RzIHRoYXQgaGFzaCB2YWx1ZXMgbm90IGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBFcV9GbiwgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIEFsbG9jYXRvciwgZmFsc2U+IDogcHVibGljIEVxX0ZuCisgICAgeworICAgICAgdHlwZWRlZiBFcV9GbiBlcV9mbl9iYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2tleV9yZWZlcmVuY2U7CisKKyAgICAgIGhhc2hfZXFfZm4oKTsKKworICAgICAgaGFzaF9lcV9mbihjb25zdCBFcV9GbiYgcl9lcV9mbik7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9saHNfa2V5LCBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3Q7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGhhc2hfZXFfZm4oKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7IHN0ZDo6c3dhcCgoRXFfRm4mICkoKnRoaXMpLCAoRXFfRm4mIClvdGhlcik7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGhhc2hfZXFfZm4oY29uc3QgRXFfRm4mIHJfZXFfZm4pIDoKKyAgICAgIEVxX0ZuKHJfZXFfZm4pCisgICAgeyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSBib29sCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2xoc19rZXksIGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9yaHNfa2V5KSBjb25zdAorICAgIHsgcmV0dXJuIChlcV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfbGhzX2tleSwgcl9yaHNfa2V5KSk7IH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCBjbGFzcyBFcV9GbiwgY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBoYXNoX2VxX2ZuPEtleSwgRXFfRm4sIEFsbG9jYXRvciwgdHJ1ZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDItIFRoZSBjbGllbnQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgY2xhc3MgRXFfRm4sIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgaGFzaF9lcV9mbjxLZXksIEVxX0ZuLCBBbGxvY2F0b3IsIHRydWU+IDoKKyAgICAgIHB1YmxpYyBFcV9GbgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgICB0eXBlZGVmIEVxX0ZuIGVxX2ZuX2Jhc2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXIga2V5X2FsbG9jYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKworICAgICAgaGFzaF9lcV9mbigpOworCisgICAgICBoYXNoX2VxX2ZuKGNvbnN0IEVxX0ZuJiByX2VxX2ZuKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2xoc19rZXksIHNpemVfdHlwZSBsaHNfaGFzaCwgCisJCSBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzX2tleSwgc2l6ZV90eXBlIHJoc19oYXNoKSBjb25zdDsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHN3YXAoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgaGFzaF9lcV9mbigpCisgICAgeyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBoYXNoX2VxX2ZuKGNvbnN0IEVxX0ZuJiByX2VxX2ZuKSA6CisgICAgICBFcV9GbihyX2VxX2ZuKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgYm9vbAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9saHNfa2V5LCBzaXplX3R5cGUgbGhzX2hhc2gsIAorCSAgICAgICBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzX2tleSwgc2l6ZV90eXBlIHJoc19oYXNoKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2xoc19rZXksIHJfcmhzX2tleSkgCisJCSAgICAgICAgICAgIHx8IGxoc19oYXNoID09IHJoc19oYXNoKTsKKworICAgICAgcmV0dXJuIChsaHNfaGFzaCA9PSByaHNfaGFzaCAmJiAKKwkgICAgICBlcV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfbGhzX2tleSwgcl9yaHNfa2V5KSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7IHN0ZDo6c3dhcCgoRXFfRm4mICkoKnRoaXMpLCAoRXFfRm4mICkob3RoZXIpKTsgfQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjMTQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDIyMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsCisgKiAgICBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VudHJ5X2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKCkgCis6IHJhbmdlZF9wcm9iZV9mbl9iYXNlKHJlc2l6ZV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pICAgIAorOiByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksIHJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuKSAKKzogaGFzaF9lcV9mbl9iYXNlKHJfZXFfZm4pLAorICByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksIHJfaGFzaF9mbiksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIGNvbnN0IEVxX0ZuJiByX2VxX2ZuLCAKKwkJIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9oYXNoX2ZuKSAKKzogaGFzaF9lcV9mbl9iYXNlKHJfZXFfZm4pLAorICByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksCisJCSAgICAgICByX2hhc2hfZm4sIHJfY29tYl9oYXNoX2ZuKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4sIAorCQkgY29uc3QgQ29tYl9Qcm9iZV9GbiYgY29tYl9oYXNoX2ZuLCBjb25zdCBQcm9iZV9GbiYgcHJvYmVyKSAKKzogaGFzaF9lcV9mbl9iYXNlKHJfZXFfZm4pLAorICByYW5nZWRfcHJvYmVfZm5fYmFzZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSksCisJCSAgICAgICByX2hhc2hfZm4sIGNvbWJfaGFzaF9mbiwgcHJvYmVyKSwKKyAgbV9udW1fZShyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpLCBtX251bV91c2VkX2UoMCksCisgIG1fZW50cmllcyhzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZShtX251bV9lKSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgY29uc3QgRXFfRm4mIHJfZXFfZm4sIAorCQkgY29uc3QgQ29tYl9Qcm9iZV9GbiYgY29tYl9oYXNoX2ZuLCBjb25zdCBQcm9iZV9GbiYgcHJvYmVyLCAKKwkJIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmIHJfcmVzaXplX3BvbGljeSkgCis6IGhhc2hfZXFfZm5fYmFzZShyX2VxX2ZuKSwgcmVzaXplX2Jhc2Uocl9yZXNpemVfcG9saWN5KSwKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpLAorCQkgICAgICAgcl9oYXNoX2ZuLCBjb21iX2hhc2hfZm4sIHByb2JlciksCisgIG1fbnVtX2UocmVzaXplX2Jhc2U6OmdldF9uZWFyZXN0X2xhcmdlcl9zaXplKDEpKSwgbV9udW1fdXNlZF9lKDApLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBkZWJ1Z19iYXNlKG90aGVyKSwKKyNlbmRpZiAKKyAgaGFzaF9lcV9mbl9iYXNlKG90aGVyKSwKKyAgcmVzaXplX2Jhc2Uob3RoZXIpLAorICByYW5nZWRfcHJvYmVfZm5fYmFzZShvdGhlciksCisgIG1fbnVtX2Uob3RoZXIubV9udW1fZSksCisgIG1fbnVtX3VzZWRfZShvdGhlci5tX251bV91c2VkX2UpLAorICBtX2VudHJpZXMoc19lbnRyeV9hbGxvY2F0b3IuYWxsb2NhdGUobV9udW1fZSkpCit7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIG1fZW50cmllc1tpXS5tX3N0YXQgPSAoZW50cnlfc3RhdHVzKWVtcHR5X2VudHJ5X3N0YXR1czsKKworICBfX3RyeQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgICAgICB7CisJICBtX2VudHJpZXNbaV0ubV9zdGF0ID0gb3RoZXIubV9lbnRyaWVzW2ldLm1fc3RhdDsKKwkgIGlmIChtX2VudHJpZXNbaV0ubV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgICAgbmV3IChtX2VudHJpZXMgKyBpKSBlbnRyeShvdGhlci5tX2VudHJpZXNbaV0pOworICAgICAgICB9CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBkZWFsbG9jYXRlX2FsbCgpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfQ0xBU1NfTkFNRSgpCit7IGRlYWxsb2NhdGVfYWxsKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKSk7CisgIHN0ZDo6c3dhcChtX251bV9lLCBvdGhlci5tX251bV9lKTsKKyAgc3RkOjpzd2FwKG1fbnVtX3VzZWRfZSwgb3RoZXIubV9udW1fdXNlZF9lKTsKKyAgc3RkOjpzd2FwKG1fZW50cmllcywgb3RoZXIubV9lbnRyaWVzKTsKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICBoYXNoX2VxX2ZuX2Jhc2U6OnN3YXAob3RoZXIpOworICByZXNpemVfYmFzZTo6c3dhcChvdGhlcik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcikpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitkZWFsbG9jYXRlX2FsbCgpCit7CisgIGNsZWFyKCk7CisgIGVyYXNlX2FsbF92YWxpZF9lbnRyaWVzKG1fZW50cmllcywgbV9udW1fZSk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9lbnRyaWVzLCBtX251bV9lKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2FsbF92YWxpZF9lbnRyaWVzKGVudHJ5X2FycmF5IGFfZW50cmllc19yZXNpemVkLCBzaXplX3R5cGUgbGVuKQoreworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBsZW47ICsrcG9zKQorICAgIHsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9lID0gJmFfZW50cmllc19yZXNpemVkW3Bvc107CisgICAgICBpZiAocF9lLT5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCXBfZS0+bV92YWx1ZS5+dmFsdWVfdHlwZSgpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChtX251bV9lKTsKKyAgUmVzaXplX1BvbGljeTo6bm90aWZ5X2NsZWFyZWQoKTsKKyAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKG1fbnVtX2UpOworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICBtX2VudHJpZXNbaV0ubV9zdGF0ID0gZW1wdHlfZW50cnlfc3RhdHVzOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODA2OTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9yLAorICogICAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29uc3RydWN0b3JfaW5zZXJ0X25ld19pbXAoY29uc3RfbWFwcGVkX3JlZmVyZW5jZSByX3ZhbCwgc2l6ZV90eXBlIHBvcywgCisJCQkgICBmYWxzZV90eXBlKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9lbnRyaWVzW3Bvc10ubV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cylrOworICBlbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcG9zOworICBuZXcgKCZwX2UtPm1fdmFsdWUpIG1hcHBlZF92YWx1ZV90eXBlKHJfdmFsKTsKKyAgcF9lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXM7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhwX2UtPm1fdmFsdWUuZmlyc3QpOykKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMDQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0cnVjdG9yX2Rlc3RydWN0b3Jfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3IsCisgKiBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb25zdHJ1Y3Rvcl9pbnNlcnRfbmV3X2ltcChjb25zdF9tYXBwZWRfcmVmZXJlbmNlIHJfdmFsLCBzaXplX3R5cGUgcG9zLCAKKwkJCSAgIHRydWVfdHlwZSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1twb3NdLm1fc3RhdCAhPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworICBlbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcG9zOworICBuZXcgKCZwX2UtPm1fdmFsdWUpIG1hcHBlZF92YWx1ZV90eXBlKHJfdmFsKTsKKyAgcF9lLT5tX2hhc2ggPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocl92YWwpKS5zZWNvbmQ7CisgIHBfZS0+bV9zdGF0ID0gdmFsaWRfZW50cnlfc3RhdHVzOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcocF9lLT5tX3ZhbHVlLmZpcnN0KTspCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzAxOGM2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBkZWJ1Zy1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZCgpIGNvbnN0Cit7CisgIGRlYnVnX2Jhc2U6OmNoZWNrX3NpemUobV9udW1fdXNlZF9lKTsKKyAgYXNzZXJ0X2VudHJ5X2FycmF5X3ZhbGlkKG1fZW50cmllcywgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKK30KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjRkN2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2RlYnVnX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGVidWdfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBkZWJ1Zy1tb2RlIGZ1bmN0aW9ucy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9lbnRyeV9hcnJheV92YWxpZChjb25zdCBlbnRyeV9hcnJheSBhX2VudHJpZXMsIGZhbHNlX3R5cGUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBpdGVyYXRlZF9udW1fdXNlZF9lID0gMDsKKyAgZm9yIChzaXplX3R5cGUgcG9zID0gMDsgcG9zIDwgbV9udW1fZTsgKytwb3MpCisgICAgeworICAgICAgY29uc3RfZW50cnlfcG9pbnRlciBwX2UgPSAmYV9lbnRyaWVzW3Bvc107CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIHsKKwkgICAgY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworCSAgICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KTsKKwkgICAgKytpdGVyYXRlZF9udW1fdXNlZF9lOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgICAgZGVmYXVsdDoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgfTsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdGVyYXRlZF9udW1fdXNlZF9lID09IG1fbnVtX3VzZWRfZSk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZGVidWdfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjFmMTQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRlYnVnX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZGVidWctbW9kZSBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfYXJyYXkgYV9lbnRyaWVzLCB0cnVlX3R5cGUpIGNvbnN0Cit7CisgIHNpemVfdHlwZSBpdGVyYXRlZF9udW1fdXNlZF9lID0gMDsKKworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICBjb25zdF9lbnRyeV9wb2ludGVyIHBfZSA9JiBhX2VudHJpZXNbcG9zXTsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgeworCSAgICBjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5ID0gUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSk7CisJICAgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXkpOworCisJICAgIGNvbnN0IGNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworCisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2UtPm1faGFzaCA9PSBwb3NfaGFzaF9wYWlyLnNlY29uZCk7CisJICAgICsraXRlcmF0ZWRfbnVtX3VzZWRfZTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdGVyYXRlZF9udW1fdXNlZF9lID09IG1fbnVtX3VzZWRfZSk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODc4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBlcmFzZSByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2VudHJ5KGVudHJ5X3BvaW50ZXIgcF9lKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTspCisgIHBfZS0+bV92YWx1ZS5+dmFsdWVfdHlwZSgpOworICBwX2UtPm1fc3RhdCA9IGVyYXNlZF9lbnRyeV9zdGF0dXM7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX251bV91c2VkX2UgPiAwKTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZWQoLS1tX251bV91c2VkX2UpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfZSA9ICZtX2VudHJpZXNbcG9zXTsKKyAgICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJZXJhc2VfZW50cnkocF9lKTsKKyAgICB9CisgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9jbGVhcmVkKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorICBzaXplX3R5cGUgbnVtX2Vyc2QgPSAwOworICBmb3IgKHNpemVfdHlwZSBwb3MgPSAwOyBwb3MgPCBtX251bV9lOyArK3BvcykKKyAgICB7CisgICAgICBlbnRyeV9wb2ludGVyIHBfZSA9ICZtX2VudHJpZXNbcG9zXTsKKyAgICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJaWYgKHByZWQocF9lLT5tX3ZhbHVlKSkKKwkgIHsKKwkgICAgKytudW1fZXJzZDsKKwkgICAgZXJhc2VfZW50cnkocF9lKTsKKwkgIH0KKyAgICB9CisKKyAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreyByZXR1cm4gZXJhc2VfaW1wKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOyB9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9lcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNTc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksICBmYWxzZV90eXBlKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCisgIHNpemVfdHlwZSBoYXNoID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICBzaXplX3R5cGUgaTsKKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBwb3MgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSwgIGhhc2gsIGkpOworICAgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKyAgICAgIHN3aXRjaChwX2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIHsKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KAorCQkJCQkJCQkgICAgcl9rZXkpKTsKKwkgICAgcmV0dXJuIGZhbHNlOworCSAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgICAgICAgeworCSAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCSAgICAgIGVyYXNlX2VudHJ5KHBfZSk7CisJICAgICAgZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpOworCSAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCSAgYnJlYWs7CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworICAgICAgICB9OworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisgICAgfQorICByZXNpemVfYmFzZTo6bm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2VyYXNlX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NWE1MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2Vfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGVyYXNlIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQoreworICBjb25zdCBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgc2l6ZV90eXBlIGk7CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCwgaSk7CisKKyAgICAgIGVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyBwb3M7CisgICAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJICB7CisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCSAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdCgKKwkJCQkJCQkJICAgIHJfa2V5KSk7CisJICAgIHJldHVybiBmYWxzZTsKKwkgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIGlmIChoYXNoX2VxX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfZS0+bV92YWx1ZSksIHBfZS0+bV9oYXNoLAorCQkJCQkgIHJfa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCkpCisgICAgICAgICAgICB7CisJICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisJICAgICAgZXJhc2VfZW50cnkocF9lKTsKKwkgICAgICBkb19yZXNpemVfaWZfbmVlZGVkX25vX3Rocm93KCk7CisJICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisJICBicmVhazsKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworICAgIH0KKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDA1NjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgcmV0dXJuIGZpbmRfa2V5X3BvaW50ZXIocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3BvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICByZXR1cm4gY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyY+KCp0aGlzKS5maW5kX2tleV9wb2ludGVyKHJfa2V5LCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9lbmQoKQoreyByZXR1cm4gMDsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9lbmQoKSBjb25zdAoreyByZXR1cm4gMDsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODYwNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2ZpbmRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQ2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBmaW5kX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgZmluZCByZWxhdGVkIGZ1bmN0aW9ucywKKyAqIHdoZW4gdGhlIGhhc2ggdmFsdWUgaXMgbm90IHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2tleV9wb2ludGVyKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksIGZhbHNlX3R5cGUpCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0YjgzMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZmluZF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGZpbmRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBpbnNlcnQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9ncF9odF9tYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZ3BfaHRfbWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2OWIyZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZ3BfaHRfbWFwXy5ocHAKQEAgLTAsMCArMSw2NzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGdwX2h0X21hcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgZ3BfaHRfbWFwXy4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfcHJvYmVfZm4uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2hhc2hfZXFfZm4uaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmIAorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBFcV9GbiwgXAorCSAgICAgdHlwZW5hbWUgQWxsb2NhdG9yLCBib29sIFN0b3JlX0hhc2gsIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIFwKKwkgICAgIHR5cGVuYW1lIFByb2JlX0ZuLAl0eXBlbmFtZSBSZXNpemVfUG9saWN5PgorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIGdwX2h0X21hcF9kYXRhXworI2VuZGlmCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIGdwX2h0X21hcF9ub19kYXRhXworI2VuZGlmIAorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19DTEFTU19OQU1FPEtleSwgTWFwcGVkLCBIYXNoX0ZuLCBFcV9GbiwgQWxsb2NhdG9yLAlcCisJCSAgICAgU3RvcmVfSGFzaCwgQ29tYl9Qcm9iZV9GbiwgUHJvYmVfRm4sIFJlc2l6ZV9Qb2xpY3k+CisKKyNkZWZpbmUgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyBcCisgICAgaGFzaF9lcV9mbjxLZXksIEVxX0ZuLCBBbGxvY2F0b3IsIFN0b3JlX0hhc2g+CisKKyNkZWZpbmUgUEJfRFNfUkFOR0VEX1BST0JFX0ZOX0NfREVDIFwKKyAgICByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBBbGxvY2F0b3IsIENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuLCBTdG9yZV9IYXNoPgorCisjZGVmaW5lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQyBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBBbGxvY2F0b3IsIFN0b3JlX0hhc2g+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LCBFcV9GbiwgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZT4KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKS5maXJzdAorI2RlZmluZSBQQl9EU19WMlMoWCkgKFgpLnNlY29uZAorI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKQorI2RlZmluZSBQQl9EU19WMlMoWCkgTWFwcGVkKCkKKyNlbmRpZiAKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIEhhc2hfRm4sCisJICAgICB0eXBlbmFtZSBFcV9GbiwKKwkgICAgIHR5cGVuYW1lIEFsbG9jYXRvciwKKwkgICAgIGJvb2wgU3RvcmVfSGFzaCwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sCisJICAgICB0eXBlbmFtZSBQcm9iZV9GbiwKKwkgICAgIHR5cGVuYW1lIFJlc2l6ZV9Qb2xpY3k+CisgICAgY2xhc3MgUEJfRFNfQ0xBU1NfTkFNRSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHByb3RlY3RlZCBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQywKKyNlbmRpZiAKKyAgICAgIHB1YmxpYyBQQl9EU19IQVNIX0VRX0ZOX0NfREVDLAorICAgICAgcHVibGljIFJlc2l6ZV9Qb2xpY3ksCisgICAgICBwdWJsaWMgUEJfRFNfUkFOR0VEX1BST0JFX0ZOX0NfREVDLAorICAgICAgcHVibGljIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMgdHJhaXRzX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGVfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciBwb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpyZWZlcmVuY2UgcmVmZXJlbmNlXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2VfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29tcF9oYXNoIGNvbXBfaGFzaDsKKworICAgICAgZW51bSBlbnRyeV9zdGF0dXMKKwl7CisJICBlbXB0eV9lbnRyeV9zdGF0dXMsCisJICB2YWxpZF9lbnRyeV9zdGF0dXMsCisJICBlcmFzZWRfZW50cnlfc3RhdHVzCisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyAgICAgIHN0cnVjdCBlbnRyeSA6IHB1YmxpYyB0cmFpdHNfYmFzZTo6c3RvcmVkX3ZhbHVlX3R5cGUKKyAgICAgIHsKKwllbnRyeV9zdGF0dXMgbV9zdGF0OworICAgICAgfTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxlbnRyeT46Om90aGVyIGVudHJ5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciBjb25zdF9lbnRyeV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnJlZmVyZW5jZSBlbnRyeV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2VudHJ5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpwb2ludGVyIGVudHJ5X2FycmF5OworCisgICAgICB0eXBlZGVmIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9DX0RFQyByYW5nZWRfcHJvYmVfZm5fYmFzZTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDIGRlYnVnX2Jhc2U7CisjZW5kaWYgCisKKyAgICAgIHR5cGVkZWYgUEJfRFNfSEFTSF9FUV9GTl9DX0RFQyBoYXNoX2VxX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFJlc2l6ZV9Qb2xpY3kgcmVzaXplX2Jhc2U7CisKKyNkZWZpbmUgUEJfRFNfR0VOX1BPUyB0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZQorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwPgorCisjdW5kZWYgUEJfRFNfR0VOX1BPUworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBIYXNoX0ZuIGhhc2hfZm47CisgICAgICB0eXBlZGVmIEVxX0ZuIGVxX2ZuOworICAgICAgdHlwZWRlZiBQcm9iZV9GbiBwcm9iZV9mbjsKKyAgICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbiBjb21iX3Byb2JlX2ZuOworICAgICAgdHlwZWRlZiBSZXNpemVfUG9saWN5IHJlc2l6ZV9wb2xpY3k7CisKKyAgICAgIGVudW0KKwl7CisJICBzdG9yZV9oYXNoID0gU3RvcmVfSGFzaAorCX07CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9rZXlfcG9pbnRlciBjb25zdF9rZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X2tleV9yZWZlcmVuY2UgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9tYXBwZWRfcG9pbnRlciBjb25zdF9tYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9yZWZlcmVuY2UgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X21hcHBlZF9yZWZlcmVuY2UgY29uc3RfbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvcl8gcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBjb25zdF9wb2ludF9pdGVyYXRvcl8gcG9pbnRfaXRlcmF0b3I7CisjZW5kaWYgCisKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRfaXRlcmF0b3JfIGNvbnN0X3BvaW50X2l0ZXJhdG9yOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBpdGVyYXRvcl8gaXRlcmF0b3I7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gaXRlcmF0b3I7CisjZW5kaWYgCisKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKCk7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBIYXNoX0ZuJik7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJik7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYpOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKGNvbnN0IEhhc2hfRm4mLCBjb25zdCBFcV9GbiYsIGNvbnN0IENvbWJfUHJvYmVfRm4mLCAKKwkJICAgICAgIGNvbnN0IFByb2JlX0ZuJik7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgSGFzaF9GbiYsIGNvbnN0IEVxX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYsIAorCQkgICAgICAgY29uc3QgUHJvYmVfRm4mLCBjb25zdCBSZXNpemVfUG9saWN5Jik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KTsKKworICAgICAgdmlydHVhbAorICAgICAgflBCX0RTX0NMQVNTX05BTUUoKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICBIYXNoX0ZuJiAKKyAgICAgIGdldF9oYXNoX2ZuKCk7CisKKyAgICAgIGNvbnN0IEhhc2hfRm4mIAorICAgICAgZ2V0X2hhc2hfZm4oKSBjb25zdDsKKworICAgICAgRXFfRm4mIAorICAgICAgZ2V0X2VxX2ZuKCk7CisKKyAgICAgIGNvbnN0IEVxX0ZuJiAKKyAgICAgIGdldF9lcV9mbigpIGNvbnN0OworCisgICAgICBQcm9iZV9GbiYgCisgICAgICBnZXRfcHJvYmVfZm4oKTsKKworICAgICAgY29uc3QgUHJvYmVfRm4mIAorICAgICAgZ2V0X3Byb2JlX2ZuKCkgY29uc3Q7CisKKyAgICAgIENvbWJfUHJvYmVfRm4mIAorICAgICAgZ2V0X2NvbWJfcHJvYmVfZm4oKTsKKworICAgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgCisgICAgICBnZXRfY29tYl9wcm9iZV9mbigpIGNvbnN0OworCisgICAgICBSZXNpemVfUG9saWN5JiAKKyAgICAgIGdldF9yZXNpemVfcG9saWN5KCk7CisKKyAgICAgIGNvbnN0IFJlc2l6ZV9Qb2xpY3kmIAorICAgICAgZ2V0X3Jlc2l6ZV9wb2xpY3koKSBjb25zdDsKKworICAgICAgaW5saW5lIHN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgICByZXR1cm4gaW5zZXJ0X2ltcChyX3ZhbCwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJcmV0dXJuIHN1YnNjcmlwdF9pbXAocl9rZXksIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisjZWxzZSAKKwlpbnNlcnQocl9rZXkpOworICAgICAgICByZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF9tYXBwZWQ7CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpOworCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZF9lbmQoKTsKKworICAgICAgaW5saW5lIGNvbnN0X3BvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kX2VuZCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2UoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkIHByZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZiAKKworICAgIHByaXZhdGU6CisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgZnJpZW5kIGNsYXNzIGl0ZXJhdG9yXzsKKyNlbmRpZiAKKworICAgICAgZnJpZW5kIGNsYXNzIGNvbnN0X2l0ZXJhdG9yXzsKKworICAgICAgdm9pZAorICAgICAgZGVhbGxvY2F0ZV9hbGwoKTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9hbGxfdmFsaWRfZW50cmllcyhlbnRyeV9hcnJheSwgc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGRvX3Jlc2l6ZV9pZl9uZWVkZWRfbm9fdGhyb3coKTsKKworICAgICAgdm9pZAorICAgICAgcmVzaXplX2ltcChzaXplX3R5cGUpOworCisgICAgICB2aXJ0dWFsIHZvaWQKKyAgICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICByZXNpemVfaW1wKGVudHJ5X2FycmF5LCBzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVzaXplX2ltcF9yZWFzc2lnbihlbnRyeV9wb2ludGVyLCBlbnRyeV9hcnJheSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZXNpemVfaW1wX3JlYXNzaWduKGVudHJ5X3BvaW50ZXIsIGVudHJ5X2FycmF5LCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBmaW5kX2luc19wb3MoY29uc3Rfa2V5X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBjb21wX2hhc2gKKyAgICAgIGZpbmRfaW5zX3Bvcyhjb25zdF9rZXlfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2UsIGZhbHNlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBpbnNlcnRfbmV3X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIHNpemVfdHlwZSBwb3MpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1twb3NdLm1fc3RhdCAhPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworCisJaWYgKGRvX3Jlc2l6ZV9pZl9uZWVkZWQoKSkKKwkgIHBvcyA9IGZpbmRfaW5zX3BvcyhQQl9EU19WMkYocl92YWwpLAorCQkJICAgICB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1twb3NdLm1fc3RhdCAhPSB2YWxpZF9lbnRyeV9zdGF0dXMpOworCisJZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKwluZXcgKCZwX2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocl92YWwpOworCXBfZS0+bV9zdGF0ID0gdmFsaWRfZW50cnlfc3RhdHVzOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQoKyttX251bV91c2VkX2UpOworCisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpKTspCisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gJnBfZS0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGluc2VydF9uZXdfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgY29tcF9oYXNoJiByX3Bvc19oYXNoX3BhaXIpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdLm1fc3RhdCAhPQorCQkJIHZhbGlkX2VudHJ5X3N0YXR1cyk7CisKKwlpZiAoZG9fcmVzaXplX2lmX25lZWRlZCgpKQorCSAgcl9wb3NfaGFzaF9wYWlyID0gZmluZF9pbnNfcG9zKFBCX0RTX1YyRihyX3ZhbCksCisJCQkJCSB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fZW50cmllc1tyX3Bvc19oYXNoX3BhaXIuZmlyc3RdLm1fc3RhdCAhPQorCQkJICAgICAgdmFsaWRfZW50cnlfc3RhdHVzKTsKKworCWVudHJ5KiBjb25zdCBwX2UgPSBtX2VudHJpZXMgKyByX3Bvc19oYXNoX3BhaXIuZmlyc3Q7CisJbmV3ICgmcF9lLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKwlwX2UtPm1faGFzaCA9IHJfcG9zX2hhc2hfcGFpci5zZWNvbmQ7CisJcF9lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXM7CisKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydGVkKCsrbV9udW1fdXNlZF9lKTsKKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSk7KQorCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJcmV0dXJuICZwX2UtPm1fdmFsdWU7CisgICAgICB9CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgc3Vic2NyaXB0X2ltcChjb25zdF9rZXlfcmVmZXJlbmNlIGtleSwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKworCWNvbnN0IHNpemVfdHlwZSBwb3MgPSBmaW5kX2luc19wb3Moa2V5LCAKKwkJCQkJIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKwllbnRyeV9wb2ludGVyIHBfZSA9ICZtX2VudHJpZXNbcG9zXTsKKwlpZiAocF9lLT5tX3N0YXQgIT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgcmV0dXJuIGluc2VydF9uZXdfaW1wKHZhbHVlX3R5cGUoa2V5LCBtYXBwZWRfdHlwZSgpKSwgcG9zKS0+c2Vjb25kOworCisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKGtleSk7KQkgIAorCXJldHVybiBwX2UtPm1fdmFsdWUuc2Vjb25kOworICAgICAgfQorCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgc3Vic2NyaXB0X2ltcChjb25zdF9rZXlfcmVmZXJlbmNlIGtleSwgdHJ1ZV90eXBlKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisJY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPQorCSAgZmluZF9pbnNfcG9zKGtleSwgdHJhaXRzX2Jhc2U6Om1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yKTsKKworCWlmIChtX2VudHJpZXNbcG9zX2hhc2hfcGFpci5maXJzdF0ubV9zdGF0ICE9IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgIHJldHVybiBpbnNlcnRfbmV3X2ltcCh2YWx1ZV90eXBlKGtleSwgbWFwcGVkX3R5cGUoKSksCisJCQkJIHBvc19oYXNoX3BhaXIpLT5zZWNvbmQ7CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoa2V5KSk7CisJcmV0dXJuIChtX2VudHJpZXMgKyBwb3NfaGFzaF9wYWlyLmZpcnN0KS0+bV92YWx1ZS5zZWNvbmQ7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaW5saW5lIHBvaW50ZXIKKyAgICAgIGZpbmRfa2V5X3BvaW50ZXIoY29uc3Rfa2V5X3JlZmVyZW5jZSBrZXksIGZhbHNlX3R5cGUpCisgICAgICB7CisJY29uc3Qgc2l6ZV90eXBlIGhhc2ggPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShrZXkpOworCXNpemVfdHlwZSBpOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKworCS8vIExvb3AgdW50aWwgZW50cnkgaXMgZm91bmQgb3IgdW50aWwgYWxsIHBvc3NpYmxlIGVudHJpZXMgYWNjZXNzZWQuCisJZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGtleSwgaGFzaCwgaSk7CisKKwkgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKwkgICAgc3dpdGNoIChwX2UtPm1fc3RhdCkKKwkgICAgICB7CisJICAgICAgY2FzZSBlbXB0eV9lbnRyeV9zdGF0dXM6CisJCXsKKwkJICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCQkgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KGtleSk7KQorCisJCSAgICByZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwkgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkJaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwga2V5KSkKKwkJICB7CisJCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCQkgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKGtleSk7KQorCisJCSAgICByZXR1cm4gcG9pbnRlcigmcF9lLT5tX3ZhbHVlKTsKKwkJICB9CisJCWJyZWFrOworCSAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCSAgICAgIH07CisKKwkgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKwkgIH0KKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KGtleSk7KQorCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlubGluZSBwb2ludGVyCisgICAgICBmaW5kX2tleV9wb2ludGVyKGNvbnN0X2tleV9yZWZlcmVuY2Uga2V5LCB0cnVlX3R5cGUpCisgICAgICB7CisJY29tcF9oYXNoIHBvc19oYXNoX3BhaXIgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShrZXkpOworCXNpemVfdHlwZSBpOworCXJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKworCS8vIExvb3AgdW50aWwgZW50cnkgaXMgZm91bmQgb3IgdW50aWwgYWxsIHBvc3NpYmxlIGVudHJpZXMgYWNjZXNzZWQuCisJZm9yIChpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKwkgIHsKKwkgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9CisJICAgICAgcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoa2V5LCBwb3NfaGFzaF9wYWlyLnNlY29uZCwgaSk7CisKKwkgICAgZW50cnkqIGNvbnN0IHBfZSA9IG1fZW50cmllcyArIHBvczsKKworCSAgICBzd2l0Y2gocF9lLT5tX3N0YXQpCisJICAgICAgeworCSAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCQl7CisJCSAgcmVzaXplX2Jhc2U6Om5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKwkJICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChrZXkpOykKKworCQkgIHJldHVybiAwOworCQl9CisJCWJyZWFrOworCSAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCQlpZiAoaGFzaF9lcV9mbl9iYXNlOjpvcGVyYXRvcigpKFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpLAorCQkJCQkJcF9lLT5tX2hhc2gsCisJCQkJCQlrZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKwkJICB7CisJCSAgICByZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCQkgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKGtleSk7KQorCQkgICAgcmV0dXJuIHBvaW50ZXIoJnBfZS0+bV92YWx1ZSk7CisJCSAgfQorCQlicmVhazsKKwkgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCV9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKwkgICAgICB9OworCisJICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisJICB9CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChrZXkpOykKKwlyZXNpemVfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCXJldHVybiAwOworICAgICAgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXJhc2VfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2UsIHRydWVfdHlwZSk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZV9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBlcmFzZV9lbnRyeShlbnRyeV9wb2ludGVyIHBfZSk7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB2b2lkCisgICAgICBpbmNfaXRfc3RhdGUocG9pbnRlciYgcl9wX3ZhbHVlLCBzaXplX3R5cGUmIHJfcG9zKSBjb25zdAorICAgICAgeyBpbmNfaXRfc3RhdGUoKGNvbnN0X21hcHBlZF9wb2ludGVyJiApcl9wX3ZhbHVlLCByX3Bvcyk7IH0KKyNlbmRpZiAKKworICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKGNvbnN0X3BvaW50ZXImIHJfcF92YWx1ZSwgc2l6ZV90eXBlJiByX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocl9wX3ZhbHVlICE9IDApOworCWZvciAoKytyX3Bvczsgcl9wb3MgPCBtX251bV9lOyArK3JfcG9zKQorCSAgeworCSAgICBjb25zdF9lbnRyeV9wb2ludGVyIHBfZSA9JiBtX2VudHJpZXNbcl9wb3NdOworCSAgICBpZiAocF9lLT5tX3N0YXQgPT0gdmFsaWRfZW50cnlfc3RhdHVzKQorCSAgICAgIHsKKwkJcl9wX3ZhbHVlID0mIHBfZS0+bV92YWx1ZTsKKwkJcmV0dXJuOworCSAgICAgIH0KKwkgIH0KKwlyX3BfdmFsdWUgPSAwOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBnZXRfc3RhcnRfaXRfc3RhdGUoY29uc3RfcG9pbnRlciYgcl9wX3ZhbHVlLCBzaXplX3R5cGUmIHJfcG9zKSBjb25zdAorICAgICAgeworCWZvciAocl9wb3MgPSAwOyByX3BvcyA8IG1fbnVtX2U7ICsrcl9wb3MpCisJICB7CisJICAgIGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9lID0gJm1fZW50cmllc1tyX3Bvc107CisJICAgIGlmIChwX2UtPm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisJICAgICAgeworCQlyX3BfdmFsdWUgPSAmcF9lLT5tX3ZhbHVlOworCQlyZXR1cm47CisJICAgICAgfQorCSAgfQorCXJfcF92YWx1ZSA9IDA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGdldF9zdGFydF9pdF9zdGF0ZShwb2ludGVyJiByX3BfdmFsdWUsIHNpemVfdHlwZSYgcl9wb3MpCisgICAgICB7CisJZm9yIChyX3BvcyA9IDA7IHJfcG9zIDwgbV9udW1fZTsgKytyX3BvcykKKwkgIHsKKwkgICAgZW50cnlfcG9pbnRlciBwX2UgPSAmbV9lbnRyaWVzW3JfcG9zXTsKKwkgICAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKwkgICAgICB7CisJCXJfcF92YWx1ZSA9ICZwX2UtPm1fdmFsdWU7CisJCXJldHVybjsKKwkgICAgICB9CisJICB9CisJcl9wX3ZhbHVlID0gMDsKKyAgICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfYXJyYXksIGZhbHNlX3R5cGUpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfZW50cnlfYXJyYXlfdmFsaWQoY29uc3QgZW50cnlfYXJyYXksIHRydWVfdHlwZSkgY29uc3Q7CisjZW5kaWYgCisKKyAgICAgIHN0YXRpYyBlbnRyeV9hbGxvY2F0b3IgCXNfZW50cnlfYWxsb2NhdG9yOworICAgICAgc3RhdGljIGl0ZXJhdG9yIAkJc19lbmRfaXQ7CisgICAgICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgCXNfY29uc3RfZW5kX2l0OworCisgICAgICBzaXplX3R5cGUgCQltX251bV9lOworICAgICAgc2l6ZV90eXBlIAkJbV9udW1fdXNlZF9lOworICAgICAgZW50cnlfcG9pbnRlciAJCW1fZW50cmllczsKKworICAgICAgZW51bQorCXsKKwkgIHN0b3JlX2hhc2hfb2sgPSAhU3RvcmVfSGFzaCAKKwkgICAgICAgICAgICAgICAgICB8fCAhaXNfc2FtZTxIYXNoX0ZuLCBfX2dudV9wYmRzOjpudWxsX2hhc2hfZm4+Ojp2YWx1ZQorCX07CisKKyAgICAgIFBCX0RTX1NUQVRJQ19BU1NFUlQoc3RoLCBzdG9yZV9oYXNoX29rKTsKKyAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaXRlcmF0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0hBU0hfRVFfRk5fQ19ERUMKKyN1bmRlZiBQQl9EU19SQU5HRURfUFJPQkVfRk5fQ19ERUMKKyN1bmRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX05BTUUKKyN1bmRlZiBQQl9EU19WMkYKKyN1bmRlZiBQQl9EU19WMlMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyM2E5MjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5mb19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBlbnRpcmUgY29udGFpbmVyIGluZm8gcmVsYXRlZAorICogICAgZnVuY3Rpb25zLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBtX251bV91c2VkX2U7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBzX2VudHJ5X2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gKHNpemUoKSA9PSAwKTsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFjZThjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw0MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIGluc2VydCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHA+CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjdhNGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9ub19zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTExIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnNlcnRfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBpbnNlcnQgcmVsYXRlZCBmdW5jdGlvbnMsCisgKiB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIG5vdCBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2luc19wb3MoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgZmFsc2VfdHlwZSkKK3sKKyAgc2l6ZV90eXBlIGhhc2ggPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisgIHNpemVfdHlwZSBpOworCisgIC8qIFRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgaW5pdHRlZCB0byBhIG5vbi1sZWdhbCB2YWx1ZSB0byBpbmRpY2F0ZQorICAgKiAgICAgdGhhdCBpdCBoYXMgbm90IGJlZW4gaW5pdHRlZCB5ZXQuCisgICAqLworICBzaXplX3R5cGUgaW5zX3BvcyA9IG1fbnVtX2U7CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworICBmb3IgKGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBwb3MgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSwgaGFzaCwgaSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocG9zIDwgbV9udW1fZSk7CisgICAgICBlbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcG9zOworICAgICAgc3dpdGNoKHBfZS0+bV9zdGF0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCSAgeworICAgICAgICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICAgICAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qocl9rZXkpOykKKwkgICAgcmV0dXJuIChpbnNfcG9zID09IG1fbnVtX2UpID8gcG9zIDogaW5zX3BvczsKKwkgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaW5zX3BvcyA9PSBtX251bV9lKQorCSAgICBpbnNfcG9zID0gcG9zOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcl9rZXkpKQorICAgICAgICAgICAgeworCSAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKwkgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXkpOykKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICAgICAgfQorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisKKyAgICAgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKyAgICB9CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKyAgaWYgKGluc19wb3MgPT0gbV9udW1fZSkKKyAgICBfX3Rocm93X2luc2VydF9lcnJvcigpOworICByZXR1cm4gaW5zX3BvczsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ltcChjb25zdF9yZWZlcmVuY2Ugcl92YWwsIGZhbHNlX3R5cGUpCit7CisgIGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkgPSBQQl9EU19WMkYocl92YWwpOworICBjb25zdCBzaXplX3R5cGUgcG9zID0gZmluZF9pbnNfcG9zKHJfa2V5LCAKKwkJCQkgICAgIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7CisKKyAgaWYgKG1fZW50cmllc1twb3NdLm1fc3RhdCA9PSB2YWxpZF9lbnRyeV9zdGF0dXMpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KTspCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoJihtX2VudHJpZXMgKyBwb3MpLT5tX3ZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KSk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X2ltcChyX3ZhbCwgcG9zKSwgdHJ1ZSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vaW5zZXJ0X3N0b3JlX2hhc2hfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MzEwYjYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2luc2VydF9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTE4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnNlcnRfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBmaW5kIHJlbGF0ZWQgZnVuY3Rpb25zLAorICogd2hlbiB0aGUgaGFzaCB2YWx1ZSBpcyBzdG9yZWQuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29tcF9oYXNoCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2luc19wb3MoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgdHJ1ZV90eXBlKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCisgIGNvbXBfaGFzaCBwb3NfaGFzaF9wYWlyID0gcmFuZ2VkX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworCisgIHNpemVfdHlwZSBpOworCisgIC8qIFRoZSBpbnNlcnRpb24gcG9zaXRpb24gaXMgaW5pdHRlZCB0byBhIG5vbi1sZWdhbCB2YWx1ZSB0byBpbmRpY2F0ZQorICAgKiAgICAgdGhhdCBpdCBoYXMgbm90IGJlZW4gaW5pdHRlZCB5ZXQuCisgICAqLworICBzaXplX3R5cGUgaW5zX3BvcyA9IG1fbnVtX2U7CisgIHJlc2l6ZV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworICBmb3IgKGkgPSAwOyBpIDwgbV9udW1fZTsgKytpKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBwb3MgPSByYW5nZWRfcHJvYmVfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSwgcG9zX2hhc2hfcGFpci5zZWNvbmQsIGkpOworCisgICAgICBlbnRyeSogY29uc3QgcF9lID0gbV9lbnRyaWVzICsgcG9zOworICAgICAgc3dpdGNoKHBfZS0+bV9zdGF0KQorICAgICAgICB7CisgICAgICAgIGNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCSAgeworICAgICAgICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICAgICAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qocl9rZXkpOykKKworCSAgICByZXR1cm4gKChpbnNfcG9zID09IG1fbnVtX2UpID8KKwkJICAgICBzdGQ6Om1ha2VfcGFpcihwb3MsIHBvc19oYXNoX3BhaXIuc2Vjb25kKSA6CisJCSAgICAgc3RkOjptYWtlX3BhaXIoaW5zX3BvcywgcG9zX2hhc2hfcGFpci5zZWNvbmQpKTsKKwkgIH0KKwkgIGJyZWFrOworICAgICAgICBjYXNlIGVyYXNlZF9lbnRyeV9zdGF0dXM6CisJICBpZiAoaW5zX3BvcyA9PSBtX251bV9lKQorCSAgICBpbnNfcG9zID0gcG9zOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgaWYgKGhhc2hfZXFfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9lLT5tX3ZhbHVlKSwgcF9lLT5tX2hhc2gsCisJCQkJCSAgcl9rZXksIHBvc19oYXNoX3BhaXIuc2Vjb25kKSkKKyAgICAgICAgICAgIHsKKwkgICAgICByZXNpemVfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisJICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KTspCisgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwb3MsIHBvc19oYXNoX3BhaXIuc2Vjb25kKTsKKyAgICAgICAgICAgIH0KKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworICAgICAgICB9OworICAgICAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworICAgIH0KKyAgcmVzaXplX2Jhc2U6Om5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworICBpZiAoaW5zX3BvcyA9PSBtX251bV9lKQorICAgIF9fdGhyb3dfaW5zZXJ0X2Vycm9yKCk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNfcG9zLCBwb3NfaGFzaF9wYWlyLnNlY29uZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9pbXAoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCB0cnVlX3R5cGUpCit7CisgIGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkgPSBQQl9EU19WMkYocl92YWwpOworICBjb21wX2hhc2ggcG9zX2hhc2hfcGFpciA9IGZpbmRfaW5zX3BvcyhyX2tleSwgCisJCQkJCSB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwb3NfaGFzaF9wYWlyLmZpcnN0IDwgbV9udW1fZSk7CisgIGVudHJ5X3BvaW50ZXIgcF9lID0mIG1fZW50cmllc1twb3NfaGFzaF9wYWlyLmZpcnN0XTsKKyAgaWYgKHBfZS0+bV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXkpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigmcF9lLT5tX3ZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KSk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihpbnNlcnRfbmV3X2ltcChyX3ZhbCwgcG9zX2hhc2hfcGFpciksIHRydWUpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL2l0ZXJhdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFmODBmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9pdGVyYXRvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDgzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpdGVyYXRvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyBpdGVyYXRvcnMgcmVsYXRlZCBmdW5jdGlvbnMsIGUuZy4sCisgKiAgICBiZWdpbigpLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VuZF9pdDsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfY29uc3RfZW5kX2l0OworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICBwb2ludGVyXyBwX3ZhbHVlOworICBzaXplX3R5cGUgcG9zOworICBnZXRfc3RhcnRfaXRfc3RhdGUocF92YWx1ZSwgcG9zKTsKKyAgcmV0dXJuIGl0ZXJhdG9yKHBfdmFsdWUsIHBvcywgdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKQoreyByZXR1cm4gc19lbmRfaXQ7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sKKyAgY29uc3RfcG9pbnRlcl8gcF92YWx1ZTsKKyAgc2l6ZV90eXBlIHBvczsKKyAgZ2V0X3N0YXJ0X2l0X3N0YXRlKHBfdmFsdWUsIHBvcyk7CisgIHJldHVybiBjb25zdF9pdGVyYXRvcihwX3ZhbHVlLCBwb3MsIHRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIHNfY29uc3RfZW5kX2l0OyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWEzZjdhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIHBvbGljeSBhZ3Blc3MKKyAqICAgIGZ1bmN0aW9ucy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfaGFzaF9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgSGFzaF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfaGFzaF9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworRXFfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2VxX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBFcV9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfZXFfZm4oKSBjb25zdAoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1Byb2JlX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9wcm9iZV9mbigpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgUHJvYmVfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3Byb2JlX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitDb21iX1Byb2JlX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jb21iX3Byb2JlX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDb21iX1Byb2JlX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jb21iX3Byb2JlX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBSZXNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9yZXNpemVfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjgzN2EKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJlc2l6ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemVfaWZfbmVlZGVkKCkKK3sKKyAgaWYgKCFyZXNpemVfYmFzZTo6aXNfcmVzaXplX25lZWRlZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25ld19zaXplKG1fbnVtX2UsIG1fbnVtX3VzZWRfZSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZShzaXplX3R5cGUgbikKK3sgcmVzaXplX2ltcChyZXNpemVfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUobikpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZG9fcmVzaXplX2lmX25lZWRlZF9ub190aHJvdygpCit7CisgIGlmICghcmVzaXplX2Jhc2U6OmlzX3Jlc2l6ZV9uZWVkZWQoKSkKKyAgICByZXR1cm47CisKKyAgX190cnkKKyAgICB7CisgICAgICByZXNpemVfaW1wKHJlc2l6ZV9iYXNlOjpnZXRfbmV3X3NpemUobV9udW1fZSwgbV9udW1fdXNlZF9lKSk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7IH0KKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXAoc2l6ZV90eXBlIG5ld19zaXplKQoreworI2lmZGVmIFBCX0RTX1JFR1JFU1NJT04KKyAgdHlwZW5hbWUgQWxsb2NhdG9yOjpncm91cF9hZGp1c3RvciBhZGp1c3QobV9udW1fZSk7CisjZW5kaWYgCisKKyAgaWYgKG5ld19zaXplID09IG1fbnVtX2UpCisgICAgcmV0dXJuOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBjb25zdCBzaXplX3R5cGUgb2xkX3NpemUgPSBtX251bV9lOworICBlbnRyeV9hcnJheSBhX2VudHJpZXNfcmVzaXplZCA9IDA7CisKKyAgLy8gRm9sbG93aW5nIGxpbmUgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uLgorICBhX2VudHJpZXNfcmVzaXplZCA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKG5ld19zaXplKTsKKworICByYW5nZWRfcHJvYmVfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobmV3X3NpemUpOworICBtX251bV9lID0gbmV3X3NpemU7CisKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgYV9lbnRyaWVzX3Jlc2l6ZWRbaV0ubV9zdGF0ID0gZW1wdHlfZW50cnlfc3RhdHVzOworCisgIF9fdHJ5CisgICAgeworICAgICAgcmVzaXplX2ltcChhX2VudHJpZXNfcmVzaXplZCwgb2xkX3NpemUpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgZXJhc2VfYWxsX3ZhbGlkX2VudHJpZXMoYV9lbnRyaWVzX3Jlc2l6ZWQsIG5ld19zaXplKTsKKyAgICAgIG1fbnVtX2UgPSBvbGRfc2l6ZTsKKyAgICAgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUoYV9lbnRyaWVzX3Jlc2l6ZWQsIG5ld19zaXplKTsKKyAgICAgIHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChvbGRfc2l6ZSk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgLy8gQXQgdGhpcyBwb2ludCBubyBleGNlcHRpb25zIGNhbiBiZSB0aHJvd24uCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X2VudHJ5X2FycmF5X3ZhbGlkKGFfZW50cmllc19yZXNpemVkLCB0cmFpdHNfYmFzZTo6bV9zdG9yZV9leHRyYV9pbmRpY2F0b3IpOykKKworICBSZXNpemVfUG9saWN5Ojpub3RpZnlfcmVzaXplZChuZXdfc2l6ZSk7CisgIGVyYXNlX2FsbF92YWxpZF9lbnRyaWVzKG1fZW50cmllcywgb2xkX3NpemUpOworICBzX2VudHJ5X2FsbG9jYXRvci5kZWFsbG9jYXRlKG1fZW50cmllcywgb2xkX3NpemUpOworICBtX2VudHJpZXMgPSBhX2VudHJpZXNfcmVzaXplZDsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZXNpemVfaW1wKGVudHJ5X2FycmF5IGFfZW50cmllc19yZXNpemVkLCBzaXplX3R5cGUgb2xkX3NpemUpCit7CisgIGZvciAoc2l6ZV90eXBlIHBvcyA9IDA7IHBvcyA8IG9sZF9zaXplOyArK3BvcykKKyAgICBpZiAobV9lbnRyaWVzW3Bvc10ubV9zdGF0ID09IHZhbGlkX2VudHJ5X3N0YXR1cykKKyAgICAgIHJlc2l6ZV9pbXBfcmVhc3NpZ24obV9lbnRyaWVzICsgcG9zLCBhX2VudHJpZXNfcmVzaXplZCwgCisJCQkgIHRyYWl0c19iYXNlOjptX3N0b3JlX2V4dHJhX2luZGljYXRvcik7Cit9CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcD4KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfbm9fc3RvcmVfaGFzaF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyODM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw3MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmVzaXplX25vX3N0b3JlX2hhc2hfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiBncF9odF9tYXBfJ3MgcmVzaXplIHJlbGF0ZWQgZnVuY3Rpb25zLCB3aGVuIHRoZQorICogICAgaGFzaCB2YWx1ZSBpcyBub3Qgc3RvcmVkLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplX2ltcF9yZWFzc2lnbihlbnRyeV9wb2ludGVyIHBfZSwgZW50cnlfYXJyYXkgYV9lbnRyaWVzX3Jlc2l6ZWQsIAorCQkgICAgZmFsc2VfdHlwZSkKK3sKKyAgY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworICBzaXplX3R5cGUgaGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KTsKKyAgc2l6ZV90eXBlIGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBoYXNoLCBpKTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXdfZSA9IGFfZW50cmllc19yZXNpemVkICsgcG9zOworICAgICAgc3dpdGNoKHBfbmV3X2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIG5ldyAoJnBfbmV3X2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocF9lLT5tX3ZhbHVlKTsKKwkgIHBfbmV3X2UtPm1fc3RhdCA9IHZhbGlkX2VudHJ5X3N0YXR1czsKKwkgIHJldHVybjsKKyAgICAgICAgY2FzZSBlcmFzZWRfZW50cnlfc3RhdHVzOgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworCSAgYnJlYWs7CisgICAgICAgIGNhc2UgdmFsaWRfZW50cnlfc3RhdHVzOgorCSAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgIH07CisgICAgfQorICBfX3Rocm93X2luc2VydF9lcnJvcigpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3Jlc2l6ZV9zdG9yZV9oYXNoX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlOTYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9yZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByZXNpemVfc3RvcmVfaGFzaF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGdwX2h0X21hcF8ncyByZXNpemUgcmVsYXRlZCBmdW5jdGlvbnMsIHdoZW4gdGhlCisgKiAgICBoYXNoIHZhbHVlIGlzIHN0b3JlZC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3Jlc2l6ZV9pbXBfcmVhc3NpZ24oZW50cnlfcG9pbnRlciBwX2UsIGVudHJ5X2FycmF5IGFfZW50cmllc19yZXNpemVkLCAKKwkJICAgIHRydWVfdHlwZSkKK3sKKyAgY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihwX2UtPm1fdmFsdWUpOworICBzaXplX3R5cGUgaGFzaCA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBwX2UtPm1faGFzaCk7CisKKyAgc2l6ZV90eXBlIGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX251bV9lOyArK2kpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIHBvcyA9IHJhbmdlZF9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5LCBoYXNoLCBpKTsKKyAgICAgIGVudHJ5X3BvaW50ZXIgcF9uZXdfZSA9IGFfZW50cmllc19yZXNpemVkICsgcG9zOworICAgICAgc3dpdGNoKHBfbmV3X2UtPm1fc3RhdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIGVtcHR5X2VudHJ5X3N0YXR1czoKKwkgIG5ldyAoJnBfbmV3X2UtPm1fdmFsdWUpIHZhbHVlX3R5cGUocF9lLT5tX3ZhbHVlKTsKKwkgIHBfbmV3X2UtPm1faGFzaCA9IGhhc2g7CisJICBwX25ld19lLT5tX3N0YXQgPSB2YWxpZF9lbnRyeV9zdGF0dXM7CisJICByZXR1cm47CisgICAgICAgIGNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCgwKTsKKwkgIGJyZWFrOworICAgICAgICBjYXNlIHZhbGlkX2VudHJ5X3N0YXR1czoKKwkgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworICAgICAgICB9OworICAgIH0KKyAgX190aHJvd19pbnNlcnRfZXJyb3IoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9zdGFuZGFyZF9wb2xpY2llcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3N0YW5kYXJkX3BvbGljaWVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWMwNjM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2dwX2hhc2hfdGFibGVfbWFwXy9zdGFuZGFyZF9wb2xpY2llcy5ocHAKQEAgLTAsMCArMSw3NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3RhbmRhcmRfcG9saWNpZXMuaHBwCisgKiBDb250YWlucyBzdGFuZGFyZCBwb2xpY2llcyBmb3IgZ3BfaHRfbWFwIHR5cGVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfR1BfSFRfTUFQX1NUQU5EQVJEX1BPTElDSUVTX0hQUAorI2RlZmluZSBQQl9EU19HUF9IVF9NQVBfU1RBTkRBUkRfUE9MSUNJRVNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvaHRfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2xpbmVhcl9wcm9iZV9mbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3F1YWRyYXRpY19wcm9iZV9mbi5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbWJfUHJvYmVfRm4+CisgICAgc3RydWN0IGRlZmF1bHRfcHJvYmVfZm4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29tYl9Qcm9iZV9Gbjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIF9fY29uZGl0aW9uYWxfdHlwZTwKKyAgICAgIGlzX3NhbWU8CisJX19nbnVfcGJkczo6ZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZzxzdGQ6OnNpemVfdD4sCisgICAgICBDb21iX1Byb2JlX0ZuPjo6dmFsdWUsCisgICAgICBfX2dudV9wYmRzOjpsaW5lYXJfcHJvYmVfZm48c2l6ZV90eXBlPiwKKyAgICAgIF9fZ251X3BiZHM6OnF1YWRyYXRpY19wcm9iZV9mbjxzaXplX3R5cGU+ID46Ol9fdHlwZQorICAgICAgdHlwZTsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9ncF9oYXNoX3RhYmxlX21hcF8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmUxM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvZ3BfaGFzaF90YWJsZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyYWNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgZ3BfaHRfbWFwXydzIHRyYWNlLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBQQl9EU19IVF9NQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX251bV9lKSA8PCAiICIgPDwKKyAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX251bV91c2VkX2UpIDw8IHN0ZDo6ZW5kbDsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fbnVtX2U7ICsraSkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oaSkgPDwgIiAiOworCisgICAgICBzd2l0Y2gobV9lbnRyaWVzW2ldLm1fc3RhdCkKKyAgICAgICAgeworCWNhc2UgZW1wdHlfZW50cnlfc3RhdHVzOgorCSAgc3RkOjpjZXJyIDw8ICI8ZW1wdHk+IjsKKwkgIGJyZWFrOworCWNhc2UgZXJhc2VkX2VudHJ5X3N0YXR1czoKKwkgIHN0ZDo6Y2VyciA8PCAiPGVyYXNlZD4iOworCSAgYnJlYWs7CisJY2FzZSB2YWxpZF9lbnRyeV9zdGF0dXM6CisJICBzdGQ6OmNlcnIgPDwgUEJfRFNfVjJGKG1fZW50cmllc1tpXS5tX3ZhbHVlKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7CisJfTsKKworICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfSFRfTUFQX1RSQUNFXwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZ19pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZ19pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjc4NDgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9kaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nX2ltcC5ocHAKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZ19pbXAuaHBwCisgKiBDb250YWlucyBhIHJhbmdlLWhhc2hpbmcgcG9saWN5IGltcGxlbWVudGF0aW9uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreyBtYXNrX2Jhc2VkX2Jhc2U6OnN3YXAob3RoZXIpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKK3sgbWFza19iYXNlZF9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0Cit7IHJldHVybiBtYXNrX2Jhc2VkX2Jhc2U6OnJhbmdlX2hhc2goaGFzaCk7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9kaXJlY3RfbW9kX3JhbmdlX2hhc2hpbmdfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q1N2IyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAKQEAgLTAsMCArMSw1OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmFuZ2UtaGFzaGluZyBwb2xpY3kgaW1wbGVtZW50YXRpb24KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7IG1vZF9iYXNlZF9iYXNlOjpzd2FwKG90aGVyKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG4pCit7IG1vZF9iYXNlZF9iYXNlOjpub3RpZnlfcmVzaXplZChuKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK29wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0Cit7IHJldHVybiBtb2RfYmFzZWRfYmFzZTo6cmFuZ2VfaGFzaChoYXNoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9saW5lYXJfcHJvYmVfZm5faW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL2xpbmVhcl9wcm9iZV9mbl9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjI2NDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9saW5lYXJfcHJvYmVfZm5faW1wLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsaW5lYXJfcHJvYmVfZm5faW1wLmhwcAorICogQ29udGFpbnMgYSBwcm9iZSBwb2xpY3kgaW1wbGVtZW50YXRpb24KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKShzaXplX3R5cGUgaSkgY29uc3QKK3sKKyAgcmV0dXJuIChpKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmFiYmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCkBAIC0wLDAgKzEsMTA3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCisgKiBDb250YWlucyBhIHJhbmdlIGhhc2hpbmcgcG9saWN5IGJhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19NQVNLX0JBU0VEX1JBTkdFX0hBU0hJTkdfSFBQCisjZGVmaW5lIFBCX0RTX01BU0tfQkFTRURfUkFOR0VfSEFTSElOR19IUFAKKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgbWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICBjbGFzcyBtYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZyYgb3RoZXIpCisgICAgICB7IHN0ZDo6c3dhcChtX21hc2ssIG90aGVyLm1fbWFzayk7IH0KKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICByYW5nZV9oYXNoKHNpemVfdHlwZSBoYXNoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZV90eXBlKGhhc2ggJiBtX21hc2spOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgc2l6ZV90eXBlIAkJbV9tYXNrOworICAgICAgY29uc3Qgc3RhdGljIHNpemVfdHlwZSAJc19udW1fYml0c19pbl9zaXplX3R5cGU7CisgICAgICBjb25zdCBzdGF0aWMgc2l6ZV90eXBlIAlzX2hpZ2hlc3RfYml0XzE7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjpzX251bV9iaXRzX2luX3NpemVfdHlwZSA9CisgICAgICBzaXplb2YodHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZSkgPDwgMzsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZSBQQl9EU19DTEFTU19DX0RFQzo6c19oaWdoZXN0X2JpdF8xID0gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZT4oMSkgPDwgKHNfbnVtX2JpdHNfaW5fc2l6ZV90eXBlIC0gMSk7CisKKyAKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpCisgICAgeworICAgICAgc2l6ZV90eXBlIGkgPSAwOworICAgICAgd2hpbGUgKHNpemUgXiBzX2hpZ2hlc3RfYml0XzEpCisJeworCSAgc2l6ZSA8PD0gMTsKKwkgICsraTsKKwl9CisKKyAgICAgIG1fbWFzayA9IDE7CisgICAgICBpICs9IDI7CisgICAgICB3aGlsZSAoaSsrIDwgc19udW1fYml0c19pbl9zaXplX3R5cGUpCisgICAgICAgIG1fbWFzayA9IChtX21hc2sgPDwgMSkgXiAxOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tb2RfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tb2RfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxMGUwNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL21vZF9iYXNlZF9yYW5nZV9oYXNoaW5nLmhwcApAQCAtMCwwICsxLDEwOCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwCisgKiBDb250YWlucyBhIHJhbmdlIGhhc2hpbmcgcG9saWN5IGJhc2UuCisgKi8KKworI2lmbmRlZiBQQl9EU19NT0RfQkFTRURfUkFOR0VfSEFTSElOR19IUFAKKyNkZWZpbmUgUEJfRFNfTU9EX0JBU0VEX1JBTkdFX0hBU0hJTkdfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMJCQlcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQlcCisgICAgbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmc8CQkJCQlcCisJCQkJCQlTaXplX1R5cGU+CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgbW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmcKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICB2b2lkCisgICAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHJhbmdlX2hhc2goc2l6ZV90eXBlIGhhc2gpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBtX3NpemU7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKKyAgICB7CisgICAgICBtX3NpemUgPSBzaXplOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VfaGFzaChzaXplX3R5cGUgaGFzaCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKGhhc2ggJSBtX3NpemUpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19NT0RfQkFTRURfUkFOR0VfSEFTSElOR19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3Byb2JlX2ZuX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcHJvYmVfZm5fYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwY2ZjMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3Byb2JlX2ZuX2Jhc2UuaHBwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHByb2JlX2ZuX2Jhc2UuaHBwCisgKiBDb250YWlucyBhIHByb2JlIHBvbGljeSBiYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfUFJPQkVfRk5fQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfUFJPQkVfRk5fQkFTRV9IUFAKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBwcm9iZV9mbl9iYXNlCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIH5wcm9iZV9mbl9iYXNlKCkgeyB9CisgICAgfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9xdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3F1YWRyYXRpY19wcm9iZV9mbl9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjN2E2YzQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9xdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcApAQCAtMCwwICsxLDUzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBxdWFkcmF0aWNfcHJvYmVfZm5faW1wLmhwcAorICogQ29udGFpbnMgYSBwcm9iZSBwb2xpY3kgaW1wbGVtZW50YXRpb24KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKShzaXplX3R5cGUgaSkgY29uc3QKK3sKKyAgcmV0dXJuIChpKiAgaSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfaGFzaF9mbi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfaGFzaF9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4OTkyNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3JhbmdlZF9oYXNoX2ZuLmhwcApAQCAtMCwwICsxLDM1OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmFuZ2VkX2hhc2hfZm4uaHBwCisgKiBDb250YWlucyBhIHVuaWZpZWQgcmFuZ2VkIGhhc2ggZnVuY3RvciwgYWxsb3dpbmcgdGhlIGhhc2ggdGFibGVzCisgKiB0byBkZWFsIHdpdGggYSBzaW5nbGUgY2xhc3MgZm9yIHJhbmdlZCBoYXNoaW5nLgorICovCisKKyNpZm5kZWYgUEJfRFNfUkFOR0VEX0hBU0hfRk5fSFBQCisjZGVmaW5lIFBCX0RTX1JBTkdFRF9IQVNIX0ZOX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iYXNpY190eXBlcy5ocHA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwgCisJICAgICB0eXBlbmFtZSBDb21iX0hhc2hfRm4sIGJvb2wgU3RvcmVfSGFzaD4KKyAgICBjbGFzcyByYW5nZWRfaGFzaF9mbjsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBBbGxvY2F0b3IsIFwKKwkgICAgIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcmFuZ2VkX2hhc2hfZm48S2V5LAlIYXNoX0ZuLCBBbGxvY2F0b3IsIENvbWJfSGFzaF9GbiwgZmFsc2U+CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiAxCisgICAgICogVGhlIGNsaWVudCBzdXBwbGllcyBhIGhhc2ggZnVuY3Rpb24gYW5kIGEgcmFuZ2VkIGhhc2ggZnVuY3Rpb24sCisgICAgICogYW5kIHJlcXVlc3RzIHRoYXQgaGFzaCB2YWx1ZXMgbm90IGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBBbGxvY2F0b3IsIAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9oYXNoX2ZuPCBLZXksIEhhc2hfRm4sIEFsbG9jYXRvciwgQ29tYl9IYXNoX0ZuLCBmYWxzZT4gCisgICAgOiBwdWJsaWMgSGFzaF9GbiwgcHVibGljIENvbWJfSGFzaF9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgSGFzaF9GbiBoYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIENvbWJfSGFzaF9GbiBjb21iX2hhc2hfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8IEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9IYXNoX0ZuJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgb3BlcmF0b3IoKShjb25zdF9rZXlfcmVmZXJlbmNlKSBjb25zdDsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgeyBDb21iX0hhc2hfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKQorICAgIHsgQ29tYl9IYXNoX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgCisJCSAgIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pLCBDb21iX0hhc2hfRm4ocl9jb21iX2hhc2hfZm4pCisgICAgeyBjb21iX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBjb21iX2hhc2hfZm5fYmFzZTo6c3dhcChvdGhlcik7CisgICAgICBzdGQ6OnN3YXAoKEhhc2hfRm4mICkoKnRoaXMpLCAoSGFzaF9GbiYgKW90aGVyKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpCisgICAgeyBjb21iX2hhc2hfZm5fYmFzZTo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAorICAgIHsgcmV0dXJuIChjb21iX2hhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShoYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpKSk7fQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwgXAorCSAgICAgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfaGFzaF9mbjxLZXksSGFzaF9GbiwJQWxsb2NhdG9yLCBDb21iX0hhc2hfRm4sIHRydWU+CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiAyCisgICAgICogVGhlIGNsaWVudCBzdXBwbGllcyBhIGhhc2ggZnVuY3Rpb24gYW5kIGEgcmFuZ2VkIGhhc2ggZnVuY3Rpb24sCisgICAgICogYW5kIHJlcXVlc3RzIHRoYXQgaGFzaCB2YWx1ZXMgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwKKwkgICAgIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKyAgICBjbGFzcyByYW5nZWRfaGFzaF9mbjxLZXksIEhhc2hfRm4sIEFsbG9jYXRvciwgQ29tYl9IYXNoX0ZuLCB0cnVlPiAKKyAgICA6IHB1YmxpYyBIYXNoX0ZuLCBwdWJsaWMgQ29tYl9IYXNoX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c2l6ZV90eXBlLCBzaXplX3R5cGU+IGNvbXBfaGFzaDsKKyAgICAgIHR5cGVkZWYgSGFzaF9GbiBoYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIENvbWJfSGFzaF9GbiBjb21iX2hhc2hfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXIga2V5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2tleV9yZWZlcmVuY2U7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mLCBjb25zdCBDb21iX0hhc2hfRm4mKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgY29tcF9oYXNoCisgICAgICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBpbmxpbmUgY29tcF9oYXNoCisgICAgICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2UsIHNpemVfdHlwZSkgY29uc3Q7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9IYXNoX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbikgOgorICAgICAgSGFzaF9GbihyX2hhc2hfZm4pCisgICAgeyBDb21iX0hhc2hfRm46Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCAKKwkJICAgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbiksIENvbWJfSGFzaF9GbihyX2NvbWJfaGFzaF9mbikKKyAgICB7IGNvbWJfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIGNvbWJfaGFzaF9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgICAgIHN0ZDo6c3dhcCgoSGFzaF9GbiYgKSgqdGhpcyksIChIYXNoX0ZuJiApb3RoZXIpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSkKKyAgICB7IGNvbWJfaGFzaF9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbXBfaGFzaAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGhhc2ggPSBoYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkocl9rZXkpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbWJfaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2gpLCBoYXNoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29tcF9oYXNoCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksIHNpemVfdHlwZSBoYXNoKSBjb25zdAorI2Vsc2UgCisgICAgICAoY29uc3Rfa2V5X3JlZmVyZW5jZSAvKnJfa2V5Ki8sIHNpemVfdHlwZSBoYXNoKSBjb25zdAorI2VuZGlmCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhhc2ggPT0gaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoY29tYl9oYXNoX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaCksIGhhc2gpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcmFuZ2VkX2hhc2hfZm48S2V5LAludWxsX2hhc2hfZm4sIEFsbG9jYXRvciwgQ29tYl9IYXNoX0ZuLCBmYWxzZT4KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIDMKKyAgICAgKiBUaGUgY2xpZW50IGRvZXMgbm90IHN1cHBseSBhIGhhc2ggZnVuY3Rpb24gKGJ5IHNwZWNpZnlpbmcKKyAgICAgKiBudWxsX2hhc2hfZm4gYXMgdGhlIEhhc2hfRm4gcGFyYW1ldGVyKSwgYW5kIHJlcXVlc3RzIHRoYXQgaGFzaAorICAgICAqIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEFsbG9jYXRvciwgdHlwZW5hbWUgQ29tYl9IYXNoX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9oYXNoX2ZuPEtleSwgbnVsbF9oYXNoX2ZuLCBBbGxvY2F0b3IsIENvbWJfSGFzaF9GbiwgZmFsc2U+IAorICAgIDogcHVibGljIG51bGxfaGFzaF9mbiwgcHVibGljIENvbWJfSGFzaF9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ29tYl9IYXNoX0ZuIGNvbWJfaGFzaF9mbl9iYXNlOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IENvbWJfSGFzaF9GbiYpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IG51bGxfaGFzaF9mbiYsIGNvbnN0IENvbWJfSGFzaF9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9IYXNoX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIDoKKyAgICAgIENvbWJfSGFzaF9GbihyX2NvbWJfaGFzaF9mbikKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBudWxsX2hhc2hfZm4mIHJfbnVsbF9oYXNoX2ZuLCAKKwkJICAgY29uc3QgQ29tYl9IYXNoX0ZuJiByX2NvbWJfaGFzaF9mbikgCisgICAgOiBDb21iX0hhc2hfRm4ocl9jb21iX2hhc2hfZm4pCisgICAgeyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeyBjb21iX2hhc2hfZm5fYmFzZTo6c3dhcChvdGhlcik7IH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgcmFuZ2VkX2hhc2hfZm48S2V5LAludWxsX2hhc2hfZm4sIEFsbG9jYXRvciwgQ29tYl9IYXNoX0ZuLCB0cnVlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gNAorICAgICAqIFRoZSBjbGllbnQgZG9lcyBub3Qgc3VwcGx5IGEgaGFzaCBmdW5jdGlvbiAoYnkgc3BlY2lmeWluZworICAgICAqIG51bGxfaGFzaF9mbiBhcyB0aGUgSGFzaF9GbiBwYXJhbWV0ZXIpLCBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoCisgICAgICogdmFsdWVzIGJlIHN0b3JlZC4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBBbGxvY2F0b3IsIHR5cGVuYW1lIENvbWJfSGFzaF9Gbj4KKyAgICBjbGFzcyByYW5nZWRfaGFzaF9mbjxLZXksIG51bGxfaGFzaF9mbiwgQWxsb2NhdG9yLCBDb21iX0hhc2hfRm4sIHRydWU+IAorICAgIDogcHVibGljIG51bGxfaGFzaF9mbiwgcHVibGljIENvbWJfSGFzaF9GbgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ29tYl9IYXNoX0ZuIGNvbWJfaGFzaF9mbl9iYXNlOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IENvbWJfSGFzaF9GbiYpOworCisgICAgICByYW5nZWRfaGFzaF9mbihzaXplX3R5cGUsIGNvbnN0IG51bGxfaGFzaF9mbiYsIGNvbnN0IENvbWJfSGFzaF9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9oYXNoX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9IYXNoX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IENvbWJfSGFzaF9GbiYgcl9jb21iX2hhc2hfZm4pIAorICAgIDogQ29tYl9IYXNoX0ZuKHJfY29tYl9oYXNoX2ZuKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX2hhc2hfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IG51bGxfaGFzaF9mbiYgcl9udWxsX2hhc2hfZm4sIAorCQkgICBjb25zdCBDb21iX0hhc2hfRm4mIHJfY29tYl9oYXNoX2ZuKSAKKyAgICA6IENvbWJfSGFzaF9GbihyX2NvbWJfaGFzaF9mbikKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7IGNvbWJfaGFzaF9mbl9iYXNlOjpzd2FwKG90aGVyKTsgfQorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9yYW5nZWRfcHJvYmVfZm4uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcmFuZ2VkX3Byb2JlX2ZuLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZiYTlkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vcmFuZ2VkX3Byb2JlX2ZuLmhwcApAQCAtMCwwICsxLDMyNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmFuZ2VkX3Byb2JlX2ZuLmhwcAorICogQ29udGFpbnMgYSB1bmlmaWVkIHJhbmdlZCBwcm9iZSBmdW5jdG9yLCBhbGxvd2luZyB0aGUgcHJvYmUgdGFibGVzIHRvIGRlYWwgd2l0aAorICogICAgYSBzaW5nbGUgY2xhc3MgZm9yIHJhbmdlZCBwcm9iZWluZy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1JBTkdFRF9QUk9CRV9GTl9IUFAKKyNkZWZpbmUgUEJfRFNfUkFOR0VEX1BST0JFX0ZOX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iYXNpY190eXBlcy5ocHA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuLCBib29sIFN0b3JlX0hhc2g+CisgICAgY2xhc3MgcmFuZ2VkX3Byb2JlX2ZuOworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwgXAorCSAgICAgdHlwZW5hbWUgQ29tYl9Qcm9iZV9GbiwgdHlwZW5hbWUgUHJvYmVfRm4+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJhbmdlZF9wcm9iZV9mbjxLZXksIEhhc2hfRm4sIEFsbG9jYXRvciwgQ29tYl9Qcm9iZV9GbiwgUHJvYmVfRm4sIGZhbHNlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMSAgICAgCisgICAgICogVGhlIGNsaWVudCBzdXBwbGllcyBhIHByb2JlIGZ1bmN0aW9uIGFuZCBhIHJhbmdlZCBwcm9iZQorICAgICAqIGZ1bmN0aW9uLCBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjxLZXksIEhhc2hfRm4sIEFsbG9jYXRvciwgQ29tYl9Qcm9iZV9GbiwKKwkJCSAgUHJvYmVfRm4sIGZhbHNlPiAKKyAgICA6IHB1YmxpYyBIYXNoX0ZuLCBwdWJsaWMgQ29tYl9Qcm9iZV9GbiwgcHVibGljIFByb2JlX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBDb21iX1Byb2JlX0ZuIGNvbWJfcHJvYmVfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgSGFzaF9GbiBoYXNoX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIFByb2JlX0ZuIHByb2JlX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyIGtleV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlKTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYpOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYpOworCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBIYXNoX0ZuJiwgY29uc3QgQ29tYl9Qcm9iZV9GbiYsIAorCQkgICAgICBjb25zdCBQcm9iZV9GbiYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSk7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSwgc2l6ZV90eXBlLCBzaXplX3R5cGUpIGNvbnN0OworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUpCisgICAgeyBDb21iX1Byb2JlX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pCisgICAgeyBDb21iX1Byb2JlX0ZuOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9Qcm9iZV9GbihyX2NvbWJfcHJvYmVfZm4pCisgICAgeyBjb21iX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlIHNpemUsIGNvbnN0IEhhc2hfRm4mIHJfaGFzaF9mbiwgCisJCSAgICBjb25zdCBDb21iX1Byb2JlX0ZuJiByX2NvbWJfcHJvYmVfZm4sIAorCQkgICAgY29uc3QgUHJvYmVfRm4mIHJfcHJvYmVfZm4pIAorICAgIDogSGFzaF9GbihyX2hhc2hfZm4pLCBDb21iX1Byb2JlX0ZuKHJfY29tYl9wcm9iZV9mbiksIFByb2JlX0ZuKHJfcHJvYmVfZm4pCisgICAgeyBjb21iX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCisgICAgeworICAgICAgY29tYl9wcm9iZV9mbl9iYXNlOjpzd2FwKG90aGVyKTsKKyAgICAgIHN0ZDo6c3dhcCgoSGFzaF9GbiYgKSgqdGhpcyksIChIYXNoX0ZuJilvdGhlcik7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgeyByZXR1cm4gY29tYl9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSkpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSwgc2l6ZV90eXBlIGhhc2gsIHNpemVfdHlwZSBpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBjb21iX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaCArIHByb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaSkpOworICAgIH0KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoX0ZuLCB0eXBlbmFtZSBBbGxvY2F0b3IsIFwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByYW5nZWRfcHJvYmVfZm48S2V5LCBIYXNoX0ZuLCBBbGxvY2F0b3IsIENvbWJfUHJvYmVfRm4sIFByb2JlX0ZuLCB0cnVlPgorCisgICAgLyoqCisgICAgICogU3BlY2lhbGl6YXRpb24gMi0gVGhlIGNsaWVudCBzdXBwbGllcyBhIHByb2JlIGZ1bmN0aW9uIGFuZCBhIHJhbmdlZAorICAgICAqICAgIHByb2JlIGZ1bmN0aW9uLCBhbmQgcmVxdWVzdHMgdGhhdCBoYXNoIHZhbHVlcyBub3QgYmUgc3RvcmVkLgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hfRm4sIHR5cGVuYW1lIEFsbG9jYXRvciwKKwkgICAgIHR5cGVuYW1lIENvbWJfUHJvYmVfRm4sIHR5cGVuYW1lIFByb2JlX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjxLZXksIEhhc2hfRm4sIEFsbG9jYXRvciwgQ29tYl9Qcm9iZV9GbiwgCisJCQkgIFByb2JlX0ZuLCB0cnVlPiAKKyAgICA6IHB1YmxpYyBIYXNoX0ZuLCBwdWJsaWMgQ29tYl9Qcm9iZV9GbiwgcHVibGljIFByb2JlX0ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c2l6ZV90eXBlLCBzaXplX3R5cGU+IGNvbXBfaGFzaDsKKyAgICAgIHR5cGVkZWYgQ29tYl9Qcm9iZV9GbiBjb21iX3Byb2JlX2ZuX2Jhc2U7CisgICAgICB0eXBlZGVmIEhhc2hfRm4gaGFzaF9mbl9iYXNlOworICAgICAgdHlwZWRlZiBQcm9iZV9GbiBwcm9iZV9mbl9iYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlciBrZXlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBrZXlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSk7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mKTsKKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgSGFzaF9GbiYsIAorCQkgICAgICBjb25zdCBDb21iX1Byb2JlX0ZuJik7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUsIGNvbnN0IEhhc2hfRm4mLCBjb25zdCBDb21iX1Byb2JlX0ZuJiwgCisJCSAgICAgIGNvbnN0IFByb2JlX0ZuJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlKTsKKworICAgICAgaW5saW5lIGNvbXBfaGFzaAorICAgICAgb3BlcmF0b3IoKShjb25zdF9rZXlfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgb3BlcmF0b3IoKShjb25zdF9rZXlfcmVmZXJlbmNlLCBzaXplX3R5cGUsIHNpemVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSwgc2l6ZV90eXBlKSBjb25zdDsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplKQorICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKQorICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSwgY29uc3QgSGFzaF9GbiYgcl9oYXNoX2ZuLCAKKwkJICAgIGNvbnN0IENvbWJfUHJvYmVfRm4mIHJfY29tYl9wcm9iZV9mbikgCisgICAgOiBIYXNoX0ZuKHJfaGFzaF9mbiksIENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSBzaXplLCBjb25zdCBIYXNoX0ZuJiByX2hhc2hfZm4sIAorCQkgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuLCAKKwkJICAgIGNvbnN0IFByb2JlX0ZuJiByX3Byb2JlX2ZuKSAKKyAgICA6IEhhc2hfRm4ocl9oYXNoX2ZuKSwgQ29tYl9Qcm9iZV9GbihyX2NvbWJfcHJvYmVfZm4pLCBQcm9iZV9GbihyX3Byb2JlX2ZuKQorICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpub3RpZnlfcmVzaXplZChzaXplKTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQorICAgIHsKKyAgICAgIGNvbWJfcHJvYmVfZm5fYmFzZTo6c3dhcChvdGhlcik7CisgICAgICBzdGQ6OnN3YXAoKEhhc2hfRm4mICkoKnRoaXMpLCAoSGFzaF9GbiYgKW90aGVyKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHZvaWQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpCisgICAgeyBjb21iX3Byb2JlX2ZuX2Jhc2U6Om5vdGlmeV9yZXNpemVkKHNpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29tcF9oYXNoCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaGFzaCA9IGhhc2hfZm5fYmFzZTo6b3BlcmF0b3IoKShyX2tleSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoY29tYl9wcm9iZV9mbl9iYXNlOjpvcGVyYXRvcigpKGhhc2gpLCBoYXNoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSwgc2l6ZV90eXBlIGhhc2gsIHNpemVfdHlwZSBpKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBjb21iX3Byb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaGFzaCArIHByb2JlX2ZuX2Jhc2U6Om9wZXJhdG9yKCkoaSkpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKQorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisjZWxzZSAKKyAgICAgIChjb25zdF9rZXlfcmVmZXJlbmNlIC8qcl9rZXkqLywgc2l6ZV90eXBlIGhhc2gpIGNvbnN0CisjZW5kaWYgCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhhc2ggPT0gaGFzaF9mbl9iYXNlOjpvcGVyYXRvcigpKHJfa2V5KSk7CisgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsaXphdGlvbiAzIGFuZCA0CisgICAgICogVGhlIGNsaWVudCBkb2VzIG5vdCBzdXBwbHkgYSBoYXNoIGZ1bmN0aW9uIG9yIHByb2JlIGZ1bmN0aW9uLAorICAgICAqIGFuZCByZXF1ZXN0cyB0aGF0IGhhc2ggdmFsdWVzIG5vdCBiZSBzdG9yZWQuCisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgQWxsb2NhdG9yLCB0eXBlbmFtZSBDb21iX1Byb2JlX0ZuPgorICAgIGNsYXNzIHJhbmdlZF9wcm9iZV9mbjxLZXksIG51bGxfaGFzaF9mbiwgQWxsb2NhdG9yLCBDb21iX1Byb2JlX0ZuLCAKKwkJCSAgbnVsbF9wcm9iZV9mbiwgZmFsc2U+IAorICAgIDogcHVibGljIENvbWJfUHJvYmVfRm4sIHB1YmxpYyBudWxsX2hhc2hfZm4sIHB1YmxpYyBudWxsX3Byb2JlX2ZuCisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBDb21iX1Byb2JlX0ZuIGNvbWJfcHJvYmVfZm5fYmFzZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXIga2V5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X2tleV9yZWZlcmVuY2U7CisKKyAgICAgIHJhbmdlZF9wcm9iZV9mbihzaXplX3R5cGUgc2l6ZSkKKyAgICAgIHsgQ29tYl9Qcm9iZV9Gbjo6bm90aWZ5X3Jlc2l6ZWQoc2l6ZSk7IH0KKworICAgICAgcmFuZ2VkX3Byb2JlX2ZuKHNpemVfdHlwZSwgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuKQorICAgICAgOiBDb21iX1Byb2JlX0ZuKHJfY29tYl9wcm9iZV9mbikKKyAgICAgIHsgfQorCisgICAgICByYW5nZWRfcHJvYmVfZm4oc2l6ZV90eXBlLCBjb25zdCBudWxsX2hhc2hfZm4mLCAKKwkJICAgICAgY29uc3QgQ29tYl9Qcm9iZV9GbiYgcl9jb21iX3Byb2JlX2ZuLCAKKwkJICAgICAgY29uc3QgbnVsbF9wcm9iZV9mbiYpCisgICAgICA6IENvbWJfUHJvYmVfRm4ocl9jb21iX3Byb2JlX2ZuKQorICAgICAgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocmFuZ2VkX3Byb2JlX2ZuJiBvdGhlcikKKyAgICAgIHsgY29tYl9wcm9iZV9mbl9iYXNlOjpzd2FwKG90aGVyKTsgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3Byb2JlX2ZuLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9wcm9iZV9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjZDgyNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9wcm9iZV9mbi5ocHAKQEAgLTAsMCArMSw3MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3Byb2JlX2ZuLmhwcAorICogQ29udGFpbnMgYSBzYW1wbGUgcHJvYmUgcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1BST0JFX0ZOX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUFJPQkVfRk5fSFBQCisKKy8vIEEgc2FtcGxlIHByb2JlIHBvbGljeS4KK2NsYXNzIHNhbXBsZV9wcm9iZV9mbgoreworCitwdWJsaWM6CisKKyAgLy8gU2l6ZSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworcHVibGljOgorCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIHNhbXBsZV9wcm9iZV9mbigpOworCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIHNhbXBsZV9wcm9iZV9mbihjb25zdCBzYW1wbGVfcHJvYmVfZm4mIG90aGVyKTsKKworICAvLyBTd2FwcyBjb250ZW50LgorICBpbmxpbmUgdm9pZAorICBzd2FwKHNhbXBsZV9wcm9iZV9mbiYgb3RoZXIpOworCitwcm90ZWN0ZWQ6CisKKyAgLy8gUmV0dXJucyB0aGUgaS10aCBvZmZzZXQgZnJvbSB0aGUgaGFzaCB2YWx1ZSBvZiBzb21lIGtleSByX2tleS4KKyAgaW5saW5lIHNpemVfdHlwZQorICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksIHNpemVfdHlwZSBpKSBjb25zdDsKKworfTsKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfU0FNUExFX1BST0JFX0ZOX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlX2hhc2hpbmcuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlX2hhc2hpbmcuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGYxMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VfaGFzaGluZy5ocHAKQEAgLTAsMCArMSw3NyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3JhbmdlX2hhc2hpbmcuaHBwCisgKiBDb250YWlucyBhIHJhbmdlIGhhc2hpbmcgcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1JBTkdFX0hBU0hJTkdfSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9SQU5HRV9IQVNISU5HX0hQUAorCisvLyBBIHNhbXBsZSByYW5nZS1oYXNoaW5nIGZ1bmN0b3IuCitjbGFzcyBzYW1wbGVfcmFuZ2VfaGFzaGluZworeworCitwdWJsaWM6CisKKyAgLy8gU2l6ZSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworcHVibGljOgorCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKCk7CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgc2FtcGxlX3JhbmdlX2hhc2hpbmcoY29uc3Qgc2FtcGxlX3JhbmdlX2hhc2hpbmcmIG90aGVyKTsKKworICAvLyBTd2FwcyBjb250ZW50LgorICBpbmxpbmUgdm9pZAorICBzd2FwKHNhbXBsZV9yYW5nZV9oYXNoaW5nJiBvdGhlcik7CisKK3Byb3RlY3RlZDoKKworICAvLyBOb3RpZmllcyB0aGUgcG9saWN5IG9iamVjdCB0aGF0IHRoZSBjb250YWluZXIncyBfX3NpemUgaGFzIGNoYW5nZWQgdG8gc2l6ZS4KKyAgdm9pZAorICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSk7CisKKyAgLy8gVHJhbnNmb3JtcyB0aGUgX19oYXNoIHZhbHVlIGhhc2ggaW50byBhIHJhbmdlZC1oYXNoIHZhbHVlLgorICBpbmxpbmUgc2l6ZV90eXBlCisgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0OworCit9OworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TQU1QTEVfUkFOR0VfSEFTSElOR19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfaGFzaF9mbi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VkX2hhc2hfZm4uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTA0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9zYW1wbGVfcmFuZ2VkX2hhc2hfZm4uaHBwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV9yYW5nZWRfaGFzaF9mbi5ocHAKKyAqIENvbnRhaW5zIGEgcmFuZ2VkIGhhc2ggcG9saWN5LgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1JBTkdFRF9IQVNIX0ZOX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUkFOR0VEX0hBU0hfRk5fSFBQCisKKy8vIEEgc2FtcGxlIHJhbmdlZC1oYXNoIGZ1bmN0b3IuCitjbGFzcyBzYW1wbGVfcmFuZ2VkX2hhc2hfZm4KK3sKKworcHVibGljOgorCisgIC8vIFNpemUgdHlwZS4KKyAgdHlwZWRlZiBzdGQ6OnNpemVfdCBzaXplX3R5cGU7CisKK3B1YmxpYzoKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfcmFuZ2VkX2hhc2hfZm4oKTsKKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfcmFuZ2VkX2hhc2hfZm4oY29uc3Qgc2FtcGxlX3JhbmdlZF9oYXNoX2ZuJiBvdGhlcik7CisKKyAgLy8gU3dhcHMgY29udGVudC4KKyAgaW5saW5lIHZvaWQKKyAgc3dhcChzYW1wbGVfcmFuZ2VkX2hhc2hfZm4mIG90aGVyKTsKKworcHJvdGVjdGVkOgorCisgIC8vIE5vdGlmaWVzIHRoZSBwb2xpY3kgb2JqZWN0IHRoYXQgdGhlIGNvbnRhaW5lcidzIF9fc2l6ZSBoYXMgY2hhbmdlZCB0byBzaXplLgorICB2b2lkCisgIG5vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBzaXplKTsKKworICAvLyBUcmFuc2Zvcm1zIHJfa2V5IGludG8gYSBwb3NpdGlvbiB3aXRoaW4gdGhlIHRhYmxlLgorICBpbmxpbmUgc2l6ZV90eXBlCisgIG9wZXJhdG9yKCkoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3Q7CisKK307CisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9SQU5HRURfSEFTSF9GTl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfcHJvYmVfZm4uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vc2FtcGxlX3JhbmdlZF9wcm9iZV9mbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjZmRmNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3NhbXBsZV9yYW5nZWRfcHJvYmVfZm4uaHBwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV9yYW5nZWRfcHJvYmVfZm4uaHBwCisgKiBDb250YWlucyBhIHJhbmdlZCBwcm9iZSBwb2xpY3kuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfUkFOR0VEX1BST0JFX0ZOX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUkFOR0VEX1BST0JFX0ZOX0hQUAorCisvLyBBIHNhbXBsZSByYW5nZWQtcHJvYmUgZnVuY3Rvci4KK2NsYXNzIHNhbXBsZV9yYW5nZWRfcHJvYmVfZm4KK3sKKworcHVibGljOgorCisgIC8vIFNpemUgdHlwZS4KKyAgdHlwZWRlZiBzdGQ6OnNpemVfdCBzaXplX3R5cGU7CisKK3B1YmxpYzoKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuKCk7CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgc2FtcGxlX3JhbmdlZF9wcm9iZV9mbihjb25zdCBzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuJiBvdGhlcik7CisKKyAgLy8gU3dhcHMgY29udGVudC4KKyAgaW5saW5lIHZvaWQKKyAgc3dhcChzYW1wbGVfcmFuZ2VkX3Byb2JlX2ZuJiBvdGhlcik7CisKK3Byb3RlY3RlZDoKKworICAvLyBOb3RpZmllcyB0aGUgcG9saWN5IG9iamVjdCB0aGF0IHRoZSBjb250YWluZXIncyBfX3NpemUgaGFzIGNoYW5nZWQgdG8gc2l6ZS4KKyAgdm9pZAorICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgc2l6ZSk7CisKKyAgLy8gVHJhbnNmb3JtcyB0aGUgY29uc3Qga2V5IHJlZmVyZW5jZSByX2tleSBpbnRvIHRoZSBpLXRoIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGFibGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCBjb2xsaXNpb24gd2l0aGluIHRoZSBwcm9iZSBzZXF1ZW5jZS4KKyAgaW5saW5lIHNpemVfdHlwZQorICBvcGVyYXRvcigpKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksIHN0ZDo6c2l6ZV90IGhhc2gsIHNpemVfdHlwZSBpKSBjb25zdDsKKworfTsKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfU0FNUExFX1JBTkdFRF9QUk9CRV9GTl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDhmM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTYyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHJldHVybmVkIGJ5IHRoZSB0YWJsZSdzIGNvbnN0IGZpbmQgYW5kIGluc2VydAorICogICAgIG1ldGhvZHMuCisgKi8KKworI2lmbmRlZiBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX0NPTlNUX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX0NPTlNUX0lURVJBVE9SX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdF9wb2ludF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMJCQkJCQlcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl88Tm9kZSwgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMJCQkJCQlcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX2NvbnN0X3BvaW50X2l0ZXJhdG9yXzxOb2RlLCBBbGxvY2F0b3I+CisKKyAgICAvLyBDb25zdCBwb2ludC10eXBlIGl0ZXJhdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGUsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX2NvbnN0X2l0ZXJhdG9yXyA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgICAgeworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6bm9kZV9wb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKworICAgICAgLy8gQ2F0ZWdvcnkuCisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vIERpZmZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICAvLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpwb2ludGVyIHBvaW50ZXI7CisKKyAgICAgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworCisgICAgICAvLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIGlubGluZQorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl8obm9kZV9wb2ludGVyIHBfbmQpIDogYmFzZV90eXBlKHBfbmQpCisgICAgICB7IH0KKworICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIGlubGluZQorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl8oKQorICAgICAgeyB9CisKKyAgICAgIC8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfY29uc3RfaXRlcmF0b3JfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOiBiYXNlX3R5cGUob3RoZXIpCisgICAgICB7IH0KKworICAgICAgLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiAoYmFzZV90eXBlOjptX3BfbmQgPT0gb3RoZXIubV9wX25kKTsgfQorCisgICAgICAvLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiAoYmFzZV90eXBlOjptX3BfbmQgIT0gb3RoZXIubV9wX25kKTsgfQorCisgICAgICBpbmxpbmUgUEJfRFNfQ0xBU1NfQ19ERUMmIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9wX25kICE9IDApOworCWluYygpOworCXJldHVybiAoKnRoaXMpOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfQ0xBU1NfQ19ERUMKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworCVBCX0RTX0NMQVNTX0NfREVDIHJldF9pdChiYXNlX3R5cGU6Om1fcF9uZCk7CisJb3BlcmF0b3IrKygpOworCXJldHVybiAocmV0X2l0KTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBpbmMoKQorICAgICAgeworCWlmIChiYXNlX3R5cGU6Om1fcF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCSAgeworCSAgICBiYXNlX3R5cGU6Om1fcF9uZCA9IGJhc2VfdHlwZTo6bV9wX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCSAgICB3aGlsZSAoYmFzZV90eXBlOjptX3BfbmQtPm1fcF9sX2NoaWxkICE9IDApCisJICAgICAgYmFzZV90eXBlOjptX3BfbmQgPSBiYXNlX3R5cGU6Om1fcF9uZC0+bV9wX2xfY2hpbGQ7CisJICAgIHJldHVybjsKKwkgIH0KKworCXdoaWxlICh0cnVlKQorCSAgeworCSAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gYmFzZV90eXBlOjptX3BfbmQ7CisJICAgIGJhc2VfdHlwZTo6bV9wX25kID0gYmFzZV90eXBlOjptX3BfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKwkgICAgaWYgKGJhc2VfdHlwZTo6bV9wX25kID09IDAgfHwgYmFzZV90eXBlOjptX3BfbmQtPm1fcF9sX2NoaWxkID09IHBfbmV4dCkKKwkgICAgICByZXR1cm47CisJICB9CisgICAgICB9CisgICAgfTsKKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQkFTRV9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJhNzZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDE1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGUncyBjb25zdCBmaW5kIGFuZCBpbnNlcnQKKyAqICAgICBtZXRob2RzLgorICovCisKKyNpZm5kZWYgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9DT05TVF9GSU5EX0lURVJBVE9SX0hQUAorI2RlZmluZSBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX0NPTlNUX0ZJTkRfSVRFUkFUT1JfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMJCQlcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwgY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfY29uc3RfcG9pbnRfaXRlcmF0b3JfPE5vZGUsIEFsbG9jYXRvcj4KKworICAgIC8vIENvbnN0IHBvaW50LXR5cGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9jb25zdF9wb2ludF9pdGVyYXRvcl8KKyAgICB7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPE5vZGU+OjpvdGhlcjo6cG9pbnRlciBub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vIENhdGVnb3J5LgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgLy8gRGlmZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIC8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICAvLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgcG9pbnRlcjsKKworICAgICAgLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIEl0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICAvLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgIHB1YmxpYzoKKworICAgICAgaW5saW5lCisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfY29uc3RfcG9pbnRfaXRlcmF0b3JfKG5vZGVfcG9pbnRlciBwX25kKSA6IG1fcF9uZChwX25kKQorICAgICAgeyB9CisKKyAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9jb25zdF9wb2ludF9pdGVyYXRvcl8oKSA6IG1fcF9uZCgwKQorICAgICAgeyB9CisKKyAgICAgIC8vIENvcHkgY29uc3RydWN0b3IuCisgICAgICBpbmxpbmUKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9jb25zdF9wb2ludF9pdGVyYXRvcl8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6IG1fcF9uZChvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgLy8gQWNjZXNzLgorICAgICAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQgIT0gMCk7CisJcmV0dXJuICZtX3BfbmQtPm1fdmFsdWU7CisgICAgICB9CisKKyAgICAgIC8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZCAhPSAwKTsKKwlyZXR1cm4gbV9wX25kLT5tX3ZhbHVlOworICAgICAgfQorCisgICAgICAvLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCA9PSBvdGhlci5tX3BfbmQ7IH0KKworICAgICAgLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX25kICE9IG90aGVyLm1fcF9uZDsgfQorCisgICAgcHVibGljOgorICAgICAgbm9kZV9wb2ludGVyIG1fcF9uZDsKKyAgICB9OworCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YWRhMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfbm9kZV9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9fdGhyb3dfY29waWVzX3QKK1BCX0RTX0NMQVNTX0NfREVDOjpzX25vX3Rocm93X2NvcGllc19pbmQ7CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXygpIDoKKyAgbV9wX3Jvb3QoMCksCisgIG1fc2l6ZSgwKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgQ21wX0ZuKHJfY21wX2ZuKSwKKyAgbV9wX3Jvb3QoMCksCisgIG1fc2l6ZSgwKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgCis6IENtcF9GbihvdGhlciksIG1fcF9yb290KDApLCBtX3NpemUoMCkKK3sKKyAgbV9zaXplID0gb3RoZXIubV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgbV9wX3Jvb3QgPSByZWN1cnNpdmVfY29weV9ub2RlKG90aGVyLm1fcF9yb290KTsKKyAgbV9zaXplID0gb3RoZXIubV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgIHZhbHVlX3N3YXAob3RoZXIpOworICBzdGQ6OnN3YXAoKENtcF9GbiYgKSgqdGhpcyksIChDbXBfRm4mIClvdGhlcik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBzdGQ6OnN3YXAobV9wX3Jvb3QsIG90aGVyLm1fcF9yb290KTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXygpCit7CisgIGNsZWFyKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWN1cnNpdmVfY29weV9ub2RlKGNvbnN0X25vZGVfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAoMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gc19ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKworICBfX3RyeQorICAgIHsKKyAgICAgIG5ldyAocF9yZXQpIG5vZGUoKnBfbmQpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfcmV0LCAxKTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KKworICBwX3JldC0+bV9wX2xfY2hpbGQgPSBwX3JldC0+bV9wX25leHRfc2libGluZyA9CisgICAgcF9yZXQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgX190cnkKKyAgICB7CisgICAgICBwX3JldC0+bV9wX2xfY2hpbGQgPSByZWN1cnNpdmVfY29weV9ub2RlKHBfbmQtPm1fcF9sX2NoaWxkKTsKKyAgICAgIHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nID0gcmVjdXJzaXZlX2NvcHlfbm9kZShwX25kLT5tX3BfbmV4dF9zaWJsaW5nKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIGNsZWFyX2ltcChwX3JldCk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgaWYgKHBfcmV0LT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIHBfcmV0LT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9yZXQ7CisKKyAgaWYgKHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9yZXQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gcF9uZCA/IHBfcmV0IDogMDsKKworICByZXR1cm4gcF9yZXQ7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA4ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTQxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9yb290ID09IDAgfHwgbV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwKTsKKworICBpZiAobV9wX3Jvb3QgIT0gMCkKKyAgICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KG1fcF9yb290LCBTaW5nbGVfTGlua19Sb290cyk7CisgIGFzc2VydF9zaXplKCk7CisgIGFzc2VydF9pdGVyYXRvcnMoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF9ub2RlX2NvbnNpc3RlbnQoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQsIGJvb2wgc2luZ2xlX2xpbmspIGNvbnN0Cit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX2xfY2hpbGQsIGZhbHNlKTsKKyAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfbmV4dF9zaWJsaW5nLCBzaW5nbGVfbGluayk7CisKKyAgaWYgKHNpbmdsZV9saW5rKQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMCk7CisgIGVsc2UgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfbmQpOworCisgIGlmIChwX25kLT5tX3BfbF9jaGlsZCA9PSAwKQorICAgIHJldHVybjsKKworICBjb25zdF9ub2RlX3BvaW50ZXIgcF9jaGlsZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworICB3aGlsZSAocF9jaGlsZCAhPSAwKQorICAgIHsKKyAgICAgIGNvbnN0X25vZGVfcG9pbnRlciBwX25leHRfY2hpbGQgPSBwX2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9jaGlsZC0+bV92YWx1ZSkpOworICAgICAgcF9jaGlsZCA9IHBfbmV4dF9jaGlsZDsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2l0ZXJhdG9ycygpIGNvbnN0Cit7CisgIGNvbnN0IHNpemVfdHlwZSBjYWxjX3NpemUgPSBzdGQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsKKyAgaWYgKGNhbGNfc2l6ZSA9PSBzaXplKCkpCisgICAgcmV0dXJuOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfc2l6ZSgpIGNvbnN0Cit7CisgIGlmIChzaXplX2Zyb21fbm9kZShtX3Bfcm9vdCkgPT0gbV9zaXplKQorICAgIHJldHVybjsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZV91bmRlcl9ub2RlKGNvbnN0X25vZGVfcG9pbnRlciBwX25kKQoreyByZXR1cm4gMSArIHNpemVfZnJvbV9ub2RlKHBfbmQtPm1fcF9sX2NoaWxkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZV9mcm9tX25vZGUoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHNpemVfdHlwZSByZXQgPSAwOworICB3aGlsZSAocF9uZCAhPSAwKQorICAgIHsKKyAgICAgIHJldCArPSAxICsgc2l6ZV9mcm9tX25vZGUocF9uZC0+bV9wX2xfY2hpbGQpOworICAgICAgcF9uZCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorICByZXR1cm4gcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZGVncmVlKGNvbnN0X25vZGVfcG9pbnRlciBwX25kKQoreworICBzaXplX3R5cGUgcmV0ID0gMDsKKyAgY29uc3Rfbm9kZV9wb2ludGVyIHBfY2hpbGQgPSBwX25kLT5tX3BfbF9jaGlsZDsKKyAgd2hpbGUgKHBfY2hpbGQgIT0gMCkKKyAgICB7CisgICAgICArK3JldDsKKyAgICAgIHBfY2hpbGQgPSBwX2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nOworICAgIH0KKyAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOGFiMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGVyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgY2xlYXJfaW1wKG1fcF9yb290KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA9PSAwKTsKKyAgbV9wX3Jvb3QgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBwX25kLT5+bm9kZSgpOworICBzX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgY2xlYXJfaW1wKHBfbmQtPm1fcF9sX2NoaWxkKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgYWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisgICAgICBwX25kID0gcF9uZXh0OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvX2xpbmtlZF9saXN0KCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIG5vZGVfcG9pbnRlciBwX2N1ciA9IG1fcF9yb290OworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICBpZiAocF9jdXItPm1fcF9sX2NoaWxkICE9IDApCisgICAgICB7CisJbm9kZV9wb2ludGVyIHBfY2hpbGRfbmV4dCA9IHBfY3VyLT5tX3BfbF9jaGlsZC0+bV9wX25leHRfc2libGluZzsKKwlwX2N1ci0+bV9wX2xfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKwlwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfY3VyLT5tX3BfbF9jaGlsZDsKKwlwX2N1ci0+bV9wX2xfY2hpbGQgPSBwX2NoaWxkX25leHQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9jdXIgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGNvbnN0X25vZGVfcG9pbnRlciBwX2NvdW50ZXIgPSBtX3Bfcm9vdDsKKyAgc2l6ZV90eXBlIGNvdW50ID0gMDsKKyAgd2hpbGUgKHBfY291bnRlciAhPSAwKQorICAgIHsKKyAgICAgICsrY291bnQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9jb3VudGVyLT5tX3BfbF9jaGlsZCA9PSAwKTsKKyAgICAgIHBfY291bnRlciA9IHBfY291bnRlci0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChjb3VudCA9PSBtX3NpemUpOworI2VuZGlmIAorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BydW5lKFByZWQgcHJlZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gbV9wX3Jvb3Q7CisgIG1fcF9yb290ID0gMDsKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gMDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgaWYgKHByZWQocF9jdXItPm1fdmFsdWUpKQorICAgICAgICB7CisJICBwX2N1ci0+bV9wX25leHRfc2libGluZyA9IHBfb3V0OworCSAgaWYgKHBfb3V0ICE9IDApCisJICAgIHBfb3V0LT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX2N1cjsKKwkgIHBfb3V0ID0gcF9jdXI7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworCSAgcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBtX3Bfcm9vdDsKKwkgIGlmIChtX3Bfcm9vdCAhPSAwKQorCSAgICBtX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9jdXI7CisJICBtX3Bfcm9vdCA9IHBfY3VyOworICAgICAgICB9CisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisgIHJldHVybiBwX291dDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2J1YmJsZV90b190b3Aobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHBhcmVudChwX25kKTsKKyAgd2hpbGUgKHBfcGFyZW50ICE9IDApCisgICAgeworICAgICAgc3dhcF93aXRoX3BhcmVudChwX25kLCBwX3BhcmVudCk7CisgICAgICBwX3BhcmVudCA9IHBhcmVudChwX25kKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlNjU2MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sKKyAgcmV0dXJuIChtX3NpemUgPT0gMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAobV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7CisgIHJldHVybiAoc19ub2RlX2FsbG9jYXRvci5tYXhfc2l6ZSgpKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmYzkxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNzUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25ld19ub2RlX2Zvcl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsKQoreworICByZXR1cm4gZ2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwsIHNfbm9fdGhyb3dfY29waWVzX2luZCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25ld19ub2RlX2Zvcl9pbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCisgIGNvbmRfZGVhbHRvcl90IGNvbmQocF9uZXdfbmQpOworCisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KAorCQkJICBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KCZwX25ld19uZC0+bV92YWx1ZSkpKQorICAgIHR5cGVuYW1lIG5vZGU6OnZhbHVlX3R5cGUocl92YWwpOworCisgIGNvbmQuc2V0X25vX2FjdGlvbigpOworCisgICsrbV9zaXplOworCisgIHJldHVybiAocF9uZXdfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKQoreworICBub2RlX3BvaW50ZXIgcF9uZXdfbmQgPSBzX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworCisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KAorCQkJICBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KCZwX25ld19uZC0+bV92YWx1ZSkpKQorICAgIHR5cGVuYW1lIG5vZGU6OnZhbHVlX3R5cGUocl92YWwpOworCisgICsrbV9zaXplOworCisgIHJldHVybiAocF9uZXdfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21ha2VfY2hpbGRfb2Yobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX25ld19wYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZXdfcGFyZW50ICE9IDApOworCisgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25ld19wYXJlbnQtPm1fcF9sX2NoaWxkOworCisgIGlmIChwX25ld19wYXJlbnQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9uZXdfcGFyZW50LT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25ld19wYXJlbnQ7CisKKyAgcF9uZXdfcGFyZW50LT5tX3BfbF9jaGlsZCA9IHBfbmQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFyZW50KG5vZGVfcG9pbnRlciBwX25kKQoreworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9wb3QgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisKKyAgICAgIGlmIChwX3BvdCA9PSAwIHx8IHBfcG90LT5tX3BfbF9jaGlsZCA9PSBwX25kKQorCXJldHVybiBwX3BvdDsKKworICAgICAgcF9uZCA9IHBfcG90OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwX3dpdGhfcGFyZW50KG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9wYXJlbnQpCit7CisgIGlmIChwX3BhcmVudCA9PSBtX3Bfcm9vdCkKKyAgICBtX3Bfcm9vdCA9IHBfbmQ7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBhcmVudChwX25kKSA9PSBwX3BhcmVudCk7CisKKyAgY29uc3QgYm9vbCBuZF9kaXJlY3RfY2hpbGQgPSBwX3BhcmVudC0+bV9wX2xfY2hpbGQgPT0gcF9uZDsKKyAgY29uc3QgYm9vbCBwYXJlbnRfcm9vdCA9IHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gMDsKKyAgY29uc3QgYm9vbCBwYXJlbnRfZGlyZWN0X2NoaWxkID0KKyAgICAhcGFyZW50X3Jvb3QmJiAgcF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX2xfY2hpbGQgPT0gcF9wYXJlbnQ7CisKKyAgc3RkOjpzd2FwKHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQsIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCk7CisgIHN0ZDo6c3dhcChwX3BhcmVudC0+bV9wX25leHRfc2libGluZywgcF9uZC0+bV9wX25leHRfc2libGluZyk7CisgIHN0ZDo6c3dhcChwX3BhcmVudC0+bV9wX2xfY2hpbGQsIHBfbmQtPm1fcF9sX2NoaWxkKTsKKyAgc3RkOjpzd2FwKHBfcGFyZW50LT5tX21ldGFkYXRhLCBwX25kLT5tX21ldGFkYXRhKTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX2xfY2hpbGQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICBpZiAocF9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX3BhcmVudC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgaWYgKHBfcGFyZW50LT5tX3BfbF9jaGlsZCAhPSAwKQorICAgIHBfcGFyZW50LT5tX3BfbF9jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgaWYgKHBhcmVudF9kaXJlY3RfY2hpbGQpCisgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9IHBfbmQ7CisgIGVsc2UgaWYgKCFwYXJlbnRfcm9vdCkKKyAgICBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kOworCisgIGlmICghbmRfZGlyZWN0X2NoaWxkKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9sX2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kOworCisgICAgICBwX3BhcmVudC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9wYXJlbnQ7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9sX2NoaWxkID09IHBfbmQpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfcHJldl9vcl9wYXJlbnQgPT0gcF9wYXJlbnQpOworCisgICAgICBwX25kLT5tX3BfbF9jaGlsZCA9IHBfcGFyZW50OworICAgICAgcF9wYXJlbnQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwYXJlbnQocF9wYXJlbnQpID09IHBfbmQpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzA5Y2Y2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9yb290OworCisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChpdGVyYXRvcigwKSk7CisKKyAgd2hpbGUgKHBfbmQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworCisgIHJldHVybiAoaXRlcmF0b3IocF9uZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKSBjb25zdAoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9yb290OworCisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChjb25zdF9pdGVyYXRvcigwKSk7CisKKyAgd2hpbGUgKHBfbmQtPm1fcF9sX2NoaWxkICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9sX2NoaWxkOworCisgIHJldHVybiAoY29uc3RfaXRlcmF0b3IocF9uZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sKKyAgcmV0dXJuIChpdGVyYXRvcigwKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlbmQoKSBjb25zdAoreworICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKDApKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZDRiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHAKQEAgLTAsMCArMSwzNDkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgYmFzaWMgaGVhcC4KKyAqLworCisjaWZuZGVmIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfSFBQCisjZGVmaW5lIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfSFBQCisKKy8qCisgKiBCYXNlZCBvbiBDTFJTLgorICovCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2NvbmRfZGVhbHRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL25vZGUuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vY29uc3RfaXRlcmF0b3IuaHBwPgorI2lmZGVmIFBCX0RTX0xDX05TX0hFQVBfVFJBQ0VfCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZW5kaWYgCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQwkJCQkJCVwKKyAgICB0ZW1wbGF0ZTwJCQkJCQkJCVwKKwkJCQkJCXR5cGVuYW1lIFZhbHVlX1R5cGUsCVwKKwkJCQkJCWNsYXNzIENtcF9GbiwJCVwKKwkJCQkJCXR5cGVuYW1lIE5vZGVfTWV0YWRhdGEsCVwKKwkJCQkJCWNsYXNzIEFsbG9jYXRvciwJXAorCQkJCQkJYm9vbCBTaW5nbGVfTGlua19Sb290cz4KKyNlbHNlIAorI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQwkJCQkJCVwKKyAgICB0ZW1wbGF0ZTwJCQkJCQkJCVwKKwkJCQkJCXR5cGVuYW1lIFZhbHVlX1R5cGUsCVwKKwkJCQkJCWNsYXNzIENtcF9GbiwJCVwKKwkJCQkJCXR5cGVuYW1lIE5vZGVfTWV0YWRhdGEsCVwKKwkJCQkJCWNsYXNzIEFsbG9jYXRvcj4KKyNlbmRpZiAKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQkJXAorICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfPAkJCQkJXAorCQkJCQkJCVZhbHVlX1R5cGUsCVwKKwkJCQkJCQlDbXBfRm4sCQlcCisJCQkJCQkJTm9kZV9NZXRhZGF0YSwJXAorCQkJCQkJCUFsbG9jYXRvciwJXAorCQkJCQkJCVNpbmdsZV9MaW5rX1Jvb3RzPgorI2Vsc2UgCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQkJXAorICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfPAkJCQkJXAorCQkJCQkJCVZhbHVlX1R5cGUsCVwKKwkJCQkJCQlDbXBfRm4sCQlcCisJCQkJCQkJTm9kZV9NZXRhZGF0YSwJXAorCQkJCQkJCUFsbG9jYXRvcj4KKyNlbmRpZiAKKworICAgIC8qKgorICAgICAqIGNsYXNzIGRlc2NyaXB0aW9uID0gIkJhc2UgY2xhc3MgZm9yIHNvbWUgdHlwZXMgb2YgaDNhcCQiPgorICAgICAqKi8KKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX01ldGFkYXRhLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yLAorCSAgICAgYm9vbCBTaW5nbGVfTGlua19Sb290cz4KKyNlbHNlIAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX01ldGFkYXRhLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorI2VuZGlmIAorICAgIGNsYXNzIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfIDogcHVibGljIENtcF9GbgorICAgIHsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlXzwKKyAgICAgIFZhbHVlX1R5cGUsCisgICAgICBOb2RlX01ldGFkYXRhLAorICAgICAgQWxsb2NhdG9yPiA+OjpvdGhlcgorICAgICAgbm9kZV9hbGxvY2F0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9hbGxvY2F0b3I6OnZhbHVlX3R5cGUgbm9kZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2FsbG9jYXRvcjo6cG9pbnRlciBub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3Rfbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIE5vZGVfTWV0YWRhdGEgbm9kZV9tZXRhZGF0YTsKKworICAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8IG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyPiBub2RlX3BvaW50ZXJfcGFpcjsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIGNvbmRfZGVhbHRvcjwgbm9kZSwgQWxsb2NhdG9yPiBjb25kX2RlYWx0b3JfdDsKKworICAgICAgZW51bQorCXsKKwkgIHNpbXBsZV92YWx1ZSA9IGlzX3NpbXBsZTxWYWx1ZV9UeXBlPjo6dmFsdWUKKwl9OworCisgICAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGludCwgc2ltcGxlX3ZhbHVlPiBub190aHJvd19jb3BpZXNfdDsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBwb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6cmVmZXJlbmNlCisgICAgICByZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9jb25zdF9wb2ludF9pdGVyYXRvcl88CisJbm9kZSwKKwlBbGxvY2F0b3I+CisgICAgICBjb25zdF9wb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9wb2ludF9pdGVyYXRvciBwb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9jb25zdF9pdGVyYXRvcl88CisJbm9kZSwKKwlBbGxvY2F0b3I+CisgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBDbXBfRm4gY21wX2ZuOworCisgICAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKworICAgIHB1YmxpYzoKKworICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8oKTsKKworICAgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8oY29uc3QgQ21wX0ZuJiByX2NtcF9mbik7CisKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgfmxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIENtcF9GbiYgCisgICAgICBnZXRfY21wX2ZuKCk7CisKKyAgICAgIGNvbnN0IENtcF9GbiYgCisgICAgICBnZXRfY21wX2ZuKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisjaWZkZWYgUEJfRFNfTENfTlNfSEVBUF9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCk7CisKKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgbWFrZV9jaGlsZF9vZihub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfbmV3X3BhcmVudCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgaW5saW5lIHN0YXRpYyBub2RlX3BvaW50ZXIKKyAgICAgIHBhcmVudChub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwX3dpdGhfcGFyZW50KG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9wYXJlbnQpOworCisgICAgICB2b2lkCisgICAgICBidWJibGVfdG9fdG9wKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGFjdHVhbF9lcmFzZV9ub2RlKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXJfaW1wKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgdm9pZAorICAgICAgdG9fbGlua2VkX2xpc3QoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcHJ1bmUoUHJlZCBwcmVkKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X25vZGVfY29uc2lzdGVudChjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCwgYm9vbCBzaW5nbGVfbGluaykgY29uc3Q7CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIHNpemVfdW5kZXJfbm9kZShjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIHN0YXRpYyBzaXplX3R5cGUKKyAgICAgIGRlZ3JlZShjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCk7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19MQ19OU19IRUFQX1RSQUNFXworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGUoY29uc3Rfbm9kZV9wb2ludGVyLCBzaXplX3R5cGUgbGV2ZWwpOworI2VuZGlmIAorCisgICAgcHJvdGVjdGVkOgorICAgICAgbm9kZV9wb2ludGVyIG1fcF9yb290OworCisgICAgICBzaXplX3R5cGUgbV9zaXplOworCisgICAgcHJpdmF0ZToKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2l0ZXJhdG9ycygpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfc2l6ZSgpIGNvbnN0OworCisgICAgICBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBzaXplX2Zyb21fbm9kZShjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCk7CisjZW5kaWYgCisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjdXJzaXZlX2NvcHlfbm9kZShjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgdHJ1ZV90eXBlKTsKKworI2lmZGVmIFBCX0RTX0xDX05TX0hFQVBfVFJBQ0VfCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2Vfbm9kZV9tZXRhZGF0YShjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCwgdHlwZV90b190eXBlPE1ldGFkYXRhXz4pOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgdHJhY2Vfbm9kZV9tZXRhZGF0YShjb25zdF9ub2RlX3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9tZXRhZGF0YT4pOworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBub2RlX2FsbG9jYXRvciBzX25vZGVfYWxsb2NhdG9yOworCisgICAgICBzdGF0aWMgbm9fdGhyb3dfY29waWVzX3Qgc19ub190aHJvd19jb3BpZXNfaW5kOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9ub2RlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9ub2RlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2RmZTI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL25vZGUuaHBwCkBAIC0wLDAgKzEsMTIzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBub2RlLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gc3RydWN0IGZvciB0aGlzIHR5cGUgb2YgaGVhcCdzIG5vZGUuCisgKi8KKworI2lmbmRlZiBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQX05PREVfSFBQCisjZGVmaW5lIFBCX0RTX0xFRlRfQ0hJTERfTkVYVF9TSUJMSU5HX0hFQVBfTk9ERV9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbnVsbF9tZXRhZGF0YS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgTWV0YWRhdGFfVHlwZSwgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfPAorICAgICAgVmFsdWVfVHlwZSwKKyAgICAgIE1ldGFkYXRhX1R5cGUsCisgICAgICBBbGxvY2F0b3I+CisgICAgICB0aGlzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdGhpc190eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgTWV0YWRhdGFfVHlwZSBtZXRhZGF0YV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdmFsdWVfdHlwZSBtX3ZhbHVlOworCisgICAgICBtZXRhZGF0YV90eXBlIG1fbWV0YWRhdGE7CisKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbF9jaGlsZDsKKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlXzwKKyAgICAgIFZhbHVlX1R5cGUsCisgICAgICBudWxsX2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9tZXRhZGF0YSwKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV88CisgICAgICBWYWx1ZV9UeXBlLAorICAgICAgbnVsbF9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfbWV0YWRhdGEsCisgICAgICBBbGxvY2F0b3I+CisgICAgICB0aGlzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdGhpc190eXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB2YWx1ZV90eXBlIG1fdmFsdWU7CisKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbF9jaGlsZDsKKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgfTsKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF9OT0RFX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL251bGxfbWV0YWRhdGEuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfL251bGxfbWV0YWRhdGEuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDRlMTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbnVsbF9tZXRhZGF0YS5ocHAKQEAgLTAsMCArMSw1NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbnVsbF9tZXRhZGF0YS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIHN0cnVjdCBmb3IgdGhpcyB0eXBlIG9mIGhlYXAncyBub2RlLgorICovCisKKyNpZm5kZWYgUEJfRFNfTEVGVF9DSElMRF9ORVhUX1NJQkxJTkdfSEVBUF8wX01FVEFEQVRBX0hQUAorI2RlZmluZSBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQXzBfTUVUQURBVEFfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisgICAgc3RydWN0IG51bGxfbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX21ldGFkYXRhCisgICAgeyB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19MRUZUX0NISUxEX05FWFRfU0lCTElOR19IRUFQXzBfTUVUQURBVEFfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGI0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK0NtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitjb25zdCBDbXBfRm4mIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2NtcF9mbigpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyMTAwMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDk1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKKyNpZmRlZiBQQl9EU19MQ19OU19IRUFQX1RSQUNFXworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordHJhY2UoKSBjb25zdAoreworICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOworCisgIHRyYWNlX25vZGUobV9wX3Jvb3QsIDApOworCisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlKGNvbnN0X25vZGVfcG9pbnRlciBwX25kLCBzaXplX3R5cGUgbGV2ZWwpCit7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBsZXZlbDsgKytpKQorCXN0ZDo6Y2VyciA8PCAnICc7CisKKyAgICAgIHN0ZDo6Y2VyciA8PCBwX25kIDw8CisJIiBwcmV2ID0gIiA8PCBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPDwKKwkiIG5leHQgIiA8PCBwX25kLT5tX3BfbmV4dF9zaWJsaW5nIDw8CisJIiBsZWZ0ID0gIiA8PCBwX25kLT5tX3BfbF9jaGlsZCA8PCAiICI7CisKKyAgICAgIHRyYWNlX25vZGVfbWV0YWRhdGEocF9uZCwgdHlwZV90b190eXBlPG5vZGVfbWV0YWRhdGE+KCkpOworCisgICAgICBzdGQ6OmNlcnIgPDwgcF9uZC0+bV92YWx1ZSA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIHRyYWNlX25vZGUocF9uZC0+bV9wX2xfY2hpbGQsIGxldmVsICsgMSk7CisKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhXz4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGVfbWV0YWRhdGEoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YV8+KQoreworICBzdGQ6OmNlcnIgPDwgIigiIDw8IHBfbmQtPm1fbWV0YWRhdGEgPDwgIikgIjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGVfbWV0YWRhdGEoY29uc3Rfbm9kZV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwX25vZGVfbWV0YWRhdGE+KQoreyB9CisKKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfTENfTlNfSEVBUF9UUkFDRV8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2NvbnN0cnVjdG9yX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NjQ4ODUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTQyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIFBCX0RTX0NMQVNTX05BTUUuCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2VudHJ5X2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK0VxX0ZuIFBCX0RTX0NMQVNTX0NfREVDOjpzX2VxX2ZuOworCitQQl9EU19DTEFTU19UX0RFQworbnVsbF9sdV9tZXRhZGF0YSBQQl9EU19DTEFTU19DX0RFQzo6c19udWxsX2x1X21ldGFkYXRhOworCitQQl9EU19DTEFTU19UX0RFQworVXBkYXRlX1BvbGljeSBQQl9EU19DTEFTU19DX0RFQzo6c191cGRhdGVfcG9saWN5OworCitQQl9EU19DTEFTU19UX0RFQwordHlwZV90b190eXBlPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6dXBkYXRlX21ldGFkYXRhPiBQQl9EU19DTEFTU19DX0RFQzo6c19tZXRhZGF0YV90eXBlX2luZGljYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKCkgOiBtX3BfbCgwKQoreyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+CitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KSA6IG1fcF9sKDApCit7CisgIGNvcHlfZnJvbV9yYW5nZShmaXJzdF9pdCwgbGFzdF9pdCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6IAorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGRlYnVnX2Jhc2UoKSwKKyNlbmRpZgorbV9wX2woMCkKK3sKKyAgX190cnkKKyAgICB7CisgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gb3RoZXIuYmVnaW4oKTsgaXQgIT0gb3RoZXIuZW5kKCk7ICsraXQpCisgICAgICAgIHsKKwkgIGVudHJ5X3BvaW50ZXIgcF9sID0gYWxsb2NhdGVfbmV3X2VudHJ5KCppdCwgCisJCQlQQl9EU19UWVBFU19UUkFJVFNfQ19ERUM6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisKKwkgIHBfbC0+bV9wX25leHQgPSBtX3BfbDsKKwkgIG1fcF9sID0gcF9sOworICAgICAgICB9CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBkZWFsbG9jYXRlX2FsbCgpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3dhcChvdGhlcik7KQorICBzdGQ6OnN3YXAobV9wX2wsIG90aGVyLm1fcF9sKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZGVhbGxvY2F0ZV9hbGwoKQoreworICBlbnRyeV9wb2ludGVyIHBfbCA9IG1fcF9sOworICB3aGlsZSAocF9sICE9IDApCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHRfbCA9IHBfbC0+bV9wX25leHQ7CisgICAgICBhY3R1YWxfZXJhc2VfZW50cnkocF9sKTsKKyAgICAgIHBfbCA9IHBfbmV4dF9sOworICAgIH0KKyAgbV9wX2wgPSAwOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorflBCX0RTX0NMQVNTX05BTUUoKQoreyBkZWFsbG9jYXRlX2FsbCgpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlOWUyMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgY2NfaHRfbWFwXydzIGRlYnVnLW1vZGUgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGNhbGNfc2l6ZSA9IDA7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgKytpdCkKKyAgICB7CisgICAgICBkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKFBCX0RTX1YyRigqaXQpKTsKKyAgICAgICsrY2FsY19zaXplOworICAgIH0KKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShjYWxjX3NpemUpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lbnRyeV9tZXRhZGF0YV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VudHJ5X21ldGFkYXRhX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWVmNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9lbnRyeV9tZXRhZGF0YV9iYXNlLmhwcApAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlbnRyeV9tZXRhZGF0YV9iYXNlLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgbGlzdCB1cGRhdGUgbWFwLgorICovCisKKyNpZm5kZWYgUEJfRFNfTFVfTUFQX0VOVFJZX01FVEFEQVRBX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX0xVX01BUF9FTlRSWV9NRVRBREFUQV9CQVNFX0hQUAorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YT4KKyAgICBzdHJ1Y3QgbHVfbWFwX2VudHJ5X21ldGFkYXRhX2Jhc2UKKyAgICB7CisgICAgICBNZXRhZGF0YSBtX3VwZGF0ZV9tZXRhZGF0YTsKKyAgICB9OworICAgIAorICAgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbHVfbWFwX2VudHJ5X21ldGFkYXRhX2Jhc2U8bnVsbF9sdV9tZXRhZGF0YT4KKyAgICB7IH07ICAKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4MWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTM1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGx1X21hcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspCisgIGlmIChtX3BfbCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoc19lcV9mbihyX2tleSwgUEJfRFNfVjJGKG1fcF9sLT5tX3ZhbHVlKSkpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHQgPSBtX3BfbC0+bV9wX25leHQ7CisgICAgICBhY3R1YWxfZXJhc2VfZW50cnkobV9wX2wpOworICAgICAgbV9wX2wgPSBwX25leHQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBtX3BfbDsKKyAgd2hpbGUgKHBfbC0+bV9wX25leHQgIT0gMCkKKyAgICBpZiAoc19lcV9mbihyX2tleSwgUEJfRFNfVjJGKHBfbC0+bV9wX25leHQtPm1fdmFsdWUpKSkKKyAgICAgIHsKKwllcmFzZV9uZXh0KHBfbCk7CisJcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY2xlYXIoKQoreworICBkZWFsbG9jYXRlX2FsbCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgd2hpbGUgKG1fcF9sICE9IDAgJiYgcHJlZChtX3BfbC0+bV92YWx1ZSkpCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHQgPSBtX3BfbC0+bV9wX25leHQ7CisgICAgICArK251bV9lcnNkOworICAgICAgYWN0dWFsX2VyYXNlX2VudHJ5KG1fcF9sKTsKKyAgICAgIG1fcF9sID0gcF9uZXh0OworICAgIH0KKworICBpZiAobV9wX2wgPT0gMCkKKyAgICByZXR1cm4gbnVtX2Vyc2Q7CisKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBtX3BfbDsKKyAgd2hpbGUgKHBfbC0+bV9wX25leHQgIT0gMCkKKyAgICB7CisgICAgICBpZiAocHJlZChwX2wtPm1fcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICAgICAgeworCSAgKytudW1fZXJzZDsKKwkgIGVyYXNlX25leHQocF9sKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXBfbCA9IHBfbC0+bV9wX25leHQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIG51bV9lcnNkOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfbmV4dChlbnRyeV9wb2ludGVyIHBfbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbCAhPSBtX3BfbCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fcF9uZXh0ICE9IDApOworICBlbnRyeV9wb2ludGVyIHBfbmV4dF9sID0gcF9sLT5tX3BfbmV4dC0+bV9wX25leHQ7CisgIGFjdHVhbF9lcmFzZV9lbnRyeShwX2wtPm1fcF9uZXh0KTsKKyAgcF9sLT5tX3BfbmV4dCA9IHBfbmV4dF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWN0dWFsX2VyYXNlX2VudHJ5KGVudHJ5X3BvaW50ZXIgcF9sKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX2wtPm1fdmFsdWUpKTspCisgIHBfbC0+fmVudHJ5KCk7CisgIHNfZW50cnlfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9sLCAxKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4NzJjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGx1X21hcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZW50cnlfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgaWYgKG1fcF9sID09IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChzX2VxX2ZuKHJfa2V5LCBQQl9EU19WMkYobV9wX2wtPm1fdmFsdWUpKSkKKyAgICB7CisgICAgICBhcHBseV91cGRhdGUobV9wX2wsIHNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3IpOworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KTspCisgICAgICByZXR1cm4gbV9wX2w7CisgICAgfQorCisgIGVudHJ5X3BvaW50ZXIgcF9sID0gbV9wX2w7CisgIHdoaWxlIChwX2wtPm1fcF9uZXh0ICE9IDApCisgICAgeworICAgICAgZW50cnlfcG9pbnRlciBwX25leHQgPSBwX2wtPm1fcF9uZXh0OworICAgICAgaWYgKHNfZXFfZm4ocl9rZXksIFBCX0RTX1YyRihwX25leHQtPm1fdmFsdWUpKSkKKyAgICAgICAgeworCSAgaWYgKGFwcGx5X3VwZGF0ZShwX25leHQsIHNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3IpKQorICAgICAgICAgICAgeworCSAgICAgIHBfbC0+bV9wX25leHQgPSBwX25leHQtPm1fcF9uZXh0OworCSAgICAgIHBfbmV4dC0+bV9wX25leHQgPSBtX3BfbDsKKwkgICAgICBtX3BfbCA9IHBfbmV4dDsKKwkgICAgICByZXR1cm4gbV9wX2w7CisgICAgICAgICAgICB9CisJICByZXR1cm4gcF9uZXh0OworICAgICAgICB9CisgICAgICBlbHNlCisJcF9sID0gcF9uZXh0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChyX2tleSk7KQorICByZXR1cm4gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhPgoraW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyIHBfbCwgdHlwZV90b190eXBlPE1ldGFkYXRhPikKK3sgcmV0dXJuIHNfdXBkYXRlX3BvbGljeShwX2wtPm1fdXBkYXRlX21ldGFkYXRhKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF9sdV9tZXRhZGF0YT4pCit7IHJldHVybiBzX3VwZGF0ZV9wb2xpY3koc19udWxsX2x1X21ldGFkYXRhKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWY3NDNjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NpemUoKSBjb25zdAoreyByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbigpLCBlbmQoKSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CittYXhfc2l6ZSgpIGNvbnN0Cit7IHJldHVybiBzX2VudHJ5X2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gKG1fcF9sID09IDApOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyOTRmYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLAorICBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGVudHJ5X3BvaW50ZXIgcF9sID0gZmluZF9pbXAoUEJfRFNfVjJGKHJfdmFsKSk7CisKKyAgaWYgKHBfbCAhPSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYocl92YWwpKTspCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9pbnRfaXRlcmF0b3IoJnBfbC0+bV92YWx1ZSksIGZhbHNlKTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3QoUEJfRFNfVjJGKHJfdmFsKSk7KQorCisgIHBfbCA9IGFsbG9jYXRlX25ld19lbnRyeShyX3ZhbCwgdHJhaXRzX2Jhc2U6Om1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcik7CisgIHBfbC0+bV9wX25leHQgPSBtX3BfbDsKKyAgbV9wX2wgPSBwX2w7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9pbnRfaXRlcmF0b3IoJnBfbC0+bV92YWx1ZSksIHRydWUpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplbnRyeV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CithbGxvY2F0ZV9uZXdfZW50cnkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQoreworICBlbnRyeV9wb2ludGVyIHBfbCA9IHNfZW50cnlfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBjb25kX2RlYWx0b3JfdCBjb25kKHBfbCk7CisgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4oJnBfbC0+bV92YWx1ZSkpKQorICAgIHZhbHVlX3R5cGUocl92YWwpOworCisgIGNvbmQuc2V0X25vX2FjdGlvbigpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKHJfdmFsKSk7KQorICBpbml0X2VudHJ5X21ldGFkYXRhKHBfbCwgc19tZXRhZGF0YV90eXBlX2luZGljYXRvcik7CisgIHJldHVybiBwX2w7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmVudHJ5X3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FsbG9jYXRlX25ld19lbnRyeShjb25zdF9yZWZlcmVuY2UgICAgcl92YWwsIHRydWVfdHlwZSkKK3sKKyAgZW50cnlfcG9pbnRlciBwX2wgPSBzX2VudHJ5X2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgbmV3ICgmcF9sLT5tX3ZhbHVlKSB2YWx1ZV90eXBlKHJfdmFsKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykKKyAgaW5pdF9lbnRyeV9tZXRhZGF0YShwX2wsIHNfbWV0YWRhdGFfdHlwZV9pbmRpY2F0b3IpOworICByZXR1cm4gcF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyIHBfbCwgdHlwZV90b190eXBlPE1ldGFkYXRhPikKK3sgbmV3ICgmcF9sLT5tX3VwZGF0ZV9tZXRhZGF0YSkgTWV0YWRhdGEoc191cGRhdGVfcG9saWN5KCkpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF9sdV9tZXRhZGF0YT4pCit7IH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzE2MzgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgbHVfbWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oKQoreworICBpZiAobV9wX2wgPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoZW1wdHkoKSk7CisgICAgICByZXR1cm4gZW5kKCk7CisgICAgfQorICByZXR1cm4gaXRlcmF0b3IoJm1fcF9sLT5tX3ZhbHVlLCBtX3BfbCwgdGhpcyk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpIGNvbnN0Cit7CisgIGlmIChtX3BfbCA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChlbXB0eSgpKTsKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICB9CisgIHJldHVybiBpdGVyYXRvcigmbV9wX2wtPm1fdmFsdWUsIG1fcF9sLCBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZCgpCit7IHJldHVybiBpdGVyYXRvcigwLCAwLCB0aGlzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDAsIDAsIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqIGNvbnN0Pih0aGlzKSk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vbHVfbWFwXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4ZGQxYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2x1X21hcF8uaHBwCkBAIC0wLDAgKzEsMzU5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsdV9tYXBfLmhwcAorICogQ29udGFpbnMgYSBsaXN0IHVwZGF0ZSBtYXAuCisgKi8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2VudHJ5X21ldGFkYXRhX2Jhc2UuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9kZWJ1Z19tYXBfYmFzZS5ocHA+CisjZW5kaWYgCisjaWZkZWYgUEJfRFNfTFVfTUFQX1RSQUNFXworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2VuZGlmIAorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIGNsYXNzIEVxX0ZuLCBcCisJICAgICBjbGFzcyBBbGxvY2F0b3IsIGNsYXNzIFVwZGF0ZV9Qb2xpY3k+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NMQVNTX05BTUUgbHVfbWFwX2RhdGFfCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIGx1X21hcF9ub19kYXRhXworI2VuZGlmIAorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBQQl9EU19DTEFTU19OQU1FPEtleSwgTWFwcGVkLCBFcV9GbiwgQWxsb2NhdG9yLCBVcGRhdGVfUG9saWN5PgorCisjZGVmaW5lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQyBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBBbGxvY2F0b3IsIGZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgIGRlYnVnX21hcF9iYXNlPEtleSwgRXFfRm4sIFwKKwkgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlPgorI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpLmZpcnN0CisjZGVmaW5lIFBCX0RTX1YyUyhYKSAoWCkuc2Vjb25kCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlKQorI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKQorI2RlZmluZSBQQl9EU19WMlMoWCkgTWFwcGVkX0RhdGEoKQorI2RlZmluZSBQQl9EU19FUDJWUChYKSYgKChYKS0+bV92YWx1ZS5maXJzdCkKKyNlbmRpZiAKKworICAgIC8qIFNraXAgdG8gdGhlIGx1LCBteSBkYXJsaW5nLiAqLworICAgIC8vIGxpc3QtYmFzZWQgKHdpdGggdXBkYXRlcykgYXNzb2NpYXRpdmUgY29udGFpbmVyLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIGNsYXNzIEVxX0ZuLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yLAorCSAgICAgY2xhc3MgVXBkYXRlX1BvbGljeT4KKyAgICBjbGFzcyBQQl9EU19DTEFTU19OQU1FIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgcHJvdGVjdGVkIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDLAorI2VuZGlmIAorICAgICAgcHVibGljIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMgdHJhaXRzX2Jhc2U7CisKKyAgICAgIHN0cnVjdCBlbnRyeSAKKyAgICAgOiBwdWJsaWMgbHVfbWFwX2VudHJ5X21ldGFkYXRhX2Jhc2U8dHlwZW5hbWUgVXBkYXRlX1BvbGljeTo6bWV0YWRhdGFfdHlwZT4KKyAgICAgIHsKKwl0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSBtX3ZhbHVlOworCXR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGVudHJ5Pjo6b3RoZXI6OnBvaW50ZXIgbV9wX25leHQ7CisgICAgICB9OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGVudHJ5Pjo6b3RoZXIgZW50cnlfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlbnRyeV9hbGxvY2F0b3I6OnBvaW50ZXIgZW50cnlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIGNvbnN0X2VudHJ5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGVudHJ5X2FsbG9jYXRvcjo6cmVmZXJlbmNlIGVudHJ5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfYWxsb2NhdG9yOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfZW50cnlfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGVudHJ5X3BvaW50ZXI+OjpvdGhlciBlbnRyeV9wb2ludGVyX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZW50cnlfcG9pbnRlcl9hbGxvY2F0b3I6OnBvaW50ZXIgZW50cnlfcG9pbnRlcl9hcnJheTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgcG9pbnRlcl87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXJfOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIHJlZmVyZW5jZV87CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlXzsKKworI2RlZmluZSBQQl9EU19HRU5fUE9TIGVudHJ5X3BvaW50ZXIKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2l0ZXJhdG9yLmhwcD4KKworI3VuZGVmIFBCX0RTX0dFTl9QT1MKKworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgZGVidWdfYmFzZTsKKyNlbmRpZiAKKworICAgICAgdHlwZWRlZiBjb25kX2RlYWx0b3I8ZW50cnksIEFsbG9jYXRvcj4gY29uZF9kZWFsdG9yX3Q7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIEVxX0ZuIGVxX2ZuOworICAgICAgdHlwZWRlZiBVcGRhdGVfUG9saWN5IHVwZGF0ZV9wb2xpY3k7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFVwZGF0ZV9Qb2xpY3k6Om1ldGFkYXRhX3R5cGUgdXBkYXRlX21ldGFkYXRhOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X2tleV9wb2ludGVyIGNvbnN0X2tleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3JlZmVyZW5jZSBrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3Rfa2V5X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcG9pbnRlciBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X21hcHBlZF9wb2ludGVyIGNvbnN0X21hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3JlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfbWFwcGVkX3JlZmVyZW5jZSBjb25zdF9tYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIHBvaW50X2l0ZXJhdG9yXyBwb2ludF9pdGVyYXRvcjsKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGNvbnN0X3BvaW50X2l0ZXJhdG9yXyBwb2ludF9pdGVyYXRvcjsKKyNlbmRpZiAKKworICAgICAgdHlwZWRlZiBjb25zdF9wb2ludF9pdGVyYXRvcl8gY29uc3RfcG9pbnRfaXRlcmF0b3I7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGl0ZXJhdG9yXyBpdGVyYXRvcjsKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yXyBpdGVyYXRvcjsKKyNlbmRpZiAKKworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvcl8gY29uc3RfaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICBQQl9EU19DTEFTU19OQU1FKCk7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdmlydHVhbAorICAgICAgflBCX0RTX0NMQVNTX05BTUUoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICBQQl9EU19DTEFTU19OQU1FKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlbXB0eSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgbWFwcGVkX3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHJfa2V5LCBtYXBwZWRfdHlwZSgpKSkuZmlyc3QtPnNlY29uZDsKKyNlbHNlIAorCWluc2VydChyX2tleSk7CisJcmV0dXJuIHRyYWl0c19iYXNlOjpzX251bGxfbWFwcGVkOworI2VuZGlmIAorICAgICAgfQorCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCWVudHJ5X3BvaW50ZXIgcF9lID0gZmluZF9pbXAocl9rZXkpOworCXJldHVybiBwb2ludF9pdGVyYXRvcihwX2UgPT0gMCA/IDA6ICZwX2UtPm1fdmFsdWUpOworICAgICAgfQorCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwllbnRyeV9wb2ludGVyIHBfZSA9IGZpbmRfaW1wKHJfa2V5KTsKKwlyZXR1cm4gY29uc3RfcG9pbnRfaXRlcmF0b3IocF9lID09IDAgPyAwOiAmcF9lLT5tX3ZhbHVlKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfTFVfTUFQX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJvdGVjdGVkOgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICAgIHZvaWQKKyAgICAgIGNvcHlfZnJvbV9yYW5nZShJdCwgSXQpOworCisgICAgcHJpdmF0ZToKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBmcmllbmQgY2xhc3MgaXRlcmF0b3JfOworI2VuZGlmIAorCisgICAgICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3JfOworCisgICAgICBpbmxpbmUgZW50cnlfcG9pbnRlcgorICAgICAgYWxsb2NhdGVfbmV3X2VudHJ5KGNvbnN0X3JlZmVyZW5jZSwgZmFsc2VfdHlwZSk7CisKKyAgICAgIGlubGluZSBlbnRyeV9wb2ludGVyCisgICAgICBhbGxvY2F0ZV9uZXdfZW50cnkoY29uc3RfcmVmZXJlbmNlLCB0cnVlX3R5cGUpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YT4KKyAgICAgIGlubGluZSBzdGF0aWMgdm9pZAorICAgICAgaW5pdF9lbnRyeV9tZXRhZGF0YShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGE+KTsKKworICAgICAgaW5saW5lIHN0YXRpYyB2b2lkCisgICAgICBpbml0X2VudHJ5X21ldGFkYXRhKGVudHJ5X3BvaW50ZXIsIHR5cGVfdG9fdHlwZTxudWxsX2x1X21ldGFkYXRhPik7CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGVfYWxsKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlX25leHQoZW50cnlfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGFjdHVhbF9lcmFzZV9lbnRyeShlbnRyeV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgaW5jX2l0X3N0YXRlKGNvbnN0X3BvaW50ZXImIHJfcF92YWx1ZSwgZW50cnlfcG9pbnRlciYgcl9wb3MpIGNvbnN0CisgICAgICB7CisJcl9wb3MgPSByX3Bvcy0+bV9wX25leHQ7CisJcl9wX3ZhbHVlID0gKHJfcG9zID09IDApID8gMCA6ICZyX3Bvcy0+bV92YWx1ZTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGE+CisgICAgICBpbmxpbmUgc3RhdGljIGJvb2wKKyAgICAgIGFwcGx5X3VwZGF0ZShlbnRyeV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGE+KTsKKworICAgICAgaW5saW5lIHN0YXRpYyBib29sCisgICAgICBhcHBseV91cGRhdGUoZW50cnlfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfbHVfbWV0YWRhdGE+KTsKKworICAgICAgaW5saW5lIGVudHJ5X3BvaW50ZXIKKyAgICAgIGZpbmRfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2UpIGNvbnN0OworCisgICAgICBzdGF0aWMgZW50cnlfYWxsb2NhdG9yIHNfZW50cnlfYWxsb2NhdG9yOworICAgICAgc3RhdGljIEVxX0ZuIHNfZXFfZm47CisgICAgICBzdGF0aWMgVXBkYXRlX1BvbGljeSBzX3VwZGF0ZV9wb2xpY3k7CisgICAgICBzdGF0aWMgdHlwZV90b190eXBlPHVwZGF0ZV9tZXRhZGF0YT4gc19tZXRhZGF0YV90eXBlX2luZGljYXRvcjsKKyAgICAgIHN0YXRpYyBudWxsX2x1X21ldGFkYXRhIHNfbnVsbF9sdV9tZXRhZGF0YTsKKworICAgICAgbXV0YWJsZSBlbnRyeV9wb2ludGVyIG1fcF9sOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vY29uc3RydWN0b3JfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vaW5mb19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX21hcF8vdHJhY2VfZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQworI3VuZGVmIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfTkFNRQorI3VuZGVmIFBCX0RTX1YyRgorI3VuZGVmIFBCX0RTX0VQMlZQCisjdW5kZWYgUEJfRFNfVjJTCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9tYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTYxMDkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfbWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIGx1X21hcF8uCisgKi8KKworI2lmZGVmIFBCX0RTX0xVX01BUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgc3RkOjpjZXJyIDw8IG1fcF9sIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgIGNvbnN0X2VudHJ5X3BvaW50ZXIgcF9sID0gbV9wX2w7CisgIHdoaWxlIChwX2wgIT0gMCkKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwgUEJfRFNfVjJGKHBfbC0+bV92YWx1ZSkgPDwgc3RkOjplbmRsOworICAgICAgcF9sID0gcF9sLT5tX3BfbmV4dDsKKyAgICB9CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Cit9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9jb3VudGVyX2x1X21ldGFkYXRhLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvY291bnRlcl9sdV9tZXRhZGF0YS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NzZjYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvY291bnRlcl9sdV9tZXRhZGF0YS5ocHAKQEAgLTAsMCArMSw4NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY291bnRlcl9sdV9tZXRhZGF0YS5ocHAKKyAqIENvbnRhaW5zIGltcGxlbWVudGF0aW9uIG9mIGEgbHUgY291bnRlciBwb2xpY3kncyBtZXRhZGF0YS4KKyAqLworCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgY291bnRlcl9sdV9wb2xpY3lfYmFzZTsKKworICAgIC8vIEEgbGlzdC11cGRhdGUgbWV0YWRhdGEgdHlwZSB0aGF0IG1vdmVzIGVsZW1lbnRzIHRvIHRoZSBmcm9udCBvZgorICAgIC8vIHRoZSBsaXN0IGJhc2VkIG9uIHRoZSBjb3VudGVyIGFsZ29yaXRobS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgICBjbGFzcyBjb3VudGVyX2x1X21ldGFkYXRhCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBjb3VudGVyX2x1X21ldGFkYXRhKHNpemVfdHlwZSBpbml0X2NvdW50KSA6IG1fY291bnQoaW5pdF9jb3VudCkKKyAgICAgIHsgfQorCisgICAgICBmcmllbmQgY2xhc3MgY291bnRlcl9sdV9wb2xpY3lfYmFzZTxzaXplX3R5cGU+OworCisgICAgICBtdXRhYmxlIHNpemVfdHlwZSBtX2NvdW50OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgY291bnRlcl9sdV9wb2xpY3lfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICAgIGNvdW50ZXJfbHVfbWV0YWRhdGE8c2l6ZV90eXBlPgorICAgICAgb3BlcmF0b3IoKShzaXplX3R5cGUgbWF4X3NpemUpIGNvbnN0CisgICAgICB7IHJldHVybiBjb3VudGVyX2x1X21ldGFkYXRhPFNpemVfVHlwZT4oc3RkOjpyYW5kKCkgJSBtYXhfc2l6ZSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfUmVmZXJlbmNlPgorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShNZXRhZGF0YV9SZWZlcmVuY2Ugcl9kYXRhLCBzaXplX3R5cGUgbV9tYXhfY291bnQpIGNvbnN0CisgICAgICB7CisJaWYgKCsrcl9kYXRhLm1fY291bnQgIT0gbV9tYXhfY291bnQpCisJICByZXR1cm4gZmFsc2U7CisJcl9kYXRhLm1fY291bnQgPSAwOworCXJldHVybiB0cnVlOworICAgICAgfQorICAgIH07CisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9jb3VudGVyX2x1X3BvbGljeV9pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9jb3VudGVyX2x1X3BvbGljeV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGE5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L2NvdW50ZXJfbHVfcG9saWN5X2ltcC5ocHAKQEAgLTAsMCArMSw1MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY291bnRlcl9sdV9wb2xpY3lfaW1wLmhwcAorICogQ29udGFpbnMgYSBsdSBjb3VudGVyIHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworZGV0YWlsOjpjb3VudGVyX2x1X21ldGFkYXRhPHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlPgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3BlcmF0b3IoKSgpIGNvbnN0Cit7IHJldHVybiAoYmFzZV90eXBlOjpvcGVyYXRvcigpKG1heF9jb3VudCkpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSByX2RhdGEpIGNvbnN0Cit7IHJldHVybiAoYmFzZV90eXBlOjpvcGVyYXRvcigpKHJfZGF0YSwgbWF4X2NvdW50KSk7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvbXRmX2x1X3BvbGljeV9pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9tdGZfbHVfcG9saWN5X2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MjZjNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvbXRmX2x1X3BvbGljeV9pbXAuaHBwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG10Zl9sdV9wb2xpY3lfaW1wLmhwcAorICogQ29udGFpbnMgYSBtb3ZlLXRvLWZyb250IHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworbnVsbF9sdV9tZXRhZGF0YSBQQl9EU19DTEFTU19DX0RFQzo6c19tZXRhZGF0YTsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjptZXRhZGF0YV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKCkgY29uc3QKK3sgcmV0dXJuIHNfbWV0YWRhdGE7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSAvKnJfZGF0YSovKSBjb25zdAoreyByZXR1cm4gdHJ1ZTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L3NhbXBsZV91cGRhdGVfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvc2FtcGxlX3VwZGF0ZV9wb2xpY3kuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGExZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L3NhbXBsZV91cGRhdGVfcG9saWN5LmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfdXBkYXRlX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHBvbGljeSBmb3IgbGlzdCB1cGRhdGUgY29udGFpbmVycy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9VUERBVEVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfVVBEQVRFX1BPTElDWV9IUFAKKworLy8gQSBzYW1wbGUgbGlzdC11cGRhdGUgcG9saWN5Lgorc3RydWN0IHNhbXBsZV91cGRhdGVfcG9saWN5Cit7CisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIHNhbXBsZV91cGRhdGVfcG9saWN5KCk7CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgc2FtcGxlX3VwZGF0ZV9wb2xpY3koY29uc3Qgc2FtcGxlX3VwZGF0ZV9wb2xpY3kmKTsKKworICAvLyBTd2FwcyBjb250ZW50LgorICBpbmxpbmUgdm9pZAorICBzd2FwKHNhbXBsZV91cGRhdGVfcG9saWN5JiBvdGhlcik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICB0eXBlZGVmIHNvbWVfbWV0YWRhdGFfdHlwZSBtZXRhZGF0YV90eXBlOworCisgIC8vIENyZWF0ZXMgYSBtZXRhZGF0YSBvYmplY3QuCisgIG1ldGFkYXRhX3R5cGUKKyAgb3BlcmF0b3IoKSgpIGNvbnN0OworCisgIC8vIERlY2lkZXMgd2hldGhlciBhIG1ldGFkYXRhIG9iamVjdCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGZyb250IG9mCisgIC8vIHRoZSBsaXN0LiBBIGxpc3QtdXBkYXRlIGJhc2VkIGNvbnRhaW5lcnMgb2JqZWN0IHdpbGwgY2FsbCB0aGlzCisgIC8vIG1ldGhvZCB0byBkZWNpZGUgd2hldGhlciB0byBtb3ZlIGEgbm9kZSB0byB0aGUgZnJvbnQgb2YgdGhlCisgIC8vIGxpc3QuIFRoZSBtZXRob2Qgc2hvdWxlIHJldHVybiB0cnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBtb3ZlZAorICAvLyB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QuCisgIGJvb2wKKyAgb3BlcmF0b3IoKShtZXRhZGF0YV9yZWZlcmVuY2UpIGNvbnN0OworfTsKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9jb25kX2R0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9jb25kX2R0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzRiOWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbmRfZHRvci5ocHAKQEAgLTAsMCArMSw3NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uZF9kdG9yLmhwcAorICogQ29udGFpbnMgYSBjb25kaXRpb25hbCBkZXN0cnVjdG9yCisgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorY2xhc3MgY29uZF9kdG9yCit7CitwdWJsaWM6CisgIGNvbmRfZHRvcih2YWx1ZV92ZWN0b3IgYV92ZWMsIGl0ZXJhdG9yJiByX2xhc3RfaXQsIFNpemVfVHlwZSB0b3RhbF9zaXplKSAKKyAgOiBtX2FfdmVjKGFfdmVjKSwgbV9yX2xhc3RfaXQocl9sYXN0X2l0KSwgbV9tYXhfc2l6ZSh0b3RhbF9zaXplKSwKKyAgICBtX25vX2FjdGlvbihmYWxzZSkKKyAgeyB9CisKKyAgfmNvbmRfZHRvcigpCisgIHsKKyAgICBpZiAobV9ub19hY3Rpb24pCisgICAgICByZXR1cm47CisgICAgaXRlcmF0b3IgaXQgPSBtX2FfdmVjOworICAgIHdoaWxlIChpdCAhPSBtX3JfbGFzdF9pdCkKKyAgICAgIHsKKwlpdC0+fnZhbHVlX3R5cGUoKTsKKwkrK2l0OworICAgICAgfQorCisgICAgaWYgKG1fbWF4X3NpemUgPiAwKQorICAgICAgdmFsdWVfYWxsb2NhdG9yKCkuZGVhbGxvY2F0ZShtX2FfdmVjLCBtX21heF9zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIHNldF9ub19hY3Rpb24oKQorICB7IG1fbm9fYWN0aW9uID0gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgIHZhbHVlX3ZlY3RvciBtX2FfdmVjOworICBpdGVyYXRvciYgbV9yX2xhc3RfaXQ7CisgIGNvbnN0IFNpemVfVHlwZSBtX21heF9zaXplOworICBib29sIG1fbm9fYWN0aW9uOworfTsKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODQ0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjczIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6dmFsdWVfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c192YWx1ZV9hbGxvYzsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjptZXRhZGF0YV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX21ldGFkYXRhX2FsbG9jOworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfT1ZfVFJFRV9DTEFTU19OQU1FKCkgOgorICBtX2FfdmFsdWVzKDApLAorICBtX2FfbWV0YWRhdGEoMCksCisgIG1fZW5kX2l0KDApLAorICBtX3NpemUoMCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19PVl9UUkVFX0NMQVNTX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBjbXBfZm5fYmFzZShyX2NtcF9mbiksCisgIG1fYV92YWx1ZXMoMCksCisgIG1fYV9tZXRhZGF0YSgwKSwKKyAgbV9lbmRfaXQoMCksCisgIG1fc2l6ZSgwKQoreyBfR0xJQkNYWF9ERUJVR19PTkxZKFBCX0RTX0NMQVNTX0NfREVDOjphc3NlcnRfdmFsaWQoKTspIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX09WX1RSRUVfQ0xBU1NfTkFNRShjb25zdCBDbXBfRm4mIHJfY21wX2ZuLCBjb25zdCBub2RlX3VwZGF0ZSYgcl9ub2RlX3VwZGF0ZSkgOgorICBjbXBfZm5fYmFzZShyX2NtcF9mbiksCisgIG5vZGVfdXBkYXRlKHJfbm9kZV91cGRhdGUpLAorICBtX2FfdmFsdWVzKDApLAorICBtX2FfbWV0YWRhdGEoMCksCisgIG1fZW5kX2l0KDApLAorICBtX3NpemUoMCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19PVl9UUkVFX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgZGVidWdfYmFzZShvdGhlciksCisjZW5kaWYgCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorICBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMob3RoZXIpLAorI2VuZGlmIAorICBjbXBfZm5fYmFzZShvdGhlciksCisgIG5vZGVfdXBkYXRlKG90aGVyKSwKKyAgbV9hX3ZhbHVlcygwKSwKKyAgbV9hX21ldGFkYXRhKDApLAorICBtX2VuZF9pdCgwKSwKKyAgbV9zaXplKDApCit7CisgIGNvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKG90aGVyLmJlZ2luKCksIG90aGVyLmVuZCgpKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgdHlwZWRlZgorICAgIHN0ZDo6bWFwPAorICAgIGtleV90eXBlLAorICAgIG1hcHBlZF90eXBlLAorICAgIENtcF9GbiwKKyAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICB2YWx1ZV90eXBlPjo6b3RoZXI+CisgICAgbWFwX3R5cGU7CisjZWxzZSAKKyAgdHlwZWRlZgorICAgIHN0ZDo6c2V0PAorICAgIGtleV90eXBlLAorICAgIENtcF9GbiwKKyAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICBLZXk+OjpvdGhlcj4KKyAgICBtYXBfdHlwZTsKKyNlbmRpZiAKKworICBtYXBfdHlwZSBtKGZpcnN0X2l0LCBsYXN0X2l0KTsKKyAgY29weV9mcm9tX29yZGVyZWRfcmFuZ2UobS5iZWdpbigpLCBtLmVuZCgpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIGNvbnN0IHNpemVfdHlwZSBsZW4gPSBzdGQ6OmRpc3RhbmNlKGZpcnN0X2l0LCBsYXN0X2l0KTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybjsKKworICB2YWx1ZV92ZWN0b3IgYV92YWx1ZXMgPSBzX3ZhbHVlX2FsbG9jLmFsbG9jYXRlKGxlbik7CisgIGl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfdmFsdWVzOworICBJdCBzb3VyY2VfaXQgPSBmaXJzdF9pdDsKKyAgSXQgc291cmNlX2VuZF9pdCA9IGxhc3RfaXQ7CisKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QoYV92YWx1ZXMsIHRhcmdldF9pdCwgbGVuKTsKKyAgd2hpbGUgKHNvdXJjZV9pdCAhPSBzb3VyY2VfZW5kX2l0KQorICAgIHsKKyAgICAgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4odGFyZ2V0X2l0KSkpCisJdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworCisgICAgICArK3RhcmdldF9pdDsKKyAgICB9CisKKyAgcmVhbGxvY2F0ZV9tZXRhZGF0YSgobm9kZV91cGRhdGUqICl0aGlzLCBsZW4pOworICBjZC5zZXRfbm9fYWN0aW9uKCk7CisgIG1fYV92YWx1ZXMgPSBhX3ZhbHVlczsKKyAgbV9zaXplID0gbGVuOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisgIHVwZGF0ZShQQl9EU19ub2RlX2JlZ2luX2ltcCgpLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGNvbnN0X2l0ZXJhdG9yIGRiZ19pdCA9IG1fYV92YWx1ZXM7CisgIHdoaWxlIChkYmdfaXQgIT0gbV9lbmRfaXQpCisgICAgeworICAgICAgZGVidWdfYmFzZTo6aW5zZXJ0X25ldyhQQl9EU19WMkYoKmRiZ19pdCkpOworICAgICAgZGJnX2l0Kys7CisgICAgfQorICBQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7CisjZW5kaWYgCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0LCBJdCBvdGhlcl9maXJzdF9pdCwgCisJCQlJdCBvdGhlcl9sYXN0X2l0KQoreworICBjbGVhcigpOworICBjb25zdCBzaXplX3R5cGUgbGVuID0gc3RkOjpkaXN0YW5jZShmaXJzdF9pdCwgbGFzdF9pdCkgCisgICAgCQkgICAgICAgICArIHN0ZDo6ZGlzdGFuY2Uob3RoZXJfZmlyc3RfaXQsIG90aGVyX2xhc3RfaXQpOworCisgIHZhbHVlX3ZlY3RvciBhX3ZhbHVlcyA9IHNfdmFsdWVfYWxsb2MuYWxsb2NhdGUobGVuKTsKKworICBpdGVyYXRvciB0YXJnZXRfaXQgPSBhX3ZhbHVlczsKKyAgSXQgc291cmNlX2l0ID0gZmlyc3RfaXQ7CisgIEl0IHNvdXJjZV9lbmRfaXQgPSBsYXN0X2l0OworCisgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKGFfdmFsdWVzLCB0YXJnZXRfaXQsIGxlbik7CisgIHdoaWxlIChzb3VyY2VfaXQgIT0gc291cmNlX2VuZF9pdCkKKyAgICB7CisgICAgICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KHRhcmdldF9pdCkpKQorCXZhbHVlX3R5cGUoKnNvdXJjZV9pdCsrKTsKKyAgICAgICsrdGFyZ2V0X2l0OworICAgIH0KKworICBzb3VyY2VfaXQgPSBvdGhlcl9maXJzdF9pdDsKKyAgc291cmNlX2VuZF9pdCA9IG90aGVyX2xhc3RfaXQ7CisKKyAgd2hpbGUgKHNvdXJjZV9pdCAhPSBzb3VyY2VfZW5kX2l0KQorICAgIHsKKyAgICAgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4odGFyZ2V0X2l0KSkpCisJdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworICAgICAgKyt0YXJnZXRfaXQ7CisgICAgfQorCisgIHJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKiApdGhpcywgbGVuKTsKKyAgY2Quc2V0X25vX2FjdGlvbigpOworICBtX2FfdmFsdWVzID0gYV92YWx1ZXM7CisgIG1fc2l6ZSA9IGxlbjsKKyAgbV9lbmRfaXQgPSBtX2FfdmFsdWVzICsgbV9zaXplOworICB1cGRhdGUoUEJfRFNfbm9kZV9iZWdpbl9pbXAoKSwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBjb25zdF9pdGVyYXRvciBkYmdfaXQgPSBtX2FfdmFsdWVzOworICB3aGlsZSAoZGJnX2l0ICE9IG1fZW5kX2l0KQorICAgIHsKKyAgICAgIGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKCpkYmdfaXQpKTsKKyAgICAgIGRiZ19pdCsrOworICAgIH0KKyAgUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOworI2VuZGlmIAorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICB2YWx1ZV9zd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKChDbXBfRm4mICkoKnRoaXMpLCAoQ21wX0ZuJiApb3RoZXIpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBzdGQ6OnN3YXAobV9hX3ZhbHVlcywgb3RoZXIubV9hX3ZhbHVlcyk7CisgIHN0ZDo6c3dhcChtX2FfbWV0YWRhdGEsIG90aGVyLm1fYV9tZXRhZGF0YSk7CisgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7CisgIHN0ZDo6c3dhcChtX2VuZF9pdCwgb3RoZXIubV9lbmRfaXQpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OnN3YXAob3RoZXIpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK35QQl9EU19PVl9UUkVFX0NMQVNTX05BTUUoKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgIHJlYWxsb2NhdGVfbWV0YWRhdGEoKG5vZGVfdXBkYXRlKiApdGhpcywgMCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlKG5vZGVfaXRlcmF0b3IgLyppdCovLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlKG5vZGVfaXRlcmF0b3IgbmRfaXQsIE5vZGVfVXBkYXRlKiBwX3VwZGF0ZSkKK3sKKyAgY29uc3Rfbm9kZV9pdGVyYXRvciBlbmRfaXQgPSBQQl9EU19ub2RlX2VuZF9pbXAoKTsKKyAgaWYgKG5kX2l0ID09IGVuZF9pdCkKKyAgICByZXR1cm47CisgIHVwZGF0ZShuZF9pdC5nZXRfbF9jaGlsZCgpLCBwX3VwZGF0ZSk7CisgIHVwZGF0ZShuZF9pdC5nZXRfcl9jaGlsZCgpLCBwX3VwZGF0ZSk7CisgIG5vZGVfdXBkYXRlOjpvcGVyYXRvcigpKG5kX2l0LCBlbmRfaXQpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmNGVkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2Fzc2VydF92YWxpZCgpIGNvbnN0Cit7CisgIHN0ZDo6Y291dCA8PCAiYXYxIiA8PCBzdGQ6OmVuZGw7CisgIGlmIChtX2FfdmFsdWVzID09IDAgfHwgbV9lbmRfaXQgPT0gMCB8fCBtX3NpemUgPT0gMCkKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX3ZhbHVlcyA9PSAwICYmICBtX2VuZF9pdCA9PSAwICYmIG1fc2l6ZSA9PSAwKTsKKworICBzdGQ6OmNvdXQgPDwgImF2MiIgPDwgc3RkOjplbmRsOworICBhc3NlcnRfaXRlcmF0b3JzKCk7CisgIHN0ZDo6Y291dCA8PCAiYXYzIiA8PCBzdGQ6OmVuZGw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfaXRlcmF0b3JzKCkgY29uc3QKK3sKKyAgZGVidWdfYmFzZTo6Y2hlY2tfc2l6ZShtX3NpemUpOworICBzaXplX3R5cGUgaXRlcmF0ZWRfbnVtID0gMDsKKyAgY29uc3RfaXRlcmF0b3IgcHJldl9pdCA9IGVuZCgpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9lbmRfaXQgPT0gbV9hX3ZhbHVlcyArIG1fc2l6ZSk7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgKytpdCkKKyAgICB7CisgICAgICArK2l0ZXJhdGVkX251bTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYoKml0KSk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGxvd2VyX2JvdW5kKFBCX0RTX1YyRigqaXQpKSA9PSBpdCk7CisgICAgICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZF9pdCA9IHVwcGVyX2JvdW5kKFBCX0RTX1YyRigqaXQpKTsKKyAgICAgIC0tdXBwZXJfYm91bmRfaXQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQodXBwZXJfYm91bmRfaXQgPT0gaXQpOworICAgICAgaWYgKHByZXZfaXQgIT0gZW5kKCkpCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKnByZXZfaXQpLAorCQkJCQkJIFBCX0RTX1YyRigqaXQpKSk7CisgICAgICBwcmV2X2l0ID0gaXQ7CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXRlcmF0ZWRfbnVtID09IG1fc2l6ZSk7Cit9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5YTA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxOTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGVyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGlmIChtX3NpemUgPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSogKXRoaXMsIDApOworICAgICAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2xlYXIoKTspCisgIG1fYV92YWx1ZXMgPSAwOworICBtX3NpemUgPSAwOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXM7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6Z3JvdXBfYWRqdXN0b3IgYWRqdXN0KG1fc2l6ZSk7CisjZW5kaWYgCisKKyAgc2l6ZV90eXBlIG5ld19zaXplID0gMDsKKyAgc2l6ZV90eXBlIG51bV92YWxfZXJzZCA9IDA7CisgIGl0ZXJhdG9yIHNvdXJjZV9pdCA9IG1fYV92YWx1ZXM7CisgIGZvciAoc291cmNlX2l0ID0gYmVnaW4oKTsgc291cmNlX2l0ICE9IG1fZW5kX2l0OyArK3NvdXJjZV9pdCkKKyAgICBpZiAoIXByZWQoKnNvdXJjZV9pdCkpCisgICAgICArK25ld19zaXplOworICAgIGVsc2UKKyAgICAgICsrbnVtX3ZhbF9lcnNkOworCisgIGlmIChuZXdfc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIGNsZWFyKCk7CisgICAgICByZXR1cm4gbnVtX3ZhbF9lcnNkOworICAgIH0KKworICB2YWx1ZV92ZWN0b3IgYV9uZXdfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShuZXdfc2l6ZSk7CisgIGl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfbmV3X3ZhbHVlczsKKyAgY29uZF9kdG9yPHNpemVfdHlwZT4gY2QoYV9uZXdfdmFsdWVzLCB0YXJnZXRfaXQsIG5ld19zaXplKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjbGVhcigpKTsKKyAgZm9yIChzb3VyY2VfaXQgPSBiZWdpbigpOyBzb3VyY2VfaXQgIT0gbV9lbmRfaXQ7ICsrc291cmNlX2l0KQorICAgIHsKKyAgICAgIGlmICghcHJlZCgqc291cmNlX2l0KSkKKyAgICAgICAgeworCSAgbmV3IChjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KHRhcmdldF9pdCkpKQorCSAgICB2YWx1ZV90eXBlKCpzb3VyY2VfaXQpOworCisJICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6Omluc2VydF9uZXcoUEJfRFNfVjJGKCpzb3VyY2VfaXQpKSk7CisJICArK3RhcmdldF9pdDsKKyAgICAgICAgfQorICAgIH0KKworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSogKXRoaXMsIG5ld19zaXplKTsKKyAgY2Quc2V0X25vX2FjdGlvbigpOworCisgIHsKKyAgICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZDEobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgIH0KKworICBtX2FfdmFsdWVzID0gYV9uZXdfdmFsdWVzOworICBtX3NpemUgPSBuZXdfc2l6ZTsKKyAgbV9lbmRfaXQgPSB0YXJnZXRfaXQ7CisgIHVwZGF0ZShub2RlX2JlZ2luKCksIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIG51bV92YWxfZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0PgorSXQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2ltcChJdCBpdCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGlmIChpdCA9PSBlbmQoKSkKKyAgICByZXR1cm4gZW5kKCk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6Y2hlY2tfa2V5X2V4aXN0cyhQQl9EU19WMkYoKml0KSk7KQorCisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6Z3JvdXBfYWRqdXN0b3IgYWRqdXN0KG1fc2l6ZSk7CisjZW5kaWYgCisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICB2YWx1ZV92ZWN0b3IgYV92YWx1ZXMgPSBzX3ZhbHVlX2FsbG9jLmFsbG9jYXRlKG1fc2l6ZSAtIDEpOworICBpdGVyYXRvciBzb3VyY2VfaXQgPSBiZWdpbigpOworICBpdGVyYXRvciBzb3VyY2VfZW5kX2l0ID0gZW5kKCk7CisgIGl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfdmFsdWVzOworICBpdGVyYXRvciByZXRfaXQgPSBlbmQoKTsKKworICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZChhX3ZhbHVlcywgdGFyZ2V0X2l0LCBtX3NpemUgLSAxKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKHNpemVfdHlwZSBjbnQgPSAwOykKKworICB3aGlsZSAoc291cmNlX2l0ICE9IHNvdXJjZV9lbmRfaXQpCisgICAgeworICAgICAgaWYgKHNvdXJjZV9pdCAhPSBpdCkKKwl7CisgICAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWSgrK2NudDspCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoY250ICE9IG1fc2l6ZSk7CisgICAgICAgICAgbmV3IChjb25zdF9jYXN0PHZvaWQqID4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCogPih0YXJnZXRfaXQpKSkKKwkgICAgICB2YWx1ZV90eXBlKCpzb3VyY2VfaXQpOworCisgICAgICAgICAgKyt0YXJnZXRfaXQ7CisJfQorICAgICAgZWxzZQorCXJldF9pdCA9IHRhcmdldF9pdDsKKyAgICArK3NvdXJjZV9pdDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICByZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSogKXRoaXMsIG1fc2l6ZSAtIDEpOworICBjZC5zZXRfbm9fYWN0aW9uKCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRigqaXQpKTspCisgIHsKKyAgICBjb25kX2R0b3I8c2l6ZV90eXBlPiBjZDEobV9hX3ZhbHVlcywgbV9lbmRfaXQsIG1fc2l6ZSk7CisgIH0KKworICBtX2FfdmFsdWVzID0gYV92YWx1ZXM7CisgIC0tbV9zaXplOworICBtX2VuZF9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisgIHVwZGF0ZShub2RlX2JlZ2luKCksIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIEl0KHJldF9pdCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBwb2ludF9pdGVyYXRvciBpdCA9IGZpbmQocl9rZXkpOworICBpZiAoaXQgPT0gZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBlcmFzZShpdCk7CisgIHJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0MjFhZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDYwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIHJldHVybiBtX3NpemU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWF4X3NpemUoKSBjb25zdAoreyByZXR1cm4gc192YWx1ZV9hbGxvYy5tYXhfc2l6ZSgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW1wdHkoKSBjb25zdAoreyByZXR1cm4gc2l6ZSgpID09IDA7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkMWI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWFsbG9jYXRlX21ldGFkYXRhKG51bGxfbm9kZV91cGRhdGVfcG9pbnRlciwgc2l6ZV90eXBlKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZWFsbG9jYXRlX21ldGFkYXRhKE5vZGVfVXBkYXRlXyogLCBzaXplX3R5cGUgbmV3X3NpemUpCit7CisgIG1ldGFkYXRhX3BvaW50ZXIgYV9uZXdfbWV0YWRhdGFfdmVjID0obmV3X3NpemUgPT0gMCkgPyAwIDogc19tZXRhZGF0YV9hbGxvYy5hbGxvY2F0ZShuZXdfc2l6ZSk7CisKKyAgaWYgKG1fYV9tZXRhZGF0YSAhPSAwKQorICAgIHsKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbV9zaXplOyArK2kpCisJbV9hX21ldGFkYXRhW2ldLn5tZXRhZGF0YV90eXBlKCk7CisgICAgICBzX21ldGFkYXRhX2FsbG9jLmRlYWxsb2NhdGUobV9hX21ldGFkYXRhLCBtX3NpemUpOworICAgIH0KKyAgc3RkOjpzd2FwKG1fYV9tZXRhZGF0YSwgYV9uZXdfbWV0YWRhdGFfdmVjKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2l0ZXJhdG9yc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGYxMTAwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGl0ZXJhdG9yc19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X25vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfYmVnaW4oKSBjb25zdAoreyByZXR1cm4gUEJfRFNfbm9kZV9iZWdpbl9pbXAoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9ub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2VuZCgpIGNvbnN0Cit7IHJldHVybiBQQl9EU19ub2RlX2VuZF9pbXAoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkKK3sgcmV0dXJuIFBCX0RTX25vZGVfYmVnaW5faW1wKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKQoreyByZXR1cm4gUEJfRFNfbm9kZV9lbmRfaW1wKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3Rfbm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfbm9kZV9iZWdpbl9pbXAoKSBjb25zdAoreworICByZXR1cm4gY29uc3Rfbm9kZV9pdGVyYXRvcihjb25zdF9jYXN0PHBvaW50ZXI+KG1pZF9wb2ludGVyKGJlZ2luKCksIGVuZCgpKSksCisJCQkgICAgICBjb25zdF9jYXN0PHBvaW50ZXI+KGJlZ2luKCkpLAorCQkJICAgICAgY29uc3RfY2FzdDxwb2ludGVyPihlbmQoKSksKG1fYV9tZXRhZGF0YSA9PSAwKT8KKwkJCSAgICAgIDAgOgorCQkJICAgICAgbWlkX3BvaW50ZXIobV9hX21ldGFkYXRhLCBtX2FfbWV0YWRhdGEgKyBtX3NpemUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3Rfbm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfbm9kZV9lbmRfaW1wKCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X25vZGVfaXRlcmF0b3IoZW5kKCksIGVuZCgpLCBlbmQoKSwKKwkJICAgICAobV9hX21ldGFkYXRhID09IDApID8gMCA6IG1fYV9tZXRhZGF0YSArIG1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX25vZGVfYmVnaW5faW1wKCkKK3sKKyAgcmV0dXJuIG5vZGVfaXRlcmF0b3IobWlkX3BvaW50ZXIoYmVnaW4oKSwgZW5kKCkpLCBiZWdpbigpLCBlbmQoKSwKKwkJICAgICAgIChtX2FfbWV0YWRhdGEgPT0gMCkgPyAwIDogbWlkX3BvaW50ZXIobV9hX21ldGFkYXRhLCBtX2FfbWV0YWRhdGEgKyBtX3NpemUpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorUEJfRFNfbm9kZV9lbmRfaW1wKCkKK3sKKyAgcmV0dXJuIG5vZGVfaXRlcmF0b3IoZW5kKCksIGVuZCgpLAorCQkgIGVuZCgpLChtX2FfbWV0YWRhdGEgPT0gMCkgPyAwIDogbV9hX21ldGFkYXRhICsgbV9zaXplKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9ub2RlX2l0ZXJhdG9ycy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL25vZGVfaXRlcmF0b3JzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE3ODk2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9ub2RlX2l0ZXJhdG9ycy5ocHAKQEAgLTAsMCArMSwyOTIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG5vZGVfaXRlcmF0b3JzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfT1ZfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKyNkZWZpbmUgUEJfRFNfT1ZfVFJFRV9OT0RFX0lURVJBVE9SU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX09WX1RSRUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQwlcCisgICAgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0XzxWYWx1ZV9UeXBlLCBNZXRhZGF0YV9UeXBlLCBBbGxvY2F0b3I+CisKKyAgICAvLyBDb25zdCBub2RlIHJlZmVyZW5jZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBNZXRhZGF0YV9UeXBlLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3Mgb3ZfdHJlZV9ub2RlX2NvbnN0X2l0XworICAgIHsKKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgVmFsdWVfVHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBwb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlWYWx1ZV9UeXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCU1ldGFkYXRhX1R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfbWV0YWRhdGFfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBQQl9EU19PVl9UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMgdGhpc190eXBlOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHI+CisgICAgICBpbmxpbmUgc3RhdGljIFB0cgorICAgICAgbWlkX3BvaW50ZXIoUHRyIHBfYmVnaW4sIFB0ciBwX2VuZCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9lbmQgPj0gcF9iZWdpbik7CisJcmV0dXJuIChwX2JlZ2luICsgKHBfZW5kIC0gcF9iZWdpbikgLyAyKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCVZhbHVlX1R5cGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgdmFsdWVfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCVZhbHVlX1R5cGU+Ojp0eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdHlwZW5hbWUgcmVtb3ZlX2NvbnN0PAorCVZhbHVlX1R5cGU+Ojp0eXBlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiBNZXRhZGF0YV9UeXBlIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCW1ldGFkYXRhX3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgICAgICBjb25zdF9tZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICBpbmxpbmUKKyAgICAgIG92X3RyZWVfbm9kZV9jb25zdF9pdF8oY29uc3RfcG9pbnRlciBwX25kID0gMCwgIGNvbnN0X3BvaW50ZXIgcF9iZWdpbl9uZCA9IDAsICBjb25zdF9wb2ludGVyIHBfZW5kX25kID0gMCwgIGNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9tZXRhZGF0YSA9IDApIDogbV9wX3ZhbHVlKGNvbnN0X2Nhc3Q8cG9pbnRlcj4ocF9uZCkpLCBtX3BfYmVnaW5fdmFsdWUoY29uc3RfY2FzdDxwb2ludGVyPihwX2JlZ2luX25kKSksIG1fcF9lbmRfdmFsdWUoY29uc3RfY2FzdDxwb2ludGVyPihwX2VuZF9uZCkpLCBtX3BfbWV0YWRhdGEocF9tZXRhZGF0YSkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9wX3ZhbHVlOyB9CisKKyAgICAgIGlubGluZSBjb25zdF9tZXRhZGF0YV9yZWZlcmVuY2UKKyAgICAgIGdldF9tZXRhZGF0YSgpIGNvbnN0CisgICAgICB7CisJZW51bQorCSAgeworCSAgICBoYXNfbWV0YWRhdGEgPSAhaXNfc2FtZTxNZXRhZGF0YV9UeXBlLCBudWxsX25vZGVfbWV0YWRhdGE+Ojp2YWx1ZQorCSAgfTsKKworCVBCX0RTX1NUQVRJQ19BU1NFUlQoc2hvdWxkX2hhdmVfbWV0YWRhdGEsIGhhc19tZXRhZGF0YSk7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9tZXRhZGF0YSAhPSAwKTsKKwlyZXR1cm4gKm1fcF9tZXRhZGF0YTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHRoaXNfdHlwZQorICAgICAgZ2V0X2xfY2hpbGQoKSBjb25zdAorICAgICAgeworCWlmIChtX3BfYmVnaW5fdmFsdWUgPT0gbV9wX3ZhbHVlKQorCSAgcmV0dXJuICh0aGlzX3R5cGUobV9wX2JlZ2luX3ZhbHVlLCBtX3BfYmVnaW5fdmFsdWUsIG1fcF9iZWdpbl92YWx1ZSkpOworCisJY29uc3RfbWV0YWRhdGFfcG9pbnRlciBwX2JlZ2luX21ldGFkYXRhID0KKwkgIG1fcF9tZXRhZGF0YSAtIChtX3BfdmFsdWUgLSBtX3BfYmVnaW5fdmFsdWUpOworCisJcmV0dXJuICh0aGlzX3R5cGUobWlkX3BvaW50ZXIobV9wX2JlZ2luX3ZhbHVlLCBtX3BfdmFsdWUpLAorCQkJICBtX3BfYmVnaW5fdmFsdWUsCisJCQkgIG1fcF92YWx1ZSwKKwkJCSAgbWlkX3BvaW50ZXIocF9iZWdpbl9tZXRhZGF0YSwgbV9wX21ldGFkYXRhKSkpOworICAgICAgfQorCisgICAgICBpbmxpbmUgdGhpc190eXBlCisgICAgICBnZXRfcl9jaGlsZCgpIGNvbnN0CisgICAgICB7CisJaWYgKG1fcF92YWx1ZSA9PSBtX3BfZW5kX3ZhbHVlKQorCSAgcmV0dXJuICh0aGlzX3R5cGUobV9wX2VuZF92YWx1ZSwgIG1fcF9lbmRfdmFsdWUsICBtX3BfZW5kX3ZhbHVlKSk7CisKKwljb25zdF9tZXRhZGF0YV9wb2ludGVyIHBfZW5kX21ldGFkYXRhID0KKwkgIG1fcF9tZXRhZGF0YSArIChtX3BfZW5kX3ZhbHVlIC0gbV9wX3ZhbHVlKTsKKworCXJldHVybiAodGhpc190eXBlKG1pZF9wb2ludGVyKG1fcF92YWx1ZSArIDEsIG1fcF9lbmRfdmFsdWUpLAorCQkJICBtX3BfdmFsdWUgKyAxLAorCQkJICBtX3BfZW5kX3ZhbHVlLChtX3BfbWV0YWRhdGEgPT0gMCkgPworCQkJICAwIDogbWlkX3BvaW50ZXIobV9wX21ldGFkYXRhICsgMSwgcF9lbmRfbWV0YWRhdGEpKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHRoaXNfdHlwZSYgb3RoZXIpIGNvbnN0CisgICAgICB7CisJY29uc3QgYm9vbCBpc19lbmQgPSBtX3BfYmVnaW5fdmFsdWUgPT0gbV9wX2VuZF92YWx1ZTsKKwljb25zdCBib29sIGlzX290aGVyX2VuZCA9IG90aGVyLm1fcF9iZWdpbl92YWx1ZSA9PSBvdGhlci5tX3BfZW5kX3ZhbHVlOworCisJaWYgKGlzX2VuZCkKKwkgIHJldHVybiAoaXNfb3RoZXJfZW5kKTsKKworCWlmIChpc19vdGhlcl9lbmQpCisJICByZXR1cm4gKGlzX2VuZCk7CisKKwlyZXR1cm4gbV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgdGhpc190eXBlJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsgfQorCisgICAgcHVibGljOgorICAgICAgcG9pbnRlciBtX3BfdmFsdWU7CisgICAgICBwb2ludGVyIG1fcF9iZWdpbl92YWx1ZTsKKyAgICAgIHBvaW50ZXIgbV9wX2VuZF92YWx1ZTsKKworICAgICAgY29uc3RfbWV0YWRhdGFfcG9pbnRlciBtX3BfbWV0YWRhdGE7CisgICAgfTsKKworI2RlZmluZSBQQl9EU19PVl9UUkVFX05PREVfSVRFUkFUT1JfQ19ERUMgXAorICAgIG92X3RyZWVfbm9kZV9pdF88VmFsdWVfVHlwZSwgTWV0YWRhdGFfVHlwZSwgQWxsb2NhdG9yPgorCisgICAgLy8gTm9kZSByZWZlcmVuY2UuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgTWV0YWRhdGFfVHlwZSwgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIG92X3RyZWVfbm9kZV9pdF8gOiBwdWJsaWMgUEJfRFNfT1ZfVFJFRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDCisgICAgeworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfT1ZfVFJFRV9OT0RFX0lURVJBVE9SX0NfREVDIHRoaXNfdHlwZTsKKworICAgICAgdHlwZWRlZiBQQl9EU19PVl9UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMgYmFzZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciBwb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X21ldGFkYXRhX3BvaW50ZXIKKyAgICAgIGNvbnN0X21ldGFkYXRhX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlWYWx1ZV9UeXBlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXR5cGVuYW1lIHJlbW92ZV9jb25zdDwKKwlWYWx1ZV9UeXBlPjo6dHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICByZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXR5cGVuYW1lIHJlbW92ZV9jb25zdDwKKwlWYWx1ZV9UeXBlPjo6dHlwZT46Om90aGVyOjpwb2ludGVyCisgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICBpbmxpbmUKKyAgICAgIG92X3RyZWVfbm9kZV9pdF8oY29uc3RfcG9pbnRlciBwX25kID0gMCwgIGNvbnN0X3BvaW50ZXIgcF9iZWdpbl9uZCA9IDAsICBjb25zdF9wb2ludGVyIHBfZW5kX25kID0gMCwgIGNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9tZXRhZGF0YSA9IDApIDogYmFzZV90eXBlKHBfbmQsICBwX2JlZ2luX25kLCAgcF9lbmRfbmQsICBwX21ldGFkYXRhKQorICAgICAgeyB9CisKKyAgICAgIC8vIEFjY2Vzcy4KKyAgICAgIGlubGluZSByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiByZWZlcmVuY2UoYmFzZV90eXBlOjptX3BfdmFsdWUpOyB9CisKKyAgICAgIC8vIFJldHVybnMgdGhlIG5vZGUgcmVmZXJlbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGVmdCBub2RlLgorICAgICAgaW5saW5lIG92X3RyZWVfbm9kZV9pdF8KKyAgICAgIGdldF9sX2NoaWxkKCkgY29uc3QKKyAgICAgIHsKKwlpZiAoYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUgPT0gYmFzZV90eXBlOjptX3BfdmFsdWUpCisJICByZXR1cm4gKHRoaXNfdHlwZShiYXNlX3R5cGU6Om1fcF9iZWdpbl92YWx1ZSwgIGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlLCAgYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUpKTsKKworCWNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9iZWdpbl9tZXRhZGF0YSA9CisJICBiYXNlX3R5cGU6Om1fcF9tZXRhZGF0YSAtIChiYXNlX3R5cGU6Om1fcF92YWx1ZSAtIGJhc2VfdHlwZTo6bV9wX2JlZ2luX3ZhbHVlKTsKKworCXJldHVybiAodGhpc190eXBlKGJhc2VfdHlwZTo6bWlkX3BvaW50ZXIoYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUsIGJhc2VfdHlwZTo6bV9wX3ZhbHVlKSwKKwkJCSAgYmFzZV90eXBlOjptX3BfYmVnaW5fdmFsdWUsCisJCQkgIGJhc2VfdHlwZTo6bV9wX3ZhbHVlLAorCQkJICBiYXNlX3R5cGU6Om1pZF9wb2ludGVyKHBfYmVnaW5fbWV0YWRhdGEsIGJhc2VfdHlwZTo6bV9wX21ldGFkYXRhKSkpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIHRoZSBub2RlIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJpZ2h0IG5vZGUuCisgICAgICBpbmxpbmUgb3ZfdHJlZV9ub2RlX2l0XworICAgICAgZ2V0X3JfY2hpbGQoKSBjb25zdAorICAgICAgeworCWlmIChiYXNlX3R5cGU6Om1fcF92YWx1ZSA9PSBiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUpCisJICByZXR1cm4gKHRoaXNfdHlwZShiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUsICBiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUsICBiYXNlX3R5cGU6Om1fcF9lbmRfdmFsdWUpKTsKKworCWNvbnN0X21ldGFkYXRhX3BvaW50ZXIgcF9lbmRfbWV0YWRhdGEgPQorCSAgYmFzZV90eXBlOjptX3BfbWV0YWRhdGEgKyAoYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlIC0gYmFzZV90eXBlOjptX3BfdmFsdWUpOworCisJcmV0dXJuICh0aGlzX3R5cGUoYmFzZV90eXBlOjptaWRfcG9pbnRlcihiYXNlX3R5cGU6Om1fcF92YWx1ZSArIDEsIGJhc2VfdHlwZTo6bV9wX2VuZF92YWx1ZSksCisJCQkgIGJhc2VfdHlwZTo6bV9wX3ZhbHVlICsgMSwKKwkJCSAgYmFzZV90eXBlOjptX3BfZW5kX3ZhbHVlLChiYXNlX3R5cGU6Om1fcF9tZXRhZGF0YSA9PSAwKT8KKwkJCSAgMCA6IGJhc2VfdHlwZTo6bWlkX3BvaW50ZXIoYmFzZV90eXBlOjptX3BfbWV0YWRhdGEgKyAxLCBwX2VuZF9tZXRhZGF0YSkpKTsKKyAgICAgIH0KKworICAgIH07CisKKyN1bmRlZiBQQl9EU19PVl9UUkVFX05PREVfSVRFUkFUT1JfQ19ERUMKKyN1bmRlZiBQQl9EU19PVl9UUkVFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vb3ZfdHJlZV9tYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDJlZDNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9vdl90cmVlX21hcF8uaHBwCkBAIC0wLDAgKzEsNTIyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvdl90cmVlX21hcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igb3ZfdHJlZV8uCisgKi8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2RlYnVnX21hcF9iYXNlLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCBjbGFzcyBDbXBfRm4sIFwKKwkgICAgIGNsYXNzIE5vZGVfQW5kX0l0X1RyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19PVl9UUkVFX0NMQVNTX05BTUUgb3ZfdHJlZV9kYXRhXworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfT1ZfVFJFRV9DTEFTU19OQU1FIG92X3RyZWVfbm9fZGF0YV8KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfQ09OU1RfTk9ERV9JVEVSQVRPUl9OQU1FIG92X3RyZWVfY29uc3Rfbm9kZV9pdGVyYXRvcl9kYXRhXworI2Vsc2UgCisjZGVmaW5lIFBCX0RTX0NPTlNUX05PREVfSVRFUkFUT1JfTkFNRSBvdl90cmVlX2NvbnN0X25vZGVfaXRlcmF0b3Jfbm9fZGF0YV8KKyNlbmRpZiAKKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICBQQl9EU19PVl9UUkVFX0NMQVNTX05BTUU8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9BbmRfSXRfVHJhaXRzLCBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDIFwKKyAgICB0eXBlc190cmFpdHM8S2V5LCBNYXBwZWQsIEFsbG9jYXRvciwgZmFsc2U+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBcCisgICAgZGVidWdfbWFwX2Jhc2U8S2V5LCBlcV9ieV9sZXNzPEtleSwgQ21wX0ZuPiwgXAorICAgICAgIAl0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxLZXk+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlPgorI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpLmZpcnN0CisjZGVmaW5lIFBCX0RTX1YyUyhYKSAoWCkuc2Vjb25kCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlKQorI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfVjJGKFgpIChYKQorI2RlZmluZSBQQl9EU19WMlMoWCkgTWFwcGVkX0RhdGEoKQorI2RlZmluZSBQQl9EU19FUDJWUChYKSYgKChYKS0+bV92YWx1ZS5maXJzdCkKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyNkZWZpbmUgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0NfREVDIFwKKyAgICB0cmVlX3RyYWNlX2Jhc2U8dHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpjb25zdF9ub2RlX2l0ZXJhdG9yLCBcCisJCSAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfaXRlcmF0b3IsIFwKKwkJICAgIENtcF9GbiwgZmFsc2UsIEFsbG9jYXRvcj4KKyNlbmRpZiAKKworICAgIC8vIE9yZGVyZWQtdmVjdG9yIHRyZWUgYXNzb2NpYXRpdmUtY29udGFpbmVyLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCBjbGFzcyBDbXBfRm4sCisJICAgICBjbGFzcyBOb2RlX0FuZF9JdF9UcmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBQQl9EU19PVl9UUkVFX0NMQVNTX05BTUUgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBwcm90ZWN0ZWQgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMsCisjZW5kaWYgCisjaWZkZWYgUEJfRFNfVFJFRV9UUkFDRQorICAgICAgcHVibGljIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9DX0RFQywKKyNlbmRpZiAKKyAgICAgIHB1YmxpYyBDbXBfRm4sCisgICAgICBwdWJsaWMgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX3VwZGF0ZSwKKyAgICAgIHB1YmxpYyBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDIHRyYWl0c19iYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDx0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZT46OnR5cGUgbm9uX2NvbnN0X3ZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8bm9uX2NvbnN0X3ZhbHVlX3R5cGU+OjpvdGhlciB2YWx1ZV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX2FsbG9jYXRvcjo6cG9pbnRlciB2YWx1ZV92ZWN0b3I7CisKKworICAgICAgdHlwZWRlZiBDbXBfRm4gY21wX2ZuX2Jhc2U7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBkZWJ1Z19iYXNlOworI2VuZGlmIAorCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpwb2ludGVyIG1hcHBlZF9wb2ludGVyXzsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfbWFwcGVkX3BvaW50ZXJfOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6bWV0YWRhdGFfdHlwZSBtZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+OjpvdGhlciBtZXRhZGF0YV9hbGxvY2F0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1ldGFkYXRhX2FsbG9jYXRvcjo6cG9pbnRlciBtZXRhZGF0YV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9tZXRhZGF0YV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1ldGFkYXRhX2FsbG9jYXRvcjo6cmVmZXJlbmNlIG1ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIENtcF9GbiBjbXBfZm47CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlX3VwZGF0ZSBub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjprZXlfcG9pbnRlciBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X2tleV9wb2ludGVyIGNvbnN0X2tleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3JlZmVyZW5jZSBrZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3Rfa2V5X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjptYXBwZWRfcG9pbnRlciBtYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X21hcHBlZF9wb2ludGVyIGNvbnN0X21hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3JlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfbWFwcGVkX3JlZmVyZW5jZSBjb25zdF9tYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRlciBjb25zdF9wb2ludF9pdGVyYXRvcjsKKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyAgICAgIHR5cGVkZWYgcG9pbnRlciBwb2ludF9pdGVyYXRvcjsKKyNlbHNlIAorICAgICAgdHlwZWRlZiBjb25zdF9wb2ludF9pdGVyYXRvciBwb2ludF9pdGVyYXRvcjsKKyNlbmRpZiAKKworICAgICAgdHlwZWRlZiBjb25zdF9wb2ludF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvciBpdGVyYXRvcjsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2NvbmRfZHRvci5ocHA+CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6Y29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgY29uc3Rfbm9kZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfaXRlcmF0b3Igbm9kZV9pdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKworICAgICAgUEJfRFNfT1ZfVFJFRV9DTEFTU19OQU1FKCk7CisKKyAgICAgIFBCX0RTX09WX1RSRUVfQ0xBU1NfTkFNRShjb25zdCBDbXBfRm4mKTsKKworICAgICAgUEJfRFNfT1ZfVFJFRV9DTEFTU19OQU1FKGNvbnN0IENtcF9GbiYsIGNvbnN0IG5vZGVfdXBkYXRlJik7CisKKyAgICAgIFBCX0RTX09WX1RSRUVfQ0xBU1NfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB+UEJfRFNfT1ZfVFJFRV9DTEFTU19OQU1FKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgQ21wX0ZuJiAKKyAgICAgIGdldF9jbXBfZm4oKTsKKworICAgICAgY29uc3QgQ21wX0ZuJiAKKyAgICAgIGdldF9jbXBfZm4oKSBjb25zdDsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJcG9pbnRfaXRlcmF0b3IgaXQgPSBsb3dlcl9ib3VuZChyX2tleSk7CisJaWYgKGl0ICE9IGVuZCgpICYmICFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqaXQpKSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KSk7CisJICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCSAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisJICB9CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gKGluc2VydF9uZXdfdmFsKGl0LCBzdGQ6Om1ha2VfcGFpcihyX2tleSwgbWFwcGVkX3R5cGUoKSkpLT5zZWNvbmQpOworI2Vsc2UgCisJaW5zZXJ0KHJfa2V5KTsKKwlyZXR1cm4gdHJhaXRzX2Jhc2U6OnNfbnVsbF9tYXBwZWQ7CisjZW5kaWYgCisgICAgICB9CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSA9IFBCX0RTX1YyRihyX3ZhbHVlKTsKKwlwb2ludF9pdGVyYXRvciBpdCA9IGxvd2VyX2JvdW5kKHJfa2V5KTsKKworCWlmIChpdCAhPSBlbmQoKSYmICAhQ21wX0ZuOjpvcGVyYXRvcigpKHJfa2V5LCBQQl9EU19WMkYoKml0KSkpCisJICB7CisJICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCSAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXkpKTsKKwkgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0LCBmYWxzZSk7CisJICB9CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X25ld192YWwoaXQsIHJfdmFsdWUpLCB0cnVlKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQorICAgICAgeworCXBvaW50ZXIgaXQgPSBtX2FfdmFsdWVzOworCXBvaW50ZXIgZV9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisJd2hpbGUgKGl0ICE9IGVfaXQpCisJICB7CisJICAgIHBvaW50ZXIgbWlkX2l0ID0gaXQgKyAoKGVfaXQgLSBpdCkgPj4gMSk7CisJICAgIGlmIChjbXBfZm5fYmFzZTo6b3BlcmF0b3IoKShQQl9EU19WMkYoKm1pZF9pdCksIHJfa2V5KSkKKwkgICAgICBpdCA9ICsrbWlkX2l0OworCSAgICBlbHNlCisJICAgICAgZV9pdCA9IG1pZF9pdDsKKwkgIH0KKwlyZXR1cm4gaXQ7CisgICAgICB9CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMmID4oKnRoaXMpLmxvd2VyX2JvdW5kKHJfa2V5KTsgfQorCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisJaXRlcmF0b3IgcG90X2l0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCWlmIChwb3RfaXQgIT0gZW5kKCkmJiAgIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKCpwb3RfaXQpKSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KSk7CisJICAgIHJldHVybiArK3BvdF9pdDsKKwkgIH0KKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KSk7CisJcmV0dXJuIHBvdF9pdDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGNvbnN0X3BvaW50X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyY+KCp0aGlzKS51cHBlcl9ib3VuZChyX2tleSk7IH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJaXRlcmF0b3IgcG90X2l0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCWlmIChwb3RfaXQgIT0gZW5kKCkgJiYgIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKCpwb3RfaXQpKSkKKwkgIHsKKwkgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KSk7CisJICAgIHJldHVybiBwb3RfaXQ7CisJICB9CisKKwlfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChyX2tleSkpOworCXJldHVybiBlbmQoKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGNvbnN0X3BvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiAoY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyYgPigqdGhpcykuZmluZChyX2tleSkpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVyYXNlKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgaXQpCisgICAgICB7IHJldHVybiBlcmFzZV9pbXA8aXRlcmF0b3I+KGl0KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KGNvbnN0X2tleV9yZWZlcmVuY2UsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gbV9hX3ZhbHVlczsgfQorCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fYV92YWx1ZXM7IH0KKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gbV9lbmRfaXQ7IH0KKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9lbmRfaXQ7IH0KKworICAgICAgaW5saW5lIGNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfYmVnaW4oKSBjb25zdDsKKworICAgICAgaW5saW5lIGNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCk7CisKKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2VuZCgpOworCisgICAgcHJpdmF0ZToKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHVwZGF0ZShub2RlX2l0ZXJhdG9yIC8qaXQqLywgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGU+CisgICAgICB2b2lkCisgICAgICB1cGRhdGUobm9kZV9pdGVyYXRvciwgTm9kZV9VcGRhdGUqKTsKKworICAgICAgdm9pZAorICAgICAgcmVhbGxvY2F0ZV9tZXRhZGF0YShudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIsIHNpemVfdHlwZSk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KKyAgICAgIHZvaWQKKyAgICAgIHJlYWxsb2NhdGVfbWV0YWRhdGEoTm9kZV9VcGRhdGVfKiwgc2l6ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fb3JkZXJlZF9yYW5nZShJdCwgSXQpOworCisgICAgICB2b2lkCisgICAgICB2YWx1ZV9zd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoSXQsIEl0LCBJdCwgSXQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHI+CisgICAgICBpbmxpbmUgc3RhdGljIFB0cgorICAgICAgbWlkX3BvaW50ZXIoUHRyIHBfYmVnaW4sIFB0ciBwX2VuZCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9lbmQgPj0gcF9iZWdpbik7CisJcmV0dXJuIChwX2JlZ2luICsgKHBfZW5kIC0gcF9iZWdpbikgLyAyKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfbmV3X3ZhbChpdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisjaWZkZWYgUEJfRFNfUkVHUkVTU0lPTgorCSAgdHlwZW5hbWUgQWxsb2NhdG9yOjpncm91cF9hZGp1c3RvciBhZGp1c3QobV9zaXplKTsKKyNlbmRpZiAKKworCV9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KFBCX0RTX1YyRihyX3ZhbHVlKSkpOworCisJdmFsdWVfdmVjdG9yIGFfdmFsdWVzID0gc192YWx1ZV9hbGxvYy5hbGxvY2F0ZShtX3NpemUgKyAxKTsKKworCWl0ZXJhdG9yIHNvdXJjZV9pdCA9IGJlZ2luKCk7CisJaXRlcmF0b3Igc291cmNlX2VuZF9pdCA9IGVuZCgpOworCWl0ZXJhdG9yIHRhcmdldF9pdCA9IGFfdmFsdWVzOworCWl0ZXJhdG9yIHJldF9pdDsKKworCWNvbmRfZHRvcjxzaXplX3R5cGU+IGNkKGFfdmFsdWVzLCB0YXJnZXRfaXQsIG1fc2l6ZSArIDEpOworCXdoaWxlIChzb3VyY2VfaXQgIT0gaXQpCisJICB7CisJICAgIG5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4odGFyZ2V0X2l0KSkpCisJICAgICAgdmFsdWVfdHlwZSgqc291cmNlX2l0KyspOworCSAgICArK3RhcmdldF9pdDsKKwkgIH0KKworCW5ldyAoY29uc3RfY2FzdDx2b2lkKiA+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqID4ocmV0X2l0ID0gdGFyZ2V0X2l0KSkpCisJICB2YWx1ZV90eXBlKHJfdmFsdWUpOworCSsrdGFyZ2V0X2l0OworCisJd2hpbGUgKHNvdXJjZV9pdCAhPSBzb3VyY2VfZW5kX2l0KQorCSAgeworCSAgICBuZXcgKGNvbnN0X2Nhc3Q8dm9pZCogPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKiA+KHRhcmdldF9pdCkpKQorCSAgICAgIHZhbHVlX3R5cGUoKnNvdXJjZV9pdCsrKTsKKwkgICAgKyt0YXJnZXRfaXQ7CisJICB9CisKKwlyZWFsbG9jYXRlX21ldGFkYXRhKChub2RlX3VwZGF0ZSogKXRoaXMsIG1fc2l6ZSArIDEpOworCWNkLnNldF9ub19hY3Rpb24oKTsKKwlpZiAobV9zaXplICE9IDApCisJICB7CisJICAgIGNvbmRfZHRvcjxzaXplX3R5cGU+IGNkMShtX2FfdmFsdWVzLCBtX2VuZF9pdCwgbV9zaXplKTsKKwkgIH0KKworCSsrbV9zaXplOworCW1fYV92YWx1ZXMgPSBhX3ZhbHVlczsKKwltX2VuZF9pdCA9IG1fYV92YWx1ZXMgKyBtX3NpemU7CisJX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbHVlKSkpOworCXVwZGF0ZShub2RlX2JlZ2luKCksIChub2RlX3VwZGF0ZSogKXRoaXMpOworCV9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfaXRlcmF0b3JzKCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgSXQKKyAgICAgIGVyYXNlX2ltcChJdCBpdCk7CisKKyAgICAgIGlubGluZSBjb25zdF9ub2RlX2l0ZXJhdG9yCisgICAgICBQQl9EU19ub2RlX2JlZ2luX2ltcCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgUEJfRFNfbm9kZV9lbmRfaW1wKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBub2RlX2l0ZXJhdG9yCisgICAgICBQQl9EU19ub2RlX2JlZ2luX2ltcCgpOworCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgUEJfRFNfbm9kZV9lbmRfaW1wKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIHZhbHVlX2FsbG9jYXRvciBzX3ZhbHVlX2FsbG9jOworICAgICAgc3RhdGljIG1ldGFkYXRhX2FsbG9jYXRvciBzX21ldGFkYXRhX2FsbG9jOworCisgICAgICB2YWx1ZV92ZWN0b3IgbV9hX3ZhbHVlczsKKyAgICAgIG1ldGFkYXRhX3BvaW50ZXIgbV9hX21ldGFkYXRhOworICAgICAgaXRlcmF0b3IgbV9lbmRfaXQ7CisgICAgICBzaXplX3R5cGUgbV9zaXplOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19PVl9UUkVFX0NMQVNTX05BTUUKKyN1bmRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKyN1bmRlZiBQQl9EU19UUkVFX1RSQUNFX0JBU0VfQ19ERUMKKyNlbmRpZiAKKworI3VuZGVmIFBCX0RTX1YyRgorI3VuZGVmIFBCX0RTX0VQMlZQCisjdW5kZWYgUEJfRFNfVjJTCisjdW5kZWYgUEJfRFNfQ09OU1RfTk9ERV9JVEVSQVRPUl9OQU1FCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZDZmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDUxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworQ21wX0ZuJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9jbXBfZm4oKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IENtcF9GbiYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfY21wX2ZuKCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiYjZmYQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9vdl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEzNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIG92X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgb3RoZXIuY2xlYXIoKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqYmVnaW4oKSkpKQorICAgIHsKKyAgICAgIHZhbHVlX3N3YXAob3RoZXIpOworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRigqKGVuZCgpIC0gMSkpKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobV9zaXplID09IDEpCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmpvaW4ob3RoZXIpOykKKyAgaXRlcmF0b3IgaXQgPSB1cHBlcl9ib3VuZChyX2tleSk7CisgIFBCX0RTX0NMQVNTX0NfREVDIG5ld19vdGhlcihvdGhlciwgb3RoZXIpOworICBuZXdfb3RoZXIuY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoaXQsIGVuZCgpKTsKKyAgUEJfRFNfQ0xBU1NfQ19ERUMgbmV3X3RoaXMoKnRoaXMsICogdGhpcyk7CisgIG5ld190aGlzLmNvcHlfZnJvbV9vcmRlcmVkX3JhbmdlKGJlZ2luKCksIGl0KTsKKworICAvLyBObyBleGNlcHRpb25zIGZyb20gdGhpcyBwb2ludC4KKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpzcGxpdChyX2tleSwoQ21wX0ZuJiApKCp0aGlzKSwgb3RoZXIpOykKKyAgb3RoZXIudXBkYXRlKG90aGVyLm5vZGVfYmVnaW4oKSwgKG5vZGVfdXBkYXRlKiApKCZvdGhlcikpOworICB1cGRhdGUobm9kZV9iZWdpbigpLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgb3RoZXIudmFsdWVfc3dhcChuZXdfb3RoZXIpOworICB2YWx1ZV9zd2FwKG5ld190aGlzKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgaWYgKG90aGVyLm1fc2l6ZSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGNvbnN0IGJvb2wgZ3JlYXRlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKihlbmQoKSAtIDEpKSwKKwkJCQkJICBQQl9EU19WMkYoKm90aGVyLmJlZ2luKCkpKTsKKworICBjb25zdCBib29sIGxlc3NlciA9IENtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYoKihvdGhlci5lbmQoKSAtIDEpKSwKKwkJCQkJIFBCX0RTX1YyRigqYmVnaW4oKSkpOworCisgIGlmICghZ3JlYXRlciAmJiAhbGVzc2VyKQorICAgIF9fdGhyb3dfam9pbl9lcnJvcigpOworCisgIFBCX0RTX0NMQVNTX0NfREVDIG5ld190aGlzKCp0aGlzLCAqdGhpcyk7CisKKyAgaWYgKGdyZWF0ZXIpCisgICAgbmV3X3RoaXMuY29weV9mcm9tX29yZGVyZWRfcmFuZ2UoYmVnaW4oKSwgZW5kKCksIAorCQkJCSAgICAgb3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCkpOworICBlbHNlCisgICAgbmV3X3RoaXMuY29weV9mcm9tX29yZGVyZWRfcmFuZ2Uob3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCksCisJCQkJICAgICBiZWdpbigpLCBlbmQoKSk7CisKKyAgLy8gTm8gZXhjZXB0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6am9pbihvdGhlcik7KQorICB2YWx1ZV9zd2FwKG5ld190aGlzKTsKKyAgb3RoZXIuY2xlYXIoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy90cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL292X3RyZWVfbWFwXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2IwZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL3RyYWl0cy5ocHAKQEAgLTAsMCArMSwxODMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBvdl90cmVlXy4KKyAqLworCisjaWZuZGVmIFBCX0RTX09WX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19PVl9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvb3ZfdHJlZV9tYXBfL25vZGVfaXRlcmF0b3JzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBDbXBfRm5fLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3JfPgorICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgb3ZfdHJlZV90YWcsCisgICAgICBBbGxvY2F0b3I+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0eXBlc190cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBBbGxvY2F0b3IsCisgICAgICBmYWxzZT46OnZhbHVlX3R5cGUKKyAgICAgIHZhbHVlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0cmVlX25vZGVfbWV0YWRhdGFfc2VsZWN0b3I8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIEFsbG9jYXRvcj46OnR5cGUKKyAgICAgIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIG92X3RyZWVfbm9kZV9jb25zdF9pdF88CisJdmFsdWVfdHlwZSwKKwltZXRhZGF0YV90eXBlLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIG92X3RyZWVfbm9kZV9pdF88CisJdmFsdWVfdHlwZSwKKwltZXRhZGF0YV90eXBlLAorCUFsbG9jYXRvcj4KKyAgICAgIG5vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIE5vZGVfVXBkYXRlPAorCWNvbnN0X25vZGVfaXRlcmF0b3IsCisJbm9kZV9pdGVyYXRvciwKKwlDbXBfRm4sCisJQWxsb2NhdG9yPgorICAgICAgbm9kZV91cGRhdGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIF9fZ251X3BiZHM6Om51bGxfdHJlZV9ub2RlX3VwZGF0ZTwKKwljb25zdF9ub2RlX2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCUFsbG9jYXRvcj4qIAorICAgICAgbnVsbF9ub2RlX3VwZGF0ZV9wb2ludGVyOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBDbXBfRm5fLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3JfPgorICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfbWFwcGVkX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIG92X3RyZWVfdGFnLAorICAgICAgQWxsb2NhdG9yPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgdHlwZXNfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF9tYXBwZWRfdHlwZSwKKyAgICAgIEFsbG9jYXRvciwKKyAgICAgIGZhbHNlPjo6dmFsdWVfdHlwZQorICAgICAgdmFsdWVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9zZWxlY3RvcjwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfbWFwcGVkX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIEFsbG9jYXRvcj46OnR5cGUKKyAgICAgIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIG92X3RyZWVfbm9kZV9jb25zdF9pdF88CisJdmFsdWVfdHlwZSwKKwltZXRhZGF0YV90eXBlLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3Rfbm9kZV9pdGVyYXRvciBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBOb2RlX1VwZGF0ZTwKKwljb25zdF9ub2RlX2l0ZXJhdG9yLAorCWNvbnN0X25vZGVfaXRlcmF0b3IsCisJQ21wX0ZuLAorCUFsbG9jYXRvcj4KKyAgICAgIG5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmCisgICAgICBfX2dudV9wYmRzOjpudWxsX3RyZWVfbm9kZV91cGRhdGU8CisJY29uc3Rfbm9kZV9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUNtcF9GbiwKKwlBbGxvY2F0b3I+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19PVl9UUkVFX05PREVfQU5EX0lUX1RSQUlUU19IUFAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjkyZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw5MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgSXQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpCit7CisgIHdoaWxlIChmaXJzdF9pdCAhPSBsYXN0X2l0KQorICAgIHB1c2goKihmaXJzdF9pdCsrKSk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorcGFpcmluZ19oZWFwXygpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BhaXJpbmdfaGVhcF8oY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBQQl9EU19CQVNFX0NfREVDKHJfY21wX2ZuKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitwYWlyaW5nX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorICBQQl9EU19CQVNFX0NfREVDKG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICBQQl9EU19CQVNFX0NfREVDOjpzd2FwKG90aGVyKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+cGFpcmluZ19oZWFwXygpCit7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhMWU5NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGRlYnVnX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoKSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3Bfcm9vdCA9PSAwIAorCQkgICAgICAgIHx8IGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCk7CisgIGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKCk7Cit9CisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMzE5MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjM2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGEgcGFpcmluZyBoZWFwLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citwb3AoKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIG5vZGVfcG9pbnRlciBwX25ld19yb290ID0gam9pbl9ub2RlX2NoaWxkcmVuKGJhc2VfdHlwZTo6bV9wX3Jvb3QpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZXdfcm9vdCwgZmFsc2UpOykKKyAgaWYgKHBfbmV3X3Jvb3QgIT0gMCkKKyAgICBwX25ld19yb290LT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUoYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25ld19yb290OworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworICByZW1vdmVfbm9kZShpdC5tX3BfbmQpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKGl0Lm1fcF9uZCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVtb3ZlX25vZGUobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgIG5vZGVfcG9pbnRlciBwX25ld19jaGlsZCA9IGpvaW5fbm9kZV9jaGlsZHJlbihwX25kKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGlmIChwX25ld19jaGlsZCAhPSAwKQorICAgIGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25ld19jaGlsZCwgZmFsc2UpOworI2VuZGlmIAorCisgIGlmIChwX25kID09IGJhc2VfdHlwZTo6bV9wX3Jvb3QpCisgICAgeworICAgICAgaWYgKHBfbmV3X2NoaWxkICE9IDApCisJcF9uZXdfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZXdfY2hpbGQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChiYXNlX3R5cGU6Om1fcF9yb290LCBmYWxzZSk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworICBpZiAocF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9PSBwX25kKQorICAgIHsKKyAgICAgIGlmIChwX25ld19jaGlsZCAhPSAwKQorICAgICAgICB7CisJICBwX25ld19jaGlsZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworCSAgcF9uZXdfY2hpbGQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCSAgaWYgKHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisJICAgIHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25ld19jaGlsZDsKKwkgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX2xfY2hpbGQgPSBwX25ld19jaGlsZDsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCwgZmFsc2UpOykKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbF9jaGlsZCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCXBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCwgZmFsc2UpOykKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfbmV3X2NoaWxkICE9IDApCisgICAgeworICAgICAgcF9uZXdfY2hpbGQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgICAgIHBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICAgIGlmIChwX25ld19jaGlsZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorCXBfbmV3X2NoaWxkLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25ld19jaGlsZDsKKyAgICAgIHBfbmV3X2NoaWxkLT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25ld19jaGlsZDsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCwgZmFsc2UpOykKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCwgZmFsc2UpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fbm9kZV9jaGlsZHJlbihub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IHBfbmQtPm1fcF9sX2NoaWxkOworICBpZiAocF9yZXQgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgd2hpbGUgKHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9yZXQgPSBmb3J3YXJkX2pvaW4ocF9yZXQsIHBfcmV0LT5tX3BfbmV4dF9zaWJsaW5nKTsKKyAgd2hpbGUgKHBfcmV0LT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gcF9uZCkKKyAgICBwX3JldCA9IGJhY2tfam9pbihwX3JldC0+bV9wX3ByZXZfb3JfcGFyZW50LCBwX3JldCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3JldCwgZmFsc2UpOykKKyAgcmV0dXJuIHBfcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZm9yd2FyZF9qb2luKG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9uZXh0KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPT0gcF9uZXh0KTsKKyAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShwX25kLT5tX3ZhbHVlLCBwX25leHQtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV4dCk7CisgICAgICByZXR1cm4gcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nID09IDAgCisJPyBwX25leHQgOiBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgfQorCisgIGlmIChwX25leHQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCkKKyAgICB7CisgICAgICBwX25leHQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisgICAgICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmV4dCwgcF9uZCk7CisgICAgICByZXR1cm4gcF9uZC0+bV9wX25leHRfc2libGluZzsKKyAgICB9CisKKyAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IDA7CisgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLCBmYWxzZSkpOworICByZXR1cm4gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JhY2tfam9pbihub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfbmV4dCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25leHQtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCk7CisKKyAgaWYgKENtcF9Gbjo6b3BlcmF0b3IoKShwX25kLT5tX3ZhbHVlLCBwX25leHQtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50OworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV4dCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25leHQsIGZhbHNlKSk7CisgICAgICByZXR1cm4gcF9uZXh0OworICAgIH0KKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gMDsKKyAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmV4dCwgcF9uZCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQsIGZhbHNlKSk7CisgIHJldHVybiBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICAgIHsKKyAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJcmV0dXJuIDA7CisgICAgICB9CisgIGJhc2VfdHlwZTo6dG9fbGlua2VkX2xpc3QoKTsKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gYmFzZV90eXBlOjpwcnVuZShwcmVkKTsKKyAgc2l6ZV90eXBlIGVyc2QgPSAwOworICB3aGlsZSAocF9vdXQgIT0gMCkKKyAgICB7CisgICAgICArK2Vyc2Q7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfb3V0KTsKKyAgICAgIHBfb3V0ID0gcF9uZXh0OworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gMDsKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgcF9jdXItPm1fcF9sX2NoaWxkID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmcgPSBwX2N1ci0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICAgICAgcHVzaF9pbXAocF9jdXIpOworICAgICAgcF9jdXIgPSBwX25leHQ7CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIGVyc2Q7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWZkNzAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZWZlcmVuY2UKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RvcCgpIGNvbnN0Cit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKworICByZXR1cm4gYmFzZV90eXBlOjptX3Bfcm9vdC0+bV92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTVmNWY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTAxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgbm9kZV9wb2ludGVyIHBfbmV3X25kID0gYmFzZV90eXBlOjpnZXRfbmV3X25vZGVfZm9yX2luc2VydChyX3ZhbCk7CisKKyAgcHVzaF9pbXAocF9uZXdfbmQpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKHBfbmV3X25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitwdXNoX2ltcChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworCisgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290ID09IDApCisgICAgeworICAgICAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSBwX25kOworICAgIH0KKyAgZWxzZSBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSBwX25kLT5tX3BfcHJldl9vcl9wYXJlbnQgPSAwOworCisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YoYmFzZV90eXBlOjptX3Bfcm9vdCwgcF9uZCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLCBmYWxzZSkpOworCisgICAgICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChiYXNlX3R5cGU6Om1fcF9yb290LCBmYWxzZSkpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICByZW1vdmVfbm9kZShpdC5tX3BfbmQpOworCisgIGl0Lm1fcF9uZC0+bV92YWx1ZSA9IHJfbmV3X3ZhbDsKKworICBwdXNoX2ltcChpdC5tX3BfbmQpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vcGFpcmluZ19oZWFwXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9wYWlyaW5nX2hlYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTliY2I2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vcGFpcmluZ19oZWFwXy5ocHAKQEAgLTAsMCArMSwyMTYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBhaXJpbmdfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYWlyaW5nIGhlYXAuCisgKi8KKworLyoKKyAqIFBhaXJpbmcgaGVhcDoKKyAqIE1pY2hhZWwgTC4gRnJlZG1hbiwgUm9iZXJ0IFNlZGdld2ljaywgRGFuaWVsIERvbWluaWMgU2xlYXRvciwKKyAqICAgIGFuZCBSb2JlcnQgRW5kcmUgVGFyamFuLCBUaGUgUGFpcmluZyBIZWFwOgorICogICAgQSBOZXcgRm9ybSBvZiBTZWxmLUFkanVzdGluZyBIZWFwLCBBbGdvcml0aG1pY2EsIDEoMSk6MTExLTEyOSwgMTk4Ni4KKyAqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9jb25kX2RlYWx0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9sZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXy9udWxsX21ldGFkYXRhLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHBhaXJpbmdfaGVhcF88VmFsdWVfVHlwZSwgQ21wX0ZuLCBBbGxvY2F0b3I+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXzwJCQlcCisJCQkJCQkJCQlWYWx1ZV9UeXBlLCBcCisJCQkJCQkJCQlDbXBfRm4sCVwKKwkJCQkJCQkJCW51bGxfbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF9ub2RlX21ldGFkYXRhLCBcCisJCQkJCQkJCQlBbGxvY2F0b3IsIFwKKwkJCQkJCQkJCWZhbHNlPgorI2Vsc2UgCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMJCQkJCQlcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF88CQkJXAorCQkJCQkJCQkJVmFsdWVfVHlwZSwgXAorCQkJCQkJCQkJQ21wX0ZuLAlcCisJCQkJCQkJCQludWxsX2xlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfbm9kZV9tZXRhZGF0YSwgXAorCQkJCQkJCQkJQWxsb2NhdG9yPgorI2VuZGlmIAorCisgICAgLyoqCisgICAgICogY2xhc3MgZGVzY3JpcHRpb24gPSAiUDRyaXxcfGcgaDNhcCQiPgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCBjbGFzcyBDbXBfRm4sIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBwYWlyaW5nX2hlYXBfIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgICB7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om5vZGVfcG9pbnRlciBub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6cG9pbnRfaXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6aXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIGNtcF9mbjsKKworICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisKKworICAgICAgcGFpcmluZ19oZWFwXygpOworCisgICAgICBwYWlyaW5nX2hlYXBfKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pOworCisgICAgICBwYWlyaW5nX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgfnBhaXJpbmdfaGVhcF8oKTsKKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHRvcCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2UocG9pbnRfaXRlcmF0b3IgaXQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZV9pZihQcmVkIHByZWQpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgdm9pZAorICAgICAgc3BsaXQoUHJlZCBwcmVkLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHB1c2hfaW1wKG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICBqb2luX25vZGVfY2hpbGRyZW4obm9kZV9wb2ludGVyIHBfbmQpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIGZvcndhcmRfam9pbihub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfbmV4dCk7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgYmFja19qb2luKG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9uZXh0KTsKKworICAgICAgdm9pZAorICAgICAgcmVtb3ZlX25vZGUobm9kZV9wb2ludGVyIHBfbmQpOworCisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGFpcmluZ19oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQkFTRV9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2MTM4YwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYWlyaW5nX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGl0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhaXJpbmcgaGVhcC4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0KFByZWQgcHJlZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKworICAgIG90aGVyLmNsZWFyKCk7CisKKyAgaWYgKGJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICBiYXNlX3R5cGU6OnRvX2xpbmtlZF9saXN0KCk7CisKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gYmFzZV90eXBlOjpwcnVuZShwcmVkKTsKKworICB3aGlsZSAocF9vdXQgIT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3NpemUgPiAwKTsKKyAgICAgIC0tYmFzZV90eXBlOjptX3NpemU7CisKKyAgICAgICsrb3RoZXIubV9zaXplOworCisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIHBfb3V0LT5tX3BfbF9jaGlsZCA9IHBfb3V0LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9vdXQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIG90aGVyLnB1c2hfaW1wKHBfb3V0KTsKKworICAgICAgcF9vdXQgPSBwX25leHQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgbm9kZV9wb2ludGVyIHBfY3VyID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gMDsKKworICB3aGlsZSAocF9jdXIgIT0gMCkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9jdXItPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIHBfY3VyLT5tX3BfbF9jaGlsZCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9jdXItPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgICAgIHB1c2hfaW1wKHBfY3VyKTsKKworICAgICAgcF9jdXIgPSBwX25leHQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisKKyAgICBpZiAob3RoZXIubV9wX3Jvb3QgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKworCSAgcmV0dXJuOworICAgICAgfQorCisgIGlmIChiYXNlX3R5cGU6Om1fcF9yb290ID09IDApCisgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IG90aGVyLm1fcF9yb290OworICBlbHNlIGlmIChDbXBfRm46Om9wZXJhdG9yKCkoYmFzZV90eXBlOjptX3Bfcm9vdC0+bV92YWx1ZSwgb3RoZXIubV9wX3Jvb3QtPm1fdmFsdWUpKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihiYXNlX3R5cGU6Om1fcF9yb290LCBvdGhlci5tX3Bfcm9vdCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChvdGhlci5tX3Bfcm9vdCwgZmFsc2UpKTsKKworICAgICAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IG90aGVyLm1fcF9yb290OworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihvdGhlci5tX3Bfcm9vdCwgYmFzZV90eXBlOjptX3Bfcm9vdCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChiYXNlX3R5cGU6Om1fcF9yb290LCBmYWxzZSkpOworICAgIH0KKworICBiYXNlX3R5cGU6Om1fc2l6ZSArPSBvdGhlci5tX3NpemU7CisKKyAgb3RoZXIubV9wX3Jvb3QgPSAwOworICBvdGhlci5tX3NpemUgPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jaGlsZF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NoaWxkX2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2NkZjIzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jaGlsZF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSw5MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY2hpbGRfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhIGl0ZXJhdG9yIGZvciBhIHBhdHJpY2lhIHRyZWUuCisgKi8KKworc3RydWN0IGl0ZXJhdG9yIDogcHVibGljIGNvbnN0X2l0ZXJhdG9yCit7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgbm9kZV9wb2ludGVyIHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgbm9kZV9wb2ludGVyX3BvaW50ZXIgcG9pbnRlcjsKKyAgdHlwZWRlZiBub2RlX3BvaW50ZXJfcmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICBpbmxpbmUKKyAgaXRlcmF0b3Iobm9kZV9wb2ludGVyX3BvaW50ZXIgcF9wX2N1ciA9IDAsICAKKwkgICBub2RlX3BvaW50ZXJfcG9pbnRlciBwX3BfZW5kID0gMCkgCisgIDogY29uc3RfaXRlcmF0b3IocF9wX2N1ciwgcF9wX2VuZCkKKyAgeyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXIgPT0gb3RoZXIubV9wX3BfY3VyOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXIgIT0gb3RoZXIubV9wX3BfY3VyOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yJiAKKyAgb3BlcmF0b3IrKygpCisgIHsKKyAgICBjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcgorICBvcGVyYXRvcisrKGludCkKKyAgeworICAgIGl0ZXJhdG9yIHJldF9pdCgqdGhpcyk7CisgICAgb3BlcmF0b3IrKygpOworICAgIHJldHVybiByZXRfaXQ7CisgIH0KKworICBub2RlX3BvaW50ZXJfcG9pbnRlcgorICBvcGVyYXRvci0+KCkKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoY29uc3RfaXRlcmF0b3I6OmFzc2VydF9yZWZlcmVuY2libGUoKTspCisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjptX3BfcF9jdXI7CisgIH0KKworICBub2RlX3BvaW50ZXIKKyAgb3BlcmF0b3IqKCkKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoY29uc3RfaXRlcmF0b3I6OmFzc2VydF9yZWZlcmVuY2libGUoKTspCisgICAgcmV0dXJuICpjb25zdF9pdGVyYXRvcjo6bV9wX3BfY3VyOworICB9Cit9OworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NvbmRfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uZF9kdG9yX2VudHJ5X2RlYWx0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGI5ODYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NvbmRfZHRvcl9lbnRyeV9kZWFsdG9yLmhwcApAQCAtMCwwICsxLDc5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25kX2R0b3JfZW50cnlfZGVhbHRvci5ocHAKKyAqIENvbnRhaW5zIGEgYmluYXJ5IHRyZWUgY29udGFpbmVyIGNvbmRpdGlvbmFsIGRlYWxsb2NhdG9yCisgKi8KKworY2xhc3MgY29uZF9kZWFsdG9yCit7CitwdWJsaWM6CisgIGlubGluZQorICBjb25kX2RlYWx0b3IobGVhZl9wb2ludGVyIHBfbmQpIDogbV9wX25kKHBfbmQpLAorCQkJCSAgICBtX25vX2FjdGlvbl9kdG9yKGZhbHNlKSwKKwkJCQkgICAgbV9jYWxsX2Rlc3RydWN0b3IoZmFsc2UpCisgIHsgfQorCisgIGlubGluZSB2b2lkCisgIHNldF9ub19hY3Rpb25fZHRvcigpCisgIHsKKyAgICBtX25vX2FjdGlvbl9kdG9yID0gdHJ1ZTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIHNldF9jYWxsX2Rlc3RydWN0b3IoKQorICB7CisgICAgbV9jYWxsX2Rlc3RydWN0b3IgPSB0cnVlOworICB9CisKKyAgaW5saW5lCisgIH5jb25kX2RlYWx0b3IoKQorICB7CisgICAgaWYgKG1fbm9fYWN0aW9uX2R0b3IpCisgICAgICByZXR1cm47CisKKyAgICBpZiAobV9jYWxsX2Rlc3RydWN0b3IpCisgICAgICBtX3BfbmQtPn5sZWFmKCk7CisKKyAgICBzX2xlYWZfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX25kLCAxKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGxlYWZfcG9pbnRlciBtX3BfbmQ7CisgIGJvb2wgbV9ub19hY3Rpb25fZHRvcjsKKyAgYm9vbCBtX2NhbGxfZGVzdHJ1Y3RvcjsKK307CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RfY2hpbGRfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jb25zdF9jaGlsZF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwMTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RfY2hpbGRfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTExIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdF9jaGlsZF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGEgY29uc3RfaXRlcmF0b3IgZm9yIGEgcGF0cmljaWEgdHJlZS4KKyAqLworCitzdHJ1Y3QgY29uc3RfaXRlcmF0b3IKK3sKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIHR5cGVkZWYgbm9kZV9wb2ludGVyIHZhbHVlX3R5cGU7CisKKyAgdHlwZWRlZiBub2RlX3BvaW50ZXJfcG9pbnRlciBwb2ludGVyOworCisgIHR5cGVkZWYgbm9kZV9wb2ludGVyX3JlZmVyZW5jZSByZWZlcmVuY2U7CisKK3B1YmxpYzoKKyAgaW5saW5lCisgIGNvbnN0X2l0ZXJhdG9yKG5vZGVfcG9pbnRlcl9wb2ludGVyIHBfcF9jdXIgPSAwLCAgCisJCSBub2RlX3BvaW50ZXJfcG9pbnRlciBwX3BfZW5kID0gMCkgCisgIDogbV9wX3BfY3VyKHBfcF9jdXIpLCBtX3BfcF9lbmQocF9wX2VuZCkKKyAgeyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBjb25zdF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0CisgIHsgcmV0dXJuIG1fcF9wX2N1ciA9PSBvdGhlci5tX3BfcF9jdXI7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3QKKyAgeyByZXR1cm4gbV9wX3BfY3VyICE9IG90aGVyLm1fcF9wX2N1cjsgfQorCisgIGlubGluZSBjb25zdF9pdGVyYXRvciYgCisgIG9wZXJhdG9yKysoKQorICB7CisgICAgZG8KKyAgICAgICsrbV9wX3BfY3VyOworICAgIHdoaWxlIChtX3BfcF9jdXIgIT0gbV9wX3BfZW5kJiYgKiBtX3BfcF9jdXIgPT0gMCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgIG9wZXJhdG9yKysoaW50KQorICB7CisgICAgY29uc3RfaXRlcmF0b3IgcmV0X2l0KCp0aGlzKTsKKyAgICBvcGVyYXRvcisrKCk7CisgICAgcmV0dXJuIHJldF9pdDsKKyAgfQorCisgIGNvbnN0IG5vZGVfcG9pbnRlcl9wb2ludGVyCisgIG9wZXJhdG9yLT4oKSBjb25zdAorICB7CisgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfcmVmZXJlbmNpYmxlKCk7KQorICAgIHJldHVybiAobV9wX3BfY3VyKTsKKyAgfQorCisgIGNvbnN0X25vZGVfcG9pbnRlcgorICBvcGVyYXRvciooKSBjb25zdAorICB7CisgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfcmVmZXJlbmNpYmxlKCk7KQorICAgIHJldHVybiAoKm1fcF9wX2N1cik7CisgIH0KKworcHJvdGVjdGVkOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIHZvaWQKKyAgYXNzZXJ0X3JlZmVyZW5jaWJsZSgpIGNvbnN0CisgIHsgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9wX2N1ciAhPSBtX3BfcF9lbmQmJiAqIG1fcF9wX2N1ciAhPSAwKTsgfQorI2VuZGlmIAorCitwdWJsaWM6CisgIG5vZGVfcG9pbnRlcl9wb2ludGVyIG1fcF9wX2N1cjsKKyAgbm9kZV9wb2ludGVyX3BvaW50ZXIgbV9wX3BfZW5kOworfTsKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmN2M1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyMTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpoZWFkX2FsbG9jYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OnNfaGVhZF9hbGxvY2F0b3I7CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aW50ZXJuYWxfbm9kZV9hbGxvY2F0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjpzX2ludGVybmFsX25vZGVfYWxsb2NhdG9yOworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfYWxsb2NhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6c19sZWFmX2FsbG9jYXRvcjsKKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoKSA6CisgIG1fcF9oZWFkKHNfaGVhZF9hbGxvY2F0b3IuYWxsb2NhdGUoMSkpLAorICBtX3NpemUoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgZV9hY2Nlc3NfdHJhaXRzJiByX2VfYWNjZXNzX3RyYWl0cykgOgorICBzeW50aF9lX2FjY2Vzc190cmFpdHMocl9lX2FjY2Vzc190cmFpdHMpLAorICBtX3BfaGVhZChzX2hlYWRfYWxsb2NhdG9yLmFsbG9jYXRlKDEpKSwKKyAgbV9zaXplKDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOgorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGRlYnVnX2Jhc2Uob3RoZXIpLAorI2VuZGlmCisgIHN5bnRoX2VfYWNjZXNzX3RyYWl0cyhvdGhlciksCisgIG5vZGVfdXBkYXRlKG90aGVyKSwKKyAgbV9wX2hlYWQoc19oZWFkX2FsbG9jYXRvci5hbGxvY2F0ZSgxKSksCisgIG1fc2l6ZSgwKQoreworICBpbml0aWFsaXplKCk7CisgIG1fc2l6ZSA9IG90aGVyLm1fc2l6ZTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgaWYgKG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJcmV0dXJuOworICAgICAgfQorICBfX3RyeQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcmVjdXJzaXZlX2NvcHlfbm9kZShvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBzX2hlYWRfYWxsb2NhdG9yLmRlYWxsb2NhdGUobV9wX2hlYWQsIDEpOworICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgfQorCisgIG1fcF9oZWFkLT5tX3BfbWluID0gbGVmdG1vc3RfZGVzY2VuZGFudChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIG1fcF9oZWFkLT5tX3BfbWF4ID0gcmlnaHRtb3N0X2Rlc2NlbmRhbnQobV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgIHZhbHVlX3N3YXAob3RoZXIpOworICBzdGQ6OnN3YXAoKGVfYWNjZXNzX3RyYWl0cyYgKSgqdGhpcyksIChlX2FjY2Vzc190cmFpdHMmIClvdGhlcik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OnN3YXAob3RoZXIpOykKKyAgc3RkOjpzd2FwKG1fcF9oZWFkLCBvdGhlci5tX3BfaGVhZCk7CisgIHN0ZDo6c3dhcChtX3NpemUsIG90aGVyLm1fc2l6ZSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+UEJfRFNfQ0xBU1NfTkFNRSgpCit7CisgIGNsZWFyKCk7CisgIHNfaGVhZF9hbGxvY2F0b3IuZGVhbGxvY2F0ZShtX3BfaGVhZCwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplKCkKK3sKKyAgbmV3IChtX3BfaGVhZCkgaGVhZCgpOworICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IDA7CisgIG1fcF9oZWFkLT5tX3BfbWluID0gbV9wX2hlYWQ7CisgIG1fcF9oZWFkLT5tX3BfbWF4ID0gbV9wX2hlYWQ7CisgIG1fc2l6ZSA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgaW5zZXJ0KCooZmlyc3RfaXQrKykpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjdXJzaXZlX2NvcHlfbm9kZShjb25zdF9ub2RlX3BvaW50ZXIgcF9vdGhlcl9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfb3RoZXJfbmQgIT0gMCk7CisgIGlmIChwX290aGVyX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgeworICAgICAgY29uc3RfbGVhZl9wb2ludGVyIHBfb3RoZXJfbGVhZiA9IHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4ocF9vdGhlcl9uZCk7CisKKyAgICAgIGxlYWZfcG9pbnRlciBwX25ld19sZiA9IHNfbGVhZl9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgICAgICBjb25kX2RlYWx0b3IgY29uZChwX25ld19sZik7CisgICAgICBuZXcgKHBfbmV3X2xmKSBsZWFmKHBfb3RoZXJfbGVhZi0+dmFsdWUoKSk7CisgICAgICBhcHBseV91cGRhdGUocF9uZXdfbGYsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICAgICAgY29uZC5zZXRfbm9fYWN0aW9uX2R0b3IoKTsKKyAgICAgIHJldHVybiAocF9uZXdfbGYpOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9vdGhlcl9uZC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgIG5vZGVfcG9pbnRlciBhX3BfY2hpbGRyZW5baW50ZXJuYWxfbm9kZTo6YXJyX3NpemVdOworICBzaXplX3R5cGUgY2hpbGRfaSA9IDA7CisgIGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlciBwX290aGVyX2ludGVybmFsX25kID0KKyAgICBzdGF0aWNfY2FzdDxjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfb3RoZXJfbmQpOworCisgIHR5cGVuYW1lIGludGVybmFsX25vZGU6OmNvbnN0X2l0ZXJhdG9yIGNoaWxkX2l0ID0KKyAgICBwX290aGVyX2ludGVybmFsX25kLT5iZWdpbigpOworCisgIGludGVybmFsX25vZGVfcG9pbnRlciBwX3JldDsKKyAgX190cnkKKyAgICB7CisgICAgICB3aGlsZSAoY2hpbGRfaXQgIT0gcF9vdGhlcl9pbnRlcm5hbF9uZC0+ZW5kKCkpCisJYV9wX2NoaWxkcmVuW2NoaWxkX2krK10gPSByZWN1cnNpdmVfY29weV9ub2RlKCooY2hpbGRfaXQrKykpOworICAgICAgcF9yZXQgPSBzX2ludGVybmFsX25vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICAgIH0KKyAgX19jYXRjaCguLi4pCisgICAgeworICAgICAgd2hpbGUgKGNoaWxkX2ktLSA+IDApCisJY2xlYXJfaW1wKGFfcF9jaGlsZHJlbltjaGlsZF9pXSk7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9CisKKyAgbmV3IChwX3JldCkgaW50ZXJuYWxfbm9kZShwX290aGVyX2ludGVybmFsX25kLT5nZXRfZV9pbmQoKSwKKwkJCSAgICBwcmVmX2JlZ2luKGFfcF9jaGlsZHJlblswXSkpOworCisgIC0tY2hpbGRfaTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGNoaWxkX2kgPj0gMSk7CisgIGRvCisgICAgcF9yZXQtPmFkZF9jaGlsZChhX3BfY2hpbGRyZW5bY2hpbGRfaV0sIHByZWZfYmVnaW4oYV9wX2NoaWxkcmVuW2NoaWxkX2ldKSwKKwkJICAgICBwcmVmX2VuZChhX3BfY2hpbGRyZW5bY2hpbGRfaV0pLCB0aGlzKTsKKyAgd2hpbGUgKGNoaWxkX2ktLSA+IDApOworICBhcHBseV91cGRhdGUocF9yZXQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICByZXR1cm4gcF9yZXQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTRkYTBhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZGVidWdfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZV8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoKSBjb25zdAoreworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+YXNzZXJ0X3ZhbGlkKHRoaXMpOworICBhc3NlcnRfaXRlcmF0b3JzKCk7CisgIGFzc2VydF9yZXZlcnNlX2l0ZXJhdG9ycygpOworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX2hlYWQtPm1fcF9taW4gPT0gbV9wX2hlYWQpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfbWF4ID09IG1fcF9oZWFkKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChlbXB0eSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfbWluLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX2hlYWQtPm1fcF9tYXgtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghZW1wdHkoKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfaXRlcmF0b3JzKCkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGNhbGNfc2l6ZSA9IDA7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBiZWdpbigpOyBpdCAhPSBlbmQoKTsgKytpdCkKKyAgICB7CisgICAgICArK2NhbGNfc2l6ZTsKKyAgICAgIGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMoUEJfRFNfVjJGKCppdCkpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGxvd2VyX2JvdW5kKFBCX0RTX1YyRigqaXQpKSA9PSBpdCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoLS11cHBlcl9ib3VuZChQQl9EU19WMkYoKml0KSkgPT0gaXQpOworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGNhbGNfc2l6ZSA9PSBtX3NpemUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3JldmVyc2VfaXRlcmF0b3JzKCkgY29uc3QKK3sKKyAgc2l6ZV90eXBlIGNhbGNfc2l6ZSA9IDA7CisgIGZvciAoY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdCA9IHJiZWdpbigpOyBpdCAhPSByZW5kKCk7ICsraXQpCisgICAgeworICAgICAgKytjYWxjX3NpemU7CisgICAgICBjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCA9CisJY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+ZmluZF9pbXAoUEJfRFNfVjJGKCppdCkpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgPT0gaXQubV9wX25kKTsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChjYWxjX3NpemUgPT0gbV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY3Vyc2l2ZV9jb3VudF9sZWFmcyhjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gKDApOworICBpZiAocF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgIHJldHVybiAoMSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgc2l6ZV90eXBlIHJldCA9IDA7CisgIGZvciAodHlwZW5hbWUgaW50ZXJuYWxfbm9kZTo6Y29uc3RfaXRlcmF0b3IgaXQgPQorCSBzdGF0aWNfY2FzdDxjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5iZWdpbigpOworICAgICAgIGl0ICE9IHN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCktPmVuZCgpOworICAgICAgICsraXQpCisgICAgcmV0ICs9IHJlY3Vyc2l2ZV9jb3VudF9sZWFmcygqaXQpOworICByZXR1cm4gcmV0OworfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2M4YjkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMzE5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IGZpbmRfaW1wKHJfa2V5KTsKKyAgaWYgKHBfbmQgPT0gMCB8fCBwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpOworICBpZiAoIXN5bnRoX2VfYWNjZXNzX3RyYWl0czo6ZXF1YWxfa2V5cyhQQl9EU19WMkYocmVpbnRlcnByZXRfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSwgcl9rZXkpKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2V4aXN0cyhyX2tleSkpOworICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCkpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9maXh1cChpbnRlcm5hbF9ub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHN0ZDo6ZGlzdGFuY2UocF9uZC0+YmVnaW4oKSwgcF9uZC0+ZW5kKCkpID49IDEpOworICBpZiAoc3RkOjpkaXN0YW5jZShwX25kLT5iZWdpbigpLCBwX25kLT5lbmQoKSkgPT0gMSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworICAgICAgaWYgKHBfcGFyZW50ID09IG1fcF9oZWFkKQorCW1fcF9oZWFkLT5tX3BfcGFyZW50ID0qIHBfbmQtPmJlZ2luKCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisJICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSogcF9uZC0+YmVnaW4oKTsKKwkgIHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4ocF9wYXJlbnQpLT5yZXBsYWNlX2NoaWxkKAorCQkJCQkJCQkgICAgICBwX25ld19jaGlsZCwKKwkJCQkJCQkJICAgICAgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkJCQkJCSAgICAgIHByZWZfZW5kKHBfbmV3X2NoaWxkKSwKKwkJCQkJCQkJICAgICAgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICgqcF9uZC0+YmVnaW4oKSktPm1fcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworICAgICAgcF9uZC0+fmludGVybmFsX25vZGUoKTsKKyAgICAgIHNfaW50ZXJuYWxfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX25kLCAxKTsKKworICAgICAgaWYgKHBfcGFyZW50ID09IG1fcF9oZWFkKQorCXJldHVybjsKKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgICAgIHBfbmQgPSBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfcGFyZW50KTsKKyAgICB9CisKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHN0ZDo6ZGlzdGFuY2UocF9uZC0+YmVnaW4oKSwgcF9uZC0+ZW5kKCkpID4gMSk7CisgICAgICBwX25kLT51cGRhdGVfcHJlZml4ZXModGhpcyk7CisgICAgICBhcHBseV91cGRhdGUocF9uZCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfbmQtPmFzc2VydF92YWxpZCh0aGlzKTspCisgICAgICBpZiAocF9uZC0+bV9wX3BhcmVudC0+bV90eXBlID09IHBhdF90cmllX2hlYWRfbm9kZV90eXBlKQorICAgICAgICByZXR1cm47CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfcGFyZW50LT5tX3R5cGUgPT0KKwkJICAgICAgIHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisKKyAgICAgIHBfbmQgPSBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQtPm1fcF9wYXJlbnQpOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithY3R1YWxfZXJhc2VfbGVhZihsZWFmX3BvaW50ZXIgcF9sKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9zaXplID4gMCk7CisgIC0tbV9zaXplOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGVyYXNlX2V4aXN0aW5nKFBCX0RTX1YyRihwX2wtPnZhbHVlKCkpKSk7CisgIHBfbC0+fmxlYWYoKTsKKyAgc19sZWFmX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbCwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgY2xlYXJfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9zaXplID0gMDsKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyX2ltcChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpOworICAgICAgZm9yICh0eXBlbmFtZSBpbnRlcm5hbF9ub2RlOjppdGVyYXRvciBpdCA9CisJICAgICBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5iZWdpbigpOworCSAgIGl0ICE9IHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCktPmVuZCgpOworCSAgICsraXQpCisgICAgICAgIHsKKwkgIG5vZGVfcG9pbnRlciBwX2NoaWxkID0qIGl0OworCSAgY2xlYXJfaW1wKHBfY2hpbGQpOworICAgICAgICB9CisgICAgICBzX2ludGVybmFsX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUoc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX25kKSwgMSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpOworICBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpLT5+bGVhZigpOworICBzX2xlYWZfYWxsb2NhdG9yLmRlYWxsb2NhdGUoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKSwgMSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9pdGVyYXRvciBpdCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisKKyAgaWYgKGl0ID09IGVuZCgpKQorICAgIHJldHVybiBpdDsKKworICBjb25zdF9pdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpdC5tX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSk7CisgIGVyYXNlX2xlYWYoc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihpdC5tX3BfbmQpKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIHJldHVybiByZXRfaXQ7Cit9CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UoaXRlcmF0b3IgaXQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworCisgIGlmIChpdCA9PSBlbmQoKSkKKyAgICByZXR1cm4gaXQ7CisgIGl0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGl0Lm1fcF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKTsKKyAgZXJhc2VfbGVhZihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KGl0Lm1fcF9uZCkpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgcmV0dXJuIHJldF9pdDsKK30KKyNlbmRpZiAvLyAjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKworICBpZiAoaXQubV9wX25kID09IG1fcF9oZWFkKQorICAgIHJldHVybiBpdDsKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGl0Lm1fcF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKTsKKyAgZXJhc2VfbGVhZihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KGl0Lm1fcF9uZCkpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgcmV0dXJuIHJldF9pdDsKK30KKworI2lmZGVmIFBCX0RTX0RBVEFfVFJVRV9JTkRJQ0FUT1IKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHJldmVyc2VfaXRlcmF0b3IgaXQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworCisgIGlmIChpdC5tX3BfbmQgPT0gbV9wX2hlYWQpCisgICAgcmV0dXJuIGl0OworICByZXZlcnNlX2l0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXQubV9wX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpOworICBlcmFzZV9sZWFmKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oaXQubV9wX25kKSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICByZXR1cm4gcmV0X2l0OworfQorI2VuZGlmIC8vICNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgc2l6ZV90eXBlIG51bV9lcnNkID0gMDsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgaXRlcmF0b3IgaXQgPSBiZWdpbigpOworICB3aGlsZSAoaXQgIT0gZW5kKCkpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICAgIGlmIChwcmVkKCppdCkpCisJICB7CisgICAgICAgICAgICArK251bV9lcnNkOworICAgICAgICAgICAgaXQgPSBlcmFzZShpdCk7CisJICB9CisgICAgICAgIGVsc2UKKwkgICsraXQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICByZXR1cm4gbnVtX2Vyc2Q7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9sZWFmKGxlYWZfcG9pbnRlciBwX2wpCit7CisgIHVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbGVhZihwX2wpOworICBpZiAocF9sLT5tX3BfcGFyZW50LT5tX3R5cGUgPT0gcGF0X3RyaWVfaGVhZF9ub2RlX3R5cGUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHNpemUoKSA9PSAxKTsKKyAgICAgIGNsZWFyKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChzaXplKCkgPiAxKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbC0+bV9wX3BhcmVudC0+bV90eXBlID09CisJCSAgIHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisKKyAgaW50ZXJuYWxfbm9kZV9wb2ludGVyIHBfcGFyZW50ID0KKyAgICBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbC0+bV9wX3BhcmVudCk7CisKKyAgcF9wYXJlbnQtPnJlbW92ZV9jaGlsZChwX2wpOworICBlcmFzZV9maXh1cChwX3BhcmVudCk7CisgIGFjdHVhbF9lcmFzZV9sZWFmKHBfbCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfbWluX21heF9mb3JfZXJhc2VkX2xlYWYobGVhZl9wb2ludGVyIHBfbCkKK3sKKyAgaWYgKG1fc2l6ZSA9PSAxKQorICAgIHsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbWluID0gbV9wX2hlYWQ7CisgICAgICBtX3BfaGVhZC0+bV9wX21heCA9IG1fcF9oZWFkOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAocF9sID09IHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9taW4pKQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfbCk7CisgICAgICArK2l0OworICAgICAgbV9wX2hlYWQtPm1fcF9taW4gPSBpdC5tX3BfbmQ7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX2wgPT0gc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPihtX3BfaGVhZC0+bV9wX21heCkpCisgICAgeworICAgICAgaXRlcmF0b3IgaXQocF9sKTsKKyAgICAgIC0taXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX21heCA9IGl0Lm1fcF9uZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ZpbmRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjM2JmMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI2OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIG5vZGVfcG9pbnRlciBwX25kID0gZmluZF9pbXAocl9rZXkpOworCisgIGlmIChwX25kID09IDAgfHwgcF9uZC0+bV90eXBlICE9IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTspCisgICAgICByZXR1cm4gZW5kKCk7CisgICAgfQorCisgIGlmIChzeW50aF9lX2FjY2Vzc190cmFpdHM6OmVxdWFsX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCktPnZhbHVlKCkpLCByX2tleSkpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKHJfa2V5KSk7CisgICAgICByZXR1cm4gaXRlcmF0b3IocF9uZCk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KHJfa2V5KTspCisgIHJldHVybiBlbmQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQgPSBjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5maW5kX2ltcChyX2tleSk7CisKKyAgaWYgKHBfbmQgPT0gMCB8fCBwX25kLT5tX3R5cGUgIT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZG9lc19ub3RfZXhpc3Qocl9rZXkpOykKKyAgICAgIHJldHVybiBlbmQoKTsKKyAgICB9CisKKyAgaWYgKHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6ZXF1YWxfa2V5cyhQQl9EU19WMkYoc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPihwX25kKS0+dmFsdWUoKSksIHJfa2V5KSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9leGlzdHMocl9rZXkpKTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihjb25zdF9jYXN0PG5vZGVfcG9pbnRlcj4ocF9uZCkpOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNoZWNrX2tleV9kb2VzX25vdF9leGlzdChyX2tleSk7KQorICByZXR1cm4gZW5kKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgaWYgKGVtcHR5KCkpCisgICAgcmV0dXJuICgwKTsKKworICB0eXBlbmFtZSBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGJfaXQgPQorICAgIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6YmVnaW4ocl9rZXkpOworICB0eXBlbmFtZSBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVfaXQgPQorICAgIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6ZW5kKHJfa2V5KTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IG1fcF9oZWFkLT5tX3BfcGFyZW50OworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKworICB3aGlsZSAocF9uZC0+bV90eXBlICE9IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHRfbmQgPSBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5nZXRfY2hpbGRfbm9kZShiX2l0LCAgZV9pdCwgIHRoaXMpOworCisgICAgICBpZiAocF9uZXh0X25kID09IDApCisJcmV0dXJuIHBfbmQ7CisgICAgICBwX25kID0gcF9uZXh0X25kOworICAgIH0KKyAgcmV0dXJuIHBfbmQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbG93ZXJfYm91bmRfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIGlmIChlbXB0eSgpKQorICAgIHJldHVybiAobV9wX2hlYWQpOworCisgIG5vZGVfcG9pbnRlciBwX25kID0gbV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9lX2l0ZXJhdG9yIGJfaXQgPQorICAgIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6YmVnaW4ocl9rZXkpOworCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9lX2l0ZXJhdG9yIGVfaXQgPQorICAgIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6ZW5kKHJfa2V5KTsKKworICBzaXplX3R5cGUgY2hlY2tlZF9pbmQgPSAwOworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBpZiAocF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgICAgICB7CisJICBpZiAoIXN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4ocF9uZCktPnZhbHVlKCkpLCByX2tleSkpCisJICAgIHJldHVybiBwX25kOworCSAgaXRlcmF0b3IgaXQocF9uZCk7CisJICArK2l0OworCSAgcmV0dXJuIGl0Lm1fcF9uZDsKKyAgICAgICAgfQorCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgICAgICBjb25zdCBzaXplX3R5cGUgbmV3X2NoZWNrZWRfaW5kID0KKwlzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5nZXRfZV9pbmQoKTsKKworICAgICAgcF9uZCA9CisJc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX25kKS0+Z2V0X2xvd2VyX2JvdW5kX2NoaWxkX25vZGUoICAgICAgICAgICAgICAgIGJfaXQsIGVfaXQsIGNoZWNrZWRfaW5kLCB0aGlzKTsKKyAgICAgIGNoZWNrZWRfaW5kID0gbmV3X2NoZWNrZWRfaW5kOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xvd2VyX2JvdW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCit7IHJldHVybiBwb2ludF9pdGVyYXRvcihsb3dlcl9ib3VuZF9pbXAocl9rZXkpKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbG93ZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgcmV0dXJuIGNvbnN0X3BvaW50X2l0ZXJhdG9yKGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmxvd2VyX2JvdW5kX2ltcChyX2tleSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpwb2ludF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBwZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcG9pbnRfaXRlcmF0b3IgbF9ib3VuZF9pdCA9IGxvd2VyX2JvdW5kKHJfa2V5KTsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobF9ib3VuZF9pdCA9PSBlbmQoKSB8fAorCQkgICAhc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhQQl9EU19WMkYoKmxfYm91bmRfaXQpLAorCQkJCQkJICAgIHJfa2V5KSk7CisKKyAgaWYgKGxfYm91bmRfaXQgPT0gZW5kKCkgfHwKKyAgICAgIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMocl9rZXksIFBCX0RTX1YyRigqbF9ib3VuZF9pdCkpKQorICAgIHJldHVybiBsX2JvdW5kX2l0OworCisgIHJldHVybiArK2xfYm91bmRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3BvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cHBlcl9ib3VuZChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBjb25zdF9wb2ludF9pdGVyYXRvciBsX2JvdW5kX2l0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsX2JvdW5kX2l0ID09IGVuZCgpIHx8CisJCSAgICFzeW50aF9lX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKFBCX0RTX1YyRigqbF9ib3VuZF9pdCksCisJCQkJCQkgICAgcl9rZXkpKTsKKworICBpZiAobF9ib3VuZF9pdCA9PSBlbmQoKSB8fAorICAgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhyX2tleSwgUEJfRFNfVjJGKCpsX2JvdW5kX2l0KSkpCisgICAgcmV0dXJuIGxfYm91bmRfaXQ7CisgIHJldHVybiArK2xfYm91bmRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ByZWZfYmVnaW4oY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgcmV0dXJuIChzeW50aF9lX2FjY2Vzc190cmFpdHM6OmJlZ2luKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCktPnByZWZfYl9pdCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9lX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwcmVmX2VuZChjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKyAgICByZXR1cm4gKHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6ZW5kKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKSkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCktPnByZWZfZV9pdCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9sZWFmX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2xlZnRtb3N0X2Rlc2NlbmRhbnQoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4ocF9uZCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGVmdG1vc3RfZGVzY2VuZGFudChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCktPmxlZnRtb3N0X2Rlc2NlbmRhbnQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfbGVhZl9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityaWdodG1vc3RfZGVzY2VuZGFudChjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPihwX25kKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCktPnJpZ2h0bW9zdF9kZXNjZW5kYW50KCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmlnaHRtb3N0X2Rlc2NlbmRhbnQobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9uZCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2hlYWQuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9oZWFkLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzczODEyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9oZWFkLmhwcApAQCAtMCwwICsxLDEyNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGVhZC5ocHAKKyAqIENvbnRhaW5zIGEgbGVhZiBmb3IgYSBwYXRyaWNpYSB0cmVlLgorICovCisKKyNpZm5kZWYgUEJfRFNfUEFUX1RSSUVfSUhFQURfSFBQCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX0lIRUFEX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbm9kZV9iYXNlLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVfVHJhaXRzLCB0eXBlbmFtZSBFX0FjY2Vzc19UcmFpdHMsCVwKKwkgICAgICB0eXBlbmFtZSBNZXRhZGF0YSwgdHlwZW5hbWUgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBwYXRfdHJpZV9oZWFkPFR5cGVfVHJhaXRzLCBFX0FjY2Vzc19UcmFpdHMsCU1ldGFkYXRhLCBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQyBcCisgICAgcGF0X3RyaWVfbm9kZV9iYXNlPFR5cGVfVHJhaXRzLCBFX0FjY2Vzc19UcmFpdHMsIE1ldGFkYXRhLCBBbGxvY2F0b3I+CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlX1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIEVfQWNjZXNzX1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIE1ldGFkYXRhLAorCSAgICAgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBwYXRfdHJpZV9oZWFkIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgRV9BY2Nlc3NfVHJhaXRzIGVfYWNjZXNzX3RyYWl0czsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJZV9hY2Nlc3NfdHJhaXRzPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlQQl9EU19CQVNFX0NfREVDPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjpzdWJ0cmVlX2RlYnVnX2luZm8KKyAgICAgIHN1YnRyZWVfZGVidWdfaW5mbzsKKyNlbmRpZiAKKworICAgIHB1YmxpYzoKKyAgICAgIHBhdF90cmllX2hlYWQoKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2aXJ0dWFsIHN1YnRyZWVfZGVidWdfaW5mbworICAgICAgYXNzZXJ0X3ZhbGlkX2ltcChjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykgY29uc3Q7CisjZW5kaWYgCisKKyAgICBwdWJsaWM6CisgICAgICBub2RlX3BvaW50ZXIgbV9wX21pbjsKKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9tYXg7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHBhdF90cmllX2hlYWQoKSA6IFBCX0RTX0JBU0VfQ19ERUMocGF0X3RyaWVfaGVhZF9ub2RlX3R5cGUpCisgICAgeyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnN1YnRyZWVfZGVidWdfaW5mbworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBhc3NlcnRfdmFsaWRfaW1wKGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyIC8qcF90cmFpdHMqLykgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoZmFsc2UpOworICAgICAgcmV0dXJuIHN1YnRyZWVfZGVidWdfaW5mbygpOworICAgIH0KKyNlbmRpZiAKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19CQVNFX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkNzA5NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYmluX3NlYXJjaF90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VtcHR5KCkgY29uc3QKK3sgcmV0dXJuIChtX3NpemUgPT0gMCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitzaXplKCkgY29uc3QKK3sgcmV0dXJuIG1fc2l6ZTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21heF9zaXplKCkgY29uc3QKK3sgcmV0dXJuIHNfaW50ZXJuYWxfbm9kZV9hbGxvY2F0b3IubWF4X3NpemUoKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2luc2VydF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbnNlcnRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc4N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbnNlcnRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQ2NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X2pvaW5fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspOworICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOyk7CisgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyBiYWc7CisgIGlmICgham9pbl9wcmVwKG90aGVyLCBiYWcpKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSByZWNfam9pbihtX3BfaGVhZC0+bV9wX3BhcmVudCwgCisJCQkJICBvdGhlci5tX3BfaGVhZC0+bV9wX3BhcmVudCwgMCwgYmFnKTsKKworICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICBtX3NpemUgKz0gb3RoZXIubV9zaXplOworICBvdGhlci5pbml0aWFsaXplKCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgbV9wX2hlYWQtPm1fcF9taW4gPSBsZWZ0bW9zdF9kZXNjZW5kYW50KG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9wX2hlYWQtPm1fcF9tYXggPSByaWdodG1vc3RfZGVzY2VuZGFudChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2Jvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgaWYgKG90aGVyLm1fc2l6ZSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9zaXplID09IDApCisgICAgeworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGNvbnN0IGJvb2wgZ3JlYXRlciA9IHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4oCisJCQkJCQkJCQkJCQkgbV9wX2hlYWQtPm1fcF9tYXgpLT52YWx1ZSgpKSxQQl9EU19WMkYoc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPigKKwkJCQkJCQkJCQkJCSBvdGhlci5tX3BfaGVhZC0+bV9wX21pbiktPnZhbHVlKCkpKTsKKworICBjb25zdCBib29sIGxlc3NlciA9IHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4oCisJCQkJCQkJCQkJCQlvdGhlci5tX3BfaGVhZC0+bV9wX21heCktPnZhbHVlKCkpLFBCX0RTX1YyRihzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWluKS0+dmFsdWUoKSkpOworCisgIGlmICghZ3JlYXRlciAmJiAhbGVzc2VyKQorICAgIF9fdGhyb3dfam9pbl9lcnJvcigpOworCisgIHJlY19qb2luX3ByZXAobV9wX2hlYWQtPm1fcF9wYXJlbnQsIG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50LCByX2JhZyk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6am9pbihvdGhlcik7KQorICByZXR1cm4gdHJ1ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luX3ByZXAoY29uc3Rfbm9kZV9wb2ludGVyIHBfbCwgY29uc3Rfbm9kZV9wb2ludGVyIHBfciwgc3BsaXRfam9pbl9icmFuY2hfYmFnJiByX2JhZykKK3sKKyAgaWYgKHBfbC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgIHsKKyAgICAgIGlmIChwX3ItPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKyAgICAgICAgeworCSAgcmVjX2pvaW5fcHJlcChzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfbCksCisJCQlzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfciksIHJfYmFnKTsKKwkgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgICAgIHJlY19qb2luX3ByZXAoc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPihwX2wpLAorCQkgICAgc3RhdGljX2Nhc3Q8Y29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX3IpLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fdHlwZSA9PSBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpOworICBpZiAocF9yLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgeworICAgICAgcmVjX2pvaW5fcHJlcChzdGF0aWNfY2FzdDxjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbCksCisJCSAgICBzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfciksIHJfYmFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfci0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisKKyAgcmVjX2pvaW5fcHJlcChzdGF0aWNfY2FzdDxjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbCksCisJCXN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4ocF9yKSwgcl9iYWcpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChjb25zdF9sZWFmX3BvaW50ZXIgLypwX2wqLywgY29uc3RfbGVhZl9wb2ludGVyIC8qcF9yKi8sIAorCSAgICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7IHJfYmFnLmFkZF9icmFuY2goKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChjb25zdF9sZWFmX3BvaW50ZXIgLypwX2wqLywgY29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyIC8qcF9yKi8sIAorCSAgICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7IHJfYmFnLmFkZF9icmFuY2goKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXIgLypwX2wqLywgY29uc3RfbGVhZl9wb2ludGVyIC8qcF9yKi8sIAorCSAgICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7IHJfYmFnLmFkZF9icmFuY2goKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW5fcHJlcChjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXIgcF9sLCBjb25zdF9pbnRlcm5hbF9ub2RlX3BvaW50ZXIgcF9yLAorCSAgICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIGlmIChwX2wtPmdldF9lX2luZCgpID09IHBfci0+Z2V0X2VfaW5kKCkgJiYgCisgICAgICBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmVxdWFsX3ByZWZpeGVzKHBfbC0+cHJlZl9iX2l0KCksIHBfbC0+cHJlZl9lX2l0KCksCisJCQkJCSAgICBwX3ItPnByZWZfYl9pdCgpLCBwX3ItPnByZWZfZV9pdCgpKSkKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIGludGVybmFsX25vZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcF9yLT5iZWdpbigpOworCSAgIGl0ICE9IHBfci0+ZW5kKCk7ICsrIGl0KQorICAgICAgICB7CisJICBjb25zdF9ub2RlX3BvaW50ZXIgcF9sX2pvaW5fY2hpbGQgPSBwX2wtPmdldF9qb2luX2NoaWxkKCppdCwgdGhpcyk7CisJICBpZiAocF9sX2pvaW5fY2hpbGQgIT0gMCkKKwkgICAgcmVjX2pvaW5fcHJlcChwX2xfam9pbl9jaGlsZCwgKiBpdCwgcl9iYWcpOworICAgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX3ItPmdldF9lX2luZCgpIDwgcF9sLT5nZXRfZV9pbmQoKSAmJiAKKyAgICAgIHBfci0+c2hvdWxkX2JlX21pbmUocF9sLT5wcmVmX2JfaXQoKSwgcF9sLT5wcmVmX2VfaXQoKSwgMCwgdGhpcykpCisgICAgeworICAgICAgY29uc3Rfbm9kZV9wb2ludGVyIHBfcl9qb2luX2NoaWxkID0gcF9yLT5nZXRfam9pbl9jaGlsZChwX2wsIHRoaXMpOworICAgICAgaWYgKHBfcl9qb2luX2NoaWxkICE9IDApCisJcmVjX2pvaW5fcHJlcChwX3Jfam9pbl9jaGlsZCwgcF9sLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChwX3ItPmdldF9lX2luZCgpIDwgcF9sLT5nZXRfZV9pbmQoKSAmJiAKKyAgICAgIHBfci0+c2hvdWxkX2JlX21pbmUocF9sLT5wcmVmX2JfaXQoKSwgcF9sLT5wcmVmX2VfaXQoKSwgMCwgdGhpcykpCisgICAgeworICAgICAgY29uc3Rfbm9kZV9wb2ludGVyIHBfcl9qb2luX2NoaWxkID0gcF9yLT5nZXRfam9pbl9jaGlsZChwX2wsIHRoaXMpOworICAgICAgaWYgKHBfcl9qb2luX2NoaWxkICE9IDApCisJcmVjX2pvaW5fcHJlcChwX3Jfam9pbl9jaGlsZCwgcF9sLCByX2JhZyk7CisgICAgICByZXR1cm47CisgICAgfQorICByX2JhZy5hZGRfYnJhbmNoKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CityZWNfam9pbihub2RlX3BvaW50ZXIgcF9sLCBub2RlX3BvaW50ZXIgcF9yLCBzaXplX3R5cGUgY2hlY2tlZF9pbmQsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3IgIT0gMCk7CisgIGlmIChwX2wgPT0gMCkKKyAgICB7CisgICAgICBhcHBseV91cGRhdGUocF9yLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgICAgIHJldHVybiAocF9yKTsKKyAgICB9CisKKyAgaWYgKHBfbC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorICAgIHsKKyAgICAgIGlmIChwX3ItPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKyAgICAgICAgeworCSAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcmVjX2pvaW4oc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX2wpLAorCQkJCQlzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfciksIHJfYmFnKTsKKwkgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisJICByZXR1cm4gcF9yZXQ7CisgICAgICAgIH0KKworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfci0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgICAgICBub2RlX3BvaW50ZXIgcF9yZXQgPSByZWNfam9pbihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbCksCisJCQkJICAgIHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4ocF9yKSwKKwkJCQkgICAgY2hlY2tlZF9pbmQsIHJfYmFnKTsKKyAgICAgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgICAgICByZXR1cm4gcF9yZXQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2wtPm1fdHlwZSA9PSBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpOworICBpZiAocF9yLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcmVjX2pvaW4oc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX2wpLAorCQkJCSAgICBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfciksCisJCQkJICAgIGNoZWNrZWRfaW5kLCByX2JhZyk7CisgICAgICBhcHBseV91cGRhdGUocF9yZXQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICAgICAgcmV0dXJuIHBfcmV0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcmVjX2pvaW4oc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX2wpLAorCQkJCXN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4ocF9yKSwgCisJCQkJcl9iYWcpOworCisgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luKGxlYWZfcG9pbnRlciBwX2wsIGxlYWZfcG9pbnRlciBwX3IsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3IgIT0gMCk7CisgIGlmIChwX2wgPT0gMCkKKyAgICByZXR1cm4gKHBfcik7CisgIG5vZGVfcG9pbnRlciBwX3JldCA9IGluc2VydF9icmFuY2gocF9sLCBwX3IsIHJfYmFnKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhwX3JldCkgPT0gMik7CisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luKGxlYWZfcG9pbnRlciBwX2wsIGludGVybmFsX25vZGVfcG9pbnRlciBwX3IsIHNpemVfdHlwZSBjaGVja2VkX2luZCwgCisJIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgY29uc3Qgc2l6ZV90eXBlIGxoc19sZWFmcyA9IHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhwX2wpOworICBjb25zdCBzaXplX3R5cGUgcmhzX2xlYWZzID0gcmVjdXJzaXZlX2NvdW50X2xlYWZzKHBfcik7CisjZW5kaWYgCisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciAhPSAwKTsKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gcmVjX2pvaW4ocF9yLCBwX2wsIGNoZWNrZWRfaW5kLCByX2JhZyk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyZWN1cnNpdmVfY291bnRfbGVhZnMocF9yZXQpID09IGxoc19sZWFmcyArIHJoc19sZWFmcyk7CisgIHJldHVybiBwX3JldDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19qb2luKGludGVybmFsX25vZGVfcG9pbnRlciBwX2wsIGxlYWZfcG9pbnRlciBwX3IsIHNpemVfdHlwZSBjaGVja2VkX2luZCwgc3BsaXRfam9pbl9icmFuY2hfYmFnJiByX2JhZykKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciAhPSAwKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGNvbnN0IHNpemVfdHlwZSBsaHNfbGVhZnMgPSByZWN1cnNpdmVfY291bnRfbGVhZnMocF9sKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHJoc19sZWFmcyA9IHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhwX3IpOworI2VuZGlmIAorCisgIGlmICghcF9sLT5zaG91bGRfYmVfbWluZShwcmVmX2JlZ2luKHBfciksIHByZWZfZW5kKHBfciksIGNoZWNrZWRfaW5kLCB0aGlzKSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9yZXQgPSBpbnNlcnRfYnJhbmNoKHBfbCwgcF9yLCByX2JhZyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfcmV0LT5hc3NlcnRfdmFsaWQodGhpcyk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhwX3JldCkgPT0KKyAgICAgICAJCSAgICAgICAgICAgIGxoc19sZWFmcyArIHJoc19sZWFmcyk7CisgICAgICByZXR1cm4gcF9yZXQ7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3BvdF9jaGlsZCA9IHBfbC0+YWRkX2NoaWxkKHBfciwgcHJlZl9iZWdpbihwX3IpLAorCQkJCQkgICAgcHJlZl9lbmQocF9yKSwgdGhpcyk7CisgIGlmIChwX3BvdF9jaGlsZCAhPSBwX3IpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV3X2NoaWxkID0gcmVjX2pvaW4ocF9wb3RfY2hpbGQsIHBfciwgcF9sLT5nZXRfZV9pbmQoKSwKKwkJCQkJICByX2JhZyk7CisKKyAgICAgIHBfbC0+cmVwbGFjZV9jaGlsZChwX25ld19jaGlsZCwgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkgcHJlZl9lbmQocF9uZXdfY2hpbGQpLCB0aGlzKTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShwX2wtPmFzc2VydF92YWxpZCh0aGlzKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyZWN1cnNpdmVfY291bnRfbGVhZnMocF9sKSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICByZXR1cm4gcF9sOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVjX2pvaW4oaW50ZXJuYWxfbm9kZV9wb2ludGVyIHBfbCwgaW50ZXJuYWxfbm9kZV9wb2ludGVyIHBfciwgc3BsaXRfam9pbl9icmFuY2hfYmFnJiByX2JhZykKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfciAhPSAwKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgIGNvbnN0IHNpemVfdHlwZSBsaHNfbGVhZnMgPSByZWN1cnNpdmVfY291bnRfbGVhZnMocF9sKTsKKyAgY29uc3Qgc2l6ZV90eXBlIHJoc19sZWFmcyA9IHJlY3Vyc2l2ZV9jb3VudF9sZWFmcyhwX3IpOworI2VuZGlmIAorCisgIGlmIChwX2wtPmdldF9lX2luZCgpID09IHBfci0+Z2V0X2VfaW5kKCkgJiYgCisgICAgICBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmVxdWFsX3ByZWZpeGVzKHBfbC0+cHJlZl9iX2l0KCksIHBfbC0+cHJlZl9lX2l0KCksCisJCQkJCSAgICBwX3ItPnByZWZfYl9pdCgpLCBwX3ItPnByZWZfZV9pdCgpKSkKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIGludGVybmFsX25vZGU6Oml0ZXJhdG9yIGl0ID0gcF9yLT5iZWdpbigpOworCSAgIGl0ICE9IHBfci0+ZW5kKCk7ICsrIGl0KQorICAgICAgICB7CisJICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSByZWNfam9pbihwX2wtPmdldF9qb2luX2NoaWxkKCppdCwgdGhpcyksCisJCQkJCSAgICAgICogaXQsIDAsIHJfYmFnKTsKKwkgIHBfbC0+cmVwbGFjZV9jaGlsZChwX25ld19jaGlsZCwgcHJlZl9iZWdpbihwX25ld19jaGlsZCksCisJCQkgICAgIHByZWZfZW5kKHBfbmV3X2NoaWxkKSwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgcF9yLT5+aW50ZXJuYWxfbm9kZSgpOworICAgICAgc19pbnRlcm5hbF9ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfciwgMSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfbC0+YXNzZXJ0X3ZhbGlkKHRoaXMpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyZWN1cnNpdmVfY291bnRfbGVhZnMocF9sKSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICAgICAgcmV0dXJuIHBfbDsKKyAgICB9CisKKyAgaWYgKHBfbC0+Z2V0X2VfaW5kKCkgPCBwX3ItPmdldF9lX2luZCgpICYmIAorICAgICAgcF9sLT5zaG91bGRfYmVfbWluZShwX3ItPnByZWZfYl9pdCgpLCBwX3ItPnByZWZfZV9pdCgpLCAwLCB0aGlzKSkKKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXdfY2hpbGQgPSByZWNfam9pbihwX2wtPmdldF9qb2luX2NoaWxkKHBfciwgdGhpcyksCisJCQkJCSAgcF9yLCAwLCByX2JhZyk7CisgICAgICBwX2wtPnJlcGxhY2VfY2hpbGQocF9uZXdfY2hpbGQsIHByZWZfYmVnaW4ocF9uZXdfY2hpbGQpLAorCQkJIHByZWZfZW5kKHBfbmV3X2NoaWxkKSwgdGhpcyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfbC0+YXNzZXJ0X3ZhbGlkKHRoaXMpOykKKyAgICAgIHJldHVybiBwX2w7CisgICAgfQorCisgIGlmIChwX3ItPmdldF9lX2luZCgpIDwgcF9sLT5nZXRfZV9pbmQoKSAmJiAKKyAgICAgIHBfci0+c2hvdWxkX2JlX21pbmUocF9sLT5wcmVmX2JfaXQoKSwgcF9sLT5wcmVmX2VfaXQoKSwgMCwgdGhpcykpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV3X2NoaWxkID0gcmVjX2pvaW4ocF9yLT5nZXRfam9pbl9jaGlsZChwX2wsIHRoaXMpLCBwX2wsCisJCQkJCSAgMCwgcl9iYWcpOworCisgICAgICBwX3ItPnJlcGxhY2VfY2hpbGQocF9uZXdfY2hpbGQsIHByZWZfYmVnaW4ocF9uZXdfY2hpbGQpLCAKKwkJCSBwcmVmX2VuZChwX25ld19jaGlsZCksIHRoaXMpOworCisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfci0+YXNzZXJ0X3ZhbGlkKHRoaXMpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyZWN1cnNpdmVfY291bnRfbGVhZnMocF9yKSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICAgICAgcmV0dXJuIHBfcjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfcmV0ID0gaW5zZXJ0X2JyYW5jaChwX2wsIHBfciwgcl9iYWcpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfcmV0LT5hc3NlcnRfdmFsaWQodGhpcyk7KQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocmVjdXJzaXZlX2NvdW50X2xlYWZzKHBfcmV0KSA9PSBsaHNfbGVhZnMgKyByaHNfbGVhZnMpOworICByZXR1cm4gcF9yZXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgc3RkOjpwYWlyPHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvciwgYm9vbD4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydChjb25zdF9yZWZlcmVuY2Ugcl92YWwpCit7CisgIG5vZGVfcG9pbnRlciBwX2xmID0gZmluZF9pbXAoUEJfRFNfVjJGKHJfdmFsKSk7CisgIGlmIChwX2xmICE9IDAgJiYgcF9sZi0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlICYmIAorICAgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjplcXVhbF9rZXlzKFBCX0RTX1YyRihzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbGYpLT52YWx1ZSgpKSwgUEJfRFNfVjJGKHJfdmFsKSkpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjpjaGVja19rZXlfZXhpc3RzKFBCX0RTX1YyRihyX3ZhbCkpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKHBfbGYpLCBmYWxzZSk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KFBCX0RTX1YyRihyX3ZhbCkpKTsKKworICBsZWFmX3BvaW50ZXIgcF9uZXdfbGYgPSBzX2xlYWZfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOworICBjb25kX2RlYWx0b3IgY29uZChwX25ld19sZik7CisKKyAgbmV3IChwX25ld19sZikgbGVhZihyX3ZhbCk7CisgIGFwcGx5X3VwZGF0ZShwX25ld19sZiwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIGNvbmQuc2V0X2NhbGxfZGVzdHJ1Y3RvcigpOworICBzcGxpdF9qb2luX2JyYW5jaF9iYWcgYmFnOworICBiYWcuYWRkX2JyYW5jaCgpOworICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHJlY19qb2luKG1fcF9oZWFkLT5tX3BfcGFyZW50LCBwX25ld19sZiwgMCwgYmFnKTsKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBtX3BfaGVhZDsKKyAgY29uZC5zZXRfbm9fYWN0aW9uX2R0b3IoKTsKKyAgKyttX3NpemU7CisgIHVwZGF0ZV9taW5fbWF4X2Zvcl9pbnNlcnRlZF9sZWFmKHBfbmV3X2xmKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShkZWJ1Z19iYXNlOjppbnNlcnRfbmV3KFBCX0RTX1YyRihyX3ZhbCkpOykgICAKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwb2ludF9pdGVyYXRvcihwX25ld19sZiksIHRydWUpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogora2V5c19kaWZmX2luZCh0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGJfbCwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlX2wsIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYl9yLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVfcikKK3sKKyAgc2l6ZV90eXBlIGRpZmZfcG9zID0gMDsKKyAgd2hpbGUgKGJfbCAhPSBlX2wpCisgICAgeworICAgICAgaWYgKGJfciA9PSBlX3IpCisJcmV0dXJuIChkaWZmX3Bvcyk7CisgICAgICBpZiAoZV9hY2Nlc3NfdHJhaXRzOjplX3BvcygqYl9sKSAhPSBlX2FjY2Vzc190cmFpdHM6OmVfcG9zKCpiX3IpKQorCXJldHVybiAoZGlmZl9wb3MpOworICAgICAgKytiX2w7CisgICAgICArK2JfcjsKKyAgICAgICsrZGlmZl9wb3M7CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYl9yICE9IGVfcik7CisgIHJldHVybiBkaWZmX3BvczsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppbnRlcm5hbF9ub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luc2VydF9icmFuY2gobm9kZV9wb2ludGVyIHBfbCwgbm9kZV9wb2ludGVyIHBfciwgc3BsaXRfam9pbl9icmFuY2hfYmFnJiByX2JhZykKK3sKKyAgdHlwZW5hbWUgc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBsZWZ0X2JfaXQgPSBwcmVmX2JlZ2luKHBfbCk7CisgIHR5cGVuYW1lIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgbGVmdF9lX2l0ID0gcHJlZl9lbmQocF9sKTsKKyAgdHlwZW5hbWUgc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciByaWdodF9iX2l0ID0gcHJlZl9iZWdpbihwX3IpOworICB0eXBlbmFtZSBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIHJpZ2h0X2VfaXQgPSBwcmVmX2VuZChwX3IpOworCisgIGNvbnN0IHNpemVfdHlwZSBkaWZmX2luZCA9IGtleXNfZGlmZl9pbmQobGVmdF9iX2l0LCBsZWZ0X2VfaXQsIAorCQkJCQkgICByaWdodF9iX2l0LCByaWdodF9lX2l0KTsKKworICBpbnRlcm5hbF9ub2RlX3BvaW50ZXIgcF9uZXdfbmQgPSByX2JhZy5nZXRfYnJhbmNoKCk7CisgIG5ldyAocF9uZXdfbmQpIGludGVybmFsX25vZGUoZGlmZl9pbmQsIGxlZnRfYl9pdCk7CisgIHBfbmV3X25kLT5hZGRfY2hpbGQocF9sLCBsZWZ0X2JfaXQsIGxlZnRfZV9pdCwgdGhpcyk7CisgIHBfbmV3X25kLT5hZGRfY2hpbGQocF9yLCByaWdodF9iX2l0LCByaWdodF9lX2l0LCB0aGlzKTsKKyAgcF9sLT5tX3BfcGFyZW50ID0gcF9uZXdfbmQ7CisgIHBfci0+bV9wX3BhcmVudCA9IHBfbmV3X25kOworICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfbmV3X25kLT5hc3NlcnRfdmFsaWQodGhpcyk7KQorICByZXR1cm4gKHBfbmV3X25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9taW5fbWF4X2Zvcl9pbnNlcnRlZF9sZWFmKGxlYWZfcG9pbnRlciBwX25ld19sZikKK3sKKyAgaWYgKG1fcF9oZWFkLT5tX3BfbWluID09IG1fcF9oZWFkIHx8CisgICAgICBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmNtcF9rZXlzKFBCX0RTX1YyRihwX25ld19sZi0+dmFsdWUoKSksCisJCQkJICAgICAgUEJfRFNfVjJGKHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9taW4pLT52YWx1ZSgpKSkpCisgICAgbV9wX2hlYWQtPm1fcF9taW4gPSBwX25ld19sZjsKKworICBpZiAobV9wX2hlYWQtPm1fcF9tYXggPT0gbV9wX2hlYWQgfHwKKyAgICAgIHN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMoUEJfRFNfVjJGKHN0YXRpY19jYXN0PGNvbnN0X2xlYWZfcG9pbnRlcj4obV9wX2hlYWQtPm1fcF9tYXgpLT52YWx1ZSgpKSwgUEJfRFNfVjJGKHBfbmV3X2xmLT52YWx1ZSgpKSkpCisgICAgbV9wX2hlYWQtPm1fcF9tYXggPSBwX25ld19sZjsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaW50ZXJuYWxfbm9kZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ludGVybmFsX25vZGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2YxMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ludGVybmFsX25vZGUuaHBwCkBAIC0wLDAgKzEsNTk5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnRlcm5hbF9ub2RlLmhwcAorICogQ29udGFpbnMgYW4gaW50ZXJuYWwgUEJfRFNfQkFTRV9DX0RFQyBmb3IgYSBwYXRyaWNpYSB0cmVlLgorICovCisKKyNpZm5kZWYgUEJfRFNfUEFUX1RSSUVfSU5URVJOQUxfTk9ERV9IUFAKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfSU5URVJOQUxfTk9ERV9IUFAKKworI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsIHR5cGVuYW1lIEVfQWNjZXNzX1RyYWl0cywgIFwKKwkgICAgIHR5cGVuYW1lIE1ldGFkYXRhLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHBhdF90cmllX2ludGVybmFsX25vZGU8VHlwZV9UcmFpdHMsIEVfQWNjZXNzX1RyYWl0cywgTWV0YWRhdGEsIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBwYXRfdHJpZV9ub2RlX2Jhc2U8VHlwZV9UcmFpdHMsIEVfQWNjZXNzX1RyYWl0cywgTWV0YWRhdGEsIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19MRUFGX0NfREVDIFwKKyAgICBwYXRfdHJpZV9sZWFmPFR5cGVfVHJhaXRzLCBFX0FjY2Vzc19UcmFpdHMsIE1ldGFkYXRhLCBBbGxvY2F0b3I+CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlX1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIEVfQWNjZXNzX1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIE1ldGFkYXRhLAorCSAgICAgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyAJCQliYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIFR5cGVfVHJhaXRzIAkJCXR5cGVfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0eXBlX3RyYWl0czo6dmFsdWVfdHlwZSAJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgCXNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiBFX0FjY2Vzc19UcmFpdHMgZV9hY2Nlc3NfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGVfYWNjZXNzX3RyYWl0cz46Om90aGVyIGFjY2Vzc19yZWJpbmQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGFjY2Vzc19yZWJpbmQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8YmFzZV90eXBlPjo6b3RoZXIgYmFzZV9yZWJpbmQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfcmViaW5kOjpwb2ludGVyIG5vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9yZWJpbmQ6OmNvbnN0X3BvaW50ZXIgY29uc3Rfbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIFBCX0RTX0xFQUZfQ19ERUMgbGVhZjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8bGVhZj46Om90aGVyIGxlYWZfcmViaW5kOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBsZWFmX3JlYmluZDo6cG9pbnRlciBsZWFmX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGxlYWZfcmViaW5kOjpjb25zdF9wb2ludGVyIGNvbnN0X2xlYWZfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxwYXRfdHJpZV9pbnRlcm5hbF9ub2RlPjo6b3RoZXIgaW50ZXJuYWxfbm9kZV9yZWJpbmQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGludGVybmFsX25vZGVfcmViaW5kOjpwb2ludGVyIGludGVybmFsX25vZGVfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWxfbm9kZV9yZWJpbmQ6OmNvbnN0X3BvaW50ZXIgY29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpzdWJ0cmVlX2RlYnVnX2luZm8gc3VidHJlZV9kZWJ1Z19pbmZvOworCisgICAgICB2aXJ0dWFsIHN1YnRyZWVfZGVidWdfaW5mbworICAgICAgYXNzZXJ0X3ZhbGlkX2ltcChjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlcikgY29uc3Q7CisjZW5kaWYgCisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGdldF9wcmVmX3Bvcyhjb25zdF9lX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yLCAKKwkJICAgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIpIGNvbnN0OworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxub2RlX3BvaW50ZXI+OjpvdGhlciBub2RlX3BvaW50ZXJfcmViaW5kOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX3BvaW50ZXJfcmViaW5kOjpwb2ludGVyIG5vZGVfcG9pbnRlcl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX3BvaW50ZXJfcmViaW5kOjpyZWZlcmVuY2Ugbm9kZV9wb2ludGVyX3JlZmVyZW5jZTsKKworICAgICAgZW51bQorCXsKKwkgIGFycl9zaXplID0gRV9BY2Nlc3NfVHJhaXRzOjptYXhfc2l6ZSArIDEKKwl9OworICAgICAgUEJfRFNfU1RBVElDX0FTU0VSVChtaW5fYXJyX3NpemUsIGFycl9zaXplID49IDIpOworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vY29uc3RfY2hpbGRfaXRlcmF0b3IuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2NoaWxkX2l0ZXJhdG9yLmhwcD4KKworICAgICAgcGF0X3RyaWVfaW50ZXJuYWxfbm9kZShzaXplX3R5cGUsIGNvbnN0IGNvbnN0X2VfaXRlcmF0b3IpOworCisgICAgICB2b2lkCisgICAgICB1cGRhdGVfcHJlZml4ZXMoY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIpOworCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCk7CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBnZXRfY2hpbGRfbm9kZShjb25zdF9lX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yLCAKKwkJICAgICBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBjb25zdF9ub2RlX3BvaW50ZXIKKyAgICAgIGdldF9jaGlsZF9ub2RlKGNvbnN0X2VfaXRlcmF0b3IsIGNvbnN0X2VfaXRlcmF0b3IsIAorCQkgICAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyKSBjb25zdDsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBnZXRfY2hpbGRfaXQoY29uc3RfZV9pdGVyYXRvciwgY29uc3RfZV9pdGVyYXRvciwgCisJCSAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X2xvd2VyX2JvdW5kX2NoaWxkX25vZGUoY29uc3RfZV9pdGVyYXRvciwgY29uc3RfZV9pdGVyYXRvciwgCisJCQkJIHNpemVfdHlwZSwgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBhZGRfY2hpbGQobm9kZV9wb2ludGVyLCBjb25zdF9lX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yLCAKKwkJY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgY29uc3Rfbm9kZV9wb2ludGVyCisgICAgICBnZXRfam9pbl9jaGlsZChjb25zdF9ub2RlX3BvaW50ZXIsIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyKSBjb25zdDsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X2pvaW5fY2hpbGQobm9kZV9wb2ludGVyLCBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9jaGlsZChub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICByZW1vdmVfY2hpbGQoaXRlcmF0b3IgaXQpOworCisgICAgICB2b2lkCisgICAgICByZXBsYWNlX2NoaWxkKG5vZGVfcG9pbnRlciwgY29uc3RfZV9pdGVyYXRvciwgY29uc3RfZV9pdGVyYXRvciwgCisJCSAgICBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBjb25zdF9lX2l0ZXJhdG9yCisgICAgICBwcmVmX2JfaXQoKSBjb25zdDsKKworICAgICAgaW5saW5lIGNvbnN0X2VfaXRlcmF0b3IKKyAgICAgIHByZWZfZV9pdCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBnZXRfZV9pbmQoKSBjb25zdDsKKworICAgICAgYm9vbAorICAgICAgc2hvdWxkX2JlX21pbmUoY29uc3RfZV9pdGVyYXRvciwgY29uc3RfZV9pdGVyYXRvciwgc2l6ZV90eXBlLCAKKwkJICAgICBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlcikgY29uc3Q7CisKKyAgICAgIGxlYWZfcG9pbnRlcgorICAgICAgbGVmdG1vc3RfZGVzY2VuZGFudCgpOworCisgICAgICBjb25zdF9sZWFmX3BvaW50ZXIKKyAgICAgIGxlZnRtb3N0X2Rlc2NlbmRhbnQoKSBjb25zdDsKKworICAgICAgbGVhZl9wb2ludGVyCisgICAgICByaWdodG1vc3RfZGVzY2VuZGFudCgpOworCisgICAgICBjb25zdF9sZWFmX3BvaW50ZXIKKyAgICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgc2l6ZV90eXBlCisgICAgICBlX2luZCgpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIHBhdF90cmllX2ludGVybmFsX25vZGUoY29uc3QgcGF0X3RyaWVfaW50ZXJuYWxfbm9kZSYpOworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGdldF9iZWdpbl9wb3MoKSBjb25zdDsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIG1fZV9pbmQ7CisgICAgICBjb25zdF9lX2l0ZXJhdG9yIG1fcHJlZl9iX2l0OworICAgICAgY29uc3RfZV9pdGVyYXRvciBtX3ByZWZfZV9pdDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX2FfcF9jaGlsZHJlblthcnJfc2l6ZV07CisgICAgICBzdGF0aWMgbGVhZl9yZWJpbmQgc19sZWFmX2FsbG9jOworICAgICAgc3RhdGljIGludGVybmFsX25vZGVfcmViaW5kIHNfaW50ZXJuYWxfbm9kZV9hbGxvYzsKKyAgICB9OworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bGVhZl9yZWJpbmQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6c19sZWFmX2FsbG9jOworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aW50ZXJuYWxfbm9kZV9yZWJpbmQKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6c19pbnRlcm5hbF9ub2RlX2FsbG9jOworCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfcHJlZl9wb3MoY29uc3RfZV9pdGVyYXRvciBiX2l0LCBjb25zdF9lX2l0ZXJhdG9yIGVfaXQsIAorCQkgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0CisgICAgeworICAgICAgaWYgKHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihzdGQ6OmRpc3RhbmNlKGJfaXQsIGVfaXQpKSA8PSBtX2VfaW5kKQorCXJldHVybiAwOworICAgICAgc3RkOjphZHZhbmNlKGJfaXQsIG1fZV9pbmQpOworICAgICAgcmV0dXJuIDEgKyBwX3RyYWl0cy0+ZV9wb3MoKmJfaXQpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHBhdF90cmllX2ludGVybmFsX25vZGUoc2l6ZV90eXBlIGxlbiwgY29uc3QgY29uc3RfZV9pdGVyYXRvciBpdCkgOgorICAgICAgUEJfRFNfQkFTRV9DX0RFQyhwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpLAorICAgICAgbV9lX2luZChsZW4pLCBtX3ByZWZfYl9pdChpdCksIG1fcHJlZl9lX2l0KGl0KQorICAgIHsKKyAgICAgIHN0ZDo6YWR2YW5jZShtX3ByZWZfZV9pdCwgbV9lX2luZCk7CisgICAgICBzdGQ6OmZpbGwobV9hX3BfY2hpbGRyZW4sIG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUsCisJCXN0YXRpY19jYXN0PG5vZGVfcG9pbnRlcj4oMCkpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB1cGRhdGVfcHJlZml4ZXMoY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfZmlyc3QgPSAqYmVnaW4oKTsKKyAgICAgIGlmIChwX2ZpcnN0LT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisJeworCSAgY29uc3RfbGVhZl9wb2ludGVyIHAgPSBzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfZmlyc3QpOworCSAgbV9wcmVmX2JfaXQgPSBwX3RyYWl0cy0+YmVnaW4oZV9hY2Nlc3NfdHJhaXRzOjpleHRyYWN0X2tleShwLT52YWx1ZSgpKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2ZpcnN0LT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKwkgIG1fcHJlZl9iX2l0ID0gc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX2ZpcnN0KS0+cHJlZl9iX2l0KCk7CisJfQorICAgICAgbV9wcmVmX2VfaXQgPSBtX3ByZWZfYl9pdDsKKyAgICAgIHN0ZDo6YWR2YW5jZShtX3ByZWZfZV9pdCwgbV9lX2luZCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYmVnaW4oKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZV9wb2ludGVyX3BvaW50ZXIgcG9pbnRlcl90eXBlOworICAgICAgcG9pbnRlcl90eXBlIHAgPSBjb25zdF9jYXN0PHBvaW50ZXJfdHlwZT4obV9hX3BfY2hpbGRyZW4pOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHAgKyBnZXRfYmVnaW5fcG9zKCksIHAgKyBhcnJfc2l6ZSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYmVnaW4oKQorICAgIHsKKyAgICAgIHJldHVybiBpdGVyYXRvcihtX2FfcF9jaGlsZHJlbiArIGdldF9iZWdpbl9wb3MoKSwgCisJCSAgICAgIG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGVuZCgpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBub2RlX3BvaW50ZXJfcG9pbnRlciBwb2ludGVyX3R5cGU7CisgICAgICBwb2ludGVyX3R5cGUgcCA9IGNvbnN0X2Nhc3Q8cG9pbnRlcl90eXBlPihtX2FfcF9jaGlsZHJlbikgKyBhcnJfc2l6ZTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihwLCBwKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBlbmQoKQorICAgIHsgcmV0dXJuIGl0ZXJhdG9yKG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUsIG1fYV9wX2NoaWxkcmVuICsgYXJyX3NpemUpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9jaGlsZF9ub2RlKGNvbnN0X2VfaXRlcmF0b3IgYl9pdCwgY29uc3RfZV9pdGVyYXRvciBlX2l0LCAKKwkJICAgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGkgPSBnZXRfcHJlZl9wb3MoYl9pdCwgZV9pdCwgcF90cmFpdHMpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgPCBhcnJfc2l6ZSk7CisgICAgICByZXR1cm4gbV9hX3BfY2hpbGRyZW5baV07CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGdldF9jaGlsZF9pdChjb25zdF9lX2l0ZXJhdG9yIGJfaXQsIGNvbnN0X2VfaXRlcmF0b3IgZV9pdCwgCisJCSBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaSA9IGdldF9wcmVmX3BvcyhiX2l0LCBlX2l0LCBwX3RyYWl0cyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaSA8IGFycl9zaXplKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2FfcF9jaGlsZHJlbltpXSAhPSAwKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcihtX2FfcF9jaGlsZHJlbiArIGksIG1fYV9wX2NoaWxkcmVuICsgaSk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X25vZGVfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfY2hpbGRfbm9kZShjb25zdF9lX2l0ZXJhdG9yIGJfaXQsIGNvbnN0X2VfaXRlcmF0b3IgZV9pdCwgCisJCSAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyIHBfdHJhaXRzKSBjb25zdAorICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8bm9kZV9wb2ludGVyPihnZXRfY2hpbGRfbm9kZShiX2l0LCBlX2l0LCBwX3RyYWl0cykpOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2xvd2VyX2JvdW5kX2NoaWxkX25vZGUoY29uc3RfZV9pdGVyYXRvciBiX2l0LCBjb25zdF9lX2l0ZXJhdG9yIGVfaXQsIAorCQkJICAgICAgIHNpemVfdHlwZSBjaGVja2VkX2luZCwgCisJCQkgICAgICAgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgaWYgKCFzaG91bGRfYmVfbWluZShiX2l0LCBlX2l0LCBjaGVja2VkX2luZCwgcF90cmFpdHMpKQorCXsKKwkgIGlmIChwX3RyYWl0cy0+Y21wX3ByZWZpeGVzKGJfaXQsIGVfaXQsIG1fcHJlZl9iX2l0LCBtX3ByZWZfZV9pdCwgdHJ1ZSkpCisJICAgIHJldHVybiBsZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisJICByZXR1cm4gcmlnaHRtb3N0X2Rlc2NlbmRhbnQoKTsKKwl9CisKKyAgICAgIHNpemVfdHlwZSBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworCisgICAgICBpZiAobV9hX3BfY2hpbGRyZW5baV0gIT0gMCkKKwlyZXR1cm4gbV9hX3BfY2hpbGRyZW5baV07CisKKyAgICAgIHdoaWxlICgrK2kgPCBhcnJfc2l6ZSkKKwlpZiAobV9hX3BfY2hpbGRyZW5baV0gIT0gMCkKKwkgIHsKKwkgICAgaWYgKG1fYV9wX2NoaWxkcmVuW2ldLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisJICAgICAgcmV0dXJuIG1fYV9wX2NoaWxkcmVuW2ldOworCisJICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2FfcF9jaGlsZHJlbltpXS0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisKKwkgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4obV9hX3BfY2hpbGRyZW5baV0pLT5sZWZ0bW9zdF9kZXNjZW5kYW50KCk7CisJICB9CisKKyAgICAgIHJldHVybiByaWdodG1vc3RfZGVzY2VuZGFudCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYWRkX2NoaWxkKG5vZGVfcG9pbnRlciBwX25kLCBjb25zdF9lX2l0ZXJhdG9yIGJfaXQsIGNvbnN0X2VfaXRlcmF0b3IgZV9pdCwgCisJICAgICAgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIGkgPSBnZXRfcHJlZl9wb3MoYl9pdCwgZV9pdCwgcF90cmFpdHMpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGkgPCBhcnJfc2l6ZSk7CisgICAgICBpZiAobV9hX3BfY2hpbGRyZW5baV0gPT0gMCkKKwl7CisJICBtX2FfcF9jaGlsZHJlbltpXSA9IHBfbmQ7CisJICBwX25kLT5tX3BfcGFyZW50ID0gdGhpczsKKwkgIHJldHVybiBwX25kOworCX0KKyAgICAgIHJldHVybiBtX2FfcF9jaGlsZHJlbltpXTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9ub2RlX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2pvaW5fY2hpbGQoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQsIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyIHBfdHJhaXRzKSBjb25zdAorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwID0gY29uc3RfY2FzdDxub2RlX3BvaW50ZXI+KHBfbmQpOworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPih0aGlzKS0+Z2V0X2pvaW5fY2hpbGQocCwgcF90cmFpdHMpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBnZXRfam9pbl9jaGlsZChub2RlX3BvaW50ZXIgcF9uZCwgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpCisgICAgeworICAgICAgc2l6ZV90eXBlIGk7CisgICAgICBjb25zdF9lX2l0ZXJhdG9yIGJfaXQ7CisgICAgICBjb25zdF9lX2l0ZXJhdG9yIGVfaXQ7CisgICAgICBpZiAocF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorCXsKKwkgIHR5cGVuYW1lIFR5cGVfVHJhaXRzOjpjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5ID0KKwkgICAgZV9hY2Nlc3NfdHJhaXRzOjpleHRyYWN0X2tleShzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KHBfbmQpLT52YWx1ZSgpKTsKKworCSAgYl9pdCA9IHBfdHJhaXRzLT5iZWdpbihyX2tleSk7CisJICBlX2l0ID0gcF90cmFpdHMtPmVuZChyX2tleSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJfaXQgPSBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5wcmVmX2JfaXQoKTsKKwkgIGVfaXQgPSBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5wcmVmX2VfaXQoKTsKKwl9CisgICAgICBpID0gZ2V0X3ByZWZfcG9zKGJfaXQsIGVfaXQsIHBfdHJhaXRzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpIDwgYXJyX3NpemUpOworICAgICAgcmV0dXJuIG1fYV9wX2NoaWxkcmVuW2ldOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByZW1vdmVfY2hpbGQobm9kZV9wb2ludGVyIHBfbmQpCisgICAgeworICAgICAgc2l6ZV90eXBlIGkgPSAwOworICAgICAgZm9yICg7IGkgPCBhcnJfc2l6ZTsgKytpKQorCWlmIChtX2FfcF9jaGlsZHJlbltpXSA9PSBwX25kKQorCSAgeworCSAgICBtX2FfcF9jaGlsZHJlbltpXSA9IDA7CisJICAgIHJldHVybjsKKwkgIH0KKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChpICE9IGFycl9zaXplKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByZW1vdmVfY2hpbGQoaXRlcmF0b3IgaXQpCisgICAgeworICAgICAgaXRlcmF0b3IgcmV0ID0gaXQ7CisgICAgICArK3JldDsKKyAgICAgICogaXQubV9wX3BfY3VyID0gMDsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJlcGxhY2VfY2hpbGQobm9kZV9wb2ludGVyIHBfbmQsIGNvbnN0X2VfaXRlcmF0b3IgYl9pdCwgCisJCSAgY29uc3RfZV9pdGVyYXRvciBlX2l0LCAKKwkJICBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgaSA9IGdldF9wcmVmX3BvcyhiX2l0LCBlX2l0LCBwX3RyYWl0cyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaSA8IGFycl9zaXplKTsKKyAgICAgIG1fYV9wX2NoaWxkcmVuW2ldID0gcF9uZDsKKyAgICAgIHBfbmQtPm1fcF9wYXJlbnQgPSB0aGlzOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9lX2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHByZWZfYl9pdCgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9wcmVmX2JfaXQ7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9lX2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHByZWZfZV9pdCgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9wcmVmX2VfaXQ7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2VfaW5kKCkgY29uc3QKKyAgICB7IHJldHVybiBtX2VfaW5kOyB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGJvb2wKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgc2hvdWxkX2JlX21pbmUoY29uc3RfZV9pdGVyYXRvciBiX2l0LCBjb25zdF9lX2l0ZXJhdG9yIGVfaXQsIAorCQkgICBzaXplX3R5cGUgY2hlY2tlZF9pbmQsIAorCQkgICBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykgY29uc3QKKyAgICB7CisgICAgICBpZiAobV9lX2luZCA9PSAwKQorCXJldHVybiB0cnVlOworCisgICAgICBjb25zdCBzaXplX3R5cGUgbnVtX2VzID0gc3RkOjpkaXN0YW5jZShiX2l0LCBlX2l0KTsKKyAgICAgIGlmIChudW1fZXMgPCBtX2VfaW5kKQorCXJldHVybiBmYWxzZTsKKworICAgICAgY29uc3RfZV9pdGVyYXRvciBrZXlfYl9pdCA9IGJfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2Uoa2V5X2JfaXQsIGNoZWNrZWRfaW5kKTsKKyAgICAgIGNvbnN0X2VfaXRlcmF0b3Iga2V5X2VfaXQgPSBiX2l0OworICAgICAgc3RkOjphZHZhbmNlKGtleV9lX2l0LCBtX2VfaW5kKTsKKworICAgICAgY29uc3RfZV9pdGVyYXRvciB2YWx1ZV9iX2l0ID0gbV9wcmVmX2JfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2UodmFsdWVfYl9pdCwgY2hlY2tlZF9pbmQpOworICAgICAgY29uc3RfZV9pdGVyYXRvciB2YWx1ZV9lX2l0ID0gbV9wcmVmX2JfaXQ7CisgICAgICBzdGQ6OmFkdmFuY2UodmFsdWVfZV9pdCwgbV9lX2luZCk7CisKKyAgICAgIHJldHVybiBwX3RyYWl0cy0+ZXF1YWxfcHJlZml4ZXMoa2V5X2JfaXQsIGtleV9lX2l0LCB2YWx1ZV9iX2l0LCAKKwkJCQkgICAgICB2YWx1ZV9lX2l0KTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpsZWFmX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbGVmdG1vc3RfZGVzY2VuZGFudCgpCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfcG90ID0qIGJlZ2luKCk7CisgICAgICBpZiAocF9wb3QtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4ocF9wb3QpKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BvdC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX3BvdCktPmxlZnRtb3N0X2Rlc2NlbmRhbnQoKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9sZWFmX3BvaW50ZXIKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgbGVmdG1vc3RfZGVzY2VuZGFudCgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPih0aGlzKS0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByaWdodG1vc3RfZGVzY2VuZGFudCgpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG51bV9jaGlsZHJlbiA+PSAyKTsKKworICAgICAgaXRlcmF0b3IgaXQgPSBiZWdpbigpOworICAgICAgc3RkOjphZHZhbmNlKGl0LCBudW1fY2hpbGRyZW4gLSAxKTsKKyAgICAgIG5vZGVfcG9pbnRlciBwX3BvdCA9KiBpdDsKKyAgICAgIGlmIChwX3BvdC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKQorCXJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfcG90KTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BvdC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX3BvdCktPnJpZ2h0bW9zdF9kZXNjZW5kYW50KCk7CisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfbGVhZl9wb2ludGVyCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJpZ2h0bW9zdF9kZXNjZW5kYW50KCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHRoaXMpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGVfaW5kKCkgY29uc3QKKyAgICB7IHJldHVybiBtX2VfaW5kOyB9CisjZW5kaWYgCisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZ2V0X2JlZ2luX3BvcygpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJyX3NpemUgJiYgbV9hX3BfY2hpbGRyZW5baV0gPT0gMDsgKytpKQorCTsKKyAgICAgIHJldHVybiBpOworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c3VidHJlZV9kZWJ1Z19pbmZvCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGFzc2VydF92YWxpZF9pbXAoY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OmRpc3RhbmNlKHByZWZfYl9pdCgpLCBwcmVmX2VfaXQoKSkpID09IG1fZV9pbmQpOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHN0ZDo6ZGlzdGFuY2UoYmVnaW4oKSwgZW5kKCkpID49IDIpOworCisgICAgICBmb3IgKHR5cGVuYW1lIHBhdF90cmllX2ludGVybmFsX25vZGU6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnaW4oKTsKKwkgICBpdCAhPSBlbmQoKTsgKytpdCkKKwl7CisJICBjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCA9KiBpdDsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfcGFyZW50ID09IHRoaXMpOworCSAgc3VidHJlZV9kZWJ1Z19pbmZvIGNoaWxkX3JldCA9IHBfbmQtPmFzc2VydF92YWxpZF9pbXAocF90cmFpdHMpOworCisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihzdGQ6OmRpc3RhbmNlKGNoaWxkX3JldC5maXJzdCwgY2hpbGRfcmV0LnNlY29uZCkpID49IG1fZV9pbmQpOworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHNob3VsZF9iZV9taW5lKGNoaWxkX3JldC5maXJzdCwgY2hpbGRfcmV0LnNlY29uZCwgMCwgcF90cmFpdHMpKTsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChnZXRfcHJlZl9wb3MoY2hpbGRfcmV0LmZpcnN0LCBjaGlsZF9yZXQuc2Vjb25kLCBwX3RyYWl0cykgPT0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihpdC5tX3BfcF9jdXIgLSBtX2FfcF9jaGlsZHJlbikpOworCX0KKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwcmVmX2JfaXQoKSwgcHJlZl9lX2l0KCkpOworICAgIH0KKyNlbmRpZiAKKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19CQVNFX0NfREVDCisjdW5kZWYgUEJfRFNfTEVBRl9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaXRlcmF0b3JzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTIwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpdGVyYXRvcnNfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbigpCit7IHJldHVybiBpdGVyYXRvcihtX3BfaGVhZC0+bV9wX21pbik7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2JlZ2luKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkLT5tX3BfbWluKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkKK3sgcmV0dXJuIGl0ZXJhdG9yKG1fcF9oZWFkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKG1fcF9oZWFkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CityYmVnaW4oKSBjb25zdAoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gcmVuZCgpOworICByZXR1cm4gLS1lbmQoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmJlZ2luKCkKK3sKKyAgaWYgKGVtcHR5KCkpCisgICAgcmV0dXJuIHJlbmQoKTsKKyAgcmV0dXJuIC0tZW5kKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbmQoKQoreyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihtX3BfaGVhZCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVuZCgpIGNvbnN0Cit7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKG1fcF9oZWFkKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9ub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2JlZ2luKCkgY29uc3QKK3sgcmV0dXJuIGNvbnN0X25vZGVfaXRlcmF0b3IobV9wX2hlYWQtPm1fcF9wYXJlbnQsIHRoaXMpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vZGVfYmVnaW4oKQoreyByZXR1cm4gbm9kZV9pdGVyYXRvcihtX3BfaGVhZC0+bV9wX3BhcmVudCwgdGhpcyk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3Rfbm9kZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm9kZV9lbmQoKSBjb25zdAoreyByZXR1cm4gY29uc3Rfbm9kZV9pdGVyYXRvcigwLCB0aGlzKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6Citub2RlX2VuZCgpCit7IHJldHVybiBub2RlX2l0ZXJhdG9yKDAsIHRoaXMpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbGVhZi5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2xlYWYuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2YxNGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2xlYWYuaHBwCkBAIC0wLDAgKzEsMTcxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBsZWFmLmhwcAorICogQ29udGFpbnMgYSBwYXRfdHJpZV9sZWFmIGZvciBhIHBhdHJpY2lhIHRyZWUuCisgKi8KKworI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9MRUFGX0hQUAorI2RlZmluZSBQQl9EU19QQVRfVFJJRV9MRUFGX0hQUAorCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMJCQkJCQlcCisgICAgdGVtcGxhdGU8CQkJCQkJCQlcCisJCQkJCQljbGFzcyBUeXBlX1RyYWl0cywJXAorCQkJCQkJY2xhc3MgRV9BY2Nlc3NfVHJhaXRzLAlcCisJCQkJCQljbGFzcyBNZXRhZGF0YSwJCVwKKwkJCQkJCWNsYXNzIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQwkJCQkJCVwKKyAgICBwYXRfdHJpZV9sZWFmPAkJCQkJCQlcCisJCQkJCQlUeXBlX1RyYWl0cywJCVwKKwkJCQkJCUVfQWNjZXNzX1RyYWl0cywJXAorCQkJCQkJTWV0YWRhdGEsCQlcCisJCQkJCQlBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQwkJCQkJXAorICAgIHBhdF90cmllX25vZGVfYmFzZTwJCQkJCQlcCisJCQkJCVR5cGVfVHJhaXRzLAkJXAorCQkJCQlFX0FjY2Vzc19UcmFpdHMsCVwKKwkJCQkJTWV0YWRhdGEsCQlcCisJCQkJCUFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19QQVRfVFJJRV9TVUJUUkVFX0RFQlVHX0lORk9fQ19ERUMJCQkJXAorICAgIHBhdF90cmllX3N1YnRyZWVfZGVidWdfaW5mbzwJCQkJCVwKKwkJCQkJCQlUeXBlX1RyYWl0cywJXAorCQkJCQkJCUVfQWNjZXNzX1RyYWl0cywgXAorCQkJCQkJCUFsbG9jYXRvcj4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVfVHJhaXRzLAorCSAgICAgY2xhc3MgRV9BY2Nlc3NfVHJhaXRzLAorCSAgICAgY2xhc3MgTWV0YWRhdGEsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHBhdF90cmllX2xlYWYgOiBwdWJsaWMgUEJfRFNfQkFTRV9DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVfVHJhaXRzOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVfVHJhaXRzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlFX0FjY2Vzc19UcmFpdHM+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXI7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6c3VidHJlZV9kZWJ1Z19pbmZvCisgICAgICBzdWJ0cmVlX2RlYnVnX2luZm87CisjZW5kaWYgCisKKyAgICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICBwYXRfdHJpZV9sZWFmKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCk7CisKKyAgICAgIGlubGluZSByZWZlcmVuY2UKKyAgICAgIHZhbHVlKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHZhbHVlKCkgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdmlydHVhbCBzdWJ0cmVlX2RlYnVnX2luZm8KKyAgICAgIGFzc2VydF92YWxpZF9pbXAoY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0OworCisgICAgICB2aXJ0dWFsCisgICAgICB+cGF0X3RyaWVfbGVhZigpOworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIHBhdF90cmllX2xlYWYoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgdmFsdWVfdHlwZSBtX3ZhbHVlOworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBwYXRfdHJpZV9sZWFmKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkgOgorICAgIFBCX0RTX0JBU0VfQ19ERUMocGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpLCBtX3ZhbHVlKHJfdmFsKQorICAgIHsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJlZmVyZW5jZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB2YWx1ZSgpCisgICAgeyByZXR1cm4gbV92YWx1ZTsgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB2YWx1ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gbV92YWx1ZTsgfQorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzdWJ0cmVlX2RlYnVnX2luZm8KKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgYXNzZXJ0X3ZhbGlkX2ltcChjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpOworICAgICAgc3VidHJlZV9kZWJ1Z19pbmZvIHJldDsKKyAgICAgIGNvbnN0X3JlZmVyZW5jZSByX3ZhbCA9IHZhbHVlKCk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocF90cmFpdHMtPmJlZ2luKHBfdHJhaXRzLT5leHRyYWN0X2tleShyX3ZhbCkpLAorCQkJICAgICBwX3RyYWl0cy0+ZW5kKHBfdHJhaXRzLT5leHRyYWN0X2tleShyX3ZhbCkpKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB+cGF0X3RyaWVfbGVhZigpIHsgfQorI2VuZGlmIAorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKyN1bmRlZiBQQl9EU19QQVRfVFJJRV9TVUJUUkVFX0RFQlVHX0lORk9fQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9ub2RlX2Jhc2UuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9ub2RlX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMTMwNjgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL25vZGVfYmFzZS5ocHAKQEAgLTAsMCArMSwxMjggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG5vZGVfYmFzZS5ocHAKKyAqIENvbnRhaW5zIGEgcGF0X3RyaWVfbm9kZV9iYXNlIGJhc2UgZm9yIGEgcGF0cmljaWEgdHJlZS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1BBVF9UUklFX05PREVfQkFTRV9IUFAKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfTk9ERV9CQVNFX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbm9kZV9tZXRhZGF0YV9iYXNlLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlX1RyYWl0cywgdHlwZW5hbWUgRV9BY2Nlc3NfVHJhaXRzLAlcCisJICAgICB0eXBlbmFtZSBNZXRhZGF0YSwJdHlwZW5hbWUgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICBwYXRfdHJpZV9ub2RlX2Jhc2U8VHlwZV9UcmFpdHMsIEVfQWNjZXNzX1RyYWl0cywgTWV0YWRhdGEsIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19QQVRfVFJJRV9TVUJUUkVFX0RFQlVHX0lORk9fQ19ERUMJXAorICAgIHBhdF90cmllX3N1YnRyZWVfZGVidWdfaW5mbzxUeXBlX1RyYWl0cywgRV9BY2Nlc3NfVHJhaXRzLCBBbGxvY2F0b3I+CisKKyAgICBlbnVtIHBhdF90cmllX25vZGVfdHlwZQorICAgICAgeworCXBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSwKKwlwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSwKKwlwYXRfdHJpZV9oZWFkX25vZGVfdHlwZQorICAgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVfVHJhaXRzLAorCSAgICAgdHlwZW5hbWUgRV9BY2Nlc3NfVHJhaXRzLAorCSAgICAgdHlwZW5hbWUgTWV0YWRhdGEsCisJICAgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgc3RydWN0IHBhdF90cmllX25vZGVfYmFzZSA6IHB1YmxpYyBwYXRfdHJpZV9ub2RlX21ldGFkYXRhX2Jhc2U8CisgICAgICBNZXRhZGF0YSwKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAgICBwYXRfdHJpZV9ub2RlX2Jhc2U+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlFX0FjY2Vzc19UcmFpdHM+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXI7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZgorICAgICAgc3RkOjpwYWlyPAorCXR5cGVuYW1lIEVfQWNjZXNzX1RyYWl0czo6Y29uc3RfaXRlcmF0b3IsCisJdHlwZW5hbWUgRV9BY2Nlc3NfVHJhaXRzOjpjb25zdF9pdGVyYXRvcj4KKyAgICAgIHN1YnRyZWVfZGVidWdfaW5mbzsKKyNlbmRpZiAKKworICAgICAgcGF0X3RyaWVfbm9kZV9iYXNlKHBhdF90cmllX25vZGVfdHlwZSB0eXBlKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoY29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIgcF90cmFpdHMpIGNvbnN0OworCisgICAgICB2aXJ0dWFsIHN1YnRyZWVfZGVidWdfaW5mbworICAgICAgYXNzZXJ0X3ZhbGlkX2ltcChjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykgY29uc3QgPSAwOworI2VuZGlmIAorCisgICAgICBub2RlX3BvaW50ZXIgbV9wX3BhcmVudDsKKyAgICAgIGNvbnN0IHBhdF90cmllX25vZGVfdHlwZSBtX3R5cGU7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHBhdF90cmllX25vZGVfYmFzZShwYXRfdHJpZV9ub2RlX3R5cGUgdHlwZSkgOiBtX3R5cGUodHlwZSkKKyAgICB7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGFzc2VydF92YWxpZChjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cykgY29uc3QKKyAgICB7IGFzc2VydF92YWxpZF9pbXAocF90cmFpdHMpOyB9CisjZW5kaWYgCisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfUEFUX1RSSUVfU1VCVFJFRV9ERUJVR19JTkZPX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbm9kZV9pdGVyYXRvcnMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9ub2RlX2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3NDYyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbm9kZV9pdGVyYXRvcnMuaHBwCkBAIC0wLDAgKzEsMzM4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBub2RlX2l0ZXJhdG9ycy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBwYXRfdHJpZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9OT0RFX0lURVJBVE9SU19IUFAKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfTk9ERV9JVEVSQVRPUlNfSFBQCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19QQVRfVFJJRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDCQkJXAorICAgIHBhdF90cmllX2NvbnN0X25vZGVfaXRfPAkJCQkJCVwKKwkJCQkJCQlOb2RlLAkJXAorCQkJCQkJCUxlYWYsCQlcCisJCQkJCQkJSGVhZCwJCVwKKwkJCQkJCQlJbnRlcm5hbF9Ob2RlLAlcCisJCQkJCQkJQ29uc3RfSXRlcmF0b3IsCVwKKwkJCQkJCQlJdGVyYXRvciwJXAorCQkJCQkJCUVfQWNjZXNzX1RyYWl0cywgXAorCQkJCQkJCUFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19QQVRfVFJJRV9OT0RFX0lURVJBVE9SX0NfREVDCQkJXAorICAgIHBhdF90cmllX25vZGVfaXRfPAkJCQkJCVwKKwkJCQkJTm9kZSwJCQlcCisJCQkJCUxlYWYsCQkJXAorCQkJCQlIZWFkLAkJCVwKKwkJCQkJSW50ZXJuYWxfTm9kZSwJCVwKKwkJCQkJQ29uc3RfSXRlcmF0b3IsCQlcCisJCQkJCUl0ZXJhdG9yLAkJXAorCQkJCQlFX0FjY2Vzc19UcmFpdHMsCVwKKwkJCQkJQWxsb2NhdG9yPgorCisgICAgLy8gQ29uc3Qgbm9kZSBpdGVyYXRvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLAorCSAgICAgY2xhc3MgTGVhZiwKKwkgICAgIGNsYXNzIEhlYWQsCisJICAgICBjbGFzcyBJbnRlcm5hbF9Ob2RlLAorCSAgICAgY2xhc3MgQ29uc3RfSXRlcmF0b3IsCisJICAgICBjbGFzcyBJdGVyYXRvciwKKwkgICAgIGNsYXNzIEVfQWNjZXNzX1RyYWl0cywKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBwYXRfdHJpZV9jb25zdF9ub2RlX2l0XworICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIE5vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlMZWFmPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X2xlYWZfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJTGVhZj46Om90aGVyOjpwb2ludGVyCisgICAgICBsZWFmX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCUludGVybmFsX05vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgaW50ZXJuYWxfbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlJbnRlcm5hbF9Ob2RlPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJRV9BY2Nlc3NfVHJhaXRzPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyOworCisgICAgcHJpdmF0ZToKKyAgICAgIGlubGluZSB0eXBlbmFtZSBFX0FjY2Vzc19UcmFpdHM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICBwcmVmX2JlZ2luKCkgY29uc3QKKyAgICAgIHsKKwlpZiAobV9wX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisJICByZXR1cm4gKG1fcF90cmFpdHMtPmJlZ2luKAorCQkJCSAgICBtX3BfdHJhaXRzLT5leHRyYWN0X2tleSgKKwkJCQkJCQkgICAgc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPihtX3BfbmQpLT52YWx1ZSgpKSkpOworCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisKKwlyZXR1cm4gKHN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4obV9wX25kKS0+cHJlZl9iX2l0KCkpOworICAgICAgfQorCisgICAgICBpbmxpbmUgdHlwZW5hbWUgRV9BY2Nlc3NfVHJhaXRzOjpjb25zdF9pdGVyYXRvcgorICAgICAgcHJlZl9lbmQoKSBjb25zdAorICAgICAgeworCWlmIChtX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKwkgIHJldHVybiAobV9wX3RyYWl0cy0+ZW5kKAorCQkJCSAgbV9wX3RyYWl0cy0+ZXh0cmFjdF9rZXkoCisJCQkJCQkJICBzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KG1fcF9uZCktPnZhbHVlKCkpKSk7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfaW50ZXJuYWxfbm9kZV90eXBlKTsKKworCXJldHVybiAoc3RhdGljX2Nhc3Q8Y29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyPihtX3BfbmQpLT5wcmVmX2VfaXQoKSk7CisgICAgICB9CisKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vIFNpemUgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgICAvLyBDYXRlZ29yeS4KKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIC8vIERpZmZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgICAgICAvLyBfX0l0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgICAgIHR5cGVkZWYgQ29uc3RfSXRlcmF0b3IgdmFsdWVfdHlwZTsKKworICAgICAgLy8gX19JdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlIHJlZmVyZW5jZTsKKworICAgICAgLy8gX19JdGVyYXRvcidzIF9fY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUgY29uc3RfcmVmZXJlbmNlOworCisgICAgICAvLyBFbGVtZW50IGFjY2VzcyB0cmFpdHMuCisgICAgICB0eXBlZGVmIEVfQWNjZXNzX1RyYWl0cyBlX2FjY2Vzc190cmFpdHM7CisKKyAgICAgIC8vIEEga2V5J3MgZWxlbWVudCBfX2NvbnN0IGl0ZXJhdG9yLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIE1ldGFkYXRhIHR5cGUuCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGU6Om1ldGFkYXRhX3R5cGUgbWV0YWRhdGFfdHlwZTsKKworICAgICAgLy8gQ29uc3QgbWV0YWRhdGEgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwltZXRhZGF0YV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgLyoKKwlpbmxpbmUKKwlwYXRfdHJpZV9jb25zdF9ub2RlX2l0XygpCisgICAgICAqLworICAgICAgaW5saW5lCisgICAgICBwYXRfdHJpZV9jb25zdF9ub2RlX2l0Xyhub2RlX3BvaW50ZXIgcF9uZCA9IDAsICAKKwkJCSAgICAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyIHBfdHJhaXRzID0gMCkgCisgICAgICA6IG1fcF9uZChjb25zdF9jYXN0PG5vZGVfcG9pbnRlcj4ocF9uZCkpLCBtX3BfdHJhaXRzKHBfdHJhaXRzKQorICAgICAgeyB9CisKKyAgICAgIC8vIFN1YnRyZWUgdmFsaWQgcHJlZml4LgorICAgICAgaW5saW5lIHN0ZDo6cGFpcjxjb25zdF9lX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yPgorICAgICAgdmFsaWRfcHJlZml4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHByZWZfYmVnaW4oKSwgcHJlZl9lbmQoKSk7IH0KKworICAgICAgLy8gQ29uc3QgYWNjZXNzOyByZXR1cm5zIHRoZSBfX2NvbnN0IGl0ZXJhdG9yKiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIC8vIHRoZSBjdXJyZW50IGxlYWYuCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChudW1fY2hpbGRyZW4oKSA9PSAwKTsKKwlyZXR1cm4gQ29uc3RfSXRlcmF0b3IobV9wX25kKTsKKyAgICAgIH0KKworICAgICAgLy8gTWV0YWRhdGEgYWNjZXNzLgorICAgICAgaW5saW5lIGNvbnN0X21ldGFkYXRhX3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZC0+Z2V0X21ldGFkYXRhKCk7IH0KKworICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUuCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBudW1fY2hpbGRyZW4oKSBjb25zdAorICAgICAgeworCWlmIChtX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKwkgIHJldHVybiAwOworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpOworCXJldHVybiBzdGQ6OmRpc3RhbmNlKHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4obV9wX25kKS0+YmVnaW4oKSwgIHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4obV9wX25kKS0+ZW5kKCkpOworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIGEgX19jb25zdCBub2RlIF9faXRlcmF0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSdzCisgICAgICAvLyBpLXRoIGNoaWxkLgorICAgICAgUEJfRFNfUEFUX1RSSUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQworICAgICAgZ2V0X2NoaWxkKHNpemVfdHlwZSBpKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9pbnRlcm5hbF9ub2RlX3R5cGUpOworCXR5cGVuYW1lIEludGVybmFsX05vZGU6Oml0ZXJhdG9yIGl0ID0KKwkgIHN0YXRpY19jYXN0PGludGVybmFsX25vZGVfcG9pbnRlcj4obV9wX25kKS0+YmVnaW4oKTsKKworCXN0ZDo6YWR2YW5jZShpdCwgaSk7CisJcmV0dXJuIFBCX0RTX1BBVF9UUklFX0NPTlNUX05PREVfSVRFUkFUT1JfQ19ERUMoKml0LCBtX3BfdHJhaXRzKTsKKyAgICAgIH0KKworICAgICAgLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19QQVRfVFJJRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIChtX3BfbmQgPT0gb3RoZXIubV9wX25kKTsgfQorCisgICAgICAvLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBQQl9EU19QQVRfVFJJRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDJiBvdGhlcikgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fcF9uZCAhPSBvdGhlci5tX3BfbmQ7IH0KKworICAgIHByaXZhdGU6CisKKyAgICAgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKKworICAgIHB1YmxpYzoKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbmQ7CisKKyAgICAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyIG1fcF90cmFpdHM7CisgICAgfTsKKworICAgIC8vIE5vZGUgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZSwKKwkgICAgIGNsYXNzIExlYWYsCisJICAgICBjbGFzcyBIZWFkLAorCSAgICAgY2xhc3MgSW50ZXJuYWxfTm9kZSwKKwkgICAgIGNsYXNzIENvbnN0X0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgSXRlcmF0b3IsCisJICAgICBjbGFzcyBFX0FjY2Vzc19UcmFpdHMsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgcGF0X3RyaWVfbm9kZV9pdF8gOiAKKyAgICAgIHB1YmxpYyBQQl9EU19QQVRfVFJJRV9DT05TVF9OT0RFX0lURVJBVE9SX0NfREVDCisKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgTm9kZT46Om90aGVyOjpwb2ludGVyCisgICAgICBub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgSXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgUEJfRFNfUEFUX1RSSUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQyBiYXNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfZV9hY2Nlc3NfdHJhaXRzX3BvaW50ZXIKKyAgICAgIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aW50ZXJuYWxfbm9kZV9wb2ludGVyIGludGVybmFsX25vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKworICAgICAgLy8gU2l6ZSB0eXBlLgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfUEFUX1RSSUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQzo6c2l6ZV90eXBlCisgICAgICBzaXplX3R5cGU7CisKKyAgICAgIC8vIF9fSXRlcmF0b3IncyB2YWx1ZSB0eXBlLgorICAgICAgdHlwZWRlZiBJdGVyYXRvciB2YWx1ZV90eXBlOworCisgICAgICAvLyBfX0l0ZXJhdG9yJ3MgcmVmZXJlbmNlIHR5cGUuCisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUgcmVmZXJlbmNlOworCisgICAgICAvLyBfX0l0ZXJhdG9yJ3MgX19jb25zdCByZWZlcmVuY2UgdHlwZS4KKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAvKgorCWlubGluZQorCXBhdF90cmllX25vZGVfaXRfKCkgOworICAgICAgKi8KKworICAgICAgaW5saW5lCisgICAgICBwYXRfdHJpZV9ub2RlX2l0Xyhub2RlX3BvaW50ZXIgcF9uZCA9IDAsICBjb25zdF9lX2FjY2Vzc190cmFpdHNfcG9pbnRlciBwX3RyYWl0cyA9IDApIDogYmFzZV90eXBlKHBfbmQsIHBfdHJhaXRzKQorICAgICAgeyB9CisKKyAgICAgIC8vIEFjY2VzczsgcmV0dXJucyB0aGUgaXRlcmF0b3IqICBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbGVhZi4KKyAgICAgIGlubGluZSByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bnVtX2NoaWxkcmVuKCkgPT0gMCk7CisJcmV0dXJuIEl0ZXJhdG9yKGJhc2VfdHlwZTo6bV9wX25kKTsKKworICAgICAgfQorCisgICAgICAvLyBSZXR1cm5zIGEgbm9kZSBfX2l0ZXJhdG9yIHRvIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUncyBpLXRoIGNoaWxkLgorICAgICAgUEJfRFNfUEFUX1RSSUVfTk9ERV9JVEVSQVRPUl9DX0RFQworICAgICAgZ2V0X2NoaWxkKHNpemVfdHlwZSBpKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fcF9uZC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisKKwl0eXBlbmFtZSBJbnRlcm5hbF9Ob2RlOjppdGVyYXRvciBpdCA9CisJICBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KGJhc2VfdHlwZTo6bV9wX25kKS0+YmVnaW4oKTsKKworCXN0ZDo6YWR2YW5jZShpdCwgaSk7CisJcmV0dXJuIFBCX0RTX1BBVF9UUklFX05PREVfSVRFUkFUT1JfQ19ERUMoKml0LCBiYXNlX3R5cGU6Om1fcF90cmFpdHMpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKKyAgICB9OworCisjdW5kZWYgUEJfRFNfUEFUX1RSSUVfQ09OU1RfTk9ERV9JVEVSQVRPUl9DX0RFQworI3VuZGVmIFBCX0RTX1BBVF9UUklFX05PREVfSVRFUkFUT1JfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL25vZGVfbWV0YWRhdGFfYmFzZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL25vZGVfbWV0YWRhdGFfYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyNzJlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbm9kZV9tZXRhZGF0YV9iYXNlLmhwcApAQCAtMCwwICsxLDg2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBub2RlX21ldGFkYXRhX2Jhc2UuaHBwCisgKiBDb250YWlucyBhbiBpbnRlcm5hbCBQQl9EU19CQVNFX0NfREVDIGZvciBhIHBhdHJpY2lhIHRyZWUuCisgKi8KKworI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9OT0RFX01FVEFEQVRBX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX1BBVF9UUklFX05PREVfTUVUQURBVEFfQkFTRV9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YSwgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBwYXRfdHJpZV9ub2RlX21ldGFkYXRhX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBNZXRhZGF0YSBtZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwltZXRhZGF0YV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgcHVibGljOgorICAgICAgaW5saW5lIGNvbnN0X21ldGFkYXRhX3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKG1fbWV0YWRhdGEpOworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgbWV0YWRhdGFfdHlwZSBtX21ldGFkYXRhOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgc3RydWN0IHBhdF90cmllX25vZGVfbWV0YWRhdGFfYmFzZTwKKyAgICAgIG51bGxfbm9kZV9tZXRhZGF0YSwKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBudWxsX25vZGVfbWV0YWRhdGEgbWV0YWRhdGFfdHlwZTsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9OT0RFX0JBU0VfSFBQCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcGF0X3RyaWVfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU5ZTMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wYXRfdHJpZV8uaHBwCkBAIC0wLDAgKzEsNTE1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwYXRfdHJpZV8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSBwYXRyaWNpYSB0cmVlLgorICovCisKKy8qKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBsb29zZWx5IGJvcnJvd3MgaWRlYXMgZnJvbToKKyAqIDEpIEZhc3QgTWVyZ2VhYmxlIEludGVnZXIgTWFwcywgT2thc2FraSwgR2lsbCAxOTk4CisgKiAyKSBQdHNldDogU2V0cyBvZiBpbnRlZ2VycyBpbXBsZW1lbnRlZCBhcyBQYXRyaWNpYSB0cmVlcywKKyAqICAgIEplYW4tQ2hyaXN0b3BoZSBGaWxsaWF0ciwgMjAwMAorICoqLworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3ludGhfZV9hY2Nlc3NfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9ub2RlX2Jhc2UuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9leGNlcHRpb24uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2VxX2ZuL2VxX2J5X2xlc3MuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvZGVidWdfbWFwX2Jhc2UuaHBwPgorI2VuZGlmIAorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywgXAorCSAgICAgdHlwZW5hbWUgQWxsb2NhdG9yPgorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIHBhdF90cmllX2RhdGFfCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIHBhdF90cmllX25vX2RhdGFfCisjZW5kaWYgCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIFBCX0RTX0NMQVNTX05BTUU8S2V5LCBNYXBwZWQsIE5vZGVfQW5kX0l0X1RyYWl0cywgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQyBcCisgICAgdHlwZXNfdHJhaXRzPEtleSwgTWFwcGVkLCBBbGxvY2F0b3IsIGZhbHNlPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfREVCVUdfTUFQX0JBU0VfQ19ERUMgXAorICAgIGRlYnVnX21hcF9iYXNlPEtleSwJZXFfYnlfbGVzczxLZXksIFwKKwkJCXN0ZDo6bGVzczxLZXk+ID4sIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPEtleT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2U+CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1YyRihYKSAoWCkuZmlyc3QKKyNkZWZpbmUgUEJfRFNfVjJTKFgpIChYKS5zZWNvbmQKKyNkZWZpbmUgUEJfRFNfRVAyVlAoWCkmICgoWCktPm1fdmFsdWUpCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpCisjZGVmaW5lIFBCX0RTX1YyUyhYKSBNYXBwZWRfRGF0YSgpCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlLmZpcnN0KQorI2VuZGlmIAorCisgICAgLyoqCisgICAgICogY2xhc3MgZGVzY3JpcHRpb24gPSBQQVRSSUNJQSB0cmllIGltcGxlbWVudGF0aW9uLiI+CisgICAgICoqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0cywKKwkgICAgIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBQQl9EU19DTEFTU19OQU1FIDoKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgcHVibGljIFBCX0RTX0RFQlVHX01BUF9CQVNFX0NfREVDLAorI2VuZGlmIAorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6c3ludGhfZV9hY2Nlc3NfdHJhaXRzLAorICAgICAgcHVibGljIE5vZGVfQW5kX0l0X1RyYWl0czo6bm9kZV91cGRhdGUsCisgICAgICBwdWJsaWMgUEJfRFNfVFlQRVNfVFJBSVRTX0NfREVDCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIFBCX0RTX1RZUEVTX1RSQUlUU19DX0RFQyB0cmFpdHNfYmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6OnN5bnRoX2VfYWNjZXNzX3RyYWl0cyBzeW50aF9lX2FjY2Vzc190cmFpdHM7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPHN5bnRoX2VfYWNjZXNzX3RyYWl0cz46Om90aGVyOjpjb25zdF9wb2ludGVyIGNvbnN0X2VfYWNjZXNzX3RyYWl0c19wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzeW50aF9lX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpub2RlIG5vZGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPG5vZGU+OjpvdGhlcjo6Y29uc3RfcG9pbnRlciBjb25zdF9ub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8bm9kZT46Om90aGVyOjpwb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6OmhlYWQgaGVhZDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8aGVhZD46Om90aGVyIGhlYWRfYWxsb2NhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBoZWFkX2FsbG9jYXRvcjo6cG9pbnRlciBoZWFkX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpsZWFmIGxlYWY7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGxlYWY+OjpvdGhlciBsZWFmX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbGVhZl9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfbGVhZl9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBsZWFmX2FsbG9jYXRvcjo6cG9pbnRlciBsZWFmX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjppbnRlcm5hbF9ub2RlIGludGVybmFsX25vZGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGludGVybmFsX25vZGU+OjpvdGhlciBpbnRlcm5hbF9ub2RlX2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaW50ZXJuYWxfbm9kZV9hbGxvY2F0b3I6OmNvbnN0X3BvaW50ZXIgY29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpbnRlcm5hbF9ub2RlX2FsbG9jYXRvcjo6cG9pbnRlciBpbnRlcm5hbF9ub2RlX3BvaW50ZXI7CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jb25kX2R0b3JfZW50cnlfZGVhbHRvci5ocHA+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgdHlwZWRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQyBkZWJ1Z19iYXNlOworI2VuZGlmIAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfam9pbl9icmFuY2hfYmFnLmhwcD4KKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om51bGxfbm9kZV91cGRhdGVfcG9pbnRlciBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHBhdF90cmllX3RhZyBjb250YWluZXJfY2F0ZWdvcnk7CisgICAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6a2V5X3BvaW50ZXIga2V5X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9rZXlfcG9pbnRlciBjb25zdF9rZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X2tleV9yZWZlcmVuY2UgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfYmFzZTo6bWFwcGVkX3BvaW50ZXIgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9tYXBwZWRfcG9pbnRlciBjb25zdF9tYXBwZWRfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6Om1hcHBlZF9yZWZlcmVuY2UgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X21hcHBlZF9yZWZlcmVuY2UgY29uc3RfbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX2Jhc2U6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c19iYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6Y29uc3RfaXRlcmF0b3IgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6aXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0X3BvaW50X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBwb2ludF9pdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfQW5kX0l0X1RyYWl0czo6Y29uc3Rfbm9kZV9pdGVyYXRvciBjb25zdF9ub2RlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfaXRlcmF0b3Igbm9kZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzOjplX2FjY2Vzc190cmFpdHMgZV9hY2Nlc3NfdHJhaXRzOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHM6Om5vZGVfdXBkYXRlIG5vZGVfdXBkYXRlOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKCk7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgZV9hY2Nlc3NfdHJhaXRzJik7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB+UEJfRFNfQ0xBU1NfTkFNRSgpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0OworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0OworCisgICAgICBlX2FjY2Vzc190cmFpdHMmIAorICAgICAgZ2V0X2VfYWNjZXNzX3RyYWl0cygpOworCisgICAgICBjb25zdCBlX2FjY2Vzc190cmFpdHMmIAorICAgICAgZ2V0X2VfYWNjZXNzX3RyYWl0cygpIGNvbnN0OworCisgICAgICBub2RlX3VwZGF0ZSYgCisgICAgICBnZXRfbm9kZV91cGRhdGUoKTsKKworICAgICAgY29uc3Qgbm9kZV91cGRhdGUmIAorICAgICAgZ2V0X25vZGVfdXBkYXRlKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJcmV0dXJuIGluc2VydChzdGQ6Om1ha2VfcGFpcihyX2tleSwgbWFwcGVkX3R5cGUoKSkpLmZpcnN0LT5zZWNvbmQ7CisjZWxzZSAKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiB0cmFpdHNfYmFzZTo6c19udWxsX21hcHBlZDsKKyNlbmRpZiAKKyAgICAgIH0KKworICAgICAgaW5saW5lIHBvaW50X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgY29uc3RfcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Rfa2V5X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvcik7CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yKTsKKyNlbmRpZiAKKworICAgICAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X3JldmVyc2VfaXRlcmF0b3IpOworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIGVyYXNlKHJldmVyc2VfaXRlcmF0b3IpOworI2VuZGlmIAorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXQoY29uc3Rfa2V5X3JlZmVyZW5jZSwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBiZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBpdGVyYXRvcgorICAgICAgZW5kKCk7CisKKyAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKTsKKworICAgICAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpOworCisgICAgICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0OworCisgICAgICBpbmxpbmUgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0OworCisgICAgICBpbmxpbmUgbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpOworCisgICAgICBpbmxpbmUgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9lbmQoKSBjb25zdDsKKworICAgICAgaW5saW5lIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCk7CisKKyNpZmRlZiBQQl9EU19QQVRfVFJJRV9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHZhbHVlX3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWN1cnNpdmVfY29weV9ub2RlKGNvbnN0X25vZGVfcG9pbnRlcik7CisKKyAgICBwcml2YXRlOgorCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhcHBseV91cGRhdGUobm9kZV9wb2ludGVyLCBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXIpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYXBwbHlfdXBkYXRlKG5vZGVfcG9pbnRlciwgTm9kZV9VcGRhdGVfKik7CisKKyAgICAgIGJvb2wKKyAgICAgIGpvaW5fcHJlcChQQl9EU19DTEFTU19DX0RFQyYsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKGNvbnN0X25vZGVfcG9pbnRlciwgY29uc3Rfbm9kZV9wb2ludGVyLCAKKwkJICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKGNvbnN0X2xlYWZfcG9pbnRlciwgY29uc3RfbGVhZl9wb2ludGVyLCAKKwkJICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKGNvbnN0X2xlYWZfcG9pbnRlciwgY29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyLCAKKwkJICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlciwgY29uc3RfbGVhZl9wb2ludGVyLCAKKwkJICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICByZWNfam9pbl9wcmVwKGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlciwgY29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyLCAKKwkJICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBzaXplX3R5cGUsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKGxlYWZfcG9pbnRlciwgbGVhZl9wb2ludGVyLCBzcGxpdF9qb2luX2JyYW5jaF9iYWcmKTsKKworICAgICAgbm9kZV9wb2ludGVyCisgICAgICByZWNfam9pbihsZWFmX3BvaW50ZXIsIGludGVybmFsX25vZGVfcG9pbnRlciwgc2l6ZV90eXBlLCAKKwkgICAgICAgc3BsaXRfam9pbl9icmFuY2hfYmFnJik7CisKKyAgICAgIG5vZGVfcG9pbnRlcgorICAgICAgcmVjX2pvaW4oaW50ZXJuYWxfbm9kZV9wb2ludGVyLCBsZWFmX3BvaW50ZXIsIHNpemVfdHlwZSwgCisJICAgICAgIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19qb2luKGludGVybmFsX25vZGVfcG9pbnRlciwgaW50ZXJuYWxfbm9kZV9wb2ludGVyLCAKKwkgICAgICAgc3BsaXRfam9pbl9icmFuY2hfYmFnJik7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAga2V5c19kaWZmX2luZCh0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgaW50ZXJuYWxfbm9kZV9wb2ludGVyCisgICAgICBpbnNlcnRfYnJhbmNoKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBzcGxpdF9qb2luX2JyYW5jaF9iYWcmKTsKKworICAgICAgdm9pZAorICAgICAgdXBkYXRlX21pbl9tYXhfZm9yX2luc2VydGVkX2xlYWYobGVhZl9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgZXJhc2VfbGVhZihsZWFmX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgYWN0dWFsX2VyYXNlX2xlYWYobGVhZl9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgY2xlYXJfaW1wKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlX2ZpeHVwKGludGVybmFsX25vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbGVhZihsZWFmX3BvaW50ZXIpOworCisgICAgICBzdGF0aWMgaW5saW5lIGNvbnN0X2VfaXRlcmF0b3IKKyAgICAgIHByZWZfYmVnaW4oY29uc3Rfbm9kZV9wb2ludGVyKTsKKworICAgICAgc3RhdGljIGlubGluZSBjb25zdF9lX2l0ZXJhdG9yCisgICAgICBwcmVmX2VuZChjb25zdF9ub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBmaW5kX2ltcChjb25zdF9rZXlfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgbG93ZXJfYm91bmRfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICB1cHBlcl9ib3VuZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBzdGF0aWMgY29uc3RfbGVhZl9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KGNvbnN0X25vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGF0aWMgbGVhZl9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSBzdGF0aWMgY29uc3RfbGVhZl9wb2ludGVyCisgICAgICByaWdodG1vc3RfZGVzY2VuZGFudChjb25zdF9ub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgc3RhdGljIGxlYWZfcG9pbnRlcgorICAgICAgcmlnaHRtb3N0X2Rlc2NlbmRhbnQobm9kZV9wb2ludGVyKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X2l0ZXJhdG9ycygpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfcmV2ZXJzZV9pdGVyYXRvcnMoKSBjb25zdDsKKworICAgICAgc3RhdGljIHNpemVfdHlwZQorICAgICAgcmVjdXJzaXZlX2NvdW50X2xlYWZzKGNvbnN0X25vZGVfcG9pbnRlcik7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19QQVRfVFJJRV9UUkFDRV8KKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9ub2RlKGNvbnN0X25vZGVfcG9pbnRlciwgc2l6ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWV0YWRhdGFfPgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIHRyYWNlX25vZGVfbWV0YWRhdGEoY29uc3Rfbm9kZV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9ub2RlX21ldGFkYXRhKGNvbnN0X25vZGVfcG9pbnRlciwgdHlwZV90b190eXBlPG51bGxfbm9kZV9tZXRhZGF0YT4pOworI2VuZGlmIAorCisgICAgICBsZWFmX3BvaW50ZXIKKyAgICAgIHNwbGl0X3ByZXAoY29uc3Rfa2V5X3JlZmVyZW5jZSwgUEJfRFNfQ0xBU1NfQ19ERUMmLCAKKwkJIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICBub2RlX3BvaW50ZXIKKyAgICAgIHJlY19zcGxpdChub2RlX3BvaW50ZXIsIGNvbnN0X2VfaXRlcmF0b3IsIGNvbnN0X2VfaXRlcmF0b3IsIAorCQlQQl9EU19DTEFTU19DX0RFQyYsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYpOworCisgICAgICB2b2lkCisgICAgICBzcGxpdF9pbnNlcnRfYnJhbmNoKHNpemVfdHlwZSwgY29uc3RfZV9pdGVyYXRvciwgCisJCQkgIHR5cGVuYW1lIGludGVybmFsX25vZGU6Oml0ZXJhdG9yLCAKKwkJCSAgc2l6ZV90eXBlLCBzcGxpdF9qb2luX2JyYW5jaF9iYWcmKTsKKworICAgICAgc3RhdGljIGhlYWRfYWxsb2NhdG9yIHNfaGVhZF9hbGxvY2F0b3I7CisgICAgICBzdGF0aWMgaW50ZXJuYWxfbm9kZV9hbGxvY2F0b3Igc19pbnRlcm5hbF9ub2RlX2FsbG9jYXRvcjsKKyAgICAgIHN0YXRpYyBsZWFmX2FsbG9jYXRvciBzX2xlYWZfYWxsb2NhdG9yOworCisgICAgICBoZWFkX3BvaW50ZXIgbV9wX2hlYWQ7CisgICAgICBzaXplX3R5cGUgbV9zaXplOworICAgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pdGVyYXRvcnNfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vaW5zZXJ0X2pvaW5fZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9pbmZvX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vZGVidWdfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhY2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX05BTUUKKyN1bmRlZiBQQl9EU19UWVBFU19UUkFJVFNfQ19ERUMKKyN1bmRlZiBQQl9EU19ERUJVR19NQVBfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX1YyRgorI3VuZGVmIFBCX0RTX0VQMlZQCisjdW5kZWYgUEJfRFNfVjJTCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BvaW50X2l0ZXJhdG9ycy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlMTUwNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcG9pbnRfaXRlcmF0b3JzLmhwcApAQCAtMCwwICsxLDQ4NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcG9pbnRfaXRlcmF0b3JzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGJpbl9zZWFyY2hfdHJlZV8uCisgKi8KKworI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9GSU5EX0lURVJBVE9SU19IUFAKKyNkZWZpbmUgUEJfRFNfUEFUX1RSSUVfRklORF9JVEVSQVRPUlNfSFBQCisKKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19DT05TVF9JVF9DX0RFQwkJCQkJXAorICAgIHBhdF90cmllX2NvbnN0X2l0XzwJCQkJCQlcCisJCQkJCVR5cGVfVHJhaXRzLAkJXAorCQkJCQlOb2RlLAkJCVwKKwkJCQkJTGVhZiwJCQlcCisJCQkJCUhlYWQsCQkJXAorCQkJCQlJbnRlcm5hbF9Ob2RlLAkJXAorCQkJCQlJc19Gb3J3YXJkX0l0ZXJhdG9yLAlcCisJCQkJCUFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19DT05TVF9PRElSX0lUX0NfREVDCQkJCVwKKyAgICBwYXRfdHJpZV9jb25zdF9pdF88CQkJCQkJXAorCQkJCQlUeXBlX1RyYWl0cywJCVwKKwkJCQkJTm9kZSwJCQlcCisJCQkJCUxlYWYsCQkJXAorCQkJCQlIZWFkLAkJCVwKKwkJCQkJSW50ZXJuYWxfTm9kZSwJCVwKKwkJCQkJIUlzX0ZvcndhcmRfSXRlcmF0b3IsCVwKKwkJCQkJQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0lUX0NfREVDCQkJCQkJCVwKKyAgICBwYXRfdHJpZV9pdF88CQkJCQkJCVwKKwkJCQkJCVR5cGVfVHJhaXRzLAkJXAorCQkJCQkJTm9kZSwJCQlcCisJCQkJCQlMZWFmLAkJCVwKKwkJCQkJCUhlYWQsCQkJXAorCQkJCQkJSW50ZXJuYWxfTm9kZSwJCVwKKwkJCQkJCUlzX0ZvcndhcmRfSXRlcmF0b3IsCVwKKwkJCQkJCUFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19PRElSX0lUX0NfREVDCQkJCQkJXAorICAgIHBhdF90cmllX2l0XzwJCQkJCQkJXAorCQkJCQkJVHlwZV9UcmFpdHMsCQlcCisJCQkJCQlOb2RlLAkJCVwKKwkJCQkJCUxlYWYsCQkJXAorCQkJCQkJSGVhZCwJCQlcCisJCQkJCQlJbnRlcm5hbF9Ob2RlLAkJXAorCQkJCQkJIUlzX0ZvcndhcmRfSXRlcmF0b3IsCVwKKwkJCQkJCUFsbG9jYXRvcj4KKworCisgICAgLy8gQ29uc3QgaXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsCisJICAgICBjbGFzcyBOb2RlLAorCSAgICAgY2xhc3MgTGVhZiwKKwkgICAgIGNsYXNzIEhlYWQsCisJICAgICBjbGFzcyBJbnRlcm5hbF9Ob2RlLAorCSAgICAgYm9vbCBJc19Gb3J3YXJkX0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIHBhdF90cmllX2NvbnN0X2l0XworICAgIHsKKworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIE5vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlMZWFmPjo6b3RoZXI6OmNvbnN0X3BvaW50ZXIKKyAgICAgIGNvbnN0X2xlYWZfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJTGVhZj46Om90aGVyOjpwb2ludGVyCisgICAgICBsZWFmX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCUhlYWQ+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgaGVhZF9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlJbnRlcm5hbF9Ob2RlPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIGludGVybmFsX25vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVfVHJhaXRzOjpwb2ludGVyIHBvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZV9UcmFpdHM6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgIHB1YmxpYzoKKworICAgICAgaW5saW5lCisgICAgICBwYXRfdHJpZV9jb25zdF9pdF8obm9kZV9wb2ludGVyIHBfbmQgPSAwKSA6IG1fcF9uZChwX25kKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZQorICAgICAgcGF0X3RyaWVfY29uc3RfaXRfKGNvbnN0IFBCX0RTX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKSAKKyAgICAgIDogbV9wX25kKG90aGVyLm1fcF9uZCkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUKKyAgICAgIFBCX0RTX0NPTlNUX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBQQl9EU19DT05TVF9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJbV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19DT05TVF9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJbV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSk7CisJcmV0dXJuICZzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KG1fcF9uZCktPnZhbHVlKCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9uZC0+bV90eXBlID09IHBhdF90cmllX2xlYWZfbm9kZV90eXBlKTsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihtX3BfbmQpLT52YWx1ZSgpOworICAgICAgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBQQl9EU19DT05TVF9JVF9DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiAobV9wX25kID09IG90aGVyLm1fcF9uZCk7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQyYgb3RoZXIpIGNvbnN0CisgICAgICB7IHJldHVybiAobV9wX25kID09IG90aGVyLm1fcF9uZCk7IH0KKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgUEJfRFNfQ09OU1RfSVRfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gKG1fcF9uZCAhPSBvdGhlci5tX3BfbmQpOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IFBCX0RTX0NPTlNUX09ESVJfSVRfQ19ERUMmIG90aGVyKSBjb25zdAorICAgICAgeyByZXR1cm4gKG1fcF9uZCAhPSBvdGhlci5tX3BfbmQpOyB9CisKKyAgICAgIGlubGluZSBQQl9EU19DT05TVF9JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlpbmMoaW50ZWdyYWxfY29uc3RhbnQ8aW50LElzX0ZvcndhcmRfSXRlcmF0b3I+KCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX0NPTlNUX0lUX0NfREVDCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlQQl9EU19DT05TVF9JVF9DX0RFQyByZXRfaXQobV9wX25kKTsKKwlvcGVyYXRvcisrKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX0NPTlNUX0lUX0NfREVDJiAKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworCWRlYyhpbnRlZ3JhbF9jb25zdGFudDxpbnQsSXNfRm9yd2FyZF9JdGVyYXRvcj4oKSk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfQ09OU1RfSVRfQ19ERUMKKyAgICAgIG9wZXJhdG9yLS0oaW50KQorICAgICAgeworCVBCX0RTX0NPTlNUX0lUX0NfREVDIHJldF9pdChtX3BfbmQpOworCW9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGluYyhmYWxzZV90eXBlKQorICAgICAgeyBkZWModHJ1ZV90eXBlKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluYyh0cnVlX3R5cGUpCisgICAgICB7CisJaWYgKG1fcF9uZC0+bV90eXBlID09IHBhdF90cmllX2hlYWRfbm9kZV90eXBlKQorCSAgeworCSAgICBtX3BfbmQgPSBzdGF0aWNfY2FzdDxoZWFkX3BvaW50ZXI+KG1fcF9uZCktPm1fcF9taW47CisJICAgIHJldHVybjsKKwkgIH0KKworCW5vZGVfcG9pbnRlciBwX3kgPSBtX3BfbmQtPm1fcF9wYXJlbnQ7CisJd2hpbGUgKHBfeS0+bV90eXBlICE9IHBhdF90cmllX2hlYWRfbm9kZV90eXBlICYmIAorCSAgICAgICBnZXRfbGFyZ2VyX3NpYmxpbmcobV9wX25kKSA9PSAwKQorCSAgeworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHBfeSA9IHBfeS0+bV9wX3BhcmVudDsKKwkgIH0KKworCWlmIChwX3ktPm1fdHlwZSA9PSBwYXRfdHJpZV9oZWFkX25vZGVfdHlwZSkKKwkgIHsKKwkgICAgbV9wX25kID0gcF95OworCSAgICByZXR1cm47CisJICB9CisJbV9wX25kID0gbGVmdG1vc3RfZGVzY2VuZGFudChnZXRfbGFyZ2VyX3NpYmxpbmcobV9wX25kKSk7CisgICAgICB9CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBkZWMoZmFsc2VfdHlwZSkKKyAgICAgIHsgaW5jKHRydWVfdHlwZSgpKTsgfQorCisgICAgICB2b2lkCisgICAgICBkZWModHJ1ZV90eXBlKQorICAgICAgeworCWlmIChtX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9oZWFkX25vZGVfdHlwZSkKKwkgIHsKKwkgICAgbV9wX25kID0gc3RhdGljX2Nhc3Q8aGVhZF9wb2ludGVyPihtX3BfbmQpLT5tX3BfbWF4OworCSAgICByZXR1cm47CisJICB9CisKKwlub2RlX3BvaW50ZXIgcF95ID0gbV9wX25kLT5tX3BfcGFyZW50OworCXdoaWxlIChwX3ktPm1fdHlwZSAhPSBwYXRfdHJpZV9oZWFkX25vZGVfdHlwZSAmJiAKKwkgICAgICAgZ2V0X3NtYWxsZXJfc2libGluZyhtX3BfbmQpID09IDApCisJICB7CisJICAgIG1fcF9uZCA9IHBfeTsKKwkgICAgcF95ID0gcF95LT5tX3BfcGFyZW50OworCSAgfQorCisJaWYgKHBfeS0+bV90eXBlID09IHBhdF90cmllX2hlYWRfbm9kZV90eXBlKQorCSAgeworCSAgICBtX3BfbmQgPSBwX3k7CisJICAgIHJldHVybjsKKwkgIH0KKwltX3BfbmQgPSByaWdodG1vc3RfZGVzY2VuZGFudChnZXRfc21hbGxlcl9zaWJsaW5nKG1fcF9uZCkpOworICAgICAgfQorCisgICAgICBpbmxpbmUgc3RhdGljIG5vZGVfcG9pbnRlcgorICAgICAgZ2V0X2xhcmdlcl9zaWJsaW5nKG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWludGVybmFsX25vZGVfcG9pbnRlciBwX3BhcmVudCA9CisJICBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQtPm1fcF9wYXJlbnQpOworCisJdHlwZW5hbWUgSW50ZXJuYWxfTm9kZTo6aXRlcmF0b3IgaXQgPSBwX3BhcmVudC0+YmVnaW4oKTsKKwl3aGlsZSAoKml0ICE9IHBfbmQpCisJICArK2l0OworCisJdHlwZW5hbWUgSW50ZXJuYWxfTm9kZTo6aXRlcmF0b3IgbmV4dF9pdCA9IGl0OworCSsrbmV4dF9pdDsKKwlyZXR1cm4gKChuZXh0X2l0ID09IHBfcGFyZW50LT5lbmQoKSk/IDAgOiogbmV4dF9pdCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBzdGF0aWMgbm9kZV9wb2ludGVyCisgICAgICBnZXRfc21hbGxlcl9zaWJsaW5nKG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWludGVybmFsX25vZGVfcG9pbnRlciBwX3BhcmVudCA9CisJICBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQtPm1fcF9wYXJlbnQpOworCisJdHlwZW5hbWUgSW50ZXJuYWxfTm9kZTo6aXRlcmF0b3IgaXQgPSBwX3BhcmVudC0+YmVnaW4oKTsKKworCWlmICgqaXQgPT0gcF9uZCkKKwkgIHJldHVybiAoMCk7CisJdHlwZW5hbWUgSW50ZXJuYWxfTm9kZTo6aXRlcmF0b3IgcHJldl9pdDsKKwlkbworCSAgeworCSAgICBwcmV2X2l0ID0gaXQ7CisJICAgICsraXQ7CisJICAgIGlmICgqaXQgPT0gcF9uZCkKKwkgICAgICByZXR1cm4gKCpwcmV2X2l0KTsKKwkgIH0KKwl3aGlsZSAodHJ1ZSk7CisKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoZmFsc2UpOworCXJldHVybiAoMCk7CisgICAgICB9CisKKyAgICAgIGlubGluZSBzdGF0aWMgbGVhZl9wb2ludGVyCisgICAgICBsZWZ0bW9zdF9kZXNjZW5kYW50KG5vZGVfcG9pbnRlciBwX25kKQorICAgICAgeworCWlmIChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisJICByZXR1cm4gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKTsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX25kKS0+bGVmdG1vc3RfZGVzY2VuZGFudCgpOworICAgICAgfQorCisgICAgICBpbmxpbmUgc3RhdGljIGxlYWZfcG9pbnRlcgorICAgICAgcmlnaHRtb3N0X2Rlc2NlbmRhbnQobm9kZV9wb2ludGVyIHBfbmQpCisgICAgICB7CisJaWYgKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKwkgIHJldHVybiBzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KHBfbmQpOworCXJldHVybiBzdGF0aWNfY2FzdDxpbnRlcm5hbF9ub2RlX3BvaW50ZXI+KHBfbmQpLT5yaWdodG1vc3RfZGVzY2VuZGFudCgpOworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgbm9kZV9wb2ludGVyIG1fcF9uZDsKKyAgICB9OworCisgICAgLy8gSXRlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsCisJICAgICBjbGFzcyBOb2RlLAorCSAgICAgY2xhc3MgTGVhZiwKKwkgICAgIGNsYXNzIEhlYWQsCisJICAgICBjbGFzcyBJbnRlcm5hbF9Ob2RlLAorCSAgICAgYm9vbCBJc19Gb3J3YXJkX0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIHBhdF90cmllX2l0XyA6IAorICAgICAgcHVibGljIFBCX0RTX0NPTlNUX0lUX0NfREVDCisKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgTm9kZT46Om90aGVyOjpwb2ludGVyCisgICAgICBub2RlX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCUxlYWY+OjpvdGhlcjo6Y29uc3RfcG9pbnRlcgorICAgICAgY29uc3RfbGVhZl9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwlMZWFmPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIGxlYWZfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJSGVhZD46Om90aGVyOjpwb2ludGVyCisgICAgICBoZWFkX3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCUludGVybmFsX05vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgaW50ZXJuYWxfbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVfVHJhaXRzOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZV9UcmFpdHM6OnBvaW50ZXIgcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlX1RyYWl0czo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgaW5saW5lCisgICAgICBwYXRfdHJpZV9pdF8obm9kZV9wb2ludGVyIHBfbmQgPSAwKSA6IFBCX0RTX0NPTlNUX0lUX0NfREVDKChub2RlX3BvaW50ZXIpcF9uZCkKKyAgICAgIHsgfQorCisgICAgICBpbmxpbmUKKyAgICAgIHBhdF90cmllX2l0Xyhjb25zdCBQQl9EU19PRElSX0lUX0NfREVDJiBvdGhlcikgOiBQQl9EU19DT05TVF9JVF9DX0RFQyhvdGhlci5tX3BfbmQpCisgICAgICB7IH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfSVRfQ19ERUMmIG90aGVyKQorICAgICAgeworCWJhc2VfaXRfdHlwZTo6bV9wX25kID0gb3RoZXIubV9wX25kOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lCisgICAgICBQQl9EU19JVF9DX0RFQyYgCisgICAgICBvcGVyYXRvcj0oY29uc3QgUEJfRFNfT0RJUl9JVF9DX0RFQyYgb3RoZXIpCisgICAgICB7CisJYmFzZV9pdF90eXBlOjptX3BfbmQgPSBvdGhlci5tX3BfbmQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfaXRfdHlwZTo6bV9wX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpOworCisJcmV0dXJuICZzdGF0aWNfY2FzdDxsZWFmX3BvaW50ZXI+KGJhc2VfaXRfdHlwZTo6bV9wX25kKS0+dmFsdWUoKTsKKyAgICAgIH0KKworICAgICAgaW5saW5lIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV9pdF90eXBlOjptX3BfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSk7CisJcmV0dXJuIHN0YXRpY19jYXN0PGxlYWZfcG9pbnRlcj4oYmFzZV9pdF90eXBlOjptX3BfbmQpLT52YWx1ZSgpOworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisJUEJfRFNfQ09OU1RfSVRfQ19ERUM6OgorCSAgb3BlcmF0b3IrKygpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5saW5lIFBCX0RTX0lUX0NfREVDCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlQQl9EU19JVF9DX0RFQyByZXRfaXQoYmFzZV9pdF90eXBlOjptX3BfbmQpOworCW9wZXJhdG9yKysoKTsKKwlyZXR1cm4gcmV0X2l0OworICAgICAgfQorCisgICAgICBpbmxpbmUgUEJfRFNfSVRfQ19ERUMmIAorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJUEJfRFNfQ09OU1RfSVRfQ19ERUM6Om9wZXJhdG9yLS0oKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGlubGluZSBQQl9EU19JVF9DX0RFQworICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisJUEJfRFNfSVRfQ19ERUMgcmV0X2l0KGJhc2VfaXRfdHlwZTo6bV9wX25kKTsKKwlvcGVyYXRvci0tKCk7CisJcmV0dXJuIHJldF9pdDsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgUEJfRFNfQ09OU1RfSVRfQ19ERUMgYmFzZV9pdF90eXBlOworCisgICAgICBmcmllbmQgY2xhc3MgUEJfRFNfQ0xBU1NfQ19ERUM7CisgICAgfTsKKworI3VuZGVmIFBCX0RTX0NPTlNUX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfQ09OU1RfT0RJUl9JVF9DX0RFQworI3VuZGVmIFBCX0RTX0lUX0NfREVDCisjdW5kZWYgUEJfRFNfT0RJUl9JVF9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcG9saWN5X2FjY2Vzc19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJmZTQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9wb2xpY3lfYWNjZXNzX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHBvbGljeV9hY2Nlc3NfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6ZV9hY2Nlc3NfdHJhaXRzJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9lX2FjY2Vzc190cmFpdHMoKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjplX2FjY2Vzc190cmFpdHMmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2VfYWNjZXNzX3RyYWl0cygpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfdXBkYXRlJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9ub2RlX3VwZGF0ZSgpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfdXBkYXRlJiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9ub2RlX3VwZGF0ZSgpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9yX2VyYXNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9yX2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMmViZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JfZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDMgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJfZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWN0dWFsX2VyYXNlX25vZGUobm9kZV9wb2ludGVyIHBfeikKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fc2l6ZSA+IDApOworICAtLW1fc2l6ZTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShlcmFzZV9leGlzdGluZyhQQl9EU19WMkYocF96LT5tX3ZhbHVlKSkpOworICBwX3otPn5ub2RlKCk7CisgIHNfbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShwX3osIDEpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbm9kZShub2RlX3BvaW50ZXIgcF96KQoreworICBpZiAobV9zaXplID09IDEpCisgICAgeworICAgICAgbV9wX2hlYWQtPm1fcF9sZWZ0ID0gbV9wX2hlYWQtPm1fcF9yaWdodCA9IG1fcF9oZWFkOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAobV9wX2hlYWQtPm1fcF9sZWZ0ID09IHBfeikKKyAgICB7CisgICAgICBpdGVyYXRvciBpdChwX3opOworICAgICAgKytpdDsKKyAgICAgIG1fcF9oZWFkLT5tX3BfbGVmdCA9IGl0Lm1fcF9uZDsKKyAgICB9CisgIGVsc2UgaWYgKG1fcF9oZWFkLT5tX3BfcmlnaHQgPT0gcF96KQorICAgIHsKKyAgICAgIGl0ZXJhdG9yIGl0KHBfeik7CisgICAgICAtLWl0OworICAgICAgbV9wX2hlYWQtPm1fcF9yaWdodCA9IGl0Lm1fcF9uZDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKHRydWUsIHRydWUpOykKKyAgY2xlYXJfaW1wKG1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgbV9zaXplID0gMDsKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGRlYnVnX2Jhc2U6OmNsZWFyKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCh0cnVlLCB0cnVlKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcl9pbXAobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworICBjbGVhcl9pbXAocF9uZC0+bV9wX2xlZnQpOworICBjbGVhcl9pbXAocF9uZC0+bV9wX3JpZ2h0KTsKKyAgcF9uZC0+fk5vZGUoKTsKKyAgc19ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbmQsIDEpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JvdGF0ZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vcm90YXRlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmNkYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3JvdGF0ZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDE1MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcm90YXRlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBpbXBzIGZvciByb3RhdGluZyBub2Rlcy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9sZWZ0KG5vZGVfcG9pbnRlciBwX3gpCit7CisgIG5vZGVfcG9pbnRlciBwX3kgPSBwX3gtPm1fcF9yaWdodDsKKyAgcF94LT5tX3BfcmlnaHQgPSBwX3ktPm1fcF9sZWZ0OworCisgIGlmIChwX3ktPm1fcF9sZWZ0ICE9IDApCisgICAgcF95LT5tX3BfbGVmdC0+bV9wX3BhcmVudCA9IHBfeDsKKworICBwX3ktPm1fcF9wYXJlbnQgPSBwX3gtPm1fcF9wYXJlbnQ7CisgIGlmIChwX3ggPT0gbV9wX2hlYWQtPm1fcF9wYXJlbnQpCisgICAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3k7CisgIGVsc2UgaWYgKHBfeCA9PSBwX3gtPm1fcF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3k7CisgIGVsc2UKKyAgICBwX3gtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfeTsKKworICBwX3ktPm1fcF9sZWZ0ID0gcF94OworICBwX3gtPm1fcF9wYXJlbnQgPSBwX3k7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF95KTspCisKKyAgYXBwbHlfdXBkYXRlKHBfeCwgKE5vZGVfVXBkYXRlKiApdGhpcyk7CisgIGFwcGx5X3VwZGF0ZShwX3gtPm1fcF9wYXJlbnQsIChOb2RlX1VwZGF0ZSogKXRoaXMpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JvdGF0ZV9yaWdodChub2RlX3BvaW50ZXIgcF94KQoreworICBub2RlX3BvaW50ZXIgcF95ID0gcF94LT5tX3BfbGVmdDsKKyAgcF94LT5tX3BfbGVmdCA9IHBfeS0+bV9wX3JpZ2h0OworCisgIGlmIChwX3ktPm1fcF9yaWdodCAhPSAwKQorICAgIHBfeS0+bV9wX3JpZ2h0LT5tX3BfcGFyZW50ID0gcF94OworCisgIHBfeS0+bV9wX3BhcmVudCA9IHBfeC0+bV9wX3BhcmVudDsKKyAgaWYgKHBfeCA9PSBtX3BfaGVhZC0+bV9wX3BhcmVudCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgZWxzZSBpZiAocF94ID09IHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0KQorICAgIHBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF95OworICBlbHNlCisgICAgcF94LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeTsKKworICBwX3ktPm1fcF9yaWdodCA9IHBfeDsKKyAgcF94LT5tX3BfcGFyZW50ID0gcF95OworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3gpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeSk7KQorCisgIGFwcGx5X3VwZGF0ZShwX3gsIChOb2RlX1VwZGF0ZSogKXRoaXMpOworICBhcHBseV91cGRhdGUocF94LT5tX3BfcGFyZW50LCAoTm9kZV9VcGRhdGUqICl0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cityb3RhdGVfcGFyZW50KG5vZGVfcG9pbnRlciBwX25kKQoreworICBub2RlX3BvaW50ZXIgcF9wYXJlbnQgPSBwX25kLT5tX3BfcGFyZW50OworICBpZiAocF9uZCA9PSBwX3BhcmVudC0+bV9wX2xlZnQpCisgICAgcm90YXRlX3JpZ2h0KHBfcGFyZW50KTsKKyAgZWxzZQorICAgIHJvdGF0ZV9sZWZ0KHBfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfcGFyZW50ID0gcF9uZCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3BfbGVmdCA9PSBwX3BhcmVudCB8fCBwX25kLT5tX3BfcmlnaHQgPT0gcF9wYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgLypwX25kKi8sIF9fZ251X3BiZHM6Om51bGxfbm9kZV91cGRhdGUqICAvKnBfdXBkYXRlKi8pCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlXz4KK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CithcHBseV91cGRhdGUobm9kZV9wb2ludGVyIHBfbmQsIE5vZGVfVXBkYXRlXyogcF91cGRhdGUpCit7CisgIHBfdXBkYXRlLT5vcGVyYXRvcigpKCYgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLChwX25kLT5tX3BfbGVmdCA9PSAwKSA/CisJCQkwIDoKKwkJCSYgUEJfRFNfVjJGKHBfbmQtPm1fcF9sZWZ0LT5tX3ZhbHVlKSwocF9uZC0+bV9wX3JpZ2h0ID09IDApID8KKwkJCTAgOgorCQkJJiBQQl9EU19WMkYocF9uZC0+bV9wX3JpZ2h0LT5tX3ZhbHVlKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZV8+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordXBkYXRlX3RvX3RvcChub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiBwX3VwZGF0ZSkKK3sKKyAgd2hpbGUgKHBfbmQgIT0gbV9wX2hlYWQpCisgICAgeworICAgICAgYXBwbHlfdXBkYXRlKHBfbmQsIHBfdXBkYXRlKTsKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit1cGRhdGVfdG9fdG9wKG5vZGVfcG9pbnRlciAvKnBfbmQqLywgX19nbnVfcGJkczo6bnVsbF9ub2RlX3VwZGF0ZSogIC8qcF91cGRhdGUqLykKK3sgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3NwbGl0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zcGxpdF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTczOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zcGxpdF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI1NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBiaW5fc2VhcmNoX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspOworICBzcGxpdF9qb2luX2JyYW5jaF9iYWcgYmFnOworICBsZWFmX3BvaW50ZXIgcF9zcGxpdF9sZiA9IHNwbGl0X3ByZXAocl9rZXksIG90aGVyLCBiYWcpOworICBpZiAocF9zcGxpdF9sZiA9PSAwKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYWcuZW1wdHkoKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhZy5lbXB0eSgpKTsKKyAgb3RoZXIuY2xlYXIoKTsKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSByZWNfc3BsaXQobV9wX2hlYWQtPm1fcF9wYXJlbnQsCisJCQkJICAgcHJlZl9iZWdpbihwX3NwbGl0X2xmKSwKKwkJCQkgICBwcmVmX2VuZChwX3NwbGl0X2xmKSwKKwkJCQkgICBvdGhlciwKKwkJCQkgICBiYWcpOworCisgIG1fcF9oZWFkLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisKKyAgb3RoZXIubV9wX2hlYWQtPm1fcF9tYXggPSBtX3BfaGVhZC0+bV9wX21heDsKKyAgbV9wX2hlYWQtPm1fcF9tYXggPSByaWdodG1vc3RfZGVzY2VuZGFudChtX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIG90aGVyLm1fcF9oZWFkLT5tX3BfbWluID0KKyAgICBvdGhlci5sZWZ0bW9zdF9kZXNjZW5kYW50KG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKworICBvdGhlci5tX3NpemUgPSBzdGQ6OmRpc3RhbmNlKG90aGVyLlBCX0RTX0NMQVNTX0NfREVDOjpiZWdpbigpLAorCQkJICAgICAgIG90aGVyLlBCX0RTX0NMQVNTX0NfREVDOjplbmQoKSk7CisgIG1fc2l6ZSAtPSBvdGhlci5tX3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmxlYWZfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfcHJlcChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIsIHNwbGl0X2pvaW5fYnJhbmNoX2JhZyYgcl9iYWcpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChyX2JhZy5lbXB0eSgpKTsKKyAgaWYgKG1fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgIG90aGVyLmNsZWFyKCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOyk7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKworICBpZiAoc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjpjbXBfa2V5cyhyX2tleSwKKwkJCQkgICAgICBQQl9EU19WMkYoc3RhdGljX2Nhc3Q8Y29uc3RfbGVhZl9wb2ludGVyPihtX3BfaGVhZC0+bV9wX21pbiktPnZhbHVlKCkpKSkKKyAgICB7CisgICAgICBvdGhlci5jbGVhcigpOworICAgICAgdmFsdWVfc3dhcChvdGhlcik7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOyk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOyk7CisgICAgICByZXR1cm4gKDApOworICAgIH0KKworICBpZiAoIXN5bnRoX2VfYWNjZXNzX3RyYWl0czo6Y21wX2tleXMocl9rZXksCisJCQkJICAgICAgIFBCX0RTX1YyRihzdGF0aWNfY2FzdDxjb25zdF9sZWFmX3BvaW50ZXI+KG1fcF9oZWFkLT5tX3BfbWF4KS0+dmFsdWUoKSkpKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KTsKKyAgICAgIHJldHVybiAoMCk7CisgICAgfQorCisgIGl0ZXJhdG9yIGl0ID0gbG93ZXJfYm91bmQocl9rZXkpOworCisgIGlmICghc3ludGhfZV9hY2Nlc3NfdHJhaXRzOjplcXVhbF9rZXlzKFBCX0RTX1YyRigqaXQpLCByX2tleSkpCisgICAgLS1pdDsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IGl0Lm1fcF9uZDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSk7CisgIGxlYWZfcG9pbnRlciBwX3JldF9sID0gc3RhdGljX2Nhc3Q8bGVhZl9wb2ludGVyPihwX25kKTsKKyAgd2hpbGUgKHBfbmQtPm1fdHlwZSAhPSBwYXRfdHJpZV9oZWFkX25vZGVfdHlwZSkKKyAgICB7CisgICAgICByX2JhZy5hZGRfYnJhbmNoKCk7CisgICAgICBwX25kID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICB9CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoZGVidWdfYmFzZTo6c3BsaXQocl9rZXksKHN5bnRoX2VfYWNjZXNzX3RyYWl0cyYgKSgqdGhpcyksIG90aGVyKTspCisKKyAgcmV0dXJuIChwX3JldF9sKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlY19zcGxpdChub2RlX3BvaW50ZXIgcF9uZCwgY29uc3RfZV9pdGVyYXRvciBiX2l0LCBjb25zdF9lX2l0ZXJhdG9yIGVfaXQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlciwgc3BsaXRfam9pbl9icmFuY2hfYmFnJiByX2JhZykKK3sKKyAgaWYgKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQob3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCk7CisgICAgICByZXR1cm4gKHBfbmQpOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV90eXBlID09IHBhdF90cmllX2ludGVybmFsX25vZGVfdHlwZSk7CisgIGludGVybmFsX25vZGVfcG9pbnRlciBwX2ludGVybmFsX25kID0gc3RhdGljX2Nhc3Q8aW50ZXJuYWxfbm9kZV9wb2ludGVyPihwX25kKTsKKworICBub2RlX3BvaW50ZXIgcF9jaGlsZF9yZXQgPSByZWNfc3BsaXQocF9pbnRlcm5hbF9uZC0+Z2V0X2NoaWxkX25vZGUoYl9pdCwgZV9pdCwgdGhpcyksIGJfaXQsIGVfaXQsIG90aGVyLCByX2JhZyk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShwX2NoaWxkX3JldC0+YXNzZXJ0X3ZhbGlkKHRoaXMpOykKKyAgcF9pbnRlcm5hbF9uZC0+cmVwbGFjZV9jaGlsZChwX2NoaWxkX3JldCwgYl9pdCwgZV9pdCwgdGhpcyk7CisgIGFwcGx5X3VwZGF0ZShwX2ludGVybmFsX25kLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworICB0eXBlbmFtZSBpbnRlcm5hbF9ub2RlOjppdGVyYXRvciBjaGlsZF9pdCAgPQorICAgIHBfaW50ZXJuYWxfbmQtPmdldF9jaGlsZF9pdChiX2l0LCBlX2l0LCB0aGlzKTsKKworICBjb25zdCBzaXplX3R5cGUgbGhzX251bV9jaGlsZHJlbiA9CisgICAgc3RkOjpkaXN0YW5jZShwX2ludGVybmFsX25kLT5iZWdpbigpLCBjaGlsZF9pdCkgKyAxOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChsaHNfbnVtX2NoaWxkcmVuID4gMCk7CisKKyAgc2l6ZV90eXBlIHJoc19udW1fY2hpbGRyZW4gPQorICAgIHN0ZDo6ZGlzdGFuY2UocF9pbnRlcm5hbF9uZC0+YmVnaW4oKSwgcF9pbnRlcm5hbF9uZC0+ZW5kKCkpIC0KKyAgICBsaHNfbnVtX2NoaWxkcmVuOworCisgIGlmIChyaHNfbnVtX2NoaWxkcmVuID09IDApCisgICAgeworICAgICAgYXBwbHlfdXBkYXRlKHBfaW50ZXJuYWxfbmQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICAgICAgcmV0dXJuIChwX2ludGVybmFsX25kKTsKKyAgICB9CisKKyAgKytjaGlsZF9pdDsKKyAgb3RoZXIuc3BsaXRfaW5zZXJ0X2JyYW5jaChwX2ludGVybmFsX25kLT5nZXRfZV9pbmQoKSwKKwkJCSAgICBiX2l0LCBjaGlsZF9pdCwgcmhzX251bV9jaGlsZHJlbiwgcl9iYWcpOworCisgIGNoaWxkX2l0ID0gcF9pbnRlcm5hbF9uZC0+Z2V0X2NoaWxkX2l0KGJfaXQsIGVfaXQsIHRoaXMpOworICArK2NoaWxkX2l0OworICB3aGlsZSAocmhzX251bV9jaGlsZHJlbiAhPSAwKQorICAgIHsKKyAgICAgIGNoaWxkX2l0ID0gcF9pbnRlcm5hbF9uZC0+cmVtb3ZlX2NoaWxkKGNoaWxkX2l0KTsKKyAgICAgIC0tcmhzX251bV9jaGlsZHJlbjsKKyAgICB9CisKKyAgYXBwbHlfdXBkYXRlKHBfaW50ZXJuYWxfbmQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoc3RkOjpkaXN0YW5jZShwX2ludGVybmFsX25kLT5iZWdpbigpLAorCQkJCSAgICAgIHBfaW50ZXJuYWxfbmQtPmVuZCgpKSA+PSAxKTsKKworICBpZiAoc3RkOjpkaXN0YW5jZShwX2ludGVybmFsX25kLT5iZWdpbigpLCBwX2ludGVybmFsX25kLT5lbmQoKSkgPiAxKQorICAgIHsKKyAgICAgIHBfaW50ZXJuYWxfbmQtPnVwZGF0ZV9wcmVmaXhlcyh0aGlzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkocF9pbnRlcm5hbF9uZC0+YXNzZXJ0X3ZhbGlkKHRoaXMpOykKKyAgICAgIGFwcGx5X3VwZGF0ZShwX2ludGVybmFsX25kLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgICAgIHJldHVybiAocF9pbnRlcm5hbF9uZCk7CisgICAgfQorCisgIG5vZGVfcG9pbnRlciBwX3JldCA9KiBwX2ludGVybmFsX25kLT5iZWdpbigpOworICBwX2ludGVybmFsX25kLT5+aW50ZXJuYWxfbm9kZSgpOworICBzX2ludGVybmFsX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9pbnRlcm5hbF9uZCwgMSk7CisgIGFwcGx5X3VwZGF0ZShwX3JldCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIHJldHVybiAocF9yZXQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfaW5zZXJ0X2JyYW5jaChzaXplX3R5cGUgZV9pbmQsIGNvbnN0X2VfaXRlcmF0b3IgYl9pdCwgdHlwZW5hbWUgaW50ZXJuYWxfbm9kZTo6aXRlcmF0b3IgY2hpbGRfYl9pdCwgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiwgc3BsaXRfam9pbl9icmFuY2hfYmFnJiByX2JhZykKK3sKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICBpZiAobV9wX2hlYWQtPm1fcF9wYXJlbnQgIT0gMCkKKyAgICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+YXNzZXJ0X3ZhbGlkKHRoaXMpOworI2VuZGlmIAorCisgIGNvbnN0IHNpemVfdHlwZSB0b3RhbF9udW1fY2hpbGRyZW4gPSgobV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCk/IDAgOiAxKSArIG51bV9jaGlsZHJlbjsKKworICBpZiAodG90YWxfbnVtX2NoaWxkcmVuID09IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9oZWFkLT5tX3BfcGFyZW50ID09IDApOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAodG90YWxfbnVtX2NoaWxkcmVuID09IDEpCisgICAgeworICAgICAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX09OTFkobV9wX2hlYWQtPm1fcF9wYXJlbnQtPmFzc2VydF92YWxpZCh0aGlzKTspCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKTsKKyAgICAgIG1fcF9oZWFkLT5tX3BfcGFyZW50ID0qIGNoaWxkX2JfaXQ7CisgICAgICBtX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudCA9IG1fcF9oZWFkOworICAgICAgYXBwbHlfdXBkYXRlKG1fcF9oZWFkLT5tX3BfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkobV9wX2hlYWQtPm1fcF9wYXJlbnQtPmFzc2VydF92YWxpZCh0aGlzKTspCisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh0b3RhbF9udW1fY2hpbGRyZW4gPiAxKTsKKyAgaW50ZXJuYWxfbm9kZV9wb2ludGVyIHBfbmV3X3Jvb3QgPSByX2JhZy5nZXRfYnJhbmNoKCk7CisgIG5ldyAocF9uZXdfcm9vdCkgaW50ZXJuYWxfbm9kZShlX2luZCwgYl9pdCk7CisgIHNpemVfdHlwZSBudW1faW5zZXJ0ZWQgPSAwOworICB3aGlsZSAobnVtX2luc2VydGVkKysgPCBudW1fY2hpbGRyZW4pCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWSgoKmNoaWxkX2JfaXQpLT5hc3NlcnRfdmFsaWQodGhpcyk7KQorICAgICAgICBwX25ld19yb290LT5hZGRfY2hpbGQoKmNoaWxkX2JfaXQsIHByZWZfYmVnaW4oKmNoaWxkX2JfaXQpLAorCQkJICAgICAgcHJlZl9lbmQoKmNoaWxkX2JfaXQpLCB0aGlzKTsKKyAgICAgICsrY2hpbGRfYl9pdDsKKyAgICB9CisKKyAgaWYgKG1fcF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgcF9uZXdfcm9vdC0+YWRkX2NoaWxkKG1fcF9oZWFkLT5tX3BfcGFyZW50LCAKKwkJCSAgcHJlZl9iZWdpbihtX3BfaGVhZC0+bV9wX3BhcmVudCksCisJCQkgIHByZWZfZW5kKG1fcF9oZWFkLT5tX3BfcGFyZW50KSwgdGhpcyk7CisKKyAgbV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25ld19yb290OworICBwX25ld19yb290LT5tX3BfcGFyZW50ID0gbV9wX2hlYWQ7CisgIGFwcGx5X3VwZGF0ZShtX3BfaGVhZC0+bV9wX3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkobV9wX2hlYWQtPm1fcF9wYXJlbnQtPmFzc2VydF92YWxpZCh0aGlzKTspCit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3NwbGl0X2pvaW5fYnJhbmNoX2JhZy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3NwbGl0X2pvaW5fYnJhbmNoX2JhZy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlY2FlNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vc3BsaXRfam9pbl9icmFuY2hfYmFnLmhwcApAQCAtMCwwICsxLDkzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxpdF9qb2luX2JyYW5jaF9iYWcuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWVfLgorICovCisKK2NsYXNzIHNwbGl0X2pvaW5fYnJhbmNoX2JhZworeworcHJpdmF0ZToKKyAgdHlwZWRlZgorICBzdGQ6Omxpc3Q8CisgIGludGVybmFsX25vZGVfcG9pbnRlciwKKyAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisgIGludGVybmFsX25vZGVfcG9pbnRlcj46Om90aGVyPgorICBiYWdfdDsKKworcHVibGljOgorCisgIHZvaWQKKyAgYWRkX2JyYW5jaCgpCisgIHsKKyAgICBpbnRlcm5hbF9ub2RlX3BvaW50ZXIgcF9uZCA9IHNfaW50ZXJuYWxfbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisgICAgX190cnkKKyAgICAgIHsKKwltX2JhZy5wdXNoX2JhY2socF9uZCk7CisgICAgICB9CisgICAgX19jYXRjaCguLi4pCisgICAgICB7CisJc19pbnRlcm5hbF9ub2RlX2FsbG9jYXRvci5kZWFsbG9jYXRlKHBfbmQsIDEpOworCV9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgICAgfQorICB9CisKKyAgaW50ZXJuYWxfbm9kZV9wb2ludGVyCisgIGdldF9icmFuY2goKQorICB7CisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFtX2JhZy5lbXB0eSgpKTsKKyAgICBpbnRlcm5hbF9ub2RlX3BvaW50ZXIgcF9uZCA9KiBtX2JhZy5iZWdpbigpOworICAgIG1fYmFnLnBvcF9mcm9udCgpOworICAgIHJldHVybiBwX25kOworICB9CisKKyAgfnNwbGl0X2pvaW5fYnJhbmNoX2JhZygpCisgIHsKKyAgICB3aGlsZSAoIW1fYmFnLmVtcHR5KCkpCisgICAgICB7CisJaW50ZXJuYWxfbm9kZV9wb2ludGVyIHBfbmQgPSogbV9iYWcuYmVnaW4oKTsKKwlzX2ludGVybmFsX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUocF9uZCwgMSk7CisJbV9iYWcucG9wX2Zyb250KCk7CisgICAgICB9CisgIH0KKworICBpbmxpbmUgYm9vbAorICBlbXB0eSgpIGNvbnN0CisgIHsgcmV0dXJuIG1fYmFnLmVtcHR5KCk7IH0KKworcHJpdmF0ZToKKyAgYmFnX3QgbV9iYWc7Cit9OwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zeW50aF9lX2FjY2Vzc190cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9zeW50aF9lX2FjY2Vzc190cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjVmMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3N5bnRoX2VfYWNjZXNzX3RyYWl0cy5ocHAKQEAgLTAsMCArMSwyMjkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHN5bnRoX2VfYWNjZXNzX3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBhIHBhdHJpY2lhIHRyZWUuCisgKi8KKworI2lmbmRlZiBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQwkJCQlcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsIGJvb2wgU2V0LCBjbGFzcyBFX0FjY2Vzc19UcmFpdHM+CisKKyNkZWZpbmUgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDCQkJCVwKKyAgICBzeW50aF9lX2FjY2Vzc190cmFpdHM8CQkJCQkJXAorCQkJCQkJVHlwZV9UcmFpdHMsCQlcCisJCQkJCQlTZXQsCQkJXAorCQkJCQkJRV9BY2Nlc3NfVHJhaXRzPgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZV9UcmFpdHMsIGJvb2wgU2V0LCBjbGFzcyBFX0FjY2Vzc19UcmFpdHM+CisgICAgc3RydWN0IHN5bnRoX2VfYWNjZXNzX3RyYWl0cyA6IHB1YmxpYyBFX0FjY2Vzc19UcmFpdHMKKyAgICB7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBFX0FjY2Vzc19UcmFpdHMgYmFzZV90eXBlOworCisgICAgICB0eXBlZGVmIFR5cGVfVHJhaXRzIHR5cGVfdHJhaXRzOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHR5cGVfdHJhaXRzOjpjb25zdF9rZXlfcmVmZXJlbmNlIGNvbnN0X2tleV9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHlwZV90cmFpdHM6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICBzeW50aF9lX2FjY2Vzc190cmFpdHMoKTsKKworICAgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzKGNvbnN0IEVfQWNjZXNzX1RyYWl0cyYgcl90cmFpdHMpOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgZXF1YWxfcHJlZml4ZXModHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciBiX2wsIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgZV9sLCB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGJfciwgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciBlX3IsIGJvb2wgY29tcGFyZV9hZnRlciA9IHRydWUpIGNvbnN0OworCisgICAgICBib29sCisgICAgICBlcXVhbF9rZXlzKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9saHNfa2V5LCBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3Q7CisKKyAgICAgIGJvb2wKKyAgICAgIGNtcF9wcmVmaXhlcyh0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGJfbCwgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciBlX2wsIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgYl9yLCB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGVfciwgYm9vbCBjb21wYXJlX2FmdGVyID0gZmFsc2UpIGNvbnN0OworCisgICAgICBib29sCisgICAgICBjbXBfa2V5cyhjb25zdF9rZXlfcmVmZXJlbmNlIHJfbGhzX2tleSwgY29uc3Rfa2V5X3JlZmVyZW5jZSByX3Joc19rZXkpIGNvbnN0OworCisgICAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2tleV9yZWZlcmVuY2UKKyAgICAgIGV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCk7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdF9rZXlfcmVmZXJlbmNlIHJfbGhzLCBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzKTsKKyNlbmRpZgorCisgICAgcHJpdmF0ZToKKyAgICAgIGlubGluZSBzdGF0aWMgY29uc3Rfa2V5X3JlZmVyZW5jZQorICAgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCB0cnVlX3R5cGUpOworCisgICAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2tleV9yZWZlcmVuY2UKKyAgICAgIGV4dHJhY3Rfa2V5KGNvbnN0X3JlZmVyZW5jZSByX3ZhbCwgZmFsc2VfdHlwZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGludGVncmFsX2NvbnN0YW50PGludCxTZXQ+IHNfc2V0X2luZDsKKyAgICB9OworCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgaW50ZWdyYWxfY29uc3RhbnQ8aW50LFNldD4KKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OnNfc2V0X2luZDsKKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzKCkKKyAgICB7IH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzKGNvbnN0IEVfQWNjZXNzX1RyYWl0cyYgcl90cmFpdHMpIDoKKyAgICAgIEVfQWNjZXNzX1RyYWl0cyhyX3RyYWl0cykKKyAgICB7IH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGlubGluZSBib29sCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBlcXVhbF9wcmVmaXhlcyh0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGJfbCwgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciBlX2wsIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgYl9yLCB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGVfciwgYm9vbCBjb21wYXJlX2FmdGVyIC8qPSBmYWxzZSAqLykgY29uc3QKKyAgICB7CisgICAgICB3aGlsZSAoYl9sICE9IGVfbCkKKwl7CisJICBpZiAoYl9yID09IGVfcikKKwkgICAgcmV0dXJuIChmYWxzZSk7CisJICBpZiAoYmFzZV90eXBlOjplX3BvcygqYl9sKSAhPSBiYXNlX3R5cGU6OmVfcG9zKCpiX3IpKQorCSAgICByZXR1cm4gKGZhbHNlKTsKKwkgICsrYl9sOworCSAgKytiX3I7CisJfQorICAgICAgcmV0dXJuICghY29tcGFyZV9hZnRlciB8fCBiX3IgPT0gZV9yKTsKKyAgICB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBib29sCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBlcXVhbF9rZXlzKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9saHNfa2V5LCBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKGVxdWFsX3ByZWZpeGVzKGJhc2VfdHlwZTo6YmVnaW4ocl9saHNfa2V5KSwKKwkJCSAgICAgYmFzZV90eXBlOjplbmQocl9saHNfa2V5KSwKKwkJCSAgICAgYmFzZV90eXBlOjpiZWdpbihyX3Joc19rZXkpLAorCQkJICAgICBiYXNlX3R5cGU6OmVuZChyX3Joc19rZXkpLAorCQkJICAgICB0cnVlKSk7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgY21wX3ByZWZpeGVzKHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgYl9sLCB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGVfbCwgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciBiX3IsIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgZV9yLCBib29sIGNvbXBhcmVfYWZ0ZXIgLyogPSBmYWxzZSovKSBjb25zdAorICAgIHsKKyAgICAgIHdoaWxlIChiX2wgIT0gZV9sKQorCXsKKwkgIGlmIChiX3IgPT0gZV9yKQorCSAgICByZXR1cm4gKGZhbHNlKTsKKwkgIGNvbnN0IHR5cGVuYW1lIGJhc2VfdHlwZTo6c2l6ZV90eXBlIGxfcG9zID0KKwkgICAgYmFzZV90eXBlOjplX3BvcygqYl9sKTsKKwkgIGNvbnN0IHR5cGVuYW1lIGJhc2VfdHlwZTo6c2l6ZV90eXBlIHJfcG9zID0KKwkgICAgYmFzZV90eXBlOjplX3BvcygqYl9yKTsKKwkgIGlmIChsX3BvcyAhPSByX3BvcykKKwkgICAgcmV0dXJuIChsX3BvcyA8IHJfcG9zKTsKKwkgICsrYl9sOworCSAgKytiX3I7CisJfQorCisgICAgICBpZiAoIWNvbXBhcmVfYWZ0ZXIpCisJcmV0dXJuIChmYWxzZSk7CisgICAgICByZXR1cm4gKGJfciAhPSBlX3IpOworICAgIH0KKworICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19UX0RFQworICAgIGJvb2wKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfQ19ERUM6OgorICAgIGNtcF9rZXlzKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9saHNfa2V5LCBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzX2tleSkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKGNtcF9wcmVmaXhlcyhiYXNlX3R5cGU6OmJlZ2luKHJfbGhzX2tleSksCisJCQkgICBiYXNlX3R5cGU6OmVuZChyX2xoc19rZXkpLAorCQkJICAgYmFzZV90eXBlOjpiZWdpbihyX3Joc19rZXkpLAorCQkJICAgYmFzZV90eXBlOjplbmQocl9yaHNfa2V5KSwKKwkJCSAgIHRydWUpKTsKKyAgICB9CisKKyAgICBQQl9EU19TWU5USF9FX0FDQ0VTU19UUkFJVFNfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjpjb25zdF9rZXlfcmVmZXJlbmNlCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDOjoKKyAgICBleHRyYWN0X2tleShjb25zdF9yZWZlcmVuY2Ugcl92YWwpCisgICAgeworICAgICAgcmV0dXJuIChleHRyYWN0X2tleShyX3ZhbCwgc19zZXRfaW5kKSk7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6Y29uc3Rfa2V5X3JlZmVyZW5jZQorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCB0cnVlX3R5cGUpCisgICAgeworICAgICAgcmV0dXJuIChyX3ZhbCk7CisgICAgfQorCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgaW5saW5lIHR5cGVuYW1lIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6Y29uc3Rfa2V5X3JlZmVyZW5jZQorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgZXh0cmFjdF9rZXkoY29uc3RfcmVmZXJlbmNlIHJfdmFsLCBmYWxzZV90eXBlKQorICAgIHsKKyAgICAgIHJldHVybiAocl92YWwuZmlyc3QpOworICAgIH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX1NZTlRIX0VfQUNDRVNTX1RSQUlUU19DX0RFQzo6CisgICAgb3BlcmF0b3IoKShjb25zdF9rZXlfcmVmZXJlbmNlIHJfbGhzLCBjb25zdF9rZXlfcmVmZXJlbmNlIHJfcmhzKQorICAgIHsKKyAgICAgIHJldHVybiAoY21wX2tleXMocl9saHMsIHJfcmhzKSk7CisgICAgfQorI2VuZGlmIAorCisjdW5kZWYgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX1RfREVDCisjdW5kZWYgUEJfRFNfU1lOVEhfRV9BQ0NFU1NfVFJBSVRTX0NfREVDCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhY2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2YyOGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3RyYWNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTEzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllXy4KKyAqLworCisjaWZkZWYgUEJfRFNfUEFUX1RSSUVfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisgIGlmIChtX3BfaGVhZC0+bV9wX3BhcmVudCA9PSAwKQorICAgIHJldHVybjsKKyAgdHJhY2Vfbm9kZShtX3BfaGVhZC0+bV9wX3BhcmVudCwgMCk7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlKGNvbnN0X25vZGVfcG9pbnRlciBwX25kLCBzaXplX3R5cGUgbGV2ZWwpCit7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKKyAgICBzdGQ6OmNlcnIgPDwgJyAnOworICBzdGQ6OmNlcnIgPDwgcF9uZCA8PCAiICI7CisgIHN0ZDo6Y2VyciA8PCAoKHBfbmQtPm1fdHlwZSA9PSBwYXRfdHJpZV9sZWFmX25vZGVfdHlwZSkgPyAibCAiIDogImkgIik7CisKKyAgdHJhY2Vfbm9kZV9tZXRhZGF0YShwX25kLCB0eXBlX3RvX3R5cGU8dHlwZW5hbWUgbm9kZTo6bWV0YWRhdGFfdHlwZT4oKSk7CisgIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZWxfaXQgPSBwcmVmX2JlZ2luKHBfbmQpOworICB3aGlsZSAoZWxfaXQgIT0gcHJlZl9lbmQocF9uZCkpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8KiBlbF9pdDsKKyAgICAgICsrZWxfaXQ7CisgICAgfQorCisgIGlmIChwX25kLT5tX3R5cGUgPT0gcGF0X3RyaWVfbGVhZl9ub2RlX3R5cGUpCisgICAgeworICAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29uc3RfaW50ZXJuYWxfbm9kZV9wb2ludGVyIHBfaW50ZXJuYWwgPQorICAgIHN0YXRpY19jYXN0PGNvbnN0X2ludGVybmFsX25vZGVfcG9pbnRlcj4ocF9uZCk7CisKKyAgc3RkOjpjZXJyIDw8ICIgIiA8PAorICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHBfaW50ZXJuYWwtPmdldF9lX2luZCgpKSA8PCBzdGQ6OmVuZGw7CisKKyAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IHN0ZDo6ZGlzdGFuY2UocF9pbnRlcm5hbC0+YmVnaW4oKSwKKwkJCQkJICAgICAgIHBfaW50ZXJuYWwtPmVuZCgpKTsKKworICBmb3IgKHNpemVfdHlwZSBjaGlsZF9pID0gMDsgY2hpbGRfaSA8IG51bV9jaGlsZHJlbjsgKytjaGlsZF9pKQorICAgIHsKKyAgICAgIHR5cGVuYW1lIGludGVybmFsX25vZGU6OmNvbnN0X2l0ZXJhdG9yIGNoaWxkX2l0ID0KKwlwX2ludGVybmFsLT5iZWdpbigpOworICAgICAgc3RkOjphZHZhbmNlKGNoaWxkX2l0LCBudW1fY2hpbGRyZW4gLSBjaGlsZF9pIC0gMSk7CisgICAgICB0cmFjZV9ub2RlKCpjaGlsZF9pdCwgbGV2ZWwgKyAxKTsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXRhZGF0YV8+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZV9ub2RlX21ldGFkYXRhKGNvbnN0X25vZGVfcG9pbnRlciBwX25kLCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPikKK3sKKyAgc3RkOjpjZXJyIDw8ICIoIiA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihwX25kLT5nZXRfbWV0YWRhdGEoKSkgPDwgIikgIjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlX25vZGVfbWV0YWRhdGEoY29uc3Rfbm9kZV9wb2ludGVyLCB0eXBlX3RvX3R5cGU8bnVsbF9ub2RlX21ldGFkYXRhPikKK3sgfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU3ZjU4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy90cmFpdHMuaHBwCkBAIC0wLDAgKzEsMzUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFpdHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgcGF0X3RyaWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfUEFUX1RSSUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19QQVRfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy9ub2RlX2Jhc2UuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2hlYWQuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2xlYWYuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL2ludGVybmFsX25vZGUuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3BvaW50X2l0ZXJhdG9ycy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vbm9kZV9pdGVyYXRvcnMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcGF0X3RyaWVfL3N5bnRoX2VfYWNjZXNzX3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgY2xhc3MgRV9BY2Nlc3NfVHJhaXRzLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuXywKKwkJICAgICAgY2xhc3MgQWxsb2NhdG9yXz4KKyAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgdHJpZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBFX0FjY2Vzc19UcmFpdHMsCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIHBhdF90cmllX3RhZywKKyAgICAgIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZXNfdHJhaXRzPCBLZXksIE1hcHBlZCwgQWxsb2NhdG9yLCBmYWxzZT4gdHlwZV90cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0cmllX25vZGVfbWV0YWRhdGFfc2VsZWN0b3I8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBFX0FjY2Vzc19UcmFpdHMsCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIEFsbG9jYXRvcj46OnR5cGUKKyAgICAgIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgRV9BY2Nlc3NfVHJhaXRzIGVfYWNjZXNzX3RyYWl0czsKKworICAgICAgdHlwZWRlZgorICAgICAgX19nbnVfcGJkczo6ZGV0YWlsOjpzeW50aF9lX2FjY2Vzc190cmFpdHM8CisJdHlwZV90cmFpdHMsCisJZmFsc2UsCisJZV9hY2Nlc3NfdHJhaXRzPgorICAgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzOworCisgICAgICB0eXBlZGVmCisgICAgICBwYXRfdHJpZV9ub2RlX2Jhc2U8CisJdHlwZV90cmFpdHMsCisJc3ludGhfZV9hY2Nlc3NfdHJhaXRzLAorCW1ldGFkYXRhX3R5cGUsCisJQWxsb2NhdG9yPgorICAgICAgbm9kZTsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfbGVhZjwKKwl0eXBlX3RyYWl0cywKKwlzeW50aF9lX2FjY2Vzc190cmFpdHMsCisJbWV0YWRhdGFfdHlwZSwKKwlBbGxvY2F0b3I+CisgICAgICBsZWFmOworCisgICAgICB0eXBlZGVmCisgICAgICBwYXRfdHJpZV9oZWFkPAorCXR5cGVfdHJhaXRzLAorCXN5bnRoX2VfYWNjZXNzX3RyYWl0cywKKwltZXRhZGF0YV90eXBlLAorCUFsbG9jYXRvcj4KKyAgICAgIGhlYWQ7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHBhdF90cmllX2ludGVybmFsX25vZGU8CisJdHlwZV90cmFpdHMsCisJc3ludGhfZV9hY2Nlc3NfdHJhaXRzLAorCW1ldGFkYXRhX3R5cGUsCisJQWxsb2NhdG9yPgorICAgICAgaW50ZXJuYWxfbm9kZTsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfY29uc3RfaXRfPAorCXR5cGVfdHJhaXRzLAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJdHJ1ZSwKKwlBbGxvY2F0b3I+CisgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfaXRfPAorCXR5cGVfdHJhaXRzLAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJdHJ1ZSwKKwlBbGxvY2F0b3I+CisgICAgICBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfY29uc3RfaXRfPAorCXR5cGVfdHJhaXRzLAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJZmFsc2UsCisJQWxsb2NhdG9yPgorICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfaXRfPAorCXR5cGVfdHJhaXRzLAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJZmFsc2UsCisJQWxsb2NhdG9yPgorICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfY29uc3Rfbm9kZV9pdF88CisJbm9kZSwKKwlsZWFmLAorCWhlYWQsCisJaW50ZXJuYWxfbm9kZSwKKwljb25zdF9pdGVyYXRvciwKKwlpdGVyYXRvciwKKwlzeW50aF9lX2FjY2Vzc190cmFpdHMsCisJQWxsb2NhdG9yPgorICAgICAgY29uc3Rfbm9kZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfbm9kZV9pdF88CisJbm9kZSwKKwlsZWFmLAorCWhlYWQsCisJaW50ZXJuYWxfbm9kZSwKKwljb25zdF9pdGVyYXRvciwKKwlpdGVyYXRvciwKKwlzeW50aF9lX2FjY2Vzc190cmFpdHMsCisJQWxsb2NhdG9yPgorICAgICAgbm9kZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgTm9kZV9VcGRhdGU8CisJY29uc3Rfbm9kZV9pdGVyYXRvciwKKwlub2RlX2l0ZXJhdG9yLAorCUVfQWNjZXNzX1RyYWl0cywKKwlBbGxvY2F0b3I+CisgICAgICBub2RlX3VwZGF0ZTsKKworICAgICAgdHlwZWRlZgorICAgICAgX19nbnVfcGJkczo6bnVsbF90cmllX25vZGVfdXBkYXRlPAorCWNvbnN0X25vZGVfaXRlcmF0b3IsCisJbm9kZV9pdGVyYXRvciwKKwlFX0FjY2Vzc19UcmFpdHMsCisJQWxsb2NhdG9yPiogCisgICAgICBudWxsX25vZGVfdXBkYXRlX3BvaW50ZXI7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIGNsYXNzIEVfQWNjZXNzX1RyYWl0cywKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIE5vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIGNsYXNzIEFsbG9jYXRvcl8+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHRyaWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF9tYXBwZWRfdHlwZSwKKyAgICAgIEVfQWNjZXNzX1RyYWl0cywKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgcGF0X3RyaWVfdGFnLAorICAgICAgQWxsb2NhdG9yPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgdHlwZXNfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgbnVsbF9tYXBwZWRfdHlwZSwKKyAgICAgIEFsbG9jYXRvciwKKyAgICAgIGZhbHNlPgorICAgICAgdHlwZV90cmFpdHM7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0cmllX25vZGVfbWV0YWRhdGFfc2VsZWN0b3I8CisgICAgICBLZXksCisgICAgICBudWxsX21hcHBlZF90eXBlLAorICAgICAgRV9BY2Nlc3NfVHJhaXRzLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICBBbGxvY2F0b3I+Ojp0eXBlCisgICAgICBtZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmIEVfQWNjZXNzX1RyYWl0cyBlX2FjY2Vzc190cmFpdHM7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIF9fZ251X3BiZHM6OmRldGFpbDo6c3ludGhfZV9hY2Nlc3NfdHJhaXRzPAorCXR5cGVfdHJhaXRzLAorCXRydWUsCisJZV9hY2Nlc3NfdHJhaXRzPgorICAgICAgc3ludGhfZV9hY2Nlc3NfdHJhaXRzOworCisgICAgICB0eXBlZGVmCisgICAgICBwYXRfdHJpZV9ub2RlX2Jhc2U8CisJdHlwZV90cmFpdHMsCisJc3ludGhfZV9hY2Nlc3NfdHJhaXRzLAorCW1ldGFkYXRhX3R5cGUsCisJQWxsb2NhdG9yPgorICAgICAgbm9kZTsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfbGVhZjwKKwl0eXBlX3RyYWl0cywKKwlzeW50aF9lX2FjY2Vzc190cmFpdHMsCisJbWV0YWRhdGFfdHlwZSwKKwlBbGxvY2F0b3I+CisgICAgICBsZWFmOworCisgICAgICB0eXBlZGVmCisgICAgICBwYXRfdHJpZV9oZWFkPAorCXR5cGVfdHJhaXRzLAorCXN5bnRoX2VfYWNjZXNzX3RyYWl0cywKKwltZXRhZGF0YV90eXBlLAorCUFsbG9jYXRvcj4KKyAgICAgIGhlYWQ7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHBhdF90cmllX2ludGVybmFsX25vZGU8CisJdHlwZV90cmFpdHMsCisJc3ludGhfZV9hY2Nlc3NfdHJhaXRzLAorCW1ldGFkYXRhX3R5cGUsCisJQWxsb2NhdG9yPgorICAgICAgaW50ZXJuYWxfbm9kZTsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfY29uc3RfaXRfPAorCXR5cGVfdHJhaXRzLAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJdHJ1ZSwKKwlBbGxvY2F0b3I+CisgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZgorICAgICAgcGF0X3RyaWVfY29uc3RfaXRfPAorCXR5cGVfdHJhaXRzLAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJZmFsc2UsCisJQWxsb2NhdG9yPgorICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHBhdF90cmllX2NvbnN0X25vZGVfaXRfPAorCW5vZGUsCisJbGVhZiwKKwloZWFkLAorCWludGVybmFsX25vZGUsCisJY29uc3RfaXRlcmF0b3IsCisJaXRlcmF0b3IsCisJc3ludGhfZV9hY2Nlc3NfdHJhaXRzLAorCUFsbG9jYXRvcj4KKyAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgY29uc3Rfbm9kZV9pdGVyYXRvciBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmCisgICAgICBOb2RlX1VwZGF0ZTwKKwljb25zdF9ub2RlX2l0ZXJhdG9yLAorCW5vZGVfaXRlcmF0b3IsCisJRV9BY2Nlc3NfVHJhaXRzLAorCUFsbG9jYXRvcj4KKyAgICAgIG5vZGVfdXBkYXRlOworCisgICAgICB0eXBlZGVmCisgICAgICBfX2dudV9wYmRzOjpudWxsX3RyaWVfbm9kZV91cGRhdGU8CisJY29uc3Rfbm9kZV9pdGVyYXRvciwKKwljb25zdF9ub2RlX2l0ZXJhdG9yLAorCUVfQWNjZXNzX1RyYWl0cywKKwlBbGxvY2F0b3I+KiAKKyAgICAgIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcjsKKyAgICB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19QQVRfVFJJRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3BhdF90cmllXy91cGRhdGVfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwMzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9wYXRfdHJpZV8vdXBkYXRlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHVwZGF0ZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHBhdF90cmllXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgLypwX25kKi8sIG51bGxfbm9kZV91cGRhdGVfcG9pbnRlcikKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGVfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2FwcGx5X3VwZGF0ZShub2RlX3BvaW50ZXIgcF9uZCwgTm9kZV9VcGRhdGVfKiAgLypwX3VwZGF0ZSovKQoreworICBOb2RlX1VwZGF0ZV86Om9wZXJhdG9yKCkobm9kZV9pdGVyYXRvcihwX25kLCB0aGlzKSwKKwkJCSAgIGNvbnN0X25vZGVfaXRlcmF0b3IoMCwgdGhpcykpOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3ByaW9yaXR5X3F1ZXVlX2Jhc2VfZGlzcGF0Y2guaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3ByaW9yaXR5X3F1ZXVlX2Jhc2VfZGlzcGF0Y2guaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDVjNGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaC5ocHAKQEAgLTAsMCArMSw5MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaC5ocHAKKyAqIENvbnRhaW5zIGFuIHBxaWF0aXZlIGNvbnRhaW5lciBkaXNwYXRjaGluZyBiYXNlLgorICovCisKKyNpZm5kZWYgUEJfRFNfUFJJT1JJVFlfUVVFVUVfQkFTRV9EU19ESVNQQVRDSEVSX0hQUAorI2RlZmluZSBQQl9EU19QUklPUklUWV9RVUVVRV9CQVNFX0RTX0RJU1BBVENIRVJfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3BhaXJpbmdfaGVhcF8vcGFpcmluZ19oZWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5vbWlhbF9oZWFwXy9iaW5vbWlhbF9oZWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yY19iaW5vbWlhbF9oZWFwXy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iaW5hcnlfaGVhcF8vYmluYXJ5X2hlYXBfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdGhpbl9oZWFwXy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgICAgbmFtZXNwYWNlIGRldGFpbAorICAgIHsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBUYWcsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgIHN0cnVjdCBwcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgIHN0cnVjdCBwcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoPFZhbHVlX1R5cGUsIENtcF9GbiwgcGFpcmluZ19oZWFwX3RhZywgQWxsb2NhdG9yPgorICAgICAgeworCXR5cGVkZWYgcGFpcmluZ19oZWFwXzwgVmFsdWVfVHlwZSwgQ21wX0ZuLCBBbGxvY2F0b3I+IHR5cGU7CisgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCB0eXBlbmFtZSBDbXBfRm4sIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgIHN0cnVjdCBwcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoPFZhbHVlX1R5cGUsIENtcF9GbiwgYmlub21pYWxfaGVhcF90YWcsIEFsbG9jYXRvcj4KKyAgICAgIHsKKwl0eXBlZGVmIGJpbm9taWFsX2hlYXBfPCBWYWx1ZV9UeXBlLCBDbXBfRm4sIEFsbG9jYXRvcj4gdHlwZTsKKyAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgICAgc3RydWN0IHByaW9yaXR5X3F1ZXVlX2Jhc2VfZGlzcGF0Y2g8VmFsdWVfVHlwZSwgQ21wX0ZuLCByY19iaW5vbWlhbF9oZWFwX3RhZywgQWxsb2NhdG9yPgorICAgICAgeworCXR5cGVkZWYgcmNfYmlub21pYWxfaGVhcF88IFZhbHVlX1R5cGUsIENtcF9GbiwgQWxsb2NhdG9yPiB0eXBlOworICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQ21wX0ZuLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICBzdHJ1Y3QgcHJpb3JpdHlfcXVldWVfYmFzZV9kaXNwYXRjaDxWYWx1ZV9UeXBlLCBDbXBfRm4sIGJpbmFyeV9oZWFwX3RhZywgQWxsb2NhdG9yPgorICAgICAgeworCXR5cGVkZWYgYmluYXJ5X2hlYXBfPCBWYWx1ZV9UeXBlLCBDbXBfRm4sIEFsbG9jYXRvcj4gdHlwZTsKKyAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgICAgc3RydWN0IHByaW9yaXR5X3F1ZXVlX2Jhc2VfZGlzcGF0Y2g8VmFsdWVfVHlwZSwgQ21wX0ZuLCB0aGluX2hlYXBfdGFnLCBBbGxvY2F0b3I+CisgICAgICB7CisJdHlwZWRlZiB0aGluX2hlYXBfPCBWYWx1ZV9UeXBlLCBDbXBfRm4sIEFsbG9jYXRvcj4gdHlwZTsKKyAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfUFJJT1JJVFlfUVVFVUVfQkFTRV9EU19ESVNQQVRDSEVSX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiZmUyMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBiYXNlX3R5cGUocl9jbXBfZm4pCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4sIGNvbnN0IG5vZGVfdXBkYXRlJiByX25vZGVfdXBkYXRlKSA6CisgIGJhc2VfdHlwZShyX2NtcF9mbiwgcl9ub2RlX3VwZGF0ZSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisgIGJhc2VfdHlwZShvdGhlcikKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citpbml0aWFsaXplKCkKK3sgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9yZWQgPSB0cnVlOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTEzZWY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X25vZGVfY29uc2lzdGVudChjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkgY29uc3QKK3sKKyAgaWYgKHBfbmQgPT0gMCkKKyAgICByZXR1cm4gMTsKKworICBjb25zdCBzaXplX3R5cGUgbF9oZWlnaHQgPSBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQtPm1fcF9sZWZ0KTsKKyAgY29uc3Qgc2l6ZV90eXBlIHJfaGVpZ2h0ID0gYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kLT5tX3BfcmlnaHQpOworICBpZiAocF9uZC0+bV9yZWQpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfbmQtPm1fcF9sZWZ0KSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXNfZWZmZWN0aXZlbHlfYmxhY2socF9uZC0+bV9wX3JpZ2h0KSk7CisgICAgfQorICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobF9oZWlnaHQgPT0gcl9oZWlnaHQpOworICByZXR1cm4gKHBfbmQtPm1fcmVkID8gMCA6IDEpICsgbF9oZWlnaHQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoKSBjb25zdAoreworICBiYXNlX3R5cGU6OmFzc2VydF92YWxpZCgpOworICBjb25zdCBub2RlX3BvaW50ZXIgcF9oZWFkID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfaGVhZC0+bV9yZWQpOworICBpZiAocF9oZWFkLT5tX3BfcGFyZW50ICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFwX2hlYWQtPm1fcF9wYXJlbnQtPm1fcmVkKTsKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgICB9Cit9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5N2JjNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vZXJhc2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwyODkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGVyYXNlX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBwb2ludF9pdGVyYXRvciBpdCA9IGZpbmQocl9rZXkpOworICBpZiAoaXQgPT0gYmFzZV90eXBlOjplbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGVyYXNlKGl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZShpdGVyYXRvciBpdCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIGlmIChpdCA9PSBiYXNlX3R5cGU6OmVuZCgpKQorICAgIHJldHVybiBpdDsKKworICBpdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIGVyYXNlX25vZGUoaXQubV9wX25kKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIHJldHVybiByZXRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnJldmVyc2VfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHJldmVyc2VfaXRlcmF0b3IgaXQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICBpZiAoaXQubV9wX25kID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgcmV0dXJuIGl0OworCisgIHJldmVyc2VfaXRlcmF0b3IgcmV0X2l0ID0gaXQ7CisgICsrcmV0X2l0OworICBlcmFzZV9ub2RlKGl0Lm1fcF9uZCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICByZXR1cm4gcmV0X2l0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitlcmFzZV9pZihQcmVkIHByZWQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBzaXplX3R5cGUgbnVtX2Vyc2QgPSAwOworICBpdGVyYXRvciBpdCA9IGJhc2VfdHlwZTo6YmVnaW4oKTsKKyAgd2hpbGUgKGl0ICE9IGJhc2VfdHlwZTo6ZW5kKCkpCisgICAgeworICAgICAgaWYgKHByZWQoKml0KSkKKyAgICAgICAgeworCSAgKytudW1fZXJzZDsKKwkgIGl0ID0gZXJhc2UoaXQpOworICAgICAgICB9CisgICAgICBlbHNlCisJKytpdDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX25vZGUobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHJlbW92ZV9ub2RlKHBfbmQpOworICBiYXNlX3R5cGU6OmFjdHVhbF9lcmFzZV9ub2RlKHBfbmQpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9ub2RlKG5vZGVfcG9pbnRlciBwX3opCit7CisgIHVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbm9kZShwX3opOworICBub2RlX3BvaW50ZXIgcF95ID0gcF96OworICBub2RlX3BvaW50ZXIgcF94ID0gMDsKKyAgbm9kZV9wb2ludGVyIHBfbmV3X3hfcGFyZW50ID0gMDsKKworICBpZiAocF95LT5tX3BfbGVmdCA9PSAwKQorICAgIHBfeCA9IHBfeS0+bV9wX3JpZ2h0OworICBlbHNlIGlmIChwX3ktPm1fcF9yaWdodCA9PSAwKQorICAgIHBfeCA9IHBfeS0+bV9wX2xlZnQ7CisgIGVsc2UKKyAgICB7CisgICAgICBwX3kgPSBwX3ktPm1fcF9yaWdodDsKKyAgICAgIHdoaWxlIChwX3ktPm1fcF9sZWZ0ICE9IDApCisJcF95ID0gcF95LT5tX3BfbGVmdDsKKyAgICAgIHBfeCA9IHBfeS0+bV9wX3JpZ2h0OworICAgIH0KKworICBpZiAocF95ID09IHBfeikKKyAgICB7CisgICAgICBwX25ld194X3BhcmVudCA9IHBfeS0+bV9wX3BhcmVudDsKKyAgICAgIGlmIChwX3ggIT0gMCkKKwlwX3gtPm1fcF9wYXJlbnQgPSBwX3ktPm1fcF9wYXJlbnQ7CisKKyAgICAgIGlmIChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID09IHBfeikKKwliYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF94OworICAgICAgZWxzZSBpZiAocF96LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9PSBwX3opCisgICAgICAgIHsKKwkgIHBfeS0+bV9wX2xlZnQgPSBwX3otPm1fcF9wYXJlbnQ7CisJICBwX3otPm1fcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF94OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIHBfeS0+bV9wX2xlZnQgPSAwOworCSAgcF96LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQgPSBwX3g7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwX3otPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID0gcF95OworICAgICAgcF95LT5tX3BfbGVmdCA9IHBfei0+bV9wX2xlZnQ7CisgICAgICBpZiAocF95ICE9IHBfei0+bV9wX3JpZ2h0KQorICAgICAgICB7CisJICBwX25ld194X3BhcmVudCA9IHBfeS0+bV9wX3BhcmVudDsKKwkgIGlmIChwX3ggIT0gMCkKKwkgICAgcF94LT5tX3BfcGFyZW50ID0gcF95LT5tX3BfcGFyZW50OworCSAgcF95LT5tX3BfcGFyZW50LT5tX3BfbGVmdCA9IHBfeDsKKwkgIHBfeS0+bV9wX3JpZ2h0ID0gcF96LT5tX3BfcmlnaHQ7CisJICBwX3otPm1fcF9yaWdodC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXBfbmV3X3hfcGFyZW50ID0gcF95OworCisgICAgICBpZiAoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9PSBwX3opCisJYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IHBfeTsKKyAgICAgIGVsc2UgaWYgKHBfei0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPT0gcF96KQorCXBfei0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3k7CisgICAgICBlbHNlCisJcF96LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQgPSBwX3k7CisKKyAgICAgIHBfeS0+bV9wX3BhcmVudCA9IHBfei0+bV9wX3BhcmVudDsKKyAgICAgIHN0ZDo6c3dhcChwX3ktPm1fcmVkLCBwX3otPm1fcmVkKTsKKyAgICAgIHBfeSA9IHBfejsKKyAgICB9CisKKyAgdXBkYXRlX3RvX3RvcChwX25ld194X3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisKKyAgaWYgKHBfeS0+bV9yZWQpCisgICAgcmV0dXJuOworCisgIHJlbW92ZV9maXh1cChwX3gsIHBfbmV3X3hfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9maXh1cChub2RlX3BvaW50ZXIgcF94LCBub2RlX3BvaW50ZXIgcF9uZXdfeF9wYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ggPT0gMCB8fCBwX3gtPm1fcF9wYXJlbnQgPT0gcF9uZXdfeF9wYXJlbnQpOworCisgIHdoaWxlIChwX3ggIT0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCAmJiBpc19lZmZlY3RpdmVseV9ibGFjayhwX3gpKQorICAgIGlmIChwX3ggPT0gcF9uZXdfeF9wYXJlbnQtPm1fcF9sZWZ0KQorICAgICAgeworCW5vZGVfcG9pbnRlciBwX3cgPSBwX25ld194X3BhcmVudC0+bV9wX3JpZ2h0OworCWlmIChwX3ctPm1fcmVkKQorCSAgeworCSAgICBwX3ctPm1fcmVkID0gZmFsc2U7CisJICAgIHBfbmV3X3hfcGFyZW50LT5tX3JlZCA9IHRydWU7CisJICAgIGJhc2VfdHlwZTo6cm90YXRlX2xlZnQocF9uZXdfeF9wYXJlbnQpOworCSAgICBwX3cgPSBwX25ld194X3BhcmVudC0+bV9wX3JpZ2h0OworCSAgfQorCisJaWYgKGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfdy0+bV9wX2xlZnQpIAorCSAgICAmJiBpc19lZmZlY3RpdmVseV9ibGFjayhwX3ctPm1fcF9yaWdodCkpCisJICB7CisJICAgIHBfdy0+bV9yZWQgPSB0cnVlOworCSAgICBwX3ggPSBwX25ld194X3BhcmVudDsKKwkgICAgcF9uZXdfeF9wYXJlbnQgPSBwX25ld194X3BhcmVudC0+bV9wX3BhcmVudDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmIChpc19lZmZlY3RpdmVseV9ibGFjayhwX3ctPm1fcF9yaWdodCkpCisJICAgICAgeworCQlpZiAocF93LT5tX3BfbGVmdCAhPSAwKQorCQkgIHBfdy0+bV9wX2xlZnQtPm1fcmVkID0gZmFsc2U7CisKKwkJcF93LT5tX3JlZCA9IHRydWU7CisJCWJhc2VfdHlwZTo6cm90YXRlX3JpZ2h0KHBfdyk7CisJCXBfdyA9IHBfbmV3X3hfcGFyZW50LT5tX3BfcmlnaHQ7CisJICAgICAgfQorCisJICAgIHBfdy0+bV9yZWQgPSBwX25ld194X3BhcmVudC0+bV9yZWQ7CisJICAgIHBfbmV3X3hfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworCisJICAgIGlmIChwX3ctPm1fcF9yaWdodCAhPSAwKQorCSAgICAgIHBfdy0+bV9wX3JpZ2h0LT5tX3JlZCA9IGZhbHNlOworCisJICAgIGJhc2VfdHlwZTo6cm90YXRlX2xlZnQocF9uZXdfeF9wYXJlbnQpOworCSAgICB1cGRhdGVfdG9fdG9wKHBfbmV3X3hfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCW5vZGVfcG9pbnRlciBwX3cgPSBwX25ld194X3BhcmVudC0+bV9wX2xlZnQ7CisJaWYgKHBfdy0+bV9yZWQgPT0gdHJ1ZSkKKwkgIHsKKwkgICAgcF93LT5tX3JlZCA9IGZhbHNlOworCSAgICBwX25ld194X3BhcmVudC0+bV9yZWQgPSB0cnVlOworCSAgICBiYXNlX3R5cGU6OnJvdGF0ZV9yaWdodChwX25ld194X3BhcmVudCk7CisJICAgIHBfdyA9IHBfbmV3X3hfcGFyZW50LT5tX3BfbGVmdDsKKwkgIH0KKworCWlmIChpc19lZmZlY3RpdmVseV9ibGFjayhwX3ctPm1fcF9yaWdodCkgCisJICAgICYmIGlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfdy0+bV9wX2xlZnQpKQorCSAgeworCSAgICBwX3ctPm1fcmVkID0gdHJ1ZTsKKwkgICAgcF94ID0gcF9uZXdfeF9wYXJlbnQ7CisJICAgIHBfbmV3X3hfcGFyZW50ID0gcF9uZXdfeF9wYXJlbnQtPm1fcF9wYXJlbnQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICBpZiAoaXNfZWZmZWN0aXZlbHlfYmxhY2socF93LT5tX3BfbGVmdCkpCisJICAgICAgeworCQlpZiAocF93LT5tX3BfcmlnaHQgIT0gMCkKKwkJICBwX3ctPm1fcF9yaWdodC0+bV9yZWQgPSBmYWxzZTsKKworCQlwX3ctPm1fcmVkID0gdHJ1ZTsKKwkJYmFzZV90eXBlOjpyb3RhdGVfbGVmdChwX3cpOworCQlwX3cgPSBwX25ld194X3BhcmVudC0+bV9wX2xlZnQ7CisJICAgICAgfQorCisJICAgIHBfdy0+bV9yZWQgPSBwX25ld194X3BhcmVudC0+bV9yZWQ7CisJICAgIHBfbmV3X3hfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworCisJICAgIGlmIChwX3ctPm1fcF9sZWZ0ICE9IDApCisJICAgICAgcF93LT5tX3BfbGVmdC0+bV9yZWQgPSBmYWxzZTsKKworCSAgICBiYXNlX3R5cGU6OnJvdGF0ZV9yaWdodChwX25ld194X3BhcmVudCk7CisJICAgIHVwZGF0ZV90b190b3AocF9uZXdfeF9wYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworCSAgICBicmVhazsKKwkgIH0KKyAgICAgIH0KKworICBpZiAocF94ICE9IDApCisgICAgcF94LT5tX3JlZCA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNzhlMTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2ZpbmRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZmluZF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmNjk3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5mb19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDQ2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbmZvX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19lZmZlY3RpdmVseV9ibGFjayhjb25zdCBub2RlX3BvaW50ZXIgcF9uZCkKK3sgcmV0dXJuIChwX25kID09IDAgfHwgIXBfbmQtPm1fcmVkKTsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMmRlYWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaW5zZXJ0X2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmJfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPiBpbnNfcGFpciA9IGJhc2VfdHlwZTo6aW5zZXJ0X2xlYWYocl92YWx1ZSk7CisgIGlmIChpbnNfcGFpci5zZWNvbmQgPT0gdHJ1ZSkKKyAgICB7CisgICAgICBpbnNfcGFpci5maXJzdC5tX3BfbmQtPm1fcmVkID0gdHJ1ZTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkodGhpcy0+c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgaW5zZXJ0X2ZpeHVwKGluc19wYWlyLmZpcnN0Lm1fcF9uZCk7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICByZXR1cm4gaW5zX3BhaXI7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2ZpeHVwKG5vZGVfcG9pbnRlciBwX25kKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9yZWQgPT0gdHJ1ZSk7CisgIHdoaWxlIChwX25kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgJiYgcF9uZC0+bV9wX3BhcmVudC0+bV9yZWQpCisgICAgeworICAgICAgaWYgKHBfbmQtPm1fcF9wYXJlbnQgPT0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9wX2xlZnQpCisgICAgICAgIHsKKwkgIG5vZGVfcG9pbnRlciBwX3kgPSBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3BfcmlnaHQ7CisJICBpZiAocF95ICE9IDAgJiYgcF95LT5tX3JlZCkKKyAgICAgICAgICAgIHsKKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworCSAgICAgIHBfeS0+bV9yZWQgPSBmYWxzZTsKKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3JlZCA9IHRydWU7CisJICAgICAgcF9uZCA9IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQ7CisgICAgICAgICAgICB9CisJICBlbHNlCisgICAgICAgICAgICB7CisJICAgICAgaWYgKHBfbmQgPT0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0KQorICAgICAgICAgICAgICAgIHsKKwkJICBwX25kID0gcF9uZC0+bV9wX3BhcmVudDsKKwkJICBiYXNlX3R5cGU6OnJvdGF0ZV9sZWZ0KHBfbmQpOworICAgICAgICAgICAgICAgIH0KKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgICBiYXNlX3R5cGU6OnJvdGF0ZV9yaWdodChwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisJICBub2RlX3BvaW50ZXIgcF95ID0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9wX2xlZnQ7CisJICBpZiAocF95ICE9IDAgJiYgcF95LT5tX3JlZCkKKyAgICAgICAgICAgIHsKKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworCSAgICAgIHBfeS0+bV9yZWQgPSBmYWxzZTsKKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3BfcGFyZW50LT5tX3JlZCA9IHRydWU7CisJICAgICAgcF9uZCA9IHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQ7CisgICAgICAgICAgICB9CisJICBlbHNlCisgICAgICAgICAgICB7CisJICAgICAgaWYgKHBfbmQgPT0gcF9uZC0+bV9wX3BhcmVudC0+bV9wX2xlZnQpCisgICAgICAgICAgICAgICAgeworCQkgIHBfbmQgPSBwX25kLT5tX3BfcGFyZW50OworCQkgIGJhc2VfdHlwZTo6cm90YXRlX3JpZ2h0KHBfbmQpOworICAgICAgICAgICAgICAgIH0KKwkgICAgICBwX25kLT5tX3BfcGFyZW50LT5tX3JlZCA9IGZhbHNlOworCSAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcmVkID0gdHJ1ZTsKKwkgICAgICBiYXNlX3R5cGU6OnJvdGF0ZV9sZWZ0KHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIGJhc2VfdHlwZTo6dXBkYXRlX3RvX3RvcChwX25kLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudC0+bV9yZWQgPSBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vbm9kZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL25vZGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMjRjNzYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL25vZGUuaHBwCkBAIC0wLDAgKzEsMTM4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBub2RlLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfUkJfVFJFRV9OT0RFX0hQUAorI2RlZmluZSBQQl9EU19SQl9UUkVFX05PREVfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIE1ldGFkYXRhLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHJiX3RyZWVfbm9kZV8KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIE1ldGFkYXRhIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgcmJfdHJlZV9ub2RlXzwKKyAgICAgIFZhbHVlX1R5cGUsCisgICAgICBNZXRhZGF0YSwKKyAgICAgIEFsbG9jYXRvcj4gPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbWV0YWRhdGFfdHlwZT46Om90aGVyOjpyZWZlcmVuY2UKKyAgICAgIG1ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJbWV0YWRhdGFfdHlwZT46Om90aGVyOjpjb25zdF9yZWZlcmVuY2UKKyAgICAgIGNvbnN0X21ldGFkYXRhX3JlZmVyZW5jZTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIHNwZWNpYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9yZWQ7IH0KKworICAgICAgaW5saW5lIGNvbnN0X21ldGFkYXRhX3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fbWV0YWRhdGE7IH0KKworICAgICAgaW5saW5lIG1ldGFkYXRhX3JlZmVyZW5jZQorICAgICAgZ2V0X21ldGFkYXRhKCkKKyAgICAgIHsgcmV0dXJuIG1fbWV0YWRhdGE7IH0KKworI2lmZGVmIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9UUkFDRV8KKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6OmNvdXQgPDwgUEJfRFNfVjJGKG1fdmFsdWUpIDw8KG1fcmVkPyAiIDxyPiAiIDogIiA8Yj4gIikgCisJCSAgPDwgIigiIDw8IG1fbWV0YWRhdGEgPDwgIikiOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbGVmdDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcmlnaHQ7CisgICAgICBub2RlX3BvaW50ZXIgbV9wX3BhcmVudDsKKyAgICAgIHZhbHVlX3R5cGUgbV92YWx1ZTsKKyAgICAgIGJvb2wgbV9yZWQ7CisgICAgICBtZXRhZGF0YV90eXBlIG1fbWV0YWRhdGE7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgcmJfdHJlZV9ub2RlXzxWYWx1ZV9UeXBlLCBudWxsX25vZGVfbWV0YWRhdGEsIEFsbG9jYXRvcj4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIG51bGxfbm9kZV9tZXRhZGF0YSBtZXRhZGF0YV90eXBlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKyAgICAgIHJiX3RyZWVfbm9kZV88CisgICAgICBWYWx1ZV9UeXBlLAorICAgICAgbnVsbF9ub2RlX21ldGFkYXRhLAorICAgICAgQWxsb2NhdG9yPiA+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgc3BlY2lhbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3JlZDsgfQorCisjaWZkZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdAorICAgICAgeyBzdGQ6OmNvdXQgPDwgUEJfRFNfVjJGKG1fdmFsdWUpIDw8KG1fcmVkPyAiIDxyPiAiIDogIiA8Yj4gIik7IH0KKyNlbmRpZiAKKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9sZWZ0OworICAgICAgbm9kZV9wb2ludGVyIG1fcF9yaWdodDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcGFyZW50OworICAgICAgdmFsdWVfdHlwZSBtX3ZhbHVlOworICAgICAgYm9vbCBtX3JlZDsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3JiX3RyZWVfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg0YThlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9yYl90cmVlXy5ocHAKQEAgLTAsMCArMSwyODAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHJiX3RyZWVfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisvKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIGlkZWEgZnJvbSB0aGUgU0dJIFNUTCAodXNpbmcgYSBAYSBoZWFkZXIgbm9kZQorICogICAgd2hpY2ggaXMgbmVlZGVkIGZvciBlZmZpY2llbnQgaXRlcmF0aW9uKS4KKyAqLworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfSFBQX19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9IUFBfX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHA+CisjZW5kaWYgCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfSFBQX19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19CSU5fU0VBUkNIX1RSRUVfSFBQX19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcD4KKyNlbmRpZiAKKyNlbmRpZiAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHlwZXMuaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NMQVNTX05BTUUgcmJfdHJlZV9kYXRhXworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19CQVNFX0NMQVNTX05BTUUgYmluX3NlYXJjaF90cmVlX2RhdGFfCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19DTEFTU19OQU1FIHJiX3RyZWVfbm9fZGF0YV8KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0JBU0VfQ0xBU1NfTkFNRSBiaW5fc2VhcmNoX3RyZWVfbm9fZGF0YV8KKyNlbmRpZiAKKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgUEJfRFNfQ0xBU1NfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBQQl9EU19CQVNFX0NMQVNTX05BTUU8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9BbmRfSXRfVHJhaXRzLCBBbGxvY2F0b3I+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1YyRihYKSAoWCkuZmlyc3QKKyNkZWZpbmUgUEJfRFNfVjJTKFgpIChYKS5zZWNvbmQKKyNkZWZpbmUgUEJfRFNfRVAyVlAoWCkmICgoWCktPm1fdmFsdWUpCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpCisjZGVmaW5lIFBCX0RTX1YyUyhYKSBNYXBwZWRfRGF0YSgpCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlLmZpcnN0KQorI2VuZGlmIAorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgTWFwcGVkLAorCSAgICAgdHlwZW5hbWUgQ21wX0ZuLAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLAorCSAgICAgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGNsYXNzIFBCX0RTX0NMQVNTX05BTUUgOiBwdWJsaWMgUEJfRFNfQkFTRV9DX0RFQworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgbm9kZV9wb2ludGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBDbXBfRm4gY21wX2ZuOworICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV90eXBlIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9wb2ludGVyIGtleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2tleV9wb2ludGVyIGNvbnN0X2tleV9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmtleV9yZWZlcmVuY2Uga2V5X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9rZXlfcmVmZXJlbmNlIGNvbnN0X2tleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX3BvaW50ZXIgbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfbWFwcGVkX3BvaW50ZXIgY29uc3RfbWFwcGVkX3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bWFwcGVkX3JlZmVyZW5jZSBtYXBwZWRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X21hcHBlZF9yZWZlcmVuY2UgY29uc3RfbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3BvaW50ZXIgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3VwZGF0ZSBub2RlX3VwZGF0ZTsKKworCisgICAgICBQQl9EU19DTEFTU19OQU1FKCk7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgQ21wX0ZuJik7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoY29uc3QgQ21wX0ZuJiwgY29uc3Qgbm9kZV91cGRhdGUmKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBQQl9EU19DTEFTU19DX0RFQyYpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICAgICAgdm9pZAorICAgICAgY29weV9mcm9tX3JhbmdlKEl0LCBJdCk7CisKKyAgICAgIGlubGluZSBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3RfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPiBpbnNfcGFpciA9CisJYmFzZV90eXBlOjppbnNlcnRfbGVhZih2YWx1ZV90eXBlKHJfa2V5LCBtYXBwZWRfdHlwZSgpKSk7CisKKwlpZiAoaW5zX3BhaXIuc2Vjb25kID09IHRydWUpCisJICB7CisJICAgIGluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV9yZWQgPSB0cnVlOworCSAgICBfR0xJQkNYWF9ERUJVR19PTkxZKHRoaXMtPnN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKwkgICAgaW5zZXJ0X2ZpeHVwKGluc19wYWlyLmZpcnN0Lm1fcF9uZCk7CisJICB9CisJX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisJcmV0dXJuIGluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV92YWx1ZS5zZWNvbmQ7CisjZWxzZSAKKwlpbnNlcnQocl9rZXkpOworCXJldHVybiBiYXNlX3R5cGU6OnNfbnVsbF9tYXBwZWQ7CisjZW5kaWYgCisgICAgICB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBlcmFzZShjb25zdF9rZXlfcmVmZXJlbmNlKTsKKworICAgICAgaW5saW5lIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvcik7CisKKyAgICAgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yCisgICAgICBlcmFzZShyZXZlcnNlX2l0ZXJhdG9yKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUHJlZD4KKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQpOworCisgICAgICB2b2lkCisgICAgICBqb2luKFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0KGNvbnN0X2tleV9yZWZlcmVuY2UsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICBwcml2YXRlOgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworCisgICAgICBzaXplX3R5cGUKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQoY29uc3Qgbm9kZV9wb2ludGVyKSBjb25zdDsKKyNlbmRpZiAKKworICAgICAgaW5saW5lIHN0YXRpYyBib29sCisgICAgICBpc19lZmZlY3RpdmVseV9ibGFjayhjb25zdCBub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBpbml0aWFsaXplKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydF9maXh1cChub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9ub2RlKG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlbW92ZV9maXh1cChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGl0X2ltcChub2RlX3BvaW50ZXIsIFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIHNwbGl0X21pbigpOworCisgICAgICBzdGQ6OnBhaXI8bm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXI+CisgICAgICBzcGxpdF9taW5faW1wKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW5faW1wKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgc3RkOjpwYWlyPG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyPgorICAgICAgZmluZF9qb2luX3Bvc19yaWdodChub2RlX3BvaW50ZXIsIHNpemVfdHlwZSwgc2l6ZV90eXBlKTsKKworICAgICAgc3RkOjpwYWlyPG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyPgorICAgICAgZmluZF9qb2luX3Bvc19sZWZ0KG5vZGVfcG9pbnRlciwgc2l6ZV90eXBlLCBzaXplX3R5cGUpOworCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBibGFja19oZWlnaHQobm9kZV9wb2ludGVyKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXRfYXRfbm9kZShub2RlX3BvaW50ZXIsIFBCX0RTX0NMQVNTX0NfREVDJik7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9lcmFzZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JiX3RyZWVfbWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL2luZm9fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfTkFNRQorI3VuZGVmIFBCX0RTX0JBU0VfQ0xBU1NfTkFNRQorI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKyN1bmRlZiBQQl9EU19WMkYKKyN1bmRlZiBQQl9EU19FUDJWUAorI3VuZGVmIFBCX0RTX1YyUworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjZDM5OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDMxMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5iYXNlX3R5cGU6OmFzc2VydF92YWxpZCgpOykKKyAgaWYgKGJhc2VfdHlwZTo6am9pbl9wcmVwKG90aGVyKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBjb25zdCBub2RlX3BvaW50ZXIgcF94ID0gb3RoZXIuc3BsaXRfbWluKCk7CisgIGpvaW5faW1wKHBfeCwgb3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQpOworICBiYXNlX3R5cGU6OmpvaW5fZmluaXNoKG90aGVyKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKCk7KQorIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2pvaW5faW1wKG5vZGVfcG9pbnRlciBwX3gsIG5vZGVfcG9pbnRlciBwX3IpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ggIT0gMCk7CisgIGlmIChwX3IgIT0gMCkKKyAgICBwX3ItPm1fcmVkID0gZmFsc2U7CisKKyAgY29uc3Qgc2l6ZV90eXBlIGggPSBibGFja19oZWlnaHQoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCk7CisgIGNvbnN0IHNpemVfdHlwZSBvdGhlcl9oID0gYmxhY2tfaGVpZ2h0KHBfcik7CisgIG5vZGVfcG9pbnRlciBwX3hfbDsKKyAgbm9kZV9wb2ludGVyIHBfeF9yOworICBzdGQ6OnBhaXI8bm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXI+IGpvaW5fcG9zOworICBjb25zdCBib29sIHJpZ2h0X2pvaW4gPSBoID49IG90aGVyX2g7CisgIGlmIChyaWdodF9qb2luKQorICAgIHsKKyAgICAgIGpvaW5fcG9zID0gZmluZF9qb2luX3Bvc19yaWdodChiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50LCAKKwkJCQkgICAgIGgsIG90aGVyX2gpOworICAgICAgcF94X2wgPSBqb2luX3Bvcy5maXJzdDsKKyAgICAgIHBfeF9yID0gcF9yOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHBfeF9sID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3I7CisgICAgICBpZiAocF9yICE9IDApCisJcF9yLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKworICAgICAgam9pbl9wb3MgPSBmaW5kX2pvaW5fcG9zX2xlZnQoYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCwgCisJCQkJICAgIGgsIG90aGVyX2gpOworICAgICAgcF94X3IgPSBqb2luX3Bvcy5maXJzdDsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gam9pbl9wb3Muc2Vjb25kOworICBpZiAocF9wYXJlbnQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF94OworICAgICAgcF94LT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBwX3gtPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKyAgICAgIGlmIChyaWdodF9qb2luKQorCXBfeC0+bV9wX3BhcmVudC0+bV9wX3JpZ2h0ID0gcF94OworICAgICAgZWxzZQorCXBfeC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPSBwX3g7CisgICAgfQorCisgIHBfeC0+bV9wX2xlZnQgPSBwX3hfbDsKKyAgaWYgKHBfeF9sICE9IDApCisgICAgcF94X2wtPm1fcF9wYXJlbnQgPSBwX3g7CisKKyAgcF94LT5tX3BfcmlnaHQgPSBwX3hfcjsKKyAgaWYgKHBfeF9yICE9IDApCisgICAgcF94X3ItPm1fcF9wYXJlbnQgPSBwX3g7CisKKyAgcF94LT5tX3JlZCA9IHRydWU7CisKKyAgYmFzZV90eXBlOjppbml0aWFsaXplX21pbl9tYXgoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShiYXNlX3R5cGU6OnN0cnVjdHVyZV9vbmx5X2Fzc2VydF92YWxpZCgpOykKKyAgYmFzZV90eXBlOjp1cGRhdGVfdG9fdG9wKHBfeCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisgIGluc2VydF9maXh1cChwX3gpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGl0X21pbigpCit7CisgIG5vZGVfcG9pbnRlciBwX21pbiA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9sZWZ0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfaGVhZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX21pbiAhPSBwX2hlYWQpOworI2VuZGlmIAorCisgIHJlbW92ZV9ub2RlKHBfbWluKTsKKyAgcmV0dXJuIHBfbWluOworfQorCitQQl9EU19DTEFTU19UX0RFQworc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyLAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9qb2luX3Bvc19yaWdodChub2RlX3BvaW50ZXIgcF9sLCBzaXplX3R5cGUgaF9sLCBzaXplX3R5cGUgaF9yKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaF9sID49IGhfcik7CisKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKChub2RlX3BvaW50ZXIpMCwgYmFzZV90eXBlOjptX3BfaGVhZCkpOworCisgIG5vZGVfcG9pbnRlciBwX2xfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgd2hpbGUgKGhfbCA+IGhfcikKKyAgICB7CisgICAgICBpZiAocF9sLT5tX3JlZCA9PSBmYWxzZSkKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGhfbCA+IDApOworCSAgLS1oX2w7CisgICAgICAgIH0KKworICAgICAgcF9sX3BhcmVudCA9IHBfbDsKKyAgICAgIHBfbCA9IHBfbC0+bV9wX3JpZ2h0OworICAgIH0KKworICBpZiAoIWlzX2VmZmVjdGl2ZWx5X2JsYWNrKHBfbCkpCisgICAgeworICAgICAgcF9sX3BhcmVudCA9IHBfbDsKKyAgICAgIHBfbCA9IHBfbC0+bV9wX3JpZ2h0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXNfZWZmZWN0aXZlbHlfYmxhY2socF9sKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChibGFja19oZWlnaHQocF9sKSA9PSBoX3IpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9sID09IDAgfHwgcF9sLT5tX3BfcGFyZW50ID09IHBfbF9wYXJlbnQpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIocF9sLCBwX2xfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3N0ZDo6cGFpcjwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlciwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcj4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmRfam9pbl9wb3NfbGVmdChub2RlX3BvaW50ZXIgcF9yLCBzaXplX3R5cGUgaF9sLCBzaXplX3R5cGUgaF9yKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaF9yID4gaF9sKTsKKyAgaWYgKGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPT0gMCkKKyAgICByZXR1cm4gKHN0ZDo6bWFrZV9wYWlyKChub2RlX3BvaW50ZXIpMCwKKwkJCSAgIGJhc2VfdHlwZTo6bV9wX2hlYWQpKTsKKyAgbm9kZV9wb2ludGVyIHBfcl9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICB3aGlsZSAoaF9yID4gaF9sKQorICAgIHsKKyAgICAgIGlmIChwX3ItPm1fcmVkID09IGZhbHNlKQorICAgICAgICB7CisJICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaF9yID4gMCk7CisJICAtLWhfcjsKKyAgICAgICAgfQorCisgICAgICBwX3JfcGFyZW50ID0gcF9yOworICAgICAgcF9yID0gcF9yLT5tX3BfbGVmdDsKKyAgICB9CisKKyAgaWYgKCFpc19lZmZlY3RpdmVseV9ibGFjayhwX3IpKQorICAgIHsKKyAgICAgIHBfcl9wYXJlbnQgPSBwX3I7CisgICAgICBwX3IgPSBwX3ItPm1fcF9sZWZ0OworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoaXNfZWZmZWN0aXZlbHlfYmxhY2socF9yKSk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChibGFja19oZWlnaHQocF9yKSA9PSBoX2wpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9yID09IDAgfHwgcF9yLT5tX3BfcGFyZW50ID09IHBfcl9wYXJlbnQpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIocF9yLCBwX3JfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitibGFja19oZWlnaHQobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIHNpemVfdHlwZSBoID0gMTsKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICB7CisgICAgICBpZiAocF9uZC0+bV9yZWQgPT0gZmFsc2UpCisJKytoOworICAgICAgcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgIH0KKyAgcmV0dXJuIGg7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoKTspCisKKyAgICBpZiAoYmFzZV90eXBlOjpzcGxpdF9wcmVwKHJfa2V5LCBvdGhlcikgPT0gZmFsc2UpCisgICAgICB7CisgICAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICAgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjpzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYmFzZV90eXBlOjpzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCisgIG5vZGVfcG9pbnRlciBwX25kID0gdXBwZXJfYm91bmQocl9rZXkpLm1fcF9uZDsKKyAgZG8KKyAgICB7CisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0X25kID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpCisJc3BsaXRfYXRfbm9kZShwX25kLCBvdGhlcik7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjpzdHJ1Y3R1cmVfb25seV9hc3NlcnRfdmFsaWQoKTspCisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcF9uZCA9IHBfbmV4dF9uZDsKKyAgICB9CisgIHdoaWxlIChwX25kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpOworCisgIGJhc2VfdHlwZTo6c3BsaXRfZmluaXNoKG90aGVyKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXRfYXRfbm9kZShub2RlX3BvaW50ZXIgcF9uZCwgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKworICBub2RlX3BvaW50ZXIgcF9sID0gcF9uZC0+bV9wX2xlZnQ7CisgIG5vZGVfcG9pbnRlciBwX3IgPSBwX25kLT5tX3BfcmlnaHQ7CisgIG5vZGVfcG9pbnRlciBwX3BhcmVudCA9IHBfbmQtPm1fcF9wYXJlbnQ7CisgIGlmIChwX3BhcmVudCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX2w7CisgICAgICBpZiAocF9sICE9IDApCisgICAgICAgIHsKKwkgIHBfbC0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisJICBwX2wtPm1fcmVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAocF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfbmQpCisJcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF9sOworICAgICAgZWxzZQorCXBfcGFyZW50LT5tX3BfcmlnaHQgPSBwX2w7CisKKyAgICAgIGlmIChwX2wgIT0gMCkKKwlwX2wtPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICAgICAgdXBkYXRlX3RvX3RvcChwX3BhcmVudCwgKG5vZGVfdXBkYXRlKiApdGhpcyk7CisKKyAgICAgIGlmICghcF9uZC0+bV9yZWQpCisJcmVtb3ZlX2ZpeHVwKHBfbCwgcF9wYXJlbnQpOworICAgIH0KKworICBiYXNlX3R5cGU6OmluaXRpYWxpemVfbWluX21heCgpOworICBvdGhlci5qb2luX2ltcChwX25kLCBwX3IpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCkpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCkpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3RyYWl0cy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmJfdHJlZV9tYXBfL3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxZDhlNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vdHJhaXRzLmhwcApAQCAtMCwwICsxLDEyNCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJhaXRzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJiX3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfUkJfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1JCX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yYl90cmVlX21hcF8vbm9kZS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIHR5cGVuYW1lIE1hcHBlZCwKKwkgICAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIE5vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIGNsYXNzIEFsbG9jYXRvcl8+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPAorICAgICAgS2V5LAorICAgICAgTWFwcGVkLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICByYl90cmVlX3RhZywKKyAgICAgIEFsbG9jYXRvcj4gOiBwdWJsaWMgYmluX3NlYXJjaF90cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgcmJfdHJlZV9ub2RlXzwKKyAgICAgIHR5cGVuYW1lIHR5cGVzX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIEFsbG9jYXRvciwKKyAgICAgIGZhbHNlPjo6dmFsdWVfdHlwZSwKKyAgICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9zZWxlY3RvcjwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgQWxsb2NhdG9yPjo6dHlwZSwKKyAgICAgIEFsbG9jYXRvcj4sCisgICAgICBBbGxvY2F0b3I+CisgICAgeyB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgQ21wX0ZuXywKKwkJICAgICAgY2xhc3MgQWxsb2NhdG9yXz4KKyAgICBjbGFzcyBOb2RlX1VwZGF0ZSwKKwkgICAgIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBzdHJ1Y3QgdHJlZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBudWxsX21hcHBlZF90eXBlLAorICAgICAgQ21wX0ZuLAorICAgICAgTm9kZV9VcGRhdGUsCisgICAgICByYl90cmVlX3RhZywKKyAgICAgIEFsbG9jYXRvcj4gOiBwdWJsaWMgYmluX3NlYXJjaF90cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfbWFwcGVkX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIHJiX3RyZWVfbm9kZV88CisgICAgICB0eXBlbmFtZSB0eXBlc190cmFpdHM8CisgICAgICBLZXksCisgICAgICBudWxsX21hcHBlZF90eXBlLAorICAgICAgQWxsb2NhdG9yLAorICAgICAgZmFsc2U+Ojp2YWx1ZV90eXBlLAorICAgICAgdHlwZW5hbWUgdHJlZV9ub2RlX21ldGFkYXRhX3NlbGVjdG9yPAorICAgICAgS2V5LAorICAgICAgbnVsbF9tYXBwZWRfdHlwZSwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgQWxsb2NhdG9yPjo6dHlwZSwKKyAgICAgIEFsbG9jYXRvcj4sCisgICAgICBBbGxvY2F0b3I+CisgICAgeyB9OworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0ZGNmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDg4IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBjb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJjX2Jpbm9taWFsX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CityY19iaW5vbWlhbF9oZWFwXygpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JjX2Jpbm9taWFsX2hlYXBfKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgUEJfRFNfQkFTRV9DX0RFQyhyX2NtcF9mbikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmNfYmlub21pYWxfaGVhcF8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisgIFBCX0RTX0JBU0VfQ19ERUMob3RoZXIpCit7CisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworCisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+cmNfYmlub21pYWxfaGVhcF8oKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisKKyAgICBiYXNlX3R5cGU6OnN3YXAob3RoZXIpOworCisgIG1fcmMuc3dhcChvdGhlci5tX3JjKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgICB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjYyNDZmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTIxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJjX2Jpbm9taWFsX2hlYXBfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoZmFsc2UpOworICBpZiAoIWJhc2VfdHlwZTo6ZW1wdHkoKSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfbWF4ICE9IDApOworICAgICAgYmFzZV90eXBlOjphc3NlcnRfbWF4KCk7CisgICAgfQorCisgIG1fcmMuYXNzZXJ0X3ZhbGlkKCk7CisKKyAgaWYgKG1fcmMuZW1wdHkoKSkKKyAgICB7CisgICAgICBiYXNlX3R5cGU6OmFzc2VydF92YWxpZCh0cnVlKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChuZXh0XzJfcG9pbnRlcihiYXNlX3R5cGU6Om1fcF9yb290KSA9PSAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQgPSBuZXh0XzJfcG9pbnRlcihiYXNlX3R5cGU6Om1fcF9yb290KTsKKyAgdHlwZW5hbWUgcmNfdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JjLmVuZCgpOworICAtLWl0OworCisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCppdCA9PSBwX25kKTsKKyAgICAgIGNvbnN0X25vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV4dCAhPSAwKTsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhID09IHBfbmV4dC0+bV9tZXRhZGF0YSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nID09IDAgfHwKKwkJICAgICAgIHBfbmV4dC0+bV9tZXRhZGF0YSA8IHBfbmV4dC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSk7CisKKyAgICAgIC0taXQ7CisgICAgICBwX25kID0gbmV4dF8yX3BvaW50ZXIobmV4dF9hZnRlcl8wX3BvaW50ZXIocF9uZCkpOworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGl0ICsgMSA9PSBtX3JjLmJlZ2luKCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X25vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbmV4dF8yX3BvaW50ZXIoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgaWYgKHBfbmV4dCA9PSAwKQorICAgIHJldHVybiAwOworCisgIGlmIChwX25kLT5tX21ldGFkYXRhID09IHBfbmV4dC0+bV9tZXRhZGF0YSkKKyAgICByZXR1cm4gcF9uZDsKKworICByZXR1cm4gbmV4dF8yX3BvaW50ZXIocF9uZXh0KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9ub2RlX3BvaW50ZXIKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25leHRfYWZ0ZXJfMF9wb2ludGVyKGNvbnN0X25vZGVfcG9pbnRlciBwX25kKQoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybiAwOworCisgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX25leHQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAocF9uZC0+bV9tZXRhZGF0YSA8IHBfbmV4dC0+bV9tZXRhZGF0YSkKKyAgICByZXR1cm4gcF9uZXh0OworCisgIHJldHVybiBuZXh0X2FmdGVyXzBfcG9pbnRlcihwX25leHQpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkMjQwYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwNyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByY19iaW5vbWlhbF9oZWFwXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3BvcCgpCit7CisgIG1ha2VfYmlub21pYWxfaGVhcCgpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgIGJhc2VfdHlwZTo6cG9wKCk7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NsZWFyKCkKK3sKKyAgYmFzZV90eXBlOjpjbGVhcigpOworICBtX3JjLmNsZWFyKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2Jpbm9taWFsX2hlYXAoKQoreworICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisgICAgICBpZiAocF9uZXh0ID09IDApCisJcF9uZCA9IHBfbmV4dDsKKyAgICAgIGVsc2UgaWYgKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZXh0LT5tX21ldGFkYXRhKQorCXBfbmQgPSBsaW5rX3dpdGhfbmV4dF9zaWJsaW5nKHBfbmQpOworICAgICAgZWxzZSBpZiAocF9uZC0+bV9tZXRhZGF0YSA8IHBfbmV4dC0+bV9tZXRhZGF0YSkKKwlwX25kID0gcF9uZXh0OworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICBlbHNlCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKDApOworI2VuZGlmIAorICAgIH0KKworICBtX3JjLmNsZWFyKCk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgY29uc3Qgc2l6ZV90eXBlIGVyc2QgPSBiYXNlX3R5cGU6OmVyYXNlX2lmKHByZWQpOworICBiYXNlX3R5cGU6OmZpbmRfbWF4KCk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICByZXR1cm4gZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBtYWtlX2Jpbm9taWFsX2hlYXAoKTsKKyAgYmFzZV90eXBlOjplcmFzZShpdCk7CisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkMTg5ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9pbnNlcnRfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxNTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluc2VydF9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJjX2Jpbm9taWFsX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICBtYWtlXzBfZXhwb3NlZCgpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgbm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6OmdldF9uZXdfbm9kZV9mb3JfaW5zZXJ0KHJfdmFsKTsKKworICBwX25kLT5tX3BfbF9jaGlsZCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworCisgIGlmIChiYXNlX3R5cGU6Om1fcF9tYXggPT0gMCB8fCBDbXBfRm46Om9wZXJhdG9yKCkoYmFzZV90eXBlOjptX3BfbWF4LT5tX3ZhbHVlLCByX3ZhbCkpCisgICAgYmFzZV90eXBlOjptX3BfbWF4ID0gcF9uZDsKKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCAhPSAwKQorICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQ7CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisKKyAgaWYgKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCYmICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nLT5tX21ldGFkYXRhID09IDApCisgICAgbV9yYy5wdXNoKHBfbmQpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbW9kaWZ5KHBvaW50X2l0ZXJhdG9yIGl0LCBjb25zdF9yZWZlcmVuY2Ugcl9uZXdfdmFsKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKworICAgIG1ha2VfYmlub21pYWxfaGVhcCgpOworCisgIGJhc2VfdHlwZTo6bW9kaWZ5KGl0LCByX25ld192YWwpOworCisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbGlua193aXRoX25leHRfc2libGluZyhub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV4dCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IHBfbmQpOworCisgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkocF9uZC0+bV92YWx1ZSwgcF9uZXh0LT5tX3ZhbHVlKSkKKyAgICB7CisgICAgICBwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKworICAgICAgaWYgKHBfbmV4dC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApCisJYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmV4dDsKKyAgICAgIGVsc2UKKwlwX25leHQtPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfbmV4dDsKKworICAgICAgaWYgKGJhc2VfdHlwZTo6bV9wX21heCA9PSBwX25kKQorCWJhc2VfdHlwZTo6bV9wX21heCA9IHBfbmV4dDsKKworICAgICAgYmFzZV90eXBlOjptYWtlX2NoaWxkX29mKHBfbmQsIHBfbmV4dCk7CisKKyAgICAgICsrcF9uZXh0LT5tX21ldGFkYXRhOworCisgICAgICByZXR1cm4gcF9uZXh0OworICAgIH0KKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZXh0LT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX25kLT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF9uZDsKKworICBpZiAoYmFzZV90eXBlOjptX3BfbWF4ID09IHBfbmV4dCkKKyAgICBiYXNlX3R5cGU6Om1fcF9tYXggPSBwX25kOworCisgIGJhc2VfdHlwZTo6bWFrZV9jaGlsZF9vZihwX25leHQsIHBfbmQpOworCisgICsrcF9uZC0+bV9tZXRhZGF0YTsKKworICByZXR1cm4gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21ha2VfMF9leHBvc2VkKCkKK3sKKyAgaWYgKG1fcmMuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3JjLnRvcCgpOworCisgIG1fcmMucG9wKCk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgIT0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhID09IHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpOworCisgIG5vZGVfcG9pbnRlciBwX3JlcyA9IGxpbmtfd2l0aF9uZXh0X3NpYmxpbmcocF9uZCk7CisKKyAgaWYgKHBfcmVzLT5tX3BfbmV4dF9zaWJsaW5nICE9IDAmJiAgcF9yZXMtPm1fbWV0YWRhdGEgPT0gcF9yZXMtPm1fcF9uZXh0X3NpYmxpbmctPm1fbWV0YWRhdGEpCisgICAgbV9yYy5wdXNoKHBfcmVzKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9yYy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmMuaHBwCkBAIC0wLDAgKzEsMjYyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSByYy5ocHAKKyAqIENvbnRhaW5zIGEgcmVkdW5kYW50IChiaW5hcnkgY291bnRlcikuCisgKi8KKworI2lmbmRlZiBQQl9EU19SQ19IUFAKKyNkZWZpbmUgUEJfRFNfUkNfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlLCBjbGFzcyBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICAgIHJjPE5vZGUsIEFsbG9jYXRvcj4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGUsIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyByYworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgTm9kZSBub2RlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGVfcG9pbnRlcj46Om90aGVyOjpwb2ludGVyCisgICAgICBlbnRyeV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6dGVtcGxhdGUgcmViaW5kPAorCW5vZGVfcG9pbnRlcj46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9lbnRyeV9wb2ludGVyOworCisgICAgICBlbnVtCisJeworCSAgbWF4X2VudHJpZXMgPSBzaXplb2Yoc2l6ZV90eXBlKSA8PCAzCisJfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZV9wb2ludGVyIGVudHJ5OworCisgICAgICB0eXBlZGVmIGNvbnN0X2VudHJ5X3BvaW50ZXIgY29uc3RfaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICByYygpOworCisgICAgICByYyhjb25zdCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcHVzaChlbnRyeSBwX25kKTsKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgdG9wKCkgY29uc3Q7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBwb3AoKTsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3Q7CisKKyAgICAgIGlubGluZSBzaXplX3R5cGUKKyAgICAgIHNpemUoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKTsKKworICAgICAgY29uc3QgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3Q7CisKKyAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX1JDX0JJTk9NSUFMX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIG5vZGVfcG9pbnRlciBtX2FfZW50cmllc1ttYXhfZW50cmllc107CisKKyAgICAgIHNpemVfdHlwZSBtX292ZXJfdG9wOworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByYygpIDogbV9vdmVyX3RvcCgwKQorICAgIHsgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHJjKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikgOiBtX292ZXJfdG9wKDApCisgICAgeyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgICBjb25zdCBzaXplX3R5cGUgb3Zlcl90b3AgPSBzdGQ6Om1heChtX292ZXJfdG9wLCBvdGhlci5tX292ZXJfdG9wKTsKKworICAgICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBvdmVyX3RvcDsgKytpKQorCXN0ZDo6c3dhcChtX2FfZW50cmllc1tpXSwgb3RoZXIubV9hX2VudHJpZXNbaV0pOworCisgICAgICBzdGQ6OnN3YXAobV9vdmVyX3RvcCwgb3RoZXIubV9vdmVyX3RvcCk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHB1c2goZW50cnkgcF9uZCkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX292ZXJfdG9wIDwgbWF4X2VudHJpZXMpOworICAgICAgbV9hX2VudHJpZXNbbV9vdmVyX3RvcCsrXSA9IHBfbmQ7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHBvcCgpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWVtcHR5KCkpOworICAgICAgLS1tX292ZXJfdG9wOworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICBpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0b3AoKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFlbXB0eSgpKTsKKyAgICAgIHJldHVybiAqKG1fYV9lbnRyaWVzICsgbV9vdmVyX3RvcCAtIDEpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgaW5saW5lIGJvb2wKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgZW1wdHkoKSBjb25zdAorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuIG1fb3Zlcl90b3AgPT0gMDsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIGlubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fb3Zlcl90b3A7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBjbGVhcigpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICBtX292ZXJfdG9wID0gMDsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGJlZ2luKCkgY29uc3QKKyAgICB7IHJldHVybiYgbV9hX2VudHJpZXNbMF07IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIGVuZCgpIGNvbnN0CisgICAgeyByZXR1cm4mIG1fYV9lbnRyaWVzW21fb3Zlcl90b3BdOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBhc3NlcnRfdmFsaWQoKSBjb25zdAorICAgIHsgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fb3Zlcl90b3AgPCBtYXhfZW50cmllcyk7IH0KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX1JDX0JJTk9NSUFMX0hFQVBfVFJBQ0VfCisgICAgUEJfRFNfQ0xBU1NfVF9ERUMKKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHRyYWNlKCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmNvdXQgPDwgInJjIiA8PCBzdGQ6OmVuZGw7CisgICAgICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG1fb3Zlcl90b3A7ICsraSkKKwlzdGQ6OmNlcnIgPDwgbV9hX2VudHJpZXNbaV0gPDwgc3RkOjplbmRsOworICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisjZW5kaWYgCisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vcmNfYmlub21pYWxfaGVhcF8uaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjX2Jpbm9taWFsX2hlYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjJlMjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjX2Jpbm9taWFsX2hlYXBfLmhwcApAQCAtMCwwICsxLDE5OCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgcmNfYmlub21pYWxfaGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgcmNfYmlub21pYWxfaGVhcF8uCisgKi8KKworLyoKKyAqIFJlZHVuZGFudC1jb3VudGVyIGJpbm9taWFsIGhlYXAuCisgKi8KKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmlub21pYWxfaGVhcF9iYXNlXy9iaW5vbWlhbF9oZWFwX2Jhc2VfLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3JjLmhwcD4KKyNpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIENtcF9GbiwgY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICByY19iaW5vbWlhbF9oZWFwXzxWYWx1ZV9UeXBlLCBDbXBfRm4sIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBiaW5vbWlhbF9oZWFwX2Jhc2VfPFZhbHVlX1R5cGUsIENtcF9GbiwgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX1JDX0NfREVDIFwKKyAgICByYzx0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjpub2RlLCBBbGxvY2F0b3I+CisKKyAgICAvKioKKyAgICAgKiBjbGFzcyBkZXNjcmlwdGlvbiA9ICI4eXxcfDB8XC98aTQxIGgzNHAgNzQ4MTMiPgorICAgICAqKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZV9UeXBlLCBjbGFzcyBDbXBfRm4sIGNsYXNzIEFsbG9jYXRvcj4KKyAgICBjbGFzcyByY19iaW5vbWlhbF9oZWFwXyA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgICAgeworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpub2RlX3BvaW50ZXIgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3Rfbm9kZV9wb2ludGVyIGNvbnN0X25vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiBQQl9EU19SQ19DX0RFQyByY190OworCisgICAgcHVibGljOgorCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgVmFsdWVfVHlwZSB2YWx1ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRlciBwb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludF9pdGVyYXRvciBjb25zdF9wb2ludF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIHBvaW50X2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNtcF9mbiBjbXBfZm47CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICAgIHB1YmxpYzoKKworICAgICAgcmNfYmlub21pYWxfaGVhcF8oKTsKKworICAgICAgcmNfYmlub21pYWxfaGVhcF8oY29uc3QgQ21wX0ZuJiByX2NtcF9mbik7CisKKyAgICAgIHJjX2Jpbm9taWFsX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIH5yY19iaW5vbWlhbF9oZWFwXygpOworCisgICAgICB2b2lkCisgICAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpOworCisgICAgICB2b2lkCisgICAgICBtb2RpZnkocG9pbnRfaXRlcmF0b3IgaXQsIGNvbnN0X3JlZmVyZW5jZSByX25ld192YWwpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcG9wKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQgcHJlZCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICB2b2lkCisgICAgICBzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX1JDX0JJTk9NSUFMX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKworICAgICAgaW5saW5lIG5vZGVfcG9pbnRlcgorICAgICAgbGlua193aXRoX25leHRfc2libGluZyhub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1ha2VfMF9leHBvc2VkKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIG1ha2VfYmlub21pYWxfaGVhcCgpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHN0YXRpYyBjb25zdF9ub2RlX3BvaW50ZXIKKyAgICAgIG5leHRfMl9wb2ludGVyKGNvbnN0X25vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgc3RhdGljIGNvbnN0X25vZGVfcG9pbnRlcgorICAgICAgbmV4dF9hZnRlcl8wX3BvaW50ZXIoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQpOworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIHJjX3QgbV9yYzsKKyAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yY19iaW5vbWlhbF9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworI3VuZGVmIFBCX0RTX1JDX0NfREVDCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjk2NWFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHAKQEAgLTAsMCArMSw4MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHJjX2Jpbm9taWFsX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3BsaXQoUHJlZCBwcmVkLCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgbWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIG90aGVyLm1ha2VfYmlub21pYWxfaGVhcCgpOworCisgIGJhc2VfdHlwZTo6c3BsaXQocHJlZCwgb3RoZXIpOworCisgIGJhc2VfdHlwZTo6ZmluZF9tYXgoKTsKKyAgb3RoZXIuZmluZF9tYXgoKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgbWFrZV9iaW5vbWlhbF9oZWFwKCk7CisgIG90aGVyLm1ha2VfYmlub21pYWxfaGVhcCgpOworCisgIGJhc2VfdHlwZTo6am9pbihvdGhlcik7CisKKyAgYmFzZV90eXBlOjpmaW5kX21heCgpOworICBvdGhlci5maW5kX21heCgpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3JjX2Jpbm9taWFsX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjNiOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmNfYmlub21pYWxfaGVhcF8vdHJhY2VfZm5faW1wcy5ocHAKQEAgLTAsMCArMSw1MyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJhY2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciByY19iaW5vbWlhbF9oZWFwXy4KKyAqLworCisjaWZkZWYgUEJfRFNfUkNfQklOT01JQUxfSEVBUF9UUkFDRV8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RyYWNlKCkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjp0cmFjZSgpOworCisgIG1fcmMudHJhY2UoKTsKK30KKworI2VuZGlmIC8vICNpZmRlZiBQQl9EU19SQ19CSU5PTUlBTF9IRUFQX1RSQUNFXwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9jY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGNkNTE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKQEAgLTAsMCArMSwyMTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCisgKiBDb250YWlucyBhIHJlc2l6ZSB0cmlnZ2VyIGltcGxlbWVudGF0aW9uLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitjY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXIoZmxvYXQgbG9hZCkgOgorICBtX2xvYWQobG9hZCksCisgIG1fc2l6ZSgwKSwKKyAgbV9udW1fY29sKDApLAorICBtX21heF9jb2woMCksCisgIG1fcmVzaXplX25lZWRlZChmYWxzZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpCit7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9lbmQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKQoreyBtX251bV9jb2wgPSAwOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgKyttX251bV9jb2w7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKQoreyBjYWxjX3Jlc2l6ZV9uZWVkZWQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKQoreyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydGVkKHNpemVfdHlwZSkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZWQoc2l6ZV90eXBlKQoreyBtX3Jlc2l6ZV9uZWVkZWQgPSB0cnVlOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfY2xlYXJlZCgpCit7IG1fcmVzaXplX25lZWRlZCA9IGZhbHNlOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraXNfcmVzaXplX25lZWRlZCgpIGNvbnN0Cit7IHJldHVybiBtX3Jlc2l6ZV9uZWVkZWQ7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19ncm93X25lZWRlZChzaXplX3R5cGUgLypzaXplKi8sIHNpemVfdHlwZSAvKm51bV91c2VkX2UqLykgY29uc3QKK3sgcmV0dXJuIG1fbnVtX2NvbCA+PSBtX21heF9jb2w7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgbV9zaXplID0gbmV3X3NpemU7CisKKyNpZmRlZiBQQl9EU19IVF9NQVBfUkVTSVpFX1RSQUNFXworICBzdGQ6OmNlcnIgPDwgImNobWNjcnQ6Om5vdGlmeV9yZXNpemVkICIgCisJICAgIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG5ld19zaXplKSA8PCBzdGQ6OmVuZGw7CisjZW5kaWYgCisKKyAgY2FsY19tYXhfbnVtX2NvbGwoKTsKKyAgY2FsY19yZXNpemVfbmVlZGVkKCk7CisgIG1fbnVtX2NvbCA9IDA7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjYWxjX21heF9udW1fY29sbCgpCit7CisgIC8vIG1heF9jb2wgPC0tIFxzcXJ0ezIgbG9hZCBcbG4oIDIgbSBcbG4oIG0gKSApIH0KKyAgY29uc3QgZG91YmxlIGxuX2FyZyA9IDIgKiBtX3NpemUgKiBzdGQ6OmxvZyhkb3VibGUobV9zaXplKSk7CisgIG1fbWF4X2NvbCA9IHNpemVfdHlwZShzdGQ6OmNlaWwoc3RkOjpzcXJ0KDIgKiBtX2xvYWQgKiBzdGQ6OmxvZyhsbl9hcmcpKSkpOworCisjaWZkZWYgUEJfRFNfSFRfTUFQX1JFU0laRV9UUkFDRV8KKyAgc3RkOjpjZXJyIDw8ICJjaG1jY3J0OjpjYWxjX21heF9udW1fY29sbCAiIAorCSAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX3NpemUpIDw8ICAgICIgICAgIiAKKwkgICAgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9tYXhfY29sKSA8PCBzdGQ6OmVuZGw7CisjZW5kaWYgCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sgbm90aWZ5X3Jlc2l6ZWQobmV3X3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgc3RkOjpzd2FwKG1fbG9hZCwgb3RoZXIubV9sb2FkKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKKyAgc3RkOjpzd2FwKG1fbnVtX2NvbCwgb3RoZXIubV9udW1fY29sKTsKKyAgc3RkOjpzd2FwKG1fbWF4X2NvbCwgb3RoZXIubV9tYXhfY29sKTsKKyAgc3RkOjpzd2FwKG1fcmVzaXplX25lZWRlZCwgb3RoZXIubV9yZXNpemVfbmVlZGVkKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBmbG9hdAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2xvYWQoKSBjb25zdAoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfbG9hZF9hY2Nlc3MpOworICByZXR1cm4gbV9sb2FkOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NhbGNfcmVzaXplX25lZWRlZCgpCit7IG1fcmVzaXplX25lZWRlZCA9IG1fcmVzaXplX25lZWRlZCB8fCBtX251bV9jb2wgPj0gbV9tYXhfY29sOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzZXRfbG9hZChmbG9hdCBsb2FkKQoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfbG9hZF9hY2Nlc3MpOworICBtX2xvYWQgPSBsb2FkOworICBjYWxjX21heF9udW1fY29sbCgpOworICBjYWxjX3Jlc2l6ZV9uZWVkZWQoKTsKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGYyZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5X2ltcC5ocHAKQEAgLTAsMCArMSw5MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwCisgKiBDb250YWlucyBhIHJlc2l6ZSBzaXplIHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeShzaXplX3R5cGUgc3RhcnRfc2l6ZSwgc2l6ZV90eXBlIGdyb3dfZmFjdG9yKSA6CisgIG1fc3RhcnRfc2l6ZShzdGFydF9zaXplKSwKKyAgbV9ncm93X2ZhY3Rvcihncm93X2ZhY3RvcikKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIHN0ZDo6c3dhcChtX3N0YXJ0X3NpemUsIG90aGVyLm1fc3RhcnRfc2l6ZSk7CisgIHN0ZDo6c3dhcChtX2dyb3dfZmFjdG9yLCBvdGhlci5tX2dyb3dfZmFjdG9yKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3R5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdAoreworICBzaXplX3R5cGUgcmV0ID0gbV9zdGFydF9zaXplOworICB3aGlsZSAocmV0IDw9IHNpemUpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIG5leHRfcmV0ID0gcmV0KiAgbV9ncm93X2ZhY3RvcjsKKyAgICAgIGlmIChuZXh0X3JldCA8IHJldCkKKwlfX3Rocm93X2luc2VydF9lcnJvcigpOworICAgICAgcmV0ID0gbmV4dF9yZXQ7CisgICAgfQorICByZXR1cm4gcmV0OworfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdAoreworICBzaXplX3R5cGUgcmV0ID0gbV9zdGFydF9zaXplOworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbmV4dF9yZXQgPSByZXQqICBtX2dyb3dfZmFjdG9yOworICAgICAgaWYgKG5leHRfcmV0IDwgcmV0KQorCV9fdGhyb3dfcmVzaXplX2Vycm9yKCk7CisgICAgICBpZiAobmV4dF9yZXQgPj0gc2l6ZSkKKwlyZXR1cm4gKHJldCk7CisgICAgICByZXQgPSBuZXh0X3JldDsKKyAgICB9CisgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxOGJiZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwCkBAIC0wLDAgKzEsMjgzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmVzaXplIHRyaWdnZXIgaW1wbGVtZW50YXRpb24uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcihmbG9hdCBsb2FkX21pbiwgZmxvYXQgbG9hZF9tYXgpCis6IG1fbG9hZF9taW4obG9hZF9taW4pLCBtX2xvYWRfbWF4KGxvYWRfbWF4KSwgbV9uZXh0X3Nocmlua19zaXplKDApLAorICBtX25leHRfZ3Jvd19zaXplKDApLCBtX3Jlc2l6ZV9uZWVkZWQoZmFsc2UpCit7IF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfZW5kKCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpCit7IF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKQoreyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKQoreyBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCkKK3sgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpCit7IF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KSB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydGVkKHNpemVfdHlwZSBudW1fZW50cmllcykKK3sKKyAgbV9yZXNpemVfbmVlZGVkID0gKG51bV9lbnRyaWVzID49IG1fbmV4dF9ncm93X3NpemUpOworICBzaXplX2Jhc2U6OnNldF9zaXplKG51bV9lbnRyaWVzKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpCit7CisgIHNpemVfYmFzZTo6c2V0X3NpemUobnVtX2VudHJpZXMpOworICBtX3Jlc2l6ZV9uZWVkZWQgPSBudW1fZW50cmllcyA8PSBtX25leHRfc2hyaW5rX3NpemU7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIGJvb2wKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2lzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdAoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgcmV0dXJuIG1fcmVzaXplX25lZWRlZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19ncm93X25lZWRlZChzaXplX3R5cGUgLypzaXplKi8sIHNpemVfdHlwZSBudW1fZW50cmllcykgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcmVzaXplX25lZWRlZCk7CisgIHJldHVybiBudW1fZW50cmllcyA+PSBtX25leHRfZ3Jvd19zaXplOworfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6Ogorfmhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcigpIHsgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKQoreworICBtX3Jlc2l6ZV9uZWVkZWQgPSBmYWxzZTsKKyAgbV9uZXh0X2dyb3dfc2l6ZSA9IHNpemVfdHlwZShtX2xvYWRfbWF4ICogbmV3X3NpemUgLSAxKTsKKyAgbV9uZXh0X3Nocmlua19zaXplID0gc2l6ZV90eXBlKG1fbG9hZF9taW4gKiBuZXdfc2l6ZSk7CisKKyNpZmRlZiBQQl9EU19IVF9NQVBfUkVTSVpFX1RSQUNFXworICBzdGQ6OmNlcnIgPDwgImhsY3J0Ojpub3RpZnlfcmVzaXplZCAiICA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjEgIiA8PCBuZXdfc2l6ZSA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjIgIiA8PCBtX2xvYWRfbWluIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiMyAiIDw8IG1fbG9hZF9tYXggPDwgc3RkOjplbmRsCisJICAgIDw8ICI0ICIgPDwgbV9uZXh0X3Nocmlua19zaXplIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiNSAiIDw8IG1fbmV4dF9ncm93X3NpemUgPDwgc3RkOjplbmRsOworI2VuZGlmCisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgbV9yZXNpemVfbmVlZGVkID0gZmFsc2U7CisgIHNpemVfdHlwZSBuZXdfZ3Jvd19zaXplID0gc2l6ZV90eXBlKG1fbG9hZF9tYXggKiBuZXdfc2l6ZSAtIDEpOworICBzaXplX3R5cGUgbmV3X3Nocmlua19zaXplID0gc2l6ZV90eXBlKG1fbG9hZF9taW4gKiBuZXdfc2l6ZSk7CisKKyNpZmRlZiBQQl9EU19IVF9NQVBfUkVTSVpFX1RSQUNFXworICBzdGQ6OmNlcnIgPDwgImhsY3J0Ojpub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkICIgIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiMSAiIDw8IG5ld19zaXplIDw8IHN0ZDo6ZW5kbAorCSAgICA8PCAiMiAiIDw8IG1fbG9hZF9taW4gPDwgc3RkOjplbmRsCisJICAgIDw8ICIzICIgPDwgbV9sb2FkX21heCA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjQgIiA8PCBtX25leHRfc2hyaW5rX3NpemUgPDwgc3RkOjplbmRsCisJICAgIDw8ICI1ICIgPDwgbV9uZXh0X2dyb3dfc2l6ZSA8PCBzdGQ6OmVuZGwKKwkgICAgPDwgIjYgIiA8PCBuZXdfc2hyaW5rX3NpemUgPDwgc3RkOjplbmRsCisJICAgIDw8ICI3ICIgPDwgbmV3X2dyb3dfc2l6ZSA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKKworICBpZiAobmV3X2dyb3dfc2l6ZSA+PSBtX25leHRfZ3Jvd19zaXplKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChuZXdfc2hyaW5rX3NpemUgPj0gbV9uZXh0X3Nocmlua19zaXplKTsKKyAgICAgIG1fbmV4dF9ncm93X3NpemUgPSBuZXdfZ3Jvd19zaXplOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChuZXdfc2hyaW5rX3NpemUgPD0gbV9uZXh0X3Nocmlua19zaXplKTsKKyAgICAgIG1fbmV4dF9zaHJpbmtfc2l6ZSA9IG5ld19zaHJpbmtfc2l6ZTsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfY2xlYXJlZCgpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBzaXplX2Jhc2U6OnNldF9zaXplKDApOworICBtX3Jlc2l6ZV9uZWVkZWQgPSAoMCA8IG1fbmV4dF9zaHJpbmtfc2l6ZSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKworICBzaXplX2Jhc2U6OnN3YXAob3RoZXIpOworICBzdGQ6OnN3YXAobV9sb2FkX21pbiwgb3RoZXIubV9sb2FkX21pbik7CisgIHN0ZDo6c3dhcChtX2xvYWRfbWF4LCBvdGhlci5tX2xvYWRfbWF4KTsKKyAgc3RkOjpzd2FwKG1fcmVzaXplX25lZWRlZCwgb3RoZXIubV9yZXNpemVfbmVlZGVkKTsKKyAgc3RkOjpzd2FwKG1fbmV4dF9ncm93X3NpemUsIG90aGVyLm1fbmV4dF9ncm93X3NpemUpOworICBzdGQ6OnN3YXAobV9uZXh0X3Nocmlua19zaXplLCBvdGhlci5tX25leHRfc2hyaW5rX3NpemUpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X2xvYWRzKCkgY29uc3QKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX2xvYWRfYWNjZXNzKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKG1fbG9hZF9taW4sIG1fbG9hZF9tYXgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc2V0X2xvYWRzKHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IGxvYWRfcGFpcikKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX2xvYWRfYWNjZXNzKTsKKyAgY29uc3QgZmxvYXQgb2xkX2xvYWRfbWluID0gbV9sb2FkX21pbjsKKyAgY29uc3QgZmxvYXQgb2xkX2xvYWRfbWF4ID0gbV9sb2FkX21heDsKKyAgY29uc3Qgc2l6ZV90eXBlIG9sZF9uZXh0X3Nocmlua19zaXplID0gbV9uZXh0X3Nocmlua19zaXplOworICBjb25zdCBzaXplX3R5cGUgb2xkX25leHRfZ3Jvd19zaXplID0gbV9uZXh0X2dyb3dfc2l6ZTsKKyAgY29uc3QgYm9vbCBvbGRfcmVzaXplX25lZWRlZCA9IG1fcmVzaXplX25lZWRlZDsKKworICBfX3RyeQorICAgIHsKKyAgICAgIG1fbG9hZF9taW4gPSBsb2FkX3BhaXIuZmlyc3Q7CisgICAgICBtX2xvYWRfbWF4ID0gbG9hZF9wYWlyLnNlY29uZDsKKyAgICAgIGRvX3Jlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHNpemVfYmFzZTo6Z2V0X3NpemUoKSAvICgobV9sb2FkX21pbiArIG1fbG9hZF9tYXgpIC8gMikpKTsKKyAgICB9CisgIF9fY2F0Y2goLi4uKQorICAgIHsKKyAgICAgIG1fbG9hZF9taW4gPSBvbGRfbG9hZF9taW47CisgICAgICBtX2xvYWRfbWF4ID0gb2xkX2xvYWRfbWF4OworICAgICAgbV9uZXh0X3Nocmlua19zaXplID0gb2xkX25leHRfc2hyaW5rX3NpemU7CisgICAgICBtX25leHRfZ3Jvd19zaXplID0gb2xkX25leHRfZ3Jvd19zaXplOworICAgICAgbV9yZXNpemVfbmVlZGVkID0gb2xkX3Jlc2l6ZV9uZWVkZWQ7CisgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citkb19yZXNpemUoc2l6ZV90eXBlKQoreyBzdGQ6OmFib3J0KCk7IH0KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fbG9hZF9tYXggPiBtX2xvYWRfbWluKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fbmV4dF9ncm93X3NpemUgPj0gbV9uZXh0X3Nocmlua19zaXplKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjliM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAKQEAgLTAsMCArMSw5NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZS5ocHAKKyAqIENvbnRhaW5zIGFuIGJhc2UgaG9sZGluZyBzaXplIGZvciBzb21lIHJlc2l6ZSBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0hBU0hfTE9BRF9DSEVDS19SRVNJWkVfVFJJR0dFUl9TSVpFX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX0hBU0hfTE9BRF9DSEVDS19SRVNJWkVfVFJJR0dFUl9TSVpFX0JBU0VfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIC8vIFByaW1hcnkgdGVtcGxhdGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlLCBib29sIEhvbGRfU2l6ZT4KKyAgICBjbGFzcyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlOworCisgICAgLy8gU3BlY2lhbGl6YXRpb25zLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyAgICBjbGFzcyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlPFNpemVfVHlwZSwgdHJ1ZT4KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgICBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlKCk6IG1fc2l6ZSgwKQorICAgICAgeyB9CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzd2FwKGhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UmIG90aGVyKQorICAgICAgeyBzdGQ6OnN3YXAobV9zaXplLCBvdGhlci5tX3NpemUpOyB9CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzZXRfc2l6ZShzaXplX3R5cGUgc2l6ZSkKKyAgICAgIHsgbV9zaXplID0gc2l6ZTsgfQorCisgICAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgICBnZXRfc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBtX3NpemU7IH0KKworICAgIHByaXZhdGU6CisgICAgICBzaXplX3R5cGUgbV9zaXplOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisgICAgY2xhc3MgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZTxTaXplX1R5cGUsIGZhbHNlPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3dhcChoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXJfc2l6ZV9iYXNlJiBvdGhlcikgeyB9CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzZXRfc2l6ZShzaXplX3R5cGUgc2l6ZSkgeyB9CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9wcmltZV9zaXplX3BvbGljeV9pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9wcmltZV9zaXplX3BvbGljeV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTZjZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3ByaW1lX3NpemVfcG9saWN5X2ltcC5ocHAKQEAgLTAsMCArMSwxNjEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGhhc2hfcHJpbWVfc2l6ZV9wb2xpY3lfaW1wLmhwcAorICogQ29udGFpbnMgYSByZXNpemUgc2l6ZSBwb2xpY3kgaW1wbGVtZW50YXRpb24uCisgKi8KKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2UgZGV0YWlsCit7CisgIGVudW0KKyAgICB7CisgICAgICBudW1fZGlzdGluY3Rfc2l6ZXNfMzJfYml0ID0gMzAsCisgICAgICBudW1fZGlzdGluY3Rfc2l6ZXNfNjRfYml0ID0gNjIsCisgICAgICBudW1fZGlzdGluY3Rfc2l6ZXMgPSBzaXplb2Yoc3RkOjpzaXplX3QpICE9IDggPyAKKyAgICAgICAgICAgIG51bV9kaXN0aW5jdF9zaXplc18zMl9iaXQgOiBudW1fZGlzdGluY3Rfc2l6ZXNfNjRfYml0LAkKKyAgICB9OworCisgIC8vIE9yaWdpbmFsbHkgdGFrZW4gZnJvbSB0aGUgU0dJIGltcGxlbWVudGF0aW9uOyBhY2tub3dsZWRnZWQgaW4gdGhlIGRvY3MuCisgIC8vIEZ1cnRoZXIgbW9kaWZpZWQgKGZvciA2NCBiaXRzKSBmcm9tIHRyMSdzIGhhc2h0YWJsZS4KKyAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IGdfYV9zaXplc1tudW1fZGlzdGluY3Rfc2l6ZXNfNjRfYml0XSA9CisgICAgeworICAgICAgLyogMCAgICAgKi8gICAgICAgICAgICAgIDV1bCwKKyAgICAgIC8qIDEgICAgICovICAgICAgICAgICAgICAxMXVsLCAKKyAgICAgIC8qIDIgICAgICovICAgICAgICAgICAgICAyM3VsLCAKKyAgICAgIC8qIDMgICAgICovICAgICAgICAgICAgICA0N3VsLCAKKyAgICAgIC8qIDQgICAgICovICAgICAgICAgICAgICA5N3VsLCAKKyAgICAgIC8qIDUgICAgICovICAgICAgICAgICAgICAxOTl1bCwgCisgICAgICAvKiA2ICAgICAqLyAgICAgICAgICAgICAgNDA5dWwsIAorICAgICAgLyogNyAgICAgKi8gICAgICAgICAgICAgIDgyM3VsLCAKKyAgICAgIC8qIDggICAgICovICAgICAgICAgICAgICAxNzQxdWwsIAorICAgICAgLyogOSAgICAgKi8gICAgICAgICAgICAgIDM0Njl1bCwgCisgICAgICAvKiAxMCAgICAqLyAgICAgICAgICAgICAgNjk0OXVsLCAKKyAgICAgIC8qIDExICAgICovICAgICAgICAgICAgICAxNDAzM3VsLCAKKyAgICAgIC8qIDEyICAgICovICAgICAgICAgICAgICAyODQxMXVsLCAKKyAgICAgIC8qIDEzICAgICovICAgICAgICAgICAgICA1NzU1N3VsLCAKKyAgICAgIC8qIDE0ICAgICovICAgICAgICAgICAgICAxMTY3MzF1bCwgCisgICAgICAvKiAxNSAgICAqLyAgICAgICAgICAgICAgMjM2ODk3dWwsCisgICAgICAvKiAxNiAgICAqLyAgICAgICAgICAgICAgNDgwODgxdWwsIAorICAgICAgLyogMTcgICAgKi8gICAgICAgICAgICAgIDk3NjM2OXVsLAorICAgICAgLyogMTggICAgKi8gICAgICAgICAgICAgIDE5ODI2Mjd1bCwgCisgICAgICAvKiAxOSAgICAqLyAgICAgICAgICAgICAgNDAyNjAzMXVsLAorICAgICAgLyogMjAgICAgKi8gICAgICAgICAgICAgIDgxNzUzODN1bCwgCisgICAgICAvKiAyMSAgICAqLyAgICAgICAgICAgICAgMTY2MDE1OTN1bCwgCisgICAgICAvKiAyMiAgICAqLyAgICAgICAgICAgICAgMzM3MTI3Mjl1bCwKKyAgICAgIC8qIDIzICAgICovICAgICAgICAgICAgICA2ODQ2MDM5MXVsLCAKKyAgICAgIC8qIDI0ICAgICovICAgICAgICAgICAgICAxMzkwMjI0MTd1bCwgCisgICAgICAvKiAyNSAgICAqLyAgICAgICAgICAgICAgMjgyMzEyNzk5dWwsIAorICAgICAgLyogMjYgICAgKi8gICAgICAgICAgICAgIDU3MzI5MjgxN3VsLCAKKyAgICAgIC8qIDI3ICAgICovICAgICAgICAgICAgICAxMTY0MTg2MjE3dWwsCisgICAgICAvKiAyOCAgICAqLyAgICAgICAgICAgICAgMjM2NDExNDIxN3VsLCAKKyAgICAgIC8qIDI5ICAgICovICAgICAgICAgICAgICA0Mjk0OTY3MjkxdWwsCisgICAgICAvKiAzMCAgICAqLyAoc3RkOjpzaXplX3QpODU4OTkzNDU4M3VsbCwKKyAgICAgIC8qIDMxICAgICovIChzdGQ6OnNpemVfdCkxNzE3OTg2OTE0M3VsbCwKKyAgICAgIC8qIDMyICAgICovIChzdGQ6OnNpemVfdCkzNDM1OTczODMzN3VsbCwKKyAgICAgIC8qIDMzICAgICovIChzdGQ6OnNpemVfdCk2ODcxOTQ3NjczMXVsbCwKKyAgICAgIC8qIDM0ICAgICovIChzdGQ6OnNpemVfdCkxMzc0Mzg5NTM0NDd1bGwsCisgICAgICAvKiAzNSAgICAqLyAoc3RkOjpzaXplX3QpMjc0ODc3OTA2ODk5dWxsLAorICAgICAgLyogMzYgICAgKi8gKHN0ZDo6c2l6ZV90KTU0OTc1NTgxMzg4MXVsbCwKKyAgICAgIC8qIDM3ICAgICovIChzdGQ6OnNpemVfdCkxMDk5NTExNjI3Njg5dWxsLAorICAgICAgLyogMzggICAgKi8gKHN0ZDo6c2l6ZV90KTIxOTkwMjMyNTU1MzF1bGwsCisgICAgICAvKiAzOSAgICAqLyAoc3RkOjpzaXplX3QpNDM5ODA0NjUxMTA5M3VsbCwKKyAgICAgIC8qIDQwICAgICovIChzdGQ6OnNpemVfdCk4Nzk2MDkzMDIyMTUxdWxsLAorICAgICAgLyogNDEgICAgKi8gKHN0ZDo6c2l6ZV90KTE3NTkyMTg2MDQ0Mzk5dWxsLAorICAgICAgLyogNDIgICAgKi8gKHN0ZDo6c2l6ZV90KTM1MTg0MzcyMDg4Nzc3dWxsLAorICAgICAgLyogNDMgICAgKi8gKHN0ZDo6c2l6ZV90KTcwMzY4NzQ0MTc3NjQzdWxsLAorICAgICAgLyogNDQgICAgKi8gKHN0ZDo6c2l6ZV90KTE0MDczNzQ4ODM1NTIxM3VsbCwKKyAgICAgIC8qIDQ1ICAgICovIChzdGQ6OnNpemVfdCkyODE0NzQ5NzY3MTA1OTd1bGwsCisgICAgICAvKiA0NiAgICAqLyAoc3RkOjpzaXplX3QpNTYyOTQ5OTUzNDIxMjMxdWxsLCAKKyAgICAgIC8qIDQ3ICAgICovIChzdGQ6OnNpemVfdCkxMTI1ODk5OTA2ODQyNTk3dWxsLAorICAgICAgLyogNDggICAgKi8gKHN0ZDo6c2l6ZV90KTIyNTE3OTk4MTM2ODUxMTl1bGwsIAorICAgICAgLyogNDkgICAgKi8gKHN0ZDo6c2l6ZV90KTQ1MDM1OTk2MjczNzA0NDl1bGwsCisgICAgICAvKiA1MCAgICAqLyAoc3RkOjpzaXplX3QpOTAwNzE5OTI1NDc0MDg4MXVsbCwgCisgICAgICAvKiA1MSAgICAqLyAoc3RkOjpzaXplX3QpMTgwMTQzOTg1MDk0ODE5NTF1bGwsCisgICAgICAvKiA1MiAgICAqLyAoc3RkOjpzaXplX3QpMzYwMjg3OTcwMTg5NjM5MTN1bGwsIAorICAgICAgLyogNTMgICAgKi8gKHN0ZDo6c2l6ZV90KTcyMDU3NTk0MDM3OTI3OTMxdWxsLAorICAgICAgLyogNTQgICAgKi8gKHN0ZDo6c2l6ZV90KTE0NDExNTE4ODA3NTg1NTg1OXVsbCwKKyAgICAgIC8qIDU1ICAgICovIChzdGQ6OnNpemVfdCkyODgyMzAzNzYxNTE3MTE3MTd1bGwsCisgICAgICAvKiA1NiAgICAqLyAoc3RkOjpzaXplX3QpNTc2NDYwNzUyMzAzNDIzNDMzdWxsLAorICAgICAgLyogNTcgICAgKi8gKHN0ZDo6c2l6ZV90KTExNTI5MjE1MDQ2MDY4NDY4ODN1bGwsCisgICAgICAvKiA1OCAgICAqLyAoc3RkOjpzaXplX3QpMjMwNTg0MzAwOTIxMzY5Mzk1MXVsbCwKKyAgICAgIC8qIDU5ICAgICovIChzdGQ6OnNpemVfdCk0NjExNjg2MDE4NDI3Mzg3ODQ3dWxsLAorICAgICAgLyogNjAgICAgKi8gKHN0ZDo6c2l6ZV90KTkyMjMzNzIwMzY4NTQ3NzU3ODN1bGwsCisgICAgICAvKiA2MSAgICAqLyAoc3RkOjpzaXplX3QpMTg0NDY3NDQwNzM3MDk1NTE1NTd1bGwsCisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2hhc2hfcHJpbWVfc2l6ZV9wb2xpY3koc2l6ZV90eXBlIG4pIDogbV9zdGFydF9zaXplKG4pCit7IG1fc3RhcnRfc2l6ZSA9IGdldF9uZWFyZXN0X2xhcmdlcl9zaXplKG4pOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7IHN0ZDo6c3dhcChtX3N0YXJ0X3NpemUsIG90aGVyLm1fc3RhcnRfc2l6ZSk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShzaXplX3R5cGUgbikgY29uc3QKK3sKKyAgY29uc3Qgc3RkOjpzaXplX3QqIGNvbnN0IHBfdXBwZXIgPSBzdGQ6OnVwcGVyX2JvdW5kKGRldGFpbDo6Z19hX3NpemVzLCAKKwkJICAgICBkZXRhaWw6OmdfYV9zaXplcyArIGRldGFpbDo6bnVtX2Rpc3RpbmN0X3NpemVzLCBuKTsKKworICBpZiAocF91cHBlciA9PSBkZXRhaWw6OmdfYV9zaXplcyArIGRldGFpbDo6bnVtX2Rpc3RpbmN0X3NpemVzKQorICAgIF9fdGhyb3dfcmVzaXplX2Vycm9yKCk7CisgIHJldHVybiAqcF91cHBlcjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIG4pIGNvbnN0Cit7CisgIGNvbnN0IHN0ZDo6c2l6ZV90KiBwX2xvd2VyID0gc3RkOjpsb3dlcl9ib3VuZChkZXRhaWw6OmdfYV9zaXplcywgCisJCSAgICAgICBkZXRhaWw6OmdfYV9zaXplcyArIGRldGFpbDo6bnVtX2Rpc3RpbmN0X3NpemVzLCBuKTsKKworICBpZiAoKnBfbG93ZXIgPj0gbiAmJiAgcF9sb3dlciAhPSBkZXRhaWw6OmdfYV9zaXplcykKKyAgICAtLXBfbG93ZXI7CisgIGlmICgqcF9sb3dlciA8IG1fc3RhcnRfc2l6ZSkKKyAgICByZXR1cm4gbV9zdGFydF9zaXplOworICByZXR1cm4gKnBfbG93ZXI7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2Y3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcApAQCAtMCwwICsxLDI0OSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5X2ltcC5ocHAKKyAqIENvbnRhaW5zIGEgcmVzaXplIHBvbGljeSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KCkgCis6IG1fc2l6ZShTaXplX1BvbGljeTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQobV9zaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5KSAKKzogU2l6ZV9Qb2xpY3kocl9zaXplX3BvbGljeSksIG1fc2l6ZShTaXplX1BvbGljeTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSkpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQobV9zaXplKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworUEJfRFNfQ0xBU1NfQ19ERUM6OgoraGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5LCAKKwkJCSAgICBjb25zdCBUcmlnZ2VyX1BvbGljeSYgcl90cmlnZ2VyX3BvbGljeSkgCis6IFNpemVfUG9saWN5KHJfc2l6ZV9wb2xpY3kpLCBUcmlnZ2VyX1BvbGljeShyX3RyaWdnZXJfcG9saWN5KSwKKyAgbV9zaXplKFNpemVfUG9saWN5OjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZSgxKSkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2V4dGVybmFsbHlfcmVzaXplZChtX3NpemUpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+aGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIHRyaWdnZXJfcG9saWN5X2Jhc2U6OnN3YXAob3RoZXIpOworICBzaXplX3BvbGljeV9iYXNlOjpzd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKG1fc2l6ZSwgb3RoZXIubV9zaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZmluZF9zZWFyY2hfZW5kKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCkKK3sgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lKQoreyB0cmlnZ2VyX3BvbGljeV9iYXNlOjpub3RpZnlfaW5zZXJ0ZWQobnVtX2UpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2UpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9lcmFzZWQobnVtX2UpOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citub3RpZnlfY2xlYXJlZCgpCit7IHRyaWdnZXJfcG9saWN5X2Jhc2U6Om5vdGlmeV9jbGVhcmVkKCk7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBib29sCitQQl9EU19DTEFTU19DX0RFQzo6Citpc19yZXNpemVfbmVlZGVkKCkgY29uc3QKK3sgcmV0dXJuIHRyaWdnZXJfcG9saWN5X2Jhc2U6OmlzX3Jlc2l6ZV9uZWVkZWQoKTsgfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X25ld19zaXplKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX3VzZWRfZSkgY29uc3QKK3sKKyAgaWYgKHRyaWdnZXJfcG9saWN5X2Jhc2U6OmlzX2dyb3dfbmVlZGVkKHNpemUsIG51bV91c2VkX2UpKQorICAgIHJldHVybiBzaXplX3BvbGljeV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShzaXplKTsKKyAgcmV0dXJuIHNpemVfcG9saWN5X2Jhc2U6OmdldF9uZWFyZXN0X3NtYWxsZXJfc2l6ZShzaXplKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25vdGlmeV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgdHJpZ2dlcl9wb2xpY3lfYmFzZTo6bm90aWZ5X3Jlc2l6ZWQobmV3X3NpemUpOworICBtX3NpemUgPSBuZXdfc2l6ZTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfYWN0dWFsX3NpemUoKSBjb25zdAoreworICBQQl9EU19TVEFUSUNfQVNTRVJUKGFjY2VzcywgZXh0ZXJuYWxfc2l6ZV9hY2Nlc3MpOworICByZXR1cm4gbV9zaXplOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSkKK3sKKyAgUEJfRFNfU1RBVElDX0FTU0VSVChhY2Nlc3MsIGV4dGVybmFsX3NpemVfYWNjZXNzKTsKKyAgc2l6ZV90eXBlIGFjdHVhbF9zaXplID0gc2l6ZV9wb2xpY3lfYmFzZTo6Z2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoMSk7CisgIHdoaWxlIChhY3R1YWxfc2l6ZSA8IG5ld19zaXplKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBwb3QgPSBzaXplX3BvbGljeV9iYXNlOjpnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShhY3R1YWxfc2l6ZSk7CisKKyAgICAgIGlmIChwb3QgPT0gYWN0dWFsX3NpemUgJiYgcG90IDwgbmV3X3NpemUpCisJX190aHJvd19yZXNpemVfZXJyb3IoKTsKKyAgICAgIGFjdHVhbF9zaXplID0gcG90OworICAgIH0KKworICBpZiAoYWN0dWFsX3NpemUgPiAwKQorICAgIC0tYWN0dWFsX3NpemU7CisKKyAgY29uc3Qgc2l6ZV90eXBlIG9sZF9zaXplID0gbV9zaXplOworICBfX3RyeQorICAgIHsKKyAgICAgIGRvX3Jlc2l6ZShhY3R1YWxfc2l6ZSAtIDEpOworICAgIH0KKyAgX19jYXRjaChpbnNlcnRfZXJyb3ImICkKKyAgICB7CisgICAgICBtX3NpemUgPSBvbGRfc2l6ZTsKKyAgICAgIF9fdGhyb3dfcmVzaXplX2Vycm9yKCk7CisgICAgfQorICBfX2NhdGNoKC4uLikKKyAgICB7CisgICAgICBtX3NpemUgPSBvbGRfc2l6ZTsKKyAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2RvX3Jlc2l6ZShzaXplX3R5cGUpCit7CisgIC8vIERvIG5vdGhpbmcKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1RyaWdnZXJfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF90cmlnZ2VyX3BvbGljeSgpCit7IHJldHVybiAqdGhpczsgfQorCitQQl9EU19DTEFTU19UX0RFQworY29uc3QgVHJpZ2dlcl9Qb2xpY3kmIAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZ2V0X3RyaWdnZXJfcG9saWN5KCkgY29uc3QKK3sgcmV0dXJuICp0aGlzOyB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitTaXplX1BvbGljeSYgCitQQl9EU19DTEFTU19DX0RFQzo6CitnZXRfc2l6ZV9wb2xpY3koKQoreyByZXR1cm4gKnRoaXM7IH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2NvbnN0IFNpemVfUG9saWN5JiAKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2dldF9zaXplX3BvbGljeSgpIGNvbnN0Cit7IHJldHVybiAqdGhpczsgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfcmVzaXplX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfcmVzaXplX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhZWNkZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfcG9saWN5LmhwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc2FtcGxlX3Jlc2l6ZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyBhIHNhbXBsZSByZXNpemUgcG9saWN5IGZvciBoYXNoIHRhYmxlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9SRVNJWkVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfUkVTSVpFX1BPTElDWV9IUFAKKworLy8gQSBzYW1wbGUgcmVzaXplIHBvbGljeS4KK2NsYXNzIHNhbXBsZV9yZXNpemVfcG9saWN5Cit7CitwdWJsaWM6CisKKyAgLy8gU2l6ZSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfcmVzaXplX3BvbGljeSgpOworCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKGNvbnN0IHNhbXBsZV9yZXNpemVfcG9saWN5JiBvdGhlcik7CisKKyAgLy8gU3dhcHMgY29udGVudC4KKyAgaW5saW5lIHZvaWQKKyAgc3dhcChzYW1wbGVfcmVzaXplX3BvbGljeSYgb3RoZXIpOworCitwcm90ZWN0ZWQ6CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggc3RhcnRlZC4KKyAgaW5saW5lIHZvaWQKKyAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAvLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgaW5saW5lIHZvaWQKKyAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworCisgIC8vIE5vdGlmaWVzIGEgc2VhcmNoIHN0YXJ0ZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisgIC8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICBpbmxpbmUgdm9pZAorICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworICAvLyBOb3RpZmllcyBhIHNlYXJjaCBzdGFydGVkLgorICBpbmxpbmUgdm9pZAorICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisKKyAgLy8gTm90aWZpZXMgYW4gZWxlbWVudCB3YXMgaW5zZXJ0ZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2UpOworCisgIC8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGVyYXNlZC4KKyAgaW5saW5lIHZvaWQKKyAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2UpOworCisgIC8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgY2xlYXJlZC4KKyAgdm9pZAorICBub3RpZnlfY2xlYXJlZCgpOworCisgIC8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgcmVzaXplZCB0byBuZXdfc2l6ZS4KKyAgdm9pZAorICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgIC8vIFF1ZXJpZXMgd2hldGhlciBhIHJlc2l6ZSBpcyBuZWVkZWQuCisgIGlubGluZSBib29sCisgIGlzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdDsKKworICAvLyBRdWVyaWVzIHdoYXQgdGhlIG5ldyBzaXplIHNob3VsZCBiZS4KKyAgc2l6ZV90eXBlCisgIGdldF9uZXdfc2l6ZShzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV91c2VkX2UpIGNvbnN0OworfTsKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfdHJpZ2dlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzYzU1MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L3NhbXBsZV9yZXNpemVfdHJpZ2dlci5ocHAKQEAgLTAsMCArMSwxMzggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfcmVzaXplX3RyaWdnZXIuaHBwCisgKiBDb250YWlucyBhIHNhbXBsZSByZXNpemUgdHJpZ2dlciBwb2xpY3kgY2xhc3MuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfUkVTSVpFX1RSSUdHRVJfSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9SRVNJWkVfVFJJR0dFUl9IUFAKKworLy8gQSBzYW1wbGUgcmVzaXplIHRyaWdnZXIgcG9saWN5LgorY2xhc3Mgc2FtcGxlX3Jlc2l6ZV90cmlnZ2VyCit7CitwdWJsaWM6CisKKyAgLy8gU2l6ZSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfcmVzaXplX3RyaWdnZXIoKTsKKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfcmFuZ2VfaGFzaGluZyhjb25zdCBzYW1wbGVfcmVzaXplX3RyaWdnZXImIG90aGVyKTsKKworICAvLyBTd2FwcyBjb250ZW50LgorICBpbmxpbmUgdm9pZAorICBzd2FwKHNhbXBsZV9yZXNpemVfdHJpZ2dlciYgb3RoZXIpOworCitwcm90ZWN0ZWQ6CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggc3RhcnRlZC4KKyAgaW5saW5lIHZvaWQKKyAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAvLyBOb3RpZmllcyBhIHNlYXJjaCBlbmNvdW50ZXJlZCBhIGNvbGxpc2lvbi4KKyAgaW5saW5lIHZvaWQKKyAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworCisgIC8vIE5vdGlmaWVzIGEgc2VhcmNoIHN0YXJ0ZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisgIC8vIE5vdGlmaWVzIGEgc2VhcmNoIGVuY291bnRlcmVkIGEgY29sbGlzaW9uLgorICBpbmxpbmUgdm9pZAorICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworICAvLyBOb3RpZmllcyBhIHNlYXJjaCBzdGFydGVkLgorICBpbmxpbmUgdm9pZAorICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5jb3VudGVyZWQgYSBjb2xsaXNpb24uCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgLy8gTm90aWZpZXMgYSBzZWFyY2ggZW5kZWQuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisKKyAgLy8gTm90aWZpZXMgYW4gZWxlbWVudCB3YXMgaW5zZXJ0ZWQuIHRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorICAvLyB0aGUgdGFibGUgaXMgbnVtX2VudHJpZXMuCisgIGlubGluZSB2b2lkCisgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgIC8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGVyYXNlZC4KKyAgaW5saW5lIHZvaWQKKyAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgIC8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgY2xlYXJlZC4KKyAgdm9pZAorICBub3RpZnlfY2xlYXJlZCgpOworCisgIC8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgcmVzaXplZCBhcyBhIHJlc3VsdCBvZiB0aGlzIG9iamVjdCdzCisgIC8vIHNpZ25pZnlpbmcgdGhhdCBhIHJlc2l6ZSBpcyBuZWVkZWQuCisgIHZvaWQKKyAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAvLyBOb3RpZmllcyB0aGUgdGFibGUgd2FzIHJlc2l6ZWQgZXh0ZXJuYWxseS4KKyAgdm9pZAorICBub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgLy8gUXVlcmllcyB3aGV0aGVyIGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgaW5saW5lIGJvb2wKKyAgaXNfcmVzaXplX25lZWRlZCgpIGNvbnN0OworCisgIC8vIFF1ZXJpZXMgd2hldGhlciBhIGdyb3cgaXMgbmVlZGVkLgorICBpbmxpbmUgYm9vbAorICBpc19ncm93X25lZWRlZChzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV9lbnRyaWVzKSBjb25zdDsKKworcHJpdmF0ZToKKworICAvLyBSZXNpemVzIHRvIG5ld19zaXplLgorICB2aXJ0dWFsIHZvaWQKKyAgZG9fcmVzaXplKHNpemVfdHlwZSBuZXdfc2l6ZSk7Cit9OworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9zYW1wbGVfc2l6ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3NpemVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNiYTAzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvc2FtcGxlX3NpemVfcG9saWN5LmhwcApAQCAtMCwwICsxLDczIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfc2l6ZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyBhIHNhbXBsZSBzaXplIHJlc2l6ZS1wb2xpY3kuCisgKi8KKworI2lmbmRlZiBQQl9EU19TQU1QTEVfU0laRV9QT0xJQ1lfSFBQCisjZGVmaW5lIFBCX0RTX1NBTVBMRV9TSVpFX1BPTElDWV9IUFAKKworLy8gQSBzYW1wbGUgc2l6ZSBwb2xpY3kuCitjbGFzcyBzYW1wbGVfc2l6ZV9wb2xpY3kKK3sKK3B1YmxpYzoKKworICAvLyBTaXplIHR5cGUuCisgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIHNhbXBsZV9zaXplX3BvbGljeSgpOworCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIHNhbXBsZV9yYW5nZV9oYXNoaW5nKGNvbnN0IHNhbXBsZV9zaXplX3BvbGljeSYgb3RoZXIpOworCisgIC8vIFN3YXBzIGNvbnRlbnQuCisgIGlubGluZSB2b2lkCisgIHN3YXAoc2FtcGxlX3NpemVfcG9saWN5JiBvdGhlcik7CisKK3Byb3RlY3RlZDoKKworICAvLyBHaXZlbiBhIF9fc2l6ZSBzaXplLCByZXR1cm5zIGEgX19zaXplIHRoYXQgaXMgbGFyZ2VyLgorICBpbmxpbmUgc2l6ZV90eXBlCisgIGdldF9uZWFyZXN0X2xhcmdlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICAvLyBHaXZlbiBhIF9fc2l6ZSBzaXplLCByZXR1cm5zIGEgX19zaXplIHRoYXQgaXMgc21hbGxlci4KKyAgaW5saW5lIHNpemVfdHlwZQorICBnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworfTsKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjU4OTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKQEAgLTAsMCArMSwxMDIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXlfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIEl0Pgordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorY29weV9mcm9tX3JhbmdlKEl0IGZpcnN0X2l0LCBJdCBsYXN0X2l0KQoreworICB3aGlsZSAoZmlyc3RfaXQgIT0gbGFzdF9pdCkKKyAgICBpbnNlcnQoKihmaXJzdF9pdCsrKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgQ21wX0ZuJiByX2NtcF9mbikgOgorICBiYXNlX3R5cGUocl9jbXBfZm4pCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6CitQQl9EU19DTEFTU19OQU1FKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4sIGNvbnN0IG5vZGVfdXBkYXRlJiByX25vZGVfdXBkYXRlKSA6CisgIGJhc2VfdHlwZShyX2NtcF9mbiwgcl9ub2RlX3VwZGF0ZSkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK1BCX0RTX0NMQVNTX05BTUUoY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisgIGJhc2VfdHlwZShvdGhlcikKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgIGJhc2VfdHlwZTo6c3dhcChvdGhlcik7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2luaXRpYWxpemUoKQoreyBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3NwZWNpYWwgPSB0cnVlOyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZGVidWdfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1NjIzZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9kZWJ1Z19mbl9pbXBzLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3ZhbGlkKCkgY29uc3QKK3sKKyAgYmFzZV90eXBlOjphc3NlcnRfdmFsaWQoKTsKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfaGVhZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIGFzc2VydF9zcGVjaWFsX2ltcChwX2hlYWQpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X3NwZWNpYWxfaW1wKGNvbnN0IG5vZGVfcG9pbnRlciBwX25kKSBjb25zdAoreworICBpZiAocF9uZCA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAocF9uZCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX3NwZWNpYWwpOworICAgICAgYXNzZXJ0X3NwZWNpYWxfaW1wKHBfbmQtPm1fcF9wYXJlbnQpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIXBfbmQtPm1fc3BlY2lhbCk7CisgIGFzc2VydF9zcGVjaWFsX2ltcChwX25kLT5tX3BfbGVmdCk7CisgIGFzc2VydF9zcGVjaWFsX2ltcChwX25kLT5tX3BfcmlnaHQpOworfQorCisjZW5kaWYgCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9lcmFzZV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZhYmI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTU3IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBlcmFzZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgYm9vbAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcG9pbnRfaXRlcmF0b3IgaXQgPSBmaW5kKHJfa2V5KTsKKyAgaWYgKGl0ID09IGJhc2VfdHlwZTo6ZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBlcmFzZShpdCk7CisgIHJldHVybiB0cnVlOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UoaXRlcmF0b3IgaXQpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICBpZiAoaXQgPT0gYmFzZV90eXBlOjplbmQoKSkKKyAgICByZXR1cm4gaXQ7CisgIGl0ZXJhdG9yIHJldF9pdCA9IGl0OworICArK3JldF9pdDsKKyAgZXJhc2Vfbm9kZShpdC5tX3BfbmQpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgcmV0dXJuIHJldF9pdDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cmV2ZXJzZV9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2UocmV2ZXJzZV9pdGVyYXRvciBpdCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIGlmIChpdC5tX3BfbmQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKyAgICByZXR1cm4gKGl0KTsKKyAgcmV2ZXJzZV9pdGVyYXRvciByZXRfaXQgPSBpdDsKKyAgKytyZXRfaXQ7CisgIGVyYXNlX25vZGUoaXQubV9wX25kKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIHJldHVybiByZXRfaXQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgoraW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX2lmKFByZWQgcHJlZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIHNpemVfdHlwZSBudW1fZXJzZCA9IDA7CisgIGl0ZXJhdG9yIGl0ID0gYmFzZV90eXBlOjpiZWdpbigpOworICB3aGlsZSAoaXQgIT0gYmFzZV90eXBlOjplbmQoKSkKKyAgICB7CisgICAgICBpZiAocHJlZCgqaXQpKQorICAgICAgICB7CisJICArK251bV9lcnNkOworCSAgaXQgPSBlcmFzZShpdCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwkrK2l0OworICAgIH0KKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIHJldHVybiBudW1fZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlX25vZGUobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kICE9IDApOworICBzcGxheShwX25kKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgPT0gdGhpcy0+bV9wX2hlYWQtPm1fcF9wYXJlbnQpOworCisgIG5vZGVfcG9pbnRlciBwX2wgPSBwX25kLT5tX3BfbGVmdDsKKyAgbm9kZV9wb2ludGVyIHBfciA9IHBfbmQtPm1fcF9yaWdodDsKKworICBiYXNlX3R5cGU6OnVwZGF0ZV9taW5fbWF4X2Zvcl9lcmFzZWRfbm9kZShwX25kKTsKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX25kKTsKKyAgaWYgKHBfciA9PSAwKQorICAgIHsKKyAgICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX2w7CisgICAgICBpZiAocF9sICE9IDApCisJcF9sLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF90YXJnZXRfciA9IGxlZnRtb3N0KHBfcik7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3RhcmdldF9yICE9IDApOworICBwX3ItPm1fcF9wYXJlbnQgPSBiYXNlX3R5cGU6Om1fcF9oZWFkOworICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF9yOworICBzcGxheShwX3RhcmdldF9yKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ID0gMCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3RhcmdldF9yLT5tX3BfcGFyZW50ID09IHRoaXMtPm1fcF9oZWFkKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHRoaXMtPm1fcF9oZWFkLT5tX3BfcGFyZW50ID09IHBfdGFyZ2V0X3IpOworCisgIHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ID0gcF9sOworICBpZiAocF9sICE9IDApCisgICAgcF9sLT5tX3BfcGFyZW50ID0gcF90YXJnZXRfcjsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIGFwcGx5X3VwZGF0ZShwX3RhcmdldF9yLCAobm9kZV91cGRhdGUqICl0aGlzKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitsZWZ0bW9zdChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisgIHdoaWxlIChwX25kLT5tX3BfbGVmdCAhPSAwKQorICAgIHBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgcmV0dXJuIHBfbmQ7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDcwMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDk5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBmaW5kX2ZuX2ltcHMuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igc3BsYXlfdHJlZV8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgbm9kZV9wb2ludGVyIHBfZm91bmQgPSBmaW5kX2ltcChyX2tleSk7CisgIGlmIChwX2ZvdW5kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgc3BsYXkocF9mb3VuZCk7CisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX2ZvdW5kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfcG9pbnRfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgY29uc3Qgbm9kZV9wb2ludGVyIHBfZm91bmQgPSBmaW5kX2ltcChyX2tleSk7CisgIGlmIChwX2ZvdW5kICE9IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+c3BsYXkocF9mb3VuZCk7CisgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX2ZvdW5kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6bm9kZV9wb2ludGVyCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2ltcChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIHdoaWxlIChwX25kICE9IDApCisgICAgaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpLCByX2tleSkpCisgICAgICB7CisJaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkocl9rZXksIFBCX0RTX1YyRihwX25kLT5tX3ZhbHVlKSkpCisJICByZXR1cm4gcF9uZDsKKwlwX25kID0gcF9uZC0+bV9wX2xlZnQ7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKyAgcmV0dXJuIGJhc2VfdHlwZTo6bV9wX2hlYWQ7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgY29uc3QgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfcG9pbnRlcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgIG5vZGVfcG9pbnRlciBwX25kID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudDsKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIHJfa2V5KSkKKyAgICAgIHsKKwlpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShyX2tleSwgUEJfRFNfVjJGKHBfbmQtPm1fdmFsdWUpKSkKKwkgIHJldHVybiBwX25kOworCXBfbmQgPSBwX25kLT5tX3BfbGVmdDsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICBwX25kID0gcF9uZC0+bV9wX3JpZ2h0OworICByZXR1cm4gYmFzZV90eXBlOjptX3BfaGVhZDsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luZm9fZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2YjlhYgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbmZvX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGluZm9fZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uLgorICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vaW5zZXJ0X2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFiNThiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2luc2VydF9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDkzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBzcGxheV90cmVlXy4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHN0ZDo6cGFpcjx0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6cG9pbnRfaXRlcmF0b3IsIGJvb2w+CitQQl9EU19DTEFTU19DX0RFQzo6CitpbnNlcnQoY29uc3RfcmVmZXJlbmNlIHJfdmFsdWUpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBzdGQ6OnBhaXI8cG9pbnRfaXRlcmF0b3IsIGJvb2w+IGluc19wYWlyID0gaW5zZXJ0X2xlYWZfaW1wKHJfdmFsdWUpOworICBpbnNfcGFpci5maXJzdC5tX3BfbmQtPm1fc3BlY2lhbCA9IGZhbHNlOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpKTsKKyAgc3BsYXkoaW5zX3BhaXIuZmlyc3QubV9wX25kKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIHJldHVybiBpbnNfcGFpcjsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSBzdGQ6OnBhaXI8dHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yLCBib29sPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5zZXJ0X2xlYWZfaW1wKGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6c3RydWN0dXJlX29ubHlfYXNzZXJ0X3ZhbGlkKCk7KQorICBpZiAoYmFzZV90eXBlOjptX3NpemUgPT0gMCkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoYmFzZV90eXBlOjppbnNlcnRfaW1wX2VtcHR5KHJfdmFsdWUpLCB0cnVlKTsKKworICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgIG5vZGVfcG9pbnRlciBwX3BvdCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisKKyAgd2hpbGUgKHBfbmQgIT0gMCkKKyAgICBpZiAoIUNtcF9Gbjo6b3BlcmF0b3IoKShQQl9EU19WMkYocF9uZC0+bV92YWx1ZSksIFBCX0RTX1YyRihyX3ZhbHVlKSkpCisgICAgICB7CisJaWYgKCFDbXBfRm46Om9wZXJhdG9yKCkoUEJfRFNfVjJGKHJfdmFsdWUpLCBQQl9EU19WMkYocF9uZC0+bV92YWx1ZSkpKQorCSAgeworCSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocG9pbnRfaXRlcmF0b3IocF9uZCksIGZhbHNlKTsKKwkgIH0KKwlwX3BvdCA9IHBfbmQ7CisJcF9uZCA9IHBfbmQtPm1fcF9sZWZ0OworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHBfbmQgPSBwX25kLT5tX3BfcmlnaHQ7CisKKyAgaWYgKHBfcG90ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGJhc2VfdHlwZTo6aW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9yaWdodCwgZmFsc2UpLCB0cnVlKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6Y2hlY2tfa2V5X2RvZXNfbm90X2V4aXN0KFBCX0RTX1YyRihyX3ZhbHVlKSkpOworCisgIHBfbmQgPSBwX3BvdC0+bV9wX2xlZnQ7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcihiYXNlX3R5cGU6Omluc2VydF9sZWFmX25ldyhyX3ZhbHVlLCBwX3BvdCwgdHJ1ZSksIHRydWUpKTsKKworICB3aGlsZSAocF9uZC0+bV9wX3JpZ2h0ICE9IDApCisgICAgcF9uZCA9IHBfbmQtPm1fcF9yaWdodDsKKworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaW5zZXJ0X2xlYWZfbmV3KHJfdmFsdWUsIHBfbmQsIGZhbHNlKSwgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vbm9kZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vbm9kZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmMzk4ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9ub2RlLmhwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbm9kZS5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIHN0cnVjdCBmb3Igc3BsYXlfdHJlZV8ncyBub2RlLgorICovCisKKyNpZm5kZWYgUEJfRFNfU1BMQVlfVFJFRV9OT0RFX0hQUAorI2RlZmluZSBQQl9EU19TUExBWV9UUkVFX05PREVfSFBQCisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIE1ldGFkYXRhLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHNwbGF5X3RyZWVfbm9kZV8KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIE1ldGFkYXRhIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgc3BsYXlfdHJlZV9ub2RlXzxWYWx1ZV9UeXBlLCBNZXRhZGF0YSwgQWxsb2NhdG9yPiA+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgbm9kZV9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgbWV0YWRhdGFfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxtZXRhZGF0YV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfbWV0YWRhdGFfcmVmZXJlbmNlOworCisjaWZkZWYgUEJfRFNfQklOX1NFQVJDSF9UUkVFX1RSQUNFXworICAgICAgdm9pZAorICAgICAgdHJhY2UoKSBjb25zdAorICAgICAgeyBzdGQ6OmNvdXQgPDwgUEJfRFNfVjJGKG1fdmFsdWUpIDw8ICIoIiA8PCBtX21ldGFkYXRhIDw8ICIpIjsgfQorI2VuZGlmCisKKyAgICAgIGlubGluZSBib29sCisgICAgICBzcGVjaWFsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG1fc3BlY2lhbDsgfQorCisgICAgICBpbmxpbmUgY29uc3RfbWV0YWRhdGFfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisgICAgICBpbmxpbmUgbWV0YWRhdGFfcmVmZXJlbmNlCisgICAgICBnZXRfbWV0YWRhdGEoKQorICAgICAgeyByZXR1cm4gbV9tZXRhZGF0YTsgfQorCisgICAgICB2YWx1ZV90eXBlIG1fdmFsdWU7CisgICAgICBib29sIG1fc3BlY2lhbDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbGVmdDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcmlnaHQ7CisgICAgICBub2RlX3BvaW50ZXIgbV9wX3BhcmVudDsKKyAgICAgIG1ldGFkYXRhX3R5cGUgbV9tZXRhZGF0YTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIHN0cnVjdCBzcGxheV90cmVlX25vZGVfPFZhbHVlX1R5cGUsIG51bGxfbm9kZV9tZXRhZGF0YSwgQWxsb2NhdG9yPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFZhbHVlX1R5cGUgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgbnVsbF9ub2RlX21ldGFkYXRhIG1ldGFkYXRhX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorICAgICAgc3BsYXlfdHJlZV9ub2RlXzxWYWx1ZV9UeXBlLCBudWxsX25vZGVfbWV0YWRhdGEsIEFsbG9jYXRvcj4gPjo6b3RoZXI6OnBvaW50ZXIKKyAgICAgIG5vZGVfcG9pbnRlcjsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIHNwZWNpYWwoKSBjb25zdAorICAgICAgeyByZXR1cm4gbV9zcGVjaWFsOyB9CisKKyNpZmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0CisgICAgICB7IHN0ZDo6Y291dCA8PCBQQl9EU19WMkYobV92YWx1ZSk7IH0KKyNlbmRpZiAKKworICAgICAgbm9kZV9wb2ludGVyIG1fcF9sZWZ0OworICAgICAgbm9kZV9wb2ludGVyIG1fcF9yaWdodDsKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfcGFyZW50OworICAgICAgdmFsdWVfdHlwZSBtX3ZhbHVlOworICAgICAgYm9vbCBtX3NwZWNpYWw7CisgICAgfTsKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJhZTIyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGF5X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMjgzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzcGxheV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgd2hpbGUgKHBfbmQtPm1fcF9wYXJlbnQgIT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHsKKwlub2RlX3BvaW50ZXIgcF9oZWFkID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKwlhc3NlcnRfc3BlY2lhbF9pbXAocF9oZWFkKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kKTspCisKKyAgICAgICAgaWYgKHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQgPT0gYmFzZV90eXBlOjptX3BfaGVhZCkKKwkgIHsKKyAgICAgICAgICAgIGJhc2VfdHlwZTo6cm90YXRlX3BhcmVudChwX25kKTsKKyAgICAgICAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kID09IHRoaXMtPm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKwkgIH0KKyAgICAgICAgZWxzZQorCSAgeworICAgICAgICAgICAgY29uc3Qgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZC0+bV9wX3BhcmVudDsKKyAgICAgICAgICAgIGNvbnN0IG5vZGVfcG9pbnRlciBwX2dyYW5kcGFyZW50ID0gcF9wYXJlbnQtPm1fcF9wYXJlbnQ7CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworICAgICAgICAgICAgY29uc3Qgc2l6ZV90eXBlIHRvdGFsID0KKwkgICAgICBiYXNlX3R5cGU6OnJlY3Vyc2l2ZV9jb3VudChwX2dyYW5kcGFyZW50KTsKKyAgICAgICAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh0b3RhbCA+PSAzKTsKKyNlbmRpZiAKKworICAgICAgICAgICAgaWYgKHBfcGFyZW50LT5tX3BfbGVmdCA9PSBwX25kICYmIAorCQlwX2dyYW5kcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9wYXJlbnQpCisJICAgICAgc3BsYXlfemlnX3phZ19sZWZ0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBfcGFyZW50LT5tX3BfcmlnaHQgPT0gcF9uZCAmJiAKKwkJICAgICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9PSBwX3BhcmVudCkKKwkgICAgICBzcGxheV96aWdfemFnX3JpZ2h0KHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBfcGFyZW50LT5tX3BfbGVmdCA9PSBwX25kICYmIAorCQkgICAgIHBfZ3JhbmRwYXJlbnQtPm1fcF9sZWZ0ID09IHBfcGFyZW50KQorCSAgICAgIHNwbGF5X3ppZ196aWdfbGVmdChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisgICAgICAgICAgICBlbHNlCisJICAgICAgc3BsYXlfemlnX3ppZ19yaWdodChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisgICAgICAgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQodG90YWwgPT10aGlzLT5yZWN1cnNpdmVfY291bnQocF9uZCkpOworCSAgfQorCisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX25kKTspCisgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96aWdfemFnX2xlZnQobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX3BhcmVudCwgCisJCSAgIG5vZGVfcG9pbnRlciBwX2dyYW5kcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQgPT0gcF9uZC0+bV9wX3BhcmVudCk7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX2dyYW5kcGFyZW50ID09IHBfcGFyZW50LT5tX3BfcGFyZW50KTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX2dyYW5kcGFyZW50KTspCisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50LT5tX3BfbGVmdCA9PSBwX25kICYmIAorCQkgICAgICAgIHBfZ3JhbmRwYXJlbnQtPm1fcF9yaWdodCA9PSBwX3BhcmVudCk7CisKKyAgc3BsYXlfenpfc3RhcnQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCisgIG5vZGVfcG9pbnRlciBwX2IgPSBwX25kLT5tX3BfcmlnaHQ7CisgIG5vZGVfcG9pbnRlciBwX2MgPSBwX25kLT5tX3BfbGVmdDsKKworICBwX25kLT5tX3BfcmlnaHQgPSBwX3BhcmVudDsKKyAgcF9wYXJlbnQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIHBfbmQtPm1fcF9sZWZ0ID0gcF9ncmFuZHBhcmVudDsKKyAgcF9ncmFuZHBhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9wYXJlbnQtPm1fcF9sZWZ0ID0gcF9iOworICBpZiAocF9iICE9IDApCisgICAgcF9iLT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgcF9ncmFuZHBhcmVudC0+bV9wX3JpZ2h0ID0gcF9jOworICBpZiAocF9jICE9IDApCisgICAgcF9jLT5tX3BfcGFyZW50ID0gcF9ncmFuZHBhcmVudDsKKworICBzcGxheV96el9lbmQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3ppZ196YWdfcmlnaHQobm9kZV9wb2ludGVyIHBfbmQsIG5vZGVfcG9pbnRlciBwX3BhcmVudCwgCisJCSAgICBub2RlX3BvaW50ZXIgcF9ncmFuZHBhcmVudCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ID09IHBfbmQtPm1fcF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCA9PSBwX3BhcmVudC0+bV9wX3BhcmVudCk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShiYXNlX3R5cGU6OmFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9ncmFuZHBhcmVudCk7KQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3JpZ2h0ID09IHBfbmQgJiYgCisJICAJICAgICAgICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9PSBwX3BhcmVudCk7CisKKyAgc3BsYXlfenpfc3RhcnQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCisgIG5vZGVfcG9pbnRlciBwX2IgPSBwX25kLT5tX3BfbGVmdDsKKyAgbm9kZV9wb2ludGVyIHBfYyA9IHBfbmQtPm1fcF9yaWdodDsKKworICBwX25kLT5tX3BfbGVmdCA9IHBfcGFyZW50OworICBwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9uZC0+bV9wX3JpZ2h0ID0gcF9ncmFuZHBhcmVudDsKKyAgcF9ncmFuZHBhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfYjsKKyAgaWYgKHBfYiAhPSAwKQorICAgIHBfYi0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworCisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9sZWZ0ID0gcF9jOworICBpZiAocF9jICE9IDApCisgICAgcF9jLT5tX3BfcGFyZW50ID0gcF9ncmFuZHBhcmVudDsKKworICBzcGxheV96el9lbmQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3ppZ196aWdfbGVmdChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LCAKKwkJICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgPT0gcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfZ3JhbmRwYXJlbnQpOykKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9wYXJlbnQtPm1fcF9sZWZ0ID09IHBfbmQgJiYgCisJCSAgICAgcF9uZC0+bV9wX3BhcmVudC0+bV9wX3BhcmVudC0+bV9wX2xlZnQgPT0gcF9uZC0+bV9wX3BhcmVudCk7CisKKyAgc3BsYXlfenpfc3RhcnQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworCisgIG5vZGVfcG9pbnRlciBwX2IgPSBwX25kLT5tX3BfcmlnaHQ7CisgIG5vZGVfcG9pbnRlciBwX2MgPSBwX3BhcmVudC0+bV9wX3JpZ2h0OworCisgIHBfbmQtPm1fcF9yaWdodCA9IHBfcGFyZW50OworICBwX3BhcmVudC0+bV9wX3BhcmVudCA9IHBfbmQ7CisKKyAgcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfZ3JhbmRwYXJlbnQ7CisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX3BhcmVudC0+bV9wX2xlZnQgPSBwX2I7CisgIGlmIChwX2IgIT0gMCkKKyAgICBwX2ItPm1fcF9wYXJlbnQgPSBwX3BhcmVudDsKKworICBwX2dyYW5kcGFyZW50LT5tX3BfbGVmdCA9IHBfYzsKKyAgaWYgKHBfYyAhPSAwKQorICAgIHBfYy0+bV9wX3BhcmVudCA9IHBfZ3JhbmRwYXJlbnQ7CisKKyAgc3BsYXlfenpfZW5kKHBfbmQsIHBfcGFyZW50LCBwX2dyYW5kcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxheV96aWdfemlnX3JpZ2h0KG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9wYXJlbnQsIAorCQkgICAgbm9kZV9wb2ludGVyIHBfZ3JhbmRwYXJlbnQpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfZ3JhbmRwYXJlbnQgPT0gcF9wYXJlbnQtPm1fcF9wYXJlbnQpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGJhc2VfdHlwZTo6YXNzZXJ0X25vZGVfY29uc2lzdGVudChwX2dyYW5kcGFyZW50KTspCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3BhcmVudC0+bV9wX3JpZ2h0ID09IHBfbmQgJiYgCisJICAgICAgICAgIHBfbmQtPm1fcF9wYXJlbnQtPm1fcF9wYXJlbnQtPm1fcF9yaWdodCA9PSBwX25kLT5tX3BfcGFyZW50KTsKKworICBzcGxheV96el9zdGFydChwX25kLCBwX3BhcmVudCwgcF9ncmFuZHBhcmVudCk7CisKKyAgbm9kZV9wb2ludGVyIHBfYiA9IHBfbmQtPm1fcF9sZWZ0OworICBub2RlX3BvaW50ZXIgcF9jID0gcF9wYXJlbnQtPm1fcF9sZWZ0OworCisgIHBfbmQtPm1fcF9sZWZ0ID0gcF9wYXJlbnQ7CisgIHBfcGFyZW50LT5tX3BfcGFyZW50ID0gcF9uZDsKKworICBwX3BhcmVudC0+bV9wX2xlZnQgPSBwX2dyYW5kcGFyZW50OworICBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50ID0gcF9wYXJlbnQ7CisKKyAgcF9wYXJlbnQtPm1fcF9yaWdodCA9IHBfYjsKKyAgaWYgKHBfYiAhPSAwKQorICAgIHBfYi0+bV9wX3BhcmVudCA9IHBfcGFyZW50OworCisgIHBfZ3JhbmRwYXJlbnQtPm1fcF9yaWdodCA9IHBfYzsKKyAgaWYgKHBfYyAhPSAwKQorICAgIHBfYy0+bV9wX3BhcmVudCA9IHBfZ3JhbmRwYXJlbnQ7CisKKyAgYmFzZV90eXBlOjp1cGRhdGVfdG9fdG9wKHBfZ3JhbmRwYXJlbnQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBzcGxheV96el9lbmQocF9uZCwgcF9wYXJlbnQsIHBfZ3JhbmRwYXJlbnQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3p6X3N0YXJ0KG5vZGVfcG9pbnRlciBwX25kLAorI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisJICAgICAgIG5vZGVfcG9pbnRlciBwX3BhcmVudCwKKyNlbHNlIAorCSAgICAgICBub2RlX3BvaW50ZXIgLypwX3BhcmVudCovLAorI2VuZGlmCisJICAgICAgIG5vZGVfcG9pbnRlciBwX2dyYW5kcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZCAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfcGFyZW50ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9ncmFuZHBhcmVudCAhPSAwKTsKKworICBjb25zdCBib29sIGdyYW5kcGFyZW50X2hlYWQgPSBwX2dyYW5kcGFyZW50LT5tX3BfcGFyZW50ID09IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisKKyAgaWYgKGdyYW5kcGFyZW50X2hlYWQpCisgICAgeworICAgICAgYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQ7CisgICAgICBwX25kLT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfZ3JlYXRncmFuZHBhcmVudCA9IHBfZ3JhbmRwYXJlbnQtPm1fcF9wYXJlbnQ7CisKKyAgcF9uZC0+bV9wX3BhcmVudCA9IHBfZ3JlYXRncmFuZHBhcmVudDsKKworICBpZiAocF9ncmFuZHBhcmVudCA9PSBwX2dyZWF0Z3JhbmRwYXJlbnQtPm1fcF9sZWZ0KQorICAgIHBfZ3JlYXRncmFuZHBhcmVudC0+bV9wX2xlZnQgPSBwX25kOworICBlbHNlCisgICAgcF9ncmVhdGdyYW5kcGFyZW50LT5tX3BfcmlnaHQgPSBwX25kOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3NwbGF5X3p6X2VuZChub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfcGFyZW50LCAKKwkgICAgIG5vZGVfcG9pbnRlciBwX2dyYW5kcGFyZW50KQoreworICBpZiAocF9uZC0+bV9wX3BhcmVudCA9PSBiYXNlX3R5cGU6Om1fcF9oZWFkKQorICAgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25kOworCisgIGFwcGx5X3VwZGF0ZShwX2dyYW5kcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgYXBwbHlfdXBkYXRlKHBfcGFyZW50LCAobm9kZV91cGRhdGUqICl0aGlzKTsKKyAgYXBwbHlfdXBkYXRlKHBfbmQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYmFzZV90eXBlOjphc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfbmQpOykKK30KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL3NwbGF5X3RyZWVfLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyZWIwNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV90cmVlXy5ocHAKQEAgLTAsMCArMSwyOTggQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNwbGF5X3RyZWVfLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisvKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGFuIGlkZWEgZnJvbSB0aGUgU0dJIFNUTCAodXNpbmcgYSBAYSBoZWFkZXIgbm9kZQorICogICAgd2hpY2ggaXMgbmVlZGVkIGZvciBlZmZpY2llbnQgaXRlcmF0aW9uKS4gRm9sbG93aW5nIGlzIHRoZSBTR0kgU1RMCisgKiAgICBjb3B5cmlnaHQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gICAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICAgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqLworCisjaWZkZWYgUEJfRFNfREFUQV9UUlVFX0lORElDQVRPUgorI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfSFBQX19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0JJTl9TRUFSQ0hfVFJFRV9IUFBfX0RBVEFfVFJVRV9JTkRJQ0FUT1IKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jpbl9zZWFyY2hfdHJlZV8vYmluX3NlYXJjaF90cmVlXy5ocHA+CisjZW5kaWYgCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2lmbmRlZiBQQl9EU19CSU5fU0VBUkNIX1RSRUVfSFBQX19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19CSU5fU0VBUkNIX1RSRUVfSFBQX19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmluX3NlYXJjaF90cmVlXy9iaW5fc2VhcmNoX3RyZWVfLmhwcD4KKyNlbmRpZiAKKyNlbmRpZiAKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBNYXBwZWQsIHR5cGVuYW1lIENtcF9GbiwgXAorCSAgICAgdHlwZW5hbWUgTm9kZV9BbmRfSXRfVHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0NMQVNTX05BTUUgc3BsYXlfdHJlZV9kYXRhXworI2VuZGlmIAorCisjaWZkZWYgUEJfRFNfREFUQV9GQUxTRV9JTkRJQ0FUT1IKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfTkFNRSBzcGxheV90cmVlX25vX2RhdGFfCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0JBU0VfQ0xBU1NfTkFNRSBiaW5fc2VhcmNoX3RyZWVfZGF0YV8KKyNlbmRpZiAKKworI2lmZGVmIFBCX0RTX0RBVEFfRkFMU0VfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX0JBU0VfQ0xBU1NfTkFNRSBiaW5fc2VhcmNoX3RyZWVfbm9fZGF0YV8KKyNlbmRpZiAKKworI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBcCisgICAgUEJfRFNfQ0xBU1NfTkFNRTxLZXksIE1hcHBlZCwgQ21wX0ZuLCBOb2RlX0FuZF9JdF9UcmFpdHMsIEFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDIFwKKyAgICBQQl9EU19CQVNFX0NMQVNTX05BTUU8S2V5LCBNYXBwZWQsIENtcF9GbiwgTm9kZV9BbmRfSXRfVHJhaXRzLCBBbGxvY2F0b3I+CisKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisjZGVmaW5lIFBCX0RTX1YyRihYKSAoWCkuZmlyc3QKKyNkZWZpbmUgUEJfRFNfVjJTKFgpIChYKS5zZWNvbmQKKyNkZWZpbmUgUEJfRFNfRVAyVlAoWCkmICgoWCktPm1fdmFsdWUpCisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19EQVRBX0ZBTFNFX0lORElDQVRPUgorI2RlZmluZSBQQl9EU19WMkYoWCkgKFgpCisjZGVmaW5lIFBCX0RTX1YyUyhYKSBNYXBwZWRfRGF0YSgpCisjZGVmaW5lIFBCX0RTX0VQMlZQKFgpJiAoKFgpLT5tX3ZhbHVlLmZpcnN0KQorI2VuZGlmIAorCisgICAgLy8gJHAxNHkgN3IzMyA3NDgxLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBDbXBfRm4sCisJICAgICB0eXBlbmFtZSBOb2RlX0FuZF9JdF9UcmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBjbGFzcyBQQl9EU19DTEFTU19OQU1FIDogcHVibGljIFBCX0RTX0JBU0VfQ19ERUMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnNpemVfdHlwZSBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIGNtcF9mbjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfcG9pbnRlciBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9rZXlfcG9pbnRlciBjb25zdF9rZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfcmVmZXJlbmNlIGtleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3Rfa2V5X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9wb2ludGVyIG1hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X21hcHBlZF9wb2ludGVyIGNvbnN0X21hcHBlZF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Om1hcHBlZF9yZWZlcmVuY2UgbWFwcGVkX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9tYXBwZWRfcmVmZXJlbmNlIGNvbnN0X21hcHBlZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnBvaW50X2l0ZXJhdG9yIHBvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X3BvaW50X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV91cGRhdGUgbm9kZV91cGRhdGU7CisKKyAgICAgIFBCX0RTX0NMQVNTX05BTUUoKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBDbXBfRm4mKTsKKworICAgICAgUEJfRFNfQ0xBU1NfTkFNRShjb25zdCBDbXBfRm4mLCBjb25zdCBub2RlX3VwZGF0ZSYpOworCisgICAgICBQQl9EU19DTEFTU19OQU1FKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQsIEl0KTsKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0X3JlZmVyZW5jZSByX3ZhbHVlKTsKKworICAgICAgaW5saW5lIG1hcHBlZF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKKyAgICAgIHsKKyNpZmRlZiBQQl9EU19EQVRBX1RSVUVfSU5ESUNBVE9SCisJX0dMSUJDWFhfREVCVUdfT05MWShQQl9EU19DTEFTU19DX0RFQzo6YXNzZXJ0X3ZhbGlkKCk7KQorCXN0ZDo6cGFpcjxwb2ludF9pdGVyYXRvciwgYm9vbD4gaW5zX3BhaXIgPQorCSAgaW5zZXJ0X2xlYWZfaW1wKHZhbHVlX3R5cGUocl9rZXksIG1hcHBlZF90eXBlKCkpKTsKKworCWluc19wYWlyLmZpcnN0Lm1fcF9uZC0+bV9zcGVjaWFsID0gZmFsc2U7CisJX0dMSUJDWFhfREVCVUdfT05MWShiYXNlX3R5cGU6OmFzc2VydF92YWxpZCgpKTsKKwlzcGxheShpbnNfcGFpci5maXJzdC5tX3BfbmQpOworCV9HTElCQ1hYX0RFQlVHX09OTFkoUEJfRFNfQ0xBU1NfQ19ERUM6OmFzc2VydF92YWxpZCgpOykKKwlyZXR1cm4gaW5zX3BhaXIuZmlyc3QubV9wX25kLT5tX3ZhbHVlLnNlY29uZDsKKyNlbHNlIAorCWluc2VydChyX2tleSk7CisJcmV0dXJuIGJhc2VfdHlwZTo6c19udWxsX21hcHBlZDsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBpbmxpbmUgcG9pbnRfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdF9rZXlfcmVmZXJlbmNlKSBjb25zdDsKKworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIGVyYXNlKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIGl0KTsKKworICAgICAgaW5saW5lIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIGVyYXNlKHJldmVyc2VfaXRlcmF0b3IpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgorICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgZXJhc2VfaWYoUHJlZCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgICAgdm9pZAorICAgICAgc3BsaXQoY29uc3Rfa2V5X3JlZmVyZW5jZSwgUEJfRFNfQ0xBU1NfQ19ERUMmKTsKKworICAgIHByaXZhdGU6CisgICAgICBpbmxpbmUgc3RkOjpwYWlyPHBvaW50X2l0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0X2xlYWZfaW1wKGNvbnN0X3JlZmVyZW5jZSk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGZpbmRfaW1wKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgICBpbmxpbmUgY29uc3Qgbm9kZV9wb2ludGVyCisgICAgICBmaW5kX2ltcChjb25zdF9rZXlfcmVmZXJlbmNlKSBjb25zdDsKKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfdmFsaWQoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgYXNzZXJ0X3NwZWNpYWxfaW1wKGNvbnN0IG5vZGVfcG9pbnRlcikgY29uc3Q7CisjZW5kaWYgCisKKyAgICAgIHZvaWQKKyAgICAgIHNwbGF5KG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzcGxheV96aWdfemFnX2xlZnQobm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlcik7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBzcGxheV96aWdfemFnX3JpZ2h0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfemlnX3ppZ19sZWZ0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfemlnX3ppZ19yaWdodChub2RlX3BvaW50ZXIsIG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNwbGF5X3p6X3N0YXJ0KG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgc3BsYXlfenpfZW5kKG5vZGVfcG9pbnRlciwgbm9kZV9wb2ludGVyLCBub2RlX3BvaW50ZXIpOworCisgICAgICBpbmxpbmUgbm9kZV9wb2ludGVyCisgICAgICBsZWZ0bW9zdChub2RlX3BvaW50ZXIpOworCisgICAgICB2b2lkCisgICAgICBlcmFzZV9ub2RlKG5vZGVfcG9pbnRlcik7CisgICAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9pbnNlcnRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxheV9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2VyYXNlX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vZmluZF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3NwbGF5X3RyZWVfL2RlYnVnX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19OQU1FCisjdW5kZWYgUEJfRFNfQkFTRV9DTEFTU19OQU1FCisjdW5kZWYgUEJfRFNfQkFTRV9DX0RFQworI3VuZGVmIFBCX0RTX1YyRgorI3VuZGVmIFBCX0RTX0VQMlZQCisjdW5kZWYgUEJfRFNfVjJTCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWY1YmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDExMiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHNwbGF5X3RyZWVfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogoram9pbihQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpOykKKyAgaWYgKGJhc2VfdHlwZTo6am9pbl9wcmVwKG90aGVyKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBub2RlX3BvaW50ZXIgcF90YXJnZXRfciA9IG90aGVyLmxlZnRtb3N0KG90aGVyLm1fcF9oZWFkKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3IgIT0gMCk7CisgIG90aGVyLnNwbGF5KHBfdGFyZ2V0X3IpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3RhcmdldF9yID09IG90aGVyLm1fcF9oZWFkLT5tX3BfcGFyZW50KTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ID09IDApOworCisgIHBfdGFyZ2V0X3ItPm1fcF9sZWZ0ID0gYmFzZV90eXBlOjptX3BfaGVhZC0+bV9wX3BhcmVudDsKKworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF90YXJnZXRfci0+bV9wX2xlZnQgIT0gMCk7CisgIHBfdGFyZ2V0X3ItPm1fcF9sZWZ0LT5tX3BfcGFyZW50ID0gcF90YXJnZXRfcjsKKworICBiYXNlX3R5cGU6Om1fcF9oZWFkLT5tX3BfcGFyZW50ID0gcF90YXJnZXRfcjsKKyAgcF90YXJnZXRfci0+bV9wX3BhcmVudCA9IGJhc2VfdHlwZTo6bV9wX2hlYWQ7CisgIGFwcGx5X3VwZGF0ZShwX3RhcmdldF9yLCAobm9kZV91cGRhdGUqICl0aGlzKTsKKworICBiYXNlX3R5cGU6OmpvaW5fZmluaXNoKG90aGVyKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5LCBQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpCit7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCkpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpKTsKKworICBpZiAoYmFzZV90eXBlOjpzcGxpdF9wcmVwKHJfa2V5LCBvdGhlcikgPT0gZmFsc2UpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgICAgICBfR0xJQkNYWF9ERUJVR19PTkxZKG90aGVyLmFzc2VydF92YWxpZCgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfdXBwZXJfYm91bmQgPSB1cHBlcl9ib3VuZChyX2tleSkubV9wX25kOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF91cHBlcl9ib3VuZCAhPSAwKTsKKworICBzcGxheShwX3VwcGVyX2JvdW5kKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdXBwZXJfYm91bmQtPm1fcF9wYXJlbnQgPT0gdGhpcy0+bV9wX2hlYWQpOworCisgIG5vZGVfcG9pbnRlciBwX25ld19yb290ID0gcF91cHBlcl9ib3VuZC0+bV9wX2xlZnQ7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25ld19yb290ICE9IDApOworCisgIGJhc2VfdHlwZTo6bV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX25ld19yb290OworICBwX25ld19yb290LT5tX3BfcGFyZW50ID0gYmFzZV90eXBlOjptX3BfaGVhZDsKKyAgb3RoZXIubV9wX2hlYWQtPm1fcF9wYXJlbnQgPSBwX3VwcGVyX2JvdW5kOworICBwX3VwcGVyX2JvdW5kLT5tX3BfcGFyZW50ID0gb3RoZXIubV9wX2hlYWQ7CisgIHBfdXBwZXJfYm91bmQtPm1fcF9sZWZ0ID0gMDsKKyAgYXBwbHlfdXBkYXRlKHBfdXBwZXJfYm91bmQsIChub2RlX3VwZGF0ZSogKXRoaXMpOworICBiYXNlX3R5cGU6OnNwbGl0X2ZpbmlzaChvdGhlcik7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKSk7CisgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCkpOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vdHJhaXRzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWRjMzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3BsYXlfdHJlZV8vdHJhaXRzLmhwcApAQCAtMCwwICsxLDExMyBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJhaXRzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHNwbGF5X3RyZWVfLgorICovCisKKyNpZm5kZWYgUEJfRFNfU1BMQVlfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCisjZGVmaW5lIFBCX0RTX1NQTEFZX1RSRUVfTk9ERV9BTkRfSVRfVFJBSVRTX0hQUAorCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9zcGxheV90cmVlXy9ub2RlLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBNYXBwZWQsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBOb2RlX0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBDbXBfRm5fLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3JfPgorICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCB0cmVlX3RyYWl0czwKKyAgICAgIEtleSwKKyAgICAgIE1hcHBlZCwKKyAgICAgIENtcF9GbiwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgc3BsYXlfdHJlZV90YWcsCisgICAgICBBbGxvY2F0b3I+IDogcHVibGljIGJpbl9zZWFyY2hfdHJlZV90cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIHNwbGF5X3RyZWVfbm9kZV88CisgICAgICB0eXBlbmFtZSB0eXBlc190cmFpdHM8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBBbGxvY2F0b3IsCisgICAgICBmYWxzZT46OnZhbHVlX3R5cGUsCisgICAgICB0eXBlbmFtZSB0cmVlX25vZGVfbWV0YWRhdGFfc2VsZWN0b3I8CisgICAgICBLZXksCisgICAgICBNYXBwZWQsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIEFsbG9jYXRvcj46OnR5cGUsCisgICAgICBBbGxvY2F0b3I+LAorICAgICAgQWxsb2NhdG9yPgorICAgIHsgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwKKwkgICAgIGNsYXNzIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIE5vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIGNsYXNzIEFsbG9jYXRvcl8+CisgICAgICAgICAgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHRyZWVfdHJhaXRzPEtleSwgbnVsbF9tYXBwZWRfdHlwZSwgQ21wX0ZuLCBOb2RlX1VwZGF0ZSwKKwkJICAgICAgIHNwbGF5X3RyZWVfdGFnLCBBbGxvY2F0b3I+IAorICAgIDogcHVibGljIGJpbl9zZWFyY2hfdHJlZV90cmFpdHM8S2V5LCBudWxsX21hcHBlZF90eXBlLCBDbXBfRm4sCisJCQkJICAgIE5vZGVfVXBkYXRlLCAKKwkgICBzcGxheV90cmVlX25vZGVfPHR5cGVuYW1lIHR5cGVzX3RyYWl0czxLZXksIG51bGxfbWFwcGVkX3R5cGUsIEFsbG9jYXRvciwgZmFsc2U+Ojp2YWx1ZV90eXBlLAorCQkJICAgIHR5cGVuYW1lIHRyZWVfbm9kZV9tZXRhZGF0YV9zZWxlY3RvcjwKKyAgICAgIEtleSwKKyAgICAgIG51bGxfbWFwcGVkX3R5cGUsCisgICAgICBDbXBfRm4sCisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIEFsbG9jYXRvcj46OnR5cGUsCisgICAgICBBbGxvY2F0b3I+LAorICAgICAgQWxsb2NhdG9yPgorICAgIHsgfTsKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfU1BMQVlfVFJFRV9OT0RFX0FORF9JVF9UUkFJVFNfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvc3RhbmRhcmRfcG9saWNpZXMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJmYmIwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcApAQCAtMCwwICsxLDEzNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3RhbmRhcmRfcG9saWNpZXMuaHBwCisgKiBDb250YWlucyBzdGFuZGFyZCBwb2xpY2llcyBmb3IgY29udGFpbmVycy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NUQU5EQVJEX1BPTElDSUVTX0hQUAorI2RlZmluZSBQQl9EU19TVEFOREFSRF9QT0xJQ0lFU19IUFAKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxleHQvcGJfZHMvaGFzaF9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9saXN0X3VwZGF0ZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9iYXNpY190cmVlX3BvbGljeS9udWxsX25vZGVfbWV0YWRhdGEuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmllX3BvbGljeS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CisgICAgc3RydWN0IGRlZmF1bHRfaGFzaF9mbgorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjp0cjE6Omhhc2g8S2V5PiB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXk+CisgICAgc3RydWN0IGRlZmF1bHRfZXFfZm4KKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6ZXF1YWxfdG88S2V5PiB0eXBlOworICAgIH07CisKKyAgICBlbnVtCisgICAgICB7CisJZGVmYXVsdF9zdG9yZV9oYXNoID0gZmFsc2UKKyAgICAgIH07CisKKyAgICBzdHJ1Y3QgZGVmYXVsdF9jb21iX2hhc2hfZm4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6OmRpcmVjdF9tYXNrX3JhbmdlX2hhc2hpbmc8PiB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb21iX0hhc2hfRm4+CisgICAgc3RydWN0IGRlZmF1bHRfcmVzaXplX3BvbGljeQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBDb21iX0hhc2hfRm46OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfcGJkczo6ZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZzxzaXplX3R5cGU+IGRlZmF1bHRfZm47CisgICAgICB0eXBlZGVmIGlzX3NhbWU8ZGVmYXVsdF9mbiwgQ29tYl9IYXNoX0ZuPiBzYW1lX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6Omhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3k8c2l6ZV90eXBlPiBpZnRydWU7CisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6Omhhc2hfcHJpbWVfc2l6ZV9wb2xpY3kgaWZmYWxzZTsKKyAgICAgIHR5cGVkZWYgX19jb25kaXRpb25hbF90eXBlPHNhbWVfdHlwZTo6dmFsdWUsIGlmdHJ1ZSwgaWZmYWxzZT4gY29uZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kX3R5cGU6Ol9fdHlwZSBzaXplX3BvbGljeV90eXBlOworCisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6Omhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcjxmYWxzZSwgc2l6ZV90eXBlPiB0cmlnZ2VyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfX2dudV9wYmRzOjpoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3k8c2l6ZV9wb2xpY3lfdHlwZSwgdHJpZ2dlciwgZmFsc2UsIHNpemVfdHlwZT4gdHlwZTsKKyAgICB9OworCisgICAgc3RydWN0IGRlZmF1bHRfdXBkYXRlX3BvbGljeQorICAgIHsKKyAgICAgIHR5cGVkZWYgX19nbnVfcGJkczo6bW92ZV90b19mcm9udF9sdV9wb2xpY3k8PiB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb21iX1Byb2JlX0ZuPgorICAgIHN0cnVjdCBkZWZhdWx0X3Byb2JlX2ZuCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIENvbWJfUHJvYmVfRm46OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX19nbnVfcGJkczo6ZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZzxzaXplX3R5cGU+IGRlZmF1bHRfZm47CisgICAgICB0eXBlZGVmIGlzX3NhbWU8ZGVmYXVsdF9mbiwgQ29tYl9Qcm9iZV9Gbj4gc2FtZV90eXBlOworICAgICAgdHlwZWRlZiBfX2dudV9wYmRzOjpsaW5lYXJfcHJvYmVfZm48c2l6ZV90eXBlPiBpZnRydWU7CisgICAgICB0eXBlZGVmIF9fZ251X3BiZHM6OnF1YWRyYXRpY19wcm9iZV9mbjxzaXplX3R5cGU+IGlmZmFsc2U7CisgICAgICB0eXBlZGVmIF9fY29uZGl0aW9uYWxfdHlwZTxzYW1lX3R5cGU6OnZhbHVlLCBpZnRydWUsIGlmZmFsc2U+IGNvbmRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY29uZF90eXBlOjpfX3R5cGUgdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5PgorICAgIHN0cnVjdCBkZWZhdWx0X3RyaWVfZV9hY2Nlc3NfdHJhaXRzOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhciwgY2xhc3MgQ2hhcl9UcmFpdHM+CisgICAgc3RydWN0IGRlZmF1bHRfdHJpZV9lX2FjY2Vzc190cmFpdHM8c3RkOjpiYXNpY19zdHJpbmc8Q2hhciwgQ2hhcl9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4gPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxDaGFyLCBDaGFyX1RyYWl0cywgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPiBzdHJpbmdfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX19nbnVfcGJkczo6c3RyaW5nX3RyaWVfZV9hY2Nlc3NfdHJhaXRzPHN0cmluZ190eXBlPiB0eXBlOworICAgIH07CisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NUQU5EQVJEX1BPTElDSUVTX0hQUAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWIxMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9jb25zdHJ1Y3RvcnNfZGVzdHJ1Y3Rvcl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEwNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RydWN0b3JzX2Rlc3RydWN0b3JfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2NvcHlfZnJvbV9yYW5nZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKK3sKKyAgd2hpbGUgKGZpcnN0X2l0ICE9IGxhc3RfaXQpCisgICAgcHVzaCgqKGZpcnN0X2l0KyspKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit0aGluX2hlYXBfKCkgOgorICBtX3BfbWF4KDApCit7CisgIGluaXRpYWxpemUoKTsKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit0aGluX2hlYXBfKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pIDoKKyAgUEJfRFNfQkFTRV9DX0RFQyhyX2NtcF9mbiksCisgIG1fcF9tYXgoMCkKK3sKKyAgaW5pdGlhbGl6ZSgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3RoaW5faGVhcF8oY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKSA6CisgIFBCX0RTX0JBU0VfQ19ERUMob3RoZXIpCit7CisgIGluaXRpYWxpemUoKTsKKyAgbV9wX21heCA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisgIGZvciAobm9kZV9wb2ludGVyIHBfbmQgPSBiYXNlX3R5cGU6Om1fcF9yb290OyBwX25kICE9IDA7IHBfbmQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nKQorICAgIGlmIChDbXBfRm46Om9wZXJhdG9yKCkobV9wX21heC0+bV92YWx1ZSwgcF9uZC0+bV92YWx1ZSkpCisgICAgICBtX3BfbWF4ID0gcF9uZDsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsKKyAgc3RkOjpzd2FwKG1fcF9tYXgsIG90aGVyLm1fcF9tYXgpOworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK350aGluX2hlYXBfKCkKK3sgfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgoraW5pdGlhbGl6ZSgpCit7IHN0ZDo6ZmlsbChtX2FfYXV4LCBtX2FfYXV4ICsgbWF4X3JhbmssIHN0YXRpY19jYXN0PG5vZGVfcG9pbnRlcj4oMCkpOyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZGVidWdfZm5faW1wcy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllOTc3YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2RlYnVnX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMTEyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBkZWJ1Z19mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cithc3NlcnRfdmFsaWQoKSBjb25zdAoreworICBiYXNlX3R5cGU6OmFzc2VydF92YWxpZCgpOworICBhc3NlcnRfbm9kZV9jb25zaXN0ZW50KGJhc2VfdHlwZTo6bV9wX3Jvb3QsIHRydWUpOworICBhc3NlcnRfbWF4KCk7CisgIGFzc2VydF9hdXhfbnVsbCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X2F1eF9udWxsKCkgY29uc3QKK3sKKyAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtYXhfcmFuazsgKytpKQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX2FfYXV4W2ldID09IDApOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X21heCgpIGNvbnN0Cit7CisgIGlmIChtX3BfbWF4ID09IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6ZW1wdHkoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghYmFzZV90eXBlOjplbXB0eSgpKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6cGFyZW50KG1fcF9tYXgpID09IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX21heC0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApOworICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gYmFzZV90eXBlOjpiZWdpbigpOyBpdCAhPSBiYXNlX3R5cGU6OmVuZCgpOyArK2l0KQorICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCghQ21wX0ZuOjpvcGVyYXRvcigpKG1fcF9tYXgtPm1fdmFsdWUsIGl0Lm1fcF9uZC0+bV92YWx1ZSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYXNzZXJ0X25vZGVfY29uc2lzdGVudChjb25zdF9ub2RlX3BvaW50ZXIgcF9uZCwgYm9vbCByb290KSBjb25zdAoreworICBiYXNlX3R5cGU6OmFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZCwgcm9vdCk7CisgIGlmIChwX25kID09IDApCisgICAgcmV0dXJuOworCisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX25leHRfc2libGluZywgcm9vdCk7CisgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF9uZC0+bV9wX2xfY2hpbGQsIGZhbHNlKTsKKyAgaWYgKCFyb290KQorICAgIHsKKyAgICAgIGlmIChwX25kLT5tX21ldGFkYXRhID09IDApCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPT0gMCk7CisgICAgICBlbHNlCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fbWV0YWRhdGEgPT0gcF9uZC0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSArIDEpOworICAgIH0KKworICBpZiAocF9uZC0+bV9wX2xfY2hpbGQgIT0gMCkKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAxID09IGJhc2VfdHlwZTo6ZGVncmVlKHBfbmQpKTsKKworICBjb25zdCBib29sIHVubWFya2VkX3ZhbGlkID0ocF9uZC0+bV9wX2xfY2hpbGQgPT0gMCYmICBwX25kLT5tX21ldGFkYXRhID09IDApIHx8KHBfbmQtPm1fcF9sX2NoaWxkICE9IDAmJiAgcF9uZC0+bV9tZXRhZGF0YSA9PSBwX25kLT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDEpOworCisgIGNvbnN0IGJvb2wgbWFya2VkX3ZhbGlkID0ocF9uZC0+bV9wX2xfY2hpbGQgPT0gMCYmICBwX25kLT5tX21ldGFkYXRhID09IDEpIHx8KHBfbmQtPm1fcF9sX2NoaWxkICE9IDAmJiAgcF9uZC0+bV9tZXRhZGF0YSA9PSBwX25kLT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDIpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVCh1bm1hcmtlZF92YWxpZCB8fCBtYXJrZWRfdmFsaWQpOworICBpZiAocm9vdCkKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQodW5tYXJrZWRfdmFsaWQpOworfQorCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2VyYXNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzFhNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9lcmFzZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDI5NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgZXJhc2VfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citwb3AoKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKG1fcF9tYXggIT0gMCk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBtX3BfbWF4OworCisgIHJlbW92ZV9tYXhfbm9kZSgpOworCisgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9uZCk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3JlbW92ZV9tYXhfbm9kZSgpCit7CisgIHRvX2F1eF9leGNlcHRfbWF4KCk7CisKKyAgbWFrZV9mcm9tX2F1eCgpOworfQorCitQQl9EU19DTEFTU19UX0RFQwordm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9fYXV4X2V4Y2VwdF9tYXgoKQoreworICBub2RlX3BvaW50ZXIgcF9hZGQgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgIHdoaWxlIChwX2FkZCAhPSBtX3BfbWF4KQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHRfYWRkID0gcF9hZGQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIGFkZF90b19hdXgocF9hZGQpOworCisgICAgICBwX2FkZCA9IHBfbmV4dF9hZGQ7CisgICAgfQorCisgIHBfYWRkID0gbV9wX21heC0+bV9wX2xfY2hpbGQ7CisKKyAgd2hpbGUgKHBfYWRkICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dF9hZGQgPSBwX2FkZC0+bV9wX25leHRfc2libGluZzsKKworICAgICAgcF9hZGQtPm1fbWV0YWRhdGEgPSBwX2FkZC0+bV9wX2xfY2hpbGQgPT0gMD8KKwkwIDoKKwlwX2FkZC0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAxOworCisgICAgICBhZGRfdG9fYXV4KHBfYWRkKTsKKworICAgICAgcF9hZGQgPSBwX25leHRfYWRkOworICAgIH0KKworICBwX2FkZCA9IG1fcF9tYXgtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgd2hpbGUgKHBfYWRkICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dF9hZGQgPSBwX2FkZC0+bV9wX25leHRfc2libGluZzsKKworICAgICAgYWRkX3RvX2F1eChwX2FkZCk7CisKKyAgICAgIHBfYWRkID0gcF9uZXh0X2FkZDsKKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYWRkX3RvX2F1eChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgc2l6ZV90eXBlIHIgPSBwX25kLT5tX21ldGFkYXRhOworCisgIHdoaWxlIChtX2FfYXV4W3JdICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQtPm1fbWV0YWRhdGEgPCByYW5rX2JvdW5kKCkpOworCisgICAgICBpZiAoQ21wX0ZuOjpvcGVyYXRvcigpKG1fYV9hdXhbcl0tPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorCW1ha2VfY2hpbGRfb2YobV9hX2F1eFtyXSwgcF9uZCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIG1ha2VfY2hpbGRfb2YocF9uZCwgbV9hX2F1eFtyXSk7CisKKwkgIHBfbmQgPSBtX2FfYXV4W3JdOworICAgICAgICB9CisKKyAgICAgIG1fYV9hdXhbcl0gPSAwOworCisgICAgICArK3I7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX25kLT5tX21ldGFkYXRhIDwgcmFua19ib3VuZCgpKTsKKworICBtX2FfYXV4W3JdID0gcF9uZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2NoaWxkX29mKG5vZGVfcG9pbnRlciBwX25kLCBub2RlX3BvaW50ZXIgcF9uZXdfcGFyZW50KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF9uZC0+bV9tZXRhZGF0YSA9PSBwX25ld19wYXJlbnQtPm1fbWV0YWRhdGEpOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9hX2F1eFtwX25kLT5tX21ldGFkYXRhXSA9PSBwX25kIHx8CisJCSAgIG1fYV9hdXhbcF9uZC0+bV9tZXRhZGF0YV0gPT0gcF9uZXdfcGFyZW50KTsKKworICArK3BfbmV3X3BhcmVudC0+bV9tZXRhZGF0YTsKKworICBiYXNlX3R5cGU6Om1ha2VfY2hpbGRfb2YocF9uZCwgcF9uZXdfcGFyZW50KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CittYWtlX2Zyb21fYXV4KCkKK3sKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IG1fcF9tYXggPSAwOworCisgIGNvbnN0IHNpemVfdHlwZSBybmtfYm5kID0gcmFua19ib3VuZCgpOworCisgIHNpemVfdHlwZSBpID0gMDsKKworICB3aGlsZSAoaSA8IHJua19ibmQpCisgICAgeworICAgICAgaWYgKG1fYV9hdXhbaV0gIT0gMCkKKyAgICAgICAgeworCSAgbWFrZV9yb290X2FuZF9saW5rKG1fYV9hdXhbaV0pOworCisJICBtX2FfYXV4W2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICArK2k7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X2F1eF9udWxsKCk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CityZW1vdmVfbm9kZShub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgbm9kZV9wb2ludGVyIHBfcGFyZW50ID0gcF9uZDsKKyAgd2hpbGUgKGJhc2VfdHlwZTo6cGFyZW50KHBfcGFyZW50KSAhPSAwKQorICAgIHBfcGFyZW50ID0gYmFzZV90eXBlOjpwYXJlbnQocF9wYXJlbnQpOworCisgIGJhc2VfdHlwZTo6YnViYmxlX3RvX3RvcChwX25kKTsKKworICBtX3BfbWF4ID0gcF9uZDsKKworICBub2RlX3BvaW50ZXIgcF9maXggPSBiYXNlX3R5cGU6Om1fcF9yb290OworICB3aGlsZSAocF9maXggIT0gMCYmICBwX2ZpeC0+bV9wX25leHRfc2libGluZyAhPSBwX3BhcmVudCkKKyAgICBwX2ZpeCA9IHBfZml4LT5tX3BfbmV4dF9zaWJsaW5nOworCisgIGlmIChwX2ZpeCAhPSAwKQorICAgIHBfZml4LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZDsKKworICByZW1vdmVfbWF4X25vZGUoKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitjbGVhcigpCit7CisgIGJhc2VfdHlwZTo6Y2xlYXIoKTsKKworICBtX3BfbWF4ID0gMDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoIWJhc2VfdHlwZTo6ZW1wdHkoKSk7CisKKyAgbm9kZV9wb2ludGVyIHBfbmQgPSBpdC5tX3BfbmQ7CisKKyAgcmVtb3ZlX25vZGUocF9uZCk7CisKKyAgYmFzZV90eXBlOjphY3R1YWxfZXJhc2Vfbm9kZShwX25kKTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBQcmVkPgordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZXJhc2VfaWYoUHJlZCBwcmVkKQoreworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF92YWxpZCgpOykKKworICAgIGlmIChiYXNlX3R5cGU6OmVtcHR5KCkpCisgICAgICB7CisgICAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisJICByZXR1cm4gMDsKKyAgICAgIH0KKworICBiYXNlX3R5cGU6OnRvX2xpbmtlZF9saXN0KCk7CisKKyAgbm9kZV9wb2ludGVyIHBfb3V0ID0gYmFzZV90eXBlOjpwcnVuZShwcmVkKTsKKworICBzaXplX3R5cGUgZXJzZCA9IDA7CisKKyAgd2hpbGUgKHBfb3V0ICE9IDApCisgICAgeworICAgICAgKytlcnNkOworCisgICAgICBub2RlX3BvaW50ZXIgcF9uZXh0ID0gcF9vdXQtPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIGJhc2VfdHlwZTo6YWN0dWFsX2VyYXNlX25vZGUocF9vdXQpOworCisgICAgICBwX291dCA9IHBfbmV4dDsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfY3VyID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICBtX3BfbWF4ID0gYmFzZV90eXBlOjptX3Bfcm9vdCA9IDA7CisKKyAgd2hpbGUgKHBfY3VyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfY3VyLT5tX3BfbmV4dF9zaWJsaW5nOworCisgICAgICBtYWtlX3Jvb3RfYW5kX2xpbmsocF9jdXIpOworCisgICAgICBwX2N1ciA9IHBfbmV4dDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICByZXR1cm4gZXJzZDsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6c2l6ZV90eXBlCitQQl9EU19DTEFTU19DX0RFQzo6CityYW5rX2JvdW5kKCkKK3sKKyAgY29uc3Qgc3RkOjpzaXplX3QqIGNvbnN0IHBfdXBwZXIgPQorICAgIHN0ZDo6dXBwZXJfYm91bmQoICAgICAgICAgICAgZ19hX3JhbmtfYm91bmRzLCBnX2FfcmFua19ib3VuZHMgKyBudW1fZGlzdGluY3RfcmFua19ib3VuZHMsIGJhc2VfdHlwZTo6bV9zaXplKTsKKworICBpZiAocF91cHBlciA9PSBnX2FfcmFua19ib3VuZHMgKyBudW1fZGlzdGluY3RfcmFua19ib3VuZHMpCisgICAgcmV0dXJuIG1heF9yYW5rOworCisgIHJldHVybiAocF91cHBlciAtIGdfYV9yYW5rX2JvdW5kcyk7Cit9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjBhZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9maW5kX2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGZpbmRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X3JlZmVyZW5jZQorUEJfRFNfQ0xBU1NfQ19ERUM6OgordG9wKCkgY29uc3QKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKCFiYXNlX3R5cGU6OmVtcHR5KCkpOworCisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfbWF4ICE9IDApOworICByZXR1cm4gbV9wX21heC0+bV92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU2YWJkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vaW5zZXJ0X2ZuX2ltcHMuaHBwCkBAIC0wLDAgKzEsMzI2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpbnNlcnRfZm5faW1wcy5ocHAKKyAqIENvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGZvciB0aGluX2hlYXBfLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnBvaW50X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitwdXNoKGNvbnN0X3JlZmVyZW5jZSByX3ZhbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisKKyAgICBub2RlX3BvaW50ZXIgcF9uZCA9IGJhc2VfdHlwZTo6Z2V0X25ld19ub2RlX2Zvcl9pbnNlcnQocl92YWwpOworCisgIHBfbmQtPm1fbWV0YWRhdGEgPSAwOworCisgIHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfbmQtPm1fcF9sX2NoaWxkID0gMDsKKworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCA9PSAwKQorICAgIHsKKyAgICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmcgPSAwOworCisgICAgICBtX3BfbWF4ID0gYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgICAgIHJldHVybiBwb2ludF9pdGVyYXRvcihwX25kKTsKKyAgICB9CisKKyAgcF9uZC0+bV9wX25leHRfc2libGluZyA9IGJhc2VfdHlwZTo6bV9wX3Jvb3Q7CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICBiYXNlX3R5cGU6Om1fcF9yb290ID0gcF9uZDsKKworICB1cGRhdGVfbWF4KHBfbmQpOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgcmV0dXJuIHBvaW50X2l0ZXJhdG9yKHBfbmQpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21ha2Vfcm9vdChub2RlX3BvaW50ZXIgcF9uZCkKK3sKKyAgcF9uZC0+bV9tZXRhZGF0YSA9CisgICAgcF9uZC0+bV9wX2xfY2hpbGQgPT0gMD8KKyAgICAwIDoKKyAgICAxICsgcF9uZC0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGE7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorbWFrZV9yb290X2FuZF9saW5rKG5vZGVfcG9pbnRlciBwX25kKQoreworICBtYWtlX3Jvb3QocF9uZCk7CisKKyAgcF9uZC0+bV9wX3ByZXZfb3JfcGFyZW50ID0gMDsKKworICBwX25kLT5tX3BfbmV4dF9zaWJsaW5nID0gYmFzZV90eXBlOjptX3Bfcm9vdDsKKworICBpZiAoYmFzZV90eXBlOjptX3Bfcm9vdCAhPSAwKQorICAgIGJhc2VfdHlwZTo6bV9wX3Jvb3QtPm1fcF9wcmV2X29yX3BhcmVudCA9IDA7CisKKyAgYmFzZV90eXBlOjptX3Bfcm9vdCA9IHBfbmQ7CisKKyAgdXBkYXRlX21heChwX25kKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXgobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgd2hpbGUgKHRydWUpCisgICAgeworICAgICAgaWYgKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ID09IDApCisgICAgICAgIHsKKwkgIGZpeF9yb290KHBfeSk7CisKKwkgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAocF95LT5tX21ldGFkYXRhID09IDEmJiAgcF95LT5tX3BfbmV4dF9zaWJsaW5nID09IDApCisgICAgICAgIHsKKwkgIGlmIChwX3ktPm1fcF9sX2NoaWxkICE9IDApCisgICAgICAgICAgICB7CisJICAgICAgZml4X3NpYmxpbmdfcmFua18xX3VubWFya2VkKHBfeSk7CisKKwkgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKwkgIGZpeF9zaWJsaW5nX3JhbmtfMV9tYXJrZWQocF95KTsKKworCSAgcF95ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHBfeS0+bV9tZXRhZGF0YSA+IHBfeS0+bV9wX25leHRfc2libGluZy0+bV9tZXRhZGF0YSArIDEpCisgICAgICAgIHsKKwkgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9sX2NoaWxkICE9IDApOworCisJICBpZiAocF95LT5tX21ldGFkYXRhICE9IHBfeS0+bV9wX2xfY2hpbGQtPm1fbWV0YWRhdGEgKyAyKQorICAgICAgICAgICAgeworCSAgICAgIGZpeF9zaWJsaW5nX2dlbmVyYWxfdW5tYXJrZWQocF95KTsKKworCSAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworCSAgZml4X3NpYmxpbmdfZ2VuZXJhbF9tYXJrZWQocF95KTsKKworCSAgcF95ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChwX3ktPm1fcF9sX2NoaWxkID09IDAmJiAKKyAgICAgICAgICAgICAgICBwX3ktPm1fbWV0YWRhdGEgPT0gMikgfHwocF95LT5tX3BfbF9jaGlsZCAhPSAwJiYgCisJCQkJCSBwX3ktPm1fbWV0YWRhdGEgPT0gcF95LT5tX3BfbF9jaGlsZC0+bV9tZXRhZGF0YSArIDMpKQorICAgICAgICB7CisJICBub2RlX3BvaW50ZXIgcF96ID0gcF95LT5tX3BfcHJldl9vcl9wYXJlbnQ7CisKKwkgIGZpeF9jaGlsZChwX3kpOworCisJICBwX3kgPSBwX3o7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwlyZXR1cm47CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9yb290KG5vZGVfcG9pbnRlciBwX3kpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwKTsKKworICBtYWtlX3Jvb3QocF95KTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF95LCB0cnVlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9zaWJsaW5nX3JhbmtfMV91bm1hcmtlZChub2RlX3BvaW50ZXIgcF95KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gMCk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShub2RlX3BvaW50ZXIgcF93ID0gcF95LT5tX3BfbF9jaGlsZDspCisgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdyAhPSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdy0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX25leHRfc2libGluZyA9PSAwKTsKKworICBwX3ktPm1fcF9uZXh0X3NpYmxpbmcgPSBwX3ktPm1fcF9sX2NoaWxkOworCisgIHBfeS0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF95OworCisgIHBfeS0+bV9wX2xfY2hpbGQgPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3ksIGZhbHNlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9zaWJsaW5nX3JhbmtfMV9tYXJrZWQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfbF9jaGlsZCA9PSAwKTsKKworICBwX3ktPm1fbWV0YWRhdGEgPSAwOworCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X25vZGVfY29uc2lzdGVudChwX3ksIGZhbHNlKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2ZpeF9zaWJsaW5nX2dlbmVyYWxfdW5tYXJrZWQobm9kZV9wb2ludGVyIHBfeSkKK3sKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeS0+bV9wX3ByZXZfb3JfcGFyZW50ICE9IDApOworCisgIG5vZGVfcG9pbnRlciBwX3cgPSBwX3ktPm1fcF9sX2NoaWxkOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF93ICE9IDApOworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF93LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApOworCisgIHBfeS0+bV9wX2xfY2hpbGQgPSBwX3ctPm1fcF9uZXh0X3NpYmxpbmc7CisgIHBfdy0+bV9wX25leHRfc2libGluZy0+bV9wX3ByZXZfb3JfcGFyZW50ID0gcF95OworCisgIHBfdy0+bV9wX25leHRfc2libGluZyA9IHBfeS0+bV9wX25leHRfc2libGluZzsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfdy0+bV9wX25leHRfc2libGluZyAhPSAwKTsKKyAgcF93LT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3c7CisKKyAgcF95LT5tX3BfbmV4dF9zaWJsaW5nID0gcF93OworICBwX3ctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfeTsKKworICBfR0xJQkNYWF9ERUJVR19PTkxZKGFzc2VydF9ub2RlX2NvbnNpc3RlbnQocF95LCBmYWxzZSk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitmaXhfc2libGluZ19nZW5lcmFsX21hcmtlZChub2RlX3BvaW50ZXIgcF95KQoreworICBfR0xJQkNYWF9ERUJVR19BU1NFUlQocF95LT5tX3BfcHJldl9vcl9wYXJlbnQgIT0gMCk7CisKKyAgLS1wX3ktPm1fbWV0YWRhdGE7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfbm9kZV9jb25zaXN0ZW50KHBfeSwgZmFsc2UpOykKKyAgICB9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZml4X2NoaWxkKG5vZGVfcG9pbnRlciBwX3kpCit7CisgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChwX3ktPm1fcF9wcmV2X29yX3BhcmVudCAhPSAwKTsKKworICBpZiAocF95LT5tX3BfbmV4dF9zaWJsaW5nICE9IDApCisgICAgcF95LT5tX3BfbmV4dF9zaWJsaW5nLT5tX3BfcHJldl9vcl9wYXJlbnQgPSBwX3ktPm1fcF9wcmV2X29yX3BhcmVudDsKKworICBpZiAocF95LT5tX3BfcHJldl9vcl9wYXJlbnQtPm1fcF9sX2NoaWxkID09IHBfeSkKKyAgICBwX3ktPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX2xfY2hpbGQgPSBwX3ktPm1fcF9uZXh0X3NpYmxpbmc7CisgIGVsc2UKKyAgICBwX3ktPm1fcF9wcmV2X29yX3BhcmVudC0+bV9wX25leHRfc2libGluZyA9IHBfeS0+bV9wX25leHRfc2libGluZzsKKworICBtYWtlX3Jvb3RfYW5kX2xpbmsocF95KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3ZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK21vZGlmeShwb2ludF9pdGVyYXRvciBpdCwgY29uc3RfcmVmZXJlbmNlIHJfbmV3X3ZhbCkKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgbm9kZV9wb2ludGVyIHBfbmQgPSBpdC5tX3BfbmQ7CisKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfbmQgIT0gMCk7CisKKyAgY29uc3QgYm9vbCBzbWFsbGVyID0gQ21wX0ZuOjpvcGVyYXRvcigpKHJfbmV3X3ZhbCwgcF9uZC0+bV92YWx1ZSk7CisKKyAgcF9uZC0+bV92YWx1ZSA9IHJfbmV3X3ZhbDsKKworICBpZiAoc21hbGxlcikKKyAgICB7CisgICAgICByZW1vdmVfbm9kZShwX25kKTsKKworICAgICAgcF9uZC0+bV9wX2xfY2hpbGQgPSAwOworCisgICAgICBtYWtlX3Jvb3RfYW5kX2xpbmsocF9uZCk7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudCA9PSAwKQorICAgIHsKKyAgICAgIHVwZGF0ZV9tYXgocF9uZCk7CisKKyAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgbm9kZV9wb2ludGVyIHBfeSA9IHBfbmQtPm1fcF9wcmV2X29yX3BhcmVudDsKKyAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKHBfeSAhPSAwKTsKKworICBpZiAocF9uZC0+bV9wX25leHRfc2libGluZyAhPSAwKQorICAgIHBfbmQtPm1fcF9uZXh0X3NpYmxpbmctPm1fcF9wcmV2X29yX3BhcmVudCA9IHBfeTsKKworICBpZiAocF95LT5tX3BfbF9jaGlsZCA9PSBwX25kKQorICAgIHBfeS0+bV9wX2xfY2hpbGQgPSBwX25kLT5tX3BfbmV4dF9zaWJsaW5nOworICBlbHNlCisgICAgcF95LT5tX3BfbmV4dF9zaWJsaW5nID0gcF9uZC0+bV9wX25leHRfc2libGluZzsKKworICBmaXgocF95KTsKKworICBtYWtlX3Jvb3RfYW5kX2xpbmsocF9uZCk7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3VwZGF0ZV9tYXgobm9kZV9wb2ludGVyIHBfbmQpCit7CisgIGlmIChtX3BfbWF4ID09IDAgfHwgQ21wX0ZuOjpvcGVyYXRvcigpKG1fcF9tYXgtPm1fdmFsdWUsIHBfbmQtPm1fdmFsdWUpKQorICAgIG1fcF9tYXggPSBwX25kOworfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9zcGxpdF9qb2luX2ZuX2ltcHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vc3BsaXRfam9pbl9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDEyNiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgc3BsaXRfam9pbl9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoaW5faGVhcF8uCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK3RlbXBsYXRlPHR5cGVuYW1lIFByZWQ+Cit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisKKyAgICBvdGhlci5jbGVhcigpOworCisgIGlmIChiYXNlX3R5cGU6OmVtcHR5KCkpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgYmFzZV90eXBlOjp0b19saW5rZWRfbGlzdCgpOworCisgIG5vZGVfcG9pbnRlciBwX291dCA9IGJhc2VfdHlwZTo6cHJ1bmUocHJlZCk7CisKKyAgd2hpbGUgKHBfb3V0ICE9IDApCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKGJhc2VfdHlwZTo6bV9zaXplID4gMCk7CisgICAgICAtLWJhc2VfdHlwZTo6bV9zaXplOworCisgICAgICArK290aGVyLm1fc2l6ZTsKKworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3V0LT5tX3BfbmV4dF9zaWJsaW5nOworCisgICAgICBvdGhlci5tYWtlX3Jvb3RfYW5kX2xpbmsocF9vdXQpOworCisgICAgICBwX291dCA9IHBfbmV4dDsKKyAgICB9CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisKKyAgICBub2RlX3BvaW50ZXIgcF9jdXIgPSBiYXNlX3R5cGU6Om1fcF9yb290OworCisgIG1fcF9tYXggPSAwOworCisgIGJhc2VfdHlwZTo6bV9wX3Jvb3QgPSAwOworCisgIHdoaWxlIChwX2N1ciAhPSAwKQorICAgIHsKKyAgICAgIG5vZGVfcG9pbnRlciBwX25leHQgPSBwX2N1ci0+bV9wX25leHRfc2libGluZzsKKworICAgICAgbWFrZV9yb290X2FuZF9saW5rKHBfY3VyKTsKKworICAgICAgcF9jdXIgPSBwX25leHQ7CisgICAgfQorCisgIF9HTElCQ1hYX0RFQlVHX09OTFkoYXNzZXJ0X3ZhbGlkKCk7KQorICAgIF9HTElCQ1hYX0RFQlVHX09OTFkob3RoZXIuYXNzZXJ0X3ZhbGlkKCk7KQorICAgIH0KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Citqb2luKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcikKK3sKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisKKyAgICBub2RlX3BvaW50ZXIgcF9vdGhlciA9IG90aGVyLm1fcF9yb290OworCisgIHdoaWxlIChwX290aGVyICE9IDApCisgICAgeworICAgICAgbm9kZV9wb2ludGVyIHBfbmV4dCA9IHBfb3RoZXItPm1fcF9uZXh0X3NpYmxpbmc7CisKKyAgICAgIG1ha2Vfcm9vdF9hbmRfbGluayhwX290aGVyKTsKKworICAgICAgcF9vdGhlciA9IHBfbmV4dDsKKyAgICB9CisKKyAgYmFzZV90eXBlOjptX3NpemUgKz0gb3RoZXIubV9zaXplOworCisgIG90aGVyLm1fcF9yb290ID0gMDsKKyAgb3RoZXIubV9zaXplID0gMDsKKyAgb3RoZXIubV9wX21heCA9IDA7CisKKyAgX0dMSUJDWFhfREVCVUdfT05MWShhc3NlcnRfdmFsaWQoKTspCisgICAgX0dMSUJDWFhfREVCVUdfT05MWShvdGhlci5hc3NlcnRfdmFsaWQoKTspCisgICAgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdGhpbl9oZWFwXy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90aGluX2hlYXBfLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGZhMDRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdGhpbl9oZWFwXy5ocHAKQEAgLTAsMCArMSwzNTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHRoaW5faGVhcF8uaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgYSB0aGluIGhlYXAuCisgKi8KKworI2lmbmRlZiBQQl9EU19USElOX0hFQVBfSFBQCisjZGVmaW5lIFBCX0RTX1RISU5fSEVBUF9IUFAKKworLyoKKyAqIFRoaW4gaGVhcHMuCisgKiBUYXJqYW4gYW5kIEthcGxhbi4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvY29uZF9kZWFsdG9yLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8uaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF8vbnVsbF9tZXRhZGF0YS5ocHA+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgbmFtZXNwYWNlIGRldGFpbAorICB7CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlX1R5cGUsIGNsYXNzIENtcF9GbiwgY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgICB0aGluX2hlYXBfPFZhbHVlX1R5cGUsIENtcF9GbiwgQWxsb2NhdG9yPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQyBcCisgICAgbGVmdF9jaGlsZF9uZXh0X3NpYmxpbmdfaGVhcF88VmFsdWVfVHlwZSwgQ21wX0ZuLAlcCisJCQkgICAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlLCBBbGxvY2F0b3IsIHRydWU+CisjZWxzZSAKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQwkJCQkJCVwKKyAgICBsZWZ0X2NoaWxkX25leHRfc2libGluZ19oZWFwXzxWYWx1ZV9UeXBlLCBDbXBfRm4sIFwKKwkJCQkgIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlLCBBbGxvY2F0b3I+CisjZW5kaWYgCisKKyAgICAvKioKKyAgICAgKiBjbGFzcyBkZXNjcmlwdGlvbiA9ICJ0fC18aXxcfCBoMzRwIj4KKyAgICAgKiovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgdGhpbl9oZWFwXyA6IHB1YmxpYyBQQl9EU19CQVNFX0NfREVDCisgICAgeworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZSBub2RlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6bm9kZV9wb2ludGVyIG5vZGVfcG9pbnRlcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X25vZGVfcG9pbnRlciBjb25zdF9ub2RlX3BvaW50ZXI7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPAorCXZhbHVlX3R5cGU+OjpvdGhlcjo6cG9pbnRlcgorICAgICAgcG9pbnRlcjsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisJdmFsdWVfdHlwZT46Om90aGVyOjpjb25zdF9wb2ludGVyCisgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OnJlZmVyZW5jZQorICAgICAgcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDwKKwl2YWx1ZV90eXBlPjo6b3RoZXI6OmNvbnN0X3JlZmVyZW5jZQorICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjpjb25zdF9wb2ludF9pdGVyYXRvcgorICAgICAgY29uc3RfcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6cG9pbnRfaXRlcmF0b3IgcG9pbnRfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6aXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgQ21wX0ZuIGNtcF9mbjsKKworICAgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisKKyAgICBwdWJsaWM6CisKKyAgICAgIGlubGluZSBwb2ludF9pdGVyYXRvcgorICAgICAgcHVzaChjb25zdF9yZWZlcmVuY2Ugcl92YWwpOworCisgICAgICB2b2lkCisgICAgICBtb2RpZnkocG9pbnRfaXRlcmF0b3IgaXQsIGNvbnN0X3JlZmVyZW5jZSByX25ld192YWwpOworCisgICAgICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgICAgICB0b3AoKSBjb25zdDsKKworICAgICAgdm9pZAorICAgICAgcG9wKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHBvaW50X2l0ZXJhdG9yIGl0KTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlX2lmKFByZWQgcHJlZCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFByZWQ+CisgICAgICB2b2lkCisgICAgICBzcGxpdChQcmVkIHByZWQsIFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGpvaW4oUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgIHByb3RlY3RlZDoKKworICAgICAgdGhpbl9oZWFwXygpOworCisgICAgICB0aGluX2hlYXBfKGNvbnN0IENtcF9GbiYgcl9jbXBfZm4pOworCisgICAgICB0aGluX2hlYXBfKGNvbnN0IFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgICAgfnRoaW5faGVhcF8oKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSXQ+CisgICAgICB2b2lkCisgICAgICBjb3B5X2Zyb21fcmFuZ2UoSXQgZmlyc3RfaXQsIEl0IGxhc3RfaXQpOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF92YWxpZCgpIGNvbnN0OworCisgICAgICB2b2lkCisgICAgICBhc3NlcnRfbWF4KCkgY29uc3Q7CisjZW5kaWYgCisKKyNpZmRlZiBQQl9EU19USElOX0hFQVBfVFJBQ0VfCisgICAgICB2b2lkCisgICAgICB0cmFjZSgpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIGVudW0KKwl7CisJICBtYXhfcmFuayA9IChzaXplb2Yoc2l6ZV90eXBlKSA8PCA0KSArIDIKKwl9OworCisgICAgcHJpdmF0ZToKKworICAgICAgdm9pZAorICAgICAgaW5pdGlhbGl6ZSgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgdXBkYXRlX21heChub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXgobm9kZV9wb2ludGVyIHBfbmQpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZml4X3Jvb3Qobm9kZV9wb2ludGVyIHBfeSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfc2libGluZ19yYW5rXzFfdW5tYXJrZWQobm9kZV9wb2ludGVyIHBfeSk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBmaXhfc2libGluZ19yYW5rXzFfbWFya2VkKG5vZGVfcG9pbnRlciBwX3kpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZml4X3NpYmxpbmdfZ2VuZXJhbF91bm1hcmtlZChub2RlX3BvaW50ZXIgcF95KTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIGZpeF9zaWJsaW5nX2dlbmVyYWxfbWFya2VkKG5vZGVfcG9pbnRlciBwX3kpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgZml4X2NoaWxkKG5vZGVfcG9pbnRlciBwX3kpOworCisgICAgICBpbmxpbmUgc3RhdGljIHZvaWQKKyAgICAgIG1ha2Vfcm9vdChub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBtYWtlX3Jvb3RfYW5kX2xpbmsobm9kZV9wb2ludGVyIHBfbmQpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgcmVtb3ZlX21heF9ub2RlKCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHRvX2F1eF9leGNlcHRfbWF4KCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICBhZGRfdG9fYXV4KG5vZGVfcG9pbnRlciBwX25kKTsKKworICAgICAgaW5saW5lIHZvaWQKKyAgICAgIG1ha2VfZnJvbV9hdXgoKTsKKworICAgICAgaW5saW5lIHNpemVfdHlwZQorICAgICAgcmFua19ib3VuZCgpOworCisgICAgICBpbmxpbmUgdm9pZAorICAgICAgbWFrZV9jaGlsZF9vZihub2RlX3BvaW50ZXIgcF9uZCwgbm9kZV9wb2ludGVyIHBfbmV3X3BhcmVudCk7CisKKyAgICAgIGlubGluZSB2b2lkCisgICAgICByZW1vdmVfbm9kZShub2RlX3BvaW50ZXIgcF9uZCk7CisKKyAgICAgIGlubGluZSBub2RlX3BvaW50ZXIKKyAgICAgIGpvaW4obm9kZV9wb2ludGVyIHBfbGhzLCBub2RlX3BvaW50ZXIgcF9yaHMpIGNvbnN0OworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9ub2RlX2NvbnNpc3RlbnQoY29uc3Rfbm9kZV9wb2ludGVyIHBfbmQsIGJvb2wgcm9vdCkgY29uc3Q7CisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2VydF9hdXhfbnVsbCgpIGNvbnN0OworI2VuZGlmIAorCisgICAgcHJpdmF0ZToKKyAgICAgIG5vZGVfcG9pbnRlciBtX3BfbWF4OworCisgICAgICBub2RlX3BvaW50ZXIgbV9hX2F1eFttYXhfcmFua107CisgICAgfTsKKworICAgIGVudW0KKyAgICAgIHsKKwludW1fZGlzdGluY3RfcmFua19ib3VuZHMgPSA0OAorICAgICAgfTsKKworICAgIC8vIFRha2VuIGZyb20gdGhlIFNHSSBpbXBsZW1lbnRhdGlvbjsgYWNrbm93bGVkZ2VkIGluIHRoZSBkb2NzLgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBnX2FfcmFua19ib3VuZHNbbnVtX2Rpc3RpbmN0X3JhbmtfYm91bmRzXSA9CisgICAgICB7CisJLyogRGVhbGluZyBjYXJkcy4uLiAqLworCS8qIDAgICAgICovIDB1bCwKKwkvKiAxICAgICAqLyAxdWwsCisJLyogMiAgICAgKi8gMXVsLAorCS8qIDMgICAgICovIDJ1bCwKKwkvKiA0ICAgICAqLyA0dWwsCisJLyogNSAgICAgKi8gNnVsLAorCS8qIDYgICAgICovIDExdWwsCisJLyogNyAgICAgKi8gMTd1bCwKKwkvKiA4ICAgICAqLyAyOXVsLAorCS8qIDkgICAgICovIDQ2dWwsCisJLyogMTAgICAgKi8gNzZ1bCwKKwkvKiAxMSAgICAqLyAxMjJ1bCwKKwkvKiAxMiAgICAqLyAxOTl1bCwKKwkvKiAxMyAgICAqLyAzMjF1bCwKKwkvKiAxNCAgICAqLyA1MjF1bCwKKwkvKiAxNSAgICAqLyA4NDJ1bCwKKwkvKiAxNiAgICAqLyAxMzY0dWwsCisJLyogMTcgICAgKi8gMjIwNnVsLAorCS8qIDE4ICAgICovIDM1NzF1bCwKKwkvKiAxOSAgICAqLyA1Nzc3dWwsCisJLyogMjAgICAgKi8gOTM0OXVsLAorCS8qIDIxICAgICovIDE1MTI2dWwsCisJLyogMjIgICAgKi8gMjQ0NzZ1bCwKKwkvKiAyMyAgICAqLyAzOTYwMnVsLAorCS8qIDI0ICAgICovIDY0MDc5dWwsCisJLyogMjUgICAgKi8gMTAzNjgxdWwsCisJLyogMjYgICAgKi8gMTY3NzYxdWwsCisJLyogMjcgICAgKi8gMjcxNDQydWwsCisJLyogMjggICAgKi8gNDM5MjA0dWwsCisJLyogMjkgICAgKi8gNzEwNjQ2dWwsCisJLyogMzAgICAgKi8gMTE0OTg1MXVsLAorCS8qIDMxICAgICovIDE4NjA0OTd1bCwKKwkvKiAzMiAgICAqLyAzMDEwMzQ5dWwsCisJLyogMzMgICAgKi8gNDg3MDg0NnVsLAorCS8qIDM0ICAgICovIDc4ODExOTZ1bCwKKwkvKiAzNSAgICAqLyAxMjc1MjA0MnVsLAorCS8qIDM2ICAgICovIDIwNjMzMjM5dWwsCisJLyogMzcgICAgKi8gMzMzODUyODJ1bCwKKwkvKiAzOCAgICAqLyA1NDAxODUyMXVsLAorCS8qIDM5ICAgICovIDg3NDAzODAzdWwsCisJLyogNDAgICAgKi8gMTQxNDIyMzI0dWwsCisJLyogNDEgICAgKi8gMjI4ODI2MTI3dWwsCisJLyogNDIgICAgKi8gMzcwMjQ4NDUxdWwsCisJLyogNDMgICAgKi8gNTk5MDc0NTc4dWwsCisJLyogNDQgICAgKi8gOTY5MzIzMDI5dWwsCisJLyogNDUgICAgKi8gMTU2ODM5NzYwN3VsLAorCS8qIDQ2ICAgICovIDI1Mzc3MjA2MzZ1bCwKKwkvKiA0NyAgICAqLyA0MTA2MTE4MjQzdWwKKwkvKiBQb3QncyBnb29kLCBsZXQncyBwbGF5ICovCisgICAgICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2NvbnN0cnVjdG9yc19kZXN0cnVjdG9yX2ZuX2ltcHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy9kZWJ1Z19mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vdHJhY2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2ZpbmRfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL2luc2VydF9mbl9pbXBzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RoaW5faGVhcF8vZXJhc2VfZm5faW1wcy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3NwbGl0X2pvaW5fZm5faW1wcy5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQkFTRV9DX0RFQworCisgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90aGluX2hlYXBfL3RyYWNlX2ZuX2ltcHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzA5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdGhpbl9oZWFwXy90cmFjZV9mbl9pbXBzLmhwcApAQCAtMCwwICsxLDU1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmFjZV9mbl9pbXBzLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGxlZnRfY2hpbGRfbmV4dF9zaWJsaW5nX2hlYXBfLgorICovCisKKyNpZmRlZiBQQl9EU19USElOX0hFQVBfVFJBQ0VfCisKK1BCX0RTX0NMQVNTX1RfREVDCit2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6Cit0cmFjZSgpIGNvbnN0Cit7CisgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpjZXJyIDw8ICJtX3BfbWF4ICIgPDwgbV9wX21heCA8PCBzdGQ6OmVuZGw7CisKKyAgYmFzZV90eXBlOjp0cmFjZSgpOworfQorCisjZW5kaWYgLy8gI2lmZGVmIFBCX0RTX1RISU5fSEVBUF9UUkFDRV8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9ub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTgyODg2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwCkBAIC0wLDAgKzEsMTE2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBub2RlX21ldGFkYXRhX3NlbGVjdG9yLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRyZWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJFRV9OT0RFX01FVEFEQVRBX1NFTEVDVE9SX0hQUAorI2RlZmluZSBQQl9EU19UUkVFX05PREVfTUVUQURBVEFfU0VMRUNUT1JfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L251bGxfbm9kZV9tZXRhZGF0YS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlc190cmFpdHMuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlLCBib29sIE51bGw+CisgICAgc3RydWN0IHRyZWVfbWV0YWRhdGFfaGVscGVyCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBOb2RlX1VwZGF0ZTo6bWV0YWRhdGFfdHlwZSB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBOb2RlX1VwZGF0ZT4KKyAgICBzdHJ1Y3QgdHJlZV9tZXRhZGF0YV9oZWxwZXI8CisgICAgICBOb2RlX1VwZGF0ZSwKKyAgICAgIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBudWxsX25vZGVfbWV0YWRhdGEgdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgS2V5LAorCSAgICAgdHlwZW5hbWUgRGF0YSwKKwkgICAgIGNsYXNzIENtcF9GbiwKKwkgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIENvbnN0X0l0ZXJhdG9yLAorCQkgICAgICBjbGFzcyBDbXBfRm5fLAorCQkgICAgICBjbGFzcyBBbGxvY2F0b3JfPgorICAgIGNsYXNzIE5vZGVfVXBkYXRlLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIHN0cnVjdCB0cmVlX25vZGVfbWV0YWRhdGFfc2VsZWN0b3IKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIGR1bWNvbnN0X25vZGVfaXRlcmF0b3I8CisgICAgICBLZXksCisgICAgICBEYXRhLAorICAgICAgQWxsb2NhdG9yPgorICAgICAgZHVtY29uc3Rfbm9kZV9pdDsKKworICAgICAgZW51bQorCXsKKwkgIG51bGxfdXBkYXRlID0KKwkgIGlzX3NhbWU8CisJICBOb2RlX1VwZGF0ZTwKKwkgIGR1bWNvbnN0X25vZGVfaXQsCisJICBkdW1jb25zdF9ub2RlX2l0LAorCSAgQ21wX0ZuLAorCSAgQWxsb2NhdG9yPiwKKwkgIG51bGxfdHJlZV9ub2RlX3VwZGF0ZTwKKwkgIGR1bWNvbnN0X25vZGVfaXQsCisJICBkdW1jb25zdF9ub2RlX2l0LAorCSAgQ21wX0ZuLAorCSAgQWxsb2NhdG9yPiA+Ojp2YWx1ZQorCX07CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSB0cmVlX21ldGFkYXRhX2hlbHBlcjwKKyAgICAgIE5vZGVfVXBkYXRlPAorICAgICAgZHVtY29uc3Rfbm9kZV9pdCwKKyAgICAgIGR1bWNvbnN0X25vZGVfaXQsCisgICAgICBDbXBfRm4sCisgICAgICBBbGxvY2F0b3I+LAorICAgICAgbnVsbF91cGRhdGU+Ojp0eXBlCisgICAgICB0eXBlOworICAgIH07CisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1RSRUVfTk9ERV9NRVRBREFUQV9TRUxFQ1RPUl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmVlX3BvbGljeS9udWxsX25vZGVfdXBkYXRlX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvbnVsbF9ub2RlX3VwZGF0ZV9pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmEzZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvbnVsbF9ub2RlX3VwZGF0ZV9pbXAuaHBwCkBAIC0wLDAgKzEsNTAgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG51bGxfbm9kZV91cGRhdGVfaW1wLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgbnVsbF9ub2RlX3VwZGF0ZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQwordGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvcl8sCisJIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3JfLAorCSBjbGFzcyAgICBDbXBfRm5fLAorCSB0eXBlbmFtZSBBbGxvY2F0b3JfPgoraW5saW5lIHZvaWQKK1BCX0RTX0NMQVNTX0NfREVDOjoKK3N3YXAobnVsbF90cmVlX25vZGVfdXBkYXRlPCAgICAgICAgICAgIENvbnN0X05vZGVfSXRlcmF0b3JfLCBOb2RlX0l0ZXJhdG9yXywgQ21wX0ZuXywgQWxsb2NhdG9yXz4mIC8qb3RoZXIqLykKK3sgfQorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMzNzY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L29yZGVyX3N0YXRpc3RpY3NfaW1wLmhwcApAQCAtMCwwICsxLDE0MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCisgKiBDb250YWlucyBmb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3Igb3JkZXJfc3RhdGlzdGljc19rZXkKKyAqLworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZmluZF9ieV9vcmRlcihzaXplX3R5cGUgb3JkZXIpCit7CisgIG5vZGVfaXRlcmF0b3IgaXQgPSBub2RlX2JlZ2luKCk7CisKKyAgbm9kZV9pdGVyYXRvciBlbmRfaXQgPSBub2RlX2VuZCgpOworCisgIHdoaWxlIChpdCAhPSBlbmRfaXQpCisgICAgeworICAgICAgbm9kZV9pdGVyYXRvciBsX2l0ID0gaXQuZ2V0X2xfY2hpbGQoKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIG8gPSAobF9pdCA9PSBlbmRfaXQpPworCTAgOgorCWxfaXQuZ2V0X21ldGFkYXRhKCk7CisKKyAgICAgIGlmIChvcmRlciA9PSBvKQorCXJldHVybiAoKml0KTsKKyAgICAgIGVsc2UgaWYgKG9yZGVyIDwgbykKKwlpdCA9IGxfaXQ7CisgICAgICBlbHNlCisgICAgICAgIHsKKwkgIG9yZGVyIC09IG8gKyAxOworCisJICBpdCA9IGl0LmdldF9yX2NoaWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIChQQl9EU19CQVNFX0NfREVDOjplbmRfaXRlcmF0b3IoKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2J5X29yZGVyKHNpemVfdHlwZSBvcmRlcikgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5maW5kX2J5X29yZGVyKG9yZGVyKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3JkZXJfb2Zfa2V5KGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIGNvbnN0X25vZGVfaXRlcmF0b3IgaXQgPSBub2RlX2JlZ2luKCk7CisKKyAgY29uc3Rfbm9kZV9pdGVyYXRvciBlbmRfaXQgPSBub2RlX2VuZCgpOworCisgIGNvbnN0IGNtcF9mbiYgcl9jbXBfZm4gPQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmdldF9jbXBfZm4oKTsKKworICBzaXplX3R5cGUgb3JkID0gMDsKKworICB3aGlsZSAoaXQgIT0gZW5kX2l0KQorICAgIHsKKyAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3IgbF9pdCA9IGl0LmdldF9sX2NoaWxkKCk7CisKKyAgICAgIGlmIChyX2NtcF9mbihyX2tleSwgZXh0cmFjdF9rZXkoKigqaXQpKSkpCisJaXQgPSBsX2l0OworICAgICAgZWxzZSBpZiAocl9jbXBfZm4oZXh0cmFjdF9rZXkoKigqaXQpKSwgcl9rZXkpKQorICAgICAgICB7CisKKwkgIG9yZCArPSAobF9pdCA9PSBlbmRfaXQpPworCSAgICAxIDoKKwkgICAgMSArIGxfaXQuZ2V0X21ldGFkYXRhKCk7CisKKwkgIGl0ID0gaXQuZ2V0X3JfY2hpbGQoKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisJICBvcmQgKz0gKGxfaXQgPT0gZW5kX2l0KT8KKwkgICAgMCA6CisJICAgIGxfaXQuZ2V0X21ldGFkYXRhKCk7CisKKwkgIGl0ID0gZW5kX2l0OworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAob3JkKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3Igbm9kZV9pdCwgY29uc3Rfbm9kZV9pdGVyYXRvciBlbmRfbmRfaXQpIGNvbnN0Cit7CisgIG5vZGVfaXRlcmF0b3IgbF9jaGlsZF9pdCA9IG5vZGVfaXQuZ2V0X2xfY2hpbGQoKTsKKyAgY29uc3Qgc2l6ZV90eXBlIGxfcmFuayA9KGxfY2hpbGRfaXQgPT0gZW5kX25kX2l0KT8gMCA6IGxfY2hpbGRfaXQuZ2V0X21ldGFkYXRhKCk7CisKKyAgbm9kZV9pdGVyYXRvciByX2NoaWxkX2l0ID0gbm9kZV9pdC5nZXRfcl9jaGlsZCgpOworICBjb25zdCBzaXplX3R5cGUgcl9yYW5rID0ocl9jaGlsZF9pdCA9PSBlbmRfbmRfaXQpPyAwIDogcl9jaGlsZF9pdC5nZXRfbWV0YWRhdGEoKTsKKworICBjb25zdF9jYXN0PG1ldGFkYXRhX3JlZmVyZW5jZT4obm9kZV9pdC5nZXRfbWV0YWRhdGEoKSk9CisgICAgMSArIGxfcmFuayArIHJfcmFuazsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK1BCX0RTX0NMQVNTX0NfREVDOjoKK350cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUoKQoreyB9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvc2FtcGxlX3RyZWVfbm9kZV91cGRhdGUuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L3NhbXBsZV90cmVlX25vZGVfdXBkYXRlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGMxOWE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyZWVfcG9saWN5L3NhbXBsZV90cmVlX25vZGVfdXBkYXRlLmhwcApAQCAtMCwwICsxLDcyIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBzYW1wbGVfdHJlZV9ub2RlX3VwZGF0ZS5ocHAKKyAqIENvbnRhaW5zIGEgc2FtbGUgbm9kZSB1cGRhdGUgZnVuY3Rvci4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUkVFX05PREVfVVBEQVRPUl9IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1RSRUVfTk9ERV9VUERBVE9SX0hQUAorCisvLyBBIHNhbXBsZSBub2RlIHVwZGF0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCisJIGNsYXNzIE5vZGVfSXRlcmF0b3IsCisKKwkgY2xhc3MgQ21wX0ZuLAorCisJIGNsYXNzIEFsbG9jYXRvcgorCSA+CitjbGFzcyBzYW1wbGVfdHJlZV9ub2RlX3VwZGF0ZQoreworCitwdWJsaWM6CisKKyAgLy8gTWV0YWRhdGEgdHlwZS4KKyAgdHlwZWRlZiBzdGQ6OnNpemVfdCBtZXRhZGF0YV90eXBlOworCitwcm90ZWN0ZWQ6CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgc2FtcGxlX3RyZWVfbm9kZV91cGRhdGUoKTsKKworICAvLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OyBlbmRfbmRfaXQgaXMgdGhlIGVuZCBub2RlIGl0ZXJhdG9yLgorICBpbmxpbmUgdm9pZAorICBvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3Igbm9kZV9pdCwgY29uc3Rfbm9kZV9pdGVyYXRvciBlbmRfbmRfaXQpIGNvbnN0OworCit9OworCisjZW5kaWYgLy8gI2lmbmRlZiBQQl9EU19TQU1QTEVfVFJFRV9OT0RFX1VQREFUT1JfSFBQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmVlX3RyYWNlX2Jhc2UuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YmQ2NTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJlZV90cmFjZV9iYXNlLmhwcApAQCAtMCwwICsxLDIwOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJlZV90cmFjZV9iYXNlLmhwcAorICogQ29udGFpbnMgdHJlZS1yZWxhdGVkIHBvbGljaWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFJFRV9UUkFDRV9CQVNFX0hQUAorI2RlZmluZSBQQl9EU19UUkVFX1RSQUNFX0JBU0VfSFBQCisKKyNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L2Jhc2ljX3RyZWVfcG9saWN5X2Jhc2UuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2lmZGVmIFBCX0RTX1RSRUVfVFJBQ0UKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQwkJCQkJCVwKKyAgICB0ZW1wbGF0ZTwJCQkJCQkJCVwKKwkJCQkJCWNsYXNzIENvbnN0X05vZGVfSXRlcmF0b3IsIFwKKwkJCQkJCWNsYXNzIE5vZGVfSXRlcmF0b3IsCVwKKwkJCQkJCWNsYXNzIENtcF9GbiwJCVwKKwkJCQkJCWJvb2wgTm9kZV9CYXNlZCwJXAorCQkJCQkJY2xhc3MgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQkJXAorICAgIHRyZWVfdHJhY2VfYmFzZTwJCQkJCQkJXAorCQkJCQkJQ29uc3RfTm9kZV9JdGVyYXRvciwJXAorCQkJCQkJTm9kZV9JdGVyYXRvciwJCVwKKwkJCQkJCUNtcF9GbiwJCQlcCisJCQkJCQlOb2RlX0Jhc2VkLAkJXAorCQkJCQkJQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0JBU0VfQ19ERUMJCQkJCQlcCisgICAgYmFzaWNfdHJlZV9wb2xpY3lfYmFzZTwJCQkJXAorCQkJCQkJCQlDb25zdF9Ob2RlX0l0ZXJhdG9yLCBcCisJCQkJCQkJCU5vZGVfSXRlcmF0b3IsIFwKKwkJCQkJCQkJQWxsb2NhdG9yPgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkgICAgIGNsYXNzIE5vZGVfSXRlcmF0b3IsCisJICAgICBjbGFzcyBDbXBfRm4sCisJICAgICBib29sIE5vZGVfQmFzZWQsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgY2xhc3MgdHJlZV90cmFjZV9iYXNlIDogcHJpdmF0ZSBQQl9EU19CQVNFX0NfREVDCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBQQl9EU19CQVNFX0NfREVDIGJhc2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBDb25zdF9Ob2RlX0l0ZXJhdG9yIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGUgc2l6ZV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIHRyYWNlX25vZGUoY29uc3Rfbm9kZV9pdGVyYXRvciBuZF9pdCwgc2l6ZV90eXBlIGxldmVsKSBjb25zdDsKKworICAgICAgdmlydHVhbCBib29sCisgICAgICBlbXB0eSgpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBjb25zdF9ub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIGNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCkgY29uc3QgPSAwOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgcHJpbnRfbm9kZV9wb2ludGVyKENvbnN0X05vZGVfSXRlcmF0b3IgbmRfaXQsIGludGVncmFsX2NvbnN0YW50PGludCx0cnVlPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBwcmludF9ub2RlX3BvaW50ZXIoQ29uc3RfTm9kZV9JdGVyYXRvciBuZF9pdCwgaW50ZWdyYWxfY29uc3RhbnQ8aW50LGZhbHNlPik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhXz4KKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9pdF9tZXRhZGF0YShDb25zdF9Ob2RlX0l0ZXJhdG9yIG5kX2l0LCB0eXBlX3RvX3R5cGU8TWV0YWRhdGFfPik7CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICB0cmFjZV9pdF9tZXRhZGF0YShDb25zdF9Ob2RlX0l0ZXJhdG9yLCB0eXBlX3RvX3R5cGU8bnVsbF9ub2RlX21ldGFkYXRhPik7CisgICAgfTsKKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZSgpIGNvbnN0CisgICAgeworICAgICAgaWYgKGVtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgICAgdHJhY2Vfbm9kZShub2RlX2JlZ2luKCksIDApOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZV9ub2RlKGNvbnN0X25vZGVfaXRlcmF0b3IgbmRfaXQsIHNpemVfdHlwZSBsZXZlbCkgY29uc3QKKyAgICB7CisgICAgICBpZiAobmRfaXQuZ2V0X3JfY2hpbGQoKSAhPSBub2RlX2VuZCgpKQorICAgICAgICB0cmFjZV9ub2RlKG5kX2l0LmdldF9yX2NoaWxkKCksIGxldmVsICsgMSk7CisKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKKyAgICAgICAgc3RkOjpjZXJyIDw8ICcgJzsKKworICAgICAgcHJpbnRfbm9kZV9wb2ludGVyKG5kX2l0LCBpbnRlZ3JhbF9jb25zdGFudDxpbnQsTm9kZV9CYXNlZD4oKSk7CisgICAgICBzdGQ6OmNlcnIgPDwgYmFzZV90eXBlOjpleHRyYWN0X2tleSgqKCpuZF9pdCkpOworCisgICAgICB0eXBlZGVmCisgICAgICAgIHR5cGVfdG9fdHlwZTwKKwl0eXBlbmFtZSBjb25zdF9ub2RlX2l0ZXJhdG9yOjptZXRhZGF0YV90eXBlPgorICAgICAgICBtX3R5cGVfaW5kX3Q7CisKKyAgICAgIHRyYWNlX2l0X21ldGFkYXRhKG5kX2l0LCBtX3R5cGVfaW5kX3QoKSk7CisKKyAgICAgIHN0ZDo6Y2VyciA8PCBzdGQ6OmVuZGw7CisKKyAgICAgIGlmIChuZF9pdC5nZXRfbF9jaGlsZCgpICE9IG5vZGVfZW5kKCkpCisgICAgICAgIHRyYWNlX25vZGUobmRfaXQuZ2V0X2xfY2hpbGQoKSwgbGV2ZWwgKyAxKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGFkYXRhXz4KKyAgICB2b2lkCisgICAgUEJfRFNfQ0xBU1NfQ19ERUM6OgorICAgIHRyYWNlX2l0X21ldGFkYXRhKENvbnN0X05vZGVfSXRlcmF0b3IgbmRfaXQsIHR5cGVfdG9fdHlwZTxNZXRhZGF0YV8+KQorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiICgiIDw8CisgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG5kX2l0LmdldF9tZXRhZGF0YSgpKSA8PCAiKSAiOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICB0cmFjZV9pdF9tZXRhZGF0YShDb25zdF9Ob2RlX0l0ZXJhdG9yLCB0eXBlX3RvX3R5cGU8bnVsbF9ub2RlX21ldGFkYXRhPikKKyAgICB7IH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBwcmludF9ub2RlX3BvaW50ZXIoQ29uc3RfTm9kZV9JdGVyYXRvciBuZF9pdCwgaW50ZWdyYWxfY29uc3RhbnQ8aW50LHRydWU+KQorICAgIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBuZF9pdC5tX3BfbmQgPDwgIiAiOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgdm9pZAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBwcmludF9ub2RlX3BvaW50ZXIoQ29uc3RfTm9kZV9JdGVyYXRvciBuZF9pdCwgaW50ZWdyYWxfY29uc3RhbnQ8aW50LGZhbHNlPikKKyAgICB7CisgICAgICBzdGQ6OmNlcnIgPDwqIG5kX2l0IDw8ICIgIjsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworI2VuZGlmIC8vICNpZmRlZiAgICBQQl9EU19UUkVFX1RSQUNFCisKKyAgfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZmRlZiBQQl9EU19UUkVFX1RSQUNFCisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1RSRUVfVFJBQ0VfQkFTRV9IUFAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L25vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzMWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvbm9kZV9tZXRhZGF0YV9zZWxlY3Rvci5ocHAKQEAgLTAsMCArMSwxMTYgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIG5vZGVfbWV0YWRhdGFfc2VsZWN0b3IuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdHJpZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UUklFX05PREVfTUVUQURBVEFfU0VMRUNUT1JfSFBQCisjZGVmaW5lIFBCX0RTX1RSSUVfTk9ERV9NRVRBREFUQV9TRUxFQ1RPUl9IUFAKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvYmFzaWNfdHJlZV9wb2xpY3kvbnVsbF9ub2RlX21ldGFkYXRhLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgTm9kZV9VcGRhdGUsIGJvb2wgTnVsbD4KKyAgICBzdHJ1Y3QgdHJpZV9tZXRhZGF0YV9oZWxwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIE5vZGVfVXBkYXRlOjptZXRhZGF0YV90eXBlIHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIE5vZGVfVXBkYXRlPgorICAgIHN0cnVjdCB0cmllX21ldGFkYXRhX2hlbHBlcjwKKyAgICAgIE5vZGVfVXBkYXRlLAorICAgICAgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIG51bGxfbm9kZV9tZXRhZGF0YSB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksCisJICAgICB0eXBlbmFtZSBEYXRhLAorCSAgICAgY2xhc3MgQ21wX0ZuLAorCSAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkJICAgICAgY2xhc3MgQ29uc3RfSXRlcmF0b3IsCisJCSAgICAgIGNsYXNzIENtcF9Gbl8sCisJCSAgICAgIGNsYXNzIEFsbG9jYXRvcl8+CisgICAgY2xhc3MgTm9kZV9VcGRhdGUsCisJICAgICBjbGFzcyBBbGxvY2F0b3I+CisgICAgc3RydWN0IHRyaWVfbm9kZV9tZXRhZGF0YV9zZWxlY3RvcgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZgorICAgICAgZHVtY29uc3Rfbm9kZV9pdGVyYXRvcjwKKyAgICAgIEtleSwKKyAgICAgIERhdGEsCisgICAgICBBbGxvY2F0b3I+CisgICAgICBkdW1jb25zdF9ub2RlX2l0OworCisgICAgICBlbnVtCisJeworCSAgbnVsbF91cGRhdGUgPQorCSAgaXNfc2FtZTwKKwkgIE5vZGVfVXBkYXRlPAorCSAgZHVtY29uc3Rfbm9kZV9pdCwKKwkgIGR1bWNvbnN0X25vZGVfaXQsCisJICBDbXBfRm4sCisJICBBbGxvY2F0b3I+LAorCSAgbnVsbF90cmllX25vZGVfdXBkYXRlPAorCSAgZHVtY29uc3Rfbm9kZV9pdCwKKwkgIGR1bWNvbnN0X25vZGVfaXQsCisJICBDbXBfRm4sCisJICBBbGxvY2F0b3I+ID46OnZhbHVlCisJfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHRyaWVfbWV0YWRhdGFfaGVscGVyPAorICAgICAgTm9kZV9VcGRhdGU8CisgICAgICBkdW1jb25zdF9ub2RlX2l0LAorICAgICAgZHVtY29uc3Rfbm9kZV9pdCwKKyAgICAgIENtcF9GbiwKKyAgICAgIEFsbG9jYXRvcj4sCisgICAgICBudWxsX3VwZGF0ZT46OnR5cGUKKyAgICAgIHR5cGU7CisgICAgfTsKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJJRV9OT0RFX01FVEFEQVRBX1NFTEVDVE9SX0hQUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L251bGxfbm9kZV91cGRhdGVfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9udWxsX25vZGVfdXBkYXRlX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyNDVlOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9udWxsX25vZGVfdXBkYXRlX2ltcC5ocHAKQEAgLTAsMCArMSw1MCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgbnVsbF9ub2RlX3VwZGF0ZV9pbXAuaHBwCisgKiBDb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBudWxsX25vZGVfdXBkYXRlLgorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yXywKKwkgdHlwZW5hbWUgTm9kZV9JdGVyYXRvcl8sCisJIGNsYXNzICAgIEVfQWNjZXNzX1RyYWl0c18sCisJIHR5cGVuYW1lIEFsbG9jYXRvcl8+CitpbmxpbmUgdm9pZAorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorc3dhcChudWxsX3RyaWVfbm9kZV91cGRhdGU8ICAgICAgICAgICAgQ29uc3RfTm9kZV9JdGVyYXRvcl8sIE5vZGVfSXRlcmF0b3JfLCBFX0FjY2Vzc19UcmFpdHNfLCBBbGxvY2F0b3JfPiYgLypvdGhlciovKQoreyB9CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOGUyNDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwCkBAIC0wLDAgKzEsMTgxIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBvcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHAKKyAqIENvbnRhaW5zIGZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBvcmRlcl9zdGF0aXN0aWNzX2tleQorICovCisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2J5X29yZGVyKHNpemVfdHlwZSBvcmRlcikKK3sKKyAgaWYgKGVtcHR5KCkpCisgICAgcmV0dXJuIChlbmQoKSk7CisKKyAgKytvcmRlcjsKKworICBub2RlX2l0ZXJhdG9yIG5kX2l0ID0gbm9kZV9iZWdpbigpOworCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGlmIChvcmRlciA+IG5kX2l0LmdldF9tZXRhZGF0YSgpKQorCXJldHVybiAoKytiYXNlX3R5cGU6OnJpZ2h0bW9zdF9pdChuZF9pdCkpOworCisgICAgICBjb25zdCBzaXplX3R5cGUgbnVtX2NoaWxkcmVuID0gbmRfaXQubnVtX2NoaWxkcmVuKCk7CisKKyAgICAgIGlmIChudW1fY2hpbGRyZW4gPT0gMCkKKwlyZXR1cm4gKCpuZF9pdCk7CisKKyAgICAgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisgICAgICAgIHsKKwkgIG5vZGVfaXRlcmF0b3IgY2hpbGRfbmRfaXQgPSBuZF9pdC5nZXRfY2hpbGQoaSk7CisKKwkgIGlmIChvcmRlciA8PSBjaGlsZF9uZF9pdC5nZXRfbWV0YWRhdGEoKSkKKyAgICAgICAgICAgIHsKKwkgICAgICBpID0gbnVtX2NoaWxkcmVuOworCisJICAgICAgbmRfaXQgPSBjaGlsZF9uZF9pdDsKKyAgICAgICAgICAgIH0KKwkgIGVsc2UKKwkgICAgb3JkZXIgLT0gY2hpbGRfbmRfaXQuZ2V0X21ldGFkYXRhKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitmaW5kX2J5X29yZGVyKHNpemVfdHlwZSBvcmRlcikgY29uc3QKK3sKKyAgcmV0dXJuIChjb25zdF9jYXN0PFBCX0RTX0NMQVNTX0NfREVDKiA+KHRoaXMpLT5maW5kX2J5X29yZGVyKG9yZGVyKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3JkZXJfb2Zfa2V5KGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpIGNvbnN0Cit7CisgIGNvbnN0IEVfQWNjZXNzX1RyYWl0cyYgcl90cmFpdHMgPQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmdldF9lX2FjY2Vzc190cmFpdHMoKTsKKworICByZXR1cm4gKG9yZGVyX29mX3ByZWZpeCgKKwkJCSAgcl90cmFpdHMuYmVnaW4ocl9rZXkpLAorCQkJICByX3RyYWl0cy5lbmQocl9rZXkpKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OnNpemVfdHlwZQorUEJfRFNfQ0xBU1NfQ19ERUM6Ogorb3JkZXJfb2ZfcHJlZml4KHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYiwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlKSBjb25zdAoreworICBpZiAoZW1wdHkoKSkKKyAgICByZXR1cm4gKDApOworCisgIGNvbnN0IEVfQWNjZXNzX1RyYWl0cyYgcl90cmFpdHMgPQorICAgIGNvbnN0X2Nhc3Q8UEJfRFNfQ0xBU1NfQ19ERUMqID4odGhpcyktPmdldF9lX2FjY2Vzc190cmFpdHMoKTsKKworICBjb25zdF9ub2RlX2l0ZXJhdG9yIG5kX2l0ID0gbm9kZV9iZWdpbigpOworCisgIGNvbnN0X25vZGVfaXRlcmF0b3IgZW5kX25kX2l0ID0gbm9kZV9lbmQoKTsKKworICBzaXplX3R5cGUgb3JkID0gMDsKKworICB3aGlsZSAodHJ1ZSkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbnVtX2NoaWxkcmVuID0gbmRfaXQubnVtX2NoaWxkcmVuKCk7CisKKyAgICAgIGlmIChudW1fY2hpbGRyZW4gPT0gMCkKKyAgICAgICAgeworCSAgY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSA9CisJICAgIGJhc2VfdHlwZTo6ZXh0cmFjdF9rZXkoKigqbmRfaXQpKTsKKworCSAgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBrZXlfYiA9CisJICAgIHJfdHJhaXRzLmJlZ2luKHJfa2V5KTsKKworCSAgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBrZXlfZSA9CisJICAgIHJfdHJhaXRzLmVuZChyX2tleSk7CisKKwkgIHJldHVybiAoKGJhc2VfdHlwZTo6bGVzcyggICAgICAgICAgICAgICAgICAgIGtleV9iLCBrZXlfZSwgIGIsIGUsICByX3RyYWl0cykpPworCQkgIG9yZCArIDEgOgorCQkgIG9yZCk7CisgICAgICAgIH0KKworICAgICAgY29uc3Rfbm9kZV9pdGVyYXRvciBuZXh0X25kX2l0ID0gZW5kX25kX2l0OworCisgICAgICBzaXplX3R5cGUgaSA9IG51bV9jaGlsZHJlbiAtIDE7CisKKyAgICAgIGRvCisgICAgICAgIHsKKwkgIGNvbnN0X25vZGVfaXRlcmF0b3IgY2hpbGRfbmRfaXQgPSBuZF9pdC5nZXRfY2hpbGQoaSk7CisKKwkgIGlmIChuZXh0X25kX2l0ICE9IGVuZF9uZF9pdCkKKwkgICAgb3JkICs9IGNoaWxkX25kX2l0LmdldF9tZXRhZGF0YSgpOworCSAgZWxzZSBpZiAoIWJhc2VfdHlwZTo6bGVzcygKKwkJCQkgICAgYiwgZSwKKwkJCQkgICAgY2hpbGRfbmRfaXQudmFsaWRfcHJlZml4KCkuZmlyc3QsCisJCQkJICAgIGNoaWxkX25kX2l0LnZhbGlkX3ByZWZpeCgpLnNlY29uZCwKKwkJCQkgICAgcl90cmFpdHMpKQorCSAgICBuZXh0X25kX2l0ID0gY2hpbGRfbmRfaXQ7CisgICAgICAgIH0KKyAgICAgIHdoaWxlIChpLS0gPiAwKTsKKworICAgICAgaWYgKG5leHRfbmRfaXQgPT0gZW5kX25kX2l0KQorCXJldHVybiAob3JkKTsKKworICAgICAgbmRfaXQgPSBuZXh0X25kX2l0OworICAgIH0KK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IgbmRfaXQsIGNvbnN0X25vZGVfaXRlcmF0b3IgLyplbmRfbmRfaXQqLykgY29uc3QKK3sKKyAgY29uc3Qgc2l6ZV90eXBlIG51bV9jaGlsZHJlbiA9IG5kX2l0Lm51bV9jaGlsZHJlbigpOworCisgIHNpemVfdHlwZSBjaGlsZHJlbl9yYW5rID0gMDsKKworICBmb3IgKHNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9jaGlsZHJlbjsgKytpKQorICAgIGNoaWxkcmVuX3JhbmsgKz0gbmRfaXQuZ2V0X2NoaWxkKGkpLmdldF9tZXRhZGF0YSgpOworCisgIGNvbnN0X2Nhc3Q8c2l6ZV90eXBlJiA+KG5kX2l0LmdldF9tZXRhZGF0YSgpKSA9KG51bV9jaGlsZHJlbiA9PSAwKT8gMSA6IGNoaWxkcmVuX3Jhbms7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitQQl9EU19DTEFTU19DX0RFQzo6Cit+dHJpZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlKCkKK3sgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlX2ltcC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkODk4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlX2ltcC5ocHAKQEAgLTAsMCArMSwxNTEgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgcHJlZml4X3NlYXJjaF9ub2RlX3VwZGF0ZS4KKyAqLworCitQQl9EU19DTEFTU19UX0RFQworc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IsCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcj4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ByZWZpeF9yYW5nZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KSBjb25zdAoreworICBjb25zdCBlX2FjY2Vzc190cmFpdHMmIHJfdHJhaXRzID0gZ2V0X2VfYWNjZXNzX3RyYWl0cygpOworCisgIHJldHVybiAocHJlZml4X3JhbmdlKAorCQkgICAgICAgcl90cmFpdHMuYmVnaW4ocl9rZXkpLAorCQkgICAgICAgcl90cmFpdHMuZW5kKHJfa2V5KSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6aXRlcmF0b3IsCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcj4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ByZWZpeF9yYW5nZShjb25zdF9rZXlfcmVmZXJlbmNlIHJfa2V5KQoreworICByZXR1cm4gKHByZWZpeF9yYW5nZSgKKwkJICAgICAgIGdldF9lX2FjY2Vzc190cmFpdHMoKS5iZWdpbihyX2tleSksCisJCSAgICAgICBnZXRfZV9hY2Nlc3NfdHJhaXRzKCkuZW5kKHJfa2V5KSkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworc3RkOjpwYWlyPAorICB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IsCisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcj4KK1BCX0RTX0NMQVNTX0NfREVDOjoKK3ByZWZpeF9yYW5nZSh0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGIsIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZSkgY29uc3QKK3sKKyAgY29uc3Qgc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gbm9uX2NvbnN0X3JldCA9CisgICAgY29uc3RfY2FzdDxQQl9EU19DTEFTU19DX0RFQyogPih0aGlzKS0+cHJlZml4X3JhbmdlKGIsIGUpOworCisgIHJldHVybiAoc3RkOjptYWtlX3BhaXIoCisJCQkgY29uc3RfaXRlcmF0b3Iobm9uX2NvbnN0X3JldC5maXJzdCksCisJCQkgY29uc3RfaXRlcmF0b3Iobm9uX2NvbnN0X3JldC5zZWNvbmQpKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitzdGQ6OnBhaXI8CisgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvciwKKyAgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Oml0ZXJhdG9yPgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorcHJlZml4X3JhbmdlKHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYiwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlKQoreworICBOb2RlX0l0ZXJhdG9yIG5kX2l0ID0gbm9kZV9iZWdpbigpOworICBOb2RlX0l0ZXJhdG9yIGVuZF9uZF9pdCA9IG5vZGVfZW5kKCk7CisKKyAgY29uc3QgZV9hY2Nlc3NfdHJhaXRzJiByX3RyYWl0cyA9CisgICAgZ2V0X2VfYWNjZXNzX3RyYWl0cygpOworCisgIGNvbnN0IHNpemVfdHlwZSBnaXZlbl9yYW5nZV9sZW5ndGggPSBzdGQ6OmRpc3RhbmNlKGIsIGUpOworCisgIHdoaWxlICh0cnVlKQorICAgIHsKKyAgICAgIGlmIChuZF9pdCA9PSBlbmRfbmRfaXQpCisJcmV0dXJuIChzdGQ6Om1ha2VfcGFpcihlbmQoKSwgZW5kKCkpKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIGNvbW1vbl9yYW5nZV9sZW5ndGggPQorCVBCX0RTX0JBU0VfQ19ERUM6OmNvbW1vbl9wcmVmaXhfbGVuKG5kX2l0LCBiLCBlLCByX3RyYWl0cyk7CisKKyAgICAgIGlmIChjb21tb25fcmFuZ2VfbGVuZ3RoID49IGdpdmVuX3JhbmdlX2xlbmd0aCkKKyAgICAgICAgeworCSAgaXRlcmF0b3IgcmV0X2IgPSBsZWZ0bW9zdF9pdChuZF9pdCk7CisKKwkgIGl0ZXJhdG9yIHJldF9lID0gcmlnaHRtb3N0X2l0KG5kX2l0KTsKKworCSAgcmV0dXJuIChzdGQ6Om1ha2VfcGFpcihyZXRfYiwgKytyZXRfZSkpOworICAgICAgICB9CisKKyAgICAgIG5kX2l0ID0gbmV4dF9jaGlsZChuZF9pdCwgYiwgZSwgZW5kX25kX2l0LCByX3RyYWl0cyk7CisgICAgfQorfQorCitQQl9EU19DTEFTU19UX0RFQwordHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6Om5vZGVfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK25leHRfY2hpbGQobm9kZV9pdGVyYXRvciBuZF9pdCwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGUsIG5vZGVfaXRlcmF0b3IgZW5kX25kX2l0LCBjb25zdCBlX2FjY2Vzc190cmFpdHMmIHJfdHJhaXRzKQoreworICBjb25zdCBzaXplX3R5cGUgbnVtX2NoaWxkcmVuID0gbmRfaXQubnVtX2NoaWxkcmVuKCk7CisKKyAgbm9kZV9pdGVyYXRvciByZXQgPSBlbmRfbmRfaXQ7CisKKyAgc2l6ZV90eXBlIG1heF9sZW5ndGggPSAwOworCisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2NoaWxkcmVuOyArK2kpCisgICAgeworICAgICAgbm9kZV9pdGVyYXRvciBwb3QgPSBuZF9pdC5nZXRfY2hpbGQoaSk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBjb21tb25fcmFuZ2VfbGVuZ3RoID0KKwlQQl9EU19CQVNFX0NfREVDOjpjb21tb25fcHJlZml4X2xlbiggICAgICAgICAgICBwb3QsIGIsIGUsIHJfdHJhaXRzKTsKKworICAgICAgaWYgKGNvbW1vbl9yYW5nZV9sZW5ndGggPiBtYXhfbGVuZ3RoKQorICAgICAgICB7CisJICByZXQgPSBwb3Q7CisKKwkgIG1heF9sZW5ndGggPSBjb21tb25fcmFuZ2VfbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiAocmV0KTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB2b2lkCitQQl9EU19DTEFTU19DX0RFQzo6CitvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IgLypuZF9pdCovLCBjb25zdF9ub2RlX2l0ZXJhdG9yIC8qZW5kX25kX2l0Ki8pIGNvbnN0Cit7IH0KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9lX2FjY2Vzc190cmFpdHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3NhbXBsZV90cmllX2VfYWNjZXNzX3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjYWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9lX2FjY2Vzc190cmFpdHMuaHBwCkBAIC0wLDAgKzEsODkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV90cmllX2VfYWNjZXNzX3RyYWl0cy5ocHAKKyAqIENvbnRhaW5zIGEgc2FtcGxlIHByb2JlIHBvbGljeS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX0VfQUNDRVNTX1RSQUlUU19IUFAKKyNkZWZpbmUgUEJfRFNfU0FNUExFX1RSSUVfRV9BQ0NFU1NfVFJBSVRTX0hQUAorCisvLyBBIHNhbXBsZSB0cmllIGVsZW1lbnQtYWNjZXNzIHRyYWl0cy4KK2NsYXNzIHNhbXBsZV90cmllX2VfYWNjZXNzX3RyYWl0cworeworCitwdWJsaWM6CisKKyAgLy8gU2l6ZSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAvLyBLZXkgdHlwZS4KKyAgdHlwZWRlZiBzdGQ6OnN0cmluZyBrZXlfdHlwZTsKKworICAvLyBDb25zdCBrZXkgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYKKyAgdHlwZW5hbWUgQWxsb2NhdG9yOjp0ZW1wbGF0ZSByZWJpbmQ8CisgICAga2V5X3R5cGU+OjpvdGhlcjo6Y29uc3RfcmVmZXJlbmNlCisgIGNvbnN0X2tleV9yZWZlcmVuY2U7CisKKyAgLy8gRWxlbWVudCBjb25zdCBpdGVyYXRvciB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAvLyBFbGVtZW50IHR5cGUuCisgIHR5cGVkZWYgY2hhciBlX3R5cGU7CisKKyAgZW51bQorICAgIHsKKyAgICAgIG1heF9zaXplID0gNAorICAgIH07CisKK3B1YmxpYzoKKworICAvLyBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2Ygcl9rZXkuCisgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgYmVnaW4oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSk7CisKKyAgLy8gUmV0dXJucyBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBhZnRlci1sYXN0IGVsZW1lbnQgb2Ygcl9rZXkuCisgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgZW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpOworCisgIC8vIE1hcHMgYW4gZWxlbWVudCB0byBhIHBvc2l0aW9uLgorICBpbmxpbmUgc3RhdGljIHNpemVfdHlwZQorICBlX3BvcyhlX3R5cGUgZSk7CisKK307CisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX0VfQUNDRVNTX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfbm9kZV91cGRhdGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmM2YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvc2FtcGxlX3RyaWVfbm9kZV91cGRhdGUuaHBwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHNhbXBsZV90cmllX25vZGVfdXBkYXRlLmhwcAorICogQ29udGFpbnMgYSBzYW1sZSBub2RlIHVwZGF0ZSBmdW5jdG9yLgorICovCisKKyNpZm5kZWYgUEJfRFNfU0FNUExFX1RSSUVfTk9ERV9VUERBVE9SX0hQUAorI2RlZmluZSBQQl9EU19TQU1QTEVfVFJJRV9OT0RFX1VQREFUT1JfSFBQCisKKy8vIEEgc2FtcGxlIG5vZGUgdXBkYXRvci4KK3RlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisKKwkgY2xhc3MgTm9kZV9JdGVyYXRvciwKKworCSBjbGFzcyBFX0FjY2Vzc19UcmFpdHMsCisKKwkgY2xhc3MgQWxsb2NhdG9yCisJID4KK2NsYXNzIHNhbXBsZV90cmllX25vZGVfdXBkYXRlCit7CisKK3B1YmxpYzoKKworICAvLyBNZXRhZGF0YSB0eXBlLgorICB0eXBlZGVmIHN0ZDo6c2l6ZV90IG1ldGFkYXRhX3R5cGU7CisKK3Byb3RlY3RlZDoKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBzYW1wbGVfdHJpZV9ub2RlX3VwZGF0ZSgpOworCisgIC8vIFVwZGF0ZXMgdGhlIHJhbmsgb2YgYSBub2RlIHRocm91Z2ggYSBub2RlX2l0ZXJhdG9yIG5vZGVfaXQ7IGVuZF9uZF9pdCBpcyB0aGUgZW5kIG5vZGUgaXRlcmF0b3IuCisgIGlubGluZSB2b2lkCisgIG9wZXJhdG9yKCkobm9kZV9pdGVyYXRvciBub2RlX2l0LCBjb25zdF9ub2RlX2l0ZXJhdG9yIGVuZF9uZF9pdCkgY29uc3Q7CisKK307CisKKyNlbmRpZiAvLyAjaWZuZGVmIFBCX0RTX1NBTVBMRV9UUklFX05PREVfVVBEQVRPUl9IUFAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zdHJpbmdfdHJpZV9lX2FjY2Vzc190cmFpdHNfaW1wLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9zdHJpbmdfdHJpZV9lX2FjY2Vzc190cmFpdHNfaW1wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhhNGE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3N0cmluZ190cmllX2VfYWNjZXNzX3RyYWl0c19pbXAuaHBwCkBAIC0wLDAgKzEsOTkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHN0cmluZ190cmllX2VfYWNjZXNzX3RyYWl0c19pbXAuaHBwCisgKiBDb250YWlucyBhIHBvbGljeSBmb3IgZXh0cmFjdGluZyBjaGFyYWN0ZXIgcG9zaXRpb25zIGZyb20KKyAqICAgIGEgc3RyaW5nIGZvciBhIHZlY3Rvci1iYXNlZCBQQVRSSUNJQSB0cmVlCisgKi8KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2RldGFpbDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBSZXZlcnNlPiBQQl9EU19DTEFTU19DX0RFQzo6c19yZXZfaW5kOworCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VfcG9zKGVfdHlwZSBlKQoreworICByZXR1cm4gKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oZSAtIG1pbl9lX3ZhbCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW4oY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkKK3sKKyAgcmV0dXJuIChiZWdpbl9pbXAocl9rZXksIHNfcmV2X2luZCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorZW5kKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXkpCit7CisgIHJldHVybiAoZW5kX2ltcChyX2tleSwgc19yZXZfaW5kKSk7Cit9CisKK1BCX0RTX0NMQVNTX1RfREVDCitpbmxpbmUgdHlwZW5hbWUgUEJfRFNfQ0xBU1NfQ19ERUM6OmNvbnN0X2l0ZXJhdG9yCitQQl9EU19DTEFTU19DX0RFQzo6CitiZWdpbl9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgZGV0YWlsOjpmYWxzZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LmJlZ2luKCkpOworfQorCitQQl9EU19DTEFTU19UX0RFQworaW5saW5lIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpjb25zdF9pdGVyYXRvcgorUEJfRFNfQ0xBU1NfQ19ERUM6OgorYmVnaW5faW1wKGNvbnN0X2tleV9yZWZlcmVuY2Ugcl9rZXksIGRldGFpbDo6dHJ1ZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LnJiZWdpbigpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgZGV0YWlsOjpmYWxzZV90eXBlKQoreworICByZXR1cm4gKHJfa2V5LmVuZCgpKTsKK30KKworUEJfRFNfQ0xBU1NfVF9ERUMKK2lubGluZSB0eXBlbmFtZSBQQl9EU19DTEFTU19DX0RFQzo6Y29uc3RfaXRlcmF0b3IKK1BCX0RTX0NMQVNTX0NfREVDOjoKK2VuZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSwgZGV0YWlsOjp0cnVlX3R5cGUpCit7CisgIHJldHVybiAocl9rZXkucmVuZCgpKTsKK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3BvbGljeV9iYXNlLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS90cmllX3BvbGljeV9iYXNlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkxMmEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3RyaWVfcG9saWN5X2Jhc2UuaHBwCkBAIC0wLDAgKzEsMjQ5IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmllX3BvbGljeV9iYXNlLmhwcAorICogQ29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgdHJpZV9wb2xpY3lfYmFzZS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RSSUVfUE9MSUNZX0JBU0VfSFBQCisjZGVmaW5lIFBCX0RTX1RSSUVfUE9MSUNZX0JBU0VfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L2Jhc2ljX3RyZWVfcG9saWN5X2Jhc2UuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQwkJCQkJCVwKKyAgICB0ZW1wbGF0ZTwJCQkJCQkJCVwKKwkJCQkJCWNsYXNzIENvbnN0X05vZGVfSXRlcmF0b3IsIFwKKwkJCQkJCWNsYXNzIE5vZGVfSXRlcmF0b3IsCVwKKwkJCQkJCWNsYXNzIEVfQWNjZXNzX1RyYWl0cywJXAorCQkJCQkJdHlwZW5hbWUgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDCQkJCQkJXAorICAgIHRyaWVfcG9saWN5X2Jhc2U8CQkJCQkJCVwKKwkJCQkJCUNvbnN0X05vZGVfSXRlcmF0b3IsCVwKKwkJCQkJCU5vZGVfSXRlcmF0b3IsCQlcCisJCQkJCQlFX0FjY2Vzc19UcmFpdHMsCVwKKwkJCQkJCUFsbG9jYXRvcj4KKworI2RlZmluZSBQQl9EU19CQVNFX0NfREVDCQkJCQkJXAorICAgIGJhc2ljX3RyZWVfcG9saWN5X2Jhc2U8CQkJCVwKKwkJCQkJCQkJQ29uc3RfTm9kZV9JdGVyYXRvciwgXAorCQkJCQkJCQlOb2RlX0l0ZXJhdG9yLCBcCisJCQkJCQkJCUFsbG9jYXRvcj4KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisJICAgICBjbGFzcyBOb2RlX0l0ZXJhdG9yLAorCSAgICAgY2xhc3MgRV9BY2Nlc3NfVHJhaXRzLAorCSAgICAgY2xhc3MgQWxsb2NhdG9yPgorICAgIGNsYXNzIHRyaWVfcG9saWN5X2Jhc2UgOiBwdWJsaWMgUEJfRFNfQkFTRV9DX0RFQworICAgIHsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiBFX0FjY2Vzc19UcmFpdHMgZV9hY2Nlc3NfdHJhaXRzOworCisgICAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgICAgdHlwZWRlZiBudWxsX25vZGVfbWV0YWRhdGEgbWV0YWRhdGFfdHlwZTsKKworICAgICAgdHlwZWRlZiBDb25zdF9Ob2RlX0l0ZXJhdG9yIGNvbnN0X25vZGVfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgTm9kZV9JdGVyYXRvciBub2RlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnN0X25vZGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9pdGVyYXRvcjo6dmFsdWVfdHlwZSBpdGVyYXRvcjsKKworICAgIHB1YmxpYzoKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBQQl9EU19CQVNFX0NfREVDOjprZXlfdHlwZSBrZXlfdHlwZTsKKworICAgICAgdHlwZWRlZgorICAgICAgdHlwZW5hbWUgUEJfRFNfQkFTRV9DX0RFQzo6Y29uc3Rfa2V5X3JlZmVyZW5jZQorICAgICAgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKworICAgIHByb3RlY3RlZDoKKworICAgICAgdmlydHVhbCBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIGl0ZXJhdG9yCisgICAgICBlbmQoKSA9IDA7CisKKyAgICAgIHZpcnR1YWwgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgICAgbm9kZV9iZWdpbigpIGNvbnN0ID0gMDsKKworICAgICAgdmlydHVhbCBub2RlX2l0ZXJhdG9yCisgICAgICBub2RlX2JlZ2luKCkgPSAwOworCisgICAgICB2aXJ0dWFsIGNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCkgY29uc3QgPSAwOworCisgICAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICAgIG5vZGVfZW5kKCkgPSAwOworCisgICAgICB2aXJ0dWFsIGNvbnN0IGVfYWNjZXNzX3RyYWl0cyYgCisgICAgICBnZXRfZV9hY2Nlc3NfdHJhaXRzKCkgY29uc3QgPSAwOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYKKyAgICAgIHN0ZDo6cGFpcjwKKyAgICAgIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IsCisgICAgICB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yPgorICAgICAgcHJlZml4X3JhbmdlX3Q7CisKKyAgICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBzdGF0aWMgc2l6ZV90eXBlCisgICAgICBjb21tb25fcHJlZml4X2xlbihub2RlX2l0ZXJhdG9yIG5kX2l0LCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGJfciwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlX3IsIGNvbnN0IGVfYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMpOworCisgICAgICBzdGF0aWMgaXRlcmF0b3IKKyAgICAgIGxlZnRtb3N0X2l0KG5vZGVfaXRlcmF0b3IgbmRfaXQpOworCisgICAgICBzdGF0aWMgaXRlcmF0b3IKKyAgICAgIHJpZ2h0bW9zdF9pdChub2RlX2l0ZXJhdG9yIG5kX2l0KTsKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIGxlc3ModHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiX2wsIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZV9sLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGJfciwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlX3IsIGNvbnN0IGVfYWNjZXNzX3RyYWl0cyYgcl90cmFpdHMpOworICAgIH07CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjpzaXplX3R5cGUKKyAgICBQQl9EU19DTEFTU19DX0RFQzo6CisgICAgY29tbW9uX3ByZWZpeF9sZW4obm9kZV9pdGVyYXRvciBuZF9pdCwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiX3IsIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZV9yLCBjb25zdCBlX2FjY2Vzc190cmFpdHMmIHJfdHJhaXRzKQorICAgIHsKKyAgICAgIHByZWZpeF9yYW5nZV90IHByZWZfcmFuZ2UgPSBuZF9pdC52YWxpZF9wcmVmaXgoKTsKKworICAgICAgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiX2wgPSBwcmVmX3JhbmdlLmZpcnN0OworICAgICAgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBlX2wgPSBwcmVmX3JhbmdlLnNlY29uZDsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIHJhbmdlX2xlbmd0aF9sID0KKwlzdGQ6OmRpc3RhbmNlKGJfbCwgZV9sKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIHJhbmdlX2xlbmd0aF9yID0KKwlzdGQ6OmRpc3RhbmNlKGJfciwgZV9yKTsKKworICAgICAgaWYgKHJhbmdlX2xlbmd0aF9yIDwgcmFuZ2VfbGVuZ3RoX2wpCisJeworCSAgc3RkOjpzd2FwKGJfbCwgYl9yKTsKKworCSAgc3RkOjpzd2FwKGVfbCwgZV9yKTsKKwl9CisKKyAgICAgIHNpemVfdHlwZSByZXQgPSAwOworCisgICAgICB3aGlsZSAoYl9sICE9IGVfbCkKKwl7CisJICBpZiAocl90cmFpdHMuZV9wb3MoKmJfbCkgIT0gcl90cmFpdHMuZV9wb3MoKmJfcikpCisJICAgIHJldHVybiAocmV0KTsKKworCSAgKytyZXQ7CisKKwkgICsrYl9sOworCisJICArK2JfcjsKKwl9CisKKyAgICAgIHJldHVybiAocmV0KTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBsZWZ0bW9zdF9pdChub2RlX2l0ZXJhdG9yIG5kX2l0KQorICAgIHsKKyAgICAgIGlmIChuZF9pdC5udW1fY2hpbGRyZW4oKSA9PSAwKQorCXJldHVybiAoKm5kX2l0KTsKKworICAgICAgcmV0dXJuIChsZWZ0bW9zdF9pdChuZF9pdC5nZXRfY2hpbGQoMCkpKTsKKyAgICB9CisKKyAgICBQQl9EU19DTEFTU19UX0RFQworICAgIHR5cGVuYW1lIFBCX0RTX0NMQVNTX0NfREVDOjppdGVyYXRvcgorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICByaWdodG1vc3RfaXQobm9kZV9pdGVyYXRvciBuZF9pdCkKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgbnVtX2NoaWxkcmVuID0gbmRfaXQubnVtX2NoaWxkcmVuKCk7CisKKyAgICAgIGlmIChudW1fY2hpbGRyZW4gPT0gMCkKKwlyZXR1cm4gKCpuZF9pdCk7CisKKyAgICAgIHJldHVybiAocmlnaHRtb3N0X2l0KG5kX2l0LmdldF9jaGlsZChudW1fY2hpbGRyZW4gLSAxKSkpOworICAgIH0KKworICAgIFBCX0RTX0NMQVNTX1RfREVDCisgICAgYm9vbAorICAgIFBCX0RTX0NMQVNTX0NfREVDOjoKKyAgICBsZXNzKHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgYl9sLCB0eXBlbmFtZSBlX2FjY2Vzc190cmFpdHM6OmNvbnN0X2l0ZXJhdG9yIGVfbCwgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBiX3IsIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgZV9yLCBjb25zdCBlX2FjY2Vzc190cmFpdHMmIHJfdHJhaXRzKQorICAgIHsKKyAgICAgIHdoaWxlIChiX2wgIT0gZV9sKQorCXsKKwkgIGlmIChiX3IgPT0gZV9yKQorCSAgICByZXR1cm4gKGZhbHNlKTsKKworCSAgc2l6ZV90eXBlIGxfcG9zID0KKwkgICAgcl90cmFpdHMuZV9wb3MoKmJfbCk7CisJICBzaXplX3R5cGUgcl9wb3MgPQorCSAgICByX3RyYWl0cy5lX3BvcygqYl9yKTsKKworCSAgaWYgKGxfcG9zICE9IHJfcG9zKQorCSAgICByZXR1cm4gKGxfcG9zIDwgcl9wb3MpOworCisJICArK2JfbDsKKwkgICsrYl9yOworCX0KKworICAgICAgcmV0dXJuIChiX3IgIT0gZV9yKTsKKyAgICB9CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIC8vICNpZm5kZWYgUEJfRFNfVFJJRV9QT0xJQ1lfQkFTRV9IUFAKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzExMGMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHAKQEAgLTAsMCArMSwxNjcgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHR5cGVfdXRpbHMuaHBwCisgKiBDb250YWlucyB1dGlsaXRpZXMgZm9yIGhhbmRubGluZyB0eXBlcy4gQWxsIG9mIHRoZXNlIGNsYXNzZXMgYXJlIGJhc2VkIG9uCisgKiBNb2Rlcm4gQysrIGJ5IEFuZHJlaSBBbHhhbmRyZXNjdS4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RZUEVfVVRJTFNfSFBQCisjZGVmaW5lIFBCX0RTX1RZUEVfVVRJTFNfSFBQCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICBuYW1lc3BhY2UgZGV0YWlsCisgIHsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfc2FtZTsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfY29uc3Q7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX3BvaW50ZXI7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX3JlZmVyZW5jZTsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfZnVuZGFtZW50YWw7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjsKKyAgICB1c2luZyBzdGQ6OnRyMTo6aXNfbWVtYmVyX3BvaW50ZXI7CisgICAgdXNpbmcgc3RkOjp0cjE6OmlzX2Jhc2Vfb2Y7CisgICAgdXNpbmcgc3RkOjp0cjE6OnJlbW92ZV9jb25zdDsKKyAgICB1c2luZyBzdGQ6OnRyMTo6cmVtb3ZlX3JlZmVyZW5jZTsKKworICAgIC8vIE5lZWQgaW50ZWdyYWxfY29uc3Q8Ym9vbCwgdHJ1ZT4gPC0+IGludGVncmFsX2NvbnN0PGludCwgMT4sIHNvCisgICAgLy8gYmVjYXVzZSBvZiB0aGlzIHVzZSB0aGUgZm9sbG93aW5nIHR5cGVkZWZzIGluc3RlYWQgb2YgaW1wb3J0aW5nCisgICAgLy8gc3RkOjp0cjEncy4KKyAgICB1c2luZyBzdGQ6OnRyMTo6aW50ZWdyYWxfY29uc3RhbnQ7CisgICAgdHlwZWRlZiBzdGQ6OnRyMTo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCAxPiB0cnVlX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnRyMTo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCAwPiBmYWxzZV90eXBlOworCisgICAgdXNpbmcgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU7CisgICAgdXNpbmcgX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgaXNfY29uc3RfcG9pbnRlcgorICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGlzX2NvbnN0PFQ+Ojp2YWx1ZSAmJiBpc19wb2ludGVyPFQ+Ojp2YWx1ZQorCX07CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGlzX2NvbnN0X3JlZmVyZW5jZQorICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGlzX2NvbnN0PFQ+Ojp2YWx1ZSAmJiBpc19yZWZlcmVuY2U8VD46OnZhbHVlCisJfTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgaXNfc2ltcGxlCisgICAgeworICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gaXNfZnVuZGFtZW50YWw8dHlwZW5hbWUgcmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlPjo6dmFsdWUgCisJICB8fCBpc19wb2ludGVyPHR5cGVuYW1lIHJlbW92ZV9jb25zdDxUPjo6dHlwZT46OnZhbHVlIAorCSAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8VD46OnZhbHVlIAorCX07CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgaXNfcGFpcgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICAgIHN0cnVjdCBpc19wYWlyX2ltcAorICAgICAgeworCWVudW0KKwkgIHsKKwkgICAgdmFsdWUgPSAwCisJICB9OworICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4KKyAgICAgIHN0cnVjdCBpc19wYWlyX2ltcDxzdGQ6OnBhaXI8VSxWPiA+CisgICAgICB7CisJZW51bQorCSAgeworCSAgICB2YWx1ZSA9IDEKKwkgIH07CisgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gaXNfcGFpcl9pbXA8VD46OnZhbHVlCisJfTsKKyAgICB9OworCisgICAgLy8gVXNlIEMrKzB4J3Mgc3RhdGljX2Fzc2VydCBpZiBwb3NzaWJsZS4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworI2RlZmluZSBQQl9EU19TVEFUSUNfQVNTRVJUKFVOSVFVRSwgRSkgIHN0YXRpY19hc3NlcnQoRSwgI1VOSVFVRSkKKyNlbHNlCisgICAgdGVtcGxhdGU8Ym9vbD4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfYXNzZXJ0OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3N0YXRpY19hc3NlcnQ8dHJ1ZT4KKyAgICB7IH07CisKKyAgICB0ZW1wbGF0ZTxpbnQ+CisgICAgc3RydWN0IF9fc3RhdGljX2Fzc2VydF9kdW1jbGFzcworICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2ID0gMQorCX07CisgICAgfTsKKworI2RlZmluZSBQQl9EU19TVEFUSUNfQVNTRVJUKFVOSVFVRSwgRSkgIFwKKyAgICB0eXBlZGVmIF9fZ251X3BiZHM6OmRldGFpbDo6X19zdGF0aWNfYXNzZXJ0X2R1bWNsYXNzPHNpemVvZihfX2dudV9wYmRzOjpkZXRhaWw6Ol9fc3RhdGljX2Fzc2VydDxib29sKEUpPik+IFVOSVFVRSMjX19zdGF0aWNfYXNzZXJ0X3R5cGUKKworI2VuZGlmCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgorICAgIHN0cnVjdCB0eXBlX3RvX3R5cGUKKyAgICB7CisgICAgICB0eXBlZGVmIFR5cGUgdHlwZTsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdHlwZXNfdHJhaXRzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDVhMDc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3R5cGVzX3RyYWl0cy5ocHAKQEAgLTAsMCArMSw4MiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHlwZXNfdHJhaXRzLmhwcAorICogQ29udGFpbnMgYSB0cmFpdHMgY2xhc3Mgb2YgdHlwZXMgdXNlZCBieSBjb250YWluZXJzLgorICovCisKKyNpZm5kZWYgUEJfRFNfVFlQRVNfVFJBSVRTX0hQUAorI2RlZmluZSBQQl9EU19UWVBFU19UUkFJVFNfSFBQCisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3R5cGVzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIG5hbWVzcGFjZSBkZXRhaWwKKyAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBBbGxvYywgYm9vbCBTdG9yZV9FeHRyYT4KKyAgICBzdHJ1Y3QgdnRfYmFzZV9zZWxlY3RvcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdmFsdWVfdHlwZV9iYXNlPEtleSwgTWFwcGVkLCBBbGxvYywgU3RvcmVfRXh0cmE+IHR5cGU7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgTWFwcGVkLCB0eXBlbmFtZSBBbGxvYywgYm9vbCBTdG9yZV9FeHRyYT4KKyAgICBzdHJ1Y3QgdHlwZXNfdHJhaXRzIAorICAgIDogcHVibGljIHZ0X2Jhc2Vfc2VsZWN0b3I8S2V5LCBNYXBwZWQsIEFsbG9jLCBTdG9yZV9FeHRyYT46OnR5cGUKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8S2V5Pjo6b3RoZXIga2V5X2FsbG9jYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6dmFsdWVfdHlwZSBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6cG9pbnRlciBrZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciBjb25zdF9rZXlfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUga2V5X2FsbG9jYXRvcjo6cmVmZXJlbmNlIGtleV9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9hbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvYzo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKworICAgICAgLy8gRXh0cmEgdmFsdWUgKHVzZWQgd2hlbiB0aGUgZXh0cmEgdmFsdWUgaXMgc3RvcmVkIHdpdGggZWFjaCB2YWx1ZSkuCisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzaXplX3R5cGUsIHNpemVfdHlwZT4gCWNvbXBfaGFzaDsKKworICAgICAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxpbnQsIFN0b3JlX0V4dHJhPiBzdG9yZV9leHRyYTsKKyAgICAgIHN0b3JlX2V4dHJhCW1fc3RvcmVfZXh0cmFfaW5kaWNhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIG5vX3Rocm93X2NvcGllczxLZXksIE1hcHBlZD46OmluZGljYXRvciBub190aHJvd19jb3BpZXM7CisgICAgICBub190aHJvd19jb3BpZXMgCW1fbm9fdGhyb3dfY29waWVzX2luZGljYXRvcjsKKyAgICB9OworICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIF9fZ251X3BiZHMKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X2l0ZXJhdG9yLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQxNzkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9jb25zdF9pdGVyYXRvci5ocHAKQEAgLTAsMCArMSwxMjkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGNvbnN0X2l0ZXJhdG9yLmhwcAorICogQ29udGFpbnMgYW4gaXRlcmF0b3IgY2xhc3MgdXNlZCBmb3IgY29uc3QgcmFuZ2luZyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGUKKyAqICAgICB0YWJsZS4KKyAqLworCisvLyBDb25zdCByYW5nZS10eXBlIGl0ZXJhdG9yLgorY2xhc3MgY29uc3RfaXRlcmF0b3JfIDogCisgIHB1YmxpYyBjb25zdF9wb2ludF9pdGVyYXRvcl8KKworeworCitwdWJsaWM6CisKKyAgLy8gQ2F0ZWdvcnkuCisgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAvLyBEaWZmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgdHlwZW5hbWUgQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIC8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgdHlwZWRlZiB2YWx1ZV90eXBlXyB2YWx1ZV90eXBlOworCisgIC8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIHBvaW50ZXJfIHBvaW50ZXI7CisKKyAgLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcG9pbnRlcl8gY29uc3RfcG9pbnRlcjsKKworICAvLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHJlZmVyZW5jZV8gcmVmZXJlbmNlOworCisgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlXyBjb25zdF9yZWZlcmVuY2U7CisKK3B1YmxpYzoKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBpbmxpbmUKKyAgY29uc3RfaXRlcmF0b3JfKCkKKworICAgIDogbV9wX3RibCgwKQorICB7IH0KKworICAvLyBJbmNyZW1lbnRzLgorICBpbmxpbmUgY29uc3RfaXRlcmF0b3JfJiAKKyAgb3BlcmF0b3IrKygpCisgIHsKKyAgICBtX3BfdGJsLT5pbmNfaXRfc3RhdGUoYmFzZV90eXBlOjptX3BfdmFsdWUsIG1fcG9zKTsKKworICAgIHJldHVybiAoKnRoaXMpOworICB9CisKKyAgLy8gSW5jcmVtZW50cy4KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yXworICBvcGVyYXRvcisrKGludCkKKyAgeworICAgIGNvbnN0X2l0ZXJhdG9yXyByZXQgPSogdGhpczsKKworICAgIG1fcF90YmwtPmluY19pdF9zdGF0ZShiYXNlX3R5cGU6Om1fcF92YWx1ZSwgbV9wb3MpOworCisgICAgcmV0dXJuIChyZXQpOworICB9CisKK3Byb3RlY3RlZDoKKworICB0eXBlZGVmIGNvbnN0X3BvaW50X2l0ZXJhdG9yXyBiYXNlX3R5cGU7CisKK3Byb3RlY3RlZDoKKworICAvKioKKyAgICogIENvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHRhYmxlIHRvIGluaXRpYXRlIHRoZSBnZW5lcmFsaXplZAorICAgKiAgICAgIHBvaW50ZXIgYW5kIHBvc2l0aW9uIChlLmcuLCB0aGlzIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGZpbmQoKQorICAgKiAgICAgIG9mIGEgdGFibGUuCisgICAqICovCisgIGlubGluZQorICBjb25zdF9pdGVyYXRvcl8oY29uc3RfcG9pbnRlcl8gcF92YWx1ZSwgIFBCX0RTX0dFTl9QT1MgcG9zLCAgY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMqIHBfdGJsKSA6IGNvbnN0X3BvaW50X2l0ZXJhdG9yXyhwX3ZhbHVlKSwKKwkJCQkJCQkJCQkJCSBtX3BfdGJsKHBfdGJsKSwKKwkJCQkJCQkJCQkJCSBtX3Bvcyhwb3MpCisgIHsgfQorCitwcm90ZWN0ZWQ6CisKKyAgLyoqCisgICAqICBQb2ludGVyIHRvIHRoZSB0YWJsZSBvYmplY3Qgd2hpY2ggY3JlYXRlZCB0aGUgaXRlcmF0b3IgKHVzZWQgZm9yCisgICAqICAgICAgaW5jcmVtZW50aW5nIGl0cyBwb3NpdGlvbi4KKyAgICogKi8KKyAgY29uc3QgUEJfRFNfQ0xBU1NfQ19ERUMqIG1fcF90Ymw7CisKKyAgUEJfRFNfR0VOX1BPUyBtX3BvczsKKworICBmcmllbmQgY2xhc3MgUEJfRFNfQ0xBU1NfQ19ERUM7Cit9OworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZGE2OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9kZXRhaWwvdW5vcmRlcmVkX2l0ZXJhdG9yL2NvbnN0X3BvaW50X2l0ZXJhdG9yLmhwcApAQCAtMCwwICsxLDE1MSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgY29uc3RfcG9pbnRfaXRlcmF0b3IuaHBwCisgKiBDb250YWlucyBhbiBpdGVyYXRvciBjbGFzcyByZXR1cm5lZCBieSB0aGUgdGFibGVzJyBjb25zdCBmaW5kIGFuZCBpbnNlcnQKKyAqICAgICBtZXRob2RzLgorICovCisKK2NsYXNzIHBvaW50X2l0ZXJhdG9yXzsKKworLy8gQ29uc3QgcG9pbnQtdHlwZSBpdGVyYXRvci4KK2NsYXNzIGNvbnN0X3BvaW50X2l0ZXJhdG9yXworeworCitwdWJsaWM6CisKKyAgLy8gQ2F0ZWdvcnkuCisgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgLy8gRGlmZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHRyaXZpYWxfaXRlcmF0b3JfZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAvLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgIHR5cGVkZWYgdmFsdWVfdHlwZV8gdmFsdWVfdHlwZTsKKworICAvLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgdHlwZWRlZiBwb2ludGVyXyBwb2ludGVyOworCisgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3BvaW50ZXJfIGNvbnN0X3BvaW50ZXI7CisKKyAgLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiByZWZlcmVuY2VfIHJlZmVyZW5jZTsKKworICAvLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3JlZmVyZW5jZV8gY29uc3RfcmVmZXJlbmNlOworCitwdWJsaWM6CisKKyAgaW5saW5lCisgIGNvbnN0X3BvaW50X2l0ZXJhdG9yXyhjb25zdF9wb2ludGVyIHBfdmFsdWUpIDogbV9wX3ZhbHVlKHBfdmFsdWUpCisgIHsgfQorCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgIGlubGluZQorICBjb25zdF9wb2ludF9pdGVyYXRvcl8oKQorCisgICAgOiBtX3BfdmFsdWUoMCkKKyAgeyB9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIGNvbnN0X3BvaW50X2l0ZXJhdG9yXyhjb25zdCBjb25zdF9wb2ludF9pdGVyYXRvcl8mIG90aGVyKQorCisgICAgOiBtX3BfdmFsdWUob3RoZXIubV9wX3ZhbHVlKQorICB7IH0KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBpbmxpbmUKKyAgY29uc3RfcG9pbnRfaXRlcmF0b3JfKGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpCisKKyAgICA6IG1fcF92YWx1ZShvdGhlci5tX3BfdmFsdWUpCisgIHsgfQorCisgIC8vIEFjY2Vzcy4KKyAgaW5saW5lIGNvbnN0X3BvaW50ZXIKKyAgb3BlcmF0b3ItPigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX3ZhbHVlICE9IDApOworCisgICAgcmV0dXJuIChtX3BfdmFsdWUpOworICB9CisKKyAgLy8gQWNjZXNzLgorICBpbmxpbmUgY29uc3RfcmVmZXJlbmNlCisgIG9wZXJhdG9yKigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQobV9wX3ZhbHVlICE9IDApOworCisgICAgcmV0dXJuICgqbV9wX3ZhbHVlKTsKKyAgfQorCisgIC8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKG1fcF92YWx1ZSA9PSBvdGhlci5tX3BfdmFsdWUpOworICB9CisKKyAgLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiAobV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZSk7CisgIH0KKworICAvLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiAobV9wX3ZhbHVlICE9IG90aGVyLm1fcF92YWx1ZSk7CisgIH0KKworICAvLyBDb21wYXJlcyBjb250ZW50IChuZWdhdGl2ZWx5KSB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiAobV9wX3ZhbHVlICE9IG90aGVyLm1fcF92YWx1ZSk7CisgIH0KKworcHJvdGVjdGVkOgorICBjb25zdF9wb2ludGVyIG1fcF92YWx1ZTsKKworICBmcmllbmQgY2xhc3MgcG9pbnRfaXRlcmF0b3JfOworCisgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKK307CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhYTY4MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTUwIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBpdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yXyBjbGFzcyB1c2VkIGZvciByYW5naW5nIG92ZXIgdGhlIGVsZW1lbnRzIG9mIHRoZQorICogICAgdGFibGUuCisgKi8KKworLy8gUmFuZ2UtdHlwZSBpdGVyYXRvci4KK2NsYXNzIGl0ZXJhdG9yXyA6IAorICBwdWJsaWMgY29uc3RfaXRlcmF0b3JfCisKK3sKKworcHVibGljOgorCisgIC8vIENhdGVnb3J5LgorICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgLy8gRGlmZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKworICAvLyBJdGVyYXRvcidzIHZhbHVlIHR5cGUuCisgIHR5cGVkZWYgdmFsdWVfdHlwZV8gdmFsdWVfdHlwZTsKKworICAvLyBJdGVyYXRvcidzIHBvaW50ZXIgdHlwZS4KKyAgdHlwZWRlZiBwb2ludGVyXyBwb2ludGVyOworCisgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3BvaW50ZXJfIGNvbnN0X3BvaW50ZXI7CisKKyAgLy8gSXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZS4KKyAgdHlwZWRlZiByZWZlcmVuY2VfIHJlZmVyZW5jZTsKKworICAvLyBJdGVyYXRvcidzIGNvbnN0IHJlZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIGNvbnN0X3JlZmVyZW5jZV8gY29uc3RfcmVmZXJlbmNlOworCitwdWJsaWM6CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgaW5saW5lCisgIGl0ZXJhdG9yXygpCisKKyAgICA6IGNvbnN0X2l0ZXJhdG9yXygwLCBQQl9EU19HRU5fUE9TKCksIDApCisgIHsgfQorCisgIC8vIENvbnZlcnNpb24gdG8gYSBwb2ludC10eXBlIGl0ZXJhdG9yLgorICBpbmxpbmUKKyAgb3BlcmF0b3IgcG9pbnRfaXRlcmF0b3JfKCkKKyAgeworICAgIHJldHVybiAocG9pbnRfaXRlcmF0b3JfKAorCQkJICAgIGNvbnN0X2Nhc3Q8cG9pbnRlcj4oY29uc3RfaXRlcmF0b3JfOjptX3BfdmFsdWUpKSk7CisgIH0KKworICAvLyBDb252ZXJzaW9uIHRvIGEgcG9pbnQtdHlwZSBpdGVyYXRvci4KKyAgaW5saW5lCisgIG9wZXJhdG9yIGNvbnN0IHBvaW50X2l0ZXJhdG9yXygpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKHBvaW50X2l0ZXJhdG9yXygKKwkJCSAgICBjb25zdF9jYXN0PHBvaW50ZXI+KGNvbnN0X2l0ZXJhdG9yXzo6bV9wX3ZhbHVlKSkpOworICB9CisKKyAgLy8gQWNjZXNzLgorICBpbmxpbmUgcG9pbnRlcgorICBvcGVyYXRvci0+KCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChiYXNlX3R5cGU6Om1fcF92YWx1ZSAhPSAwKTsKKworICAgIHJldHVybiAoY29uc3RfY2FzdDxwb2ludGVyPihiYXNlX3R5cGU6Om1fcF92YWx1ZSkpOworICB9CisKKyAgLy8gQWNjZXNzLgorICBpbmxpbmUgcmVmZXJlbmNlCisgIG9wZXJhdG9yKigpIGNvbnN0CisgIHsKKyAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoYmFzZV90eXBlOjptX3BfdmFsdWUgIT0gMCk7CisKKyAgICByZXR1cm4gKGNvbnN0X2Nhc3Q8cmVmZXJlbmNlPigqYmFzZV90eXBlOjptX3BfdmFsdWUpKTsKKyAgfQorCisgIC8vIEluY3JlbWVudHMuCisgIGlubGluZSBpdGVyYXRvcl8mIAorICBvcGVyYXRvcisrKCkKKyAgeworICAgIGJhc2VfdHlwZTo6bV9wX3RibC0+aW5jX2l0X3N0YXRlKGJhc2VfdHlwZTo6bV9wX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcG9zKTsKKworICAgIHJldHVybiAoKnRoaXMpOworICB9CisKKyAgLy8gSW5jcmVtZW50cy4KKyAgaW5saW5lIGl0ZXJhdG9yXworICBvcGVyYXRvcisrKGludCkKKyAgeworICAgIGl0ZXJhdG9yXyByZXQgPSogdGhpczsKKworICAgIGJhc2VfdHlwZTo6bV9wX3RibC0+aW5jX2l0X3N0YXRlKGJhc2VfdHlwZTo6bV9wX3ZhbHVlLCBiYXNlX3R5cGU6Om1fcG9zKTsKKworICAgIHJldHVybiAocmV0KTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3JfIGJhc2VfdHlwZTsKKworcHJvdGVjdGVkOgorCisgIC8qKgorICAgKiAgQ29uc3RydWN0b3IgdXNlZCBieSB0aGUgdGFibGUgdG8gaW5pdGlhdGUgdGhlIGdlbmVyYWxpemVkCisgICAqICAgICAgcG9pbnRlciBhbmQgcG9zaXRpb24gKGUuZy4sIHRoaXMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgZmluZCgpCisgICAqICAgICAgb2YgYSB0YWJsZS4KKyAgICogKi8KKyAgaW5saW5lCisgIGl0ZXJhdG9yXyhwb2ludGVyIHBfdmFsdWUsIFBCX0RTX0dFTl9QT1MgcG9zLCBQQl9EU19DTEFTU19DX0RFQyogcF90YmwpIDogY29uc3RfaXRlcmF0b3JfKHBfdmFsdWUsIHBvcywgcF90YmwpCisgIHsgfQorCisgIGZyaWVuZCBjbGFzcyBQQl9EU19DTEFTU19DX0RFQzsKK307CisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfaXRlcmF0b3IuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZGV0YWlsL3Vub3JkZXJlZF9pdGVyYXRvci9wb2ludF9pdGVyYXRvci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3YTViZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2RldGFpbC91bm9yZGVyZWRfaXRlcmF0b3IvcG9pbnRfaXRlcmF0b3IuaHBwCkBAIC0wLDAgKzEsMTQzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBwb2ludF9pdGVyYXRvci5ocHAKKyAqIENvbnRhaW5zIGFuIGl0ZXJhdG9yIGNsYXNzIHJldHVybmVkIGJ5IHRoZSB0YWJsZXMnIGZpbmQgYW5kIGluc2VydAorICogICAgIG1ldGhvZHMuCisgKi8KKworLy8gRmluZCB0eXBlIGl0ZXJhdG9yLgorY2xhc3MgcG9pbnRfaXRlcmF0b3JfCit7CisKK3B1YmxpYzoKKworICAvLyBDYXRlZ29yeS4KKyAgdHlwZWRlZiB0cml2aWFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAvLyBEaWZmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgdHJpdmlhbF9pdGVyYXRvcl9kaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworCisgIC8vIEl0ZXJhdG9yJ3MgdmFsdWUgdHlwZS4KKyAgdHlwZWRlZiB2YWx1ZV90eXBlXyB2YWx1ZV90eXBlOworCisgIC8vIEl0ZXJhdG9yJ3MgcG9pbnRlciB0eXBlLgorICB0eXBlZGVmIHBvaW50ZXJfIHBvaW50ZXI7CisKKyAgLy8gSXRlcmF0b3IncyBjb25zdCBwb2ludGVyIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcG9pbnRlcl8gY29uc3RfcG9pbnRlcjsKKworICAvLyBJdGVyYXRvcidzIHJlZmVyZW5jZSB0eXBlLgorICB0eXBlZGVmIHJlZmVyZW5jZV8gcmVmZXJlbmNlOworCisgIC8vIEl0ZXJhdG9yJ3MgY29uc3QgcmVmZXJlbmNlIHR5cGUuCisgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlXyBjb25zdF9yZWZlcmVuY2U7CisKK3B1YmxpYzoKKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBpbmxpbmUKKyAgcG9pbnRfaXRlcmF0b3JfKCkKKworICAgIDogbV9wX3ZhbHVlKDApCisgIHsgfQorCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIGlubGluZQorICBwb2ludF9pdGVyYXRvcl8oY29uc3QgcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikKKworICAgIDogbV9wX3ZhbHVlKG90aGVyLm1fcF92YWx1ZSkKKyAgeyB9CisKKyAgLy8gQWNjZXNzLgorICBpbmxpbmUgcG9pbnRlcgorICBvcGVyYXRvci0+KCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfdmFsdWUgIT0gMCk7CisKKyAgICByZXR1cm4gKG1fcF92YWx1ZSk7CisgIH0KKworICAvLyBBY2Nlc3MuCisgIGlubGluZSByZWZlcmVuY2UKKyAgb3BlcmF0b3IqKCkgY29uc3QKKyAgeworICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChtX3BfdmFsdWUgIT0gMCk7CisKKyAgICByZXR1cm4gKCptX3BfdmFsdWUpOworICB9CisKKyAgLy8gQ29tcGFyZXMgY29udGVudCB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBvYmplY3QuCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgcG9pbnRfaXRlcmF0b3JfJiBvdGhlcikgY29uc3QKKyAgeworICAgIHJldHVybiAobV9wX3ZhbHVlID09IG90aGVyLm1fcF92YWx1ZSk7CisgIH0KKworICAvLyBDb21wYXJlcyBjb250ZW50IHRvIGEgZGlmZmVyZW50IGl0ZXJhdG9yIG9iamVjdC4KKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBjb25zdF9wb2ludF9pdGVyYXRvcl8mIG90aGVyKSBjb25zdAorICB7CisgICAgcmV0dXJuIChtX3BfdmFsdWUgPT0gb3RoZXIubV9wX3ZhbHVlKTsKKyAgfQorCisgIC8vIENvbXBhcmVzIGNvbnRlbnQgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IHBvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKG1fcF92YWx1ZSAhPSBvdGhlci5tX3BfdmFsdWUpOworICB9CisKKyAgLy8gQ29tcGFyZXMgY29udGVudCAobmVnYXRpdmVseSkgdG8gYSBkaWZmZXJlbnQgaXRlcmF0b3Igb2JqZWN0LgorICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X3BvaW50X2l0ZXJhdG9yXyYgb3RoZXIpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKG1fcF92YWx1ZSAhPSBvdGhlci5tX3BfdmFsdWUpOworICB9CisKKyAgaW5saW5lCisgIHBvaW50X2l0ZXJhdG9yXyhwb2ludGVyIHBfdmFsdWUpIDogbV9wX3ZhbHVlKHBfdmFsdWUpCisgIHsgfQorCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBjb25zdF9wb2ludF9pdGVyYXRvcl87CisKKyAgZnJpZW5kIGNsYXNzIFBCX0RTX0NMQVNTX0NfREVDOworCitwcm90ZWN0ZWQ6CisgIHBvaW50ZXIgbV9wX3ZhbHVlOworfTsKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvZXhjZXB0aW9uLmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0ZTNlZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBleGNlcHRpb24uaHBwCisgKiBDb250YWlucyBleGNlcHRpb24gY2xhc3Nlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0VYQ0VQVElPTl9IUFAKKyNkZWZpbmUgUEJfRFNfRVhDRVBUSU9OX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8gQmFzZSBjbGFzcyBmb3IgZXhjZXB0aW9ucy4KKyAgc3RydWN0IGNvbnRhaW5lcl9lcnJvciA6IHB1YmxpYyBzdGQ6OmxvZ2ljX2Vycm9yCisgIHsKKyAgICBjb250YWluZXJfZXJyb3IoKSAKKyAgICA6IHN0ZDo6bG9naWNfZXJyb3IoX19OKCJfX2dudV9wYmRzOjpjb250YWluZXJfZXJyb3IiKSkgeyB9CisgIH07CisKKyAgLy8gQW4gZW50cnkgY2Fubm90IGJlIGluc2VydGVkIGludG8gYSBjb250YWluZXIgb2JqZWN0IGZvciBsb2dpY2FsCisgIC8vIHJlYXNvbnMgKG5vdCwgZS5nLiwgaWYgbWVtb3J5IGlzIHVuYWJ2YWlsYWJsZSwgaW4gd2hpY2ggY2FzZQorICAvLyB0aGUgYWxsb2NhdG9yX3R5cGUncyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24pLgorICBzdHJ1Y3QgaW5zZXJ0X2Vycm9yIDogcHVibGljIGNvbnRhaW5lcl9lcnJvciB7IH07CisKKyAgLy8gQSBqb2luIGNhbm5vdCBiZSBwZXJmb3JtZWQgbG9naWNhbCByZWFzb25zIChpLmUuLCB0aGUgcmFuZ2VzIG9mCisgIC8vIHRoZSB0d28gY29udGFpbmVyIG9iamVjdHMgYmVpbmcgam9pbmVkIG92ZXJsYXBzLgorICBzdHJ1Y3Qgam9pbl9lcnJvciA6IHB1YmxpYyBjb250YWluZXJfZXJyb3IgeyB9OworCisgIC8vIEEgY29udGFpbmVyIGNhbm5vdCBiZSByZXNpemVkLgorICBzdHJ1Y3QgcmVzaXplX2Vycm9yIDogcHVibGljIGNvbnRhaW5lcl9lcnJvciB7IH07CisKKyNpZiBfX0VYQ0VQVElPTlMKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19jb250YWluZXJfZXJyb3Iodm9pZCkKKyAgeyB0aHJvdyBjb250YWluZXJfZXJyb3IoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfaW5zZXJ0X2Vycm9yKHZvaWQpCisgIHsgdGhyb3cgaW5zZXJ0X2Vycm9yKCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2pvaW5fZXJyb3Iodm9pZCkKKyAgeyB0aHJvdyBqb2luX2Vycm9yKCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3Rocm93X3Jlc2l6ZV9lcnJvcih2b2lkKQorICB7IHRocm93IHJlc2l6ZV9lcnJvcigpOyB9CisjZWxzZQorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2NvbnRhaW5lcl9lcnJvcih2b2lkKQorICB7IHN0ZDo6YWJvcnQoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfaW5zZXJ0X2Vycm9yKHZvaWQpCisgIHsgc3RkOjphYm9ydCgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19qb2luX2Vycm9yKHZvaWQpCisgIHsgc3RkOjphYm9ydCgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190aHJvd19yZXNpemVfZXJyb3Iodm9pZCkKKyAgeyBzdGQ6OmFib3J0KCk7IH0KKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JjODZlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvaGFzaF9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsNjA1IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSBoYXNoX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIGhhc2gtcmVsYXRlZCBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX0hBU0hfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19IQVNIX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZXhjZXB0aW9uLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tYXNrX2Jhc2VkX3JhbmdlX2hhc2hpbmcuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9tb2RfYmFzZWRfcmFuZ2VfaGFzaGluZy5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9zaXplX2Jhc2UuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLyBBIG51bGwgaGFzaCBmdW5jdGlvbiwgaW5kaWNhdGluZyB0aGF0IHRoZSBjb21iaW5pbmcgaGFzaCBmdW5jdGlvbgorICAvLyBpcyBhY3R1YWxseSBhIHJhbmdlZCBoYXNoIGZ1bmN0aW9uLgorICBzdHJ1Y3QgbnVsbF9oYXNoX2ZuCisgIHsgfTsKKworICAvLyBBIG51bGwgcHJvYmUgZnVuY3Rpb24sIGluZGljYXRpbmcgdGhhdCB0aGUgY29tYmluaW5nIHByb2JlCisgIC8vIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGEgcmFuZ2VkIHByb2JlIGZ1bmN0aW9uLgorICBzdHJ1Y3QgbnVsbF9wcm9iZV9mbgorICB7IH07CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBsaW5lYXJfcHJvYmVfZm48U2l6ZV9UeXBlPgorCisgIC8vIEEgcHJvYmUgc2VxdWVuY2UgcG9saWN5IHVzaW5nIGZpeGVkIGluY3JlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBsaW5lYXJfcHJvYmVfZm4KKyAgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBTaXplX1R5cGUgc2l6ZV90eXBlOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gUmV0dXJucyB0aGUgaS10aCBvZmZzZXQgZnJvbSB0aGUgaGFzaCB2YWx1ZS4KKyAgICBpbmxpbmUgc2l6ZV90eXBlCisgICAgb3BlcmF0b3IoKShzaXplX3R5cGUgaSkgY29uc3Q7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vbGluZWFyX3Byb2JlX2ZuX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBxdWFkcmF0aWNfcHJvYmVfZm48U2l6ZV9UeXBlPgorCisgIC8vIEEgcHJvYmUgc2VxdWVuY2UgcG9saWN5IHVzaW5nIHNxdWFyZSBpbmNyZW1lbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgcXVhZHJhdGljX3Byb2JlX2ZuCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgU2l6ZV9UeXBlIHNpemVfdHlwZTsKKworICAgIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFJldHVybnMgdGhlIGktdGggb2Zmc2V0IGZyb20gdGhlIGhhc2ggdmFsdWUuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGkpIGNvbnN0OworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9oYXNoX2ZuL3F1YWRyYXRpY19wcm9iZV9mbl9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgZGlyZWN0X21hc2tfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+CisKKyAgLy8gQSBtYXNrIHJhbmdlLWhhc2hpbmcgY2xhc3MgKHVzZXMgYSBiaXQtbWFzaykuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBkaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nIAorICA6IHB1YmxpYyBkZXRhaWw6Om1hc2tfYmFzZWRfcmFuZ2VfaGFzaGluZzxTaXplX1R5cGU+CisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIGRldGFpbDo6bWFza19iYXNlZF9yYW5nZV9oYXNoaW5nPFNpemVfVHlwZT4gbWFza19iYXNlZF9iYXNlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICB2b2lkCisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpOworCisgICAgLy8gVHJhbnNmb3JtcyB0aGUgX19oYXNoIHZhbHVlIGhhc2ggaW50byBhIHJhbmdlZC1oYXNoIHZhbHVlCisgICAgLy8gKHVzaW5nIGEgYml0LW1hc2spLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcGVyYXRvcigpKHNpemVfdHlwZSBoYXNoKSBjb25zdDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvaGFzaF9mbi9kaXJlY3RfbWFza19yYW5nZV9oYXNoaW5nX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBkaXJlY3RfbW9kX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPgorCisgIC8vIEEgbW9kIHJhbmdlLWhhc2hpbmcgY2xhc3MgKHVzZXMgdGhlIG1vZHVsbyBmdW5jdGlvbikuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBkaXJlY3RfbW9kX3JhbmdlX2hhc2hpbmcgCisgIDogcHVibGljIGRldGFpbDo6bW9kX2Jhc2VkX3JhbmdlX2hhc2hpbmc8U2l6ZV9UeXBlPgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisgICAgICAKKyAgICB2b2lkCisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIHNpemUpOworICAgICAgCisgICAgLy8gVHJhbnNmb3JtcyB0aGUgX19oYXNoIHZhbHVlIGhhc2ggaW50byBhIHJhbmdlZC1oYXNoIHZhbHVlCisgICAgLy8gKHVzaW5nIGEgbW9kdWxvIG9wZXJhdGlvbikuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9wZXJhdG9yKCkoc2l6ZV90eXBlIGhhc2gpIGNvbnN0OworICAgICAgCisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBkZXRhaWw6Om1vZF9iYXNlZF9yYW5nZV9oYXNoaW5nPHNpemVfdHlwZT4gbW9kX2Jhc2VkX2Jhc2U7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2hhc2hfZm4vZGlyZWN0X21vZF9yYW5nZV9oYXNoaW5nX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8Ym9vbCBFeHRlcm5hbF9Mb2FkX0FjY2VzcywgdHlwZW5hbWUgU2l6ZV9UeXBlPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXI8RXh0ZXJuYWxfTG9hZF9BY2Nlc3MsIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfU0laRV9CQVNFX0NfREVDIGRldGFpbDo6aGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyX3NpemVfYmFzZTxTaXplX1R5cGUsIEV4dGVybmFsX0xvYWRfQWNjZXNzPgorCisgIC8vIEEgcmVzaXplIHRyaWdnZXIgcG9saWN5IGJhc2VkIG9uIGEgbG9hZCBjaGVjay4gSXQga2VlcHMgdGhlCisgIC8vIGxvYWQgZmFjdG9yIGJldHdlZW4gc29tZSBsb2FkIGZhY3RvcnMgbG9hZF9taW4gYW5kIGxvYWRfbWF4LgorICB0ZW1wbGF0ZTxib29sIEV4dGVybmFsX0xvYWRfQWNjZXNzID0gZmFsc2UsIHR5cGVuYW1lIFNpemVfVHlwZSA9IHN0ZDo6c2l6ZV90PgorICBjbGFzcyBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXIgOiBwcml2YXRlIFBCX0RTX1NJWkVfQkFTRV9DX0RFQworICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICBlbnVtCisgICAgICB7CisJZXh0ZXJuYWxfbG9hZF9hY2Nlc3MgPSBFeHRlcm5hbF9Mb2FkX0FjY2VzcworICAgICAgfTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IsIG9yIGNvbnN0cnVjdG9yIHRha2luZyBsb2FkX21pbiBhbmQKKyAgICAvLyBsb2FkX21heCBsb2FkIGZhY3RvcnMgYmV0d2VlbiB3aGljaCB0aGlzIHBvbGljeSB3aWxsIGtlZXAgdGhlCisgICAgLy8gYWN0dWFsIGxvYWQuCisgICAgaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKGZsb2F0IGxvYWRfbWluID0gMC4xMjUsCisJCQkJICAgZmxvYXQgbG9hZF9tYXggPSAwLjUpOworCisgICAgdm9pZAorICAgIHN3YXAoaGFzaF9sb2FkX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyJiBvdGhlcik7CisKKyAgICB2aXJ0dWFsCisgICAgfmhhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcigpOworCisgICAgLy8gUmV0dXJucyBhIHBhaXIgb2YgdGhlIG1pbmltYWwgYW5kIG1heGltYWwgbG9hZHMsIHJlc3BlY3RpdmVseS4KKyAgICBpbmxpbmUgc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4KKyAgICBnZXRfbG9hZHMoKSBjb25zdDsKKworICAgIC8vIFNldHMgdGhlIGxvYWRzIHRocm91Z2ggYSBwYWlyIG9mIHRoZSBtaW5pbWFsIGFuZCBtYXhpbWFsCisgICAgLy8gbG9hZHMsIHJlc3BlY3RpdmVseS4KKyAgICB2b2lkCisgICAgc2V0X2xvYWRzKHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IGxvYWRfcGFpcik7CisKKyAgcHJvdGVjdGVkOgorICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfc3RhcnQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfc3RhcnQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfZW5kKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfc3RhcnQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9lbmQoKTsKKworICAgIC8vIE5vdGlmaWVzIGFuIGVsZW1lbnQgd2FzIGluc2VydGVkLiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMKKyAgICAvLyBpbiB0aGUgdGFibGUgaXMgbnVtX2VudHJpZXMuCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lbnRyaWVzKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgLy8gTm90aWZpZXMgdGhlIHRhYmxlIHdhcyBjbGVhcmVkLgorICAgIHZvaWQKKyAgICBub3RpZnlfY2xlYXJlZCgpOworCisgICAgLy8gTm90aWZpZXMgdGhlIHRhYmxlIHdhcyByZXNpemVkIGFzIGEgcmVzdWx0IG9mIHRoaXMgb2JqZWN0J3MKKyAgICAvLyBzaWduaWZ5aW5nIHRoYXQgYSByZXNpemUgaXMgbmVlZGVkLgorICAgIHZvaWQKKyAgICBub3RpZnlfcmVzaXplZChzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgdm9pZAorICAgIG5vdGlmeV9leHRlcm5hbGx5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIGlubGluZSBib29sCisgICAgaXNfcmVzaXplX25lZWRlZCgpIGNvbnN0OworCisgICAgaW5saW5lIGJvb2wKKyAgICBpc19ncm93X25lZWRlZChzaXplX3R5cGUgc2l6ZSwgc2l6ZV90eXBlIG51bV9lbnRyaWVzKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZAorICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgdHlwZWRlZiBQQl9EU19TSVpFX0JBU0VfQ19ERUMgc2l6ZV9iYXNlOworCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyAgICB2b2lkCisgICAgYXNzZXJ0X3ZhbGlkKCkgY29uc3Q7CisjZW5kaWYgCisKKyAgICBmbG9hdCAJbV9sb2FkX21pbjsKKyAgICBmbG9hdCAJbV9sb2FkX21heDsKKyAgICBzaXplX3R5cGUgCW1fbmV4dF9zaHJpbmtfc2l6ZTsKKyAgICBzaXplX3R5cGUgCW1fbmV4dF9ncm93X3NpemU7CisgICAgYm9vbCAJbV9yZXNpemVfbmVlZGVkOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9yZXNpemVfcG9saWN5L2hhc2hfbG9hZF9jaGVja19yZXNpemVfdHJpZ2dlcl9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX1NJWkVfQkFTRV9DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIHRlbXBsYXRlPGJvb2wgRXh0ZXJuYWxfTG9hZF9BY2Nlc3MsIHR5cGVuYW1lIFNpemVfVHlwZT4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyPEV4dGVybmFsX0xvYWRfQWNjZXNzLCBTaXplX1R5cGU+CisKKyAgLy8gQSByZXNpemUgdHJpZ2dlciBwb2xpY3kgYmFzZWQgb24gY29sbGlzaW9uIGNoZWNrcy4gSXQga2VlcHMgdGhlCisgIC8vIHNpbXVsYXRlZCBsb2FkIGZhY3RvciBsb3dlciB0aGFuIHNvbWUgZ2l2ZW4gbG9hZCBmYWN0b3IuCisgIHRlbXBsYXRlPGJvb2wgRXh0ZXJuYWxfTG9hZF9BY2Nlc3MgPSBmYWxzZSwgdHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGNjX2hhc2hfbWF4X2NvbGxpc2lvbl9jaGVja19yZXNpemVfdHJpZ2dlcgorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICBlbnVtCisgICAgICB7CisJZXh0ZXJuYWxfbG9hZF9hY2Nlc3MgPSBFeHRlcm5hbF9Mb2FkX0FjY2VzcworICAgICAgfTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IsIG9yIGNvbnN0cnVjdG9yIHRha2luZyBsb2FkLCBhIF9fbG9hZAorICAgIC8vIGZhY3RvciB3aGljaCBpdCB3aWxsIGF0dGVtcHQgdG8gbWFpbnRhaW4uCisgICAgY2NfaGFzaF9tYXhfY29sbGlzaW9uX2NoZWNrX3Jlc2l6ZV90cmlnZ2VyKGZsb2F0IGxvYWQgPSAwLjUpOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgbG9hZC4KKyAgICBpbmxpbmUgZmxvYXQKKyAgICBnZXRfbG9hZCgpIGNvbnN0OworCisgICAgLy8gU2V0cyB0aGUgbG9hZDsgZG9lcyBub3QgcmVzaXplIHRoZSBjb250YWluZXIuCisgICAgdm9pZAorICAgIHNldF9sb2FkKGZsb2F0IGxvYWQpOworCisgIHByb3RlY3RlZDoKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9lbmQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2ZpbmRfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX3N0YXJ0KCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9lcmFzZV9zZWFyY2hfZW5kKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9pbnNlcnRlZChzaXplX3R5cGUgbnVtX2VudHJpZXMpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2VkKHNpemVfdHlwZSBudW1fZW50cmllcyk7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X2NsZWFyZWQoKTsKKworICAgIC8vIE5vdGlmaWVzIHRoZSB0YWJsZSB3YXMgcmVzaXplZCBhcyBhIHJlc3VsdCBvZiB0aGlzIG9iamVjdCdzCisgICAgLy8gc2lnbmlmeWluZyB0aGF0IGEgcmVzaXplIGlzIG5lZWRlZC4KKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIHZvaWQKKyAgICBub3RpZnlfZXh0ZXJuYWxseV9yZXNpemVkKHNpemVfdHlwZSBuZXdfc2l6ZSk7CisKKyAgICBpbmxpbmUgYm9vbAorICAgIGlzX3Jlc2l6ZV9uZWVkZWQoKSBjb25zdDsKKworICAgIGlubGluZSBib29sCisgICAgaXNfZ3Jvd19uZWVkZWQoc2l6ZV90eXBlIHNpemUsIHNpemVfdHlwZSBudW1fZW50cmllcykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkCisgICAgY2FsY19tYXhfbnVtX2NvbGwoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgY2FsY19yZXNpemVfbmVlZGVkKCk7CisKKyAgICBmbG9hdCAJbV9sb2FkOworICAgIHNpemVfdHlwZSAJbV9zaXplOworICAgIHNpemVfdHlwZSAJbV9udW1fY29sOworICAgIHNpemVfdHlwZSAJbV9tYXhfY29sOworICAgIGJvb2wgCW1fcmVzaXplX25lZWRlZDsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9jY19oYXNoX21heF9jb2xsaXNpb25fY2hlY2tfcmVzaXplX3RyaWdnZXJfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGU+CisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGhhc2hfZXhwb25lbnRpYWxfc2l6ZV9wb2xpY3k8U2l6ZV9UeXBlPgorCisgIC8vIEEgc2l6ZSBwb2xpY3kgd2hvc2Ugc2VxdWVuY2Ugb2Ygc2l6ZXMgZm9ybSBhbiBleHBvbmVudGlhbAorICAvLyBzZXF1ZW5jZSAodHlwaWNhbGx5IHBvd2VycyBvZiAyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaXplX1R5cGUgPSBzdGQ6OnNpemVfdD4KKyAgY2xhc3MgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSBzaXplX3R5cGU7CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLCBvciBvbnN0cnVjdG9yIHRha2luZyBhIHN0YXJ0X3NpemUsIG9yCisgICAgLy8gY29uc3RydWN0b3IgdGFraW5nIGEgc3RhcnQgc2l6ZSBhbmQgZ3Jvd19mYWN0b3IuIFRoZSBwb2xpY3kKKyAgICAvLyB3aWxsIHVzZSB0aGUgc2VxdWVuY2Ugb2Ygc2l6ZXMgc3RhcnRfc2l6ZSwgc3RhcnRfc2l6ZSoKKyAgICAvLyBncm93X2ZhY3Rvciwgc3RhcnRfc2l6ZSogZ3Jvd19mYWN0b3JeMiwgLi4uCisgICAgaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeShzaXplX3R5cGUgc3RhcnRfc2l6ZSA9IDgsCisJCQkJIHNpemVfdHlwZSBncm93X2ZhY3RvciA9IDIpOworCisgICAgdm9pZAorICAgIHN3YXAoUEJfRFNfQ0xBU1NfQ19ERUMmIG90aGVyKTsKKworICBwcm90ZWN0ZWQ6CisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25lYXJlc3RfbGFyZ2VyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25lYXJlc3Rfc21hbGxlcl9zaXplKHNpemVfdHlwZSBzaXplKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHNpemVfdHlwZSBtX3N0YXJ0X3NpemU7CisgICAgc2l6ZV90eXBlIG1fZ3Jvd19mYWN0b3I7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3Jlc2l6ZV9wb2xpY3kvaGFzaF9leHBvbmVudGlhbF9zaXplX3BvbGljeV9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIGhhc2hfcHJpbWVfc2l6ZV9wb2xpY3kKKworICAvLyBBIHNpemUgcG9saWN5IHdob3NlIHNlcXVlbmNlIG9mIHNpemVzIGZvcm0gYSBuZWFybHktZXhwb25lbnRpYWwKKyAgLy8gc2VxdWVuY2Ugb2YgcHJpbWVzLgorICBjbGFzcyBoYXNoX3ByaW1lX3NpemVfcG9saWN5CisgIHsKKyAgcHVibGljOgorICAgIC8vIFNpemUgdHlwZS4KKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IsIG9yIG9uc3RydWN0b3IgdGFraW5nIGEgc3RhcnRfc2l6ZSBUaGUKKyAgICAvLyBwb2xpY3kgd2lsbCB1c2UgdGhlIHNlcXVlbmNlIG9mIHNpemVzIGFwcHJveGltYXRlbHkKKyAgICAvLyBzdGFydF9zaXplLCBzdGFydF9zaXplKiAyLCBzdGFydF9zaXplKiAyXjIsIC4uLgorICAgIGhhc2hfcHJpbWVfc2l6ZV9wb2xpY3koc2l6ZV90eXBlIHN0YXJ0X3NpemUgPSA4KTsKKworICAgIGlubGluZSB2b2lkCisgICAgc3dhcChQQl9EU19DTEFTU19DX0RFQyYgb3RoZXIpOworCisgIHByb3RlY3RlZDoKKyAgICBzaXplX3R5cGUKKyAgICBnZXRfbmVhcmVzdF9sYXJnZXJfc2l6ZShzaXplX3R5cGUgc2l6ZSkgY29uc3Q7CisKKyAgICBzaXplX3R5cGUKKyAgICBnZXRfbmVhcmVzdF9zbWFsbGVyX3NpemUoc2l6ZV90eXBlIHNpemUpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgc2l6ZV90eXBlIG1fc3RhcnRfc2l6ZTsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3ByaW1lX3NpemVfcG9saWN5X2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9Qb2xpY3ksIHR5cGVuYW1lIFRyaWdnZXJfUG9saWN5LCBib29sIEV4dGVybmFsX1NpemVfQWNjZXNzLCB0eXBlbmFtZSBTaXplX1R5cGU+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5PFNpemVfUG9saWN5LCBUcmlnZ2VyX1BvbGljeSwgRXh0ZXJuYWxfU2l6ZV9BY2Nlc3MsIFNpemVfVHlwZT4KKworICAvLyBBIHJlc2l6ZSBwb2xpY3kgd2hpY2ggZGVsZWdhdGVzIG9wZXJhdGlvbnMgdG8gc2l6ZSBhbmQgdHJpZ2dlciBwb2xpY2llcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgU2l6ZV9Qb2xpY3kgPSBoYXNoX2V4cG9uZW50aWFsX3NpemVfcG9saWN5PD4sCisJICAgdHlwZW5hbWUgVHJpZ2dlcl9Qb2xpY3kgPSBoYXNoX2xvYWRfY2hlY2tfcmVzaXplX3RyaWdnZXI8PiwKKwkgICBib29sIEV4dGVybmFsX1NpemVfQWNjZXNzID0gZmFsc2UsCisJICAgdHlwZW5hbWUgU2l6ZV9UeXBlID0gc3RkOjpzaXplX3Q+CisgIGNsYXNzIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeSAKKyAgOiBwdWJsaWMgU2l6ZV9Qb2xpY3ksIHB1YmxpYyBUcmlnZ2VyX1BvbGljeQorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFNpemVfVHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIFRyaWdnZXJfUG9saWN5IAl0cmlnZ2VyX3BvbGljeTsKKyAgICB0eXBlZGVmIFNpemVfUG9saWN5IAlzaXplX3BvbGljeTsKKworICAgIGVudW0KKyAgICAgIHsKKwlleHRlcm5hbF9zaXplX2FjY2VzcyA9IEV4dGVybmFsX1NpemVfQWNjZXNzCisgICAgICB9OworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBoYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3koKTsKKworICAgIC8vIGNvbnN0cnVjdG9yIHRha2luZyBzb21lIHBvbGljaWVzIHJfc2l6ZV9wb2xpY3kgd2lsbCBiZSBjb3BpZWQKKyAgICAvLyBieSB0aGUgU2l6ZV9Qb2xpY3kgb2JqZWN0IG9mIHRoaXMgb2JqZWN0LgorICAgIGhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeShjb25zdCBTaXplX1BvbGljeSYgcl9zaXplX3BvbGljeSk7CisKKyAgICAvLyBjb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY2llcy4gcl9zaXplX3BvbGljeSB3aWxsIGJlCisgICAgLy8gY29waWVkIGJ5IHRoZSBTaXplX1BvbGljeSBvYmplY3Qgb2YgdGhpcworICAgIC8vIG9iamVjdC4gcl90cmlnZ2VyX3BvbGljeSB3aWxsIGJlIGNvcGllZCBieSB0aGUgVHJpZ2dlcl9Qb2xpY3kKKyAgICAvLyBvYmplY3Qgb2YgdGhpcyBvYmplY3QuCisgICAgaGFzaF9zdGFuZGFyZF9yZXNpemVfcG9saWN5KGNvbnN0IFNpemVfUG9saWN5JiByX3NpemVfcG9saWN5LCAKKwkJCQljb25zdCBUcmlnZ2VyX1BvbGljeSYgcl90cmlnZ2VyX3BvbGljeSk7CisKKyAgICB2aXJ0dWFsCisgICAgfmhhc2hfc3RhbmRhcmRfcmVzaXplX3BvbGljeSgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKFBCX0RTX0NMQVNTX0NfREVDJiBvdGhlcik7CisKKyAgICAvLyBBY2Nlc3MgdG8gdGhlIFNpemVfUG9saWN5IG9iamVjdCB1c2VkLgorICAgIFNpemVfUG9saWN5JiAKKyAgICBnZXRfc2l6ZV9wb2xpY3koKTsKKworICAgIC8vIENvbnN0IGFjY2VzcyB0byB0aGUgU2l6ZV9Qb2xpY3kgb2JqZWN0IHVzZWQuCisgICAgY29uc3QgU2l6ZV9Qb2xpY3kmIAorICAgIGdldF9zaXplX3BvbGljeSgpIGNvbnN0OworCisgICAgLy8gQWNjZXNzIHRvIHRoZSBUcmlnZ2VyX1BvbGljeSBvYmplY3QgdXNlZC4KKyAgICBUcmlnZ2VyX1BvbGljeSYgCisgICAgZ2V0X3RyaWdnZXJfcG9saWN5KCk7CisKKyAgICAvLyBBY2Nlc3MgdG8gdGhlIFRyaWdnZXJfUG9saWN5IG9iamVjdCB1c2VkLgorICAgIGNvbnN0IFRyaWdnZXJfUG9saWN5JiAKKyAgICBnZXRfdHJpZ2dlcl9wb2xpY3koKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb250YWluZXIuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIGdldF9hY3R1YWxfc2l6ZSgpIGNvbnN0OworCisgICAgLy8gUmVzaXplcyB0aGUgY29udGFpbmVyIHRvIHN1Z2dlc3RlZF9uZXdfc2l6ZSwgYSBzdWdnZXN0ZWQgc2l6ZQorICAgIC8vICh0aGUgYWN0dWFsIHNpemUgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBTaXplX1BvbGljeQorICAgIC8vIG9iamVjdCkuCisgICAgdm9pZAorICAgIHJlc2l6ZShzaXplX3R5cGUgc3VnZ2VzdGVkX25ld19zaXplKTsKKworICBwcm90ZWN0ZWQ6CisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9zdGFydCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0X3NlYXJjaF9jb2xsaXNpb24oKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2luc2VydF9zZWFyY2hfZW5kKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9zdGFydCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZmluZF9zZWFyY2hfY29sbGlzaW9uKCk7CisKKyAgICBpbmxpbmUgdm9pZAorICAgIG5vdGlmeV9maW5kX3NlYXJjaF9lbmQoKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlX3NlYXJjaF9zdGFydCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2NvbGxpc2lvbigpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfZXJhc2Vfc2VhcmNoX2VuZCgpOworCisgICAgaW5saW5lIHZvaWQKKyAgICBub3RpZnlfaW5zZXJ0ZWQoc2l6ZV90eXBlIG51bV9lKTsKKworICAgIGlubGluZSB2b2lkCisgICAgbm90aWZ5X2VyYXNlZChzaXplX3R5cGUgbnVtX2UpOworCisgICAgdm9pZAorICAgIG5vdGlmeV9jbGVhcmVkKCk7CisKKyAgICB2b2lkCisgICAgbm90aWZ5X3Jlc2l6ZWQoc2l6ZV90eXBlIG5ld19zaXplKTsKKworICAgIGlubGluZSBib29sCisgICAgaXNfcmVzaXplX25lZWRlZCgpIGNvbnN0OworCisgICAgLy8gUXVlcmllcyB3aGF0IHRoZSBuZXcgc2l6ZSBzaG91bGQgYmUsIHdoZW4gdGhlIGNvbnRhaW5lciBpcworICAgIC8vIHJlc2l6ZWQgbmF0dXJhbGx5LiBUaGUgY3VycmVudCBfX3NpemUgb2YgdGhlIGNvbnRhaW5lciBpcworICAgIC8vIHNpemUsIGFuZCB0aGUgbnVtYmVyIG9mIHVzZWQgZW50cmllcyB3aXRoaW4gdGhlIGNvbnRhaW5lciBpcworICAgIC8vIG51bV91c2VkX2UuCisgICAgc2l6ZV90eXBlCisgICAgZ2V0X25ld19zaXplKHNpemVfdHlwZSBzaXplLCBzaXplX3R5cGUgbnVtX3VzZWRfZSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBSZXNpemVzIHRvIG5ld19zaXplLgorICAgIHZpcnR1YWwgdm9pZAorICAgIGRvX3Jlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpOworCisgICAgdHlwZWRlZiBUcmlnZ2VyX1BvbGljeSB0cmlnZ2VyX3BvbGljeV9iYXNlOworCisgICAgdHlwZWRlZiBTaXplX1BvbGljeSBzaXplX3BvbGljeV9iYXNlOworCisgICAgc2l6ZV90eXBlIG1fc2l6ZTsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvcmVzaXplX3BvbGljeS9oYXNoX3N0YW5kYXJkX3Jlc2l6ZV9wb2xpY3lfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9saXN0X3VwZGF0ZV9wb2xpY3kuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE2N2M2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcApAQCAtMCwwICsxLDEzOSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIGxpc3RfdXBkYXRlX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIHBvbGljaWVzIGZvciBsaXN0IHVwZGF0ZSBjb250YWluZXJzLgorICovCisKKyNpZm5kZWYgUEJfRFNfTFVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19MVV9QT0xJQ1lfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9saXN0X3VwZGF0ZV9wb2xpY3kvY291bnRlcl9sdV9tZXRhZGF0YS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vIEEgbnVsbCB0eXBlIHRoYXQgbWVhbnMgdGhhdCBlYWNoIGxpbmsgaW4gYSBsaXN0LWJhc2VkIGNvbnRhaW5lcgorICAvLyBkb2VzIG5vdCBhY3R1YWxseSBuZWVkIG1ldGFkYXRhLgorICBzdHJ1Y3QgbnVsbF9sdV9tZXRhZGF0YQorICB7IH07CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yPgorI2RlZmluZSBQQl9EU19DTEFTU19DX0RFQyBtb3ZlX3RvX2Zyb250X2x1X3BvbGljeTxBbGxvY2F0b3I+CisKKyAgLy8gQSBsaXN0LXVwZGF0ZSBwb2xpY3kgdGhhdCB1bmNvbmRpdGlvbmFsbHkgbW92ZXMgZWxlbWVudHMgdG8gdGhlCisgIC8vIGZyb250IG9mIHRoZSBsaXN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgIGNsYXNzIG1vdmVfdG9fZnJvbnRfbHVfcG9saWN5CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworICAgICAgCisgICAgLy8gTWV0YWRhdGEgb24gd2hpY2ggdGhpcyBmdW5jdG9yIG9wZXJhdGVzLgorICAgIHR5cGVkZWYgbnVsbF9sdV9tZXRhZGF0YSBtZXRhZGF0YV90eXBlOworICAgICAgCisgICAgLy8gUmVmZXJlbmNlIHRvIG1ldGFkYXRhIG9uIHdoaWNoIHRoaXMgZnVuY3RvciBvcGVyYXRlcy4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT46Om90aGVyIG1ldGFkYXRhX3JlYmluZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIG1ldGFkYXRhX3JlYmluZDo6cmVmZXJlbmNlIG1ldGFkYXRhX3JlZmVyZW5jZTsKKyAgICAgIAorICAgIC8vIENyZWF0ZXMgYSBtZXRhZGF0YSBvYmplY3QuCisgICAgbWV0YWRhdGFfdHlwZQorICAgIG9wZXJhdG9yKCkoKSBjb25zdDsKKyAgICAgIAorICAgIC8vIERlY2lkZXMgd2hldGhlciBhIG1ldGFkYXRhIG9iamVjdCBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGZyb250CisgICAgLy8gb2YgdGhlIGxpc3QuCisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSByX21ldGFkYXRhKSBjb25zdDsKKyAgICAgIAorICBwcml2YXRlOgorICAgIHN0YXRpYyBudWxsX2x1X21ldGFkYXRhIHNfbWV0YWRhdGE7CisgIH07CisgIAorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvbGlzdF91cGRhdGVfcG9saWN5L210Zl9sdV9wb2xpY3lfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX1RfREVDCisjdW5kZWYgUEJfRFNfQ0xBU1NfQ19ERUMKKworI2RlZmluZSBQQl9EU19DTEFTU19UX0RFQyB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBNYXhfQ291bnQsIGNsYXNzIEFsbG9jYXRvcj4KKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgY291bnRlcl9sdV9wb2xpY3k8TWF4X0NvdW50LCBBbGxvY2F0b3I+CisKKyAgLy8gQSBsaXN0LXVwZGF0ZSBwb2xpY3kgdGhhdCBtb3ZlcyBlbGVtZW50cyB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKKyAgLy8gYmFzZWQgb24gdGhlIGNvdW50ZXIgYWxnb3JpdGhtLgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBNYXhfQ291bnQgPSA1LAorCSAgIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgY2xhc3MgY291bnRlcl9sdV9wb2xpY3kgCisgIDogcHJpdmF0ZSBkZXRhaWw6OmNvdW50ZXJfbHVfcG9saWN5X2Jhc2U8dHlwZW5hbWUgQWxsb2NhdG9yOjpzaXplX3R5cGU+CisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQWxsb2NhdG9yIGFsbG9jYXRvcl90eXBlOworCisgICAgZW51bQorICAgICAgeworCW1heF9jb3VudCA9IE1heF9Db3VudAorICAgICAgfTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CisKKyAgICAvLyBNZXRhZGF0YSBvbiB3aGljaCB0aGlzIGZ1bmN0b3Igb3BlcmF0ZXMuCisgICAgdHlwZWRlZiBkZXRhaWw6OmNvdW50ZXJfbHVfbWV0YWRhdGE8c2l6ZV90eXBlPiBtZXRhZGF0YV90eXBlOworCisgICAgLy8gUmVmZXJlbmNlIHRvIG1ldGFkYXRhIG9uIHdoaWNoIHRoaXMgZnVuY3RvciBvcGVyYXRlcy4KKyAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+OjpvdGhlciBtZXRhZGF0YV9yZWJpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9yZWJpbmQ6OnJlZmVyZW5jZSBtZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAvLyBDcmVhdGVzIGEgbWV0YWRhdGEgb2JqZWN0LgorICAgIG1ldGFkYXRhX3R5cGUKKyAgICBvcGVyYXRvcigpKCkgY29uc3Q7CisKKyAgICAvLyBEZWNpZGVzIHdoZXRoZXIgYSBtZXRhZGF0YSBvYmplY3Qgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBmcm9udAorICAgIC8vIG9mIHRoZSBsaXN0LgorICAgIGJvb2wKKyAgICBvcGVyYXRvcigpKG1ldGFkYXRhX3JlZmVyZW5jZSByX21ldGFkYXRhKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgZGV0YWlsOjpjb3VudGVyX2x1X3BvbGljeV9iYXNlPHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlPiBiYXNlX3R5cGU7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2xpc3RfdXBkYXRlX3BvbGljeS9jb3VudGVyX2x1X3BvbGljeV9pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvcHJpb3JpdHlfcXVldWUuaHBwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvcHJpb3JpdHlfcXVldWUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDg4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy9wcmlvcml0eV9xdWV1ZS5ocHAKQEAgLTAsMCArMSwxMjkgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKioKKyAqIEBmaWxlIHByaW9yaXR5X3F1ZXVlLmhwcAorICogQ29udGFpbnMgcHJpb3JpdHlfcXVldWVzLgorICovCisKKyNpZm5kZWYgUEJfRFNfUFJJT1JJVFlfUVVFVUVfSFBQCisjZGVmaW5lIFBCX0RTX1BSSU9SSVRZX1FVRVVFX0hQUAorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdGFnX2FuZF90cmFpdC5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC9wcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3N0YW5kYXJkX3BvbGljaWVzLmhwcD4KKworbmFtZXNwYWNlIF9fZ251X3BiZHMKK3sKKyAgLy8gQSBwcmlvcml0eSBxdWV1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVfVHlwZSwgCisJICAgdHlwZW5hbWUgQ21wX0ZuID0gc3RkOjpsZXNzPFZhbHVlX1R5cGU+LAorCSAgIHR5cGVuYW1lIFRhZyA9IHBhaXJpbmdfaGVhcF90YWcsCisJICAgdHlwZW5hbWUgQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICBjbGFzcyBwcmlvcml0eV9xdWV1ZSAKKyAgOiBwdWJsaWMgZGV0YWlsOjpwcmlvcml0eV9xdWV1ZV9iYXNlX2Rpc3BhdGNoPFZhbHVlX1R5cGUsCisJCQkJCQlDbXBfRm4sVGFnLEFsbG9jYXRvcj46OnR5cGUKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICBkZXRhaWw6OnByaW9yaXR5X3F1ZXVlX2Jhc2VfZGlzcGF0Y2g8VmFsdWVfVHlwZSwgQ21wX0ZuLAorCQkJCQkgVGFnLCBBbGxvY2F0b3I+Ojp0eXBlIGJhc2VfdHlwZTsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBWYWx1ZV9UeXBlIAkJCQkJdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIENtcF9GbiAJCQkJCWNtcF9mbjsKKyAgICB0eXBlZGVmIFRhZyAJCQkJCWNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciAJCQkJCWFsbG9jYXRvcl90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnNpemVfdHlwZSAJCXNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpkaWZmZXJlbmNlX3R5cGUgCWRpZmZlcmVuY2VfdHlwZTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgYWxsb2NhdG9yX3R5cGU6OnRlbXBsYXRlIHJlYmluZDx2YWx1ZV90eXBlPjo6b3RoZXIgdmFsdWVfcmViaW5kOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfcmViaW5kOjpyZWZlcmVuY2UgCQlyZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB2YWx1ZV9yZWJpbmQ6OmNvbnN0X3JlZmVyZW5jZSAJY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdmFsdWVfcmViaW5kOjpwb2ludGVyIAkgICAJcG9pbnRlcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHZhbHVlX3JlYmluZDo6Y29uc3RfcG9pbnRlciAJY29uc3RfcG9pbnRlcjsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludF9pdGVyYXRvciBjb25zdF9wb2ludF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cG9pbnRfaXRlcmF0b3IgCQlwb2ludF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6aXRlcmF0b3IgCQlpdGVyYXRvcjsKKworICAgIHByaW9yaXR5X3F1ZXVlKCkgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgc29tZSBwb2xpY3kgb2JqZWN0cy4gcl9jbXBfZm4gd2lsbCBiZSBjb3BpZWQKKyAgICAvLyBieSB0aGUgQ21wX0ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICBwcmlvcml0eV9xdWV1ZShjb25zdCBjbXBfZm4mIHJfY21wX2ZuKSA6IGJhc2VfdHlwZShyX2NtcF9mbikgeyB9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtpbmcgX19pdGVyYXRvcnMgdG8gYSByYW5nZSBvZiB2YWx1ZV90eXBlcy4gVGhlCisgICAgLy8gdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQgbGFzdF9pdCB3aWxsIGJlIGluc2VydGVkIGludG8KKyAgICAvLyB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBwcmlvcml0eV9xdWV1ZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCkKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0X2l0LCBsYXN0X2l0KTsgfQorCisgICAgLy8gQ29uc3RydWN0b3IgdGFraW5nIF9faXRlcmF0b3JzIHRvIGEgcmFuZ2Ugb2YgdmFsdWVfdHlwZXMgYW5kCisgICAgLy8gc29tZSBwb2xpY3kgb2JqZWN0cyBUaGUgdmFsdWVfdHlwZXMgYmV0d2VlbiBmaXJzdF9pdCBhbmQKKyAgICAvLyBsYXN0X2l0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgY29udGFpbmVyIG9iamVjdC4gcl9jbXBfZm4KKyAgICAvLyB3aWxsIGJlIGNvcGllZCBieSB0aGUgY21wX2ZuIG9iamVjdCBvZiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgICBwcmlvcml0eV9xdWV1ZShJdCBmaXJzdF9pdCwgSXQgbGFzdF9pdCwgY29uc3QgY21wX2ZuJiByX2NtcF9mbikKKyAgICA6IGJhc2VfdHlwZShyX2NtcF9mbikKKyAgICB7IGJhc2VfdHlwZTo6Y29weV9mcm9tX3JhbmdlKGZpcnN0X2l0LCBsYXN0X2l0KTsgfQorCisgICAgcHJpb3JpdHlfcXVldWUoY29uc3QgcHJpb3JpdHlfcXVldWUmIG90aGVyKQorICAgIDogYmFzZV90eXBlKChjb25zdCBiYXNlX3R5cGUmIClvdGhlcikgeyB9CisKKyAgICB2aXJ0dWFsCisgICAgfnByaW9yaXR5X3F1ZXVlKCkgeyB9CisKKyAgICBwcmlvcml0eV9xdWV1ZSYgCisgICAgb3BlcmF0b3I9KGNvbnN0IHByaW9yaXR5X3F1ZXVlJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAodGhpcyAhPSAmb3RoZXIpCisJeworCSAgcHJpb3JpdHlfcXVldWUgdG1wKG90aGVyKTsKKwkgIHN3YXAodG1wKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAocHJpb3JpdHlfcXVldWUmIG90aGVyKQorICAgIHsgYmFzZV90eXBlOjpzd2FwKG90aGVyKTsgfQorICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL3RhZ19hbmRfdHJhaXQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDQ1MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy90YWdfYW5kX3RyYWl0LmhwcApAQCAtMCwwICsxLDM2NCBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdGFnX2FuZF90cmFpdC5ocHAKKyAqIENvbnRhaW5zIHRhZ3MgYW5kIHRyYWl0cywgZS5nLiwgb25lcyBkZXNjcmliaW5nIHVuZGVybHlpbmcKKyAqICAgIGRhdGEgc3RydWN0dXJlcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RBR19BTkRfVFJBSVRfSFBQCisjZGVmaW5lIFBCX0RTX1RBR19BTkRfVFJBSVRfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHlwZV91dGlscy5ocHA+CisKKy8qKgorICogQG5hbWVzcGFjZSBfX2dudV9wYmRzCisgKiBAYnJpZWYgR05VIGV4dGVuc2lvbnMgZm9yIHBvbGljeS1iYXNlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHB1YmxpYyB1c2UuCisgKi8KK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vIEEgdHJpdmlhbCBpdGVyYXRvciB0YWcuIFNpZ25pZmllcyB0aGF0IHRoZSBpdGVyYXRvcnMgaGFzIG5vbmUgb2YKKyAgLy8gdGhlIFNUTCdzIG1vdmVtZW50IGFiaWxpdGllcy4KKyAgc3RydWN0IHRyaXZpYWxfaXRlcmF0b3JfdGFnCisgIHsgfTsKKworICAvLyBQcm9oaWJpdCBtb3ZpbmcgdHJpdmlhbCBpdGVyYXRvcnMuCisgIHR5cGVkZWYgdm9pZCB0cml2aWFsX2l0ZXJhdG9yX2RpZmZlcmVuY2VfdHlwZTsKKworCisgIC8vIFNpZ25pZmllcyBhIGJhc2ljIGludmFsaWRhdGlvbiBndWFyYW50ZWUgdGhhdCBhbnkgaXRlcmF0b3IsCisgIC8vIHBvaW50ZXIsIG9yIHJlZmVyZW5jZSB0byBhIGNvbnRhaW5lciBvYmplY3QncyBtYXBwZWQgdmFsdWUgdHlwZQorICAvLyBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZSBjb250YWluZXIgaXMgbm90IG1vZGlmaWVkLgorICBzdHJ1Y3QgYmFzaWNfaW52YWxpZGF0aW9uX2d1YXJhbnRlZQorICB7IH07CisKKyAgLy8gU2lnbmlmaWVzIGFuIGludmFsaWRhdGlvbiBndWFyYW50ZWUgdGhhdCBpbmNsdWRlcyBhbGwgdGhvc2Ugb2YKKyAgLy8gaXRzIGJhc2UsIGFuZCBhZGRpdGlvbmFsbHksIHRoYXQgYW55IHBvaW50LXR5cGUgaXRlcmF0b3IsCisgIC8vIHBvaW50ZXIsIG9yIHJlZmVyZW5jZSB0byBhIGNvbnRhaW5lciBvYmplY3QncyBtYXBwZWQgdmFsdWUgdHlwZQorICAvLyBpcyB2YWxpZCBhcyBsb25nIGFzIGl0cyBjb3JyZXNwb25kaW5nIGVudHJ5IGhhcyBub3QgYmUgZXJhc2VkLAorICAvLyByZWdhcmRsZXNzIG9mIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgIHN0cnVjdCBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIDogcHVibGljIGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUKKyAgeyB9OworCisgIC8vIFNpZ25pZmllcyBhbiBpbnZhbGlkYXRpb24gZ3VhcmFudGVlIHRoYXQgaW5jbHVkZXMgYWxsIHRob3NlIG9mCisgIC8vIGl0cyBiYXNlLCBhbmQgYWRkaXRpb25hbGx5LCB0aGF0IGFueSByYW5nZS10eXBlIGl0ZXJhdG9yCisgIC8vIChpbmNsdWRpbmcgdGhlIHJldHVybnMgb2YgYmVnaW4oKSBhbmQgZW5kKCkpIGlzIGluIHRoZSBjb3JyZWN0CisgIC8vIHJlbGF0aXZlIHBvc2l0aW9ucyB0byBvdGhlciByYW5nZS10eXBlIGl0ZXJhdG9ycyBhcyBsb25nIGFzIGl0cworICAvLyBjb3JyZXNwb25kaW5nIGVudHJ5IGhhcyBub3QgYmUgZXJhc2VkLCByZWdhcmRsZXNzIG9mCisgIC8vIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGNvbnRhaW5lciBvYmplY3QuCisgIHN0cnVjdCByYW5nZV9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIDogcHVibGljIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUKKyAgeyB9OworCisKKyAgLy8vIEEgbWFwcGVkLXBvbGljeSBpbmRpY2F0aW5nIHRoYXQgYW4gYXNzb2NpYXRpdmUgY29udGFpbmVyIGlzIGEgc2V0LgorICAvLyBYWFggc2hvdWxkIHRoaXMgYmUgYSB0cmFpdCBvZiB0aGUgZm9ybSBpc19zZXQ8VD4gPz8KKyAgc3RydWN0IG51bGxfbWFwcGVkX3R5cGUgeyB9OworCisKKyAgLy8vIEJhc2UgZGF0YSBzdHJ1Y3R1cmUgdGFnLgorICBzdHJ1Y3QgY29udGFpbmVyX3RhZworICB7IH07CisKKyAgLy8vIEJhc2ljIHN0cmluZyBjb250YWluZXIsIGluY2x1c2l2ZSBvZiBzdHJpbmdzLCByb3BlcywgZXRjLgorICBzdHJ1Y3Qgc3RyaW5nX3RhZyA6IHB1YmxpYyBjb250YWluZXJfdGFnIHsgfTsKKworICAvLy8gQmFzaWMgc2VxdWVuY2UuCisgIHN0cnVjdCBzZXF1ZW5jZV90YWcgOiBwdWJsaWMgY29udGFpbmVyX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIGFzc29jaWF0aXZlLWNvbnRhaW5lci4KKyAgc3RydWN0IGFzc29jaWF0aXZlX2NvbnRhaW5lcl90YWcgOiBwdWJsaWMgY29udGFpbmVyX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIGhhc2guCisgIHN0cnVjdCBiYXNpY19oYXNoX3RhZyA6IHB1YmxpYyBhc3NvY2lhdGl2ZV9jb250YWluZXJfdGFnIHsgfTsKKworICAvLy8gQ29sbGlzaW9uLWNoYWluaW5nIGhhc2guCisgIHN0cnVjdCBjY19oYXNoX3RhZyA6IHB1YmxpYyBiYXNpY19oYXNoX3RhZyB7IH07CisKKyAgLy8vIEdlbmVyYWwtcHJvYmluZyBoYXNoLgorICBzdHJ1Y3QgZ3BfaGFzaF90YWcgOiBwdWJsaWMgYmFzaWNfaGFzaF90YWcgeyB9OworCisgIC8vLyBCYXNpYyB0cmVlLgorICBzdHJ1Y3QgYmFzaWNfdHJlZV90YWcgOiBwdWJsaWMgYXNzb2NpYXRpdmVfY29udGFpbmVyX3RhZyB7IH07CisKKyAgLy8vIHRyZWUuCisgIHN0cnVjdCB0cmVlX3RhZyA6IHB1YmxpYyBiYXNpY190cmVlX3RhZyB7IH07CisKKyAgLy8vIFJlZC1ibGFjayB0cmVlLgorICBzdHJ1Y3QgcmJfdHJlZV90YWcgOiBwdWJsaWMgdHJlZV90YWcgeyB9OworCisgIC8vLyBTcGxheSB0cmVlLgorICBzdHJ1Y3Qgc3BsYXlfdHJlZV90YWcgOiBwdWJsaWMgdHJlZV90YWcgeyB9OworCisgIC8vLyBPcmRlcmVkLXZlY3RvciB0cmVlLgorICBzdHJ1Y3Qgb3ZfdHJlZV90YWcgOiBwdWJsaWMgdHJlZV90YWcgeyB9OworCisgIC8vLyB0cmllLgorICBzdHJ1Y3QgdHJpZV90YWcgOiBwdWJsaWMgYmFzaWNfdHJlZV90YWcgeyB9OworCisgIC8vLyBQQVRSSUNJQSB0cmllLgorICBzdHJ1Y3QgcGF0X3RyaWVfdGFnIDogcHVibGljIHRyaWVfdGFnIHsgfTsKKworICAvLy8gTGlzdC11cGRhdGUuCisgIHN0cnVjdCBsaXN0X3VwZGF0ZV90YWcgOiBwdWJsaWMgYXNzb2NpYXRpdmVfY29udGFpbmVyX3RhZyB7IH07CisKKyAgLy8vIEJhc2ljIHByaW9yaXR5LXF1ZXVlLgorICBzdHJ1Y3QgcHJpb3JpdHlfcXVldWVfdGFnIDogcHVibGljIGNvbnRhaW5lcl90YWcgeyB9OworCisgIC8vLyBQYWlyaW5nLWhlYXAuCisgIHN0cnVjdCBwYWlyaW5nX2hlYXBfdGFnIDogcHVibGljIHByaW9yaXR5X3F1ZXVlX3RhZyB7IH07CisKKyAgLy8vIEJpbm9taWFsLWhlYXAuCisgIHN0cnVjdCBiaW5vbWlhbF9oZWFwX3RhZyA6IHB1YmxpYyBwcmlvcml0eV9xdWV1ZV90YWcgeyB9OworCisgIC8vLyBSZWR1bmRhbnQtY291bnRlciBiaW5vbWlhbC1oZWFwLgorICBzdHJ1Y3QgcmNfYmlub21pYWxfaGVhcF90YWcgOiBwdWJsaWMgcHJpb3JpdHlfcXVldWVfdGFnIHsgfTsKKworICAvLy8gQmluYXJ5LWhlYXAgKGFycmF5LWJhc2VkKS4KKyAgc3RydWN0IGJpbmFyeV9oZWFwX3RhZyA6IHB1YmxpYyBwcmlvcml0eV9xdWV1ZV90YWcgeyB9OworCisgIC8vLyBUaGluIGhlYXAuCisgIHN0cnVjdCB0aGluX2hlYXBfdGFnIDogcHVibGljIHByaW9yaXR5X3F1ZXVlX3RhZyB7IH07CisKKworICAvLy8gQmFzZSB0cmFpdHMgdHlwZSBmb3IgY29udGFpbmVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGFnPgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlOworCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxjY19oYXNoX3RhZz4KKyAgeworICAgIHR5cGVkZWYgY2NfaGFzaF90YWcgY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSBpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworICAgICAgICBvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisgICAgICAgIGVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8Z3BfaGFzaF90YWc+CisgIHsKKyAgICB0eXBlZGVmIGdwX2hhc2hfdGFnIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorCWVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8cmJfdHJlZV90YWc+CisgIHsKKyAgICB0eXBlZGVmIHJiX3RyZWVfdGFnIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHJhbmdlX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgb3JkZXJfcHJlc2VydmluZyA9IHRydWUsCisgICAgICAgIGVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisgICAgICAgIHJldmVyc2VfaXRlcmF0aW9uID0gdHJ1ZQorICAgICAgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8c3BsYXlfdHJlZV90YWc+CisgIHsKKyAgICB0eXBlZGVmIHNwbGF5X3RyZWVfdGFnIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHJhbmdlX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgb3JkZXJfcHJlc2VydmluZyA9IHRydWUsCisgICAgICAgIGVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorICAgICAgICBzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorICAgICAgICByZXZlcnNlX2l0ZXJhdGlvbiA9IHRydWUKKyAgICAgIH07CisgIH07CisKKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPG92X3RyZWVfdGFnPgorICB7CisgICAgdHlwZWRlZiBvdl90cmVlX3RhZyBjb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBiYXNpY19pbnZhbGlkYXRpb25fZ3VhcmFudGVlIGludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisgICAgICAgIG9yZGVyX3ByZXNlcnZpbmcgPSB0cnVlLAorICAgICAgICBlcmFzZV9jYW5fdGhyb3cgPSB0cnVlLAorICAgICAgICBzcGxpdF9qb2luX2Nhbl90aHJvdyA9IHRydWUsCisgICAgICAgIHJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPHBhdF90cmllX3RhZz4KKyAgeworICAgIHR5cGVkZWYgcGF0X3RyaWVfdGFnIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHJhbmdlX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgb3JkZXJfcHJlc2VydmluZyA9IHRydWUsCisgICAgICAgIGVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorICAgICAgICBzcGxpdF9qb2luX2Nhbl90aHJvdyA9IHRydWUsCisgICAgICAgIHJldmVyc2VfaXRlcmF0aW9uID0gdHJ1ZQorICAgICAgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8bGlzdF91cGRhdGVfdGFnPgorICB7CisgICAgdHlwZWRlZiBsaXN0X3VwZGF0ZV90YWcgY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSBpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworICAgICAgICBvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisgICAgICAgIGVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisgICAgICAgIHJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8cGFpcmluZ19oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgcGFpcmluZ19oZWFwX3RhZyBjb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIGludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisgICAgICAgIG9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKyAgICAgICAgZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKyAgICAgICAgcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8dGhpbl9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgdGhpbl9oZWFwX3RhZyBjb250YWluZXJfY2F0ZWdvcnk7CisgICAgdHlwZWRlZiBwb2ludF9pbnZhbGlkYXRpb25fZ3VhcmFudGVlIGludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisgICAgICAgIG9yZGVyX3ByZXNlcnZpbmcgPSBmYWxzZSwKKyAgICAgICAgZXJhc2VfY2FuX3Rocm93ID0gZmFsc2UsCisJc3BsaXRfam9pbl9jYW5fdGhyb3cgPSBmYWxzZSwKKyAgICAgICAgcmV2ZXJzZV9pdGVyYXRpb24gPSBmYWxzZQorICAgICAgfTsKKyAgfTsKKworICB0ZW1wbGF0ZTw+CisgIHN0cnVjdCBjb250YWluZXJfdHJhaXRzX2Jhc2U8Ymlub21pYWxfaGVhcF90YWc+CisgIHsKKyAgICB0eXBlZGVmIGJpbm9taWFsX2hlYXBfdGFnIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIHBvaW50X2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorICAgICAgICBlcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGZhbHNlLAorICAgICAgICByZXZlcnNlX2l0ZXJhdGlvbiA9IGZhbHNlCisgICAgICB9OworICB9OworCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHNfYmFzZTxyY19iaW5vbWlhbF9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgcmNfYmlub21pYWxfaGVhcF90YWcgY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgcG9pbnRfaW52YWxpZGF0aW9uX2d1YXJhbnRlZSBpbnZhbGlkYXRpb25fZ3VhcmFudGVlOworCisgICAgZW51bQorICAgICAgeworICAgICAgICBvcmRlcl9wcmVzZXJ2aW5nID0gZmFsc2UsCisgICAgICAgIGVyYXNlX2Nhbl90aHJvdyA9IGZhbHNlLAorCXNwbGl0X2pvaW5fY2FuX3Rocm93ID0gZmFsc2UsCisgICAgICAgIHJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgY29udGFpbmVyX3RyYWl0c19iYXNlPGJpbmFyeV9oZWFwX3RhZz4KKyAgeworICAgIHR5cGVkZWYgYmluYXJ5X2hlYXBfdGFnIGNvbnRhaW5lcl9jYXRlZ29yeTsKKyAgICB0eXBlZGVmIGJhc2ljX2ludmFsaWRhdGlvbl9ndWFyYW50ZWUgaW52YWxpZGF0aW9uX2d1YXJhbnRlZTsKKworICAgIGVudW0KKyAgICAgIHsKKyAgICAgICAgb3JkZXJfcHJlc2VydmluZyA9IGZhbHNlLAorICAgICAgICBlcmFzZV9jYW5fdGhyb3cgPSBmYWxzZSwKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IHRydWUsCisgICAgICAgIHJldmVyc2VfaXRlcmF0aW9uID0gZmFsc2UKKyAgICAgIH07CisgIH07CisKKworICAvLy8gY29udGFpbmVyX3RyYWl0cworICAvLyBTZWUgTWF0dCBBdXN0ZXJuIGZvciB0aGUgbmFtZSwgUy4gTWV5ZXJzIE1FRkMrKyAjMiwgb3RoZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDbnRucj4KKyAgc3RydWN0IGNvbnRhaW5lcl90cmFpdHMgCisgIDogcHVibGljIGNvbnRhaW5lcl90cmFpdHNfYmFzZTx0eXBlbmFtZSBDbnRucjo6Y29udGFpbmVyX2NhdGVnb3J5PgorICB7CisgICAgdHlwZWRlZiBDbnRuciBjb250YWluZXJfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIENudG5yOjpjb250YWluZXJfY2F0ZWdvcnkgY29udGFpbmVyX2NhdGVnb3J5OworICAgIHR5cGVkZWYgY29udGFpbmVyX3RyYWl0c19iYXNlPGNvbnRhaW5lcl9jYXRlZ29yeT4gYmFzZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjppbnZhbGlkYXRpb25fZ3VhcmFudGVlIGludmFsaWRhdGlvbl9ndWFyYW50ZWU7CisKKyAgICBlbnVtCisgICAgICB7CisJb3JkZXJfcHJlc2VydmluZyA9IGJhc2VfdHlwZTo6b3JkZXJfcHJlc2VydmluZywKKwllcmFzZV9jYW5fdGhyb3cgPSBiYXNlX3R5cGU6OmVyYXNlX2Nhbl90aHJvdywKKwlzcGxpdF9qb2luX2Nhbl90aHJvdyA9IGJhc2VfdHlwZTo6c3BsaXRfam9pbl9jYW5fdGhyb3csCisJcmV2ZXJzZV9pdGVyYXRpb24gPSBiYXNlX3R5cGU6OnJldmVyc2VfaXRlcmF0aW9uCisgICAgICB9OworICB9OworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYxYWRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwCkBAIC0wLDAgKzEsMTYzIEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0IEFtaSBUYXZvcnkgYW5kIFZsYWRpbWlyIERyZWl6aW4sIElCTS1IUkwuCisKKy8vIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIHNlbGwsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlCisvLyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiBOb25lCisvLyBvZiB0aGUgYWJvdmUgYXV0aG9ycywgbm9yIElCTSBIYWlmYSBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIG1ha2UgYW55CisvLyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisvLyBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eS4KKworLyoqCisgKiBAZmlsZSB0cmVlX3BvbGljeS5ocHAKKyAqIENvbnRhaW5zIHRyZWUtcmVsYXRlZCBwb2xpY2llcy4KKyAqLworCisjaWZuZGVmIFBCX0RTX1RSRUVfUE9MSUNZX0hQUAorI2RlZmluZSBQQl9EU19UUkVFX1BPTElDWV9IUFAKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90eXBlX3V0aWxzLmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL2Jhc2ljX3RyZWVfcG9saWN5L2Jhc2ljX3RyZWVfcG9saWN5X2Jhc2UuaHBwPgorCituYW1lc3BhY2UgX19nbnVfcGJkcworeworICAvLyBBIG51bGwgbm9kZSB1cGRhdG9yLCBpbmRpY2F0aW5nIHRoYXQgbm8gbm9kZSB1cGRhdGVzIGFyZSByZXF1aXJlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwKKwkgICB0eXBlbmFtZSBOb2RlX0l0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIENtcF9GbiwKKwkgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgIHN0cnVjdCBudWxsX3RyZWVfbm9kZV91cGRhdGUKKyAgeyB9OworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvciwgY2xhc3MgTm9kZV9JdGVyYXRvciwgY2xhc3MgQ21wX0ZuLCBjbGFzcyBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU8Q29uc3RfTm9kZV9JdGVyYXRvciwgTm9kZV9JdGVyYXRvciwgQ21wX0ZuLCBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQwkJCQkJCVwKKyAgZGV0YWlsOjpiYXNpY190cmVlX3BvbGljeV9iYXNlPENvbnN0X05vZGVfSXRlcmF0b3IsIE5vZGVfSXRlcmF0b3IsIEFsbG9jYXRvcj4KKworICAvLyBGdW5jdG9yIHVwZGF0aW5nIHJhbmtzIG9mIGVudHJlZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3IsIAorCSAgIHR5cGVuYW1lIENtcF9GbiwgdHlwZW5hbWUgQWxsb2NhdG9yPgorICBjbGFzcyB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUgOiBwcml2YXRlIFBCX0RTX0JBU0VfQ19ERUMKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgQ21wX0ZuIGNtcF9mbjsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3Rfa2V5X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworCisgICAgdHlwZWRlZiBzaXplX3R5cGUgbWV0YWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIENvbnN0X05vZGVfSXRlcmF0b3IgY29uc3Rfbm9kZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIE5vZGVfSXRlcmF0b3Igbm9kZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnN0X25vZGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2l0ZXJhdG9yOjp2YWx1ZV90eXBlIGl0ZXJhdG9yOworCisgICAgLy8gRmluZHMgYW4gZW50cnkgYnkgX19vcmRlci4gUmV0dXJucyBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZQorICAgIC8vIGVudHJ5IHdpdGggdGhlIF9fb3JkZXIgb3JkZXIsIG9yIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlCisgICAgLy8gY29udGFpbmVyIG9iamVjdCdzIGVuZCBpZiBvcmRlciBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLyBjb250YWluZXIgb2JqZWN0LgorICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlIG9yZGVyKSBjb25zdDsKKworICAgIC8vIEZpbmRzIGFuIGVudHJ5IGJ5IF9fb3JkZXIuIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVudHJ5CisgICAgLy8gd2l0aCB0aGUgX19vcmRlciBvcmRlciwgb3IgYW4gaXRlcmF0b3IgdG8gdGhlIGNvbnRhaW5lcgorICAgIC8vIG9iamVjdCdzIGVuZCBpZiBvcmRlciBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyCisgICAgLy8gb2JqZWN0LgorICAgIGlubGluZSBpdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlIG9yZGVyKTsKKworICAgIC8vIFJldHVybnMgdGhlIG9yZGVyIG9mIGEga2V5IHdpdGhpbiBhIHNlcXVlbmNlLiBGb3IgZXhhcG1sZSwgaWYKKyAgICAvLyByX2tleSBpcyB0aGUgc21hbGxlc3Qga2V5LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAwOyBpZiByX2tleQorICAgIC8vIGlzIGEga2V5IGJldHdlZW4gdGhlIHNtYWxsZXN0IGFuZCBuZXh0IGtleSwgdGhpcyBtZXRob2Qgd2lsbAorICAgIC8vIHJldHVybiAxOyBpZiByX2tleSBpcyBhIGtleSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBrZXksIHRoaXMKKyAgICAvLyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNpemUgb2Ygcl9jLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcmRlcl9vZl9rZXkoY29uc3Rfa2V5X3JlZmVyZW5jZSByX2tleSkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICAvLyBDb25zdCByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lcidzIHZhbHVlLXR5cGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAvLyBDb25zdCBwb2ludGVyIHRvIHRoZSBjb250YWluZXIncyB2YWx1ZS10eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjp0ZW1wbGF0ZSByZWJpbmQ8bWV0YWRhdGFfdHlwZT46Om90aGVyIG1ldGFkYXRhX3JlYmluZDsKKyAgICAvLyBDb25zdCBtZXRhZGF0YSByZWZlcmVuY2UuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9yZWJpbmQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9tZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAvLyBNZXRhZGF0YSByZWZlcmVuY2UuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9yZWJpbmQ6OnJlZmVyZW5jZSBtZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBjb25zdF9ub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJlZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgbm9kZV9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHRyZWUncyByb290IG5vZGUuCisgICAgdmlydHVhbCBub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9iZWdpbigpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGNvbnN0X25vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIGEganVzdC1hZnRlciBsZWFmIG5vZGUuCisgICAgdmlydHVhbCBjb25zdF9ub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9lbmQoKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIgbGVhZiBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfZW5kKCkgPSAwOworCisgICAgLy8gQWNjZXNzIHRvIHRoZSBjbXBfZm4gb2JqZWN0LgorICAgIHZpcnR1YWwgY21wX2ZuJiAKKyAgICBnZXRfY21wX2ZuKCkgPSAwOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OworICAgIC8vIGVuZF9uZF9pdCBpcyB0aGUgZW5kIG5vZGUgaXRlcmF0b3IuCisgICAgaW5saW5lIHZvaWQKKyAgICBvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3Igbm9kZV9pdCwgY29uc3Rfbm9kZV9pdGVyYXRvciBlbmRfbmRfaXQpIGNvbnN0OworCisgICAgdmlydHVhbAorICAgIH50cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUoKTsKKyAgfTsKKworI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJlZV9wb2xpY3kvb3JkZXJfc3RhdGlzdGljc19pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworI3VuZGVmIFBCX0RTX0JBU0VfQ19ERUMKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcGJkcworCisjZW5kaWYgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy90cmllX3BvbGljeS5ocHAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wYl9kcy90cmllX3BvbGljeS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NTIxMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BiX2RzL3RyaWVfcG9saWN5LmhwcApAQCAtMCwwICsxLDM1NiBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCBBbWkgVGF2b3J5IGFuZCBWbGFkaW1pciBEcmVpemluLCBJQk0tSFJMLgorCisvLyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBzZWxsLCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZQorLy8gYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gTm9uZQorLy8gb2YgdGhlIGFib3ZlIGF1dGhvcnMsIG5vciBJQk0gSGFpZmEgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBtYWtlIGFueQorLy8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorLy8gcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHkuCisKKy8qKgorICogQGZpbGUgdHJpZV9wb2xpY3kuaHBwCisgKiBDb250YWlucyB0cmllLXJlbGF0ZWQgcG9saWNpZXMuCisgKi8KKworI2lmbmRlZiBQQl9EU19UUklFX1BPTElDWV9IUFAKKyNkZWZpbmUgUEJfRFNfVFJJRV9QT0xJQ1lfSFBQCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3R5cGVfdXRpbHMuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9kZXRhaWwvdHJpZV9wb2xpY3kvdHJpZV9wb2xpY3lfYmFzZS5ocHA+CisKK25hbWVzcGFjZSBfX2dudV9wYmRzCit7CisgIC8vIEEgbnVsbCBub2RlIHVwZGF0b3IsIGluZGljYXRpbmcgdGhhdCBubyBub2RlIHVwZGF0ZXMgYXJlIHJlcXVpcmVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgRV9BY2Nlc3NfVHJhaXRzLAorCSAgIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgc3RydWN0IG51bGxfdHJpZV9ub2RlX3VwZGF0ZQorICB7IH07CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfVF9ERUMJCQkJCQlcCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZywgdHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlIE1pbl9FX1ZhbCwgdHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlIE1heF9FX1ZhbCwgYm9vbCBSZXZlcnNlLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMJCQkJCQlcCisgIHN0cmluZ190cmllX2VfYWNjZXNzX3RyYWl0czxTdHJpbmcsIE1pbl9FX1ZhbCxNYXhfRV9WYWwsUmV2ZXJzZSxBbGxvY2F0b3I+CisKKyAgLy8gRWxlbWVudCBhY2Nlc3MgdHJhaXRzIGZvciBzdHJpbmcgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZyA9IHN0ZDo6c3RyaW5nLAorCSAgIHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZSBNaW5fRV9WYWwgPSBkZXRhaWw6Ol9fbnVtZXJpY190cmFpdHM8dHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlPjo6X19taW4sIAorCSAgIHR5cGVuYW1lIFN0cmluZzo6dmFsdWVfdHlwZSBNYXhfRV9WYWwgPSBkZXRhaWw6Ol9fbnVtZXJpY190cmFpdHM8dHlwZW5hbWUgU3RyaW5nOjp2YWx1ZV90eXBlPjo6X19tYXgsIAorCSAgIGJvb2wgUmV2ZXJzZSA9IGZhbHNlLAorCSAgIHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4KKyAgc3RydWN0IHN0cmluZ190cmllX2VfYWNjZXNzX3RyYWl0cworICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIFN0cmluZyBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGtleV90eXBlPjo6b3RoZXIga2V5X3JlYmluZDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGtleV9yZWJpbmQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworCisgICAgZW51bQorICAgICAgeworCXJldmVyc2UgPSBSZXZlcnNlCisgICAgICB9OworCisgICAgLy8gRWxlbWVudCBjb25zdCBpdGVyYXRvciB0eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgZGV0YWlsOjpfX2NvbmRpdGlvbmFsX3R5cGU8UmV2ZXJzZSwgdHlwZW5hbWUgU3RyaW5nOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yLCB0eXBlbmFtZSBTdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPjo6X190eXBlIGNvbnN0X2l0ZXJhdG9yOworCisgICAgLy8gRWxlbWVudCB0eXBlLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8Y29uc3RfaXRlcmF0b3I+Ojp2YWx1ZV90eXBlIGVfdHlwZTsKKworICAgIGVudW0KKyAgICAgIHsKKwltaW5fZV92YWwgPSBNaW5fRV9WYWwsCisJbWF4X2VfdmFsID0gTWF4X0VfVmFsLAorCW1heF9zaXplID0gbWF4X2VfdmFsIC0gbWluX2VfdmFsICsgMQorICAgICAgfTsKKyAgICBQQl9EU19TVEFUSUNfQVNTRVJUKG1pbl9tYXhfc2l6ZSwgbWF4X3NpemUgPj0gMik7CisKKyAgICAvLyBSZXR1cm5zIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgICAvLyBjb25zdF9rZXlfcmVmZXJlbmNlIGFndW1uZXQuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGJlZ2luKGNvbnN0X2tleV9yZWZlcmVuY2UpOworCisgICAgLy8gUmV0dXJucyBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBhZnRlci1sYXN0IGVsZW1lbnQgb2YKKyAgICAvLyBjb25zdF9rZXlfcmVmZXJlbmNlIGFyZ3VtZW50LgorICAgIGlubGluZSBzdGF0aWMgY29uc3RfaXRlcmF0b3IKKyAgICBlbmQoY29uc3Rfa2V5X3JlZmVyZW5jZSk7CisKKyAgICAvLyBNYXBzIGFuIGVsZW1lbnQgdG8gYSBwb3NpdGlvbi4KKyAgICBpbmxpbmUgc3RhdGljIHNpemVfdHlwZQorICAgIGVfcG9zKGVfdHlwZSBlKTsKKworICBwcml2YXRlOgorCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGJlZ2luX2ltcChjb25zdF9rZXlfcmVmZXJlbmNlLCBkZXRhaWw6OmZhbHNlX3R5cGUpOworCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGJlZ2luX2ltcChjb25zdF9rZXlfcmVmZXJlbmNlLCBkZXRhaWw6OnRydWVfdHlwZSk7CisKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0X2l0ZXJhdG9yCisgICAgZW5kX2ltcChjb25zdF9rZXlfcmVmZXJlbmNlLCBkZXRhaWw6OmZhbHNlX3R5cGUpOworCisgICAgaW5saW5lIHN0YXRpYyBjb25zdF9pdGVyYXRvcgorICAgIGVuZF9pbXAoY29uc3Rfa2V5X3JlZmVyZW5jZSwgZGV0YWlsOjp0cnVlX3R5cGUpOworCisgICAgc3RhdGljIGRldGFpbDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBSZXZlcnNlPiBzX3Jldl9pbmQ7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3N0cmluZ190cmllX2VfYWNjZXNzX3RyYWl0c19pbXAuaHBwPgorCisjdW5kZWYgUEJfRFNfQ0xBU1NfVF9ERUMKKyN1bmRlZiBQQl9EU19DTEFTU19DX0RFQworCisjZGVmaW5lIFBCX0RTX0NMQVNTX1RfREVDIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uc3RfTm9kZV9JdGVyYXRvcix0eXBlbmFtZSBOb2RlX0l0ZXJhdG9yLGNsYXNzIEVfQWNjZXNzX1RyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorCisjZGVmaW5lIFBCX0RTX0NMQVNTX0NfREVDIFwKKyAgdHJpZV9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlPENvbnN0X05vZGVfSXRlcmF0b3IsIE5vZGVfSXRlcmF0b3IsIEVfQWNjZXNzX1RyYWl0cyxBbGxvY2F0b3I+CisKKyNkZWZpbmUgUEJfRFNfQkFTRV9DX0RFQyBcCisgIGRldGFpbDo6dHJpZV9wb2xpY3lfYmFzZTxDb25zdF9Ob2RlX0l0ZXJhdG9yLE5vZGVfSXRlcmF0b3IsRV9BY2Nlc3NfVHJhaXRzLCBBbGxvY2F0b3I+CisKKyAgLy8gQSBub2RlIHVwZGF0b3IgdGhhdCBhbGxvd3MgdHJpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIHRoZSByYW5nZSBvZgorICAvLyB2YWx1ZXMgdGhhdCBtYXRjaCBhIGNlcnRhaW4gcHJlZml4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25zdF9Ob2RlX0l0ZXJhdG9yLAorCSAgIHR5cGVuYW1lIE5vZGVfSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgRV9BY2Nlc3NfVHJhaXRzLAorCSAgIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgY2xhc3MgdHJpZV9wcmVmaXhfc2VhcmNoX25vZGVfdXBkYXRlIDogcHJpdmF0ZSBQQl9EU19CQVNFX0NfREVDCisgIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIFBCX0RTX0JBU0VfQ19ERUMgYmFzZV90eXBlOworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6a2V5X3R5cGUga2V5X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmNvbnN0X2tleV9yZWZlcmVuY2UgY29uc3Rfa2V5X3JlZmVyZW5jZTsKKworICAgIC8vIEVsZW1lbnQgYWNjZXNzIHRyYWl0cy4KKyAgICB0eXBlZGVmIEVfQWNjZXNzX1RyYWl0cyBlX2FjY2Vzc190cmFpdHM7CisKKyAgICAvLyBDb25zdCBlbGVtZW50IGl0ZXJhdG9yLgorICAgIHR5cGVkZWYgdHlwZW5hbWUgZV9hY2Nlc3NfdHJhaXRzOjpjb25zdF9pdGVyYXRvciBjb25zdF9lX2l0ZXJhdG9yOworCisgICAgLy8gQWxsb2NhdG9yIHR5cGUuCisgICAgdHlwZWRlZiBBbGxvY2F0b3IgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAvLyBTaXplIHR5cGUuCisgICAgdHlwZWRlZiB0eXBlbmFtZSBhbGxvY2F0b3JfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIGRldGFpbDo6bnVsbF9ub2RlX21ldGFkYXRhIG1ldGFkYXRhX3R5cGU7CisgICAgdHlwZWRlZiBDb25zdF9Ob2RlX0l0ZXJhdG9yIGNvbnN0X25vZGVfaXRlcmF0b3I7CisgICAgdHlwZWRlZiBOb2RlX0l0ZXJhdG9yIG5vZGVfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25zdF9ub2RlX2l0ZXJhdG9yOjp2YWx1ZV90eXBlIGNvbnN0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgbm9kZV9pdGVyYXRvcjo6dmFsdWVfdHlwZSBpdGVyYXRvcjsKKworICAgIC8vIEZpbmRzIHRoZSBjb25zdCBpdGVyYXRvciByYW5nZSBjb3JyZXNwb25kaW5nIHRvIGFsbCB2YWx1ZXMKKyAgICAvLyB3aG9zZSBwcmVmaXhlcyBtYXRjaCByX2tleS4KKyAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPgorICAgIHByZWZpeF9yYW5nZShjb25zdF9rZXlfcmVmZXJlbmNlKSBjb25zdDsKKworICAgIC8vIEZpbmRzIHRoZSBpdGVyYXRvciByYW5nZSBjb3JyZXNwb25kaW5nIHRvIGFsbCB2YWx1ZXMgd2hvc2UKKyAgICAvLyBwcmVmaXhlcyBtYXRjaCByX2tleS4KKyAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPgorICAgIHByZWZpeF9yYW5nZShjb25zdF9rZXlfcmVmZXJlbmNlKTsKKworICAgIC8vIEZpbmRzIHRoZSBjb25zdCBpdGVyYXRvciByYW5nZSBjb3JyZXNwb25kaW5nIHRvIGFsbCB2YWx1ZXMKKyAgICAvLyB3aG9zZSBwcmVmaXhlcyBtYXRjaCBbYiwgZSkuCisgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICBwcmVmaXhfcmFuZ2UoY29uc3RfZV9pdGVyYXRvciwgY29uc3RfZV9pdGVyYXRvcikgY29uc3Q7CisKKyAgICAvLyBGaW5kcyB0aGUgaXRlcmF0b3IgcmFuZ2UgY29ycmVzcG9uZGluZyB0byBhbGwgdmFsdWVzIHdob3NlCisgICAgLy8gcHJlZml4ZXMgbWF0Y2ggW2IsIGUpLgorICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgcHJlZml4X3JhbmdlKGNvbnN0X2VfaXRlcmF0b3IsIGNvbnN0X2VfaXRlcmF0b3IpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBDYWxsZWQgdG8gdXBkYXRlIGEgbm9kZSdzIG1ldGFkYXRhLgorICAgIGlubGluZSB2b2lkCisgICAgb3BlcmF0b3IoKShub2RlX2l0ZXJhdG9yIG5vZGVfaXQsIGNvbnN0X25vZGVfaXRlcmF0b3IgZW5kX25kX2l0KSBjb25zdDsKKworICBwcml2YXRlOgorICAgIC8vIFJldHVybnMgdGhlIGNvbnN0IGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUganVzdC1hZnRlciBsYXN0IGVsZW1lbnQuCisgICAgdmlydHVhbCBjb25zdF9pdGVyYXRvcgorICAgIGVuZCgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUganVzdC1hZnRlciBsYXN0IGVsZW1lbnQuCisgICAgdmlydHVhbCBpdGVyYXRvcgorICAgIGVuZCgpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGNvbnN0X25vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3Mgcm9vdCBub2RlLgorICAgIHZpcnR1YWwgY29uc3Rfbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzIHJvb3Qgbm9kZS4KKyAgICB2aXJ0dWFsIG5vZGVfaXRlcmF0b3IKKyAgICBub2RlX2JlZ2luKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgY29uc3Rfbm9kZV9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggYSBqdXN0LWFmdGVyIGxlYWYgbm9kZS4KKyAgICB2aXJ0dWFsIGNvbnN0X25vZGVfaXRlcmF0b3IKKyAgICBub2RlX2VuZCgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIG5vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIGEganVzdC1hZnRlciBsZWFmIG5vZGUuCisgICAgdmlydHVhbCBub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9lbmQoKSA9IDA7CisKKyAgICAvLyBBY2Nlc3MgdG8gdGhlIGNtcF9mbiBvYmplY3QuCisgICAgdmlydHVhbCBjb25zdCBlX2FjY2Vzc190cmFpdHMmIAorICAgIGdldF9lX2FjY2Vzc190cmFpdHMoKSBjb25zdCA9IDA7CisKKyAgICBub2RlX2l0ZXJhdG9yCisgICAgbmV4dF9jaGlsZChub2RlX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yLCAKKwkgICAgICAgbm9kZV9pdGVyYXRvciwgY29uc3QgZV9hY2Nlc3NfdHJhaXRzJik7CisgIH07CisKKyNpbmNsdWRlIDxleHQvcGJfZHMvZGV0YWlsL3RyaWVfcG9saWN5L3ByZWZpeF9zZWFyY2hfbm9kZV91cGRhdGVfaW1wLmhwcD4KKworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisKKyNkZWZpbmUgUEJfRFNfQ0xBU1NfQ19ERUMgXAorICB0cmllX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU8Q29uc3RfTm9kZV9JdGVyYXRvciwgTm9kZV9JdGVyYXRvcixFX0FjY2Vzc19UcmFpdHMsIEFsbG9jYXRvcj4KKworICAvLyBGdW5jdG9yIHVwZGF0aW5nIHJhbmtzIG9mIGVudHJlZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnN0X05vZGVfSXRlcmF0b3IsCisJICAgdHlwZW5hbWUgTm9kZV9JdGVyYXRvciwKKwkgICB0eXBlbmFtZSBFX0FjY2Vzc19UcmFpdHMsCisJICAgdHlwZW5hbWUgQWxsb2NhdG9yPgorICBjbGFzcyB0cmllX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGUgOiBwcml2YXRlIFBCX0RTX0JBU0VfQ19ERUMKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgUEJfRFNfQkFTRV9DX0RFQyBiYXNlX3R5cGU7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgRV9BY2Nlc3NfVHJhaXRzIGVfYWNjZXNzX3RyYWl0czsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGVfYWNjZXNzX3RyYWl0czo6Y29uc3RfaXRlcmF0b3IgY29uc3RfZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIEFsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGFsbG9jYXRvcl90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjprZXlfdHlwZSBrZXlfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6Y29uc3Rfa2V5X3JlZmVyZW5jZSBjb25zdF9rZXlfcmVmZXJlbmNlOworCisgICAgdHlwZWRlZiBzaXplX3R5cGUgbWV0YWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIENvbnN0X05vZGVfSXRlcmF0b3IgY29uc3Rfbm9kZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIE5vZGVfSXRlcmF0b3Igbm9kZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbnN0X25vZGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgY29uc3RfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBub2RlX2l0ZXJhdG9yOjp2YWx1ZV90eXBlIGl0ZXJhdG9yOworCisgICAgLy8gRmluZHMgYW4gZW50cnkgYnkgX19vcmRlci4gUmV0dXJucyBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZQorICAgIC8vIGVudHJ5IHdpdGggdGhlIF9fb3JkZXIgb3JkZXIsIG9yIGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlCisgICAgLy8gY29udGFpbmVyIG9iamVjdCdzIGVuZCBpZiBvcmRlciBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLyBjb250YWluZXIgb2JqZWN0LgorICAgIGlubGluZSBjb25zdF9pdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlKSBjb25zdDsKKworICAgIC8vIEZpbmRzIGFuIGVudHJ5IGJ5IF9fb3JkZXIuIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVudHJ5CisgICAgLy8gd2l0aCB0aGUgX19vcmRlciBvcmRlciwgb3IgYW4gaXRlcmF0b3IgdG8gdGhlIGNvbnRhaW5lcgorICAgIC8vIG9iamVjdCdzIGVuZCBpZiBvcmRlciBpcyBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyCisgICAgLy8gb2JqZWN0LgorICAgIGlubGluZSBpdGVyYXRvcgorICAgIGZpbmRfYnlfb3JkZXIoc2l6ZV90eXBlKTsKKworICAgIC8vIFJldHVybnMgdGhlIG9yZGVyIG9mIGEga2V5IHdpdGhpbiBhIHNlcXVlbmNlLiBGb3IgZXhhcG1sZSwgaWYKKyAgICAvLyByX2tleSBpcyB0aGUgc21hbGxlc3Qga2V5LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAwOyBpZiByX2tleQorICAgIC8vIGlzIGEga2V5IGJldHdlZW4gdGhlIHNtYWxsZXN0IGFuZCBuZXh0IGtleSwgdGhpcyBtZXRob2Qgd2lsbAorICAgIC8vIHJldHVybiAxOyBpZiByX2tleSBpcyBhIGtleSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBrZXksIHRoaXMKKyAgICAvLyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNpemUgb2Ygcl9jLgorICAgIGlubGluZSBzaXplX3R5cGUKKyAgICBvcmRlcl9vZl9rZXkoY29uc3Rfa2V5X3JlZmVyZW5jZSkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBvcmRlciBvZiBhIHByZWZpeCB3aXRoaW4gYSBzZXF1ZW5jZS4gRm9yIGV4YXBtbGUsCisgICAgLy8gaWYgW2IsIGVdIGlzIHRoZSBzbWFsbGVzdCBwcmVmaXgsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDA7IGlmCisgICAgLy8gcl9rZXkgaXMgYSBrZXkgYmV0d2VlbiB0aGUgc21hbGxlc3QgYW5kIG5leHQga2V5LCB0aGlzIG1ldGhvZAorICAgIC8vIHdpbGwgcmV0dXJuIDE7IGlmIHJfa2V5IGlzIGEga2V5IGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IGtleSwKKyAgICAvLyB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiByX2MuCisgICAgaW5saW5lIHNpemVfdHlwZQorICAgIG9yZGVyX29mX3ByZWZpeChjb25zdF9lX2l0ZXJhdG9yLCBjb25zdF9lX2l0ZXJhdG9yKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPG1ldGFkYXRhX3R5cGU+OjpvdGhlciBtZXRhZGF0YV9yZWJpbmQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9yZWJpbmQ6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9tZXRhZGF0YV9yZWZlcmVuY2U7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBtZXRhZGF0YV9yZWJpbmQ6OnJlZmVyZW5jZSBtZXRhZGF0YV9yZWZlcmVuY2U7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRhaW5lciBpcyBlbXB0eS4KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICBlbXB0eSgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGl0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJpZSdzIGZpcnN0IGVsZW1lbnQuCisgICAgdmlydHVhbCBpdGVyYXRvcgorICAgIGJlZ2luKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3MKKyAgICAvLyBqdXN0LWFmdGVyLWxhc3QgZWxlbWVudC4KKyAgICB2aXJ0dWFsIGl0ZXJhdG9yCisgICAgZW5kKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgY29uc3Rfbm9kZV9pdGVyYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHRyaWUncyByb290IG5vZGUuCisgICAgdmlydHVhbCBjb25zdF9ub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9iZWdpbigpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIG5vZGVfaXRlcmF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmllJ3Mgcm9vdCBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfYmVnaW4oKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBjb25zdF9ub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIKKyAgICAvLyBsZWFmIG5vZGUuCisgICAgdmlydHVhbCBjb25zdF9ub2RlX2l0ZXJhdG9yCisgICAgbm9kZV9lbmQoKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBub2RlX2l0ZXJhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGp1c3QtYWZ0ZXIgbGVhZiBub2RlLgorICAgIHZpcnR1YWwgbm9kZV9pdGVyYXRvcgorICAgIG5vZGVfZW5kKCkgPSAwOworCisgICAgLy8gQWNjZXNzIHRvIHRoZSBjbXBfZm4gb2JqZWN0LgorICAgIHZpcnR1YWwgZV9hY2Nlc3NfdHJhaXRzJiAKKyAgICBnZXRfZV9hY2Nlc3NfdHJhaXRzKCkgPSAwOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBVcGRhdGVzIHRoZSByYW5rIG9mIGEgbm9kZSB0aHJvdWdoIGEgbm9kZV9pdGVyYXRvciBub2RlX2l0OworICAgIC8vIGVuZF9uZF9pdCBpcyB0aGUgZW5kIG5vZGUgaXRlcmF0b3IuCisgICAgaW5saW5lIHZvaWQKKyAgICBvcGVyYXRvcigpKG5vZGVfaXRlcmF0b3IsIGNvbnN0X25vZGVfaXRlcmF0b3IpIGNvbnN0OworCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB2aXJ0dWFsCisgICAgfnRyaWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZSgpOworICB9OworCisjaW5jbHVkZSA8ZXh0L3BiX2RzL2RldGFpbC90cmllX3BvbGljeS9vcmRlcl9zdGF0aXN0aWNzX2ltcC5ocHA+CisKKyN1bmRlZiBQQl9EU19DTEFTU19UX0RFQworI3VuZGVmIFBCX0RTX0NMQVNTX0NfREVDCisjdW5kZWYgUEJfRFNfQkFTRV9DX0RFQworCit9IC8vIG5hbWVzcGFjZSBfX2dudV9wYmRzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcG9kX2NoYXJfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wb2RfY2hhcl90cmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzlmMDk4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcG9kX2NoYXJfdHJhaXRzLmgKQEAgLTAsMCArMSwxODggQEAKKy8vIFBPRCBjaGFyYWN0ZXIsIHN0ZDo6Y2hhcl90cmFpdHMgc3BlY2lhbGl6YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvcG9kX2NoYXJfdHJhaXRzLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBHYWJyaWVsIERvcyBSZWlzIDxnZHJAaW50ZWdyYWJsZS1zb2x1dGlvbnMubmV0PgorLy8gQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisKKyNpZm5kZWYgX1BPRF9DSEFSX1RSQUlUU19ICisjZGVmaW5lIF9QT0RfQ0hBUl9UUkFJVFNfSCAxCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBQT0QgY2hhcmFjdGVyIGFic3RyYWN0aW9uLgorICAvLyBOQjogVGhlIGNoYXJfdHlwZSBwYXJhbWV0ZXIgaXMgYSBzdWJzZXQgb2YgaW50X3R5cGUsIGFzIHRvIGFsbG93CisgIC8vIGludF90eXBlIHRvIHByb3Blcmx5IGhvbGQgdGhlIGZ1bGwgcmFuZ2Ugb2YgY2hhcl90eXBlIHZhbHVlcyBhcworICAvLyB3ZWxsIGFzIEVPRi4KKyAgLy8vIEBicmllZiBBIFBPRCBjbGFzcyB0aGF0IHNlcnZlcyBhcyBhIGNoYXJhY3RlciBhYnN0cmFjdGlvbiBjbGFzcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgViwgdHlwZW5hbWUgSSwgdHlwZW5hbWUgUyA9IHN0ZDo6bWJzdGF0ZV90PgorICAgIHN0cnVjdCBjaGFyYWN0ZXIKKyAgICB7CisgICAgICB0eXBlZGVmIFYJCQkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgSQkJCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgUwkJCQlzdGF0ZV90eXBlOworICAgICAgdHlwZWRlZiBjaGFyYWN0ZXI8ViwgSSwgUz4JY2hhcl90eXBlOworCisgICAgICB2YWx1ZV90eXBlCXZhbHVlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWMj4KKyAgICAgICAgc3RhdGljIGNoYXJfdHlwZQorICAgICAgICBmcm9tKGNvbnN0IFYyJiB2KQorICAgICAgICB7CisJICBjaGFyX3R5cGUgcmV0ID0geyBzdGF0aWNfY2FzdDx2YWx1ZV90eXBlPih2KSB9OworCSAgcmV0dXJuIHJldDsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFYyPgorICAgICAgICBzdGF0aWMgVjIKKyAgICAgICAgdG8oY29uc3QgY2hhcl90eXBlJiBjKQorICAgICAgICB7CisJICBWMiByZXQgPSB7IHN0YXRpY19jYXN0PFYyPihjLnZhbHVlKSB9OworCSAgcmV0dXJuIHJldDsKKwl9CisKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lIEksIHR5cGVuYW1lIFM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGNoYXJhY3RlcjxWLCBJLCBTPiYgbGhzLCBjb25zdCBjaGFyYWN0ZXI8ViwgSSwgUz4mIHJocykKKyAgICB7IHJldHVybiBsaHMudmFsdWUgPT0gcmhzLnZhbHVlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgViwgdHlwZW5hbWUgSSwgdHlwZW5hbWUgUz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBjaGFyYWN0ZXI8ViwgSSwgUz4mIGxocywgY29uc3QgY2hhcmFjdGVyPFYsIEksIFM+JiByaHMpCisgICAgeyByZXR1cm4gbGhzLnZhbHVlIDwgcmhzLnZhbHVlOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBjaGFyX3RyYWl0czxfX2dudV9jeHg6OmNoYXJhY3Rlcj4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFYsIHR5cGVuYW1lIEksIHR5cGVuYW1lIFM+CisgICAgc3RydWN0IGNoYXJfdHJhaXRzPF9fZ251X2N4eDo6Y2hhcmFjdGVyPFYsIEksIFM+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6Y2hhcmFjdGVyPFYsIEksIFM+CWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhcl90eXBlOjppbnRfdHlwZQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhcl90eXBlOjpzdGF0ZV90eXBlCXN0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIGZwb3M8c3RhdGVfdHlwZT4JCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RyZWFtb2ZmCQkJCW9mZl90eXBlOworCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgYXNzaWduKGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyBfX2MxID0gX19jMjsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgZXEoY29uc3QgY2hhcl90eXBlJiBfX2MxLCBjb25zdCBjaGFyX3R5cGUmIF9fYzIpCisgICAgICB7IHJldHVybiBfX2MxID09IF9fYzI7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIGx0KGNvbnN0IGNoYXJfdHlwZSYgX19jMSwgY29uc3QgY2hhcl90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA8IF9fYzI7IH0KKworICAgICAgc3RhdGljIGludAorICAgICAgY29tcGFyZShjb25zdCBjaGFyX3R5cGUqIF9fczEsIGNvbnN0IGNoYXJfdHlwZSogX19zMiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlmb3IgKHNpemVfdCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgaWYgKCFlcShfX3MxW19faV0sIF9fczJbX19pXSkpCisJICAgIHJldHVybiBsdChfX3MxW19faV0sIF9fczJbX19pXSkgPyAtMSA6IDE7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIGxlbmd0aChjb25zdCBjaGFyX3R5cGUqIF9fcykKKyAgICAgIHsKKwljb25zdCBjaGFyX3R5cGUqIF9fcCA9IF9fczsKKwl3aGlsZSAoX19wLT52YWx1ZSkKKwkgICsrX19wOworCXJldHVybiAoX19wIC0gX19zKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNvbnN0IGNoYXJfdHlwZSoKKyAgICAgIGZpbmQoY29uc3QgY2hhcl90eXBlKiBfX3MsIHNpemVfdCBfX24sIGNvbnN0IGNoYXJfdHlwZSYgX19hKQorICAgICAgeworCWZvciAoY29uc3QgY2hhcl90eXBlKiBfX3AgPSBfX3M7IHNpemVfdChfX3AgLSBfX3MpIDwgX19uOyArK19fcCkKKwkgIGlmICgqX19wID09IF9fYSkKKwkgICAgcmV0dXJuIF9fcDsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIG1vdmUoY2hhcl90eXBlKiBfX3MxLCBjb25zdCBjaGFyX3R5cGUqIF9fczIsIHNpemVfdCBfX24pCisgICAgICB7IAorCXJldHVybiBzdGF0aWNfY2FzdDxjaGFyX3R5cGUqPgorCSAgKF9fYnVpbHRpbl9tZW1tb3ZlKF9fczEsIF9fczIsIF9fbiAqIHNpemVvZihjaGFyX3R5cGUpKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjaGFyX3R5cGUqCisgICAgICBjb3B5KGNoYXJfdHlwZSogX19zMSwgY29uc3QgY2hhcl90eXBlKiBfX3MyLCBzaXplX3QgX19uKQorICAgICAgeworCXN0ZDo6Y29weShfX3MyLCBfX3MyICsgX19uLCBfX3MxKTsKKwlyZXR1cm4gX19zMTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZSoKKyAgICAgIGFzc2lnbihjaGFyX3R5cGUqIF9fcywgc2l6ZV90IF9fbiwgY2hhcl90eXBlIF9fYSkKKyAgICAgIHsKKwlzdGQ6OmZpbGxfbihfX3MsIF9fbiwgX19hKTsKKyAgICAgICAgcmV0dXJuIF9fczsKKyAgICAgIH0KKworICAgICAgc3RhdGljIGNoYXJfdHlwZQorICAgICAgdG9fY2hhcl90eXBlKGNvbnN0IGludF90eXBlJiBfX2kpCisgICAgICB7IHJldHVybiBjaGFyX3R5cGU6OnRlbXBsYXRlIGZyb20oX19pKTsgfQorCisgICAgICBzdGF0aWMgaW50X3R5cGUKKyAgICAgIHRvX2ludF90eXBlKGNvbnN0IGNoYXJfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gY2hhcl90eXBlOjp0ZW1wbGF0ZSB0bzxpbnRfdHlwZT4oX19jKTsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgZXFfaW50X3R5cGUoY29uc3QgaW50X3R5cGUmIF9fYzEsIGNvbnN0IGludF90eXBlJiBfX2MyKQorICAgICAgeyByZXR1cm4gX19jMSA9PSBfX2MyOyB9CisKKyAgICAgIHN0YXRpYyBpbnRfdHlwZQorICAgICAgZW9mKCkgCisgICAgICB7CisJaW50X3R5cGUgX19yID0geyAtMSB9OworCXJldHVybiBfX3I7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBpbnRfdHlwZQorICAgICAgbm90X2VvZihjb25zdCBpbnRfdHlwZSYgX19jKQorICAgICAgeyByZXR1cm4gZXFfaW50X3R5cGUoX19jLCBlb2YoKSkgPyBpbnRfdHlwZSgpIDogX19jOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BvaW50ZXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3BvaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThhZTUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcG9pbnRlci5oCkBAIC0wLDAgKzEsNTcwIEBACisvLyBDdXN0b20gcG9pbnRlciBhZGFwdGVyIGFuZCBzYW1wbGUgc3RvcmFnZSBwb2xpY2llcworCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiAgQGZpbGUgZXh0L3BvaW50ZXIuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICoKKyAqICBAYXV0aG9yIEJvYiBXYWx0ZXJzCisgKgorICogUHJvdmlkZXMgcmV1c2FibGUgX1BvaW50ZXJfYWRhcHRlciBmb3IgYXNzaXN0aW5nIGluIHRoZSBkZXZlbG9wbWVudCBvZgorICogY3VzdG9tIHBvaW50ZXIgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBzdGFuZGFyZCBjb250YWluZXJzIHZpYQorICogdGhlIGFsbG9jYXRvcjo6cG9pbnRlciBhbmQgYWxsb2NhdG9yOjpjb25zdF9wb2ludGVyIHR5cGVkZWZzLgorICovCisKKyNpZm5kZWYgX1BPSU5URVJfSAorI2RlZmluZSBfUE9JTlRFUl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxleHQvY2FzdC5oPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqIAorICAgKiBAYnJpZWYgQSBzdG9yYWdlIHBvbGljeSBmb3IgdXNlIHdpdGggX1BvaW50ZXJfYWRhcHRlcjw+IHdoaWNoIHlpZWxkcyBhCisgICAqICAgICAgICBzdGFuZGFyZCBwb2ludGVyLgorICAgKiAKKyAgICogIEEgX1N0b3JhZ2VfcG9saWN5IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgNCB0aGluZ3M6CisgICAqICAgIDEpIEEgZ2V0KCkgQVBJIGZvciByZXR1cm5pbmcgdGhlIHN0b3JlZCBwb2ludGVyIHZhbHVlLgorICAgKiAgICAyKSBBbiBzZXQoKSBBUEkgZm9yIHN0b3JpbmcgYSBwb2ludGVyIHZhbHVlLgorICAgKiAgICAzKSBBbiBlbGVtZW50X3R5cGUgdHlwZWRlZiB0byBkZWZpbmUgdGhlIHR5cGUgdGhpcyBwb2ludHMgdG8uCisgICAqICAgIDQpIEFuIG9wZXJhdG9yPCgpIHRvIHN1cHBvcnQgcG9pbnRlciBjb21wYXJpc29uLgorICAgKiAgICA1KSBBbiBvcGVyYXRvcj09KCkgdG8gc3VwcG9ydCBwb2ludGVyIGNvbXBhcmlzb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIF9TdGRfcG9pbnRlcl9pbXBsIAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0aGUgdHlwZSB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvLgorICAgICAgdHlwZWRlZiBfVHAgZWxlbWVudF90eXBlOworICAKKyAgICAgIC8vIEEgbWV0aG9kIHRvIGZldGNoIHRoZSBwb2ludGVyIHZhbHVlIGFzIGEgc3RhbmRhcmQgVCogdmFsdWU7CisgICAgICBpbmxpbmUgX1RwKiAKKyAgICAgIGdldCgpIGNvbnN0IAorICAgICAgeyByZXR1cm4gX01fdmFsdWU7IH0KKyAgCisgICAgICAvLyBBIG1ldGhvZCB0byBzZXQgdGhlIHBvaW50ZXIgdmFsdWUsIGZyb20gYSBzdGFuZGFyZCBUKiB2YWx1ZTsKKyAgICAgIGlubGluZSB2b2lkIAorICAgICAgc2V0KGVsZW1lbnRfdHlwZSogX19hcmcpIAorICAgICAgeyBfTV92YWx1ZSA9IF9fYXJnOyB9CisgIAorICAgICAgLy8gQ29tcGFyaXNvbiBvZiBwb2ludGVycworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBfU3RkX3BvaW50ZXJfaW1wbCYgX19yYXJnKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9NX3ZhbHVlIDwgX19yYXJnLl9NX3ZhbHVlKTsgfQorICAKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9TdGRfcG9pbnRlcl9pbXBsJiBfX3JhcmcpIGNvbnN0CisgICAgICB7IHJldHVybiAoX01fdmFsdWUgPT0gX19yYXJnLl9NX3ZhbHVlKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGVsZW1lbnRfdHlwZSogX01fdmFsdWU7CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIEEgc3RvcmFnZSBwb2xpY3kgZm9yIHVzZSB3aXRoIF9Qb2ludGVyX2FkYXB0ZXI8PiB3aGljaCBzdG9yZXMKKyAgICogICAgICAgIHRoZSBwb2ludGVyJ3MgYWRkcmVzcyBhcyBhbiBvZmZzZXQgdmFsdWUgd2hpY2ggaXMgcmVsYXRpdmUgdG8KKyAgICogICAgICAgIGl0cyBvd24gYWRkcmVzcy4KKyAgICogCisgICAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHBvaW50ZXJzIHdpdGhpbiBzaGFyZWQgbWVtb3J5IHJlZ2lvbnMgd2hpY2gKKyAgICogbWlnaHQgYmUgbWFwcGVkIGF0IGRpZmZlcmVudCBhZGRyZXNzZXMgYnkgZGlmZmVyZW50IHByb2Nlc3Nlcy4KKyAgICogRm9yIG51bGwgcG9pbnRlcnMsIGEgdmFsdWUgb2YgMSBpcyB1c2VkLiAgKDAgaXMgbGVnaXRpbWF0ZQorICAgKiBzb21ldGltZXMgZm9yIG5vZGVzIGluIGNpcmN1bGFybHkgbGlua2VkIGxpc3RzKSBUaGlzIHZhbHVlIHdhcworICAgKiBjaG9zZW4gYXMgdGhlIGxlYXN0IGxpa2VseSB0byBnZW5lcmF0ZSBhbiBpbmNvcnJlY3QgbnVsbCwgQXMKKyAgICogdGhlcmUgaXMgbm8gcmVhc29uIHdoeSBhbnkgbm9ybWFsIHBvaW50ZXIgd291bGQgcG9pbnQgMSBieXRlIGludG8KKyAgICogaXRzIG93biBwb2ludGVyIGFkZHJlc3MuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIF9SZWxhdGl2ZV9wb2ludGVyX2ltcGwgCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKyAgCisgICAgICBfVHAqCisgICAgICBnZXQoKSBjb25zdCAKKyAgICAgIHsKKyAgICAgICAgaWYgKF9NX2RpZmYgPT0gMSkKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PF9UcCo+KHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzKQorCQkJCQkrIF9NX2RpZmYpOworICAgICAgfQorICAKKyAgICAgIHZvaWQgCisgICAgICBzZXQoX1RwKiBfX2FyZykKKyAgICAgIHsKKyAgICAgICAgaWYgKCFfX2FyZykKKyAgICAgICAgICBfTV9kaWZmID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9NX2RpZmYgPSByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX19hcmcpIAorICAgICAgICAgICAgICAgICAgICAtIHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPih0aGlzKTsKKyAgICAgIH0KKyAgCisgICAgICAvLyBDb21wYXJpc29uIG9mIHBvaW50ZXJzCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IF9SZWxhdGl2ZV9wb2ludGVyX2ltcGwmIF9fcmFyZykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChyZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcy0+Z2V0KCkpCisJCTwgcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KF9fcmFyZy5nZXQoKSkpOyB9CisKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IF9SZWxhdGl2ZV9wb2ludGVyX2ltcGwmIF9fcmFyZykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChyZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcy0+Z2V0KCkpCisJCT09IHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX3JhcmcuZ2V0KCkpKTsgfQorCisgICAgcHJpdmF0ZToKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPAorCSAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID49IHNpemVvZih2b2lkKikpLAorCSB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmc+OjpfX3R5cGUgX1VJbnRQdHJUeXBlOworI2Vsc2UKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfVUludFB0clR5cGU7CisjZW5kaWYKKyAgICAgIF9VSW50UHRyVHlwZSBfTV9kaWZmOworICAgIH07CisgIAorICAvKioKKyAgICogUmVsYXRpdmVfcG9pbnRlcl9pbXBsIG5lZWRzIGEgc3BlY2lhbGl6YXRpb24gZm9yIGNvbnN0IFQgYmVjYXVzZSBvZgorICAgKiB0aGUgY2FzdGluZyBkb25lIGR1cmluZyBwb2ludGVyIGFyaXRobWV0aWMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIF9SZWxhdGl2ZV9wb2ludGVyX2ltcGw8Y29uc3QgX1RwPiAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBjb25zdCBfVHAgZWxlbWVudF90eXBlOworICAKKyAgICAgIGNvbnN0IF9UcCoKKyAgICAgIGdldCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmIChfTV9kaWZmID09IDEpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBfVHAqPgorCSAgICAgIChyZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcykgKyBfTV9kaWZmKTsKKyAgICAgIH0KKyAgCisgICAgICB2b2lkIAorICAgICAgc2V0KGNvbnN0IF9UcCogX19hcmcpCisgICAgICB7CisgICAgICAgIGlmICghX19hcmcpCisgICAgICAgICAgX01fZGlmZiA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTV9kaWZmID0gcmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KF9fYXJnKSAKKyAgICAgICAgICAgICAgICAgICAgLSByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4odGhpcyk7CisgICAgICB9CisgIAorICAgICAgLy8gQ29tcGFyaXNvbiBvZiBwb2ludGVycworICAgICAgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPChjb25zdCBfUmVsYXRpdmVfcG9pbnRlcl9pbXBsJiBfX3JhcmcpIGNvbnN0CisgICAgICB7IHJldHVybiAocmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMtPmdldCgpKQorCQk8IHJlaW50ZXJwcmV0X2Nhc3Q8X1VJbnRQdHJUeXBlPihfX3JhcmcuZ2V0KCkpKTsgfQorCisgICAgICBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfUmVsYXRpdmVfcG9pbnRlcl9pbXBsJiBfX3JhcmcpIGNvbnN0CisgICAgICB7IHJldHVybiAocmVpbnRlcnByZXRfY2FzdDxfVUludFB0clR5cGU+KHRoaXMtPmdldCgpKQorCQk9PSByZWludGVycHJldF9jYXN0PF9VSW50UHRyVHlwZT4oX19yYXJnLmdldCgpKSk7IH0KKyAgCisgICAgcHJpdmF0ZToKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPAorCSAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID49IHNpemVvZih2b2lkKikpLAorCSB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nIGxvbmc+OjpfX3R5cGUgX1VJbnRQdHJUeXBlOworI2Vsc2UKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfVUludFB0clR5cGU7CisjZW5kaWYKKyAgICAgICBfVUludFB0clR5cGUgX01fZGlmZjsKKyAgICB9OworCisgIC8qKgorICAgKiBUaGUgc3BlY2lhbGl6YXRpb24gb24gdGhpcyB0eXBlIGhlbHBzIHJlc29sdmUgdGhlIHByb2JsZW0gb2YKKyAgICogcmVmZXJlbmNlIHRvIHZvaWQsIGFuZCBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIHNwZWNpYWxpemUKKyAgICogX1BvaW50ZXJfYWRhcHRlciBmb3IgY2FzZXMgb2Ygdm9pZCosIGNvbnN0IHZvaWQqLCBhbmQgc28gb24uCisgICAqLworICBzdHJ1Y3QgX0ludmFsaWRfdHlwZSB7IH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2VfdHlwZSAKKyAgICB7IHR5cGVkZWYgX1RwJiByZWZlcmVuY2U7IH07CisKKyAgdGVtcGxhdGU8PiAKKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV90eXBlPHZvaWQ+IAorICAgIHsgdHlwZWRlZiBfSW52YWxpZF90eXBlJiByZWZlcmVuY2U7IH07CisKKyAgdGVtcGxhdGU8PiAKKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV90eXBlPGNvbnN0IHZvaWQ+IAorICAgIHsgdHlwZWRlZiBjb25zdCBfSW52YWxpZF90eXBlJiByZWZlcmVuY2U7IH07CisKKyAgdGVtcGxhdGU8PiAKKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV90eXBlPHZvbGF0aWxlIHZvaWQ+IAorICAgIHsgdHlwZWRlZiB2b2xhdGlsZSBfSW52YWxpZF90eXBlJiAgcmVmZXJlbmNlOyB9OworCisgIHRlbXBsYXRlPD4gCisgICAgc3RydWN0IF9SZWZlcmVuY2VfdHlwZTx2b2xhdGlsZSBjb25zdCB2b2lkPiAKKyAgICB7IHR5cGVkZWYgY29uc3Qgdm9sYXRpbGUgX0ludmFsaWRfdHlwZSYgIHJlZmVyZW5jZTsgfTsKKworICAvKioKKyAgICogVGhpcyBzdHJ1Y3R1cmUgYWNjb21vZGF0ZXMgdGhlIHdheSBpbiB3aGljaAorICAgKiBzdGQ6Oml0ZXJhdG9yX3RyYWl0czw+IGlzIG5vcm1hbGx5IHNwZWNpYWxpemVkIGZvciBjb25zdCBUKiwgc28KKyAgICogdGhhdCB2YWx1ZV90eXBlIGlzIHN0aWxsIFQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIHN0cnVjdCBfVW5xdWFsaWZpZWRfdHlwZSAKKyAgICB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisgICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgc3RydWN0IF9VbnF1YWxpZmllZF90eXBlPGNvbnN0IF9UcD4gCisgICAgeyB0eXBlZGVmIF9UcCB0eXBlOyB9OworICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IAorICAgIHN0cnVjdCBfVW5xdWFsaWZpZWRfdHlwZTx2b2xhdGlsZSBfVHA+IAorICAgIHsgdHlwZWRlZiB2b2xhdGlsZSBfVHAgdHlwZTsgfTsKKyAgICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBzdHJ1Y3QgX1VucXVhbGlmaWVkX3R5cGU8dm9sYXRpbGUgY29uc3QgX1RwPiAKKyAgICB7IHR5cGVkZWYgdm9sYXRpbGUgX1RwIHR5cGU7IH07CisgIAorICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBwcm92aWRlcyBhbiAnYWx0ZXJuYXRpdmUgcG9pbnRlcicgdGhhdCB3b3JrcyB3aXRoCisgICAqIHRoZSBjb250YWluZXJzIHdoZW4gc3BlY2lmaWVkIGFzIHRoZSBwb2ludGVyIHR5cGVkZWYgb2YgdGhlCisgICAqIGFsbG9jYXRvci4KKyAgICoKKyAgICogVGhlIHBvaW50ZXIgdHlwZSB1c2VkIHdpdGggdGhlIGNvbnRhaW5lcnMgZG9lc24ndCBoYXZlIHRvIGJlIHRoaXMKKyAgICogY2xhc3MsIGJ1dCBpdCBtdXN0IHN1cHBvcnQgdGhlIGltcGxpY2l0IGNvbnZlcnNpb25zLCBwb2ludGVyCisgICAqIGFyaXRobWV0aWMsIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBldGMuIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzCisgICAqIGNsYXNzLCBhbmQgYXZvaWQgcmFpc2luZyBjb21waWxlLXRpbWUgYW1iaWd1aXRpZXMuICBCZWNhdXNlCisgICAqIGNyZWF0aW5nIGEgd29ya2luZyBwb2ludGVyIGNhbiBiZSBjaGFsbGVuZ2luZywgdGhpcyBwb2ludGVyCisgICAqIHRlbXBsYXRlIHdhcyBkZXNpZ25lZCB0byB3cmFwcGVyIGFuIGVhc2llciBzdG9yYWdlIHBvbGljeSB0eXBlLAorICAgKiBzbyB0aGF0IGl0IGJlY29tZXMgcmV1c2FibGUgZm9yIGNyZWF0aW5nIG90aGVyIHBvaW50ZXIgdHlwZXMuCisgICAqCisgICAqIEEga2V5IHBvaW50IG9mIHRoaXMgY2xhc3MgaXMgYWxzbyB0aGF0IGl0IGFsbG93cyBjb250YWluZXIKKyAgICogd3JpdGVycyB0byAnYXNzdW1lJyBBbG9jYXRvcjo6cG9pbnRlciBpcyBhIHR5cGVkZWYgZm9yIGEgbm9ybWFsCisgICAqIHBvaW50ZXIuICBUaGlzIGNsYXNzIHN1cHBvcnRzIG1vc3Qgb2YgdGhlIGNvbnZlbnRpb25zIG9mIGEgdHJ1ZQorICAgKiBwb2ludGVyLCBhbmQgY2FuLCBmb3IgaW5zdGFuY2UgaGFuZGxlIGltcGxpY2l0IGNvbnZlcnNpb24gdG8KKyAgICogY29uc3QgYW5kIGJhc2UgY2xhc3MgcG9pbnRlciB0eXBlcy4gIFRoZSBvbmx5IGltcG9zaXRpb25zIG9uCisgICAqIGNvbnRhaW5lciB3cml0ZXJzIHRvIHN1cHBvcnQgZXh0ZW5kZWQgcG9pbnRlcnMgYXJlOiAxKSB1c2UgdGhlCisgICAqIEFsbG9jYXRvcjo6cG9pbnRlciB0eXBlZGVmIGFwcHJvcHJpYXRlbHkgZm9yIHBvaW50ZXIgdHlwZXMuICAyKQorICAgKiBpZiB5b3UgbmVlZCBwb2ludGVyIGNhc3RpbmcsIHVzZSB0aGUgX19wb2ludGVyX2Nhc3Q8PiBmdW5jdGlvbnMKKyAgICogZnJvbSBleHQvY2FzdC5oLiAgVGhpcyBhbGxvd3MgcG9pbnRlciBjYXN0IG9wZXJhdGlvbnMgdG8gYmUKKyAgICogb3ZlcmxvYWRlZCBpcyBuZWNlc3NhcnkgYnkgY3VzdG9tIHBvaW50ZXJzLgorICAgKgorICAgKiBOb3RlOiBUaGUgY29uc3QgcXVhbGlmaWVyIHdvcmtzIHdpdGggdGhpcyBwb2ludGVyIGFkYXB0ZXIgYXMKKyAgICogZm9sbG93czoKKyAgICoKKyAgICogX1RwKiAgICAgICAgICAgICA9PSBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPF9UcD4gPjsKKyAgICogY29uc3QgX1RwKiAgICAgICA9PSBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPGNvbnN0IF9UcD4gPjsKKyAgICogX1RwKiBjb25zdCAgICAgICA9PSBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPF9UcD4gPjsKKyAgICogY29uc3QgX1RwKiBjb25zdCA9PSBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9TdGRfcG9pbnRlcl9pbXBsPGNvbnN0IF9UcD4gPjsKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdG9yYWdlX3BvbGljeT4KKyAgICBjbGFzcyBfUG9pbnRlcl9hZGFwdGVyIDogcHVibGljIF9TdG9yYWdlX3BvbGljeSAKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU3RvcmFnZV9wb2xpY3k6OmVsZW1lbnRfdHlwZSBlbGVtZW50X3R5cGU7CisKKyAgICAgIC8vIFRoZXNlIGFyZSBuZWVkZWQgZm9yIGl0ZXJhdG9yX3RyYWl0cworICAgICAgdHlwZWRlZiBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVW5xdWFsaWZpZWRfdHlwZTxlbGVtZW50X3R5cGU+Ojp0eXBlIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBfUG9pbnRlcl9hZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZWZlcmVuY2VfdHlwZTxlbGVtZW50X3R5cGU+OjpyZWZlcmVuY2UgIHJlZmVyZW5jZTsKKworICAgICAgLy8gUmVtaW5kZXI6ICdjb25zdCcgbWV0aG9kcyBtZWFuIHRoYXQgdGhlIG1ldGhvZCBpcyB2YWxpZCB3aGVuIHRoZSAKKyAgICAgIC8vIHBvaW50ZXIgaXMgaW1tdXRhYmxlLCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGV0aGVyIHRoZSAKKyAgICAgIC8vICdwb2ludGVlJyBpcyBjb25zdC4KKworICAgICAgLy8gRGVmYXVsdCBDb25zdHJ1Y3RvciAoQ29udmVydCBmcm9tIGVsZW1lbnRfdHlwZSopCisgICAgICBfUG9pbnRlcl9hZGFwdGVyKGVsZW1lbnRfdHlwZSogX19hcmcgPSAwKQorICAgICAgeyBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZyk7IH0KKworICAgICAgLy8gQ29weSBjb25zdHJ1Y3RvciBmcm9tIF9Qb2ludGVyX2FkYXB0ZXIgb2Ygc2FtZSB0eXBlLgorICAgICAgX1BvaW50ZXJfYWRhcHRlcihjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2FyZykgCisgICAgICB7IF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnLmdldCgpKTsgfQorCisgICAgICAvLyBDb252ZXJ0IGZyb20gX1VwKiBpZiBjb252ZXJzaW9uIHRvIGVsZW1lbnRfdHlwZSogaXMgdmFsaWQuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIF9Qb2ludGVyX2FkYXB0ZXIoX1VwKiBfX2FyZykKKyAgICAgICAgeyBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZyk7IH0KKworICAgICAgLy8gQ29udmVyc2lvbiBmcm9tIGFub3RoZXIgX1BvaW50ZXJfYWRhcHRlciBpZiBfVXAgaWYgc3RhdGljIGNhc3QgaXMKKyAgICAgIC8vIHZhbGlkLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBfUG9pbnRlcl9hZGFwdGVyKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1VwPiYgX19hcmcpCisgICAgICAgIHsgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX19hcmcuZ2V0KCkpOyB9CisKKyAgICAgIC8vIERlc3RydWN0b3IKKyAgICAgIH5fUG9pbnRlcl9hZGFwdGVyKCkgeyB9CisgIAorICAgICAgLy8gQXNzaWdubWVudCBvcGVyYXRvcgorICAgICAgX1BvaW50ZXJfYWRhcHRlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2FyZykgCisgICAgICB7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnLmdldCgpKTsgCisgICAgICAgIHJldHVybiAqdGhpczsgCisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgX1BvaW50ZXJfYWRhcHRlciYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1VwPiYgX19hcmcpCisgICAgICAgIHsKKyAgICAgICAgICBfU3RvcmFnZV9wb2xpY3k6OnNldChfX2FyZy5nZXQoKSk7IAorICAgICAgICAgIHJldHVybiAqdGhpczsgCisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPgorICAgICAgICBfUG9pbnRlcl9hZGFwdGVyJgorICAgICAgICBvcGVyYXRvcj0oX1VwKiBfX2FyZykKKyAgICAgICAgeworICAgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9fYXJnKTsgCisgICAgICAgICAgcmV0dXJuICp0aGlzOyAKKyAgICAgICAgfQorCisgICAgICAvLyBPcGVyYXRvciosIHJldHVybnMgZWxlbWVudF90eXBlJgorICAgICAgaW5saW5lIHJlZmVyZW5jZSAKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0IAorICAgICAgeyByZXR1cm4gKihfU3RvcmFnZV9wb2xpY3k6OmdldCgpKTsgfQorCisgICAgICAvLyBPcGVyYXRvci0+LCByZXR1cm5zIGVsZW1lbnRfdHlwZSoKKyAgICAgIGlubGluZSBlbGVtZW50X3R5cGUqIAorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IAorICAgICAgeyByZXR1cm4gX1N0b3JhZ2VfcG9saWN5OjpnZXQoKTsgfQorCisgICAgICAvLyBPcGVyYXRvcltdLCByZXR1cm5zIGEgZWxlbWVudF90eXBlJiB0byB0aGUgaXRlbSBhdCB0aGF0IGxvYy4KKyAgICAgIGlubGluZSByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc3RkOjpwdHJkaWZmX3QgX19pbmRleCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TdG9yYWdlX3BvbGljeTo6Z2V0KClbX19pbmRleF07IH0KKworICAgICAgLy8gVG8gYWxsb3cgaW1wbGljaXQgY29udmVyc2lvbiB0byAiYm9vbCIsIGZvciAiaWYgKHB0cikuLi4iCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgZWxlbWVudF90eXBlKihfUG9pbnRlcl9hZGFwdGVyOjoqX191bnNwZWNpZmllZF9ib29sX3R5cGUpKCkgY29uc3Q7CisKKyAgICBwdWJsaWM6CisgICAgICBvcGVyYXRvciBfX3Vuc3BlY2lmaWVkX2Jvb2xfdHlwZSgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiBfU3RvcmFnZV9wb2xpY3k6OmdldCgpID09IDAgPyAwIDogCisgICAgICAgICAgICAgICAgICAgICAgICAgJl9Qb2ludGVyX2FkYXB0ZXI6Om9wZXJhdG9yLT47IAorICAgICAgfQorCisgICAgICAvLyAhIG9wZXJhdG9yIChmb3I6IGlmICghcHRyKS4uLikKKyAgICAgIGlubGluZSBib29sCisgICAgICBvcGVyYXRvciEoKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIChfU3RvcmFnZV9wb2xpY3k6OmdldCgpID09IDApOyB9CisgIAorICAgICAgLy8gUG9pbnRlciBkaWZmZXJlbmNlcworICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6OnB0cmRpZmZfdCAKKyAgICAgIG9wZXJhdG9yLShjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX2xocywgZWxlbWVudF90eXBlKiBfX3JocykgCisgICAgICB7IHJldHVybiAoX19saHMuZ2V0KCkgLSBfX3Jocyk7IH0KKyAgCisgICAgICBpbmxpbmUgZnJpZW5kIHN0ZDo6cHRyZGlmZl90IAorICAgICAgb3BlcmF0b3ItKGVsZW1lbnRfdHlwZSogX19saHMsIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fcmhzKSAKKyAgICAgIHsgcmV0dXJuIChfX2xocyAtIF9fcmhzLmdldCgpKTsgfQorICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6OnB0cmRpZmZfdCAKKyAgICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fbGhzLCBfVXAqIF9fcmhzKSAKKyAgICAgICAgeyByZXR1cm4gKF9fbGhzLmdldCgpIC0gX19yaHMpOyB9CisgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+CisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpwdHJkaWZmX3QgCisgICAgICAgIG9wZXJhdG9yLShfVXAqIF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX3JocykKKyAgICAgICAgeyByZXR1cm4gKF9fbGhzIC0gX19yaHMuZ2V0KCkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgaW5saW5lIHN0ZDo6cHRyZGlmZl90IAorICAgICAgICBvcGVyYXRvci0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVXA+JiBfX3JocykgY29uc3QgCisgICAgICAgIHsgcmV0dXJuIChfU3RvcmFnZV9wb2xpY3k6OmdldCgpIC0gX19yaHMuZ2V0KCkpOyB9CisgIAorICAgICAgLy8gUG9pbnRlciBtYXRoCisgICAgICAvLyBOb3RlOiBUaGVyZSBpcyBhIHJlYXNvbiBmb3IgYWxsIHRoaXMgb3ZlcmxvYWRpbmcgYmFzZWQgb24gZGlmZmVyZW50CisgICAgICAvLyBpbnRlZ2VyIHR5cGVzLiAgSW4gc29tZSBsaWJzdGRjKystdjMgdGVzdCBjYXNlcywgYSB0ZW1wbGF0ZWQKKyAgICAgIC8vIG9wZXJhdG9yKyBpcyBkZWNsYXJlZCB3aGljaCBjYW4gbWF0Y2ggYW55IHR5cGVzLiAgVGhpcyBvcGVyYXRvcgorICAgICAgLy8gdGVuZHMgdG8gInN0ZWFsIiB0aGUgcmVjb2duaXRpb24gb2YgX1BvaW50ZXJfYWRhcHRlcidzIG93biBvcGVyYXRvcisgCisgICAgICAvLyB1bmxlc3MgdGhlIGludGVnZXIgdHlwZSBtYXRjaGVzIHBlcmZlY3RseS4KKworI2RlZmluZSBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKElOVF9UWVBFKSBcCisgICAgICBpbmxpbmUgZnJpZW5kIF9Qb2ludGVyX2FkYXB0ZXIgXAorICAgICAgb3BlcmF0b3IrKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fbGhzLCBJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyByZXR1cm4gX1BvaW50ZXJfYWRhcHRlcihfX2xocy5nZXQoKSArIF9fb2Zmc2V0KTsgfSBcCitcCisgICAgICBpbmxpbmUgZnJpZW5kIF9Qb2ludGVyX2FkYXB0ZXIgXAorICAgICAgb3BlcmF0b3IrKElOVF9UWVBFIF9fb2Zmc2V0LCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyJiBfX3JocykgXAorICAgICAgeyByZXR1cm4gX1BvaW50ZXJfYWRhcHRlcihfX3Jocy5nZXQoKSArIF9fb2Zmc2V0KTsgfSBcCitcCisgICAgICBpbmxpbmUgZnJpZW5kIF9Qb2ludGVyX2FkYXB0ZXIgXAorICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXImIF9fbGhzLCBJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyByZXR1cm4gX1BvaW50ZXJfYWRhcHRlcihfX2xocy5nZXQoKSAtIF9fb2Zmc2V0KTsgfSBcCitcCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciYgXAorICAgICAgb3BlcmF0b3IrPShJTlRfVFlQRSBfX29mZnNldCkgXAorICAgICAgeyBcCisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgKyBfX29mZnNldCk7IFwKKyAgICAgICAgcmV0dXJuICp0aGlzOyBcCisgICAgICB9IFwKK1wKKyAgICAgIGlubGluZSBfUG9pbnRlcl9hZGFwdGVyJiBcCisgICAgICBvcGVyYXRvci09KElOVF9UWVBFIF9fb2Zmc2V0KSBcCisgICAgICB7IFwKKyAgICAgICAgX1N0b3JhZ2VfcG9saWN5OjpzZXQoX1N0b3JhZ2VfcG9saWN5OjpnZXQoKSAtIF9fb2Zmc2V0KTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICAgIH0gXAorLy8gRU5EIG9mIF9DWFhfUE9JTlRFUl9BUklUSF9PUEVSQVRPUl9TRVQgbWFjcm8KKyAgCisgICAgICAvLyBFeHBhbmQgaW50byB0aGUgdmFyaW91cyBwb2ludGVyIGFyaXRobWF0aWMgb3BlcmF0b3JzIG5lZWRlZC4KKyAgICAgIF9DWFhfUE9JTlRFUl9BUklUSF9PUEVSQVRPUl9TRVQoc2hvcnQpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVCh1bnNpZ25lZCBzaG9ydCk7CisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKGludCk7CisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKHVuc2lnbmVkIGludCk7CisgICAgICBfQ1hYX1BPSU5URVJfQVJJVEhfT1BFUkFUT1JfU0VUKGxvbmcpOworICAgICAgX0NYWF9QT0lOVEVSX0FSSVRIX09QRVJBVE9SX1NFVCh1bnNpZ25lZCBsb25nKTsKKworICAgICAgLy8gTWF0aGVtYXRpY2FsIE1hbmlwdWxhdG9ycworICAgICAgaW5saW5lIF9Qb2ludGVyX2FkYXB0ZXImIAorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgKyAxKTsgCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciAKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBfUG9pbnRlcl9hZGFwdGVyIHRtcCgqdGhpcyk7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgKyAxKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgIH0KKyAgCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlciYgCisgICAgICBvcGVyYXRvci0tKCkgCisgICAgICB7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgLSAxKTsgCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBpbmxpbmUgX1BvaW50ZXJfYWRhcHRlcgorICAgICAgb3BlcmF0b3ItLShpbnQpIAorICAgICAgeworICAgICAgICBfUG9pbnRlcl9hZGFwdGVyIHRtcCgqdGhpcyk7CisgICAgICAgIF9TdG9yYWdlX3BvbGljeTo6c2V0KF9TdG9yYWdlX3BvbGljeTo6Z2V0KCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICAgIH0KKyAgCisgICAgfTsgLy8gY2xhc3MgX1BvaW50ZXJfYWRhcHRlcgorCisKKyNkZWZpbmUgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoT1BFUkFUT1IpIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gXAorICAgIGlubGluZSBib29sIFwKKyAgICBvcGVyYXRvciBPUEVSQVRPUihjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcDE+JiBfX2xocywgX1RwMiBfX3JocykgXAorICAgIHsgcmV0dXJuIF9fbGhzLmdldCgpIE9QRVJBVE9SIF9fcmhzOyB9IFwKK1wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gXAorICAgIGlubGluZSBib29sIFwKKyAgICBvcGVyYXRvciBPUEVSQVRPUihfVHAxIF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcDI+JiBfX3JocykgXAorICAgIHsgcmV0dXJuIF9fbGhzIE9QRVJBVE9SIF9fcmhzLmdldCgpOyB9IFwKK1wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4gXAorICAgIGlubGluZSBib29sIFwKKyAgICBvcGVyYXRvciBPUEVSQVRPUihjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcDE+JiBfX2xocywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHAyPiYgX19yaHMpIFwKKyAgICB7IHJldHVybiBfX2xocy5nZXQoKSBPUEVSQVRPUiBfX3Jocy5nZXQoKTsgfSBcCitcCisvLyBFbmQgR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCBNYWNybworICAKKyAgLy8gRXhwYW5kIGludG8gdGhlIHZhcmlvdXMgY29tcGFyaXNvbiBvcGVyYXRvcnMgbmVlZGVkLgorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg9PSkKKyAgX0dDQ19DWFhfUE9JTlRFUl9DT01QQVJJU09OX09QRVJBVElPTl9TRVQoIT0pCisgIF9HQ0NfQ1hYX1BPSU5URVJfQ09NUEFSSVNPTl9PUEVSQVRJT05fU0VUKDwpCisgIF9HQ0NfQ1hYX1BPSU5URVJfQ09NUEFSSVNPTl9PUEVSQVRJT05fU0VUKDw9KQorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg+KQorICBfR0NDX0NYWF9QT0lOVEVSX0NPTVBBUklTT05fT1BFUkFUSU9OX1NFVCg+PSkKKworICAvLyBUaGVzZSBhcmUgaGVyZSBmb3IgZXhwcmVzc2lvbnMgbGlrZSAicHRyID09IDAiLCAicHRyICE9IDAiCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX2xocywgaW50IF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmdldCgpID09IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9fcmhzKTsgfSAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGludCBfX2xocywgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5nZXQoKSA9PSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX2xocyk7IH0gCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCBpbnQgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuZ2V0KCkgIT0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oX19yaHMpOyB9IAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oaW50IF9fbGhzLCBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmdldCgpICE9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9fbGhzKTsgfSAKKworICAvKioKKyAgICogQ29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIF9Qb2ludGVyX2FkYXB0ZXIgZGVmZXIgdG8gdGhlIGJhc2UgY2xhc3MnZXMKKyAgICogY29tcGFyaXNvbiBvcGVyYXRvcnMsIHdoZW4gcG9zc2libGUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19saHMsIAorICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fVHA6Om9wZXJhdG9yPT0oX19yaHMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCAKKyAgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX1RwOjpvcGVyYXRvcjwoX19yaHMpIHx8IF9fbGhzLl9UcDo6b3BlcmF0b3I9PShfX3Jocyk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19saHMsIAorICAgICAgICAgICAgICAgY29uc3QgX1BvaW50ZXJfYWRhcHRlcjxfVHA+JiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzLl9UcDo6b3BlcmF0b3I9PShfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19saHMsIAorICAgICAgICAgICAgICBjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMuX1RwOjpvcGVyYXRvcjwoX19yaHMpIHx8IF9fbGhzLl9UcDo6b3BlcmF0b3I9PShfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfUG9pbnRlcl9hZGFwdGVyPF9UcD4mIF9fbGhzLCAKKyAgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1RwPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocy5fVHA6Om9wZXJhdG9yPChfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfU3RvcmVUPgorICAgIGlubGluZSBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCAKKyAgICAgICAgICAgICAgIGNvbnN0IF9Qb2ludGVyX2FkYXB0ZXI8X1N0b3JlVD4mIF9fcCkKKyAgICB7IHJldHVybiAoX19vcyA8PCBfX3AuZ2V0KCkpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9QT0lOVEVSX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3Bvb2xfYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wb29sX2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZGRjZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9wb29sX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMjY2IEBACisvLyBBbGxvY2F0b3JzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L3Bvb2xfYWxsb2NhdG9yLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9QT09MX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9QT09MX0FMTE9DQVRPUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxleHQvY29uY3VycmVuY2UuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHVzaW5nIHN0ZDo6c2l6ZV90OworICB1c2luZyBzdGQ6OnB0cmRpZmZfdDsKKworICAvKioKKyAgICogIEBicmllZiAgQmFzZSBjbGFzcyBmb3IgX19wb29sX2FsbG9jLgorICAgKgorICAgKiAgVXNlcyB2YXJpb3VzIGFsbG9jYXRvcnMgdG8gZnVsZmlsbCB1bmRlcmx5aW5nIHJlcXVlc3RzIChhbmQgbWFrZXMgYXMKKyAgICogIGZldyByZXF1ZXN0cyBhcyBwb3NzaWJsZSB3aGVuIGluIGRlZmF1bHQgaGlnaC1zcGVlZCBwb29sIG1vZGUpLgorICAgKgorICAgKiAgSW1wb3J0YW50IGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXM6CisgICAqICAwLiBJZiBnbG9iYWxseSBtYW5kYXRlZCwgdGhlbiBhbGxvY2F0ZSBvYmplY3RzIGZyb20gbmV3CisgICAqICAxLiBJZiB0aGUgY2xpZW50cyByZXF1ZXN0IGFuIG9iamVjdCBvZiBzaXplID4gX1NfbWF4X2J5dGVzLCB0aGUgcmVzdWx0aW5nCisgICAqICAgICBvYmplY3Qgd2lsbCBiZSBvYnRhaW5lZCBkaXJlY3RseSBmcm9tIG5ldworICAgKiAgMi4gSW4gYWxsIG90aGVyIGNhc2VzLCB3ZSBhbGxvY2F0ZSBhbiBvYmplY3Qgb2Ygc2l6ZSBleGFjdGx5CisgICAqICAgICBfU19yb3VuZF91cChyZXF1ZXN0ZWRfc2l6ZSkuICBUaHVzIHRoZSBjbGllbnQgaGFzIGVub3VnaCBzaXplCisgICAqICAgICBpbmZvcm1hdGlvbiB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIG9iamVjdCB0byB0aGUgcHJvcGVyIGZyZWUgbGlzdAorICAgKiAgICAgd2l0aG91dCBwZXJtYW5lbnRseSBsb3NpbmcgcGFydCBvZiB0aGUgb2JqZWN0LgorICAgKi8KKyAgICBjbGFzcyBfX3Bvb2xfYWxsb2NfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgIGVudW0geyBfU19hbGlnbiA9IDggfTsKKyAgICAgIGVudW0geyBfU19tYXhfYnl0ZXMgPSAxMjggfTsKKyAgICAgIGVudW0geyBfU19mcmVlX2xpc3Rfc2l6ZSA9IChzaXplX3QpX1NfbWF4X2J5dGVzIC8gKHNpemVfdClfU19hbGlnbiB9OworICAgICAgCisgICAgICB1bmlvbiBfT2JqCisgICAgICB7CisJdW5pb24gX09iaiogX01fZnJlZV9saXN0X2xpbms7CisJY2hhciAgICAgICAgX01fY2xpZW50X2RhdGFbMV07ICAgIC8vIFRoZSBjbGllbnQgc2VlcyB0aGlzLgorICAgICAgfTsKKyAgICAgIAorICAgICAgc3RhdGljIF9PYmoqIHZvbGF0aWxlICAgICAgICAgX1NfZnJlZV9saXN0W19TX2ZyZWVfbGlzdF9zaXplXTsKKworICAgICAgLy8gQ2h1bmsgYWxsb2NhdGlvbiBzdGF0ZS4KKyAgICAgIHN0YXRpYyBjaGFyKiAgICAgICAgICAgICAgICAgIF9TX3N0YXJ0X2ZyZWU7CisgICAgICBzdGF0aWMgY2hhciogICAgICAgICAgICAgICAgICBfU19lbmRfZnJlZTsKKyAgICAgIHN0YXRpYyBzaXplX3QgICAgICAgICAgICAgICAgIF9TX2hlYXBfc2l6ZTsgICAgIAorICAgICAgCisgICAgICBzaXplX3QKKyAgICAgIF9NX3JvdW5kX3VwKHNpemVfdCBfX2J5dGVzKQorICAgICAgeyByZXR1cm4gKChfX2J5dGVzICsgKHNpemVfdClfU19hbGlnbiAtIDEpICYgfigoc2l6ZV90KV9TX2FsaWduIC0gMSkpOyB9CisgICAgICAKKyAgICAgIF9HTElCQ1hYX0NPTlNUIF9PYmoqIHZvbGF0aWxlKgorICAgICAgX01fZ2V0X2ZyZWVfbGlzdChzaXplX3QgX19ieXRlcykgdGhyb3cgKCk7CisgICAgCisgICAgICBfX211dGV4JgorICAgICAgX01fZ2V0X211dGV4KCkgdGhyb3cgKCk7CisKKyAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IG9mIHNpemUgX19uLCBhbmQgb3B0aW9uYWxseSBhZGRzIHRvIHNpemUgX19uCisgICAgICAvLyBmcmVlIGxpc3QuCisgICAgICB2b2lkKgorICAgICAgX01fcmVmaWxsKHNpemVfdCBfX24pOworICAgICAgCisgICAgICAvLyBBbGxvY2F0ZXMgYSBjaHVuayBmb3Igbm9ianMgb2Ygc2l6ZSBzaXplLiAgbm9ianMgbWF5IGJlIHJlZHVjZWQKKyAgICAgIC8vIGlmIGl0IGlzIGluY29udmVuaWVudCB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG51bWJlci4KKyAgICAgIGNoYXIqCisgICAgICBfTV9hbGxvY2F0ZV9jaHVuayhzaXplX3QgX19uLCBpbnQmIF9fbm9ianMpOworICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmICBBbGxvY2F0b3IgdXNpbmcgYSBtZW1vcnkgcG9vbCB3aXRoIGEgc2luZ2xlIGxvY2suCisgICAqIEBpbmdyb3VwIGFsbG9jYXRvcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX3Bvb2xfYWxsb2MgOiBwcml2YXRlIF9fcG9vbF9hbGxvY19iYXNlCisgICAgeworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgX0F0b21pY193b3JkCSAgICBfU19mb3JjZV9uZXc7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzdHJ1Y3QgcmViaW5kCisgICAgICAgIHsgdHlwZWRlZiBfX3Bvb2xfYWxsb2M8X1RwMT4gb3RoZXI7IH07CisKKyAgICAgIF9fcG9vbF9hbGxvYygpIHRocm93KCkgeyB9CisKKyAgICAgIF9fcG9vbF9hbGxvYyhjb25zdCBfX3Bvb2xfYWxsb2MmKSB0aHJvdygpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3Bvb2xfYWxsb2MoY29uc3QgX19wb29sX2FsbG9jPF9UcDE+JikgdGhyb3coKSB7IH0KKworICAgICAgfl9fcG9vbF9hbGxvYygpIHRocm93KCkgeyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdCB0aHJvdygpIAorICAgICAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQwMi4gd3JvbmcgbmV3IGV4cHJlc3Npb24gaW4gW3NvbWVfXSBhbGxvY2F0b3I6OmNvbnN0cnVjdAorICAgICAgdm9pZCAKKyAgICAgIGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgCisgICAgICB7IDo6bmV3KCh2b2lkICopX19wKSBfVHAoX192YWwpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHZvaWQKKyAgICAgICAgY29uc3RydWN0KHBvaW50ZXIgX19wLCBfQXJncyYmLi4uIF9fYXJncykKKwl7IDo6bmV3KCh2b2lkICopX19wKSBfVHAoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQgCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqID0gMCk7CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pOyAgICAgIAorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3Bvb2xfYWxsb2M8X1RwPiYsIGNvbnN0IF9fcG9vbF9hbGxvYzxfVHA+JikKKyAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3Bvb2xfYWxsb2M8X1RwPiYsIGNvbnN0IF9fcG9vbF9hbGxvYzxfVHA+JikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfQXRvbWljX3dvcmQKKyAgICBfX3Bvb2xfYWxsb2M8X1RwPjo6X1NfZm9yY2VfbmV3OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAqCisgICAgX19wb29sX2FsbG9jPF9UcD46OmFsbG9jYXRlKHNpemVfdHlwZSBfX24sIGNvbnN0IHZvaWQqKQorICAgIHsKKyAgICAgIHBvaW50ZXIgX19yZXQgPSAwOworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19uICE9IDAsIHRydWUpKQorCXsKKwkgIGlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCSAgICBzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisKKwkgIC8vIElmIHRoZXJlIGlzIGEgcmFjZSB0aHJvdWdoIGhlcmUsIGFzc3VtZSBhbnN3ZXIgZnJvbSBnZXRlbnYKKwkgIC8vIHdpbGwgcmVzb2x2ZSBpbiBzYW1lIGRpcmVjdGlvbi4gIEluc3BpcmVkIGJ5IHRlY2huaXF1ZXMKKwkgIC8vIHRvIGVmZmljaWVudGx5IHN1cHBvcnQgdGhyZWFkaW5nIGZvdW5kIGluIGJhc2ljX3N0cmluZy5oLgorCSAgaWYgKF9TX2ZvcmNlX25ldyA9PSAwKQorCSAgICB7CisJICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJHTElCQ1hYX0ZPUkNFX05FVyIpKQorCQlfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9TX2ZvcmNlX25ldywgMSk7CisJICAgICAgZWxzZQorCQlfX2F0b21pY19hZGRfZGlzcGF0Y2goJl9TX2ZvcmNlX25ldywgLTEpOworCSAgICB9CisKKwkgIGNvbnN0IHNpemVfdCBfX2J5dGVzID0gX19uICogc2l6ZW9mKF9UcCk7CSAgICAgIAorCSAgaWYgKF9fYnl0ZXMgPiBzaXplX3QoX1NfbWF4X2J5dGVzKSB8fCBfU19mb3JjZV9uZXcgPiAwKQorCSAgICBfX3JldCA9IHN0YXRpY19jYXN0PF9UcCo+KDo6b3BlcmF0b3IgbmV3KF9fYnl0ZXMpKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9PYmoqIHZvbGF0aWxlKiBfX2ZyZWVfbGlzdCA9IF9NX2dldF9mcmVlX2xpc3QoX19ieXRlcyk7CisJICAgICAgCisJICAgICAgX19zY29wZWRfbG9jayBzZW50cnkoX01fZ2V0X211dGV4KCkpOworCSAgICAgIF9PYmoqIF9fcmVzdHJpY3RfXyBfX3Jlc3VsdCA9ICpfX2ZyZWVfbGlzdDsKKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChfX3Jlc3VsdCA9PSAwLCAwKSkKKwkJX19yZXQgPSBzdGF0aWNfY2FzdDxfVHAqPihfTV9yZWZpbGwoX01fcm91bmRfdXAoX19ieXRlcykpKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICAqX19mcmVlX2xpc3QgPSBfX3Jlc3VsdC0+X01fZnJlZV9saXN0X2xpbms7CisJCSAgX19yZXQgPSByZWludGVycHJldF9jYXN0PF9UcCo+KF9fcmVzdWx0KTsKKwkJfQorCSAgICAgIGlmIChfX3JldCA9PSAwKQorCQlzdGQ6Ol9fdGhyb3dfYmFkX2FsbG9jKCk7CisJICAgIH0KKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19wb29sX2FsbG9jPF9UcD46OmRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgaWYgKF9fYnVpbHRpbl9leHBlY3QoX19uICE9IDAgJiYgX19wICE9IDAsIHRydWUpKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX2J5dGVzID0gX19uICogc2l6ZW9mKF9UcCk7CisJICBpZiAoX19ieXRlcyA+IHN0YXRpY19jYXN0PHNpemVfdD4oX1NfbWF4X2J5dGVzKSB8fCBfU19mb3JjZV9uZXcgPiAwKQorCSAgICA6Om9wZXJhdG9yIGRlbGV0ZShfX3ApOworCSAgZWxzZQorCSAgICB7CisJICAgICAgX09iaiogdm9sYXRpbGUqIF9fZnJlZV9saXN0ID0gX01fZ2V0X2ZyZWVfbGlzdChfX2J5dGVzKTsKKwkgICAgICBfT2JqKiBfX3EgPSByZWludGVycHJldF9jYXN0PF9PYmoqPihfX3ApOworCisJICAgICAgX19zY29wZWRfbG9jayBzZW50cnkoX01fZ2V0X211dGV4KCkpOworCSAgICAgIF9fcSAtPl9NX2ZyZWVfbGlzdF9saW5rID0gKl9fZnJlZV9saXN0OworCSAgICAgICpfX2ZyZWVfbGlzdCA9IF9fcTsKKwkgICAgfQorCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9yYl90cmVlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcmJfdHJlZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkzYTc1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcmJfdHJlZQpAQCAtMCwwICsxLDk2IEBACisvLyByYl90cmVlIGV4dGVuc2lvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBleHQvcmJfdHJlZQorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuIAorICovCisKKyNpZm5kZWYgX1JCX1RSRUUKKyNkZWZpbmUgX1JCX1RSRUUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF90cmVlLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6Ol9SYl90cmVlOworICB1c2luZyBzdGQ6OmFsbG9jYXRvcjsKKworICAvLyBDbGFzcyByYl90cmVlIGlzIG5vdCBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQuICBJdCBpcyBwcm92aWRlZCBmb3IKKyAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIUCBTVEwuCisKKyAgLyoqCisgICAqICBUaGlzIGlzIGFuIFNHSSBleHRlbnNpb24uCisgICAqICBAaW5ncm91cCBTR0lleHRlbnNpb25zCisgICAqICBAZG9jdG9kbworICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9Db21wYXJlLAorCSAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X1ZhbHVlPiA+CisgICAgc3RydWN0IHJiX3RyZWUKKyAgICA6IHB1YmxpYyBfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JiX3RyZWU8X0tleSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4gX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgcmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisgICAgICB+cmJfdHJlZSgpIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9yY19zdHJpbmdfYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcmNfc3RyaW5nX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI3ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcmNfc3RyaW5nX2Jhc2UuaApAQCAtMCwwICsxLDczMyBAQAorLy8gUmVmZXJlbmNlLWNvdW50ZWQgdmVyc2F0aWxlIHN0cmluZyBiYXNlIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9yY19zdHJpbmdfYmFzZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3ZzdHJpbmcuaH0KKyAqLworCisjaWZuZGVmIF9SQ19TVFJJTkdfQkFTRV9ICisjZGVmaW5lIF9SQ19TVFJJTkdfQkFTRV9IIDEKKworI2luY2x1ZGUgPGV4dC9hdG9taWNpdHkuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIERvY3VtZW50YXRpb24/ICBXaGF0J3MgdGhhdD8KKyAgICogIE5hdGhhbiBNeWVycyA8bmNtQGNhbnRyaXAub3JnPi4KKyAgICoKKyAgICogIEEgc3RyaW5nIGxvb2tzIGxpa2UgdGhpczoKKyAgICoKKyAgICogIEBjb2RlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtfUmVwXQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9sZW5ndGgKKyAgICogICBbX19yY19zdHJpbmdfYmFzZTxjaGFyX3R5cGU+XSAgICAgICAgX01fY2FwYWNpdHkKKyAgICogICBfTV9kYXRhcGx1cyAgICAgICAgICAgICAgICAgICAgICAgICAgX01fcmVmY291bnQKKyAgICogICBfTV9wIC0tLS0tLS0tLS0tLS0tLS0+ICAgICAgICAgICAgICAgdW5uYW1lZCBhcnJheSBvZiBjaGFyX3R5cGUKKyAgICogIEBlbmRjb2RlCisgICAqCisgICAqICBXaGVyZSB0aGUgX01fcCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLCBhbmQKKyAgICogIHlvdSBjYXN0IGl0IHRvIGEgcG9pbnRlci10by1fUmVwIGFuZCBzdWJ0cmFjdCAxIHRvIGdldCBhCisgICAqICBwb2ludGVyIHRvIHRoZSBoZWFkZXIuCisgICAqCisgICAqICBUaGlzIGFwcHJvYWNoIGhhcyB0aGUgZW5vcm1vdXMgYWR2YW50YWdlIHRoYXQgYSBzdHJpbmcgb2JqZWN0CisgICAqICByZXF1aXJlcyBvbmx5IG9uZSBhbGxvY2F0aW9uLiAgQWxsIHRoZSB1Z2xpbmVzcyBpcyBjb25maW5lZAorICAgKiAgd2l0aGluIGEgc2luZ2xlIHBhaXIgb2YgaW5saW5lIGZ1bmN0aW9ucywgd2hpY2ggZWFjaCBjb21waWxlIHRvCisgICAqICBhIHNpbmdsZSBAYSBhZGQgaW5zdHJ1Y3Rpb246IF9SZXA6Ol9NX3JlZmRhdGEoKSwgYW5kCisgICAqICBfX3JjX3N0cmluZ19iYXNlOjpfTV9yZXAoKTsgYW5kIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHdoaWNoIGdldHMgYQorICAgKiAgYmxvY2sgb2YgcmF3IGJ5dGVzIGFuZCB3aXRoIHJvb20gZW5vdWdoIGFuZCBjb25zdHJ1Y3RzIGEgX1JlcAorICAgKiAgb2JqZWN0IGF0IHRoZSBmcm9udC4KKyAgICoKKyAgICogIFRoZSByZWFzb24geW91IHdhbnQgX01fZGF0YSBwb2ludGluZyB0byB0aGUgY2hhcmFjdGVyIGFycmF5IGFuZAorICAgKiAgbm90IHRoZSBfUmVwIGlzIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIGNhbiBzZWUgdGhlIHN0cmluZworICAgKiAgY29udGVudHMuIChQcm9iYWJseSB3ZSBzaG91bGQgYWRkIGEgbm9uLWlubGluZSBtZW1iZXIgdG8gZ2V0CisgICAqICB0aGUgX1JlcCBmb3IgdGhlIGRlYnVnZ2VyIHRvIHVzZSwgc28gdXNlcnMgY2FuIGNoZWNrIHRoZSBhY3R1YWwKKyAgICogIHN0cmluZyBsZW5ndGguKQorICAgKgorICAgKiAgTm90ZSB0aGF0IHRoZSBfUmVwIG9iamVjdCBpcyBhIFBPRCBzbyB0aGF0IHlvdSBjYW4gaGF2ZSBhCisgICAqICBzdGF0aWMgPGVtPmVtcHR5IHN0cmluZzwvZW0+IF9SZXAgb2JqZWN0IGFscmVhZHkgQGEgY29uc3RydWN0ZWQgYmVmb3JlCisgICAqICBzdGF0aWMgY29uc3RydWN0b3JzIGhhdmUgcnVuLiAgVGhlIHJlZmVyZW5jZS1jb3VudCBlbmNvZGluZyBpcworICAgKiAgY2hvc2VuIHNvIHRoYXQgYSAwIGluZGljYXRlcyBvbmUgcmVmZXJlbmNlLCBzbyB5b3UgbmV2ZXIgdHJ5IHRvCisgICAqICBkZXN0cm95IHRoZSBlbXB0eS1zdHJpbmcgX1JlcCBvYmplY3QuCisgICAqCisgICAqICBBbGwgYnV0IHRoZSBsYXN0IHBhcmFncmFwaCBpcyBjb25zaWRlcmVkIHByZXR0eSBjb252ZW50aW9uYWwKKyAgICogIGZvciBhIEMrKyBzdHJpbmcgaW1wbGVtZW50YXRpb24uCisgICovCisgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX19yY19zdHJpbmdfYmFzZQorICAgIDogcHJvdGVjdGVkIF9fdnN0cmluZ191dGlsaXR5PF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJCSAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6Y2hhcl90eXBlCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jCQkJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX192c3RyaW5nX3V0aWxpdHk8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgIF9VdGlsX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9VdGlsX0Jhc2U6Ol9DaGFyVF9hbGxvY190eXBlICAgICAgICBfQ2hhclRfYWxsb2NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnNpemVfdHlwZQkgICAgc2l6ZV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9SZXA6IHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgLy8gICBJbnZhcmlhbnRzOgorICAgICAgLy8gICAxLiBTdHJpbmcgcmVhbGx5IGNvbnRhaW5zIF9NX2xlbmd0aCArIDEgY2hhcmFjdGVyczogZHVlIHRvIDIxLjMuNAorICAgICAgLy8gICAgICBtdXN0IGJlIGtlcHQgbnVsbC10ZXJtaW5hdGVkLgorICAgICAgLy8gICAyLiBfTV9jYXBhY2l0eSA+PSBfTV9sZW5ndGgKKyAgICAgIC8vICAgICAgQWxsb2NhdGVkIG1lbW9yeSBpcyBhbHdheXMgKF9NX2NhcGFjaXR5ICsgMSkgKiBzaXplb2YoX0NoYXJUKS4KKyAgICAgIC8vICAgMy4gX01fcmVmY291bnQgaGFzIHRocmVlIHN0YXRlczoKKyAgICAgIC8vICAgICAgLTE6IGxlYWtlZCwgb25lIHJlZmVyZW5jZSwgbm8gcmVmLWNvcGllcyBhbGxvd2VkLCBub24tY29uc3QuCisgICAgICAvLyAgICAgICAwOiBvbmUgcmVmZXJlbmNlLCBub24tY29uc3QuCisgICAgICAvLyAgICAgbj4wOiBuICsgMSByZWZlcmVuY2VzLCBvcGVyYXRpb25zIHJlcXVpcmUgYSBsb2NrLCBjb25zdC4KKyAgICAgIC8vICAgNC4gQWxsIGZpZWxkcyA9PSAwIGlzIGFuIGVtcHR5IHN0cmluZywgZ2l2ZW4gdGhlIGV4dHJhIHN0b3JhZ2UKKyAgICAgIC8vICAgICAgYmV5b25kLXRoZS1lbmQgZm9yIGEgbnVsbCB0ZXJtaW5hdG9yOyB0aHVzLCB0aGUgc2hhcmVkCisgICAgICAvLyAgICAgIGVtcHR5IHN0cmluZyByZXByZXNlbnRhdGlvbiBuZWVkcyBubyBjb25zdHJ1Y3Rvci4KKyAgICAgIHN0cnVjdCBfUmVwCisgICAgICB7CisJdW5pb24KKwl7CisJICBzdHJ1Y3QKKwkgIHsKKwkgICAgc2l6ZV90eXBlCSAgICBfTV9sZW5ndGg7CisJICAgIHNpemVfdHlwZQkgICAgX01fY2FwYWNpdHk7CisJICAgIF9BdG9taWNfd29yZCAgICBfTV9yZWZjb3VudDsKKwkgIH0gICAgICAgICAgICAgICAgIF9NX2luZm87CisKKwkgIC8vIE9ubHkgZm9yIGFsaWdubWVudCBwdXJwb3Nlcy4KKwkgIF9DaGFyVCAgICAgICAgICAgIF9NX2FsaWduOworCX07CisKKwl0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9SZXA+OjpvdGhlciBfUmVwX2FsbG9jX3R5cGU7CisKKyAJX0NoYXJUKgorCV9NX3JlZmRhdGEoKSB0aHJvdygpCisJeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxfQ2hhclQqPih0aGlzICsgMSk7IH0KKworCV9DaGFyVCoKKwlfTV9yZWZjb3B5KCkgdGhyb3coKQorCXsKKwkgIF9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX01faW5mby5fTV9yZWZjb3VudCwgMSk7CisJICByZXR1cm4gX01fcmVmZGF0YSgpOworCX0gIC8vIFhYWCBNVAorCisJdm9pZAorCV9NX3NldF9sZW5ndGgoc2l6ZV90eXBlIF9fbikKKwl7CisJICBfTV9pbmZvLl9NX3JlZmNvdW50ID0gMDsgIC8vIE9uZSByZWZlcmVuY2UuCisJICBfTV9pbmZvLl9NX2xlbmd0aCA9IF9fbjsKKwkgIC8vIGdycnIuIChwZXIgMjEuMy40KQorCSAgLy8gWW91IGNhbm5vdCBsZWF2ZSB0aG9zZSBMV0cgcGVvcGxlIGFsb25lIGZvciBhIHNlY29uZC4KKwkgIHRyYWl0c190eXBlOjphc3NpZ24oX01fcmVmZGF0YSgpW19fbl0sIF9DaGFyVCgpKTsKKwl9CisKKwkvLyBDcmVhdGUgJiBEZXN0cm95CisJc3RhdGljIF9SZXAqCisJX1NfY3JlYXRlKHNpemVfdHlwZSwgc2l6ZV90eXBlLCBjb25zdCBfQWxsb2MmKTsKKworCXZvaWQKKwlfTV9kZXN0cm95KGNvbnN0IF9BbGxvYyYpIHRocm93KCk7CisKKwlfQ2hhclQqCisJX01fY2xvbmUoY29uc3QgX0FsbG9jJiwgc2l6ZV90eXBlIF9fcmVzID0gMCk7CisgICAgICB9OworCisgICAgICBzdHJ1Y3QgX1JlcF9lbXB0eQorICAgICAgOiBwdWJsaWMgX1JlcAorICAgICAgeworCV9DaGFyVCAgICAgICAgICAgICAgX01fdGVybWluYWw7CisgICAgICB9OworCisgICAgICBzdGF0aWMgX1JlcF9lbXB0eSAgICAgX1NfZW1wdHlfcmVwOworCisgICAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBjaGFyX3R5cGUgZWxlbWVudHMgb2YgYW4KKyAgICAgIC8vIGluZGl2aWR1YWwgc3RyaW5nIGlzIGRldGVybWluZWQgYnkgX1NfbWF4X3NpemUuIFRoaXMgaXMgdGhlCisgICAgICAvLyB2YWx1ZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgbWF4X3NpemUoKS4gIChXaGVyZWFzIG5wb3MKKyAgICAgIC8vIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGUgYWxsb2NhdG9yIGNhbiBhbGxvY2F0ZS4pCisgICAgICAvLyBJZiBvbmUgd2FzIHRvIGRpdnZ5IHVwIHRoZSB0aGVvcmV0aWNhbCBsYXJnZXN0IHNpemUgc3RyaW5nLAorICAgICAgLy8gd2l0aCBhIHRlcm1pbmF0aW5nIGNoYXJhY3RlciBhbmQgbSBfQ2hhclQgZWxlbWVudHMsIGl0J2QKKyAgICAgIC8vIGxvb2sgbGlrZSB0aGlzOgorICAgICAgLy8gbnBvcyA9IHNpemVvZihfUmVwKSArIChtICogc2l6ZW9mKF9DaGFyVCkpICsgc2l6ZW9mKF9DaGFyVCkKKyAgICAgIC8vICAgICAgICArIHNpemVvZihfUmVwKSAtIDEKKyAgICAgIC8vIChOQjogbGFzdCB0d28gdGVybXMgZm9yIHJvdW5kaW5nIHJlYXNvbnMsIHNlZSBfTV9jcmVhdGUgYmVsb3cpCisgICAgICAvLyBTb2x2aW5nIGZvciBtOgorICAgICAgLy8gbSA9ICgobnBvcyAtIDIgKiBzaXplb2YoX1JlcCkgKyAxKSAvIHNpemVvZihfQ2hhclQpKSAtIDEKKyAgICAgIC8vIEluIGFkZGl0aW9uLCB0aGlzIGltcGxlbWVudGF0aW9uIGhhbHZlcyB0aGlzIGFtb3VudC4KKyAgICAgIGVudW0geyBfU19tYXhfc2l6ZSA9ICgoKHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpIC0gMiAqIHNpemVvZihfUmVwKQorCQkJICAgICAgKyAxKSAvIHNpemVvZihfQ2hhclQpKSAtIDEpIC8gMiB9OworCisgICAgICAvLyBEYXRhIE1lbWJlciAocHJpdmF0ZSk6CisgICAgICBtdXRhYmxlIHR5cGVuYW1lIF9VdGlsX0Jhc2U6OnRlbXBsYXRlIF9BbGxvY19oaWRlcjxfQWxsb2M+ICBfTV9kYXRhcGx1czsKKworICAgICAgdm9pZAorICAgICAgX01fZGF0YShfQ2hhclQqIF9fcCkKKyAgICAgIHsgX01fZGF0YXBsdXMuX01fcCA9IF9fcDsgfQorCisgICAgICBfUmVwKgorICAgICAgX01fcmVwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICYoKHJlaW50ZXJwcmV0X2Nhc3Q8X1JlcCo+KF9NX2RhdGEoKSkpWy0xXSk7IH0KKworICAgICAgX0NoYXJUKgorICAgICAgX01fZ3JhYihjb25zdCBfQWxsb2MmIF9fYWxsb2MpIGNvbnN0CisgICAgICB7CisJcmV0dXJuICghX01faXNfbGVha2VkKCkgJiYgX01fZ2V0X2FsbG9jYXRvcigpID09IF9fYWxsb2MpCisJCT8gX01fcmVwKCktPl9NX3JlZmNvcHkoKSA6IF9NX3JlcCgpLT5fTV9jbG9uZShfX2FsbG9jKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGlzcG9zZSgpCisgICAgICB7CisJLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorCV9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmX01fcmVwKCktPl9NX2luZm8uCisJCQkJCQlfTV9yZWZjb3VudCk7CisJaWYgKF9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fcmVwKCktPl9NX2luZm8uX01fcmVmY291bnQsCisJCQkJCS0xKSA8PSAwKQorCSAgeworCSAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmX01fcmVwKCktPl9NX2luZm8uCisJCQkJCQkgICBfTV9yZWZjb3VudCk7CisJICAgIF9NX3JlcCgpLT5fTV9kZXN0cm95KF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICB9CisgICAgICB9ICAvLyBYWFggTVQKKworICAgICAgYm9vbAorICAgICAgX01faXNfbGVha2VkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9pbmZvLl9NX3JlZmNvdW50IDwgMDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfc2hhcmFibGUoKQorICAgICAgeyBfTV9yZXAoKS0+X01faW5mby5fTV9yZWZjb3VudCA9IDA7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbGVha19oYXJkKCk7CisKKyAgICAgIC8vIF9TX2NvbnN0cnVjdF9hdXggaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIDIxLjMuMSBwYXJhIDE1IHdoaWNoCisgICAgICAvLyByZXF1aXJlcyBzcGVjaWFsIGJlaGF2aW91ciBpZiBfSW5JdGVyYXRvciBpcyBhbiBpbnRlZ3JhbCB0eXBlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKwlzdGF0aWMgX0NoYXJUKgorCV9TX2NvbnN0cnVjdF9hdXgoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLAorCQkJIGNvbnN0IF9BbGxvYyYgX19hLCBzdGQ6Ol9fZmFsc2VfdHlwZSkKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSW5JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9UYWc7CisJICByZXR1cm4gX1NfY29uc3RydWN0KF9fYmVnLCBfX2VuZCwgX19hLCBfVGFnKCkpOworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM4LiBBbWJpZ3VpdHkgaW4gdGhlICJkbyB0aGUgcmlnaHQgdGhpbmciIGNsYXVzZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludGVnZXI+CisJc3RhdGljIF9DaGFyVCoKKwlfU19jb25zdHJ1Y3RfYXV4KF9JbnRlZ2VyIF9fYmVnLCBfSW50ZWdlciBfX2VuZCwKKwkJCSBjb25zdCBfQWxsb2MmIF9fYSwgc3RkOjpfX3RydWVfdHlwZSkKKwl7IHJldHVybiBfU19jb25zdHJ1Y3RfYXV4XzIoc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihfX2JlZyksCisJCQkJICAgIF9fZW5kLCBfX2EpOyB9CisKKyAgICAgIHN0YXRpYyBfQ2hhclQqCisgICAgICBfU19jb25zdHJ1Y3RfYXV4XzIoc2l6ZV90eXBlIF9fcmVxLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgIHsgcmV0dXJuIF9TX2NvbnN0cnVjdChfX3JlcSwgX19jLCBfX2EpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorCXN0YXRpYyBfQ2hhclQqCisJX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EpCisJeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5JdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICByZXR1cm4gX1NfY29uc3RydWN0X2F1eChfX2JlZywgX19lbmQsIF9fYSwgX0ludGVncmFsKCkpOworCX0KKworICAgICAgLy8gRm9yIElucHV0IEl0ZXJhdG9ycywgdXNlZCBpbiBpc3RyZWFtYnVmX2l0ZXJhdG9ycywgZXRjLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisJc3RhdGljIF9DaGFyVCoKKwkgX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgLy8gRm9yIGZvcndhcmRfaXRlcmF0b3JzIHVwIHRvIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JzLCB1c2VkIGZvcgorICAgICAgLy8gc3RyaW5nOjppdGVyYXRvciwgX0NoYXJUKiwgZXRjLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJhdG9yPgorCXN0YXRpYyBfQ2hhclQqCisJX1NfY29uc3RydWN0KF9Gd2RJdGVyYXRvciBfX2JlZywgX0Z3ZEl0ZXJhdG9yIF9fZW5kLCBjb25zdCBfQWxsb2MmIF9fYSwKKwkJICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgc3RhdGljIF9DaGFyVCoKKyAgICAgIF9TX2NvbnN0cnVjdChzaXplX3R5cGUgX19yZXEsIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZV90eXBlKF9TX21heF9zaXplKTsgfQorCisgICAgICBfQ2hhclQqCisgICAgICBfTV9kYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzLl9NX3A7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9sZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2luZm8uX01fbGVuZ3RoOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fY2FwYWNpdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVwKCktPl9NX2luZm8uX01fY2FwYWNpdHk7IH0KKworICAgICAgYm9vbAorICAgICAgX01faXNfc2hhcmVkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlcCgpLT5fTV9pbmZvLl9NX3JlZmNvdW50ID4gMDsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbGVha2VkKCkKKyAgICAgIHsgX01fcmVwKCktPl9NX2luZm8uX01fcmVmY291bnQgPSAtMTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9sZWFrKCkgICAgLy8gZm9yIHVzZSBpbiBiZWdpbigpICYgbm9uLWNvbnN0IG9wW10KKyAgICAgIHsKKwlpZiAoIV9NX2lzX2xlYWtlZCgpKQorCSAgX01fbGVha19oYXJkKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9sZW5ndGgoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgX01fcmVwKCktPl9NX3NldF9sZW5ndGgoX19uKTsgfQorCisgICAgICBfX3JjX3N0cmluZ19iYXNlKCkKKyAgICAgIDogX01fZGF0YXBsdXMoX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKSkgeyB9CisKKyAgICAgIF9fcmNfc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICBfX3JjX3N0cmluZ19iYXNlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBfX3JjX3N0cmluZ19iYXNlKF9fcmNfc3RyaW5nX2Jhc2UmJiBfX3JjcykKKyAgICAgIDogX01fZGF0YXBsdXMoX19yY3MuX01fZGF0YXBsdXMpCisgICAgICB7IF9fcmNzLl9NX2RhdGEoX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKSk7IH0KKyNlbmRpZgorCisgICAgICBfX3JjX3N0cmluZ19iYXNlKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX19yY19zdHJpbmdfYmFzZShfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQsCisJCQkgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICB+X19yY19zdHJpbmdfYmFzZSgpCisgICAgICB7IF9NX2Rpc3Bvc2UoKTsgfQorCisgICAgICBhbGxvY2F0b3JfdHlwZSYKKyAgICAgIF9NX2dldF9hbGxvY2F0b3IoKQorICAgICAgeyByZXR1cm4gX01fZGF0YXBsdXM7IH0KKworICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX19yY19zdHJpbmdfYmFzZSYgX19yY3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ24oY29uc3QgX19yY19zdHJpbmdfYmFzZSYgX19yY3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3Jlcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCQlzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2xlYXIoKQorICAgICAgeyBfTV9lcmFzZShzaXplX3R5cGUoMCksIF9NX2xlbmd0aCgpKTsgfQorCisgICAgICBib29sCisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmKSBjb25zdAorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHR5cGVuYW1lIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwX2VtcHR5CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9TX2VtcHR5X3JlcDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0eXBlbmFtZSBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcCoKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6X1JlcDo6CisgICAgX1NfY3JlYXRlKHNpemVfdHlwZSBfX2NhcGFjaXR5LCBzaXplX3R5cGUgX19vbGRfY2FwYWNpdHksCisJICAgICAgY29uc3QgX0FsbG9jJiBfX2FsbG9jKQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDgzLiAgU3RyaW5nOjpucG9zIHZzLiBzdHJpbmc6Om1heF9zaXplKCkKKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gc2l6ZV90eXBlKF9TX21heF9zaXplKSkKKwlzdGQ6Ol9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigiX19yY19zdHJpbmdfYmFzZTo6X1JlcDo6X1NfY3JlYXRlIikpOworCisgICAgICAvLyBUaGUgc3RhbmRhcmQgcGxhY2VzIG5vIHJlc3RyaWN0aW9uIG9uIGFsbG9jYXRpbmcgbW9yZSBtZW1vcnkKKyAgICAgIC8vIHRoYW4gaXMgc3RyaWN0bHkgbmVlZGVkIHdpdGhpbiB0aGlzIGxheWVyIGF0IHRoZSBtb21lbnQgb3IgYXMKKyAgICAgIC8vIHJlcXVlc3RlZCBieSBhbiBleHBsaWNpdCBhcHBsaWNhdGlvbiBjYWxsIHRvIHJlc2VydmUoKS4KKworICAgICAgLy8gTWFueSBtYWxsb2MgaW1wbGVtZW50YXRpb25zIHBlcmZvcm0gcXVpdGUgcG9vcmx5IHdoZW4gYW4KKyAgICAgIC8vIGFwcGxpY2F0aW9uIGF0dGVtcHRzIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiBhIHN0ZXB3aXNlIGZhc2hpb24KKyAgICAgIC8vIGdyb3dpbmcgZWFjaCBhbGxvY2F0aW9uIHNpemUgYnkgb25seSAxIGNoYXIuICBBZGRpdGlvbmFsbHksCisgICAgICAvLyBpdCBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gYWxsb2NhdGUgbGVzcyBsaW5lYXIgbWVtb3J5IHRoYW4gdGhlCisgICAgICAvLyBuYXR1cmFsIGJsb2NraW5nIHNpemUgb2YgdGhlIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHdlIHdvdWxkIG5lZWQgYSBzb21ld2hhdCBsb3ctbGV2ZWwgY2FsY3VsYXRpb24KKyAgICAgIC8vIHdpdGggdHVuZWQgcGFyYW1ldGVycyB0byBnZXQgdGhpcyBwZXJmZWN0IGZvciBhbnkgcGFydGljdWxhcgorICAgICAgLy8gbWFsbG9jIGltcGxlbWVudGF0aW9uLiAgRm9ydHVuYXRlbHksIGdlbmVyYWxpemF0aW9ucyBhYm91dAorICAgICAgLy8gY29tbW9uIGZlYXR1cmVzIHNlZW4gYW1vbmcgaW1wbGVtZW50YXRpb25zIHNlZW1zIHRvIHN1ZmZpY2UuCisKKyAgICAgIC8vIF9fcGFnZXNpemUgbmVlZCBub3QgbWF0Y2ggdGhlIGFjdHVhbCBWTSBwYWdlIHNpemUgZm9yIGdvb2QKKyAgICAgIC8vIHJlc3VsdHMgaW4gcHJhY3RpY2UsIHRodXMgd2UgcGljayBhIGNvbW1vbiB2YWx1ZSBvbiB0aGUgbG93CisgICAgICAvLyBzaWRlLiAgX19tYWxsb2NfaGVhZGVyX3NpemUgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZgorICAgICAgLy8gb3ZlcmhlYWQgcGVyIG1lbW9yeSBhbGxvY2F0aW9uIChpbiBwcmFjdGljZSBzZWVuIE4gKiBzaXplb2YKKyAgICAgIC8vICh2b2lkKikgd2hlcmUgTiBpcyAwLCAyIG9yIDQpLiAgQWNjb3JkaW5nIHRvIGZvbGtsb3JlLAorICAgICAgLy8gcGlja2luZyB0aGlzIHZhbHVlIG9uIHRoZSBoaWdoIHNpZGUgaXMgYmV0dGVyIHRoYW4KKyAgICAgIC8vIGxvdy1iYWxsaW5nIGl0IChlc3BlY2lhbGx5IHdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCB3aXRoCisgICAgICAvLyBtYWxsb2MgaW1wbGVtZW50YXRpb25zIHRoYXQgYWxsb2NhdGUgbWVtb3J5IGJsb2NrcyByb3VuZGVkIHVwCisgICAgICAvLyB0byBhIHNpemUgd2hpY2ggaXMgYSBwb3dlciBvZiAyKS4KKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3BhZ2VzaXplID0gNDA5NjsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX21hbGxvY19oZWFkZXJfc2l6ZSA9IDQgKiBzaXplb2Yodm9pZCopOworCisgICAgICAvLyBUaGUgYmVsb3cgaW1wbGVtZW50cyBhbiBleHBvbmVudGlhbCBncm93dGggcG9saWN5LCBuZWNlc3NhcnkgdG8KKyAgICAgIC8vIG1lZXQgYW1vcnRpemVkIGxpbmVhciB0aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUgbGlicmFyeTogc2VlCisgICAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDEtMDcvbXNnMDAwODUuaHRtbC4KKyAgICAgIGlmIChfX2NhcGFjaXR5ID4gX19vbGRfY2FwYWNpdHkgJiYgX19jYXBhY2l0eSA8IDIgKiBfX29sZF9jYXBhY2l0eSkKKwl7CisJICBfX2NhcGFjaXR5ID0gMiAqIF9fb2xkX2NhcGFjaXR5OworCSAgLy8gTmV2ZXIgYWxsb2NhdGUgYSBzdHJpbmcgYmlnZ2VyIHRoYW4gX1NfbWF4X3NpemUuCisJICBpZiAoX19jYXBhY2l0eSA+IHNpemVfdHlwZShfU19tYXhfc2l6ZSkpCisJICAgIF9fY2FwYWNpdHkgPSBzaXplX3R5cGUoX1NfbWF4X3NpemUpOworCX0KKworICAgICAgLy8gTkI6IE5lZWQgYW4gYXJyYXkgb2YgY2hhcl90eXBlW19fY2FwYWNpdHldLCBwbHVzIGEgdGVybWluYXRpbmcKKyAgICAgIC8vIG51bGwgY2hhcl90eXBlKCkgZWxlbWVudCwgcGx1cyBlbm91Z2ggZm9yIHRoZSBfUmVwIGRhdGEgc3RydWN0dXJlLAorICAgICAgLy8gcGx1cyBzaXplb2YoX1JlcCkgLSAxIHRvIHVwcGVyIHJvdW5kIHRvIGEgc2l6ZSBtdWx0aXBsZSBvZgorICAgICAgLy8gc2l6ZW9mKF9SZXApLgorICAgICAgLy8gV2hldy4gU2VlbWluZ2x5IHNvIG5lZWR5LCB5ZXQgc28gZWxlbWVudGFsLgorICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9ICgoX19jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkKKwkJCSAgKyAyICogc2l6ZW9mKF9SZXApIC0gMSk7CisKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2Fkal9zaXplID0gX19zaXplICsgX19tYWxsb2NfaGVhZGVyX3NpemU7CisgICAgICBpZiAoX19hZGpfc2l6ZSA+IF9fcGFnZXNpemUgJiYgX19jYXBhY2l0eSA+IF9fb2xkX2NhcGFjaXR5KQorCXsKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2V4dHJhID0gX19wYWdlc2l6ZSAtIF9fYWRqX3NpemUgJSBfX3BhZ2VzaXplOworCSAgX19jYXBhY2l0eSArPSBfX2V4dHJhIC8gc2l6ZW9mKF9DaGFyVCk7CisJICBpZiAoX19jYXBhY2l0eSA+IHNpemVfdHlwZShfU19tYXhfc2l6ZSkpCisJICAgIF9fY2FwYWNpdHkgPSBzaXplX3R5cGUoX1NfbWF4X3NpemUpOworCSAgX19zaXplID0gKF9fY2FwYWNpdHkgKyAxKSAqIHNpemVvZihfQ2hhclQpICsgMiAqIHNpemVvZihfUmVwKSAtIDE7CisJfQorCisgICAgICAvLyBOQjogTWlnaHQgdGhyb3csIGJ1dCBubyB3b3JyaWVzIGFib3V0IGEgbGVhaywgbWF0ZTogX1JlcCgpCisgICAgICAvLyBkb2VzIG5vdCB0aHJvdy4KKyAgICAgIF9SZXAqIF9fcGxhY2UgPSBfUmVwX2FsbG9jX3R5cGUoX19hbGxvYykuYWxsb2NhdGUoX19zaXplIC8gc2l6ZW9mKF9SZXApKTsKKyAgICAgIF9SZXAqIF9fcCA9IG5ldyAoX19wbGFjZSkgX1JlcDsKKyAgICAgIF9fcC0+X01faW5mby5fTV9jYXBhY2l0eSA9IF9fY2FwYWNpdHk7CisgICAgICByZXR1cm4gX19wOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Ol9SZXA6OgorICAgIF9NX2Rlc3Ryb3koY29uc3QgX0FsbG9jJiBfX2EpIHRocm93ICgpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9ICgoX01faW5mby5fTV9jYXBhY2l0eSArIDEpICogc2l6ZW9mKF9DaGFyVCkKKwkJCQkrIDIgKiBzaXplb2YoX1JlcCkgLSAxKTsKKyAgICAgIF9SZXBfYWxsb2NfdHlwZShfX2EpLmRlYWxsb2NhdGUodGhpcywgX19zaXplIC8gc2l6ZW9mKF9SZXApKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjpfUmVwOjoKKyAgICBfTV9jbG9uZShjb25zdCBfQWxsb2MmIF9fYWxsb2MsIHNpemVfdHlwZSBfX3JlcykKKyAgICB7CisgICAgICAvLyBSZXF1ZXN0ZWQgY2FwYWNpdHkgb2YgdGhlIGNsb25lLgorICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fcmVxdWVzdGVkX2NhcCA9IF9NX2luZm8uX01fbGVuZ3RoICsgX19yZXM7CisgICAgICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19yZXF1ZXN0ZWRfY2FwLCBfTV9pbmZvLl9NX2NhcGFjaXR5LAorCQkJCSAgX19hbGxvYyk7CisKKyAgICAgIGlmIChfTV9pbmZvLl9NX2xlbmd0aCkKKwlfU19jb3B5KF9fci0+X01fcmVmZGF0YSgpLCBfTV9yZWZkYXRhKCksIF9NX2luZm8uX01fbGVuZ3RoKTsKKworICAgICAgX19yLT5fTV9zZXRfbGVuZ3RoKF9NX2luZm8uX01fbGVuZ3RoKTsKKyAgICAgIHJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fcmNfc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9TX2NvbnN0cnVjdChzaXplX3R5cGUoKSwgX0NoYXJUKCksIF9fYSkpIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3JjX3N0cmluZ19iYXNlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKQorICAgIDogX01fZGF0YXBsdXMoX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpLAorCQkgIF9fcmNzLl9NX2dyYWIoX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpKSkgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fcmNfc3RyaW5nX2Jhc2Uoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYywgY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9TX2NvbnN0cnVjdChfX24sIF9fYywgX19hKSkgeyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fcmNfc3RyaW5nX2Jhc2UoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkgICAgIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX19hLCBfU19jb25zdHJ1Y3QoX19iZWcsIF9fZW5kLCBfX2EpKSB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2xlYWtfaGFyZCgpCisgICAgeworICAgICAgaWYgKF9NX2lzX3NoYXJlZCgpKQorCV9NX2VyYXNlKDAsIDApOworICAgICAgX01fc2V0X2xlYWtlZCgpOworICAgIH0KKworICAvLyBOQjogVGhpcyBpcyB0aGUgc3BlY2lhbCBjYXNlIGZvciBJbnB1dCBJdGVyYXRvcnMsIHVzZWQgaW4KKyAgLy8gaXN0cmVhbWJ1Zl9pdGVyYXRvcnMsIGV0Yy4KKyAgLy8gSW5wdXQgSXRlcmF0b3JzIGhhdmUgYSBjb3N0IHN0cnVjdHVyZSB2ZXJ5IGRpZmZlcmVudCBmcm9tCisgIC8vIHBvaW50ZXJzLCBjYWxsaW5nIGZvciBhIGRpZmZlcmVudCBjb2Rpbmcgc3R5bGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgX0NoYXJUKgorICAgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX1NfY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwgY29uc3QgX0FsbG9jJiBfX2EsCisJCSAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJICByZXR1cm4gX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKTsKKworCS8vIEF2b2lkIHJlYWxsb2NhdGlvbiBmb3IgY29tbW9uIGNhc2UuCisJX0NoYXJUIF9fYnVmWzEyOF07CisJc2l6ZV90eXBlIF9fbGVuID0gMDsKKwl3aGlsZSAoX19iZWcgIT0gX19lbmQgJiYgX19sZW4gPCBzaXplb2YoX19idWYpIC8gc2l6ZW9mKF9DaGFyVCkpCisJICB7CisJICAgIF9fYnVmW19fbGVuKytdID0gKl9fYmVnOworCSAgICArK19fYmVnOworCSAgfQorCV9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX2xlbiwgc2l6ZV90eXBlKDApLCBfX2EpOworCV9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9fYnVmLCBfX2xlbik7CisJX190cnkKKwkgIHsKKwkgICAgd2hpbGUgKF9fYmVnICE9IF9fZW5kKQorCSAgICAgIHsKKwkJaWYgKF9fbGVuID09IF9fci0+X01faW5mby5fTV9jYXBhY2l0eSkKKwkJICB7CisJCSAgICAvLyBBbGxvY2F0ZSBtb3JlIHNwYWNlLgorCQkgICAgX1JlcCogX19hbm90aGVyID0gX1JlcDo6X1NfY3JlYXRlKF9fbGVuICsgMSwgX19sZW4sIF9fYSk7CisJCSAgICBfU19jb3B5KF9fYW5vdGhlci0+X01fcmVmZGF0YSgpLCBfX3ItPl9NX3JlZmRhdGEoKSwgX19sZW4pOworCQkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJCSAgICBfX3IgPSBfX2Fub3RoZXI7CisJCSAgfQorCQlfX3ItPl9NX3JlZmRhdGEoKVtfX2xlbisrXSA9ICpfX2JlZzsKKwkJKytfX2JlZzsKKwkgICAgICB9CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIF9fci0+X01fZGVzdHJveShfX2EpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKwlfX3ItPl9NX3NldF9sZW5ndGgoX19sZW4pOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgIF9DaGFyVCoKKyAgICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICAgIF9TX2NvbnN0cnVjdChfSW5JdGVyYXRvciBfX2JlZywgX0luSXRlcmF0b3IgX19lbmQsIGNvbnN0IF9BbGxvYyYgX19hLAorCQkgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgICAgeworCWlmIChfX2JlZyA9PSBfX2VuZCAmJiBfX2EgPT0gX0FsbG9jKCkpCisJICByZXR1cm4gX1NfZW1wdHlfcmVwLl9NX3JlZmNvcHkoKTsKKworCS8vIE5COiBOb3QgcmVxdWlyZWQsIGJ1dCBjb25zaWRlcmVkIGJlc3QgcHJhY3RpY2UuCisJaWYgKF9faXNfbnVsbF9wb2ludGVyKF9fYmVnKSAmJiBfX2JlZyAhPSBfX2VuZCkKKwkgIHN0ZDo6X190aHJvd19sb2dpY19lcnJvcihfX04oIl9fcmNfc3RyaW5nX2Jhc2U6OiIKKwkJCQkgICAgICAgIl9TX2NvbnN0cnVjdCBudWxsIG5vdCB2YWxpZCIpKTsKKworCWNvbnN0IHNpemVfdHlwZSBfX2RuZXcgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KHN0ZDo6ZGlzdGFuY2UoX19iZWcsCisJCQkJCQkJCSAgICAgIF9fZW5kKSk7CisJLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisJX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9fZG5ldywgc2l6ZV90eXBlKDApLCBfX2EpOworCV9fdHJ5CisJICB7IF9TX2NvcHlfY2hhcnMoX19yLT5fTV9yZWZkYXRhKCksIF9fYmVnLCBfX2VuZCk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX19yLT5fTV9kZXN0cm95KF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCV9fci0+X01fc2V0X2xlbmd0aChfX2RuZXcpOworCXJldHVybiBfX3ItPl9NX3JlZmRhdGEoKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfQ2hhclQqCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9TX2NvbnN0cnVjdChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICB7CisgICAgICBpZiAoX19uID09IDAgJiYgX19hID09IF9BbGxvYygpKQorCXJldHVybiBfU19lbXB0eV9yZXAuX01fcmVmY29weSgpOworCisgICAgICAvLyBDaGVjayBmb3Igb3V0X29mX3JhbmdlIGFuZCBsZW5ndGhfZXJyb3IgZXhjZXB0aW9ucy4KKyAgICAgIF9SZXAqIF9fciA9IF9SZXA6Ol9TX2NyZWF0ZShfX24sIHNpemVfdHlwZSgwKSwgX19hKTsKKyAgICAgIGlmIChfX24pCisJX1NfYXNzaWduKF9fci0+X01fcmVmZGF0YSgpLCBfX24sIF9fYyk7CisKKyAgICAgIF9fci0+X01fc2V0X2xlbmd0aChfX24pOworICAgICAgcmV0dXJuIF9fci0+X01fcmVmZGF0YSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3N3YXAoX19yY19zdHJpbmdfYmFzZSYgX19yY3MpCisgICAgeworICAgICAgaWYgKF9NX2lzX2xlYWtlZCgpKQorCV9NX3NldF9zaGFyYWJsZSgpOworICAgICAgaWYgKF9fcmNzLl9NX2lzX2xlYWtlZCgpKQorCV9fcmNzLl9NX3NldF9zaGFyYWJsZSgpOworCisgICAgICBfQ2hhclQqIF9fdG1wID0gX01fZGF0YSgpOworICAgICAgX01fZGF0YShfX3Jjcy5fTV9kYXRhKCkpOworICAgICAgX19yY3MuX01fZGF0YShfX3RtcCk7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPGFsbG9jYXRvcl90eXBlPjo6X1NfZG9faXQoX01fZ2V0X2FsbG9jYXRvcigpLAorCQkJCQkJICBfX3Jjcy5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19yY19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2Fzc2lnbihjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3JjcykKKyAgICB7CisgICAgICBpZiAoX01fcmVwKCkgIT0gX19yY3MuX01fcmVwKCkpCisJeworCSAgX0NoYXJUKiBfX3RtcCA9IF9fcmNzLl9NX2dyYWIoX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9NX2Rpc3Bvc2UoKTsKKwkgIF9NX2RhdGEoX190bXApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3JlcykKKyAgICB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2hyaW5rIGJlbG93IHRoZSBjdXJyZW50IHNpemUuCisgICAgICBpZiAoX19yZXMgPCBfTV9sZW5ndGgoKSkKKwlfX3JlcyA9IF9NX2xlbmd0aCgpOworCisgICAgICBpZiAoX19yZXMgIT0gX01fY2FwYWNpdHkoKSB8fCBfTV9pc19zaGFyZWQoKSkKKwl7CisJICBfQ2hhclQqIF9fdG1wID0gX01fcmVwKCktPl9NX2Nsb25lKF9NX2dldF9hbGxvY2F0b3IoKSwKKwkJCQkJICAgICBfX3JlcyAtIF9NX2xlbmd0aCgpKTsKKwkgIF9NX2Rpc3Bvc2UoKTsKKwkgIF9NX2RhdGEoX190bXApOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9tdXRhdGUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19sZW4xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19sZW4yKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX01fbGVuZ3RoKCkgLSBfX3BvcyAtIF9fbGVuMTsKKworICAgICAgX1JlcCogX19yID0gX1JlcDo6X1NfY3JlYXRlKF9NX2xlbmd0aCgpICsgX19sZW4yIC0gX19sZW4xLAorCQkJCSAgX01fY2FwYWNpdHkoKSwgX01fZ2V0X2FsbG9jYXRvcigpKTsKKworICAgICAgaWYgKF9fcG9zKQorCV9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX2RhdGEoKSwgX19wb3MpOworICAgICAgaWYgKF9fcyAmJiBfX2xlbjIpCisJX1NfY29weShfX3ItPl9NX3JlZmRhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuMik7CisgICAgICBpZiAoX19ob3dfbXVjaCkKKwlfU19jb3B5KF9fci0+X01fcmVmZGF0YSgpICsgX19wb3MgKyBfX2xlbjIsCisJCV9NX2RhdGEoKSArIF9fcG9zICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKworICAgICAgX01fZGlzcG9zZSgpOworICAgICAgX01fZGF0YShfX3ItPl9NX3JlZmRhdGEoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3JjX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX25ld19zaXplID0gX01fbGVuZ3RoKCkgLSBfX247CisgICAgICBjb25zdCBzaXplX3R5cGUgX19ob3dfbXVjaCA9IF9NX2xlbmd0aCgpIC0gX19wb3MgLSBfX247CisKKyAgICAgIGlmIChfTV9pc19zaGFyZWQoKSkKKwl7CisJICAvLyBNdXN0IHJlYWxsb2NhdGUuCisJICBfUmVwKiBfX3IgPSBfUmVwOjpfU19jcmVhdGUoX19uZXdfc2l6ZSwgX01fY2FwYWNpdHkoKSwKKwkJCQkgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkpOworCisJICBpZiAoX19wb3MpCisJICAgIF9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCksIF9NX2RhdGEoKSwgX19wb3MpOworCSAgaWYgKF9faG93X211Y2gpCisJICAgIF9TX2NvcHkoX19yLT5fTV9yZWZkYXRhKCkgKyBfX3BvcywKKwkJICAgIF9NX2RhdGEoKSArIF9fcG9zICsgX19uLCBfX2hvd19tdWNoKTsKKworCSAgX01fZGlzcG9zZSgpOworCSAgX01fZGF0YShfX3ItPl9NX3JlZmRhdGEoKSk7CisJfQorICAgICAgZWxzZSBpZiAoX19ob3dfbXVjaCAmJiBfX24pCisJeworCSAgLy8gV29yayBpbi1wbGFjZS4KKwkgIF9TX21vdmUoX01fZGF0YSgpICsgX19wb3MsCisJCSAgX01fZGF0YSgpICsgX19wb3MgKyBfX24sIF9faG93X211Y2gpOworCX0KKworICAgICAgX01fcmVwKCktPl9NX3NldF9sZW5ndGgoX19uZXdfc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9fcmNfc3RyaW5nX2Jhc2U8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKKwkJICAgICBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+OjoKKyAgICBfTV9jb21wYXJlKGNvbnN0IF9fcmNfc3RyaW5nX2Jhc2UmIF9fcmNzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9yZXAoKSA9PSBfX3Jjcy5fTV9yZXAoKSkKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIGJvb2wKKyAgICBfX3JjX3N0cmluZ19iYXNlPHdjaGFyX3QsIHN0ZDo6Y2hhcl90cmFpdHM8d2NoYXJfdD4sCisJCSAgICAgc3RkOjphbGxvY2F0b3I8d2NoYXJfdD4gPjo6CisgICAgX01fY29tcGFyZShjb25zdCBfX3JjX3N0cmluZ19iYXNlJiBfX3JjcykgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fcmVwKCkgPT0gX19yY3MuX01fcmVwKCkpCisJcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9SQ19TVFJJTkdfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9yb3BlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcm9wZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkyMTUxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvcm9wZQpAQCAtMCwwICsxLDI5NjUgQEAKKy8vIFNHSSdzIHJvcGUgY2xhc3MgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5CisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgZXh0L3JvcGUKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeSAocG9zc2libHkKKyAqICBjb250YWluaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgSFAvU0dJIFNUTCBzdWJzZXQpLiAKKyAqLworCisjaWZuZGVmIF9ST1BFCisjZGVmaW5lIF9ST1BFIDEKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9zdGxfY29uc3RydWN0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdW5pbml0aWFsaXplZC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbnVtZXJpYy5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+CisjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisKKyMgaWZkZWYgX19HQworIyAgIGRlZmluZSBfX0dDX0NPTlNUIGNvbnN0CisjIGVsc2UKKyMgICBkZWZpbmUgX19HQ19DT05TVCAgIC8vIGNvbnN0YW50IGV4Y2VwdCBmb3IgZGVhbGxvY2F0aW9uCisjIGVuZGlmCisKKyNpbmNsdWRlIDxleHQvbWVtb3J5PiAvLyBGb3IgdW5pbml0aWFsaXplZF9jb3B5X24KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgICAgZW51bSB7IF9TX21heF9yb3BlX2RlcHRoID0gNDUgfTsKKyAgICBlbnVtIF9UYWcge19TX2xlYWYsIF9TX2NvbmNhdCwgX1Nfc3Vic3RyaW5nZm4sIF9TX2Z1bmN0aW9ufTsKKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6YWxsb2NhdG9yOworICB1c2luZyBzdGQ6Ol9EZXN0cm95OworCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFNlZSBsaWJzdGRjKysvMzY4MzIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gb3J3YXJkSXRlcmF0b3IsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIF9EZXN0cm95X2NvbnN0KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKKwkJICAgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9BbGxvY2F0b3IgX19hbGxvYykKKyAgICB7CisgICAgICBmb3IgKDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKKwlfX2FsbG9jLmRlc3Ryb3koJipfX2ZpcnN0KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgX0Rlc3Ryb3lfY29uc3QoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LAorCQkgICBfRm9yd2FyZEl0ZXJhdG9yIF9fbGFzdCwgYWxsb2NhdG9yPF9UcD4pCisgICAgeyBfRGVzdHJveShfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgLy8gVGhlIF9TX2VvcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aG9zZSBmdW5jdGlvbnMgdGhhdAorICAvLyBjb252ZXJ0IHRvL2Zyb20gQy1saWtlIHN0cmluZ3MgdG8gZGV0ZWN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgCisgIC8vIFRoZSBlbmQtb2YtQy1zdHJpbmcgY2hhcmFjdGVyLgorICAvLyBUaGlzIGlzIHdoYXQgdGhlIGRyYWZ0IHN0YW5kYXJkIHNheXMgaXQgc2hvdWxkIGJlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBfQ2hhclQKKyAgICBfU19lb3MoX0NoYXJUKikKKyAgICB7IHJldHVybiBfQ2hhclQoKTsgfQorCisgIC8vIFRlc3QgZm9yIGJhc2ljIGNoYXJhY3RlciB0eXBlcy4KKyAgLy8gRm9yIGJhc2ljIGNoYXJhY3RlciB0eXBlcyBsZWF2ZXMgaGF2aW5nIGEgdHJhaWxpbmcgZW9zLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgX1NfaXNfYmFzaWNfY2hhcl90eXBlKF9DaGFyVCopCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBfU19pc19vbmVfYnl0ZV9jaGFyX3R5cGUoX0NoYXJUKikKKyAgICB7IHJldHVybiBmYWxzZTsgfQorCisgIGlubGluZSBib29sCisgIF9TX2lzX2Jhc2ljX2NoYXJfdHlwZShjaGFyKikKKyAgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgaW5saW5lIGJvb2wKKyAgX1NfaXNfb25lX2J5dGVfY2hhcl90eXBlKGNoYXIqKQorICB7IHJldHVybiB0cnVlOyB9CisgIAorICBpbmxpbmUgYm9vbAorICBfU19pc19iYXNpY19jaGFyX3R5cGUod2NoYXJfdCopCisgIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBTdG9yZSBhbiBlb3MgaWZmIF9DaGFyVCBpcyBhIGJhc2ljIGNoYXJhY3RlciB0eXBlLgorICAvLyBEbyBub3QgcmVmZXJlbmNlIF9TX2VvcyBpZiBpdCBpc24ndC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9DaGFyVCYpIHsgfQorCisgIGlubGluZSB2b2lkCisgIF9TX2NvbmRfc3RvcmVfZW9zKGNoYXImIF9fYykKKyAgeyBfX2MgPSAwOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX1NfY29uZF9zdG9yZV9lb3Mod2NoYXJfdCYgX19jKQorICB7IF9fYyA9IDA7IH0KKworICAvLyBjaGFyX3Byb2R1Y2VycyBhcmUgbG9naWNhbGx5IGZ1bmN0aW9ucyB0aGF0IGdlbmVyYXRlIGEgc2VjdGlvbiBvZgorICAvLyBhIHN0cmluZy4gIFRoZXNlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gcm9wZXMuICBUaGUgcmVzdWx0aW5nIHJvcGUKKyAgLy8gaW52b2tlcyB0aGUgY2hhcl9wcm9kdWNlciBvbiBkZW1hbmQuICBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsCisgIC8vIGZpbGVzIHRvIGJlIHZpZXdlZCBhcyByb3BlcyB3aXRob3V0IHJlYWRpbmcgdGhlIGVudGlyZSBmaWxlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGNsYXNzIGNoYXJfcHJvZHVjZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdmlydHVhbCB+Y2hhcl9wcm9kdWNlcigpIHsgfTsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fbGVuLAorCQkgX0NoYXJUKiBfX2J1ZmZlcikgPSAwOworICAgICAgLy8gQnVmZmVyIHNob3VsZCByZWFsbHkgYmUgYW4gYXJiaXRyYXJ5IG91dHB1dCBpdGVyYXRvci4KKyAgICAgIC8vIFRoYXQgd2F5IHdlIGNvdWxkIGZsYXR0ZW4gZGlyZWN0bHkgaW50byBhbiBvc3RyZWFtLCBldGMuCisgICAgICAvLyBUaGlzIGlzIHRob3JvdWdobHkgaW1wb3NzaWJsZSwgc2luY2UgaXRlcmF0b3IgdHlwZXMgZG9uJ3QKKyAgICAgIC8vIGhhdmUgcnVudGltZSBkZXNjcmlwdGlvbnMuCisgICAgfTsKKworICAvLyBTZXF1ZW5jZSBidWZmZXJzOgorICAvLworICAvLyBTZXF1ZW5jZSBtdXN0IHByb3ZpZGUgYW4gYXBwZW5kIG9wZXJhdGlvbiB0aGF0IGFwcGVuZHMgYW4KKyAgLy8gYXJyYXkgdG8gdGhlIHNlcXVlbmNlLiAgU2VxdWVuY2UgYnVmZmVycyBhcmUgdXNlZnVsIG9ubHkgaWYKKyAgLy8gYXBwZW5kaW5nIGFuIGVudGlyZSBhcnJheSBpcyBjaGVhcGVyIHRoYW4gYXBwZW5kaW5nIGVsZW1lbnQgYnkgZWxlbWVudC4KKyAgLy8gVGhpcyBpcyB0cnVlIGZvciBtYW55IHN0cmluZyByZXByZXNlbnRhdGlvbnMuCisgIC8vIFRoaXMgc2hvdWxkICBwZXJoYXBzIGluaGVyaXQgZnJvbSBvc3RyZWFtPHNlcXVlbmNlOjp2YWx1ZV90eXBlPgorICAvLyBhbmQgYmUgaW1wbGVtZW50ZWQgY29ycmVzcG9uZGluZ2x5LCBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQKKyAgLy8gZm9yIGZvcm1hdHRlZC4gIEZvciB0aGUgc2FrZSBvZiBwb3J0YWJpbGl0eSwgd2UgZG9uJ3QgZG8gdGhpcyB5ZXQuCisgIC8vCisgIC8vIEZvciBub3csIHNlcXVlbmNlIGJ1ZmZlcnMgYmVoYXZlIGFzIG91dHB1dCBpdGVyYXRvcnMuICBCdXQgdGhleSBhbHNvCisgIC8vIGJlaGF2ZSBhIGxpdHRsZSBsaWtlIGJhc2ljX29zdHJpbmdzdHJlYW08c2VxdWVuY2U6OnZhbHVlX3R5cGU+IGFuZCBhCisgIC8vIGxpdHRsZSBsaWtlIGNvbnRhaW5lcnMuCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1NlcXVlbmNlLCBzaXplX3QgX0J1Zl9zeiA9IDEwMD4KKyAgICBjbGFzcyBzZXF1ZW5jZV9idWZmZXIKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfU2VxdWVuY2U6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfU2VxdWVuY2UqIF9NX3ByZWZpeDsKKyAgICAgIHZhbHVlX3R5cGUgX01fYnVmZmVyW19CdWZfc3pdOworICAgICAgc2l6ZV90ICAgICBfTV9idWZfY291bnQ7CisgICAgcHVibGljOgorCisgICAgICB2b2lkCisgICAgICBmbHVzaCgpCisgICAgICB7CisJX01fcHJlZml4LT5hcHBlbmQoX01fYnVmZmVyLCBfTV9idWZmZXIgKyBfTV9idWZfY291bnQpOworCV9NX2J1Zl9jb3VudCA9IDA7CisgICAgICB9CisgICAgICAKKyAgICAgIH5zZXF1ZW5jZV9idWZmZXIoKQorICAgICAgeyBmbHVzaCgpOyB9CisgICAgICAKKyAgICAgIHNlcXVlbmNlX2J1ZmZlcigpCisgICAgICA6IF9NX3ByZWZpeCgwKSwgX01fYnVmX2NvdW50KDApIHsgfQorCisgICAgICBzZXF1ZW5jZV9idWZmZXIoY29uc3Qgc2VxdWVuY2VfYnVmZmVyJiBfX3gpCisgICAgICB7CisJX01fcHJlZml4ID0gX194Ll9NX3ByZWZpeDsKKwlfTV9idWZfY291bnQgPSBfX3guX01fYnVmX2NvdW50OworCXN0ZDo6Y29weShfX3guX01fYnVmZmVyLCBfX3guX01fYnVmZmVyICsgX194Ll9NX2J1Zl9jb3VudCwgX01fYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyKHNlcXVlbmNlX2J1ZmZlciYgX194KQorICAgICAgeworCV9feC5mbHVzaCgpOworCV9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisJX01fYnVmX2NvdW50ID0gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyKF9TZXF1ZW5jZSYgX19zKQorICAgICAgOiBfTV9wcmVmaXgoJl9fcyksIF9NX2J1Zl9jb3VudCgwKSB7IH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3I9KHNlcXVlbmNlX2J1ZmZlciYgX194KQorICAgICAgeworCV9feC5mbHVzaCgpOworCV9NX3ByZWZpeCA9IF9feC5fTV9wcmVmaXg7CisJX01fYnVmX2NvdW50ID0gMDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNlcXVlbmNlX2J1ZmZlciYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBzZXF1ZW5jZV9idWZmZXImIF9feCkKKyAgICAgIHsKKwlfTV9wcmVmaXggPSBfX3guX01fcHJlZml4OworCV9NX2J1Zl9jb3VudCA9IF9feC5fTV9idWZfY291bnQ7CisJc3RkOjpjb3B5KF9feC5fTV9idWZmZXIsIF9feC5fTV9idWZmZXIgKyBfX3guX01fYnVmX2NvdW50LCBfTV9idWZmZXIpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKHZhbHVlX3R5cGUgX194KQorICAgICAgeworCWlmIChfTV9idWZfY291bnQgPCBfQnVmX3N6KQorCSAgeworCSAgICBfTV9idWZmZXJbX01fYnVmX2NvdW50XSA9IF9feDsKKwkgICAgKytfTV9idWZfY291bnQ7CisJICB9CisJZWxzZQorCSAgeworCSAgICBmbHVzaCgpOworCSAgICBfTV9idWZmZXJbMF0gPSBfX3g7CisJICAgIF9NX2J1Zl9jb3VudCA9IDE7CisJICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGFwcGVuZCh2YWx1ZV90eXBlKiBfX3MsIHNpemVfdCBfX2xlbikKKyAgICAgIHsKKwlpZiAoX19sZW4gKyBfTV9idWZfY291bnQgPD0gX0J1Zl9zeikKKwkgIHsKKwkgICAgc2l6ZV90IF9faSA9IF9NX2J1Zl9jb3VudDsKKwkgICAgZm9yIChzaXplX3QgX19qID0gMDsgX19qIDwgX19sZW47IF9faSsrLCBfX2orKykKKwkgICAgICBfTV9idWZmZXJbX19pXSA9IF9fc1tfX2pdOworCSAgICBfTV9idWZfY291bnQgKz0gX19sZW47CisJICB9CisJZWxzZSBpZiAoMCA9PSBfTV9idWZfY291bnQpCisJICBfTV9wcmVmaXgtPmFwcGVuZChfX3MsIF9fcyArIF9fbGVuKTsKKwllbHNlCisJICB7CisJICAgIGZsdXNoKCk7CisJICAgIGFwcGVuZChfX3MsIF9fbGVuKTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgd3JpdGUodmFsdWVfdHlwZSogX19zLCBzaXplX3QgX19sZW4pCisgICAgICB7CisJYXBwZW5kKF9fcywgX19sZW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgcHV0KHZhbHVlX3R5cGUgX194KQorICAgICAgeworCXB1c2hfYmFjayhfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHZhbHVlX3R5cGUmIF9fcmhzKQorICAgICAgeworCXB1c2hfYmFjayhfX3Jocyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgCisgICAgICBzZXF1ZW5jZV9idWZmZXImCisgICAgICBvcGVyYXRvciooKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgc2VxdWVuY2VfYnVmZmVyJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgCisgICAgICBzZXF1ZW5jZV9idWZmZXIKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKyAgICB9OworICAKKyAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcml2YXRlLCBhdCBsZWFzdCBmb3Igbm93LgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgY2xhc3MgX1JvcGVfY2hhcl9jb25zdW1lcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBJZiB3ZSBoYWQgbWVtYmVyIHRlbXBsYXRlcywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB2aXJ0dWFsLgorICAgICAgLy8gRm9yIG5vdyB3ZSBuZWVkIHRvIHVzZSBydW4tdGltZSBwYXJhbWV0cml6YXRpb24gd2hlcmUKKyAgICAgIC8vIGNvbXBpbGUtdGltZSB3b3VsZCBkby4gIEhlbmNlIHRoaXMgc2hvdWxkIGFsbCBiZSBwcml2YXRlCisgICAgICAvLyBmb3Igbm93LgorICAgICAgLy8gVGhlIHN5bW1ldHJ5IHdpdGggY2hhcl9wcm9kdWNlciBpcyBhY2NpZGVudGFsIGFuZCB0ZW1wb3JhcnkuCisgICAgICB2aXJ0dWFsIH5fUm9wZV9jaGFyX2NvbnN1bWVyKCkgeyB9OworICAKKyAgICAgIHZpcnR1YWwgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2hhclQqIF9fYnVmZmVyLCBzaXplX3QgX19sZW4pID0gMDsKKyAgICB9OworICAKKyAgLy8gRmlyc3QgYSBsb3Qgb2YgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBUaGUgc3RhbmRhcmQgc2VlbXMgdG8gcmVxdWlyZQorICAvLyBtdWNoIHN0cmljdGVyICJkZWNsYXJhdGlvbiBiZWZvcmUgdXNlIiB0aGFuIG1hbnkgb2YgdGhlIGltcGxlbWVudGF0aW9ucworICAvLyB0aGF0IHByZWNlZGVkIGl0LgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyByb3BlOworICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlTGVhZjsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlRnVuY3Rpb247CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfUm9wZVN1YnN0cmluZzsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2l0ZXJhdG9yOworICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY29uc3RfaXRlcmF0b3I7CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jaGFyX3JlZl9wcm94eTsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIHB0cmRpZmZfdCBfX24pOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBwdHJkaWZmX3QgX19uKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKyAgCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHB0cmRpZmZfdAorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LCBwdHJkaWZmX3QgX19uKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBwdHJkaWZmX3QKKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpOworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIGNvbnN0IF9DaGFyVCogX19yaWdodCk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fbGVmdCwgX0NoYXJUIF9fcmlnaHQpOworCisgIC8vIFNvbWUgaGVscGVycywgc28gd2UgY2FuIHVzZSBwb3dlciBvbiByb3Blcy4KKyAgLy8gU2VlIGJlbG93IGZvciB3aHkgdGhpcyBpc24ndCBsb2NhbCB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgIAorICAvLyBUaGlzIHVzZXMgYSBub25zdGFuZGFyZCByZWZjb3VudCBjb252ZW50aW9uLgorICAvLyBUaGUgcmVzdWx0IGhhcyByZWZjb3VudCAwLgorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfQ29uY2F0X2ZuCisgICAgOiBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248cm9wZTxfQ2hhclQsIF9BbGxvYz4sIHJvcGU8X0NoYXJULCBfQWxsb2M+LAorCQkJCSAgcm9wZTxfQ2hhclQsIF9BbGxvYz4gPgorICAgIHsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJCSBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgICAgeyByZXR1cm4gX194ICsgX195OyB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgaWRlbnRpdHlfZWxlbWVudChfUm9wZV9Db25jYXRfZm48X0NoYXJULCBfQWxsb2M+KQorICAgIHsgcmV0dXJuIHJvcGU8X0NoYXJULCBfQWxsb2M+KCk7IH0KKworICAvLyBDbGFzcyBfUmVmY291bnRfQmFzZSBwcm92aWRlcyBhIHR5cGUsIF9SQ190LCBhIGRhdGEgbWVtYmVyLAorICAvLyBfTV9yZWZfY291bnQsIGFuZCBtZW1iZXIgZnVuY3Rpb25zIF9NX2luY3IgYW5kIF9NX2RlY3IsIHdoaWNoIHBlcmZvcm0KKyAgLy8gYXRvbWljIHByZWluY3JlbWVudC9wcmVkZWNyZW1lbnQuICBUaGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMKKyAgLy8gX01fcmVmX2NvdW50LgorICBzdHJ1Y3QgX1JlZmNvdW50X0Jhc2UKKyAgeworICAgIC8vIFRoZSB0eXBlIF9SQ190CisgICAgdHlwZWRlZiBzaXplX3QgX1JDX3Q7CisgICAgCisgICAgLy8gVGhlIGRhdGEgbWVtYmVyIF9NX3JlZl9jb3VudAorICAgIHZvbGF0aWxlIF9SQ190IF9NX3JlZl9jb3VudDsKKworICAgIC8vIENvbnN0cnVjdG9yCisgICAgX19ndGhyZWFkX211dGV4X3QgX01fcmVmX2NvdW50X2xvY2s7CisKKyAgICBfUmVmY291bnRfQmFzZShfUkNfdCBfX24pIDogX01fcmVmX2NvdW50KF9fbiksIF9NX3JlZl9jb3VudF9sb2NrKCkKKyAgICB7CisjaWZkZWYgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICAgIF9fZ3RocmVhZF9tdXRleF90IF9fdG1wID0gX19HVEhSRUFEX01VVEVYX0lOSVQ7CisgICAgICBfTV9yZWZfY291bnRfbG9jayA9IF9fdG1wOworI2VsaWYgZGVmaW5lZChfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTikKKyAgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OICgmX01fcmVmX2NvdW50X2xvY2spOworI2Vsc2UKKyNlcnJvciBfX0dUSFJFQURfTVVURVhfSU5JVCBvciBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiBzaG91bGQgYmUgZGVmaW5lZCBieSBndGhyLmggYWJzdHJhY3Rpb24gbGF5ZXIsIHJlcG9ydCBwcm9ibGVtIHRvIGxpYnN0ZGMrK0BnY2MuZ251Lm9yZy4KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQKKyAgICBfTV9pbmNyKCkKKyAgICB7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fcmVmX2NvdW50X2xvY2spOworICAgICAgKytfTV9yZWZfY291bnQ7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdW5sb2NrKCZfTV9yZWZfY291bnRfbG9jayk7CisgICAgfQorCisgICAgX1JDX3QKKyAgICBfTV9kZWNyKCkKKyAgICB7CisgICAgICBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fcmVmX2NvdW50X2xvY2spOworICAgICAgdm9sYXRpbGUgX1JDX3QgX190bXAgPSAtLV9NX3JlZl9jb3VudDsKKyAgICAgIF9fZ3RocmVhZF9tdXRleF91bmxvY2soJl9NX3JlZl9jb3VudF9sb2NrKTsKKyAgICAgIHJldHVybiBfX3RtcDsKKyAgICB9CisgIH07CisKKyAgLy8KKyAgLy8gV2hhdCBmb2xsb3dzIHNob3VsZCByZWFsbHkgYmUgbG9jYWwgdG8gcm9wZS4gIFVuZm9ydHVuYXRlbHksCisgIC8vIHRoYXQgZG9lc24ndCB3b3JrLCBzaW5jZSBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGRlZmluZSBnZW5lcmljCisgIC8vIGVxdWFsaXR5IG9uIHJvcGUgaXRlcmF0b3JzLiAgQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzdGFuZGFyZCwgdGhlCisgIC8vIHRlbXBsYXRlIHBhcmFtZXRlcnMgZm9yIHN1Y2ggYW4gZXF1YWxpdHkgb3BlcmF0b3IgY2Fubm90IGJlIGluZmVycmVkCisgIC8vIGZyb20gdGhlIG9jY3VycmVuY2Ugb2YgYSBtZW1iZXIgY2xhc3MgYXMgYSBwYXJhbWV0ZXIuCisgIC8vIChTR0kgY29tcGlsZXJzIGluIGZhY3QgYWxsb3cgdGhpcywgYnV0IHRoZSBfX3Jlc3VsdCB3b3VsZG4ndCBiZQorICAvLyBwb3J0YWJsZS4pCisgIC8vIFNpbWlsYXJseSwgc29tZSBvZiB0aGUgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgYXJlIG1lbWJlciBmdW5jdGlvbnMKKyAgLy8gb25seSB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGFuZCB0byBjaXJjdW12ZW50CisgIC8vIHJlc3RyaWN0aW9ucyBvbiB0eXBlIGluZmVyZW5jZSBmb3IgdGVtcGxhdGUgZnVuY3Rpb25zLgorICAvLworCisgIC8vCisgIC8vIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIGEgcm9wZS4gIFRoaXMgaXMKKyAgLy8gcHJpdmF0ZSB0byB0aGUgaW1wbGVtZW50YXRpb24uICBBIHJvcGUgaXMgcmVhbGx5IGp1c3QgYSBwb2ludGVyCisgIC8vIHRvIG9uZSBvZiB0aGVzZS4KKyAgLy8KKyAgLy8gQSBmZXcgYmFzaWMgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZQorICAvLyBhcmUgbWVtYmVycyBvZiBfUm9wZVJlcC4gIE1vc3Qgb2YgdGhlIG1vcmUgY29tcGxleCBhbGdvcml0aG1zCisgIC8vIGFyZSBpbXBsZW1lbnRlZCBhcyByb3BlIG1lbWJlcnMuCisgIC8vCisgIC8vIFNvbWUgb2YgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG9mIF9Sb3BlUmVwIGhhdmUgaWRlbnRpY2FsbHkKKyAgLy8gbmFtZWQgZnVuY3Rpb25zIGluIHJvcGUgdGhhdCBzaW1wbHkgaW52b2tlIHRoZSBfUm9wZVJlcCB2ZXJzaW9ucy4KKworI2RlZmluZSBfX1JPUEVfREVGSU5FX0FMTE9DUyhfX2EpIFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfQ2hhclQsX0RhdGEpIC8qIGNoYXJhY3RlciBkYXRhICovIFwKKyAgICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsX19hPiBfX0M7IFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfX0MsX0MpIFwKKyAgICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsX19hPiBfX0w7IFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfX0wsX0wpIFwKKyAgICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9fYT4gX19GOyBcCisgICAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0MoX19GLF9GKSBcCisgICAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsX19hPiBfX1M7IFwKKyAgICAgICAgX19ST1BFX0RFRklORV9BTExPQyhfX1MsX1MpCisKKyAgLy8gIEludGVybmFsIHJvcGUgbm9kZXMgcG90ZW50aWFsbHkgc3RvcmUgYSBjb3B5IG9mIHRoZSBhbGxvY2F0b3IKKyAgLy8gIGluc3RhbmNlIHVzZWQgdG8gYWxsb2NhdGUgdGhlbS4gIFRoaXMgaXMgbW9zdGx5IHJlZHVuZGFudC4KKyAgLy8gIEJ1dCB0aGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gcGFzcyBhbGxvY2F0b3IgaW5zdGFuY2VzIGFyb3VuZAorICAvLyAgaW4gc29tZSBmb3JtIHRvIG5lYXJseSBhbGwgaW50ZXJuYWwgZnVuY3Rpb25zLCBzaW5jZSBhbnkgcG9pbnRlcgorICAvLyAgYXNzaWdubWVudCBtYXkgcmVzdWx0IGluIGEgemVybyByZWZlcmVuY2UgY291bnQgYW5kIHRodXMgcmVxdWlyZQorICAvLyAgZGVhbGxvY2F0aW9uLgorCisjZGVmaW5lIF9fU1RBVElDX0lGX1NHSV9BTExPQyAgLyogbm90IHN0YXRpYyAqLworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzdHJ1Y3QgX1JvcGVfcmVwX2Jhc2UKKyAgICA6IHB1YmxpYyBfQWxsb2MKKyAgICB7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9BbGxvYyo+KHRoaXMpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X0FsbG9jKj4odGhpcyk7IH0KKworICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQWxsb2MqPih0aGlzKTsgfQorCisgICAgICBfUm9wZV9yZXBfYmFzZShzaXplX3QgX19zaXplLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYpCisgICAgICA6IF9NX3NpemUoX19zaXplKSB7IH0KKworICAgICAgc2l6ZV90IF9NX3NpemU7CisKKyMgZGVmaW5lIF9fUk9QRV9ERUZJTkVfQUxMT0MoX1RwLCBfX25hbWUpIFwKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBcCisgICAgICAgICAgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1RwPjo6b3RoZXIgX19uYW1lIyNBbGxvYzsgXAorICAgICAgICBzdGF0aWMgX1RwKiBfX25hbWUjI19hbGxvY2F0ZShzaXplX3QgX19uKSBcCisgICAgICAgICAgeyByZXR1cm4gX19uYW1lIyNBbGxvYygpLmFsbG9jYXRlKF9fbik7IH0gXAorICAgICAgICBzdGF0aWMgdm9pZCBfX25hbWUjI19kZWFsbG9jYXRlKF9UcCAqX19wLCBzaXplX3QgX19uKSBcCisgICAgICAgICAgeyBfX25hbWUjI0FsbG9jKCkuZGVhbGxvY2F0ZShfX3AsIF9fbik7IH0KKyAgICAgIF9fUk9QRV9ERUZJTkVfQUxMT0NTKF9BbGxvYykKKyMgdW5kZWYgX19ST1BFX0RFRklORV9BTExPQworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVSZXAKKyAgICA6IHB1YmxpYyBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz4KKyMgaWZuZGVmIF9fR0MKKwkgICAgICwgX1JlZmNvdW50X0Jhc2UKKyMgZW5kaWYKKyAgICB7CisgICAgcHVibGljOgorICAgICAgX19kZXRhaWw6Ol9UYWcgX01fdGFnOjg7CisgICAgICBib29sIF9NX2lzX2JhbGFuY2VkOjg7CisgICAgICB1bnNpZ25lZCBjaGFyIF9NX2RlcHRoOworICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2Nfc3RyaW5nOworICAgICAgX19ndGhyZWFkX211dGV4X3QgX01fY19zdHJpbmdfbG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYXR0ZW5lZCB2ZXJzaW9uIG9mIHN0cmluZywgaWYgbmVlZGVkLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGljYWxseSAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGl0J3Mgbm90IDAsIHRoZW4gdGhlIG1lbW9yeSBpcyBvd25lZCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5IHRoaXMgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIHRoZSBjYXNlIG9mIGEgbGVhZiwgdGhpcyBtYXkgcG9pbnQgdG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzYW1lIG1lbW9yeSBhcyB0aGUgZGF0YSBmaWVsZC4gICAgICAgKi8KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZQorICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgdXNpbmcgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjpnZXRfYWxsb2NhdG9yOworICAgICAgdXNpbmcgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjpfTV9nZXRfYWxsb2NhdG9yOworCisgICAgICBfUm9wZV9Sb3BlUmVwKF9fZGV0YWlsOjpfVGFnIF9fdCwgaW50IF9fZCwgYm9vbCBfX2IsIHNpemVfdCBfX3NpemUsCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfUm9wZV9yZXBfYmFzZTxfQ2hhclQsIF9BbGxvYz4oX19zaXplLCBfX2EpLAorI2lmbmRlZiBfX0dDCisJX1JlZmNvdW50X0Jhc2UoMSksCisjZW5kaWYKKwlfTV90YWcoX190KSwgX01faXNfYmFsYW5jZWQoX19iKSwgX01fZGVwdGgoX19kKSwgX01fY19zdHJpbmcoMCkKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIHsKKyAgICAgIC8vIERvIG5vdCBjb3B5IGEgUE9TSVgvZ3RociBtdXRleCBvbmNlIGluIHVzZS4gIEhvd2V2ZXIsIGJpdHMgYXJlIGJpdHMuCisgICAgICBfX2d0aHJlYWRfbXV0ZXhfdCBfX3RtcCA9IF9fR1RIUkVBRF9NVVRFWF9JTklUOworICAgICAgX01fY19zdHJpbmdfbG9jayA9IF9fdG1wOworICAgIH0KKyNlbHNlCisgICAgeyBfX0dUSFJFQURfTVVURVhfSU5JVF9GVU5DVElPTiAoJl9NX2Nfc3RyaW5nX2xvY2spOyB9CisjZW5kaWYKKyNpZmRlZiBfX0dDCisgICAgICB2b2lkCisgICAgICBfTV9pbmNyICgpIHsgfQorI2VuZGlmCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZnJlZV9zdHJpbmcoX19HQ19DT05TVCBfQ2hhclQqLCBzaXplX3QgX19sZW4sCisJCSAgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSk7CisjZGVmaW5lIF9fU1RMX0ZSRUVfU1RSSU5HKF9fcywgX19sLCBfX2EpIF9TX2ZyZWVfc3RyaW5nKF9fcywgX19sLCBfX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVhbGxvY2F0ZSBkYXRhIHNlY3Rpb24gb2YgYSBsZWFmLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1iZXIgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdXQgaXRzIGhhcmQgdG8gZG8gYW55dGhpbmcgZWxzZSBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vbWVudCwgYmVjYXVzZSBpdCdzIHRlbXBsYXRpemVkIHcuci50LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gYWxsb2NhdG9yLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lcyBub3RoaW5nIGlmIF9fR0MgaXMgZGVmaW5lZC4KKyNpZm5kZWYgX19HQworICAgICAgdm9pZCBfTV9mcmVlX2Nfc3RyaW5nKCk7CisgICAgICB2b2lkIF9NX2ZyZWVfdHJlZSgpOworICAgICAgLy8gRGVhbGxvY2F0ZSB0LiBBc3N1bWVzIHQgaXMgbm90IDAuCisgICAgICB2b2lkCisgICAgICBfTV91bnJlZl9ub25uaWwoKQorICAgICAgeworCWlmICgwID09IF9NX2RlY3IoKSkKKwkgIF9NX2ZyZWVfdHJlZSgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9yZWZfbm9ubmlsKCkKKyAgICAgIHsgX01faW5jcigpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU191bnJlZihfUm9wZV9Sb3BlUmVwKiBfX3QpCisgICAgICB7CisJaWYgKDAgIT0gX190KQorCSAgX190LT5fTV91bnJlZl9ub25uaWwoKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX3JlZihfUm9wZV9Sb3BlUmVwKiBfX3QpCisgICAgICB7CisJaWYgKDAgIT0gX190KQorCSAgX190LT5fTV9pbmNyKCk7CisgICAgICB9CisgICAgICAKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19mcmVlX2lmX3VucmVmKF9Sb3BlX1JvcGVSZXAqIF9fdCkKKyAgICAgIHsKKwlpZiAoMCAhPSBfX3QgJiYgMCA9PSBfX3QtPl9NX3JlZl9jb3VudCkKKwkgIF9fdC0+X01fZnJlZV90cmVlKCk7CisgICAgICB9CisjICAgZWxzZSAvKiBfX0dDICovCisgICAgICB2b2lkIF9NX3VucmVmX25vbm5pbCgpIHsgfQorICAgICAgdm9pZCBfTV9yZWZfbm9ubmlsKCkgeyB9CisgICAgICBzdGF0aWMgdm9pZCBfU191bnJlZihfUm9wZV9Sb3BlUmVwKikgeyB9CisgICAgICBzdGF0aWMgdm9pZCBfU19yZWYoX1JvcGVfUm9wZVJlcCopIHsgfQorICAgICAgc3RhdGljIHZvaWQgX1NfZnJlZV9pZl91bnJlZihfUm9wZV9Sb3BlUmVwKikgeyB9CisjICAgZW5kaWYKK3Byb3RlY3RlZDoKKyAgICAgIF9Sb3BlX1JvcGVSZXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfUm9wZVJlcCYpOworCisgICAgICBfUm9wZV9Sb3BlUmVwKGNvbnN0IF9Sb3BlX1JvcGVSZXAmKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlTGVhZgorICAgIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIEFwcGFyZW50bHkgbmVlZGVkIGJ5IFZDKysKKyAgICAgIC8vIFRoZSBkYXRhIGZpZWxkcyBvZiBsZWF2ZXMgYXJlIGFsbG9jYXRlZCB3aXRoIHNvbWUKKyAgICAgIC8vIGV4dHJhIHNwYWNlLCB0byBhY2NvbW1vZGF0ZSBmdXR1cmUgZ3Jvd3RoIGFuZCBmb3IgYmFzaWMKKyAgICAgIC8vIGNoYXJhY3RlciB0eXBlcywgdG8gaG9sZCBhIHRyYWlsaW5nIGVvcyBjaGFyYWN0ZXIuCisgICAgICBlbnVtIHsgX1NfYWxsb2NfZ3JhbnVsYXJpdHkgPSA4IH07CisgICAgICAKKyAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgIF9TX3JvdW5kZWRfdXBfc2l6ZShzaXplX3QgX19uKQorICAgICAgeworICAgICAgICBzaXplX3QgX19zaXplX3dpdGhfZW9zOworCQorICAgICAgICBpZiAoX1NfaXNfYmFzaWNfY2hhcl90eXBlKChfQ2hhclQqKTApKQorCSAgX19zaXplX3dpdGhfZW9zID0gX19uICsgMTsKKwllbHNlCisJICBfX3NpemVfd2l0aF9lb3MgPSBfX247CisjaWZkZWYgX19HQworCXJldHVybiBfX3NpemVfd2l0aF9lb3M7CisjZWxzZQorCS8vIEFsbG93IHNsb3AgZm9yIGluLXBsYWNlIGV4cGFuc2lvbi4KKwlyZXR1cm4gKChfX3NpemVfd2l0aF9lb3MgKyBzaXplX3QoX1NfYWxsb2NfZ3JhbnVsYXJpdHkpIC0gMSkKKwkJJn4gKHNpemVfdChfU19hbGxvY19ncmFudWxhcml0eSkgLSAxKSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfTV9kYXRhOyAvKiBOb3QgbmVjZXNzYXJpbHkgMCB0ZXJtaW5hdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBhbGxvY2F0ZWQgc2l6ZSBpcyAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX1Nfcm91bmRlZF91cF9zaXplKHNpemUpLCBleGNlcHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiB0aGUgR0MgY2FzZSwgaW4gd2hpY2ggaXQgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvZXNuJ3QgbWF0dGVyLiAgICAgICAgICAgICAgICovCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCxfQWxsb2M+OjphbGxvY2F0b3JfdHlwZQorICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX1JvcGVfUm9wZUxlYWYoX19HQ19DT05TVCBfQ2hhclQqIF9fZCwgc2l6ZV90IF9fc2l6ZSwKKwkJICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPihfX2RldGFpbDo6X1NfbGVhZiwgMCwgdHJ1ZSwKKwkJCQkgICAgICBfX3NpemUsIF9fYSksIF9NX2RhdGEoX19kKQorICAgICAgeworICAgICAgICBpZiAoX1NfaXNfYmFzaWNfY2hhcl90eXBlKChfQ2hhclQgKikwKSkKKwkgIHsKKyAgICAgICAgICAgIC8vIGFscmVhZHkgZW9zIHRlcm1pbmF0ZWQuCisgICAgICAgICAgICB0aGlzLT5fTV9jX3N0cmluZyA9IF9fZDsKKwkgIH0KKyAgICAgIH0KKyAgICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBhc3N1bWVzIHRoYXQgZCBoYXMgYmVlbiBhbGxvY2F0ZWQgd2l0aAorICAgICAgLy8gdGhlIHByb3BlciBhbGxvY2F0b3IgYW5kIHRoZSBwcm9wZXJseSBwYWRkZWQgc2l6ZS4KKyAgICAgIC8vIEluIGNvbnRyYXN0LCB0aGUgZGVzdHJ1Y3RvciBkZWFsbG9jYXRlcyB0aGUgZGF0YToKKyNpZm5kZWYgX19HQworICAgICAgfl9Sb3BlX1JvcGVMZWFmKCkgdGhyb3coKQorICAgICAgeworICAgICAgICBpZiAoX01fZGF0YSAhPSB0aGlzLT5fTV9jX3N0cmluZykKKwkgIHRoaXMtPl9NX2ZyZWVfY19zdHJpbmcoKTsKKwkKKyAgICAgICAgX19TVExfRlJFRV9TVFJJTkcoX01fZGF0YSwgdGhpcy0+X01fc2l6ZSwgdGhpcy0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKyNlbmRpZgorcHJvdGVjdGVkOgorICAgICAgX1JvcGVfUm9wZUxlYWYmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfUm9wZUxlYWYmKTsKKworICAgICAgX1JvcGVfUm9wZUxlYWYoY29uc3QgX1JvcGVfUm9wZUxlYWYmKTsKKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbgorICAgIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfTV9sZWZ0OworICAgICAgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9NX3JpZ2h0OworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKKyAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uKF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfX2wsCisJCQkgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX19yLAorCQkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKwk6IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KF9fZGV0YWlsOjpfU19jb25jYXQsCisJCQkJICAgICAgc3RkOjptYXgoX19sLT5fTV9kZXB0aCwKKwkJCQkJICAgICAgIF9fci0+X01fZGVwdGgpICsgMSwKKwkJCQkgICAgICBmYWxzZSwKKwkJCQkgICAgICBfX2wtPl9NX3NpemUgKyBfX3ItPl9NX3NpemUsIF9fYSksCisgICAgICAgIF9NX2xlZnQoX19sKSwgX01fcmlnaHQoX19yKQorICAgICAgeyB9CisjaWZuZGVmIF9fR0MKKyAgICAgIH5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbigpIHRocm93KCkKKyAgICAgIHsKKwl0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisJX01fbGVmdC0+X01fdW5yZWZfbm9ubmlsKCk7CisJX01fcmlnaHQtPl9NX3VucmVmX25vbm5pbCgpOworICAgICAgfQorI2VuZGlmCitwcm90ZWN0ZWQ6CisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiYpOworICAgICAgCisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbihjb25zdCBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbiYpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX1JvcGVGdW5jdGlvbgorICAgIDogcHVibGljIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX01fZm47CisjaWZuZGVmIF9fR0MKKyAgICAgIGJvb2wgX01fZGVsZXRlX3doZW5fZG9uZTsgLy8gQ2hhcl9wcm9kdWNlciBpcyBvd25lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9wZSBhbmQgc2hvdWxkIGJlIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB3aGVuIHRoZSByb3BlIGJlY29tZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5hY2Nlc3NpYmxlLgorI2Vsc2UKKyAgICAgIC8vIEluIHRoZSBHQyBjYXNlLCB3ZSBlaXRoZXIgcmVnaXN0ZXIgdGhlIHJvcGUgZm9yCisgICAgICAvLyBmaW5hbGl6YXRpb24sIG9yIG5vdC4gIFRodXMgdGhlIGZpZWxkIGlzIHVubmVjZXNzYXJ5OworICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiB0aGUgY29sbGVjdG9yIGRhdGEgc3RydWN0dXJlcy4KKyAgICAgIC8vIFdlIGRvIG5lZWQgYSBmaW5hbGl6YXRpb24gcHJvY2VkdXJlIHRvIGJlIGludm9rZWQgYnkgdGhlCisgICAgICAvLyBjb2xsZWN0b3IuCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfZm5fZmluYWxpemF0aW9uX3Byb2Modm9pZCAqIF9fdHJlZSwgdm9pZCAqKQorICAgICAgeyBkZWxldGUgKChfUm9wZV9Sb3BlRnVuY3Rpb24gKilfX3RyZWUpIC0+IF9NX2ZuOyB9CisjZW5kaWYKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX3JlcF9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKKyAgICAgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBfUm9wZV9Sb3BlRnVuY3Rpb24oY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2YsIHNpemVfdCBfX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9fZCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4oX19kZXRhaWw6Ol9TX2Z1bmN0aW9uLCAwLCB0cnVlLCBfX3NpemUsIF9fYSkKKwksIF9NX2ZuKF9fZikKKyNpZm5kZWYgX19HQworCSwgX01fZGVsZXRlX3doZW5fZG9uZShfX2QpCisjZW5kaWYKKyAgICAgIHsKKyNpZmRlZiBfX0dDCisJaWYgKF9fZCkKKwkgIHsKKwkgICAgR0NfUkVHSVNURVJfRklOQUxJWkVSKHRoaXMsIF9Sb3BlX1JvcGVGdW5jdGlvbjo6CisJCQkJICBfU19mbl9maW5hbGl6YXRpb25fcHJvYywgMCwgMCwgMCk7CisJICB9CisjZW5kaWYKKyAgICAgIH0KKyNpZm5kZWYgX19HQworICAgICAgfl9Sb3BlX1JvcGVGdW5jdGlvbigpIHRocm93KCkKKyAgICAgIHsKKwl0aGlzLT5fTV9mcmVlX2Nfc3RyaW5nKCk7CisJaWYgKF9NX2RlbGV0ZV93aGVuX2RvbmUpCisJICBkZWxldGUgX01fZm47CisgICAgICB9CisjIGVuZGlmCisgICAgcHJvdGVjdGVkOgorICAgICAgX1JvcGVfUm9wZUZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX1JvcGVGdW5jdGlvbiYpOworCisgICAgICBfUm9wZV9Sb3BlRnVuY3Rpb24oY29uc3QgX1JvcGVfUm9wZUZ1bmN0aW9uJik7CisgICAgfTsKKyAgLy8gU3Vic3RyaW5nIHJlc3VsdHMgYXJlIHVzdWFsbHkgcmVwcmVzZW50ZWQgdXNpbmcganVzdAorICAvLyBjb25jYXRlbmF0aW9uIG5vZGVzLiAgQnV0IGluIHRoZSBjYXNlIG9mIHZlcnkgbG9uZyBmbGF0IHJvcGVzCisgIC8vIG9yIHJvcGVzIHdpdGggYSBmdW5jdGlvbmFsIHJlcHJlc2VudGF0aW9uIHRoYXQgaXNuJ3QgcHJhY3RpY2FsLgorICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJlcHJlc2VudCB0aGUgX19yZXN1bHQgYXMgYSBzcGVjaWFsIGNhc2Ugb2YKKyAgLy8gUm9wZUZ1bmN0aW9uLCB3aG9zZSBjaGFyX3Byb2R1Y2VyIHBvaW50cyBiYWNrIHRvIHRoZSByb3BlIGl0c2VsZi4KKyAgLy8gSW4gYWxsIGNhc2VzIGV4Y2VwdCByZXBlYXRlZCBzdWJzdHJpbmcgb3BlcmF0aW9ucyBhbmQKKyAgLy8gZGVhbGxvY2F0aW9uLCB3ZSB0cmVhdCB0aGUgX19yZXN1bHQgYXMgYSBSb3BlRnVuY3Rpb24uCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9Sb3BlU3Vic3RyaW5nCisgICAgOiBwdWJsaWMgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiwKKyAgICAgIHB1YmxpYyBjaGFyX3Byb2R1Y2VyPF9DaGFyVD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gWFhYIHRoaXMgd2hvbGUgY2xhc3Mgc2hvdWxkIGJlIHJld3JpdHRlbi4KKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULF9BbGxvYz4qIF9NX2Jhc2U7ICAgICAgLy8gbm90IDAKKyAgICAgIHNpemVfdCBfTV9zdGFydDsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBvcGVyYXRvcigpKHNpemVfdCBfX3N0YXJ0X3Bvcywgc2l6ZV90IF9fcmVxX2xlbiwKKwkJIF9DaGFyVCogX19idWZmZXIpCisgICAgICB7CisgICAgICAgIHN3aXRjaChfTV9iYXNlLT5fTV90YWcpCisJICB7CisJICBjYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwkgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICB7CisJICAgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0KKwkJKChfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULF9BbGxvYz4qKV9NX2Jhc2UpLT5fTV9mbjsKKwkgICAgICAoKl9fZm4pKF9fc3RhcnRfcG9zICsgX01fc3RhcnQsIF9fcmVxX2xlbiwgX19idWZmZXIpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgeworCSAgICAgIF9fR0NfQ09OU1QgX0NoYXJUKiBfX3MgPQorCQkoKF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCxfQWxsb2M+KilfTV9iYXNlKS0+X01fZGF0YTsKKwkgICAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfX3MgKyBfX3N0YXJ0X3BvcyArIF9NX3N0YXJ0LCBfX3JlcV9sZW4sCisJCQkJICAgX19idWZmZXIpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfcmVwX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZQorICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgX1JvcGVfUm9wZVN1YnN0cmluZyhfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX19iLCBzaXplX3QgX19zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgX19sLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+KHRoaXMsIF9fbCwgZmFsc2UsIF9fYSksCisgICAgICAgIGNoYXJfcHJvZHVjZXI8X0NoYXJUPigpLCBfTV9iYXNlKF9fYiksIF9NX3N0YXJ0KF9fcykKKyAgICAgIHsKKyNpZm5kZWYgX19HQworCV9NX2Jhc2UtPl9NX3JlZl9ub25uaWwoKTsKKyNlbmRpZgorICAgICAgICB0aGlzLT5fTV90YWcgPSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm47CisgICAgICB9CisgICAgdmlydHVhbCB+X1JvcGVfUm9wZVN1YnN0cmluZygpIHRocm93KCkKKyAgICAgIHsKKyNpZm5kZWYgX19HQworCV9NX2Jhc2UtPl9NX3VucmVmX25vbm5pbCgpOworCS8vIF9NX2ZyZWVfY19zdHJpbmcoKTsgIC0tIGRvbmUgYnkgcGFyZW50IGNsYXNzCisjZW5kaWYKKyAgICAgIH0KKyAgICB9OworCisgIC8vIFNlbGYtZGVzdHJ1Y3RpbmcgcG9pbnRlcnMgdG8gUm9wZV9yZXAuCisgIC8vIFRoZXNlIGFyZSBub3QgY29udmVudGlvbmFsIHNtYXJ0IHBvaW50ZXJzLiAgVGhlaXIKKyAgLy8gb25seSBwdXJwb3NlIGluIGxpZmUgaXMgdG8gZW5zdXJlIHRoYXQgdW5yZWYgaXMgY2FsbGVkCisgIC8vIG9uIHRoZSBwb2ludGVyIGVpdGhlciBhdCBub3JtYWwgZXhpdCBvciBpZiBhbiBleGNlcHRpb24KKyAgLy8gaXMgcmFpc2VkLiAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvCisgIC8vIGFkanVzdCByZWZlcmVuY2UgY291bnRzIHdoZW4gdGhlc2UgcG9pbnRlcnMgYXJlIGluaXRpYWxpemVkCisgIC8vIG9yIGFzc2lnbmVkIHRvLiAgKFRoaXMgY29udmVudGlvbiBzaWduaWZpY2FudGx5IHJlZHVjZXMKKyAgLy8gdGhlIG51bWJlciBvZiBwb3RlbnRpYWxseSBleHBlbnNpdmUgcmVmZXJlbmNlIGNvdW50CisgIC8vIHVwZGF0ZXMuKQorI2lmbmRlZiBfX0dDCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHN0cnVjdCBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cgorICAgIHsKKyAgICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfTV9wdHI7CisKKyAgICAgIH5fUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpCisgICAgICB7IF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjpfU191bnJlZihfTV9wdHIpOyB9CisjaWZkZWYgX19FWENFUFRJT05TCisgICAgICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpIDogX01fcHRyKDApIHsgfTsKKyNlbHNlCisgICAgICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cigpIHsgfTsKKyNlbmRpZgorICAgICAgX1JvcGVfc2VsZl9kZXN0cnVjdF9wdHIoX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9fcCkKKyAgICAgIDogX01fcHRyKF9fcCkgeyB9CisgICAgCisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiYKKyAgICAgIG9wZXJhdG9yKigpCisgICAgICB7IHJldHVybiAqX01fcHRyOyB9CisgICAgCisgICAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPioKKyAgICAgIG9wZXJhdG9yLT4oKQorICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisgICAgCisgICAgICBvcGVyYXRvciBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiooKQorICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisgICAgCisgICAgICBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0ciYKKyAgICAgIG9wZXJhdG9yPShfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiogX194KQorICAgICAgeyBfTV9wdHIgPSBfX3g7IHJldHVybiAqdGhpczsgfQorICAgIH07CisjZW5kaWYKKworICAvLyBEZXJlZmVyZW5jaW5nIGEgbm9uY29uc3QgaXRlcmF0b3IgaGFzIHRvIHJldHVybiBzb21ldGhpbmcKKyAgLy8gdGhhdCBiZWhhdmVzIGFsbW9zdCBsaWtlIGEgcmVmZXJlbmNlLiAgSXQncyBub3QgcG9zc2libGUgdG8KKyAgLy8gcmV0dXJuIGFuIGFjdHVhbCByZWZlcmVuY2Ugc2luY2UgYXNzaWdubWVudCByZXF1aXJlcyBleHRyYQorICAvLyB3b3JrLiAgQW5kIHdlIHdvdWxkIGdldCBpbnRvIHRoZSBzYW1lIHByb2JsZW1zIGFzIHdpdGggdGhlCisgIC8vIENEMiB2ZXJzaW9uIG9mIGJhc2ljX3N0cmluZy4KKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHkKKyAgICB7CisgICAgICBmcmllbmQgY2xhc3Mgcm9wZTxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjsKKyNpZmRlZiBfX0dDCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+KiBfU2VsZl9kZXN0cnVjdF9wdHI7CisjZWxzZQorICAgICAgdHlwZWRlZiBfUm9wZV9zZWxmX2Rlc3RydWN0X3B0cjxfQ2hhclQsIF9BbGxvYz4gX1NlbGZfZGVzdHJ1Y3RfcHRyOworI2VuZGlmCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOworICAgICAgdHlwZWRlZiByb3BlPF9DaGFyVCwgX0FsbG9jPiBfTXlfcm9wZTsKKyAgICAgIHNpemVfdCBfTV9wb3M7CisgICAgICBfQ2hhclQgX01fY3VycmVudDsKKyAgICAgIGJvb2wgX01fY3VycmVudF92YWxpZDsKKyAgICAgIF9NeV9yb3BlKiBfTV9yb290OyAgICAgLy8gVGhlIHdob2xlIHJvcGUuCisgICAgcHVibGljOgorICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHkoX015X3JvcGUqIF9fciwgc2l6ZV90IF9fcCkKKyAgICAgIDogIF9NX3BvcyhfX3ApLCBfTV9jdXJyZW50KCksIF9NX2N1cnJlbnRfdmFsaWQoZmFsc2UpLCBfTV9yb290KF9fcikgeyB9CisKKyAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5KGNvbnN0IF9Sb3BlX2NoYXJfcmVmX3Byb3h5JiBfX3gpCisgICAgICA6IF9NX3BvcyhfX3guX01fcG9zKSwgX01fY3VycmVudChfX3guX01fY3VycmVudCksIAorCV9NX2N1cnJlbnRfdmFsaWQoZmFsc2UpLCBfTV9yb290KF9feC5fTV9yb290KSB7IH0KKworICAgICAgLy8gRG9uJ3QgcHJlc2VydmUgY2FjaGUgaWYgdGhlIHJlZmVyZW5jZSBjYW4gb3V0bGl2ZSB0aGUKKyAgICAgIC8vIGV4cHJlc3Npb24uICBXZSBjbGFpbSB0aGF0J3Mgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FsbGluZworICAgICAgLy8gYSBjb3B5IGNvbnN0cnVjdG9yIG9yIGdlbmVyYXRpbmcgcmVmZXJlbmNlIHRvIGEgcHJveHkKKyAgICAgIC8vIHJlZmVyZW5jZS4gIFdlIGRlY2xhcmUgdGhlIGxhdHRlciB0byBoYXZlIHVuZGVmaW5lZCBzZW1hbnRpY3MuCisgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eShfTXlfcm9wZSogX19yLCBzaXplX3QgX19wLCBfQ2hhclQgX19jKQorICAgICAgOiBfTV9wb3MoX19wKSwgX01fY3VycmVudChfX2MpLCBfTV9jdXJyZW50X3ZhbGlkKHRydWUpLCBfTV9yb290KF9fcikgeyB9CisKKyAgICAgIGlubGluZSBvcGVyYXRvciBfQ2hhclQgKCkgY29uc3Q7CisKKyAgICAgIF9Sb3BlX2NoYXJfcmVmX3Byb3h5JgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpOworICAgIAorICAgICAgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+IG9wZXJhdG9yJigpIGNvbnN0OworICAgICAgCisgICAgICBfUm9wZV9jaGFyX3JlZl9wcm94eSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9jaGFyX3JlZl9wcm94eSYgX19jKQorICAgICAgeyByZXR1cm4gb3BlcmF0b3I9KChfQ2hhclQpX19jKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19hLAorCSBfUm9wZV9jaGFyX3JlZl9wcm94eSA8X0NoYXJULCBfX0FsbG9jID4gX19iKQorICAgIHsKKyAgICAgIF9DaGFyVCBfX3RtcCA9IF9fYTsKKyAgICAgIF9fYSA9IF9fYjsKKyAgICAgIF9fYiA9IF9fdG1wOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jaGFyX3B0cl9wcm94eQorICAgIHsKKyAgICAgIC8vIFhYWCB0aGlzIGNsYXNzIHNob3VsZCBiZSByZXdyaXR0ZW4uCisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OworICAgICAgc2l6ZV90IF9NX3BvczsKKyAgICAgIHJvcGU8X0NoYXJULF9BbGxvYz4qIF9NX3Jvb3Q7ICAgICAvLyBUaGUgd2hvbGUgcm9wZS4KKyAgICBwdWJsaWM6CisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eShjb25zdCBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsX0FsbG9jPiYgX194KQorICAgICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eSYgX194KQorICAgICAgOiBfTV9wb3MoX194Ll9NX3BvcyksIF9NX3Jvb3QoX194Ll9NX3Jvb3QpIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eSgpIHsgfQorICAgICAgCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eShfQ2hhclQqIF9feCkKKyAgICAgIDogX01fcm9vdCgwKSwgX01fcG9zKDApIHsgfQorCisgICAgICBfUm9wZV9jaGFyX3B0cl9wcm94eSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eSYgX194KQorICAgICAgeworICAgICAgICBfTV9wb3MgPSBfX3guX01fcG9zOworICAgICAgICBfTV9yb290ID0gX194Ll9NX3Jvb3Q7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIGJvb2wKKyAgICAgICAgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQyLCBfQWxsb2MyPiYgX195KTsKKworICAgICAgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+IG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdCwgX01fcG9zKTsgfQorICAgIH07CisKKyAgLy8gUm9wZSBpdGVyYXRvcnM6CisgIC8vIFVubGlrZSBpbiB0aGUgQyB2ZXJzaW9uLCB3ZSBjYWNoZSBvbmx5IHBhcnQgb2YgdGhlIHN0YWNrCisgIC8vIGZvciByb3BlIGl0ZXJhdG9ycywgc2luY2UgdGhleSBtdXN0IGJlIGVmZmljaWVudGx5IGNvcHlhYmxlLgorICAvLyBXaGVuIHdlIHJ1biBvdXQgb2YgY2FjaGUsIHdlIGhhdmUgdG8gcmVjb25zdHJ1Y3QgdGhlIGl0ZXJhdG9yCisgIC8vIHZhbHVlLgorICAvLyBQb2ludGVycyBmcm9tIGl0ZXJhdG9ycyBhcmUgbm90IGluY2x1ZGVkIGluIHJlZmVyZW5jZSBjb3VudHMuCisgIC8vIEl0ZXJhdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB0aHJlYWQgcHJpdmF0ZS4gIFJvcGVzIGNhbgorICAvLyBiZSBzaGFyZWQuCisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9pdGVyYXRvcl9iYXNlCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfQ2hhclQ+CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULCBfQWxsb2M+OworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0FsbG9jIF9hbGxvY2F0b3JfdHlwZTsgLy8gdXNlZCBpbiBfUm9wZV9yb3RhdGUsIFZDKysgd29ya2Fyb3VuZAorICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgICAgIC8vIEJvcmxhbmQgZG9lc24ndCB3YW50IHRoaXMgdG8gYmUgcHJvdGVjdGVkLgorICAgIHByb3RlY3RlZDoKKyAgICAgIGVudW0geyBfU19wYXRoX2NhY2hlX2xlbiA9IDQgfTsgLy8gTXVzdCBiZSA8PSA5LgorICAgICAgZW51bSB7IF9TX2l0ZXJhdG9yX2J1Zl9sZW4gPSAxNSB9OworICAgICAgc2l6ZV90IF9NX2N1cnJlbnRfcG9zOworICAgICAgX1JvcGVSZXAqIF9NX3Jvb3Q7ICAgICAvLyBUaGUgd2hvbGUgcm9wZS4KKyAgICAgIHNpemVfdCBfTV9sZWFmX3BvczsgICAgLy8gU3RhcnRpbmcgcG9zaXRpb24gZm9yIGN1cnJlbnQgbGVhZgorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2J1Zl9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIHBvc3NpYmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5pbmcgY3VycmVudCBjaGFyLgorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2J1Zl9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gY3VycmVudCBjaGFyIGluIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIT0gMCA9PT4gYnVmZmVyIHZhbGlkLgorICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9NX2J1Zl9lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBwYXN0IF9fbGFzdCB2YWxpZCBjaGFyIGluIGJ1ZmZlci4KKyAgICAgIC8vIFdoYXQgZm9sbG93cyBpcyB0aGUgcGF0aCBjYWNoZS4gIFdlIGdvIG91dCBvZiBvdXIKKyAgICAgIC8vIHdheSB0byBtYWtlIHRoaXMgY29tcGFjdC4KKyAgICAgIC8vIFBhdGhfZW5kIGNvbnRhaW5zIHRoZSBib3R0b20gc2VjdGlvbiBvZiB0aGUgcGF0aCBmcm9tCisgICAgICAvLyB0aGUgcm9vdCB0byB0aGUgY3VycmVudCBsZWFmLgorICAgICAgY29uc3QgX1JvcGVSZXAqIF9NX3BhdGhfZW5kW19TX3BhdGhfY2FjaGVfbGVuXTsKKyAgICAgIGludCBfTV9sZWFmX2luZGV4OyAgICAgLy8gTGFzdCB2YWxpZCBfX3BvcyBpbiBwYXRoX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX01fcGF0aF9lbmRbMF0gLi4uIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXgtMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gY29uY2F0ZW5hdGlvbiBub2Rlcy4KKyAgICAgIHVuc2lnbmVkIGNoYXIgX01fcGF0aF9kaXJlY3Rpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocGF0aF9kaXJlY3Rpb25zID4+IF9faSkgJiAxIGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWZmIHdlIGdvdCBmcm9tIF9NX3BhdGhfZW5kW2xlYWZfaW5kZXggLSBfX2kgLSAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBfTV9wYXRoX2VuZFtsZWFmX2luZGV4IC0gX19pXSBieSBnb2luZyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gX19yaWdodC4gQXNzdW1lcyBwYXRoX2NhY2hlX2xlbiA8PSA5LgorICAgICAgX0NoYXJUIF9NX3RtcF9idWZbX1NfaXRlcmF0b3JfYnVmX2xlbl07CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydCBidWZmZXIgZm9yIHN1cnJvdW5kaW5nIGNoYXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgcHJpbWFyaWx5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm9wZUZ1bmN0aW9ucy4gIFdlIHB1dCB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHRvIGF2b2lkIGxvY2tpbmcgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXRocmVhZGVkIGNhc2UuCisgICAgICAvLyBUaGUgY2FjaGVkIHBhdGggaXMgZ2VuZXJhbGx5IGFzc3VtZWQgdG8gYmUgdmFsaWQKKyAgICAgIC8vIG9ubHkgaWYgdGhlIGJ1ZmZlciBpcyB2YWxpZC4KKyAgICAgIHN0YXRpYyB2b2lkIF9TX3NldGJ1ZihfUm9wZV9pdGVyYXRvcl9iYXNlJiBfX3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBidWZmZXIgY29udGVudHMgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGNhY2hlLgorICAgICAgc3RhdGljIHZvaWQgX1Nfc2V0Y2FjaGUoX1JvcGVfaXRlcmF0b3JfYmFzZSYgX194KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYnVmZmVyIGNvbnRlbnRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggY2FjaGUuCisgICAgICBzdGF0aWMgdm9pZCBfU19zZXRjYWNoZV9mb3JfaW5jcihfUm9wZV9pdGVyYXRvcl9iYXNlJiBfX3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIGFib3ZlLCBidXQgYXNzdW1lcyBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgdmFsaWQgZm9yIHByZXZpb3VzIHBvc24uCisgICAgICBfUm9wZV9pdGVyYXRvcl9iYXNlKCkgeyB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoX1JvcGVSZXAqIF9fcm9vdCwgc2l6ZV90IF9fcG9zKQorICAgICAgOiBfTV9jdXJyZW50X3BvcyhfX3BvcyksIF9NX3Jvb3QoX19yb290KSwgX01fYnVmX3B0cigwKSB7IH0KKworICAgICAgdm9pZCBfTV9pbmNyKHNpemVfdCBfX24pOworICAgICAgdm9pZCBfTV9kZWNyKHNpemVfdCBfX24pOworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdAorICAgICAgaW5kZXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fY3VycmVudF9wb3M7IH0KKyAgICAKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2UoY29uc3QgX1JvcGVfaXRlcmF0b3JfYmFzZSYgX194KQorICAgICAgeworICAgICAgICBpZiAoMCAhPSBfX3guX01fYnVmX3B0cikKKwkgICp0aGlzID0gX194OworCWVsc2UKKwkgIHsKKyAgICAgICAgICAgIF9NX2N1cnJlbnRfcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgX01fcm9vdCA9IF9feC5fTV9yb290OworICAgICAgICAgICAgX01fYnVmX3B0ciA9IDA7CisJICB9CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9pdGVyYXRvcjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBfUm9wZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgICAgZnJpZW5kIGNsYXNzIHJvcGU8X0NoYXJULCBfQWxsb2M+OworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4gX1JvcGVSZXA7CisgICAgICAvLyBUaGUgb25lIGZyb20gdGhlIGJhc2UgY2xhc3MgbWF5IG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlLgorICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVSZXAqIF9fcm9vdCwgc2l6ZV90IF9fcG9zKQorICAgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPihjb25zdF9jYXN0PF9Sb3BlUmVwKj4oX19yb290KSwKKwkJCQkJICAgIF9fcG9zKQorICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbm9uY29uc3QgaXRlcmF0b3JzIG1vZGlmeSByb290IHJlZiBjb3VudAorICAgICAgeyB9CisgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIHJlZmVyZW5jZTsgICAvLyBSZWFsbHkgYSB2YWx1ZS4gIFJldHVybmluZyBhIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvdWxkIGJlIGEgbWVzcywgc2luY2UgaXQgd291bGQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgICAgdHlwZWRlZiBjb25zdCBfQ2hhclQqIHBvaW50ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvcigpIHsgfTsKKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3ImIF9feCkKKyAgICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3gpIHsgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvcihjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPiYgX194KTsKKyAgICAKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IsIHNpemVfdCBfX3BvcykKKyAgICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3IuX01fdHJlZV9wdHIsIF9fcG9zKSB7IH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3ImIF9feCkKKyAgICAgIHsKKyAgICAgICAgaWYgKDAgIT0gX194Ll9NX2J1Zl9wdHIpCisJICAqKHN0YXRpY19jYXN0PF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+Kj4odGhpcykpID0gX194OworCWVsc2UKKwkgIHsKKyAgICAgICAgICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zID0gX194Ll9NX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgdGhpcy0+X01fcm9vdCA9IF9feC5fTV9yb290OworICAgICAgICAgICAgdGhpcy0+X01fYnVmX3B0ciA9IDA7CisJICB9CisgICAgICAgIHJldHVybigqdGhpcyk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsKKyAgICAgICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikKKwkgIF9TX3NldGNhY2hlKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzLT5fTV9idWZfcHRyOworICAgICAgfQorCisgICAgICAvLyBXaXRob3V0IHRoaXMgY29uc3QgdmVyc2lvbiwgUm9wZSBpdGVyYXRvcnMgZG8gbm90IG1lZXQgdGhlCisgICAgICAvLyByZXF1aXJlbWVudHMgb2YgYW4gSW5wdXQgSXRlcmF0b3IuCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuICpjb25zdF9jYXN0PF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJj4oKnRoaXMpOworICAgICAgfQorCisgICAgICBfUm9wZV9jb25zdF9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19uZXh0OworICAgICAgICBpZiAoMCAhPSB0aGlzLT5fTV9idWZfcHRyCisJICAgICYmIChfX25leHQgPSB0aGlzLT5fTV9idWZfcHRyICsgMSkgPCB0aGlzLT5fTV9idWZfZW5kKQorCSAgeworICAgICAgICAgICAgdGhpcy0+X01fYnVmX3B0ciA9IF9fbmV4dDsKKyAgICAgICAgICAgICsrdGhpcy0+X01fY3VycmVudF9wb3M7CisJICB9CisJZWxzZQorCSAgdGhpcy0+X01faW5jcigxKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrPShwdHJkaWZmX3QgX19uKQorICAgICAgeworICAgICAgICBpZiAoX19uID49IDApCisJICB0aGlzLT5fTV9pbmNyKF9fbik7CisJZWxzZQorCSAgdGhpcy0+X01fZGVjcigtX19uKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisgICAgICAgIHRoaXMtPl9NX2RlY3IoMSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvci09KHB0cmRpZmZfdCBfX24pCisgICAgICB7CisgICAgICAgIGlmIChfX24gPj0gMCkKKwkgIHRoaXMtPl9NX2RlY3IoX19uKTsKKwllbHNlCisJICB0aGlzLT5fTV9pbmNyKC1fX24pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeworICAgICAgICBzaXplX3QgX19vbGRfcG9zID0gdGhpcy0+X01fY3VycmVudF9wb3M7CisgICAgICAgIHRoaXMtPl9NX2luY3IoMSk7CisgICAgICAgIHJldHVybiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsX0FsbG9jPih0aGlzLT5fTV9yb290LCBfX29sZF9wb3MpOworICAgICAgICAvLyBUaGlzIG1ha2VzIGEgc3Vic2VxdWVudCBkZXJlZmVyZW5jZSBleHBlbnNpdmUuCisgICAgICAgIC8vIFBlcmhhcHMgd2Ugc2hvdWxkIGluc3RlYWQgY29weSB0aGUgaXRlcmF0b3IKKyAgICAgICAgLy8gaWYgaXQgaGFzIGEgdmFsaWQgY2FjaGU/CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgICAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgICAgICByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4odGhpcy0+X01fcm9vdCwgX19vbGRfcG9zKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsCisJCSAgcHRyZGlmZl90IF9fbik7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwKKwkJICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194KTsKKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdCBfX24pCisgICAgICB7IHJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X1NfZmV0Y2godGhpcy0+X01fcm9vdCwKKwkJCQkJICAgICAgdGhpcy0+X01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feSk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcHRyZGlmZl90CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY2xhc3MgX1JvcGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyByb3BlPF9DaGFyVCwgX0FsbG9jPjsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCBfUm9wZVJlcDsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+KiBfTV9yb290X3JvcGU7CisKKyAgICAgIC8vIHJvb3QgaXMgdHJlYXRlZCBhcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoaXMsIGFuZCBpcyB1c2VkIHRvCisgICAgICAvLyBkZXRlY3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyByb3BlLgorCisgICAgICAvLyBSb290IGlzIGluY2x1ZGVkIGluIHRoZSByZWZlcmVuY2UgY291bnQuICBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IGNoYW5nZXMgcmVsaWFibHkuICBVbmZvcnR1bmF0ZWx5LCBpdAorICAgICAgLy8gcmVxdWlyZXMgY2FyZWZ1bCBib29ra2VlcGluZyBmb3IgdGhlIG5vbkdDIGNhc2UuCisgICAgICBfUm9wZV9pdGVyYXRvcihyb3BlPF9DaGFyVCwgX0FsbG9jPiogX19yLCBzaXplX3QgX19wb3MpCisgICAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KF9fci0+X01fdHJlZV9wdHIsIF9fcG9zKSwKKyAgICAgICAgX01fcm9vdF9yb3BlKF9fcikKKyAgICAgIHsgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgICAgICAgaWYgKCEoX19yIC0+IGVtcHR5KCkpKQorCSAgX1Nfc2V0Y2FjaGUoKnRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkIF9NX2NoZWNrKCk7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4gIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+KiBwb2ludGVyOworCisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiYKKyAgICAgIGNvbnRhaW5lcigpCisgICAgICB7IHJldHVybiAqX01fcm9vdF9yb3BlOyB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01fcm9vdCA9IDA7ICAvLyBOZWVkZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KKyAgICAgIH07CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+KF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fcm9vdF9yb3BlID0gX194Ll9NX3Jvb3Rfcm9wZTsKKyAgICAgICAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKTsKKworICAgICAgfl9Sb3BlX2l0ZXJhdG9yKCkKKyAgICAgIHsgX1JvcGVSZXA6Ol9TX3VucmVmKHRoaXMtPl9NX3Jvb3QpOyB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yJiBfX3gpCisgICAgICB7CisgICAgICAgIF9Sb3BlUmVwKiBfX29sZCA9IHRoaXMtPl9NX3Jvb3Q7CisJCisgICAgICAgIF9Sb3BlUmVwOjpfU19yZWYoX194Ll9NX3Jvb3QpOworICAgICAgICBpZiAoMCAhPSBfX3guX01fYnVmX3B0cikKKwkgIHsKKyAgICAgICAgICAgIF9NX3Jvb3Rfcm9wZSA9IF9feC5fTV9yb290X3JvcGU7CisgICAgICAgICAgICAqKHN0YXRpY19jYXN0PF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+Kj4odGhpcykpID0gX194OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgdGhpcy0+X01fY3VycmVudF9wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisgICAgICAgICAgICB0aGlzLT5fTV9yb290ID0gX194Ll9NX3Jvb3Q7CisgICAgICAgICAgICBfTV9yb290X3JvcGUgPSBfX3guX01fcm9vdF9yb3BlOworICAgICAgICAgICAgdGhpcy0+X01fYnVmX3B0ciA9IDA7CisJICB9CisgICAgICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7CisgICAgICAgIHJldHVybigqdGhpcyk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsKKyAgICAgICAgX01fY2hlY2soKTsKKyAgICAgICAgaWYgKDAgPT0gdGhpcy0+X01fYnVmX3B0cikKKwkgIHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdF9yb3BlLAorCQkJCQkJICAgICAgdGhpcy0+X01fY3VycmVudF9wb3MpOworCWVsc2UKKwkgIHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdF9yb3BlLAorCQkJCQkJICAgICAgdGhpcy0+X01fY3VycmVudF9wb3MsCisJCQkJCQkgICAgICAqdGhpcy0+X01fYnVmX3B0cik7CisgICAgICB9CisKKyAgICAgIC8vIFNlZSBhYm92ZSBjb21tZW50LgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeworCXJldHVybiAqY29uc3RfY2FzdDxfUm9wZV9pdGVyYXRvciY+KCp0aGlzKTsKKyAgICAgIH0KKworICAgICAgX1JvcGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKyAgICAgICAgdGhpcy0+X01faW5jcigxKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yKz0ocHRyZGlmZl90IF9fbikKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fbiA+PSAwKQorCSAgdGhpcy0+X01faW5jcihfX24pOworCWVsc2UKKwkgIHRoaXMtPl9NX2RlY3IoLV9fbik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvciYKKyAgICAgIG9wZXJhdG9yLS0oKQorICAgICAgeworICAgICAgICB0aGlzLT5fTV9kZWNyKDEpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3ItPShwdHJkaWZmX3QgX19uKQorICAgICAgeworICAgICAgICBpZiAoX19uID49IDApCisJICB0aGlzLT5fTV9kZWNyKF9fbik7CisJZWxzZQorCSAgdGhpcy0+X01faW5jcigtX19uKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9Sb3BlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90IF9fb2xkX3BvcyA9IHRoaXMtPl9NX2N1cnJlbnRfcG9zOworICAgICAgICB0aGlzLT5fTV9pbmNyKDEpOworICAgICAgICByZXR1cm4gX1JvcGVfaXRlcmF0b3I8X0NoYXJULF9BbGxvYz4oX01fcm9vdF9yb3BlLCBfX29sZF9wb3MpOworICAgICAgfQorCisgICAgICBfUm9wZV9pdGVyYXRvcgorICAgICAgb3BlcmF0b3ItLShpbnQpCisgICAgICB7CisgICAgICAgIHNpemVfdCBfX29sZF9wb3MgPSB0aGlzLT5fTV9jdXJyZW50X3BvczsKKyAgICAgICAgdGhpcy0+X01fZGVjcigxKTsKKyAgICAgICAgcmV0dXJuIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCxfQWxsb2M+KF9NX3Jvb3Rfcm9wZSwgX19vbGRfcG9zKTsKKyAgICAgIH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHB0cmRpZmZfdCBfX24pCisgICAgICB7IHJldHVybiBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4oX01fcm9vdF9yb3BlLAorCQkJCQkJICAgIHRoaXMtPl9NX2N1cnJlbnRfcG9zCisJCQkJCQkgICAgKyBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feCwKKwkJICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4mIF9feSk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVDIsIGNsYXNzIF9BbGxvYzI+CisgICAgICAgIGZyaWVuZCBib29sCisgICAgICAgIG9wZXJhdG9yPChjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcHRyZGlmZl90CisgICAgICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQyLCBfQWxsb2MyPiYgX194LAorCQkgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3kpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gsIHB0cmRpZmZfdCBfX24pOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgX1JvcGVfaXRlcmF0b3I8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKHB0cmRpZmZfdCBfX24sIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVDIsIF9BbGxvYzI+JiBfX3gpOworICAgIH07CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9Sb3BlX2Jhc2UKKyAgICA6IHB1YmxpYyBfQWxsb2MKKyAgICB7CisgICAgICB0eXBlZGVmIF9BbGxvYyBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9BbGxvYyo+KHRoaXMpOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X0FsbG9jKj4odGhpcyk7IH0KKworICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfQWxsb2MqPih0aGlzKTsgfQorCisgICAgICB0eXBlZGVmIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+IF9Sb3BlUmVwOworICAgICAgLy8gVGhlIG9uZSBpbiBfQmFzZSBtYXkgbm90IGJlIHZpc2libGUgZHVlIHRvIHRlbXBsYXRlIHJ1bGVzLgorCisgICAgICBfUm9wZV9iYXNlKF9Sb3BlUmVwKiBfX3QsIGNvbnN0IGFsbG9jYXRvcl90eXBlJikKKyAgICAgIDogX01fdHJlZV9wdHIoX190KSB7IH0KKworICAgICAgX1JvcGVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYpIHsgfQorCisgICAgICAvLyBUaGUgb25seSBkYXRhIG1lbWJlciBvZiBhIHJvcGU6CisgICAgICBfUm9wZVJlcCAqX01fdHJlZV9wdHI7CisKKyNkZWZpbmUgX19ST1BFX0RFRklORV9BTExPQyhfVHAsIF9fbmFtZSkgXAorICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFwKKyAgICAgICAgICBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfVHA+OjpvdGhlciBfX25hbWUjI0FsbG9jOyBcCisgICAgICAgIHN0YXRpYyBfVHAqIF9fbmFtZSMjX2FsbG9jYXRlKHNpemVfdCBfX24pIFwKKyAgICAgICAgICB7IHJldHVybiBfX25hbWUjI0FsbG9jKCkuYWxsb2NhdGUoX19uKTsgfSBcCisgICAgICAgIHN0YXRpYyB2b2lkIF9fbmFtZSMjX2RlYWxsb2NhdGUoX1RwICpfX3AsIHNpemVfdCBfX24pIFwKKyAgICAgICAgICB7IF9fbmFtZSMjQWxsb2MoKS5kZWFsbG9jYXRlKF9fcCwgX19uKTsgfQorICAgICAgX19ST1BFX0RFRklORV9BTExPQ1MoX0FsbG9jKQorI3VuZGVmIF9fUk9QRV9ERUZJTkVfQUxMT0MKKworCXByb3RlY3RlZDoKKyAgICAgIF9Sb3BlX2Jhc2UmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1JvcGVfYmFzZSYpOworICAgICAgCisgICAgICBfUm9wZV9iYXNlKGNvbnN0IF9Sb3BlX2Jhc2UmKTsKKyAgICB9OworCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyByb3BlIDogcHVibGljIF9Sb3BlX2Jhc2U8X0NoYXJULCBfQWxsb2M+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIF9DaGFyVCBjb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9DaGFyVCogY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+IGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4gY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiBwb2ludGVyOworCisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz47CisgICAgICBmcmllbmQgY2xhc3MgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+OworICAgICAgZnJpZW5kIGNsYXNzIF9Sb3BlX2NoYXJfcmVmX3Byb3h5PF9DaGFyVCwgX0FsbG9jPjsKKyAgICAgIGZyaWVuZCBzdHJ1Y3QgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz47CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9Sb3BlX2Jhc2U8X0NoYXJULCBfQWxsb2M+IF9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CisgICAgICB1c2luZyBfQmFzZTo6X01fdHJlZV9wdHI7CisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKyAgICAgIHVzaW5nIF9CYXNlOjpfTV9nZXRfYWxsb2NhdG9yOyAgICAgIAorICAgICAgdHlwZWRlZiBfX0dDX0NPTlNUIF9DaGFyVCogX0NzdHJwdHI7CisgICAgICAKKyAgICAgIHN0YXRpYyBfQ2hhclQgX1NfZW1wdHlfY19zdHJbMV07CisgICAgICAKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19pczAoX0NoYXJUIF9fYykKKyAgICAgIHsgcmV0dXJuIF9fYyA9PSBfU19lb3MoKF9DaGFyVCopMCk7IH0KKyAgICAgIAorICAgICAgZW51bSB7IF9TX2NvcHlfbWF4ID0gMjMgfTsKKyAgICAgICAgICAgICAgICAvLyBGb3Igc3RyaW5ncyBzaG9ydGVyIHRoYW4gX1NfY29weV9tYXgsIHdlIGNvcHkgdG8KKyAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZS4KKworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVJlcDsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+IF9Sb3BlQ29uY2F0ZW5hdGlvbjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+IF9Sb3BlTGVhZjsKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZUZ1bmN0aW9uPF9DaGFyVCwgX0FsbG9jPiBfUm9wZUZ1bmN0aW9uOworICAgICAgdHlwZWRlZiBfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPiBfUm9wZVN1YnN0cmluZzsKKworICAgICAgLy8gUmV0cmlldmUgYSBjaGFyYWN0ZXIgYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KKyAgICAgIHN0YXRpYyBfQ2hhclQgX1NfZmV0Y2goX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9fcG9zKTsKKworI2lmbmRlZiBfX0dDCisgICAgICAvLyBPYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KKyAgICAgIC8vIFRoZSBwb2ludGVyIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyLgorICAgICAgLy8gSWYgc3VjaCBhIHBvaW50ZXIgY2Fubm90IGJlIHByb2R1Y2VkLCBhcyBpcyBmcmVxdWVudGx5IHRoZQorICAgICAgLy8gY2FzZSwgMCBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAgLy8gKFJldHVybnMgbm9uemVybyBvbmx5IGlmIGFsbCBub2RlcyBpbiB0aGUgcGF0aCBoYXZlIGEgcmVmY291bnQKKyAgICAgIC8vIG9mIDEuKQorICAgICAgc3RhdGljIF9DaGFyVCogX1NfZmV0Y2hfcHRyKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX3Bvcyk7CisjZW5kaWYKKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2FwcGx5X3RvX3BpZWNlcygvLyBzaG91bGQgYmUgdGVtcGxhdGUgcGFyYW1ldGVyCisJCQkgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+JiBfX2MsCisJCQkgY29uc3QgX1JvcGVSZXAqIF9fciwKKwkJCSBzaXplX3QgX19iZWdpbiwgc2l6ZV90IF9fZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbiBhbmQgZW5kIGFyZSBhc3N1bWVkIHRvIGJlIGluIHJhbmdlLgorCisjaWZuZGVmIF9fR0MKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU191bnJlZihfUm9wZVJlcCogX190KQorICAgICAgeyBfUm9wZVJlcDo6X1NfdW5yZWYoX190KTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfcmVmKF9Sb3BlUmVwKiBfX3QpCisgICAgICB7IF9Sb3BlUmVwOjpfU19yZWYoX190KTsgfQorCisjZWxzZSAvKiBfX0dDICovCisgICAgICBzdGF0aWMgdm9pZCBfU191bnJlZihfUm9wZVJlcCopIHsgfQorICAgICAgc3RhdGljIHZvaWQgX1NfcmVmKF9Sb3BlUmVwKikgeyB9CisjZW5kaWYKKworI2lmZGVmIF9fR0MKKyAgICAgIHR5cGVkZWYgX1JvcGVfUm9wZVJlcDxfQ2hhclQsIF9BbGxvYz4qIF9TZWxmX2Rlc3RydWN0X3B0cjsKKyNlbHNlCisgICAgICB0eXBlZGVmIF9Sb3BlX3NlbGZfZGVzdHJ1Y3RfcHRyPF9DaGFyVCwgX0FsbG9jPiBfU2VsZl9kZXN0cnVjdF9wdHI7CisjZW5kaWYKKworICAgICAgLy8gX1Jlc3VsdCBpcyBjb3VudGVkIGluIHJlZmNvdW50LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKiBfU19zdWJzdHJpbmcoX1JvcGVSZXAqIF9fYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19lbmRwMSk7CisKKyAgICAgIHN0YXRpYyBfUm9wZVJlcCogX1NfY29uY2F0X2NoYXJfaXRlcihfUm9wZVJlcCogX19yLAorCQkJCQkgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgICAvLyBDb25jYXRlbmF0ZSByb3BlIGFuZCBjaGFyIHB0ciwgY29weWluZyBfX3MuCisgICAgICAvLyBTaG91bGQgcmVhbGx5IHRha2UgYW4gYXJiaXRyYXJ5IGl0ZXJhdG9yLgorICAgICAgLy8gUmVzdWx0IGlzIGNvdW50ZWQgaW4gcmVmY291bnQuCisgICAgICBzdGF0aWMgX1JvcGVSZXAqIF9TX2Rlc3RyX2NvbmNhdF9jaGFyX2l0ZXIoX1JvcGVSZXAqIF9fciwKKwkJCQkJCSBjb25zdCBfQ2hhclQqIF9faXRlciwKKwkJCQkJCSBzaXplX3QgX19zbGVuKQorCS8vIEFzIGFib3ZlLCBidXQgb25lIHJlZmVyZW5jZSB0byBfX3IgaXMgYWJvdXQgdG8gYmUKKwkvLyBkZXN0cm95ZWQuICBUaHVzIHRoZSBwaWVjZXMgbWF5IGJlIHJlY3ljbGVkIGlmIGFsbAorCS8vIHJlbGV2YW50IHJlZmVyZW5jZSBjb3VudHMgYXJlIDEuCisjaWZkZWYgX19HQworCS8vIFdlIGNhbid0IHJlYWxseSBkbyBhbnl0aGluZyBzaW5jZSByZWZjb3VudHMgYXJlIHVuYXZhaWxhYmxlLgorICAgICAgeyByZXR1cm4gX1NfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19zbGVuKTsgfQorI2Vsc2UKKyAgICAgIDsKKyNlbmRpZgorCisgICAgICBzdGF0aWMgX1JvcGVSZXAqIF9TX2NvbmNhdChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisgICAgICAvLyBHZW5lcmFsIGNvbmNhdGVuYXRpb24gb24gX1JvcGVSZXAuICBfUmVzdWx0CisgICAgICAvLyBoYXMgcmVmY291bnQgb2YgMS4gIEFkanVzdHMgYXJndW1lbnQgcmVmY291bnRzLgorCisgICBwdWJsaWM6CisgICAgICB2b2lkCisgICAgICBhcHBseV90b19waWVjZXMoc2l6ZV90IF9fYmVnaW4sIHNpemVfdCBfX2VuZCwKKwkJICAgICAgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+JiBfX2MpIGNvbnN0CisgICAgICB7IF9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIHRoaXMtPl9NX3RyZWVfcHRyLCBfX2JlZ2luLCBfX2VuZCk7IH0KKworICAgcHJvdGVjdGVkOgorCisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBfU19yb3VuZGVkX3VwX3NpemUoc2l6ZV90IF9fbikKKyAgICAgIHsgcmV0dXJuIF9Sb3BlTGVhZjo6X1Nfcm91bmRlZF91cF9zaXplKF9fbik7IH0KKworICAgICAgc3RhdGljIHNpemVfdAorICAgICAgX1NfYWxsb2NhdGVkX2NhcGFjaXR5KHNpemVfdCBfX24pCisgICAgICB7CisJaWYgKF9TX2lzX2Jhc2ljX2NoYXJfdHlwZSgoX0NoYXJUKikwKSkKKwkgIHJldHVybiBfU19yb3VuZGVkX3VwX3NpemUoX19uKSAtIDE7CisJZWxzZQorCSAgcmV0dXJuIF9TX3JvdW5kZWRfdXBfc2l6ZShfX24pOworCQorICAgICAgfQorCisgICAgICAvLyBBbGxvY2F0ZSBhbmQgY29uc3RydWN0IGEgUm9wZUxlYWYgdXNpbmcgdGhlIHN1cHBsaWVkIGFsbG9jYXRvcgorICAgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHMgaW5zdGVhZCBvZiBjb3B5aW5nLgorICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX25ld19Sb3BlTGVhZihfX0dDX0NPTlNUIF9DaGFyVCAqX19zLAorCQkgICAgICBzaXplX3QgX19zaXplLCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgeworCV9Sb3BlTGVhZiogX19zcGFjZSA9IHR5cGVuYW1lIF9CYXNlOjpfTEFsbG9jKF9fYSkuYWxsb2NhdGUoMSk7CisJcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZUxlYWYoX19zLCBfX3NpemUsIF9fYSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBfUm9wZUNvbmNhdGVuYXRpb24qCisgICAgICBfU19uZXdfUm9wZUNvbmNhdGVuYXRpb24oX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQsCisJCQkgICAgICAgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZUNvbmNhdGVuYXRpb24qIF9fc3BhY2UgPSB0eXBlbmFtZSBfQmFzZTo6X0NBbGxvYyhfX2EpLmFsbG9jYXRlKDEpOworCXJldHVybiBuZXcoX19zcGFjZSkgX1JvcGVDb25jYXRlbmF0aW9uKF9fbGVmdCwgX19yaWdodCwgX19hKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9Sb3BlRnVuY3Rpb24qCisgICAgICBfU19uZXdfUm9wZUZ1bmN0aW9uKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiogX19mLAorCQkJICBzaXplX3QgX19zaXplLCBib29sIF9fZCwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZUZ1bmN0aW9uKiBfX3NwYWNlID0gdHlwZW5hbWUgX0Jhc2U6Ol9GQWxsb2MoX19hKS5hbGxvY2F0ZSgxKTsKKwlyZXR1cm4gbmV3KF9fc3BhY2UpIF9Sb3BlRnVuY3Rpb24oX19mLCBfX3NpemUsIF9fZCwgX19hKTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIF9Sb3BlU3Vic3RyaW5nKgorICAgICAgX1NfbmV3X1JvcGVTdWJzdHJpbmcoX1JvcGVfUm9wZVJlcDxfQ2hhclQsX0FsbG9jPiogX19iLCBzaXplX3QgX19zLAorCQkJICAgc2l6ZV90IF9fbCwgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIHsKKwlfUm9wZVN1YnN0cmluZyogX19zcGFjZSA9IHR5cGVuYW1lIF9CYXNlOjpfU0FsbG9jKF9fYSkuYWxsb2NhdGUoMSk7CisJcmV0dXJuIG5ldyhfX3NwYWNlKSBfUm9wZVN1YnN0cmluZyhfX2IsIF9fcywgX19sLCBfX2EpOworICAgICAgfQorICAgICAgCisgICAgICBzdGF0aWMgX1JvcGVMZWFmKgorICAgICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKGNvbnN0IF9DaGFyVCAqX19zLAorCQkJCQlzaXplX3QgX19zaXplLCBhbGxvY2F0b3JfdHlwZSYgX19hKQorI2RlZmluZSBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fc2l6ZSwgX19hKSBcCisgICAgICAgICAgICAgICAgX1NfUm9wZUxlYWZfZnJvbV91bm93bmVkX2NoYXJfcHRyKF9fcywgX19zaXplLCBfX2EpCisgICAgICB7CisJaWYgKDAgPT0gX19zaXplKQorCSAgcmV0dXJuIDA7CisJX0NoYXJUKiBfX2J1ZiA9IF9fYS5hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19zaXplKSk7CisJCisJX191bmluaXRpYWxpemVkX2NvcHlfbl9hKF9fcywgX19zaXplLCBfX2J1ZiwgX19hKTsKKwlfU19jb25kX3N0b3JlX2VvcyhfX2J1ZltfX3NpemVdKTsKKwlfX3RyeQorCSAgeyByZXR1cm4gX1NfbmV3X1JvcGVMZWFmKF9fYnVmLCBfX3NpemUsIF9fYSk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fYnVmLCBfX3NpemUsIF9fYSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgICAgICAvLyBDb25jYXRlbmF0aW9uIG9mIG5vbmVtcHR5IHN0cmluZ3MuCisgICAgICAvLyBBbHdheXMgYnVpbGRzIGEgY29uY2F0ZW5hdGlvbiBub2RlLgorICAgICAgLy8gUmViYWxhbmNlcyBpZiB0aGUgcmVzdWx0IGlzIHRvbyBkZWVwLgorICAgICAgLy8gUmVzdWx0IGhhcyByZWZjb3VudCAxLgorICAgICAgLy8gRG9lcyBub3QgaW5jcmVtZW50IGxlZnQgYW5kIHJpZ2h0IHJlZiBjb3VudHMgZXZlbiB0aG91Z2gKKyAgICAgIC8vIHRoZXkgYXJlIHJlZmVyZW5jZWQuCisgICAgICBzdGF0aWMgX1JvcGVSZXAqCisgICAgICBfU190cmVlX2NvbmNhdChfUm9wZVJlcCogX19sZWZ0LCBfUm9wZVJlcCogX19yaWdodCk7CisKKyAgICAgIC8vIENvbmNhdGVuYXRpb24gaGVscGVyIGZ1bmN0aW9ucworICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwKKwkJCSAgICAgICBjb25zdCBfQ2hhclQqIF9faXRlciwgc2l6ZV90IF9fc2xlbik7CisgICAgICAvLyBDb25jYXRlbmF0ZSBieSBjb3B5aW5nIGxlYWYuCisgICAgICAvLyBzaG91bGQgdGFrZSBhbiBhcmJpdHJhcnkgaXRlcmF0b3IKKyAgICAgIC8vIHJlc3VsdCBoYXMgcmVmY291bnQgMS4KKyNpZm5kZWYgX19HQworICAgICAgc3RhdGljIF9Sb3BlTGVhZioKKyAgICAgIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwKKwkJCQkgICAgIGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19zbGVuKTsKKyAgICAgIC8vIEEgdmVyc2lvbiB0aGF0IHBvdGVudGlhbGx5IGNsb2JiZXJzIF9fciBpZiBfX3ItPl9NX3JlZl9jb3VudCA9PSAxLgorI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgCisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2NoYXJfcHRyX2xlbihjb25zdCBfQ2hhclQqIF9fcyk7CisgICAgICAvLyBzbGlnaHRseSBnZW5lcmFsaXplZCBzdHJsZW4KKworICAgICAgcm9wZShfUm9wZVJlcCogX190LCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX190LCBfX2EpIHsgfQorCisKKyAgICAgIC8vIENvcHkgX19yIHRvIHRoZSBfQ2hhclQgYnVmZmVyLgorICAgICAgLy8gUmV0dXJucyBfX2J1ZmZlciArIF9fci0+X01fc2l6ZS4KKyAgICAgIC8vIEFzc3VtZXMgdGhhdCBidWZmZXIgaXMgdW5pbml0aWFsaXplZC4KKyAgICAgIHN0YXRpYyBfQ2hhclQqIF9TX2ZsYXR0ZW4oX1JvcGVSZXAqIF9fciwgX0NoYXJUKiBfX2J1ZmZlcik7CisKKyAgICAgIC8vIEFnYWluLCB3aXRoIGV4cGxpY2l0IHN0YXJ0aW5nIHBvc2l0aW9uIGFuZCBsZW5ndGguCisgICAgICAvLyBBc3N1bWVzIHRoYXQgYnVmZmVyIGlzIHVuaW5pdGlhbGl6ZWQuCisgICAgICBzdGF0aWMgX0NoYXJUKiBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsCisJCQkJc2l6ZV90IF9fc3RhcnQsIHNpemVfdCBfX2xlbiwKKwkJCQlfQ2hhclQqIF9fYnVmZmVyKTsKKworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcKKyAgICAgIF9TX21pbl9sZW5bX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoICsgMV07CisgICAgICAKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfU19pc19iYWxhbmNlZChfUm9wZVJlcCogX19yKQorICAgICAgeyByZXR1cm4gKF9fci0+X01fc2l6ZSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGhdKTsgfQorCisgICAgICBzdGF0aWMgYm9vbAorICAgICAgX1NfaXNfYWxtb3N0X2JhbGFuY2VkKF9Sb3BlUmVwKiBfX3IpCisgICAgICB7IHJldHVybiAoX19yLT5fTV9kZXB0aCA9PSAwCisJCXx8IF9fci0+X01fc2l6ZSA+PSBfU19taW5fbGVuW19fci0+X01fZGVwdGggLSAxXSk7IH0KKworICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9TX2lzX3JvdWdobHlfYmFsYW5jZWQoX1JvcGVSZXAqIF9fcikKKyAgICAgIHsgcmV0dXJuIChfX3ItPl9NX2RlcHRoIDw9IDEKKwkJfHwgX19yLT5fTV9zaXplID49IF9TX21pbl9sZW5bX19yLT5fTV9kZXB0aCAtIDJdKTsgfQorCisgICAgICAvLyBBc3N1bWVzIHRoZSByZXN1bHQgaXMgbm90IGVtcHR5LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKgorICAgICAgX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX1JvcGVSZXAqIF9fbGVmdCwgX1JvcGVSZXAqIF9fcmlnaHQpCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0KF9fbGVmdCwgX19yaWdodCk7CisJaWYgKF9TX2lzX2JhbGFuY2VkKF9fcmVzdWx0KSkKKwkgIF9fcmVzdWx0LT5fTV9pc19iYWxhbmNlZCA9IHRydWU7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgICAvLyBUaGUgYmFzaWMgcmViYWxhbmNpbmcgb3BlcmF0aW9uLiAgTG9naWNhbGx5IGNvcGllcyB0aGUKKyAgICAgIC8vIHJvcGUuICBUaGUgcmVzdWx0IGhhcyByZWZjb3VudCBvZiAxLiAgVGhlIGNsaWVudCB3aWxsCisgICAgICAvLyB1c3VhbGx5IGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIF9fci4KKyAgICAgIC8vIFRoZSByZXN1bHQgaXMgd2l0aGluIGhlaWdodCAyIG9mIGJhbGFuY2VkIGJ5IHRoZSBhYm92ZQorICAgICAgLy8gZGVmaW5pdGlvbi4KKyAgICAgIHN0YXRpYyBfUm9wZVJlcCogX1NfYmFsYW5jZShfUm9wZVJlcCogX19yKTsKKworICAgICAgLy8gQWRkIGFsbCB1bmJhbGFuY2VkIHN1YnRyZWVzIHRvIHRoZSBmb3Jlc3Qgb2YgYmFsYW5jZWQgdHJlZXMuCisgICAgICAvLyBVc2VkIG9ubHkgYnkgYmFsYW5jZS4KKyAgICAgIHN0YXRpYyB2b2lkIF9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqX19yLCBfUm9wZVJlcCoqIF9fZm9yZXN0KTsKKworICAgICAgLy8gQWRkIF9fciB0byBmb3Jlc3QsIGFzc3VtaW5nIF9fciBpcyBhbHJlYWR5IGJhbGFuY2VkLgorICAgICAgc3RhdGljIHZvaWQgX1NfYWRkX2xlYWZfdG9fZm9yZXN0KF9Sb3BlUmVwKiBfX3IsIF9Sb3BlUmVwKiogX19mb3Jlc3QpOworICAgICAgCisgICAgICAvLyBQcmludCB0byBzdGRvdXQsIGV4cG9zaW5nIHN0cnVjdHVyZQorICAgICAgc3RhdGljIHZvaWQgX1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQgPSAwKTsKKyAgICAgIAorICAgICAgLy8gUmV0dXJuIC0xLCAwLCBvciAxIGlmIF9feCA8IF9feSwgX194ID09IF9feSwgb3IgX194ID4gX195IHJlc3AuCisgICAgICBzdGF0aWMgaW50IF9TX2NvbXBhcmUoY29uc3QgX1JvcGVSZXAqIF9feCwgY29uc3QgX1JvcGVSZXAqIF9feSk7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiAwID09IHRoaXMtPl9NX3RyZWVfcHRyOyB9CisgICAgICAKKyAgICAgIC8vIENvbXBhcmlzb24gbWVtYmVyIGZ1bmN0aW9uLiAgVGhpcyBpcyBwdWJsaWMgb25seSBmb3IgdGhvc2UKKyAgICAgIC8vIGNsaWVudHMgdGhhdCBuZWVkIGEgdGVybmFyeSBjb21wYXJpc29uLiAgT3RoZXJzCisgICAgICAvLyBzaG91bGQgdXNlIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBiZWxvdy4KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCByb3BlJiBfX3kpIGNvbnN0CisgICAgICB7IHJldHVybiBfU19jb21wYXJlKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3kuX01fdHJlZV9wdHIpOyB9CisKKyAgICAgIHJvcGUoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdGhpcy0+X01fdHJlZV9wdHIgPQorCSAgX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfU19jaGFyX3B0cl9sZW4oX19zKSwKKwkJCQkJICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgcm9wZShjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90IF9fbGVuLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdGhpcy0+X01fdHJlZV9wdHIgPQorCSAgX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX2xlbiwgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIH0KKworICAgICAgLy8gU2hvdWxkIHBlcmhhcHMgYmUgdGVtcGxhdGl6ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBpdGVyYXRvciB0eXBlCisgICAgICAvLyBhbmQgdXNlIFNlcXVlbmNlX2J1ZmZlci4gIChJdCBzaG91bGQgcGVyaGFwcyB1c2Ugc2VxdWVuY2VfYnVmZmVyCisgICAgICAvLyBldmVuIG5vdy4pCisgICAgICByb3BlKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQ2hhclQqIF9fZSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCXRoaXMtPl9NX3RyZWVfcHRyID0KKwkgIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX19lIC0gX19zLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgfQorCisgICAgICByb3BlKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX3MsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2UsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9TX3N1YnN0cmluZyhfX3MuX01fcm9vdCwgX19zLl9NX2N1cnJlbnRfcG9zLAorCQkJICAgX19lLl9NX2N1cnJlbnRfcG9zKSwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHJvcGUoY29uc3QgaXRlcmF0b3ImIF9fcywgY29uc3QgaXRlcmF0b3ImIF9fZSwKKwkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX1Nfc3Vic3RyaW5nKF9fcy5fTV9yb290LCBfX3MuX01fY3VycmVudF9wb3MsCisJCQkgICBfX2UuX01fY3VycmVudF9wb3MpLCBfX2EpCisgICAgICB7IH0KKworICAgICAgcm9wZShfQ2hhclQgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeworCV9DaGFyVCogX19idWYgPSB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoMSkpOworCQorCV9NX2dldF9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoX19idWYsIF9fYyk7CisJX190cnkKKwkgIHsKKwkgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfU19uZXdfUm9wZUxlYWYoX19idWYsIDEsCisJCQkJCQlfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfUm9wZVJlcDo6X19TVExfRlJFRV9TVFJJTkcoX19idWYsIDEsIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorICAgICAgfQorCisgICAgICByb3BlKHNpemVfdCBfX24sIF9DaGFyVCBfX2MsCisJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpOworCisgICAgICByb3BlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZSgwLCBfX2EpIHsgfQorCisgICAgICAvLyBDb25zdHJ1Y3QgYSByb3BlIGZyb20gYSBmdW5jdGlvbiB0aGF0IGNhbiBjb21wdXRlIGl0cyBtZW1iZXJzCisgICAgICByb3BlKGNoYXJfcHJvZHVjZXI8X0NoYXJUPiAqX19mbiwgc2l6ZV90IF9fbGVuLCBib29sIF9fZGVsZXRlX2ZuLAorCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2EpCisgICAgICB7CisJdGhpcy0+X01fdHJlZV9wdHIgPSAoMCA9PSBfX2xlbikgPworCSAgMCA6IF9TX25ld19Sb3BlRnVuY3Rpb24oX19mbiwgX19sZW4sIF9fZGVsZXRlX2ZuLCBfX2EpOworICAgICAgfQorCisgICAgICByb3BlKGNvbnN0IHJvcGUmIF9feCwgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9feC5fTV90cmVlX3B0ciwgX19hKQorICAgICAgeyBfU19yZWYodGhpcy0+X01fdHJlZV9wdHIpOyB9CisKKyAgICAgIH5yb3BlKCkgdGhyb3coKQorICAgICAgeyBfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7IH0KKworICAgICAgcm9wZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCByb3BlJiBfX3gpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3guX01fdHJlZV9wdHI7CisJX1NfcmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwlfU191bnJlZihfX29sZCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9DaGFyVCBfX3gpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIKKwkgID0gX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcih0aGlzLT5fTV90cmVlX3B0ciwgJl9feCwgMSk7CisJX1NfdW5yZWYoX19vbGQpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBwb3BfYmFjaygpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCSAwLCB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSAtIDEpOworCV9TX3VucmVmKF9fb2xkKTsKKyAgICAgIH0KKworICAgICAgX0NoYXJUCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TX2ZldGNoKHRoaXMtPl9NX3RyZWVfcHRyLCB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSAtIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoX0NoYXJUIF9feCkKKyAgICAgIHsKKwlfUm9wZVJlcCogX19vbGQgPSB0aGlzLT5fTV90cmVlX3B0cjsKKwlfUm9wZVJlcCogX19sZWZ0ID0KKwkgIF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKCZfX3gsIDEsIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJX190cnkKKwkgIHsKKwkgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfU19jb25jYXQoX19sZWZ0LCB0aGlzLT5fTV90cmVlX3B0cik7CisJICAgIF9TX3VucmVmKF9fb2xkKTsKKwkgICAgX1NfdW5yZWYoX19sZWZ0KTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX1NfdW5yZWYoX19sZWZ0KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9mcm9udCgpCisgICAgICB7CisJX1JvcGVSZXAqIF9fb2xkID0gdGhpcy0+X01fdHJlZV9wdHI7CisJdGhpcy0+X01fdHJlZV9wdHIKKwkgID0gX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLCAxLCB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSk7CisJX1NfdW5yZWYoX19vbGQpOworICAgICAgfQorCisgICAgICBfQ2hhclQKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9TX2ZldGNoKHRoaXMtPl9NX3RyZWVfcHRyLCAwKTsgfQorCisgICAgICB2b2lkCisgICAgICBiYWxhbmNlKCkKKyAgICAgIHsKKwlfUm9wZVJlcCogX19vbGQgPSB0aGlzLT5fTV90cmVlX3B0cjsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9TX2JhbGFuY2UodGhpcy0+X01fdHJlZV9wdHIpOworCV9TX3VucmVmKF9fb2xkKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY29weShfQ2hhclQqIF9fYnVmZmVyKSBjb25zdAorICAgICAgeworCV9EZXN0cm95X2NvbnN0KF9fYnVmZmVyLCBfX2J1ZmZlciArIHNpemUoKSwgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwlfU19mbGF0dGVuKHRoaXMtPl9NX3RyZWVfcHRyLCBfX2J1ZmZlcik7CisgICAgICB9CisKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGNvcHkgZnVuY3Rpb24gZnJvbSB0aGUgc3RhbmRhcmQsIGJ1dAorICAgICAgLy8gd2l0aCB0aGUgYXJndW1lbnRzIHJlb3JkZXJlZCB0byBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUKKyAgICAgIC8vIHJlc3Qgb2YgdGhlIGludGVyZmFjZS4KKyAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbXBpbGUgaWYgdGhlIGRyYWZ0IHN0YW5kYXJkCisgICAgICAvLyBvcmRlciBpcyBhc3N1bWVkLgorICAgICAgc2l6ZV90eXBlCisgICAgICBjb3B5KHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbiwgX0NoYXJUKiBfX2J1ZmZlcikgY29uc3QKKyAgICAgIHsKKwlzaXplX3QgX19zaXplID0gc2l6ZSgpOworCXNpemVfdCBfX2xlbiA9IChfX3BvcyArIF9fbiA+IF9fc2l6ZT8gX19zaXplIC0gX19wb3MgOiBfX24pOworCisJX0Rlc3Ryb3lfY29uc3QoX19idWZmZXIsIF9fYnVmZmVyICsgX19sZW4sIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJX1NfZmxhdHRlbih0aGlzLT5fTV90cmVlX3B0ciwgX19wb3MsIF9fbGVuLCBfX2J1ZmZlcik7CisJcmV0dXJuIF9fbGVuOworICAgICAgfQorCisgICAgICAvLyBQcmludCB0byBzdGRvdXQsIGV4cG9zaW5nIHN0cnVjdHVyZS4gIE1heSBiZSB1c2VmdWwgZm9yCisgICAgICAvLyBwZXJmb3JtYW5jZSBkZWJ1Z2dpbmcuCisgICAgICB2b2lkCisgICAgICBkdW1wKCkKKyAgICAgIHsgX1NfZHVtcCh0aGlzLT5fTV90cmVlX3B0cik7IH0KKyAgICAgIAorICAgICAgLy8gQ29udmVydCB0byAwIHRlcm1pbmF0ZWQgc3RyaW5nIGluIG5ldyBhbGxvY2F0ZWQgbWVtb3J5LgorICAgICAgLy8gRW1iZWRkZWQgMHMgaW4gdGhlIGlucHV0IGRvIG5vdCB0ZXJtaW5hdGUgdGhlIGNvcHkuCisgICAgICBjb25zdCBfQ2hhclQqIGNfc3RyKCkgY29uc3Q7CisKKyAgICAgIC8vIEFzIGFib3ZlLCBidXQgYWxzbyB1c2UgdGhlIGZsYXR0ZW5lZCByZXByZXNlbnRhdGlvbiBhcworICAgICAgLy8gdGhlIG5ldyByb3BlIHJlcHJlc2VudGF0aW9uLgorICAgICAgY29uc3QgX0NoYXJUKiByZXBsYWNlX3dpdGhfY19zdHIoKTsKKyAgICAgIAorICAgICAgLy8gUmVjbGFpbSBtZW1vcnkgZm9yIHRoZSBjX3N0ciBnZW5lcmF0ZWQgZmxhdHRlbmVkIHN0cmluZy4KKyAgICAgIC8vIEludGVudGlvbmFsbHkgdW5kb2N1bWVudGVkLCBzaW5jZSBpdCdzIGhhcmQgdG8gc2F5IHdoZW4gdGhpcworICAgICAgLy8gaXMgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgIHZvaWQKKyAgICAgIGRlbGV0ZV9jX3N0ciAoKQorICAgICAgeworCWlmICgwID09IHRoaXMtPl9NX3RyZWVfcHRyKQorCSAgcmV0dXJuOworCWlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSB0aGlzLT5fTV90cmVlX3B0ci0+X01fdGFnICYmCisJICAgICgoX1JvcGVMZWFmKil0aGlzLT5fTV90cmVlX3B0ciktPl9NX2RhdGEgPT0KKwkgICAgdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nKQorCSAgeworCSAgICAvLyBSZXByZXNlbnRhdGlvbiBzaGFyZWQKKwkgICAgcmV0dXJuOworCSAgfQorI2lmbmRlZiBfX0dDCisJdGhpcy0+X01fdHJlZV9wdHItPl9NX2ZyZWVfY19zdHJpbmcoKTsKKyNlbmRpZgorCXRoaXMtPl9NX3RyZWVfcHRyLT5fTV9jX3N0cmluZyA9IDA7CisgICAgICB9CisKKyAgICAgIF9DaGFyVAorICAgICAgb3BlcmF0b3JbXSAoc2l6ZV90eXBlIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gX1NfZmV0Y2godGhpcy0+X01fdHJlZV9wdHIsIF9fcG9zKTsgfQorCisgICAgICBfQ2hhclQKKyAgICAgIGF0KHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsKKwkvLyBpZiAoX19wb3MgPj0gc2l6ZSgpKSB0aHJvdyBvdXRfb2ZfcmFuZ2U7ICAvLyBYWFgKKwlyZXR1cm4gKCp0aGlzKVtfX3Bvc107CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgMCkpOyB9CisKKyAgICAgIC8vIEFuIGVhc3kgd2F5IHRvIGdldCBhIGNvbnN0IGl0ZXJhdG9yIGZyb20gYSBub24tY29uc3QgY29udGFpbmVyLgorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNvbnN0X2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuKGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX3RyZWVfcHRyLCAwKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgc2l6ZSgpKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNvbnN0X2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybihjb25zdF9pdGVyYXRvcih0aGlzLT5fTV90cmVlX3B0ciwgc2l6ZSgpKSk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsJcmV0dXJuKDAgPT0gdGhpcy0+X01fdHJlZV9wdHI/IDAgOiB0aGlzLT5fTV90cmVlX3B0ci0+X01fc2l6ZSk7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdAorICAgICAgewlyZXR1cm4gc2l6ZSgpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeworCXJldHVybiBfU19taW5fbGVuW2ludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpIC0gMV0gLSAxOworCS8vICBHdWFyYW50ZWVzIHRoYXQgdGhlIHJlc3VsdCBjYW4gYmUgc3VmZmljaWVudGx5CisJLy8gIGJhbGFuY2VkLiAgTG9uZ2VyIHJvcGVzIHdpbGwgcHJvYmFibHkgc3RpbGwgd29yaywKKwkvLyAgYnV0IGl0J3MgaGFyZGVyIHRvIG1ha2UgZ3VhcmFudGVlcy4KKyAgICAgIH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjb25zdF9yYmVnaW4oKSBjb25zdAorICAgICAgewlyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgICAgICAKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNvbnN0X3JlbmQoKSBjb25zdAorICAgICAgewlyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPiYgX19sZWZ0LAorCQkgIGNvbnN0IHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4mIF9fcmlnaHQpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQyLCBjbGFzcyBfQWxsb2MyPgorICAgICAgICBmcmllbmQgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPgorICAgICAgICBvcGVyYXRvcisoY29uc3Qgcm9wZTxfQ2hhclQyLCBfQWxsb2MyPiYgX19sZWZ0LCBjb25zdCBfQ2hhclQyKiBfX3JpZ2h0KTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUMiwgY2xhc3MgX0FsbG9jMj4KKyAgICAgICAgZnJpZW5kIHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4KKyAgICAgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJUMiwgX0FsbG9jMj4mIF9fbGVmdCwgX0NoYXJUMiBfX3JpZ2h0KTsKKworICAgICAgLy8gVGhlIHN5bW1ldHJpYyBjYXNlcyBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkLCBzaW5jZSB0aGV5J3JlCisgICAgICAvLyBwcmVzdW1lZCB0byBiZSBsZXNzIGNvbW1vbiwgYW5kIHdlIGRvbid0IGhhbmRsZSB0aGVtIGFzIHdlbGwuCisKKyAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHJlYWxseSBiZSB0ZW1wbGF0aXplZC4gIFRoZSBmaXJzdAorICAgICAgLy8gYXJndW1lbnQgc2hvdWxkIGJlIGFuIGlucHV0IGl0ZXJhdG9yIG9yIGZvcndhcmQgaXRlcmF0b3Igd2l0aAorICAgICAgLy8gdmFsdWVfdHlwZSBfQ2hhclQuCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19pdGVyLCBzaXplX3QgX19uKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisJICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKHRoaXMtPl9NX3RyZWVfcHRyLCBfX2l0ZXIsIF9fbik7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19jX3N0cmluZykKKyAgICAgIHsKKwlzaXplX3QgX19sZW4gPSBfU19jaGFyX3B0cl9sZW4oX19jX3N0cmluZyk7CisJYXBwZW5kKF9fY19zdHJpbmcsIF9fbGVuKTsKKwlyZXR1cm4oKnRoaXMpOworICAgICAgfQorCisgICAgICByb3BlJgorICAgICAgYXBwZW5kKGNvbnN0IF9DaGFyVCogX19zLCBjb25zdCBfQ2hhclQqIF9fZSkKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcih0aGlzLT5fTV90cmVlX3B0ciwgX19zLCBfX2UgLSBfX3MpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdF9pdGVyYXRvciBfX3MsIGNvbnN0X2l0ZXJhdG9yIF9fZSkKKyAgICAgIHsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19hcHBlbmRlZShfU19zdWJzdHJpbmcoX19zLl9NX3Jvb3QsCisJCQkJCQkgICBfX3MuX01fY3VycmVudF9wb3MsCisJCQkJCQkgICBfX2UuX01fY3VycmVudF9wb3MpKTsKKwlfUm9wZVJlcCogX19yZXN1bHQgPSBfU19jb25jYXQodGhpcy0+X01fdHJlZV9wdHIsIAorCQkJCSAgICAgICAoX1JvcGVSZXAqKV9fYXBwZW5kZWUpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChfQ2hhclQgX19jKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisJICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKHRoaXMtPl9NX3RyZWVfcHRyLCAmX19jLCAxKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJvcGUmCisgICAgICBhcHBlbmQoKQorICAgICAgeyByZXR1cm4gYXBwZW5kKF9DaGFyVCgpKTsgfSAgLy8gWFhYIHdoeT8KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChjb25zdCByb3BlJiBfX3kpCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gX1NfY29uY2F0KHRoaXMtPl9NX3RyZWVfcHRyLCBfX3kuX01fdHJlZV9wdHIpOworCV9TX3VucmVmKHRoaXMtPl9NX3RyZWVfcHRyKTsKKwl0aGlzLT5fTV90cmVlX3B0ciA9IF9fcmVzdWx0OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgcm9wZSYKKyAgICAgIGFwcGVuZChzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCXJvcGU8X0NoYXJULF9BbGxvYz4gX19sYXN0KF9fbiwgX19jKTsKKwlyZXR1cm4gYXBwZW5kKF9fbGFzdCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAocm9wZSYgX19iKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3RtcCA9IHRoaXMtPl9NX3RyZWVfcHRyOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19iLl9NX3RyZWVfcHRyOworCV9fYi5fTV90cmVlX3B0ciA9IF9fdG1wOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gUmVzdWx0IGlzIGluY2x1ZGVkIGluIHJlZmNvdW50LgorICAgICAgc3RhdGljIF9Sb3BlUmVwKgorICAgICAgcmVwbGFjZShfUm9wZVJlcCogX19vbGQsIHNpemVfdCBfX3BvczEsCisJICAgICAgc2l6ZV90IF9fcG9zMiwgX1JvcGVSZXAqIF9fcikKKyAgICAgIHsKKwlpZiAoMCA9PSBfX29sZCkKKwkgIHsKKwkgICAgX1NfcmVmKF9fcik7CisJICAgIHJldHVybiBfX3I7CisJICB9CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfU19zdWJzdHJpbmcoX19vbGQsIDAsIF9fcG9zMSkpOworCV9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9TX3N1YnN0cmluZyhfX29sZCwgX19wb3MyLCBfX29sZC0+X01fc2l6ZSkpOworCV9Sb3BlUmVwKiBfX3Jlc3VsdDsKKworCWlmICgwID09IF9fcikKKwkgIF9fcmVzdWx0ID0gX1NfY29uY2F0KF9fbGVmdCwgX19yaWdodCk7CisJZWxzZQorCSAgeworCSAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdChfU19jb25jYXQoX19sZWZ0LCBfX3IpKTsKKwkgICAgX19yZXN1bHQgPSBfU19jb25jYXQoX19sZWZ0X3Jlc3VsdCwgX19yaWdodCk7CisJICB9CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsKKwlfUm9wZVJlcCogX19yZXN1bHQgPQorCSAgcmVwbGFjZSh0aGlzLT5fTV90cmVlX3B0ciwgX19wLCBfX3AsIF9fci5fTV90cmVlX3B0cik7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBzaXplX3QgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCXJvcGU8X0NoYXJULF9BbGxvYz4gX19yKF9fbixfX2MpOworCWluc2VydChfX3AsIF9fcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0KF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwgMCwgX19wKSk7CisJX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fcmlnaHQoX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJX19wLCBzaXplKCkpKTsKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19sZWZ0X3Jlc3VsdChfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdCwgX19pLCBfX24pKTsKKwkvLyBfU18gZGVzdHJfY29uY2F0X2NoYXJfaXRlciBzaG91bGQgYmUgc2FmZSBoZXJlLgorCS8vIEJ1dCBhcyBpdCBzdGFuZHMgaXQncyBwcm9iYWJseSBub3QgYSB3aW4sIHNpbmNlIF9fbGVmdAorCS8vIGlzIGxpa2VseSB0byBoYXZlIGFkZGl0aW9uYWwgcmVmZXJlbmNlcy4KKwlfUm9wZVJlcCogX19yZXN1bHQgPSBfU19jb25jYXQoX19sZWZ0X3Jlc3VsdCwgX19yaWdodCk7CisJX1NfdW5yZWYodGhpcy0+X01fdHJlZV9wdHIpOworCXRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9fY19zdHJpbmcpCisgICAgICB7CWluc2VydChfX3AsIF9fY19zdHJpbmcsIF9TX2NoYXJfcHRyX2xlbihfX2Nfc3RyaW5nKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIF9DaGFyVCBfX2MpCisgICAgICB7IGluc2VydChfX3AsICZfX2MsIDEpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzaXplX3QgX19wKQorICAgICAgeworCV9DaGFyVCBfX2MgPSBfQ2hhclQoKTsKKwlpbnNlcnQoX19wLCAmX19jLCAxKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBjb25zdCBfQ2hhclQqIF9faikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faik7CisJaW5zZXJ0KF9fcCwgX19yKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHNpemVfdCBfX3AsIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksCisJICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeworCXJvcGUgX19yKF9faSwgX19qKTsKKwlpbnNlcnQoX19wLCBfX3IpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc2l6ZV90IF9fcCwgY29uc3QgaXRlcmF0b3ImIF9faSwKKwkgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2opOworCWluc2VydChfX3AsIF9fcik7CisgICAgICB9CisKKyAgICAgIC8vIChwb3NpdGlvbiwgbGVuZ3RoKSB2ZXJzaW9ucyBvZiByZXBsYWNlIG9wZXJhdGlvbnM6CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgeworCV9Sb3BlUmVwKiBfX3Jlc3VsdCA9CisJICByZXBsYWNlKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3AsIF9fcCArIF9fbiwgX19yLl9NX3RyZWVfcHRyKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBzaXplX3QgX19uLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19pX2xlbikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faV9sZW4pOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlyb3BlIF9fcihfX2MpOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgeworCXJvcGUgX19yKF9fY19zdHJpbmcpOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKwkgICAgICBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CisJcm9wZSBfX3IoX19pLCBfX2opOworCXJlcGxhY2UoX19wLCBfX24sIF9fcik7CisgICAgICB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgc2l6ZV90IF9fbiwKKwkgICAgICBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19qKQorICAgICAgeworCXJvcGUgX19yKF9faSwgX19qKTsKKwlyZXBsYWNlKF9fcCwgX19uLCBfX3IpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24sCisJICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKKyAgICAgIHsKKwlyb3BlIF9fcihfX2ksIF9faik7CisJcmVwbGFjZShfX3AsIF9fbiwgX19yKTsKKyAgICAgIH0KKworICAgICAgLy8gU2luZ2xlIGNoYXJhY3RlciB2YXJpYW50czoKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlpdGVyYXRvciBfX2kodGhpcywgX19wKTsKKwkqX19pID0gX19jOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKHNpemVfdCBfX3AsIGNvbnN0IHJvcGUmIF9fcikKKyAgICAgIHsgcmVwbGFjZShfX3AsIDEsIF9fcik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9faV9sZW4pCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faV9sZW4pOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2Uoc2l6ZV90IF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgewlyZXBsYWNlKF9fcCwgMSwgX19jX3N0cmluZyk7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CXJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBjb25zdF9pdGVyYXRvciYgX19pLAorCSAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7IH0KKworICAgICAgdm9pZAorICAgICAgcmVwbGFjZShzaXplX3QgX19wLCBjb25zdCBpdGVyYXRvciYgX19pLAorCSAgICAgIGNvbnN0IGl0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLCAxLCBfX2ksIF9faik7IH0KKworICAgICAgLy8gRXJhc2UsIChwb3NpdGlvbiwgc2l6ZSkgdmFyaWFudC4KKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHNpemVfdCBfX3AsIHNpemVfdCBfX24pCisgICAgICB7CisJX1JvcGVSZXAqIF9fcmVzdWx0ID0gcmVwbGFjZSh0aGlzLT5fTV90cmVlX3B0ciwgX19wLAorCQkJCSAgICAgX19wICsgX19uLCAwKTsKKwlfU191bnJlZih0aGlzLT5fTV90cmVlX3B0cik7CisJdGhpcy0+X01fdHJlZV9wdHIgPSBfX3Jlc3VsdDsKKyAgICAgIH0KKworICAgICAgLy8gRXJhc2UsIHNpbmdsZSBjaGFyYWN0ZXIKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKHNpemVfdCBfX3ApCisgICAgICB7IGVyYXNlKF9fcCwgX19wICsgMSk7IH0KKworICAgICAgLy8gSW5zZXJ0LCBpdGVyYXRvciB2YXJpYW50cy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgeworCWluc2VydChfX3AuaW5kZXgoKSwgX19yKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIHNpemVfdCBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX24sIF9fYyk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIF9DaGFyVCBfX2MpCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2MpOworCXJldHVybiBfX3A7CisgICAgICB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCApCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogY19zdHJpbmcpCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBjX3N0cmluZyk7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwlpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19uKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLAorCSAgICAgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7IAorCXJldHVybiBfX3A7CisgICAgICB9CisgICAgICAKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgaXRlcmF0b3ImIF9fcCwKKwkgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgICAgICB7CisJaW5zZXJ0KF9fcC5pbmRleCgpLCBfX2ksIF9faik7CisJcmV0dXJuIF9fcDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCBpdGVyYXRvciYgX19wLAorCSAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKKyAgICAgIHsKKwlpbnNlcnQoX19wLmluZGV4KCksIF9faSwgX19qKTsKKwlyZXR1cm4gX19wOworICAgICAgfQorCisgICAgICAvLyBSZXBsYWNlLCByYW5nZSB2YXJpYW50cy4KKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwgY29uc3Qgcm9wZSYgX19yKQorICAgICAgewlyZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX3IpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgaXRlcmF0b3ImIF9fcSwgX0NoYXJUIF9fYykKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19jKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2Nfc3RyaW5nKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIHNpemVfdCBfX24pCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19uKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2ksIGNvbnN0IF9DaGFyVCogX19qKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX3EuaW5kZXgoKSAtIF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBpdGVyYXRvciYgX19xLAorCSAgICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2ksIGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcS5pbmRleCgpIC0gX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EsCisJICAgICAgY29uc3QgaXRlcmF0b3ImIF9faSwgY29uc3QgaXRlcmF0b3ImIF9faikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19xLmluZGV4KCkgLSBfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisKKyAgICAgIC8vIFJlcGxhY2UsIGl0ZXJhdG9yIHZhcmlhbnRzLgorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCByb3BlJiBfX3IpCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9fcik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBfQ2hhclQgX19jKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2MpOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlcGxhY2UoY29uc3QgaXRlcmF0b3ImIF9fcCwgY29uc3QgX0NoYXJUKiBfX2Nfc3RyaW5nKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2Nfc3RyaW5nKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IF9DaGFyVCogX19pLCBzaXplX3QgX19uKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9fbik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBjb25zdCBfQ2hhclQqIF9faSwgY29uc3QgX0NoYXJUKiBfX2opCisgICAgICB7IHJlcGxhY2UoX19wLmluZGV4KCksIF9faSwgX19qKTsgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXBsYWNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0X2l0ZXJhdG9yIF9faSwgY29uc3RfaXRlcmF0b3IgX19qKQorICAgICAgeyByZXBsYWNlKF9fcC5pbmRleCgpLCBfX2ksIF9faik7IH0KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgcmVwbGFjZShjb25zdCBpdGVyYXRvciYgX19wLCBpdGVyYXRvciBfX2ksIGl0ZXJhdG9yIF9faikKKyAgICAgIHsgcmVwbGFjZShfX3AuaW5kZXgoKSwgX19pLCBfX2opOyB9CisKKyAgICAgIC8vIEl0ZXJhdG9yIGFuZCByYW5nZSB2YXJpYW50cyBvZiBlcmFzZQorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0IGl0ZXJhdG9yJiBfX3AsIGNvbnN0IGl0ZXJhdG9yJiBfX3EpCisgICAgICB7CisJc2l6ZV90IF9fcF9pbmRleCA9IF9fcC5pbmRleCgpOworCWVyYXNlKF9fcF9pbmRleCwgX19xLmluZGV4KCkgLSBfX3BfaW5kZXgpOworCXJldHVybiBpdGVyYXRvcih0aGlzLCBfX3BfaW5kZXgpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3QgaXRlcmF0b3ImIF9fcCkKKyAgICAgIHsKKwlzaXplX3QgX19wX2luZGV4ID0gX19wLmluZGV4KCk7CisJZXJhc2UoX19wX2luZGV4LCAxKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcywgX19wX2luZGV4KTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19sZW4gPSAxKSBjb25zdAorICAgICAgeworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19zdGFydCwKKwkJCQkJCSBfX3N0YXJ0ICsgX19sZW4pKTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKGl0ZXJhdG9yIF9fc3RhcnQsIGl0ZXJhdG9yIF9fZW5kKSBjb25zdAorICAgICAgeworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19zdGFydC5pbmRleCgpLAorCQkJCQkJIF9fZW5kLmluZGV4KCkpKTsKKyAgICAgIH0KKworICAgICAgcm9wZQorICAgICAgc3Vic3RyKGl0ZXJhdG9yIF9fc3RhcnQpIGNvbnN0CisgICAgICB7CisJc2l6ZV90IF9fcG9zID0gX19zdGFydC5pbmRleCgpOworCXJldHVybiByb3BlPF9DaGFyVCwgX0FsbG9jPihfU19zdWJzdHJpbmcodGhpcy0+X01fdHJlZV9wdHIsCisJCQkJCQkgX19wb3MsIF9fcG9zICsgMSkpOworICAgICAgfQorCisgICAgICByb3BlCisgICAgICBzdWJzdHIoY29uc3RfaXRlcmF0b3IgX19zdGFydCwgY29uc3RfaXRlcmF0b3IgX19lbmQpIGNvbnN0CisgICAgICB7CisJLy8gVGhpcyBtaWdodCBldmVudHVhbGx5IHRha2UgYWR2YW50YWdlIG9mIHRoZSBjYWNoZSBpbiB0aGUKKwkvLyBpdGVyYXRvci4KKwlyZXR1cm4gcm9wZTxfQ2hhclQsIF9BbGxvYz4oX1Nfc3Vic3RyaW5nKHRoaXMtPl9NX3RyZWVfcHRyLAorCQkJCQkJIF9fc3RhcnQuaW5kZXgoKSwKKwkJCQkJCSBfX2VuZC5pbmRleCgpKSk7CisgICAgICB9CisKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgICBzdWJzdHIoY29uc3RfaXRlcmF0b3IgX19zdGFydCkKKyAgICAgIHsKKwlzaXplX3QgX19wb3MgPSBfX3N0YXJ0LmluZGV4KCk7CisJcmV0dXJuIHJvcGU8X0NoYXJULCBfQWxsb2M+KF9TX3N1YnN0cmluZyh0aGlzLT5fTV90cmVlX3B0ciwKKwkJCQkJCSBfX3BvcywgX19wb3MgKyAxKSk7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbnBvczsKKworICAgICAgc2l6ZV90eXBlIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlzaXplX3R5cGUgX19yZXN1bHRfcG9zOworCWNvbnN0X2l0ZXJhdG9yIF9fcmVzdWx0ID0KKwkgIHN0ZDo6c2VhcmNoKGNvbnN0X2JlZ2luKCkgKyBfX3BvcywgY29uc3RfZW5kKCksCisJCSAgICAgIF9fcywgX19zICsgX1NfY2hhcl9wdHJfbGVuKF9fcykpOworCV9fcmVzdWx0X3BvcyA9IF9fcmVzdWx0LmluZGV4KCk7CisjaWZuZGVmIF9fU1RMX09MRF9ST1BFX1NFTUFOVElDUworCWlmIChfX3Jlc3VsdF9wb3MgPT0gc2l6ZSgpKQorCSAgX19yZXN1bHRfcG9zID0gbnBvczsKKyNlbmRpZgorCXJldHVybiBfX3Jlc3VsdF9wb3M7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBtdXRhYmxlX2JlZ2luKCkKKyAgICAgIHsgcmV0dXJuKGl0ZXJhdG9yKHRoaXMsIDApKTsgfQorICAgICAgCisgICAgICBpdGVyYXRvcgorICAgICAgbXV0YWJsZV9lbmQoKQorICAgICAgeyByZXR1cm4oaXRlcmF0b3IodGhpcywgc2l6ZSgpKSk7IH0KKworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CisgICAgICAKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIG11dGFibGVfcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobXV0YWJsZV9lbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgbXV0YWJsZV9yZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IobXV0YWJsZV9iZWdpbigpKTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG11dGFibGVfcmVmZXJlbmNlX2F0KHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsgcmV0dXJuIHJlZmVyZW5jZSh0aGlzLCBfX3Bvcyk7IH0KKworI2lmZGVmIF9fU1REX1NUVUZGCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsgcmV0dXJuIF9jaGFyX3JlZl9wcm94eSh0aGlzLCBfX3Bvcyk7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19wb3MpCisgICAgICB7CisJLy8gaWYgKF9fcG9zID49IHNpemUoKSkgdGhyb3cgb3V0X29mX3JhbmdlOyAgLy8gWFhYCisJcmV0dXJuICgqdGhpcylbX19wb3NdOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKSB7IH0KKyAgICAgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBfX24pIHsgfQorICAgICAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBfX3Jlc19hcmcgPSAwKSB7IH0KKyAgICAgIAorICAgICAgc2l6ZV90eXBlCisgICAgICBjYXBhY2l0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiBtYXhfc2l6ZSgpOyB9CisKKyAgICAgIC8vIFN0dWZmIGJlbG93IHRoaXMgbGluZSBpcyBkYW5nZXJvdXMgYmVjYXVzZSBpdCdzIGVycm9yIHByb25lLgorICAgICAgLy8gSSB3b3VsZCByZWFsbHkgbGlrZSB0byBnZXQgcmlkIG9mIGl0LgorICAgICAgLy8gY29weSBmdW5jdGlvbiB3aXRoIGZ1bm55IGFyZyBvcmRlcmluZy4KKyAgICAgIHNpemVfdHlwZQorICAgICAgY29weShfQ2hhclQqIF9fYnVmZmVyLCBzaXplX3R5cGUgX19uLAorCSAgIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiBjb3B5KF9fcG9zLCBfX24sIF9fYnVmZmVyKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIG11dGFibGVfZW5kKCk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIG11dGFibGVfYmVnaW4oKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIG11dGFibGVfcmVuZCgpOyB9CisgICAgICAKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiBtdXRhYmxlX3JiZWdpbigpOyB9CisKKyNlbHNlCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2VuZCgpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBjb25zdF9iZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gY29uc3RfcmVuZCgpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiBjb25zdF9yYmVnaW4oKTsgfQorCisjZW5kaWYKKyAgICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBjb25zdCB0eXBlbmFtZSByb3BlPF9DaGFyVCwgX0FsbG9jPjo6c2l6ZV90eXBlCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46Om5wb3MgPSAoc2l6ZV90eXBlKSgtMSk7CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zCisJICAgICAgJiYgX194Ll9NX3Jvb3QgPT0gX195Ll9NX3Jvb3QpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA8IF9feS5fTV9jdXJyZW50X3Bvcyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkJCSAgIGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCQkJICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feSA8IF9feCk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA8IF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHB0cmRpZmZfdAorICAgIG9wZXJhdG9yLShjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICBjb25zdCBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcyAtIChwdHJkaWZmX3QpX195Ll9NX2N1cnJlbnRfcG9zOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pCisgICAgeyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290LAorCQkJCQkJICBfX3guX01fY3VycmVudF9wb3MgLSBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisoY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsIHB0cmRpZmZfdCBfX24pCisgICAgeyByZXR1cm4gX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+KF9feC5fTV9yb290LAorCQkJCQkJICBfX3guX01fY3VycmVudF9wb3MgKyBfX24pOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9jb25zdF9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvcisocHRyZGlmZl90IF9fbiwgY29uc3QgX1JvcGVfY29uc3RfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgIHsgcmV0dXJuIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPihfX3guX01fcm9vdCwKKwkJCQkJCV9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7cmV0dXJuIChfX3guX01fY3VycmVudF9wb3MgPT0gX195Ll9NX2N1cnJlbnRfcG9zCisJICAgICAmJiBfX3guX01fcm9vdF9yb3BlID09IF9feS5fTV9yb290X3JvcGUpOyB9CisgIAorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gKF9feC5fTV9jdXJyZW50X3BvcyA8IF9feS5fTV9jdXJyZW50X3Bvcyk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuIF9feSA8IF9feDsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX195IDwgX194KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgcHRyZGlmZl90CisgICAgb3BlcmF0b3ItKGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgIGNvbnN0IF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICgocHRyZGlmZl90KV9feC5fTV9jdXJyZW50X3BvcworCSAgICAgIC0gKHB0cmRpZmZfdClfX3kuX01fY3VycmVudF9wb3MpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4KKyAgICBvcGVyYXRvci0oY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgcHRyZGlmZl90IF9fbikKKyAgICB7IHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwKKwkJCQkJICAgIF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCwgcHRyZGlmZl90IF9fbikKKyAgICB7IHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwKKwkJCQkJICAgIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhwdHJkaWZmX3QgX19uLCBjb25zdCBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4mIF9feCkKKyAgICB7IHJldHVybiBfUm9wZV9pdGVyYXRvcjxfQ2hhclQsIF9BbGxvYz4oX194Ll9NX3Jvb3Rfcm9wZSwKKwkJCQkJICAgIF9feC5fTV9jdXJyZW50X3BvcyArIF9fbik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpCisgICAgeworICAgICAgLy8gSW5saW5pbmcgdGhpcyBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSB0byBrZWVwIF9fbGVmdCBhbmQKKyAgICAgIC8vIF9fcmlnaHQgaW4gcmVnaXN0ZXJzLgorICAgICAgdHlwZWRlZiByb3BlPF9DaGFyVCwgX0FsbG9jPiByb3BlX3R5cGU7CisgICAgICByZXR1cm4gcm9wZV90eXBlKHJvcGVfdHlwZTo6X1NfY29uY2F0KF9fbGVmdC5fTV90cmVlX3B0ciwgCisJCQkJCSAgICBfX3JpZ2h0Ll9NX3RyZWVfcHRyKSk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgcm9wZTxfQ2hhclQsIF9BbGxvYz4mCisgICAgb3BlcmF0b3IrPShyb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19yaWdodCkKKyAgICB7CisgICAgICBfX2xlZnQuYXBwZW5kKF9fcmlnaHQpOworICAgICAgcmV0dXJuIF9fbGVmdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPgorICAgIG9wZXJhdG9yKyhjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX19sZWZ0LAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaWdodCkKKyAgICB7CisgICAgICB0eXBlZGVmIHJvcGU8X0NoYXJULCBfQWxsb2M+IHJvcGVfdHlwZTsKKyAgICAgIHNpemVfdCBfX3JsZW4gPSByb3BlX3R5cGU6Ol9TX2NoYXJfcHRyX2xlbihfX3JpZ2h0KTsKKyAgICAgIHJldHVybiByb3BlX3R5cGUocm9wZV90eXBlOjpfU19jb25jYXRfY2hhcl9pdGVyKF9fbGVmdC5fTV90cmVlX3B0ciwKKwkJCQkJCSAgICAgIF9fcmlnaHQsIF9fcmxlbikpOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+JgorICAgIG9wZXJhdG9yKz0ocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fbGVmdCwKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIF9fbGVmdC5hcHBlbmQoX19yaWdodCk7CisgICAgICByZXR1cm4gX19sZWZ0OworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHJvcGU8X0NoYXJULCBfQWxsb2M+CisgICAgb3BlcmF0b3IrKGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIF9DaGFyVCBfX3JpZ2h0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgcm9wZTxfQ2hhclQsIF9BbGxvYz4gcm9wZV90eXBlOworICAgICAgcmV0dXJuIHJvcGVfdHlwZShyb3BlX3R5cGU6Ol9TX2NvbmNhdF9jaGFyX2l0ZXIoX19sZWZ0Ll9NX3RyZWVfcHRyLAorCQkJCQkJICAgICAgJl9fcmlnaHQsIDEpKTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSByb3BlPF9DaGFyVCwgX0FsbG9jPiYKKyAgICBvcGVyYXRvcis9KHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsIF9DaGFyVCBfX3JpZ2h0KQorICAgIHsKKyAgICAgIF9fbGVmdC5hcHBlbmQoX19yaWdodCk7CisgICAgICByZXR1cm4gX19sZWZ0OworICAgIH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcmlnaHQpCisgICAgeyByZXR1cm4gX19sZWZ0LmNvbXBhcmUoX19yaWdodCkgPCAwOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX2xlZnQsCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3JpZ2h0KQorICAgIHsgcmV0dXJuIF9fbGVmdC5jb21wYXJlKF9fcmlnaHQpID09IDA7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAoX194Ll9NX3BvcyA9PSBfX3kuX01fcG9zICYmIF9feC5fTV9yb290ID09IF9feS5fTV9yb290KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3kgPCBfX3g7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Sb3BlX2NoYXJfcHRyX3Byb3h5PF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sCisJICAgICAgIGNvbnN0IHJvcGU8X0NoYXJULCBfQWxsb2M+JiBfX3IpOworCisgIHR5cGVkZWYgcm9wZTxjaGFyPiBjcm9wZTsKKyAgdHlwZWRlZiByb3BlPHdjaGFyX3Q+IHdyb3BlOworCisgIGlubGluZSBjcm9wZTo6cmVmZXJlbmNlCisgIF9fbXV0YWJsZV9yZWZlcmVuY2VfYXQoY3JvcGUmIF9fYywgc2l6ZV90IF9faSkKKyAgeyByZXR1cm4gX19jLm11dGFibGVfcmVmZXJlbmNlX2F0KF9faSk7IH0KKworICBpbmxpbmUgd3JvcGU6OnJlZmVyZW5jZQorICBfX211dGFibGVfcmVmZXJlbmNlX2F0KHdyb3BlJiBfX2MsIHNpemVfdCBfX2kpCisgIHsgcmV0dXJuIF9fYy5tdXRhYmxlX3JlZmVyZW5jZV9hdChfX2kpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChyb3BlPF9DaGFyVCwgX0FsbG9jPiYgX194LCByb3BlPF9DaGFyVCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7IAorbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4Ojpjcm9wZT4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4Ojpjcm9wZSYgX19zdHIpIGNvbnN0CisgICAgICB7CisJc2l6ZV90IF9fc2l6ZSA9IF9fc3RyLnNpemUoKTsKKwlpZiAoMCA9PSBfX3NpemUpCisJICByZXR1cm4gMDsKKwlyZXR1cm4gMTMgKiBfX3N0clswXSArIDUgKiBfX3N0cltfX3NpemUgLSAxXSArIF9fc2l6ZTsKKyAgICAgIH0KKyAgICB9OworCisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6d3JvcGU+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6d3JvcGUmIF9fc3RyKSBjb25zdAorICAgICAgeworCXNpemVfdCBfX3NpemUgPSBfX3N0ci5zaXplKCk7CisJaWYgKDAgPT0gX19zaXplKQorCSAgcmV0dXJuIDA7CisJcmV0dXJuIDEzICogX19zdHJbMF0gKyA1ICogX19zdHJbX19zaXplIC0gMV0gKyBfX3NpemU7CisgICAgICB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSB0cjEKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjIGluY2x1ZGUgPGV4dC9yb3BlaW1wbC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3JvcGVpbXBsLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9yb3BlaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2I4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9yb3BlaW1wbC5oCkBAIC0wLDAgKzEsMTcwNCBAQAorLy8gU0dJJ3Mgcm9wZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSByb3BlaW1wbC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3JvcGV9CisgKi8KKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKworI2luY2x1ZGUgPGV4dC9hbGdvcml0aG0+IC8vIEZvciBjb3B5X24gYW5kIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkKKyNpbmNsdWRlIDxleHQvbWVtb3J5PiAvLyBGb3IgdW5pbml0aWFsaXplZF9jb3B5X24KKyNpbmNsdWRlIDxleHQvbnVtZXJpYz4gLy8gRm9yIHBvd2VyCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwcmludGY7CisgIHVzaW5nIHN0ZDo6YmFzaWNfb3N0cmVhbTsKKyAgdXNpbmcgc3RkOjpfX3Rocm93X2xlbmd0aF9lcnJvcjsKKyAgdXNpbmcgc3RkOjpfRGVzdHJveTsKKyAgdXNpbmcgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGxfbjsKKworICAvLyBTZXQgYnVmX3N0YXJ0LCBidWZfZW5kLCBhbmQgYnVmX3B0ciBhcHByb3ByaWF0ZWx5LCBmaWxsaW5nIHRtcF9idWYKKyAgLy8gaWYgbmVjZXNzYXJ5LiAgQXNzdW1lcyBfTV9wYXRoX2VuZFtsZWFmX2luZGV4XSBhbmQgbGVhZl9wb3MgYXJlIGNvcnJlY3QuCisgIC8vIFJlc3VsdHMgaW4gYSB2YWxpZCBidWZfcHRyIGlmIHRoZSBpdGVyYXRvciBjYW4gYmUgbGVnaXRpbWF0ZWx5CisgIC8vIGRlcmVmZXJlbmNlZC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1Nfc2V0YnVmKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fbGVhZiA9IF9feC5fTV9wYXRoX2VuZFtfX3guX01fbGVhZl9pbmRleF07CisgICAgICBzaXplX3QgX19sZWFmX3BvcyA9IF9feC5fTV9sZWFmX3BvczsKKyAgICAgIHNpemVfdCBfX3BvcyA9IF9feC5fTV9jdXJyZW50X3BvczsKKworICAgICAgc3dpdGNoKF9fbGVhZi0+X01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgX194Ll9NX2J1Zl9zdGFydCA9ICgoX1JvcGVfUm9wZUxlYWY8X0NoYXJULCBfQWxsb2M+KilfX2xlYWYpLT5fTV9kYXRhOworCSAgX194Ll9NX2J1Zl9wdHIgPSBfX3guX01fYnVmX3N0YXJ0ICsgKF9fcG9zIC0gX19sZWFmX3Bvcyk7CisJICBfX3guX01fYnVmX2VuZCA9IF9feC5fTV9idWZfc3RhcnQgKyBfX2xlYWYtPl9NX3NpemU7CisJICBicmVhazsKKwljYXNlIF9fZGV0YWlsOjpfU19mdW5jdGlvbjoKKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgIHsKKwkgICAgc2l6ZV90IF9fbGVuID0gX1NfaXRlcmF0b3JfYnVmX2xlbjsKKwkgICAgc2l6ZV90IF9fYnVmX3N0YXJ0X3BvcyA9IF9fbGVhZl9wb3M7CisJICAgIHNpemVfdCBfX2xlYWZfZW5kID0gX19sZWFmX3BvcyArIF9fbGVhZi0+X01fc2l6ZTsKKwkgICAgY2hhcl9wcm9kdWNlcjxfQ2hhclQ+KiBfX2ZuID0gKChfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULAorCQkJCQkgICAgX0FsbG9jPiopX19sZWFmKS0+X01fZm47CisJICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA8PSBfX3BvcykKKwkgICAgICB7CisJCV9fYnVmX3N0YXJ0X3BvcyA9IF9fcG9zIC0gX19sZW4gLyA0OworCQlpZiAoX19idWZfc3RhcnRfcG9zICsgX19sZW4gPiBfX2xlYWZfZW5kKQorCQkgIF9fYnVmX3N0YXJ0X3BvcyA9IF9fbGVhZl9lbmQgLSBfX2xlbjsKKwkgICAgICB9CisJICAgIGlmIChfX2J1Zl9zdGFydF9wb3MgKyBfX2xlbiA+IF9fbGVhZl9lbmQpCisJICAgICAgX19sZW4gPSBfX2xlYWZfZW5kIC0gX19idWZfc3RhcnRfcG9zOworCSAgICAoKl9fZm4pKF9fYnVmX3N0YXJ0X3BvcyAtIF9fbGVhZl9wb3MsIF9fbGVuLCBfX3guX01fdG1wX2J1Zik7CisJICAgIF9feC5fTV9idWZfcHRyID0gX194Ll9NX3RtcF9idWYgKyAoX19wb3MgLSBfX2J1Zl9zdGFydF9wb3MpOworCSAgICBfX3guX01fYnVmX3N0YXJ0ID0gX194Ll9NX3RtcF9idWY7CisJICAgIF9feC5fTV9idWZfZW5kID0gX194Ll9NX3RtcF9idWYgKyBfX2xlbjsKKwkgIH0KKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgfQorCisgIC8vIFNldCBwYXRoIGFuZCBidWZmZXIgaW5zaWRlIGEgcm9wZSBpdGVyYXRvci4gIFdlIGFzc3VtZSB0aGF0CisgIC8vIHBvcyBhbmQgcm9vdCBhcmUgYWxyZWFkeSBzZXQuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX3NldGNhY2hlKF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgeworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fcGF0aFtpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKSArIDFdOworICAgICAgY29uc3QgX1JvcGVSZXAqIF9fY3Vycl9yb3BlOworICAgICAgaW50IF9fY3Vycl9kZXB0aCA9IC0xOyAgLyogaW5kZXggaW50byBwYXRoICAgICovCisgICAgICBzaXplX3QgX19jdXJyX3N0YXJ0X3BvcyA9IDA7CisgICAgICBzaXplX3QgX19wb3MgPSBfX3guX01fY3VycmVudF9wb3M7CisgICAgICB1bnNpZ25lZCBjaGFyIF9fZGlybnMgPSAwOyAvLyBCaXQgdmVjdG9yIG1hcmtpbmcgcmlnaHQgdHVybnMgaW4gdGhlIHBhdGgKKworICAgICAgaWYgKF9fcG9zID49IF9feC5fTV9yb290LT5fTV9zaXplKQorCXsKKwkgIF9feC5fTV9idWZfcHRyID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBfX2N1cnJfcm9wZSA9IF9feC5fTV9yb290OworICAgICAgaWYgKDAgIT0gX19jdXJyX3JvcGUtPl9NX2Nfc3RyaW5nKQorCXsKKwkgIC8qIFRyZWF0IHRoZSByb290IGFzIGEgbGVhZi4gKi8KKwkgIF9feC5fTV9idWZfc3RhcnQgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmc7CisJICBfX3guX01fYnVmX2VuZCA9IF9fY3Vycl9yb3BlLT5fTV9jX3N0cmluZyArIF9fY3Vycl9yb3BlLT5fTV9zaXplOworCSAgX194Ll9NX2J1Zl9wdHIgPSBfX2N1cnJfcm9wZS0+X01fY19zdHJpbmcgKyBfX3BvczsKKwkgIF9feC5fTV9wYXRoX2VuZFswXSA9IF9fY3Vycl9yb3BlOworCSAgX194Ll9NX2xlYWZfaW5kZXggPSAwOworCSAgX194Ll9NX2xlYWZfcG9zID0gMDsKKwkgIHJldHVybjsKKwl9CisgICAgICBmb3IoOzspCisJeworCSAgKytfX2N1cnJfZGVwdGg7CisJICBfX3BhdGhbX19jdXJyX2RlcHRoXSA9IF9fY3Vycl9yb3BlOworCSAgc3dpdGNoKF9fY3Vycl9yb3BlLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIF9feC5fTV9sZWFmX3BvcyA9IF9fY3Vycl9zdGFydF9wb3M7CisJICAgICAgZ290byBkb25lOworCSAgICBjYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICAgICAgeworCQlfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qIF9fYyA9CisJCSAgKF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiopX19jdXJyX3JvcGU7CisJCV9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisJCXNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplOworCisJCV9fZGlybnMgPDw9IDE7CisJCWlmIChfX3BvcyA+PSBfX2N1cnJfc3RhcnRfcG9zICsgX19sZWZ0X2xlbikKKwkJICB7CisJCSAgICBfX2Rpcm5zIHw9IDE7CisJCSAgICBfX2N1cnJfcm9wZSA9IF9fYy0+X01fcmlnaHQ7CisJCSAgICBfX2N1cnJfc3RhcnRfcG9zICs9IF9fbGVmdF9sZW47CisJCSAgfQorCQllbHNlCisJCSAgX19jdXJyX3JvcGUgPSBfX2xlZnQ7CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIGRvbmU6CisgICAgICAvLyBDb3B5IGxhc3Qgc2VjdGlvbiBvZiBwYXRoIGludG8gX01fcGF0aF9lbmQuCisgICAgICB7CisJaW50IF9faSA9IC0xOworCWludCBfX2ogPSBfX2N1cnJfZGVwdGggKyAxIC0gaW50KF9TX3BhdGhfY2FjaGVfbGVuKTsKKworCWlmIChfX2ogPCAwKSBfX2ogPSAwOworCXdoaWxlIChfX2ogPD0gX19jdXJyX2RlcHRoKQorCSAgX194Ll9NX3BhdGhfZW5kWysrX19pXSA9IF9fcGF0aFtfX2orK107CisJX194Ll9NX2xlYWZfaW5kZXggPSBfX2k7CisgICAgICB9CisgICAgICBfX3guX01fcGF0aF9kaXJlY3Rpb25zID0gX19kaXJuczsKKyAgICAgIF9TX3NldGJ1ZihfX3gpOworICAgIH0KKworICAvLyBTcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZS4gIEFzc3VtZXMgdGhhdAorICAvLyB0aGUgcGF0aCBjYWNoZSBpcyB2YWxpZCBmb3IgdGhlIHByZXZpb3VzIHBvc2l0aW9uLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19zZXRjYWNoZV9mb3JfaW5jcihfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIGludCBfX2N1cnJlbnRfaW5kZXggPSBfX3guX01fbGVhZl9pbmRleDsKKyAgICAgIGNvbnN0IF9Sb3BlUmVwKiBfX2N1cnJlbnRfbm9kZSA9IF9feC5fTV9wYXRoX2VuZFtfX2N1cnJlbnRfaW5kZXhdOworICAgICAgc2l6ZV90IF9fbGVuID0gX19jdXJyZW50X25vZGUtPl9NX3NpemU7CisgICAgICBzaXplX3QgX19ub2RlX3N0YXJ0X3BvcyA9IF9feC5fTV9sZWFmX3BvczsKKyAgICAgIHVuc2lnbmVkIGNoYXIgX19kaXJucyA9IF9feC5fTV9wYXRoX2RpcmVjdGlvbnM7CisgICAgICBfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qIF9fYzsKKworICAgICAgaWYgKF9feC5fTV9jdXJyZW50X3BvcyAtIF9fbm9kZV9zdGFydF9wb3MgPCBfX2xlbikKKwl7CisJICAvKiBNb3JlIHN0dWZmIGluIHRoaXMgbGVhZiwgd2UganVzdCBkaWRuJ3QgY2FjaGUgaXQuICovCisJICBfU19zZXRidWYoX194KTsKKwkgIHJldHVybjsKKwl9CisgICAgICAvLyAgbm9kZV9zdGFydF9wb3MgaXMgc3RhcnRpbmcgcG9zaXRpb24gb2YgbGFzdF9ub2RlLgorICAgICAgd2hpbGUgKC0tX19jdXJyZW50X2luZGV4ID49IDApCisJeworCSAgaWYgKCEoX19kaXJucyAmIDEpIC8qIFBhdGggdHVybmVkIGxlZnQgKi8pCisJICAgIGJyZWFrOworCSAgX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmRbX19jdXJyZW50X2luZGV4XTsKKwkgIF9fYyA9IChfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qKV9fY3VycmVudF9ub2RlOworCSAgLy8gT3RoZXJ3aXNlIHdlIHdlcmUgaW4gdGhlIHJpZ2h0IGNoaWxkLiAgVGh1cyB3ZSBzaG91bGQgcG9wCisJICAvLyB0aGUgY29uY2F0ZW5hdGlvbiBub2RlLgorCSAgX19ub2RlX3N0YXJ0X3BvcyAtPSBfX2MtPl9NX2xlZnQtPl9NX3NpemU7CisJICBfX2Rpcm5zID4+PSAxOworCX0KKyAgICAgIGlmIChfX2N1cnJlbnRfaW5kZXggPCAwKQorCXsKKwkgIC8vIFdlIHVuZGVyZmxvd2VkIHRoZSBjYWNoZS4gUHVudC4KKwkgIF9TX3NldGNhY2hlKF9feCk7CisJICByZXR1cm47CisJfQorICAgICAgX19jdXJyZW50X25vZGUgPSBfX3guX01fcGF0aF9lbmRbX19jdXJyZW50X2luZGV4XTsKKyAgICAgIF9fYyA9IChfUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz4qKV9fY3VycmVudF9ub2RlOworICAgICAgLy8gY3VycmVudF9ub2RlIGlzIGEgY29uY2F0ZW5hdGlvbiBub2RlLiAgV2UgYXJlIHBvc2l0aW9uZWQgb24gdGhlIGZpcnN0CisgICAgICAvLyBjaGFyYWN0ZXIgaW4gaXRzIHJpZ2h0IGNoaWxkLgorICAgICAgLy8gbm9kZV9zdGFydF9wb3MgaXMgc3RhcnRpbmcgcG9zaXRpb24gb2YgY3VycmVudF9ub2RlLgorICAgICAgX19ub2RlX3N0YXJ0X3BvcyArPSBfX2MtPl9NX2xlZnQtPl9NX3NpemU7CisgICAgICBfX2N1cnJlbnRfbm9kZSA9IF9fYy0+X01fcmlnaHQ7CisgICAgICBfX3guX01fcGF0aF9lbmRbKytfX2N1cnJlbnRfaW5kZXhdID0gX19jdXJyZW50X25vZGU7CisgICAgICBfX2Rpcm5zIHw9IDE7CisgICAgICB3aGlsZSAoX19kZXRhaWw6Ol9TX2NvbmNhdCA9PSBfX2N1cnJlbnRfbm9kZS0+X01fdGFnKQorCXsKKwkgICsrX19jdXJyZW50X2luZGV4OworCSAgaWYgKGludChfU19wYXRoX2NhY2hlX2xlbikgPT0gX19jdXJyZW50X2luZGV4KQorCSAgICB7CisJICAgICAgaW50IF9faTsKKwkgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IGludChfU19wYXRoX2NhY2hlX2xlbikgLSAxOyBfX2krKykKKwkJX194Ll9NX3BhdGhfZW5kW19faV0gPSBfX3guX01fcGF0aF9lbmRbX19pKzFdOworCSAgICAgIC0tX19jdXJyZW50X2luZGV4OworCSAgICB9CisJICBfX2N1cnJlbnRfbm9kZSA9CisJICAgICgoX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULCBfQWxsb2M+KilfX2N1cnJlbnRfbm9kZSktPl9NX2xlZnQ7CisJICBfX3guX01fcGF0aF9lbmRbX19jdXJyZW50X2luZGV4XSA9IF9fY3VycmVudF9ub2RlOworCSAgX19kaXJucyA8PD0gMTsKKwkgIC8vIG5vZGVfc3RhcnRfcG9zIGlzIHVuY2hhbmdlZC4KKwl9CisgICAgICBfX3guX01fbGVhZl9pbmRleCA9IF9fY3VycmVudF9pbmRleDsKKyAgICAgIF9feC5fTV9sZWFmX3BvcyA9IF9fbm9kZV9zdGFydF9wb3M7CisgICAgICBfX3guX01fcGF0aF9kaXJlY3Rpb25zID0gX19kaXJuczsKKyAgICAgIF9TX3NldGJ1ZihfX3gpOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9pbmNyKHNpemVfdCBfX24pCisgICAgeworICAgICAgX01fY3VycmVudF9wb3MgKz0gX19uOworICAgICAgaWYgKDAgIT0gX01fYnVmX3B0cikKKwl7CisJICBzaXplX3QgX19jaGFyc19sZWZ0ID0gX01fYnVmX2VuZCAtIF9NX2J1Zl9wdHI7CisJICBpZiAoX19jaGFyc19sZWZ0ID4gX19uKQorCSAgICBfTV9idWZfcHRyICs9IF9fbjsKKwkgIGVsc2UgaWYgKF9fY2hhcnNfbGVmdCA9PSBfX24pCisJICAgIHsKKwkgICAgICBfTV9idWZfcHRyICs9IF9fbjsKKwkgICAgICBfU19zZXRjYWNoZV9mb3JfaW5jcigqdGhpcyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX01fYnVmX3B0ciA9IDA7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yX2Jhc2U8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9kZWNyKHNpemVfdCBfX24pCisgICAgeworICAgICAgaWYgKDAgIT0gX01fYnVmX3B0cikKKwl7CisJICBzaXplX3QgX19jaGFyc19sZWZ0ID0gX01fYnVmX3B0ciAtIF9NX2J1Zl9zdGFydDsKKwkgIGlmIChfX2NoYXJzX2xlZnQgPj0gX19uKQorCSAgICBfTV9idWZfcHRyIC09IF9fbjsKKwkgIGVsc2UKKwkgICAgX01fYnVmX3B0ciA9IDA7CisJfQorICAgICAgX01fY3VycmVudF9wb3MgLT0gX19uOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX01fY2hlY2soKQorICAgIHsKKyAgICAgIGlmIChfTV9yb290X3JvcGUtPl9NX3RyZWVfcHRyICE9IHRoaXMtPl9NX3Jvb3QpCisJeworCSAgLy8gX1JvcGUgd2FzIG1vZGlmaWVkLiAgR2V0IHRoaW5ncyBmaXhlZCB1cC4KKwkgIF9Sb3BlUmVwOjpfU191bnJlZih0aGlzLT5fTV9yb290KTsKKwkgIHRoaXMtPl9NX3Jvb3QgPSBfTV9yb290X3JvcGUtPl9NX3RyZWVfcHRyOworCSAgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsKKwkgIHRoaXMtPl9NX2J1Zl9wdHIgPSAwOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZQorICAgIF9Sb3BlX2NvbnN0X2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1JvcGVfY29uc3RfaXRlcmF0b3IoY29uc3QgX1JvcGVfaXRlcmF0b3I8X0NoYXJULCBfQWxsb2M+JiBfX3gpCisgICAgOiBfUm9wZV9pdGVyYXRvcl9iYXNlPF9DaGFyVCwgX0FsbG9jPihfX3gpCisgICAgeyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZQorICAgIF9Sb3BlX2l0ZXJhdG9yPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1JvcGVfaXRlcmF0b3Iocm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fciwgc2l6ZV90IF9fcG9zKQorICAgIDogX1JvcGVfaXRlcmF0b3JfYmFzZTxfQ2hhclQsX0FsbG9jPihfX3IuX01fdHJlZV9wdHIsIF9fcG9zKSwKKyAgICAgIF9NX3Jvb3Rfcm9wZSgmX19yKQorICAgIHsgX1JvcGVSZXA6Ol9TX3JlZih0aGlzLT5fTV9yb290KTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2NoYXJfcHRyX2xlbihjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBjb25zdCBfQ2hhclQqIF9fcCA9IF9fczsKKyAgICAgIAorICAgICAgd2hpbGUgKCFfU19pczAoKl9fcCkpCisJKytfX3A7CisgICAgICByZXR1cm4gKF9fcCAtIF9fcyk7CisgICAgfQorCisKKyNpZm5kZWYgX19HQworCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfTV9mcmVlX2Nfc3RyaW5nKCkKKyAgICB7CisgICAgICBfQ2hhclQqIF9fY3N0ciA9IF9NX2Nfc3RyaW5nOworICAgICAgaWYgKDAgIT0gX19jc3RyKQorCXsKKwkgIHNpemVfdCBfX3NpemUgPSB0aGlzLT5fTV9zaXplICsgMTsKKwkgIF9EZXN0cm95KF9fY3N0ciwgX19jc3RyICsgX19zaXplLCBfTV9nZXRfYWxsb2NhdG9yKCkpOworCSAgdGhpcy0+X0RhdGFfZGVhbGxvY2F0ZShfX2NzdHIsIF9fc2l6ZSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZnJlZV9zdHJpbmcoX0NoYXJUKiBfX3MsIHNpemVfdCBfX24sIGFsbG9jYXRvcl90eXBlJiBfX2EpCisgICAgeworICAgICAgaWYgKCFfU19pc19iYXNpY19jaGFyX3R5cGUoKF9DaGFyVCopMCkpCisJX0Rlc3Ryb3koX19zLCBfX3MgKyBfX24sIF9fYSk7CisgICAgICAKKyAgICAgIC8vICBUaGlzIGhhcyB0byBiZSBhIHN0YXRpYyBtZW1iZXIsIHNvIHRoaXMgZ2V0cyBhIGJpdCBtZXNzeQorICAgICAgX19hLmRlYWxsb2NhdGUoX19zLAorCQkgICAgIF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPjo6X1Nfcm91bmRlZF91cF9zaXplKF9fbikpOworICAgIH0KKworICAvLyAgVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBmb3Igbm90IGRvaW5nIHRoaXMgd2l0aCB2aXJ0dWFsIGRlc3RydWN0b3JzCisgIC8vICBhbmQgYSBjbGFzcyBzcGVjaWZpYyBkZWxldGUgb3BlcmF0b3I6CisgIC8vICAtIEEgY2xhc3Mgc3BlY2lmaWMgZGVsZXRlIG9wZXJhdG9yIGNhbid0IGVhc2lseSBnZXQgYWNjZXNzIHRvCisgIC8vICAgIGFsbG9jYXRvciBpbnN0YW5jZXMgaWYgd2UgbmVlZCB0aGVtLgorICAvLyAgLSBBbnkgdmlydHVhbCBmdW5jdGlvbiB3b3VsZCBuZWVkIGEgNCBvciBieXRlIHZ0YWJsZSBwb2ludGVyOworICAvLyAgICB0aGlzIG9ubHkgcmVxdWlyZXMgYSBvbmUgYnl0ZSB0YWcgcGVyIG9iamVjdC4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfUm9wZV9Sb3BlUmVwPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX01fZnJlZV90cmVlKCkKKyAgICB7CisgICAgICBzd2l0Y2goX01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19sZWFmOgorCSAgeworCSAgICBfUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz4qIF9fbAorCSAgICAgID0gKF9Sb3BlX1JvcGVMZWFmPF9DaGFyVCwgX0FsbG9jPiopdGhpczsKKwkgICAgX19sLT5fUm9wZV9Sb3BlTGVhZjxfQ2hhclQsIF9BbGxvYz46On5fUm9wZV9Sb3BlTGVhZigpOworCSAgICBfTF9kZWFsbG9jYXRlKF9fbCwgMSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX2NvbmNhdDoKKwkgIHsKKwkgICAgX1JvcGVfUm9wZUNvbmNhdGVuYXRpb248X0NoYXJULF9BbGxvYz4qIF9fYworCSAgICAgID0gKF9Sb3BlX1JvcGVDb25jYXRlbmF0aW9uPF9DaGFyVCwgX0FsbG9jPiopdGhpczsKKwkgICAgX19jLT5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbjxfQ2hhclQsIF9BbGxvYz46OgorCSAgICAgIH5fUm9wZV9Sb3BlQ29uY2F0ZW5hdGlvbigpOworCSAgICBfQ19kZWFsbG9jYXRlKF9fYywgMSk7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCSAgeworCSAgICBfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+KiBfX2YKKwkgICAgICA9IChfUm9wZV9Sb3BlRnVuY3Rpb248X0NoYXJULCBfQWxsb2M+Kil0aGlzOworCSAgICBfX2YtPl9Sb3BlX1JvcGVGdW5jdGlvbjxfQ2hhclQsIF9BbGxvYz46On5fUm9wZV9Sb3BlRnVuY3Rpb24oKTsKKwkgICAgX0ZfZGVhbGxvY2F0ZShfX2YsIDEpOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgIHsKKwkgICAgX1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz4qIF9fc3MgPQorCSAgICAgIChfUm9wZV9Sb3BlU3Vic3RyaW5nPF9DaGFyVCwgX0FsbG9jPiopdGhpczsKKwkgICAgX19zcy0+X1JvcGVfUm9wZVN1YnN0cmluZzxfQ2hhclQsIF9BbGxvYz46OgorCSAgICAgIH5fUm9wZV9Sb3BlU3Vic3RyaW5nKCk7CisJICAgIF9TX2RlYWxsb2NhdGUoX19zcywgMSk7CisJICAgIGJyZWFrOworCSAgfQorCX0KKyAgICB9CisjZWxzZQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX1JvcGVSZXA8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mcmVlX3N0cmluZyhjb25zdCBfQ2hhclQqLCBzaXplX3QsIGFsbG9jYXRvcl90eXBlKQorICAgIHsgfQorCisjZW5kaWYKKworICAvLyBDb25jYXRlbmF0ZSBhIEMgc3RyaW5nIG9udG8gYSBsZWFmIHJvcGUgYnkgY29weWluZyB0aGUgcm9wZSBkYXRhLgorICAvLyBVc2VkIGZvciBzaG9ydCByb3Blcy4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZUxlYWYqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwgY29uc3QgX0NoYXJUKiBfX2l0ZXIsIHNpemVfdCBfX2xlbikKKyAgICB7CisgICAgICBzaXplX3QgX19vbGRfbGVuID0gX19yLT5fTV9zaXplOworICAgICAgX0NoYXJUKiBfX25ld19kYXRhID0gKF9DaGFyVCopCisJX0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fb2xkX2xlbiArIF9fbGVuKSk7CisgICAgICBfUm9wZUxlYWYqIF9fcmVzdWx0OworCisgICAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfX3ItPl9NX2RhdGEsIF9fb2xkX2xlbiwgX19uZXdfZGF0YSk7CisgICAgICB1bmluaXRpYWxpemVkX2NvcHlfbihfX2l0ZXIsIF9fbGVuLCBfX25ld19kYXRhICsgX19vbGRfbGVuKTsKKyAgICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9fbmV3X2RhdGFbX19vbGRfbGVuICsgX19sZW5dKTsKKyAgICAgIF9fdHJ5CisJeworCSAgX19yZXN1bHQgPSBfU19uZXdfUm9wZUxlYWYoX19uZXdfZGF0YSwgX19vbGRfbGVuICsgX19sZW4sCisJCQkJICAgICBfX3ItPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fbmV3X2RhdGEsIF9fb2xkX2xlbiArIF9fbGVuLAorCQkJCSAgICAgIF9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyNpZm5kZWYgX19HQworICAvLyBBcyBhYm92ZSwgYnV0IGl0J3MgT0sgdG8gY2xvYmJlciBvcmlnaW5hbCBpZiByZWZjb3VudCBpcyAxCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSByb3BlPF9DaGFyVCxfQWxsb2M+OjpfUm9wZUxlYWYqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2Rlc3RyX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfUm9wZUxlYWYqIF9fciwgY29uc3QgX0NoYXJUKiBfX2l0ZXIsCisJCQkJICAgc2l6ZV90IF9fbGVuKQorICAgIHsKKyAgICAgIGlmIChfX3ItPl9NX3JlZl9jb3VudCA+IDEpCisJcmV0dXJuIF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX3IsIF9faXRlciwgX19sZW4pOworICAgICAgc2l6ZV90IF9fb2xkX2xlbiA9IF9fci0+X01fc2l6ZTsKKyAgICAgIGlmIChfU19hbGxvY2F0ZWRfY2FwYWNpdHkoX19vbGRfbGVuKSA+PSBfX29sZF9sZW4gKyBfX2xlbikKKwl7CisJICAvLyBUaGUgc3BhY2UgaGFzIGJlZW4gcGFydGlhbGx5IGluaXRpYWxpemVkIGZvciB0aGUgc3RhbmRhcmQKKwkgIC8vIGNoYXJhY3RlciB0eXBlcy4gIEJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyIGZvciB0aG9zZSB0eXBlcy4KKwkgIHVuaW5pdGlhbGl6ZWRfY29weV9uKF9faXRlciwgX19sZW4sIF9fci0+X01fZGF0YSArIF9fb2xkX2xlbik7CisJICBpZiAoX1NfaXNfYmFzaWNfY2hhcl90eXBlKChfQ2hhclQqKTApKQorCSAgICBfU19jb25kX3N0b3JlX2VvcyhfX3ItPl9NX2RhdGFbX19vbGRfbGVuICsgX19sZW5dKTsKKwkgIGVsc2UgaWYgKF9fci0+X01fY19zdHJpbmcgIT0gX19yLT5fTV9kYXRhICYmIDAgIT0gX19yLT5fTV9jX3N0cmluZykKKwkgICAgeworCSAgICAgIF9fci0+X01fZnJlZV9jX3N0cmluZygpOworCSAgICAgIF9fci0+X01fY19zdHJpbmcgPSAwOworCSAgICB9CisJICBfX3ItPl9NX3NpemUgPSBfX29sZF9sZW4gKyBfX2xlbjsKKwkgIF9fci0+X01fcmVmX2NvdW50ID0gMjsKKwkgIHJldHVybiBfX3I7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9Sb3BlTGVhZiogX19yZXN1bHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoX19yLCBfX2l0ZXIsIF9fbGVuKTsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgLy8gQXNzdW1lcyBsZWZ0IGFuZCByaWdodCBhcmUgbm90IDAuCisgIC8vIERvZXMgbm90IGluY3JlbWVudCAobm9yIGRlY3JlbWVudCBvbiBleGNlcHRpb24pIGNoaWxkIHJlZmVyZW5jZSBjb3VudHMuCisgIC8vIFJlc3VsdCBoYXMgcmVmIGNvdW50IDEuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X1JvcGVSZXAqCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX3RyZWVfY29uY2F0KF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19yZXN1bHQgPSBfU19uZXdfUm9wZUNvbmNhdGVuYXRpb24oX19sZWZ0LCBfX3JpZ2h0LAorCQkJCQkJCSAgICAgIF9fbGVmdC0+CisJCQkJCQkJICAgICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIHNpemVfdCBfX2RlcHRoID0gX19yZXN1bHQtPl9NX2RlcHRoOworICAgICAgCisgICAgICBpZiAoX19kZXB0aCA+IDIwCisJICAmJiAoX19yZXN1bHQtPl9NX3NpemUgPCAxMDAwCisJICAgICAgfHwgX19kZXB0aCA+IHNpemVfdChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpKSkKKwl7CisJICBfUm9wZVJlcCogX19iYWxhbmNlZDsKKworCSAgX190cnkKKwkgICAgeworCSAgICAgIF9fYmFsYW5jZWQgPSBfU19iYWxhbmNlKF9fcmVzdWx0KTsKKwkgICAgICBfX3Jlc3VsdC0+X01fdW5yZWZfbm9ubmlsKCk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX0NfZGVhbGxvY2F0ZShfX3Jlc3VsdCwxKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgLy8gSW4gY2FzZSBvZiBleGNlcHRpb24sIHdlIG5lZWQgdG8gZGVhbGxvY2F0ZQorCSAgLy8gb3RoZXJ3aXNlIGRhbmdsaW5nIHJlc3VsdCBub2RlLiAgQnV0IGNhbGxlcgorCSAgLy8gc3RpbGwgb3ducyBpdHMgY2hpbGRyZW4uICBUaHVzIHVucmVmIGlzCisJICAvLyBpbmFwcHJvcHJpYXRlLgorCSAgcmV0dXJuIF9fYmFsYW5jZWQ7CisJfQorICAgICAgZWxzZQorCXJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfY29uY2F0X2NoYXJfaXRlcihfUm9wZVJlcCogX19yLCBjb25zdCBfQ2hhclQqX19zLCBzaXplX3QgX19zbGVuKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKKyAgICAgIGlmICgwID09IF9fc2xlbikKKwl7CisJICBfU19yZWYoX19yKTsKKwkgIHJldHVybiBfX3I7CisJfQorICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiBfX1NUTF9ST1BFX0ZST01fVU5PV05FRF9DSEFSX1BUUihfX3MsIF9fc2xlbiwKKwkJCQkJCV9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIGlmIChfX3ItPl9NX3RhZyA9PSBfX2RldGFpbDo6X1NfbGVhZgorCSAgJiYgX19yLT5fTV9zaXplICsgX19zbGVuIDw9IHNpemVfdChfU19jb3B5X21heCkpCisJeworCSAgX19yZXN1bHQgPSBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yLCBfX3MsIF9fc2xlbik7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgICAgaWYgKF9fZGV0YWlsOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcKKwkgICYmIF9fZGV0YWlsOjpfU19sZWFmID09ICgoX1JvcGVDb25jYXRlbmF0aW9uKikgX19yKS0+X01fcmlnaHQtPl9NX3RhZykKKwl7CisJICBfUm9wZUxlYWYqIF9fcmlnaHQgPQorCSAgICAoX1JvcGVMZWFmKiApKCgoX1JvcGVDb25jYXRlbmF0aW9uKiApX19yKS0+X01fcmlnaHQpOworCSAgaWYgKF9fcmlnaHQtPl9NX3NpemUgKyBfX3NsZW4gPD0gc2l6ZV90KF9TX2NvcHlfbWF4KSkKKwkgICAgeworCSAgICAgIF9Sb3BlUmVwKiBfX2xlZnQgPSAoKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yKS0+X01fbGVmdDsKKwkgICAgICBfUm9wZVJlcCogX19ucmlnaHQgPQorCQlfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yaWdodCwgX19zLCBfX3NsZW4pOworCSAgICAgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOworCSAgICAgIF9fdHJ5CisJCXsgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX2xlZnQsIF9fbnJpZ2h0KTsgfQorCSAgICAgIF9fY2F0Y2goLi4uKQorCQl7CisJCSAgX1NfdW5yZWYoX19sZWZ0KTsKKwkJICBfU191bnJlZihfX25yaWdodCk7CisJCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJCX0KKwkgICAgICByZXR1cm4gX19yZXN1bHQ7CisJICAgIH0KKwl9CisgICAgICBfUm9wZVJlcCogX19ucmlnaHQgPQorCV9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fcywgX19zbGVuLCBfX3ItPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICBfX3RyeQorCXsKKwkgIF9fci0+X01fcmVmX25vbm5pbCgpOworCSAgX19yZXN1bHQgPSBfU190cmVlX2NvbmNhdChfX3IsIF9fbnJpZ2h0KTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfU191bnJlZihfX3IpOworCSAgX1NfdW5yZWYoX19ucmlnaHQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworI2lmbmRlZiBfX0dDCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB0eXBlbmFtZSByb3BlPF9DaGFyVCxfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCxfQWxsb2M+OjoKKyAgICBfU19kZXN0cl9jb25jYXRfY2hhcl9pdGVyKF9Sb3BlUmVwKiBfX3IsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3QgX19zbGVuKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdDsKKyAgICAgIGlmICgwID09IF9fcikKKwlyZXR1cm4gX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX3NsZW4sCisJCQkJCQlfX3ItPl9NX2dldF9hbGxvY2F0b3IoKSk7CisgICAgICBzaXplX3QgX19jb3VudCA9IF9fci0+X01fcmVmX2NvdW50OworICAgICAgc2l6ZV90IF9fb3JpZ19zaXplID0gX19yLT5fTV9zaXplOworICAgICAgaWYgKF9fY291bnQgPiAxKQorCXJldHVybiBfU19jb25jYXRfY2hhcl9pdGVyKF9fciwgX19zLCBfX3NsZW4pOworICAgICAgaWYgKDAgPT0gX19zbGVuKQorCXsKKwkgIF9fci0+X01fcmVmX2NvdW50ID0gMjsgICAgICAvLyBPbmUgbW9yZSB0aGFuIGJlZm9yZQorCSAgcmV0dXJuIF9fcjsKKwl9CisgICAgICBpZiAoX19vcmlnX3NpemUgKyBfX3NsZW4gPD0gc2l6ZV90KF9TX2NvcHlfbWF4KQorCSAgJiYgX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yLT5fTV90YWcpCisJeworCSAgX19yZXN1bHQgPSBfU19kZXN0cl9sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19yLCBfX3MsIAorCQkJCQkJICAgIF9fc2xlbik7CisJICByZXR1cm4gX19yZXN1bHQ7CisJfQorICAgICAgaWYgKF9fZGV0YWlsOjpfU19jb25jYXQgPT0gX19yLT5fTV90YWcpCisJeworCSAgX1JvcGVMZWFmKiBfX3JpZ2h0ID0gKF9Sb3BlTGVhZiopKCgoX1JvcGVDb25jYXRlbmF0aW9uKikKKwkJCQkJICAgICBfX3IpLT5fTV9yaWdodCk7CisJICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnCisJICAgICAgJiYgX19yaWdodC0+X01fc2l6ZSArIF9fc2xlbiA8PSBzaXplX3QoX1NfY29weV9tYXgpKQorCSAgICB7CisJICAgICAgX1JvcGVSZXAqIF9fbmV3X3JpZ2h0ID0KKwkJX1NfZGVzdHJfbGVhZl9jb25jYXRfY2hhcl9pdGVyKF9fcmlnaHQsIF9fcywgX19zbGVuKTsKKwkgICAgICBpZiAoX19yaWdodCA9PSBfX25ld19yaWdodCkKKwkJX19uZXdfcmlnaHQtPl9NX3JlZl9jb3VudCA9IDE7CisJICAgICAgZWxzZQorCQlfX3JpZ2h0LT5fTV91bnJlZl9ub25uaWwoKTsKKwkgICAgICBfX3ItPl9NX3JlZl9jb3VudCA9IDI7ICAgIC8vIE9uZSBtb3JlIHRoYW4gYmVmb3JlLgorCSAgICAgICgoX1JvcGVDb25jYXRlbmF0aW9uKilfX3IpLT5fTV9yaWdodCA9IF9fbmV3X3JpZ2h0OworCSAgICAgIF9fci0+X01fc2l6ZSA9IF9fb3JpZ19zaXplICsgX19zbGVuOworCSAgICAgIGlmICgwICE9IF9fci0+X01fY19zdHJpbmcpCisJCXsKKwkJICBfX3ItPl9NX2ZyZWVfY19zdHJpbmcoKTsKKwkJICBfX3ItPl9NX2Nfc3RyaW5nID0gMDsKKwkJfQorCSAgICAgIHJldHVybiBfX3I7CisJICAgIH0KKwl9CisgICAgICBfUm9wZVJlcCogX19yaWdodCA9CisJX19TVExfUk9QRV9GUk9NX1VOT1dORURfQ0hBUl9QVFIoX19zLCBfX3NsZW4sIF9fci0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKyAgICAgIF9fci0+X01fcmVmX25vbm5pbCgpOworICAgICAgX190cnkKKwl7IF9fcmVzdWx0ID0gX1NfdHJlZV9jb25jYXQoX19yLCBfX3JpZ2h0KTsgfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX1NfdW5yZWYoX19yKTsKKwkgIF9TX3VucmVmKF9fcmlnaHQpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKyNlbmRpZiAvKiAhX19HQyAqLworICAKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfY29uY2F0KF9Sb3BlUmVwKiBfX2xlZnQsIF9Sb3BlUmVwKiBfX3JpZ2h0KQorICAgIHsKKyAgICAgIGlmICgwID09IF9fbGVmdCkKKwl7CisJICBfU19yZWYoX19yaWdodCk7CisJICByZXR1cm4gX19yaWdodDsKKwl9CisgICAgICBpZiAoMCA9PSBfX3JpZ2h0KQorCXsKKwkgIF9fbGVmdC0+X01fcmVmX25vbm5pbCgpOworCSAgcmV0dXJuIF9fbGVmdDsKKwl9CisgICAgICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKQorCXsKKwkgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX2xlZnQtPl9NX3RhZykKKwkgICAgeworCSAgICAgIGlmIChfX3JpZ2h0LT5fTV9zaXplICsgX19sZWZ0LT5fTV9zaXplIDw9IHNpemVfdChfU19jb3B5X21heCkpCisJCXJldHVybiBfU19sZWFmX2NvbmNhdF9jaGFyX2l0ZXIoKF9Sb3BlTGVhZiopX19sZWZ0LAorCQkJCQkJKChfUm9wZUxlYWYqKV9fcmlnaHQpLT5fTV9kYXRhLAorCQkJCQkJX19yaWdodC0+X01fc2l6ZSk7CisJICAgIH0KKwkgIGVsc2UgaWYgKF9fZGV0YWlsOjpfU19jb25jYXQgPT0gX19sZWZ0LT5fTV90YWcKKwkJICAgJiYgX19kZXRhaWw6Ol9TX2xlYWYgPT0gKChfUm9wZUNvbmNhdGVuYXRpb24qKQorCQkJCQkJICAgX19sZWZ0KS0+X01fcmlnaHQtPl9NX3RhZykKKwkgICAgeworCSAgICAgIF9Sb3BlTGVhZiogX19sZWZ0cmlnaHQgPQorCQkoX1JvcGVMZWFmKikoKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fbGVmdCktPl9NX3JpZ2h0KTsKKwkgICAgICBpZiAoX19sZWZ0cmlnaHQtPl9NX3NpemUKKwkJICArIF9fcmlnaHQtPl9NX3NpemUgPD0gc2l6ZV90KF9TX2NvcHlfbWF4KSkKKwkJeworCQkgIF9Sb3BlUmVwKiBfX2xlZnRsZWZ0ID0gKChfUm9wZUNvbmNhdGVuYXRpb24qKV9fbGVmdCktPl9NX2xlZnQ7CisJCSAgX1JvcGVSZXAqIF9fcmVzdCA9IF9TX2xlYWZfY29uY2F0X2NoYXJfaXRlcihfX2xlZnRyaWdodCwKKwkJCQkJCQkgICAgICAoKF9Sb3BlTGVhZiopCisJCQkJCQkJICAgICAgIF9fcmlnaHQpLT4KKwkJCQkJCQkgICAgICBfTV9kYXRhLAorCQkJCQkJCSAgICAgIF9fcmlnaHQtPl9NX3NpemUpOworCQkgIF9fbGVmdGxlZnQtPl9NX3JlZl9ub25uaWwoKTsKKwkJICBfX3RyeQorCQkgICAgeyByZXR1cm4oX1NfdHJlZV9jb25jYXQoX19sZWZ0bGVmdCwgX19yZXN0KSk7IH0KKwkJICBfX2NhdGNoKC4uLikKKwkJICAgIHsKKwkJICAgICAgX1NfdW5yZWYoX19sZWZ0bGVmdCk7CisJCSAgICAgIF9TX3VucmVmKF9fcmVzdCk7CisJCSAgICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgICBfX2xlZnQtPl9NX3JlZl9ub25uaWwoKTsKKyAgICAgIF9fcmlnaHQtPl9NX3JlZl9ub25uaWwoKTsKKyAgICAgIF9fdHJ5CisJeyByZXR1cm4oX1NfdHJlZV9jb25jYXQoX19sZWZ0LCBfX3JpZ2h0KSk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIF9TX3VucmVmKF9fbGVmdCk7CisJICBfU191bnJlZihfX3JpZ2h0KTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1Nfc3Vic3RyaW5nKF9Sb3BlUmVwKiBfX2Jhc2UsIHNpemVfdCBfX3N0YXJ0LCBzaXplX3QgX19lbmRwMSkKKyAgICB7CisgICAgICBpZiAoMCA9PSBfX2Jhc2UpCisJcmV0dXJuIDA7CisgICAgICBzaXplX3QgX19sZW4gPSBfX2Jhc2UtPl9NX3NpemU7CisgICAgICBzaXplX3QgX19hZGpfZW5kcDE7CisgICAgICBjb25zdCBzaXplX3QgX19sYXp5X3RocmVzaG9sZCA9IDEyODsKKyAgICAgIAorICAgICAgaWYgKF9fZW5kcDEgPj0gX19sZW4pCisJeworCSAgaWYgKDAgPT0gX19zdGFydCkKKwkgICAgeworCSAgICAgIF9fYmFzZS0+X01fcmVmX25vbm5pbCgpOworCSAgICAgIHJldHVybiBfX2Jhc2U7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgX19hZGpfZW5kcDEgPSBfX2xlbjsKKwkgIAorCX0KKyAgICAgIGVsc2UKKwlfX2Fkal9lbmRwMSA9IF9fZW5kcDE7CisKKyAgICAgIHN3aXRjaChfX2Jhc2UtPl9NX3RhZykKKwl7CisJY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgICB7CisJICAgICAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX2Jhc2U7CisJICAgICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKwkgICAgICBfUm9wZVJlcCogX19yaWdodCA9IF9fYy0+X01fcmlnaHQ7CisJICAgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemU7CisJICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0OworCSAgICAgIAorCSAgICAgIGlmIChfX2Fkal9lbmRwMSA8PSBfX2xlZnRfbGVuKQorCQlyZXR1cm4gX1Nfc3Vic3RyaW5nKF9fbGVmdCwgX19zdGFydCwgX19lbmRwMSk7CisJICAgICAgZWxzZSBpZiAoX19zdGFydCA+PSBfX2xlZnRfbGVuKQorCQlyZXR1cm4gX1Nfc3Vic3RyaW5nKF9fcmlnaHQsIF9fc3RhcnQgLSBfX2xlZnRfbGVuLAorCQkJCSAgICBfX2Fkal9lbmRwMSAtIF9fbGVmdF9sZW4pOworCSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX2xlZnRfcmVzdWx0KF9TX3N1YnN0cmluZyhfX2xlZnQsCisJCQkJCQkJICAgIF9fc3RhcnQsCisJCQkJCQkJICAgIF9fbGVmdF9sZW4pKTsKKwkgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19yaWdodF9yZXN1bHQoX1Nfc3Vic3RyaW5nKF9fcmlnaHQsIDAsCisJCQkJCQkJICAgICBfX2VuZHAxIAorCQkJCQkJCSAgICAgLSBfX2xlZnRfbGVuKSk7CisJICAgICAgX19yZXN1bHQgPSBfU19jb25jYXQoX19sZWZ0X3Jlc3VsdCwgX19yaWdodF9yZXN1bHQpOworCSAgICAgIHJldHVybiBfX3Jlc3VsdDsKKwkgICAgfQorCWNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICB7CisJICAgIF9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19iYXNlOworCSAgICBfUm9wZUxlYWYqIF9fcmVzdWx0OworCSAgICBzaXplX3QgX19yZXN1bHRfbGVuOworCSAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworCSAgICBpZiAoX19yZXN1bHRfbGVuID4gX19sYXp5X3RocmVzaG9sZCkKKwkgICAgICBnb3RvIGxhenk7CisjaWZkZWYgX19HQworCSAgICBjb25zdCBfQ2hhclQqIF9fc2VjdGlvbiA9IF9fbC0+X01fZGF0YSArIF9fc3RhcnQ7CisJICAgIF9fcmVzdWx0ID0gX1NfbmV3X1JvcGVMZWFmKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorCQkJCSAgICAgICBfX2Jhc2UtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgIF9fcmVzdWx0LT5fTV9jX3N0cmluZyA9IDA7ICAvLyBOb3QgZW9zIHRlcm1pbmF0ZWQuCisjZWxzZQorCSAgICAvLyBXZSBzaG91bGQgc29tZXRpbWVzIGNyZWF0ZSBzdWJzdHJpbmcgbm9kZSBpbnN0ZWFkLgorCSAgICBfX3Jlc3VsdCA9IF9fU1RMX1JPUEVfRlJPTV9VTk9XTkVEX0NIQVJfUFRSKF9fbC0+X01fZGF0YSArIF9fc3RhcnQsCisJCQkJCQkJX19yZXN1bHRfbGVuLAorCQkJCQkJCV9fYmFzZS0+CisJCQkJCQkJX01fZ2V0X2FsbG9jYXRvcigpKTsKKyNlbmRpZgorCSAgICByZXR1cm4gX19yZXN1bHQ7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAvLyBBdm9pZCBpbnRyb2R1Y2luZyBtdWx0aXBsZSBsYXllcnMgb2Ygc3Vic3RyaW5nIG5vZGVzLgorCSAgeworCSAgICBfUm9wZVN1YnN0cmluZyogX19vbGQgPSAoX1JvcGVTdWJzdHJpbmcqKV9fYmFzZTsKKwkgICAgc2l6ZV90IF9fcmVzdWx0X2xlbjsKKwkgICAgaWYgKF9fc3RhcnQgPj0gX19hZGpfZW5kcDEpCisJICAgICAgcmV0dXJuIDA7CisJICAgIF9fcmVzdWx0X2xlbiA9IF9fYWRqX2VuZHAxIC0gX19zdGFydDsKKwkgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpCisJICAgICAgeworCQlfUm9wZVN1YnN0cmluZyogX19yZXN1bHQgPQorCQkgIF9TX25ld19Sb3BlU3Vic3RyaW5nKF9fb2xkLT5fTV9iYXNlLAorCQkJCSAgICAgICBfX3N0YXJ0ICsgX19vbGQtPl9NX3N0YXJ0LAorCQkJCSAgICAgICBfX2Fkal9lbmRwMSAtIF9fc3RhcnQsCisJCQkJICAgICAgIF9fYmFzZS0+X01fZ2V0X2FsbG9jYXRvcigpKTsKKwkJcmV0dXJuIF9fcmVzdWx0OworCQkKKwkgICAgICB9IC8vICoqKiBlbHNlIGZhbGwgdGhyb3VnaDogKioqCisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICB7CisJICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IChfUm9wZUZ1bmN0aW9uKilfX2Jhc2U7CisJICAgIF9DaGFyVCogX19zZWN0aW9uOworCSAgICBzaXplX3QgX19yZXN1bHRfbGVuOworCSAgICBpZiAoX19zdGFydCA+PSBfX2Fkal9lbmRwMSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgX19yZXN1bHRfbGVuID0gX19hZGpfZW5kcDEgLSBfX3N0YXJ0OworCSAgICAKKwkgICAgaWYgKF9fcmVzdWx0X2xlbiA+IF9fbGF6eV90aHJlc2hvbGQpCisJICAgICAgZ290byBsYXp5OworCSAgICBfX3NlY3Rpb24gPSAoX0NoYXJUKikKKwkgICAgICBfRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19yZXN1bHRfbGVuKSk7CisJICAgIF9fdHJ5CisJICAgICAgewkoKihfX2YtPl9NX2ZuKSkoX19zdGFydCwgX19yZXN1bHRfbGVuLCBfX3NlY3Rpb24pOyB9CisJICAgIF9fY2F0Y2goLi4uKQorCSAgICAgIHsKKwkJX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fc2VjdGlvbiwgX19yZXN1bHRfbGVuLAorCQkJCQkgICAgX19iYXNlLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworCQlfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgICB9CisJICAgIF9TX2NvbmRfc3RvcmVfZW9zKF9fc2VjdGlvbltfX3Jlc3VsdF9sZW5dKTsKKwkgICAgcmV0dXJuIF9TX25ld19Sb3BlTGVhZihfX3NlY3Rpb24sIF9fcmVzdWx0X2xlbiwKKwkJCQkgICBfX2Jhc2UtPl9NX2dldF9hbGxvY2F0b3IoKSk7CisJICB9CisJfQorICAgIGxhenk6CisgICAgICB7CisJLy8gQ3JlYXRlIHN1YnN0cmluZyBub2RlLgorCXJldHVybiBfU19uZXdfUm9wZVN1YnN0cmluZyhfX2Jhc2UsIF9fc3RhcnQsIF9fYWRqX2VuZHAxIC0gX19zdGFydCwKKwkJCQkgICAgX19iYXNlLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgfQorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgY2xhc3MgX1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyCisgICAgOiBwdWJsaWMgX1JvcGVfY2hhcl9jb25zdW1lcjxfQ2hhclQ+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBfQ2hhclQqIF9NX2J1Zl9wdHI7CisgICAgcHVibGljOgorICAgICAgCisgICAgICBfUm9wZV9mbGF0dGVuX2NoYXJfY29uc3VtZXIoX0NoYXJUKiBfX2J1ZmZlcikKKyAgICAgIHsgX01fYnVmX3B0ciA9IF9fYnVmZmVyOyB9OworCisgICAgICB+X1JvcGVfZmxhdHRlbl9jaGFyX2NvbnN1bWVyKCkge30KKyAgICAgIAorICAgICAgYm9vbAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbikKKyAgICAgIHsKKwl1bmluaXRpYWxpemVkX2NvcHlfbihfX2xlYWYsIF9fbiwgX01fYnVmX3B0cik7CisJX01fYnVmX3B0ciArPSBfX247CisJcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQ+CisgICAgY2xhc3MgX1JvcGVfZmluZF9jaGFyX2NoYXJfY29uc3VtZXIKKyAgICA6IHB1YmxpYyBfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIF9DaGFyVCBfTV9wYXR0ZXJuOworICAgIHB1YmxpYzoKKyAgICAgIHNpemVfdCBfTV9jb3VudDsgIC8vIE51bWJlciBvZiBub25tYXRjaGluZyBjaGFyYWN0ZXJzCisgICAgICAKKyAgICAgIF9Sb3BlX2ZpbmRfY2hhcl9jaGFyX2NvbnN1bWVyKF9DaGFyVCBfX3ApCisgICAgICA6IF9NX3BhdHRlcm4oX19wKSwgX01fY291bnQoMCkge30KKwkKKyAgICAgIH5fUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcigpIHt9CisgICAgICAKKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NoYXJUKiBfX2xlYWYsIHNpemVfdCBfX24pCisgICAgICB7CisJc2l6ZV90IF9faTsKKwlmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgX19pKyspCisJICB7CisJICAgIGlmIChfX2xlYWZbX19pXSA9PSBfTV9wYXR0ZXJuKQorCSAgICAgIHsKKwkJX01fY291bnQgKz0gX19pOworCQlyZXR1cm4gZmFsc2U7CisJICAgICAgfQorCSAgfQorCV9NX2NvdW50ICs9IF9fbjsgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHM+CisgIC8vIEhlcmUgX0NoYXJUIGlzIGJvdGggdGhlIHN0cmVhbSBhbmQgcm9wZSBjaGFyYWN0ZXIgdHlwZS4KKyAgICBjbGFzcyBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcgorICAgIDogcHVibGljIF9Sb3BlX2NoYXJfY29uc3VtZXI8X0NoYXJUPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCxfVHJhaXRzPiBfSW5zZXJ0X29zdHJlYW07CisgICAgICBfSW5zZXJ0X29zdHJlYW0mIF9NX287CisgICAgcHVibGljOgorICAgICAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXIoX0luc2VydF9vc3RyZWFtJiBfX3dyaXRlcikKKwk6IF9NX28oX193cml0ZXIpIHt9OworICAgICAgfl9Sb3BlX2luc2VydF9jaGFyX2NvbnN1bWVyKCkgeyB9OworICAgICAgLy8gQ2FsbGVyIGlzIHByZXN1bWVkIHRvIG93biB0aGUgb3N0cmVhbQorICAgICAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBfQ2hhclQqIF9fbGVhZiwgc2l6ZV90IF9fbik7CisgICAgICAvLyBSZXR1cm5zIHRydWUgdG8gY29udGludWUgdHJhdmVyc2FsLgorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGJvb2wKKyAgICBfUm9wZV9pbnNlcnRfY2hhcl9jb25zdW1lcjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBvcGVyYXRvcigpKGNvbnN0IF9DaGFyVCogX19sZWFmLCBzaXplX3QgX19uKQorICAgIHsKKyAgICAgIHNpemVfdCBfX2k7CisgICAgICAvLyAgV2UgYXNzdW1lIHRoYXQgZm9ybWF0dGluZyBpcyBzZXQgdXAgY29ycmVjdGx5IGZvciBlYWNoIGVsZW1lbnQuCisgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fbjsgX19pKyspCisJX01fby5wdXQoX19sZWFmW19faV0pOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBib29sCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2FwcGx5X3RvX3BpZWNlcyhfUm9wZV9jaGFyX2NvbnN1bWVyPF9DaGFyVD4mIF9fYywKKwkJICAgICAgIGNvbnN0IF9Sb3BlUmVwKiBfX3IsIHNpemVfdCBfX2JlZ2luLCBzaXplX3QgX19lbmQpCisgICAgeworICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiB0cnVlOworICAgICAgc3dpdGNoKF9fci0+X01fdGFnKQorCXsKKwljYXNlIF9fZGV0YWlsOjpfU19jb25jYXQ6CisJICB7CisJICAgIF9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jb25jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCSAgICBfUm9wZVJlcCogX19sZWZ0ID0gIF9fY29uYy0+X01fbGVmdDsKKwkgICAgc2l6ZV90IF9fbGVmdF9sZW4gPSBfX2xlZnQtPl9NX3NpemU7CisJICAgIGlmIChfX2JlZ2luIDwgX19sZWZ0X2xlbikKKwkgICAgICB7CisJCXNpemVfdCBfX2xlZnRfZW5kID0gc3RkOjptaW4oX19sZWZ0X2xlbiwgX19lbmQpOworCQlpZiAoIV9TX2FwcGx5X3RvX3BpZWNlcyhfX2MsIF9fbGVmdCwgX19iZWdpbiwgX19sZWZ0X2VuZCkpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgICAgaWYgKF9fZW5kID4gX19sZWZ0X2xlbikKKwkgICAgICB7CisJCV9Sb3BlUmVwKiBfX3JpZ2h0ID0gIF9fY29uYy0+X01fcmlnaHQ7CisJCXNpemVfdCBfX3JpZ2h0X3N0YXJ0ID0gc3RkOjptYXgoX19sZWZ0X2xlbiwgX19iZWdpbik7CisJCWlmICghX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgX19yaWdodCwKKwkJCQkJX19yaWdodF9zdGFydCAtIF9fbGVmdF9sZW4sCisJCQkJCV9fZW5kIC0gX19sZWZ0X2xlbikpCisJCSAgcmV0dXJuIGZhbHNlOworCSAgICAgIH0KKwkgIH0KKwkgIHJldHVybiB0cnVlOworCWNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICB7CisJICAgIF9Sb3BlTGVhZiogX19sID0gKF9Sb3BlTGVhZiopX19yOworCSAgICByZXR1cm4gX19jKF9fbC0+X01fZGF0YSArIF9fYmVnaW4sIF9fZW5kIC0gX19iZWdpbik7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAgIHsKKwkgICAgICBfUm9wZUZ1bmN0aW9uKiBfX2YgPSAoX1JvcGVGdW5jdGlvbiopX19yOworCSAgICAgIHNpemVfdCBfX2xlbiA9IF9fZW5kIC0gX19iZWdpbjsKKwkgICAgICBib29sIF9fcmVzdWx0OworCSAgICAgIF9DaGFyVCogX19idWZmZXIgPQorCQkoX0NoYXJUKilfQWxsb2MoKS5hbGxvY2F0ZShfX2xlbiAqIHNpemVvZihfQ2hhclQpKTsKKwkgICAgICBfX3RyeQorCQl7CisJCSAgKCooX19mLT5fTV9mbikpKF9fYmVnaW4sIF9fbGVuLCBfX2J1ZmZlcik7CisJCSAgX19yZXN1bHQgPSBfX2MoX19idWZmZXIsIF9fbGVuKTsKKyAgICAgICAgICAgICAgICAgIF9BbGxvYygpLmRlYWxsb2NhdGUoX19idWZmZXIsIF9fbGVuICogc2l6ZW9mKF9DaGFyVCkpOworICAgICAgICAgICAgICAgIH0KKwkgICAgICBfX2NhdGNoKC4uLikKKwkJeworCQkgIF9BbGxvYygpLmRlYWxsb2NhdGUoX19idWZmZXIsIF9fbGVuICogc2l6ZW9mKF9DaGFyVCkpOworCQkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCQl9CisJICAgICAgcmV0dXJuIF9fcmVzdWx0OworCSAgICB9CisJZGVmYXVsdDoKKwkgIHJldHVybiBmYWxzZTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9Sb3BlX2ZpbGwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX28sIHNpemVfdCBfX24pCisgICAgeworICAgICAgY2hhciBfX2YgPSBfX28uZmlsbCgpOworICAgICAgc2l6ZV90IF9faTsKKyAgICAgIAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX247IF9faSsrKQorCV9fby5wdXQoX19mKTsKKyAgICB9CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJUPgorICAgIGlubGluZSBib29sCisgICAgX1JvcGVfaXNfc2ltcGxlKF9DaGFyVCopCisgICAgeyByZXR1cm4gZmFsc2U7IH0KKworICBpbmxpbmUgYm9vbAorICBfUm9wZV9pc19zaW1wbGUoY2hhciopCisgIHsgcmV0dXJuIHRydWU7IH0KKworICBpbmxpbmUgYm9vbAorICBfUm9wZV9pc19zaW1wbGUod2NoYXJfdCopCisgIHsgcmV0dXJuIHRydWU7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKyAgICBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fbywKKwkgICAgICAgY29uc3Qgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcikKKyAgICB7CisgICAgICBzaXplX3QgX193ID0gX19vLndpZHRoKCk7CisgICAgICBib29sIF9fbGVmdCA9IGJvb2woX19vLmZsYWdzKCkgJiBzdGQ6Omlvczo6bGVmdCk7CisgICAgICBzaXplX3QgX19wYWRfbGVuOworICAgICAgc2l6ZV90IF9fcm9wZV9sZW4gPSBfX3Iuc2l6ZSgpOworICAgICAgX1JvcGVfaW5zZXJ0X2NoYXJfY29uc3VtZXI8X0NoYXJULCBfVHJhaXRzPiBfX2MoX19vKTsKKyAgICAgIGJvb2wgX19pc19zaW1wbGUgPSBfUm9wZV9pc19zaW1wbGUoKF9DaGFyVCopMCk7CisgICAgICAKKyAgICAgIGlmIChfX3JvcGVfbGVuIDwgX193KQorCV9fcGFkX2xlbiA9IF9fdyAtIF9fcm9wZV9sZW47CisgICAgICBlbHNlCisJX19wYWRfbGVuID0gMDsKKworICAgICAgaWYgKCFfX2lzX3NpbXBsZSkKKwlfX28ud2lkdGgoX193IC8gX19yb3BlX2xlbik7CisgICAgICBfX3RyeQorCXsKKwkgIGlmIChfX2lzX3NpbXBsZSAmJiAhX19sZWZ0ICYmIF9fcGFkX2xlbiA+IDApCisJICAgIF9Sb3BlX2ZpbGwoX19vLCBfX3BhZF9sZW4pOworCSAgX19yLmFwcGx5X3RvX3BpZWNlcygwLCBfX3Iuc2l6ZSgpLCBfX2MpOworCSAgaWYgKF9faXNfc2ltcGxlICYmIF9fbGVmdCAmJiBfX3BhZF9sZW4gPiAwKQorCSAgICBfUm9wZV9maWxsKF9fbywgX19wYWRfbGVuKTsKKwkgIGlmICghX19pc19zaW1wbGUpCisJICAgIF9fby53aWR0aChfX3cpOworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGlmICghX19pc19zaW1wbGUpCisJICAgIF9fby53aWR0aChfX3cpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgICAgcmV0dXJuIF9fbzsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIF9DaGFyVCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZmxhdHRlbihfUm9wZVJlcCogX19yLCBzaXplX3QgX19zdGFydCwgc2l6ZV90IF9fbGVuLAorCSAgICAgICBfQ2hhclQqIF9fYnVmZmVyKQorICAgIHsKKyAgICAgIF9Sb3BlX2ZsYXR0ZW5fY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9fYyhfX2J1ZmZlcik7CisgICAgICBfU19hcHBseV90b19waWVjZXMoX19jLCBfX3IsIF9fc3RhcnQsIF9fc3RhcnQgKyBfX2xlbik7CisgICAgICByZXR1cm4oX19idWZmZXIgKyBfX2xlbik7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBzaXplX3QKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgZmluZChfQ2hhclQgX19wYXR0ZXJuLCBzaXplX3QgX19zdGFydCkgY29uc3QKKyAgICB7CisgICAgICBfUm9wZV9maW5kX2NoYXJfY2hhcl9jb25zdW1lcjxfQ2hhclQ+IF9fYyhfX3BhdHRlcm4pOworICAgICAgX1NfYXBwbHlfdG9fcGllY2VzKF9fYywgdGhpcy0+X01fdHJlZV9wdHIsIF9fc3RhcnQsIHNpemUoKSk7CisgICAgICBzaXplX3R5cGUgX19yZXN1bHRfcG9zID0gX19zdGFydCArIF9fYy5fTV9jb3VudDsKKyNpZm5kZWYgX19TVExfT0xEX1JPUEVfU0VNQU5USUNTCisgICAgICBpZiAoX19yZXN1bHRfcG9zID09IHNpemUoKSkKKwlfX3Jlc3VsdF9wb3MgPSBucG9zOworI2VuZGlmCisgICAgICByZXR1cm4gX19yZXN1bHRfcG9zOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mbGF0dGVuKF9Sb3BlUmVwKiBfX3IsIF9DaGFyVCogX19idWZmZXIpCisgICAgeworICAgICAgaWYgKDAgPT0gX19yKQorCXJldHVybiBfX2J1ZmZlcjsKKyAgICAgIHN3aXRjaChfX3ItPl9NX3RhZykKKwl7CisJY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgeworCSAgICBfUm9wZUNvbmNhdGVuYXRpb24qIF9fYyA9IChfUm9wZUNvbmNhdGVuYXRpb24qKV9fcjsKKwkgICAgX1JvcGVSZXAqIF9fbGVmdCA9IF9fYy0+X01fbGVmdDsKKwkgICAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworCSAgICBfQ2hhclQqIF9fcmVzdCA9IF9TX2ZsYXR0ZW4oX19sZWZ0LCBfX2J1ZmZlcik7CisJICAgIHJldHVybiBfU19mbGF0dGVuKF9fcmlnaHQsIF9fcmVzdCk7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgIHsKKwkgICAgX1JvcGVMZWFmKiBfX2wgPSAoX1JvcGVMZWFmKilfX3I7CisJICAgIHJldHVybiBjb3B5X24oX19sLT5fTV9kYXRhLCBfX2wtPl9NX3NpemUsIF9fYnVmZmVyKS5zZWNvbmQ7CisJICB9CisJY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJY2FzZSBfX2RldGFpbDo6X1Nfc3Vic3RyaW5nZm46CisJICAvLyBXZSBkb24ndCB5ZXQgZG8gYW55dGhpbmcgd2l0aCBzdWJzdHJpbmcgbm9kZXMuCisJICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSByb3BlZmlsZXMgd2lsbCB3b3JrIHdlbGwuCisJICB7CisJICAgIF9Sb3BlRnVuY3Rpb24qIF9fZiA9IChfUm9wZUZ1bmN0aW9uKilfX3I7CisJICAgICgqKF9fZi0+X01fZm4pKSgwLCBfX2YtPl9NX3NpemUsIF9fYnVmZmVyKTsKKwkgICAgcmV0dXJuIF9fYnVmZmVyICsgX19mLT5fTV9zaXplOworCSAgfQorCWRlZmF1bHQ6CisJICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgIC8vIFRoaXMgbmVlZHMgd29yayBmb3IgX0NoYXJUICE9IGNoYXIKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfZHVtcChfUm9wZVJlcCogX19yLCBpbnQgX19pbmRlbnQpCisgICAgeworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19pbmRlbnQ7IF9faSsrKQorCXB1dGNoYXIoJyAnKTsKKyAgICAgIGlmICgwID09IF9fcikKKwl7CisJICBwcmludGYoIk5VTExcbiIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGlmIChfU19jb25jYXQgPT0gX19yLT5fTV90YWcpCisJeworCSAgX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJICBfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworCSAgX1JvcGVSZXAqIF9fcmlnaHQgPSBfX2MtPl9NX3JpZ2h0OworCSAgCisjaWZkZWYgX19HQworCSAgcHJpbnRmKCJDb25jYXRlbmF0aW9uICVwIChkZXB0aCA9ICVkLCBsZW4gPSAlbGQsICVzIGJhbGFuY2VkKVxuIiwKKwkJIF9fciwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplLAorCQkgX19yLT5fTV9pc19iYWxhbmNlZD8gIiIgOiAibm90Iik7CisjZWxzZQorCSAgcHJpbnRmKCJDb25jYXRlbmF0aW9uICVwIChyYyA9ICVsZCwgZGVwdGggPSAlZCwgIgorCQkgImxlbiA9ICVsZCwgJXMgYmFsYW5jZWQpXG4iLAorCQkgX19yLCBfX3ItPl9NX3JlZl9jb3VudCwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplLAorCQkgX19yLT5fTV9pc19iYWxhbmNlZD8gIiIgOiAibm90Iik7CisjZW5kaWYKKwkgIF9TX2R1bXAoX19sZWZ0LCBfX2luZGVudCArIDIpOworCSAgX1NfZHVtcChfX3JpZ2h0LCBfX2luZGVudCArIDIpOworCSAgcmV0dXJuOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyKiBfX2tpbmQ7CisJICAKKwkgIHN3aXRjaCAoX19yLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfbGVhZjoKKwkgICAgICBfX2tpbmQgPSAiTGVhZiI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCSAgICAgIF9fa2luZCA9ICJGdW5jdGlvbiI7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIF9fa2luZCA9ICJGdW5jdGlvbiByZXByZXNlbnRpbmcgc3Vic3RyaW5nIjsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBfX2tpbmQgPSAiKGNvcnJ1cHRlZCBraW5kIGZpZWxkISkiOworCSAgICB9CisjaWZkZWYgX19HQworCSAgcHJpbnRmKCIlcyAlcCAoZGVwdGggPSAlZCwgbGVuID0gJWxkKSAiLAorCQkgX19raW5kLCBfX3IsIF9fci0+X01fZGVwdGgsIF9fci0+X01fc2l6ZSk7CisjZWxzZQorCSAgcHJpbnRmKCIlcyAlcCAocmMgPSAlbGQsIGRlcHRoID0gJWQsIGxlbiA9ICVsZCkgIiwKKwkJIF9fa2luZCwgX19yLCBfX3ItPl9NX3JlZl9jb3VudCwgX19yLT5fTV9kZXB0aCwgX19yLT5fTV9zaXplKTsKKyNlbmRpZgorCSAgaWYgKF9TX2lzX29uZV9ieXRlX2NoYXJfdHlwZSgoX0NoYXJUKikwKSkKKwkgICAgeworCSAgICAgIGNvbnN0IGludCBfX21heF9sZW4gPSA0MDsKKwkgICAgICBfU2VsZl9kZXN0cnVjdF9wdHIgX19wcmVmaXgoX1Nfc3Vic3RyaW5nKF9fciwgMCwgX19tYXhfbGVuKSk7CisJICAgICAgX0NoYXJUIF9fYnVmZmVyW19fbWF4X2xlbiArIDFdOworCSAgICAgIGJvb2wgX190b29fYmlnID0gX19yLT5fTV9zaXplID4gX19wcmVmaXgtPl9NX3NpemU7CisJICAgICAgCisJICAgICAgX1NfZmxhdHRlbihfX3ByZWZpeCwgX19idWZmZXIpOworCSAgICAgIF9fYnVmZmVyW19fcHJlZml4LT5fTV9zaXplXSA9IF9TX2VvcygoX0NoYXJUKikwKTsKKwkgICAgICBwcmludGYoIiVzJXNcbiIsIChjaGFyKilfX2J1ZmZlciwKKwkJICAgICBfX3Rvb19iaWc/ICIuLi5cbiIgOiAiXG4iKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICBwcmludGYoIlxuIik7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgdW5zaWduZWQgbG9uZworICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19taW5fbGVuW2ludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpICsgMV0gPSB7CisgICAgICAvKiAwICovMSwgLyogMSAqLzIsIC8qIDIgKi8zLCAvKiAzICovNSwgLyogNCAqLzgsIC8qIDUgKi8xMywgLyogNiAqLzIxLAorICAgICAgLyogNyAqLzM0LCAvKiA4ICovNTUsIC8qIDkgKi84OSwgLyogMTAgKi8xNDQsIC8qIDExICovMjMzLCAvKiAxMiAqLzM3NywKKyAgICAgIC8qIDEzICovNjEwLCAvKiAxNCAqLzk4NywgLyogMTUgKi8xNTk3LCAvKiAxNiAqLzI1ODQsIC8qIDE3ICovNDE4MSwKKyAgICAgIC8qIDE4ICovNjc2NSwgLyogMTkgKi8xMDk0NiwgLyogMjAgKi8xNzcxMSwgLyogMjEgKi8yODY1NywgLyogMjIgKi80NjM2OCwKKyAgICAgIC8qIDIzICovNzUwMjUsIC8qIDI0ICovMTIxMzkzLCAvKiAyNSAqLzE5NjQxOCwgLyogMjYgKi8zMTc4MTEsCisgICAgICAvKiAyNyAqLzUxNDIyOSwgLyogMjggKi84MzIwNDAsIC8qIDI5ICovMTM0NjI2OSwgLyogMzAgKi8yMTc4MzA5LAorICAgICAgLyogMzEgKi8zNTI0NTc4LCAvKiAzMiAqLzU3MDI4ODcsIC8qIDMzICovOTIyNzQ2NSwgLyogMzQgKi8xNDkzMDM1MiwKKyAgICAgIC8qIDM1ICovMjQxNTc4MTcsIC8qIDM2ICovMzkwODgxNjksIC8qIDM3ICovNjMyNDU5ODYsIC8qIDM4ICovMTAyMzM0MTU1LAorICAgICAgLyogMzkgKi8xNjU1ODAxNDEsIC8qIDQwICovMjY3OTE0Mjk2LCAvKiA0MSAqLzQzMzQ5NDQzNywKKyAgICAgIC8qIDQyICovNzAxNDA4NzMzLCAvKiA0MyAqLzExMzQ5MDMxNzAsIC8qIDQ0ICovMTgzNjMxMTkwMywKKyAgICAgIC8qIDQ1ICovMjk3MTIxNTA3M3UgfTsKKyAgLy8gVGhlc2UgYXJlIEZpYm9uYWNjaSBudW1iZXJzIDwgMioqMzIuCisKKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIHR5cGVuYW1lIHJvcGU8X0NoYXJULCBfQWxsb2M+OjpfUm9wZVJlcCoKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgX1NfYmFsYW5jZShfUm9wZVJlcCogX19yKQorICAgIHsKKyAgICAgIF9Sb3BlUmVwKiBfX2ZvcmVzdFtpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKSArIDFdOworICAgICAgX1JvcGVSZXAqIF9fcmVzdWx0ID0gMDsKKyAgICAgIGludCBfX2k7CisgICAgICAvLyBJbnZhcmlhbnQ6CisgICAgICAvLyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBmb3Jlc3QgaW4gZGVzY2VuZGluZyBvcmRlciBpcyBlcXVhbCB0byBfX3IuCisgICAgICAvLyBfX2ZvcmVzdFtfX2ldLl9NX3NpemUgPj0gX1NfbWluX2xlbltfX2ldCisgICAgICAvLyBfX2ZvcmVzdFtfX2ldLl9NX2RlcHRoID0gX19pCisgICAgICAvLyBSZWZlcmVuY2VzIGZyb20gZm9yZXN0IGFyZSBpbmNsdWRlZCBpbiByZWZjb3VudC4KKyAgICAgIAorICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPD0gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCk7ICsrX19pKQorCV9fZm9yZXN0W19faV0gPSAwOworICAgICAgX190cnkKKwl7CisJICBfU19hZGRfdG9fZm9yZXN0KF9fciwgX19mb3Jlc3QpOworCSAgZm9yIChfX2kgPSAwOyBfX2kgPD0gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCk7ICsrX19pKQorCSAgICBpZiAoMCAhPSBfX2ZvcmVzdFtfX2ldKQorCSAgICAgIHsKKyNpZm5kZWYgX19HQworCQlfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX19yZXN1bHQpOworI2VuZGlmCisJCV9fcmVzdWx0ID0gX1NfY29uY2F0KF9fZm9yZXN0W19faV0sIF9fcmVzdWx0KTsKKwkJX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7CisjaWYgIWRlZmluZWQoX19HQykgJiYgZGVmaW5lZChfX0VYQ0VQVElPTlMpCisJCV9fZm9yZXN0W19faV0gPSAwOworI2VuZGlmCisJICAgICAgfQorCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIGZvcihfX2kgPSAwOyBfX2kgPD0gaW50KF9fZGV0YWlsOjpfU19tYXhfcm9wZV9kZXB0aCk7IF9faSsrKQorCSAgICBfU191bnJlZihfX2ZvcmVzdFtfX2ldKTsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICAgIAorICAgICAgaWYgKF9fcmVzdWx0LT5fTV9kZXB0aCA+IGludChfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGgpKQorCV9fdGhyb3dfbGVuZ3RoX2Vycm9yKF9fTigicm9wZTo6X1NfYmFsYW5jZSIpKTsKKyAgICAgIHJldHVybihfX3Jlc3VsdCk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2FkZF90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKKyAgICB7CisgICAgICBpZiAoX19yLT5fTV9pc19iYWxhbmNlZCkKKwl7CisJICBfU19hZGRfbGVhZl90b19mb3Jlc3QoX19yLCBfX2ZvcmVzdCk7CisJICByZXR1cm47CisJfQorCisgICAgICB7CisJX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJCisJX1NfYWRkX3RvX2ZvcmVzdChfX2MtPl9NX2xlZnQsIF9fZm9yZXN0KTsKKwlfU19hZGRfdG9fZm9yZXN0KF9fYy0+X01fcmlnaHQsIF9fZm9yZXN0KTsKKyAgICAgIH0KKyAgICB9CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19hZGRfbGVhZl90b19mb3Jlc3QoX1JvcGVSZXAqIF9fciwgX1JvcGVSZXAqKiBfX2ZvcmVzdCkKKyAgICB7CisgICAgICBfUm9wZVJlcCogX19pbnNlcnRlZTsJCS8vIGluY2x1ZGVkIGluIHJlZmNvdW50CisgICAgICBfUm9wZVJlcCogX190b29fdGlueSA9IDA7CQkvLyBpbmNsdWRlZCBpbiByZWZjb3VudAorICAgICAgaW50IF9faTsJCQkJLy8gZm9yZXN0WzAuLl9faS0xXSBpcyBlbXB0eQorICAgICAgc2l6ZV90IF9fcyA9IF9fci0+X01fc2l6ZTsKKyAgICAgIAorICAgICAgZm9yIChfX2kgPSAwOyBfX3MgPj0gX1NfbWluX2xlbltfX2krMV0vKiBub3QgdGhpcyBidWNrZXQgKi87ICsrX19pKQorCXsKKwkgIGlmICgwICE9IF9fZm9yZXN0W19faV0pCisJICAgIHsKKyNpZm5kZWYgX19HQworCSAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX29sZChfX3Rvb190aW55KTsKKyNlbmRpZgorCSAgICAgIF9fdG9vX3RpbnkgPSBfU19jb25jYXRfYW5kX3NldF9iYWxhbmNlZChfX2ZvcmVzdFtfX2ldLAorCQkJCQkJICAgICAgX190b29fdGlueSk7CisJICAgICAgX19mb3Jlc3RbX19pXS0+X01fdW5yZWZfbm9ubmlsKCk7CisJICAgICAgX19mb3Jlc3RbX19pXSA9IDA7CisJICAgIH0KKwl9CisgICAgICB7CisjaWZuZGVmIF9fR0MKKwlfU2VsZl9kZXN0cnVjdF9wdHIgX19vbGQoX190b29fdGlueSk7CisjZW5kaWYKKwlfX2luc2VydGVlID0gX1NfY29uY2F0X2FuZF9zZXRfYmFsYW5jZWQoX190b29fdGlueSwgX19yKTsKKyAgICAgIH0KKyAgICAgIC8vIFRvb190aW55IGRlYWQsIGFuZCBubyBsb25nZXIgaW5jbHVkZWQgaW4gcmVmY291bnQuCisgICAgICAvLyBJbnNlcnRlZSBpcyBsaXZlIGFuZCBpbmNsdWRlZC4KKyAgICAgIGZvciAoOzsgKytfX2kpCisJeworCSAgaWYgKDAgIT0gX19mb3Jlc3RbX19pXSkKKwkgICAgeworI2lmbmRlZiBfX0dDCisJICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fb2xkKF9faW5zZXJ0ZWUpOworI2VuZGlmCisJICAgICAgX19pbnNlcnRlZSA9IF9TX2NvbmNhdF9hbmRfc2V0X2JhbGFuY2VkKF9fZm9yZXN0W19faV0sCisJCQkJCQkgICAgICBfX2luc2VydGVlKTsKKwkgICAgICBfX2ZvcmVzdFtfX2ldLT5fTV91bnJlZl9ub25uaWwoKTsKKwkgICAgICBfX2ZvcmVzdFtfX2ldID0gMDsKKwkgICAgfQorCSAgaWYgKF9faSA9PSBpbnQoX19kZXRhaWw6Ol9TX21heF9yb3BlX2RlcHRoKQorCSAgICAgIHx8IF9faW5zZXJ0ZWUtPl9NX3NpemUgPCBfU19taW5fbGVuW19faSsxXSkKKwkgICAgeworCSAgICAgIF9fZm9yZXN0W19faV0gPSBfX2luc2VydGVlOworCSAgICAgIC8vIHJlZmNvdW50IGlzIE9LIHNpbmNlIF9faW5zZXJ0ZWUgaXMgbm93IGRlYWQuCisJICAgICAgcmV0dXJuOworCSAgICB9CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUCisgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz46OgorICAgIF9TX2ZldGNoKF9Sb3BlUmVwKiBfX3IsIHNpemVfdHlwZSBfX2kpCisgICAgeworICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9fY3N0ciA9IF9fci0+X01fY19zdHJpbmc7CisgICAgICAKKyAgICAgIGlmICgwICE9IF9fY3N0cikKKwlyZXR1cm4gX19jc3RyW19faV07CisgICAgICBmb3IoOzspCisJeworCSAgc3dpdGNoKF9fci0+X01fdGFnKQorCSAgICB7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2NvbmNhdDoKKwkgICAgICB7CisJCV9Sb3BlQ29uY2F0ZW5hdGlvbiogX19jID0gKF9Sb3BlQ29uY2F0ZW5hdGlvbiopX19yOworCQlfUm9wZVJlcCogX19sZWZ0ID0gX19jLT5fTV9sZWZ0OworCQlzaXplX3QgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZTsKKwkJCisJCWlmIChfX2kgPj0gX19sZWZ0X2xlbikKKwkJICB7CisJCSAgICBfX2kgLT0gX19sZWZ0X2xlbjsKKwkJICAgIF9fciA9IF9fYy0+X01fcmlnaHQ7CisJCSAgfSAKKwkJZWxzZQorCQkgIF9fciA9IF9fbGVmdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICAgICAgeworCQlfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKwkJcmV0dXJuIF9fbC0+X01fZGF0YVtfX2ldOworCSAgICAgIH0KKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfZnVuY3Rpb246CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX3N1YnN0cmluZ2ZuOgorCSAgICAgIHsKKwkJX1JvcGVGdW5jdGlvbiogX19mID0gKF9Sb3BlRnVuY3Rpb24qKV9fcjsKKwkJX0NoYXJUIF9fcmVzdWx0OworCQkKKwkJKCooX19mLT5fTV9mbikpKF9faSwgMSwgJl9fcmVzdWx0KTsKKwkJcmV0dXJuIF9fcmVzdWx0OworCSAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisgIAorI2lmbmRlZiBfX0dDCisgIC8vIFJldHVybiBhIHVuaXF1ZWx5IHJlZmVyZW5jZWQgY2hhcmFjdGVyIHNsb3QgZm9yIHRoZSBnaXZlbgorICAvLyBwb3NpdGlvbiwgb3IgMCBpZiB0aGF0J3Mgbm90IHBvc3NpYmxlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19mZXRjaF9wdHIoX1JvcGVSZXAqIF9fciwgc2l6ZV90eXBlIF9faSkKKyAgICB7CisgICAgICBfUm9wZVJlcCogX19jbHJzdGFja1tfX2RldGFpbDo6X1NfbWF4X3JvcGVfZGVwdGhdOworICAgICAgc2l6ZV90IF9fY3NwdHIgPSAwOworICAgICAgCisgICAgICBmb3IoOzspCisJeworCSAgaWYgKF9fci0+X01fcmVmX2NvdW50ID4gMSkKKwkgICAgcmV0dXJuIDA7CisJICBzd2l0Y2goX19yLT5fTV90YWcpCisJICAgIHsKKwkgICAgY2FzZSBfX2RldGFpbDo6X1NfY29uY2F0OgorCSAgICAgIHsKKwkJX1JvcGVDb25jYXRlbmF0aW9uKiBfX2MgPSAoX1JvcGVDb25jYXRlbmF0aW9uKilfX3I7CisJCV9Sb3BlUmVwKiBfX2xlZnQgPSBfX2MtPl9NX2xlZnQ7CisJCXNpemVfdCBfX2xlZnRfbGVuID0gX19sZWZ0LT5fTV9zaXplOworCQkKKwkJaWYgKF9fYy0+X01fY19zdHJpbmcgIT0gMCkKKwkJICBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2M7CisJCWlmIChfX2kgPj0gX19sZWZ0X2xlbikKKwkJICB7CisJCSAgICBfX2kgLT0gX19sZWZ0X2xlbjsKKwkJICAgIF9fciA9IF9fYy0+X01fcmlnaHQ7CisJCSAgfSAKKwkJZWxzZQorCQkgIF9fciA9IF9fbGVmdDsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2xlYWY6CisJICAgICAgeworCQlfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKV9fcjsKKwkJaWYgKF9fbC0+X01fY19zdHJpbmcgIT0gX19sLT5fTV9kYXRhICYmIF9fbC0+X01fY19zdHJpbmcgIT0gMCkKKwkJICBfX2NscnN0YWNrW19fY3NwdHIrK10gPSBfX2w7CisJCXdoaWxlIChfX2NzcHRyID4gMCkKKwkJICB7CisJCSAgICAtLSBfX2NzcHRyOworCQkgICAgX1JvcGVSZXAqIF9fZCA9IF9fY2xyc3RhY2tbX19jc3B0cl07CisJCSAgICBfX2QtPl9NX2ZyZWVfY19zdHJpbmcoKTsKKwkJICAgIF9fZC0+X01fY19zdHJpbmcgPSAwOworCQkgIH0KKwkJcmV0dXJuIF9fbC0+X01fZGF0YSArIF9faTsKKwkgICAgICB9CisJICAgIGNhc2UgX19kZXRhaWw6Ol9TX2Z1bmN0aW9uOgorCSAgICBjYXNlIF9fZGV0YWlsOjpfU19zdWJzdHJpbmdmbjoKKwkgICAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKyAgICB9CisjZW5kaWYgLyogX19HQyAqLworCisgIC8vIFRoZSBmb2xsb3dpbmcgY291bGQgYmUgaW1wbGVtZW50ZWQgdHJpdmlhbGx5IHVzaW5nCisgIC8vIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkuCisgIC8vIFdlIGRvIGEgbGl0dGxlIG1vcmUgd29yayB0byBhdm9pZCBkZWFsaW5nIHdpdGggcm9wZSBpdGVyYXRvcnMgZm9yCisgIC8vIGZsYXQgc3RyaW5ncy4KKyAgdGVtcGxhdGUgPGNsYXNzIF9DaGFyVCwgY2xhc3MgX0FsbG9jPgorICAgIGludAorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBfU19jb21wYXJlIChjb25zdCBfUm9wZVJlcCogX19sZWZ0LCBjb25zdCBfUm9wZVJlcCogX19yaWdodCkKKyAgICB7CisgICAgICBzaXplX3QgX19sZWZ0X2xlbjsKKyAgICAgIHNpemVfdCBfX3JpZ2h0X2xlbjsKKyAgICAgIAorICAgICAgaWYgKDAgPT0gX19yaWdodCkKKwlyZXR1cm4gMCAhPSBfX2xlZnQ7CisgICAgICBpZiAoMCA9PSBfX2xlZnQpCisJcmV0dXJuIC0xOworICAgICAgX19sZWZ0X2xlbiA9IF9fbGVmdC0+X01fc2l6ZTsKKyAgICAgIF9fcmlnaHRfbGVuID0gX19yaWdodC0+X01fc2l6ZTsKKyAgICAgIGlmIChfX2RldGFpbDo6X1NfbGVhZiA9PSBfX2xlZnQtPl9NX3RhZykKKwl7CisJICBfUm9wZUxlYWYqIF9fbCA9IChfUm9wZUxlYWYqKSBfX2xlZnQ7CisJICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gX19yaWdodC0+X01fdGFnKQorCSAgICB7CisJICAgICAgX1JvcGVMZWFmKiBfX3IgPSAoX1JvcGVMZWFmKikgX19yaWdodDsKKwkgICAgICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfX2wtPl9NX2RhdGEsCisJCQkJCQkgIF9fbC0+X01fZGF0YSArIF9fbGVmdF9sZW4sCisJCQkJCQkgIF9fci0+X01fZGF0YSwgX19yLT5fTV9kYXRhCisJCQkJCQkgICsgX19yaWdodF9sZW4pOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX3JzdGFydChfX3JpZ2h0LCAwKTsKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX3JlbmQoX19yaWdodCwgX19yaWdodF9sZW4pOworCSAgICAgIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fbC0+X01fZGF0YSwgX19sLT5fTV9kYXRhCisJCQkJCQkgICsgX19sZWZ0X2xlbiwKKwkJCQkJCSAgX19yc3RhcnQsIF9fcmVuZCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgY29uc3RfaXRlcmF0b3IgX19sc3RhcnQoX19sZWZ0LCAwKTsKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fbGVuZChfX2xlZnQsIF9fbGVmdF9sZW4pOworCSAgaWYgKF9fZGV0YWlsOjpfU19sZWFmID09IF9fcmlnaHQtPl9NX3RhZykKKwkgICAgeworCSAgICAgIF9Sb3BlTGVhZiogX19yID0gKF9Sb3BlTGVhZiopIF9fcmlnaHQ7CisJICAgICAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sc3RhcnQsIF9fbGVuZCwKKwkJCQkJCSAgX19yLT5fTV9kYXRhLCBfX3ItPl9NX2RhdGEKKwkJCQkJCSAgKyBfX3JpZ2h0X2xlbik7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcnN0YXJ0KF9fcmlnaHQsIDApOworCSAgICAgIGNvbnN0X2l0ZXJhdG9yIF9fcmVuZChfX3JpZ2h0LCBfX3JpZ2h0X2xlbik7CisJICAgICAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9jb21wYXJlXzN3YXkoX19sc3RhcnQsIF9fbGVuZCwKKwkJCQkJCSAgX19yc3RhcnQsIF9fcmVuZCk7CisJICAgIH0KKwl9CisgICAgfQorCisgIC8vIEFzc2lnbm1lbnQgdG8gcmVmZXJlbmNlIHByb3hpZXMuCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz4mCisgICAgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvcj0oX0NoYXJUIF9fYykKKyAgICB7CisgICAgICBfUm9wZVJlcCogX19vbGQgPSBfTV9yb290LT5fTV90cmVlX3B0cjsKKyNpZm5kZWYgX19HQworICAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIHRoZSBjYXNlIGluIHdoaWNoIGV2ZXJ5dGhpbmcgaXMgdW5pcXVlbHkKKyAgICAgIC8vIHJlZmVyZW5jZWQuICBJbiB0aGF0IGNhc2Ugd2UgY2FuIGRvIHRoaXMgZGVzdHJ1Y3RpdmVseS4KKyAgICAgIF9DaGFyVCogX19wdHIgPSBfTXlfcm9wZTo6X1NfZmV0Y2hfcHRyKF9fb2xkLCBfTV9wb3MpOworICAgICAgaWYgKDAgIT0gX19wdHIpCisJeworCSAgKl9fcHRyID0gX19jOworCSAgcmV0dXJuICp0aGlzOworCX0KKyNlbmRpZgorICAgICAgX1NlbGZfZGVzdHJ1Y3RfcHRyIF9fbGVmdChfTXlfcm9wZTo6X1Nfc3Vic3RyaW5nKF9fb2xkLCAwLCBfTV9wb3MpKTsKKyAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3JpZ2h0KF9NeV9yb3BlOjpfU19zdWJzdHJpbmcoX19vbGQsIF9NX3BvcyArIDEsCisJCQkJCQkJX19vbGQtPl9NX3NpemUpKTsKKyAgICAgIF9TZWxmX2Rlc3RydWN0X3B0ciBfX3Jlc3VsdF9sZWZ0KF9NeV9yb3BlOjoKKwkJCQkgICAgICAgX1NfZGVzdHJfY29uY2F0X2NoYXJfaXRlcihfX2xlZnQsCisJCQkJCQkJCSAmX19jLCAxKSk7CisKKyAgICAgIF9Sb3BlUmVwKiBfX3Jlc3VsdCA9IF9NeV9yb3BlOjpfU19jb25jYXQoX19yZXN1bHRfbGVmdCwgX19yaWdodCk7CisjaWZuZGVmIF9fR0MKKyAgICAgIF9Sb3BlUmVwOjpfU191bnJlZihfX29sZCk7CisjZW5kaWYKKyAgICAgIF9NX3Jvb3QtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgX1JvcGVfY2hhcl9yZWZfcHJveHk8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBvcGVyYXRvciBfQ2hhclQoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9jdXJyZW50X3ZhbGlkKQorCXJldHVybiBfTV9jdXJyZW50OworICAgICAgZWxzZQorCXJldHVybiBfTXlfcm9wZTo6X1NfZmV0Y2goX01fcm9vdC0+X01fdHJlZV9wdHIsIF9NX3Bvcyk7CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfUm9wZV9jaGFyX3B0cl9wcm94eTxfQ2hhclQsIF9BbGxvYz4KKyAgICBfUm9wZV9jaGFyX3JlZl9wcm94eTxfQ2hhclQsIF9BbGxvYz46OgorICAgIG9wZXJhdG9yJigpIGNvbnN0CisgICAgeyByZXR1cm4gX1JvcGVfY2hhcl9wdHJfcHJveHk8X0NoYXJULCBfQWxsb2M+KCp0aGlzKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgcm9wZShzaXplX3QgX19uLCBfQ2hhclQgX19jLCBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX0Jhc2UoX19hKQorICAgIHsKKyAgICAgIHJvcGU8X0NoYXJULF9BbGxvYz4gX19yZXN1bHQ7CisgICAgICBjb25zdCBzaXplX3QgX19leHBvbmVudGlhdGVfdGhyZXNob2xkID0gMzI7CisgICAgICBzaXplX3QgX19leHBvbmVudDsKKyAgICAgIHNpemVfdCBfX3Jlc3Q7CisgICAgICBfQ2hhclQqIF9fcmVzdF9idWZmZXI7CisgICAgICBfUm9wZVJlcCogX19yZW1haW5kZXI7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3JlbWFpbmRlcl9yb3BlOworCisgICAgICBpZiAoMCA9PSBfX24pCisJcmV0dXJuOworCisgICAgICBfX2V4cG9uZW50ID0gX19uIC8gX19leHBvbmVudGlhdGVfdGhyZXNob2xkOworICAgICAgX19yZXN0ID0gX19uICUgX19leHBvbmVudGlhdGVfdGhyZXNob2xkOworICAgICAgaWYgKDAgPT0gX19yZXN0KQorCV9fcmVtYWluZGVyID0gMDsKKyAgICAgIGVsc2UKKwl7CisJICBfX3Jlc3RfYnVmZmVyID0gdGhpcy0+X0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fcmVzdCkpOworCSAgX191bmluaXRpYWxpemVkX2ZpbGxfbl9hKF9fcmVzdF9idWZmZXIsIF9fcmVzdCwgX19jLAorCQkJCSAgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICBfU19jb25kX3N0b3JlX2VvcyhfX3Jlc3RfYnVmZmVyW19fcmVzdF0pOworCSAgX190cnkKKwkgICAgeyBfX3JlbWFpbmRlciA9IF9TX25ld19Sb3BlTGVhZihfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsCisJCQkJCSAgICBfTV9nZXRfYWxsb2NhdG9yKCkpOyB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9Sb3BlUmVwOjpfX1NUTF9GUkVFX1NUUklORyhfX3Jlc3RfYnVmZmVyLCBfX3Jlc3QsCisJCQkJCSAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKyAgICAgIF9fcmVtYWluZGVyX3JvcGUuX01fdHJlZV9wdHIgPSBfX3JlbWFpbmRlcjsKKyAgICAgIGlmIChfX2V4cG9uZW50ICE9IDApCisJeworCSAgX0NoYXJUKiBfX2Jhc2VfYnVmZmVyID0KKwkgICAgdGhpcy0+X0RhdGFfYWxsb2NhdGUoX1Nfcm91bmRlZF91cF9zaXplKF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCkpOworCSAgX1JvcGVMZWFmKiBfX2Jhc2VfbGVhZjsKKwkgIHJvcGUgX19iYXNlX3JvcGU7CisJICBfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2EoX19iYXNlX2J1ZmZlciwgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLCBfX2MsCisJCQkJICAgX01fZ2V0X2FsbG9jYXRvcigpKTsKKwkgIF9TX2NvbmRfc3RvcmVfZW9zKF9fYmFzZV9idWZmZXJbX19leHBvbmVudGlhdGVfdGhyZXNob2xkXSk7CisJICBfX3RyeQorCSAgICB7CisJICAgICAgX19iYXNlX2xlYWYgPSBfU19uZXdfUm9wZUxlYWYoX19iYXNlX2J1ZmZlciwKKwkJCQkJICAgIF9fZXhwb25lbnRpYXRlX3RocmVzaG9sZCwKKwkJCQkJICAgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgX1JvcGVSZXA6Ol9fU1RMX0ZSRUVfU1RSSU5HKF9fYmFzZV9idWZmZXIsCisJCQkJCSAgX19leHBvbmVudGlhdGVfdGhyZXNob2xkLAorCQkJCQkgIF9NX2dldF9hbGxvY2F0b3IoKSk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fYmFzZV9yb3BlLl9NX3RyZWVfcHRyID0gX19iYXNlX2xlYWY7CisJICBpZiAoMSA9PSBfX2V4cG9uZW50KQorCSAgICBfX3Jlc3VsdCA9IF9fYmFzZV9yb3BlOworCSAgZWxzZQorCSAgICBfX3Jlc3VsdCA9IHBvd2VyKF9fYmFzZV9yb3BlLCBfX2V4cG9uZW50LAorCQkJICAgICBfUm9wZV9Db25jYXRfZm48X0NoYXJULCBfQWxsb2M+KCkpOworCSAgICAKKwkgIGlmICgwICE9IF9fcmVtYWluZGVyKQorCSAgICBfX3Jlc3VsdCArPSBfX3JlbWFpbmRlcl9yb3BlOworCX0KKyAgICAgIGVsc2UKKwlfX3Jlc3VsdCA9IF9fcmVtYWluZGVyX3JvcGU7CisJICAKKyAgICAgIHRoaXMtPl9NX3RyZWVfcHRyID0gX19yZXN1bHQuX01fdHJlZV9wdHI7CisgICAgICB0aGlzLT5fTV90cmVlX3B0ci0+X01fcmVmX25vbm5pbCgpOworICAgIH0KKyAgICAgIAorICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9BbGxvYz4KKyAgICBfQ2hhclQKKyAgICByb3BlPF9DaGFyVCwgX0FsbG9jPjo6X1NfZW1wdHlfY19zdHJbMV07CisgICAgICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgX0NoYXJUKgorICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+OjoKKyAgICBjX3N0cigpIGNvbnN0CisgICAgeworICAgICAgaWYgKDAgPT0gdGhpcy0+X01fdHJlZV9wdHIpCisJeworCSAgX1NfZW1wdHlfY19zdHJbMF0gPSBfU19lb3MoKF9DaGFyVCopMCk7ICAvLyBQb3NzaWJseSByZWR1bmRhbnQsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwcm9iYWJseSBmYXN0LgorCSAgcmV0dXJuIF9TX2VtcHR5X2Nfc3RyOworCX0KKyAgICAgIF9fZ3RocmVhZF9tdXRleF9sb2NrICgmdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nX2xvY2spOworICAgICAgX19HQ19DT05TVCBfQ2hhclQqIF9fcmVzdWx0ID0gdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nOworICAgICAgaWYgKDAgPT0gX19yZXN1bHQpCisJeworCSAgc2l6ZV90IF9fcyA9IHNpemUoKTsKKwkgIF9fcmVzdWx0ID0gdGhpcy0+X0RhdGFfYWxsb2NhdGUoX19zICsgMSk7CisJICBfU19mbGF0dGVuKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3Jlc3VsdCk7CisJICBfX3Jlc3VsdFtfX3NdID0gX1NfZW9zKChfQ2hhclQqKTApOworCSAgdGhpcy0+X01fdHJlZV9wdHItPl9NX2Nfc3RyaW5nID0gX19yZXN1bHQ7CisJfQorICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jayAoJnRoaXMtPl9NX3RyZWVfcHRyLT5fTV9jX3N0cmluZ19sb2NrKTsKKyAgICAgIHJldHVybihfX3Jlc3VsdCk7CisgICAgfQorICAKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2M+CisgICAgY29uc3QgX0NoYXJUKiByb3BlPF9DaGFyVCwgX0FsbG9jPjo6CisgICAgcmVwbGFjZV93aXRoX2Nfc3RyKCkKKyAgICB7CisgICAgICBpZiAoMCA9PSB0aGlzLT5fTV90cmVlX3B0cikKKwl7CisJICBfU19lbXB0eV9jX3N0clswXSA9IF9TX2VvcygoX0NoYXJUKikwKTsKKwkgIHJldHVybiBfU19lbXB0eV9jX3N0cjsKKwl9CisgICAgICBfX0dDX0NPTlNUIF9DaGFyVCogX19vbGRfY19zdHJpbmcgPSB0aGlzLT5fTV90cmVlX3B0ci0+X01fY19zdHJpbmc7CisgICAgICBpZiAoX19kZXRhaWw6Ol9TX2xlYWYgPT0gdGhpcy0+X01fdHJlZV9wdHItPl9NX3RhZworCSAgJiYgMCAhPSBfX29sZF9jX3N0cmluZykKKwlyZXR1cm4oX19vbGRfY19zdHJpbmcpOworICAgICAgc2l6ZV90IF9fcyA9IHNpemUoKTsKKyAgICAgIF9DaGFyVCogX19yZXN1bHQgPSB0aGlzLT5fRGF0YV9hbGxvY2F0ZShfU19yb3VuZGVkX3VwX3NpemUoX19zKSk7CisgICAgICBfU19mbGF0dGVuKHRoaXMtPl9NX3RyZWVfcHRyLCBfX3Jlc3VsdCk7CisgICAgICBfX3Jlc3VsdFtfX3NdID0gX1NfZW9zKChfQ2hhclQqKTApOworICAgICAgdGhpcy0+X01fdHJlZV9wdHItPl9NX3VucmVmX25vbm5pbCgpOworICAgICAgdGhpcy0+X01fdHJlZV9wdHIgPSBfU19uZXdfUm9wZUxlYWYoX19yZXN1bHQsIF9fcywKKwkJCQkJICB0aGlzLT5fTV9nZXRfYWxsb2NhdG9yKCkpOworICAgICAgcmV0dXJuKF9fcmVzdWx0KTsKKyAgICB9CisKKyAgLy8gQWxnb3JpdGhtIHNwZWNpYWxpemF0aW9ucy4gIE1vcmUgc2hvdWxkIGJlIGFkZGVkLgorICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1JvcGVfaXRlcmF0b3I+ICAvLyB3YXMgdGVtcGxhdGVkIG9uIENoYXJUIGFuZCBBbGxvYworICAgIHZvaWQJCSAgICAgICAgICAvLyBWQysrIHdvcmthcm91bmQKKyAgICBfUm9wZV9yb3RhdGUoX1JvcGVfaXRlcmF0b3IgX19maXJzdCwKKwkJIF9Sb3BlX2l0ZXJhdG9yIF9fbWlkZGxlLAorCQkgX1JvcGVfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1JvcGVfaXRlcmF0b3I6OnZhbHVlX3R5cGUgX0NoYXJUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUm9wZV9pdGVyYXRvcjo6X2FsbG9jYXRvcl90eXBlIF9BbGxvYzsKKyAgICAgIAorICAgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4mIF9fcihfX2ZpcnN0LmNvbnRhaW5lcigpKTsKKyAgICAgIHJvcGU8X0NoYXJULCBfQWxsb2M+IF9fcHJlZml4ID0gX19yLnN1YnN0cigwLCBfX2ZpcnN0LmluZGV4KCkpOworICAgICAgcm9wZTxfQ2hhclQsIF9BbGxvYz4gX19zdWZmaXggPQorCV9fci5zdWJzdHIoX19sYXN0LmluZGV4KCksIF9fci5zaXplKCkgLSBfX2xhc3QuaW5kZXgoKSk7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3BhcnQxID0KKwlfX3Iuc3Vic3RyKF9fbWlkZGxlLmluZGV4KCksIF9fbGFzdC5pbmRleCgpIC0gX19taWRkbGUuaW5kZXgoKSk7CisgICAgICByb3BlPF9DaGFyVCwgX0FsbG9jPiBfX3BhcnQyID0KKwlfX3Iuc3Vic3RyKF9fZmlyc3QuaW5kZXgoKSwgX19taWRkbGUuaW5kZXgoKSAtIF9fZmlyc3QuaW5kZXgoKSk7CisgICAgICBfX3IgPSBfX3ByZWZpeDsKKyAgICAgIF9fciArPSBfX3BhcnQxOworICAgICAgX19yICs9IF9fcGFydDI7CisgICAgICBfX3IgKz0gX19zdWZmaXg7CisgICAgfQorCisjaWYgIWRlZmluZWQoX19HTlVDX18pCisgIC8vIEFwcGVhcnMgdG8gY29uZnVzZSBnKysKKyAgaW5saW5lIHZvaWQKKyAgcm90YXRlKF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX2ZpcnN0LAorCSBfUm9wZV9pdGVyYXRvcjxjaGFyLCBfX1NUTF9ERUZBVUxUX0FMTE9DQVRPUihjaGFyKT4gX19taWRkbGUsCisJIF9Sb3BlX2l0ZXJhdG9yPGNoYXIsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX2xhc3QpCisgIHsgX1JvcGVfcm90YXRlKF9fZmlyc3QsIF9fbWlkZGxlLCBfX2xhc3QpOyB9CisjZW5kaWYKKworIyBpZiAwCisgIC8vIFByb2JhYmx5IG5vdCB1c2VmdWwgZm9yIHNldmVyYWwgcmVhc29uczoKKyAgLy8gLSBmb3IgU0dJcyA3LjEgY29tcGlsZXIgYW5kIHByb2JhYmx5IHNvbWUgb3RoZXJzLAorICAvLyAgIHRoaXMgZm9yY2VzIGxvdHMgb2Ygcm9wZTx3Y2hhcl90LCAuLi4+IGluc3RhbnRpYXRpb25zLCBjcmVhdGluZyBhCisgIC8vICAgY29kZSBibG9hdCBhbmQgY29tcGlsZSB0aW1lIHByb2JsZW0uICAoRml4ZWQgaW4gNy4yLikKKyAgLy8gLSB3Y2hhcl90IGlzIDQgYnl0ZXMgd2lkZSBvbiBtb3N0IFVOSVggcGxhdGZvcm1zLCBtYWtpbmcgaXQKKyAgLy8gICB1bmF0dHJhY3RpdmUgZm9yIHVuaWNvZGUgc3RyaW5ncy4gIFVuc2lnbmVkIHNob3J0IG1heSBiZSBhIGJldHRlcgorICAvLyAgIGNoYXJhY3RlciB0eXBlLgorICBpbmxpbmUgdm9pZAorICByb3RhdGUoX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fZmlyc3QsCisJIF9Sb3BlX2l0ZXJhdG9yPHdjaGFyX3QsIF9fU1RMX0RFRkFVTFRfQUxMT0NBVE9SKGNoYXIpPiBfX21pZGRsZSwKKwkgX1JvcGVfaXRlcmF0b3I8d2NoYXJfdCwgX19TVExfREVGQVVMVF9BTExPQ0FUT1IoY2hhcik+IF9fbGFzdCkKKyAgeyBfUm9wZV9yb3RhdGUoX19maXJzdCwgX19taWRkbGUsIF9fbGFzdCk7IH0KKyMgZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvc2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc4MTkwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvc2xpc3QKQEAgLTAsMCArMSwxMDgzIEBACisvLyBTaW5nbHktbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDA5CisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKi8KKworLyoqIEBmaWxlIGV4dC9zbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IChwb3NzaWJseQorICogIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBIUC9TR0kgU1RMIHN1YnNldCkuIAorICovCisKKyNpZm5kZWYgX1NMSVNUCisjZGVmaW5lIF9TTElTVCAxCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF91bmluaXRpYWxpemVkLmg+CisjaW5jbHVkZSA8Yml0cy9jb25jZXB0X2NoZWNrLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB1c2luZyBzdGQ6OnNpemVfdDsKKyAgdXNpbmcgc3RkOjpwdHJkaWZmX3Q7CisgIHVzaW5nIHN0ZDo6X0NvbnN0cnVjdDsKKyAgdXNpbmcgc3RkOjpfRGVzdHJveTsKKyAgdXNpbmcgc3RkOjphbGxvY2F0b3I7CisgIHVzaW5nIHN0ZDo6X190cnVlX3R5cGU7CisgIHVzaW5nIHN0ZDo6X19mYWxzZV90eXBlOworCisgIHN0cnVjdCBfU2xpc3Rfbm9kZV9iYXNlCisgIHsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfTV9uZXh0OworICB9OworICAKKyAgaW5saW5lIF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfbWFrZV9saW5rKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcHJldl9ub2RlLAorCQkgICAgX1NsaXN0X25vZGVfYmFzZSogX19uZXdfbm9kZSkKKyAgeworICAgIF9fbmV3X25vZGUtPl9NX25leHQgPSBfX3ByZXZfbm9kZS0+X01fbmV4dDsKKyAgICBfX3ByZXZfbm9kZS0+X01fbmV4dCA9IF9fbmV3X25vZGU7CisgICAgcmV0dXJuIF9fbmV3X25vZGU7CisgIH0KKworICBpbmxpbmUgX1NsaXN0X25vZGVfYmFzZSoKKyAgX19zbGlzdF9wcmV2aW91cyhfU2xpc3Rfbm9kZV9iYXNlKiBfX2hlYWQsCisJCSAgIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkKKyAgeworICAgIHdoaWxlIChfX2hlYWQgJiYgX19oZWFkLT5fTV9uZXh0ICE9IF9fbm9kZSkKKyAgICAgIF9faGVhZCA9IF9faGVhZC0+X01fbmV4dDsKKyAgICByZXR1cm4gX19oZWFkOworICB9CisKKyAgaW5saW5lIGNvbnN0IF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfcHJldmlvdXMoY29uc3QgX1NsaXN0X25vZGVfYmFzZSogX19oZWFkLAorCQkgICBjb25zdCBfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpCisgIHsKKyAgICB3aGlsZSAoX19oZWFkICYmIF9faGVhZC0+X01fbmV4dCAhPSBfX25vZGUpCisgICAgICBfX2hlYWQgPSBfX2hlYWQtPl9NX25leHQ7CisgICAgcmV0dXJuIF9faGVhZDsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zLAorCQkgICAgICAgX1NsaXN0X25vZGVfYmFzZSogX19iZWZvcmVfZmlyc3QsCisJCSAgICAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9sYXN0KQorICB7CisgICAgaWYgKF9fcG9zICE9IF9fYmVmb3JlX2ZpcnN0ICYmIF9fcG9zICE9IF9fYmVmb3JlX2xhc3QpCisgICAgICB7CisJX1NsaXN0X25vZGVfYmFzZSogX19maXJzdCA9IF9fYmVmb3JlX2ZpcnN0LT5fTV9uZXh0OworCV9TbGlzdF9ub2RlX2Jhc2UqIF9fYWZ0ZXIgPSBfX3Bvcy0+X01fbmV4dDsKKwlfX2JlZm9yZV9maXJzdC0+X01fbmV4dCA9IF9fYmVmb3JlX2xhc3QtPl9NX25leHQ7CisJX19wb3MtPl9NX25leHQgPSBfX2ZpcnN0OworCV9fYmVmb3JlX2xhc3QtPl9NX25leHQgPSBfX2FmdGVyOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSogX19wb3MsIF9TbGlzdF9ub2RlX2Jhc2UqIF9faGVhZCkKKyAgeworICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fYmVmb3JlX2xhc3QgPSBfX3NsaXN0X3ByZXZpb3VzKF9faGVhZCwgMCk7CisgICAgaWYgKF9fYmVmb3JlX2xhc3QgIT0gX19oZWFkKQorICAgICAgeworCV9TbGlzdF9ub2RlX2Jhc2UqIF9fYWZ0ZXIgPSBfX3Bvcy0+X01fbmV4dDsKKwlfX3Bvcy0+X01fbmV4dCA9IF9faGVhZC0+X01fbmV4dDsKKwlfX2hlYWQtPl9NX25leHQgPSAwOworCV9fYmVmb3JlX2xhc3QtPl9NX25leHQgPSBfX2FmdGVyOworICAgICAgfQorICB9CisKKyAgaW5saW5lIF9TbGlzdF9ub2RlX2Jhc2UqCisgIF9fc2xpc3RfcmV2ZXJzZShfU2xpc3Rfbm9kZV9iYXNlKiBfX25vZGUpCisgIHsKKyAgICBfU2xpc3Rfbm9kZV9iYXNlKiBfX3Jlc3VsdCA9IF9fbm9kZTsKKyAgICBfX25vZGUgPSBfX25vZGUtPl9NX25leHQ7CisgICAgX19yZXN1bHQtPl9NX25leHQgPSAwOworICAgIHdoaWxlKF9fbm9kZSkKKyAgICAgIHsKKwlfU2xpc3Rfbm9kZV9iYXNlKiBfX25leHQgPSBfX25vZGUtPl9NX25leHQ7CisJX19ub2RlLT5fTV9uZXh0ID0gX19yZXN1bHQ7CisJX19yZXN1bHQgPSBfX25vZGU7CisJX19ub2RlID0gX19uZXh0OworICAgICAgfQorICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIGlubGluZSBzaXplX3QKKyAgX19zbGlzdF9zaXplKF9TbGlzdF9ub2RlX2Jhc2UqIF9fbm9kZSkKKyAgeworICAgIHNpemVfdCBfX3Jlc3VsdCA9IDA7CisgICAgZm9yICg7IF9fbm9kZSAhPSAwOyBfX25vZGUgPSBfX25vZGUtPl9NX25leHQpCisgICAgICArK19fcmVzdWx0OworICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHA+CisgICAgc3RydWN0IF9TbGlzdF9ub2RlIDogcHVibGljIF9TbGlzdF9ub2RlX2Jhc2UKKyAgICB7CisgICAgICBfVHAgX01fZGF0YTsKKyAgICB9OworCisgIHN0cnVjdCBfU2xpc3RfaXRlcmF0b3JfYmFzZQorICB7CisgICAgdHlwZWRlZiBzaXplX3QgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9NX25vZGU7CisgICAgCisgICAgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoX1NsaXN0X25vZGVfYmFzZSogX194KQorICAgIDogX01fbm9kZShfX3gpIHt9CisKKyAgICB2b2lkCisgICAgX01faW5jcigpCisgICAgeyBfTV9ub2RlID0gX01fbm9kZS0+X01fbmV4dDsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UmIF9feCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9ub2RlID09IF9feC5fTV9ub2RlOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfU2xpc3RfaXRlcmF0b3JfYmFzZSYgX194KSBjb25zdAorICAgIHsgcmV0dXJuIF9NX25vZGUgIT0gX194Ll9NX25vZGU7IH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfUmVmLCBjbGFzcyBfUHRyPgorICAgIHN0cnVjdCBfU2xpc3RfaXRlcmF0b3IgOiBwdWJsaWMgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIF9UcCYsIF9UcCo+ICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfU2xpc3RfaXRlcmF0b3I8X1RwLCBjb25zdCBfVHAmLCBjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX1JlZiwgX1B0cj4gICAgICAgICAgICAgX1NlbGY7CisKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfUHRyICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIF9SZWYgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBfU2xpc3Rfbm9kZTxfVHA+IF9Ob2RlOworCisgICAgICBleHBsaWNpdAorICAgICAgX1NsaXN0X2l0ZXJhdG9yKF9Ob2RlKiBfX3gpCisgICAgICA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKF9feCkge30KKworICAgICAgX1NsaXN0X2l0ZXJhdG9yKCkKKyAgICAgIDogX1NsaXN0X2l0ZXJhdG9yX2Jhc2UoMCkge30KKworICAgICAgX1NsaXN0X2l0ZXJhdG9yKGNvbnN0IGl0ZXJhdG9yJiBfX3gpCisgICAgICA6IF9TbGlzdF9pdGVyYXRvcl9iYXNlKF9feC5fTV9ub2RlKSB7fQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yKigpIGNvbnN0CisgICAgICB7IHJldHVybiAoKF9Ob2RlKikgX01fbm9kZSktPl9NX2RhdGE7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQorCisgICAgICBfU2VsZiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCV9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9TZWxmCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsKKwlfU2VsZiBfX3RtcCA9ICp0aGlzOworCV9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgc3RydWN0IF9TbGlzdF9iYXNlCisgICAgOiBwdWJsaWMgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1NsaXN0X25vZGU8X1RwPiA+OjpvdGhlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jOjp0ZW1wbGF0ZSByZWJpbmQ8X1NsaXN0X25vZGU8X1RwPiA+OjpvdGhlcgorICAgICAgICBfTm9kZV9hbGxvYzsKKyAgICAgIHR5cGVkZWYgX0FsbG9jIGFsbG9jYXRvcl90eXBlOworCisgICAgICBhbGxvY2F0b3JfdHlwZQorICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgX05vZGVfYWxsb2MqPih0aGlzKTsgfQorCisgICAgICBfU2xpc3RfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgICAgOiBfTm9kZV9hbGxvYyhfX2EpCisgICAgICB7IHRoaXMtPl9NX2hlYWQuX01fbmV4dCA9IDA7IH0KKworICAgICAgfl9TbGlzdF9iYXNlKCkKKyAgICAgIHsgX01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2hlYWQsIDApOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfU2xpc3Rfbm9kZV9iYXNlIF9NX2hlYWQ7CisKKyAgICAgIF9TbGlzdF9ub2RlPF9UcD4qCisgICAgICBfTV9nZXRfbm9kZSgpCisgICAgICB7IHJldHVybiBfTm9kZV9hbGxvYzo6YWxsb2NhdGUoMSk7IH0KKyAgCisgICAgICB2b2lkCisgICAgICBfTV9wdXRfbm9kZShfU2xpc3Rfbm9kZTxfVHA+KiBfX3ApCisgICAgICB7IF9Ob2RlX2FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgMSk7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9NX2VyYXNlX2FmdGVyKF9TbGlzdF9ub2RlX2Jhc2UqIF9fcG9zKQorICAgICAgeworCV9TbGlzdF9ub2RlPF9UcD4qIF9fbmV4dCA9IChfU2xpc3Rfbm9kZTxfVHA+KikgKF9fcG9zLT5fTV9uZXh0KTsKKwlfU2xpc3Rfbm9kZV9iYXNlKiBfX25leHRfbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKwlfX3Bvcy0+X01fbmV4dCA9IF9fbmV4dF9uZXh0OworCWdldF9hbGxvY2F0b3IoKS5kZXN0cm95KCZfX25leHQtPl9NX2RhdGEpOworCV9NX3B1dF9ub2RlKF9fbmV4dCk7CisJcmV0dXJuIF9fbmV4dF9uZXh0OworICAgICAgfQorICAgICAgX1NsaXN0X25vZGVfYmFzZSogX01fZXJhc2VfYWZ0ZXIoX1NsaXN0X25vZGVfYmFzZSosIF9TbGlzdF9ub2RlX2Jhc2UqKTsKKyAgICB9OworCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBfU2xpc3Rfbm9kZV9iYXNlKgorICAgIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+OjpfTV9lcmFzZV9hZnRlcihfU2xpc3Rfbm9kZV9iYXNlKiBfX2JlZm9yZV9maXJzdCwKKwkJCQkJICAgIF9TbGlzdF9ub2RlX2Jhc2UqIF9fbGFzdF9ub2RlKQorICAgIHsKKyAgICAgIF9TbGlzdF9ub2RlPF9UcD4qIF9fY3VyID0gKF9TbGlzdF9ub2RlPF9UcD4qKSAoX19iZWZvcmVfZmlyc3QtPl9NX25leHQpOworICAgICAgd2hpbGUgKF9fY3VyICE9IF9fbGFzdF9ub2RlKQorCXsKKwkgIF9TbGlzdF9ub2RlPF9UcD4qIF9fdG1wID0gX19jdXI7CisJICBfX2N1ciA9IChfU2xpc3Rfbm9kZTxfVHA+KikgX19jdXItPl9NX25leHQ7CisJICBnZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX190bXAtPl9NX2RhdGEpOworCSAgX01fcHV0X25vZGUoX190bXApOworCX0KKyAgICAgIF9fYmVmb3JlX2ZpcnN0LT5fTV9uZXh0ID0gX19sYXN0X25vZGU7CisgICAgICByZXR1cm4gX19sYXN0X25vZGU7CisgICAgfQorCisgIC8qKgorICAgKiAgVGhpcyBpcyBhbiBTR0kgZXh0ZW5zaW9uLgorICAgKiAgQGluZ3JvdXAgU0dJZXh0ZW5zaW9ucworICAgKiAgQGRvY3RvZG8KKyAgICovCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBzbGlzdCA6IHByaXZhdGUgX1NsaXN0X2Jhc2U8X1RwLF9BbGxvYz4KKyAgICB7CisgICAgICAvLyBjb25jZXB0IHJlcXVpcmVtZW50cworICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9UcCwgX1NHSUFzc2lnbmFibGVDb25jZXB0KQorCQorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9TbGlzdF9iYXNlPF9UcCxfQWxsb2M+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yPF9UcCwgX1RwJiwgX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9TbGlzdF9pdGVyYXRvcjxfVHAsIGNvbnN0IF9UcCYsIGNvbnN0IF9UcCo+IGNvbnN0X2l0ZXJhdG9yOworICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX1NsaXN0X25vZGU8X1RwPiAgICAgIF9Ob2RlOworICAgICAgdHlwZWRlZiBfU2xpc3Rfbm9kZV9iYXNlICAgICAgX05vZGVfYmFzZTsKKyAgICAgIHR5cGVkZWYgX1NsaXN0X2l0ZXJhdG9yX2Jhc2UgIF9JdGVyYXRvcl9iYXNlOworICAgICAgCisgICAgICBfTm9kZSoKKyAgICAgIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlfTm9kZSogX19ub2RlID0gdGhpcy0+X01fZ2V0X25vZGUoKTsKKwlfX3RyeQorCSAgeworCSAgICBnZXRfYWxsb2NhdG9yKCkuY29uc3RydWN0KCZfX25vZGUtPl9NX2RhdGEsIF9feCk7CisJICAgIF9fbm9kZS0+X01fbmV4dCA9IDA7CisJICB9CisJX19jYXRjaCguLi4pCisJICB7CisJICAgIHRoaXMtPl9NX3B1dF9ub2RlKF9fbm9kZSk7CisJICAgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCSAgfQorCXJldHVybiBfX25vZGU7CisgICAgICB9CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fY3JlYXRlX25vZGUoKQorICAgICAgeworCV9Ob2RlKiBfX25vZGUgPSB0aGlzLT5fTV9nZXRfbm9kZSgpOworCV9fdHJ5CisJICB7CisJICAgIGdldF9hbGxvY2F0b3IoKS5jb25zdHJ1Y3QoJl9fbm9kZS0+X01fZGF0YSwgdmFsdWVfdHlwZSgpKTsKKwkgICAgX19ub2RlLT5fTV9uZXh0ID0gMDsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgdGhpcy0+X01fcHV0X25vZGUoX19ub2RlKTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisJcmV0dXJuIF9fbm9kZTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBzbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKSB7fQorCisgICAgICBzbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gsCisJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSAgYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19hKQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbCgmdGhpcy0+X01faGVhZCwgX19uLCBfX3gpOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBzbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbCgmdGhpcy0+X01faGVhZCwgX19uLCB2YWx1ZV90eXBlKCkpOyB9CisKKyAgICAgIC8vIFdlIGRvbid0IG5lZWQgYW55IGRpc3BhdGNoaW5nIHRyaWNrcyBoZXJlLCBiZWNhdXNlCisgICAgICAvLyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UgYWxyZWFkeSBkb2VzIHRoZW0uCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHNsaXN0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gIGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2EpCisgICAgICAgIHsgX01faW5zZXJ0X2FmdGVyX3JhbmdlKCZ0aGlzLT5fTV9oZWFkLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIHNsaXN0KGNvbnN0IHNsaXN0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feC5nZXRfYWxsb2NhdG9yKCkpCisgICAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZSgmdGhpcy0+X01faGVhZCwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KKworICAgICAgc2xpc3QmCisgICAgICBvcGVyYXRvcj0gKGNvbnN0IHNsaXN0JiBfX3gpOworCisgICAgICB+c2xpc3QoKSB7fQorCisgICAgcHVibGljOgorICAgICAgLy8gYXNzaWduKCksIGEgZ2VuZXJhbGl6ZWQgYXNzaWdubWVudCBtZW1iZXIgZnVuY3Rpb24uICBUd28KKyAgICAgIC8vIHZlcnNpb25zOiBvbmUgdGhhdCB0YWtlcyBhIGNvdW50LCBhbmQgb25lIHRoYXQgdGFrZXMgYSByYW5nZS4KKyAgICAgIC8vIFRoZSByYW5nZSB2ZXJzaW9uIGlzIGEgbWVtYmVyIHRlbXBsYXRlLCBzbyB3ZSBkaXNwYXRjaCBvbiB3aGV0aGVyCisgICAgICAvLyBvciBub3QgdGhlIHR5cGUgaXMgYW4gaW50ZWdlci4KKyAgICAgIAorICAgICAgdm9pZAorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKF9fbiwgX192YWwpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbGxfYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWwpOworCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9hc3NpZ25fZGlzcGF0Y2goX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0ludGVnZXI+CisgICAgICB2b2lkCisgICAgICBfTV9hc3NpZ25fZGlzcGF0Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3ZhbCwgX190cnVlX3R5cGUpCisgICAgICB7IF9NX2ZpbGxfYXNzaWduKChzaXplX3R5cGUpIF9fbiwgKF9UcCkgX192YWwpOyB9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJCQkgX19mYWxzZV90eXBlKTsKKworICAgIHB1YmxpYzoKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopdGhpcy0+X01faGVhZC5fTV9uZXh0KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKF9Ob2RlKil0aGlzLT5fTV9oZWFkLl9NX25leHQpO30KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigwKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOyB9CisKKyAgICAgIC8vIEV4cGVyaW1lbnRhbCBuZXcgZmVhdHVyZTogYmVmb3JlX2JlZ2luKCkgcmV0dXJucyBhCisgICAgICAvLyBub24tZGVyZWZlcmVuY2VhYmxlIGl0ZXJhdG9yIHRoYXQsIHdoZW4gaW5jcmVtZW50ZWQsIHlpZWxkcworICAgICAgLy8gYmVnaW4oKS4gIFRoaXMgaXRlcmF0b3IgbWF5IGJlIHVzZWQgYXMgdGhlIGFyZ3VtZW50IHRvCisgICAgICAvLyBpbnNlcnRfYWZ0ZXIsIGVyYXNlX2FmdGVyLCBldGMuICBOb3RlIHRoYXQgZXZlbiBmb3IgYW4gZW1wdHkKKyAgICAgIC8vIHNsaXN0LCBiZWZvcmVfYmVnaW4oKSBpcyBub3QgdGhlIHNhbWUgaXRlcmF0b3IgYXMgZW5kKCkuICBJdAorICAgICAgLy8gaXMgYWx3YXlzIG5lY2Vzc2FyeSB0byBpbmNyZW1lbnQgYmVmb3JlX2JlZ2luKCkgYXQgbGVhc3Qgb25jZSB0bworICAgICAgLy8gb2J0YWluIGVuZCgpLgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigoX05vZGUqKSAmdGhpcy0+X01faGVhZCk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZm9yZV9iZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcigoX05vZGUqKSAmdGhpcy0+X01faGVhZCk7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc2xpc3Rfc2l6ZSh0aGlzLT5fTV9oZWFkLl9NX25leHQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorCisgICAgICBib29sCisgICAgICBlbXB0eSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9oZWFkLl9NX25leHQgPT0gMDsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHNsaXN0JiBfX3gpCisgICAgICB7IHN0ZDo6c3dhcCh0aGlzLT5fTV9oZWFkLl9NX25leHQsIF9feC5fTV9oZWFkLl9NX25leHQpOyB9CisKKyAgICBwdWJsaWM6CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gKChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGE7IH0KKworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiAoKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0KS0+X01fZGF0YTsgfQorCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgX19zbGlzdF9tYWtlX2xpbmsoJnRoaXMtPl9NX2hlYWQsIF9NX2NyZWF0ZV9ub2RlKF9feCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoKQorICAgICAgeyBfX3NsaXN0X21ha2VfbGluaygmdGhpcy0+X01faGVhZCwgX01fY3JlYXRlX25vZGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKwlfTm9kZSogX19ub2RlID0gKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0OworCXRoaXMtPl9NX2hlYWQuX01fbmV4dCA9IF9fbm9kZS0+X01fbmV4dDsKKwlnZXRfYWxsb2NhdG9yKCkuZGVzdHJveSgmX19ub2RlLT5fTV9kYXRhKTsKKwl0aGlzLT5fTV9wdXRfbm9kZShfX25vZGUpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgcHJldmlvdXMoY29uc3RfaXRlcmF0b3IgX19wb3MpCisgICAgICB7IHJldHVybiBpdGVyYXRvcigoX05vZGUqKSBfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLAorCQkJCQkJICBfX3Bvcy5fTV9ub2RlKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIHByZXZpb3VzKGNvbnN0X2l0ZXJhdG9yIF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoKF9Ob2RlKikgX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwKKwkJCQkJCQlfX3Bvcy5fTV9ub2RlKSk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBfTm9kZSoKKyAgICAgIF9NX2luc2VydF9hZnRlcihfTm9kZV9iYXNlKiBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gKF9Ob2RlKikgKF9fc2xpc3RfbWFrZV9saW5rKF9fcG9zLCBfTV9jcmVhdGVfbm9kZShfX3gpKSk7IH0KKworICAgICAgX05vZGUqCisgICAgICBfTV9pbnNlcnRfYWZ0ZXIoX05vZGVfYmFzZSogX19wb3MpCisgICAgICB7IHJldHVybiAoX05vZGUqKSAoX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCkpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfTm9kZV9iYXNlKiBfX3BvcywKKwkJCSAgIHNpemVfdHlwZSBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKwlmb3IgKHNpemVfdHlwZSBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCSAgX19wb3MgPSBfX3NsaXN0X21ha2VfbGluayhfX3BvcywgX01fY3JlYXRlX25vZGUoX194KSk7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhbiBpbnRlZ3JhbCB0eXBlLiAgSWYgc28sIGl0J3Mgbm90IGFuIGl0ZXJhdG9yLgorICAgICAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywKKwkJCSAgICAgIF9Jbkl0ZXJhdG9yIF9fZmlyc3QsIF9Jbkl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5JdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOworCX0KKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfTm9kZV9iYXNlKiBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsCisJCQkgICAgICBfX3RydWVfdHlwZSkKKyAgICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfZmlsbChfX3BvcywgX19uLCBfX3gpOyB9CisKKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX05vZGVfYmFzZSogX19wb3MsCisJCQkgICAgICBfSW5JdGVyYXRvciBfX2ZpcnN0LCBfSW5JdGVyYXRvciBfX2xhc3QsCisJCQkgICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICAgIHsKKwkgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgICAgeworCSAgICAgIF9fcG9zID0gX19zbGlzdF9tYWtlX2xpbmsoX19wb3MsIF9NX2NyZWF0ZV9ub2RlKCpfX2ZpcnN0KSk7CisJICAgICAgKytfX2ZpcnN0OworCSAgICB9CisJfQorCisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX01faW5zZXJ0X2FmdGVyKF9fcG9zLl9NX25vZGUsIF9feCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnRfYWZ0ZXIoaXRlcmF0b3IgX19wb3MpCisgICAgICB7IHJldHVybiBpbnNlcnRfYWZ0ZXIoX19wb3MsIHZhbHVlX3R5cGUoKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0X2FmdGVyKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKF9fcG9zLl9NX25vZGUsIF9fbiwgX194KTsgfQorCisgICAgICAvLyBXZSBkb24ndCBuZWVkIGFueSBkaXNwYXRjaGluZyB0cmlja3MgaGVyZSwgYmVjYXVzZQorICAgICAgLy8gX01faW5zZXJ0X2FmdGVyX3JhbmdlIGFscmVhZHkgZG9lcyB0aGVtLgorICAgICAgdGVtcGxhdGUgPGNsYXNzIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydF9hZnRlcihpdGVyYXRvciBfX3BvcywgX0luSXRlcmF0b3IgX19maXJzdCwgX0luSXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3Bvcy5fTV9ub2RlLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLAorCQkJCQkJCSBfX3Bvcy5fTV9ub2RlKSwKKwkJCQkJX194KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3BvcykKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9NX2luc2VydF9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLAorCQkJCQkJCSBfX3Bvcy5fTV9ub2RlKSwKKwkJCQkJdmFsdWVfdHlwZSgpKSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IF9NX2luc2VydF9hZnRlcl9maWxsKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpLAorCQkJICAgICBfX24sIF9feCk7IH0KKworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGlzcGF0Y2hpbmcgdHJpY2tzIGhlcmUsIGJlY2F1c2UKKyAgICAgIC8vIF9NX2luc2VydF9hZnRlcl9yYW5nZSBhbHJlYWR5IGRvZXMgdGhlbS4KKyAgICAgIHRlbXBsYXRlIDxjbGFzcyBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3MsIF9Jbkl0ZXJhdG9yIF9fZmlyc3QsIF9Jbkl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSksCisJCQkJX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlX2FmdGVyKGl0ZXJhdG9yIF9fcG9zKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoKF9Ob2RlKikgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wb3MuX01fbm9kZSkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZV9hZnRlcihpdGVyYXRvciBfX2JlZm9yZV9maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyAKKwlyZXR1cm4gaXRlcmF0b3IoKF9Ob2RlKikgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19iZWZvcmVfZmlyc3QuX01fbm9kZSwKKwkJCQkJCSAgICAgIF9fbGFzdC5fTV9ub2RlKSk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3BvcykKKyAgICAgIHsgCisJcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopIHRoaXMtPl9NX2VyYXNlX2FmdGVyCisJCQkoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSkpKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgCisJcmV0dXJuIGl0ZXJhdG9yKChfTm9kZSopIHRoaXMtPl9NX2VyYXNlX2FmdGVyCisJCQkoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19maXJzdC5fTV9ub2RlKSwKKwkJCSBfX2xhc3QuX01fbm9kZSkpOworICAgICAgfQorICAgICAgCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIG5ld19zaXplLCBjb25zdCBfVHAmIF9feCk7CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgbmV3X3NpemUpCisgICAgICB7IHJlc2l6ZShuZXdfc2l6ZSwgX1RwKCkpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoJnRoaXMtPl9NX2hlYWQsIDApOyB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBNb3ZlcyB0aGUgcmFuZ2UgW19fYmVmb3JlX2ZpcnN0ICsgMSwgX19iZWZvcmVfbGFzdCArIDEpIHRvICp0aGlzLAorICAgICAgLy8gIGluc2VydGluZyBpdCBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIFRoaXMgaXMgY29uc3RhbnQgdGltZS4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3BvcywKKwkJICAgaXRlcmF0b3IgX19iZWZvcmVfZmlyc3QsIGl0ZXJhdG9yIF9fYmVmb3JlX2xhc3QpCisgICAgICB7CisJaWYgKF9fYmVmb3JlX2ZpcnN0ICE9IF9fYmVmb3JlX2xhc3QpCisJICBfX3NsaXN0X3NwbGljZV9hZnRlcihfX3Bvcy5fTV9ub2RlLCBfX2JlZm9yZV9maXJzdC5fTV9ub2RlLAorCQkJICAgICAgIF9fYmVmb3JlX2xhc3QuX01fbm9kZSk7CisgICAgICB9CisKKyAgICAgIC8vIE1vdmVzIHRoZSBlbGVtZW50IHRoYXQgZm9sbG93cyBfX3ByZXYgdG8gKnRoaXMsIGluc2VydGluZyBpdAorICAgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgX19wb3MuICBUaGlzIGlzIGNvbnN0YW50IHRpbWUuCisgICAgICB2b2lkCisgICAgICBzcGxpY2VfYWZ0ZXIoaXRlcmF0b3IgX19wb3MsIGl0ZXJhdG9yIF9fcHJldikKKyAgICAgIHsgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwKKwkJCSAgICAgX19wcmV2Ll9NX25vZGUsIF9fcHJldi5fTV9ub2RlLT5fTV9uZXh0KTsgfQorCisgICAgICAvLyBSZW1vdmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdCBfX3ggdG8gKnRoaXMsIGluc2VydGluZworICAgICAgLy8gdGhlbSBpbW1lZGlhdGVseSBhZnRlciBfX3Bvcy4gIF9feCBtdXN0IG5vdCBiZSAqdGhpcy4gIENvbXBsZXhpdHk6CisgICAgICAvLyBsaW5lYXIgaW4gX194LnNpemUoKS4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZV9hZnRlcihpdGVyYXRvciBfX3Bvcywgc2xpc3QmIF9feCkKKyAgICAgIHsgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19wb3MuX01fbm9kZSwgJl9feC5fTV9oZWFkKTsgfQorCisgICAgICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBhbmQgbGluZWFyIGluIF9feC5zaXplKCkuCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIHNsaXN0JiBfX3gpCisgICAgICB7CisJaWYgKF9feC5fTV9oZWFkLl9NX25leHQpCisJICBfX3NsaXN0X3NwbGljZV9hZnRlcihfX3NsaXN0X3ByZXZpb3VzKCZ0aGlzLT5fTV9oZWFkLCBfX3Bvcy5fTV9ub2RlKSwKKwkJCSAgICAgICAmX194Ll9NX2hlYWQsCisJCQkgICAgICAgX19zbGlzdF9wcmV2aW91cygmX194Ll9NX2hlYWQsIDApKTsgfQorCisgICAgICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBhbmQgaW4gZGlzdGFuY2UoX194LmJlZ2luKCksIF9faSkuCisgICAgICB2b2lkCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3MsIHNsaXN0JiBfX3gsIGl0ZXJhdG9yIF9faSkKKyAgICAgIHsgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19zbGlzdF9wcmV2aW91cygmdGhpcy0+X01faGVhZCwgX19wb3MuX01fbm9kZSksCisJCQkgICAgIF9fc2xpc3RfcHJldmlvdXMoJl9feC5fTV9oZWFkLCBfX2kuX01fbm9kZSksCisJCQkgICAgIF9faS5fTV9ub2RlKTsgfQorCisgICAgICAvLyBMaW5lYXIgaW4gZGlzdGFuY2UoYmVnaW4oKSwgX19wb3MpLCBpbiBkaXN0YW5jZShfX3guYmVnaW4oKSwgX19maXJzdCksCisgICAgICAvLyBhbmQgaW4gZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KS4KKyAgICAgIHZvaWQKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvcywgc2xpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fc2xpc3RfcHJldmlvdXMoJnRoaXMtPl9NX2hlYWQsIF9fcG9zLl9NX25vZGUpLAorCQkJICAgICAgIF9fc2xpc3RfcHJldmlvdXMoJl9feC5fTV9oZWFkLCBfX2ZpcnN0Ll9NX25vZGUpLAorCQkJICAgICAgIF9fc2xpc3RfcHJldmlvdXMoX19maXJzdC5fTV9ub2RlLAorCQkJCQkJX19sYXN0Ll9NX25vZGUpKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIHZvaWQKKyAgICAgIHJldmVyc2UoKQorICAgICAgeworCWlmICh0aGlzLT5fTV9oZWFkLl9NX25leHQpCisJICB0aGlzLT5fTV9oZWFkLl9NX25leHQgPSBfX3NsaXN0X3JldmVyc2UodGhpcy0+X01faGVhZC5fTV9uZXh0KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVtb3ZlKGNvbnN0IF9UcCYgX192YWwpOworCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKTsKKyAgICAgIAorICAgICAgdm9pZAorICAgICAgbWVyZ2Uoc2xpc3QmIF9feCk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHNvcnQoKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CisgICAgICAgIHZvaWQKKyAgICAgICAgdW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19wcmVkKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgbWVyZ2Uoc2xpc3QmLCBfU3RyaWN0V2Vha09yZGVyaW5nKTsKKworICAgICAgdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CisgICAgICAgIHZvaWQKKyAgICAgICAgc29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCk7CisgICAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgc2xpc3Q8X1RwLCBfQWxsb2M+JgorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX194KQorICAgIHsKKyAgICAgIGlmICgmX194ICE9IHRoaXMpCisJeworCSAgX05vZGVfYmFzZSogX19wMSA9ICZ0aGlzLT5fTV9oZWFkOworCSAgX05vZGUqIF9fbjEgPSAoX05vZGUqKSB0aGlzLT5fTV9oZWFkLl9NX25leHQ7CisJICBjb25zdCBfTm9kZSogX19uMiA9IChjb25zdCBfTm9kZSopIF9feC5fTV9oZWFkLl9NX25leHQ7CisJICB3aGlsZSAoX19uMSAmJiBfX24yKQorCSAgICB7CisJICAgICAgX19uMS0+X01fZGF0YSA9IF9fbjItPl9NX2RhdGE7CisJICAgICAgX19wMSA9IF9fbjE7CisJICAgICAgX19uMSA9IChfTm9kZSopIF9fbjEtPl9NX25leHQ7CisJICAgICAgX19uMiA9IChjb25zdCBfTm9kZSopIF9fbjItPl9NX25leHQ7CisJICAgIH0KKwkgIGlmIChfX24yID09IDApCisJICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fcDEsIDApOworCSAgZWxzZQorCSAgICBfTV9pbnNlcnRfYWZ0ZXJfcmFuZ2UoX19wMSwgY29uc3RfaXRlcmF0b3IoKF9Ob2RlKilfX24yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcigwKSk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6X01fZmlsbF9hc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX3ByZXYgPSAmdGhpcy0+X01faGVhZDsKKyAgICAgIF9Ob2RlKiBfX25vZGUgPSAoX05vZGUqKSB0aGlzLT5fTV9oZWFkLl9NX25leHQ7CisgICAgICBmb3IgKDsgX19ub2RlICE9IDAgJiYgX19uID4gMDsgLS1fX24pCisJeworCSAgX19ub2RlLT5fTV9kYXRhID0gX192YWw7CisJICBfX3ByZXYgPSBfX25vZGU7CisJICBfX25vZGUgPSAoX05vZGUqKSBfX25vZGUtPl9NX25leHQ7CisJfQorICAgICAgaWYgKF9fbiA+IDApCisJX01faW5zZXJ0X2FmdGVyX2ZpbGwoX19wcmV2LCBfX24sIF9fdmFsKTsKKyAgICAgIGVsc2UKKwl0aGlzLT5fTV9lcmFzZV9hZnRlcihfX3ByZXYsIDApOworICAgIH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBzbGlzdDxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCQkJCQkgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJCQkJICAgICBfX2ZhbHNlX3R5cGUpCisgICAgICB7CisJX05vZGVfYmFzZSogX19wcmV2ID0gJnRoaXMtPl9NX2hlYWQ7CisJX05vZGUqIF9fbm9kZSA9IChfTm9kZSopIHRoaXMtPl9NX2hlYWQuX01fbmV4dDsKKwl3aGlsZSAoX19ub2RlICE9IDAgJiYgX19maXJzdCAhPSBfX2xhc3QpCisJICB7CisJICAgIF9fbm9kZS0+X01fZGF0YSA9ICpfX2ZpcnN0OworCSAgICBfX3ByZXYgPSBfX25vZGU7CisJICAgIF9fbm9kZSA9IChfTm9kZSopIF9fbm9kZS0+X01fbmV4dDsKKwkgICAgKytfX2ZpcnN0OworCSAgfQorCWlmIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwkgIF9NX2luc2VydF9hZnRlcl9yYW5nZShfX3ByZXYsIF9fZmlyc3QsIF9fbGFzdCk7CisJZWxzZQorCSAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19wcmV2LCAwKTsKKyAgICAgIH0KKyAgCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzbGlzdDxfVHAsX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgICBjb25zdF9pdGVyYXRvciBfX2VuZDEgPSBfU0wxLmVuZCgpOworICAgICAgY29uc3RfaXRlcmF0b3IgX19lbmQyID0gX1NMMi5lbmQoKTsKKyAgICAgIAorICAgICAgY29uc3RfaXRlcmF0b3IgX19pMSA9IF9TTDEuYmVnaW4oKTsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIF9faTIgPSBfU0wyLmJlZ2luKCk7CisgICAgICB3aGlsZSAoX19pMSAhPSBfX2VuZDEgJiYgX19pMiAhPSBfX2VuZDIgJiYgKl9faTEgPT0gKl9faTIpCisJeworCSAgKytfX2kxOworCSAgKytfX2kyOworCX0KKyAgICAgIHJldHVybiBfX2kxID09IF9fZW5kMSAmJiBfX2kyID09IF9fZW5kMjsKKyAgICB9CisKKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZShfU0wxLmJlZ2luKCksIF9TTDEuZW5kKCksCisJCQkJCSAgX1NMMi5iZWdpbigpLCBfU0wyLmVuZCgpKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gIShfU0wxID09IF9TTDIpOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMSwgY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wyKQorICAgIHsgcmV0dXJuIF9TTDIgPCBfU0wxOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDEsIGNvbnN0IHNsaXN0PF9UcCwgX0FsbG9jPiYgX1NMMikKKyAgICB7IHJldHVybiAhKF9TTDIgPCBfU0wxKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc2xpc3Q8X1RwLCBfQWxsb2M+JiBfU0wxLCBjb25zdCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9TTDIpCisgICAgeyByZXR1cm4gIShfU0wxIDwgX1NMMik7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHNsaXN0PF9UcCwgX0FsbG9jPiYgX194LCBzbGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6cmVzaXplKHNpemVfdHlwZSBfX2xlbiwgY29uc3QgX1RwJiBfX3gpCisgICAgeworICAgICAgX05vZGVfYmFzZSogX19jdXIgPSAmdGhpcy0+X01faGVhZDsKKyAgICAgIHdoaWxlIChfX2N1ci0+X01fbmV4dCAhPSAwICYmIF9fbGVuID4gMCkKKwl7CisJICAtLV9fbGVuOworCSAgX19jdXIgPSBfX2N1ci0+X01fbmV4dDsKKwl9CisgICAgICBpZiAoX19jdXItPl9NX25leHQpCisJdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIsIDApOworICAgICAgZWxzZQorCV9NX2luc2VydF9hZnRlcl9maWxsKF9fY3VyLCBfX2xlbiwgX194KTsKKyAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHZvaWQKKyAgICBzbGlzdDxfVHAsIF9BbGxvYz46OnJlbW92ZShjb25zdCBfVHAmIF9fdmFsKQorICAgIHsgCisgICAgICBfTm9kZV9iYXNlKiBfX2N1ciA9ICZ0aGlzLT5fTV9oZWFkOworICAgICAgd2hpbGUgKF9fY3VyICYmIF9fY3VyLT5fTV9uZXh0KQorCXsKKwkgIGlmICgoKF9Ob2RlKikgX19jdXItPl9NX25leHQpLT5fTV9kYXRhID09IF9fdmFsKQorCSAgICB0aGlzLT5fTV9lcmFzZV9hZnRlcihfX2N1cik7CisJICBlbHNlCisJICAgIF9fY3VyID0gX19jdXItPl9NX25leHQ7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX2N1ciA9IHRoaXMtPl9NX2hlYWQuX01fbmV4dDsKKyAgICAgIGlmIChfX2N1cikKKwl7CisJICB3aGlsZSAoX19jdXItPl9NX25leHQpCisJICAgIHsKKwkgICAgICBpZiAoKChfTm9kZSopX19jdXIpLT5fTV9kYXRhCisJCSAgPT0gKChfTm9kZSopKF9fY3VyLT5fTV9uZXh0KSktPl9NX2RhdGEpCisJCXRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3VyKTsKKwkgICAgICBlbHNlCisJCV9fY3VyID0gX19jdXItPl9NX25leHQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICB2b2lkCisgICAgc2xpc3Q8X1RwLCBfQWxsb2M+OjptZXJnZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9feCkKKyAgICB7CisgICAgICBfTm9kZV9iYXNlKiBfX24xID0gJnRoaXMtPl9NX2hlYWQ7CisgICAgICB3aGlsZSAoX19uMS0+X01fbmV4dCAmJiBfX3guX01faGVhZC5fTV9uZXh0KQorCXsKKwkgIGlmICgoKF9Ob2RlKikgX194Ll9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGEKKwkgICAgICA8ICgoX05vZGUqKSBfX24xLT5fTV9uZXh0KS0+X01fZGF0YSkKKwkgICAgX19zbGlzdF9zcGxpY2VfYWZ0ZXIoX19uMSwgJl9feC5fTV9oZWFkLCBfX3guX01faGVhZC5fTV9uZXh0KTsKKwkgIF9fbjEgPSBfX24xLT5fTV9uZXh0OworCX0KKyAgICAgIGlmIChfX3guX01faGVhZC5fTV9uZXh0KQorCXsKKwkgIF9fbjEtPl9NX25leHQgPSBfX3guX01faGVhZC5fTV9uZXh0OworCSAgX194Ll9NX2hlYWQuX01fbmV4dCA9IDA7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdm9pZAorICAgIHNsaXN0PF9UcCwgX0FsbG9jPjo6c29ydCgpCisgICAgeworICAgICAgaWYgKHRoaXMtPl9NX2hlYWQuX01fbmV4dCAmJiB0aGlzLT5fTV9oZWFkLl9NX25leHQtPl9NX25leHQpCisJeworCSAgc2xpc3QgX19jYXJyeTsKKwkgIHNsaXN0IF9fY291bnRlcls2NF07CisJICBpbnQgX19maWxsID0gMDsKKwkgIHdoaWxlICghZW1wdHkoKSkKKwkgICAgeworCSAgICAgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKCZfX2NhcnJ5Ll9NX2hlYWQsCisJCQkJICAgJnRoaXMtPl9NX2hlYWQsIHRoaXMtPl9NX2hlYWQuX01fbmV4dCk7CisJICAgICAgaW50IF9faSA9IDA7CisJICAgICAgd2hpbGUgKF9faSA8IF9fZmlsbCAmJiAhX19jb3VudGVyW19faV0uZW1wdHkoKSkKKwkJeworCQkgIF9fY291bnRlcltfX2ldLm1lcmdlKF9fY2FycnkpOworCQkgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pXSk7CisJCSAgKytfX2k7CisJCX0KKwkgICAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOworCSAgICAgIGlmIChfX2kgPT0gX19maWxsKQorCQkrK19fZmlsbDsKKwkgICAgfQorCSAgCisJICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPCBfX2ZpbGw7ICsrX19pKQorCSAgICBfX2NvdW50ZXJbX19pXS5tZXJnZShfX2NvdW50ZXJbX19pLTFdKTsKKwkgIHRoaXMtPnN3YXAoX19jb3VudGVyW19fZmlsbC0xXSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CisgICAgdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CisgICAgICB2b2lkIHNsaXN0PF9UcCwgX0FsbG9jPjo6cmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQorICAgICAgeworCV9Ob2RlX2Jhc2UqIF9fY3VyID0gJnRoaXMtPl9NX2hlYWQ7CisJd2hpbGUgKF9fY3VyLT5fTV9uZXh0KQorCSAgeworCSAgICBpZiAoX19wcmVkKCgoX05vZGUqKSBfX2N1ci0+X01fbmV4dCktPl9NX2RhdGEpKQorCSAgICAgIHRoaXMtPl9NX2VyYXNlX2FmdGVyKF9fY3VyKTsKKwkgICAgZWxzZQorCSAgICAgIF9fY3VyID0gX19jdXItPl9NX25leHQ7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+Ojp1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSBfX3ByZWQpCisgICAgICB7CisJX05vZGUqIF9fY3VyID0gKF9Ob2RlKikgdGhpcy0+X01faGVhZC5fTV9uZXh0OworCWlmIChfX2N1cikKKwkgIHsKKwkgICAgd2hpbGUgKF9fY3VyLT5fTV9uZXh0KQorCSAgICAgIHsKKwkJaWYgKF9fcHJlZCgoKF9Ob2RlKilfX2N1ciktPl9NX2RhdGEsCisJCQkgICAoKF9Ob2RlKikoX19jdXItPl9NX25leHQpKS0+X01fZGF0YSkpCisJCSAgdGhpcy0+X01fZXJhc2VfYWZ0ZXIoX19jdXIpOworCQllbHNlCisJCSAgX19jdXIgPSAoX05vZGUqKSBfX2N1ci0+X01fbmV4dDsKKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+OjptZXJnZShzbGlzdDxfVHAsIF9BbGxvYz4mIF9feCwKKwkJCSAgICAgICBfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKKyAgICAgIHsKKwlfTm9kZV9iYXNlKiBfX24xID0gJnRoaXMtPl9NX2hlYWQ7CisJd2hpbGUgKF9fbjEtPl9NX25leHQgJiYgX194Ll9NX2hlYWQuX01fbmV4dCkKKwkgIHsKKwkgICAgaWYgKF9fY29tcCgoKF9Ob2RlKikgX194Ll9NX2hlYWQuX01fbmV4dCktPl9NX2RhdGEsCisJCSAgICAgICAoKF9Ob2RlKikgX19uMS0+X01fbmV4dCktPl9NX2RhdGEpKQorCSAgICAgIF9fc2xpc3Rfc3BsaWNlX2FmdGVyKF9fbjEsICZfX3guX01faGVhZCwgX194Ll9NX2hlYWQuX01fbmV4dCk7CisJICAgIF9fbjEgPSBfX24xLT5fTV9uZXh0OworCSAgfQorCWlmIChfX3guX01faGVhZC5fTV9uZXh0KQorCSAgeworCSAgICBfX24xLT5fTV9uZXh0ID0gX194Ll9NX2hlYWQuX01fbmV4dDsKKwkgICAgX194Ll9NX2hlYWQuX01fbmV4dCA9IDA7CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgorICAgIHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgdm9pZAorICAgICAgc2xpc3Q8X1RwLCBfQWxsb2M+Ojpzb3J0KF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQorICAgICAgeworCWlmICh0aGlzLT5fTV9oZWFkLl9NX25leHQgJiYgdGhpcy0+X01faGVhZC5fTV9uZXh0LT5fTV9uZXh0KQorCSAgeworCSAgICBzbGlzdCBfX2NhcnJ5OworCSAgICBzbGlzdCBfX2NvdW50ZXJbNjRdOworCSAgICBpbnQgX19maWxsID0gMDsKKwkgICAgd2hpbGUgKCFlbXB0eSgpKQorCSAgICAgIHsKKwkJX19zbGlzdF9zcGxpY2VfYWZ0ZXIoJl9fY2FycnkuX01faGVhZCwKKwkJCQkgICAgICZ0aGlzLT5fTV9oZWFkLCB0aGlzLT5fTV9oZWFkLl9NX25leHQpOworCQlpbnQgX19pID0gMDsKKwkJd2hpbGUgKF9faSA8IF9fZmlsbCAmJiAhX19jb3VudGVyW19faV0uZW1wdHkoKSkKKwkJICB7CisJCSAgICBfX2NvdW50ZXJbX19pXS5tZXJnZShfX2NhcnJ5LCBfX2NvbXApOworCQkgICAgX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKwkJICAgICsrX19pOworCQkgIH0KKwkJX19jYXJyeS5zd2FwKF9fY291bnRlcltfX2ldKTsKKwkJaWYgKF9faSA9PSBfX2ZpbGwpCisJCSAgKytfX2ZpbGw7CisJICAgICAgfQorCisJICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IF9fZmlsbDsgKytfX2kpCisJICAgICAgX19jb3VudGVyW19faV0ubWVyZ2UoX19jb3VudGVyW19faS0xXSwgX19jb21wKTsKKwkgICAgdGhpcy0+c3dhcChfX2NvdW50ZXJbX19maWxsLTFdKTsKKwkgIH0KKyAgICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gU3BlY2lhbGl6YXRpb24gb2YgaW5zZXJ0X2l0ZXJhdG9yIHNvIHRoYXQgaW5zZXJ0aW9ucyB3aWxsIGJlIGNvbnN0YW50CisgIC8vIHRpbWUgcmF0aGVyIHRoYW4gbGluZWFyIHRpbWUuCisgIHRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KKyAgICBjbGFzcyBpbnNlcnRfaXRlcmF0b3I8X19nbnVfY3h4OjpzbGlzdDxfVHAsIF9BbGxvYz4gPgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6c2xpc3Q8X1RwLCBfQWxsb2M+IF9Db250YWluZXI7CisgICAgICBfQ29udGFpbmVyKiBjb250YWluZXI7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBpdGVyOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOworICAgICAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworCisgICAgICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpCisgICAgICA6IGNvbnRhaW5lcigmX194KQorICAgICAgeworCWlmIChfX2kgPT0gX194LmJlZ2luKCkpCisJICBpdGVyID0gX194LmJlZm9yZV9iZWdpbigpOworCWVsc2UKKwkgIGl0ZXIgPSBfX3gucHJldmlvdXMoX19pKTsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1lIF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpCisgICAgICB7CisJaXRlciA9IGNvbnRhaW5lci0+aW5zZXJ0X2FmdGVyKGl0ZXIsIF9fdmFsdWUpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IqKCkKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zc29fc3RyaW5nX2Jhc2UuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3Nzb19zdHJpbmdfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTYyZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zc29fc3RyaW5nX2Jhc2UuaApAQCAtMCwwICsxLDU5OCBAQAorLy8gU2hvcnQtc3RyaW5nLW9wdGltaXplZCB2ZXJzYXRpbGUgc3RyaW5nIGJhc2UgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3Nzb19zdHJpbmdfYmFzZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3ZzdHJpbmcuaH0KKyAqLworCisjaWZuZGVmIF9TU09fU1RSSU5HX0JBU0VfSAorI2RlZmluZSBfU1NPX1NUUklOR19CQVNFX0ggMQorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgX19zc29fc3RyaW5nX2Jhc2UKKyAgICA6IHByb3RlY3RlZCBfX3ZzdHJpbmdfdXRpbGl0eTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX192c3RyaW5nX3V0aWxpdHk8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+ICAgIF9VdGlsX0Jhc2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9VdGlsX0Jhc2U6Ol9DaGFyVF9hbGxvY190eXBlICAgICAgICBfQ2hhclRfYWxsb2NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnNpemVfdHlwZQkgICAgc2l6ZV90eXBlOworICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIERhdGEgTWVtYmVyczoKKyAgICAgIHR5cGVuYW1lIF9VdGlsX0Jhc2U6OnRlbXBsYXRlIF9BbGxvY19oaWRlcjxfQ2hhclRfYWxsb2NfdHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2RhdGFwbHVzOworICAgICAgc2l6ZV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RyaW5nX2xlbmd0aDsKKworICAgICAgZW51bSB7IF9TX2xvY2FsX2NhcGFjaXR5ID0gMTUgfTsKKyAgICAgIAorICAgICAgdW5pb24KKyAgICAgIHsKKwlfQ2hhclQgICAgICAgICAgIF9NX2xvY2FsX2RhdGFbX1NfbG9jYWxfY2FwYWNpdHkgKyAxXTsKKwlzaXplX3R5cGUgICAgICAgIF9NX2FsbG9jYXRlZF9jYXBhY2l0eTsKKyAgICAgIH07CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RhdGEoX0NoYXJUKiBfX3ApCisgICAgICB7IF9NX2RhdGFwbHVzLl9NX3AgPSBfX3A7IH0KKworICAgICAgdm9pZAorICAgICAgX01fbGVuZ3RoKHNpemVfdHlwZSBfX2xlbmd0aCkKKyAgICAgIHsgX01fc3RyaW5nX2xlbmd0aCA9IF9fbGVuZ3RoOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NhcGFjaXR5KHNpemVfdHlwZSBfX2NhcGFjaXR5KQorICAgICAgeyBfTV9hbGxvY2F0ZWRfY2FwYWNpdHkgPSBfX2NhcGFjaXR5OyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX2xvY2FsKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGEoKSA9PSBfTV9sb2NhbF9kYXRhOyB9CisKKyAgICAgIC8vIENyZWF0ZSAmIERlc3Ryb3kKKyAgICAgIF9DaGFyVCoKKyAgICAgIF9NX2NyZWF0ZShzaXplX3R5cGUmLCBzaXplX3R5cGUpOworICAgICAgCisgICAgICB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkKKyAgICAgIHsKKwlpZiAoIV9NX2lzX2xvY2FsKCkpCisJICBfTV9kZXN0cm95KF9NX2FsbG9jYXRlZF9jYXBhY2l0eSk7CisjaWYgX19nb29nbGVfc3RsX2RlYnVnX3N0cmluZ19kYW5nbGluZworCWVsc2UgeworICAgICAgICAgIC8vIFdpcGUgbG9jYWwgc3RvcmFnZSBmb3IgZGVzdHJ1Y3RlZCBzdHJpbmcgd2l0aCAweENELgorICAgICAgICAgIC8vIFRoaXMgbWltaWNzIHdoYXQgRGVidWdBbGxvY2F0aW9uIGRvZXMgdG8gZnJlZSgpZCBtZW1vcnkuCisgICAgICAgICAgX19idWlsdGluX21lbXNldChfTV9sb2NhbF9kYXRhLCAweGNkLCBzaXplb2YoX01fbG9jYWxfZGF0YSkpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveShzaXplX3R5cGUgX19zaXplKSB0aHJvdygpCisgICAgICB7IF9NX2dldF9hbGxvY2F0b3IoKS5kZWFsbG9jYXRlKF9NX2RhdGEoKSwgX19zaXplICsgMSk7IH0KKworICAgICAgLy8gX01fY29uc3RydWN0X2F1eCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgMjEuMy4xIHBhcmEgMTUgd2hpY2gKKyAgICAgIC8vIHJlcXVpcmVzIHNwZWNpYWwgYmVoYXZpb3VyIGlmIF9Jbkl0ZXJhdG9yIGlzIGFuIGludGVncmFsIHR5cGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Jbkl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdF9hdXgoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLCAKKwkJCSBzdGQ6Ol9fZmFsc2VfdHlwZSkKKwl7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0luSXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSBfVGFnOworICAgICAgICAgIF9NX2NvbnN0cnVjdChfX2JlZywgX19lbmQsIF9UYWcoKSk7CisJfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzguIEFtYmlndWl0eSBpbiB0aGUgImRvIHRoZSByaWdodCB0aGluZyIgY2xhdXNlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50ZWdlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb25zdHJ1Y3RfYXV4KF9JbnRlZ2VyIF9fYmVnLCBfSW50ZWdlciBfX2VuZCwgc3RkOjpfX3RydWVfdHlwZSkKKwl7IF9NX2NvbnN0cnVjdF9hdXhfMihzdGF0aWNfY2FzdDxzaXplX3R5cGU+KF9fYmVnKSwgX19lbmQpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvbnN0cnVjdF9hdXhfMihzaXplX3R5cGUgX19yZXEsIF9DaGFyVCBfX2MpCisgICAgICB7IF9NX2NvbnN0cnVjdChfX3JlcSwgX19jKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kKQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpfX2lzX2ludGVnZXI8X0luSXRlcmF0b3I+OjpfX3R5cGUgX0ludGVncmFsOworCSAgX01fY29uc3RydWN0X2F1eChfX2JlZywgX19lbmQsIF9JbnRlZ3JhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBGb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBfTV9jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLAorCQkgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnKTsKKyAgICAgIAorICAgICAgLy8gRm9yIGZvcndhcmRfaXRlcmF0b3JzIHVwIHRvIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JzLCB1c2VkIGZvcgorICAgICAgLy8gc3RyaW5nOjppdGVyYXRvciwgX0NoYXJUKiwgZXRjLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX2NvbnN0cnVjdChfRndkSXRlcmF0b3IgX19iZWcsIF9Gd2RJdGVyYXRvciBfX2VuZCwKKwkJICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKTsKKworICAgICAgdm9pZAorICAgICAgX01fY29uc3RydWN0KHNpemVfdHlwZSBfX3JlcSwgX0NoYXJUIF9fYyk7CisKKyAgICBwdWJsaWM6CisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX21heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfTV9nZXRfYWxsb2NhdG9yKCkubWF4X3NpemUoKSAtIDEpIC8gMjsgfQorCisgICAgICBfQ2hhclQqCisgICAgICBfTV9kYXRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzLl9NX3A7IH0KKworICAgICAgc2l6ZV90eXBlCisgICAgICBfTV9sZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RyaW5nX2xlbmd0aDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIF9NX2NhcGFjaXR5KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01faXNfbG9jYWwoKSA/IHNpemVfdHlwZShfU19sb2NhbF9jYXBhY2l0eSkKKwkgICAgICAgICAgICAgICAgICAgICA6IF9NX2FsbG9jYXRlZF9jYXBhY2l0eTsgCisgICAgICB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2lzX3NoYXJlZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbGVha2VkKCkgeyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2xlYWsoKSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fc2V0X2xlbmd0aF9ub193aXBlKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX01fbGVuZ3RoKF9fbik7CisJdHJhaXRzX3R5cGU6OmFzc2lnbihfTV9kYXRhKClbX19uXSwgX0NoYXJUKCkpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfbGVuZ3RoKHNpemVfdHlwZSBfX24pCisgICAgICB7CisjaWYgX19nb29nbGVfc3RsX2RlYnVnX3N0cmluZ19kYW5nbGluZworCWlmIChfX24gKyAxIDwgX01fbGVuZ3RoKCkpCisJICB7CisJICAgIC8vIFdpcGUgdGhlIHN0b3JhZ2Ugd2l0aCAweENELgorCSAgICAvLyBBbHNvIHdpcGVzIHRoZSBvbGQgTlVMIHRlcm1pbmF0b3IuCisJICAgIF9fYnVpbHRpbl9tZW1zZXQoX01fZGF0YSgpICsgX19uICsgMSwgMHhjZCwgX01fbGVuZ3RoKCkgLSBfX24pOworCSAgfQorI2VuZGlmCisJICBfTV9zZXRfbGVuZ3RoX25vX3dpcGUoX19uKTsKKyAgICAgIH0KKworICAgICAgX19zc29fc3RyaW5nX2Jhc2UoKQorICAgICAgOiBfTV9kYXRhcGx1cyhfTV9sb2NhbF9kYXRhKQorICAgICAgeyBfTV9zZXRfbGVuZ3RoX25vX3dpcGUoMCk7IH0KKworICAgICAgX19zc29fc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICBfX3Nzb19zdHJpbmdfYmFzZShjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlKF9fc3NvX3N0cmluZ19iYXNlJiYgX19yY3MpOworI2VuZGlmCisKKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIF9fc3NvX3N0cmluZ19iYXNlKF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCwKKwkJCSAgY29uc3QgX0FsbG9jJiBfX2EpOworCisgICAgICB+X19zc29fc3RyaW5nX2Jhc2UoKQorICAgICAgeyBfTV9kaXNwb3NlKCk7IH0KKworICAgICAgX0NoYXJUX2FsbG9jX3R5cGUmCisgICAgICBfTV9nZXRfYWxsb2NhdG9yKCkKKyAgICAgIHsgcmV0dXJuIF9NX2RhdGFwbHVzOyB9CisKKyAgICAgIGNvbnN0IF9DaGFyVF9hbGxvY190eXBlJgorICAgICAgX01fZ2V0X2FsbG9jYXRvcigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9kYXRhcGx1czsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fc3NvX3N0cmluZ19iYXNlJiBfX3Jjcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbihjb25zdCBfX3Nzb19zdHJpbmdfYmFzZSYgX19yY3MpOworCisgICAgICB2b2lkCisgICAgICBfTV9yZXNlcnZlKHNpemVfdHlwZSBfX3Jlcyk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX211dGF0ZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX2xlbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCQlzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgdm9pZAorICAgICAgX01fZXJhc2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fY2xlYXIoKQorICAgICAgeyBfTV9zZXRfbGVuZ3RoKDApOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX19zc29fc3RyaW5nX2Jhc2UmKSBjb25zdAorICAgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX3N3YXAoX19zc29fc3RyaW5nX2Jhc2UmIF9fcmNzKQorICAgIHsKKyAgICAgIGlmICh0aGlzID09ICZfX3JjcykKKwlyZXR1cm47CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDQzMS4gU3dhcHBpbmcgY29udGFpbmVycyB3aXRoIHVuZXF1YWwgYWxsb2NhdG9ycy4KKyAgICAgIHN0ZDo6X19hbGxvY19zd2FwPF9DaGFyVF9hbGxvY190eXBlPjo6X1NfZG9faXQoX01fZ2V0X2FsbG9jYXRvcigpLAorCQkJCQkJICAgICBfX3Jjcy5fTV9nZXRfYWxsb2NhdG9yKCkpOworCisgICAgICBpZiAoX01faXNfbG9jYWwoKSkKKwlpZiAoX19yY3MuX01faXNfbG9jYWwoKSkKKwkgIHsKKwkgICAgaWYgKF9NX2xlbmd0aCgpICYmIF9fcmNzLl9NX2xlbmd0aCgpKQorCSAgICAgIHsKKwkJX0NoYXJUIF9fdG1wX2RhdGFbX1NfbG9jYWxfY2FwYWNpdHkgKyAxXTsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX190bXBfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCXRyYWl0c190eXBlOjpjb3B5KF9fcmNzLl9NX2xvY2FsX2RhdGEsIF9NX2xvY2FsX2RhdGEsCisJCQkJICBfU19sb2NhbF9jYXBhY2l0eSArIDEpOworCQl0cmFpdHNfdHlwZTo6Y29weShfTV9sb2NhbF9kYXRhLCBfX3RtcF9kYXRhLAorCQkJCSAgX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9fcmNzLl9NX2xlbmd0aCgpKQorCSAgICAgIHsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX01fbG9jYWxfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCV9NX2xlbmd0aChfX3Jjcy5fTV9sZW5ndGgoKSk7CisJCV9fcmNzLl9NX3NldF9sZW5ndGgoMCk7CisJCXJldHVybjsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKF9NX2xlbmd0aCgpKQorCSAgICAgIHsKKwkJdHJhaXRzX3R5cGU6OmNvcHkoX19yY3MuX01fbG9jYWxfZGF0YSwgX01fbG9jYWxfZGF0YSwKKwkJCQkgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJCV9fcmNzLl9NX2xlbmd0aChfTV9sZW5ndGgoKSk7CisJCV9NX3NldF9sZW5ndGgoMCk7CisJCXJldHVybjsKKwkgICAgICB9CisJICB9CisJZWxzZQorCSAgeworCSAgICBjb25zdCBzaXplX3R5cGUgX190bXBfY2FwYWNpdHkgPSBfX3Jjcy5fTV9hbGxvY2F0ZWRfY2FwYWNpdHk7CisJICAgIHRyYWl0c190eXBlOjpjb3B5KF9fcmNzLl9NX2xvY2FsX2RhdGEsIF9NX2xvY2FsX2RhdGEsCisJCQkgICAgICBfU19sb2NhbF9jYXBhY2l0eSArIDEpOworCSAgICBfTV9kYXRhKF9fcmNzLl9NX2RhdGEoKSk7CisJICAgIF9fcmNzLl9NX2RhdGEoX19yY3MuX01fbG9jYWxfZGF0YSk7CisJICAgIF9NX2NhcGFjaXR5KF9fdG1wX2NhcGFjaXR5KTsKKwkgIH0KKyAgICAgIGVsc2UKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX190bXBfY2FwYWNpdHkgPSBfTV9hbGxvY2F0ZWRfY2FwYWNpdHk7CisJICBpZiAoX19yY3MuX01faXNfbG9jYWwoKSkKKwkgICAgeworCSAgICAgIHRyYWl0c190eXBlOjpjb3B5KF9NX2xvY2FsX2RhdGEsIF9fcmNzLl9NX2xvY2FsX2RhdGEsCisJCQkJX1NfbG9jYWxfY2FwYWNpdHkgKyAxKTsKKwkgICAgICBfX3Jjcy5fTV9kYXRhKF9NX2RhdGEoKSk7CisJICAgICAgX01fZGF0YShfTV9sb2NhbF9kYXRhKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgX0NoYXJUKiBfX3RtcF9wdHIgPSBfTV9kYXRhKCk7CisJICAgICAgX01fZGF0YShfX3Jjcy5fTV9kYXRhKCkpOworCSAgICAgIF9fcmNzLl9NX2RhdGEoX190bXBfcHRyKTsKKwkgICAgICBfTV9jYXBhY2l0eShfX3Jjcy5fTV9hbGxvY2F0ZWRfY2FwYWNpdHkpOworCSAgICB9CisJICBfX3Jjcy5fTV9jYXBhY2l0eShfX3RtcF9jYXBhY2l0eSk7CisJfQorCisgICAgICBjb25zdCBzaXplX3R5cGUgX190bXBfbGVuZ3RoID0gX01fbGVuZ3RoKCk7CisgICAgICBfTV9sZW5ndGgoX19yY3MuX01fbGVuZ3RoKCkpOworICAgICAgX19yY3MuX01fbGVuZ3RoKF9fdG1wX2xlbmd0aCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9DaGFyVCoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2NyZWF0ZShzaXplX3R5cGUmIF9fY2FwYWNpdHksIHNpemVfdHlwZSBfX29sZF9jYXBhY2l0eSkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4My4gIFN0cmluZzo6bnBvcyB2cy4gc3RyaW5nOjptYXhfc2l6ZSgpCisgICAgICBpZiAoX19jYXBhY2l0eSA+IF9NX21heF9zaXplKCkpCisJc3RkOjpfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oIl9fc3NvX3N0cmluZ19iYXNlOjpfTV9jcmVhdGUiKSk7CisKKyAgICAgIC8vIFRoZSBiZWxvdyBpbXBsZW1lbnRzIGFuIGV4cG9uZW50aWFsIGdyb3d0aCBwb2xpY3ksIG5lY2Vzc2FyeSB0bworICAgICAgLy8gbWVldCBhbW9ydGl6ZWQgbGluZWFyIHRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZSBsaWJyYXJ5OiBzZWUKKyAgICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9tbC9saWJzdGRjKysvMjAwMS0wNy9tc2cwMDA4NS5odG1sLgorICAgICAgaWYgKF9fY2FwYWNpdHkgPiBfX29sZF9jYXBhY2l0eSAmJiBfX2NhcGFjaXR5IDwgMiAqIF9fb2xkX2NhcGFjaXR5KQorCXsKKwkgIF9fY2FwYWNpdHkgPSAyICogX19vbGRfY2FwYWNpdHk7CisJICAvLyBOZXZlciBhbGxvY2F0ZSBhIHN0cmluZyBiaWdnZXIgdGhhbiBtYXhfc2l6ZS4KKwkgIGlmIChfX2NhcGFjaXR5ID4gX01fbWF4X3NpemUoKSkKKwkgICAgX19jYXBhY2l0eSA9IF9NX21heF9zaXplKCk7CisJfQorCisgICAgICAvLyBOQjogTmVlZCBhbiBhcnJheSBvZiBjaGFyX3R5cGVbX19jYXBhY2l0eV0sIHBsdXMgYSB0ZXJtaW5hdGluZworICAgICAgLy8gbnVsbCBjaGFyX3R5cGUoKSBlbGVtZW50LgorICAgICAgcmV0dXJuIF9NX2dldF9hbGxvY2F0b3IoKS5hbGxvY2F0ZShfX2NhcGFjaXR5ICsgMSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX19zc29fc3RyaW5nX2Jhc2UoY29uc3QgX0FsbG9jJiBfX2EpCisgICAgOiBfTV9kYXRhcGx1cyhfX2EsIF9NX2xvY2FsX2RhdGEpCisgICAgeyBfTV9zZXRfbGVuZ3RoX25vX3dpcGUoMCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fc3NvX3N0cmluZ19iYXNlKGNvbnN0IF9fc3NvX3N0cmluZ19iYXNlJiBfX3JjcykKKyAgICA6IF9NX2RhdGFwbHVzKF9fcmNzLl9NX2dldF9hbGxvY2F0b3IoKSwgX01fbG9jYWxfZGF0YSkKKyAgICB7IF9NX2NvbnN0cnVjdChfX3Jjcy5fTV9kYXRhKCksIF9fcmNzLl9NX2RhdGEoKSArIF9fcmNzLl9NX2xlbmd0aCgpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfX3Nzb19zdHJpbmdfYmFzZShfX3Nzb19zdHJpbmdfYmFzZSYmIF9fcmNzKQorICAgIDogX01fZGF0YXBsdXMoX19yY3MuX01fZ2V0X2FsbG9jYXRvcigpLCBfTV9sb2NhbF9kYXRhKQorICAgIHsKKyAgICAgIGlmIChfX3Jjcy5fTV9pc19sb2NhbCgpKQorCXsKKwkgIGlmIChfX3Jjcy5fTV9sZW5ndGgoKSkKKwkgICAgdHJhaXRzX3R5cGU6OmNvcHkoX01fbG9jYWxfZGF0YSwgX19yY3MuX01fbG9jYWxfZGF0YSwKKwkJCSAgICAgIF9TX2xvY2FsX2NhcGFjaXR5ICsgMSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9NX2RhdGEoX19yY3MuX01fZGF0YSgpKTsKKwkgIF9NX2NhcGFjaXR5KF9fcmNzLl9NX2FsbG9jYXRlZF9jYXBhY2l0eSk7CisJfQorCisgICAgICBfTV9sZW5ndGgoX19yY3MuX01fbGVuZ3RoKCkpOworICAgICAgX19yY3MuX01fbGVuZ3RoKDApOworICAgICAgX19yY3MuX01fZGF0YShfX3Jjcy5fTV9sb2NhbF9kYXRhKTsKKyAgICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9fc3NvX3N0cmluZ19iYXNlKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hKQorICAgIDogX01fZGF0YXBsdXMoX19hLCBfTV9sb2NhbF9kYXRhKQorICAgIHsgX01fY29uc3RydWN0KF9fbiwgX19jKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX19zc29fc3RyaW5nX2Jhc2UoX0lucHV0SXRlcmF0b3IgX19iZWcsIF9JbnB1dEl0ZXJhdG9yIF9fZW5kLAorCQkgICAgICBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICA6IF9NX2RhdGFwbHVzKF9fYSwgX01fbG9jYWxfZGF0YSkKKyAgICB7IF9NX2NvbnN0cnVjdChfX2JlZywgX19lbmQpOyB9CisKKyAgLy8gTkI6IFRoaXMgaXMgdGhlIHNwZWNpYWwgY2FzZSBmb3IgSW5wdXQgSXRlcmF0b3JzLCB1c2VkIGluCisgIC8vIGlzdHJlYW1idWZfaXRlcmF0b3JzLCBldGMuCisgIC8vIElucHV0IEl0ZXJhdG9ycyBoYXZlIGEgY29zdCBzdHJ1Y3R1cmUgdmVyeSBkaWZmZXJlbnQgZnJvbQorICAvLyBwb2ludGVycywgY2FsbGluZyBmb3IgYSBkaWZmZXJlbnQgY29kaW5nIHN0eWxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5JdGVyYXRvcj4KKyAgICAgIHZvaWQKKyAgICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgICBfTV9jb25zdHJ1Y3QoX0luSXRlcmF0b3IgX19iZWcsIF9Jbkl0ZXJhdG9yIF9fZW5kLAorCQkgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwlzaXplX3R5cGUgX19sZW4gPSAwOworCXNpemVfdHlwZSBfX2NhcGFjaXR5ID0gc2l6ZV90eXBlKF9TX2xvY2FsX2NhcGFjaXR5KTsKKworCXdoaWxlIChfX2JlZyAhPSBfX2VuZCAmJiBfX2xlbiA8IF9fY2FwYWNpdHkpCisJICB7CisJICAgIF9NX2RhdGEoKVtfX2xlbisrXSA9ICpfX2JlZzsKKwkgICAgKytfX2JlZzsKKwkgIH0KKwkKKwlfX3RyeQorCSAgeworCSAgICB3aGlsZSAoX19iZWcgIT0gX19lbmQpCisJICAgICAgeworCQlpZiAoX19sZW4gPT0gX19jYXBhY2l0eSkKKwkJICB7CisJCSAgICAvLyBBbGxvY2F0ZSBtb3JlIHNwYWNlLgorCQkgICAgX19jYXBhY2l0eSA9IF9fbGVuICsgMTsKKwkJICAgIF9DaGFyVCogX19hbm90aGVyID0gX01fY3JlYXRlKF9fY2FwYWNpdHksIF9fbGVuKTsKKwkJICAgIHRoaXMtPl9TX2NvcHkoX19hbm90aGVyLCBfTV9kYXRhKCksIF9fbGVuKTsKKwkJICAgIF9NX2Rpc3Bvc2UoKTsKKwkJICAgIF9NX2RhdGEoX19hbm90aGVyKTsKKwkJICAgIF9NX2NhcGFjaXR5KF9fY2FwYWNpdHkpOworCQkgIH0KKwkJX01fZGF0YSgpW19fbGVuKytdID0gKl9fYmVnOworCQkrK19fYmVnOworCSAgICAgIH0KKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGlzcG9zZSgpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKworCV9NX3NldF9sZW5ndGhfbm9fd2lwZShfX2xlbik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0luSXRlcmF0b3I+CisgICAgICB2b2lkCisgICAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgICAgX01fY29uc3RydWN0KF9Jbkl0ZXJhdG9yIF9fYmVnLCBfSW5JdGVyYXRvciBfX2VuZCwKKwkJICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykKKyAgICAgIHsKKwkvLyBOQjogTm90IHJlcXVpcmVkLCBidXQgY29uc2lkZXJlZCBiZXN0IHByYWN0aWNlLgorCWlmIChfX2lzX251bGxfcG9pbnRlcihfX2JlZykgJiYgX19iZWcgIT0gX19lbmQpCisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoX19OKCJfX3Nzb19zdHJpbmdfYmFzZTo6IgorCQkJCSAgICAgICAiX01fY29uc3RydWN0IG51bGwgbm90IHZhbGlkIikpOworCisJc2l6ZV90eXBlIF9fZG5ldyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oc3RkOjpkaXN0YW5jZShfX2JlZywgX19lbmQpKTsKKworCWlmIChfX2RuZXcgPiBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpKQorCSAgeworCSAgICBfTV9kYXRhKF9NX2NyZWF0ZShfX2RuZXcsIHNpemVfdHlwZSgwKSkpOworCSAgICBfTV9jYXBhY2l0eShfX2RuZXcpOworCSAgfQorCisJLy8gQ2hlY2sgZm9yIG91dF9vZl9yYW5nZSBhbmQgbGVuZ3RoX2Vycm9yIGV4Y2VwdGlvbnMuCisJX190cnkKKwkgIHsgdGhpcy0+X1NfY29weV9jaGFycyhfTV9kYXRhKCksIF9fYmVnLCBfX2VuZCk7IH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fZGlzcG9zZSgpOworCSAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgIH0KKworCV9NX3NldF9sZW5ndGhfbm9fd2lwZShfX2RuZXcpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2NvbnN0cnVjdChzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgIHsKKyAgICAgIGlmIChfX24gPiBzaXplX3R5cGUoX1NfbG9jYWxfY2FwYWNpdHkpKQorCXsKKwkgIF9NX2RhdGEoX01fY3JlYXRlKF9fbiwgc2l6ZV90eXBlKDApKSk7CisJICBfTV9jYXBhY2l0eShfX24pOworCX0KKworICAgICAgaWYgKF9fbikKKwl0aGlzLT5fU19hc3NpZ24oX01fZGF0YSgpLCBfX24sIF9fYyk7CisKKyAgICAgIF9NX3NldF9sZW5ndGhfbm9fd2lwZShfX24pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICB2b2lkCisgICAgX19zc29fc3RyaW5nX2Jhc2U8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+OjoKKyAgICBfTV9hc3NpZ24oY29uc3QgX19zc29fc3RyaW5nX2Jhc2UmIF9fcmNzKQorICAgIHsKKyAgICAgIGlmICh0aGlzICE9ICZfX3JjcykKKwl7CisJICBjb25zdCBzaXplX3R5cGUgX19yc2l6ZSA9IF9fcmNzLl9NX2xlbmd0aCgpOworCSAgY29uc3Qgc2l6ZV90eXBlIF9fY2FwYWNpdHkgPSBfTV9jYXBhY2l0eSgpOworCisJICBpZiAoX19yc2l6ZSA+IF9fY2FwYWNpdHkpCisJICAgIHsKKwkgICAgICBzaXplX3R5cGUgX19uZXdfY2FwYWNpdHkgPSBfX3JzaXplOworCSAgICAgIF9DaGFyVCogX190bXAgPSBfTV9jcmVhdGUoX19uZXdfY2FwYWNpdHksIF9fY2FwYWNpdHkpOworCSAgICAgIF9NX2Rpc3Bvc2UoKTsKKwkgICAgICBfTV9kYXRhKF9fdG1wKTsKKwkgICAgICBfTV9jYXBhY2l0eShfX25ld19jYXBhY2l0eSk7CisJICAgIH0KKworCSAgaWYgKF9fcnNpemUpCisJICAgIHRoaXMtPl9TX2NvcHkoX01fZGF0YSgpLCBfX3Jjcy5fTV9kYXRhKCksIF9fcnNpemUpOworCisJICBfTV9zZXRfbGVuZ3RoKF9fcnNpemUpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fcmVzZXJ2ZShzaXplX3R5cGUgX19yZXMpCisgICAgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNocmluayBiZWxvdyB0aGUgY3VycmVudCBzaXplLgorICAgICAgaWYgKF9fcmVzIDwgX01fbGVuZ3RoKCkpCisJX19yZXMgPSBfTV9sZW5ndGgoKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fY2FwYWNpdHkgPSBfTV9jYXBhY2l0eSgpOworICAgICAgaWYgKF9fcmVzICE9IF9fY2FwYWNpdHkpCisJeworCSAgaWYgKF9fcmVzID4gX19jYXBhY2l0eQorCSAgICAgIHx8IF9fcmVzID4gc2l6ZV90eXBlKF9TX2xvY2FsX2NhcGFjaXR5KSkKKwkgICAgeworCSAgICAgIF9DaGFyVCogX190bXAgPSBfTV9jcmVhdGUoX19yZXMsIF9fY2FwYWNpdHkpOworCSAgICAgIHRoaXMtPl9TX2NvcHkoX190bXAsIF9NX2RhdGEoKSwgX01fbGVuZ3RoKCkgKyAxKTsKKwkgICAgICBfTV9kaXNwb3NlKCk7CisJICAgICAgX01fZGF0YShfX3RtcCk7CisJICAgICAgX01fY2FwYWNpdHkoX19yZXMpOworCSAgICB9CisJICBlbHNlIGlmICghX01faXNfbG9jYWwoKSkKKwkgICAgeworCSAgICAgIHRoaXMtPl9TX2NvcHkoX01fbG9jYWxfZGF0YSwgX01fZGF0YSgpLCBfTV9sZW5ndGgoKSArIDEpOworCSAgICAgIF9NX2Rlc3Ryb3koX19jYXBhY2l0eSk7CisJICAgICAgX01fZGF0YShfTV9sb2NhbF9kYXRhKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgdm9pZAorICAgIF9fc3NvX3N0cmluZ19iYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6CisgICAgX01fbXV0YXRlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgc2l6ZV90eXBlIF9fbGVuMikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19ob3dfbXVjaCA9IF9NX2xlbmd0aCgpIC0gX19wb3MgLSBfX2xlbjE7CisgICAgICAKKyAgICAgIHNpemVfdHlwZSBfX25ld19jYXBhY2l0eSA9IF9NX2xlbmd0aCgpICsgX19sZW4yIC0gX19sZW4xOworICAgICAgX0NoYXJUKiBfX3IgPSBfTV9jcmVhdGUoX19uZXdfY2FwYWNpdHksIF9NX2NhcGFjaXR5KCkpOworCisgICAgICBpZiAoX19wb3MpCisJdGhpcy0+X1NfY29weShfX3IsIF9NX2RhdGEoKSwgX19wb3MpOworICAgICAgaWYgKF9fcyAmJiBfX2xlbjIpCisJdGhpcy0+X1NfY29weShfX3IgKyBfX3BvcywgX19zLCBfX2xlbjIpOworICAgICAgaWYgKF9faG93X211Y2gpCisJdGhpcy0+X1NfY29weShfX3IgKyBfX3BvcyArIF9fbGVuMiwKKwkJICAgICAgX01fZGF0YSgpICsgX19wb3MgKyBfX2xlbjEsIF9faG93X211Y2gpOworICAgICAgCisgICAgICBfTV9kaXNwb3NlKCk7CisgICAgICBfTV9kYXRhKF9fcik7CisgICAgICBfTV9jYXBhY2l0eShfX25ld19jYXBhY2l0eSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHZvaWQKKyAgICBfX3Nzb19zdHJpbmdfYmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OgorICAgIF9NX2VyYXNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19ob3dfbXVjaCA9IF9NX2xlbmd0aCgpIC0gX19wb3MgLSBfX247CisKKyAgICAgIGlmIChfX2hvd19tdWNoICYmIF9fbikKKwl0aGlzLT5fU19tb3ZlKF9NX2RhdGEoKSArIF9fcG9zLCBfTV9kYXRhKCkgKyBfX3BvcyArIF9fbiwgX19ob3dfbXVjaCk7CisKKyAgICAgIF9NX3NldF9sZW5ndGgoX01fbGVuZ3RoKCkgLSBfX24pOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX1NTT19TVFJJTkdfQkFTRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zdGRpb19maWxlYnVmLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zdGRpb19maWxlYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiMmZmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3N0ZGlvX2ZpbGVidWYuaApAQCAtMCwwICsxLDE2MiBAQAorLy8gRmlsZSBkZXNjcmlwdG9yIGxheWVyIGZvciBmaWxlYnVmIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC9zdGRpb19maWxlYnVmLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9TVERJT19GSUxFQlVGX0gKKyNkZWZpbmUgX1NURElPX0ZJTEVCVUZfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBQcm92aWRlcyBhIGxheWVyIG9mIGNvbXBhdGliaWxpdHkgZm9yIEMvUE9TSVguCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBHTlUgZXh0ZW5zaW9uIHByb3ZpZGVzIGV4dGVuc2lvbnMgZm9yIHdvcmtpbmcgd2l0aCBzdGFuZGFyZCBDCisgICAqICBGSUxFKidzIGFuZCBQT1NJWCBmaWxlIGRlc2NyaXB0b3JzLiAgSXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCisgICAqICB1c2VyIHdpdGggdGhlIHR5cGUgb2YgY2hhcmFjdGVyIHVzZWQgaW4gdGhlIGZpbGUgc3RyZWFtLCBlLmcuLAorICAgKiAgc3RkaW9fZmlsZWJ1ZjxjaGFyPi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBzdGRpb19maWxlYnVmIDogcHVibGljIHN0ZDo6YmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQkJICAgICAgICBjaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMJCQkJICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6Om9mZl90eXBlCQlvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90OworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBkZWZlcnJlZCBpbml0aWFsaXphdGlvbgorICAgICAgKi8KKyAgICAgIHN0ZGlvX2ZpbGVidWYoKSA6IHN0ZDo6YmFzaWNfZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KCkge30KKworICAgICAgLyoqCisgICAgICAgKiAgQHBhcmFtICBmZCAgQW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBTYW1lIG1lYW5pbmcgYXMgaW4gYSBzdGFuZGFyZCBmaWxlYnVmLgorICAgICAgICogIEBwYXJhbSAgc2l6ZSAgT3B0aW1hbCBvciBwcmVmZXJyZWQgc2l6ZSBvZiBpbnRlcm5hbCBidWZmZXIsIGluIGNoYXJzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGNvbnN0cnVjdG9yIGFzc29jaWF0ZXMgYSBmaWxlIHN0cmVhbSBidWZmZXIgd2l0aCBhbiBvcGVuCisgICAgICAgKiAgUE9TSVggZmlsZSBkZXNjcmlwdG9yLiBUaGUgZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseQorICAgICAgICogIGNsb3NlZCB3aGVuIHRoZSBzdGRpb19maWxlYnVmIGlzIGNsb3NlZC9kZXN0cm95ZWQuCisgICAgICAqLworICAgICAgc3RkaW9fZmlsZWJ1ZihpbnQgX19mZCwgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLAorCQkgICAgc2l6ZV90IF9fc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oQlVGU0laKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBwYXJhbSAgZiAgQW4gb3BlbiBAYyBGSUxFKi4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIFNhbWUgbWVhbmluZyBhcyBpbiBhIHN0YW5kYXJkIGZpbGVidWYuCisgICAgICAgKiAgQHBhcmFtICBzaXplICBPcHRpbWFsIG9yIHByZWZlcnJlZCBzaXplIG9mIGludGVybmFsIGJ1ZmZlciwgaW4gY2hhcnMuCisgICAgICAgKiAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBzeXN0ZW0ncyBAYyBCVUZTSVouCisgICAgICAgKgorICAgICAgICogIFRoaXMgY29uc3RydWN0b3IgYXNzb2NpYXRlcyBhIGZpbGUgc3RyZWFtIGJ1ZmZlciB3aXRoIGFuIG9wZW4KKyAgICAgICAqICBDIEBjIEZJTEUqLiAgVGhlIEBjIEZJTEUqIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgY2xvc2VkIHdoZW4gdGhlCisgICAgICAgKiAgc3RkaW9fZmlsZWJ1ZiBpcyBjbG9zZWQvZGVzdHJveWVkLgorICAgICAgKi8KKyAgICAgIHN0ZGlvX2ZpbGVidWYoc3RkOjpfX2NfZmlsZSogX19mLCBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUsCisJCSAgICBzaXplX3QgX19zaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihCVUZTSVopKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQ2xvc2VzIHRoZSBleHRlcm5hbCBkYXRhIHN0cmVhbSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGNvbnN0cnVjdG9yCisgICAgICAgKiAgd2FzIHVzZWQuCisgICAgICAqLworICAgICAgdmlydHVhbAorICAgICAgfnN0ZGlvX2ZpbGVidWYoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yLgorICAgICAgICoKKyAgICAgICAqICBPbmNlIGFzc29jaWF0ZWQgd2l0aCBhbiBleHRlcm5hbCBkYXRhIHN0cmVhbSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgICAgICAqICB1c2VkIHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBQT1NJWCBmaWxlIGRlc2NyaXB0b3IuICBOb3RlIHRoYXQKKyAgICAgICAqICB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBsaWJyYXJ5IHRvIHRyYWNrIHdoYXQgeW91IGRvIHdpdGggdGhlCisgICAgICAgKiAgZGVzY3JpcHRvciwgc28gYmUgY2FyZWZ1bC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGZkKCkgeyByZXR1cm4gdGhpcy0+X01fZmlsZS5mZCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEByZXR1cm4gIFRoZSB1bmRlcmx5aW5nIEZJTEUqLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyAiQyIgZmlsZSBwb2ludGVyLgorICAgICAgICogIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBsaWJyYXJ5IHRvIHRyYWNrIHdoYXQgeW91IGRvCisgICAgICAgKiAgd2l0aCB0aGUgZmlsZSwgc28gYmUgY2FyZWZ1bC4KKyAgICAgICAqLworICAgICAgc3RkOjpfX2NfZmlsZSoKKyAgICAgIGZpbGUoKSB7IHJldHVybiB0aGlzLT5fTV9maWxlLmZpbGUoKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZGlvX2ZpbGVidWY8X0NoYXJULCBfVHJhaXRzPjo6fnN0ZGlvX2ZpbGVidWYoKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGRpb19maWxlYnVmPF9DaGFyVCwgX1RyYWl0cz46OgorICAgIHN0ZGlvX2ZpbGVidWYoaW50IF9fZmQsIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSwgc2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICB0aGlzLT5fTV9maWxlLnN5c19vcGVuKF9fZmQsIF9fbW9kZSk7CisgICAgICBpZiAodGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIHRoaXMtPl9NX21vZGUgPSBfX21vZGU7CisJICB0aGlzLT5fTV9idWZfc2l6ZSA9IF9fc2l6ZTsKKwkgIHRoaXMtPl9NX2FsbG9jYXRlX2ludGVybmFsX2J1ZmZlcigpOworCSAgdGhpcy0+X01fcmVhZGluZyA9IGZhbHNlOworCSAgdGhpcy0+X01fd3JpdGluZyA9IGZhbHNlOworCSAgdGhpcy0+X01fc2V0X2J1ZmZlcigtMSk7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkaW9fZmlsZWJ1ZjxfQ2hhclQsIF9UcmFpdHM+OjoKKyAgICBzdGRpb19maWxlYnVmKHN0ZDo6X19jX2ZpbGUqIF9fZiwgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlLAorCQkgIHNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgdGhpcy0+X01fZmlsZS5zeXNfb3BlbihfX2YsIF9fbW9kZSk7CisgICAgICBpZiAodGhpcy0+aXNfb3BlbigpKQorCXsKKwkgIHRoaXMtPl9NX21vZGUgPSBfX21vZGU7CisJICB0aGlzLT5fTV9idWZfc2l6ZSA9IF9fc2l6ZTsKKwkgIHRoaXMtPl9NX2FsbG9jYXRlX2ludGVybmFsX2J1ZmZlcigpOworCSAgdGhpcy0+X01fcmVhZGluZyA9IGZhbHNlOworCSAgdGhpcy0+X01fd3JpdGluZyA9IGZhbHNlOworCSAgdGhpcy0+X01fc2V0X2J1ZmZlcigtMSk7CisJfQorICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvc3RkaW9fc3luY19maWxlYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2MDE0OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oCkBAIC0wLDAgKzEsMjkwIEBACisvLyBJb3N0cmVhbXMgd3JhcHBlciBmb3Igc3RkaW8gRklMRSogLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfU1RESU9fU1lOQ19GSUxFQlVGX0gKKyNkZWZpbmUgX1NURElPX1NZTkNfRklMRUJVRl9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxiaXRzL2MrK2lvLmg+ICAvLyBGb3IgX19jX2ZpbGUKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisjaW5jbHVkZSA8Y3djaGFyPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBQcm92aWRlcyBhIGxheWVyIG9mIGNvbXBhdGliaWxpdHkgZm9yIEMuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBHTlUgZXh0ZW5zaW9uIHByb3ZpZGVzIGV4dGVuc2lvbnMgZm9yIHdvcmtpbmcgd2l0aCBzdGFuZGFyZAorICAgKiAgQyBGSUxFKidzLiAgSXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIHVzZXIgd2l0aCB0aGUgdHlwZSBvZgorICAgKiAgY2hhcmFjdGVyIHVzZWQgaW4gdGhlIGZpbGUgc3RyZWFtLCBlLmcuLCBzdGRpb19maWxlYnVmPGNoYXI+LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIHN0ZGlvX3N5bmNfZmlsZWJ1ZiA6IHB1YmxpYyBzdGQ6OmJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cwkJCQkJdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjppbnRfdHlwZQkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZQkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZQkJb2ZmX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gVW5kZXJseWluZyBzdGRpbyBGSUxFCisgICAgICBzdGQ6Ol9fY19maWxlKiBjb25zdCBfTV9maWxlOworCisgICAgICAvLyBMYXN0IGNoYXJhY3RlciBnb3R0ZW4uIFRoaXMgaXMgdXNlZCB3aGVuIHBiYWNrZmFpbCBpcworICAgICAgLy8gY2FsbGVkIGZyb20gYmFzaWNfc3RyZWFtYnVmOjpzdW5nZXRjKCkKKyAgICAgIGludF90eXBlIF9NX3VuZ2V0X2J1ZjsKKworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0CisgICAgICBzdGRpb19zeW5jX2ZpbGVidWYoc3RkOjpfX2NfZmlsZSogX19mKQorICAgICAgOiBfTV9maWxlKF9fZiksIF9NX3VuZ2V0X2J1Zih0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQHJldHVybiAgVGhlIHVuZGVybHlpbmcgRklMRSouCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIEMgZmlsZSBwb2ludGVyLgorICAgICAgICogIE5vdGUgdGhhdCB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBsaWJyYXJ5IHRvIHRyYWNrIHdoYXQgeW91IGRvCisgICAgICAgKiAgd2l0aCB0aGUgZmlsZSwgc28gYmUgY2FyZWZ1bC4KKyAgICAgICAqLworICAgICAgc3RkOjpfX2NfZmlsZSogY29uc3QKKyAgICAgIGZpbGUoKSB7IHJldHVybiB0aGlzLT5fTV9maWxlOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBpbnRfdHlwZQorICAgICAgc3luY2dldGMoKTsKKworICAgICAgaW50X3R5cGUKKyAgICAgIHN5bmN1bmdldGMoaW50X3R5cGUgX19jKTsKKworICAgICAgaW50X3R5cGUKKyAgICAgIHN5bmNwdXRjKGludF90eXBlIF9fYyk7CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIHVuZGVyZmxvdygpCisgICAgICB7CisJaW50X3R5cGUgX19jID0gdGhpcy0+c3luY2dldGMoKTsKKwlyZXR1cm4gdGhpcy0+c3luY3VuZ2V0YyhfX2MpOworICAgICAgfQorCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICB1ZmxvdygpCisgICAgICB7CisJLy8gU3RvcmUgdGhlIGdvdHRlbiBjaGFyYWN0ZXIgaW4gY2FzZSB3ZSBuZWVkIHRvIHVuZ2V0IGl0LgorCV9NX3VuZ2V0X2J1ZiA9IHRoaXMtPnN5bmNnZXRjKCk7CisJcmV0dXJuIF9NX3VuZ2V0X2J1ZjsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwljb25zdCBpbnRfdHlwZSBfX2VvZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKworCS8vIENoZWNrIGlmIHRoZSB1bmdldCBvciBwdXRiYWNrIHdhcyByZXF1ZXN0ZWQKKwlpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKSAvLyB1bmdldAorCSAgeworCSAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfTV91bmdldF9idWYsIF9fZW9mKSkKKwkgICAgICBfX3JldCA9IHRoaXMtPnN5bmN1bmdldGMoX01fdW5nZXRfYnVmKTsKKwkgICAgZWxzZSAvLyBidWZmZXIgaW52YWxpZCwgZmFpbC4KKwkgICAgICBfX3JldCA9IF9fZW9mOworCSAgfQorCWVsc2UgLy8gcHV0YmFjaworCSAgX19yZXQgPSB0aGlzLT5zeW5jdW5nZXRjKF9fYyk7CisKKwkvLyBUaGUgYnVmZmVyZWQgY2hhcmFjdGVyIGlzIG5vIGxvbmdlciB2YWxpZCwgZGlzY2FyZCBpdC4KKwlfTV91bmdldF9idWYgPSBfX2VvZjsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgc3RkOjpzdHJlYW1zaXplCisgICAgICB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pOworCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBvdmVyZmxvdyhpbnRfdHlwZSBfX2MgPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQ7CisJaWYgKHRyYWl0c190eXBlOjplcV9pbnRfdHlwZShfX2MsIHRyYWl0c190eXBlOjplb2YoKSkpCisJICB7CisJICAgIGlmIChzdGQ6OmZmbHVzaChfTV9maWxlKSkKKwkgICAgICBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKwkgICAgZWxzZQorCSAgICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6Om5vdF9lb2YoX19jKTsKKwkgIH0KKwllbHNlCisJICBfX3JldCA9IHRoaXMtPnN5bmNwdXRjKF9fYyk7CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgICAgICB2aXJ0dWFsIHN0ZDo6c3RyZWFtc2l6ZQorICAgICAgeHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdGQ6OnN0cmVhbXNpemUgX19uKTsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIHN5bmMoKQorICAgICAgeyByZXR1cm4gc3RkOjpmZmx1c2goX01fZmlsZSk7IH0KKworICAgICAgdmlydHVhbCBzdGQ6OnN0cmVhbXBvcworICAgICAgc2Vla29mZihzdGQ6OnN0cmVhbW9mZiBfX29mZiwgc3RkOjppb3NfYmFzZTo6c2Vla2RpciBfX2RpciwKKwkgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmluIHwgc3RkOjppb3NfYmFzZTo6b3V0KQorICAgICAgeworCXN0ZDo6c3RyZWFtcG9zIF9fcmV0KHN0ZDo6c3RyZWFtb2ZmKC0xKSk7CisJaW50IF9fd2hlbmNlOworCWlmIChfX2RpciA9PSBzdGQ6Omlvc19iYXNlOjpiZWcpCisJICBfX3doZW5jZSA9IFNFRUtfU0VUOworCWVsc2UgaWYgKF9fZGlyID09IHN0ZDo6aW9zX2Jhc2U6OmN1cikKKwkgIF9fd2hlbmNlID0gU0VFS19DVVI7CisJZWxzZQorCSAgX193aGVuY2UgPSBTRUVLX0VORDsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTEZTCisJaWYgKCFmc2Vla282NChfTV9maWxlLCBfX29mZiwgX193aGVuY2UpKQorCSAgX19yZXQgPSBzdGQ6OnN0cmVhbXBvcyhmdGVsbG82NChfTV9maWxlKSk7CisjZWxzZQorCWlmICghZnNlZWsoX01fZmlsZSwgX19vZmYsIF9fd2hlbmNlKSkKKwkgIF9fcmV0ID0gc3RkOjpzdHJlYW1wb3Moc3RkOjpmdGVsbChfTV9maWxlKSk7CisjZW5kaWYKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgc3RkOjpzdHJlYW1wb3MKKyAgICAgIHNlZWtwb3Moc3RkOjpzdHJlYW1wb3MgX19wb3MsCisJICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0KKwkgICAgICBzdGQ6Omlvc19iYXNlOjppbiB8IHN0ZDo6aW9zX2Jhc2U6Om91dCkKKyAgICAgIHsgcmV0dXJuIHNlZWtvZmYoc3RkOjpzdHJlYW1vZmYoX19wb3MpLCBzdGQ6Omlvc19iYXNlOjpiZWcsIF9fbW9kZSk7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6c3luY2dldGMoKQorICAgIHsgcmV0dXJuIHN0ZDo6Z2V0YyhfTV9maWxlKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6c3luY3VuZ2V0YyhpbnRfdHlwZSBfX2MpCisgICAgeyByZXR1cm4gc3RkOjp1bmdldGMoX19jLCBfTV9maWxlKTsgfQorCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPGNoYXI+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6c3luY3B1dGMoaW50X3R5cGUgX19jKQorICAgIHsgcmV0dXJuIHN0ZDo6cHV0YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGQ6OnN0cmVhbXNpemUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj46OnhzZ2V0bihjaGFyKiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RkOjpzdHJlYW1zaXplIF9fcmV0ID0gc3RkOjpmcmVhZChfX3MsIDEsIF9fbiwgX01fZmlsZSk7CisgICAgICBpZiAoX19yZXQgPiAwKQorCV9NX3VuZ2V0X2J1ZiA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX3NbX19yZXQgLSAxXSk7CisgICAgICBlbHNlCisJX01fdW5nZXRfYnVmID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZDo6c3RyZWFtc2l6ZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxjaGFyPjo6eHNwdXRuKGNvbnN0IGNoYXIqIF9fcywgc3RkOjpzdHJlYW1zaXplIF9fbikKKyAgICB7IHJldHVybiBzdGQ6OmZ3cml0ZShfX3MsIDEsIF9fbiwgX01fZmlsZSk7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OjppbnRfdHlwZQorICAgIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6c3luY2dldGMoKQorICAgIHsgcmV0dXJuIHN0ZDo6Z2V0d2MoX01fZmlsZSk7IH0KKworICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6aW50X3R5cGUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnN5bmN1bmdldGMoaW50X3R5cGUgX19jKQorICAgIHsgcmV0dXJuIHN0ZDo6dW5nZXR3YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OmludF90eXBlCisgICAgc3RkaW9fc3luY19maWxlYnVmPHdjaGFyX3Q+OjpzeW5jcHV0YyhpbnRfdHlwZSBfX2MpCisgICAgeyByZXR1cm4gc3RkOjpwdXR3YyhfX2MsIF9NX2ZpbGUpOyB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGQ6OnN0cmVhbXNpemUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnhzZ2V0bih3Y2hhcl90KiBfX3MsIHN0ZDo6c3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RkOjpzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgd2hpbGUgKF9fbi0tKQorCXsKKwkgIGludF90eXBlIF9fYyA9IHRoaXMtPnN5bmNnZXRjKCk7CisJICBpZiAodHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCSAgICBicmVhazsKKwkgIF9fc1tfX3JldF0gPSB0cmFpdHNfdHlwZTo6dG9fY2hhcl90eXBlKF9fYyk7CisJICArK19fcmV0OworCX0KKworICAgICAgaWYgKF9fcmV0ID4gMCkKKwlfTV91bmdldF9idWYgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoX19zW19fcmV0IC0gMV0pOworICAgICAgZWxzZQorCV9NX3VuZ2V0X2J1ZiA9IHRyYWl0c190eXBlOjplb2YoKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzdGQ6OnN0cmVhbXNpemUKKyAgICBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD46OnhzcHV0bihjb25zdCB3Y2hhcl90KiBfX3MsCisJCQkJCXN0ZDo6c3RyZWFtc2l6ZSBfX24pCisgICAgeworICAgICAgc3RkOjpzdHJlYW1zaXplIF9fcmV0ID0gMDsKKyAgICAgIGNvbnN0IGludF90eXBlIF9fZW9mID0gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgd2hpbGUgKF9fbi0tKQorCXsKKwkgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+c3luY3B1dGMoKl9fcysrKSwgX19lb2YpKQorCSAgICBicmVhazsKKwkgICsrX19yZXQ7CisJfQorICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBzdGRpb19zeW5jX2ZpbGVidWY8Y2hhcj47CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90PjsKKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zdHJpbmdfY29udmVyc2lvbnMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWFiOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC9zdHJpbmdfY29udmVyc2lvbnMuaApAQCAtMCwwICsxLDEwMSBAQAorLy8gU3RyaW5nIENvbnZlcnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfU1RSSU5HX0NPTlZFUlNJT05TX0gKKyNkZWZpbmUgX1NUUklOR19DT05WRVJTSU9OU19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjd2NoYXI+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNlcnJubz4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEhlbHBlciBmb3IgYWxsIHRoZSBzdG8qIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RSZXQsIHR5cGVuYW1lIF9SZXQgPSBfVFJldCwgdHlwZW5hbWUgX0NoYXJULAorCSAgIHR5cGVuYW1lLi4uIF9CYXNlPgorICAgIF9SZXQKKyAgICBfX3N0b2EoX1RSZXQgKCpfX2NvbnZmKSAoY29uc3QgX0NoYXJUKiwgX0NoYXJUKiosIF9CYXNlLi4uKSwKKwkgICBjb25zdCBjaGFyKiBfX25hbWUsIGNvbnN0IF9DaGFyVCogX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCwKKwkgICBfQmFzZS4uLiBfX2Jhc2UpCisgICAgeworICAgICAgX1JldCBfX3JldDsKKworICAgICAgX0NoYXJUKiBfX2VuZHB0cjsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIGNvbnN0IF9UUmV0IF9fdG1wID0gX19jb252ZihfX3N0ciwgJl9fZW5kcHRyLCBfX2Jhc2UuLi4pOworCisgICAgICBpZiAoX19lbmRwdHIgPT0gX19zdHIpCisJc3RkOjpfX3Rocm93X2ludmFsaWRfYXJndW1lbnQoX19uYW1lKTsKKyAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRQorCSAgICAgICB8fCAoc3RkOjpfX2FyZV9zYW1lPF9SZXQsIGludD46Ol9fdmFsdWUKKwkJICAgJiYgKF9fdG1wIDwgX19udW1lcmljX3RyYWl0czxpbnQ+OjpfX21pbgorCQkgICAgICAgfHwgX190bXAgPiBfX251bWVyaWNfdHJhaXRzPGludD46Ol9fbWF4KSkpCisJc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX25hbWUpOworICAgICAgZWxzZQorCV9fcmV0ID0gX190bXA7CisKKyAgICAgIGlmIChfX2lkeCkKKwkqX19pZHggPSBfX2VuZHB0ciAtIF9fc3RyOworCisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIC8vIEhlbHBlciBmb3IgdGhlIHRvX3N0cmluZyAvIHRvX3dzdHJpbmcgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaW5nLCB0eXBlbmFtZSBfQ2hhclQgPSB0eXBlbmFtZSBfU3RyaW5nOjp2YWx1ZV90eXBlPgorICAgIF9TdHJpbmcKKyAgICBfX3RvX3hzdHJpbmcoaW50ICgqX19jb252ZikgKF9DaGFyVCosIHN0ZDo6c2l6ZV90LCBjb25zdCBfQ2hhclQqLAorCQkJCSBfX2J1aWx0aW5fdmFfbGlzdCksIHN0ZDo6c2l6ZV90IF9fbiwKKwkJIGNvbnN0IF9DaGFyVCogX19mbXQsIC4uLikKKyAgICB7CisgICAgICAvLyBYWFggRXZlbnR1YWxseSB0aGUgcmVzdWx0IHdpbGwgYmUgY29uc3RydWN0ZWQgaW4gcGxhY2UgaW4KKyAgICAgIC8vIHRoZSBDKysweCBzdHJpbmcsIGxpa2VseSB3aXRoIHRoZSBoZWxwIG9mIGludGVybmFsIGhvb2tzLgorICAgICAgX0NoYXJUKiBfX3MgPSBzdGF0aWNfY2FzdDxfQ2hhclQqPihfX2J1aWx0aW5fYWxsb2NhKHNpemVvZihfQ2hhclQpCisJCQkJCQkJICAqIF9fbikpOworCisgICAgICBfX2J1aWx0aW5fdmFfbGlzdCBfX2FyZ3M7CisgICAgICBfX2J1aWx0aW5fdmFfc3RhcnQoX19hcmdzLCBfX2ZtdCk7CisKKyAgICAgIGNvbnN0IGludCBfX2xlbiA9IF9fY29udmYoX19zLCBfX24sIF9fZm10LCBfX2FyZ3MpOworCisgICAgICBfX2J1aWx0aW5fdmFfZW5kKF9fYXJncyk7CisKKyAgICAgIHJldHVybiBfU3RyaW5nKF9fcywgX19zICsgX19sZW4pOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX1NUUklOR19DT05WRVJTSU9OU19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC90aHJvd19hbGxvY2F0b3IuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3Rocm93X2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGI4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC90aHJvd19hbGxvY2F0b3IuaApAQCAtMCwwICsxLDc2NSBAQAorLy8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UKKy8vIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUKKy8vIG9mIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LgorCisvKiogQGZpbGUgZXh0L3Rocm93X2FsbG9jYXRvci5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKgorICogIENvbnRhaW5zIHR3byBleGNlcHRpb24tZ2VuZXJhdGluZyB0eXBlcyAodGhyb3dfdmFsdWUsIHRocm93X2FsbG9jYXRvcikKKyAqICBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHZhbHVlIGFuZCBhbGxvY2F0b3IgdHlwZXMgd2hpbGUgdGVzdGluZworICogIGV4Y2VwdGlvbiBzYWZldHkgaW4gdGVtcGxhdGl6ZWQgY29udGFpbmVycyBhbmQgYWxnb3JpdGhtcy4gVGhlCisgKiAgYWxsb2NhdG9yIGhhcyBhZGRpdGlvbmFsIGxvZyBhbmQgZGVidWcgZmVhdHVyZXMuIFRoZSBleGNlcHRpb24KKyAqICBnZW5lcmF0ZWQgaXMgb2YgdHlwZSBmb3JjZWRfZXhjZXB0aW9uX2Vycm9yLgorICovCisKKyNpZm5kZWYgX1RIUk9XX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9USFJPV19BTExPQ0FUT1JfSCAxCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvbW92ZS5oPgorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGZ1bmN0aW9uYWw+CisjIGluY2x1ZGUgPHJhbmRvbT4KKyNlbHNlCisjIGluY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorIyBpbmNsdWRlIDx0cjEvcmFuZG9tPgorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBicmllZiBUaG93biBieSBleGNlcHRpb24gc2FmZXR5IG1hY2hpbmVyeS4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIHN0cnVjdCBmb3JjZWRfZXJyb3IgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeyB9OworCisgIC8vIFN1YnN0aXR1dGUgZm9yIGZvcmNlZF9lcnJvciBvYmplY3Qgd2hlbiAtZm5vLWV4Y2VwdGlvbnMuCisgIGlubGluZSB2b2lkCisgIF9fdGhyb3dfZm9yY2VkX2Vycm9yKCkKKyAgeworI2lmIF9fRVhDRVBUSU9OUworICAgIHRocm93IGZvcmNlZF9lcnJvcigpOworI2Vsc2UKKyAgICBfX2J1aWx0aW5fYWJvcnQoKTsKKyNlbmRpZgorICB9CisKKworICAvKioKKyAgICogIEBicmllZiBCYXNlIGNsYXNzIGZvciBjaGVja2luZyBhZGRyZXNzIGFuZCBsYWJlbCBpbmZvcm1hdGlvbgorICAgKiAgYWJvdXQgYWxsb2NhdGlvbnMuIENyZWF0ZSBhIHN0ZDo6bWFwIGJldHdlZW4gdGhlIGFsbG9jYXRlZAorICAgKiAgYWRkcmVzcyAodm9pZCopIGFuZCBhIGRhdHVtIGZvciBhbm5vdGF0aW9ucywgd2hpY2ggYXJlIGEgcGFpciBvZgorICAgKiAgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIGxhYmVsIGFuZCBhbGxvY2F0ZWQgc2l6ZS4KKyAgICovCisgIHN0cnVjdCBhbm5vdGF0ZV9iYXNlCisgIHsKKyAgICBhbm5vdGF0ZV9iYXNlKCkKKyAgICB7CisgICAgICBsYWJlbCgpOworICAgICAgbWFwKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBzZXRfbGFiZWwoc2l6ZV90IGwpCisgICAgeyBsYWJlbCgpID0gbDsgfQorCisgICAgc3RhdGljIHNpemVfdAorICAgIGdldF9sYWJlbCgpCisgICAgeyByZXR1cm4gbGFiZWwoKTsgfQorCisgICAgdm9pZAorICAgIGluc2VydCh2b2lkKiBwLCBzaXplX3Qgc2l6ZSkKKyAgICB7CisgICAgICBpZiAoIXApCisJeworCSAgc3RkOjpzdHJpbmcgZXJyb3IoImFubm90YXRlX2Jhc2U6Omluc2VydCBudWxsIGluc2VydCFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorCisgICAgICBjb25zdF9pdGVyYXRvciBmb3VuZCA9IG1hcCgpLmZpbmQocCk7CisgICAgICBpZiAoZm91bmQgIT0gbWFwKCkuZW5kKCkpCisJeworCSAgc3RkOjpzdHJpbmcgZXJyb3IoImFubm90YXRlX2Jhc2U6Omluc2VydCBkb3VibGUgaW5zZXJ0IVxuIik7CisJICBsb2dfdG9fc3RyaW5nKGVycm9yLCBtYWtlX2VudHJ5KHAsIHNpemUpKTsKKwkgIGxvZ190b19zdHJpbmcoZXJyb3IsICpmb3VuZCk7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorCisgICAgICBtYXAoKS5pbnNlcnQobWFrZV9lbnRyeShwLCBzaXplKSk7CisgICAgfQorCisgICAgdm9pZAorICAgIGVyYXNlKHZvaWQqIHAsIHNpemVfdCBzaXplKQorICAgIHsKKyAgICAgIGNoZWNrX2FsbG9jYXRlZChwLCBzaXplKTsKKyAgICAgIG1hcCgpLmVyYXNlKHApOworICAgIH0KKworICAgIC8vIFNlZSBpZiBhIHBhcnRpY3VsYXIgYWRkcmVzcyBhbmQgYWxsb2NhdGlvbiBzaXplIGhhcyBiZWVuIHNhdmVkLgorICAgIGlubGluZSB2b2lkCisgICAgY2hlY2tfYWxsb2NhdGVkKHZvaWQqIHAsIHNpemVfdCBzaXplKQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIGZvdW5kID0gbWFwKCkuZmluZChwKTsKKyAgICAgIGlmIChmb3VuZCA9PSBtYXAoKS5lbmQoKSkKKwl7CisJICBzdGQ6OnN0cmluZyBlcnJvcigiYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkIGJ5IHZhbHVlICIKKwkJCSAgICAibnVsbCBlcmFzZSFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorCisgICAgICBpZiAoZm91bmQtPnNlY29uZC5zZWNvbmQgIT0gc2l6ZSkKKwl7CisJICBzdGQ6OnN0cmluZyBlcnJvcigiYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkIGJ5IHZhbHVlICIKKwkJCSAgICAid3Jvbmctc2l6ZSBlcmFzZSFcbiIpOworCSAgbG9nX3RvX3N0cmluZyhlcnJvciwgbWFrZV9lbnRyeShwLCBzaXplKSk7CisJICBsb2dfdG9fc3RyaW5nKGVycm9yLCAqZm91bmQpOworCSAgc3RkOjpfX3Rocm93X2xvZ2ljX2Vycm9yKGVycm9yLmNfc3RyKCkpOworCX0KKyAgICB9CisKKyAgICAvLyBTZWUgaWYgYSBnaXZlbiBsYWJlbCBoYXMgYmVlbiBhbGxvY2F0ZWQuCisgICAgaW5saW5lIHZvaWQKKyAgICBjaGVja19hbGxvY2F0ZWQoc2l6ZV90IGxhYmVsKQorICAgIHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIGJlZyA9IG1hcCgpLmJlZ2luKCk7CisgICAgICBjb25zdF9pdGVyYXRvciBlbmQgPSBtYXAoKS5lbmQoKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGZvdW5kOworICAgICAgd2hpbGUgKGJlZyAhPSBlbmQpCisJeworCSAgaWYgKGJlZy0+c2Vjb25kLmZpcnN0ID09IGxhYmVsKQorCSAgICBsb2dfdG9fc3RyaW5nKGZvdW5kLCAqYmVnKTsKKwkgICsrYmVnOworCX0KKworICAgICAgaWYgKCFmb3VuZC5lbXB0eSgpKQorCXsKKwkgIHN0ZDo6c3RyaW5nIGVycm9yKCJhbm5vdGF0ZV9iYXNlOjpjaGVja19hbGxvY2F0ZWQgYnkgbGFiZWxcbiIpOworCSAgZXJyb3IgKz0gZm91bmQ7CisJICBzdGQ6Ol9fdGhyb3dfbG9naWNfZXJyb3IoZXJyb3IuY19zdHIoKSk7CisJfQorICAgIH0KKworICBwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiAJCWRhdGFfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHZvaWQqLCBkYXRhX3R5cGU+IAkJbWFwX3R5cGU7CisgICAgdHlwZWRlZiBtYXBfdHlwZTo6dmFsdWVfdHlwZSAJCWVudHJ5X3R5cGU7CisgICAgdHlwZWRlZiBtYXBfdHlwZTo6Y29uc3RfaXRlcmF0b3IgCQljb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIG1hcF90eXBlOjpjb25zdF9yZWZlcmVuY2UgCQljb25zdF9yZWZlcmVuY2U7CisKKyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJgorICAgIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiwgY29uc3QgYW5ub3RhdGVfYmFzZSYpOworCisgICAgZW50cnlfdHlwZQorICAgIG1ha2VfZW50cnkodm9pZCogcCwgc2l6ZV90IHNpemUpCisgICAgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIocCwgZGF0YV90eXBlKGdldF9sYWJlbCgpLCBzaXplKSk7IH0KKworICAgIHZvaWQKKyAgICBsb2dfdG9fc3RyaW5nKHN0ZDo6c3RyaW5nJiBzLCBjb25zdF9yZWZlcmVuY2UgcmVmKSBjb25zdAorICAgIHsKKyAgICAgIGNoYXIgYnVmWzQwXTsKKyAgICAgIGNvbnN0IGNoYXIgdGFiKCdcdCcpOworICAgICAgcyArPSAibGFiZWw6ICI7CisgICAgICB1bnNpZ25lZCBsb25nIGwgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihyZWYuc2Vjb25kLmZpcnN0KTsKKyAgICAgIF9fYnVpbHRpbl9zcHJpbnRmKGJ1ZiwgIiVsdSIsIGwpOworICAgICAgcyArPSBidWY7CisgICAgICBzICs9IHRhYjsKKyAgICAgIHMgKz0gInNpemU6ICI7CisgICAgICBsID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ocmVmLnNlY29uZC5zZWNvbmQpOworICAgICAgX19idWlsdGluX3NwcmludGYoYnVmLCAiJWx1IiwgbCk7CisgICAgICBzICs9IGJ1ZjsKKyAgICAgIHMgKz0gdGFiOworICAgICAgcyArPSAiYWRkcmVzczogIjsKKyAgICAgIF9fYnVpbHRpbl9zcHJpbnRmKGJ1ZiwgIiVwIiwgcmVmLmZpcnN0KTsKKyAgICAgIHMgKz0gYnVmOworICAgICAgcyArPSAnXG4nOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QmCisgICAgbGFiZWwoKQorICAgIHsKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfbGFiZWwoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7CisgICAgICByZXR1cm4gX1NfbGFiZWw7CisgICAgfQorCisgICAgc3RhdGljIG1hcF90eXBlJgorICAgIG1hcCgpCisgICAgeworICAgICAgc3RhdGljIG1hcF90eXBlIF9TX21hcDsKKyAgICAgIHJldHVybiBfU19tYXA7CisgICAgfQorICB9OworCisgIGlubGluZSBzdGQ6Om9zdHJlYW0mCisgIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgYW5ub3RhdGVfYmFzZSYgX19iKQorICB7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgdHlwZWRlZiBhbm5vdGF0ZV9iYXNlIGJhc2VfdHlwZTsKKyAgICBiYXNlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGJlZyA9IF9fYi5tYXAoKS5iZWdpbigpOworICAgIGJhc2VfdHlwZTo6Y29uc3RfaXRlcmF0b3IgZW5kID0gX19iLm1hcCgpLmVuZCgpOworICAgIGZvciAoOyBiZWcgIT0gZW5kOyArK2JlZykKKyAgICAgIF9fYi5sb2dfdG9fc3RyaW5nKGVycm9yLCAqYmVnKTsKKyAgICByZXR1cm4gb3MgPDwgZXJyb3I7CisgIH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2Ugc3RydWN0IGZvciBjb25kaXRpb24gcG9saWN5LgorICAgKgorICAgKiBSZXF1aXJlcyBhIHB1YmxpYyBtZW1iZXIgZnVuY3Rpb24gd2l0aCB0aGUgc2lnbmF0dXJlCisgICAqIHZvaWQgdGhyb3dfY29uZGl0aW9uYWxseSgpCisgICAqLworICBzdHJ1Y3QgY29uZGl0aW9uX2Jhc2UKKyAgeworICAgIHZpcnR1YWwgfmNvbmRpdGlvbl9iYXNlKCkgeyB9OworICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgaW5jcmVtZW50YWwgY29udHJvbCBhbmQgdGhyb3cuCisgICAqLworICBzdHJ1Y3QgbGltaXRfY29uZGl0aW9uIDogcHVibGljIGNvbmRpdGlvbl9iYXNlCisgIHsKKyAgICAvLyBTY29wZS1sZXZlbCBhZGp1c3RvciBvYmplY3RzOiBzZXQgbGltaXQgZm9yIHRocm93IGF0IHRoZQorICAgIC8vIGJlZ2lubmluZyBvZiBhIHNjb3BlIGJsb2NrLCBhbmQgcmVzdG9yZXMgdG8gcHJldmlvdXMgbGltaXQgd2hlbgorICAgIC8vIG9iamVjdCBpcyBkZXN0cm95ZWQgb24gZXhpdGluZyB0aGUgYmxvY2suCisgICAgc3RydWN0IGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IHNpemVfdCBfTV9vcmlnOworCisgICAgcHVibGljOgorICAgICAgYWRqdXN0b3JfYmFzZSgpIDogX01fb3JpZyhsaW1pdCgpKSB7IH0KKworICAgICAgdmlydHVhbAorICAgICAgfmFkanVzdG9yX2Jhc2UoKSB7IHNldF9saW1pdChfTV9vcmlnKTsgfQorICAgIH07CisKKyAgICAvLy8gTmV2ZXIgZW50ZXIgdGhlIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgbmV2ZXJfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIG5ldmVyX2FkanVzdG9yKCkgeyBzZXRfbGltaXQoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7IH0KKyAgICB9OworCisgICAgLy8vIEFsd2F5cyBlbnRlciB0aGUgY29uZGl0aW9uLgorICAgIHN0cnVjdCBhbHdheXNfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGFsd2F5c19hZGp1c3RvcigpIHsgc2V0X2xpbWl0KGNvdW50KCkpOyB9CisgICAgfTsKKworICAgIC8vLyBFbnRlciB0aGUgbnRoIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgbGltaXRfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGxpbWl0X2FkanVzdG9yKGNvbnN0IHNpemVfdCBfX2wpIHsgc2V0X2xpbWl0KF9fbCk7IH0KKyAgICB9OworCisgICAgLy8gSW5jcmVtZW50IF9TX2NvdW50IGV2ZXJ5IHRpbWUgY2FsbGVkLgorICAgIC8vIElmIF9TX2NvdW50IG1hdGNoZXMgdGhlIGxpbWl0IGNvdW50LCB0aHJvdy4KKyAgICBzdGF0aWMgdm9pZAorICAgIHRocm93X2NvbmRpdGlvbmFsbHkoKQorICAgIHsKKyAgICAgIGlmIChjb3VudCgpID09IGxpbWl0KCkpCisJX190aHJvd19mb3JjZWRfZXJyb3IoKTsKKyAgICAgICsrY291bnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc2l6ZV90JgorICAgIGNvdW50KCkKKyAgICB7CisgICAgICBzdGF0aWMgc2l6ZV90IF9TX2NvdW50KDApOworICAgICAgcmV0dXJuIF9TX2NvdW50OworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QmCisgICAgbGltaXQoKQorICAgIHsKKyAgICAgIHN0YXRpYyBzaXplX3QgX1NfbGltaXQoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSk7CisgICAgICByZXR1cm4gX1NfbGltaXQ7CisgICAgfQorCisgICAgLy8gWmVybyB0aGUgdGhyb3cgY291bnRlciwgc2V0IGxpbWl0IHRvIGFyZ3VtZW50LgorICAgIHN0YXRpYyB2b2lkCisgICAgc2V0X2xpbWl0KGNvbnN0IHNpemVfdCBfX2wpCisgICAgeworICAgICAgbGltaXQoKSA9IF9fbDsKKyAgICAgIGNvdW50KCkgPSAwOworICAgIH0KKyAgfTsKKworCisgIC8qKgorICAgKiAgQGJyaWVmIEJhc2UgY2xhc3MgZm9yIHJhbmRvbSBwcm9iYWJpbGl0eSBjb250cm9sIGFuZCB0aHJvdy4KKyAgICovCisgIHN0cnVjdCByYW5kb21fY29uZGl0aW9uIDogcHVibGljIGNvbmRpdGlvbl9iYXNlCisgIHsKKyAgICAvLyBTY29wZS1sZXZlbCBhZGp1c3RvciBvYmplY3RzOiBzZXQgcHJvYmFiaWxpdHkgZm9yIHRocm93IGF0IHRoZQorICAgIC8vIGJlZ2lubmluZyBvZiBhIHNjb3BlIGJsb2NrLCBhbmQgcmVzdG9yZXMgdG8gcHJldmlvdXMKKyAgICAvLyBwcm9iYWJpbGl0eSB3aGVuIG9iamVjdCBpcyBkZXN0cm95ZWQgb24gZXhpdGluZyB0aGUgYmxvY2suCisgICAgc3RydWN0IGFkanVzdG9yX2Jhc2UKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IGRvdWJsZSBfTV9vcmlnOworCisgICAgcHVibGljOgorICAgICAgYWRqdXN0b3JfYmFzZSgpIDogX01fb3JpZyhwcm9iYWJpbGl0eSgpKSB7IH0KKworICAgICAgdmlydHVhbCB+YWRqdXN0b3JfYmFzZSgpCisgICAgICB7IHNldF9wcm9iYWJpbGl0eShfTV9vcmlnKTsgfQorICAgIH07CisKKyAgICAvLy8gR3JvdXAgY29uZGl0aW9uLgorICAgIHN0cnVjdCBncm91cF9hZGp1c3RvciA6IHB1YmxpYyBhZGp1c3Rvcl9iYXNlCisgICAgeworICAgICAgZ3JvdXBfYWRqdXN0b3Ioc2l6ZV90IHNpemUpCisgICAgICB7IHNldF9wcm9iYWJpbGl0eSgxIC0gc3RkOjpwb3coZG91YmxlKDEgLSBwcm9iYWJpbGl0eSgpKSwKKwkJCQkgICAgIGRvdWJsZSgwLjUgLyAoc2l6ZSArIDEpKSkpOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gTmV2ZXIgZW50ZXIgdGhlIGNvbmRpdGlvbi4KKyAgICBzdHJ1Y3QgbmV2ZXJfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIG5ldmVyX2FkanVzdG9yKCkgeyBzZXRfcHJvYmFiaWxpdHkoMCk7IH0KKyAgICB9OworCisgICAgLy8vIEFsd2F5cyBlbnRlciB0aGUgY29uZGl0aW9uLgorICAgIHN0cnVjdCBhbHdheXNfYWRqdXN0b3IgOiBwdWJsaWMgYWRqdXN0b3JfYmFzZQorICAgIHsKKyAgICAgIGFsd2F5c19hZGp1c3RvcigpIHsgc2V0X3Byb2JhYmlsaXR5KDEpOyB9CisgICAgfTsKKworICAgIHJhbmRvbV9jb25kaXRpb24oKQorICAgIHsKKyAgICAgIHByb2JhYmlsaXR5KCk7CisgICAgICBlbmdpbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZAorICAgIHNldF9wcm9iYWJpbGl0eShkb3VibGUgX19wKQorICAgIHsgcHJvYmFiaWxpdHkoKSA9IF9fcDsgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICB0aHJvd19jb25kaXRpb25hbGx5KCkKKyAgICB7CisgICAgICBpZiAoZ2VuZXJhdGUoKSA8IHByb2JhYmlsaXR5KCkpCisJX190aHJvd19mb3JjZWRfZXJyb3IoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fcykKKyAgICB7IGVuZ2luZSgpLnNlZWQoX19zKTsgfQorCisgIHByaXZhdGU6CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICB0eXBlZGVmIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+IAlkaXN0cmlidXRpb25fdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bXQxOTkzNyAJCQkJZW5naW5lX3R5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgc3RkOjp0cjE6OnVuaWZvcm1fcmVhbDxkb3VibGU+IAkJZGlzdHJpYnV0aW9uX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnRyMTo6bXQxOTkzNyAJCQkJZW5naW5lX3R5cGU7CisjZW5kaWYKKworICAgIHN0YXRpYyBkb3VibGUKKyAgICBnZW5lcmF0ZSgpCisgICAgeworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBjb25zdCBkaXN0cmlidXRpb25fdHlwZSBkaXN0cmlidXRpb24oMCwgMSk7CisgICAgICBzdGF0aWMgYXV0byBnZW5lcmF0b3IgPSBzdGQ6OmJpbmQoZGlzdHJpYnV0aW9uLCBlbmdpbmUoKSk7CisjZWxzZQorICAgICAgLy8gVXNlIHZhcmlhdGVfZ2VuZXJhdG9yIHRvIGdldCBub3JtYWxpemVkIHJlc3VsdHMuCisgICAgICB0eXBlZGVmIHN0ZDo6dHIxOjp2YXJpYXRlX2dlbmVyYXRvcjxlbmdpbmVfdHlwZSwgZGlzdHJpYnV0aW9uX3R5cGU+IGdlbl90OworICAgICAgZGlzdHJpYnV0aW9uX3R5cGUgZGlzdHJpYnV0aW9uKDAsIDEpOworICAgICAgc3RhdGljIGdlbl90IGdlbmVyYXRvcihlbmdpbmUoKSwgZGlzdHJpYnV0aW9uKTsKKyNlbmRpZgorCisgICAgICBkb3VibGUgcmFuZG9tID0gZ2VuZXJhdG9yKCk7CisgICAgICBpZiAocmFuZG9tIDwgZGlzdHJpYnV0aW9uLm1pbigpIHx8IHJhbmRvbSA+IGRpc3RyaWJ1dGlvbi5tYXgoKSkKKwl7CisJICBzdGQ6OnN0cmluZyBfX3MoInJhbmRvbV9jb25kaXRpb246OmdlbmVyYXRlIik7CisJICBfX3MgKz0gIlxuIjsKKwkgIF9fcyArPSAicmFuZG9tIG51bWJlciBnZW5lcmF0ZWQgaXM6ICI7CisJICBjaGFyIGJ1Zls0MF07CisJICBfX2J1aWx0aW5fc3ByaW50ZihidWYsICIlZiIsIHJhbmRvbSk7CisJICBfX3MgKz0gYnVmOworCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX3MuY19zdHIoKSk7CisJfQorCisgICAgICByZXR1cm4gcmFuZG9tOworICAgIH0KKworICAgIHN0YXRpYyBkb3VibGUmCisgICAgcHJvYmFiaWxpdHkoKQorICAgIHsKKyAgICAgIHN0YXRpYyBkb3VibGUgX1NfcDsKKyAgICAgIHJldHVybiBfU19wOworICAgIH0KKworICAgIHN0YXRpYyBlbmdpbmVfdHlwZSYKKyAgICBlbmdpbmUoKQorICAgIHsKKyAgICAgIHN0YXRpYyBlbmdpbmVfdHlwZSBfU19lOworICAgICAgcmV0dXJuIF9TX2U7CisgICAgfQorICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ2xhc3Mgd2l0aCBleGNlcHRpb24gZ2VuZXJhdGlvbiBjb250cm9sLiBJbnRlbmRlZCB0byBiZQorICAgKiAgdXNlZCBhcyBhIHZhbHVlX3R5cGUgaW4gdGVtcGxhdGl6ZWQgY29kZS4KKyAgICoKKyAgICogIE5vdGU6IERlc3RydWN0b3Igbm90IGFsbG93ZWQgdG8gdGhyb3cuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBzdHJ1Y3QgdGhyb3dfdmFsdWVfYmFzZSA6IHB1YmxpYyBfQ29uZAorICAgIHsKKyAgICAgIHR5cGVkZWYgX0NvbmQgIAkJCQljb25kaXRpb25fdHlwZTsKKworICAgICAgdXNpbmcgY29uZGl0aW9uX3R5cGU6OnRocm93X2NvbmRpdGlvbmFsbHk7CisKKyAgICAgIHN0ZDo6c2l6ZV90CQkJICAgICAgIAlfTV9pOworCisjaWZuZGVmIF9HTElCQ1hYX0lTX0FHR1JFR0FURQorICAgICAgdGhyb3dfdmFsdWVfYmFzZSgpIDogX01faSgwKQorICAgICAgeyB0aHJvd19jb25kaXRpb25hbGx5KCk7IH0KKworICAgICAgdGhyb3dfdmFsdWVfYmFzZShjb25zdCB0aHJvd192YWx1ZV9iYXNlJiBfX3YpIDogX01faShfX3YuX01faSkKKyAgICAgIHsgdGhyb3dfY29uZGl0aW9uYWxseSgpOyB9CisKKyAgICAgIGV4cGxpY2l0IHRocm93X3ZhbHVlX2Jhc2UoY29uc3Qgc3RkOjpzaXplX3QgX19pKSA6IF9NX2koX19pKQorICAgICAgeyB0aHJvd19jb25kaXRpb25hbGx5KCk7IH0KKyNlbmRpZgorCisgICAgICB0aHJvd192YWx1ZV9iYXNlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHRocm93X3ZhbHVlX2Jhc2UmIF9fdikKKyAgICAgIHsKKwl0aHJvd19jb25kaXRpb25hbGx5KCk7CisJX01faSA9IF9fdi5fTV9pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGhyb3dfdmFsdWVfYmFzZSYKKyAgICAgIG9wZXJhdG9yKysoKQorICAgICAgeworCXRocm93X2NvbmRpdGlvbmFsbHkoKTsKKwkrK19NX2k7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2EsIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiB0aHJvd192YWx1ZTsKKyAgICAgIHRocm93X3ZhbHVlOjp0aHJvd19jb25kaXRpb25hbGx5KCk7CisgICAgICB0aHJvd192YWx1ZSBvcmlnKF9fYSk7CisgICAgICBfX2EgPSBfX2I7CisgICAgICBfX2IgPSBvcmlnOworICAgIH0KKworICAvLyBHZW5lcmFsIGluc3RhbnRpYWJsZSB0eXBlcyByZXF1aXJlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19hLAorCSAgICAgICBjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19iKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4gdGhyb3dfdmFsdWU7CisgICAgICB0aHJvd192YWx1ZTo6dGhyb3dfY29uZGl0aW9uYWxseSgpOworICAgICAgYm9vbCBfX3JldCA9IF9fYS5fTV9pID09IF9fYi5fTV9pOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19hLAorCSAgICAgIGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiB0aHJvd192YWx1ZTsKKyAgICAgIHRocm93X3ZhbHVlOjp0aHJvd19jb25kaXRpb25hbGx5KCk7CisgICAgICBib29sIF9fcmV0ID0gX19hLl9NX2kgPCBfX2IuX01faTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgLy8gTnVtZXJpYyBhbGdvcml0aG1zIGluc3RhbnRpYWJsZSB0eXBlcyByZXF1aXJlbWVudHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db25kPgorICAgIGlubGluZSB0aHJvd192YWx1ZV9iYXNlPF9Db25kPgorICAgIG9wZXJhdG9yKyhjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19hLAorCSAgICAgIGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2IpCisgICAgeworICAgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiB0aHJvd192YWx1ZTsKKyAgICAgIHRocm93X3ZhbHVlOjp0aHJvd19jb25kaXRpb25hbGx5KCk7CisgICAgICB0aHJvd192YWx1ZSBfX3JldChfX2EuX01faSArIF9fYi5fTV9pKTsKKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+CisgICAgb3BlcmF0b3ItKGNvbnN0IHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+JiBfX2EsCisJICAgICAgY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYikKKyAgICB7CisgICAgICB0eXBlZGVmIHRocm93X3ZhbHVlX2Jhc2U8X0NvbmQ+IHRocm93X3ZhbHVlOworICAgICAgdGhyb3dfdmFsdWU6OnRocm93X2NvbmRpdGlvbmFsbHkoKTsKKyAgICAgIHRocm93X3ZhbHVlIF9fcmV0KF9fYS5fTV9pIC0gX19iLl9NX2kpOworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4KKyAgICBvcGVyYXRvciooY29uc3QgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4mIF9fYSwKKwkgICAgICBjb25zdCB0aHJvd192YWx1ZV9iYXNlPF9Db25kPiYgX19iKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdGhyb3dfdmFsdWVfYmFzZTxfQ29uZD4gdGhyb3dfdmFsdWU7CisgICAgICB0aHJvd192YWx1ZTo6dGhyb3dfY29uZGl0aW9uYWxseSgpOworICAgICAgdGhyb3dfdmFsdWUgX19yZXQoX19hLl9NX2kgKiBfX2IuX01faSk7CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisKKyAgLy8vIFR5cGUgdGhyb3dpbmcgdmlhIGxpbWl0IGNvbmRpdGlvbi4KKyAgc3RydWN0IHRocm93X3ZhbHVlX2xpbWl0IDogcHVibGljIHRocm93X3ZhbHVlX2Jhc2U8bGltaXRfY29uZGl0aW9uPgorICB7CisgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPGxpbWl0X2NvbmRpdGlvbj4gYmFzZV90eXBlOworCisjaWZuZGVmIF9HTElCQ1hYX0lTX0FHR1JFR0FURQorICAgIHRocm93X3ZhbHVlX2xpbWl0KCkgeyB9CisKKyAgICB0aHJvd192YWx1ZV9saW1pdChjb25zdCB0aHJvd192YWx1ZV9saW1pdCYgX19vdGhlcikKKyAgICA6IGJhc2VfdHlwZShfX290aGVyLl9NX2kpIHsgfQorCisgICAgZXhwbGljaXQgdGhyb3dfdmFsdWVfbGltaXQoY29uc3Qgc3RkOjpzaXplX3QgX19pKSA6IGJhc2VfdHlwZShfX2kpIHsgfQorI2VuZGlmCisgIH07CisKKyAgLy8vIFR5cGUgdGhyb3dpbmcgdmlhIHJhbmRvbSBjb25kaXRpb24uCisgIHN0cnVjdCB0aHJvd192YWx1ZV9yYW5kb20gOiBwdWJsaWMgdGhyb3dfdmFsdWVfYmFzZTxyYW5kb21fY29uZGl0aW9uPgorICB7CisgICAgdHlwZWRlZiB0aHJvd192YWx1ZV9iYXNlPHJhbmRvbV9jb25kaXRpb24+IGJhc2VfdHlwZTsKKworI2lmbmRlZiBfR0xJQkNYWF9JU19BR0dSRUdBVEUKKyAgICB0aHJvd192YWx1ZV9yYW5kb20oKSB7IH0KKworICAgIHRocm93X3ZhbHVlX3JhbmRvbShjb25zdCB0aHJvd192YWx1ZV9yYW5kb20mIF9fb3RoZXIpCisgICAgOiBiYXNlX3R5cGUoX19vdGhlci5fTV9pKSB7IH0KKworCisgICAgZXhwbGljaXQgdGhyb3dfdmFsdWVfcmFuZG9tKGNvbnN0IHN0ZDo6c2l6ZV90IF9faSkgOiBiYXNlX3R5cGUoX19pKSB7IH0KKyNlbmRpZgorICB9OworCisKKyAgLyoqCisgICAqICBAYnJpZWYgQWxsb2NhdG9yIGNsYXNzIHdpdGggbG9nZ2luZyBhbmQgZXhjZXB0aW9uIGdlbmVyYXRpb24gY29udHJvbC4KKyAgICogSW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhbiBhbGxvY2F0b3JfdHlwZSBpbiB0ZW1wbGF0aXplZCBjb2RlLgorICAgKiAgQGluZ3JvdXAgYWxsb2NhdG9ycworICAgKgorICAgKiAgTm90ZTogRGVhbGxvY2F0ZSBub3QgYWxsb3dlZCB0byB0aHJvdy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbmQ+CisgICAgY2xhc3MgdGhyb3dfYWxsb2NhdG9yX2Jhc2UKKyAgICA6IHB1YmxpYyBhbm5vdGF0ZV9iYXNlLCBwdWJsaWMgX0NvbmQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBzaXplX3QgCQkJCXNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgcHRyZGlmZl90IAkJCWRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwIAkJCQl2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAJCQlwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAJCWNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmIAkJCXJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgCQljb25zdF9yZWZlcmVuY2U7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfQ29uZAkJCQljb25kaXRpb25fdHlwZTsKKworICAgICAgc3RkOjphbGxvY2F0b3I8dmFsdWVfdHlwZT4gCQlfTV9hbGxvY2F0b3I7CisKKyAgICAgIHVzaW5nIGNvbmRpdGlvbl90eXBlOjp0aHJvd19jb25kaXRpb25hbGx5OworCisgICAgcHVibGljOgorICAgICAgc2l6ZV90eXBlCisgICAgICBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkKKyAgICAgIHsgcmV0dXJuIF9NX2FsbG9jYXRvci5tYXhfc2l6ZSgpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIGNvbnN0X3BvaW50ZXIKKyAgICAgIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3gpOyB9CisKKyAgICAgIHBvaW50ZXIKKyAgICAgIGFsbG9jYXRlKHNpemVfdHlwZSBfX24sIHN0ZDo6YWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyIGhpbnQgPSAwKQorICAgICAgeworCWlmIChfX24gPiB0aGlzLT5tYXhfc2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworCisJdGhyb3dfY29uZGl0aW9uYWxseSgpOworCXBvaW50ZXIgY29uc3QgYSA9IF9NX2FsbG9jYXRvci5hbGxvY2F0ZShfX24sIGhpbnQpOworCWluc2VydChhLCBzaXplb2YodmFsdWVfdHlwZSkgKiBfX24pOworCXJldHVybiBhOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjb25zdHJ1Y3QocG9pbnRlciBfX3AsIGNvbnN0IHZhbHVlX3R5cGUmIHZhbCkKKyAgICAgIHsgcmV0dXJuIF9NX2FsbG9jYXRvci5jb25zdHJ1Y3QoX19wLCB2YWwpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJdm9pZAorCWNvbnN0cnVjdChwb2ludGVyIF9fcCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeyByZXR1cm4gX01fYWxsb2NhdG9yLmNvbnN0cnVjdChfX3AsIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICBkZXN0cm95KHBvaW50ZXIgX19wKQorICAgICAgeyBfTV9hbGxvY2F0b3IuZGVzdHJveShfX3ApOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJZXJhc2UoX19wLCBzaXplb2YodmFsdWVfdHlwZSkgKiBfX24pOworCV9NX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9fcCwgX19uKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2hlY2tfYWxsb2NhdGVkKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCXNpemVfdHlwZSBfX3QgPSBzaXplb2YodmFsdWVfdHlwZSkgKiBfX247CisJYW5ub3RhdGVfYmFzZTo6Y2hlY2tfYWxsb2NhdGVkKF9fcCwgX190KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2hlY2tfYWxsb2NhdGVkKHNpemVfdHlwZSBfX24pCisgICAgICB7IGFubm90YXRlX2Jhc2U6OmNoZWNrX2FsbG9jYXRlZChfX24pOyB9CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ29uZD4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdGhyb3dfYWxsb2NhdG9yX2Jhc2U8X1RwLCBfQ29uZD4mLAorCSAgICAgICBjb25zdCB0aHJvd19hbGxvY2F0b3JfYmFzZTxfVHAsIF9Db25kPiYpCisgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbmQ+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgX0NvbmQ+JiwKKwkgICAgICAgY29uc3QgdGhyb3dfYWxsb2NhdG9yX2Jhc2U8X1RwLCBfQ29uZD4mKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEFsbG9jYXRvciB0aHJvd2luZyB2aWEgbGltaXQgY29uZGl0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHRocm93X2FsbG9jYXRvcl9saW1pdAorICAgIDogcHVibGljIHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgbGltaXRfY29uZGl0aW9uPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJc3RydWN0IHJlYmluZAorCXsgdHlwZWRlZiB0aHJvd19hbGxvY2F0b3JfbGltaXQ8X1RwMT4gb3RoZXI7IH07CisKKyAgICAgIHRocm93X2FsbG9jYXRvcl9saW1pdCgpIHRocm93KCkgeyB9CisKKyAgICAgIHRocm93X2FsbG9jYXRvcl9saW1pdChjb25zdCB0aHJvd19hbGxvY2F0b3JfbGltaXQmKSB0aHJvdygpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXRocm93X2FsbG9jYXRvcl9saW1pdChjb25zdCB0aHJvd19hbGxvY2F0b3JfbGltaXQ8X1RwMT4mKSB0aHJvdygpIHsgfQorCisgICAgICB+dGhyb3dfYWxsb2NhdG9yX2xpbWl0KCkgdGhyb3coKSB7IH0KKyAgICB9OworCisgIC8vLyBBbGxvY2F0b3IgdGhyb3dpbmcgdmlhIHJhbmRvbSBjb25kaXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbQorICAgIDogcHVibGljIHRocm93X2FsbG9jYXRvcl9iYXNlPF9UcCwgcmFuZG9tX2NvbmRpdGlvbj4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorCXN0cnVjdCByZWJpbmQKKwl7IHR5cGVkZWYgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbTxfVHAxPiBvdGhlcjsgfTsKKworICAgICAgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbSgpIHRocm93KCkgeyB9CisKKyAgICAgIHRocm93X2FsbG9jYXRvcl9yYW5kb20oY29uc3QgdGhyb3dfYWxsb2NhdG9yX3JhbmRvbSYpIHRocm93KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisJdGhyb3dfYWxsb2NhdG9yX3JhbmRvbShjb25zdCB0aHJvd19hbGxvY2F0b3JfcmFuZG9tPF9UcDE+JikgdGhyb3coKSB7IH0KKworICAgICAgfnRocm93X2FsbG9jYXRvcl9yYW5kb20oKSB0aHJvdygpIHsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyMgaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiBzdGQ6Omhhc2ggZm9yIF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfbGltaXQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6OnRocm93X3ZhbHVlX2xpbWl0PgorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X19nbnVfY3h4Ojp0aHJvd192YWx1ZV9saW1pdCwgc2l6ZV90PgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6OnRocm93X3ZhbHVlX2xpbWl0JiBfX3ZhbCkgY29uc3QKKyAgICAgIHsKKwlzdGQ6Omhhc2g8c3RkOjpzaXplX3Q+IF9faDsKKwlzaXplX3QgX19yZXN1bHQgPSBfX2goX192YWwuX01faSk7CisJcmV0dXJuIF9fcmVzdWx0OworICAgICAgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIHN0ZDo6aGFzaCBmb3IgX19nbnVfY3h4Ojp0aHJvd192YWx1ZV9saW1pdC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6dGhyb3dfdmFsdWVfcmFuZG9tPgorICAgIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X19nbnVfY3h4Ojp0aHJvd192YWx1ZV9yYW5kb20sIHNpemVfdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4Ojp0aHJvd192YWx1ZV9yYW5kb20mIF9fdmFsKSBjb25zdAorICAgICAgeworCXN0ZDo6aGFzaDxzdGQ6OnNpemVfdD4gX19oOworCXNpemVfdCBfX3Jlc3VsdCA9IF9faChfX3ZhbC5fTV9pKTsKKwlyZXR1cm4gX19yZXN1bHQ7CisgICAgICB9CisgICAgfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBzdGQKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3R5cGVfdHJhaXRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC90eXBlX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGIwM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC90eXBlX3RyYWl0cy5oCkBAIC0wLDAgKzEsMjE0IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdHlwZV90cmFpdHMuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0VYVF9UWVBFX1RSQUlUUworI2RlZmluZSBfRVhUX1RZUEVfVFJBSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRGVmaW5lIGEgbmVzdGVkIHR5cGUgaWYgc29tZSBwcmVkaWNhdGUgaG9sZHMuCisgIHRlbXBsYXRlPGJvb2wsIHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2VuYWJsZV9pZiAKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2VuYWJsZV9pZjx0cnVlLCBfVHA+CisgICAgeyB0eXBlZGVmIF9UcCBfX3R5cGU7IH07CisKKworICAvLyBDb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlcy4gSWYgdHJ1ZSwgZmlyc3QsIGlmIGZhbHNlLCBzZWNvbmQuCisgIHRlbXBsYXRlPGJvb2wgX0NvbmQsIHR5cGVuYW1lIF9JZnRydWUsIHR5cGVuYW1lIF9JZmZhbHNlPgorICAgIHN0cnVjdCBfX2NvbmRpdGlvbmFsX3R5cGUKKyAgICB7IHR5cGVkZWYgX0lmdHJ1ZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0lmdHJ1ZSwgdHlwZW5hbWUgX0lmZmFsc2U+CisgICAgc3RydWN0IF9fY29uZGl0aW9uYWxfdHlwZTxmYWxzZSwgX0lmdHJ1ZSwgX0lmZmFsc2U+CisgICAgeyB0eXBlZGVmIF9JZmZhbHNlIF9fdHlwZTsgfTsKKworCisgIC8vIEdpdmVuIGFuIGludGVncmFsIGJ1aWx0aW4gdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHVuc2lnbmVkIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQKKyAgICB7IAorICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9fZW5hYmxlX2lmPHN0ZDo6X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIF9UcD4gX19pZl90eXBlOworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lmX3R5cGU6Ol9fdHlwZSBfX3R5cGU7IAorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxjaGFyPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPHNpZ25lZCBjaGFyPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPHNob3J0PgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxpbnQ+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGludCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDxsb25nPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fYWRkX3Vuc2lnbmVkPGxvbmcgbG9uZz4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdHlwZTsgfTsKKworICAvLyBEZWNsYXJlIGJ1dCBkb24ndCBkZWZpbmUuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19hZGRfdW5zaWduZWQ8Ym9vbD47CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2FkZF91bnNpZ25lZDx3Y2hhcl90PjsKKworCisgIC8vIEdpdmVuIGFuIGludGVncmFsIGJ1aWx0aW4gdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHNpZ25lZCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkCisgICAgeyAKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfX2VuYWJsZV9pZjxzdGQ6Ol9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCBfVHA+IF9faWZfdHlwZTsKKyAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pZl90eXBlOjpfX3R5cGUgX190eXBlOyAKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8Y2hhcj4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgY2hhcj4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgc2hvcnQ+CisgICAgeyB0eXBlZGVmIHNob3J0IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPHVuc2lnbmVkIGludD4KKyAgICB7IHR5cGVkZWYgaW50IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPHVuc2lnbmVkIGxvbmc+CisgICAgeyB0eXBlZGVmIGxvbmcgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfdW5zaWduZWQ8dW5zaWduZWQgbG9uZyBsb25nPgorICAgIHsgdHlwZWRlZiBsb25nIGxvbmcgX190eXBlOyB9OworCisgIC8vIERlY2xhcmUgYnV0IGRvbid0IGRlZmluZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3JlbW92ZV91bnNpZ25lZDxib29sPjsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcmVtb3ZlX3Vuc2lnbmVkPHdjaGFyX3Q+OworCisKKyAgLy8gRm9yIHVzZSBpbiBzdHJpbmcgYW5kIHZzdHJpbmcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UeXBlPgorICAgIGlubGluZSBib29sCisgICAgX19pc19udWxsX3BvaW50ZXIoX1R5cGUqIF9fcHRyKQorICAgIHsgcmV0dXJuIF9fcHRyID09IDA7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHlwZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIF9faXNfbnVsbF9wb2ludGVyKF9UeXBlKQorICAgIHsgcmV0dXJuIGZhbHNlOyB9CisKKworICAvLyBGb3IgY29tcGxleCBhbmQgY21hdGgKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sID0gc3RkOjpfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZT4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlCisgICAgeyB0eXBlZGVmIGRvdWJsZSBfX3R5cGU7IH07CisKKyAgLy8gTm8gbmVzdGVkIF9fdHlwZSBtZW1iZXIgZm9yIG5vbi1pbnRlZ2VyIG5vbi1mbG9hdGluZyBwb2ludCB0eXBlcywKKyAgLy8gYWxsb3dzIHRoaXMgdHlwZSB0byBiZSB1c2VkIGZvciBTRklOQUUgdG8gY29uc3RyYWluIG92ZXJsb2FkcyBpbgorICAvLyA8Y21hdGg+IGFuZCA8Y29tcGxleD4gdG8gb25seSB0aGUgaW50ZW5kZWQgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlPF9UcCwgZmFsc2U+CisgICAgeyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlPGxvbmcgZG91YmxlPgorICAgIHsgdHlwZWRlZiBsb25nIGRvdWJsZSBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3Byb21vdGU8ZG91YmxlPgorICAgIHsgdHlwZWRlZiBkb3VibGUgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlPGZsb2F0PgorICAgIHsgdHlwZWRlZiBmbG9hdCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsCisgICAgICAgICAgIHR5cGVuYW1lIF9UcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1RwPjo6X190eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfVXAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9VcD46Ol9fdHlwZT4KKyAgICBzdHJ1Y3QgX19wcm9tb3RlXzIKKyAgICB7CisgICAgICB0eXBlZGVmIF9fdHlwZW9mX18oX1RwMigpICsgX1VwMigpKSBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcCwgdHlwZW5hbWUgX1ZwLAorICAgICAgICAgICB0eXBlbmFtZSBfVHAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9UcD46Ol9fdHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1VwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVXA+OjpfX3R5cGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9WcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1ZwPjo6X190eXBlPgorICAgIHN0cnVjdCBfX3Byb21vdGVfMworICAgIHsKKyAgICAgIHR5cGVkZWYgX190eXBlb2ZfXyhfVHAyKCkgKyBfVXAyKCkgKyBfVnAyKCkpIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnAsIHR5cGVuYW1lIF9XcCwKKyAgICAgICAgICAgdHlwZW5hbWUgX1RwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfVHA+OjpfX3R5cGUsCisgICAgICAgICAgIHR5cGVuYW1lIF9VcDIgPSB0eXBlbmFtZSBfX3Byb21vdGU8X1VwPjo6X190eXBlLAorICAgICAgICAgICB0eXBlbmFtZSBfVnAyID0gdHlwZW5hbWUgX19wcm9tb3RlPF9WcD46Ol9fdHlwZSwKKyAgICAgICAgICAgdHlwZW5hbWUgX1dwMiA9IHR5cGVuYW1lIF9fcHJvbW90ZTxfV3A+OjpfX3R5cGU+CisgICAgc3RydWN0IF9fcHJvbW90ZV80CisgICAgeworICAgICAgdHlwZWRlZiBfX3R5cGVvZl9fKF9UcDIoKSArIF9VcDIoKSArIF9WcDIoKSArIF9XcDIoKSkgX190eXBlOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvdHlwZWxpc3QuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3R5cGVsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5NGVjZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3R5cGVsaXN0LmgKQEAgLTAsMCArMSw1NTQgQEAKKy8vIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQgQW1pIFRhdm9yeSBhbmQgVmxhZGltaXIgRHJlaXppbiwgSUJNLUhSTC4KKworLy8gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kCisvLyB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIE5vbmUgb2YKKy8vIHRoZSBhYm92ZSBhdXRob3JzLCBub3IgSUJNIEhhaWZhIFJlc2VhcmNoIExhYm9yYXRvcmllcywgbWFrZSBhbnkKKy8vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKy8vIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKKy8qKgorICogIEBmaWxlIGV4dC90eXBlbGlzdC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKgorICogIENvbnRhaW5zIHR5cGVsaXN0X2NoYWluIGRlZmluaXRpb25zLgorICogIFR5cGVsaXN0cyBhcmUgYW4gaWRlYSBieSBBbmRyZWkgQWxleGFuZHJlc2N1LgorICovCisKKyNpZm5kZWYgX1RZUEVMSVNUX0gKKyNkZWZpbmUgX1RZUEVMSVNUX0ggMQorCisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworLyoqIEBuYW1lc3BhY2UgX19nbnVfY3h4Ojp0eXBlbGlzdAorICogIEBicmllZiBHTlUgdHlwZWxpc3QgZXh0ZW5zaW9ucyBmb3IgcHVibGljIGNvbXBpbGUtdGltZSB1c2UuCisqLworbmFtZXNwYWNlIHR5cGVsaXN0Cit7CisgIHN0cnVjdCBudWxsX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFJvb3Q+CisgICAgc3RydWN0IG5vZGUKKyAgICB7CisgICAgICB0eXBlZGVmIFJvb3QgCXJvb3Q7CisgICAgfTsKKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBmdW5jdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHN0cnVjdCBjaGFpbgorICAgIHsKKyAgICAgIHR5cGVkZWYgSGQgCWhlYWQ7CisgICAgICB0eXBlZGVmIFR5cGVsaXN0IAl0YWlsOworICAgIH07CisKKyAgLy8gQXBwbHkgYWxsIHR5cGVsaXN0IHR5cGVzIHRvIHVuYXJ5IGZ1bmN0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICB2b2lkCisgICAgYXBwbHkoRm4mLCBUeXBlbGlzdCk7CisKKyAgLy8vIEFwcGx5IGFsbCB0eXBlbGlzdCB0eXBlcyB0byBnZW5lcmF0b3IgZnVuY3Rvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24sIHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHZvaWQKKyAgICBhcHBseV9nZW5lcmF0b3IoR24mLCBUeXBlbGlzdCk7CisKKyAgLy8gQXBwbHkgYWxsIHR5cGVsaXN0IHR5cGVzIGFuZCB2YWx1ZXMgdG8gZ2VuZXJhdG9yIGZ1bmN0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduLCB0eXBlbmFtZSBUeXBlbGlzdFQsIHR5cGVuYW1lIFR5cGVsaXN0Vj4KKyAgICB2b2lkCisgICAgYXBwbHlfZ2VuZXJhdG9yKEduJiwgVHlwZWxpc3RULCBUeXBlbGlzdFYpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0MCwgdHlwZW5hbWUgVHlwZWxpc3QxPgorICAgIHN0cnVjdCBhcHBlbmQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q+CisgICAgc3RydWN0IGFwcGVuZF90eXBlbGlzdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgdHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY29udGFpbnM7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QsIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFByZWQ+CisgICAgc3RydWN0IGZpbHRlcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdCwgaW50IGk+CisgICAgc3RydWN0IGF0X2luZGV4OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUcmFuc2Zvcm0+CisgICAgc3RydWN0IHRyYW5zZm9ybTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdD4KKyAgICBzdHJ1Y3QgZmxhdHRlbjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICBzdHJ1Y3QgZnJvbV9maXJzdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMT4KKyAgICBzdHJ1Y3QgY3JlYXRlMTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IGNyZWF0ZTI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMz4KKyAgICBzdHJ1Y3QgY3JlYXRlMzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgICBzdHJ1Y3QgY3JlYXRlNDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgICAgc3RydWN0IGNyZWF0ZTU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywKKwkgICB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2PgorICAgIHN0cnVjdCBjcmVhdGU2OworfSAvLyBuYW1lc3BhY2UgdHlwZWxpc3QKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworbmFtZXNwYWNlIHR5cGVsaXN0Cit7CituYW1lc3BhY2UgZGV0YWlsCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwbHlfOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGw+CisgICAgc3RydWN0IGFwcGx5XzxGbiwgY2hhaW48SGQsIFRsPiA+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShGbiYgZikKKyAgICAgIHsKKwlmLm9wZXJhdG9yKCkoSGQoKSk7CisJYXBwbHlfPEZuLCBUbD4gbmV4dDsKKwluZXh0KGYpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4+CisgICAgc3RydWN0IGFwcGx5XzxGbiwgbnVsbF90eXBlPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoRm4mKSB7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEduLCB0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgYXBwbHlfZ2VuZXJhdG9yMV87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24sIHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbD4KKyAgICBzdHJ1Y3QgYXBwbHlfZ2VuZXJhdG9yMV88R24sIGNoYWluPEhkLCBUbD4gPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoR24mIGcpCisgICAgICB7CisJZy50ZW1wbGF0ZSBvcGVyYXRvcigpPEhkPigpOworCWFwcGx5X2dlbmVyYXRvcjFfPEduLCBUbD4gbmV4dDsKKwluZXh0KGcpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24+CisgICAgc3RydWN0IGFwcGx5X2dlbmVyYXRvcjFfPEduLCBudWxsX3R5cGU+CisgICAgeworICAgICAgdm9pZAorICAgICAgb3BlcmF0b3IoKShHbiYpIHsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24sIHR5cGVuYW1lIFR5cGVsaXN0VF9DaGFpbiwgdHlwZW5hbWUgVHlwZWxpc3RWX0NoYWluPgorICAgIHN0cnVjdCBhcHBseV9nZW5lcmF0b3IyXzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBHbiwgdHlwZW5hbWUgSGQxLCB0eXBlbmFtZSBUbFQsIHR5cGVuYW1lIEhkMiwgdHlwZW5hbWUgVGxWPgorICAgIHN0cnVjdCBhcHBseV9nZW5lcmF0b3IyXzxHbiwgY2hhaW48SGQxLCBUbFQ+LCBjaGFpbjxIZDIsIFRsVj4gPgorICAgIHsKKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoR24mIGcpCisgICAgICB7CisJZy50ZW1wbGF0ZSBvcGVyYXRvcigpPEhkMSwgSGQyPigpOworCWFwcGx5X2dlbmVyYXRvcjJfPEduLCBUbFQsIFRsVj4gbmV4dDsKKwluZXh0KGcpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgR24+CisgICAgc3RydWN0IGFwcGx5X2dlbmVyYXRvcjJfPEduLCBudWxsX3R5cGUsIG51bGxfdHlwZT4KKyAgICB7CisgICAgICB2b2lkCisgICAgICBvcGVyYXRvcigpKEduJikgeyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbjAsIHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluMT4KKyAgICBzdHJ1Y3QgYXBwZW5kXzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGwsIHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBhcHBlbmRfPGNoYWluPEhkLCBUbD4sIFR5cGVsaXN0X0NoYWluPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBhcHBlbmRfPFRsLCBUeXBlbGlzdF9DaGFpbj4gCQkJYXBwZW5kX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGNoYWluPEhkLCB0eXBlbmFtZSBhcHBlbmRfdHlwZTo6dHlwZT4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGFwcGVuZF88bnVsbF90eXBlLCBUeXBlbGlzdF9DaGFpbj4KKyAgICB7CisgICAgICB0eXBlZGVmIFR5cGVsaXN0X0NoYWluIAkJCSAgICAgIAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0X0NoYWluPgorICAgIHN0cnVjdCBhcHBlbmRfPFR5cGVsaXN0X0NoYWluLCBudWxsX3R5cGU+CisgICAgeworICAgICAgdHlwZWRlZiBUeXBlbGlzdF9DaGFpbiAJCQkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGFwcGVuZF88bnVsbF90eXBlLCBudWxsX3R5cGU+CisgICAgeworICAgICAgdHlwZWRlZiBudWxsX3R5cGUgCQkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3RfQ2hhaW4+CisgICAgc3RydWN0IGFwcGVuZF90eXBlbGlzdF87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQ+CisgICAgc3RydWN0IGFwcGVuZF90eXBlbGlzdF88Y2hhaW48SGQsIG51bGxfdHlwZT4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgY2hhaW48SGQsIG51bGxfdHlwZT4gCQkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGw+CisgICAgc3RydWN0IGFwcGVuZF90eXBlbGlzdF88Y2hhaW48IEhkLCBUbD4gPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBhcHBlbmRfdHlwZWxpc3RfPFRsPjo6dHlwZSAJCXJlc3RfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXBwZW5kPEhkLCBub2RlPHJlc3RfdHlwZT4gPjo6dHlwZTo6cm9vdAl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4sIHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNvbnRhaW5zXzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWluc188bnVsbF90eXBlLCBUPgorICAgIHsKKyAgICAgIGVudW0KKwl7CisJICB2YWx1ZSA9IGZhbHNlCisJfTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEhkLCB0eXBlbmFtZSBUbCwgdHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY29udGFpbnNfPGNoYWluPEhkLCBUbD4sIFQ+CisgICAgeworICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gY29udGFpbnNfPFRsLCBUPjo6dmFsdWUKKwl9OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGwsIHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IGNvbnRhaW5zXzxjaGFpbjxULCBUbD4sIFQ+CisgICAgeworICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gdHJ1ZQorCX07CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9DaGFpbiwgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUHJlZD4KKyAgICBzdHJ1Y3QgY2hhaW5fZmlsdGVyXzsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBQcmVkPgorICAgIHN0cnVjdCBjaGFpbl9maWx0ZXJfPG51bGxfdHlwZSwgUHJlZD4KKyAgICB7CisgICAgICB0eXBlZGVmIG51bGxfdHlwZSAJCQkJCXR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsLCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBQcmVkPgorICAgIHN0cnVjdCBjaGFpbl9maWx0ZXJfPGNoYWluPEhkLCBUbD4sIFByZWQ+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICBlbnVtCisJeworCSAgaW5jbHVkZV9oZCA9IFByZWQ8SGQ+Ojp2YWx1ZQorCX07CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhaW5fZmlsdGVyXzxUbCwgUHJlZD46OnR5cGUgCQlyZXN0X3R5cGU7CisgICAgICB0eXBlZGVmIGNoYWluPEhkLCByZXN0X3R5cGU+IAkJCQljaGFpbl90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2NvbmRpdGlvbmFsX3R5cGU8aW5jbHVkZV9oZCwgY2hhaW5fdHlwZSwgcmVzdF90eXBlPjo6X190eXBlIHR5cGU7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfQ2hhaW4sIGludCBpPgorICAgIHN0cnVjdCBjaGFpbl9hdF9pbmRleF87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGQsIHR5cGVuYW1lIFRsPgorICAgIHN0cnVjdCBjaGFpbl9hdF9pbmRleF88Y2hhaW48SGQsIFRsPiwgMD4KKyAgICB7CisgICAgICB0eXBlZGVmIEhkIAkJCQkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBIZCwgdHlwZW5hbWUgVGwsIGludCBpPgorICAgIHN0cnVjdCBjaGFpbl9hdF9pbmRleF88Y2hhaW48SGQsIFRsPiwgaT4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNoYWluX2F0X2luZGV4XzxUbCwgaSAtIDE+Ojp0eXBlIAl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgVHlwZWxpc3RfQ2hhaW4sIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRyYW5zZm9ybT4KKyAgICBzdHJ1Y3QgY2hhaW5fdHJhbnNmb3JtXzsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUcmFuc2Zvcm0+CisgICAgc3RydWN0IGNoYWluX3RyYW5zZm9ybV88bnVsbF90eXBlLCBUcmFuc2Zvcm0+CisgICAgeworICAgICAgdHlwZWRlZiBudWxsX3R5cGUgCQkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgSGQsIGNsYXNzIFRsLCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUcmFuc2Zvcm0+CisgICAgc3RydWN0IGNoYWluX3RyYW5zZm9ybV88Y2hhaW48SGQsIFRsPiwgVHJhbnNmb3JtPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjaGFpbl90cmFuc2Zvcm1fPFRsLCBUcmFuc2Zvcm0+Ojp0eXBlIAlyZXN0X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFRyYW5zZm9ybTxIZD46OnR5cGUgCQkJdHJhbnNmb3JtX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGNoYWluPHRyYW5zZm9ybV90eXBlLCByZXN0X3R5cGU+IAkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdF9DaGFpbj4KKyAgICBzdHJ1Y3QgY2hhaW5fZmxhdHRlbl87CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGRfVGw+CisgICAgc3RydWN0IGNoYWluX2ZsYXR0ZW5fPGNoYWluPEhkX1RsLCBudWxsX3R5cGU+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhkX1RsOjpyb290IAkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgSGRfVHlwZWxpc3QsIGNsYXNzIFRsX1R5cGVsaXN0PgorICAgIHN0cnVjdCBjaGFpbl9mbGF0dGVuXzxjaGFpbjxIZF9UeXBlbGlzdCwgVGxfVHlwZWxpc3Q+ID4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2hhaW5fZmxhdHRlbl88VGxfVHlwZWxpc3Q+Ojp0eXBlIAlyZXN0X3R5cGU7CisgICAgICB0eXBlZGVmIGFwcGVuZDxIZF9UeXBlbGlzdCwgbm9kZTxyZXN0X3R5cGU+ID4JCWFwcGVuZF90eXBlOworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXBwZW5kX3R5cGU6OnR5cGU6OnJvb3QgCQkJdHlwZTsKKyAgICB9OworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSB0eXBlbGlzdAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xKFgwKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX19nbnVfY3h4Ojp0eXBlbGlzdDo6bnVsbF90eXBlPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjIoWDAsIFgxKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xKFgxKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMyhYMCwgWDEsIFgyKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4yKFgxLCBYMikgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjQoWDAsIFgxLCBYMiwgWDMpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjMoWDEsIFgyLCBYMykgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjUoWDAsIFgxLCBYMiwgWDMsIFg0KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU40KFgxLCBYMiwgWDMsIFg0KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlONihYMCwgWDEsIFgyLCBYMywgWDQsIFg1KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU41KFgxLCBYMiwgWDMsIFg0LCBYNSkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjcoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjYoWDEsIFgyLCBYMywgWDQsIFg1LCBYNikgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjgoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU43KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3KSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOOShYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU44KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCkgPgorI2RlZmluZSBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEwKFgwLCBYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5KSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU45KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDkpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMShYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMChYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTApID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMihYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjExKFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExKSA+CisjZGVmaW5lIF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMTMoWDAsIFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjEyKFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xNChYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzKSBfX2dudV9jeHg6OnR5cGVsaXN0OjpjaGFpbjxYMCwgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xMyhYMSwgWDIsIFgzLCBYNCwgWDUsIFg2LCBYNywgWDgsIFg5LCBYMTAsIFgxMSwgWDEyLCBYMTMpID4KKyNkZWZpbmUgX0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xNShYMCwgWDEsIFgyLCBYMywgWDQsIFg1LCBYNiwgWDcsIFg4LCBYOSwgWDEwLCBYMTEsIFgxMiwgWDEzLCBYMTQpIF9fZ251X2N4eDo6dHlwZWxpc3Q6OmNoYWluPFgwLCBfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjE0KFgxLCBYMiwgWDMsIFg0LCBYNSwgWDYsIFg3LCBYOCwgWDksIFgxMCwgWDExLCBYMTIsIFgxMywgWDE0KSA+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworbmFtZXNwYWNlIHR5cGVsaXN0Cit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEZuLCB0eXBlbmFtZSBUeXBlbGlzdD4KKyAgICB2b2lkCisgICAgYXBwbHkoRm4mIGZuLCBUeXBlbGlzdCkKKyAgICB7CisgICAgICBkZXRhaWw6OmFwcGx5XzxGbiwgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3Q+IGE7CisgICAgICBhKGZuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm4sIHR5cGVuYW1lIFR5cGVsaXN0PgorICAgIHZvaWQKKyAgICBhcHBseV9nZW5lcmF0b3IoRm4mIGZuLCBUeXBlbGlzdCkKKyAgICB7CisgICAgICBkZXRhaWw6OmFwcGx5X2dlbmVyYXRvcjFfPEZuLCB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdD4gYTsKKyAgICAgIGEoZm4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGbiwgdHlwZW5hbWUgVHlwZWxpc3RULCB0eXBlbmFtZSBUeXBlbGlzdFY+CisgICAgdm9pZAorICAgIGFwcGx5X2dlbmVyYXRvcihGbiYgZm4sIFR5cGVsaXN0VCwgVHlwZWxpc3RWKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3RUOjpyb290IHJvb3RUOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdFY6OnJvb3Qgcm9vdFY7CisgICAgICBkZXRhaWw6OmFwcGx5X2dlbmVyYXRvcjJfPEZuLCByb290VCwgcm9vdFY+IGE7CisgICAgICBhKGZuKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QwLCB0eXBlbmFtZSBUeXBlbGlzdDE+CisgICAgc3RydWN0IGFwcGVuZAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDA6OnJvb3QgCQkJCXJvb3QwX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0MTo6cm9vdCAJCQkJcm9vdDFfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjphcHBlbmRfPHJvb3QwX3R5cGUsIHJvb3QxX3R5cGU+IAkJYXBwZW5kX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIG5vZGU8dHlwZW5hbWUgYXBwZW5kX3R5cGU6OnR5cGU+IAkJCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlbGlzdF9UeXBlbGlzdD4KKyAgICBzdHJ1Y3QgYXBwZW5kX3R5cGVsaXN0CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIFR5cGVsaXN0X1R5cGVsaXN0Ojpyb290IAkJICAgICAgCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjphcHBlbmRfdHlwZWxpc3RfPHJvb3RfdHlwZT4gCQlhcHBlbmRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTx0eXBlbmFtZSBhcHBlbmRfdHlwZTo6dHlwZT4gCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjb250YWlucworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdCAJCQkJcm9vdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgZW51bQorCXsKKwkgIHZhbHVlID0gZGV0YWlsOjpjb250YWluc188cm9vdF90eXBlLCBUPjo6dmFsdWUKKwl9OworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3QsIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFByZWQ+CisgICAgc3RydWN0IGZpbHRlcgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdCAJCQkJcm9vdF90eXBlOworICAgICAgdHlwZWRlZiBkZXRhaWw6OmNoYWluX2ZpbHRlcl88cm9vdF90eXBlLCBQcmVkPiAJCWZpbHRlcl90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBub2RlPHR5cGVuYW1lIGZpbHRlcl90eXBlOjp0eXBlPiAJICAgICAgIAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCBpbnQgaT4KKyAgICBzdHJ1Y3QgYXRfaW5kZXgKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3Q6OnJvb3QgCQkJCXJvb3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgZGV0YWlsOjpjaGFpbl9hdF9pbmRleF88cm9vdF90eXBlLCBpPiAJCWluZGV4X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGluZGV4X3R5cGU6OnR5cGUgCQkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVsaXN0LCB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUcmFuc2Zvcm0+CisgICAgc3RydWN0IHRyYW5zZm9ybQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUeXBlbGlzdDo6cm9vdCAJCQkJcm9vdF90eXBlOworICAgICAgdHlwZWRlZiBkZXRhaWw6OmNoYWluX3RyYW5zZm9ybV88cm9vdF90eXBlLCBUcmFuc2Zvcm0+IAl0cmFuc2Zvcm1fdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTx0eXBlbmFtZSB0cmFuc2Zvcm1fdHlwZTo6dHlwZT4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q+CisgICAgc3RydWN0IGZsYXR0ZW4KKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgVHlwZWxpc3RfVHlwZWxpc3Q6OnJvb3QgCQkgICAgICAJcm9vdF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBkZXRhaWw6OmNoYWluX2ZsYXR0ZW5fPHJvb3RfdHlwZT46OnR5cGUgCWZsYXR0ZW5fdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTxmbGF0dGVuX3R5cGU+IAkJCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZWxpc3Q+CisgICAgc3RydWN0IGZyb21fZmlyc3QKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgYXRfaW5kZXg8VHlwZWxpc3QsIDA+Ojp0eXBlIAkJZmlyc3RfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgbm9kZTxjaGFpbjxmaXJzdF90eXBlLCBudWxsX3R5cGU+ID4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDE+CisgICAgc3RydWN0IGNyZWF0ZTEKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4xKFQxKT4gCQl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBjcmVhdGUyCisgICAgeworICAgICAgdHlwZWRlZiBub2RlPF9HTElCQ1hYX1RZUEVMSVNUX0NIQUlOMihUMSxUMik+IAkJdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CisgICAgc3RydWN0IGNyZWF0ZTMKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU4zKFQxLFQyLFQzKT4JCXR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUND4KKyAgICBzdHJ1Y3QgY3JlYXRlNAorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZTxfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjQoVDEsVDIsVDMsVDQpPgl0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywKKwkgICB0eXBlbmFtZSBUNCwgdHlwZW5hbWUgVDU+CisgICAgc3RydWN0IGNyZWF0ZTUKKyAgICB7CisgICAgICB0eXBlZGVmIG5vZGU8X0dMSUJDWFhfVFlQRUxJU1RfQ0hBSU41KFQxLFQyLFQzLFQ0LFQ1KT4JdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsCisJICAgdHlwZW5hbWUgVDQsIHR5cGVuYW1lIFQ1LCB0eXBlbmFtZSBUNj4KKyAgICBzdHJ1Y3QgY3JlYXRlNgorICAgIHsKKyAgICAgIHR5cGVkZWYgbm9kZTxfR0xJQkNYWF9UWVBFTElTVF9DSEFJTjYoVDEsVDIsVDMsVDQsVDUsVDYpPgl0eXBlOworICAgIH07Cit9IC8vIG5hbWVzcGFjZSB0eXBlbGlzdAorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvdnN0cmluZy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvdnN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZGYzNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC92c3RyaW5nLmgKQEAgLTAsMCArMSwyODE5IEBACisvLyBWZXJzYXRpbGUgc3RyaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC92c3RyaW5nLmgKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9WU1RSSU5HX0gKKyNkZWZpbmUgX1ZTVFJJTkdfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8ZXh0L3ZzdHJpbmdfdXRpbC5oPgorI2luY2x1ZGUgPGV4dC9yY19zdHJpbmdfYmFzZS5oPgorI2luY2x1ZGUgPGV4dC9zc29fc3RyaW5nX2Jhc2UuaD4KKworI2lmIF9fZ29vZ2xlX3N0bF9kZWJ1Z19zdHJpbmcgJiYgIWRlZmluZWQoX0dMSUJDWFhfREVCVUcpCisjIHVuZGVmIF9HTElCQ1hYX0RFQlVHX0FTU0VSVAorIyB1bmRlZiBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQKKy8vIFBlcmZvcm0gYWRkaXRpb25hbCBjaGVja3MgKGJ1dCBvbmx5IGluIHRoaXMgZmlsZSkuCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX0NvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEgKF9Db25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgYnVmWzUxMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19idWlsdGluX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6JWQ6ICVzOiBBc3NlcnRpb24gJyVzJyBmYWlsZWQuXG4iLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18sICMgX0NvbmRpdGlvbik7ICAgICBcCisgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoYnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9Db25kaXRpb24pIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfQ29uZGl0aW9uKQorI2VuZGlmCisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBjbGFzcyBfX3ZlcnNhX3N0cmluZyB2c3RyaW5nLmgKKyAgICogIEBicmllZiAgVGVtcGxhdGUgY2xhc3MgX192ZXJzYV9zdHJpbmcuIAorICAgKiAgQGluZ3JvdXAgZXh0ZW5zaW9ucworICAgKgorICAgKiAgRGF0YSBzdHJ1Y3R1cmUgbWFuYWdpbmcgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgYW5kCisgICAqICBjaGFyYWN0ZXItbGlrZSBvYmplY3RzLiAKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBjbGFzcyBfX3ZlcnNhX3N0cmluZworICAgIDogcHJpdmF0ZSBfQmFzZTxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CYXNlPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiAgICAgICAgICAgICAgICBfX3ZzdHJpbmdfYmFzZTsgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fdnN0cmluZ19iYXNlOjpfQ2hhclRfYWxsb2NfdHlwZSAgICBfQ2hhclRfYWxsb2NfdHlwZTsKKworICAgICAgLy8gVHlwZXM6CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQ2hhclRfYWxsb2NfdHlwZTo6c2l6ZV90eXBlCSAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgCSAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnBvaW50ZXIJICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyCSAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6Ol9fbm9ybWFsX2l0ZXJhdG9yPHBvaW50ZXIsIF9fdmVyc2Ffc3RyaW5nPiAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8Y29uc3RfcG9pbnRlciwgX192ZXJzYV9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPgljb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+CQkgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gRGF0YSBNZW1iZXIgKHB1YmxpYyk6CisgICAgICAvLy8gIFZhbHVlIHJldHVybmVkIGJ5IHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHRoZXkgZmFpbC4KKyAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUJbnBvcyA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fY2hlY2soc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKF9fcG9zID4gdGhpcy0+c2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oX19zKSk7CisJcmV0dXJuIF9fcG9zOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jaGVja19sZW5ndGgoc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBjb25zdCBjaGFyKiBfX3MpIGNvbnN0CisgICAgICB7CisJaWYgKHRoaXMtPm1heF9zaXplKCkgLSAodGhpcy0+c2l6ZSgpIC0gX19uMSkgPCBfX24yKQorCSAgc3RkOjpfX3Rocm93X2xlbmd0aF9lcnJvcihfX04oX19zKSk7CisgICAgICB9CisKKyAgICAgIC8vIE5COiBfTV9saW1pdCBkb2Vzbid0IGNoZWNrIGZvciBhIGJhZCBfX3BvcyB2YWx1ZS4KKyAgICAgIHNpemVfdHlwZQorICAgICAgX01fbGltaXQoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19vZmYpIGNvbnN0CisgICAgICB7CisJY29uc3QgYm9vbCBfX3Rlc3RvZmYgPSAgX19vZmYgPCB0aGlzLT5zaXplKCkgLSBfX3BvczsKKwlyZXR1cm4gX190ZXN0b2ZmID8gX19vZmYgOiB0aGlzLT5zaXplKCkgLSBfX3BvczsKKyAgICAgIH0KKworICAgICAgLy8gVHJ1ZSBpZiBfUmVwIGFuZCBzb3VyY2UgZG8gbm90IG92ZXJsYXAuCisgICAgICBib29sCisgICAgICBfTV9kaXNqdW5jdChjb25zdCBfQ2hhclQqIF9fcykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gKHN0ZDo6bGVzczxjb25zdCBfQ2hhclQqPigpKF9fcywgdGhpcy0+X01fZGF0YSgpKQorCQl8fCBzdGQ6Omxlc3M8Y29uc3QgX0NoYXJUKj4oKSh0aGlzLT5fTV9kYXRhKCkKKwkJCQkJICAgICAgKyB0aGlzLT5zaXplKCksIF9fcykpOworICAgICAgfQorCisgICAgICAvLyBGb3IgdGhlIGludGVybmFsIHVzZSB3ZSBoYXZlIGZ1bmN0aW9ucyBzaW1pbGFyIHRvIGBiZWdpbicvYGVuZCcKKyAgICAgIC8vIGJ1dCB0aGV5IGRvIG5vdCBjYWxsIF9NX2xlYWsuCisgICAgICBpdGVyYXRvcgorICAgICAgX01faWJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIF9NX2llbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgdGhpcy0+X01fbGVuZ3RoKCkpOyB9CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgLy8gTkI6IFdlIG92ZXJsb2FkIGN0b3JzIGluIHNvbWUgY2FzZXMgaW5zdGVhZCBvZiB1c2luZyBkZWZhdWx0CisgICAgICAvLyBhcmd1bWVudHMsIHBlciAxNy40LjQuNCBwYXJhLiAyIGl0ZW0gMi4KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZygpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKCkgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IGFuIGVtcHR5IHN0cmluZyB1c2luZyBhbGxvY2F0b3IgQGEgYS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX2EpIHsgfQorCisgICAgICAvLyBOQjogcGVyIExXRyBpc3N1ZSA0Miwgc2VtYW50aWNzIGRpZmZlcmVudCBmcm9tIElTOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIHdpdGggY29weSBvZiB2YWx1ZSBvZiBAYSBzdHIuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX3N0cikgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdHJpbmcgbW92ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY29uc3RydWN0ZWQgJXN0cmluZyBjb250YWlucyB0aGUgZXhhY3QgY29udGVudHMgb2YKKyAgICAgICAqICBAYSBzdHIuICBUaGUgY29udGVudHMgb2YgQGEgc3RyIGFyZSBhIHZhbGlkLCBidXQgdW5zcGVjaWZpZWQKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKF9fdmVyc2Ffc3RyaW5nJiYgX19zdHIpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKHN0ZDo6bW92ZShfX3N0cikpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogIEBwYXJhbSAgX19sICBzdGQ6OmluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCwKKwkJICAgICBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX2wuYmVnaW4oKSwgX19sLmVuZCgpLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBjb3B5IG9mIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGNvcHkgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29weSAoZGVmYXVsdCByZW1haW5kZXIpLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcywKKwkJICAgICBzaXplX3R5cGUgX19uID0gbnBvcykKKyAgICAgIDogX192c3RyaW5nX2Jhc2UoX19zdHIuX01fZGF0YSgpCisJCSAgICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLAorCQkJCQkiX192ZXJzYV9zdHJpbmc6Ol9fdmVyc2Ffc3RyaW5nIiksCisJCSAgICAgICBfX3N0ci5fTV9kYXRhKCkgKyBfX3N0ci5fTV9saW1pdChfX3BvcywgX19uKQorCQkgICAgICAgKyBfX3BvcywgX0FsbG9jKCkpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fc3RyICBTb3VyY2Ugc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBjb3B5IGZyb20uCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLAorCQkgICAgIHNpemVfdHlwZSBfX24sIGNvbnN0IF9BbGxvYyYgX19hKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX3N0ci5fTV9kYXRhKCkKKwkJICAgICAgICsgX19zdHIuX01fY2hlY2soX19wb3MsCisJCQkJCSJfX3ZlcnNhX3N0cmluZzo6X192ZXJzYV9zdHJpbmciKSwKKwkJICAgICAgIF9fc3RyLl9NX2RhdGEoKSArIF9fc3RyLl9NX2xpbWl0KF9fcG9zLCBfX24pCisJCSAgICAgICArIF9fcG9zLCBfX2EpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgaW5pdGlhbGl6ZWQgYnkgYSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX3MgIFNvdXJjZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtICBfX2EgIEFsbG9jYXRvciB0byB1c2UgKGRlZmF1bHQgaXMgZGVmYXVsdCBhbGxvY2F0b3IpLgorICAgICAgICoKKyAgICAgICAqICBOQjogQGEgX19zIG11c3QgaGF2ZSBhdCBsZWFzdCBAYSBfX24gY2hhcmFjdGVycywgJ1xcMCcgaGFzIG5vIHNwZWNpYWwKKyAgICAgICAqICBtZWFuaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyhjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbiwKKwkJICAgICBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKQorICAgICAgOiBfX3ZzdHJpbmdfYmFzZShfX3MsIF9fcyArIF9fbiwgX19hKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb25zdHJ1Y3Qgc3RyaW5nIGFzIGNvcHkgb2YgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcyAgU291cmNlIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19hICBBbGxvY2F0b3IgdG8gdXNlIChkZWZhdWx0IGlzIGRlZmF1bHQgYWxsb2NhdG9yKS4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcoY29uc3QgX0NoYXJUKiBfX3MsIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fcywgX19zID8gX19zICsgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpIDoKKwkJICAgICAgIF9fcyArIG5wb3MsIF9fYSkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmluZyBhcyBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fYyAgQ2hhcmFjdGVyIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MsIGNvbnN0IF9BbGxvYyYgX19hID0gX0FsbG9jKCkpCisgICAgICA6IF9fdnN0cmluZ19iYXNlKF9fbiwgX19jLCBfX2EpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJpbmcgYXMgY29weSBvZiBhIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19iZWcgIFN0YXJ0IG9mIHJhbmdlLgorICAgICAgICogIEBwYXJhbSAgX19lbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gIF9fYSAgQWxsb2NhdG9yIHRvIHVzZSAoZGVmYXVsdCBpcyBkZWZhdWx0IGFsbG9jYXRvcikuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfX3ZlcnNhX3N0cmluZyhfSW5wdXRJdGVyYXRvciBfX2JlZywgX0lucHV0SXRlcmF0b3IgX19lbmQsCisJCSAgICAgICBjb25zdCBfQWxsb2MmIF9fYSA9IF9BbGxvYygpKQorCTogX192c3RyaW5nX2Jhc2UoX19iZWcsIF9fZW5kLCBfX2EpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlc3Ryb3kgdGhlIHN0cmluZyBpbnN0YW5jZS4KKyAgICAgICAqLworICAgICAgfl9fdmVyc2Ffc3RyaW5nKCkgeyB9CQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiB0aGUgdmFsdWUgb2YgQGEgc3RyIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikgCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zdHIpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdHJpbmcgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSAgX19zdHIgIFNvdXJjZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBjb250ZW50cyBvZiBAYSBfX3N0ciBhcmUgbW92ZWQgaW50byB0aGlzIHN0cmluZyAod2l0aG91dAorICAgICAgICogIGNvcHlpbmcpLiAgQGEgX19zdHIgaXMgYSB2YWxpZCwgYnV0IHVuc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oX192ZXJzYV9zdHJpbmcmJiBfX3N0cikKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwl0aGlzLT5zd2FwKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIHN0cmluZyBjb25zdHJ1Y3RlZCBmcm9tIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKiAgQHBhcmFtICBfX2wgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdC4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeworCXRoaXMtPmFzc2lnbihfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5IGNvbnRlbnRzIG9mIEBhIF9fcyBpbnRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19zICBTb3VyY2UgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX0NoYXJUKiBfX3MpIAorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gc3RyaW5nIG9mIGxlbmd0aCAxLgorICAgICAgICogIEBwYXJhbSAgX19jICBTb3VyY2UgY2hhcmFjdGVyLgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ25pbmcgdG8gYSBjaGFyYWN0ZXIgbWFrZXMgdGhpcyBzdHJpbmcgbGVuZ3RoIDEgYW5kCisgICAgICAgKiAgKCp0aGlzKVswXSA9PSBAYSBfX2MuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgb3BlcmF0b3I9KF9DaGFyVCBfX2MpIAorICAgICAgeyAKKwl0aGlzLT5hc3NpZ24oMSwgX19jKTsgCisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvcnM6CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCisgICAgICAgKiAgdGhlICVzdHJpbmcuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeworCXRoaXMtPl9NX2xlYWsoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICogIGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBVbnNoYXJlcyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsKKwl0aGlzLT5fTV9sZWFrKCk7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUKKyAgICAgICAqICBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLT5fTV9kYXRhKCkgKyB0aGlzLT5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkL3dyaXRlIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGxhc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQKKyAgICAgICAqICBvcmRlci4gIFVuc2hhcmVzIHRoZSBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluCisgICAgICAgKiAgcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5lbmQoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byBvbmUgYmVmb3JlIHRoZQorICAgICAgICogIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbiBpcyBkb25lIGluIHJldmVyc2UKKyAgICAgICAqICBlbGVtZW50IG9yZGVyLiAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzCisgICAgICAgKiAgdG8gb25lIGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSAlc3RyaW5nLiAgSXRlcmF0aW9uCisgICAgICAgKiAgaXMgZG9uZSBpbiByZXZlcnNlIGVsZW1lbnQgb3JkZXIuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIFJldHVybnMgYSByZWFkLW9ubHkgKGNvbnN0YW50KSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAqICBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlCisgICAgICAgKiAgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQtb25seSAoY29uc3RhbnQpIHJldmVyc2UgaXRlcmF0b3IgdGhhdCBwb2ludHMKKyAgICAgICAqICB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlICVzdHJpbmcuICBJdGVyYXRpb24gaXMgZG9uZSBpbgorICAgICAgICogIHJldmVyc2UgZWxlbWVudCBvcmRlci4KKyAgICAgICAqLworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmVuZCgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmV2ZXJzZSBpdGVyYXRvciB0aGF0IHBvaW50cworICAgICAgICogIHRvIG9uZSBiZWZvcmUgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgJXN0cmluZy4gIEl0ZXJhdGlvbgorICAgICAgICogIGlzIGRvbmUgaW4gcmV2ZXJzZSBlbGVtZW50IG9yZGVyLgorICAgICAgICovCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHRoaXMtPmJlZ2luKCkpOyB9CisjZW5kaWYKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENhcGFjaXR5OgorICAgICAgLy8vICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIGFueQorICAgICAgLy8vICBudWxsLXRlcm1pbmF0aW9uLgorICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2xlbmd0aCgpOyB9CisKKyAgICAgIC8vLyAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgbm90IGluY2x1ZGluZyBhbnkKKyAgICAgIC8vLyAgbnVsbC10ZXJtaW5hdGlvbi4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbGVuZ3RoKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2xlbmd0aCgpOyB9CisKKyAgICAgIC8vLyBSZXR1cm5zIHRoZSBzaXplKCkgb2YgdGhlIGxhcmdlc3QgcG9zc2libGUgJXN0cmluZy4KKyAgICAgIHNpemVfdHlwZQorICAgICAgbWF4X3NpemUoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fbWF4X3NpemUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZXMgdGhlICVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlICVzdHJpbmcgc2hvdWxkIGNvbnRhaW4uCisgICAgICAgKiAgQHBhcmFtICBfX2MgIENoYXJhY3RlciB0byBmaWxsIGFueSBuZXcgZWxlbWVudHMuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCAlcmVzaXplIHRoZSAlc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycy4gIElmIHRoZSBudW1iZXIgaXMgc21hbGxlciB0aGFuIHRoZQorICAgICAgICogICVzdHJpbmcncyBjdXJyZW50IHNpemUgdGhlICVzdHJpbmcgaXMgdHJ1bmNhdGVkLCBvdGhlcndpc2UKKyAgICAgICAqICB0aGUgJXN0cmluZyBpcyBleHRlbmRlZCBhbmQgbmV3IGVsZW1lbnRzIGFyZSBzZXQgdG8gQGEgX19jLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbiwgX0NoYXJUIF9fYyk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVzaXplcyB0aGUgJXN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSAgX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0aGUgJXN0cmluZyBzaG91bGQgY29udGFpbi4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2l6ZSB0aGUgJXN0cmluZyB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgKiAgbGVuZ3RoLiAgSWYgdGhlIG5ldyBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgJXN0cmluZydzCisgICAgICAgKiAgY3VycmVudCBzaXplIHRoZSAlc3RyaW5nIGlzIHRydW5jYXRlZCwgb3RoZXJ3aXNlIHRoZSAlc3RyaW5nCisgICAgICAgKiAgaXMgZXh0ZW5kZWQgYW5kIG5ldyBjaGFyYWN0ZXJzIGFyZSBkZWZhdWx0LWNvbnN0cnVjdGVkLiAgRm9yCisgICAgICAgKiAgYmFzaWMgdHlwZXMgc3VjaCBhcyBjaGFyLCB0aGlzIG1lYW5zIHNldHRpbmcgdGhlbSB0byAwLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgdGhpcy0+cmVzaXplKF9fbiwgX0NoYXJUKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLy8vIEEgbm9uLWJpbmRpbmcgcmVxdWVzdCB0byByZWR1Y2UgY2FwYWNpdHkoKSB0byBzaXplKCkuCisgICAgICB2b2lkCisgICAgICBzaHJpbmtfdG9fZml0KCkKKyAgICAgIHsKKwlfX3RyeQorCSAgeyB0aGlzLT5yZXNlcnZlKDApOyB9CisJX19jYXRjaCguLi4pCisJICB7IH0KKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSAlc3RyaW5nIGNhbgorICAgICAgICogIGhvbGQgYmVmb3JlIG5lZWRpbmcgdG8gYWxsb2NhdGUgbW9yZSBtZW1vcnkuCisgICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgY2FwYWNpdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY2FwYWNpdHkoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEF0dGVtcHQgdG8gcHJlYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSBmb3Igc3BlY2lmaWVkIG51bWJlciBvZgorICAgICAgICogICAgICAgICAgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gIF9fcmVzX2FyZyAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVxdWlyZWQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgQGEgX19yZXNfYXJnIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZXNlcnZlIGVub3VnaCBtZW1vcnkgZm9yIHRoZQorICAgICAgICogICVzdHJpbmcgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLiAgSWYgdGhlCisgICAgICAgKiAgbnVtYmVyIHJlcXVlc3RlZCBpcyBtb3JlIHRoYW4gbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLgorICAgICAgICoKKyAgICAgICAqICBUaGUgYWR2YW50YWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpZiBvcHRpbWFsIGNvZGUgaXMgYQorICAgICAgICogIG5lY2Vzc2l0eSBhbmQgdGhlIHVzZXIgY2FuIGRldGVybWluZSB0aGUgc3RyaW5nIGxlbmd0aCB0aGF0CisgICAgICAgKiAgd2lsbCBiZSByZXF1aXJlZCwgdGhlIHVzZXIgY2FuIHJlc2VydmUgdGhlIG1lbW9yeSBpbgorICAgICAgICogICVhZHZhbmNlLCBhbmQgdGh1cyBwcmV2ZW50IGEgcG9zc2libGUgcmVhbGxvY2F0aW9uIG9mIG1lbW9yeQorICAgICAgICogIGFuZCBjb3B5aW5nIG9mICVzdHJpbmcgZGF0YS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXJ2ZShzaXplX3R5cGUgX19yZXNfYXJnID0gMCkKKyAgICAgIHsgdGhpcy0+X01fcmVzZXJ2ZShfX3Jlc19hcmcpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEVyYXNlcyB0aGUgc3RyaW5nLCBtYWtpbmcgaXQgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgdGhpcy0+X01fY2xlYXIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlICVzdHJpbmcgaXMgZW1wdHkuICBFcXVpdmFsZW50IHRvIAorICAgICAgICogIDxjb2RlPip0aGlzID09ICIiPC9jb2RlPi4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c2l6ZSgpID09IDA7IH0KKworICAgICAgLy8gRWxlbWVudCBhY2Nlc3M6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN1YnNjcmlwdCBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSAgX19wb3MgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkLW9ubHkgKGNvbnN0YW50KSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKQorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10gKHNpemVfdHlwZSBfX3BvcykgY29uc3QKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX19wb3MgPD0gdGhpcy0+c2l6ZSgpKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdWJzY3JpcHQgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gIF9fcG9zICBUaGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBhY2Nlc3MuCisgICAgICAgKiAgQHJldHVybiAgUmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGNoYXJhY3Rlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBvcGVyYXRvciBhbGxvd3MgZm9yIGVhc3ksIGFycmF5LXN0eWxlLCBkYXRhIGFjY2Vzcy4KKyAgICAgICAqICBOb3RlIHRoYXQgZGF0YSBhY2Nlc3Mgd2l0aCB0aGlzIG9wZXJhdG9yIGlzIHVuY2hlY2tlZCBhbmQKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgbG9va3VwcyBhcmUgbm90IGRlZmluZWQuIChGb3IgY2hlY2tlZCBsb29rdXBzCisgICAgICAgKiAgc2VlIGF0KCkuKSAgVW5zaGFyZXMgdGhlIHN0cmluZy4KKyAgICAgICAqLworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX3BvcykKKyAgICAgIHsKKyAgICAgICAgLy8gYWxsb3cgcG9zID09IHNpemUoKSBhcyB2MyBleHRlbnNpb246CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fcG9zIDw9IHRoaXMtPnNpemUoKSk7CisgICAgICAgIC8vIGJ1dCBiZSBzdHJpY3QgaW4gcGVkYW50aWMgbW9kZToKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wb3MgPCB0aGlzLT5zaXplKCkpOworCXRoaXMtPl9NX2xlYWsoKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fcG9zXTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSAlc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24gVGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdG8gYWNjZXNzLgorICAgICAgICogIEByZXR1cm4gIFJlYWQtb25seSAoY29uc3QpIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIKKyAgICAgICAqICBpcyBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBhdChzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeworCWlmIChfX24gPj0gdGhpcy0+c2l6ZSgpKQorCSAgc3RkOjpfX3Rocm93X291dF9vZl9yYW5nZShfX04oIl9fdmVyc2Ffc3RyaW5nOjphdCIpKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fbl07CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJXN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIHRvIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBSZWFkL3dyaXRlIHJlZmVyZW5jZSB0byB0aGUgY2hhcmFjdGVyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fbiBpcyBhbiBpbnZhbGlkIGluZGV4LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGZvciBzYWZlciBkYXRhIGFjY2Vzcy4gIFRoZSBwYXJhbWV0ZXIKKyAgICAgICAqICBpcyBmaXJzdCBjaGVja2VkIHRoYXQgaXQgaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBzdHJpbmcuICBUaGUKKyAgICAgICAqICBmdW5jdGlvbiB0aHJvd3Mgb3V0X29mX3JhbmdlIGlmIHRoZSBjaGVjayBmYWlscy4gIFN1Y2Nlc3MKKyAgICAgICAqICByZXN1bHRzIGluIHVuc2hhcmluZyB0aGUgc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSB0aGlzLT5zaXplKCkpCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiX192ZXJzYV9zdHJpbmc6OmF0IikpOworCXRoaXMtPl9NX2xlYWsoKTsKKwlyZXR1cm4gdGhpcy0+X01fZGF0YSgpW19fbl07CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgUmV0dXJucyBhIHJlYWQvd3JpdGUgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZSBmaXJzdAorICAgICAgICogIGVsZW1lbnQgb2YgdGhlICVzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSgwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC93cml0ZSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgYXQgdGhlIGxhc3QKKyAgICAgICAqICBlbGVtZW50IG9mIHRoZSAlc3RyaW5nLgorICAgICAgICovCisgICAgICByZWZlcmVuY2UKKyAgICAgIGJhY2soKQorICAgICAgeyByZXR1cm4gb3BlcmF0b3JbXSh0aGlzLT5zaXplKCkgLSAxKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm5zIGEgcmVhZC1vbmx5IChjb25zdGFudCkgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGF0IHRoZQorICAgICAgICogIGxhc3QgZWxlbWVudCBvZiB0aGUgJXN0cmluZy4KKyAgICAgICAqLworICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIG9wZXJhdG9yW10odGhpcy0+c2l6ZSgpIC0gMSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBNb2RpZmllcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHN0cmluZyB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFRoZSBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX3N0cik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXBwZW5kKF9fcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIG9wZXJhdG9yKz0oX0NoYXJUIF9fYykKKyAgICAgIHsgCisJdGhpcy0+cHVzaF9iYWNrKF9fYyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGFwcGVuZGVkLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBvcGVyYXRvcis9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmFwcGVuZChfX2wuYmVnaW4oKSwgX19sLmVuZCgpKTsgfQorI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3RyaW5nIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFwcGVuZChjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiBfTV9hcHBlbmQoX19zdHIuX01fZGF0YSgpLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ciB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSBpZiBAYSBwb3MgaXMgbm90IGEgdmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYXBwZW5kcyBAYSBfX24gY2hhcmFjdGVycyBmcm9tIEBhIF9fc3RyCisgICAgICAgKiAgc3RhcnRpbmcgYXQgQGEgX19wb3MgdG8gdGhpcyBzdHJpbmcuICBJZiBAYSBfX24gaXMgaXMgbGFyZ2VyCisgICAgICAgKiAgdGhhbiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjaGFyYWN0ZXJzIGluIEBhIF9fc3RyLCB0aGUKKyAgICAgICAqICByZW1haW5kZXIgb2YgQGEgX19zdHIgaXMgYXBwZW5kZWQuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXBwZW5kKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKQorICAgICAgeyByZXR1cm4gX01fYXBwZW5kKF9fc3RyLl9NX2RhdGEoKQorCQkJICsgX19zdHIuX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6YXBwZW5kIiksCisJCQkgX19zdHIuX01fbGltaXQoX19wb3MsIF9fbikpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXBwZW5kIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19uICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworCV9NX2NoZWNrX2xlbmd0aChzaXplX3R5cGUoMCksIF9fbiwgIl9fdmVyc2Ffc3RyaW5nOjphcHBlbmQiKTsKKwlyZXR1cm4gX01fYXBwZW5kKF9fcywgX19uKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCWNvbnN0IHNpemVfdHlwZSBfX24gPSB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcyk7CisJX01fY2hlY2tfbGVuZ3RoKHNpemVfdHlwZSgwKSwgX19uLCAiX192ZXJzYV9zdHJpbmc6OmFwcGVuZCIpOworCXJldHVybiBfTV9hcHBlbmQoX19zLCBfX24pOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgVGhlIGNoYXJhY3RlciB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBBcHBlbmRzIG4gY29waWVzIG9mIGMgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXBwZW5kKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eCh0aGlzLT5zaXplKCksIHNpemVfdHlwZSgwKSwgX19uLCBfX2MpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYXBwZW5kLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhcHBlbmQoc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXBwZW5kKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBlbmQgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2ZpcnN0ICBJdGVyYXRvciByZWZlcmVuY2luZyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqICBAcGFyYW0gX19sYXN0ICBJdGVyYXRvciBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgQXBwZW5kcyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbZmlyc3QsbGFzdCkgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgICAgYXBwZW5kKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9pZW5kKCksIF9NX2llbmQoKSwgX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFwcGVuZCBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9DaGFyVCBfX2MpCisgICAgICB7IAorCWNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisJaWYgKF9fc2l6ZSArIDEgPiB0aGlzLT5jYXBhY2l0eSgpIHx8IHRoaXMtPl9NX2lzX3NoYXJlZCgpKQorCSAgdGhpcy0+X01fbXV0YXRlKF9fc2l6ZSwgc2l6ZV90eXBlKDApLCAwLCBzaXplX3R5cGUoMSkpOworCXRyYWl0c190eXBlOjphc3NpZ24odGhpcy0+X01fZGF0YSgpW19fc2l6ZV0sIF9fYyk7CisJdGhpcy0+X01fc2V0X2xlbmd0aChfX3NpemUgKyAxKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gY29udGVudHMgb2YgYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7CisJdGhpcy0+X01fYXNzaWduKF9fc3RyKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gY29udGVudHMgb2YgYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtICBfX3N0ciAgU291cmNlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhpcyBzdHJpbmcgdG8gdGhlIGV4YWN0IGNvbnRlbnRzIG9mIEBhIF9fc3RyLgorICAgICAgICogIEBhIF9fc3RyIGlzIGEgdmFsaWQsIGJ1dCB1bnNwZWNpZmllZCBzdHJpbmcuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKF9fdmVyc2Ffc3RyaW5nJiYgX19zdHIpCisgICAgICB7CisJdGhpcy0+c3dhcChfX3N0cik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGEgc3Vic3RyaW5nIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byB1c2UuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHN0ci4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgaWYgQGEgX19wb3MgaXMgbm90IGEgdmFsaWQgaW5kZXguCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGlzIHN0cmluZyB0byB0aGUgc3Vic3RyaW5nIG9mIEBhIF9fc3RyCisgICAgICAgKiAgY29uc2lzdGluZyBvZiBAYSBfX24gY2hhcmFjdGVycyBhdCBAYSBfX3Bvcy4gIElmIEBhIF9fbiBpcworICAgICAgICogIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNoYXJhY3RlcnMgaW4gQGEKKyAgICAgICAqICBfX3N0ciwgdGhlIHJlbWFpbmRlciBvZiBAYSBfX3N0ciBpcyB1c2VkLgorICAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGFzc2lnbihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX3JlcGxhY2Uoc2l6ZV90eXBlKDApLCB0aGlzLT5zaXplKCksIF9fc3RyLl9NX2RhdGEoKQorCQkJICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OmFzc2lnbiIpLAorCQkJICBfX3N0ci5fTV9saW1pdChfX3BvcywgX19uKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gdXNlLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gdGhlIGZpcnN0IEBhCisgICAgICAgKiAgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zLiAgSWYgQGEgX19uIGlzIGlzIGxhcmdlciB0aGFuIHRoZQorICAgICAgICogIG51bWJlciBvZiBhdmFpbGFibGUgY2hhcmFjdGVycyBpbiBAYSBfX3MsIHRoZSByZW1haW5kZXIgb2YKKyAgICAgICAqICBAYSBfX3MgaXMgdXNlZC4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworCXJldHVybiBfTV9yZXBsYWNlKHNpemVfdHlwZSgwKSwgdGhpcy0+c2l6ZSgpLCBfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGNvbnRlbnRzIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgVGhlIEMgc3RyaW5nIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gdGhlIHZhbHVlIG9mCisgICAgICAgKiAgQGEgX19zLiAgVGhlIGRhdGEgaXMgY29waWVkLCBzbyB0aGVyZSBpcyBubyBkZXBlbmRlbmNlIG9uIEBhCisgICAgICAgKiAgX19zIG9uY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKGNvbnN0IF9DaGFyVCogX19zKQorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gX01fcmVwbGFjZShzaXplX3R5cGUoMCksIHRoaXMtPnNpemUoKSwgX19zLAorCQkJICB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldCB2YWx1ZSB0byBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX24gIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIHVzZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBzdHJpbmcgdG8gQGEgX19uIGNvcGllcyBvZgorICAgICAgICogIGNoYXJhY3RlciBAYSBfX2MuCisgICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgYXNzaWduKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUoMCksIHRoaXMtPnNpemUoKSwgX19uLCBfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0IHZhbHVlIHRvIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19maXJzdCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgdGhlIGZpcnN0IGNoYXJhY3RlciB0byBhcHBlbmQuCisgICAgICAgKiAgQHBhcmFtIF9fbGFzdCAgSXRlcmF0b3IgbWFya2luZyB0aGUgZW5kIG9mIHRoZSByYW5nZS4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFNldHMgdmFsdWUgb2Ygc3RyaW5nIHRvIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlCisgICAgICAgKiAgW2ZpcnN0LGxhc3QpLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgICAgYXNzaWduKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfTV9pYmVnaW4oKSwgX01faWVuZCgpLCBfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXQgdmFsdWUgdG8gYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX2wgIFRoZSBpbml0aWFsaXplcl9saXN0IG9mIGNoYXJhY3RlcnMgdG8gYXNzaWduLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBhc3NpZ24oc3RkOjppbml0aWFsaXplcl9saXN0PF9DaGFyVD4gX19sKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCkpOyB9CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgbXVsdGlwbGUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydAorICAgICAgICogIEBwYXJhbSBfX2MgIFRoZSBjaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIEBhIF9fbiBjb3BpZXMgb2YgY2hhcmFjdGVyIEBhIF9fYyBzdGFydGluZyBhdCB0aGUKKyAgICAgICAqICBwb3NpdGlvbiByZWZlcmVuY2VkIGJ5IGl0ZXJhdG9yIEBhIF9fcC4gIElmIGFkZGluZworICAgICAgICogIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CXRoaXMtPnJlcGxhY2UoX19wLCBfX3AsIF9fbiwgX19jKTsgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYSByYW5nZSBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fYmVnICBTdGFydCBvZiByYW5nZS4KKyAgICAgICAqICBAcGFyYW0gX19lbmQgIEVuZCBvZiByYW5nZS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBjaGFyYWN0ZXJzIGluIHJhbmdlIFtiZWcsZW5kKS4gIElmIGFkZGluZyBjaGFyYWN0ZXJzCisgICAgICAgKiAgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIF9JbnB1dEl0ZXJhdG9yIF9fYmVnLCBfSW5wdXRJdGVyYXRvciBfX2VuZCkKKyAgICAgICAgeyB0aGlzLT5yZXBsYWNlKF9fcCwgX19wLCBfX2JlZywgX19lbmQpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnNlcnQgYW4gaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3AgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIGluIHN0cmluZyB0byBpbnNlcnQgYXQuCisgICAgICAgKiAgQHBhcmFtIF9fbCAgVGhlIGluaXRpYWxpemVyX2xpc3Qgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3AsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgdGhpcy0+aW5zZXJ0KF9fcCwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCB2YWx1ZSBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIHZhbHVlIG9mIEBhIF9fc3RyIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMS4gIElmIGFkZGluZworICAgICAgICogIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkIG1heF9zaXplKCksCisgICAgICAgKiAgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QKKyAgICAgICAqICBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgaW5zZXJ0KHNpemVfdHlwZSBfX3BvczEsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MxLCBzaXplX3R5cGUoMCksCisJCQkgICAgIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgVGhlIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMiAgU3RhcnQgb2YgY2hhcmFjdGVycyBpbiBzdHIgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MxID4gc2l6ZSgpIG9yCisgICAgICAgKiAgQGEgX19wb3MyID4gQGEgX19zdHIuc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBhdCBAYSBfX3BvczEsIGluc2VydCBAYSBfX24gY2hhcmFjdGVyIG9mIEBhIF9fc3RyCisgICAgICAgKiAgYmVnaW5uaW5nIHdpdGggQGEgX19wb3MyLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZQorICAgICAgICogIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhCisgICAgICAgKiAgX19wb3MxIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMgc3RyaW5nIG9yIEBhIF9fcG9zMiBpcworICAgICAgICogIGJleW9uZCB0aGUgZW5kIG9mIEBhIF9fc3RyLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zMSwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLAorCSAgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MxLCBzaXplX3R5cGUoMCksIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgIl9fdmVyc2Ffc3RyaW5nOjppbnNlcnQiKSwKKwkJCSAgICAgX19zdHIuX01fbGltaXQoX19wb3MyLCBfX24pKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBhIEMgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgbG9jYXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19zICBUaGUgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcG9zIGlzIGJleW9uZAorICAgICAgICogIGVuZCgpLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcKKyAgICAgICAqICBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIHNpemVfdHlwZSgwKSwgX19zLCBfX24pOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJdGVyYXRvciByZWZlcmVuY2luZyBsb2NhdGlvbiBpbiBzdHJpbmcgdG8gaW5zZXJ0IGF0LgorICAgICAgICogIEBwYXJhbSBfX3MgIFRoZSBDIHN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIEluc2VydHMgdGhlIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgSWYgYWRkaW5nIGNoYXJhY3RlcnMgY2F1c2VzIHRoZSBsZW5ndGggdG8gZXhjZWVkCisgICAgICAgKiAgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzIHRocm93bi4gIElmIEBhIF9fcG9zIGlzIGJleW9uZAorICAgICAgICogIGVuZCgpLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcKKyAgICAgICAqICBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBpbnNlcnQoc2l6ZV90eXBlIF9fcG9zLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIHNpemVfdHlwZSgwKSwgX19zLAorCQkJICAgICB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEluc2VydCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQKKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhpcworICAgICAgICogIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiAgSW5zZXJ0cyBAYSBfX24gY29waWVzIG9mIGNoYXJhY3RlciBAYSBfX2Mgc3RhcnRpbmcgYXQgaW5kZXgKKyAgICAgICAqICBAYSBfX3Bvcy4gIElmIGFkZGluZyBjaGFyYWN0ZXJzIGNhdXNlcyB0aGUgbGVuZ3RoIHRvIGV4Y2VlZAorICAgICAgICogIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBJZiBAYSBfX3BvcyA+IGxlbmd0aCgpLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIGluc2VydChzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjppbnNlcnQiKSwKKwkJCSAgICAgIHNpemVfdHlwZSgwKSwgX19uLCBfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW5zZXJ0IG9uZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fcCAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgcG9zaXRpb24gaW4gc3RyaW5nIHRvIGluc2VydCBhdC4KKyAgICAgICAqICBAcGFyYW0gX19jICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBJdGVyYXRvciByZWZlcmVuY2luZyBuZXdseSBpbnNlcnRlZCBjaGFyLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBJbnNlcnRzIGNoYXJhY3RlciBAYSBfX2MgYXQgcG9zaXRpb24gcmVmZXJlbmNlZCBieSBAYSBfX3AuCisgICAgICAgKiAgSWYgYWRkaW5nIGNoYXJhY3RlciBjYXVzZXMgdGhlIGxlbmd0aCB0byBleGNlZWQgbWF4X3NpemUoKSwKKyAgICAgICAqICBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgSWYgQGEgX19wIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0CisgICAgICAgKiAgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgX0NoYXJUIF9fYykKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX19wID49IF9NX2liZWdpbigpICYmIF9fcCA8PSBfTV9pZW5kKCkpOworCWNvbnN0IHNpemVfdHlwZSBfX3BvcyA9IF9fcCAtIF9NX2liZWdpbigpOworCV9NX3JlcGxhY2VfYXV4KF9fcG9zLCBzaXplX3R5cGUoMCksIHNpemVfdHlwZSgxKSwgX19jKTsKKwl0aGlzLT5fTV9zZXRfbGVha2VkKCk7CisJcmV0dXJuIGl0ZXJhdG9yKHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZW1vdmUgY2hhcmFjdGVycy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byByZW1vdmUgKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVtb3ZlIChkZWZhdWx0IHJlbWFpbmRlcikuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgQGEgX19uIGNoYXJhY3RlcnMgZnJvbSB0aGlzIHN0cmluZyBzdGFydGluZyBhdCBAYQorICAgICAgICogIF9fcG9zLiAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHJlZHVjZWQgYnkgQGEgX19uLiAgSWYKKyAgICAgICAqICB0aGVyZSBhcmUgPCBAYSBfX24gY2hhcmFjdGVycyB0byByZW1vdmUsIHRoZSByZW1haW5kZXIgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGlzIHRydW5jYXRlZC4gIElmIEBhIF9fcCBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywKKyAgICAgICAqICBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndAorICAgICAgICogIGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBlcmFzZShzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykKKyAgICAgIHsgCisJdGhpcy0+X01fZXJhc2UoX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6ZXJhc2UiKSwKKwkJICAgICAgIF9NX2xpbWl0KF9fcG9zLCBfX24pKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVtb3ZlIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zaXRpb24gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBjaGFyYWN0ZXIgdG8gcmVtb3ZlLgorICAgICAgICogIEByZXR1cm4gIGl0ZXJhdG9yIHJlZmVyZW5jaW5nIHNhbWUgbG9jYXRpb24gYWZ0ZXIgcmVtb3ZhbC4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVyIGF0IEBhIF9fcG9zaXRpb24gZnJvbSB0aGlzIHN0cmluZy4gVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9fcG9zaXRpb24gPj0gX01faWJlZ2luKCkKKwkJCQkgJiYgX19wb3NpdGlvbiA8IF9NX2llbmQoKSk7CisJY29uc3Qgc2l6ZV90eXBlIF9fcG9zID0gX19wb3NpdGlvbiAtIF9NX2liZWdpbigpOworCXRoaXMtPl9NX2VyYXNlKF9fcG9zLCBzaXplX3R5cGUoMSkpOworCXRoaXMtPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlbW92ZSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMuCisgICAgICAgKiAgQHBhcmFtIF9fZmlyc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVtb3ZlLgorICAgICAgICogIEBwYXJhbSBfX2xhc3QgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHRoZSBlbmQgb2YgdGhlIHJhbmdlLgorICAgICAgICogIEByZXR1cm4gIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGxvY2F0aW9uIG9mIGZpcnN0IGFmdGVyIHJlbW92YWwuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtmaXJzdCxsYXN0KSBmcm9tIHRoaXMKKyAgICAgICAqICBzdHJpbmcuICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfX2ZpcnN0ID49IF9NX2liZWdpbigpICYmIF9fZmlyc3QgPD0gX19sYXN0CisJCQkJICYmIF9fbGFzdCA8PSBfTV9pZW5kKCkpOworICAgICAgICBjb25zdCBzaXplX3R5cGUgX19wb3MgPSBfX2ZpcnN0IC0gX01faWJlZ2luKCk7CisJdGhpcy0+X01fZXJhc2UoX19wb3MsIF9fbGFzdCAtIF9fZmlyc3QpOworCXRoaXMtPl9NX3NldF9sZWFrZWQoKTsKKwlyZXR1cm4gaXRlcmF0b3IodGhpcy0+X01fZGF0YSgpICsgX19wb3MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIGZyb20gYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZXBsYWNlZC4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zIGlzIGJleW9uZCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAqICBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zK24pIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCB0aGUgdmFsdWUgb2YgQGEgX19zdHIgaXMgaW5zZXJ0ZWQuICBJZiBAYQorICAgICAgICogIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLiAgSWYKKyAgICAgICAqICB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMKKyAgICAgICAqICB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvcgorICAgICAgICogIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpCisgICAgICB7IHJldHVybiB0aGlzLT5yZXBsYWNlKF9fcG9zLCBfX24sIF9fc3RyLl9NX2RhdGEoKSwgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIGZyb20gYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MyICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3RyIHRvIHVzZS4KKyAgICAgICAqICBAcGFyYW0gX19uMiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzdHIgdG8gdXNlLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvczEgPiBzaXplKCkgb3IgQGEgX19wb3MyID4KKyAgICAgICAqICBzdHIuc2l6ZSgpLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbcG9zMSxwb3MxICsgbikgZnJvbQorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSW4gcGxhY2UsIHRoZSB2YWx1ZSBvZiBAYSBfX3N0ciBpcyBpbnNlcnRlZC4KKyAgICAgICAqICBJZiBAYSBfX3BvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICAqICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IKKyAgICAgICAqICBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbgorICAgICAgICogIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2Uoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwKKwkgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikKKyAgICAgIHsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX3BvczEsIF9fbjEsIF9fc3RyLl9NX2RhdGEoKQorCQkJICAgICArIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwKKwkJCQkJICAgICAgIl9fdmVyc2Ffc3RyaW5nOjpyZXBsYWNlIiksCisJCQkgICAgIF9fc3RyLl9NX2xpbWl0KF9fcG9zMiwgX19uMikpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIG9mIGEgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIEBhIF9fcyB0byB1c2UuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIEBhIF9fcG9zMSA+IHNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MgKyBuMSkgZnJvbSB0aGlzCisgICAgICAgKiAgc3RyaW5nLiAgSW4gcGxhY2UsIHRoZSBmaXJzdCBAYSBfX24yIGNoYXJhY3RlcnMgb2YgQGEgX19zCisgICAgICAgKiAgYXJlIGluc2VydGVkLCBvciBhbGwgb2YgQGEgX19zIGlmIEBhIF9fbjIgaXMgdG9vIGxhcmdlLiAgSWYKKyAgICAgICAqICBAYSBfX3BvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4KKyAgICAgICAqICBJZiB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcworICAgICAgICogIHRocm93bi4gIFRoZSB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yCisgICAgICAgKiAgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcywKKwkgICAgICBzaXplX3R5cGUgX19uMikKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbjIpOworCXJldHVybiBfTV9yZXBsYWNlKF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OnJlcGxhY2UiKSwKKwkJCSAgX01fbGltaXQoX19wb3MsIF9fbjEpLCBfX3MsIF9fbjIpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgY2hhcmFjdGVycyB3aXRoIHZhbHVlIG9mIGEgQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBAYSBfX3BvcyA+IHNpemUoKS4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3Bvcyxwb3MgKyBuMSkgZnJvbSB0aGlzCisgICAgICAgKiAgc3RyaW5nLiAgSW4gcGxhY2UsIHRoZSBjaGFyYWN0ZXJzIG9mIEBhIF9fcyBhcmUgaW5zZXJ0ZWQuICBJZgorICAgICAgICogIEBhIHBvcyBpcyBiZXlvbmQgZW5kIG9mIHN0cmluZywgb3V0X29mX3JhbmdlIGlzIHRocm93bi4gIElmCisgICAgICAgKiAgdGhlIGxlbmd0aCBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgCisgICAgICAgKiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IgaXMgdGhyb3duLgorICAgICAgKi8KKyAgICAgIF9fdmVyc2Ffc3RyaW5nJgorICAgICAgcmVwbGFjZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24xLCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19wb3MsIF9fbjEsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIGNoYXJhY3RlcnMgd2l0aCBtdWx0aXBsZSBjaGFyYWN0ZXJzLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fbjEgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbnNlcnQuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Om91dF9vZl9yYW5nZSAgSWYgQGEgX19wb3MgPiBzaXplKCkuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtwb3MscG9zICsgbjEpIGZyb20gdGhpcworICAgICAgICogIHN0cmluZy4gIEluIHBsYWNlLCBAYSBfX24yIGNvcGllcyBvZiBAYSBfX2MgYXJlIGluc2VydGVkLgorICAgICAgICogIElmIEBhIF9fcG9zIGlzIGJleW9uZCBlbmQgb2Ygc3RyaW5nLCBvdXRfb2ZfcmFuZ2UgaXMgdGhyb3duLgorICAgICAgICogIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0IGV4Y2VlZHMgbWF4X3NpemUoKSwgbGVuZ3RoX2Vycm9yIGlzCisgICAgICAgKiAgdGhyb3duLiAgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZG9lc24ndCBjaGFuZ2UgaWYgYW4gZXJyb3IKKyAgICAgICAqICBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIHNpemVfdHlwZSBfX24yLCBfQ2hhclQgX19jKQorICAgICAgeyByZXR1cm4gX01fcmVwbGFjZV9hdXgoX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6cmVwbGFjZSIpLAorCQkJICAgICAgX01fbGltaXQoX19wb3MsIF9fbjEpLCBfX24yLCBfX2MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB2YWx1ZSB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIHRoZQorICAgICAgICogIHZhbHVlIG9mIEBhIF9fc3RyIGlzIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQKKyAgICAgICAqICBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKQorICAgICAgeyByZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxLCBfX2kyLCBfX3N0ci5fTV9kYXRhKCksIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19pMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19pMiAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgZW5kIG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gcyB0byBpbnNlcnQuCisgICAgICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoaXMgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpsZW5ndGhfZXJyb3IgIElmIG5ldyBsZW5ndGggZXhjZWVkcyBAYyBtYXhfc2l6ZSgpLgorICAgICAgICoKKyAgICAgICAqICBSZW1vdmVzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbaTEsaTIpLiAgSW4gcGxhY2UsIHRoZQorICAgICAgICogIGZpcnN0IEBhIG4gY2hhcmFjdGVycyBvZiBAYSBfX3MgYXJlIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aAorICAgICAgICogIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUKKyAgICAgICAqICB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmVwbGFjZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHdpdGggQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHZhbHVlIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3MgYXJlIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aCBvZiByZXN1bHQKKyAgICAgICAqICBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUgdmFsdWUgb2YKKyAgICAgICAqICB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgY29uc3QgX0NoYXJUKiBfX3MpCisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEsIF9faTIsIF9fcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBtdWx0aXBsZSBjaGFyYWN0ZXJzCisgICAgICAgKiAgQHBhcmFtIF9faTEgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIHN0YXJ0IG9mIHJhbmdlIHRvIHJlcGxhY2UuCisgICAgICAgKiAgQHBhcmFtIF9faTIgIEl0ZXJhdG9yIHJlZmVyZW5jaW5nIGVuZCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLCBAYQorICAgICAgICogIF9fbiBjb3BpZXMgb2YgQGEgX19jIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGggb2YgcmVzdWx0CisgICAgICAgKiAgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlIHZhbHVlIG9mCisgICAgICAgKiAgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwlyZXR1cm4gX01fcmVwbGFjZV9hdXgoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwgX19uLCBfX2MpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlcGxhY2UgcmFuZ2Ugb2YgY2hhcmFjdGVycyB3aXRoIHJhbmdlLgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19rMSAgSXRlcmF0b3IgcmVmZXJlbmNpbmcgc3RhcnQgb2YgcmFuZ2UgdG8gaW5zZXJ0LgorICAgICAgICogIEBwYXJhbSBfX2syICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGlzIHN0cmluZy4KKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6bGVuZ3RoX2Vycm9yICBJZiBuZXcgbGVuZ3RoIGV4Y2VlZHMgQGMgbWF4X3NpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgUmVtb3ZlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW2kxLGkyKS4gIEluIHBsYWNlLAorICAgICAgICogIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtrMSxrMikgYXJlIGluc2VydGVkLiAgSWYgdGhlIGxlbmd0aAorICAgICAgICogIG9mIHJlc3VsdCBleGNlZWRzIG1heF9zaXplKCksIGxlbmd0aF9lcnJvciBpcyB0aHJvd24uICBUaGUKKyAgICAgICAqICB2YWx1ZSBvZiB0aGUgc3RyaW5nIGRvZXNuJ3QgY2hhbmdlIGlmIGFuIGVycm9yIGlzIHRocm93bi4KKyAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJX0lucHV0SXRlcmF0b3IgX19rMSwgX0lucHV0SXRlcmF0b3IgX19rMikKKyAgICAgICAgeworCSAgX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICAgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCSAgX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCSAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Ol9faXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9fdHlwZSBfSW50ZWdyYWw7CisJICByZXR1cm4gdGhpcy0+X01fcmVwbGFjZV9kaXNwYXRjaChfX2kxLCBfX2kyLCBfX2sxLCBfX2syLCBfSW50ZWdyYWwoKSk7CisJfQorCisgICAgICAvLyBTcGVjaWFsaXphdGlvbnMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBwb2ludGVyIGFuZCBpdGVyYXRvcjoKKyAgICAgIC8vIHVzZWZ1bCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgdGVtcG9yYXJ5IGJ1ZmZlcmluZyBpbiBfTV9yZXBsYWNlLgorICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9DaGFyVCogX19rMSwgX0NoYXJUKiBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEsIF9fazIgLSBfX2sxKTsKKyAgICAgIH0KKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICByZXBsYWNlKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX2sxLCBjb25zdCBfQ2hhclQqIF9fazIpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfUEVEQVNTRVJUKF9NX2liZWdpbigpIDw9IF9faTEgJiYgX19pMSA8PSBfX2kyCisJCQkJICYmIF9faTIgPD0gX01faWVuZCgpKTsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfdmFsaWRfcmFuZ2UoX19rMSwgX19rMik7CisJcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX2kyIC0gX19pMSwKKwkJCSAgICAgX19rMSwgX19rMiAtIF9fazEpOworICAgICAgfQorCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgaXRlcmF0b3IgX19rMSwgaXRlcmF0b3IgX19rMikKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX01faWJlZ2luKCkgPD0gX19pMSAmJiBfX2kxIDw9IF9faTIKKwkJCQkgJiYgX19pMiA8PSBfTV9pZW5kKCkpOworCV9fZ2xpYmN4eF9yZXF1aXJlc192YWxpZF9yYW5nZShfX2sxLCBfX2syKTsKKwlyZXR1cm4gdGhpcy0+cmVwbGFjZShfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLAorCQkJICAgICBfX2sxLmJhc2UoKSwgX19rMiAtIF9fazEpOworICAgICAgfQorCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkgICAgICBjb25zdF9pdGVyYXRvciBfX2sxLCBjb25zdF9pdGVyYXRvciBfX2syKQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVChfTV9pYmVnaW4oKSA8PSBfX2kxICYmIF9faTEgPD0gX19pMgorCQkJCSAmJiBfX2kyIDw9IF9NX2llbmQoKSk7CisJX19nbGliY3h4X3JlcXVpcmVzX3ZhbGlkX3JhbmdlKF9fazEsIF9fazIpOworCXJldHVybiB0aGlzLT5yZXBsYWNlKF9faTEgLSBfTV9pYmVnaW4oKSwgX19pMiAtIF9faTEsCisJCQkgICAgIF9fazEuYmFzZSgpLCBfX2syIC0gX19rMSk7CisgICAgICB9CisgICAgICAKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXBsYWNlIHJhbmdlIG9mIGNoYXJhY3RlcnMgd2l0aCBpbml0aWFsaXplcl9saXN0LgorICAgICAgICogIEBwYXJhbSBfX2kxICBJdGVyYXRvciByZWZlcmVuY2luZyBzdGFydCBvZiByYW5nZSB0byByZXBsYWNlLgorICAgICAgICogIEBwYXJhbSBfX2kyICBJdGVyYXRvciByZWZlcmVuY2luZyBlbmQgb2YgcmFuZ2UgdG8gcmVwbGFjZS4KKyAgICAgICAqICBAcGFyYW0gX19sICBUaGUgaW5pdGlhbGl6ZXJfbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhpcyBzdHJpbmcuCisgICAgICAgKiAgQHRocm93ICBzdGQ6Omxlbmd0aF9lcnJvciAgSWYgbmV3IGxlbmd0aCBleGNlZWRzIEBjIG1heF9zaXplKCkuCisgICAgICAgKgorICAgICAgICogIFJlbW92ZXMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFtpMSxpMikuICBJbiBwbGFjZSwKKyAgICAgICAqICBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSBbazEsazIpIGFyZSBpbnNlcnRlZC4gIElmIHRoZSBsZW5ndGgKKyAgICAgICAqICBvZiByZXN1bHQgZXhjZWVkcyBtYXhfc2l6ZSgpLCBsZW5ndGhfZXJyb3IgaXMgdGhyb3duLiAgVGhlCisgICAgICAgKiAgdmFsdWUgb2YgdGhlIHN0cmluZyBkb2Vzbid0IGNoYW5nZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcmIHJlcGxhY2UoaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwKKwkJCSAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxfQ2hhclQ+IF9fbCkKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJlcGxhY2UoX19pMSwgX19pMiwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnRlZ2VyPgorCV9fdmVyc2Ffc3RyaW5nJgorCV9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0ludGVnZXIgX19uLAorCQkJICAgIF9JbnRlZ2VyIF9fdmFsLCBzdGQ6Ol9fdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBfTV9yZXBsYWNlX2F1eChfX2kxIC0gX01faWJlZ2luKCksIF9faTIgLSBfX2kxLCBfX24sIF9fdmFsKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKwlfX3ZlcnNhX3N0cmluZyYKKwlfTV9yZXBsYWNlX2Rpc3BhdGNoKGl0ZXJhdG9yIF9faTEsIGl0ZXJhdG9yIF9faTIsIF9JbnB1dEl0ZXJhdG9yIF9fazEsCisJCQkgICAgX0lucHV0SXRlcmF0b3IgX19rMiwgc3RkOjpfX2ZhbHNlX3R5cGUpOworCisgICAgICBfX3ZlcnNhX3N0cmluZyYKKyAgICAgIF9NX3JlcGxhY2VfYXV4KHNpemVfdHlwZSBfX3BvczEsIHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMiwKKwkJICAgICBfQ2hhclQgX19jKTsKKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBfTV9yZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJCSBjb25zdCBzaXplX3R5cGUgX19sZW4yKTsKKworICAgICAgX192ZXJzYV9zdHJpbmcmCisgICAgICBfTV9hcHBlbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX24pOworCisgICAgcHVibGljOgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHkgc3Vic3RyaW5nIGludG8gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgdG8gY29weSB2YWx1ZSBpbnRvLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvcHkuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gY29weS4KKyAgICAgICAqICBAcmV0dXJuICBOdW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBjb3BpZWQKKyAgICAgICAqICBAdGhyb3cgIHN0ZDo6b3V0X29mX3JhbmdlICBJZiBwb3MgPiBzaXplKCkuCisgICAgICAgKgorICAgICAgICogIENvcGllcyB1cCB0byBAYSBfX24gY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3BvcyBpbnRvIHRoZQorICAgICAgICogIEMgc3RyaW5nIEBhIHMuICBJZiBAYSBfX3BvcyBpcyBncmVhdGVyIHRoYW4gc2l6ZSgpLAorICAgICAgICogIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTd2FwIGNvbnRlbnRzIHdpdGggYW5vdGhlciBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgU3RyaW5nIHRvIHN3YXAgd2l0aC4KKyAgICAgICAqCisgICAgICAgKiAgRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmluZyB3aXRoIHRoYXQgb2YgQGEgX19zIGluCisgICAgICAgKiAgY29uc3RhbnQgdGltZS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fdmVyc2Ffc3RyaW5nJiBfX3MpCisgICAgICB7IHRoaXMtPl9NX3N3YXAoX19zKTsgfQorCisgICAgICAvLyBTdHJpbmcgb3BlcmF0aW9uczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGNvbnN0IHBvaW50ZXIgdG8gbnVsbC10ZXJtaW5hdGVkIGNvbnRlbnRzLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGlzIGEgaGFuZGxlIHRvIGludGVybmFsIGRhdGEuICBEbyBub3QgbW9kaWZ5IG9yIGRpcmUgdGhpbmdzIG1heQorICAgICAgICogIGhhcHBlbi4KKyAgICAgICovCisgICAgICBjb25zdCBfQ2hhclQqCisgICAgICBjX3N0cigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29uc3QgcG9pbnRlciB0byBjb250ZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBpcyBhIGhhbmRsZSB0byBpbnRlcm5hbCBkYXRhLiAgRG8gbm90IG1vZGlmeSBvciBkaXJlIHRoaW5ncyBtYXkKKyAgICAgICAqICBoYXBwZW4uCisgICAgICAqLworICAgICAgY29uc3QgX0NoYXJUKgorICAgICAgZGF0YSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9kYXRhKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gY29weSBvZiBhbGxvY2F0b3IgdXNlZCB0byBjb25zdHJ1Y3QgdGhpcyBzdHJpbmcuCisgICAgICAqLworICAgICAgYWxsb2NhdG9yX3R5cGUKKyAgICAgIGdldF9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUodGhpcy0+X01fZ2V0X2FsbG9jYXRvcigpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBAYSBfX3MgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB0aGUgZmlyc3QgQGEKKyAgICAgICAqICBfX24gY2hhcmFjdGVycyBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3IgdmFsdWUgb2YgQGEKKyAgICAgICAqICBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUKKyAgICAgICAqICBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZChfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciB0aGUgdmFsdWUgb2YgQGEKKyAgICAgICAqICBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlCisgICAgICAgKiAgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeworCV9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKwlyZXR1cm4gdGhpcy0+ZmluZChfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggZnJvbSAoZGVmYXVsdCAwKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBmb3J3YXJkIGZvciBAYSBfX2Mgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmQoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2Ygc3RhcnQgb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdmFsdWUgb2YgQGEKKyAgICAgICAqICBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUKKyAgICAgICAqICBpdCBiZWdpbnMuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnJmaW5kKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gc2VhcmNoIGZvci4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciB0aGUgZmlyc3QgQGEKKyAgICAgICAqICBfX24gY2hhcmFjdGVycyBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgYmVnaW5zLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzdGFydCBzZWFyY2ggYXQgKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBzdGFydCBvZiAgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgdGhlIHZhbHVlIG9mCisgICAgICAgKiAgQGEgX19zIHdpdGhpbiB0aGlzIHN0cmluZy4gIElmIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleAorICAgICAgICogIHdoZXJlIGl0IGJlZ2lucy4gIElmIG5vdCBmb3VuZCwgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgcmZpbmQoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5yZmluZChfX3MsIF9fcG9zLCB0cmFpdHNfdHlwZTo6bGVuZ3RoKF9fcykpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBAYSBfX2Mgd2l0aGluCisgICAgICAgKiAgdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzCisgICAgICAgKiAgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIHJmaW5kKF9DaGFyVCBfX2MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2Ygc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20gKGRlZmF1bHQgMCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3Igb25lIG9mIHRoZSBjaGFyYWN0ZXJzIG9mCisgICAgICAgKiAgQGEgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X29mKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgb2YgQyBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgU3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBsb2NhdGUuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgZm9yd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZgorICAgICAgICogIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG9mIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIG9uZSBvZiB0aGUKKyAgICAgICAqICBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IDApIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2ZpcnN0X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcGFyYW0gX19jICBDaGFyYWN0ZXIgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICBAYSBfX2Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4CisgICAgICAgKiAgd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IGVxdWl2YWxlbnQgdG8gZmluZChjLCBwb3MpLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9maXJzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZChfX2MsIF9fcG9zKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGNoYXJhY3RlcnMgb2YgQGEgX19zdHIgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zCisgICAgICAgKiAgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5maW5kX2xhc3Rfb2YoX19zdHIuZGF0YSgpLCBfX3BvcywgX19zdHIuc2l6ZSgpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIHNlYXJjaCBmb3IuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3Igb25lIG9mIHRoZQorICAgICAgICogIGZpcnN0IEBhIF9fbiBjaGFyYWN0ZXJzIG9mIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZgorICAgICAgICogIGZvdW5kLCByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsCisgICAgICAgKiAgcmV0dXJucyBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZpbmQgbGFzdCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBvZiBDIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gbG9jYXRlLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBiYWNrIGZyb20gKGRlZmF1bHQgZW5kKS4KKyAgICAgICAqICBAcmV0dXJuICBJbmRleCBvZiBsYXN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGJhY2t3YXJkIGZvciBvbmUgb2YgdGhlCisgICAgICAgKiAgY2hhcmFjdGVycyBvZiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMKKyAgICAgICAqICB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2xhc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcyA9IG5wb3MpIGNvbnN0CisgICAgICB7CisJX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworCXJldHVybiB0aGlzLT5maW5kX2xhc3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGxvY2F0ZS4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgQGEgX19jIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAgKgorICAgICAgICogIE5vdGU6IGVxdWl2YWxlbnQgdG8gcmZpbmQoYywgcG9zKS4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+cmZpbmQoX19jLCBfX3Bvcyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucworICAgICAgICogIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfbm90X29mKF9fc3RyLmRhdGEoKSwgX19wb3MsIF9fc3RyLnNpemUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZyb20uCisgICAgICAgKiAgQHBhcmFtIF9fbiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBzIHRvIGNvbnNpZGVyLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3QgQGEgX19uIGNoYXJhY3RlcnMgb2YgQGEgX19zIHdpdGhpbgorICAgICAgICogIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlIGluZGV4IHdoZXJlIGl0IHdhcworICAgICAgICogIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLAorCQkJc2l6ZV90eXBlIF9fbikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGNoYXJhY3RlciBub3QgaW4gQyBzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fcyAgQyBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyIG5vdAorICAgICAgICogIGNvbnRhaW5lZCBpbiBAYSBfX3Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMKKyAgICAgICAqICB0aGUgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gMCkgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfZmlyc3Rfbm90X29mKF9fcywgX19wb3MsIHRyYWl0c190eXBlOjpsZW5ndGgoX19zKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBwb3NpdGlvbiBvZiBhIGRpZmZlcmVudCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHBhcmFtIF9fYyAgQ2hhcmFjdGVyIHRvIGF2b2lkLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgY2hhcmFjdGVyIHRvIHNlYXJjaCBmcm9tIChkZWZhdWx0IDApLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2UuCisgICAgICAgKgorICAgICAgICogIFN0YXJ0aW5nIGZyb20gQGEgX19wb3MsIHNlYXJjaGVzIGZvcndhcmQgZm9yIGEgY2hhcmFjdGVyCisgICAgICAgKiAgb3RoZXIgdGhhbiBAYSBfX2Mgd2l0aGluIHRoaXMgc3RyaW5nLiAgSWYgZm91bmQsIHJldHVybnMgdGhlCisgICAgICAgKiAgaW5kZXggd2hlcmUgaXQgd2FzIGZvdW5kLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIG5wb3MuCisgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MgPSAwKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIHN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zdHIgIFN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbSAoZGVmYXVsdCBlbmQpLgorICAgICAgICogIEByZXR1cm4gIEluZGV4IG9mIGxhc3Qgb2NjdXJyZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgU3RhcnRpbmcgZnJvbSBAYSBfX3Bvcywgc2VhcmNoZXMgYmFja3dhcmQgZm9yIGEgY2hhcmFjdGVyCisgICAgICAgKiAgbm90IGNvbnRhaW5lZCBpbiBAYSBfX3N0ciB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIsCisJCSAgICAgICBzaXplX3R5cGUgX19wb3MgPSBucG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZmluZF9sYXN0X25vdF9vZihfX3N0ci5kYXRhKCksIF9fcG9zLCBfX3N0ci5zaXplKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmluZCBsYXN0IHBvc2l0aW9uIG9mIGEgY2hhcmFjdGVyIG5vdCBpbiBDIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19zICBDIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gYXZvaWQuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zICBJbmRleCBvZiBjaGFyYWN0ZXIgdG8gc2VhcmNoIGJhY2sgZnJvbS4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHMgdG8gY29uc2lkZXIuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBub3QgY29udGFpbmVkIGluIHRoZSBmaXJzdCBAYSBfX24gY2hhcmFjdGVycyBvZiBAYSBfX3MKKyAgICAgICAqICB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgaXQKKyAgICAgICAqICB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3BvcywKKwkJICAgICAgIHNpemVfdHlwZSBfX24pIGNvbnN0OworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBjaGFyYWN0ZXIgbm90IGluIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBub3QgY29udGFpbmVkIGluIEBhIF9fcyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwKKyAgICAgICAqICByZXR1cm5zIHRoZSBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMKKyAgICAgICAqICBucG9zLgorICAgICAgKi8KKyAgICAgIHNpemVfdHlwZQorICAgICAgZmluZF9sYXN0X25vdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcyk7CisJcmV0dXJuIHRoaXMtPmZpbmRfbGFzdF9ub3Rfb2YoX19zLCBfX3BvcywgdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBGaW5kIGxhc3QgcG9zaXRpb24gb2YgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSBfX2MgIENoYXJhY3RlciB0byBhdm9pZC4KKyAgICAgICAqICBAcGFyYW0gX19wb3MgIEluZGV4IG9mIGNoYXJhY3RlciB0byBzZWFyY2ggYmFjayBmcm9tIChkZWZhdWx0IGVuZCkuCisgICAgICAgKiAgQHJldHVybiAgSW5kZXggb2YgbGFzdCBvY2N1cnJlbmNlLgorICAgICAgICoKKyAgICAgICAqICBTdGFydGluZyBmcm9tIEBhIF9fcG9zLCBzZWFyY2hlcyBiYWNrd2FyZCBmb3IgYSBjaGFyYWN0ZXIKKyAgICAgICAqICBvdGhlciB0aGFuIEBhIF9fYyB3aXRoaW4gdGhpcyBzdHJpbmcuICBJZiBmb3VuZCwgcmV0dXJucyB0aGUKKyAgICAgICAqICBpbmRleCB3aGVyZSBpdCB3YXMgZm91bmQuICBJZiBub3QgZm91bmQsIHJldHVybnMgbnBvcy4KKyAgICAgICovCisgICAgICBzaXplX3R5cGUKKyAgICAgIGZpbmRfbGFzdF9ub3Rfb2YoX0NoYXJUIF9fYywgc2l6ZV90eXBlIF9fcG9zID0gbnBvcykgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0IGEgc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIChkZWZhdWx0IDApLgorICAgICAgICogIEBwYXJhbSBfX24gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN1YnN0cmluZyAoZGVmYXVsdCByZW1haW5kZXIpLgorICAgICAgICogIEByZXR1cm4gIFRoZSBuZXcgc3RyaW5nLgorICAgICAgICogIEB0aHJvdyAgc3RkOjpvdXRfb2ZfcmFuZ2UgIElmIHBvcyA+IHNpemUoKS4KKyAgICAgICAqCisgICAgICAgKiAgQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIHVzaW5nIHRoZSBAYSBfX24KKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgSWYgdGhlIHN0cmluZyBpcyB0b28KKyAgICAgICAqICBzaG9ydCwgdXNlIHRoZSByZW1haW5kZXIgb2YgdGhlIGNoYXJhY3RlcnMuICBJZiBAYSBfX3BvcyBpcworICAgICAgICogIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIG91dF9vZl9yYW5nZSBpcyB0aHJvd24uCisgICAgICAqLworICAgICAgX192ZXJzYV9zdHJpbmcKKyAgICAgIHN1YnN0cihzaXplX3R5cGUgX19wb3MgPSAwLCBzaXplX3R5cGUgX19uID0gbnBvcykgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX192ZXJzYV9zdHJpbmcoKnRoaXMsIF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OnN1YnN0ciIpLAorCQkJICAgICAgX19uKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHRvIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhCisgICAgICAgKiAgX19zdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBvciA+IDAgaWYgdGhpcworICAgICAgICogIHN0cmluZyBpcyBvcmRlcmVkIGFmdGVyIEBhIF9fc3RyLiAgRGV0ZXJtaW5lcyB0aGUgZWZmZWN0aXZlCisgICAgICAgKiAgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MgdG8gY29tcGFyZSBhcyB0aGUgc21hbGxlc3Qgb2YKKyAgICAgICAqICBzaXplKCkgYW5kIHN0ci5zaXplKCkuICBUaGUgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvCisgICAgICAgKiAgc3RyaW5ncyBieSBjYWxsaW5nIHRyYWl0czo6Y29tcGFyZShkYXRhKCksIHN0ci5kYXRhKCkscmxlbikuCisgICAgICAgKiAgSWYgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsCisgICAgICAgKiAgb3RoZXJ3aXNlIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShjb25zdCBfX3ZlcnNhX3N0cmluZyYgX19zdHIpIGNvbnN0CisgICAgICB7CisJaWYgKHRoaXMtPl9NX2NvbXBhcmUoX19zdHIpKQorCSAgcmV0dXJuIDA7CisKKwljb25zdCBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworCWNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gX19zdHIuc2l6ZSgpOworCWNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fc2l6ZSwgX19vc2l6ZSk7CisKKwlpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUodGhpcy0+X01fZGF0YSgpLCBfX3N0ci5kYXRhKCksIF9fbGVuKTsKKwlpZiAoIV9fcikKKwkgIF9fciA9IHRoaXMtPl9TX2NvbXBhcmUoX19zaXplLCBfX29zaXplKTsKKwlyZXR1cm4gX19yOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIHRvIGEgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBfX24gY2hhcmFjdGVycworICAgICAgICogIHN0YXJ0aW5nIGF0IEBhIF9fcG9zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMCBpZiB0aGUKKyAgICAgICAqICBzdWJzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUgQGEgX19zdHIsIDAgaWYgdGhlaXIgdmFsdWVzIGFyZQorICAgICAgICogIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGUgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIgQGEKKyAgICAgICAqICBfX3N0ci4gIERldGVybWluZXMgdGhlIGVmZmVjdGl2ZSBsZW5ndGggcmxlbiBvZiB0aGUgc3RyaW5ncworICAgICAgICogIHRvIGNvbXBhcmUgYXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZworICAgICAgICogIGFuZCBAYSBfX3N0ci5zaXplKCkuICBUaGUgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvCisgICAgICAgKiAgc3RyaW5ncyBieSBjYWxsaW5nCisgICAgICAgKiAgdHJhaXRzOjpjb21wYXJlKHN1YnN0cmluZy5kYXRhKCksc3RyLmRhdGEoKSxybGVuKS4gIElmIHRoZQorICAgICAgICogIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyBub256ZXJvIHJldHVybnMgaXQsIG90aGVyd2lzZQorICAgICAgICogIHRoZSBzaG9ydGVyIG9uZSBpcyBvcmRlcmVkIGZpcnN0LgorICAgICAgKi8KKyAgICAgIGludAorICAgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmcmIF9fc3RyKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHN1YnN0cmluZyB0byBhIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19wb3MxICBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgb2Ygc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX24xICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcuCisgICAgICAgKiAgQHBhcmFtIF9fc3RyICBTdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICogIEBwYXJhbSBfX3BvczIgIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBvZiBzdWJzdHJpbmcgb2Ygc3RyLgorICAgICAgICogIEBwYXJhbSBfX24yICBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiBzdWJzdHJpbmcgb2Ygc3RyLgorICAgICAgICogIEByZXR1cm4gIEludGVnZXIgPCAwLCAwLCBvciA+IDAuCisgICAgICAgKgorICAgICAgICogIEZvcm0gdGhlIHN1YnN0cmluZyBvZiB0aGlzIHN0cmluZyBmcm9tIHRoZSBAYSBfX24xCisgICAgICAgKiAgY2hhcmFjdGVycyBzdGFydGluZyBhdCBAYSBfX3BvczEuICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgQGEKKyAgICAgICAqICBfX3N0ciBmcm9tIHRoZSBAYSBfX24yIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MyLgorICAgICAgICogIFJldHVybnMgYW4gaW50ZWdlciA8IDAgaWYgdGhpcyBzdWJzdHJpbmcgaXMgb3JkZXJlZCBiZWZvcmUKKyAgICAgICAqICB0aGUgc3Vic3RyaW5nIG9mIEBhIF9fc3RyLCAwIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwKKyAgICAgICAqICBvciA+IDAgaWYgdGhpcyBzdWJzdHJpbmcgaXMgb3JkZXJlZCBhZnRlciB0aGUgc3Vic3RyaW5nIG9mCisgICAgICAgKiAgQGEgX19zdHIuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoIHJsZW4gb2YgdGhlCisgICAgICAgKiAgc3RyaW5ncyB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RocyBvZiB0aGUKKyAgICAgICAqICBzdWJzdHJpbmdzLiAgVGhlIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmdzIGJ5CisgICAgICAgKiAgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShzdWJzdHJpbmcuZGF0YSgpLHN0ci5zdWJzdHIocG9zMixuMikuZGF0YSgpLHJsZW4pLgorICAgICAgICogIElmIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LAorICAgICAgICogIG90aGVyd2lzZSB0aGUgc2hvcnRlciBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwKKwkgICAgICBzaXplX3R5cGUgX19wb3MyLCBzaXplX3R5cGUgX19uMikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29tcGFyZSB0byBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmIHRoaXMgc3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIEBhCisgICAgICAgKiAgX19zLCAwIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgb3IgPiAwIGlmIHRoaXMgc3RyaW5nCisgICAgICAgKiAgaXMgb3JkZXJlZCBhZnRlciBAYSBfX3MuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoCisgICAgICAgKiAgcmxlbiBvZiB0aGUgc3RyaW5ncyB0byBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiBzaXplKCkgYW5kCisgICAgICAgKiAgdGhlIGxlbmd0aCBvZiBhIHN0cmluZyBjb25zdHJ1Y3RlZCBmcm9tIEBhIF9fcy4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmdzIGJ5IGNhbGxpbmcKKyAgICAgICAqICB0cmFpdHM6OmNvbXBhcmUoZGF0YSgpLHMscmxlbikuICBJZiB0aGUgcmVzdWx0IG9mIHRoZQorICAgICAgICogIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UgdGhlIHNob3J0ZXIgb25lCisgICAgICAgKiAgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0OworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA1IFN0cmluZzo6Y29tcGFyZSBzcGVjaWZpY2F0aW9uIHF1ZXN0aW9uYWJsZQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb21wYXJlIHN1YnN0cmluZyB0byBhIEMgc3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3BvcyAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIEMgc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAqICBAcmV0dXJuICBJbnRlZ2VyIDwgMCwgMCwgb3IgPiAwLgorICAgICAgICoKKyAgICAgICAqICBGb3JtIHRoZSBzdWJzdHJpbmcgb2YgdGhpcyBzdHJpbmcgZnJvbSB0aGUgQGEgX19uMQorICAgICAgICogIGNoYXJhY3RlcnMgc3RhcnRpbmcgYXQgQGEgX19wb3MuICBSZXR1cm5zIGFuIGludGVnZXIgPCAwIGlmCisgICAgICAgKiAgdGhlIHN1YnN0cmluZyBpcyBvcmRlcmVkIGJlZm9yZSBAYSBfX3MsIDAgaWYgdGhlaXIgdmFsdWVzCisgICAgICAgKiAgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGUgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYWZ0ZXIgQGEKKyAgICAgICAqICBfX3MuICBEZXRlcm1pbmVzIHRoZSBlZmZlY3RpdmUgbGVuZ3RoIHJsZW4gb2YgdGhlIHN0cmluZ3MgdG8KKyAgICAgICAqICBjb21wYXJlIGFzIHRoZSBzbWFsbGVzdCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgYW5kCisgICAgICAgKiAgdGhlIGxlbmd0aCBvZiBhIHN0cmluZyBjb25zdHJ1Y3RlZCBmcm9tIEBhIF9fcy4gIFRoZQorICAgICAgICogIGZ1bmN0aW9uIHRoZW4gY29tcGFyZXMgdGhlIHR3byBzdHJpbmcgYnkgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShzdWJzdHJpbmcuZGF0YSgpLHMscmxlbikuICBJZiB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UgdGhlIHNob3J0ZXIKKyAgICAgICAqICBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbXBhcmUgc3Vic3RyaW5nIGFnYWluc3QgYSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICAgKiAgQHBhcmFtIF9fcG9zMSAgSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIG9mIHN1YnN0cmluZy4KKyAgICAgICAqICBAcGFyYW0gX19uMSAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3Vic3RyaW5nLgorICAgICAgICogIEBwYXJhbSBfX3MgIGNoYXJhY3RlciBhcnJheSB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgKiAgQHBhcmFtIF9fbjIgIE51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHMuCisgICAgICAgKiAgQHJldHVybiAgSW50ZWdlciA8IDAsIDAsIG9yID4gMC4KKyAgICAgICAqCisgICAgICAgKiAgRm9ybSB0aGUgc3Vic3RyaW5nIG9mIHRoaXMgc3RyaW5nIGZyb20gdGhlIEBhIF9fbjEKKyAgICAgICAqICBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IEBhIF9fcG9zMS4gIEZvcm0gYSBzdHJpbmcgZnJvbSB0aGUKKyAgICAgICAqICBmaXJzdCBAYSBfX24yIGNoYXJhY3RlcnMgb2YgQGEgX19zLiAgUmV0dXJucyBhbiBpbnRlZ2VyIDwgMAorICAgICAgICogIGlmIHRoaXMgc3Vic3RyaW5nIGlzIG9yZGVyZWQgYmVmb3JlIHRoZSBzdHJpbmcgZnJvbSBAYSBfX3MsCisgICAgICAgKiAgMCBpZiB0aGVpciB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIG9yID4gMCBpZiB0aGlzIHN1YnN0cmluZworICAgICAgICogIGlzIG9yZGVyZWQgYWZ0ZXIgdGhlIHN0cmluZyBmcm9tIEBhIF9fcy4gIERldGVybWluZXMgdGhlCisgICAgICAgKiAgZWZmZWN0aXZlIGxlbmd0aCBybGVuIG9mIHRoZSBzdHJpbmdzIHRvIGNvbXBhcmUgYXMgdGhlCisgICAgICAgKiAgc21hbGxlc3Qgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGFuZCBAYSBfX24yLiAgVGhlCisgICAgICAgKiAgZnVuY3Rpb24gdGhlbiBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3MgYnkgY2FsbGluZworICAgICAgICogIHRyYWl0czo6Y29tcGFyZShzdWJzdHJpbmcuZGF0YSgpLHMscmxlbikuICBJZiB0aGUgcmVzdWx0IG9mCisgICAgICAgKiAgdGhlIGNvbXBhcmlzb24gaXMgbm9uemVybyByZXR1cm5zIGl0LCBvdGhlcndpc2UgdGhlIHNob3J0ZXIKKyAgICAgICAqICBvbmUgaXMgb3JkZXJlZCBmaXJzdC4KKyAgICAgICAqCisgICAgICAgKiAgTkI6IHMgbXVzdCBoYXZlIGF0IGxlYXN0IG4yIGNoYXJhY3RlcnMsIDxlbT5cXDA8L2VtPiBoYXMgbm8gc3BlY2lhbAorICAgICAgICogIG1lYW5pbmcuCisgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zLAorCSAgICAgIHNpemVfdHlwZSBfX24yKSBjb25zdDsKKyAgICB9OworCisgIC8vIG9wZXJhdG9yKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggdmFsdWUgb2YgQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3Jocyk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggdmFsdWUgb2YgQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uY2F0ZW5hdGUgY2hhcmFjdGVyIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgTGFzdCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBOZXcgc3RyaW5nIHdpdGggQGEgX19saHMgZm9sbG93ZWQgYnkgQGEgX19yaHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDb25jYXRlbmF0ZSBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3Jocyk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbmNhdGVuYXRlIHN0cmluZyBhbmQgY2hhcmFjdGVyLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIExhc3Qgc3RyaW5nLgorICAgKiAgQHJldHVybiAgTmV3IHN0cmluZyB3aXRoIEBhIF9fbGhzIGZvbGxvd2VkIGJ5IEBhIF9fcmhzLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgX0NoYXJUIF9fcmhzKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gc3RkOjptb3ZlKF9fbGhzLmFwcGVuZChfX3JocykpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mJiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fbGhzLAorCSAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mJiBfX3JocykKKyAgICB7CisgICAgICBjb25zdCBhdXRvIF9fc2l6ZSA9IF9fbGhzLnNpemUoKSArIF9fcmhzLnNpemUoKTsKKyAgICAgIGNvbnN0IGJvb2wgX19jb25kID0gKF9fc2l6ZSA+IF9fbGhzLmNhcGFjaXR5KCkKKwkJCSAgICYmIF9fc2l6ZSA8PSBfX3Jocy5jYXBhY2l0eSgpKTsKKyAgICAgIHJldHVybiBfX2NvbmQgPyBzdGQ6Om1vdmUoX19yaHMuaW5zZXJ0KDAsIF9fbGhzKSkKKwkgICAgICAgICAgICA6IHN0ZDo6bW92ZShfX2xocy5hcHBlbmQoX19yaHMpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+CisgICAgb3BlcmF0b3IrKGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fcmhzKQorICAgIHsgcmV0dXJuIHN0ZDo6bW92ZShfX3Jocy5pbnNlcnQoMCwgMSwgX19saHMpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKF9fcmhzKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYmIF9fbGhzLAorCSAgICAgIF9DaGFyVCBfX3JocykKKyAgICB7IHJldHVybiBzdGQ6Om1vdmUoX19saHMuYXBwZW5kKDEsIF9fcmhzKSk7IH0KKyNlbmRpZgorCisgIC8vIG9wZXJhdG9yID09CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIHR3byBzdHJpbmdzLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzLmNvbXBhcmUoQGEgX19yaHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19lbmFibGVfaWY8c3RkOjpfX2lzX2NoYXI8X0NoYXJUPjo6X192YWx1ZSwgYm9vbD46Ol9fdHlwZQorICAgIG9wZXJhdG9yPT0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBzdGQ6OmNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4sIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+LCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIChfX2xocy5zaXplKCkgPT0gX19yaHMuc2l6ZSgpCisJICAgICAgJiYgIXN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPjo6Y29tcGFyZShfX2xocy5kYXRhKCksIF9fcmhzLmRhdGEoKSwKKwkJCQkJCSAgICBfX2xocy5zaXplKCkpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGVxdWl2YWxlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fcmhzLmNvbXBhcmUoQGEgX19saHMpID09IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID09IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBlcXVpdmFsZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSA9PSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA9PSAwOyB9CisKKyAgLy8gb3BlcmF0b3IgIT0KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiB0d28gc3RyaW5ncy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBkaWZmZXJlbmNlIG9mIEMgc3RyaW5nIGFuZCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fcmhzLmNvbXBhcmUoQGEgX19saHMpICE9IDAuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgZGlmZmVyZW5jZSBvZiBzdHJpbmcgYW5kIEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocy5jb21wYXJlKEBhIF9fcmhzKSAhPSAwLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIC8vIG9wZXJhdG9yIDwKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIHByZWNlZGVzIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgcHJlY2VkZXMgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIHByZWNlZGVzIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgcHJlY2VkZXMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBwcmVjZWRlcyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID4gMDsgfQorCisgIC8vIG9wZXJhdG9yID4KKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3Mgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBGaXJzdCBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFNlY29uZCBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGZvbGxvd3MgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPiAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGZvbGxvd3MgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIFN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgQyBzdHJpbmcuCisgICAqICBAcmV0dXJuICBUcnVlIGlmIEBhIF9fbGhzIGZvbGxvd3MgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+IDA7IH0KKworICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBDIHN0cmluZyBmb2xsb3dzIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZm9sbG93cyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpIDwgMDsgfQorCisgIC8vIG9wZXJhdG9yIDw9CisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIHN0cmluZyBkb2Vzbid0IGZvbGxvdyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBmb2xsb3cgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IEMgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fbGhzICBTdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIEMgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IGZvbGxvdyBAYSBfX3Jocy4gIEZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9DaGFyVCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPD0gMDsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBUZXN0IGlmIEMgc3RyaW5nIGRvZXNuJ3QgZm9sbG93IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBmb2xsb3cgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9DaGFyVCogX19saHMsCisJICAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fcmhzLmNvbXBhcmUoX19saHMpID49IDA7IH0KKworICAvLyBvcGVyYXRvciA+PQorICAvKioKKyAgICogIEBicmllZiAgVGVzdCBpZiBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgRmlyc3Qgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBTZWNvbmQgc3RyaW5nLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiBAYSBfX2xocyBkb2Vzbid0IHByZWNlZGUgQGEgX19yaHMuICBGYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgc3RyaW5nIGRvZXNuJ3QgcHJlY2VkZSBDIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgU3RyaW5nLgorICAgKiAgQHBhcmFtIF9fcmhzICBDIHN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRlc3QgaWYgQyBzdHJpbmcgZG9lc24ndCBwcmVjZWRlIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2xocyAgQyBzdHJpbmcuCisgICAqICBAcGFyYW0gX19yaHMgIFN0cmluZy4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgQGEgX19saHMgZG9lc24ndCBwcmVjZWRlIEBhIF9fcmhzLiAgRmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgICBjb25zdCBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX3Jocy5jb21wYXJlKF9fbGhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN3YXAgY29udGVudHMgb2YgdHdvIHN0cmluZ3MuCisgICAqICBAcGFyYW0gX19saHMgIEZpcnN0IHN0cmluZy4KKyAgICogIEBwYXJhbSBfX3JocyAgU2Vjb25kIHN0cmluZy4KKyAgICoKKyAgICogIEV4Y2hhbmdlcyB0aGUgY29udGVudHMgb2YgQGEgX19saHMgYW5kIEBhIF9fcmhzIGluIGNvbnN0YW50IHRpbWUuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fbGhzLAorCSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19pcyBpbnRvIEBhIF9fc3RyIHVudGlsIHdoaXRlc3BhY2UgaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBfX2dudV9jeHg6Ol9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2MsIF9CYXNlPiYgX19zdHIpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBzdHJpbmcgdG8gYSBzdHJlYW0uCisgICAqICBAcGFyYW0gX19vcyAgT3V0cHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgU3RyaW5nIHRvIHdyaXRlIG91dC4KKyAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogIE91dHB1dCBjaGFyYWN0ZXJzIG9mIEBhIF9fc3RyIGludG8gb3MgZm9sbG93aW5nIHRoZSBzYW1lIHJ1bGVzIGFzIGZvcgorICAgKiAgd3JpdGluZyBhIEMgc3RyaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisJICAgICAgIF9CYXNlPiYgX19zdHIpCisgICAgeworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNTg2LiBzdHJpbmcgaW5zZXJ0ZXIgbm90IGEgZm9ybWF0dGVkIGZ1bmN0aW9uCisgICAgICByZXR1cm4gX19vc3RyZWFtX2luc2VydChfX29zLCBfX3N0ci5kYXRhKCksIF9fc3RyLnNpemUoKSk7CisgICAgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBSZWFkIGEgbGluZSBmcm9tIHN0cmVhbSBpbnRvIGEgc3RyaW5nLgorICAgKiAgQHBhcmFtIF9faXMgIElucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSBfX3N0ciAgQnVmZmVyIHRvIHN0b3JlIGludG8uCisgICAqICBAcGFyYW0gX19kZWxpbSAgQ2hhcmFjdGVyIG1hcmtpbmcgZW5kIG9mIGxpbmUuCisgICAqICBAcmV0dXJuICBSZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gQGEgX19pcyBpbnRvIEBhIF9fc3RyIHVudGlsIEBhIF9fZGVsaW0gaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4gIElmIEBhIGRlbGltIHdhcyBlbmNvdW50ZXJlZCwKKyAgICogIGl0IGlzIGV4dHJhY3RlZCBidXQgbm90IHN0b3JlZCBpbnRvIEBhIF9fc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19zdHIsCisJICAgIF9DaGFyVCBfX2RlbGltKTsKKworICAvKioKKyAgICogIEBicmllZiAgUmVhZCBhIGxpbmUgZnJvbSBzdHJlYW0gaW50byBhIHN0cmluZy4KKyAgICogIEBwYXJhbSBfX2lzICBJbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gX19zdHIgIEJ1ZmZlciB0byBzdG9yZSBpbnRvLgorICAgKiAgQHJldHVybiAgUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICBTdG9yZXMgY2hhcmFjdGVycyBmcm9tIGlzIGludG8gQGEgX19zdHIgdW50aWwgJmFwb3M7XG4mYXBvczsgaXMKKyAgICogIGZvdW5kLCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgZW5jb3VudGVyZWQsIG9yIHN0ci5tYXhfc2l6ZSgpCisgICAqICBpcyByZWFjaGVkLiAgSWYgaXMud2lkdGgoKSBpcyBub24temVybywgdGhhdCBpcyB0aGUgbGltaXQgb24gdGhlCisgICAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBzdG9yZWQgaW50byBAYSBfX3N0ci4gIEFueSBwcmV2aW91cworICAgKiAgY29udGVudHMgb2YgQGEgX19zdHIgYXJlIGVyYXNlZC4gIElmIGVuZCBvZiBsaW5lIHdhcworICAgKiAgZW5jb3VudGVyZWQsIGl0IGlzIGV4dHJhY3RlZCBidXQgbm90IHN0b3JlZCBpbnRvIEBhIF9fc3RyLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIGdldGxpbmUoYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICBfX2dudV9jeHg6Ol9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fc3RyKQorICAgIHsgcmV0dXJuIGdldGxpbmUoX19pcywgX19zdHIsIF9faXMud2lkZW4oJ1xuJykpOyB9ICAgICAgCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmIChkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTkpKQorCisjaW5jbHVkZSA8ZXh0L3N0cmluZ19jb252ZXJzaW9ucy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gMjEuNCBOdW1lcmljIENvbnZlcnNpb25zIFtzdHJpbmcuY29udmVyc2lvbnNdLgorICBpbmxpbmUgaW50CisgIHN0b2koY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYTxsb25nLCBpbnQ+KCZzdGQ6OnN0cnRvbCwgInN0b2kiLCBfX3N0ci5jX3N0cigpLAorCQkJCQlfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nCisgIHN0b2woY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2wsICJzdG9sIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBzdG91bChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwLCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvdWwsICJzdG91bCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBzdG9sbChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwLAlpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbGwsICJzdG9sbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworICBzdG91bGwoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4LCBpbnQgX19iYXNlID0gMTApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvdWxsLCAic3RvdWxsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICAvLyBOQjogc3RydG9mIHZzIHN0cnRvZC4KKyAgaW5saW5lIGZsb2F0CisgIHN0b2YoY29uc3QgX192c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6c3RydG9mLCAic3RvZiIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIGlubGluZSBkb3VibGUKKyAgc3RvZChjb25zdCBfX3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjpzdHJ0b2QsICJzdG9kIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHN0b2xkKGNvbnN0IF9fdnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDApCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X19zdG9hKCZzdGQ6OnN0cnRvbGQsICJzdG9sZCIsIF9fc3RyLmNfc3RyKCksIF9faWR4KTsgfQorCisgIC8vIE5COiAodilzbnByaW50ZiB2cyBzcHJpbnRmLgorCisgIC8vIERSIDEyNjEuCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKGludCBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsIDQgKiBzaXplb2YoaW50KSwKKwkJCQkJICAgICAgIiVkIiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcodW5zaWduZWQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLAorCQkJCQkgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkJICAgICAgIiV1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcobG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgICAgIDQgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICAgICIlbGQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyh1bnNpZ25lZCBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgICAgIiVsdSIsIF9fdmFsKTsgfQorCisKKyAgaW5saW5lIF9fdnN0cmluZworICB0b19zdHJpbmcobG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwKKwkJCQkJICAgICAgNCAqIHNpemVvZihsb25nIGxvbmcpLAorCQkJCQkgICAgICAiJWxsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKHVuc2lnbmVkIGxvbmcgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X192c3RyaW5nPigmc3RkOjp2c25wcmludGYsCisJCQkJCSAgICAgIDQgKiBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwKKwkJCQkJICAgICAgIiVsbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyhmbG9hdCBfX3ZhbCkKKyAgeworICAgIGNvbnN0IGludCBfX24gPSBfX251bWVyaWNfdHJhaXRzPGZsb2F0Pjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3ZzdHJpbmc+KCZzdGQ6OnZzbnByaW50ZiwgX19uLAorCQkJCQkgICAgICAiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgX192c3RyaW5nCisgIHRvX3N0cmluZyhkb3VibGUgX192YWwpCisgIHsKKyAgICBjb25zdCBpbnQgX19uID0gX19udW1lcmljX3RyYWl0czxkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICAgICIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSBfX3ZzdHJpbmcKKyAgdG9fc3RyaW5nKGxvbmcgZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fdnN0cmluZz4oJnN0ZDo6dnNucHJpbnRmLCBfX24sCisJCQkJCSAgICAgICIlTGYiLCBfX3ZhbCk7CisgIH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGlubGluZSBpbnQgCisgIHN0b2koY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2E8bG9uZywgaW50Pigmc3RkOjp3Y3N0b2wsICJzdG9pIiwgX19zdHIuY19zdHIoKSwKKwkJCQkJX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgbG9uZyAKKyAgc3RvbChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2wsICJzdG9sIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZworICBzdG91bChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b3VsLCAic3RvdWwiLCBfX3N0ci5jX3N0cigpLAorCQkJICAgICBfX2lkeCwgX19iYXNlKTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgc3RvbGwoY29uc3QgX193dnN0cmluZyYgX19zdHIsIHN0ZDo6c2l6ZV90KiBfX2lkeCA9IDAsIGludCBfX2Jhc2UgPSAxMCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3N0b2EoJnN0ZDo6d2NzdG9sbCwgInN0b2xsIiwgX19zdHIuY19zdHIoKSwKKwkJCSAgICAgX19pZHgsIF9fYmFzZSk7IH0KKworICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCisgIHN0b3VsbChjb25zdCBfX3d2c3RyaW5nJiBfX3N0ciwgc3RkOjpzaXplX3QqIF9faWR4ID0gMCwgaW50IF9fYmFzZSA9IDEwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b3VsbCwgInN0b3VsbCIsIF9fc3RyLmNfc3RyKCksCisJCQkgICAgIF9faWR4LCBfX2Jhc2UpOyB9CisKKyAgLy8gTkI6IHdjc3RvZiB2cyB3Y3N0b2QuCisgIGlubGluZSBmbG9hdAorICBzdG9mKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2YsICJzdG9mIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGRvdWJsZQorICBzdG9kKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2QsICJzdG9kIiwgX19zdHIuY19zdHIoKSwgX19pZHgpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHN0b2xkKGNvbnN0IF9fd3ZzdHJpbmcmIF9fc3RyLCBzdGQ6OnNpemVfdCogX19pZHggPSAwKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fc3RvYSgmc3RkOjp3Y3N0b2xkLCAic3RvbGQiLCBfX3N0ci5jX3N0cigpLCBfX2lkeCk7IH0KKworI2lmbmRlZiBfR0xJQkNYWF9IQVZFX0JST0tFTl9WU1dQUklOVEYKKyAgLy8gRFIgMTI2MS4KKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhpbnQgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YoaW50KSwKKwkJCQkJICAgICAgIEwiJWQiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKHVuc2lnbmVkIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkJICAgICAgIEwiJXUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICAgICBMIiVsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyBfX3ZhbCkKKyAgeyByZXR1cm4gX19nbnVfY3h4OjpfX3RvX3hzdHJpbmc8X193dnN0cmluZz4oJnN0ZDo6dnN3cHJpbnRmLAorCQkJCQkgICAgICAgNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkJICAgICAgIEwiJWx1IiwgX192YWwpOyB9CisKKyAgaW5saW5lIF9fd3ZzdHJpbmcKKyAgdG9fd3N0cmluZyhsb25nIGxvbmcgX192YWwpCisgIHsgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwKKwkJCQkJICAgICAgIDQgKiBzaXplb2YobG9uZyBsb25nKSwKKwkJCQkJICAgICAgIEwiJWxsZCIsIF9fdmFsKTsgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorICB7IHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsCisJCQkJCSAgICAgICA0ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCisJCQkJCSAgICAgICBMIiVsbHUiLCBfX3ZhbCk7IH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGZsb2F0IF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8ZmxvYXQ+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgICAgTCIlZiIsIF9fdmFsKTsKKyAgfQorCisgIGlubGluZSBfX3d2c3RyaW5nCisgIHRvX3dzdHJpbmcoZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZXhwb25lbnQxMCArIDIwOworICAgIHJldHVybiBfX2dudV9jeHg6Ol9fdG9feHN0cmluZzxfX3d2c3RyaW5nPigmc3RkOjp2c3dwcmludGYsIF9fbiwKKwkJCQkJICAgICAgIEwiJWYiLCBfX3ZhbCk7CisgIH0KKworICBpbmxpbmUgX193dnN0cmluZworICB0b193c3RyaW5nKGxvbmcgZG91YmxlIF9fdmFsKQorICB7CisgICAgY29uc3QgaW50IF9fbiA9IF9fbnVtZXJpY190cmFpdHM8bG9uZyBkb3VibGU+OjpfX21heF9leHBvbmVudDEwICsgMjA7CisgICAgcmV0dXJuIF9fZ251X2N4eDo6X190b194c3RyaW5nPF9fd3ZzdHJpbmc+KCZzdGQ6OnZzd3ByaW50ZiwgX19uLAorCQkJCQkgICAgICAgTCIlTGYiLCBfX3ZhbCk7CisgIH0KKyNlbmRpZgorI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIF9fdnN0cmluZy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPF9fZ251X2N4eDo6X192c3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19nbnVfY3h4OjpfX3ZzdHJpbmc+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fZ251X2N4eDo6X192c3RyaW5nJiBfX3MpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBzdGQ6Ol9IYXNoX2ltcGw6Omhhc2goX19zLmRhdGEoKSwgX19zLmxlbmd0aCgpKTsgfQorICAgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBfX3d2c3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4OjpfX3d2c3RyaW5nPgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19nbnVfY3h4OjpfX3d2c3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6Ol9fd3ZzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5sZW5ndGgoKSAqIHNpemVvZih3Y2hhcl90KSk7IH0KKyAgICB9OworI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgX191MTZ2c3RyaW5nLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGhhc2g8X19nbnVfY3h4OjpfX3UxNnZzdHJpbmc+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBfX2dudV9jeHg6Ol9fdTE2dnN0cmluZz4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19nbnVfY3h4OjpfX3UxNnZzdHJpbmcmIF9fcykgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6aGFzaChfX3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcy5sZW5ndGgoKSAqIHNpemVvZihjaGFyMTZfdCkpOyB9CisgICAgfTsKKworICAvLy8gc3RkOjpoYXNoIHNwZWNpYWxpemF0aW9uIGZvciBfX3UzMnZzdHJpbmcuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDxfX2dudV9jeHg6Ol9fdTMydnN0cmluZz4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fZ251X2N4eDo6X191MzJ2c3RyaW5nPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBfX2dudV9jeHg6Ol9fdTMydnN0cmluZyYgX19zKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fcy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zLmxlbmd0aCgpICogc2l6ZW9mKGNoYXIzMl90KSk7IH0KKyAgICB9OworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fICovCisKKyNpbmNsdWRlICJ2c3RyaW5nLnRjYyIgCisKKyNpZiBfX2dvb2dsZV9zdGxfZGVidWdfc3RyaW5nICYmICFkZWZpbmVkKF9HTElCQ1hYX0RFQlVHKQorLy8gVW5kbyBvdXIgZGVmaW5lcywgc28gdGhleSBkb24ndCBhZmZlY3QgYW55dGhpbmcgZWxzZS4KKyMgdW5kZWYgX0dMSUJDWFhfREVCVUdfQVNTRVJUCisjIHVuZGVmIF9HTElCQ1hYX0RFQlVHX1BFREFTU0VSVAorIyBkZWZpbmUgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9Db25kaXRpb24pCisjIGRlZmluZSBfR0xJQkNYWF9ERUJVR19QRURBU1NFUlQoX0NvbmRpdGlvbikKKyNlbmRpZgorCisjZW5kaWYgLyogX1ZTVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvdnN0cmluZy50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC92c3RyaW5nLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg5ODViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9leHQvdnN0cmluZy50Y2MKQEAgLTAsMCArMSw3MDIgQEAKKy8vIFZlcnNhdGlsZSBzdHJpbmcgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0L3ZzdHJpbmcudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7ZXh0L3ZzdHJpbmcuaH0KKyAqLworCisjaWZuZGVmIF9WU1RSSU5HX1RDQworI2RlZmluZSBfVlNUUklOR19UQ0MgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2N4eGFiaV9mb3JjZWQuaD4KKworbmFtZXNwYWNlIF9fZ251X2N4eCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBjb25zdCB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpucG9zOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB2b2lkCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgcmVzaXplKHNpemVfdHlwZSBfX24sIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUgPCBfX24pCisJdGhpcy0+YXBwZW5kKF9fbiAtIF9fc2l6ZSwgX19jKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA8IF9fc2l6ZSkKKwl0aGlzLT5fTV9lcmFzZShfX24sIF9fc2l6ZSAtIF9fbik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+JgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIF9NX2FwcGVuZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX24gKyB0aGlzLT5zaXplKCk7CisKKyAgICAgIGlmIChfX2xlbiA8PSB0aGlzLT5jYXBhY2l0eSgpICYmICF0aGlzLT5fTV9pc19zaGFyZWQoKSkKKwl7CisJICBpZiAoX19uKQorCSAgICB0aGlzLT5fU19jb3B5KHRoaXMtPl9NX2RhdGEoKSArIHRoaXMtPnNpemUoKSwgX19zLCBfX24pOworCX0KKyAgICAgIGVsc2UKKwl0aGlzLT5fTV9tdXRhdGUodGhpcy0+c2l6ZSgpLCBzaXplX3R5cGUoMCksIF9fcywgX19uKTsKKworICAgICAgdGhpcy0+X01fc2V0X2xlbmd0aChfX2xlbik7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mCisgICAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICAgIF9NX3JlcGxhY2VfZGlzcGF0Y2goaXRlcmF0b3IgX19pMSwgaXRlcmF0b3IgX19pMiwgX0lucHV0SXRlcmF0b3IgX19rMSwKKwkJCSAgX0lucHV0SXRlcmF0b3IgX19rMiwgc3RkOjpfX2ZhbHNlX3R5cGUpCisgICAgICB7CisJY29uc3QgX192ZXJzYV9zdHJpbmcgX19zKF9fazEsIF9fazIpOworCWNvbnN0IHNpemVfdHlwZSBfX24xID0gX19pMiAtIF9faTE7CisJcmV0dXJuIF9NX3JlcGxhY2UoX19pMSAtIF9NX2liZWdpbigpLCBfX24xLCBfX3MuX01fZGF0YSgpLAorCQkJICBfX3Muc2l6ZSgpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBfTV9yZXBsYWNlX2F1eChzaXplX3R5cGUgX19wb3MxLCBzaXplX3R5cGUgX19uMSwgc2l6ZV90eXBlIF9fbjIsCisJCSAgIF9DaGFyVCBfX2MpCisgICAgeworICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbjEsIF9fbjIsICJfX3ZlcnNhX3N0cmluZzo6X01fcmVwbGFjZV9hdXgiKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9fb2xkX3NpemUgKyBfX24yIC0gX19uMTsKKworICAgICAgaWYgKF9fbmV3X3NpemUgPD0gdGhpcy0+Y2FwYWNpdHkoKSAmJiAhdGhpcy0+X01faXNfc2hhcmVkKCkpCisJeworCSAgX0NoYXJUKiBfX3AgPSB0aGlzLT5fTV9kYXRhKCkgKyBfX3BvczE7CisKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zMSAtIF9fbjE7CisJICBpZiAoX19ob3dfbXVjaCAmJiBfX24xICE9IF9fbjIpCisJICAgIHRoaXMtPl9TX21vdmUoX19wICsgX19uMiwgX19wICsgX19uMSwgX19ob3dfbXVjaCk7CisJfQorICAgICAgZWxzZQorCXRoaXMtPl9NX211dGF0ZShfX3BvczEsIF9fbjEsIDAsIF9fbjIpOworCisgICAgICBpZiAoX19uMikKKwl0aGlzLT5fU19hc3NpZ24odGhpcy0+X01fZGF0YSgpICsgX19wb3MxLCBfX24yLCBfX2MpOworCisgICAgICB0aGlzLT5fTV9zZXRfbGVuZ3RoKF9fbmV3X3NpemUpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBfTV9yZXBsYWNlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbGVuMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbjIpCisgICAgeworICAgICAgX01fY2hlY2tfbGVuZ3RoKF9fbGVuMSwgX19sZW4yLCAiX192ZXJzYV9zdHJpbmc6Ol9NX3JlcGxhY2UiKTsKKworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19uZXdfc2l6ZSA9IF9fb2xkX3NpemUgKyBfX2xlbjIgLSBfX2xlbjE7CisgICAgICAKKyAgICAgIGlmIChfX25ld19zaXplIDw9IHRoaXMtPmNhcGFjaXR5KCkgJiYgIXRoaXMtPl9NX2lzX3NoYXJlZCgpKQorCXsKKwkgIF9DaGFyVCogX19wID0gdGhpcy0+X01fZGF0YSgpICsgX19wb3M7CisKKwkgIGNvbnN0IHNpemVfdHlwZSBfX2hvd19tdWNoID0gX19vbGRfc2l6ZSAtIF9fcG9zIC0gX19sZW4xOworCSAgaWYgKF9NX2Rpc2p1bmN0KF9fcykpCisJICAgIHsKKwkgICAgICBpZiAoX19ob3dfbXVjaCAmJiBfX2xlbjEgIT0gX19sZW4yKQorCQl0aGlzLT5fU19tb3ZlKF9fcCArIF9fbGVuMiwgX19wICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKwkgICAgICBpZiAoX19sZW4yKQorCQl0aGlzLT5fU19jb3B5KF9fcCwgX19zLCBfX2xlbjIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICAvLyBXb3JrIGluLXBsYWNlLgorCSAgICAgIGlmIChfX2xlbjIgJiYgX19sZW4yIDw9IF9fbGVuMSkKKwkJdGhpcy0+X1NfbW92ZShfX3AsIF9fcywgX19sZW4yKTsKKwkgICAgICBpZiAoX19ob3dfbXVjaCAmJiBfX2xlbjEgIT0gX19sZW4yKQorCQl0aGlzLT5fU19tb3ZlKF9fcCArIF9fbGVuMiwgX19wICsgX19sZW4xLCBfX2hvd19tdWNoKTsKKwkgICAgICBpZiAoX19sZW4yID4gX19sZW4xKQorCQl7CisJCSAgaWYgKF9fcyArIF9fbGVuMiA8PSBfX3AgKyBfX2xlbjEpCisJCSAgICB0aGlzLT5fU19tb3ZlKF9fcCwgX19zLCBfX2xlbjIpOworCQkgIGVsc2UgaWYgKF9fcyA+PSBfX3AgKyBfX2xlbjEpCisJCSAgICB0aGlzLT5fU19jb3B5KF9fcCwgX19zICsgX19sZW4yIC0gX19sZW4xLCBfX2xlbjIpOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbmxlZnQgPSAoX19wICsgX19sZW4xKSAtIF9fczsKKwkJICAgICAgdGhpcy0+X1NfbW92ZShfX3AsIF9fcywgX19ubGVmdCk7CisJCSAgICAgIHRoaXMtPl9TX2NvcHkoX19wICsgX19ubGVmdCwgX19wICsgX19sZW4yLAorCQkJCSAgICBfX2xlbjIgLSBfX25sZWZ0KTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorICAgICAgZWxzZQorCXRoaXMtPl9NX211dGF0ZShfX3BvcywgX19sZW4xLCBfX3MsIF9fbGVuMik7CisKKyAgICAgIHRoaXMtPl9NX3NldF9sZW5ndGgoX19uZXdfc2l6ZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeworICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19saHMuc2l6ZSgpICsgX19yaHMuc2l6ZSgpKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhjb25zdCBfQ2hhclQqIF9fbGhzLAorCSAgICAgIGNvbnN0IF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19saHMpOworICAgICAgdHlwZWRlZiBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+IF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc3RyaW5nX3R5cGU6OnNpemVfdHlwZQkgIF9fc2l6ZV90eXBlOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19sZW4gPSBfVHJhaXRzOjpsZW5ndGgoX19saHMpOworICAgICAgX19zdHJpbmdfdHlwZSBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19sZW4gKyBfX3Jocy5zaXplKCkpOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzLCBfX2xlbik7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMpOworICAgICAgcmV0dXJuIF9fc3RyOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorICAgIG9wZXJhdG9yKyhfQ2hhclQgX19saHMsCisJICAgICAgY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19yaHMpCisgICAgeworICAgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cjsKKyAgICAgIF9fc3RyLnJlc2VydmUoX19yaHMuc2l6ZSgpICsgMSk7CisgICAgICBfX3N0ci5wdXNoX2JhY2soX19saHMpOworICAgICAgX19zdHIuYXBwZW5kKF9fcmhzKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgY29uc3QgX0NoYXJUKiBfX3JocykKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nKF9fcmhzKTsKKyAgICAgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiBfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJICBfX3NpemVfdHlwZTsKKyAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbGVuID0gX1RyYWl0czo6bGVuZ3RoKF9fcmhzKTsKKyAgICAgIF9fc3RyaW5nX3R5cGUgX19zdHI7CisgICAgICBfX3N0ci5yZXNlcnZlKF9fbGhzLnNpemUoKSArIF9fbGVuKTsKKyAgICAgIF9fc3RyLmFwcGVuZChfX2xocyk7CisgICAgICBfX3N0ci5hcHBlbmQoX19yaHMsIF9fbGVuKTsKKyAgICAgIHJldHVybiBfX3N0cjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4KKyAgICBvcGVyYXRvcisoY29uc3QgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19saHMsCisJICAgICAgX0NoYXJUIF9fcmhzKQorICAgIHsKKyAgICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT4gX19zdHI7CisgICAgICBfX3N0ci5yZXNlcnZlKF9fbGhzLnNpemUoKSArIDEpOworICAgICAgX19zdHIuYXBwZW5kKF9fbGhzKTsKKyAgICAgIF9fc3RyLnB1c2hfYmFjayhfX3Jocyk7CisgICAgICByZXR1cm4gX19zdHI7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBjb3B5KF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MsICJfX3ZlcnNhX3N0cmluZzo6Y29weSIpOworICAgICAgX19uID0gX01fbGltaXQoX19wb3MsIF9fbik7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBpZiAoX19uKQorCXRoaXMtPl9TX2NvcHkoX19zLCB0aGlzLT5fTV9kYXRhKCkgKyBfX3BvcywgX19uKTsKKyAgICAgIC8vIDIxLjMuNS43IHBhciAzOiBkbyBub3QgYXBwZW5kIG51bGwuICAoZ29vZC4pCisgICAgICByZXR1cm4gX19uOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IHRoaXMtPl9NX2RhdGEoKTsKKworICAgICAgaWYgKF9fbiA9PSAwKQorCXJldHVybiBfX3BvcyA8PSBfX3NpemUgPyBfX3BvcyA6IG5wb3M7CisKKyAgICAgIGlmIChfX24gPD0gX19zaXplKQorCXsKKwkgIGZvciAoOyBfX3BvcyA8PSBfX3NpemUgLSBfX247ICsrX19wb3MpCisJICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEoX19kYXRhW19fcG9zXSwgX19zWzBdKQorCQkmJiB0cmFpdHNfdHlwZTo6Y29tcGFyZShfX2RhdGEgKyBfX3BvcyArIDEsCisJCQkJCV9fcyArIDEsIF9fbiAtIDEpID09IDApCisJICAgICAgcmV0dXJuIF9fcG9zOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIF9fcmV0ID0gbnBvczsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19wb3MgPCBfX3NpemUpCisJeworCSAgY29uc3QgX0NoYXJUKiBfX2RhdGEgPSB0aGlzLT5fTV9kYXRhKCk7CisJICBjb25zdCBzaXplX3R5cGUgX19uID0gX19zaXplIC0gX19wb3M7CisJICBjb25zdCBfQ2hhclQqIF9fcCA9IHRyYWl0c190eXBlOjpmaW5kKF9fZGF0YSArIF9fcG9zLCBfX24sIF9fYyk7CisJICBpZiAoX19wKQorCSAgICBfX3JldCA9IF9fcCAtIF9fZGF0YTsKKwl9CisgICAgICByZXR1cm4gX19yZXQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICByZmluZChjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19uIDw9IF9fc2l6ZSkKKwl7CisJICBfX3BvcyA9IHN0ZDo6bWluKHNpemVfdHlwZShfX3NpemUgLSBfX24pLCBfX3Bvcyk7CisJICBjb25zdCBfQ2hhclQqIF9fZGF0YSA9IHRoaXMtPl9NX2RhdGEoKTsKKwkgIGRvCisJICAgIHsKKwkgICAgICBpZiAodHJhaXRzX3R5cGU6OmNvbXBhcmUoX19kYXRhICsgX19wb3MsIF9fcywgX19uKSA9PSAwKQorCQlyZXR1cm4gX19wb3M7CisJICAgIH0KKwkgIHdoaWxlIChfX3Bvcy0tID4gMCk7CisJfQorICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICByZmluZChfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZm9yICgrK19fc2l6ZTsgX19zaXplLS0gPiAwOyApCisJICAgIGlmICh0cmFpdHNfdHlwZTo6ZXEodGhpcy0+X01fZGF0YSgpW19fc2l6ZV0sIF9fYykpCisJICAgICAgcmV0dXJuIF9fc2l6ZTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfZmlyc3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBmb3IgKDsgX19uICYmIF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCXsKKwkgIGNvbnN0IF9DaGFyVCogX19wID0gdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sCisJCQkJCQl0aGlzLT5fTV9kYXRhKClbX19wb3NdKTsKKwkgIGlmIChfX3ApCisJICAgIHJldHVybiBfX3BvczsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfbGFzdF9vZihjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uKTsKKyAgICAgIHNpemVfdHlwZSBfX3NpemUgPSB0aGlzLT5zaXplKCk7CisgICAgICBpZiAoX19zaXplICYmIF9fbikKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKHRyYWl0c190eXBlOjpmaW5kKF9fcywgX19uLCB0aGlzLT5fTV9kYXRhKClbX19zaXplXSkpCisJCXJldHVybiBfX3NpemU7CisJICAgIH0KKwkgIHdoaWxlIChfX3NpemUtLSAhPSAwKTsKKwl9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZ19sZW4oX19zLCBfX24pOworICAgICAgZm9yICg7IF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCWlmICghdHJhaXRzX3R5cGU6OmZpbmQoX19zLCBfX24sIHRoaXMtPl9NX2RhdGEoKVtfX3Bvc10pKQorCSAgcmV0dXJuIF9fcG9zOworICAgICAgcmV0dXJuIG5wb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cywgdHlwZW5hbWUgX0FsbG9jLAorCSAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICB0eXBlbmFtZSBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjpzaXplX3R5cGUKKyAgICBfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBmaW5kX2ZpcnN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgZm9yICg7IF9fcG9zIDwgdGhpcy0+c2l6ZSgpOyArK19fcG9zKQorCWlmICghdHJhaXRzX3R5cGU6OmVxKHRoaXMtPl9NX2RhdGEoKVtfX3Bvc10sIF9fYykpCisJICByZXR1cm4gX19wb3M7CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIHR5cGVuYW1lIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OnNpemVfdHlwZQorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGZpbmRfbGFzdF9ub3Rfb2YoY29uc3QgX0NoYXJUKiBfX3MsIHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICB7CisgICAgICBfX2dsaWJjeHhfcmVxdWlyZXNfc3RyaW5nX2xlbihfX3MsIF9fbik7CisgICAgICBzaXplX3R5cGUgX19zaXplID0gdGhpcy0+c2l6ZSgpOworICAgICAgaWYgKF9fc2l6ZSkKKwl7CisJICBpZiAoLS1fX3NpemUgPiBfX3BvcykKKwkgICAgX19zaXplID0gX19wb3M7CisJICBkbworCSAgICB7CisJICAgICAgaWYgKCF0cmFpdHNfdHlwZTo6ZmluZChfX3MsIF9fbiwgdGhpcy0+X01fZGF0YSgpW19fc2l6ZV0pKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgdHlwZW5hbWUgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6c2l6ZV90eXBlCisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgZmluZF9sYXN0X25vdF9vZihfQ2hhclQgX19jLCBzaXplX3R5cGUgX19wb3MpIGNvbnN0CisgICAgeworICAgICAgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGlmIChfX3NpemUpCisJeworCSAgaWYgKC0tX19zaXplID4gX19wb3MpCisJICAgIF9fc2l6ZSA9IF9fcG9zOworCSAgZG8KKwkgICAgeworCSAgICAgIGlmICghdHJhaXRzX3R5cGU6OmVxKHRoaXMtPl9NX2RhdGEoKVtfX3NpemVdLCBfX2MpKQorCQlyZXR1cm4gX19zaXplOworCSAgICB9CisJICB3aGlsZSAoX19zaXplLS0pOworCX0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPjo6CisgICAgY29tcGFyZShzaXplX3R5cGUgX19wb3MsIHNpemVfdHlwZSBfX24sIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0cikgY29uc3QKKyAgICB7CisgICAgICBfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24gPSBfTV9saW1pdChfX3BvcywgX19uKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gX19zdHIuc2l6ZSgpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCkgKyBfX3BvcywKKwkJCQkgICAgIF9fc3RyLmRhdGEoKSwgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX24sIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGludAorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zMSwgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9fdmVyc2Ffc3RyaW5nJiBfX3N0ciwKKwkgICAgc2l6ZV90eXBlIF9fcG9zMiwgc2l6ZV90eXBlIF9fbjIpIGNvbnN0CisgICAgeworICAgICAgX01fY2hlY2soX19wb3MxLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fc3RyLl9NX2NoZWNrKF9fcG9zMiwgIl9fdmVyc2Ffc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MxLCBfX24xKTsKKyAgICAgIF9fbjIgPSBfX3N0ci5fTV9saW1pdChfX3BvczIsIF9fbjIpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uMSwgX19uMik7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUodGhpcy0+X01fZGF0YSgpICsgX19wb3MxLAorCQkJCSAgICAgX19zdHIuZGF0YSgpICsgX19wb3MyLCBfX2xlbik7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSB0aGlzLT5fU19jb21wYXJlKF9fbjEsIF9fbjIpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGludAorICAgIF9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoY29uc3QgX0NoYXJUKiBfX3MpIGNvbnN0CisgICAgeworICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N0cmluZyhfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fc2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX29zaXplID0gdHJhaXRzX3R5cGU6Omxlbmd0aChfX3MpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19zaXplLCBfX29zaXplKTsKKyAgICAgIGludCBfX3IgPSB0cmFpdHNfdHlwZTo6Y29tcGFyZSh0aGlzLT5fTV9kYXRhKCksIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX3NpemUsIF9fb3NpemUpOworICAgICAgcmV0dXJuIF9fcjsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisJICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGludAorICAgIF9fdmVyc2Ffc3RyaW5nIDxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYywgX0Jhc2U+OjoKKyAgICBjb21wYXJlKHNpemVfdHlwZSBfX3Bvcywgc2l6ZV90eXBlIF9fbjEsIGNvbnN0IF9DaGFyVCogX19zKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmcoX19zKTsKKyAgICAgIF9NX2NoZWNrKF9fcG9zLCAiX192ZXJzYV9zdHJpbmc6OmNvbXBhcmUiKTsKKyAgICAgIF9fbjEgPSBfTV9saW1pdChfX3BvcywgX19uMSk7CisgICAgICBjb25zdCBzaXplX3R5cGUgX19vc2l6ZSA9IHRyYWl0c190eXBlOjpsZW5ndGgoX19zKTsKKyAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2xlbiA9IHN0ZDo6bWluKF9fbjEsIF9fb3NpemUpOworICAgICAgaW50IF9fciA9IHRyYWl0c190eXBlOjpjb21wYXJlKHRoaXMtPl9NX2RhdGEoKSArIF9fcG9zLCBfX3MsIF9fbGVuKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IHRoaXMtPl9TX2NvbXBhcmUoX19uMSwgX19vc2l6ZSk7CisgICAgICByZXR1cm4gX19yOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKwkgICB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgX0Jhc2U+CisgICAgaW50CisgICAgX192ZXJzYV9zdHJpbmcgPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLCBfQmFzZT46OgorICAgIGNvbXBhcmUoc2l6ZV90eXBlIF9fcG9zLCBzaXplX3R5cGUgX19uMSwgY29uc3QgX0NoYXJUKiBfX3MsCisJICAgIHNpemVfdHlwZSBfX24yKSBjb25zdAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdHJpbmdfbGVuKF9fcywgX19uMik7CisgICAgICBfTV9jaGVjayhfX3BvcywgIl9fdmVyc2Ffc3RyaW5nOjpjb21wYXJlIik7CisgICAgICBfX24xID0gX01fbGltaXQoX19wb3MsIF9fbjEpOworICAgICAgY29uc3Qgc2l6ZV90eXBlIF9fbGVuID0gc3RkOjptaW4oX19uMSwgX19uMik7CisgICAgICBpbnQgX19yID0gdHJhaXRzX3R5cGU6OmNvbXBhcmUodGhpcy0+X01fZGF0YSgpICsgX19wb3MsIF9fcywgX19sZW4pOworICAgICAgaWYgKCFfX3IpCisJX19yID0gdGhpcy0+X1NfY29tcGFyZShfX24xLCBfX24yKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYywKKyAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIF9CYXNlPgorICAgIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pbiwKKwkgICAgICAgX19nbnVfY3h4OjpfX3ZlcnNhX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jLCBfQmFzZT4mIF9fc3RyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICAgICAgICAgICAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICAgICAgIF9faW9zX2Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZQkJX19pbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCQlfX3NpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY3R5cGU8X0NoYXJUPgkJCQlfX2N0eXBlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY3R5cGVfdHlwZTo6Y3R5cGVfYmFzZSAgICAgICAgIF9fY3R5cGVfYmFzZTsKKworICAgICAgX19zaXplX3R5cGUgX19leHRyYWN0ZWQgPSAwOworICAgICAgdHlwZW5hbWUgX19pb3NfYmFzZTo6aW9zdGF0ZSBfX2VyciA9IF9faW9zX2Jhc2U6Omdvb2RiaXQ7CisgICAgICB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6c2VudHJ5IF9fY2VyYihfX2luLCBmYWxzZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgX0NoYXJUIF9fYnVmWzEyOF07CisJICAgICAgX19zaXplX3R5cGUgX19sZW4gPSAwOworCSAgICAgIGNvbnN0IHN0cmVhbXNpemUgX193ID0gX19pbi53aWR0aCgpOworCSAgICAgIGNvbnN0IF9fc2l6ZV90eXBlIF9fbiA9IF9fdyA+IDAgPyBzdGF0aWNfY2FzdDxfX3NpemVfdHlwZT4oX193KQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fc3RyLm1heF9zaXplKCk7CisJICAgICAgY29uc3QgX19jdHlwZV90eXBlJiBfX2N0ID0gdXNlX2ZhY2V0PF9fY3R5cGVfdHlwZT4oX19pbi5nZXRsb2MoKSk7CisJICAgICAgY29uc3QgX19pbnRfdHlwZSBfX2VvZiA9IF9UcmFpdHM6OmVvZigpOworCSAgICAgIF9faW50X3R5cGUgX19jID0gX19pbi5yZGJ1ZigpLT5zZ2V0YygpOworCisJICAgICAgd2hpbGUgKF9fZXh0cmFjdGVkIDwgX19uCisJCSAgICAgJiYgIV9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpCisJCSAgICAgJiYgIV9fY3QuaXMoX19jdHlwZV9iYXNlOjpzcGFjZSwKKwkJCQkgX1RyYWl0czo6dG9fY2hhcl90eXBlKF9fYykpKQorCQl7CisJCSAgaWYgKF9fbGVuID09IHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSkKKwkJICAgIHsKKwkJICAgICAgX19zdHIuYXBwZW5kKF9fYnVmLCBzaXplb2YoX19idWYpIC8gc2l6ZW9mKF9DaGFyVCkpOworCQkgICAgICBfX2xlbiA9IDA7CisJCSAgICB9CisJCSAgX19idWZbX19sZW4rK10gPSBfVHJhaXRzOjp0b19jaGFyX3R5cGUoX19jKTsKKwkJICArK19fZXh0cmFjdGVkOworCQkgIF9fYyA9IF9faW4ucmRidWYoKS0+c25leHRjKCk7CisJCX0KKwkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIF9fbGVuKTsKKworCSAgICAgIGlmIChfVHJhaXRzOjplcV9pbnRfdHlwZShfX2MsIF9fZW9mKSkKKwkJX19lcnIgfD0gX19pb3NfYmFzZTo6ZW9mYml0OworCSAgICAgIF9faW4ud2lkdGgoMCk7CisJICAgIH0KKwkgIF9fY2F0Y2goX19jeHhhYml2MTo6X19mb3JjZWRfdW53aW5kJikKKwkgICAgeworCSAgICAgIF9faW4uX01fc2V0c3RhdGUoX19pb3NfYmFzZTo6YmFkYml0KTsKKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCSAgX19jYXRjaCguLi4pCisJICAgIHsKKwkgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAgICAgLy8gOTEuIERlc2NyaXB0aW9uIG9mIG9wZXJhdG9yPj4gYW5kIGdldGxpbmUoKSBmb3Igc3RyaW5nPD4KKwkgICAgICAvLyBtaWdodCBjYXVzZSBlbmRsZXNzIGxvb3AKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgIH0KKwl9CisgICAgICAvLyAyMTEuICBvcGVyYXRvcj4+KGlzdHJlYW0mLCBzdHJpbmcmKSBkb2Vzbid0IHNldCBmYWlsYml0CisgICAgICBpZiAoIV9fZXh0cmFjdGVkKQorCV9fZXJyIHw9IF9faW9zX2Jhc2U6OmZhaWxiaXQ7CisgICAgICBpZiAoX19lcnIpCisJX19pbi5zZXRzdGF0ZShfX2Vycik7CisgICAgICByZXR1cm4gX19pbjsKKyAgICB9ICAgICAgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2MsCisgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZT4KKyAgICBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgZ2V0bGluZShiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faW4sCisJICAgIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPiYgX19zdHIsCisJICAgIF9DaGFyVCBfX2RlbGltKQorICAgIHsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CSAgICAgICAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICAgICAgIF9faW9zX2Jhc2U7CisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6X192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsIF9CYXNlPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppbnRfdHlwZQkJX19pbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpbmdfdHlwZTo6c2l6ZV90eXBlCQlfX3NpemVfdHlwZTsKKworICAgICAgX19zaXplX3R5cGUgX19leHRyYWN0ZWQgPSAwOworICAgICAgY29uc3QgX19zaXplX3R5cGUgX19uID0gX19zdHIubWF4X3NpemUoKTsKKyAgICAgIHR5cGVuYW1lIF9faW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBfX2lvc19iYXNlOjpnb29kYml0OworICAgICAgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6OnNlbnRyeSBfX2NlcmIoX19pbiwgdHJ1ZSk7CisgICAgICBpZiAoX19jZXJiKQorCXsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICAvLyBBdm9pZCByZWFsbG9jYXRpb24gZm9yIGNvbW1vbiBjYXNlLgorCSAgICAgIF9fc3RyLmVyYXNlKCk7CisJICAgICAgX0NoYXJUIF9fYnVmWzEyOF07CisJICAgICAgX19zaXplX3R5cGUgX19sZW4gPSAwOworCSAgICAgIGNvbnN0IF9faW50X3R5cGUgX19pZGVsaW0gPSBfVHJhaXRzOjp0b19pbnRfdHlwZShfX2RlbGltKTsKKwkgICAgICBjb25zdCBfX2ludF90eXBlIF9fZW9mID0gX1RyYWl0czo6ZW9mKCk7CisJICAgICAgX19pbnRfdHlwZSBfX2MgPSBfX2luLnJkYnVmKCktPnNnZXRjKCk7CisKKwkgICAgICB3aGlsZSAoX19leHRyYWN0ZWQgPCBfX24KKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2VvZikKKwkJICAgICAmJiAhX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisJCXsKKwkJICBpZiAoX19sZW4gPT0gc2l6ZW9mKF9fYnVmKSAvIHNpemVvZihfQ2hhclQpKQorCQkgICAgeworCQkgICAgICBfX3N0ci5hcHBlbmQoX19idWYsIHNpemVvZihfX2J1ZikgLyBzaXplb2YoX0NoYXJUKSk7CisJCSAgICAgIF9fbGVuID0gMDsKKwkJICAgIH0KKwkJICBfX2J1ZltfX2xlbisrXSA9IF9UcmFpdHM6OnRvX2NoYXJfdHlwZShfX2MpOworCQkgICsrX19leHRyYWN0ZWQ7CisJCSAgX19jID0gX19pbi5yZGJ1ZigpLT5zbmV4dGMoKTsKKwkJfQorCSAgICAgIF9fc3RyLmFwcGVuZChfX2J1ZiwgX19sZW4pOworCisJICAgICAgaWYgKF9UcmFpdHM6OmVxX2ludF90eXBlKF9fYywgX19lb2YpKQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjplb2ZiaXQ7CisJICAgICAgZWxzZSBpZiAoX1RyYWl0czo6ZXFfaW50X3R5cGUoX19jLCBfX2lkZWxpbSkpCisJCXsKKwkJICArK19fZXh0cmFjdGVkOwkJICAKKwkJICBfX2luLnJkYnVmKCktPnNidW1wYygpOworCQl9CisJICAgICAgZWxzZQorCQlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworCSAgICB9CisJICBfX2NhdGNoKF9fY3h4YWJpdjE6Ol9fZm9yY2VkX3Vud2luZCYpCisJICAgIHsKKwkgICAgICBfX2luLl9NX3NldHN0YXRlKF9faW9zX2Jhc2U6OmJhZGJpdCk7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwkgIF9fY2F0Y2goLi4uKQorCSAgICB7CisJICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgICAgIC8vIDkxLiBEZXNjcmlwdGlvbiBvZiBvcGVyYXRvcj4+IGFuZCBnZXRsaW5lKCkgZm9yIHN0cmluZzw+CisJICAgICAgLy8gbWlnaHQgY2F1c2UgZW5kbGVzcyBsb29wCisJICAgICAgX19pbi5fTV9zZXRzdGF0ZShfX2lvc19iYXNlOjpiYWRiaXQpOworCSAgICB9CisJfQorICAgICAgaWYgKCFfX2V4dHJhY3RlZCkKKwlfX2VyciB8PSBfX2lvc19iYXNlOjpmYWlsYml0OworICAgICAgaWYgKF9fZXJyKQorCV9faW4uc2V0c3RhdGUoX19lcnIpOworICAgICAgcmV0dXJuIF9faW47CisgICAgfSAgICAgIAorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfVlNUUklOR19UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3ZzdHJpbmdfZndkLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC92c3RyaW5nX2Z3ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGNmNTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC92c3RyaW5nX2Z3ZC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIFZlcnNhdGlsZSBzdHJpbmcgZm9yd2FyZCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBleHQvdnN0cmluZ19md2QuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC92c3RyaW5nLmh9CisgKi8KKworI2lmbmRlZiBfVlNUUklOR19GV0RfSAorI2RlZmluZSBfVlNUUklOR19GV0RfSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9jaGFyX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX3Nzb19zdHJpbmdfYmFzZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBfX3JjX3N0cmluZ19iYXNlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgdHlwZW5hbWUgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8X0NoYXJUPiwKKwkgICB0ZW1wbGF0ZQorCSAgIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBfQmFzZSA9IF9fc3NvX3N0cmluZ19iYXNlPgorICAgIGNsYXNzIF9fdmVyc2Ffc3RyaW5nOworCisgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8Y2hhcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3ZzdHJpbmc7CisgIHR5cGVkZWYgX192c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Nzb19zdHJpbmc7CisgIHR5cGVkZWYgCisgIF9fdmVyc2Ffc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sCisJCSBzdGQ6OmFsbG9jYXRvcjxjaGFyPiwgX19yY19zdHJpbmdfYmFzZT4gICAgX19yY19zdHJpbmc7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0eXBlZGVmIF9fdmVyc2Ffc3RyaW5nPHdjaGFyX3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgX193dnN0cmluZzsKKyAgdHlwZWRlZiBfX3d2c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fd3Nzb19zdHJpbmc7CisgIHR5cGVkZWYKKyAgX192ZXJzYV9zdHJpbmc8d2NoYXJfdCwgc3RkOjpjaGFyX3RyYWl0czx3Y2hhcl90PiwKKwkJIHN0ZDo6YWxsb2NhdG9yPHdjaGFyX3Q+LCBfX3JjX3N0cmluZ19iYXNlPiBfX3dyY19zdHJpbmc7CisjZW5kaWYgIAorCisjaWYgKGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pIFwKKyAgICAgJiYgZGVmaW5lZChfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEpKQorCisgIHR5cGVkZWYgX192ZXJzYV9zdHJpbmc8Y2hhcjE2X3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UxNnZzdHJpbmc7CisgIHR5cGVkZWYgX191MTZ2c3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3UxNnNzb19zdHJpbmc7CisgIHR5cGVkZWYgCisgIF9fdmVyc2Ffc3RyaW5nPGNoYXIxNl90LCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXIxNl90PiwKKwkJIHN0ZDo6YWxsb2NhdG9yPGNoYXIxNl90PiwgX19yY19zdHJpbmdfYmFzZT4gX191MTZyY19zdHJpbmc7CisKKyAgdHlwZWRlZiBfX3ZlcnNhX3N0cmluZzxjaGFyMzJfdD4gICAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMydnN0cmluZzsKKyAgdHlwZWRlZiBfX3UzMnZzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyc3NvX3N0cmluZzsKKyAgdHlwZWRlZiAKKyAgX192ZXJzYV9zdHJpbmc8Y2hhcjMyX3QsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcjMyX3Q+LAorCQkgc3RkOjphbGxvY2F0b3I8Y2hhcjMyX3Q+LCBfX3JjX3N0cmluZ19iYXNlPiBfX3UzMnJjX3N0cmluZzsKKworI2VuZGlmCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9WU1RSSU5HX0ZXRF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC92c3RyaW5nX3V0aWwuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZXh0L3ZzdHJpbmdfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjM5ODEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2V4dC92c3RyaW5nX3V0aWwuaApAQCAtMCwwICsxLDE4NCBAQAorLy8gVmVyc2F0aWxlIHN0cmluZyB1dGlsaXR5IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGV4dC92c3RyaW5nX3V0aWwuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2V4dC92c3RyaW5nLmh9CisgKi8KKworI2lmbmRlZiBfVlNUUklOR19VVElMX0gKKyNkZWZpbmUgX1ZTVFJJTkdfVVRJTF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZXh0L3ZzdHJpbmdfZndkLmg+CisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAgLy8gRm9yIGxlc3MKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9sb2NhbGVmd2QuaD4KKyNpbmNsdWRlIDxiaXRzL29zdHJlYW1faW5zZXJ0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxleHQvbnVtZXJpY190cmFpdHMuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorCituYW1lc3BhY2UgX19nbnVfY3h4IF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IF9fdnN0cmluZ191dGlsaXR5CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2M6OnRlbXBsYXRlIHJlYmluZDxfQ2hhclQ+OjpvdGhlciBfQ2hhclRfYWxsb2NfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHJhaXRzCQkJCQkgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmNoYXJfdHlwZQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpzaXplX3R5cGUJICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0NoYXJUX2FsbG9jX3R5cGU6OnBvaW50ZXIJICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9DaGFyVF9hbGxvY190eXBlOjpjb25zdF9wb2ludGVyCSAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyBGb3IgX19zc29fc3RyaW5nLgorICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OgorICAgICAgX19ub3JtYWxfaXRlcmF0b3I8cG9pbnRlciwgX19nbnVfY3h4OjoKKwkJCV9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorCQkJCSAgICAgICBfX3Nzb19zdHJpbmdfYmFzZT4gPgorCV9fc3NvX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OgorICAgICAgX19ub3JtYWxfaXRlcmF0b3I8Y29uc3RfcG9pbnRlciwgX19nbnVfY3h4OjoKKwkJCV9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorCQkJCSAgICAgICBfX3Nzb19zdHJpbmdfYmFzZT4gPgorCV9fY29uc3Rfc3NvX2l0ZXJhdG9yOworCisgICAgICAvLyBGb3IgX19yY19zdHJpbmcuCisgICAgICB0eXBlZGVmIF9fZ251X2N4eDo6CisgICAgICBfX25vcm1hbF9pdGVyYXRvcjxwb2ludGVyLCBfX2dudV9jeHg6OgorCQkJX192ZXJzYV9zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2MsCisJCQkJICAgICAgIF9fcmNfc3RyaW5nX2Jhc2U+ID4KKwlfX3JjX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2dudV9jeHg6OgorICAgICAgX19ub3JtYWxfaXRlcmF0b3I8Y29uc3RfcG9pbnRlciwgX19nbnVfY3h4OjoKKwkJCV9fdmVyc2Ffc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jLAorCQkJCSAgICAgICBfX3JjX3N0cmluZ19iYXNlPiA+CisJX19jb25zdF9yY19pdGVyYXRvcjsKKworICAgICAgLy8gTkI6ICBXaGVuIHRoZSBhbGxvY2F0b3IgaXMgZW1wdHksIGRlcml2aW5nIGZyb20gaXQgc2F2ZXMgc3BhY2UKKyAgICAgIC8vIChodHRwOi8vd3d3LmNhbnRyaXAub3JnL2VtcHR5b3B0Lmh0bWwpLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jMT4KKwlzdHJ1Y3QgX0FsbG9jX2hpZGVyCisJOiBwdWJsaWMgX0FsbG9jMQorCXsKKwkgIF9BbGxvY19oaWRlcihfQ2hhclQqIF9fcHRyKQorCSAgOiBfQWxsb2MxKCksIF9NX3AoX19wdHIpIHsgfQorCisJICBfQWxsb2NfaGlkZXIoY29uc3QgX0FsbG9jMSYgX19hLCBfQ2hhclQqIF9fcHRyKQorCSAgOiBfQWxsb2MxKF9fYSksIF9NX3AoX19wdHIpIHsgfQorCisJICBfQ2hhclQqICBfTV9wOyAvLyBUaGUgYWN0dWFsIGRhdGEuCisJfTsKKworICAgICAgLy8gV2hlbiBfX24gPSAxIHdheSBmYXN0ZXIgdGhhbiB0aGUgZ2VuZXJhbCBtdWx0aWNoYXIKKyAgICAgIC8vIHRyYWl0c190eXBlOjpjb3B5L21vdmUvYXNzaWduLgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHkoX0NoYXJUKiBfX2QsIGNvbnN0IF9DaGFyVCogX19zLCBzaXplX3R5cGUgX19uKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgKl9fcyk7CisJZWxzZQorCSAgdHJhaXRzX3R5cGU6OmNvcHkoX19kLCBfX3MsIF9fbik7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19tb3ZlKF9DaGFyVCogX19kLCBjb25zdCBfQ2hhclQqIF9fcywgc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKwlpZiAoX19uID09IDEpCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX2QsICpfX3MpOworCWVsc2UKKwkgIHRyYWl0c190eXBlOjptb3ZlKF9fZCwgX19zLCBfX24pOworICAgICAgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfYXNzaWduKF9DaGFyVCogX19kLCBzaXplX3R5cGUgX19uLCBfQ2hhclQgX19jKQorICAgICAgeworCWlmIChfX24gPT0gMSkKKwkgIHRyYWl0c190eXBlOjphc3NpZ24oKl9fZCwgX19jKTsKKwllbHNlCisJICB0cmFpdHNfdHlwZTo6YXNzaWduKF9fZCwgX19uLCBfX2MpOworICAgICAgfQorCisgICAgICAvLyBfU19jb3B5X2NoYXJzIGlzIGEgc2VwYXJhdGUgdGVtcGxhdGUgdG8gcGVybWl0IHNwZWNpYWxpemF0aW9uCisgICAgICAvLyB0byBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHBvaW50ZXJzIGFzIGl0ZXJhdG9ycy4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvcj4KKwlzdGF0aWMgdm9pZAorCV9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9JdGVyYXRvciBfX2sxLCBfSXRlcmF0b3IgX19rMikKKwl7CisJICBmb3IgKDsgX19rMSAhPSBfX2syOyArK19fazEsICsrX19wKQorCSAgICB0cmFpdHNfdHlwZTo6YXNzaWduKCpfX3AsICpfX2sxKTsgLy8gVGhlc2UgdHlwZXMgYXJlIG9mZi4KKwl9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfX3Nzb19pdGVyYXRvciBfX2sxLCBfX3Nzb19pdGVyYXRvciBfX2syKQorICAgICAgeyBfU19jb3B5X2NoYXJzKF9fcCwgX19rMS5iYXNlKCksIF9fazIuYmFzZSgpKTsgfQorCisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX1NfY29weV9jaGFycyhfQ2hhclQqIF9fcCwgX19jb25zdF9zc29faXRlcmF0b3IgX19rMSwKKwkJICAgIF9fY29uc3Rfc3NvX2l0ZXJhdG9yIF9fazIpCisgICAgICB7IF9TX2NvcHlfY2hhcnMoX19wLCBfX2sxLmJhc2UoKSwgX19rMi5iYXNlKCkpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBfX3JjX2l0ZXJhdG9yIF9fazEsIF9fcmNfaXRlcmF0b3IgX19rMikKKyAgICAgIHsgX1NfY29weV9jaGFycyhfX3AsIF9fazEuYmFzZSgpLCBfX2syLmJhc2UoKSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9fY29uc3RfcmNfaXRlcmF0b3IgX19rMSwKKwkJICAgIF9fY29uc3RfcmNfaXRlcmF0b3IgX19rMikKKyAgICAgIHsgX1NfY29weV9jaGFycyhfX3AsIF9fazEuYmFzZSgpLCBfX2syLmJhc2UoKSk7IH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9TX2NvcHlfY2hhcnMoX0NoYXJUKiBfX3AsIF9DaGFyVCogX19rMSwgX0NoYXJUKiBfX2syKQorICAgICAgeyBfU19jb3B5KF9fcCwgX19rMSwgX19rMiAtIF9fazEpOyB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19jb3B5X2NoYXJzKF9DaGFyVCogX19wLCBjb25zdCBfQ2hhclQqIF9fazEsIGNvbnN0IF9DaGFyVCogX19rMikKKyAgICAgIHsgX1NfY29weShfX3AsIF9fazEsIF9fazIgLSBfX2sxKTsgfQorCisgICAgICBzdGF0aWMgaW50CisgICAgICBfU19jb21wYXJlKHNpemVfdHlwZSBfX24xLCBzaXplX3R5cGUgX19uMikKKyAgICAgIHsKKwljb25zdCBkaWZmZXJlbmNlX3R5cGUgX19kID0gZGlmZmVyZW5jZV90eXBlKF9fbjEgLSBfX24yKTsKKworCWlmIChfX2QgPiBfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8aW50Pjo6X19tYXgpCisJICByZXR1cm4gX19udW1lcmljX3RyYWl0c19pbnRlZ2VyPGludD46Ol9fbWF4OworCWVsc2UgaWYgKF9fZCA8IF9fbnVtZXJpY190cmFpdHNfaW50ZWdlcjxpbnQ+OjpfX21pbikKKwkgIHJldHVybiBfX251bWVyaWNfdHJhaXRzX2ludGVnZXI8aW50Pjo6X19taW47CisJZWxzZQorCSAgcmV0dXJuIGludChfX2QpOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8qIF9WU1RSSU5HX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mZW52LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk2ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mZW52LmgKQEAgLTAsMCArMSw4MSBAQAorLy8gLSotIEMrKyAtKi0gY29tcGF0aWJpbGl0eSBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZmVudi5oCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0ZFTlZfSAorI2RlZmluZSBfR0xJQkNYWF9GRU5WX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2lmIF9HTElCQ1hYX0hBVkVfRkVOVl9ICisjIGluY2x1ZGVfbmV4dCA8ZmVudi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjdW5kZWYgZmVjbGVhcmV4Y2VwdAorI3VuZGVmIGZlZ2V0ZXhjZXB0ZmxhZworI3VuZGVmIGZlcmFpc2VleGNlcHQKKyN1bmRlZiBmZXNldGV4Y2VwdGZsYWcKKyN1bmRlZiBmZXRlc3RleGNlcHQKKyN1bmRlZiBmZWdldHJvdW5kCisjdW5kZWYgZmVzZXRyb3VuZAorI3VuZGVmIGZlZ2V0ZW52CisjdW5kZWYgZmVob2xkZXhjZXB0CisjdW5kZWYgZmVzZXRlbnYKKyN1bmRlZiBmZXVwZGF0ZWVudgorCituYW1lc3BhY2Ugc3RkCit7CisgIC8vIHR5cGVzCisgIHVzaW5nIDo6ZmVudl90OworICB1c2luZyA6OmZleGNlcHRfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjpmZWNsZWFyZXhjZXB0OworICB1c2luZyA6OmZlZ2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXJhaXNlZXhjZXB0OworICB1c2luZyA6OmZlc2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXRlc3RleGNlcHQ7CisKKyAgdXNpbmcgOjpmZWdldHJvdW5kOworICB1c2luZyA6OmZlc2V0cm91bmQ7CisKKyAgdXNpbmcgOjpmZWdldGVudjsKKyAgdXNpbmcgOjpmZWhvbGRleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRlbnY7CisgIHVzaW5nIDo6ZmV1cGRhdGVlbnY7Cit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9GRU5WX1RSMQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX0ZFTlZfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mb3J3YXJkX2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2ZvcndhcmRfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJlZmNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mb3J3YXJkX2xpc3QKQEAgLTAsMCArMSw1MiBAQAorLy8gPGZvcndhcmRfbGlzdD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2ZvcndhcmRfbGlzdAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9GT1JXQVJEX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfRk9SV0FSRF9MSVNUIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGJpdHMvZm9yd2FyZF9saXN0Lmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxiaXRzL2ZvcndhcmRfbGlzdC50Y2M+CisKKyNpZmRlZiBfR0xJQkNYWF9ERUJVRworIyBpbmNsdWRlIDxkZWJ1Zy9mb3J3YXJkX2xpc3Q+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS9mb3J3YXJkX2xpc3Q+CisjZW5kaWYKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9GT1JXQVJEX0xJU1QKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZnN0cmVhbSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZnN0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ2ZTVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mc3RyZWFtCkBAIC0wLDAgKzEsOTIzIEBACisvLyBGaWxlIGJhc2VkIHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvZnN0cmVhbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjggIEZpbGUtYmFzZWQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9GU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX0ZTVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8Yml0cy9jb2RlY3Z0Lmg+CisjaW5jbHVkZSA8Y3N0ZGlvPiAgICAgICAgICAgICAvLyBGb3IgQlVGU0laCisjaW5jbHVkZSA8Yml0cy9iYXNpY19maWxlLmg+ICAvLyBGb3IgX19iYXNpY19maWxlLCBfX2NfbG9jaworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjaW5jbHVkZSA8c3RyaW5nPiAgICAgICAgICAgICAvLyBGb3Igc3RkOjpzdHJpbmcgb3ZlcmxvYWRzLgorI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjcuOC4xLjFdIHRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZpbGVidWYKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSBhY3R1YWwgd29yayBvZiBpbnB1dCBhbmQgb3V0cHV0IChmb3IgZmlsZXMpLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgYXNzb2NpYXRlcyBib3RoIGl0cyBpbnB1dCBhbmQgb3V0cHV0IHNlcXVlbmNlIHdpdGggYW4KKyAgICogIGV4dGVybmFsIGRpc2sgZmlsZSwgYW5kIG1haW50YWlucyBhIGpvaW50IGZpbGUgcG9zaXRpb24gZm9yIGJvdGgKKyAgICogIHNlcXVlbmNlcy4gIE1hbnkgb2YgaXRzIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIHRlcm1zIG9mIHNpbWlsYXIKKyAgICogIGJlaGF2aW9yIGluIHRoZSBTdGFuZGFyZCBDIExpYnJhcnkncyBAYyBGSUxFIHN0cmVhbXMuCisgICAqLworICAvLyBSZXF1aXJlbWVudHMgb24gdHJhaXRzX3R5cGUsIHNwZWNpZmljIHRvIHRoaXMgY2xhc3M6CisgIC8vIHRyYWl0c190eXBlOjpwb3NfdHlwZSBtdXN0IGJlIGZwb3M8dHJhaXRzX3R5cGU6OnN0YXRlX3R5cGU+CisgIC8vIHRyYWl0c190eXBlOjpvZmZfdHlwZSBtdXN0IGJlIHN0cmVhbW9mZgorICAvLyB0cmFpdHNfdHlwZTo6c3RhdGVfdHlwZSBtdXN0IGJlIEFzc2lnbmFibGUgYW5kIERlZmF1bHRDb25zdHJ1Y3RpYmxlLAorICAvLyBhbmQgdHJhaXRzX3R5cGU6OnN0YXRlX3R5cGUoKSBtdXN0IGJlIHRoZSBpbml0aWFsIHN0YXRlIGZvciBjb2RlY3Z0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfZmlsZWJ1ZiA6IHB1YmxpYyBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gIAlfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ICAgICBfX2ZpbGVidWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19iYXNpY19maWxlPGNoYXI+CQkgICAgICAgIF9fZmlsZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6c3RhdGVfdHlwZSAgICAgICAgICBfX3N0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvZGVjdnQ8Y2hhcl90eXBlLCBjaGFyLCBfX3N0YXRlX3R5cGU+ICAgIF9fY29kZWN2dF90eXBlOworCisgICAgICBmcmllbmQgY2xhc3MgaW9zX2Jhc2U7IC8vIEZvciBzeW5jX3dpdGhfc3RkaW8uCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICAvLyBNVCBsb2NrIGluaGVyaXRlZCBmcm9tIGxpYmlvIG9yIG90aGVyIGxvdy1sZXZlbCBpbyBsaWJyYXJ5LgorICAgICAgX19jX2xvY2sgICAgICAgICAgCV9NX2xvY2s7CisKKyAgICAgIC8vIEV4dGVybmFsIGJ1ZmZlci4KKyAgICAgIF9fZmlsZV90eXBlIAkJX01fZmlsZTsKKworICAgICAgLy8vIFBsYWNlIHRvIHN0YXNoIGluIHx8IG91dCB8fCBpbiB8IG91dCBzZXR0aW5ncyBmb3IgY3VycmVudCBmaWxlYnVmLgorICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIAlfTV9tb2RlOworCisgICAgICAvLyBCZWdpbm5pbmcgc3RhdGUgdHlwZSBmb3IgY29kZWN2dC4KKyAgICAgIF9fc3RhdGVfdHlwZSAJCV9NX3N0YXRlX2JlZzsKKworICAgICAgLy8gRHVyaW5nIG91dHB1dCwgdGhlIHN0YXRlIHRoYXQgY29ycmVzcG9uZHMgdG8gcHB0cigpLAorICAgICAgLy8gZHVyaW5nIGlucHV0LCB0aGUgc3RhdGUgdGhhdCBjb3JyZXNwb25kcyB0byBlZ3B0cigpIGFuZAorICAgICAgLy8gX01fZXh0X25leHQuCisgICAgICBfX3N0YXRlX3R5cGUJCV9NX3N0YXRlX2N1cjsKKworICAgICAgLy8gTm90IHVzZWQgZm9yIG91dHB1dC4gRHVyaW5nIGlucHV0LCB0aGUgc3RhdGUgdGhhdCBjb3JyZXNwb25kcworICAgICAgLy8gdG8gZWJhY2soKSBhbmQgX01fZXh0X2J1Zi4KKyAgICAgIF9fc3RhdGVfdHlwZQkJX01fc3RhdGVfbGFzdDsKKworICAgICAgLy8vIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBpbnRlcm5hbCBidWZmZXIuCisgICAgICBjaGFyX3R5cGUqCQlfTV9idWY7IAkKKworICAgICAgLyoqCisgICAgICAgKiAgQWN0dWFsIHNpemUgb2YgaW50ZXJuYWwgYnVmZmVyLiBUaGlzIG51bWJlciBpcyBlcXVhbCB0byB0aGUgc2l6ZQorICAgICAgICogIG9mIHRoZSBwdXQgYXJlYSArIDEgcG9zaXRpb24sIHJlc2VydmVkIGZvciB0aGUgb3ZlcmZsb3cgY2hhciBvZgorICAgICAgICogIGEgZnVsbCBhcmVhLgorICAgICAgICovCisgICAgICBzaXplX3QJCQlfTV9idWZfc2l6ZTsKKworICAgICAgLy8gU2V0IGlmZiBfTV9idWYgaXMgYWxsb2NhdGVkIG1lbW9yeSBmcm9tIF9NX2FsbG9jYXRlX2ludGVybmFsX2J1ZmZlci4KKyAgICAgIGJvb2wJCQlfTV9idWZfYWxsb2NhdGVkOworCisgICAgICAvKioKKyAgICAgICAqICBfTV9yZWFkaW5nID09IGZhbHNlICYmIF9NX3dyaXRpbmcgPT0gZmFsc2UgZm9yIEBiIHVuY29tbWl0dGVkIG1vZGU7CisgICAgICAgKiAgX01fcmVhZGluZyA9PSB0cnVlIGZvciBAYiByZWFkIG1vZGU7CisgICAgICAgKiAgX01fd3JpdGluZyA9PSB0cnVlIGZvciBAYiB3cml0ZSBtb2RlOworICAgICAgICoKKyAgICAgICAqICBOQjogX01fcmVhZGluZyA9PSB0cnVlICYmIF9NX3dyaXRpbmcgPT0gdHJ1ZSBpcyB1bnVzZWQuCisgICAgICAgKi8KKyAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgX01fcmVhZGluZzsKKyAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgX01fd3JpdGluZzsKKworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgTmVjZXNzYXJ5IGJpdHMgZm9yIHB1dGJhY2sgYnVmZmVyIG1hbmFnZW1lbnQuCisgICAgICAgKgorICAgICAgICogIEBub3RlIHBiYWNrcyBvZiBvdmVyIG9uZSBjaGFyYWN0ZXIgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgICAgICovCisgICAgICBjaGFyX3R5cGUJCQlfTV9wYmFjazsKKyAgICAgIGNoYXJfdHlwZSoJCV9NX3BiYWNrX2N1cl9zYXZlOworICAgICAgY2hhcl90eXBlKgkJX01fcGJhY2tfZW5kX3NhdmU7CisgICAgICBib29sCQkJX01fcGJhY2tfaW5pdDsKKyAgICAgIC8vQH0KKworICAgICAgLy8gQ2FjaGVkIGNvZGVjdnQgZmFjZXQuCisgICAgICBjb25zdCBfX2NvZGVjdnRfdHlwZSogCV9NX2NvZGVjdnQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEJ1ZmZlciBmb3IgZXh0ZXJuYWwgY2hhcmFjdGVycy4gVXNlZCBmb3IgaW5wdXQgd2hlbgorICAgICAgICogIGNvZGVjdnQ6OmFsd2F5c19ub2NvbnYoKSA9PSBmYWxzZS4gV2hlbiB2YWxpZCwgdGhpcyBjb3JyZXNwb25kcworICAgICAgICogIHRvIGViYWNrKCkuCisgICAgICAgKi8KKyAgICAgIGNoYXIqCQkJX01fZXh0X2J1ZjsKKworICAgICAgLyoqCisgICAgICAgKiAgU2l6ZSBvZiBidWZmZXIgaGVsZCBieSBfTV9leHRfYnVmLgorICAgICAgICovCisgICAgICBzdHJlYW1zaXplCQlfTV9leHRfYnVmX3NpemU7CisKKyAgICAgIC8qKgorICAgICAgICogIFBvaW50ZXJzIGludG8gdGhlIGJ1ZmZlciBoZWxkIGJ5IF9NX2V4dF9idWYgdGhhdCBkZWxpbWl0IGEKKyAgICAgICAqICBzdWJzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZWFkIGJ1dCBub3QgeWV0IGNvbnZlcnRlZC4KKyAgICAgICAqICBXaGVuIHZhbGlkLCBfTV9leHRfbmV4dCBjb3JyZXNwb25kcyB0byBlZ3B0cigpLgorICAgICAgICovCisgICAgICBjb25zdCBjaGFyKgkJX01fZXh0X25leHQ7CisgICAgICBjaGFyKgkJCV9NX2V4dF9lbmQ7CisKKyAgICAgIC8qKgorICAgICAgICogIEluaXRpYWxpemVzIHBiYWNrIGJ1ZmZlcnMsIGFuZCBtb3ZlcyBub3JtYWwgYnVmZmVycyB0byBzYWZldHkuCisgICAgICAgKiAgQXNzdW1wdGlvbnM6CisgICAgICAgKiAgX01faW5fY3VyIGhhcyBhbHJlYWR5IGJlZW4gbW92ZWQgYmFjaworICAgICAgICovCisgICAgICB2b2lkCisgICAgICBfTV9jcmVhdGVfcGJhY2soKQorICAgICAgeworCWlmICghX01fcGJhY2tfaW5pdCkKKwkgIHsKKwkgICAgX01fcGJhY2tfY3VyX3NhdmUgPSB0aGlzLT5ncHRyKCk7CisJICAgIF9NX3BiYWNrX2VuZF9zYXZlID0gdGhpcy0+ZWdwdHIoKTsKKwkgICAgdGhpcy0+c2V0ZygmX01fcGJhY2ssICZfTV9wYmFjaywgJl9NX3BiYWNrICsgMSk7CisJICAgIF9NX3BiYWNrX2luaXQgPSB0cnVlOworCSAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBEZWFjdGl2YXRlcyBwYmFjayBidWZmZXIgY29udGVudHMsIGFuZCByZXN0b3JlcyBub3JtYWwgYnVmZmVyLgorICAgICAgICogIEFzc3VtcHRpb25zOgorICAgICAgICogIFRoZSBwYmFjayBidWZmZXIgaGFzIG9ubHkgbW92ZWQgZm9yd2FyZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9wYmFjaygpIHRocm93KCkKKyAgICAgIHsKKwlpZiAoX01fcGJhY2tfaW5pdCkKKwkgIHsKKwkgICAgLy8gTGVuZ3RoIF9NX2luX2N1ciBtb3ZlZCBpbiB0aGUgcGJhY2sgYnVmZmVyLgorCSAgICBfTV9wYmFja19jdXJfc2F2ZSArPSB0aGlzLT5ncHRyKCkgIT0gdGhpcy0+ZWJhY2soKTsKKwkgICAgdGhpcy0+c2V0ZyhfTV9idWYsIF9NX3BiYWNrX2N1cl9zYXZlLCBfTV9wYmFja19lbmRfc2F2ZSk7CisJICAgIF9NX3BiYWNrX2luaXQgPSBmYWxzZTsKKwkgIH0KKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIC8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEb2VzIG5vdCBvcGVuIGFueSBmaWxlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgdGhlIHBhcmVudCBjbGFzcyB1c2luZyBpdHMKKyAgICAgICAqICBvd24gZGVmYXVsdCBjdG9yLgorICAgICAgICovCisgICAgICBiYXNpY19maWxlYnVmKCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgVGhlIGRlc3RydWN0b3IgY2xvc2VzIHRoZSBmaWxlIGZpcnN0LgorICAgICAgICovCisgICAgICB2aXJ0dWFsCisgICAgICB+YmFzaWNfZmlsZWJ1ZigpCisgICAgICB7IHRoaXMtPmNsb3NlKCk7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJucyB0cnVlIGlmIHRoZSBleHRlcm5hbCBmaWxlIGlzIG9wZW4uCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGlzX29wZW4oKSBjb25zdCB0aHJvdygpCisgICAgICB7IHJldHVybiBfTV9maWxlLmlzX29wZW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKKyAgICAgICAqCisgICAgICAgKiAgSWYgYSBmaWxlIGlzIGFscmVhZHkgb3BlbiwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBmYWlscy4KKyAgICAgICAqICBPdGhlcndpc2UgaXQgdHJpZXMgdG8gb3BlbiB0aGUgZmlsZSBuYW1lZCBAYSBzIHVzaW5nIHRoZSBmbGFncworICAgICAgICogIGdpdmVuIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIFRhYmxlIDkyLCBhZGFwdGVkIGhlcmUsIGdpdmVzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIG9wZW5tb2RlCisgICAgICAgKiAgY29tYmluYXRpb25zIGFuZCB0aGUgZXF1aXZhbGVudCBmb3BlbigpIGZsYWdzLgorICAgICAgICogIChOQjogbGluZXMgYXBwLCBpbnxvdXR8YXBwLCBpbnxhcHAsIGJpbmFyeXxhcHAsIGJpbmFyeXxpbnxvdXR8YXBwLAorICAgICAgICogIGFuZCBiaW5hcnl8aW58YXBwIHBlciBEUiA1OTYpCisgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqICB8IGlvc19iYXNlIEZsYWcgY29tYmluYXRpb24gICAgICAgICAgICBzdGRpbyBlcXVpdmFsZW50ICAgfAorICAgICAgICogIHxiaW5hcnkgIGluICBvdXQgIHRydW5jICBhcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqICB8ICAgICAgICAgICAgICsgICAgICAgICAgICAgICAgICAgICAgICB3ICAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICAgICAgKyAgICAgICAgICAgKyAgICAgICAgICAgIGEgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICArICAgICAgICAgICAgYSAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgICAgICsgICAgICsgICAgICAgICAgICAgICAgICB3ICAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICArICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICsgICArICAgICAgICAgICAgICAgICAgICAgICAgcisgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgICAgICAgKyAgICsgICAgICsgICAgICAgICAgICAgICAgICB3KyAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICAgICAgICArICAgKyAgICAgICAgICAgKyAgICAgICAgICAgIGErICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICAgICAgICsgICAgICAgICAgICAgICArICAgICAgICAgICAgYSsgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogIHwgICArICAgICAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgIHdiICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICAgICArICAgICAgICAgICArICAgICAgICAgICAgYWIgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgICAgICAgICAgICAgICAgICsgICAgICAgICAgICBhYiAgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICAgICAgKyAgICAgKyAgICAgICAgICAgICAgICAgIHdiICAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmIgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgKyAgICsgICAgICAgICAgICAgICAgICAgICAgICByK2IgICAgICAgICAgICAgICAgfAorICAgICAgICogIHwgICArICAgICArICAgKyAgICAgKyAgICAgICAgICAgICAgICAgIHcrYiAgICAgICAgICAgICAgICB8CisgICAgICAgKiAgfCAgICsgICAgICsgICArICAgICAgICAgICArICAgICAgICAgICAgYStiICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICB8ICAgKyAgICAgKyAgICAgICAgICAgICAgICsgICAgICAgICAgICBhK2IgICAgICAgICAgICAgICAgfAorICAgICAgICogICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKi8KKyAgICAgIF9fZmlsZWJ1Zl90eXBlKgorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIHMgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIG9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSkKKyAgICAgIHsgcmV0dXJuIG9wZW4oX19zLmNfc3RyKCksIF9fbW9kZSk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENsb3NlcyB0aGUgY3VycmVudGx5IGFzc29jaWF0ZWQgZmlsZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICAgICAgICoKKyAgICAgICAqICBJZiBubyBmaWxlIGlzIGN1cnJlbnRseSBvcGVuLCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGZhaWxzLgorICAgICAgICoKKyAgICAgICAqICBJZiBhIDxlbT5wdXQgYnVmZmVyIGFyZWE8L2VtPiBleGlzdHMsIEBjIG92ZXJmbG93KGVvZikgaXMKKyAgICAgICAqICBjYWxsZWQgdG8gZmx1c2ggYWxsIHRoZSBjaGFyYWN0ZXJzLiAgVGhlIGZpbGUgaXMgdGhlbgorICAgICAgICogIGNsb3NlZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW55IG9wZXJhdGlvbnMgZmFpbCwgdGhpcyBmdW5jdGlvbiBhbHNvIGZhaWxzLgorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIGNsb3NlKCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkCisgICAgICBfTV9hbGxvY2F0ZV9pbnRlcm5hbF9idWZmZXIoKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVzdHJveV9pbnRlcm5hbF9idWZmZXIoKSB0aHJvdygpOworCisgICAgICAvLyBbMjcuOC4xLjRdIG92ZXJyaWRkZW4gdmlydHVhbCBmdW5jdGlvbnMKKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZQorICAgICAgc2hvd21hbnljKCk7CisKKyAgICAgIC8vIFN0cm91c3RydXAsIDE5OTgsIHAuIDYyOAorICAgICAgLy8gdW5kZXJmbG93KCkgYW5kIHVmbG93KCkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8gZ2V0IHRoZSBuZXh0CisgICAgICAvLyBjaGFyYWN0ZXIgZnJvbSB0aGUgcmVhbCBpbnB1dCBzb3VyY2Ugd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LgorICAgICAgLy8gQnVmZmVyZWQgaW5wdXQgdXNlcyB1bmRlcmZsb3coKQorCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICB1bmRlcmZsb3coKTsKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IF9UcmFpdHM6OmVvZigpKTsKKworICAgICAgLy8gU3Ryb3VzdHJ1cCwgMTk5OCwgcCA2NDgKKyAgICAgIC8vIFRoZSBvdmVyZmxvdygpIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB0cmFuc2ZlciBjaGFyYWN0ZXJzIHRvIHRoZQorICAgICAgLy8gcmVhbCBvdXRwdXQgZGVzdGluYXRpb24gd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwuIEEgY2FsbCB0bworICAgICAgLy8gb3ZlcmZsb3coYykgb3V0cHV0cyB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBwbHVzIHRoZQorICAgICAgLy8gY2hhcmFjdGVyIGMuCisgICAgICAvLyAyNy41LjIuNC41CisgICAgICAvLyBDb25zdW1lIHNvbWUgc2VxdWVuY2Ugb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHBlbmRpbmcgc2VxdWVuY2UuCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBvdmVyZmxvdyhpbnRfdHlwZSBfX2MgPSBfVHJhaXRzOjplb2YoKSk7CisKKyAgICAgIC8vIENvbnZlcnQgaW50ZXJuYWwgYnl0ZSBzZXF1ZW5jZSB0byBleHRlcm5hbCwgY2hhci1iYXNlZAorICAgICAgLy8gc2VxdWVuY2UgdmlhIGNvZGVjdnQuCisgICAgICBib29sCisgICAgICBfTV9jb252ZXJ0X3RvX2V4dGVybmFsKGNoYXJfdHlwZSosIHN0cmVhbXNpemUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1hbmlwdWxhdGVzIHRoZSBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBzICBQb2ludGVyIHRvIGEgYnVmZmVyIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBuICBTaXplIG9mIEBhIHMuCisgICAgICAgKiAgQHJldHVybiAgQGMgdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBubyBmaWxlIGhhcyBiZWVuIG9wZW5lZCwgYW5kIGJvdGggQGEgcyBhbmQgQGEgbiBhcmUgemVybywgdGhlbgorICAgICAgICogIHRoZSBzdHJlYW0gYmVjb21lcyB1bmJ1ZmZlcmVkLiAgT3RoZXJ3aXNlLCBAYyBzIGlzIHVzZWQgYXMgYQorICAgICAgICogIGJ1ZmZlcjsgc2VlCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjVzMDIuaHRtbAorICAgICAgICogIGZvciBtb3JlLgorICAgICAgICovCisgICAgICB2aXJ0dWFsIF9fc3RyZWFtYnVmX3R5cGUqCisgICAgICBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgdmlydHVhbCBwb3NfdHlwZQorICAgICAgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgICB2aXJ0dWFsIHBvc190eXBlCisgICAgICBzZWVrcG9zKHBvc190eXBlIF9fcG9zLAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKKworICAgICAgLy8gQ29tbW9uIGNvZGUgZm9yIHNlZWtvZmYsIHNlZWtwb3MsIGFuZCBvdmVyZmxvdworICAgICAgcG9zX3R5cGUKKyAgICAgIF9NX3NlZWsob2ZmX3R5cGUgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5LCBfX3N0YXRlX3R5cGUgX19zdGF0ZSk7CisgICAgICAKKyAgICAgIGludAorICAgICAgX01fZ2V0X2V4dF9wb3MoX19zdGF0ZV90eXBlICZfX3N0YXRlKTsKKworICAgICAgdmlydHVhbCBpbnQKKyAgICAgIHN5bmMoKTsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBpbWJ1ZShjb25zdCBsb2NhbGUmIF9fbG9jKTsKKworICAgICAgdmlydHVhbCBzdHJlYW1zaXplCisgICAgICB4c2dldG4oY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgdmlydHVhbCBzdHJlYW1zaXplCisgICAgICB4c3B1dG4oY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKworICAgICAgLy8gRmx1c2hlcyBvdXRwdXQgYnVmZmVyLCB0aGVuIHdyaXRlcyB1bnNoaWZ0IHNlcXVlbmNlLgorICAgICAgYm9vbAorICAgICAgX01fdGVybWluYXRlX291dHB1dCgpOworCisgICAgICAvKioKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBvaW50ZXJzIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIsIGJvdGggZ2V0CisgICAgICAgKiAgYW5kIHB1dCBhcmVhcy4gVHlwaWNhbGx5OgorICAgICAgICoKKyAgICAgICAqICAgX19vZmYgPT0gZWdwdHIoKSAtIGViYWNrKCkgdXBvbiB1bmRlcmZsb3cvdWZsb3cgKEBiIHJlYWQgbW9kZSk7CisgICAgICAgKiAgIF9fb2ZmID09IDAgdXBvbiBvdmVyZmxvdyAoQGIgd3JpdGUgbW9kZSk7CisgICAgICAgKiAgIF9fb2ZmID09IC0xIHVwb24gb3Blbiwgc2V0YnVmLCBzZWVrb2ZmL3BvcyAoQGIgdW5jb21taXR0ZWQgbW9kZSkuCisgICAgICAgKgorICAgICAgICogIE5COiBlcHB0cigpIC0gcGJhc2UoKSA9PSBfTV9idWZfc2l6ZSAtIDEsIHNpbmNlIF9NX2J1Zl9zaXplCisgICAgICAgKiAgcmVmbGVjdHMgdGhlIGFjdHVhbCBhbGxvY2F0ZWQgbWVtb3J5IGFuZCB0aGUgbGFzdCBjZWxsIGlzIHJlc2VydmVkCisgICAgICAgKiAgZm9yIHRoZSBvdmVyZmxvdyBjaGFyIG9mIGEgZnVsbCBwdXQgYXJlYS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgX01fc2V0X2J1ZmZlcihzdHJlYW1zaXplIF9fb2ZmKQorICAgICAgeworIAljb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKyAJY29uc3QgYm9vbCBfX3Rlc3RvdXQgPSBfTV9tb2RlICYgaW9zX2Jhc2U6Om91dDsKKwkKKwlpZiAoX190ZXN0aW4gJiYgX19vZmYgPiAwKQorCSAgdGhpcy0+c2V0ZyhfTV9idWYsIF9NX2J1ZiwgX01fYnVmICsgX19vZmYpOworCWVsc2UKKwkgIHRoaXMtPnNldGcoX01fYnVmLCBfTV9idWYsIF9NX2J1Zik7CisKKwlpZiAoX190ZXN0b3V0ICYmIF9fb2ZmID09IDAgJiYgX01fYnVmX3NpemUgPiAxICkKKwkgIHRoaXMtPnNldHAoX01fYnVmLCBfTV9idWYgKyBfTV9idWZfc2l6ZSAtIDEpOworCWVsc2UKKwkgIHRoaXMtPnNldHAoMCwgMCk7CisgICAgICB9CisgICAgfTsKKworICAvLyBbMjcuOC4xLjVdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lmc3RyZWFtCisgIC8qKgorICAgKiAgQGJyaWVmICBDb250cm9sbGluZyBpbnB1dCBmb3IgZmlsZXMuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gbmFtZWQgZmlsZXMsIHVzaW5nIHRoZSBpbmhlcml0ZWQKKyAgICogIGZ1bmN0aW9ucyBmcm9tIHN0ZDo6YmFzaWNfaXN0cmVhbS4gIFRvIGNvbnRyb2wgdGhlIGFzc29jaWF0ZWQKKyAgICogIHNlcXVlbmNlLCBhbiBpbnN0YW5jZSBvZiBzdGQ6OmJhc2ljX2ZpbGVidWYgaXMgdXNlZCwgd2hpY2ggdGhpcyBwYWdlCisgICAqICByZWZlcnMgdG8gYXMgQGMgc2IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfaWZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hhclQgCQkJCQljaGFyX3R5cGU7CisgICAgICB0eXBlZGVmIF9UcmFpdHMgCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIHR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19maWxlYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+IAlfX2ZpbGVidWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPglfX2lzdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX2ZpbGVidWZfdHlwZQlfTV9maWxlYnVmOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3JzL0Rlc3RydWN0b3JzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBJbml0aWFsaXplcyBAYyBzYiB1c2luZyBpdHMgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYW5kIHBhc3NlcworICAgICAgICogIEBjICZzYiB0byB0aGUgYmFzZSBjbGFzcyBpbml0aWFsaXplci4gIERvZXMgbm90IG9wZW4gYW55IGZpbGVzCisgICAgICAgKiAgKHlvdSBoYXZlbid0IGdpdmVuIGl0IGEgZmlsZW5hbWUgdG8gb3BlbikuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX2lmc3RyZWFtKCkgOiBfX2lzdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGUgYW4gaW5wdXQgZmlsZSBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBzICBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjppbiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIFRpcDogIFdoZW4gdXNpbmcgc3RkOjpzdHJpbmcgdG8gaG9sZCB0aGUgZmlsZW5hbWUsIHlvdSBtdXN0IHVzZQorICAgICAgICogIC5jX3N0cigpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faXN0cmVhbV90eXBlKCksIF9NX2ZpbGVidWYoKQorICAgICAgeworCXRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOworCXRoaXMtPm9wZW4oX19zLCBfX21vZGUpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlIGFuIGlucHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgcyAgc3RkOjpzdHJpbmcgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIGZpbGUgaW4gc3BlY2lmaWVkIG1vZGUgKHNlZSBzdGQ6Omlvc19iYXNlKS4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6OmluIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gQGEgbW9kZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lmc3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbikKKyAgICAgIDogX19pc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7CisJdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7CisJdGhpcy0+b3BlbihfX3MsIF9fbW9kZSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBmaWxlIGlzIGNsb3NlZCBieSB0aGUgZmlsZWJ1ZiBvYmplY3QsIG5vdCB0aGUgZm9ybWF0dGluZworICAgICAgICogIHN0cmVhbS4KKyAgICAgICAqLworICAgICAgfmJhc2ljX2lmc3RyZWFtKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGJhc2ljX2ZpbGVidWYgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGhpZGVzIGJvdGggc2lnbmF0dXJlcyBvZiBzdGQ6OmJhc2ljX2lvczo6cmRidWYoKS4KKyAgICAgICAqLworICAgICAgX19maWxlYnVmX3R5cGUqCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PF9fZmlsZWJ1Zl90eXBlKj4oJl9NX2ZpbGVidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgV3JhcHBlciB0byB0ZXN0IGZvciBhbiBvcGVuIGZpbGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgcmRidWYoKS0+aXNfb3BlbigpCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIGlzX29wZW4oKQorICAgICAgeyByZXR1cm4gX01fZmlsZWJ1Zi5pc19vcGVuKCk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzY1LiBMYWNrIG9mIGNvbnN0LXF1YWxpZmljYXRpb24gaW4gY2xhdXNlIDI3CisgICAgICBib29sCisgICAgICBpc19vcGVuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGVidWYuaXNfb3BlbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgT3BlbnMgYW4gZXh0ZXJuYWwgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIHMgIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgVGhlIG9wZW4gbW9kZSBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgc3RkOjpiYXNpY19maWxlYnVmOjpvcGVuKHMsbW9kZXxpbikuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6aW4pKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6b3BlbihzLG1vZGV8aW4pLiAgSWYgdGhhdCBmdW5jdGlvbgorICAgICAgICogIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIF9fcywgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbikKKyAgICAgIHsKKwlpZiAoIV9NX2ZpbGVidWYub3BlbihfX3MsIF9fbW9kZSB8IGlvc19iYXNlOjppbikpCisJICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJZWxzZQorCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gNDA5LiBDbG9zaW5nIGFuIGZzdHJlYW0gc2hvdWxkIGNsZWFyIGVycm9yIHN0YXRlCisJICB0aGlzLT5jbGVhcigpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2xvc2UgdGhlIGZpbGUuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6Y2xvc2UoKS4gIElmIHRoYXQgZnVuY3Rpb24KKyAgICAgICAqICBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbG9zZSgpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLmNsb3NlKCkpCisJICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICB9CisgICAgfTsKKworCisgIC8vIFsyNy44LjEuOF0gVGVtcGxhdGUgY2xhc3MgYmFzaWNfb2ZzdHJlYW0KKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnRyb2xsaW5nIG91dHB1dCBmb3IgZmlsZXMuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gbmFtZWQgZmlsZXMsIHVzaW5nIHRoZSBpbmhlcml0ZWQKKyAgICogIGZ1bmN0aW9ucyBmcm9tIHN0ZDo6YmFzaWNfb3N0cmVhbS4gIFRvIGNvbnRyb2wgdGhlIGFzc29jaWF0ZWQKKyAgICogIHNlcXVlbmNlLCBhbiBpbnN0YW5jZSBvZiBzdGQ6OmJhc2ljX2ZpbGVidWYgaXMgdXNlZCwgd2hpY2ggdGhpcyBwYWdlCisgICAqICByZWZlcnMgdG8gYXMgQGMgc2IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfb2ZzdHJlYW0gOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxfQ2hhclQsX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gCV9fZmlsZWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9fb3N0cmVhbV90eXBlOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9fZmlsZWJ1Zl90eXBlCV9NX2ZpbGVidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhbmQgcGFzc2VzCisgICAgICAgKiAgQGMgJnNiIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3Qgb3BlbiBhbnkgZmlsZXMKKyAgICAgICAqICAoeW91IGhhdmVuJ3QgZ2l2ZW4gaXQgYSBmaWxlbmFtZSB0byBvcGVuKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfb2ZzdHJlYW0oKTogX19vc3RyZWFtX3R5cGUoKSwgX01fZmlsZWJ1ZigpCisgICAgICB7IHRoaXMtPmluaXQoJl9NX2ZpbGVidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ3JlYXRlIGFuIG91dHB1dCBmaWxlIHN0cmVhbS4KKyAgICAgICAqICBAcGFyYW0gIHMgIE51bGwgdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIGZpbGUgaW4gc3BlY2lmaWVkIG1vZGUgKHNlZSBzdGQ6Omlvc19iYXNlKS4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6Om91dHxpb3NfYmFzZTo6dHJ1bmMgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbgorICAgICAgICogIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIFRpcDogIFdoZW4gdXNpbmcgc3RkOjpzdHJpbmcgdG8gaG9sZCB0aGUgZmlsZW5hbWUsIHlvdSBtdXN0IHVzZQorICAgICAgICogIC5jX3N0cigpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19vZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsCisJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXR8aW9zX2Jhc2U6OnRydW5jKQorICAgICAgOiBfX29zdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBzICBzdGQ6OnN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gZmlsZSBpbiBzcGVjaWZpZWQgbW9kZSAoc2VlIHN0ZDo6aW9zX2Jhc2UpLgorICAgICAgICoKKyAgICAgICAqICBAYyBpb3NfYmFzZTo6b3V0fGlvc19iYXNlOjp0cnVuYyBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluCisgICAgICAgKiAgQGEgbW9kZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX29mc3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJCSAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXR8aW9zX2Jhc2U6OnRydW5jKQorICAgICAgOiBfX29zdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBmaWxlYnVmIG9iamVjdCwgbm90IHRoZSBmb3JtYXR0aW5nCisgICAgICAgKiAgc3RyZWFtLgorICAgICAgICovCisgICAgICB+YmFzaWNfb2ZzdHJlYW0oKQorICAgICAgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgYmFzaWNfZmlsZWJ1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgICovCisgICAgICBfX2ZpbGVidWZfdHlwZSoKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X19maWxlYnVmX3R5cGUqPigmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBXcmFwcGVyIHRvIHRlc3QgZm9yIGFuIG9wZW4gZmlsZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyByZGJ1ZigpLT5pc19vcGVuKCkKKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpCisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzNjUuIExhY2sgb2YgY29uc3QtcXVhbGlmaWNhdGlvbiBpbiBjbGF1c2UgMjcKKyAgICAgIGJvb2wKKyAgICAgIGlzX29wZW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZmlsZWJ1Zi5pc19vcGVuKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4ocyxtb2RlfG91dHx0cnVuYykuICBJZiB0aGF0CisgICAgICAgKiAgZnVuY3Rpb24gZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGlwOiAgV2hlbiB1c2luZyBzdGQ6OnN0cmluZyB0byBob2xkIHRoZSBmaWxlbmFtZSwgeW91IG11c3QgdXNlCisgICAgICAgKiAgLmNfc3RyKCkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX3MsCisJICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6dHJ1bmMpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUgfCBpb3NfYmFzZTo6b3V0KSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4ocyxtb2RlfG91dHx0cnVuYykuICBJZiB0aGF0CisgICAgICAgKiAgZnVuY3Rpb24gZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgb3Blbihjb25zdCBzdGQ6OnN0cmluZyYgX19zLAorCSAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0IHwgaW9zX2Jhc2U6OnRydW5jKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlIHwgaW9zX2Jhc2U6Om91dCkpCisJICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisJZWxzZQorCSAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCSAgLy8gNDA5LiBDbG9zaW5nIGFuIGZzdHJlYW0gc2hvdWxkIGNsZWFyIGVycm9yIHN0YXRlCisJICB0aGlzLT5jbGVhcigpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2xvc2UgdGhlIGZpbGUuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6Y2xvc2UoKS4gIElmIHRoYXQgZnVuY3Rpb24KKyAgICAgICAqICBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBjbG9zZSgpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLmNsb3NlKCkpCisJICB0aGlzLT5zZXRzdGF0ZShpb3NfYmFzZTo6ZmFpbGJpdCk7CisgICAgICB9CisgICAgfTsKKworCisgIC8vIFsyNy44LjEuMTFdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX2ZzdHJlYW0KKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnRyb2xsaW5nIGlucHV0IGFuZCBvdXRwdXQgZm9yIGZpbGVzLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIFRoaXMgY2xhc3Mgc3VwcG9ydHMgcmVhZGluZyBmcm9tIGFuZCB3cml0aW5nIHRvIG5hbWVkIGZpbGVzLCB1c2luZworICAgKiAgdGhlIGluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbSBzdGQ6OmJhc2ljX2lvc3RyZWFtLiAgVG8gY29udHJvbCB0aGUKKyAgICogIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfZmlsZWJ1ZiBpcyB1c2VkLCB3aGljaAorICAgKiAgdGhpcyBwYWdlIHJlZmVycyB0byBhcyBAYyBzYi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19mc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gCV9fZmlsZWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pb3M8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JCV9faW9zX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+CV9faW9zdHJlYW1fdHlwZTsKKworICAgIHByaXZhdGU6CisgICAgICBfX2ZpbGVidWZfdHlwZQlfTV9maWxlYnVmOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3I6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhbmQgcGFzc2VzCisgICAgICAgKiAgQGMgJnNiIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3Qgb3BlbiBhbnkgZmlsZXMKKyAgICAgICAqICAoeW91IGhhdmVuJ3QgZ2l2ZW4gaXQgYSBmaWxlbmFtZSB0byBvcGVuKS4KKyAgICAgICAqLworICAgICAgYmFzaWNfZnN0cmVhbSgpCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgpLCBfTV9maWxlYnVmKCkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fZmlsZWJ1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDcmVhdGUgYW4gaW5wdXQvb3V0cHV0IGZpbGUgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgcyAgTnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmaWxlbmFtZS4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gZmlsZSBpbiBzcGVjaWZpZWQgbW9kZSAoc2VlIHN0ZDo6aW9zX2Jhc2UpLgorICAgICAgICoKKyAgICAgICAqICBUaXA6ICBXaGVuIHVzaW5nIHN0ZDo6c3RyaW5nIHRvIGhvbGQgdGhlIGZpbGVuYW1lLCB5b3UgbXVzdCB1c2UKKyAgICAgICAqICAuY19zdHIoKSBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfZnN0cmVhbShjb25zdCBjaGFyKiBfX3MsCisJCSAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19pb3N0cmVhbV90eXBlKDApLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENyZWF0ZSBhbiBpbnB1dC9vdXRwdXQgZmlsZSBzdHJlYW0uCisgICAgICAgKiAgQHBhcmFtICBzICBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGZpbGVuYW1lLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBmaWxlIGluIHNwZWNpZmllZCBtb2RlIChzZWUgc3RkOjppb3NfYmFzZSkuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19mc3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJCSAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19pb3N0cmVhbV90eXBlKDApLCBfTV9maWxlYnVmKCkKKyAgICAgIHsKKwl0aGlzLT5pbml0KCZfTV9maWxlYnVmKTsKKwl0aGlzLT5vcGVuKF9fcywgX19tb2RlKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGZpbGUgaXMgY2xvc2VkIGJ5IHRoZSBmaWxlYnVmIG9iamVjdCwgbm90IHRoZSBmb3JtYXR0aW5nCisgICAgICAgKiAgc3RyZWFtLgorICAgICAgICovCisgICAgICB+YmFzaWNfZnN0cmVhbSgpCisgICAgICB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBiYXNpY19maWxlYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAgKi8KKyAgICAgIF9fZmlsZWJ1Zl90eXBlKgorICAgICAgcmRidWYoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfX2ZpbGVidWZfdHlwZSo+KCZfTV9maWxlYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFdyYXBwZXIgdG8gdGVzdCBmb3IgYW4gb3BlbiBmaWxlLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPmlzX29wZW4oKQorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc19vcGVuKCkKKyAgICAgIHsgcmV0dXJuIF9NX2ZpbGVidWYuaXNfb3BlbigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM2NS4gTGFjayBvZiBjb25zdC1xdWFsaWZpY2F0aW9uIGluIGNsYXVzZSAyNworICAgICAgYm9vbAorICAgICAgaXNfb3BlbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9maWxlYnVmLmlzX29wZW4oKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE9wZW5zIGFuIGV4dGVybmFsIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIFRoZSBvcGVuIG1vZGUgZmxhZ3MuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHN0ZDo6YmFzaWNfZmlsZWJ1Zjo6b3BlbihzLG1vZGUpLiAgSWYgdGhhdAorICAgICAgICogIGZ1bmN0aW9uIGZhaWxzLCBAYyBmYWlsYml0IGlzIHNldCBpbiB0aGUgc3RyZWFtJ3MgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIFRpcDogIFdoZW4gdXNpbmcgc3RkOjpzdHJpbmcgdG8gaG9sZCB0aGUgZmlsZW5hbWUsIHlvdSBtdXN0IHVzZQorICAgICAgICogIC5jX3N0cigpIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIG9wZW4oY29uc3QgY2hhciogX19zLAorCSAgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5vcGVuKF9fcywgX19tb2RlKSkKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpmYWlsYml0KTsKKwllbHNlCisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA0MDkuIENsb3NpbmcgYW4gZnN0cmVhbSBzaG91bGQgY2xlYXIgZXJyb3Igc3RhdGUKKwkgIHRoaXMtPmNsZWFyKCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBPcGVucyBhbiBleHRlcm5hbCBmaWxlLgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBUaGUgb3BlbiBtb2RlIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6Om9wZW4ocyxtb2RlKS4gIElmIHRoYXQKKyAgICAgICAqICBmdW5jdGlvbiBmYWlscywgQGMgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBvcGVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3MsCisJICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7CisJaWYgKCFfTV9maWxlYnVmLm9wZW4oX19zLCBfX21vZGUpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworCWVsc2UKKwkgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKwkgIC8vIDQwOS4gQ2xvc2luZyBhbiBmc3RyZWFtIHNob3VsZCBjbGVhciBlcnJvciBzdGF0ZQorCSAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENsb3NlIHRoZSBmaWxlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyBzdGQ6OmJhc2ljX2ZpbGVidWY6OmNsb3NlKCkuICBJZiB0aGF0IGZ1bmN0aW9uCisgICAgICAgKiAgZmFpbHMsIEBjIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgY2xvc2UoKQorICAgICAgeworCWlmICghX01fZmlsZWJ1Zi5jbG9zZSgpKQorCSAgdGhpcy0+c2V0c3RhdGUoaW9zX2Jhc2U6OmZhaWxiaXQpOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvZnN0cmVhbS50Y2M+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9GU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2Z1bmN0aW9uYWwgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2Z1bmN0aW9uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViZWU4MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvZnVuY3Rpb25hbApAQCAtMCwwICsxLDIyNzEgQEAKKy8vIDxmdW5jdGlvbmFsPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsCisvLyAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9mdW5jdGlvbmFsCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0ZVTkNUSU9OQUwKKyNkZWZpbmUgX0dMSUJDWFhfRlVOQ1RJT05BTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGV4Y2VwdC5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3Rpb25hbF9oYXNoLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKHJlc3VsdF90eXBlKQorCisgIC8vLyBJZiB3ZSBoYXZlIGZvdW5kIGEgcmVzdWx0X3R5cGUsIGV4dHJhY3QgaXQuCisgIHRlbXBsYXRlPGJvb2wgX0hhc19yZXN1bHRfdHlwZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9NYXliZV9nZXRfcmVzdWx0X3R5cGUKKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9NYXliZV9nZXRfcmVzdWx0X3R5cGU8dHJ1ZSwgX0Z1bmN0b3I+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIF9GdW5jdG9yOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsgfTsKKworICAvKioKKyAgICogIEJhc2UgY2xhc3MgZm9yIGFueSBmdW5jdGlvbiBvYmplY3QgdGhhdCBoYXMgYSB3ZWFrIHJlc3VsdCB0eXBlLCBhcworICAgKiAgZGVmaW5lZCBpbiAzLjMvMyBvZiBUUjEuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsCisgICAgOiBfTWF5YmVfZ2V0X3Jlc3VsdF90eXBlPF9faGFzX3Jlc3VsdF90eXBlPF9GdW5jdG9yPjo6dmFsdWUsIF9GdW5jdG9yPgorICAgIHsgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4uLi4pIHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoX0FyZ1R5cGVzLi4uLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHJlZmVyZW5jZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoJikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygmKShfQXJnVHlwZXMuLi4uLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoKikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygqKShfQXJnVHlwZXMuLi4uLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uLi4uKT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgY29uc3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4uLi4pIHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBjb25zdCB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pCisJCQkJICBjb25zdCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLi4uLikKKwkJCQkgIGNvbnN0IHZvbGF0aWxlPgorICAgIHsgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOyB9OworCisgIC8qKgorICAgKiAgU3RyaXAgdG9wLWxldmVsIGN2LXF1YWxpZmllcnMgZnJvbSB0aGUgZnVuY3Rpb24gb2JqZWN0IGFuZCBsZXQKKyAgICogIF9XZWFrX3Jlc3VsdF90eXBlX2ltcGwgcGVyZm9ybSB0aGUgcmVhbCB3b3JrLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGUKKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8dHlwZW5hbWUgcmVtb3ZlX2N2PF9GdW5jdG9yPjo6dHlwZT4KKyAgICB7IH07CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIHR5cGUgX1RwIGRlcml2ZXMgZnJvbSB1bmFyeV9mdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRGVyaXZlc19mcm9tX3VuYXJ5X2Z1bmN0aW9uIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1Jlcz4KKwlzdGF0aWMgX19vbmUgX190ZXN0KGNvbnN0IHZvbGF0aWxlIHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4qKTsKKworICAgICAgLy8gSXQncyB0ZW1wdGluZyB0byBjaGFuZ2UgIi4uLiIgdG8gY29uc3Qgdm9sYXRpbGUgdm9pZCosIGJ1dAorICAgICAgLy8gdGhhdCBmYWlscyB3aGVuIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3QoKF9UcCopMCkpID09IDE7CisgICAgfTsKKworICAvLy8gRGV0ZXJtaW5lcyBpZiB0aGUgdHlwZSBfVHAgZGVyaXZlcyBmcm9tIGJpbmFyeV9mdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRGVyaXZlc19mcm9tX2JpbmFyeV9mdW5jdGlvbiA6IF9fc2ZpbmFlX3R5cGVzCisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMiwgdHlwZW5hbWUgX1Jlcz4KKwlzdGF0aWMgX19vbmUgX190ZXN0KGNvbnN0IHZvbGF0aWxlIGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4qKTsKKworICAgICAgLy8gSXQncyB0ZW1wdGluZyB0byBjaGFuZ2UgIi4uLiIgdG8gY29uc3Qgdm9sYXRpbGUgdm9pZCosIGJ1dAorICAgICAgLy8gdGhhdCBmYWlscyB3aGVuIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUuCisgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3QoKF9UcCopMCkpID09IDE7CisgICAgfTsKKworICAvKioKKyAgICogSW52b2tlIGEgZnVuY3Rpb24gb2JqZWN0LCB3aGljaCBtYXkgYmUgZWl0aGVyIGEgbWVtYmVyIHBvaW50ZXIgb3IgYQorICAgKiBmdW5jdGlvbiBvYmplY3QuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgd2lsbCB0ZWxsIHdoaWNoLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKwkgICAgICghaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorCSAgICAgICYmICFpc19mdW5jdGlvbjxfRnVuY3Rvcj46OnZhbHVlCisJICAgICAgJiYgIWlzX2Z1bmN0aW9uPHR5cGVuYW1lIHJlbW92ZV9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZT46OnZhbHVlKSwKKwkgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncyYmLi4uKT46OnR5cGUKKwkgICA+Ojp0eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3ImIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fZihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAgICAgIChpc19tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj46OnZhbHVlCisgICAgICAgICAgICAgICYmICFpc19mdW5jdGlvbjxfRnVuY3Rvcj46OnZhbHVlCisgICAgICAgICAgICAgICYmICFpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9GdW5jdG9yKF9BcmdzJiYuLi4pPjo6dHlwZQorICAgICAgICAgICA+Ojp0eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3ImIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIG1lbV9mbihfX2YpKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIC8vIFRvIHBpY2sgdXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAodGhhdCB3aWxsIGJlY29tZSBmdW5jdGlvbiBwb2ludGVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKwkgICAgIChpc19wb2ludGVyPF9GdW5jdG9yPjo6dmFsdWUKKwkgICAgICAmJiBpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGU+Ojp2YWx1ZSksCisJICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ3MmJi4uLik+Ojp0eXBlCisJICAgPjo6dHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yIF9fZiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fZihzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEtub3dpbmcgd2hpY2ggb2YgdW5hcnlfZnVuY3Rpb24gYW5kIGJpbmFyeV9mdW5jdGlvbiBfVHAgZGVyaXZlcworICAgKiAgZnJvbSwgZGVyaXZlcyBmcm9tIHRoZSBzYW1lIGFuZCBlbnN1cmVzIHRoYXQgcmVmZXJlbmNlX3dyYXBwZXIKKyAgICogIHdpbGwgaGF2ZSBhIHdlYWsgcmVzdWx0IHR5cGUuIFNlZSBjYXNlcyBiZWxvdy4KKyAgICovCisgIHRlbXBsYXRlPGJvb2wgX1VuYXJ5LCBib29sIF9CaW5hcnksIHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDsKKworICAvLyBOb25lIG9mIHRoZSBuZXN0ZWQgYXJndW1lbnQgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDxmYWxzZSwgZmFsc2UsIF9UcD4KKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlPF9UcD4KKyAgICB7IH07CisKKyAgLy8gTmVzdGVkIGFyZ3VtZW50X3R5cGUgb25seS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPHRydWUsIGZhbHNlLCBfVHA+CisgICAgOiBfV2Vha19yZXN1bHRfdHlwZTxfVHA+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OmFyZ3VtZW50X3R5cGUgYXJndW1lbnRfdHlwZTsKKyAgICB9OworCisgIC8vIE5lc3RlZCBmaXJzdF9hcmd1bWVudF90eXBlIGFuZCBzZWNvbmRfYXJndW1lbnRfdHlwZSBvbmx5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8ZmFsc2UsIHRydWUsIF9UcD4KKyAgICA6IF9XZWFrX3Jlc3VsdF90eXBlPF9UcD4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6Zmlyc3RfYXJndW1lbnRfdHlwZSBmaXJzdF9hcmd1bWVudF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIH07CisKKyAgLy8gQWxsIHRoZSBuZXN0ZWQgYXJndW1lbnQgdHlwZXMuCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8dHJ1ZSwgdHJ1ZSwgX1RwPgorICAgIDogX1dlYWtfcmVzdWx0X3R5cGU8X1RwPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RwOjphcmd1bWVudF90eXBlIGFyZ3VtZW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcDo6Zmlyc3RfYXJndW1lbnRfdHlwZSBmaXJzdF9hcmd1bWVudF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnNlY29uZF9hcmd1bWVudF90eXBlIHNlY29uZF9hcmd1bWVudF90eXBlOworICAgIH07CisKKyAgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKGFyZ3VtZW50X3R5cGUpCisgIF9HTElCQ1hYX0hBU19ORVNURURfVFlQRShmaXJzdF9hcmd1bWVudF90eXBlKQorICBfR0xJQkNYWF9IQVNfTkVTVEVEX1RZUEUoc2Vjb25kX2FyZ3VtZW50X3R5cGUpCisKKyAgLyoqCisgICAqICBEZXJpdmVzIGZyb20gdW5hcnlfZnVuY3Rpb24gb3IgYmluYXJ5X2Z1bmN0aW9uIHdoZW4gaXQKKyAgICogIGNhbi4gU3BlY2lhbGl6YXRpb25zIGhhbmRsZSBhbGwgb2YgdGhlIGVhc3kgY2FzZXMuIFRoZSBwcmltYXJ5CisgICAqICB0ZW1wbGF0ZSBkZXRlcm1pbmVzIHdoYXQgdG8gZG8gd2l0aCBhIGNsYXNzIHR5cGUsIHdoaWNoIG1heQorICAgKiAgZGVyaXZlIGZyb20gYm90aCB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlCisgICAgOiBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPAorICAgICAgX19oYXNfYXJndW1lbnRfdHlwZTxfVHA+Ojp2YWx1ZSwKKyAgICAgIF9faGFzX2ZpcnN0X2FyZ3VtZW50X3R5cGU8X1RwPjo6dmFsdWUKKyAgICAgICYmIF9faGFzX3NlY29uZF9hcmd1bWVudF90eXBlPF9UcD46OnZhbHVlLAorICAgICAgX1RwPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAodW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxKSBjb25zdD4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSkgdm9sYXRpbGU+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzKF9UMSwgX1QyKSBjb25zdD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxfVDEsIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoX1QxLCBfVDIpIHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgKHVuYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoKikoX1QxKT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcygqKShfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgbm8gcXVhbGlmaWVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCk+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBubyBxdWFsaWZpZXJzKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCkgY29uc3Q+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKSBjb25zdD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpIHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMikgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgUHJpbWFyeSBjbGFzcyB0ZW1wbGF0ZSBmb3IgcmVmZXJlbmNlX3dyYXBwZXIuCisgICAqICBAaW5ncm91cCBmdW5jdG9ycworICAgKiAgQHsKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcgorICAgIDogcHVibGljIF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsKKyAgICAgIF9UcCogX01fZGF0YTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyKF9UcCYgX19pbmRhdGEpCisgICAgICA6IF9NX2RhdGEoc3RkOjpfX2FkZHJlc3NvZihfX2luZGF0YSkpCisgICAgICB7IH0KKworICAgICAgcmVmZXJlbmNlX3dyYXBwZXIoX1RwJiYpID0gZGVsZXRlOworCisgICAgICByZWZlcmVuY2Vfd3JhcHBlcihjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+JiBfX2lucmVmKToKKyAgICAgIF9NX2RhdGEoX19pbnJlZi5fTV9kYXRhKQorICAgICAgeyB9CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4mIF9faW5yZWYpCisgICAgICB7CisJX01fZGF0YSA9IF9faW5yZWYuX01fZGF0YTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG9wZXJhdG9yIF9UcCYoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0KCk7IH0KKworICAgICAgX1RwJgorICAgICAgZ2V0KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9kYXRhOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXR5cGVuYW1lIHJlc3VsdF9vZjxfVHAmKF9BcmdzJiYuLi4pPjo6dHlwZQorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9faW52b2tlKGdldCgpLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKyAgICB9OworCisKKyAgLy8vIERlbm90ZXMgYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHRha2VuIHRvIGEgdmFyaWFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorICAgIHJlZihfVHAmIF9fdCkKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+KF9fdCk7IH0KKworICAvLy8gRGVub3RlcyBhIGNvbnN0IHJlZmVyZW5jZSBzaG91bGQgYmUgdGFrZW4gdG8gYSB2YXJpYWJsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+CisgICAgY3JlZihjb25zdCBfVHAmIF9fdCkKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+KF9fdCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgdm9pZCByZWYoY29uc3QgX1RwJiYpID0gZGVsZXRlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkIGNyZWYoY29uc3QgX1RwJiYpID0gZGVsZXRlOworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKyAgICByZWYocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3QpCisgICAgeyByZXR1cm4gcmVmKF9fdC5nZXQoKSk7IH0KKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSByZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCBfVHA+CisgICAgY3JlZihyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCkKKyAgICB7IHJldHVybiBjcmVmKF9fdC5nZXQoKSk7IH0KKworICAvLyBAfSBncm91cCBmdW5jdG9ycworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXJQb2ludGVyPgorICAgIGNsYXNzIF9NZW1fZm47CisKKyAgLyoqCisgICAqIERlcml2ZXMgZnJvbSBAYyB1bmFyeV9mdW5jdGlvbiBvciBAYyBiaW5hcnlfZnVuY3Rpb24sIG9yIHBlcmhhcHMKKyAgICogbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLiBUaGUKKyAgICogcHJpbWFyeSB0ZW1wbGF0ZSBpcyB0aGUgYmFzaXMgY2FzZSwgd2hpY2ggZGVyaXZlcyBub3RoaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uIHsgfTsKKworICAvLy8gRGVyaXZlcyBmcm9tIEBjIHVuYXJ5X2Z1bmN0aW9uLCBhcyBhcHByb3ByaWF0ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMT4KKyAgICA6IHN0ZDo6dW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPiB7IH07CisKKyAgLy8vIERlcml2ZXMgZnJvbSBAYyBiaW5hcnlfZnVuY3Rpb24sIGFzIGFwcHJvcHJpYXRlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBfVDEsIF9UMj4KKyAgICA6IHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPiB7IH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9DbGFzcyosIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJX1JlcworCV9NX2NhbGwoX1RwJiBfX29iamVjdCwgY29uc3Qgdm9sYXRpbGUgX0NsYXNzICosCisJCV9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKShfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMKKwlvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwKKwkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Z1bmN0b3IgX19wbWY7CisgICAgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgY29uc3QgX0NsYXNzKiwKKwkJCQkJICAgICBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIChfQ2xhc3M6OipfRnVuY3RvcikoX0FyZ1R5cGVzLi4uKSBjb25zdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLAorCQlfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlfUmVzCisJX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzKiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlfUmVzIG9wZXJhdG9yKCkoX1RwJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gX01fY2FsbChfX29iamVjdCwgJl9fb2JqZWN0LAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworCX0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBAYyBtZW1fZm4gZm9yIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCB2b2xhdGlsZSBfQ2xhc3MqLAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJX1JlcworCV9NX2NhbGwoX1RwJiBfX29iamVjdCwgY29uc3Qgdm9sYXRpbGUgX0NsYXNzICosCisJCV9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKwl7IHJldHVybiAoKCpfX3B0cikuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkodm9sYXRpbGUgX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKSh2b2xhdGlsZSBfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBzbWFydCBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMgdG8gZGVyaXZlZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMKKwlvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwKKwkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Z1bmN0b3IgX19wbWY7CisgICAgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBjb25zdCB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIGNvbnN0IHZvbGF0aWxlPgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgY29uc3Qgdm9sYXRpbGUgX0NsYXNzKiwKKwkJCQkJICAgICBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIChfQ2xhc3M6OipfRnVuY3RvcikoX0FyZ1R5cGVzLi4uKSBjb25zdCB2b2xhdGlsZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMKKwlfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLAorCQlfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorCXsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlfUmVzCisJX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisJeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9DbGFzcyYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0NsYXNzKiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC0+Kl9fcG1mKShzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlfUmVzIG9wZXJhdG9yKCkoX1RwJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKwl7CisJICByZXR1cm4gX01fY2FsbChfX29iamVjdCwgJl9fb2JqZWN0LAorCSAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworCX0KKworICAgIHByaXZhdGU6CisgICAgICBfRnVuY3RvciBfX3BtZjsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbgorICAgIHsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbjxfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyBfQ2xhc3M6Oio+CisgICAgeworICAgICAgLy8gVGhpcyBiaXQgb2YgZ2VuaXVzIGlzIGR1ZSB0byBQZXRlciBEaW1vdiwgaW1wcm92ZWQgc2xpZ2h0bHkgYnkKKyAgICAgIC8vIERvdWdsYXMgR3JlZ29yLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCV9SZXMmCisJX01fY2FsbChfVHAmIF9fb2JqZWN0LCBfQ2xhc3MgKikgY29uc3QKKwl7IHJldHVybiBfX29iamVjdC4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKwlfUmVzJgorCV9NX2NhbGwoX1RwJiBfX29iamVjdCwgX1VwICogY29uc3QgKikgY29uc3QKKwl7IHJldHVybiAoKl9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKwljb25zdCBfUmVzJgorCV9NX2NhbGwoX1RwJiBfX29iamVjdCwgY29uc3QgX1VwICogY29uc3QgKikgY29uc3QKKwl7IHJldHVybiAoKl9fb2JqZWN0KS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJY29uc3QgX1JlcyYKKwlfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IF9DbGFzcyAqKSBjb25zdAorCXsgcmV0dXJuIF9fb2JqZWN0LipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwljb25zdCBfUmVzJgorCV9NX2NhbGwoX1RwJiBfX3B0ciwgY29uc3Qgdm9sYXRpbGUgdm9pZCopIGNvbnN0CisJeyByZXR1cm4gKCpfX3B0cikuKl9fcG07IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGF0aWMgX1RwJiBfX2dldF9yZWYoKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCXN0YXRpYyBfX3NmaW5hZV90eXBlczo6X19vbmUgX19jaGVja19jb25zdChfVHAmLCBfQ2xhc3MqKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorCXN0YXRpYyBfX3NmaW5hZV90eXBlczo6X19vbmUgX19jaGVja19jb25zdChfVHAmLCBfVXAgKiBjb25zdCAqKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorCXN0YXRpYyBfX3NmaW5hZV90eXBlczo6X190d28gX19jaGVja19jb25zdChfVHAmLCBjb25zdCBfVXAgKiBjb25zdCAqKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fdHdvIF9fY2hlY2tfY29uc3QoX1RwJiwgY29uc3QgX0NsYXNzKik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RhdGljIF9fc2ZpbmFlX3R5cGVzOjpfX3R3byBfX2NoZWNrX2NvbnN0KF9UcCYsIGNvbnN0IHZvbGF0aWxlIHZvaWQqKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwlzdHJ1Y3QgX1Jlc3VsdF90eXBlCisJOiBfTWVtX2ZuX2NvbnN0X29yX25vbjxfUmVzLAorCSAgKHNpemVvZihfX3NmaW5hZV90eXBlczo6X190d28pCisJICAgPT0gc2l6ZW9mKF9fY2hlY2tfY29uc3Q8X1RwPihfX2dldF9yZWY8X1RwPigpLCAoX1RwKikwKSkpPgorCXsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKwlzdHJ1Y3QgcmVzdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNZW0sIHR5cGVuYW1lIF9UcD4KKwlzdHJ1Y3QgcmVzdWx0PF9DVk1lbShfVHApPgorCTogcHVibGljIF9SZXN1bHRfdHlwZTxfVHA+IHsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTWVtLCB0eXBlbmFtZSBfVHA+CisJc3RydWN0IHJlc3VsdDxfQ1ZNZW0oX1RwJik+CisJOiBwdWJsaWMgX1Jlc3VsdF90eXBlPF9UcD4geyB9OworCisgICAgICBleHBsaWNpdAorICAgICAgX01lbV9mbihfUmVzIF9DbGFzczo6Kl9fcG0pIDogX19wbShfX3BtKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMmCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyYgX19vYmplY3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfX29iamVjdC4qX19wbTsgfQorCisgICAgICBjb25zdCBfUmVzJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MmIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MqIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QtPipfX3BtOyB9CisKKyAgICAgIGNvbnN0IF9SZXMmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfX29iamVjdC0+Kl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzIGFuZCBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJdHlwZW5hbWUgX1Jlc3VsdF90eXBlPF9UcD46OnR5cGUKKwlvcGVyYXRvcigpKF9UcCYgX191bmtub3duKSBjb25zdAorCXsgcmV0dXJuIF9NX2NhbGwoX191bmtub3duLCAmX191bmtub3duKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXMgX0NsYXNzOjoqX19wbTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybnMgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBmb3J3YXJkcyB0byB0aGUgbWVtYmVyCisgICAqICBwb2ludGVyIEBhIHBtLgorICAgKiAgQGluZ3JvdXAgZnVuY3RvcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIGlubGluZSBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+CisgICAgbWVtX2ZuKF9UcCBfQ2xhc3M6OiogX19wbSkKKyAgICB7CisgICAgICByZXR1cm4gX01lbV9mbjxfVHAgX0NsYXNzOjoqPihfX3BtKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBfVHAgaXMgYSBmdW5jdGlvbiBvYmplY3QKKyAgICogIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3ViZXhwcmVzc2lvbiB3aGVuIGV2YWx1YXRpbmcgY2FsbHMgdG8KKyAgICogIGZ1bmN0aW9uIG9iamVjdHMgcmV0dXJuZWQgYnkgYmluZCgpLiBbVFIxIDMuNi4xXQorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb24KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0eXBlIF9UcCBpcyBhIHBsYWNlaG9sZGVyIGluIGEKKyAgICogIGJpbmQoKSBleHByZXNzaW9uIGFuZCwgaWYgc28sIHdoaWNoIHBsYWNlaG9sZGVyIGl0IGlzLiBbVFIxIDMuNi4yXQorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGludCwgMD4KKyAgICB7IH07CisKKyAgLy8vIFRoZSB0eXBlIG9mIHBsYWNlaG9sZGVyIG9iamVjdHMgZGVmaW5lZCBieSBsaWJzdGRjKysuCisgIHRlbXBsYXRlPGludCBfTnVtPiBzdHJ1Y3QgX1BsYWNlaG9sZGVyIHsgfTsKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogQG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVycworICAgKiAgQGJyaWVmIElTTyBDKysgMHggZW50aXRpZXMgc3ViIG5hbWVzcGFjZSBmb3IgZnVuY3Rpb25hbC4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICoKKyAgICogIERlZmluZSBhIGxhcmdlIG51bWJlciBvZiBwbGFjZWhvbGRlcnMuIFRoZXJlIGlzIG5vIHdheSB0bworICAgKiAgc2ltcGxpZnkgdGhpcyB3aXRoIHZhcmlhZGljIHRlbXBsYXRlcywgYmVjYXVzZSB3ZSdyZSBpbnRyb2R1Y2luZworICAgKiAgdW5pcXVlIG5hbWVzIGZvciBlYWNoLgorICAgKi8KKyAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycworICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxPiBfMTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI+IF8yOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Mz4gXzM7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjw0PiBfNDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDU+IF81OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Nj4gXzY7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjw3PiBfNzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDg+IF84OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8OT4gXzk7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxMD4gXzEwOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTE+IF8xMTsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDEyPiBfMTI7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxMz4gXzEzOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTQ+IF8xNDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE1PiBfMTU7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxNj4gXzE2OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MTc+IF8xNzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDE4PiBfMTg7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwxOT4gXzE5OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjA+IF8yMDsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDIxPiBfMjE7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyMj4gXzIyOworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjM+IF8yMzsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI0PiBfMjQ7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyNT4gXzI1OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8MjY+IF8yNjsKKyAgICBleHRlcm4gY29uc3QgX1BsYWNlaG9sZGVyPDI3PiBfMjc7CisgICAgZXh0ZXJuIGNvbnN0IF9QbGFjZWhvbGRlcjwyOD4gXzI4OworICAgIGV4dGVybiBjb25zdCBfUGxhY2Vob2xkZXI8Mjk+IF8yOTsKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0KKworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgUGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBpc19wbGFjZWhvbGRlciB0aGF0IHByb3ZpZGVzIHRoZSBwbGFjZWhvbGRlcgorICAgKiAgbnVtYmVyIGZvciB0aGUgcGxhY2Vob2xkZXIgb2JqZWN0cyBkZWZpbmVkIGJ5IGxpYnN0ZGMrKy4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPGludCBfTnVtPgorICAgIHN0cnVjdCBpc19wbGFjZWhvbGRlcjxfUGxhY2Vob2xkZXI8X051bT4gPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGludCwgX051bT4KKyAgICB7IH07CisKKyAgLyoqCisgICAqIFVzZWQgYnkgX1NhZmVfdHVwbGVfZWxlbWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHR1cGxlCisgICAqIGVsZW1lbnQgYXQgdGhpcyBwb3NpdGlvbi4KKyAgICovCisgIHN0cnVjdCBfTm9fdHVwbGVfZWxlbWVudDsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gaGVscGVyIGZvciBfU2FmZV90dXBsZV9lbGVtZW50LiBUaGlzIHByaW1hcnkKKyAgICogdGVtcGxhdGUgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcyBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX1R1cGxlLCBib29sIF9Jc1NhZmU+CisgICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnRfaW1wbAorICAgIDogdHVwbGVfZWxlbWVudDxfX2ksIF9UdXBsZT4geyB9OworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBoZWxwZXIgZm9yIF9TYWZlX3R1cGxlX2VsZW1lbnQuIFRoaXMgcGFydGlhbAorICAgKiBzcGVjaWFsaXphdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LiBXZSBqdXN0IHJldHVybiBAYyBfTm9fdHVwbGVfZWxlbWVudC4KKyAgICovCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lIF9UdXBsZT4KKyAgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudF9pbXBsPF9faSwgX1R1cGxlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Ob190dXBsZV9lbGVtZW50IHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogTGlrZSB0dXBsZV9lbGVtZW50LCBidXQgcmV0dXJucyBAYyBfTm9fdHVwbGVfZWxlbWVudCB3aGVuCisgICAqIHR1cGxlX2VsZW1lbnQgd291bGQgcmV0dXJuIGFuIGVycm9yLgorICAgKi8KKyB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHVwbGU+CisgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudAorICAgOiBfU2FmZV90dXBsZV9lbGVtZW50X2ltcGw8X19pLCBfVHVwbGUsCisJCQkgICAgICAoX19pID49IDAgJiYgX19pIDwgdHVwbGVfc2l6ZTxfVHVwbGU+Ojp2YWx1ZSk+CisgICB7IH07CisKKyAgLyoqCisgICAqICBNYXBzIGFuIGFyZ3VtZW50IHRvIGJpbmQoKSBpbnRvIGFuIGFjdHVhbCBhcmd1bWVudCB0byB0aGUgYm91bmQKKyAgICogIGZ1bmN0aW9uIG9iamVjdCBbVFIxIDMuNi4zLzVdLiBPbmx5IHRoZSBmaXJzdCBwYXJhbWV0ZXIgc2hvdWxkCisgICAqICBiZSBzcGVjaWZpZWQ6IHRoZSByZXN0IGFyZSB1c2VkIHRvIGRldGVybWluZSBhbW9uZyB0aGUgdmFyaW91cworICAgKiAgaW1wbGVtZW50YXRpb25zLiBOb3RlIHRoYXQsIGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBmdW5jdGlvbgorICAgKiAgb2JqZWN0LCBpdCBpc24ndCBlbnRpcmVseSBub3JtYWwgYmVjYXVzZSBpdCB0YWtlcyBvbmx5IHR3bworICAgKiAgcGFyYW1ldGVycyByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlCisgICAqICBiaW5kIGV4cHJlc3Npb24uIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGJvdW5kIGFyZ3VtZW50IGFuZAorICAgKiAgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSB0dXBsZSBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gdGhlCisgICAqICByZXN0IG9mIHRoZSBhcmd1bWVudHMuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnLAorCSAgIGJvb2wgX0lzQmluZEV4cCA9IGlzX2JpbmRfZXhwcmVzc2lvbjxfQXJnPjo6dmFsdWUsCisJICAgYm9vbCBfSXNQbGFjZWhvbGRlciA9IChpc19wbGFjZWhvbGRlcjxfQXJnPjo6dmFsdWUgPiAwKT4KKyAgICBjbGFzcyBfTXU7CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPiwgcmV0dXJucyB0aGUKKyAgICogIHVuZGVybHlpbmcgcmVmZXJlbmNlLiBbVFIxIDMuNi4zLzUgYnVsbGV0IDFdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX011PHJlZmVyZW5jZV93cmFwcGVyPF9UcD4sIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAmIHJlc3VsdF90eXBlOworCisgICAgICAvKiBOb3RlOiBUaGlzIHdvbid0IGFjdHVhbGx5IHdvcmsgZm9yIGNvbnN0IHZvbGF0aWxlCisgICAgICAgKiByZWZlcmVuY2Vfd3JhcHBlcnMsIGJlY2F1c2UgcmVmZXJlbmNlX3dyYXBwZXI6OmdldCgpIGlzIGNvbnN0CisgICAgICAgKiBidXQgbm90IHZvbGF0aWxlLXF1YWxpZmllZC4gVGhpcyBtaWdodCBiZSBhIGRlZmVjdCBpbiB0aGUgVFIuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DVlJlZiwgdHlwZW5hbWUgX1R1cGxlPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfQ1ZSZWYmIF9fYXJnLCBfVHVwbGUmKSBjb25zdCB2b2xhdGlsZQorCXsgcmV0dXJuIF9fYXJnLmdldCgpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIElmIHRoZSBhcmd1bWVudCBpcyBhIGJpbmQgZXhwcmVzc2lvbiwgd2UgaW52b2tlIHRoZSB1bmRlcmx5aW5nCisgICAqICBmdW5jdGlvbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBjdi1xdWFsaWZpZXJzIGFzIHdlIGFyZSBnaXZlbiBhbmQKKyAgICogIHBhc3MgYWxvbmcgYWxsIG9mIG91ciBhcmd1bWVudHMgKHVud3JhcHBlZCkuIFtUUjEgMy42LjMvNSBidWxsZXQgMl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX011PF9BcmcsIHRydWUsIGZhbHNlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorCWF1dG8KKwlvcGVyYXRvcigpKF9DVkFyZyYgX19hcmcsCisJCSAgIHR1cGxlPF9BcmdzLi4uPiYgX190dXBsZSkgY29uc3Qgdm9sYXRpbGUKKwktPiBkZWNsdHlwZShfX2FyZyhkZWNsdmFsPF9BcmdzPigpLi4uKSkKKwl7CisJICAvLyBDb25zdHJ1Y3QgYW4gaW5kZXggdHVwbGUgYW5kIGZvcndhcmQgdG8gX19jYWxsCisJICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0FyZ3MpPjo6X190eXBlCisJICAgIF9JbmRleGVzOworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbChfX2FyZywgX190dXBsZSwgX0luZGV4ZXMoKSk7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIEludm9rZXMgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0IF9fYXJnIGJ5IHVucGFja2luZyBhbGwKKyAgICAgIC8vIG9mIHRoZSBhcmd1bWVudHMgaW4gdGhlIHR1cGxlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorCWF1dG8KKwlfX2NhbGwoX0NWQXJnJiBfX2FyZywgdHVwbGU8X0FyZ3MuLi4+JiBfX3R1cGxlLAorCSAgICAgICBjb25zdCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+JikgY29uc3Qgdm9sYXRpbGUKKwktPiBkZWNsdHlwZShfX2FyZyhkZWNsdmFsPF9BcmdzPigpLi4uKSkKKwl7CisJICByZXR1cm4gX19hcmcoc3RkOjpmb3J3YXJkPF9BcmdzPihnZXQ8X0luZGV4ZXM+KF9fdHVwbGUpKS4uLik7CisJfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIE50aCBhcmd1bWVudCwgcmV0dXJucworICAgKiAgYSByZWZlcmVuY2UgdG8gdGhlIE50aCBhcmd1bWVudCB0byB0aGUgYmluZCBmdW5jdGlvbiBvYmplY3QuCisgICAqICBbVFIxIDMuNi4zLzUgYnVsbGV0IDNdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9NdTxfQXJnLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gY2xhc3MgcmVzdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNdSwgdHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZSBfVHVwbGU+CisJY2xhc3MgcmVzdWx0PF9DVk11KF9DVkFyZywgX1R1cGxlKT4KKwl7CisJICAvLyBBZGQgYSByZWZlcmVuY2UsIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZSBmb3IgdXMuCisJICAvLyBUaGlzIGFsbG93cyB1cyB0byBiZSBhIGxpdHRsZSBiaXQgc2xvcHB5IGluIGNvbnN0cnVjdGluZworCSAgLy8gdGhlIHR1cGxlIHRoYXQgd2UgcGFzcyB0byByZXN1bHRfb2Y8Li4uPi4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1NhZmVfdHVwbGVfZWxlbWVudDwoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlCisJCQkJCQktIDEpLCBfVHVwbGU+Ojp0eXBlCisJICAgIF9fYmFzZV90eXBlOworCisJcHVibGljOgorCSAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfX2Jhc2VfdHlwZT46OnR5cGUgdHlwZTsKKwl9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHVwbGU+CisJdHlwZW5hbWUgcmVzdWx0PF9NdShfQXJnLCBfVHVwbGUpPjo6dHlwZQorCW9wZXJhdG9yKCkoY29uc3Qgdm9sYXRpbGUgX0FyZyYsIF9UdXBsZSYgX190dXBsZSkgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gc3RkOjpmb3J3YXJkPHR5cGVuYW1lIHJlc3VsdDxfTXUoX0FyZywgX1R1cGxlKT46OnR5cGU+KAorCSAgICAgIDo6c3RkOjpnZXQ8KGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZSAtIDEpPihfX3R1cGxlKSk7CisJfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMganVzdCBhIHZhbHVlLCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoYXQKKyAgICogIHZhbHVlLiBUaGUgY3YtcXVhbGlmaWVycyBvbiB0aGUgcmVmZXJlbmNlIGFyZSB0aGUgc2FtZSBhcyB0aGUKKyAgICogIGN2LXF1YWxpZmllcnMgb24gdGhlIF9NdSBvYmplY3QuIFtUUjEgMy42LjMvNSBidWxsZXQgNF0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Bcmc+CisgICAgY2xhc3MgX011PF9BcmcsIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gc3RydWN0IHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUgX1R1cGxlPgorCXN0cnVjdCByZXN1bHQ8X0NWTXUoX0NWQXJnLCBfVHVwbGUpPgorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgYWRkX2x2YWx1ZV9yZWZlcmVuY2U8X0NWQXJnPjo6dHlwZSB0eXBlOworCX07CisKKyAgICAgIC8vIFBpY2sgdXAgdGhlIGN2LXF1YWxpZmllcnMgb2YgdGhlIGFyZ3VtZW50CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lIF9UdXBsZT4KKwlfQ1ZBcmcmJgorCW9wZXJhdG9yKCkoX0NWQXJnJiYgX19hcmcsIF9UdXBsZSYpIGNvbnN0IHZvbGF0aWxlCisJeyByZXR1cm4gc3RkOjpmb3J3YXJkPF9DVkFyZz4oX19hcmcpOyB9CisgICAgfTsKKworICAvKioKKyAgICogIE1hcHMgbWVtYmVyIHBvaW50ZXJzIGludG8gaW5zdGFuY2VzIG9mIF9NZW1fZm4gYnV0IGxlYXZlcyBhbGwKKyAgICogIG90aGVyIGZ1bmN0aW9uIG9iamVjdHMgdW50b3VjaGVkLiBVc2VkIGJ5IHRyMTo6YmluZCgpLiBUaGUKKyAgICogIHByaW1hcnkgdGVtcGxhdGUgaGFuZGxlcyB0aGUgbm9uLS1tZW1iZXItcG9pbnRlciBjYXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAmCisgICAgICBfX2RvX3dyYXAoY29uc3QgX1RwJiBfX3gpCisgICAgICB7IHJldHVybiBfX3g7IH0KKworICAgICAgc3RhdGljIF9UcCYmCisgICAgICBfX2RvX3dyYXAoX1RwJiYgX194KQorICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwJiY+KF9feCk7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgTWFwcyBtZW1iZXIgcG9pbnRlcnMgaW50byBpbnN0YW5jZXMgb2YgX01lbV9mbiBidXQgbGVhdmVzIGFsbAorICAgKiAgb3RoZXIgZnVuY3Rpb24gb2JqZWN0cyB1bnRvdWNoZWQuIFVzZWQgYnkgdHIxOjpiaW5kKCkuIFRoaXMKKyAgICogIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaGFuZGxlcyB0aGUgbWVtYmVyIHBvaW50ZXIgY2FzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfVHAgX0NsYXNzOjoqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01lbV9mbjxfVHAgX0NsYXNzOjoqPiB0eXBlOworCisgICAgICBzdGF0aWMgdHlwZQorICAgICAgX19kb193cmFwKF9UcCBfQ2xhc3M6OiogX19wbSkKKyAgICAgIHsgcmV0dXJuIHR5cGUoX19wbSk7IH0KKyAgICB9OworCisgIC8vIFNwZWNpYWxpemF0aW9uIG5lZWRlZCB0byBwcmV2ZW50ICJmb3JtaW5nIHJlZmVyZW5jZSB0byB2b2lkIiBlcnJvcnMgd2hlbgorICAvLyBiaW5kPHZvaWQ+KCkgaXMgY2FsbGVkLCBiZWNhdXNlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbnN0YW50aWF0ZXMKKyAgLy8gX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dm9pZD4gb3V0c2lkZSB0aGUgaW1tZWRpYXRlIGNvbnRleHQgd2hlcmUKKyAgLy8gU0ZJTkFFIGFwcGxpZXMuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dm9pZD4KKyAgICB7CisgICAgICB0eXBlZGVmIHZvaWQgdHlwZTsKKyAgICB9OworCisgIC8vIHN0ZDo6Z2V0PEk+IGZvciB2b2xhdGlsZS1xdWFsaWZpZWQgdHVwbGVzCisgIHRlbXBsYXRlPHNpemVfdCBfSW5kLCB0eXBlbmFtZS4uLiBfVHA+CisgICAgaW5saW5lIGF1dG8KKyAgICBfX3ZvbGdldCh2b2xhdGlsZSB0dXBsZTxfVHAuLi4+JiBfX3R1cGxlKQorICAgIC0+IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0luZCwgdHVwbGU8X1RwLi4uPj46OnR5cGUgdm9sYXRpbGUmCisgICAgeyByZXR1cm4gc3RkOjpnZXQ8X0luZD4oY29uc3RfY2FzdDx0dXBsZTxfVHAuLi4+Jj4oX190dXBsZSkpOyB9CisKKyAgLy8gc3RkOjpnZXQ8ST4gZm9yIGNvbnN0LXZvbGF0aWxlLXF1YWxpZmllZCB0dXBsZXMKKyAgdGVtcGxhdGU8c2l6ZV90IF9JbmQsIHR5cGVuYW1lLi4uIF9UcD4KKyAgICBpbmxpbmUgYXV0bworICAgIF9fdm9sZ2V0KGNvbnN0IHZvbGF0aWxlIHR1cGxlPF9UcC4uLj4mIF9fdHVwbGUpCisgICAgLT4gdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSW5kLCB0dXBsZTxfVHAuLi4+Pjo6dHlwZSBjb25zdCB2b2xhdGlsZSYKKyAgICB7IHJldHVybiBzdGQ6OmdldDxfSW5kPihjb25zdF9jYXN0PGNvbnN0IHR1cGxlPF9UcC4uLj4mPihfX3R1cGxlKSk7IH0KKworICAvLy8gVHlwZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IHJldHVybmVkIGZyb20gYmluZCgpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBfQmluZDsKKworICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9Cb3VuZF9hcmdzPgorICAgIGNsYXNzIF9CaW5kPF9GdW5jdG9yKF9Cb3VuZF9hcmdzLi4uKT4KKyAgICA6IHB1YmxpYyBfV2Vha19yZXN1bHRfdHlwZTxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kIF9fc2VsZl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9Cb3VuZF9hcmdzKT46Ol9fdHlwZQorCV9Cb3VuZF9pbmRleGVzOworCisgICAgICBfRnVuY3RvciBfTV9mOworICAgICAgdHVwbGU8X0JvdW5kX2FyZ3MuLi4+IF9NX2JvdW5kX2FyZ3M7CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbF9jKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3QKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsX3YodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLAorCQkgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGxfY192KHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywKKwkJICAgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCWV4cGxpY2l0IF9CaW5kKGNvbnN0IF9GdW5jdG9yJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fZihfX2YpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJZXhwbGljaXQgX0JpbmQoX0Z1bmN0b3ImJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fZihzdGQ6Om1vdmUoX19mKSksIF9NX2JvdW5kX2FyZ3Moc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKQorCXsgfQorCisgICAgICBfQmluZChjb25zdCBfQmluZCYpID0gZGVmYXVsdDsKKworICAgICAgX0JpbmQoX0JpbmQmJiBfX2IpCisgICAgICA6IF9NX2Yoc3RkOjptb3ZlKF9fYi5fTV9mKSksIF9NX2JvdW5kX2FyZ3Moc3RkOjptb3ZlKF9fYi5fTV9ib3VuZF9hcmdzKSkKKyAgICAgIHsgfQorCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1Jlc3VsdAorCT0gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxfRnVuY3Rvcj4oKSgKKwkgICAgICBfTXU8X0JvdW5kX2FyZ3M+KCkoIHN0ZDo6ZGVjbHZhbDxfQm91bmRfYXJncyY+KCksCisJCQkJICBzdGQ6OmRlY2x2YWw8dHVwbGU8X0FyZ3MuLi4+Jj4oKSApLi4uICkgKT4KKwlfUmVzdWx0CisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXN1bHQKKwk9IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgZW5hYmxlX2lmPChzaXplb2YuLi4oX0FyZ3MpID49IDApLAorCQkgICAgICAgdHlwZW5hbWUgYWRkX2NvbnN0PF9GdW5jdG9yPjo6dHlwZT46OnR5cGU+KCkoCisJICAgICAgX011PF9Cb3VuZF9hcmdzPigpKCBzdGQ6OmRlY2x2YWw8Y29uc3QgX0JvdW5kX2FyZ3MmPigpLAorCQkJCSAgc3RkOjpkZWNsdmFsPHR1cGxlPF9BcmdzLi4uPiY+KCkgKS4uLiApICk+CisJX1Jlc3VsdAorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIGNvbnN0CisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbF9jPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIHR5cGVuYW1lIF9SZXN1bHQKKwk9IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgZW5hYmxlX2lmPChzaXplb2YuLi4oX0FyZ3MpID49IDApLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBhZGRfdm9sYXRpbGU8X0Z1bmN0b3I+Ojp0eXBlPjo6dHlwZT4oKSgKKwkgICAgICBfTXU8X0JvdW5kX2FyZ3M+KCkoIHN0ZDo6ZGVjbHZhbDx2b2xhdGlsZSBfQm91bmRfYXJncyY+KCksCisJCQkJICBzdGQ6OmRlY2x2YWw8dHVwbGU8X0FyZ3MuLi4+Jj4oKSApLi4uICkgKT4KKwlfUmVzdWx0CisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsX3Y8X1Jlc3VsdD4oCisJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICAgICAgX0JvdW5kX2luZGV4ZXMoKSk7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgdHlwZW5hbWUgX1Jlc3VsdAorCT0gZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDx0eXBlbmFtZSBlbmFibGVfaWY8KHNpemVvZi4uLihfQXJncykgPj0gMCksCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGFkZF9jdjxfRnVuY3Rvcj46OnR5cGU+Ojp0eXBlPigpKAorCSAgICAgIF9NdTxfQm91bmRfYXJncz4oKSggc3RkOjpkZWNsdmFsPGNvbnN0IHZvbGF0aWxlIF9Cb3VuZF9hcmdzJj4oKSwKKwkJCQkgIHN0ZDo6ZGVjbHZhbDx0dXBsZTxfQXJncy4uLj4mPigpICkuLi4gKSApPgorCV9SZXN1bHQKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdCB2b2xhdGlsZQorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGxfY192PF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKyAgICB9OworCisgIC8vLyBUeXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBiaW5kPFI+KCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kX3Jlc3VsdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0JvdW5kX2FyZ3M+CisgICAgY2xhc3MgX0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9GdW5jdG9yKF9Cb3VuZF9hcmdzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kX3Jlc3VsdCBfX3NlbGZfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQm91bmRfYXJncyk+OjpfX3R5cGUKKwlfQm91bmRfaW5kZXhlczsKKworICAgICAgX0Z1bmN0b3IgX01fZjsKKyAgICAgIHR1cGxlPF9Cb3VuZF9hcmdzLi4uPiBfTV9ib3VuZF9hcmdzOworCisgICAgICAvLyBzZmluYWUgdHlwZXMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisJc3RydWN0IF9fZW5hYmxlX2lmX3ZvaWQgOiBlbmFibGVfaWY8aXNfdm9pZDxfUmVzPjo6dmFsdWUsIGludD4geyB9OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKwlzdHJ1Y3QgX19kaXNhYmxlX2lmX3ZvaWQgOiBlbmFibGVfaWY8IWlzX3ZvaWQ8X1Jlcz46OnZhbHVlLCBpbnQ+IHsgfTsKKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19kaXNhYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKQorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkLCByZXR1cm4gdm9pZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwl2b2lkCisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19lbmFibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApCisJeworCSAgX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkgICAgICAgKGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwlfUmVzdWx0CisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19kaXNhYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKSBjb25zdAorCXsKKwkgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorCQkgICAgICAoZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0LCByZXR1cm4gdm9pZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwl2b2lkCisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19lbmFibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIGNvbnN0CisJeworCSAgX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkgICAgICAgKGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksICBfX2FyZ3MpLi4uKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisJX1Jlc3VsdAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4sCisJICAgIHR5cGVuYW1lIF9fZGlzYWJsZV9pZl92b2lkPF9SZXM+Ojp0eXBlID0gMCkgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkJICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlLCByZXR1cm4gdm9pZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKwl2b2lkCisJX19jYWxsKHR1cGxlPF9BcmdzLi4uPiYmIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiwKKwkgICAgdHlwZW5hbWUgX19lbmFibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIHZvbGF0aWxlCisJeworCSAgX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKwkgICAgICAgKF9fdm9sZ2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisJfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorCV9SZXN1bHQKKwlfX2NhbGwodHVwbGU8X0FyZ3MuLi4+JiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+LAorCSAgICB0eXBlbmFtZSBfX2Rpc2FibGVfaWZfdm9pZDxfUmVzPjo6dHlwZSA9IDApIGNvbnN0IHZvbGF0aWxlCisJeworCSAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJCSAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZSwgcmV0dXJuIHZvaWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisJdm9pZAorCV9fY2FsbCh0dXBsZTxfQXJncy4uLj4mJiBfX2FyZ3MsCisJICAgICAgIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4sCisJICAgIHR5cGVuYW1lIF9fZW5hYmxlX2lmX3ZvaWQ8X1Jlcz46OnR5cGUgPSAwKSBjb25zdCB2b2xhdGlsZQorCXsKKwkgIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisJICAgICAgIChfX3ZvbGdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworCX0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJZXhwbGljaXQgX0JpbmRfcmVzdWx0KGNvbnN0IF9GdW5jdG9yJiBfX2YsIF9BcmdzJiYuLi4gX19hcmdzKQorCTogX01fZihfX2YpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikKKwl7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJZXhwbGljaXQgX0JpbmRfcmVzdWx0KF9GdW5jdG9yJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKwk6IF9NX2Yoc3RkOjptb3ZlKF9fZikpLCBfTV9ib3VuZF9hcmdzKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikKKwl7IH0KKworICAgICAgX0JpbmRfcmVzdWx0KGNvbnN0IF9CaW5kX3Jlc3VsdCYpID0gZGVmYXVsdDsKKworICAgICAgX0JpbmRfcmVzdWx0KF9CaW5kX3Jlc3VsdCYmIF9fYikKKyAgICAgIDogX01fZihzdGQ6Om1vdmUoX19iLl9NX2YpKSwgX01fYm91bmRfYXJncyhzdGQ6Om1vdmUoX19iLl9NX2JvdW5kX2FyZ3MpKQorICAgICAgeyB9CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKF9BcmdzJiYuLi4gX19hcmdzKSBjb25zdAorCXsKKwkgIHJldHVybiB0aGlzLT5fX2NhbGw8X1Jlc3VsdD4oCisJICAgICAgc3RkOjpmb3J3YXJkX2FzX3R1cGxlKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLiksCisJICAgICAgX0JvdW5kX2luZGV4ZXMoKSk7CisJfQorCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKwlyZXN1bHRfdHlwZQorCW9wZXJhdG9yKCkoX0FyZ3MmJi4uLiBfX2FyZ3MpIHZvbGF0aWxlCisJeworCSAgcmV0dXJuIHRoaXMtPl9fY2FsbDxfUmVzdWx0PigKKwkgICAgICBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSwKKwkgICAgICBfQm91bmRfaW5kZXhlcygpKTsKKwl9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKShfQXJncyYmLi4uIF9fYXJncykgY29uc3Qgdm9sYXRpbGUKKwl7CisJICByZXR1cm4gdGhpcy0+X19jYWxsPF9SZXN1bHQ+KAorCSAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZShzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pLAorCSAgICAgIF9Cb3VuZF9pbmRleGVzKCkpOworCX0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIENsYXNzIHRlbXBsYXRlIF9CaW5kIGlzIGFsd2F5cyBhIGJpbmQgZXhwcmVzc2lvbi4KKyAgICogIEBpbmdyb3VwIGJpbmRlcnMKKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxfQmluZDxfU2lnbmF0dXJlPiA+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvKioKKyAgICogIEBicmllZiBDbGFzcyB0ZW1wbGF0ZSBfQmluZCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzdWx0LCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9CaW5kX2hlbHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dHlwZW5hbWUgZGVjYXk8X0Z1bmN0b3I+Ojp0eXBlPgorCV9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYXliZV90eXBlOjp0eXBlIF9fZnVuY3Rvcl90eXBlOworICAgICAgdHlwZWRlZiBfQmluZDxfX2Z1bmN0b3JfdHlwZSh0eXBlbmFtZSBkZWNheTxfQXJnVHlwZXM+Ojp0eXBlLi4uKT4gdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEZ1bmN0aW9uIHRlbXBsYXRlIGZvciBzdGQ6OmJpbmQuCisgICAqICBAaW5ncm91cCBiaW5kZXJzCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9CaW5kX2hlbHBlcjxfRnVuY3RvciwgX0FyZ1R5cGVzLi4uPjo6dHlwZQorICAgIGJpbmQoX0Z1bmN0b3ImJiBfX2YsIF9BcmdUeXBlcyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICB0eXBlZGVmIF9CaW5kX2hlbHBlcjxfRnVuY3RvciwgX0FyZ1R5cGVzLi4uPiBfX2hlbHBlcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2hlbHBlcl90eXBlOjpfX21heWJlX3R5cGUgX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2hlbHBlcl90eXBlOjp0eXBlIF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX21heWJlX3R5cGU6Ol9fZG9fd3JhcChzdGQ6OmZvcndhcmQ8X0Z1bmN0b3I+KF9fZikpLAorCQkJICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9CaW5kcmVzX2hlbHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8dHlwZW5hbWUgZGVjYXk8X0Z1bmN0b3I+Ojp0eXBlPgorCV9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYXliZV90eXBlOjp0eXBlIF9fZnVuY3Rvcl90eXBlOworICAgICAgdHlwZWRlZiBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwKKwkJCSAgIF9fZnVuY3Rvcl90eXBlKHR5cGVuYW1lIGRlY2F5PF9BcmdUeXBlcz46OnR5cGUuLi4pPgorCXR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogIEBicmllZiBGdW5jdGlvbiB0ZW1wbGF0ZSBmb3Igc3RkOjpiaW5kPFI+LgorICAgKiAgQGluZ3JvdXAgYmluZGVycworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfQmluZHJlc19oZWxwZXI8X1Jlc3VsdCwgX0Z1bmN0b3IsIF9BcmdUeXBlcy4uLj46OnR5cGUKKyAgICBiaW5kKF9GdW5jdG9yJiYgX19mLCBfQXJnVHlwZXMmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfQmluZHJlc19oZWxwZXI8X1Jlc3VsdCwgX0Z1bmN0b3IsIF9BcmdUeXBlcy4uLj4gX19oZWxwZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19oZWxwZXJfdHlwZTo6X19tYXliZV90eXBlIF9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19oZWxwZXJfdHlwZTo6dHlwZSBfX3Jlc3VsdF90eXBlOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3R5cGUoX19tYXliZV90eXBlOjpfX2RvX3dyYXAoc3RkOjpmb3J3YXJkPF9GdW5jdG9yPihfX2YpKSwKKwkJCSAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBFeGNlcHRpb24gY2xhc3MgdGhyb3duIHdoZW4gY2xhc3MgdGVtcGxhdGUgZnVuY3Rpb24ncworICAgKiAgb3BlcmF0b3IoKSBpcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSB0YXJnZXQuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfZnVuY3Rpb25fY2FsbCA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5iYWRfZnVuY3Rpb25fY2FsbCgpIHRocm93KCk7CisgIH07CisKKyAgLyoqCisgICAqICBUcmFpdCBpZGVudGlmeWluZyAibG9jYXRpb24taW52YXJpYW50IiB0eXBlcywgbWVhbmluZyB0aGF0IHRoZQorICAgKiAgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IChvciBhbnkgb2YgaXRzIG1lbWJlcnMpIHdpbGwgbm90IGVzY2FwZS4KKyAgICogIEFsc28gaW1wbGllcyBhIHRyaXZpYWwgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19pc19sb2NhdGlvbl9pbnZhcmlhbnQKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19wb2ludGVyPF9UcD46OnZhbHVlCisJCQkgICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICBjbGFzcyBfVW5kZWZpbmVkX2NsYXNzOworCisgIHVuaW9uIF9Ob2NvcHlfdHlwZXMKKyAgeworICAgIHZvaWQqICAgICAgIF9NX29iamVjdDsKKyAgICBjb25zdCB2b2lkKiBfTV9jb25zdF9vYmplY3Q7CisgICAgdm9pZCAoKl9NX2Z1bmN0aW9uX3BvaW50ZXIpKCk7CisgICAgdm9pZCAoX1VuZGVmaW5lZF9jbGFzczo6Kl9NX21lbWJlcl9wb2ludGVyKSgpOworICB9OworCisgIHVuaW9uIF9BbnlfZGF0YQorICB7CisgICAgdm9pZCogICAgICAgX01fYWNjZXNzKCkgICAgICAgeyByZXR1cm4gJl9NX3BvZF9kYXRhWzBdOyB9CisgICAgY29uc3Qgdm9pZCogX01fYWNjZXNzKCkgY29uc3QgeyByZXR1cm4gJl9NX3BvZF9kYXRhWzBdOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBfVHAmCisgICAgICBfTV9hY2Nlc3MoKQorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9UcCo+KF9NX2FjY2VzcygpKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgY29uc3QgX1RwJgorICAgICAgX01fYWNjZXNzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBfVHAqPihfTV9hY2Nlc3MoKSk7IH0KKworICAgIF9Ob2NvcHlfdHlwZXMgX01fdW51c2VkOworICAgIGNoYXIgX01fcG9kX2RhdGFbc2l6ZW9mKF9Ob2NvcHlfdHlwZXMpXTsKKyAgfTsKKworICBlbnVtIF9NYW5hZ2VyX29wZXJhdGlvbgorICB7CisgICAgX19nZXRfdHlwZV9pbmZvLAorICAgIF9fZ2V0X2Z1bmN0b3JfcHRyLAorICAgIF9fY2xvbmVfZnVuY3RvciwKKyAgICBfX2Rlc3Ryb3lfZnVuY3RvcgorICB9OworCisgIC8vIFNpbXBsZSB0eXBlIHdyYXBwZXIgdGhhdCBoZWxwcyBhdm9pZCBhbm5veWluZyBjb25zdCBwcm9ibGVtcworICAvLyB3aGVuIGNhc3RpbmcgYmV0d2VlbiB2b2lkIHBvaW50ZXJzIGFuZCBwb2ludGVycy10by1wb2ludGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfU2ltcGxlX3R5cGVfd3JhcHBlcgorICAgIHsKKyAgICAgIF9TaW1wbGVfdHlwZV93cmFwcGVyKF9UcCBfX3ZhbHVlKSA6IF9fdmFsdWUoX192YWx1ZSkgeyB9CisKKyAgICAgIF9UcCBfX3ZhbHVlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfU2ltcGxlX3R5cGVfd3JhcHBlcjxfVHA+ID4KKyAgICA6IF9faXNfbG9jYXRpb25faW52YXJpYW50PF9UcD4KKyAgICB7IH07CisKKyAgLy8gQ29udmVydHMgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QgaW50byBhIGNhbGxhYmxlCisgIC8vIGZ1bmN0aW9uIG9iamVjdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgaW5saW5lIF9GdW5jdG9yJgorICAgIF9fY2FsbGFibGVfZnVuY3RvcihfRnVuY3RvciYgX19mKQorICAgIHsgcmV0dXJuIF9fZjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogJl9fcCkKKyAgICB7IHJldHVybiBtZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9DbGFzcz4KKyAgICBpbmxpbmUgX01lbV9mbjxfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX01lbWJlciBfQ2xhc3M6OiogY29uc3QgJl9fcCkKKyAgICB7IHJldHVybiBtZW1fZm4oX19wKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgZnVuY3Rpb247CisKKyAgLy8vIEJhc2UgY2xhc3Mgb2YgYWxsIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKyAgY2xhc3MgX0Z1bmN0aW9uX2Jhc2UKKyAgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2l6ZV90IF9NX21heF9zaXplID0gc2l6ZW9mKF9Ob2NvcHlfdHlwZXMpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBfTV9tYXhfYWxpZ24gPSBfX2FsaWdub2ZfXyhfTm9jb3B5X3R5cGVzKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgY2xhc3MgX0Jhc2VfbWFuYWdlcgorICAgICAgeworICAgICAgcHJvdGVjdGVkOgorCXN0YXRpYyBjb25zdCBib29sIF9fc3RvcmVkX2xvY2FsbHkgPQorCShfX2lzX2xvY2F0aW9uX2ludmFyaWFudDxfRnVuY3Rvcj46OnZhbHVlCisJICYmIHNpemVvZihfRnVuY3RvcikgPD0gX01fbWF4X3NpemUKKwkgJiYgX19hbGlnbm9mX18oX0Z1bmN0b3IpIDw9IF9NX21heF9hbGlnbgorCSAmJiAoX01fbWF4X2FsaWduICUgX19hbGlnbm9mX18oX0Z1bmN0b3IpID09IDApKTsKKworCXR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19zdG9yZWRfbG9jYWxseT4gX0xvY2FsX3N0b3JhZ2U7CisKKwkvLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdAorCXN0YXRpYyBfRnVuY3RvcioKKwlfTV9nZXRfcG9pbnRlcihjb25zdCBfQW55X2RhdGEmIF9fc291cmNlKQorCXsKKwkgIGNvbnN0IF9GdW5jdG9yKiBfX3B0ciA9CisJICAgIF9fc3RvcmVkX2xvY2FsbHk/IHN0ZDo6X19hZGRyZXNzb2YoX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yPigpKQorCSAgICAvKiBoYXZlIHN0b3JlZCBhIHBvaW50ZXIgKi8gOiBfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCSAgcmV0dXJuIGNvbnN0X2Nhc3Q8X0Z1bmN0b3IqPihfX3B0cik7CisJfQorCisJLy8gQ2xvbmUgYSBsb2NhdGlvbi1pbnZhcmlhbnQgZnVuY3Rpb24gb2JqZWN0IHRoYXQgZml0cyB3aXRoaW4KKwkvLyBhbiBfQW55X2RhdGEgc3RydWN0dXJlLgorCXN0YXRpYyB2b2lkCisJX01fY2xvbmUoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsIHRydWVfdHlwZSkKKwl7CisJICBuZXcgKF9fZGVzdC5fTV9hY2Nlc3MoKSkgX0Z1bmN0b3IoX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yPigpKTsKKwl9CisKKwkvLyBDbG9uZSBhIGZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIG5vdCBsb2NhdGlvbi1pbnZhcmlhbnQgb3IKKwkvLyB0aGF0IGNhbm5vdCBmaXQgaW50byBhbiBfQW55X2RhdGEgc3RydWN0dXJlLgorCXN0YXRpYyB2b2lkCisJX01fY2xvbmUoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsIGZhbHNlX3R5cGUpCisJeworCSAgX19kZXN0Ll9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPQorCSAgICBuZXcgX0Z1bmN0b3IoKl9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcio+KCkpOworCX0KKworCS8vIERlc3Ryb3lpbmcgYSBsb2NhdGlvbi1pbnZhcmlhbnQgb2JqZWN0IG1heSBzdGlsbCByZXF1aXJlCisJLy8gZGVzdHJ1Y3Rpb24uCisJc3RhdGljIHZvaWQKKwlfTV9kZXN0cm95KF9BbnlfZGF0YSYgX192aWN0aW0sIHRydWVfdHlwZSkKKwl7CisJICBfX3ZpY3RpbS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkufl9GdW5jdG9yKCk7CisJfQorCisJLy8gRGVzdHJveWluZyBhbiBvYmplY3QgbG9jYXRlZCBvbiB0aGUgaGVhcC4KKwlzdGF0aWMgdm9pZAorCV9NX2Rlc3Ryb3koX0FueV9kYXRhJiBfX3ZpY3RpbSwgZmFsc2VfdHlwZSkKKwl7CisJICBkZWxldGUgX192aWN0aW0uX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwl9CisKKyAgICAgIHB1YmxpYzoKKwlzdGF0aWMgYm9vbAorCV9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorCXsKKwkgIHN3aXRjaCAoX19vcCkKKwkgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IF9NX2dldF9wb2ludGVyKF9fc291cmNlKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIF9fY2xvbmVfZnVuY3RvcjoKKwkgICAgICBfTV9jbG9uZShfX2Rlc3QsIF9fc291cmNlLCBfTG9jYWxfc3RvcmFnZSgpKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIF9fZGVzdHJveV9mdW5jdG9yOgorCSAgICAgIF9NX2Rlc3Ryb3koX19kZXN0LCBfTG9jYWxfc3RvcmFnZSgpKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKworCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfRnVuY3RvciYmIF9fZikKKwl7IF9NX2luaXRfZnVuY3RvcihfX2Z1bmN0b3IsIHN0ZDo6bW92ZShfX2YpLCBfTG9jYWxfc3RvcmFnZSgpKTsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgZnVuY3Rpb248X1NpZ25hdHVyZT4mIF9fZikKKwkgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgX1RwKiYgX19mcCkKKwkgIHsgcmV0dXJuIF9fZnA7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihfVHAgX0NsYXNzOjoqIGNvbnN0JiBfX21wKQorCSAgeyByZXR1cm4gX19tcDsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBfVHAmKQorCSAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBwcml2YXRlOgorCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfRnVuY3RvciYmIF9fZiwgdHJ1ZV90eXBlKQorCXsgbmV3IChfX2Z1bmN0b3IuX01fYWNjZXNzKCkpIF9GdW5jdG9yKHN0ZDo6bW92ZShfX2YpKTsgfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9GdW5jdG9yJiYgX19mLCBmYWxzZV90eXBlKQorCXsgX19mdW5jdG9yLl9NX2FjY2VzczxfRnVuY3Rvcio+KCkgPSBuZXcgX0Z1bmN0b3Ioc3RkOjptb3ZlKF9fZikpOyB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfUmVmX21hbmFnZXIgOiBwdWJsaWMgX0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+CisgICAgICB7CisJdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+IF9CYXNlOworCisgICAgcHVibGljOgorCXN0YXRpYyBib29sCisJX01fbWFuYWdlcihfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwKKwkJICAgX01hbmFnZXJfb3BlcmF0aW9uIF9fb3ApCisJeworCSAgc3dpdGNoIChfX29wKQorCSAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgICBjYXNlIF9fZ2V0X3R5cGVfaW5mbzoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPGNvbnN0IHR5cGVfaW5mbyo+KCkgPSAmdHlwZWlkKF9GdW5jdG9yKTsKKwkgICAgICBicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICAgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0gKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSk7CisJICAgICAgcmV0dXJuIGlzX2NvbnN0PF9GdW5jdG9yPjo6dmFsdWU7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBfQmFzZTo6X01fbWFuYWdlcihfX2Rlc3QsIF9fc291cmNlLCBfX29wKTsKKwkgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKworCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gX19mKQorCXsKKwkgIC8vIFRCRDogVXNlIGFkZHJlc3Nfb2YgZnVuY3Rpb24gaW5zdGVhZC4KKwkgIF9CYXNlOjpfTV9pbml0X2Z1bmN0b3IoX19mdW5jdG9yLCAmX19mLmdldCgpKTsKKwl9CisgICAgICB9OworCisgICAgX0Z1bmN0aW9uX2Jhc2UoKSA6IF9NX21hbmFnZXIoMCkgeyB9CisKKyAgICB+X0Z1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIGlmIChfTV9tYW5hZ2VyKQorCV9NX21hbmFnZXIoX01fZnVuY3RvciwgX01fZnVuY3RvciwgX19kZXN0cm95X2Z1bmN0b3IpOworICAgIH0KKworCisgICAgYm9vbCBfTV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFfTV9tYW5hZ2VyOyB9CisKKyAgICB0eXBlZGVmIGJvb2wgKCpfTWFuYWdlcl90eXBlKShfQW55X2RhdGEmLCBjb25zdCBfQW55X2RhdGEmLAorCQkJCSAgX01hbmFnZXJfb3BlcmF0aW9uKTsKKworICAgIF9BbnlfZGF0YSAgICAgX01fZnVuY3RvcjsKKyAgICBfTWFuYWdlcl90eXBlIF9NX21hbmFnZXI7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIF9GdW5jdG9yPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwlyZXR1cm4gKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoCisJICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9GdW5jdG9yPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoCisJICAgIHN0ZDo6Zm9yd2FyZDxfQXJnVHlwZXM+KF9fYXJncykuLi4pOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIHJlZmVyZW5jZV93cmFwcGVyPF9GdW5jdG9yPiA+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9SZWZfbWFuYWdlcjxfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBfUmVzCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJcmV0dXJuIF9fY2FsbGFibGVfZnVuY3RvcigqKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpKSgKKwkgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgdm9pZAorICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworCV9fY2FsbGFibGVfZnVuY3RvcigqKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpKSgKKwkgICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9SZXMsCisJICAgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPF9SZXMoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCBfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX01lbWJlciBfQ2xhc3M6Oio+CisJX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwlyZXR1cm4gbWVtX2ZuKF9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX2Z1bmN0b3IpLT5fX3ZhbHVlKSgKKwkgICAgc3RkOjpmb3J3YXJkPF9BcmdUeXBlcz4oX19hcmdzKS4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPAorCQkgX1NpbXBsZV90eXBlX3dyYXBwZXI8IF9NZW1iZXIgX0NsYXNzOjoqID4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01lbWJlciBfQ2xhc3M6OiogX0Z1bmN0b3I7CisgICAgICB0eXBlZGVmIF9TaW1wbGVfdHlwZV93cmFwcGVyPF9GdW5jdG9yPiBfV3JhcHBlcjsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X1dyYXBwZXI+IF9CYXNlOworCisgICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBib29sCisgICAgICBfTV9tYW5hZ2VyKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLAorCQkgX01hbmFnZXJfb3BlcmF0aW9uIF9fb3ApCisgICAgICB7CisJc3dpdGNoIChfX29wKQorCSAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgIGNhc2UgX19nZXRfdHlwZV9pbmZvOgorCSAgICBfX2Rlc3QuX01fYWNjZXNzPGNvbnN0IHR5cGVfaW5mbyo+KCkgPSAmdHlwZWlkKF9GdW5jdG9yKTsKKwkgICAgYnJlYWs7CisjZW5kaWYKKwkgIGNhc2UgX19nZXRfZnVuY3Rvcl9wdHI6CisJICAgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0KKwkgICAgICAmX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fc291cmNlKS0+X192YWx1ZTsKKwkgICAgYnJlYWs7CisKKwkgIGRlZmF1bHQ6CisJICAgIF9CYXNlOjpfTV9tYW5hZ2VyKF9fZGVzdCwgX19zb3VyY2UsIF9fb3ApOworCSAgfQorCXJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKwltZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKAorCSAgICBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFByaW1hcnkgY2xhc3MgdGVtcGxhdGUgZm9yIHN0ZDo6ZnVuY3Rpb24uCisgICAqICBAaW5ncm91cCBmdW5jdG9ycworICAgKgorICAgKiAgUG9seW1vcnBoaWMgZnVuY3Rpb24gd3JhcHBlci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbjxfUmVzLCBfQXJnVHlwZXMuLi4+LAorICAgICAgcHJpdmF0ZSBfRnVuY3Rpb25fYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyBfU2lnbmF0dXJlX3R5cGUoX0FyZ1R5cGVzLi4uKTsKKworICAgICAgc3RydWN0IF9Vc2VsZXNzIHsgfTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgLy8gWzMuNy4yLjFdIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIERlZmF1bHQgY29uc3RydWN0IGNyZWF0ZXMgYW4gZW1wdHkgZnVuY3Rpb24gY2FsbCB3cmFwcGVyLgorICAgICAgICogIEBwb3N0IEBjICEoYm9vbCkqdGhpcworICAgICAgICovCisgICAgICBmdW5jdGlvbigpIDogX0Z1bmN0aW9uX2Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZnVuY3Rpb24gY2FsbCB3cmFwcGVyLgorICAgICAgICogIEBwb3N0IEBjICEoYm9vbCkqdGhpcworICAgICAgICovCisgICAgICBmdW5jdGlvbihudWxscHRyX3QpIDogX0Z1bmN0aW9uX2Jhc2UoKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBjb3B5IGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSB4IEEgJWZ1bmN0aW9uIG9iamVjdCB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcG9zdCBAYyAoYm9vbCkqdGhpcyA9PSAoYm9vbCl4CisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmdW5jdGlvbiBjb250YWlucyBhIGNvcHkgb2YgdGhlIHRhcmdldCBvZiBAYQorICAgICAgICogIHggKGlmIGl0IGhhcyBvbmUpLgorICAgICAgICovCisgICAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICVGdW5jdGlvbiBtb3ZlIGNvbnN0cnVjdG9yLgorICAgICAgICogIEBwYXJhbSB4IEEgJWZ1bmN0aW9uIG9iamVjdCBydmFsdWUgd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmdW5jdGlvbiBjb250YWlucyB0aGUgdGFyZ2V0IG9mIEBhIHgKKyAgICAgICAqICAoaWYgaXQgaGFzIG9uZSkuCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKGZ1bmN0aW9uJiYgX194KSA6IF9GdW5jdGlvbl9iYXNlKCkKKyAgICAgIHsKKwlfX3guc3dhcCgqdGhpcyk7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IG5lZWRzIGFsbG9jYXRvcl9hcmdfdAorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgQnVpbGRzIGEgJWZ1bmN0aW9uIHRoYXQgdGFyZ2V0cyBhIGNvcHkgb2YgdGhlIGluY29taW5nCisgICAgICAgKiAgZnVuY3Rpb24gb2JqZWN0LgorICAgICAgICogIEBwYXJhbSBmIEEgJWZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxhYmxlIHdpdGggcGFyYW1ldGVycyBvZgorICAgICAgICogIHR5cGUgQGMgVDEsIEBjIFQyLCAuLi4sIEBjIFROIGFuZCByZXR1cm5zIGEgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAqICB0byBAYyBSZXMuCisgICAgICAgKgorICAgICAgICogIFRoZSBuZXdseS1jcmVhdGVkICVmdW5jdGlvbiBvYmplY3Qgd2lsbCB0YXJnZXQgYSBjb3B5IG9mIEBhCisgICAgICAgKiAgZi4gSWYgQGEgZiBpcyBAYyByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhlbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0IHdpbGwgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IEBjCisgICAgICAgKiAgZi5nZXQoKS4gSWYgQGEgZiBpcyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBOVUxMCisgICAgICAgKiAgcG9pbnRlci10by1tZW1iZXIsIHRoZSBuZXdseS1jcmVhdGVkIG9iamVjdCB3aWxsIGJlIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBJZiBAYSBmIGlzIGEgbm9uLU5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBhbiBvYmplY3Qgb2YgdHlwZSBAYworICAgICAgICogIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKwlmdW5jdGlvbihfRnVuY3RvciBfX2YsCisJCSB0eXBlbmFtZSBlbmFibGVfaWY8CisJCQkgICAhaXNfaW50ZWdyYWw8X0Z1bmN0b3I+Ojp2YWx1ZSwgX1VzZWxlc3M+Ojp0eXBlCisJCSAgID0gX1VzZWxlc3MoKSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqICBAcGFyYW0geCBBICVmdW5jdGlvbiB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcG9zdCBAYyAoYm9vbCkqdGhpcyA9PSAoYm9vbCl4CisgICAgICAgKiAgQHJldHVybnMgQGMgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgVGhlIHRhcmdldCBvZiBAYSB4IGlzIGNvcGllZCB0byBAYyAqdGhpcy4gSWYgQGEgeCBoYXMgbm8KKyAgICAgICAqICB0YXJnZXQsIHRoZW4gQGMgKnRoaXMgd2lsbCBiZSBlbXB0eS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGEgeCB0YXJnZXRzIGEgZnVuY3Rpb24gcG9pbnRlciBvciBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0LCB0aGVuIHRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGZ1bmN0aW9uJiBfX3gpCisgICAgICB7CisJZnVuY3Rpb24oX194KS5zd2FwKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gbW92ZS1hc3NpZ25tZW50IG9wZXJhdG9yLgorICAgICAgICogIEBwYXJhbSB4IEEgJWZ1bmN0aW9uIHJ2YWx1ZSB3aXRoIGlkZW50aWNhbCBjYWxsIHNpZ25hdHVyZS4KKyAgICAgICAqICBAcmV0dXJucyBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGUgdGFyZ2V0IG9mIEBhIHggaXMgbW92ZWQgdG8gQGMgKnRoaXMuIElmIEBhIHggaGFzIG5vCisgICAgICAgKiAgdGFyZ2V0LCB0aGVuIEBjICp0aGlzIHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIHggdGFyZ2V0cyBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbgorICAgICAgICogIG9iamVjdCwgdGhlbiB0aGlzIG9wZXJhdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICBmdW5jdGlvbiYKKyAgICAgIG9wZXJhdG9yPShmdW5jdGlvbiYmIF9feCkKKyAgICAgIHsKKwlmdW5jdGlvbihzdGQ6Om1vdmUoX194KSkuc3dhcCgqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgdG8gemVyby4KKyAgICAgICAqICBAcG9zdCBAYyAhKGJvb2wpKnRoaXMKKyAgICAgICAqICBAcmV0dXJucyBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGUgdGFyZ2V0IG9mIEBjICp0aGlzIGlzIGRlYWxsb2NhdGVkLCBsZWF2aW5nIGl0IGVtcHR5LgorICAgICAgICovCisgICAgICBmdW5jdGlvbiYKKyAgICAgIG9wZXJhdG9yPShudWxscHRyX3QpCisgICAgICB7CisJaWYgKF9NX21hbmFnZXIpCisJICB7CisJICAgIF9NX21hbmFnZXIoX01fZnVuY3RvciwgX01fZnVuY3RvciwgX19kZXN0cm95X2Z1bmN0b3IpOworCSAgICBfTV9tYW5hZ2VyID0gMDsKKwkgICAgX01faW52b2tlciA9IDA7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgdG8gYSBuZXcgdGFyZ2V0LgorICAgICAgICogIEBwYXJhbSBmIEEgJWZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxhYmxlIHdpdGggcGFyYW1ldGVycyBvZgorICAgICAgICogIHR5cGUgQGMgVDEsIEBjIFQyLCAuLi4sIEBjIFROIGFuZCByZXR1cm5zIGEgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAqICB0byBAYyBSZXMuCisgICAgICAgKiAgQHJldHVybiBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGlzICAlZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgd2lsbCB0YXJnZXQgYSBjb3B5IG9mIEBhCisgICAgICAgKiAgZi4gSWYgQGEgZiBpcyBAYyByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhlbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0IHdpbGwgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IEBjCisgICAgICAgKiAgZi5nZXQoKS4gSWYgQGEgZiBpcyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBOVUxMCisgICAgICAgKiAgcG9pbnRlci10by1tZW1iZXIsIEBjIHRoaXMgb2JqZWN0IHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIGYgaXMgYSBub24tTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIG9iamVjdCBvZiB0eXBlIEBjCisgICAgICAgKiAgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorCXR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfaW50ZWdyYWw8X0Z1bmN0b3I+Ojp2YWx1ZSwgZnVuY3Rpb24mPjo6dHlwZQorCW9wZXJhdG9yPShfRnVuY3RvciYmIF9fZikKKwl7CisJICBmdW5jdGlvbihzdGQ6OmZvcndhcmQ8X0Z1bmN0b3I+KF9fZikpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLy8vIEBvdmVybG9hZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisJdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnVuY3Rvcj46OnZhbHVlLCBmdW5jdGlvbiY+Ojp0eXBlCisJb3BlcmF0b3I9KHJlZmVyZW5jZV93cmFwcGVyPF9GdW5jdG9yPiBfX2YpCisJeworCSAgZnVuY3Rpb24oX19mKS5zd2FwKCp0aGlzKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIC8vIFszLjcuMi4yXSBmdW5jdGlvbiBtb2RpZmllcnMKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIFN3YXAgdGhlIHRhcmdldHMgb2YgdHdvICVmdW5jdGlvbiBvYmplY3RzLgorICAgICAgICogIEBwYXJhbSBmIEEgJWZ1bmN0aW9uIHdpdGggaWRlbnRpY2FsIGNhbGwgc2lnbmF0dXJlLgorICAgICAgICoKKyAgICAgICAqICBTd2FwIHRoZSB0YXJnZXRzIG9mIEBjIHRoaXMgZnVuY3Rpb24gb2JqZWN0IGFuZCBAYSBmLiBUaGlzCisgICAgICAgKiAgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZCBzd2FwKGZ1bmN0aW9uJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2Z1bmN0b3IsIF9feC5fTV9mdW5jdG9yKTsKKwlzdGQ6OnN3YXAoX01fbWFuYWdlciwgX194Ll9NX21hbmFnZXIpOworCXN0ZDo6c3dhcChfTV9pbnZva2VyLCBfX3guX01faW52b2tlcik7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE86IG5lZWRzIGFsbG9jYXRvcl9hcmdfdAorICAgICAgLyoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZSBfQWxsb2M+CisJdm9pZAorCWFzc2lnbihfRnVuY3RvciYmIF9fZiwgY29uc3QgX0FsbG9jJiBfX2EpCisJeworCSAgZnVuY3Rpb24oYWxsb2NhdG9yX2FyZywgX19hLAorCQkgICBzdGQ6OmZvcndhcmQ8X0Z1bmN0b3I+KF9fZikpLnN3YXAoKnRoaXMpOworCX0KKyAgICAgICovCisKKyAgICAgIC8vIFszLjcuMi4zXSBmdW5jdGlvbiBjYXBhY2l0eQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSAlZnVuY3Rpb24gd3JhcHBlciBoYXMgYSB0YXJnZXQuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm4gQGMgdHJ1ZSB3aGVuIHRoaXMgJWZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHRhcmdldCwKKyAgICAgICAqICBvciBAYyBmYWxzZSB3aGVuIGl0IGlzIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdAorICAgICAgeyByZXR1cm4gIV9NX2VtcHR5KCk7IH0KKworICAgICAgLy8gWzMuNy4yLjRdIGZ1bmN0aW9uIGludm9jYXRpb24KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEludm9rZXMgdGhlIGZ1bmN0aW9uIHRhcmdldGVkIGJ5IEBjICp0aGlzLgorICAgICAgICogIEByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRhcmdldC4KKyAgICAgICAqICBAdGhyb3dzIGJhZF9mdW5jdGlvbl9jYWxsIHdoZW4gQGMgIShib29sKSp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdG9yIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QKKyAgICAgICAqICBzdG9yZWQgYnkgQGMgdGhpcy4KKyAgICAgICAqLworICAgICAgX1JlcyBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0OworCisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgLy8gWzMuNy4yLjVdIGZ1bmN0aW9uIHRhcmdldCBhY2Nlc3MKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGZ1bmN0aW9uIG9iamVjdAorICAgICAgICogIHdyYXBwZXIuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm5zIHRoZSB0eXBlIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsIG9yCisgICAgICAgKiAgQGMgdHlwZWlkKHZvaWQpIGlmIEBjICEoYm9vbCkqdGhpcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBY2Nlc3MgdGhlIHN0b3JlZCB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdCwKKyAgICAgICAqICBpZiBAYyB0eXBlaWQoRnVuY3RvcikuZXF1YWxzKHRhcmdldF90eXBlKCkpOyBvdGhlcndpc2UsIGEgTlVMTAorICAgICAgICogIHBvaW50ZXIuCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4gICAgICAgX0Z1bmN0b3IqIHRhcmdldCgpOworCisgICAgICAvLy8gQG92ZXJsb2FkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4gY29uc3QgX0Z1bmN0b3IqIHRhcmdldCgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfUmVzICgqX0ludm9rZXJfdHlwZSkoY29uc3QgX0FueV9kYXRhJiwgX0FyZ1R5cGVzLi4uKTsKKyAgICAgIF9JbnZva2VyX3R5cGUgX01faW52b2tlcjsKKyAgfTsKKworICAvLyBPdXQtb2YtbGluZSBtZW1iZXIgZGVmaW5pdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICBmdW5jdGlvbihjb25zdCBmdW5jdGlvbiYgX194KQorICAgIDogX0Z1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIGlmIChzdGF0aWNfY2FzdDxib29sPihfX3gpKQorCXsKKwkgIF9NX2ludm9rZXIgPSBfX3guX01faW52b2tlcjsKKwkgIF9NX21hbmFnZXIgPSBfX3guX01fbWFuYWdlcjsKKwkgIF9feC5fTV9tYW5hZ2VyKF9NX2Z1bmN0b3IsIF9feC5fTV9mdW5jdG9yLCBfX2Nsb25lX2Z1bmN0b3IpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICBmdW5jdGlvbihfRnVuY3RvciBfX2YsCisJICAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKwkJCSFpc19pbnRlZ3JhbDxfRnVuY3Rvcj46OnZhbHVlLCBfVXNlbGVzcz46OnR5cGUpCisgICAgICA6IF9GdW5jdGlvbl9iYXNlKCkKKyAgICAgIHsKKwl0eXBlZGVmIF9GdW5jdGlvbl9oYW5kbGVyPF9TaWduYXR1cmVfdHlwZSwgX0Z1bmN0b3I+IF9NeV9oYW5kbGVyOworCisJaWYgKF9NeV9oYW5kbGVyOjpfTV9ub3RfZW1wdHlfZnVuY3Rpb24oX19mKSkKKwkgIHsKKwkgICAgX01faW52b2tlciA9ICZfTXlfaGFuZGxlcjo6X01faW52b2tlOworCSAgICBfTV9tYW5hZ2VyID0gJl9NeV9oYW5kbGVyOjpfTV9tYW5hZ2VyOworCSAgICBfTXlfaGFuZGxlcjo6X01faW5pdF9mdW5jdG9yKF9NX2Z1bmN0b3IsIHN0ZDo6bW92ZShfX2YpKTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgX1JlcworICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICB7CisgICAgICBpZiAoX01fZW1wdHkoKSkKKwlfX3Rocm93X2JhZF9mdW5jdGlvbl9jYWxsKCk7CisgICAgICByZXR1cm4gX01faW52b2tlcihfTV9mdW5jdG9yLCBzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9SVFRJCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjb25zdCB0eXBlX2luZm8mCisgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgdGFyZ2V0X3R5cGUoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9tYW5hZ2VyKQorCXsKKwkgIF9BbnlfZGF0YSBfX3R5cGVpbmZvX3Jlc3VsdDsKKwkgIF9NX21hbmFnZXIoX190eXBlaW5mb19yZXN1bHQsIF9NX2Z1bmN0b3IsIF9fZ2V0X3R5cGVfaW5mbyk7CisJICByZXR1cm4gKl9fdHlwZWluZm9fcmVzdWx0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gdHlwZWlkKHZvaWQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBfRnVuY3RvcioKKyAgICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgICAgdGFyZ2V0KCkKKyAgICAgIHsKKwlpZiAodHlwZWlkKF9GdW5jdG9yKSA9PSB0YXJnZXRfdHlwZSgpICYmIF9NX21hbmFnZXIpCisJICB7CisJICAgIF9BbnlfZGF0YSBfX3B0cjsKKwkgICAgaWYgKF9NX21hbmFnZXIoX19wdHIsIF9NX2Z1bmN0b3IsIF9fZ2V0X2Z1bmN0b3JfcHRyKQorCQkmJiAhaXNfY29uc3Q8X0Z1bmN0b3I+Ojp2YWx1ZSkKKwkgICAgICByZXR1cm4gMDsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybiBfX3B0ci5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGNvbnN0IF9GdW5jdG9yKgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICB0YXJnZXQoKSBjb25zdAorICAgICAgeworCWlmICh0eXBlaWQoX0Z1bmN0b3IpID09IHRhcmdldF90eXBlKCkgJiYgX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX0FueV9kYXRhIF9fcHRyOworCSAgICBfTV9tYW5hZ2VyKF9fcHRyLCBfTV9mdW5jdG9yLCBfX2dldF9mdW5jdG9yX3B0cik7CisJICAgIHJldHVybiBfX3B0ci5fTV9hY2Nlc3M8Y29uc3QgX0Z1bmN0b3IqPigpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiAwOworICAgICAgfQorI2VuZGlmCisKKyAgLy8gWzIwLjcuMTUuMi42XSBudWxsIHBvaW50ZXIgY29tcGFyaXNvbnMKKworICAvKioKKyAgICogIEBicmllZiBDb21wYXJlcyBhIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGFnYWluc3QgMAorICAgKiAgKHRoZSBOVUxMIHBvaW50ZXIpLgorICAgKiAgQHJldHVybnMgQGMgdHJ1ZSBpZiB0aGUgd3JhcHBlciBoYXMgbm8gdGFyZ2V0LCBAYyBmYWxzZSBvdGhlcndpc2UKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9fZiwgbnVsbHB0cl90KQorICAgIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPihfX2YpOyB9CisKKyAgLy8vIEBvdmVybG9hZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0obnVsbHB0cl90LCBjb25zdCBmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9fZikKKyAgICB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmIENvbXBhcmVzIGEgcG9seW1vcnBoaWMgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgYWdhaW5zdCAwCisgICAqICAodGhlIE5VTEwgcG9pbnRlcikuCisgICAqICBAcmV0dXJucyBAYyBmYWxzZSBpZiB0aGUgd3JhcHBlciBoYXMgbm8gdGFyZ2V0LCBAYyB0cnVlIG90aGVyd2lzZQorICAgKgorICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9SZXMoX0FyZ3MuLi4pPiYgX19mLCBudWxscHRyX3QpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vLyBAb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KG51bGxwdHJfdCwgY29uc3QgZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX2YpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vIFsyMC43LjE1LjIuN10gc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcworCisgIC8qKgorICAgKiAgQGJyaWVmIFN3YXAgdGhlIHRhcmdldHMgb2YgdHdvIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChmdW5jdGlvbjxfUmVzKF9BcmdzLi4uKT4mIF9feCwgZnVuY3Rpb248X1JlcyhfQXJncy4uLik+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgLy8gX0dMSUJDWFhfRlVOQ1RJT05BTApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mdXR1cmUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2Z1dHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzBjZTc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9mdXR1cmUKQEAgLTAsMCArMSwxMzkzIEBACisvLyA8ZnV0dXJlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvZnV0dXJlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0ZVVFVSRQorI2RlZmluZSBfR0xJQkNYWF9GVVRVUkUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIGZ1dHVyZXMgRnV0dXJlcworICAgKiBAaW5ncm91cCBjb25jdXJyZW5jeQorICAgKgorICAgKiBDbGFzc2VzIGZvciBmdXR1cmVzIHN1cHBvcnQuCisgICAqIEB7CisgICAqLworCisgIC8vLyBFcnJvciBjb2RlIGZvciBmdXR1cmVzCisgIGVudW0gY2xhc3MgZnV0dXJlX2VycmMKKyAgeworICAgIGJyb2tlbl9wcm9taXNlLAorICAgIGZ1dHVyZV9hbHJlYWR5X3JldHJpZXZlZCwKKyAgICBwcm9taXNlX2FscmVhZHlfc2F0aXNmaWVkLAorICAgIG5vX3N0YXRlCisgIH07CisKKyAgLy8vIFNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxmdXR1cmVfZXJyYz4gOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLy8gUG9pbnRzIHRvIGEgc3RhdGljYWxseS1hbGxvY2F0ZWQgb2JqZWN0IGRlcml2ZWQgZnJvbSBlcnJvcl9jYXRlZ29yeS4KKyAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmCisgIGZ1dHVyZV9jYXRlZ29yeSgpOworCisgIC8vLyBPdmVybG9hZCBmb3IgbWFrZV9lcnJvcl9jb2RlLgorICBpbmxpbmUgZXJyb3JfY29kZSAKKyAgbWFrZV9lcnJvcl9jb2RlKGZ1dHVyZV9lcnJjIF9fZXJyYykKKyAgeyByZXR1cm4gZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KF9fZXJyYyksIGZ1dHVyZV9jYXRlZ29yeSgpKTsgfQorCisgIC8vLyBPdmVybG9hZCBmb3IgbWFrZV9lcnJvcl9jb25kaXRpb24uCisgIGlubGluZSBlcnJvcl9jb25kaXRpb24gCisgIG1ha2VfZXJyb3JfY29uZGl0aW9uKGZ1dHVyZV9lcnJjIF9fZXJyYykKKyAgeyByZXR1cm4gZXJyb3JfY29uZGl0aW9uKHN0YXRpY19jYXN0PGludD4oX19lcnJjKSwgZnV0dXJlX2NhdGVnb3J5KCkpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRXhjZXB0aW9uIHR5cGUgdGhyb3duIGJ5IGZ1dHVyZXMuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBmdXR1cmVfZXJyb3IgOiBwdWJsaWMgbG9naWNfZXJyb3IKKyAgeworICAgIGVycm9yX2NvZGUgCQkJX01fY29kZTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgZnV0dXJlX2Vycm9yKGVycm9yX2NvZGUgX19lYykKKyAgICA6IGxvZ2ljX2Vycm9yKCJzdGQ6OmZ1dHVyZV9lcnJvciIpLCBfTV9jb2RlKF9fZWMpCisgICAgeyB9CisKKyAgICB2aXJ0dWFsIH5mdXR1cmVfZXJyb3IoKSB0aHJvdygpOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiAKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKTsKKworICAgIGNvbnN0IGVycm9yX2NvZGUmIAorICAgIGNvZGUoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIF9NX2NvZGU7IH0KKyAgfTsKKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBmdXR1cmU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBzaGFyZWRfZnV0dXJlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgYXRvbWljX2Z1dHVyZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPiAKKyAgICBjbGFzcyBwYWNrYWdlZF90YXNrOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgcHJvbWlzZTsKKworICAvLy8gTGF1bmNoIGNvZGUgZm9yIGZ1dHVyZXMKKyAgZW51bSBjbGFzcyBsYXVuY2ggCisgIHsgCisgICAgYW55LCAKKyAgICBhc3luYywgCisgICAgc3luYyAKKyAgfTsKKworICAvLy8gU3RhdHVzIGNvZGUgZm9yIGZ1dHVyZXMKKyAgZW51bSBjbGFzcyBmdXR1cmVfc3RhdHVzIAorICB7CisgICAgcmVhZHksCisgICAgdGltZW91dCwKKyAgICBkZWZlcnJlZAorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZT4KKyAgICBhc3luYyhsYXVuY2ggX19wb2xpY3ksIF9GbiYmIF9fZm4sIF9BcmdzJiYuLi4gX19hcmdzKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm5DaGVjaywgdHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19hc3luY19zZmluYWVfaGVscGVyCisgICAgeworICAgICAgdHlwZWRlZiBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19hc3luY19zZmluYWVfaGVscGVyPGxhdW5jaCwgX0ZuLCBfQXJncy4uLj4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICB0eXBlbmFtZQorICAgIF9fYXN5bmNfc2ZpbmFlX2hlbHBlcjx0eXBlbmFtZSBkZWNheTxfRm4+Ojp0eXBlLCBfRm4sIF9BcmdzLi4uPjo6dHlwZQorICAgIGFzeW5jKF9GbiYmIF9fZm4sIF9BcmdzJiYuLi4gX19hcmdzKTsKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSEFTX0dUSFJFQURTKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkgXAorICAmJiBkZWZpbmVkKF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU180KQorCisgIC8vLyBCYXNlIGNsYXNzIGFuZCBlbmNsb3Npbmcgc2NvcGUuCisgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlCisgIHsKKyAgICAvLy8gQmFzZSBjbGFzcyBmb3IgcmVzdWx0cy4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9iYXNlCisgICAgeworICAgICAgZXhjZXB0aW9uX3B0cgkJX01fZXJyb3I7CisKKyAgICAgIF9SZXN1bHRfYmFzZShjb25zdCBfUmVzdWx0X2Jhc2UmKSA9IGRlbGV0ZTsKKyAgICAgIF9SZXN1bHRfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9SZXN1bHRfYmFzZSYpID0gZGVsZXRlOworCisgICAgICAvLyBfTV9kZXN0cm95KCkgYWxsb3dzIGRlcml2ZWQgY2xhc3NlcyB0byBjb250cm9sIGRlYWxsb2NhdGlvbgorICAgICAgdmlydHVhbCB2b2lkIF9NX2Rlc3Ryb3koKSA9IDA7CisKKyAgICAgIHN0cnVjdCBfRGVsZXRlcgorICAgICAgeworCXZvaWQgb3BlcmF0b3IoKShfUmVzdWx0X2Jhc2UqIF9fZnIpIGNvbnN0IHsgX19mci0+X01fZGVzdHJveSgpOyB9CisgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgX1Jlc3VsdF9iYXNlKCk7CisgICAgICB2aXJ0dWFsIH5fUmVzdWx0X2Jhc2UoKTsKKyAgICB9OworCisgICAgLy8vIFJlc3VsdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgc3RydWN0IF9SZXN1bHQgOiBfUmVzdWx0X2Jhc2UKKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisJdHlwZWRlZiBhbGlnbm1lbnRfb2Y8X1Jlcz4JCQkJX19hX29mOworCXR5cGVkZWYgYWxpZ25lZF9zdG9yYWdlPHNpemVvZihfUmVzKSwgX19hX29mOjp2YWx1ZT4JX19hbGlnbl9zdG9yYWdlOworCXR5cGVkZWYgdHlwZW5hbWUgX19hbGlnbl9zdG9yYWdlOjp0eXBlCQkJX19hbGlnbl90eXBlOworCisJX19hbGlnbl90eXBlCQlfTV9zdG9yYWdlOworCWJvb2wgCQkJX01faW5pdGlhbGl6ZWQ7CisKKyAgICAgIHB1YmxpYzoKKwlfUmVzdWx0KCkgOiBfTV9pbml0aWFsaXplZCgpIHsgfQorCQorCX5fUmVzdWx0KCkKKwl7CisJICBpZiAoX01faW5pdGlhbGl6ZWQpCisJICAgIF9NX3ZhbHVlKCkufl9SZXMoKTsKKwl9CisKKwkvLyBSZXR1cm4gbHZhbHVlLCBmdXR1cmUgd2lsbCBhZGQgY29uc3Qgb3IgcnZhbHVlLXJlZmVyZW5jZQorCV9SZXMmIAorCV9NX3ZhbHVlKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PF9SZXMqPihfTV9hZGRyKCkpOyB9CisKKwl2b2lkCisJX01fc2V0KGNvbnN0IF9SZXMmIF9fcmVzKQorCXsKKwkgIDo6bmV3IChfTV9hZGRyKCkpIF9SZXMoX19yZXMpOworCSAgX01faW5pdGlhbGl6ZWQgPSB0cnVlOworCX0KKworCXZvaWQKKwlfTV9zZXQoX1JlcyYmIF9fcmVzKQorCXsKKwkgIDo6bmV3IChfTV9hZGRyKCkpIF9SZXMoc3RkOjptb3ZlKF9fcmVzKSk7CisJICBfTV9pbml0aWFsaXplZCA9IHRydWU7CisJfQorCisgICAgICBwcml2YXRlOgorCXZvaWQgX01fZGVzdHJveSgpIHsgZGVsZXRlIHRoaXM7IH0KKworCXZvaWQqIF9NX2FkZHIoKSB7IHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4oJl9NX3N0b3JhZ2UpOyB9CisgICAgfTsKKworICAgIC8vIFRPRE86IHVzZSB0ZW1wbGF0ZSBhbGlhcyB3aGVuIGF2YWlsYWJsZQorICAgIC8qCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgdXNpbmcgX1B0ciA9IHVuaXF1ZV9wdHI8X1JlcywgX1Jlc3VsdF9iYXNlOjpfRGVsZXRlcj47CisgICAgKi8KKyAgICAvLy8gQSB1bmlxdWVfcHRyIGJhc2VkIG9uIHRoZSBpbnN0YW50aWF0aW5nIHR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICAgIHN0cnVjdCBfUHRyCisgICAgICB7CisJdHlwZWRlZiB1bmlxdWVfcHRyPF9SZXMsIF9SZXN1bHRfYmFzZTo6X0RlbGV0ZXI+IHR5cGU7CisgICAgICB9OworCisgICAgLy8vIFJlc3VsdF9hbGxvYy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICBzdHJ1Y3QgX1Jlc3VsdF9hbGxvYyA6IF9SZXN1bHQ8X1Jlcz4sIF9BbGxvYworICAgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvYzo6dGVtcGxhdGUgcmViaW5kPF9SZXN1bHRfYWxsb2M+OjpvdGhlcgorICAgICAgICAgIF9fYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgICAgZXhwbGljaXQKKwlfUmVzdWx0X2FsbG9jKGNvbnN0IF9BbGxvYyYgX19hKSA6IF9SZXN1bHQ8X1Jlcz4oKSwgX0FsbG9jKF9fYSkKKyAgICAgICAgeyB9CisJCisgICAgICBwcml2YXRlOgorCXZvaWQgX01fZGVzdHJveSgpCisgICAgICAgIHsKKyAgICAgICAgICBfX2FsbG9jYXRvcl90eXBlIF9fYSgqdGhpcyk7CisgICAgICAgICAgX19hLmRlc3Ryb3kodGhpcyk7CisgICAgICAgICAgX19hLmRlYWxsb2NhdGUodGhpcywgMSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgc3RhdGljIHR5cGVuYW1lIF9QdHI8X1Jlc3VsdF9hbGxvYzxfUmVzLCBfQWxsb2NhdG9yPj46OnR5cGUKKyAgICAgIF9TX2FsbG9jYXRlX3Jlc3VsdChjb25zdCBfQWxsb2NhdG9yJiBfX2EpCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgX1Jlc3VsdF9hbGxvYzxfUmVzLCBfQWxsb2NhdG9yPglfX3Jlc3VsdF90eXBlOworICAgICAgICB0eXBlbmFtZSBfX3Jlc3VsdF90eXBlOjpfX2FsbG9jYXRvcl90eXBlIF9fYTIoX19hKTsKKyAgICAgICAgX19yZXN1bHRfdHlwZSogX19wID0gX19hMi5hbGxvY2F0ZSgxKTsKKyAgICAgICAgX190cnkKKwl7CisgICAgICAgICAgX19hMi5jb25zdHJ1Y3QoX19wLCBfX2EpOworICAgICAgICB9CisgICAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgICB7CisgICAgICAgICAgX19hMi5kZWFsbG9jYXRlKF9fcCwgMSk7CisgICAgICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHR5cGVuYW1lIF9QdHI8X19yZXN1bHRfdHlwZT46OnR5cGUoX19wKTsKKyAgICAgIH0KKworCisgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHN0YXRlIGJldHdlZW4gYSBwcm9taXNlIGFuZCBvbmUgb3IgbW9yZQorICAgIC8vLyBhc3NvY2lhdGVkIGZ1dHVyZXMuCisgICAgY2xhc3MgX1N0YXRlX2Jhc2UKKyAgICB7CisgICAgICB0eXBlZGVmIF9QdHI8X1Jlc3VsdF9iYXNlPjo6dHlwZSBfUHRyX3R5cGU7CisKKyAgICAgIF9QdHJfdHlwZQkJCV9NX3Jlc3VsdDsKKyAgICAgIG11dGV4ICAgICAgICAgICAgICAgCV9NX211dGV4OworICAgICAgY29uZGl0aW9uX3ZhcmlhYmxlICAJX01fY29uZDsKKyAgICAgIGF0b21pY19mbGFnICAgICAgICAgCV9NX3JldHJpZXZlZDsKKyAgICAgIG9uY2VfZmxhZwkJCV9NX29uY2U7CisKKyAgICBwdWJsaWM6CisgICAgICBfU3RhdGVfYmFzZSgpIDogX01fcmVzdWx0KCksIF9NX3JldHJpZXZlZChBVE9NSUNfRkxBR19JTklUKSB7IH0KKyAgICAgIF9TdGF0ZV9iYXNlKGNvbnN0IF9TdGF0ZV9iYXNlJikgPSBkZWxldGU7CisgICAgICBfU3RhdGVfYmFzZSYgb3BlcmF0b3I9KGNvbnN0IF9TdGF0ZV9iYXNlJikgPSBkZWxldGU7CisgICAgICB2aXJ0dWFsIH5fU3RhdGVfYmFzZSgpOworCisgICAgICBfUmVzdWx0X2Jhc2UmCisgICAgICB3YWl0KCkKKyAgICAgIHsKKwlfTV9ydW5fZGVmZXJyZWQoKTsKKwl1bmlxdWVfbG9jazxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwlpZiAoIV9NX3JlYWR5KCkpCisJICBfTV9jb25kLndhaXQoX19sb2NrLCBzdGQ6OmJpbmQ8Ym9vbD4oJl9TdGF0ZV9iYXNlOjpfTV9yZWFkeSwgdGhpcykpOworCXJldHVybiAqX01fcmVzdWx0OworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgICBib29sCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsKQorICAgICAgICB7CisJICB1bmlxdWVfbG9jazxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwkgIGF1dG8gX19ib3VuZCA9IHN0ZDo6YmluZDxib29sPigmX1N0YXRlX2Jhc2U6Ol9NX3JlYWR5LCB0aGlzKTsKKwkgIHJldHVybiBfTV9yZWFkeSgpIHx8IF9NX2NvbmQud2FpdF9mb3IoX19sb2NrLCBfX3JlbCwgX19ib3VuZCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgICAgYm9vbAorICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzKQorICAgICAgICB7CisJICB1bmlxdWVfbG9jazxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKwkgIGF1dG8gX19ib3VuZCA9IHN0ZDo6YmluZDxib29sPigmX1N0YXRlX2Jhc2U6Ol9NX3JlYWR5LCB0aGlzKTsKKwkgIHJldHVybiBfTV9yZWFkeSgpIHx8IF9NX2NvbmQud2FpdF91bnRpbChfX2xvY2ssIF9fYWJzLCBfX2JvdW5kKTsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3NldF9yZXN1bHQoZnVuY3Rpb248X1B0cl90eXBlKCk+IF9fcmVzLCBib29sIF9faWdub3JlX2ZhaWx1cmUgPSBmYWxzZSkKKyAgICAgIHsKKyAgICAgICAgYm9vbCBfX3NldCA9IF9faWdub3JlX2ZhaWx1cmU7CisgICAgICAgIC8vIGFsbCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBzZXJpYWxpemVkLAorICAgICAgICAvLyBzaWRlLWVmZmVjdHMgb2YgaW52b2tpbmcgX19yZXMgb25seSBoYXBwZW4gb25jZQorICAgICAgICBjYWxsX29uY2UoX01fb25jZSwgJl9TdGF0ZV9iYXNlOjpfTV9kb19zZXQsIHRoaXMsIHJlZihfX3JlcyksCisgICAgICAgICAgICByZWYoX19zZXQpKTsKKyAgICAgICAgaWYgKCFfX3NldCkKKyAgICAgICAgICBfX3Rocm93X2Z1dHVyZV9lcnJvcihpbnQoZnV0dXJlX2VycmM6OnByb21pc2VfYWxyZWFkeV9zYXRpc2ZpZWQpKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fYnJlYWtfcHJvbWlzZShfUHRyX3R5cGUgX19yZXMpCisgICAgICB7CisJaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9fcmVzKSkKKwkgIHsKKwkgICAgZXJyb3JfY29kZSBfX2VjKG1ha2VfZXJyb3JfY29kZShmdXR1cmVfZXJyYzo6YnJva2VuX3Byb21pc2UpKTsKKwkgICAgX19yZXMtPl9NX2Vycm9yID0gY29weV9leGNlcHRpb24oZnV0dXJlX2Vycm9yKF9fZWMpKTsKKwkgICAgeworCSAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IF9fbG9jayhfTV9tdXRleCk7CisJICAgICAgX01fcmVzdWx0LnN3YXAoX19yZXMpOworCSAgICB9CisJICAgIF9NX2NvbmQubm90aWZ5X2FsbCgpOworCSAgfQorICAgICAgfQorCisgICAgICAvLyBDYWxsZWQgd2hlbiB0aGlzIG9iamVjdCBpcyBwYXNzZWQgdG8gYSBmdXR1cmUuCisgICAgICB2b2lkCisgICAgICBfTV9zZXRfcmV0cmlldmVkX2ZsYWcoKQorICAgICAgeworCWlmIChfTV9yZXRyaWV2ZWQudGVzdF9hbmRfc2V0KCkpCisJICBfX3Rocm93X2Z1dHVyZV9lcnJvcihpbnQoZnV0dXJlX2VycmM6OmZ1dHVyZV9hbHJlYWR5X3JldHJpZXZlZCkpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQXJnPgorICAgICAgICBzdHJ1Y3QgX1NldHRlcjsKKworICAgICAgLy8gc2V0IGx2YWx1ZXMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9Bcmc+CisgICAgICAgIHN0cnVjdCBfU2V0dGVyPF9SZXMsIF9BcmcmPgorICAgICAgICB7CisgICAgICAgICAgLy8gY2hlY2sgdGhpcyBpcyBvbmx5IHVzZWQgYnkgcHJvbWlzZTxSPjo6c2V0X3ZhbHVlKGNvbnN0IFImKQorICAgICAgICAgIC8vIG9yIHByb21pc2U8Uj46OnNldF92YWx1ZShSJikKKyAgICAgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8X1JlcywgX0FyZyY+Ojp2YWx1ZSAgLy8gcHJvbWlzZTxSJj4KKyAgICAgICAgICAgICAgfHwgaXNfc2FtZTxjb25zdCBfUmVzLCBfQXJnPjo6dmFsdWUsICAvLyBwcm9taXNlPFI+CisgICAgICAgICAgICAgICJJbnZhbGlkIHNwZWNpYWxpc2F0aW9uIik7CisKKyAgICAgICAgICB0eXBlbmFtZSBwcm9taXNlPF9SZXM+OjpfUHRyX3R5cGUgb3BlcmF0b3IoKSgpCisgICAgICAgICAgeworICAgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3Byb21pc2UtPl9NX2Z1dHVyZSk7CisgICAgICAgICAgICBfTV9wcm9taXNlLT5fTV9zdG9yYWdlLT5fTV9zZXQoX01fYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByb21pc2U8X1Jlcz4qICAgIF9NX3Byb21pc2U7CisgICAgICAgICAgX0FyZyYgICAgICAgICAgICAgX01fYXJnOworICAgICAgICB9OworCisgICAgICAvLyBzZXQgcnZhbHVlcworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICAgICAgc3RydWN0IF9TZXR0ZXI8X1JlcywgX1JlcyYmPgorICAgICAgICB7CisgICAgICAgICAgdHlwZW5hbWUgcHJvbWlzZTxfUmVzPjo6X1B0cl90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9wcm9taXNlLT5fTV9mdXR1cmUpOworICAgICAgICAgICAgX01fcHJvbWlzZS0+X01fc3RvcmFnZS0+X01fc2V0KHN0ZDo6bW92ZShfTV9hcmcpKTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByb21pc2U8X1Jlcz4qICAgIF9NX3Byb21pc2U7CisgICAgICAgICAgX1JlcyYgICAgICAgICAgICAgX01fYXJnOworICAgICAgICB9OworCisgICAgICBzdHJ1Y3QgX19leGNlcHRpb25fcHRyX3RhZyB7IH07CisKKyAgICAgIC8vIHNldCBleGNlcHRpb25zCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgICBzdHJ1Y3QgX1NldHRlcjxfUmVzLCBfX2V4Y2VwdGlvbl9wdHJfdGFnPgorICAgICAgICB7CisgICAgICAgICAgdHlwZW5hbWUgcHJvbWlzZTxfUmVzPjo6X1B0cl90eXBlIG9wZXJhdG9yKCkoKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9TdGF0ZV9iYXNlOjpfU19jaGVjayhfTV9wcm9taXNlLT5fTV9mdXR1cmUpOworICAgICAgICAgICAgX01fcHJvbWlzZS0+X01fc3RvcmFnZS0+X01fZXJyb3IgPSBfTV9leDsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgcHJvbWlzZTxfUmVzPiogICBfTV9wcm9taXNlOworICAgICAgICAgIGV4Y2VwdGlvbl9wdHImICAgIF9NX2V4OworICAgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQXJnPgorICAgICAgICBzdGF0aWMgX1NldHRlcjxfUmVzLCBfQXJnJiY+CisgICAgICAgIF9fc2V0dGVyKHByb21pc2U8X1Jlcz4qIF9fcHJvbSwgX0FyZyYmIF9fYXJnKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9TZXR0ZXI8X1JlcywgX0FyZyYmPnsgX19wcm9tLCBfX2FyZyB9OworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgICAgIHN0YXRpYyBfU2V0dGVyPF9SZXMsIF9fZXhjZXB0aW9uX3B0cl90YWc+CisgICAgICAgIF9fc2V0dGVyKGV4Y2VwdGlvbl9wdHImIF9fZXgsIHByb21pc2U8X1Jlcz4qIF9fcHJvbSkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfU2V0dGVyPF9SZXMsIF9fZXhjZXB0aW9uX3B0cl90YWc+eyBfX3Byb20sIF9fZXggfTsKKyAgICAgICAgfQorCisgICAgICBzdGF0aWMgX1NldHRlcjx2b2lkLCB2b2lkPgorICAgICAgX19zZXR0ZXIocHJvbWlzZTx2b2lkPiogX19wcm9tKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgYm9vbAorICAgICAgICBfU19jaGVjayhjb25zdCBzaGFyZWRfcHRyPF9UcD4mIF9fcCkKKyAgICAgICAgeworICAgICAgICAgIGlmICghc3RhdGljX2Nhc3Q8Ym9vbD4oX19wKSkKKyAgICAgICAgICAgIF9fdGhyb3dfZnV0dXJlX2Vycm9yKChpbnQpZnV0dXJlX2VycmM6Om5vX3N0YXRlKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RvX3NldChmdW5jdGlvbjxfUHRyX3R5cGUoKT4mIF9fZiwgYm9vbCYgX19zZXQpCisgICAgICB7CisgICAgICAgIF9QdHJfdHlwZSBfX3JlcyA9IF9fZigpOworICAgICAgICB7CisgICAgICAgICAgbG9ja19ndWFyZDxtdXRleD4gX19sb2NrKF9NX211dGV4KTsKKyAgICAgICAgICBfTV9yZXN1bHQuc3dhcChfX3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgX01fY29uZC5ub3RpZnlfYWxsKCk7CisgICAgICAgIF9fc2V0ID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgYm9vbCBfTV9yZWFkeSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9NX3Jlc3VsdCk7IH0KKworICAgICAgdmlydHVhbCB2b2lkIF9NX3J1bl9kZWZlcnJlZCgpIHsgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgICAgY2xhc3MgX0RlZmVycmVkX3N0YXRlOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICAgIGNsYXNzIF9Bc3luY19zdGF0ZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgICBjbGFzcyBfVGFza19zdGF0ZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQsIHR5cGVuYW1lIF9SZXMgPSB0eXBlbmFtZSBfU3RhdGVUOjpfUmVzX3R5cGU+CisgICAgICBzdHJ1Y3QgX1Rhc2tfc2V0dGVyOworICB9OworCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciByZWZlcmVuY2UgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8X1JlcyY+IDogX19mdXR1cmVfYmFzZTo6X1Jlc3VsdF9iYXNlCisgICAgeworICAgICAgX1Jlc3VsdCgpIDogX01fdmFsdWVfcHRyKCkgeyB9CisKKyAgICAgIHZvaWQgX01fc2V0KF9SZXMmIF9fcmVzKSB7IF9NX3ZhbHVlX3B0ciA9ICZfX3JlczsgfQorCisgICAgICBfUmVzJiBfTV9nZXQoKSB7IHJldHVybiAqX01fdmFsdWVfcHRyOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX1JlcyogCQkJX01fdmFsdWVfcHRyOworICAgICAgCisgICAgICB2b2lkIF9NX2Rlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisgICAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZm9yIHZvaWQuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19mdXR1cmVfYmFzZTo6X1Jlc3VsdDx2b2lkPiA6IF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHRfYmFzZQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdm9pZCBfTV9kZXN0cm95KCkgeyBkZWxldGUgdGhpczsgfQorICAgIH07CisKKworICAvLy8gQ29tbW9uIGltcGxlbWVudGF0aW9uIGZvciBmdXR1cmUgYW5kIHNoYXJlZF9mdXR1cmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgX19iYXNpY19mdXR1cmUgOiBwdWJsaWMgX19mdXR1cmVfYmFzZQorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB0eXBlZGVmIHNoYXJlZF9wdHI8X1N0YXRlX2Jhc2U+CQlfX3N0YXRlX3R5cGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8X1Jlcz4mCV9fcmVzdWx0X3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdGF0ZV90eXBlIAkJX01fc3RhdGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBEaXNhYmxlIGNvcHlpbmcuCisgICAgICBfX2Jhc2ljX2Z1dHVyZShjb25zdCBfX2Jhc2ljX2Z1dHVyZSYpID0gZGVsZXRlOworICAgICAgX19iYXNpY19mdXR1cmUmIG9wZXJhdG9yPShjb25zdCBfX2Jhc2ljX2Z1dHVyZSYpID0gZGVsZXRlOworCisgICAgICBib29sIAorICAgICAgdmFsaWQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPihfTV9zdGF0ZSk7IH0KKworICAgICAgdm9pZCAKKyAgICAgIHdhaXQoKSBjb25zdAorICAgICAgeworICAgICAgICBfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworICAgICAgICBfTV9zdGF0ZS0+d2FpdCgpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgICBib29sCisgICAgICAgIHdhaXRfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcmVsKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgICByZXR1cm4gX01fc3RhdGUtPndhaXRfZm9yKF9fcmVsKTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xvY2ssIHR5cGVuYW1lIF9EdXJhdGlvbj4KKyAgICAgICAgYm9vbAorICAgICAgICB3YWl0X3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYWJzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgICByZXR1cm4gX01fc3RhdGUtPndhaXRfdW50aWwoX19hYnMpOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLy8gV2FpdCBmb3IgdGhlIHN0YXRlIHRvIGJlIHJlYWR5IGFuZCByZXRocm93IGFueSBzdG9yZWQgZXhjZXB0aW9uCisgICAgICBfX3Jlc3VsdF90eXBlCisgICAgICBfTV9nZXRfcmVzdWx0KCkKKyAgICAgIHsKKyAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgX1Jlc3VsdF9iYXNlJiBfX3JlcyA9IF9NX3N0YXRlLT53YWl0KCk7CisgICAgICAgIGlmICghKF9fcmVzLl9NX2Vycm9yID09IDApKQorICAgICAgICAgIHJldGhyb3dfZXhjZXB0aW9uKF9fcmVzLl9NX2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9fcmVzdWx0X3R5cGU+KF9fcmVzKTsKKyAgICAgIH0KKworICAgICAgdm9pZCBfTV9zd2FwKF9fYmFzaWNfZnV0dXJlJiBfX3RoYXQpCisgICAgICB7CisgICAgICAgIF9NX3N0YXRlLnN3YXAoX190aGF0Ll9NX3N0YXRlKTsKKyAgICAgIH0KKworICAgICAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnV0dXJlIGJ5IHByb21pc2U6OmdldF9mdXR1cmUoKQorICAgICAgZXhwbGljaXQKKyAgICAgIF9fYmFzaWNfZnV0dXJlKGNvbnN0IF9fc3RhdGVfdHlwZSYgX19zdGF0ZSkgOiBfTV9zdGF0ZShfX3N0YXRlKQorICAgICAgeworICAgICAgICBfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworICAgICAgICBfTV9zdGF0ZS0+X01fc2V0X3JldHJpZXZlZF9mbGFnKCk7CisgICAgICB9CisKKyAgICAgIC8vIENvcHkgY29uc3RydWN0aW9uIGZyb20gYSBzaGFyZWRfZnV0dXJlCisgICAgICBleHBsaWNpdAorICAgICAgX19iYXNpY19mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZTxfUmVzPiYpOworCisgICAgICAvLyBNb3ZlIGNvbnN0cnVjdGlvbiBmcm9tIGEgc2hhcmVkX2Z1dHVyZQorICAgICAgZXhwbGljaXQKKyAgICAgIF9fYmFzaWNfZnV0dXJlKHNoYXJlZF9mdXR1cmU8X1Jlcz4mJik7CisKKyAgICAgIC8vIE1vdmUgY29uc3RydWN0aW9uIGZyb20gYSBmdXR1cmUKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX2Jhc2ljX2Z1dHVyZShmdXR1cmU8X1Jlcz4mJik7CisKKyAgICAgIGNvbnN0ZXhwciBfX2Jhc2ljX2Z1dHVyZSgpIDogX01fc3RhdGUoKSB7IH0KKworICAgICAgc3RydWN0IF9SZXNldAorICAgICAgeworICAgICAgICBleHBsaWNpdCBfUmVzZXQoX19iYXNpY19mdXR1cmUmIF9fZnV0KSA6IF9NX2Z1dChfX2Z1dCkgeyB9CisgICAgICAgIH5fUmVzZXQoKSB7IF9NX2Z1dC5fTV9zdGF0ZS5yZXNldCgpOyB9CisgICAgICAgIF9fYmFzaWNfZnV0dXJlJiBfTV9mdXQ7CisgICAgICB9OworICAgIH07CisKKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSBmb3IgZnV0dXJlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIGZ1dHVyZSA6IHB1YmxpYyBfX2Jhc2ljX2Z1dHVyZTxfUmVzPgorICAgIHsKKyAgICAgIGZyaWVuZCBjbGFzcyBwcm9taXNlPF9SZXM+OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBwYWNrYWdlZF90YXNrOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgZnJpZW5kIGZ1dHVyZTx0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGU+CisgICAgICAgIGFzeW5jKGxhdW5jaCwgX0ZuJiYsIF9BcmdzJiYuLi4pOworCisgICAgICB0eXBlZGVmIF9fYmFzaWNfZnV0dXJlPF9SZXM+IF9CYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9fc3RhdGVfdHlwZSBfX3N0YXRlX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBmdXR1cmUoY29uc3QgX19zdGF0ZV90eXBlJiBfX3N0YXRlKSA6IF9CYXNlX3R5cGUoX19zdGF0ZSkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgZnV0dXJlKCkgOiBfQmFzZV90eXBlKCkgeyB9CisKKyAgICAgIC8vLyBNb3ZlIGNvbnN0cnVjdG9yCisgICAgICBmdXR1cmUoZnV0dXJlJiYgX191ZikgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3VmKSkgeyB9CisKKyAgICAgIC8vIERpc2FibGUgY29weWluZworICAgICAgZnV0dXJlKGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgICAgZnV0dXJlJiBvcGVyYXRvcj0oY29uc3QgZnV0dXJlJikgPSBkZWxldGU7CisKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGZ1dHVyZSYmIF9fZnV0KQorICAgICAgeworICAgICAgICBmdXR1cmUoc3RkOjptb3ZlKF9fZnV0KSkuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICBfUmVzCisgICAgICBnZXQoKQorICAgICAgeworICAgICAgICB0eXBlbmFtZSBfQmFzZV90eXBlOjpfUmVzZXQgX19yZXNldCgqdGhpcyk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUodGhpcy0+X01fZ2V0X3Jlc3VsdCgpLl9NX3ZhbHVlKCkpOworICAgICAgfQorICAgIH07CisgCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBmdXR1cmU8UiY+CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgZnV0dXJlPF9SZXMmPiA6IHB1YmxpYyBfX2Jhc2ljX2Z1dHVyZTxfUmVzJj4KKyAgICB7CisgICAgICBmcmllbmQgY2xhc3MgcHJvbWlzZTxfUmVzJj47CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIHBhY2thZ2VkX3Rhc2s7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4sIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICBmcmllbmQgZnV0dXJlPHR5cGVuYW1lIHJlc3VsdF9vZjxfRm4oX0FyZ3MuLi4pPjo6dHlwZT4KKyAgICAgICAgYXN5bmMobGF1bmNoLCBfRm4mJiwgX0FyZ3MmJi4uLik7CisKKyAgICAgIHR5cGVkZWYgX19iYXNpY19mdXR1cmU8X1JlcyY+IF9CYXNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9fc3RhdGVfdHlwZSBfX3N0YXRlX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBmdXR1cmUoY29uc3QgX19zdGF0ZV90eXBlJiBfX3N0YXRlKSA6IF9CYXNlX3R5cGUoX19zdGF0ZSkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgZnV0dXJlKCkgOiBfQmFzZV90eXBlKCkgeyB9CisKKyAgICAgIC8vLyBNb3ZlIGNvbnN0cnVjdG9yCisgICAgICBmdXR1cmUoZnV0dXJlJiYgX191ZikgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3VmKSkgeyB9CisKKyAgICAgIC8vIERpc2FibGUgY29weWluZworICAgICAgZnV0dXJlKGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworICAgICAgZnV0dXJlJiBvcGVyYXRvcj0oY29uc3QgZnV0dXJlJikgPSBkZWxldGU7CisKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGZ1dHVyZSYmIF9fZnV0KQorICAgICAgeworICAgICAgICBmdXR1cmUoc3RkOjptb3ZlKF9fZnV0KSkuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICBfUmVzJiAKKyAgICAgIGdldCgpCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9SZXNldCBfX3Jlc2V0KCp0aGlzKTsKKyAgICAgICAgcmV0dXJuIHRoaXMtPl9NX2dldF9yZXN1bHQoKS5fTV9nZXQoKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgZnV0dXJlPHZvaWQ+CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBmdXR1cmU8dm9pZD4gOiBwdWJsaWMgX19iYXNpY19mdXR1cmU8dm9pZD4KKyAgICB7CisgICAgICBmcmllbmQgY2xhc3MgcHJvbWlzZTx2b2lkPjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgcGFja2FnZWRfdGFzazsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGZyaWVuZCBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgICAgICBhc3luYyhsYXVuY2gsIF9GbiYmLCBfQXJncyYmLi4uKTsKKworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTx2b2lkPiBfQmFzZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpfX3N0YXRlX3R5cGUgX19zdGF0ZV90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgZnV0dXJlKGNvbnN0IF9fc3RhdGVfdHlwZSYgX19zdGF0ZSkgOiBfQmFzZV90eXBlKF9fc3RhdGUpIHsgfQorCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIGZ1dHVyZSgpIDogX0Jhc2VfdHlwZSgpIHsgfQorCisgICAgICAvLy8gTW92ZSBjb25zdHJ1Y3RvcgorICAgICAgZnV0dXJlKGZ1dHVyZSYmIF9fdWYpIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX191ZikpIHsgfQorCisgICAgICAvLyBEaXNhYmxlIGNvcHlpbmcKKyAgICAgIGZ1dHVyZShjb25zdCBmdXR1cmUmKSA9IGRlbGV0ZTsKKyAgICAgIGZ1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IGZ1dHVyZSYpID0gZGVsZXRlOworCisgICAgICBmdXR1cmUmIG9wZXJhdG9yPShmdXR1cmUmJiBfX2Z1dCkKKyAgICAgIHsKKyAgICAgICAgZnV0dXJlKHN0ZDo6bW92ZShfX2Z1dCkpLl9NX3N3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8vLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgdm9pZCAKKyAgICAgIGdldCgpCisgICAgICB7CisgICAgICAgIHR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9SZXNldCBfX3Jlc2V0KCp0aGlzKTsKKyAgICAgICAgdGhpcy0+X01fZ2V0X3Jlc3VsdCgpOworICAgICAgfQorICAgIH07CisKKworICAvLy8gUHJpbWFyeSB0ZW1wbGF0ZSBmb3Igc2hhcmVkX2Z1dHVyZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBzaGFyZWRfZnV0dXJlIDogcHVibGljIF9fYmFzaWNfZnV0dXJlPF9SZXM+CisgICAgeworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTxfUmVzPiBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHNoYXJlZF9mdXR1cmUoKSA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IKKyAgICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikgOiBfQmFzZV90eXBlKF9fc2YpIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBmdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTxfUmVzPiYmIF9fdWYpCisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fdWYpKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIHNoYXJlZF9mdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKHNoYXJlZF9mdXR1cmUmJiBfX3NmKQorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3NmKSkKKyAgICAgIHsgfQorCisgICAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX2Z1dHVyZShfX3NmKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oc2hhcmVkX2Z1dHVyZSYmIF9fc2YpCisgICAgICB7CisgICAgICAgIHNoYXJlZF9mdXR1cmUoc3RkOjptb3ZlKF9fc2YpKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLy8gUmV0cmlldmluZyB0aGUgdmFsdWUKKyAgICAgIGNvbnN0IF9SZXMmCisgICAgICBnZXQoKQorICAgICAgeworCXR5cGVuYW1lIF9CYXNlX3R5cGU6Ol9fcmVzdWx0X3R5cGUgX19yID0gdGhpcy0+X01fZ2V0X3Jlc3VsdCgpOworCV9SZXMmIF9fcnMoX19yLl9NX3ZhbHVlKCkpOworCXJldHVybiBfX3JzOworICAgICAgfQorICAgIH07CisgCisgIC8vLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfZnV0dXJlPFImPgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIHNoYXJlZF9mdXR1cmU8X1JlcyY+IDogcHVibGljIF9fYmFzaWNfZnV0dXJlPF9SZXMmPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19iYXNpY19mdXR1cmU8X1JlcyY+ICAgICAgICAgICBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHNoYXJlZF9mdXR1cmUoKSA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IKKyAgICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikgOiBfQmFzZV90eXBlKF9fc2YpIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBmdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTxfUmVzJj4mJiBfX3VmKQorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3VmKSkKKyAgICAgIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBzaGFyZWRfZnV0dXJlIHJ2YWx1ZQorICAgICAgc2hhcmVkX2Z1dHVyZShzaGFyZWRfZnV0dXJlJiYgX19zZikKKyAgICAgIDogX0Jhc2VfdHlwZShzdGQ6Om1vdmUoX19zZikpCisgICAgICB7IH0KKworICAgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9mdXR1cmUmIF9fc2YpCisgICAgICB7CisgICAgICAgIHNoYXJlZF9mdXR1cmUoX19zZikuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX2Z1dHVyZSYgb3BlcmF0b3I9KHNoYXJlZF9mdXR1cmUmJiBfX3NmKQorICAgICAgeworICAgICAgICBzaGFyZWRfZnV0dXJlKHN0ZDo6bW92ZShfX3NmKSkuX01fc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgLy8vIFJldHJpZXZpbmcgdGhlIHZhbHVlCisgICAgICBfUmVzJiAKKyAgICAgIGdldCgpIHsgcmV0dXJuIHRoaXMtPl9NX2dldF9yZXN1bHQoKS5fTV9nZXQoKTsgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfZnV0dXJlPHZvaWQ+CisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBzaGFyZWRfZnV0dXJlPHZvaWQ+IDogcHVibGljIF9fYmFzaWNfZnV0dXJlPHZvaWQ+CisgICAgeworICAgICAgdHlwZWRlZiBfX2Jhc2ljX2Z1dHVyZTx2b2lkPiBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHNoYXJlZF9mdXR1cmUoKSA6IF9CYXNlX3R5cGUoKSB7IH0KKworICAgICAgLy8vIENvcHkgY29uc3RydWN0b3IKKyAgICAgIHNoYXJlZF9mdXR1cmUoY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikgOiBfQmFzZV90eXBlKF9fc2YpIHsgfQorCisgICAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBmdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKGZ1dHVyZTx2b2lkPiYmIF9fdWYpCisgICAgICA6IF9CYXNlX3R5cGUoc3RkOjptb3ZlKF9fdWYpKQorICAgICAgeyB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIHNoYXJlZF9mdXR1cmUgcnZhbHVlCisgICAgICBzaGFyZWRfZnV0dXJlKHNoYXJlZF9mdXR1cmUmJiBfX3NmKQorICAgICAgOiBfQmFzZV90eXBlKHN0ZDo6bW92ZShfX3NmKSkKKyAgICAgIHsgfQorCisgICAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX2Z1dHVyZSYgX19zZikKKyAgICAgIHsKKyAgICAgICAgc2hhcmVkX2Z1dHVyZShfX3NmKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBzaGFyZWRfZnV0dXJlJiBvcGVyYXRvcj0oc2hhcmVkX2Z1dHVyZSYmIF9fc2YpCisgICAgICB7CisgICAgICAgIHNoYXJlZF9mdXR1cmUoc3RkOjptb3ZlKF9fc2YpKS5fTV9zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBSZXRyaWV2aW5nIHRoZSB2YWx1ZQorICAgICAgdm9pZCAKKyAgICAgIGdldCgpIHsgdGhpcy0+X01fZ2V0X3Jlc3VsdCgpOyB9CisgICAgfTsKKworICAvLyBOb3cgd2UgY2FuIGRlZmluZSB0aGUgcHJvdGVjdGVkIF9fYmFzaWNfZnV0dXJlIGNvbnN0cnVjdG9ycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBpbmxpbmUgX19iYXNpY19mdXR1cmU8X1Jlcz46OgorICAgIF9fYmFzaWNfZnV0dXJlKGNvbnN0IHNoYXJlZF9mdXR1cmU8X1Jlcz4mIF9fc2YpCisgICAgOiBfTV9zdGF0ZShfX3NmLl9NX3N0YXRlKQorICAgIHsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgaW5saW5lIF9fYmFzaWNfZnV0dXJlPF9SZXM+OjoKKyAgICBfX2Jhc2ljX2Z1dHVyZShzaGFyZWRfZnV0dXJlPF9SZXM+JiYgX19zZikKKyAgICA6IF9NX3N0YXRlKHN0ZDo6bW92ZShfX3NmLl9NX3N0YXRlKSkKKyAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGlubGluZSBfX2Jhc2ljX2Z1dHVyZTxfUmVzPjo6CisgICAgX19iYXNpY19mdXR1cmUoZnV0dXJlPF9SZXM+JiYgX191ZikKKyAgICA6IF9NX3N0YXRlKHN0ZDo6bW92ZShfX3VmLl9NX3N0YXRlKSkKKyAgICB7IH0KKworCisgIC8vLyBQcmltYXJ5IHRlbXBsYXRlIGZvciBwcm9taXNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgcHJvbWlzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UgCQkJX1N0YXRlOworICAgICAgdHlwZWRlZiBfX2Z1dHVyZV9iYXNlOjpfUmVzdWx0PF9SZXM+CQkJX1Jlc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1dHVyZV9iYXNlOjpfUHRyPF9SZXNfdHlwZT46OnR5cGUJX1B0cl90eXBlOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgX1N0YXRlOjpfU2V0dGVyOworICAgICAgCisgICAgICBzaGFyZWRfcHRyPF9TdGF0ZT4gICAgICAgICAgICAgICAgICAgICAgICBfTV9mdXR1cmU7CisgICAgICBfUHRyX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9zdG9yYWdlOworCisgICAgcHVibGljOgorICAgICAgcHJvbWlzZSgpCisgICAgICA6IF9NX2Z1dHVyZShzdGQ6Om1ha2Vfc2hhcmVkPF9TdGF0ZT4oKSksCisJX01fc3RvcmFnZShuZXcgX1Jlc190eXBlKCkpCisgICAgICB7IH0KKworICAgICAgcHJvbWlzZShwcm9taXNlJiYgX19yaHMpCisgICAgICA6IF9NX2Z1dHVyZShzdGQ6Om1vdmUoX19yaHMuX01fZnV0dXJlKSksCisJX01fc3RvcmFnZShzdGQ6Om1vdmUoX19yaHMuX01fc3RvcmFnZSkpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkKKyAgICAgICAgOiBfTV9mdXR1cmUoc3RkOjphbGxvY2F0ZV9zaGFyZWQ8X1N0YXRlPihfX2EpKSwKKwkgIF9NX3N0b3JhZ2UoX19mdXR1cmVfYmFzZTo6X1NfYWxsb2NhdGVfcmVzdWx0PF9SZXM+KF9fYSkpCisgICAgICAgIHsgfQorCisgICAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgfnByb21pc2UoKQorICAgICAgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX01fZnV0dXJlKSAmJiAhX01fZnV0dXJlLnVuaXF1ZSgpKQorICAgICAgICAgIF9NX2Z1dHVyZS0+X01fYnJlYWtfcHJvbWlzZShzdGQ6Om1vdmUoX01fc3RvcmFnZSkpOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ25tZW50CisgICAgICBwcm9taXNlJgorICAgICAgb3BlcmF0b3I9KHByb21pc2UmJiBfX3JocykKKyAgICAgIHsKKyAgICAgICAgcHJvbWlzZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHByb21pc2UmIF9fcmhzKQorICAgICAgeworICAgICAgICBfTV9mdXR1cmUuc3dhcChfX3Jocy5fTV9mdXR1cmUpOworICAgICAgICBfTV9zdG9yYWdlLnN3YXAoX19yaHMuX01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHJpZXZpbmcgdGhlIHJlc3VsdAorICAgICAgZnV0dXJlPF9SZXM+CisgICAgICBnZXRfZnV0dXJlKCkKKyAgICAgIHsgcmV0dXJuIGZ1dHVyZTxfUmVzPihfTV9mdXR1cmUpOyB9CisKKyAgICAgIC8vIFNldHRpbmcgdGhlIHJlc3VsdAorICAgICAgdm9pZAorICAgICAgc2V0X3ZhbHVlKGNvbnN0IF9SZXMmIF9fcikKKyAgICAgIHsKKyAgICAgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIodGhpcywgX19yKTsKKyAgICAgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzZXRfdmFsdWUoX1JlcyYmIF9fcikKKyAgICAgIHsKKyAgICAgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIodGhpcywgc3RkOjptb3ZlKF9fcikpOworICAgICAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBfX3ApCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKF9fcCwgdGhpcyk7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHByb21pc2U8X1Jlcz4mIF9feCwgcHJvbWlzZTxfUmVzPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBzdHJ1Y3QgdXNlc19hbGxvY2F0b3I8cHJvbWlzZTxfUmVzPiwgX0FsbG9jPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgcHJvbWlzZTxSJj4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlcz4KKyAgICBjbGFzcyBwcm9taXNlPF9SZXMmPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UJCQlfU3RhdGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8X1JlcyY+CQkJX1Jlc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1dHVyZV9iYXNlOjpfUHRyPF9SZXNfdHlwZT46OnR5cGUgCV9QdHJfdHlwZTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIF9TdGF0ZTo6X1NldHRlcjsKKworICAgICAgc2hhcmVkX3B0cjxfU3RhdGU+ICAgICAgICAgICAgICAgICAgICAgICAgX01fZnV0dXJlOworICAgICAgX1B0cl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01fc3RvcmFnZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHByb21pc2UoKQorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptYWtlX3NoYXJlZDxfU3RhdGU+KCkpLAorCV9NX3N0b3JhZ2UobmV3IF9SZXNfdHlwZSgpKQorICAgICAgeyB9CisKKyAgICAgIHByb21pc2UocHJvbWlzZSYmIF9fcmhzKQorICAgICAgOiBfTV9mdXR1cmUoc3RkOjptb3ZlKF9fcmhzLl9NX2Z1dHVyZSkpLCAKKwlfTV9zdG9yYWdlKHN0ZDo6bW92ZShfX3Jocy5fTV9zdG9yYWdlKSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBwcm9taXNlKGFsbG9jYXRvcl9hcmdfdCwgY29uc3QgX0FsbG9jYXRvciYgX19hKQorICAgICAgICA6IF9NX2Z1dHVyZShzdGQ6OmFsbG9jYXRlX3NoYXJlZDxfU3RhdGU+KF9fYSkpLAorCSAgX01fc3RvcmFnZShfX2Z1dHVyZV9iYXNlOjpfU19hbGxvY2F0ZV9yZXN1bHQ8X1JlcyY+KF9fYSkpCisgICAgICAgIHsgfQorCisgICAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgfnByb21pc2UoKQorICAgICAgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX01fZnV0dXJlKSAmJiAhX01fZnV0dXJlLnVuaXF1ZSgpKQorICAgICAgICAgIF9NX2Z1dHVyZS0+X01fYnJlYWtfcHJvbWlzZShzdGQ6Om1vdmUoX01fc3RvcmFnZSkpOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ25tZW50CisgICAgICBwcm9taXNlJgorICAgICAgb3BlcmF0b3I9KHByb21pc2UmJiBfX3JocykKKyAgICAgIHsKKyAgICAgICAgcHJvbWlzZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHByb21pc2UmIF9fcmhzKQorICAgICAgeworICAgICAgICBfTV9mdXR1cmUuc3dhcChfX3Jocy5fTV9mdXR1cmUpOworICAgICAgICBfTV9zdG9yYWdlLnN3YXAoX19yaHMuX01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHJpZXZpbmcgdGhlIHJlc3VsdAorICAgICAgZnV0dXJlPF9SZXMmPgorICAgICAgZ2V0X2Z1dHVyZSgpCisgICAgICB7IHJldHVybiBmdXR1cmU8X1JlcyY+KF9NX2Z1dHVyZSk7IH0KKworICAgICAgLy8gU2V0dGluZyB0aGUgcmVzdWx0CisgICAgICB2b2lkCisgICAgICBzZXRfdmFsdWUoX1JlcyYgX19yKQorICAgICAgeworICAgICAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcih0aGlzLCBfX3IpOworICAgICAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHNldF9leGNlcHRpb24oZXhjZXB0aW9uX3B0ciBfX3ApCisgICAgICB7CisgICAgICAgIGF1dG8gX19zZXR0ZXIgPSBfU3RhdGU6Ol9fc2V0dGVyKF9fcCwgdGhpcyk7CisgICAgICAgIF9NX2Z1dHVyZS0+X01fc2V0X3Jlc3VsdChzdGQ6Om1vdmUoX19zZXR0ZXIpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBmb3IgcHJvbWlzZTx2b2lkPgorICB0ZW1wbGF0ZTw+CisgICAgY2xhc3MgcHJvbWlzZTx2b2lkPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2UJCQlfU3RhdGU7CisgICAgICB0eXBlZGVmIF9fZnV0dXJlX2Jhc2U6Ol9SZXN1bHQ8dm9pZD4JCQlfUmVzX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnV0dXJlX2Jhc2U6Ol9QdHI8X1Jlc190eXBlPjo6dHlwZSAJX1B0cl90eXBlOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgY2xhc3MgX1N0YXRlOjpfU2V0dGVyOworCisgICAgICBzaGFyZWRfcHRyPF9TdGF0ZT4gICAgICAgICAgICAgICAgICAgICAgICBfTV9mdXR1cmU7CisgICAgICBfUHRyX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9zdG9yYWdlOworCisgICAgcHVibGljOgorICAgICAgcHJvbWlzZSgpCisgICAgICA6IF9NX2Z1dHVyZShzdGQ6Om1ha2Vfc2hhcmVkPF9TdGF0ZT4oKSksCisJX01fc3RvcmFnZShuZXcgX1Jlc190eXBlKCkpCisgICAgICB7IH0KKworICAgICAgcHJvbWlzZShwcm9taXNlJiYgX19yaHMpCisgICAgICA6IF9NX2Z1dHVyZShzdGQ6Om1vdmUoX19yaHMuX01fZnV0dXJlKSksCisJX01fc3RvcmFnZShzdGQ6Om1vdmUoX19yaHMuX01fc3RvcmFnZSkpCisgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICAgICAgcHJvbWlzZShhbGxvY2F0b3JfYXJnX3QsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSkKKyAgICAgICAgOiBfTV9mdXR1cmUoc3RkOjphbGxvY2F0ZV9zaGFyZWQ8X1N0YXRlPihfX2EpKSwKKwkgIF9NX3N0b3JhZ2UoX19mdXR1cmVfYmFzZTo6X1NfYWxsb2NhdGVfcmVzdWx0PHZvaWQ+KF9fYSkpCisgICAgICAgIHsgfQorCisgICAgICBwcm9taXNlKGNvbnN0IHByb21pc2UmKSA9IGRlbGV0ZTsKKworICAgICAgfnByb21pc2UoKQorICAgICAgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8Ym9vbD4oX01fZnV0dXJlKSAmJiAhX01fZnV0dXJlLnVuaXF1ZSgpKQorICAgICAgICAgIF9NX2Z1dHVyZS0+X01fYnJlYWtfcHJvbWlzZShzdGQ6Om1vdmUoX01fc3RvcmFnZSkpOworICAgICAgfQorCisgICAgICAvLyBBc3NpZ25tZW50CisgICAgICBwcm9taXNlJgorICAgICAgb3BlcmF0b3I9KHByb21pc2UmJiBfX3JocykKKyAgICAgIHsKKyAgICAgICAgcHJvbWlzZShzdGQ6Om1vdmUoX19yaHMpKS5zd2FwKCp0aGlzKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBwcm9taXNlJiBvcGVyYXRvcj0oY29uc3QgcHJvbWlzZSYpID0gZGVsZXRlOworCisgICAgICB2b2lkCisgICAgICBzd2FwKHByb21pc2UmIF9fcmhzKQorICAgICAgeworICAgICAgICBfTV9mdXR1cmUuc3dhcChfX3Jocy5fTV9mdXR1cmUpOworICAgICAgICBfTV9zdG9yYWdlLnN3YXAoX19yaHMuX01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJldHJpZXZpbmcgdGhlIHJlc3VsdAorICAgICAgZnV0dXJlPHZvaWQ+CisgICAgICBnZXRfZnV0dXJlKCkKKyAgICAgIHsgcmV0dXJuIGZ1dHVyZTx2b2lkPihfTV9mdXR1cmUpOyB9CisKKyAgICAgIC8vIFNldHRpbmcgdGhlIHJlc3VsdAorICAgICAgdm9pZCBzZXRfdmFsdWUoKTsKKworICAgICAgdm9pZAorICAgICAgc2V0X2V4Y2VwdGlvbihleGNlcHRpb25fcHRyIF9fcCkKKyAgICAgIHsKKyAgICAgICAgYXV0byBfX3NldHRlciA9IF9TdGF0ZTo6X19zZXR0ZXIoX19wLCB0aGlzKTsKKyAgICAgICAgX01fZnV0dXJlLT5fTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorICAgIH07CisKKyAgLy8gc2V0IHZvaWQKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZTo6X1NldHRlcjx2b2lkLCB2b2lkPgorICAgIHsKKyAgICAgIHByb21pc2U8dm9pZD46Ol9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgIHsKKyAgICAgICAgX1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3Byb21pc2UtPl9NX2Z1dHVyZSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fcHJvbWlzZS0+X01fc3RvcmFnZSk7CisgICAgICB9CisKKyAgICAgIHByb21pc2U8dm9pZD4qICAgIF9NX3Byb21pc2U7CisgICAgfTsKKworICBpbmxpbmUgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U6Ol9TZXR0ZXI8dm9pZCwgdm9pZD4KKyAgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U6Ol9fc2V0dGVyKHByb21pc2U8dm9pZD4qIF9fcHJvbSkKKyAgeworICAgIHJldHVybiBfU2V0dGVyPHZvaWQsIHZvaWQ+eyBfX3Byb20gfTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIHByb21pc2U8dm9pZD46OnNldF92YWx1ZSgpCisgIHsKKyAgICBhdXRvIF9fc2V0dGVyID0gX1N0YXRlOjpfX3NldHRlcih0aGlzKTsKKyAgICBfTV9mdXR1cmUtPl9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQsIHR5cGVuYW1lIF9SZXM+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3NldHRlcgorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9TdGF0ZVQ6Ol9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgIHsKKyAgICAgICAgX190cnkKKwkgIHsKKwkgICAgX01fc3RhdGUtPl9NX3Jlc3VsdC0+X01fc2V0KF9NX2ZuKCkpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBfTV9zdGF0ZS0+X01fcmVzdWx0LT5fTV9lcnJvciA9IGN1cnJlbnRfZXhjZXB0aW9uKCk7CisJICB9CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX01fc3RhdGUtPl9NX3Jlc3VsdCk7CisgICAgICB9CisgICAgICBfU3RhdGVUKiAgICAgICAgICAgICAgICAgIF9NX3N0YXRlOworICAgICAgc3RkOjpmdW5jdGlvbjxfUmVzKCk+ICAgICBfTV9mbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TdGF0ZVQ+CisgICAgc3RydWN0IF9fZnV0dXJlX2Jhc2U6Ol9UYXNrX3NldHRlcjxfU3RhdGVULCB2b2lkPgorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9TdGF0ZVQ6Ol9QdHJfdHlwZSBvcGVyYXRvcigpKCkKKyAgICAgIHsKKyAgICAgICAgX190cnkKKwkgIHsKKwkgICAgX01fZm4oKTsKKwkgIH0KKwlfX2NhdGNoKC4uLikKKwkgIHsKKwkgICAgX01fc3RhdGUtPl9NX3Jlc3VsdC0+X01fZXJyb3IgPSBjdXJyZW50X2V4Y2VwdGlvbigpOworCSAgfQorCXJldHVybiBzdGQ6Om1vdmUoX01fc3RhdGUtPl9NX3Jlc3VsdCk7CisgICAgICB9CisgICAgICBfU3RhdGVUKiAgICAgICAgICAgICAgICAgIF9NX3N0YXRlOworICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+ICAgICBfTV9mbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2Z1dHVyZV9iYXNlOjpfVGFza19zdGF0ZTxfUmVzKF9BcmdzLi4uKT4gCisgICAgOiBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZQorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyBfUmVzX3R5cGU7CisKKyAgICAgIF9UYXNrX3N0YXRlKHN0ZDo6ZnVuY3Rpb248X1JlcyhfQXJncy4uLik+IF9fdGFzaykKKyAgICAgIDogX01fcmVzdWx0KG5ldyBfUmVzdWx0PF9SZXM+KCkpLCBfTV90YXNrKHN0ZDo6bW92ZShfX3Rhc2spKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIF9UYXNrX3N0YXRlKF9GdW5jJiYgX190YXNrLCBjb25zdCBfQWxsb2MmIF9fYSkKKyAgICAgICAgOiBfTV9yZXN1bHQoX1NfYWxsb2NhdGVfcmVzdWx0PF9SZXM+KF9fYSkpLAorCSAgX01fdGFzayhhbGxvY2F0b3JfYXJnLCBfX2EsIHN0ZDo6bW92ZShfX3Rhc2spKQorICAgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fcnVuKF9BcmdzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgLy8gYm91bmQgYXJndW1lbnRzIGRlY2F5IHNvIHdyYXAgbHZhbHVlIHJlZmVyZW5jZXMKKyAgICAgICAgYXV0byBfX2JvdW5kID0gc3RkOjpiaW5kPF9SZXM+KHN0ZDo6cmVmKF9NX3Rhc2spLAorICAgICAgICAgICAgX1NfbWF5YmVfd3JhcF9yZWYoc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpKS4uLik7CisgICAgICAgIF9UYXNrX3NldHRlcjxfVGFza19zdGF0ZT4gX19zZXR0ZXJ7IHRoaXMsIHN0ZDo6bW92ZShfX2JvdW5kKSB9OworICAgICAgICBfTV9zZXRfcmVzdWx0KHN0ZDo6bW92ZShfX3NldHRlcikpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBfVGFza19zZXR0ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnV0dXJlX2Jhc2U6Ol9QdHI8X1Jlc3VsdDxfUmVzPj46OnR5cGUgX1B0cl90eXBlOworICAgICAgX1B0cl90eXBlIF9NX3Jlc3VsdDsKKyAgICAgIHN0ZDo6ZnVuY3Rpb248X1JlcyhfQXJncy4uLik+IF9NX3Rhc2s7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4KKyAgICAgICAgX1NfbWF5YmVfd3JhcF9yZWYoX1RwJiBfX3QpCisgICAgICAgIHsgcmV0dXJuIHN0ZDo6cmVmKF9fdCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgdHlwZW5hbWUgZW5hYmxlX2lmPCFpc19sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgX1RwPjo6dHlwZSYmCisgICAgICAgIF9TX21heWJlX3dyYXBfcmVmKF9UcCYmIF9fdCkKKyAgICAgICAgeyByZXR1cm4gc3RkOjpmb3J3YXJkPF9UcD4oX190KTsgfQorICAgIH07CisKKyAgLy8vIHBhY2thZ2VkX3Rhc2sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIHBhY2thZ2VkX3Rhc2s8X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX19mdXR1cmVfYmFzZTo6X1Rhc2tfc3RhdGU8X1JlcyhfQXJnVHlwZXMuLi4pPiAgX1N0YXRlX3R5cGU7CisgICAgICBzaGFyZWRfcHRyPF9TdGF0ZV90eXBlPiAgICAgICAgICAgICAgICAgICBfTV9zdGF0ZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgLy8gQ29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbgorICAgICAgcGFja2FnZWRfdGFzaygpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRm4+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHBhY2thZ2VkX3Rhc2soY29uc3QgX0ZuJiBfX2ZuKQorICAgICAgICA6IF9NX3N0YXRlKHN0ZDo6bWFrZV9zaGFyZWQ8X1N0YXRlX3R5cGU+KF9fZm4pKQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuPgorICAgICAgICBleHBsaWNpdAorICAgICAgICBwYWNrYWdlZF90YXNrKF9GbiYmIF9fZm4pCisgICAgICAgIDogX01fc3RhdGUoc3RkOjptYWtlX3NoYXJlZDxfU3RhdGVfdHlwZT4oc3RkOjptb3ZlKF9fZm4pKSkKKyAgICAgICAgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBwYWNrYWdlZF90YXNrKF9SZXMoKl9fZm4pKF9BcmdUeXBlcy4uLikpCisgICAgICA6IF9NX3N0YXRlKHN0ZDo6bWFrZV9zaGFyZWQ8X1N0YXRlX3R5cGU+KF9fZm4pKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GbiwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgcGFja2FnZWRfdGFzayhhbGxvY2F0b3JfYXJnX3QgX190YWcsIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSwgX0ZuIF9fZm4pCisgICAgICAgIDogX01fc3RhdGUoc3RkOjphbGxvY2F0ZV9zaGFyZWQ8X1N0YXRlX3R5cGU+KF9fYSwgc3RkOjptb3ZlKF9fZm4pKSkKKyAgICAgICAgeyB9CisKKyAgICAgIH5wYWNrYWdlZF90YXNrKCkKKyAgICAgIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9NX3N0YXRlKSAmJiAhX01fc3RhdGUudW5pcXVlKCkpCisgICAgICAgICAgX01fc3RhdGUtPl9NX2JyZWFrX3Byb21pc2Uoc3RkOjptb3ZlKF9NX3N0YXRlLT5fTV9yZXN1bHQpKTsKKyAgICAgIH0KKworICAgICAgLy8gTm8gY29weQorICAgICAgcGFja2FnZWRfdGFzayhwYWNrYWdlZF90YXNrJikgPSBkZWxldGU7CisgICAgICBwYWNrYWdlZF90YXNrJiBvcGVyYXRvcj0ocGFja2FnZWRfdGFzayYpID0gZGVsZXRlOworCisgICAgICAvLyBNb3ZlIHN1cHBvcnQKKyAgICAgIHBhY2thZ2VkX3Rhc2socGFja2FnZWRfdGFzayYmIF9fb3RoZXIpCisgICAgICB7IHRoaXMtPnN3YXAoX19vdGhlcik7IH0KKworICAgICAgcGFja2FnZWRfdGFzayYgb3BlcmF0b3I9KHBhY2thZ2VkX3Rhc2smJiBfX290aGVyKQorICAgICAgeworICAgICAgICBwYWNrYWdlZF90YXNrKHN0ZDo6bW92ZShfX290aGVyKSkuc3dhcCgqdGhpcyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgc3dhcChwYWNrYWdlZF90YXNrJiBfX290aGVyKQorICAgICAgeyBfTV9zdGF0ZS5zd2FwKF9fb3RoZXIuX01fc3RhdGUpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIHZhbGlkKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9NX3N0YXRlKTsgfQorCisgICAgICAvLyBSZXN1bHQgcmV0cmlldmFsCisgICAgICBmdXR1cmU8X1Jlcz4KKyAgICAgIGdldF9mdXR1cmUoKQorICAgICAgeyByZXR1cm4gZnV0dXJlPF9SZXM+KF9NX3N0YXRlKTsgfQorCisgICAgICAvLyBFeGVjdXRpb24KKyAgICAgIHZvaWQKKyAgICAgIG9wZXJhdG9yKCkoX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U6Ol9TX2NoZWNrKF9NX3N0YXRlKTsKKyAgICAgICAgX01fc3RhdGUtPl9NX3J1bihzdGQ6OmZvcndhcmQ8X0FyZ1R5cGVzPihfX2FyZ3MpLi4uKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeworICAgICAgICBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZTo6X1NfY2hlY2soX01fc3RhdGUpOworICAgICAgICBwYWNrYWdlZF90YXNrKHN0ZDo6bW92ZShfTV9zdGF0ZS0+X01fdGFzaykpLnN3YXAoKnRoaXMpOworICAgICAgfQorICAgIH07CisKKyAgLy8vIHN3YXAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChwYWNrYWdlZF90YXNrPF9SZXMoX0FyZ1R5cGVzLi4uKT4mIF9feCwKKwkgcGFja2FnZWRfdGFzazxfUmVzKF9BcmdUeXBlcy4uLik+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0FsbG9jPgorICAgIHN0cnVjdCB1c2VzX2FsbG9jYXRvcjxwYWNrYWdlZF90YXNrPF9SZXM+LCBfQWxsb2M+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXM+CisgICAgY2xhc3MgX19mdXR1cmVfYmFzZTo6X0RlZmVycmVkX3N0YXRlIDogcHVibGljIF9fZnV0dXJlX2Jhc2U6Ol9TdGF0ZV9iYXNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyBfUmVzX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfRGVmZXJyZWRfc3RhdGUoc3RkOjpmdW5jdGlvbjxfUmVzKCk+JiYgX19mbikKKyAgICAgIDogX01fcmVzdWx0KG5ldyBfUmVzdWx0PF9SZXM+KCkpLCBfTV9mbihzdGQ6Om1vdmUoX19mbikpCisgICAgICB7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBjbGFzcyBfVGFza19zZXR0ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnV0dXJlX2Jhc2U6Ol9QdHI8X1Jlc3VsdDxfUmVzPj46OnR5cGUgX1B0cl90eXBlOworICAgICAgX1B0cl90eXBlIF9NX3Jlc3VsdDsKKyAgICAgIHN0ZDo6ZnVuY3Rpb248X1JlcygpPiBfTV9mbjsKKworICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9ydW5fZGVmZXJyZWQoKQorICAgICAgeworICAgICAgICBfVGFza19zZXR0ZXI8X0RlZmVycmVkX3N0YXRlPiBfX3NldHRlcnsgdGhpcywgX01fZm4gfTsKKyAgICAgICAgLy8gc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzIHNvIGlnbm9yZSBmYWlsdXJlCisgICAgICAgIF9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSwgdHJ1ZSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzPgorICAgIGNsYXNzIF9fZnV0dXJlX2Jhc2U6Ol9Bc3luY19zdGF0ZSA6IHB1YmxpYyBfX2Z1dHVyZV9iYXNlOjpfU3RhdGVfYmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9SZXMgX1Jlc190eXBlOworCisgICAgICBleHBsaWNpdCAKKyAgICAgIF9Bc3luY19zdGF0ZShzdGQ6OmZ1bmN0aW9uPF9SZXMoKT4mJiBfX2ZuKQorICAgICAgOiBfTV9yZXN1bHQobmV3IF9SZXN1bHQ8X1Jlcz4oKSksIF9NX2ZuKHN0ZDo6bW92ZShfX2ZuKSksCisJX01fdGhyZWFkKG1lbV9mbigmX0FzeW5jX3N0YXRlOjpfTV9kb19ydW4pLCB0aGlzKQorICAgICAgeyB9CisKKyAgICAgIH5fQXN5bmNfc3RhdGUoKSB7IF9NX3RocmVhZC5qb2luKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkIF9NX2RvX3J1bigpCisgICAgICB7CisgICAgICAgIF9UYXNrX3NldHRlcjxfQXN5bmNfc3RhdGU+IF9fc2V0dGVyeyB0aGlzLCBzdGQ6Om1vdmUoX01fZm4pIH07CisgICAgICAgIF9NX3NldF9yZXN1bHQoc3RkOjptb3ZlKF9fc2V0dGVyKSk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIGNsYXNzIF9UYXNrX3NldHRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19mdXR1cmVfYmFzZTo6X1B0cjxfUmVzdWx0PF9SZXM+Pjo6dHlwZSBfUHRyX3R5cGU7CisgICAgICBfUHRyX3R5cGUgX01fcmVzdWx0OworICAgICAgc3RkOjpmdW5jdGlvbjxfUmVzKCk+IF9NX2ZuOworICAgICAgdGhyZWFkIF9NX3RocmVhZDsKKyAgICB9OworCisgIC8vLyBhc3luYyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBmdXR1cmU8dHlwZW5hbWUgcmVzdWx0X29mPF9GbihfQXJncy4uLik+Ojp0eXBlPgorICAgIGFzeW5jKGxhdW5jaCBfX3BvbGljeSwgX0ZuJiYgX19mbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Y8X0ZuKF9BcmdzLi4uKT46OnR5cGUgcmVzdWx0X3R5cGU7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8X19mdXR1cmVfYmFzZTo6X1N0YXRlX2Jhc2U+IF9fc3RhdGU7CisgICAgICBpZiAoX19wb2xpY3kgPT0gbGF1bmNoOjphc3luYykKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9fZnV0dXJlX2Jhc2U6Ol9Bc3luY19zdGF0ZTxyZXN1bHRfdHlwZT4gX1N0YXRlOworCSAgX19zdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8X1N0YXRlPihzdGQ6OmJpbmQ8cmVzdWx0X3R5cGU+KAorICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0ZuPihfX2ZuKSwgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX19mdXR1cmVfYmFzZTo6X0RlZmVycmVkX3N0YXRlPHJlc3VsdF90eXBlPiBfU3RhdGU7CisJICBfX3N0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxfU3RhdGU+KHN0ZDo6YmluZDxyZXN1bHRfdHlwZT4oCisgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfRm4+KF9fZm4pLCBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKTsKKwl9CisgICAgICByZXR1cm4gZnV0dXJlPHJlc3VsdF90eXBlPihfX3N0YXRlKTsKKyAgICB9CisKKyAgLy8vIGFzeW5jLCBwb3RlbnRpYWwgb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZuLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUgdHlwZW5hbWUKKyAgICBfX2FzeW5jX3NmaW5hZV9oZWxwZXI8dHlwZW5hbWUgZGVjYXk8X0ZuPjo6dHlwZSwgX0ZuLCBfQXJncy4uLj46OnR5cGUKKyAgICBhc3luYyhfRm4mJiBfX2ZuLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisgICAgICByZXR1cm4gYXN5bmMobGF1bmNoOjphbnksIHN0ZDo6Zm9yd2FyZDxfRm4+KF9fZm4pLAorCQkgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgIH0KKworI2VuZGlmIC8vIF9HTElCQ1hYX0hBU19HVEhSRUFEUyAmJiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKyAgICAgICAvLyAmJiBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlNfNAorCisgIC8vIEB9IGdyb3VwIGZ1dHVyZXMKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9GVVRVUkUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvaW5pdGlhbGl6ZXJfbGlzdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvaW5pdGlhbGl6ZXJfbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ4ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pbml0aWFsaXplcl9saXN0CkBAIC0wLDAgKzEsMTAyIEBACisvLyBzdGQ6OmluaXRpYWxpemVyX2xpc3Qgc3VwcG9ydCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5pdGlhbGl6ZXJfbGlzdAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfSU5JVElBTElaRVJfTElTVAorI2RlZmluZSBfSU5JVElBTElaRVJfTElTVAorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8vIGluaXRpYWxpemVyX2xpc3QKKyAgdGVtcGxhdGU8Y2xhc3MgX0U+CisgICAgY2xhc3MgaW5pdGlhbGl6ZXJfbGlzdAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9FIAkJdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX0UmIAlyZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FJiAJY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzaXplX3QgCQlzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FKiAJaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIGNvbnN0IF9FKiAJY29uc3RfaXRlcmF0b3I7CisKKyAgICBwcml2YXRlOgorICAgICAgaXRlcmF0b3IJCQlfTV9hcnJheTsKKyAgICAgIHNpemVfdHlwZQkJCV9NX2xlbjsKKworICAgICAgLy8gVGhlIGNvbXBpbGVyIGNhbiBjYWxsIGEgcHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgIGNvbnN0ZXhwciBpbml0aWFsaXplcl9saXN0KGNvbnN0X2l0ZXJhdG9yIF9fYSwgc2l6ZV90eXBlIF9fbCkKKyAgICAgIDogX01fYXJyYXkoX19hKSwgX01fbGVuKF9fbCkgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICBjb25zdGV4cHIgaW5pdGlhbGl6ZXJfbGlzdCgpIDogX01fYXJyYXkoMCksIF9NX2xlbigwKSB7IH0KKworICAgICAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzLgorICAgICAgY29uc3RleHByIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIHsgcmV0dXJuIF9NX2xlbjsgfQorCisgICAgICAvLyBGaXJzdCBlbGVtZW50LgorICAgICAgY29uc3RleHByIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIHsgcmV0dXJuIF9NX2FycmF5OyB9CisKKyAgICAgIC8vIE9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQuCisgICAgICBjb25zdGV4cHIgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVuZCgpIHsgcmV0dXJuIGJlZ2luKCkgKyBzaXplKCk7IH0KKyAgfTsKKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBpbml0aWxpemVyX2xpc3QuCisgICAqICBAcGFyYW0gIGlsICBJbml0aWFsaXplciBsaXN0LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGNvbnN0ZXhwciBjb25zdCBfVHAqCisgICAgYmVnaW4oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWxzKQorICAgIHsgcmV0dXJuIF9faWxzLmJlZ2luKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQKKyAgICogICAgICAgICAgb2YgdGhlIGluaXRpbGl6ZXJfbGlzdC4KKyAgICogIEBwYXJhbSAgaWwgIEluaXRpYWxpemVyIGxpc3QuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgY29uc3RleHByIGNvbnN0IF9UcCoKKyAgICBlbmQoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9faWxzKQorICAgIHsgcmV0dXJuIF9faWxzLmVuZCgpOyB9Cit9CisKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisjZW5kaWYgLy8gQysrMHgKKyNlbmRpZiAvLyBfSU5JVElBTElaRVJfTElTVApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb21hbmlwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb21hbmlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjkwZTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2lvbWFuaXAKQEAgLTAsMCArMSwzNTIgQEAKKy8vIFN0YW5kYXJkIHN0cmVhbSBtYW5pcHVsYXRvcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9pb21hbmlwCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuNi4zICBTdGFuZGFyZCBtYW5pcHVsYXRvcnMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfSU9NQU5JUAorI2RlZmluZSBfR0xJQkNYWF9JT01BTklQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8Yml0cy9pb3NfYmFzZS5oPgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyNpbmNsdWRlIDxsb2NhbGU+CisjZW5kaWYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFsyNy42LjNdIHN0YW5kYXJkIG1hbmlwdWxhdG9ycworICAvLyBBbHNvIHNlZSBEUiAxODMuCisKKyAgc3RydWN0IF9SZXNldGlvc2ZsYWdzIHsgaW9zX2Jhc2U6OmZtdGZsYWdzIF9NX21hc2s7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBzZXRmLgorICAgKiAgQHBhcmFtICBtYXNrICBBIGZvcm1hdCBmbGFncyBtYXNrLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgcmVzZXRzIHRoZSBzcGVjaWZpZWQgZmxhZ3MsCisgICAqICB2aWEgQGUgc3RyZWFtLnNldGYoMCxtYXNrKS4KKyAgKi8KKyAgaW5saW5lIF9SZXNldGlvc2ZsYWdzIAorICByZXNldGlvc2ZsYWdzKGlvc19iYXNlOjpmbXRmbGFncyBfX21hc2spCisgIHsgcmV0dXJuIHsgX19tYXNrIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9SZXNldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19pcy5zZXRmKGlvc19iYXNlOjpmbXRmbGFncygwKSwgX19mLl9NX21hc2spOyAKKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLCBfUmVzZXRpb3NmbGFncyBfX2YpCisgICAgeyAKKyAgICAgIF9fb3Muc2V0Zihpb3NfYmFzZTo6Zm10ZmxhZ3MoMCksIF9fZi5fTV9tYXNrKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXRpb3NmbGFncyB7IGlvc19iYXNlOjpmbXRmbGFncyBfTV9tYXNrOyB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBNYW5pcHVsYXRvciBmb3IgQGMgc2V0Zi4KKyAgICogIEBwYXJhbSAgbWFzayAgQSBmb3JtYXQgZmxhZ3MgbWFzay4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIHNldHMgdGhlIGZvcm1hdCBmbGFncworICAgKiAgdG8gQGEgbWFzay4KKyAgKi8KKyAgaW5saW5lIF9TZXRpb3NmbGFncyAKKyAgc2V0aW9zZmxhZ3MoaW9zX2Jhc2U6OmZtdGZsYWdzIF9fbWFzaykKKyAgeyByZXR1cm4geyBfX21hc2sgfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1NldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19pcy5zZXRmKF9fZi5fTV9tYXNrKTsgCisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldGlvc2ZsYWdzIF9fZikKKyAgICB7IAorICAgICAgX19vcy5zZXRmKF9fZi5fTV9tYXNrKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXRiYXNlIHsgaW50IF9NX2Jhc2U7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBzZXRmLgorICAgKiAgQHBhcmFtICBiYXNlICBBIG51bWVyaWMgYmFzZS4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGNoYW5nZXMgdGhlCisgICAqICBAYyBpb3NfYmFzZTo6YmFzZWZpZWxkIGZsYWdzIHRvIEBjIG9jdCwgQGMgZGVjLCBvciBAYyBoZXggd2hlbiBAYSBiYXNlCisgICAqICBpcyA4LCAxMCwgb3IgMTYsIGFjY29yZGluZ2x5LCBhbmQgdG8gMCBpZiBAYSBiYXNlIGlzIGFueSBvdGhlciB2YWx1ZS4KKyAgKi8KKyAgaW5saW5lIF9TZXRiYXNlIAorICBzZXRiYXNlKGludCBfX2Jhc2UpCisgIHsgcmV0dXJuIHsgX19iYXNlIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIF9TZXRiYXNlIF9fZikKKyAgICB7CisgICAgICBfX2lzLnNldGYoX19mLl9NX2Jhc2UgPT0gIDggPyBpb3NfYmFzZTo6b2N0IDogCisJCV9fZi5fTV9iYXNlID09IDEwID8gaW9zX2Jhc2U6OmRlYyA6IAorCQlfX2YuX01fYmFzZSA9PSAxNiA/IGlvc19iYXNlOjpoZXggOiAKKwkJaW9zX2Jhc2U6OmZtdGZsYWdzKDApLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9TZXRiYXNlIF9fZikKKyAgICB7CisgICAgICBfX29zLnNldGYoX19mLl9NX2Jhc2UgPT0gIDggPyBpb3NfYmFzZTo6b2N0IDogCisJCV9fZi5fTV9iYXNlID09IDEwID8gaW9zX2Jhc2U6OmRlYyA6IAorCQlfX2YuX01fYmFzZSA9PSAxNiA/IGlvc19iYXNlOjpoZXggOiAKKwkJaW9zX2Jhc2U6OmZtdGZsYWdzKDApLCBpb3NfYmFzZTo6YmFzZWZpZWxkKTsKKyAgICAgIHJldHVybiBfX29zOyAKKyAgICB9CisgIAorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBzdHJ1Y3QgX1NldGZpbGwgeyBfQ2hhclQgX01fYzsgfTsKKworICAvKioKKyAgICogIEBicmllZiAgTWFuaXB1bGF0b3IgZm9yIEBjIGZpbGwuCisgICAqICBAcGFyYW0gIGMgIFRoZSBuZXcgZmlsbCBjaGFyYWN0ZXIuCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBjYWxscyBAYyBmaWxsKGMpIGZvciB0aGF0CisgICAqICBvYmplY3QuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBpbmxpbmUgX1NldGZpbGw8X0NoYXJUPgorICAgIHNldGZpbGwoX0NoYXJUIF9fYykKKyAgICB7IHJldHVybiB7IF9fYyB9OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfU2V0ZmlsbDxfQ2hhclQ+IF9fZikKKyAgICB7IAorICAgICAgX19pcy5maWxsKF9fZi5fTV9jKTsgCisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldGZpbGw8X0NoYXJUPiBfX2YpCisgICAgeyAKKyAgICAgIF9fb3MuZmlsbChfX2YuX01fYyk7IAorICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworCisgIHN0cnVjdCBfU2V0cHJlY2lzaW9uIHsgaW50IF9NX247IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyBwcmVjaXNpb24uCisgICAqICBAcGFyYW0gIG4gIFRoZSBuZXcgcHJlY2lzaW9uLgorICAgKgorICAgKiAgU2VudCB0byBhIHN0cmVhbSBvYmplY3QsIHRoaXMgbWFuaXB1bGF0b3IgY2FsbHMgQGMgcHJlY2lzaW9uKG4pIGZvcgorICAgKiAgdGhhdCBvYmplY3QuCisgICovCisgIGlubGluZSBfU2V0cHJlY2lzaW9uIAorICBzZXRwcmVjaXNpb24oaW50IF9fbikKKyAgeyByZXR1cm4geyBfX24gfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgX1NldHByZWNpc2lvbiBfX2YpCisgICAgeyAKKyAgICAgIF9faXMucHJlY2lzaW9uKF9fZi5fTV9uKTsgCisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldHByZWNpc2lvbiBfX2YpCisgICAgeyAKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZi5fTV9uKTsgCisgICAgICByZXR1cm4gX19vczsgCisgICAgfQorCisKKyAgc3RydWN0IF9TZXR3IHsgaW50IF9NX247IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIE1hbmlwdWxhdG9yIGZvciBAYyB3aWR0aC4KKyAgICogIEBwYXJhbSAgbiAgVGhlIG5ldyB3aWR0aC4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGNhbGxzIEBjIHdpZHRoKG4pIGZvcgorICAgKiAgdGhhdCBvYmplY3QuCisgICovCisgIGlubGluZSBfU2V0dyAKKyAgc2V0dyhpbnQgX19uKQorICB7IHJldHVybiB7IF9fbiB9OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfU2V0dyBfX2YpCisgICAgeworICAgICAgX19pcy53aWR0aChfX2YuX01fbik7CisgICAgICByZXR1cm4gX19pczsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgX1NldHcgX19mKQorICAgIHsKKyAgICAgIF9fb3Mud2lkdGgoX19mLl9NX24pOworICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTW9uZXlUPgorICAgIHN0cnVjdCBfR2V0X21vbmV5IHsgX01vbmV5VCYgX01fbW9uOyBib29sIF9NX2ludGw7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEV4dGVuZGVkIG1hbmlwdWxhdG9yIGZvciBleHRyYWN0aW5nIG1vbmV5LgorICAgKiAgQHBhcmFtICBtb24gIEVpdGhlciBsb25nIGRvdWJsZSBvciBhIHNwZWNpYWxpemF0aW9uIG9mIEBjIGJhc2ljX3N0cmluZy4KKyAgICogIEBwYXJhbSAgaW50bCBBIGJvb2wgaW5kaWNhdGluZyB3aGV0aGVyIGludGVybmF0aW9uYWwgZm9ybWF0IAorICAgKiAgICAgICAgICAgICAgIGlzIHRvIGJlIHVzZWQuCisgICAqCisgICAqICBTZW50IHRvIGEgc3RyZWFtIG9iamVjdCwgdGhpcyBtYW5pcHVsYXRvciBleHRyYWN0cyBAYSBtb24uCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Nb25leVQ+CisgICAgaW5saW5lIF9HZXRfbW9uZXk8X01vbmV5VD4KKyAgICBnZXRfbW9uZXkoX01vbmV5VCYgX19tb24sIGJvb2wgX19pbnRsID0gZmFsc2UpCisgICAgeyByZXR1cm4geyBfX21vbiwgX19pbnRsIH07IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9Nb25leVQ+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLCBfR2V0X21vbmV5PF9Nb25leVQ+IF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJULCBfVHJhaXRzPiBfSXRlcjsKKyAgICAgIHR5cGVkZWYgbW9uZXlfZ2V0PF9DaGFyVCwgX0l0ZXI+IF9Nb25leUdldDsKKyAgICAgIAorICAgICAgaW9zX2Jhc2U6Omlvc3RhdGUgX19lcnIgPSBpb3NfYmFzZTo6Z29vZGJpdDsKKyAgICAgIGNvbnN0IF9Nb25leUdldCYgX19tZyA9IHVzZV9mYWNldDxfTW9uZXlHZXQ+KF9faXMuZ2V0bG9jKCkpOworCisgICAgICBfX21nLmdldChfSXRlcihfX2lzLnJkYnVmKCkpLCBfSXRlcigpLCBfX2YuX01faW50bCwKKwkgICAgICAgX19pcywgX19lcnIsIF9fZi5fTV9tb24pOworCisgICAgICBpZiAoaW9zX2Jhc2U6Omdvb2RiaXQgIT0gX19lcnIpCisJX19pcy5zZXRzdGF0ZShfX2Vycik7CisKKyAgICAgIHJldHVybiBfX2lzOyAKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTW9uZXlUPgorICAgIHN0cnVjdCBfUHV0X21vbmV5IHsgY29uc3QgX01vbmV5VCYgX01fbW9uOyBib29sIF9NX2ludGw7IH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEV4dGVuZGVkIG1hbmlwdWxhdG9yIGZvciBpbnNlcnRpbmcgbW9uZXkuCisgICAqICBAcGFyYW0gIG1vbiAgRWl0aGVyIGxvbmcgZG91YmxlIG9yIGEgc3BlY2lhbGl6YXRpb24gb2YgQGMgYmFzaWNfc3RyaW5nLgorICAgKiAgQHBhcmFtICBpbnRsIEEgYm9vbCBpbmRpY2F0aW5nIHdoZXRoZXIgaW50ZXJuYXRpb25hbCBmb3JtYXQgCisgICAqICAgICAgICAgICAgICAgaXMgdG8gYmUgdXNlZC4KKyAgICoKKyAgICogIFNlbnQgdG8gYSBzdHJlYW0gb2JqZWN0LCB0aGlzIG1hbmlwdWxhdG9yIGluc2VydHMgQGEgbW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTW9uZXlUPgorICAgIGlubGluZSBfUHV0X21vbmV5PF9Nb25leVQ+CisgICAgcHV0X21vbmV5KGNvbnN0IF9Nb25leVQmIF9fbW9uLCBib29sIF9faW50bCA9IGZhbHNlKQorICAgIHsgcmV0dXJuIHsgX19tb24sIF9faW50bCB9OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfTW9uZXlUPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsIF9QdXRfbW9uZXk8X01vbmV5VD4gX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+IF9JdGVyOworICAgICAgdHlwZWRlZiBtb25leV9wdXQ8X0NoYXJULCBfSXRlcj4gX01vbmV5UHV0OworICAgICAgCisgICAgICBjb25zdCBfTW9uZXlQdXQmIF9fbXAgPSB1c2VfZmFjZXQ8X01vbmV5UHV0PihfX29zLmdldGxvYygpKTsKKyAgICAgIGNvbnN0IF9JdGVyIF9fZW5kID0gX19tcC5wdXQoX0l0ZXIoX19vcy5yZGJ1ZigpKSwgX19mLl9NX2ludGwsCisJCQkJICAgX19vcywgX19vcy5maWxsKCksIF9fZi5fTV9tb24pOworCisgICAgICBpZiAoX19lbmQuZmFpbGVkKCkpCisJX19vcy5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKworICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworI2VuZGlmCisKKyAgLy8gSW5oaWJpdCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgcmVxdWlyZWQgaW5zdGFudGlhdGlvbnMsCisgIC8vIHdoaWNoIGFyZSBkZWZpbmVkIHZpYSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBlbHNld2hlcmUuICAKKyAgLy8gTkI6ICBUaGlzIHN5bnRheCBpcyBhIEdOVSBleHRlbnNpb24uCisjaWYgX0dMSUJDWFhfRVhURVJOX1RFTVBMQVRFCisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBfU2V0ZmlsbDxjaGFyPik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBfU2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1Jlc2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgX1NldHByZWNpc2lvbik7CisgIGV4dGVybiB0ZW1wbGF0ZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mLCBfU2V0dyk7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBfU2V0ZmlsbDxjaGFyPik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBfU2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1Jlc2V0aW9zZmxhZ3MpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgaXN0cmVhbSYgb3BlcmF0b3I+Pihpc3RyZWFtJiwgX1NldHByZWNpc2lvbik7CisgIGV4dGVybiB0ZW1wbGF0ZSBpc3RyZWFtJiBvcGVyYXRvcj4+KGlzdHJlYW0mLCBfU2V0dyk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBfU2V0ZmlsbDx3Y2hhcl90Pik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIF9TZXRpb3NmbGFncyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3b3N0cmVhbSYgb3BlcmF0b3I8PCh3b3N0cmVhbSYsIF9SZXNldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgd29zdHJlYW0mIG9wZXJhdG9yPDwod29zdHJlYW0mLCBfU2V0cHJlY2lzaW9uKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdvc3RyZWFtJiBvcGVyYXRvcjw8KHdvc3RyZWFtJiwgX1NldHcpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBfU2V0ZmlsbDx3Y2hhcl90Pik7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIF9TZXRpb3NmbGFncyk7CisgIGV4dGVybiB0ZW1wbGF0ZSB3aXN0cmVhbSYgb3BlcmF0b3I+Pih3aXN0cmVhbSYsIF9SZXNldGlvc2ZsYWdzKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgX1NldGJhc2UpOworICBleHRlcm4gdGVtcGxhdGUgd2lzdHJlYW0mIG9wZXJhdG9yPj4od2lzdHJlYW0mLCBfU2V0cHJlY2lzaW9uKTsKKyAgZXh0ZXJuIHRlbXBsYXRlIHdpc3RyZWFtJiBvcGVyYXRvcj4+KHdpc3RyZWFtJiwgX1NldHcpOworI2VuZGlmCisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfSU9NQU5JUCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb3MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2lvcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y4MzY4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb3MKQEAgLTAsMCArMSw0NyBAQAorLy8gSW9zdHJlYW1zIGJhc2UgY2xhc3NlcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsCisvLyAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2lvcworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjQgIElvc3RyZWFtcyBiYXNlIGNsYXNzZXMKKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfSU9TCisjZGVmaW5lIF9HTElCQ1hYX0lPUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxleGNlcHRpb24+IAkJLy8gRm9yIGlvc19iYXNlOjpmYWlsdXJlCisjaW5jbHVkZSA8Yml0cy9jaGFyX3RyYWl0cy5oPiAJLy8gRm9yIGNoYXJfdHJhaXRzLCBzdHJlYW1vZmYsIHN0cmVhbXNpemUsIGZwb3MKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgkvLyBGb3IgY2xhc3MgbG9jYWxlCisjaW5jbHVkZSA8Yml0cy9pb3NfYmFzZS5oPgkvLyBGb3IgaW9zX2Jhc2UgZGVjbGFyYXRpb25zLgorI2luY2x1ZGUgPHN0cmVhbWJ1Zj4gCisjaW5jbHVkZSA8Yml0cy9iYXNpY19pb3MuaD4KKworI2VuZGlmCS8qIF9HTElCQ1hYX0lPUyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb3Nmd2QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2lvc2Z3ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA2YTFkCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb3Nmd2QKQEAgLTAsMCArMSwyMTIgQEAKKy8vIEZvcndhcmRpbmcgZGVjbGFyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL2lvc2Z3ZAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjIgIEZvcndhcmQgZGVjbGFyYXRpb25zCisvLworCisjaWZuZGVmIF9HTElCQ1hYX0lPU0ZXRAorI2RlZmluZSBfR0xJQkNYWF9JT1NGV0QgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RyaW5nZndkLmg+IAkvLyBGb3Igc3RyaW5nIGZvcndhcmQgZGVjbGFyYXRpb25zLgorI2luY2x1ZGUgPGJpdHMvcG9zdHlwZXMuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGRlZmdyb3VwIGlvIEkvTworICAgKgorICAgKiAgTmVhcmx5IGFsbCBvZiB0aGUgSS9PIGNsYXNzZXMgYXJlIHBhcmFtZXRlcml6ZWQgb24gdGhlIHR5cGUgb2YKKyAgICogIGNoYXJhY3RlcnMgdGhleSByZWFkIGFuZCB3cml0ZS4gIChUaGUgbWFqb3IgZXhjZXB0aW9uIGlzIGlvc19iYXNlIGF0CisgICAqICB0aGUgdG9wIG9mIHRoZSBoaWVyYXJjaHkuKSAgVGhpcyBpcyBhIGNoYW5nZSBmcm9tIHByZS1TdGFuZGFyZAorICAgKiAgc3RyZWFtcywgd2hpY2ggd2VyZSBub3QgdGVtcGxhdGVzLgorICAgKgorICAgKiAgRm9yIGVhc2Ugb2YgdXNlIGFuZCBjb21wYXRpYmlsaXR5LCBhbGwgb2YgdGhlIGJhc2ljXyogSS9PLXJlbGF0ZWQKKyAgICogIGNsYXNzZXMgYXJlIGdpdmVuIHR5cGVkZWYgbmFtZXMgZm9yIGJvdGggb2YgdGhlIGJ1aWx0aW4gY2hhcmFjdGVyCisgICAqICB3aWR0aHMgKHdpZGUgYW5kIG5hcnJvdykuICBUaGUgdHlwZWRlZnMgYXJlIHRoZSBzYW1lIGFzIHRoZQorICAgKiAgcHJlLVN0YW5kYXJkIG5hbWVzLCBmb3IgZXhhbXBsZToKKyAgICoKKyAgICogIEBjb2RlCisgICAqICAgICB0eXBlZGVmIGJhc2ljX2lmc3RyZWFtPGNoYXI+ICBpZnN0cmVhbTsKKyAgICogIEBlbmRjb2RlCisgICAqCisgICAqICBCZWNhdXNlIHByb3Blcmx5IGZvcndhcmQtZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgY2FuIGJlIGRpZmZpY3VsdCwgeW91CisgICAqICBzaG91bGQgbm90IGRvIGl0IHlvdXJzZWxmLiAgSW5zdGVhZCwgaW5jbHVkZSB0aGUgJmx0O2lvc2Z3ZCZndDsKKyAgICogIGhlYWRlciwgd2hpY2ggY29udGFpbnMgb25seSBkZWNsYXJhdGlvbnMgb2YgYWxsIHRoZSBJL08gY2xhc3NlcyBhcworICAgKiAgd2VsbCBhcyB0aGUgdHlwZWRlZnMuICBUcnlpbmcgdG8gZm9yd2FyZC1kZWNsYXJlIHRoZSB0eXBlZGVmcworICAgKiAgdGhlbXNlbHZlcyAoZS5nLiwgPGNvZGU+Y2xhc3Mgb3N0cmVhbTs8L2NvZGU+KSBpcyBub3QgdmFsaWQgSVNPIEMrKy4KKyAgICoKKyAgICogIEZvciBtb3JlIHNwZWNpZmljIGRlY2xhcmF0aW9ucywgc2VlCisgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDExY2gyNC5odG1sCisgICAqCisgICAqICBAeworICAqLworICBjbGFzcyBpb3NfYmFzZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19pb3M7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfc3RyZWFtYnVmOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2lzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfb3N0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19pb3N0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nYnVmOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4sCisJICAgdHlwZW5hbWUgX0FsbG9jID0gYWxsb2NhdG9yPF9DaGFyVD4gPgorICAgIGNsYXNzIGJhc2ljX2lzdHJpbmdzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9IGFsbG9jYXRvcjxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmdzdHJlYW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3MgYmFzaWNfZmlsZWJ1ZjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19pZnN0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19vZnN0cmVhbTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMgPSBjaGFyX3RyYWl0czxfQ2hhclQ+ID4KKyAgICBjbGFzcyBiYXNpY19mc3RyZWFtOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IGNoYXJfdHJhaXRzPF9DaGFyVD4gPgorICAgIGNsYXNzIGlzdHJlYW1idWZfaXRlcmF0b3I7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gY2hhcl90cmFpdHM8X0NoYXJUPiA+CisgICAgY2xhc3Mgb3N0cmVhbWJ1Zl9pdGVyYXRvcjsKKworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyBjaGFyIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaW9zPGNoYXI+IAkJaW9zOyAKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgY2hhciBidWZmZXJzLgorICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiAJc3RyZWFtYnVmOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyBjaGFyIGlucHV0IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaXN0cmVhbTxjaGFyPiAJCWlzdHJlYW07CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIGNoYXIgb3V0cHV0IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfb3N0cmVhbTxjaGFyPiAJCW9zdHJlYW07CisKKyAgLy8vIEJhc2UgY2xhc3MgZm9yIEBjIGNoYXIgbWl4ZWQgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lvc3RyZWFtPGNoYXI+IAkJaW9zdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyBjaGFyIG1lbW9yeSBidWZmZXJzLgorICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxjaGFyPiAJc3RyaW5nYnVmOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBpbnB1dCBtZW1vcnkgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pc3RyaW5nc3RyZWFtPGNoYXI+IAlpc3RyaW5nc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBvdXRwdXQgbWVtb3J5IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfb3N0cmluZ3N0cmVhbTxjaGFyPiAJb3N0cmluZ3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgbWl4ZWQgaW5wdXQgYW5kIG91dHB1dCBtZW1vcnkgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdzdHJlYW08Y2hhcj4gCXN0cmluZ3N0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgZmlsZSBidWZmZXJzLgorICB0eXBlZGVmIGJhc2ljX2ZpbGVidWY8Y2hhcj4gCQlmaWxlYnVmOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBpbnB1dCBmaWxlIHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaWZzdHJlYW08Y2hhcj4gCQlpZnN0cmVhbTsKKworICAvLy8gQ2xhc3MgZm9yIEBjIGNoYXIgb3V0cHV0IGZpbGUgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19vZnN0cmVhbTxjaGFyPiAJCW9mc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgY2hhciBtaXhlZCBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19mc3RyZWFtPGNoYXI+IAkJZnN0cmVhbTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyB3Y2hhcl90IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfaW9zPHdjaGFyX3Q+IAkJd2lvczsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgd2NoYXJfdCBidWZmZXJzLgorICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90PiAJd3N0cmVhbWJ1ZjsKKworICAvLy8gQmFzZSBjbGFzcyBmb3IgQGMgd2NoYXJfdCBpbnB1dCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4gCXdpc3RyZWFtOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyB3Y2hhcl90IG91dHB1dCBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX29zdHJlYW08d2NoYXJfdD4gCXdvc3RyZWFtOworCisgIC8vLyBCYXNlIGNsYXNzIGZvciBAYyB3Y2hhcl90IG1peGVkIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pb3N0cmVhbTx3Y2hhcl90PiAJd2lvc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBtZW1vcnkgYnVmZmVycy4KKyAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8d2NoYXJfdD4gCXdzdHJpbmdidWY7CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IGlucHV0IG1lbW9yeSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2lzdHJpbmdzdHJlYW08d2NoYXJfdD4gCXdpc3RyaW5nc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBvdXRwdXQgbWVtb3J5IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfb3N0cmluZ3N0cmVhbTx3Y2hhcl90PiAJd29zdHJpbmdzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IG1peGVkIGlucHV0IGFuZCBvdXRwdXQgbWVtb3J5IHN0cmVhbXMuCisgIHR5cGVkZWYgYmFzaWNfc3RyaW5nc3RyZWFtPHdjaGFyX3Q+IAl3c3RyaW5nc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBmaWxlIGJ1ZmZlcnMuCisgIHR5cGVkZWYgYmFzaWNfZmlsZWJ1Zjx3Y2hhcl90PiAJd2ZpbGVidWY7CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IGlucHV0IGZpbGUgc3RyZWFtcy4KKyAgdHlwZWRlZiBiYXNpY19pZnN0cmVhbTx3Y2hhcl90PiAJd2lmc3RyZWFtOworCisgIC8vLyBDbGFzcyBmb3IgQGMgd2NoYXJfdCBvdXRwdXQgZmlsZSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX29mc3RyZWFtPHdjaGFyX3Q+IAl3b2ZzdHJlYW07CisKKyAgLy8vIENsYXNzIGZvciBAYyB3Y2hhcl90IG1peGVkIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBzdHJlYW1zLgorICB0eXBlZGVmIGJhc2ljX2ZzdHJlYW08d2NoYXJfdD4gCXdmc3RyZWFtOworI2VuZGlmCisgIC8qKiBAfSAgKi8KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLyogX0dMSUJDWFhfSU9TRldEICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2lvc3RyZWFtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb3N0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzcxYmE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pb3N0cmVhbQpAQCAtMCwwICsxLDgwIEBACisvLyBTdGFuZGFyZCBpb3N0cmVhbSBvYmplY3RzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAwMiwgMjAwNSwgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvaW9zdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy4zICBTdGFuZGFyZCBpb3N0cmVhbSBvYmplY3RzCisvLworCisjaWZuZGVmIF9HTElCQ1hYX0lPU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX0lPU1RSRUFNIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogIEBuYW1lIFN0YW5kYXJkIFN0cmVhbSBPYmplY3RzCisgICAqCisgICAqICBUaGUgJmx0O2lvc3RyZWFtJmd0OyBoZWFkZXIgZGVjbGFyZXMgdGhlIGVpZ2h0IDxlbT5zdGFuZGFyZCBzdHJlYW0KKyAgICogIG9iamVjdHM8L2VtPi4gIEZvciBvdGhlciBkZWNsYXJhdGlvbnMsIHNlZQorICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjQuaHRtbAorICAgKiAgYW5kIHRoZSBAbGluayBpb3Nmd2QgSS9PIGZvcndhcmQgZGVjbGFyYXRpb25zIEBlbmRsaW5rCisgICAqCisgICAqICBUaGV5IGFyZSByZXF1aXJlZCBieSBkZWZhdWx0IHRvIGNvb3BlcmF0ZSB3aXRoIHRoZSBnbG9iYWwgQworICAgKiAgbGlicmFyeSdzIEBjIEZJTEUgc3RyZWFtcywgYW5kIHRvIGJlIGF2YWlsYWJsZSBkdXJpbmcgcHJvZ3JhbQorICAgKiAgc3RhcnR1cCBhbmQgdGVybWluYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIEhPV1RPCisgICAqICBsaW5rZWQgdG8gYWJvdmUuCisgICovCisgIC8vQHsKKyAgZXh0ZXJuIGlzdHJlYW0gY2luOwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBpbnB1dAorICBleHRlcm4gb3N0cmVhbSBjb3V0OwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBvdXRwdXQKKyAgZXh0ZXJuIG9zdHJlYW0gY2VycjsJCS8vLyBMaW5rZWQgdG8gc3RhbmRhcmQgZXJyb3IgKHVuYnVmZmVyZWQpCisgIGV4dGVybiBvc3RyZWFtIGNsb2c7CQkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGVycm9yIChidWZmZXJlZCkKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIGV4dGVybiB3aXN0cmVhbSB3Y2luOwkJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBpbnB1dAorICBleHRlcm4gd29zdHJlYW0gd2NvdXQ7CS8vLyBMaW5rZWQgdG8gc3RhbmRhcmQgb3V0cHV0CisgIGV4dGVybiB3b3N0cmVhbSB3Y2VycjsJLy8vIExpbmtlZCB0byBzdGFuZGFyZCBlcnJvciAodW5idWZmZXJlZCkKKyAgZXh0ZXJuIHdvc3RyZWFtIHdjbG9nOwkvLy8gTGlua2VkIHRvIHN0YW5kYXJkIGVycm9yIChidWZmZXJlZCkKKyNlbmRpZgorICAvL0B9CisKKyAgLy8gRm9yIGNvbnN0cnVjdGlvbiBvZiBmaWxlYnVmZmVycyBmb3IgY291dCwgY2luLCBjZXJyLCBjbG9nIGV0LiBhbC4KKyAgc3RhdGljIGlvc19iYXNlOjpJbml0IF9faW9pbml0OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9JT1NUUkVBTSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pc3RyZWFtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzkzOTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2lzdHJlYW0KQEAgLTAsMCArMSw4NjEgQEAKKy8vIElucHV0IHN0cmVhbXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDI3LjYuMSAgSW5wdXQgc3RyZWFtcworLy8KKworLyoqIEBmaWxlIGluY2x1ZGUvaXN0cmVhbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9JU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX0lTVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8b3N0cmVhbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFsyNy42LjEuMV0gVGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGlucHV0IHN0cmVhbXMuICBJdCBwcm92aWRlcyB0ZXh0CisgICAqICBmb3JtYXR0aW5nIG9mIGFsbCBidWlsdGluIHR5cGVzLCBhbmQgY29tbXVuaWNhdGVzIHdpdGggYW55IGNsYXNzCisgICAqICBkZXJpdmVkIGZyb20gYmFzaWNfc3RyZWFtYnVmIHRvIGRvIHRoZSBhY3R1YWwgaW5wdXQuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBjbGFzcyBiYXNpY19pc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXMgKGluaGVyaXRlZCBmcm9tIGJhc2ljX2lvcyAoMjcuNC40KSk6CisgICAgICB0eXBlZGVmIF9DaGFyVCAgICAgICAgICAgICAgICAgICAgIAkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZSAJCWludF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpvZmZfdHlwZSAJCW9mZl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzICAgICAgICAgICAgICAgICAgICAJCXRyYWl0c190eXBlOworICAgICAgCisgICAgICAvLyBOb24tc3RhbmRhcmQgVHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+IAkJX19zdHJlYW1idWZfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfaW9zPF9DaGFyVCwgX1RyYWl0cz4JCV9faW9zX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgkJX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIG51bV9nZXQ8X0NoYXJULCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVCwgX1RyYWl0cz4gPiAgICAgICAgCisgCQkJCQkJCV9fbnVtX2dldF90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+ICAgICAgICAgICAJCQlfX2N0eXBlX3R5cGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvLyBEYXRhIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkIGluIHRoZSBwcmV2aW91cyB1bmZvcm1hdHRlZAorICAgICAgICogIGZ1bmN0aW9uOyBzZWUgZ2NvdW50KCkuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZSAJCV9NX2djb3VudDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIFsyNy42LjEuMS4xXSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEJhc2UgY29uc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgY3RvciBpcyBhbG1vc3QgbmV2ZXIgY2FsbGVkIGJ5IHRoZSB1c2VyIGRpcmVjdGx5LCByYXRoZXIgZnJvbQorICAgICAgICogIGRlcml2ZWQgY2xhc3NlcycgaW5pdGlhbGl6YXRpb24gbGlzdHMsIHdoaWNoIHBhc3MgYSBwb2ludGVyIHRvCisgICAgICAgKiAgdGhlaXIgb3duIHN0cmVhbSBidWZmZXIuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX2lzdHJlYW0oX19zdHJlYW1idWZfdHlwZSogX19zYikKKyAgICAgIDogX01fZ2NvdW50KHN0cmVhbXNpemUoMCkpCisgICAgICB7IHRoaXMtPmluaXQoX19zYik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNlIGRlc3RydWN0b3IuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZG9lcyB2ZXJ5IGxpdHRsZSBhcGFydCBmcm9tIHByb3ZpZGluZyBhIHZpcnR1YWwgYmFzZSBkdG9yLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgCisgICAgICB+YmFzaWNfaXN0cmVhbSgpIAorICAgICAgeyBfTV9nY291bnQgPSBzdHJlYW1zaXplKDApOyB9CisKKyAgICAgIC8vIFsyNy42LjEuMS4yXSBwcmVmaXgvc3VmZml4CisgICAgICBjbGFzcyBzZW50cnk7CisgICAgICBmcmllbmQgY2xhc3Mgc2VudHJ5OworCisgICAgICAvLyBbMjcuNi4xLjJdIGZvcm1hdHRlZCBpbnB1dAorICAgICAgLy8gWzI3LjYuMS4yLjNdIGJhc2ljX2lzdHJlYW06Om9wZXJhdG9yPj4KKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgSW50ZXJmYWNlIGZvciBtYW5pcHVsYXRvcnMuCisgICAgICAgKgorICAgICAgICogIE1hbmlwdWxhdG9ycyBzdWNoIGFzIEBjIHN0ZDo6d3MgYW5kIEBjIHN0ZDo6ZGVjIHVzZSB0aGVzZQorICAgICAgICogIGZ1bmN0aW9ucyBpbiBjb25zdHJ1Y3RzIGxpa2UgCisgICAgICAgKiAgPGNvZGU+c3RkOjpjaW4gPj4gc3RkOjp3czwvY29kZT4uIAorICAgICAgICogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGlvbWFuaXAgaGVhZGVyLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+PihfX2lzdHJlYW1fdHlwZSYgKCpfX3BmKShfX2lzdHJlYW1fdHlwZSYpKQorICAgICAgeyByZXR1cm4gX19wZigqdGhpcyk7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcj4+KF9faW9zX3R5cGUmICgqX19wZikoX19pb3NfdHlwZSYpKQorICAgICAgeyAKKwlfX3BmKCp0aGlzKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJgorICAgICAgb3BlcmF0b3I+Pihpb3NfYmFzZSYgKCpfX3BmKShpb3NfYmFzZSYpKQorICAgICAgeworCV9fcGYoKnRoaXMpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLy8gWzI3LjYuMS4yLjJdIGFyaXRobWV0aWMgZXh0cmFjdG9ycworICAgICAgLyoqCisgICAgICAgKiAgQG5hbWUgQXJpdGhtZXRpYyBFeHRyYWN0b3JzCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgQGMgb3BlcmF0b3I+PiBmdW5jdGlvbnMgKGFrYSA8ZW0+Zm9ybWF0dGVkIGlucHV0CisgICAgICAgKiAgZnVuY3Rpb25zPC9lbT4pIGhhdmUgc29tZSBjb21tb24gYmVoYXZpb3IuICBFYWNoIHN0YXJ0cyBieQorICAgICAgICogIGNvbnN0cnVjdGluZyBhIHRlbXBvcmFyeSBvYmplY3Qgb2YgdHlwZSBzdGQ6OmJhc2ljX2lzdHJlYW06OnNlbnRyeQorICAgICAgICogIHdpdGggdGhlIHNlY29uZCBhcmd1bWVudCAobm9za2lwd3MpIHNldCB0byBmYWxzZS4gIFRoaXMgaGFzIHNldmVyYWwKKyAgICAgICAqICBlZmZlY3RzLCBjb25jbHVkaW5nIHdpdGggdGhlIHNldHRpbmcgb2YgYSBzdGF0dXMgZmxhZzsgc2VlIHRoZQorICAgICAgICogIHNlbnRyeSBkb2N1bWVudGF0aW9uIGZvciBtb3JlLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc2VudHJ5IHN0YXR1cyBpcyBnb29kLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZXh0cmFjdAorICAgICAgICogIHdoYXRldmVyIGRhdGEgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgZXh0cmFjdGlvbiwgaW9zX2Jhc2U6OmJhZGJpdAorICAgICAgICogIHdpbGwgYmUgdHVybmVkIG9uIGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZSB3aXRob3V0IGNhdXNpbmcgYW4KKyAgICAgICAqICBpb3NfYmFzZTo6ZmFpbHVyZSB0byBiZSB0aHJvd24uICBUaGUgb3JpZ2luYWwgZXhjZXB0aW9uIHdpbGwgdGhlbgorICAgICAgICogIGJlIHJldGhyb3duLgorICAgICAgKi8KKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQmFzaWMgYXJpdGhtZXRpYyBleHRyYWN0b3JzCisgICAgICAgKiAgQHBhcmFtICBBIHZhcmlhYmxlIG9mIGJ1aWx0aW4gdHlwZS4KKyAgICAgICAqICBAcmV0dXJuICBAYyAqdGhpcyBpZiBzdWNjZXNzZnVsCisgICAgICAgKgorICAgICAgICogIFRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlIHN0cmVhbSdzIGN1cnJlbnQgbG9jYWxlIChzcGVjaWZpY2FsbHksIHRoZQorICAgICAgICogIEBjIG51bV9nZXQgZmFjZXQpIHRvIHBhcnNlIHRoZSBpbnB1dCBkYXRhLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4oYm9vbCYgX19uKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX24pOyB9CisgICAgICAKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4oc2hvcnQmIF9fbik7CisgICAgICAKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcj4+KGludCYgX19uKTsKKyAgICAKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4odW5zaWduZWQgaW50JiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I+Pihsb25nJiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKyAgICAgIAorICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9MT05HX0xPTkcKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4obG9uZyBsb25nJiBfX24pCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fbik7IH0KKworICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19uKTsgfQorI2VuZGlmCisKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4oZmxvYXQmIF9fZikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19mKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcj4+KGRvdWJsZSYgX19mKQorICAgICAgeyByZXR1cm4gX01fZXh0cmFjdChfX2YpOyB9CisKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPj4obG9uZyBkb3VibGUmIF9fZikKKyAgICAgIHsgcmV0dXJuIF9NX2V4dHJhY3QoX19mKTsgfQorCisgICAgICBfX2lzdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcj4+KHZvaWQqJiBfX3ApCisgICAgICB7IHJldHVybiBfTV9leHRyYWN0KF9fcCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFeHRyYWN0aW5nIGludG8gYW5vdGhlciBzdHJlYW1idWYuCisgICAgICAgKiAgQHBhcmFtICBzYiAgQSBwb2ludGVyIHRvIGEgc3RyZWFtYnVmCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gYmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgYmFzaWMgYXJpdGhtZXRpYyBleHRyYWN0b3JzLAorICAgICAgICogIGluIHRoYXQgaXQgYWxzbyBjb25zdHJ1Y3RzIGEgc2VudHJ5IG9iamVjdCBhbmQgaGFzIHRoZSBzYW1lIGVycm9yCisgICAgICAgKiAgaGFuZGxpbmcgYmVoYXZpb3IuCisgICAgICAgKgorICAgICAgICogIElmIEBhIHNiIGlzIE5VTEwsIHRoZSBzdHJlYW0gd2lsbCBzZXQgZmFpbGJpdCBpbiBpdHMgZXJyb3Igc3RhdGUuCisgICAgICAgKgorICAgICAgICogIENoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoaXMgc3RyZWFtIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQorICAgICAgICogIEBhIHNiIHN0cmVhbWJ1ZiB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvY2N1cnM6CisgICAgICAgKgorICAgICAgICogIC0gdGhlIGlucHV0IHN0cmVhbSByZWFjaGVzIGVuZC1vZi1maWxlLAorICAgICAgICogIC0gaW5zZXJ0aW9uIGludG8gdGhlIG91dHB1dCBidWZmZXIgZmFpbHMgKGluIHRoaXMgY2FzZSwgdGhlCisgICAgICAgKiAgICBjaGFyYWN0ZXIgdGhhdCB3b3VsZCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaXMgbm90IGV4dHJhY3RlZCksIG9yCisgICAgICAgKiAgLSBhbiBleGNlcHRpb24gb2NjdXJzIChhbmQgaW4gdGhpcyBjYXNlIGlzIGNhdWdodCkKKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIGZ1bmN0aW9uIGluc2VydHMgbm8gY2hhcmFjdGVycywgZmFpbGJpdCBpcyBzZXQuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I+PihfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiKTsKKyAgICAgIC8vQH0KKyAgICAgIAorICAgICAgLy8gWzI3LjYuMS4zXSB1bmZvcm1hdHRlZCBpbnB1dAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgY291bnRpbmcKKyAgICAgICAqICBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkIGJ5IHRoZSBwcmV2aW91cworICAgICAgICogICAgICAgICAgIHVuZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uIGRpc3BhdGNoZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIHN0cmVhbXNpemUgCisgICAgICBnY291bnQoKSBjb25zdCAKKyAgICAgIHsgcmV0dXJuIF9NX2djb3VudDsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAbmFtZSBVbmZvcm1hdHRlZCBJbnB1dCBGdW5jdGlvbnMKKyAgICAgICAqCisgICAgICAgKiAgQWxsIHRoZSB1bmZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbnMgaGF2ZSBzb21lIGNvbW1vbiBiZWhhdmlvci4KKyAgICAgICAqICBFYWNoIHN0YXJ0cyBieSBjb25zdHJ1Y3RpbmcgYSB0ZW1wb3Jhcnkgb2JqZWN0IG9mIHR5cGUKKyAgICAgICAqICBzdGQ6OmJhc2ljX2lzdHJlYW06OnNlbnRyeSB3aXRoIHRoZSBzZWNvbmQgYXJndW1lbnQgKG5vc2tpcHdzKQorICAgICAgICogIHNldCB0byB0cnVlLiAgVGhpcyBoYXMgc2V2ZXJhbCBlZmZlY3RzLCBjb25jbHVkaW5nIHdpdGggdGhlCisgICAgICAgKiAgc2V0dGluZyBvZiBhIHN0YXR1cyBmbGFnOyBzZWUgdGhlIHNlbnRyeSBkb2N1bWVudGF0aW9uIGZvciBtb3JlLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc2VudHJ5IHN0YXR1cyBpcyBnb29kLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZXh0cmFjdAorICAgICAgICogIHdoYXRldmVyIGRhdGEgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCBpcyBzdG9yZWQgZm9yIGxhdGVyIHJldHJpZXZhbAorICAgICAgICogIGJ5IGdjb3VudCgpLgorICAgICAgICoKKyAgICAgICAqICBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBleHRyYWN0aW9uLCBpb3NfYmFzZTo6YmFkYml0CisgICAgICAgKiAgd2lsbCBiZSB0dXJuZWQgb24gaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlIHdpdGhvdXQgY2F1c2luZyBhbgorICAgICAgICogIGlvc19iYXNlOjpmYWlsdXJlIHRvIGJlIHRocm93bi4gIFRoZSBvcmlnaW5hbCBleGNlcHRpb24gd2lsbCB0aGVuCisgICAgICAgKiAgYmUgcmV0aHJvd24uCisgICAgICAqLworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTaW1wbGUgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcmV0dXJuICBBIGNoYXJhY3Rlciwgb3IgZW9mKCkuCisgICAgICAgKgorICAgICAgICogIFRyaWVzIHRvIGV4dHJhY3QgYSBjaGFyYWN0ZXIuICBJZiBub25lIGFyZSBhdmFpbGFibGUsIHNldHMgZmFpbGJpdAorICAgICAgICogIGFuZCByZXR1cm5zIHRyYWl0czo6ZW9mKCkuCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBnZXQoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTaW1wbGUgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIGMgIFRoZSBjaGFyYWN0ZXIgaW4gd2hpY2ggdG8gc3RvcmUgZGF0YS4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUcmllcyB0byBleHRyYWN0IGEgY2hhcmFjdGVyIGFuZCBzdG9yZSBpdCBpbiBAYSBjLiAgSWYgbm9uZSBhcmUKKyAgICAgICAqICBhdmFpbGFibGUsIHNldHMgZmFpbGJpdCBhbmQgcmV0dXJucyB0cmFpdHM6OmVvZigpLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBpcyBub3Qgb3ZlcmxvYWRlZCBvbiBzaWduZWQgY2hhciBhbmQKKyAgICAgICAqICAgICAgICAgdW5zaWduZWQgY2hhci4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYgCisgICAgICBnZXQoY2hhcl90eXBlJiBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBtdWx0aXBsZS1jaGFyYWN0ZXIgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIHMgIFBvaW50ZXIgdG8gYW4gYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBuICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHN0b3JlIGluIEBhIHMuCisgICAgICAgKiAgQHBhcmFtICBkZWxpbSAgQSAic3RvcCIgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIENoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCBhbmQgc3RvcmVkIGludG8gQGEgcyB1bnRpbCBvbmUgb2YgdGhlCisgICAgICAgKiAgZm9sbG93aW5nIGhhcHBlbnM6CisgICAgICAgKgorICAgICAgICogIC0gQGMgbi0xIGNoYXJhY3RlcnMgYXJlIHN0b3JlZAorICAgICAgICogIC0gdGhlIGlucHV0IHNlcXVlbmNlIHJlYWNoZXMgRU9GCisgICAgICAgKiAgLSB0aGUgbmV4dCBjaGFyYWN0ZXIgZXF1YWxzIEBhIGRlbGltLCBpbiB3aGljaCBjYXNlIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAqICAgIGlzIG5vdCBleHRyYWN0ZWQKKyAgICAgICAqCisgICAgICAgKiBJZiBubyBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQsIGZhaWxiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvcgorICAgICAgICogc3RhdGUuCisgICAgICAgKgorICAgICAgICogSW4gYW55IGNhc2UsIGEgbnVsbCBjaGFyYWN0ZXIgaXMgc3RvcmVkIGludG8gdGhlIG5leHQgbG9jYXRpb24gaW4KKyAgICAgICAqIHRoZSBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG92ZXJsb2FkZWQgb24gc2lnbmVkIGNoYXIgYW5kCisgICAgICAgKiAgICAgICAgIHVuc2lnbmVkIGNoYXIuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgZ2V0KGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBtdWx0aXBsZS1jaGFyYWN0ZXIgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIHMgIFBvaW50ZXIgdG8gYW4gYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBuICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHN0b3JlIGluIEBhIHMuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBAYyBnZXQocyxuLHdpZGVuKCZhcG9zO1xcbiZhcG9zOykpLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIGdldChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pCisgICAgICB7IHJldHVybiB0aGlzLT5nZXQoX19zLCBfX24sIHRoaXMtPndpZGVuKCdcbicpKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEV4dHJhY3Rpb24gaW50byBhbm90aGVyIHN0cmVhbWJ1Zi4KKyAgICAgICAqICBAcGFyYW0gIHNiICBBIHN0cmVhbWJ1ZiBpbiB3aGljaCB0byBzdG9yZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgZGVsaW0gIEEgInN0b3AiIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBDaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQgYW5kIGluc2VydGVkIGludG8gQGEgc2IgdW50aWwgb25lIG9mIHRoZQorICAgICAgICogIGZvbGxvd2luZyBoYXBwZW5zOgorICAgICAgICoKKyAgICAgICAqICAtIHRoZSBpbnB1dCBzZXF1ZW5jZSByZWFjaGVzIEVPRgorICAgICAgICogIC0gaW5zZXJ0aW9uIGludG8gdGhlIG91dHB1dCBidWZmZXIgZmFpbHMgKGluIHRoaXMgY2FzZSwgdGhlCisgICAgICAgKiAgICBjaGFyYWN0ZXIgdGhhdCB3b3VsZCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaXMgbm90IGV4dHJhY3RlZCkKKyAgICAgICAqICAtIHRoZSBuZXh0IGNoYXJhY3RlciBlcXVhbHMgQGEgZGVsaW0gKGluIHRoaXMgY2FzZSwgdGhlIGNoYXJhY3RlcgorICAgICAgICogICAgaXMgbm90IGV4dHJhY3RlZCkKKyAgICAgICAqICAtIGFuIGV4Y2VwdGlvbiBvY2N1cnMgKGFuZCBpbiB0aGlzIGNhc2UgaXMgY2F1Z2h0KQorICAgICAgICoKKyAgICAgICAqIElmIG5vIGNoYXJhY3RlcnMgYXJlIHN0b3JlZCwgZmFpbGJpdCBpcyBzZXQgaW4gdGhlIHN0cmVhbSdzIGVycm9yCisgICAgICAgKiBzdGF0ZS4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYKKyAgICAgIGdldChfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiLCBjaGFyX3R5cGUgX19kZWxpbSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXh0cmFjdGlvbiBpbnRvIGFub3RoZXIgc3RyZWFtYnVmLgorICAgICAgICogIEBwYXJhbSAgc2IgIEEgc3RyZWFtYnVmIGluIHdoaWNoIHRvIHN0b3JlIGRhdGEuCisgICAgICAgKiAgQHJldHVybiAgKnRoaXMKKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBAYyBnZXQoc2Isd2lkZW4oJmFwb3M7XFxuJmFwb3M7KSkuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBnZXQoX19zdHJlYW1idWZfdHlwZSYgX19zYikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmdldChfX3NiLCB0aGlzLT53aWRlbignXG4nKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdHJpbmcgZXh0cmFjdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIHMgIEEgY2hhcmFjdGVyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBkYXRhLgorICAgICAgICogIEBwYXJhbSAgbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBleHRyYWN0LgorICAgICAgICogIEBwYXJhbSAgZGVsaW0gIEEgInN0b3AiIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBFeHRyYWN0cyBhbmQgc3RvcmVzIGNoYXJhY3RlcnMgaW50byBAYSBzIHVudGlsIG9uZSBvZiB0aGUKKyAgICAgICAqICBmb2xsb3dpbmcgaGFwcGVucy4gIE5vdGUgdGhhdCB0aGVzZSBjcml0ZXJpYSBhcmUgcmVxdWlyZWQgdG8gYmUKKyAgICAgICAqICB0ZXN0ZWQgaW4gdGhlIG9yZGVyIGxpc3RlZCBoZXJlLCB0byBhbGxvdyBhbiBpbnB1dCBsaW5lIHRvIGV4YWN0bHkKKyAgICAgICAqICBmaWxsIHRoZSBAYSBzIGFycmF5IHdpdGhvdXQgc2V0dGluZyBmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICAtIyB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBlbmQtb2YtZmlsZSwgaW4gd2hpY2ggY2FzZSBlb2ZiaXQKKyAgICAgICAqICAgICBpcyBzZXQgaW4gdGhlIHN0cmVhbSBlcnJvciBzdGF0ZQorICAgICAgICogIC0jIHRoZSBuZXh0IGNoYXJhY3RlciBlcXVhbHMgQGMgZGVsaW0sIGluIHdoaWNoIGNhc2UgdGhlIGNoYXJhY3RlcgorICAgICAgICogICAgIGlzIGV4dHJhY3RlZCAoYW5kIHRoZXJlZm9yZSBjb3VudGVkIGluIEBjIGdjb3VudCgpKSBidXQgbm90IHN0b3JlZAorICAgICAgICogIC0jIEBjIG4tMSBjaGFyYWN0ZXJzIGFyZSBzdG9yZWQsIGluIHdoaWNoIGNhc2UgZmFpbGJpdCBpcyBzZXQKKyAgICAgICAqICAgICBpbiB0aGUgc3RyZWFtIGVycm9yIHN0YXRlCisgICAgICAgKgorICAgICAgICogIElmIG5vIGNoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCwgZmFpbGJpdCBpcyBzZXQuICAoQW4gZW1wdHkgbGluZSBvZgorICAgICAgICogIGlucHV0IHNob3VsZCB0aGVyZWZvcmUgbm90IGNhdXNlIGZhaWxiaXQgdG8gYmUgc2V0LikKKyAgICAgICAqCisgICAgICAgKiAgSW4gYW55IGNhc2UsIGEgbnVsbCBjaGFyYWN0ZXIgaXMgc3RvcmVkIGluIHRoZSBuZXh0IGxvY2F0aW9uIGluCisgICAgICAgKiAgdGhlIGFycmF5LgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3RyaW5nIGV4dHJhY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICBzICBBIGNoYXJhY3RlciBhcnJheSBpbiB3aGljaCB0byBzdG9yZSB0aGUgZGF0YS4KKyAgICAgICAqICBAcGFyYW0gIG4gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gZXh0cmFjdC4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIEBjIGdldGxpbmUocyxuLHdpZGVuKCZhcG9zO1xcbiZhcG9zOykpLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgeyByZXR1cm4gdGhpcy0+Z2V0bGluZShfX3MsIF9fbiwgdGhpcy0+d2lkZW4oJ1xuJykpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGlzY2FyZGluZyBjaGFyYWN0ZXJzCisgICAgICAgKiAgQHBhcmFtICBuICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBkaXNjYXJkLgorICAgICAgICogIEBwYXJhbSAgZGVsaW0gIEEgInN0b3AiIGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBFeHRyYWN0cyBjaGFyYWN0ZXJzIGFuZCB0aHJvd3MgdGhlbSBhd2F5IHVudGlsIG9uZSBvZiB0aGUKKyAgICAgICAqICBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICAgICAqICAtIGlmIEBhIG4gQGMgIT0gQGMgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwgQGEgbgorICAgICAgICogICAgY2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBlbmQtb2YtZmlsZQorICAgICAgICogIC0gdGhlIG5leHQgY2hhcmFjdGVyIGVxdWFscyBAYSBkZWxpbSAoaW4gdGhpcyBjYXNlLCB0aGUgY2hhcmFjdGVyCisgICAgICAgKiAgICBpcyBleHRyYWN0ZWQpOyBub3RlIHRoYXQgdGhpcyBjb25kaXRpb24gd2lsbCBuZXZlciBvY2N1ciBpZgorICAgICAgICogICAgQGEgZGVsaW0gZXF1YWxzIEBjIHRyYWl0czo6ZW9mKCkuCisgICAgICAgKgorICAgICAgICogIE5COiBQcm92aWRlIHRocmVlIG92ZXJsb2FkcywgaW5zdGVhZCBvZiB0aGUgc2luZ2xlIGZ1bmN0aW9uCisgICAgICAgKiAgKHdpdGggZGVmYXVsdHMpIG1hbmRhdGVkIGJ5IHRoZSBTdGFuZGFyZDogdGhpcyBsZWFkcyB0byBhCisgICAgICAgKiAgYmV0dGVyIHBlcmZvcm1pbmcgaW1wbGVtZW50YXRpb24sIHdoaWxlIHN0aWxsIGNvbmZvcm1pbmcgdG8KKyAgICAgICAqICB0aGUgU3RhbmRhcmQuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgaWdub3JlKCk7CisKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTG9va2luZyBhaGVhZCBpbiB0aGUgc3RyZWFtCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5leHQgY2hhcmFjdGVyLCBvciBlb2YoKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYsIGFmdGVyIGNvbnN0cnVjdGluZyB0aGUgc2VudHJ5IG9iamVjdCwgQGMgZ29vZCgpIGlzIGZhbHNlLAorICAgICAgICogIHJldHVybnMgQGMgdHJhaXRzOjplb2YoKS4gIE90aGVyd2lzZSByZWFkcyBidXQgZG9lcyBub3QgZXh0cmFjdAorICAgICAgICogIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHBlZWsoKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFeHRyYWN0aW9uIHdpdGhvdXQgZGVsaW1pdGVycy4KKyAgICAgICAqICBAcGFyYW0gIHMgIEEgY2hhcmFjdGVyIGFycmF5LgorICAgICAgICogIEBwYXJhbSAgbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzdG9yZS4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc3RyZWFtIHN0YXRlIGlzIEBjIGdvb2QoKSwgZXh0cmFjdHMgY2hhcmFjdGVycyBhbmQgc3RvcmVzCisgICAgICAgKiAgdGhlbSBpbnRvIEBhIHMgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICAgICAqICAtIEBhIG4gY2hhcmFjdGVycyBhcmUgc3RvcmVkCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc2VxdWVuY2UgcmVhY2hlcyBlbmQtb2YtZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZXJyb3IKKyAgICAgICAqICAgIHN0YXRlIGlzIHNldCB0byBAYyBmYWlsYml0fGVvZmJpdC4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG92ZXJsb2FkZWQgb24gc2lnbmVkIGNoYXIgYW5kCisgICAgICAgKiAgICAgICAgIHVuc2lnbmVkIGNoYXIuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmIAorICAgICAgcmVhZChjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEV4dHJhY3Rpb24gdW50aWwgdGhlIGJ1ZmZlciBpcyBleGhhdXN0ZWQsIGJ1dCBubyBtb3JlLgorICAgICAgICogIEBwYXJhbSAgcyAgQSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICAgKiAgQHBhcmFtICBuICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHN0b3JlLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleHRyYWN0ZWQuCisgICAgICAgKgorICAgICAgICogIEV4dHJhY3RzIGNoYXJhY3RlcnMgYW5kIHN0b3JlcyB0aGVtIGludG8gQGEgcyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgKiAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtYWluaW5nIGluIHRoZSBzdHJlYW1idWYncyBidWZmZXIsCisgICAgICAgKiAgQGMgcmRidWYoKS0+aW5fYXZhaWwoKSwgY2FsbGVkIEBjIEEgaGVyZToKKyAgICAgICAqICAtIGlmIEBjIEEgQGMgPT0gQGMgLTEsIHNldHMgZW9mYml0IGFuZCBleHRyYWN0cyBubyBjaGFyYWN0ZXJzCisgICAgICAgKiAgLSBpZiBAYyBBIEBjID09IEBjIDAsIGV4dHJhY3RzIG5vIGNoYXJhY3RlcnMKKyAgICAgICAqICAtIGlmIEBjIEEgQGMgPiBAYyAwLCBleHRyYWN0cyBAYyBtaW4oQSxuKQorICAgICAgICoKKyAgICAgICAqICBUaGUgZ29hbCBpcyB0byBlbXB0eSB0aGUgY3VycmVudCBidWZmZXIsIGFuZCB0byBub3QgcmVxdWVzdCBhbnkKKyAgICAgICAqICBtb3JlIGZyb20gdGhlIGV4dGVybmFsIGlucHV0IHNlcXVlbmNlIGNvbnRyb2xsZWQgYnkgdGhlIHN0cmVhbWJ1Zi4KKyAgICAgICovCisgICAgICBzdHJlYW1zaXplIAorICAgICAgcmVhZHNvbWUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBVbmV4dHJhY3RpbmcgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAgICogIEBwYXJhbSAgYyAgVGhlIGNoYXJhY3RlciB0byBwdXNoIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgbm90IG51bGwsIGNhbGxzIEBjIHJkYnVmKCktPnNwdXRiYWNrYyhjKS4KKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgcmRidWYoKSBpcyBudWxsIG9yIGlmIEBjIHNwdXRiYWNrYygpIGZhaWxzLCBzZXRzIGJhZGJpdCBpbgorICAgICAgICogIHRoZSBlcnJvciBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2xlYXJzIGVvZmJpdC4gIFNpbmNlIG5vIGNoYXJhY3RlcnMKKyAgICAgICAqICAgICAgICAgYXJlIGV4dHJhY3RlZCwgdGhlIG5leHQgY2FsbCB0byBAYyBnY291bnQoKSB3aWxsIHJldHVybiAwLAorICAgICAgICogICAgICAgICBhcyByZXF1aXJlZCBieSBEUiA2MC4KKyAgICAgICovCisgICAgICBfX2lzdHJlYW1fdHlwZSYgCisgICAgICBwdXRiYWNrKGNoYXJfdHlwZSBfX2MpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFVuZXh0cmFjdGluZyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgbm90IG51bGwsIGNhbGxzIEBjIHJkYnVmKCktPnN1bmdldGMoYykuCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgbnVsbCBvciBpZiBAYyBzdW5nZXRjKCkgZmFpbHMsIHNldHMgYmFkYml0IGluCisgICAgICAgKiAgdGhlIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBmaXJzdCBjbGVhcnMgZW9mYml0LiAgU2luY2Ugbm8gY2hhcmFjdGVycworICAgICAgICogICAgICAgICBhcmUgZXh0cmFjdGVkLCB0aGUgbmV4dCBjYWxsIHRvIEBjIGdjb3VudCgpIHdpbGwgcmV0dXJuIDAsCisgICAgICAgKiAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IERSIDYwLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIHVuZ2V0KCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU3luY2hyb25pemluZyB0aGUgc3RyZWFtIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAgICAgICAqCisgICAgICAgKiAgSWYgQGMgcmRidWYoKSBpcyBhIG51bGwgcG9pbnRlciwgcmV0dXJucyAtMS4KKyAgICAgICAqCisgICAgICAgKiAgT3RoZXJ3aXNlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzeW5jKCksIGFuZCBpZiB0aGF0IHJldHVybnMgLTEsCisgICAgICAgKiAgc2V0cyBiYWRiaXQgYW5kIHJldHVybnMgLTEuCisgICAgICAgKgorICAgICAgICogIE90aGVyd2lzZSwgcmV0dXJucyAwLgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjb3VudCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgICAqICAgICAgICAgZXh0cmFjdGVkLCBpZiBhbnksIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QgYWZmZWN0IHRoZSBuZXh0CisgICAgICAgKiAgICAgICAgIGNhbGwgdG8gQGMgZ2NvdW50KCkuCisgICAgICAqLworICAgICAgaW50IAorICAgICAgc3luYygpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEdldHRpbmcgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi4KKyAgICAgICAqICBAcmV0dXJuICBBIGZpbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IGZhbHNlLCByZXR1cm5zIEBjIHBvc190eXBlKC0xKSB0byBpbmRpY2F0ZQorICAgICAgICogIGZhaWx1cmUuICBPdGhlcndpc2UgcmV0dXJucyBAYyByZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsY3VyLGluKS4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY291bnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICAgKiAgICAgICAgIGV4dHJhY3RlZCwgaWYgYW55LCBhbmQgdGhlcmVmb3JlIGRvZXMgbm90IGFmZmVjdCB0aGUgbmV4dAorICAgICAgICogICAgICAgICBjYWxsIHRvIEBjIGdjb3VudCgpLiAgQXQgdmFyaWFuY2Ugd2l0aCBwdXRiYWNrLCB1bmdldCBhbmQKKyAgICAgICAqICAgICAgICAgc2Vla2csIGVvZmJpdCBpcyBub3QgY2xlYXJlZCBmaXJzdC4KKyAgICAgICovCisgICAgICBwb3NfdHlwZQorICAgICAgdGVsbGcoKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDaGFuZ2luZyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgcG9zICBBIGZpbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIGZhaWwoKSBpcyBub3QgdHJ1ZSwgY2FsbHMgQGMgcmRidWYoKS0+cHVic2Vla3Bvcyhwb3MpLiAgSWYKKyAgICAgICAqICB0aGF0IGZ1bmN0aW9uIGZhaWxzLCBzZXRzIGZhaWxiaXQuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNsZWFycyBlb2ZiaXQuICBJdCBkb2VzIG5vdCBjb3VudCB0aGUKKyAgICAgICAqICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXh0cmFjdGVkLCBpZiBhbnksIGFuZCB0aGVyZWZvcmUgZG9lcworICAgICAgICogICAgICAgICBub3QgYWZmZWN0IHRoZSBuZXh0IGNhbGwgdG8gQGMgZ2NvdW50KCkuCisgICAgICAqLworICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICBzZWVrZyhwb3NfdHlwZSk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdpbmcgdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi4KKyAgICAgICAqICBAcGFyYW0gIG9mZiAgQSBmaWxlIG9mZnNldCBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtICBkaXIgIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gc2Vlay4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IHRydWUsIGNhbGxzIEBjIHJkYnVmKCktPnB1YnNlZWtvZmYob2ZmLGRpcikuCisgICAgICAgKiAgSWYgdGhhdCBmdW5jdGlvbiBmYWlscywgc2V0cyBmYWlsYml0LgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgVGhpcyBmdW5jdGlvbiBmaXJzdCBjbGVhcnMgZW9mYml0LiAgSXQgZG9lcyBub3QgY291bnQgdGhlCisgICAgICAgKiAgICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4dHJhY3RlZCwgaWYgYW55LCBhbmQgdGhlcmVmb3JlIGRvZXMKKyAgICAgICAqICAgICAgICAgbm90IGFmZmVjdCB0aGUgbmV4dCBjYWxsIHRvIEBjIGdjb3VudCgpLgorICAgICAgKi8KKyAgICAgIF9faXN0cmVhbV90eXBlJiAKKyAgICAgIHNlZWtnKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7CisgICAgICAvL0B9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBiYXNpY19pc3RyZWFtKCkKKyAgICAgIDogX01fZ2NvdW50KHN0cmVhbXNpemUoMCkpCisgICAgICB7IHRoaXMtPmluaXQoMCk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlVD4KKyAgICAgICAgX19pc3RyZWFtX3R5cGUmCisgICAgICAgIF9NX2V4dHJhY3QoX1ZhbHVlVCYgX192KTsKKyAgICB9OworCisgIC8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBpbiBzcmMvaXN0cmVhbS5jYy4KKyAgdGVtcGxhdGU8PiAKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JiAKKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+OjoKKyAgICBnZXRsaW5lKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbiwgY2hhcl90eXBlIF9fZGVsaW0pOworICAKKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj4mCisgICAgYmFzaWNfaXN0cmVhbTxjaGFyPjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uKTsKKyAgCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIGJhc2ljX2lzdHJlYW08Y2hhcj46OgorICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+IAorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mIAorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD46OgorICAgIGdldGxpbmUoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uLCBjaGFyX3R5cGUgX19kZWxpbSk7CisKKyAgdGVtcGxhdGU8PgorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD4mCisgICAgYmFzaWNfaXN0cmVhbTx3Y2hhcl90Pjo6CisgICAgaWdub3JlKHN0cmVhbXNpemUgX19uKTsKKyAgCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPHdjaGFyX3Q+JgorICAgIGJhc2ljX2lzdHJlYW08d2NoYXJfdD46OgorICAgIGlnbm9yZShzdHJlYW1zaXplIF9fbiwgaW50X3R5cGUgX19kZWxpbSk7CisjZW5kaWYKKworICAvKioKKyAgICogIEBicmllZiAgUGVyZm9ybXMgc2V0dXAgd29yayBmb3IgaW5wdXQgc3RyZWFtcy4KKyAgICoKKyAgICogIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgY3JlYXRlZCBiZWZvcmUgYWxsIG9mIHRoZSBzdGFuZGFyZAorICAgKiAgZXh0cmFjdG9ycyBhcmUgcnVuLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIDxlbT5leGNlcHRpb24tc2FmZQorICAgKiAgcHJlZml4IGFuZCBzdWZmaXggb3BlcmF0aW9ucyw8L2VtPiBhbHRob3VnaCBvbmx5IHByZWZpeCBhY3Rpb25zCisgICAqICBhcmUgY3VycmVudGx5IHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGNsYXNzIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPjo6c2VudHJ5CisgICAgeworICAgICAgLy8gRGF0YSBNZW1iZXJzLgorICAgICAgYm9vbCBfTV9vazsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBFYXN5IGFjY2VzcyB0byBkZXBlbmRhbnQgdHlwZXMuCisgICAgICB0eXBlZGVmIF9UcmFpdHMgCQkJCQl0cmFpdHNfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4gCQlfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gCQlfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Ol9fY3R5cGVfdHlwZSAJX19jdHlwZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppbnRfdHlwZQkJX19pbnRfdHlwZTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgY29uc3RydWN0b3IgcGVyZm9ybXMgYWxsIHRoZSB3b3JrLgorICAgICAgICogIEBwYXJhbSAgaXMgIFRoZSBpbnB1dCBzdHJlYW0gdG8gZ3VhcmQuCisgICAgICAgKiAgQHBhcmFtICBub3NraXB3cyAgV2hldGhlciB0byBjb25zdW1lIHdoaXRlc3BhY2Ugb3Igbm90LgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc3RyZWFtIHN0YXRlIGlzIGdvb2QgKEBhIGlzLmdvb2QoKSBpcyB0cnVlKSwgdGhlbiB0aGUKKyAgICAgICAqICBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgcGVyZm9ybWVkLCBvdGhlcndpc2UgdGhlIHNlbnRyeSBzdGF0ZQorICAgICAgICogIGlzIGZhbHNlICg8ZW0+bm90IG9rYXk8L2VtPikgYW5kIGZhaWxiaXQgaXMgc2V0IGluIHRoZQorICAgICAgICogIHN0cmVhbSBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIHNlbnRyeSdzIHByZXBhcmF0b3J5IGFjdGlvbnMgYXJlOgorICAgICAgICoKKyAgICAgICAqICAtIyBpZiB0aGUgc3RyZWFtIGlzIHRpZWQgdG8gYW4gb3V0cHV0IHN0cmVhbSwgQGMgaXMudGllKCktPmZsdXNoKCkKKyAgICAgICAqICAgICBpcyBjYWxsZWQgdG8gc3luY2hyb25pemUgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgICogIC0jIGlmIEBhIG5vc2tpcHdzIGlzIGZhbHNlLCBhbmQgQGMgaW9zX2Jhc2U6OnNraXB3cyBpcyBzZXQgaW4KKyAgICAgICAqICAgICBAYyBpcy5mbGFncygpLCB0aGUgc2VudHJ5IGV4dHJhY3RzIGFuZCBkaXNjYXJkcyB3aGl0ZXNwYWNlCisgICAgICAgKiAgICAgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJlYW0uICBUaGUgY3VycmVudGx5IGltYnVlZCBsb2NhbGUgaXMKKyAgICAgICAqICAgICB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGVhY2ggY2hhcmFjdGVyIGlzIHdoaXRlc3BhY2UuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzdHJlYW0gc3RhdGUgaXMgc3RpbGwgZ29vZCwgdGhlbiB0aGUgc2VudHJ5IHN0YXRlIGJlY29tZXMKKyAgICAgICAqICB0cnVlIChAYSBva2F5KS4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgc2VudHJ5KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywgYm9vbCBfX25vc2tpcHdzID0gZmFsc2UpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFF1aWNrIHN0YXR1cyBjaGVja2luZy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgc2VudHJ5IHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBGb3IgZWFzZSBvZiB1c2UsIHNlbnRyaWVzIG1heSBiZSBjb252ZXJ0ZWQgdG8gYm9vbGVhbnMuICBUaGUKKyAgICAgICAqICByZXR1cm4gdmFsdWUgaXMgdGhhdCBvZiB0aGUgc2VudHJ5IHN0YXRlICh0cnVlID09IG9rYXkpLgorICAgICAgKi8KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZXhwbGljaXQKKyNlbmRpZgorICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9vazsgfQorICAgIH07CisKKyAgLy8gWzI3LjYuMS4yLjNdIGNoYXJhY3RlciBleHRyYWN0aW9uIHRlbXBsYXRlcworICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgZXh0cmFjdG9ycworICAgKiAgQHBhcmFtICBpbiAgQW4gaW5wdXQgc3RyZWFtLgorICAgKiAgQHBhcmFtICBjICBBIGNoYXJhY3RlciByZWZlcmVuY2UuCisgICAqICBAcmV0dXJuICBpbgorICAgKgorICAgKiAgQmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgZm9ybWF0dGVkIGFyaXRobWV0aWMgZXh0cmFjdG9ycyBkZXNjcmliZWQgaW4KKyAgICogIHN0ZDo6YmFzaWNfaXN0cmVhbS4gIEFmdGVyIGNvbnN0cnVjdGluZyBhIHNlbnRyeSBvYmplY3Qgd2l0aCBnb29kCisgICAqICBzdGF0dXMsIHRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgYSBjaGFyYWN0ZXIgKGlmIG9uZSBpcyBhdmFpbGFibGUpIGFuZAorICAgKiAgc3RvcmVzIGl0IGluIEBhIGMuICBPdGhlcndpc2UsIHNldHMgZmFpbGJpdCBpbiB0aGUgaW5wdXQgc3RyZWFtLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQmIF9fYyk7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW4sIHVuc2lnbmVkIGNoYXImIF9fYykKKyAgICB7IHJldHVybiAoX19pbiA+PiByZWludGVycHJldF9jYXN0PGNoYXImPihfX2MpKTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX2luLCBzaWduZWQgY2hhciYgX19jKQorICAgIHsgcmV0dXJuIChfX2luID4+IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciY+KF9fYykpOyB9CisgIC8vQH0KKworICAvL0B7CisgIC8qKgorICAgKiAgQGJyaWVmICBDaGFyYWN0ZXIgc3RyaW5nIGV4dHJhY3RvcnMKKyAgICogIEBwYXJhbSAgaW4gIEFuIGlucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSAgcyAgQSBwb2ludGVyIHRvIGEgY2hhcmFjdGVyIGFycmF5LgorICAgKiAgQHJldHVybiAgaW4KKyAgICoKKyAgICogIEJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGZvcm1hdHRlZCBhcml0aG1ldGljIGV4dHJhY3RvcnMgZGVzY3JpYmVkIGluCisgICAqICBzdGQ6OmJhc2ljX2lzdHJlYW0uICBBZnRlciBjb25zdHJ1Y3RpbmcgYSBzZW50cnkgb2JqZWN0IHdpdGggZ29vZAorICAgKiAgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHVwIHRvIEBjIG4gY2hhcmFjdGVycyBhbmQgc3RvcmVzIHRoZW0KKyAgICogIGludG8gdGhlIGFycmF5IHN0YXJ0aW5nIGF0IEBhIHMuICBAYyBuIGlzIGRlZmluZWQgYXM6CisgICAqCisgICAqICAtIGlmIEBjIHdpZHRoKCkgaXMgZ3JlYXRlciB0aGFuIHplcm8sIEBjIG4gaXMgd2lkdGgoKSBvdGhlcndpc2UKKyAgICogIC0gQGMgbiBpcyA8ZW0+dGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgbGFyZ2VzdCBhcnJheSBvZiAqCisgICAqICAtIEBjIGNoYXJfdHlwZSB0aGF0IGNhbiBzdG9yZSBhIHRlcm1pbmF0aW5nIEBjIGVvcy48L2VtPgorICAgKiAgLSBbMjcuNi4xLjIuM10vNgorICAgKgorICAgKiAgQ2hhcmFjdGVycyBhcmUgZXh0cmFjdGVkIGFuZCBzdG9yZWQgdW50aWwgb25lIG9mIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKKyAgICogIC0gQGMgbi0xIGNoYXJhY3RlcnMgYXJlIHN0b3JlZAorICAgKiAgLSBFT0YgaXMgcmVhY2hlZAorICAgKiAgLSB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlCisgICAqICAtIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG51bGwgYnl0ZSAoaS5lLiwgQGMgY2hhclQoKSApCisgICAqCisgICAqICBAYyB3aWR0aCgwKSBpcyB0aGVuIGNhbGxlZCBmb3IgdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogIElmIG5vIGNoYXJhY3RlcnMgYXJlIGV4dHJhY3RlZCwgc2V0cyBmYWlsYml0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2luLCBfQ2hhclQqIF9fcyk7CisKKyAgLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb24sIGRlZmluZWQgaW4gc3JjL2lzdHJlYW0uY2MuCisgIHRlbXBsYXRlPD4KKyAgICBiYXNpY19pc3RyZWFtPGNoYXI+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyPiYgX19pbiwgY2hhciogX19zKTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19pc3RyZWFtPGNoYXIsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYgX19pbiwgdW5zaWduZWQgY2hhciogX19zKQorICAgIHsgcmV0dXJuIChfX2luID4+IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KF9fcykpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfaXN0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9faW4sIHNpZ25lZCBjaGFyKiBfX3MpCisgICAgeyByZXR1cm4gKF9faW4gPj4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oX19zKSk7IH0KKyAgLy9AfQorCisgIC8vIDI3LjYuMS41IFRlbXBsYXRlIGNsYXNzIGJhc2ljX2lvc3RyZWFtCisgIC8qKgorICAgKiAgQGJyaWVmICBNZXJnaW5nIGlzdHJlYW0gYW5kIG9zdHJlYW0gY2FwYWJpbGl0aWVzLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgbXVsdGlwbHkgaW5oZXJpdHMgZnJvbSB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW0gY2xhc3NlcworICAgKiAgc2ltcGx5IHRvIHByb3ZpZGUgYSBzaW5nbGUgaW50ZXJmYWNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfaW9zdHJlYW0KKyAgICA6IHB1YmxpYyBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4sIAorICAgICAgcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNzEuIGJhc2ljX2lvc3RyZWFtIG1pc3NpbmcgdHlwZWRlZnMKKyAgICAgIC8vIFR5cGVzIChpbmhlcml0ZWQpOgorICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgCQl0cmFpdHNfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIFR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9fb3N0cmVhbV90eXBlOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgQm90aCBvZiB0aGUgcGFyZW50IGNsYXNzZXMgYXJlIGluaXRpYWxpemVkIHdpdGggdGhlIHNhbWUKKyAgICAgICAqICBzdHJlYW1idWYgcG9pbnRlciBwYXNzZWQgdG8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfaW9zdHJlYW0oYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4qIF9fc2IpCisgICAgICA6IF9faXN0cmVhbV90eXBlKF9fc2IpLCBfX29zdHJlYW1fdHlwZShfX3NiKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBEZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIAorICAgICAgfmJhc2ljX2lvc3RyZWFtKCkgeyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBiYXNpY19pb3N0cmVhbSgpCisgICAgICA6IF9faXN0cmVhbV90eXBlKCksIF9fb3N0cmVhbV90eXBlKCkgeyB9CisgICAgfTsKKworICAvLyBbMjcuNi4xLjRdIHN0YW5kYXJkIGJhc2ljX2lzdHJlYW0gbWFuaXB1bGF0b3JzCisgIC8qKgorICAgKiAgQGJyaWVmICBRdWljayBhbmQgZWFzeSB3YXkgdG8gZWF0IHdoaXRlc3BhY2UKKyAgICoKKyAgICogIFRoaXMgbWFuaXB1bGF0b3IgZXh0cmFjdHMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBzdG9wcGluZyB3aGVuIHRoZQorICAgKiAgbmV4dCBjaGFyYWN0ZXIgaXMgbm9uLXdoaXRlc3BhY2UsIG9yIHdoZW4gdGhlIGlucHV0IHNlcXVlbmNlIGlzIGVtcHR5LgorICAgKiAgSWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCBAYyBlb2ZiaXQgaXMgc2V0IGluIHRoZSBzdHJlYW0sIGJ1dCBub3QKKyAgICogIEBjIGZhaWxiaXQuCisgICAqCisgICAqICBUaGUgY3VycmVudCBsb2NhbGUgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCisgICAqCisgICAqICBFeGFtcGxlOgorICAgKiAgQGNvZGUKKyAgICogICAgIE15Q2xhc3MgICBtYzsKKyAgICoKKyAgICogICAgIHN0ZDo6Y2luID4+IHN0ZDo6d3MgPj4gbWM7CisgICAqICBAZW5kY29kZQorICAgKiAgd2lsbCBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBiZWZvcmUgY2FsbGluZyBvcGVyYXRvcj4+IG9uIGNpbiBhbmQgeW91cgorICAgKiAgb2JqZWN0LiAgTm90ZSB0aGF0IHRoZSBzYW1lIGVmZmVjdCBjYW4gYmUgYWNoaWV2ZWQgYnkgY3JlYXRpbmcgYQorICAgKiAgc3RkOjpiYXNpY19pc3RyZWFtOjpzZW50cnkgaW5zaWRlIHlvdXIgZGVmaW5pdGlvbiBvZiBvcGVyYXRvcj4+LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgYmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiAKKyAgICB3cyhiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgLy8gWzI3LjcuMS42XSBSdmFsdWUgc3RyZWFtIGV4dHJhY3Rpb24KKyAgLyoqCisgICAqICBAYnJpZWYgIEdlbmVyaWMgZXh0cmFjdG9yIGZvciBydmFsdWUgc3RyZWFtCisgICAqICBAcGFyYW0gIGlzICBBbiBpbnB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIHggIEEgcmVmZXJlbmNlIHRvIHRoZSBleHRyYWN0aW9uIHRhcmdldC4KKyAgICogIEByZXR1cm4gIGlzCisgICAqCisgICAqICBUaGlzIGlzIGp1c3QgYSBmb3J3YXJkaW5nIGZ1bmN0aW9uIHRvIGFsbG93IGV4dHJhY3Rpb24gZnJvbQorICAgKiAgcnZhbHVlIHN0cmVhbXMgc2luY2UgdGhleSB3b24ndCBiaW5kIHRvIHRoZSBleHRyYWN0b3IgZnVuY3Rpb25zCisgICAqICB0aGF0IHRha2UgYW4gbHZhbHVlIHJlZmVyZW5jZS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYmIF9faXMsIF9UcCYgX194KQorICAgIHsgcmV0dXJuIChfX2lzID4+IF9feCk7IH0KKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNpbmNsdWRlIDxiaXRzL2lzdHJlYW0udGNjPgorCisjZW5kaWYJLyogX0dMSUJDWFhfSVNUUkVBTSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9pdGVyYXRvciBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvaXRlcmF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxNTJiNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvaXRlcmF0b3IKQEAgLTAsMCArMSw3MCBAQAorLy8gPGl0ZXJhdG9yPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvaXRlcmF0b3IKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfSVRFUkFUT1IKKyNkZWZpbmUgX0dMSUJDWFhfSVRFUkFUT1IgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX2Z1bmNzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisjaW5jbHVkZSA8Yml0cy9zdHJlYW1faXRlcmF0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmVhbWJ1Zl9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9JVEVSQVRPUiAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9saW1pdHMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2xpbWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTMxMTk3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9saW1pdHMKQEAgLTAsMCArMSwxNjMyIEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSBudW1lcmljX2xpbWl0cyBjbGFzc2VzLiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsCisvLyAyMDA4LCAyMDA5LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9saW1pdHMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vIE5vdGU6IHRoaXMgaXMgbm90IGEgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbi4KKy8vIFdyaXR0ZW4gYnkgR2FicmllbCBEb3MgUmVpcyA8Z2RyQGNvZGVzb3VyY2VyeS5jb20+CisKKy8vCisvLyBJU08gMTQ4ODI6MTk5OAorLy8gMTguMi4xCisvLworCisjaWZuZGVmIF9HTElCQ1hYX05VTUVSSUNfTElNSVRTCisjZGVmaW5lIF9HTElCQ1hYX05VTUVSSUNfTElNSVRTIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8KKy8vIFRoZSBudW1lcmljX2xpbWl0czw+IHRyYWl0cyBkb2N1bWVudCBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGFzcGVjdHMKKy8vIG9mIGZ1bmRhbWVudGFsIGFyaXRobWV0aWMgZGF0YSB0eXBlcyAoaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50cykuCisvLyBGcm9tIFN0YW5kYXJkIEMrKyBwb2ludCBvZiB2aWV3LCB0aGVyZSBhcmUgMTQgc3VjaCB0eXBlczoKKy8vICAgKiBpbnRlZ2VycworLy8gICAgICAgICBib29sCQkJCQkJCSgxKQorLy8gICAgICAgICBjaGFyLCBzaWduZWQgY2hhciwgdW5zaWduZWQgY2hhciwgd2NoYXJfdCAgICAgICAgICAgICg0KQorLy8gICAgICAgICBzaG9ydCwgdW5zaWduZWQgc2hvcnQJCQkJKDIpCisvLyAgICAgICAgIGludCwgdW5zaWduZWQJCQkJCSgyKQorLy8gICAgICAgICBsb25nLCB1bnNpZ25lZCBsb25nCQkJCQkoMikKKy8vCisvLyAgICogZmxvYXRpbmcgcG9pbnRzCisvLyAgICAgICAgIGZsb2F0CQkJCQkJKDEpCisvLyAgICAgICAgIGRvdWJsZQkJCQkJCSgxKQorLy8gICAgICAgICBsb25nIGRvdWJsZQkJCQkJCSgxKQorLy8KKy8vIEdOVSBDKysgdW5kZXJzdGFuZHMgKHdoZXJlIHN1cHBvcnRlZCBieSB0aGUgaG9zdCBDLWxpYnJhcnkpCisvLyAgICogaW50ZWdlcgorLy8gICAgICAgICBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZwkJCSgyKQorLy8KKy8vIHdoaWNoIGJyaW5ncyB1cyB0byAxNiBmdW5kYW1lbnRhbCBhcml0aG1ldGljIGRhdGEgdHlwZXMgaW4gR05VIEMrKy4KKy8vCisvLworLy8gU2luY2UgYSBudW1lcmljX2xpbWl0czw+IGlzIGEgYml0IHRyaWNreSB0byBnZXQgcmlnaHQsIHdlIHJlbHkgb24KKy8vIGFuIGludGVyZmFjZSBjb21wb3NlZCBvZiBtYWNyb3Mgd2hpY2ggc2hvdWxkIGJlIGRlZmluZWQgaW4gY29uZmlnL29zCisvLyBvciBjb25maWcvY3B1IHdoZW4gdGhleSBkaWZmZXIgZnJvbSB0aGUgZ2VuZXJpYyAocmVhZCBhcmJpdHJhcnkpCisvLyBkZWZpbml0aW9ucyBnaXZlbiBoZXJlLgorLy8KKworLy8gVGhlc2UgdmFsdWVzIGNhbiBiZSBvdmVycmlkZGVuIGluIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbiBmaWxlLgorLy8gVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhcHByb3ByaWF0ZSBmb3IgbWFueSAzMi1iaXQgdGFyZ2V0cy4KKworLy8gR0NDIG9ubHkgaW50cmluc2ljYWxseSBzdXBwb3J0cyBtb2R1bG8gaW50ZWdyYWwgdHlwZXMuICBUaGUgb25seSByZW1haW5pbmcKKy8vIGludGVncmFsIGV4Y2VwdGlvbmFsIHZhbHVlcyBpcyBkaXZpc2lvbiBieSB6ZXJvLiAgT25seSB0YXJnZXRzIHRoYXQgZG8gbm90CisvLyBzaWduYWwgZGl2aXNpb24gYnkgemVybyBpbiBzb21lICJoYXJkIHRvIGlnbm9yZSIgd2F5IHNob3VsZCB1c2UgZmFsc2UuCisjaWZuZGVmIF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwcworIyBkZWZpbmUgX19nbGliY3h4X2ludGVncmFsX3RyYXBzIHRydWUKKyNlbmRpZgorCisvLyBmbG9hdAorLy8KKworLy8gRGVmYXVsdCB2YWx1ZXMuICBTaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBjb25maWd1cmF0aW9uIGZpbGVzIGlmIG5lY2Vzc2FyeS4KKworI2lmbmRlZiBfX2dsaWJjeHhfZmxvYXRfaGFzX2Rlbm9ybV9sb3NzCisjICBkZWZpbmUgX19nbGliY3h4X2Zsb2F0X2hhc19kZW5vcm1fbG9zcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9mbG9hdF90cmFwcworIyAgZGVmaW5lIF9fZ2xpYmN4eF9mbG9hdF90cmFwcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9mbG9hdF90aW55bmVzc19iZWZvcmUKKyMgIGRlZmluZSBfX2dsaWJjeHhfZmxvYXRfdGlueW5lc3NfYmVmb3JlIGZhbHNlCisjZW5kaWYKKworLy8gZG91YmxlCisKKy8vIERlZmF1bHQgdmFsdWVzLiAgU2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlndXJhdGlvbiBmaWxlcyBpZiBuZWNlc3NhcnkuCisKKyNpZm5kZWYgX19nbGliY3h4X2RvdWJsZV9oYXNfZGVub3JtX2xvc3MKKyMgIGRlZmluZSBfX2dsaWJjeHhfZG91YmxlX2hhc19kZW5vcm1fbG9zcyBmYWxzZQorI2VuZGlmCisjaWZuZGVmIF9fZ2xpYmN4eF9kb3VibGVfdHJhcHMKKyMgIGRlZmluZSBfX2dsaWJjeHhfZG91YmxlX3RyYXBzIGZhbHNlCisjZW5kaWYKKyNpZm5kZWYgX19nbGliY3h4X2RvdWJsZV90aW55bmVzc19iZWZvcmUKKyMgIGRlZmluZSBfX2dsaWJjeHhfZG91YmxlX3RpbnluZXNzX2JlZm9yZSBmYWxzZQorI2VuZGlmCisKKy8vIGxvbmcgZG91YmxlCisKKy8vIERlZmF1bHQgdmFsdWVzLiAgU2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gY29uZmlndXJhdGlvbiBmaWxlcyBpZiBuZWNlc3NhcnkuCisKKyNpZm5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX2hhc19kZW5vcm1fbG9zcworIyAgZGVmaW5lIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV9oYXNfZGVub3JtX2xvc3MgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdHJhcHMKKyMgIGRlZmluZSBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdHJhcHMgZmFsc2UKKyNlbmRpZgorI2lmbmRlZiBfX2dsaWJjeHhfbG9uZ19kb3VibGVfdGlueW5lc3NfYmVmb3JlCisjICBkZWZpbmUgX19nbGliY3h4X2xvbmdfZG91YmxlX3RpbnluZXNzX2JlZm9yZSBmYWxzZQorI2VuZGlmCisKKy8vIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gZGVmaW5lIGFueSBtYWNyb3MgYmVsb3cgdGhpcyBwb2ludC4KKworI2RlZmluZSBfX2dsaWJjeHhfc2lnbmVkKFQpCSgoVCkoLTEpIDwgMCkKKworI2RlZmluZSBfX2dsaWJjeHhfbWluKFQpIFwKKyAgKF9fZ2xpYmN4eF9zaWduZWQgKFQpID8gKFQpMSA8PCBfX2dsaWJjeHhfZGlnaXRzIChUKSA6IChUKTApCisKKyNkZWZpbmUgX19nbGliY3h4X21heChUKSBcCisgIChfX2dsaWJjeHhfc2lnbmVkIChUKSA/IFwKKyAgICgoKCgoVCkxIDw8IChfX2dsaWJjeHhfZGlnaXRzIChUKSAtIDEpKSAtIDEpIDw8IDEpICsgMSkgOiB+KFQpMCkKKworI2RlZmluZSBfX2dsaWJjeHhfZGlnaXRzKFQpIFwKKyAgKHNpemVvZihUKSAqIF9fQ0hBUl9CSVRfXyAtIF9fZ2xpYmN4eF9zaWduZWQgKFQpKQorCisvLyBUaGUgZnJhY3Rpb24gNjQzLzIxMzYgYXBwcm94aW1hdGVzIGxvZzEwKDIpIHRvIDcgc2lnbmlmaWNhbnQgZGlnaXRzLgorI2RlZmluZSBfX2dsaWJjeHhfZGlnaXRzMTAoVCkgXAorICAoX19nbGliY3h4X2RpZ2l0cyAoVCkgKiA2NDNMIC8gMjEzNikKKworI2RlZmluZSBfX2dsaWJjeHhfbWF4X2RpZ2l0czEwKFQpIFwKKyAgKDIgKyAoVCkgKiA2NDNMIC8gMjEzNikKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiAgQGJyaWVmIERlc2NyaWJlcyB0aGUgcm91bmRpbmcgc3R5bGUgZm9yIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorICAgKgorICAgKiAgVGhpcyBpcyB1c2VkIGluIHRoZSBzdGQ6Om51bWVyaWNfbGltaXRzIGNsYXNzLgorICAqLworICBlbnVtIGZsb2F0X3JvdW5kX3N0eWxlCisgIHsKKyAgICByb3VuZF9pbmRldGVybWluYXRlICAgICAgID0gLTEsICAgIC8vLyBJbnRlcm1lZGlhdGUuCisgICAgcm91bmRfdG93YXJkX3plcm8gICAgICAgICA9IDAsICAgICAvLy8gVG8gemVyby4KKyAgICByb3VuZF90b19uZWFyZXN0ICAgICAgICAgID0gMSwgICAgIC8vLyBUbyB0aGUgbmVhcmVzdCByZXByZXNlbnRhYmxlIHZhbHVlLgorICAgIHJvdW5kX3Rvd2FyZF9pbmZpbml0eSAgICAgPSAyLCAgICAgLy8vIFRvIGluZmluaXR5LgorICAgIHJvdW5kX3Rvd2FyZF9uZWdfaW5maW5pdHkgPSAzICAgICAgLy8vIFRvIG5lZ2F0aXZlIGluZmluaXR5LgorICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIERlc2NyaWJlcyB0aGUgZGVub3JtYWxpemF0aW9uIGZvciBmbG9hdGluZy1wb2ludCB0eXBlcy4KKyAgICoKKyAgICogIFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSB2YXJpYWJsZSBudW1iZXIKKyAgICogIG9mIGV4cG9uZW50IGJpdHMuICBUaGlzIHR5cGUgaXMgdXNlZCBpbiB0aGUgc3RkOjpudW1lcmljX2xpbWl0cyBjbGFzcy4KKyAgKi8KKyAgZW51bSBmbG9hdF9kZW5vcm1fc3R5bGUKKyAgeworICAgIC8vLyBJbmRldGVybWluYXRlIGF0IGNvbXBpbGUgdGltZSB3aGV0aGVyIGRlbm9ybWFsaXplZCB2YWx1ZXMgYXJlIGFsbG93ZWQuCisgICAgZGVub3JtX2luZGV0ZXJtaW5hdGUgPSAtMSwKKyAgICAvLy8gVGhlIHR5cGUgZG9lcyBub3QgYWxsb3cgZGVub3JtYWxpemVkIHZhbHVlcy4KKyAgICBkZW5vcm1fYWJzZW50ICAgICAgICA9IDAsCisgICAgLy8vIFRoZSB0eXBlIGFsbG93cyBkZW5vcm1hbGl6ZWQgdmFsdWVzLgorICAgIGRlbm9ybV9wcmVzZW50ICAgICAgID0gMQorICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFBhcnQgb2Ygc3RkOjpudW1lcmljX2xpbWl0cy4KKyAgICoKKyAgICogIFRoZSBAYyBzdGF0aWMgQGMgY29uc3QgbWVtYmVycyBhcmUgdXNhYmxlIGFzIGludGVncmFsIGNvbnN0YW50CisgICAqICBleHByZXNzaW9ucy4KKyAgICoKKyAgICogIEBub3RlIFRoaXMgaXMgYSBzZXBhcmF0ZSBjbGFzcyBmb3IgcHVycG9zZXMgb2YgZWZmaWNpZW5jeTsgeW91CisgICAqICAgICAgICBzaG91bGQgb25seSBhY2Nlc3MgdGhlc2UgbWVtYmVycyBhcyBwYXJ0IG9mIGFuIGluc3RhbnRpYXRpb24KKyAgICogICAgICAgIG9mIHRoZSBzdGQ6Om51bWVyaWNfbGltaXRzIGNsYXNzLgorICAqLworICBzdHJ1Y3QgX19udW1lcmljX2xpbWl0c19iYXNlCisgIHsKKyAgICAvKiogVGhpcyB3aWxsIGJlIHRydWUgZm9yIGFsbCBmdW5kYW1lbnRhbCB0eXBlcyAod2hpY2ggaGF2ZQorCXNwZWNpYWxpemF0aW9ucyksIGFuZCBmYWxzZSBmb3IgZXZlcnl0aGluZyBlbHNlLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gZmFsc2U7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiBAYyByYWRpeCBkaWdpdHMgdGhhdCBiZSByZXByZXNlbnRlZCB3aXRob3V0IGNoYW5nZTogIGZvcgorCWludGVnZXIgdHlwZXMsIHRoZSBudW1iZXIgb2Ygbm9uLXNpZ24gYml0cyBpbiB0aGUgbWFudGlzc2E7IGZvcgorCWZsb2F0aW5nIHR5cGVzLCB0aGUgbnVtYmVyIG9mIEBjIHJhZGl4IGRpZ2l0cyBpbiB0aGUgbWFudGlzc2EuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSAwOworCisgICAgLyoqIFRoZSBudW1iZXIgb2YgYmFzZSAxMCBkaWdpdHMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aG91dCBjaGFuZ2UuICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gMDsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgLyoqIFRoZSBudW1iZXIgb2YgYmFzZSAxMCBkaWdpdHMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdmFsdWVzIHdoaWNoCisJZGlmZmVyIGFyZSBhbHdheXMgZGlmZmVyZW50aWF0ZWQuICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKworICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlIGlzIHNpZ25lZC4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKworICAgIC8qKiBUcnVlIGlmIHRoZSB0eXBlIGlzIGludGVnZXIuCisgICAgICogIElzIHRoaXMgc3VwcG9zZWQgdG8gYmUgPGVtPmlmIHRoZSB0eXBlIGlzIGludGVncmFsPzwvZW0+ICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgdXNlcyBhbiBleGFjdCByZXByZXNlbnRhdGlvbi4gPGVtPkFsbCBpbnRlZ2VyIHR5cGVzIGFyZQorCWV4YWN0LCBidXQgbm90IGFsbCBleGFjdCB0eXBlcyBhcmUgaW50ZWdlci4gIEZvciBleGFtcGxlLCByYXRpb25hbCBhbmQKKwlmaXhlZC1leHBvbmVudCByZXByZXNlbnRhdGlvbnMgYXJlIGV4YWN0IGJ1dCBub3QgaW50ZWdlci48L2VtPgorCVsxOC4yLjEuMl0vMTUgICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IGZhbHNlOworCisgICAgLyoqIEZvciBpbnRlZ2VyIHR5cGVzLCBzcGVjaWZpZXMgdGhlIGJhc2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uLiAgRm9yCisJZmxvYXRpbmcgdHlwZXMsIHNwZWNpZmllcyB0aGUgYmFzZSBvZiB0aGUgZXhwb25lbnQgcmVwcmVzZW50YXRpb24uICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDA7CisKKyAgICAvKiogVGhlIG1pbmltdW0gbmVnYXRpdmUgaW50ZWdlciBzdWNoIHRoYXQgQGMgcmFkaXggcmFpc2VkIHRvIHRoZSBwb3dlciBvZgorCShvbmUgbGVzcyB0aGFuIHRoYXQgaW50ZWdlcikgaXMgYSBub3JtYWxpemVkIGZsb2F0aW5nIHBvaW50IG51bWJlci4gICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisKKyAgICAvKiogVGhlIG1pbmltdW0gbmVnYXRpdmUgaW50ZWdlciBzdWNoIHRoYXQgMTAgcmFpc2VkIHRvIHRoYXQgcG93ZXIgaXMgaW4KKwl0aGUgcmFuZ2Ugb2Ygbm9ybWFsaXplZCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworCisgICAgLyoqIFRoZSBtYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc3VjaCB0aGF0IEBjIHJhZGl4IHJhaXNlZCB0byB0aGUgcG93ZXIgb2YKKwkob25lIGxlc3MgdGhhbiB0aGF0IGludGVnZXIpIGlzIGEgcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXRpbmcgcG9pbnQKKwludW1iZXIuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworCisgICAgLyoqIFRoZSBtYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc3VjaCB0aGF0IDEwIHJhaXNlZCB0byB0aGF0IHBvd2VyIGlzIGluCisJdGhlIHJhbmdlIG9mIHJlcHJlc2VudGFibGUgZmluaXRlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAvKiogVHJ1ZSBpZiB0aGUgdHlwZSBoYXMgYSByZXByZXNlbnRhdGlvbiBmb3IgcG9zaXRpdmUgaW5maW5pdHkuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0aGUgdHlwZSBoYXMgYSByZXByZXNlbnRhdGlvbiBmb3IgYSBxdWlldCAobm9uLXNpZ25hbGluZykKKwk8ZW0+Tm90IGEgTnVtYmVyPC9lbT4uICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaGFzIGEgcmVwcmVzZW50YXRpb24gZm9yIGEgc2lnbmFsaW5nCisJPGVtPk5vdCBhIE51bWJlcjwvZW0+LiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisKKyAgICAvKiogU2VlIHN0ZDo6ZmxvYXRfZGVub3JtX3N0eWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSA9IGRlbm9ybV9hYnNlbnQ7CisKKyAgICAvKiogPGVtPlRydWUgaWYgbG9zcyBvZiBhY2N1cmFjeSBpcyBkZXRlY3RlZCBhcyBhIGRlbm9ybWFsaXphdGlvbiBsb3NzLAorCXJhdGhlciB0aGFuIGFzIGFuIGluZXhhY3QgcmVzdWx0LjwvZW0+IFsxOC4yLjEuMl0vNDIgICovCisgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgIC8qKiBUcnVlIGlmLWFuZC1vbmx5LWlmIHRoZSB0eXBlIGFkaGVyZXMgdG8gdGhlIElFQyA1NTkgc3RhbmRhcmQsIGFsc28KKwlrbm93biBhcyBJRUVFIDc1NC4gIChPbmx5IG1ha2VzIHNlbnNlIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcy4pICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisKKyAgICAvKiogPGVtPlRydWUgaWYgdGhlIHNldCBvZiB2YWx1ZXMgcmVwcmVzZW50YWJsZSBieSB0aGUgdHlwZSBpcworCWZpbml0ZS4gIEFsbCBidWlsdC1pbiB0eXBlcyBhcmUgYm91bmRlZCwgdGhpcyBtZW1iZXIgd291bGQgYmUKKwlmYWxzZSBmb3IgYXJiaXRyYXJ5IHByZWNpc2lvbiB0eXBlcy48L2VtPiBbMTguMi4xLjJdLzU0ICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IGZhbHNlOworCisgICAgLyoqIFRydWUgaWYgdGhlIHR5cGUgaXMgQGUgbW9kdWxvLCB0aGF0IGlzLCBpZiBpdCBpcyBwb3NzaWJsZSB0byBhZGQgdHdvCisJcG9zaXRpdmUgbnVtYmVycyBhbmQgaGF2ZSBhIHJlc3VsdCB0aGF0IHdyYXBzIGFyb3VuZCB0byBhIHRoaXJkIG51bWJlcgorCXRoYXQgaXMgbGVzcy4gIFR5cGljYWxseSBmYWxzZSBmb3IgZmxvYXRpbmcgdHlwZXMsIHRydWUgZm9yIHVuc2lnbmVkCisJaW50ZWdlcnMsIGFuZCB0cnVlIGZvciBzaWduZWQgaW50ZWdlcnMuICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0cmFwcGluZyBpcyBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0eXBlLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gZmFsc2U7CisKKyAgICAvKiogVHJ1ZSBpZiB0aW5pbmVzcyBpcyBkZXRlY3RlZCBiZWZvcmUgcm91bmRpbmcuICAoc2VlIElFQyA1NTkpICAqLworICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisKKyAgICAvKiogU2VlIHN0ZDo6ZmxvYXRfcm91bmRfc3R5bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBUaGlzIGlzIG9ubHkKKwltZWFuaW5nZnVsIGZvciBmbG9hdGluZyB0eXBlczsgaW50ZWdlciB0eXBlcyB3aWxsIGFsbCBiZQorCXJvdW5kX3Rvd2FyZF96ZXJvLiAgKi8KKyAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IAorCQkJCQkJICAgIHJvdW5kX3Rvd2FyZF96ZXJvOworICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFByb3BlcnRpZXMgb2YgZnVuZGFtZW50YWwgdHlwZXMuCisgICAqCisgICAqICBUaGlzIGNsYXNzIGFsbG93cyBhIHByb2dyYW0gdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgKiAgcmVwcmVzZW50YXRpb24gb2YgYSBmdW5kYW1lbnRhbCB0eXBlIG9uIGEgZ2l2ZW4gcGxhdGZvcm0uICBGb3IKKyAgICogIG5vbi1mdW5kYW1lbnRhbCB0eXBlcywgdGhlIGZ1bmN0aW9ucyB3aWxsIHJldHVybiAwIGFuZCB0aGUgZGF0YQorICAgKiAgbWVtYmVycyB3aWxsIGFsbCBiZSBAYyBmYWxzZS4KKyAgICoKKyAgICogIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFM6ICBEUnMgMjAxIGFuZCAxODQgKGhpIEdhYnkhKSBhcmUKKyAgICogIG5vdGVkLCBidXQgbm90IGluY29ycG9yYXRlZCBpbiB0aGlzIGRvY3VtZW50ZWQgKHlldCkuCisgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHMgOiBwdWJsaWMgX19udW1lcmljX2xpbWl0c19iYXNlCisgICAgeworICAgICAgLyoqIFRoZSBtaW5pbXVtIGZpbml0ZSB2YWx1ZSwgb3IgZm9yIGZsb2F0aW5nIHR5cGVzIHdpdGgKKwkgIGRlbm9ybWFsaXphdGlvbiwgdGhlIG1pbmltdW0gcG9zaXRpdmUgbm9ybWFsaXplZCB2YWx1ZS4gICovCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIF9UcAorICAgICAgbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDApOyB9CisKKyAgICAgIC8qKiBUaGUgbWF4aW11bSBmaW5pdGUgdmFsdWUuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKiBBIGZpbml0ZSB2YWx1ZSB4IHN1Y2ggdGhhdCB0aGVyZSBpcyBubyBvdGhlciBmaW5pdGUgdmFsdWUgeQorICAgICAgICogIHdoZXJlIHkgPCB4LiAgKi8KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwCisgICAgICBsb3dlc3QoKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0KKyNlbmRpZgorCisgICAgICAvKiogVGhlIEBlIG1hY2hpbmUgQGUgZXBzaWxvbjogIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMSBhbmQgdGhlIGxlYXN0CisJICB2YWx1ZSBncmVhdGVyIHRoYW4gMSB0aGF0IGlzIHJlcHJlc2VudGFibGUuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIGVwc2lsb24oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0KKworICAgICAgLyoqIFRoZSBtYXhpbXVtIHJvdW5kaW5nIGVycm9yIG1lYXN1cmVtZW50IChzZWUgTElBLTEpLiAgKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICByb3VuZF9lcnJvcigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwKTsgfQorCisgICAgICAvKiogVGhlIHJlcHJlc2VudGF0aW9uIG9mIHBvc2l0aXZlIGluZmluaXR5LCBpZiBAYyBoYXNfaW5maW5pdHkuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIGluZmluaXR5KCkgdGhyb3coKSAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwKTsgfQorCisgICAgICAvKiogVGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgcXVpZXQgPGVtPk5vdCBhIE51bWJlcjwvZW0+LAorCSAgaWYgQGMgaGFzX3F1aWV0X05hTi4gKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0KKworICAgICAgLyoqIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25hbGluZyA8ZW0+Tm90IGEgTnVtYmVyPC9lbT4sIGlmCisJICBAYyBoYXNfc2lnbmFsaW5nX05hTi4gKi8KKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgX1RwCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDApOyB9CisKKyAgICAgIC8qKiBUaGUgbWluaW11bSBwb3NpdGl2ZSBkZW5vcm1hbGl6ZWQgdmFsdWUuICBGb3IgdHlwZXMgd2hlcmUKKwkgIEBjIGhhc19kZW5vcm0gaXMgZmFsc2UsIHRoaXMgaXMgdGhlIG1pbmltdW0gcG9zaXRpdmUgbm9ybWFsaXplZAorCSAgdmFsdWUuICAqLworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBfVHAKKyAgICAgIGRlbm9ybV9taW4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMCk7IH0KKyAgICB9OworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxjb25zdCBfVHA+CisgICAgOiBwdWJsaWMgbnVtZXJpY19saW1pdHM8X1RwPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx2b2xhdGlsZSBfVHA+CisgICAgOiBwdWJsaWMgbnVtZXJpY19saW1pdHM8X1RwPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxjb25zdCB2b2xhdGlsZSBfVHA+CisgICAgOiBwdWJsaWMgbnVtZXJpY19saW1pdHM8X1RwPiB7IH07CisjZW5kaWYKKworICAvLyBOb3cgdGhlcmUgZm9sbG93IDE2IGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucy4gIFllcywgMTYuICBNYWtlIHN1cmUKKyAgLy8geW91IGdldCB0aGUgY291bnQgcmlnaHQuICgxOCBpbiBjKysweCBtb2RlKQorCisgIC8vLyBudW1lcmljX2xpbWl0czxib29sPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxib29sPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGJvb2wgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbCAKKyAgICAgIG1heCgpIHRocm93KCkgIHsgcmV0dXJuIHRydWU7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IDE7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSAwOworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgYm9vbCAKKyAgICAgIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBib29sIAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICAvLyBJdCBpcyBub3QgY2xlYXIgd2hhdCBpdCBtZWFucyBmb3IgYSBib29sZWFuIHR5cGUgdG8gdHJhcC4KKyAgICAgIC8vIFRoaXMgaXMgYSBEUiBvbiB0aGUgTFdHIGlzc3VlIGxpc3QuICBIZXJlLCBJIHVzZSBpbnRlZ2VyCisgICAgICAvLyBwcm9tb3Rpb24gc2VtYW50aWNzLgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGNoYXI+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGNoYXI+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhciAKKyAgICAgIG1pbigpIHRocm93KCkgeyByZXR1cm4gX19nbGliY3h4X21pbihjaGFyKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBtYXgoKSB0aHJvdygpIHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXgoY2hhcik7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgCisgICAgICBsb3dlc3QoKSB0aHJvdygpIHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fZ2xpYmN4eF9kaWdpdHMgKGNoYXIpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChjaGFyKTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBfX2dsaWJjeHhfc2lnbmVkIChjaGFyKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhciAKKyAgICAgIGVwc2lsb24oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIAorICAgICAgY2hhciBpbmZpbml0eSgpIHRocm93KCkgIHsgcmV0dXJuIGNoYXIoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIGNoYXIoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBjaGFyKCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyIAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czxzaWduZWQgY2hhcj4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8c2lnbmVkIGNoYXI+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIC1fX1NDSEFSX01BWF9fIC0gMTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX1NDSEFSX01BWF9fOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaWduZWQgY2hhciAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzID0gX19nbGliY3h4X2RpZ2l0cyAoc2lnbmVkIGNoYXIpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwIChzaWduZWQgY2hhcik7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBlcHNpbG9uKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICByb3VuZF9lcnJvcigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBpbmZpbml0eSgpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHNpZ25lZCBjaGFyPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNpZ25lZCBjaGFyIAorICAgICAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2lnbmVkIGNoYXIgCisgICAgICBkZW5vcm1fbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxzaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBjaGFyPiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBjaGFyPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX1NDSEFSX01BWF9fICogMlUgKyAxOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBjaGFyIAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzICh1bnNpZ25lZCBjaGFyKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAodW5zaWduZWQgY2hhcik7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGNoYXIgCisgICAgICBlcHNpbG9uKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgY2hhciAKKyAgICAgIHJvdW5kX2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgY2hhciAKKyAgICAgIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBjaGFyIAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx3Y2hhcl90PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czx3Y2hhcl90PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIF9fZ2xpYmN4eF9taW4gKHdjaGFyX3QpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIG1heCgpIHRocm93KCkgIHsgcmV0dXJuIF9fZ2xpYmN4eF9tYXggKHdjaGFyX3QpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciB3Y2hhcl90IAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzICh3Y2hhcl90KTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAod2NoYXJfdCk7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gX19nbGliY3h4X3NpZ25lZCAod2NoYXJfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBlcHNpbG9uKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgd2NoYXJfdCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIHdjaGFyX3QoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHdjaGFyX3QoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHdjaGFyX3QgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiB3Y2hhcl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB3Y2hhcl90IAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gd2NoYXJfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vLyBudW1lcmljX2xpbWl0czxjaGFyMTZfdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8Y2hhcjE2X3Q+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhcjE2X3QgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIF9fZ2xpYmN4eF9taW4gKGNoYXIxNl90KTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIxNl90IAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX2dsaWJjeHhfbWF4IChjaGFyMTZfdCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIxNl90IAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzIChjaGFyMTZfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGNoYXIxNl90KTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgCisgICAgICAgPSBfX2dsaWJjeHhfc2lnbmVkIChjaGFyMTZfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIxNl90IAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIxNl90IAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIxNl90IAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpICB7IHJldHVybiBjaGFyMTZfdCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhcjE2X3QgCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIGNoYXIxNl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyMTZfdCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSB0aHJvdygpIHsgcmV0dXJuIGNoYXIxNl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyMTZfdCAKKyAgICAgIGRlbm9ybV9taW4oKSB0aHJvdygpIHsgcmV0dXJuIGNoYXIxNl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czxjaGFyMzJfdD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8Y2hhcjMyX3Q+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgY2hhcjMyX3QgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIF9fZ2xpYmN4eF9taW4gKGNoYXIzMl90KTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIzMl90IAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX2dsaWJjeHhfbWF4IChjaGFyMzJfdCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIzMl90IAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChjaGFyMzJfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgCisgICAgICAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKGNoYXIzMl90KTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgCisgICAgICAgPSBfX2dsaWJjeHhfc2lnbmVkIChjaGFyMzJfdCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIzMl90IAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIzMl90IAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIzMl90IAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIGNoYXIzMl90KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBjaGFyMzJfdCAKKyAgICAgIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gY2hhcjMyX3QoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIzMl90IAorICAgICAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyByZXR1cm4gY2hhcjMyX3QoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGNoYXIzMl90IAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gY2hhcjMyX3QoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisjZW5kaWYKKworICAvLy8gbnVtZXJpY19saW1pdHM8c2hvcnQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHNob3J0PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgbWluKCkgdGhyb3coKSB7IHJldHVybiAtX19TSFJUX01BWF9fIC0gMTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHNob3J0IAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX1NIUlRfTUFYX187IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIHNob3J0IAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChzaG9ydCk7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSBfX2dsaWJjeHhfZGlnaXRzMTAgKHNob3J0KTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIGVwc2lsb24oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIGluZmluaXR5KCkgdGhyb3coKSB7IHJldHVybiBzaG9ydCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgc2hvcnQgCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHNob3J0KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHNob3J0KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBzaG9ydCAKKyAgICAgIGRlbm9ybV9taW4oKSB0aHJvdygpIHsgcmV0dXJuIHNob3J0KCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBzaG9ydD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgc2hvcnQ+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgc2hvcnQgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gX19TSFJUX01BWF9fICogMlUgKyAxOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgc2hvcnQpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBzaG9ydCk7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBzaG9ydCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIHNob3J0IAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8aW50PiBzcGVjaWFsaXphdGlvbi4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBudW1lcmljX2xpbWl0czxpbnQ+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgbWluKCkgdGhyb3coKSB7IHJldHVybiAtX19JTlRfTUFYX18gLSAxOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX0lOVF9NQVhfXzsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChpbnQpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19nbGliY3h4X2RpZ2l0czEwIChpbnQpOworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGludCBtYXhfZGlnaXRzMTAgPSAwOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSAyOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGludCAKKyAgICAgIGVwc2lsb24oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQgCisgICAgICByb3VuZF9lcnJvcigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQxMCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQxMCA9IDA7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2luZmluaXR5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19xdWlldF9OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3NpZ25hbGluZ19OYU4gPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtIAorICAgICAgID0gZGVub3JtX2Fic2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX2Rlbm9ybV9sb3NzID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQgCisgICAgICBxdWlldF9OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBpbnQgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgaW50IAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIG1pbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gX19JTlRfTUFYX18gKiAyVSArIDE7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgaW50KTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAodW5zaWduZWQgaW50KTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgaW50IAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBpbnQgCisgICAgICBpbmZpbml0eSgpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGludCAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBpbnQgCisgICAgICBkZW5vcm1fbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8bG9uZz4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8bG9uZz4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIC1fX0xPTkdfTUFYX18gLSAxOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gX19MT05HX01BWF9fOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBsb25nIAorICAgICAgbG93ZXN0KCkgdGhyb3coKSB7IHJldHVybiBtaW4oKTsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX2dsaWJjeHhfZGlnaXRzIChsb25nKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAobG9uZyk7CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMCA9IDA7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyAKKyAgICAgIGVwc2lsb24oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgCisgICAgICBpbmZpbml0eSgpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgCisgICAgICBkZW5vcm1fbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmc+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmc+CisgICAgeworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zcGVjaWFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyAKKyAgICAgIG1pbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBtYXgoKSB0aHJvdygpIHsgcmV0dXJuIF9fTE9OR19NQVhfXyAqIDJVTCArIDE7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgCisgICAgICBsb3dlc3QoKSB0aHJvdygpIHsgcmV0dXJuIG1pbigpOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMgKHVuc2lnbmVkIGxvbmcpOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0czEwICh1bnNpZ25lZCBsb25nKTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyAKKyAgICAgIGVwc2lsb24oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBpbmZpbml0eSgpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgCisgICAgICBkZW5vcm1fbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0cmFwcyA9IF9fZ2xpYmN4eF9pbnRlZ3JhbF90cmFwczsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdGlueW5lc3NfYmVmb3JlID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSAKKyAgICAgICA9IHJvdW5kX3Rvd2FyZF96ZXJvOworICAgIH07CisKKyAgLy8vIG51bWVyaWNfbGltaXRzPGxvbmcgbG9uZz4gc3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbnVtZXJpY19saW1pdHM8bG9uZyBsb25nPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIG1pbigpIHRocm93KCkgeyByZXR1cm4gLV9fTE9OR19MT05HX01BWF9fIC0gMTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gX19MT05HX0xPTkdfTUFYX187IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGxvbmcgbG9uZyAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAobG9uZyBsb25nKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAobG9uZyBsb25nKTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gMjsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGxvbmcgCisgICAgICBlcHNpbG9uKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IDA7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSAwOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybSAKKyAgICAgICA9IGRlbm9ybV9hYnNlbnQ7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19kZW5vcm1fbG9zcyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIGluZmluaXR5KCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBsb25nIAorICAgICAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgbG9uZyAKKyAgICAgIGRlbm9ybV9taW4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pZWM1NTkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IHRydWU7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfaW50ZWdyYWxfdHJhcHM7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRpbnluZXNzX2JlZm9yZSA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b3dhcmRfemVybzsKKyAgICB9OworCisgIC8vLyBudW1lcmljX2xpbWl0czx1bnNpZ25lZCBsb25nIGxvbmc+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGxvbmcgbG9uZz4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBtaW4oKSB0aHJvdygpIHsgcmV0dXJuIDA7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBtYXgoKSB0aHJvdygpIHsgcmV0dXJuIF9fTE9OR19MT05HX01BWF9fICogMlVMTCArIDE7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gbWluKCk7IH0KKyNlbmRpZgorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzIAorICAgICAgID0gX19nbGliY3h4X2RpZ2l0cyAodW5zaWduZWQgbG9uZyBsb25nKTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCAKKyAgICAgICA9IF9fZ2xpYmN4eF9kaWdpdHMxMCAodW5zaWduZWQgbG9uZyBsb25nKTsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwID0gMDsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IDI7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgdW5zaWduZWQgbG9uZyBsb25nIAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gMDsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIHJvdW5kX2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiAwOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudDEwID0gMDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtYXhfZXhwb25lbnQgPSAwOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gMDsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfaW5maW5pdHkgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfZGVub3JtX3N0eWxlIGhhc19kZW5vcm0gCisgICAgICAgPSBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgPSBmYWxzZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBpbmZpbml0eSgpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPigwKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIHVuc2lnbmVkIGxvbmcgbG9uZyAKKyAgICAgIHNpZ25hbGluZ19OYU4oKSB0aHJvdygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oMCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiB1bnNpZ25lZCBsb25nIGxvbmcgCisgICAgICBkZW5vcm1fbWluKCkgdGhyb3coKSB7IHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KDApOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2JvdW5kZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19tb2R1bG8gPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2ludGVncmFsX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG93YXJkX3plcm87CisgICAgfTsKKworICAvLy8gbnVtZXJpY19saW1pdHM8ZmxvYXQ+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGZsb2F0PgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgbWluKCkgdGhyb3coKSB7IHJldHVybiBfX0ZMVF9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgbWF4KCkgdGhyb3coKSB7IHJldHVybiBfX0ZMVF9NQVhfXzsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgCisgICAgICBsb3dlc3QoKSB0aHJvdygpIHsgcmV0dXJuIC1fX0ZMVF9NQVhfXzsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX0ZMVF9NQU5UX0RJR19fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0czEwID0gX19GTFRfRElHX187CisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1heF9kaWdpdHMxMAorCSA9IF9fZ2xpYmN4eF9tYXhfZGlnaXRzMTAgKF9fRkxUX01BTlRfRElHX18pOworI2VuZGlmCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NpZ25lZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2ludGVnZXIgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfZXhhY3QgPSBmYWxzZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCByYWRpeCA9IF9fRkxUX1JBRElYX187CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZmxvYXQgCisgICAgICBlcHNpbG9uKCkgdGhyb3coKSB7IHJldHVybiBfX0ZMVF9FUFNJTE9OX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIHJvdW5kX2Vycm9yKCkgdGhyb3coKSB7IHJldHVybiAwLjVGOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSBfX0ZMVF9NSU5fRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSBfX0ZMVF9NSU5fMTBfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gX19GTFRfTUFYX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gX19GTFRfTUFYXzEwX0VYUF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IF9fRkxUX0hBU19JTkZJTklUWV9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gX19GTFRfSEFTX1FVSUVUX05BTl9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGhhc19xdWlldF9OYU47CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybQorCT0gYm9vbChfX0ZMVF9IQVNfREVOT1JNX18pID8gZGVub3JtX3ByZXNlbnQgOiBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgCisgICAgICAgPSBfX2dsaWJjeHhfZmxvYXRfaGFzX2Rlbm9ybV9sb3NzOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIF9fYnVpbHRpbl9odWdlX3ZhbGYgKCk7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIHF1aWV0X05hTigpIHRocm93KCkgeyByZXR1cm4gX19idWlsdGluX25hbmYgKCIiKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGZsb2F0IAorICAgICAgc2lnbmFsaW5nX05hTigpIHRocm93KCkgeyByZXR1cm4gX19idWlsdGluX25hbnNmICgiIik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBmbG9hdCAKKyAgICAgIGRlbm9ybV9taW4oKSB0aHJvdygpIHsgcmV0dXJuIF9fRkxUX0RFTk9STV9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OQorCT0gaGFzX2luZmluaXR5ICYmIGhhc19xdWlldF9OYU4gJiYgaGFzX2Rlbm9ybSA9PSBkZW5vcm1fcHJlc2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2Zsb2F0X3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgCisgICAgICAgPSBfX2dsaWJjeHhfZmxvYXRfdGlueW5lc3NfYmVmb3JlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgZmxvYXRfcm91bmRfc3R5bGUgcm91bmRfc3R5bGUgCisgICAgICAgPSByb3VuZF90b19uZWFyZXN0OworICAgIH07CisKKyN1bmRlZiBfX2dsaWJjeHhfZmxvYXRfaGFzX2Rlbm9ybV9sb3NzCisjdW5kZWYgX19nbGliY3h4X2Zsb2F0X3RyYXBzCisjdW5kZWYgX19nbGliY3h4X2Zsb2F0X3RpbnluZXNzX2JlZm9yZQorCisgIC8vLyBudW1lcmljX2xpbWl0czxkb3VibGU+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGRvdWJsZT4KKyAgICB7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX3NwZWNpYWxpemVkID0gdHJ1ZTsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICBtaW4oKSB0aHJvdygpICB7IHJldHVybiBfX0RCTF9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGRvdWJsZSAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gX19EQkxfTUFYX187IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gLV9fREJMX01BWF9fOyB9CisjZW5kaWYKKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IGRpZ2l0cyA9IF9fREJMX01BTlRfRElHX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgZGlnaXRzMTAgPSBfX0RCTF9ESUdfXzsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgbWF4X2RpZ2l0czEwCisJID0gX19nbGliY3h4X21heF9kaWdpdHMxMCAoX19EQkxfTUFOVF9ESUdfXyk7CisjZW5kaWYKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc2lnbmVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaW50ZWdlciA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19leGFjdCA9IGZhbHNlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IHJhZGl4ID0gX19GTFRfUkFESVhfXzsKKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICBlcHNpbG9uKCkgdGhyb3coKSB7IHJldHVybiBfX0RCTF9FUFNJTE9OX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICByb3VuZF9lcnJvcigpIHRocm93KCkgeyByZXR1cm4gMC41OyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBtaW5fZXhwb25lbnQgPSBfX0RCTF9NSU5fRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSBfX0RCTF9NSU5fMTBfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50ID0gX19EQkxfTUFYX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudDEwID0gX19EQkxfTUFYXzEwX0VYUF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IF9fREJMX0hBU19JTkZJTklUWV9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfcXVpZXRfTmFOID0gX19EQkxfSEFTX1FVSUVUX05BTl9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfc2lnbmFsaW5nX05hTiA9IGhhc19xdWlldF9OYU47CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9kZW5vcm1fc3R5bGUgaGFzX2Rlbm9ybQorCT0gYm9vbChfX0RCTF9IQVNfREVOT1JNX18pID8gZGVub3JtX3ByZXNlbnQgOiBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MgCisgICAgICAgID0gX19nbGliY3h4X2RvdWJsZV9oYXNfZGVub3JtX2xvc3M7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgaW5maW5pdHkoKSB0aHJvdygpIHsgcmV0dXJuIF9fYnVpbHRpbl9odWdlX3ZhbCgpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBfX2J1aWx0aW5fbmFuICgiIik7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBkb3VibGUgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBfX2J1aWx0aW5fbmFucyAoIiIpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgZG91YmxlIAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gX19EQkxfREVOT1JNX01JTl9fOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfaWVjNTU5CisJPSBoYXNfaW5maW5pdHkgJiYgaGFzX3F1aWV0X05hTiAmJiBoYXNfZGVub3JtID09IGRlbm9ybV9wcmVzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19ib3VuZGVkID0gdHJ1ZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfbW9kdWxvID0gZmFsc2U7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgdHJhcHMgPSBfX2dsaWJjeHhfZG91YmxlX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgCisgICAgICAgPSBfX2dsaWJjeHhfZG91YmxlX3RpbnluZXNzX2JlZm9yZTsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X3JvdW5kX3N0eWxlIHJvdW5kX3N0eWxlIAorICAgICAgID0gcm91bmRfdG9fbmVhcmVzdDsKKyAgICB9OworCisjdW5kZWYgX19nbGliY3h4X2RvdWJsZV9oYXNfZGVub3JtX2xvc3MKKyN1bmRlZiBfX2dsaWJjeHhfZG91YmxlX3RyYXBzCisjdW5kZWYgX19nbGliY3h4X2RvdWJsZV90aW55bmVzc19iZWZvcmUKKworICAvLy8gbnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+IHNwZWNpYWxpemF0aW9uLgorICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IG51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPgorICAgIHsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfc3BlY2lhbGl6ZWQgPSB0cnVlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgbWluKCkgdGhyb3coKSB7IHJldHVybiBfX0xEQkxfTUlOX187IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX0NPTlNURVhQUiBsb25nIGRvdWJsZSAKKyAgICAgIG1heCgpIHRocm93KCkgeyByZXR1cm4gX19MREJMX01BWF9fOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIGNvbnN0ZXhwciBsb25nIGRvdWJsZSAKKyAgICAgIGxvd2VzdCgpIHRocm93KCkgeyByZXR1cm4gLV9fTERCTF9NQVhfXzsgfQorI2VuZGlmCisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMgPSBfX0xEQkxfTUFOVF9ESUdfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGludCBkaWdpdHMxMCA9IF9fTERCTF9ESUdfXzsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9kaWdpdHMxMAorCSA9IF9fZ2xpYmN4eF9tYXhfZGlnaXRzMTAgKF9fTERCTF9NQU5UX0RJR19fKTsKKyNlbmRpZgorICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19zaWduZWQgPSB0cnVlOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBpc19pbnRlZ2VyID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2V4YWN0ID0gZmFsc2U7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgcmFkaXggPSBfX0ZMVF9SQURJWF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gX19MREJMX0VQU0lMT05fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgcm91bmRfZXJyb3IoKSB0aHJvdygpIHsgcmV0dXJuIDAuNUw7IH0KKworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1pbl9leHBvbmVudCA9IF9fTERCTF9NSU5fRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWluX2V4cG9uZW50MTAgPSBfX0xEQkxfTUlOXzEwX0VYUF9fOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgaW50IG1heF9leHBvbmVudCA9IF9fTERCTF9NQVhfRVhQX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBpbnQgbWF4X2V4cG9uZW50MTAgPSBfX0xEQkxfTUFYXzEwX0VYUF9fOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19pbmZpbml0eSA9IF9fTERCTF9IQVNfSU5GSU5JVFlfXzsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaGFzX3F1aWV0X05hTiA9IF9fTERCTF9IQVNfUVVJRVRfTkFOX187CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGhhc19zaWduYWxpbmdfTmFOID0gaGFzX3F1aWV0X05hTjsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGZsb2F0X2Rlbm9ybV9zdHlsZSBoYXNfZGVub3JtCisJPSBib29sKF9fTERCTF9IQVNfREVOT1JNX18pID8gZGVub3JtX3ByZXNlbnQgOiBkZW5vcm1fYWJzZW50OworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCBoYXNfZGVub3JtX2xvc3MKKwk9IF9fZ2xpYmN4eF9sb25nX2RvdWJsZV9oYXNfZGVub3JtX2xvc3M7CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBpbmZpbml0eSgpIHRocm93KCkgeyByZXR1cm4gX19idWlsdGluX2h1Z2VfdmFsbCAoKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBfX2J1aWx0aW5fbmFubCAoIiIpOyB9CisKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9DT05TVEVYUFIgbG9uZyBkb3VibGUgCisgICAgICBzaWduYWxpbmdfTmFOKCkgdGhyb3coKSB7IHJldHVybiBfX2J1aWx0aW5fbmFuc2wgKCIiKTsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfQ09OU1RFWFBSIGxvbmcgZG91YmxlIAorICAgICAgZGVub3JtX21pbigpIHRocm93KCkgeyByZXR1cm4gX19MREJMX0RFTk9STV9NSU5fXzsgfQorCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX2llYzU1OQorCT0gaGFzX2luZmluaXR5ICYmIGhhc19xdWlldF9OYU4gJiYgaGFzX2Rlbm9ybSA9PSBkZW5vcm1fcHJlc2VudDsKKyAgICAgIHN0YXRpYyBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGJvb2wgaXNfYm91bmRlZCA9IHRydWU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIGlzX21vZHVsbyA9IGZhbHNlOworCisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBib29sIHRyYXBzID0gX19nbGliY3h4X2xvbmdfZG91YmxlX3RyYXBzOworICAgICAgc3RhdGljIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgYm9vbCB0aW55bmVzc19iZWZvcmUgPSAKKwkJCQkJIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV90aW55bmVzc19iZWZvcmU7CisgICAgICBzdGF0aWMgX0dMSUJDWFhfVVNFX0NPTlNURVhQUiBmbG9hdF9yb3VuZF9zdHlsZSByb3VuZF9zdHlsZSA9IAorCQkJCQkJICAgICAgcm91bmRfdG9fbmVhcmVzdDsKKyAgICB9OworCisjdW5kZWYgX19nbGliY3h4X2xvbmdfZG91YmxlX2hhc19kZW5vcm1fbG9zcworI3VuZGVmIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV90cmFwcworI3VuZGVmIF9fZ2xpYmN4eF9sb25nX2RvdWJsZV90aW55bmVzc19iZWZvcmUKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjdW5kZWYgX19nbGliY3h4X3NpZ25lZAorI3VuZGVmIF9fZ2xpYmN4eF9taW4KKyN1bmRlZiBfX2dsaWJjeHhfbWF4CisjdW5kZWYgX19nbGliY3h4X2RpZ2l0cworI3VuZGVmIF9fZ2xpYmN4eF9kaWdpdHMxMAorI3VuZGVmIF9fZ2xpYmN4eF9tYXhfZGlnaXRzMTAKKworI2VuZGlmIC8vIF9HTElCQ1hYX05VTUVSSUNfTElNSVRTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2xpc3QgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjYmE4NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbGlzdApAQCAtMCwwICsxLDc2IEBACisvLyA8bGlzdD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9saXN0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfTElTVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2xpc3QuaD4KKyNpbmNsdWRlIDxiaXRzL2xpc3QudGNjPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvbGlzdD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL2xpc3Q+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX0xJU1QgKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9sb2NhbGUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL2xvY2FsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmIxNTJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9sb2NhbGUKQEAgLTAsMCArMSw0NSBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1CisvLyAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuMSAgTG9jYWxlcworLy8KKworLyoqIEBmaWxlIGluY2x1ZGUvbG9jYWxlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0xPQ0FMRQorI2RlZmluZSBfR0xJQkNYWF9MT0NBTEUJMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL2xvY2FsZWZ3ZC5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlX2NsYXNzZXMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHMuaD4KKyNpbmNsdWRlIDxiaXRzL2xvY2FsZV9mYWNldHNfbm9uaW8uaD4KKworI2VuZGlmIC8qIF9HTElCQ1hYX0xPQ0FMRSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9tYXAgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUzYmY1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9tYXAKQEAgLTAsMCArMSw3MyBAQAorLy8gPG1hcD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL21hcAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfTUFQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfdHJlZS5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX21hcC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX211bHRpbWFwLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL21hcD4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfUFJPRklMRQorIyBpbmNsdWRlIDxwcm9maWxlL21hcD4KKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfTUFQICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL21lbW9yeSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbWVtb3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MWZmZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL21lbW9yeQpAQCAtMCwwICsxLDkxIEBACisvLyA8bWVtb3J5PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsCisvLyAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS9tZW1vcnkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfTUVNT1JZCisjZGVmaW5lIF9HTElCQ1hYX01FTU9SWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworLyoqCisgKiBAZGVmZ3JvdXAgbWVtb3J5IE1lbW9yeQorICogQGluZ3JvdXAgdXRpbGl0aWVzCisgKgorICogQ29tcG9uZW50cyBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIGRlYWxsb2NhdGlvbiwgYW5kIG1hbmFnZW1lbnQuCisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcG9pbnRlcl9hYnN0cmFjdGlvbnMgUG9pbnRlciBBYnN0cmFjdGlvbnMKKyAqIEBpbmdyb3VwIG1lbW9yeQorICoKKyAqIFNtYXJ0IHBvaW50ZXJzLCBldGMuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+CisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9jb25zdHJ1Y3QuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF91bmluaXRpYWxpemVkLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfdGVtcGJ1Zi5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3Jhd19zdG9yYWdlX2l0ZXIuaD4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjICBpbmNsdWRlIDxleGNlcHRpb24+ICAgICAgICAJICAvLyBzdGQ6OmV4Y2VwdGlvbgorIyAgaW5jbHVkZSA8dHlwZWluZm8+ICAgICAgICAgCSAgLy8gc3RkOjp0eXBlX2luZm8gaW4gZ2V0X2RlbGV0ZXIKKyMgIGluY2x1ZGUgPGlvc2Z3ZD4gICAgICAgICAgIAkgIC8vIHN0ZDo6YmFzaWNfb3N0cmVhbQorIyAgaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorIyAgaW5jbHVkZSA8ZXh0L2NvbmN1cnJlbmNlLmg+CisjICBpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjICBpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAgLy8gc3RkOjpsZXNzCisjICBpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyMgIGluY2x1ZGUgPGZ1bmN0aW9uYWw+CisjICBpbmNsdWRlIDxkZWJ1Zy9kZWJ1Zy5oPgorIyAgaWYgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyMgICAgaW5jbHVkZSA8YmFja3dhcmQvYXV0b19wdHIuaD4KKyMgIGVuZGlmCisjICBpbmNsdWRlIDxiaXRzL3VuaXF1ZV9wdHIuaD4KKyMgIGluY2x1ZGUgPGJpdHMvc2hhcmVkX3B0ci5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPGJhY2t3YXJkL2F1dG9fcHRyLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIF9HTElCQ1hYX01FTU9SWSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9tdXRleCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbXV0ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmODk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbXV0ZXgKQEAgLTAsMCArMSw4MzAgQEAKKy8vIDxtdXRleD4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9tdXRleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9NVVRFWAorI2RlZmluZSBfR0xJQkNYWF9NVVRFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4gLy8gZm9yIHN0ZDo6c3dhcAorCisjaWYgZGVmaW5lZChfR0xJQkNYWF9IQVNfR1RIUkVBRFMpICYmIGRlZmluZWQoX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxKQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBkZWZncm91cCBtdXRleGVzIE11dGV4ZXMKKyAgICogQGluZ3JvdXAgY29uY3VycmVuY3kKKyAgICoKKyAgICogQ2xhc3NlcyBmb3IgbXV0ZXggc3VwcG9ydC4KKyAgICogQHsKKyAgICovCisKKyAgLy8vIG11dGV4CisgIGNsYXNzIG11dGV4CisgIHsKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF9tdXRleF90CQkJX19uYXRpdmVfdHlwZTsKKyAgICBfX25hdGl2ZV90eXBlICBfTV9tdXRleDsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCQluYXRpdmVfaGFuZGxlX3R5cGU7CisKKyNpZmRlZiBfX0dUSFJFQURfTVVURVhfSU5JVAorICAgIGNvbnN0ZXhwciBtdXRleCgpIDogX01fbXV0ZXgoX19HVEhSRUFEX01VVEVYX0lOSVQpIHsgfQorI2Vsc2UKKyAgICBtdXRleCgpCisgICAgeworICAgICAgLy8gWFhYIEVBR0FJTiwgRU5PTUVNLCBFUEVSTSwgRUJVU1kobWF5KSwgRUlOVkFMKG1heSkKKyAgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgfm11dGV4KCkgeyBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbXV0ZXgpOyB9CisjZW5kaWYKKworICAgIG11dGV4KGNvbnN0IG11dGV4JikgPSBkZWxldGU7CisgICAgbXV0ZXgmIG9wZXJhdG9yPShjb25zdCBtdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIGxvY2soKQorICAgIHsKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fbXV0ZXgpOworCisgICAgICAvLyBFSU5WQUwsIEVBR0FJTiwgRUJVU1ksIEVJTlZBTCwgRURFQURMSyhtYXkpCisgICAgICBpZiAoX19lKQorCV9fdGhyb3dfc3lzdGVtX2Vycm9yKF9fZSk7CisgICAgfQorCisgICAgYm9vbAorICAgIHRyeV9sb2NrKCkKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICByZXR1cm4gIV9fZ3RocmVhZF9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHVubG9jaygpCisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFUEVSTQorICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jaygmX01fbXV0ZXgpOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQorICAgIG5hdGl2ZV9oYW5kbGUoKQorICAgIHsgcmV0dXJuICZfTV9tdXRleDsgfQorICB9OworCisjaWZuZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAvLyBGSVhNRTogZ3RocmVhZHMgZG9lc24ndCBkZWZpbmUgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9kZXN0cm95CisgIC8vIHNvIHdlIG5lZWQgdG8gb2J0YWluIGEgX19ndGhyZWFkX211dGV4X3QgdG8gZGVzdHJveQorICBjbGFzcyBfX2Rlc3Ryb3lfcmVjdXJzaXZlX211dGV4CisgIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTXgsIHR5cGVuYW1lIF9SbT4KKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfU19kZXN0cm95X3dpbjMyKF9NeCogX19teCwgX1JtIGNvbnN0KiBfX3JteCkKKyAgICAgIHsKKyAgICAgICAgX19teC0+Y291bnRlciA9IF9fcm14LT5jb3VudGVyOworICAgICAgICBfX214LT5zZW1hID0gX19ybXgtPnNlbWE7CisgICAgICAgIF9fZ3RocmVhZF9tdXRleF9kZXN0cm95KF9fbXgpOworICAgICAgfQorCisgIHB1YmxpYzoKKyAgICAvLyBtYXRjaGVzIGEgZ3Roci13aW4zMi5oIHJlY3Vyc2l2ZSBtdXRleAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9SbT4KKyAgICAgIHN0YXRpYyB0eXBlbmFtZSBlbmFibGVfaWY8c2l6ZW9mKCZfUm06OnNlbWEpLCB2b2lkPjo6dHlwZQorICAgICAgX1NfZGVzdHJveShfUm0qIF9fbXgpCisgICAgICB7CisgICAgICAgIF9fZ3RocmVhZF9tdXRleF90IF9fdG1wOworICAgICAgICBfU19kZXN0cm95X3dpbjMyKCZfX3RtcCwgX19teCk7CisgICAgICB9CisKKyAgICAvLyBtYXRjaGVzIGEgcmVjdXJzaXZlIG11dGV4IHdpdGggYSBtZW1iZXIgJ2FjdHVhbCcKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUm0+CisgICAgICBzdGF0aWMgdHlwZW5hbWUgZW5hYmxlX2lmPHNpemVvZigmX1JtOjphY3R1YWwpLCB2b2lkPjo6dHlwZQorICAgICAgX1NfZGVzdHJveShfUm0qIF9fbXgpCisgICAgICB7IF9fZ3RocmVhZF9tdXRleF9kZXN0cm95KCZfX214LT5hY3R1YWwpOyB9CisKKyAgICAvLyBtYXRjaGVzIHdoZW4gdGhlcmUncyBvbmx5IG9uZSBtdXRleCB0eXBlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JtPgorICAgICAgc3RhdGljCisgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfc2FtZTxfUm0sIF9fZ3RocmVhZF9tdXRleF90Pjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgICAgICBfU19kZXN0cm95KF9SbSogX19teCkKKyAgICAgIHsgX19ndGhyZWFkX211dGV4X2Rlc3Ryb3koX19teCk7IH0KKyAgfTsKKyNlbmRpZgorCisgIC8vLyByZWN1cnNpdmVfbXV0ZXgKKyAgY2xhc3MgcmVjdXJzaXZlX211dGV4CisgIHsKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdAkJX19uYXRpdmVfdHlwZTsKKyAgICBfX25hdGl2ZV90eXBlICBfTV9tdXRleDsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCQluYXRpdmVfaGFuZGxlX3R5cGU7CisKKyNpZmRlZiBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQKKyAgICByZWN1cnNpdmVfbXV0ZXgoKSA6IF9NX211dGV4KF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCkgeyB9CisjZWxzZQorICAgIHJlY3Vyc2l2ZV9tdXRleCgpCisgICAgeworICAgICAgLy8gWFhYIEVBR0FJTiwgRU5PTUVNLCBFUEVSTSwgRUJVU1kobWF5KSwgRUlOVkFMKG1heSkKKyAgICAgIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTigmX01fbXV0ZXgpOworICAgIH0KKworICAgIH5yZWN1cnNpdmVfbXV0ZXgoKQorICAgIHsgX19kZXN0cm95X3JlY3Vyc2l2ZV9tdXRleDo6X1NfZGVzdHJveSgmX01fbXV0ZXgpOyB9CisjZW5kaWYKKworICAgIHJlY3Vyc2l2ZV9tdXRleChjb25zdCByZWN1cnNpdmVfbXV0ZXgmKSA9IGRlbGV0ZTsKKyAgICByZWN1cnNpdmVfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCByZWN1cnNpdmVfbXV0ZXgmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQKKyAgICBsb2NrKCkKKyAgICB7CisgICAgICBpbnQgX19lID0gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrKCZfTV9tdXRleCk7CisKKyAgICAgIC8vIEVJTlZBTCwgRUFHQUlOLCBFQlVTWSwgRUlOVkFMLCBFREVBRExLKG1heSkKKyAgICAgIGlmIChfX2UpCisJX190aHJvd19zeXN0ZW1fZXJyb3IoX19lKTsKKyAgICB9CisKKyAgICBib29sCisgICAgdHJ5X2xvY2soKQorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIHJldHVybiAhX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdm9pZAorICAgIHVubG9jaygpCisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFQlVTWQorICAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiAmX01fbXV0ZXg7IH0KKyAgfTsKKworICAvLy8gdGltZWRfbXV0ZXgKKyAgY2xhc3MgdGltZWRfbXV0ZXgKKyAgeworICAgIHR5cGVkZWYgX19ndGhyZWFkX211dGV4X3QgCQkgIAlfX25hdGl2ZV90eXBlOworCisjaWZkZWYgX0dMSUJDWFhfVVNFX0NMT0NLX01PTk9UT05JQworICAgIHR5cGVkZWYgY2hyb25vOjptb25vdG9uaWNfY2xvY2sgCSAgCV9fY2xvY2tfdDsKKyNlbHNlCisgICAgdHlwZWRlZiBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jayAJX19jbG9ja190OworI2VuZGlmCisKKyAgICBfX25hdGl2ZV90eXBlICBfTV9tdXRleDsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBfX25hdGl2ZV90eXBlKiAJCSAgCW5hdGl2ZV9oYW5kbGVfdHlwZTsKKworI2lmZGVmIF9fR1RIUkVBRF9NVVRFWF9JTklUCisgICAgdGltZWRfbXV0ZXgoKSA6IF9NX211dGV4KF9fR1RIUkVBRF9NVVRFWF9JTklUKSB7IH0KKyNlbHNlCisgICAgdGltZWRfbXV0ZXgoKQorICAgIHsKKyAgICAgIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgfnRpbWVkX211dGV4KCkgeyBfX2d0aHJlYWRfbXV0ZXhfZGVzdHJveSgmX01fbXV0ZXgpOyB9CisjZW5kaWYKKworICAgIHRpbWVkX211dGV4KGNvbnN0IHRpbWVkX211dGV4JikgPSBkZWxldGU7CisgICAgdGltZWRfbXV0ZXgmIG9wZXJhdG9yPShjb25zdCB0aW1lZF9tdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIGxvY2soKQorICAgIHsKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfbXV0ZXhfbG9jaygmX01fbXV0ZXgpOworCisgICAgICAvLyBFSU5WQUwsIEVBR0FJTiwgRUJVU1ksIEVJTlZBTCwgRURFQURMSyhtYXkpCisgICAgICBpZiAoX19lKQorCV9fdGhyb3dfc3lzdGVtX2Vycm9yKF9fZSk7CisgICAgfQorCisgICAgYm9vbAorICAgIHRyeV9sb2NrKCkKKyAgICB7CisgICAgICAvLyBYWFggRUlOVkFMLCBFQUdBSU4sIEVCVVNZCisgICAgICByZXR1cm4gIV9fZ3RocmVhZF9tdXRleF90cnlsb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9SZXAsIGNsYXNzIF9QZXJpb2Q+CisgICAgICBib29sCisgICAgICB0cnlfbG9ja19mb3IoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsgcmV0dXJuIF9fdHJ5X2xvY2tfZm9yX2ltcGwoX19ydGltZSk7IH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBfQ2xvY2ssIGNsYXNzIF9EdXJhdGlvbj4KKyAgICAgIGJvb2wKKyAgICAgIHRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7CisJY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgY2hyb25vOjpzZWNvbmRzPiBfX3MgPQorCSAgY2hyb25vOjp0aW1lX3BvaW50X2Nhc3Q8Y2hyb25vOjpzZWNvbmRzPihfX2F0aW1lKTsKKworCWNocm9ubzo6bmFub3NlY29uZHMgX19ucyA9CisJICBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpuYW5vc2Vjb25kcz4oX19hdGltZSAtIF9fcyk7CisKKwlfX2d0aHJlYWRfdGltZV90IF9fdHMgPSB7CisJICBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVfdD4oX19zLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKSwKKwkgIHN0YXRpY19jYXN0PGxvbmc+KF9fbnMuY291bnQoKSkKKwl9OworCisJcmV0dXJuICFfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZfTV9tdXRleCwgJl9fdHMpOworICAgICAgfQorCisgICAgdm9pZAorICAgIHVubG9jaygpCisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFQlVTWQorICAgICAgX19ndGhyZWFkX211dGV4X3VubG9jaygmX01fbXV0ZXgpOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdHlwZQorICAgIG5hdGl2ZV9oYW5kbGUoKQorICAgIHsgcmV0dXJuICZfTV9tdXRleDsgfQorCisgIHByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwKKwlyYXRpb19sZXNzX2VxdWFsPF9fY2xvY2tfdDo6cGVyaW9kLCBfUGVyaW9kPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCisgICAgICBfX3RyeV9sb2NrX2Zvcl9pbXBsKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7CisJX19jbG9ja190Ojp0aW1lX3BvaW50IF9fYXRpbWUgPSBfX2Nsb2NrX3Q6Om5vdygpCisJICArIGNocm9ubzo6ZHVyYXRpb25fY2FzdDxfX2Nsb2NrX3Q6OmR1cmF0aW9uPihfX3J0aW1lKTsKKworCXJldHVybiB0cnlfbG9ja191bnRpbChfX2F0aW1lKTsKKyAgICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorCSFyYXRpb19sZXNzX2VxdWFsPF9fY2xvY2tfdDo6cGVyaW9kLCBfUGVyaW9kPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCisgICAgICBfX3RyeV9sb2NrX2Zvcl9pbXBsKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisgICAgICB7CisJX19jbG9ja190Ojp0aW1lX3BvaW50IF9fYXRpbWUgPSBfX2Nsb2NrX3Q6Om5vdygpCisJICArICsrY2hyb25vOjpkdXJhdGlvbl9jYXN0PF9fY2xvY2tfdDo6ZHVyYXRpb24+KF9fcnRpbWUpOworCisJcmV0dXJuIHRyeV9sb2NrX3VudGlsKF9fYXRpbWUpOworICAgICAgfQorICB9OworCisgIC8vLyByZWN1cnNpdmVfdGltZWRfbXV0ZXgKKyAgY2xhc3MgcmVjdXJzaXZlX3RpbWVkX211dGV4CisgIHsKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdAkJX19uYXRpdmVfdHlwZTsKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DTE9DS19NT05PVE9OSUMKKyAgICB0eXBlZGVmIGNocm9ubzo6bW9ub3RvbmljX2Nsb2NrIAkJX19jbG9ja190OworI2Vsc2UKKyAgICB0eXBlZGVmIGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrIAlfX2Nsb2NrX3Q7CisjZW5kaWYKKworICAgIF9fbmF0aXZlX3R5cGUgIF9NX211dGV4OworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fbmF0aXZlX3R5cGUqIAkJCW5hdGl2ZV9oYW5kbGVfdHlwZTsKKworI2lmZGVmIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleCgpIDogX01fbXV0ZXgoX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUKSB7IH0KKyNlbHNlCisgICAgcmVjdXJzaXZlX3RpbWVkX211dGV4KCkKKyAgICB7CisgICAgICAvLyBYWFggRUFHQUlOLCBFTk9NRU0sIEVQRVJNLCBFQlVTWShtYXkpLCBFSU5WQUwobWF5KQorICAgICAgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUX0ZVTkNUSU9OKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgfnJlY3Vyc2l2ZV90aW1lZF9tdXRleCgpCisgICAgeyBfX2Rlc3Ryb3lfcmVjdXJzaXZlX211dGV4OjpfU19kZXN0cm95KCZfTV9tdXRleCk7IH0KKyNlbmRpZgorCisgICAgcmVjdXJzaXZlX3RpbWVkX211dGV4KGNvbnN0IHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYpID0gZGVsZXRlOworICAgIHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYgb3BlcmF0b3I9KGNvbnN0IHJlY3Vyc2l2ZV90aW1lZF9tdXRleCYpID0gZGVsZXRlOworCisgICAgdm9pZAorICAgIGxvY2soKQorICAgIHsKKyAgICAgIGludCBfX2UgPSBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2soJl9NX211dGV4KTsKKworICAgICAgLy8gRUlOVkFMLCBFQUdBSU4sIEVCVVNZLCBFSU5WQUwsIEVERUFETEsobWF5KQorICAgICAgaWYgKF9fZSkKKwlfX3Rocm93X3N5c3RlbV9lcnJvcihfX2UpOworICAgIH0KKworICAgIGJvb2wKKyAgICB0cnlfbG9jaygpCisgICAgeworICAgICAgLy8gWFhYIEVJTlZBTCwgRUFHQUlOLCBFQlVTWQorICAgICAgcmV0dXJuICFfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2soJl9NX211dGV4KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgX1JlcCwgY2xhc3MgX1BlcmlvZD4KKyAgICAgIGJvb2wKKyAgICAgIHRyeV9sb2NrX2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeyByZXR1cm4gX190cnlfbG9ja19mb3JfaW1wbChfX3J0aW1lKTsgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIF9DbG9jaywgY2xhc3MgX0R1cmF0aW9uPgorICAgICAgYm9vbAorICAgICAgdHJ5X2xvY2tfdW50aWwoY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKyAgICAgIHsKKwljaHJvbm86OnRpbWVfcG9pbnQ8X0Nsb2NrLCBjaHJvbm86OnNlY29uZHM+ICBfX3MgPQorCSAgY2hyb25vOjp0aW1lX3BvaW50X2Nhc3Q8Y2hyb25vOjpzZWNvbmRzPihfX2F0aW1lKTsKKworCWNocm9ubzo6bmFub3NlY29uZHMgX19ucyA9CisJICBjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8Y2hyb25vOjpuYW5vc2Vjb25kcz4oX19hdGltZSAtIF9fcyk7CisKKwlfX2d0aHJlYWRfdGltZV90IF9fdHMgPSB7CisJICBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVfdD4oX19zLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKSwKKwkgIHN0YXRpY19jYXN0PGxvbmc+KF9fbnMuY291bnQoKSkKKwl9OworCisJcmV0dXJuICFfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RpbWVkbG9jaygmX01fbXV0ZXgsICZfX3RzKTsKKyAgICAgIH0KKworICAgIHZvaWQKKyAgICB1bmxvY2soKQorICAgIHsKKyAgICAgIC8vIFhYWCBFSU5WQUwsIEVBR0FJTiwgRUJVU1kKKyAgICAgIF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdW5sb2NrKCZfTV9tdXRleCk7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV90eXBlCisgICAgbmF0aXZlX2hhbmRsZSgpCisgICAgeyByZXR1cm4gJl9NX211dGV4OyB9CisKKyAgcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPAorCXJhdGlvX2xlc3NfZXF1YWw8X19jbG9ja190OjpwZXJpb2QsIF9QZXJpb2Q+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICAgIF9fdHJ5X2xvY2tfZm9yX2ltcGwoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsKKwlfX2Nsb2NrX3Q6OnRpbWVfcG9pbnQgX19hdGltZSA9IF9fY2xvY2tfdDo6bm93KCkKKwkgICsgY2hyb25vOjpkdXJhdGlvbl9jYXN0PF9fY2xvY2tfdDo6ZHVyYXRpb24+KF9fcnRpbWUpOworCisJcmV0dXJuIHRyeV9sb2NrX3VudGlsKF9fYXRpbWUpOworICAgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9SZXAsIHR5cGVuYW1lIF9QZXJpb2Q+CisgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8CisJIXJhdGlvX2xlc3NfZXF1YWw8X19jbG9ja190OjpwZXJpb2QsIF9QZXJpb2Q+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKKyAgICAgIF9fdHJ5X2xvY2tfZm9yX2ltcGwoY29uc3QgY2hyb25vOjpkdXJhdGlvbjxfUmVwLCBfUGVyaW9kPiYgX19ydGltZSkKKyAgICAgIHsKKwlfX2Nsb2NrX3Q6OnRpbWVfcG9pbnQgX19hdGltZSA9IF9fY2xvY2tfdDo6bm93KCkKKwkgICsgKytjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8X19jbG9ja190OjpkdXJhdGlvbj4oX19ydGltZSk7CisKKwlyZXR1cm4gdHJ5X2xvY2tfdW50aWwoX19hdGltZSk7CisgICAgICB9CisgIH07CisKKyAgLy8vIERvIG5vdCBhY3F1aXJlIG93bmVyc2hpcCBvZiB0aGUgbXV0ZXguCisgIHN0cnVjdCBkZWZlcl9sb2NrX3QgeyB9OworCisgIC8vLyBUcnkgdG8gYWNxdWlyZSBvd25lcnNoaXAgb2YgdGhlIG11dGV4IHdpdGhvdXQgYmxvY2tpbmcuCisgIHN0cnVjdCB0cnlfdG9fbG9ja190IHsgfTsKKworICAvLy8gQXNzdW1lIHRoZSBjYWxsaW5nIHRocmVhZCBoYXMgYWxyZWFkeSBvYnRhaW5lZCBtdXRleCBvd25lcnNoaXAKKyAgLy8vIGFuZCBtYW5hZ2UgaXQuCisgIHN0cnVjdCBhZG9wdF9sb2NrX3QgeyB9OworCisgIGNvbnN0ZXhwciBkZWZlcl9sb2NrX3QJZGVmZXJfbG9jayB7IH07CisgIGNvbnN0ZXhwciB0cnlfdG9fbG9ja190CXRyeV90b19sb2NrIHsgfTsKKyAgY29uc3RleHByIGFkb3B0X2xvY2tfdAlhZG9wdF9sb2NrIHsgfTsKKworICAvLy8gQGJyaWVmICBTY29wZWQgbG9jayBpZGlvbS4KKyAgLy8gQWNxdWlyZSB0aGUgbXV0ZXggaGVyZSB3aXRoIGEgY29uc3RydWN0b3IgY2FsbCwgdGhlbiByZWxlYXNlIHdpdGgKKyAgLy8gdGhlIGRlc3RydWN0b3IgY2FsbCBpbiBhY2NvcmRhbmNlIHdpdGggUkFJSSBzdHlsZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX011dGV4PgorICAgIGNsYXNzIGxvY2tfZ3VhcmQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfTXV0ZXggbXV0ZXhfdHlwZTsKKworICAgICAgZXhwbGljaXQgbG9ja19ndWFyZChtdXRleF90eXBlJiBfX20pIDogX01fZGV2aWNlKF9fbSkKKyAgICAgIHsgX01fZGV2aWNlLmxvY2soKTsgfQorCisgICAgICBsb2NrX2d1YXJkKG11dGV4X3R5cGUmIF9fbSwgYWRvcHRfbG9ja190KSA6IF9NX2RldmljZShfX20pCisgICAgICB7IH0gLy8gY2FsbGluZyB0aHJlYWQgb3ducyBtdXRleAorCisgICAgICB+bG9ja19ndWFyZCgpCisgICAgICB7IF9NX2RldmljZS51bmxvY2soKTsgfQorCisgICAgICBsb2NrX2d1YXJkKGNvbnN0IGxvY2tfZ3VhcmQmKSA9IGRlbGV0ZTsKKyAgICAgIGxvY2tfZ3VhcmQmIG9wZXJhdG9yPShjb25zdCBsb2NrX2d1YXJkJikgPSBkZWxldGU7CisKKyAgICBwcml2YXRlOgorICAgICAgbXV0ZXhfdHlwZSYgIF9NX2RldmljZTsKKyAgICB9OworCisgIC8vLyB1bmlxdWVfbG9jaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTXV0ZXg+CisgICAgY2xhc3MgdW5pcXVlX2xvY2sKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfTXV0ZXggbXV0ZXhfdHlwZTsKKworICAgICAgdW5pcXVlX2xvY2soKQorICAgICAgOiBfTV9kZXZpY2UoMCksIF9NX293bnMoZmFsc2UpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQgdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tKQorICAgICAgOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnMoZmFsc2UpCisgICAgICB7CisJbG9jaygpOworCV9NX293bnMgPSB0cnVlOworICAgICAgfQorCisgICAgICB1bmlxdWVfbG9jayhtdXRleF90eXBlJiBfX20sIGRlZmVyX2xvY2tfdCkKKyAgICAgIDogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKGZhbHNlKQorICAgICAgeyB9CisKKyAgICAgIHVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwgdHJ5X3RvX2xvY2tfdCkKKyAgICAgIDogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKF9NX2RldmljZS0+dHJ5X2xvY2soKSkKKyAgICAgIHsgfQorCisgICAgICB1bmlxdWVfbG9jayhtdXRleF90eXBlJiBfX20sIGFkb3B0X2xvY2tfdCkKKyAgICAgIDogX01fZGV2aWNlKCZfX20pLCBfTV9vd25zKHRydWUpCisgICAgICB7CisJLy8gWFhYIGNhbGxpbmcgdGhyZWFkIG93bnMgbXV0ZXgKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisJdW5pcXVlX2xvY2sobXV0ZXhfdHlwZSYgX19tLAorCQkgICAgY29uc3QgY2hyb25vOjp0aW1lX3BvaW50PF9DbG9jaywgX0R1cmF0aW9uPiYgX19hdGltZSkKKwk6IF9NX2RldmljZSgmX19tKSwgX01fb3ducyhfTV9kZXZpY2UtPnRyeV9sb2NrX3VudGlsKF9fYXRpbWUpKQorCXsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorCXVuaXF1ZV9sb2NrKG11dGV4X3R5cGUmIF9fbSwKKwkJICAgIGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisJOiBfTV9kZXZpY2UoJl9fbSksIF9NX293bnMoX01fZGV2aWNlLT50cnlfbG9ja19mb3IoX19ydGltZSkpCisJeyB9CisKKyAgICAgIH51bmlxdWVfbG9jaygpCisgICAgICB7CisJaWYgKF9NX293bnMpCisJICB1bmxvY2soKTsKKyAgICAgIH0KKworICAgICAgdW5pcXVlX2xvY2soY29uc3QgdW5pcXVlX2xvY2smKSA9IGRlbGV0ZTsKKyAgICAgIHVuaXF1ZV9sb2NrJiBvcGVyYXRvcj0oY29uc3QgdW5pcXVlX2xvY2smKSA9IGRlbGV0ZTsKKworICAgICAgdW5pcXVlX2xvY2sodW5pcXVlX2xvY2smJiBfX3UpCisgICAgICA6IF9NX2RldmljZShfX3UuX01fZGV2aWNlKSwgX01fb3ducyhfX3UuX01fb3ducykKKyAgICAgIHsKKwlfX3UuX01fZGV2aWNlID0gMDsKKwlfX3UuX01fb3ducyA9IGZhbHNlOworICAgICAgfQorCisgICAgICB1bmlxdWVfbG9jayYgb3BlcmF0b3I9KHVuaXF1ZV9sb2NrJiYgX191KQorICAgICAgeworCWlmKF9NX293bnMpCisJICB1bmxvY2soKTsKKworCXVuaXF1ZV9sb2NrKHN0ZDo6bW92ZShfX3UpKS5zd2FwKCp0aGlzKTsKKworCV9fdS5fTV9kZXZpY2UgPSAwOworCV9fdS5fTV9vd25zID0gZmFsc2U7CisKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGxvY2soKQorICAgICAgeworCWlmICghX01fZGV2aWNlKQorCSAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6Om9wZXJhdGlvbl9ub3RfcGVybWl0dGVkKSk7CisJZWxzZSBpZiAoX01fb3ducykKKwkgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpyZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1cikpOworCWVsc2UKKwkgIHsKKwkgICAgX01fZGV2aWNlLT5sb2NrKCk7CisJICAgIF9NX293bnMgPSB0cnVlOworCSAgfQorICAgICAgfQorCisgICAgICBib29sCisgICAgICB0cnlfbG9jaygpCisgICAgICB7CisJaWYgKCFfTV9kZXZpY2UpCisJICBfX3Rocm93X3N5c3RlbV9lcnJvcihpbnQoZXJyYzo6b3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQpKTsKKwllbHNlIGlmIChfTV9vd25zKQorCSAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJZWxzZQorCSAgeworCSAgICBfTV9vd25zID0gX01fZGV2aWNlLT50cnlfbG9jaygpOworCSAgICByZXR1cm4gX01fb3duczsKKwkgIH0KKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Nsb2NrLCB0eXBlbmFtZSBfRHVyYXRpb24+CisJYm9vbAorCXRyeV9sb2NrX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisJeworCSAgaWYgKCFfTV9kZXZpY2UpCisJICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCSAgZWxzZSBpZiAoX01fb3ducykKKwkgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfTV9vd25zID0gX01fZGV2aWNlLT50cnlfbG9ja191bnRpbChfX2F0aW1lKTsKKwkgICAgICByZXR1cm4gX01fb3duczsKKwkgICAgfQorCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcCwgdHlwZW5hbWUgX1BlcmlvZD4KKwlib29sCisJdHJ5X2xvY2tfZm9yKGNvbnN0IGNocm9ubzo6ZHVyYXRpb248X1JlcCwgX1BlcmlvZD4mIF9fcnRpbWUpCisJeworCSAgaWYgKCFfTV9kZXZpY2UpCisJICAgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCSAgZWxzZSBpZiAoX01fb3ducykKKwkgICAgX190aHJvd19zeXN0ZW1fZXJyb3IoaW50KGVycmM6OnJlc291cmNlX2RlYWRsb2NrX3dvdWxkX29jY3VyKSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBfTV9vd25zID0gX01fZGV2aWNlLT50cnlfbG9ja19mb3IoX19ydGltZSk7CisJICAgICAgcmV0dXJuIF9NX293bnM7CisJICAgIH0KKwkgfQorCisgICAgICB2b2lkCisgICAgICB1bmxvY2soKQorICAgICAgeworCWlmICghX01fb3ducykKKwkgIF9fdGhyb3dfc3lzdGVtX2Vycm9yKGludChlcnJjOjpvcGVyYXRpb25fbm90X3Blcm1pdHRlZCkpOworCWVsc2UgaWYgKF9NX2RldmljZSkKKwkgIHsKKwkgICAgX01fZGV2aWNlLT51bmxvY2soKTsKKwkgICAgX01fb3ducyA9IGZhbHNlOworCSAgfQorICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVuaXF1ZV9sb2NrJiBfX3UpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2RldmljZSwgX191Ll9NX2RldmljZSk7CisJc3RkOjpzd2FwKF9NX293bnMsIF9fdS5fTV9vd25zKTsKKyAgICAgIH0KKworICAgICAgbXV0ZXhfdHlwZSoKKyAgICAgIHJlbGVhc2UoKQorICAgICAgeworCW11dGV4X3R5cGUqIF9fcmV0ID0gX01fZGV2aWNlOworCV9NX2RldmljZSA9IDA7CisJX01fb3ducyA9IGZhbHNlOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgYm9vbAorICAgICAgb3duc19sb2NrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX293bnM7IH0KKworICAgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CisgICAgICB7IHJldHVybiBvd25zX2xvY2soKTsgfQorCisgICAgICBtdXRleF90eXBlKgorICAgICAgbXV0ZXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGV2aWNlOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgbXV0ZXhfdHlwZSoJX01fZGV2aWNlOworICAgICAgYm9vbAkJX01fb3duczsgLy8gWFhYIHVzZSBhdG9taWNfYm9vbAorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX011dGV4PgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bmlxdWVfbG9jazxfTXV0ZXg+JiBfX3gsIHVuaXF1ZV9sb2NrPF9NdXRleD4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxpbnQgX0lkeD4KKyAgICBzdHJ1Y3QgX191bmxvY2tfaW1wbAorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9Mb2NrPgorCXN0YXRpYyB2b2lkCisJX19kb191bmxvY2sodHVwbGU8X0xvY2smLi4uPiYgX19sb2NrcykKKwl7CisJICBzdGQ6OmdldDxfSWR4PihfX2xvY2tzKS51bmxvY2soKTsKKwkgIF9fdW5sb2NrX2ltcGw8X0lkeCAtIDE+OjpfX2RvX3VubG9jayhfX2xvY2tzKTsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fdW5sb2NrX2ltcGw8LTE+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0xvY2s+CisJc3RhdGljIHZvaWQKKwlfX2RvX3VubG9jayh0dXBsZTxfTG9jayYuLi4+JikKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrPgorICAgIHVuaXF1ZV9sb2NrPF9Mb2NrPgorICAgIF9fdHJ5X3RvX2xvY2soX0xvY2smIF9fbCkKKyAgICB7IHJldHVybiB1bmlxdWVfbG9jazxfTG9jaz4oX19sLCB0cnlfdG9fbG9jayk7IH0KKworICB0ZW1wbGF0ZTxpbnQgX0lkeCwgYm9vbCBfQ29udGludWUgPSB0cnVlPgorICAgIHN0cnVjdCBfX3RyeV9sb2NrX2ltcGwKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfTG9jaz4KKwlzdGF0aWMgdm9pZAorCV9fZG9fdHJ5X2xvY2sodHVwbGU8X0xvY2smLi4uPiYgX19sb2NrcywgaW50JiBfX2lkeCkKKwl7CisgICAgICAgICAgX19pZHggPSBfSWR4OworICAgICAgICAgIGF1dG8gX19sb2NrID0gX190cnlfdG9fbG9jayhzdGQ6OmdldDxfSWR4PihfX2xvY2tzKSk7CisgICAgICAgICAgaWYgKF9fbG9jay5vd25zX2xvY2soKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX190cnlfbG9ja19pbXBsPF9JZHggKyAxLCBfSWR4ICsgMiA8IHNpemVvZi4uLihfTG9jayk+OjoKKyAgICAgICAgICAgICAgICBfX2RvX3RyeV9sb2NrKF9fbG9ja3MsIF9faWR4KTsKKyAgICAgICAgICAgICAgaWYgKF9faWR4ID09IC0xKQorICAgICAgICAgICAgICAgIF9fbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisJfQorICAgIH07CisKKyAgdGVtcGxhdGU8aW50IF9JZHg+CisgICAgc3RydWN0IF9fdHJ5X2xvY2tfaW1wbDxfSWR4LCBmYWxzZT4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfTG9jaz4KKwlzdGF0aWMgdm9pZAorCV9fZG9fdHJ5X2xvY2sodHVwbGU8X0xvY2smLi4uPiYgX19sb2NrcywgaW50JiBfX2lkeCkKKwl7CisgICAgICAgICAgX19pZHggPSBfSWR4OworICAgICAgICAgIGF1dG8gX19sb2NrID0gX190cnlfdG9fbG9jayhzdGQ6OmdldDxfSWR4PihfX2xvY2tzKSk7CisgICAgICAgICAgaWYgKF9fbG9jay5vd25zX2xvY2soKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19pZHggPSAtMTsKKyAgICAgICAgICAgICAgX19sb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfTsKKworICAvKiogQGJyaWVmIEdlbmVyaWMgdHJ5X2xvY2suCisgICAqICBAcGFyYW0gX19sMSBNZWV0cyBNdXRleCByZXF1aXJlbWVudHMgKHRyeV9sb2NrKCkgbWF5IHRocm93KS4KKyAgICogIEBwYXJhbSBfX2wyIE1lZXRzIE11dGV4IHJlcXVpcmVtZW50cyAodHJ5X2xvY2soKSBtYXkgdGhyb3cpLgorICAgKiAgQHBhcmFtIF9fbDMgTWVldHMgTXV0ZXggcmVxdWlyZW1lbnRzICh0cnlfbG9jaygpIG1heSB0aHJvdykuCisgICAqICBAcmV0dXJuIFJldHVybnMgLTEgaWYgYWxsIHRyeV9sb2NrKCkgY2FsbHMgcmV0dXJuIHRydWUuIE90aGVyd2lzZSByZXR1cm5zCisgICAqICAgICAgICAgIGEgMC1iYXNlZCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcmd1bWVudCB0aGF0IHJldHVybmVkIGZhbHNlLgorICAgKiAgQHBvc3QgRWl0aGVyIGFsbCBhcmd1bWVudHMgYXJlIGxvY2tlZCwgb3Igbm9uZSB3aWxsIGJlLgorICAgKgorICAgKiAgU2VxdWVudGlhbGx5IGNhbGxzIHRyeV9sb2NrKCkgb24gZWFjaCBhcmd1bWVudC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Mb2NrMSwgdHlwZW5hbWUgX0xvY2syLCB0eXBlbmFtZS4uLiBfTG9jazM+CisgICAgaW50CisgICAgdHJ5X2xvY2soX0xvY2sxJiBfX2wxLCBfTG9jazImIF9fbDIsIF9Mb2NrMyYuLi4gX19sMykKKyAgICB7CisgICAgICBpbnQgX19pZHg7CisgICAgICBhdXRvIF9fbG9ja3MgPSBzdGQ6OnRpZShfX2wxLCBfX2wyLCBfX2wzLi4uKTsKKyAgICAgIF9fdHJ5CisgICAgICB7IF9fdHJ5X2xvY2tfaW1wbDwwPjo6X19kb190cnlfbG9jayhfX2xvY2tzLCBfX2lkeCk7IH0KKyAgICAgIF9fY2F0Y2goLi4uKQorICAgICAgeyB9CisgICAgICByZXR1cm4gX19pZHg7CisgICAgfQorCisgIC8qKiBAYnJpZWYgR2VuZXJpYyBsb2NrLgorICAgKiAgQHBhcmFtIF9fbDEgTWVldHMgTXV0ZXggcmVxdWlyZW1lbnRzICh0cnlfbG9jaygpIG1heSB0aHJvdykuCisgICAqICBAcGFyYW0gX19sMiBNZWV0cyBNdXRleCByZXF1aXJlbWVudHMgKHRyeV9sb2NrKCkgbWF5IHRocm93KS4KKyAgICogIEBwYXJhbSBfX2wzIE1lZXRzIE11dGV4IHJlcXVpcmVtZW50cyAodHJ5X2xvY2soKSBtYXkgdGhyb3cpLgorICAgKiAgQHRocm93IEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYW4gYXJndW1lbnQncyBsb2NrKCkgb3IgdHJ5X2xvY2soKSBtZW1iZXIuCisgICAqICBAcG9zdCBBbGwgYXJndW1lbnRzIGFyZSBsb2NrZWQuCisgICAqCisgICAqICBBbGwgYXJndW1lbnRzIGFyZSBsb2NrZWQgdmlhIGEgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gbG9jaygpLCB0cnlfbG9jaygpCisgICAqICBhbmQgdW5sb2NrKCkuICBJZiB0aGUgY2FsbCBleGl0cyB2aWEgYW4gZXhjZXB0aW9uIGFueSBsb2NrcyB0aGF0IHdlcmUKKyAgICogIG9idGFpbmVkIHdpbGwgYmUgcmVsZWFzZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTDEsIHR5cGVuYW1lIF9MMiwgdHlwZW5hbWUgLi4uX0wzPgorICAgIHZvaWQKKyAgICBsb2NrKF9MMSYgX19sMSwgX0wyJiBfX2wyLCBfTDMmLi4uIF9fbDMpCisgICAgeworICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICB1bmlxdWVfbG9jazxfTDE+IF9fZmlyc3QoX19sMSk7CisgICAgICAgICAgaW50IF9faWR4OworICAgICAgICAgIGF1dG8gX19sb2NrcyA9IHN0ZDo6dGllKF9fbDIsIF9fbDMuLi4pOworICAgICAgICAgIF9fdHJ5X2xvY2tfaW1wbDwwLCBzaXplb2YuLi4oX0wzKT46Ol9fZG9fdHJ5X2xvY2soX19sb2NrcywgX19pZHgpOworICAgICAgICAgIGlmIChfX2lkeCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19maXJzdC5yZWxlYXNlKCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvLy8gb25jZV9mbGFnCisgIHN0cnVjdCBvbmNlX2ZsYWcKKyAgeworICBwcml2YXRlOgorICAgIHR5cGVkZWYgX19ndGhyZWFkX29uY2VfdCBfX25hdGl2ZV90eXBlOworICAgIF9fbmF0aXZlX3R5cGUgIF9NX29uY2U7CisKKyAgcHVibGljOgorICAgIGNvbnN0ZXhwciBvbmNlX2ZsYWcoKSA6IF9NX29uY2UoX19HVEhSRUFEX09OQ0VfSU5JVCkgeyB9CisKKyAgICBvbmNlX2ZsYWcoY29uc3Qgb25jZV9mbGFnJikgPSBkZWxldGU7CisgICAgb25jZV9mbGFnJiBvcGVyYXRvcj0oY29uc3Qgb25jZV9mbGFnJikgPSBkZWxldGU7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgZnJpZW5kIHZvaWQKKyAgICAgIGNhbGxfb25jZShvbmNlX2ZsYWcmIF9fb25jZSwgX0NhbGxhYmxlJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncyk7CisgIH07CisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX1RMUworICBleHRlcm4gX190aHJlYWQgdm9pZCogX19vbmNlX2NhbGxhYmxlOworICBleHRlcm4gX190aHJlYWQgdm9pZCAoKl9fb25jZV9jYWxsKSgpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWxsYWJsZT4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fb25jZV9jYWxsX2ltcGwoKQorICAgIHsKKyAgICAgICgqKF9DYWxsYWJsZSopX19vbmNlX2NhbGxhYmxlKSgpOworICAgIH0KKyNlbHNlCisgIGV4dGVybiBmdW5jdGlvbjx2b2lkKCk+IF9fb25jZV9mdW5jdG9yOworCisgIGV4dGVybiB2b2lkCisgIF9fc2V0X29uY2VfZnVuY3Rvcl9sb2NrX3B0cih1bmlxdWVfbG9jazxtdXRleD4qKTsKKworICBleHRlcm4gbXV0ZXgmCisgIF9fZ2V0X29uY2VfbXV0ZXgoKTsKKyNlbmRpZgorCisgIGV4dGVybiAiQyIgdm9pZCBfX29uY2VfcHJveHkoKTsKKworICAvLy8gY2FsbF9vbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DYWxsYWJsZSwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgdm9pZAorICAgIGNhbGxfb25jZShvbmNlX2ZsYWcmIF9fb25jZSwgX0NhbGxhYmxlJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfSEFWRV9UTFMKKyAgICAgIGF1dG8gX19ib3VuZF9mdW5jdG9yID0gc3RkOjpiaW5kPHZvaWQ+KHN0ZDo6Zm9yd2FyZDxfQ2FsbGFibGU+KF9fZiksCisgICAgICAgICAgc3RkOjpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKTsKKyAgICAgIF9fb25jZV9jYWxsYWJsZSA9ICZfX2JvdW5kX2Z1bmN0b3I7CisgICAgICBfX29uY2VfY2FsbCA9ICZfX29uY2VfY2FsbF9pbXBsPGRlY2x0eXBlKF9fYm91bmRfZnVuY3Rvcik+OworI2Vsc2UKKyAgICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBfX2Z1bmN0b3JfbG9jayhfX2dldF9vbmNlX211dGV4KCkpOworICAgICAgX19vbmNlX2Z1bmN0b3IgPSBzdGQ6OmJpbmQ8dm9pZD4oc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19mKSwKKyAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworICAgICAgX19zZXRfb25jZV9mdW5jdG9yX2xvY2tfcHRyKCZfX2Z1bmN0b3JfbG9jayk7CisjZW5kaWYKKworICAgICAgaW50IF9fZSA9IF9fZ3RocmVhZF9vbmNlKCYoX19vbmNlLl9NX29uY2UpLCAmX19vbmNlX3Byb3h5KTsKKworI2lmbmRlZiBfR0xJQkNYWF9IQVZFX1RMUworICAgICAgaWYgKF9fZnVuY3Rvcl9sb2NrKQorICAgICAgICBfX3NldF9vbmNlX2Z1bmN0b3JfbG9ja19wdHIoMCk7CisjZW5kaWYKKworICAgICAgaWYgKF9fZSkKKwlfX3Rocm93X3N5c3RlbV9lcnJvcihfX2UpOworICAgIH0KKworICAvLyBAfSBncm91cCBtdXRleGVzCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9IQVNfR1RIUkVBRFMgJiYgX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgLy8gX0dMSUJDWFhfTVVURVgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbmV3IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3ZmRiOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbmV3CkBAIC0wLDAgKzEsMTE1IEBACisvLyBUaGUgLSotIEMrKyAtKi0gZHluYW1pYyBtZW1vcnkgbWFuYWdlbWVudCBoZWFkZXIuCisKKy8vIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKy8vIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQ0MuCisvLworLy8gR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vIAorLy8gR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vIAorLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIG5ldworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKgorICogIFRoZSBoZWFkZXIgQGMgbmV3IGRlZmluZXMgc2V2ZXJhbCBmdW5jdGlvbnMgdG8gbWFuYWdlIGR5bmFtaWMgbWVtb3J5IGFuZAorICogIGhhbmRsaW5nIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yczsgc2VlCisgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrLzE4X3N1cHBvcnQvaG93dG8uaHRtbCM0IGZvciBtb3JlLgorICovCisKKyNpZm5kZWYgX05FVworI2RlZmluZSBfTkVXCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorCisjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKKworZXh0ZXJuICJDKysiIHsKKworbmFtZXNwYWNlIHN0ZCAKK3sKKyAgLyoqCisgICAqICBAYnJpZWYgIEV4Y2VwdGlvbiBwb3NzaWJseSB0aHJvd24gYnkgQGMgbmV3LgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgQGMgYmFkX2FsbG9jIChvciBjbGFzc2VzIGRlcml2ZWQgZnJvbSBpdCkgaXMgdXNlZCB0byByZXBvcnQgYWxsb2NhdGlvbgorICAgKiAgZXJyb3JzIGZyb20gdGhlIHRocm93aW5nIGZvcm1zIG9mIEBjIG5ldy4gICovCisgIGNsYXNzIGJhZF9hbGxvYyA6IHB1YmxpYyBleGNlcHRpb24gCisgIHsKKyAgcHVibGljOgorICAgIGJhZF9hbGxvYygpIHRocm93KCkgeyB9CisKKyAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy0zLjAuMi9nY2NfNi5odG1sI1NFQzExOAorICAgIHZpcnR1YWwgfmJhZF9hbGxvYygpIHRocm93KCk7CisKKyAgICAvLyBTZWUgY29tbWVudCBpbiBlaF9leGNlcHRpb24uY2MuCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworICBzdHJ1Y3Qgbm90aHJvd190IHsgfTsKKworICBleHRlcm4gY29uc3Qgbm90aHJvd190IG5vdGhyb3c7CisKKyAgLyoqIElmIHlvdSB3cml0ZSB5b3VyIG93biBlcnJvciBoYW5kbGVyIHRvIGJlIGNhbGxlZCBieSBAYyBuZXcsIGl0IG11c3QKKyAgICogIGJlIG9mIHRoaXMgdHlwZS4gICovCisgIHR5cGVkZWYgdm9pZCAoKm5ld19oYW5kbGVyKSgpOworCisgIC8vLyBUYWtlcyBhIHJlcGxhY2VtZW50IGhhbmRsZXIgYXMgdGhlIGFyZ3VtZW50LCByZXR1cm5zIHRoZQorICAvLy8gcHJldmlvdXMgaGFuZGxlci4KKyAgbmV3X2hhbmRsZXIgc2V0X25ld19oYW5kbGVyKG5ld19oYW5kbGVyKSB0aHJvdygpOworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKy8vQHsKKy8qKiBUaGVzZSBhcmUgcmVwbGFjZWFibGUgc2lnbmF0dXJlczoKKyAqICAtIG5vcm1hbCBzaW5nbGUgbmV3IGFuZCBkZWxldGUgKG5vIGFyZ3VtZW50cywgdGhyb3cgQGMgYmFkX2FsbG9jIG9uIGVycm9yKQorICogIC0gbm9ybWFsIGFycmF5IG5ldyBhbmQgZGVsZXRlIChzYW1lKQorICogIC0gQGMgbm90aHJvdyBzaW5nbGUgbmV3IGFuZCBkZWxldGUgKHRha2UgYSBAYyBub3Rocm93IGFyZ3VtZW50LCByZXR1cm4KKyAqICAgIEBjIE5VTEwgb24gZXJyb3IpCisgKiAgLSBAYyBub3Rocm93IGFycmF5IG5ldyBhbmQgZGVsZXRlIChzYW1lKQorICoKKyAqICBQbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUgc2lnbmF0dXJlcyAodGFrZSBhIG1lbW9yeSBhZGRyZXNzIGFyZ3VtZW50LAorICogIGRvZXMgbm90aGluZykgbWF5IG5vdCBiZSByZXBsYWNlZCBieSBhIHVzZXIncyBwcm9ncmFtLgorKi8KK3ZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCkgdGhyb3cgKHN0ZDo6YmFkX2FsbG9jKTsKK3ZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRfYWxsb2MpOwordm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIHRocm93KCk7Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc3RkOjpzaXplX3QpIHRocm93KCk7Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqKSB0aHJvdygpOwordm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90LCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7Cit2b2lkKiBvcGVyYXRvciBuZXdbXShzdGQ6OnNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwordm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKK3ZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKKworLy8gRGVmYXVsdCBwbGFjZW1lbnQgdmVyc2lvbnMgb2Ygb3BlcmF0b3IgbmV3LgoraW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCwgdm9pZCogX19wKSB0aHJvdygpIHsgcmV0dXJuIF9fcDsgfQoraW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90LCB2b2lkKiBfX3ApIHRocm93KCkgeyByZXR1cm4gX19wOyB9CisKKy8vIERlZmF1bHQgcGxhY2VtZW50IHZlcnNpb25zIG9mIG9wZXJhdG9yIGRlbGV0ZS4KK2lubGluZSB2b2lkICBvcGVyYXRvciBkZWxldGUgICh2b2lkKiwgdm9pZCopIHRocm93KCkgeyB9CitpbmxpbmUgdm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCosIHZvaWQqKSB0aHJvdygpIHsgfQorLy9AfQorfSAvLyBleHRlcm4gIkMrKyIKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL251bWVyaWMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL251bWVyaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjZWRmNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvbnVtZXJpYwpAQCAtMCwwICsxLDc3IEBACisvLyA8bnVtZXJpYz4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL251bWVyaWMKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfTlVNRVJJQworI2RlZmluZSBfR0xJQkNYWF9OVU1FUklDIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvcl9iYXNlX3R5cGVzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbnVtZXJpYy5oPgorCisjaWZkZWYgX0dMSUJDWFhfUEFSQUxMRUwKKyMgaW5jbHVkZSA8cGFyYWxsZWwvbnVtZXJpYz4KKyNlbmRpZgorCisvKioKKyAqIEBkZWZncm91cCBudW1lcmljcyBOdW1lcmljcworICoKKyAqIENvbXBvbmVudHMgZm9yIHBlcmZvcm1pbmcgbnVtZXJpYyBvcGVyYXRpb25zLiBJbmNsdWRlcyBzdXBwb3J0IGZvcgorICogZm9yIGNvbXBsZXggbnVtYmVyIHR5cGVzLCByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24sIG51bWVyaWMKKyAqIChuLWF0LWEtdGltZSkgYXJyYXlzLCBnZW5lcmFsaXplZCBudW1lcmljIGFsZ29yaXRobXMsIGFuZCBzcGVjaWFsCisgKiBtYXRoIGZ1bmN0aW9ucy4KKyAqLworCisjZW5kaWYgLyogX0dMSUJDWFhfTlVNRVJJQyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9vc3RyZWFtIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9vc3RyZWFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDRkNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL29zdHJlYW0KQEAgLTAsMCArMSw1OTAgQEAKKy8vIE91dHB1dCBzdHJlYW1zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL29zdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy42LjIgIE91dHB1dCBzdHJlYW1zCisvLworCisjaWZuZGVmIF9HTElCQ1hYX09TVFJFQU0KKyNkZWZpbmUgX0dMSUJDWFhfT1NUUkVBTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxiaXRzL29zdHJlYW1faW5zZXJ0Lmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjcuNi4yLjFdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX29zdHJlYW0KKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnRyb2xsaW5nIG91dHB1dC4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgb3V0cHV0IHN0cmVhbXMuICBJdCBwcm92aWRlcyB0ZXh0CisgICAqICBmb3JtYXR0aW5nIG9mIGFsbCBidWlsdGluIHR5cGVzLCBhbmQgY29tbXVuaWNhdGVzIHdpdGggYW55IGNsYXNzCisgICAqICBkZXJpdmVkIGZyb20gYmFzaWNfc3RyZWFtYnVmIHRvIGRvIHRoZSBhY3R1YWwgb3V0cHV0LgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfb3N0cmVhbSA6IHZpcnR1YWwgcHVibGljIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFR5cGVzIChpbmhlcml0ZWQgZnJvbSBiYXNpY19pb3MgKDI3LjQuNCkpOgorICAgICAgdHlwZWRlZiBfQ2hhclQgICAgICAgICAgICAgICAgICAgICAJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cG9zX3R5cGUgCQlwb3NfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAgICAgICAgICAgICAgICAgICAgCQl0cmFpdHNfdHlwZTsKKyAgICAgIAorICAgICAgLy8gTm9uLXN0YW5kYXJkIFR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiAJCV9fc3RyZWFtYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lvczxfQ2hhclQsIF9UcmFpdHM+CQlfX2lvc190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4JCV9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiBudW1fcHV0PF9DaGFyVCwgb3N0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQsIF9UcmFpdHM+ID4gICAgICAgIAorICAgICAgCQkJCQkJCV9fbnVtX3B1dF90eXBlOworICAgICAgdHlwZWRlZiBjdHlwZTxfQ2hhclQ+ICAgICAgICAgICAJCQlfX2N0eXBlX3R5cGU7CisKKyAgICAgIC8vIFsyNy42LjIuMl0gY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNlIGNvbnN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGN0b3IgaXMgYWxtb3N0IG5ldmVyIGNhbGxlZCBieSB0aGUgdXNlciBkaXJlY3RseSwgcmF0aGVyIGZyb20KKyAgICAgICAqICBkZXJpdmVkIGNsYXNzZXMnIGluaXRpYWxpemF0aW9uIGxpc3RzLCB3aGljaCBwYXNzIGEgcG9pbnRlciB0bworICAgICAgICogIHRoZWlyIG93biBzdHJlYW0gYnVmZmVyLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0IAorICAgICAgYmFzaWNfb3N0cmVhbShfX3N0cmVhbWJ1Zl90eXBlKiBfX3NiKQorICAgICAgeyB0aGlzLT5pbml0KF9fc2IpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQmFzZSBkZXN0cnVjdG9yLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGRvZXMgdmVyeSBsaXR0bGUgYXBhcnQgZnJvbSBwcm92aWRpbmcgYSB2aXJ0dWFsIGJhc2UgZHRvci4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIAorICAgICAgfmJhc2ljX29zdHJlYW0oKSB7IH0KKworICAgICAgLy8gWzI3LjYuMi4zXSBwcmVmaXgvc3VmZml4CisgICAgICBjbGFzcyBzZW50cnk7CisgICAgICBmcmllbmQgY2xhc3Mgc2VudHJ5OworICAgICAgCisgICAgICAvLyBbMjcuNi4yLjVdIGZvcm1hdHRlZCBvdXRwdXQKKyAgICAgIC8vIFsyNy42LjIuNS4zXSAgYmFzaWNfb3N0cmVhbTo6b3BlcmF0b3I8PAorICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnRlcmZhY2UgZm9yIG1hbmlwdWxhdG9ycy4KKyAgICAgICAqCisgICAgICAgKiAgTWFuaXB1bGF0b3JzIHN1Y2ggYXMgQGMgc3RkOjplbmRsIGFuZCBAYyBzdGQ6OmhleCB1c2UgdGhlc2UKKyAgICAgICAqICBmdW5jdGlvbnMgaW4gY29uc3RydWN0cyBsaWtlICJzdGQ6OmNvdXQgPDwgc3RkOjplbmRsIi4gIEZvciBtb3JlCisgICAgICAgKiAgaW5mb3JtYXRpb24sIHNlZSB0aGUgaW9tYW5pcCBoZWFkZXIuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmCisgICAgICBvcGVyYXRvcjw8KF9fb3N0cmVhbV90eXBlJiAoKl9fcGYpKF9fb3N0cmVhbV90eXBlJikpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworCS8vIFRoZSBpbnNlcnRlcnMgZm9yIG1hbmlwdWxhdG9ycyBhcmUgKm5vdCogZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMuCisJcmV0dXJuIF9fcGYoKnRoaXMpOworICAgICAgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoX19pb3NfdHlwZSYgKCpfX3BmKShfX2lvc190eXBlJikpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworCS8vIFRoZSBpbnNlcnRlcnMgZm9yIG1hbmlwdWxhdG9ycyBhcmUgKm5vdCogZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMuCisJX19wZigqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgIG9wZXJhdG9yPDwoaW9zX2Jhc2UmICgqX19wZikgKGlvc19iYXNlJikpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIERSIDYwLiBXaGF0IGlzIGEgZm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9uPworCS8vIFRoZSBpbnNlcnRlcnMgZm9yIG1hbmlwdWxhdG9ycyBhcmUgKm5vdCogZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMuCisJX19wZigqdGhpcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgICAgLy9AfQorCisgICAgICAvLyBbMjcuNi4yLjUuMl0gYXJpdGhtZXRpYyBpbnNlcnRlcnMKKyAgICAgIC8qKgorICAgICAgICogIEBuYW1lIEFyaXRobWV0aWMgSW5zZXJ0ZXJzCisgICAgICAgKgorICAgICAgICogIEFsbCB0aGUgQGMgb3BlcmF0b3I8PCBmdW5jdGlvbnMgKGFrYSA8ZW0+Zm9ybWF0dGVkIG91dHB1dAorICAgICAgICogIGZ1bmN0aW9uczwvZW0+KSBoYXZlIHNvbWUgY29tbW9uIGJlaGF2aW9yLiAgRWFjaCBzdGFydHMgYnkKKyAgICAgICAqICBjb25zdHJ1Y3RpbmcgYSB0ZW1wb3Jhcnkgb2JqZWN0IG9mIHR5cGUgc3RkOjpiYXNpY19vc3RyZWFtOjpzZW50cnkuCisgICAgICAgKiAgVGhpcyBjYW4gaGF2ZSBzZXZlcmFsIGVmZmVjdHMsIGNvbmNsdWRpbmcgd2l0aCB0aGUgc2V0dGluZyBvZiBhCisgICAgICAgKiAgc3RhdHVzIGZsYWc7IHNlZSB0aGUgc2VudHJ5IGRvY3VtZW50YXRpb24gZm9yIG1vcmUuCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBzZW50cnkgc3RhdHVzIGlzIGdvb2QsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBnZW5lcmF0ZQorICAgICAgICogIHdoYXRldmVyIGRhdGEgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgaW5zZXJ0aW9uLCBpb3NfYmFzZTo6YmFkYml0CisgICAgICAgKiAgd2lsbCBiZSB0dXJuZWQgb24gaW4gdGhlIHN0cmVhbSdzIGVycm9yIHN0YXRlIHdpdGhvdXQgY2F1c2luZyBhbgorICAgICAgICogIGlvc19iYXNlOjpmYWlsdXJlIHRvIGJlIHRocm93bi4gIFRoZSBvcmlnaW5hbCBleGNlcHRpb24gd2lsbCB0aGVuCisgICAgICAgKiAgYmUgcmV0aHJvd24uCisgICAgICAqLworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBCYXNpYyBhcml0aG1ldGljIGluc2VydGVycworICAgICAgICogIEBwYXJhbSAgQSB2YXJpYWJsZSBvZiBidWlsdGluIHR5cGUuCisgICAgICAgKiAgQHJldHVybiAgQGMgKnRoaXMgaWYgc3VjY2Vzc2Z1bAorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgdXNlIHRoZSBzdHJlYW0ncyBjdXJyZW50IGxvY2FsZSAoc3BlY2lmaWNhbGx5LCB0aGUKKyAgICAgICAqICBAYyBudW1fZ2V0IGZhY2V0KSB0byBwZXJmb3JtIG51bWVyaWMgZm9ybWF0dGluZy4KKyAgICAgICovCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KGxvbmcgX19uKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fbik7IH0KKyAgICAgIAorICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIF9fbikKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydChfX24pOyB9CQorCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KGJvb2wgX19uKQorICAgICAgeyByZXR1cm4gX01faW5zZXJ0KF9fbik7IH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I8PChzaG9ydCBfX24pOworCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KHVuc2lnbmVkIHNob3J0IF9fbikKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19uKSk7CisgICAgICB9CisKKyAgICAgIF9fb3N0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPDwoaW50IF9fbik7CisKKyAgICAgIF9fb3N0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IF9fbikKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19uKSk7CisgICAgICB9CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfTE9OR19MT05HCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KGxvbmcgbG9uZyBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19uKTsgfQkKKyNlbmRpZgorCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KGRvdWJsZSBfX2YpCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19mKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KGZsb2F0IF9fZikKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTE3LiBiYXNpY19vc3RyZWFtIHVzZXMgbm9uZXhpc3RlbnQgbnVtX3B1dCBtZW1iZXIgZnVuY3Rpb25zLgorCXJldHVybiBfTV9pbnNlcnQoc3RhdGljX2Nhc3Q8ZG91YmxlPihfX2YpKTsKKyAgICAgIH0KKworICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgb3BlcmF0b3I8PChsb25nIGRvdWJsZSBfX2YpCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX19mKTsgfQorCisgICAgICBfX29zdHJlYW1fdHlwZSYgCisgICAgICBvcGVyYXRvcjw8KGNvbnN0IHZvaWQqIF9fcCkKKyAgICAgIHsgcmV0dXJuIF9NX2luc2VydChfX3ApOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRXh0cmFjdGluZyBmcm9tIGFub3RoZXIgc3RyZWFtYnVmLgorICAgICAgICogIEBwYXJhbSAgc2IgIEEgcG9pbnRlciB0byBhIHN0cmVhbWJ1ZgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBvbmUgb2YgdGhlIGJhc2ljIGFyaXRobWV0aWMgZXh0cmFjdG9ycywKKyAgICAgICAqICBpbiB0aGF0IGl0IGFsc28gY29uc3RydWN0cyBhIHNlbnRyeSBvYmplY3QgYW5kIGhhcyB0aGUgc2FtZSBlcnJvcgorICAgICAgICogIGhhbmRsaW5nIGJlaGF2aW9yLgorICAgICAgICoKKyAgICAgICAqICBJZiBAYSBzYiBpcyBOVUxMLCB0aGUgc3RyZWFtIHdpbGwgc2V0IGZhaWxiaXQgaW4gaXRzIGVycm9yIHN0YXRlLgorICAgICAgICoKKyAgICAgICAqICBDaGFyYWN0ZXJzIGFyZSBleHRyYWN0ZWQgZnJvbSBAYSBzYiBhbmQgaW5zZXJ0ZWQgaW50byBAYyAqdGhpcworICAgICAgICogIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9jY3VyczoKKyAgICAgICAqCisgICAgICAgKiAgLSB0aGUgaW5wdXQgc3RyZWFtIHJlYWNoZXMgZW5kLW9mLWZpbGUsCisgICAgICAgKiAgLSBpbnNlcnRpb24gaW50byB0aGUgb3V0cHV0IHNlcXVlbmNlIGZhaWxzIChpbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICogICAgY2hhcmFjdGVyIHRoYXQgd291bGQgaGF2ZSBiZWVuIGluc2VydGVkIGlzIG5vdCBleHRyYWN0ZWQpLCBvcgorICAgICAgICogIC0gYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBnZXR0aW5nIGEgY2hhcmFjdGVyIGZyb20gQGEgc2IsIHdoaWNoCisgICAgICAgKiAgICBzZXRzIGZhaWxiaXQgaW4gdGhlIGVycm9yIHN0YXRlCisgICAgICAgKgorICAgICAgICogIElmIHRoZSBmdW5jdGlvbiBpbnNlcnRzIG5vIGNoYXJhY3RlcnMsIGZhaWxiaXQgaXMgc2V0LgorICAgICAgKi8KKyAgICAgIF9fb3N0cmVhbV90eXBlJiAKKyAgICAgIG9wZXJhdG9yPDwoX19zdHJlYW1idWZfdHlwZSogX19zYik7CisgICAgICAvL0B9CisKKyAgICAgIC8vIFsyNy42LjIuNl0gdW5mb3JtYXR0ZWQgb3V0cHV0IGZ1bmN0aW9ucworICAgICAgLyoqCisgICAgICAgKiAgQG5hbWUgVW5mb3JtYXR0ZWQgT3V0cHV0IEZ1bmN0aW9ucworICAgICAgICoKKyAgICAgICAqICBBbGwgdGhlIHVuZm9ybWF0dGVkIG91dHB1dCBmdW5jdGlvbnMgaGF2ZSBzb21lIGNvbW1vbiBiZWhhdmlvci4KKyAgICAgICAqICBFYWNoIHN0YXJ0cyBieSBjb25zdHJ1Y3RpbmcgYSB0ZW1wb3Jhcnkgb2JqZWN0IG9mIHR5cGUKKyAgICAgICAqICBzdGQ6OmJhc2ljX29zdHJlYW06OnNlbnRyeS4gIFRoaXMgaGFzIHNldmVyYWwgZWZmZWN0cywgY29uY2x1ZGluZworICAgICAgICogIHdpdGggdGhlIHNldHRpbmcgb2YgYSBzdGF0dXMgZmxhZzsgc2VlIHRoZSBzZW50cnkgZG9jdW1lbnRhdGlvbgorICAgICAgICogIGZvciBtb3JlLgorICAgICAgICoKKyAgICAgICAqICBJZiB0aGUgc2VudHJ5IHN0YXR1cyBpcyBnb29kLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZ2VuZXJhdGUKKyAgICAgICAqICB3aGF0ZXZlciBkYXRhIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQuCisgICAgICAgKgorICAgICAgICogIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGluc2VydGlvbiwgaW9zX2Jhc2U6OmJhZGJpdAorICAgICAgICogIHdpbGwgYmUgdHVybmVkIG9uIGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZS4gIElmIGJhZGJpdCBpcyBvbiBpbgorICAgICAgICogIHRoZSBzdHJlYW0ncyBleGNlcHRpb25zIG1hc2ssIHRoZSBleGNlcHRpb24gd2lsbCBiZSByZXRocm93bgorICAgICAgICogIHdpdGhvdXQgY29tcGxldGluZyBpdHMgYWN0aW9ucy4KKyAgICAgICovCisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNpbXBsZSBpbnNlcnRpb24uCisgICAgICAgKiAgQHBhcmFtICBjICBUaGUgY2hhcmFjdGVyIHRvIGluc2VydC4KKyAgICAgICAqICBAcmV0dXJuICAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUcmllcyB0byBpbnNlcnQgQGEgYy4KKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG92ZXJsb2FkZWQgb24gc2lnbmVkIGNoYXIgYW5kCisgICAgICAgKiAgICAgICAgIHVuc2lnbmVkIGNoYXIuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgcHV0KGNoYXJfdHlwZSBfX2MpOworCisgICAgICAvLyBDb3JlIHdyaXRlIGZ1bmN0aW9uYWxpdHksIHdpdGhvdXQgc2VudHJ5LgorICAgICAgdm9pZAorICAgICAgX01fd3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgeworCWNvbnN0IHN0cmVhbXNpemUgX19wdXQgPSB0aGlzLT5yZGJ1ZigpLT5zcHV0bihfX3MsIF9fbik7CisJaWYgKF9fcHV0ICE9IF9fbikKKwkgIHRoaXMtPnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYXJhY3RlciBzdHJpbmcgaW5zZXJ0aW9uLgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIGFycmF5IHRvIGluc2VydC4KKyAgICAgICAqICBAcGFyYW0gIG4gIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5zZXJ0LgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIENoYXJhY3RlcnMgYXJlIGNvcGllZCBmcm9tIEBhIHMgYW5kIGluc2VydGVkIGludG8gdGhlIHN0cmVhbSB1bnRpbAorICAgICAgICogIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhhcHBlbnM6CisgICAgICAgKgorICAgICAgICogIC0gQGEgbiBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZAorICAgICAgICogIC0gaW5zZXJ0aW5nIGludG8gdGhlIG91dHB1dCBzZXF1ZW5jZSBmYWlscyAoaW4gdGhpcyBjYXNlLCBiYWRiaXQKKyAgICAgICAqICAgIHdpbGwgYmUgc2V0IGluIHRoZSBzdHJlYW0ncyBlcnJvciBzdGF0ZSkKKyAgICAgICAqCisgICAgICAgKiAgQG5vdGUgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG92ZXJsb2FkZWQgb24gc2lnbmVkIGNoYXIgYW5kCisgICAgICAgKiAgICAgICAgIHVuc2lnbmVkIGNoYXIuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgd3JpdGUoY29uc3QgY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKTsKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTeW5jaHJvbml6aW5nIHRoZSBzdHJlYW0gYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIHJkYnVmKCkgaXMgYSBudWxsIHBvaW50ZXIsIGNoYW5nZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgT3RoZXJ3aXNlLCBjYWxscyBAYyByZGJ1ZigpLT5wdWJzeW5jKCksIGFuZCBpZiB0aGF0IHJldHVybnMgLTEsCisgICAgICAgKiAgc2V0cyBiYWRiaXQuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgZmx1c2goKTsKKworICAgICAgLy8gWzI3LjYuMi40XSBzZWVrIG1lbWJlcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0dGluZyB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbi4KKyAgICAgICAqICBAcmV0dXJuICBBIGZpbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBJZiBAYyBmYWlsKCkgaXMgbm90IGZhbHNlLCByZXR1cm5zIEBjIHBvc190eXBlKC0xKSB0byBpbmRpY2F0ZQorICAgICAgICogIGZhaWx1cmUuICBPdGhlcndpc2UgcmV0dXJucyBAYyByZGJ1ZigpLT5wdWJzZWVrb2ZmKDAsY3VyLG91dCkuCisgICAgICAqLworICAgICAgcG9zX3R5cGUgCisgICAgICB0ZWxscCgpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgcG9zICBBIGZpbGUgcG9zaXRpb24gb2JqZWN0LgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIGZhaWwoKSBpcyBub3QgdHJ1ZSwgY2FsbHMgQGMgcmRidWYoKS0+cHVic2Vla3Bvcyhwb3MpLiAgSWYKKyAgICAgICAqICB0aGF0IGZ1bmN0aW9uIGZhaWxzLCBzZXRzIGZhaWxiaXQuCisgICAgICAqLworICAgICAgX19vc3RyZWFtX3R5cGUmIAorICAgICAgc2Vla3AocG9zX3R5cGUpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENoYW5naW5nIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgb2ZmICBBIGZpbGUgb2Zmc2V0IG9iamVjdC4KKyAgICAgICAqICBAcGFyYW0gIGRpciAgVGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0byBzZWVrLgorICAgICAgICogIEByZXR1cm4gICp0aGlzCisgICAgICAgKgorICAgICAgICogIElmIEBjIGZhaWwoKSBpcyBub3QgdHJ1ZSwgY2FsbHMgQGMgcmRidWYoKS0+cHVic2Vla29mZihvZmYsZGlyKS4KKyAgICAgICAqICBJZiB0aGF0IGZ1bmN0aW9uIGZhaWxzLCBzZXRzIGZhaWxiaXQuCisgICAgICAqLworICAgICAgIF9fb3N0cmVhbV90eXBlJiAKKyAgICAgIHNlZWtwKG9mZl90eXBlLCBpb3NfYmFzZTo6c2Vla2Rpcik7CisgICAgICAKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBiYXNpY19vc3RyZWFtKCkKKyAgICAgIHsgdGhpcy0+aW5pdCgwKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWVUPgorICAgICAgICBfX29zdHJlYW1fdHlwZSYKKyAgICAgICAgX01faW5zZXJ0KF9WYWx1ZVQgX192KTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmICBQZXJmb3JtcyBzZXR1cCB3b3JrIGZvciBvdXRwdXQgc3RyZWFtcy4KKyAgICoKKyAgICogIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgY3JlYXRlZCBiZWZvcmUgYWxsIG9mIHRoZSBzdGFuZGFyZAorICAgKiAgaW5zZXJ0ZXJzIGFyZSBydW4uICBJdCBpcyByZXNwb25zaWJsZSBmb3IgPGVtPmV4Y2VwdGlvbi1zYWZlIHByZWZpeCBhbmQKKyAgICogIHN1ZmZpeCBvcGVyYXRpb25zPC9lbT4uCisgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+OjpzZW50cnkKKyAgICB7CisgICAgICAvLyBEYXRhIE1lbWJlcnMuCisgICAgICBib29sIAkJCQlfTV9vazsKKyAgICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCV9NX29zOworICAgICAgCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgY29uc3RydWN0b3IgcGVyZm9ybXMgcHJlcGFyYXRvcnkgd29yay4KKyAgICAgICAqICBAcGFyYW0gIG9zICBUaGUgb3V0cHV0IHN0cmVhbSB0byBndWFyZC4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHN0cmVhbSBzdGF0ZSBpcyBnb29kIChAYSBvcy5nb29kKCkgaXMgdHJ1ZSksIHRoZW4gaWYgdGhlCisgICAgICAgKiAgc3RyZWFtIGlzIHRpZWQgdG8gYW5vdGhlciBvdXRwdXQgc3RyZWFtLCBAYyBpcy50aWUoKS0+Zmx1c2goKQorICAgICAgICogIGlzIGNhbGxlZCB0byBzeW5jaHJvbml6ZSB0aGUgb3V0cHV0IHNlcXVlbmNlcy4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIHN0cmVhbSBzdGF0ZSBpcyBzdGlsbCBnb29kLCB0aGVuIHRoZSBzZW50cnkgc3RhdGUgYmVjb21lcworICAgICAgICogIHRydWUgKEBhIG9rYXkpLgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzZW50cnkoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBQb3NzaWJseSBmbHVzaGVzIHRoZSBzdHJlYW0uCisgICAgICAgKgorICAgICAgICogIElmIEBjIGlvc19iYXNlOjp1bml0YnVmIGlzIHNldCBpbiBAYyBvcy5mbGFncygpLCBhbmQKKyAgICAgICAqICBAYyBzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpIGlzIHRydWUsIHRoZSBzZW50cnkgZGVzdHJ1Y3RvciBjYWxscworICAgICAgICogIEBjIGZsdXNoKCkgb24gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICAqLworICAgICAgfnNlbnRyeSgpCisgICAgICB7CisJLy8gWFhYIE1UCisJaWYgKGJvb2woX01fb3MuZmxhZ3MoKSAmIGlvc19iYXNlOjp1bml0YnVmKSAmJiAhdW5jYXVnaHRfZXhjZXB0aW9uKCkpCisJICB7CisJICAgIC8vIENhbid0IGNhbGwgZmx1c2ggZGlyZWN0bHkgb3IgZWxzZSB3aWxsIGdldCBpbnRvIHJlY3Vyc2l2ZSBsb2NrLgorCSAgICBpZiAoX01fb3MucmRidWYoKSAmJiBfTV9vcy5yZGJ1ZigpLT5wdWJzeW5jKCkgPT0gLTEpCisJICAgICAgX01fb3Muc2V0c3RhdGUoaW9zX2Jhc2U6OmJhZGJpdCk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUXVpY2sgc3RhdHVzIGNoZWNraW5nLgorICAgICAgICogIEByZXR1cm4gIFRoZSBzZW50cnkgc3RhdGUuCisgICAgICAgKgorICAgICAgICogIEZvciBlYXNlIG9mIHVzZSwgc2VudHJpZXMgbWF5IGJlIGNvbnZlcnRlZCB0byBib29sZWFucy4gIFRoZQorICAgICAgICogIHJldHVybiB2YWx1ZSBpcyB0aGF0IG9mIHRoZSBzZW50cnkgc3RhdGUgKHRydWUgPT0gb2theSkuCisgICAgICAqLworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleHBsaWNpdAorI2VuZGlmCisgICAgICBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX29rOyB9CisgICAgfTsKKworICAvLyBbMjcuNi4yLjUuNF0gY2hhcmFjdGVyIGluc2VydGlvbiB0ZW1wbGF0ZXMKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgQ2hhcmFjdGVyIGluc2VydGVycworICAgKiAgQHBhcmFtICBvdXQgIEFuIG91dHB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIGMgIEEgY2hhcmFjdGVyLgorICAgKiAgQHJldHVybiAgb3V0CisgICAqCisgICAqICBCZWhhdmVzIGxpa2Ugb25lIG9mIHRoZSBmb3JtYXR0ZWQgYXJpdGhtZXRpYyBpbnNlcnRlcnMgZGVzY3JpYmVkIGluCisgICAqICBzdGQ6OmJhc2ljX29zdHJlYW0uICBBZnRlciBjb25zdHJ1Y3RpbmcgYSBzZW50cnkgb2JqZWN0IHdpdGggZ29vZAorICAgKiAgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGluc2VydHMgYSBzaW5nbGUgY2hhcmFjdGVyIGFuZCBhbnkgcmVxdWlyZWQKKyAgICogIHBhZGRpbmcgKGFzIGRldGVybWluZWQgYnkgWzIyLjIuMi4yLjJdKS4gIEBjIG91dC53aWR0aCgwKSBpcyB0aGVuCisgICAqICBjYWxsZWQuCisgICAqCisgICAqICBJZiBAYSBjIGlzIG9mIHR5cGUgQGMgY2hhciBhbmQgdGhlIGNoYXJhY3RlciB0eXBlIG9mIHRoZSBzdHJlYW0gaXMgbm90CisgICAqICBAYyBjaGFyLCB0aGUgY2hhcmFjdGVyIGlzIHdpZGVuZWQgYmVmb3JlIGluc2VydGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBfQ2hhclQgX19jKQorICAgIHsgcmV0dXJuIF9fb3N0cmVhbV9pbnNlcnQoX19vdXQsICZfX2MsIDEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjaGFyIF9fYykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgX19vdXQud2lkZW4oX19jKSk7IH0KKworICAvLyBTcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZSA8Y2xhc3MgX1RyYWl0cz4gCisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY2hhciBfX2MpCisgICAgeyByZXR1cm4gX19vc3RyZWFtX2luc2VydChfX291dCwgJl9fYywgMSk7IH0KKworICAvLyBTaWduZWQgYW5kIHVuc2lnbmVkCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgc2lnbmVkIGNoYXIgX19jKQorICAgIHsgcmV0dXJuIChfX291dCA8PCBzdGF0aWNfY2FzdDxjaGFyPihfX2MpKTsgfQorICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1RyYWl0cz4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxjaGFyLCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3V0LCB1bnNpZ25lZCBjaGFyIF9fYykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oX19jKSk7IH0KKyAgLy9AfQorICAKKyAgLy9AeworICAvKioKKyAgICogIEBicmllZiAgU3RyaW5nIGluc2VydGVycworICAgKiAgQHBhcmFtICBvdXQgIEFuIG91dHB1dCBzdHJlYW0uCisgICAqICBAcGFyYW0gIHMgIEEgY2hhcmFjdGVyIHN0cmluZy4KKyAgICogIEByZXR1cm4gIG91dAorICAgKiAgQHByZSAgQGEgcyBtdXN0IGJlIGEgbm9uLU5VTEwgcG9pbnRlcgorICAgKgorICAgKiAgQmVoYXZlcyBsaWtlIG9uZSBvZiB0aGUgZm9ybWF0dGVkIGFyaXRobWV0aWMgaW5zZXJ0ZXJzIGRlc2NyaWJlZCBpbgorICAgKiAgc3RkOjpiYXNpY19vc3RyZWFtLiAgQWZ0ZXIgY29uc3RydWN0aW5nIGEgc2VudHJ5IG9iamVjdCB3aXRoIGdvb2QKKyAgICogIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBpbnNlcnRzIEBjIHRyYWl0czo6bGVuZ3RoKHMpIGNoYXJhY3RlcnMgc3RhcnRpbmcKKyAgICogIGF0IEBhIHMsIHdpZGVuZWQgaWYgbmVjZXNzYXJ5LCBmb2xsb3dlZCBieSBhbnkgcmVxdWlyZWQgcGFkZGluZyAoYXMKKyAgICogIGRldGVybWluZWQgYnkgWzIyLjIuMi4yLjJdKS4gIEBjIG91dC53aWR0aCgwKSBpcyB0aGVuIGNhbGxlZC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBfQ2hhclQqIF9fcykKKyAgICB7CisgICAgICBpZiAoIV9fcykKKwlfX291dC5zZXRzdGF0ZShpb3NfYmFzZTo6YmFkYml0KTsKKyAgICAgIGVsc2UKKwlfX29zdHJlYW1faW5zZXJ0KF9fb3V0LCBfX3MsCisJCQkgc3RhdGljX2Nhc3Q8c3RyZWFtc2l6ZT4oX1RyYWl0czo6bGVuZ3RoKF9fcykpKTsKKyAgICAgIHJldHVybiBfX291dDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAmCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCBjaGFyKiBfX3MpOworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb25zCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY29uc3QgY2hhciogX19zKQorICAgIHsKKyAgICAgIGlmICghX19zKQorCV9fb3V0LnNldHN0YXRlKGlvc19iYXNlOjpiYWRiaXQpOworICAgICAgZWxzZQorCV9fb3N0cmVhbV9pbnNlcnQoX19vdXQsIF9fcywKKwkJCSBzdGF0aWNfY2FzdDxzdHJlYW1zaXplPihfVHJhaXRzOjpsZW5ndGgoX19zKSkpOworICAgICAgcmV0dXJuIF9fb3V0OworICAgIH0KKworICAvLyBTaWduZWQgYW5kIHVuc2lnbmVkCisgIHRlbXBsYXRlPGNsYXNzIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+JiBfX291dCwgY29uc3Qgc2lnbmVkIGNoYXIqIF9fcykKKyAgICB7IHJldHVybiAoX19vdXQgPDwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19zKSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPGNoYXIsIF9UcmFpdHM+ICYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08Y2hhciwgX1RyYWl0cz4mIF9fb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX3MpCisgICAgeyByZXR1cm4gKF9fb3V0IDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KF9fcykpOyB9CisgIC8vQH0KKworICAvLyBbMjcuNi4yLjddIHN0YW5kYXJkIGJhc2ljX29zdHJlYW0gbWFuaXB1bGF0b3JzCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBhIG5ld2xpbmUgYW5kIGZsdXNoIHRoZSBzdHJlYW0uCisgICAqCisgICAqICBUaGlzIG1hbmlwdWxhdG9yIGlzIG9mdGVuIG1pc3Rha2VubHkgdXNlZCB3aGVuIGEgc2ltcGxlIG5ld2xpbmUgaXMKKyAgICogIGRlc2lyZWQsIGxlYWRpbmcgdG8gcG9vciBidWZmZXJpbmcgcGVyZm9ybWFuY2UuICBTZWUKKyAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1czAyLmh0bWwKKyAgICogIGZvciBtb3JlIG9uIHRoaXMgc3ViamVjdC4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIGVuZGwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zKQorICAgIHsgcmV0dXJuIGZsdXNoKF9fb3MucHV0KF9fb3Mud2lkZW4oJ1xuJykpKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBXcml0ZSBhIG51bGwgY2hhcmFjdGVyIGludG8gdGhlIG91dHB1dCBzZXF1ZW5jZS4KKyAgICoKKyAgICogIDxlbT5OdWxsIGNoYXJhY3RlcjwvZW0+IGlzIEBjIENoYXJUKCkgYnkgZGVmaW5pdGlvbi4gIEZvciBDaGFyVCBvZiBAYyBjaGFyLAorICAgKiAgdGhpcyBjb3JyZWN0bHkgd3JpdGVzIHRoZSBBU0NJSSBAYyBOVUwgY2hhcmFjdGVyIHN0cmluZyB0ZXJtaW5hdG9yLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgaW5saW5lIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgCisgICAgZW5kcyhiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MpCisgICAgeyByZXR1cm4gX19vcy5wdXQoX0NoYXJUKCkpOyB9CisgIAorICAvKioKKyAgICogIEBicmllZiAgRmx1c2hlcyB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogIFRoaXMgbWFuaXB1bGF0b3Igc2ltcGx5IGNhbGxzIHRoZSBzdHJlYW0ncyBAYyBmbHVzaCgpIG1lbWJlciBmdW5jdGlvbi4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIAorICAgIGZsdXNoKGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcykKKyAgICB7IHJldHVybiBfX29zLmZsdXNoKCk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vIFsyNy43LjIuOV0gUnZhbHVlIHN0cmVhbSBpbnNlcnRpb24KKyAgLyoqCisgICAqICBAYnJpZWYgIEdlbmVyaWMgaW5zZXJ0ZXIgZm9yIHJ2YWx1ZSBzdHJlYW0KKyAgICogIEBwYXJhbSAgb3MgIEFuIGlucHV0IHN0cmVhbS4KKyAgICogIEBwYXJhbSAgeCAgQSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBiZWluZyBpbnNlcnRlZC4KKyAgICogIEByZXR1cm4gIG9zCisgICAqCisgICAqICBUaGlzIGlzIGp1c3QgYSBmb3J3YXJkaW5nIGZ1bmN0aW9uIHRvIGFsbG93IGluc2VydGlvbiB0bworICAgKiAgcnZhbHVlIHN0cmVhbXMgc2luY2UgdGhleSB3b24ndCBiaW5kIHRvIHRoZSBpbnNlcnRlciBmdW5jdGlvbnMKKyAgICogIHRoYXQgdGFrZSBhbiBsdmFsdWUgcmVmZXJlbmNlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiYgX19vcywgY29uc3QgX1RwJiBfX3gpCisgICAgeyByZXR1cm4gKF9fb3MgPDwgX194KTsgfQorI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvb3N0cmVhbS50Y2M+CisKKyNlbmRpZgkvKiBfR0xJQkNYWF9PU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvYmFzZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE3NDQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2Jhc2UuaApAQCAtMCwwICsxLDY2IEBACisvLyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorLy8gTUEgMDIxMTEtMTMwNywgVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUKKy8vIHNvZnR3YXJlIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMKKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzCisvLyBmaWxlLCBvciB5b3UgY29tcGlsZSB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0bworLy8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZQorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlcgorLy8gcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbAorLy8gUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL2Jhc2UuaAorICogIEBicmllZiBTZXF1ZW50aWFsIGhlbHBlciBmdW5jdGlvbnMuCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdQorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfQkFTRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfQkFTRV9IIDEKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8cHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmg+CisKKy8vIFByb2ZpbGluZyBtb2RlIG5hbWVzcGFjZXMuCisKKy8qKgorICogQG5hbWVzcGFjZSBzdGQ6Ol9fcHJvZmlsZQorICogQGJyaWVmIEdOVSBwcm9maWxlIGNvZGUsIHJlcGxhY2VzIHN0YW5kYXJkIGJlaGF2aW9yIHdpdGggcHJvZmlsZSBiZWhhdmlvci4KKyAqLworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpIAoreyAKKyAgbmFtZXNwYWNlIF9fcHJvZmlsZSB7IH0gCit9CisKKy8qKgorICogQG5hbWVzcGFjZSBfX2dudV9wcm9maWxlCisgKiBAYnJpZWYgR05VIHByb2ZpbGUgY29kZSBmb3IgcHVibGljIHVzZS4KKyAqLworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLy8gSW1wb3J0IGFsbCB0aGUgcHJvZmlsZSB2ZXJzaW9ucyBvZiBjb21wb25lbnRzIGluIG5hbWVzcGFjZSBzdGQuCisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6Ol9fcHJvZmlsZTsKK30KKworCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9iaXRzZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvYml0c2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MWYxZWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvYml0c2V0CkBAIC0wLDAgKzEsMzc3IEBACisvLyBQcm9maWxpbmcgYml0c2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9iaXRzZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9CSVRTRVQKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9CSVRTRVQKKworI2luY2x1ZGUgPGJpdHNldD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OmJpdHNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTxzaXplX3QgX05iPgorICAgIGNsYXNzIGJpdHNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmJpdHNldDxfTmI+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgLy8gYml0IHJlZmVyZW5jZToKKyAgICAgIGNsYXNzIHJlZmVyZW5jZQorICAgICAgOiBwcml2YXRlIF9CYXNlOjpyZWZlcmVuY2UKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgX0Jhc2VfcmVmOworCisJZnJpZW5kIGNsYXNzIGJpdHNldDsKKwlyZWZlcmVuY2UoKTsKKworCXJlZmVyZW5jZShjb25zdCBfQmFzZV9yZWYmIF9fYmFzZSwgYml0c2V0KiBfX3NlcSkKKwk6IF9CYXNlX3JlZihfX2Jhc2UpCisJeyB9CisKKyAgICAgIHB1YmxpYzoKKwlyZWZlcmVuY2UoY29uc3QgcmVmZXJlbmNlJiBfX3gpCisJOiBfQmFzZV9yZWYoX194KQorCXsgfQorCisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShib29sIF9feCkKKwl7CisJICAqc3RhdGljX2Nhc3Q8X0Jhc2VfcmVmKj4odGhpcykgPSBfX3g7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJcmVmZXJlbmNlJgorCW9wZXJhdG9yPShjb25zdCByZWZlcmVuY2UmIF9feCkKKwl7CisJICAqc3RhdGljX2Nhc3Q8X0Jhc2VfcmVmKj4odGhpcykgPSBfX3g7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisJYm9vbAorCW9wZXJhdG9yfigpIGNvbnN0CisJeworCSAgcmV0dXJuIH4oKnN0YXRpY19jYXN0PGNvbnN0IF9CYXNlX3JlZio+KHRoaXMpKTsKKwl9CisKKwlvcGVyYXRvciBib29sKCkgY29uc3QKKwl7CisJICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9CYXNlX3JlZio+KHRoaXMpOworCX0KKworCXJlZmVyZW5jZSYKKwlmbGlwKCkKKwl7CisJICBfQmFzZV9yZWY6OmZsaXAoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisgICAgICB9OworCisgICAgICAvLyAyMy4zLjUuMSBjb25zdHJ1Y3RvcnM6CisgICAgICBfR0xJQkNYWF9DT05TVEVYUFIgYml0c2V0KCkgOiBfQmFzZSgpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGNvbnN0ZXhwciBiaXRzZXQodW5zaWduZWQgbG9uZyBsb25nIF9fdmFsKQorI2Vsc2UKKyAgICAgIGJpdHNldCh1bnNpZ25lZCBsb25nIF9fdmFsKQorI2VuZGlmCisgICAgICA6IF9CYXNlKF9fdmFsKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIGJpdHNldChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4mIF9fc3RyLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX3BvcyA9IDAsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisJICAgICAgIF9fbiA9IChzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46Om5wb3MpKQorCTogX0Jhc2UoX19zdHIsIF9fcG9zLCBfX24pIHsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAzOTYuIHdoYXQgYXJlIGNoYXJhY3RlcnMgemVybyBhbmQgb25lLgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzLCBjbGFzcyBfQWxsb2M+CisJYml0c2V0KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPiYgX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPjo6c2l6ZV90eXBlCisJICAgICAgIF9fcG9zLAorCSAgICAgICB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz46OnNpemVfdHlwZQorCSAgICAgICBfX24sCisJICAgICAgIF9DaGFyVCBfX3plcm8sIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorCTogX0Jhc2UoX19zdHIsIF9fcG9zLCBfX24sIF9femVybywgX19vbmUpIHsgfQorCisgICAgICBiaXRzZXQoY29uc3QgX0Jhc2UmIF9feCkgOiBfQmFzZShfX3gpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYml0c2V0KGNvbnN0IF9DaGFyVCogX19zdHIsCisJICAgICAgIHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVD46OnNpemVfdHlwZSBfX24KKwkgICAgICAgPSBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQ+OjpucG9zLAorCSAgICAgICBfQ2hhclQgX196ZXJvID0gX0NoYXJUKCcwJyksIF9DaGFyVCBfX29uZSA9IF9DaGFyVCgnMScpKQorCTogX0Jhc2UoX19zdHIsIF9fbiwgX196ZXJvLCBfX29uZSkgeyB9CisjZW5kaWYKKworICAgICAgLy8gMjMuMy41LjIgYml0c2V0IG9wZXJhdGlvbnM6CisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yJj0oY29uc3QgYml0c2V0PF9OYj4mIF9fcmhzKQorICAgICAgeworCV9NX2Jhc2UoKSAmPSBfX3JoczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgb3BlcmF0b3J8PShjb25zdCBiaXRzZXQ8X05iPiYgX19yaHMpCisgICAgICB7CisJX01fYmFzZSgpIHw9IF9fcmhzOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcl49KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykKKyAgICAgIHsKKwlfTV9iYXNlKCkgXj0gX19yaHM7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIG9wZXJhdG9yPDw9KHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlfTV9iYXNlKCkgPDw9IF9fcG9zOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBvcGVyYXRvcj4+PShzaXplX3QgX19wb3MpCisgICAgICB7CisJX01fYmFzZSgpID4+PSBfX3BvczsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgc2V0KCkKKyAgICAgIHsKKwlfQmFzZTo6c2V0KCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAxODYuIGJpdHNldDo6c2V0KCkgc2Vjb25kIHBhcmFtZXRlciBzaG91bGQgYmUgYm9vbAorICAgICAgYml0c2V0PF9OYj4mCisgICAgICBzZXQoc2l6ZV90IF9fcG9zLCBib29sIF9fdmFsID0gdHJ1ZSkKKyAgICAgIHsKKwlfQmFzZTo6c2V0KF9fcG9zLCBfX3ZhbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiYKKyAgICAgIHJlc2V0KCkKKyAgICAgIHsKKwlfQmFzZTo6cmVzZXQoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGJpdHNldDxfTmI+JgorICAgICAgcmVzZXQoc2l6ZV90IF9fcG9zKQorICAgICAgeworCV9CYXNlOjpyZXNldChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBiaXRzZXQ8X05iPiBvcGVyYXRvcn4oKSBjb25zdCB7IHJldHVybiBiaXRzZXQofl9NX2Jhc2UoKSk7IH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKCkKKyAgICAgIHsKKwlfQmFzZTo6ZmxpcCgpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgYml0c2V0PF9OYj4mCisgICAgICBmbGlwKHNpemVfdCBfX3BvcykKKyAgICAgIHsKKwlfQmFzZTo6ZmxpcChfX3Bvcyk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvLyBlbGVtZW50IGFjY2VzczoKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDExLiBCaXRzZXQgbWlub3IgcHJvYmxlbXMKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3MpCisgICAgICB7CisJcmV0dXJuIHJlZmVyZW5jZShfTV9iYXNlKClbX19wb3NdLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTEuIEJpdHNldCBtaW5vciBwcm9ibGVtcworICAgICAgYm9vbAorICAgICAgb3BlcmF0b3JbXShzaXplX3QgX19wb3MpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX3Bvc107CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjp0b191bG9uZzsKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdXNpbmcgX0Jhc2U6OnRvX3VsbG9uZzsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7IHJldHVybiBfTV9iYXNlKCkudGVtcGxhdGUgdG9fc3RyaW5nPF9DaGFyVCwgX1RyYWl0cywgX0FsbG9jPigpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDM5Ni4gd2hhdCBhcmUgY2hhcmFjdGVycyB6ZXJvIGFuZCBvbmUuCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQ2hhclQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvYz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4KKwl0b19zdHJpbmcoX0NoYXJUIF9femVybywgX0NoYXJUIF9fb25lID0gX0NoYXJUKCcxJykpIGNvbnN0CisJeworCSAgcmV0dXJuIF9NX2Jhc2UoKS50ZW1wbGF0ZQorCSAgICB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+KF9femVybywgX19vbmUpOworCX0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gNDM0LiBiaXRzZXQ6OnRvX3N0cmluZygpIGhhcmQgdG8gdXNlLgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorICAgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgICB7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA4NTMuIHRvX3N0cmluZyBuZWVkcyB1cGRhdGluZyB3aXRoIHplcm8gYW5kIG9uZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7IHJldHVybiB0b19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxfQ2hhclQsIHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+CisgICAgICAgIHRvX3N0cmluZygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphbGxvY2F0b3I8X0NoYXJUPiA+KCk7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJUPgorCXN0ZDo6YmFzaWNfc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPF9DaGFyVD4gPgorCXRvX3N0cmluZyhfQ2hhclQgX196ZXJvLCBfQ2hhclQgX19vbmUgPSBfQ2hhclQoJzEnKSkgY29uc3QKKwl7CisJICByZXR1cm4gdG9fc3RyaW5nPF9DaGFyVCwgc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+LAorCSAgICAgICAgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcjxfQ2hhclQ+ID4oX196ZXJvLCBfX29uZSk7CisJfQorCisgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBzdGQ6OmFsbG9jYXRvcjxjaGFyPiA+CisgICAgICB0b19zdHJpbmcoKSBjb25zdAorICAgICAgeworCXJldHVybiB0b19zdHJpbmc8Y2hhcixzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4oKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwgc3RkOjphbGxvY2F0b3I8Y2hhcj4gPgorICAgICAgdG9fc3RyaW5nKGNoYXIgX196ZXJvLCBjaGFyIF9fb25lID0gJzEnKSBjb25zdAorICAgICAgeworCXJldHVybiB0b19zdHJpbmc8Y2hhciwgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiwKKwkgICAgICAgICAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4oX196ZXJvLCBfX29uZSk7CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKSA9PSBfX3JoczsgfQorCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IGJpdHNldDxfTmI+JiBfX3JocykgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2Jhc2UoKSAhPSBfX3JoczsgfQorCisgICAgICB1c2luZyBfQmFzZTo6dGVzdDsKKyAgICAgIHVzaW5nIF9CYXNlOjphbGw7CisgICAgICB1c2luZyBfQmFzZTo6YW55OworICAgICAgdXNpbmcgX0Jhc2U6Om5vbmU7CisKKyAgICAgIGJpdHNldDxfTmI+CisgICAgICBvcGVyYXRvcjw8KHNpemVfdCBfX3BvcykgY29uc3QKKyAgICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9NX2Jhc2UoKSA8PCBfX3Bvcyk7IH0KKworICAgICAgYml0c2V0PF9OYj4KKyAgICAgIG9wZXJhdG9yPj4oc2l6ZV90IF9fcG9zKSBjb25zdAorICAgICAgeyByZXR1cm4gYml0c2V0PF9OYj4oX01fYmFzZSgpID4+IF9fcG9zKTsgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yJihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgJj0gX195OyB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yfChjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgfD0gX195OyB9CisKKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBiaXRzZXQ8X05iPgorICAgIG9wZXJhdG9yXihjb25zdCBiaXRzZXQ8X05iPiYgX194LCBjb25zdCBiaXRzZXQ8X05iPiYgX195KQorICAgIHsgcmV0dXJuIGJpdHNldDxfTmI+KF9feCkgXj0gX195OyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsIGJpdHNldDxfTmI+JiBfX3gpCisgICAgeyByZXR1cm4gX19pcyA+PiBfX3guX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCBzaXplX3QgX05iPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGJpdHNldDxfTmI+JiBfX3gpCisgICAgeyByZXR1cm4gX19vcyA8PCBfX3guX01fYmFzZSgpOyB9Cit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8vIERSIDExODIuCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIGJpdHNldC4KKyAgdGVtcGxhdGU8c2l6ZV90IF9OYj4KKyAgICBzdHJ1Y3QgaGFzaDxfX3Byb2ZpbGU6OmJpdHNldDxfTmI+PgorICAgIDogcHVibGljIF9faGFzaF9iYXNlPHNpemVfdCwgX19wcm9maWxlOjpiaXRzZXQ8X05iPj4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX19wcm9maWxlOjpiaXRzZXQ8X05iPiYgX19iKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpoYXNoPF9HTElCQ1hYX1NURF9DOjpiaXRzZXQ8X05iPj4oKShfX2IuX01fYmFzZSgpKTsgfQorICAgIH07CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2RlcXVlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2RlcXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMGU1M2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvZGVxdWUKQEAgLTAsMCArMSw0NTEgQEAKKy8vIFByb2ZpbGluZyBkZXF1ZSBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvZGVxdWUKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9ERVFVRQorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0RFUVVFIDEKKworI2luY2x1ZGUgPGRlcXVlPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6ZGVxdWUgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X1RwPiA+CisgICAgY2xhc3MgZGVxdWUKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6ZGVxdWU8X1RwLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgIF9HTElCQ1hYX1NURF9DOjpkZXF1ZTxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKworICAgICAgdHlwZWRlZiBfVHAJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3BvaW50ZXIgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyAyMy4yLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIGRlcXVlKGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19hKSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbikKKyAgICAgIDogX0Jhc2UoX19uKSB7IH0KKworICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSB7IH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgZGVxdWUoc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlID0gX1RwKCksCisJICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBkZXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2EpCisgICAgICAgIHsgfQorCisgICAgICBkZXF1ZShjb25zdCBkZXF1ZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICBkZXF1ZShjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGRlcXVlKGRlcXVlJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsgfQorCisgICAgICBkZXF1ZShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+ZGVxdWUoKSB7IH0KKworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZGVxdWUmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZGVxdWUmCisgICAgICBvcGVyYXRvcj0oZGVxdWUmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGRlcXVlJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfQmFzZTo6YXNzaWduKF9fZmlyc3QsIF9fbGFzdCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CisJX0Jhc2U6OmFzc2lnbihfX24sIF9fdCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCV9CYXNlOjphc3NpZ24oX19sKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjEuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKwlfQmFzZTo6cmVzaXplKF9fc3opOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeworCV9CYXNlOjpyZXNpemUoX19zeiwgX19jKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIF9UcCBfX2MgPSBfVHAoKSkKKyAgICAgIHsKKwlfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisgICAgICB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB1c2luZyBfQmFzZTo6c2hyaW5rX3RvX2ZpdDsKKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CisJcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX01fYmFzZSgpW19fbl07CisgICAgICB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjphdDsKKworICAgICAgcmVmZXJlbmNlCisgICAgICBmcm9udCgpCisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMS4zIG1vZGlmaWVyczoKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisJX0Jhc2U6OnB1c2hfZnJvbnQoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9CYXNlOjpwdXNoX2JhY2soX194KTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2b2lkCisgICAgICBwdXNoX2Zyb250KF9UcCYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9mcm9udChzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgcHVzaF9iYWNrKF9UcCYmIF9feCkKKyAgICAgIHsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShfX3gpKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2Zyb250KF9BcmdzJiYuLi4gX19hcmdzKQorCXsKKwkgIF9CYXNlOjplbXBsYWNlX2Zyb250KHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdm9pZAorICAgICAgICBlbXBsYWNlX2JhY2soX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgX0Jhc2U6OmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGVtcGxhY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisJeworCSAgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6OmVtcGxhY2UoX19wb3NpdGlvbiwKKwkJCQkJICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLik7CisJICByZXR1cm4gaXRlcmF0b3IoX19yZXMpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCXR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX194KTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgeyByZXR1cm4gZW1wbGFjZShfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSk7IH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcCwgaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJX0Jhc2U6Omluc2VydChfX3AsIF9fbCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworCV9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX19uLCBfX3gpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKKwkgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisJICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisJfQorCisgICAgICB2b2lkCisgICAgICBwb3BfZnJvbnQoKQorICAgICAgeworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcG9wX2JhY2soKQorICAgICAgeworCV9CYXNlOjpwb3BfYmFjaygpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpZiAoX19wb3NpdGlvbiA9PSBiZWdpbigpIHx8IF9fcG9zaXRpb24gPT0gZW5kKCktMSkKKwkgIHsKKwkgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKSk7CisJICB9CisJZWxzZQorCSAgeworCSAgICB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7CisJICAgIHJldHVybiBpdGVyYXRvcihfX3Jlcyk7CisJICB9CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCS8vIDE1MS4gY2FuJ3QgY3VycmVudGx5IGNsZWFyKCkgZW1wdHkgY29udGFpbmVyCisgICAgICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoZGVxdWUmIF9feCkKKyAgICAgIHsKKwlfQmFzZTo6c3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisJX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPCBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgIGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGRlcXVlPF9UcCwgX0FsbG9jPiYgX19saHMsCisJICAgICAgY29uc3QgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAoZGVxdWU8X1RwLCBfQWxsb2M+JiBfX2xocywgZGVxdWU8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ZvcndhcmRfbGlzdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9mb3J3YXJkX2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhZjg1NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9mb3J3YXJkX2xpc3QKQEAgLTAsMCArMSwxNzkgQEAKKy8vIDxmb3J3YXJkX2xpc3Q+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgcHJvZmlsZS9mb3J3YXJkX2xpc3QKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgZGVidWcgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfRk9SV0FSRF9MSVNUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfRk9SV0FSRF9MSVNUIDEKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjpmb3J3YXJkX2xpc3Qgd3JhcHBlciB3aXRoIHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyBmb3J3YXJkX2xpc3QKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6Zm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OmZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgLy8gMjMuMi4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0CisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICA6IF9CYXNlKF9fYWwpIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QoY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2UoX19saXN0LCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIGZvcndhcmRfbGlzdChmb3J3YXJkX2xpc3QmJiBfX2xpc3QsIGNvbnN0IF9BbGxvYyYgX19hbCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCksIF9fYWwpCisgICAgICB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGZvcndhcmRfbGlzdChzaXplX3R5cGUgX19uKQorICAgICAgOiBfQmFzZShfX24pCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2FsKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBmb3J3YXJkX2xpc3QoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0FsbG9jJiBfX2FsID0gX0FsbG9jKCkpCisgICAgICAgIDogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2FsKQorICAgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGNvbnN0IGZvcndhcmRfbGlzdCYgX19saXN0KQorICAgICAgOiBfQmFzZShfX2xpc3QpCisgICAgICB7IH0KKworICAgICAgZm9yd2FyZF9saXN0KGZvcndhcmRfbGlzdCYmIF9fbGlzdCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9fbGlzdCkpIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3Qoc3RkOjppbml0aWFsaXplcl9saXN0PF9UcD4gX19pbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfQWxsb2MmIF9fYWwgPSBfQWxsb2MoKSkKKyAgICAgIDogX0Jhc2UoX19pbCwgX19hbCkKKyAgICAgIHsgfQorCisgICAgICB+Zm9yd2FyZF9saXN0KCkKKyAgICAgIHsgfQorCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oY29uc3QgZm9yd2FyZF9saXN0JiBfX2xpc3QpCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0Jhc2UmPigqdGhpcykgPSBfX2xpc3Q7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBmb3J3YXJkX2xpc3QmCisgICAgICBvcGVyYXRvcj0oZm9yd2FyZF9saXN0JiYgX19saXN0KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJX0Jhc2U6OmNsZWFyKCk7CisJX0Jhc2U6OnN3YXAoX19saXN0KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIGZvcndhcmRfbGlzdCYKKyAgICAgIG9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8X1RwPiBfX2lsKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19pbDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuIF9fbHguX01fYmFzZSgpID09IF9fbHkuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiBfX2x4Ll9NX2Jhc2UoKSA8IF9fbHkuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisgICAgICAgICAgICAgICBjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x5KQorICAgIHsgcmV0dXJuICEoX19seCA9PSBfX2x5KTsgfQorCisgIC8vLyBCYXNlZCBvbiBvcGVyYXRvcjwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAoX19seSA8IF9fbHgpOyB9CisKKyAgLy8vIEJhc2VkIG9uIG9wZXJhdG9yPAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyByZXR1cm4gIShfX2x4IDwgX19seSk7IH0KKworICAvLy8gQmFzZWQgb24gb3BlcmF0b3I8CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBmb3J3YXJkX2xpc3Q8X1RwLCBfQWxsb2M+JiBfX2x4LAorICAgICAgICAgICAgICAgY29uc3QgZm9yd2FyZF9saXN0PF9UcCwgX0FsbG9jPiYgX19seSkKKyAgICB7IHJldHVybiAhKF9fbHkgPCBfX2x4KTsgfQorCisgIC8vLyBTZWUgc3RkOjpmb3J3YXJkX2xpc3Q6OnN3YXAoKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHgsCisJIGZvcndhcmRfbGlzdDxfVHAsIF9BbGxvYz4mIF9fbHkpCisgICAgeyBfX2x4LnN3YXAoX19seSk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5Y2Q5MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgKQEAgLTAsMCArMSw0MDkgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKy8vIE1BIDAyMTExLTEzMDcsIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlCisvLyBzb2Z0d2FyZSBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcworLy8gZmlsZSwgb3IgeW91IGNvbXBpbGUgdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8KKy8vIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIKKy8vIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwKKy8vIFB1YmxpYyBMaWNlbnNlLgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgKKyAqICBAYnJpZWYgSW50ZXJmYWNlIG9mIHRoZSBwcm9maWxpbmcgcnVudGltZSBsaWJyYXJ5LgorICovCisKKy8vIFdyaXR0ZW4gYnkgTGl4aWEgTGl1IGFuZCBTaWx2aXVzIFJ1cy4KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IIDEKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKy8vIE1lY2hhbmlzbSB0byBkZWZpbmUgZGF0YSB3aXRoIGlubGluZSBsaW5rYWdlLgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9VTklOSVRfREFUQShfX3R5cGUsIF9fbmFtZSkgICAgICAgICAgICAgXAorICBpbmxpbmUgX190eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2dldF8jI19fbmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBfX3R5cGUgX19uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBfX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190eXBlLCBfX25hbWUsIF9faW5pdGlhbF92YWx1ZS4uLikgXAorICBpbmxpbmUgX190eXBlJiBfX2dldF8jI19fbmFtZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgX190eXBlIF9fbmFtZShfX2luaXRpYWxfdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9fbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX25hbWUpIFwKKyAgX19nZXRfIyNfX25hbWUoKQorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIFJlZW50cmFuY2UgZ3VhcmQuCisgICAqCisgICAqIE1lY2hhbmlzbSB0byBwcm90ZWN0IGFsbCBfX2dudV9wcm9maWxlIG9wZXJhdGlvbnMgYWdhaW5zdCByZWN1cnNpb24sCisgICAqIG11bHRpdGhyZWFkZWQgYW5kIGV4Y2VwdGlvbiByZWVudHJhbmNlLgorICAgKi8KKyAgc3RydWN0IF9fcmVlbnRyYW5jZV9ndWFyZAorICB7CisgICAgc3RhdGljIGJvb2wKKyAgICBfX2dldF9pbigpCisgICAgeworICAgICAgaWYgKF9faW5zaWRlKCkgPT0gdHJ1ZSkKKwlyZXR1cm4gZmFsc2U7CisgICAgICBlbHNlCisJeworCSAgX19pbnNpZGUoKSA9IHRydWU7CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorCisgICAgc3RhdGljIGJvb2wmCisgICAgX19pbnNpZGUoKQorICAgIHsKKyAgICAgIHN0YXRpYyBfX3RocmVhZCBib29sIF9TX2luc2lkZShmYWxzZSk7CisgICAgICByZXR1cm4gX1NfaW5zaWRlOworICAgIH0KKworICAgIF9fcmVlbnRyYW5jZV9ndWFyZCgpIHsgfQorICAgIH5fX3JlZW50cmFuY2VfZ3VhcmQoKSB7IF9faW5zaWRlKCkgPSBmYWxzZTsgfQorICB9OworCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX3guLi4pCSAgICAgIAlcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2dudV9wcm9maWxlOjpfX3JlZW50cmFuY2VfZ3VhcmQ6Ol9fZ2V0X2luKCkpICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3JlZW50cmFuY2VfZ3VhcmQgX19nZXRfb3V0OyAJCVwKKyAgICAgIF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zLgorICAvLyBEb24ndCB1c2UgYW55IF9fZ251X3Byb2ZpbGU6OiBpbiB1c2VyIGNvZGUuCisgIC8vIEluc3RlYWQsIHVzZSB0aGUgX19wcm9mY3h4Li4uIG1hY3Jvcywgd2hpY2ggb2ZmZXIgZ3VhcmRlZCBhY2Nlc3MuCisgIGJvb2wgX190dXJuX29uKCk7CisgIGJvb2wgX190dXJuX29mZigpOworICBib29sIF9faXNfaW52YWxpZCgpOworICBib29sIF9faXNfb24oKTsKKyAgYm9vbCBfX2lzX29mZigpOworICB2b2lkIF9fcmVwb3J0KHZvaWQpOworICB2b2lkIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfZGVzdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV9oYXNodGFibGVfc2l6ZV9jb25zdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl9zaXplX3Jlc2l6ZShjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl9zaXplX2Rlc3RydWN0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3NpemVfY29uc3RydWN0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCk7CisgIHZvaWQgX190cmFjZV9oYXNoX2Z1bmNfZGVzdHJ1Y3QoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdCwKKwkJCQkgIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2hhc2hfZnVuY19jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZGVzdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2luc2VydChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZmluZChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOworCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NsaXN0X2Rlc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmV3aW5kKGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2xpc3Rfb3BlcmF0aW9uKGNvbnN0IHZvaWQqKTsKKworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfZGVzdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luc2VydChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfcmVzaXplKGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOworCisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NldF9kZXN0cnVjdChjb25zdCB2b2lkKik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NldF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zZXRfaW5zZXJ0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwgc3RkOjpzaXplX3QpOyAKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2V0X2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fc2V0X2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zZXRfZmluZChjb25zdCB2b2lkKiwgc3RkOjpzaXplX3QpOyAKKworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfY29uc3RydWN0KGNvbnN0IHZvaWQqKTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoY29uc3Qgdm9pZCopOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KGNvbnN0IHZvaWQqLCBzdGQ6OnNpemVfdCwKKwkJCQkJICAgc3RkOjpzaXplX3QpOworICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90LAorCQkJCQkgIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2l0ZXJhdGUoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoY29uc3Qgdm9pZCosIHN0ZDo6c2l6ZV90KTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2Rlc3RydWN0KGNvbnN0IHZvaWQqKTsKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworLy8gTWFzdGVyIHN3aXRjaCB0dXJucyBvbiBhbGwgZGlhZ25vc3RpY3MgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgdHVybmVkIG9mZi4KKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fSEFTSFRBQkxFX1RPT19TTUFMTAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX0hBU0hUQUJMRV9UT09fU01BTEwKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX0hBU0hUQUJMRV9UT09fTEFSR0UKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9IQVNIVEFCTEVfVE9PX0xBUkdFCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19WRUNUT1JfVE9PX1NNQUxMCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPT19TTUFMTAorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fVkVDVE9SX1RPT19MQVJHRQorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1ZFQ1RPUl9UT09fTEFSR0UKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX05PX0lORUZGSUNJRU5UX0hBU0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9JTkVGRklDSUVOVF9IQVNICisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19WRUNUT1JfVE9fTElTVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1ZFQ1RPUl9UT19MSVNUCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9OT19MSVNUX1RPX1NMSVNUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTElTVF9UT19TTElTVAorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fTElTVF9UT19WRUNUT1IKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9MSVNUX1RPX1ZFQ1RPUgorI2VuZGlmCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTk9fTUFQX1RPX1VOT1JERVJFRF9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVBfVE9fVU5PUkRFUkVEX01BUAorI2VuZGlmCisjZW5kaWYKKworLy8gRXhwb3NlIGdsb2JhbCBtYW5hZ2VtZW50IHJvdXRpbmVzIHRvIHVzZXIgY29kZS4KKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjZGVmaW5lIF9fcHJvZmN4eF9yZXBvcnQoKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX2dudV9wcm9maWxlOjpfX3JlcG9ydCgpKQorI2RlZmluZSBfX3Byb2ZjeHhfdHVybl9vbigpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9fdHVybl9vbigpKQorI2RlZmluZSBfX3Byb2ZjeHhfdHVybl9vZmYoKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX2dudV9wcm9maWxlOjpfX3R1cm5fb2ZmKCkpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19pbnZhbGlkKCkgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoX19nbnVfcHJvZmlsZTo6X19pc19pbnZhbGlkKCkpCisjZGVmaW5lIF9fcHJvZmN4eF9pc19vbigpIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKF9fZ251X3Byb2ZpbGU6Ol9faXNfb24oKSkKKyNkZWZpbmUgX19wcm9mY3h4X19pc19vZmYoKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRChfX2dudV9wcm9maWxlOjpfX2lzX29mZigpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X3JlcG9ydCgpCisjZGVmaW5lIF9fcHJvZmN4eF90dXJuX29uKCkKKyNkZWZpbmUgX19wcm9mY3h4X3R1cm5fb2ZmKCkKKyNkZWZpbmUgX19wcm9mY3h4X2lzX2ludmFsaWQoKQorI2RlZmluZSBfX3Byb2ZjeHhfaXNfb24oKQorI2RlZmluZSBfX3Byb2ZjeHhfaXNfb2ZmKCkKKyNlbmRpZgorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIEhBU0hUQUJMRV9UT09fU01BTEwgYW5kIEhBU0hUQUJMRV9UT09fTEFSR0UuCisjaWYgKGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9IQVNIVEFCTEVfVE9PX1NNQUxMKSBcCisgICAgIHx8IGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9IQVNIVEFCTEVfVE9PX0xBUkdFKSkKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9yZXNpemUoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXNpemUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfaGFzaHRhYmxlX3NpemVfY29uc3RydWN0KF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX3Jlc2l6ZShfX3guLi4pICAKKyNkZWZpbmUgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdChfX3guLi4pIAorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdChfX3guLi4pICAKKyNlbmRpZgorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIFZFQ1RPUl9UT09fU01BTEwgYW5kIFZFQ1RPUl9UT09fTEFSR0UuCisjaWYgKGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9WRUNUT1JfVE9PX1NNQUxMKSBcCisgICAgIHx8IGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9WRUNUT1JfVE9PX0xBUkdFKSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9yZXNpemUoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3Jfc2l6ZV9yZXNpemUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl9zaXplX2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3NpemVfY29uc3RydWN0KF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZShfX3guLi4pICAKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdChfX3guLi4pIAorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdChfX3guLi4pICAKKyNlbmRpZiAKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBJTkVGRklDSUVOVF9IQVNILgorI2lmIGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRV9JTkVGRklDSUVOVF9IQVNIKQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdDIoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9oYXNoX2Z1bmNfY29uc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfaGFzaF9mdW5jX2Rlc3RydWN0KF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0MihfX3guLi4pIAorI2RlZmluZSBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdDIoX194Li4uKSAgCisjZW5kaWYKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBWRUNUT1JfVE9fTElTVC4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SX1RPX0xJU1QpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2NvbnN0cnVjdChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaW5zZXJ0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW5zZXJ0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaXRlcmF0ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2l0ZXJhdGUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW52YWxpZF9vcGVyYXRvcihfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZTIoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV92ZWN0b3JfdG9fbGlzdF9yZXNpemUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9maW5kKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfZmluZChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdDIoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaXRlcmF0ZShfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfcmVzaXplMihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF92ZWN0b3JfZmluZChfX3guLi4pCisjZW5kaWYKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBMSVNUX1RPX1ZFQ1RPUi4gCisjaWYgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFX0xJU1RfVE9fVkVDVE9SKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfY29uc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2Rlc3RydWN0MihfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2luc2VydChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luc2VydChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9pdGVyYXRlKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfaXRlcmF0ZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b192ZWN0b3JfaW52YWxpZF9vcGVyYXRvcihfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QyKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfY29uc3RydWN0MihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2luc2VydChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2l0ZXJhdGUoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9pbnZhbGlkX29wZXJhdG9yKF9feC4uLikKKyNlbmRpZgorCisvLyBUdXJuIG9uL29mZiBpbnN0cnVtZW50YXRpb24gZm9yIExJU1RfVE9fU0xJU1QuICAKKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfTElTVF9UT19TTElTVCkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfcmV3aW5kKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b19zbGlzdF9yZXdpbmQoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbGlzdF90b19zbGlzdF9vcGVyYXRpb24oX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9saXN0X3RvX3NsaXN0X2Rlc3RydWN0KF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX2xpc3RfdG9fc2xpc3RfY29uc3RydWN0KF9feCkpCisjZWxzZQorI2RlZmluZSBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQoX194Li4uKSAgCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X29wZXJhdGlvbihfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2Rlc3RydWN0KF9feC4uLikgCisjZGVmaW5lIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdChfX3guLi4pICAKKyNlbmRpZiAKKworLy8gVHVybiBvbi9vZmYgaW5zdHJ1bWVudGF0aW9uIGZvciBNQVBfVE9fVU5PUkRFUkVEX01BUC4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEVfTUFQX1RPX1VOT1JERVJFRF9NQVApCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2Rlc3RydWN0KF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydChfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydChfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShfX3gpKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShfX3guLi4pIFwKKyAgX0dMSUJDWFhfUFJPRklMRV9SRUVOVFJBTkNFX0dVQVJEKCBcCisgICAgICBfX2dudV9wcm9maWxlOjpfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2l0ZXJhdGUoX194KSkKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoX194Li4uKSBcCisgIF9HTElCQ1hYX1BST0ZJTEVfUkVFTlRSQU5DRV9HVUFSRCggXAorICAgICAgX19nbnVfcHJvZmlsZTo6X190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKF9feCkpCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKF9feC4uLikgXAorICBfR0xJQkNYWF9QUk9GSUxFX1JFRU5UUkFOQ0VfR1VBUkQoIFwKKyAgICAgIF9fZ251X3Byb2ZpbGU6Ol9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZChfX3gpKQorI2Vsc2UKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdChfX3guLi4pIFwKKyAgCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9kZXN0cnVjdChfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UoX194Li4uKQorI2RlZmluZSBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShfX3guLi4pCisjZGVmaW5lIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKF9feC4uLikKKyNkZWZpbmUgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoX194Li4uKQorI2VuZGlmCisKKy8vIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgY29tcGlsZS10aW1lIGN1c3RvbWl6YWJsZSB2YXJpYWJsZXMuCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfUEFUSF9ST09UCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfUEFUSF9ST09UICJsaWJzdGRjeHgtcHJvZmlsZSIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX0VOVl9WQVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9UUkFDRV9FTlZfVkFSICJfR0xJQkNYWF9QUk9GSUxFX1RSQUNFX1BBVEhfUk9PVCIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UX0VOVl9WQVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVF9FTlZfVkFSIFwKKyAgIl9HTElCQ1hYX1BST0ZJTEVfTUFYX1dBUk5fQ09VTlQiCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01BWF9XQVJOX0NPVU5UIDEwCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEgKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEggMzIKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSF9FTlZfVkFSCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTUFYX1NUQUNLX0RFUFRIX0VOVl9WQVIgXAorICAiX0dMSUJDWFhfUFJPRklMRV9NQVhfU1RBQ0tfREVQVEgiCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUMKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUMgKDEgPDwgMjgpCisjZW5kaWYKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUNfRU5WX1ZBUgorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX01FTV9QRVJfRElBR05PU1RJQ19FTlZfVkFSIFwKKyAgIl9HTElCQ1hYX1BST0ZJTEVfTUVNX1BFUl9ESUFHTk9TVElDIgorI2VuZGlmCisKKy8vIEluc3RydW1lbnRhdGlvbiBob29rIGltcGxlbWVudGF0aW9ucy4KKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaF9mdW5jLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2h0YWJsZV9zaXplLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl9zaXplLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3ZlY3Rvcl90b19saXN0LmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2xpc3RfdG9fc2xpc3QuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaCIKKworI2VuZGlmIC8vIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfYWxnb3MuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkZTQzZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKy8vIE1BIDAyMTExLTEzMDcsIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlCisvLyBzb2Z0d2FyZSBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcworLy8gZmlsZSwgb3IgeW91IGNvbXBpbGUgdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8KKy8vIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIKKy8vIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwKKy8vIFB1YmxpYyBMaWNlbnNlLgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2FsZ29zLmgKKyAqICBAYnJpZWYgQWxnb3JpdGhtcyB1c2VkIGJ5IHRoZSBwcm9maWxlIGV4dGVuc2lvbi4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBhdm9pZCBpbmNsdWRpbmcgPGFsZ29yaXRobT4gb3IgPGJpdHMvc3RsX2FsZ28uaD4uCisgKiAgSW5jbHVkaW5nIHRob3NlIGZpbGVzIHdvdWxkIHJlc3VsdCBpbiByZWN1cnNpdmUgaW5jbHVkZXMuCisgKiAgVGhlc2UgaW1wbGVtZW50YXRpb25zIGFyZSBvdmVyc2ltcGxpZmllZC4gIEluIGdlbmVyYWwsIGVmZmljaWVuY3kgbWF5IGJlCisgKiAgc2FjcmlmaWNlZCB0byBtaW5pbWl6ZSBtYWludGVuYW5jZSBvdmVyaGVhZC4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQUxHT1NfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0FMR09TX0ggMQorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiBIZWxwZXIgZm9yIF9fdG9wX24uICBJbnNlcnQgaW4gc29ydGVkIHZlY3RvciwgYnV0IG5vdCBiZXlvbmQgTnRoIGVsZW0uICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHZvaWQKKyAgICBfX2luc2VydF90b3BfbihfQ29udGFpbmVyJiBfX291dHB1dCwKKwkJICAgY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSwKKwkJICAgdHlwZW5hbWUgX0NvbnRhaW5lcjo6c2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2l0ID0gX19vdXRwdXQuYmVnaW4oKTsKKyAgICAgIHR5cGVuYW1lIF9Db250YWluZXI6OnNpemVfdHlwZSBfX2NvdW50ID0gMDsKKworICAgICAgLy8gU2tpcCB1cCB0byBOIC0gMSBlbGVtZW50cyBsYXJnZXIgdGhhbiBWQUxVRS4KKyAgICAgIC8vIFhYWDogQ291bGQgZG8gYmluYXJ5IHNlYXJjaCBmb3IgcmFuZG9tIGl0ZXJhdG9ycy4KKyAgICAgIHdoaWxlICh0cnVlKQorCXsKKwkgIGlmIChfX2NvdW50ID49IF9fbikKKwkgICAgLy8gVkFMVUUgaXMgbm90IGluIHRvcCBOLgorCSAgICByZXR1cm47CisKKwkgIGlmIChfX2l0ID09IF9fb3V0cHV0LmVuZCgpKQorCSAgICBicmVhazsKKworCSAgaWYgKCpfX2l0IDwgX192YWx1ZSkKKwkgICAgYnJlYWs7CisKKwkgICsrX19pdDsKKwkgICsrX19jb3VudDsKKwl9CisKKyAgICAgIF9fb3V0cHV0Lmluc2VydChfX2l0LCBfX3ZhbHVlKTsKKyAgICB9CisKKyAgLyogQ29weSB0aGUgdG9wIE4gZWxlbWVudHMgaW4gSU5QVVQsIHNvcnRlZCBpbiByZXZlcnNlIG9yZGVyLCB0byBPVVRQVVQuICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ29udGFpbmVyPgorICAgIHZvaWQKKyAgICBfX3RvcF9uKGNvbnN0IF9Db250YWluZXImIF9faW5wdXQsIF9Db250YWluZXImIF9fb3V0cHV0LAorCSAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjpzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9fb3V0cHV0LmNsZWFyKCk7CisgICAgICB0eXBlbmFtZSBfQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvciBfX2l0OworICAgICAgZm9yIChfX2l0ID0gX19pbnB1dC5iZWdpbigpOyBfX2l0ICE9IF9faW5wdXQuZW5kKCk7ICsrX19pdCkKKwlfX2luc2VydF90b3BfbihfX291dHB1dCwgKl9faXQsIF9fbik7CisgICAgfQorCisgIC8qIFNpbXBsaWZpZWQgY2xvbmUgb2Ygc3RkOjpmb3JfZWFjaC4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yLCB0eXBlbmFtZSBfRnVuY3Rpb24+CisgICAgX0Z1bmN0aW9uIAorICAgIF9fZm9yX2VhY2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBfRnVuY3Rpb24gX19mKQorICAgIHsKKyAgICAgIGZvciAoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCV9fZigqX19maXJzdCk7CisgICAgICByZXR1cm4gX19mOworICAgIH0KKworICAvKiBTaW1wbGlmaWVkIGNsb25lIG9mIHN0ZDo6cmVtb3ZlLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ZvcndhcmRJdGVyYXRvciwgdHlwZW5hbWUgX1RwPgorICAgIF9Gb3J3YXJkSXRlcmF0b3IKKyAgICBfX3JlbW92ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAorCSAgICAgY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGlmKF9fZmlyc3QgPT0gX19sYXN0KQorCXJldHVybiBfX2ZpcnN0OworICAgICAgX0ZvcndhcmRJdGVyYXRvciBfX3Jlc3VsdCA9IF9fZmlyc3Q7CisgICAgICArK19fZmlyc3Q7CisgICAgICBmb3IoOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQorCWlmKCEoKl9fZmlyc3QgPT0gX192YWx1ZSkpCisJICB7CisJICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OworCSAgICArK19fcmVzdWx0OworCSAgfQorICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQUxHT1NfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfY29udGFpbmVyX3NpemUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZWU1NAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKy8vIE1BIDAyMTExLTEzMDcsIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlCisvLyBzb2Z0d2FyZSBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcworLy8gZmlsZSwgb3IgeW91IGNvbXBpbGUgdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8KKy8vIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIKKy8vIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwKKy8vIFB1YmxpYyBMaWNlbnNlLgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2NvbnRhaW5lcl9zaXplLmgKKyAqICBAYnJpZWYgRGlhZ25vc3RpY3MgZm9yIGNvbnRhaW5lciBzaXplcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9DT05UQUlORVJfU0laRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfQ09OVEFJTkVSX1NJWkVfSCAxCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBBIGNvbnRhaW5lciBzaXplIGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX2NvbnRhaW5lcl9zaXplX2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlIAorICB7CisgIHB1YmxpYzoKKyAgICBfX2NvbnRhaW5lcl9zaXplX2luZm8oKQorICAgIDogX01faW5pdCgwKSwgX01fbWF4KDApLCBfTV9taW4oMCksIF9NX3RvdGFsKDApLCBfTV9pdGVtX21pbigwKSwKKyAgICAgIF9NX2l0ZW1fbWF4KDApLCBfTV9pdGVtX3RvdGFsKDApLCBfTV9jb3VudCgwKSwgX01fcmVzaXplKDApLCBfTV9jb3N0KDApIAorICAgIHsgfQorCisgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKGNvbnN0IF9fY29udGFpbmVyX3NpemVfaW5mbyYgX19vKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fbyksIF9NX2luaXQoX19vLl9NX2luaXQpLCBfTV9tYXgoX19vLl9NX21heCksCisgICAgICBfTV9taW4oX19vLl9NX21pbiksIF9NX3RvdGFsKF9fby5fTV90b3RhbCksCisgICAgICBfTV9pdGVtX21pbihfX28uX01faXRlbV9taW4pLCBfTV9pdGVtX21heChfX28uX01faXRlbV9tYXgpLAorICAgICAgX01faXRlbV90b3RhbChfX28uX01faXRlbV90b3RhbCksIF9NX2NvdW50KF9fby5fTV9jb3VudCksCisgICAgICBfTV9yZXNpemUoX19vLl9NX3Jlc2l6ZSksIF9NX2Nvc3QoX19vLl9NX2Nvc3QpCisgICAgeyB9CisKKyAgICBfX2NvbnRhaW5lcl9zaXplX2luZm8oX19zdGFja190IF9fc3RhY2ssIHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2spLCBfTV9pbml0KF9fbnVtKSwgX01fbWF4KF9fbnVtKSwKKyAgICAgIF9NX21pbigwKSwgX01fdG90YWwoMCksIF9NX2l0ZW1fbWluKDApLCBfTV9pdGVtX21heCgwKSwKKyAgICAgIF9NX2l0ZW1fdG90YWwoMCksIF9NX2NvdW50KDApLCBfTV9yZXNpemUoMCksIF9NX2Nvc3QoMCkKKyAgICB7IH0KKworICAgIHZpcnR1YWwgfl9fY29udGFpbmVyX3NpemVfaW5mbygpIHsgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlWnUgJVp1ICVadSAlWnUgJVp1ICVadSAlWnVcbiIsIAorCQkgICBfTV9pbml0LCBfTV9jb3VudCwgX01fY29zdCwgX01fcmVzaXplLCBfTV9taW4sIF9NX21heCwKKwkJICAgX01fdG90YWwsIF9NX2l0ZW1fbWluLCBfTV9pdGVtX21heCwgX01faXRlbV90b3RhbCk7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX21hZ25pdHVkZSgpIGNvbnN0CisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9NX2Nvc3QpOyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBfX21lc3NhZ2U7CisgICAgICBpZiAoX01faW5pdCA8IF9NX2l0ZW1fbWF4KQorCV9fbWVzc2FnZSA8PCAiY2hhbmdlIGluaXRpYWwgY29udGFpbmVyIHNpemUgZnJvbSAiIDw8IF9NX2luaXQKKwkJICA8PCAiIHRvICIgPDwgX01faXRlbV9tYXg7CisgICAgICByZXR1cm4gX19tZXNzYWdlLnN0cigpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fY29udGFpbmVyX3NpemVfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX2luaXQgICAgICAgID0gc3RkOjptYXgoX01faW5pdCwgX19vLl9NX2luaXQpOworICAgICAgX01fbWF4ICAgICAgICAgPSBzdGQ6Om1heChfTV9tYXgsIF9fby5fTV9tYXgpOworICAgICAgX01faXRlbV9tYXggICAgPSBzdGQ6Om1heChfTV9pdGVtX21heCwgX19vLl9NX2l0ZW1fbWF4KTsKKyAgICAgIF9NX21pbiAgICAgICAgID0gc3RkOjptaW4oX01fbWluLCBfX28uX01fbWluKTsKKyAgICAgIF9NX2l0ZW1fbWluICAgID0gc3RkOjptaW4oX01faXRlbV9taW4sIF9fby5fTV9pdGVtX21pbik7CisgICAgICBfTV90b3RhbCAgICAgICs9IF9fby5fTV90b3RhbDsKKyAgICAgIF9NX2l0ZW1fdG90YWwgKz0gX19vLl9NX2l0ZW1fdG90YWw7CisgICAgICBfTV9jb3VudCAgICAgICs9IF9fby5fTV9jb3VudDsKKyAgICAgIF9NX2Nvc3QgICAgICAgKz0gX19vLl9NX2Nvc3Q7CisgICAgICBfTV9yZXNpemUgICAgICs9IF9fby5fTV9yZXNpemU7CisgICAgfQorCisgICAgLy8gQ2FsbCBpZiBhIGNvbnRhaW5lciBpcyBkZXN0cnVjdGVkIG9yIGNsZWFuZWQuCisgICAgdm9pZAorICAgIF9fZGVzdHJ1Y3Qoc3RkOjpzaXplX3QgX19udW0sIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgICB7CisgICAgICBfTV9tYXggPSBzdGQ6Om1heChfTV9tYXgsIF9fbnVtKTsKKyAgICAgIF9NX2l0ZW1fbWF4ID0gc3RkOjptYXgoX01faXRlbV9tYXgsIF9faW51bSk7CisgICAgICBpZiAoX01fbWluID09IDApCisJeworCSAgX01fbWluID0gX19udW07IAorCSAgX01faXRlbV9taW4gPSBfX2ludW07CisJfQorICAgICAgZWxzZQorCXsKKwkgIF9NX21pbiA9IHN0ZDo6bWluKF9NX21pbiwgX19udW0pOworCSAgX01faXRlbV9taW4gPSBzdGQ6Om1pbihfTV9pdGVtX21pbiwgX19pbnVtKTsKKwl9CisgICAgICBfTV90b3RhbCArPSBfX251bTsKKyAgICAgIF9NX2l0ZW1fdG90YWwgKz0gX19pbnVtOworICAgICAgX01fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAvLyBFc3RpbWF0ZSB0aGUgY29zdCBvZiByZXNpemUvcmVoYXNoLiAKKyAgICBmbG9hdAorICAgIF9fcmVzaXplX2Nvc3Qoc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCkKKyAgICB7IHJldHVybiBfX2Zyb207IH0KKworICAgIC8vIENhbGwgaWYgY29udGFpbmVyIGlzIHJlc2l6ZWQuCisgICAgdm9pZAorICAgIF9fcmVzaXplKHN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QgX190bykKKyAgICB7CisgICAgICBfTV9jb3N0ICs9IHRoaXMtPl9fcmVzaXplX2Nvc3QoX19mcm9tLCBfX3RvKTsKKyAgICAgIF9NX3Jlc2l6ZSArPSAxOworICAgICAgX01fbWF4ID0gc3RkOjptYXgoX01fbWF4LCBfX3RvKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9pbml0OworICAgIHN0ZDo6c2l6ZV90IF9NX21heDsgIC8vIHJhbmdlIG9mICMgYnVja2V0cworICAgIHN0ZDo6c2l6ZV90IF9NX21pbjsKKyAgICBzdGQ6OnNpemVfdCBfTV90b3RhbDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVtX21pbjsgIC8vIHJhbmdlIG9mICMgaXRlbXMKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVtX21heDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVtX3RvdGFsOworICAgIHN0ZDo6c2l6ZV90IF9NX2NvdW50OworICAgIHN0ZDo6c2l6ZV90IF9NX3Jlc2l6ZTsKKyAgICBzdGQ6OnNpemVfdCBfTV9jb3N0OworICB9OworCisKKyAgLyoqIEBicmllZiBBIGNvbnRhaW5lciBzaXplIGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBzdGFjayB0YWJsZS4gICovCisgIGNsYXNzIF9fY29udGFpbmVyX3NpemVfc3RhY2tfaW5mbworICA6IHB1YmxpYyBfX2NvbnRhaW5lcl9zaXplX2luZm8KKyAgeworICBwdWJsaWM6CisgICAgX19jb250YWluZXJfc2l6ZV9zdGFja19pbmZvKGNvbnN0IF9fY29udGFpbmVyX3NpemVfaW5mbyYgX19vKQorICAgIDogX19jb250YWluZXJfc2l6ZV9pbmZvKF9fbykgeyB9CisgIH07CisKKyAgCisgIC8qKiBAYnJpZWYgQ29udGFpbmVyIHNpemUgaW5zdHJ1bWVudGF0aW9uIHRyYWNlIHByb2R1Y2VyLiAgKi8KKyAgY2xhc3MgX190cmFjZV9jb250YWluZXJfc2l6ZQorICA6IHB1YmxpYyBfX3RyYWNlX2Jhc2U8X19jb250YWluZXJfc2l6ZV9pbmZvLCBfX2NvbnRhaW5lcl9zaXplX3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICB+X190cmFjZV9jb250YWluZXJfc2l6ZSgpIHsgfQorCisgICAgX190cmFjZV9jb250YWluZXJfc2l6ZSgpCisgICAgOiBfX3RyYWNlX2Jhc2U8X19jb250YWluZXJfc2l6ZV9pbmZvLCBfX2NvbnRhaW5lcl9zaXplX3N0YWNrX2luZm8+KCkgeyB9OworCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4gCisgICAgdm9pZAorICAgIF9faW5zZXJ0KGNvbnN0IF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7IF9fYWRkX29iamVjdChfX29iaiwgX19jb250YWluZXJfc2l6ZV9pbmZvKF9fc3RhY2ssIF9fbnVtKSk7IH0KKworICAgIC8vIFhYWCBVbmRlZmluZWQ/CisgICAgdm9pZAorICAgIF9fY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2ludW0pOworICAKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0sIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fb2JqZWN0X3QgX19vYmpfaGFuZGxlID0gc3RhdGljX2Nhc3Q8X19vYmplY3RfdD4oX19vYmopOworCisgICAgICBfX2NvbnRhaW5lcl9zaXplX2luZm8qIF9fb2JqZWN0X2luZm8gPSBfX2dldF9vYmplY3RfaW5mbyhfX29ial9oYW5kbGUpOworICAgICAgaWYgKCFfX29iamVjdF9pbmZvKQorCXJldHVybjsKKworICAgICAgX19vYmplY3RfaW5mby0+X19kZXN0cnVjdChfX251bSwgX19pbnVtKTsKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29ial9oYW5kbGUpOworICAgIH0KKworICAgIC8vIENhbGwgYXQgcmVzaXplIHRvIHNldCByZXNpemUvY29zdCBpbmZvcm1hdGlvbi4KKyAgICB2b2lkCisgICAgX19yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIGludCBfX2Zyb20sIGludCBfX3RvKQorICAgIHsKKyAgICAgIGlmICghX19pc19vbigpKQorCXJldHVybjsKKworICAgICAgX19jb250YWluZXJfc2l6ZV9pbmZvKiBfX29iamVjdF9pbmZvID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKCFfX29iamVjdF9pbmZvKQorCXJldHVybjsKKworICAgICAgX19vYmplY3RfaW5mby0+X19yZXNpemUoX19mcm9tLCBfX3RvKTsKKyAgICB9CisgIH07CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0NPTlRBSU5FUl9TSVpFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2hfZnVuYy5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaF9mdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2YzY0MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2hhc2hfZnVuYy5oCkBAIC0wLDAgKzEsMTgxIEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisvLyBNQSAwMjExMS0xMzA3LCBVU0EuCisKKy8vIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgdXNlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgZnJlZQorLy8gc29mdHdhcmUgbGlicmFyeSB3aXRob3V0IHJlc3RyaWN0aW9uLiAgU3BlY2lmaWNhbGx5LCBpZiBvdGhlciBmaWxlcworLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzIG9yIHVzZSBtYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoaXMKKy8vIGZpbGUsIG9yIHlvdSBjb21waWxlIHRoaXMgZmlsZSBhbmQgbGluayBpdCB3aXRoIG90aGVyIGZpbGVzIHRvCisvLyBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZmlsZSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlCisvLyByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyCisvLyByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsCisvLyBQdWJsaWMgTGljZW5zZS4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNoX2Z1bmMuaAorICogIEBicmllZiBEYXRhIHN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IHByb2ZpbGluZyB0cmFjZXMuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSF9GVU5DX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIX0ZVTkNfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEEgaGFzaCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19oYXNoZnVuY19pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX2hhc2hmdW5jX2luZm8oKQorICAgIDogX01fbG9uZ2VzdF9jaGFpbigwKSwgX01fYWNjZXNzZXMoMCksIF9NX2hvcHMoMCkgeyB9CisKKyAgICBfX2hhc2hmdW5jX2luZm8oY29uc3QgX19oYXNoZnVuY19pbmZvJiBfX28pCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19vKSwgX01fbG9uZ2VzdF9jaGFpbihfX28uX01fbG9uZ2VzdF9jaGFpbiksCisgICAgICBfTV9hY2Nlc3NlcyhfX28uX01fYWNjZXNzZXMpLCBfTV9ob3BzKF9fby5fTV9ob3BzKSB7IH0KKworICAgIF9faGFzaGZ1bmNfaW5mbyhfX3N0YWNrX3QgX19zdGFjaykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrKSwgX01fbG9uZ2VzdF9jaGFpbigwKSwKKyAgICAgIF9NX2FjY2Vzc2VzKDApLCBfTV9ob3BzKDApIHsgfQorCisgICAgdmlydHVhbCB+X19oYXNoZnVuY19pbmZvKCkgeyB9CisKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX2hhc2hmdW5jX2luZm8mIF9fbykKKyAgICB7CisgICAgICBfTV9sb25nZXN0X2NoYWluICA9IHN0ZDo6bWF4KF9NX2xvbmdlc3RfY2hhaW4sIF9fby5fTV9sb25nZXN0X2NoYWluKTsKKyAgICAgIF9NX2FjY2Vzc2VzICAgICAgKz0gX19vLl9NX2FjY2Vzc2VzOworICAgICAgX01faG9wcyAgICAgICAgICArPSBfX28uX01faG9wczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChzdGQ6OnNpemVfdCBfX2NoYWluLCBzdGQ6OnNpemVfdCBfX2FjY2Vzc2VzLAorCSAgICAgICBzdGQ6OnNpemVfdCBfX2hvcHMpCisgICAgeyAKKyAgICAgIF9NX2xvbmdlc3RfY2hhaW4gID0gc3RkOjptYXgoX01fbG9uZ2VzdF9jaGFpbiwgX19jaGFpbik7CisgICAgICBfTV9hY2Nlc3NlcyAgICAgICs9IF9fYWNjZXNzZXM7CisgICAgICBfTV9ob3BzICAgICAgICAgICs9IF9faG9wczsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX193cml0ZShGSUxFKiBfX2YpIGNvbnN0CisgICAgeyBzdGQ6OmZwcmludGYoX19mLCAiJVp1ICVadSAlWnVcbiIsIF9NX2hvcHMsCisJCSAgIF9NX2FjY2Vzc2VzLCBfTV9sb25nZXN0X2NoYWluKTsgfQorCisgICAgZmxvYXQKKyAgICBfX21hZ25pdHVkZSgpIGNvbnN0CisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9NX2hvcHMpOyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7IHJldHVybiAiY2hhbmdlIGhhc2ggZnVuY3Rpb24iOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9sb25nZXN0X2NoYWluOworICAgIHN0ZDo6c2l6ZV90IF9NX2FjY2Vzc2VzOworICAgIHN0ZDo6c2l6ZV90IF9NX2hvcHM7CisgIH07CisKKworICAvKiogQGJyaWVmIEEgaGFzaCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgc3RhY2sgdGFibGUuICAqLworICBjbGFzcyBfX2hhc2hmdW5jX3N0YWNrX2luZm8gCisgIDogcHVibGljIF9faGFzaGZ1bmNfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX2hhc2hmdW5jX3N0YWNrX2luZm8oY29uc3QgX19oYXNoZnVuY19pbmZvJiBfX28pCisgICAgOiBfX2hhc2hmdW5jX2luZm8oX19vKSB7IH0KKyAgfTsKKworCisgIC8qKiBAYnJpZWYgSGFzaCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24gcHJvZHVjZXIuICAqLworICBjbGFzcyBfX3RyYWNlX2hhc2hfZnVuYworICA6IHB1YmxpYyBfX3RyYWNlX2Jhc2U8X19oYXNoZnVuY19pbmZvLCBfX2hhc2hmdW5jX3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX2hhc2hfZnVuYygpCisgICAgOiBfX3RyYWNlX2Jhc2U8X19oYXNoZnVuY19pbmZvLCBfX2hhc2hmdW5jX3N0YWNrX2luZm8+KCkKKyAgICB7IF9faWQgPSAiaGFzaC1kaXN0ciI7IH0KKworICAgIH5fX3RyYWNlX2hhc2hfZnVuYygpIHt9CisgICAgCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19pbnNlcnQoX19vYmplY3RfdCBfX29iaiwgX19zdGFja190IF9fc3RhY2spCisgICAgeyBfX2FkZF9vYmplY3QoX19vYmosIF9faGFzaGZ1bmNfaW5mbyhfX3N0YWNrKSk7IH0KKworICAgIC8vIENhbGwgYXQgZGVzdHJ1Y3Rpb24vY2xlYW4gdG8gc2V0IGNvbnRhaW5lciBmaW5hbCBzaXplLgorICAgIHZvaWQKKyAgICBfX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2NoYWluLAorCSAgICAgICBzdGQ6OnNpemVfdCBfX2FjY2Vzc2VzLCBzdGQ6OnNpemVfdCBfX2hvcHMpCisgICAgeworICAgICAgaWYgKCFfX2lzX29uKCkpCisJcmV0dXJuOworCisgICAgICAvLyBGaXJzdCBmaW5kIHRoZSBpdGVtIGZyb20gdGhlIGxpdmUgb2JqZWN0cyBhbmQgdXBkYXRlIHRoZSBpbmZvcm1hdGlvbnMuCisgICAgICBfX2hhc2hmdW5jX2luZm8qIF9fb2JqcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmICghX19vYmpzKQorCXJldHVybjsKKworICAgICAgX19vYmpzLT5fX2Rlc3RydWN0KF9fY2hhaW4sIF9fYWNjZXNzZXMsIF9faG9wcyk7CisgICAgICBfX3JldGlyZV9vYmplY3QoX19vYmopOworICAgIH0KKyAgfTsKKworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaF9mdW5jX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNoX2Z1bmMpID0gbmV3IF9fdHJhY2VfaGFzaF9mdW5jKCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2hfZnVuY19yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYykpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYyktPl9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdzKTsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaF9mdW5jKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNoX2Z1bmNfY29uc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2hfZnVuYyktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaF9mdW5jX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2NoYWluLAorCQkJICAgICBzdGQ6OnNpemVfdCBfX2FjY2Vzc2VzLCBzdGQ6OnNpemVfdCBfX2hvcHMpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaF9mdW5jKS0+X19kZXN0cnVjdChfX29iaiwgX19jaGFpbiwKKwkJCQkJCSAgICBfX2FjY2Vzc2VzLCBfX2hvcHMpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0hBU0hfRlVOQ19IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9oYXNodGFibGVfc2l6ZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVjYmM3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorLy8gTUEgMDIxMTEtMTMwNywgVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUKKy8vIHNvZnR3YXJlIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMKKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzCisvLyBmaWxlLCBvciB5b3UgY29tcGlsZSB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0bworLy8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZQorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlcgorLy8gcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbAorLy8gUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfaGFzaHRhYmxlX3NpemUuaAorICogIEBicmllZiBDb2xsZWN0aW9uIG9mIGhhc2h0YWJsZSBzaXplIHRyYWNlcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9IQVNIVEFCTEVfU0laRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSFRBQkxFX1NJWkVfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEhhc2h0YWJsZSBzaXplIGluc3RydW1lbnRhdGlvbiB0cmFjZSBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfaGFzaHRhYmxlX3NpemUKKyAgOiBwdWJsaWMgX190cmFjZV9jb250YWluZXJfc2l6ZQorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplKCkKKyAgICA6IF9fdHJhY2VfY29udGFpbmVyX3NpemUoKQorICAgIHsgX19pZCA9ICJoYXNodGFibGUtc2l6ZSI7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSkgPSBuZXcgX190cmFjZV9oYXNodGFibGVfc2l6ZSgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2hhc2h0YWJsZV9zaXplKSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaHRhYmxlX3NpemUpLT4KKwkgIF9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdzKTsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfaGFzaHRhYmxlX3NpemUpLT5fX3dyaXRlKF9fZik7CisgICAgICB9CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX2NvbnN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0pCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisgIAorICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpLAorCQkJCQkJICAgICAgIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtLCAKKwkJCQkgIHN0ZDo6c2l6ZV90IF9faW51bSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9fZGVzdHJ1Y3QoX19vYmosIF9fbnVtLCBfX2ludW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fZnJvbSwgCisJCQkJc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19oYXNodGFibGVfc2l6ZSktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKworI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfSEFTSFRBQkxFX1NJWkVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b19zbGlzdC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b19zbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OWExN2QKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3NsaXN0LmgKQEAgLTAsMCArMSwyMTUgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKy8vIE1BIDAyMTExLTEzMDcsIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlCisvLyBzb2Z0d2FyZSBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcworLy8gZmlsZSwgb3IgeW91IGNvbXBpbGUgdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8KKy8vIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIKKy8vIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwKKy8vIFB1YmxpYyBMaWNlbnNlLgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX2xpc3RfdG9fc2xpc3QuaAorICogIEBicmllZiBEaWFnbm9zdGljcyBmb3IgbGlzdCB0byBzbGlzdC4KKyAqLworCisvLyBXcml0dGVuIGJ5IENoYW5naGVlIEp1bmcuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9MSVNUX1RPX1NMSVNUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9MSVNUX1RPX1NMSVNUX0ggMQorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgY2xhc3MgX19saXN0MnNsaXN0X2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fbGlzdDJzbGlzdF9pbmZvKCkKKyAgICA6IF9NX3Jld2luZChmYWxzZSksIF9NX29wZXJhdGlvbnMoMCkgeyB9CisgIAorICAgIF9fbGlzdDJzbGlzdF9pbmZvKF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fc3RhY2spLCBfTV9yZXdpbmQoZmFsc2UpLCBfTV9vcGVyYXRpb25zKDApIHsgfQorCisgICAgdmlydHVhbCB+X19saXN0MnNsaXN0X2luZm8oKSB7IH0KKworICAgIF9fbGlzdDJzbGlzdF9pbmZvKGNvbnN0IF9fbGlzdDJzbGlzdF9pbmZvJiBfX28pCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19vKSwgX01fcmV3aW5kKF9fby5fTV9yZXdpbmQpLAorICAgICAgX01fb3BlcmF0aW9ucyhfX28uX01fb3BlcmF0aW9ucykgeyB9CisgIAorICAgIC8vIFhYWDogdGhlIG1hZ25pdHVkZSBzaG91bGQgYmUgbXVsdGlwbGllZCB3aXRoIGEgY29uc3RhbnQgZmFjdG9yIEYsCisgICAgLy8gd2hlcmUgRiBpcyAxIHdoZW4gdGhlIG1hbGxvYyBzaXplIGNsYXNzIG9mIGxpc3Qgbm9kZXMgaXMgZGlmZmVyZW50CisgICAgLy8gZnJvbSB0aGUgbWFsbG9jIHNpemUgY2xhc3Mgb2Ygc2xpc3Qgbm9kZXMuICBXaGVuIHRoZXkgZmFsbCBpbnRvIHRoZSBzYW1lCisgICAgLy8gY2xhc3MsIHRoZSBvbmx5IHNsaXN0IGJlbmVmaXQgaXMgZnJvbSBoYXZpbmcgdG8gc2V0IGZld2VyIGxpbmtzLCBzbworICAgIC8vIHRoZSBmYWN0b3IgRiBzaG91bGQgYmUgbXVjaCBzbWFsbGVyLCBjbG9zZXIgdG8gMCB0aGFuIHRvIDEuCisgICAgLy8gVGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBieSBwYXNzaW5nIHRoZSBzaXplIGNsYXNzZXMgaW4gdGhlIGNvbmZpZyAKKyAgICAvLyBmaWxlLiAgRm9yIG5vdywgd2UgYWx3YXlzIGFzc3VtZSBGIHRvIGJlIDEuCisKKyAgICBmbG9hdAorICAgIF9fbWFnbml0dWRlKCkgY29uc3QKKyAgICB7CisgICAgICBpZiAoIV9NX3Jld2luZCkKKwlyZXR1cm4gX01fb3BlcmF0aW9uczsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgdm9pZAorICAgIF9fbWVyZ2UoY29uc3QgX19saXN0MnNsaXN0X2luZm8mKSB7IH0KKworICAgIHZvaWQKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QKKyAgICB7IHN0ZDo6ZnByaW50ZihfX2YsICIlc1xuIiwgX01fcmV3aW5kID8gImludmFsaWQiIDogInZhbGlkIik7IH0KKworICAgIHN0ZDo6c3RyaW5nCisgICAgX19hZHZpY2UoKSBjb25zdAorICAgIHsgcmV0dXJuICJjaGFuZ2Ugc3RkOjpsaXN0IHRvIHN0ZDo6Zm9yd2FyZF9saXN0IjsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX3Jld2luZCgpCisgICAgeworICAgICAgX01fcmV3aW5kID0gdHJ1ZTsKKyAgICAgIF9NX3ZhbGlkID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fcmVjb3JkX29wZXJhdGlvbigpCisgICAgeyArK19NX29wZXJhdGlvbnM7IH0KKworICAgIGJvb2wKKyAgICBfX2hhc19yZXdpbmQoKQorICAgIHsgcmV0dXJuIF9NX3Jld2luZDsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBfTV9yZXdpbmQ7CisgICAgc3RkOjpzaXplX3QgX01fb3BlcmF0aW9uczsKKyAgfTsKKworICBjbGFzcyBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbworICA6IHB1YmxpYyBfX2xpc3Qyc2xpc3RfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbyhjb25zdCBfX2xpc3Qyc2xpc3RfaW5mbyYgX19vKSAKKyAgICA6IF9fbGlzdDJzbGlzdF9pbmZvKF9fbykgeyB9CisgIH07CisKKyAgY2xhc3MgX190cmFjZV9saXN0X3RvX3NsaXN0CisgIDogcHVibGljIF9fdHJhY2VfYmFzZTxfX2xpc3Qyc2xpc3RfaW5mbywgX19saXN0MnNsaXN0X3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICB+X190cmFjZV9saXN0X3RvX3NsaXN0KCkgeyB9CisKKyAgICBfX3RyYWNlX2xpc3RfdG9fc2xpc3QoKQorICAgIDogX190cmFjZV9iYXNlPF9fbGlzdDJzbGlzdF9pbmZvLCBfX2xpc3Qyc2xpc3Rfc3RhY2tfaW5mbz4oKQorICAgIHsgX19pZCA9ICJsaXN0LXRvLXNsaXN0IjsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX3Jld2luZChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBfX2xpc3Qyc2xpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fb3ByX3Jld2luZCgpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9vcGVyYXRpb24oY29uc3Qgdm9pZCogX19vYmopCisgICAgeworICAgICAgX19saXN0MnNsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX3JlY29yZF9vcGVyYXRpb24oKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19pbnNlcnQoY29uc3QgX19vYmplY3RfdCBfX29iaiwgX19zdGFja190IF9fc3RhY2spCisgICAgeyBfX2FkZF9vYmplY3QoX19vYmosIF9fbGlzdDJzbGlzdF9pbmZvKF9fc3RhY2spKTsgfQorICAKKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fbGlzdDJzbGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmICghX19yZXMpCisJcmV0dXJuOworCisgICAgICBfX3JldGlyZV9vYmplY3QoX19vYmopOworICAgIH0KKyAgfTsKKworCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCkgPSBuZXcgX190cmFjZV9saXN0X3RvX3NsaXN0KCk7IH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCktPgorCSAgX19jb2xsZWN0X3dhcm5pbmdzKF9fd2FybmluZ3MpOworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3NsaXN0X3Jld2luZChjb25zdCB2b2lkKiBfX29iaikgCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCktPl9fb3ByX3Jld2luZChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fc2xpc3Rfb3BlcmF0aW9uKGNvbnN0IHZvaWQqIF9fb2JqKSAKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X19yZWNvcmRfb3BlcmF0aW9uKF9fb2JqKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b19zbGlzdCktPl9faW5zZXJ0KF9fb2JqLCBfX2dldF9zdGFjaygpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3NsaXN0KS0+X19kZXN0cnVjdChfX29iaik7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTElTVF9UT19TTElTVF9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9saXN0X3RvX3ZlY3Rvci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjAzMjY3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaApAQCAtMCwwICsxLDMzMSBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorLy8gTUEgMDIxMTEtMTMwNywgVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUKKy8vIHNvZnR3YXJlIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMKKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzCisvLyBmaWxlLCBvciB5b3UgY29tcGlsZSB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0bworLy8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZQorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlcgorLy8gcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbAorLy8gUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfbGlzdF90b192ZWN0b3IuaAorICogIEBicmllZiBkaWFnbm9zdGljcyBmb3IgbGlzdCB0byB2ZWN0b3IuCisgKi8KKworLy8gV3JpdHRlbiBieSBDaGFuZ2hlZSBKdW5nLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTElTVF9UT19WRUNUT1JfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0xJU1RfVE9fVkVDVE9SX0ggMQorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlci5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmgiCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgQSBsaXN0LXRvLXZlY3RvciBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19saXN0MnZlY3Rvcl9pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX2xpc3QydmVjdG9yX2luZm8oKQorICAgIDogX01fc2hpZnRfY291bnQoMCksIF9NX2l0ZXJhdGUoMCksIF9NX3Jlc2l6ZSgwKSwgX01fbGlzdF9jb3N0KDApLAorICAgICAgX01fdmVjdG9yX2Nvc3QoMCksIF9NX3ZhbGlkKHRydWUpLCBfTV9tYXhfc2l6ZSgwKSB7IH0KKworICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyhfX3N0YWNrX3QgX19zdGFjaykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrKSwgX01fc2hpZnRfY291bnQoMCksIF9NX2l0ZXJhdGUoMCksCisgICAgICBfTV9yZXNpemUoMCksIF9NX2xpc3RfY29zdCgwKSwgX01fdmVjdG9yX2Nvc3QoMCksIF9NX3ZhbGlkKHRydWUpLAorICAgICAgX01fbWF4X3NpemUoMCkgeyB9CisKKyAgICB2aXJ0dWFsIH5fX2xpc3QydmVjdG9yX2luZm8oKSB7IH0KKworICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyhjb25zdCBfX2xpc3QydmVjdG9yX2luZm8mIF9fbykKKyAgICA6IF9fb2JqZWN0X2luZm9fYmFzZShfX28pLCBfTV9zaGlmdF9jb3VudChfX28uX01fc2hpZnRfY291bnQpLAorICAgICAgX01faXRlcmF0ZShfX28uX01faXRlcmF0ZSksIF9NX3Jlc2l6ZShfX28uX01fcmVzaXplKSwKKyAgICAgIF9NX2xpc3RfY29zdChfX28uX01fbGlzdF9jb3N0KSwgX01fdmVjdG9yX2Nvc3QoX19vLl9NX3ZlY3Rvcl9jb3N0KSwKKyAgICAgIF9NX3ZhbGlkKF9fby5fTV92YWxpZCksIF9NX21heF9zaXplKF9fby5fTV9tYXhfc2l6ZSkgeyB9CisKKyAgICB2b2lkCisgICAgX19tZXJnZShjb25zdCBfX2xpc3QydmVjdG9yX2luZm8mIF9fbykKKyAgICB7CisgICAgICBfTV9zaGlmdF9jb3VudCAgKz0gX19vLl9NX3NoaWZ0X2NvdW50OworICAgICAgX01faXRlcmF0ZSAgICAgICs9IF9fby5fTV9pdGVyYXRlOworICAgICAgX01fdmVjdG9yX2Nvc3QgICs9IF9fby5fTV92ZWN0b3JfY29zdDsKKyAgICAgIF9NX2xpc3RfY29zdCAgICArPSBfX28uX01fbGlzdF9jb3N0OworICAgICAgX01fdmFsaWQgICAgICAgICY9IF9fby5fTV92YWxpZDsKKyAgICAgIF9NX3Jlc2l6ZSAgICAgICArPSBfX28uX01fcmVzaXplOworICAgICAgX01fbWF4X3NpemUgICAgID0gc3RkOjptYXgoIF9NX21heF9zaXplLCBfX28uX01fbWF4X3NpemUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmZwcmludGYoX19mLCAiJVp1ICVadSAlWnUgJS4wZiAlLjBmXG4iLCBfTV9zaGlmdF9jb3VudCwKKwkJICAgX01fcmVzaXplLCBfTV9pdGVyYXRlLCBfTV92ZWN0b3JfY29zdCwgX01fbGlzdF9jb3N0KTsKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fbWFnbml0dWRlKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9saXN0X2Nvc3QgLSBfTV92ZWN0b3JfY29zdDsgfQorICAKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBfX3NzdHJlYW07CisgICAgICBfX3NzdHJlYW0gCisJPDwgImNoYW5nZSBzdGQ6Omxpc3QgdG8gc3RkOjp2ZWN0b3IgYW5kIGl0cyBpbml0aWFsIHNpemUgZnJvbSAwIHRvICIKKwk8PCBfTV9tYXhfc2l6ZTsKKyAgICAgIHJldHVybiBfX3NzdHJlYW0uc3RyKCk7CisgICAgfQorCisgICAgc3RkOjpzaXplX3QKKyAgICBfX3NoaWZ0X2NvdW50KCkKKyAgICB7IHJldHVybiBfTV9zaGlmdF9jb3VudDsgfQorICAKKyAgICBzdGQ6OnNpemVfdAorICAgIF9faXRlcmF0ZSgpCisgICAgeyByZXR1cm4gX01faXRlcmF0ZTsgfQorICAKKyAgICBmbG9hdAorICAgIF9fbGlzdF9jb3N0KCkKKyAgICB7IHJldHVybiBfTV9saXN0X2Nvc3Q7IH0KKyAgCisgICAgc3RkOjpzaXplX3QKKyAgICBfX3Jlc2l6ZSgpCisgICAgeyByZXR1cm4gX01fcmVzaXplOyB9CisgIAorICAgIHZvaWQKKyAgICBfX3NldF9saXN0X2Nvc3QoZmxvYXQgX19sYykKKyAgICB7IF9NX2xpc3RfY29zdCA9IF9fbGM7IH0KKyAgICAKKyAgICB2b2lkCisgICAgX19zZXRfdmVjdG9yX2Nvc3QoZmxvYXQgX192YykKKyAgICB7IF9NX3ZlY3Rvcl9jb3N0ID0gX192YzsgfQorICAgIAorICAgIGJvb2wKKyAgICBfX2lzX3ZhbGlkKCkKKyAgICB7IHJldHVybiBfTV92YWxpZDsgfQorICAgIAorICAgIHZvaWQKKyAgICBfX3NldF9pbnZhbGlkKCkKKyAgICB7IF9NX3ZhbGlkID0gZmFsc2U7IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pbnNlcnQoc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19zaXplKQorICAgIHsKKyAgICAgIF9NX3NoaWZ0X2NvdW50ICs9IF9fc2hpZnQ7CisgICAgICBfTV9tYXhfc2l6ZSA9IHN0ZDo6bWF4KF9NX21heF9zaXplLCBfX3NpemUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pdGVyYXRlKHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsgX01faXRlcmF0ZSArPSBfX251bTt9CisKKyAgICB2b2lkCisgICAgX19yZXNpemUoc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCkKKyAgICB7IF9NX3Jlc2l6ZSArPSBfX2Zyb207IH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2l6ZV90IF9NX3NoaWZ0X2NvdW50OworICAgIHN0ZDo6c2l6ZV90IF9NX2l0ZXJhdGU7CisgICAgc3RkOjpzaXplX3QgX01fcmVzaXplOworICAgIGZsb2F0IF9NX2xpc3RfY29zdDsKKyAgICBmbG9hdCBfTV92ZWN0b3JfY29zdDsKKyAgICBib29sICBfTV92YWxpZDsKKyAgICBzdGQ6OnNpemVfdCBfTV9tYXhfc2l6ZTsKKyAgfTsKKworICBjbGFzcyBfX2xpc3QydmVjdG9yX3N0YWNrX2luZm8gCisgIDogcHVibGljIF9fbGlzdDJ2ZWN0b3JfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX2xpc3QydmVjdG9yX3N0YWNrX2luZm8oY29uc3QgX19saXN0MnZlY3Rvcl9pbmZvJiBfX28pIAorICAgIDogX19saXN0MnZlY3Rvcl9pbmZvKF9fbykge30KKyAgfTsKKworICBjbGFzcyBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yCisgIDogcHVibGljIF9fdHJhY2VfYmFzZTxfX2xpc3QydmVjdG9yX2luZm8sIF9fbGlzdDJ2ZWN0b3Jfc3RhY2tfaW5mbz4gCisgIHsKKyAgcHVibGljOgorICAgIF9fdHJhY2VfbGlzdF90b192ZWN0b3IoKQorICAgIDogX190cmFjZV9iYXNlPF9fbGlzdDJ2ZWN0b3JfaW5mbywgX19saXN0MnZlY3Rvcl9zdGFja19pbmZvPigpCisgICAgeyBfX2lkID0gImxpc3QtdG8tdmVjdG9yIjsgfQorCisgICAgfl9fdHJhY2VfbGlzdF90b192ZWN0b3IoKSB7IH0KKworICAgIC8vIEluc2VydCBhIG5ldyBub2RlIGF0IGNvbnN0cnVjdCB3aXRoIG9iamVjdCwgY2FsbHN0YWNrIGFuZCBpbml0aWFsIHNpemUuCisgICAgdm9pZAorICAgIF9faW5zZXJ0KF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIHsgX19hZGRfb2JqZWN0KF9fb2JqLCBfX2xpc3QydmVjdG9yX2luZm8oX19zdGFjaykpOyB9CisKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoIV9fcmVzKQorCXJldHVybjsKKworICAgICAgZmxvYXQgX192YyA9IF9fdmVjdG9yX2Nvc3QoX19yZXMtPl9fc2hpZnRfY291bnQoKSwgX19yZXMtPl9faXRlcmF0ZSgpKTsKKyAgICAgIGZsb2F0IF9fbGMgPSBfX2xpc3RfY29zdChfX3Jlcy0+X19zaGlmdF9jb3VudCgpLCBfX3Jlcy0+X19pdGVyYXRlKCkpOworICAgICAgX19yZXMtPl9fc2V0X3ZlY3Rvcl9jb3N0KF9fdmMpOworICAgICAgX19yZXMtPl9fc2V0X2xpc3RfY29zdChfX2xjKTsKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29iaik7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgbGl2ZSBtYXAuCisgICAgX19saXN0MnZlY3Rvcl9pbmZvKiBfX2ZpbmQoY29uc3Qgdm9pZCogX19vYmopOworCisgICAgLy8gQ29sbGVjdCBjb3N0IG9mIG9wZXJhdGlvbnMuCisgICAgdm9pZAorICAgIF9fb3ByX2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19zaXplKQorICAgIHsKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fb3ByX2luc2VydChfX3NoaWZ0LCBfX3NpemUpOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pdGVyYXRlKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7CisgICAgICBfX2xpc3QydmVjdG9yX2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX29wcl9pdGVyYXRlKF9fbnVtKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19pbnZhbGlkX29wZXJhdG9yKGNvbnN0IHZvaWQqIF9fb2JqKQorICAgIHsKKyAgICAgIF9fbGlzdDJ2ZWN0b3JfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoX19yZXMpCisJX19yZXMtPl9fc2V0X2ludmFsaWQoKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QgX190bykKKyAgICB7CisgICAgICBfX2xpc3QydmVjdG9yX2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX3Jlc2l6ZShfX2Zyb20sIF9fdG8pOworICAgIH0KKworICAgIGZsb2F0CisgICAgX192ZWN0b3JfY29zdChzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX2l0ZXJhdGUpCisgICAgeworICAgICAgLy8gVGhlIHJlc3VsdGluZyB2ZWN0b3Igd2lsbCB1c2UgYSAncmVzZXJ2ZScgbWV0aG9kLgorICAgICAgcmV0dXJuIChfX3NoaWZ0CisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3Jfc2hpZnRfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9faXRlcmF0ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUpOyAKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fbGlzdF9jb3N0KHN0ZDo6c2l6ZV90IF9fc2hpZnQsIHN0ZDo6c2l6ZV90IF9faXRlcmF0ZSkKKyAgICB7CisgICAgICByZXR1cm4gKF9fc2hpZnQKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2xpc3Rfc2hpZnRfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9faXRlcmF0ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsgCisgICAgfQorICB9OworCisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpID0gbmV3IF9fdHJhY2VfbGlzdF90b192ZWN0b3IoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvcikpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+CisJICBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX2luc2VydChfX29iaiwgX19nZXRfc3RhY2soKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X19kZXN0cnVjdChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgCisJCQkJc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19zaXplKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX2xpc3RfdG9fdmVjdG9yKS0+X19vcHJfaW5zZXJ0KF9fb2JqLCBfX3NoaWZ0LCAKKwkJCQkJCQkgICBfX3NpemUpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9pdGVyYXRlKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX251bSA9IDEpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX29wcl9pdGVyYXRlKF9fb2JqLCBfX251bSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbGlzdF90b192ZWN0b3IpLT5fX2ludmFsaWRfb3BlcmF0b3IoX19vYmopOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9saXN0X3RvX3ZlY3Rvcl9yZXNpemUoY29uc3Qgdm9pZCogX19vYmosIAorCQkJCXN0ZDo6c2l6ZV90IF9fZnJvbSwgc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19saXN0X3RvX3ZlY3RvciktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX0xJU1RfVE9fVkVDVE9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbWFwX3RvX3Vub3JkZXJlZF9tYXAuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3Yzg0OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgKQEAgLTAsMCArMSwyOTcgQEAKKy8vIC0qLSBDKysgLSotCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworLy8gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKy8vIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKy8vIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisvLyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKKy8vIE1BIDAyMTExLTEzMDcsIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlCisvLyBzb2Z0d2FyZSBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzCisvLyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcworLy8gZmlsZSwgb3IgeW91IGNvbXBpbGUgdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8KKy8vIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUKKy8vIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIKKy8vIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwKKy8vIFB1YmxpYyBMaWNlbnNlLgorCisvKiogQGZpbGUgcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX21hcF90b191bm9yZGVyZWRfbWFwLmgKKyAqICBAYnJpZWYgRGlhZ25vc3RpY3MgZm9yIG1hcCB0byB1bm9yZGVyZWRfbWFwLgorICovCisKKy8vIFdyaXR0ZW4gYnkgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9NQVBfVE9fVU5PUkRFUkVEX01BUF9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTUFQX1RPX1VOT1JERVJFRF9NQVBfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICBpbmxpbmUgaW50CisgIF9fbG9nMihzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsKKyAgICBmb3IgKGludCBfX2JpdF9jb3VudCA9IHNpemVvZihzdGQ6OnNpemVfdCkgLSAxOyBfX2JpdF9jb3VudCA+PSAwOworCSAtLSBfX2JpdF9jb3VudCkgCisgICAgICBpZiAoKDIgPDwgX19iaXRfY291bnQpICYgX19zaXplKQorCXJldHVybiBfX2JpdF9jb3VudDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlubGluZSBmbG9hdAorICBfX21hcF9pbnNlcnRfY29zdChzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsgcmV0dXJuIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19tYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yKS5fX3ZhbHVlIAorCSAgICAqIHN0YXRpY19jYXN0PGZsb2F0PihfX2xvZzIoX19zaXplKSkpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIF9fbWFwX2VyYXNlX2Nvc3Qoc3RkOjpzaXplX3QgX19zaXplKQorICB7IHJldHVybiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2VyYXNlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9fbG9nMihfX3NpemUpKSk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgX19tYXBfZmluZF9jb3N0KHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgeyByZXR1cm4gKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9maW5kX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KF9fbG9nMihfX3NpemUpKSk7IH0KKworICAvKiogQGJyaWVmIEEgbWFwLXRvLXVub3JkZXJlZF9tYXAgaW5zdHJ1bWVudGF0aW9uIGxpbmUgaW4gdGhlIAorICAgICAgb2JqZWN0IHRhYmxlLiAgKi8KKyAgY2xhc3MgX19tYXAydW1hcF9pbmZvCisgIDogcHVibGljIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX21hcDJ1bWFwX2luZm8oKQorICAgIDogX01faW5zZXJ0KDApLCBfTV9lcmFzZSgwKSwgX01fZmluZCgwKSwgX01faXRlcmF0ZSgwKSwKKyAgICAgIF9NX3VtYXBfY29zdCgwLjApLCBfTV9tYXBfY29zdCgwLjApLCBfTV92YWxpZCh0cnVlKSB7IH0KKyAgICAKKyAgICBfX21hcDJ1bWFwX2luZm8oX19zdGFja190IF9fc3RhY2spCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFjayksIF9NX2luc2VydCgwKSwgX01fZXJhc2UoMCksIF9NX2ZpbmQoMCksIAorICAgICAgX01faXRlcmF0ZSgwKSwgX01fdW1hcF9jb3N0KDAuMCksIF9NX21hcF9jb3N0KDAuMCksIF9NX3ZhbGlkKHRydWUpIHsgfQorCisgICAgdmlydHVhbCB+X19tYXAydW1hcF9pbmZvKCkgeyB9CisKKyAgICBfX21hcDJ1bWFwX2luZm8oY29uc3QgX19tYXAydW1hcF9pbmZvJiBfX28pCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19vKSwgX01faW5zZXJ0KF9fby5fTV9pbnNlcnQpLAorICAgICAgX01fZXJhc2UoX19vLl9NX2VyYXNlKSwgX01fZmluZChfX28uX01fZmluZCksCisgICAgICBfTV9pdGVyYXRlKF9fby5fTV9pdGVyYXRlKSwgX01fdW1hcF9jb3N0KF9fby5fTV91bWFwX2Nvc3QpLAorICAgICAgX01fbWFwX2Nvc3QoX19vLl9NX21hcF9jb3N0KSwgX01fdmFsaWQoX19vLl9NX3ZhbGlkKSB7IH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fbWFwMnVtYXBfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX2luc2VydCAgICArPSBfX28uX01faW5zZXJ0OworICAgICAgX01fZXJhc2UgICAgICs9IF9fby5fTV9lcmFzZTsKKyAgICAgIF9NX2ZpbmQgICAgICArPSBfX28uX01fZmluZDsKKyAgICAgIF9NX3VtYXBfY29zdCArPSBfX28uX01fdW1hcF9jb3N0OworICAgICAgX01fbWFwX2Nvc3QgICs9IF9fby5fTV9tYXBfY29zdDsKKyAgICAgIF9NX3ZhbGlkICAgICAmPSBfX28uX01fdmFsaWQ7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlWnUgJS4wZiAlLjBmICVzXG4iLAorCQkgICBfTV9pbnNlcnQsIF9NX2VyYXNlLCBfTV9maW5kLCBfTV9pdGVyYXRlLCBfTV9tYXBfY29zdCwKKwkJICAgX01fdW1hcF9jb3N0LCBfTV92YWxpZCA/ICJ2YWxpZCIgOiAiaW52YWxpZCIpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX21hcF9jb3N0IC0gX01fdW1hcF9jb3N0OyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QKKyAgICB7IHJldHVybiAiY2hhbmdlIHN0ZDo6bWFwIHRvIHN0ZDo6dW5vcmRlcmVkX21hcCI7IH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9pbnNlcnQoc3RkOjpzaXplX3QgX19zaXplLCBzdGQ6OnNpemVfdCBfX2NvdW50KQorICAgIHsKKyAgICAgIF9NX2luc2VydCArPSBfX2NvdW50OworICAgICAgX01fbWFwX2Nvc3QgKz0gX19jb3VudCAqIF9fbWFwX2luc2VydF9jb3N0KF9fc2l6ZSk7CisgICAgICBfTV91bWFwX2Nvc3QKKwkrPSAoX19jb3VudAorCSAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfZXJhc2Uoc3RkOjpzaXplX3QgX19zaXplLCBzdGQ6OnNpemVfdCBfX2NvdW50KQorICAgIHsKKyAgICAgIF9NX2VyYXNlICs9IF9fY291bnQ7CisgICAgICBfTV9tYXBfY29zdCArPSBfX2NvdW50ICogX19tYXBfZXJhc2VfY29zdChfX3NpemUpOworICAgICAgX01fdW1hcF9jb3N0CisJKz0gKF9fY291bnQKKwkgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX191bWFwX2VyYXNlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfZmluZChzdGQ6OnNpemVfdCBfX3NpemUpCisgICAgeworICAgICAgX01fZmluZCArPSAxOworICAgICAgX01fbWFwX2Nvc3QgKz0gX19tYXBfZmluZF9jb3N0KF9fc2l6ZSk7CisgICAgICBfTV91bWFwX2Nvc3QgKz0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9maW5kX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX3JlY29yZF9pdGVyYXRlKHN0ZDo6c2l6ZV90IF9fY291bnQpCisgICAgeworICAgICAgX01faXRlcmF0ZSArPSBfX2NvdW50OworICAgICAgX01fbWFwX2Nvc3QKKwkrPSAoX19jb3VudAorCSAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICAgIF9NX3VtYXBfY29zdAorCSs9IChfX2NvdW50CisJICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19yZWNvcmRfaW52YWxpZGF0ZSgpCisgICAgeyBfTV92YWxpZCA9IGZhbHNlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9pbnNlcnQ7CisgICAgc3RkOjpzaXplX3QgX01fZXJhc2U7CisgICAgc3RkOjpzaXplX3QgX01fZmluZDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVyYXRlOworICAgIGZsb2F0IF9NX3VtYXBfY29zdDsKKyAgICBmbG9hdCBfTV9tYXBfY29zdDsKKyAgICBib29sICBfTV92YWxpZDsKKyAgfTsKKworCisgIC8qKiBAYnJpZWYgQSBtYXAtdG8tdW5vcmRlcmVkX21hcCBpbnN0cnVtZW50YXRpb24gbGluZSBpbiB0aGUgCisgICAgICBzdGFjayB0YWJsZS4gICovCisgIGNsYXNzIF9fbWFwMnVtYXBfc3RhY2tfaW5mbyAKKyAgOiBwdWJsaWMgX19tYXAydW1hcF9pbmZvCisgIHsKKyAgcHVibGljOgorICAgIF9fbWFwMnVtYXBfc3RhY2tfaW5mbyhjb25zdCBfX21hcDJ1bWFwX2luZm8mIF9fbykKKyAgICA6IF9fbWFwMnVtYXBfaW5mbyhfX28pIHsgfQorICB9OworCisgIC8qKiBAYnJpZWYgTWFwLXRvLXVub3JkZXJlZF9tYXAgaW5zdHJ1bWVudGF0aW9uIHByb2R1Y2VyLiAgKi8KKyAgY2xhc3MgX190cmFjZV9tYXAydW1hcAorICA6IHB1YmxpYyBfX3RyYWNlX2Jhc2U8X19tYXAydW1hcF9pbmZvLCBfX21hcDJ1bWFwX3N0YWNrX2luZm8+IAorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX21hcDJ1bWFwKCkKKyAgICA6IF9fdHJhY2VfYmFzZTxfX21hcDJ1bWFwX2luZm8sIF9fbWFwMnVtYXBfc3RhY2tfaW5mbz4oKQorICAgIHsgX19pZCA9ICJtYXAtdG8tdW5vcmRlcmVkLW1hcCI7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCkgPSBuZXcgX190cmFjZV9tYXAydW1hcCgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9yZXBvcnQoRklMRSogX19mLAorCQkJCSAgICAgIF9fd2FybmluZ192ZWN0b3JfdCYgX193YXJuaW5ncykKKyAgeworICAgIGlmIChfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApKSAKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT5fX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT4KKyAgICAgIF9fYWRkX29iamVjdChfX29iaiwgX19tYXAydW1hcF9pbmZvKF9fZ2V0X3N0YWNrKCkpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWFwMnVtYXApLT5fX3JldGlyZV9vYmplY3QoX19vYmopOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQoY29uc3Qgdm9pZCogX19vYmosIAorCQkJCSAgICAgIHN0ZDo6c2l6ZV90IF9fc2l6ZSwgc3RkOjpzaXplX3QgX19jb3VudCkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9fbWFwMnVtYXBfaW5mbyogX19pbmZvCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKworICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2luc2VydChfX3NpemUsIF9fY291bnQpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZShjb25zdCB2b2lkKiBfX29iaiwgCisJCQkJICAgICBzdGQ6OnNpemVfdCBfX3NpemUsIHN0ZDo6c2l6ZV90IF9fY291bnQpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpIAorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8gCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKworICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2VyYXNlKF9fc2l6ZSwgX19jb3VudCk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9fbWFwMnVtYXBfaW5mbyogX19pbmZvCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKworICAgIGlmIChfX2luZm8pCisgICAgICBfX2luZm8tPl9fcmVjb3JkX2ZpbmQoX19zaXplKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaXRlcmF0ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19jb3VudCkKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9fbWFwMnVtYXBfaW5mbyogX19pbmZvCisgICAgICA9IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXAydW1hcCktPl9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAKKyAgICBpZiAoX19pbmZvKQorICAgICAgX19pbmZvLT5fX3JlY29yZF9pdGVyYXRlKF9fY291bnQpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX19tYXAydW1hcF9pbmZvKiBfX2luZm8KKyAgICAgID0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21hcDJ1bWFwKS0+X19nZXRfb2JqZWN0X2luZm8oX19vYmopOworCisgICAgaWYgKF9faW5mbykKKyAgICAgIF9faW5mby0+X19yZWNvcmRfaW52YWxpZGF0ZSgpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX01BUF9UT19VTk9SREVSRURfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzJiOTRlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oCkBAIC0wLDAgKzEsMTczIEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisvLyBNQSAwMjExMS0xMzA3LCBVU0EuCisKKy8vIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgdXNlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgZnJlZQorLy8gc29mdHdhcmUgbGlicmFyeSB3aXRob3V0IHJlc3RyaWN0aW9uLiAgU3BlY2lmaWNhbGx5LCBpZiBvdGhlciBmaWxlcworLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzIG9yIHVzZSBtYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoaXMKKy8vIGZpbGUsIG9yIHlvdSBjb21waWxlIHRoaXMgZmlsZSBhbmQgbGluayBpdCB3aXRoIG90aGVyIGZpbGVzIHRvCisvLyBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZmlsZSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlCisvLyByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyCisvLyByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsCisvLyBQdWJsaWMgTGljZW5zZS4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9ub2RlLmgKKyAqICBAYnJpZWYgRGF0YSBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCBhIHNpbmdsZSBwcm9maWxpbmcgZXZlbnQuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTk9ERV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTk9ERV9IIDEKKworI2luY2x1ZGUgPGNzdGRpbz4gLy8gRklMRSwgZnByaW50ZgorCisjaW5jbHVkZSA8dmVjdG9yPgorI2lmIGRlZmluZWQgX0dMSUJDWFhfSEFWRV9FWEVDSU5GT19ICisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNlbmRpZgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICB0eXBlZGVmIGNvbnN0IHZvaWQqIF9fb2JqZWN0X3Q7CisgIHR5cGVkZWYgdm9pZCogX19pbnN0cnVjdGlvbl9hZGRyZXNzX3Q7CisgIHR5cGVkZWYgc3RkOjpfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9faW5zdHJ1Y3Rpb25fYWRkcmVzc190PiBfX3N0YWNrX25wdDsKKyAgdHlwZWRlZiBfX3N0YWNrX25wdCogX19zdGFja190OworCisgIHN0ZDo6c2l6ZV90IF9fc3RhY2tfbWF4X2RlcHRoKCk7CisKKyAgaW5saW5lIF9fc3RhY2tfdAorICBfX2dldF9zdGFjaygpCisgIHsKKyNpZiBkZWZpbmVkIF9HTElCQ1hYX0hBVkVfRVhFQ0lORk9fSAorICAgIHN0ZDo6c2l6ZV90IF9fbWF4X2RlcHRoID0gX19zdGFja19tYXhfZGVwdGgoKTsKKyAgICBpZiAoX19tYXhfZGVwdGggPT0gMCkKKyAgICAgIHJldHVybiAwOworICAgIF9fc3RhY2tfbnB0IF9fYnVmZmVyKF9fbWF4X2RlcHRoKTsKKyAgICBpbnQgX19kZXB0aCA9IGJhY2t0cmFjZSgmX19idWZmZXJbMF0sIF9fbWF4X2RlcHRoKTsKKyAgICBfX3N0YWNrX3QgX19zdGFjayA9IG5ldyBfX3N0YWNrX25wdChfX2RlcHRoKTsKKyAgICBfX2J1aWx0aW5fbWVtY3B5KCYoKl9fc3RhY2spWzBdLCAmX19idWZmZXJbMF0sCisJCSAgICAgX19kZXB0aCAqIHNpemVvZihfX29iamVjdF90KSk7CisgICAgcmV0dXJuIF9fc3RhY2s7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCisgIH0KKworICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX19zaXplKF9fc3RhY2tfdCBfX3N0YWNrKQorICB7CisgICAgaWYgKCFfX3N0YWNrKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIF9fc3RhY2stPnNpemUoKTsKKyAgfQorCisgIC8vIFhYWAorICBpbmxpbmUgdm9pZAorICBfX3dyaXRlKEZJTEUqIF9fZiwgX19zdGFja190IF9fc3RhY2spCisgIHsKKyAgICBpZiAoIV9fc3RhY2spCisgICAgICByZXR1cm47CisgIAorICAgIF9fc3RhY2tfbnB0Ojpjb25zdF9pdGVyYXRvciBfX2l0OworICAgIGZvciAoX19pdCA9IF9fc3RhY2stPmJlZ2luKCk7IF9faXQgIT0gX19zdGFjay0+ZW5kKCk7ICsrX19pdCkKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlcCAiLCAqX19pdCk7CisgIH0KKworICAvKiogQGJyaWVmIEhhc2ggZnVuY3Rpb24gZm9yIHN1bW1hcnkgdHJhY2UgdXNpbmcgY2FsbCBzdGFjayBhcyBpbmRleC4gICovCisgIGNsYXNzIF9fc3RhY2tfaGFzaCAKKyAgeworICBwdWJsaWM6CisgICAgc3RkOjpzaXplX3QKKyAgICBvcGVyYXRvcigpKF9fc3RhY2tfdCBfX3MpIGNvbnN0CisgICAgeworICAgICAgaWYgKCFfX3MpIAorCXJldHVybiAwOworCisgICAgICBfX1VJTlRQVFJfVFlQRV9fIF9faW5kZXggPSAwOworICAgICAgX19zdGFja19ucHQ6OmNvbnN0X2l0ZXJhdG9yIF9faXQ7CisgICAgICBmb3IgKF9faXQgPSBfX3MtPmJlZ2luKCk7IF9faXQgIT0gX19zLT5lbmQoKTsgKytfX2l0KQorCV9faW5kZXggKz0gcmVpbnRlcnByZXRfY2FzdDxfX1VJTlRQVFJfVFlQRV9fPigqX19pdCk7CisgICAgICByZXR1cm4gX19pbmRleDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yKCkgKF9fc3RhY2tfdCBfX3N0YWNrMSwgX19zdGFja190IF9fc3RhY2syKSBjb25zdAorICAgIHsKKyAgICAgIGlmICghX19zdGFjazEgJiYgIV9fc3RhY2syKQorCXJldHVybiB0cnVlOworICAgICAgaWYgKCFfX3N0YWNrMSB8fCAhX19zdGFjazIpCisJcmV0dXJuIGZhbHNlOworICAgICAgaWYgKF9fc3RhY2sxLT5zaXplKCkgIT0gX19zdGFjazItPnNpemUoKSkKKwlyZXR1cm4gZmFsc2U7CisKKyAgICAgIHN0ZDo6c2l6ZV90IF9fYnl0ZV9zaXplCisJPSBfX3N0YWNrMS0+c2l6ZSgpICogc2l6ZW9mKF9fc3RhY2tfbnB0Ojp2YWx1ZV90eXBlKTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5fbWVtY21wKCYoKl9fc3RhY2sxKVswXSwgJigqX19zdGFjazIpWzBdLAorCQkJICAgICAgX19ieXRlX3NpemUpID09IDA7CisgICAgfQorICB9OworCisKKyAgLyoqIEBicmllZiBCYXNlIGNsYXNzIGZvciBhIGxpbmUgaW4gdGhlIG9iamVjdCB0YWJsZS4gICovCisgIGNsYXNzIF9fb2JqZWN0X2luZm9fYmFzZQorICB7CisgIHB1YmxpYzoKKyAgICBfX29iamVjdF9pbmZvX2Jhc2UoKSB7IH0KKworICAgIF9fb2JqZWN0X2luZm9fYmFzZShfX3N0YWNrX3QgX19zdGFjaykKKyAgICA6IF9NX3N0YWNrKF9fc3RhY2spLCBfTV92YWxpZCh0cnVlKSB7IH0KKworICAgIF9fb2JqZWN0X2luZm9fYmFzZShjb25zdCBfX29iamVjdF9pbmZvX2Jhc2UmIF9fbykKKyAgICA6IF9NX3N0YWNrKF9fby5fTV9zdGFjayksIF9NX3ZhbGlkKF9fby5fTV92YWxpZCkgeyB9CisKKyAgICB2aXJ0dWFsIH5fX29iamVjdF9pbmZvX2Jhc2UoKSB7IH0KKworICAgIGJvb2wKKyAgICBfX2lzX3ZhbGlkKCkgY29uc3QgCisgICAgeyByZXR1cm4gX01fdmFsaWQ7IH0KKyAgICAKKyAgICBfX3N0YWNrX3QKKyAgICBfX3N0YWNrKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV9zdGFjazsgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBfX3dyaXRlKEZJTEUqIF9fZikgY29uc3QgPSAwOworCisgIHByb3RlY3RlZDoKKyAgICBfX3N0YWNrX3QgX01fc3RhY2s7CisgICAgYm9vbCBfTV92YWxpZDsKKyAgfTsKKworCisgIC8qKiBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgYSBsaW5lIGluIHRoZSBzdGFjayB0YWJsZS4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8+CisgICAgY2xhc3MgX19zdGFja19pbmZvX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgX19zdGFja19pbmZvX2Jhc2UoKSB7IH0KKyAgICAgIF9fc3RhY2tfaW5mb19iYXNlKGNvbnN0IF9fb2JqZWN0X2luZm8mIF9faW5mbykgPSAwOworICAgICAgdmlydHVhbCB+X19zdGFja19pbmZvX2Jhc2UoKSB7fQorICAgICAgdm9pZCBfX21lcmdlKGNvbnN0IF9fb2JqZWN0X2luZm8mIF9faW5mbykgPSAwOworICAgICAgdmlydHVhbCBmbG9hdCBfX21hZ25pdHVkZSgpIGNvbnN0ID0gMDsKKyAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogX19nZXRfaWQoKSBjb25zdCA9IDA7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorI2VuZGlmIC8qIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfTk9ERV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfc3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFiOTdlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfc3RhdGUuaApAQCAtMCwwICsxLDczIEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisvLyBNQSAwMjExMS0xMzA3LCBVU0EuCisKKy8vIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgdXNlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgZnJlZQorLy8gc29mdHdhcmUgbGlicmFyeSB3aXRob3V0IHJlc3RyaWN0aW9uLiAgU3BlY2lmaWNhbGx5LCBpZiBvdGhlciBmaWxlcworLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzIG9yIHVzZSBtYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoaXMKKy8vIGZpbGUsIG9yIHlvdSBjb21waWxlIHRoaXMgZmlsZSBhbmQgbGluayBpdCB3aXRoIG90aGVyIGZpbGVzIHRvCisvLyBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZmlsZSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlCisvLyByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyCisvLyByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsCisvLyBQdWJsaWMgTGljZW5zZS4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oCisgKiAgQGJyaWVmIEdsb2JhbCBwcm9maWxlciBzdGF0ZS4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9TVEFURV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfU1RBVEVfSCAxCisKK25hbWVzcGFjZSBfX2dudV9wcm9maWxlCit7CisgIGVudW0gX19zdGF0ZV90eXBlIHsgX19PTiwgX19PRkYsIF9fSU5WQUxJRCB9OworCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19zdGF0ZV90eXBlLCBfX3N0YXRlLCBfX0lOVkFMSUQpOworCisgIGlubGluZSBib29sCisgIF9fdHVybihfX3N0YXRlX3R5cGUgX19zKQorICB7IHJldHVybiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpCisJICAgID09IF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpLAorCQkJCQkgICBfX0lOVkFMSUQsIF9fcykpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgX190dXJuX29uKCkKKyAgeyByZXR1cm4gX190dXJuKF9fT04pOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgX190dXJuX29mZigpCisgIHsgcmV0dXJuIF9fdHVybihfX09GRik7IH0KKworICBpbmxpbmUgYm9vbAorICBfX2lzX29uKCkKKyAgeyByZXR1cm4gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fc3RhdGUpID09IF9fT047IH0KKworICBpbmxpbmUgYm9vbAorICBfX2lzX29mZigpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3N0YXRlKSA9PSBfX09GRjsgfQorCisgIGlubGluZSBib29sCisgIF9faXNfaW52YWxpZCgpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3N0YXRlKSA9PSBfX0lOVkFMSUQ7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1NUQVRFX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pbXBsL3Byb2ZpbGVyX3RyYWNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDA1NDIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oCkBAIC0wLDAgKzEsNjY2IEBACisvLyAtKi0gQysrIC0qLQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKy8vIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKy8vIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisvLyB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisvLyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorLy8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLy8gYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisvLyBNQSAwMjExMS0xMzA3LCBVU0EuCisKKy8vIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgdXNlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgZnJlZQorLy8gc29mdHdhcmUgbGlicmFyeSB3aXRob3V0IHJlc3RyaWN0aW9uLiAgU3BlY2lmaWNhbGx5LCBpZiBvdGhlciBmaWxlcworLy8gaW5zdGFudGlhdGUgdGVtcGxhdGVzIG9yIHVzZSBtYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoaXMKKy8vIGZpbGUsIG9yIHlvdSBjb21waWxlIHRoaXMgZmlsZSBhbmQgbGluayBpdCB3aXRoIG90aGVyIGZpbGVzIHRvCisvLyBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZmlsZSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlCisvLyByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyCisvLyByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsCisvLyBQdWJsaWMgTGljZW5zZS4KKworLyoqIEBmaWxlIHByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oCisgKiAgQGJyaWVmIERhdGEgc3RydWN0dXJlcyB0byByZXByZXNlbnQgcHJvZmlsaW5nIHRyYWNlcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9UUkFDRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVFJBQ0VfSCAxCisKKyNpbmNsdWRlIDxjc3RkaW8+ICAvLyBmb3BlbiwgZmNsb3NlLCBmcHJpbnRmLCBGSUxFCisjaW5jbHVkZSA8Y2Vycm5vPgorI2luY2x1ZGUgPGNzdGRsaWI+IC8vIGF0b2YsIGF0b2ksIHN0cnRvbCwgZ2V0ZW52LCBhdGV4aXQsIGFib3J0CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworI2RlZmluZSBfR0xJQkNYWF9JTVBMX1VOT1JERVJFRF9NQVAgc3RkOjpfR0xJQkNYWF9TVERfQzo6dW5vcmRlcmVkX21hcAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjZWxzZQorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgorI2RlZmluZSBfR0xJQkNYWF9JTVBMX1VOT1JERVJFRF9NQVAgc3RkOjp0cjE6OnVub3JkZXJlZF9tYXAKKyNlbmRpZgorCisjaW5jbHVkZSA8ZXh0L2NvbmN1cnJlbmNlLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfYWxnb3MuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfc3RhdGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEludGVybmFsIGVudmlyb25tZW50LiAgVmFsdWVzIGNhbiBiZSBzZXQgb25lIG9mIHR3byB3YXlzOgorICAgICAgMS4gSW4gY29uZmlnIGZpbGUgInZhciA9IHZhbHVlIi4gIFRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlIHBhdGggaXMgCisgICAgICAgICBsaWJzdGRjeHgtcHJvZmlsZS5jb25mLgorICAgICAgMi4gQnkgc2V0dGluZyBwcm9jZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcy4gIEZvciBpbnN0YW5jZSwgaW4gYSBCYXNoCisgICAgICAgICBzaGVsbCB5b3UgY2FuIHNldCB0aGUgdW5pdCBjb3N0IG9mIGl0ZXJhdGluZyB0aHJvdWdoIGEgbWFwIGxpa2UgdGhpczoKKyAgICAgICAgIGV4cG9ydCBfX21hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yPTUuMC4KKwkgSWYgYSB2YWx1ZSBpcyBzZXQgYm90aCBpbiB0aGUgaW5wdXQgZmlsZSBhbmQgdGhyb3VnaCBhbiBlbnZpcm9ubWVudAorCSB2YXJpYWJsZSwgdGhlIGVudmlyb25tZW50IHZhbHVlIHRha2VzIHByZWNlZGVuY2UuICAqLworICB0eXBlZGVmIF9HTElCQ1hYX0lNUExfVU5PUkRFUkVEX01BUDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IF9fZW52X3Q7CisKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfVU5JTklUX0RBVEEoX19lbnZfdCwgX19lbnYpOworCisgIC8qKiBAYnJpZWYgTWFzdGVyIGxvY2suICAqLworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9VTklOSVRfREFUQShfX2dudV9jeHg6Ol9fbXV0ZXgsIF9fZ2xvYmFsX2xvY2spOworCisgIC8qKiBAYnJpZWYgUmVwcmVzZW50YXRpb24gb2YgYSB3YXJuaW5nLiAgKi8KKyAgc3RydWN0IF9fd2FybmluZ19kYXRhCisgIHsKKyAgICBmbG9hdCBfX21hZ25pdHVkZTsKKyAgICBfX3N0YWNrX3QgX19jb250ZXh0OworICAgIGNvbnN0IGNoYXIqIF9fd2FybmluZ19pZDsKKyAgICBzdGQ6OnN0cmluZyBfX3dhcm5pbmdfbWVzc2FnZTsKKworICAgIF9fd2FybmluZ19kYXRhKCkKKyAgICA6IF9fbWFnbml0dWRlKDAuMCksIF9fY29udGV4dCgwKSwgX193YXJuaW5nX2lkKDApIHsgfQorCisgICAgX193YXJuaW5nX2RhdGEoZmxvYXQgX19tLCBfX3N0YWNrX3QgX19jLCBjb25zdCBjaGFyKiBfX2lkLCAKKwkJICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9fbXNnKQorICAgIDogX19tYWduaXR1ZGUoX19tKSwgX19jb250ZXh0KF9fYyksIF9fd2FybmluZ19pZChfX2lkKSwgCisgICAgICBfX3dhcm5pbmdfbWVzc2FnZShfX21zZykgeyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IF9fd2FybmluZ19kYXRhJiBfX290aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIF9fbWFnbml0dWRlIDwgX19vdGhlci5fX21hZ25pdHVkZTsgfQorICB9OworCisgIHR5cGVkZWYgc3RkOjpfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9fd2FybmluZ19kYXRhPiBfX3dhcm5pbmdfdmVjdG9yX3Q7CisKKyAgLy8gRGVmaW5lZCBpbiBwcm9maWxlcl88ZGlhZ25vc3RpYyBuYW1lPi5oLgorICBjbGFzcyBfX3RyYWNlX2hhc2hfZnVuYzsKKyAgY2xhc3MgX190cmFjZV9oYXNodGFibGVfc2l6ZTsKKyAgY2xhc3MgX190cmFjZV9tYXAydW1hcDsKKyAgY2xhc3MgX190cmFjZV92ZWN0b3Jfc2l6ZTsKKyAgY2xhc3MgX190cmFjZV92ZWN0b3JfdG9fbGlzdDsKKyAgY2xhc3MgX190cmFjZV9saXN0X3RvX3NsaXN0OyAKKyAgY2xhc3MgX190cmFjZV9saXN0X3RvX3ZlY3RvcjsgCisgIHZvaWQgX190cmFjZV92ZWN0b3Jfc2l6ZV9pbml0KCk7CisgIHZvaWQgX190cmFjZV9oYXNodGFibGVfc2l6ZV9pbml0KCk7CisgIHZvaWQgX190cmFjZV9oYXNoX2Z1bmNfaW5pdCgpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaW5pdCgpOworICB2b2lkIF9fdHJhY2VfbGlzdF90b19zbGlzdF9pbml0KCk7ICAKKyAgdm9pZCBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luaXQoKTsgIAorICB2b2lkIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5pdCgpOworICB2b2lkIF9fdHJhY2VfdmVjdG9yX3NpemVfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsKKyAgdm9pZCBfX3RyYWNlX2hhc2h0YWJsZV9zaXplX3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7CisgIHZvaWQgX190cmFjZV9oYXNoX2Z1bmNfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsKKyAgdm9pZCBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7CisgIHZvaWQgX190cmFjZV9saXN0X3RvX3NsaXN0X3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7IAorICB2b2lkIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfcmVwb3J0KEZJTEUqLCBfX3dhcm5pbmdfdmVjdG9yX3QmKTsKKyAgdm9pZCBfX3RyYWNlX21hcF90b191bm9yZGVyZWRfbWFwX3JlcG9ydChGSUxFKiwgX193YXJuaW5nX3ZlY3Rvcl90Jik7CisKKyAgc3RydWN0IF9fY29zdF9mYWN0b3IKKyAgeworICAgIGNvbnN0IGNoYXIqIF9fZW52X3ZhcjsKKyAgICBmbG9hdCBfX3ZhbHVlOworICB9OworCisgIHR5cGVkZWYgc3RkOjpfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9fY29zdF9mYWN0b3IqPiBfX2Nvc3RfZmFjdG9yX3ZlY3RvcjsKKworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfaGFzaF9mdW5jKiwgX1NfaGFzaF9mdW5jLCAwKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX2hhc2h0YWJsZV9zaXplKiwgX1NfaGFzaHRhYmxlX3NpemUsIDApOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfbWFwMnVtYXAqLCBfU19tYXAydW1hcCwgMCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX190cmFjZV92ZWN0b3Jfc2l6ZSosIF9TX3ZlY3Rvcl9zaXplLCAwKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX3ZlY3Rvcl90b19saXN0KiwgX1NfdmVjdG9yX3RvX2xpc3QsIDApOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fdHJhY2VfbGlzdF90b19zbGlzdCosIF9TX2xpc3RfdG9fc2xpc3QsIDApOyAKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX3RyYWNlX2xpc3RfdG9fdmVjdG9yKiwgX1NfbGlzdF90b192ZWN0b3IsIDApOworCisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX192ZWN0b3Jfc2hpZnRfY29zdF9mYWN0b3IsIAorCQkJICAgICAgIHsiX192ZWN0b3Jfc2hpZnRfY29zdF9mYWN0b3IiLCAxLjB9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3ZlY3Rvcl9pdGVyYXRlX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX192ZWN0b3JfaXRlcmF0ZV9jb3N0X2ZhY3RvciIsIDEuMH0pOworICBfR0xJQkNYWF9QUk9GSUxFX0RFRklORV9EQVRBKF9fY29zdF9mYWN0b3IsIF9fdmVjdG9yX3Jlc2l6ZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fdmVjdG9yX3Jlc2l6ZV9jb3N0X2ZhY3RvciIsIDEuMH0pOyAKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX2xpc3Rfc2hpZnRfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX2xpc3Rfc2hpZnRfY29zdF9mYWN0b3IiLCAwLjB9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX2xpc3RfaXRlcmF0ZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbGlzdF9pdGVyYXRlX2Nvc3RfZmFjdG9yIiwgMTAuMH0pOyAKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX2xpc3RfcmVzaXplX2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX19saXN0X3Jlc2l6ZV9jb3N0X2ZhY3RvciIsIDAuMH0pOyAKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX21hcF9pbnNlcnRfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX21hcF9pbnNlcnRfY29zdF9mYWN0b3IiLCAxLjV9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX21hcF9lcmFzZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbWFwX2VyYXNlX2Nvc3RfZmFjdG9yIiwgMS41fSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19tYXBfZmluZF9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbWFwX2ZpbmRfY29zdF9mYWN0b3IiLCAxfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX19tYXBfaXRlcmF0ZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fbWFwX2l0ZXJhdGVfY29zdF9mYWN0b3IiLCAyLjN9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3VtYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yLAorCQkJICAgICAgIHsiX191bWFwX2luc2VydF9jb3N0X2ZhY3RvciIsIDEyLjB9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3VtYXBfZXJhc2VfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX3VtYXBfZXJhc2VfY29zdF9mYWN0b3IiLCAxMi4wfSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3RvciwgX191bWFwX2ZpbmRfY29zdF9mYWN0b3IsCisJCQkgICAgICAgeyJfX3VtYXBfZmluZF9jb3N0X2ZhY3RvciIsIDEwLjB9KTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShfX2Nvc3RfZmFjdG9yLCBfX3VtYXBfaXRlcmF0ZV9jb3N0X2ZhY3RvciwKKwkJCSAgICAgICB7Il9fdW1hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yIiwgMS43fSk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoX19jb3N0X2ZhY3Rvcl92ZWN0b3IqLCBfX2Nvc3RfZmFjdG9ycywgMCk7CisKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShjb25zdCBjaGFyKiwgX1NfdHJhY2VfZmlsZV9uYW1lLAorCQkJICAgICAgIF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfUEFUSF9ST09UKTsKKyAgX0dMSUJDWFhfUFJPRklMRV9ERUZJTkVfREFUQShzdGQ6OnNpemVfdCwgX1NfbWF4X3dhcm5fY291bnQsCisJCQkgICAgICAgX0dMSUJDWFhfUFJPRklMRV9NQVhfV0FSTl9DT1VOVCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoc3RkOjpzaXplX3QsIF9TX21heF9zdGFja19kZXB0aCwKKwkJCSAgICAgICBfR0xJQkNYWF9QUk9GSUxFX01BWF9TVEFDS19ERVBUSCk7CisgIF9HTElCQ1hYX1BST0ZJTEVfREVGSU5FX0RBVEEoc3RkOjpzaXplX3QsIF9TX21heF9tZW0sCisJCQkgICAgICAgX0dMSUJDWFhfUFJPRklMRV9NRU1fUEVSX0RJQUdOT1NUSUMpOworCisgIGlubGluZSBzdGQ6OnNpemVfdAorICBfX3N0YWNrX21heF9kZXB0aCgpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfc3RhY2tfZGVwdGgpOyB9CisKKyAgaW5saW5lIHN0ZDo6c2l6ZV90CisgIF9fbWF4X21lbSgpCisgIHsgcmV0dXJuIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfbWVtKTsgfQorCisgIC8qKiBAYnJpZWYgQmFzZSBjbGFzcyBmb3IgYWxsIHRyYWNlIHByb2R1Y2Vycy4gICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8sIHR5cGVuYW1lIF9fc3RhY2tfaW5mbz4KKyAgICBjbGFzcyBfX3RyYWNlX2Jhc2UKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gRG8gbm90IHBpY2sgdGhlIGluaXRpYWwgc2l6ZSB0b28gbGFyZ2UsIGFzIHdlIGRvbid0IGtub3cgd2hpY2gKKyAgICAgIC8vIGRpYWdub3N0aWNzIGFyZSBtb3JlIGFjdGl2ZS4KKyAgICAgIF9fdHJhY2VfYmFzZSgpCisgICAgICA6IF9fb2JqZWN0X3RhYmxlKDEwMDAwKSwgX19zdGFja190YWJsZSgxMDAwMCksCisJX19zdGFja190YWJsZV9ieXRlX3NpemUoMCksIF9faWQoMCkgeyB9CisKKyAgICAgIHZpcnR1YWwgfl9fdHJhY2VfYmFzZSgpIHsgfQorCisgICAgICB2b2lkIF9fYWRkX29iamVjdChfX29iamVjdF90IG9iamVjdCwgX19vYmplY3RfaW5mbyBfX2luZm8pOworICAgICAgX19vYmplY3RfaW5mbyogX19nZXRfb2JqZWN0X2luZm8oX19vYmplY3RfdCBfX29iamVjdCk7CisgICAgICB2b2lkIF9fcmV0aXJlX29iamVjdChfX29iamVjdF90IF9fb2JqZWN0KTsKKyAgICAgIHZvaWQgX193cml0ZShGSUxFKiBfX2YpOworICAgICAgdm9pZCBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKTsKKworICAgIHByaXZhdGU6CisgICAgICBfX2dudV9jeHg6Ol9fbXV0ZXggX19vYmplY3RfdGFibGVfbG9jazsKKyAgICAgIF9fZ251X2N4eDo6X19tdXRleCBfX3N0YWNrX3RhYmxlX2xvY2s7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX0lNUExfVU5PUkRFUkVEX01BUDxfX29iamVjdF90LCAKKwkJCQkJICBfX29iamVjdF9pbmZvPiBfX29iamVjdF90YWJsZV90OworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9JTVBMX1VOT1JERVJFRF9NQVA8X19zdGFja190LCBfX3N0YWNrX2luZm8sCisJCQkJCSAgX19zdGFja19oYXNoLCAKKwkJCQkJICBfX3N0YWNrX2hhc2g+IF9fc3RhY2tfdGFibGVfdDsKKyAgICAgIF9fb2JqZWN0X3RhYmxlX3QgX19vYmplY3RfdGFibGU7CisgICAgICBfX3N0YWNrX3RhYmxlX3QgX19zdGFja190YWJsZTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fc3RhY2tfdGFibGVfYnl0ZV9zaXplOworCisgICAgcHJvdGVjdGVkOgorICAgICAgY29uc3QgY2hhciogX19pZDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8sIHR5cGVuYW1lIF9fc3RhY2tfaW5mbz4KKyAgICB2b2lkCisgICAgX190cmFjZV9iYXNlPF9fb2JqZWN0X2luZm8sIF9fc3RhY2tfaW5mbz46OgorICAgIF9fY29sbGVjdF93YXJuaW5ncyhfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgICAgeworICAgICAgZm9yICh0eXBlbmFtZSBfX3N0YWNrX3RhYmxlX3Q6Oml0ZXJhdG9yIF9faXQKKwkgICAgID0gX19zdGFja190YWJsZS5iZWdpbigpOyBfX2l0ICE9IF9fc3RhY2tfdGFibGUuZW5kKCk7ICsrX19pdCkKKwlfX3dhcm5pbmdzLnB1c2hfYmFjayhfX3dhcm5pbmdfZGF0YSgoKl9faXQpLnNlY29uZC5fX21hZ25pdHVkZSgpLAorCQkJCQkgICAgKCpfX2l0KS5maXJzdCwgX19pZCwKKwkJCQkJICAgICgqX19pdCkuc2Vjb25kLl9fYWR2aWNlKCkpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbywgdHlwZW5hbWUgX19zdGFja19pbmZvPgorICAgIHZvaWQKKyAgICBfX3RyYWNlX2Jhc2U8X19vYmplY3RfaW5mbywgX19zdGFja19pbmZvPjo6CisgICAgX19hZGRfb2JqZWN0KF9fb2JqZWN0X3QgX19vYmplY3QsIF9fb2JqZWN0X2luZm8gX19pbmZvKQorICAgIHsKKyAgICAgIGlmIChfX21heF9tZW0oKSA9PSAwIAorCSAgfHwgX19vYmplY3RfdGFibGUuc2l6ZSgpICogc2l6ZW9mKF9fb2JqZWN0X2luZm8pIDw9IF9fbWF4X21lbSgpKQorCXsKKwkgIHRoaXMtPl9fb2JqZWN0X3RhYmxlX2xvY2subG9jaygpOworCSAgX19vYmplY3RfdGFibGUuaW5zZXJ0KHR5cGVuYW1lIF9fb2JqZWN0X3RhYmxlX3Q6OgorCQkJCXZhbHVlX3R5cGUoX19vYmplY3QsIF9faW5mbykpOworCSAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay51bmxvY2soKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9fb2JqZWN0X2luZm8sIHR5cGVuYW1lIF9fc3RhY2tfaW5mbz4KKyAgICBfX29iamVjdF9pbmZvKgorICAgIF9fdHJhY2VfYmFzZTxfX29iamVjdF9pbmZvLCBfX3N0YWNrX2luZm8+OjoKKyAgICBfX2dldF9vYmplY3RfaW5mbyhfX29iamVjdF90IF9fb2JqZWN0KQorICAgIHsKKyAgICAgIC8vIFhYWDogUmV2aXNpdCB0aGlzIHRvIHNlZSBpZiB3ZSBjYW4gZGVjcmVhc2UgbXV0ZXggc3BhbnMuCisgICAgICAvLyBXaXRob3V0IHRoaXMgbXV0ZXgsIHRoZSBvYmplY3QgdGFibGUgY291bGQgYmUgcmVoYXNoZWQgZHVyaW5nIGFuCisgICAgICAvLyBpbnNlcnRpb24gb24gYW5vdGhlciB0aHJlYWQsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiBhIHNlZ2ZhdWx0LgorICAgICAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay5sb2NrKCk7CisgICAgICB0eXBlbmFtZSBfX29iamVjdF90YWJsZV90OjppdGVyYXRvciBfX29iamVjdF9pdAorCT0gIF9fb2JqZWN0X3RhYmxlLmZpbmQoX19vYmplY3QpOworCisgICAgICBpZiAoX19vYmplY3RfaXQgPT0gX19vYmplY3RfdGFibGUuZW5kKCkpCisJeworCSAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay51bmxvY2soKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLnVubG9jaygpOworCSAgcmV0dXJuICZfX29iamVjdF9pdC0+c2Vjb25kOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX19vYmplY3RfaW5mbywgdHlwZW5hbWUgX19zdGFja19pbmZvPgorICAgIHZvaWQKKyAgICBfX3RyYWNlX2Jhc2U8X19vYmplY3RfaW5mbywgX19zdGFja19pbmZvPjo6CisgICAgX19yZXRpcmVfb2JqZWN0KF9fb2JqZWN0X3QgX19vYmplY3QpCisgICAgeworICAgICAgdGhpcy0+X19vYmplY3RfdGFibGVfbG9jay5sb2NrKCk7CisgICAgICB0aGlzLT5fX3N0YWNrX3RhYmxlX2xvY2subG9jaygpOworICAgICAgdHlwZW5hbWUgX19vYmplY3RfdGFibGVfdDo6aXRlcmF0b3IgX19vYmplY3RfaXQKKwk9IF9fb2JqZWN0X3RhYmxlLmZpbmQoX19vYmplY3QpOworICAKKyAgICAgIGlmIChfX29iamVjdF9pdCAhPSBfX29iamVjdF90YWJsZS5lbmQoKSkKKwl7CisJICBjb25zdCBfX29iamVjdF9pbmZvJiBfX2luZm8gPSBfX29iamVjdF9pdC0+c2Vjb25kOworCSAgY29uc3QgX19zdGFja190JiBfX3N0YWNrID0gX19pbmZvLl9fc3RhY2soKTsKKwkgIHR5cGVuYW1lIF9fc3RhY2tfdGFibGVfdDo6aXRlcmF0b3IgX19zdGFja19pdAorCSAgICA9IF9fc3RhY2tfdGFibGUuZmluZChfX3N0YWNrKTsKKyAgICAKKwkgIGlmIChfX3N0YWNrX2l0ID09IF9fc3RhY2tfdGFibGUuZW5kKCkpCisJICAgIHsKKwkgICAgICAvLyBGaXJzdCBvY2N1cmVuY2Ugb2YgdGhpcyBjYWxsIGNvbnRleHQuCisJICAgICAgaWYgKF9fbWF4X21lbSgpID09IDAgfHwgX19zdGFja190YWJsZV9ieXRlX3NpemUgPCBfX21heF9tZW0oKSkgCisJCXsKKwkJICBfX3N0YWNrX3RhYmxlX2J5dGVfc2l6ZSAKKwkJICAgICs9IChzaXplb2YoX19pbnN0cnVjdGlvbl9hZGRyZXNzX3QpICogX19zaXplKF9fc3RhY2spCisJCQkrIHNpemVvZihfX3N0YWNrKSArIHNpemVvZihfX3N0YWNrX2luZm8pKTsKKwkJICBfX3N0YWNrX3RhYmxlLmluc2VydChtYWtlX3BhaXIoX19zdGFjaywKKwkJCQkJCSBfX3N0YWNrX2luZm8oX19pbmZvKSkpOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8vIE1lcmdlIG9iamVjdCBpbmZvIGludG8gaW5mbyBzdW1tYXJ5IGZvciB0aGlzIGNhbGwgY29udGV4dC4KKwkgICAgICBfX3N0YWNrX2l0LT5zZWNvbmQuX19tZXJnZShfX2luZm8pOworCSAgICAgIGRlbGV0ZSBfX3N0YWNrOworCSAgICB9CisJICBfX29iamVjdF90YWJsZS5lcmFzZShfX29iamVjdCk7CisJfQorCisgICAgICB0aGlzLT5fX29iamVjdF90YWJsZV9sb2NrLnVubG9jaygpOworICAgICAgdGhpcy0+X19zdGFja190YWJsZV9sb2NrLnVubG9jaygpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfX29iamVjdF9pbmZvLCB0eXBlbmFtZSBfX3N0YWNrX2luZm8+CisgICAgdm9pZAorICAgIF9fdHJhY2VfYmFzZTxfX29iamVjdF9pbmZvLCBfX3N0YWNrX2luZm8+OjoKKyAgICBfX3dyaXRlKEZJTEUqIF9fZikKKyAgICB7CisgICAgICBmb3IgKHR5cGVuYW1lIF9fc3RhY2tfdGFibGVfdDo6aXRlcmF0b3IgX19pdAorCSAgICAgPSBfX3N0YWNrX3RhYmxlLmJlZ2luKCk7IF9faXQgIT0gX19zdGFja190YWJsZS5lbmQoKTsgKytfX2l0KQorCWlmIChfX2l0LT5zZWNvbmQuX19pc192YWxpZCgpKQorCSAgeworCSAgICBzdGQ6OmZwcmludGYoX19mLCBfX2lkKTsKKwkgICAgc3RkOjpmcHJpbnRmKF9fZiwgInwiKTsKKwkgICAgX19nbnVfcHJvZmlsZTo6X193cml0ZShfX2YsIF9faXQtPmZpcnN0KTsKKwkgICAgc3RkOjpmcHJpbnRmKF9fZiwgInwiKTsKKwkgICAgX19pdC0+c2Vjb25kLl9fd3JpdGUoX19mKTsKKwkgIH0KKyAgICB9CisKKyAgaW5saW5lIHN0ZDo6c2l6ZV90CisgIF9fZW52X3RvX3NpemVfdChjb25zdCBjaGFyKiBfX2Vudl92YXIsIHN0ZDo6c2l6ZV90IF9fZGVmYXVsdF92YWx1ZSkKKyAgeworICAgIGNoYXIqIF9fZW52X3ZhbHVlID0gc3RkOjpnZXRlbnYoX19lbnZfdmFyKTsKKyAgICBpZiAoX19lbnZfdmFsdWUpCisgICAgICB7CisJZXJybm8gPSAwOworCWxvbmcgX19jb252ZXJ0ZWRfdmFsdWUgPSBzdGQ6OnN0cnRvbChfX2Vudl92YWx1ZSwgMCwgMTApOworCWlmIChlcnJubyB8fCBfX2NvbnZlcnRlZF92YWx1ZSA8IDApCisJICB7CisJICAgIHN0ZDo6ZnByaW50ZihzdGRlcnIsCisJCQkgIkJhZCB2YWx1ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgJyVzJy5cbiIsCisJCQkgX19lbnZfdmFyKTsKKwkgICAgc3RkOjphYm9ydCgpOworCSAgfQorCWVsc2UKKwkgIHJldHVybiBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oX19jb252ZXJ0ZWRfdmFsdWUpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBfX2RlZmF1bHRfdmFsdWU7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3NldF9tYXhfc3RhY2tfdHJhY2VfZGVwdGgoKQorICB7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF9zdGFja19kZXB0aCkKKyAgICAgID0gX19lbnZfdG9fc2l6ZV90KF9HTElCQ1hYX1BST0ZJTEVfTUFYX1NUQUNLX0RFUFRIX0VOVl9WQVIsCisJCQlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X3N0YWNrX2RlcHRoKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3NldF9tYXhfbWVtKCkKKyAgeworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU19tYXhfbWVtKSAKKyAgICAgID0gX19lbnZfdG9fc2l6ZV90KF9HTElCQ1hYX1BST0ZJTEVfTUVNX1BFUl9ESUFHTk9TVElDX0VOVl9WQVIsCisJCQlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfbWF4X21lbSkpOworICB9CisKKyAgaW5saW5lIGludAorICBfX2xvZ19tYWduaXR1ZGUoZmxvYXQgX19mKQorICB7CisgICAgY29uc3QgZmxvYXQgX19sb2dfYmFzZSA9IDEwLjA7CisgICAgaW50IF9fcmVzdWx0ID0gMDsKKyAgICBpbnQgX19zaWduID0gMTsKKworICAgIGlmIChfX2YgPCAwKSAKKyAgICAgIHsKKwlfX2YgPSAtX19mOworCV9fc2lnbiA9IC0xOworICAgICAgfQorCisgICAgd2hpbGUgKF9fZiA+IF9fbG9nX2Jhc2UpIAorICAgICAgeworCSsrX19yZXN1bHQ7CisJX19mIC89IDEwLjA7CisgICAgICB9CisgICAgcmV0dXJuIF9fc2lnbiAqIF9fcmVzdWx0OworICB9CisKKyAgaW5saW5lIEZJTEUqIAorICBfX29wZW5fb3V0cHV0X2ZpbGUoY29uc3QgY2hhciogX19leHRlbnNpb24pCisgIHsKKyAgICAvLyBUaGUgcGF0aCBpcyBtYWRlIG9mIF9TX3RyYWNlX2ZpbGVfbmFtZSArICIuIiArIGV4dGVuc2lvbi4KKyAgICBzdGQ6OnNpemVfdCBfX3Jvb3RfbGVuIAorICAgICAgPSBfX2J1aWx0aW5fc3RybGVuKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU190cmFjZV9maWxlX25hbWUpKTsKKyAgICBzdGQ6OnNpemVfdCBfX2V4dF9sZW4gPSBfX2J1aWx0aW5fc3RybGVuKF9fZXh0ZW5zaW9uKTsKKyAgICBjaGFyKiBfX2ZpbGVfbmFtZSA9IG5ldyBjaGFyW19fcm9vdF9sZW4gKyAxICsgX19leHRfbGVuICsgMV07CisgICAgX19idWlsdGluX21lbWNweShfX2ZpbGVfbmFtZSwKKwkJICAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdHJhY2VfZmlsZV9uYW1lKSwKKwkJICAgICBfX3Jvb3RfbGVuKTsKKyAgICAqKF9fZmlsZV9uYW1lICsgX19yb290X2xlbikgPSAnLic7CisgICAgX19idWlsdGluX21lbWNweShfX2ZpbGVfbmFtZSArIF9fcm9vdF9sZW4gKyAxLAorCQkgICAgIF9fZXh0ZW5zaW9uLCBfX2V4dF9sZW4gKyAxKTsKKworICAgIEZJTEUqIF9fb3V0X2ZpbGUgPSBzdGQ6OmZvcGVuKF9fZmlsZV9uYW1lLCAidyIpOworICAgIGlmICghX19vdXRfZmlsZSkKKyAgICAgIHsKKwlzdGQ6OmZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gdHJhY2UgZmlsZSAnJXMnLlxuIiwKKwkJICAgICBfX2ZpbGVfbmFtZSk7CisJc3RkOjphYm9ydCgpOworICAgICAgfQorCisgICAgZGVsZXRlW10gX19maWxlX25hbWU7CisgICAgcmV0dXJuIF9fb3V0X2ZpbGU7CisgIH0KKworICBzdHJ1Y3QgX193YXJuCisgIHsKKyAgICBGSUxFKiBfX2ZpbGU7CisKKyAgICBfX3dhcm4oRklMRSogX19mKQorICAgIHsgX19maWxlID0gX19mOyB9CisKKyAgICB2b2lkCisgICAgb3BlcmF0b3IoKShjb25zdCBfX3dhcm5pbmdfZGF0YSYgX19pbmZvKQorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2ZpbGUsICBfX2luZm8uX193YXJuaW5nX2lkKTsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2ZpbGUsICI6IGltcHJvdmVtZW50ID0gJWQiLAorCQkgICBfX2xvZ19tYWduaXR1ZGUoX19pbmZvLl9fbWFnbml0dWRlKSk7CisgICAgICBzdGQ6OmZwcmludGYoX19maWxlLCAiOiBjYWxsIHN0YWNrID0gIik7CisgICAgICBfX2dudV9wcm9maWxlOjpfX3dyaXRlKF9fZmlsZSwgX19pbmZvLl9fY29udGV4dCk7CisgICAgICBzdGQ6OmZwcmludGYoX19maWxlLCAiOiBhZHZpY2UgPSAlc1xuIiwKKwkJICAgX19pbmZvLl9fd2FybmluZ19tZXNzYWdlLmNfc3RyKCkpOworICAgIH0KKyAgfTsKKworICAvKiogQGJyaWVmIEZpbmFsIHJlcG9ydCBtZXRob2QsIHJlZ2lzdGVyZWQgd2l0aCBAYiBhdGV4aXQuCisgICAqCisgICAqIFRoaXMgY2FuIGFsc28gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHVzZXIgY29kZSwgaW5jbHVkaW5nIHNpZ25hbCBoYW5kbGVycy4KKyAgICogSXQgaXMgcHJvdGVjdGVkIGFnYWluc3QgZGVhZGxvY2tzIGJ5IHRoZSByZWVudHJhbmNlIGd1YXJkIGluIHByb2ZpbGVyLmguCisgICAqIEhvd2V2ZXIsIHdoZW4gY2FsbGVkIGZyb20gYSBzaWduYWwgaGFuZGxlciB0aGF0IHRyaWdnZXJzIHdoaWxlIHdpdGhpbgorICAgKiBfX2dudV9wcm9maWxlICh1bmRlciB0aGUgZ3VhcmRlZCB6b25lKSwgbm8gb3V0cHV0IHdpbGwgYmUgcHJvZHVjZWQuCisgICAqLworICBpbmxpbmUgdm9pZAorICBfX3JlcG9ydCh2b2lkKQorICB7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZ2xvYmFsX2xvY2spLmxvY2soKTsKKworICAgIF9fd2FybmluZ192ZWN0b3JfdCBfX3dhcm5pbmdzLCBfX3RvcF93YXJuaW5nczsKKworICAgIEZJTEUqIF9fcmF3X2ZpbGUgPSBfX29wZW5fb3V0cHV0X2ZpbGUoInJhdyIpOworICAgIF9fdHJhY2VfdmVjdG9yX3NpemVfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIF9fdHJhY2VfaGFzaHRhYmxlX3NpemVfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIF9fdHJhY2VfaGFzaF9mdW5jX3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X3JlcG9ydChfX3Jhd19maWxlLCBfX3dhcm5pbmdzKTsKKyAgICBfX3RyYWNlX2xpc3RfdG9fc2xpc3RfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIF9fdHJhY2VfbGlzdF90b192ZWN0b3JfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIF9fdHJhY2VfbWFwX3RvX3Vub3JkZXJlZF9tYXBfcmVwb3J0KF9fcmF3X2ZpbGUsIF9fd2FybmluZ3MpOworICAgIHN0ZDo6ZmNsb3NlKF9fcmF3X2ZpbGUpOworCisgICAgLy8gU29ydCBkYXRhIGJ5IG1hZ25pdHVkZSwga2VlcGluZyBqdXN0IHRvcCBOLgorICAgIHN0ZDo6c2l6ZV90IF9fY3V0b2ZmID0gc3RkOjptaW4oX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF93YXJuX2NvdW50KSwKKwkJCQkgICAgX193YXJuaW5ncy5zaXplKCkpOworICAgIF9fdG9wX24oX193YXJuaW5ncywgX190b3Bfd2FybmluZ3MsIF9fY3V0b2ZmKTsKKworICAgIEZJTEUqIF9fd2Fybl9maWxlID0gX19vcGVuX291dHB1dF9maWxlKCJ0eHQiKTsKKyAgICBfX2Zvcl9lYWNoKF9fdG9wX3dhcm5pbmdzLmJlZ2luKCksIF9fdG9wX3dhcm5pbmdzLmVuZCgpLAorCSAgICAgICBfX3dhcm4oX193YXJuX2ZpbGUpKTsKKyAgICBzdGQ6OmZjbG9zZShfX3dhcm5fZmlsZSk7CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19nbG9iYWxfbG9jaykudW5sb2NrKCk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3NldF90cmFjZV9wYXRoKCkKKyAgeworICAgIGNoYXIqIF9fZW52X3RyYWNlX2ZpbGVfbmFtZSA9IHN0ZDo6Z2V0ZW52KF9HTElCQ1hYX1BST0ZJTEVfVFJBQ0VfRU5WX1ZBUik7CisKKyAgICBpZiAoX19lbnZfdHJhY2VfZmlsZV9uYW1lKQorICAgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3RyYWNlX2ZpbGVfbmFtZSkgPSBfX2Vudl90cmFjZV9maWxlX25hbWU7CisKKyAgICAvLyBNYWtlIHN1cmUgZWFybHkgdGhhdCB3ZSBjYW4gY3JlYXRlIHRoZSB0cmFjZSBmaWxlLgorICAgIHN0ZDo6ZmNsb3NlKF9fb3Blbl9vdXRwdXRfZmlsZSgidHh0IikpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19zZXRfbWF4X3dhcm5fY291bnQoKQorICB7CisgICAgY2hhciogX19lbnZfbWF4X3dhcm5fY291bnRfc3RyCisgICAgICA9IHN0ZDo6Z2V0ZW52KF9HTElCQ1hYX1BST0ZJTEVfTUFYX1dBUk5fQ09VTlRfRU5WX1ZBUik7CisKKyAgICBpZiAoX19lbnZfbWF4X3dhcm5fY291bnRfc3RyKQorICAgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF93YXJuX2NvdW50KQorCT0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHN0ZDo6YXRvaShfX2Vudl9tYXhfd2Fybl9jb3VudF9zdHIpKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fcmVhZF9jb3N0X2ZhY3RvcnMoKQorICB7CisgICAgc3RkOjpzdHJpbmcgX19jb25mX2ZpbGVfbmFtZShfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdHJhY2VfZmlsZV9uYW1lKSk7CisgICAgX19jb25mX2ZpbGVfbmFtZSArPSAiLmNvbmYiOworCisgICAgc3RkOjppZnN0cmVhbSBfX2NvbmZfZmlsZShfX2NvbmZfZmlsZV9uYW1lLmNfc3RyKCkpOworCisgICAgaWYgKF9fY29uZl9maWxlLmlzX29wZW4oKSkKKyAgICAgIHsKKwlzdGQ6OnN0cmluZyBfX2xpbmU7CisKKwl3aGlsZSAoc3RkOjpnZXRsaW5lKF9fY29uZl9maWxlLCBfX2xpbmUpKQorCSAgeworCSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIF9faSA9IF9fbGluZS5maW5kX2ZpcnN0X25vdF9vZigiIFx0XG5cdiIpOworCisJICAgIGlmIChfX2xpbmUubGVuZ3RoKCkgPD0gMCB8fCBfX2xpbmVbX19pXSA9PSAnIycpCisJICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcyBvciBjb21tZW50cy4KKwkgICAgICBjb250aW51ZTsKKwkgIH0KKworCS8vIFRyaW0uCisJX19saW5lLmVyYXNlKF9fcmVtb3ZlKF9fbGluZS5iZWdpbigpLCBfX2xpbmUuZW5kKCksICcgJyksCisJCSAgICAgX19saW5lLmVuZCgpKTsKKwlzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIF9fcG9zID0gX19saW5lLmZpbmQoIj0iKTsKKwlzdGQ6OnN0cmluZyBfX2ZhY3Rvcl9uYW1lID0gX19saW5lLnN1YnN0cigwLCBfX3Bvcyk7CisJc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBfX2VuZCA9IF9fbGluZS5maW5kX2ZpcnN0X29mKCI7XG4iKTsKKwlzdGQ6OnN0cmluZyBfX2ZhY3Rvcl92YWx1ZSA9IF9fbGluZS5zdWJzdHIoX19wb3MgKyAxLCBfX2VuZCAtIF9fcG9zKTsKKworCV9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2VudilbX19mYWN0b3JfbmFtZV0gPSBfX2ZhY3Rvcl92YWx1ZTsKKyAgICAgIH0KKyAgfQorCisgIHN0cnVjdCBfX2Nvc3RfZmFjdG9yX3dyaXRlcgorICB7CisgICAgRklMRSogX19maWxlOworCisgICAgX19jb3N0X2ZhY3Rvcl93cml0ZXIoRklMRSogX19mKQorICAgIDogX19maWxlKF9fZikgeyB9CisKKyAgICB2b2lkCisgICAgb3BlcmF0b3IoKSAoY29uc3QgX19jb3N0X2ZhY3RvciogX19mYWN0b3IpCisgICAgeyBzdGQ6OmZwcmludGYoX19maWxlLCAiJXMgPSAlZlxuIiwgX19mYWN0b3ItPl9fZW52X3ZhciwKKwkJICAgX19mYWN0b3ItPl9fdmFsdWUpOyB9CisgIH07CisKKyAgaW5saW5lIHZvaWQKKyAgX193cml0ZV9jb3N0X2ZhY3RvcnMoKQorICB7CisgICAgRklMRSogX19maWxlID0gX19vcGVuX291dHB1dF9maWxlKCJjb25mLm91dCIpOworICAgIF9fZm9yX2VhY2goX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+YmVnaW4oKSwKKwkgICAgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+ZW5kKCksCisJICAgICAgIF9fY29zdF9mYWN0b3Jfd3JpdGVyKF9fZmlsZSkpOworICAgIHN0ZDo6ZmNsb3NlKF9fZmlsZSk7CisgIH0KKworICBzdHJ1Y3QgX19jb3N0X2ZhY3Rvcl9zZXR0ZXIKKyAgeworICAgIHZvaWQKKyAgICBvcGVyYXRvcigpKF9fY29zdF9mYWN0b3IqIF9fZmFjdG9yKQorICAgIHsKKyAgICAgIC8vIExvb2sgaXQgdXAgaW4gdGhlIHByb2Nlc3MgZW52aXJvbm1lbnQgZmlyc3QuCisgICAgICBjb25zdCBjaGFyKiBfX2Vudl92YWx1ZSA9IHN0ZDo6Z2V0ZW52KF9fZmFjdG9yLT5fX2Vudl92YXIpOworCisgICAgICBpZiAoIV9fZW52X3ZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgLy8gTG9vayBpdCB1cCBpbiB0aGUgY29uZmlnIGZpbGUuCisgICAgICAgICAgX19lbnZfdDo6aXRlcmF0b3IgX19pdCAKKwkgICAgPSBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19lbnYpLmZpbmQoX19mYWN0b3ItPl9fZW52X3Zhcik7CisgICAgICAgICAgaWYgKF9faXQgIT0gX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZW52KS5lbmQoKSkKKyAgICAgICAgICAgIF9fZW52X3ZhbHVlID0gKCpfX2l0KS5zZWNvbmQuY19zdHIoKTsKKyAgICAgICAgfQorCisgICAgICBpZiAoX19lbnZfdmFsdWUpCisgICAgICAgIF9fZmFjdG9yLT5fX3ZhbHVlID0gc3RkOjphdG9mKF9fZW52X3ZhbHVlKTsKKyAgICB9CisgIH07CisKKyAgaW5saW5lIHZvaWQKKyAgX19zZXRfY29zdF9mYWN0b3JzKCkKKyAgeworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycykgPSBuZXcgX19jb3N0X2ZhY3Rvcl92ZWN0b3I7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9zaGlmdF9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3JfaXRlcmF0ZV9jb3N0X2ZhY3RvcikpOworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2Nvc3RfZmFjdG9ycyktPgorICAgICAgcHVzaF9iYWNrKCZfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX192ZWN0b3JfcmVzaXplX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2xpc3Rfc2hpZnRfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9pdGVyYXRlX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX2xpc3RfcmVzaXplX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9pbnNlcnRfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbWFwX2VyYXNlX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9maW5kX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX21hcF9pdGVyYXRlX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfaW5zZXJ0X2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfZXJhc2VfY29zdF9mYWN0b3IpKTsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19jb3N0X2ZhY3RvcnMpLT4KKyAgICAgIHB1c2hfYmFjaygmX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdW1hcF9maW5kX2Nvc3RfZmFjdG9yKSk7CisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+CisgICAgICBwdXNoX2JhY2soJl9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3VtYXBfaXRlcmF0ZV9jb3N0X2ZhY3RvcikpOworICAgIF9fZm9yX2VhY2goX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+YmVnaW4oKSwKKwkgICAgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fY29zdF9mYWN0b3JzKS0+ZW5kKCksCisJICAgICAgIF9fY29zdF9mYWN0b3Jfc2V0dGVyKCkpOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX19wcm9mY3h4X2luaXRfdW5jb25kaXRpb25hbCgpCisgIHsKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19nbG9iYWxfbG9jaykubG9jaygpOworCisgICAgaWYgKF9faXNfaW52YWxpZCgpKQorICAgICAgeworCV9fc2V0X21heF93YXJuX2NvdW50KCk7CisKKwlpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX21heF93YXJuX2NvdW50KSA9PSAwKQorCSAgX190dXJuX29mZigpOworCWVsc2UKKwkgIHsKKwkgICAgX19zZXRfbWF4X3N0YWNrX3RyYWNlX2RlcHRoKCk7CisJICAgIF9fc2V0X21heF9tZW0oKTsKKwkgICAgX19zZXRfdHJhY2VfcGF0aCgpOworCSAgICBfX3JlYWRfY29zdF9mYWN0b3JzKCk7IAorCSAgICBfX3NldF9jb3N0X2ZhY3RvcnMoKTsKKwkgICAgX193cml0ZV9jb3N0X2ZhY3RvcnMoKTsKKworCSAgICBfX3RyYWNlX3ZlY3Rvcl9zaXplX2luaXQoKTsKKwkgICAgX190cmFjZV9oYXNodGFibGVfc2l6ZV9pbml0KCk7CisJICAgIF9fdHJhY2VfaGFzaF9mdW5jX2luaXQoKTsKKwkgICAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbml0KCk7CisJICAgIF9fdHJhY2VfbGlzdF90b19zbGlzdF9pbml0KCk7IAorCSAgICBfX3RyYWNlX2xpc3RfdG9fdmVjdG9yX2luaXQoKTsKKwkgICAgX190cmFjZV9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbml0KCk7CisKKwkgICAgc3RkOjphdGV4aXQoX19yZXBvcnQpOworCisJICAgIF9fdHVybl9vbigpOworCSAgfQorICAgICAgfQorCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fZ2xvYmFsX2xvY2spLnVubG9jaygpOworICB9CisKKyAgLyoqIEBicmllZiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IGVhY2ggaW5zdHJ1bWVudGF0aW9uIHBvaW50LgorICAgKgorICAgKiBUaGUgY29tbW9uIHBhdGggaXMgaW5saW5lZCBmdWxseS4KKyAgICovCisgIGlubGluZSBib29sCisgIF9fcHJvZmN4eF9pbml0KCkKKyAgeworICAgIGlmIChfX2lzX2ludmFsaWQoKSkKKyAgICAgIF9fcHJvZmN4eF9pbml0X3VuY29uZGl0aW9uYWwoKTsKKworICAgIHJldHVybiBfX2lzX29uKCk7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9UUkFDRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl92ZWN0b3Jfc2l6ZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3NpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWYzODRmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3NpemUuaApAQCAtMCwwICsxLDEwNCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorLy8gTUEgMDIxMTEtMTMwNywgVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUKKy8vIHNvZnR3YXJlIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMKKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzCisvLyBmaWxlLCBvciB5b3UgY29tcGlsZSB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0bworLy8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZQorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlcgorLy8gcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbAorLy8gUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3NpemUuaAorICogIEBicmllZiBDb2xsZWN0aW9uIG9mIHZlY3RvciBzaXplIHRyYWNlcy4KKyAqLworCisvLyBXcml0dGVuIGJ5IExpeGlhIExpdSBhbmQgU2lsdml1cyBSdXMuCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9WRUNUT1JfU0laRV9ICisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVkVDVE9SX1NJWkVfSCAxCisKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXIuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfbm9kZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl90cmFjZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9zdGF0ZS5oIgorI2luY2x1ZGUgInByb2ZpbGUvaW1wbC9wcm9maWxlcl9jb250YWluZXJfc2l6ZS5oIgorCituYW1lc3BhY2UgX19nbnVfcHJvZmlsZQoreworICAvKiogQGJyaWVmIEhhc2h0YWJsZSBzaXplIGluc3RydW1lbnRhdGlvbiB0cmFjZSBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfdmVjdG9yX3NpemUKKyAgOiBwdWJsaWMgX190cmFjZV9jb250YWluZXJfc2l6ZQorICB7CisgIHB1YmxpYzoKKyAgICBfX3RyYWNlX3ZlY3Rvcl9zaXplKCkKKyAgICA6IF9fdHJhY2VfY29udGFpbmVyX3NpemUoKQorICAgIHsgX19pZCA9ICJ2ZWN0b3Itc2l6ZSI7IH0KKyAgfTsKKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl9zaXplX2luaXQoKQorICB7IF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3Jfc2l6ZSkgPSBuZXcgX190cmFjZV92ZWN0b3Jfc2l6ZSgpOyB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9yZXBvcnQoRklMRSogX19mLCBfX3dhcm5pbmdfdmVjdG9yX3QmIF9fd2FybmluZ3MpCisgIHsKKyAgICBpZiAoX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKSkKKyAgICAgIHsKKwlfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3NpemUpLT5fX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fbnVtKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19pbnNlcnQoX19vYmosIF9fZ2V0X3N0YWNrKCksCisJCQkJCQkgICAgX19udW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3Jfc2l6ZV9kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0sCisJCQkgICAgICAgc3RkOjpzaXplX3QgX19pbnVtKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19kZXN0cnVjdChfX29iaiwgX19udW0sIF9faW51bSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl9zaXplX3Jlc2l6ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19mcm9tLAorCQkJICAgICBzdGQ6OnNpemVfdCBfX3RvKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl9zaXplKS0+X19yZXNpemUoX19vYmosIF9fZnJvbSwgX190byk7CisgIH0KKworfSAvLyBuYW1lc3BhY2UgX19nbnVfcHJvZmlsZQorCisjZW5kaWYgLyogX0dMSUJDWFhfUFJPRklMRV9QUk9GSUxFUl9WRUNUT1JfU0laRV9IICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaW1wbC9wcm9maWxlcl92ZWN0b3JfdG9fbGlzdC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk2MzEzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaApAQCAtMCwwICsxLDM1NCBAQAorLy8gLSotIEMrKyAtKi0KKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisvLyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorLy8gdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorLy8gV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKy8vIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKy8vIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAorLy8gTUEgMDIxMTEtMTMwNywgVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUKKy8vIHNvZnR3YXJlIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMKKy8vIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzCisvLyBmaWxlLCBvciB5b3UgY29tcGlsZSB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0bworLy8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZQorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlcgorLy8gcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbAorLy8gUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL2ltcGwvcHJvZmlsZXJfdmVjdG9yX3RvX2xpc3QuaAorICogIEBicmllZiBkaWFnbm9zdGljcyBmb3IgdmVjdG9yIHRvIGxpc3QuCisgKi8KKworLy8gV3JpdHRlbiBieSBMaXhpYSBMaXUgYW5kIFNpbHZpdXMgUnVzLgorCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfUFJPRklMRVJfVkVDVE9SX1RPX0xJU1RfSAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1ZFQ1RPUl9UT19MSVNUX0ggMQorCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyLmgiCisjaW5jbHVkZSAicHJvZmlsZS9pbXBsL3Byb2ZpbGVyX25vZGUuaCIKKyNpbmNsdWRlICJwcm9maWxlL2ltcGwvcHJvZmlsZXJfdHJhY2UuaCIKKworbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBBIHZlY3Rvci10by1saXN0IGluc3RydW1lbnRhdGlvbiBsaW5lIGluIHRoZSBvYmplY3QgdGFibGUuICAqLworICBjbGFzcyBfX3ZlY3RvcjJsaXN0X2luZm8KKyAgOiBwdWJsaWMgX19vYmplY3RfaW5mb19iYXNlCisgIHsKKyAgcHVibGljOgorICAgIF9fdmVjdG9yMmxpc3RfaW5mbygpCisgICAgOiBfTV9zaGlmdF9jb3VudCgwKSwgX01faXRlcmF0ZSgwKSwgX01fcmVzaXplKDApLCBfTV9saXN0X2Nvc3QoMCksCisgICAgICBfTV92ZWN0b3JfY29zdCgwKSwgX01fdmFsaWQodHJ1ZSkgeyB9CisKKyAgICBfX3ZlY3RvcjJsaXN0X2luZm8oX19zdGFja190IF9fc3RhY2spCisgICAgOiBfX29iamVjdF9pbmZvX2Jhc2UoX19zdGFjayksIF9NX3NoaWZ0X2NvdW50KDApLCBfTV9pdGVyYXRlKDApLAorICAgICAgX01fcmVzaXplKDApLCBfTV9saXN0X2Nvc3QoMCksIF9NX3ZlY3Rvcl9jb3N0KDApLCBfTV92YWxpZCh0cnVlKSB7IH0KKworICAgIHZpcnR1YWwgfl9fdmVjdG9yMmxpc3RfaW5mbygpIHsgfQorCisgICAgX192ZWN0b3IybGlzdF9pbmZvKGNvbnN0IF9fdmVjdG9yMmxpc3RfaW5mbyYgX19vKQorICAgIDogX19vYmplY3RfaW5mb19iYXNlKF9fbyksIF9NX3NoaWZ0X2NvdW50KF9fby5fTV9zaGlmdF9jb3VudCksCisgICAgICBfTV9pdGVyYXRlKF9fby5fTV9pdGVyYXRlKSwgX01fcmVzaXplKF9fby5fTV9yZXNpemUpLAorICAgICAgX01fbGlzdF9jb3N0KF9fby5fTV9saXN0X2Nvc3QpLCBfTV92ZWN0b3JfY29zdChfX28uX01fdmVjdG9yX2Nvc3QpLAorICAgICAgX01fdmFsaWQoX19vLl9NX3ZhbGlkKSB7IH0KKworICAgIHZvaWQKKyAgICBfX21lcmdlKGNvbnN0IF9fdmVjdG9yMmxpc3RfaW5mbyYgX19vKQorICAgIHsKKyAgICAgIF9NX3NoaWZ0X2NvdW50ICArPSBfX28uX01fc2hpZnRfY291bnQ7CisgICAgICBfTV9pdGVyYXRlICAgICAgKz0gX19vLl9NX2l0ZXJhdGU7CisgICAgICBfTV92ZWN0b3JfY29zdCAgKz0gX19vLl9NX3ZlY3Rvcl9jb3N0OworICAgICAgX01fbGlzdF9jb3N0ICAgICs9IF9fby5fTV9saXN0X2Nvc3Q7CisgICAgICBfTV92YWxpZCAgICAgICAgJj0gX19vLl9NX3ZhbGlkOworICAgICAgX01fcmVzaXplICAgICAgICs9IF9fby5fTV9yZXNpemU7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fd3JpdGUoRklMRSogX19mKSBjb25zdAorICAgIHsKKyAgICAgIHN0ZDo6ZnByaW50ZihfX2YsICIlWnUgJVp1ICVadSAlLjBmICUuMGZcbiIsIF9NX3NoaWZ0X2NvdW50LAorCQkgICBfTV9yZXNpemUsIF9NX2l0ZXJhdGUsIF9NX3ZlY3Rvcl9jb3N0LCBfTV9saXN0X2Nvc3QpOworICAgIH0KKworICAgIGZsb2F0CisgICAgX19tYWduaXR1ZGUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3ZlY3Rvcl9jb3N0IC0gX01fbGlzdF9jb3N0OyB9CisKKyAgICBzdGQ6OnN0cmluZworICAgIF9fYWR2aWNlKCkgY29uc3QgCisgICAgeyByZXR1cm4gImNoYW5nZSBzdGQ6OnZlY3RvciB0byBzdGQ6Omxpc3QiOyB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9fc2hpZnRfY291bnQoKQorICAgIHsgcmV0dXJuIF9NX3NoaWZ0X2NvdW50OyB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9faXRlcmF0ZSgpCisgICAgeyByZXR1cm4gX01faXRlcmF0ZTsgfQorCisgICAgZmxvYXQKKyAgICBfX2xpc3RfY29zdCgpCisgICAgeyByZXR1cm4gX01fbGlzdF9jb3N0OyB9CisKKyAgICBzdGQ6OnNpemVfdAorICAgIF9fcmVzaXplKCkKKyAgICB7IHJldHVybiBfTV9yZXNpemU7IH0KKworICAgIHZvaWQKKyAgICBfX3NldF9saXN0X2Nvc3QoZmxvYXQgX19sYykKKyAgICB7IF9NX2xpc3RfY29zdCA9IF9fbGM7IH0KKyAgICAKKyAgICB2b2lkCisgICAgX19zZXRfdmVjdG9yX2Nvc3QoZmxvYXQgX192YykKKyAgICB7IF9NX3ZlY3Rvcl9jb3N0ID0gX192YzsgfQorICAgIAorICAgIGJvb2wKKyAgICBfX2lzX3ZhbGlkKCkKKyAgICB7IHJldHVybiBfTV92YWxpZDsgfQorICAgIAorICAgIHZvaWQKKyAgICBfX3NldF9pbnZhbGlkKCkKKyAgICB7IF9NX3ZhbGlkID0gZmFsc2U7IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9pbnNlcnQoc3RkOjpzaXplX3QgX19wb3MsIHN0ZDo6c2l6ZV90IF9fbnVtKQorICAgIHsgX01fc2hpZnRfY291bnQgKz0gX19udW0gLSBfX3BvczsgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2l0ZXJhdGUoc3RkOjpzaXplX3QgX19udW0pCisgICAgeyBfTV9pdGVyYXRlICs9IF9fbnVtOyB9CisKKyAgICB2b2lkCisgICAgX19yZXNpemUoc3RkOjpzaXplX3QgX19mcm9tLCBzdGQ6OnNpemVfdCkKKyAgICB7IF9NX3Jlc2l6ZSArPSBfX2Zyb207IH0KKworICAgIHZvaWQKKyAgICBfX29wcl9maW5kKHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICAvLyBVc2UgYXZlcmFnZSBjYXNlIGNvbXBsZXhpdHkuCisgICAgICBfTV9pdGVyYXRlICs9IDMuMCAvIDQuMCAqIF9fc2l6ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNpemVfdCBfTV9zaGlmdF9jb3VudDsKKyAgICBzdGQ6OnNpemVfdCBfTV9pdGVyYXRlOworICAgIHN0ZDo6c2l6ZV90IF9NX3Jlc2l6ZTsKKyAgICBmbG9hdCBfTV9saXN0X2Nvc3Q7CisgICAgZmxvYXQgX01fdmVjdG9yX2Nvc3Q7CisgICAgYm9vbCAgX01fdmFsaWQ7CisgIH07CisKKworICAvKiogQGJyaWVmIEEgdmVjdG9yLXRvLWxpc3QgaW5zdHJ1bWVudGF0aW9uIGxpbmUgaW4gdGhlIHN0YWNrIHRhYmxlLiAgKi8KKyAgY2xhc3MgX192ZWN0b3IybGlzdF9zdGFja19pbmZvCisgIDogcHVibGljIF9fdmVjdG9yMmxpc3RfaW5mbworICB7CisgIHB1YmxpYzoKKyAgICBfX3ZlY3RvcjJsaXN0X3N0YWNrX2luZm8oY29uc3QgX192ZWN0b3IybGlzdF9pbmZvJiBfX28pIAorICAgIDogX192ZWN0b3IybGlzdF9pbmZvKF9fbykgeyB9CisgIH07CisKKworICAvKiogQGJyaWVmIFZlY3Rvci10by1saXN0IGluc3RydW1lbnRhdGlvbiBwcm9kdWNlci4gICovCisgIGNsYXNzIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3QKKyAgOiBwdWJsaWMgX190cmFjZV9iYXNlPF9fdmVjdG9yMmxpc3RfaW5mbywgX192ZWN0b3IybGlzdF9zdGFja19pbmZvPiAKKyAgeworICBwdWJsaWM6CisgICAgX190cmFjZV92ZWN0b3JfdG9fbGlzdCgpCisgICAgOiBfX3RyYWNlX2Jhc2U8X192ZWN0b3IybGlzdF9pbmZvLCBfX3ZlY3RvcjJsaXN0X3N0YWNrX2luZm8+KCkKKyAgICB7IF9faWQgPSAidmVjdG9yLXRvLWxpc3QiOyB9CisKKyAgICB+X190cmFjZV92ZWN0b3JfdG9fbGlzdCgpIHsgfQorCisgICAgLy8gSW5zZXJ0IGEgbmV3IG5vZGUgYXQgY29uc3RydWN0IHdpdGggb2JqZWN0LCBjYWxsc3RhY2sgYW5kIGluaXRpYWwgc2l6ZS4gCisgICAgdm9pZAorICAgIF9faW5zZXJ0KF9fb2JqZWN0X3QgX19vYmosIF9fc3RhY2tfdCBfX3N0YWNrKQorICAgIHsgX19hZGRfb2JqZWN0KF9fb2JqLCBfX3ZlY3RvcjJsaXN0X2luZm8oX19zdGFjaykpOyB9CisKKyAgICAvLyBDYWxsIGF0IGRlc3RydWN0aW9uL2NsZWFuIHRvIHNldCBjb250YWluZXIgZmluYWwgc2l6ZS4KKyAgICB2b2lkCisgICAgX19kZXN0cnVjdChjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBpZiAoIV9faXNfb24oKSkKKwlyZXR1cm47CisKKyAgICAgIF9fdmVjdG9yMmxpc3RfaW5mbyogX19yZXMgPSBfX2dldF9vYmplY3RfaW5mbyhfX29iaik7CisgICAgICBpZiAoIV9fcmVzKQorCXJldHVybjsKKworICAgICAgZmxvYXQgX192YyA9IF9fdmVjdG9yX2Nvc3QoX19yZXMtPl9fc2hpZnRfY291bnQoKSwgX19yZXMtPl9faXRlcmF0ZSgpLAorCQkJCSBfX3Jlcy0+X19yZXNpemUoKSk7CisgICAgICBmbG9hdCBfX2xjID0gX19saXN0X2Nvc3QoX19yZXMtPl9fc2hpZnRfY291bnQoKSwgX19yZXMtPl9faXRlcmF0ZSgpLAorCQkJICAgICAgIF9fcmVzLT5fX3Jlc2l6ZSgpKTsKKyAgICAgIF9fcmVzLT5fX3NldF92ZWN0b3JfY29zdChfX3ZjKTsKKyAgICAgIF9fcmVzLT5fX3NldF9saXN0X2Nvc3QoX19sYyk7CisKKyAgICAgIF9fcmV0aXJlX29iamVjdChfX29iaik7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgbGl2ZSBtYXAuCisgICAgLy8gWFhYIFVuZGVmaW5lZD8hPworICAgIF9fdmVjdG9yMmxpc3RfaW5mbyogX19maW5kKGNvbnN0IHZvaWQqIF9fb2JqKTsKKworICAgIC8vIENvbGxlY3QgY29zdCBvZiBvcGVyYXRpb25zLgorICAgIHZvaWQKKyAgICBfX29wcl9pbnNlcnQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fcG9zLCBzdGQ6OnNpemVfdCBfX251bSkKKyAgICB7CisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX29wcl9pbnNlcnQoX19wb3MsIF9fbnVtKTsKKyAgICB9CisKKyAgICB2b2lkCisgICAgX19vcHJfaXRlcmF0ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0pCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19vcHJfaXRlcmF0ZShfX251bSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9faW52YWxpZF9vcGVyYXRvcihjb25zdCB2b2lkKiBfX29iaikKKyAgICB7CisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX3NldF9pbnZhbGlkKCk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fcmVzaXplKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2Zyb20sIHN0ZDo6c2l6ZV90IF9fdG8pCisgICAgeworICAgICAgX192ZWN0b3IybGlzdF9pbmZvKiBfX3JlcyA9IF9fZ2V0X29iamVjdF9pbmZvKF9fb2JqKTsKKyAgICAgIGlmIChfX3JlcykKKwlfX3Jlcy0+X19yZXNpemUoX19mcm9tLCBfX3RvKTsKKyAgICB9CisKKyAgICBmbG9hdAorICAgIF9fdmVjdG9yX2Nvc3Qoc3RkOjpzaXplX3QgX19zaGlmdCwgc3RkOjpzaXplX3QgX19pdGVyYXRlLAorCQkgIHN0ZDo6c2l6ZV90IF9fcmVzaXplKQorICAgIHsKKyAgICAgIHJldHVybiAoX19zaGlmdAorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX3NoaWZ0X2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICAgKyBfX2l0ZXJhdGUKKwkgICAgICAqIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfX3ZlY3Rvcl9pdGVyYXRlX2Nvc3RfZmFjdG9yKS5fX3ZhbHVlCisJICAgICAgKyBfX3Jlc2l6ZQorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fdmVjdG9yX3Jlc2l6ZV9jb3N0X2ZhY3RvcikuX192YWx1ZSk7CisgICAgfQorCisgICAgZmxvYXQKKyAgICBfX2xpc3RfY29zdChzdGQ6OnNpemVfdCBfX3NoaWZ0LCBzdGQ6OnNpemVfdCBfX2l0ZXJhdGUsCisJCXN0ZDo6c2l6ZV90IF9fcmVzaXplKQorICAgIHsKKyAgICAgIHJldHVybiAoX19zaGlmdAorCSAgICAgICogX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9fbGlzdF9zaGlmdF9jb3N0X2ZhY3RvcikuX192YWx1ZQorCSAgICAgICsgX19pdGVyYXRlCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X2l0ZXJhdGVfY29zdF9mYWN0b3IpLl9fdmFsdWUKKwkgICAgICArIF9fcmVzaXplCisJICAgICAgKiBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX19saXN0X3Jlc2l6ZV9jb3N0X2ZhY3RvcikuX192YWx1ZSk7CisgICAgfQorCisgICAgdm9pZAorICAgIF9fb3ByX2ZpbmQoY29uc3Qgdm9pZCogX19vYmosIHN0ZDo6c2l6ZV90IF9fc2l6ZSkKKyAgICB7CisgICAgICBfX3ZlY3RvcjJsaXN0X2luZm8qIF9fcmVzID0gX19nZXRfb2JqZWN0X2luZm8oX19vYmopOworICAgICAgaWYgKF9fcmVzKQorCV9fcmVzLT5fX29wcl9maW5kKF9fc2l6ZSk7CisgICAgfQorICB9OworCisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbml0KCkKKyAgeyBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpID0gbmV3IF9fdHJhY2VfdmVjdG9yX3RvX2xpc3QoKTsgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVwb3J0KEZJTEUqIF9fZiwgX193YXJuaW5nX3ZlY3Rvcl90JiBfX3dhcm5pbmdzKQorICB7CisgICAgaWYgKF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCkpCisgICAgICB7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+CisJICBfX2NvbGxlY3Rfd2FybmluZ3MoX193YXJuaW5ncyk7CisJX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X193cml0ZShfX2YpOworICAgICAgfQorICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9jb25zdHJ1Y3QoY29uc3Qgdm9pZCogX19vYmopCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX2luc2VydChfX29iaiwgX19nZXRfc3RhY2soKSk7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2Rlc3RydWN0KGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19kZXN0cnVjdChfX29iaik7CisgIH0KKworICBpbmxpbmUgdm9pZAorICBfX3RyYWNlX3ZlY3Rvcl90b19saXN0X2luc2VydChjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19wb3MsCisJCQkJc3RkOjpzaXplX3QgX19udW0pCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX29wcl9pbnNlcnQoX19vYmosIF9fcG9zLAorCQkJCQkJCSAgIF9fbnVtKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfaXRlcmF0ZShjb25zdCB2b2lkKiBfX29iaiwgc3RkOjpzaXplX3QgX19udW0gPSAxKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19vcHJfaXRlcmF0ZShfX29iaiwgX19udW0pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9pbnZhbGlkX29wZXJhdG9yKGNvbnN0IHZvaWQqIF9fb2JqKQorICB7CisgICAgaWYgKCFfX3Byb2ZjeHhfaW5pdCgpKQorICAgICAgcmV0dXJuOworCisgICAgX0dMSUJDWFhfUFJPRklMRV9EQVRBKF9TX3ZlY3Rvcl90b19saXN0KS0+X19pbnZhbGlkX29wZXJhdG9yKF9fb2JqKTsKKyAgfQorCisgIGlubGluZSB2b2lkCisgIF9fdHJhY2VfdmVjdG9yX3RvX2xpc3RfcmVzaXplKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX2Zyb20sCisJCQkJc3RkOjpzaXplX3QgX190bykKKyAgeworICAgIGlmICghX19wcm9mY3h4X2luaXQoKSkKKyAgICAgIHJldHVybjsKKworICAgIF9HTElCQ1hYX1BST0ZJTEVfREFUQShfU192ZWN0b3JfdG9fbGlzdCktPl9fcmVzaXplKF9fb2JqLCBfX2Zyb20sIF9fdG8pOworICB9CisKKyAgaW5saW5lIHZvaWQKKyAgX190cmFjZV92ZWN0b3JfdG9fbGlzdF9maW5kKGNvbnN0IHZvaWQqIF9fb2JqLCBzdGQ6OnNpemVfdCBfX3NpemUpCisgIHsKKyAgICBpZiAoIV9fcHJvZmN4eF9pbml0KCkpCisgICAgICByZXR1cm47CisKKyAgICBfR0xJQkNYWF9QUk9GSUxFX0RBVEEoX1NfdmVjdG9yX3RvX2xpc3QpLT5fX29wcl9maW5kKF9fb2JqLCBfX3NpemUpOworICB9CisKK30gLy8gbmFtZXNwYWNlIF9fZ251X3Byb2ZpbGUKKyNlbmRpZiAvKiBfR0xJQkNYWF9QUk9GSUxFX1BST0ZJTEVSX1ZFQ1RPUl9UT19MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9pdGVyYXRvcl90cmFja2VyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMzQyOWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oCkBAIC0wLDAgKzEsMjc0IEBACisvLyBQcm9maWxpbmcgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL2l0ZXJhdG9yX3RyYWNrZXIuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX0lURVJBVE9SX1RSQUNLRVIKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9JVEVSQVRPUl9UUkFDS0VSIDEKKworI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBjbGFzcyBfX2l0ZXJhdG9yX3RyYWNrZXIgCisgICAgeworICAgICAgdHlwZWRlZiBfX2l0ZXJhdG9yX3RyYWNrZXIgX1NlbGY7CisKKyAgICAgIC8vIFRoZSB1bmRlcmx5aW5nIGl0ZXJhdG9yCisgICAgICBfSXRlcmF0b3IgX01fY3VycmVudDsKKworICAgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgIGNvbnN0IF9TZXF1ZW5jZSogX01fZHM7CisgICAgICB0eXBlZGVmIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj4gX1RyYWl0czsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX0l0ZXJhdG9yCQkgICAgICAgICAgICAgIF9CYXNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjppdGVyYXRvcl9jYXRlZ29yeSBpdGVyYXRvcl9jYXRlZ29yeTsgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9UcmFpdHM6OmRpZmZlcmVuY2VfdHlwZSAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1RyYWl0czo6cmVmZXJlbmNlICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHJhaXRzOjpwb2ludGVyICAgICAgICAgICBwb2ludGVyOworCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIoKQorICAgICAgOiBfTV9jdXJyZW50KCksIF9NX2RzKDApIHsgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIoY29uc3QgX0l0ZXJhdG9yJiBfX2ksIGNvbnN0IF9TZXF1ZW5jZSogX19zZXEpIAorICAgICAgOiBfTV9jdXJyZW50KF9faSksIF9NX2RzKF9fc2VxKSB7IH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyKGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlciYgX194KSAKKyAgICAgIDogX01fY3VycmVudChfX3guX01fY3VycmVudCksIF9NX2RzKF9feC5fTV9kcykgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9NdXRhYmxlSXRlcmF0b3I+CisgICAgICAgIF9faXRlcmF0b3JfdHJhY2tlcihjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X011dGFibGVJdGVyYXRvciwKKwkJCSAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWYKKwkJCSAgIDwoc3RkOjpfX2FyZV9zYW1lPF9NdXRhYmxlSXRlcmF0b3IsIHR5cGVuYW1lCisJCQkgICAgIF9TZXF1ZW5jZTo6aXRlcmF0b3I6Ol9CYXNlX2l0ZXJhdG9yPjo6X192YWx1ZSksCisJCQkgICBfU2VxdWVuY2U+OjpfX3R5cGU+JiBfX3gpCisJOiAgX01fY3VycmVudChfX3guYmFzZSgpKSwgX01fZHMoX194Ll9NX2dldF9zZXF1ZW5jZSgpKSB7IH0KKworICAgICAgX0l0ZXJhdG9yCisgICAgICBiYXNlKCkgY29uc3QgeyByZXR1cm4gX01fY3VycmVudDsgfQorICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnNpb24gdG8gdW5kZXJseWluZyBub24tZGVidWcgaXRlcmF0b3IgdG8gYWxsb3cKKyAgICAgICAqIGJldHRlciBpbnRlcmFjdGlvbiB3aXRoIG5vbi1wcm9maWxlIGNvbnRhaW5lcnMuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIF9JdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9NX2N1cnJlbnQ7IH0KKworICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqX01fY3VycmVudDsgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsKKwlfTV9kcy0+X01fcHJvZmlsZV9pdGVyYXRlKCk7CisJKytfTV9jdXJyZW50OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3IrKyhpbnQpCisgICAgICB7CisJX01fZHMtPl9NX3Byb2ZpbGVfaXRlcmF0ZSgpOworCV9faXRlcmF0b3JfdHJhY2tlciBfX3RtcCgqdGhpcyk7CisJKytfTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3ItLSgpCisgICAgICB7CisJX01fZHMtPl9NX3Byb2ZpbGVfaXRlcmF0ZSgxKTsKKwktLV9NX2N1cnJlbnQ7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXImCisgICAgICBvcGVyYXRvci0tKGludCkKKyAgICAgIHsKKwlfTV9kcy0+X01fcHJvZmlsZV9pdGVyYXRlKDEpOworCV9faXRlcmF0b3JfdHJhY2tlciBfX3RtcCgqdGhpcyk7CisJLS1fTV9jdXJyZW50OworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlciYgX194KQorICAgICAgeworCV9NX2N1cnJlbnQgPSBfX3guX01fY3VycmVudDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICpfTV9jdXJyZW50OyB9CisKKyAgICAgIC8vIC0tLS0tLSBSYW5kb20gYWNjZXNzIGl0ZXJhdG9yIHJlcXVpcmVtZW50cyAtLS0tLS0KKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QgCisgICAgICB7IHJldHVybiBfTV9jdXJyZW50W19fbl07IH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3IrPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfTV9jdXJyZW50ICs9IF9fbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9faXRlcmF0b3JfdHJhY2tlcgorICAgICAgb3BlcmF0b3IrKGNvbnN0IGRpZmZlcmVuY2VfdHlwZSYgX19uKSBjb25zdAorICAgICAgeworCV9faXRlcmF0b3JfdHJhY2tlciBfX3RtcCgqdGhpcyk7CisJX190bXAgKz0gX19uOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKworICAgICAgX19pdGVyYXRvcl90cmFja2VyJgorICAgICAgb3BlcmF0b3ItPShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikKKyAgICAgIHsKKwlfTV9jdXJyZW50ICs9IC1fX247CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBfX2l0ZXJhdG9yX3RyYWNrZXIKKyAgICAgIG9wZXJhdG9yLShjb25zdCBkaWZmZXJlbmNlX3R5cGUmIF9fbikgY29uc3QKKyAgICAgIHsKKwlfX2l0ZXJhdG9yX3RyYWNrZXIgX190bXAoKnRoaXMpOworCV9fdG1wIC09IF9fbjsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2ZpbmQoKQorICAgICAgeyBfTV9kcy0+X01fcHJvZmlsZV9maW5kKCk7IH0KKworICAgICAgY29uc3QgX1NlcXVlbmNlKgorICAgICAgX01fZ2V0X3NlcXVlbmNlKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IF9TZXF1ZW5jZSo+KF9NX2RzKTsgfQorICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpID09IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvckwsIHR5cGVuYW1lIF9JdGVyYXRvclIsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpICE9IF9fcmhzLmJhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JdGVyYXRvciwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKyAgICAgICAgICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSAhPSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPCBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA8PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvckwsIF9TZXF1ZW5jZT4mIF9fbGhzLAorCSAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JSLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgPiBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3JMLCB0eXBlbmFtZSBfSXRlcmF0b3JSLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICAgY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvclIsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPiYgX19saHMsCisJICAgICAgIGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmJhc2UoKSA+PSBfX3Jocy5iYXNlKCk7IH0KKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIEFjY29yZGluZyB0byB0aGUgcmVzb2x1dGlvbiBvZiBEUjE3OSBub3Qgb25seSB0aGUgdmFyaW91cyBjb21wYXJpc29uCisgIC8vIG9wZXJhdG9ycyBidXQgYWxzbyBvcGVyYXRvci0gbXVzdCBhY2NlcHQgbWl4ZWQgaXRlcmF0b3IvY29uc3RfaXRlcmF0b3IKKyAgLy8gcGFyYW1ldGVycy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yTCwgdHlwZW5hbWUgX0l0ZXJhdG9yUiwgdHlwZW5hbWUgX1NlcXVlbmNlPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yTCwgX1NlcXVlbmNlPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgb3BlcmF0b3ItKGNvbnN0IF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3JMLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yUiwgX1NlcXVlbmNlPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuYmFzZSgpIC0gX19yaHMuYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0l0ZXJhdG9yLCB0eXBlbmFtZSBfU2VxdWVuY2U+CisgICAgaW5saW5lIHR5cGVuYW1lIF9faXRlcmF0b3JfdHJhY2tlcjxfSXRlcmF0b3IsIF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorICAgIG9wZXJhdG9yLShjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2xocywKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5iYXNlKCkgLSBfX3Jocy5iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSXRlcmF0b3IsIHR5cGVuYW1lIF9TZXF1ZW5jZT4KKyAgICBpbmxpbmUgX19pdGVyYXRvcl90cmFja2VyPF9JdGVyYXRvciwgX1NlcXVlbmNlPgorICAgIG9wZXJhdG9yKyh0eXBlbmFtZSBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLF9TZXF1ZW5jZT46OmRpZmZlcmVuY2VfdHlwZQorCSAgICAgIF9fbiwKKwkgICAgICBjb25zdCBfX2l0ZXJhdG9yX3RyYWNrZXI8X0l0ZXJhdG9yLCBfU2VxdWVuY2U+JiBfX2kpCisgICAgeyByZXR1cm4gX19pICsgX19uOyB9CisJCit9ICAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9saXN0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL2xpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyNzlkMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9saXN0CkBAIC0wLDAgKzEsNjQwIEBACisvLyBQcm9maWxpbmcgbGlzdCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbGlzdAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX0xJU1QKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9MSVNUIDEKKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+IAorI2luY2x1ZGUgPHByb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oPiAKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8qKiBAYnJpZWYgTGlzdCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLiAgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPF9UcD4gPgorICAgIGNsYXNzIGxpc3QKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6bGlzdDxfVHAsIF9BbGxvY2F0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfR0xJQkNYWF9TVERfQzo6bGlzdDxfVHAsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19pdGVyYXRvcl90cmFja2VyPHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciwgbGlzdD4gICAgICAgIAorCQkJCSAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIF9faXRlcmF0b3JfdHJhY2tlcjx0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IsIGxpc3Q+ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yCQkJICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIC8vIDIzLjIuMi4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSkgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAkvLyBsaXN0MnNsaXN0CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAkvLyBsaXN0MnZlY3RvcgorICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGV4cGxpY2l0CisgICAgICBsaXN0KHNpemVfdHlwZSBfX24pCisgICAgICA6IF9CYXNlKF9fbikgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX24sIF9fdmFsdWUsIF9fYSkgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgbGlzdChzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUgPSBfVHAoKSwKKwkgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKSAKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fYSkKKyAgICAgIHsJIAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChjb25zdCBsaXN0JiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIAorICAgICAgeyAJCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdCh0aGlzKTsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X2NvbnN0cnVjdDIodGhpcyk7IAorICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGxpc3QobGlzdCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9jb25zdHJ1Y3QyKHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgbGlzdChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKyAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICAgIDogX0Jhc2UoX19sLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5saXN0KCkgeyAKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfZGVzdHJ1Y3QodGhpcyk7IAorICAgICAgICBfX3Byb2ZjeHhfbGlzdF9kZXN0cnVjdDIodGhpcyk7IAorICAgICAgfQorCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IGxpc3QmIF9feCkKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfQmFzZSY+KCp0aGlzKSA9IF9feDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgbGlzdCYKKyAgICAgIG9wZXJhdG9yPShsaXN0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBsaXN0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgYXNzaWduKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgewlfQmFzZTo6YXNzaWduKF9fbCk7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9CYXNlOjphc3NpZ24oX19maXJzdCwgX19sYXN0KTsgfQorCisgICAgICB2b2lkCisgICAgICBhc3NpZ24oc2l6ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3QpCisgICAgICB7CV9CYXNlOjphc3NpZ24oX19uLCBfX3QpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCksIHRoaXMpOworICAgICAgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisgICAgICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICAgICAgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjIuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsgX0Jhc2U6OnJlc2l6ZShfX3N6KTsgfQorCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIGNvbnN0IF9UcCYgX19jKQorICAgICAgeyBfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICByZXNpemUoc2l6ZV90eXBlIF9fc3osIF9UcCBfX2MgPSBfVHAoKSkKKyAgICAgIHsgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOyB9CisjZW5kaWYKKworICAgICAgLy8gZWxlbWVudCBhY2Nlc3M6CisgICAgICByZWZlcmVuY2UKKyAgICAgIGZyb250KCkKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpmcm9udCgpOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgZnJvbnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2U6OmZyb250KCk7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBiYWNrKCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworCXJldHVybiBfQmFzZTo6YmFjaygpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGJhY2soKSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9yZXdpbmQodGhpcyk7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIDIzLjIuMi4zIG1vZGlmaWVyczoKKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfZnJvbnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9pbnZhbGlkX29wZXJhdG9yKHRoaXMpOworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisgICAgICAgIF9CYXNlOjpwdXNoX2Zyb250KF9feCk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdXNpbmcgX0Jhc2U6OmVtcGxhY2VfZnJvbnQ7CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgcG9wX2Zyb250KCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2xpc3Rfb3BlcmF0aW9uKHRoaXMpOworCV9CYXNlOjpwb3BfZnJvbnQoKTsKKyAgICAgIH0KKworICAgICAgdXNpbmcgX0Jhc2U6OnB1c2hfYmFjazsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB1c2luZyBfQmFzZTo6ZW1wbGFjZV9iYWNrOworI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHBvcF9iYWNrKCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX3ZpY3RpbSA9IGVuZCgpOworCS0tX192aWN0aW07CisJX0Jhc2U6OnBvcF9iYWNrKCk7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X3Jld2luZCh0aGlzKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgZW1wbGFjZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBfQXJncyYmLi4uIF9fYXJncykKKwl7CisJICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2UoX19wb3NpdGlvbi5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4uLikpOworCX0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYgX194KQorICAgICAgeworICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KSwgdGhpcyk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfVHAmJiBfX3gpCisgICAgICB7IAorICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVtcGxhY2UoX19wb3NpdGlvbi5iYXNlKCksIHN0ZDo6bW92ZShfX3gpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOyAKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworICAgICAgICBfTV9wcm9maWxlX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLCBzaXplKCkpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX2wpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX01fcHJvZmlsZV9pbnNlcnQodGhpcywgX19wb3NpdGlvbiwgc2l6ZSgpKTsKKwlfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX24sIF9feCk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgICBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICB7CisgICAgICAgIF9NX3Byb2ZpbGVfaW5zZXJ0KHRoaXMsIF9fcG9zaXRpb24sIHNpemUoKSk7CisgICAgICAgIF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbi5iYXNlKCksIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgewlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpKSwgdGhpcyk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwlyZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24uYmFzZSgpLCBfX2xhc3QuYmFzZSgpKSwgdGhpcyk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobGlzdCYgX194KQorICAgICAgewlfQmFzZTo6c3dhcChfX3gpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsJX0Jhc2U6OmNsZWFyKCk7IH0KKworICAgICAgLy8gMjMuMi4yLjQgbGlzdCBvcGVyYXRpb25zOgorICAgICAgdm9pZAorI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwgbGlzdCYgX194KQorI2VuZGlmCisgICAgICB7IHRoaXMtPnNwbGljZShfX3Bvc2l0aW9uLCBfR0xJQkNYWF9NT1ZFKF9feCksIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCkKKyAgICAgIHsgdGhpcy0+c3BsaWNlKF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKTsgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorICAgICAgeyB0aGlzLT5zcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9faSk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2kpCisjZWxzZQorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19pKQorI2VuZGlmCisgICAgICB7CisJLy8gV2UgdXNlZCB0byBwZXJmb3JtIHRoZSBzcGxpY2VfYWxsb2MgY2hlY2s6ICBub3QgYW55bW9yZSwgcmVkdW5kYW50CisJLy8gYWZ0ZXIgaW1wbGVtZW50aW5nIHRoZSByZWxldmFudCBiaXRzIG9mIE4xNTk5LgorCisJLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworCV9CYXNlOjpzcGxpY2UoX19wb3NpdGlvbi5iYXNlKCksIF9HTElCQ1hYX01PVkUoX194Ll9NX2Jhc2UoKSksCisJCSAgICAgIF9faS5iYXNlKCkpOworICAgICAgfQorCisgICAgICB2b2lkCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiYgX194LCBpdGVyYXRvciBfX2ZpcnN0LAorCSAgICAgaXRlcmF0b3IgX19sYXN0KQorI2Vsc2UKKyAgICAgIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gsIGl0ZXJhdG9yIF9fZmlyc3QsCisJICAgICBpdGVyYXRvciBfX2xhc3QpCisjZW5kaWYKKyAgICAgIHsKKwkvLyBXZSB1c2VkIHRvIHBlcmZvcm0gdGhlIHNwbGljZV9hbGxvYyBjaGVjazogIG5vdCBhbnltb3JlLCByZWR1bmRhbnQKKwkvLyBhZnRlciBpbXBsZW1lbnRpbmcgdGhlIHJlbGV2YW50IGJpdHMgb2YgTjE1OTkuCisKKwlfQmFzZTo6c3BsaWNlKF9fcG9zaXRpb24uYmFzZSgpLCBfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLAorCQkgICAgICBfX2ZpcnN0LmJhc2UoKSwgX19sYXN0LmJhc2UoKSk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgc3BsaWNlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGxpc3QmIF9feCwgaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyB0aGlzLT5zcGxpY2UoX19wb3NpdGlvbiwgc3RkOjptb3ZlKF9feCksIF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisgICAgICByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbHVlKQorICAgICAgeworCWZvciAoaXRlcmF0b3IgX194ID0gYmVnaW4oKTsgX194ICE9IGVuZCgpOyApCisJICB7CisJICAgIGlmICgqX194ID09IF9fdmFsdWUpCisJICAgICAgX194ID0gZXJhc2UoX194KTsKKwkgICAgZWxzZQorCSAgICAgICsrX194OworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfUHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHJlbW92ZV9pZihfUHJlZGljYXRlIF9fcHJlZCkKKyAgICAgICAgeworCSAgZm9yIChpdGVyYXRvciBfX3ggPSBiZWdpbigpOyBfX3ggIT0gZW5kKCk7ICkKKwkgICAgeworICAgICAgICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisJICAgICAgaWYgKF9fcHJlZCgqX194KSkKKwkJX194ID0gZXJhc2UoX194KTsKKwkgICAgICBlbHNlCisJCSsrX194OworCSAgICB9CisJfQorCisgICAgICB2b2lkCisgICAgICB1bmlxdWUoKQorICAgICAgeworCWl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworCWl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOworCWlmIChfX2ZpcnN0ID09IF9fbGFzdCkKKwkgIHJldHVybjsKKwlpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OworCXdoaWxlICgrK19fbmV4dCAhPSBfX2xhc3QpCisJICB7CisgICAgICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisJICAgIGlmICgqX19maXJzdCA9PSAqX19uZXh0KQorCSAgICAgIGVyYXNlKF9fbmV4dCk7CisJICAgIGVsc2UKKwkgICAgICBfX2ZpcnN0ID0gX19uZXh0OworCSAgICBfX25leHQgPSBfX2ZpcnN0OworCSAgfQorICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgorICAgICAgICB2b2lkCisgICAgICAgIHVuaXF1ZShfQmluYXJ5UHJlZGljYXRlIF9fYmluYXJ5X3ByZWQpCisgICAgICAgIHsKKwkgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOworCSAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CisJICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCisJICAgIHJldHVybjsKKwkgIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CisJICB3aGlsZSAoKytfX25leHQgIT0gX19sYXN0KQorCSAgICB7CisgICAgICAgICAgICAgIF9fcHJvZmN4eF9saXN0X29wZXJhdGlvbih0aGlzKTsKKwkgICAgICBpZiAoX19iaW5hcnlfcHJlZCgqX19maXJzdCwgKl9fbmV4dCkpCisJCWVyYXNlKF9fbmV4dCk7CisJICAgICAgZWxzZQorCQlfX2ZpcnN0ID0gX19uZXh0OworCSAgICAgIF9fbmV4dCA9IF9fZmlyc3Q7CisJICAgIH0KKwl9CisKKyAgICAgIHZvaWQKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgbWVyZ2UobGlzdCYmIF9feCkKKyNlbHNlCisgICAgICBtZXJnZShsaXN0JiBfX3gpCisjZW5kaWYKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMzAwLiBsaXN0OjptZXJnZSgpIHNwZWNpZmljYXRpb24gaW5jb21wbGV0ZQorCWlmICh0aGlzICE9ICZfX3gpCisJICB7IF9CYXNlOjptZXJnZShfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpKTsgfQorICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIG1lcmdlKGxpc3QmIF9feCkKKyAgICAgIHsgdGhpcy0+bWVyZ2Uoc3RkOjptb3ZlKF9feCkpOyB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0NvbXBhcmU+CisgICAgICAgIHZvaWQKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgICBtZXJnZShsaXN0JiYgX194LCBfQ29tcGFyZSBfX2NvbXApCisjZWxzZQorICAgICAgICBtZXJnZShsaXN0JiBfX3gsIF9Db21wYXJlIF9fY29tcCkKKyNlbmRpZgorICAgICAgICB7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyAzMDAuIGxpc3Q6Om1lcmdlKCkgc3BlY2lmaWNhdGlvbiBpbmNvbXBsZXRlCisJICBpZiAodGhpcyAhPSAmX194KQorCSAgICB7IF9CYXNlOjptZXJnZShfR0xJQkNYWF9NT1ZFKF9feC5fTV9iYXNlKCkpLCBfX2NvbXApOyB9CisJfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Db21wYXJlPgorICAgICAgICB2b2lkCisgICAgICAgIG1lcmdlKGxpc3QmIF9feCwgX0NvbXBhcmUgX19jb21wKQorICAgICAgICB7IHRoaXMtPm1lcmdlKHN0ZDo6bW92ZShfX3gpLCBfX2NvbXApOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc29ydCgpIHsgX0Jhc2U6OnNvcnQoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU3RyaWN0V2Vha09yZGVyaW5nPgorICAgICAgICB2b2lkCisgICAgICAgIHNvcnQoX1N0cmljdFdlYWtPcmRlcmluZyBfX3ByZWQpIHsgX0Jhc2U6OnNvcnQoX19wcmVkKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6cmV2ZXJzZTsKKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgaW5saW5lIHZvaWQgX01fcHJvZmlsZV9maW5kKCkgY29uc3QgCisgICAgICB7IH0KKworICAgICAgaW5saW5lIHZvaWQgX01fcHJvZmlsZV9pdGVyYXRlKGludCBfX3Jld2luZCA9IDApIGNvbnN0IAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2l0ZXJhdGUodGhpcyk7IAorICAgICAgICBpZiAoX19yZXdpbmQpCisgICAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdHlwZSBfTV9wcm9maWxlX2luc2VydCh2b2lkKiBvYmosIGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19zaXplKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19zaGlmdCA9IDA7CisgICAgICAgIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX2l0ID0gX19wb3MuYmFzZSgpOworICAgICAgICBmb3IgKCA7IF9faXQhPV9CYXNlOjplbmQoKTsgX19pdCsrKQorICAgICAgICAgIF9fc2hpZnQrKzsKKyAgICAgICAgX19wcm9mY3h4X2xpc3RfcmV3aW5kKHRoaXMpOworICAgICAgICBfX3Byb2ZjeHhfbGlzdF9vcGVyYXRpb24odGhpcyk7CisgICAgICAgIF9fcHJvZmN4eF9saXN0X2luc2VydCh0aGlzLCBfX3NoaWZ0LCBfX3NpemUpOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpICE9IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbGlzdDxfVHAsIF9BbGxvYz4mIF9fbGhzLAorCSAgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywKKwkgICAgICBjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX2xocywgbGlzdDxfVHAsIF9BbGxvYz4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworfSAvLyBuYW1lc3BhY2UgX19wcm9maWxlCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL21hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk2Yjg1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL21hcApAQCAtMCwwICsxLDQxIEBACisvLyBQcm9maWxpbmcgbWFwL211bHRpbWFwIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorLy8gU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAorLy8gVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUgc29mdHdhcmUKKy8vIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMgaW5zdGFudGlhdGUKKy8vIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzIGZpbGUsIG9yIHlvdSBjb21waWxlCisvLyB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMKKy8vIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5CisvLyB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyCisvLyBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkKKy8vIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworLyoqIEBmaWxlIHByb2ZpbGUvbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTUFQCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfTUFQIDEKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxwcm9maWxlL21hcC5oPgorI2luY2x1ZGUgPHByb2ZpbGUvbXVsdGltYXAuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvbWFwLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4YTJiMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9tYXAuaApAQCAtMCwwICsxLDUzMyBAQAorLy8gUHJvZmlsaW5nIG1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKy8vIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKy8vIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlIHNvZnR3YXJlCisvLyBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzIGluc3RhbnRpYXRlCisvLyB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcyBmaWxlLCBvciB5b3UgY29tcGlsZQorLy8gdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzCisvLyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieQorLy8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlcgorLy8gaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5CisvLyB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL21hcC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfTUFQX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NQVBfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6bWFwIHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleT4sCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIG1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjptYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICAvLyAyMy4zLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIG1hcChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpCisgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QodGhpcyk7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIG1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19hKQorICAgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QodGhpcyk7IH0KKworICAgICAgbWFwKGNvbnN0IG1hcCYgX194KQorICAgICAgOiBfQmFzZShfX3gpCisgICAgICB7IF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9jb25zdHJ1Y3QodGhpcyk7IH0KKworICAgICAgbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkKKyAgICAgIHsgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2NvbnN0cnVjdCh0aGlzKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG1hcChtYXAmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeyB9CisKKyAgICAgIG1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgIGNvbnN0IF9Db21wYXJlJiBfX2MgPSBfQ29tcGFyZSgpLAorCSAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19jLCBfX2EpIHsgfQorI2VuZGlmCisKKyAgICAgIH5tYXAoKQorICAgICAgeyBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZGVzdHJ1Y3QodGhpcyk7IH0KKworICAgICAgbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0obWFwJiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtYXAmCisgICAgICBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7CisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5pbnNlcnQoX19sKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMTMzLiBtYXAgbWlzc2luZyBnZXRfYWxsb2NhdG9yKCkKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvciAKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjpiZWdpbigpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZTo6YmVnaW4oKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZW5kKCkKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjplbmQoKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlOjplbmQoKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgCisgICAgICB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgICAgICB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgICAgIH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gY2FwYWNpdHk6CisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisgICAgICB1c2luZyBfQmFzZTo6c2l6ZTsKKyAgICAgIHVzaW5nIF9CYXNlOjptYXhfc2l6ZTsKKworICAgICAgLy8gMjMuMy4xLjIgZWxlbWVudCBhY2Nlc3M6CisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjpvcGVyYXRvcltdKF9fayk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGtleV90eXBlJiYgX19rKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gX0Jhc2U6Om9wZXJhdG9yW10oc3RkOjptb3ZlKF9faykpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgYXQoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjphdChfX2spOworICAgICAgfQorCisgICAgICBjb25zdCBtYXBwZWRfdHlwZSYKKyAgICAgIGF0KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9maW5kKHRoaXMsIHNpemUoKSk7CisgICAgICAgIHJldHVybiBfQmFzZTo6YXQoX19rKTsKKyAgICAgIH0KKworICAgICAgLy8gbW9kaWZpZXJzOgorICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplKCksIDEpOworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9feCk7CisJcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJCQkgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplKCksIDEpOworCSAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJICBzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzCisJICAgID0gX0Jhc2U6Omluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpOworCSAgcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJCQkgICBfX3Jlcy5zZWNvbmQpOworCX0KKyNlbmRpZgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19saXN0KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fbGlzdCk7IAorICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW5zZXJ0KHRoaXMsIHNpemVfYmVmb3JlLCAKKwkJCQkJICAgICAgc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeworICAgICAgICBzaXplX3R5cGUgc2l6ZV9iZWZvcmUgPSBzaXplKCk7CisJaXRlcmF0b3IgX19pID0gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX3gpKTsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2luc2VydCh0aGlzLCBzaXplX2JlZm9yZSwgCisJCQkJCSAgICAgIHNpemUoKSAtIHNpemVfYmVmb3JlKTsKKwlyZXR1cm4gX19pOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworCSAgaXRlcmF0b3IgX19pCisJICAgID0gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpKTsKKwkgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQodGhpcywgc2l6ZV9iZWZvcmUsIAorCQkJCQkJc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworCSAgcmV0dXJuIF9faTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90eXBlIHNpemVfYmVmb3JlID0gc2l6ZSgpOworCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworICAgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnNlcnQodGhpcywgc2l6ZV9iZWZvcmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSgpIC0gc2l6ZV9iZWZvcmUpOworCX0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsKKwlpdGVyYXRvciBfX2kgPSBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7CisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9lcmFzZSh0aGlzLCBzaXplKCksIDEpOworICAgICAgICByZXR1cm4gX19pOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7CisJX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pOworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZXJhc2UodGhpcywgc2l6ZSgpLCAxKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJaXRlcmF0b3IgX192aWN0aW0gPSBmaW5kKF9feCk7CisJaWYgKF9fdmljdGltID09IGVuZCgpKQorCSAgcmV0dXJuIDA7CisJZWxzZQorCXsKKwkgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICByZXR1cm4gMTsKKwl9CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsgX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KKyNlbmRpZgorCisgICAgICB2b2lkCisKKyAgICAgIHN3YXAobWFwJiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyB0aGlzLT5lcmFzZShiZWdpbigpLCBlbmQoKSk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIDIzLjMuMS4zIG1hcCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOworICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmZpbmQoX194KSk7CisgICAgICB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ZpbmQodGhpcywgc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIF9CYXNlOjpjb3VudChfX3gpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyAKKyAgICAgIH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgCisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUodGhpcyk7CisgICAgICAgIHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IAorICAgICAgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKHRoaXMpOworICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyAKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICBzdGQ6OnBhaXI8Y29uc3RfaXRlcmF0b3IsY29uc3RfaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfZmluZCh0aGlzLCBzaXplKCkpOworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIF9CYXNlX2NvbnN0X2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9jb25zdF9pdGVyYXRvciwgX0Jhc2VfY29uc3RfaXRlcmF0b3I+IF9fcmVzID0KKwlfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJiAKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyAKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyAKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSAhPSBfX3Jocy5fTV9iYXNlKCk7IAorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX2xocyk7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19yaHMpOworICAgICAgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19saHMpOworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fbGhzKTsKKyAgICAgIF9fcHJvZmN4eF9tYXBfdG9fdW5vcmRlcmVkX21hcF9pbnZhbGlkYXRlKCZfX3Jocyk7CisgICAgICByZXR1cm4gX19saHMuX01fYmFzZSgpID49IF9fcmhzLl9NX2Jhc2UoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3QgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7CisgICAgICBfX3Byb2ZjeHhfbWFwX3RvX3Vub3JkZXJlZF9tYXBfaW52YWxpZGF0ZSgmX19saHMpOworICAgICAgX19wcm9mY3h4X21hcF90b191bm9yZGVyZWRfbWFwX2ludmFsaWRhdGUoJl9fcmhzKTsKKyAgICAgIHJldHVybiBfX2xocy5fTV9iYXNlKCkgPiBfX3Jocy5fTV9iYXNlKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAobWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL211bHRpbWFwLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvbXVsdGltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWUxNjliCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL211bHRpbWFwLmgKQEAgLTAsMCArMSwzODAgQEAKKy8vIFByb2ZpbGluZyBtdWx0aW1hcCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbXVsdGltYXAuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01VTFRJTUFQX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NVUxUSU1BUF9IIDEKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjptdWx0aW1hcCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+ID4KKyAgICBjbGFzcyBtdWx0aW1hcAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjptdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXM6CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwCQkJCSAgICAgbWFwcGVkX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQWxsb2NhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmV2ZXJzZV9pdGVyYXRvciAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworCisgICAgICAvLyAyMy4zLjEuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQgbXVsdGltYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCQljb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fY29tcCwgX19hKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fZmlyc3QsIF9fbGFzdCwgX19jb21wLCBfX2EpIHsgfQorCisgICAgICBtdWx0aW1hcChjb25zdCBtdWx0aW1hcCYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisgICAgICBtdWx0aW1hcChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIHsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG11bHRpbWFwKG11bHRpbWFwJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsgfQorCisgICAgICBtdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fYyA9IF9Db21wYXJlKCksCisJICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fYywgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+bXVsdGltYXAoKSB7IH0KKworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbXVsdGltYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgbXVsdGltYXAmCisgICAgICBvcGVyYXRvcj0obXVsdGltYXAmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIG11bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHVzaW5nIF9CYXNlOjpnZXRfYWxsb2NhdG9yOworCisgICAgICAvLyBpdGVyYXRvcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJlbmQoKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2JlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgY2VuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgY3JlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQorI2VuZGlmCisKKyAgICAgIC8vIGNhcGFjaXR5OgorICAgICAgdXNpbmcgX0Jhc2U6OmVtcHR5OworICAgICAgdXNpbmcgX0Jhc2U6OnNpemU7CisgICAgICB1c2luZyBfQmFzZTo6bWF4X3NpemU7CisKKyAgICAgIC8vIG1vZGlmaWVyczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3gpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpKTsgfQorI2VuZGlmCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2xpc3QpCisgICAgICB7IF9CYXNlOjppbnNlcnQoX19saXN0KTsgfQorI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisjZWxzZQorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyNlbmRpZgorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBfX3gpKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBfUGFpciYmIF9feCkKKyAgICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLAorCQkJCQlzdGQ6OmZvcndhcmQ8X1BhaXI+KF9feCkpKTsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbikpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlzdGQ6OnBhaXI8aXRlcmF0b3IsIGl0ZXJhdG9yPiBfX3ZpY3RpbXMgPSB0aGlzLT5lcXVhbF9yYW5nZShfX3gpOworCXNpemVfdHlwZSBfX2NvdW50ID0gMDsKKwl3aGlsZSAoX192aWN0aW1zLmZpcnN0ICE9IF9fdmljdGltcy5zZWNvbmQpCisJeworCSAgaXRlcmF0b3IgX192aWN0aW0gPSBfX3ZpY3RpbXMuZmlyc3QrKzsKKwkgIF9CYXNlOjplcmFzZShfX3ZpY3RpbSk7CisJICArK19fY291bnQ7CisJfQorCXJldHVybiBfX2NvdW50OworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX2ZpcnN0LCBjb25zdF9pdGVyYXRvciBfX2xhc3QpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpCisgICAgICB7IF9CYXNlOjplcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CisjZW5kaWYKKworICAgICAgdm9pZAorICAgICAgc3dhcChtdWx0aW1hcCYgX194KQorICAgICAgeyBfQmFzZTo6c3dhcChfX3gpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCkKKyAgICAgIHsgdGhpcy0+ZXJhc2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKKyAgICAgIC8vIG9ic2VydmVyczoKKyAgICAgIHVzaW5nIF9CYXNlOjprZXlfY29tcDsKKyAgICAgIHVzaW5nIF9CYXNlOjp2YWx1ZV9jb21wOworCisgICAgICAvLyAyMy4zLjEuMyBtdWx0aW1hcCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorCV9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBpdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9jb25zdF9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfY29uc3RfaXRlcmF0b3IsIF9CYXNlX2NvbnN0X2l0ZXJhdG9yPiBfX3JlcyA9CisJX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGNvbnN0X2l0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PShjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChtdWx0aW1hcDxfS2V5LCBfVHAsIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJIG11bHRpbWFwPF9LZXksIF9UcCwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL211bHRpc2V0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvbXVsdGlzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjkwMmEwCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL211bHRpc2V0LmgKQEAgLTAsMCArMSwzNjcgQEAKKy8vIFByb2ZpbGluZyBtdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHByb2ZpbGUvbXVsdGlzZXQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX01VTFRJU0VUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9NVUxUSVNFVF9IIDEKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIF9fcHJvZmlsZQoreworICAvLy8gQ2xhc3Mgc3RkOjptdWx0aXNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIG11bHRpc2V0CisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0M6Om11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6Om11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfS2V5CQkJCSAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAgIGtleV9jb21wYXJlOworICAgICAgdHlwZWRlZiBfQ29tcGFyZQkJCQkgICAgIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlCSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpwb2ludGVyICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisKKyAgICAgIC8vIDIzLjMuMy4xIGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3k6CisgICAgICBleHBsaWNpdCBtdWx0aXNldChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJCWNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogX0Jhc2UoX19jb21wLCBfX2EpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCQkgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJCSBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fY29tcCwgX19hKSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgbXVsdGlzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgbXVsdGlzZXQoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBtdWx0aXNldChtdWx0aXNldCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJICAgICAgIGNvbnN0IF9Db21wYXJlJiBfX2NvbXAgPSBfQ29tcGFyZSgpLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfm11bHRpc2V0KCkgeyB9CisKKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IG11bHRpc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIG11bHRpc2V0JgorICAgICAgb3BlcmF0b3I9KG11bHRpc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBtdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyBtb2RpZmllcnM6CisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX194KSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KHN0ZDo6bW92ZShfX3gpKSk7IH0KKyNlbmRpZgorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjppbnNlcnQoX19wb3NpdGlvbiwgX194KSk7IH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9fcG9zaXRpb24sIHZhbHVlX3R5cGUmJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIHN0ZDo6bW92ZShfX3gpKSk7IH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgICB7IF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgX0Jhc2U6Omluc2VydChfX2wpOyB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19wb3NpdGlvbikKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKSk7IH0KKyNlbHNlCisgICAgICB2b2lkCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyBfQmFzZTo6ZXJhc2UoX19wb3NpdGlvbik7IH0KKyNlbmRpZgorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJc3RkOjpwYWlyPGl0ZXJhdG9yLCBpdGVyYXRvcj4gX192aWN0aW1zID0gdGhpcy0+ZXF1YWxfcmFuZ2UoX194KTsKKwlzaXplX3R5cGUgX19jb3VudCA9IDA7CisJd2hpbGUgKF9fdmljdGltcy5maXJzdCAhPSBfX3ZpY3RpbXMuc2Vjb25kKQorCXsKKwkgIGl0ZXJhdG9yIF9fdmljdGltID0gX192aWN0aW1zLmZpcnN0Kys7CisJICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgKytfX2NvdW50OworCX0KKwlyZXR1cm4gX19jb3VudDsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCkpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAobXVsdGlzZXQmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7IHRoaXMtPmVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQorCisgICAgICAvLyBvYnNlcnZlcnM6CisgICAgICB1c2luZyBfQmFzZTo6a2V5X2NvbXA7CisgICAgICB1c2luZyBfQmFzZTo6dmFsdWVfY29tcDsKKworICAgICAgLy8gbXVsdGlzZXQgb3BlcmF0aW9uczoKKyAgICAgIGl0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6ZmluZChfX3gpKTsgfQorCisgICAgICB1c2luZyBfQmFzZTo6Y291bnQ7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omxvd2VyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6dXBwZXJfYm91bmQoX194KSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgX0Jhc2VfaXRlcmF0b3I+IF9fcmVzID0KKyAgICAgICAgX0Jhc2U6OmVxdWFsX3JhbmdlKF9feCk7CisJcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCSAgICAgIGl0ZXJhdG9yKF9fcmVzLnNlY29uZCkpOworICAgICAgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIHN0ZDo6cGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorICAgICAgICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoY29uc3RfaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgY29uc3RfaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA9PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA8PSBfX3Jocy5fTV9iYXNlKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSwgdHlwZW5hbWUgX0FsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICAgY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgbXVsdGlzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgICAgICBjb25zdCBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLl9NX2Jhc2UoKSA+IF9fcmhzLl9NX2Jhc2UoKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9Db21wYXJlLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIHZvaWQKKyAgICBzd2FwKG11bHRpc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorCSBtdWx0aXNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9feSkKKyAgICB7IHJldHVybiBfX3guc3dhcChfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9zZXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2MDNhOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS9zZXQKQEAgLTAsMCArMSw0MSBAQAorLy8gUHJvZmlsaW5nIHNldC9tdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKy8vIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKy8vIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlIHNvZnR3YXJlCisvLyBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzIGluc3RhbnRpYXRlCisvLyB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcyBmaWxlLCBvciB5b3UgY29tcGlsZQorLy8gdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzCisvLyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieQorLy8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlcgorLy8gaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5CisvLyB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL3NldAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBwcm9maWxlIGV4dGVuc2lvbiB0byB0aGUgU3RhbmRhcmQgQysrIExpYnJhcnkuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9QUk9GSUxFX1NFVAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1NFVCAxCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8cHJvZmlsZS9zZXQuaD4KKyNpbmNsdWRlIDxwcm9maWxlL211bHRpc2V0Lmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL3NldC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGExMWYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvc2V0LmgKQEAgLTAsMCArMSwzNzcgQEAKKy8vIFByb2ZpbGluZyBzZXQgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBwcm9maWxlL3NldC5oCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfU0VUX0gKKyNkZWZpbmUgX0dMSUJDWFhfUFJPRklMRV9TRVRfSCAxCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkgCit7CituYW1lc3BhY2UgX19wcm9maWxlCit7CisgIC8vLyBDbGFzcyBzdGQ6OnNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yID0gc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIHNldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9DOjpzZXQ8X0tleSxfQ29tcGFyZSxfQWxsb2NhdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0dMSUJDWFhfU1REX0M6OnNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4gX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlczoKKyAgICAgIHR5cGVkZWYgX0tleQkJCQkgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIF9LZXkJCQkJICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIF9Db21wYXJlCQkJCSAgICBrZXlfY29tcGFyZTsKKyAgICAgIHR5cGVkZWYgX0NvbXBhcmUJCQkJICAgIHZhbHVlX2NvbXBhcmU7CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IJCQkgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cG9pbnRlciAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9wb2ludGVyICAgICAgICAgY29uc3RfcG9pbnRlcjsKKworICAgICAgLy8gMjMuMy4zLjEgY29uc3RydWN0L2NvcHkvZGVzdHJveToKKyAgICAgIGV4cGxpY2l0IHNldChjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkJICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiBfQmFzZShfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBzZXQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wID0gX0NvbXBhcmUoKSwKKwkgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorCTogX0Jhc2UoX19maXJzdCwgX19sYXN0LCBfX2NvbXAsIF9fYSkgeyB9CisKKyAgICAgIHNldChjb25zdCBzZXQmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSB7IH0KKworICAgICAgc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgeyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgc2V0KHNldCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7IH0KKworICAgICAgc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCisJICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX2NvbXAsIF9fYSkgeyB9CisjZW5kaWYKKworICAgICAgfnNldCgpIHsgfQorCisgICAgICBzZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3Qgc2V0JiBfX3gpCisgICAgICB7CisJKnN0YXRpY19jYXN0PF9CYXNlKj4odGhpcykgPSBfX3g7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6Z2V0X2FsbG9jYXRvcjsKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCkpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjplbXB0eTsKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisgICAgICAvLyBtb2RpZmllcnM6CisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYgX194KQorICAgICAgeworCXR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9CYXNlX2l0ZXJhdG9yOworCXN0ZDo6cGFpcjxfQmFzZV9pdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9feCk7CisJcmV0dXJuIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4oaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJCQkgX19yZXMuc2Vjb25kKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBpbnNlcnQodmFsdWVfdHlwZSYmIF9feCkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIGJvb2w+IF9fcmVzCisJICA9IF9CYXNlOjppbnNlcnQoc3RkOjptb3ZlKF9feCkpOworCXJldHVybiBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+KGl0ZXJhdG9yKF9fcmVzLmZpcnN0KSwKKwkJCQkJIF9fcmVzLnNlY29uZCk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9feCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uLCB2YWx1ZV90eXBlJiYgX194KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLCBzdGQ6Om1vdmUoX194KSkpOyB9CisjZW5kaWYKKworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpCisgICAgICAgIHsgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyBfQmFzZTo6aW5zZXJ0KF9fbCk7IH0KKyNlbmRpZgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShjb25zdF9pdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fcG9zaXRpb24pKTsgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pCisgICAgICB7IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uKTsgfQorI2VuZGlmCisKKyAgICAgIHNpemVfdHlwZQorICAgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsKKwlpdGVyYXRvciBfX3ZpY3RpbSA9IGZpbmQoX194KTsKKwlpZiAoX192aWN0aW0gPT0gZW5kKCkpCisgICAgICAgICAgcmV0dXJuIDA7CisJZWxzZQorICAgICAgICB7CisJICBfQmFzZTo6ZXJhc2UoX192aWN0aW0pOworCSAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVyYXNlKF9fZmlyc3QsIF9fbGFzdCkpOyB9CisjZWxzZQorICAgICAgdm9pZAorICAgICAgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQorICAgICAgeyBfQmFzZTo6ZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAoc2V0JiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeyB0aGlzLT5lcmFzZShiZWdpbigpLCBlbmQoKSk7IH0KKworICAgICAgLy8gb2JzZXJ2ZXJzOgorICAgICAgdXNpbmcgX0Jhc2U6OmtleV9jb21wOworICAgICAgdXNpbmcgX0Jhc2U6OnZhbHVlX2NvbXA7CisKKyAgICAgIC8vIHNldCBvcGVyYXRpb25zOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOyB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpmaW5kKF9feCkpOyB9CisKKyAgICAgIHVzaW5nIF9CYXNlOjpjb3VudDsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfQmFzZTo6bG93ZXJfYm91bmQoX194KSk7IH0KKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjE0LiBzZXQ6OmZpbmQoKSBtaXNzaW5nIGNvbnN0IG92ZXJsb2FkCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjpsb3dlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgdXBwZXJfYm91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjp1cHBlcl9ib3VuZChfX3gpKTsgfQorCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyMTQuIHNldDo6ZmluZCgpIG1pc3NpbmcgY29uc3Qgb3ZlcmxvYWQKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OnVwcGVyX2JvdW5kKF9feCkpOyB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvcixpdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpCisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX0Jhc2VfaXRlcmF0b3I7CisJc3RkOjpwYWlyPF9CYXNlX2l0ZXJhdG9yLCBfQmFzZV9pdGVyYXRvcj4gX19yZXMgPQorICAgICAgICBfQmFzZTo6ZXF1YWxfcmFuZ2UoX194KTsKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoX19yZXMuZmlyc3QpLAorCQkJICAgICAgaXRlcmF0b3IoX19yZXMuc2Vjb25kKSk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDIxNC4gc2V0OjpmaW5kKCkgbWlzc2luZyBjb25zdCBvdmVybG9hZAorICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPgorICAgICAgZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBfQmFzZV9pdGVyYXRvcjsKKwlzdGQ6OnBhaXI8X0Jhc2VfaXRlcmF0b3IsIF9CYXNlX2l0ZXJhdG9yPiBfX3JlcyA9CisgICAgICAgIF9CYXNlOjplcXVhbF9yYW5nZShfX3gpOworCXJldHVybiBzdGQ6Om1ha2VfcGFpcihjb25zdF9pdGVyYXRvcihfX3Jlcy5maXJzdCksCisJCQkgICAgICBjb25zdF9pdGVyYXRvcihfX3Jlcy5zZWNvbmQpKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHNldDxfS2V5LCBfQ29tcGFyZSwgX0FsbG9jYXRvcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19saHMsCisJICAgICAgY29uc3Qgc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX0NvbXBhcmUsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgdm9pZAorICAgIHN3YXAoc2V0PF9LZXksIF9Db21wYXJlLCBfQWxsb2NhdG9yPiYgX194LAorCSBzZXQ8X0tleSwgX0NvbXBhcmUsIF9BbGxvY2F0b3I+JiBfX3kpCisgICAgeyByZXR1cm4gX194LnN3YXAoX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS91bm9yZGVyZWRfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL3Vub3JkZXJlZF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1NDAwOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS91bm9yZGVyZWRfbWFwCkBAIC0wLDAgKzEsNTc2IEBACisvLyBQcm9maWxpbmcgdW5vcmRlcmVkX21hcC91bm9yZGVyZWRfbXVsdGltYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisvLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisvLyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsCisvLyBVU0EuCisKKy8vIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgdXNlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgZnJlZSBzb2Z0d2FyZQorLy8gbGlicmFyeSB3aXRob3V0IHJlc3RyaWN0aW9uLiAgU3BlY2lmaWNhbGx5LCBpZiBvdGhlciBmaWxlcyBpbnN0YW50aWF0ZQorLy8gdGVtcGxhdGVzIG9yIHVzZSBtYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoaXMgZmlsZSwgb3IgeW91IGNvbXBpbGUKKy8vIHRoaXMgZmlsZSBhbmQgbGluayBpdCB3aXRoIG90aGVyIGZpbGVzIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcworLy8gZmlsZSBkb2VzIG5vdCBieSBpdHNlbGYgY2F1c2UgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlIGNvdmVyZWQgYnkKKy8vIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIKKy8vIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5IHRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieQorLy8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisvKiogQGZpbGUgcHJvZmlsZS91bm9yZGVyZWRfbWFwCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVU5PUkRFUkVEX01BUAorI2RlZmluZSBfR0xJQkNYWF9QUk9GSUxFX1VOT1JERVJFRF9NQVAgMQorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorCisjZGVmaW5lIF9HTElCQ1hYX0JBU0UgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorI2RlZmluZSBfR0xJQkNYWF9TVERfQkFTRSBfR0xJQkNYWF9TVERfQzo6X0dMSUJDWFhfQkFTRQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLy8vIENsYXNzIHN0ZDo6dW5vcmRlcmVkX21hcCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsCisJICAgdHlwZW5hbWUgX0hhc2ggID0gc3RkOjpoYXNoPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICB0eXBlbmFtZSBfQWxsb2MgPSAgc3RkOjphbGxvY2F0b3I8X0tleT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQkFTRQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0dMSUJDWFhfU1REX0JBU0UgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Om1hcHBlZF90eXBlICAgICAgbWFwcGVkX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbWFwKHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKyAgICAgICAgdW5vcmRlcmVkX21hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJICAgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkgICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdCh0aGlzLCBfQmFzZTo6YnVja2V0X2NvdW50KCkpOworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAoY29uc3QgX0Jhc2UmIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSAKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX21hcCh1bm9yZGVyZWRfbWFwJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkgCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX21hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpIHsgfQorCisgICAgICB1bm9yZGVyZWRfbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tYXAmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tYXAmCisgICAgICBvcGVyYXRvcj0odW5vcmRlcmVkX21hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX21hcCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgfnVub3JkZXJlZF9tYXAoKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwKKwkJCQkgICAgIF9CYXNlOjpzaXplKCkpOworICAgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KCk7CisgICAgICB9CisKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwKKwkJCQkgICAgIF9CYXNlOjpzaXplKCkpOworICAgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KCk7CisgICAgICAgIF9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOyAKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2wpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBfX3YpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfUGFpciwKKwkJCQkJCSAgdmFsdWVfdHlwZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPgorICAgICAgICBpbnNlcnQoX1BhaXImJiBfX29iaikKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworCSAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBfX3JlcworCSAgICA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxfUGFpciwKKwkJCQkJCSAgdmFsdWVfdHlwZT46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgaXRlcmF0b3IKKyAgICAgICAgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIF9faXRlciwgX1BhaXImJiBfX3YpCisgICAgICAgIHsgCisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisJICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBzdGQ6OmZvcndhcmQ8X1BhaXI+KF9fdikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgIH0KKworICAgICAgLy8gb3BlcmF0b3JbXQorICAgICAgbWFwcGVkX3R5cGUmCisgICAgICBvcGVyYXRvcltdKGNvbnN0IF9LZXkmIF9faykKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBtYXBwZWRfdHlwZSYgX19yZXMgPSBfTV9iYXNlKClbX19rXTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIG1hcHBlZF90eXBlJgorICAgICAgb3BlcmF0b3JbXShfS2V5JiYgX19rKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIG1hcHBlZF90eXBlJiBfX3JlcyA9IF9NX2Jhc2UoKVtzdGQ6Om1vdmUoX19rKV07CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tYXAmIF9feCkKKyAgICAgIHsgX0Jhc2U6OnN3YXAoX194KTsgfQorCisgICAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjpyZWhhc2goX19uKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHNpemVfdHlwZSBfX29sZF9zaXplKQorICAgICAgeworCXNpemVfdHlwZSBfX25ld19zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBpZiAoX19vbGRfc2l6ZSAhPSBfX25ld19zaXplKQorCSAgX19wcm9mY3h4X2hhc2h0YWJsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgX19uZXdfc2l6ZSk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfZGVzdHJ1Y3QoKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19ob3BzID0gMCwgX19sYyA9IDAsIF9fY2hhaW4gPSAwOworICAgICAgICBmb3IgKGl0ZXJhdG9yIF9faXQgPSBfTV9iYXNlKCkuYmVnaW4oKTsgX19pdCAhPSBfTV9iYXNlKCkuZW5kKCk7CisJICAgICArK19faXQpCisJICB7CisJICAgIHdoaWxlIChfX2l0Ll9NX2N1cl9ub2RlLT5fTV9uZXh0KQorCSAgICAgIHsKKwkJKytfX2NoYWluOworCQkrK19faXQ7CisJICAgICAgfQorCSAgICBpZiAoX19jaGFpbikKKwkgICAgICB7CisJCSsrX19jaGFpbjsKKwkJX19sYyA9IF9fbGMgPiBfX2NoYWluID8gX19sYyA6IF9fY2hhaW47ICAKKwkJX19ob3BzICs9IF9fY2hhaW4gKiAoX19jaGFpbiAtIDEpIC8gMjsKKwkJX19jaGFpbiA9IDA7CisJICAgICAgfQorCSAgfQorICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0Mih0aGlzLCBfX2xjLCAgX0Jhc2U6OnNpemUoKSwgX19ob3BzKTsgCisgICAgICB9CisgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fZXF1YWwoX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0hhc2gsCisJICAgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCisjdW5kZWYgX0dMSUJDWFhfQkFTRQorI3VuZGVmIF9HTElCQ1hYX1NURF9CQVNFCisjZGVmaW5lIF9HTElCQ1hYX0JBU0UgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisjZGVmaW5lIF9HTElCQ1hYX1NURF9CQVNFIF9HTElCQ1hYX1NURF9DOjpfR0xJQkNYWF9CQVNFCisKKyAgLy8vIENsYXNzIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwIHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9UcCwKKwkgICB0eXBlbmFtZSBfSGFzaCAgPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9ICBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX211bHRpbWFwCisgICAgOiBwdWJsaWMgX0dMSUJDWFhfU1REX0JBU0UKKyAgICB7ICAgICAgCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9HTElCQ1hYX1NURF9CQVNFIF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X3R5cGUgICAgICAgIGtleV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6cmVmZXJlbmNlICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkJIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdCh0aGlzLCBfQmFzZTo6YnVja2V0X2NvdW50KCkpOworICAgICAgfQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2YsIF9JbnB1dEl0ZXJhdG9yIF9fbCwKKwkJCSAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkJICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwKHVub3JkZXJlZF9tdWx0aW1hcCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCwKKwkJCSBzaXplX3R5cGUgX19uID0gMCwKKwkJCSBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKSB7IH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KHVub3JkZXJlZF9tdWx0aW1hcCYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX211bHRpbWFwJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB+dW5vcmRlcmVkX211bHRpbWFwKCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdCh0aGlzLCBfQmFzZTo6YnVja2V0X2NvdW50KCksIAorCQkJCSAgICAgX0Jhc2U6OnNpemUoKSk7CisgICAgICAgIF9NX3Byb2ZpbGVfZGVzdHJ1Y3QoKTsKKyAgICAgIH0KKworICAgICAgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgICAgICAgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3QgX0Jhc2UmCisgICAgICBfTV9iYXNlKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKwkJCQkgICAgIF9CYXNlOjpzaXplKCkpOworICAgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KCk7CisgICAgICAgIF9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsgCisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gIF9CYXNlOjpidWNrZXRfY291bnQoKTsKKyAgICAgICAgX0Jhc2U6Omluc2VydChfX2wpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplLCBfQmFzZTo6YnVja2V0X2NvdW50KCkpOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fb2JqKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX29iaik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIF9fdik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1BhaXIsCisJCQkJCQkgIHZhbHVlX3R5cGU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGl0ZXJhdG9yCisgICAgICAgIGluc2VydChfUGFpciYmIF9fb2JqKQorICAgICAgICB7CisJICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisJICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoc3RkOjpmb3J3YXJkPF9QYWlyPihfX29iaikpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisJICByZXR1cm4gX19yZXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPF9QYWlyLAorCQkJCQkJICB2YWx1ZV90eXBlPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpdGVyYXRvcgorICAgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCBfUGFpciYmIF9fdikKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgaXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9faXRlciwgc3RkOjpmb3J3YXJkPF9QYWlyPihfX3YpKTsKKwkgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorCSAgcmV0dXJuIF9fcmVzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisJfQorCisgICAgICB2b2lkCisgICAgICBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSogX19maXJzdCwgY29uc3QgdmFsdWVfdHlwZSogX19sYXN0KQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIF9CYXNlOjppbnNlcnQoX19maXJzdCwgX19sYXN0KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwJiBfX3gpCisgICAgICB7IF9CYXNlOjpzd2FwKF9feCk7IH0KKworICAgICAgdm9pZCByZWhhc2goc2l6ZV90eXBlIF9fbikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBfQmFzZTo6cmVoYXNoKF9fbik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHNpemVfdHlwZSBfX29sZF9zaXplLCBzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fb2xkX3NpemUgIT0gX19uZXdfc2l6ZSkKKyAgICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCBfX25ld19zaXplKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2hvcHMgPSAwLCBfX2xjID0gMCwgX19jaGFpbiA9IDA7CisgICAgICAgIGZvciAoaXRlcmF0b3IgX19pdCA9IF9NX2Jhc2UoKS5iZWdpbigpOyBfX2l0ICE9IF9NX2Jhc2UoKS5lbmQoKTsKKwkgICAgICsrX19pdCkKKwkgIHsKKwkgICAgd2hpbGUgKF9faXQuX01fY3VyX25vZGUtPl9NX25leHQpCisJICAgICAgeworCQkrK19fY2hhaW47CisJCSsrX19pdDsKKwkgICAgICB9CisJICAgIGlmIChfX2NoYWluKQorCSAgICAgIHsKKwkJKytfX2NoYWluOworCQlfX2xjID0gX19sYyA+IF9fY2hhaW4gPyBfX2xjIDogX19jaGFpbjsKKwkJX19ob3BzICs9IF9fY2hhaW4gKiAoX19jaGFpbiAtIDEpIC8gMjsKKwkJX19jaGFpbiA9IDA7CisJICAgICAgfQorCSAgfQorICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0Mih0aGlzLCBfX2xjLCAgX0Jhc2U6OnNpemUoKSwgX19ob3BzKTsKKyAgICAgIH0KKworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcCh1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9IYXNoLAorCSAgIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfbXVsdGltYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyN1bmRlZiBfR0xJQkNYWF9CQVNFCisjdW5kZWYgX0dMSUJDWFhfU1REX0JBU0UKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL3Vub3JkZXJlZF9zZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvdW5vcmRlcmVkX3NldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdmYjc2Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9wcm9maWxlL3Vub3JkZXJlZF9zZXQKQEAgLTAsMCArMSw1NDIgQEAKKy8vIFByb2ZpbGluZyB1bm9yZGVyZWRfc2V0L3Vub3JkZXJlZF9tdWx0aXNldCBpbXBsZW1lbnRhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKy8vIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKy8vIFNvZnR3YXJlIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwKKy8vIFVTQS4KKworLy8gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IG1heSB1c2UgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBmcmVlIHNvZnR3YXJlCisvLyBsaWJyYXJ5IHdpdGhvdXQgcmVzdHJpY3Rpb24uICBTcGVjaWZpY2FsbHksIGlmIG90aGVyIGZpbGVzIGluc3RhbnRpYXRlCisvLyB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcyBmaWxlLCBvciB5b3UgY29tcGlsZQorLy8gdGhpcyBmaWxlIGFuZCBsaW5rIGl0IHdpdGggb3RoZXIgZmlsZXMgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzCisvLyBmaWxlIGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieQorLy8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlcgorLy8gaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5CisvLyB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKy8qKiBAZmlsZSBwcm9maWxlL3Vub3JkZXJlZF9zZXQKKyAqICBUaGlzIGZpbGUgaXMgYSBHTlUgcHJvZmlsZSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfUFJPRklMRV9VTk9SREVSRURfU0VUCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVU5PUkRFUkVEX1NFVCAxCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8cHJvZmlsZS9iYXNlLmg+CisKKyNkZWZpbmUgX0dMSUJDWFhfQkFTRSB1bm9yZGVyZWRfc2V0PF9LZXksIF9IYXNoLCBfUHJlZCwgX0FsbG9jPgorI2RlZmluZSBfR0xJQkNYWF9TVERfQkFTRSBfR0xJQkNYWF9TVERfQzo6X0dMSUJDWFhfQkFTRQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgLyoqIEBicmllZiBVbm9yZGVyZWRfc2V0IHdyYXBwZXIgd2l0aCBwZXJmb3JtYW5jZSBpbnN0cnVtZW50YXRpb24uICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCAKKwkgICB0eXBlbmFtZSBfSGFzaCAgPSBzdGQ6Omhhc2g8X0tleT4sCisJICAgdHlwZW5hbWUgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIHR5cGVuYW1lIF9BbGxvYyA9ICBzdGQ6OmFsbG9jYXRvcjxfS2V5PiA+CisgICAgY2xhc3MgdW5vcmRlcmVkX3NldAorICAgIDogcHVibGljIF9HTElCQ1hYX1NURF9CQVNFCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfR0xJQkNYWF9TVERfQkFTRSBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV90eXBlICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnZhbHVlX3R5cGUgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworCisgICAgICBleHBsaWNpdAorICAgICAgdW5vcmRlcmVkX3NldChzaXplX3R5cGUgX19uID0gMTAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIHVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfc2V0KGNvbnN0IF9CYXNlJiBfX3gpCisgICAgICA6IF9CYXNlKF9feCkgCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdCh0aGlzLCBfQmFzZTo6YnVja2V0X2NvdW50KCkpOworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQodW5vcmRlcmVkX3NldCYmIF9feCkKKyAgICAgIDogX0Jhc2Uoc3RkOjptb3ZlKF9feCkpIAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsKKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfc2V0KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCQkgICAgc2l6ZV90eXBlIF9fbiA9IDAsCisJCSAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9zZXQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdW5vcmRlcmVkX3NldCYgX194KQorICAgICAgeworCSpzdGF0aWNfY2FzdDxfQmFzZSo+KHRoaXMpID0gX194OworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdW5vcmRlcmVkX3NldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfc2V0JiYgX194KQorICAgICAgeworCS8vIE5COiBEUiAxMjA0LgorCS8vIE5COiBEUiA2NzUuCisJdGhpcy0+Y2xlYXIoKTsKKwl0aGlzLT5zd2FwKF9feCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfc2V0JgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+aW5zZXJ0KF9fbCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB+dW5vcmRlcmVkX3NldCgpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZTo6c2l6ZSgpKTsKKyAgICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9zZXQmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX0Jhc2U6OnN3YXAoX194KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgY2xlYXIoKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2Rlc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Jhc2U6OnNpemUoKSk7CisgICAgICAgIF9NX3Byb2ZpbGVfZGVzdHJ1Y3QoKTsKKyAgICAgICAgX0Jhc2U6OmNsZWFyKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fbCk7IAorICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplLCAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fb2JqKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIF9fdik7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4KKyAgICAgIGluc2VydCh2YWx1ZV90eXBlJiYgX19vYmopCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IF9fcmVzID0gX0Jhc2U6Omluc2VydChzdGQ6Om1vdmUoX19vYmopKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCB2YWx1ZV90eXBlJiYgX192KQorICAgICAgeyAKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIHN0ZDo6bW92ZShfX3YpKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsICBfQmFzZTo6YnVja2V0X2NvdW50KCkpOyAKKyAgICAgIH0KKyAgICAgCisgICAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjpyZWhhc2goX19uKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHNpemVfdHlwZSBfX29sZF9zaXplLCBzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fb2xkX3NpemUgIT0gX19uZXdfc2l6ZSkKKwkgIF9fcHJvZmN4eF9oYXNodGFibGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIF9fbmV3X3NpemUpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9wcm9maWxlX2Rlc3RydWN0KCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9faG9wcyA9IDAsIF9fbGMgPSAwLCBfX2NoYWluID0gMDsKKyAgICAgICAgZm9yIChpdGVyYXRvciBfX2l0ID0gX01fYmFzZSgpLmJlZ2luKCk7IF9faXQgIT0gX01fYmFzZSgpLmVuZCgpOworCSAgICAgKytfX2l0KQorICAgICAgICB7CisgICAgICAgICAgd2hpbGUgKF9faXQuX01fY3VyX25vZGUtPl9NX25leHQpCisJICAgIHsKKwkgICAgICArK19fY2hhaW47CisJICAgICAgKytfX2l0OworCSAgICB9CisKKyAgICAgICAgICBpZiAoX19jaGFpbikKKwkgICAgeworCSAgICAgICsrX19jaGFpbjsKKwkgICAgICBfX2xjID0gX19sYyA+IF9fY2hhaW4gPyBfX2xjIDogX19jaGFpbjsKKwkgICAgICBfX2hvcHMgKz0gX19jaGFpbiAqIChfX2NoYWluIC0gMSkgLyAyOworCSAgICAgIF9fY2hhaW4gPSAwOworCSAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19wcm9mY3h4X2hhc2h0YWJsZV9kZXN0cnVjdDIodGhpcywgX19sYywgIF9CYXNlOjpzaXplKCksIF9faG9wcyk7CisgICAgICB9CisKKyAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1ByZWQsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSAgICAgICBjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJICAgICAgIGNvbnN0IHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IHJldHVybiAhKF9feCA9PSBfX3kpOyB9CisKKyN1bmRlZiBfR0xJQkNYWF9CQVNFCisjdW5kZWYgX0dMSUJDWFhfU1REX0JBU0UKKyNkZWZpbmUgX0dMSUJDWFhfU1REX0JBU0UgX0dMSUJDWFhfU1REX0M6Ol9HTElCQ1hYX0JBU0UKKyNkZWZpbmUgX0dMSUJDWFhfQkFTRSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKworICAvKiogQGJyaWVmIFVub3JkZXJlZF9tdWx0aXNldCB3cmFwcGVyIHdpdGggcGVyZm9ybWFuY2UgaW5zdHJ1bWVudGF0aW9uLiAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLAorICAgICAgIHR5cGVuYW1lIF9IYXNoICA9IHN0ZDo6aGFzaDxfVmFsdWU+LAorICAgICAgIHR5cGVuYW1lIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorICAgICAgIHR5cGVuYW1lIF9BbGxvYyA9ICBzdGQ6OmFsbG9jYXRvcjxfVmFsdWU+ID4KKyAgICBjbGFzcyB1bm9yZGVyZWRfbXVsdGlzZXQKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQkFTRQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0dMSUJDWFhfU1REX0JBU0UgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfdHlwZSAgICAgICAga2V5X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpyZWZlcmVuY2UgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICBzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fZiwgX19sLCBfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfY29uc3RydWN0KHRoaXMsIF9CYXNlOjpidWNrZXRfY291bnQoKSk7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCh1bm9yZGVyZWRfbXVsdGlzZXQmJiBfX3gpCisgICAgICA6IF9CYXNlKHN0ZDo6bW92ZShfX3gpKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX2NvbnN0cnVjdCh0aGlzLCBfQmFzZTo6YnVja2V0X2NvdW50KCkpOworICAgICAgfQorCisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQoaW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wsCisJCQkgc2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkgeyB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQmIF9feCkKKyAgICAgIHsKKwkqc3RhdGljX2Nhc3Q8X0Jhc2UqPih0aGlzKSA9IF9feDsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPSh1bm9yZGVyZWRfbXVsdGlzZXQmJiBfX3gpCisgICAgICB7CisJLy8gTkI6IERSIDEyMDQuCisJLy8gTkI6IERSIDY3NS4KKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPnN3YXAoX194KTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldCYKKyAgICAgIG9wZXJhdG9yPShpbml0aWFsaXplcl9saXN0PHZhbHVlX3R5cGU+IF9fbCkKKyAgICAgIHsKKwl0aGlzLT5jbGVhcigpOworCXRoaXMtPmluc2VydChfX2wpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgfnVub3JkZXJlZF9tdWx0aXNldCgpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZTo6c2l6ZSgpKTsKKyAgICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHVub3JkZXJlZF9tdWx0aXNldCYgX194KQorICAgICAgeworICAgICAgICBfQmFzZTo6c3dhcChfX3gpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QodGhpcywgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZTo6c2l6ZSgpKTsKKyAgICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpOworICAgICAgICBfQmFzZTo6Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx2YWx1ZV90eXBlPiBfX2wpCisgICAgICB7IAorICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjppbnNlcnQoX19sKTsgCisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsICBfQmFzZTo6YnVja2V0X2NvdW50KCkpOyAKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX29iaikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpOworICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19vYmopOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplLCAgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciBfX2l0ZXIsIGNvbnN0IHZhbHVlX3R5cGUmIF9fdikKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBpdGVyYXRvciBfX3JlcyA9IF9CYXNlOjppbnNlcnQoX19pdGVyLCBfX3YpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZShfX29sZF9zaXplLCBfQmFzZTo6YnVja2V0X2NvdW50KCkpOyAKKyAgICAgICAgcmV0dXJuIF9fcmVzOworICAgICAgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KHZhbHVlX3R5cGUmJiBfX29iaikKKyAgICAgIHsKKwlzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChzdGQ6Om1vdmUoX19vYmopKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgICByZXR1cm4gX19yZXM7CisgICAgICB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoY29uc3RfaXRlcmF0b3IgX19pdGVyLCB2YWx1ZV90eXBlJiYgX192KQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IF9CYXNlOjpidWNrZXRfY291bnQoKTsgCisgICAgICAgIGl0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX2l0ZXIsIHN0ZDo6bW92ZShfX3YpKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgX0Jhc2U6OmJ1Y2tldF9jb3VudCgpKTsgCisgICAgICAgIHJldHVybiBfX3JlczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcj4KKyAgICAgICAgdm9pZAorICAgICAgICBpbnNlcnQoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCkKKyAgICAgICAgeworCSAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorCSAgX0Jhc2U6Omluc2VydChfX2ZpcnN0LCBfX2xhc3QpOworCSAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorCX0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUqIF9fZmlyc3QsIGNvbnN0IHZhbHVlX3R5cGUqIF9fbGFzdCkKKyAgICAgIHsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBfQmFzZTo6YnVja2V0X2NvdW50KCk7IAorICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKF9fb2xkX3NpemUsICBfQmFzZTo6YnVja2V0X2NvdW50KCkpOyAKKyAgICAgIH0KKyAgICAgCisgICAgICB2b2lkIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgICAgeworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9ICBfQmFzZTo6YnVja2V0X2NvdW50KCk7CisgICAgICAgIF9CYXNlOjpyZWhhc2goX19uKTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUoX19vbGRfc2l6ZSwgIF9CYXNlOjpidWNrZXRfY291bnQoKSk7IAorICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9CYXNlJgorICAgICAgX01fYmFzZSgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIGNvbnN0IF9CYXNlJgorICAgICAgX01fYmFzZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHNpemVfdHlwZSBfX29sZF9zaXplLCBzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fb2xkX3NpemUgIT0gX19uZXdfc2l6ZSkKKyAgICAgICAgICBfX3Byb2ZjeHhfaGFzaHRhYmxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCBfX25ld19zaXplKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01fcHJvZmlsZV9kZXN0cnVjdCgpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX2hvcHMgPSAwLCBfX2xjID0gMCwgX19jaGFpbiA9IDA7CisgICAgICAgIGZvciAoaXRlcmF0b3IgX19pdCA9IF9NX2Jhc2UoKS5iZWdpbigpOyBfX2l0ICE9IF9NX2Jhc2UoKS5lbmQoKTsKKwkgICAgICsrX19pdCkKKyAgICAgICAgeworICAgICAgICAgIHdoaWxlIChfX2l0Ll9NX2N1cl9ub2RlLT5fTV9uZXh0KQorCSAgICB7CisgICAgICAgICAgICAgKytfX2NoYWluOworICAgICAgICAgICAgICsrX19pdDsKKwkgICAgfQorCisgICAgICAgICAgaWYgKF9fY2hhaW4pCisJICAgIHsKKwkgICAgICArK19fY2hhaW47CisJICAgICAgX19sYyA9IF9fbGMgPiBfX2NoYWluID8gX19sYyA6IF9fY2hhaW47CisJICAgICAgX19ob3BzICs9IF9fY2hhaW4gKiAoX19jaGFpbiAtIDEpIC8gMjsKKwkgICAgICBfX2NoYWluID0gMDsKKwkgICAgfQorICAgICAgICB9CisgICAgICAgIF9fcHJvZmN4eF9oYXNodGFibGVfZGVzdHJ1Y3QyKHRoaXMsIF9fbGMsICBfQmFzZTo6c2l6ZSgpLCBfX2hvcHMpOworICAgICAgfQorCisgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9QcmVkLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2VxdWFsKF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUHJlZCwgdHlwZW5hbWUgX0FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgICAgICAgY29uc3QgdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyByZXR1cm4gIShfX3ggPT0gX195KTsgfQorCit9IC8vIG5hbWVzcGFjZSBfX3Byb2ZpbGUKK30gLy8gbmFtZXNwYWNlIHN0ZAorCisjdW5kZWYgX0dMSUJDWFhfQkFTRQorI3VuZGVmIF9HTElCQ1hYX1NURF9CQVNFCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcHJvZmlsZS92ZWN0b3IgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvdmVjdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODFjMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Byb2ZpbGUvdmVjdG9yCkBAIC0wLDAgKzEsNTE5IEBACisvLyBQcm9maWxpbmcgdmVjdG9yIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworLy8gd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorLy8gU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLAorLy8gVVNBLgorCisvLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIGZyZWUgc29mdHdhcmUKKy8vIGxpYnJhcnkgd2l0aG91dCByZXN0cmljdGlvbi4gIFNwZWNpZmljYWxseSwgaWYgb3RoZXIgZmlsZXMgaW5zdGFudGlhdGUKKy8vIHRlbXBsYXRlcyBvciB1c2UgbWFjcm9zIG9yIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGlzIGZpbGUsIG9yIHlvdSBjb21waWxlCisvLyB0aGlzIGZpbGUgYW5kIGxpbmsgaXQgd2l0aCBvdGhlciBmaWxlcyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMKKy8vIGZpbGUgZG9lcyBub3QgYnkgaXRzZWxmIGNhdXNlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5CisvLyB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyCisvLyBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSB0aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkKKy8vIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworLyoqIEBmaWxlIHByb2ZpbGUvdmVjdG9yCisgKiAgVGhpcyBmaWxlIGlzIGEgR05VIHByb2ZpbGUgZXh0ZW5zaW9uIHRvIHRoZSBTdGFuZGFyZCBDKysgTGlicmFyeS4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SCisjZGVmaW5lIF9HTElCQ1hYX1BST0ZJTEVfVkVDVE9SIDEKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHByb2ZpbGUvYmFzZS5oPgorI2luY2x1ZGUgPHByb2ZpbGUvaXRlcmF0b3JfdHJhY2tlci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSBfX3Byb2ZpbGUKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IgPSBzdGQ6OmFsbG9jYXRvcjxfVHA+ID4KKyAgICBjbGFzcyB2ZWN0b3IKKyAgICA6IHB1YmxpYyBfR0xJQkNYWF9TVERfQzo6dmVjdG9yPF9UcCwgX0FsbG9jYXRvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9HTElCQ1hYX1NURF9DOjp2ZWN0b3I8X1RwLCBfQWxsb2NhdG9yPiBfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnJlZmVyZW5jZSAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpjb25zdF9yZWZlcmVuY2UgICAgICAgY29uc3RfcmVmZXJlbmNlOworCisgICAgICB0eXBlZGVmIF9faXRlcmF0b3JfdHJhY2tlcjx0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IsIHZlY3Rvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19pdGVyYXRvcl90cmFja2VyPHR5cGVuYW1lIF9CYXNlOjpjb25zdF9pdGVyYXRvciwgdmVjdG9yPgorCQkJCSAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgZGlmZmVyZW5jZV90eXBlOworCisgICAgICB0eXBlZGVmIF9UcAkJCQkgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvcgkJCSAgICBhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnBvaW50ZXIgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6Y29uc3RfcG9pbnRlciAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICAgICAgCisgICAgICBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICBjb25zdCBfQmFzZSYKKyAgICAgIF9NX2Jhc2UoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICAgICAvLyAyMy4yLjQuMSBjb25zdHJ1Y3QvY29weS9kZXN0cm95OgorICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3Rvcihjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlKF9fYSkKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgZXhwbGljaXQKKyAgICAgIHZlY3RvcihzaXplX3R5cGUgX19uKQorICAgICAgOiAgX0Jhc2UoX19uKQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSwKKwkgICAgIGNvbnN0IF9BbGxvY2F0b3ImIF9fYSA9IF9BbGxvY2F0b3IoKSkKKyAgICAgIDogIF9CYXNlKF9fbiwgX192YWx1ZSwgX19hKQorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBleHBsaWNpdAorICAgICAgdmVjdG9yKHNpemVfdHlwZSBfX24sIGNvbnN0IF9UcCYgX192YWx1ZSA9IF9UcCgpLAorCSAgICAgY29uc3QgX0FsbG9jYXRvciYgX19hID0gX0FsbG9jYXRvcigpKQorICAgICAgOiAgX0Jhc2UoX19uLCBfX3ZhbHVlLCBfX2EpCisgICAgICB7IAorICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdCh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QyKHRoaXMpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICB2ZWN0b3IoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisJOiBfQmFzZShfX2ZpcnN0LCBfX2xhc3QsIF9fYSkKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIHZlY3Rvcihjb25zdCB2ZWN0b3ImIF9feCkKKyAgICAgIDogX0Jhc2UoX194KSAKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2NvbnN0cnVjdDIodGhpcyk7CisgICAgICB9CisKKyAgICAgIC8vLyBDb25zdHJ1Y3Rpb24gZnJvbSBhIHJlbGVhc2UtbW9kZSB2ZWN0b3IKKyAgICAgIHZlY3Rvcihjb25zdCBfQmFzZSYgX194KQorICAgICAgOiBfQmFzZShfX3gpIAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB2ZWN0b3IodmVjdG9yJiYgX194KQorICAgICAgOiBfQmFzZShzdGQ6Om1vdmUoX194KSkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9jb25zdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfY29uc3RydWN0Mih0aGlzKTsKKyAgICAgIH0KKworICAgICAgdmVjdG9yKGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sLAorCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbCwgX19hKSB7IH0KKyNlbmRpZgorCisgICAgICB+dmVjdG9yKCkgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2Rlc3RydWN0KHRoaXMsIHRoaXMtPmNhcGFjaXR5KCksIHRoaXMtPnNpemUoKSk7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QyKHRoaXMpOworICAgICAgfQorCisgICAgICB2ZWN0b3ImCisgICAgICBvcGVyYXRvcj0oY29uc3QgdmVjdG9yJiBfX3gpCisgICAgICB7CisgICAgICAgIHN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX194OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KHZlY3RvciYmIF9feCkKKyAgICAgIHsKKwkvLyBOQjogRFIgMTIwNC4KKwkvLyBOQjogRFIgNjc1LgorCXRoaXMtPmNsZWFyKCk7CisJdGhpcy0+c3dhcChfX3gpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdmVjdG9yJgorICAgICAgb3BlcmF0b3I9KGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeworCXN0YXRpY19jYXN0PF9CYXNlJj4oKnRoaXMpID0gX19sOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6YXNzaWduOworICAgICAgdXNpbmcgX0Jhc2U6OmdldF9hbGxvY2F0b3I7CisKKworICAgICAgLy8gaXRlcmF0b3JzOgorICAgICAgaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIGl0ZXJhdG9yKF9CYXNlOjpiZWdpbigpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmJlZ2luKCksIHRoaXMpOyB9CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlbmQoKQorICAgICAgeyByZXR1cm4gaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9CYXNlOjplbmQoKSwgdGhpcyk7IH0KKworICAgICAgcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmJlZ2luKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yCisgICAgICByZW5kKCkKKyAgICAgIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcgorICAgICAgcmVuZCgpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihfQmFzZTo6YmVnaW4oKSwgdGhpcyk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNlbmQoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0Jhc2U6OmVuZCgpLCB0aGlzKTsgfQorCisgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yCisgICAgICBjcmJlZ2luKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IKKyAgICAgIGNyZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyNlbmRpZgorCisgICAgICAvLyAyMy4yLjQuMiBjYXBhY2l0eToKKyAgICAgIHVzaW5nIF9CYXNlOjpzaXplOworICAgICAgdXNpbmcgX0Jhc2U6Om1heF9zaXplOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeikKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKHRoaXMpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpLCBfX3N6KTsKKyAgICAgICAgX0Jhc2U6OnJlc2l6ZShfX3N6KTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgcmVzaXplKHNpemVfdHlwZSBfX3N6LCBjb25zdCBfVHAmIF9fYykKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnZhbGlkX29wZXJhdG9yKHRoaXMpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCB0aGlzLT5jYXBhY2l0eSgpLCBfX3N6KTsKKyAgICAgICAgX0Jhc2U6OnJlc2l6ZShfX3N6LCBfX2MpOworICAgICAgfQorI2Vsc2UKKyAgICAgIHZvaWQKKyAgICAgIHJlc2l6ZShzaXplX3R5cGUgX19zeiwgX1RwIF9fYyA9IF9UcCgpKQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2ludmFsaWRfb3BlcmF0b3IodGhpcyk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIHRoaXMtPmNhcGFjaXR5KCksIF9fc3opOworICAgICAgICBfQmFzZTo6cmVzaXplKF9fc3osIF9fYyk7CisgICAgICB9CisjZW5kaWYKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICB1c2luZyBfQmFzZTo6c2hyaW5rX3RvX2ZpdDsKKyNlbmRpZgorCisgICAgICB1c2luZyBfQmFzZTo6ZW1wdHk7CisKKyAgICAgIC8vIGVsZW1lbnQgYWNjZXNzOgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorICAgICAgY29uc3RfcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW52YWxpZF9vcGVyYXRvcih0aGlzKTsKKyAgICAgICAgcmV0dXJuIF9NX2Jhc2UoKVtfX25dOworICAgICAgfQorCisgICAgICB1c2luZyBfQmFzZTo6YXQ7CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgZnJvbnQoKQorICAgICAgeyAKKyAgICAgICAgcmV0dXJuIF9CYXNlOjpmcm9udCgpOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGZyb250KCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gX0Jhc2U6OmZyb250KCk7CisgICAgICB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgYmFjaygpCisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgYmFjaygpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIF9CYXNlOjpiYWNrKCk7CisgICAgICB9CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIERSIDQ2NC4gU3VnZ2VzdGlvbiBmb3IgbmV3IG1lbWJlciBmdW5jdGlvbnMgaW4gc3RhbmRhcmQgY29udGFpbmVycy4KKyAgICAgIHVzaW5nIF9CYXNlOjpkYXRhOworCisgICAgICAvLyAyMy4yLjQuMyBtb2RpZmllcnM6CisgICAgICB2b2lkCisgICAgICBwdXNoX2JhY2soY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+Y2FwYWNpdHkoKTsKKwlfQmFzZTo6cHVzaF9iYWNrKF9feCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHB1c2hfYmFjayhfVHAmJiBfX3gpCisgICAgICB7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+Y2FwYWNpdHkoKTsKKyAgICAgICAgX0Jhc2U6OnB1c2hfYmFjayhfX3gpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCB0aGlzLT5jYXBhY2l0eSgpKTsKKyAgICAgIH0KKworI2VuZGlmCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfaW5zZXJ0KHRoaXMsIF9fcG9zaXRpb24uYmFzZSgpIC0gX0Jhc2U6OmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnNpemUoKSk7CisgICAgICAgIHNpemVfdHlwZSBfX29sZF9zaXplID0gdGhpcy0+Y2FwYWNpdHkoKTsKKwl0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24uYmFzZSgpLCBfX3gpOworICAgICAgICBfTV9wcm9maWxlX3Jlc2l6ZSh0aGlzLCBfX29sZF9zaXplLCB0aGlzLT5jYXBhY2l0eSgpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIGl0ZXJhdG9yCisgICAgICBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgX1RwJiYgX194KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLmJhc2UoKSAtIF9CYXNlOjpiZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zaXplKCkpOworICAgICAgICBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHRoaXMtPmNhcGFjaXR5KCk7CisJdHlwZW5hbWUgX0Jhc2U6Oml0ZXJhdG9yIF9fcmVzID0gX0Jhc2U6Omluc2VydChfX3Bvc2l0aW9uLmJhc2UoKSwgX194KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGluaXRpYWxpemVyX2xpc3Q8dmFsdWVfdHlwZT4gX19sKQorICAgICAgeyB0aGlzLT5pbnNlcnQoX19wb3NpdGlvbiwgX19sLmJlZ2luKCksIF9fbC5lbmQoKSk7IH0KKyNlbmRpZgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiYgX194KQorICAgICAgeworICAgICAgICBfQmFzZTo6c3dhcChfX3gpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodmVjdG9yJiBfX3gpCisgICAgICB7CisgICAgICAgIF9CYXNlOjpzd2FwKF9feCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCkKKyAgICAgIHsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pbnNlcnQodGhpcywgX19wb3NpdGlvbi5iYXNlKCkgLSBfQmFzZTo6YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fbiwgX194KTsKKyAgICAgICAgX01fcHJvZmlsZV9yZXNpemUodGhpcywgX19vbGRfc2l6ZSwgdGhpcy0+Y2FwYWNpdHkoKSk7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCisgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQorICAgICAgeworICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX2luc2VydCh0aGlzLCBfX3Bvc2l0aW9uLmJhc2UoKS1fQmFzZTo6YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSB0aGlzLT5jYXBhY2l0eSgpOworICAgICAgICBfQmFzZTo6aW5zZXJ0KF9fcG9zaXRpb24sIF9fZmlyc3QsIF9fbGFzdCk7CisgICAgICAgIF9NX3Byb2ZpbGVfcmVzaXplKHRoaXMsIF9fb2xkX3NpemUsIHRoaXMtPmNhcGFjaXR5KCkpOworICAgICAgfQorCisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQorICAgICAgeworCXR5cGVuYW1lIF9CYXNlOjppdGVyYXRvciBfX3JlcyA9IF9CYXNlOjplcmFzZShfX3Bvc2l0aW9uLmJhc2UoKSk7CisJcmV0dXJuIGl0ZXJhdG9yKF9fcmVzLCB0aGlzKTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwkvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJLy8gMTUxLiBjYW4ndCBjdXJyZW50bHkgY2xlYXIoKSBlbXB0eSBjb250YWluZXIKKwl0eXBlbmFtZSBfQmFzZTo6aXRlcmF0b3IgX19yZXMgPSBfQmFzZTo6ZXJhc2UoX19maXJzdC5iYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2xhc3QuYmFzZSgpKTsKKwlyZXR1cm4gaXRlcmF0b3IoX19yZXMsIHRoaXMpOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBjbGVhcigpCisgICAgICB7CisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZGVzdHJ1Y3QodGhpcywgdGhpcy0+Y2FwYWNpdHkoKSwgdGhpcy0+c2l6ZSgpKTsKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9kZXN0cnVjdDIodGhpcyk7CisgICAgICAgIF9CYXNlOjpjbGVhcigpOworICAgICAgfQorCisgICAgICBpbmxpbmUgdm9pZCBfTV9wcm9maWxlX2ZpbmQoKSBjb25zdCAKKyAgICAgIHsgCisgICAgICAgIF9fcHJvZmN4eF92ZWN0b3JfZmluZCh0aGlzLCBzaXplKCkpOyAKKyAgICAgIH0KKworICAgICAgaW5saW5lIHZvaWQgX01fcHJvZmlsZV9pdGVyYXRlKGludCBfX3Jld2luZCA9IDApIGNvbnN0IAorICAgICAgeyAKKyAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9pdGVyYXRlKHRoaXMpOyAKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkIF9NX3Byb2ZpbGVfcmVzaXplKHZvaWQqIG9iaiwgc2l6ZV90eXBlIF9fb2xkX3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgX19uZXdfc2l6ZSkKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fb2xkX3NpemUgPCBfX25ld19zaXplKSB7CisgICAgICAgICAgX19wcm9mY3h4X3ZlY3Rvcl9yZXNpemUodGhpcywgdGhpcy0+c2l6ZSgpLCBfX25ld19zaXplKTsKKyAgICAgICAgICBfX3Byb2ZjeHhfdmVjdG9yX3Jlc2l6ZTIodGhpcywgdGhpcy0+c2l6ZSgpLCBfX25ld19zaXplKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgIT0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpIDwgX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPD0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLAorICAgICAgICAgICBjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5fTV9iYXNlKCkgPj0gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19saHMsCisgICAgICAgICAgY29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuX01fYmFzZSgpID4gX19yaHMuX01fYmFzZSgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodmVjdG9yPF9UcCwgX0FsbG9jPiYmIF9fbGhzLCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3JocykKKyAgICB7IF9fbGhzLnN3YXAoX19yaHMpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9fbGhzLCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIF9fcHJvZmlsZQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgLy8gRFIgMTE4Mi4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdmVjdG9yPGJvb2w+LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQWxsb2M+CisgICAgc3RydWN0IGhhc2g8X19wcm9maWxlOjp2ZWN0b3I8Ym9vbCwgX0FsbG9jPj4KKyAgICA6IHB1YmxpYyBfX2hhc2hfYmFzZTxzaXplX3QsIF9fcHJvZmlsZTo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9fcHJvZmlsZTo6dmVjdG9yPGJvb2wsIF9BbGxvYz4mIF9fYikgY29uc3Qgbm9leGNlcHQKKyAgICAgIHsgcmV0dXJuIHN0ZDo6aGFzaDxfR0xJQkNYWF9TVERfQzo6dmVjdG9yPGJvb2wsIF9BbGxvYz4+KCkKKwkgIChfX2IuX01fYmFzZSgpKTsgfQorICAgIH07CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9xdWV1ZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcXVldWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmOTg0MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvcXVldWUKQEAgLTAsMCArMSw2NyBAQAorLy8gPHF1ZXVlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0CisgKiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LDE5OTcKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL3F1ZXVlCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1FVRVVFCisjZGVmaW5lIF9HTElCQ1hYX1FVRVVFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGJpdHMvc3RsX2hlYXAuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3F1ZXVlLmg+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9RVUVVRSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9yYW5kb20gYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3JhbmRvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFlZDhlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9yYW5kb20KQEAgLTAsMCArMSw1NyBAQAorLy8gPHJhbmRvbT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3JhbmRvbQorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9SQU5ET00KKyNkZWZpbmUgX0dMSUJDWFhfUkFORE9NIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2luY2x1ZGUgPGNzdGRpbnQ+IC8vIEZvciB1aW50X2Zhc3QzMl90LCB1aW50X2Zhc3Q2NF90LCB1aW50X2xlYXN0MzJfdAorI2luY2x1ZGUgPGJpdHMvcmFuZG9tLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5kb20udGNjPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgLy8gX0dMSUJDWFhfUkFORE9NCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3JhdGlvIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9yYXRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QyOGExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9yYXRpbwpAQCAtMCwwICsxLDM5MyBAQAorLy8gcmF0aW8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSAKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3JhdGlvCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1JBVElPCisjZGVmaW5lIF9HTElCQ1hYX1JBVElPIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgcmF0aW8gUmF0aW9uYWwgQXJpdGhtZXRpYworICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogQ29tcGlsZSB0aW1lIHJlcHJlc2VudGF0aW9uIG9mIGZpbml0ZSByYXRpb25hbCBudW1iZXJzLgorICAgKiBAeworICAgKi8KKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfUG4+CisgICAgc3RydWN0IF9fc3RhdGljX3NpZ24KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCAoX1BuIDwgMCkgPyAtMSA6IDE+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9Qbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfYWJzCisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxpbnRtYXhfdCwgX1BuICogX19zdGF0aWNfc2lnbjxfUG4+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBpbnRtYXhfdCBfUW4+CisgICAgc3RydWN0IF9fc3RhdGljX2djZDsKKyAKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBpbnRtYXhfdCBfUW4+CisgICAgc3RydWN0IF9fc3RhdGljX2djZAorICAgIDogX19zdGF0aWNfZ2NkPF9RbiwgKF9QbiAlIF9Rbik+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9Qbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfZ2NkPF9QbiwgMD4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCBfX3N0YXRpY19hYnM8X1BuPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9Rbj4KKyAgICBzdHJ1Y3QgX19zdGF0aWNfZ2NkPDAsIF9Rbj4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGludG1heF90LCBfX3N0YXRpY19hYnM8X1FuPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vIExldCBjID0gMl4oaGFsZiAjIG9mIGJpdHMgaW4gYW4gaW50bWF4X3QpCisgIC8vIHRoZW4gd2UgZmluZCBhMSwgYTAsIGIxLCBiMCBzLnQuIE4gPSBhMSpjICsgYTAsIE0gPSBiMSpjICsgYjAKKyAgLy8gVGhlIG11bHRpcGxpY2F0aW9uIG9mIE4gYW5kIE0gYmVjb21lcywKKyAgLy8gTiAqIE0gPSAoYTEgKiBiMSljXjIgKyAoYTAgKiBiMSArIGIwICogYTEpYyArIGEwICogYjAKKyAgLy8gTXVsdGlwbGljYXRpb24gaXMgc2FmZSBpZiBlYWNoIHRlcm0gYW5kIHRoZSBzdW0gb2YgdGhlIHRlcm1zCisgIC8vIGlzIHJlcHJlc2VudGFibGUgYnkgaW50bWF4X3QuCisgIHRlbXBsYXRlPGludG1heF90IF9QbiwgaW50bWF4X3QgX1FuPgorICAgIHN0cnVjdCBfX3NhZmVfbXVsdGlwbHkKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19jID0gdWludG1heF90KDEpIDw8IChzaXplb2YoaW50bWF4X3QpICogNCk7CisKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19hMCA9IF9fc3RhdGljX2FiczxfUG4+Ojp2YWx1ZSAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19hMSA9IF9fc3RhdGljX2FiczxfUG4+Ojp2YWx1ZSAvIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19iMCA9IF9fc3RhdGljX2FiczxfUW4+Ojp2YWx1ZSAlIF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCB1aW50bWF4X3QgX19iMSA9IF9fc3RhdGljX2FiczxfUW4+Ojp2YWx1ZSAvIF9fYzsKKworICAgICAgc3RhdGljX2Fzc2VydChfX2ExID09IDAgfHwgX19iMSA9PSAwLCAKKyAgICAgICAgIm92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYTAgKiBfX2IxICsgX19iMCAqIF9fYTEgPCAoX19jID4+IDEpLCAKKyAgICAgICAgIm92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fYjAgKiBfX2EwIDw9IF9fSU5UTUFYX01BWF9fLCAKKyAgICAgICAgIm92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KChfX2EwICogX19iMSArIF9fYjAgKiBfX2ExKSAqIF9fYyA8PSAKKyAgICAgICAgX19JTlRNQVhfTUFYX18gLSAgX19iMCAqIF9fYTAsICJvdmVyZmxvdyBpbiBtdWx0aXBsaWNhdGlvbiIpOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IHZhbHVlID0gX1BuICogX1FuOworICAgIH07CisKKyAgLy8gSGVscGVycyBmb3IgX19zYWZlX2FkZAorICB0ZW1wbGF0ZTxpbnRtYXhfdCBfUG4sIGludG1heF90IF9RbiwgYm9vbD4KKyAgICBzdHJ1Y3QgX19hZGRfb3ZlcmZsb3dfY2hlY2tfaW1wbAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9QbiA8PSBfX0lOVE1BWF9NQVhfXyAtIF9Rbik+CisgICAgeyB9OworCisgIHRlbXBsYXRlPGludG1heF90IF9QbiwgaW50bWF4X3QgX1FuPgorICAgIHN0cnVjdCBfX2FkZF9vdmVyZmxvd19jaGVja19pbXBsPF9QbiwgX1FuLCBmYWxzZT4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfUG4gPj0gLV9fSU5UTUFYX01BWF9fIC0gX1FuKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX1BuLCBpbnRtYXhfdCBfUW4+CisgICAgc3RydWN0IF9fYWRkX292ZXJmbG93X2NoZWNrCisgICAgOiBfX2FkZF9vdmVyZmxvd19jaGVja19pbXBsPF9QbiwgX1FuLCAoX1FuID49IDApPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfUG4sIGludG1heF90IF9Rbj4KKyAgICBzdHJ1Y3QgX19zYWZlX2FkZAorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX19hZGRfb3ZlcmZsb3dfY2hlY2s8X1BuLCBfUW4+Ojp2YWx1ZSAhPSAwLCAKKyAgICAgICAgIm92ZXJmbG93IGluIGFkZGl0aW9uIik7CisKKyAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCB2YWx1ZSA9IF9QbiArIF9RbjsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFByb3ZpZGVzIGNvbXBpbGUtdGltZSByYXRpb25hbCBhcml0aG1ldGljLgorICAgKgorICAgKiAgVGhpcyBjbGFzcyB0ZW1wbGF0ZSByZXByZXNlbnRzIGFueSBmaW5pdGUgcmF0aW9uYWwgbnVtYmVyIHdpdGggYQorICAgKiAgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciByZXByZXNlbnRhYmxlIGJ5IGNvbXBpbGUtdGltZSBjb25zdGFudHMgb2YKKyAgICogIHR5cGUgaW50bWF4X3QuIFRoZSByYXRpbyBpcyBzaW1wbGlmaWVkIHdoZW4gaW5zdGFudGlhdGVkLgorICAgKgorICAgKiAgRm9yIGV4YW1wbGU6CisgICAqICBAY29kZQorICAgKiAgICBzdGQ6OnJhdGlvPDcsLTIxPjo6bnVtID09IC0xOworICAgKiAgICBzdGQ6OnJhdGlvPDcsLTIxPjo6ZGVuID09IDM7CisgICAqICBAZW5kY29kZQorICAgKiAgCisgICovCisgIHRlbXBsYXRlPGludG1heF90IF9OdW0sIGludG1heF90IF9EZW4gPSAxPgorICAgIHN0cnVjdCByYXRpbworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX0RlbiAhPSAwLCAiZGVub21pbmF0b3IgY2Fubm90IGJlIHplcm8iKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoX051bSA+PSAtX19JTlRNQVhfTUFYX18gJiYgX0RlbiA+PSAtX19JTlRNQVhfTUFYX18sCisJCSAgICAib3V0IG9mIHJhbmdlIik7CisKKyAgICAgIC8vIE5vdGU6IHNpZ24oTikgKiBhYnMoTikgPT0gTgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBudW0gPQorICAgICAgICBfTnVtICogX19zdGF0aWNfc2lnbjxfRGVuPjo6dmFsdWUgLyBfX3N0YXRpY19nY2Q8X051bSwgX0Rlbj46OnZhbHVlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IGRlbiA9CisgICAgICAgIF9fc3RhdGljX2FiczxfRGVuPjo6dmFsdWUgLyBfX3N0YXRpY19nY2Q8X051bSwgX0Rlbj46OnZhbHVlOworCisgICAgICB0eXBlZGVmIHJhdGlvPG51bSwgZGVuPiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8aW50bWF4X3QgX051bSwgaW50bWF4X3QgX0Rlbj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW88X051bSwgX0Rlbj46Om51bTsKKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfTnVtLCBpbnRtYXhfdCBfRGVuPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCByYXRpbzxfTnVtLCBfRGVuPjo6ZGVuOworCisgIC8vLyByYXRpb19hZGQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2FkZAorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBfX2djZCA9CisgICAgICAgIF9fc3RhdGljX2djZDxfUjE6OmRlbiwgX1IyOjpkZW4+Ojp2YWx1ZTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgX19uID0gX19zYWZlX2FkZDwKKyAgICAgICAgX19zYWZlX211bHRpcGx5PF9SMTo6bnVtLCAoX1IyOjpkZW4gLyBfX2djZCk+Ojp2YWx1ZSwKKyAgICAgICAgX19zYWZlX211bHRpcGx5PF9SMjo6bnVtLCAoX1IxOjpkZW4gLyBfX2djZCk+Ojp2YWx1ZT46OnZhbHVlOworCisgICAgICAvLyBUaGUgbmV3IG51bWVyYXRvciBtYXkgaGF2ZSBjb21tb24gZmFjdG9ycyB3aXRoIHRoZSBkZW5vbWluYXRvciwKKyAgICAgIC8vIGJ1dCB0aGV5IGhhdmUgdG8gYWxzbyBiZSBmYWN0b3JzIG9mIF9fZ2NkLgorICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBfX2djZDIgPSBfX3N0YXRpY19nY2Q8X19uLCBfX2djZD46OnZhbHVlOworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiByYXRpbzxfX24gLyBfX2djZDIsCisgICAgICAgIF9fc2FmZV9tdWx0aXBseTxfUjE6OmRlbiAvIF9fZ2NkMiwgX1IyOjpkZW4gLyBfX2djZD46OnZhbHVlPiB0eXBlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IG51bSA9IHR5cGU6Om51bTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgZGVuID0gdHlwZTo6ZGVuOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IHJhdGlvX2FkZDxfUjEsIF9SMj46Om51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW9fYWRkPF9SMSwgX1IyPjo6ZGVuOworCisgIC8vLyByYXRpb19zdWJ0cmFjdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgcmF0aW9fc3VidHJhY3QKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJhdGlvX2FkZDwKKyAgICAgICAgX1IxLAorICAgICAgICByYXRpbzwtX1IyOjpudW0sIF9SMjo6ZGVuPj46OnR5cGUgdHlwZTsKKworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBudW0gPSB0eXBlOjpudW07CisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IGRlbiA9IHR5cGU6OmRlbjsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIGNvbnN0ZXhwciBpbnRtYXhfdCByYXRpb19zdWJ0cmFjdDxfUjEsIF9SMj46Om51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW9fc3VidHJhY3Q8X1IxLCBfUjI+OjpkZW47CisKKyAgLy8vIHJhdGlvX211bHRpcGx5CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCByYXRpb19tdWx0aXBseQorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgc3RhdGljIGNvbnN0IGludG1heF90IF9fZ2NkMSA9CisgICAgICAgIF9fc3RhdGljX2djZDxfUjE6Om51bSwgX1IyOjpkZW4+Ojp2YWx1ZTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnRtYXhfdCBfX2djZDIgPQorICAgICAgICBfX3N0YXRpY19nY2Q8X1IyOjpudW0sIF9SMTo6ZGVuPjo6dmFsdWU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHJhdGlvPAorICAgICAgICBfX3NhZmVfbXVsdGlwbHk8KF9SMTo6bnVtIC8gX19nY2QxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfUjI6Om51bSAvIF9fZ2NkMik+Ojp2YWx1ZSwKKyAgICAgICAgX19zYWZlX211bHRpcGx5PChfUjE6OmRlbiAvIF9fZ2NkMiksCisgICAgICAgICAgICAgICAgICAgICAgICAoX1IyOjpkZW4gLyBfX2djZDEpPjo6dmFsdWU+IHR5cGU7CisKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgbnVtID0gdHlwZTo6bnVtOworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRtYXhfdCBkZW4gPSB0eXBlOjpkZW47CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW9fbXVsdGlwbHk8X1IxLCBfUjI+OjpudW07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IHJhdGlvX211bHRpcGx5PF9SMSwgX1IyPjo6ZGVuOworCisgIC8vLyByYXRpb19kaXZpZGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2RpdmlkZQorICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoX1IyOjpudW0gIT0gMCwgImRpdmlzaW9uIGJ5IDAiKTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByYXRpb19tdWx0aXBseTwKKyAgICAgICAgX1IxLAorICAgICAgICByYXRpbzxfUjI6OmRlbiwgX1IyOjpudW0+Pjo6dHlwZSB0eXBlOworCisgICAgICBzdGF0aWMgY29uc3RleHByIGludG1heF90IG51bSA9IHR5cGU6Om51bTsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50bWF4X3QgZGVuID0gdHlwZTo6ZGVuOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgY29uc3RleHByIGludG1heF90IHJhdGlvX2RpdmlkZTxfUjEsIF9SMj46Om51bTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBjb25zdGV4cHIgaW50bWF4X3QgcmF0aW9fZGl2aWRlPF9SMSwgX1IyPjo6ZGVuOworCisgIC8vLyByYXRpb19lcXVhbAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgcmF0aW9fZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9SMTo6bnVtID09IF9SMjo6bnVtICYmIF9SMTo6ZGVuID09IF9SMjo6ZGVuPgorICAgIHsgfTsKKyAgCisgIC8vLyByYXRpb19ub3RfZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX25vdF9lcXVhbAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIXJhdGlvX2VxdWFsPF9SMSwgX1IyPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vIDAgPD0gX1JpIDwgMQorICAvLyBJZiBvbmUgaXMgMCwgY29uY2x1ZGUKKyAgLy8gT3RoZXJ3aXNlLCB4IDwgeSBpZmYgMS95IDwgMS94CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCBfX3JhdGlvX2xlc3NfaW1wbF8yOworCisgIC8vIF9SaSA+IDAKKyAgLy8gQ29tcGFyZSB0aGUgaW50ZWdyYWwgcGFydHMsIGFuZCByZW1vdmUgdGhlbSBpZiB0aGV5IGFyZSBlcXVhbAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMiwgaW50bWF4X3QgX19xMSA9IF9SMTo6bnVtIC8gX1IxOjpkZW4sCisgICAgICAgICAgIGludG1heF90IF9fcTIgPSBfUjI6Om51bSAvIF9SMjo6ZGVuLCBib29sIF9fZXEgPSAoX19xMSA9PSBfX3EyKT4KKyAgICBzdHJ1Y3QgX19yYXRpb19sZXNzX2ltcGxfMQorICAgIDogX19yYXRpb19sZXNzX2ltcGxfMjxyYXRpbzxfUjE6Om51bSAlIF9SMTo6ZGVuLCBfUjE6OmRlbj4sCisgICAgICAgICAgIHJhdGlvPF9SMjo6bnVtICUgX1IyOjpkZW4sIF9SMjo6ZGVuPiA+Ojp0eXBlCisgICAgeyB9OyAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMiwgaW50bWF4X3QgX19xMSwgaW50bWF4X3QgX19xMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19sZXNzX2ltcGxfMTxfUjEsIF9SMiwgX19xMSwgX19xMiwgZmFsc2U+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19xMSA8IF9fcTIpID4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsXzIKKyAgICA6IF9fcmF0aW9fbGVzc19pbXBsXzE8cmF0aW88X1IyOjpkZW4sIF9SMjo6bnVtPiwKKyAgICAgICAgICAgcmF0aW88X1IxOjpkZW4sIF9SMTo6bnVtPiA+Ojp0eXBlCisgICAgeyB9OyAKKworICB0ZW1wbGF0ZTxpbnRtYXhfdCBfX2QxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsXzI8cmF0aW88MCwgX19kMT4sIF9SMj4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIHRydWU+CisgICAgeyB9OyAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIGludG1heF90IF9fZDI+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsXzI8X1IxLCByYXRpbzwwLCBfX2QyPiA+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBmYWxzZT4KKyAgICB7IH07IAorCisgIHRlbXBsYXRlPGludG1heF90IF9fZDEsIGludG1heF90IF9fZDI+CisgICAgc3RydWN0IF9fcmF0aW9fbGVzc19pbXBsXzI8cmF0aW88MCwgX19kMT4sIHJhdGlvPDAsIF9fZDI+ID4KKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIGZhbHNlPgorICAgIHsgfTsgCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjIsCisJICAgYm9vbCA9IChfUjE6Om51bSA9PSAwIHx8IF9SMjo6bnVtID09IDAKKwkJICAgfHwgKF9fc3RhdGljX3NpZ248X1IxOjpudW0+Ojp2YWx1ZQorCQkgICAgICAgIT0gX19zdGF0aWNfc2lnbjxfUjI6Om51bT46OnZhbHVlKSksCisJICAgYm9vbCA9IChfX3N0YXRpY19zaWduPF9SMTo6bnVtPjo6dmFsdWUgPT0gLTEKKwkJICAgJiYgX19zdGF0aWNfc2lnbjxfUjI6Om51bT46OnZhbHVlID09IC0xKT4KKyAgICBzdHJ1Y3QgX19yYXRpb19sZXNzX2ltcGwKKyAgICA6IF9fcmF0aW9fbGVzc19pbXBsXzE8X1IxLCBfUjI+Ojp0eXBlCisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SMSwgdHlwZW5hbWUgX1IyPgorICAgIHN0cnVjdCBfX3JhdGlvX2xlc3NfaW1wbDxfUjEsIF9SMiwgdHJ1ZSwgZmFsc2U+CisgICAgOiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfUjE6Om51bSA8IF9SMjo6bnVtPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUjEsIHR5cGVuYW1lIF9SMj4KKyAgICBzdHJ1Y3QgX19yYXRpb19sZXNzX2ltcGw8X1IxLCBfUjIsIGZhbHNlLCB0cnVlPgorICAgIDogX19yYXRpb19sZXNzX2ltcGxfMTxyYXRpbzwtX1IyOjpudW0sIF9SMjo6ZGVuPiwKKyAgICAgICAgICAgcmF0aW88LV9SMTo6bnVtLCBfUjE6OmRlbj4gPjo6dHlwZQorICAgIHsgfTsKKworICAvLy8gcmF0aW9fbGVzcworICAvLyB1c2luZyBhIGNvbnRpbnVlZCBmcmFjdGlvbiBleHBhbnNpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2xlc3MKKyAgICA6IF9fcmF0aW9fbGVzc19pbXBsPF9SMSwgX1IyPjo6dHlwZQorICAgIHsgfTsKKyAgICAKKyAgLy8vIHJhdGlvX2xlc3NfZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2xlc3NfZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsICFyYXRpb19sZXNzPF9SMiwgX1IxPjo6dmFsdWU+CisgICAgeyB9OworICAKKyAgLy8vIHJhdGlvX2dyZWF0ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2dyZWF0ZXIKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsIHJhdGlvX2xlc3M8X1IyLCBfUjE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8vIHJhdGlvX2dyZWF0ZXJfZXF1YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1IxLCB0eXBlbmFtZSBfUjI+CisgICAgc3RydWN0IHJhdGlvX2dyZWF0ZXJfZXF1YWwKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsICFyYXRpb19sZXNzPF9SMSwgX1IyPjo6dmFsdWU+CisgICAgeyB9OworCisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMD4gYXR0bzsKKyAgdHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwPiBmZW10bzsKKyAgdHlwZWRlZiByYXRpbzwxLCAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwPiBwaWNvOworICB0eXBlZGVmIHJhdGlvPDEsICAgICAgICAgICAgICAgIDEwMDAwMDAwMDA+IG5hbm87CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgMTAwMDAwMD4gbWljcm87CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgMTAwMD4gbWlsbGk7CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgIDEwMD4gY2VudGk7CisgIHR5cGVkZWYgcmF0aW88MSwgICAgICAgICAgICAgICAgICAgICAgICAxMD4gZGVjaTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAgICAgICAgIDEwLCAxPiBkZWNhOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgICAgICAxMDAsIDE+IGhlY3RvOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDE+IGtpbG87CisgIHR5cGVkZWYgcmF0aW88ICAgICAgICAgICAgICAgICAgMTAwMDAwMCwgMT4gbWVnYTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAgICAgICAgICAxMDAwMDAwMDAwLCAxPiBnaWdhOworICB0eXBlZGVmIHJhdGlvPCAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAsIDE+IHRlcmE7CisgIHR5cGVkZWYgcmF0aW88ICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMCwgMT4gcGV0YTsKKyAgdHlwZWRlZiByYXRpbzwgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwLCAxPiBleGE7CisKKyAgLy8gQH0gZ3JvdXAgcmF0aW8KK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vX0dMSUJDWFhfVVNFX0M5OV9TVERJTlRfVFIxCisKKyNlbmRpZiAvL19fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvL19HTElCQ1hYX1JBVElPCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3JlZ2V4IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9yZWdleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJiODQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9yZWdleApAQCAtMCwwICsxLDY2IEBACisvLyA8cmVnZXg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9yZWdleAorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9SRUdFWAorI2RlZmluZSBfR0xJQkNYWF9SRUdFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8aW9zZndkPgorI2VuZGlmCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X2NvbnN0YW50cy5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfZXJyb3IuaD4KKyNpbmNsdWRlIDxiaXRzL3JlZ2V4X2N1cnNvci5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfbmZhLmg+CisjaW5jbHVkZSA8Yml0cy9yZWdleF9jb21waWxlci5oPgorI2luY2x1ZGUgPGJpdHMvcmVnZXhfZ3JlcF9tYXRjaGVyLmg+CisjaW5jbHVkZSA8Yml0cy9yZWdleC5oPgorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX1JFR0VYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3NldCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmNiYWEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3NldApAQCAtMCwwICsxLDczIEBACisvLyA8c2V0PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvc2V0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1NFVAorI2RlZmluZSBfR0xJQkNYWF9TRVQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF90cmVlLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfc2V0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfbXVsdGlzZXQuaD4KKyNpbmNsdWRlIDxiaXRzL3JhbmdlX2FjY2Vzcy5oPgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvc2V0PgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvc2V0PgorI2VuZGlmCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TRVQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3N0cmVhbSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3N0cmVhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI4NjJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9zc3RyZWFtCkBAIC0wLDAgKzEsNTgyIEBACisvLyBTdHJpbmcgYmFzZWQgc3RyZWFtcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3NzdHJlYW0KKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy43ICBTdHJpbmctYmFzZWQgc3RyZWFtcworLy8KKworI2lmbmRlZiBfR0xJQkNYWF9TU1RSRUFNCisjZGVmaW5lIF9HTElCQ1hYX1NTVFJFQU0gMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxpc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBbMjcuNy4xXSB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19zdHJpbmdidWYKKyAgLyoqCisgICAqICBAYnJpZWYgIFRoZSBhY3R1YWwgd29yayBvZiBpbnB1dCBhbmQgb3V0cHV0IChmb3Igc3RkOjpzdHJpbmcpLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIFRoaXMgY2xhc3MgYXNzb2NpYXRlcyBlaXRoZXIgb3IgYm90aCBvZiBpdHMgaW5wdXQgYW5kIG91dHB1dCBzZXF1ZW5jZXMKKyAgICogIHdpdGggYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCB3aGljaCBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSwgb3IgbWFkZQorICAgKiAgYXZhaWxhYmxlIGFzLCBhIEBjIHN0ZDo6YmFzaWNfc3RyaW5nLiAgKFBhcmFwaHJhc2VkIGZyb20gWzI3LjcuMV0vMS4pCisgICAqCisgICAqICBGb3IgdGhpcyBjbGFzcywgb3BlbiBtb2RlcyAob2YgdHlwZSBAYyBpb3NfYmFzZTo6b3Blbm1vZGUpIGhhdmUKKyAgICogIEBjIGluIHNldCBpZiB0aGUgaW5wdXQgc2VxdWVuY2UgY2FuIGJlIHJlYWQsIGFuZCBAYyBvdXQgc2V0IGlmIHRoZQorICAgKiAgb3V0cHV0IHNlcXVlbmNlIGNhbiBiZSB3cml0dGVuLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiYXNpY19zdHJpbmdidWYgOiBwdWJsaWMgYmFzaWNfc3RyZWFtYnVmPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUxLiBiYXNpY19zdHJpbmdidWYgbWlzc2luZyBhbGxvY2F0b3JfdHlwZQorICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJICAgICAgIAlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKworICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gIAlfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8Y2hhcl90eXBlLCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3N0cmluZ190eXBlOjpzaXplX3R5cGUJCV9fc2l6ZV90eXBlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgLy8vIFBsYWNlIHRvIHN0YXNoIGluIHx8IG91dCB8fCBpbiB8IG91dCBzZXR0aW5ncyBmb3IgY3VycmVudCBzdHJpbmdidWYuCisgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgCV9NX21vZGU7CisKKyAgICAgIC8vIERhdGEgTWVtYmVyczoKKyAgICAgIF9fc3RyaW5nX3R5cGUgCQlfTV9zdHJpbmc7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFN0YXJ0cyB3aXRoIGFuIGVtcHR5IHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBtb2RlICBXaGV0aGVyIHRoZSBidWZmZXIgY2FuIHJlYWQsIG9yIHdyaXRlLCBvciBib3RoLgorICAgICAgICoKKyAgICAgICAqICBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgcGFyZW50IGNsYXNzIHVzaW5nIGl0cworICAgICAgICogIG93biBkZWZhdWx0IGN0b3IuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3N0cmluZ2J1Zihpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19zdHJlYW1idWZfdHlwZSgpLCBfTV9tb2RlKF9fbW9kZSksIF9NX3N0cmluZygpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyB0aGUgcGFyZW50IGNsYXNzIHVzaW5nIGl0cworICAgICAgICogIG93biBkZWZhdWx0IGN0b3IuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3N0cmluZ2J1Zihjb25zdCBfX3N0cmluZ190eXBlJiBfX3N0ciwKKwkJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICA6IF9fc3RyZWFtYnVmX3R5cGUoKSwgX01fbW9kZSgpLCBfTV9zdHJpbmcoX19zdHIuZGF0YSgpLCBfX3N0ci5zaXplKCkpCisgICAgICB7IF9NX3N0cmluZ2J1Zl9pbml0KF9fbW9kZSk7IH0KKworICAgICAgLy8gR2V0IGFuZCBzZXQ6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHlpbmcgb3V0IHRoZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIEEgY29weSBvZiBvbmUgb2YgdGhlIHVuZGVybHlpbmcgc2VxdWVuY2VzLgorICAgICAgICoKKyAgICAgICAqICA8ZW0+SWYgdGhlIGJ1ZmZlciBpcyBvbmx5IGNyZWF0ZWQgaW4gaW5wdXQgbW9kZSwgdGhlIHVuZGVybHlpbmcKKyAgICAgICAqICBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgZXF1YWwgdG8gdGhlIGlucHV0IHNlcXVlbmNlOyBvdGhlcndpc2UsIGl0CisgICAgICAgKiAgaXMgZXF1YWwgdG8gdGhlIG91dHB1dCBzZXF1ZW5jZS48L2VtPiBbMjcuNy4xLjJdLzEKKyAgICAgICovCisgICAgICBfX3N0cmluZ190eXBlCisgICAgICBzdHIoKSBjb25zdAorICAgICAgeworCV9fc3RyaW5nX3R5cGUgX19yZXQ7CisJaWYgKHRoaXMtPnBwdHIoKSkKKwkgIHsKKwkgICAgLy8gVGhlIGN1cnJlbnQgZWdwdHIoKSBtYXkgbm90IGJlIHRoZSBhY3R1YWwgc3RyaW5nIGVuZC4KKwkgICAgaWYgKHRoaXMtPnBwdHIoKSA+IHRoaXMtPmVncHRyKCkpCisJICAgICAgX19yZXQgPSBfX3N0cmluZ190eXBlKHRoaXMtPnBiYXNlKCksIHRoaXMtPnBwdHIoKSk7CisJICAgIGVsc2UKKyAJICAgICAgX19yZXQgPSBfX3N0cmluZ190eXBlKHRoaXMtPnBiYXNlKCksIHRoaXMtPmVncHRyKCkpOworCSAgfQorCWVsc2UKKwkgIF9fcmV0ID0gX01fc3RyaW5nOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXR0aW5nIGEgbmV3IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIHMgIFRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3IHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBEZWFsbG9jYXRlcyBhbnkgcHJldmlvdXMgc3RvcmVkIHNlcXVlbmNlLCB0aGVuIGNvcGllcyBAYSBzIHRvCisgICAgICAgKiAgdXNlIGFzIGEgbmV3IG9uZS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzdHIoY29uc3QgX19zdHJpbmdfdHlwZSYgX19zKQorICAgICAgeworCS8vIENhbm5vdCB1c2UgX01fc3RyaW5nID0gX19zLCBzaW5jZSB2MyBzdHJpbmdzIGFyZSBDT1cuCisJX01fc3RyaW5nLmFzc2lnbihfX3MuZGF0YSgpLCBfX3Muc2l6ZSgpKTsKKwlfTV9zdHJpbmdidWZfaW5pdChfTV9tb2RlKTsKKyAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8vIENvbW1vbiBpbml0aWFsaXphdGlvbiBjb2RlIGdvZXMgaGVyZS4KKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0cmluZ2J1Zl9pbml0KGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpCisgICAgICB7CisJX01fbW9kZSA9IF9fbW9kZTsKKwlfX3NpemVfdHlwZSBfX2xlbiA9IDA7CisJaWYgKF9NX21vZGUgJiAoaW9zX2Jhc2U6OmF0ZSB8IGlvc19iYXNlOjphcHApKQorCSAgX19sZW4gPSBfTV9zdHJpbmcuc2l6ZSgpOworCV9NX3N5bmMoY29uc3RfY2FzdDxjaGFyX3R5cGUqPihfTV9zdHJpbmcuZGF0YSgpKSwgMCwgX19sZW4pOworICAgICAgfQorCisgICAgICB2aXJ0dWFsIHN0cmVhbXNpemUKKyAgICAgIHNob3dtYW55YygpCisgICAgICB7IAorCXN0cmVhbXNpemUgX19yZXQgPSAtMTsKKwlpZiAoX01fbW9kZSAmIGlvc19iYXNlOjppbikKKwkgIHsKKwkgICAgX01fdXBkYXRlX2VncHRyKCk7CisJICAgIF9fcmV0ID0gdGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKTsKKwkgIH0KKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIHZpcnR1YWwgaW50X3R5cGUKKyAgICAgIHVuZGVyZmxvdygpOworCisgICAgICB2aXJ0dWFsIGludF90eXBlCisgICAgICBwYmFja2ZhaWwoaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworICAgICAgdmlydHVhbCBpbnRfdHlwZQorICAgICAgb3ZlcmZsb3coaW50X3R5cGUgX19jID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNYW5pcHVsYXRlcyB0aGUgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgcyAgUG9pbnRlciB0byBhIGJ1ZmZlciBhcmVhLgorICAgICAgICogIEBwYXJhbSAgbiAgU2l6ZSBvZiBAYSBzLgorICAgICAgICogIEByZXR1cm4gIEBjIHRoaXMKKyAgICAgICAqCisgICAgICAgKiAgSWYgbm8gYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kIGJvdGggQGEgcyBhbmQgQGEgbiBhcmUKKyAgICAgICAqICBub24temVybywgdGhlbiBAYyBzIGlzIHVzZWQgYXMgYSBidWZmZXI7IHNlZQorICAgICAgICogIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9tYW51YWwvYmswMXB0MTFjaDI1czAyLmh0bWwKKyAgICAgICAqICBmb3IgbW9yZS4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIF9fc3RyZWFtYnVmX3R5cGUqCisgICAgICBzZXRidWYoY2hhcl90eXBlKiBfX3MsIHN0cmVhbXNpemUgX19uKQorICAgICAgeworCWlmIChfX3MgJiYgX19uID49IDApCisJICB7CisJICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBiZWhhdmlvciwgYW5kIGFzc3VtZXMKKwkgICAgLy8gdGhhdCBhbiBleHRlcm5hbCBjaGFyX3R5cGUgYXJyYXkgb2YgbGVuZ3RoIF9fbiBleGlzdHMKKwkgICAgLy8gYW5kIGhhcyBiZWVuIHByZS1hbGxvY2F0ZWQuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLAorCSAgICAvLyB0aGluZ3Mgd2lsbCBxdWlja2x5IGJsb3cgdXAuCisJICAgIAorCSAgICAvLyBTdGVwIDE6IERlc3Ryb3kgdGhlIGN1cnJlbnQgaW50ZXJuYWwgYXJyYXkuCisJICAgIF9NX3N0cmluZy5jbGVhcigpOworCSAgICAKKwkgICAgLy8gU3RlcCAyOiBVc2UgdGhlIGV4dGVybmFsIGFycmF5LgorCSAgICBfTV9zeW5jKF9fcywgX19uLCAwKTsKKwkgIH0KKwlyZXR1cm4gdGhpczsKKyAgICAgIH0KKworICAgICAgdmlydHVhbCBwb3NfdHlwZQorICAgICAgc2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgICB2aXJ0dWFsIHBvc190eXBlCisgICAgICBzZWVrcG9zKHBvc190eXBlIF9fc3AsCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOworCisgICAgICAvLyBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgY29ycmVjdGx5IHVwZGF0aW5nIHRoZSBpbnRlcm5hbCBidWZmZXIKKyAgICAgIC8vIGZvciBhIHBhcnRpY3VsYXIgX01fc3RyaW5nLCBkdWUgdG8gaW5pdGlhbGl6YXRpb24gb3IgcmUtc2l6aW5nCisgICAgICAvLyBvZiBhbiBleGlzdGluZyBfTV9zdHJpbmcuCisgICAgICB2b2lkCisgICAgICBfTV9zeW5jKGNoYXJfdHlwZSogX19iYXNlLCBfX3NpemVfdHlwZSBfX2ksIF9fc2l6ZV90eXBlIF9fbyk7CisKKyAgICAgIC8vIEludGVybmFsIGZ1bmN0aW9uIGZvciBjb3JyZWN0bHkgdXBkYXRpbmcgZWdwdHIoKSB0byB0aGUgYWN0dWFsCisgICAgICAvLyBzdHJpbmcgZW5kLgorICAgICAgdm9pZAorICAgICAgX01fdXBkYXRlX2VncHRyKCkKKyAgICAgIHsKKwljb25zdCBib29sIF9fdGVzdGluID0gX01fbW9kZSAmIGlvc19iYXNlOjppbjsKKwlpZiAodGhpcy0+cHB0cigpICYmIHRoaXMtPnBwdHIoKSA+IHRoaXMtPmVncHRyKCkpCisJICB7CisJICAgIGlmIChfX3Rlc3RpbikKKwkgICAgICB0aGlzLT5zZXRnKHRoaXMtPmViYWNrKCksIHRoaXMtPmdwdHIoKSwgdGhpcy0+cHB0cigpKTsKKwkgICAgZWxzZQorCSAgICAgIHRoaXMtPnNldGcodGhpcy0+cHB0cigpLCB0aGlzLT5wcHRyKCksIHRoaXMtPnBwdHIoKSk7CisJICB9CisgICAgICB9CisKKyAgICAgIC8vIFdvcmtzIGFyb3VuZCB0aGUgaXNzdWUgd2l0aCBwYnVtcCwgcGFydCBvZiB0aGUgcHJvdGVjdGVkCisgICAgICAvLyBpbnRlcmZhY2Ugb2YgYmFzaWNfc3RyZWFtYnVmLCB0YWtpbmcganVzdCBhbiBpbnQuCisgICAgICB2b2lkCisgICAgICBfTV9wYnVtcChjaGFyX3R5cGUqIF9fcGJlZywgY2hhcl90eXBlKiBfX3BlbmQsIG9mZl90eXBlIF9fb2ZmKTsKKyAgICB9OworCisKKyAgLy8gWzI3LjcuMl0gVGVtcGxhdGUgY2xhc3MgYmFzaWNfaXN0cmluZ3N0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQgZm9yIHN0ZDo6c3RyaW5nLgorICAgKiAgQGluZ3JvdXAgaW8KKyAgICoKKyAgICogIFRoaXMgY2xhc3Mgc3VwcG9ydHMgcmVhZGluZyBmcm9tIG9iamVjdHMgb2YgdHlwZSBzdGQ6OmJhc2ljX3N0cmluZywKKyAgICogIHVzaW5nIHRoZSBpbmhlcml0ZWQgZnVuY3Rpb25zIGZyb20gc3RkOjpiYXNpY19pc3RyZWFtLiAgVG8gY29udHJvbAorICAgKiAgdGhlIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlIG9mIHN0ZDo6YmFzaWNfc3RyaW5nYnVmIGlzIHVzZWQsCisgICAqICB3aGljaCB0aGlzIHBhZ2UgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiYXNpY19pc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTEuIGJhc2ljX3N0cmluZ2J1ZiBtaXNzaW5nIGFsbG9jYXRvcl90eXBlCisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkgICAgICAgCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX2lzdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JX19pc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdHJpbmdidWZfdHlwZQlfTV9zdHJpbmdidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIERlZmF1bHQgY29uc3RydWN0b3Igc3RhcnRzIHdpdGggYW4gZW1wdHkgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIG1vZGUgIFdoZXRoZXIgdGhlIGJ1ZmZlciBjYW4gcmVhZCwgb3Igd3JpdGUsIG9yIGJvdGguCisgICAgICAgKgorICAgICAgICogIEBjIGlvc19iYXNlOjppbiBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIEBjIG1vZGV8aW4sIGFuZCBwYXNzZXMgQGMgJnNiIHRvIHRoZSBiYXNlCisgICAgICAgKiAgY2xhc3MgaW5pdGlhbGl6ZXIuICBEb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pc3RyaW5nc3RyZWFtKGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faXN0cmVhbV90eXBlKCksIF9NX3N0cmluZ2J1ZihfX21vZGUgfCBpb3NfYmFzZTo6aW4pCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6OmluIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gQGEgbW9kZS4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgQGEgc3RyIGFuZCBAYyBtb2RlfGluLCBhbmQgcGFzc2VzIEBjICZzYgorICAgICAgICogIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19pc3RyaW5nc3RyZWFtKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fc3RyLAorCQkJICBpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6OmluKQorICAgICAgOiBfX2lzdHJlYW1fdHlwZSgpLCBfTV9zdHJpbmdidWYoX19zdHIsIF9fbW9kZSB8IGlvc19iYXNlOjppbikKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZCBieSB0aGUgc3RyaW5nYnVmIG9iamVjdCwgbm90IHRoZQorICAgICAgICogIGZvcm1hdHRpbmcgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIH5iYXNpY19pc3RyaW5nc3RyZWFtKCkKKyAgICAgIHsgfQorCisgICAgICAvLyBNZW1iZXJzOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3NpbmcgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIFRoZSBjdXJyZW50IGJhc2ljX3N0cmluZ2J1ZiBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoaXMgaGlkZXMgYm90aCBzaWduYXR1cmVzIG9mIHN0ZDo6YmFzaWNfaW9zOjpyZGJ1ZigpLgorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nYnVmX3R5cGUqCisgICAgICByZGJ1ZigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9jYXN0PF9fc3RyaW5nYnVmX3R5cGUqPigmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvcHlpbmcgb3V0IHRoZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEByZXR1cm4gIEBjIHJkYnVmKCktPnN0cigpCisgICAgICAqLworICAgICAgX19zdHJpbmdfdHlwZQorICAgICAgc3RyKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N0cmluZ2J1Zi5zdHIoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFNldHRpbmcgYSBuZXcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIHN0cmluZyB0byB1c2UgYXMgYSBuZXcgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHJkYnVmKCktPnN0cihzKS4KKyAgICAgICovCisgICAgICB2b2lkCisgICAgICBzdHIoY29uc3QgX19zdHJpbmdfdHlwZSYgX19zKQorICAgICAgeyBfTV9zdHJpbmdidWYuc3RyKF9fcyk7IH0KKyAgICB9OworCisKKyAgLy8gWzI3LjcuM10gVGVtcGxhdGUgY2xhc3MgYmFzaWNfb3N0cmluZ3N0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgb3V0cHV0IGZvciBzdGQ6OnN0cmluZy4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBUaGlzIGNsYXNzIHN1cHBvcnRzIHdyaXRpbmcgdG8gb2JqZWN0cyBvZiB0eXBlIHN0ZDo6YmFzaWNfc3RyaW5nLAorICAgKiAgdXNpbmcgdGhlIGluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbSBzdGQ6OmJhc2ljX29zdHJlYW0uICBUbyBjb250cm9sCisgICAqICB0aGUgYXNzb2NpYXRlZCBzZXF1ZW5jZSwgYW4gaW5zdGFuY2Ugb2Ygc3RkOjpiYXNpY19zdHJpbmdidWYgaXMgdXNlZCwKKyAgICogIHdoaWNoIHRoaXMgcGFnZSByZWZlcnMgdG8gYXMgQGMgc2IuCisgICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHMsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICBjbGFzcyBiYXNpY19vc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyBUeXBlczoKKyAgICAgIHR5cGVkZWYgX0NoYXJUIAkJCQkJY2hhcl90eXBlOworICAgICAgdHlwZWRlZiBfVHJhaXRzIAkJCQkJdHJhaXRzX3R5cGU7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyAyNTEuIGJhc2ljX3N0cmluZ2J1ZiBtaXNzaW5nIGFsbG9jYXRvcl90eXBlCisgICAgICB0eXBlZGVmIF9BbGxvYwkJCQkgICAgICAgCWFsbG9jYXRvcl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworCisgICAgICAvLyBOb24tc3RhbmRhcmQgdHlwZXM6CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZzxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX3N0cmluZ2J1ZjxfQ2hhclQsIF9UcmFpdHMsIF9BbGxvYz4gCV9fc3RyaW5nYnVmX3R5cGU7CisgICAgICB0eXBlZGVmIGJhc2ljX29zdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4JX19vc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdHJpbmdidWZfdHlwZQlfTV9zdHJpbmdidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcjoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBzdGFydHMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6Om91dCBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIEBjIG1vZGV8b3V0LCBhbmQgcGFzc2VzIEBjICZzYiB0byB0aGUgYmFzZQorICAgICAgICogIGNsYXNzIGluaXRpYWxpemVyLiAgRG9lcyBub3QgYWxsb2NhdGUgYW55IGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhhdCdzIGEgbGllLiAgV2UgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyB3aXRoIE5VTEwsIGJlY2F1c2UgdGhlCisgICAgICAgKiAgc3RyaW5nIGNsYXNzIGRvZXMgaXRzIG93biBtZW1vcnkgbWFuYWdlbWVudC4KKyAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgYmFzaWNfb3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tb2RlID0gaW9zX2Jhc2U6Om91dCkKKyAgICAgIDogX19vc3RyZWFtX3R5cGUoKSwgX01fc3RyaW5nYnVmKF9fbW9kZSB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgQGMgaW9zX2Jhc2U6Om91dCBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIEBhIG1vZGUuCisgICAgICAgKgorICAgICAgICogIEluaXRpYWxpemVzIEBjIHNiIHVzaW5nIEBhIHN0ciBhbmQgQGMgbW9kZXxvdXQsIGFuZCBwYXNzZXMgQGMgJnNiCisgICAgICAgKiAgdG8gdGhlIGJhc2UgY2xhc3MgaW5pdGlhbGl6ZXIuCisgICAgICAgKgorICAgICAgICogIFRoYXQncyBhIGxpZS4gIFdlIGluaXRpYWxpemUgdGhlIGJhc2UgY2xhc3Mgd2l0aCBOVUxMLCBiZWNhdXNlIHRoZQorICAgICAgICogIHN0cmluZyBjbGFzcyBkb2VzIGl0cyBvd24gbWVtb3J5IG1hbmFnZW1lbnQuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX29zdHJpbmdzdHJlYW0oY29uc3QgX19zdHJpbmdfdHlwZSYgX19zdHIsCisJCQkgIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KQorICAgICAgOiBfX29zdHJlYW1fdHlwZSgpLCBfTV9zdHJpbmdidWYoX19zdHIsIF9fbW9kZSB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUaGUgZGVzdHJ1Y3RvciBkb2VzIG5vdGhpbmcuCisgICAgICAgKgorICAgICAgICogIFRoZSBidWZmZXIgaXMgZGVhbGxvY2F0ZWQgYnkgdGhlIHN0cmluZ2J1ZiBvYmplY3QsIG5vdCB0aGUKKyAgICAgICAqICBmb3JtYXR0aW5nIHN0cmVhbS4KKyAgICAgICovCisgICAgICB+YmFzaWNfb3N0cmluZ3N0cmVhbSgpCisgICAgICB7IH0KKworICAgICAgLy8gTWVtYmVyczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzaW5nIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBiYXNpY19zdHJpbmdidWYgYnVmZmVyLgorICAgICAgICoKKyAgICAgICAqICBUaGlzIGhpZGVzIGJvdGggc2lnbmF0dXJlcyBvZiBzdGQ6OmJhc2ljX2lvczo6cmRidWYoKS4KKyAgICAgICovCisgICAgICBfX3N0cmluZ2J1Zl90eXBlKgorICAgICAgcmRidWYoKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfY2FzdDxfX3N0cmluZ2J1Zl90eXBlKj4oJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBDb3B5aW5nIG91dCB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAqICBAcmV0dXJuICBAYyByZGJ1ZigpLT5zdHIoKQorICAgICAgKi8KKyAgICAgIF9fc3RyaW5nX3R5cGUKKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9zdHJpbmdidWYuc3RyKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXR0aW5nIGEgbmV3IGJ1ZmZlci4KKyAgICAgICAqICBAcGFyYW0gIHMgIFRoZSBzdHJpbmcgdG8gdXNlIGFzIGEgbmV3IHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqICBDYWxscyBAYyByZGJ1ZigpLT5zdHIocykuCisgICAgICAqLworICAgICAgdm9pZAorICAgICAgc3RyKGNvbnN0IF9fc3RyaW5nX3R5cGUmIF9fcykKKyAgICAgIHsgX01fc3RyaW5nYnVmLnN0cihfX3MpOyB9CisgICAgfTsKKworCisgIC8vIFsyNy43LjRdIFRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZ3N0cmVhbQorICAvKioKKyAgICogIEBicmllZiAgQ29udHJvbGxpbmcgaW5wdXQgYW5kIG91dHB1dCBmb3Igc3RkOjpzdHJpbmcuCisgICAqICBAaW5ncm91cCBpbworICAgKgorICAgKiAgVGhpcyBjbGFzcyBzdXBwb3J0cyByZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gb2JqZWN0cyBvZiB0eXBlCisgICAqICBzdGQ6OmJhc2ljX3N0cmluZywgdXNpbmcgdGhlIGluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbQorICAgKiAgc3RkOjpiYXNpY19pb3N0cmVhbS4gIFRvIGNvbnRyb2wgdGhlIGFzc29jaWF0ZWQgc2VxdWVuY2UsIGFuIGluc3RhbmNlCisgICAqICBvZiBzdGQ6OmJhc2ljX3N0cmluZ2J1ZiBpcyB1c2VkLCB3aGljaCB0aGlzIHBhZ2UgcmVmZXJzIHRvIGFzIEBjIHNiLgorICAqLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzLCB0eXBlbmFtZSBfQWxsb2M+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nc3RyZWFtIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gVHlwZXM6CisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMjUxLiBiYXNpY19zdHJpbmdidWYgbWlzc2luZyBhbGxvY2F0b3JfdHlwZQorICAgICAgdHlwZWRlZiBfQWxsb2MJCQkJICAgICAgIAlhbGxvY2F0b3JfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OmludF90eXBlIAkJaW50X3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpwb3NfdHlwZSAJCXBvc190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6b2ZmX3R5cGUgCQlvZmZfdHlwZTsKKworICAgICAgLy8gTm9uLXN0YW5kYXJkIFR5cGVzOgorICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmc8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ190eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdidWY8X0NoYXJULCBfVHJhaXRzLCBfQWxsb2M+IAlfX3N0cmluZ2J1Zl90eXBlOworICAgICAgdHlwZWRlZiBiYXNpY19pb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPglfX2lvc3RyZWFtX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgX19zdHJpbmdidWZfdHlwZQlfTV9zdHJpbmdidWY7CisKKyAgICBwdWJsaWM6CisgICAgICAvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRGVmYXVsdCBjb25zdHJ1Y3RvciBzdGFydHMgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgQGMgbW9kZSwgYW5kIHBhc3NlcyBAYyAmc2IgdG8gdGhlIGJhc2UKKyAgICAgICAqICBjbGFzcyBpbml0aWFsaXplci4gIERvZXMgbm90IGFsbG9jYXRlIGFueSBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIFRoYXQncyBhIGxpZS4gIFdlIGluaXRpYWxpemUgdGhlIGJhc2UgY2xhc3Mgd2l0aCBOVUxMLCBiZWNhdXNlIHRoZQorICAgICAgICogIHN0cmluZyBjbGFzcyBkb2VzIGl0cyBvd24gbWVtb3J5IG1hbmFnZW1lbnQuCisgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3N0cmluZ3N0cmVhbShpb3NfYmFzZTo6b3Blbm1vZGUgX19tID0gaW9zX2Jhc2U6Om91dCB8IGlvc19iYXNlOjppbikKKyAgICAgIDogX19pb3N0cmVhbV90eXBlKCksIF9NX3N0cmluZ2J1ZihfX20pCisgICAgICB7IHRoaXMtPmluaXQoJl9NX3N0cmluZ2J1Zik7IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTdGFydHMgd2l0aCBhbiBleGlzdGluZyBzdHJpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgc3RyICBBIHN0cmluZyB0byBjb3B5IGFzIGEgc3RhcnRpbmcgYnVmZmVyLgorICAgICAgICogIEBwYXJhbSAgbW9kZSAgV2hldGhlciB0aGUgYnVmZmVyIGNhbiByZWFkLCBvciB3cml0ZSwgb3IgYm90aC4KKyAgICAgICAqCisgICAgICAgKiAgSW5pdGlhbGl6ZXMgQGMgc2IgdXNpbmcgQGEgc3RyIGFuZCBAYyBtb2RlLCBhbmQgcGFzc2VzIEBjICZzYgorICAgICAgICogIHRvIHRoZSBiYXNlIGNsYXNzIGluaXRpYWxpemVyLgorICAgICAgICoKKyAgICAgICAqICBUaGF0J3MgYSBsaWUuICBXZSBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzIHdpdGggTlVMTCwgYmVjYXVzZSB0aGUKKyAgICAgICAqICBzdHJpbmcgY2xhc3MgZG9lcyBpdHMgb3duIG1lbW9yeSBtYW5hZ2VtZW50LgorICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBiYXNpY19zdHJpbmdzdHJlYW0oY29uc3QgX19zdHJpbmdfdHlwZSYgX19zdHIsCisJCQkgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbSA9IGlvc19iYXNlOjpvdXQgfCBpb3NfYmFzZTo6aW4pCisgICAgICA6IF9faW9zdHJlYW1fdHlwZSgpLCBfTV9zdHJpbmdidWYoX19zdHIsIF9fbSkKKyAgICAgIHsgdGhpcy0+aW5pdCgmX01fc3RyaW5nYnVmKTsgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRoZSBkZXN0cnVjdG9yIGRvZXMgbm90aGluZy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZCBieSB0aGUgc3RyaW5nYnVmIG9iamVjdCwgbm90IHRoZQorICAgICAgICogIGZvcm1hdHRpbmcgc3RyZWFtLgorICAgICAgKi8KKyAgICAgIH5iYXNpY19zdHJpbmdzdHJlYW0oKQorICAgICAgeyB9CisKKyAgICAgIC8vIE1lbWJlcnM6CisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGN1cnJlbnQgYmFzaWNfc3RyaW5nYnVmIGJ1ZmZlci4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBoaWRlcyBib3RoIHNpZ25hdHVyZXMgb2Ygc3RkOjpiYXNpY19pb3M6OnJkYnVmKCkuCisgICAgICAqLworICAgICAgX19zdHJpbmdidWZfdHlwZSoKKyAgICAgIHJkYnVmKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8X19zdHJpbmdidWZfdHlwZSo+KCZfTV9zdHJpbmdidWYpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ29weWluZyBvdXQgdGhlIHN0cmluZyBidWZmZXIuCisgICAgICAgKiAgQHJldHVybiAgQGMgcmRidWYoKS0+c3RyKCkKKyAgICAgICovCisgICAgICBfX3N0cmluZ190eXBlCisgICAgICBzdHIoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc3RyaW5nYnVmLnN0cigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyBhIG5ldyBidWZmZXIuCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgc3RyaW5nIHRvIHVzZSBhcyBhIG5ldyBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgQGMgcmRidWYoKS0+c3RyKHMpLgorICAgICAgKi8KKyAgICAgIHZvaWQKKyAgICAgIHN0cihjb25zdCBfX3N0cmluZ190eXBlJiBfX3MpCisgICAgICB7IF9NX3N0cmluZ2J1Zi5zdHIoX19zKTsgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvc3N0cmVhbS50Y2M+CisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TU1RSRUFNICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3N0YWNrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9zdGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWUyYzcyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9zdGFjawpAQCAtMCwwICsxLDY0IEBACisvLyA8c3RhY2s+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQKKyAqIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsMTk5NworICogU2lsaWNvbiBHcmFwaGljcyBDb21wdXRlciBTeXN0ZW1zLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgKiBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQKKyAqIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyCisgKiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoqIEBmaWxlIGluY2x1ZGUvc3RhY2sKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfU1RBQ0sKKyNkZWZpbmUgX0dMSUJDWFhfU1RBQ0sgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9zdGFjay5oPgorCisjZW5kaWYgLyogX0dMSUJDWFhfU1RBQ0sgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3RkZXhjZXB0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9zdGRleGNlcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MTc5NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3RkZXhjZXB0CkBAIC0wLDAgKzEsMTU5IEBACisvLyBTdGFuZGFyZCBleGNlcHRpb24gY2xhc3NlcyAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDA1LCAyMDA3LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9zdGRleGNlcHQKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE5LjEgIEV4Y2VwdGlvbiBjbGFzc2VzCisvLworCisjaWZuZGVmIF9HTElCQ1hYX1NUREVYQ0VQVAorI2RlZmluZSBfR0xJQkNYWF9TVERFWENFUFQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxleGNlcHRpb24+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIGV4Y2VwdGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLyoqIExvZ2ljIGVycm9ycyByZXByZXNlbnQgcHJvYmxlbXMgaW4gdGhlIGludGVybmFsIGxvZ2ljIG9mIGEgcHJvZ3JhbTsKKyAgICogIGluIHRoZW9yeSwgdGhlc2UgYXJlIHByZXZlbnRhYmxlLCBhbmQgZXZlbiBkZXRlY3RhYmxlIGJlZm9yZSB0aGUKKyAgICogIHByb2dyYW0gcnVucyAoZS5nLiwgdmlvbGF0aW9ucyBvZiBjbGFzcyBpbnZhcmlhbnRzKS4KKyAgICogIEBicmllZiBPbmUgb2YgdHdvIHN1YmNsYXNzZXMgb2YgZXhjZXB0aW9uLgorICAgKi8KKyAgY2xhc3MgbG9naWNfZXJyb3IgOiBwdWJsaWMgZXhjZXB0aW9uIAorICB7CisgICAgc3RyaW5nIF9NX21zZzsKKworICBwdWJsaWM6CisgICAgLyoqIFRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBlcnJvci4gICovCisgICAgZXhwbGljaXQgCisgICAgbG9naWNfZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisKKyAgICB2aXJ0dWFsIH5sb2dpY19lcnJvcigpIHRocm93KCk7CisKKyAgICAvKiogUmV0dXJucyBhIEMtc3R5bGUgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnZW5lcmFsIGNhdXNlIG9mCisgICAgICogIHRoZSBjdXJyZW50IGVycm9yICh0aGUgc2FtZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBjdG9yKS4gICovCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiAKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworICAvKiogVGhyb3duIGJ5IHRoZSBsaWJyYXJ5LCBvciBieSB5b3UsIHRvIHJlcG9ydCBkb21haW4gZXJyb3JzIChkb21haW4gaW4KKyAgICogIHRoZSBtYXRoZW1hdGljYWwgc2Vuc2UpLiAgKi8KKyAgY2xhc3MgZG9tYWluX2Vycm9yIDogcHVibGljIGxvZ2ljX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBkb21haW5fZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisgICAgdmlydHVhbCB+ZG9tYWluX2Vycm9yKCkgdGhyb3coKTsKKyAgfTsKKworICAvKiogVGhyb3duIHRvIHJlcG9ydCBpbnZhbGlkIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMuICAqLworICBjbGFzcyBpbnZhbGlkX2FyZ3VtZW50IDogcHVibGljIGxvZ2ljX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBpbnZhbGlkX2FyZ3VtZW50KGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfmludmFsaWRfYXJndW1lbnQoKSB0aHJvdygpOworICB9OworCisgIC8qKiBUaHJvd24gd2hlbiBhbiBvYmplY3QgaXMgY29uc3RydWN0ZWQgdGhhdCB3b3VsZCBleGNlZWQgaXRzIG1heGltdW0KKyAgICogIHBlcm1pdHRlZCBzaXplIChlLmcuLCBhIGJhc2ljX3N0cmluZyBpbnN0YW5jZSkuICAqLworICBjbGFzcyBsZW5ndGhfZXJyb3IgOiBwdWJsaWMgbG9naWNfZXJyb3IgCisgIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGxlbmd0aF9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5sZW5ndGhfZXJyb3IoKSB0aHJvdygpOworICB9OworCisgIC8qKiBUaGlzIHJlcHJlc2VudHMgYW4gYXJndW1lbnQgd2hvc2UgdmFsdWUgaXMgbm90IHdpdGhpbiB0aGUgZXhwZWN0ZWQKKyAgICogIHJhbmdlIChlLmcuLCBib3VuZGFyeSBjaGVja3MgaW4gYmFzaWNfc3RyaW5nKS4gICovCisgIGNsYXNzIG91dF9vZl9yYW5nZSA6IHB1YmxpYyBsb2dpY19lcnJvciAKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgb3V0X29mX3JhbmdlKGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfm91dF9vZl9yYW5nZSgpIHRocm93KCk7CisgIH07CisKKyAgLyoqIFJ1bnRpbWUgZXJyb3JzIHJlcHJlc2VudCBwcm9ibGVtcyBvdXRzaWRlIHRoZSBzY29wZSBvZiBhIHByb2dyYW07CisgICAqICB0aGV5IGNhbm5vdCBiZSBlYXNpbHkgcHJlZGljdGVkIGFuZCBjYW4gZ2VuZXJhbGx5IG9ubHkgYmUgY2F1Z2h0IGFzCisgICAqICB0aGUgcHJvZ3JhbSBleGVjdXRlcy4KKyAgICogIEBicmllZiBPbmUgb2YgdHdvIHN1YmNsYXNzZXMgb2YgZXhjZXB0aW9uLgorICAgKi8KKyAgY2xhc3MgcnVudGltZV9lcnJvciA6IHB1YmxpYyBleGNlcHRpb24gCisgIHsKKyAgICBzdHJpbmcgX01fbXNnOworCisgIHB1YmxpYzoKKyAgICAvKiogVGFrZXMgYSBjaGFyYWN0ZXIgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLiAgKi8KKyAgICBleHBsaWNpdCAKKyAgICBydW50aW1lX2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpOworCisgICAgdmlydHVhbCB+cnVudGltZV9lcnJvcigpIHRocm93KCk7CisKKyAgICAvKiogUmV0dXJucyBhIEMtc3R5bGUgY2hhcmFjdGVyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnZW5lcmFsIGNhdXNlIG9mCisgICAgICogIHRoZSBjdXJyZW50IGVycm9yICh0aGUgc2FtZSBzdHJpbmcgcGFzc2VkIHRvIHRoZSBjdG9yKS4gICovCisgICAgdmlydHVhbCBjb25zdCBjaGFyKiAKKyAgICB3aGF0KCkgY29uc3QgdGhyb3coKTsKKyAgfTsKKworICAvKiogVGhyb3duIHRvIGluZGljYXRlIHJhbmdlIGVycm9ycyBpbiBpbnRlcm5hbCBjb21wdXRhdGlvbnMuICAqLworICBjbGFzcyByYW5nZV9lcnJvciA6IHB1YmxpYyBydW50aW1lX2Vycm9yIAorICB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCByYW5nZV9lcnJvcihjb25zdCBzdHJpbmcmIF9fYXJnKTsKKyAgICB2aXJ0dWFsIH5yYW5nZV9lcnJvcigpIHRocm93KCk7CisgIH07CisKKyAgLyoqIFRocm93biB0byBpbmRpY2F0ZSBhcml0aG1ldGljIG92ZXJmbG93LiAgKi8KKyAgY2xhc3Mgb3ZlcmZsb3dfZXJyb3IgOiBwdWJsaWMgcnVudGltZV9lcnJvciAKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgb3ZlcmZsb3dfZXJyb3IoY29uc3Qgc3RyaW5nJiBfX2FyZyk7CisgICAgdmlydHVhbCB+b3ZlcmZsb3dfZXJyb3IoKSB0aHJvdygpOworICB9OworCisgIC8qKiBUaHJvd24gdG8gaW5kaWNhdGUgYXJpdGhtZXRpYyB1bmRlcmZsb3cuICAqLworICBjbGFzcyB1bmRlcmZsb3dfZXJyb3IgOiBwdWJsaWMgcnVudGltZV9lcnJvciAKKyAgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgdW5kZXJmbG93X2Vycm9yKGNvbnN0IHN0cmluZyYgX19hcmcpOworICAgIHZpcnR1YWwgfnVuZGVyZmxvd19lcnJvcigpIHRocm93KCk7CisgIH07CisKKyAgLy8gQH0gZ3JvdXAgZXhjZXB0aW9ucworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9TVERFWENFUFQgKi8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3RyZWFtYnVmIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS9zdHJlYW1idWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2ZWZlYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3RyZWFtYnVmCkBAIC0wLDAgKzEsODEwIEBACisvLyBTdHJlYW0gYnVmZmVyIGNsYXNzZXMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS9zdHJlYW1idWYKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyNy41ICBTdHJlYW0gYnVmZmVycworLy8KKworI2lmbmRlZiBfR0xJQlhYX1NUUkVBTUJVRgorI2RlZmluZSBfR0xJQlhYX1NUUkVBTUJVRiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlZndkLmg+CisjaW5jbHVkZSA8Yml0cy9pb3NfYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvY3BwX3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RyZWFtc2l6ZQorICAgIF9fY29weV9zdHJlYW1idWZzX2VvZihiYXNpY19zdHJlYW1idWY8X0NoYXJULCBfVHJhaXRzPiosCisJCQkgIGJhc2ljX3N0cmVhbWJ1ZjxfQ2hhclQsIF9UcmFpdHM+KiwgYm9vbCYpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBUaGUgYWN0dWFsIHdvcmsgb2YgaW5wdXQgYW5kIG91dHB1dCAoaW50ZXJmYWNlKS4KKyAgICogIEBpbmdyb3VwIGlvCisgICAqCisgICAqICBUaGlzIGlzIGEgYmFzZSBjbGFzcy4gIERlcml2ZWQgc3RyZWFtIGJ1ZmZlcnMgZWFjaCBjb250cm9sIGEKKyAgICogIHBhaXIgb2YgY2hhcmFjdGVyIHNlcXVlbmNlczogIG9uZSBmb3IgaW5wdXQsIGFuZCBvbmUgZm9yIG91dHB1dC4KKyAgICoKKyAgICogIFNlY3Rpb24gWzI3LjUuMV0gb2YgdGhlIHN0YW5kYXJkIGRlc2NyaWJlcyB0aGUgcmVxdWlyZW1lbnRzIGFuZAorICAgKiAgYmVoYXZpb3Igb2Ygc3RyZWFtIGJ1ZmZlciBjbGFzc2VzLiAgVGhhdCBzZWN0aW9uICh0aHJlZSBwYXJhZ3JhcGhzKQorICAgKiAgaXMgcmVwcm9kdWNlZCBoZXJlLCBmb3Igc2ltcGxpY2l0eSBhbmQgYWNjdXJhY3kuCisgICAqCisgICAqICAtIyBTdHJlYW0gYnVmZmVycyBjYW4gaW1wb3NlIHZhcmlvdXMgY29uc3RyYWludHMgb24gdGhlIHNlcXVlbmNlcworICAgKiAgICAgdGhleSBjb250cm9sLiAgU29tZSBjb25zdHJhaW50cyBhcmU6CisgICAqICAgICAtIFRoZSBjb250cm9sbGVkIGlucHV0IHNlcXVlbmNlIGNhbiBiZSBub3QgcmVhZGFibGUuCisgICAqICAgICAtIFRoZSBjb250cm9sbGVkIG91dHB1dCBzZXF1ZW5jZSBjYW4gYmUgbm90IHdyaXRhYmxlLgorICAgKiAgICAgLSBUaGUgY29udHJvbGxlZCBzZXF1ZW5jZXMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudHMgb2YKKyAgICogICAgICAgb3RoZXIgcmVwcmVzZW50YXRpb25zIGZvciBjaGFyYWN0ZXIgc2VxdWVuY2VzLCBzdWNoIGFzIGV4dGVybmFsCisgICAqICAgICAgIGZpbGVzLgorICAgKiAgICAgLSBUaGUgY29udHJvbGxlZCBzZXF1ZW5jZXMgY2FuIHN1cHBvcnQgb3BlcmF0aW9ucyBAZSBkaXJlY3RseSB0byBvcgorICAgKiAgICAgICBmcm9tIGFzc29jaWF0ZWQgc2VxdWVuY2VzLgorICAgKiAgICAgLSBUaGUgY29udHJvbGxlZCBzZXF1ZW5jZXMgY2FuIGltcG9zZSBsaW1pdGF0aW9ucyBvbiBob3cgdGhlCisgICAqICAgICAgIHByb2dyYW0gY2FuIHJlYWQgY2hhcmFjdGVycyBmcm9tIGEgc2VxdWVuY2UsIHdyaXRlIGNoYXJhY3RlcnMgdG8KKyAgICogICAgICAgYSBzZXF1ZW5jZSwgcHV0IGNoYXJhY3RlcnMgYmFjayBpbnRvIGFuIGlucHV0IHNlcXVlbmNlLCBvciBhbHRlcgorICAgKiAgICAgICB0aGUgc3RyZWFtIHBvc2l0aW9uLgorICAgKiAgICAgLgorICAgKiAgLSMgRWFjaCBzZXF1ZW5jZSBpcyBjaGFyYWN0ZXJpemVkIGJ5IHRocmVlIHBvaW50ZXJzIHdoaWNoLCBpZiBub24tbnVsbCwKKyAgICogICAgIGFsbCBwb2ludCBpbnRvIHRoZSBzYW1lIEBjIGNoYXJUIGFycmF5IG9iamVjdC4gIFRoZSBhcnJheSBvYmplY3QKKyAgICogICAgIHJlcHJlc2VudHMsIGF0IGFueSBtb21lbnQsIGEgKHN1YilzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlCisgICAqICAgICBzZXF1ZW5jZS4gIE9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIGEgc2VxdWVuY2UgYWx0ZXIgdGhlIHZhbHVlcworICAgKiAgICAgc3RvcmVkIGluIHRoZXNlIHBvaW50ZXJzLCBwZXJmb3JtIHJlYWRzIGFuZCB3cml0ZXMgZGlyZWN0bHkgdG8gb3IKKyAgICogICAgIGZyb20gYXNzb2NpYXRlZCBzZXF1ZW5jZXMsIGFuZCBhbHRlciA8ZW0+dGhlIHN0cmVhbSBwb3NpdGlvbjwvZW0+IGFuZAorICAgKiAgICAgY29udmVyc2lvbiBzdGF0ZSBhcyBuZWVkZWQgdG8gbWFpbnRhaW4gdGhpcyBzdWJzZXF1ZW5jZSByZWxhdGlvbnNoaXAuCisgICAqICAgICBUaGUgdGhyZWUgcG9pbnRlcnMgYXJlOgorICAgKiAgICAgLSB0aGUgPGVtPmJlZ2lubmluZyBwb2ludGVyPC9lbT4sIG9yIGxvd2VzdCBlbGVtZW50IGFkZHJlc3MgaW4gdGhlCisgICAqICAgICAgIGFycmF5IChjYWxsZWQgQGUgeGJlZyBoZXJlKTsKKyAgICogICAgIC0gdGhlIDxlbT5uZXh0IHBvaW50ZXI8L2VtPiwgb3IgbmV4dCBlbGVtZW50IGFkZHJlc3MgdGhhdCBpcyBhCisgICAqICAgICAgIGN1cnJlbnQgY2FuZGlkYXRlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgKGNhbGxlZCBAZSB4bmV4dCBoZXJlKTsKKyAgICogICAgIC0gdGhlIDxlbT5lbmQgcG9pbnRlcjwvZW0+LCBvciBmaXJzdCBlbGVtZW50IGFkZHJlc3MgYmV5b25kIHRoZQorICAgKiAgICAgICBlbmQgb2YgdGhlIGFycmF5IChjYWxsZWQgQGUgeGVuZCBoZXJlKS4KKyAgICogICAgIC4KKyAgICogIC0jIFRoZSBmb2xsb3dpbmcgc2VtYW50aWMgY29uc3RyYWludHMgc2hhbGwgYWx3YXlzIGFwcGx5IGZvciBhbnkgc2V0CisgICAqICAgICBvZiB0aHJlZSBwb2ludGVycyBmb3IgYSBzZXF1ZW5jZSwgdXNpbmcgdGhlIHBvaW50ZXIgbmFtZXMgZ2l2ZW4KKyAgICogICAgIGltbWVkaWF0ZWx5IGFib3ZlOgorICAgKiAgICAgLSBJZiBAZSB4bmV4dCBpcyBub3QgYSBudWxsIHBvaW50ZXIsIHRoZW4gQGUgeGJlZyBhbmQgQGUgeGVuZCBzaGFsbAorICAgKiAgICAgICBhbHNvIGJlIG5vbi1udWxsIHBvaW50ZXJzIGludG8gdGhlIHNhbWUgQGMgY2hhclQgYXJyYXksIGFzCisgICAqICAgICAgIGRlc2NyaWJlZCBhYm92ZTsgb3RoZXJ3aXNlLCBAZSB4YmVnIGFuZCBAZSB4ZW5kIHNoYWxsIGFsc28gYmUgbnVsbC4KKyAgICogICAgIC0gSWYgQGUgeG5leHQgaXMgbm90IGEgbnVsbCBwb2ludGVyIGFuZCBAZSB4bmV4dCA8IEBlIHhlbmQgZm9yIGFuCisgICAqICAgICAgIG91dHB1dCBzZXF1ZW5jZSwgdGhlbiBhIDxlbT53cml0ZSBwb3NpdGlvbjwvZW0+IGlzIGF2YWlsYWJsZS4KKyAgICogICAgICAgSW4gdGhpcyBjYXNlLCBAZSAqeG5leHQgc2hhbGwgYmUgYXNzaWduYWJsZSBhcyB0aGUgbmV4dCBlbGVtZW50CisgICAqICAgICAgIHRvIHdyaXRlICh0byBwdXQsIG9yIHRvIHN0b3JlIGEgY2hhcmFjdGVyIHZhbHVlLCBpbnRvIHRoZSBzZXF1ZW5jZSkuCisgICAqICAgICAtIElmIEBlIHhuZXh0IGlzIG5vdCBhIG51bGwgcG9pbnRlciBhbmQgQGUgeGJlZyA8IEBlIHhuZXh0IGZvciBhbgorICAgKiAgICAgICBpbnB1dCBzZXF1ZW5jZSwgdGhlbiBhIDxlbT5wdXRiYWNrIHBvc2l0aW9uPC9lbT4gaXMgYXZhaWxhYmxlLgorICAgKiAgICAgICBJbiB0aGlzIGNhc2UsIEBlIHhuZXh0Wy0xXSBzaGFsbCBoYXZlIGEgZGVmaW5lZCB2YWx1ZSBhbmQgaXMgdGhlCisgICAqICAgICAgIG5leHQgKHByZWNlZGluZykgZWxlbWVudCB0byBzdG9yZSBhIGNoYXJhY3RlciB0aGF0IGlzIHB1dCBiYWNrCisgICAqICAgICAgIGludG8gdGhlIGlucHV0IHNlcXVlbmNlLgorICAgKiAgICAgLSBJZiBAZSB4bmV4dCBpcyBub3QgYSBudWxsIHBvaW50ZXIgYW5kIEBlIHhuZXh0PCBAZSB4ZW5kIGZvciBhbgorICAgKiAgICAgICBpbnB1dCBzZXF1ZW5jZSwgdGhlbiBhIDxlbT5yZWFkIHBvc2l0aW9uPC9lbT4gaXMgYXZhaWxhYmxlLgorICAgKiAgICAgICBJbiB0aGlzIGNhc2UsIEBlICp4bmV4dCBzaGFsbCBoYXZlIGEgZGVmaW5lZCB2YWx1ZSBhbmQgaXMgdGhlCisgICAqICAgICAgIG5leHQgZWxlbWVudCB0byByZWFkICh0byBnZXQsIG9yIHRvIG9idGFpbiBhIGNoYXJhY3RlciB2YWx1ZSwKKyAgICogICAgICAgZnJvbSB0aGUgc2VxdWVuY2UpLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgY2xhc3MgYmFzaWNfc3RyZWFtYnVmIAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBUaGVzZSBhcmUgc3RhbmRhcmQgdHlwZXMuICBUaGV5IHBlcm1pdCBhIHN0YW5kYXJkaXplZCB3YXkgb2YKKyAgICAgICAqICByZWZlcnJpbmcgdG8gbmFtZXMgb2YgKG9yIG5hbWVzIGRlcGVuZGFudCBvbikgdGhlIHRlbXBsYXRlCisgICAgICAgKiAgcGFyYW1ldGVycywgd2hpY2ggYXJlIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICovCisgICAgICB0eXBlZGVmIF9DaGFyVCAJCQkJCWNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RyYWl0cyAJCQkJCXRyYWl0c190eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdHlwZTo6aW50X3R5cGUgCQlpbnRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3R5cGU6OnBvc190eXBlIAkJcG9zX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190eXBlOjpvZmZfdHlwZSAJCW9mZl90eXBlOworICAgICAgLy9AfQorCisgICAgICAvL0B7CisgICAgICAvLy8gVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCB0eXBlLgorICAgICAgdHlwZWRlZiBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT4gIAlfX3N0cmVhbWJ1Zl90eXBlOworICAgICAgLy9AfQorICAgICAgCisgICAgICBmcmllbmQgY2xhc3MgYmFzaWNfaW9zPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OworICAgICAgZnJpZW5kIGNsYXNzIGJhc2ljX2lzdHJlYW08Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CisgICAgICBmcmllbmQgY2xhc3MgYmFzaWNfb3N0cmVhbTxjaGFyX3R5cGUsIHRyYWl0c190eXBlPjsKKyAgICAgIGZyaWVuZCBjbGFzcyBpc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+OworICAgICAgZnJpZW5kIGNsYXNzIG9zdHJlYW1idWZfaXRlcmF0b3I8Y2hhcl90eXBlLCB0cmFpdHNfdHlwZT47CisKKyAgICAgIGZyaWVuZCBzdHJlYW1zaXplCisgICAgICBfX2NvcHlfc3RyZWFtYnVmc19lb2Y8PihfX3N0cmVhbWJ1Zl90eXBlKiwgX19zdHJlYW1idWZfdHlwZSosIGJvb2wmKTsKKworICAgICAgdGVtcGxhdGU8Ym9vbCBfSXNNb3ZlLCB0eXBlbmFtZSBfQ2hhclQyPgorICAgICAgICBmcmllbmQgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2NoYXI8X0NoYXJUMj46Ol9fdmFsdWUsIAorCQkJCQkgICAgICAgX0NoYXJUMio+OjpfX3R5cGUKKyAgICAgICAgX19jb3B5X21vdmVfYTIoaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiwKKwkJICAgICAgIGlzdHJlYW1idWZfaXRlcmF0b3I8X0NoYXJUMj4sIF9DaGFyVDIqKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMj4KKyAgICAgICAgZnJpZW5kIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19jaGFyPF9DaGFyVDI+OjpfX3ZhbHVlLAorCQkJCSAgaXN0cmVhbWJ1Zl9pdGVyYXRvcjxfQ2hhclQyPiA+OjpfX3R5cGUKKyAgICAgICAgZmluZChpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LCBpc3RyZWFtYnVmX2l0ZXJhdG9yPF9DaGFyVDI+LAorCSAgICAgY29uc3QgX0NoYXJUMiYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyLCB0eXBlbmFtZSBfVHJhaXRzMj4KKyAgICAgICAgZnJpZW5kIGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JgorICAgICAgICBvcGVyYXRvcj4+KGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JiwgX0NoYXJUMiopOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQyLCB0eXBlbmFtZSBfVHJhaXRzMiwgdHlwZW5hbWUgX0FsbG9jPgorICAgICAgICBmcmllbmQgYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mCisgICAgICAgIG9wZXJhdG9yPj4oYmFzaWNfaXN0cmVhbTxfQ2hhclQyLCBfVHJhaXRzMj4mLAorCQkgICBiYXNpY19zdHJpbmc8X0NoYXJUMiwgX1RyYWl0czIsIF9BbGxvYz4mKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUMiwgdHlwZW5hbWUgX1RyYWl0czIsIHR5cGVuYW1lIF9BbGxvYz4KKyAgICAgICAgZnJpZW5kIGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JgorICAgICAgICBnZXRsaW5lKGJhc2ljX2lzdHJlYW08X0NoYXJUMiwgX1RyYWl0czI+JiwKKwkJYmFzaWNfc3RyaW5nPF9DaGFyVDIsIF9UcmFpdHMyLCBfQWxsb2M+JiwgX0NoYXJUMik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAvL0B7CisgICAgICAvKioKKyAgICAgICAqICBUaGlzIGlzIGJhc2VkIG9uIF9JT19GSUxFLCBqdXN0IHJlb3JkZXJlZCB0byBiZSBtb3JlIGNvbnNpc3RlbnQsCisgICAgICAgKiAgYW5kIGlzIGludGVuZGVkIHRvIGJlIHRoZSBtb3N0IG1pbmltYWwgYWJzdHJhY3Rpb24gZm9yIGFuCisgICAgICAgKiAgaW50ZXJuYWwgYnVmZmVyLgorICAgICAgICogIC0gIGdldCA9PSBpbnB1dCA9PSByZWFkCisgICAgICAgKiAgLSAgcHV0ID09IG91dHB1dCA9PSB3cml0ZQorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZSogCQlfTV9pbl9iZWc7ICAgICAvLyBTdGFydCBvZiBnZXQgYXJlYS4gCisgICAgICBjaGFyX3R5cGUqIAkJX01faW5fY3VyOyAgICAgLy8gQ3VycmVudCByZWFkIGFyZWEuIAorICAgICAgY2hhcl90eXBlKiAJCV9NX2luX2VuZDsgICAgIC8vIEVuZCBvZiBnZXQgYXJlYS4gCisgICAgICBjaGFyX3R5cGUqIAkJX01fb3V0X2JlZzsgICAgLy8gU3RhcnQgb2YgcHV0IGFyZWEuIAorICAgICAgY2hhcl90eXBlKiAJCV9NX291dF9jdXI7ICAgIC8vIEN1cnJlbnQgcHV0IGFyZWEuIAorICAgICAgY2hhcl90eXBlKiAJCV9NX291dF9lbmQ7ICAgIC8vIEVuZCBvZiBwdXQgYXJlYS4KKworICAgICAgLy8vIEN1cnJlbnQgbG9jYWxlIHNldHRpbmcuCisgICAgICBsb2NhbGUgCQkJX01fYnVmX2xvY2FsZTsJCisKKyAgcHVibGljOgorICAgICAgLy8vIERlc3RydWN0b3IgZGVhbGxvY2F0ZXMgbm8gYnVmZmVyIHNwYWNlLgorICAgICAgdmlydHVhbCAKKyAgICAgIH5iYXNpY19zdHJlYW1idWYoKSAKKyAgICAgIHsgfQorCisgICAgICAvLyBbMjcuNS4yLjIuMV0gbG9jYWxlcworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbnRyeSBwb2ludCBmb3IgaW1idWUoKS4KKyAgICAgICAqICBAcGFyYW0gIGxvYyAgVGhlIG5ldyBsb2NhbGUuCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiAgQ2FsbHMgdGhlIGRlcml2ZWQgaW1idWUobG9jKS4KKyAgICAgICovCisgICAgICBsb2NhbGUgCisgICAgICBwdWJpbWJ1ZShjb25zdCBsb2NhbGUgJl9fbG9jKQorICAgICAgeworCWxvY2FsZSBfX3RtcCh0aGlzLT5nZXRsb2MoKSk7CisJdGhpcy0+aW1idWUoX19sb2MpOworCV9NX2J1Zl9sb2NhbGUgPSBfX2xvYzsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTG9jYWxlIGFjY2Vzcy4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgY3VycmVudCBsb2NhbGUgaW4gZWZmZWN0LgorICAgICAgICoKKyAgICAgICAqICBJZiBwdWJpbWJ1ZShsb2MpIGhhcyBiZWVuIGNhbGxlZCwgdGhlbiB0aGUgbW9zdCByZWNlbnQgQGMgbG9jCisgICAgICAgKiAgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgdGhlIGdsb2JhbCBsb2NhbGUgaW4gZWZmZWN0IGF0IHRoZSB0aW1lCisgICAgICAgKiAgb2YgY29uc3RydWN0aW9uIGlzIHJldHVybmVkLgorICAgICAgKi8KKyAgICAgIGxvY2FsZSAgIAorICAgICAgZ2V0bG9jKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2J1Zl9sb2NhbGU7IH0gCisKKyAgICAgIC8vIFsyNy41LjIuMi4yXSBidWZmZXIgbWFuYWdlbWVudCBhbmQgcG9zaXRpb25pbmcKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRW50cnkgcG9pbnRzIGZvciBkZXJpdmVkIGJ1ZmZlciBmdW5jdGlvbnMuCisgICAgICAgKgorICAgICAgICogIFRoZSBwdWJsaWMgdmVyc2lvbnMgb2YgQGMgcHViZm9vIGRpc3BhdGNoIHRvIHRoZSBwcm90ZWN0ZWQKKyAgICAgICAqICBkZXJpdmVkIEBjIGZvbyBtZW1iZXIgZnVuY3Rpb25zLCBwYXNzaW5nIHRoZSBhcmd1bWVudHMgKGlmIGFueSkKKyAgICAgICAqICBhbmQgcmV0dXJuaW5nIHRoZSByZXN1bHQgdW5jaGFuZ2VkLgorICAgICAgKi8KKyAgICAgIF9fc3RyZWFtYnVmX3R5cGUqIAorICAgICAgcHVic2V0YnVmKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikgCisgICAgICB7IHJldHVybiB0aGlzLT5zZXRidWYoX19zLCBfX24pOyB9CisKKyAgICAgIHBvc190eXBlIAorICAgICAgcHVic2Vla29mZihvZmZfdHlwZSBfX29mZiwgaW9zX2Jhc2U6OnNlZWtkaXIgX193YXksIAorCQkgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCisgICAgICB7IHJldHVybiB0aGlzLT5zZWVrb2ZmKF9fb2ZmLCBfX3dheSwgX19tb2RlKTsgfQorCisgICAgICBwb3NfdHlwZSAKKyAgICAgIHB1YnNlZWtwb3MocG9zX3R5cGUgX19zcCwKKwkJIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeyByZXR1cm4gdGhpcy0+c2Vla3BvcyhfX3NwLCBfX21vZGUpOyB9CisKKyAgICAgIGludCAKKyAgICAgIHB1YnN5bmMoKSB7IHJldHVybiB0aGlzLT5zeW5jKCk7IH0KKyAgICAgIC8vQH0KKworICAgICAgLy8gWzI3LjUuMi4yLjNdIGdldCBhcmVhCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIExvb2tpbmcgYWhlYWQgaW50byB0aGUgc3RyZWFtLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUuCisgICAgICAgKgorICAgICAgICogIElmIGEgcmVhZCBwb3NpdGlvbiBpcyBhdmFpbGFibGUsIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICAgKiAgYXZhaWxhYmxlIGZvciByZWFkaW5nIGJlZm9yZSB0aGUgYnVmZmVyIG11c3QgYmUgcmVmaWxsZWQuCisgICAgICAgKiAgT3RoZXJ3aXNlIHJldHVybnMgdGhlIGRlcml2ZWQgQGMgc2hvd21hbnljKCkuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIGluX2F2YWlsKCkgCisgICAgICB7IAorCWNvbnN0IHN0cmVhbXNpemUgX19yZXQgPSB0aGlzLT5lZ3B0cigpIC0gdGhpcy0+Z3B0cigpOworCXJldHVybiBfX3JldCA/IF9fcmV0IDogdGhpcy0+c2hvd21hbnljKCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgR2V0dGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIuCisgICAgICAgKiAgQHJldHVybiAgVGhlIG5leHQgY2hhcmFjdGVyLCBvciBlb2YuCisgICAgICAgKgorICAgICAgICogIENhbGxzIEBjIHNidW1wYygpLCBhbmQgaWYgdGhhdCBmdW5jdGlvbiByZXR1cm5zCisgICAgICAgKiAgQGMgdHJhaXRzOjplb2YoKSwgc28gZG9lcyB0aGlzIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlLCBAYyBzZ2V0YygpLgorICAgICAgKi8KKyAgICAgIGludF90eXBlIAorICAgICAgc25leHRjKCkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldCA9IHRyYWl0c190eXBlOjplb2YoKTsKKwlpZiAoX19idWlsdGluX2V4cGVjdCghdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKHRoaXMtPnNidW1wYygpLCAKKwkJCQkJCSAgICAgICBfX3JldCksIHRydWUpKQorCSAgX19yZXQgPSB0aGlzLT5zZ2V0YygpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBHZXR0aW5nIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbmV4dCBjaGFyYWN0ZXIsIG9yIGVvZi4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIGlucHV0IHJlYWQgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCByZXR1cm5zIHRoYXQgY2hhcmFjdGVyCisgICAgICAgKiAgYW5kIGluY3JlbWVudHMgdGhlIHJlYWQgcG9pbnRlciwgb3RoZXJ3aXNlIGNhbGxzIGFuZCByZXR1cm5zCisgICAgICAgKiAgQGMgdWZsb3coKS4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHNidW1wYygpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSwgdHJ1ZSkpCisJICB7CisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCSAgICB0aGlzLT5nYnVtcCgxKTsKKwkgIH0KKwllbHNlIAorCSAgX19yZXQgPSB0aGlzLT51ZmxvdygpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBHZXR0aW5nIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgbmV4dCBjaGFyYWN0ZXIsIG9yIGVvZi4KKyAgICAgICAqCisgICAgICAgKiAgSWYgdGhlIGlucHV0IHJlYWQgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCByZXR1cm5zIHRoYXQgY2hhcmFjdGVyLAorICAgICAgICogIG90aGVyd2lzZSBjYWxscyBhbmQgcmV0dXJucyBAYyB1bmRlcmZsb3coKS4gIERvZXMgbm90IG1vdmUgdGhlIAorICAgICAgICogIHJlYWQgcG9zaXRpb24gYWZ0ZXIgZmV0Y2hpbmcgdGhlIGNoYXJhY3Rlci4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHNnZXRjKCkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwlpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpLCB0cnVlKSkKKwkgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCWVsc2UgCisJICBfX3JldCA9IHRoaXMtPnVuZGVyZmxvdygpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbnRyeSBwb2ludCBmb3IgeHNnZXRuLgorICAgICAgICogIEBwYXJhbSAgcyAgQSBidWZmZXIgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIG4gIEEgY291bnQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgeHNnZXRuKHMsbikuICBUaGUgZWZmZWN0IGlzIHRvIGZpbGwgQGEgc1swXSB0aHJvdWdoCisgICAgICAgKiAgQGEgc1tuLTFdIHdpdGggY2hhcmFjdGVycyBmcm9tIHRoZSBpbnB1dCBzZXF1ZW5jZSwgaWYgcG9zc2libGUuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHNnZXRuKGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnhzZ2V0bihfX3MsIF9fbik7IH0KKworICAgICAgLy8gWzI3LjUuMi4yLjRdIHB1dGJhY2sKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUHVzaGluZyBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICogIEBwYXJhbSAgYyAgVGhlIGNoYXJhY3RlciB0byBwdXNoIGJhY2suCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGNoYXJhY3RlciwgaWYgcG9zc2libGUuCisgICAgICAgKgorICAgICAgICogIFNpbWlsYXIgdG8gc3VuZ2V0YygpLCBidXQgQGEgYyBpcyBwdXNoZWQgb250byB0aGUgc3RyZWFtCisgICAgICAgKiAgaW5zdGVhZCBvZiA8ZW0+dGhlIHByZXZpb3VzIGNoYXJhY3Rlci48L2VtPiBJZiBzdWNjZXNzZnVsLAorICAgICAgICogIHRoZSBuZXh0IGNoYXJhY3RlciBmZXRjaGVkIGZyb20gdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIEBhCisgICAgICAgKiAgYy4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHNwdXRiYWNrYyhjaGFyX3R5cGUgX19jKQorICAgICAgeworCWludF90eXBlIF9fcmV0OworCWNvbnN0IGJvb2wgX190ZXN0cG9zID0gdGhpcy0+ZWJhY2soKSA8IHRoaXMtPmdwdHIoKTsKKwlpZiAoX19idWlsdGluX2V4cGVjdCghX190ZXN0cG9zIHx8IAorCQkJICAgICAhdHJhaXRzX3R5cGU6OmVxKF9fYywgdGhpcy0+Z3B0cigpWy0xXSksIGZhbHNlKSkKKwkgIF9fcmV0ID0gdGhpcy0+cGJhY2tmYWlsKHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2MpKTsKKwllbHNlIAorCSAgeworCSAgICB0aGlzLT5nYnVtcCgtMSk7CisJICAgIF9fcmV0ID0gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCp0aGlzLT5ncHRyKCkpOworCSAgfQorCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZpbmcgYmFja3dhcmRzIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgKiAgQHJldHVybiAgVGhlIHByZXZpb3VzIGNoYXJhY3RlciwgaWYgcG9zc2libGUuCisgICAgICAgKgorICAgICAgICogIElmIGEgcHV0YmFjayBwb3NpdGlvbiBpcyBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gZGVjcmVtZW50cworICAgICAgICogIHRoZSBpbnB1dCBwb2ludGVyIGFuZCByZXR1cm5zIHRoYXQgY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLAorICAgICAgICogIGNhbGxzIGFuZCByZXR1cm5zIHBiYWNrZmFpbCgpLiAgVGhlIGVmZmVjdCBpcyB0byBAYSB1bmdldAorICAgICAgICogIHRoZSBsYXN0IGNoYXJhY3RlciBAYSBnb3R0ZW4uCisgICAgICAqLworICAgICAgaW50X3R5cGUgCisgICAgICBzdW5nZXRjKCkKKyAgICAgIHsKKwlpbnRfdHlwZSBfX3JldDsKKwlpZiAoX19idWlsdGluX2V4cGVjdCh0aGlzLT5lYmFjaygpIDwgdGhpcy0+Z3B0cigpLCB0cnVlKSkKKwkgIHsKKwkgICAgdGhpcy0+Z2J1bXAoLTEpOworCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqdGhpcy0+Z3B0cigpKTsKKwkgIH0KKwllbHNlIAorCSAgX19yZXQgPSB0aGlzLT5wYmFja2ZhaWwoKTsKKwlyZXR1cm4gX19yZXQ7CisgICAgICB9CisKKyAgICAgIC8vIFsyNy41LjIuMi41XSBwdXQgYXJlYQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbnRyeSBwb2ludCBmb3IgYWxsIHNpbmdsZS1jaGFyYWN0ZXIgb3V0cHV0IGZ1bmN0aW9ucy4KKyAgICAgICAqICBAcGFyYW0gIGMgIEEgY2hhcmFjdGVyIHRvIG91dHB1dC4KKyAgICAgICAqICBAcmV0dXJuICBAYSBjLCBpZiBwb3NzaWJsZS4KKyAgICAgICAqCisgICAgICAgKiAgT25lIG9mIHR3byBwdWJsaWMgb3V0cHV0IGZ1bmN0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgSWYgYSB3cml0ZSBwb3NpdGlvbiBpcyBhdmFpbGFibGUgZm9yIHRoZSBvdXRwdXQgc2VxdWVuY2UgKGkuZS4sCisgICAgICAgKiAgdGhlIGJ1ZmZlciBpcyBub3QgZnVsbCksIHN0b3JlcyBAYSBjIGluIHRoYXQgcG9zaXRpb24sIGluY3JlbWVudHMKKyAgICAgICAqICB0aGUgcG9zaXRpb24sIGFuZCByZXR1cm5zIEBjIHRyYWl0czo6dG9faW50X3R5cGUoYykuICBJZiBhIHdyaXRlCisgICAgICAgKiAgcG9zaXRpb24gaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJucyBAYyBvdmVyZmxvdyhjKS4KKyAgICAgICovCisgICAgICBpbnRfdHlwZSAKKyAgICAgIHNwdXRjKGNoYXJfdHlwZSBfX2MpCisgICAgICB7CisJaW50X3R5cGUgX19yZXQ7CisJaWYgKF9fYnVpbHRpbl9leHBlY3QodGhpcy0+cHB0cigpIDwgdGhpcy0+ZXBwdHIoKSwgdHJ1ZSkpCisJICB7CisJICAgICp0aGlzLT5wcHRyKCkgPSBfX2M7CisJICAgIHRoaXMtPnBidW1wKDEpOworCSAgICBfX3JldCA9IHRyYWl0c190eXBlOjp0b19pbnRfdHlwZShfX2MpOworCSAgfQorCWVsc2UKKwkgIF9fcmV0ID0gdGhpcy0+b3ZlcmZsb3codHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKF9fYykpOworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBFbnRyeSBwb2ludCBmb3IgYWxsIHNpbmdsZS1jaGFyYWN0ZXIgb3V0cHV0IGZ1bmN0aW9ucy4KKyAgICAgICAqICBAcGFyYW0gIHMgIEEgYnVmZmVyIHJlYWQgYXJlYS4KKyAgICAgICAqICBAcGFyYW0gIG4gIEEgY291bnQuCisgICAgICAgKgorICAgICAgICogIE9uZSBvZiB0d28gcHVibGljIG91dHB1dCBmdW5jdGlvbnMuCisgICAgICAgKgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIHhzcHV0bihzLG4pLiAgVGhlIGVmZmVjdCBpcyB0byB3cml0ZSBAYSBzWzBdIHRocm91Z2gKKyAgICAgICAqICBAYSBzW24tMV0gdG8gdGhlIG91dHB1dCBzZXF1ZW5jZSwgaWYgcG9zc2libGUuCisgICAgICAqLworICAgICAgc3RyZWFtc2l6ZSAKKyAgICAgIHNwdXRuKGNvbnN0IGNoYXJfdHlwZSogX19zLCBzdHJlYW1zaXplIF9fbikKKyAgICAgIHsgcmV0dXJuIHRoaXMtPnhzcHV0bihfX3MsIF9fbik7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQmFzZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqCisgICAgICAgKiAgT25seSBjYWxsZWQgZnJvbSBkZXJpdmVkIGNvbnN0cnVjdG9ycywgYW5kIHNldHMgdXAgYWxsIHRoZQorICAgICAgICogIGJ1ZmZlciBkYXRhIHRvIHplcm8sIGluY2x1ZGluZyB0aGUgcG9pbnRlcnMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICogIGJhc2ljX3N0cmVhbWJ1ZiBjbGFzcyBkZXNjcmlwdGlvbi4gIE5vdGUgdGhhdCwgYXMgYSByZXN1bHQsCisgICAgICAgKiAgLSB0aGUgY2xhc3Mgc3RhcnRzIHdpdGggbm8gcmVhZCBub3Igd3JpdGUgcG9zaXRpb25zIGF2YWlsYWJsZSwKKyAgICAgICAqICAtIHRoaXMgaXMgbm90IGFuIGVycm9yCisgICAgICAqLworICAgICAgYmFzaWNfc3RyZWFtYnVmKCkKKyAgICAgIDogX01faW5fYmVnKDApLCBfTV9pbl9jdXIoMCksIF9NX2luX2VuZCgwKSwgCisgICAgICBfTV9vdXRfYmVnKDApLCBfTV9vdXRfY3VyKDApLCBfTV9vdXRfZW5kKDApLAorICAgICAgX01fYnVmX2xvY2FsZShsb2NhbGUoKSkgCisgICAgICB7IH0KKworICAgICAgLy8gWzI3LjUuMi4zLjFdIGdldCBhcmVhIGFjY2VzcworICAgICAgLy9AeworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBY2Nlc3MgdG8gdGhlIGdldCBhcmVhLgorICAgICAgICoKKyAgICAgICAqICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHRvIG90aGVyIHByb3RlY3RlZCBmdW5jdGlvbnMsCisgICAgICAgKiAgaW5jbHVkaW5nIGRlcml2ZWQgY2xhc3Nlcy4KKyAgICAgICAqCisgICAgICAgKiAgLSBlYmFjaygpIHJldHVybnMgdGhlIGJlZ2lubmluZyBwb2ludGVyIGZvciB0aGUgaW5wdXQgc2VxdWVuY2UKKyAgICAgICAqICAtIGdwdHIoKSByZXR1cm5zIHRoZSBuZXh0IHBvaW50ZXIgZm9yIHRoZSBpbnB1dCBzZXF1ZW5jZQorICAgICAgICogIC0gZWdwdHIoKSByZXR1cm5zIHRoZSBlbmQgcG9pbnRlciBmb3IgdGhlIGlucHV0IHNlcXVlbmNlCisgICAgICAqLworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIGViYWNrKCkgY29uc3QgeyByZXR1cm4gX01faW5fYmVnOyB9CisKKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBncHRyKCkgIGNvbnN0IHsgcmV0dXJuIF9NX2luX2N1cjsgIH0KKworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIGVncHRyKCkgY29uc3QgeyByZXR1cm4gX01faW5fZW5kOyB9CisgICAgICAvL0B9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTW92aW5nIHRoZSByZWFkIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgbiAgVGhlIGRlbHRhIGJ5IHdoaWNoIHRvIG1vdmUuCisgICAgICAgKgorICAgICAgICogIFRoaXMganVzdCBhZHZhbmNlcyB0aGUgcmVhZCBwb3NpdGlvbiB3aXRob3V0IHJldHVybmluZyBhbnkgZGF0YS4KKyAgICAgICovCisgICAgICB2b2lkIAorICAgICAgZ2J1bXAoaW50IF9fbikgeyBfTV9pbl9jdXIgKz0gX19uOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgU2V0dGluZyB0aGUgdGhyZWUgcmVhZCBhcmVhIHBvaW50ZXJzLgorICAgICAgICogIEBwYXJhbSAgZ2JlZyAgQSBwb2ludGVyLgorICAgICAgICogIEBwYXJhbSAgZ25leHQgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcGFyYW0gIGdlbmQgIEEgcG9pbnRlci4KKyAgICAgICAqICBAcG9zdCAgQGEgZ2JlZyA9PSBAYyBlYmFjaygpLCBAYSBnbmV4dCA9PSBAYyBncHRyKCksIGFuZAorICAgICAgICogICAgICAgICBAYSBnZW5kID09IEBjIGVncHRyKCkKKyAgICAgICovCisgICAgICB2b2lkIAorICAgICAgc2V0ZyhjaGFyX3R5cGUqIF9fZ2JlZywgY2hhcl90eXBlKiBfX2duZXh0LCBjaGFyX3R5cGUqIF9fZ2VuZCkKKyAgICAgIHsKKwlfTV9pbl9iZWcgPSBfX2diZWc7CisJX01faW5fY3VyID0gX19nbmV4dDsKKwlfTV9pbl9lbmQgPSBfX2dlbmQ7CisgICAgICB9CisKKyAgICAgIC8vIFsyNy41LjIuMy4yXSBwdXQgYXJlYSBhY2Nlc3MKKyAgICAgIC8vQHsKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWNjZXNzIHRvIHRoZSBwdXQgYXJlYS4KKyAgICAgICAqCisgICAgICAgKiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSB0byBvdGhlciBwcm90ZWN0ZWQgZnVuY3Rpb25zLAorICAgICAgICogIGluY2x1ZGluZyBkZXJpdmVkIGNsYXNzZXMuCisgICAgICAgKgorICAgICAgICogIC0gcGJhc2UoKSByZXR1cm5zIHRoZSBiZWdpbm5pbmcgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgICogIC0gcHB0cigpIHJldHVybnMgdGhlIG5leHQgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgICogIC0gZXBwdHIoKSByZXR1cm5zIHRoZSBlbmQgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBzZXF1ZW5jZQorICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9iZWc7IH0KKworICAgICAgY2hhcl90eXBlKiAKKyAgICAgIHBwdHIoKSBjb25zdCB7IHJldHVybiBfTV9vdXRfY3VyOyB9CisKKyAgICAgIGNoYXJfdHlwZSogCisgICAgICBlcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9NX291dF9lbmQ7IH0KKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBNb3ZpbmcgdGhlIHdyaXRlIHBvc2l0aW9uLgorICAgICAgICogIEBwYXJhbSAgbiAgVGhlIGRlbHRhIGJ5IHdoaWNoIHRvIG1vdmUuCisgICAgICAgKgorICAgICAgICogIFRoaXMganVzdCBhZHZhbmNlcyB0aGUgd3JpdGUgcG9zaXRpb24gd2l0aG91dCByZXR1cm5pbmcgYW55IGRhdGEuCisgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIHBidW1wKGludCBfX24pIHsgX01fb3V0X2N1ciArPSBfX247IH0KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTZXR0aW5nIHRoZSB0aHJlZSB3cml0ZSBhcmVhIHBvaW50ZXJzLgorICAgICAgICogIEBwYXJhbSAgcGJlZyAgQSBwb2ludGVyLgorICAgICAgICogIEBwYXJhbSAgcGVuZCAgQSBwb2ludGVyLgorICAgICAgICogIEBwb3N0ICBAYSBwYmVnID09IEBjIHBiYXNlKCksIEBhIHBiZWcgPT0gQGMgcHB0cigpLCBhbmQKKyAgICAgICAqICAgICAgICAgQGEgcGVuZCA9PSBAYyBlcHB0cigpCisgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIHNldHAoY2hhcl90eXBlKiBfX3BiZWcsIGNoYXJfdHlwZSogX19wZW5kKQorICAgICAgeyAKKwlfTV9vdXRfYmVnID0gX01fb3V0X2N1ciA9IF9fcGJlZzsgCisJX01fb3V0X2VuZCA9IF9fcGVuZDsKKyAgICAgIH0KKworICAgICAgLy8gWzI3LjUuMi40XSB2aXJ0dWFsIGZ1bmN0aW9ucworICAgICAgLy8gWzI3LjUuMi40LjFdIGxvY2FsZXMKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQ2hhbmdlcyB0cmFuc2xhdGlvbnMuCisgICAgICAgKiAgQHBhcmFtICBsb2MgIEEgbmV3IGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiAgVHJhbnNsYXRpb25zIGRvbmUgZHVyaW5nIEkvTyB3aGljaCBkZXBlbmQgb24gdGhlIGN1cnJlbnQKKyAgICAgICAqICBsb2NhbGUgYXJlIGNoYW5nZWQgYnkgdGhpcyBjYWxsLiAgVGhlIHN0YW5kYXJkIGFkZHMsCisgICAgICAgKiAgPGVtPkJldHdlZW4gaW52b2NhdGlvbnMgb2YgdGhpcyBmdW5jdGlvbiBhIGNsYXNzIGRlcml2ZWQKKyAgICAgICAqICBmcm9tIHN0cmVhbWJ1ZiBjYW4gc2FmZWx5IGNhY2hlIHJlc3VsdHMgb2YgY2FsbHMgdG8gbG9jYWxlCisgICAgICAgKiAgZnVuY3Rpb25zIGFuZCB0byBtZW1iZXJzIG9mIGZhY2V0cyBzbyBvYnRhaW5lZC48L2VtPgorICAgICAgICoKKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZy4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHZvaWQgCisgICAgICBpbWJ1ZShjb25zdCBsb2NhbGUmKSAKKyAgICAgIHsgfQorCisgICAgICAvLyBbMjcuNS4yLjQuMl0gYnVmZmVyIG1hbmFnZW1lbnQgYW5kIHBvc2l0aW9uaW5nCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIE1hbmlwdWxhdGVzIHRoZSBidWZmZXIuCisgICAgICAgKgorICAgICAgICogIEVhY2ggZGVyaXZlZCBjbGFzcyBwcm92aWRlcyBpdHMgb3duIGFwcHJvcHJpYXRlIGJlaGF2aW9yLiAgU2VlCisgICAgICAgKiAgdGhlIG5leHQtdG8tbGFzdCBwYXJhZ3JhcGggb2YgCisgICAgICAgKiAgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iazAxcHQxMWNoMjVzMDIuaHRtbAorICAgICAgICogIGZvciBtb3JlIG9uIHRoaXMgZnVuY3Rpb24uCisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIEBjIHRoaXMuCisgICAgICAqLworICAgICAgdmlydHVhbCBiYXNpY19zdHJlYW1idWY8Y2hhcl90eXBlLF9UcmFpdHM+KiAKKyAgICAgIHNldGJ1ZihjaGFyX3R5cGUqLCBzdHJlYW1zaXplKQorICAgICAgewlyZXR1cm4gdGhpczsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFsdGVycyB0aGUgc3RyZWFtIHBvc2l0aW9ucy4KKyAgICAgICAqCisgICAgICAgKiAgRWFjaCBkZXJpdmVkIGNsYXNzIHByb3ZpZGVzIGl0cyBvd24gYXBwcm9wcmlhdGUgYmVoYXZpb3IuCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgYSBAYyBwb3NfdHlwZQorICAgICAgICogICAgICAgICB0aGF0IHJlcHJlc2VudHMgYW4gaW52YWxpZCBzdHJlYW0gcG9zaXRpb24uCisgICAgICAqLworICAgICAgdmlydHVhbCBwb3NfdHlwZSAKKyAgICAgIHNlZWtvZmYob2ZmX3R5cGUsIGlvc19iYXNlOjpzZWVrZGlyLAorCSAgICAgIGlvc19iYXNlOjpvcGVubW9kZSAvKl9fbW9kZSovID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCkKKyAgICAgIHsgcmV0dXJuIHBvc190eXBlKG9mZl90eXBlKC0xKSk7IH0gCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQWx0ZXJzIHRoZSBzdHJlYW0gcG9zaXRpb25zLgorICAgICAgICoKKyAgICAgICAqICBFYWNoIGRlcml2ZWQgY2xhc3MgcHJvdmlkZXMgaXRzIG93biBhcHByb3ByaWF0ZSBiZWhhdmlvci4KKyAgICAgICAqICBAbm90ZSAgQmFzZSBjbGFzcyB2ZXJzaW9uIGRvZXMgbm90aGluZywgcmV0dXJucyBhIEBjIHBvc190eXBlCisgICAgICAgKiAgICAgICAgIHRoYXQgcmVwcmVzZW50cyBhbiBpbnZhbGlkIHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHBvc190eXBlIAorICAgICAgc2Vla3Bvcyhwb3NfdHlwZSwgCisJICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIC8qX19tb2RlKi8gPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KQorICAgICAgeyByZXR1cm4gcG9zX3R5cGUob2ZmX3R5cGUoLTEpKTsgfSAKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBTeW5jaHJvbml6ZXMgdGhlIGJ1ZmZlciBhcnJheXMgd2l0aCB0aGUgY29udHJvbGxlZCBzZXF1ZW5jZXMuCisgICAgICAgKiAgQHJldHVybiAgLTEgb24gZmFpbHVyZS4KKyAgICAgICAqCisgICAgICAgKiAgRWFjaCBkZXJpdmVkIGNsYXNzIHByb3ZpZGVzIGl0cyBvd24gYXBwcm9wcmlhdGUgYmVoYXZpb3IsCisgICAgICAgKiAgaW5jbHVkaW5nIHRoZSBkZWZpbml0aW9uIG9mIEBhIGZhaWx1cmUuCisgICAgICAgKiAgQG5vdGUgIEJhc2UgY2xhc3MgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIHJldHVybnMgemVyby4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIGludCAKKyAgICAgIHN5bmMoKSB7IHJldHVybiAwOyB9CisKKyAgICAgIC8vIFsyNy41LjIuNC4zXSBnZXQgYXJlYQorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBJbnZlc3RpZ2F0aW5nIHRoZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAgICAqICBAcmV0dXJuICBBbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXZhaWxhYmxlIGluIHRoZQorICAgICAgICogICAgICAgICAgIGlucHV0IHNlcXVlbmNlLCBvciAtMS4KKyAgICAgICAqCisgICAgICAgKiAgPGVtPklmIGl0IHJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSwgdGhlbiBzdWNjZXNzaXZlIGNhbGxzIHRvCisgICAgICAgKiAgQGMgdW5kZXJmbG93KCkgd2lsbCBub3QgcmV0dXJuIEBjIHRyYWl0czo6ZW9mKCkgdW50aWwgYXQKKyAgICAgICAqICBsZWFzdCB0aGF0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBzdXBwbGllZC4gIElmIEBjCisgICAgICAgKiAgc2hvd21hbnljKCkgcmV0dXJucyAtMSwgdGhlbiBjYWxscyB0byBAYyB1bmRlcmZsb3coKSBvciBAYworICAgICAgICogIHVmbG93KCkgd2lsbCBmYWlsLjwvZW0+IFsyNy41LjIuNC4zXS8xCisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIHplcm8uCisgICAgICAgKiAgQG5vdGUgIFRoZSBzdGFuZGFyZCBhZGRzIHRoYXQgPGVtPnRoZSBpbnRlbnRpb24gaXMgbm90IG9ubHkgdGhhdCB0aGUKKyAgICAgICAqICAgICAgICAgY2FsbHMgW3RvIHVuZGVyZmxvdyBvciB1Zmxvd10gd2lsbCBub3QgcmV0dXJuIEBjIGVvZigpIGJ1dAorICAgICAgICogICAgICAgICB0aGF0IHRoZXkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuPC9lbT4KKyAgICAgICAqICBAbm90ZSAgVGhlIHN0YW5kYXJkIGFkZHMgdGhhdCA8ZW0+dGhlIG1vcnBoZW1lcyBvZiBAYyBzaG93bWFueWMgYXJlCisgICAgICAgKiAgICAgICAgIEBiIGVzLWhvdy1tYW55LXNlZSwgbm90IEBiIHNob3ctbWFuaWMuPC9lbT4KKyAgICAgICovCisgICAgICB2aXJ0dWFsIHN0cmVhbXNpemUgCisgICAgICBzaG93bWFueWMoKSB7IHJldHVybiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTXVsdGlwbGUgY2hhcmFjdGVyIGV4dHJhY3Rpb24uCisgICAgICAgKiAgQHBhcmFtICBzICBBIGJ1ZmZlciBhcmVhLgorICAgICAgICogIEBwYXJhbSAgbiAgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBhc3NpZ24uCisgICAgICAgKiAgQHJldHVybiAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFzc2lnbmVkLgorICAgICAgICoKKyAgICAgICAqICBGaWxscyBAYSBzWzBdIHRocm91Z2ggQGEgc1tuLTFdIHdpdGggY2hhcmFjdGVycyBmcm9tIHRoZSBpbnB1dAorICAgICAgICogIHNlcXVlbmNlLCBhcyBpZiBieSBAYyBzYnVtcGMoKS4gIFN0b3BzIHdoZW4gZWl0aGVyIEBhIG4gY2hhcmFjdGVycworICAgICAgICogIGhhdmUgYmVlbiBjb3BpZWQsIG9yIHdoZW4gQGMgdHJhaXRzOjplb2YoKSB3b3VsZCBiZSBjb3BpZWQuCisgICAgICAgKgorICAgICAgICogIEl0IGlzIGV4cGVjdGVkIHRoYXQgZGVyaXZlZCBjbGFzc2VzIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAorICAgICAgICogIGltcGxlbWVudGF0aW9uIGJ5IG92ZXJyaWRpbmcgdGhpcyBkZWZpbml0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSAKKyAgICAgIHhzZ2V0bihjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEZldGNoZXMgbW9yZSBkYXRhIGZyb20gdGhlIGNvbnRyb2xsZWQgc2VxdWVuY2UuCisgICAgICAgKiAgQHJldHVybiAgVGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tIHRoZSA8ZW0+cGVuZGluZyBzZXF1ZW5jZTwvZW0+LgorICAgICAgICoKKyAgICAgICAqICBJbmZvcm1hbGx5LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpbnB1dCBidWZmZXIgaXMKKyAgICAgICAqICBleGhhdXN0ZWQgKG9yIGRvZXMgbm90IGV4aXN0LCBhcyBidWZmZXJpbmcgbmVlZCBub3QgYWN0dWFsbHkgYmUKKyAgICAgICAqICBkb25lKS4gIElmIGEgYnVmZmVyIGV4aXN0cywgaXQgaXMgQGEgcmVmaWxsZWQuICBJbiBlaXRoZXIgY2FzZSwgdGhlCisgICAgICAgKiAgbmV4dCBhdmFpbGFibGUgY2hhcmFjdGVyIGlzIHJldHVybmVkLCBvciBAYyB0cmFpdHM6OmVvZigpIHRvCisgICAgICAgKiAgaW5kaWNhdGUgYSBudWxsIHBlbmRpbmcgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogIEZvciBhIGZvcm1hbCBkZWZpbml0aW9uIG9mIHRoZSBwZW5kaW5nIHNlcXVlbmNlLCBzZWUgYSBnb29kIHRleHQKKyAgICAgICAqICBzdWNoIGFzIExhbmdlciAmIEtyZWZ0LCBvciBbMjcuNS4yLjQuM10vNy0xNC4KKyAgICAgICAqCisgICAgICAgKiAgQSBmdW5jdGlvbmluZyBpbnB1dCBzdHJlYW1idWYgY2FuIGJlIGNyZWF0ZWQgYnkgb3ZlcnJpZGluZyBvbmx5CisgICAgICAgKiAgdGhpcyBmdW5jdGlvbiAobm8gYnVmZmVyIGFyZWEgd2lsbCBiZSB1c2VkKS4gIEZvciBhbiBleGFtcGxlLCBzZWUKKyAgICAgICAqICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JrMDFwdDExY2gyNS5odG1sCisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIGVvZigpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50X3R5cGUgCisgICAgICB1bmRlcmZsb3coKQorICAgICAgeyByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgRmV0Y2hlcyBtb3JlIGRhdGEgZnJvbSB0aGUgY29udHJvbGxlZCBzZXF1ZW5jZS4KKyAgICAgICAqICBAcmV0dXJuICBUaGUgZmlyc3QgY2hhcmFjdGVyIGZyb20gdGhlIDxlbT5wZW5kaW5nIHNlcXVlbmNlPC9lbT4uCisgICAgICAgKgorICAgICAgICogIEluZm9ybWFsbHksIHRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBAYyB1bmRlcmZsb3coKSwKKyAgICAgICAqICBhbmQgaW4gZmFjdCBpcyByZXF1aXJlZCB0byBjYWxsIHRoYXQgZnVuY3Rpb24uICBJdCBhbHNvIHJldHVybnMKKyAgICAgICAqICB0aGUgbmV3IGNoYXJhY3RlciwgbGlrZSBAYyB1bmRlcmZsb3coKSBkb2VzLiAgSG93ZXZlciwgdGhpcworICAgICAgICogIGZ1bmN0aW9uIGFsc28gbW92ZXMgdGhlIHJlYWQgcG9zaXRpb24gZm9yd2FyZCBieSBvbmUuCisgICAgICAqLworICAgICAgdmlydHVhbCBpbnRfdHlwZSAKKyAgICAgIHVmbG93KCkgCisgICAgICB7CisJaW50X3R5cGUgX19yZXQgPSB0cmFpdHNfdHlwZTo6ZW9mKCk7CisJY29uc3QgYm9vbCBfX3Rlc3Rlb2YgPSB0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUodGhpcy0+dW5kZXJmbG93KCksIAorCQkJCQkJCV9fcmV0KTsKKwlpZiAoIV9fdGVzdGVvZikKKwkgIHsKKwkgICAgX19yZXQgPSB0cmFpdHNfdHlwZTo6dG9faW50X3R5cGUoKnRoaXMtPmdwdHIoKSk7CisJICAgIHRoaXMtPmdidW1wKDEpOworCSAgfQorCXJldHVybiBfX3JldDsgICAgCisgICAgICB9CisKKyAgICAgIC8vIFsyNy41LjIuNC40XSBwdXRiYWNrCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFRyaWVzIHRvIGJhY2sgdXAgdGhlIGlucHV0IHNlcXVlbmNlLgorICAgICAgICogIEBwYXJhbSAgYyAgVGhlIGNoYXJhY3RlciB0byBiZSBpbnNlcnRlZCBiYWNrIGludG8gdGhlIHNlcXVlbmNlLgorICAgICAgICogIEByZXR1cm4gIGVvZigpIG9uIGZhaWx1cmUsIDxlbT5zb21lIG90aGVyIHZhbHVlPC9lbT4gb24gc3VjY2VzcworICAgICAgICogIEBwb3N0ICBUaGUgY29uc3RyYWludHMgb2YgQGMgZ3B0cigpLCBAYyBlYmFjaygpLCBhbmQgQGMgcHB0cigpCisgICAgICAgKiAgICAgICAgIGFyZSB0aGUgc2FtZSBhcyBmb3IgQGMgdW5kZXJmbG93KCkuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIGVvZigpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50X3R5cGUgCisgICAgICBwYmFja2ZhaWwoaW50X3R5cGUgLyogX19jICovICA9IHRyYWl0c190eXBlOjplb2YoKSkKKyAgICAgIHsgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsgfQorCisgICAgICAvLyBQdXQgYXJlYToKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgTXVsdGlwbGUgY2hhcmFjdGVyIGluc2VydGlvbi4KKyAgICAgICAqICBAcGFyYW0gIHMgIEEgYnVmZmVyIGFyZWEuCisgICAgICAgKiAgQHBhcmFtICBuICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlLgorICAgICAgICogIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLgorICAgICAgICoKKyAgICAgICAqICBXcml0ZXMgQGEgc1swXSB0aHJvdWdoIEBhIHNbbi0xXSB0byB0aGUgb3V0cHV0IHNlcXVlbmNlLCBhcyBpZgorICAgICAgICogIGJ5IEBjIHNwdXRjKCkuICBTdG9wcyB3aGVuIGVpdGhlciBAYSBuIGNoYXJhY3RlcnMgaGF2ZSBiZWVuCisgICAgICAgKiAgY29waWVkLCBvciB3aGVuIEBjIHNwdXRjKCkgd291bGQgcmV0dXJuIEBjIHRyYWl0czo6ZW9mKCkuCisgICAgICAgKgorICAgICAgICogIEl0IGlzIGV4cGVjdGVkIHRoYXQgZGVyaXZlZCBjbGFzc2VzIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAorICAgICAgICogIGltcGxlbWVudGF0aW9uIGJ5IG92ZXJyaWRpbmcgdGhpcyBkZWZpbml0aW9uLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSAKKyAgICAgIHhzcHV0bihjb25zdCBjaGFyX3R5cGUqIF9fcywgc3RyZWFtc2l6ZSBfX24pOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIENvbnN1bWVzIGRhdGEgZnJvbSB0aGUgYnVmZmVyOyB3cml0ZXMgdG8gdGhlCisgICAgICAgKiAgICAgICAgICBjb250cm9sbGVkIHNlcXVlbmNlLgorICAgICAgICogIEBwYXJhbSAgYyAgQW4gYWRkaXRpb25hbCBjaGFyYWN0ZXIgdG8gY29uc3VtZS4KKyAgICAgICAqICBAcmV0dXJuICBlb2YoKSB0byBpbmRpY2F0ZSBmYWlsdXJlLCBzb21ldGhpbmcgZWxzZSAodXN1YWxseQorICAgICAgICogICAgICAgICAgIEBhIGMsIG9yIG5vdF9lb2YoKSkKKyAgICAgICAqCisgICAgICAgKiAgSW5mb3JtYWxseSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICogIGlzIGZ1bGwgKG9yIGRvZXMgbm90IGV4aXN0LCBhcyBidWZmZXJpbmcgbmVlZCBub3QgYWN0dWFsbHkKKyAgICAgICAqICBiZSBkb25lKS4gIElmIGEgYnVmZmVyIGV4aXN0cywgaXQgaXMgQGEgY29uc3VtZWQsIHdpdGgKKyAgICAgICAqICA8ZW0+c29tZSBlZmZlY3Q8L2VtPiBvbiB0aGUgY29udHJvbGxlZCBzZXF1ZW5jZS4KKyAgICAgICAqICAoVHlwaWNhbGx5LCB0aGUgYnVmZmVyIGlzIHdyaXR0ZW4gb3V0IHRvIHRoZSBzZXF1ZW5jZQorICAgICAgICogIHZlcmJhdGltLikgIEluIGVpdGhlciBjYXNlLCB0aGUgY2hhcmFjdGVyIEBhIGMgaXMgYWxzbworICAgICAgICogIHdyaXR0ZW4gb3V0LCBpZiBAYSBjIGlzIG5vdCBAYyBlb2YoKS4KKyAgICAgICAqCisgICAgICAgKiAgRm9yIGEgZm9ybWFsIGRlZmluaXRpb24gb2YgdGhpcyBmdW5jdGlvbiwgc2VlIGEgZ29vZCB0ZXh0CisgICAgICAgKiAgc3VjaCBhcyBMYW5nZXIgJiBLcmVmdCwgb3IgWzI3LjUuMi40LjVdLzMtNy4KKyAgICAgICAqCisgICAgICAgKiAgQSBmdW5jdGlvbmluZyBvdXRwdXQgc3RyZWFtYnVmIGNhbiBiZSBjcmVhdGVkIGJ5IG92ZXJyaWRpbmcgb25seQorICAgICAgICogIHRoaXMgZnVuY3Rpb24gKG5vIGJ1ZmZlciBhcmVhIHdpbGwgYmUgdXNlZCkuCisgICAgICAgKgorICAgICAgICogIEBub3RlICBCYXNlIGNsYXNzIHZlcnNpb24gZG9lcyBub3RoaW5nLCByZXR1cm5zIGVvZigpLgorICAgICAgKi8KKyAgICAgIHZpcnR1YWwgaW50X3R5cGUgCisgICAgICBvdmVyZmxvdyhpbnRfdHlwZSAvKiBfX2MgKi8gPSB0cmFpdHNfdHlwZTo6ZW9mKCkpCisgICAgICB7IHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7IH0KKworI2lmIF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgLy8gQW5uZXggRC42CisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBUb3NzZXMgYSBjaGFyYWN0ZXIuCisgICAgICAgKgorICAgICAgICogIEFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIsIGlnbm9yaW5nIHRoZSBjaGFyYWN0ZXIgdGhhdCB3b3VsZCBoYXZlCisgICAgICAgKiAgYmVlbiByZWFkLgorICAgICAgICoKKyAgICAgICAqICBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDAyLTA1L21zZzAwMTY4Lmh0bWwKKyAgICAgICAqLworICAgICAgdm9pZCAKKyAgICAgIHN0b3NzYygpIAorICAgICAgeworCWlmICh0aGlzLT5ncHRyKCkgPCB0aGlzLT5lZ3B0cigpKSAKKwkgIHRoaXMtPmdidW1wKDEpOworCWVsc2UgCisJICB0aGlzLT51ZmxvdygpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIC8vIEFsc28gdXNlZCBieSBzcGVjaWFsaXphdGlvbnMgZm9yIGNoYXIgYW5kIHdjaGFyX3QgaW4gc3JjLgorICAgICAgdm9pZCAKKyAgICAgIF9fc2FmZV9nYnVtcChzdHJlYW1zaXplIF9fbikgeyBfTV9pbl9jdXIgKz0gX19uOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9fc2FmZV9wYnVtcChzdHJlYW1zaXplIF9fbikgeyBfTV9vdXRfY3VyICs9IF9fbjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIFNpZGUgZWZmZWN0IG9mIERSIDUwLiAKKyAgICAgIGJhc2ljX3N0cmVhbWJ1Zihjb25zdCBfX3N0cmVhbWJ1Zl90eXBlJiBfX3NiKQorICAgICAgOiBfTV9pbl9iZWcoX19zYi5fTV9pbl9iZWcpLCBfTV9pbl9jdXIoX19zYi5fTV9pbl9jdXIpLCAKKyAgICAgIF9NX2luX2VuZChfX3NiLl9NX2luX2VuZCksIF9NX291dF9iZWcoX19zYi5fTV9vdXRfYmVnKSwgCisgICAgICBfTV9vdXRfY3VyKF9fc2IuX01fb3V0X2N1ciksIF9NX291dF9lbmQoX19zYi5fTV9vdXRfY3VyKSwKKyAgICAgIF9NX2J1Zl9sb2NhbGUoX19zYi5fTV9idWZfbG9jYWxlKSAKKyAgICAgIHsgfQorCisgICAgICBfX3N0cmVhbWJ1Zl90eXBlJiAKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3N0cmVhbWJ1Zl90eXBlJikgeyByZXR1cm4gKnRoaXM7IH07CisgICAgfTsKKworICAvLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBkZWNsYXJhdGlvbnMsIGRlZmluZWQgaW4gc3JjL3N0cmVhbWJ1Zi5jYy4KKyAgdGVtcGxhdGU8PgorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmc19lb2YoYmFzaWNfc3RyZWFtYnVmPGNoYXI+KiBfX3NiaW4sCisJCQkgIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPiogX19zYm91dCwgYm9vbCYgX19pbmVvZik7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdGVtcGxhdGU8PgorICAgIHN0cmVhbXNpemUKKyAgICBfX2NvcHlfc3RyZWFtYnVmc19lb2YoYmFzaWNfc3RyZWFtYnVmPHdjaGFyX3Q+KiBfX3NiaW4sCisJCQkgIGJhc2ljX3N0cmVhbWJ1Zjx3Y2hhcl90PiogX19zYm91dCwgYm9vbCYgX19pbmVvZik7CisjZW5kaWYKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy9zdHJlYW1idWYudGNjPgorCisjZW5kaWYgLyogX0dMSUJDWFhfU1RSRUFNQlVGICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3N0cmluZyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3RyaW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTMzOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3N0cmluZwpAQCAtMCwwICsxLDU3IEBACisvLyBDb21wb25lbnRzIGZvciBtYW5pcHVsYXRpbmcgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorLy8gMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvc3RyaW5nCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjEgIFN0cmluZ3MgbGlicmFyeQorLy8KKworI2lmbmRlZiBfR0xJQkNYWF9TVFJJTkcKKyNkZWZpbmUgX0dMSUJDWFhfU1RSSU5HCTEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0cmluZ2Z3ZC5oPgorI2luY2x1ZGUgPGJpdHMvY2hhcl90cmFpdHMuaD4gIC8vIE5COiBJbiB0dXJuIGluY2x1ZGVzIHN0bF9hbGdvYmFzZS5oCisjaW5jbHVkZSA8Yml0cy9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL2NwcF90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvbG9jYWxlZndkLmg+ICAgIC8vIEZvciBvcGVyYXRvcnMgPj4sIDw8LCBhbmQgZ2V0bGluZS4KKyNpbmNsdWRlIDxiaXRzL29zdHJlYW1faW5zZXJ0Lmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfaXRlcmF0b3JfYmFzZV90eXBlcy5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2l0ZXJhdG9yX2Jhc2VfZnVuY3MuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9pdGVyYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+IC8vIEZvciBsZXNzCisjaW5jbHVkZSA8ZXh0L251bWVyaWNfdHJhaXRzLmg+IAorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+IAorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisjaW5jbHVkZSA8Yml0cy9iYXNpY19zdHJpbmcuaD4KKyNpbmNsdWRlIDxiaXRzL2Jhc2ljX3N0cmluZy50Y2M+IAorCisjZW5kaWYgLyogX0dMSUJDWFhfU1RSSU5HICovCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3N5c3RlbV9lcnJvciBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvc3lzdGVtX2Vycm9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjA3MGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3N5c3RlbV9lcnJvcgpAQCAtMCwwICsxLDM3NiBAQAorLy8gPHN5c3RlbV9lcnJvcj4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBpbmNsdWRlL3N5c3RlbV9lcnJvcgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9TWVNURU1fRVJST1IKKyNkZWZpbmUgX0dMSUJDWFhfU1lTVEVNX0VSUk9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWZuZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGJpdHMvYysrMHhfd2FybmluZy5oPgorI2Vsc2UKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9lcnJvcl9jb25zdGFudHMuaD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgY2xhc3MgZXJyb3JfY29kZTsKKyAgY2xhc3MgZXJyb3JfY29uZGl0aW9uOworICBjbGFzcyBlcnJvcl9jYXRlZ29yeTsKKyAgY2xhc3Mgc3lzdGVtX2Vycm9yOworCisgIC8vLyBpc19lcnJvcl9jb2RlX2VudW0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19lcnJvcl9jb2RlX2VudW0gOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgLy8vIGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZXJyb3JfY29uZGl0aW9uX2VudW0gOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8PiAKKyAgICBzdHJ1Y3QgaXNfZXJyb3JfY29uZGl0aW9uX2VudW08ZXJyYz4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisKKyAgLy8vIGVycm9yX2NhdGVnb3J5CisgIGNsYXNzIGVycm9yX2NhdGVnb3J5CisgIHsKKyAgcHJvdGVjdGVkOgorICAgIGVycm9yX2NhdGVnb3J5KCk7CisKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfmVycm9yX2NhdGVnb3J5KCk7CisKKyAgICBlcnJvcl9jYXRlZ29yeShjb25zdCBlcnJvcl9jYXRlZ29yeSYpID0gZGVsZXRlOworICAgIGVycm9yX2NhdGVnb3J5JiBvcGVyYXRvcj0oY29uc3QgZXJyb3JfY2F0ZWdvcnkmKSA9IGRlbGV0ZTsKKworICAgIHZpcnR1YWwgY29uc3QgY2hhciogCisgICAgbmFtZSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3RyaW5nIAorICAgIG1lc3NhZ2UoaW50KSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGVycm9yX2NvbmRpdGlvbgorICAgIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKGludCBfX2kpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIAorICAgIGVxdWl2YWxlbnQoaW50IF9faSwgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX2NvbmQpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIAorICAgIGVxdWl2YWxlbnQoY29uc3QgZXJyb3JfY29kZSYgX19jb2RlLCBpbnQgX19pKSBjb25zdDsKKworICAgIGJvb2wgCisgICAgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX290aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIGxlc3M8Y29uc3QgZXJyb3JfY2F0ZWdvcnkqPigpKHRoaXMsICZfX290aGVyKTsgfQorCisgICAgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX290aGVyKSBjb25zdAorICAgIHsgcmV0dXJuIHRoaXMgPT0gJl9fb3RoZXI7IH0KKworICAgIGJvb2wgCisgICAgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19vdGhlcikgY29uc3QKKyAgICB7IHJldHVybiB0aGlzICE9ICZfX290aGVyOyB9CisgIH07CisKKyAgLy8gRFIgODkwLgorICBfR0xJQkNYWF9DT05TVCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgc3lzdGVtX2NhdGVnb3J5KCkgdGhyb3coKTsKKyAgX0dMSUJDWFhfQ09OU1QgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIGdlbmVyaWNfY2F0ZWdvcnkoKSB0aHJvdygpOworCisgIGVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKGVycmMpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDsKKworICAvLy8gZXJyb3JfY29kZQorICAvLyBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBlcnJvciBpZGVudGlmaWNhdGlvbgorICBzdHJ1Y3QgZXJyb3JfY29kZQorICB7CisgICAgZXJyb3JfY29kZSgpCisgICAgOiBfTV92YWx1ZSgwKSwgX01fY2F0KCZzeXN0ZW1fY2F0ZWdvcnkoKSkgeyB9CisKKyAgICBlcnJvcl9jb2RlKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkKKyAgICA6IF9NX3ZhbHVlKF9fdiksIF9NX2NhdCgmX19jYXQpIHsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Vycm9yQ29kZUVudW0+CisgICAgICBlcnJvcl9jb2RlKF9FcnJvckNvZGVFbnVtIF9fZSwKKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb2RlX2VudW08X0Vycm9yQ29kZUVudW0+Ojp2YWx1ZT46OnR5cGUqID0gMCkKKyAgICAgIHsgKnRoaXMgPSBtYWtlX2Vycm9yX2NvZGUoX19lKTsgfQorCisgICAgdm9pZCAKKyAgICBhc3NpZ24oaW50IF9fdiwgY29uc3QgZXJyb3JfY2F0ZWdvcnkmIF9fY2F0KQorICAgIHsKKyAgICAgIF9NX3ZhbHVlID0gX192OworICAgICAgX01fY2F0ID0gJl9fY2F0OyAKKyAgICB9CisKKyAgICB2b2lkIAorICAgIGNsZWFyKCkKKyAgICB7IGFzc2lnbigwLCBzeXN0ZW1fY2F0ZWdvcnkoKSk7IH0KKworICAgIC8vIERSIDgwNC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXJyb3JDb2RlRW51bT4KKyAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19lcnJvcl9jb2RlX2VudW08X0Vycm9yQ29kZUVudW0+Ojp2YWx1ZSwKKwkJCSBlcnJvcl9jb2RlJj46OnR5cGUKKyAgICAgIG9wZXJhdG9yPShfRXJyb3JDb2RlRW51bSBfX2UpCisgICAgICB7IHJldHVybiAqdGhpcyA9IG1ha2VfZXJyb3JfY29kZShfX2UpOyB9CisKKyAgICBpbnQKKyAgICB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CisgICAgICAKKyAgICBjb25zdCBlcnJvcl9jYXRlZ29yeSYgIAorICAgIGNhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gKl9NX2NhdDsgfQorCisgICAgZXJyb3JfY29uZGl0aW9uIAorICAgIGRlZmF1bHRfZXJyb3JfY29uZGl0aW9uKCkgY29uc3Q7CisKKyAgICBzdHJpbmcgCisgICAgbWVzc2FnZSgpIGNvbnN0CisgICAgeyByZXR1cm4gY2F0ZWdvcnkoKS5tZXNzYWdlKHZhbHVlKCkpOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV92YWx1ZSAhPSAwID8gdHJ1ZSA6IGZhbHNlOyB9CisKKyAgICAvLyBEUiA4MDQuCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIGhhc2g8ZXJyb3JfY29kZT47CisKKyAgICBpbnQgICAgICAgICAgICAJCV9NX3ZhbHVlOworICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5KiAJX01fY2F0OworICB9OworCisgIC8vIDE5LjQuMi42IG5vbi1tZW1iZXIgZnVuY3Rpb25zCisgIGlubGluZSBlcnJvcl9jb2RlCisgIG1ha2VfZXJyb3JfY29kZShlcnJjIF9fZSkKKyAgeyByZXR1cm4gZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGdlbmVyaWNfY2F0ZWdvcnkoKSk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcjwoY29uc3QgZXJyb3JfY29kZSYgX19saHMsIGNvbnN0IGVycm9yX2NvZGUmIF9fcmhzKQorICB7IAorICAgIHJldHVybiAoX19saHMuY2F0ZWdvcnkoKSA8IF9fcmhzLmNhdGVnb3J5KCkKKwkgICAgfHwgKF9fbGhzLmNhdGVnb3J5KCkgPT0gX19yaHMuY2F0ZWdvcnkoKQorCQkmJiBfX2xocy52YWx1ZSgpIDwgX19yaHMudmFsdWUoKSkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KGJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywgY29uc3QgZXJyb3JfY29kZSYgX19lKQorICAgIHsgcmV0dXJuIChfX29zIDw8IF9fZS5jYXRlZ29yeSgpLm5hbWUoKSA8PCAnOicgPDwgX19lLnZhbHVlKCkpOyB9CisKKyAgZXJyb3JfY29uZGl0aW9uIG1ha2VfZXJyb3JfY29uZGl0aW9uKGVycmMpOworCisgIC8vLyBlcnJvcl9jb25kaXRpb24KKyAgLy8gUG9ydGFibGUgZXJyb3IgaWRlbnRpZmljYXRpb24KKyAgc3RydWN0IGVycm9yX2NvbmRpdGlvbiAKKyAgeworICAgIGVycm9yX2NvbmRpdGlvbigpCisgICAgOiBfTV92YWx1ZSgwKSwgX01fY2F0KCZnZW5lcmljX2NhdGVnb3J5KCkpIHsgfQorCisgICAgZXJyb3JfY29uZGl0aW9uKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2NhdCkgICAgIAorICAgIDogX01fdmFsdWUoX192KSwgX01fY2F0KCZfX2NhdCkgeyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRXJyb3JDb25kaXRpb25FbnVtPgorICAgICAgZXJyb3JfY29uZGl0aW9uKF9FcnJvckNvbmRpdGlvbkVudW0gX19lLAorCQkgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfZXJyb3JfY29uZGl0aW9uX2VudW0KKwkJICAgICAgICAgICAgICAgICAgICAgIDxfRXJyb3JDb25kaXRpb25FbnVtPjo6dmFsdWU+Ojp0eXBlKiA9IDApCisgICAgICB7ICp0aGlzID0gbWFrZV9lcnJvcl9jb25kaXRpb24oX19lKTsgfQorCisgICAgdm9pZAorICAgIGFzc2lnbihpbnQgX192LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19jYXQpCisgICAgeworICAgICAgX01fdmFsdWUgPSBfX3Y7CisgICAgICBfTV9jYXQgPSAmX19jYXQ7CisgICAgfQorCisgICAgLy8gRFIgODA0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9FcnJvckNvbmRpdGlvbkVudW0+CisgICAgICB0eXBlbmFtZSBlbmFibGVfaWY8aXNfZXJyb3JfY29uZGl0aW9uX2VudW0KKwkJCSA8X0Vycm9yQ29uZGl0aW9uRW51bT46OnZhbHVlLCBlcnJvcl9jb25kaXRpb24mPjo6dHlwZQorICAgICAgb3BlcmF0b3I9KF9FcnJvckNvbmRpdGlvbkVudW0gX19lKQorICAgICAgeyByZXR1cm4gKnRoaXMgPSBtYWtlX2Vycm9yX2NvbmRpdGlvbihfX2UpOyB9CisKKyAgICB2b2lkIAorICAgIGNsZWFyKCkKKyAgICB7IGFzc2lnbigwLCBnZW5lcmljX2NhdGVnb3J5KCkpOyB9CisKKyAgICAvLyAxOS40LjMuNCBvYnNlcnZlcnMKKyAgICBpbnQgCisgICAgdmFsdWUoKSBjb25zdCB7IHJldHVybiBfTV92YWx1ZTsgfQorCisgICAgY29uc3QgZXJyb3JfY2F0ZWdvcnkmCisgICAgY2F0ZWdvcnkoKSBjb25zdCB7IHJldHVybiAqX01fY2F0OyB9CisKKyAgICBzdHJpbmcgCisgICAgbWVzc2FnZSgpIGNvbnN0CisgICAgeyByZXR1cm4gY2F0ZWdvcnkoKS5tZXNzYWdlKHZhbHVlKCkpOyB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICB7IHJldHVybiBfTV92YWx1ZSAhPSAwID8gdHJ1ZSA6IGZhbHNlOyB9CisKKyAgICAvLyBEUiA4MDQuCisgIHByaXZhdGU6CisgICAgaW50IAkJCV9NX3ZhbHVlOworICAgIGNvbnN0IGVycm9yX2NhdGVnb3J5KiAJX01fY2F0OworICB9OworCisgIC8vIDE5LjQuMy42IG5vbi1tZW1iZXIgZnVuY3Rpb25zCisgIGlubGluZSBlcnJvcl9jb25kaXRpb24KKyAgbWFrZV9lcnJvcl9jb25kaXRpb24oZXJyYyBfX2UpCisgIHsgcmV0dXJuIGVycm9yX2NvbmRpdGlvbihzdGF0aWNfY2FzdDxpbnQ+KF9fZSksIGdlbmVyaWNfY2F0ZWdvcnkoKSk7IH0KKworICBpbmxpbmUgYm9vbCAKKyAgb3BlcmF0b3I8KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19yaHMpCisgIHsKKyAgICByZXR1cm4gKF9fbGhzLmNhdGVnb3J5KCkgPCBfX3Jocy5jYXRlZ29yeSgpCisJICAgIHx8IChfX2xocy5jYXRlZ29yeSgpID09IF9fcmhzLmNhdGVnb3J5KCkKKwkJJiYgX19saHMudmFsdWUoKSA8IF9fcmhzLnZhbHVlKCkpKTsKKyAgfQorCisgIC8vIDE5LjQuNCBDb21wYXJpc29uIG9wZXJhdG9ycworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvZGUmIF9fbGhzLCBjb25zdCBlcnJvcl9jb2RlJiBfX3JocykKKyAgeyByZXR1cm4gKF9fbGhzLmNhdGVnb3J5KCkgPT0gX19yaHMuY2F0ZWdvcnkoKQorCSAgICAmJiBfX2xocy52YWx1ZSgpID09IF9fcmhzLnZhbHVlKCkpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I9PShjb25zdCBlcnJvcl9jb2RlJiBfX2xocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3JocykKKyAgeworICAgIHJldHVybiAoX19saHMuY2F0ZWdvcnkoKS5lcXVpdmFsZW50KF9fbGhzLnZhbHVlKCksIF9fcmhzKQorCSAgICB8fCBfX3Jocy5jYXRlZ29yeSgpLmVxdWl2YWxlbnQoX19saHMsIF9fcmhzLnZhbHVlKCkpKTsKKyAgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yPT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX2xocywgY29uc3QgZXJyb3JfY29kZSYgX19yaHMpCisgIHsKKyAgICByZXR1cm4gKF9fcmhzLmNhdGVnb3J5KCkuZXF1aXZhbGVudChfX3Jocy52YWx1ZSgpLCBfX2xocykKKwkgICAgfHwgX19saHMuY2F0ZWdvcnkoKS5lcXVpdmFsZW50KF9fcmhzLCBfX2xocy52YWx1ZSgpKSk7CisgIH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcj09KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsIGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19yaHMpCisgIHsKKyAgICByZXR1cm4gKF9fbGhzLmNhdGVnb3J5KCkgPT0gX19yaHMuY2F0ZWdvcnkoKQorCSAgICAmJiBfX2xocy52YWx1ZSgpID09IF9fcmhzLnZhbHVlKCkpOworICB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb2RlJiBfX2xocywgY29uc3QgZXJyb3JfY29kZSYgX19yaHMpCisgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPShjb25zdCBlcnJvcl9jb2RlJiBfX2xocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3JocykKKyAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvciE9KGNvbnN0IGVycm9yX2NvbmRpdGlvbiYgX19saHMsIGNvbnN0IGVycm9yX2NvZGUmIF9fcmhzKQorICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgIGlubGluZSBib29sCisgIG9wZXJhdG9yIT0oY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX2xocywgY29uc3QgZXJyb3JfY29uZGl0aW9uJiBfX3JocykKKyAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworCisgIC8qKiAKKyAgICogIEBicmllZiBUaHJvd24gdG8gaW5kaWNhdGUgZXJyb3IgY29kZSBvZiB1bmRlcmx5aW5nIHN5c3RlbS4KKyAgICoKKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIHN5c3RlbV9lcnJvciA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IKKyAgeworICBwcml2YXRlOgorICAgIGVycm9yX2NvZGUgCV9NX2NvZGU7CisKKyAgcHVibGljOgorICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMgPSBlcnJvcl9jb2RlKCkpCisgICAgOiBydW50aW1lX2Vycm9yKF9fZWMubWVzc2FnZSgpKSwgX01fY29kZShfX2VjKSB7IH0KKworICAgIHN5c3RlbV9lcnJvcihlcnJvcl9jb2RlIF9fZWMsIGNvbnN0IHN0cmluZyYgX193aGF0KQorICAgIDogcnVudGltZV9lcnJvcihfX3doYXQgKyAiOiAiICsgX19lYy5tZXNzYWdlKCkpLCBfTV9jb2RlKF9fZWMpIHsgfQorCisgICAgLyoKKyAgICAgKiBUT0RPOiBBZGQgY29uc3QgY2hhciogY3RvcnMgdG8gYWxsIGV4Y2VwdGlvbnMuCisgICAgICoKKyAgICAgKiBzeXN0ZW1fZXJyb3IoZXJyb3JfY29kZSBfX2VjLCBjb25zdCBjaGFyKiBfX3doYXQpCisgICAgICogOiBydW50aW1lX2Vycm9yKF9fd2hhdCArICgiOiAiICsgX19lYy5tZXNzYWdlKCkpKSwgX01fY29kZShfX2VjKSB7IH0KKyAgICAgKgorICAgICAqIHN5c3RlbV9lcnJvcihpbnQgX192LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBjaGFyKiBfX3doYXQpCisgICAgICogOiBydW50aW1lX2Vycm9yKF9fd2hhdCArICgiOiAiICsgX19lYy5tZXNzYWdlKCkpKSwKKyAgICAgKiAgIF9NX2NvZGUoZXJyb3JfY29kZShfX3YsIF9fZWNhdCkpIHsgfQorICAgICAqLworCisgICAgc3lzdGVtX2Vycm9yKGludCBfX3YsIGNvbnN0IGVycm9yX2NhdGVnb3J5JiBfX2VjYXQpCisgICAgOiBydW50aW1lX2Vycm9yKGVycm9yX2NvZGUoX192LCBfX2VjYXQpLm1lc3NhZ2UoKSksCisgICAgICBfTV9jb2RlKF9fdiwgX19lY2F0KSB7IH0KKworICAgIHN5c3RlbV9lcnJvcihpbnQgX192LCBjb25zdCBlcnJvcl9jYXRlZ29yeSYgX19lY2F0LCBjb25zdCBzdHJpbmcmIF9fd2hhdCkKKyAgICA6IHJ1bnRpbWVfZXJyb3IoX193aGF0ICsgIjogIiArIGVycm9yX2NvZGUoX192LCBfX2VjYXQpLm1lc3NhZ2UoKSksCisgICAgICBfTV9jb2RlKF9fdiwgX19lY2F0KSB7IH0KKworICAgIHZpcnR1YWwgfnN5c3RlbV9lcnJvcigpIHRocm93KCk7CisKKyAgICBjb25zdCBlcnJvcl9jb2RlJiAKKyAgICBjb2RlKCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBfTV9jb2RlOyB9CisgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2lmbmRlZiBfR0xJQkNYWF9DT01QQVRJQklMSVRZX0NYWDBYCisKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gRFIgMTE4Mi4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgZXJyb3JfY29kZS4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPGVycm9yX2NvZGU+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCBlcnJvcl9jb2RlPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCBlcnJvcl9jb2RlJiBfX2UpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fdG1wID0gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9fZS5fTV92YWx1ZSk7CisJcmV0dXJuIHN0ZDo6X0hhc2hfaW1wbDo6X19oYXNoX2NvbWJpbmUoX19lLl9NX2NhdCwgX190bXApOworICAgICAgfQorICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9HTElCQ1hYX0NPTVBBVElCSUxJVFlfQ1hYMFgKKworI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9TWVNURU1fRVJST1IKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdGdtYXRoLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RnbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODRkMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RnbWF0aC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIC0qLSBDKysgLSotIGNvbXBhdGliaWxpdHkgaGVhZGVyLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRnbWF0aC5oCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjIGluY2x1ZGUgPGN0Z21hdGg+CisjZWxzZQorIyBpZiBfR0xJQkNYWF9IQVZFX1RHTUFUSF9ICisjICBpbmNsdWRlX25leHQgPHRnbWF0aC5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfVEdNQVRIX0gKKyNkZWZpbmUgX0dMSUJDWFhfVEdNQVRIX0ggMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdGhyZWFkIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90aHJlYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxMDJmYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdGhyZWFkCkBAIC0wLDAgKzEsMzAxIEBACisvLyA8dGhyZWFkPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdGhyZWFkCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RIUkVBRAorI2RlZmluZSBfR0xJQkNYWF9USFJFQUQgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjaW5jbHVkZSA8Yml0cy9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDxiaXRzL2d0aHIuaD4KKworI2lmIGRlZmluZWQoX0dMSUJDWFhfSEFTX0dUSFJFQURTKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAZGVmZ3JvdXAgdGhyZWFkcyBUaHJlYWRzCisgICAqIEBpbmdyb3VwIGNvbmN1cnJlbmN5CisgICAqCisgICAqIENsYXNzZXMgZm9yIHRocmVhZCBzdXBwb3J0LgorICAgKiBAeworICAgKi8KKworICAvLy8gdGhyZWFkCisgIGNsYXNzIHRocmVhZAorICB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIF9fZ3RocmVhZF90CQkJbmF0aXZlX2hhbmRsZV90eXBlOworICAgIHN0cnVjdCBfSW1wbF9iYXNlOworICAgIHR5cGVkZWYgc2hhcmVkX3B0cjxfSW1wbF9iYXNlPglfX3NoYXJlZF9iYXNlX3R5cGU7CisKKyAgICAvLy8gdGhyZWFkOjppZAorICAgIGNsYXNzIGlkCisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90eXBlCV9NX3RocmVhZDsKKworICAgIHB1YmxpYzoKKyAgICAgIGlkKCkgOiBfTV90aHJlYWQoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGlkKG5hdGl2ZV9oYW5kbGVfdHlwZSBfX2lkKSA6IF9NX3RocmVhZChfX2lkKSB7IH0KKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgdGhyZWFkOworICAgICAgZnJpZW5kIGNsYXNzIGhhc2g8dGhyZWFkOjppZD47CisKKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkKKyAgICAgIHsgcmV0dXJuIF9fZ3RocmVhZF9lcXVhbChfX3guX01fdGhyZWFkLCBfX3kuX01fdGhyZWFkKTsgfQorCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I8KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkKKyAgICAgIHsgcmV0dXJuIF9feC5fTV90aHJlYWQgPCBfX3kuX01fdGhyZWFkOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9DaGFyVCwgY2xhc3MgX1RyYWl0cz4KKwlmcmllbmQgYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorCW9wZXJhdG9yPDwoYmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX291dCwgdGhyZWFkOjppZCBfX2lkKTsKKyAgICB9OworCisgICAgLy8gU2ltcGxlIGJhc2UgdHlwZSB0aGF0IHRoZSB0ZW1wbGF0aXplZCwgZGVyaXZlZCBjbGFzcyBjb250YWluaW5nCisgICAgLy8gYW4gYXJiaXRyYXJ5IGZ1bmN0b3IgY2FuIGJlIGNvbnZlcnRlZCB0byBhbmQgY2FsbGVkLgorICAgIHN0cnVjdCBfSW1wbF9iYXNlCisgICAgeworICAgICAgX19zaGFyZWRfYmFzZV90eXBlCV9NX3RoaXNfcHRyOworCisgICAgICBpbmxpbmUgdmlydHVhbCB+X0ltcGxfYmFzZSgpOworCisgICAgICB2aXJ0dWFsIHZvaWQgX01fcnVuKCkgPSAwOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGU+CisgICAgICBzdHJ1Y3QgX0ltcGwgOiBwdWJsaWMgX0ltcGxfYmFzZQorICAgICAgeworCV9DYWxsYWJsZQkJX01fZnVuYzsKKworCV9JbXBsKF9DYWxsYWJsZSYmIF9fZikgOiBfTV9mdW5jKHN0ZDo6Zm9yd2FyZDxfQ2FsbGFibGU+KF9fZikpCisJeyB9CisKKwl2b2lkCisJX01fcnVuKCkgeyBfTV9mdW5jKCk7IH0KKyAgICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBpZAkJCQlfTV9pZDsKKworICBwdWJsaWM6CisgICAgdGhyZWFkKCkgPSBkZWZhdWx0OworICAgIHRocmVhZCh0aHJlYWQmKSA9IGRlbGV0ZTsKKyAgICB0aHJlYWQoY29uc3QgdGhyZWFkJikgPSBkZWxldGU7CisKKyAgICB0aHJlYWQodGhyZWFkJiYgX190KQorICAgIHsgc3dhcChfX3QpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2FsbGFibGUsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgZXhwbGljaXQgCisgICAgICB0aHJlYWQoX0NhbGxhYmxlJiYgX19mLCBfQXJncyYmLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX01fc3RhcnRfdGhyZWFkKF9NX21ha2Vfcm91dGluZShzdGQ6OmJpbmQ8dm9pZD4oCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPF9DYWxsYWJsZT4oX19mKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4pKSk7CisgICAgICB9CisKKyAgICB+dGhyZWFkKCkKKyAgICB7CisgICAgICBpZiAoam9pbmFibGUoKSkKKwlzdGQ6OnRlcm1pbmF0ZSgpOworICAgIH0KKworICAgIHRocmVhZCYgb3BlcmF0b3I9KGNvbnN0IHRocmVhZCYpID0gZGVsZXRlOworCisgICAgdGhyZWFkJiBvcGVyYXRvcj0odGhyZWFkJiYgX190KQorICAgIHsKKyAgICAgIGlmIChqb2luYWJsZSgpKQorCXN0ZDo6dGVybWluYXRlKCk7CisgICAgICBzd2FwKF9fdCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZAorICAgIHN3YXAodGhyZWFkJiBfX3QpCisgICAgeyBzdGQ6OnN3YXAoX01faWQsIF9fdC5fTV9pZCk7IH0KKworICAgIGJvb2wKKyAgICBqb2luYWJsZSgpIGNvbnN0CisgICAgeyByZXR1cm4gIShfTV9pZCA9PSBpZCgpKTsgfQorCisgICAgdm9pZAorICAgIGpvaW4oKTsKKworICAgIHZvaWQKKyAgICBkZXRhY2goKTsKKworICAgIHRocmVhZDo6aWQKKyAgICBnZXRfaWQoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX2lkOyB9CisKKyAgICAvKiogQHByZSB0aHJlYWQgaXMgam9pbmFibGUKKyAgICAgKi8KKyAgICBuYXRpdmVfaGFuZGxlX3R5cGUKKyAgICBuYXRpdmVfaGFuZGxlKCkKKyAgICB7IHJldHVybiBfTV9pZC5fTV90aHJlYWQ7IH0KKworICAgIC8vIFJldHVybnMgYSB2YWx1ZSB0aGF0IGhpbnRzIGF0IHRoZSBudW1iZXIgb2YgaGFyZHdhcmUgdGhyZWFkIGNvbnRleHRzLgorICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyAgICBoYXJkd2FyZV9jb25jdXJyZW5jeSgpCisgICAgeyByZXR1cm4gMDsgfQorCisgIHByaXZhdGU6CisgICAgdm9pZAorICAgIF9NX3N0YXJ0X3RocmVhZChfX3NoYXJlZF9iYXNlX3R5cGUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NhbGxhYmxlPgorICAgICAgc2hhcmVkX3B0cjxfSW1wbDxfQ2FsbGFibGU+PgorICAgICAgX01fbWFrZV9yb3V0aW5lKF9DYWxsYWJsZSYmIF9fZikKKyAgICAgIHsKKwkvLyBDcmVhdGUgYW5kIGFsbG9jYXRlIGZ1bGwgZGF0YSBzdHJ1Y3R1cmUsIG5vdCBiYXNlLgorCXJldHVybiBtYWtlX3NoYXJlZDxfSW1wbDxfQ2FsbGFibGU+PihzdGQ6OmZvcndhcmQ8X0NhbGxhYmxlPihfX2YpKTsKKyAgICAgIH0KKyAgfTsKKworICBpbmxpbmUgdGhyZWFkOjpfSW1wbF9iYXNlOjp+X0ltcGxfYmFzZSgpID0gZGVmYXVsdDsKKworICBpbmxpbmUgdm9pZAorICBzd2FwKHRocmVhZCYgX194LCB0aHJlYWQmIF9feSkKKyAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3IhPSh0aHJlYWQ6OmlkIF9feCwgdGhyZWFkOjppZCBfX3kpCisgIHsgcmV0dXJuICEoX194ID09IF9feSk7IH0KKworICBpbmxpbmUgYm9vbAorICBvcGVyYXRvcjw9KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkKKyAgeyByZXR1cm4gIShfX3kgPCBfX3gpOyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I+KHRocmVhZDo6aWQgX194LCB0aHJlYWQ6OmlkIF9feSkKKyAgeyByZXR1cm4gX195IDwgX194OyB9CisKKyAgaW5saW5lIGJvb2wKKyAgb3BlcmF0b3I+PSh0aHJlYWQ6OmlkIF9feCwgdGhyZWFkOjppZCBfX3kpCisgIHsgcmV0dXJuICEoX194IDwgX195KTsgfQorCisgIC8vIERSIDg4OS4KKyAgLy8vIHN0ZDo6aGFzaCBzcGVjaWFsaXphdGlvbiBmb3IgdGhyZWFkOjppZC4KKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBoYXNoPHRocmVhZDo6aWQ+CisgICAgOiBwdWJsaWMgX19oYXNoX2Jhc2U8c2l6ZV90LCB0aHJlYWQ6OmlkPgorICAgIHsKKyAgICAgIHNpemVfdAorICAgICAgb3BlcmF0b3IoKShjb25zdCB0aHJlYWQ6OmlkJiBfX2lkKSBjb25zdCBub2V4Y2VwdAorICAgICAgeyByZXR1cm4gc3RkOjpfSGFzaF9pbXBsOjpoYXNoKF9faWQuX01fdGhyZWFkKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfVHJhaXRzPgorICAgIGlubGluZSBiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3V0LCB0aHJlYWQ6OmlkIF9faWQpCisgICAgeworICAgICAgaWYgKF9faWQgPT0gdGhyZWFkOjppZCgpKQorCXJldHVybiBfX291dCA8PCAidGhyZWFkOjppZCBvZiBhIG5vbi1leGVjdXRpbmcgdGhyZWFkIjsKKyAgICAgIGVsc2UKKwlyZXR1cm4gX19vdXQgPDwgX19pZC5fTV90aHJlYWQ7CisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKiogQG5hbWVzcGFjZSBzdGQ6OnRoaXNfdGhyZWFkCisgICAqICBAYnJpZWYgSVNPIEMrKyAweCBlbnRpdGllcyBzdWIgbmFtZXNwYWNlIGZvciB0aHJlYWQuCisgICAqICAzMC4yLjIgTmFtZXNwYWNlIHRoaXNfdGhyZWFkLgorICAgKi8KKyAgbmFtZXNwYWNlIHRoaXNfdGhyZWFkCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vLyBnZXRfaWQKKyAgICBpbmxpbmUgdGhyZWFkOjppZAorICAgIGdldF9pZCgpIHsgcmV0dXJuIHRocmVhZDo6aWQoX19ndGhyZWFkX3NlbGYoKSk7IH0KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9TQ0hFRF9ZSUVMRAorICAgIC8vLyB5aWVsZAorICAgIGlubGluZSB2b2lkCisgICAgeWllbGQoKQorICAgIHsgX19ndGhyZWFkX3lpZWxkKCk7IH0KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX05BTk9TTEVFUAorICAgIC8vLyBzbGVlcF91bnRpbAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DbG9jaywgdHlwZW5hbWUgX0R1cmF0aW9uPgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNsZWVwX3VudGlsKGNvbnN0IGNocm9ubzo6dGltZV9wb2ludDxfQ2xvY2ssIF9EdXJhdGlvbj4mIF9fYXRpbWUpCisgICAgICB7IHNsZWVwX2ZvcihfX2F0aW1lIC0gX0Nsb2NrOjpub3coKSk7IH0KKworICAgIC8vLyBzbGVlcF9mb3IKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVwLCB0eXBlbmFtZSBfUGVyaW9kPgorICAgICAgaW5saW5lIHZvaWQKKyAgICAgIHNsZWVwX2Zvcihjb25zdCBjaHJvbm86OmR1cmF0aW9uPF9SZXAsIF9QZXJpb2Q+JiBfX3J0aW1lKQorICAgICAgeworCWNocm9ubzo6c2Vjb25kcyBfX3MgPQorCSAgY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6c2Vjb25kcz4oX19ydGltZSk7CisKKwljaHJvbm86Om5hbm9zZWNvbmRzIF9fbnMgPQorCSAgY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bmFub3NlY29uZHM+KF9fcnRpbWUgLSBfX3MpOworCisJX19ndGhyZWFkX3RpbWVfdCBfX3RzID0KKwkgIHsKKwkgICAgc3RhdGljX2Nhc3Q8c3RkOjp0aW1lX3Q+KF9fcy5jb3VudCgpKSwKKwkgICAgc3RhdGljX2Nhc3Q8bG9uZz4oX19ucy5jb3VudCgpKQorCSAgfTsKKworCTo6bmFub3NsZWVwKCZfX3RzLCAwKTsKKyAgICAgIH0KKyNlbmRpZgorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9CisKKyAgLy8gQH0gZ3JvdXAgdGhyZWFkcworCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX0dMSUJDWFhfSEFTX0dUSFJFQURTICYmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RIUkVBRApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvYXJyYXkgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9hcnJheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThmY2ZhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvYXJyYXkKQEAgLTAsMCArMSwyNTIgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIGFycmF5IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9hcnJheQorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9BUlJBWQorI2RlZmluZSBfR0xJQkNYWF9UUjFfQVJSQVkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgZm9yIHN0b3JpbmcgYSBmaXhlZCBzaXplIHNlcXVlbmNlIG9mIGVsZW1lbnRzLgorICAgKgorICAgKiAgQGluZ3JvdXAgc2VxdWVuY2VzCisgICAqCisgICAqICBNZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgPGEgaHJlZj0idGFibGVzLmh0bWwjNjUiPmNvbnRhaW5lcjwvYT4sIGEKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sIzY2Ij5yZXZlcnNpYmxlIGNvbnRhaW5lcjwvYT4sIGFuZCBhCisgICAqICA8YSBocmVmPSJ0YWJsZXMuaHRtbCM2NyI+c2VxdWVuY2U8L2E+LgorICAgKgorICAgKiAgU2V0cyBzdXBwb3J0IHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLgorICAgKgorICAgKiAgQHBhcmFtICBUcCAgVHlwZSBvZiBlbGVtZW50LiBSZXF1aXJlZCB0byBiZSBhIGNvbXBsZXRlIHR5cGUuCisgICAqICBAcGFyYW0gIE4gIE51bWJlciBvZiBlbGVtZW50cy4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IGFycmF5CisgICAgeworICAgICAgdHlwZWRlZiBfVHAgCSAgICAJCQkgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAJICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAJICAgICAgY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAJCSAgICAgIGl0ZXJhdG9yOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKgkJCSAgICAgIGNvbnN0X2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgCSAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgCSAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPgkgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+ICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAgICAgLy8gU3VwcG9ydCBmb3IgemVyby1zaXplZCBhcnJheXMgbWFuZGF0b3J5LgorICAgICAgdmFsdWVfdHlwZSBfTV9pbnN0YW5jZVtfTm0gPyBfTm0gOiAxXTsKKworICAgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUuCisKKyAgICAgIHZvaWQKKyAgICAgIGFzc2lnbihjb25zdCB2YWx1ZV90eXBlJiBfX3UpCisgICAgICB7IHN0ZDo6ZmlsbF9uKGJlZ2luKCksIHNpemUoKSwgX191KTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKGFycmF5JiBfX290aGVyKQorICAgICAgeyBzdGQ6OnN3YXBfcmFuZ2VzKGJlZ2luKCksIGVuZCgpLCBfX290aGVyLmJlZ2luKCkpOyB9CisKKyAgICAgIC8vIEl0ZXJhdG9ycy4KKyAgICAgIGl0ZXJhdG9yCisgICAgICBiZWdpbigpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlWzBdKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGJlZ2luKCkgY29uc3QgCisgICAgICB7IHJldHVybiBjb25zdF9pdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlWzBdKSk7IH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihzdGQ6Ol9fYWRkcmVzc29mKF9NX2luc3RhbmNlW19ObV0pKTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbX05tXSkpOyB9CisKKyAgICAgIHJldmVyc2VfaXRlcmF0b3IgCisgICAgICByYmVnaW4oKQorICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKworICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAKKyAgICAgIHJiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorCisgICAgICByZXZlcnNlX2l0ZXJhdG9yIAorICAgICAgcmVuZCgpCisgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgCisgICAgICByZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgICAgLy8gQ2FwYWNpdHkuCisgICAgICBzaXplX3R5cGUgCisgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIHNpemVfdHlwZSAKKyAgICAgIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX05tOyB9CisKKyAgICAgIGJvb2wgCisgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIC8vIEVsZW1lbnQgYWNjZXNzLgorICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBfTV9pbnN0YW5jZVtfX25dOyB9CisKKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faW5zdGFuY2VbX19uXTsgfQorCisgICAgICByZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pCisgICAgICB7CisJaWYgKF9fbiA+PSBfTm0pCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpOworCXJldHVybiBfTV9pbnN0YW5jZVtfX25dOworICAgICAgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7CisJaWYgKF9fbiA+PSBfTm0pCisJICBzdGQ6Ol9fdGhyb3dfb3V0X29mX3JhbmdlKF9fTigiYXJyYXk6OmF0IikpOworCXJldHVybiBfTV9pbnN0YW5jZVtfX25dOworICAgICAgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBmcm9udCgpCisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UgCisgICAgICBmcm9udCgpIGNvbnN0CisgICAgICB7IHJldHVybiAqYmVnaW4oKTsgfQorCisgICAgICByZWZlcmVuY2UgCisgICAgICBiYWNrKCkKKyAgICAgIHsgcmV0dXJuIF9ObSA/ICooZW5kKCkgLSAxKSA6ICplbmQoKTsgfQorCisgICAgICBjb25zdF9yZWZlcmVuY2UgCisgICAgICBiYWNrKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9ObSA/ICooZW5kKCkgLSAxKSA6ICplbmQoKTsgfQorCisgICAgICBfVHAqCisgICAgICBkYXRhKCkKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX01faW5zdGFuY2VbMF0pOyB9CisKKyAgICAgIGNvbnN0IF9UcCoKKyAgICAgIGRhdGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfTV9pbnN0YW5jZVswXSk7IH0KKyAgICB9OworCisgIC8vIEFycmF5IGNvbXBhcmlzb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbCAKKyAgICBvcGVyYXRvcj09KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gc3RkOjplcXVhbChfX29uZS5iZWdpbigpLCBfX29uZS5lbmQoKSwgX190d28uYmVnaW4oKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lID09IF9fdHdvKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19hLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fYikKKyAgICB7IAorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX19hLmJlZ2luKCksIF9fYS5lbmQoKSwKKwkJCQkJICBfX2IuYmVnaW4oKSwgX19iLmVuZCgpKTsgCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX19vbmUsIGNvbnN0IGFycmF5PF9UcCwgX05tPiYgX190d28pCisgICAgeyByZXR1cm4gX190d28gPCBfX29uZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBjb25zdCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgcmV0dXJuICEoX19vbmUgPiBfX3R3byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9ObT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX29uZSwgY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX3R3bykKKyAgICB7IHJldHVybiAhKF9fb25lIDwgX190d28pOyB9CisKKyAgLy8gU3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyBbNi4yLjIuMl0uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChhcnJheTxfVHAsIF9ObT4mIF9fb25lLCBhcnJheTxfVHAsIF9ObT4mIF9fdHdvKQorICAgIHsgX19vbmUuc3dhcChfX3R3byk7IH0KKworICAvLyBUdXBsZSBpbnRlcmZhY2UgdG8gY2xhc3MgdGVtcGxhdGUgYXJyYXkgWzYuMi4yLjVdLgorCisgIC8vLyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gCisgICAgY2xhc3MgdHVwbGVfc2l6ZTsKKworICAvLy8gdHVwbGVfZWxlbWVudAorICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHR1cGxlX2VsZW1lbnQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX3NpemU8YXJyYXk8X1RwLCBfTm0+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSBfTm07IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgY29uc3QgaW50CisgICAgdHVwbGVfc2l6ZTxhcnJheTxfVHAsIF9ObT4gPjo6dmFsdWU7ICAKKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X0ludCwgYXJyYXk8X1RwLCBfTm0+ID4KKyAgICB7IHR5cGVkZWYgX1RwIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8aW50IF9JbnQsIHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX05tPgorICAgIGlubGluZSBfVHAmCisgICAgZ2V0KGFycmF5PF9UcCwgX05tPiYgX19hcnIpCisgICAgeyByZXR1cm4gX19hcnJbX0ludF07IH0KKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgdHlwZW5hbWUgX1RwLCBzdGQ6OnNpemVfdCBfTm0+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICBnZXQoY29uc3QgYXJyYXk8X1RwLCBfTm0+JiBfX2FycikKKyAgICB7IHJldHVybiBfX2FycltfSW50XTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9BUlJBWQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Jlc3NlbF9mdW5jdGlvbi50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyNWViYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Jlc3NlbF9mdW5jdGlvbi50Y2MKQEAgLTAsMCArMSw2MjggQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvYmVzc2VsX2Z1bmN0aW9uLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQuCisvLworLy8gUmVmZXJlbmNlczoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gOSwgcHAuIDM1NS00MzQsIFNlY3Rpb24gMTAgcHAuIDQzNS00NzgKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDI0MC0yNDUKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQkVTU0VMX0ZVTkNUSU9OX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfQkVTU0VMX0ZVTkNUSU9OX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIENvbXB1dGUgdGhlIGdhbW1hIGZ1bmN0aW9ucyByZXF1aXJlZCBieSB0aGUgVGVtbWUgc2VyaWVzCisgICAgICogICAgICAgICAgZXhwYW5zaW9ucyBvZiBAZiQgTl9cbnUoeCkgQGYkIGFuZCBAZiQgS19cbnUoeCkgQGYkLgorICAgICAqICAgQGZbCisgICAgICogICAgIFxHYW1tYV8xID0gXGZyYWN7MX17MlxtdX0KKyAgICAgKiAgICAgICAgICAgICAgICBbXGZyYWN7MX17XEdhbW1hKDEgLSBcbXUpfSAtIFxmcmFjezF9e1xHYW1tYSgxICsgXG11KX1dCisgICAgICogICBAZl0KKyAgICAgKiAgIGFuZAorICAgICAqICAgQGZbCisgICAgICogICAgIFxHYW1tYV8yID0gXGZyYWN7MX17Mn0KKyAgICAgKiAgICAgICAgICAgICAgICBbXGZyYWN7MX17XEdhbW1hKDEgLSBcbXUpfSArIFxmcmFjezF9e1xHYW1tYSgxICsgXG11KX1dCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCAtMS8yIDw9IFxtdSA8PSAxLzIgQGYkIGlzIEBmJCBcbXUgPSBcbnUgLSBOIEBmJCBhbmQgQGYkIE4gQGYkLgorICAgICAqICAgaXMgdGhlIG5lYXJlc3QgaW50ZWdlciB0byBAZiQgXG51IEBmJC4KKyAgICAgKiAgIFRoZSB2YWx1ZXMgb2YgXGYkIFxHYW1tYSgxICsgXG11KSBcZiQgYW5kIFxmJCBcR2FtbWEoMSAtIFxtdSkgXGYkCisgICAgICogICBhcmUgcmV0dXJuZWQgYXMgd2VsbC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBhY2N1cmFjeSByZXF1aXJlbWVudHMgb24gdGhpcyBhcmUgZXhxdWlzaXRlLgorICAgICAqCisgICAgICogICBAcGFyYW0gX19tdSAgICAgVGhlIGlucHV0IHBhcmFtZXRlciBvZiB0aGUgZ2FtbWEgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtIF9fZ2FtMSAgIFRoZSBvdXRwdXQgZnVuY3Rpb24gXGYkIFxHYW1tYV8xKFxtdSkgXGYkCisgICAgICogICBAcGFyYW0gX19nYW0yICAgVGhlIG91dHB1dCBmdW5jdGlvbiBcZiQgXEdhbW1hXzIoXG11KSBcZiQKKyAgICAgKiAgIEBwYXJhbSBfX2dhbXBsICBUaGUgb3V0cHV0IGZ1bmN0aW9uIFxmJCBcR2FtbWEoMSArIFxtdSkgXGYkCisgICAgICogICBAcGFyYW0gX19nYW1taSAgVGhlIG91dHB1dCBmdW5jdGlvbiBcZiQgXEdhbW1hKDEgLSBcbXUpIFxmJAorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgdm9pZAorICAgIF9fZ2FtbWFfdGVtbWUoY29uc3QgX1RwIF9fbXUsCisgICAgICAgICAgICAgICAgICAgX1RwICYgX19nYW0xLCBfVHAgJiBfX2dhbTIsIF9UcCAmIF9fZ2FtcGwsIF9UcCAmIF9fZ2FtbWkpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9fZ2FtcGwgPSBfVHAoMSkgLyBzdGQ6OnRyMTo6dGdhbW1hKF9UcCgxKSArIF9fbXUpOworICAgICAgX19nYW1taSA9IF9UcCgxKSAvIHN0ZDo6dHIxOjp0Z2FtbWEoX1RwKDEpIC0gX19tdSk7CisjZWxzZQorICAgICAgX19nYW1wbCA9IF9UcCgxKSAvIF9fZ2FtbWEoX1RwKDEpICsgX19tdSk7CisgICAgICBfX2dhbW1pID0gX1RwKDEpIC8gX19nYW1tYShfVHAoMSkgLSBfX211KTsKKyNlbmRpZgorCisgICAgICBpZiAoc3RkOjphYnMoX19tdSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgX19nYW0xID0gLV9UcChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgX19nYW0xID0gKF9fZ2FtbWkgLSBfX2dhbXBsKSAvIChfVHAoMikgKiBfX211KTsKKworICAgICAgX19nYW0yID0gKF9fZ2FtbWkgKyBfX2dhbXBsKSAvIChfVHAoMikpOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgQmVzc2VsIEBmJCBKX1xudSh4KSBAZiQgYW5kIE5ldW1hbm4KKyAgICAgKiAgICAgICAgICAgQGYkIE5fXG51KHgpIEBmJCBmdW5jdGlvbnMgYW5kIHRoZWlyIGZpcnN0IGRlcml2YXRpdmVzCisgICAgICogICAgICAgICAgIEBmJCBKJ19cbnUoeCkgQGYkIGFuZCBAZiQgTidfXG51KHgpIEBmJCByZXNwZWN0aXZlbHkuCisgICAgICogICAgICAgICAgIFRoZXNlIGZvdXIgZnVuY3Rpb25zIGFyZSBjb21wdXRlZCB0b2dldGhlciBmb3IgbnVtZXJpY2FsCisgICAgICogICAgICAgICAgIHN0YWJpbGl0eS4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX19KbnUgIFRoZSBvdXRwdXQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqICAgQHBhcmFtICBfX05udSAgVGhlIG91dHB1dCBOZXVtYW5uIGZ1bmN0aW9uIChCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kKS4KKyAgICAgKiAgIEBwYXJhbSAgX19KcG51ICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAgIEBwYXJhbSAgX19OcG51ICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19iZXNzZWxfam4oY29uc3QgX1RwIF9fbnUsIGNvbnN0IF9UcCBfX3gsCisgICAgICAgICAgICAgICAgX1RwICYgX19KbnUsIF9UcCAmIF9fTm51LCBfVHAgJiBfX0pwbnUsIF9UcCAmIF9fTnBudSkKKyAgICB7CisgICAgICBpZiAoX194ID09IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX251ID09IF9UcCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19KbnUgPSBfVHAoMSk7CisgICAgICAgICAgICAgIF9fSnBudSA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfX251ID09IF9UcCgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19KbnUgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fSnBudSA9IF9UcCgwLjVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fSm51ID0gX1RwKDApOworICAgICAgICAgICAgICBfX0pwbnUgPSBfVHAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19ObnUgPSAtc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgICAgIF9fTnBudSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAvLyAgV2hlbiB0aGUgbXVsdGlwbGllciBpcyBOIGkuZS4KKyAgICAgIC8vICBmcF9taW4gPSBOICogbWluKCkKKyAgICAgIC8vICBUaGVuIEpfMCBhbmQgTl8wIHRhbmsgYXQgeCA9IDggKiBOIChKXzAgPSAwIGFuZCBOXzAgPSBuYW4pIQorICAgICAgLy9jb25zdCBfVHAgX19mcF9taW4gPSBfVHAoMjApICogc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IF9UcCBfX2ZwX21pbiA9IHN0ZDo6c3FydChzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpKTsKKyAgICAgIGNvbnN0IGludCBfX21heF9pdGVyID0gMTUwMDA7CisgICAgICBjb25zdCBfVHAgX194X21pbiA9IF9UcCgyKTsKKworICAgICAgY29uc3QgaW50IF9fbmwgPSAoX194IDwgX194X21pbgorICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGludD4oX19udSArIF9UcCgwLjVMKSkKKyAgICAgICAgICAgICAgICAgICAgOiBzdGQ6Om1heCgwLCBzdGF0aWNfY2FzdDxpbnQ+KF9fbnUgLSBfX3ggKyBfVHAoMS41TCkpKSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX211ID0gX19udSAtIF9fbmw7CisgICAgICBjb25zdCBfVHAgX19tdTIgPSBfX211ICogX19tdTsKKyAgICAgIGNvbnN0IF9UcCBfX3hpID0gX1RwKDEpIC8gX194OworICAgICAgY29uc3QgX1RwIF9feGkyID0gX1RwKDIpICogX194aTsKKyAgICAgIF9UcCBfX3cgPSBfX3hpMiAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpOworICAgICAgaW50IF9faXNpZ24gPSAxOworICAgICAgX1RwIF9faCA9IF9fbnUgKiBfX3hpOworICAgICAgaWYgKF9faCA8IF9fZnBfbWluKQorICAgICAgICBfX2ggPSBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX2IgPSBfX3hpMiAqIF9fbnU7CisgICAgICBfVHAgX19kID0gX1RwKDApOworICAgICAgX1RwIF9fYyA9IF9faDsKKyAgICAgIGludCBfX2k7CisgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fYiArPSBfX3hpMjsKKyAgICAgICAgICBfX2QgPSBfX2IgLSBfX2Q7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZCkgPCBfX2ZwX21pbikKKyAgICAgICAgICAgIF9fZCA9IF9fZnBfbWluOworICAgICAgICAgIF9fYyA9IF9fYiAtIF9UcCgxKSAvIF9fYzsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19jKSA8IF9fZnBfbWluKQorICAgICAgICAgICAgX19jID0gX19mcF9taW47CisgICAgICAgICAgX19kID0gX1RwKDEpIC8gX19kOworICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbCA9IF9fYyAqIF9fZDsKKyAgICAgICAgICBfX2ggKj0gX19kZWw7CisgICAgICAgICAgaWYgKF9fZCA8IF9UcCgwKSkKKyAgICAgICAgICAgIF9faXNpZ24gPSAtX19pc2lnbjsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWwgLSBfVHAoMSkpIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKF9faSA+IF9fbWF4X2l0ZXIpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiQXJndW1lbnQgeCB0b28gbGFyZ2UgaW4gX19iZXNzZWxfam47ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnkgYXN5bXB0b3RpYyBleHBhbnNpb24uIikpOworICAgICAgX1RwIF9fSm51bCA9IF9faXNpZ24gKiBfX2ZwX21pbjsKKyAgICAgIF9UcCBfX0pwbnVsID0gX19oICogX19KbnVsOworICAgICAgX1RwIF9fSm51bDEgPSBfX0pudWw7CisgICAgICBfVHAgX19KcG51MSA9IF9fSnBudWw7CisgICAgICBfVHAgX19mYWN0ID0gX19udSAqIF9feGk7CisgICAgICBmb3IgKCBpbnQgX19sID0gX19ubDsgX19sID49IDE7IC0tX19sICkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX0pudXRlbXAgPSBfX2ZhY3QgKiBfX0pudWwgKyBfX0pwbnVsOworICAgICAgICAgIF9fZmFjdCAtPSBfX3hpOworICAgICAgICAgIF9fSnBudWwgPSBfX2ZhY3QgKiBfX0pudXRlbXAgLSBfX0pudWw7CisgICAgICAgICAgX19KbnVsID0gX19KbnV0ZW1wOworICAgICAgICB9CisgICAgICBpZiAoX19KbnVsID09IF9UcCgwKSkKKyAgICAgICAgX19KbnVsID0gX19lcHM7CisgICAgICBfVHAgX19mPSBfX0pwbnVsIC8gX19KbnVsOworICAgICAgX1RwIF9fTm11LCBfX05udTEsIF9fTnBtdSwgX19KbXU7CisgICAgICBpZiAoX194IDwgX194X21pbikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3gyID0gX194IC8gX1RwKDIpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BpbXUgPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9fbXU7CisgICAgICAgICAgX1RwIF9fZmFjdCA9IChzdGQ6OmFicyhfX3BpbXUpIDwgX19lcHMKKyAgICAgICAgICAgICAgICAgICAgICA/IF9UcCgxKSA6IF9fcGltdSAvIHN0ZDo6c2luKF9fcGltdSkpOworICAgICAgICAgIF9UcCBfX2QgPSAtc3RkOjpsb2coX194Mik7CisgICAgICAgICAgX1RwIF9fZSA9IF9fbXUgKiBfX2Q7CisgICAgICAgICAgX1RwIF9fZmFjdDIgPSAoc3RkOjphYnMoX19lKSA8IF9fZXBzCisgICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogc3RkOjpzaW5oKF9fZSkgLyBfX2UpOworICAgICAgICAgIF9UcCBfX2dhbTEsIF9fZ2FtMiwgX19nYW1wbCwgX19nYW1taTsKKyAgICAgICAgICBfX2dhbW1hX3RlbW1lKF9fbXUsIF9fZ2FtMSwgX19nYW0yLCBfX2dhbXBsLCBfX2dhbW1pKTsKKyAgICAgICAgICBfVHAgX19mZiA9IChfVHAoMikgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSkKKyAgICAgICAgICAgICAgICAgICAqIF9fZmFjdCAqIChfX2dhbTEgKiBzdGQ6OmNvc2goX19lKSArIF9fZ2FtMiAqIF9fZmFjdDIgKiBfX2QpOworICAgICAgICAgIF9fZSA9IHN0ZDo6ZXhwKF9fZSk7CisgICAgICAgICAgX1RwIF9fcCA9IF9fZSAvIChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9fZ2FtcGwpOworICAgICAgICAgIF9UcCBfX3EgPSBfVHAoMSkgLyAoX19lICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX2dhbW1pKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waW11MiA9IF9fcGltdSAvIF9UcCgyKTsKKyAgICAgICAgICBfVHAgX19mYWN0MyA9IChzdGQ6OmFicyhfX3BpbXUyKSA8IF9fZXBzCisgICAgICAgICAgICAgICAgICAgICAgID8gX1RwKDEpIDogc3RkOjpzaW4oX19waW11MikgLyBfX3BpbXUyICk7CisgICAgICAgICAgX1RwIF9fciA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX19waW11MiAqIF9fZmFjdDMgKiBfX2ZhY3QzOworICAgICAgICAgIF9UcCBfX2MgPSBfVHAoMSk7CisgICAgICAgICAgX19kID0gLV9feDIgKiBfX3gyOworICAgICAgICAgIF9UcCBfX3N1bSA9IF9fZmYgKyBfX3IgKiBfX3E7CisgICAgICAgICAgX1RwIF9fc3VtMSA9IF9fcDsKKyAgICAgICAgICBmb3IgKF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19mZiA9IChfX2kgKiBfX2ZmICsgX19wICsgX19xKSAvIChfX2kgKiBfX2kgLSBfX211Mik7CisgICAgICAgICAgICAgIF9fYyAqPSBfX2QgLyBfVHAoX19pKTsKKyAgICAgICAgICAgICAgX19wIC89IF9UcChfX2kpIC0gX19tdTsKKyAgICAgICAgICAgICAgX19xIC89IF9UcChfX2kpICsgX19tdTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVsID0gX19jICogKF9fZmYgKyBfX3IgKiBfX3EpOworICAgICAgICAgICAgICBfX3N1bSArPSBfX2RlbDsgCisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbDEgPSBfX2MgKiBfX3AgLSBfX2kgKiBfX2RlbDsKKyAgICAgICAgICAgICAgX19zdW0xICs9IF9fZGVsMTsKKyAgICAgICAgICAgICAgaWYgKCBzdGQ6OmFicyhfX2RlbCkgPCBfX2VwcyAqIChfVHAoMSkgKyBzdGQ6OmFicyhfX3N1bSkpICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIF9faSA+IF9fbWF4X2l0ZXIgKQorICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJCZXNzZWwgeSBzZXJpZXMgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19iZXNzZWxfam4uIikpOworICAgICAgICAgIF9fTm11ID0gLV9fc3VtOworICAgICAgICAgIF9fTm51MSA9IC1fX3N1bTEgKiBfX3hpMjsKKyAgICAgICAgICBfX05wbXUgPSBfX211ICogX194aSAqIF9fTm11IC0gX19ObnUxOworICAgICAgICAgIF9fSm11ID0gX193IC8gKF9fTnBtdSAtIF9fZiAqIF9fTm11KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fYSA9IF9UcCgwLjI1TCkgLSBfX211MjsKKyAgICAgICAgICBfVHAgX19xID0gX1RwKDEpOworICAgICAgICAgIF9UcCBfX3AgPSAtX194aSAvIF9UcCgyKTsKKyAgICAgICAgICBfVHAgX19iciA9IF9UcCgyKSAqIF9feDsKKyAgICAgICAgICBfVHAgX19iaSA9IF9UcCgyKTsKKyAgICAgICAgICBfVHAgX19mYWN0ID0gX19hICogX194aSAvIChfX3AgKiBfX3AgKyBfX3EgKiBfX3EpOworICAgICAgICAgIF9UcCBfX2NyID0gX19iciArIF9fcSAqIF9fZmFjdDsKKyAgICAgICAgICBfVHAgX19jaSA9IF9fYmkgKyBfX3AgKiBfX2ZhY3Q7CisgICAgICAgICAgX1RwIF9fZGVuID0gX19iciAqIF9fYnIgKyBfX2JpICogX19iaTsKKyAgICAgICAgICBfVHAgX19kciA9IF9fYnIgLyBfX2RlbjsKKyAgICAgICAgICBfVHAgX19kaSA9IC1fX2JpIC8gX19kZW47CisgICAgICAgICAgX1RwIF9fZGxyID0gX19jciAqIF9fZHIgLSBfX2NpICogX19kaTsKKyAgICAgICAgICBfVHAgX19kbGkgPSBfX2NyICogX19kaSArIF9fY2kgKiBfX2RyOworICAgICAgICAgIF9UcCBfX3RlbXAgPSBfX3AgKiBfX2RsciAtIF9fcSAqIF9fZGxpOworICAgICAgICAgIF9fcSA9IF9fcCAqIF9fZGxpICsgX19xICogX19kbHI7CisgICAgICAgICAgX19wID0gX190ZW1wOworICAgICAgICAgIGludCBfX2k7CisgICAgICAgICAgZm9yIChfX2kgPSAyOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fYSArPSBfVHAoMiAqIChfX2kgLSAxKSk7CisgICAgICAgICAgICAgIF9fYmkgKz0gX1RwKDIpOworICAgICAgICAgICAgICBfX2RyID0gX19hICogX19kciArIF9fYnI7CisgICAgICAgICAgICAgIF9fZGkgPSBfX2EgKiBfX2RpICsgX19iaTsKKyAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZHIpICsgc3RkOjphYnMoX19kaSkgPCBfX2ZwX21pbikKKyAgICAgICAgICAgICAgICBfX2RyID0gX19mcF9taW47CisgICAgICAgICAgICAgIF9fZmFjdCA9IF9fYSAvIChfX2NyICogX19jciArIF9fY2kgKiBfX2NpKTsKKyAgICAgICAgICAgICAgX19jciA9IF9fYnIgKyBfX2NyICogX19mYWN0OworICAgICAgICAgICAgICBfX2NpID0gX19iaSAtIF9fY2kgKiBfX2ZhY3Q7CisgICAgICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2NyKSArIHN0ZDo6YWJzKF9fY2kpIDwgX19mcF9taW4pCisgICAgICAgICAgICAgICAgX19jciA9IF9fZnBfbWluOworICAgICAgICAgICAgICBfX2RlbiA9IF9fZHIgKiBfX2RyICsgX19kaSAqIF9fZGk7CisgICAgICAgICAgICAgIF9fZHIgLz0gX19kZW47CisgICAgICAgICAgICAgIF9fZGkgLz0gLV9fZGVuOworICAgICAgICAgICAgICBfX2RsciA9IF9fY3IgKiBfX2RyIC0gX19jaSAqIF9fZGk7CisgICAgICAgICAgICAgIF9fZGxpID0gX19jciAqIF9fZGkgKyBfX2NpICogX19kcjsKKyAgICAgICAgICAgICAgX190ZW1wID0gX19wICogX19kbHIgLSBfX3EgKiBfX2RsaTsKKyAgICAgICAgICAgICAgX19xID0gX19wICogX19kbGkgKyBfX3EgKiBfX2RscjsKKyAgICAgICAgICAgICAgX19wID0gX190ZW1wOworICAgICAgICAgICAgICBpZiAoc3RkOjphYnMoX19kbHIgLSBfVHAoMSkpICsgc3RkOjphYnMoX19kbGkpIDwgX19lcHMpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX2kgPiBfX21heF9pdGVyKQorICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJMZW50eidzIG1ldGhvZCBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2Jlc3NlbF9qbi4iKSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fZ2FtID0gKF9fcCAtIF9fZikgLyBfX3E7CisgICAgICAgICAgX19KbXUgPSBzdGQ6OnNxcnQoX193IC8gKChfX3AgLSBfX2YpICogX19nYW0gKyBfX3EpKTsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgX19KbXUgPSBzdGQ6OnRyMTo6Y29weXNpZ24oX19KbXUsIF9fSm51bCk7CisjZWxzZQorICAgICAgICAgIGlmIChfX0ptdSAqIF9fSm51bCA8IF9UcCgwKSkKKyAgICAgICAgICAgIF9fSm11ID0gLV9fSm11OworI2VuZGlmCisgICAgICAgICAgX19ObXUgPSBfX2dhbSAqIF9fSm11OworICAgICAgICAgIF9fTnBtdSA9IChfX3AgKyBfX3EgLyBfX2dhbSkgKiBfX05tdTsKKyAgICAgICAgICBfX05udTEgPSBfX211ICogX194aSAqIF9fTm11IC0gX19OcG11OworICAgICAgfQorICAgICAgX19mYWN0ID0gX19KbXUgLyBfX0pudWw7CisgICAgICBfX0pudSA9IF9fZmFjdCAqIF9fSm51bDE7CisgICAgICBfX0pwbnUgPSBfX2ZhY3QgKiBfX0pwbnUxOworICAgICAgZm9yIChfX2kgPSAxOyBfX2kgPD0gX19ubDsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19ObnV0ZW1wID0gKF9fbXUgKyBfX2kpICogX194aTIgKiBfX05udTEgLSBfX05tdTsKKyAgICAgICAgICBfX05tdSA9IF9fTm51MTsKKyAgICAgICAgICBfX05udTEgPSBfX05udXRlbXA7CisgICAgICAgIH0KKyAgICAgIF9fTm51ID0gX19ObXU7CisgICAgICBfX05wbnUgPSBfX251ICogX194aSAqIF9fTm11IC0gX19ObnUxOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIGFzeW1wdG90aWMgY3lsaW5kcmljYWwgQmVzc2VsCisgICAgICogICAgICAgICAgYW5kIE5ldW1hbm4gZnVuY3Rpb25zIG9mIG9yZGVyIG51OiBcZiQgSl97XG51fSBcZiQsCisgICAgICogICAgICAgICAgXGYkIE5fe1xudX0gXGYkLgorICAgICAqCisgICAgICogICBSZWZlcmVuY2VzOgorICAgICAqICAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorICAgICAqICAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKyAgICAgKiAgICAgICAgRG92ZXIgUHVibGljYXRpb25zLAorICAgICAqICAgICAgICBTZWN0aW9uIDkgcC4gMzY0LCBFcXVhdGlvbnMgOS4yLjUtOS4yLjEwCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIG9yZGVyIG9mIHRoZSBCZXNzZWwgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbnMuCisgICAgICogICBAcGFyYW0gIF9fSm51ICBUaGUgb3V0cHV0IEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAgIEBwYXJhbSAgX19ObnUgIFRoZSBvdXRwdXQgTmV1bWFubiBmdW5jdGlvbiAoQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZCkuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19jeWxfYmVzc2VsX2puX2FzeW1wKGNvbnN0IF9UcCBfX251LCBjb25zdCBfVHAgX194LAorICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAgJiBfX0pudSwgX1RwICYgX19ObnUpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fY29lZiA9IHN0ZDo6c3FydChfVHAoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX3gpKTsKKyAgICAgIGNvbnN0IF9UcCBfX211ICAgPSBfVHAoNCkgKiBfX251ICogX19udTsKKyAgICAgIGNvbnN0IF9UcCBfX211bTEgPSBfX211IC0gX1RwKDEpOworICAgICAgY29uc3QgX1RwIF9fbXVtOSA9IF9fbXUgLSBfVHAoOSk7CisgICAgICBjb25zdCBfVHAgX19tdW0yNSA9IF9fbXUgLSBfVHAoMjUpOworICAgICAgY29uc3QgX1RwIF9fbXVtNDkgPSBfX211IC0gX1RwKDQ5KTsKKyAgICAgIGNvbnN0IF9UcCBfX3h4ID0gX1RwKDY0KSAqIF9feCAqIF9feDsKKyAgICAgIGNvbnN0IF9UcCBfX1AgPSBfVHAoMSkgLSBfX211bTEgKiBfX211bTkgLyAoX1RwKDIpICogX194eCkKKyAgICAgICAgICAgICAgICAgICAgKiAoX1RwKDEpIC0gX19tdW0yNSAqIF9fbXVtNDkgLyAoX1RwKDEyKSAqIF9feHgpKTsKKyAgICAgIGNvbnN0IF9UcCBfX1EgPSBfX211bTEgLyAoX1RwKDgpICogX194KQorICAgICAgICAgICAgICAgICAgICAqIChfVHAoMSkgLSBfX211bTkgKiBfX211bTI1IC8gKF9UcCg2KSAqIF9feHgpKTsKKworICAgICAgY29uc3QgX1RwIF9fY2hpID0gX194IC0gKF9fbnUgKyBfVHAoMC41TCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGlfMigpOworICAgICAgY29uc3QgX1RwIF9fYyA9IHN0ZDo6Y29zKF9fY2hpKTsKKyAgICAgIGNvbnN0IF9UcCBfX3MgPSBzdGQ6OnNpbihfX2NoaSk7CisKKyAgICAgIF9fSm51ID0gX19jb2VmICogKF9fYyAqIF9fUCAtIF9fcyAqIF9fUSk7CisgICAgICBfX05udSA9IF9fY29lZiAqIChfX3MgKiBfX1AgKyBfX2MgKiBfX1EpOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgY3lsaW5kcmljYWwgQmVzc2VsIGZ1bmN0aW9ucworICAgICAqICAgICAgICAgIG9mIG9yZGVyIFxmJCBcbnUgXGYkOiBcZiQgSl97XG51fSBcZiQgb3IgXGYkIElfe1xudX0gXGYkCisgICAgICogICAgICAgICAgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKgorICAgICAqICAgVGhlIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgIFpfe1xudX0oeCkgPSBcc3VtX3trPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgIFxmcmFje1xzaWdtYV5rICh4LzIpXntcbnUgKyAya319e2shXEdhbW1hKFxudStrKzEpfQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBcZiQgXHNpZ21hID0gKzEgXGYkIG9yXGYkICAtMSBcZiQgZm9yCisgICAgICogICBcZiQgWiA9IEkgXGYkIG9yIFxmJCBKIFxmJCByZXNwZWN0aXZlbHkuCisgICAgICogCisgICAgICogICBTZWUgQWJyYW1vd2l0eiAmIFN0ZWd1biwgOS4xLjEwCisgICAgICogICAgICAgQWJyYW1vd2l0eiAmIFN0ZWd1biwgOS42LjcKKyAgICAgKiAgICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKyAgICAgKiAgICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisgICAgICogICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKyAgICAgKiAgICAgICAgRXF1YXRpb24gOS4xLjEwIHAuIDM2MCBhbmQgRXF1YXRpb24gOS42LjEwIHAuIDM3NQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19zZ24gIFRoZSBzaWduIG9mIHRoZSBhbHRlcm5hdGUgdGVybXMKKyAgICAgKiAgICAgICAgICAgICAgICAgIC0xIGZvciB0aGUgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqICAgICAgICAgICAgICAgICAgKzEgZm9yIHRoZSBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICogICBAcmV0dXJuICBUaGUgb3V0cHV0IEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY3lsX2Jlc3NlbF9pal9zZXJpZXMoY29uc3QgX1RwIF9fbnUsIGNvbnN0IF9UcCBfX3gsIGNvbnN0IF9UcCBfX3NnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyKQorICAgIHsKKworICAgICAgY29uc3QgX1RwIF9feDIgPSBfX3ggLyBfVHAoMik7CisgICAgICBfVHAgX19mYWN0ID0gX19udSAqIHN0ZDo6bG9nKF9feDIpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9fZmFjdCAtPSBzdGQ6OnRyMTo6bGdhbW1hKF9fbnUgKyBfVHAoMSkpOworI2Vsc2UKKyAgICAgIF9fZmFjdCAtPSBfX2xvZ19nYW1tYShfX251ICsgX1RwKDEpKTsKKyNlbmRpZgorICAgICAgX19mYWN0ID0gc3RkOjpleHAoX19mYWN0KTsKKyAgICAgIGNvbnN0IF9UcCBfX3h4NCA9IF9fc2duICogX194MiAqIF9feDI7CisgICAgICBfVHAgX19KbiA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9IF9feHg0IC8gKF9UcChfX2kpICogKF9fbnUgKyBfVHAoX19pKSkpOworICAgICAgICAgIF9fSm4gKz0gX190ZXJtOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0gLyBfX0puKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fZmFjdCAqIF9fSm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBCZXNzZWwgZnVuY3Rpb24gb2Ygb3JkZXIgXGYkIFxudSBcZiQ6CisgICAgICogICAgICAgICAgIFxmJCBKX3tcbnV9KHgpIFxmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgIEpfe1xudX0oeCkgPSBcc3VtX3trPTB9XntcaW5mdHl9CisgICAgICogICAgICAgICAgICAgIFxmcmFjeygtMSleayAoeC8yKV57XG51ICsgMmt9fXtrIVxHYW1tYShcbnUraysxKX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2N5bF9iZXNzZWxfaihjb25zdCBfVHAgX19udSwgY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX19udSA8IF9UcCgwKSB8fCBfX3ggPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19jeWxfYmVzc2VsX2ouIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ICogX194IDwgX1RwKDEwKSAqIChfX251ICsgX1RwKDEpKSkKKyAgICAgICAgcmV0dXJuIF9fY3lsX2Jlc3NlbF9pal9zZXJpZXMoX19udSwgX194LCAtX1RwKDEpLCAyMDApOworICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDEwMDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSl9udSwgX19OX251OworICAgICAgICAgIF9fY3lsX2Jlc3NlbF9qbl9hc3ltcChfX251LCBfX3gsIF9fSl9udSwgX19OX251KTsKKyAgICAgICAgICByZXR1cm4gX19KX251OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnU7CisgICAgICAgICAgX19iZXNzZWxfam4oX19udSwgX194LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisgICAgICAgICAgcmV0dXJuIF9fSl9udTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgTmV1bWFubiBmdW5jdGlvbiBvZiBvcmRlciBcZiQgXG51IFxmJDoKKyAgICAgKiAgICAgICAgICAgXGYkIE5fe1xudX0oeCkgXGYkLgorICAgICAqCisgICAgICogICBUaGUgTmV1bWFubiBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICBOX3tcbnV9KHgpID0gXGZyYWN7Sl97XG51fSh4KSBcY29zIFxudVxwaSAtIEpfey1cbnV9KHgpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAge1xzaW4gXG51XHBpfQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBmb3IgaW50ZWdyYWwgXGYkIFxudSA9IG4gXGYkIGEgbGltaXQgaXMgdGFrZW46CisgICAgICogICBcZiQgbGltX3tcbnUgXHRvIG59IFxmJC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jeWxfbmV1bWFubl9uKGNvbnN0IF9UcCBfX251LCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX251IDwgX1RwKDApIHx8IF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2N5bF9uZXVtYW5uX24uIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDEwMDApKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fSl9udSwgX19OX251OworICAgICAgICAgIF9fY3lsX2Jlc3NlbF9qbl9hc3ltcChfX251LCBfX3gsIF9fSl9udSwgX19OX251KTsKKyAgICAgICAgICByZXR1cm4gX19OX251OworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnU7CisgICAgICAgICAgX19iZXNzZWxfam4oX19udSwgX194LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisgICAgICAgICAgcmV0dXJuIF9fTl9udTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIHNwaGVyaWNhbCBCZXNzZWwgQGYkIGpfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICAgYW5kIE5ldW1hbm4gQGYkIG5fbih4KSBAZiQgZnVuY3Rpb25zIGFuZCB0aGVpciBmaXJzdAorICAgICAqICAgICAgICAgICBkZXJpdmF0aXZlcyBAZiQgaidfbih4KSBAZiQgYW5kIEBmJCBuJ19uKHgpIEBmJAorICAgICAqICAgICAgICAgICByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2pfbiAgVGhlIG91dHB1dCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX25fbiAgVGhlIG91dHB1dCBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19qcF9uIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19ucF9uIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19zcGhfYmVzc2VsX2puKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IF9UcCBfX3gsCisgICAgICAgICAgICAgICAgICAgIF9UcCAmIF9fal9uLCBfVHAgJiBfX25fbiwgX1RwICYgX19qcF9uLCBfVHAgJiBfX25wX24pCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbnUgPSBfVHAoX19uKSArIF9UcCgwLjVMKTsKKworICAgICAgX1RwIF9fSl9udSwgX19OX251LCBfX0pwX251LCBfX05wX251OworICAgICAgX19iZXNzZWxfam4oX19udSwgX194LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisKKyAgICAgIGNvbnN0IF9UcCBfX2ZhY3RvciA9IF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0cGlvMigpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyBzdGQ6OnNxcnQoX194KTsKKworICAgICAgX19qX24gPSBfX2ZhY3RvciAqIF9fSl9udTsKKyAgICAgIF9fbl9uID0gX19mYWN0b3IgKiBfX05fbnU7CisgICAgICBfX2pwX24gPSBfX2ZhY3RvciAqIF9fSnBfbnUgLSBfX2pfbiAvIChfVHAoMikgKiBfX3gpOworICAgICAgX19ucF9uID0gX19mYWN0b3IgKiBfX05wX251IC0gX19uX24gLyAoX1RwKDIpICogX194KTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBAZiQgal9uKHgpIEBmJCBvZiBvcmRlciBuLgorICAgICAqCisgICAgICogICBUaGUgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgal9uKHgpID0gXGxlZnQoIFxmcmFje1xwaX17Mnh9IFxyaWdodCkgXnsxLzJ9IEpfe24rMS8yfSh4KQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19zcGhfYmVzc2VsKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3NwaF9iZXNzZWwuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX2pfbiwgX19uX24sIF9fanBfbiwgX19ucF9uOworICAgICAgICAgIF9fc3BoX2Jlc3NlbF9qbihfX24sIF9feCwgX19qX24sIF9fbl9uLCBfX2pwX24sIF9fbnBfbik7CisgICAgICAgICAgcmV0dXJuIF9fal9uOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbgorICAgICAqICAgICAgICAgICBAZiQgbl9uKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIHNwaGVyaWNhbCBOZXVtYW5uIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICBuX24oeCkgPSBcbGVmdCggXGZyYWN7XHBpfXsyeH0gXHJpZ2h0KSBeezEvMn0gTl97bisxLzJ9KHgpCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgc3BoZXJpY2FsIE5ldW1hbm4gZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3NwaF9uZXVtYW5uKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3NwaF9uZXVtYW5uLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggPT0gX1RwKDApKQorICAgICAgICByZXR1cm4gLXN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX2pfbiwgX19uX24sIF9fanBfbiwgX19ucF9uOworICAgICAgICAgIF9fc3BoX2Jlc3NlbF9qbihfX24sIF9feCwgX19qX24sIF9fbl9uLCBfX2pwX24sIF9fbnBfbik7CisgICAgICAgICAgcmV0dXJuIF9fbl9uOworICAgICAgICB9CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9CRVNTRUxfRlVOQ1RJT05fVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9iZXRhX2Z1bmN0aW9uLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2JldGFfZnVuY3Rpb24udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOWYzY2IKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9iZXRhX2Z1bmN0aW9uLnRjYwpAQCAtMCwwICsxLDE5OCBAQAorLy8gU3BlY2lhbCBmdW5jdGlvbnMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9iZXRhX2Z1bmN0aW9uLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgZWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsCisvLyAgICAgICBTZWN0aW9uIDYsIHBwLiAyNTMtMjY2CisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorLy8gICAoMykgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgYnkgVy4gSC4gUHJlc3MsIFMuIEEuIFRldWtvbHNreSwKKy8vICAgICAgIFcuIFQuIFZldHRlcmxpbmcsIEIuIFAuIEZsYW5uZXJ5LCBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcyAoMTk5MiksCisvLyAgICAgICAybmQgZWQsIHBwLiAyMTMtMjE2CisvLyAgICg0KSBHYW1tYSwgRXhwbG9yaW5nIEV1bGVyJ3MgQ29uc3RhbnQsIEp1bGlhbiBIYXZpbCwKKy8vICAgICAgIFByaW5jZXRvbiwgMjAwMy4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQkVUQV9GVU5DVElPTl9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0JFVEFfRlVOQ1RJT05fVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGJldGEgZnVuY3Rpb246IFxmJEIoeCx5KVxmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBiZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBCKHgseSkgPSBcZnJhY3tcR2FtbWEoeClcR2FtbWEoeSl9e1xHYW1tYSh4K3kpfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9feSBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGJldGEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYmV0YV9nYW1tYShfVHAgX194LCBfVHAgX195KQorICAgIHsKKworICAgICAgX1RwIF9fYmV0OworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfX3ggPiBfX3kpCisgICAgICAgIHsKKyAgICAgICAgICBfX2JldCA9IHN0ZDo6dHIxOjp0Z2FtbWEoX194KQorICAgICAgICAgICAgICAgIC8gc3RkOjp0cjE6OnRnYW1tYShfX3ggKyBfX3kpOworICAgICAgICAgIF9fYmV0ICo9IHN0ZDo6dHIxOjp0Z2FtbWEoX195KTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX19iZXQgPSBzdGQ6OnRyMTo6dGdhbW1hKF9feSkKKyAgICAgICAgICAgICAgICAvIHN0ZDo6dHIxOjp0Z2FtbWEoX194ICsgX195KTsKKyAgICAgICAgICBfX2JldCAqPSBzdGQ6OnRyMTo6dGdhbW1hKF9feCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICBpZiAoX194ID4gX195KQorICAgICAgICB7CisgICAgICAgICAgX19iZXQgPSBfX2dhbW1hKF9feCkgLyBfX2dhbW1hKF9feCArIF9feSk7CisgICAgICAgICAgX19iZXQgKj0gX19nYW1tYShfX3kpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfX2JldCA9IF9fZ2FtbWEoX195KSAvIF9fZ2FtbWEoX194ICsgX195KTsKKyAgICAgICAgICBfX2JldCAqPSBfX2dhbW1hKF9feCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICByZXR1cm4gX19iZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgYmV0YSBmdW5jdGlvbiBcZiRCKHgseSlcZiQgdXNpbmcKKyAgICAgKiAgICAgICAgICAgdGhlIGxvZyBnYW1tYSBmdW5jdGlvbnMuCisgICAgICogCisgICAgICogICBUaGUgYmV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgQih4LHkpID0gXGZyYWN7XEdhbW1hKHgpXEdhbW1hKHkpfXtcR2FtbWEoeCt5KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX3kgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBiZXRhIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2JldGFfbGdhbW1hKF9UcCBfX3gsIF9UcCBfX3kpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9UcCBfX2JldCA9IHN0ZDo6dHIxOjpsZ2FtbWEoX194KQorICAgICAgICAgICAgICAgICsgc3RkOjp0cjE6OmxnYW1tYShfX3kpCisgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9feCArIF9feSk7CisjZWxzZQorICAgICAgX1RwIF9fYmV0ID0gX19sb2dfZ2FtbWEoX194KQorICAgICAgICAgICAgICAgICsgX19sb2dfZ2FtbWEoX195KQorICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX194ICsgX195KTsKKyNlbmRpZgorICAgICAgX19iZXQgPSBzdGQ6OmV4cChfX2JldCk7CisgICAgICByZXR1cm4gX19iZXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBiZXRhIGZ1bmN0aW9uIFxmJEIoeCx5KVxmJCB1c2luZworICAgICAqICAgICAgICAgICB0aGUgcHJvZHVjdCBmb3JtLgorICAgICAqIAorICAgICAqICAgVGhlIGJldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIEIoeCx5KSA9IFxmcmFje1xHYW1tYSh4KVxHYW1tYSh5KX17XEdhbW1hKHgreSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX195IFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19iZXRhX3Byb2R1Y3QoX1RwIF9feCwgX1RwIF9feSkKKyAgICB7CisKKyAgICAgIF9UcCBfX2JldCA9IChfX3ggKyBfX3kpIC8gKF9feCAqIF9feSk7CisKKyAgICAgIHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8IF9fbWF4X2l0ZXI7ICsrX19rKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdGVybSA9IChfVHAoMSkgKyAoX194ICsgX195KSAvIF9faykKKyAgICAgICAgICAgICAgICAgICAgIC8gKChfVHAoMSkgKyBfX3ggLyBfX2spICogKF9UcCgxKSArIF9feSAvIF9faykpOworICAgICAgICAgIF9fYmV0ICo9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19iZXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBiZXRhIGZ1bmN0aW9uIFxmJCBCKHgseSkgXGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGJldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIEIoeCx5KSA9IFxmcmFje1xHYW1tYSh4KVxHYW1tYSh5KX17XEdhbW1hKHgreSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX195IFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJldGEgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgYmV0YSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fYmV0YShfVHAgX194LCBfVHAgX195KQorICAgIHsKKyAgICAgIGlmIChfX2lzbmFuKF9feCkgfHwgX19pc25hbihfX3kpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fYmV0YV9sZ2FtbWEoX194LCBfX3kpOworICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfX0dMSUJDWFhfVFIxX0JFVEFfRlVOQ1RJT05fVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jY29tcGxleCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Njb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWUzM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jY29tcGxleApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgY2NvbXBsZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2NvbXBsZXgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ0NPTVBMRVgKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NDT01QTEVYIDEKKworI2luY2x1ZGUgPHRyMS9jb21wbGV4PgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NDT01QTEVYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jY3R5cGUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jY3R5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlYzNkOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NjdHlwZQpAQCAtMCwwICsxLDQ5IEBACisvLyBUUjEgY2N0eXBlIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NjdHlwZQorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DQ1RZUEUKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NDVFlQRSAxCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfQ1RZUEVfVFIxCisKKyN1bmRlZiBpc2JsYW5rCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICB1c2luZyA6OmlzYmxhbms7Cit9Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NDVFlQRQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY2ZlbnYgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jZmVudgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBhMDZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY2ZlbnYKQEAgLTAsMCArMSw4MSBAQAorLy8gVFIxIGNmZW52IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NmZW52CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NGRU5WCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DRkVOViAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX0ZFTlZfSAorIyBpbmNsdWRlIDxmZW52Lmg+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEKKworI3VuZGVmIGZlY2xlYXJleGNlcHQKKyN1bmRlZiBmZWdldGV4Y2VwdGZsYWcKKyN1bmRlZiBmZXJhaXNlZXhjZXB0CisjdW5kZWYgZmVzZXRleGNlcHRmbGFnCisjdW5kZWYgZmV0ZXN0ZXhjZXB0CisjdW5kZWYgZmVnZXRyb3VuZAorI3VuZGVmIGZlc2V0cm91bmQKKyN1bmRlZiBmZWdldGVudgorI3VuZGVmIGZlaG9sZGV4Y2VwdAorI3VuZGVmIGZlc2V0ZW52CisjdW5kZWYgZmV1cGRhdGVlbnYKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIHR5cGVzCisgIHVzaW5nIDo6ZmVudl90OworICB1c2luZyA6OmZleGNlcHRfdDsKKworICAvLyBmdW5jdGlvbnMKKyAgdXNpbmcgOjpmZWNsZWFyZXhjZXB0OworICB1c2luZyA6OmZlZ2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXJhaXNlZXhjZXB0OworICB1c2luZyA6OmZlc2V0ZXhjZXB0ZmxhZzsKKyAgdXNpbmcgOjpmZXRlc3RleGNlcHQ7CisKKyAgdXNpbmcgOjpmZWdldHJvdW5kOworICB1c2luZyA6OmZlc2V0cm91bmQ7CisKKyAgdXNpbmcgOjpmZWdldGVudjsKKyAgdXNpbmcgOjpmZWhvbGRleGNlcHQ7CisgIHVzaW5nIDo6ZmVzZXRlbnY7CisgIHVzaW5nIDo6ZmV1cGRhdGVlbnY7Cit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X0ZFTlZfVFIxCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ0ZFTlYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NmbG9hdCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NmbG9hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFjZmMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY2Zsb2F0CkBAIC0wLDAgKzEsNDIgQEAKKy8vIFRSMSBjZmxvYXQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2Zsb2F0CisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NGTE9BVAorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ0ZMT0FUIDEKKworI2luY2x1ZGUgPGNmbG9hdD4KKworI2lmbmRlZiBERUNJTUFMX0RJRworI2RlZmluZSBERUNJTUFMX0RJRyBfX0RFQ0lNQUxfRElHX18KKyNlbmRpZgorCisjaWZuZGVmIEZMVF9FVkFMX01FVEhPRAorI2RlZmluZSBGTFRfRVZBTF9NRVRIT0QgX19GTFRfRVZBTF9NRVRIT0RfXworI2VuZGlmCisKKyNlbmRpZiAvL19HTElCQ1hYX1RSMV9DRkxPQVQgCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jaW50dHlwZXMgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jaW50dHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTI5MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NpbnR0eXBlcwpAQCAtMCwwICsxLDg0IEBACisvLyBUUjEgY2ludHR5cGVzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NpbnR0eXBlcworICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DSU5UVFlQRVMKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NJTlRUWVBFUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHRyMS9jc3RkaW50PgorCisvLyBGb3IgOC4xMS4xLzEgKHNlZSBDOTksIE5vdGUgMTg0KQorI2lmIF9HTElCQ1hYX0hBVkVfSU5UVFlQRVNfSAorIyBpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgIGRlZmluZSBfVU5ERUZfX1NURENfRk9STUFUX01BQ1JPUworIyAgZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjIGVuZGlmCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjIGlmZGVmIF9VTkRFRl9fU1REQ19GT1JNQVRfTUFDUk9TCisjICB1bmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworIyAgdW5kZWYgX1VOREVGX19TVERDX0ZPUk1BVF9NQUNST1MKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19UUjEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIHR5cGVzCisgIHVzaW5nIDo6aW1heGRpdl90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyA6OmltYXhhYnM7CisKKyAgLy8gTWF5IGNvbGxpZGUgd2l0aCBfTG9uZ2xvbmcgYWJzKF9Mb25nbG9uZyksIGFuZCBpcyBub3QgZGVzY3JpYmVkCisgIC8vIGFueXdoZXJlIG91dHNpZGUgdGhlIHN5bm9wc2lzLiAgTGlrZWx5LCBhIGRlZmVjdC4KKyAgLy8KKyAgLy8gaW50bWF4X3QgYWJzKGludG1heF90KQorCisgIHVzaW5nIDo6aW1heGRpdjsKKworICAvLyBMaWtld2lzZSwgd2l0aCBsbGRpdl90IGRpdihfTG9uZ2xvbmcsIF9Mb25nbG9uZykuCisgIC8vCisgIC8vIGltYXhkaXZfdCBkaXYoaW50bWF4X3QsIGludG1heF90KQorCisgIHVzaW5nIDo6c3RydG9pbWF4OworICB1c2luZyA6OnN0cnRvdW1heDsKKworI2lmIGRlZmluZWQoX0dMSUJDWFhfVVNFX1dDSEFSX1QpICYmIF9HTElCQ1hYX1VTRV9DOTlfSU5UVFlQRVNfV0NIQVJfVF9UUjEKKyAgdXNpbmcgOjp3Y3N0b2ltYXg7CisgIHVzaW5nIDo6d2NzdG91bWF4OworI2VuZGlmCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NJTlRUWVBFUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY2xpbWl0cyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NsaW1pdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhZjk2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NsaW1pdHMKQEAgLTAsMCArMSw0NiBAQAorLy8gVFIxIGNsaW1pdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY2xpbWl0cworICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DTElNSVRTCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DTElNSVRTIDEKKworI2luY2x1ZGUgPGNsaW1pdHM+CisKKyNpZm5kZWYgTExPTkdfTUlOCisjZGVmaW5lIExMT05HX01JTiAoLV9fTE9OR19MT05HX01BWF9fIC0gMSkKKyNlbmRpZgorCisjaWZuZGVmIExMT05HX01BWAorI2RlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyNlbmRpZgorCisjaWZuZGVmIFVMTE9OR19NQVgKKyNkZWZpbmUgVUxMT05HX01BWCAoX19MT05HX0xPTkdfTUFYX18gKiAyVUxMICsgMSkKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NMSU1JVFMKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NtYXRoIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkYTYzNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NtYXRoCkBAIC0wLDAgKzEsMTQ3MyBAQAorLy8gVFIxIGNtYXRoIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jbWF0aAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DTUFUSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ01BVEggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKworI3VuZGVmIGFjb3NoCisjdW5kZWYgYWNvc2hmCisjdW5kZWYgYWNvc2hsCisjdW5kZWYgYXNpbmgKKyN1bmRlZiBhc2luaGYKKyN1bmRlZiBhc2luaGwKKyN1bmRlZiBhdGFuaAorI3VuZGVmIGF0YW5oZgorI3VuZGVmIGF0YW5obAorI3VuZGVmIGNicnQKKyN1bmRlZiBjYnJ0ZgorI3VuZGVmIGNicnRsCisjdW5kZWYgY29weXNpZ24KKyN1bmRlZiBjb3B5c2lnbmYKKyN1bmRlZiBjb3B5c2lnbmwKKyN1bmRlZiBlcmYKKyN1bmRlZiBlcmZmCisjdW5kZWYgZXJmbAorI3VuZGVmIGVyZmMKKyN1bmRlZiBlcmZjZgorI3VuZGVmIGVyZmNsCisjdW5kZWYgZXhwMgorI3VuZGVmIGV4cDJmCisjdW5kZWYgZXhwMmwKKyN1bmRlZiBleHBtMQorI3VuZGVmIGV4cG0xZgorI3VuZGVmIGV4cG0xbAorI3VuZGVmIGZkaW0KKyN1bmRlZiBmZGltZgorI3VuZGVmIGZkaW1sCisjdW5kZWYgZm1hCisjdW5kZWYgZm1hZgorI3VuZGVmIGZtYWwKKyN1bmRlZiBmbWF4CisjdW5kZWYgZm1heGYKKyN1bmRlZiBmbWF4bAorI3VuZGVmIGZtaW4KKyN1bmRlZiBmbWluZgorI3VuZGVmIGZtaW5sCisjdW5kZWYgaHlwb3QKKyN1bmRlZiBoeXBvdGYKKyN1bmRlZiBoeXBvdGwKKyN1bmRlZiBpbG9nYgorI3VuZGVmIGlsb2diZgorI3VuZGVmIGlsb2dibAorI3VuZGVmIGxnYW1tYQorI3VuZGVmIGxnYW1tYWYKKyN1bmRlZiBsZ2FtbWFsCisjdW5kZWYgbGxyaW50CisjdW5kZWYgbGxyaW50ZgorI3VuZGVmIGxscmludGwKKyN1bmRlZiBsbHJvdW5kCisjdW5kZWYgbGxyb3VuZGYKKyN1bmRlZiBsbHJvdW5kbAorI3VuZGVmIGxvZzFwCisjdW5kZWYgbG9nMXBmCisjdW5kZWYgbG9nMXBsCisjdW5kZWYgbG9nMgorI3VuZGVmIGxvZzJmCisjdW5kZWYgbG9nMmwKKyN1bmRlZiBsb2diCisjdW5kZWYgbG9nYmYKKyN1bmRlZiBsb2dibAorI3VuZGVmIGxyaW50CisjdW5kZWYgbHJpbnRmCisjdW5kZWYgbHJpbnRsCisjdW5kZWYgbHJvdW5kCisjdW5kZWYgbHJvdW5kZgorI3VuZGVmIGxyb3VuZGwKKyN1bmRlZiBuYW4KKyN1bmRlZiBuYW5mCisjdW5kZWYgbmFubAorI3VuZGVmIG5lYXJieWludAorI3VuZGVmIG5lYXJieWludGYKKyN1bmRlZiBuZWFyYnlpbnRsCisjdW5kZWYgbmV4dGFmdGVyCisjdW5kZWYgbmV4dGFmdGVyZgorI3VuZGVmIG5leHRhZnRlcmwKKyN1bmRlZiBuZXh0dG93YXJkCisjdW5kZWYgbmV4dHRvd2FyZGYKKyN1bmRlZiBuZXh0dG93YXJkbAorI3VuZGVmIHJlbWFpbmRlcgorI3VuZGVmIHJlbWFpbmRlcmYKKyN1bmRlZiByZW1haW5kZXJsCisjdW5kZWYgcmVtcXVvCisjdW5kZWYgcmVtcXVvZgorI3VuZGVmIHJlbXF1b2wKKyN1bmRlZiByaW50CisjdW5kZWYgcmludGYKKyN1bmRlZiByaW50bAorI3VuZGVmIHJvdW5kCisjdW5kZWYgcm91bmRmCisjdW5kZWYgcm91bmRsCisjdW5kZWYgc2NhbGJsbgorI3VuZGVmIHNjYWxibG5mCisjdW5kZWYgc2NhbGJsbmwKKyN1bmRlZiBzY2FsYm4KKyN1bmRlZiBzY2FsYm5mCisjdW5kZWYgc2NhbGJubAorI3VuZGVmIHRnYW1tYQorI3VuZGVmIHRnYW1tYWYKKyN1bmRlZiB0Z2FtbWFsCisjdW5kZWYgdHJ1bmMKKyN1bmRlZiB0cnVuY2YKKyN1bmRlZiB0cnVuY2wKKworI2VuZGlmCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKworICAvLyB0eXBlcworICB1c2luZyA6OmRvdWJsZV90OworICB1c2luZyA6OmZsb2F0X3Q7CisKKyAgLy8gZnVuY3Rpb25zCisgIHVzaW5nIDo6YWNvc2g7CisgIHVzaW5nIDo6YWNvc2hmOworICB1c2luZyA6OmFjb3NobDsKKworICB1c2luZyA6OmFzaW5oOworICB1c2luZyA6OmFzaW5oZjsKKyAgdXNpbmcgOjphc2luaGw7CisKKyAgdXNpbmcgOjphdGFuaDsKKyAgdXNpbmcgOjphdGFuaGY7CisgIHVzaW5nIDo6YXRhbmhsOworCisgIHVzaW5nIDo6Y2JydDsKKyAgdXNpbmcgOjpjYnJ0ZjsKKyAgdXNpbmcgOjpjYnJ0bDsKKworICB1c2luZyA6OmNvcHlzaWduOworICB1c2luZyA6OmNvcHlzaWduZjsKKyAgdXNpbmcgOjpjb3B5c2lnbmw7CisKKyAgdXNpbmcgOjplcmY7CisgIHVzaW5nIDo6ZXJmZjsKKyAgdXNpbmcgOjplcmZsOworCisgIHVzaW5nIDo6ZXJmYzsKKyAgdXNpbmcgOjplcmZjZjsKKyAgdXNpbmcgOjplcmZjbDsKKworICB1c2luZyA6OmV4cDI7CisgIHVzaW5nIDo6ZXhwMmY7CisgIHVzaW5nIDo6ZXhwMmw7CisKKyAgdXNpbmcgOjpleHBtMTsKKyAgdXNpbmcgOjpleHBtMWY7CisgIHVzaW5nIDo6ZXhwbTFsOworCisgIHVzaW5nIDo6ZmRpbTsKKyAgdXNpbmcgOjpmZGltZjsKKyAgdXNpbmcgOjpmZGltbDsKKworICB1c2luZyA6OmZtYTsKKyAgdXNpbmcgOjpmbWFmOworICB1c2luZyA6OmZtYWw7CisKKyAgdXNpbmcgOjpmbWF4OworICB1c2luZyA6OmZtYXhmOworICB1c2luZyA6OmZtYXhsOworCisgIHVzaW5nIDo6Zm1pbjsKKyAgdXNpbmcgOjpmbWluZjsKKyAgdXNpbmcgOjpmbWlubDsKKworICB1c2luZyA6Omh5cG90OworICB1c2luZyA6Omh5cG90ZjsKKyAgdXNpbmcgOjpoeXBvdGw7CisKKyAgdXNpbmcgOjppbG9nYjsKKyAgdXNpbmcgOjppbG9nYmY7CisgIHVzaW5nIDo6aWxvZ2JsOworCisgIHVzaW5nIDo6bGdhbW1hOworICB1c2luZyA6OmxnYW1tYWY7CisgIHVzaW5nIDo6bGdhbW1hbDsKKworICB1c2luZyA6OmxscmludDsKKyAgdXNpbmcgOjpsbHJpbnRmOworICB1c2luZyA6OmxscmludGw7CisKKyAgdXNpbmcgOjpsbHJvdW5kOworICB1c2luZyA6Omxscm91bmRmOworICB1c2luZyA6Omxscm91bmRsOworCisgIHVzaW5nIDo6bG9nMXA7CisgIHVzaW5nIDo6bG9nMXBmOworICB1c2luZyA6OmxvZzFwbDsKKworICB1c2luZyA6OmxvZzI7CisgIHVzaW5nIDo6bG9nMmY7CisgIHVzaW5nIDo6bG9nMmw7CisKKyAgdXNpbmcgOjpsb2diOworICB1c2luZyA6OmxvZ2JmOworICB1c2luZyA6OmxvZ2JsOworCisgIHVzaW5nIDo6bHJpbnQ7CisgIHVzaW5nIDo6bHJpbnRmOworICB1c2luZyA6OmxyaW50bDsKKworICB1c2luZyA6Omxyb3VuZDsKKyAgdXNpbmcgOjpscm91bmRmOworICB1c2luZyA6Omxyb3VuZGw7CisKKyAgdXNpbmcgOjpuYW47CisgIHVzaW5nIDo6bmFuZjsKKyAgdXNpbmcgOjpuYW5sOworCisgIHVzaW5nIDo6bmVhcmJ5aW50OworICB1c2luZyA6Om5lYXJieWludGY7CisgIHVzaW5nIDo6bmVhcmJ5aW50bDsKKworICB1c2luZyA6Om5leHRhZnRlcjsKKyAgdXNpbmcgOjpuZXh0YWZ0ZXJmOworICB1c2luZyA6Om5leHRhZnRlcmw7CisKKyAgdXNpbmcgOjpuZXh0dG93YXJkOworICB1c2luZyA6Om5leHR0b3dhcmRmOworICB1c2luZyA6Om5leHR0b3dhcmRsOworCisgIHVzaW5nIDo6cmVtYWluZGVyOworICB1c2luZyA6OnJlbWFpbmRlcmY7CisgIHVzaW5nIDo6cmVtYWluZGVybDsKKworICB1c2luZyA6OnJlbXF1bzsKKyAgdXNpbmcgOjpyZW1xdW9mOworICB1c2luZyA6OnJlbXF1b2w7CisKKyAgdXNpbmcgOjpyaW50OworICB1c2luZyA6OnJpbnRmOworICB1c2luZyA6OnJpbnRsOworCisgIHVzaW5nIDo6cm91bmQ7CisgIHVzaW5nIDo6cm91bmRmOworICB1c2luZyA6OnJvdW5kbDsKKworICB1c2luZyA6OnNjYWxibG47CisgIHVzaW5nIDo6c2NhbGJsbmY7CisgIHVzaW5nIDo6c2NhbGJsbmw7CisKKyAgdXNpbmcgOjpzY2FsYm47CisgIHVzaW5nIDo6c2NhbGJuZjsKKyAgdXNpbmcgOjpzY2FsYm5sOworCisgIHVzaW5nIDo6dGdhbW1hOworICB1c2luZyA6OnRnYW1tYWY7CisgIHVzaW5nIDo6dGdhbW1hbDsKKworICB1c2luZyA6OnRydW5jOworICB1c2luZyA6OnRydW5jZjsKKyAgdXNpbmcgOjp0cnVuY2w7CisKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRICisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfRlBfTUFDUk9TX0RZTkFNSUMKKworICAvLy8gRnVuY3Rpb24gdGVtcGxhdGUgZGVmaW5pdGlvbnMgWzguMTYuM10uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgZnBjbGFzc2lmeShfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5fZnBjbGFzc2lmeShGUF9OQU4sIEZQX0lORklOSVRFLCBGUF9OT1JNQUwsCisJCQkJICBGUF9TVUJOT1JNQUwsIEZQX1pFUk8sIF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2Zpbml0ZShfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNmaW5pdGUoX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzaW5mKF9UcCBfX2YpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2luZihfX3R5cGUoX19mKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNuYW4oX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzbmFuKF9fdHlwZShfX2YpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc25vcm1hbChfVHAgX19mKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNub3JtYWwoX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIHNpZ25iaXQoX1RwIF9fZikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX3NpZ25iaXQoX190eXBlKF9fZikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzZ3JlYXRlcihfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2dyZWF0ZXIoX190eXBlKF9fZjEpLCBfX3R5cGUoX19mMikpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUsCisJCQkJCSAgIGludD46Ol9fdHlwZQorICAgIGlzZ3JlYXRlcmVxdWFsKF9UcCBfX2YxLCBfVHAgX19mMikKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19idWlsdGluX2lzZ3JlYXRlcmVxdWFsKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2xlc3MoX1RwIF9fZjEsIF9UcCBfX2YyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNsZXNzKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc2xlc3NlcXVhbChfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NlcXVhbChfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZSwKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaXNsZXNzZ3JlYXRlcihfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc2xlc3NncmVhdGVyKF9fdHlwZShfX2YxKSwgX190eXBlKF9fZjIpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlLAorCQkJCQkgICBpbnQ+OjpfX3R5cGUKKyAgICBpc3Vub3JkZXJlZChfVHAgX19mMSwgX1RwIF9fZjIpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc3Vub3JkZXJlZChfX3R5cGUoX19mMSksIF9fdHlwZShfX2YyKSk7CisgICAgfQorCisjZW5kaWYKKyNlbmRpZgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCisgIC8vLyBBZGRpdGlvbmFsIG92ZXJsb2FkcyBbOC4xNi40XS4KKyAgdXNpbmcgc3RkOjphY29zOworCisgIGlubGluZSBmbG9hdAorICBhY29zaChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhY29zaChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9hY29zaGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGFjb3NoKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2Fjb3NoKF9feCk7IH0KKworICB1c2luZyBzdGQ6OmFzaW47CisKKyAgaW5saW5lIGZsb2F0CisgIGFzaW5oKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5oZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGFzaW5oKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2FzaW5obChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgYXNpbmgoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fYXNpbmgoX194KTsgfQorCisgIHVzaW5nIHN0ZDo6YXRhbjsKKyAgdXNpbmcgc3RkOjphdGFuMjsKKworICBpbmxpbmUgZmxvYXQKKyAgYXRhbmgoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbmhmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYXRhbmgobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fYXRhbmhsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBhdGFuaChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9hdGFuaChfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIGNicnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2JydGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjYnJ0KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2NicnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBjYnJ0KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2NicnQoX194KTsgfQorCisgIHVzaW5nIHN0ZDo6Y2VpbDsKKworICBpbmxpbmUgZmxvYXQKKyAgY29weXNpZ24oZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jb3B5c2lnbmYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvcHlzaWduKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fY29weXNpZ25sKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSwKKwkJCQkgICAgX1RwPjo6X190eXBlLCBfVXA+OjpfX3R5cGUKKyAgICBjb3B5c2lnbihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gY29weXNpZ24oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgdXNpbmcgc3RkOjpjb3M7CisgIHVzaW5nIHN0ZDo6Y29zaDsgIAorCisgIGlubGluZSBmbG9hdAorICBlcmYoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVyZihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBlcmYoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgZXJmYyhmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9lcmZjZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVyZmMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXJmY2woX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGVyZmMoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fZXJmYyhfX3gpOyB9CisKKyAgdXNpbmcgc3RkOjpleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGV4cDIoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fZXhwMmYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHAyKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2V4cDJsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBleHAyKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cDIoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBleHBtMShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMWYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHBtMShsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9leHBtMWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGV4cG0xKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2V4cG0xKF9feCk7IH0KKworICAvLyBOb3RlOiB3ZSBkZWFsIHdpdGggZmFicyBpbiBhIHNwZWNpYWwgd2F5LCBiZWNhdXNlIGFuIHVzaW5nIHN0ZDo6ZmFicworICAvLyB3b3VsZCBicmluZyBpbiBhbHNvIHRoZSBvdmVybG9hZHMgZm9yIGNvbXBsZXggdHlwZXMsIHdoaWNoIGluIEMrKzB4CisgIC8vIG1vZGUgaGF2ZSBhIGRpZmZlcmVudCByZXR1cm4gdHlwZS4KKyAgdXNpbmcgOjpmYWJzOworCisgIGlubGluZSBmbG9hdAorICBmYWJzKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZhYnNmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZmFicyhsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzbChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgZmFicyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9mYWJzKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgZmRpbShmbG9hdCBfX3gsIGZsb2F0IF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZkaW1mKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBmZGltKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZmRpbWwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXA+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlLAorCQkJCSAgICBfVHA+OjpfX3R5cGUsIF9VcD46Ol9fdHlwZQorICAgIGZkaW0oX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZkaW0oX190eXBlKF9feCksIF9fdHlwZShfX3kpKTsKKyAgICB9CisKKyAgdXNpbmcgc3RkOjpmbG9vcjsKKworICBpbmxpbmUgZmxvYXQKKyAgZm1hKGZsb2F0IF9feCwgZmxvYXQgX195LCBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWFmKF9feCwgX195LCBfX3opOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZtYShsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSwgbG9uZyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1hbChfX3gsIF9feSwgX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwLCB0eXBlbmFtZSBfVnA+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMzwKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfYXJpdGhtZXRpYzxfVHA+OjpfX3ZhbHVlCisJCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVXA+OjpfX3ZhbHVlCisJCQkJICAgICYmIF9faXNfYXJpdGhtZXRpYzxfVnA+OjpfX3ZhbHVlLAorCQkJCSAgICBfVHA+OjpfX3R5cGUsIF9VcCwgX1ZwPjo6X190eXBlCisgICAgZm1hKF9UcCBfX3gsIF9VcCBfX3ksIF9WcCBfX3opCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcCwgX1VwLCBfVnA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGZtYShfX3R5cGUoX194KSwgX190eXBlKF9feSksIF9fdHlwZShfX3opKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGZtYXgoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWF4ZihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgZm1heChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2ZtYXhsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSwKKwkJCQkgICAgX1RwPjo6X190eXBlLCBfVXA+OjpfX3R5cGUKKyAgICBmbWF4KF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBmbWF4KF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBmbWluKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fZm1pbmYoX194LCBfX3kpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGZtaW4obG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9mbWlubChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgZm1pbihfVHAgX194LCBfVXAgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gZm1pbihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OmZtb2Q7CisgIHVzaW5nIHN0ZDo6ZnJleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGh5cG90KGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5faHlwb3RmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBoeXBvdChsb25nIGRvdWJsZSBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX2h5cG90bChfX3gsIF9feSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgaHlwb3QoX1RwIF9feSwgX1VwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIGh5cG90KF9fdHlwZShfX3kpLCBfX3R5cGUoX194KSk7CisgICAgfQorCisgIGlubGluZSBpbnQKKyAgaWxvZ2IoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2JmKF9feCk7IH0KKworICBpbmxpbmUgaW50CisgIGlsb2diKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2lsb2dibChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgaW50Pjo6X190eXBlCisgICAgaWxvZ2IoX1RwIF9feCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5faWxvZ2IoX194KTsgfQorCisgIHVzaW5nIHN0ZDo6bGRleHA7CisKKyAgaW5saW5lIGZsb2F0CisgIGxnYW1tYShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWFmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbGdhbW1hKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xnYW1tYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxnYW1tYShfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sZ2FtbWEoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyaW50KGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscmludGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyaW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGxvbmcgbG9uZz46Ol9fdHlwZQorICAgIGxscmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJpbnQoX194KTsgfQorCisgIGlubGluZSBsb25nIGxvbmcKKyAgbGxyb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sbHJvdW5kZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgbG9uZworICBsbHJvdW5kKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nIGxvbmc+OjpfX3R5cGUKKyAgICBsbHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xscm91bmQoX194KTsgfQorCisgIHVzaW5nIHN0ZDo6bG9nOworICB1c2luZyBzdGQ6OmxvZzEwOworCisgIGlubGluZSBmbG9hdAorICBsb2cxcChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBsb2cxcChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cxcGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZzFwKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xvZzFwKF9feCk7IH0KKworICAvLyBEUiA1NjguCisgIGlubGluZSBmbG9hdAorICBsb2cyKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xvZzJmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbG9nMihsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cybChfX3gpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgbG9nMihfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2cyKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgbG9nYihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9sb2diZihfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxvZ2IobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbG9nYmwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIGxvZ2IoX1RwIF9feCkKKyAgICB7CisgICAgICByZXR1cm4gX19idWlsdGluX2xvZ2IoX194KTsKKyAgICB9CisKKyAgaW5saW5lIGxvbmcKKyAgbHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fbHJpbnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZworICBscmludChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scmludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGxvbmc+OjpfX3R5cGUKKyAgICBscmludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9scmludChfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcKKyAgbHJvdW5kKGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX2xyb3VuZGYoX194KTsgfQorCisgIGlubGluZSBsb25nCisgIGxyb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9scm91bmRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBsb25nPjo6X190eXBlCisgICAgbHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX2xyb3VuZChfX3gpOyB9CisKKyAgaW5saW5lIGZsb2F0CisgIG5lYXJieWludChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnRmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgbmVhcmJ5aW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX25lYXJieWludGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIG5lYXJieWludChfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZWFyYnlpbnQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICBuZXh0YWZ0ZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0YWZ0ZXJmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBuZXh0YWZ0ZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9uZXh0YWZ0ZXJsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSwKKwkJCQkgICAgX1RwPjo6X190eXBlLCBfVXA+OjpfX3R5cGUKKyAgICBuZXh0YWZ0ZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIG5leHRhZnRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgbmV4dHRvd2FyZChmbG9hdCBfX3gsIGxvbmcgZG91YmxlIF9feSkKKyAgeyByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmRmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBuZXh0dG93YXJkKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195KQorICB7IHJldHVybiBfX2J1aWx0aW5fbmV4dHRvd2FyZGwoX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPF9faXNfaW50ZWdlcjxfVHA+OjpfX3ZhbHVlLCAKKwkJCQkJICAgZG91YmxlPjo6X190eXBlCisgICAgbmV4dHRvd2FyZChfVHAgX194LCBsb25nIGRvdWJsZSBfX3kpCisgICAgeyByZXR1cm4gX19idWlsdGluX25leHR0b3dhcmQoX194LCBfX3kpOyB9CisKKyAgLy8gRFIgNTUwLiBXaGF0IHNob3VsZCB0aGUgcmV0dXJuIHR5cGUgb2YgcG93KGZsb2F0LGludCkgYmU/CisgIC8vIE5COiBDKysweCBhbmQgVFIxICE9IEMrKzAzLgorICAvLyAgIHVzaW5nIHN0ZDo6cG93OworCisgIGlubGluZSBmbG9hdAorICByZW1haW5kZXIoZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1haW5kZXJmKF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByZW1haW5kZXIobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yZW1haW5kZXJsKF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8CisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2FyaXRobWV0aWM8X1RwPjo6X192YWx1ZQorCQkJCSAgICAmJiBfX2lzX2FyaXRobWV0aWM8X1VwPjo6X192YWx1ZSwKKwkJCQkgICAgX1RwPjo6X190eXBlLCBfVXA+OjpfX3R5cGUKKyAgICByZW1haW5kZXIoX1RwIF9feCwgX1VwIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHJlbWFpbmRlcihfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgcmVtcXVvKGZsb2F0IF9feCwgZmxvYXQgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2YoX194LCBfX3ksIF9fcHF1byk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgcmVtcXVvKGxvbmcgZG91YmxlIF9feCwgbG9uZyBkb3VibGUgX195LCBpbnQqIF9fcHF1bykKKyAgeyByZXR1cm4gX19idWlsdGluX3JlbXF1b2woX194LCBfX3ksIF9fcHF1byk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPAorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19hcml0aG1ldGljPF9UcD46Ol9fdmFsdWUKKwkJCQkgICAgJiYgX19pc19hcml0aG1ldGljPF9VcD46Ol9fdmFsdWUsCisJCQkJICAgIF9UcD46Ol9fdHlwZSwgX1VwPjo6X190eXBlCisgICAgcmVtcXVvKF9UcCBfX3gsIF9VcCBfX3ksIGludCogX19wcXVvKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gcmVtcXVvKF9fdHlwZShfX3gpLCBfX3R5cGUoX195KSwgX19wcXVvKTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIHJpbnQoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fcmludGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByaW50KGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3JpbnRsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICByaW50KF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JpbnQoX194KTsgfQorCisgIGlubGluZSBmbG9hdAorICByb3VuZChmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGYoX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByb3VuZChsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9yb3VuZGwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHJvdW5kKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX19idWlsdGluX3JvdW5kKF9feCk7IH0KKworICBpbmxpbmUgZmxvYXQKKyAgc2NhbGJsbihmbG9hdCBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5mKF9feCwgX19leCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc2NhbGJsbihsb25nIGRvdWJsZSBfX3gsIGxvbmcgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibG5sKF9feCwgX19leCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICBzY2FsYmxuKF9UcCBfX3gsIGxvbmcgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJsbihfX3gsIF9fZXgpOyB9CisgCisgIGlubGluZSBmbG9hdAorICBzY2FsYm4oZmxvYXQgX194LCBpbnQgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibmYoX194LCBfX2V4KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBzY2FsYm4obG9uZyBkb3VibGUgX194LCBpbnQgX19leCkKKyAgeyByZXR1cm4gX19idWlsdGluX3NjYWxibmwoX194LCBfX2V4KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHNjYWxibihfVHAgX194LCBpbnQgX19leCkKKyAgICB7IHJldHVybiBfX2J1aWx0aW5fc2NhbGJuKF9feCwgX19leCk7IH0KKworICB1c2luZyBzdGQ6OnNpbjsKKyAgdXNpbmcgc3RkOjpzaW5oOworICB1c2luZyBzdGQ6OnNxcnQ7CisgIHVzaW5nIHN0ZDo6dGFuOworICB1c2luZyBzdGQ6OnRhbmg7CisKKyAgaW5saW5lIGZsb2F0CisgIHRnYW1tYShmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fYnVpbHRpbl90Z2FtbWFmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgdGdhbW1hKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19idWlsdGluX3RnYW1tYWwoX194KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjxfX2lzX2ludGVnZXI8X1RwPjo6X192YWx1ZSwgCisJCQkJCSAgIGRvdWJsZT46Ol9fdHlwZQorICAgIHRnYW1tYShfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90Z2FtbWEoX194KTsgfQorIAorICBpbmxpbmUgZmxvYXQKKyAgdHJ1bmMoZmxvYXQgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdHJ1bmNmKF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgdHJ1bmMobG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2J1aWx0aW5fdHJ1bmNsKF9feCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8X19pc19pbnRlZ2VyPF9UcD46Ol9fdmFsdWUsIAorCQkJCQkgICBkb3VibGU+OjpfX3R5cGUKKyAgICB0cnVuYyhfVHAgX194KQorICAgIHsgcmV0dXJuIF9fYnVpbHRpbl90cnVuYyhfX3gpOyB9CisKKyNlbmRpZgorX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBEUiA1NTAuIFdoYXQgc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiBwb3coZmxvYXQsaW50KSBiZT8KKyAgLy8gTkI6IEMrKzB4IGFuZCBUUjEgIT0gQysrMDMuCisgIGlubGluZSBkb3VibGUKKyAgcG93KGRvdWJsZSBfX3gsIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIGlubGluZSBmbG9hdAorICBwb3coZmxvYXQgX194LCBmbG9hdCBfX3kpCisgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBwb3cobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlCisgICAgcG93KF9UcCBfX3gsIF9VcCBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhfX3R5cGUoX194KSwgX190eXBlKF9feSkpOworICAgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDx0cjEvZ2FtbWEudGNjPgorI2luY2x1ZGUgPHRyMS9iZXNzZWxfZnVuY3Rpb24udGNjPgorI2luY2x1ZGUgPHRyMS9iZXRhX2Z1bmN0aW9uLnRjYz4KKyNpbmNsdWRlIDx0cjEvZWxsX2ludGVncmFsLnRjYz4KKyNpbmNsdWRlIDx0cjEvZXhwX2ludGVncmFsLnRjYz4KKyNpbmNsdWRlIDx0cjEvaHlwZXJnZW9tZXRyaWMudGNjPgorI2luY2x1ZGUgPHRyMS9sZWdlbmRyZV9mdW5jdGlvbi50Y2M+CisjaW5jbHVkZSA8dHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYz4KKyNpbmNsdWRlIDx0cjEvcG9seV9oZXJtaXRlLnRjYz4KKyNpbmNsdWRlIDx0cjEvcG9seV9sYWd1ZXJyZS50Y2M+CisjaW5jbHVkZSA8dHIxL3JpZW1hbm5femV0YS50Y2M+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIHRyMV9tYXRoX3NwZWNfZnVuYyBNYXRoZW1hdGljYWwgU3BlY2lhbCBGdW5jdGlvbnMKKyAgICogQGluZ3JvdXAgbnVtZXJpY3MKKyAgICoKKyAgICogQSBjb2xsZWN0aW9uIG9mIGFkdmFuY2VkIG1hdGhlbWF0aWNhbCBzcGVjaWFsIGZ1bmN0aW9ucy4KKyAgICogQHsKKyAgICovCisKKyAgaW5saW5lIGZsb2F0CisgIGFzc29jX2xhZ3VlcnJlZih1bnNpZ25lZCBpbnQgX19uLCB1bnNpZ25lZCBpbnQgX19tLCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xhZ3VlcnJlPGZsb2F0PihfX24sIF9fbSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBhc3NvY19sYWd1ZXJyZWwodW5zaWduZWQgaW50IF9fbiwgdW5zaWduZWQgaW50IF9fbSwgbG9uZyBkb3VibGUgX194KQorICB7CisgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xhZ3VlcnJlPGxvbmcgZG91YmxlPihfX24sIF9fbSwgX194KTsKKyAgfQorCisgIC8vLyAgNS4yLjEuMSAgQXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBhc3NvY19sYWd1ZXJyZSh1bnNpZ25lZCBpbnQgX19uLCB1bnNpZ25lZCBpbnQgX19tLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19hc3NvY19sYWd1ZXJyZTxfX3R5cGU+KF9fbiwgX19tLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgYXNzb2NfbGVnZW5kcmVmKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fYXNzb2NfbGVnZW5kcmVfcDxmbG9hdD4oX19sLCBfX20sIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYXNzb2NfbGVnZW5kcmVsKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fYXNzb2NfbGVnZW5kcmVfcDxsb25nIGRvdWJsZT4oX19sLCBfX20sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjIgIEFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb25zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGFzc29jX2xlZ2VuZHJlKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2Fzc29jX2xlZ2VuZHJlX3A8X190eXBlPihfX2wsIF9fbSwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGJldGFmKGZsb2F0IF9feCwgZmxvYXQgX195KQorICB7IHJldHVybiBfX2RldGFpbDo6X19iZXRhPGZsb2F0PihfX3gsIF9feSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgYmV0YWwobG9uZyBkb3VibGUgX194LCBsb25nIGRvdWJsZSBfX3kpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2JldGE8bG9uZyBkb3VibGU+KF9feCwgX195KTsgfQorCisgIC8vLyAgNS4yLjEuMyAgQmV0YSBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcHgsIHR5cGVuYW1lIF9UcHk+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RweCwgX1RweT46Ol9fdHlwZQorICAgIGJldGEoX1RweCBfX3gsIF9UcHkgX195KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHB4LCBfVHB5Pjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19iZXRhPF9fdHlwZT4oX194LCBfX3kpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY29tcF9lbGxpbnRfMWYoZmxvYXQgX19rKQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8xPGZsb2F0PihfX2spOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGNvbXBfZWxsaW50XzFsKGxvbmcgZG91YmxlIF9faykKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMTxsb25nIGRvdWJsZT4oX19rKTsgfQorCisgIC8vLyAgNS4yLjEuNCAgQ29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWxzIG9mIHRoZSBmaXJzdCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGNvbXBfZWxsaW50XzEoX1RwIF9faykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMTxfX3R5cGU+KF9fayk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBjb21wX2VsbGludF8yZihmbG9hdCBfX2spCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzI8ZmxvYXQ+KF9fayk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29tcF9lbGxpbnRfMmwobG9uZyBkb3VibGUgX19rKQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8yPGxvbmcgZG91YmxlPihfX2spOyB9CisKKyAgLy8vICA1LjIuMS41ICBDb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIHNlY29uZCBraW5kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGNvbXBfZWxsaW50XzIoX1RwIF9faykKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fY29tcF9lbGxpbnRfMjxfX3R5cGU+KF9fayk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBjb21wX2VsbGludF8zZihmbG9hdCBfX2ssIGZsb2F0IF9fbnUpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbXBfZWxsaW50XzM8ZmxvYXQ+KF9faywgX19udSk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29tcF9lbGxpbnRfM2wobG9uZyBkb3VibGUgX19rLCBsb25nIGRvdWJsZSBfX251KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8zPGxvbmcgZG91YmxlPihfX2ssIF9fbnUpOyB9CisKKyAgLy8vICA1LjIuMS42ICBDb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIHRoaXJkIGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1Rwbj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcG4+OjpfX3R5cGUKKyAgICBjb21wX2VsbGludF8zKF9UcCBfX2ssIF9UcG4gX19udSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVHBuPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jb21wX2VsbGludF8zPF9fdHlwZT4oX19rLCBfX251KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGNvbmZfaHlwZXJnZihmbG9hdCBfX2EsIGZsb2F0IF9fYywgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jb25mX2h5cGVyZzxmbG9hdD4oX19hLCBfX2MsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgY29uZl9oeXBlcmdsKGxvbmcgZG91YmxlIF9fYSwgbG9uZyBkb3VibGUgX19jLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2NvbmZfaHlwZXJnPGxvbmcgZG91YmxlPihfX2EsIF9fYywgX194KTsgfQorCisgIC8vLyAgNS4yLjEuNyAgQ29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwYywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcGEsIF9UcGMsIF9UcD46Ol9fdHlwZQorICAgIGNvbmZfaHlwZXJnKF9UcGEgX19hLCBfVHBjIF9fYywgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8X1RwYSwgX1RwYywgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jb25mX2h5cGVyZzxfX3R5cGU+KF9fYSwgX19jLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX2Jlc3NlbF9pZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfaTxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfYmVzc2VsX2lsKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9pPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS44ICBSZWd1bGFyIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9iZXNzZWxfaShfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2k8X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX2Jlc3NlbF9qZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfajxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfYmVzc2VsX2psKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9qPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS45ICBDeWxpbmRyaWNhbCBCZXNzZWwgZnVuY3Rpb25zIChvZiB0aGUgZmlyc3Qga2luZCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9iZXNzZWxfaihfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2o8X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX2Jlc3NlbF9rZihmbG9hdCBfX251LCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9iZXNzZWxfazxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfYmVzc2VsX2tsKGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX2Jlc3NlbF9rPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xMCAgSXJyZWd1bGFyIG1vZGlmaWVkIGN5bGluZHJpY2FsIEJlc3NlbCBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9iZXNzZWxfayhfVHBudSBfX251LCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHBudSwgX1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19jeWxfYmVzc2VsX2s8X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgY3lsX25ldW1hbm5mKGZsb2F0IF9fbnUsIGZsb2F0IF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fY3lsX25ldW1hbm5fbjxmbG9hdD4oX19udSwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBjeWxfbmV1bWFubmwobG9uZyBkb3VibGUgX19udSwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19jeWxfbmV1bWFubl9uPGxvbmcgZG91YmxlPihfX251LCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xMSAgQ3lsaW5kcmljYWwgTmV1bWFubiBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcG51LCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwbnUsIF9UcD46Ol9fdHlwZQorICAgIGN5bF9uZXVtYW5uKF9UcG51IF9fbnUsIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcG51LCBfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2N5bF9uZXVtYW5uX248X190eXBlPihfX251LCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZWxsaW50XzFmKGZsb2F0IF9faywgZmxvYXQgX19waGkpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8xPGZsb2F0PihfX2ssIF9fcGhpKTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBlbGxpbnRfMWwobG9uZyBkb3VibGUgX19rLCBsb25nIGRvdWJsZSBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzE8bG9uZyBkb3VibGU+KF9faywgX19waGkpOyB9CisKKyAgLy8vICA1LjIuMS4xMiAgSW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbHMgb2YgdGhlIGZpcnN0IGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUKKyAgICBlbGxpbnRfMShfVHAgX19rLCBfVHBwIF9fcGhpKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8xPF9fdHlwZT4oX19rLCBfX3BoaSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBlbGxpbnRfMmYoZmxvYXQgX19rLCBmbG9hdCBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzI8ZmxvYXQ+KF9faywgX19waGkpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVsbGludF8ybChsb25nIGRvdWJsZSBfX2ssIGxvbmcgZG91YmxlIF9fcGhpKQorICB7IHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMjxsb25nIGRvdWJsZT4oX19rLCBfX3BoaSk7IH0KKworICAvLy8gIDUuMi4xLjEzICBJbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFscyBvZiB0aGUgc2Vjb25kIGtpbmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUKKyAgICBlbGxpbnRfMihfVHAgX19rLCBfVHBwIF9fcGhpKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9UcHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2VsbGludF8yPF9fdHlwZT4oX19rLCBfX3BoaSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBlbGxpbnRfM2YoZmxvYXQgX19rLCBmbG9hdCBfX251LCBmbG9hdCBfX3BoaSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZWxsaW50XzM8ZmxvYXQ+KF9faywgX19udSwgX19waGkpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGVsbGludF8zbChsb25nIGRvdWJsZSBfX2ssIGxvbmcgZG91YmxlIF9fbnUsIGxvbmcgZG91YmxlIF9fcGhpKQorICB7IHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMzxsb25nIGRvdWJsZT4oX19rLCBfX251LCBfX3BoaSk7IH0KKworICAvLy8gIDUuMi4xLjE0ICBJbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFscyBvZiB0aGUgdGhpcmQga2luZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHBuLCB0eXBlbmFtZSBfVHBwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8zPF9UcCwgX1RwbiwgX1RwcD46Ol9fdHlwZQorICAgIGVsbGludF8zKF9UcCBfX2ssIF9UcG4gX19udSwgX1RwcCBfX3BoaSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzM8X1RwLCBfVHBuLCBfVHBwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19lbGxpbnRfMzxfX3R5cGU+KF9faywgX19udSwgX19waGkpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgZXhwaW50ZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2V4cGludDxmbG9hdD4oX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBleHBpbnRsKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fZXhwaW50PGxvbmcgZG91YmxlPihfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xNSAgRXhwb25lbnRpYWwgaW50ZWdyYWxzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIGV4cGludChfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19leHBpbnQ8X190eXBlPihfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgaGVybWl0ZWYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19wb2x5X2hlcm1pdGU8ZmxvYXQ+KF9fbiwgX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICBoZXJtaXRlbCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfaGVybWl0ZTxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xNiAgSGVybWl0ZSBwb2x5bm9taWFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBoZXJtaXRlKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfaGVybWl0ZTxfX3R5cGU+KF9fbiwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGh5cGVyZ2YoZmxvYXQgX19hLCBmbG9hdCBfX2IsIGZsb2F0IF9fYywgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19oeXBlcmc8ZmxvYXQ+KF9fYSwgX19iLCBfX2MsIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgaHlwZXJnbChsb25nIGRvdWJsZSBfX2EsIGxvbmcgZG91YmxlIF9fYiwgbG9uZyBkb3VibGUgX19jLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2h5cGVyZzxsb25nIGRvdWJsZT4oX19hLCBfX2IsIF9fYywgX194KTsgfQorCisgIC8vLyAgNS4yLjEuMTcgIEh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwYiwgdHlwZW5hbWUgX1RwYywgdHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV80PF9UcGEsIF9UcGIsIF9UcGMsIF9UcD46Ol9fdHlwZQorICAgIGh5cGVyZyhfVHBhIF9fYSwgX1RwYiBfX2IsIF9UcGMgX19jLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfNDxfVHBhLCBfVHBiLCBfVHBjLCBfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX2h5cGVyZzxfX3R5cGU+KF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBsYWd1ZXJyZWYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19sYWd1ZXJyZTxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxhZ3VlcnJlbCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX2xhZ3VlcnJlPGxvbmcgZG91YmxlPihfX24sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjE4ICBMYWd1ZXJyZSBwb2x5bm9taWFscy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBsYWd1ZXJyZSh1bnNpZ25lZCBpbnQgX19uLCBfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19sYWd1ZXJyZTxfX3R5cGU+KF9fbiwgX194KTsKKyAgICB9CisKKyAgaW5saW5lIGZsb2F0CisgIGxlZ2VuZHJlZih1bnNpZ25lZCBpbnQgX19uLCBmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfbGVnZW5kcmVfcDxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIGxlZ2VuZHJlbCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3BvbHlfbGVnZW5kcmVfcDxsb25nIGRvdWJsZT4oX19uLCBfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4xOSAgTGVnZW5kcmUgcG9seW5vbWlhbHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgbGVnZW5kcmUodW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fcG9seV9sZWdlbmRyZV9wPF9fdHlwZT4oX19uLCBfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgcmllbWFubl96ZXRhZihmbG9hdCBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3JpZW1hbm5femV0YTxmbG9hdD4oX194KTsgfQorCisgIGlubGluZSBsb25nIGRvdWJsZQorICByaWVtYW5uX3pldGFsKGxvbmcgZG91YmxlIF9feCkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fcmllbWFubl96ZXRhPGxvbmcgZG91YmxlPihfX3gpOyB9CisKKyAgLy8vICA1LjIuMS4yMCAgUmllbWFubiB6ZXRhIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIHJpZW1hbm5femV0YShfVHAgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19yaWVtYW5uX3pldGE8X190eXBlPihfX3gpOworICAgIH0KKworICBpbmxpbmUgZmxvYXQKKyAgc3BoX2Jlc3NlbGYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfYmVzc2VsPGZsb2F0PihfX24sIF9feCk7IH0KKworICBpbmxpbmUgbG9uZyBkb3VibGUKKyAgc3BoX2Jlc3NlbGwodW5zaWduZWQgaW50IF9fbiwgbG9uZyBkb3VibGUgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfYmVzc2VsPGxvbmcgZG91YmxlPihfX24sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjIxICBTcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICBzcGhfYmVzc2VsKHVuc2lnbmVkIGludCBfX24sIF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9iZXNzZWw8X190eXBlPihfX24sIF9feCk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBzcGhfbGVnZW5kcmVmKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIGZsb2F0IF9fdGhldGEpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9sZWdlbmRyZTxmbG9hdD4oX19sLCBfX20sIF9fdGhldGEpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNwaF9sZWdlbmRyZWwodW5zaWduZWQgaW50IF9fbCwgdW5zaWduZWQgaW50IF9fbSwgbG9uZyBkb3VibGUgX190aGV0YSkKKyAgeyByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX2xlZ2VuZHJlPGxvbmcgZG91YmxlPihfX2wsIF9fbSwgX190aGV0YSk7IH0KKworICAvLy8gIDUuMi4xLjIyICBTcGhlcmljYWwgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgc3BoX2xlZ2VuZHJlKHVuc2lnbmVkIGludCBfX2wsIHVuc2lnbmVkIGludCBfX20sIF9UcCBfX3RoZXRhKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBfX2RldGFpbDo6X19zcGhfbGVnZW5kcmU8X190eXBlPihfX2wsIF9fbSwgX190aGV0YSk7CisgICAgfQorCisgIGlubGluZSBmbG9hdAorICBzcGhfbmV1bWFubmYodW5zaWduZWQgaW50IF9fbiwgZmxvYXQgX194KQorICB7IHJldHVybiBfX2RldGFpbDo6X19zcGhfbmV1bWFubjxmbG9hdD4oX19uLCBfX3gpOyB9CisKKyAgaW5saW5lIGxvbmcgZG91YmxlCisgIHNwaF9uZXVtYW5ubCh1bnNpZ25lZCBpbnQgX19uLCBsb25nIGRvdWJsZSBfX3gpCisgIHsgcmV0dXJuIF9fZGV0YWlsOjpfX3NwaF9uZXVtYW5uPGxvbmcgZG91YmxlPihfX24sIF9feCk7IH0KKworICAvLy8gIDUuMi4xLjIzICBTcGhlcmljYWwgTmV1bWFubiBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgc3BoX25ldW1hbm4odW5zaWduZWQgaW50IF9fbiwgX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX19kZXRhaWw6Ol9fc3BoX25ldW1hbm48X190eXBlPihfX24sIF9feCk7CisgICAgfQorCisgIC8qIEB9ICovIC8vIHRyMV9tYXRoX3NwZWNfZnVuYworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ01BVEgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NvbXBsZXggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jb21wbGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWVhMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jb21wbGV4CkBAIC0wLDAgKzEsNDE5IEBACisvLyBUUjEgY29tcGxleCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY29tcGxleAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DT01QTEVYCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DT01QTEVYIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y29tcGxleD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCBjb21wbGV4X251bWJlcnMKKyAgICogQHsKKyAgICovCisKKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB1c2luZyBzdGQ6OmFjb3M7CisgIHVzaW5nIHN0ZDo6YXNpbjsKKyAgdXNpbmcgc3RkOjphdGFuOworI2Vsc2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gc3RkOjpjb21wbGV4PF9UcD4gYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiBzdGQ6OmNvbXBsZXg8X1RwPiBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYpOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+Jik7CisKKyAgLy8gVGhlIHN0ZDo6ZmFicyByZXR1cm4gdHlwZSBpbiBDKysweCBtb2RlIGlzIGRpZmZlcmVudCAoanVzdCBfVHApLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0ZDo6Y29tcGxleDxfVHA+IGZhYnMoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mKTsKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2Fjb3MoY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiBfX3QgPSBzdGQ6OnRyMTo6YXNpbihfX3opOworICAgICAgY29uc3QgX1RwIF9fcGlfMiA9IDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEw7CisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX19waV8yIC0gX190LnJlYWwoKSwgLV9fdC5pbWFnKCkpOworICAgIH0KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfQ09NUExFWF9UUjEKKyAgaW5saW5lIF9fY29tcGxleF9fIGZsb2F0CisgIF9fY29tcGxleF9hY29zKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvcyhfX2NvbXBsZXhfXyBkb3VibGUgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3MoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvcyhjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NsKF9feik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYWNvcyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hY29zKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFjb3MoX196KSBbOC4xLjJdLgorICAvLyAgRWZmZWN0czogIEJlaGF2ZXMgdGhlIHNhbWUgYXMgQzk5IGZ1bmN0aW9uIGNhY29zLCBkZWZpbmVkCisgIC8vICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDcuMy41LjEuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhY29zKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3MoX196KTsgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hc2luKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeworICAgICAgc3RkOjpjb21wbGV4PF9UcD4gX190KC1fX3ouaW1hZygpLCBfX3oucmVhbCgpKTsKKyAgICAgIF9fdCA9IHN0ZDo6dHIxOjphc2luaChfX3QpOworICAgICAgcmV0dXJuIHN0ZDo6Y29tcGxleDxfVHA+KF9fdC5pbWFnKCksIC1fX3QucmVhbCgpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXNpbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2lubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXNpbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luKF9feikgWzguMS4zXS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXNpbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXNpbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luKF9feik7IH0KKyNlbmRpZgorICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgX19jb21wbGV4X2F0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19yMiA9IF9fei5yZWFsKCkgKiBfX3oucmVhbCgpOworICAgICAgY29uc3QgX1RwIF9feCA9IF9UcCgxLjApIC0gX19yMiAtIF9fei5pbWFnKCkgKiBfX3ouaW1hZygpOworCisgICAgICBfVHAgX19udW0gPSBfX3ouaW1hZygpICsgX1RwKDEuMCk7CisgICAgICBfVHAgX19kZW4gPSBfX3ouaW1hZygpIC0gX1RwKDEuMCk7CisKKyAgICAgIF9fbnVtID0gX19yMiArIF9fbnVtICogX19udW07CisgICAgICBfX2RlbiA9IF9fcjIgKyBfX2RlbiAqIF9fZGVuOworCisgICAgICByZXR1cm4gc3RkOjpjb21wbGV4PF9UcD4oX1RwKDAuNSkgKiBhdGFuMihfVHAoMi4wKSAqIF9fei5yZWFsKCksIF9feCksCisJCQkgICAgICAgX1RwKDAuMjUpICogbG9nKF9fbnVtIC8gX19kZW4pKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbihfX2NvbXBsZXhfXyBmbG9hdCBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXRhbmYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuKF9feik7IH0KKworICBpbmxpbmUgX19jb21wbGV4X18gbG9uZyBkb3VibGUKKyAgX19jb21wbGV4X2F0YW4oY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFubChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW4oY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7IHJldHVybiBfX2NvbXBsZXhfYXRhbihfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhdGFuKF9feikgWzguMS40XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbiwgZGVmaW5lZAorICAvLyAgICAgICAgICAgIGluIHN1YmNsYXVzZSA3LjMuNS4zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgYXRhbihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hdGFuKF9feik7IH0KKyNlbmRpZgorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBfX2NvbXBsZXhfYWNvc2goY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feikKKyAgICB7CisgICAgICAvLyBLYWhhbidzIGZvcm11bGEuCisgICAgICByZXR1cm4gX1RwKDIuMCkgKiBzdGQ6OmxvZyhzdGQ6OnNxcnQoX1RwKDAuNSkgKiAoX196ICsgX1RwKDEuMCkpKQorCQkJCSArIHN0ZDo6c3FydChfVHAoMC41KSAqIChfX3ogLSBfVHAoMS4wKSkpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYWNvc2goX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NoZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYWNvc2goX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhY29zaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hY29zaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2Fjb3NobChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3NoKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGFjb3NoKF9feikgWzguMS41XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWNvc2gsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFjb3NoKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2Fjb3NoKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIHN0ZDo6Y29tcGxleDxfVHA+IF9fdCgoX196LnJlYWwoKSAtIF9fei5pbWFnKCkpCisJCQkgICAgKiAoX196LnJlYWwoKSArIF9fei5pbWFnKCkpICsgX1RwKDEuMCksCisJCQkgICAgX1RwKDIuMCkgKiBfX3oucmVhbCgpICogX196LmltYWcoKSk7CisgICAgICBfX3QgPSBzdGQ6OnNxcnQoX190KTsKKworICAgICAgcmV0dXJuIHN0ZDo6bG9nKF9fdCArIF9feik7CisgICAgfQorCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMQorICBpbmxpbmUgX19jb21wbGV4X18gZmxvYXQKKyAgX19jb21wbGV4X2FzaW5oKF9fY29tcGxleF9fIGZsb2F0IF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaGYoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBkb3VibGUKKyAgX19jb21wbGV4X2FzaW5oKF9fY29tcGxleF9fIGRvdWJsZSBfX3opCisgIHsgcmV0dXJuIF9fYnVpbHRpbl9jYXNpbmgoX196KTsgfQorCisgIGlubGluZSBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZQorICBfX2NvbXBsZXhfYXNpbmgoY29uc3QgX19jb21wbGV4X18gbG9uZyBkb3VibGUmIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2Nhc2luaGwoX196KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBhc2luaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIF9fY29tcGxleF9hc2luaChfX3ouX19yZXAoKSk7IH0KKyNlbHNlCisgIC8vLyBhc2luaChfX3opIFs4LjEuNl0uCisgIC8vICBFZmZlY3RzOiAgQmVoYXZlcyB0aGUgc2FtZSBhcyBDOTkgZnVuY3Rpb24gY2FzaW4sIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGFzaW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2FzaW5oKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIF9fY29tcGxleF9hdGFuaChjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2kyID0gX196LmltYWcoKSAqIF9fei5pbWFnKCk7CisgICAgICBjb25zdCBfVHAgX194ID0gX1RwKDEuMCkgLSBfX2kyIC0gX196LnJlYWwoKSAqIF9fei5yZWFsKCk7CisKKyAgICAgIF9UcCBfX251bSA9IF9UcCgxLjApICsgX196LnJlYWwoKTsKKyAgICAgIF9UcCBfX2RlbiA9IF9UcCgxLjApIC0gX196LnJlYWwoKTsKKworICAgICAgX19udW0gPSBfX2kyICsgX19udW0gKiBfX251bTsKKyAgICAgIF9fZGVuID0gX19pMiArIF9fZGVuICogX19kZW47CisKKyAgICAgIHJldHVybiBzdGQ6OmNvbXBsZXg8X1RwPihfVHAoMC4yNSkgKiAobG9nKF9fbnVtKSAtIGxvZyhfX2RlbikpLAorCQkJICAgICAgIF9UcCgwLjUpICogYXRhbjIoX1RwKDIuMCkgKiBfX3ouaW1hZygpLCBfX3gpKTsKKyAgICB9CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVhfVFIxCisgIGlubGluZSBfX2NvbXBsZXhfXyBmbG9hdAorICBfX2NvbXBsZXhfYXRhbmgoX19jb21wbGV4X18gZmxvYXQgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5oZihfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGRvdWJsZQorICBfX2NvbXBsZXhfYXRhbmgoX19jb21wbGV4X18gZG91YmxlIF9feikKKyAgeyByZXR1cm4gX19idWlsdGluX2NhdGFuaChfX3opOyB9CisKKyAgaW5saW5lIF9fY29tcGxleF9fIGxvbmcgZG91YmxlCisgIF9fY29tcGxleF9hdGFuaChjb25zdCBfX2NvbXBsZXhfXyBsb25nIGRvdWJsZSYgX196KQorICB7IHJldHVybiBfX2J1aWx0aW5fY2F0YW5obChfX3opOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW5oKF9fei5fX3JlcCgpKTsgfQorI2Vsc2UKKyAgLy8vIGF0YW5oKF9feikgWzguMS43XS4KKyAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYXRhbmgsIGRlZmluZWQKKyAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjYuMy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIGF0YW5oKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gX19jb21wbGV4X2F0YW5oKF9feik7IH0KKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICAvLy8gZmFicyhfX3opIFs4LjEuOF0uCisgICAgLy8gIEVmZmVjdHM6ICBCZWhhdmVzIHRoZSBzYW1lIGFzIEM5OSBmdW5jdGlvbiBjYWJzLCBkZWZpbmVkCisgICAgLy8gICAgICAgICAgICBpbiBzdWJjbGF1c2UgNy4zLjguMS4KKyAgICBmYWJzKGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3opCisgICAgeyByZXR1cm4gc3RkOjphYnMoX196KTsgfQorCisgIC8vLyBBZGRpdGlvbmFsIG92ZXJsb2FkcyBbOC4xLjldLgorI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgYXJnKF9UcCBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUgX190eXBlOworI2lmIChfR0xJQkNYWF9VU0VfQzk5X01BVEggJiYgIV9HTElCQ1hYX1VTRV9DOTlfRlBfTUFDUk9TX0RZTkFNSUMpCisgICAgICByZXR1cm4gc3RkOjpzaWduYml0KF9feCkgPyBfX3R5cGUoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TCkKKwkgICAgICAgICAgICAgICAgICAgICAgIDogX190eXBlKCk7CisjZWxzZQorICAgICAgcmV0dXJuIHN0ZDo6YXJnKHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feCkpOworI2VuZGlmCisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGU8X1RwPjo6X190eXBlCisgICAgaW1hZyhfVHApCisgICAgeyByZXR1cm4gX1RwKCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZQorICAgIG5vcm0oX1RwIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlPF9UcD46Ol9fdHlwZSBfX3R5cGU7CisgICAgICByZXR1cm4gX190eXBlKF9feCkgKiBfX3R5cGUoX194KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGUKKyAgICByZWFsKF9UcCBfX3gpCisgICAgeyByZXR1cm4gX194OyB9CisKKyNlbmRpZgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3QgX1VwJiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhzdGQ6OmNvbXBsZXg8X190eXBlPihfX3gpLCBfX3R5cGUoX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVXA+JiBfX3kpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvdyhfX3R5cGUoX194KSwgc3RkOjpjb21wbGV4PF9fdHlwZT4oX195KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb3coY29uc3Qgc3RkOjpjb21wbGV4PF9UcD4mIF9feCwgY29uc3Qgc3RkOjpjb21wbGV4PF9VcD4mIF9feSkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19wcm9tb3RlXzI8X1RwLCBfVXA+OjpfX3R5cGUgX190eXBlOworICAgICAgcmV0dXJuIHN0ZDo6cG93KHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feCksCisJCSAgICAgIHN0ZDo6Y29tcGxleDxfX3R5cGU+KF9feSkpOworICAgIH0KKworICB1c2luZyBzdGQ6OmFyZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgY29uaihjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX196KQorICAgIHsgcmV0dXJuIHN0ZDo6Y29uaihfX3opOyB9ICAKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDx0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZTxfVHA+OjpfX3R5cGU+CisgICAgY29uaihfVHAgX194KQorICAgIHsgcmV0dXJuIF9feDsgfQorCisgIHVzaW5nIHN0ZDo6aW1hZzsKKyAgdXNpbmcgc3RkOjpub3JtOworICB1c2luZyBzdGQ6OnBvbGFyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8dHlwZW5hbWUgX19nbnVfY3h4OjpfX3Byb21vdGVfMjxfVHAsIF9VcD46Ol9fdHlwZT4KKyAgICBwb2xhcihjb25zdCBfVHAmIF9fcmhvLCBjb25zdCBfVXAmIF9fdGhldGEpCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fcHJvbW90ZV8yPF9UcCwgX1VwPjo6X190eXBlIF9fdHlwZTsKKyAgICAgIHJldHVybiBzdGQ6OnBvbGFyKF9fdHlwZShfX3JobyksIF9fdHlwZShfX3RoZXRhKSk7CisgICAgfQorCisgIHVzaW5nIHN0ZDo6cmVhbDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHN0ZDo6Y29tcGxleDxfVHA+CisgICAgcG93KGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3gsIGNvbnN0IF9UcCYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgc3RkOjpjb21wbGV4PF9UcD4KKyAgICBwb3coY29uc3QgX1RwJiBfX3gsIGNvbnN0IHN0ZDo6Y29tcGxleDxfVHA+JiBfX3kpCisgICAgeyByZXR1cm4gc3RkOjpwb3coX194LCBfX3kpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzdGQ6OmNvbXBsZXg8X1RwPgorICAgIHBvdyhjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX194LCBjb25zdCBzdGQ6OmNvbXBsZXg8X1RwPiYgX195KQorICAgIHsgcmV0dXJuIHN0ZDo6cG93KF9feCwgX195KTsgfQorCisvLyBAfSBncm91cCBjb21wbGV4X251bWJlcnMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ09NUExFWApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY29tcGxleC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY29tcGxleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjg4MTAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jb21wbGV4LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGNvbXBsZXguaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jb21wbGV4LmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ09NUExFWF9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DT01QTEVYX0ggMQorCisjaW5jbHVkZSA8dHIxL2Njb21wbGV4PgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NPTVBMRVhfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3N0ZGFyZyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NzdGRhcmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyZTg4MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NzdGRhcmcKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGNzdGRhcmcgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3N0ZGFyZworICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DU1REQVJHCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DU1REQVJHIDEKKworI2luY2x1ZGUgPGNzdGRhcmc+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1NUREFSRwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3N0ZGJvb2wgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jc3RkYm9vbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjhlNGI4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3N0ZGJvb2wKQEAgLTAsMCArMSw0MCBAQAorLy8gVFIxIGNzdGRib29sIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NzdGRib29sCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NTVERCT09MCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DU1REQk9PTCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKKyNpZiBfR0xJQkNYWF9IQVZFX1NUREJPT0xfSAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NTVERCT09MCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jc3RkaW50IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3N0ZGludApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNlNGJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3N0ZGludApAQCAtMCwwICsxLDEwNCBAQAorLy8gVFIxIGNzdGRpbnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3N0ZGludAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DU1RESU5UCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DU1RESU5UIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKworLy8gRm9yIDguMjIuMS8xIChzZWUgQzk5LCBOb3RlcyAyMTksIDIyMCwgMjIyKQorIyBpZiBfR0xJQkNYWF9IQVZFX1NURElOVF9ICisjICBpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworIyAgIGRlZmluZSBfVU5ERUZfX1NURENfTElNSVRfTUFDUk9TCisjICAgZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyMgIGVuZGlmCisjICBpZm5kZWYgX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgIGRlZmluZSBfVU5ERUZfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICAgZGVmaW5lIF9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgIGVuZGlmCisjICBpbmNsdWRlIDxzdGRpbnQuaD4KKyMgIGlmZGVmIF9VTkRFRl9fU1REQ19MSU1JVF9NQUNST1MKKyMgICB1bmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjICAgdW5kZWYgX1VOREVGX19TVERDX0xJTUlUX01BQ1JPUworIyAgZW5kaWYKKyMgIGlmZGVmIF9VTkRFRl9fU1REQ19DT05TVEFOVF9NQUNST1MKKyMgICB1bmRlZiBfX1NURENfQ09OU1RBTlRfTUFDUk9TCisjICAgdW5kZWYgX1VOREVGX19TVERDX0NPTlNUQU5UX01BQ1JPUworIyAgZW5kaWYKKyMgZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgdXNpbmcgOjppbnQ4X3Q7CisgIHVzaW5nIDo6aW50MTZfdDsKKyAgdXNpbmcgOjppbnQzMl90OworICB1c2luZyA6OmludDY0X3Q7CisKKyAgdXNpbmcgOjppbnRfZmFzdDhfdDsKKyAgdXNpbmcgOjppbnRfZmFzdDE2X3Q7CisgIHVzaW5nIDo6aW50X2Zhc3QzMl90OworICB1c2luZyA6OmludF9mYXN0NjRfdDsKKworICB1c2luZyA6OmludF9sZWFzdDhfdDsKKyAgdXNpbmcgOjppbnRfbGVhc3QxNl90OworICB1c2luZyA6OmludF9sZWFzdDMyX3Q7CisgIHVzaW5nIDo6aW50X2xlYXN0NjRfdDsKKworICB1c2luZyA6OmludG1heF90OworICB1c2luZyA6OmludHB0cl90OworICAKKyAgdXNpbmcgOjp1aW50OF90OworICB1c2luZyA6OnVpbnQxNl90OworICB1c2luZyA6OnVpbnQzMl90OworICB1c2luZyA6OnVpbnQ2NF90OworCisgIHVzaW5nIDo6dWludF9mYXN0OF90OworICB1c2luZyA6OnVpbnRfZmFzdDE2X3Q7CisgIHVzaW5nIDo6dWludF9mYXN0MzJfdDsKKyAgdXNpbmcgOjp1aW50X2Zhc3Q2NF90OworCisgIHVzaW5nIDo6dWludF9sZWFzdDhfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0MTZfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0MzJfdDsKKyAgdXNpbmcgOjp1aW50X2xlYXN0NjRfdDsKKworICB1c2luZyA6OnVpbnRtYXhfdDsKKyAgdXNpbmcgOjp1aW50cHRyX3Q7Cit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5X1NURElOVF9UUjEKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DU1RESU5UCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NzdGRpbyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NzdGRpbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTVlOGE0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3N0ZGlvCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFRSMSBjc3RkaW8gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3N0ZGlvCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NTVERJTworI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1NURElPIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgdXNpbmcgc3RkOjpzbnByaW50ZjsKKyAgdXNpbmcgc3RkOjp2c25wcmludGY7CisKKyAgdXNpbmcgc3RkOjp2ZnNjYW5mOworICB1c2luZyBzdGQ6OnZzY2FuZjsKKyAgdXNpbmcgc3RkOjp2c3NjYW5mOworfQorfQorCisjZW5kaWYKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DU1RESU8KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2NzdGRsaWIgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jc3RkbGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlM2UxNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jc3RkbGliCkBAIC0wLDAgKzEsNzIgQEAKKy8vIFRSMSBjc3RkbGliIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2NzdGRsaWIKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1NURExJQgorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1NURExJQiAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpZiBfR0xJQkNYWF9IT1NURUQKKworI2lmIF9HTElCQ1hYX1VTRV9DOTkKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisjaWYgIV9HTElCQ1hYX1VTRV9DOTlfTE9OR19MT05HX0RZTkFNSUMKKyAgLy8gdHlwZXMKKyAgdXNpbmcgc3RkOjpsbGRpdl90OworCisgIC8vIGZ1bmN0aW9ucworICB1c2luZyBzdGQ6OmxsYWJzOworICB1c2luZyBzdGQ6OmxsZGl2OworI2VuZGlmCisKKyAgdXNpbmcgc3RkOjphdG9sbDsKKyAgdXNpbmcgc3RkOjpzdHJ0b2xsOworICB1c2luZyBzdGQ6OnN0cnRvdWxsOworCisgIHVzaW5nIHN0ZDo6c3RydG9mOworICB1c2luZyBzdGQ6OnN0cnRvbGQ7CisKKyAgLy8gb3ZlcmxvYWRzCisgIHVzaW5nIHN0ZDo6YWJzOworI2lmICFfR0xJQkNYWF9VU0VfQzk5X0xPTkdfTE9OR19EWU5BTUlDCisgIHVzaW5nIHN0ZDo6ZGl2OworI2VuZGlmCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfQzk5IAorCisjZW5kaWYgLy8gX0dMSUJDWFhfSE9TVEVECisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfQ1NURExJQgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3RnbWF0aCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N0Z21hdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYTlhMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N0Z21hdGgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGN0Z21hdGggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3RnbWF0aAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DVEdNQVRICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DVEdNQVRIIDEKKworI2luY2x1ZGUgPHRyMS9jbWF0aD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9DVEdNQVRICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jdGltZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N0aW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzYzMzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jdGltZQpAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgY3RpbWUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3RpbWUKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfQ1RJTUUKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0NUSU1FIDEKKworI2luY2x1ZGUgPGN0aW1lPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NUSU1FCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9jdHlwZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJiZWRiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3R5cGUuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgY3R5cGUuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9jdHlwZS5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9DVFlQRV9ICisjZGVmaW5lIF9UUjFfQ1RZUEVfSCAxCisKKyNpbmNsdWRlIDx0cjEvY2N0eXBlPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N3Y2hhciBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N3Y2hhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY3NzViCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3djaGFyCkBAIC0wLDAgKzEsNjUgQEAKKy8vIFRSMSBjd2NoYXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3djaGFyCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0NXQ0hBUgorI2RlZmluZSBfR0xJQkNYWF9UUjFfQ1dDSEFSIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3djaGFyPgorCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisjaWYgX0dMSUJDWFhfSEFWRV9XQ1NUT0YKKyAgdXNpbmcgc3RkOjp3Y3N0b2Y7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZGV1NDQU5GCisgIHVzaW5nIHN0ZDo6dmZ3c2NhbmY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZTV1NDQU5GCisgIHVzaW5nIHN0ZDo6dnN3c2NhbmY7CisjZW5kaWYKKyNpZiBfR0xJQkNYWF9IQVZFX1ZXU0NBTkYKKyAgdXNpbmcgc3RkOjp2d3NjYW5mOworI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5CisgIHVzaW5nIHN0ZDo6d2NzdG9sZDsKKyAgdXNpbmcgc3RkOjp3Y3N0b2xsOworICB1c2luZyBzdGQ6Ondjc3RvdWxsOworI2VuZGlmCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NXQ0hBUgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvY3djdHlwZSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N3Y3R5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyYTdiNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2N3Y3R5cGUKQEAgLTAsMCArMSw1MCBAQAorLy8gVFIxIGN3Y3R5cGUgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvY3djdHlwZQorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9DV0NUWVBFCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9DV0NUWVBFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Y3djdHlwZT4KKworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworI2lmIF9HTElCQ1hYX0hBVkVfSVNXQkxBTksKKyAgdXNpbmcgc3RkOjppc3dibGFuazsKKyNlbmRpZiAgCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9VU0VfV0NIQVJfVAorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0NXQ1RZUEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2VsbF9pbnRlZ3JhbC50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9lbGxfaW50ZWdyYWwudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmU2MTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9lbGxfaW50ZWdyYWwudGNjCkBAIC0wLDAgKzEsNzUxIEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2VsbF9pbnRlZ3JhbC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkIG9uOgorLy8gICAoMSkgIEIuIEMuIENhcmxzb24gTnVtZXIuIE1hdGguIDMzLCAxICgxOTc5KQorLy8gICAoMikgIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisvLyAgICgzKSAgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKy8vICAgKDQpICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIGJ5IFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksCisvLyAgICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzCisvLyAgICAgICAgKDE5OTIpLCBwcC4gMjYxLTI2OQorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9FTExfSU5URUdSQUxfVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9FTExfSU5URUdSQUxfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBAZiQgUl9GKHgseSx6KSBAZiQKKyAgICAgKiAgICAgICAgICBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBSX0YoeCx5LHopID0gXGZyYWN7MX17Mn0gXGludF8wXlxpbmZ0eQorICAgICAqICAgICAgICAgICAgICAgICBcZnJhY3tkdH17KHQgKyB4KV57MS8yfSh0ICsgeSleezEvMn0odCArIHopXnsxLzJ9fQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3Qgb2YgdGhyZWUgc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX195ICBUaGUgc2Vjb25kIG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feiAgVGhlIHRoaXJkIG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcmV0dXJuICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19lbGxpbnRfcmYoY29uc3QgX1RwIF9feCwgY29uc3QgX1RwIF9feSwgY29uc3QgX1RwIF9feikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19taW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1pbigpOworICAgICAgY29uc3QgX1RwIF9fbWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKTsKKyAgICAgIGNvbnN0IF9UcCBfX2xvbGltID0gX1RwKDUpICogX19taW47CisgICAgICBjb25zdCBfVHAgX191cGxpbSA9IF9fbWF4IC8gX1RwKDUpOworCisgICAgICBpZiAoX194IDwgX1RwKDApIHx8IF9feSA8IF9UcCgwKSB8fCBfX3ogPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yZi4iKSk7CisgICAgICBlbHNlIGlmIChfX3ggKyBfX3kgPCBfX2xvbGltIHx8IF9feCArIF9feiA8IF9fbG9saW0KKyAgICAgICAgICAgIHx8IF9feSArIF9feiA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCB0b28gc21hbGwgaW4gX19lbGxpbnRfcmYiKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgxKSAvIF9UcCgyNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzIgPSBfVHAoMSkgLyBfVHAoMTApOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MzID0gX1RwKDMpIC8gX1RwKDQ0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jNCA9IF9UcCgxKSAvIF9UcCgxNCk7CisKKyAgICAgICAgICBfVHAgX194biA9IF9feDsKKyAgICAgICAgICBfVHAgX195biA9IF9feTsKKyAgICAgICAgICBfVHAgX196biA9IF9fejsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2VycnRvbCA9IHN0ZDo6cG93KF9fZXBzLCBfVHAoMSkgLyBfVHAoNikpOworICAgICAgICAgIF9UcCBfX211OworICAgICAgICAgIF9UcCBfX3huZGV2LCBfX3luZGV2LCBfX3puZGV2OworCisgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pdGVyID0gMDsgX19pdGVyIDwgX19tYXhfaXRlcjsgKytfX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fbXUgPSAoX194biArIF9feW4gKyBfX3puKSAvIF9UcCgzKTsKKyAgICAgICAgICAgICAgX194bmRldiA9IDIgLSAoX19tdSArIF9feG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX195bmRldiA9IDIgLSAoX19tdSArIF9feW4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX196bmRldiA9IDIgLSAoX19tdSArIF9fem4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX1RwIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KHN0ZDo6YWJzKF9feG5kZXYpLCBzdGQ6OmFicyhfX3luZGV2KSk7CisgICAgICAgICAgICAgIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KF9fZXBzaWxvbiwgc3RkOjphYnMoX196bmRldikpOworICAgICAgICAgICAgICBpZiAoX19lcHNpbG9uIDwgX19lcnJ0b2wpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3hucm9vdCA9IHN0ZDo6c3FydChfX3huKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9feW5yb290ID0gc3RkOjpzcXJ0KF9feW4pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX196bnJvb3QgPSBzdGQ6OnNxcnQoX196bik7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2xhbWJkYSA9IF9feG5yb290ICogKF9feW5yb290ICsgX196bnJvb3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feW5yb290ICogX196bnJvb3Q7CisgICAgICAgICAgICAgIF9feG4gPSBfX2MwICogKF9feG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9feW4gPSBfX2MwICogKF9feW4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9fem4gPSBfX2MwICogKF9fem4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBfVHAgX19lMiA9IF9feG5kZXYgKiBfX3luZGV2IC0gX196bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgY29uc3QgX1RwIF9fZTMgPSBfX3huZGV2ICogX195bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgY29uc3QgX1RwIF9fcyAgPSBfVHAoMSkgKyAoX19jMSAqIF9fZTIgLSBfX2MyIC0gX19jMyAqIF9fZTMpICogX19lMgorICAgICAgICAgICAgICAgICAgICsgX19jNCAqIF9fZTM7CisKKyAgICAgICAgICByZXR1cm4gX19zIC8gc3RkOjpzcXJ0KF9fbXUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kCisgICAgICogICAgICAgICAgQGYkIEsoaykgQGYkIGJ5IHNlcmllcyBleHBhbnNpb24uCisgICAgICogCisgICAgICogICBUaGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIGZpcnN0IGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIEsoaykgPSBGKGssXHBpLzIpID0gXGludF8wXntccGkvMn1cZnJhY3tkXHRoZXRhfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xzcXJ0ezEgLSBrXjJzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgcm91dGluZSBpcyBub3QgYmFkIGFzIGxvbmcgYXMgfGt8IGlzIHNvbWV3aGF0IHNtYWxsZXIgdGhhbiAxCisgICAgICogICBidXQgaXMgbm90IGlzIGdvb2QgYXMgdGhlIENhcmxzb24gZWxsaXB0aWMgaW50ZWdyYWwgZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb21wX2VsbGludF8xX3Nlcmllcyhjb25zdCBfVHAgX19rKQorICAgIHsKKworICAgICAgY29uc3QgX1RwIF9fa2sgPSBfX2sgKiBfX2s7CisKKyAgICAgIF9UcCBfX3Rlcm0gPSBfX2trIC8gX1RwKDQpOworICAgICAgX1RwIF9fc3VtID0gX1RwKDEpICsgX190ZXJtOworCisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAyOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fdGVybSAqPSAoMiAqIF9faSAtIDEpICogX19rayAvICgyICogX19pKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waV8yKCkgKiBfX3N1bTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kCisgICAgICogICAgICAgICAgIEBmJCBLKGspIEBmJCB1c2luZyB0aGUgQ2FybHNvbiBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgZmlyc3Qga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgSyhrKSA9IEYoayxccGkvMikgPSBcaW50XzBee1xwaS8yfVxmcmFje2RcdGhldGF9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9fQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBAZiQgRihrLFxwaGkpIEBmJCBpcyB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUKKyAgICAgKiAgIGZpcnN0IGtpbmQuCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jb21wX2VsbGludF8xKGNvbnN0IF9UcCBfX2spCisgICAgeworCisgICAgICBpZiAoX19pc25hbihfX2spKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPj0gX1RwKDEpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fZWxsaW50X3JmKF9UcCgwKSwgX1RwKDEpIC0gX19rICogX19rLCBfVHAoMSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgZmlyc3Qga2luZAorICAgICAqICAgICAgICAgICBAZiQgRihrLFxwaGkpIEBmJCB1c2luZyB0aGUgQ2FybHNvbiBmb3JtdWxhdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBpbmNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBmaXJzdCBraW5kIGlzIGRlZmluZWQgYXMKKyAgICAgKiAgIEBmWworICAgICAqICAgICBGKGssXHBoaSkgPSBcaW50XzBee1xwaGl9XGZyYWN7ZFx0aGV0YX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9fQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19waGkgIFRoZSBpbnRlZ3JhbCBsaW1pdCBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50XzEoY29uc3QgX1RwIF9faywgY29uc3QgX1RwIF9fcGhpKQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSB8fCBfX2lzbmFuKF9fcGhpKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fZWxsaW50XzEuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZHVjZSBwaGkgdG8gLXBpLzIgPCBwaGkgPCArcGkvMi4KKyAgICAgICAgICBjb25zdCBpbnQgX19uID0gc3RkOjpmbG9vcihfX3BoaSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waGlfcmVkID0gX19waGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19uICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19waGlfcmVkKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jID0gc3RkOjpjb3MoX19waGlfcmVkKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX0YgPSBfX3MKKyAgICAgICAgICAgICAgICAgICAgICAgICogX19lbGxpbnRfcmYoX19jICogX19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoMSkgLSBfX2sgKiBfX2sgKiBfX3MgKiBfX3MsIF9UcCgxKSk7CisKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX19GOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfX0YgKyBfVHAoMikgKiBfX24gKiBfX2NvbXBfZWxsaW50XzEoX19rKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQKKyAgICAgKiAgICAgICAgICBAZiQgRShrKSBAZiQgYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIEUoayxccGkvMikgPSBcaW50XzBee1xwaS8yfVxzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgcm91dGluZSBpcyBub3QgYmFkIGFzIGxvbmcgYXMgfGt8IGlzIHNvbWV3aGF0IHNtYWxsZXIgdGhhbiAxCisgICAgICogICBidXQgaXMgbm90IGlzIGdvb2QgYXMgdGhlIENhcmxzb24gZWxsaXB0aWMgaW50ZWdyYWwgZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb21wbGV0ZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29tcF9lbGxpbnRfMl9zZXJpZXMoY29uc3QgX1RwIF9faykKKyAgICB7CisKKyAgICAgIGNvbnN0IF9UcCBfX2trID0gX19rICogX19rOworCisgICAgICBfVHAgX190ZXJtID0gX19razsKKyAgICAgIF9UcCBfX3N1bSA9IF9fdGVybTsKKworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMjsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19pMm0gPSAyICogX19pIC0gMTsKKyAgICAgICAgICBjb25zdCBfVHAgX19pMiA9IDIgKiBfX2k7CisgICAgICAgICAgX190ZXJtICo9IF9faTJtICogX19pMm0gKiBfX2trIC8gKF9faTIgKiBfX2kyKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm0gLyBfX2kybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIChfVHAoMSkgLSBfX3N1bSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBzZWNvbmQga2luZAorICAgICAqICAgICAgICAgICBAZiQgUl9EKHgseSx6KSA9IFJfSih4LHkseix6KSBAZiQgd2hlcmUKKyAgICAgKiAgICAgICAgICAgQGYkIFJfSih4LHkseixwKSBAZiQgaXMgdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICAgb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICogCisgICAgICogICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIFJfRCh4LHkseikgPSBcZnJhY3szfXsyfSBcaW50XzBeXGluZnR5CisgICAgICogICAgICAgICAgICAgICAgIFxmcmFje2R0fXsodCArIHgpXnsxLzJ9KHQgKyB5KV57MS8yfSh0ICsgeileezMvMn19CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQmFzZWQgb24gQ2FybHNvbidzIGFsZ29yaXRobXM6CisgICAgICogICAtICBCLiBDLiBDYXJsc29uIE51bWVyLiBNYXRoLiAzMywgMSAoMTk3OSkKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisgICAgICogICAtICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIHBwLiAyNjEtMjY5LAorICAgICAqICAgICAgYnkgUHJlc3MsIFRldWtvbHNreSwgVmV0dGVybGluZywgRmxhbm5lcnkgKDE5OTIpCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3Qgb2YgdHdvIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBvZiB0d28gc3ltbWV0cmljIGFyZ3VtZW50cy4KKyAgICAgKiAgIEBwYXJhbSAgX196ICBUaGUgdGhpcmQgYXJndW1lbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50X3JkKGNvbnN0IF9UcCBfX3gsIGNvbnN0IF9UcCBfX3ksIGNvbnN0IF9UcCBfX3opCisgICAgeworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBfVHAgX19lcnJ0b2wgPSBzdGQ6OnBvdyhfX2VwcyAvIF9UcCg4KSwgX1RwKDEpIC8gX1RwKDYpKTsKKyAgICAgIGNvbnN0IF9UcCBfX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCk7CisgICAgICBjb25zdCBfVHAgX19tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgY29uc3QgX1RwIF9fbG9saW0gPSBfVHAoMikgLyBzdGQ6OnBvdyhfX21heCwgX1RwKDIpIC8gX1RwKDMpKTsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gc3RkOjpwb3coX1RwKDAuMUwpICogX19lcnJ0b2wgLyBfX21pbiwgX1RwKDIpIC8gX1RwKDMpKTsKKworICAgICAgaWYgKF9feCA8IF9UcCgwKSB8fCBfX3kgPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yZC4iKSk7CisgICAgICBlbHNlIGlmIChfX3ggKyBfX3kgPCBfX2xvbGltIHx8IF9feiA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCB0b28gc21hbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19lbGxpbnRfcmQuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzAgPSBfVHAoMSkgLyBfVHAoNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzEgPSBfVHAoMykgLyBfVHAoMTQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MyID0gX1RwKDEpIC8gX1RwKDYpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MzID0gX1RwKDkpIC8gX1RwKDIyKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jNCA9IF9UcCgzKSAvIF9UcCgyNik7CisKKyAgICAgICAgICBfVHAgX194biA9IF9feDsKKyAgICAgICAgICBfVHAgX195biA9IF9feTsKKyAgICAgICAgICBfVHAgX196biA9IF9fejsKKyAgICAgICAgICBfVHAgX19zaWdtYSA9IF9UcCgwKTsKKyAgICAgICAgICBfVHAgX19wb3dlcjQgPSBfVHAoMSk7CisKKyAgICAgICAgICBfVHAgX19tdTsKKyAgICAgICAgICBfVHAgX194bmRldiwgX195bmRldiwgX196bmRldjsKKworICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faXRlciA9IDA7IF9faXRlciA8IF9fbWF4X2l0ZXI7ICsrX19pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX211ID0gKF9feG4gKyBfX3luICsgX1RwKDMpICogX196bikgLyBfVHAoNSk7CisgICAgICAgICAgICAgIF9feG5kZXYgPSAoX19tdSAtIF9feG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX195bmRldiA9IChfX211IC0gX195bikgLyBfX211OworICAgICAgICAgICAgICBfX3puZGV2ID0gKF9fbXUgLSBfX3puKSAvIF9fbXU7CisgICAgICAgICAgICAgIF9UcCBfX2Vwc2lsb24gPSBzdGQ6Om1heChzdGQ6OmFicyhfX3huZGV2KSwgc3RkOjphYnMoX195bmRldikpOworICAgICAgICAgICAgICBfX2Vwc2lsb24gPSBzdGQ6Om1heChfX2Vwc2lsb24sIHN0ZDo6YWJzKF9fem5kZXYpKTsKKyAgICAgICAgICAgICAgaWYgKF9fZXBzaWxvbiA8IF9fZXJydG9sKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBfVHAgX194bnJvb3QgPSBzdGQ6OnNxcnQoX194bik7CisgICAgICAgICAgICAgIF9UcCBfX3lucm9vdCA9IHN0ZDo6c3FydChfX3luKTsKKyAgICAgICAgICAgICAgX1RwIF9fem5yb290ID0gc3RkOjpzcXJ0KF9fem4pOworICAgICAgICAgICAgICBfVHAgX19sYW1iZGEgPSBfX3hucm9vdCAqIChfX3lucm9vdCArIF9fem5yb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX3lucm9vdCAqIF9fem5yb290OworICAgICAgICAgICAgICBfX3NpZ21hICs9IF9fcG93ZXI0IC8gKF9fem5yb290ICogKF9fem4gKyBfX2xhbWJkYSkpOworICAgICAgICAgICAgICBfX3Bvd2VyNCAqPSBfX2MwOworICAgICAgICAgICAgICBfX3huID0gX19jMCAqIChfX3huICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3luID0gX19jMCAqIChfX3luICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3puID0gX19jMCAqIChfX3puICsgX19sYW1iZGEpOworICAgICAgICAgICAgfQorCisJICAvLyBOb3RlOiBfX2VhIGlzIGFuIFNQVSBiYWRuYW1lLgorICAgICAgICAgIF9UcCBfX2VhYSA9IF9feG5kZXYgKiBfX3luZGV2OworICAgICAgICAgIF9UcCBfX2ViID0gX196bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgX1RwIF9fZWMgPSBfX2VhYSAtIF9fZWI7CisgICAgICAgICAgX1RwIF9fZWQgPSBfX2VhYSAtIF9UcCg2KSAqIF9fZWI7CisgICAgICAgICAgX1RwIF9fZWYgPSBfX2VkICsgX19lYyArIF9fZWM7CisgICAgICAgICAgX1RwIF9fczEgPSBfX2VkICogKC1fX2MxICsgX19jMyAqIF9fZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfVHAoMykgLSBfVHAoMykgKiBfX2M0ICogX196bmRldiAqIF9fZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfVHAoMikpOworICAgICAgICAgIF9UcCBfX3MyID0gX196bmRldgorICAgICAgICAgICAgICAgICAgICogKF9fYzIgKiBfX2VmCisgICAgICAgICAgICAgICAgICAgICsgX196bmRldiAqICgtX19jMyAqIF9fZWMgLSBfX3puZGV2ICogX19jNCAtIF9fZWFhKSk7CisKKyAgICAgICAgICByZXR1cm4gX1RwKDMpICogX19zaWdtYSArIF9fcG93ZXI0ICogKF9UcCgxKSArIF9fczEgKyBfX3MyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKF9fbXUgKiBzdGQ6OnNxcnQoX19tdSkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBjb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgc2Vjb25kIGtpbmQKKyAgICAgKiAgICAgICAgICAgQGYkIEUoaykgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGNvbXBsZXRlIGVsbGlwdGljIGludGVncmFsIG9mIHRoZSBzZWNvbmQga2luZCBpcyBkZWZpbmVkIGFzCisgICAgICogICBAZlsKKyAgICAgKiAgICAgRShrLFxwaS8yKSA9IFxpbnRfMF57XHBpLzJ9XHNxcnR7MSAtIGteMiBzaW5eMlx0aGV0YX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX2sgIFRoZSBhcmd1bWVudCBvZiB0aGUgY29tcGxldGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29tcGxldGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHNlY29uZCBraW5kLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2NvbXBfZWxsaW50XzIoY29uc3QgX1RwIF9faykKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19rKSA9PSAxKQorICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgZWxzZSBpZiAoc3RkOjphYnMoX19rKSA+IF9UcCgxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCBpbiBfX2NvbXBfZWxsaW50XzIuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fa2sgPSBfX2sgKiBfX2s7CisKKyAgICAgICAgICByZXR1cm4gX19lbGxpbnRfcmYoX1RwKDApLCBfVHAoMSkgLSBfX2trLCBfVHAoMSkpCisgICAgICAgICAgICAgICAtIF9fa2sgKiBfX2VsbGludF9yZChfVHAoMCksIF9UcCgxKSAtIF9fa2ssIF9UcCgxKSkgLyBfVHAoMyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHNlY29uZCBraW5kCisgICAgICogICAgICAgICAgIEBmJCBFKGssXHBoaSkgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHNlY29uZCBraW5kIGlzIGRlZmluZWQgYXMKKyAgICAgKiAgIEBmWworICAgICAqICAgICBFKGssXHBoaSkgPSBcaW50XzBee1xwaGl9IFxzcXJ0ezEgLSBrXjIgc2luXjJcdGhldGF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3BoaSAgVGhlIGludGVncmFsIGxpbWl0IGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgc2Vjb25kIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50XzIoY29uc3QgX1RwIF9faywgY29uc3QgX1RwIF9fcGhpKQorICAgIHsKKworICAgICAgaWYgKF9faXNuYW4oX19rKSB8fCBfX2lzbmFuKF9fcGhpKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fZWxsaW50XzIuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZHVjZSBwaGkgdG8gLXBpLzIgPCBwaGkgPCArcGkvMi4KKyAgICAgICAgICBjb25zdCBpbnQgX19uID0gc3RkOjpmbG9vcihfX3BoaSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waGlfcmVkID0gX19waGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19uICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19rayA9IF9fayAqIF9fazsKKyAgICAgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19waGlfcmVkKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19zcyA9IF9fcyAqIF9fczsKKyAgICAgICAgICBjb25zdCBfVHAgX19zc3MgPSBfX3NzICogX19zOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MgPSBzdGQ6OmNvcyhfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2NjID0gX19jICogX19jOworCisgICAgICAgICAgY29uc3QgX1RwIF9fRSA9IF9fcworICAgICAgICAgICAgICAgICAgICAgICAgKiBfX2VsbGludF9yZihfX2NjLCBfVHAoMSkgLSBfX2trICogX19zcywgX1RwKDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2trICogX19zc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICogX19lbGxpbnRfcmQoX19jYywgX1RwKDEpIC0gX19rayAqIF9fc3MsIF9UcCgxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gX1RwKDMpOworCisgICAgICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIF9fRTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gX19FICsgX1RwKDIpICogX19uICogX19jb21wX2VsbGludF8yKF9fayk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICAgQGYkIFJfQyh4LHkpID0gUl9GKHgseSx5KSBAZiQgd2hlcmUgQGYkIFJfRih4LHkseikgQGYkCisgICAgICogICAgICAgICAgIGlzIHRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgorICAgICAqIAorICAgICAqICAgVGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIFJfQyh4LHkpID0gXGZyYWN7MX17Mn0gXGludF8wXlxpbmZ0eQorICAgICAqICAgICAgICAgICAgICAgICBcZnJhY3tkdH17KHQgKyB4KV57MS8yfSh0ICsgeSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQmFzZWQgb24gQ2FybHNvbidzIGFsZ29yaXRobXM6CisgICAgICogICAtICBCLiBDLiBDYXJsc29uIE51bWVyLiBNYXRoLiAzMywgMSAoMTk3OSkKKyAgICAgKiAgIC0gIEIuIEMuIENhcmxzb24sIFNwZWNpYWwgRnVuY3Rpb25zIG9mIEFwcGxpZWQgTWF0aGVtYXRpY3MgKDE5NzcpCisgICAgICogICAtICBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCAybmQgZWQsIHBwLiAyNjEtMjY5LAorICAgICAqICAgICAgYnkgUHJlc3MsIFRldWtvbHNreSwgVmV0dGVybGluZywgRmxhbm5lcnkgKDE5OTIpCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgZmlyc3QgYXJndW1lbnQuCisgICAgICogICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBhcmd1bWVudC4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBDYXJsc29uIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2VsbGludF9yYyhjb25zdCBfVHAgX194LCBjb25zdCBfVHAgX195KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCk7CisgICAgICBjb25zdCBfVHAgX19tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heCgpOworICAgICAgY29uc3QgX1RwIF9fbG9saW0gPSBfVHAoNSkgKiBfX21pbjsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gX19tYXggLyBfVHAoNSk7CisKKyAgICAgIGlmIChfX3ggPCBfVHAoMCkgfHwgX195IDwgX1RwKDApIHx8IF9feCArIF9feSA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBsZXNzIHRoYW4gemVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2VsbGludF9yYy4iKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgxKSAvIF9UcCg3KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMiA9IF9UcCg5KSAvIF9UcCgyMik7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzMgPSBfVHAoMykgLyBfVHAoMTApOworICAgICAgICAgIGNvbnN0IF9UcCBfX2M0ID0gX1RwKDMpIC8gX1RwKDgpOworCisgICAgICAgICAgX1RwIF9feG4gPSBfX3g7CisgICAgICAgICAgX1RwIF9feW4gPSBfX3k7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19lcnJ0b2wgPSBzdGQ6OnBvdyhfX2VwcyAvIF9UcCgzMCksIF9UcCgxKSAvIF9UcCg2KSk7CisgICAgICAgICAgX1RwIF9fbXU7CisgICAgICAgICAgX1RwIF9fc247CisKKyAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2l0ZXIgPSAwOyBfX2l0ZXIgPCBfX21heF9pdGVyOyArK19faXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19tdSA9IChfX3huICsgX1RwKDIpICogX195bikgLyBfVHAoMyk7CisgICAgICAgICAgICAgIF9fc24gPSAoX195biArIF9fbXUpIC8gX19tdSAtIF9UcCgyKTsKKyAgICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fc24pIDwgX19lcnJ0b2wpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2xhbWJkYSA9IF9UcCgyKSAqIHN0ZDo6c3FydChfX3huKSAqIHN0ZDo6c3FydChfX3luKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9feW47CisgICAgICAgICAgICAgIF9feG4gPSBfX2MwICogKF9feG4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICAgIF9feW4gPSBfX2MwICogKF9feW4gKyBfX2xhbWJkYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBfVHAgX19zID0gX19zbiAqIF9fc24KKyAgICAgICAgICAgICAgICAgICogKF9fYzMgKyBfX3NuKihfX2MxICsgX19zbiAqIChfX2M0ICsgX19zbiAqIF9fYzIpKSk7CisKKyAgICAgICAgICByZXR1cm4gKF9UcCgxKSArIF9fcykgLyBzdGQ6OnNxcnQoX19tdSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIENhcmxzb24gZWxsaXB0aWMgZnVuY3Rpb24gQGYkIFJfSih4LHkseixwKSBAZiQKKyAgICAgKiAgICAgICAgICAgb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICogCisgICAgICogICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgdGhpcmQga2luZCBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgUl9KKHgseSx6LHApID0gXGZyYWN7M317Mn0gXGludF8wXlxpbmZ0eQorICAgICAqICAgICAgIFxmcmFje2R0fXsodCArIHgpXnsxLzJ9KHQgKyB5KV57MS8yfSh0ICsgeileezEvMn0odCArIHApfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEJhc2VkIG9uIENhcmxzb24ncyBhbGdvcml0aG1zOgorICAgICAqICAgLSAgQi4gQy4gQ2FybHNvbiBOdW1lci4gTWF0aC4gMzMsIDEgKDE5NzkpCisgICAgICogICAtICBCLiBDLiBDYXJsc29uLCBTcGVjaWFsIEZ1bmN0aW9ucyBvZiBBcHBsaWVkIE1hdGhlbWF0aWNzICgxOTc3KQorICAgICAqICAgLSAgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQywgMm5kIGVkLCBwcC4gMjYxLTI2OSwKKyAgICAgKiAgICAgIGJ5IFByZXNzLCBUZXVrb2xza3ksIFZldHRlcmxpbmcsIEZsYW5uZXJ5ICgxOTkyKQorICAgICAqCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGZpcnN0IG9mIHRocmVlIHN5bW1ldHJpYyBhcmd1bWVudHMuCisgICAgICogICBAcGFyYW0gIF9feSAgVGhlIHNlY29uZCBvZiB0aHJlZSBzeW1tZXRyaWMgYXJndW1lbnRzLgorICAgICAqICAgQHBhcmFtICBfX3ogIFRoZSB0aGlyZCBvZiB0aHJlZSBzeW1tZXRyaWMgYXJndW1lbnRzLgorICAgICAqICAgQHBhcmFtICBfX3AgIFRoZSBmb3VydGggYXJndW1lbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgQ2FybHNvbiBlbGxpcHRpYyBmdW5jdGlvbiBvZiB0aGUgZm91cnRoIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50X3JqKGNvbnN0IF9UcCBfX3gsIGNvbnN0IF9UcCBfX3ksIGNvbnN0IF9UcCBfX3osIGNvbnN0IF9UcCBfX3ApCisgICAgeworICAgICAgY29uc3QgX1RwIF9fbWluID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptaW4oKTsKKyAgICAgIGNvbnN0IF9UcCBfX21heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCk7CisgICAgICBjb25zdCBfVHAgX19sb2xpbSA9IHN0ZDo6cG93KF9UcCg1KSAqIF9fbWluLCBfVHAoMSkvX1RwKDMpKTsKKyAgICAgIGNvbnN0IF9UcCBfX3VwbGltID0gX1RwKDAuM0wpCisgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6cG93KF9UcCgwLjJMKSAqIF9fbWF4LCBfVHAoMSkvX1RwKDMpKTsKKworICAgICAgaWYgKF9feCA8IF9UcCgwKSB8fCBfX3kgPCBfVHAoMCkgfHwgX196IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgbGVzcyB0aGFuIHplcm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19lbGxpbnRfcmouIikpOworICAgICAgZWxzZSBpZiAoX194ICsgX195IDwgX19sb2xpbSB8fCBfX3ggKyBfX3ogPCBfX2xvbGltCisgICAgICAgICAgICB8fCBfX3kgKyBfX3ogPCBfX2xvbGltIHx8IF9fcCA8IF9fbG9saW0pCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCB0b28gc21hbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19lbGxpbnRfcmoiKSk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMCA9IF9UcCgxKSAvIF9UcCg0KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19jMSA9IF9UcCgzKSAvIF9UcCgxNCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzIgPSBfVHAoMSkgLyBfVHAoMyk7CisgICAgICAgICAgY29uc3QgX1RwIF9fYzMgPSBfVHAoMykgLyBfVHAoMjIpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2M0ID0gX1RwKDMpIC8gX1RwKDI2KTsKKworICAgICAgICAgIF9UcCBfX3huID0gX194OworICAgICAgICAgIF9UcCBfX3luID0gX195OworICAgICAgICAgIF9UcCBfX3puID0gX196OworICAgICAgICAgIF9UcCBfX3BuID0gX19wOworICAgICAgICAgIF9UcCBfX3NpZ21hID0gX1RwKDApOworICAgICAgICAgIF9UcCBfX3Bvd2VyNCA9IF9UcCgxKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2VycnRvbCA9IHN0ZDo6cG93KF9fZXBzIC8gX1RwKDgpLCBfVHAoMSkgLyBfVHAoNikpOworCisgICAgICAgICAgX1RwIF9fbGFtYmRhLCBfX211OworICAgICAgICAgIF9UcCBfX3huZGV2LCBfX3luZGV2LCBfX3puZGV2LCBfX3BuZGV2OworCisgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pdGVyID0gMDsgX19pdGVyIDwgX19tYXhfaXRlcjsgKytfX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fbXUgPSAoX194biArIF9feW4gKyBfX3puICsgX1RwKDIpICogX19wbikgLyBfVHAoNSk7CisgICAgICAgICAgICAgIF9feG5kZXYgPSAoX19tdSAtIF9feG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX195bmRldiA9IChfX211IC0gX195bikgLyBfX211OworICAgICAgICAgICAgICBfX3puZGV2ID0gKF9fbXUgLSBfX3puKSAvIF9fbXU7CisgICAgICAgICAgICAgIF9fcG5kZXYgPSAoX19tdSAtIF9fcG4pIC8gX19tdTsKKyAgICAgICAgICAgICAgX1RwIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KHN0ZDo6YWJzKF9feG5kZXYpLCBzdGQ6OmFicyhfX3luZGV2KSk7CisgICAgICAgICAgICAgIF9fZXBzaWxvbiA9IHN0ZDo6bWF4KF9fZXBzaWxvbiwgc3RkOjphYnMoX196bmRldikpOworICAgICAgICAgICAgICBfX2Vwc2lsb24gPSBzdGQ6Om1heChfX2Vwc2lsb24sIHN0ZDo6YWJzKF9fcG5kZXYpKTsKKyAgICAgICAgICAgICAgaWYgKF9fZXBzaWxvbiA8IF9fZXJydG9sKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjb25zdCBfVHAgX194bnJvb3QgPSBzdGQ6OnNxcnQoX194bik7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3lucm9vdCA9IHN0ZDo6c3FydChfX3luKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fem5yb290ID0gc3RkOjpzcXJ0KF9fem4pOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19sYW1iZGEgPSBfX3hucm9vdCAqIChfX3lucm9vdCArIF9fem5yb290KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX3lucm9vdCAqIF9fem5yb290OworICAgICAgICAgICAgICBjb25zdCBfVHAgX19hbHBoYTEgPSBfX3BuICogKF9feG5yb290ICsgX195bnJvb3QgKyBfX3pucm9vdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX3hucm9vdCAqIF9feW5yb290ICogX196bnJvb3Q7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2FscGhhMiA9IF9fYWxwaGExICogX19hbHBoYTE7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2JldGEgPSBfX3BuICogKF9fcG4gKyBfX2xhbWJkYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoX19wbiArIF9fbGFtYmRhKTsKKyAgICAgICAgICAgICAgX19zaWdtYSArPSBfX3Bvd2VyNCAqIF9fZWxsaW50X3JjKF9fYWxwaGEyLCBfX2JldGEpOworICAgICAgICAgICAgICBfX3Bvd2VyNCAqPSBfX2MwOworICAgICAgICAgICAgICBfX3huID0gX19jMCAqIChfX3huICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3luID0gX19jMCAqIChfX3luICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3puID0gX19jMCAqIChfX3puICsgX19sYW1iZGEpOworICAgICAgICAgICAgICBfX3BuID0gX19jMCAqIChfX3BuICsgX19sYW1iZGEpOworICAgICAgICAgICAgfQorCisJICAvLyBOb3RlOiBfX2VhIGlzIGFuIFNQVSBiYWRuYW1lLgorICAgICAgICAgIF9UcCBfX2VhYSA9IF9feG5kZXYgKiAoX195bmRldiArIF9fem5kZXYpICsgX195bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgX1RwIF9fZWIgPSBfX3huZGV2ICogX195bmRldiAqIF9fem5kZXY7CisgICAgICAgICAgX1RwIF9fZWMgPSBfX3BuZGV2ICogX19wbmRldjsKKyAgICAgICAgICBfVHAgX19lMiA9IF9fZWFhIC0gX1RwKDMpICogX19lYzsKKyAgICAgICAgICBfVHAgX19lMyA9IF9fZWIgKyBfVHAoMikgKiBfX3BuZGV2ICogKF9fZWFhIC0gX19lYyk7CisgICAgICAgICAgX1RwIF9fczEgPSBfVHAoMSkgKyBfX2UyICogKC1fX2MxICsgX1RwKDMpICogX19jMyAqIF9fZTIgLyBfVHAoNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9UcCgzKSAqIF9fYzQgKiBfX2UzIC8gX1RwKDIpKTsKKyAgICAgICAgICBfVHAgX19zMiA9IF9fZWIgKiAoX19jMiAvIF9UcCgyKQorICAgICAgICAgICAgICAgICAgICsgX19wbmRldiAqICgtX19jMyAtIF9fYzMgKyBfX3BuZGV2ICogX19jNCkpOworICAgICAgICAgIF9UcCBfX3MzID0gX19wbmRldiAqIF9fZWFhICogKF9fYzIgLSBfX3BuZGV2ICogX19jMykKKyAgICAgICAgICAgICAgICAgICAtIF9fYzIgKiBfX3BuZGV2ICogX19lYzsKKworICAgICAgICAgIHJldHVybiBfVHAoMykgKiBfX3NpZ21hICsgX19wb3dlcjQgKiAoX19zMSArIF9fczIgKyBfX3MzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX19tdSAqIHN0ZDo6c3FydChfX211KSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHRoaXJkIGtpbmQKKyAgICAgKiAgICAgICAgICBAZiQgXFBpKGssXG51KSA9IFxQaShrLFxudSxccGkvMikgQGYkIHVzaW5nIHRoZQorICAgICAqICAgICAgICAgIENhcmxzb24gZm9ybXVsYXRpb24uCisgICAgICogCisgICAgICogICBUaGUgY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHRoaXJkIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIFxQaShrLFxudSkgPSBcaW50XzBee1xwaS8yfQorICAgICAqICAgICAgICAgICAgICAgICAgIFxmcmFje2RcdGhldGF9CisgICAgICogICAgICAgICAgICAgICAgIHsoMSAtIFxudSBcc2luXjJcdGhldGEpXHNxcnR7MSAtIGteMiBcc2luXjJcdGhldGF9fQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fayAgVGhlIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19udSAgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29tcGxldGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fY29tcF9lbGxpbnRfMyhjb25zdCBfVHAgX19rLCBjb25zdCBfVHAgX19udSkKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykgfHwgX19pc25hbihfX251KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX251ID09IF9UcCgxKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9faykgPiBfVHAoMSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJCYWQgYXJndW1lbnQgaW4gX19jb21wX2VsbGludF8zLiIpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2trID0gX19rICogX19rOworCisgICAgICAgICAgcmV0dXJuIF9fZWxsaW50X3JmKF9UcCgwKSwgX1RwKDEpIC0gX19raywgX1RwKDEpKQorICAgICAgICAgICAgICAgLSBfX251CisgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JqKF9UcCgwKSwgX1RwKDEpIC0gX19raywgX1RwKDEpLCBfVHAoMSkgKyBfX251KQorICAgICAgICAgICAgICAgLyBfVHAoMyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgaW5jb21wbGV0ZSBlbGxpcHRpYyBpbnRlZ3JhbCBvZiB0aGUgdGhpcmQga2luZAorICAgICAqICAgICAgICAgIEBmJCBcUGkoayxcbnUsXHBoaSkgQGYkIHVzaW5nIHRoZSBDYXJsc29uIGZvcm11bGF0aW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGluY29tcGxldGUgZWxsaXB0aWMgaW50ZWdyYWwgb2YgdGhlIHRoaXJkIGtpbmQgaXMgZGVmaW5lZCBhcworICAgICAqICAgQGZbCisgICAgICogICAgIFxQaShrLFxudSxccGhpKSA9IFxpbnRfMF57XHBoaX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXGZyYWN7ZFx0aGV0YX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KDEgLSBcbnUgXHNpbl4yXHRoZXRhKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcc3FydHsxIC0ga14yIFxzaW5eMlx0aGV0YX19CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19rICBUaGUgYXJndW1lbnQgb2YgdGhlIGVsbGlwdGljIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBlbGxpcHRpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19waGkgIFRoZSBpbnRlZ3JhbCBsaW1pdCBhcmd1bWVudCBvZiB0aGUgZWxsaXB0aWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZWxsaXB0aWMgZnVuY3Rpb24gb2YgdGhlIHRoaXJkIGtpbmQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZWxsaW50XzMoY29uc3QgX1RwIF9faywgY29uc3QgX1RwIF9fbnUsIGNvbnN0IF9UcCBfX3BoaSkKKyAgICB7CisKKyAgICAgIGlmIChfX2lzbmFuKF9faykgfHwgX19pc25hbihfX251KSB8fCBfX2lzbmFuKF9fcGhpKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2spID4gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50IGluIF9fZWxsaW50XzMuIikpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIFJlZHVjZSBwaGkgdG8gLXBpLzIgPCBwaGkgPCArcGkvMi4KKyAgICAgICAgICBjb25zdCBpbnQgX19uID0gc3RkOjpmbG9vcihfX3BoaSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDAuNUwpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19waGlfcmVkID0gX19waGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19uICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisKKyAgICAgICAgICBjb25zdCBfVHAgX19rayA9IF9fayAqIF9fazsKKyAgICAgICAgICBjb25zdCBfVHAgX19zID0gc3RkOjpzaW4oX19waGlfcmVkKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19zcyA9IF9fcyAqIF9fczsKKyAgICAgICAgICBjb25zdCBfVHAgX19zc3MgPSBfX3NzICogX19zOworICAgICAgICAgIGNvbnN0IF9UcCBfX2MgPSBzdGQ6OmNvcyhfX3BoaV9yZWQpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2NjID0gX19jICogX19jOworCisgICAgICAgICAgY29uc3QgX1RwIF9fUGkgPSBfX3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JmKF9fY2MsIF9UcCgxKSAtIF9fa2sgKiBfX3NzLCBfVHAoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX251ICogX19zc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIF9fZWxsaW50X3JqKF9fY2MsIF9UcCgxKSAtIF9fa2sgKiBfX3NzLCBfVHAoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoMSkgKyBfX251ICogX19zcykgLyBfVHAoMyk7CisKKyAgICAgICAgICBpZiAoX19uID09IDApCisgICAgICAgICAgICByZXR1cm4gX19QaTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gX19QaSArIF9UcCgyKSAqIF9fbiAqIF9fY29tcF9lbGxpbnRfMyhfX2ssIF9fbnUpOworICAgICAgICB9CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9FTExfSU5URUdSQUxfVENDCisKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2V4cF9pbnRlZ3JhbC50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9leHBfaW50ZWdyYWwudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmM2JkNjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9leHBfaW50ZWdyYWwudGNjCkBAIC0wLDAgKzEsNTI1IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2V4cF9pbnRlZ3JhbC50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyAgV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vCisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgRWQuIGJ5IE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsIE5ldy1Zb3JrLCBTZWN0aW9uIDUsIHBwLiAyMjgtMjUxLgorLy8gICAoMikgVGhlIEdudSBTY2llbnRpZmljIExpYnJhcnksIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nc2wKKy8vICAgKDMpIE51bWVyaWNhbCBSZWNpcGVzIGluIEMsIGJ5IFcuIEguIFByZXNzLCBTLiBBLiBUZXVrb2xza3ksCisvLyAgICAgICBXLiBULiBWZXR0ZXJsaW5nLCBCLiBQLiBGbGFubmVyeSwgQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MgKDE5OTIpLAorLy8gICAgICAgMm5kIGVkLCBwcC4gMjIyLTIyNS4KKy8vCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0VYUF9JTlRFR1JBTF9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0VYUF9JTlRFR1JBTF9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFXzEoeCkgQGYkCisgICAgICogICAgICAgICAgYnkgc2VyaWVzIHN1bW1hdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGdvb2QKKyAgICAgKiAgICAgICAgICBmb3IgQGYkIHggPCAxIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV8xKHgpID0gXGludF97MX1ee1xpbmZ0eX0gXGZyYWN7ZV57LXh0fX17dH0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9FMV9zZXJpZXMoY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19lc3VtID0gX1RwKDApOworICAgICAgX1RwIF9fb3N1bSA9IF9UcCgwKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX3Rlcm0gKj0gLSBfX3ggLyBfX2k7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSkgPCBfX2VwcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChfX3Rlcm0gPj0gX1RwKDApKQorICAgICAgICAgICAgX19lc3VtICs9IF9fdGVybSAvIF9faTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBfX29zdW0gKz0gX190ZXJtIC8gX19pOworICAgICAgICB9CisKKyAgICAgIHJldHVybiAtIF9fZXN1bSAtIF9fb3N1bQorICAgICAgICAgICAgIC0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2dhbW1hX2UoKSAtIHN0ZDo6bG9nKF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFXzEoeCkgQGYkCisgICAgICogICAgICAgICAgYnkgYXN5bXB0b3RpYyBleHBhbnNpb24uCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfMSh4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0fSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0UxX2FzeW1wKGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX2VzdW0gPSBfVHAoMSk7CisgICAgICBfVHAgX19vc3VtID0gX1RwKDApOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wcmV2ID0gX190ZXJtOworICAgICAgICAgIF9fdGVybSAqPSAtIF9faSAvIF9feDsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA+IHN0ZDo6YWJzKF9fcHJldikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoX190ZXJtID49IF9UcCgwKSkKKyAgICAgICAgICAgIF9fZXN1bSArPSBfX3Rlcm07CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgX19vc3VtICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gc3RkOjpleHAoLSBfX3gpICogKF9fZXN1bSArIF9fb3N1bSkgLyBfX3g7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFX24oeCkgQGYkCisgICAgICogICAgICAgICAgYnkgc2VyaWVzIHN1bW1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV9uKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3Rebn0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50X0VuX3Nlcmllcyhjb25zdCB1bnNpZ25lZCBpbnQgX19uLCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwOworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBpbnQgX19ubTEgPSBfX24gLSAxOworICAgICAgX1RwIF9fYW5zID0gKF9fbm0xICE9IDAKKyAgICAgICAgICAgICAgICA/IF9UcCgxKSAvIF9fbm0xIDogLXN0ZDo6bG9nKF9feCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpKTsKKyAgICAgIF9UcCBfX2ZhY3QgPSBfVHAoMSk7CisgICAgICBmb3IgKGludCBfX2kgPSAxOyBfX2kgPD0gX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX2ZhY3QgKj0gLV9feCAvIF9UcChfX2kpOworICAgICAgICAgIF9UcCBfX2RlbDsKKyAgICAgICAgICBpZiAoIF9faSAhPSBfX25tMSApCisgICAgICAgICAgICBfX2RlbCA9IC1fX2ZhY3QgLyBfVHAoX19pIC0gX19ubTEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX1RwIF9fcHNpID0gLV9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6Z2FtbWFfZSgpOworICAgICAgICAgICAgICBmb3IgKGludCBfX2lpID0gMTsgX19paSA8PSBfX25tMTsgKytfX2lpKQorICAgICAgICAgICAgICAgIF9fcHNpICs9IF9UcCgxKSAvIF9UcChfX2lpKTsKKyAgICAgICAgICAgICAgX19kZWwgPSBfX2ZhY3QgKiAoX19wc2kgLSBzdGQ6OmxvZyhfX3gpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgX19hbnMgKz0gX19kZWw7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZGVsKSA8IF9fZXBzICogc3RkOjphYnMoX19hbnMpKQorICAgICAgICAgICAgcmV0dXJuIF9fYW5zOworICAgICAgICB9CisgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIlNlcmllcyBzdW1tYXRpb24gZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19leHBpbnRfRW5fc2VyaWVzLiIpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICBieSBjb250aW51ZWQgZnJhY3Rpb25zLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFX24oeCkgPSBcaW50X3sxfV5caW5mdHkgXGZyYWN7ZV57LXh0fX17dF5ufSBkdAorICAgICAqICAgICAgICAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX24gIFRoZSBvcmRlciBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRW5fY29udF9mcmFjKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX2ZwX21pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWluKCk7CisgICAgICBjb25zdCBpbnQgX19ubTEgPSBfX24gLSAxOworICAgICAgX1RwIF9fYiA9IF9feCArIF9UcChfX24pOworICAgICAgX1RwIF9fYyA9IF9UcCgxKSAvIF9fZnBfbWluOworICAgICAgX1RwIF9fZCA9IF9UcCgxKSAvIF9fYjsKKyAgICAgIF9UcCBfX2ggPSBfX2Q7CisgICAgICBmb3IgKCB1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pICkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX2EgPSAtX1RwKF9faSAqIChfX25tMSArIF9faSkpOworICAgICAgICAgIF9fYiArPSBfVHAoMik7CisgICAgICAgICAgX19kID0gX1RwKDEpIC8gKF9fYSAqIF9fZCArIF9fYik7CisgICAgICAgICAgX19jID0gX19iICsgX19hIC8gX19jOworICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbCA9IF9fYyAqIF9fZDsKKyAgICAgICAgICBfX2ggKj0gX19kZWw7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZGVsIC0gX1RwKDEpKSA8IF9fZXBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBfVHAgX19hbnMgPSBfX2ggKiBzdGQ6OmV4cCgtX194KTsKKyAgICAgICAgICAgICAgcmV0dXJuIF9fYW5zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIkNvbnRpbnVlZCBmcmFjdGlvbiBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2V4cGludF9Fbl9jb250X2ZyYWMuIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV9uKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IHJlY3Vyc2lvbi4gIFVzZSB1cHdhcmQgcmVjdXJzaW9uIGZvciBAZiQgeCA8IG4gQGYkCisgICAgICogICAgICAgICAgYW5kIGRvd253YXJkIHJlY3Vyc2lvbiAoTWlsbGVyJ3MgYWxnb3JpdGhtKSBvdGhlcndpc2UuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfbih4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0Xm59IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9Fbl9yZWN1cnNpb24oY29uc3QgdW5zaWduZWQgaW50IF9fbiwgY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX19FbjsKKyAgICAgIF9UcCBfX0UxID0gX19leHBpbnRfRTEoX194KTsKKyAgICAgIGlmIChfX3ggPCBfVHAoX19uKSkKKyAgICAgICAgeworICAgICAgICAgIC8vICBGb3J3YXJkIHJlY3Vyc2lvbiBpcyBzdGFibGUgb25seSBmb3IgbiA8IHguCisgICAgICAgICAgX19FbiA9IF9fRTE7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19qID0gMjsgX19qIDwgX19uOyArK19faikKKyAgICAgICAgICAgIF9fRW4gPSAoc3RkOjpleHAoLV9feCkgLSBfX3ggKiBfX0VuKSAvIF9UcChfX2ogLSAxKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIEJhY2t3YXJkIHJlY3Vyc2lvbiBpcyBzdGFibGUgb25seSBmb3IgbiA+PSB4LgorICAgICAgICAgIF9fRW4gPSBfVHAoMSk7CisgICAgICAgICAgY29uc3QgaW50IF9fTiA9IF9fbiArIDIwOyAgLy8gIFRPRE86IENoZWNrIHRoaXMgc3RhcnRpbmcgbnVtYmVyLgorICAgICAgICAgIF9UcCBfX3NhdmUgPSBfVHAoMCk7CisgICAgICAgICAgZm9yIChpbnQgX19qID0gX19OOyBfX2ogPiAwOyAtLV9faikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19FbiA9IChzdGQ6OmV4cCgtX194KSAtIF9faiAqIF9fRW4pIC8gX194OworICAgICAgICAgICAgICBpZiAoX19qID09IF9fbikKKyAgICAgICAgICAgICAgICBfX3NhdmUgPSBfX0VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX1RwIF9fbm9ybSA9IF9fRW4gLyBfX0UxOworICAgICAgICAgICAgX19FbiAvPSBfX25vcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fRW47CisgICAgfQorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRWkoeCkgQGYkCisgICAgICogICAgICAgICAgYnkgc2VyaWVzIHN1bW1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRWkoeCkgPSAtXGludF97LXh9XlxpbmZ0eSBcZnJhY3tlXnR9e3R9IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRWlfc2VyaWVzKGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX3N1bSA9IF9UcCgwKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9IF9feCAvIF9faTsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm0gLyBfX2k7CisgICAgICAgICAgaWYgKF9fdGVybSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpICogX19zdW0pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2dhbW1hX2UoKSArIF9fc3VtICsgc3RkOjpsb2coX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVpKHgpIEBmJAorICAgICAqICAgICAgICAgIGJ5IGFzeW1wdG90aWMgZXhwYW5zaW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFaSh4KSA9IC1caW50X3steH1eXGluZnR5IFxmcmFje2VedH17dH0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9FaV9hc3ltcChjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19zdW0gPSBfVHAoMSk7CisgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgX19tYXhfaXRlciA9IDEwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3ByZXYgPSBfX3Rlcm07CisgICAgICAgICAgX190ZXJtICo9IF9faSAvIF9feDsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoX190ZXJtID49IF9fcHJldikKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gc3RkOjpleHAoX194KSAqIF9fc3VtIC8gX194OworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRWkoeCkgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsIGlzIGdpdmVuIGJ5CisgICAgICogICAgICAgICAgXGZbCisgICAgICogICAgICAgICAgICBFaSh4KSA9IC1caW50X3steH1eXGluZnR5IFxmcmFje2VedH17dH0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9FaShjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHJldHVybiAtX19leHBpbnRfRTEoLV9feCk7CisgICAgICBlbHNlIGlmIChfX3ggPCAtc3RkOjpsb2coc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpKQorICAgICAgICByZXR1cm4gX19leHBpbnRfRWlfc2VyaWVzKF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2V4cGludF9FaV9hc3ltcChfX3gpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV8xKHgpIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV8xKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3R9IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19leHBpbnRfRTEoY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDwgX1RwKDApKQorICAgICAgICByZXR1cm4gLV9fZXhwaW50X0VpKC1fX3gpOworICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDEpKQorICAgICAgICByZXR1cm4gX19leHBpbnRfRTFfc2VyaWVzKF9feCk7CisgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMTAwKSkgIC8vICBUT0RPOiBGaW5kIGEgZ29vZCBhc3ltcHRvdGljIHN3aXRjaCBwb2ludC4KKyAgICAgICAgcmV0dXJuIF9fZXhwaW50X0VuX2NvbnRfZnJhYygxLCBfX3gpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19leHBpbnRfRTFfYXN5bXAoX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgQGYkIEVfbih4KSBAZiQKKyAgICAgKiAgICAgICAgICBmb3IgbGFyZ2UgYXJndW1lbnQuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgICAgICAgICBcZlsKKyAgICAgKiAgICAgICAgICAgIEVfbih4KSA9IFxpbnRfezF9XlxpbmZ0eSBcZnJhY3tlXnsteHR9fXt0Xm59IGR0CisgICAgICogICAgICAgICAgXGZdCisgICAgICogCisgICAgICogICBUaGlzIGlzIHNvbWV0aGluZyBvZiBhbiBleHRlbnNpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9hc3ltcChjb25zdCB1bnNpZ25lZCBpbnQgX19uLCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMSk7CisgICAgICBfVHAgX19zdW0gPSBfVHAoMSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPD0gX19uOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3ByZXYgPSBfX3Rlcm07CisgICAgICAgICAgX190ZXJtICo9IC0oX19uIC0gX19pICsgMSkgLyBfX3g7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSkgPiBzdGQ6OmFicyhfX3ByZXYpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX19zdW0gKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBzdGQ6OmV4cCgtX194KSAqIF9fc3VtIC8gX194OworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV9uKHgpIEBmJAorICAgICAqICAgICAgICAgIGZvciBsYXJnZSBvcmRlci4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV9uKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3Rebn0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAgICAgICAgCisgICAgICogICBUaGlzIGlzIHNvbWV0aGluZyBvZiBhbiBleHRlbnNpb24uCisgICAgICogCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGV4cG9uZW50aWFsIGludGVncmFsLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2V4cGludF9sYXJnZV9uKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9feHBuID0gX194ICsgX19uOworICAgICAgY29uc3QgX1RwIF9feHBuMiA9IF9feHBuICogX194cG47CisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fc3VtID0gX1RwKDEpOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDw9IF9fbjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wcmV2ID0gX190ZXJtOworICAgICAgICAgIF9fdGVybSAqPSAoX19uIC0gMiAqIChfX2kgLSAxKSAqIF9feCkgLyBfX3hwbjI7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gc3RkOjpleHAoLV9feCkgKiBfX3N1bSAvIF9feHBuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBAZiQgRV9uKHgpIEBmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyBnaXZlbiBieQorICAgICAqICAgICAgICAgIFxmWworICAgICAqICAgICAgICAgICAgRV9uKHgpID0gXGludF97MX1eXGluZnR5IFxmcmFje2Veey14dH19e3Rebn0gZHQKKyAgICAgKiAgICAgICAgICBcZl0KKyAgICAgKiAgIFRoaXMgaXMgc29tZXRoaW5nIG9mIGFuIGV4dGVuc2lvbi4KKyAgICAgKiAKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIGV4cG9uZW50aWFsIGludGVncmFsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fZXhwaW50KGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgLy8gIFJldHVybiBOYU4gb24gTmFOIGlucHV0LgorICAgICAgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX24gPD0gMSAmJiBfX3ggPT0gX1RwKDApKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjppbmZpbml0eSgpOworICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fRTAgPSBzdGQ6OmV4cChfX3gpIC8gX194OworICAgICAgICAgIGlmIChfX24gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfX0UwOworCisgICAgICAgICAgX1RwIF9fRTEgPSBfX2V4cGludF9FMShfX3gpOworICAgICAgICAgIGlmIChfX24gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBfX0UxOworCisgICAgICAgICAgaWYgKF9feCA9PSBfVHAoMCkpCisgICAgICAgICAgICByZXR1cm4gX1RwKDEpIC8gc3RhdGljX2Nhc3Q8X1RwPihfX24gLSAxKTsKKworICAgICAgICAgIF9UcCBfX0VuID0gX19leHBpbnRfRW5fcmVjdXJzaW9uKF9fbiwgX194KTsKKworICAgICAgICAgIHJldHVybiBfX0VuOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGV4cG9uZW50aWFsIGludGVncmFsIEBmJCBFaSh4KSBAZiQuCisgICAgICogCisgICAgICogICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgaXMgZ2l2ZW4gYnkKKyAgICAgKiAgIFxmWworICAgICAqICAgICBFaSh4KSA9IC1caW50X3steH1eXGluZnR5IFxmcmFje2VedH17dH0gZHQKKyAgICAgKiAgIFxmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBfX3ggIFRoZSBhcmd1bWVudCBvZiB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgZXhwb25lbnRpYWwgaW50ZWdyYWwuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2V4cGludChjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19leHBpbnRfRWkoX194KTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0VYUF9JTlRFR1JBTF9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2ZlbnYuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2ZlbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTg2MzBlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvZmVudi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBmZW52LmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZmVudi5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9GRU5WX0gKKyNkZWZpbmUgX1RSMV9GRU5WX0ggMQorCisjaW5jbHVkZSA8dHIxL2NmZW52PgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Zsb2F0LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9mbG9hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZWZmNmUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9mbG9hdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBmbG9hdC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Zsb2F0LmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX0ZMT0FUX0gKKyNkZWZpbmUgX1RSMV9GTE9BVF9IIDEKKworI2luY2x1ZGUgPHRyMS9jZmxvYXQ+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvZnVuY3Rpb25hbCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Z1bmN0aW9uYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNzJkNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Z1bmN0aW9uYWwKQEAgLTAsMCArMSwyMTQ5IEBACisvLyBUUjEgZnVuY3Rpb25hbCBoZWFkZXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Z1bmN0aW9uYWwKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPgorCisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHRyMS90dXBsZT4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8Yml0cy9zdHJpbmdmd2QuaD4KKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbF9oYXNoLmg+CisjaW5jbHVkZSA8ZXh0L3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Yml0cy9tb3ZlLmg+IC8vIGZvciBzdGQ6Ol9fYWRkcmVzc29mCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyUG9pbnRlcj4KKyAgICBjbGFzcyBfTWVtX2ZuOworCisgIC8qKgorICAgKiAgQWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIF9IYXNfcmVzdWx0X3R5cGUsIHdoaWNoIHVzZXMgU0ZJTkFFIHRvCisgICAqICBkZXRlcm1pbmUgaWYgdGhlIHR5cGUgX1RwIGhhcyBhIHB1YmxpY2x5LWFjY2Vzc2libGUgbWVtYmVyIHR5cGUKKyAgICogIHJlc3VsdF90eXBlLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX0hhc19yZXN1bHRfdHlwZV9oZWxwZXIgOiBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RydWN0IF9XcmFwX3R5cGUKKwl7IH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fb25lIF9fdGVzdChfV3JhcF90eXBlPHR5cGVuYW1lIF9VcDo6cmVzdWx0X3R5cGU+Kik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0PF9UcD4oMCkpID09IDE7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9IYXNfcmVzdWx0X3R5cGUKKyAgICA6IGludGVncmFsX2NvbnN0YW50PGJvb2wsCisJICAgICAgX0hhc19yZXN1bHRfdHlwZV9oZWxwZXI8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLyoqCisgICAqICAKKyAgKi8KKyAgLy8vIElmIHdlIGhhdmUgZm91bmQgYSByZXN1bHRfdHlwZSwgZXh0cmFjdCBpdC4KKyAgdGVtcGxhdGU8Ym9vbCBfSGFzX3Jlc3VsdF90eXBlLCB0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX01heWJlX2dldF9yZXN1bHRfdHlwZQorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX01heWJlX2dldF9yZXN1bHRfdHlwZTx0cnVlLCBfRnVuY3Rvcj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9GdW5jdG9yOjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQmFzZSBjbGFzcyBmb3IgYW55IGZ1bmN0aW9uIG9iamVjdCB0aGF0IGhhcyBhIHdlYWsgcmVzdWx0IHR5cGUsIGFzCisgICAqICBkZWZpbmVkIGluIDMuMy8zIG9mIFRSMS4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGwKKyAgICA6IF9NYXliZV9nZXRfcmVzdWx0X3R5cGU8X0hhc19yZXN1bHRfdHlwZTxfRnVuY3Rvcj46OnZhbHVlLCBfRnVuY3Rvcj4KKyAgICB7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyhfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmVzdWx0IHR5cGUgZm9yIGEgZnVuY3Rpb24gcmVmZXJlbmNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMoJikoX0FyZ1R5cGVzLi4uKT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGZvciBhIGZ1bmN0aW9uIHBvaW50ZXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcygqKShfQXJnVHlwZXMuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLy8vIFJldHJpZXZlIHJlc3VsdCB0eXBlIGZvciBhIGNvbnN0IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+IAorICAgIHN0cnVjdCBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvLy8gUmV0cmlldmUgcmVzdWx0IHR5cGUgZm9yIGEgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4gCisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlX2ltcGw8X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIHZvbGF0aWxlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKyAgICB9OworCisgIC8vLyBSZXRyaWV2ZSByZXN1bHQgdHlwZSBmb3IgYSBjb25zdCB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlci4gCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX1dlYWtfcmVzdWx0X3R5cGVfaW1wbDxfUmVzIChfQ2xhc3M6OiopKF9BcmdUeXBlcy4uLiljb25zdCB2b2xhdGlsZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgcmVzdWx0X3R5cGU7CisgICAgfTsKKworICAvKioKKyAgICogIFN0cmlwIHRvcC1sZXZlbCBjdi1xdWFsaWZpZXJzIGZyb20gdGhlIGZ1bmN0aW9uIG9iamVjdCBhbmQgbGV0CisgICAqICBfV2Vha19yZXN1bHRfdHlwZV9pbXBsIHBlcmZvcm0gdGhlIHJlYWwgd29yay4KKyAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgc3RydWN0IF9XZWFrX3Jlc3VsdF90eXBlCisgICAgOiBfV2Vha19yZXN1bHRfdHlwZV9pbXBsPHR5cGVuYW1lIHJlbW92ZV9jdjxfRnVuY3Rvcj46OnR5cGU+CisgICAgeworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBjbGFzcyByZXN1bHRfb2Y7CisKKyAgLyoqCisgICAqICBBY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgcmVzdWx0X29mLiBXaGVuIF9IYXNfcmVzdWx0X3R5cGUgaXMKKyAgICogIHRydWUsIGdldHMgaXRzIHJlc3VsdCBmcm9tIF9XZWFrX3Jlc3VsdF90eXBlLiBPdGhlcndpc2UsIHVzZXMKKyAgICogIHRoZSBmdW5jdGlvbiBvYmplY3QncyBtZW1iZXIgdGVtcGxhdGUgcmVzdWx0IHRvIGV4dHJhY3QgdGhlCisgICAqICByZXN1bHQgdHlwZS4KKyAgKi8KKyAgdGVtcGxhdGU8Ym9vbCBfSGFzX3Jlc3VsdF90eXBlLCB0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBfUmVzdWx0X29mX2ltcGw7CisKKyAgLy8gSGFuZGxlIG1lbWJlciBkYXRhIHBvaW50ZXJzIHVzaW5nIF9NZW1fZm4ncyBsb2dpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPGZhbHNlLCBfUmVzIF9DbGFzczo6KihfVDEpPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX01lbV9mbjxfUmVzIF9DbGFzczo6Kj4KKyAgICAgICAgICAgICAgICA6OnRlbXBsYXRlIF9SZXN1bHRfdHlwZTxfVDE+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgd2UgY2FuIGRldGVybWluZSBhIHJlc3VsdCB0eXBlIGZyb20gQGMgRnVuY3RvciAKKyAgICogYWxvbmUuCisgICAqLyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyByZXN1bHRfb2Y8X0Z1bmN0b3IoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfUmVzdWx0X29mX2ltcGw8CisgICAgICAgICAgICAgICBfSGFzX3Jlc3VsdF90eXBlPF9XZWFrX3Jlc3VsdF90eXBlPF9GdW5jdG9yPiA+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgIH07CisKKyAgLy8vIFdlIGFscmVhZHkga25vdyB0aGUgcmVzdWx0IHR5cGUgZm9yIEBjIEZ1bmN0b3I7IHVzZSBpdC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPHRydWUsIF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfV2Vha19yZXN1bHRfdHlwZTxfRnVuY3Rvcj46OnJlc3VsdF90eXBlIHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogV2UgbmVlZCB0byBjb21wdXRlIHRoZSByZXN1bHQgdHlwZSBmb3IgdGhpcyBpbnZvY2F0aW9uIHRoZSBoYXJkIAorICAgKiB3YXkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBfUmVzdWx0X29mX2ltcGw8ZmFsc2UsIF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfRnVuY3RvcgorICAgICAgICAgICAgICAgIDo6dGVtcGxhdGUgcmVzdWx0PF9GdW5jdG9yKF9BcmdUeXBlcy4uLik+Ojp0eXBlIHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogSXQgaXMgdW5zYWZlIHRvIGFjY2VzcyA6OnJlc3VsdCB3aGVuIHRoZXJlIGFyZSB6ZXJvIGFyZ3VtZW50cywgc28gd2UgCisgICAqIHJldHVybiBAYyB2b2lkIGluc3RlYWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPGZhbHNlLCBfRnVuY3RvcigpPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdm9pZCB0eXBlOworICAgIH07CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIHR5cGUgX1RwIGRlcml2ZXMgZnJvbSB1bmFyeV9mdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfRGVyaXZlc19mcm9tX3VuYXJ5X2Z1bmN0aW9uIDogX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1Jlcz4KKyAgICAgICAgc3RhdGljIF9fb25lIF9fdGVzdChjb25zdCB2b2xhdGlsZSB1bmFyeV9mdW5jdGlvbjxfVDEsIF9SZXM+Kik7CisKKyAgICAgIC8vIEl0J3MgdGVtcHRpbmcgdG8gY2hhbmdlICIuLi4iIHRvIGNvbnN0IHZvbGF0aWxlIHZvaWQqLCBidXQKKyAgICAgIC8vIHRoYXQgZmFpbHMgd2hlbiBfVHAgaXMgYSBmdW5jdGlvbiB0eXBlLgorICAgICAgc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YoX190ZXN0KChfVHAqKTApKSA9PSAxOworICAgIH07CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIHR5cGUgX1RwIGRlcml2ZXMgZnJvbSBiaW5hcnlfZnVuY3Rpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Rlcml2ZXNfZnJvbV9iaW5hcnlfZnVuY3Rpb24gOiBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDIsIHR5cGVuYW1lIF9SZXM+CisgICAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoY29uc3Qgdm9sYXRpbGUgYmluYXJ5X2Z1bmN0aW9uPF9UMSwgX1QyLCBfUmVzPiopOworCisgICAgICAvLyBJdCdzIHRlbXB0aW5nIHRvIGNoYW5nZSAiLi4uIiB0byBjb25zdCB2b2xhdGlsZSB2b2lkKiwgYnV0CisgICAgICAvLyB0aGF0IGZhaWxzIHdoZW4gX1RwIGlzIGEgZnVuY3Rpb24gdHlwZS4KKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKworICAgIHB1YmxpYzoKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKF9fdGVzdCgoX1RwKikwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBUdXJucyBhIGZ1bmN0aW9uIHR5cGUgaW50byBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIGJvb2wgX0lzRnVuY3Rpb25UeXBlID0gaXNfZnVuY3Rpb248X1RwPjo6dmFsdWU+CisgICAgc3RydWN0IF9GdW5jdGlvbl90b19mdW5jdGlvbl9wb2ludGVyCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX0Z1bmN0aW9uX3RvX2Z1bmN0aW9uX3BvaW50ZXI8X1RwLCB0cnVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwKiB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIEludm9rZSBhIGZ1bmN0aW9uIG9iamVjdCwgd2hpY2ggbWF5IGJlIGVpdGhlciBhIG1lbWJlciBwb2ludGVyIG9yIGEKKyAgICogZnVuY3Rpb24gb2JqZWN0LiBUaGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgdGVsbCB3aGljaC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBpbmxpbmUKKyAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPAorICAgICAgICAgICAgICghaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncy4uLik+Ojp0eXBlCisgICAgICAgICAgID46Ol9fdHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yJiBfX2YsIF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIF9fZihfX2FyZ3MuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgaW5saW5lCisgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwKKyAgICAgICAgICAgICAoaXNfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiAhaXNfZnVuY3Rpb248dHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlPjo6dmFsdWUpLAorICAgICAgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfRnVuY3RvcihfQXJncy4uLik+Ojp0eXBlCisgICAgICAgICAgID46Ol9fdHlwZQorICAgIF9faW52b2tlKF9GdW5jdG9yJiBfX2YsIF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgcmV0dXJuIG1lbV9mbihfX2YpKF9fYXJncy4uLik7CisgICAgfQorCisgIC8vIFRvIHBpY2sgdXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAodGhhdCB3aWxsIGJlY29tZSBmdW5jdGlvbiBwb2ludGVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGlubGluZQorICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisgICAgICAgICAgICAgKGlzX3BvaW50ZXI8X0Z1bmN0b3I+Ojp2YWx1ZQorICAgICAgICAgICAgICAmJiBpc19mdW5jdGlvbjx0eXBlbmFtZSByZW1vdmVfcG9pbnRlcjxfRnVuY3Rvcj46OnR5cGU+Ojp2YWx1ZSksCisgICAgICAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPF9GdW5jdG9yKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgICAgPjo6X190eXBlCisgICAgX19pbnZva2UoX0Z1bmN0b3IgX19mLCBfQXJncyYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiBfX2YoX19hcmdzLi4uKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBLbm93aW5nIHdoaWNoIG9mIHVuYXJ5X2Z1bmN0aW9uIGFuZCBiaW5hcnlfZnVuY3Rpb24gX1RwIGRlcml2ZXMKKyAgICogIGZyb20sIGRlcml2ZXMgZnJvbSB0aGUgc2FtZSBhbmQgZW5zdXJlcyB0aGF0IHJlZmVyZW5jZV93cmFwcGVyCisgICAqICB3aWxsIGhhdmUgYSB3ZWFrIHJlc3VsdCB0eXBlLiBTZWUgY2FzZXMgYmVsb3cuCisgICAqLworICB0ZW1wbGF0ZTxib29sIF9VbmFyeSwgYm9vbCBfQmluYXJ5LCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw7CisKKyAgLy8gTm90IGEgdW5hcnlfZnVuY3Rpb24gb3IgYmluYXJ5X2Z1bmN0aW9uLCBzbyB0cnkgYSB3ZWFrIHJlc3VsdCB0eXBlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlX2ltcGw8ZmFsc2UsIGZhbHNlLCBfVHA+CisgICAgOiBfV2Vha19yZXN1bHRfdHlwZTxfVHA+CisgICAgeyB9OworCisgIC8vIHVuYXJ5X2Z1bmN0aW9uIGJ1dCBub3QgYmluYXJ5X2Z1bmN0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDx0cnVlLCBmYWxzZSwgX1RwPgorICAgIDogdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1RwOjphcmd1bWVudF90eXBlLAorCQkgICAgIHR5cGVuYW1lIF9UcDo6cmVzdWx0X3R5cGU+CisgICAgeyB9OworCisgIC8vIGJpbmFyeV9mdW5jdGlvbiBidXQgbm90IHVuYXJ5X2Z1bmN0aW9uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2VfaW1wbDxmYWxzZSwgdHJ1ZSwgX1RwPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcDo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKKwkJICAgICAgdHlwZW5hbWUgX1RwOjpzZWNvbmRfYXJndW1lbnRfdHlwZSwKKwkJICAgICAgdHlwZW5hbWUgX1RwOjpyZXN1bHRfdHlwZT4KKyAgICB7IH07CisKKyAgLy8gQm90aCB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uLiBJbXBvcnQgcmVzdWx0X3R5cGUgdG8KKyAgLy8gYXZvaWQgY29uZmxpY3RzLgorICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPHRydWUsIHRydWUsIF9UcD4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9UcDo6YXJndW1lbnRfdHlwZSwKKwkJICAgICB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlPiwKKyAgICAgIGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfVHA6OmZpcnN0X2FyZ3VtZW50X3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIF9UcDo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCisJCSAgICAgIHR5cGVuYW1lIF9UcDo6cmVzdWx0X3R5cGU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfVHA6OnJlc3VsdF90eXBlIHJlc3VsdF90eXBlOworICAgIH07CisKKyAgLyoqCisgICAqICBEZXJpdmVzIGZyb20gdW5hcnlfZnVuY3Rpb24gb3IgYmluYXJ5X2Z1bmN0aW9uIHdoZW4gaXQKKyAgICogIGNhbi4gU3BlY2lhbGl6YXRpb25zIGhhbmRsZSBhbGwgb2YgdGhlIGVhc3kgY2FzZXMuIFRoZSBwcmltYXJ5CisgICAqICB0ZW1wbGF0ZSBkZXRlcm1pbmVzIHdoYXQgdG8gZG8gd2l0aCBhIGNsYXNzIHR5cGUsIHdoaWNoIG1heQorICAgKiAgZGVyaXZlIGZyb20gYm90aCB1bmFyeV9mdW5jdGlvbiBhbmQgYmluYXJ5X2Z1bmN0aW9uLgorICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlCisgICAgOiBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZV9pbXBsPAorICAgICAgX0Rlcml2ZXNfZnJvbV91bmFyeV9mdW5jdGlvbjxfVHA+Ojp2YWx1ZSwKKyAgICAgIF9EZXJpdmVzX2Zyb21fYmluYXJ5X2Z1bmN0aW9uPF9UcD46OnZhbHVlLAorICAgICAgX1RwPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAodW5hcnkpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEpPgorICAgIDogdW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgZnVuY3Rpb24gdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyhfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgKHVuYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMoKikoX1QxKT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPF9UMSwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSAoYmluYXJ5KQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcygqKShfVDEsIF9UMik+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgbm8gcXVhbGlmaWVycykKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCk+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBubyBxdWFsaWZpZXJzKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKHVuYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKCkgY29uc3Q+CisgICAgOiB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAoYmluYXJ5LCBjb25zdCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoX1QyKSBjb25zdD4KKyAgICA6IGJpbmFyeV9mdW5jdGlvbjxjb25zdCBfVDEqLCBfVDIsIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlICh1bmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMT4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKSgpIHZvbGF0aWxlPgorICAgIDogdW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8gLSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgKGJpbmFyeSwgdm9sYXRpbGUpCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIHN0cnVjdCBfUmVmZXJlbmNlX3dyYXBwZXJfYmFzZTxfUmVzIChfVDE6OiopKF9UMikgdm9sYXRpbGU+CisgICAgOiBiaW5hcnlfZnVuY3Rpb248dm9sYXRpbGUgX1QxKiwgX1QyLCBfUmVzPgorICAgIHsgfTsKKworICAvLyAtIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSAodW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+CisgICAgc3RydWN0IF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPF9SZXMgKF9UMTo6KikoKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9SZXM+CisgICAgeyB9OworCisgIC8vIC0gYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIChiaW5hcnksIGNvbnN0IHZvbGF0aWxlKQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBzdHJ1Y3QgX1JlZmVyZW5jZV93cmFwcGVyX2Jhc2U8X1JlcyAoX1QxOjoqKShfVDIpIGNvbnN0IHZvbGF0aWxlPgorICAgIDogYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IHZvbGF0aWxlIF9UMSosIF9UMiwgX1Jlcz4KKyAgICB7IH07CisKKyAgLy8vIHJlZmVyZW5jZV93cmFwcGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyByZWZlcmVuY2Vfd3JhcHBlcgorICAgIDogcHVibGljIF9SZWZlcmVuY2Vfd3JhcHBlcl9iYXNlPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsKKyAgICAgIC8vIElmIF9UcCBpcyBhIGZ1bmN0aW9uIHR5cGUsIHdlIGNhbid0IGZvcm0gcmVzdWx0X29mPF9UcCguLi4pPiwKKyAgICAgIC8vIHNvIHR1cm4gaXQgaW50byBhIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZS4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Z1bmN0aW9uX3RvX2Z1bmN0aW9uX3BvaW50ZXI8X1RwPjo6dHlwZQorICAgICAgICBfTV9mdW5jX3R5cGU7CisKKyAgICAgIF9UcCogX01fZGF0YTsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCB0eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgcmVmZXJlbmNlX3dyYXBwZXIoX1RwJiBfX2luZGF0YSkKKyAgICAgIDogX01fZGF0YShzdGQ6Ol9fYWRkcmVzc29mKF9faW5kYXRhKSkKKyAgICAgIHsgfQorCisgICAgICByZWZlcmVuY2Vfd3JhcHBlcihjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+JiBfX2lucmVmKToKKyAgICAgIF9NX2RhdGEoX19pbnJlZi5fTV9kYXRhKQorICAgICAgeyB9CisKKyAgICAgIHJlZmVyZW5jZV93cmFwcGVyJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPF9UcD4mIF9faW5yZWYpCisgICAgICB7CisgICAgICAgIF9NX2RhdGEgPSBfX2lucmVmLl9NX2RhdGE7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgb3BlcmF0b3IgX1RwJigpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5nZXQoKTsgfQorCisgICAgICBfVHAmCisgICAgICBnZXQoKSBjb25zdAorICAgICAgeyByZXR1cm4gKl9NX2RhdGE7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjxfTV9mdW5jX3R5cGUoX0FyZ3MuLi4pPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsKKwkgIHJldHVybiBfX2ludm9rZShnZXQoKSwgX19hcmdzLi4uKTsKKwl9CisgICAgfTsKKworCisgIC8vIERlbm90ZXMgYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHRha2VuIHRvIGEgdmFyaWFibGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorICAgIHJlZihfVHAmIF9fdCkKKyAgICB7IHJldHVybiByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+KF9fdCk7IH0KKworICAvLyBEZW5vdGVzIGEgY29uc3QgcmVmZXJlbmNlIHNob3VsZCBiZSB0YWtlbiB0byBhIHZhcmlhYmxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IF9UcD4KKyAgICBjcmVmKGNvbnN0IF9UcCYgX190KQorICAgIHsgcmV0dXJuIHJlZmVyZW5jZV93cmFwcGVyPGNvbnN0IF9UcD4oX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPgorICAgIHJlZihyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+IF9fdCkKKyAgICB7IHJldHVybiByZWYoX190LmdldCgpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgX1RwPgorICAgIGNyZWYocmVmZXJlbmNlX3dyYXBwZXI8X1RwPiBfX3QpCisgICAgeyByZXR1cm4gY3JlZihfX3QuZ2V0KCkpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBib29sPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbgorICAgIHsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWVtX2ZuX2NvbnN0X29yX25vbjxfVHAsIGZhbHNlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiB0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqIERlcml2ZXMgZnJvbSBAYyB1bmFyeV9mdW5jdGlvbiBvciBAYyBiaW5hcnlfZnVuY3Rpb24sIG9yIHBlcmhhcHMKKyAgICogbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLiBUaGUKKyAgICogcHJpbWFyeSB0ZW1wbGF0ZSBpcyB0aGUgYmFzaXMgY2FzZSwgd2hpY2ggZGVyaXZlcyBub3RoaW5nLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPiAKKyAgICBzdHJ1Y3QgX01heWJlX3VuYXJ5X29yX2JpbmFyeV9mdW5jdGlvbiB7IH07CisKKyAgLy8vIERlcml2ZXMgZnJvbSBAYyB1bmFyeV9mdW5jdGlvbiwgYXMgYXBwcm9wcmlhdGUuIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfVDE+IAorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMT4KKyAgICA6IHN0ZDo6dW5hcnlfZnVuY3Rpb248X1QxLCBfUmVzPiB7IH07CisKKyAgLy8vIERlcml2ZXMgZnJvbSBAYyBiaW5hcnlfZnVuY3Rpb24sIGFzIGFwcHJvcHJpYXRlLiAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+IAorICAgIHN0cnVjdCBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9UMSwgX1QyPgorICAgIDogc3RkOjpiaW5hcnlfZnVuY3Rpb248X1QxLCBfVDIsIF9SZXM+IHsgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pPgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgX0NsYXNzKiwgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLik7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLCAKKyAgICAgICAgICAgICAgICBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyogX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworCW9wZXJhdG9yKCkoX1RwJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fY2FsbChfX29iamVjdCwgJl9fb2JqZWN0LCBfX2FyZ3MuLi4pOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgX0Z1bmN0b3IgX19wbWY7CisgICAgfTsKKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgQGMgbWVtX2ZuIGZvciBjb25zdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9NZW1fZm48X1JlcyAoX0NsYXNzOjoqKShfQXJnVHlwZXMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIF9NYXliZV91bmFyeV9vcl9iaW5hcnlfZnVuY3Rpb248X1JlcywgY29uc3QgX0NsYXNzKiwgCisJCQkJCSAgICAgX0FyZ1R5cGVzLi4uPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1JlcyAoX0NsYXNzOjoqX0Z1bmN0b3IpKF9BcmdUeXBlcy4uLikgY29uc3Q7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyAqLCAKKyAgICAgICAgICAgICAgICBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcworICAgICAgICBfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKCgqX19wdHIpLipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworCisgICAgICBleHBsaWNpdCBfTWVtX2ZuKF9GdW5jdG9yIF9fcG1mKSA6IF9fcG1mKF9fcG1mKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMKKyAgICAgIG9wZXJhdG9yKCkoY29uc3QgX0NsYXNzJiBfX29iamVjdCwgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX29iamVjdC4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcyBvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3Igdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIHZvbGF0aWxlIF9DbGFzcyosIAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwgCisgICAgICAgICAgICAgICAgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzCisgICAgICBvcGVyYXRvcigpKHZvbGF0aWxlIF9DbGFzcyYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QuKl9fcG1mKShfX2FyZ3MuLi4pOyB9CisKKyAgICAgIC8vIEhhbmRsZSBwb2ludGVycworICAgICAgX1JlcworICAgICAgb3BlcmF0b3IoKSh2b2xhdGlsZSBfQ2xhc3MqIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LT4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwb2ludGVycyB0byBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKwlvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIEBjIG1lbV9mbiBmb3IgY29uc3Qgdm9sYXRpbGUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfTWVtX2ZuPF9SZXMgKF9DbGFzczo6KikoX0FyZ1R5cGVzLi4uKSBjb25zdCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIGNvbnN0IHZvbGF0aWxlIF9DbGFzcyosIAorCQkJCQkgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9SZXMgKF9DbGFzczo6Kl9GdW5jdG9yKShfQXJnVHlwZXMuLi4pIGNvbnN0IHZvbGF0aWxlOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCB2b2xhdGlsZSBfQ2xhc3MgKiwgCisgICAgICAgICAgICAgICAgX0FyZ1R5cGVzLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMKKyAgICAgICAgX01fY2FsbChfVHAmIF9fcHRyLCBjb25zdCB2b2xhdGlsZSB2b2lkICosIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgoKl9fcHRyKS4qX19wbWYpKF9fYXJncy4uLik7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1JlcyByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQgX01lbV9mbihfRnVuY3RvciBfX3BtZikgOiBfX3BtZihfX3BtZikgeyB9CisKKyAgICAgIC8vIEhhbmRsZSBvYmplY3RzCisgICAgICBfUmVzIAorICAgICAgb3BlcmF0b3IoKShjb25zdCB2b2xhdGlsZSBfQ2xhc3MmIF9fb2JqZWN0LCBfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgICAgeyByZXR1cm4gKF9fb2JqZWN0LipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgcG9pbnRlcnMKKyAgICAgIF9SZXMgCisgICAgICBvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9DbGFzcyogX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICB7IHJldHVybiAoX19vYmplY3QtPipfX3BtZikoX19hcmdzLi4uKTsgfQorCisgICAgICAvLyBIYW5kbGUgc21hcnQgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzIHRvIGRlcml2ZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgX1JlcyBvcGVyYXRvcigpKF9UcCYgX19vYmplY3QsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX19vYmplY3QsICZfX29iamVjdCwgX19hcmdzLi4uKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9GdW5jdG9yIF9fcG1mOworICAgIH07CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgY2xhc3MgX01lbV9mbjxfUmVzIF9DbGFzczo6Kj4KKyAgICB7CisgICAgICAvLyBUaGlzIGJpdCBvZiBnZW5pdXMgaXMgZHVlIHRvIFBldGVyIERpbW92LCBpbXByb3ZlZCBzbGlnaHRseSBieQorICAgICAgLy8gRG91Z2xhcyBHcmVnb3IuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIF9SZXMmCisgICAgICAgIF9NX2NhbGwoX1RwJiBfX29iamVjdCwgX0NsYXNzICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9fb2JqZWN0LipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIF9VcCAqIGNvbnN0ICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgqX19vYmplY3QpLipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBjb25zdCBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19vYmplY3QsIGNvbnN0IF9VcCAqIGNvbnN0ICopIGNvbnN0CisgICAgICAgIHsgcmV0dXJuICgqX19vYmplY3QpLipfX3BtOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgY29uc3QgX1JlcyYKKyAgICAgICAgX01fY2FsbChfVHAmIF9fb2JqZWN0LCBjb25zdCBfQ2xhc3MgKikgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBjb25zdCBfUmVzJgorICAgICAgICBfTV9jYWxsKF9UcCYgX19wdHIsIGNvbnN0IHZvbGF0aWxlIHZvaWQqKSBjb25zdAorICAgICAgICB7IHJldHVybiAoKl9fcHRyKS4qX19wbTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0YXRpYyBfVHAmIF9fZ2V0X3JlZigpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBfX3NmaW5hZV90eXBlczo6X19vbmUgX19jaGVja19jb25zdChfVHAmLCBfQ2xhc3MqKTsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgICAgICBzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fb25lIF9fY2hlY2tfY29uc3QoX1RwJiwgX1VwICogY29uc3QgKik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICAgICAgc3RhdGljIF9fc2ZpbmFlX3R5cGVzOjpfX3R3byBfX2NoZWNrX2NvbnN0KF9UcCYsIGNvbnN0IF9VcCAqIGNvbnN0ICopOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgX19zZmluYWVfdHlwZXM6Ol9fdHdvIF9fY2hlY2tfY29uc3QoX1RwJiwgY29uc3QgX0NsYXNzKik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBfX3NmaW5hZV90eXBlczo6X190d28gX19jaGVja19jb25zdChfVHAmLCBjb25zdCB2b2xhdGlsZSB2b2lkKik7CisKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0cnVjdCBfUmVzdWx0X3R5cGUKKwk6IF9NZW1fZm5fY29uc3Rfb3Jfbm9uPF9SZXMsCisJICAoc2l6ZW9mKF9fc2ZpbmFlX3R5cGVzOjpfX3R3bykKKwkgICA9PSBzaXplb2YoX19jaGVja19jb25zdDxfVHA+KF9fZ2V0X3JlZjxfVHA+KCksIChfVHAqKTApKSk+CisgICAgICAgIHsgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICAgICAgc3RydWN0IHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTWVtLCB0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0cnVjdCByZXN1bHQ8X0NWTWVtKF9UcCk+CisJOiBwdWJsaWMgX1Jlc3VsdF90eXBlPF9UcD4geyB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNZW0sIHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RydWN0IHJlc3VsdDxfQ1ZNZW0oX1RwJik+CisJOiBwdWJsaWMgX1Jlc3VsdF90eXBlPF9UcD4geyB9OworCisgICAgICBleHBsaWNpdAorICAgICAgX01lbV9mbihfUmVzIF9DbGFzczo6Kl9fcG0pIDogX19wbShfX3BtKSB7IH0KKworICAgICAgLy8gSGFuZGxlIG9iamVjdHMKKyAgICAgIF9SZXMmCisgICAgICBvcGVyYXRvcigpKF9DbGFzcyYgX19vYmplY3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfX29iamVjdC4qX19wbTsgfQorCisgICAgICBjb25zdCBfUmVzJgorICAgICAgb3BlcmF0b3IoKShjb25zdCBfQ2xhc3MmIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QuKl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHBvaW50ZXJzCisgICAgICBfUmVzJgorICAgICAgb3BlcmF0b3IoKShfQ2xhc3MqIF9fb2JqZWN0KSBjb25zdAorICAgICAgeyByZXR1cm4gX19vYmplY3QtPipfX3BtOyB9CisKKyAgICAgIGNvbnN0IF9SZXMmCisgICAgICBvcGVyYXRvcigpKGNvbnN0IF9DbGFzcyogX19vYmplY3QpIGNvbnN0CisgICAgICB7IHJldHVybiBfX29iamVjdC0+Kl9fcG07IH0KKworICAgICAgLy8gSGFuZGxlIHNtYXJ0IHBvaW50ZXJzIGFuZCBkZXJpdmVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHR5cGVuYW1lIF9SZXN1bHRfdHlwZTxfVHA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1RwJiBfX3Vua25vd24pIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX2NhbGwoX191bmtub3duLCAmX191bmtub3duKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZXMgX0NsYXNzOjoqX19wbTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIFJldHVybnMgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBmb3J3YXJkcyB0byB0aGUgbWVtYmVyCisgICAqICBwb2ludGVyIEBhIHBtLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X1RwIF9DbGFzczo6Kj4KKyAgICBtZW1fZm4oX1RwIF9DbGFzczo6KiBfX3BtKQorICAgIHsKKyAgICAgIHJldHVybiBfTWVtX2ZuPF9UcCBfQ2xhc3M6Oio+KF9fcG0pOworICAgIH0KKworICAvKioKKyAgICogIEBicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0eXBlIF9UcCBpcyBhIGZ1bmN0aW9uIG9iamVjdAorICAgKiAgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJleHByZXNzaW9uIHdoZW4gZXZhbHVhdGluZyBjYWxscyB0bworICAgKiAgZnVuY3Rpb24gb2JqZWN0cyByZXR1cm5lZCBieSBiaW5kKCkuIFtUUjEgMy42LjFdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248X1RwPjo6dmFsdWU7CisKKyAgLyoqCisgICAqICBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdHlwZSBfVHAgaXMgYSBwbGFjZWhvbGRlciBpbiBhCisgICAqICBiaW5kKCkgZXhwcmVzc2lvbiBhbmQsIGlmIHNvLCB3aGljaCBwbGFjZWhvbGRlciBpdCBpcy4gW1RSMSAzLjYuMl0KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcGxhY2Vob2xkZXIKKyAgICB7IHN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAwOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjb25zdCBpbnQgaXNfcGxhY2Vob2xkZXI8X1RwPjo6dmFsdWU7CisKKyAgLy8vIFRoZSB0eXBlIG9mIHBsYWNlaG9sZGVyIG9iamVjdHMgZGVmaW5lZCBieSBsaWJzdGRjKysuCisgIHRlbXBsYXRlPGludCBfTnVtPiBzdHJ1Y3QgX1BsYWNlaG9sZGVyIHsgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqIEBuYW1lc3BhY2Ugc3RkOjpwbGFjZWhvbGRlcnMKKyAgICogIEBicmllZiBJU08gQysrIDB4IGVudGl0aWVzIHN1YiBuYW1lc3BhY2UgZm9yIGZ1bmN0aW9uYWwuCisgICAqCisgICAqICBEZWZpbmUgYSBsYXJnZSBudW1iZXIgb2YgcGxhY2Vob2xkZXJzLiBUaGVyZSBpcyBubyB3YXkgdG8KKyAgICogIHNpbXBsaWZ5IHRoaXMgd2l0aCB2YXJpYWRpYyB0ZW1wbGF0ZXMsIGJlY2F1c2Ugd2UncmUgaW50cm9kdWNpbmcKKyAgICogIHVuaXF1ZSBuYW1lcyBmb3IgZWFjaC4KKyAgICovCisgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgCisgIHsgCisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisgICAgbmFtZXNwYWNlIAorICAgIHsKKyAgICAgIF9QbGFjZWhvbGRlcjwxPiBfMTsKKyAgICAgIF9QbGFjZWhvbGRlcjwyPiBfMjsKKyAgICAgIF9QbGFjZWhvbGRlcjwzPiBfMzsKKyAgICAgIF9QbGFjZWhvbGRlcjw0PiBfNDsKKyAgICAgIF9QbGFjZWhvbGRlcjw1PiBfNTsKKyAgICAgIF9QbGFjZWhvbGRlcjw2PiBfNjsKKyAgICAgIF9QbGFjZWhvbGRlcjw3PiBfNzsKKyAgICAgIF9QbGFjZWhvbGRlcjw4PiBfODsKKyAgICAgIF9QbGFjZWhvbGRlcjw5PiBfOTsKKyAgICAgIF9QbGFjZWhvbGRlcjwxMD4gXzEwOworICAgICAgX1BsYWNlaG9sZGVyPDExPiBfMTE7CisgICAgICBfUGxhY2Vob2xkZXI8MTI+IF8xMjsKKyAgICAgIF9QbGFjZWhvbGRlcjwxMz4gXzEzOworICAgICAgX1BsYWNlaG9sZGVyPDE0PiBfMTQ7CisgICAgICBfUGxhY2Vob2xkZXI8MTU+IF8xNTsKKyAgICAgIF9QbGFjZWhvbGRlcjwxNj4gXzE2OworICAgICAgX1BsYWNlaG9sZGVyPDE3PiBfMTc7CisgICAgICBfUGxhY2Vob2xkZXI8MTg+IF8xODsKKyAgICAgIF9QbGFjZWhvbGRlcjwxOT4gXzE5OworICAgICAgX1BsYWNlaG9sZGVyPDIwPiBfMjA7CisgICAgICBfUGxhY2Vob2xkZXI8MjE+IF8yMTsKKyAgICAgIF9QbGFjZWhvbGRlcjwyMj4gXzIyOworICAgICAgX1BsYWNlaG9sZGVyPDIzPiBfMjM7CisgICAgICBfUGxhY2Vob2xkZXI8MjQ+IF8yNDsKKyAgICAgIF9QbGFjZWhvbGRlcjwyNT4gXzI1OworICAgICAgX1BsYWNlaG9sZGVyPDI2PiBfMjY7CisgICAgICBfUGxhY2Vob2xkZXI8Mjc+IF8yNzsKKyAgICAgIF9QbGFjZWhvbGRlcjwyOD4gXzI4OworICAgICAgX1BsYWNlaG9sZGVyPDI5PiBfMjk7CisgICAgfSAKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0KKworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyAgLyoqCisgICAqICBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIGlzX3BsYWNlaG9sZGVyIHRoYXQgcHJvdmlkZXMgdGhlIHBsYWNlaG9sZGVyCisgICAqICBudW1iZXIgZm9yIHRoZSBwbGFjZWhvbGRlciBvYmplY3RzIGRlZmluZWQgYnkgbGlic3RkYysrLgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9OdW0+CisgICAgc3RydWN0IGlzX3BsYWNlaG9sZGVyPF9QbGFjZWhvbGRlcjxfTnVtPiA+CisgICAgeyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gX051bTsgfTsKKworICB0ZW1wbGF0ZTxpbnQgX051bT4KKyAgICBjb25zdCBpbnQgaXNfcGxhY2Vob2xkZXI8X1BsYWNlaG9sZGVyPF9OdW0+ID46OnZhbHVlOworCisgIC8qKgorICAgKiBTdG9yZXMgYSB0dXBsZSBvZiBpbmRpY2VzLiBVc2VkIGJ5IGJpbmQoKSB0byBleHRyYWN0IHRoZSBlbGVtZW50cworICAgKiBpbiBhIHR1cGxlLiAKKyAgICovCisgIHRlbXBsYXRlPGludC4uLiBfSW5kZXhlcz4KKyAgICBzdHJ1Y3QgX0luZGV4X3R1cGxlIHsgfTsKKworICAvLy8gQnVpbGRzIGFuIF9JbmRleF90dXBsZTwwLCAxLCAyLCAuLi4sIF9OdW0tMT4uCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9OdW0sIHR5cGVuYW1lIF9UdXBsZSA9IF9JbmRleF90dXBsZTw+ID4KKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlOworIAorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTnVtLCBpbnQuLi4gX0luZGV4ZXM+IAorICAgIHN0cnVjdCBfQnVpbGRfaW5kZXhfdHVwbGU8X051bSwgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiA+CisgICAgOiBfQnVpbGRfaW5kZXhfdHVwbGU8X051bSAtIDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLiwgc2l6ZW9mLi4uKF9JbmRleGVzKT4gPgorICAgIHsKKyAgICB9OworCisgIHRlbXBsYXRlPGludC4uLiBfSW5kZXhlcz4KKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlPDAsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiBfX3R5cGU7CisgICAgfTsKKworICAvKiogCisgICAqIFVzZWQgYnkgX1NhZmVfdHVwbGVfZWxlbWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHR1cGxlCisgICAqIGVsZW1lbnQgYXQgdGhpcyBwb3NpdGlvbi4KKyAgICovCisgIHN0cnVjdCBfTm9fdHVwbGVfZWxlbWVudDsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gaGVscGVyIGZvciBfU2FmZV90dXBsZV9lbGVtZW50LiBUaGlzIHByaW1hcnkKKyAgICogdGVtcGxhdGUgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcyBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUgX1R1cGxlLCBib29sIF9Jc1NhZmU+CisgICAgc3RydWN0IF9TYWZlX3R1cGxlX2VsZW1lbnRfaW1wbAorICAgIDogdHVwbGVfZWxlbWVudDxfX2ksIF9UdXBsZT4geyB9OworCisgIC8qKgorICAgKiBJbXBsZW1lbnRhdGlvbiBoZWxwZXIgZm9yIF9TYWZlX3R1cGxlX2VsZW1lbnQuIFRoaXMgcGFydGlhbAorICAgKiBzcGVjaWFsaXphdGlvbiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBzYWZlIHRvIHVzZSBAYworICAgKiB0dXBsZV9lbGVtZW50LiBXZSBqdXN0IHJldHVybiBAYyBfTm9fdHVwbGVfZWxlbWVudC4KKyAgICovCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lIF9UdXBsZT4KKyAgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudF9pbXBsPF9faSwgX1R1cGxlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9Ob190dXBsZV9lbGVtZW50IHR5cGU7CisgICAgfTsKKworICAvKioKKyAgICogTGlrZSB0dXBsZV9lbGVtZW50LCBidXQgcmV0dXJucyBAYyBfTm9fdHVwbGVfZWxlbWVudCB3aGVuCisgICAqIHR1cGxlX2VsZW1lbnQgd291bGQgcmV0dXJuIGFuIGVycm9yLgorICAgKi8KKyB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHVwbGU+CisgICBzdHJ1Y3QgX1NhZmVfdHVwbGVfZWxlbWVudAorICAgOiBfU2FmZV90dXBsZV9lbGVtZW50X2ltcGw8X19pLCBfVHVwbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9faSA+PSAwICYmIF9faSA8IHR1cGxlX3NpemU8X1R1cGxlPjo6dmFsdWUpPgorICAgeworICAgfTsKKworICAvKioKKyAgICogIE1hcHMgYW4gYXJndW1lbnQgdG8gYmluZCgpIGludG8gYW4gYWN0dWFsIGFyZ3VtZW50IHRvIHRoZSBib3VuZAorICAgKiAgZnVuY3Rpb24gb2JqZWN0IFtUUjEgMy42LjMvNV0uIE9ubHkgdGhlIGZpcnN0IHBhcmFtZXRlciBzaG91bGQKKyAgICogIGJlIHNwZWNpZmllZDogdGhlIHJlc3QgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFtb25nIHRoZSB2YXJpb3VzCisgICAqICBpbXBsZW1lbnRhdGlvbnMuIE5vdGUgdGhhdCwgYWx0aG91Z2ggdGhpcyBjbGFzcyBpcyBhIGZ1bmN0aW9uCisgICAqICBvYmplY3QsIGl0IGlzbid0IGVudGlyZWx5IG5vcm1hbCBiZWNhdXNlIGl0IHRha2VzIG9ubHkgdHdvCisgICAqICBwYXJhbWV0ZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKKyAgICogIGJpbmQgZXhwcmVzc2lvbi4gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgYm91bmQgYXJndW1lbnQgYW5kCisgICAqICB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byB0aGUKKyAgICogIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9BcmcsCisgICAgICAgICAgIGJvb2wgX0lzQmluZEV4cCA9IGlzX2JpbmRfZXhwcmVzc2lvbjxfQXJnPjo6dmFsdWUsCisgICAgICAgICAgIGJvb2wgX0lzUGxhY2Vob2xkZXIgPSAoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlID4gMCk+CisgICAgY2xhc3MgX011OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIHJlZmVyZW5jZV93cmFwcGVyPF9UcD4sIHJldHVybnMgdGhlCisgICAqICB1bmRlcmx5aW5nIHJlZmVyZW5jZS4gW1RSMSAzLjYuMy81IGJ1bGxldCAxXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9NdTxyZWZlcmVuY2Vfd3JhcHBlcjxfVHA+LCBmYWxzZSwgZmFsc2U+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1RwJiByZXN1bHRfdHlwZTsKKworICAgICAgLyogTm90ZTogVGhpcyB3b24ndCBhY3R1YWxseSB3b3JrIGZvciBjb25zdCB2b2xhdGlsZQorICAgICAgICogcmVmZXJlbmNlX3dyYXBwZXJzLCBiZWNhdXNlIHJlZmVyZW5jZV93cmFwcGVyOjpnZXQoKSBpcyBjb25zdAorICAgICAgICogYnV0IG5vdCB2b2xhdGlsZS1xdWFsaWZpZWQuIFRoaXMgbWlnaHQgYmUgYSBkZWZlY3QgaW4gdGhlIFRSLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZSZWYsIHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQ1ZSZWYmIF9fYXJnLCBjb25zdCBfVHVwbGUmKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7IHJldHVybiBfX2FyZy5nZXQoKTsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBJZiB0aGUgYXJndW1lbnQgaXMgYSBiaW5kIGV4cHJlc3Npb24sIHdlIGludm9rZSB0aGUgdW5kZXJseWluZworICAgKiAgZnVuY3Rpb24gb2JqZWN0IHdpdGggdGhlIHNhbWUgY3YtcXVhbGlmaWVycyBhcyB3ZSBhcmUgZ2l2ZW4gYW5kCisgICAqICBwYXNzIGFsb25nIGFsbCBvZiBvdXIgYXJndW1lbnRzICh1bndyYXBwZWQpLiBbVFIxIDMuNi4zLzUgYnVsbGV0IDJdCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQXJnPgorICAgIGNsYXNzIF9NdTxfQXJnLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4gY2xhc3MgcmVzdWx0OworCisgICAgICAvLyBEZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIHdoZW4gd2UgcGFzcyB0aGUgYXJndW1lbnRzIGFsb25nLiBUaGlzCisgICAgICAvLyBpbnZvbHZlcyBwYXNzaW5nIGFsb25nIHRoZSBjdi1xdWFsaWZpZXJzIHBsYWNlZCBvbiBfTXUgYW5kCisgICAgICAvLyB1bndyYXBwaW5nIHRoZSBhcmd1bWVudCBidW5kbGUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNdSwgdHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgY2xhc3MgcmVzdWx0PF9DVk11KF9DVkFyZywgdHVwbGU8X0FyZ3MuLi4+KT4KKwk6IHB1YmxpYyByZXN1bHRfb2Y8X0NWQXJnKF9BcmdzLi4uKT4geyB9OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0NWQXJnKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQ1ZBcmcmIF9fYXJnLAorCQkgICBjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fdHVwbGUpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKwkgIC8vIENvbnN0cnVjdCBhbiBpbmRleCB0dXBsZSBhbmQgZm9yd2FyZCB0byBfX2NhbGwKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX0J1aWxkX2luZGV4X3R1cGxlPHNpemVvZi4uLihfQXJncyk+OjpfX3R5cGUKKwkgICAgX0luZGV4ZXM7CisJICByZXR1cm4gdGhpcy0+X19jYWxsKF9fYXJnLCBfX3R1cGxlLCBfSW5kZXhlcygpKTsKKwl9CisKKyAgICBwcml2YXRlOgorICAgICAgLy8gSW52b2tlcyB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgX19hcmcgYnkgdW5wYWNraW5nIGFsbAorICAgICAgLy8gb2YgdGhlIGFyZ3VtZW50cyBpbiB0aGUgdHVwbGUuIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8X0NWQXJnKF9BcmdzLi4uKT46OnR5cGUKKyAgICAgICAgX19jYWxsKF9DVkFyZyYgX19hcmcsIGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX190dXBsZSwKKwkgICAgICAgY29uc3QgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiYpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKwkgIHJldHVybiBfX2FyZyh0cjE6OmdldDxfSW5kZXhlcz4oX190dXBsZSkuLi4pOworCX0KKyAgICB9OworCisgIC8qKgorICAgKiAgSWYgdGhlIGFyZ3VtZW50IGlzIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBOdGggYXJndW1lbnQsIHJldHVybnMKKyAgICogIGEgcmVmZXJlbmNlIHRvIHRoZSBOdGggYXJndW1lbnQgdG8gdGhlIGJpbmQgZnVuY3Rpb24gb2JqZWN0LgorICAgKiAgW1RSMSAzLjYuMy81IGJ1bGxldCAzXQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgZmFsc2UsIHRydWU+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+IGNsYXNzIHJlc3VsdDsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NWTXUsIHR5cGVuYW1lIF9DVkFyZywgdHlwZW5hbWUgX1R1cGxlPgorICAgICAgICBjbGFzcyByZXN1bHQ8X0NWTXUoX0NWQXJnLCBfVHVwbGUpPgorICAgICAgICB7CisJICAvLyBBZGQgYSByZWZlcmVuY2UsIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZG9uZSBmb3IgdXMuCisJICAvLyBUaGlzIGFsbG93cyB1cyB0byBiZSBhIGxpdHRsZSBiaXQgc2xvcHB5IGluIGNvbnN0cnVjdGluZworCSAgLy8gdGhlIHR1cGxlIHRoYXQgd2UgcGFzcyB0byByZXN1bHRfb2Y8Li4uPi4KKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1NhZmVfdHVwbGVfZWxlbWVudDwoaXNfcGxhY2Vob2xkZXI8X0FyZz46OnZhbHVlCisJCQkJCQktIDEpLCBfVHVwbGU+Ojp0eXBlCisJICAgIF9fYmFzZV90eXBlOworCisJcHVibGljOgorCSAgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcmVmZXJlbmNlPF9fYmFzZV90eXBlPjo6dHlwZSB0eXBlOworCX07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0PF9NdShfQXJnLCBfVHVwbGUpPjo6dHlwZQorICAgICAgICBvcGVyYXRvcigpKGNvbnN0IHZvbGF0aWxlIF9BcmcmLCBjb25zdCBfVHVwbGUmIF9fdHVwbGUpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKwkgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8KGlzX3BsYWNlaG9sZGVyPF9Bcmc+Ojp2YWx1ZSAtIDEpPihfX3R1cGxlKTsKKwl9CisgICAgfTsKKworICAvKioKKyAgICogIElmIHRoZSBhcmd1bWVudCBpcyBqdXN0IGEgdmFsdWUsIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhhdAorICAgKiAgdmFsdWUuIFRoZSBjdi1xdWFsaWZpZXJzIG9uIHRoZSByZWZlcmVuY2UgYXJlIHRoZSBzYW1lIGFzIHRoZQorICAgKiAgY3YtcXVhbGlmaWVycyBvbiB0aGUgX011IG9iamVjdC4gW1RSMSAzLjYuMy81IGJ1bGxldCA0XQorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfTXU8X0FyZywgZmFsc2UsIGZhbHNlPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPiBzdHJ1Y3QgcmVzdWx0OworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZNdSwgdHlwZW5hbWUgX0NWQXJnLCB0eXBlbmFtZSBfVHVwbGU+CisgICAgICAgIHN0cnVjdCByZXN1bHQ8X0NWTXUoX0NWQXJnLCBfVHVwbGUpPgorICAgICAgICB7CisJICB0eXBlZGVmIHR5cGVuYW1lIGFkZF9yZWZlcmVuY2U8X0NWQXJnPjo6dHlwZSB0eXBlOworCX07CisKKyAgICAgIC8vIFBpY2sgdXAgdGhlIGN2LXF1YWxpZmllcnMgb2YgdGhlIGFyZ3VtZW50CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ1ZBcmcsIHR5cGVuYW1lIF9UdXBsZT4KKyAgICAgICAgX0NWQXJnJgorICAgICAgICBvcGVyYXRvcigpKF9DVkFyZyYgX19hcmcsIGNvbnN0IF9UdXBsZSYpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsgcmV0dXJuIF9fYXJnOyB9CisgICAgfTsKKworICAvKioKKyAgICogIE1hcHMgbWVtYmVyIHBvaW50ZXJzIGludG8gaW5zdGFuY2VzIG9mIF9NZW1fZm4gYnV0IGxlYXZlcyBhbGwKKyAgICogIG90aGVyIGZ1bmN0aW9uIG9iamVjdHMgdW50b3VjaGVkLiBVc2VkIGJ5IHRyMTo6YmluZCgpLiBUaGUKKyAgICogIHByaW1hcnkgdGVtcGxhdGUgaGFuZGxlcyB0aGUgbm9uLS1tZW1iZXItcG9pbnRlciBjYXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwIHR5cGU7CisgICAgICAKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAmCisgICAgICBfX2RvX3dyYXAoY29uc3QgX1RwJiBfX3gpCisgICAgICB7IHJldHVybiBfX3g7IH0KKyAgICB9OworCisgIC8qKgorICAgKiAgTWFwcyBtZW1iZXIgcG9pbnRlcnMgaW50byBpbnN0YW5jZXMgb2YgX01lbV9mbiBidXQgbGVhdmVzIGFsbAorICAgKiAgb3RoZXIgZnVuY3Rpb24gb2JqZWN0cyB1bnRvdWNoZWQuIFVzZWQgYnkgdHIxOjpiaW5kKCkuIFRoaXMKKyAgICogIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaGFuZGxlcyB0aGUgbWVtYmVyIHBvaW50ZXIgY2FzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0NsYXNzPgorICAgIHN0cnVjdCBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfVHAgX0NsYXNzOjoqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX01lbV9mbjxfVHAgX0NsYXNzOjoqPiB0eXBlOworICAgICAgCisgICAgICBzdGF0aWMgdHlwZQorICAgICAgX19kb193cmFwKF9UcCBfQ2xhc3M6OiogX19wbSkKKyAgICAgIHsgcmV0dXJuIHR5cGUoX19wbSk7IH0KKyAgICB9OworCisgIC8vLyBUeXBlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBiaW5kKCkuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IF9CaW5kOworCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0JvdW5kX2FyZ3M+CisgICAgY2xhc3MgX0JpbmQ8X0Z1bmN0b3IoX0JvdW5kX2FyZ3MuLi4pPgorICAgIDogcHVibGljIF9XZWFrX3Jlc3VsdF90eXBlPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmQgX19zZWxmX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0JvdW5kX2FyZ3MpPjo6X190eXBlIAorICAgICAgICBfQm91bmRfaW5kZXhlczsKKworICAgICAgX0Z1bmN0b3IgX01fZjsKKyAgICAgIHR1cGxlPF9Cb3VuZF9hcmdzLi4uPiBfTV9ib3VuZF9hcmdzOworCisgICAgICAvLyBDYWxsIHVucXVhbGlmaWVkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pPjo6dHlwZS4uLikKKyAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgY29uc3QgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlLi4uKT46OnR5cGUKKyAgICAgICAgX19jYWxsKGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX19hcmdzLCBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIF9Cb3VuZF9hcmdzLCB0dXBsZTxfQXJncy4uLj4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZS4uLik+Ojp0eXBlCisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdCB2b2xhdGlsZQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvbGF0aWxlIF9Cb3VuZF9hcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxfQXJncy4uLj4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZS4uLik+Ojp0eXBlCisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBfQmluZChfRnVuY3RvciBfX2YsIF9Cb3VuZF9hcmdzLi4uIF9fYm91bmRfYXJncykKKyAgICAgICAgOiBfTV9mKF9fZiksIF9NX2JvdW5kX2FyZ3MoX19ib3VuZF9hcmdzLi4uKSB7IH0KKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPik+Ojp0eXBlLi4uKQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmLi4uIF9fYXJncykKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0aGlzLT5fX2NhbGwodHIxOjp0aWUoX19hcmdzLi4uKSwgX0JvdW5kX2luZGV4ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgLy8gQ2FsbCBhcyBjb25zdAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICAgIHR5cGVuYW1lIHJlc3VsdF9vZjwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBfRnVuY3Rvcih0eXBlbmFtZSByZXN1bHRfb2Y8X011PF9Cb3VuZF9hcmdzPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgX0JvdW5kX2FyZ3MsIHR1cGxlPF9BcmdzLi4uPik+Ojp0eXBlLi4uKQorICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX0FyZ3MmLi4uIF9fYXJncykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiB0aGlzLT5fX2NhbGwodHIxOjp0aWUoX19hcmdzLi4uKSwgX0JvdW5kX2luZGV4ZXMoKSk7CisgICAgICAgIH0KKworCisgICAgICAvLyBDYWxsIGFzIHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncz4KKyAgICAgICAgdHlwZW5hbWUgcmVzdWx0X29mPAorICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIF9GdW5jdG9yKHR5cGVuYW1lIHJlc3VsdF9vZjxfTXU8X0JvdW5kX2FyZ3M+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSBfQm91bmRfYXJncywgdHVwbGU8X0FyZ3MuLi4+KT46OnR5cGUuLi4pCisgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorCisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2Y8CisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9sYXRpbGUgX0Z1bmN0b3IodHlwZW5hbWUgcmVzdWx0X29mPF9NdTxfQm91bmRfYXJncz4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvbGF0aWxlIF9Cb3VuZF9hcmdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8X0FyZ3MuLi4+KT46OnR5cGUuLi4pCisgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfQXJncyYuLi4gX19hcmdzKSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIHRoaXMtPl9fY2FsbCh0cjE6OnRpZShfX2FyZ3MuLi4pLCBfQm91bmRfaW5kZXhlcygpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgLy8vIFR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCByZXR1cm5lZCBmcm9tIGJpbmQ8Uj4oKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBzdHJ1Y3QgX0JpbmRfcmVzdWx0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQm91bmRfYXJncz4KKyAgICBjbGFzcyBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX0Z1bmN0b3IoX0JvdW5kX2FyZ3MuLi4pPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0JpbmRfcmVzdWx0IF9fc2VsZl90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8c2l6ZW9mLi4uKF9Cb3VuZF9hcmdzKT46Ol9fdHlwZSAKKyAgICAgICAgX0JvdW5kX2luZGV4ZXM7CisKKyAgICAgIF9GdW5jdG9yIF9NX2Y7CisgICAgICB0dXBsZTxfQm91bmRfYXJncy4uLj4gX01fYm91bmRfYXJnczsKKworICAgICAgLy8gQ2FsbCB1bnF1YWxpZmllZAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0FyZ3MsIGludC4uLiBfSW5kZXhlcz4KKyAgICAgICAgX1Jlc3VsdAorICAgICAgICBfX2NhbGwoY29uc3QgdHVwbGU8X0FyZ3MuLi4+JiBfX2FyZ3MsIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICBfUmVzdWx0CisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBfTV9mKF9NdTxfQm91bmRfYXJncz4oKQorICAgICAgICAgICAgICAgICAgICAgICh0cjE6OmdldDxfSW5kZXhlcz4oX01fYm91bmRfYXJncyksIF9fYXJncykuLi4pOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisgICAgICAgIF9SZXN1bHQKKyAgICAgICAgX19jYWxsKGNvbnN0IHR1cGxlPF9BcmdzLi4uPiYgX19hcmdzLCAKKyAgICAgICAgICAgICAgIF9JbmRleF90dXBsZTxfSW5kZXhlcy4uLj4pIHZvbGF0aWxlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gX01fZihfTXU8X0JvdW5kX2FyZ3M+KCkKKyAgICAgICAgICAgICAgICAgICAgICAodHIxOjpnZXQ8X0luZGV4ZXM+KF9NX2JvdW5kX2FyZ3MpLCBfX2FyZ3MpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAvLyBDYWxsIGFzIGNvbnN0IHZvbGF0aWxlCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfQXJncywgaW50Li4uIF9JbmRleGVzPgorICAgICAgICBfUmVzdWx0CisgICAgICAgIF9fY2FsbChjb25zdCB0dXBsZTxfQXJncy4uLj4mIF9fYXJncywgCisgICAgICAgICAgICAgICBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4+KSBjb25zdCB2b2xhdGlsZQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIF9NX2YoX011PF9Cb3VuZF9hcmdzPigpCisgICAgICAgICAgICAgICAgICAgICAgKHRyMTo6Z2V0PF9JbmRleGVzPihfTV9ib3VuZF9hcmdzKSwgX19hcmdzKS4uLik7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9CaW5kX3Jlc3VsdChfRnVuY3RvciBfX2YsIF9Cb3VuZF9hcmdzLi4uIF9fYm91bmRfYXJncykKKyAgICAgIDogX01fZihfX2YpLCBfTV9ib3VuZF9hcmdzKF9fYm91bmRfYXJncy4uLikgeyB9CisKKyAgICAgIC8vIENhbGwgdW5xdWFsaWZpZWQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3QKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIHZvbGF0aWxlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisKKyAgICAgIC8vIENhbGwgYXMgY29uc3Qgdm9sYXRpbGUKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9BcmdzPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9BcmdzJi4uLiBfX2FyZ3MpIGNvbnN0IHZvbGF0aWxlCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gdGhpcy0+X19jYWxsKHRyMTo6dGllKF9fYXJncy4uLiksIF9Cb3VuZF9pbmRleGVzKCkpOworICAgICAgICB9CisgICAgfTsKKworICAvLy8gQ2xhc3MgdGVtcGxhdGUgX0JpbmQgaXMgYWx3YXlzIGEgYmluZCBleHByZXNzaW9uLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIHN0cnVjdCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmQ8X1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmQ8X1NpZ25hdHVyZT4gPjo6dmFsdWU7CisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIF9CaW5kX3Jlc3VsdCBpcyBhbHdheXMgYSBiaW5kIGV4cHJlc3Npb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgc3RydWN0IGlzX2JpbmRfZXhwcmVzc2lvbjxfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX1NpZ25hdHVyZT4gPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXN1bHQsIHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY29uc3QgYm9vbCBpc19iaW5kX2V4cHJlc3Npb248X0JpbmRfcmVzdWx0PF9SZXN1bHQsIF9TaWduYXR1cmU+ID46OnZhbHVlOworCisgIC8vLyBiaW5kCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgaW5saW5lCisgICAgX0JpbmQ8dHlwZW5hbWUgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+Ojp0eXBlKF9BcmdUeXBlcy4uLik+CisgICAgYmluZChfRnVuY3RvciBfX2YsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiBfTWF5YmVfd3JhcF9tZW1iZXJfcG9pbnRlcjxfRnVuY3Rvcj4gX19tYXliZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21heWJlX3R5cGU6OnR5cGUgX19mdW5jdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaW5kPF9fZnVuY3Rvcl90eXBlKF9BcmdUeXBlcy4uLik+IF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX21heWJlX3R5cGU6Ol9fZG9fd3JhcChfX2YpLCBfX2FyZ3MuLi4pOworICAgIH0gCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1Jlc3VsdCwgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBpbmxpbmUKKyAgICBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwKKwkJIHR5cGVuYW1lIF9NYXliZV93cmFwX21lbWJlcl9wb2ludGVyPF9GdW5jdG9yPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfQXJnVHlwZXMuLi4pPgorICAgIGJpbmQoX0Z1bmN0b3IgX19mLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgX01heWJlX3dyYXBfbWVtYmVyX3BvaW50ZXI8X0Z1bmN0b3I+IF9fbWF5YmVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19tYXliZV90eXBlOjp0eXBlIF9fZnVuY3Rvcl90eXBlOworICAgICAgdHlwZWRlZiBfQmluZF9yZXN1bHQ8X1Jlc3VsdCwgX19mdW5jdG9yX3R5cGUoX0FyZ1R5cGVzLi4uKT4KKwlfX3Jlc3VsdF90eXBlOworICAgICAgcmV0dXJuIF9fcmVzdWx0X3R5cGUoX19tYXliZV90eXBlOjpfX2RvX3dyYXAoX19mKSwgX19hcmdzLi4uKTsKKyAgICB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgRXhjZXB0aW9uIGNsYXNzIHRocm93biB3aGVuIGNsYXNzIHRlbXBsYXRlIGZ1bmN0aW9uJ3MKKyAgICogIG9wZXJhdG9yKCkgaXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgdGFyZ2V0LgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKi8KKyAgY2xhc3MgYmFkX2Z1bmN0aW9uX2NhbGwgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24geyB9OworCisgIC8qKgorICAgKiAgVGhlIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24gMCBjYW4gYmUgY29udmVydGVkIGludG8gYQorICAgKiAgcG9pbnRlciB0byB0aGlzIHR5cGUuIEl0IGlzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIHRvCisgICAqICBhY2NlcHQgTlVMTCBwb2ludGVycy4KKyAgICovCisgIHN0cnVjdCBfTV9jbGVhcl90eXBlOworCisgIC8qKgorICAgKiAgVHJhaXQgaWRlbnRpZnlpbmcgQGEgbG9jYXRpb24taW52YXJpYW50IHR5cGVzLCBtZWFuaW5nIHRoYXQgdGhlCisgICAqICBhZGRyZXNzIG9mIHRoZSBvYmplY3QgKG9yIGFueSBvZiBpdHMgbWVtYmVycykgd2lsbCBub3QgZXNjYXBlLgorICAgKiAgQWxzbyBpbXBsaWVzIGEgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX2xvY2F0aW9uX2ludmFyaWFudAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19wb2ludGVyPF9UcD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUpPgorICAgIHsKKyAgICB9OworCisgIGNsYXNzIF9VbmRlZmluZWRfY2xhc3M7CisKKyAgdW5pb24gX05vY29weV90eXBlcworICB7CisgICAgdm9pZCogICAgICAgX01fb2JqZWN0OworICAgIGNvbnN0IHZvaWQqIF9NX2NvbnN0X29iamVjdDsKKyAgICB2b2lkICgqX01fZnVuY3Rpb25fcG9pbnRlcikoKTsKKyAgICB2b2lkIChfVW5kZWZpbmVkX2NsYXNzOjoqX01fbWVtYmVyX3BvaW50ZXIpKCk7CisgIH07CisKKyAgdW5pb24gX0FueV9kYXRhCisgIHsKKyAgICB2b2lkKiAgICAgICBfTV9hY2Nlc3MoKSAgICAgICB7IHJldHVybiAmX01fcG9kX2RhdGFbMF07IH0KKyAgICBjb25zdCB2b2lkKiBfTV9hY2Nlc3MoKSBjb25zdCB7IHJldHVybiAmX01fcG9kX2RhdGFbMF07IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgIF9UcCYKKyAgICAgIF9NX2FjY2VzcygpCisgICAgICB7IHJldHVybiAqc3RhdGljX2Nhc3Q8X1RwKj4oX01fYWNjZXNzKCkpOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBjb25zdCBfVHAmCisgICAgICBfTV9hY2Nlc3MoKSBjb25zdAorICAgICAgeyByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IF9UcCo+KF9NX2FjY2VzcygpKTsgfQorCisgICAgX05vY29weV90eXBlcyBfTV91bnVzZWQ7CisgICAgY2hhciBfTV9wb2RfZGF0YVtzaXplb2YoX05vY29weV90eXBlcyldOworICB9OworCisgIGVudW0gX01hbmFnZXJfb3BlcmF0aW9uCisgIHsKKyAgICBfX2dldF90eXBlX2luZm8sCisgICAgX19nZXRfZnVuY3Rvcl9wdHIsCisgICAgX19jbG9uZV9mdW5jdG9yLAorICAgIF9fZGVzdHJveV9mdW5jdG9yCisgIH07CisKKyAgLy8gU2ltcGxlIHR5cGUgd3JhcHBlciB0aGF0IGhlbHBzIGF2b2lkIGFubm95aW5nIGNvbnN0IHByb2JsZW1zCisgIC8vIHdoZW4gY2FzdGluZyBiZXR3ZWVuIHZvaWQgcG9pbnRlcnMgYW5kIHBvaW50ZXJzLXRvLXBvaW50ZXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9TaW1wbGVfdHlwZV93cmFwcGVyCisgICAgeworICAgICAgX1NpbXBsZV90eXBlX3dyYXBwZXIoX1RwIF9fdmFsdWUpIDogX192YWx1ZShfX3ZhbHVlKSB7IH0KKworICAgICAgX1RwIF9fdmFsdWU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbG9jYXRpb25faW52YXJpYW50PF9TaW1wbGVfdHlwZV93cmFwcGVyPF9UcD4gPgorICAgIDogX19pc19sb2NhdGlvbl9pbnZhcmlhbnQ8X1RwPgorICAgIHsKKyAgICB9OworCisgIC8vIENvbnZlcnRzIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0IGludG8gYSBjYWxsYWJsZQorICAvLyBmdW5jdGlvbiBvYmplY3QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgIGlubGluZSBfRnVuY3RvciYKKyAgICBfX2NhbGxhYmxlX2Z1bmN0b3IoX0Z1bmN0b3ImIF9fZikKKyAgICB7IHJldHVybiBfX2Y7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X01lbWJlciBfQ2xhc3M6Oio+CisgICAgX19jYWxsYWJsZV9mdW5jdG9yKF9NZW1iZXIgX0NsYXNzOjoqICZfX3ApCisgICAgeyByZXR1cm4gbWVtX2ZuKF9fcCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtYmVyLCB0eXBlbmFtZSBfQ2xhc3M+CisgICAgaW5saW5lIF9NZW1fZm48X01lbWJlciBfQ2xhc3M6Oio+CisgICAgX19jYWxsYWJsZV9mdW5jdG9yKF9NZW1iZXIgX0NsYXNzOjoqIGNvbnN0ICZfX3ApCisgICAgeyByZXR1cm4gbWVtX2ZuKF9fcCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGNsYXNzIGZ1bmN0aW9uOworCisgIC8vLyBCYXNlIGNsYXNzIG9mIGFsbCBwb2x5bW9ycGhpYyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMuCisgIGNsYXNzIF9GdW5jdGlvbl9iYXNlCisgIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBfTV9tYXhfc2l6ZSA9IHNpemVvZihfTm9jb3B5X3R5cGVzKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgX01fbWF4X2FsaWduID0gX19hbGlnbm9mX18oX05vY29weV90eXBlcyk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIGNsYXNzIF9CYXNlX21hbmFnZXIKKyAgICAgIHsKKyAgICAgIHByb3RlY3RlZDoKKwlzdGF0aWMgY29uc3QgYm9vbCBfX3N0b3JlZF9sb2NhbGx5ID0KKyAgICAgICAgKF9faXNfbG9jYXRpb25faW52YXJpYW50PF9GdW5jdG9yPjo6dmFsdWUKKyAgICAgICAgICYmIHNpemVvZihfRnVuY3RvcikgPD0gX01fbWF4X3NpemUKKyAgICAgICAgICYmIF9fYWxpZ25vZl9fKF9GdW5jdG9yKSA8PSBfTV9tYXhfYWxpZ24KKyAgICAgICAgICYmIChfTV9tYXhfYWxpZ24gJSBfX2FsaWdub2ZfXyhfRnVuY3RvcikgPT0gMCkpOworCQorCXR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19zdG9yZWRfbG9jYWxseT4gX0xvY2FsX3N0b3JhZ2U7CisKKwkvLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG9iamVjdAorCXN0YXRpYyBfRnVuY3RvcioKKwlfTV9nZXRfcG9pbnRlcihjb25zdCBfQW55X2RhdGEmIF9fc291cmNlKQorCXsKKwkgIGNvbnN0IF9GdW5jdG9yKiBfX3B0ciA9CisJICAgIF9fc3RvcmVkX2xvY2FsbHk/ICZfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3I+KCkKKwkgICAgLyogaGF2ZSBzdG9yZWQgYSBwb2ludGVyICovIDogX19zb3VyY2UuX01fYWNjZXNzPF9GdW5jdG9yKj4oKTsKKwkgIHJldHVybiBjb25zdF9jYXN0PF9GdW5jdG9yKj4oX19wdHIpOworCX0KKworCS8vIENsb25lIGEgbG9jYXRpb24taW52YXJpYW50IGZ1bmN0aW9uIG9iamVjdCB0aGF0IGZpdHMgd2l0aGluCisJLy8gYW4gX0FueV9kYXRhIHN0cnVjdHVyZS4KKwlzdGF0aWMgdm9pZAorCV9NX2Nsb25lKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLCB0cnVlX3R5cGUpCisJeworCSAgbmV3IChfX2Rlc3QuX01fYWNjZXNzKCkpIF9GdW5jdG9yKF9fc291cmNlLl9NX2FjY2VzczxfRnVuY3Rvcj4oKSk7CisJfQorCisJLy8gQ2xvbmUgYSBmdW5jdGlvbiBvYmplY3QgdGhhdCBpcyBub3QgbG9jYXRpb24taW52YXJpYW50IG9yCisJLy8gdGhhdCBjYW5ub3QgZml0IGludG8gYW4gX0FueV9kYXRhIHN0cnVjdHVyZS4KKwlzdGF0aWMgdm9pZAorCV9NX2Nsb25lKF9BbnlfZGF0YSYgX19kZXN0LCBjb25zdCBfQW55X2RhdGEmIF9fc291cmNlLCBmYWxzZV90eXBlKQorCXsKKwkgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0KKwkgICAgbmV3IF9GdW5jdG9yKCpfX3NvdXJjZS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpKTsKKwl9CisKKwkvLyBEZXN0cm95aW5nIGEgbG9jYXRpb24taW52YXJpYW50IG9iamVjdCBtYXkgc3RpbGwgcmVxdWlyZQorCS8vIGRlc3RydWN0aW9uLgorCXN0YXRpYyB2b2lkCisJX01fZGVzdHJveShfQW55X2RhdGEmIF9fdmljdGltLCB0cnVlX3R5cGUpCisJeworCSAgX192aWN0aW0uX01fYWNjZXNzPF9GdW5jdG9yPigpLn5fRnVuY3RvcigpOworCX0KKwkKKwkvLyBEZXN0cm95aW5nIGFuIG9iamVjdCBsb2NhdGVkIG9uIHRoZSBoZWFwLgorCXN0YXRpYyB2b2lkCisJX01fZGVzdHJveShfQW55X2RhdGEmIF9fdmljdGltLCBmYWxzZV90eXBlKQorCXsKKwkgIGRlbGV0ZSBfX3ZpY3RpbS5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpOworCX0KKwkKKyAgICAgIHB1YmxpYzoKKwlzdGF0aWMgYm9vbAorCV9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisJCSAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorCXsKKwkgIHN3aXRjaCAoX19vcCkKKwkgICAgeworI2lmZGVmIF9fR1hYX1JUVEkKKwkgICAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgICAgX19kZXN0Ll9NX2FjY2Vzczxjb25zdCB0eXBlX2luZm8qPigpID0gJnR5cGVpZChfRnVuY3Rvcik7CisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgICAgY2FzZSBfX2dldF9mdW5jdG9yX3B0cjoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IF9NX2dldF9wb2ludGVyKF9fc291cmNlKTsKKwkgICAgICBicmVhazsKKwkgICAgICAKKwkgICAgY2FzZSBfX2Nsb25lX2Z1bmN0b3I6CisJICAgICAgX01fY2xvbmUoX19kZXN0LCBfX3NvdXJjZSwgX0xvY2FsX3N0b3JhZ2UoKSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBfX2Rlc3Ryb3lfZnVuY3RvcjoKKwkgICAgICBfTV9kZXN0cm95KF9fZGVzdCwgX0xvY2FsX3N0b3JhZ2UoKSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgY29uc3QgX0Z1bmN0b3ImIF9fZikKKwl7IF9NX2luaXRfZnVuY3RvcihfX2Z1bmN0b3IsIF9fZiwgX0xvY2FsX3N0b3JhZ2UoKSk7IH0KKwkKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mKQorICAgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKwkgIHN0YXRpYyBib29sCisJICBfTV9ub3RfZW1wdHlfZnVuY3Rpb24oY29uc3QgX1RwKiYgX19mcCkKKwkgIHsgcmV0dXJuIF9fZnA7IH0KKworCXRlbXBsYXRlPHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihfVHAgX0NsYXNzOjoqIGNvbnN0JiBfX21wKQorCSAgeyByZXR1cm4gX19tcDsgfQorCisJdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCSAgc3RhdGljIGJvb2wKKwkgIF9NX25vdF9lbXB0eV9mdW5jdGlvbihjb25zdCBfVHAmKQorCSAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICBwcml2YXRlOgorCXN0YXRpYyB2b2lkCisJX01faW5pdF9mdW5jdG9yKF9BbnlfZGF0YSYgX19mdW5jdG9yLCBjb25zdCBfRnVuY3RvciYgX19mLCB0cnVlX3R5cGUpCisJeyBuZXcgKF9fZnVuY3Rvci5fTV9hY2Nlc3MoKSkgX0Z1bmN0b3IoX19mKTsgfQorCisJc3RhdGljIHZvaWQKKwlfTV9pbml0X2Z1bmN0b3IoX0FueV9kYXRhJiBfX2Z1bmN0b3IsIGNvbnN0IF9GdW5jdG9yJiBfX2YsIGZhbHNlX3R5cGUpCisJeyBfX2Z1bmN0b3IuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9IG5ldyBfRnVuY3RvcihfX2YpOyB9CisgICAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBjbGFzcyBfUmVmX21hbmFnZXIgOiBwdWJsaWMgX0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+CisgICAgICB7CisJdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcio+IF9CYXNlOworCisgICAgcHVibGljOgorCXN0YXRpYyBib29sCisJX01fbWFuYWdlcihfQW55X2RhdGEmIF9fZGVzdCwgY29uc3QgX0FueV9kYXRhJiBfX3NvdXJjZSwKKwkJICAgX01hbmFnZXJfb3BlcmF0aW9uIF9fb3ApCisJeworCSAgc3dpdGNoIChfX29wKQorCSAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgICBjYXNlIF9fZ2V0X3R5cGVfaW5mbzoKKwkgICAgICBfX2Rlc3QuX01fYWNjZXNzPGNvbnN0IHR5cGVfaW5mbyo+KCkgPSAmdHlwZWlkKF9GdW5jdG9yKTsKKwkgICAgICBicmVhazsKKyNlbmRpZgorCSAgICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICAgIF9fZGVzdC5fTV9hY2Nlc3M8X0Z1bmN0b3IqPigpID0gKl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSk7CisJICAgICAgcmV0dXJuIGlzX2NvbnN0PF9GdW5jdG9yPjo6dmFsdWU7CisJICAgICAgYnJlYWs7CisJICAgICAgCisJICAgIGRlZmF1bHQ6CisJICAgICAgX0Jhc2U6Ol9NX21hbmFnZXIoX19kZXN0LCBfX3NvdXJjZSwgX19vcCk7CisJICAgIH0KKwkgIHJldHVybiBmYWxzZTsKKwl9CisKKwlzdGF0aWMgdm9pZAorCV9NX2luaXRfZnVuY3RvcihfQW55X2RhdGEmIF9fZnVuY3RvciwgcmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+IF9fZikKKwl7CisJICAvLyBUQkQ6IFVzZSBhZGRyZXNzX29mIGZ1bmN0aW9uIGluc3RlYWQuCisJICBfQmFzZTo6X01faW5pdF9mdW5jdG9yKF9fZnVuY3RvciwgJl9fZi5nZXQoKSk7CisJfQorICAgICAgfTsKKworICAgIF9GdW5jdGlvbl9iYXNlKCkgOiBfTV9tYW5hZ2VyKDApIHsgfQorICAgIAorICAgIH5fRnVuY3Rpb25fYmFzZSgpCisgICAgeworICAgICAgaWYgKF9NX21hbmFnZXIpCisJX01fbWFuYWdlcihfTV9mdW5jdG9yLCBfTV9mdW5jdG9yLCBfX2Rlc3Ryb3lfZnVuY3Rvcik7CisgICAgfQorCisKKyAgICBib29sIF9NX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gIV9NX21hbmFnZXI7IH0KKworICAgIHR5cGVkZWYgYm9vbCAoKl9NYW5hZ2VyX3R5cGUpKF9BbnlfZGF0YSYsIGNvbnN0IF9BbnlfZGF0YSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX01hbmFnZXJfb3BlcmF0aW9uKTsKKworICAgIF9BbnlfZGF0YSAgICAgX01fZnVuY3RvcjsKKyAgICBfTWFuYWdlcl90eXBlIF9NX21hbmFnZXI7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZSwgdHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjxfUmVzKF9BcmdUeXBlcy4uLiksIF9GdW5jdG9yPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+IF9CYXNlOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuICgqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgX0Z1bmN0b3I+CisgICAgOiBwdWJsaWMgX0Z1bmN0aW9uX2Jhc2U6Ol9CYXNlX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfRnVuY3Rvcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgKCpfQmFzZTo6X01fZ2V0X3BvaW50ZXIoX19mdW5jdG9yKSkoX19hcmdzLi4uKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8X1JlcyhfQXJnVHlwZXMuLi4pLCByZWZlcmVuY2Vfd3JhcHBlcjxfRnVuY3Rvcj4gPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfUmVmX21hbmFnZXI8X0Z1bmN0b3I+CisgICAgeworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPiBfQmFzZTsKKworICAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgX1JlcworICAgICAgX01faW52b2tlKGNvbnN0IF9BbnlfZGF0YSYgX19mdW5jdG9yLCBfQXJnVHlwZXMuLi4gX19hcmdzKQorICAgICAgeworICAgICAgICByZXR1cm4gCisgICAgICAgICAgX19jYWxsYWJsZV9mdW5jdG9yKCoqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3RvciwgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIF9GdW5jdGlvbl9oYW5kbGVyPHZvaWQoX0FyZ1R5cGVzLi4uKSwgcmVmZXJlbmNlX3dyYXBwZXI8X0Z1bmN0b3I+ID4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25fYmFzZTo6X1JlZl9tYW5hZ2VyPF9GdW5jdG9yPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2Jhc2U6Ol9SZWZfbWFuYWdlcjxfRnVuY3Rvcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIHZvaWQKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgX19jYWxsYWJsZV9mdW5jdG9yKCoqX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvcikpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lIF9SZXMsIAorICAgICAgICAgICB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgY2xhc3MgX0Z1bmN0aW9uX2hhbmRsZXI8X1JlcyhfQXJnVHlwZXMuLi4pLCBfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICA6IHB1YmxpYyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX0Z1bmN0aW9uX2hhbmRsZXI8dm9pZChfQXJnVHlwZXMuLi4pLCBfTWVtYmVyIF9DbGFzczo6Kj4KKyAgICAgICAgX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIF9SZXMKKyAgICAgIF9NX2ludm9rZShjb25zdCBfQW55X2RhdGEmIF9fZnVuY3RvciwgX0FyZ1R5cGVzLi4uIF9fYXJncykKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIHRyMTo6CisJICBtZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xhc3MsIHR5cGVuYW1lIF9NZW1iZXIsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjbGFzcyBfRnVuY3Rpb25faGFuZGxlcjx2b2lkKF9BcmdUeXBlcy4uLiksIF9NZW1iZXIgX0NsYXNzOjoqPgorICAgIDogcHVibGljIF9GdW5jdGlvbl9iYXNlOjpfQmFzZV9tYW5hZ2VyPAorICAgICAgICAgICAgICAgICBfU2ltcGxlX3R5cGVfd3JhcHBlcjwgX01lbWJlciBfQ2xhc3M6OiogPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfTWVtYmVyIF9DbGFzczo6KiBfRnVuY3RvcjsKKyAgICAgIHR5cGVkZWYgX1NpbXBsZV90eXBlX3dyYXBwZXI8X0Z1bmN0b3I+IF9XcmFwcGVyOworICAgICAgdHlwZWRlZiBfRnVuY3Rpb25fYmFzZTo6X0Jhc2VfbWFuYWdlcjxfV3JhcHBlcj4gX0Jhc2U7CisKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIGJvb2wKKyAgICAgIF9NX21hbmFnZXIoX0FueV9kYXRhJiBfX2Rlc3QsIGNvbnN0IF9BbnlfZGF0YSYgX19zb3VyY2UsCisgICAgICAgICAgICAgICAgIF9NYW5hZ2VyX29wZXJhdGlvbiBfX29wKQorICAgICAgeworICAgICAgICBzd2l0Y2ggKF9fb3ApCisJICB7CisjaWZkZWYgX19HWFhfUlRUSQorCSAgY2FzZSBfX2dldF90eXBlX2luZm86CisJICAgIF9fZGVzdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKSA9ICZ0eXBlaWQoX0Z1bmN0b3IpOworCSAgICBicmVhazsKKyNlbmRpZgkgICAgCisJICBjYXNlIF9fZ2V0X2Z1bmN0b3JfcHRyOgorCSAgICBfX2Rlc3QuX01fYWNjZXNzPF9GdW5jdG9yKj4oKSA9CisJICAgICAgJl9CYXNlOjpfTV9nZXRfcG9pbnRlcihfX3NvdXJjZSktPl9fdmFsdWU7CisJICAgIGJyZWFrOworCSAgICAKKwkgIGRlZmF1bHQ6CisJICAgIF9CYXNlOjpfTV9tYW5hZ2VyKF9fZGVzdCwgX19zb3VyY2UsIF9fb3ApOworCSAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHN0YXRpYyB2b2lkCisgICAgICBfTV9pbnZva2UoY29uc3QgX0FueV9kYXRhJiBfX2Z1bmN0b3IsIF9BcmdUeXBlcy4uLiBfX2FyZ3MpCisgICAgICB7CisJdHIxOjptZW1fZm4oX0Jhc2U6Ol9NX2dldF9wb2ludGVyKF9fZnVuY3RvciktPl9fdmFsdWUpKF9fYXJncy4uLik7CisgICAgICB9CisgICAgfTsKKworICAvLy8gY2xhc3MgZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGNsYXNzIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT4KKyAgICA6IHB1YmxpYyBfTWF5YmVfdW5hcnlfb3JfYmluYXJ5X2Z1bmN0aW9uPF9SZXMsIF9BcmdUeXBlcy4uLj4sCisgICAgICBwcml2YXRlIF9GdW5jdGlvbl9iYXNlCisgICAgeworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworICAgICAgLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHNhZmVfYm9vbCBpZGlvbS4KKyAgICAgIHN0cnVjdCBfSGlkZGVuX3R5cGUKKyAgICAgIHsKKwlfSGlkZGVuX3R5cGUqIF9NX2Jvb2w7CisgICAgICB9OworCisgICAgICAvLy8gVGhpcyB0eXBlZGVmIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBzYWZlX2Jvb2wgaWRpb20uCisgICAgICB0eXBlZGVmIF9IaWRkZW5fdHlwZSogX0hpZGRlbl90eXBlOjoqIF9TYWZlX2Jvb2w7CisjZW5kaWYKKworICAgICAgdHlwZWRlZiBfUmVzIF9TaWduYXR1cmVfdHlwZShfQXJnVHlwZXMuLi4pOworICAgICAgCisgICAgICBzdHJ1Y3QgX1VzZWxlc3MgeyB9OworICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfUmVzIHJlc3VsdF90eXBlOworICAgICAgCisgICAgICAvLyBbMy43LjIuMV0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgY3JlYXRlcyBhbiBlbXB0eSBmdW5jdGlvbiBjYWxsIHdyYXBwZXIuCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKCkgOiBfRnVuY3Rpb25fYmFzZSgpIHsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgY3JlYXRlcyBhbiBlbXB0eSBmdW5jdGlvbiBjYWxsIHdyYXBwZXIuCisgICAgICAgKiAgQHBvc3QgQGMgIShib29sKSp0aGlzCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uKF9NX2NsZWFyX3R5cGUqKSA6IF9GdW5jdGlvbl9iYXNlKCkgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gY29weSBjb25zdHJ1Y3Rvci4KKyAgICAgICAqICBAcGFyYW0geCBBICVmdW5jdGlvbiBvYmplY3Qgd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKiAgQHBvc3QgQGMgKGJvb2wpKnRoaXMgPT0gKGJvb2wpeAorICAgICAgICoKKyAgICAgICAqICBUaGUgbmV3bHktY3JlYXRlZCAlZnVuY3Rpb24gY29udGFpbnMgYSBjb3B5IG9mIHRoZSB0YXJnZXQgb2YgQGEKKyAgICAgICAqICB4IChpZiBpdCBoYXMgb25lKS4KKyAgICAgICAqLworICAgICAgZnVuY3Rpb24oY29uc3QgZnVuY3Rpb24mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBCdWlsZHMgYSAlZnVuY3Rpb24gdGhhdCB0YXJnZXRzIGEgY29weSBvZiB0aGUgaW5jb21pbmcKKyAgICAgICAqICBmdW5jdGlvbiBvYmplY3QuCisgICAgICAgKiAgQHBhcmFtIGYgQSAlZnVuY3Rpb24gb2JqZWN0IHRoYXQgaXMgY2FsbGFibGUgd2l0aCBwYXJhbWV0ZXJzIG9mCisgICAgICAgKiAgdHlwZSBAYyBUMSwgQGMgVDIsIC4uLiwgQGMgVE4gYW5kIHJldHVybnMgYSB2YWx1ZSBjb252ZXJ0aWJsZQorICAgICAgICogIHRvIEBjIFJlcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhlIG5ld2x5LWNyZWF0ZWQgJWZ1bmN0aW9uIG9iamVjdCB3aWxsIHRhcmdldCBhIGNvcHkgb2YgQGEKKyAgICAgICAqICBmLiBJZiBAYSBmIGlzIEBjIHJlZmVyZW5jZV93cmFwcGVyPEY+LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAqICBvYmplY3Qgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QgQGMKKyAgICAgICAqICBmLmdldCgpLiBJZiBAYSBmIGlzIGEgTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIE5VTEwKKyAgICAgICAqICBwb2ludGVyLXRvLW1lbWJlciwgdGhlIG5ld2x5LWNyZWF0ZWQgb2JqZWN0IHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIGYgaXMgYSBub24tTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIG9iamVjdCBvZiB0eXBlIEBjCisgICAgICAgKiAgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgICBmdW5jdGlvbihfRnVuY3RvciBfX2YsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNfaW50ZWdyYWw8X0Z1bmN0b3I+Ojp2YWx1ZSwgX1VzZWxlc3M+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICA9IF9Vc2VsZXNzKCkpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgICAgICAgKiAgQHBhcmFtIHggQSAlZnVuY3Rpb24gd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKiAgQHBvc3QgQGMgKGJvb2wpKnRoaXMgPT0gKGJvb2wpeAorICAgICAgICogIEByZXR1cm5zIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSB0YXJnZXQgb2YgQGEgeCBpcyBjb3BpZWQgdG8gQGMgKnRoaXMuIElmIEBhIHggaGFzIG5vCisgICAgICAgKiAgdGFyZ2V0LCB0aGVuIEBjICp0aGlzIHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIHggdGFyZ2V0cyBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgYSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbgorICAgICAgICogIG9iamVjdCwgdGhlbiB0aGlzIG9wZXJhdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICBmdW5jdGlvbiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBmdW5jdGlvbiYgX194KQorICAgICAgeworICAgICAgICBmdW5jdGlvbihfX3gpLnN3YXAoKnRoaXMpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAlRnVuY3Rpb24gYXNzaWdubWVudCB0byB6ZXJvLgorICAgICAgICogIEBwb3N0IEBjICEoYm9vbCkqdGhpcworICAgICAgICogIEByZXR1cm5zIEBjICp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSB0YXJnZXQgb2YgQGMgKnRoaXMgaXMgZGVhbGxvY2F0ZWQsIGxlYXZpbmcgaXQgZW1wdHkuCisgICAgICAgKi8KKyAgICAgIGZ1bmN0aW9uJgorICAgICAgb3BlcmF0b3I9KF9NX2NsZWFyX3R5cGUqKQorICAgICAgeworICAgICAgICBpZiAoX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX01fbWFuYWdlcihfTV9mdW5jdG9yLCBfTV9mdW5jdG9yLCBfX2Rlc3Ryb3lfZnVuY3Rvcik7CisJICAgIF9NX21hbmFnZXIgPSAwOworCSAgICBfTV9pbnZva2VyID0gMDsKKwkgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgJUZ1bmN0aW9uIGFzc2lnbm1lbnQgdG8gYSBuZXcgdGFyZ2V0LgorICAgICAgICogIEBwYXJhbSBmIEEgJWZ1bmN0aW9uIG9iamVjdCB0aGF0IGlzIGNhbGxhYmxlIHdpdGggcGFyYW1ldGVycyBvZgorICAgICAgICogIHR5cGUgQGMgVDEsIEBjIFQyLCAuLi4sIEBjIFROIGFuZCByZXR1cm5zIGEgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAqICB0byBAYyBSZXMuCisgICAgICAgKiAgQHJldHVybiBAYyAqdGhpcworICAgICAgICoKKyAgICAgICAqICBUaGlzICAlZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgd2lsbCB0YXJnZXQgYSBjb3B5IG9mIEBhCisgICAgICAgKiAgZi4gSWYgQGEgZiBpcyBAYyByZWZlcmVuY2Vfd3JhcHBlcjxGPiwgdGhlbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgKiAgb2JqZWN0IHdpbGwgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gb2JqZWN0IEBjCisgICAgICAgKiAgZi5nZXQoKS4gSWYgQGEgZiBpcyBhIE5VTEwgZnVuY3Rpb24gcG9pbnRlciBvciBOVUxMCisgICAgICAgKiAgcG9pbnRlci10by1tZW1iZXIsIEBjIHRoaXMgb2JqZWN0IHdpbGwgYmUgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIElmIEBhIGYgaXMgYSBub24tTlVMTCBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIG9iamVjdCBvZiB0eXBlIEBjCisgICAgICAgKiAgcmVmZXJlbmNlX3dyYXBwZXI8Rj4sIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgICB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fZW5hYmxlX2lmPCFpc19pbnRlZ3JhbDxfRnVuY3Rvcj46OnZhbHVlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24mPjo6X190eXBlCisJb3BlcmF0b3I9KF9GdW5jdG9yIF9fZikKKwl7CisJICBmdW5jdGlvbihfX2YpLnN3YXAoKnRoaXMpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLy8gWzMuNy4yLjJdIGZ1bmN0aW9uIG1vZGlmaWVycworICAgICAgCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgU3dhcCB0aGUgdGFyZ2V0cyBvZiB0d28gJWZ1bmN0aW9uIG9iamVjdHMuCisgICAgICAgKiAgQHBhcmFtIGYgQSAlZnVuY3Rpb24gd2l0aCBpZGVudGljYWwgY2FsbCBzaWduYXR1cmUuCisgICAgICAgKgorICAgICAgICogIFN3YXAgdGhlIHRhcmdldHMgb2YgQGMgdGhpcyBmdW5jdGlvbiBvYmplY3QgYW5kIEBhIGYuIFRoaXMKKyAgICAgICAqICBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICB2b2lkIHN3YXAoZnVuY3Rpb24mIF9feCkKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZnVuY3RvciwgX194Ll9NX2Z1bmN0b3IpOworCXN0ZDo6c3dhcChfTV9tYW5hZ2VyLCBfX3guX01fbWFuYWdlcik7CisJc3RkOjpzd2FwKF9NX2ludm9rZXIsIF9feC5fTV9pbnZva2VyKTsKKyAgICAgIH0KKworICAgICAgLy8gWzMuNy4yLjNdIGZ1bmN0aW9uIGNhcGFjaXR5CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlICVmdW5jdGlvbiB3cmFwcGVyIGhhcyBhIHRhcmdldC4KKyAgICAgICAqCisgICAgICAgKiAgQHJldHVybiBAYyB0cnVlIHdoZW4gdGhpcyAlZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgdGFyZ2V0LAorICAgICAgICogIG9yIEBjIGZhbHNlIHdoZW4gaXQgaXMgZW1wdHkuCisgICAgICAgKgorICAgICAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICAgICAqLworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuICFfTV9lbXB0eSgpOyB9CisjZWxzZQorICAgICAgb3BlcmF0b3IgX1NhZmVfYm9vbCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIGlmIChfTV9lbXB0eSgpKQorCSAgcmV0dXJuIDA7CisJZWxzZQorCSAgcmV0dXJuICZfSGlkZGVuX3R5cGU6Ol9NX2Jvb2w7CisgICAgICB9CisjZW5kaWYKKworICAgICAgLy8gWzMuNy4yLjRdIGZ1bmN0aW9uIGludm9jYXRpb24KKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmIEludm9rZXMgdGhlIGZ1bmN0aW9uIHRhcmdldGVkIGJ5IEBjICp0aGlzLgorICAgICAgICogIEByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHRhcmdldC4KKyAgICAgICAqICBAdGhyb3dzIGJhZF9mdW5jdGlvbl9jYWxsIHdoZW4gQGMgIShib29sKSp0aGlzCisgICAgICAgKgorICAgICAgICogIFRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdG9yIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QKKyAgICAgICAqICBzdG9yZWQgYnkgQGMgdGhpcy4KKyAgICAgICAqLworICAgICAgX1JlcyBvcGVyYXRvcigpKF9BcmdUeXBlcy4uLiBfX2FyZ3MpIGNvbnN0OworCisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgLy8gWzMuNy4yLjVdIGZ1bmN0aW9uIHRhcmdldCBhY2Nlc3MKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGZ1bmN0aW9uIG9iamVjdAorICAgICAgICogIHdyYXBwZXIuCisgICAgICAgKgorICAgICAgICogIEByZXR1cm5zIHRoZSB0eXBlIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsIG9yCisgICAgICAgKiAgQGMgdHlwZWlkKHZvaWQpIGlmIEBjICEoYm9vbCkqdGhpcy4KKyAgICAgICAqCisgICAgICAgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3Q7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiBBY2Nlc3MgdGhlIHN0b3JlZCB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqICBAcmV0dXJuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgdGFyZ2V0IGZ1bmN0aW9uIG9iamVjdCwKKyAgICAgICAqICBpZiBAYyB0eXBlaWQoRnVuY3RvcikuZXF1YWxzKHRhcmdldF90eXBlKCkpOyBvdGhlcndpc2UsIGEgTlVMTAorICAgICAgICogIHBvaW50ZXIuCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0aHJvdyBhbiAlZXhjZXB0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4gICAgICAgX0Z1bmN0b3IqIHRhcmdldCgpOworICAgICAgCisgICAgICAvLy8gQG92ZXJsb2FkCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4gY29uc3QgX0Z1bmN0b3IqIHRhcmdldCgpIGNvbnN0OworI2VuZGlmCisKKyAgICBwcml2YXRlOgorICAgICAgLy8gWzMuNy4yLjZdIHVuZGVmaW5lZCBvcGVyYXRvcnMKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdGlvbj4KKwl2b2lkIG9wZXJhdG9yPT0oY29uc3QgZnVuY3Rpb248X0Z1bmN0aW9uPiYpIGNvbnN0OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0aW9uPgorCXZvaWQgb3BlcmF0b3IhPShjb25zdCBmdW5jdGlvbjxfRnVuY3Rpb24+JikgY29uc3Q7CisKKyAgICAgIHR5cGVkZWYgX1JlcyAoKl9JbnZva2VyX3R5cGUpKGNvbnN0IF9BbnlfZGF0YSYsIF9BcmdUeXBlcy4uLik7CisgICAgICBfSW52b2tlcl90eXBlIF9NX2ludm9rZXI7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIGZ1bmN0aW9uPF9SZXMoX0FyZ1R5cGVzLi4uKT46OgorICAgIGZ1bmN0aW9uKGNvbnN0IGZ1bmN0aW9uJiBfX3gpCisgICAgOiBfRnVuY3Rpb25fYmFzZSgpCisgICAgeworICAgICAgaWYgKHN0YXRpY19jYXN0PGJvb2w+KF9feCkpCisJeworCSAgX01faW52b2tlciA9IF9feC5fTV9pbnZva2VyOworCSAgX01fbWFuYWdlciA9IF9feC5fTV9tYW5hZ2VyOworCSAgX194Ll9NX21hbmFnZXIoX01fZnVuY3RvciwgX194Ll9NX2Z1bmN0b3IsIF9fY2xvbmVfZnVuY3Rvcik7CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVzLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z1bmN0b3I+CisgICAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICAgIGZ1bmN0aW9uKF9GdW5jdG9yIF9fZiwKKwkgICAgICAgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2VuYWJsZV9pZjwKKyAgICAgICAgICAgICAgICAgICAgICAgIWlzX2ludGVncmFsPF9GdW5jdG9yPjo6dmFsdWUsIF9Vc2VsZXNzPjo6X190eXBlKQorICAgICAgOiBfRnVuY3Rpb25fYmFzZSgpCisgICAgICB7CisJdHlwZWRlZiBfRnVuY3Rpb25faGFuZGxlcjxfU2lnbmF0dXJlX3R5cGUsIF9GdW5jdG9yPiBfTXlfaGFuZGxlcjsKKworCWlmIChfTXlfaGFuZGxlcjo6X01fbm90X2VtcHR5X2Z1bmN0aW9uKF9fZikpCisJICB7CisJICAgIF9NX2ludm9rZXIgPSAmX015X2hhbmRsZXI6Ol9NX2ludm9rZTsKKwkgICAgX01fbWFuYWdlciA9ICZfTXlfaGFuZGxlcjo6X01fbWFuYWdlcjsKKwkgICAgX015X2hhbmRsZXI6Ol9NX2luaXRfZnVuY3RvcihfTV9mdW5jdG9yLCBfX2YpOworCSAgfQorICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBfUmVzCisgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgb3BlcmF0b3IoKShfQXJnVHlwZXMuLi4gX19hcmdzKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9lbXB0eSgpKQorICAgICAgICB7CisjaWYgX19FWENFUFRJT05TCisgICAgICAgICAgdGhyb3cgYmFkX2Z1bmN0aW9uX2NhbGwoKTsKKyNlbHNlCisgICAgICAgICAgX19idWlsdGluX2Fib3J0KCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgcmV0dXJuIF9NX2ludm9rZXIoX01fZnVuY3RvciwgX19hcmdzLi4uKTsKKyAgICB9CisKKyNpZmRlZiBfX0dYWF9SVFRJCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBjb25zdCB0eXBlX2luZm8mCisgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgdGFyZ2V0X3R5cGUoKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChfTV9tYW5hZ2VyKQorICAgICAgICB7CisgICAgICAgICAgX0FueV9kYXRhIF9fdHlwZWluZm9fcmVzdWx0OworICAgICAgICAgIF9NX21hbmFnZXIoX190eXBlaW5mb19yZXN1bHQsIF9NX2Z1bmN0b3IsIF9fZ2V0X3R5cGVfaW5mbyk7CisgICAgICAgICAgcmV0dXJuICpfX3R5cGVpbmZvX3Jlc3VsdC5fTV9hY2Nlc3M8Y29uc3QgdHlwZV9pbmZvKj4oKTsKKyAgICAgICAgfQorICAgICAgZWxzZQorCXJldHVybiB0eXBlaWQodm9pZCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnVuY3Rvcj4KKyAgICAgIF9GdW5jdG9yKgorICAgICAgZnVuY3Rpb248X1JlcyhfQXJnVHlwZXMuLi4pPjo6CisgICAgICB0YXJnZXQoKQorICAgICAgeworCWlmICh0eXBlaWQoX0Z1bmN0b3IpID09IHRhcmdldF90eXBlKCkgJiYgX01fbWFuYWdlcikKKwkgIHsKKwkgICAgX0FueV9kYXRhIF9fcHRyOworCSAgICBpZiAoX01fbWFuYWdlcihfX3B0ciwgX01fZnVuY3RvciwgX19nZXRfZnVuY3Rvcl9wdHIpCisJCSYmICFpc19jb25zdDxfRnVuY3Rvcj46OnZhbHVlKQorCSAgICAgIHJldHVybiAwOworCSAgICBlbHNlCisJICAgICAgcmV0dXJuIF9fcHRyLl9NX2FjY2VzczxfRnVuY3Rvcio+KCk7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yPgorICAgICAgY29uc3QgX0Z1bmN0b3IqCisgICAgICBmdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+OjoKKyAgICAgIHRhcmdldCgpIGNvbnN0CisgICAgICB7CisJaWYgKHR5cGVpZChfRnVuY3RvcikgPT0gdGFyZ2V0X3R5cGUoKSAmJiBfTV9tYW5hZ2VyKQorCSAgeworCSAgICBfQW55X2RhdGEgX19wdHI7CisJICAgIF9NX21hbmFnZXIoX19wdHIsIF9NX2Z1bmN0b3IsIF9fZ2V0X2Z1bmN0b3JfcHRyKTsKKwkgICAgcmV0dXJuIF9fcHRyLl9NX2FjY2Vzczxjb25zdCBfRnVuY3Rvcio+KCk7CisJICB9CisJZWxzZQorCSAgcmV0dXJuIDA7CisgICAgICB9CisjZW5kaWYKKworICAvLyBbMy43LjIuN10gbnVsbCBwb2ludGVyIGNvbXBhcmlzb25zCisKKyAgLyoqCisgICAqICBAYnJpZWYgQ29tcGFyZXMgYSBwb2x5bW9ycGhpYyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciBhZ2FpbnN0IDAKKyAgICogICh0aGUgTlVMTCBwb2ludGVyKS4KKyAgICogIEByZXR1cm5zIEBjIHRydWUgaWYgdGhlIHdyYXBwZXIgaGFzIG5vIHRhcmdldCwgQGMgZmFsc2Ugb3RoZXJ3aXNlCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRocm93IGFuICVleGNlcHRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfU2lnbmF0dXJlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mLCBfTV9jbGVhcl90eXBlKikKKyAgICB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oX19mKTsgfQorCisgIC8vLyBAb3ZlcmxvYWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1NpZ25hdHVyZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oX01fY2xlYXJfdHlwZSosIGNvbnN0IGZ1bmN0aW9uPF9TaWduYXR1cmU+JiBfX2YpCisgICAgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvKioKKyAgICogIEBicmllZiBDb21wYXJlcyBhIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGFnYWluc3QgMAorICAgKiAgKHRoZSBOVUxMIHBvaW50ZXIpLgorICAgKiAgQHJldHVybnMgQGMgZmFsc2UgaWYgdGhlIHdyYXBwZXIgaGFzIG5vIHRhcmdldCwgQGMgdHJ1ZSBvdGhlcndpc2UKKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uPF9TaWduYXR1cmU+JiBfX2YsIF9NX2NsZWFyX3R5cGUqKQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvLy8gQG92ZXJsb2FkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KF9NX2NsZWFyX3R5cGUqLCBjb25zdCBmdW5jdGlvbjxfU2lnbmF0dXJlPiYgX19mKQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KF9fZik7IH0KKworICAvLyBbMy43LjIuOF0gc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcworCisgIC8qKgorICAgKiAgQGJyaWVmIFN3YXAgdGhlIHRhcmdldHMgb2YgdHdvIHBvbHltb3JwaGljIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGhyb3cgYW4gJWV4Y2VwdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGZ1bmN0aW9uPF9TaWduYXR1cmU+JiBfX3gsIGZ1bmN0aW9uPF9TaWduYXR1cmU+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0ZVTkNUSU9OQUwKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Z1bmN0aW9uYWxfaGFzaC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvZnVuY3Rpb25hbF9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0MmUxNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2Z1bmN0aW9uYWxfaGFzaC5oCkBAIC0wLDAgKzEsMTk2IEBACisvLyBUUjEgZnVuY3Rpb25hbF9oYXNoLmggaGVhZGVyIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2Z1bmN0aW9uYWxfaGFzaC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2Z1bmN0aW9uYWx9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfRlVOQ1RJT05BTF9IQVNIX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0ZVTkNUSU9OQUxfSEFTSF9IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIENsYXNzIHRlbXBsYXRlIGhhc2guCisgIC8vIERlY2xhcmF0aW9uIG9mIGRlZmF1bHQgaGFzaCBmdW5jdG9yIHN0ZDo6dHIxOjpoYXNoLiAgVGhlIHR5cGVzIGZvcgorICAvLyB3aGljaCBzdGQ6OnRyMTo6aGFzaDxUPiBpcyB3ZWxsLWRlZmluZWQgaXMgaW4gY2xhdXNlIDYuMy4zLiBvZiB0aGUgUERUUi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNoIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248X1RwLCBzaXplX3Q+CisgICAgeworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKF9UcCBfX3ZhbCkgY29uc3Q7CisgICAgfTsKKworICAvLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbnMgZm9yIHBvaW50ZXIgdHlwZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzaDxfVHAqPiA6IHB1YmxpYyBzdGQ6OnVuYXJ5X2Z1bmN0aW9uPF9UcCosIHNpemVfdD4KKyAgICB7CisgICAgICBzaXplX3QKKyAgICAgIG9wZXJhdG9yKCkoX1RwKiBfX3ApIGNvbnN0CisgICAgICB7IHJldHVybiByZWludGVycHJldF9jYXN0PHNpemVfdD4oX19wKTsgfQorICAgIH07CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucyBmb3IgaW50ZWdlciB0eXBlcy4KKyNkZWZpbmUgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChfVHApIAlcCisgIHRlbXBsYXRlPD4JCQkJCQlcCisgICAgaW5saW5lIHNpemVfdAkJCQkJXAorICAgIGhhc2g8X1RwPjo6b3BlcmF0b3IoKShfVHAgX192YWwpIGNvbnN0CQlcCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihfX3ZhbCk7IH0KKworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGJvb2wpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKGNoYXIpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHNpZ25lZCBjaGFyKTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBjaGFyKTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh3Y2hhcl90KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChzaG9ydCk7CisgIF9UUjFfaGFzaHRhYmxlX2RlZmluZV90cml2aWFsX2hhc2goaW50KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChsb25nKTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaChsb25nIGxvbmcpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIHNob3J0KTsKKyAgX1RSMV9oYXNodGFibGVfZGVmaW5lX3RyaXZpYWxfaGFzaCh1bnNpZ25lZCBpbnQpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGxvbmcpOworICBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoKHVuc2lnbmVkIGxvbmcgbG9uZyk7CisKKyN1bmRlZiBfVFIxX2hhc2h0YWJsZV9kZWZpbmVfdHJpdmlhbF9oYXNoCisKKyAgLy8gRm93bGVyIC8gTm9sbCAvIFZvIChGTlYpIEhhc2ggKHR5cGUgRk5WLTFhKQorICAvLyAoVXNlZCBieSB0aGUgbmV4dCBzcGVjaWFsaXphdGlvbnMgb2Ygc3RkOjp0cjE6Omhhc2guKQorCisgIC8vLyBEdW1teSBnZW5lcmljIGltcGxlbWVudGF0aW9uIChmb3Igc2l6ZW9mKHNpemVfdCkgIT0gNCwgOCkuCisgIHRlbXBsYXRlPHNpemVfdD4KKyAgICBzdHJ1Y3QgX0Zudl9oYXNoX2Jhc2UKKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIHN0YXRpYyBzaXplX3QKKyAgICAgICAgaGFzaChjb25zdCBfVHAqIF9fcHRyLCBzaXplX3QgX19jbGVuZ3RoKQorICAgICAgICB7CisJICBzaXplX3QgX19yZXN1bHQgPSAwOworCSAgY29uc3QgY2hhciogX19jcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19wdHIpOworCSAgZm9yICg7IF9fY2xlbmd0aDsgLS1fX2NsZW5ndGgpCisJICAgIF9fcmVzdWx0ID0gKF9fcmVzdWx0ICogMTMxKSArICpfX2NwdHIrKzsKKwkgIHJldHVybiBfX3Jlc3VsdDsKKwl9CisgICAgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9GbnZfaGFzaF9iYXNlPDQ+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICAgIGhhc2goY29uc3QgX1RwKiBfX3B0ciwgc2l6ZV90IF9fY2xlbmd0aCkKKyAgICAgICAgeworCSAgc2l6ZV90IF9fcmVzdWx0ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigyMTY2MTM2MjYxVUwpOworCSAgY29uc3QgY2hhciogX19jcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19wdHIpOworCSAgZm9yICg7IF9fY2xlbmd0aDsgLS1fX2NsZW5ndGgpCisJICAgIHsKKwkgICAgICBfX3Jlc3VsdCBePSBzdGF0aWNfY2FzdDxzaXplX3Q+KCpfX2NwdHIrKyk7CisJICAgICAgX19yZXN1bHQgKj0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxNjc3NzYxOVVMKTsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworICAKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfRm52X2hhc2hfYmFzZTw4PgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICAgICAgc3RhdGljIHNpemVfdAorICAgICAgICBoYXNoKGNvbnN0IF9UcCogX19wdHIsIHNpemVfdCBfX2NsZW5ndGgpCisgICAgICAgIHsKKwkgIHNpemVfdCBfX3Jlc3VsdAorCSAgICA9IHN0YXRpY19jYXN0PHNpemVfdD4oMTQ2OTU5ODEwMzkzNDY2NTYwMzdVTEwpOworCSAgY29uc3QgY2hhciogX19jcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oX19wdHIpOworCSAgZm9yICg7IF9fY2xlbmd0aDsgLS1fX2NsZW5ndGgpCisJICAgIHsKKwkgICAgICBfX3Jlc3VsdCBePSBzdGF0aWNfY2FzdDxzaXplX3Q+KCpfX2NwdHIrKyk7CisJICAgICAgX19yZXN1bHQgKj0gc3RhdGljX2Nhc3Q8c2l6ZV90PigxMDk5NTExNjI4MjExVUxMKTsKKwkgICAgfQorCSAgcmV0dXJuIF9fcmVzdWx0OworCX0KKyAgICB9OworCisgIHN0cnVjdCBfRm52X2hhc2gKKyAgOiBwdWJsaWMgX0Zudl9oYXNoX2Jhc2U8c2l6ZW9mKHNpemVfdCk+CisgIHsKKyAgICB1c2luZyBfRm52X2hhc2hfYmFzZTxzaXplb2Yoc2l6ZV90KT46Omhhc2g7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdGF0aWMgc2l6ZV90CisgICAgICBoYXNoKGNvbnN0IF9UcCYgX192YWwpCisgICAgICB7IHJldHVybiBoYXNoKCZfX3ZhbCwgc2l6ZW9mKF9fdmFsKSk7IH0KKyAgfTsKKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGZvciBmbG9hdC4KKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSBzaXplX3QKKyAgICBoYXNoPGZsb2F0Pjo6b3BlcmF0b3IoKShmbG9hdCBfX3ZhbCkgY29uc3QKKyAgICB7CisgICAgICAvLyAwIGFuZCAtMCBib3RoIGhhc2ggdG8gemVyby4KKyAgICAgIHJldHVybiBfX3ZhbCAhPSAwLjBmID8gc3RkOjp0cjE6Ol9GbnZfaGFzaDo6aGFzaChfX3ZhbCkgOiAwOworICAgIH0KKworICAvLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIGZvciBkb3VibGUuCisgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgc2l6ZV90CisgICAgaGFzaDxkb3VibGU+OjpvcGVyYXRvcigpKGRvdWJsZSBfX3ZhbCkgY29uc3QKKyAgICB7CisgICAgICAvLyAwIGFuZCAtMCBib3RoIGhhc2ggdG8gemVyby4KKyAgICAgIHJldHVybiBfX3ZhbCAhPSAwLjAgPyBzdGQ6OnRyMTo6X0Zudl9oYXNoOjpoYXNoKF9fdmFsKSA6IDA7CisgICAgfQorCisgIC8vLyBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgZm9yIGxvbmcgZG91YmxlLgorICB0ZW1wbGF0ZTw+CisgICAgX0dMSUJDWFhfUFVSRSBzaXplX3QKKyAgICBoYXNoPGxvbmcgZG91YmxlPjo6b3BlcmF0b3IoKShsb25nIGRvdWJsZSBfX3ZhbCkgY29uc3Q7CisKKyAgLy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIG1lbWJlciBvcGVyYXRvciBmb3Igbm9uLWJ1aWx0aW4gdHlwZXMuCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8c3RyaW5nPjo6b3BlcmF0b3IoKShzdHJpbmcpIGNvbnN0OworCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8Y29uc3Qgc3RyaW5nJj46Om9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJikgY29uc3Q7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICB0ZW1wbGF0ZTw+CisgICAgX0dMSUJDWFhfUFVSRSBzaXplX3QKKyAgICBoYXNoPHdzdHJpbmc+OjpvcGVyYXRvcigpKHdzdHJpbmcpIGNvbnN0OworCisgIHRlbXBsYXRlPD4KKyAgICBfR0xJQkNYWF9QVVJFIHNpemVfdAorICAgIGhhc2g8Y29uc3Qgd3N0cmluZyY+OjpvcGVyYXRvcigpKGNvbnN0IHdzdHJpbmcmKSBjb25zdDsKKyNlbmRpZgorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9GVU5DVElPTkFMX0hBU0hfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvZ2FtbWEudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvZ2FtbWEudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzM5OWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9nYW1tYS50Y2MKQEAgLTAsMCArMSw0NzMgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvZ2FtbWEudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gNiwgcHAuIDI1My0yNjYKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDIxMy0yMTYKKy8vICAgKDQpIEdhbW1hLCBFeHBsb3JpbmcgRXVsZXIncyBDb25zdGFudCwgSnVsaWFuIEhhdmlsLAorLy8gICAgICAgUHJpbmNldG9uLCAyMDAzLgorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9HQU1NQV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX0dBTU1BX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJldHVybnMgQmVybm91bGxpIG51bWJlcnMgZnJvbSBhIHRhYmxlIG9yIGJ5IHN1bW1hdGlvbgorICAgICAqICAgICAgICAgIGZvciBsYXJnZXIgdmFsdWVzLgorICAgICAqCisgICAgICogICBSZWN1cnNpb24gaXMgdW5zdGFibGUuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gdGhlIG9yZGVyIG4gb2YgdGhlIEJlcm5vdWxsaSBudW1iZXIuCisgICAgICogICBAcmV0dXJuICBUaGUgQmVybm91bGxpIG51bWJlciBvZiBvcmRlciBuLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVHA+CisgICAgX1RwIF9fYmVybm91bGxpX3Nlcmllcyh1bnNpZ25lZCBpbnQgX19uKQorICAgIHsKKworICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX251bVsyOF0gPSB7CisgICAgICAgIF9UcCgxVUwpLCAgICAgICAgICAgICAgICAgICAgICAgIC1fVHAoMVVMKSAvIF9UcCgyVUwpLAorICAgICAgICBfVHAoMVVMKSAvIF9UcCg2VUwpLCAgICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgLV9UcCgxVUwpIC8gX1RwKDMwVUwpLCAgICAgICAgICAgX1RwKDBVTCksCisgICAgICAgIF9UcCgxVUwpIC8gX1RwKDQyVUwpLCAgICAgICAgICAgIF9UcCgwVUwpLAorICAgICAgICAtX1RwKDFVTCkgLyBfVHAoMzBVTCksICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgX1RwKDVVTCkgLyBfVHAoNjZVTCksICAgICAgICAgICAgX1RwKDBVTCksCisgICAgICAgIC1fVHAoNjkxVUwpIC8gX1RwKDI3MzBVTCksICAgICAgIF9UcCgwVUwpLAorICAgICAgICBfVHAoN1VMKSAvIF9UcCg2VUwpLCAgICAgICAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgLV9UcCgzNjE3VUwpIC8gX1RwKDUxMFVMKSwgICAgICAgX1RwKDBVTCksCisgICAgICAgIF9UcCg0Mzg2N1VMKSAvIF9UcCg3OThVTCksICAgICAgIF9UcCgwVUwpLAorICAgICAgICAtX1RwKDE3NDYxMSkgLyBfVHAoMzMwVUwpLCAgICAgICBfVHAoMFVMKSwKKyAgICAgICAgX1RwKDg1NDUxM1VMKSAvIF9UcCgxMzhVTCksICAgICAgX1RwKDBVTCksCisgICAgICAgIC1fVHAoMjM2MzY0MDkxVUwpIC8gX1RwKDI3MzBVTCksIF9UcCgwVUwpLAorICAgICAgICBfVHAoODU1MzEwM1VMKSAvIF9UcCg2VUwpLCAgICAgICBfVHAoMFVMKQorICAgICAgfTsKKworICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX1RwKDEpOworCisgICAgICBpZiAoX19uID09IDEpCisgICAgICAgIHJldHVybiAtX1RwKDEpIC8gX1RwKDIpOworCisgICAgICAvLyAgVGFrZSBjYXJlIG9mIHRoZSByZXN0IG9mIHRoZSBvZGQgb25lcy4KKyAgICAgIGlmIChfX24gJSAyID09IDEpCisgICAgICAgIHJldHVybiBfVHAoMCk7CisKKyAgICAgIC8vICBUYWtlIGNhcmUgb2Ygc29tZSBzbWFsbCBldmVucyB0aGF0IGFyZSBwYWluZnVsIGZvciB0aGUgc2VyaWVzLgorICAgICAgaWYgKF9fbiA8IDI4KQorICAgICAgICByZXR1cm4gX19udW1bX19uXTsKKworCisgICAgICBfVHAgX19mYWN0ID0gX1RwKDEpOworICAgICAgaWYgKChfX24gLyAyKSAlIDIgPT0gMCkKKyAgICAgICAgX19mYWN0ICo9IF9UcCgtMSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPD0gX19uOyArK19faykKKyAgICAgICAgX19mYWN0ICo9IF9fayAvIChfVHAoMikgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSk7CisgICAgICBfX2ZhY3QgKj0gX1RwKDIpOworCisgICAgICBfVHAgX19zdW0gPSBfVHAoMCk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAxOyBfX2kgPCAxMDAwOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBzdGQ6OnBvdyhfVHAoX19pKSwgLV9UcChfX24pKTsKKyAgICAgICAgICBpZiAoX190ZXJtIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fZmFjdCAqIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByZXR1cm5zIEJlcm5vdWxsaSBudW1iZXIgXGYkQl9uXGYkLgorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIHRoZSBvcmRlciBuIG9mIHRoZSBCZXJub3VsbGkgbnVtYmVyLgorICAgICAqICAgQHJldHVybiAgVGhlIEJlcm5vdWxsaSBudW1iZXIgb2Ygb3JkZXIgbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fYmVybm91bGxpKGNvbnN0IGludCBfX24pCisgICAgeworICAgICAgcmV0dXJuIF9fYmVybm91bGxpX3NlcmllczxfVHA+KF9fbik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gXGYkbG9nKFxHYW1tYSh4KSlcZiQgYnkgYXN5bXB0b3RpYyBleHBhbnNpb24KKyAgICAgKiAgICAgICAgICB3aXRoIEJlcm5vdWxsaSBudW1iZXIgY29lZmZpY2llbnRzLiAgVGhpcyBpcyBsaWtlCisgICAgICogICAgICAgICAgU3RlcmxpbmcncyBhcHByb3hpbWF0aW9uLgorICAgICAqCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgbG9nIG9mIHRoZSBnYW1tYSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBsb2dhcml0aG0gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2xvZ19nYW1tYV9iZXJub3VsbGkoY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBfVHAgX19sZyA9IChfX3ggLSBfVHAoMC41TCkpICogc3RkOjpsb2coX194KSAtIF9feAorICAgICAgICAgICAgICAgKyBfVHAoMC41TCkgKiBzdGQ6OmxvZyhfVHAoMikKKyAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpOworCisgICAgICBjb25zdCBfVHAgX194eCA9IF9feCAqIF9feDsKKyAgICAgIF9UcCBfX2hlbHAgPSBfVHAoMSkgLyBfX3g7CisgICAgICBmb3IgKCB1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgMjA7ICsrX19pICkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfXzJpID0gX1RwKDIgKiBfX2kpOworICAgICAgICAgIF9faGVscCAvPSBfXzJpICogKF9fMmkgLSBfVHAoMSkpICogX194eDsKKyAgICAgICAgICBfX2xnICs9IF9fYmVybm91bGxpPF9UcD4oMiAqIF9faSkgKiBfX2hlbHA7CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fbGc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gXGYkbG9nKFxHYW1tYSh4KSlcZiQgYnkgdGhlIExhbmN6b3MgbWV0aG9kLgorICAgICAqICAgICAgICAgIFRoaXMgbWV0aG9kIGRvbWluYXRlcyBhbGwgb3RoZXJzIG9uIHRoZSBwb3NpdGl2ZSBheGlzIEkgdGhpbmsuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBsb2cgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGxvZ2FyaXRobSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2dhbW1hX2xhbmN6b3MoY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX194bTEgPSBfX3ggLSBfVHAoMSk7CisKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19sYW5jem9zX2NoZWJfN1s5XSA9IHsKKyAgICAgICBfVHAoIDAuOTk5OTk5OTk5OTk5ODA5OTMyMjc2ODQ3MDA0NzM0NzhMKSwKKyAgICAgICBfVHAoIDY3Ni41MjAzNjgxMjE4ODUwOTg1NjcwMDkxOTA0NDQwMTlMKSwKKyAgICAgICBfVHAoLTEyNTkuMTM5MjE2NzIyNDAyODcwNDcxNTYwNzg3NTUyODNMKSwKKyAgICAgICBfVHAoIDc3MS4zMjM0Mjg3Nzc2NTMwNzg4NDg2NTI4MjU4ODk0TCksCisgICAgICAgX1RwKC0xNzYuNjE1MDI5MTYyMTQwNTk5MDY1ODQ1NTEzNTRMKSwKKyAgICAgICBfVHAoIDEyLjUwNzM0MzI3ODY4NjkwNDgxNDQ1ODkzNjg1M0wpLAorICAgICAgIF9UcCgtMC4xMzg1NzEwOTUyNjU3MjAxMTY4OTU1NDcwN0wpLAorICAgICAgIF9UcCggOS45ODQzNjk1NzgwMTk1NzA4NTk1NjNlLTZMKSwKKyAgICAgICBfVHAoIDEuNTA1NjMyNzM1MTQ5MzExNTU4MzRlLTdMKQorICAgICAgfTsKKworICAgICAgc3RhdGljIGNvbnN0IF9UcCBfX0xPR1JPT1QyUEkKKyAgICAgICAgICA9IF9UcCgwLjkxODkzODUzMzIwNDY3Mjc0MTc4MDMyOTczNjQwNTYxNzZMKTsKKworICAgICAgX1RwIF9fc3VtID0gX19sYW5jem9zX2NoZWJfN1swXTsKKyAgICAgIGZvcih1bnNpZ25lZCBpbnQgX19rID0gMTsgX19rIDwgOTsgKytfX2spCisgICAgICAgIF9fc3VtICs9IF9fbGFuY3pvc19jaGViXzdbX19rXSAvIChfX3htMSArIF9fayk7CisKKyAgICAgIGNvbnN0IF9UcCBfX3Rlcm0xID0gKF9feG0xICsgX1RwKDAuNUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmxvZygoX194bTEgKyBfVHAoNy41TCkpCisgICAgICAgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX2V1bGVyKCkpOworICAgICAgY29uc3QgX1RwIF9fdGVybTIgPSBfX0xPR1JPT1QyUEkgKyBzdGQ6OmxvZyhfX3N1bSk7CisgICAgICBjb25zdCBfVHAgX19yZXN1bHQgPSBfX3Rlcm0xICsgKF9fdGVybTIgLSBfVHAoNykpOworCisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gXGYkIGxvZyh8XEdhbW1hKHgpfCkgXGYkLgorICAgICAqICAgICAgICAgIFRoaXMgd2lsbCByZXR1cm4gdmFsdWVzIGV2ZW4gZm9yIFxmJCB4IDwgMCBcZiQuCisgICAgICogICAgICAgICAgVG8gcmVjb3ZlciB0aGUgc2lnbiBvZiBcZiQgXEdhbW1hKHgpIFxmJCBmb3IKKyAgICAgKiAgICAgICAgICBhbnkgYXJndW1lbnQgdXNlIEBhIF9fbG9nX2dhbW1hX3NpZ24uCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBsb2cgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGxvZ2FyaXRobSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fbG9nX2dhbW1hKGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA+IF9UcCgwLjVMKSkKKyAgICAgICAgcmV0dXJuIF9fbG9nX2dhbW1hX2xhbmN6b3MoX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Npbl9mYWN0CisgICAgICAgICAgICAgICAgID0gc3RkOjphYnMoc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkgKiBfX3gpKTsKKyAgICAgICAgICBpZiAoX19zaW5fZmFjdCA9PSBfVHAoMCkpCisgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgaXMgbm9ucG9zaXRpdmUgaW50ZWdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19sb2dfZ2FtbWEiKSk7CisgICAgICAgICAgcmV0dXJuIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19sbnBpKCkKKyAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjpsb2coX19zaW5fZmFjdCkKKyAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWFfbGFuY3pvcyhfVHAoMSkgLSBfX3gpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIHNpZ24gb2YgXGYkIFxHYW1tYSh4KSBcZiQuCisgICAgICogICAgICAgICAgQXQgbm9ucG9zaXRpdmUgaW50ZWdlcnMgemVybyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIHNpZ24gb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2xvZ19nYW1tYV9zaWduKGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9feCA+IF9UcCgwKSkKKyAgICAgICAgcmV0dXJuIF9UcCgxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Npbl9mYWN0CisgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2luKF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpICogX194KTsKKyAgICAgICAgICBpZiAoX19zaW5fZmFjdCA+IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgZWxzZSBpZiAoX19zaW5fZmFjdCA8IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiAtX1RwKDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKiAgIFRoZSBiaW5vbWlhbCBjb2VmZmljaWVudCBpcyBnaXZlbiBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgXGxlZnQoICBccmlnaHQpID0gXGZyYWN7biF9eyhuLWspISBrIX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICogICBAcGFyYW0gX19rIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqICAgQHJldHVybiAgVGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2xvZ19iaW5jb2VmKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IHVuc2lnbmVkIGludCBfX2spCisgICAgeworICAgICAgLy8gIE1heCBlIGV4cG9uZW50IGJlZm9yZSBvdmVyZmxvdy4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19tYXhfYmluY29lZmYKKyAgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4X2V4cG9uZW50MTAKKyAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6bG9nKF9UcCgxMCkpIC0gX1RwKDEpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9UcCBfX2NvZWZmID0gIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX24pKQorICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19rKSkKKyAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9fbiAtIF9faykpOworI2Vsc2UKKyAgICAgIF9UcCBfX2NvZWZmID0gIF9fbG9nX2dhbW1hKF9UcCgxICsgX19uKSkKKyAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2spKQorICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9fbiAtIF9faykpOworI2VuZGlmCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBSZXR1cm4gdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50LgorICAgICAqICAgVGhlIGJpbm9taWFsIGNvZWZmaWNpZW50IGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICBcbGVmdCggIFxyaWdodCkgPSBcZnJhY3tuIX17KG4taykhIGshfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudC4KKyAgICAgKiAgIEBwYXJhbSBfX2sgVGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICogICBAcmV0dXJuICBUaGUgYmlub21pYWwgY29lZmZpY2llbnQuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fYmluY29lZihjb25zdCB1bnNpZ25lZCBpbnQgX19uLCBjb25zdCB1bnNpZ25lZCBpbnQgX19rKQorICAgIHsKKyAgICAgIC8vICBNYXggZSBleHBvbmVudCBiZWZvcmUgb3ZlcmZsb3cuCisgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fbWF4X2JpbmNvZWZmCisgICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46Om1heF9leHBvbmVudDEwCisgICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmxvZyhfVHAoMTApKSAtIF9UcCgxKTsKKworICAgICAgY29uc3QgX1RwIF9fbG9nX2NvZWZmID0gX19sb2dfYmluY29lZjxfVHA+KF9fbiwgX19rKTsKKyAgICAgIGlmIChfX2xvZ19jb2VmZiA+IF9fbWF4X2JpbmNvZWZmKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZXhwKF9fbG9nX2NvZWZmKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiBcZiQgXEdhbW1hKHgpIFxmJC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9feCBUaGUgYXJndW1lbnQgb2YgdGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIGdhbW1hIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19nYW1tYShjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIHJldHVybiBzdGQ6OmV4cChfX2xvZ19nYW1tYShfX3gpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGRpZ2FtbWEgZnVuY3Rpb24gYnkgc2VyaWVzIGV4cGFuc2lvbi4KKyAgICAgKiAgIFRoZSBkaWdhbW1hIG9yIEBmJCBccHNpKHgpIEBmJCBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaSh4KSA9IFxmcmFje1xHYW1tYScoeCl9e1xHYW1tYSh4KX0KKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBUaGUgc2VyaWVzIGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSAtXGdhbW1hX0UgLSBcZnJhY3sxfXt4fQorICAgICAqICAgICAgICAgICAgICBcc3VtX3trPTF9XntcaW5mdHl9IFxmcmFje3h9e2soeCArIGspfQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcHNpX3Nlcmllcyhjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIF9UcCBfX3N1bSA9IC1fX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fZ2FtbWFfZSgpIC0gX1RwKDEpIC8gX194OworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCBfX21heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Rlcm0gPSBfX3ggLyAoX19rICogKF9fayArIF9feCkpOworICAgICAgICAgIF9fc3VtICs9IF9fdGVybTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtIC8gX19zdW0pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgZGlnYW1tYSBmdW5jdGlvbiBmb3IgbGFyZ2UgYXJndW1lbnQuCisgICAgICogICBUaGUgZGlnYW1tYSBvciBAZiQgXHBzaSh4KSBAZiQgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBcZnJhY3tcR2FtbWEnKHgpfXtcR2FtbWEoeCl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgVGhlIGFzeW1wdG90aWMgc2VyaWVzIGlzIGdpdmVuIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBcbG4oeCkgLSBcZnJhY3sxfXsyeH0KKyAgICAgKiAgICAgICAgICAgICAtIFxzdW1fe249MX1ee1xpbmZ0eX0gXGZyYWN7Ql97Mm59fXsyIG4geF57Mm59fQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcHNpX2FzeW1wKGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgX1RwIF9fc3VtID0gc3RkOjpsb2coX194KSAtIF9UcCgwLjVMKSAvIF9feDsKKyAgICAgIGNvbnN0IF9UcCBfX3h4ID0gX194ICogX194OworICAgICAgX1RwIF9feHAgPSBfX3h4OworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2sgPSAxOyBfX2sgPCBfX21heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3Rlcm0gPSBfX2Jlcm5vdWxsaTxfVHA+KDIgKiBfX2spIC8gKDIgKiBfX2sgKiBfX3hwKTsKKyAgICAgICAgICBfX3N1bSAtPSBfX3Rlcm07CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fdGVybSAvIF9fc3VtKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgX194cCAqPSBfX3h4OworICAgICAgICB9CisgICAgICByZXR1cm4gX19zdW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBkaWdhbW1hIGZ1bmN0aW9uLgorICAgICAqICAgVGhlIGRpZ2FtbWEgb3IgQGYkIFxwc2koeCkgQGYkIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBccHNpKHgpID0gXGZyYWN7XEdhbW1hJyh4KX17XEdhbW1hKHgpfQorICAgICAqICAgQGZdCisgICAgICogICBGb3IgbmVnYXRpdmUgYXJndW1lbnQgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYSBpcyB1c2VkOgorICAgICAqICAgQGZbCisgICAgICogICAgIFxwc2koeCkgPSBccHNpKDEteCkgLSBccGkgXGNvdChccGkgeCkKKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BzaShjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IGludCBfX24gPSBzdGF0aWNfY2FzdDxpbnQ+KF9feCArIDAuNUwpOworICAgICAgY29uc3QgX1RwIF9fZXBzID0gX1RwKDQpICogc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBpZiAoX19uIDw9IDAgJiYgc3RkOjphYnMoX194IC0gX1RwKF9fbikpIDwgX19lcHMpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX194IDwgX1RwKDApKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fcGkgPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKTsKKyAgICAgICAgICByZXR1cm4gX19wc2koX1RwKDEpIC0gX194KQorICAgICAgICAgICAgICAgLSBfX3BpICogc3RkOjpjb3MoX19waSAqIF9feCkgLyBzdGQ6OnNpbihfX3BpICogX194KTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX194ID4gX1RwKDEwMCkpCisgICAgICAgIHJldHVybiBfX3BzaV9hc3ltcChfX3gpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19wc2lfc2VyaWVzKF9feCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBwb2x5Z2FtbWEgZnVuY3Rpb24gQGYkIFxwc2leeyhuKX0oeCkgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIHBvbHlnYW1tYSBmdW5jdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBIdXJ3aXR6IHpldGEgZnVuY3Rpb246CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHBzaV57KG4pfSh4KSA9ICgtMSlee24rMX0gbSEgXHpldGEobSsxLHgpCisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19wc2koY29uc3QgdW5zaWduZWQgaW50IF9fbiwgY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBpZiAoX194IDw9IF9UcCgwKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkFyZ3VtZW50IG91dCBvZiByYW5nZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3BzaSIpKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX19wc2koX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX2h6ZXRhID0gX19odXJ3aXR6X3pldGEoX1RwKF9fbiArIDEpLCBfX3gpOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9uZmFjdCA9IHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKF9fbiArIDEpKTsKKyNlbHNlCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5fbmZhY3QgPSBfX2xvZ19nYW1tYShfVHAoX19uICsgMSkpOworI2VuZGlmCisgICAgICAgICAgX1RwIF9fcmVzdWx0ID0gc3RkOjpleHAoX19sbl9uZmFjdCkgKiBfX2h6ZXRhOworICAgICAgICAgIGlmIChfX24gJSAyID09IDEpCisgICAgICAgICAgICBfX3Jlc3VsdCA9IC1fX3Jlc3VsdDsKKyAgICAgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0dBTU1BX1RDQworCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9oYXNodGFibGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2hhc2h0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWUwMmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9oYXNodGFibGUuaApAQCAtMCwwICsxLDExODEgQEAKKy8vIFRSMSBoYXNodGFibGUuaCBoZWFkZXIgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvaGFzaHRhYmxlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LgorICogIEBoZWFkZXJuYW1le3RyMS91bm9yZGVyZWRfc2V0LCB0cjEvdW5vcmRlcmVkX21hcH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9IQVNIVEFCTEVfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfSEFTSFRBQkxFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDx0cjEvaGFzaHRhYmxlX3BvbGljeS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gQ2xhc3MgdGVtcGxhdGUgX0hhc2h0YWJsZSwgY2xhc3MgZGVmaW5pdGlvbi4KKworICAvLyBNZWFuaW5nIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUncyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisKKyAgLy8gX0tleSBhbmQgX1ZhbHVlOiBhcmJpdHJhcnkgQ29weUNvbnN0cnVjdGlibGUgdHlwZXMuCisKKyAgLy8gX0FsbG9jYXRvcjogYW4gYWxsb2NhdG9yIHR5cGUgKFtsaWIuYWxsb2NhdG9yLnJlcXVpcmVtZW50c10pIHdob3NlCisgIC8vIHZhbHVlIHR5cGUgaXMgVmFsdWUuICBBcyBhIGNvbmZvcm1pbmcgZXh0ZW5zaW9uLCB3ZSBhbGxvdyBmb3IKKyAgLy8gdmFsdWUgdHlwZSAhPSBWYWx1ZS4KKworICAvLyBfRXh0cmFjdEtleTogZnVuY3Rpb24gb2JqZWN0IHRoYXQgdGFrZXMgYSBvYmplY3Qgb2YgdHlwZSBWYWx1ZQorICAvLyBhbmQgcmV0dXJucyBhIHZhbHVlIG9mIHR5cGUgX0tleS4KKworICAvLyBfRXF1YWw6IGZ1bmN0aW9uIG9iamVjdCB0aGF0IHRha2VzIHR3byBvYmplY3RzIG9mIHR5cGUgayBhbmQgcmV0dXJucworICAvLyBhIGJvb2wtbGlrZSB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgorCisgIC8vIF9IMTogdGhlIGhhc2ggZnVuY3Rpb24uICBBIHVuYXJ5IGZ1bmN0aW9uIG9iamVjdCB3aXRoIGFyZ3VtZW50IHR5cGUKKyAgLy8gS2V5IGFuZCByZXN1bHQgdHlwZSBzaXplX3QuICBSZXR1cm4gdmFsdWVzIHNob3VsZCBiZSBkaXN0cmlidXRlZAorICAvLyBvdmVyIHRoZSBlbnRpcmUgcmFuZ2UgWzAsIG51bWVyaWNfbGltaXRzPHNpemVfdD46OjptYXgoKV0uCisKKyAgLy8gX0gyOiB0aGUgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiAoaW4gdGhlIHRlcm1pbm9sb2d5IG9mIFRhdm9yaSBhbmQKKyAgLy8gRHJlaXppbikuICBBIGJpbmFyeSBmdW5jdGlvbiBvYmplY3Qgd2hvc2UgYXJndW1lbnQgdHlwZXMgYW5kIHJlc3VsdAorICAvLyB0eXBlIGFyZSBhbGwgc2l6ZV90LiAgR2l2ZW4gYXJndW1lbnRzIHIgYW5kIE4sIHRoZSByZXR1cm4gdmFsdWUgaXMKKyAgLy8gaW4gdGhlIHJhbmdlIFswLCBOKS4KKworICAvLyBfSGFzaDogdGhlIHJhbmdlZCBoYXNoIGZ1bmN0aW9uIChUYXZvcmkgYW5kIERyZWl6aW4pLiBBIGJpbmFyeSBmdW5jdGlvbgorICAvLyB3aG9zZSBhcmd1bWVudCB0eXBlcyBhcmUgX0tleSBhbmQgc2l6ZV90IGFuZCB3aG9zZSByZXN1bHQgdHlwZSBpcworICAvLyBzaXplX3QuICBHaXZlbiBhcmd1bWVudHMgayBhbmQgTiwgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UKKyAgLy8gWzAsIE4pLiAgRGVmYXVsdDogaGFzaChrLCBOKSA9IGgyKGgxKGspLCBOKS4gIElmIF9IYXNoIGlzIGFueXRoaW5nIG90aGVyCisgIC8vIHRoYW4gdGhlIGRlZmF1bHQsIF9IMSBhbmQgX0gyIGFyZSBpZ25vcmVkLgorCisgIC8vIF9SZWhhc2hQb2xpY3k6IFBvbGljeSBjbGFzcyB3aXRoIHRocmVlIG1lbWJlcnMsIGFsbCBvZiB3aGljaCBnb3Zlcm4KKyAgLy8gdGhlIGJ1Y2tldCBjb3VudC4gX01fbmV4dF9ia3QobikgcmV0dXJucyBhIGJ1Y2tldCBjb3VudCBubyBzbWFsbGVyCisgIC8vIHRoYW4gbi4gIF9NX2JrdF9mb3JfZWxlbWVudHMobikgcmV0dXJucyBhIGJ1Y2tldCBjb3VudCBhcHByb3ByaWF0ZQorICAvLyBmb3IgYW4gZWxlbWVudCBjb3VudCBvZiBuLiAgX01fbmVlZF9yZWhhc2gobl9ia3QsIG5fZWx0LCBuX2lucykKKyAgLy8gZGV0ZXJtaW5lcyB3aGV0aGVyLCBpZiB0aGUgY3VycmVudCBidWNrZXQgY291bnQgaXMgbl9ia3QgYW5kIHRoZQorICAvLyBjdXJyZW50IGVsZW1lbnQgY291bnQgaXMgbl9lbHQsIHdlIG5lZWQgdG8gaW5jcmVhc2UgdGhlIGJ1Y2tldAorICAvLyBjb3VudC4gIElmIHNvLCByZXR1cm5zIG1ha2VfcGFpcih0cnVlLCBuKSwgd2hlcmUgbiBpcyB0aGUgbmV3CisgIC8vIGJ1Y2tldCBjb3VudC4gIElmIG5vdCwgcmV0dXJucyBtYWtlX3BhaXIoZmFsc2UsIDxhbnl0aGluZz4pLgorCisgIC8vID8/PyBSaWdodCBub3cgaXQgaXMgaGFyZC13aXJlZCB0aGF0IHRoZSBudW1iZXIgb2YgYnVja2V0cyBuZXZlcgorICAvLyBzaHJpbmtzLiAgU2hvdWxkIHdlIGFsbG93IF9SZWhhc2hQb2xpY3kgdG8gY2hhbmdlIHRoYXQ/CisKKyAgLy8gX19jYWNoZV9oYXNoX2NvZGU6IGJvb2wuICB0cnVlIGlmIHdlIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgaGFzaAorICAvLyBmdW5jdGlvbiBhbG9uZyB3aXRoIHRoZSB2YWx1ZS4gIFRoaXMgaXMgYSB0aW1lLXNwYWNlIHRyYWRlb2ZmLgorICAvLyBTdG9yaW5nIGl0IG1heSBpbXByb3ZlIGxvb2t1cCBzcGVlZCBieSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHRpbWVzCisgIC8vIHdlIG5lZWQgdG8gY2FsbCB0aGUgRXF1YWwgZnVuY3Rpb24uCisKKyAgLy8gX19jb25zdGFudF9pdGVyYXRvcnM6IGJvb2wuICB0cnVlIGlmIGl0ZXJhdG9yIGFuZCBjb25zdF9pdGVyYXRvciBhcmUKKyAgLy8gYm90aCBjb25zdGFudCBpdGVyYXRvciB0eXBlcy4gIFRoaXMgaXMgdHJ1ZSBmb3IgdW5vcmRlcmVkX3NldCBhbmQKKyAgLy8gdW5vcmRlcmVkX211bHRpc2V0LCBmYWxzZSBmb3IgdW5vcmRlcmVkX21hcCBhbmQgdW5vcmRlcmVkX211bHRpbWFwLgorCisgIC8vIF9fdW5pcXVlX2tleXM6IGJvb2wuICB0cnVlIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgX0hhc2h0YWJsZTo6Y291bnQoaykKKyAgLy8gaXMgYWx3YXlzIGF0IG1vc3Qgb25lLCBmYWxzZSBpZiBpdCBtYXkgYmUgYW4gYXJiaXRyYXJ5IG51bWJlci4gIFRoaXMKKyAgLy8gdHJ1ZSBmb3IgdW5vcmRlcmVkX3NldCBhbmQgdW5vcmRlcmVkX21hcCwgZmFsc2UgZm9yIHVub3JkZXJlZF9tdWx0aXNldAorICAvLyBhbmQgdW5vcmRlcmVkX211bHRpbWFwLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUsCisJICAgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkgICBib29sIF9fdW5pcXVlX2tleXM+CisgICAgY2xhc3MgX0hhc2h0YWJsZQorICAgIDogcHVibGljIF9fZGV0YWlsOjpfUmVoYXNoX2Jhc2U8X1JlaGFzaFBvbGljeSwKKwkJCQkgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJCSAgICAgICBfRXh0cmFjdEtleSwKKwkJCQkJICAgICAgIF9FcXVhbCwgX0gxLCBfSDIsIF9IYXNoLAorCQkJCQkgICAgICAgX1JlaGFzaFBvbGljeSwKKwkJCQkJICAgICAgIF9fY2FjaGVfaGFzaF9jb2RlLAorCQkJCQkgICAgICAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCSAgICAgICBfX3VuaXF1ZV9rZXlzPiA+LAorICAgICAgcHVibGljIF9fZGV0YWlsOjpfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9fY2FjaGVfaGFzaF9jb2RlPiwKKyAgICAgIHB1YmxpYyBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9fdW5pcXVlX2tleXMsCisJCQkJIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCQkgICAgX0V4dHJhY3RLZXksCisJCQkJCSAgICBfRXF1YWwsIF9IMSwgX0gyLCBfSGFzaCwKKwkJCQkJICAgIF9SZWhhc2hQb2xpY3ksCisJCQkJCSAgICBfX2NhY2hlX2hhc2hfY29kZSwKKwkJCQkJICAgIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkgICAgX191bmlxdWVfa2V5cz4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9BbGxvY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0VxdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZXF1YWw7CisgICAgICAvLyBtYXBwZWRfdHlwZSwgaWYgcHJlc2VudCwgY29tZXMgZnJvbSBfTWFwX2Jhc2UuCisgICAgICAvLyBoYXNoZXIsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX0hhc2hfY29kZV9iYXNlLgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6c2l6ZV90eXBlICAgICAgICAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnBvaW50ZXIgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6Y29uc3RfcG9pbnRlciAgICAgICAgICBjb25zdF9wb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NhdG9yOjpyZWZlcmVuY2UgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6Y29uc3RfcmVmZXJlbmNlICAgICAgICBjb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9Ob2RlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCSAgICAgICBfX2NhY2hlX2hhc2hfY29kZT4KKwkJCQkJCQkgIGxvY2FsX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X05vZGVfY29uc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwKKwkJCQkJICAgICBfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkJICAgICBfX2NhY2hlX2hhc2hfY29kZT4KKwkJCQkJCQkgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yOworCisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfSGFzaHRhYmxlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIF9fY29uc3RhbnRfaXRlcmF0b3JzLAorCQkJCQkgICAgX19jYWNoZV9oYXNoX2NvZGU+CisJCQkJCQkJICBpdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9IYXNodGFibGVfY29uc3RfaXRlcmF0b3I8dmFsdWVfdHlwZSwKKwkJCQkJCSAgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJCQkgIF9fY2FjaGVfaGFzaF9jb2RlPgorCQkJCQkJCSAgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXkyLCB0eXBlbmFtZSBfVmFsdWUyLCB0eXBlbmFtZSBfRXgyLCBib29sIF9fdW5pcXVlMiwKKwkgICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTI+CisJZnJpZW5kIHN0cnVjdCBfX2RldGFpbDo6X01hcF9iYXNlOworCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX19kZXRhaWw6Ol9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlX2hhc2hfY29kZT4gX05vZGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxfTm9kZT46Om90aGVyCisJCQkJCQkJX05vZGVfYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxfTm9kZSo+OjpvdGhlcgorCQkJCQkJCV9CdWNrZXRfYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPF9WYWx1ZT46Om90aGVyCisJCQkJCQkJX1ZhbHVlX2FsbG9jYXRvcl90eXBlOworCisgICAgICBfTm9kZV9hbGxvY2F0b3JfdHlwZSAgIF9NX25vZGVfYWxsb2NhdG9yOworICAgICAgX05vZGUqKiAgICAgICAgICAgICAgICBfTV9idWNrZXRzOworICAgICAgc2l6ZV90eXBlICAgICAgICAgICAgICBfTV9idWNrZXRfY291bnQ7CisgICAgICBzaXplX3R5cGUgICAgICAgICAgICAgIF9NX2VsZW1lbnRfY291bnQ7CisgICAgICBfUmVoYXNoUG9saWN5ICAgICAgICAgIF9NX3JlaGFzaF9wb2xpY3k7CisKKyAgICAgIF9Ob2RlKgorICAgICAgX01fYWxsb2NhdGVfbm9kZShjb25zdCB2YWx1ZV90eXBlJiBfX3YpOworCisgICAgICB2b2lkCisgICAgICBfTV9kZWFsbG9jYXRlX25vZGUoX05vZGUqIF9fbik7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX05vZGUqKiwgc2l6ZV90eXBlKTsKKworICAgICAgX05vZGUqKgorICAgICAgX01fYWxsb2NhdGVfYnVja2V0cyhzaXplX3R5cGUgX19uKTsKKworICAgICAgdm9pZAorICAgICAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9Ob2RlKiosIHNpemVfdHlwZSBfX24pOworCisgICAgcHVibGljOgorICAgICAgLy8gQ29uc3RydWN0b3IsIGRlc3RydWN0b3IsIGFzc2lnbm1lbnQsIHN3YXAKKyAgICAgIF9IYXNodGFibGUoc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJCSBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYsCisJCSBjb25zdCBfRXF1YWwmLCBjb25zdCBfRXh0cmFjdEtleSYsCisJCSBjb25zdCBhbGxvY2F0b3JfdHlwZSYpOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfSGFzaHRhYmxlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKKwkJICAgc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJCSAgIGNvbnN0IF9IMSYsIGNvbnN0IF9IMiYsIGNvbnN0IF9IYXNoJiwKKwkJICAgY29uc3QgX0VxdWFsJiwgY29uc3QgX0V4dHJhY3RLZXkmLAorCQkgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYpOworCisgICAgICBfSGFzaHRhYmxlKGNvbnN0IF9IYXNodGFibGUmKTsKKworICAgICAgX0hhc2h0YWJsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfSGFzaHRhYmxlJik7CisKKyAgICAgIH5fSGFzaHRhYmxlKCk7CisKKyAgICAgIHZvaWQgc3dhcChfSGFzaHRhYmxlJik7CisKKyAgICAgIC8vIEJhc2ljIGNvbnRhaW5lciBvcGVyYXRpb25zCisgICAgICBpdGVyYXRvcgorICAgICAgYmVnaW4oKQorICAgICAgeworCWl0ZXJhdG9yIF9faShfTV9idWNrZXRzKTsKKwlpZiAoIV9faS5fTV9jdXJfbm9kZSkKKwkgIF9faS5fTV9pbmNyX2J1Y2tldCgpOworCXJldHVybiBfX2k7CisgICAgICB9CisKKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBiZWdpbigpIGNvbnN0CisgICAgICB7CisJY29uc3RfaXRlcmF0b3IgX19pKF9NX2J1Y2tldHMpOworCWlmICghX19pLl9NX2N1cl9ub2RlKQorCSAgX19pLl9NX2luY3JfYnVja2V0KCk7CisJcmV0dXJuIF9faTsKKyAgICAgIH0KKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVuZCgpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfTV9idWNrZXRzICsgX01fYnVja2V0X2NvdW50KTsgfQorCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9NX2J1Y2tldHMgKyBfTV9idWNrZXRfY291bnQpOyB9CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgc2l6ZSgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9lbGVtZW50X2NvdW50OyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGVtcHR5KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgICAgIGFsbG9jYXRvcl90eXBlCisgICAgICBnZXRfYWxsb2NhdG9yKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKF9NX25vZGVfYWxsb2NhdG9yKTsgfQorCisgICAgICBfVmFsdWVfYWxsb2NhdG9yX3R5cGUKKyAgICAgIF9NX2dldF9WYWx1ZV9hbGxvY2F0b3IoKSBjb25zdAorICAgICAgeyByZXR1cm4gX1ZhbHVlX2FsbG9jYXRvcl90eXBlKF9NX25vZGVfYWxsb2NhdG9yKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9zaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX25vZGVfYWxsb2NhdG9yLm1heF9zaXplKCk7IH0KKworICAgICAgLy8gT2JzZXJ2ZXJzCisgICAgICBrZXlfZXF1YWwKKyAgICAgIGtleV9lcSgpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5fTV9lcTsgfQorCisgICAgICAvLyBoYXNoX2Z1bmN0aW9uLCBpZiBwcmVzZW50LCBjb21lcyBmcm9tIF9IYXNoX2NvZGVfYmFzZS4KKworICAgICAgLy8gQnVja2V0IG9wZXJhdGlvbnMKKyAgICAgIHNpemVfdHlwZQorICAgICAgYnVja2V0X2NvdW50KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2J1Y2tldF9jb3VudDsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIG1heF9idWNrZXRfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gbWF4X3NpemUoKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldF9zaXplKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6OmRpc3RhbmNlKGJlZ2luKF9fbiksIGVuZChfX24pKTsgfQorCisgICAgICBzaXplX3R5cGUKKyAgICAgIGJ1Y2tldChjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgICAgeworCXJldHVybiB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKSwKKwkJCQkgICAgIGJ1Y2tldF9jb3VudCgpKTsKKyAgICAgIH0KKworICAgICAgbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pCisgICAgICB7IHJldHVybiBsb2NhbF9pdGVyYXRvcihfTV9idWNrZXRzW19fbl0pOyB9CisKKyAgICAgIGxvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlKQorICAgICAgeyByZXR1cm4gbG9jYWxfaXRlcmF0b3IoMCk7IH0KKworICAgICAgY29uc3RfbG9jYWxfaXRlcmF0b3IKKyAgICAgIGJlZ2luKHNpemVfdHlwZSBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBjb25zdF9sb2NhbF9pdGVyYXRvcihfTV9idWNrZXRzW19fbl0pOyB9CisKKyAgICAgIGNvbnN0X2xvY2FsX2l0ZXJhdG9yCisgICAgICBlbmQoc2l6ZV90eXBlKSBjb25zdAorICAgICAgeyByZXR1cm4gY29uc3RfbG9jYWxfaXRlcmF0b3IoMCk7IH0KKworICAgICAgZmxvYXQKKyAgICAgIGxvYWRfZmFjdG9yKCkgY29uc3QKKyAgICAgIHsKKwlyZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpemUoKSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oYnVja2V0X2NvdW50KCkpOworICAgICAgfQorCisgICAgICAvLyBtYXhfbG9hZF9mYWN0b3IsIGlmIHByZXNlbnQsIGNvbWVzIGZyb20gX1JlaGFzaF9iYXNlLgorCisgICAgICAvLyBHZW5lcmFsaXphdGlvbiBvZiBtYXhfbG9hZF9mYWN0b3IuICBFeHRlbnNpb24sIG5vdCBmb3VuZCBpbiBUUjEuICBPbmx5CisgICAgICAvLyB1c2VmdWwgaWYgX1JlaGFzaFBvbGljeSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KKyAgICAgIGNvbnN0IF9SZWhhc2hQb2xpY3kmCisgICAgICBfX3JlaGFzaF9wb2xpY3koKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmVoYXNoX3BvbGljeTsgfQorCisgICAgICB2b2lkCisgICAgICBfX3JlaGFzaF9wb2xpY3koY29uc3QgX1JlaGFzaFBvbGljeSYpOworCisgICAgICAvLyBMb29rdXAuCisgICAgICBpdGVyYXRvcgorICAgICAgZmluZChjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHNpemVfdHlwZQorICAgICAgY291bnQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3Q7CisKKyAgICAgIHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+CisgICAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKTsKKworICAgICAgc3RkOjpwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcj4KKyAgICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0OworCisgICAgcHJpdmF0ZToJCQkvLyBGaW5kLCBpbnNlcnQgYW5kIGVyYXNlIGhlbHBlciBmdW5jdGlvbnMKKyAgICAgIC8vID8/PyBUaGlzIGRpc3BhdGNoaW5nIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCB3ZSBkb24ndAorICAgICAgLy8gaGF2ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIG1lbWJlciB0ZW1wbGF0ZXM7IGl0IHdvdWxkIGJlCisgICAgICAvLyBiZXR0ZXIgdG8ganVzdCBzcGVjaWFsaXplIGluc2VydCBvbiBfX3VuaXF1ZV9rZXlzLiAgVGhlcmUgbWF5IGJlIGEKKyAgICAgIC8vIGNsZWFuZXIgd29ya2Fyb3VuZC4KKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X191bmlxdWVfa2V5cywKKwkJICAgICAgIAkgICAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiwgaXRlcmF0b3I+OjpfX3R5cGUKKwlfSW5zZXJ0X1JldHVybl9UeXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPF9fdW5pcXVlX2tleXMsCisJCQkJCSAgc3RkOjpfU2VsZWN0MXN0PF9JbnNlcnRfUmV0dXJuX1R5cGU+LAorCQkJCSAgCSAgc3RkOjpfSWRlbnRpdHk8X0luc2VydF9SZXR1cm5fVHlwZT4KKwkJCQkgICA+OjpfX3R5cGUKKwlfSW5zZXJ0X0NvbnZfVHlwZTsKKworICAgICAgX05vZGUqCisgICAgICBfTV9maW5kX25vZGUoX05vZGUqLCBjb25zdCBrZXlfdHlwZSYsCisJCSAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSkgY29uc3Q7CisKKyAgICAgIGl0ZXJhdG9yCisgICAgICBfTV9pbnNlcnRfYnVja2V0KGNvbnN0IHZhbHVlX3R5cGUmLCBzaXplX3R5cGUsCisJCSAgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUpOworCisgICAgICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+CisgICAgICBfTV9pbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYsIHN0ZDo6dHIxOjp0cnVlX3R5cGUpOworCisgICAgICBpdGVyYXRvcgorICAgICAgX01faW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmLCBzdGQ6OnRyMTo6ZmFsc2VfdHlwZSk7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2VyYXNlX25vZGUoX05vZGUqLCBfTm9kZSoqKTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIEluc2VydCBhbmQgZXJhc2UKKyAgICAgIF9JbnNlcnRfUmV0dXJuX1R5cGUKKyAgICAgIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IHJldHVybiBfTV9pbnNlcnQoX192LCBzdGQ6OnRyMTo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSBfX3VuaXF1ZV9rZXlzPigpKTsgfQorCisgICAgICBpdGVyYXRvcgorICAgICAgaW5zZXJ0KGl0ZXJhdG9yLCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpCisgICAgICB7IHJldHVybiBpdGVyYXRvcihfSW5zZXJ0X0NvbnZfVHlwZSgpKHRoaXMtPmluc2VydChfX3YpKSk7IH0KKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGluc2VydChjb25zdF9pdGVyYXRvciwgY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgICAgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoX0luc2VydF9Db252X1R5cGUoKSh0aGlzLT5pbnNlcnQoX192KSkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXZvaWQKKwlpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KTsKKworICAgICAgaXRlcmF0b3IKKyAgICAgIGVyYXNlKGl0ZXJhdG9yKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yKTsKKworICAgICAgc2l6ZV90eXBlCisgICAgICBlcmFzZShjb25zdCBrZXlfdHlwZSYpOworCisgICAgICBpdGVyYXRvcgorICAgICAgZXJhc2UoaXRlcmF0b3IsIGl0ZXJhdG9yKTsKKworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGVyYXNlKGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvcik7CisKKyAgICAgIHZvaWQKKyAgICAgIGNsZWFyKCk7CisKKyAgICAgIC8vIFNldCBudW1iZXIgb2YgYnVja2V0cyB0byBiZSBhcHByb3ByaWF0ZSBmb3IgY29udGFpbmVyIG9mIG4gZWxlbWVudC4KKyAgICAgIHZvaWQgcmVoYXNoKHNpemVfdHlwZSBfX24pOworCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFVuY29uZGl0aW9uYWxseSBjaGFuZ2Ugc2l6ZSBvZiBidWNrZXQgYXJyYXkgdG8gbi4KKyAgICAgIHZvaWQgX01fcmVoYXNoKHNpemVfdHlwZSBfX24pOworICAgIH07CisKKworICAvLyBEZWZpbml0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3Mgb3V0LW9mLWxpbmUgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Ol9Ob2RlKgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2FsbG9jYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYgX192KQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX24gPSBfTV9ub2RlX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyAgICAgIF9fdHJ5CisJeworCSAgX01fZ2V0X1ZhbHVlX2FsbG9jYXRvcigpLmNvbnN0cnVjdCgmX19uLT5fTV92LCBfX3YpOworCSAgX19uLT5fTV9uZXh0ID0gMDsKKwkgIHJldHVybiBfX247CisJfQorICAgICAgX19jYXRjaCguLi4pCisJeworCSAgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX24sIDEpOworCSAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJfQorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9kZWFsbG9jYXRlX25vZGUoX05vZGUqIF9fbikKKyAgICB7CisgICAgICBfTV9nZXRfVmFsdWVfYWxsb2NhdG9yKCkuZGVzdHJveSgmX19uLT5fTV92KTsKKyAgICAgIF9NX25vZGVfYWxsb2NhdG9yLmRlYWxsb2NhdGUoX19uLCAxKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfTm9kZSoqIF9fYXJyYXksIHNpemVfdHlwZSBfX24pCisgICAgeworICAgICAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19uOyArK19faSkKKwl7CisJICBfTm9kZSogX19wID0gX19hcnJheVtfX2ldOworCSAgd2hpbGUgKF9fcCkKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX3RtcCA9IF9fcDsKKwkgICAgICBfX3AgPSBfX3AtPl9NX25leHQ7CisJICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fdG1wKTsKKwkgICAgfQorCSAgX19hcnJheVtfX2ldID0gMDsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpfTm9kZSoqCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01fYWxsb2NhdGVfYnVja2V0cyhzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9CdWNrZXRfYWxsb2NhdG9yX3R5cGUgX19hbGxvYyhfTV9ub2RlX2FsbG9jYXRvcik7CisKKyAgICAgIC8vIFdlIGFsbG9jYXRlIG9uZSBleHRyYSBidWNrZXQgdG8gaG9sZCBhIHNlbnRpbmVsLCBhbiBhcmJpdHJhcnkKKyAgICAgIC8vIG5vbi1udWxsIHBvaW50ZXIuICBJdGVyYXRvciBpbmNyZW1lbnQgcmVsaWVzIG9uIHRoaXMuCisgICAgICBfTm9kZSoqIF9fcCA9IF9fYWxsb2MuYWxsb2NhdGUoX19uICsgMSk7CisgICAgICBzdGQ6OmZpbGwoX19wLCBfX3AgKyBfX24sIChfTm9kZSopIDApOworICAgICAgX19wW19fbl0gPSByZWludGVycHJldF9jYXN0PF9Ob2RlKj4oMHgxMDAwKTsKKyAgICAgIHJldHVybiBfX3A7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTm9kZSoqIF9fcCwgc2l6ZV90eXBlIF9fbikKKyAgICB7CisgICAgICBfQnVja2V0X2FsbG9jYXRvcl90eXBlIF9fYWxsb2MoX01fbm9kZV9hbGxvY2F0b3IpOworICAgICAgX19hbGxvYy5kZWFsbG9jYXRlKF9fcCwgX19uICsgMSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX0hhc2h0YWJsZShzaXplX3R5cGUgX19idWNrZXRfaGludCwKKwkgICAgICAgY29uc3QgX0gxJiBfX2gxLCBjb25zdCBfSDImIF9faDIsIGNvbnN0IF9IYXNoJiBfX2gsCisJICAgICAgIGNvbnN0IF9FcXVhbCYgX19lcSwgY29uc3QgX0V4dHJhY3RLZXkmIF9fZXhrLAorCSAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQorICAgIDogX19kZXRhaWw6Ol9SZWhhc2hfYmFzZTxfUmVoYXNoUG9saWN5LCBfSGFzaHRhYmxlPigpLAorICAgICAgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz4oX19leGssIF9fZXEsCisJCQkJCQkJX19oMSwgX19oMiwgX19oKSwKKyAgICAgIF9fZGV0YWlsOjpfTWFwX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX191aywgX0hhc2h0YWJsZT4oKSwKKyAgICAgIF9NX25vZGVfYWxsb2NhdG9yKF9fYSksCisgICAgICBfTV9idWNrZXRfY291bnQoMCksCisgICAgICBfTV9lbGVtZW50X2NvdW50KDApLAorICAgICAgX01fcmVoYXNoX3BvbGljeSgpCisgICAgeworICAgICAgX01fYnVja2V0X2NvdW50ID0gX01fcmVoYXNoX3BvbGljeS5fTV9uZXh0X2JrdChfX2J1Y2tldF9oaW50KTsKKyAgICAgIF9NX2J1Y2tldHMgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldF9jb3VudCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgICBfSGFzaHRhYmxlKF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkgc2l6ZV90eXBlIF9fYnVja2V0X2hpbnQsCisJCSBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwgY29uc3QgX0hhc2gmIF9faCwKKwkJIGNvbnN0IF9FcXVhbCYgX19lcSwgY29uc3QgX0V4dHJhY3RLZXkmIF9fZXhrLAorCQkgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkKKyAgICAgIDogX19kZXRhaWw6Ol9SZWhhc2hfYmFzZTxfUmVoYXNoUG9saWN5LCBfSGFzaHRhYmxlPigpLAorCV9fZGV0YWlsOjpfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJCSAgX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz4oX19leGssIF9fZXEsCisJCQkJCQkJICBfX2gxLCBfX2gyLCBfX2gpLAorCV9fZGV0YWlsOjpfTWFwX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX191aywgX0hhc2h0YWJsZT4oKSwKKwlfTV9ub2RlX2FsbG9jYXRvcihfX2EpLAorCV9NX2J1Y2tldF9jb3VudCgwKSwKKwlfTV9lbGVtZW50X2NvdW50KDApLAorCV9NX3JlaGFzaF9wb2xpY3koKQorICAgICAgeworCV9NX2J1Y2tldF9jb3VudCA9IHN0ZDo6bWF4KF9NX3JlaGFzaF9wb2xpY3kuX01fbmV4dF9ia3QoX19idWNrZXRfaGludCksCisJCQkJICAgX01fcmVoYXNoX3BvbGljeS4KKwkJCQkgICBfTV9ia3RfZm9yX2VsZW1lbnRzKF9fZGV0YWlsOjoKKwkJCQkJCSAgICAgICBfX2Rpc3RhbmNlX2Z3KF9fZiwKKwkJCQkJCQkJICAgICBfX2wpKSk7CisJX01fYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0X2NvdW50KTsKKwlfX3RyeQorCSAgeworCSAgICBmb3IgKDsgX19mICE9IF9fbDsgKytfX2YpCisJICAgICAgdGhpcy0+aW5zZXJ0KCpfX2YpOworCSAgfQorCV9fY2F0Y2goLi4uKQorCSAgeworCSAgICBjbGVhcigpOworCSAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKwkgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICB9CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfSGFzaHRhYmxlKGNvbnN0IF9IYXNodGFibGUmIF9faHQpCisgICAgOiBfX2RldGFpbDo6X1JlaGFzaF9iYXNlPF9SZWhhc2hQb2xpY3ksIF9IYXNodGFibGU+KF9faHQpLAorICAgICAgX19kZXRhaWw6Ol9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQkJX0gxLCBfSDIsIF9IYXNoLCBfX2NoYz4oX19odCksCisgICAgICBfX2RldGFpbDo6X01hcF9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9fdWssIF9IYXNodGFibGU+KF9faHQpLAorICAgICAgX01fbm9kZV9hbGxvY2F0b3IoX19odC5fTV9ub2RlX2FsbG9jYXRvciksCisgICAgICBfTV9idWNrZXRfY291bnQoX19odC5fTV9idWNrZXRfY291bnQpLAorICAgICAgX01fZWxlbWVudF9jb3VudChfX2h0Ll9NX2VsZW1lbnRfY291bnQpLAorICAgICAgX01fcmVoYXNoX3BvbGljeShfX2h0Ll9NX3JlaGFzaF9wb2xpY3kpCisgICAgeworICAgICAgX01fYnVja2V0cyA9IF9NX2FsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9fdHJ5CisJeworCSAgZm9yIChzaXplX3R5cGUgX19pID0gMDsgX19pIDwgX19odC5fTV9idWNrZXRfY291bnQ7ICsrX19pKQorCSAgICB7CisJICAgICAgX05vZGUqIF9fbiA9IF9faHQuX01fYnVja2V0c1tfX2ldOworCSAgICAgIF9Ob2RlKiogX190YWlsID0gX01fYnVja2V0cyArIF9faTsKKwkgICAgICB3aGlsZSAoX19uKQorCQl7CisJCSAgKl9fdGFpbCA9IF9NX2FsbG9jYXRlX25vZGUoX19uLT5fTV92KTsKKwkJICB0aGlzLT5fTV9jb3B5X2NvZGUoKl9fdGFpbCwgX19uKTsKKwkJICBfX3RhaWwgPSAmKCgqX190YWlsKS0+X01fbmV4dCk7CisJCSAgX19uID0gX19uLT5fTV9uZXh0OworCQl9CisJICAgIH0KKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBjbGVhcigpOworCSAgX01fZGVhbGxvY2F0ZV9idWNrZXRzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPiYKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBvcGVyYXRvcj0oY29uc3QgX0hhc2h0YWJsZSYgX19odCkKKyAgICB7CisgICAgICBfSGFzaHRhYmxlIF9fdG1wKF9faHQpOworICAgICAgdGhpcy0+c3dhcChfX3RtcCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgfl9IYXNodGFibGUoKQorICAgIHsKKyAgICAgIGNsZWFyKCk7CisgICAgICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX01fYnVja2V0cywgX01fYnVja2V0X2NvdW50KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgc3dhcChfSGFzaHRhYmxlJiBfX3gpCisgICAgeworICAgICAgLy8gVGhlIG9ubHkgYmFzZSBjbGFzcyB3aXRoIG1lbWJlciB2YXJpYWJsZXMgaXMgaGFzaF9jb2RlX2Jhc2UuICBXZQorICAgICAgLy8gZGVmaW5lIF9IYXNoX2NvZGVfYmFzZTo6X01fc3dhcCBiZWNhdXNlIGRpZmZlcmVudCBzcGVjaWFsaXphdGlvbnMKKyAgICAgIC8vIGhhdmUgZGlmZmVyZW50IG1lbWJlcnMuCisgICAgICBfX2RldGFpbDo6X0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwlfSDEsIF9IMiwgX0hhc2gsIF9fY2hjPjo6X01fc3dhcChfX3gpOworCisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA0MzEuIFN3YXBwaW5nIGNvbnRhaW5lcnMgd2l0aCB1bmVxdWFsIGFsbG9jYXRvcnMuCisgICAgICBzdGQ6Ol9fYWxsb2Nfc3dhcDxfTm9kZV9hbGxvY2F0b3JfdHlwZT46Ol9TX2RvX2l0KF9NX25vZGVfYWxsb2NhdG9yLAorCQkJCQkJCV9feC5fTV9ub2RlX2FsbG9jYXRvcik7CisKKyAgICAgIHN0ZDo6c3dhcChfTV9yZWhhc2hfcG9saWN5LCBfX3guX01fcmVoYXNoX3BvbGljeSk7CisgICAgICBzdGQ6OnN3YXAoX01fYnVja2V0cywgX194Ll9NX2J1Y2tldHMpOworICAgICAgc3RkOjpzd2FwKF9NX2J1Y2tldF9jb3VudCwgX194Ll9NX2J1Y2tldF9jb3VudCk7CisgICAgICBzdGQ6OnN3YXAoX01fZWxlbWVudF9jb3VudCwgX194Ll9NX2VsZW1lbnRfY291bnQpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfX3JlaGFzaF9wb2xpY3koY29uc3QgX1JlaGFzaFBvbGljeSYgX19wb2wpCisgICAgeworICAgICAgX01fcmVoYXNoX3BvbGljeSA9IF9fcG9sOworICAgICAgc2l6ZV90eXBlIF9fbl9ia3QgPSBfX3BvbC5fTV9ia3RfZm9yX2VsZW1lbnRzKF9NX2VsZW1lbnRfY291bnQpOworICAgICAgaWYgKF9fbl9ia3QgPiBfTV9idWNrZXRfY291bnQpCisJX01fcmVoYXNoKF9fbl9ia3QpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBmaW5kKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZShfTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIHJldHVybiBfX3AgPyBpdGVyYXRvcihfX3AsIF9NX2J1Y2tldHMgKyBfX24pIDogdGhpcy0+ZW5kKCk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9faykgY29uc3QKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBfTm9kZSogX19wID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpOworICAgICAgcmV0dXJuIF9fcCA/IGNvbnN0X2l0ZXJhdG9yKF9fcCwgX01fYnVja2V0cyArIF9fbikgOiB0aGlzLT5lbmQoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OnNpemVfdHlwZQorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX2spIGNvbnN0CisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgc3RkOjpzaXplX3QgX19yZXN1bHQgPSAwOworICAgICAgZm9yIChfTm9kZSogX19wID0gX01fYnVja2V0c1tfX25dOyBfX3A7IF9fcCA9IF9fcC0+X01fbmV4dCkKKwlpZiAodGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgX19wKSkKKwkgICsrX19yZXN1bHQ7CisgICAgICByZXR1cm4gX19yZXN1bHQ7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yLAorCSAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLAorCQkJCSAgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLAorCQkJCSAgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCQkgIF9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yPgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVxdWFsX3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX2spCisgICAgeworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSA9IHRoaXMtPl9NX2hhc2hfY29kZShfX2spOworICAgICAgc3RkOjpzaXplX3QgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX05vZGUqKiBfX2hlYWQgPSBfTV9idWNrZXRzICsgX19uOworICAgICAgX05vZGUqIF9fcCA9IF9NX2ZpbmRfbm9kZSgqX19oZWFkLCBfX2ssIF9fY29kZSk7CisKKyAgICAgIGlmIChfX3ApCisJeworCSAgX05vZGUqIF9fcDEgPSBfX3AtPl9NX25leHQ7CisJICBmb3IgKDsgX19wMTsgX19wMSA9IF9fcDEtPl9NX25leHQpCisJICAgIGlmICghdGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgX19wMSkpCisJICAgICAgYnJlYWs7CisKKwkgIGl0ZXJhdG9yIF9fZmlyc3QoX19wLCBfX2hlYWQpOworCSAgaXRlcmF0b3IgX19sYXN0KF9fcDEsIF9faGVhZCk7CisJICBpZiAoIV9fcDEpCisJICAgIF9fbGFzdC5fTV9pbmNyX2J1Y2tldCgpOworCSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKF9fZmlyc3QsIF9fbGFzdCk7CisJfQorICAgICAgZWxzZQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcih0aGlzLT5lbmQoKSwgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvciwKKwkgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwKKwkJCQkgIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwKKwkJCQkgIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQkJICBfX2NoYywgX19jaXQsIF9fdWs+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX19rKSBjb25zdAorICAgIHsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX01fYnVja2V0X2NvdW50KTsKKyAgICAgIF9Ob2RlKiogX19oZWFkID0gX01fYnVja2V0cyArIF9fbjsKKyAgICAgIF9Ob2RlKiBfX3AgPSBfTV9maW5kX25vZGUoKl9faGVhZCwgX19rLCBfX2NvZGUpOworCisgICAgICBpZiAoX19wKQorCXsKKwkgIF9Ob2RlKiBfX3AxID0gX19wLT5fTV9uZXh0OworCSAgZm9yICg7IF9fcDE7IF9fcDEgPSBfX3AxLT5fTV9uZXh0KQorCSAgICBpZiAoIXRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcDEpKQorCSAgICAgIGJyZWFrOworCisJICBjb25zdF9pdGVyYXRvciBfX2ZpcnN0KF9fcCwgX19oZWFkKTsKKwkgIGNvbnN0X2l0ZXJhdG9yIF9fbGFzdChfX3AxLCBfX2hlYWQpOworCSAgaWYgKCFfX3AxKQorCSAgICBfX2xhc3QuX01faW5jcl9idWNrZXQoKTsKKwkgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihfX2ZpcnN0LCBfX2xhc3QpOworCX0KKyAgICAgIGVsc2UKKwlyZXR1cm4gc3RkOjptYWtlX3BhaXIodGhpcy0+ZW5kKCksIHRoaXMtPmVuZCgpKTsKKyAgICB9CisKKyAgLy8gRmluZCB0aGUgbm9kZSB3aG9zZSBrZXkgY29tcGFyZXMgZXF1YWwgdG8gaywgYmVnaW5uaW5nIHRoZSBzZWFyY2gKKyAgLy8gYXQgcCAodXN1YWxseSB0aGUgaGVhZCBvZiBhIGJ1Y2tldCkuICBSZXR1cm4gbmlsIGlmIG5vIG5vZGUgaXMgZm91bmQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LAorCQkJX0VxdWFsLCBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjpfTm9kZSoKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9maW5kX25vZGUoX05vZGUqIF9fcCwgY29uc3Qga2V5X3R5cGUmIF9faywKKwkJdHlwZW5hbWUgX0hhc2h0YWJsZTo6X0hhc2hfY29kZV90eXBlIF9fY29kZSkgY29uc3QKKyAgICB7CisgICAgICBmb3IgKDsgX19wOyBfX3AgPSBfX3AtPl9NX25leHQpCisJaWYgKHRoaXMtPl9NX2NvbXBhcmUoX19rLCBfX2NvZGUsIF9fcCkpCisJICByZXR1cm4gX19wOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAvLyBJbnNlcnQgdiBpbiBidWNrZXQgbiAoYXNzdW1lcyBubyBlbGVtZW50IHdpdGggaXRzIGtleSBhbHJlYWR5IHByZXNlbnQpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9pbnNlcnRfYnVja2V0KGNvbnN0IHZhbHVlX3R5cGUmIF9fdiwgc2l6ZV90eXBlIF9fbiwKKwkJICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUpCisgICAgeworICAgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PiBfX2RvX3JlaGFzaAorCT0gX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfTV9idWNrZXRfY291bnQsCisJCQkJCSAgX01fZWxlbWVudF9jb3VudCwgMSk7CisKKyAgICAgIC8vIEFsbG9jYXRlIHRoZSBuZXcgbm9kZSBiZWZvcmUgZG9pbmcgdGhlIHJlaGFzaCBzbyB0aGF0IHdlIGRvbid0CisgICAgICAvLyBkbyBhIHJlaGFzaCBpZiB0aGUgYWxsb2NhdGlvbiB0aHJvd3MuCisgICAgICBfTm9kZSogX19uZXdfbm9kZSA9IF9NX2FsbG9jYXRlX25vZGUoX192KTsKKworICAgICAgX190cnkKKwl7CisJICBpZiAoX19kb19yZWhhc2guZmlyc3QpCisJICAgIHsKKwkgICAgICBjb25zdCBrZXlfdHlwZSYgX19rID0gdGhpcy0+X01fZXh0cmFjdChfX3YpOworCSAgICAgIF9fbiA9IHRoaXMtPl9NX2J1Y2tldF9pbmRleChfX2ssIF9fY29kZSwgX19kb19yZWhhc2guc2Vjb25kKTsKKwkgICAgICBfTV9yZWhhc2goX19kb19yZWhhc2guc2Vjb25kKTsKKwkgICAgfQorCisJICBfX25ld19ub2RlLT5fTV9uZXh0ID0gX01fYnVja2V0c1tfX25dOworCSAgdGhpcy0+X01fc3RvcmVfY29kZShfX25ld19ub2RlLCBfX2NvZGUpOworCSAgX01fYnVja2V0c1tfX25dID0gX19uZXdfbm9kZTsKKwkgICsrX01fZWxlbWVudF9jb3VudDsKKwkgIHJldHVybiBpdGVyYXRvcihfX25ld19ub2RlLCBfTV9idWNrZXRzICsgX19uKTsKKwl9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBfTV9kZWFsbG9jYXRlX25vZGUoX19uZXdfbm9kZSk7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIC8vIEluc2VydCB2IGlmIG5vIGVsZW1lbnQgd2l0aCBpdHMga2V5IGlzIGFscmVhZHkgcHJlc2VudC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICBzdGQ6OnBhaXI8dHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsCisJCQkJICBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsCisJCQkJICBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJCSAgX19jaGMsIF9fY2l0LCBfX3VrPjo6aXRlcmF0b3IsIGJvb2w+CisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgIF9NX2luc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3YsIHN0ZDo6dHIxOjp0cnVlX3R5cGUpCisgICAgeworICAgICAgY29uc3Qga2V5X3R5cGUmIF9fayA9IHRoaXMtPl9NX2V4dHJhY3QoX192KTsKKyAgICAgIHR5cGVuYW1lIF9IYXNodGFibGU6Ol9IYXNoX2NvZGVfdHlwZSBfX2NvZGUgPSB0aGlzLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHNpemVfdHlwZSBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisKKyAgICAgIGlmIChfTm9kZSogX19wID0gX01fZmluZF9ub2RlKF9NX2J1Y2tldHNbX19uXSwgX19rLCBfX2NvZGUpKQorCXJldHVybiBzdGQ6Om1ha2VfcGFpcihpdGVyYXRvcihfX3AsIF9NX2J1Y2tldHMgKyBfX24pLCBmYWxzZSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoX01faW5zZXJ0X2J1Y2tldChfX3YsIF9fbiwgX19jb2RlKSwgdHJ1ZSk7CisgICAgfQorCisgIC8vIEluc2VydCB2IHVuY29uZGl0aW9uYWxseS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46Oml0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgX01faW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9fdiwgc3RkOjp0cjE6OmZhbHNlX3R5cGUpCisgICAgeworICAgICAgc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PiBfX2RvX3JlaGFzaAorCT0gX01fcmVoYXNoX3BvbGljeS5fTV9uZWVkX3JlaGFzaChfTV9idWNrZXRfY291bnQsCisJCQkJCSAgX01fZWxlbWVudF9jb3VudCwgMSk7CisgICAgICBpZiAoX19kb19yZWhhc2guZmlyc3QpCisJX01fcmVoYXNoKF9fZG9fcmVoYXNoLnNlY29uZCk7CisKKyAgICAgIGNvbnN0IGtleV90eXBlJiBfX2sgPSB0aGlzLT5fTV9leHRyYWN0KF9fdik7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzaXplX3R5cGUgX19uID0gdGhpcy0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLCBfTV9idWNrZXRfY291bnQpOworCisgICAgICAvLyBGaXJzdCBmaW5kIHRoZSBub2RlLCBhdm9pZCBsZWFraW5nIG5ld19ub2RlIGlmIGNvbXBhcmUgdGhyb3dzLgorICAgICAgX05vZGUqIF9fcHJldiA9IF9NX2ZpbmRfbm9kZShfTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIF9Ob2RlKiBfX25ld19ub2RlID0gX01fYWxsb2NhdGVfbm9kZShfX3YpOworCisgICAgICBpZiAoX19wcmV2KQorCXsKKwkgIF9fbmV3X25vZGUtPl9NX25leHQgPSBfX3ByZXYtPl9NX25leHQ7CisJICBfX3ByZXYtPl9NX25leHQgPSBfX25ld19ub2RlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBfX25ld19ub2RlLT5fTV9uZXh0ID0gX01fYnVja2V0c1tfX25dOworCSAgX01fYnVja2V0c1tfX25dID0gX19uZXdfbm9kZTsKKwl9CisgICAgICB0aGlzLT5fTV9zdG9yZV9jb2RlKF9fbmV3X25vZGUsIF9fY29kZSk7CisKKyAgICAgICsrX01fZWxlbWVudF9jb3VudDsKKyAgICAgIHJldHVybiBpdGVyYXRvcihfX25ld19ub2RlLCBfTV9idWNrZXRzICsgX19uKTsKKyAgICB9CisKKyAgLy8gRm9yIGVyYXNlKGl0ZXJhdG9yKSBhbmQgZXJhc2UoY29uc3RfaXRlcmF0b3IpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBfTV9lcmFzZV9ub2RlKF9Ob2RlKiBfX3AsIF9Ob2RlKiogX19iKQorICAgIHsKKyAgICAgIF9Ob2RlKiBfX2N1ciA9ICpfX2I7CisgICAgICBpZiAoX19jdXIgPT0gX19wKQorCSpfX2IgPSBfX2N1ci0+X01fbmV4dDsKKyAgICAgIGVsc2UKKwl7CisJICBfTm9kZSogX19uZXh0ID0gX19jdXItPl9NX25leHQ7CisJICB3aGlsZSAoX19uZXh0ICE9IF9fcCkKKwkgICAgeworCSAgICAgIF9fY3VyID0gX19uZXh0OworCSAgICAgIF9fbmV4dCA9IF9fY3VyLT5fTV9uZXh0OworCSAgICB9CisJICBfX2N1ci0+X01fbmV4dCA9IF9fbmV4dC0+X01fbmV4dDsKKwl9CisKKyAgICAgIF9NX2RlYWxsb2NhdGVfbm9kZShfX3ApOworICAgICAgLS1fTV9lbGVtZW50X2NvdW50OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgdm9pZAorICAgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCSBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgICAgaW5zZXJ0KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKKyAgICAgIHsKKwlzaXplX3R5cGUgX19uX2VsdCA9IF9fZGV0YWlsOjpfX2Rpc3RhbmNlX2Z3KF9fZmlyc3QsIF9fbGFzdCk7CisJc3RkOjpwYWlyPGJvb2wsIHN0ZDo6c2l6ZV90PiBfX2RvX3JlaGFzaAorCSAgPSBfTV9yZWhhc2hfcG9saWN5Ll9NX25lZWRfcmVoYXNoKF9NX2J1Y2tldF9jb3VudCwKKwkJCQkJICAgIF9NX2VsZW1lbnRfY291bnQsIF9fbl9lbHQpOworCWlmIChfX2RvX3JlaGFzaC5maXJzdCkKKwkgIF9NX3JlaGFzaChfX2RvX3JlaGFzaC5zZWNvbmQpOworCisJZm9yICg7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCisJICB0aGlzLT5pbnNlcnQoKl9fZmlyc3QpOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9faXQpCisgICAgeworICAgICAgaXRlcmF0b3IgX19yZXN1bHQgPSBfX2l0OworICAgICAgKytfX3Jlc3VsdDsKKyAgICAgIF9NX2VyYXNlX25vZGUoX19pdC5fTV9jdXJfbm9kZSwgX19pdC5fTV9jdXJfYnVja2V0KTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OmNvbnN0X2l0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19pdCkKKyAgICB7CisgICAgICBjb25zdF9pdGVyYXRvciBfX3Jlc3VsdCA9IF9faXQ7CisgICAgICArK19fcmVzdWx0OworICAgICAgX01fZXJhc2Vfbm9kZShfX2l0Ll9NX2N1cl9ub2RlLCBfX2l0Ll9NX2N1cl9idWNrZXQpOworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHR5cGVuYW1lIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCQkJX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LAorCQkJX19jaGMsIF9fY2l0LCBfX3VrPjo6c2l6ZV90eXBlCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9faykKKyAgICB7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gdGhpcy0+X01faGFzaF9jb2RlKF9fayk7CisgICAgICBzdGQ6OnNpemVfdCBfX24gPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19rLCBfX2NvZGUsIF9NX2J1Y2tldF9jb3VudCk7CisgICAgICBzaXplX3R5cGUgX19yZXN1bHQgPSAwOworCisgICAgICBfTm9kZSoqIF9fc2xvdCA9IF9NX2J1Y2tldHMgKyBfX247CisgICAgICB3aGlsZSAoKl9fc2xvdCAmJiAhdGhpcy0+X01fY29tcGFyZShfX2ssIF9fY29kZSwgKl9fc2xvdCkpCisJX19zbG90ID0gJigoKl9fc2xvdCktPl9NX25leHQpOworCisgICAgICBfTm9kZSoqIF9fc2F2ZWRfc2xvdCA9IDA7CisgICAgICB3aGlsZSAoKl9fc2xvdCAmJiB0aGlzLT5fTV9jb21wYXJlKF9faywgX19jb2RlLCAqX19zbG90KSkKKwl7CisJICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisJICAvLyA1MjYuIElzIGl0IHVuZGVmaW5lZCBpZiBhIGZ1bmN0aW9uIGluIHRoZSBzdGFuZGFyZCBjaGFuZ2VzCisJICAvLyBpbiBwYXJhbWV0ZXJzPworCSAgaWYgKCZ0aGlzLT5fTV9leHRyYWN0KCgqX19zbG90KS0+X01fdikgIT0gJl9faykKKwkgICAgeworCSAgICAgIF9Ob2RlKiBfX3AgPSAqX19zbG90OworCSAgICAgICpfX3Nsb3QgPSBfX3AtPl9NX25leHQ7CisJICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fcCk7CisJICAgICAgLS1fTV9lbGVtZW50X2NvdW50OworCSAgICAgICsrX19yZXN1bHQ7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIF9fc2F2ZWRfc2xvdCA9IF9fc2xvdDsKKwkgICAgICBfX3Nsb3QgPSAmKCgqX19zbG90KS0+X01fbmV4dCk7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChfX3NhdmVkX3Nsb3QpCisJeworCSAgX05vZGUqIF9fcCA9ICpfX3NhdmVkX3Nsb3Q7CisJICAqX19zYXZlZF9zbG90ID0gX19wLT5fTV9uZXh0OworCSAgX01fZGVhbGxvY2F0ZV9ub2RlKF9fcCk7CisJICAtLV9NX2VsZW1lbnRfY291bnQ7CisJICArK19fcmVzdWx0OworCX0KKworICAgICAgcmV0dXJuIF9fcmVzdWx0OworICAgIH0KKworICAvLyA/Pz8gVGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgYnVja2V0CisgIC8vIHN0cnVjdHVyZSwgYnV0IGl0J3Mgbm90IGNsZWFyIHRoYXQgaXQncyB3b3J0aCBkb2luZy4gIEl0IHByb2JhYmx5CisgIC8vIHdvdWxkbid0IGV2ZW4gYmUgYW4gb3B0aW1pemF0aW9uIHVubGVzcyB0aGUgbG9hZCBmYWN0b3IgaXMgbGFyZ2UuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJCQlfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksCisJCQlfX2NoYywgX19jaXQsIF9fdWs+OjppdGVyYXRvcgorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpCisJX19maXJzdCA9IHRoaXMtPmVyYXNlKF9fZmlyc3QpOworICAgICAgcmV0dXJuIF9fbGFzdDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoLCB0eXBlbmFtZSBfUmVoYXNoUG9saWN5LAorCSAgIGJvb2wgX19jaGMsIGJvb2wgX19jaXQsIGJvb2wgX191az4KKyAgICB0eXBlbmFtZSBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkJCV9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwKKwkJCV9fY2hjLCBfX2NpdCwgX191az46OmNvbnN0X2l0ZXJhdG9yCisgICAgX0hhc2h0YWJsZTxfS2V5LCBfVmFsdWUsIF9BbGxvY2F0b3IsIF9FeHRyYWN0S2V5LCBfRXF1YWwsCisJICAgICAgIF9IMSwgX0gyLCBfSGFzaCwgX1JlaGFzaFBvbGljeSwgX19jaGMsIF9fY2l0LCBfX3VrPjo6CisgICAgZXJhc2UoY29uc3RfaXRlcmF0b3IgX19maXJzdCwgY29uc3RfaXRlcmF0b3IgX19sYXN0KQorICAgIHsKKyAgICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkKKwlfX2ZpcnN0ID0gdGhpcy0+ZXJhc2UoX19maXJzdCk7CisgICAgICByZXR1cm4gX19sYXN0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciwgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMiwgdHlwZW5hbWUgX0hhc2gsIHR5cGVuYW1lIF9SZWhhc2hQb2xpY3ksCisJICAgYm9vbCBfX2NoYywgYm9vbCBfX2NpdCwgYm9vbCBfX3VrPgorICAgIHZvaWQKKyAgICBfSGFzaHRhYmxlPF9LZXksIF9WYWx1ZSwgX0FsbG9jYXRvciwgX0V4dHJhY3RLZXksIF9FcXVhbCwKKwkgICAgICAgX0gxLCBfSDIsIF9IYXNoLCBfUmVoYXNoUG9saWN5LCBfX2NoYywgX19jaXQsIF9fdWs+OjoKKyAgICBjbGVhcigpCisgICAgeworICAgICAgX01fZGVhbGxvY2F0ZV9ub2RlcyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworICAgICAgX01fZWxlbWVudF9jb3VudCA9IDA7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIHJlaGFzaChzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9NX3JlaGFzaChzdGQ6Om1heChfTV9yZWhhc2hfcG9saWN5Ll9NX25leHRfYmt0KF9fbiksCisJCQkgX01fcmVoYXNoX3BvbGljeS5fTV9ia3RfZm9yX2VsZW1lbnRzKF9NX2VsZW1lbnRfY291bnQKKwkJCQkJCQkgICAgICArIDEpKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwgdHlwZW5hbWUgX1JlaGFzaFBvbGljeSwKKwkgICBib29sIF9fY2hjLCBib29sIF9fY2l0LCBib29sIF9fdWs+CisgICAgdm9pZAorICAgIF9IYXNodGFibGU8X0tleSwgX1ZhbHVlLCBfQWxsb2NhdG9yLCBfRXh0cmFjdEtleSwgX0VxdWFsLAorCSAgICAgICBfSDEsIF9IMiwgX0hhc2gsIF9SZWhhc2hQb2xpY3ksIF9fY2hjLCBfX2NpdCwgX191az46OgorICAgIF9NX3JlaGFzaChzaXplX3R5cGUgX19uKQorICAgIHsKKyAgICAgIF9Ob2RlKiogX19uZXdfYXJyYXkgPSBfTV9hbGxvY2F0ZV9idWNrZXRzKF9fbik7CisgICAgICBfX3RyeQorCXsKKwkgIGZvciAoc2l6ZV90eXBlIF9faSA9IDA7IF9faSA8IF9NX2J1Y2tldF9jb3VudDsgKytfX2kpCisJICAgIHdoaWxlIChfTm9kZSogX19wID0gX01fYnVja2V0c1tfX2ldKQorCSAgICAgIHsKKwkJc3RkOjpzaXplX3QgX19uZXdfaW5kZXggPSB0aGlzLT5fTV9idWNrZXRfaW5kZXgoX19wLCBfX24pOworCQlfTV9idWNrZXRzW19faV0gPSBfX3AtPl9NX25leHQ7CisJCV9fcC0+X01fbmV4dCA9IF9fbmV3X2FycmF5W19fbmV3X2luZGV4XTsKKwkJX19uZXdfYXJyYXlbX19uZXdfaW5kZXhdID0gX19wOworCSAgICAgIH0KKwkgIF9NX2RlYWxsb2NhdGVfYnVja2V0cyhfTV9idWNrZXRzLCBfTV9idWNrZXRfY291bnQpOworCSAgX01fYnVja2V0X2NvdW50ID0gX19uOworCSAgX01fYnVja2V0cyA9IF9fbmV3X2FycmF5OworCX0KKyAgICAgIF9fY2F0Y2goLi4uKQorCXsKKwkgIC8vIEEgZmFpbHVyZSBoZXJlIG1lYW5zIHRoYXQgYSBoYXNoIGZ1bmN0aW9uIHRocmV3IGFuIGV4Y2VwdGlvbi4KKwkgIC8vIFdlIGNhbid0IHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlIHdpdGhvdXQgY2FsbGluZyB0aGUgaGFzaAorCSAgLy8gZnVuY3Rpb24gYWdhaW4sIHNvIHRoZSBvbmx5IHNlbnNpYmxlIHJlY292ZXJ5IGlzIHRvIGRlbGV0ZQorCSAgLy8gZXZlcnl0aGluZy4KKwkgIF9NX2RlYWxsb2NhdGVfbm9kZXMoX19uZXdfYXJyYXksIF9fbik7CisJICBfTV9kZWFsbG9jYXRlX2J1Y2tldHMoX19uZXdfYXJyYXksIF9fbik7CisJICBfTV9kZWFsbG9jYXRlX25vZGVzKF9NX2J1Y2tldHMsIF9NX2J1Y2tldF9jb3VudCk7CisJICBfTV9lbGVtZW50X2NvdW50ID0gMDsKKwkgIF9fdGhyb3dfZXhjZXB0aW9uX2FnYWluOworCX0KKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgdHIxCit9IC8vIG5hbWVzcGFjZSBzdGQKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9IQVNIVEFCTEVfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvaGFzaHRhYmxlX3BvbGljeS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvaGFzaHRhYmxlX3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjhmZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9oYXNodGFibGVfcG9saWN5LmgKQEAgLTAsMCArMSw3ODMgQEAKKy8vIEludGVybmFsIHBvbGljeSBoZWFkZXIgZm9yIFRSMSB1bm9yZGVyZWRfc2V0IGFuZCB1bm9yZGVyZWRfbWFwIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL2hhc2h0YWJsZV9wb2xpY3kuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIAorICogIEBoZWFkZXJuYW1le3RyMS91bm9yZGVyZWRfbWFwLCB0cjEvdW5vcmRlcmVkX3NldH0KKyAqLworCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sgCituYW1lc3BhY2UgdHIxCit7CituYW1lc3BhY2UgX19kZXRhaWwKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uOiByZXR1cm4gZGlzdGFuY2UoZmlyc3QsIGxhc3QpIGZvciBmb3J3YXJkCisgIC8vIGl0ZXJhdG9ycywgb3IgMCBmb3IgaW5wdXQgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTxjbGFzcyBfSXRlcmF0b3I+CisgICAgaW5saW5lIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQorICAgIF9fZGlzdGFuY2VfZncoX0l0ZXJhdG9yIF9fZmlyc3QsIF9JdGVyYXRvciBfX2xhc3QsCisJCSAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpCisgICAgeyByZXR1cm4gMDsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCwKKwkJICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnKQorICAgIHsgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoX19maXJzdCwgX19sYXN0KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9JdGVyYXRvcj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgX19kaXN0YW5jZV9mdyhfSXRlcmF0b3IgX19maXJzdCwgX0l0ZXJhdG9yIF9fbGFzdCkKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9UYWc7CisgICAgICByZXR1cm4gX19kaXN0YW5jZV9mdyhfX2ZpcnN0LCBfX2xhc3QsIF9UYWcoKSk7CisgICAgfQorCisgIC8vIEF1eGlsaWFyeSB0eXBlcyB1c2VkIGZvciBhbGwgaW5zdGFudGlhdGlvbnMgb2YgX0hhc2h0YWJsZTogbm9kZXMKKyAgLy8gYW5kIGl0ZXJhdG9ycy4KKyAgCisgIC8vIE5vZGVzLCB1c2VkIHRvIHdyYXAgZWxlbWVudHMgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgQSBwb2xpY3kKKyAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUgY29udHJvbHMgd2hldGhlcgorICAvLyBub2RlcyBhbHNvIHN0b3JlIGEgaGFzaCBjb2RlLiBJbiBzb21lIGNhc2VzIChlLmcuIHN0cmluZ3MpIHRoaXMKKyAgLy8gbWF5IGJlIGEgcGVyZm9ybWFuY2Ugd2luLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgc3RydWN0IF9IYXNoX25vZGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlPgorICAgIHN0cnVjdCBfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4KKyAgICB7CisgICAgICBfVmFsdWUgICAgICAgX01fdjsKKyAgICAgIHN0ZDo6c2l6ZV90ICBfTV9oYXNoX2NvZGU7CisgICAgICBfSGFzaF9ub2RlKiAgX01fbmV4dDsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZT4KKyAgICBzdHJ1Y3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPgorICAgIHsKKyAgICAgIF9WYWx1ZSAgICAgICBfTV92OworICAgICAgX0hhc2hfbm9kZSogIF9NX25leHQ7CisgICAgfTsKKworICAvLyBMb2NhbCBpdGVyYXRvcnMsIHVzZWQgdG8gaXRlcmF0ZSB3aXRoaW4gYSBidWNrZXQgYnV0IG5vdCBiZXR3ZWVuCisgIC8vIGJ1Y2tldHMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgX05vZGVfaXRlcmF0b3JfYmFzZShfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX01fY3VyKF9fcCkgeyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luY3IoKQorICAgICAgeyBfTV9jdXIgPSBfTV9jdXItPl9NX25leHQ7IH0KKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiAgX01fY3VyOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4mIF9feSkKKyAgICB7IHJldHVybiBfX3guX01fY3VyID09IF9feS5fTV9jdXI7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXIgIT0gX195Ll9NX2N1cjsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgIGNvbnN0IF9WYWx1ZSosIF9WYWx1ZSo+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZQorICAgICAgX19nbnVfY3h4OjpfX2NvbmRpdGlvbmFsX3R5cGU8X19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkJICAgIGNvbnN0IF9WYWx1ZSYsIF9WYWx1ZSY+OjpfX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgICBfTm9kZV9pdGVyYXRvcigpCisgICAgICA6IF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9Ob2RlX2l0ZXJhdG9yKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPiogX19wKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX19wKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyLT5fTV92OyB9CisgIAorICAgICAgcG9pbnRlcgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0CisgICAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKHRoaXMtPl9NX2N1ci0+X01fdik7IH0KKworICAgICAgX05vZGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgCisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsgCisgICAgICB9CisgIAorICAgICAgX05vZGVfaXRlcmF0b3IKKyAgICAgIG9wZXJhdG9yKysoaW50KQorICAgICAgeyAKKwlfTm9kZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfTm9kZV9jb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIF9Ob2RlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIGNvbnN0IF9WYWx1ZSYgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgX05vZGVfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oMCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfTm9kZV9jb25zdF9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCkKKyAgICAgIDogX05vZGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCkgeyB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9Ob2RlX2l0ZXJhdG9yPF9WYWx1ZSwgX19jb25zdGFudF9pdGVyYXRvcnMsCisJCQkgICBfX2NhY2hlPiYgX194KQorICAgICAgOiBfTm9kZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oX194Ll9NX2N1cikgeyB9CisKKyAgICAgIHJlZmVyZW5jZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2N1ci0+X01fdjsgfQorICAKKyAgICAgIHBvaW50ZXIKKyAgICAgIG9wZXJhdG9yLT4oKSBjb25zdAorICAgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZih0aGlzLT5fTV9jdXItPl9NX3YpOyB9CisKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3IrKygpCisgICAgICB7IAorCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gKnRoaXM7IAorICAgICAgfQorICAKKyAgICAgIF9Ob2RlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX05vZGVfY29uc3RfaXRlcmF0b3IgX190bXAoKnRoaXMpOworCXRoaXMtPl9NX2luY3IoKTsKKwlyZXR1cm4gX190bXA7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlCisgICAgeworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPiogX19ub2RlLAorCQkJICAgICAgIF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYnVja2V0KQorICAgICAgOiBfTV9jdXJfbm9kZShfX25vZGUpLCBfTV9jdXJfYnVja2V0KF9fYnVja2V0KSB7IH0KKworICAgICAgdm9pZAorICAgICAgX01faW5jcigpCisgICAgICB7CisJX01fY3VyX25vZGUgPSBfTV9jdXJfbm9kZS0+X01fbmV4dDsKKwlpZiAoIV9NX2N1cl9ub2RlKQorCSAgX01faW5jcl9idWNrZXQoKTsKKyAgICAgIH0KKworICAgICAgdm9pZAorICAgICAgX01faW5jcl9idWNrZXQoKTsKKworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiAgIF9NX2N1cl9ub2RlOworICAgICAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogIF9NX2N1cl9idWNrZXQ7CisgICAgfTsKKworICAvLyBHbG9iYWwgaXRlcmF0b3JzLCB1c2VkIGZvciBhcmJpdHJhcnkgaXRlcmF0aW9uIHdpdGhpbiBhIGhhc2gKKyAgLy8gdGFibGUuICBMYXJnZXIgYW5kIG1vcmUgZXhwZW5zaXZlIHRoYW4gbG9jYWwgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jYWNoZT4KKyAgICB2b2lkCisgICAgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT46OgorICAgIF9NX2luY3JfYnVja2V0KCkKKyAgICB7CisgICAgICArK19NX2N1cl9idWNrZXQ7CisKKyAgICAgIC8vIFRoaXMgbG9vcCByZXF1aXJlcyB0aGUgYnVja2V0IGFycmF5IHRvIGhhdmUgYSBub24tbnVsbCBzZW50aW5lbC4KKyAgICAgIHdoaWxlICghKl9NX2N1cl9idWNrZXQpCisJKytfTV9jdXJfYnVja2V0OworICAgICAgX01fY3VyX25vZGUgPSAqX01fY3VyX2J1Y2tldDsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1ZhbHVlLCBib29sIF9fY2FjaGU+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3gsCisJICAgICAgIGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+JiBfX3kpCisgICAgeyByZXR1cm4gX194Ll9NX2N1cl9ub2RlID09IF9feS5fTV9jdXJfbm9kZTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NhY2hlPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX194LAorCSAgICAgICBjb25zdCBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPiYgX195KQorICAgIHsgcmV0dXJuIF9feC5fTV9jdXJfbm9kZSAhPSBfX3kuX01fY3VyX25vZGU7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVmFsdWUsIGJvb2wgX19jb25zdGFudF9pdGVyYXRvcnMsIGJvb2wgX19jYWNoZT4KKyAgICBzdHJ1Y3QgX0hhc2h0YWJsZV9pdGVyYXRvcgorICAgIDogcHVibGljIF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+CisgICAgeworICAgICAgdHlwZWRlZiBfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkgICAgY29uc3QgX1ZhbHVlKiwgX1ZhbHVlKj46Ol9fdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTxfX2NvbnN0YW50X2l0ZXJhdG9ycywKKwkJCQkgICAgY29uc3QgX1ZhbHVlJiwgX1ZhbHVlJj46Ol9fdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3IoKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwLCAwKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCSAgX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3AsIF9fYikgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yKF9IYXNoX25vZGU8X1ZhbHVlLCBfX2NhY2hlPioqIF9fYikKKyAgICAgIDogX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4oKl9fYiwgX19iKSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyX25vZGUtPl9NX3Y7IH0KKyAgCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyX25vZGUtPl9NX3YpOyB9CisKKyAgICAgIF9IYXNodGFibGVfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgCisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBfSGFzaHRhYmxlX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX0hhc2h0YWJsZV9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9WYWx1ZSwgYm9vbCBfX2NvbnN0YW50X2l0ZXJhdG9ycywgYm9vbCBfX2NhY2hlPgorICAgIHN0cnVjdCBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZV9pdGVyYXRvcl9iYXNlPF9WYWx1ZSwgX19jYWNoZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgX1ZhbHVlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBfVmFsdWUmICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgICAgICAgICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigwLCAwKSB7IH0KKworICAgICAgX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvcihfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qIF9fcCwKKwkJCQlfSGFzaF9ub2RlPF9WYWx1ZSwgX19jYWNoZT4qKiBfX2IpCisgICAgICA6IF9IYXNodGFibGVfaXRlcmF0b3JfYmFzZTxfVmFsdWUsIF9fY2FjaGU+KF9fcCwgX19iKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3IoX0hhc2hfbm9kZTxfVmFsdWUsIF9fY2FjaGU+KiogX19iKQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPigqX19iLCBfX2IpIHsgfQorCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yKGNvbnN0IF9IYXNodGFibGVfaXRlcmF0b3I8X1ZhbHVlLAorCQkJCV9fY29uc3RhbnRfaXRlcmF0b3JzLCBfX2NhY2hlPiYgX194KQorICAgICAgOiBfSGFzaHRhYmxlX2l0ZXJhdG9yX2Jhc2U8X1ZhbHVlLCBfX2NhY2hlPihfX3guX01fY3VyX25vZGUsCisJCQkJCQkgIF9feC5fTV9jdXJfYnVja2V0KSB7IH0KKworICAgICAgcmVmZXJlbmNlCisgICAgICBvcGVyYXRvciooKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+X01fY3VyX25vZGUtPl9NX3Y7IH0KKyAgCisgICAgICBwb2ludGVyCisgICAgICBvcGVyYXRvci0+KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YodGhpcy0+X01fY3VyX25vZGUtPl9NX3YpOyB9CisKKyAgICAgIF9IYXNodGFibGVfY29uc3RfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCkKKyAgICAgIHsgCisJdGhpcy0+X01faW5jcigpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgCisgICAgICBfSGFzaHRhYmxlX2NvbnN0X2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCkKKyAgICAgIHsgCisJX0hhc2h0YWJsZV9jb25zdF9pdGVyYXRvciBfX3RtcCgqdGhpcyk7CisJdGhpcy0+X01faW5jcigpOworCXJldHVybiBfX3RtcDsKKyAgICAgIH0KKyAgICB9OworCisKKyAgLy8gTWFueSBvZiBjbGFzcyB0ZW1wbGF0ZSBfSGFzaHRhYmxlJ3MgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcG9saWN5CisgIC8vIGNsYXNzZXMuICBUaGVzZSBhcmUgZGVmYXVsdHMgZm9yIHRoZSBwb2xpY2llcy4KKworICAvLyBEZWZhdWx0IHJhbmdlIGhhc2hpbmcgZnVuY3Rpb246IHVzZSBkaXZpc2lvbiB0byBmb2xkIGEgbGFyZ2UgbnVtYmVyCisgIC8vIGludG8gdGhlIHJhbmdlIFswLCBOKS4KKyAgc3RydWN0IF9Nb2RfcmFuZ2VfaGFzaGluZworICB7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCBmaXJzdF9hcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCByZXN1bHRfdHlwZTsKKworICAgIHJlc3VsdF90eXBlCisgICAgb3BlcmF0b3IoKShmaXJzdF9hcmd1bWVudF90eXBlIF9fbnVtLCBzZWNvbmRfYXJndW1lbnRfdHlwZSBfX2RlbikgY29uc3QKKyAgICB7IHJldHVybiBfX251bSAlIF9fZGVuOyB9CisgIH07CisKKyAgLy8gRGVmYXVsdCByYW5nZWQgaGFzaCBmdW5jdGlvbiBILiAgSW4gcHJpbmNpcGxlIGl0IHNob3VsZCBiZSBhCisgIC8vIGZ1bmN0aW9uIG9iamVjdCBjb21wb3NlZCBmcm9tIG9iamVjdHMgb2YgdHlwZSBIMSBhbmQgSDIgc3VjaCB0aGF0CisgIC8vIGgoaywgTikgPSBoMihoMShrKSwgTiksIGJ1dCB0aGF0IHdvdWxkIG1lYW4gbWFraW5nIGV4dHJhIGNvcGllcyBvZgorICAvLyBoMSBhbmQgaDIuICBTbyBpbnN0ZWFkIHdlJ2xsIGp1c3QgdXNlIGEgdGFnIHRvIHRlbGwgY2xhc3MgdGVtcGxhdGUKKyAgLy8gaGFzaHRhYmxlIHRvIGRvIHRoYXQgY29tcG9zaXRpb24uCisgIHN0cnVjdCBfRGVmYXVsdF9yYW5nZWRfaGFzaCB7IH07CisKKyAgLy8gRGVmYXVsdCB2YWx1ZSBmb3IgcmVoYXNoIHBvbGljeS4gIEJ1Y2tldCBzaXplIGlzICh1c3VhbGx5KSB0aGUKKyAgLy8gc21hbGxlc3QgcHJpbWUgdGhhdCBrZWVwcyB0aGUgbG9hZCBmYWN0b3Igc21hbGwgZW5vdWdoLgorICBzdHJ1Y3QgX1ByaW1lX3JlaGFzaF9wb2xpY3kKKyAgeworICAgIF9QcmltZV9yZWhhc2hfcG9saWN5KGZsb2F0IF9feiA9IDEuMCkKKyAgICA6IF9NX21heF9sb2FkX2ZhY3RvcihfX3opLCBfTV9ncm93dGhfZmFjdG9yKDIuZiksIF9NX25leHRfcmVzaXplKDApIHsgfQorCisgICAgZmxvYXQKKyAgICBtYXhfbG9hZF9mYWN0b3IoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX21heF9sb2FkX2ZhY3RvcjsgfSAgICAgIAorCisgICAgLy8gUmV0dXJuIGEgYnVja2V0IHNpemUgbm8gc21hbGxlciB0aGFuIG4uCisgICAgc3RkOjpzaXplX3QKKyAgICBfTV9uZXh0X2JrdChzdGQ6OnNpemVfdCBfX24pIGNvbnN0OworICAgIAorICAgIC8vIFJldHVybiBhIGJ1Y2tldCBjb3VudCBhcHByb3ByaWF0ZSBmb3IgbiBlbGVtZW50cworICAgIHN0ZDo6c2l6ZV90CisgICAgX01fYmt0X2Zvcl9lbGVtZW50cyhzdGQ6OnNpemVfdCBfX24pIGNvbnN0OworICAgIAorICAgIC8vIF9fbl9ia3QgaXMgY3VycmVudCBidWNrZXQgY291bnQsIF9fbl9lbHQgaXMgY3VycmVudCBlbGVtZW50IGNvdW50LAorICAgIC8vIGFuZCBfX25faW5zIGlzIG51bWJlciBvZiBlbGVtZW50cyB0byBiZSBpbnNlcnRlZC4gIERvIHdlIG5lZWQgdG8KKyAgICAvLyBpbmNyZWFzZSBidWNrZXQgY291bnQ/ICBJZiBzbywgcmV0dXJuIG1ha2VfcGFpcih0cnVlLCBuKSwgd2hlcmUgbgorICAgIC8vIGlzIHRoZSBuZXcgYnVja2V0IGNvdW50LiAgSWYgbm90LCByZXR1cm4gbWFrZV9wYWlyKGZhbHNlLCAwKS4KKyAgICBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+CisgICAgX01fbmVlZF9yZWhhc2goc3RkOjpzaXplX3QgX19uX2JrdCwgc3RkOjpzaXplX3QgX19uX2VsdCwKKwkJICAgc3RkOjpzaXplX3QgX19uX2lucykgY29uc3Q7CisKKyAgICBlbnVtIHsgX1Nfbl9wcmltZXMgPSBzaXplb2YodW5zaWduZWQgbG9uZykgIT0gOCA/IDI1NiA6IDI1NiArIDQ4IH07CisKKyAgICBmbG9hdCAgICAgICAgICAgICAgICBfTV9tYXhfbG9hZF9mYWN0b3I7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgX01fZ3Jvd3RoX2ZhY3RvcjsKKyAgICBtdXRhYmxlIHN0ZDo6c2l6ZV90ICBfTV9uZXh0X3Jlc2l6ZTsKKyAgfTsKKworICBleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyBfX3ByaW1lX2xpc3RbXTsKKworICAvLyBYWFggVGhpcyBpcyBhIGhhY2suICBUaGVyZSdzIG5vIGdvb2QgcmVhc29uIGZvciBhbnkgb2YKKyAgLy8gX1ByaW1lX3JlaGFzaF9wb2xpY3kncyBtZW1iZXIgZnVuY3Rpb25zIHRvIGJlIGlubGluZS4gIAorCisgIC8vIFJldHVybiBhIHByaW1lIG5vIHNtYWxsZXIgdGhhbiBuLgorICBpbmxpbmUgc3RkOjpzaXplX3QKKyAgX1ByaW1lX3JlaGFzaF9wb2xpY3k6OgorICBfTV9uZXh0X2JrdChzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBfX3AgPSBzdGQ6Omxvd2VyX2JvdW5kKF9fcHJpbWVfbGlzdCwgX19wcmltZV9saXN0CisJCQkJCQkrIF9TX25fcHJpbWVzLCBfX24pOworICAgIF9NX25leHRfcmVzaXplID0gCisgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oX19idWlsdGluX2NlaWwoKl9fcCAqIF9NX21heF9sb2FkX2ZhY3RvcikpOworICAgIHJldHVybiAqX19wOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBzbWFsbGVzdCBwcmltZSBwIHN1Y2ggdGhhdCBhbHBoYSBwID49IG4sIHdoZXJlIGFscGhhCisgIC8vIGlzIHRoZSBsb2FkIGZhY3Rvci4KKyAgaW5saW5lIHN0ZDo6c2l6ZV90CisgIF9QcmltZV9yZWhhc2hfcG9saWN5OjoKKyAgX01fYmt0X2Zvcl9lbGVtZW50cyhzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgIHsKKyAgICBjb25zdCBmbG9hdCBfX21pbl9ia3RzID0gX19uIC8gX01fbWF4X2xvYWRfZmFjdG9yOworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fcCA9IHN0ZDo6bG93ZXJfYm91bmQoX19wcmltZV9saXN0LCBfX3ByaW1lX2xpc3QKKwkJCQkJCSsgX1Nfbl9wcmltZXMsIF9fbWluX2JrdHMpOworICAgIF9NX25leHRfcmVzaXplID0KKyAgICAgIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PihfX2J1aWx0aW5fY2VpbCgqX19wICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisgICAgcmV0dXJuICpfX3A7CisgIH0KKworICAvLyBGaW5kcyB0aGUgc21hbGxlc3QgcHJpbWUgcCBzdWNoIHRoYXQgYWxwaGEgcCA+IF9fbl9lbHQgKyBfX25faW5zLgorICAvLyBJZiBwID4gX19uX2JrdCwgcmV0dXJuIG1ha2VfcGFpcih0cnVlLCBwKTsgb3RoZXJ3aXNlIHJldHVybgorICAvLyBtYWtlX3BhaXIoZmFsc2UsIDApLiAgSW4gcHJpbmNpcGxlIHRoaXMgaXNuJ3QgdmVyeSBkaWZmZXJlbnQgZnJvbSAKKyAgLy8gX01fYmt0X2Zvcl9lbGVtZW50cy4KKworICAvLyBUaGUgb25seSB0cmlja3kgcGFydCBpcyB0aGF0IHdlJ3JlIGNhY2hpbmcgdGhlIGVsZW1lbnQgY291bnQgYXQKKyAgLy8gd2hpY2ggd2UgbmVlZCB0byByZWhhc2gsIHNvIHdlIGRvbid0IGhhdmUgdG8gZG8gYSBmbG9hdGluZy1wb2ludAorICAvLyBtdWx0aXBseSBmb3IgZXZlcnkgaW5zZXJ0aW9uLgorCisgIGlubGluZSBzdGQ6OnBhaXI8Ym9vbCwgc3RkOjpzaXplX3Q+CisgIF9QcmltZV9yZWhhc2hfcG9saWN5OjoKKyAgX01fbmVlZF9yZWhhc2goc3RkOjpzaXplX3QgX19uX2JrdCwgc3RkOjpzaXplX3QgX19uX2VsdCwKKwkJIHN0ZDo6c2l6ZV90IF9fbl9pbnMpIGNvbnN0CisgIHsKKyAgICBpZiAoX19uX2VsdCArIF9fbl9pbnMgPiBfTV9uZXh0X3Jlc2l6ZSkKKyAgICAgIHsKKwlmbG9hdCBfX21pbl9ia3RzID0gKChmbG9hdChfX25faW5zKSArIGZsb2F0KF9fbl9lbHQpKQorCQkJICAgIC8gX01fbWF4X2xvYWRfZmFjdG9yKTsKKwlpZiAoX19taW5fYmt0cyA+IF9fbl9ia3QpCisJICB7CisJICAgIF9fbWluX2JrdHMgPSBzdGQ6Om1heChfX21pbl9ia3RzLCBfTV9ncm93dGhfZmFjdG9yICogX19uX2JrdCk7CisJICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcqIF9fcCA9CisJICAgICAgc3RkOjpsb3dlcl9ib3VuZChfX3ByaW1lX2xpc3QsIF9fcHJpbWVfbGlzdCArIF9TX25fcHJpbWVzLAorCQkJICAgICAgIF9fbWluX2JrdHMpOworCSAgICBfTV9uZXh0X3Jlc2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PgorCSAgICAgIChfX2J1aWx0aW5fY2VpbCgqX19wICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisJICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCAqX19wKTsKKwkgIH0KKwllbHNlIAorCSAgeworCSAgICBfTV9uZXh0X3Jlc2l6ZSA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PgorCSAgICAgIChfX2J1aWx0aW5fY2VpbChfX25fYmt0ICogX01fbWF4X2xvYWRfZmFjdG9yKSk7CisJICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgMCk7CisJICB9CisgICAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCAwKTsKKyAgfQorCisgIC8vIEJhc2UgY2xhc3NlcyBmb3Igc3RkOjp0cjE6Ol9IYXNodGFibGUuICBXZSBkZWZpbmUgdGhlc2UgYmFzZQorICAvLyBjbGFzc2VzIGJlY2F1c2UgaW4gc29tZSBjYXNlcyB3ZSB3YW50IHRvIGRvIGRpZmZlcmVudCB0aGluZ3MKKyAgLy8gZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBhIHBvbGljeSBjbGFzcy4gIEluIHNvbWUgY2FzZXMgdGhlCisgIC8vIHBvbGljeSBjbGFzcyBhZmZlY3RzIHdoaWNoIG1lbWJlciBmdW5jdGlvbnMgYW5kIG5lc3RlZCB0eXBlZGVmcworICAvLyBhcmUgZGVmaW5lZDsgd2UgaGFuZGxlIHRoYXQgYnkgc3BlY2lhbGl6aW5nIGJhc2UgY2xhc3MgdGVtcGxhdGVzLgorICAvLyBTZXZlcmFsIG9mIHRoZSBiYXNlIGNsYXNzIHRlbXBsYXRlcyBuZWVkIHRvIGFjY2VzcyBvdGhlciBtZW1iZXJzCisgIC8vIG9mIGNsYXNzIHRlbXBsYXRlIF9IYXNodGFibGUsIHNvIHdlIHVzZSB0aGUgImN1cmlvdXNseSByZWN1cnJpbmcKKyAgLy8gdGVtcGxhdGUgcGF0dGVybiIgZm9yIHRoZW0uCisKKyAgLy8gY2xhc3MgdGVtcGxhdGUgX01hcF9iYXNlLiAgSWYgdGhlIGhhc2h0YWJsZSBoYXMgYSB2YWx1ZSB0eXBlIG9mIHRoZQorICAvLyBmb3JtIHBhaXI8VDEsIFQyPiBhbmQgYSBrZXkgZXh0cmFjdGlvbiBwb2xpY3kgdGhhdCByZXR1cm5zIHRoZQorICAvLyBmaXJzdCBwYXJ0IG9mIHRoZSBwYWlyLCB0aGUgaGFzaHRhYmxlIGdldHMgYSBtYXBwZWRfdHlwZSB0eXBlZGVmLgorICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhvc2UgY3JpdGVyaWEgYW5kIGFsc28gaGFzIHVuaXF1ZSBrZXlzLCB0aGVuIGl0CisgIC8vIGFsc28gZ2V0cyBhbiBvcGVyYXRvcltdLiAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwgdHlwZW5hbWUgX0V4LCBib29sIF9fdW5pcXVlLAorCSAgIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9NYXBfYmFzZSB7IH07CisJICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1BhaXIsIHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwgZmFsc2UsIF9IYXNodGFibGU+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUgbWFwcGVkX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfUGFpciwgdHlwZW5hbWUgX0hhc2h0YWJsZT4KKyAgICBzdHJ1Y3QgX01hcF9iYXNlPF9LZXksIF9QYWlyLCBzdGQ6Ol9TZWxlY3Qxc3Q8X1BhaXI+LCB0cnVlLCBfSGFzaHRhYmxlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1BhaXI6OnNlY29uZF90eXBlIG1hcHBlZF90eXBlOworICAgICAgCisgICAgICBtYXBwZWRfdHlwZSYKKyAgICAgIG9wZXJhdG9yW10oY29uc3QgX0tleSYgX19rKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9QYWlyLCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHR5cGVuYW1lIF9NYXBfYmFzZTxfS2V5LCBfUGFpciwgc3RkOjpfU2VsZWN0MXN0PF9QYWlyPiwKKwkJICAgICAgIHRydWUsIF9IYXNodGFibGU+OjptYXBwZWRfdHlwZSYKKyAgICBfTWFwX2Jhc2U8X0tleSwgX1BhaXIsIHN0ZDo6X1NlbGVjdDFzdDxfUGFpcj4sIHRydWUsIF9IYXNodGFibGU+OjoKKyAgICBvcGVyYXRvcltdKGNvbnN0IF9LZXkmIF9faykKKyAgICB7CisgICAgICBfSGFzaHRhYmxlKiBfX2ggPSBzdGF0aWNfY2FzdDxfSGFzaHRhYmxlKj4odGhpcyk7CisgICAgICB0eXBlbmFtZSBfSGFzaHRhYmxlOjpfSGFzaF9jb2RlX3R5cGUgX19jb2RlID0gX19oLT5fTV9oYXNoX2NvZGUoX19rKTsKKyAgICAgIHN0ZDo6c2l6ZV90IF9fbiA9IF9faC0+X01fYnVja2V0X2luZGV4KF9faywgX19jb2RlLAorCQkJCQkgICAgIF9faC0+X01fYnVja2V0X2NvdW50KTsKKworICAgICAgdHlwZW5hbWUgX0hhc2h0YWJsZTo6X05vZGUqIF9fcCA9CisJX19oLT5fTV9maW5kX25vZGUoX19oLT5fTV9idWNrZXRzW19fbl0sIF9faywgX19jb2RlKTsKKyAgICAgIGlmICghX19wKQorCXJldHVybiBfX2gtPl9NX2luc2VydF9idWNrZXQoc3RkOjptYWtlX3BhaXIoX19rLCBtYXBwZWRfdHlwZSgpKSwKKwkJCQkgICAgIF9fbiwgX19jb2RlKS0+c2Vjb25kOworICAgICAgcmV0dXJuIChfX3AtPl9NX3YpLnNlY29uZDsKKyAgICB9CisKKyAgLy8gY2xhc3MgdGVtcGxhdGUgX1JlaGFzaF9iYXNlLiAgR2l2ZSBoYXNodGFibGUgdGhlIG1heF9sb2FkX2ZhY3RvcgorICAvLyBmdW5jdGlvbnMgaWZmIHRoZSByZWhhc2ggcG9saWN5IGlzIF9QcmltZV9yZWhhc2hfcG9saWN5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVoYXNoUG9saWN5LCB0eXBlbmFtZSBfSGFzaHRhYmxlPgorICAgIHN0cnVjdCBfUmVoYXNoX2Jhc2UgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9IYXNodGFibGU+CisgICAgc3RydWN0IF9SZWhhc2hfYmFzZTxfUHJpbWVfcmVoYXNoX3BvbGljeSwgX0hhc2h0YWJsZT4KKyAgICB7CisgICAgICBmbG9hdAorICAgICAgbWF4X2xvYWRfZmFjdG9yKCkgY29uc3QKKyAgICAgIHsKKwljb25zdCBfSGFzaHRhYmxlKiBfX3RoaXMgPSBzdGF0aWNfY2FzdDxjb25zdCBfSGFzaHRhYmxlKj4odGhpcyk7CisJcmV0dXJuIF9fdGhpcy0+X19yZWhhc2hfcG9saWN5KCkubWF4X2xvYWRfZmFjdG9yKCk7CisgICAgICB9CisKKyAgICAgIHZvaWQKKyAgICAgIG1heF9sb2FkX2ZhY3RvcihmbG9hdCBfX3opCisgICAgICB7CisJX0hhc2h0YWJsZSogX190aGlzID0gc3RhdGljX2Nhc3Q8X0hhc2h0YWJsZSo+KHRoaXMpOworCV9fdGhpcy0+X19yZWhhc2hfcG9saWN5KF9QcmltZV9yZWhhc2hfcG9saWN5KF9feikpOworICAgICAgfQorICAgIH07CisKKyAgLy8gQ2xhc3MgdGVtcGxhdGUgX0hhc2hfY29kZV9iYXNlLiAgRW5jYXBzdWxhdGVzIHR3byBwb2xpY3kgaXNzdWVzIHRoYXQKKyAgLy8gYXJlbid0IHF1aXRlIG9ydGhvZ29uYWwuCisgIC8vICAgKDEpIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdXNpbmcgYSByYW5nZWQgaGFzaCBmdW5jdGlvbiBhbmQgdXNpbmcKKyAgLy8gICAgICAgdGhlIGNvbWJpbmF0aW9uIG9mIGEgaGFzaCBmdW5jdGlvbiBhbmQgYSByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uLgorICAvLyAgICAgICBJbiB0aGUgZm9ybWVyIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBzdWNoIHRoaW5ncyBhcyBoYXNoIGNvZGVzLCBzbworICAvLyAgICAgICB3ZSBoYXZlIGEgZHVtbXkgdHlwZSBhcyBwbGFjZWhvbGRlci4KKyAgLy8gICAoMikgV2hldGhlciBvciBub3Qgd2UgY2FjaGUgaGFzaCBjb2Rlcy4gIENhY2hpbmcgaGFzaCBjb2RlcyBpcworICAvLyAgICAgICBtZWFuaW5nbGVzcyBpZiB3ZSBoYXZlIGEgcmFuZ2VkIGhhc2ggZnVuY3Rpb24uCisgIC8vIFdlIGFsc28gcHV0IHRoZSBrZXkgZXh0cmFjdGlvbiBhbmQgZXF1YWxpdHkgY29tcGFyaXNvbiBmdW5jdGlvbiAKKyAgLy8gb2JqZWN0cyBoZXJlLCBmb3IgY29udmVuaWVuY2UuCisgIAorICAvLyBQcmltYXJ5IHRlbXBsYXRlOiB1bnVzZWQgZXhjZXB0IGFzIGEgaG9vayBmb3Igc3BlY2lhbGl6YXRpb25zLiAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaCwKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U7CisKKyAgLy8gU3BlY2lhbGl6YXRpb246IHJhbmdlZCBoYXNoIGZ1bmN0aW9uLCBubyBjYWNoaW5nIGhhc2ggY29kZXMuICBIMQorICAvLyBhbmQgSDIgYXJlIHByb3ZpZGVkIGJ1dCBpZ25vcmVkLiAgV2UgZGVmaW5lIGEgZHVtbXkgaGFzaCBjb2RlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9LZXksIHR5cGVuYW1lIF9WYWx1ZSwKKwkgICB0eXBlbmFtZSBfRXh0cmFjdEtleSwgdHlwZW5hbWUgX0VxdWFsLAorCSAgIHR5cGVuYW1lIF9IMSwgdHlwZW5hbWUgX0gyLCB0eXBlbmFtZSBfSGFzaD4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsCisJCQkgICBfSGFzaCwgZmFsc2U+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmLCBjb25zdCBfSDImLCBjb25zdCBfSGFzaCYgX19oKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01fcmFuZ2VkX2hhc2goX19oKSB7IH0KKworICAgICAgdHlwZWRlZiB2b2lkKiBfSGFzaF9jb2RlX3R5cGU7CisgIAorICAgICAgX0hhc2hfY29kZV90eXBlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rZXkpIGNvbnN0CisgICAgICB7IHJldHVybiAwOyB9CisgIAorICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiBfX2ssIF9IYXNoX2NvZGVfdHlwZSwKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fcmFuZ2VkX2hhc2goX19rLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19wLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9yYW5nZWRfaGFzaChfTV9leHRyYWN0KF9fcC0+X01fdiksIF9fbik7IH0KKyAgCisgICAgICBib29sCisgICAgICBfTV9jb21wYXJlKGNvbnN0IF9LZXkmIF9faywgX0hhc2hfY29kZV90eXBlLAorCQkgX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiogX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZXEoX19rLCBfTV9leHRyYWN0KF9fbi0+X01fdikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiosIF9IYXNoX2NvZGVfdHlwZSkgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9jb3B5X2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIGZhbHNlPiosCisJCSAgIGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qKSBjb25zdAorICAgICAgeyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX0hhc2hfY29kZV9iYXNlJiBfX3gpCisgICAgICB7CisJc3RkOjpzd2FwKF9NX2V4dHJhY3QsIF9feC5fTV9leHRyYWN0KTsKKwlzdGQ6OnN3YXAoX01fZXEsIF9feC5fTV9lcSk7CisJc3RkOjpzd2FwKF9NX3JhbmdlZF9oYXNoLCBfX3guX01fcmFuZ2VkX2hhc2gpOworICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgX0V4dHJhY3RLZXkgIF9NX2V4dHJhY3Q7CisgICAgICBfRXF1YWwgICAgICAgX01fZXE7CisgICAgICBfSGFzaCAgICAgICAgX01fcmFuZ2VkX2hhc2g7CisgICAgfTsKKworCisgIC8vIE5vIHNwZWNpYWxpemF0aW9uIGZvciByYW5nZWQgaGFzaCBmdW5jdGlvbiB3aGlsZSBjYWNoaW5nIGhhc2ggY29kZXMuCisgIC8vIFRoYXQgY29tYmluYXRpb24gaXMgbWVhbmluZ2xlc3MsIGFuZCB0cnlpbmcgdG8gZG8gaXQgaXMgYW4gZXJyb3IuCisgIAorICAKKyAgLy8gU3BlY2lhbGl6YXRpb246IHJhbmdlZCBoYXNoIGZ1bmN0aW9uLCBjYWNoZSBoYXNoIGNvZGVzLiAgVGhpcworICAvLyBjb21iaW5hdGlvbiBpcyBtZWFuaW5nbGVzcywgc28gd2UgcHJvdmlkZSBvbmx5IGEgZGVjbGFyYXRpb24KKyAgLy8gYW5kIG5vIGRlZmluaXRpb24uICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDIsIHR5cGVuYW1lIF9IYXNoPgorICAgIHN0cnVjdCBfSGFzaF9jb2RlX2Jhc2U8X0tleSwgX1ZhbHVlLCBfRXh0cmFjdEtleSwgX0VxdWFsLCBfSDEsIF9IMiwKKwkJCSAgIF9IYXNoLCB0cnVlPjsKKworICAvLyBTcGVjaWFsaXphdGlvbjogaGFzaCBmdW5jdGlvbiBhbmQgcmFuZ2UtaGFzaGluZyBmdW5jdGlvbiwgbm8KKyAgLy8gY2FjaGluZyBvZiBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IFRSMS4gIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfS2V5LCB0eXBlbmFtZSBfVmFsdWUsCisJICAgdHlwZW5hbWUgX0V4dHJhY3RLZXksIHR5cGVuYW1lIF9FcXVhbCwKKwkgICB0eXBlbmFtZSBfSDEsIHR5cGVuYW1lIF9IMj4KKyAgICBzdHJ1Y3QgX0hhc2hfY29kZV9iYXNlPF9LZXksIF9WYWx1ZSwgX0V4dHJhY3RLZXksIF9FcXVhbCwgX0gxLCBfSDIsCisJCQkgICBfRGVmYXVsdF9yYW5nZWRfaGFzaCwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfSDEgaGFzaGVyOworCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDE7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwKKwkJICAgICAgY29uc3QgX0RlZmF1bHRfcmFuZ2VkX2hhc2gmKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01faDEoX19oMSksIF9NX2gyKF9faDIpIHsgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IF9IYXNoX2NvZGVfdHlwZTsKKworICAgICAgX0hhc2hfY29kZV90eXBlCisgICAgICBfTV9oYXNoX2NvZGUoY29uc3QgX0tleSYgX19rKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDEoX19rKTsgfQorICAgICAgCisgICAgICBzdGQ6OnNpemVfdAorICAgICAgX01fYnVja2V0X2luZGV4KGNvbnN0IF9LZXkmLCBfSGFzaF9jb2RlX3R5cGUgX19jLAorCQkgICAgICBzdGQ6OnNpemVfdCBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMihfX2MsIF9fbik7IH0KKworICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKF9NX2gxKF9NX2V4dHJhY3QoX19wLT5fTV92KSksIF9fbik7IH0KKworICAgICAgYm9vbAorICAgICAgX01fY29tcGFyZShjb25zdCBfS2V5JiBfX2ssIF9IYXNoX2NvZGVfdHlwZSwKKwkJIF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qIF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2VxKF9faywgX01fZXh0cmFjdChfX24tPl9NX3YpKTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zdG9yZV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qLCBfSGFzaF9jb2RlX3R5cGUpIGNvbnN0CisgICAgICB7IH0KKworICAgICAgdm9pZAorICAgICAgX01fY29weV9jb2RlKF9IYXNoX25vZGU8X1ZhbHVlLCBmYWxzZT4qLAorCQkgICBjb25zdCBfSGFzaF9ub2RlPF9WYWx1ZSwgZmFsc2U+KikgY29uc3QKKyAgICAgIHsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9IYXNoX2NvZGVfYmFzZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9leHRyYWN0LCBfX3guX01fZXh0cmFjdCk7CisJc3RkOjpzd2FwKF9NX2VxLCBfX3guX01fZXEpOworCXN0ZDo6c3dhcChfTV9oMSwgX194Ll9NX2gxKTsKKwlzdGQ6OnN3YXAoX01faDIsIF9feC5fTV9oMik7CisgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfRXh0cmFjdEtleSAgX01fZXh0cmFjdDsKKyAgICAgIF9FcXVhbCAgICAgICBfTV9lcTsKKyAgICAgIF9IMSAgICAgICAgICBfTV9oMTsKKyAgICAgIF9IMiAgICAgICAgICBfTV9oMjsKKyAgICB9OworCisgIC8vIFNwZWNpYWxpemF0aW9uOiBoYXNoIGZ1bmN0aW9uIGFuZCByYW5nZS1oYXNoaW5nIGZ1bmN0aW9uLCAKKyAgLy8gY2FjaGluZyBoYXNoIGNvZGVzLiAgSCBpcyBwcm92aWRlZCBidXQgaWdub3JlZC4gIFByb3ZpZGVzCisgIC8vIHR5cGVkZWYgYW5kIGFjY2Vzc29yIHJlcXVpcmVkIGJ5IFRSMS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0tleSwgdHlwZW5hbWUgX1ZhbHVlLAorCSAgIHR5cGVuYW1lIF9FeHRyYWN0S2V5LCB0eXBlbmFtZSBfRXF1YWwsCisJICAgdHlwZW5hbWUgX0gxLCB0eXBlbmFtZSBfSDI+CisgICAgc3RydWN0IF9IYXNoX2NvZGVfYmFzZTxfS2V5LCBfVmFsdWUsIF9FeHRyYWN0S2V5LCBfRXF1YWwsIF9IMSwgX0gyLAorCQkJICAgX0RlZmF1bHRfcmFuZ2VkX2hhc2gsIHRydWU+CisgICAgeworICAgICAgdHlwZWRlZiBfSDEgaGFzaGVyOworICAgICAgCisgICAgICBoYXNoZXIKKyAgICAgIGhhc2hfZnVuY3Rpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDE7IH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgIF9IYXNoX2NvZGVfYmFzZShjb25zdCBfRXh0cmFjdEtleSYgX19leCwgY29uc3QgX0VxdWFsJiBfX2VxLAorCQkgICAgICBjb25zdCBfSDEmIF9faDEsIGNvbnN0IF9IMiYgX19oMiwKKwkJICAgICAgY29uc3QgX0RlZmF1bHRfcmFuZ2VkX2hhc2gmKQorICAgICAgOiBfTV9leHRyYWN0KF9fZXgpLCBfTV9lcShfX2VxKSwgX01faDEoX19oMSksIF9NX2gyKF9faDIpIHsgfQorCisgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IF9IYXNoX2NvZGVfdHlwZTsKKyAgCisgICAgICBfSGFzaF9jb2RlX3R5cGUKKyAgICAgIF9NX2hhc2hfY29kZShjb25zdCBfS2V5JiBfX2spIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9oMShfX2spOyB9CisgIAorICAgICAgc3RkOjpzaXplX3QKKyAgICAgIF9NX2J1Y2tldF9pbmRleChjb25zdCBfS2V5JiwgX0hhc2hfY29kZV90eXBlIF9fYywKKwkJICAgICAgc3RkOjpzaXplX3QgX19uKSBjb25zdAorICAgICAgeyByZXR1cm4gX01faDIoX19jLCBfX24pOyB9CisKKyAgICAgIHN0ZDo6c2l6ZV90CisgICAgICBfTV9idWNrZXRfaW5kZXgoY29uc3QgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX3AsCisJCSAgICAgIHN0ZDo6c2l6ZV90IF9fbikgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2gyKF9fcC0+X01faGFzaF9jb2RlLCBfX24pOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX2NvbXBhcmUoY29uc3QgX0tleSYgX19rLCBfSGFzaF9jb2RlX3R5cGUgX19jLAorCQkgX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX24pIGNvbnN0CisgICAgICB7IHJldHVybiBfX2MgPT0gX19uLT5fTV9oYXNoX2NvZGUgJiYgX01fZXEoX19rLCBfTV9leHRyYWN0KF9fbi0+X01fdikpOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N0b3JlX2NvZGUoX0hhc2hfbm9kZTxfVmFsdWUsIHRydWU+KiBfX24sIF9IYXNoX2NvZGVfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IF9fbi0+X01faGFzaF9jb2RlID0gX19jOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2NvcHlfY29kZShfSGFzaF9ub2RlPF9WYWx1ZSwgdHJ1ZT4qIF9fdG8sCisJCSAgIGNvbnN0IF9IYXNoX25vZGU8X1ZhbHVlLCB0cnVlPiogX19mcm9tKSBjb25zdAorICAgICAgeyBfX3RvLT5fTV9oYXNoX2NvZGUgPSBfX2Zyb20tPl9NX2hhc2hfY29kZTsgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9IYXNoX2NvZGVfYmFzZSYgX194KQorICAgICAgeworCXN0ZDo6c3dhcChfTV9leHRyYWN0LCBfX3guX01fZXh0cmFjdCk7CisJc3RkOjpzd2FwKF9NX2VxLCBfX3guX01fZXEpOworCXN0ZDo6c3dhcChfTV9oMSwgX194Ll9NX2gxKTsKKwlzdGQ6OnN3YXAoX01faDIsIF9feC5fTV9oMik7CisgICAgICB9CisgICAgICAKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBfRXh0cmFjdEtleSAgX01fZXh0cmFjdDsKKyAgICAgIF9FcXVhbCAgICAgICBfTV9lcTsKKyAgICAgIF9IMSAgICAgICAgICBfTV9oMTsKKyAgICAgIF9IMiAgICAgICAgICBfTV9oMjsKKyAgICB9OworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvaHlwZXJnZW9tZXRyaWMudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvaHlwZXJnZW9tZXRyaWMudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OGI1YjIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9oeXBlcmdlb21ldHJpYy50Y2MKQEAgLTAsMCArMSw3NzkgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvaHlwZXJnZW9tZXRyaWMudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZDoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gNiwgcHAuIDU1NS01NjYKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX0hZUEVSR0VPTUVUUklDX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfSFlQRVJHRU9NRVRSSUNfVENDIDEKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24KKyAgICAgKiAgICAgICAgICBieSBzZXJpZXMgZXhwYW5zaW9uLgorICAgICAqIAorICAgICAqICAgQGZbCisgICAgICogICAgIF8xRl8xKGE7Yzt4KSA9IFxmcmFje1xHYW1tYShjKX17XEdhbW1hKGEpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxzdW1fe249MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3tcR2FtbWEoYStuKX17XEdhbW1hKGMrbil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXGZyYWN7eF5ufXtuIX0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgSWYgYSBhbmQgYiBhcmUgaW50ZWdlcnMgYW5kIGEgPCAwIGFuZCBlaXRoZXIgYiA+IDAgb3IgYiA8IGEKKyAgICAgKiAgIHRoZW4gdGhlIHNlcmllcyBpcyBhIHBvbHlub21pYWwgd2l0aCBhIGZpbml0ZSBudW1iZXIgb2YKKyAgICAgKiAgIHRlcm1zLiAgSWYgYiBpcyBhbiBpbnRlZ2VyIGFuZCBiIDw9IDAgdGhlIGNvbmZsdWVudAorICAgICAqICAgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24gaXMgdW5kZWZpbmVkLgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fYSAgVGhlICJudW1lcmF0b3IiIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX19jICBUaGUgImRlbm9taW5hdG9yIiBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2NvbmZfaHlwZXJnX3Nlcmllcyhjb25zdCBfVHAgX19hLCBjb25zdCBfVHAgX19jLCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworCisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fRmFjID0gX1RwKDEpOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4X2l0ZXIgPSAxMDAwMDA7CisgICAgICB1bnNpZ25lZCBpbnQgX19pOworICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fdGVybSAqPSAoX19hICsgX1RwKF9faSkpICogX194CisgICAgICAgICAgICAgICAgICAvICgoX19jICsgX1RwKF9faSkpICogX1RwKDEgKyBfX2kpKTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtKSA8IF9fZXBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX0ZhYyArPSBfX3Rlcm07CisgICAgICAgIH0KKyAgICAgIGlmIChfX2kgPT0gX19tYXhfaXRlcikKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJTZXJpZXMgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2NvbmZfaHlwZXJnX3Nlcmllcy4iKSk7CisKKyAgICAgIHJldHVybiBfX0ZhYzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBAYnJpZWYgIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkCisgICAgICogICAgICAgICAgYnkgYW4gaXRlcmF0aXZlIHByb2NlZHVyZSBkZXNjcmliZWQgaW4KKyAgICAgKiAgICAgICAgICBMdWtlLCBBbGdvcml0aG1zIGZvciB0aGUgQ29tcHV0YXRpb24gb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucy4KKyAgICAgKgorICAgICAqICBMaWtlIHRoZSBjYXNlIG9mIHRoZSAyRjEgcmF0aW9uYWwgYXBwcm94aW1hdGlvbnMsIHRoZXNlIGFyZSAKKyAgICAgKiAgcHJvYmFibHkgZ3VhcmFudGVlZCB0byBjb252ZXJnZSBmb3IgeCA8IDAsIGJhcnJpbmcgZ3Jvc3MgICAgCisgICAgICogIG51bWVyaWNhbCBpbnN0YWJpbGl0eSBpbiB0aGUgcHJlLWFzeW1wdG90aWMgcmVnaW1lLiAgICAgICAgIAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2NvbmZfaHlwZXJnX2x1a2UoY29uc3QgX1RwIF9fYSwgY29uc3QgX1RwIF9fYywgY29uc3QgX1RwIF9feGluKQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2JpZyA9IHN0ZDo6cG93KHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6bWF4KCksIF9UcCgwLjE2TCkpOworICAgICAgY29uc3QgaW50IF9fbm1heCA9IDIwMDAwOworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBfVHAgX194ICA9IC1fX3hpbjsKKyAgICAgIGNvbnN0IF9UcCBfX3gzID0gX194ICogX194ICogX194OworICAgICAgY29uc3QgX1RwIF9fdDAgPSBfX2EgLyBfX2M7CisgICAgICBjb25zdCBfVHAgX190MSA9IChfX2EgKyBfVHAoMSkpIC8gKF9UcCgyKSAqIF9fYyk7CisgICAgICBjb25zdCBfVHAgX190MiA9IChfX2EgKyBfVHAoMikpIC8gKF9UcCgyKSAqIChfX2MgKyBfVHAoMSkpKTsKKyAgICAgIF9UcCBfX0YgPSBfVHAoMSk7CisgICAgICBfVHAgX19wcmVjOworCisgICAgICBfVHAgX19Cbm0zID0gX1RwKDEpOworICAgICAgX1RwIF9fQm5tMiA9IF9UcCgxKSArIF9fdDEgKiBfX3g7CisgICAgICBfVHAgX19Cbm0xID0gX1RwKDEpICsgX190MiAqIF9feCAqIChfVHAoMSkgKyBfX3QxIC8gX1RwKDMpICogX194KTsKKworICAgICAgX1RwIF9fQW5tMyA9IF9UcCgxKTsKKyAgICAgIF9UcCBfX0FubTIgPSBfX0JubTIgLSBfX3QwICogX194OworICAgICAgX1RwIF9fQW5tMSA9IF9fQm5tMSAtIF9fdDAgKiAoX1RwKDEpICsgX190MiAqIF9feCkgKiBfX3gKKyAgICAgICAgICAgICAgICAgKyBfX3QwICogX190MSAqIChfX2MgLyAoX19jICsgX1RwKDEpKSkgKiBfX3ggKiBfX3g7CisKKyAgICAgIGludCBfX24gPSAzOworICAgICAgd2hpbGUoMSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX25wYW0xID0gX1RwKF9fbiAtIDEpICsgX19hOworICAgICAgICAgIF9UcCBfX25wY20xID0gX1RwKF9fbiAtIDEpICsgX19jOworICAgICAgICAgIF9UcCBfX25wYW0yID0gX1RwKF9fbiAtIDIpICsgX19hOworICAgICAgICAgIF9UcCBfX25wY20yID0gX1RwKF9fbiAtIDIpICsgX19jOworICAgICAgICAgIF9UcCBfX3RubTEgID0gX1RwKDIgKiBfX24gLSAxKTsKKyAgICAgICAgICBfVHAgX190bm0zICA9IF9UcCgyICogX19uIC0gMyk7CisgICAgICAgICAgX1RwIF9fdG5tNSAgPSBfVHAoMiAqIF9fbiAtIDUpOworICAgICAgICAgIF9UcCBfX0YxID0gIChfVHAoX19uIC0gMikgLSBfX2EpIC8gKF9UcCgyKSAqIF9fdG5tMyAqIF9fbnBjbTEpOworICAgICAgICAgIF9UcCBfX0YyID0gIChfVHAoX19uKSArIF9fYSkgKiBfX25wYW0xCisgICAgICAgICAgICAgICAgICAgLyAoX1RwKDQpICogX190bm0xICogX190bm0zICogX19ucGNtMiAqIF9fbnBjbTEpOworICAgICAgICAgIF9UcCBfX0YzID0gLV9fbnBhbTIgKiBfX25wYW0xICogKF9UcChfX24gLSAyKSAtIF9fYSkKKyAgICAgICAgICAgICAgICAgICAvIChfVHAoOCkgKiBfX3RubTMgKiBfX3RubTMgKiBfX3RubTUKKyAgICAgICAgICAgICAgICAgICAqIChfVHAoX19uIC0gMykgKyBfX2MpICogX19ucGNtMiAqIF9fbnBjbTEpOworICAgICAgICAgIF9UcCBfX0UgID0gLV9fbnBhbTEgKiAoX1RwKF9fbiAtIDEpIC0gX19jKQorICAgICAgICAgICAgICAgICAgIC8gKF9UcCgyKSAqIF9fdG5tMyAqIF9fbnBjbTIgKiBfX25wY20xKTsKKworICAgICAgICAgIF9UcCBfX0FuID0gKF9UcCgxKSArIF9fRjEgKiBfX3gpICogX19Bbm0xCisgICAgICAgICAgICAgICAgICAgKyAoX19FICsgX19GMiAqIF9feCkgKiBfX3ggKiBfX0FubTIgKyBfX0YzICogX194MyAqIF9fQW5tMzsKKyAgICAgICAgICBfVHAgX19CbiA9IChfVHAoMSkgKyBfX0YxICogX194KSAqIF9fQm5tMQorICAgICAgICAgICAgICAgICAgICsgKF9fRSArIF9fRjIgKiBfX3gpICogX194ICogX19Cbm0yICsgX19GMyAqIF9feDMgKiBfX0JubTM7CisgICAgICAgICAgX1RwIF9fciA9IF9fQW4gLyBfX0JuOworCisgICAgICAgICAgX19wcmVjID0gc3RkOjphYnMoKF9fRiAtIF9fcikgLyBfX0YpOworICAgICAgICAgIF9fRiA9IF9fcjsKKworICAgICAgICAgIGlmIChfX3ByZWMgPCBfX2VwcyB8fCBfX24gPiBfX25tYXgpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX0FuKSA+IF9fYmlnIHx8IHN0ZDo6YWJzKF9fQm4pID4gX19iaWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fQW4gICAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19CbiAgIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTEgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMSAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0yIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTIgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMyAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0zIC89IF9fYmlnOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9fQW4pIDwgX1RwKDEpIC8gX19iaWcKKyAgICAgICAgICAgICAgICB8fCBzdGQ6OmFicyhfX0JuKSA8IF9UcCgxKSAvIF9fYmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0FuICAgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm4gICAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0xICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTEgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMiAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0yICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTMgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMyAqPSBfX2JpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICsrX19uOworICAgICAgICAgIF9fQm5tMyA9IF9fQm5tMjsKKyAgICAgICAgICBfX0JubTIgPSBfX0JubTE7CisgICAgICAgICAgX19Cbm0xID0gX19CbjsKKyAgICAgICAgICBfX0FubTMgPSBfX0FubTI7CisgICAgICAgICAgX19Bbm0yID0gX19Bbm0xOworICAgICAgICAgIF9fQW5tMSA9IF9fQW47CisgICAgICAgIH0KKworICAgICAgaWYgKF9fbiA+PSBfX25tYXgpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiSXRlcmF0aW9uIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19jb25mX2h5cGVyZ19sdWtlLiIpKTsKKworICAgICAgcmV0dXJuIF9fRjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIGNvbmZsdWVudCBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uCisgICAgICogICAgICAgICAgIEBmJCBfMUZfMShhO2M7eCkgQGYkLgorICAgICAqIAorICAgICAqICAgQHRvZG8gIEhhbmRsZSBiID09IG5vbnBvc2l0aXZlIGludGVnZXIgYmxvd3VwIC0gcmV0dXJuIE5hTi4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX2EgIFRoZSBAYSBudW1lcmF0b3IgcGFyYW1ldGVyLgorICAgICAqICAgQHBhcmFtICBfX2MgIFRoZSBAYSBkZW5vbWluYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuICBUaGUgY29uZmx1ZW50IGh5cGVyZ2VvbWV0cmljIGZ1bmN0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgX19jb25mX2h5cGVyZyhjb25zdCBfVHAgX19hLCBjb25zdCBfVHAgX19jLCBjb25zdCBfVHAgX194KQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBjb25zdCBfVHAgX19jX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYyk7CisjZWxzZQorICAgICAgY29uc3QgX1RwIF9fY19uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2MgKyBfVHAoMC41TCkpOworI2VuZGlmCisgICAgICBpZiAoX19pc25hbihfX2EpIHx8IF9faXNuYW4oX19jKSB8fCBfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX19jX25pbnQgPT0gX19jICYmIF9fY19uaW50IDw9IDApCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlIGlmIChfX2EgPT0gX1RwKDApKQorICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgZWxzZSBpZiAoX19jID09IF9fYSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6ZXhwKF9feCk7CisgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHJldHVybiBfX2NvbmZfaHlwZXJnX2x1a2UoX19hLCBfX2MsIF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX2NvbmZfaHlwZXJnX3NlcmllcyhfX2EsIF9fYywgX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkCisgICAgICogICBieSBzZXJpZXMgZXhwYW5zaW9uLgorICAgICAqIAorICAgICAqICAgVGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgIF8yRl8xKGEsYjtjO3gpID0gXGZyYWN7XEdhbW1hKGMpfXtcR2FtbWEoYSlcR2FtbWEoYil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje1xHYW1tYShhK24pXEdhbW1hKGIrbil9e1xHYW1tYShjK24pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxmcmFje3hebn17biF9CisgICAgICogICBAZl0KKyAgICAgKiAKKyAgICAgKiAgIFRoaXMgd29ya3MgYW5kIGl0J3MgcHJldHR5IGZhc3QuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgZmlyc3QgQGEgbnVtZXJhdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgc2Vjb25kIEBhIG51bWVyYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYyAgVGhlIEBhIGRlbm9taW5hdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9faHlwZXJnX3Nlcmllcyhjb25zdCBfVHAgX19hLCBjb25zdCBfVHAgX19iLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX19jLCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2VwcyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworCisgICAgICBfVHAgX190ZXJtID0gX1RwKDEpOworICAgICAgX1RwIF9fRmFiYyA9IF9UcCgxKTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heF9pdGVyID0gMTAwMDAwOworICAgICAgdW5zaWduZWQgaW50IF9faTsKKyAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19tYXhfaXRlcjsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBfX3Rlcm0gKj0gKF9fYSArIF9UcChfX2kpKSAqIChfX2IgKyBfVHAoX19pKSkgKiBfX3gKKyAgICAgICAgICAgICAgICAgIC8gKChfX2MgKyBfVHAoX19pKSkgKiBfVHAoMSArIF9faSkpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgX19lcHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIF9fRmFiYyArPSBfX3Rlcm07CisgICAgICAgIH0KKyAgICAgIGlmIChfX2kgPT0gX19tYXhfaXRlcikKKyAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJTZXJpZXMgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19zZXJpZXMuIikpOworCisgICAgICByZXR1cm4gX19GYWJjOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgaHlwb2dlb21ldHJpYyBmdW5jdGlvbiBAZiQgXzJGXzEoYSxiO2M7eCkgQGYkCisgICAgICogICAgICAgICAgIGJ5IGFuIGl0ZXJhdGl2ZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGluCisgICAgICogICAgICAgICAgIEx1a2UsIEFsZ29yaXRobXMgZm9yIHRoZSBDb21wdXRhdGlvbiBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h5cGVyZ19sdWtlKGNvbnN0IF9UcCBfX2EsIGNvbnN0IF9UcCBfX2IsIGNvbnN0IF9UcCBfX2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX194aW4pCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYmlnID0gc3RkOjpwb3coc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKSwgX1RwKDAuMTZMKSk7CisgICAgICBjb25zdCBpbnQgX19ubWF4ID0gMjAwMDA7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ggID0gLV9feGluOworICAgICAgY29uc3QgX1RwIF9feDMgPSBfX3ggKiBfX3ggKiBfX3g7CisgICAgICBjb25zdCBfVHAgX190MCA9IF9fYSAqIF9fYiAvIF9fYzsKKyAgICAgIGNvbnN0IF9UcCBfX3QxID0gKF9fYSArIF9UcCgxKSkgKiAoX19iICsgX1RwKDEpKSAvIChfVHAoMikgKiBfX2MpOworICAgICAgY29uc3QgX1RwIF9fdDIgPSAoX19hICsgX1RwKDIpKSAqIChfX2IgKyBfVHAoMikpCisgICAgICAgICAgICAgICAgICAgICAvIChfVHAoMikgKiAoX19jICsgX1RwKDEpKSk7CisKKyAgICAgIF9UcCBfX0YgPSBfVHAoMSk7CisKKyAgICAgIF9UcCBfX0JubTMgPSBfVHAoMSk7CisgICAgICBfVHAgX19Cbm0yID0gX1RwKDEpICsgX190MSAqIF9feDsKKyAgICAgIF9UcCBfX0JubTEgPSBfVHAoMSkgKyBfX3QyICogX194ICogKF9UcCgxKSArIF9fdDEgLyBfVHAoMykgKiBfX3gpOworCisgICAgICBfVHAgX19Bbm0zID0gX1RwKDEpOworICAgICAgX1RwIF9fQW5tMiA9IF9fQm5tMiAtIF9fdDAgKiBfX3g7CisgICAgICBfVHAgX19Bbm0xID0gX19Cbm0xIC0gX190MCAqIChfVHAoMSkgKyBfX3QyICogX194KSAqIF9feAorICAgICAgICAgICAgICAgICArIF9fdDAgKiBfX3QxICogKF9fYyAvIChfX2MgKyBfVHAoMSkpKSAqIF9feCAqIF9feDsKKworICAgICAgaW50IF9fbiA9IDM7CisgICAgICB3aGlsZSAoMSkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYW0xID0gX1RwKF9fbiAtIDEpICsgX19hOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYm0xID0gX1RwKF9fbiAtIDEpICsgX19iOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wY20xID0gX1RwKF9fbiAtIDEpICsgX19jOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYW0yID0gX1RwKF9fbiAtIDIpICsgX19hOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wYm0yID0gX1RwKF9fbiAtIDIpICsgX19iOworICAgICAgICAgIGNvbnN0IF9UcCBfX25wY20yID0gX1RwKF9fbiAtIDIpICsgX19jOworICAgICAgICAgIGNvbnN0IF9UcCBfX3RubTEgID0gX1RwKDIgKiBfX24gLSAxKTsKKyAgICAgICAgICBjb25zdCBfVHAgX190bm0zICA9IF9UcCgyICogX19uIC0gMyk7CisgICAgICAgICAgY29uc3QgX1RwIF9fdG5tNSAgPSBfVHAoMiAqIF9fbiAtIDUpOworICAgICAgICAgIGNvbnN0IF9UcCBfX24yID0gX19uICogX19uOworICAgICAgICAgIGNvbnN0IF9UcCBfX0YxID0gKF9UcCgzKSAqIF9fbjIgKyAoX19hICsgX19iIC0gX1RwKDYpKSAqIF9fbgorICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDIpIC0gX19hICogX19iIC0gX1RwKDIpICogKF9fYSArIF9fYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDIpICogX190bm0zICogX19ucGNtMSk7CisgICAgICAgICAgY29uc3QgX1RwIF9fRjIgPSAtKF9UcCgzKSAqIF9fbjIgLSAoX19hICsgX19iICsgX1RwKDYpKSAqIF9fbgorICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDIpIC0gX19hICogX19iKSAqIF9fbnBhbTEgKiBfX25wYm0xCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDQpICogX190bm0xICogX190bm0zICogX19ucGNtMiAqIF9fbnBjbTEpOworICAgICAgICAgIGNvbnN0IF9UcCBfX0YzID0gKF9fbnBhbTIgKiBfX25wYW0xICogX19ucGJtMiAqIF9fbnBibTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIChfVHAoX19uIC0gMikgLSBfX2EpICogKF9UcChfX24gLSAyKSAtIF9fYikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDgpICogX190bm0zICogX190bm0zICogX190bm01CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAoX1RwKF9fbiAtIDMpICsgX19jKSAqIF9fbnBjbTIgKiBfX25wY20xKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19FICA9IC1fX25wYW0xICogX19ucGJtMSAqIChfVHAoX19uIC0gMSkgLSBfX2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDIpICogX190bm0zICogX19ucGNtMiAqIF9fbnBjbTEpOworCisgICAgICAgICAgX1RwIF9fQW4gPSAoX1RwKDEpICsgX19GMSAqIF9feCkgKiBfX0FubTEKKyAgICAgICAgICAgICAgICAgICArIChfX0UgKyBfX0YyICogX194KSAqIF9feCAqIF9fQW5tMiArIF9fRjMgKiBfX3gzICogX19Bbm0zOworICAgICAgICAgIF9UcCBfX0JuID0gKF9UcCgxKSArIF9fRjEgKiBfX3gpICogX19Cbm0xCisgICAgICAgICAgICAgICAgICAgKyAoX19FICsgX19GMiAqIF9feCkgKiBfX3ggKiBfX0JubTIgKyBfX0YzICogX194MyAqIF9fQm5tMzsKKyAgICAgICAgICBjb25zdCBfVHAgX19yID0gX19BbiAvIF9fQm47CisKKyAgICAgICAgICBjb25zdCBfVHAgX19wcmVjID0gc3RkOjphYnMoKF9fRiAtIF9fcikgLyBfX0YpOworICAgICAgICAgIF9fRiA9IF9fcjsKKworICAgICAgICAgIGlmIChfX3ByZWMgPCBfX2VwcyB8fCBfX24gPiBfX25tYXgpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX0FuKSA+IF9fYmlnIHx8IHN0ZDo6YWJzKF9fQm4pID4gX19iaWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fQW4gICAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19CbiAgIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTEgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMSAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0yIC89IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTIgLz0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMyAvPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0zIC89IF9fYmlnOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKHN0ZDo6YWJzKF9fQW4pIDwgX1RwKDEpIC8gX19iaWcKKyAgICAgICAgICAgICAgICB8fCBzdGQ6OmFicyhfX0JuKSA8IF9UcCgxKSAvIF9fYmlnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX0FuICAgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm4gICAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Bbm0xICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0JubTEgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQW5tMiAqPSBfX2JpZzsKKyAgICAgICAgICAgICAgX19Cbm0yICo9IF9fYmlnOworICAgICAgICAgICAgICBfX0FubTMgKj0gX19iaWc7CisgICAgICAgICAgICAgIF9fQm5tMyAqPSBfX2JpZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICsrX19uOworICAgICAgICAgIF9fQm5tMyA9IF9fQm5tMjsKKyAgICAgICAgICBfX0JubTIgPSBfX0JubTE7CisgICAgICAgICAgX19Cbm0xID0gX19CbjsKKyAgICAgICAgICBfX0FubTMgPSBfX0FubTI7CisgICAgICAgICAgX19Bbm0yID0gX19Bbm0xOworICAgICAgICAgIF9fQW5tMSA9IF9fQW47CisgICAgICAgIH0KKworICAgICAgaWYgKF9fbiA+PSBfX25tYXgpCisgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiSXRlcmF0aW9uIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gX19oeXBlcmdfbHVrZS4iKSk7CisKKyAgICAgIHJldHVybiBfX0Y7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgQGJyaWVmICBSZXR1cm4gdGhlIGh5cG9nZW9tZXRyaWMgZnVuY3Rpb24gQGYkIF8yRl8xKGEsYjtjO3gpIEBmJCAKKyAgICAgKiAgYnkgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYWUgaW4gQWJyYW1vd2l0eiAmIFN0ZWd1biBmb3JtdWxhCisgICAgICogIDE1LjMuNiBmb3IgZCA9IGMgLSBhIC0gYiBub3QgaW50ZWdyYWwgYW5kIGZvcm11bGEgMTUuMy4xMSBmb3IKKyAgICAgKiAgZCA9IGMgLSBhIC0gYiBpbnRlZ3JhbC4gIFRoaXMgYXNzdW1lcyBhLCBiLCBjICE9IG5lZ2F0aXZlCisgICAgICogIGludGVnZXIuCisgICAgICoKKyAgICAgKiAgIFRoZSBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7Yzt4KSA9IFxmcmFje1xHYW1tYShjKX17XEdhbW1hKGEpXEdhbW1hKGIpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxzdW1fe249MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3tcR2FtbWEoYStuKVxHYW1tYShiK24pfXtcR2FtbWEoYytuKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3t4Xm59e24hfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIFRoZSByZWZsZWN0aW9uIGZvcm11bGEgZm9yIG5vbmludGVncmFsIEBmJCBkID0gYyAtIGEgLSBiIEBmJCBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7Yzt4KSA9IFxmcmFje1xHYW1tYShjKVxHYW1tYShkKX17XEdhbW1hKGMtYSlcR2FtbWEoYy1iKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfMkZfMShhLGI7MS1kOzEteCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgKyBcZnJhY3tcR2FtbWEoYylcR2FtbWEoLWQpfXtcR2FtbWEoYSlcR2FtbWEoYil9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXzJGXzEoYy1hLGMtYjsxK2Q7MS14KQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIFRoZSByZWZsZWN0aW9uIGZvcm11bGEgZm9yIGludGVncmFsIEBmJCBtID0gYyAtIGEgLSBiIEBmJCBpczoKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7YStiK207eCkgPSBcZnJhY3tcR2FtbWEobSlcR2FtbWEoYStiK20pfXtcR2FtbWEoYSttKVxHYW1tYShiK20pfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgXHN1bV97az0wfV57bS0xfSBcZnJhY3sobSthKV9rKG0rYilfa317ayEoMS1tKV9rfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gCisgICAgICogICBAZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19oeXBlcmdfcmVmbGVjdChjb25zdCBfVHAgX19hLCBjb25zdCBfVHAgX19iLCBjb25zdCBfVHAgX19jLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19kID0gX19jIC0gX19hIC0gX19iOworICAgICAgY29uc3QgaW50IF9faW50ZCAgPSBzdGQ6OmZsb29yKF9fZCArIF9UcCgwLjVMKSk7CisgICAgICBjb25zdCBfVHAgX19lcHMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKTsKKyAgICAgIGNvbnN0IF9UcCBfX3RvbGVyID0gX1RwKDEwMDApICogX19lcHM7CisgICAgICBjb25zdCBfVHAgX19sb2dfbWF4ID0gc3RkOjpsb2coc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXgoKSk7CisgICAgICBjb25zdCBib29sIF9fZF9pbnRlZ2VyID0gKHN0ZDo6YWJzKF9fZCAtIF9faW50ZCkgPCBfX3RvbGVyKTsKKworICAgICAgaWYgKF9fZF9pbnRlZ2VyKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fbG5fb214ID0gc3RkOjpsb2coX1RwKDEpIC0gX194KTsKKyAgICAgICAgICBjb25zdCBfVHAgX19hZCA9IHN0ZDo6YWJzKF9fZCk7CisgICAgICAgICAgX1RwIF9fRjEsIF9fRjI7CisKKyAgICAgICAgICBfVHAgX19kMSwgX19kMjsKKyAgICAgICAgICBpZiAoX19kID49IF9UcCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19kMSA9IF9fZDsKKyAgICAgICAgICAgICAgX19kMiA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fZDEgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fZDIgPSBfX2Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBfVHAgX19sbmdfYyA9IF9fbG9nX2dhbW1hKF9fYyk7CisKKyAgICAgICAgICAvLyAgRXZhbHVhdGUgRjEuCisgICAgICAgICAgaWYgKF9fYWQgPCBfX2VwcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gIGQgPSBjIC0gYSAtIGIgPSAwLgorICAgICAgICAgICAgICBfX0YxID0gX1RwKDApOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICBib29sIF9fb2tfZDEgPSB0cnVlOworICAgICAgICAgICAgICBfVHAgX19sbmdfYWQsIF9fbG5nX2FkMSwgX19sbmdfYmQxOworICAgICAgICAgICAgICBfX3RyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fbG5nX2FkID0gX19sb2dfZ2FtbWEoX19hZCk7CisgICAgICAgICAgICAgICAgICBfX2xuZ19hZDEgPSBfX2xvZ19nYW1tYShfX2EgKyBfX2QxKTsKKyAgICAgICAgICAgICAgICAgIF9fbG5nX2JkMSA9IF9fbG9nX2dhbW1hKF9fYiArIF9fZDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19va19kMSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoX19va19kMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvKiBHYW1tYSBmdW5jdGlvbnMgaW4gdGhlIGRlbm9taW5hdG9yIGFyZSBvay4KKyAgICAgICAgICAgICAgICAgICAqIFByb2NlZWQgd2l0aCBldmFsdWF0aW9uLgorICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICBfVHAgX19zdW0xID0gX1RwKDEpOworICAgICAgICAgICAgICAgICAgX1RwIF9fdGVybSA9IF9UcCgxKTsKKyAgICAgICAgICAgICAgICAgIF9UcCBfX2xuX3ByZTEgPSBfX2xuZ19hZCArIF9fbG5nX2MgKyBfX2QyICogX19sbl9vbXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xuZ19hZDEgLSBfX2xuZ19iZDE7CisKKyAgICAgICAgICAgICAgICAgIC8qIERvIEYxIHN1bS4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX19pID0gMTsgX19pIDwgX19hZDsgKytfX2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgX19qID0gX19pIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICBfX3Rlcm0gKj0gKF9fYSArIF9fZDIgKyBfX2opICogKF9fYiArIF9fZDIgKyBfX2opCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChfVHAoMSkgKyBfX2QyICsgX19qKSAvIF9faSAqIChfVHAoMSkgLSBfX3gpOworICAgICAgICAgICAgICAgICAgICAgIF9fc3VtMSArPSBfX3Rlcm07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgaWYgKF9fbG5fcHJlMSA+IF9fbG9nX21heCkKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJPdmVyZmxvdyBvZiBnYW1tYSBmdW5jdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIF9faHlwZXJnX2x1a2UuIikpOworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX0YxID0gc3RkOjpleHAoX19sbl9wcmUxKSAqIF9fc3VtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyAgR2FtbWEgZnVuY3Rpb25zIGluIHRoZSBkZW5vbWluYXRvciB3ZXJlIG5vdCBvay4KKyAgICAgICAgICAgICAgICAgIC8vICBTbyB0aGUgRjEgdGVybSBpcyB6ZXJvLgorICAgICAgICAgICAgICAgICAgX19GMSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGVuZCBGMSBldmFsdWF0aW9uCisKKyAgICAgICAgICAvLyBFdmFsdWF0ZSBGMi4KKyAgICAgICAgICBib29sIF9fb2tfZDIgPSB0cnVlOworICAgICAgICAgIF9UcCBfX2xuZ19hZDIsIF9fbG5nX2JkMjsKKyAgICAgICAgICBfX3RyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2xuZ19hZDIgPSBfX2xvZ19nYW1tYShfX2EgKyBfX2QyKTsKKyAgICAgICAgICAgICAgX19sbmdfYmQyID0gX19sb2dfZ2FtbWEoX19iICsgX19kMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19jYXRjaCguLi4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fb2tfZDIgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChfX29rX2QyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgR2FtbWEgZnVuY3Rpb25zIGluIHRoZSBkZW5vbWluYXRvciBhcmUgb2suCisgICAgICAgICAgICAgIC8vICBQcm9jZWVkIHdpdGggZXZhbHVhdGlvbi4KKyAgICAgICAgICAgICAgY29uc3QgaW50IF9fbWF4aXRlciA9IDIwMDA7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3BzaV8xID0gLV9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19nYW1tYV9lKCk7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3BzaV8xcGQgPSBfX3BzaShfVHAoMSkgKyBfX2FkKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcHNpX2FwZDEgPSBfX3BzaShfX2EgKyBfX2QxKTsKKyAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcHNpX2JwZDEgPSBfX3BzaShfX2IgKyBfX2QxKTsKKworICAgICAgICAgICAgICBfVHAgX19wc2lfdGVybSA9IF9fcHNpXzEgKyBfX3BzaV8xcGQgLSBfX3BzaV9hcGQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19wc2lfYnBkMSAtIF9fbG5fb214OworICAgICAgICAgICAgICBfVHAgX19mYWN0ID0gX1RwKDEpOworICAgICAgICAgICAgICBfVHAgX19zdW0yID0gX19wc2lfdGVybTsKKyAgICAgICAgICAgICAgX1RwIF9fbG5fcHJlMiA9IF9fbG5nX2MgKyBfX2QxICogX19sbl9vbXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbG5nX2FkMiAtIF9fbG5nX2JkMjsKKworICAgICAgICAgICAgICAvLyBEbyBGMiBzdW0uCisgICAgICAgICAgICAgIGludCBfX2o7CisgICAgICAgICAgICAgIGZvciAoX19qID0gMTsgX19qIDwgX19tYXhpdGVyOyArK19faikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyAgVmFsdWVzIGZvciBwc2kgZnVuY3Rpb25zIHVzZSByZWN1cnJlbmNlOworICAgICAgICAgICAgICAgICAgLy8gIEFicmFtb3dpdHogJiBTdGVndW4gNi4zLjUKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3Rlcm0xID0gX1RwKDEpIC8gX1RwKF9faikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDEpIC8gKF9fYWQgKyBfX2opOworICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fdGVybTIgPSBfVHAoMSkgLyAoX19hICsgX19kMSArIF9UcChfX2ogLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDEpIC8gKF9fYiArIF9fZDEgKyBfVHAoX19qIC0gMSkpOworICAgICAgICAgICAgICAgICAgX19wc2lfdGVybSArPSBfX3Rlcm0xIC0gX190ZXJtMjsKKyAgICAgICAgICAgICAgICAgIF9fZmFjdCAqPSAoX19hICsgX19kMSArIF9UcChfX2ogLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoX19iICsgX19kMSArIF9UcChfX2ogLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoKF9fYWQgKyBfX2opICogX19qKSAqIChfVHAoMSkgLSBfX3gpOworICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fZGVsdGEgPSBfX2ZhY3QgKiBfX3BzaV90ZXJtOworICAgICAgICAgICAgICAgICAgX19zdW0yICs9IF9fZGVsdGE7CisgICAgICAgICAgICAgICAgICBpZiAoc3RkOjphYnMoX19kZWx0YSkgPCBfX2VwcyAqIHN0ZDo6YWJzKF9fc3VtMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKF9faiA9PSBfX21heGl0ZXIpCisgICAgICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJTdW0gRjIgZmFpbGVkIHRvIGNvbnZlcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9faHlwZXJnX3JlZmxlY3QiKSk7CisKKyAgICAgICAgICAgICAgaWYgKF9fc3VtMiA9PSBfVHAoMCkpCisgICAgICAgICAgICAgICAgX19GMiA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIF9fRjIgPSBzdGQ6OmV4cChfX2xuX3ByZTIpICogX19zdW0yOworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gR2FtbWEgZnVuY3Rpb25zIGluIHRoZSBkZW5vbWluYXRvciBub3Qgb2suCisgICAgICAgICAgICAgIC8vIFNvIHRoZSBGMiB0ZXJtIGlzIHplcm8uCisgICAgICAgICAgICAgIF9fRjIgPSBfVHAoMCk7CisgICAgICAgICAgICB9IC8vIGVuZCBGMiBldmFsdWF0aW9uCisKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ25fMiA9IChfX2ludGQgJSAyID09IDEgPyAtX1RwKDEpIDogX1RwKDEpKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19GID0gX19GMSArIF9fc2duXzIgKiBfX0YyOworCisgICAgICAgICAgcmV0dXJuIF9fRjsKKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLy8gIGQgPSBjIC0gYSAtIGIgbm90IGFuIGludGVnZXIuCisKKyAgICAgICAgICAvLyAgVGhlc2UgZ2FtbWEgZnVuY3Rpb25zIGFwcGVhciBpbiB0aGUgZGVub21pbmF0b3IsIHNvIHdlCisgICAgICAgICAgLy8gIGNhdGNoIHRoZWlyIGhhcm1sZXNzIGRvbWFpbiBlcnJvcnMgYW5kIHNldCB0aGUgdGVybXMgdG8gemVyby4KKyAgICAgICAgICBib29sIF9fb2sxID0gdHJ1ZTsKKyAgICAgICAgICBfVHAgX19zZ25fZzFjYSA9IF9UcCgwKSwgX19sbl9nMWNhID0gX1RwKDApOworICAgICAgICAgIF9UcCBfX3Nnbl9nMWNiID0gX1RwKDApLCBfX2xuX2cxY2IgPSBfVHAoMCk7CisgICAgICAgICAgX190cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19zZ25fZzFjYSA9IF9fbG9nX2dhbW1hX3NpZ24oX19jIC0gX19hKTsKKyAgICAgICAgICAgICAgX19sbl9nMWNhID0gX19sb2dfZ2FtbWEoX19jIC0gX19hKTsKKyAgICAgICAgICAgICAgX19zZ25fZzFjYiA9IF9fbG9nX2dhbW1hX3NpZ24oX19jIC0gX19iKTsKKyAgICAgICAgICAgICAgX19sbl9nMWNiID0gX19sb2dfZ2FtbWEoX19jIC0gX19iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19vazEgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGJvb2wgX19vazIgPSB0cnVlOworICAgICAgICAgIF9UcCBfX3Nnbl9nMmEgPSBfVHAoMCksIF9fbG5fZzJhID0gX1RwKDApOworICAgICAgICAgIF9UcCBfX3Nnbl9nMmIgPSBfVHAoMCksIF9fbG5fZzJiID0gX1RwKDApOworICAgICAgICAgIF9fdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fc2duX2cyYSA9IF9fbG9nX2dhbW1hX3NpZ24oX19hKTsKKyAgICAgICAgICAgICAgX19sbl9nMmEgPSBfX2xvZ19nYW1tYShfX2EpOworICAgICAgICAgICAgICBfX3Nnbl9nMmIgPSBfX2xvZ19nYW1tYV9zaWduKF9fYik7CisgICAgICAgICAgICAgIF9fbG5fZzJiID0gX19sb2dfZ2FtbWEoX19iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBfX2NhdGNoKC4uLikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19vazIgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGNvbnN0IF9UcCBfX3Nnbl9nYyA9IF9fbG9nX2dhbW1hX3NpZ24oX19jKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9nYyA9IF9fbG9nX2dhbW1hKF9fYyk7CisgICAgICAgICAgY29uc3QgX1RwIF9fc2duX2dkID0gX19sb2dfZ2FtbWFfc2lnbihfX2QpOworICAgICAgICAgIGNvbnN0IF9UcCBfX2xuX2dkID0gX19sb2dfZ2FtbWEoX19kKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ25fZ21kID0gX19sb2dfZ2FtbWFfc2lnbigtX19kKTsKKyAgICAgICAgICBjb25zdCBfVHAgX19sbl9nbWQgPSBfX2xvZ19nYW1tYSgtX19kKTsKKworICAgICAgICAgIGNvbnN0IF9UcCBfX3NnbjEgPSBfX3Nnbl9nYyAqIF9fc2duX2dkICAqIF9fc2duX2cxY2EgKiBfX3Nnbl9nMWNiOworICAgICAgICAgIGNvbnN0IF9UcCBfX3NnbjIgPSBfX3Nnbl9nYyAqIF9fc2duX2dtZCAqIF9fc2duX2cyYSAgKiBfX3Nnbl9nMmI7CisKKyAgICAgICAgICBfVHAgX19wcmUxLCBfX3ByZTI7CisgICAgICAgICAgaWYgKF9fb2sxICYmIF9fb2syKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfVHAgX19sbl9wcmUxID0gX19sbl9nYyArIF9fbG5fZ2QgIC0gX19sbl9nMWNhIC0gX19sbl9nMWNiOworICAgICAgICAgICAgICBfVHAgX19sbl9wcmUyID0gX19sbl9nYyArIF9fbG5fZ21kIC0gX19sbl9nMmEgIC0gX19sbl9nMmIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9fZCAqIHN0ZDo6bG9nKF9UcCgxKSAtIF9feCk7CisgICAgICAgICAgICAgIGlmIChfX2xuX3ByZTEgPCBfX2xvZ19tYXggJiYgX19sbl9wcmUyIDwgX19sb2dfbWF4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMSA9IHN0ZDo6ZXhwKF9fbG5fcHJlMSk7CisgICAgICAgICAgICAgICAgICBfX3ByZTIgPSBzdGQ6OmV4cChfX2xuX3ByZTIpOworICAgICAgICAgICAgICAgICAgX19wcmUxICo9IF9fc2duMTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMiAqPSBfX3NnbjI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJPdmVyZmxvdyBvZiBnYW1tYSBmdW5jdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19yZWZsZWN0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfX29rMSAmJiAhX19vazIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX2xuX3ByZTEgPSBfX2xuX2djICsgX19sbl9nZCAtIF9fbG5fZzFjYSAtIF9fbG5fZzFjYjsKKyAgICAgICAgICAgICAgaWYgKF9fbG5fcHJlMSA8IF9fbG9nX21heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfX3ByZTEgPSBzdGQ6OmV4cChfX2xuX3ByZTEpOworICAgICAgICAgICAgICAgICAgX19wcmUxICo9IF9fc2duMTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMiA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIk92ZXJmbG93IG9mIGdhbW1hIGZ1bmN0aW9ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9faHlwZXJnX3JlZmxlY3QiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKCFfX29rMSAmJiBfX29rMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX1RwIF9fbG5fcHJlMiA9IF9fbG5fZ2MgKyBfX2xuX2dtZCAtIF9fbG5fZzJhIC0gX19sbl9nMmIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9fZCAqIHN0ZDo6bG9nKF9UcCgxKSAtIF9feCk7CisgICAgICAgICAgICAgIGlmIChfX2xuX3ByZTIgPCBfX2xvZ19tYXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX19wcmUxID0gX1RwKDApOworICAgICAgICAgICAgICAgICAgX19wcmUyID0gc3RkOjpleHAoX19sbl9wcmUyKTsKKyAgICAgICAgICAgICAgICAgIF9fcHJlMiAqPSBfX3NnbjI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc3RkOjpfX3Rocm93X3J1bnRpbWVfZXJyb3IoX19OKCJPdmVyZmxvdyBvZiBnYW1tYSBmdW5jdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZ19yZWZsZWN0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fcHJlMSA9IF9UcCgwKTsKKyAgICAgICAgICAgICAgX19wcmUyID0gX1RwKDApOworICAgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIlVuZGVyZmxvdyBvZiBnYW1tYSBmdW5jdGlvbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9faHlwZXJnX3JlZmxlY3QiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICBjb25zdCBfVHAgX19GMSA9IF9faHlwZXJnX3NlcmllcyhfX2EsIF9fYiwgX1RwKDEpIC0gX19kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9UcCgxKSAtIF9feCk7CisgICAgICAgICAgY29uc3QgX1RwIF9fRjIgPSBfX2h5cGVyZ19zZXJpZXMoX19jIC0gX19hLCBfX2MgLSBfX2IsIF9UcCgxKSArIF9fZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVHAoMSkgLSBfX3gpOworCisgICAgICAgICAgY29uc3QgX1RwIF9fRiA9IF9fcHJlMSAqIF9fRjEgKyBfX3ByZTIgKiBfX0YyOworCisgICAgICAgICAgcmV0dXJuIF9fRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgUmV0dXJuIHRoZSBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uIEBmJCBfMkZfMShhLGI7Yzt4KSBAZiQuCisgICAgICoKKyAgICAgKiAgIFRoZSBoeXBvZ2VvbWV0cmljIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnkKKyAgICAgKiAgIEBmWworICAgICAqICAgICBfMkZfMShhLGI7Yzt4KSA9IFxmcmFje1xHYW1tYShjKX17XEdhbW1hKGEpXEdhbW1hKGIpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFxzdW1fe249MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3tcR2FtbWEoYStuKVxHYW1tYShiK24pfXtcR2FtbWEoYytuKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcZnJhY3t4Xm59e24hfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgZmlyc3QgQGEgbnVtZXJhdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX19hICBUaGUgc2Vjb25kIEBhIG51bWVyYXRvciBwYXJhbWV0ZXIuCisgICAgICogICBAcGFyYW0gIF9fYyAgVGhlIEBhIGRlbm9taW5hdG9yIHBhcmFtZXRlci4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2h5cGVyZyhjb25zdCBfVHAgX19hLCBjb25zdCBfVHAgX19iLCBjb25zdCBfVHAgX19jLCBjb25zdCBfVHAgX194KQorICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBjb25zdCBfVHAgX19hX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYSk7CisgICAgICBjb25zdCBfVHAgX19iX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYik7CisgICAgICBjb25zdCBfVHAgX19jX25pbnQgPSBzdGQ6OnRyMTo6bmVhcmJ5aW50KF9fYyk7CisjZWxzZQorICAgICAgY29uc3QgX1RwIF9fYV9uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2EgKyBfVHAoMC41TCkpOworICAgICAgY29uc3QgX1RwIF9fYl9uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2IgKyBfVHAoMC41TCkpOworICAgICAgY29uc3QgX1RwIF9fY19uaW50ID0gc3RhdGljX2Nhc3Q8aW50PihfX2MgKyBfVHAoMC41TCkpOworI2VuZGlmCisgICAgICBjb25zdCBfVHAgX190b2xlciA9IF9UcCgxMDAwKSAqIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6ZXBzaWxvbigpOworICAgICAgaWYgKHN0ZDo6YWJzKF9feCkgPj0gX1RwKDEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgb3V0c2lkZSB1bml0IGNpcmNsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2h5cGVyZy4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9fYSkgfHwgX19pc25hbihfX2IpCisgICAgICAgICAgICB8fCBfX2lzbmFuKF9fYykgfHwgX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fY19uaW50ID09IF9fYyAmJiBfX2NfbmludCA8PSBfVHAoMCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2MgLSBfX2IpIDwgX190b2xlciB8fCBzdGQ6OmFicyhfX2MgLSBfX2EpIDwgX190b2xlcikKKyAgICAgICAgcmV0dXJuIHN0ZDo6cG93KF9UcCgxKSAtIF9feCwgX19jIC0gX19hIC0gX19iKTsKKyAgICAgIGVsc2UgaWYgKF9fYSA+PSBfVHAoMCkgJiYgX19iID49IF9UcCgwKSAmJiBfX2MgPj0gX1RwKDApCisgICAgICAgICAgICAmJiBfX3ggPj0gX1RwKDApICYmIF9feCA8IF9UcCgwLjk5NUwpKQorICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICBlbHNlIGlmIChzdGQ6OmFicyhfX2EpIDwgX1RwKDEwKSAmJiBzdGQ6OmFicyhfX2IpIDwgX1RwKDEwKSkKKyAgICAgICAgeworICAgICAgICAgIC8vICBGb3IgaW50ZWdlciBhIGFuZCBiIHRoZSBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbiBpcyBhCisgICAgICAgICAgLy8gIGZpbml0ZSBwb2x5bm9taWFsLgorICAgICAgICAgIGlmIChfX2EgPCBfVHAoMCkgICYmICBzdGQ6OmFicyhfX2EgLSBfX2FfbmludCkgPCBfX3RvbGVyKQorICAgICAgICAgICAgcmV0dXJuIF9faHlwZXJnX3NlcmllcyhfX2FfbmludCwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgZWxzZSBpZiAoX19iIDwgX1RwKDApICAmJiAgc3RkOjphYnMoX19iIC0gX19iX25pbnQpIDwgX190b2xlcikKKyAgICAgICAgICAgIHJldHVybiBfX2h5cGVyZ19zZXJpZXMoX19hLCBfX2JfbmludCwgX19jLCBfX3gpOworICAgICAgICAgIGVsc2UgaWYgKF9feCA8IC1fVHAoMC4yNUwpKQorICAgICAgICAgICAgcmV0dXJuIF9faHlwZXJnX2x1a2UoX19hLCBfX2IsIF9fYywgX194KTsKKyAgICAgICAgICBlbHNlIGlmIChfX3ggPCBfVHAoMC41TCkpCisgICAgICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fYykgPiBfVHAoMTApKQorICAgICAgICAgICAgICByZXR1cm4gX19oeXBlcmdfc2VyaWVzKF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBfX2h5cGVyZ19yZWZsZWN0KF9fYSwgX19iLCBfX2MsIF9feCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9faHlwZXJnX2x1a2UoX19hLCBfX2IsIF9fYywgX194KTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX0hZUEVSR0VPTUVUUklDX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvaW50dHlwZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2ludHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4ZmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2ludHR5cGVzLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIGludHR5cGVzLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvaW50dHlwZXMuaAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9JTlRUWVBFU19ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9JTlRUWVBFU19IIDEKKworI2luY2x1ZGUgPHRyMS9jaW50dHlwZXM+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfSU5UVFlQRVNfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDFkNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9sZWdlbmRyZV9mdW5jdGlvbi50Y2MKQEAgLTAsMCArMSwzMDYgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbGVnZW5kcmVfZnVuY3Rpb24udGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBlZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gOCwgcHAuIDMzMS0zNDEKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDI1Mi0yNTQKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfTEVHRU5EUkVfRlVOQ1RJT05fVENDCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9MRUdFTkRSRV9GVU5DVElPTl9UQ0MgMQorCisjaW5jbHVkZSAic3BlY2lhbF9mdW5jdGlvbl91dGlsLmgiCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBMZWdlbmRyZSBwb2x5bm9taWFsIGJ5IHJlY3Vyc2lvbiBvbiBvcmRlcgorICAgICAqICAgICAgICAgICBAZiQgbCBAZiQuCisgICAgICogCisgICAgICogICBUaGUgTGVnZW5kcmUgZnVuY3Rpb24gb2YgQGYkIGwgQGYkIGFuZCBAZiQgeCBAZiQsCisgICAgICogICBAZiQgUF9sKHgpIEBmJCwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBQX2woeCkgPSBcZnJhY3sxfXsyXmwgbCF9XGZyYWN7ZF5sfXtkeF5sfSh4XjIgLSAxKV57bH0KKyAgICAgKiAgIEBmXQorICAgICAqIAorICAgICAqICAgQHBhcmFtICBsICBUaGUgb3JkZXIgb2YgdGhlIExlZ2VuZHJlIHBvbHlub21pYWwuICBAZiRsID49IDBAZiQuCisgICAgICogICBAcGFyYW0gIHggIFRoZSBhcmd1bWVudCBvZiB0aGUgTGVnZW5kcmUgcG9seW5vbWlhbC4gIEBmJHx4fCA8PSAxQGYkLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGVnZW5kcmVfcChjb25zdCB1bnNpZ25lZCBpbnQgX19sLCBjb25zdCBfVHAgX194KQorICAgIHsKKworICAgICAgaWYgKChfX3ggPCBfVHAoLTEpKSB8fCAoX194ID4gX1RwKCsxKSkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJBcmd1bWVudCBvdXQgb2YgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gX19wb2x5X2xlZ2VuZHJlX3AuIikpOworICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSArX1RwKDEpKQorICAgICAgICByZXR1cm4gK19UcCgxKTsKKyAgICAgIGVsc2UgaWYgKF9feCA9PSAtX1RwKDEpKQorICAgICAgICByZXR1cm4gKF9fbCAlIDIgPT0gMSA/IC1fVHAoMSkgOiArX1RwKDEpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3BfbG0yID0gX1RwKDEpOworICAgICAgICAgIGlmIChfX2wgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBfX3BfbG0yOworCisgICAgICAgICAgX1RwIF9fcF9sbTEgPSBfX3g7CisgICAgICAgICAgaWYgKF9fbCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIF9fcF9sbTE7CisKKyAgICAgICAgICBfVHAgX19wX2wgPSAwOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9fbGwgPSAyOyBfX2xsIDw9IF9fbDsgKytfX2xsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgVGhpcyBhcnJhbmdlbWVudCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIHJvdW5kb2ZmCisgICAgICAgICAgICAgIC8vICBwcm90ZWN0aW9uLCBBcmZrZW4sIDJuZCBFZCwgRXEgMTIuMTdhLgorICAgICAgICAgICAgICBfX3BfbCA9IF9UcCgyKSAqIF9feCAqIF9fcF9sbTEgLSBfX3BfbG0yCisgICAgICAgICAgICAgICAgICAgIC0gKF9feCAqIF9fcF9sbTEgLSBfX3BfbG0yKSAvIF9UcChfX2xsKTsKKyAgICAgICAgICAgICAgX19wX2xtMiA9IF9fcF9sbTE7CisgICAgICAgICAgICAgIF9fcF9sbTEgPSBfX3BfbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBfX3BfbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbiBieSByZWN1cnNpb24KKyAgICAgKiAgICAgICAgICAgb24gQGYkIGwgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSBMZWdlbmRyZSBmdW5jdGlvbgorICAgICAqICAgQGYkIFBfbCh4KSBAZiQgYnkgdGhlIFJvZHJpZ3VlcyBmb3JtdWxhOgorICAgICAqICAgQGZbCisgICAgICogICAgIFBfbF5tKHgpID0gKDEgLSB4XjIpXnttLzJ9XGZyYWN7ZF5tfXtkeF5tfVBfbCh4KQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBAcGFyYW0gIGwgIFRoZSBvcmRlciBvZiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIGwgPj0gMCBAZiQuCisgICAgICogICBAcGFyYW0gIG0gIFRoZSBvcmRlciBvZiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIG0gPD0gbCBAZiQuCisgICAgICogICBAcGFyYW0gIHggIFRoZSBhcmd1bWVudCBvZiB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIHx4fCA8PSAxIEBmJC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19hc3NvY19sZWdlbmRyZV9wKGNvbnN0IHVuc2lnbmVkIGludCBfX2wsIGNvbnN0IHVuc2lnbmVkIGludCBfX20sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3gpCisgICAgeworCisgICAgICBpZiAoX194IDwgX1RwKC0xKSB8fCBfX3ggPiBfVHAoKzEpKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIF9fYXNzb2NfbGVnZW5kcmVfcC4iKSk7CisgICAgICBlbHNlIGlmIChfX20gPiBfX2wpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJEZWdyZWUgb3V0IG9mIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIF9fYXNzb2NfbGVnZW5kcmVfcC4iKSk7CisgICAgICBlbHNlIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZSBpZiAoX19tID09IDApCisgICAgICAgIHJldHVybiBfX3BvbHlfbGVnZW5kcmVfcChfX2wsIF9feCk7CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19wX21tID0gX1RwKDEpOworICAgICAgICAgIGlmIChfX20gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyAgVHdvIHNxdWFyZSByb290cyBzZWVtIG1vcmUgYWNjdXJhdGUgbW9yZSBvZiB0aGUgdGltZQorICAgICAgICAgICAgICAvLyAgdGhhbiBqdXN0IG9uZS4KKyAgICAgICAgICAgICAgX1RwIF9fcm9vdCA9IHN0ZDo6c3FydChfVHAoMSkgLSBfX3gpICogc3RkOjpzcXJ0KF9UcCgxKSArIF9feCk7CisgICAgICAgICAgICAgIF9UcCBfX2ZhY3QgPSBfVHAoMSk7CisgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDE7IF9faSA8PSBfX207ICsrX19pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9fcF9tbSAqPSAtX19mYWN0ICogX19yb290OworICAgICAgICAgICAgICAgICAgX19mYWN0ICs9IF9UcCgyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9fbCA9PSBfX20pCisgICAgICAgICAgICByZXR1cm4gX19wX21tOworCisgICAgICAgICAgX1RwIF9fcF9tcDFtID0gX1RwKDIgKiBfX20gKyAxKSAqIF9feCAqIF9fcF9tbTsKKyAgICAgICAgICBpZiAoX19sID09IF9fbSArIDEpCisgICAgICAgICAgICByZXR1cm4gX19wX21wMW07CisKKyAgICAgICAgICBfVHAgX19wX2xtMm0gPSBfX3BfbW07CisgICAgICAgICAgX1RwIF9fUF9sbTFtID0gX19wX21wMW07CisgICAgICAgICAgX1RwIF9fcF9sbSA9IF9UcCgwKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2ogPSBfX20gKyAyOyBfX2ogPD0gX19sOyArK19faikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19wX2xtID0gKF9UcCgyICogX19qIC0gMSkgKiBfX3ggKiBfX1BfbG0xbQorICAgICAgICAgICAgICAgICAgICAgIC0gX1RwKF9faiArIF9fbSAtIDEpICogX19wX2xtMm0pIC8gX1RwKF9faiAtIF9fbSk7CisgICAgICAgICAgICAgIF9fcF9sbTJtID0gX19QX2xtMW07CisgICAgICAgICAgICAgIF9fUF9sbTFtID0gX19wX2xtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIF9fcF9sbTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgc3BoZXJpY2FsIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogCisgICAgICogICBUaGUgc3BoZXJpY2FsIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24gb2YgQGYkIGwgQGYkLCBAZiQgbSBAZiQsCisgICAgICogICBhbmQgQGYkIFx0aGV0YSBAZiQgaXMgZGVmaW5lZCBhcyBAZiQgWV9sXm0oXHRoZXRhLDApIEBmJCB3aGVyZQorICAgICAqICAgQGZbCisgICAgICogICAgICBZX2xebShcdGhldGEsXHBoaSkgPSAoLTEpXm1bXGZyYWN7KDJsKzEpfXs0XHBpfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxmcmFjeyhsLW0pIX17KGwrbSkhfV0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFBfbF5tKFxjb3NcdGhldGEpIFxleHBee2ltXHBoaX0KKyAgICAgKiAgIEBmXQorICAgICAqICAgaXMgdGhlIHNwaGVyaWNhbCBoYXJtb25pYyBmdW5jdGlvbiBhbmQgQGYkIFBfbF5tKHgpIEBmJCBpcyB0aGUKKyAgICAgKiAgIGFzc29jaWF0ZWQgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICogCisgICAgICogICBUaGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbiBieQorICAgICAqICAgYXJndW1lbnQgKEBmJHggPSBcY29zKFx0aGV0YSlAZiQpIGFuZCBieSBhIG5vcm1hbGl6YXRpb24gZmFjdG9yCisgICAgICogICBidXQgdGhpcyBmYWN0b3IgaXMgcmF0aGVyIGxhcmdlIGZvciBsYXJnZSBAZiQgbCBAZiQgYW5kIEBmJCBtIEBmJAorICAgICAqICAgYW5kIHNvIHRoaXMgZnVuY3Rpb24gaXMgc3RhYmxlIGZvciBsYXJnZXIgZGlmZmVyZW5jZXMgb2YgQGYkIGwgQGYkCisgICAgICogICBhbmQgQGYkIG0gQGYkLgorICAgICAqIAorICAgICAqICAgQHBhcmFtICBsICBUaGUgb3JkZXIgb2YgdGhlIHNwaGVyaWNhbCBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9uLgorICAgICAqICAgICAgICAgICAgICBAZiQgbCA+PSAwIEBmJC4KKyAgICAgKiAgIEBwYXJhbSAgbSAgVGhlIG9yZGVyIG9mIHRoZSBzcGhlcmljYWwgYXNzb2NpYXRlZCBMZWdlbmRyZSBmdW5jdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgQGYkIG0gPD0gbCBAZiQuCisgICAgICogICBAcGFyYW0gIHRoZXRhICBUaGUgcmFkaWFuIGFuZ2xlIGFyZ3VtZW50IG9mIHRoZSBzcGhlcmljYWwgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgTGVnZW5kcmUgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3NwaF9sZWdlbmRyZShjb25zdCB1bnNpZ25lZCBpbnQgX19sLCBjb25zdCB1bnNpZ25lZCBpbnQgX19tLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3RoZXRhKQorICAgIHsKKyAgICAgIGlmIChfX2lzbmFuKF9fdGhldGEpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKworICAgICAgY29uc3QgX1RwIF9feCA9IHN0ZDo6Y29zKF9fdGhldGEpOworCisgICAgICBpZiAoX19sIDwgX19tKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fc3BoX2xlZ2VuZHJlLiIpKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX19tID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19QID0gX19wb2x5X2xlZ2VuZHJlX3AoX19sLCBfX3gpOworICAgICAgICAgIF9UcCBfX2ZhY3QgPSBzdGQ6OnNxcnQoX1RwKDIgKiBfX2wgKyAxKQorICAgICAgICAgICAgICAgICAgICAgLyAoX1RwKDQpICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpKTsKKyAgICAgICAgICBfX1AgKj0gX19mYWN0OworICAgICAgICAgIHJldHVybiBfX1A7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9feCA9PSBfVHAoMSkgfHwgX194ID09IC1fVHAoMSkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyAgbSA+IDAgaGVyZQorICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vIG0gPiAwIGFuZCB8eHwgPCAxIGhlcmUKKworICAgICAgICAgIC8vIFN0YXJ0aW5nIHZhbHVlIGZvciByZWN1cnNpb24uCisgICAgICAgICAgLy8gWV9tXm0oeCkgPSBzcXJ0KCAoMm0rMSkvKDRwaSBtKSBnYW1tYShtKzEvMikvZ2FtbWEobSkgKQorICAgICAgICAgIC8vICAgICAgICAgICAgICgtMSlebSAoMS14XjIpXihtLzIpIC8gcGleKDEvNCkKKyAgICAgICAgICBjb25zdCBfVHAgX19zZ24gPSAoIF9fbSAlIDIgPT0gMSA/IC1fVHAoMSkgOiBfVHAoMSkpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3lfbXAxbV9mYWN0b3IgPSBfX3ggKiBzdGQ6OnNxcnQoX1RwKDIgKiBfX20gKyAzKSk7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgIGNvbnN0IF9UcCBfX2xuY2lyYyA9IHN0ZDo6dHIxOjpsb2cxcCgtX194ICogX194KTsKKyNlbHNlCisgICAgICAgICAgY29uc3QgX1RwIF9fbG5jaXJjID0gc3RkOjpsb2coX1RwKDEpIC0gX194ICogX194KTsKKyNlbmRpZgorICAgICAgICAgIC8vICBHYW1tYShtKzEvMikgLyBHYW1tYShtKQorI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgICAgICBjb25zdCBfVHAgX19sbnBvY2ggPSBzdGQ6OnRyMTo6bGdhbW1hKF9UcChfX20gKyBfVHAoMC41TCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKF9fbSkpOworI2Vsc2UKKyAgICAgICAgICBjb25zdCBfVHAgX19sbnBvY2ggPSBfX2xvZ19nYW1tYShfVHAoX19tICsgX1RwKDAuNUwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoX19tKSk7CisjZW5kaWYKKyAgICAgICAgICBjb25zdCBfVHAgX19sbnByZV92YWwgPQorICAgICAgICAgICAgICAgICAgICAtX1RwKDAuMjVMKSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19sbnBpKCkKKyAgICAgICAgICAgICAgICAgICAgKyBfVHAoMC41TCkgKiAoX19sbnBvY2ggKyBfX20gKiBfX2xuY2lyYyk7CisgICAgICAgICAgX1RwIF9fc3IgPSBzdGQ6OnNxcnQoKF9UcCgyKSArIF9UcCgxKSAvIF9fbSkKKyAgICAgICAgICAgICAgICAgICAvIChfVHAoNCkgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSkpOworICAgICAgICAgIF9UcCBfX3lfbW0gPSBfX3NnbiAqIF9fc3IgKiBzdGQ6OmV4cChfX2xucHJlX3ZhbCk7CisgICAgICAgICAgX1RwIF9feV9tcDFtID0gX195X21wMW1fZmFjdG9yICogX195X21tOworCisgICAgICAgICAgaWYgKF9fbCA9PSBfX20pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBfX3lfbW07CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoX19sID09IF9fbSArIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHJldHVybiBfX3lfbXAxbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX3lfbG0gPSBfVHAoMCk7CisKKyAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBZX2xebSwgbCA+IG0rMSwgdXB3YXJkIHJlY3Vyc2lvbiBvbiBsLgorICAgICAgICAgICAgICBmb3IgKCBpbnQgX19sbCA9IF9fbSArIDI7IF9fbGwgPD0gX19sOyArK19fbGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgY29uc3QgX1RwIF9fcmF0MSA9IF9UcChfX2xsIC0gX19tKSAvIF9UcChfX2xsICsgX19tKTsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3JhdDIgPSBfVHAoX19sbCAtIF9fbSAtIDEpIC8gX1RwKF9fbGwgKyBfX20gLSAxKTsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2ZhY3QxID0gc3RkOjpzcXJ0KF9fcmF0MSAqIF9UcCgyICogX19sbCArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfVHAoMiAqIF9fbGwgLSAxKSk7CisgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX19mYWN0MiA9IHN0ZDo6c3FydChfX3JhdDEgKiBfX3JhdDIgKiBfVHAoMiAqIF9fbGwgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gX1RwKDIgKiBfX2xsIC0gMykpOworICAgICAgICAgICAgICAgICAgX195X2xtID0gKF9feCAqIF9feV9tcDFtICogX19mYWN0MQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKF9fbGwgKyBfX20gLSAxKSAqIF9feV9tbSAqIF9fZmFjdDIpIC8gX1RwKF9fbGwgLSBfX20pOworICAgICAgICAgICAgICAgICAgX195X21tID0gX195X21wMW07CisgICAgICAgICAgICAgICAgICBfX3lfbXAxbSA9IF9feV9sbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgcmV0dXJuIF9feV9sbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2Ugc3RkOjp0cjE6Ol9fZGV0YWlsCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfTEVHRU5EUkVfRlVOQ1RJT05fVENDCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9saW1pdHMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWQzNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9saW1pdHMuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgbGltaXRzLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbGltaXRzLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX0xJTUlUU19ICisjZGVmaW5lIF9UUjFfTElNSVRTX0ggMQorCisjaW5jbHVkZSA8dHIxL2NsaW1pdHM+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvbWF0aC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDZkNjQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9tYXRoLmgKQEAgLTAsMCArMSwxODYgQEAKKy8vIFRSMSBtYXRoLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvbWF0aC5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX01BVEhfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfTUFUSF9IIDEKKworI2luY2x1ZGUgPHRyMS9jbWF0aD4KKworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwordXNpbmcgc3RkOjp0cjE6OmFjb3M7Cit1c2luZyBzdGQ6OnRyMTo6YWNvc2g7Cit1c2luZyBzdGQ6OnRyMTo6YXNpbjsKK3VzaW5nIHN0ZDo6dHIxOjphc2luaDsKK3VzaW5nIHN0ZDo6dHIxOjphdGFuOwordXNpbmcgc3RkOjp0cjE6OmF0YW4yOwordXNpbmcgc3RkOjp0cjE6OmF0YW5oOwordXNpbmcgc3RkOjp0cjE6OmNicnQ7Cit1c2luZyBzdGQ6OnRyMTo6Y2VpbDsKK3VzaW5nIHN0ZDo6dHIxOjpjb3B5c2lnbjsKK3VzaW5nIHN0ZDo6dHIxOjpjb3M7Cit1c2luZyBzdGQ6OnRyMTo6Y29zaDsKK3VzaW5nIHN0ZDo6dHIxOjplcmY7Cit1c2luZyBzdGQ6OnRyMTo6ZXJmYzsKK3VzaW5nIHN0ZDo6dHIxOjpleHA7Cit1c2luZyBzdGQ6OnRyMTo6ZXhwMjsKK3VzaW5nIHN0ZDo6dHIxOjpleHBtMTsKK3VzaW5nIHN0ZDo6dHIxOjpmYWJzOwordXNpbmcgc3RkOjp0cjE6OmZkaW07Cit1c2luZyBzdGQ6OnRyMTo6Zmxvb3I7Cit1c2luZyBzdGQ6OnRyMTo6Zm1hOwordXNpbmcgc3RkOjp0cjE6OmZtYXg7Cit1c2luZyBzdGQ6OnRyMTo6Zm1pbjsKK3VzaW5nIHN0ZDo6dHIxOjpmbW9kOwordXNpbmcgc3RkOjp0cjE6OmZyZXhwOwordXNpbmcgc3RkOjp0cjE6Omh5cG90OwordXNpbmcgc3RkOjp0cjE6Omlsb2diOwordXNpbmcgc3RkOjp0cjE6OmxkZXhwOwordXNpbmcgc3RkOjp0cjE6OmxnYW1tYTsKK3VzaW5nIHN0ZDo6dHIxOjpsbHJpbnQ7Cit1c2luZyBzdGQ6OnRyMTo6bGxyb3VuZDsKK3VzaW5nIHN0ZDo6dHIxOjpsb2c7Cit1c2luZyBzdGQ6OnRyMTo6bG9nMTA7Cit1c2luZyBzdGQ6OnRyMTo6bG9nMXA7Cit1c2luZyBzdGQ6OnRyMTo6bG9nMjsKK3VzaW5nIHN0ZDo6dHIxOjpsb2diOwordXNpbmcgc3RkOjp0cjE6OmxyaW50OwordXNpbmcgc3RkOjp0cjE6Omxyb3VuZDsKK3VzaW5nIHN0ZDo6dHIxOjpuZWFyYnlpbnQ7Cit1c2luZyBzdGQ6OnRyMTo6bmV4dGFmdGVyOwordXNpbmcgc3RkOjp0cjE6Om5leHR0b3dhcmQ7Cit1c2luZyBzdGQ6OnRyMTo6cG93OwordXNpbmcgc3RkOjp0cjE6OnJlbWFpbmRlcjsKK3VzaW5nIHN0ZDo6dHIxOjpyZW1xdW87Cit1c2luZyBzdGQ6OnRyMTo6cmludDsKK3VzaW5nIHN0ZDo6dHIxOjpyb3VuZDsKK3VzaW5nIHN0ZDo6dHIxOjpzY2FsYmxuOwordXNpbmcgc3RkOjp0cjE6OnNjYWxibjsKK3VzaW5nIHN0ZDo6dHIxOjpzaW47Cit1c2luZyBzdGQ6OnRyMTo6c2luaDsKK3VzaW5nIHN0ZDo6dHIxOjpzcXJ0OwordXNpbmcgc3RkOjp0cjE6OnRhbjsKK3VzaW5nIHN0ZDo6dHIxOjp0YW5oOwordXNpbmcgc3RkOjp0cjE6OnRnYW1tYTsKK3VzaW5nIHN0ZDo6dHIxOjp0cnVuYzsKKworI2VuZGlmCisKK3VzaW5nIHN0ZDo6dHIxOjphc3NvY19sYWd1ZXJyZWY7Cit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGFndWVycmU7Cit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGFndWVycmVsOworCit1c2luZyBzdGQ6OnRyMTo6YXNzb2NfbGVnZW5kcmVmOwordXNpbmcgc3RkOjp0cjE6OmFzc29jX2xlZ2VuZHJlOwordXNpbmcgc3RkOjp0cjE6OmFzc29jX2xlZ2VuZHJlbDsKKwordXNpbmcgc3RkOjp0cjE6OmJldGFmOwordXNpbmcgc3RkOjp0cjE6OmJldGE7Cit1c2luZyBzdGQ6OnRyMTo6YmV0YWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8xZjsKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8xOwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzFsOworCit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfMmY7Cit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfMjsKK3VzaW5nIHN0ZDo6dHIxOjpjb21wX2VsbGludF8ybDsKKwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzNmOwordXNpbmcgc3RkOjp0cjE6OmNvbXBfZWxsaW50XzM7Cit1c2luZyBzdGQ6OnRyMTo6Y29tcF9lbGxpbnRfM2w7CisKK3VzaW5nIHN0ZDo6dHIxOjpjb25mX2h5cGVyZ2Y7Cit1c2luZyBzdGQ6OnRyMTo6Y29uZl9oeXBlcmc7Cit1c2luZyBzdGQ6OnRyMTo6Y29uZl9oeXBlcmdsOworCit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9pZjsKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2k7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9pbDsKKwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfamY7Cit1c2luZyBzdGQ6OnRyMTo6Y3lsX2Jlc3NlbF9qOwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfamw7CisKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2tmOwordXNpbmcgc3RkOjp0cjE6OmN5bF9iZXNzZWxfazsKK3VzaW5nIHN0ZDo6dHIxOjpjeWxfYmVzc2VsX2tsOworCit1c2luZyBzdGQ6OnRyMTo6Y3lsX25ldW1hbm5mOwordXNpbmcgc3RkOjp0cjE6OmN5bF9uZXVtYW5uOwordXNpbmcgc3RkOjp0cjE6OmN5bF9uZXVtYW5ubDsKKwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8xZjsKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMTsKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMWw7CisKK3VzaW5nIHN0ZDo6dHIxOjplbGxpbnRfMmY7Cit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzI7Cit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzJsOworCit1c2luZyBzdGQ6OnRyMTo6ZWxsaW50XzNmOwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8zOwordXNpbmcgc3RkOjp0cjE6OmVsbGludF8zbDsKKwordXNpbmcgc3RkOjp0cjE6OmV4cGludGY7Cit1c2luZyBzdGQ6OnRyMTo6ZXhwaW50OwordXNpbmcgc3RkOjp0cjE6OmV4cGludGw7CisKK3VzaW5nIHN0ZDo6dHIxOjpoZXJtaXRlZjsKK3VzaW5nIHN0ZDo6dHIxOjpoZXJtaXRlOwordXNpbmcgc3RkOjp0cjE6Omhlcm1pdGVsOworCit1c2luZyBzdGQ6OnRyMTo6aHlwZXJnZjsKK3VzaW5nIHN0ZDo6dHIxOjpoeXBlcmc7Cit1c2luZyBzdGQ6OnRyMTo6aHlwZXJnbDsKKwordXNpbmcgc3RkOjp0cjE6OmxhZ3VlcnJlZjsKK3VzaW5nIHN0ZDo6dHIxOjpsYWd1ZXJyZTsKK3VzaW5nIHN0ZDo6dHIxOjpsYWd1ZXJyZWw7CisKK3VzaW5nIHN0ZDo6dHIxOjpsZWdlbmRyZWY7Cit1c2luZyBzdGQ6OnRyMTo6bGVnZW5kcmU7Cit1c2luZyBzdGQ6OnRyMTo6bGVnZW5kcmVsOworCit1c2luZyBzdGQ6OnRyMTo6cmllbWFubl96ZXRhZjsKK3VzaW5nIHN0ZDo6dHIxOjpyaWVtYW5uX3pldGE7Cit1c2luZyBzdGQ6OnRyMTo6cmllbWFubl96ZXRhbDsKKwordXNpbmcgc3RkOjp0cjE6OnNwaF9iZXNzZWxmOwordXNpbmcgc3RkOjp0cjE6OnNwaF9iZXNzZWw7Cit1c2luZyBzdGQ6OnRyMTo6c3BoX2Jlc3NlbGw7CisKK3VzaW5nIHN0ZDo6dHIxOjpzcGhfbGVnZW5kcmVmOwordXNpbmcgc3RkOjp0cjE6OnNwaF9sZWdlbmRyZTsKK3VzaW5nIHN0ZDo6dHIxOjpzcGhfbGVnZW5kcmVsOworCit1c2luZyBzdGQ6OnRyMTo6c3BoX25ldW1hbm5mOwordXNpbmcgc3RkOjp0cjE6OnNwaF9uZXVtYW5uOwordXNpbmcgc3RkOjp0cjE6OnNwaF9uZXVtYW5ubDsKKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9NQVRIX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL21lbW9yeSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL21lbW9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY0OTMyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvbWVtb3J5CkBAIC0wLDAgKzEsNTMgQEAKKy8vIDx0cjEvbWVtb3J5PiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgdHIxL21lbW9yeQorICogVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX01FTU9SWQorI2RlZmluZSBfR0xJQkNYWF9UUjFfTUVNT1JZIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaWYgZGVmaW5lZChfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDBYKQorIyAgZXJyb3IgVFIxIGhlYWRlciBjYW5ub3QgYmUgaW5jbHVkZWQgZnJvbSBDKysweCBoZWFkZXIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4gICAgICAgIAkvLyBzdGQ6OmV4Y2VwdGlvbgorI2luY2x1ZGUgPHR5cGVpbmZvPiAgICAgICAgIAkvLyBzdGQ6OnR5cGVfaW5mbyBpbiBnZXRfZGVsZXRlcgorI2luY2x1ZGUgPGJpdHMvc3RsX2FsZ29iYXNlLmg+ICAvLyBzdGQ6OnN3YXAKKyNpbmNsdWRlIDxpb3Nmd2Q+ICAgICAgICAgICAJLy8gc3RkOjpiYXNpY19vc3RyZWFtCisjaW5jbHVkZSA8ZXh0L2F0b21pY2l0eS5oPgorI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9mdW5jdGlvbi5oPiAJLy8gc3RkOjpsZXNzCisjaW5jbHVkZSA8ZGVidWcvZGVidWcuaD4KKyNpbmNsdWRlIDx0cjEvdHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dHIxL3NoYXJlZF9wdHIuaD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9NRU1PUlkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzEzNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvbW9kaWZpZWRfYmVzc2VsX2Z1bmMudGNjCkBAIC0wLDAgKzEsNDM3IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL21vZGlmaWVkX2Jlc3NlbF9mdW5jLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQuCisvLworLy8gUmVmZXJlbmNlczoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBFZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gOSwgcHAuIDM1NS00MzQsIFNlY3Rpb24gMTAgcHAuIDQzNS00NzgKKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBOdW1lcmljYWwgUmVjaXBlcyBpbiBDLCBieSBXLiBILiBQcmVzcywgUy4gQS4gVGV1a29sc2t5LAorLy8gICAgICAgVy4gVC4gVmV0dGVybGluZywgQi4gUC4gRmxhbm5lcnksIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzICgxOTkyKSwKKy8vICAgICAgIDJuZCBlZCwgcHAuIDI0Ni0yNDkuCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX01PRElGSUVEX0JFU1NFTF9GVU5DX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfTU9ESUZJRURfQkVTU0VMX0ZVTkNfVENDIDEKKworI2luY2x1ZGUgInNwZWNpYWxfZnVuY3Rpb25fdXRpbC5oIgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbnMgQGYkIElfXG51KHgpIEBmJCBhbmQKKyAgICAgKiAgICAgICAgICAgQGYkIEtfXG51KHgpIEBmJCBhbmQgdGhlaXIgZmlyc3QgZGVyaXZhdGl2ZXMKKyAgICAgKiAgICAgICAgICAgQGYkIEknX1xudSh4KSBAZiQgYW5kIEBmJCBLJ19cbnUoeCkgQGYkIHJlc3BlY3RpdmVseS4KKyAgICAgKiAgICAgICAgICAgVGhlc2UgZm91ciBmdW5jdGlvbnMgYXJlIGNvbXB1dGVkIHRvZ2V0aGVyIGZvciBudW1lcmljYWwKKyAgICAgKiAgICAgICAgICAgc3RhYmlsaXR5LgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbnUgIFRoZSBvcmRlciBvZiB0aGUgQmVzc2VsIGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX194ICAgVGhlIGFyZ3VtZW50IG9mIHRoZSBCZXNzZWwgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX0ludSAgVGhlIG91dHB1dCByZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19LbnUgIFRoZSBvdXRwdXQgaXJyZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19JcG51ICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIHJlZ3VsYXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fS3BudSAgVGhlIG91dHB1dCBkZXJpdmF0aXZlIG9mIHRoZSBpcnJlZ3VsYXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19iZXNzZWxfaWsoY29uc3QgX1RwIF9fbnUsIGNvbnN0IF9UcCBfX3gsCisgICAgICAgICAgICAgICAgX1RwICYgX19JbnUsIF9UcCAmIF9fS251LCBfVHAgJiBfX0lwbnUsIF9UcCAmIF9fS3BudSkKKyAgICB7CisgICAgICBpZiAoX194ID09IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX251ID09IF9UcCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19JbnUgPSBfVHAoMSk7CisgICAgICAgICAgICAgIF9fSXBudSA9IF9UcCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChfX251ID09IF9UcCgxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19JbnUgPSBfVHAoMCk7CisgICAgICAgICAgICAgIF9fSXBudSA9IF9UcCgwLjVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9fSW51ID0gX1RwKDApOworICAgICAgICAgICAgICBfX0lwbnUgPSBfVHAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgX19LbnUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICAgICAgX19LcG51ID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6aW5maW5pdHkoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBfVHAgX19mcF9taW4gPSBfVHAoMTApICogc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICBjb25zdCBpbnQgX19tYXhfaXRlciA9IDE1MDAwOworICAgICAgY29uc3QgX1RwIF9feF9taW4gPSBfVHAoMik7CisKKyAgICAgIGNvbnN0IGludCBfX25sID0gc3RhdGljX2Nhc3Q8aW50PihfX251ICsgX1RwKDAuNUwpKTsKKworICAgICAgY29uc3QgX1RwIF9fbXUgPSBfX251IC0gX19ubDsKKyAgICAgIGNvbnN0IF9UcCBfX211MiA9IF9fbXUgKiBfX211OworICAgICAgY29uc3QgX1RwIF9feGkgPSBfVHAoMSkgLyBfX3g7CisgICAgICBjb25zdCBfVHAgX194aTIgPSBfVHAoMikgKiBfX3hpOworICAgICAgX1RwIF9faCA9IF9fbnUgKiBfX3hpOworICAgICAgaWYgKCBfX2ggPCBfX2ZwX21pbiApCisgICAgICAgIF9faCA9IF9fZnBfbWluOworICAgICAgX1RwIF9fYiA9IF9feGkyICogX19udTsKKyAgICAgIF9UcCBfX2QgPSBfVHAoMCk7CisgICAgICBfVHAgX19jID0gX19oOworICAgICAgaW50IF9faTsKKyAgICAgIGZvciAoIF9faSA9IDE7IF9faSA8PSBfX21heF9pdGVyOyArK19faSApCisgICAgICAgIHsKKyAgICAgICAgICBfX2IgKz0gX194aTI7CisgICAgICAgICAgX19kID0gX1RwKDEpIC8gKF9fYiArIF9fZCk7CisgICAgICAgICAgX19jID0gX19iICsgX1RwKDEpIC8gX19jOworICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbCA9IF9fYyAqIF9fZDsKKyAgICAgICAgICBfX2ggKj0gX19kZWw7CisgICAgICAgICAgaWYgKHN0ZDo6YWJzKF9fZGVsIC0gX1RwKDEpKSA8IF9fZXBzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChfX2kgPiBfX21heF9pdGVyKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIkFyZ3VtZW50IHggdG9vIGxhcmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX2Jlc3NlbF9qbjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeSBhc3ltcHRvdGljIGV4cGFuc2lvbi4iKSk7CisgICAgICBfVHAgX19JbnVsID0gX19mcF9taW47CisgICAgICBfVHAgX19JcG51bCA9IF9faCAqIF9fSW51bDsKKyAgICAgIF9UcCBfX0ludWwxID0gX19JbnVsOworICAgICAgX1RwIF9fSXBudTEgPSBfX0lwbnVsOworICAgICAgX1RwIF9fZmFjdCA9IF9fbnUgKiBfX3hpOworICAgICAgZm9yIChpbnQgX19sID0gX19ubDsgX19sID49IDE7IC0tX19sKQorICAgICAgICB7CisgICAgICAgICAgY29uc3QgX1RwIF9fSW51dGVtcCA9IF9fZmFjdCAqIF9fSW51bCArIF9fSXBudWw7CisgICAgICAgICAgX19mYWN0IC09IF9feGk7CisgICAgICAgICAgX19JcG51bCA9IF9fZmFjdCAqIF9fSW51dGVtcCArIF9fSW51bDsKKyAgICAgICAgICBfX0ludWwgPSBfX0ludXRlbXA7CisgICAgICAgIH0KKyAgICAgIF9UcCBfX2YgPSBfX0lwbnVsIC8gX19JbnVsOworICAgICAgX1RwIF9fS211LCBfX0tudTE7CisgICAgICBpZiAoX194IDwgX194X21pbikKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX3gyID0gX194IC8gX1RwKDIpOworICAgICAgICAgIGNvbnN0IF9UcCBfX3BpbXUgPSBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSAqIF9fbXU7CisgICAgICAgICAgY29uc3QgX1RwIF9fZmFjdCA9IChzdGQ6OmFicyhfX3BpbXUpIDwgX19lcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9UcCgxKSA6IF9fcGltdSAvIHN0ZDo6c2luKF9fcGltdSkpOworICAgICAgICAgIF9UcCBfX2QgPSAtc3RkOjpsb2coX194Mik7CisgICAgICAgICAgX1RwIF9fZSA9IF9fbXUgKiBfX2Q7CisgICAgICAgICAgY29uc3QgX1RwIF9fZmFjdDIgPSAoc3RkOjphYnMoX19lKSA8IF9fZXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfVHAoMSkgOiBzdGQ6OnNpbmgoX19lKSAvIF9fZSk7CisgICAgICAgICAgX1RwIF9fZ2FtMSwgX19nYW0yLCBfX2dhbXBsLCBfX2dhbW1pOworICAgICAgICAgIF9fZ2FtbWFfdGVtbWUoX19tdSwgX19nYW0xLCBfX2dhbTIsIF9fZ2FtcGwsIF9fZ2FtbWkpOworICAgICAgICAgIF9UcCBfX2ZmID0gX19mYWN0CisgICAgICAgICAgICAgICAgICAgKiAoX19nYW0xICogc3RkOjpjb3NoKF9fZSkgKyBfX2dhbTIgKiBfX2ZhY3QyICogX19kKTsKKyAgICAgICAgICBfVHAgX19zdW0gPSBfX2ZmOworICAgICAgICAgIF9fZSA9IHN0ZDo6ZXhwKF9fZSk7CisgICAgICAgICAgX1RwIF9fcCA9IF9fZSAvIChfVHAoMikgKiBfX2dhbXBsKTsKKyAgICAgICAgICBfVHAgX19xID0gX1RwKDEpIC8gKF9UcCgyKSAqIF9fZSAqIF9fZ2FtbWkpOworICAgICAgICAgIF9UcCBfX2MgPSBfVHAoMSk7CisgICAgICAgICAgX19kID0gX194MiAqIF9feDI7CisgICAgICAgICAgX1RwIF9fc3VtMSA9IF9fcDsKKyAgICAgICAgICBpbnQgX19pOworICAgICAgICAgIGZvciAoX19pID0gMTsgX19pIDw9IF9fbWF4X2l0ZXI7ICsrX19pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX2ZmID0gKF9faSAqIF9fZmYgKyBfX3AgKyBfX3EpIC8gKF9faSAqIF9faSAtIF9fbXUyKTsKKyAgICAgICAgICAgICAgX19jICo9IF9fZCAvIF9faTsKKyAgICAgICAgICAgICAgX19wIC89IF9faSAtIF9fbXU7CisgICAgICAgICAgICAgIF9fcSAvPSBfX2kgKyBfX211OworICAgICAgICAgICAgICBjb25zdCBfVHAgX19kZWwgPSBfX2MgKiBfX2ZmOworICAgICAgICAgICAgICBfX3N1bSArPSBfX2RlbDsgCisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX2RlbDEgPSBfX2MgKiAoX19wIC0gX19pICogX19mZik7CisgICAgICAgICAgICAgIF9fc3VtMSArPSBfX2RlbDE7CisgICAgICAgICAgICAgIGlmIChzdGQ6OmFicyhfX2RlbCkgPCBfX2VwcyAqIHN0ZDo6YWJzKF9fc3VtKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoX19pID4gX19tYXhfaXRlcikKKyAgICAgICAgICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigiQmVzc2VsIGsgc2VyaWVzIGZhaWxlZCB0byBjb252ZXJnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fYmVzc2VsX2puLiIpKTsKKyAgICAgICAgICBfX0ttdSA9IF9fc3VtOworICAgICAgICAgIF9fS251MSA9IF9fc3VtMSAqIF9feGkyOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19iID0gX1RwKDIpICogKF9UcCgxKSArIF9feCk7CisgICAgICAgICAgX1RwIF9fZCA9IF9UcCgxKSAvIF9fYjsKKyAgICAgICAgICBfVHAgX19kZWxoID0gX19kOworICAgICAgICAgIF9UcCBfX2ggPSBfX2RlbGg7CisgICAgICAgICAgX1RwIF9fcTEgPSBfVHAoMCk7CisgICAgICAgICAgX1RwIF9fcTIgPSBfVHAoMSk7CisgICAgICAgICAgX1RwIF9fYTEgPSBfVHAoMC4yNUwpIC0gX19tdTI7CisgICAgICAgICAgX1RwIF9fcSA9IF9fYyA9IF9fYTE7CisgICAgICAgICAgX1RwIF9fYSA9IC1fX2ExOworICAgICAgICAgIF9UcCBfX3MgPSBfVHAoMSkgKyBfX3EgKiBfX2RlbGg7CisgICAgICAgICAgaW50IF9faTsKKyAgICAgICAgICBmb3IgKF9faSA9IDI7IF9faSA8PSBfX21heF9pdGVyOyArK19faSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX19hIC09IDIgKiAoX19pIC0gMSk7CisgICAgICAgICAgICAgIF9fYyA9IC1fX2EgKiBfX2MgLyBfX2k7CisgICAgICAgICAgICAgIGNvbnN0IF9UcCBfX3FuZXcgPSAoX19xMSAtIF9fYiAqIF9fcTIpIC8gX19hOworICAgICAgICAgICAgICBfX3ExID0gX19xMjsKKyAgICAgICAgICAgICAgX19xMiA9IF9fcW5ldzsKKyAgICAgICAgICAgICAgX19xICs9IF9fYyAqIF9fcW5ldzsKKyAgICAgICAgICAgICAgX19iICs9IF9UcCgyKTsKKyAgICAgICAgICAgICAgX19kID0gX1RwKDEpIC8gKF9fYiArIF9fYSAqIF9fZCk7CisgICAgICAgICAgICAgIF9fZGVsaCA9IChfX2IgKiBfX2QgLSBfVHAoMSkpICogX19kZWxoOworICAgICAgICAgICAgICBfX2ggKz0gX19kZWxoOworICAgICAgICAgICAgICBjb25zdCBfVHAgX19kZWxzID0gX19xICogX19kZWxoOworICAgICAgICAgICAgICBfX3MgKz0gX19kZWxzOworICAgICAgICAgICAgICBpZiAoIHN0ZDo6YWJzKF9fZGVscyAvIF9fcykgPCBfX2VwcyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9faSA+IF9fbWF4X2l0ZXIpCisgICAgICAgICAgICBzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oIlN0ZWVkJ3MgbWV0aG9kIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fYmVzc2VsX2puLiIpKTsKKyAgICAgICAgICBfX2ggPSBfX2ExICogX19oOworICAgICAgICAgIF9fS211ID0gc3RkOjpzcXJ0KF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpIC8gKF9UcCgyKSAqIF9feCkpCisgICAgICAgICAgICAgICAgKiBzdGQ6OmV4cCgtX194KSAvIF9fczsKKyAgICAgICAgICBfX0tudTEgPSBfX0ttdSAqIChfX211ICsgX194ICsgX1RwKDAuNUwpIC0gX19oKSAqIF9feGk7CisgICAgICAgIH0KKworICAgICAgX1RwIF9fS3BtdSA9IF9fbXUgKiBfX3hpICogX19LbXUgLSBfX0tudTE7CisgICAgICBfVHAgX19JbnVtdSA9IF9feGkgLyAoX19mICogX19LbXUgLSBfX0twbXUpOworICAgICAgX19JbnUgPSBfX0ludW11ICogX19JbnVsMSAvIF9fSW51bDsKKyAgICAgIF9fSXBudSA9IF9fSW51bXUgKiBfX0lwbnUxIC8gX19JbnVsOworICAgICAgZm9yICggX19pID0gMTsgX19pIDw9IF9fbmw7ICsrX19pICkKKyAgICAgICAgeworICAgICAgICAgIGNvbnN0IF9UcCBfX0tudXRlbXAgPSAoX19tdSArIF9faSkgKiBfX3hpMiAqIF9fS251MSArIF9fS211OworICAgICAgICAgIF9fS211ID0gX19LbnUxOworICAgICAgICAgIF9fS251MSA9IF9fS251dGVtcDsKKyAgICAgICAgfQorICAgICAgX19LbnUgPSBfX0ttdTsKKyAgICAgIF9fS3BudSA9IF9fbnUgKiBfX3hpICogX19LbXUgLSBfX0tudTE7CisgIAorICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIFJldHVybiB0aGUgcmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2Ygb3JkZXIKKyAgICAgKiAgICAgICAgICAgXGYkIFxudSBcZiQ6IFxmJCBJX3tcbnV9KHgpIFxmJC4KKyAgICAgKgorICAgICAqICAgVGhlIHJlZ3VsYXIgbW9kaWZpZWQgY3lsaW5kcmljYWwgQmVzc2VsIGZ1bmN0aW9uIGlzOgorICAgICAqICAgQGZbCisgICAgICogICAgSV97XG51fSh4KSA9IFxzdW1fe2s9MH1ee1xpbmZ0eX0KKyAgICAgKiAgICAgICAgICAgICAgXGZyYWN7KHgvMilee1xudSArIDJrfX17ayFcR2FtbWEoXG51K2srMSl9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIHJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX3ggICBUaGUgYXJndW1lbnQgb2YgdGhlIHJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHJldHVybiAgVGhlIG91dHB1dCByZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jeWxfYmVzc2VsX2koY29uc3QgX1RwIF9fbnUsIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9fbnUgPCBfVHAoMCkgfHwgX194IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fY3lsX2Jlc3NlbF9pLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9faXNuYW4oX19udSkgfHwgX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9feCAqIF9feCA8IF9UcCgxMCkgKiAoX19udSArIF9UcCgxKSkpCisgICAgICAgIHJldHVybiBfX2N5bF9iZXNzZWxfaWpfc2VyaWVzKF9fbnUsIF9feCwgK19UcCgxKSwgMjAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udTsKKyAgICAgICAgICBfX2Jlc3NlbF9payhfX251LCBfX3gsIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251KTsKKyAgICAgICAgICByZXR1cm4gX19JX251OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBpcnJlZ3VsYXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uCisgICAgICogICAgICAgICAgIFxmJCBLX3tcbnV9KHgpIFxmJCBvZiBvcmRlciBcZiQgXG51IFxmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGlycmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgS197XG51fSh4KSA9IFxmcmFje1xwaX17Mn0KKyAgICAgKiAgICAgICAgICAgICAgICAgICBcZnJhY3tJX3stXG51fSh4KSAtIElfe1xudX0oeCl9e1xzaW4gXG51XHBpfQorICAgICAqICAgQGZdCisgICAgICogICB3aGVyZSBmb3IgaW50ZWdyYWwgXGYkIFxudSA9IG4gXGYkIGEgbGltaXQgaXMgdGFrZW46CisgICAgICogICBcZiQgbGltX3tcbnUgXHRvIG59IFxmJC4KKyAgICAgKgorICAgICAqICAgQHBhcmFtICBfX251ICBUaGUgb3JkZXIgb2YgdGhlIGlycmVndWxhciBtb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgIFRoZSBhcmd1bWVudCBvZiB0aGUgaXJyZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gIFRoZSBvdXRwdXQgaXJyZWd1bGFyIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19jeWxfYmVzc2VsX2soY29uc3QgX1RwIF9fbnUsIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgaWYgKF9fbnUgPCBfVHAoMCkgfHwgX194IDwgX1RwKDApKQorICAgICAgICBzdGQ6Ol9fdGhyb3dfZG9tYWluX2Vycm9yKF9fTigiQmFkIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIF9fY3lsX2Jlc3NlbF9rLiIpKTsKKyAgICAgIGVsc2UgaWYgKF9faXNuYW4oX19udSkgfHwgX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0lfbnUsIF9fS19udSwgX19JcF9udSwgX19LcF9udTsKKyAgICAgICAgICBfX2Jlc3NlbF9payhfX251LCBfX3gsIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251KTsKKyAgICAgICAgICByZXR1cm4gX19LX251OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgc3BoZXJpY2FsIG1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbnMKKyAgICAgKiAgICAgICAgICAgQGYkIGlfbih4KSBAZiQgYW5kIEBmJCBrX24oeCkgQGYkIGFuZCB0aGVpciBmaXJzdAorICAgICAqICAgICAgICAgICBkZXJpdmF0aXZlcyBAZiQgaSdfbih4KSBAZiQgYW5kIEBmJCBrJ19uKHgpIEBmJAorICAgICAqICAgICAgICAgICByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSAgX19uICBUaGUgb3JkZXIgb2YgdGhlIG1vZGlmaWVkIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9feCAgVGhlIGFyZ3VtZW50IG9mIHRoZSBtb2RpZmllZCBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2lfbiAgVGhlIG91dHB1dCByZWd1bGFyIG1vZGlmaWVkIHNwaGVyaWNhbCBCZXNzZWwgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gIF9fa19uICBUaGUgb3V0cHV0IGlycmVndWxhciBtb2RpZmllZCBzcGhlcmljYWwKKyAgICAgKiAgICAgICAgICAgICAgICAgIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19pcF9uICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIHJlZ3VsYXIgbW9kaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBzcGhlcmljYWwgQmVzc2VsIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2twX24gIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgaXJyZWd1bGFyIG1vZGlmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgc3BoZXJpY2FsIEJlc3NlbCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1RwPgorICAgIHZvaWQKKyAgICBfX3NwaF9iZXNzZWxfaWsoY29uc3QgdW5zaWduZWQgaW50IF9fbiwgY29uc3QgX1RwIF9feCwKKyAgICAgICAgICAgICAgICAgICAgX1RwICYgX19pX24sIF9UcCAmIF9fa19uLCBfVHAgJiBfX2lwX24sIF9UcCAmIF9fa3BfbikKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19udSA9IF9UcChfX24pICsgX1RwKDAuNUwpOworCisgICAgICBfVHAgX19JX251LCBfX0lwX251LCBfX0tfbnUsIF9fS3BfbnU7CisgICAgICBfX2Jlc3NlbF9payhfX251LCBfX3gsIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251KTsKKworICAgICAgY29uc3QgX1RwIF9fZmFjdG9yID0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnRwaW8yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAvIHN0ZDo6c3FydChfX3gpOworCisgICAgICBfX2lfbiA9IF9fZmFjdG9yICogX19JX251OworICAgICAgX19rX24gPSBfX2ZhY3RvciAqIF9fS19udTsKKyAgICAgIF9faXBfbiA9IF9fZmFjdG9yICogX19JcF9udSAtIF9faV9uIC8gKF9UcCgyKSAqIF9feCk7CisgICAgICBfX2twX24gPSBfX2ZhY3RvciAqIF9fS3BfbnUgLSBfX2tfbiAvIChfVHAoMikgKiBfX3gpOworCisgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgQ29tcHV0ZSB0aGUgQWlyeSBmdW5jdGlvbnMKKyAgICAgKiAgICAgICAgICAgQGYkIEFpKHgpIEBmJCBhbmQgQGYkIEJpKHgpIEBmJCBhbmQgdGhlaXIgZmlyc3QKKyAgICAgKiAgICAgICAgICAgZGVyaXZhdGl2ZXMgQGYkIEFpJyh4KSBAZiQgYW5kIEBmJCBCaSh4KSBAZiQKKyAgICAgKiAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorICAgICAqCisgICAgICogICBAcGFyYW0gIF9fbiAgVGhlIG9yZGVyIG9mIHRoZSBBaXJ5IGZ1bmN0aW9ucy4KKyAgICAgKiAgIEBwYXJhbSAgX194ICBUaGUgYXJndW1lbnQgb2YgdGhlIEFpcnkgZnVuY3Rpb25zLgorICAgICAqICAgQHBhcmFtICBfX2lfbiAgVGhlIG91dHB1dCBBaXJ5IGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2tfbiAgVGhlIG91dHB1dCBBaXJ5IGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtICBfX2lwX24gIFRoZSBvdXRwdXQgZGVyaXZhdGl2ZSBvZiB0aGUgQWlyeSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSAgX19rcF9uICBUaGUgb3V0cHV0IGRlcml2YXRpdmUgb2YgdGhlIEFpcnkgZnVuY3Rpb24uCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UcD4KKyAgICB2b2lkCisgICAgX19haXJ5KGNvbnN0IF9UcCBfX3gsCisgICAgICAgICAgIF9UcCAmIF9fQWksIF9UcCAmIF9fQmksIF9UcCAmIF9fQWlwLCBfVHAgJiBfX0JpcCkKKyAgICB7CisgICAgICBjb25zdCBfVHAgX19hYnN4ID0gc3RkOjphYnMoX194KTsKKyAgICAgIGNvbnN0IF9UcCBfX3Jvb3R4ID0gc3RkOjpzcXJ0KF9fYWJzeCk7CisgICAgICBjb25zdCBfVHAgX196ID0gX1RwKDIpICogX19hYnN4ICogX19yb290eCAvIF9UcCgzKTsKKworICAgICAgaWYgKF9faXNuYW4oX194KSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8X1RwPjo6cXVpZXRfTmFOKCk7CisgICAgICBlbHNlIGlmIChfX3ggPiBfVHAoMCkpCisgICAgICAgIHsKKyAgICAgICAgICBfVHAgX19JX251LCBfX0lwX251LCBfX0tfbnUsIF9fS3BfbnU7CisKKyAgICAgICAgICBfX2Jlc3NlbF9payhfVHAoMSkgLyBfVHAoMyksIF9feiwgX19JX251LCBfX0tfbnUsIF9fSXBfbnUsIF9fS3BfbnUpOworICAgICAgICAgIF9fQWkgPSBfX3Jvb3R4ICogX19LX251CisgICAgICAgICAgICAgICAvIChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKQorICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCkpOworICAgICAgICAgIF9fQmkgPSBfX3Jvb3R4ICogKF9fS19udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpCisgICAgICAgICAgICAgICAgICsgX1RwKDIpICogX19JX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkpOworCisgICAgICAgICAgX19iZXNzZWxfaWsoX1RwKDIpIC8gX1RwKDMpLCBfX3osIF9fSV9udSwgX19LX251LCBfX0lwX251LCBfX0twX251KTsKKyAgICAgICAgICBfX0FpcCA9IC1fX3ggKiBfX0tfbnUKKyAgICAgICAgICAgICAgICAvIChfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKQorICAgICAgICAgICAgICAgICAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKTsKKyAgICAgICAgICBfX0JpcCA9IF9feCAqIChfX0tfbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKQorICAgICAgICAgICAgICAgICAgICAgICsgX1RwKDIpICogX19JX251CisgICAgICAgICAgICAgICAgICAgICAgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKF9feCA8IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX0pfbnUsIF9fSnBfbnUsIF9fTl9udSwgX19OcF9udTsKKworICAgICAgICAgIF9fYmVzc2VsX2puKF9UcCgxKSAvIF9UcCgzKSwgX196LCBfX0pfbnUsIF9fTl9udSwgX19KcF9udSwgX19OcF9udSk7CisgICAgICAgICAgX19BaSA9IF9fcm9vdHggKiAoX19KX251CisgICAgICAgICAgICAgICAgICAgIC0gX19OX251IC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3NxcnQzKCkpIC8gX1RwKDIpOworICAgICAgICAgIF9fQmkgPSAtX19yb290eCAqIChfX05fbnUKKyAgICAgICAgICAgICAgICAgICAgKyBfX0pfbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKSkgLyBfVHAoMik7CisKKyAgICAgICAgICBfX2Jlc3NlbF9qbihfVHAoMikgLyBfVHAoMyksIF9feiwgX19KX251LCBfX05fbnUsIF9fSnBfbnUsIF9fTnBfbnUpOworICAgICAgICAgIF9fQWlwID0gX19hYnN4ICogKF9fTl9udSAvIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgX19KX251KSAvIF9UcCgyKTsKKyAgICAgICAgICBfX0JpcCA9IF9fYWJzeCAqIChfX0pfbnUgLyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fc3FydDMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fTl9udSkgLyBfVHAoMik7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8vICBSZWZlcmVuY2U6CisgICAgICAgICAgLy8gICAgQWJyYW1vd2l0eiAmIFN0ZWd1biwgcGFnZSA0NDYgc2VjdGlvbiAxMC40LjQgb24gQWlyeSBmdW5jdGlvbnMuCisgICAgICAgICAgLy8gIFRoZSBudW1iZXIgaXMgQWkoMCkgPSAzXnstMi8zfS9cR2FtbWEoMi8zKS4KKyAgICAgICAgICBfX0FpID0gX1RwKDAuMzU1MDI4MDUzODg3ODE3MjM5MjZMKTsKKyAgICAgICAgICBfX0JpID0gX19BaSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpOworCisgICAgICAgICAgLy8gIFJlZmVyZW5jZToKKyAgICAgICAgICAvLyAgICBBYnJhbW93aXR6ICYgU3RlZ3VuLCBwYWdlIDQ0NiBzZWN0aW9uIDEwLjQuNSBvbiBBaXJ5IGZ1bmN0aW9ucy4KKyAgICAgICAgICAvLyAgVGhlIG51bWJlciBpcyBBaScoMCkgPSAtM157LTEvM30vXEdhbW1hKDEvMykuCisgICAgICAgICAgX19BaXAgPSAtX1RwKDAuMjU4ODE5NDAzNzkyODA2Nzk4NDBMKTsKKyAgICAgICAgICBfX0JpcCA9IC1fX0FpcCAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19zcXJ0MygpOworICAgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX01PRElGSUVEX0JFU1NFTF9GVU5DX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvcG9seV9oZXJtaXRlLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3BvbHlfaGVybWl0ZS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlODA3OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3BvbHlfaGVybWl0ZS50Y2MKQEAgLTAsMCArMSwxMjUgQEAKKy8vIFNwZWNpYWwgZnVuY3Rpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvcG9seV9oZXJtaXRlLnRjYworICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9jbWF0aH0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MiBUUjE6IDUuMiAgU3BlY2lhbCBmdW5jdGlvbnMKKy8vCisKKy8vIFdyaXR0ZW4gYnkgRWR3YXJkIFNtaXRoLVJvd2xhbmQgYmFzZWQgb246CisvLyAgICgxKSBIYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zLAorLy8gICAgICAgRWQuIE1pbHRvbiBBYnJhbW93aXR6IGFuZCBJcmVuZSBBLiBTdGVndW4sCisvLyAgICAgICBEb3ZlciBQdWJsaWNhdGlvbnMsIFNlY3Rpb24gMjIgcHAuIDc3My04MDIKKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUE9MWV9IRVJNSVRFX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfUE9MWV9IRVJNSVRFX1RDQyAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworICAvLyBbNS4yXSBTcGVjaWFsIGZ1bmN0aW9ucworCisgIC8vIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgIG5hbWVzcGFjZSBfX2RldGFpbAorICB7CisgIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgSGVybWl0ZSBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgbjogXGYkIEhfbih4KSBcZiQgYnkgcmVjdXJzaW9uIG9uIG4uCisgICAgICogCisgICAgICogICBUaGUgSGVybWl0ZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgSF9uKHgpID0gKC0xKV5uIGVee3heMn0gXGZyYWN7ZF5ufXtkeF5ufSBlXnsteF4yfQorICAgICAqICAgQGZdCisgICAgICoKKyAgICAgKiAgIEBwYXJhbSBfX24gVGhlIG9yZGVyIG9mIHRoZSBIZXJtaXRlIHBvbHlub21pYWwuCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgSGVybWl0ZSBwb2x5bm9taWFsLgorICAgICAqICAgQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEhlcm1pdGUgcG9seW5vbWlhbCBvZiBvcmRlciBuCisgICAgICogICAgICAgICAgIGFuZCBhcmd1bWVudCB4LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfaGVybWl0ZV9yZWN1cnNpb24oY29uc3QgdW5zaWduZWQgaW50IF9fbiwgY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICAvLyAgQ29tcHV0ZSBIXzAuCisgICAgICBfVHAgX19IXzAgPSAxOworICAgICAgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX19IXzA7CisKKyAgICAgIC8vICBDb21wdXRlIEhfMS4KKyAgICAgIF9UcCBfX0hfMSA9IDIgKiBfX3g7CisgICAgICBpZiAoX19uID09IDEpCisgICAgICAgIHJldHVybiBfX0hfMTsKKworICAgICAgLy8gIENvbXB1dGUgSF9uLgorICAgICAgX1RwIF9fSF9uLCBfX0hfbm0xLCBfX0hfbm0yOworICAgICAgdW5zaWduZWQgaW50IF9faTsKKyAgICAgIGZvciAgKF9fSF9ubTIgPSBfX0hfMCwgX19IX25tMSA9IF9fSF8xLCBfX2kgPSAyOyBfX2kgPD0gX19uOyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIF9fSF9uID0gMiAqIChfX3ggKiBfX0hfbm0xIC0gKF9faSAtIDEpICogX19IX25tMik7CisgICAgICAgICAgX19IX25tMiA9IF9fSF9ubTE7CisgICAgICAgICAgX19IX25tMSA9IF9fSF9uOworICAgICAgICB9CisKKyAgICAgIHJldHVybiBfX0hfbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBIZXJtaXRlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuOiBcZiQgSF9uKHgpIFxmJC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBIZXJtaXRlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICBIX24oeCkgPSAoLTEpXm4gZV57eF4yfSBcZnJhY3tkXm59e2R4Xm59IGVeey14XjJ9CisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIEhlcm1pdGUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBIZXJtaXRlIHBvbHlub21pYWwuCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSGVybWl0ZSBwb2x5bm9taWFsIG9mIG9yZGVyIG4KKyAgICAgKiAgICAgICAgICAgYW5kIGFyZ3VtZW50IHguCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX3BvbHlfaGVybWl0ZShjb25zdCB1bnNpZ25lZCBpbnQgX19uLCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX2lzbmFuKF9feCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OnF1aWV0X05hTigpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gX19wb2x5X2hlcm1pdGVfcmVjdXJzaW9uKF9fbiwgX194KTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1BPTFlfSEVSTUlURV9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3BvbHlfbGFndWVycmUudGNjIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvcG9seV9sYWd1ZXJyZS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5OTIzZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3BvbHlfbGFndWVycmUudGNjCkBAIC0wLDAgKzEsMzI5IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3BvbHlfbGFndWVycmUudGNjCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL2NtYXRofQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyIFRSMTogNS4yICBTcGVjaWFsIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBFZHdhcmQgU21pdGgtUm93bGFuZCBiYXNlZCBvbjoKKy8vICAgKDEpIEhhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnMsCisvLyAgICAgICBFZC4gTWlsdG9uIEFicmFtb3dpdHogYW5kIElyZW5lIEEuIFN0ZWd1biwKKy8vICAgICAgIERvdmVyIFB1YmxpY2F0aW9ucywKKy8vICAgICAgIFNlY3Rpb24gMTMsIHBwLiA1MDktNTEwLCBTZWN0aW9uIDIyIHBwLiA3NzMtODAyCisvLyAgICgyKSBUaGUgR251IFNjaWVudGlmaWMgTGlicmFyeSwgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dzbAorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9QT0xZX0xBR1VFUlJFX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfUE9MWV9MQUdVRVJSRV9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLy8gWzUuMl0gU3BlY2lhbCBmdW5jdGlvbnMKKworICAvLyBJbXBsZW1lbnRhdGlvbi1zcGFjZSBkZXRhaWxzLgorICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCAKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBAZiQgbiBAZiQsIGRlZ3JlZSBAZiQgXGFscGhhIEBmJCBmb3IgbGFyZ2Ugbi4KKyAgICAgKiAgIEFicmFtb3dpdHogJiBTdGVndW4sIDEzLjUuMjEKKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9fYWxwaGEgVGhlIGRlZ3JlZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24gb2Ygb3JkZXIgbiwKKyAgICAgKiAgICAgICAgICAgZGVncmVlIEBmJCBcYWxwaGEgQGYkLCBhbmQgYXJndW1lbnQgeC4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIGZyb20gdGhlIEdOVSBTY2llbnRpZmljIExpYnJhcnkuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcG9seV9sYWd1ZXJyZV9sYXJnZV9uKGNvbnN0IHVuc2lnbmVkIF9fbiwgY29uc3QgX1RwYSBfX2FscGhhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGNvbnN0IF9UcCBfX2EgPSAtX1RwKF9fbik7CisgICAgICBjb25zdCBfVHAgX19iID0gX1RwKF9fYWxwaGExKSArIF9UcCgxKTsKKyAgICAgIGNvbnN0IF9UcCBfX2V0YSA9IF9UcCgyKSAqIF9fYiAtIF9UcCg0KSAqIF9fYTsKKyAgICAgIGNvbnN0IF9UcCBfX2NvczJ0aCA9IF9feCAvIF9fZXRhOworICAgICAgY29uc3QgX1RwIF9fc2luMnRoID0gX1RwKDEpIC0gX19jb3MydGg7CisgICAgICBjb25zdCBfVHAgX190aCA9IHN0ZDo6YWNvcyhzdGQ6OnNxcnQoX19jb3MydGgpKTsKKyAgICAgIGNvbnN0IF9UcCBfX3ByZV9oID0gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKQorICAgICAgICAgICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGlfMigpCisgICAgICAgICAgICAgICAgICAgICAgICAqIF9fZXRhICogX19ldGEgKiBfX2NvczJ0aCAqIF9fc2luMnRoOworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgY29uc3QgX1RwIF9fbGdfYiA9IHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKF9fbikgKyBfX2IpOworICAgICAgY29uc3QgX1RwIF9fbG5mYWN0ID0gc3RkOjp0cjE6OmxnYW1tYShfVHAoX19uICsgMSkpOworI2Vsc2UKKyAgICAgIGNvbnN0IF9UcCBfX2xnX2IgPSBfX2xvZ19nYW1tYShfVHAoX19uKSArIF9fYik7CisgICAgICBjb25zdCBfVHAgX19sbmZhY3QgPSBfX2xvZ19nYW1tYShfVHAoX19uICsgMSkpOworI2VuZGlmCisKKyAgICAgIF9UcCBfX3ByZV90ZXJtMSA9IF9UcCgwLjVMKSAqIChfVHAoMSkgLSBfX2IpCisgICAgICAgICAgICAgICAgICAgICAgKiBzdGQ6OmxvZyhfVHAoMC4yNUwpICogX194ICogX19ldGEpOworICAgICAgX1RwIF9fcHJlX3Rlcm0yID0gX1RwKDAuMjVMKSAqIHN0ZDo6bG9nKF9fcHJlX2gpOworICAgICAgX1RwIF9fbG5wcmUgPSBfX2xnX2IgLSBfX2xuZmFjdCArIF9UcCgwLjVMKSAqIF9feAorICAgICAgICAgICAgICAgICAgICAgICsgX19wcmVfdGVybTEgLSBfX3ByZV90ZXJtMjsKKyAgICAgIF9UcCBfX3Nlcl90ZXJtMSA9IHN0ZDo6c2luKF9fYSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpKTsKKyAgICAgIF9UcCBfX3Nlcl90ZXJtMiA9IHN0ZDo6c2luKF9UcCgwLjI1TCkgKiBfX2V0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoX1RwKDIpICogX190aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjpzaW4oX1RwKDIpICogX190aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGlfNCgpKTsKKyAgICAgIF9UcCBfX3NlciA9IF9fc2VyX3Rlcm0xICsgX19zZXJfdGVybTI7CisKKyAgICAgIHJldHVybiBzdGQ6OmV4cChfX2xucHJlKSAqIF9fc2VyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIEBicmllZiAgRXZhbHVhdGUgdGhlIHBvbHlub21pYWwgYmFzZWQgb24gdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYworICAgICAqICAgICAgICAgIGZ1bmN0aW9uIGluIGEgc2FmZSB3YXksIHdpdGggbm8gcmVzdHJpY3Rpb24gb24gdGhlIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXlxhbHBoYSh4KSA9IFxmcmFjeyhcYWxwaGEgKyAxKV9ufXtuIX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXzFGXzEoLW47IFxhbHBoYSArIDE7IHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCAoXGFscGhhKV9uIEBmJCBpcyB0aGUgUG9jaGhhbW1lciBzeW1ib2wgYW5kCisgICAgICogICBAZiQgXzFGXzEoYTsgYzsgeCkgQGYkIGlzIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHggIT0gMC4KKyAgICAgKgorICAgICAqICBUaGlzIGlzIGZyb20gdGhlIEdOVSBTY2llbnRpZmljIExpYnJhcnkuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwYSwgdHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcG9seV9sYWd1ZXJyZV9oeXBlcmcoY29uc3QgdW5zaWduZWQgaW50IF9fbiwgY29uc3QgX1RwYSBfX2FscGhhMSwKKwkJCSAgIGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgY29uc3QgX1RwIF9fYiA9IF9UcChfX2FscGhhMSkgKyBfVHAoMSk7CisgICAgICBjb25zdCBfVHAgX19teCA9IC1fX3g7CisgICAgICBjb25zdCBfVHAgX190Y19zZ24gPSAoX194IDwgX1RwKDApID8gX1RwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKF9fbiAlIDIgPT0gMSkgPyAtX1RwKDEpIDogX1RwKDEpKSk7CisgICAgICAvLyAgR2V0IHx4fF5uL24hCisgICAgICBfVHAgX190YyA9IF9UcCgxKTsKKyAgICAgIGNvbnN0IF9UcCBfX2F4ID0gc3RkOjphYnMoX194KTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8PSBfX247ICsrX19rKQorICAgICAgICBfX3RjICo9IChfX2F4IC8gX19rKTsKKworICAgICAgX1RwIF9fdGVybSA9IF9fdGMgKiBfX3RjX3NnbjsKKyAgICAgIF9UcCBfX3N1bSA9IF9fdGVybTsKKyAgICAgIGZvciAoaW50IF9fayA9IGludChfX24pIC0gMTsgX19rID49IDA7IC0tX19rKQorICAgICAgICB7CisgICAgICAgICAgX190ZXJtICo9ICgoX19iICsgX1RwKF9faykpIC8gX1RwKGludChfX24pIC0gX19rKSkKKyAgICAgICAgICAgICAgICAgICogX1RwKF9fayArIDEpIC8gX19teDsKKyAgICAgICAgICBfX3N1bSArPSBfX3Rlcm07CisgICAgICAgIH0KKworICAgICAgcmV0dXJuIF9fc3VtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCAKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBAZiQgbiBAZiQsIGRlZ3JlZSBAZiQgXGFscGhhIEBmJDogQGYkIExfbl5cYWxwaGEoeCkgQGYkCisgICAgICogICAgICAgICAgYnkgcmVjdXJzaW9uLgorICAgICAqCisgICAgICogICBUaGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX25eXGFscGhhKHgpID0gXGZyYWN7KFxhbHBoYSArIDEpX259e24hfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBfMUZfMSgtbjsgXGFscGhhICsgMTsgeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgQGYkIChcYWxwaGEpX24gQGYkIGlzIHRoZSBQb2NoaGFtbWVyIHN5bWJvbCBhbmQKKyAgICAgKiAgIEBmJCBfMUZfMShhOyBjOyB4KSBAZiQgaXMgdGhlIGNvbmZsdWVudCBoeXBlcmdlb21ldHJpYyBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCBpcyBkZWZpbmVkIGZvciBpbnRlZ3JhbAorICAgICAqICAgQGYkIFxhbHBoYSA9IG0gQGYkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXm0oeCkgPSAoLTEpXm0gXGZyYWN7ZF5tfXtkeF5tfSBMX3tuICsgbX0oeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbih4KSA9IFxmcmFje2VeeH17biF9IFxmcmFje2Rebn17ZHhebn0gKHhebmVeey14fSkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX19hbHBoYSBUaGUgZGVncmVlIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbi4KKyAgICAgKiAgIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBMYWd1ZXJyZSBmdW5jdGlvbiBvZiBvcmRlciBuLAorICAgICAqICAgICAgICAgICBkZWdyZWUgQGYkIFxhbHBoYSBAZiQsIGFuZCBhcmd1bWVudCB4LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcGEsIHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3BvbHlfbGFndWVycmVfcmVjdXJzaW9uKGNvbnN0IHVuc2lnbmVkIGludCBfX24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHBhIF9fYWxwaGExLCBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIC8vICAgQ29tcHV0ZSBsXzAuCisgICAgICBfVHAgX19sXzAgPSBfVHAoMSk7CisgICAgICBpZiAgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX19sXzA7CisKKyAgICAgIC8vICBDb21wdXRlIGxfMV5hbHBoYS4KKyAgICAgIF9UcCBfX2xfMSA9IC1fX3ggKyBfVHAoMSkgKyBfVHAoX19hbHBoYTEpOworICAgICAgaWYgIChfX24gPT0gMSkKKyAgICAgICAgcmV0dXJuIF9fbF8xOworCisgICAgICAvLyAgQ29tcHV0ZSBsX25eYWxwaGEgYnkgcmVjdXJzaW9uIG9uIG4uCisgICAgICBfVHAgX19sX24yID0gX19sXzA7CisgICAgICBfVHAgX19sX24xID0gX19sXzE7CisgICAgICBfVHAgX19sX24gPSBfVHAoMCk7CisgICAgICBmb3IgICh1bnNpZ25lZCBpbnQgX19ubiA9IDI7IF9fbm4gPD0gX19uOyArK19fbm4pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9fbF9uID0gKF9UcCgyICogX19ubiAtIDEpICsgX1RwKF9fYWxwaGExKSAtIF9feCkKKyAgICAgICAgICAgICAgICAgICogX19sX24xIC8gX1RwKF9fbm4pCisgICAgICAgICAgICAgICAgICAtIChfVHAoX19ubiAtIDEpICsgX1RwKF9fYWxwaGExKSkgKiBfX2xfbjIgLyBfVHAoX19ubik7CisgICAgICAgICAgICBfX2xfbjIgPSBfX2xfbjE7CisgICAgICAgICAgICBfX2xfbjEgPSBfX2xfbjsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX19sX247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBMYWd1ZXJyZSBwb2x5bm9taWFsCisgICAgICogICAgICAgICAgb2Ygb3JkZXIgbiwgZGVncmVlIEBmJCBcYWxwaGEgQGYkOiBAZiQgTF9uXmFscGhhKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgZnVuY3Rpb24gaXMgZGVmaW5lZCBieQorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXlxhbHBoYSh4KSA9IFxmcmFjeyhcYWxwaGEgKyAxKV9ufXtuIX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgXzFGXzEoLW47IFxhbHBoYSArIDE7IHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIEBmJCAoXGFscGhhKV9uIEBmJCBpcyB0aGUgUG9jaGhhbW1lciBzeW1ib2wgYW5kCisgICAgICogICBAZiQgXzFGXzEoYTsgYzsgeCkgQGYkIGlzIHRoZSBjb25mbHVlbnQgaHlwZXJnZW9tZXRyaWMgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiAgIFRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBmb3IgaW50ZWdyYWwKKyAgICAgKiAgIEBmJCBcYWxwaGEgPSBtIEBmJCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbl5tKHgpID0gKC0xKV5tIFxmcmFje2RebX17ZHhebX0gTF97biArIG19KHgpCisgICAgICogICBAZl0KKyAgICAgKiAgIHdoZXJlIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgICBMX24oeCkgPSBcZnJhY3tlXnh9e24hfSBcZnJhY3tkXm59e2R4Xm59ICh4Xm5lXnsteH0pCisgICAgICogICBAZl0KKyAgICAgKgorICAgICAqICAgQHBhcmFtIF9fbiBUaGUgb3JkZXIgb2YgdGhlIExhZ3VlcnJlIGZ1bmN0aW9uLgorICAgICAqICAgQHBhcmFtIF9fYWxwaGEgVGhlIGRlZ3JlZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcGFyYW0gX194IFRoZSBhcmd1bWVudCBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24uCisgICAgICogICBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgTGFndWVycmUgZnVuY3Rpb24gb2Ygb3JkZXIgbiwKKyAgICAgKiAgICAgICAgICAgZGVncmVlIEBmJCBcYWxwaGEgQGYkLCBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHBhLCB0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fcG9seV9sYWd1ZXJyZShjb25zdCB1bnNpZ25lZCBpbnQgX19uLCBjb25zdCBfVHBhIF9fYWxwaGExLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIGlmIChfX3ggPCBfVHAoMCkpCisgICAgICAgIHN0ZDo6X190aHJvd19kb21haW5fZXJyb3IoX19OKCJOZWdhdGl2ZSBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBfX3BvbHlfbGFndWVycmUuIikpOworICAgICAgLy8gIFJldHVybiBOYU4gb24gTmFOIGlucHV0LgorICAgICAgZWxzZSBpZiAoX19pc25hbihfX3gpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fbiA9PSAwKQorICAgICAgICByZXR1cm4gX1RwKDEpOworICAgICAgZWxzZSBpZiAoX19uID09IDEpCisgICAgICAgIHJldHVybiBfVHAoMSkgKyBfVHAoX19hbHBoYTEpIC0gX194OworICAgICAgZWxzZSBpZiAoX194ID09IF9UcCgwKSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Byb2QgPSBfVHAoX19hbHBoYTEpICsgX1RwKDEpOworICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDI7IF9fayA8PSBfX247ICsrX19rKQorICAgICAgICAgICAgX19wcm9kICo9IChfVHAoX19hbHBoYTEpICsgX1RwKF9faykpIC8gX1RwKF9fayk7CisgICAgICAgICAgcmV0dXJuIF9fcHJvZDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX19uID4gMTAwMDAwMDAgJiYgX1RwKF9fYWxwaGExKSA+IC1fVHAoMSkKKyAgICAgICAgICAgICYmIF9feCA8IF9UcCgyKSAqIChfVHAoX19hbHBoYTEpICsgX1RwKDEpKSArIF9UcCg0ICogX19uKSkKKyAgICAgICAgcmV0dXJuIF9fcG9seV9sYWd1ZXJyZV9sYXJnZV9uKF9fbiwgX19hbHBoYTEsIF9feCk7CisgICAgICBlbHNlIGlmIChfVHAoX19hbHBoYTEpID49IF9UcCgwKQorICAgICAgICAgICB8fCAoX194ID4gX1RwKDApICYmIF9UcChfX2FscGhhMSkgPCAtX1RwKF9fbiArIDEpKSkKKyAgICAgICAgcmV0dXJuIF9fcG9seV9sYWd1ZXJyZV9yZWN1cnNpb24oX19uLCBfX2FscGhhMSwgX194KTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9fcG9seV9sYWd1ZXJyZV9oeXBlcmcoX19uLCBfX2FscGhhMSwgX194KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBhc3NvY2lhdGVkIExhZ3VlcnJlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuLCBkZWdyZWUgbTogQGYkIExfbl5tKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCBpcyBkZWZpbmVkIGZvciBpbnRlZ3JhbAorICAgICAqICAgQGYkIFxhbHBoYSA9IG0gQGYkIGJ5OgorICAgICAqICAgQGZbCisgICAgICogICAgICAgTF9uXm0oeCkgPSAoLTEpXm0gXGZyYWN7ZF5tfXtkeF5tfSBMX3tuICsgbX0oeCkKKyAgICAgKiAgIEBmXQorICAgICAqICAgd2hlcmUgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbih4KSA9IFxmcmFje2VeeH17biF9IFxmcmFje2Rebn17ZHhebn0gKHhebmVeey14fSkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgTGFndWVycmUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX20gVGhlIGRlZ3JlZSBvZiB0aGUgTGFndWVycmUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsLgorICAgICAqICAgQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGFzc29jaWF0ZWQgTGFndWVycmUgcG9seW5vbWlhbCBvZiBvcmRlciBuLAorICAgICAqICAgICAgICAgICBkZWdyZWUgbSwgYW5kIGFyZ3VtZW50IHguCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2Fzc29jX2xhZ3VlcnJlKGNvbnN0IHVuc2lnbmVkIGludCBfX24sIGNvbnN0IHVuc2lnbmVkIGludCBfX20sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAgX194KQorICAgIHsKKyAgICAgIHJldHVybiBfX3BvbHlfbGFndWVycmU8dW5zaWduZWQgaW50LCBfVHA+KF9fbiwgX19tLCBfX3gpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwKKyAgICAgKiAgICAgICAgICBvZiBvcmRlciBuOiBAZiQgTF9uKHgpIEBmJC4KKyAgICAgKgorICAgICAqICAgVGhlIExhZ3VlcnJlIHBvbHlub21pYWwgaXMgZGVmaW5lZCBieToKKyAgICAgKiAgIEBmWworICAgICAqICAgICAgIExfbih4KSA9IFxmcmFje2VeeH17biF9IFxmcmFje2Rebn17ZHhebn0gKHhebmVeey14fSkKKyAgICAgKiAgIEBmXQorICAgICAqCisgICAgICogICBAcGFyYW0gX19uIFRoZSBvcmRlciBvZiB0aGUgTGFndWVycmUgcG9seW5vbWlhbC4KKyAgICAgKiAgIEBwYXJhbSBfX3ggVGhlIGFyZ3VtZW50IG9mIHRoZSBMYWd1ZXJyZSBwb2x5bm9taWFsLgorICAgICAqICAgQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIExhZ3VlcnJlIHBvbHlub21pYWwgb2Ygb3JkZXIgbgorICAgICAqICAgICAgICAgICBhbmQgYXJndW1lbnQgeC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIF9fbGFndWVycmUoY29uc3QgdW5zaWduZWQgaW50IF9fbiwgY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICByZXR1cm4gX19wb2x5X2xhZ3VlcnJlPHVuc2lnbmVkIGludCwgX1RwPihfX24sIDAsIF9feCk7CisgICAgfQorCisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBzdGQ6OnRyMTo6X19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9QT0xZX0xBR1VFUlJFX1RDQwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvcmFuZG9tIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvcmFuZG9tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTI2NDcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9yYW5kb20KQEAgLTAsMCArMSw1MCBAQAorLy8gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKioKKyAqIEBmaWxlIHRyMS9yYW5kb20KKyAqIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9SQU5ET00KKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JBTkRPTSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGV4dC90eXBlX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9udW1lcmljX3RyYWl0cy5oPgorI2luY2x1ZGUgPGJpdHMvY29uY2VwdF9jaGVjay5oPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHRyMS9jbWF0aD4KKyNpbmNsdWRlIDx0cjEvcmFuZG9tLmg+CisjaW5jbHVkZSA8dHIxL3JhbmRvbS50Y2M+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUkFORE9NCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9yYW5kb20uaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTM3OTIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9yYW5kb20uaApAQCAtMCwwICsxLDI0MTcgQEAKKy8vIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqCisgKiBAZmlsZSB0cjEvcmFuZG9tLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvcmFuZG9tfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JBTkRPTV9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9SQU5ET01fSCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjFdIFJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbgorCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCB0cjFfcmFuZG9tIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorICAgKiBBIGZhY2lsaXR5IGZvciBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXJzIG9uIHNlbGVjdGVkIGRpc3RyaWJ1dGlvbnMuCisgICAqIEB7CisgICAqLworCisgIC8qCisgICAqIEltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgICAqLworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VJbnRUeXBlLCBpbnQgX193LCAKKwkgICAgIGJvb2wgPSBfX3cgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46OmRpZ2l0cz4KKyAgICAgIHN0cnVjdCBfU2hpZnQKKyAgICAgIHsgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBfX3ZhbHVlID0gMDsgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSW50VHlwZSwgaW50IF9fdz4KKyAgICAgIHN0cnVjdCBfU2hpZnQ8X1VJbnRUeXBlLCBfX3csIHRydWU+CisgICAgICB7IHN0YXRpYyBjb25zdCBfVUludFR5cGUgX192YWx1ZSA9IF9VSW50VHlwZSgxKSA8PCBfX3c7IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX2EsIF9UcCBfX2MsIF9UcCBfX20sIGJvb2w+CisgICAgICBzdHJ1Y3QgX01vZDsKKworICAgIC8vIERpc3BhdGNoIGJhc2VkIG9uIG1vZHVsdXMgdmFsdWUgdG8gcHJldmVudCBkaXZpZGUtYnktemVybyBjb21waWxlLXRpbWUKKyAgICAvLyBlcnJvcnMgd2hlbiBtID09IDAuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19hLCBfVHAgX19jLCBfVHAgX19tPgorICAgICAgaW5saW5lIF9UcAorICAgICAgX19tb2QoX1RwIF9feCkKKyAgICAgIHsgcmV0dXJuIF9Nb2Q8X1RwLCBfX2EsIF9fYywgX19tLCBfX20gPT0gMD46Ol9fY2FsYyhfX3gpOyB9CisKKyAgICB0eXBlZGVmIF9fZ251X2N4eDo6X19jb25kaXRpb25hbF90eXBlPChzaXplb2YodW5zaWduZWQpID09IDQpLAorCQkgICAgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmc+OjpfX3R5cGUgX1VJbnQzMlR5cGU7CisKKyAgICAvKgorICAgICAqIEFuIGFkYXB0b3IgY2xhc3MgZm9yIGNvbnZlcnRpbmcgdGhlIG91dHB1dCBvZiBhbnkgR2VuZXJhdG9yIGludG8KKyAgICAgKiB0aGUgaW5wdXQgZm9yIGEgc3BlY2lmaWMgRGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9FbmdpbmUsIHR5cGVuYW1lIF9EaXN0cmlidXRpb24+CisgICAgICBzdHJ1Y3QgX0FkYXB0b3IKKyAgICAgIHsgCisJdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9FbmdpbmU+Ojp0eXBlIF9CRW5naW5lOworCXR5cGVkZWYgdHlwZW5hbWUgX0JFbmdpbmU6OnJlc3VsdF90eXBlICAgICAgICAgICBfRW5naW5lX3Jlc3VsdF90eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX0Rpc3RyaWJ1dGlvbjo6aW5wdXRfdHlwZSAgICAgICByZXN1bHRfdHlwZTsKKworICAgICAgcHVibGljOgorCV9BZGFwdG9yKGNvbnN0IF9FbmdpbmUmIF9fZykKKwk6IF9NX2coX19nKSB7IH0KKworCXJlc3VsdF90eXBlCisJbWluKCkgY29uc3QKKwl7CisJICByZXN1bHRfdHlwZSBfX3JldHVybl92YWx1ZTsKKwkgIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkgICAgICAmJiBpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IF9NX2cubWluKCk7CisJICBlbHNlCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoMCk7CisJICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisJfQorCisJcmVzdWx0X3R5cGUKKwltYXgoKSBjb25zdAorCXsKKwkgIHJlc3VsdF90eXBlIF9fcmV0dXJuX3ZhbHVlOworCSAgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gX01fZy5tYXgoKTsKKwkgIGVsc2UgaWYgKCFpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKDEpOworCSAgZWxzZQorCSAgICBfX3JldHVybl92YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8cmVzdWx0X3R5cGU+OjptYXgoKSAtIDE7CisJICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0cyBhIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgYWRhcHRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCSAqIGludG8gYSB2YWx1ZSBpbiB0aGUgaW5wdXQgZG9tYWluIGZvciB0aGUgZGVwZW5kZW50IHJhbmRvbSBudW1iZXIKKwkgKiBkaXN0cmlidXRpb24uCisJICoKKwkgKiBCZWNhdXNlIHRoZSB0eXBlIHRyYWl0cyBhcmUgY29tcGlsZSB0aW1lIGNvbnN0YW50cyBvbmx5IHRoZQorCSAqIGFwcHJvcHJpYXRlIGNsYXVzZSBvZiB0aGUgaWYgc3RhdGVtZW50cyB3aWxsIGFjdHVhbGx5IGJlIGVtaXR0ZWQKKwkgKiBieSB0aGUgY29tcGlsZXIuCisJICovCisJcmVzdWx0X3R5cGUKKwlvcGVyYXRvcigpKCkKKwl7CisJICByZXN1bHRfdHlwZSBfX3JldHVybl92YWx1ZTsKKwkgIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkgICAgICAmJiBpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IF9NX2coKTsKKwkgIGVsc2UgaWYgKCFpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkJICAgJiYgIWlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoX01fZygpIC0gX01fZy5taW4oKSkKKwkgICAgICAvIHJlc3VsdF90eXBlKF9NX2cubWF4KCkgLSBfTV9nLm1pbigpKTsKKwkgIGVsc2UgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCQkgICAmJiAhaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZShfTV9nKCkgLSBfTV9nLm1pbigpKQorCSAgICAgIC8gcmVzdWx0X3R5cGUoX01fZy5tYXgoKSAtIF9NX2cubWluKCkgKyByZXN1bHRfdHlwZSgxKSk7CisJICBlbHNlCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gKCgoX01fZygpIC0gX01fZy5taW4oKSkgCisJCQkgICAgICAgLyAoX01fZy5tYXgoKSAtIF9NX2cubWluKCkpKQorCQkJICAgICAgKiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCkpOworCSAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworCX0KKworICAgICAgcHJpdmF0ZToKKwlfRW5naW5lIF9NX2c7CisgICAgICB9OworCisgICAgLy8gU3BlY2lhbGl6YXRpb24gZm9yIF9FbmdpbmUqLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9FbmdpbmUsIHR5cGVuYW1lIF9EaXN0cmlidXRpb24+CisgICAgICBzdHJ1Y3QgX0FkYXB0b3I8X0VuZ2luZSosIF9EaXN0cmlidXRpb24+CisgICAgICB7CisJdHlwZWRlZiB0eXBlbmFtZSBfRW5naW5lOjpyZXN1bHRfdHlwZSAgICAgIF9FbmdpbmVfcmVzdWx0X3R5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfRGlzdHJpYnV0aW9uOjppbnB1dF90eXBlIHJlc3VsdF90eXBlOworCisgICAgICBwdWJsaWM6CisJX0FkYXB0b3IoX0VuZ2luZSogX19nKQorCTogX01fZyhfX2cpIHsgfQorCisJcmVzdWx0X3R5cGUKKwltaW4oKSBjb25zdAorCXsKKwkgIHJlc3VsdF90eXBlIF9fcmV0dXJuX3ZhbHVlOworCSAgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gX01fZy0+bWluKCk7CisJICBlbHNlCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoMCk7CisJICByZXR1cm4gX19yZXR1cm5fdmFsdWU7CisJfQorCisJcmVzdWx0X3R5cGUKKwltYXgoKSBjb25zdAorCXsKKwkgIHJlc3VsdF90eXBlIF9fcmV0dXJuX3ZhbHVlOworCSAgaWYgKGlzX2ludGVncmFsPF9FbmdpbmVfcmVzdWx0X3R5cGU+Ojp2YWx1ZQorCSAgICAgICYmIGlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gX01fZy0+bWF4KCk7CisJICBlbHNlIGlmICghaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSByZXN1bHRfdHlwZSgxKTsKKwkgIGVsc2UKKwkgICAgX19yZXR1cm5fdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCkgLSAxOworCSAgcmV0dXJuIF9fcmV0dXJuX3ZhbHVlOworCX0KKworCXJlc3VsdF90eXBlCisJb3BlcmF0b3IoKSgpCisJeworCSAgcmVzdWx0X3R5cGUgX19yZXR1cm5fdmFsdWU7CisJICBpZiAoaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJICAgICAgJiYgaXNfaW50ZWdyYWw8cmVzdWx0X3R5cGU+Ojp2YWx1ZSkKKwkgICAgX19yZXR1cm5fdmFsdWUgPSAoKl9NX2cpKCk7CisJICBlbHNlIGlmICghaXNfaW50ZWdyYWw8X0VuZ2luZV9yZXN1bHRfdHlwZT46OnZhbHVlCisJCSAgICYmICFpc19pbnRlZ3JhbDxyZXN1bHRfdHlwZT46OnZhbHVlKQorCSAgICBfX3JldHVybl92YWx1ZSA9IHJlc3VsdF90eXBlKCgqX01fZykoKSAtIF9NX2ctPm1pbigpKQorCSAgICAgIC8gcmVzdWx0X3R5cGUoX01fZy0+bWF4KCkgLSBfTV9nLT5taW4oKSk7CisJICBlbHNlIGlmIChpc19pbnRlZ3JhbDxfRW5naW5lX3Jlc3VsdF90eXBlPjo6dmFsdWUKKwkJICAgJiYgIWlzX2ludGVncmFsPHJlc3VsdF90eXBlPjo6dmFsdWUpCisJICAgIF9fcmV0dXJuX3ZhbHVlID0gcmVzdWx0X3R5cGUoKCpfTV9nKSgpIC0gX01fZy0+bWluKCkpCisJICAgICAgLyByZXN1bHRfdHlwZShfTV9nLT5tYXgoKSAtIF9NX2ctPm1pbigpICsgcmVzdWx0X3R5cGUoMSkpOworCSAgZWxzZQorCSAgICBfX3JldHVybl92YWx1ZSA9ICgoKCgqX01fZykoKSAtIF9NX2ctPm1pbigpKSAKKwkJCSAgICAgICAvIChfTV9nLT5tYXgoKSAtIF9NX2ctPm1pbigpKSkKKwkJCSAgICAgICogc3RkOjpudW1lcmljX2xpbWl0czxyZXN1bHRfdHlwZT46Om1heCgpKTsKKwkgIHJldHVybiBfX3JldHVybl92YWx1ZTsKKwl9CisKKyAgICAgIHByaXZhdGU6CisJX0VuZ2luZSogX01fZzsKKyAgICAgIH07CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIF9fZGV0YWlsCisKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIFByb2R1Y2VzIHJhbmRvbSBudW1iZXJzIG9uIGEgZ2l2ZW4gZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIHVzaW5nIGEKKyAgICogbm9uLXVuaWZvcm0gcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGVuZ2luZS4KKyAgICoKKyAgICogQHRvZG8gdGhlIGVuZ2luZV92YWx1ZV90eXBlIG5lZWRzIHRvIGJlIHN0dWRpZWQgbW9yZSBjYXJlZnVsbHkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRW5naW5lLCB0eXBlbmFtZSBfRGlzdD4KKyAgICBjbGFzcyB2YXJpYXRlX2dlbmVyYXRvcgorICAgIHsKKyAgICAgIC8vIENvbmNlcHQgcmVxdWlyZW1lbnRzLgorICAgICAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9FbmdpbmUsIF9Db3B5Q29uc3RydWN0aWJsZUNvbmNlcHQpCisgICAgICAvLyAgX19nbGliY3h4X2NsYXNzX3JlcXVpcmVzKF9FbmdpbmUsIF9FbmdpbmVDb25jZXB0KQorICAgICAgLy8gIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfRGlzdCwgX0VuZ2luZUNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9FbmdpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZV90eXBlOworICAgICAgdHlwZWRlZiBfX2RldGFpbDo6X0FkYXB0b3I8X0VuZ2luZSwgX0Rpc3Q+ICAgICBlbmdpbmVfdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0Rpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9EaXN0OjpyZXN1bHRfdHlwZSAgICAgICAgICAgIHJlc3VsdF90eXBlOworCisgICAgICAvLyB0cjE6NS4xLjEgdGFibGUgNS4xIHJlcXVpcmVtZW50CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19lbmFibGVfaWY8CisJaXNfYXJpdGhtZXRpYzxyZXN1bHRfdHlwZT46OnZhbHVlLCByZXN1bHRfdHlwZT46Ol9fdHlwZSBfSXNWYWxpZFR5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIHZhcmlhdGUgZ2VuZXJhdG9yIHdpdGggdGhlIHVuaWZvcm0gcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIEBwIF9fZW5nIGZvciB0aGUgcmFuZG9tIGRpc3RyaWJ1dGlvbiBAcCBfX2Rpc3QuCisgICAgICAgKgorICAgICAgICogQHRocm93cyBBbnkgZXhjZXB0aW9ucyB3aGljaCBtYXkgdGhyb3duIGJ5IHRoZSBjb3B5IGNvbnN0cnVjdG9ycyBvZgorICAgICAgICogdGhlIEBwIF9FbmdpbmUgb3IgQHAgX0Rpc3Qgb2JqZWN0cy4KKyAgICAgICAqLworICAgICAgdmFyaWF0ZV9nZW5lcmF0b3IoZW5naW5lX3R5cGUgX19lbmcsIGRpc3RyaWJ1dGlvbl90eXBlIF9fZGlzdCkKKyAgICAgIDogX01fZW5naW5lKF9fZW5nKSwgX01fZGlzdChfX2Rpc3QpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG5leHQgZ2VuZXJhdGVkIHZhbHVlIG9uIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCkKKyAgICAgIHsgcmV0dXJuIF9NX2Rpc3QoX01fZW5naW5lKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFdURj8KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9UcCBfX3ZhbHVlKQorICAgICAgICB7IHJldHVybiBfTV9kaXN0KF9NX2VuZ2luZSwgX192YWx1ZSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHVuaWZvcm0gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZW5naW5lX3ZhbHVlX3R5cGUmCisgICAgICBlbmdpbmUoKQorICAgICAgeyByZXR1cm4gX01fZW5naW5lOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyB1bmlmb3JtIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGVuZ2luZV92YWx1ZV90eXBlJgorICAgICAgZW5naW5lKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2VuZ2luZTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgcmFuZG9tIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgZGlzdHJpYnV0aW9uX3R5cGUmCisgICAgICBkaXN0cmlidXRpb24oKQorICAgICAgeyByZXR1cm4gX01fZGlzdDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgcmFuZG9tIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3QgZGlzdHJpYnV0aW9uX3R5cGUmCisgICAgICBkaXN0cmlidXRpb24oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fZGlzdDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGNsb3NlZCBsb3dlciBib3VuZCBvZiB0aGUgZGlzdHJpYnV0aW9uIGludGVydmFsLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmRpc3RyaWJ1dGlvbigpLm1pbigpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgY2xvc2VkIHVwcGVyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24gaW50ZXJ2YWwuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+ZGlzdHJpYnV0aW9uKCkubWF4KCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICBlbmdpbmVfdmFsdWVfdHlwZSBfTV9lbmdpbmU7CisgICAgICBkaXN0cmlidXRpb25fdHlwZSBfTV9kaXN0OworICAgIH07CisKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgdHIxX3JhbmRvbV9nZW5lcmF0b3JzIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9ycworICAgKiBAaW5ncm91cCB0cjFfcmFuZG9tCisgICAqCisgICAqIFRoZXNlIGNsYXNzZXMgZGVmaW5lIG9iamVjdHMgd2hpY2ggcHJvdmlkZSByYW5kb20gb3IgcHNldWRvcmFuZG9tCisgICAqIG51bWJlcnMsIGVpdGhlciBmcm9tIGEgZGlzY3JldGUgb3IgYSBjb250aW51b3VzIGludGVydmFsLiAgVGhlCisgICAqIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN1cHBsaWVkIGFzIGEgcGFydCBvZiB0aGlzIGxpYnJhcnkgYXJlCisgICAqIGFsbCB1bmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyB3aGljaCBwcm92aWRlIGEgc2VxdWVuY2Ugb2YKKyAgICogcmFuZG9tIG51bWJlciB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgb3ZlciB0aGVpciByYW5nZS4KKyAgICoKKyAgICogQSBudW1iZXIgZ2VuZXJhdG9yIGlzIGEgZnVuY3Rpb24gb2JqZWN0IHdpdGggYW4gb3BlcmF0b3IoKSB0aGF0CisgICAqIHRha2VzIHplcm8gYXJndW1lbnRzIGFuZCByZXR1cm5zIGEgbnVtYmVyLgorICAgKgorICAgKiBBIGNvbXBsaWFudCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBtdXN0IHNhdGlzZnkgdGhlIGZvbGxvd2luZworICAgKiByZXF1aXJlbWVudHMuICA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPlJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIFJlcXVpcmVtZW50czwvY2FwdGlvbj4KKyAgICogPHRyPjx0ZD5UbyBiZSBkb2N1bWVudGVkLjwvdGQ+PC90cj4gPC90YWJsZT4KKyAgICogCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYnJpZWYgQSBtb2RlbCBvZiBhIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAqCisgICAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBwcm9kdWNlcyBwc2V1ZG9yYW5kb20gbnVtYmVycyB1c2luZyB0aGUKKyAgICogbGluZWFyIGZ1bmN0aW9uIEBmJHhfe2krMX1cbGVmdGFycm93KGF4X3tpfSArIGMpIFxibW9kIG0gQGYkLgorICAgKgorICAgKiBUaGUgdGVtcGxhdGUgcGFyYW1ldGVyIEBwIF9VSW50VHlwZSBtdXN0IGJlIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUKKyAgICogbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHZhbHVlcyB1cCB0byAoX19tLTEpLiBJZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyCisgICAqIEBwIF9fbSBpcyAwLCB0aGUgbW9kdWx1cyBAcCBfX20gdXNlZCBpcworICAgKiBzdGQ6Om51bWVyaWNfbGltaXRzPF9VSW50VHlwZT46Om1heCgpIHBsdXMgMS4gT3RoZXJ3aXNlLCB0aGUgdGVtcGxhdGUKKyAgICogcGFyYW1ldGVycyBAcCBfX2EgYW5kIEBwIF9fYyBtdXN0IGJlIGxlc3MgdGhhbiBAcCBfX20uCisgICAqCisgICAqIFRoZSBzaXplIG9mIHRoZSBzdGF0ZSBpcyBAZiQgMSBAZiQuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20+CisgICAgY2xhc3MgbGluZWFyX2NvbmdydWVudGlhbAorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfVUludFR5cGUsIF9VbnNpZ25lZEludGVnZXJDb25jZXB0KQorICAgICAgLy8gIF9fZ2xpYmNwcF9jbGFzc19yZXF1aXJlcyhfX2EgPCBfX20gJiYgX19jIDwgX19tKQorCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfVUludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8qKiBUaGUgbXVsdGlwbGllci4gKi8KKyAgICAgIHN0YXRpYyBjb25zdCBfVUludFR5cGUgbXVsdGlwbGllciA9IF9fYTsKKyAgICAgIC8qKiBBbiBpbmNyZW1lbnQuICovCisgICAgICBzdGF0aWMgY29uc3QgX1VJbnRUeXBlIGluY3JlbWVudCA9IF9fYzsKKyAgICAgIC8qKiBUaGUgbW9kdWx1cy4gKi8KKyAgICAgIHN0YXRpYyBjb25zdCBfVUludFR5cGUgbW9kdWx1cyA9IF9fbTsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgJWxpbmVhcl9jb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lIHdpdGgKKyAgICAgICAqIHNlZWQgQHAgX19zLiAgVGhlIGRlZmF1bHQgc2VlZCB2YWx1ZSBpcyAxLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX3MgVGhlIGluaXRpYWwgc2VlZCB2YWx1ZS4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWwodW5zaWduZWQgbG9uZyBfX3gwID0gMSkKKyAgICAgIHsgdGhpcy0+c2VlZChfX3gwKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlbGluZWFyX2NvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqIHNlZWRlZCBmcm9tIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gQHAgX19nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2cgVGhlIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsKF9HZW4mIF9fZykKKyAgICAgICAgeyB0aGlzLT5zZWVkKF9fZyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNlZWRzIHRoZSAlbGluZWFyX2NvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqIHNlcXVlbmNlIHRvIHRoZSBzZWVkIEBnIF9fcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19zIFRoZSBuZXcgc2VlZC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fcyA9IDEpOworCisgICAgICAvKioKKyAgICAgICAqIFJlc2VlZHMgdGhlICVsaW5lYXJfY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZQorICAgICAgICogc2VxdWVuY2UgdXNpbmcgdmFsdWVzIGZyb20gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBAcCBfX2cuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZyB0aGUgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2cpCisgICAgICAgIHsgc2VlZChfX2csIHR5cGVuYW1lIGlzX2Z1bmRhbWVudGFsPF9HZW4+Ojp0eXBlKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgc21hbGxlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiBUaGUgbWluaW11bSBkZXBlbmRzIG9uIHRoZSBAcCBfX2MgcGFyYW1ldGVyOiBpZiBpdCBpcyB6ZXJvLCB0aGUKKyAgICAgICAqIG1pbmltdW0gZ2VuZXJhdGVkIG11c3QgYmUgPiAwLCBvdGhlcndpc2UgMCBpcyBhbGxvd2VkLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIChfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBfX20+KF9fYykgPT0gMCkgPyAxIDogMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGxhcmdlc3QgcG9zc2libGUgdmFsdWUgaW4gdGhlIG91dHB1dCByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfX20gLSAxOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBlcXVhbGl0eS4KKyAgICAgICAqICAKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmouCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWwmIF9fbGhzLAorCQkgY29uc3QgbGluZWFyX2NvbmdydWVudGlhbCYgX19yaHMpCisgICAgICB7IHJldHVybiBfX2xocy5fTV94ID09IF9fcmhzLl9NX3g7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBIGxpbmVhciBjb25ncnVlbnRpYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgbGluZWFyIGNvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmouCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsJiBfX2xocywKKwkJIGNvbnN0IGxpbmVhcl9jb25ncnVlbnRpYWwmIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBXcml0ZXMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXRlIHgoaSkgb2YgeCB0byBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zICBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX2xjciBBICUgbGluZWFyX2NvbmdydWVudGlhbCByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqIEByZXR1cm5zIF9fb3MuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZTEsIF9VSW50VHlwZTEgX19hMSwgX1VJbnRUeXBlMSBfX2MxLAorCSAgICAgICBfVUludFR5cGUxIF9fbTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZTEsIF9fYTEsIF9fYzEsCisJCSAgIF9fbTE+JiBfX2xjcik7CisKKyAgICAgIC8qKgorICAgICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGVuZ2luZSBieSByZWFkaW5nIGl0cyB0ZXh0dWFsCisgICAgICAgKiByZXByZXNlbnRhdGlvbiBmcm9tIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB3cml0dGVuIHVzaW5nIGFuCisgICAgICAgKiBvdXRwdXQgc3RyZWFtIHdob3NlIGltYnVlZCBsb2NhbGUgYW5kIHdob3NlIHR5cGUncyB0ZW1wbGF0ZQorICAgICAgICogc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzIF9DaGFyVCBhbmQgX1RyYWl0cyB3ZXJlIHRoZSBzYW1lIGFzIHRob3NlIG9mCisgICAgICAgKiBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzICBUaGUgaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9fbGNyIEEgJSBsaW5lYXJfY29uZ3J1ZW50aWFsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHJldHVybnMgX19pcy4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlMSwgX1VJbnRUeXBlMSBfX2ExLCBfVUludFR5cGUxIF9fYzEsCisJICAgICAgIF9VSW50VHlwZTEgX19tMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlMSwgX19hMSwgX19jMSwgX19tMT4mIF9fbGNyKTsKKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCB0cnVlX3R5cGUpCisgICAgICAgIHsgcmV0dXJuIHNlZWQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oX19nKSk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgZmFsc2VfdHlwZSk7CisKKyAgICAgIF9VSW50VHlwZSBfTV94OworICAgIH07CisKKyAgLyoqCisgICAqIFRoZSBjbGFzc2ljIE1pbmltdW0gU3RhbmRhcmQgcmFuZDAgb2YgTGV3aXMsIEdvb2RtYW4sIGFuZCBNaWxsZXIuCisgICAqLworICB0eXBlZGVmIGxpbmVhcl9jb25ncnVlbnRpYWw8dW5zaWduZWQgbG9uZywgMTY4MDcsIDAsIDIxNDc0ODM2NDc+IG1pbnN0ZF9yYW5kMDsKKworICAvKioKKyAgICogQW4gYWx0ZXJuYXRpdmUgTENSIChMZWhtZXIgR2VuZXJhdG9yIGZ1bmN0aW9uKSAuCisgICAqLworICB0eXBlZGVmIGxpbmVhcl9jb25ncnVlbnRpYWw8dW5zaWduZWQgbG9uZywgNDgyNzEsIDAsIDIxNDc0ODM2NDc+IG1pbnN0ZF9yYW5kOworCisKKyAgLyoqCisgICAqIEEgZ2VuZXJhbGl6ZWQgZmVlZGJhY2sgc2hpZnQgcmVnaXN0ZXIgZGlzY3JldGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAqCisgICAqIFRoaXMgYWxnb3JpdGhtIGF2b2lkcyBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gYW5kIGlzIGRlc2lnbmVkIHRvIGJlCisgICAqIGZyaWVuZGx5IHRvIGEgcGlwZWxpbmVkIGFyY2hpdGVjdHVyZS4gIElmIHRoZSBwYXJhbWV0ZXJzIGFyZSBjaG9zZW4KKyAgICogY29ycmVjdGx5LCB0aGlzIGdlbmVyYXRvciB3aWxsIHByb2R1Y2UgbnVtYmVycyB3aXRoIGEgdmVyeSBsb25nIHBlcmlvZCBhbmQKKyAgICogZmFpcmx5IGdvb2QgYXBwYXJlbnQgZW50cm9weSwgYWx0aG91Z2ggc3RpbGwgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZy4KKyAgICoKKyAgICogVGhlIGJlc3Qgd2F5IHRvIHVzZSB0aGlzIGdlbmVyYXRvciBpcyB3aXRoIHRoZSBwcmVkZWZpbmVkIG10MTk5MzcgY2xhc3MuCisgICAqCisgICAqIFRoaXMgYWxnb3JpdGhtIHdhcyBvcmlnaW5hbGx5IGludmVudGVkIGJ5IE1ha290byBNYXRzdW1vdG8gYW5kCisgICAqIFRha3VqaSBOaXNoaW11cmEuCisgICAqCisgICAqIEB2YXIgd29yZF9zaXplICAgVGhlIG51bWJlciBvZiBiaXRzIGluIGVhY2ggZWxlbWVudCBvZiB0aGUgc3RhdGUgdmVjdG9yLgorICAgKiBAdmFyIHN0YXRlX3NpemUgIFRoZSBkZWdyZWUgb2YgcmVjdXJzaW9uLgorICAgKiBAdmFyIHNoaWZ0X3NpemUgIFRoZSBwZXJpb2QgcGFyYW1ldGVyLgorICAgKiBAdmFyIG1hc2tfYml0cyAgIFRoZSBzZXBhcmF0aW9uIHBvaW50IGJpdCBpbmRleC4KKyAgICogQHZhciBwYXJhbWV0ZXJfYSBUaGUgbGFzdCByb3cgb2YgdGhlIHR3aXN0IG1hdHJpeC4KKyAgICogQHZhciBvdXRwdXRfdSAgICBUaGUgZmlyc3QgcmlnaHQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB2YXIgb3V0cHV0X3MgICAgVGhlIGZpcnN0IGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqIEB2YXIgb3V0cHV0X2IgICAgVGhlIGZpcnN0IGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBtYXNrLgorICAgKiBAdmFyIG91dHB1dF90ICAgIFRoZSBzZWNvbmQgbGVmdC1zaGlmdCB0ZW1wZXJpbmcgbWF0cml4IHBhcmFtZXRlci4KKyAgICogQHZhciBvdXRwdXRfYyAgICBUaGUgc2Vjb25kIGxlZnQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBtYXNrLgorICAgKiBAdmFyIG91dHB1dF9sICAgIFRoZSBzZWNvbmQgcmlnaHQtc2hpZnQgdGVtcGVyaW5nIG1hdHJpeCBwYXJhbWV0ZXIuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwKKwkgICBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNsYXNzIG1lcnNlbm5lX3R3aXN0ZXIKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX1VJbnRUeXBlLCBfVW5zaWduZWRJbnRlZ2VyQ29uY2VwdCkKKworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9VSW50VHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICB3b3JkX3NpemUgICA9IF9fdzsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgc3RhdGVfc2l6ZSAgPSBfX247CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIHNoaWZ0X3NpemUgID0gX19tOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBtYXNrX2JpdHMgICA9IF9fcjsKKyAgICAgIHN0YXRpYyBjb25zdCBfVUludFR5cGUgcGFyYW1ldGVyX2EgPSBfX2E7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIG91dHB1dF91ICAgID0gX191OworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICBvdXRwdXRfcyAgICA9IF9fczsKKyAgICAgIHN0YXRpYyBjb25zdCBfVUludFR5cGUgb3V0cHV0X2IgICAgPSBfX2I7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgIG91dHB1dF90ICAgID0gX190OworICAgICAgc3RhdGljIGNvbnN0IF9VSW50VHlwZSBvdXRwdXRfYyAgICA9IF9fYzsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgb3V0cHV0X2wgICAgPSBfX2w7CisKKyAgICAgIC8vIGNvbnN0cnVjdG9ycyBhbmQgbWVtYmVyIGZ1bmN0aW9uCisgICAgICBtZXJzZW5uZV90d2lzdGVyKCkKKyAgICAgIHsgc2VlZCgpOyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBtZXJzZW5uZV90d2lzdGVyKHVuc2lnbmVkIGxvbmcgX192YWx1ZSkKKyAgICAgIHsgc2VlZChfX3ZhbHVlKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICBtZXJzZW5uZV90d2lzdGVyKF9HZW4mIF9fZykKKyAgICAgICAgeyBzZWVkKF9fZyk7IH0KKworICAgICAgdm9pZAorICAgICAgc2VlZCgpCisgICAgICB7IHNlZWQoNTQ4OVVMKTsgfQorCisgICAgICB2b2lkCisgICAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX192YWx1ZSk7CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2cpCisgICAgICAgIHsgc2VlZChfX2csIHR5cGVuYW1lIGlzX2Z1bmRhbWVudGFsPF9HZW4+Ojp0eXBlKCkpOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfTsKKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZSAtIDE7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IG1lcnNlbm5lX3R3aXN0ZXImIF9fbGhzLAorCQkgY29uc3QgbWVyc2VubmVfdHdpc3RlciYgX19yaHMpCisgICAgICB7IHJldHVybiBzdGQ6OmVxdWFsKF9fbGhzLl9NX3gsIF9fbGhzLl9NX3ggKyBzdGF0ZV9zaXplLCBfX3Jocy5fTV94KTsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cyBvZgorICAgICAgICogdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIG1lcnNlbm5lX3R3aXN0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgbWVyc2VubmVfdHdpc3RlciYgX19saHMsCisJCSBjb25zdCBtZXJzZW5uZV90d2lzdGVyJiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgbWVyc2VubmVfdHdpc3RlciByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUxLCBpbnQgX193MSwgaW50IF9fbjEsIGludCBfX20xLCBpbnQgX19yMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2ExLCBpbnQgX191MSwgaW50IF9fczEsIF9VSW50VHlwZTEgX19iMSwgaW50IF9fdDEsCisJICAgICAgIF9VSW50VHlwZTEgX19jMSwgaW50IF9fbDEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZTEsIF9fdzEsIF9fbjEsIF9fbTEsIF9fcjEsCisJCSAgIF9fYTEsIF9fdTEsIF9fczEsIF9fYjEsIF9fdDEsIF9fYzEsIF9fbDE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBtZXJzZW5uZV90d2lzdGVyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUxLCBpbnQgX193MSwgaW50IF9fbjEsIGludCBfX20xLCBpbnQgX19yMSwKKwkgICAgICAgX1VJbnRUeXBlMSBfX2ExLCBpbnQgX191MSwgaW50IF9fczEsIF9VSW50VHlwZTEgX19iMSwgaW50IF9fdDEsCisJICAgICAgIF9VSW50VHlwZTEgX19jMSwgaW50IF9fbDEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZTEsIF9fdzEsIF9fbjEsIF9fbTEsIF9fcjEsCisJCSAgIF9fYTEsIF9fdTEsIF9fczEsIF9fYjEsIF9fdDEsIF9fYzEsIF9fbDE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIHRydWVfdHlwZSkKKyAgICAgICAgeyByZXR1cm4gc2VlZChzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihfX2cpKTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICB2b2lkCisgICAgICAgIHNlZWQoX0dlbiYgX19nLCBmYWxzZV90eXBlKTsKKworICAgICAgX1VJbnRUeXBlIF9NX3hbc3RhdGVfc2l6ZV07CisgICAgICBpbnQgICAgICAgX01fcDsKKyAgICB9OworCisgIC8qKgorICAgKiBUaGUgY2xhc3NpYyBNZXJzZW5uZSBUd2lzdGVyLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIE0uIE1hdHN1bW90byBhbmQgVC4gTmlzaGltdXJhLCBNZXJzZW5uZSBUd2lzdGVyOiBBIDYyMy1EaW1lbnNpb25hbGx5CisgICAqIEVxdWlkaXN0cmlidXRlZCBVbmlmb3JtIFBzZXVkby1SYW5kb20gTnVtYmVyIEdlbmVyYXRvciwgQUNNIFRyYW5zYWN0aW9ucworICAgKiBvbiBNb2RlbGluZyBhbmQgQ29tcHV0ZXIgU2ltdWxhdGlvbiwgVm9sLiA4LCBOby4gMSwgSmFudWFyeSAxOTk4LCBwcCAzLTMwLgorICAgKi8KKyAgdHlwZWRlZiBtZXJzZW5uZV90d2lzdGVyPAorICAgIHVuc2lnbmVkIGxvbmcsIDMyLCA2MjQsIDM5NywgMzEsCisgICAgMHg5OTA4YjBkZnVsLCAxMSwgNywKKyAgICAweDlkMmM1NjgwdWwsIDE1LAorICAgIDB4ZWZjNjAwMDB1bCwgMTgKKyAgICA+IG10MTk5Mzc7CisKKworICAvKioKKyAgICogQGJyaWVmIFRoZSBNYXJzYWdsaWEtWmFtYW4gZ2VuZXJhdG9yLgorICAgKiAKKyAgICogVGhpcyBpcyBhIG1vZGVsIG9mIGEgR2VuZXJhbGl6ZWQgRmlib25hY2NpIGRpc2NyZXRlIHJhbmRvbSBudW1iZXIKKyAgICogZ2VuZXJhdG9yLCBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgdGhlIFNXQyBnZW5lcmF0b3IuCisgICAqCisgICAqIEEgZGlzY3JldGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBwcm9kdWNlcyBwc2V1ZG9yYW5kb20KKyAgICogbnVtYmVycyB1c2luZyBAZiR4X3tpfVxsZWZ0YXJyb3coeF97aSAtIHN9IC0geF97aSAtIHJ9IC0KKyAgICogY2Fycnlfe2ktMX0pIFxibW9kIG0gQGYkLgorICAgKgorICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3RhdGUgaXMgQGYkIHIgQGYkCisgICAqIGFuZCB0aGUgbWF4aW11bSBwZXJpb2Qgb2YgdGhlIGdlbmVyYXRvciBpcyBAZiQgbV5yIC0gbV5zIC0xIEBmJC4KKyAgICoKKyAgICogTjE2ODhbNC4xM10gc2F5cyA8ZW0+dGhlIHRlbXBsYXRlIHBhcmFtZXRlciBfSW50VHlwZSBzaGFsbCBkZW5vdGUKKyAgICogYW4gaW50ZWdyYWwgdHlwZSBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgdmFsdWVzIHVwIHRvIG08L2VtPi4KKyAgICoKKyAgICogQHZhciBfTV94ICAgICBUaGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRvci4gIFRoaXMgaXMgYSByaW5nIGJ1ZmZlci4KKyAgICogQHZhciBfTV9jYXJyeSBUaGUgY2FycnkuCisgICAqIEB2YXIgX01fcCAgICAgQ3VycmVudCBpbmRleCBvZiB4KGkgLSByKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCBfSW50VHlwZSBfX20sIGludCBfX3MsIGludCBfX3I+CisgICAgY2xhc3Mgc3VidHJhY3Rfd2l0aF9jYXJyeQorICAgIHsKKyAgICAgIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyhfSW50VHlwZSwgX0ludGVnZXJDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfSW50VHlwZSByZXN1bHRfdHlwZTsKKyAgICAgIAorICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0IF9JbnRUeXBlIG1vZHVsdXMgICA9IF9fbTsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICBsb25nX2xhZyAgPSBfX3I7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgc2hvcnRfbGFnID0gX19zOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBkZWZhdWx0LWluaXRpYWxpemVkICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnkoKQorICAgICAgeyB0aGlzLT5zZWVkKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4cGxpY2l0bHkgc2VlZGVkICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5KHVuc2lnbmVkIGxvbmcgX192YWx1ZSkKKyAgICAgIHsgdGhpcy0+c2VlZChfX3ZhbHVlKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUKKyAgICAgICAqIHNlZWRlZCBmcm9tIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gQHAgX19nLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2cgVGhlIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5KF9HZW4mIF9fZykKKyAgICAgICAgeyB0aGlzLT5zZWVkKF9fZyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiQgeF8wIEBmJCBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKgorICAgICAgICogTjE2ODhbNC4xOV0gbW9kaWZpZXMgdGhpcyBhcyBmb2xsb3dzLiAgSWYgQHAgX192YWx1ZSA9PSAwLAorICAgICAgICogc2V0cyB2YWx1ZSB0byAxOTc4MDUwMy4gIEluIGFueSBjYXNlLCB3aXRoIGEgbGluZWFyCisgICAgICAgKiBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yIGxjZyhpKSBoYXZpbmcgcGFyYW1ldGVycyBAZiQgbV97bGNnfSA9CisgICAgICAgKiAyMTQ3NDgzNTYzLCBhX3tsY2d9ID0gNDAwMTQsIGNfe2xjZ30gPSAwLCBhbmQgbGNnKDApID0gdmFsdWUKKyAgICAgICAqIEBmJCwgc2V0cyBAZiQgeF97LXJ9IFxkb3RzIHhfey0xfSBAZiQgdG8gQGYkIGxjZygxKSBcYm1vZCBtCisgICAgICAgKiBcZG90cyBsY2cocikgXGJtb2QgbSBAZiQgcmVzcGVjdGl2ZWx5LiAgSWYgQGYkIHhfey0xfSA9IDAgQGYkCisgICAgICAgKiBzZXQgY2FycnkgdG8gMSwgb3RoZXJ3aXNlIHNldHMgY2FycnkgdG8gMC4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fdmFsdWUgPSAxOTc4MDUwMyk7CisKKyAgICAgIC8qKgorICAgICAgICogU2VlZHMgdGhlIGluaXRpYWwgc3RhdGUgQGYkIHhfMCBAZiQgb2YgdGhlICUgc3VidHJhY3Rfd2l0aF9jYXJyeQorICAgICAgICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2cpCisgICAgICAgIHsgc2VlZChfX2csIHR5cGVuYW1lIGlzX2Z1bmRhbWVudGFsPF9HZW4+Ojp0eXBlKCkpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgaW5jbHVzaXZlIG1pbmltdW0gdmFsdWUgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbSBpbnRlZ2VycworICAgICAgICogcmV0dXJuZWQgYnkgdGhpcyBnZW5lcmF0b3IuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gMDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGluY2x1c2l2ZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZSBvZiByYW5kb20gaW50ZWdlcnMKKyAgICAgICAqIHJldHVybmVkIGJ5IHRoaXMgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWF4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPm1vZHVsdXMgLSAxOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG9wZXJhdG9yKCkoKTsKKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnkmIF9fbGhzLAorCQkgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeSYgX19yaHMpCisgICAgICB7IHJldHVybiBzdGQ6OmVxdWFsKF9fbGhzLl9NX3gsIF9fbGhzLl9NX3ggKyBsb25nX2xhZywgX19yaHMuX01feCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGluZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICogICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnkmIF9fbGhzLAorCQkgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeSYgX19yaHMpCisgICAgICB7IHJldHVybiAhKF9fbGhzID09IF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnkgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCBfSW50VHlwZTEgX19tMSwgaW50IF9fczEsIGludCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZTEsIF9fbTEsIF9fczEsCisJCSAgIF9fcjE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvciBlbmdpbmUgQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIF9JbnRUeXBlMSBfX20xLCBpbnQgX19zMSwgaW50IF9fcjEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlMSwgX19tMSwgX19zMSwgX19yMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBzZWVkKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fZykpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIGZhbHNlX3R5cGUpOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZ251X2N4eDo6X19hZGRfdW5zaWduZWQ8X0ludFR5cGU+OjpfX3R5cGUgX1VJbnRUeXBlOworCisgICAgICBfVUludFR5cGUgIF9NX3hbbG9uZ19sYWddOworICAgICAgX1VJbnRUeXBlICBfTV9jYXJyeTsKKyAgICAgIGludCAgICAgICAgX01fcDsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBUaGUgTWFyc2FnbGlhLVphbWFuIGdlbmVyYXRvciAoZmxvYXRzIHZlcnNpb24pLgorICAgKgorICAgKiBAdmFyIF9NX3ggICAgIFRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yLiAgVGhpcyBpcyBhIHJpbmcgYnVmZmVyLgorICAgKiBAdmFyIF9NX2NhcnJ5IFRoZSBjYXJyeS4KKyAgICogQHZhciBfTV9wICAgICBDdXJyZW50IGluZGV4IG9mIHgoaSAtIHIpLgorICAgKiBAdmFyIF9NX25wb3dzIFByZWNvbXB1dGVkIG5lZ2F0aXZlIHBvd2VycyBvZiAyLiAgIAorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNsYXNzIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEKKyAgICB7CisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisgICAgICAKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICB3b3JkX3NpemUgPSBfX3c7CisgICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgbG9uZ19sYWcgID0gX19yOworICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgIHNob3J0X2xhZyA9IF9fczsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgZGVmYXVsdC1pbml0aWFsaXplZCAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tCisgICAgICAgKiBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxKCkKKyAgICAgIHsKKwl0aGlzLT5zZWVkKCk7CisJX01faW5pdGlhbGl6ZV9ucG93cygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYW4gZXhwbGljaXRseSBzZWVkZWQgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIKKyAgICAgICAqIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEodW5zaWduZWQgbG9uZyBfX3ZhbHVlKQorICAgICAgeworCXRoaXMtPnNlZWQoX192YWx1ZSk7CisJX01faW5pdGlhbGl6ZV9ucG93cygpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lCisgICAgICAgKiBzZWVkZWQgZnJvbSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIEBwIF9fZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19nIFRoZSBzZWVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMShfR2VuJiBfX2cpCisgICAgICAgIHsKKwkgIHRoaXMtPnNlZWQoX19nKTsKKwkgIF9NX2luaXRpYWxpemVfbnBvd3MoKTsJICAKKwl9CisKKyAgICAgIC8qKgorICAgICAgICogU2VlZHMgdGhlIGluaXRpYWwgc3RhdGUgQGYkIHhfMCBAZiQgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX192YWx1ZSA9IDE5NzgwNTAzKTsKKworICAgICAgLyoqCisgICAgICAgKiBTZWVkcyB0aGUgaW5pdGlhbCBzdGF0ZSBAZiQgeF8wIEBmJCBvZiB0aGUgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxCisgICAgICAgKiByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZykKKyAgICAgICAgeyBzZWVkKF9fZywgdHlwZW5hbWUgaXNfZnVuZGFtZW50YWw8X0dlbj46OnR5cGUoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZSBvZiByYW5kb20gZmxvYXRzCisgICAgICAgKiByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiAwLjA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZSBvZiByYW5kb20gZmxvYXRzCisgICAgICAgKiByZXR1cm5lZCBieSB0aGlzIGdlbmVyYXRvci4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiAxLjA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgb3BlcmF0b3IoKSgpOworCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cworICAgICAgICogb2YgdGhlIHNhbWUgdHlwZSBmb3IgZXF1YWxpdHkuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fbGhzIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIKKyAgICAgICAqICAgICAgICAgICAgICBnZW5lcmF0b3Igb2JqZWN0LgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxJiBfX2xocywKKwkJIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDEmIF9fcmhzKQorICAgICAgeworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IGxvbmdfbGFnOyArK19faSkKKwkgIGlmICghc3RkOjplcXVhbChfX2xocy5fTV94W19faV0sIF9fbGhzLl9NX3hbX19pXSArIF9fbiwKKwkJCSAgX19yaHMuX01feFtfX2ldKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igb2JqZWN0cworICAgICAgICogb2YgdGhlIHNhbWUgdHlwZSBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19saHMgQSAlIHN1YnRyYWN0X3dpdGhfY2FycnlfMDEgcmFuZG9tIG51bWJlcgorICAgICAgICogICAgICAgICAgICAgIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcmhzIEFub3RoZXIgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSYgX19saHMsCisJCSBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxJiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJSBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCBpbnQgX193MSwgaW50IF9fczEsIGludCBfX3IxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3Qgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUxLCBfX3cxLCBfX3MxLAorCQkgICBfX3IxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggZXh0cmFjdGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgaW50IF9fdzEsIGludCBfX3MxLCBpbnQgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlMSwgX193MSwgX19zMSwgX19yMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZywgdHJ1ZV90eXBlKQorICAgICAgICB7IHJldHVybiBzZWVkKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KF9fZykpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQKKyAgICAgICAgc2VlZChfR2VuJiBfX2csIGZhbHNlX3R5cGUpOworCisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX25wb3dzKCk7CisKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgX19uID0gKF9fdyArIDMxKSAvIDMyOworCisgICAgICB0eXBlZGVmIF9fZGV0YWlsOjpfVUludDMyVHlwZSBfVUludDMyVHlwZTsKKyAgICAgIF9VSW50MzJUeXBlICBfTV94W2xvbmdfbGFnXVtfX25dOworICAgICAgX1JlYWxUeXBlICAgIF9NX25wb3dzW19fbl07CisgICAgICBfVUludDMyVHlwZSAgX01fY2Fycnk7CisgICAgICBpbnQgICAgICAgICAgX01fcDsKKyAgICB9OworCisgIHR5cGVkZWYgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxmbG9hdCwgMjQsIDEwLCAyND4gICByYW5sdXhfYmFzZV8wMTsKKworICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgIC8vIDUwOC4gQmFkIHBhcmFtZXRlcnMgZm9yIHJhbmx1eDY0X2Jhc2VfMDEuCisgIHR5cGVkZWYgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxkb3VibGUsIDQ4LCA1LCAxMj4gcmFubHV4NjRfYmFzZV8wMTsgIAorCisKKyAgLyoqCisgICAqIFByb2R1Y2VzIHJhbmRvbSBudW1iZXJzIGZyb20gc29tZSBiYXNlIGVuZ2luZSBieSBkaXNjYXJkaW5nIGJsb2NrcyBvZgorICAgKiBkYXRhLgorICAgKgorICAgKiAwIDw9IEBwIF9fciA8PSBAcCBfX3AKKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBpbnQgX19wLCBpbnQgX19yPgorICAgIGNsYXNzIGRpc2NhcmRfYmxvY2sKKyAgICB7CisgICAgICAvLyBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXModHlwZW5hbWUgYmFzZV90eXBlOjpyZXN1bHRfdHlwZSwKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBBcml0aG1ldGljVHlwZUNvbmNlcHQpCisKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZS4gKi8KKyAgICAgIHR5cGVkZWYgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IgICBiYXNlX3R5cGU7CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGdlbmVyYXRlZCByYW5kb20gdmFsdWUuICovCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6cmVzdWx0X3R5cGUgcmVzdWx0X3R5cGU7CisKKyAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmxvY2tfc2l6ZSA9IF9fcDsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgdXNlZF9ibG9jayA9IF9fcjsKKworICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCAlZGlzY2FyZF9ibG9jayBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogVGhlIHVuZGVybHlpbmcgZW5naW5lIGlzIGRlZmF1bHQgY29uc3RydWN0ZWQgYXMgd2VsbC4KKyAgICAgICAqLworICAgICAgZGlzY2FyZF9ibG9jaygpCisgICAgICA6IF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29weSBjb25zdHJ1Y3RzIGEgJWRpc2NhcmRfYmxvY2sgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvcGllcyBhbiBleGlzdGluZyBiYXNlIGNsYXNzIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICogQHBhcmFtIHJuZyBBbiBleGlzdGluZyAoYmFzZSBjbGFzcykgZW5naW5lIG9iamVjdC4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGRpc2NhcmRfYmxvY2soY29uc3QgYmFzZV90eXBlJiBfX3JuZykKKyAgICAgIDogX01fYihfX3JuZyksIF9NX24oMCkgeyB9CisKKyAgICAgIC8qKgorICAgICAgICogU2VlZCBjb25zdHJ1Y3RzIGEgJWRpc2NhcmRfYmxvY2sgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIENvbnN0cnVjdHMgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZSBzZWVkZWQgd2l0aCBAcCBfX3MuCisgICAgICAgKiBAcGFyYW0gX19zIEEgc2VlZCB2YWx1ZSBmb3IgdGhlIGJhc2UgY2xhc3MgZW5naW5lLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZGlzY2FyZF9ibG9jayh1bnNpZ25lZCBsb25nIF9fcykKKyAgICAgIDogX01fYihfX3MpLCBfTV9uKDApIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdlbmVyYXRvciBjb25zdHJ1Y3QgYSAlZGlzY2FyZF9ibG9jayBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fZyBBIHNlZWQgZ2VuZXJhdG9yIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfR2VuPgorICAgICAgICBkaXNjYXJkX2Jsb2NrKF9HZW4mIF9fZykKKwk6IF9NX2IoX19nKSwgX01fbigwKSB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNlZWRzIHRoZSAlZGlzY2FyZF9ibG9jayBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUKKyAgICAgICAqIHVuZGVybHlpbmcgYmFzZSBjbGFzcyBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICovCisgICAgICB2b2lkIHNlZWQoKQorICAgICAgeworCV9NX2Iuc2VlZCgpOworCV9NX24gPSAwOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2VlZHMgdGhlICVkaXNjYXJkX2Jsb2NrIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBzZWVkIGdlbmVyYXRvcgorICAgICAgICogZnVuY3Rpb24uCisgICAgICAgKiBAcGFyYW0gX19nIEEgc2VlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICAgIHZvaWQgc2VlZChfR2VuJiBfX2cpCisgICAgICAgIHsKKwkgIF9NX2Iuc2VlZChfX2cpOworCSAgX01fbiA9IDA7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgZ2VuZXJhdG9yIGVuZ2luZSBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGNvbnN0IGJhc2VfdHlwZSYKKyAgICAgIGJhc2UoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHJhbmdlLgorICAgICAgICovCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2IubWluKCk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlciByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iLm1heCgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgZ2VuZXJhdGVkIHJhbmRvbSBudW1iZXIgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBkaXNjYXJkX2Jsb2NrJiBfX2xocywgY29uc3QgZGlzY2FyZF9ibG9jayYgX19yaHMpCisgICAgICB7IHJldHVybiAoX19saHMuX01fYiA9PSBfX3Jocy5fTV9iKSAmJiAoX19saHMuX01fbiA9PSBfX3Jocy5fTV9uKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIENvbXBhcmVzIHR3byAlZGlzY2FyZF9ibG9jayByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdC4KKyAgICAgICAqIEBwYXJhbSBfX3JocyBBbm90aGVyICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgKiAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBub3QgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAqLworICAgICAgZnJpZW5kIGJvb2wKKyAgICAgIG9wZXJhdG9yIT0oY29uc3QgZGlzY2FyZF9ibG9jayYgX19saHMsIGNvbnN0IGRpc2NhcmRfYmxvY2smIF9fcmhzKQorICAgICAgeyByZXR1cm4gIShfX2xocyA9PSBfX3Jocyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgJWRpc2NhcmRfYmxvY2sgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3AxLCBpbnQgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLAorCQkgICBfX3AxLCBfX3IxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICUgc3VidHJhY3Rfd2l0aF9jYXJyeSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVkaXNjYXJkX2Jsb2NrIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3AxLCBpbnQgX19yMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLAorCQkgICBfX3AxLCBfX3IxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICBiYXNlX3R5cGUgX01fYjsKKyAgICAgIGludCAgICAgICBfTV9uOworICAgIH07CisKKworICAvKioKKyAgICogSmFtZXMncyBsdXh1cnktbGV2ZWwtMyBpbnRlZ2VyIGFkYXB0YXRpb24gb2YgTHVlc2NoZXIncyBnZW5lcmF0b3IuCisgICAqLworICB0eXBlZGVmIGRpc2NhcmRfYmxvY2s8CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTx1bnNpZ25lZCBsb25nLCAoMVVMIDw8IDI0KSwgMTAsIDI0PiwKKyAgICAgIDIyMywKKyAgICAgIDI0CisgICAgICA+IHJhbmx1eDM7CisKKyAgLyoqCisgICAqIEphbWVzJ3MgbHV4dXJ5LWxldmVsLTQgaW50ZWdlciBhZGFwdGF0aW9uIG9mIEx1ZXNjaGVyJ3MgZ2VuZXJhdG9yLgorICAgKi8KKyAgdHlwZWRlZiBkaXNjYXJkX2Jsb2NrPAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8dW5zaWduZWQgbG9uZywgKDFVTCA8PCAyNCksIDEwLCAyND4sCisgICAgICAzODksCisgICAgICAyNAorICAgICAgPiByYW5sdXg0OworCisgIHR5cGVkZWYgZGlzY2FyZF9ibG9jazwKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPGZsb2F0LCAyNCwgMTAsIDI0PiwKKyAgICAgIDIyMywKKyAgICAgIDI0CisgICAgICA+IHJhbmx1eDNfMDE7CisKKyAgdHlwZWRlZiBkaXNjYXJkX2Jsb2NrPAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8ZmxvYXQsIDI0LCAxMCwgMjQ+LAorICAgICAgMzg5LAorICAgICAgMjQKKyAgICAgID4gcmFubHV4NF8wMTsKKworCisgIC8qKgorICAgKiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGFkYXB0b3IgY2xhc3MgdGhhdCBjb21iaW5lcyB0d28gcmFuZG9tIG51bWJlcgorICAgKiBnZW5lcmF0b3IgZW5naW5lcyBpbnRvIGEgc2luZ2xlIG91dHB1dCBzZXF1ZW5jZS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMj4KKyAgICBjbGFzcyB4b3JfY29tYmluZQorICAgIHsKKyAgICAgIC8vIF9fZ2xpYmN4eF9jbGFzc19yZXF1aXJlcyh0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjE6OgorICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF90eXBlLCBBcml0aG1ldGljVHlwZUNvbmNlcHQpCisgICAgICAvLyBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXModHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyOjoKKyAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfdHlwZSwgQXJpdGhtZXRpY1R5cGVDb25jZXB0KQorCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBmaXJzdCB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUuICovCisgICAgICB0eXBlZGVmIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSAgIGJhc2UxX3R5cGU7CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHNlY29uZCB1bmRlcmx5aW5nIGdlbmVyYXRvciBlbmdpbmUuICovCisgICAgICB0eXBlZGVmIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiAgIGJhc2UyX3R5cGU7CisKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlMV90eXBlOjpyZXN1bHRfdHlwZSBfUmVzdWx0X3R5cGUxOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlMl90eXBlOjpyZXN1bHRfdHlwZSBfUmVzdWx0X3R5cGUyOworCisgICAgcHVibGljOgorICAgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgcmFuZG9tIHZhbHVlLiAqLworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwoc2l6ZW9mKF9SZXN1bHRfdHlwZTEpCisJCQkJCQkgICAgICA+IHNpemVvZihfUmVzdWx0X3R5cGUyKSksCisJX1Jlc3VsdF90eXBlMSwgX1Jlc3VsdF90eXBlMj46Ol9fdHlwZSByZXN1bHRfdHlwZTsKKworICAgICAgLy8gcGFyYW1ldGVyIHZhbHVlcworICAgICAgc3RhdGljIGNvbnN0IGludCBzaGlmdDEgPSBfX3MxOworICAgICAgc3RhdGljIGNvbnN0IGludCBzaGlmdDIgPSBfX3MyOworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgeG9yX2NvbWJpbmUoKQorICAgICAgOiBfTV9iMSgpLCBfTV9iMigpCQorICAgICAgeyBfTV9pbml0aWFsaXplX21heCgpOyB9CisKKyAgICAgIHhvcl9jb21iaW5lKGNvbnN0IGJhc2UxX3R5cGUmIF9fcm5nMSwgY29uc3QgYmFzZTJfdHlwZSYgX19ybmcyKQorICAgICAgOiBfTV9iMShfX3JuZzEpLCBfTV9iMihfX3JuZzIpCisgICAgICB7IF9NX2luaXRpYWxpemVfbWF4KCk7IH0KKworICAgICAgeG9yX2NvbWJpbmUodW5zaWduZWQgbG9uZyBfX3MpCisgICAgICA6IF9NX2IxKF9fcyksIF9NX2IyKF9fcyArIDEpCisgICAgICB7IF9NX2luaXRpYWxpemVfbWF4KCk7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgeG9yX2NvbWJpbmUoX0dlbiYgX19nKQorCTogX01fYjEoX19nKSwgX01fYjIoX19nKQorICAgICAgICB7IF9NX2luaXRpYWxpemVfbWF4KCk7IH0KKworICAgICAgdm9pZAorICAgICAgc2VlZCgpCisgICAgICB7CisJX01fYjEuc2VlZCgpOworCV9NX2IyLnNlZWQoKTsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0dlbj4KKyAgICAgICAgdm9pZAorICAgICAgICBzZWVkKF9HZW4mIF9fZykKKyAgICAgICAgeworCSAgX01fYjEuc2VlZChfX2cpOworCSAgX01fYjIuc2VlZChfX2cpOworCX0KKworICAgICAgY29uc3QgYmFzZTFfdHlwZSYKKyAgICAgIGJhc2UxKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2IxOyB9CisKKyAgICAgIGNvbnN0IGJhc2UyX3R5cGUmCisgICAgICBiYXNlMigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9iMjsgfQorCisgICAgICByZXN1bHRfdHlwZQorICAgICAgbWluKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIDA7IH0KKworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tYXg7IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHNlcXVlbmNlLgorICAgICAgICovCisgICAgICAvLyBOQjogTm90IGV4YWN0bHkgdGhlIFRSMSBmb3JtdWxhLCBwZXIgTjIwNzkgaW5zdGVhZC4KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKCkKKyAgICAgIHsKKwlyZXR1cm4gKChyZXN1bHRfdHlwZShfTV9iMSgpIC0gX01fYjEubWluKCkpIDw8IHNoaWZ0MSkKKwkJXiAocmVzdWx0X3R5cGUoX01fYjIoKSAtIF9NX2IyLm1pbigpKSA8PCBzaGlmdDIpKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBDb21wYXJlcyB0d28gJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9iamVjdHMgb2YKKyAgICAgICAqIHRoZSBzYW1lIHR5cGUgZm9yIGVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgKi8KKyAgICAgIGZyaWVuZCBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHhvcl9jb21iaW5lJiBfX2xocywgY29uc3QgeG9yX2NvbWJpbmUmIF9fcmhzKQorICAgICAgeworCXJldHVybiAoX19saHMuYmFzZTEoKSA9PSBfX3Jocy5iYXNlMSgpKQorCSAgICAgICAgJiYgKF9fbGhzLmJhc2UyKCkgPT0gX19yaHMuYmFzZTIoKSk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogQ29tcGFyZXMgdHdvICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3RzIG9mCisgICAgICAgKiB0aGUgc2FtZSB0eXBlIGZvciBpbmVxdWFsaXR5LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2xocyBBICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBvYmplY3QuCisgICAgICAgKiBAcGFyYW0gX19yaHMgQW5vdGhlciAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAqICAgICAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICovCisgICAgICBmcmllbmQgYm9vbAorICAgICAgb3BlcmF0b3IhPShjb25zdCB4b3JfY29tYmluZSYgX19saHMsIGNvbnN0IHhvcl9jb21iaW5lJiBfX3JocykKKyAgICAgIHsgcmV0dXJuICEoX19saHMgPT0gX19yaHMpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhICV4b3JfY29tYmluZSByYW5kb20gbnVtYmVyCisgICAgICAgKiBnZW5lcmF0b3IgZW5naW5lIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXhvcl9jb21iaW5lIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjExLCBpbnQgX19zMTEsCisJICAgICAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMjEsIGludCBfX3MyMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMTEsIF9fczExLAorCQkgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIxLCBfX3MyMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlcgorICAgICAgICogZ2VuZXJhdG9yIGVuZ2luZSBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAleG9yX2NvbWJpbmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGV4dHJhY3RlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMTEsIGludCBfX3MxMSwKKwkgICAgICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyMSwgaW50IF9fczIxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgeG9yX2NvbWJpbmU8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxMSwgX19zMTEsCisJCSAgIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMjEsIF9fczIxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplX21heCgpOworCisgICAgICByZXN1bHRfdHlwZQorICAgICAgX01faW5pdGlhbGl6ZV9tYXhfYXV4KHJlc3VsdF90eXBlLCByZXN1bHRfdHlwZSwgaW50KTsKKworICAgICAgYmFzZTFfdHlwZSAgX01fYjE7CisgICAgICBiYXNlMl90eXBlICBfTV9iMjsKKyAgICAgIHJlc3VsdF90eXBlIF9NX21heDsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEEgc3RhbmRhcmQgaW50ZXJmYWNlIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgbm9uLWRldGVybWluaXN0aWMKKyAgICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKGlmIGFueSBhcmUgYXZhaWxhYmxlKS4KKyAgICovCisgIGNsYXNzIHJhbmRvbV9kZXZpY2UKKyAgeworICBwdWJsaWM6CisgICAgLy8gdHlwZXMKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCByZXN1bHRfdHlwZTsKKworICAgIC8vIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbnMKKworI2lmZGVmIF9HTElCQ1hYX1VTRV9SQU5ET01fVFIxCisKKyAgICBleHBsaWNpdAorICAgIHJhbmRvbV9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIF9fdG9rZW4gPSAiL2Rldi91cmFuZG9tIikKKyAgICB7CisgICAgICBpZiAoKF9fdG9rZW4gIT0gIi9kZXYvdXJhbmRvbSIgJiYgX190b2tlbiAhPSAiL2Rldi9yYW5kb20iKQorCSAgfHwgIShfTV9maWxlID0gc3RkOjpmb3BlbihfX3Rva2VuLmNfc3RyKCksICJyYiIpKSkKKwlzdGQ6Ol9fdGhyb3dfcnVudGltZV9lcnJvcihfX04oInJhbmRvbV9kZXZpY2U6OiIKKwkJCQkgICAgICAgInJhbmRvbV9kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmKSIpKTsKKyAgICB9CisKKyAgICB+cmFuZG9tX2RldmljZSgpCisgICAgeyBzdGQ6OmZjbG9zZShfTV9maWxlKTsgfQorCisjZWxzZQorCisgICAgZXhwbGljaXQKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBfX3Rva2VuID0gIm10MTk5MzciKQorICAgIDogX01fbXQoX01fc3RydG91bChfX3Rva2VuKSkgeyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZworICAgIF9NX3N0cnRvdWwoY29uc3Qgc3RkOjpzdHJpbmcmIF9fc3RyKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgX19yZXQgPSA1NDg5VUw7CisgICAgICBpZiAoX19zdHIgIT0gIm10MTk5MzciKQorCXsKKwkgIGNvbnN0IGNoYXIqIF9fbnB0ciA9IF9fc3RyLmNfc3RyKCk7CisJICBjaGFyKiBfX2VuZHB0cjsKKwkgIF9fcmV0ID0gc3RkOjpzdHJ0b3VsKF9fbnB0ciwgJl9fZW5kcHRyLCAwKTsKKwkgIGlmICgqX19ucHRyID09ICdcMCcgfHwgKl9fZW5kcHRyICE9ICdcMCcpCisJICAgIHN0ZDo6X190aHJvd19ydW50aW1lX2Vycm9yKF9fTigicmFuZG9tX2RldmljZTo6X01fc3RydG91bCIKKwkJCQkJICAgIihjb25zdCBzdGQ6OnN0cmluZyYpIikpOworCX0KKyAgICAgIHJldHVybiBfX3JldDsKKyAgICB9CisKKyAgcHVibGljOgorCisjZW5kaWYKKworICAgIHJlc3VsdF90eXBlCisgICAgbWluKCkgY29uc3QKKyAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWluKCk7IH0KKworICAgIHJlc3VsdF90eXBlCisgICAgbWF4KCkgY29uc3QKKyAgICB7IHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6bWF4KCk7IH0KKworICAgIGRvdWJsZQorICAgIGVudHJvcHkoKSBjb25zdAorICAgIHsgcmV0dXJuIDAuMDsgfQorCisgICAgcmVzdWx0X3R5cGUKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1JBTkRPTV9UUjEKKyAgICAgIHJlc3VsdF90eXBlIF9fcmV0OworICAgICAgc3RkOjpmcmVhZChyZWludGVycHJldF9jYXN0PHZvaWQqPigmX19yZXQpLCBzaXplb2YocmVzdWx0X3R5cGUpLAorCQkgMSwgX01fZmlsZSk7CisgICAgICByZXR1cm4gX19yZXQ7CisjZWxzZQorICAgICAgcmV0dXJuIF9NX210KCk7CisjZW5kaWYKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICByYW5kb21fZGV2aWNlKGNvbnN0IHJhbmRvbV9kZXZpY2UmKTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCByYW5kb21fZGV2aWNlJik7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfUkFORE9NX1RSMQorICAgIEZJTEUqICAgICAgICBfTV9maWxlOworI2Vsc2UKKyAgICBtdDE5OTM3ICAgICAgX01fbXQ7CisjZW5kaWYKKyAgfTsKKworICAvKiBAfSAqLyAvLyBncm91cCB0cjFfcmFuZG9tX2dlbmVyYXRvcnMKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zIFJhbmRvbSBOdW1iZXIgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCB0cjFfcmFuZG9tCisgICAqIEB7CisgICAqLworCisgIC8qKgorICAgKiBAYWRkdG9ncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfZGlzY3JldGUgRGlzY3JldGUgRGlzdHJpYnV0aW9ucworICAgKiBAaW5ncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnMKKyAgICogQHsKKyAgICovCisKKyAgLyoqCisgICAqIEBicmllZiBVbmlmb3JtIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbiBmb3IgcmFuZG9tIG51bWJlcnMuCisgICAqIEEgZGlzY3JldGUgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvbiB0aGUgcmFuZ2UgQGYkW21pbiwgbWF4XUBmJCB3aXRoIGVxdWFsCisgICAqIHByb2JhYmlsaXR5IHRocm91Z2hvdXQgdGhlIHJhbmdlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQ+CisgICAgY2xhc3MgdW5pZm9ybV9pbnQKKyAgICB7CisgICAgICBfX2dsaWJjeHhfY2xhc3NfcmVxdWlyZXMoX0ludFR5cGUsIF9JbnRlZ2VyQ29uY2VwdCkKKyAKKyAgICBwdWJsaWM6CisgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgcmFuZ2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gKi8KKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlmb3JtX2ludChfSW50VHlwZSBfX21pbiA9IDAsIF9JbnRUeXBlIF9fbWF4ID0gOSkKKyAgICAgIDogX01fbWluKF9fbWluKSwgX01fbWF4KF9fbWF4KQorICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9taW4gPD0gX01fbWF4KTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBpbmNsdXNpdmUgbG93ZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1pbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9taW47IH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBpbmNsdXNpdmUgdXBwZXIgYm91bmQgb2YgdGhlIGRpc3RyaWJ1dGlvbiByYW5nZS4KKyAgICAgICAqLworICAgICAgcmVzdWx0X3R5cGUKKyAgICAgIG1heCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tYXg7IH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbiBzdGF0ZS4KKyAgICAgICAqCisgICAgICAgKiBEb2VzIG5vdGhpbmcgZm9yIHRoZSB1bmlmb3JtIGludGVnZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICByZXNldCgpIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgYSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UKKyAgICAgICAqIEBmJChtaW4sIG1heClAZiQuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I6OnJlc3VsdF90eXBlCisJICAgIF9VUmVzdWx0X3R5cGU7CisJICByZXR1cm4gX01fY2FsbChfX3VybmcsIF9NX21pbiwgX01fbWF4LAorCQkJIHR5cGVuYW1lIGlzX2ludGVncmFsPF9VUmVzdWx0X3R5cGU+Ojp0eXBlKCkpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIGEgdW5pZm9ybSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBAZiRbMCwgbilAZiQuCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhaW1lZCBhdCB1c2Ugd2l0aCBzdGQ6OnJhbmRvbV9zaHVmZmxlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLCByZXN1bHRfdHlwZSBfX24pCisgICAgICAgIHsKKwkgIHR5cGVkZWYgdHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I6OnJlc3VsdF90eXBlCisJICAgIF9VUmVzdWx0X3R5cGU7CisJICByZXR1cm4gX01fY2FsbChfX3VybmcsIDAsIF9fbiAtIDEsCisJCQkgdHlwZW5hbWUgaXNfaW50ZWdyYWw8X1VSZXN1bHRfdHlwZT46OnR5cGUoKSk7CisJfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAldW5pZm9ybV9pbnQgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24gQHAgX194IGludG8gdGhlCisgICAgICAgKiBvdXRwdXQgc3RyZWFtIEBwIG9zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX2ludCByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCB1bmlmb3JtX2ludDxfSW50VHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJXVuaWZvcm1faW50IHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAldW5pZm9ybV9pbnQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICB1bmlmb3JtX2ludDxfSW50VHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBfTV9jYWxsKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcsCisJCXJlc3VsdF90eXBlIF9fbWluLCByZXN1bHRfdHlwZSBfX21heCwgdHJ1ZV90eXBlKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIF9NX2NhbGwoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZywKKwkJcmVzdWx0X3R5cGUgX19taW4sIHJlc3VsdF90eXBlIF9fbWF4LCBmYWxzZV90eXBlKQorICAgICAgICB7CisJICByZXR1cm4gcmVzdWx0X3R5cGUoKF9fdXJuZygpIC0gX191cm5nLm1pbigpKQorCQkJICAgICAvIChfX3VybmcubWF4KCkgLSBfX3VybmcubWluKCkpCisJCQkgICAgICogKF9fbWF4IC0gX19taW4gKyAxKSkgKyBfX21pbjsKKwl9CisKKyAgICAgIF9JbnRUeXBlIF9NX21pbjsKKyAgICAgIF9JbnRUeXBlIF9NX21heDsKKyAgICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBBIEJlcm5vdWxsaSByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogR2VuZXJhdGVzIGEgc2VxdWVuY2Ugb2YgdHJ1ZSBhbmQgZmFsc2UgdmFsdWVzIHdpdGggbGlrZWxpaG9vZCBAZiQgcCBAZiQKKyAgICogdGhhdCB0cnVlIHdpbGwgY29tZSB1cCBhbmQgQGYkICgxIC0gcCkgQGYkIHRoYXQgZmFsc2Ugd2lsbCBhcHBlYXIuCisgICAqLworICBjbGFzcyBiZXJub3VsbGlfZGlzdHJpYnV0aW9uCisgIHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgaW50ICBpbnB1dF90eXBlOworICAgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24gd2l0aCBsaWtlbGlob29kIEBwIHAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gX19wICBbSU5dICBUaGUgbGlrZWxpaG9vZCBvZiBhIHRydWUgcmVzdWx0IGJlaW5nIHJldHVybmVkLiAgTXVzdAorICAgICAqIGJlIGluIHRoZSBpbnRlcnZhbCBAZiQgWzAsIDFdIEBmJC4KKyAgICAgKi8KKyAgICBleHBsaWNpdAorICAgIGJlcm5vdWxsaV9kaXN0cmlidXRpb24oZG91YmxlIF9fcCA9IDAuNSkKKyAgICA6IF9NX3AoX19wKQorICAgIHsgCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoKF9NX3AgPj0gMC4wKSAmJiAoX01fcCA8PSAxLjApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBAcCBwIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAqLworICAgIGRvdWJsZQorICAgIHAoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3A7IH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uIHN0YXRlLgorICAgICAqCisgICAgICogRG9lcyBub3RoaW5nIGZvciBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24uCisgICAgICovCisgICAgdm9pZAorICAgIHJlc2V0KCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBCZXJub3VsbGlhbiBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJaWYgKChfX3VybmcoKSAtIF9fdXJuZy5taW4oKSkgPCBfTV9wICogKF9fdXJuZy5tYXgoKSAtIF9fdXJuZy5taW4oKSkpCisJICByZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAqCisgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gX194ICBBICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAqCisgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJIGNvbnN0IGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feCk7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0cyBhICViZXJub3VsbGlfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAqCisgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBfX3ggIEEgJWJlcm5vdWxsaV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAqCisgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJIGJlcm5vdWxsaV9kaXN0cmlidXRpb24mIF9feCkKKyAgICAgIHsgcmV0dXJuIF9faXMgPj4gX194Ll9NX3A7IH0KKworICBwcml2YXRlOgorICAgIGRvdWJsZSBfTV9wOworICB9OworCisKKyAgLyoqCisgICAqIEBicmllZiBBIGRpc2NyZXRlIGdlb21ldHJpYyByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBnZW9tZXRyaWMgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcyAKKyAgICogQGYkIHAoaSkgPSAoMSAtIHApcF57aS0xfSBAZiQgd2hlcmUgQGYkIHAgQGYkIGlzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCisgICAqIGRpc3RyaWJ1dGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlID0gaW50LCB0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgIHJlc3VsdF90eXBlOworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIGdlb21ldHJpY19kaXN0cmlidXRpb24oY29uc3QgX1JlYWxUeXBlJiBfX3AgPSBfUmVhbFR5cGUoMC41KSkKKyAgICAgIDogX01fcChfX3ApCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV9wID4gMC4wKSAmJiAoX01fcCA8IDEuMCkpOworCV9NX2luaXRpYWxpemUoKTsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBHZXRzIHRoZSBkaXN0cmlidXRpb24gcGFyYW1ldGVyIEBwIHAuCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgcCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wOyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGludG8gdGhlIG91dHB1dCBzdHJlYW0gQHAgX19vcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19vcyBBbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZTEsIHR5cGVuYW1lIF9SZWFsVHlwZTEsCisJICAgICAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCQkgICBjb25zdCBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMSwgX1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAlZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWdlb21ldHJpY19kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbiYgX194KQorICAgICAgICB7CisJICBfX2lzID4+IF9feC5fTV9wOworCSAgX194Ll9NX2luaXRpYWxpemUoKTsKKwkgIHJldHVybiBfX2lzOworCX0KKworICAgIHByaXZhdGU6CisgICAgICB2b2lkCisgICAgICBfTV9pbml0aWFsaXplKCkKKyAgICAgIHsgX01fbG9nX3AgPSBzdGQ6OmxvZyhfTV9wKTsgfQorCisgICAgICBfUmVhbFR5cGUgX01fcDsKKyAgICAgIF9SZWFsVHlwZSBfTV9sb2dfcDsKKyAgICB9OworCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIGNsYXNzIG5vcm1hbF9kaXN0cmlidXRpb247CisKKyAgLyoqCisgICAqIEBicmllZiBBIGRpc2NyZXRlIFBvaXNzb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgUG9pc3NvbiBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzCisgICAqIEBmJCBwKGkpID0gXGZyYWN7bWVhbl5pfXtpIX0gZV57LW1lYW59IEBmJCB3aGVyZSBAZiQgbWVhbiBAZiQgaXMgdGhlCisgICAqIHBhcmFtZXRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUgPSBpbnQsIHR5cGVuYW1lIF9SZWFsVHlwZSA9IGRvdWJsZT4KKyAgICBjbGFzcyBwb2lzc29uX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgIHJlc3VsdF90eXBlOworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIHBvaXNzb25fZGlzdHJpYnV0aW9uKGNvbnN0IF9SZWFsVHlwZSYgX19tZWFuID0gX1JlYWxUeXBlKDEpKQorICAgICAgOiBfTV9tZWFuKF9fbWVhbiksIF9NX25kKCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbWVhbiA+IDAuMCk7CisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXIgQHAgbWVhbi4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBtZWFuKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21lYW47IH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAlcG9pc3Nvbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJXBvaXNzb25fZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIHN0YXRlIG9mIEBwIF9feCBpbnNlcnRlZCBvciBpbgorICAgICAgICogYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX1JlYWxUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlMSwgX1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAlcG9pc3Nvbl9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVwb2lzc29uX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlMSwgdHlwZW5hbWUgX1JlYWxUeXBlMSwKKwkgICAgICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJCSAgIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlMSwgX1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZSgpOworCisgICAgICAvLyBOQjogVW51c2VkIHdoZW4gX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMSBpcyB1bmRlZmluZWQuCisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gX01fbmQ7CisKKyAgICAgIF9SZWFsVHlwZSBfTV9tZWFuOworCisgICAgICAvLyBIb3N0cyBlaXRoZXIgbG9nKG1lYW4pIG9yIHRoZSB0aHJlc2hvbGQgb2YgdGhlIHNpbXBsZSBtZXRob2QuCisgICAgICBfUmVhbFR5cGUgX01fbG1fdGhyOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9SZWFsVHlwZSBfTV9sZm0sIF9NX3NtLCBfTV9kLCBfTV9zY3gsIF9NXzFjeCwgX01fYzJiLCBfTV9jYjsKKyNlbmRpZgorICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZGlzY3JldGUgYmlub21pYWwgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGZvciB0aGUgYmlub21pYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcyAKKyAgICogQGYkIHAoaSkgPSBcYmlub217bn17aX0gcF5pICgxIC0gcClee3QgLSBpfSBAZiQgd2hlcmUgQGYkIHQgQGYkCisgICAqIGFuZCBAZiQgcCBAZiQgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSA9IGludCwgdHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0ludFR5cGUgIHJlc3VsdF90eXBlOworCisgICAgICAvLyBjb25zdHJ1Y3RvcnMgYW5kIG1lbWJlciBmdW5jdGlvbgorICAgICAgZXhwbGljaXQKKyAgICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbihfSW50VHlwZSBfX3QgPSAxLAorCQkJICAgIGNvbnN0IF9SZWFsVHlwZSYgX19wID0gX1JlYWxUeXBlKDAuNSkpCisgICAgICA6IF9NX3QoX190KSwgX01fcChfX3ApLCBfTV9uZCgpCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKChfTV90ID49IDApICYmIChfTV9wID49IDAuMCkgJiYgKF9NX3AgPD0gMS4wKSk7CisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGRpc3RyaWJ1dGlvbiBAcCB0IHBhcmFtZXRlci4KKyAgICAgICAqLworICAgICAgX0ludFR5cGUKKyAgICAgIHQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fdDsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGRpc3RyaWJ1dGlvbiBAcCBwIHBhcmFtZXRlci4KKyAgICAgICAqLworICAgICAgX1JlYWxUeXBlCisgICAgICBwKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3A7IH0KKworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9uZC5yZXNldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpOworCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICViaW5vbWlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMSwgX1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggZnJvbSB0aGUgaW5wdXQgc3RyZWFtIEBwIF9faXMuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9faXMgQW4gaW5wdXQgc3RyZWFtLgorICAgICAgICogQHBhcmFtIF9feCAgQSAlYmlub21pYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGVuZ2luZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgc3RyZWFtIHdpdGggQHAgX194IGV4dHJhY3RlZCBvciBpbiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUxLCB0eXBlbmFtZSBfUmVhbFR5cGUxLAorCSAgICAgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgYmlub21pYWxfZGlzdHJpYnV0aW9uPF9JbnRUeXBlMSwgX1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICBwcml2YXRlOgorICAgICAgdm9pZAorICAgICAgX01faW5pdGlhbGl6ZSgpOworCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgX01fd2FpdGluZyhfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLCBfSW50VHlwZSBfX3QpOworCisgICAgICAvLyBOQjogVW51c2VkIHdoZW4gX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMSBpcyB1bmRlZmluZWQuCisgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4gX01fbmQ7CisKKyAgICAgIF9SZWFsVHlwZSBfTV9xOworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIF9SZWFsVHlwZSBfTV9kMSwgX01fZDIsIF9NX3MxLCBfTV9zMiwgX01fYywKKwkgICAgICAgIF9NX2ExLCBfTV9hMTIzLCBfTV9zLCBfTV9sZiwgX01fbHAxcDsKKyNlbmRpZgorICAgICAgX1JlYWxUeXBlIF9NX3A7CisgICAgICBfSW50VHlwZSAgX01fdDsKKworICAgICAgYm9vbCAgICAgIF9NX2Vhc3k7CisgICAgfTsKKworICAvKiBAfSAqLyAvLyBncm91cCB0cjFfcmFuZG9tX2Rpc3RyaWJ1dGlvbnNfZGlzY3JldGUKKworICAvKioKKyAgICogQGFkZHRvZ3JvdXAgdHIxX3JhbmRvbV9kaXN0cmlidXRpb25zX2NvbnRpbnVvdXMgQ29udGludW91cyBEaXN0cmlidXRpb25zCisgICAqIEBpbmdyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9ucworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogQGJyaWVmIFVuaWZvcm0gY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBBIGNvbnRpbnVvdXMgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvbiB0aGUgcmFuZ2UgW21pbiwgbWF4KSB3aXRoIGVxdWFsCisgICAqIHByb2JhYmlsaXR5IHRocm91Z2hvdXQgdGhlIHJhbmdlLiAgVGhlIFVSTkcgc2hvdWxkIGJlIHJlYWwtdmFsdWVkIGFuZAorICAgKiBkZWxpdmVyIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAsIDEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIHVuaWZvcm1fcmVhbAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgdW5pZm9ybV9yZWFsIG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19taW4gW0lOXSAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKiBAcGFyYW0gX19tYXggW0lOXSAgVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICB1bmlmb3JtX3JlYWwoX1JlYWxUeXBlIF9fbWluID0gX1JlYWxUeXBlKDApLAorCQkgICBfUmVhbFR5cGUgX19tYXggPSBfUmVhbFR5cGUoMSkpCisgICAgICA6IF9NX21pbihfX21pbiksIF9NX21heChfX21heCkKKyAgICAgIHsKKwlfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fbWluIDw9IF9NX21heCk7CisgICAgICB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWluOyB9CisKKyAgICAgIHJlc3VsdF90eXBlCisgICAgICBtYXgoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWF4OyB9CisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yPgorICAgICAgICByZXN1bHRfdHlwZQorICAgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICAgIHsgcmV0dXJuIChfX3VybmcoKSAqIChfTV9tYXggLSBfTV9taW4pKSArIF9NX21pbjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAldW5pZm9ybV9yZWFsIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uIEBwIF9feCBpbnRvIHRoZQorICAgICAgICogb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX3JlYWwgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IHVuaWZvcm1fcmVhbDxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICV1bmlmb3JtX3JlYWwgcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICV1bmlmb3JtX3JlYWwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgdW5pZm9ybV9yZWFsPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgcHJpdmF0ZToKKyAgICAgIF9SZWFsVHlwZSBfTV9taW47CisgICAgICBfUmVhbFR5cGUgX01fbWF4OworICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIEFuIGV4cG9uZW50aWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBleHBvbmVudGlhbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGlzIAorICAgKiBAZiQgcCh4KSA9IFxsYW1iZGEgZV57LVxsYW1iZGEgeH0gQGYkLgorICAgKgorICAgKiA8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9MTAgY2VsbHNwYWNpbmc9MD4KKyAgICogPGNhcHRpb24gYWxpZ249dG9wPkRpc3RyaWJ1dGlvbiBTdGF0aXN0aWNzPC9jYXB0aW9uPgorICAgKiA8dHI+PHRkPk1lYW48L3RkPjx0ZD5AZiQgXGZyYWN7MX17XGxhbWJkYX0gQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPk1lZGlhbjwvdGQ+PHRkPkBmJCBcZnJhY3tcbG4gMn17XGxhbWJkYX0gQGYkPC90ZD48L3RyPgorICAgKiA8dHI+PHRkPk1vZGU8L3RkPjx0ZD5AZiQgemVybyBAZiQ8L3RkPjwvdHI+CisgICAqIDx0cj48dGQ+UmFuZ2U8L3RkPjx0ZD5AZiRbMCwgXGluZnR5XUBmJDwvdGQ+PC90cj4KKyAgICogPHRyPjx0ZD5TdGFuZGFyZCBEZXZpYXRpb248L3RkPjx0ZD5AZiQgXGZyYWN7MX17XGxhbWJkYX0gQGYkPC90ZD48L3RyPgorICAgKiA8L3RhYmxlPgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAvLyB0eXBlcworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgaW5wdXRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIHJlc3VsdF90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiB3aXRoIGludmVyc2Ugc2NhbGUgcGFyYW1ldGVyCisgICAgICAgKiBAZiQgXGxhbWJkYSBAZiQuCisgICAgICAgKi8KKyAgICAgIGV4cGxpY2l0CisgICAgICBleHBvbmVudGlhbF9kaXN0cmlidXRpb24oY29uc3QgcmVzdWx0X3R5cGUmIF9fbGFtYmRhID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX2xhbWJkYShfX2xhbWJkYSkKKyAgICAgIHsgCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2xhbWJkYSA+IDApOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIGludmVyc2Ugc2NhbGUgcGFyYW1ldGVyIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgbGFtYmRhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2xhbWJkYTsgfQorCisgICAgICAvKioKKyAgICAgICAqIFJlc2V0cyB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICoKKyAgICAgICAqIEhhcyBubyBlZmZlY3Qgb24gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9ucy4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgICAgeyByZXR1cm4gLXN0ZDo6bG9nKF9fdXJuZygpKSAvIF9NX2xhbWJkYTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEluc2VydHMgYSAlZXhwb25lbnRpYWxfZGlzdHJpYnV0aW9uIHJhbmRvbSBudW1iZXIgZGlzdHJpYnV0aW9uCisgICAgICAgKiBAcCBfX3ggaW50byB0aGUgb3V0cHV0IHN0cmVhbSBAcCBfX29zLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX29zIEFuIG91dHB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194ICBBICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgICAgLyoqCisgICAgICAgKiBFeHRyYWN0cyBhICVleHBvbmVudGlhbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gQHAgX19pcy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gX19pcyBBbiBpbnB1dCBzdHJlYW0uCisgICAgICAgKiBAcGFyYW0gX194IEEgJWV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyCisgICAgICAgKiAgICAgICAgICAgIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBleHBvbmVudGlhbF9kaXN0cmlidXRpb24mIF9feCkKKyAgICAgICAgeyByZXR1cm4gX19pcyA+PiBfX3guX01fbGFtYmRhOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgcmVzdWx0X3R5cGUgX01fbGFtYmRhOworICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIEEgbm9ybWFsIGNvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGZvciByYW5kb20gbnVtYmVycy4KKyAgICoKKyAgICogVGhlIGZvcm11bGEgZm9yIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbiBpcyAKKyAgICogQGYkIHAoeCkgPSBcZnJhY3sxfXtcc2lnbWEgXHNxcnR7MiBccGl9fSAKKyAgICogICAgICAgICAgICBlXnstIFxmcmFje3t4IC0gbWVhbn1eIHsyfX17MiBcc2lnbWEgXiB7Mn19IH0gQGYkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlID0gZG91YmxlPgorICAgIGNsYXNzIG5vcm1hbF9kaXN0cmlidXRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgLy8gdHlwZXMKKyAgICAgIHR5cGVkZWYgX1JlYWxUeXBlIGlucHV0X3R5cGU7CisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSByZXN1bHRfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBwYXJhbWV0ZXJzIEBmJCBtZWFuIEBmJCBhbmQKKyAgICAgICAqIEBmJCBcc2lnbWEgQGYkLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbihjb25zdCByZXN1bHRfdHlwZSYgX19tZWFuID0gcmVzdWx0X3R5cGUoMCksCisJCQkgIGNvbnN0IHJlc3VsdF90eXBlJiBfX3NpZ21hID0gcmVzdWx0X3R5cGUoMSkpCisgICAgICA6IF9NX21lYW4oX19tZWFuKSwgX01fc2lnbWEoX19zaWdtYSksIF9NX3NhdmVkX2F2YWlsYWJsZShmYWxzZSkKKyAgICAgIHsgCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpZ21hID4gMCk7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uLgorICAgICAgICovCisgICAgICBfUmVhbFR5cGUKKyAgICAgIG1lYW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWVhbjsgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIEBmJCBcc2lnbWEgQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgc2lnbWEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fc2lnbWE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKQorICAgICAgeyBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsgfQorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgICAgcmVzdWx0X3R5cGUKKyAgICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKTsKKworICAgICAgLyoqCisgICAgICAgKiBJbnNlcnRzIGEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24uCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3RhdGUgb2YgQHAgX194IGluc2VydGVkIG9yIGluCisgICAgICAgKiBhbiBlcnJvciBzdGF0ZS4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlMSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgICAgICBmcmllbmQgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJCSAgIGNvbnN0IG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlMT4mIF9feCk7CisKKyAgICAgIC8qKgorICAgICAgICogRXh0cmFjdHMgYSAlbm9ybWFsX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJW5vcm1hbF9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZW5naW5lLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIFRoZSBpbnB1dCBzdHJlYW0gd2l0aCBAcCBfX3ggZXh0cmFjdGVkIG9yIGluIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkJICAgbm9ybWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGUxPiYgX194KTsKKworICAgIHByaXZhdGU6CisgICAgICByZXN1bHRfdHlwZSBfTV9tZWFuOworICAgICAgcmVzdWx0X3R5cGUgX01fc2lnbWE7CisgICAgICByZXN1bHRfdHlwZSBfTV9zYXZlZDsKKyAgICAgIGJvb2wgICAgICAgIF9NX3NhdmVkX2F2YWlsYWJsZTsgICAgIAorICAgIH07CisKKworICAvKioKKyAgICogQGJyaWVmIEEgZ2FtbWEgY29udGludW91cyBkaXN0cmlidXRpb24gZm9yIHJhbmRvbSBudW1iZXJzLgorICAgKgorICAgKiBUaGUgZm9ybXVsYSBmb3IgdGhlIGdhbW1hIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gaXMgCisgICAqIEBmJCBwKHgpID0gXGZyYWN7MX17XEdhbW1hKFxhbHBoYSl9IHhee1xhbHBoYSAtIDF9IGVeey14fSBAZiQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUgPSBkb3VibGU+CisgICAgY2xhc3MgZ2FtbWFfZGlzdHJpYnV0aW9uCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIF9SZWFsVHlwZSBpbnB1dF90eXBlOworICAgICAgdHlwZWRlZiBfUmVhbFR5cGUgcmVzdWx0X3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSBnYW1tYSBkaXN0cmlidXRpb24gd2l0aCBwYXJhbWV0ZXJzIEBmJCBcYWxwaGEgQGYkLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgZ2FtbWFfZGlzdHJpYnV0aW9uKGNvbnN0IHJlc3VsdF90eXBlJiBfX2FscGhhX3ZhbCA9IHJlc3VsdF90eXBlKDEpKQorICAgICAgOiBfTV9hbHBoYShfX2FscGhhX3ZhbCkKKyAgICAgIHsgCisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX2FscGhhID4gMCk7CisJX01faW5pdGlhbGl6ZSgpOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEdldHMgdGhlIEBmJCBcYWxwaGEgQGYkIG9mIHRoZSBkaXN0cmlidXRpb24uCisgICAgICAgKi8KKyAgICAgIF9SZWFsVHlwZQorICAgICAgYWxwaGEoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fYWxwaGE7IH0KKworICAgICAgLyoqCisgICAgICAgKiBSZXNldHMgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqLworICAgICAgdm9pZAorICAgICAgcmVzZXQoKSB7IH0KKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICAgIHJlc3VsdF90eXBlCisgICAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZyk7CisKKyAgICAgIC8qKgorICAgICAgICogSW5zZXJ0cyBhICVnYW1tYV9kaXN0cmlidXRpb24gcmFuZG9tIG51bWJlciBkaXN0cmlidXRpb24KKyAgICAgICAqIEBwIF9feCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtIEBwIF9fb3MuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fb3MgQW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBUaGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdGF0ZSBvZiBAcCBfX3ggaW5zZXJ0ZWQgb3IgaW4KKyAgICAgICAqIGFuIGVycm9yIHN0YXRlLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUxLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgICAgIGZyaWVuZCBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICAgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkJICAgY29uc3QgZ2FtbWFfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZTE+JiBfX3gpOworCisgICAgICAvKioKKyAgICAgICAqIEV4dHJhY3RzIGEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGRpc3RyaWJ1dGlvbgorICAgICAgICogQHAgX194IGZyb20gdGhlIGlucHV0IHN0cmVhbSBAcCBfX2lzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBfX2lzIEFuIGlucHV0IHN0cmVhbS4KKyAgICAgICAqIEBwYXJhbSBfX3ggIEEgJWdhbW1hX2Rpc3RyaWJ1dGlvbiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBlbmdpbmUuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgVGhlIGlucHV0IHN0cmVhbSB3aXRoIEBwIF9feCBleHRyYWN0ZWQgb3IgaW4gYW4gZXJyb3Igc3RhdGUuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICAgICAgZnJpZW5kIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgICAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCQkgICBnYW1tYV9kaXN0cmlidXRpb24mIF9feCkKKyAgICAgICAgeworCSAgX19pcyA+PiBfX3guX01fYWxwaGE7CisJICBfX3guX01faW5pdGlhbGl6ZSgpOworCSAgcmV0dXJuIF9faXM7CisJfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQKKyAgICAgIF9NX2luaXRpYWxpemUoKTsKKworICAgICAgcmVzdWx0X3R5cGUgX01fYWxwaGE7CisKKyAgICAgIC8vIEhvc3RzIGVpdGhlciBsYW1iZGEgb2YgR0Igb3IgZCBvZiBtb2RpZmllZCBWYWR1dmEncy4KKyAgICAgIHJlc3VsdF90eXBlIF9NX2xfZDsKKyAgICB9OworCisgIC8qIEB9ICovIC8vIGdyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9uc19jb250aW51b3VzCisgIC8qIEB9ICovIC8vIGdyb3VwIHRyMV9yYW5kb21fZGlzdHJpYnV0aW9ucworICAvKiBAfSAqLyAvLyBncm91cCB0cjFfcmFuZG9tCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9SQU5ET01fSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvcmFuZG9tLnRjYyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3JhbmRvbS50Y2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4YzRmZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3JhbmRvbS50Y2MKQEAgLTAsMCArMSwxNzIxIEBACisvLyByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gKG91dCBvZiBsaW5lKSAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworCisvKiogQGZpbGUgdHIxL3JhbmRvbS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvcmFuZG9tfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JBTkRPTV9UQ0MKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1JBTkRPTV9UQ0MgMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgLyoKKyAgICogKEZ1cnRoZXIpIGltcGxlbWVudGF0aW9uLXNwYWNlIGRldGFpbHMuCisgICAqLworICBuYW1lc3BhY2UgX19kZXRhaWwKKyAgeworICBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgICAgLy8gR2VuZXJhbCBjYXNlIGZvciB4ID0gKGF4ICsgYykgbW9kIG0gLS0gdXNlIFNjaHJhZ2UncyBhbGdvcml0aG0gdG8gYXZvaWQKKyAgICAvLyBpbnRlZ2VyIG92ZXJmbG93LgorICAgIC8vCisgICAgLy8gQmVjYXVzZSBhIGFuZCBjIGFyZSBjb21waWxlLXRpbWUgaW50ZWdyYWwgY29uc3RhbnRzIHRoZSBjb21waWxlciBraW5kbHkKKyAgICAvLyBlbGlkZXMgYW55IHVucmVhY2hhYmxlIHBhdGhzLgorICAgIC8vCisgICAgLy8gUHJlY29uZGl0aW9uczogIGEgPiAwLCBtID4gMC4KKyAgICAvLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX1RwIF9fYSwgX1RwIF9fYywgX1RwIF9fbSwgYm9vbD4KKyAgICAgIHN0cnVjdCBfTW9kCisgICAgICB7CisJc3RhdGljIF9UcAorCV9fY2FsYyhfVHAgX194KQorCXsKKwkgIGlmIChfX2EgPT0gMSkKKwkgICAgX194ICU9IF9fbTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19xID0gX19tIC8gX19hOworCSAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19yID0gX19tICUgX19hOworCSAgICAgIAorCSAgICAgIF9UcCBfX3QxID0gX19hICogKF9feCAlIF9fcSk7CisJICAgICAgX1RwIF9fdDIgPSBfX3IgKiAoX194IC8gX19xKTsKKwkgICAgICBpZiAoX190MSA+PSBfX3QyKQorCQlfX3ggPSBfX3QxIC0gX190MjsKKwkgICAgICBlbHNlCisJCV9feCA9IF9fbSAtIF9fdDIgKyBfX3QxOworCSAgICB9CisKKwkgIGlmIChfX2MgIT0gMCkKKwkgICAgeworCSAgICAgIGNvbnN0IF9UcCBfX2QgPSBfX20gLSBfX3g7CisJICAgICAgaWYgKF9fZCA+IF9fYykKKwkJX194ICs9IF9fYzsKKwkgICAgICBlbHNlCisJCV9feCA9IF9fYyAtIF9fZDsKKwkgICAgfQorCSAgcmV0dXJuIF9feDsKKwl9CisgICAgICB9OworCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBtID09IDAgLS0gdXNlIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYXMgbW9kdWxvCisgICAgLy8gb3BlcmF0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX19hLCBfVHAgX19jLCBfVHAgX19tPgorICAgICAgc3RydWN0IF9Nb2Q8X1RwLCBfX2EsIF9fYywgX19tLCB0cnVlPgorICAgICAgeworCXN0YXRpYyBfVHAKKwlfX2NhbGMoX1RwIF9feCkKKwl7IHJldHVybiBfX2EgKiBfX3ggKyBfX2M7IH0KKyAgICAgIH07CisgIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorICB9IC8vIG5hbWVzcGFjZSBfX2RldGFpbAorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om11bHRpcGxpZXI7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPjo6aW5jcmVtZW50OworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICBjb25zdCBfVUludFR5cGUKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46Om1vZHVsdXM7CisKKyAgLyoqCisgICAqIFNlZWRzIHRoZSBMQ1Igd2l0aCBpbnRlZ3JhbCB2YWx1ZSBAcCBfX3gwLCBhZGp1c3RlZCBzbyB0aGF0IHRoZSAKKyAgICogcmluZyBpZGVudGl0eSBpcyBuZXZlciBhIG1lbWJlciBvZiB0aGUgY29udmVyZ2VuY2Ugc2V0LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIHZvaWQKKyAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OgorICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3gwKQorICAgIHsKKyAgICAgIGlmICgoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX2MpID09IDApCisJICAmJiAoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKSA9PSAwKSkKKwlfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPigxKTsKKyAgICAgIGVsc2UKKwlfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKTsKKyAgICB9CisKKyAgLyoqCisgICAqIFNlZWRzIHRoZSBMQ1IgZW5naW5lIHdpdGggYSB2YWx1ZSBnZW5lcmF0ZWQgYnkgQHAgX19nLgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OgorICAgICAgc2VlZChfR2VuJiBfX2csIGZhbHNlX3R5cGUpCisgICAgICB7CisJX1VJbnRUeXBlIF9feDAgPSBfX2coKTsKKwlpZiAoKF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIF9fbT4oX19jKSA9PSAwKQorCSAgICAmJiAoX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgX19tPihfX3gwKSA9PSAwKSkKKwkgIF9NX3ggPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBfX20+KDEpOworCWVsc2UKKwkgIF9NX3ggPSBfX2RldGFpbDo6X19tb2Q8X1VJbnRUeXBlLCAxLCAwLCBfX20+KF9feDApOworICAgICAgfQorCisgIC8qKgorICAgKiBHZXRzIHRoZSBuZXh0IGdlbmVyYXRlZCB2YWx1ZSBpbiBzZXF1ZW5jZS4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgX1VJbnRUeXBlIF9fYSwgX1VJbnRUeXBlIF9fYywgX1VJbnRUeXBlIF9fbT4KKyAgICB0eXBlbmFtZSBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT46OnJlc3VsdF90eXBlCisgICAgbGluZWFyX2NvbmdydWVudGlhbDxfVUludFR5cGUsIF9fYSwgX19jLCBfX20+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICBfTV94ID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4oX01feCk7CisgICAgICByZXR1cm4gX01feDsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBfVUludFR5cGUgX19hLCBfVUludFR5cGUgX19jLCBfVUludFR5cGUgX19tLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBsaW5lYXJfY29uZ3J1ZW50aWFsPF9VSW50VHlwZSwgX19hLCBfX2MsIF9fbT4mIF9fbGNyKQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6Zml4ZWQgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworCisgICAgICBfX29zIDw8IF9fbGNyLl9NX3g7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIF9VSW50VHlwZSBfX2EsIF9VSW50VHlwZSBfX2MsIF9VSW50VHlwZSBfX20sCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGxpbmVhcl9jb25ncnVlbnRpYWw8X1VJbnRUeXBlLCBfX2EsIF9fYywgX19tPiYgX19sY3IpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMpOworCisgICAgICBfX2lzID4+IF9fbGNyLl9NX3g7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9IAorCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OndvcmRfc2l6ZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IGludAorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6c3RhdGVfc2l6ZTsKKyAgICAKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OnNoaWZ0X3NpemU7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om1hc2tfYml0czsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6cGFyYW1ldGVyX2E7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om91dHB1dF91OworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgaW50CisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpvdXRwdXRfczsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IF9VSW50VHlwZQorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6b3V0cHV0X2I7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICBjb25zdCBpbnQKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46Om91dHB1dF90OworCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgY29uc3QgX1VJbnRUeXBlCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjpvdXRwdXRfYzsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIGNvbnN0IGludAorICAgIG1lcnNlbm5lX3R3aXN0ZXI8X1VJbnRUeXBlLCBfX3csIF9fbiwgX19tLCBfX3IsIF9fYSwgX191LCBfX3MsCisJCSAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6b3V0cHV0X2w7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsCisJICAgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwgX1VJbnRUeXBlIF9fYywgaW50IF9fbD4KKyAgICB2b2lkCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjoKKyAgICBzZWVkKHVuc2lnbmVkIGxvbmcgX192YWx1ZSkKKyAgICB7CisgICAgICBfTV94WzBdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwKKwlfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgX193Pjo6X192YWx1ZT4oX192YWx1ZSk7CisKKyAgICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8IHN0YXRlX3NpemU7ICsrX19pKQorCXsKKwkgIF9VSW50VHlwZSBfX3ggPSBfTV94W19faSAtIDFdOworCSAgX194IF49IF9feCA+PiAoX193IC0gMik7CisJICBfX3ggKj0gMTgxMjQzMzI1M3VsOworCSAgX194ICs9IF9faTsKKwkgIF9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsCisJICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnRUeXBlLCBfX3c+OjpfX3ZhbHVlPihfX3gpOwkgIAorCX0KKyAgICAgIF9NX3AgPSBzdGF0ZV9zaXplOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywKKwkgICBfVUludFR5cGUgX19iLCBpbnQgX190LCBfVUludFR5cGUgX19jLCBpbnQgX19sPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgICAgX19iLCBfX3QsIF9fYywgX19sPjo6CisgICAgICBzZWVkKF9HZW4mIF9fZ2VuLCBmYWxzZV90eXBlKQorICAgICAgeworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IHN0YXRlX3NpemU7ICsrX19pKQorCSAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwKKwkgICAgX19kZXRhaWw6Ol9TaGlmdDxfVUludFR5cGUsIF9fdz46Ol9fdmFsdWU+KF9fZ2VuKCkpOworCV9NX3AgPSBzdGF0ZV9zaXplOworICAgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9VSW50VHlwZSwgaW50IF9fdywgaW50IF9fbiwgaW50IF9fbSwgaW50IF9fciwKKwkgICBfVUludFR5cGUgX19hLCBpbnQgX191LCBpbnQgX19zLAorCSAgIF9VSW50VHlwZSBfX2IsIGludCBfX3QsIF9VSW50VHlwZSBfX2MsIGludCBfX2w+CisgICAgdHlwZW5hbWUKKyAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwgX19yLCBfX2EsIF9fdSwgX19zLAorCQkgICAgIF9fYiwgX190LCBfX2MsIF9fbD46OnJlc3VsdF90eXBlCisgICAgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sIF9fciwgX19hLCBfX3UsIF9fcywKKwkJICAgICBfX2IsIF9fdCwgX19jLCBfX2w+OjoKKyAgICBvcGVyYXRvcigpKCkKKyAgICB7CisgICAgICAvLyBSZWxvYWQgdGhlIHZlY3RvciAtIGNvc3QgaXMgTyhuKSBhbW9ydGl6ZWQgb3ZlciBuIGNhbGxzLgorICAgICAgaWYgKF9NX3AgPj0gc3RhdGVfc2l6ZSkKKwl7CisJICBjb25zdCBfVUludFR5cGUgX191cHBlcl9tYXNrID0gKH5fVUludFR5cGUoKSkgPDwgX19yOworCSAgY29uc3QgX1VJbnRUeXBlIF9fbG93ZXJfbWFzayA9IH5fX3VwcGVyX21hc2s7CisKKwkgIGZvciAoaW50IF9fayA9IDA7IF9fayA8IChfX24gLSBfX20pOyArK19faykKKwkgICAgeworCSAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgICAgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICAgICAgX01feFtfX2tdID0gKF9NX3hbX19rICsgX19tXSBeIChfX3kgPj4gMSkKKwkJCSAgIF4gKChfX3kgJiAweDAxKSA/IF9fYSA6IDApKTsKKwkgICAgfQorCisJICBmb3IgKGludCBfX2sgPSAoX19uIC0gX19tKTsgX19rIDwgKF9fbiAtIDEpOyArK19faykKKwkgICAgeworCSAgICAgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19rXSAmIF9fdXBwZXJfbWFzaykKKwkJCSAgICAgICB8IChfTV94W19fayArIDFdICYgX19sb3dlcl9tYXNrKSk7CisJICAgICAgX01feFtfX2tdID0gKF9NX3hbX19rICsgKF9fbSAtIF9fbildIF4gKF9feSA+PiAxKQorCQkJICAgXiAoKF9feSAmIDB4MDEpID8gX19hIDogMCkpOworCSAgICB9CisKKwkgIF9VSW50VHlwZSBfX3kgPSAoKF9NX3hbX19uIC0gMV0gJiBfX3VwcGVyX21hc2spCisJCQkgICB8IChfTV94WzBdICYgX19sb3dlcl9tYXNrKSk7CisJICBfTV94W19fbiAtIDFdID0gKF9NX3hbX19tIC0gMV0gXiAoX195ID4+IDEpCisJCQkgICBeICgoX195ICYgMHgwMSkgPyBfX2EgOiAwKSk7CisJICBfTV9wID0gMDsKKwl9CisKKyAgICAgIC8vIENhbGN1bGF0ZSBvKHgoaSkpLgorICAgICAgcmVzdWx0X3R5cGUgX196ID0gX01feFtfTV9wKytdOworICAgICAgX196IF49IChfX3ogPj4gX191KTsKKyAgICAgIF9feiBePSAoX196IDw8IF9fcykgJiBfX2I7CisgICAgICBfX3ogXj0gKF9feiA8PCBfX3QpICYgX19jOworICAgICAgX196IF49IChfX3ogPj4gX19sKTsKKworICAgICAgcmV0dXJuIF9fejsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VJbnRUeXBlLCBpbnQgX193LCBpbnQgX19uLCBpbnQgX19tLCBpbnQgX19yLAorCSAgIF9VSW50VHlwZSBfX2EsIGludCBfX3UsIGludCBfX3MsIF9VSW50VHlwZSBfX2IsIGludCBfX3QsCisJICAgX1VJbnRUeXBlIF9fYywgaW50IF9fbCwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgbWVyc2VubmVfdHdpc3RlcjxfVUludFR5cGUsIF9fdywgX19uLCBfX20sCisJICAgICAgIF9fciwgX19hLCBfX3UsIF9fcywgX19iLCBfX3QsIF9fYywgX19sPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX24gLSAxOyArK19faSkKKwlfX29zIDw8IF9feC5fTV94W19faV0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX3hbX19uIC0gMV07CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVUludFR5cGUsIGludCBfX3csIGludCBfX24sIGludCBfX20sIGludCBfX3IsCisJICAgX1VJbnRUeXBlIF9fYSwgaW50IF9fdSwgaW50IF9fcywgX1VJbnRUeXBlIF9fYiwgaW50IF9fdCwKKwkgICBfVUludFR5cGUgX19jLCBpbnQgX19sLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBtZXJzZW5uZV90d2lzdGVyPF9VSW50VHlwZSwgX193LCBfX24sIF9fbSwKKwkgICAgICAgX19yLCBfX2EsIF9fdSwgX19zLCBfX2IsIF9fdCwgX19jLCBfX2w+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX247ICsrX19pKQorCV9faXMgPj4gX194Ll9NX3hbX19pXTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCBfSW50VHlwZSBfX20sIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgX0ludFR5cGUKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPjo6bW9kdWx1czsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+Ojpsb25nX2xhZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIHN1YnRyYWN0X3dpdGhfY2Fycnk8X0ludFR5cGUsIF9fbSwgX19zLCBfX3I+OjpzaG9ydF9sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIF9JbnRUeXBlIF9fbSwgaW50IF9fcywgaW50IF9fcj4KKyAgICB2b2lkCisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OgorICAgIHNlZWQodW5zaWduZWQgbG9uZyBfX3ZhbHVlKQorICAgIHsKKyAgICAgIGlmIChfX3ZhbHVlID09IDApCisJX192YWx1ZSA9IDE5NzgwNTAzOworCisgICAgICBzdGQ6OnRyMTo6bGluZWFyX2NvbmdydWVudGlhbDx1bnNpZ25lZCBsb25nLCA0MDAxNCwgMCwgMjE0NzQ4MzU2Mz4KKwlfX2xjZyhfX3ZhbHVlKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgbG9uZ19sYWc7ICsrX19pKQorCV9NX3hbX19pXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludFR5cGUsIDEsIDAsIG1vZHVsdXM+KF9fbGNnKCkpOworCisgICAgICBfTV9jYXJyeSA9IChfTV94W2xvbmdfbGFnIC0gMV0gPT0gMCkgPyAxIDogMDsKKyAgICAgIF9NX3AgPSAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPjo6CisgICAgICBzZWVkKF9HZW4mIF9fZ2VuLCBmYWxzZV90eXBlKQorICAgICAgeworCWNvbnN0IGludCBfX24gPSAoc3RkOjpudW1lcmljX2xpbWl0czxfVUludFR5cGU+OjpkaWdpdHMgKyAzMSkgLyAzMjsKKworCWZvciAoaW50IF9faSA9IDA7IF9faSA8IGxvbmdfbGFnOyArK19faSkKKwkgIHsKKwkgICAgX1VJbnRUeXBlIF9fdG1wID0gMDsKKwkgICAgX1VJbnRUeXBlIF9fZmFjdG9yID0gMTsKKwkgICAgZm9yIChpbnQgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwkgICAgICB7CisJCV9fdG1wICs9IF9fZGV0YWlsOjpfX21vZDxfX2RldGFpbDo6X1VJbnQzMlR5cGUsIDEsIDAsIDA+CisJCSAgICAgICAgIChfX2dlbigpKSAqIF9fZmFjdG9yOworCQlfX2ZhY3RvciAqPSBfX2RldGFpbDo6X1NoaWZ0PF9VSW50VHlwZSwgMzI+OjpfX3ZhbHVlOworCSAgICAgIH0KKwkgICAgX01feFtfX2ldID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50VHlwZSwgMSwgMCwgbW9kdWx1cz4oX190bXApOworCSAgfQorCV9NX2NhcnJ5ID0gKF9NX3hbbG9uZ19sYWcgLSAxXSA9PSAwKSA/IDEgOiAwOworCV9NX3AgPSAwOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCBfSW50VHlwZSBfX20sIGludCBfX3MsIGludCBfX3I+CisgICAgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OnJlc3VsdF90eXBlCisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeTxfSW50VHlwZSwgX19tLCBfX3MsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIC8vIERlcml2ZSBzaG9ydCBsYWcgaW5kZXggZnJvbSBjdXJyZW50IGluZGV4LgorICAgICAgaW50IF9fcHMgPSBfTV9wIC0gc2hvcnRfbGFnOworICAgICAgaWYgKF9fcHMgPCAwKQorCV9fcHMgKz0gbG9uZ19sYWc7CisKKyAgICAgIC8vIENhbGN1bGF0ZSBuZXcgeChpKSB3aXRob3V0IG92ZXJmbG93IG9yIGRpdmlzaW9uLgorICAgICAgLy8gTkI6IFRoYW5rcyB0byB0aGUgcmVxdWlyZW1lbnRzIGZvciBfSW50VHlwZSwgX01feFtfTV9wXSArIF9NX2NhcnJ5CisgICAgICAvLyBjYW5ub3Qgb3ZlcmZsb3cuCisgICAgICBfVUludFR5cGUgX194aTsKKyAgICAgIGlmIChfTV94W19fcHNdID49IF9NX3hbX01fcF0gKyBfTV9jYXJyeSkKKwl7CisJICBfX3hpID0gX01feFtfX3BzXSAtIF9NX3hbX01fcF0gLSBfTV9jYXJyeTsKKwkgIF9NX2NhcnJ5ID0gMDsKKwl9CisgICAgICBlbHNlCisJeworCSAgX194aSA9IG1vZHVsdXMgLSBfTV94W19NX3BdIC0gX01fY2FycnkgKyBfTV94W19fcHNdOworCSAgX01fY2FycnkgPSAxOworCX0KKyAgICAgIF9NX3hbX01fcF0gPSBfX3hpOworCisgICAgICAvLyBBZGp1c3QgY3VycmVudCBpbmRleCB0byBsb29wIGFyb3VuZCBpbiByaW5nIGJ1ZmZlci4KKyAgICAgIGlmICgrK19NX3AgPj0gbG9uZ19sYWcpCisJX01fcCA9IDA7CisKKyAgICAgIHJldHVybiBfX3hpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCV9fb3MgPDwgX194Ll9NX3hbX19pXSA8PCBfX3NwYWNlOworICAgICAgX19vcyA8PCBfX3guX01fY2Fycnk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgX0ludFR5cGUgX19tLCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5PF9JbnRUeXBlLCBfX20sIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgZm9yIChpbnQgX19pID0gMDsgX19pIDwgX19yOyArK19faSkKKwlfX2lzID4+IF9feC5fTV94W19faV07CisgICAgICBfX2lzID4+IF9feC5fTV9jYXJyeTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgaW50IF9fdywgaW50IF9fcywgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OndvcmRfc2l6ZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgaW50CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+Ojpsb25nX2xhZzsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgY29uc3QgaW50CisgICAgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+OjpzaG9ydF9sYWc7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIHZvaWQKKyAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgIF9NX2luaXRpYWxpemVfbnBvd3MoKQorICAgIHsKKyAgICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbjsgKytfX2opCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorCV9NX25wb3dzW19fal0gPSBzdGQ6OnRyMTo6bGRleHAoX1JlYWxUeXBlKDEpLCAtX193ICsgX19qICogMzIpOworI2Vsc2UKKyAgICAgICAgX01fbnBvd3NbX19qXSA9IHN0ZDo6cG93KF9SZWFsVHlwZSgyKSwgLV9fdyArIF9faiAqIDMyKTsKKyNlbmRpZgorICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgdm9pZAorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6CisgICAgc2VlZCh1bnNpZ25lZCBsb25nIF9fdmFsdWUpCisgICAgeworICAgICAgaWYgKF9fdmFsdWUgPT0gMCkKKwlfX3ZhbHVlID0gMTk3ODA1MDM7CisKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDUxMi4gU2VlZGluZyBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxIGZyb20gYSBzaW5nbGUgdW5zaWduZWQgbG9uZy4KKyAgICAgIHN0ZDo6dHIxOjpsaW5lYXJfY29uZ3J1ZW50aWFsPHVuc2lnbmVkIGxvbmcsIDQwMDE0LCAwLCAyMTQ3NDgzNTYzPgorCV9fbGNnKF9fdmFsdWUpOworCisgICAgICB0aGlzLT5zZWVkKF9fbGNnKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yPgorICAgIHRlbXBsYXRlPGNsYXNzIF9HZW4+CisgICAgICB2b2lkCisgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj46OgorICAgICAgc2VlZChfR2VuJiBfX2dlbiwgZmFsc2VfdHlwZSkKKyAgICAgIHsKKwlmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBsb25nX2xhZzsgKytfX2kpCisJICB7CisJICAgIGZvciAoaW50IF9faiA9IDA7IF9faiA8IF9fbiAtIDE7ICsrX19qKQorCSAgICAgIF9NX3hbX19pXVtfX2pdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50MzJUeXBlLCAxLCAwLCAwPihfX2dlbigpKTsKKwkgICAgX01feFtfX2ldW19fbiAtIDFdID0gX19kZXRhaWw6Ol9fbW9kPF9VSW50MzJUeXBlLCAxLCAwLAorCSAgICAgIF9fZGV0YWlsOjpfU2hpZnQ8X1VJbnQzMlR5cGUsIF9fdyAlIDMyPjo6X192YWx1ZT4oX19nZW4oKSk7CisJICB9CisKKwlfTV9jYXJyeSA9IDE7CisJZm9yIChpbnQgX19qID0gMDsgX19qIDwgX19uOyArK19faikKKwkgIGlmIChfTV94W2xvbmdfbGFnIC0gMV1bX19qXSAhPSAwKQorCSAgICB7CisJICAgICAgX01fY2FycnkgPSAwOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwlfTV9wID0gMDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3I+CisgICAgdHlwZW5hbWUgc3VidHJhY3Rfd2l0aF9jYXJyeV8wMTxfUmVhbFR5cGUsIF9fdywgX19zLCBfX3I+OjpyZXN1bHRfdHlwZQorICAgIHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPjo6CisgICAgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgLy8gRGVyaXZlIHNob3J0IGxhZyBpbmRleCBmcm9tIGN1cnJlbnQgaW5kZXguCisgICAgICBpbnQgX19wcyA9IF9NX3AgLSBzaG9ydF9sYWc7CisgICAgICBpZiAoX19wcyA8IDApCisJX19wcyArPSBsb25nX2xhZzsKKworICAgICAgX1VJbnQzMlR5cGUgX19uZXdfY2Fycnk7CisgICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX24gLSAxOyArK19faikKKwl7CisJICBpZiAoX01feFtfX3BzXVtfX2pdID4gX01feFtfTV9wXVtfX2pdCisJICAgICAgfHwgKF9NX3hbX19wc11bX19qXSA9PSBfTV94W19NX3BdW19fal0gJiYgX01fY2FycnkgPT0gMCkpCisJICAgIF9fbmV3X2NhcnJ5ID0gMDsKKwkgIGVsc2UKKwkgICAgX19uZXdfY2FycnkgPSAxOworCisJICBfTV94W19NX3BdW19fal0gPSBfTV94W19fcHNdW19fal0gLSBfTV94W19NX3BdW19fal0gLSBfTV9jYXJyeTsKKwkgIF9NX2NhcnJ5ID0gX19uZXdfY2Fycnk7CisJfQorCisgICAgICBpZiAoX01feFtfX3BzXVtfX24gLSAxXSA+IF9NX3hbX01fcF1bX19uIC0gMV0KKwkgIHx8IChfTV94W19fcHNdW19fbiAtIDFdID09IF9NX3hbX01fcF1bX19uIC0gMV0gJiYgX01fY2FycnkgPT0gMCkpCisJX19uZXdfY2FycnkgPSAwOworICAgICAgZWxzZQorCV9fbmV3X2NhcnJ5ID0gMTsKKyAgICAgIAorICAgICAgX01feFtfTV9wXVtfX24gLSAxXSA9IF9fZGV0YWlsOjpfX21vZDxfVUludDMyVHlwZSwgMSwgMCwKKwlfX2RldGFpbDo6X1NoaWZ0PF9VSW50MzJUeXBlLCBfX3cgJSAzMj46Ol9fdmFsdWU+CisJKF9NX3hbX19wc11bX19uIC0gMV0gLSBfTV94W19NX3BdW19fbiAtIDFdIC0gX01fY2FycnkpOworICAgICAgX01fY2FycnkgPSBfX25ld19jYXJyeTsKKworICAgICAgcmVzdWx0X3R5cGUgX19yZXQgPSAwLjA7CisgICAgICBmb3IgKGludCBfX2ogPSAwOyBfX2ogPCBfX247ICsrX19qKQorCV9fcmV0ICs9IF9NX3hbX01fcF1bX19qXSAqIF9NX25wb3dzW19fal07CisKKyAgICAgIC8vIEFkanVzdCBjdXJyZW50IGluZGV4IHRvIGxvb3AgYXJvdW5kIGluIHJpbmcgYnVmZmVyLgorICAgICAgaWYgKCsrX01fcCA+PSBsb25nX2xhZykKKwlfTV9wID0gMDsKKworICAgICAgcmV0dXJuIF9fcmV0OworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIGludCBfX3csIGludCBfX3MsIGludCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHN1YnRyYWN0X3dpdGhfY2FycnlfMDE8X1JlYWxUeXBlLCBfX3csIF9fcywgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZCB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworCisgICAgICBmb3IgKGludCBfX2kgPSAwOyBfX2kgPCBfX3I7ICsrX19pKQorCWZvciAoaW50IF9faiA9IDA7IF9faiA8IF9feC5fX247ICsrX19qKQorCSAgX19vcyA8PCBfX3guX01feFtfX2ldW19fal0gPDwgX19zcGFjZTsKKyAgICAgIF9fb3MgPDwgX194Ll9NX2NhcnJ5OworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlLCBpbnQgX193LCBpbnQgX19zLCBpbnQgX19yLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBzdWJ0cmFjdF93aXRoX2NhcnJ5XzAxPF9SZWFsVHlwZSwgX193LCBfX3MsIF9fcj4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIGZvciAoaW50IF9faSA9IDA7IF9faSA8IF9fcjsgKytfX2kpCisJZm9yIChpbnQgX19qID0gMDsgX19qIDwgX194Ll9fbjsgKytfX2opCisJICBfX2lzID4+IF9feC5fTV94W19faV1bX19qXTsKKyAgICAgIF9faXMgPj4gX194Ll9NX2NhcnJ5OworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBpbnQgX19wLCBpbnQgX19yPgorICAgIGNvbnN0IGludAorICAgIGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIF9fcCwgX19yPjo6YmxvY2tfc2l6ZTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwgaW50IF9fcCwgaW50IF9fcj4KKyAgICBjb25zdCBpbnQKKyAgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfX3AsIF9fcj46OnVzZWRfYmxvY2s7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3I+CisgICAgdHlwZW5hbWUgZGlzY2FyZF9ibG9jazxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciwKKwkJCSAgIF9fcCwgX19yPjo6cmVzdWx0X3R5cGUKKyAgICBkaXNjYXJkX2Jsb2NrPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yLCBfX3AsIF9fcj46OgorICAgIG9wZXJhdG9yKCkoKQorICAgIHsKKyAgICAgIGlmIChfTV9uID49IHVzZWRfYmxvY2spCisJeworCSAgd2hpbGUgKF9NX24gPCBibG9ja19zaXplKQorCSAgICB7CisJICAgICAgX01fYigpOworCSAgICAgICsrX01fbjsKKwkgICAgfQorCSAgX01fbiA9IDA7CisJfQorICAgICAgKytfTV9uOworICAgICAgcmV0dXJuIF9NX2IoKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsCisJICAgICAgIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpkZWMgfCBfX2lvc19iYXNlOjpmaXhlZAorCQkgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3guX01fYiA8PCBfX3NwYWNlIDw8IF9feC5fTV9uOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIGludCBfX3AsIGludCBfX3IsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIGRpc2NhcmRfYmxvY2s8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IsIF9fcCwgX19yPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fYiA+PiBfX3guX01fbjsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMj4KKyAgICBjb25zdCBpbnQKKyAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj46OnNoaWZ0MTsKKyAgICAgCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMj4KKyAgICBjb25zdCBpbnQKKyAgICB4b3JfY29tYmluZTxfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIF9fczEsCisJCV9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgX19zMj46OnNoaWZ0MjsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczI+CisgICAgdm9pZAorICAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPjo6CisgICAgX01faW5pdGlhbGl6ZV9tYXgoKQorICAgIHsKKyAgICAgIGNvbnN0IGludCBfX3cgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHJlc3VsdF90eXBlPjo6ZGlnaXRzOworCisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX20xID0KKwlzdGQ6Om1pbihyZXN1bHRfdHlwZShfTV9iMS5tYXgoKSAtIF9NX2IxLm1pbigpKSwKKwkJIF9fZGV0YWlsOjpfU2hpZnQ8cmVzdWx0X3R5cGUsIF9fdyAtIF9fczE+OjpfX3ZhbHVlIC0gMSk7CisKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fbTIgPQorCXN0ZDo6bWluKHJlc3VsdF90eXBlKF9NX2IyLm1heCgpIC0gX01fYjIubWluKCkpLAorCQkgX19kZXRhaWw6Ol9TaGlmdDxyZXN1bHRfdHlwZSwgX193IC0gX19zMj46Ol9fdmFsdWUgLSAxKTsKKworICAgICAgLy8gTkI6IEluIFRSMSBzMSBpcyBub3QgcmVxdWlyZWQgdG8gYmUgPj0gczIuCisgICAgICBpZiAoX19zMSA8IF9fczIpCisJX01fbWF4ID0gX01faW5pdGlhbGl6ZV9tYXhfYXV4KF9fbTIsIF9fbTEsIF9fczIgLSBfX3MxKSA8PCBfX3MxOworICAgICAgZWxzZQorCV9NX21heCA9IF9NX2luaXRpYWxpemVfbWF4X2F1eChfX20xLCBfX20yLCBfX3MxIC0gX19zMikgPDwgX19zMjsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBpbnQgX19zMSwKKwkgICBjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIGludCBfX3MyPgorICAgIHR5cGVuYW1lIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkJCSBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIF9fczI+OjpyZXN1bHRfdHlwZQorICAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkJX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPjo6CisgICAgX01faW5pdGlhbGl6ZV9tYXhfYXV4KHJlc3VsdF90eXBlIF9fYSwgcmVzdWx0X3R5cGUgX19iLCBpbnQgX19kKQorICAgIHsKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fdHdvMmQgPSByZXN1bHRfdHlwZSgxKSA8PCBfX2Q7CisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX2MgPSBfX2EgKiBfX3R3bzJkOworCisgICAgICBpZiAoX19hID09IDAgfHwgX19iIDwgX190d28yZCkKKwlyZXR1cm4gX19jICsgX19iOworCisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3QgPSBzdGQ6Om1heChfX2MsIF9fYik7CisgICAgICBjb25zdCByZXN1bHRfdHlwZSBfX3UgPSBzdGQ6Om1pbihfX2MsIF9fYik7CisKKyAgICAgIHJlc3VsdF90eXBlIF9fdWIgPSBfX3U7CisgICAgICByZXN1bHRfdHlwZSBfX3A7CisgICAgICBmb3IgKF9fcCA9IDA7IF9fdWIgIT0gMTsgX191YiA+Pj0gMSkKKwkrK19fcDsKKworICAgICAgY29uc3QgcmVzdWx0X3R5cGUgX190d28ycCA9IHJlc3VsdF90eXBlKDEpIDw8IF9fcDsKKyAgICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fayA9IF9fdCAvIF9fdHdvMnA7CisKKyAgICAgIGlmIChfX2sgJiAxKQorCXJldHVybiAoX19rICsgMSkgKiBfX3R3bzJwIC0gMTsKKworICAgICAgaWYgKF9fYyA+PSBfX2IpCisJcmV0dXJuIChfX2sgKyAxKSAqIF9fdHdvMnAgKyBfTV9pbml0aWFsaXplX21heF9hdXgoKF9fdCAlIF9fdHdvMnApCisJCQkJCQkJICAgLyBfX3R3bzJkLAorCQkJCQkJCSAgIF9fdSAlIF9fdHdvMnAsIF9fZCk7CisgICAgICBlbHNlCisJcmV0dXJuIChfX2sgKyAxKSAqIF9fdHdvMnAgKyBfTV9pbml0aWFsaXplX21heF9hdXgoKF9fdSAlIF9fdHdvMnApCisJCQkJCQkJICAgLyBfX3R3bzJkLAorCQkJCQkJCSAgIF9fdCAlIF9fdHdvMnAsIF9fZCk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgaW50IF9fczEsCisJICAgY2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBpbnQgX19zMiwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgeG9yX2NvbWJpbmU8X1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IxLCBfX3MxLAorCSAgICAgICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjIsIF9fczI+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OmZpeGVkIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisKKyAgICAgIF9fb3MgPDwgX194LmJhc2UxKCkgPDwgX19zcGFjZSA8PCBfX3guYmFzZTIoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgcmV0dXJuIF9fb3M7IAorICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjEsIGludCBfX3MxLAorCSAgIGNsYXNzIF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMiwgaW50IF9fczIsCisJICAgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHhvcl9jb21iaW5lPF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yMSwgX19zMSwKKwkgICAgICAgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3IyLCBfX3MyPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fYjEgPj4gX194Ll9NX2IyOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGU+CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSB1bmlmb3JtX2ludDxfSW50VHlwZT46OnJlc3VsdF90eXBlCisgICAgICB1bmlmb3JtX2ludDxfSW50VHlwZT46OgorICAgICAgX01fY2FsbChfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLAorCSAgICAgIHJlc3VsdF90eXBlIF9fbWluLCByZXN1bHRfdHlwZSBfX21heCwgdHJ1ZV90eXBlKQorICAgICAgeworCS8vIFhYWCBNdXN0IGJlIGZpeGVkIHRvIHdvcmsgd2VsbCBmb3IgKmFyYml0cmFyeSogX191cm5nLm1heCgpLAorCS8vIF9fdXJuZy5taW4oKSwgX19tYXgsIF9fbWluLiAgQ3VycmVudGx5IHdvcmtzIGZpbmUgb25seSBpbiB0aGUKKwkvLyBtb3N0IGNvbW1vbiBjYXNlIF9fdXJuZy5tYXgoKSAtIF9fdXJuZy5taW4oKSA+PSBfX21heCAtIF9fbWluLAorCS8vIHdpdGggX191cm5nLm1heCgpID4gX191cm5nLm1pbigpID49IDAuCisJdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fYWRkX3Vuc2lnbmVkPHR5cGVuYW1lCisJICBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcjo6cmVzdWx0X3R5cGU+OjpfX3R5cGUgX191cm50eXBlOworCXR5cGVkZWYgdHlwZW5hbWUgX19nbnVfY3h4OjpfX2FkZF91bnNpZ25lZDxyZXN1bHRfdHlwZT46Ol9fdHlwZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdXR5cGU7CisJdHlwZWRlZiB0eXBlbmFtZSBfX2dudV9jeHg6Ol9fY29uZGl0aW9uYWxfdHlwZTwoc2l6ZW9mKF9fdXJudHlwZSkKKwkJCQkJCQk+IHNpemVvZihfX3V0eXBlKSksCisJICBfX3VybnR5cGUsIF9fdXR5cGU+OjpfX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgX191Y3R5cGU7CisKKwlyZXN1bHRfdHlwZSBfX3JldDsKKworCWNvbnN0IF9fdXJudHlwZSBfX3Vybm1pbiA9IF9fdXJuZy5taW4oKTsKKwljb25zdCBfX3VybnR5cGUgX191cm5tYXggPSBfX3VybmcubWF4KCk7CisJY29uc3QgX191cm50eXBlIF9fdXJucmFuZ2UgPSBfX3Vybm1heCAtIF9fdXJubWluOworCWNvbnN0IF9fdWN0eXBlIF9fdXJhbmdlID0gX19tYXggLSBfX21pbjsKKwljb25zdCBfX3VjdHlwZSBfX3VkZW5vbSA9IChfX3VybnJhbmdlIDw9IF9fdXJhbmdlCisJCQkJICAgPyAxIDogX191cm5yYW5nZSAvIChfX3VyYW5nZSArIDEpKTsKKwlkbworCSAgX19yZXQgPSAoX191cm50eXBlKF9fdXJuZygpKSAtICBfX3Vybm1pbikgLyBfX3VkZW5vbTsKKwl3aGlsZSAoX19yZXQgPiBfX21heCAtIF9fbWluKTsKKworCXJldHVybiBfX3JldCArIF9fbWluOworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgdW5pZm9ybV9pbnQ8X0ludFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKworICAgICAgX19vcyA8PCBfX3gubWluKCkgPDwgX19zcGFjZSA8PCBfX3gubWF4KCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHVuaWZvcm1faW50PF9JbnRUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9faXN0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2lzdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9faXMuZmxhZ3MoKTsKKyAgICAgIF9faXMuZmxhZ3MoX19pb3NfYmFzZTo6ZGVjIHwgX19pb3NfYmFzZTo6c2tpcHdzKTsKKworICAgICAgX19pcyA+PiBfX3guX01fbWluID4+IF9feC5fTV9tYXg7CisKKyAgICAgIF9faXMuZmxhZ3MoX19mbGFncyk7CisgICAgICByZXR1cm4gX19pczsKKyAgICB9CisKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiZXJub3VsbGlfZGlzdHJpYnV0aW9uJiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8ZG91YmxlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5wKCk7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBnZW9tZXRyaWNfZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJLy8gQWJvdXQgdGhlIGVwc2lsb24gdGhpbmcgc2VlIHRoaXMgdGhyZWFkOgorICAgICAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwNi0xMC9tc2cwMDk3MS5odG1sCisJY29uc3QgX1JlYWxUeXBlIF9fbmFmID0KKwkgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjplcHNpbG9uKCkpIC8gMjsKKwkvLyBUaGUgbGFyZ2VzdCBfUmVhbFR5cGUgY29udmVydGlibGUgdG8gX0ludFR5cGUuCisJY29uc3QgX1JlYWxUeXBlIF9fdGhyID0KKwkgIHN0ZDo6bnVtZXJpY19saW1pdHM8X0ludFR5cGU+OjptYXgoKSArIF9fbmFmOworCisJX1JlYWxUeXBlIF9fY2FuZDsKKwlkbworCSAgX19jYW5kID0gc3RkOjpjZWlsKHN0ZDo6bG9nKF9fdXJuZygpKSAvIF9NX2xvZ19wKTsKKwl3aGlsZSAoX19jYW5kID49IF9fdGhyKTsKKworCXJldHVybiByZXN1bHRfdHlwZShfX2NhbmQgKyBfX25hZik7CisgICAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3QgZ2VvbWV0cmljX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX29zLndpZGVuKCcgJykpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gucCgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKyAgICAgIGlmIChfTV9tZWFuID49IDEyKQorCXsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX20gPSBzdGQ6OmZsb29yKF9NX21lYW4pOworCSAgX01fbG1fdGhyID0gc3RkOjpsb2coX01fbWVhbik7CisJICBfTV9sZm0gPSBzdGQ6OnRyMTo6bGdhbW1hKF9fbSArIDEpOworCSAgX01fc20gPSBzdGQ6OnNxcnQoX19tKTsKKworCSAgY29uc3QgX1JlYWxUeXBlIF9fcGlfNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0w7CisJICBjb25zdCBfUmVhbFR5cGUgX19keCA9IHN0ZDo6c3FydCgyICogX19tICogc3RkOjpsb2coMzIgKiBfX20KKwkJCQkJCQkgICAgICAvIF9fcGlfNCkpOworCSAgX01fZCA9IHN0ZDo6dHIxOjpyb3VuZChzdGQ6Om1heChfUmVhbFR5cGUoNiksCisJCQkJCSAgc3RkOjptaW4oX19tLCBfX2R4KSkpOworCSAgY29uc3QgX1JlYWxUeXBlIF9fY3ggPSAyICogX19tICsgX01fZDsKKwkgIF9NX3NjeCA9IHN0ZDo6c3FydChfX2N4IC8gMik7CisJICBfTV8xY3ggPSAxIC8gX19jeDsKKworCSAgX01fYzJiID0gc3RkOjpzcXJ0KF9fcGlfNCAqIF9fY3gpICogc3RkOjpleHAoX01fMWN4KTsKKwkgIF9NX2NiID0gMiAqIF9fY3ggKiBzdGQ6OmV4cCgtX01fZCAqIF9NXzFjeCAqICgxICsgX01fZCAvIDIpKSAvIF9NX2Q7CisJfQorICAgICAgZWxzZQorI2VuZGlmCisJX01fbG1fdGhyID0gc3RkOjpleHAoLV9NX21lYW4pOworICAgICAgfQorCisgIC8qKgorICAgKiBBIHJlamVjdGlvbiBhbGdvcml0aG0gd2hlbiBtZWFuID49IDEyIGFuZCBhIHNpbXBsZSBtZXRob2QgYmFzZWQKKyAgICogdXBvbiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdW5pZm9ybSByYW5kb20gdmFyaWF0ZXMgb3RoZXJ3aXNlLgorICAgKiBOQjogVGhlIGZvcm1lciBpcyBhdmFpbGFibGUgb25seSBpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAqIGlzIGRlZmluZWQuCisgICAqCisgICAqIFJlZmVyZW5jZToKKyAgICogRGV2cm95ZSwgTC4gTm9uLVVuaWZvcm0gUmFuZG9tIFZhcmlhdGVzIEdlbmVyYXRpb24uIFNwcmluZ2VyLVZlcmxhZywKKyAgICogTmV3IFlvcmssIDE5ODYsIENoLiBYLCBTZWN0cy4gMy4zICYgMy40ICgrIEVycmF0YSEpLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIHBvaXNzb25fZGlzdHJpYnV0aW9uPF9JbnRUeXBlLCBfUmVhbFR5cGU+OjpyZXN1bHRfdHlwZQorICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworI2lmIF9HTElCQ1hYX1VTRV9DOTlfTUFUSF9UUjEKKwlpZiAoX01fbWVhbiA+PSAxMikKKwkgIHsKKwkgICAgX1JlYWxUeXBlIF9feDsKKworCSAgICAvLyBTZWUgY29tbWVudHMgYWJvdmUuLi4KKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fbmFmID0KKwkgICAgICAoMSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8X1JlYWxUeXBlPjo6ZXBzaWxvbigpKSAvIDI7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3RociA9CisJICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxfSW50VHlwZT46Om1heCgpICsgX19uYWY7CisKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fbSA9IHN0ZDo6Zmxvb3IoX01fbWVhbik7CisJICAgIC8vIHNxcnQocGkgLyAyKQorCSAgICBjb25zdCBfUmVhbFR5cGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2MxID0gX01fc20gKiBfX3NwaV8yOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jMiA9IF9NX2MyYiArIF9fYzE7IAorCSAgICBjb25zdCBfUmVhbFR5cGUgX19jMyA9IF9fYzIgKyAxOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jNCA9IF9fYzMgKyAxOworCSAgICAvLyBlXigxIC8gNzgpCisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2UxNzggPSAxLjAxMjkwMzA0NzkzMjAwMTg1ODMxODU1MTQ3Nzc1MTI5ODNMOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19jNSA9IF9fYzQgKyBfX2UxNzg7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfX2MgPSBfTV9jYiArIF9fYzU7CisJICAgIGNvbnN0IF9SZWFsVHlwZSBfXzJjeCA9IDIgKiAoMiAqIF9fbSArIF9NX2QpOworCisJICAgIGJvb2wgX19yZWplY3QgPSB0cnVlOworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgX1JlYWxUeXBlIF9fdSA9IF9fYyAqIF9fdXJuZygpOworCQljb25zdCBfUmVhbFR5cGUgX19lID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKworCQlfUmVhbFR5cGUgX193ID0gMC4wOworCQkKKwkJaWYgKF9fdSA8PSBfX2MxKQorCQkgIHsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX24gPSBfTV9uZChfX3VybmcpOworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9feSA9IC1zdGQ6OmFicyhfX24pICogX01fc20gLSAxOworCQkgICAgX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkgICAgX193ID0gLV9fbiAqIF9fbiAvIDI7CisJCSAgICBpZiAoX194IDwgLV9fbSkKKwkJICAgICAgY29udGludWU7CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19jMikKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSAxICsgc3RkOjphYnMoX19uKSAqIF9NX3NjeDsKKwkJICAgIF9feCA9IHN0ZDo6Y2VpbChfX3kpOworCQkgICAgX193ID0gX195ICogKDIgLSBfX3kpICogX01fMWN4OworCQkgICAgaWYgKF9feCA+IF9NX2QpCisJCSAgICAgIGNvbnRpbnVlOworCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYzMpCisJCSAgLy8gTkI6IFRoaXMgY2FzZSBub3QgaW4gdGhlIGJvb2ssIG5vciBpbiB0aGUgRXJyYXRhLAorCQkgIC8vIGJ1dCBzaG91bGQgYmUgb2suLi4KKwkJICBfX3ggPSAtMTsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzQpCisJCSAgX194ID0gMDsKKwkJZWxzZSBpZiAoX191IDw9IF9fYzUpCisJCSAgX194ID0gMTsKKwkJZWxzZQorCQkgIHsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3YgPSAtc3RkOjpsb2coX191cm5nKCkpOworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9feSA9IF9NX2QgKyBfX3YgKiBfXzJjeCAvIF9NX2Q7CisJCSAgICBfX3ggPSBzdGQ6OmNlaWwoX195KTsKKwkJICAgIF9fdyA9IC1fTV9kICogX01fMWN4ICogKDEgKyBfX3kgLyAyKTsKKwkJICB9CisKKwkJX19yZWplY3QgPSAoX193IC0gX19lIC0gX194ICogX01fbG1fdGhyCisJCQkgICAgPiBfTV9sZm0gLSBzdGQ6OnRyMTo6bGdhbW1hKF9feCArIF9fbSArIDEpKTsKKworCQlfX3JlamVjdCB8PSBfX3ggKyBfX20gPj0gX190aHI7CisKKwkgICAgICB9IHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgcmV0dXJuIHJlc3VsdF90eXBlKF9feCArIF9fbSArIF9fbmFmKTsKKwkgIH0KKwllbHNlCisjZW5kaWYKKwkgIHsKKwkgICAgX0ludFR5cGUgICAgIF9feCA9IDA7CisJICAgIF9SZWFsVHlwZSBfX3Byb2QgPSAxLjA7CisKKwkgICAgZG8KKwkgICAgICB7CisJCV9fcHJvZCAqPSBfX3VybmcoKTsKKwkJX194ICs9IDE7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19wcm9kID4gX01fbG1fdGhyKTsKKworCSAgICByZXR1cm4gX194IC0gMTsKKwkgIH0KKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBwb2lzc29uX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3gubWVhbigpIDw8IF9fc3BhY2UgPDwgX194Ll9NX25kOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0ludFR5cGUsIHR5cGVuYW1lIF9SZWFsVHlwZSwKKwkgICB0eXBlbmFtZSBfQ2hhclQsIHR5cGVuYW1lIF9UcmFpdHM+CisgICAgc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mCisgICAgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYgX19pcywKKwkgICAgICAgcG9pc3Nvbl9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX21lYW4gPj4gX194Ll9NX25kOworICAgICAgX194Ll9NX2luaXRpYWxpemUoKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdm9pZAorICAgIGJpbm9taWFsX2Rpc3RyaWJ1dGlvbjxfSW50VHlwZSwgX1JlYWxUeXBlPjo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgY29uc3QgX1JlYWxUeXBlIF9fcDEyID0gX01fcCA8PSAwLjUgPyBfTV9wIDogMS4wIC0gX01fcDsKKworICAgICAgX01fZWFzeSA9IHRydWU7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICBpZiAoX01fdCAqIF9fcDEyID49IDgpCisJeworCSAgX01fZWFzeSA9IGZhbHNlOworCSAgY29uc3QgX1JlYWxUeXBlIF9fbnAgPSBzdGQ6OmZsb29yKF9NX3QgKiBfX3AxMik7CisJICBjb25zdCBfUmVhbFR5cGUgX19wYSA9IF9fbnAgLyBfTV90OworCSAgY29uc3QgX1JlYWxUeXBlIF9fMXAgPSAxIC0gX19wYTsKKwkgIAorCSAgY29uc3QgX1JlYWxUeXBlIF9fcGlfNCA9IDAuNzg1Mzk4MTYzMzk3NDQ4MzA5NjE1NjYwODQ1ODE5ODc1N0w7CisJICBjb25zdCBfUmVhbFR5cGUgX19kMXggPQorCSAgICBzdGQ6OnNxcnQoX19ucCAqIF9fMXAgKiBzdGQ6OmxvZygzMiAqIF9fbnAKKwkJCQkJICAgICAvICg4MSAqIF9fcGlfNCAqIF9fMXApKSk7CisJICBfTV9kMSA9IHN0ZDo6dHIxOjpyb3VuZChzdGQ6Om1heChfUmVhbFR5cGUoMSksIF9fZDF4KSk7CisJICBjb25zdCBfUmVhbFR5cGUgX19kMnggPQorCSAgICBzdGQ6OnNxcnQoX19ucCAqIF9fMXAgKiBzdGQ6OmxvZygzMiAqIF9NX3QgKiBfXzFwCisJCQkJCSAgICAgLyAoX19waV80ICogX19wYSkpKTsKKwkgIF9NX2QyID0gc3RkOjp0cjE6OnJvdW5kKHN0ZDo6bWF4KF9SZWFsVHlwZSgxKSwgX19kMngpKTsKKwkgIAorCSAgLy8gc3FydChwaSAvIDIpCisJICBjb25zdCBfUmVhbFR5cGUgX19zcGlfMiA9IDEuMjUzMzE0MTM3MzE1NTAwMjUxMjA3ODgyNjQyNDA1NTIyNkw7CisJICBfTV9zMSA9IHN0ZDo6c3FydChfX25wICogX18xcCkgKiAoMSArIF9NX2QxIC8gKDQgKiBfX25wKSk7CisJICBfTV9zMiA9IHN0ZDo6c3FydChfX25wICogX18xcCkgKiAoMSArIF9NX2QyIC8gKDQgKiBfTV90ICogX18xcCkpOworCSAgX01fYyA9IDIgKiBfTV9kMSAvIF9fbnA7CisJICBfTV9hMSA9IHN0ZDo6ZXhwKF9NX2MpICogX01fczEgKiBfX3NwaV8yOworCSAgY29uc3QgX1JlYWxUeXBlIF9fYTEyID0gX01fYTEgKyBfTV9zMiAqIF9fc3BpXzI7CisJICBjb25zdCBfUmVhbFR5cGUgX19zMXMgPSBfTV9zMSAqIF9NX3MxOworCSAgX01fYTEyMyA9IF9fYTEyICsgKHN0ZDo6ZXhwKF9NX2QxIC8gKF9NX3QgKiBfXzFwKSkKKwkJCSAgICAgKiAyICogX19zMXMgLyBfTV9kMQorCQkJICAgICAqIHN0ZDo6ZXhwKC1fTV9kMSAqIF9NX2QxIC8gKDIgKiBfX3MxcykpKTsKKwkgIGNvbnN0IF9SZWFsVHlwZSBfX3MycyA9IF9NX3MyICogX01fczI7CisJICBfTV9zID0gKF9NX2ExMjMgKyAyICogX19zMnMgLyBfTV9kMgorCQkgICogc3RkOjpleHAoLV9NX2QyICogX01fZDIgLyAoMiAqIF9fczJzKSkpOworCSAgX01fbGYgPSAoc3RkOjp0cjE6OmxnYW1tYShfX25wICsgMSkKKwkJICAgKyBzdGQ6OnRyMTo6bGdhbW1hKF9NX3QgLSBfX25wICsgMSkpOworCSAgX01fbHAxcCA9IHN0ZDo6bG9nKF9fcGEgLyBfXzFwKTsKKworCSAgX01fcSA9IC1zdGQ6OmxvZygxIC0gKF9fcDEyIC0gX19wYSkgLyBfXzFwKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYKKwlfTV9xID0gLXN0ZDo6bG9nKDEgLSBfX3AxMik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgX01fd2FpdGluZyhfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nLCBfSW50VHlwZSBfX3QpCisgICAgICB7CisJX0ludFR5cGUgICAgX194ID0gMDsKKwlfUmVhbFR5cGUgX19zdW0gPSAwOworCisJZG8KKwkgIHsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fZSA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CisJICAgIF9fc3VtICs9IF9fZSAvIChfX3QgLSBfX3gpOworCSAgICBfX3ggKz0gMTsKKwkgIH0KKwl3aGlsZSAoX19zdW0gPD0gX01fcSk7CisKKwlyZXR1cm4gX194IC0gMTsKKyAgICAgIH0KKworICAvKioKKyAgICogQSByZWplY3Rpb24gYWxnb3JpdGhtIHdoZW4gdCAqIHAgPj0gOCBhbmQgYSBzaW1wbGUgd2FpdGluZyB0aW1lCisgICAqIG1ldGhvZCAtIHRoZSBzZWNvbmQgaW4gdGhlIHJlZmVyZW5jZWQgYm9vayAtIG90aGVyd2lzZS4KKyAgICogTkI6IFRoZSBmb3JtZXIgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgKiBpcyBkZWZpbmVkLgorICAgKgorICAgKiBSZWZlcmVuY2U6CisgICAqIERldnJveWUsIEwuIE5vbi1Vbmlmb3JtIFJhbmRvbSBWYXJpYXRlcyBHZW5lcmF0aW9uLiBTcHJpbmdlci1WZXJsYWcsCisgICAqIE5ldyBZb3JrLCAxOTg2LCBDaC4gWCwgU2VjdC4gNCAoKyBFcnJhdGEhKS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnRUeXBlLCB0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OnJlc3VsdF90eXBlCisgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT46OgorICAgICAgb3BlcmF0b3IoKShfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvciYgX191cm5nKQorICAgICAgeworCXJlc3VsdF90eXBlIF9fcmV0OworCWNvbnN0IF9SZWFsVHlwZSBfX3AxMiA9IF9NX3AgPD0gMC41ID8gX01fcCA6IDEuMCAtIF9NX3A7CisKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisJaWYgKCFfTV9lYXN5KQorCSAgeworCSAgICBfUmVhbFR5cGUgX194OworCisJICAgIC8vIFNlZSBjb21tZW50cyBhYm92ZS4uLgorCSAgICBjb25zdCBfUmVhbFR5cGUgX19uYWYgPQorCSAgICAgICgxIC0gc3RkOjpudW1lcmljX2xpbWl0czxfUmVhbFR5cGU+OjplcHNpbG9uKCkpIC8gMjsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fdGhyID0KKwkgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPF9JbnRUeXBlPjo6bWF4KCkgKyBfX25hZjsKKworCSAgICBjb25zdCBfUmVhbFR5cGUgX19ucCA9IHN0ZDo6Zmxvb3IoX01fdCAqIF9fcDEyKTsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fcGEgPSBfX25wIC8gX01fdDsKKworCSAgICAvLyBzcXJ0KHBpIC8gMikKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fc3BpXzIgPSAxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19hMSA9IF9NX2ExOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19hMTIgPSBfX2ExICsgX01fczIgKiBfX3NwaV8yOworCSAgICBjb25zdCBfUmVhbFR5cGUgX19hMTIzID0gX01fYTEyMzsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fczFzID0gX01fczEgKiBfTV9zMTsKKwkgICAgY29uc3QgX1JlYWxUeXBlIF9fczJzID0gX01fczIgKiBfTV9zMjsKKworCSAgICBib29sIF9fcmVqZWN0OworCSAgICBkbworCSAgICAgIHsKKwkJY29uc3QgX1JlYWxUeXBlIF9fdSA9IF9NX3MgKiBfX3VybmcoKTsKKworCQlfUmVhbFR5cGUgX192OworCisJCWlmIChfX3UgPD0gX19hMSkKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19uID0gX01fbmQoX191cm5nKTsKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSBfTV9zMSAqIHN0ZDo6YWJzKF9fbik7CisJCSAgICBfX3JlamVjdCA9IF9feSA+PSBfTV9kMTsKKwkJICAgIGlmICghX19yZWplY3QpCisJCSAgICAgIHsKKwkJCWNvbnN0IF9SZWFsVHlwZSBfX2UgPSAtc3RkOjpsb2coX191cm5nKCkpOworCQkJX194ID0gc3RkOjpmbG9vcihfX3kpOworCQkJX192ID0gLV9fZSAtIF9fbiAqIF9fbiAvIDIgKyBfTV9jOworCQkgICAgICB9CisJCSAgfQorCQllbHNlIGlmIChfX3UgPD0gX19hMTIpCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fbiA9IF9NX25kKF9fdXJuZyk7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gX01fczIgKiBzdGQ6OmFicyhfX24pOworCQkgICAgX19yZWplY3QgPSBfX3kgPj0gX01fZDI7CisJCSAgICBpZiAoIV9fcmVqZWN0KQorCQkgICAgICB7CisJCQljb25zdCBfUmVhbFR5cGUgX19lID0gLXN0ZDo6bG9nKF9fdXJuZygpKTsKKwkJCV9feCA9IHN0ZDo6Zmxvb3IoLV9feSk7CisJCQlfX3YgPSAtX19lIC0gX19uICogX19uIC8gMjsKKwkJICAgICAgfQorCQkgIH0KKwkJZWxzZSBpZiAoX191IDw9IF9fYTEyMykKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19lMSA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CQkgICAgCisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19lMiA9IC1zdGQ6OmxvZyhfX3VybmcoKSk7CisKKwkJICAgIGNvbnN0IF9SZWFsVHlwZSBfX3kgPSBfTV9kMSArIDIgKiBfX3MxcyAqIF9fZTEgLyBfTV9kMTsKKwkJICAgIF9feCA9IHN0ZDo6Zmxvb3IoX195KTsKKwkJICAgIF9fdiA9ICgtX19lMiArIF9NX2QxICogKDEgLyAoX01fdCAtIF9fbnApCisJCQkJCSAgICAtX195IC8gKDIgKiBfX3MxcykpKTsKKwkJICAgIF9fcmVqZWN0ID0gZmFsc2U7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fZTEgPSAtc3RkOjpsb2coX191cm5nKCkpOwkJICAgIAorCQkgICAgY29uc3QgX1JlYWxUeXBlIF9fZTIgPSAtc3RkOjpsb2coX191cm5nKCkpOworCisJCSAgICBjb25zdCBfUmVhbFR5cGUgX195ID0gX01fZDIgKyAyICogX19zMnMgKiBfX2UxIC8gX01fZDI7CisJCSAgICBfX3ggPSBzdGQ6OmZsb29yKC1fX3kpOworCQkgICAgX192ID0gLV9fZTIgLSBfTV9kMiAqIF9feSAvICgyICogX19zMnMpOworCQkgICAgX19yZWplY3QgPSBmYWxzZTsKKwkJICB9CisKKwkJX19yZWplY3QgPSBfX3JlamVjdCB8fCBfX3ggPCAtX19ucCB8fCBfX3ggPiBfTV90IC0gX19ucDsKKwkJaWYgKCFfX3JlamVjdCkKKwkJICB7CisJCSAgICBjb25zdCBfUmVhbFR5cGUgX19sZnggPQorCQkgICAgICBzdGQ6OnRyMTo6bGdhbW1hKF9fbnAgKyBfX3ggKyAxKQorCQkgICAgICArIHN0ZDo6dHIxOjpsZ2FtbWEoX01fdCAtIChfX25wICsgX194KSArIDEpOworCQkgICAgX19yZWplY3QgPSBfX3YgPiBfTV9sZiAtIF9fbGZ4ICsgX194ICogX01fbHAxcDsKKwkJICB9CisKKwkJX19yZWplY3QgfD0gX194ICsgX19ucCA+PSBfX3RocjsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3JlamVjdCk7CisKKwkgICAgX194ICs9IF9fbnAgKyBfX25hZjsKKworCSAgICBjb25zdCBfSW50VHlwZSBfX3ogPSBfTV93YWl0aW5nKF9fdXJuZywgX01fdCAtIF9JbnRUeXBlKF9feCkpOyAKKwkgICAgX19yZXQgPSBfSW50VHlwZShfX3gpICsgX196OworCSAgfQorCWVsc2UKKyNlbmRpZgorCSAgX19yZXQgPSBfTV93YWl0aW5nKF9fdXJuZywgX01fdCk7CisKKwlpZiAoX19wMTIgIT0gX01fcCkKKwkgIF9fcmV0ID0gX01fdCAtIF9fcmV0OworCXJldHVybiBfX3JldDsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcjw8KHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX29zLAorCSAgICAgICBjb25zdCBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX29zdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19vc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX29zLmZsYWdzKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19maWxsID0gX19vcy5maWxsKCk7CisgICAgICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgX19wcmVjaXNpb24gPSBfX29zLnByZWNpc2lvbigpOworICAgICAgY29uc3QgX0NoYXJUIF9fc3BhY2UgPSBfX29zLndpZGVuKCcgJyk7CisgICAgICBfX29zLmZsYWdzKF9faW9zX2Jhc2U6OnNjaWVudGlmaWMgfCBfX2lvc19iYXNlOjpsZWZ0KTsKKyAgICAgIF9fb3MuZmlsbChfX3NwYWNlKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fZ251X2N4eDo6X19udW1lcmljX3RyYWl0czxfUmVhbFR5cGU+OjpfX21heF9kaWdpdHMxMCk7CisKKyAgICAgIF9fb3MgPDwgX194LnQoKSA8PCBfX3NwYWNlIDw8IF9feC5wKCkgCisJICAgPDwgX19zcGFjZSA8PCBfX3guX01fbmQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW50VHlwZSwgdHlwZW5hbWUgX1JlYWxUeXBlLAorCSAgIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBiaW5vbWlhbF9kaXN0cmlidXRpb248X0ludFR5cGUsIF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX3QgPj4gX194Ll9NX3AgPj4gX194Ll9NX25kOworICAgICAgX194Ll9NX2luaXRpYWxpemUoKTsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IHVuaWZvcm1fcmVhbDxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX3NwYWNlID0gX19vcy53aWRlbignICcpOworICAgICAgX19vcy5mbGFncyhfX2lvc19iYXNlOjpzY2llbnRpZmljIHwgX19pb3NfYmFzZTo6bGVmdCk7CisgICAgICBfX29zLmZpbGwoX19zcGFjZSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5taW4oKSA8PCBfX3NwYWNlIDw8IF9feC5tYXgoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9faXMsCisJICAgICAgIHVuaWZvcm1fcmVhbDxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19pc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9faXN0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19pcy5mbGFncygpOworICAgICAgX19pcy5mbGFncyhfX2lvc19iYXNlOjpza2lwd3MpOworCisgICAgICBfX2lzID4+IF9feC5fTV9taW4gPj4gX194Ll9NX21heDsKKworICAgICAgX19pcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX2lzOworICAgIH0KKworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGV4cG9uZW50aWFsX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5sYW1iZGEoKTsKKworICAgICAgX19vcy5mbGFncyhfX2ZsYWdzKTsKKyAgICAgIF9fb3MuZmlsbChfX2ZpbGwpOworICAgICAgX19vcy5wcmVjaXNpb24oX19wcmVjaXNpb24pOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisKKyAgLyoqCisgICAqIFBvbGFyIG1ldGhvZCBkdWUgdG8gTWFyc2FnbGlhLgorICAgKgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIFYsIFNlY3QuIDQuNC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZT4KKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVW5pZm9ybVJhbmRvbU51bWJlckdlbmVyYXRvcj4KKyAgICAgIHR5cGVuYW1lIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgICBvcGVyYXRvcigpKF9Vbmlmb3JtUmFuZG9tTnVtYmVyR2VuZXJhdG9yJiBfX3VybmcpCisgICAgICB7CisJcmVzdWx0X3R5cGUgX19yZXQ7CisKKwlpZiAoX01fc2F2ZWRfYXZhaWxhYmxlKQorCSAgeworCSAgICBfTV9zYXZlZF9hdmFpbGFibGUgPSBmYWxzZTsKKwkgICAgX19yZXQgPSBfTV9zYXZlZDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHJlc3VsdF90eXBlIF9feCwgX195LCBfX3IyOworCSAgICBkbworCSAgICAgIHsKKwkJX194ID0gcmVzdWx0X3R5cGUoMi4wKSAqIF9fdXJuZygpIC0gMS4wOworCQlfX3kgPSByZXN1bHRfdHlwZSgyLjApICogX191cm5nKCkgLSAxLjA7CisJCV9fcjIgPSBfX3ggKiBfX3ggKyBfX3kgKiBfX3k7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yMiA+IDEuMCB8fCBfX3IyID09IDAuMCk7CisKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19tdWx0ID0gc3RkOjpzcXJ0KC0yICogc3RkOjpsb2coX19yMikgLyBfX3IyKTsKKwkgICAgX01fc2F2ZWQgPSBfX3ggKiBfX211bHQ7CisJICAgIF9NX3NhdmVkX2F2YWlsYWJsZSA9IHRydWU7CisJICAgIF9fcmV0ID0gX195ICogX19tdWx0OworCSAgfQorCQorCV9fcmV0ID0gX19yZXQgKiBfTV9zaWdtYSArIF9NX21lYW47CisJcmV0dXJuIF9fcmV0OworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IG5vcm1hbF9kaXN0cmlidXRpb248X1JlYWxUeXBlPiYgX194KQorICAgIHsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4gIF9fb3N0cmVhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX29zdHJlYW1fdHlwZTo6aW9zX2Jhc2UgICAgX19pb3NfYmFzZTsKKworICAgICAgY29uc3QgdHlwZW5hbWUgX19pb3NfYmFzZTo6Zm10ZmxhZ3MgX19mbGFncyA9IF9fb3MuZmxhZ3MoKTsKKyAgICAgIGNvbnN0IF9DaGFyVCBfX2ZpbGwgPSBfX29zLmZpbGwoKTsKKyAgICAgIGNvbnN0IHN0ZDo6c3RyZWFtc2l6ZSBfX3ByZWNpc2lvbiA9IF9fb3MucHJlY2lzaW9uKCk7CisgICAgICBjb25zdCBfQ2hhclQgX19zcGFjZSA9IF9fb3Mud2lkZW4oJyAnKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fc3BhY2UpOworICAgICAgX19vcy5wcmVjaXNpb24oX19nbnVfY3h4OjpfX251bWVyaWNfdHJhaXRzPF9SZWFsVHlwZT46Ol9fbWF4X2RpZ2l0czEwKTsKKworICAgICAgX19vcyA8PCBfX3guX01fc2F2ZWRfYXZhaWxhYmxlIDw8IF9fc3BhY2UKKwkgICA8PCBfX3gubWVhbigpIDw8IF9fc3BhY2UKKwkgICA8PCBfX3guc2lnbWEoKTsKKyAgICAgIGlmIChfX3guX01fc2F2ZWRfYXZhaWxhYmxlKQorCV9fb3MgPDwgX19zcGFjZSA8PCBfX3guX01fc2F2ZWQ7CisKKyAgICAgIF9fb3MuZmxhZ3MoX19mbGFncyk7CisgICAgICBfX29zLmZpbGwoX19maWxsKTsKKyAgICAgIF9fb3MucHJlY2lzaW9uKF9fcHJlY2lzaW9uKTsKKyAgICAgIHJldHVybiBfX29zOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGUsIHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cz4KKyAgICBzdGQ6OmJhc2ljX2lzdHJlYW08X0NoYXJULCBfVHJhaXRzPiYKKyAgICBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JiBfX2lzLAorCSAgICAgICBub3JtYWxfZGlzdHJpYnV0aW9uPF9SZWFsVHlwZT4mIF9feCkKKyAgICB7CisgICAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfaXN0cmVhbTxfQ2hhclQsIF9UcmFpdHM+ICBfX2lzdHJlYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pc3RyZWFtX3R5cGU6Omlvc19iYXNlICAgIF9faW9zX2Jhc2U7CisKKyAgICAgIGNvbnN0IHR5cGVuYW1lIF9faW9zX2Jhc2U6OmZtdGZsYWdzIF9fZmxhZ3MgPSBfX2lzLmZsYWdzKCk7CisgICAgICBfX2lzLmZsYWdzKF9faW9zX2Jhc2U6OmRlYyB8IF9faW9zX2Jhc2U6OnNraXB3cyk7CisKKyAgICAgIF9faXMgPj4gX194Ll9NX3NhdmVkX2F2YWlsYWJsZSA+PiBfX3guX01fbWVhbgorCSAgID4+IF9feC5fTV9zaWdtYTsKKyAgICAgIGlmIChfX3guX01fc2F2ZWRfYXZhaWxhYmxlKQorCV9faXMgPj4gX194Ll9NX3NhdmVkOworCisgICAgICBfX2lzLmZsYWdzKF9fZmxhZ3MpOworICAgICAgcmV0dXJuIF9faXM7CisgICAgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlYWxUeXBlPgorICAgIHZvaWQKKyAgICBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6CisgICAgX01faW5pdGlhbGl6ZSgpCisgICAgeworICAgICAgaWYgKF9NX2FscGhhID49IDEpCisJX01fbF9kID0gc3RkOjpzcXJ0KDIgKiBfTV9hbHBoYSAtIDEpOworICAgICAgZWxzZQorCV9NX2xfZCA9IChzdGQ6OnBvdyhfTV9hbHBoYSwgX01fYWxwaGEgLyAoMSAtIF9NX2FscGhhKSkKKwkJICAqICgxIC0gX01fYWxwaGEpKTsKKyAgICB9CisKKyAgLyoqCisgICAqIENoZW5nJ3MgcmVqZWN0aW9uIGFsZ29yaXRobSBHQiBmb3IgYWxwaGEgPj0gMSBhbmQgYSBtb2RpZmljYXRpb24KKyAgICogb2YgVmFkdXZhJ3MgcmVqZWN0aW9uIGZyb20gV2VpYnVsbCBhbGdvcml0aG0gZHVlIHRvIERldnJveWUgZm9yCisgICAqIGFscGhhIDwgMS4KKyAgICoKKyAgICogUmVmZXJlbmNlczoKKyAgICogQ2hlbmcsIFIuIEMuIFRoZSBHZW5lcmF0aW9uIG9mIEdhbW1hIFJhbmRvbSBWYXJpYWJsZXMgd2l0aCBOb24taW50ZWdyYWwKKyAgICogU2hhcGUgUGFyYW1ldGVyLiBBcHBsaWVkIFN0YXRpc3RpY3MsIDI2LCA3MS03NSwgMTk3Ny4KKyAgICoKKyAgICogVmFkdXZhLCBJLiBDb21wdXRlciBHZW5lcmF0aW9uIG9mIEdhbW1hIEdhbmRvbSBWYXJpYWJsZXMgYnkgUmVqZWN0aW9uCisgICAqIGFuZCBDb21wb3NpdGlvbiBQcm9jZWR1cmVzLiBNYXRoLiBPcGVyYXRpb25zZm9yc2NodW5nIGFuZCBTdGF0aXN0aWssCisgICAqIFNlcmllcyBpbiBTdGF0aXN0aWNzLCA4LCA1NDUtNTc2LCAxOTc3LgorICAgKgorICAgKiBEZXZyb3llLCBMLiBOb24tVW5pZm9ybSBSYW5kb20gVmFyaWF0ZXMgR2VuZXJhdGlvbi4gU3ByaW5nZXItVmVybGFnLAorICAgKiBOZXcgWW9yaywgMTk4NiwgQ2guIElYLCBTZWN0LiAzLjQgKCsgRXJyYXRhISkuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUmVhbFR5cGU+CisgICAgdGVtcGxhdGU8Y2xhc3MgX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3I+CisgICAgICB0eXBlbmFtZSBnYW1tYV9kaXN0cmlidXRpb248X1JlYWxUeXBlPjo6cmVzdWx0X3R5cGUKKyAgICAgIGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+OjoKKyAgICAgIG9wZXJhdG9yKCkoX1VuaWZvcm1SYW5kb21OdW1iZXJHZW5lcmF0b3ImIF9fdXJuZykKKyAgICAgIHsKKwlyZXN1bHRfdHlwZSBfX3g7CisKKwlib29sIF9fcmVqZWN0OworCWlmIChfTV9hbHBoYSA+PSAxKQorCSAgeworCSAgICAvLyBhbHBoYSAtIGxvZyg0KQorCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX2IgPSBfTV9hbHBoYQorCSAgICAgIC0gcmVzdWx0X3R5cGUoMS4zODYyOTQzNjExMTk4OTA2MTg4MzQ0NjQyNDI5MTYzNTMxTCk7CisJICAgIGNvbnN0IHJlc3VsdF90eXBlIF9fYyA9IF9NX2FscGhhICsgX01fbF9kOworCSAgICBjb25zdCByZXN1bHRfdHlwZSBfXzFsID0gMSAvIF9NX2xfZDsKKworCSAgICAvLyAxICsgbG9nKDkgLyAyKQorCSAgICBjb25zdCByZXN1bHRfdHlwZSBfX2sgPSAyLjUwNDA3NzM5Njc3NjI3NDA3MzM3MzI1ODM1MjM4Njg3NDhMOworCisJICAgIGRvCisJICAgICAgeworCQljb25zdCByZXN1bHRfdHlwZSBfX3UgPSBfX3VybmcoKTsKKwkJY29uc3QgcmVzdWx0X3R5cGUgX192ID0gX191cm5nKCk7CisKKwkJY29uc3QgcmVzdWx0X3R5cGUgX195ID0gX18xbCAqIHN0ZDo6bG9nKF9fdiAvICgxIC0gX192KSk7CisJCV9feCA9IF9NX2FscGhhICogc3RkOjpleHAoX195KTsKKworCQljb25zdCByZXN1bHRfdHlwZSBfX3ogPSBfX3UgKiBfX3YgKiBfX3Y7CisJCWNvbnN0IHJlc3VsdF90eXBlIF9fciA9IF9fYiArIF9fYyAqIF9feSAtIF9feDsKKworCQlfX3JlamVjdCA9IF9fciA8IHJlc3VsdF90eXBlKDQuNSkgKiBfX3ogLSBfX2s7CisJCWlmIChfX3JlamVjdCkKKwkJICBfX3JlamVjdCA9IF9fciA8IHN0ZDo6bG9nKF9feik7CisJICAgICAgfQorCSAgICB3aGlsZSAoX19yZWplY3QpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgY29uc3QgcmVzdWx0X3R5cGUgX19jID0gMSAvIF9NX2FscGhhOworCisJICAgIGRvCisJICAgICAgeworCQljb25zdCByZXN1bHRfdHlwZSBfX3ogPSAtc3RkOjpsb2coX191cm5nKCkpOworCQljb25zdCByZXN1bHRfdHlwZSBfX2UgPSAtc3RkOjpsb2coX191cm5nKCkpOworCisJCV9feCA9IHN0ZDo6cG93KF9feiwgX19jKTsKKworCQlfX3JlamVjdCA9IF9feiArIF9fZSA8IF9NX2xfZCArIF9feDsKKwkgICAgICB9CisJICAgIHdoaWxlIChfX3JlamVjdCk7CisJICB9CisKKwlyZXR1cm4gX194OworICAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZWFsVHlwZSwgdHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2hhclQsIF9UcmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPF9DaGFyVCwgX1RyYWl0cz4mIF9fb3MsCisJICAgICAgIGNvbnN0IGdhbW1hX2Rpc3RyaWJ1dGlvbjxfUmVhbFR5cGU+JiBfX3gpCisgICAgeworICAgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJlYW08X0NoYXJULCBfVHJhaXRzPiAgX19vc3RyZWFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fb3N0cmVhbV90eXBlOjppb3NfYmFzZSAgICBfX2lvc19iYXNlOworCisgICAgICBjb25zdCB0eXBlbmFtZSBfX2lvc19iYXNlOjpmbXRmbGFncyBfX2ZsYWdzID0gX19vcy5mbGFncygpOworICAgICAgY29uc3QgX0NoYXJUIF9fZmlsbCA9IF9fb3MuZmlsbCgpOworICAgICAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIF9fcHJlY2lzaW9uID0gX19vcy5wcmVjaXNpb24oKTsKKyAgICAgIF9fb3MuZmxhZ3MoX19pb3NfYmFzZTo6c2NpZW50aWZpYyB8IF9faW9zX2Jhc2U6OmxlZnQpOworICAgICAgX19vcy5maWxsKF9fb3Mud2lkZW4oJyAnKSk7CisgICAgICBfX29zLnByZWNpc2lvbihfX2dudV9jeHg6Ol9fbnVtZXJpY190cmFpdHM8X1JlYWxUeXBlPjo6X19tYXhfZGlnaXRzMTApOworCisgICAgICBfX29zIDw8IF9feC5hbHBoYSgpOworCisgICAgICBfX29zLmZsYWdzKF9fZmxhZ3MpOworICAgICAgX19vcy5maWxsKF9fZmlsbCk7CisgICAgICBfX29zLnByZWNpc2lvbihfX3ByZWNpc2lvbik7CisgICAgICByZXR1cm4gX19vczsKKyAgICB9CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3JlZ2V4IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvcmVnZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0YTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3JlZ2V4CkBAIC0wLDAgKzEsMjczMCBAQAorLy8gY2xhc3MgdGVtcGxhdGUgcmVnZXggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKgorICogQGZpbGUgdHIxL3JlZ2V4CisgKiBAYXV0aG9yIFN0ZXBoZW4gTS4gV2ViYiAgPHN0ZXBoZW4ud2ViYkBicmVnbWFzb2Z0LmNhPgorICogVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1JFR0VYCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9SRUdFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisvKioKKyAqIEBkZWZncm91cCB0cjFfcmVnZXggUmVndWxhciBFeHByZXNzaW9ucworICogQSBmYWNpbGl0eSBmb3IgcGVyZm9ybWluZyByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaGluZy4KKyAqLworIC8vQHsKKworLyoqIEBuYW1lc3BhY2Ugc3RkOjpyZWdleF9jb25zdGFudHMKKyAqICBAYnJpZWYgSVNPIEMrKyAweCBlbnRpdGllcyBzdWIgbmFtZXNwYWNlIGZvciByZWdleC4KKyAqLworbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cworeworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQG5hbWUgNS4xIFJlZ3VsYXIgRXhwcmVzc2lvbiBTeW50YXggT3B0aW9ucworICAgKi8KKyAgLy9AeworICBlbnVtIF9fc3ludGF4X29wdGlvbgorICAgIHsKKyAgICAgIF9TX2ljYXNlLAorICAgICAgX1Nfbm9zdWJzLAorICAgICAgX1Nfb3B0aW1pemUsCisgICAgICBfU19jb2xsYXRlLAorICAgICAgX1NfRUNNQVNjcmlwdCwKKyAgICAgIF9TX2Jhc2ljLAorICAgICAgX1NfZXh0ZW5kZWQsCisgICAgICBfU19hd2ssCisgICAgICBfU19ncmVwLAorICAgICAgX1NfZWdyZXAsCisgICAgICBfU19zeW50YXhfbGFzdAorICAgIH07CisKKyAgLyoqCisgICAqIEBicmllZiBUaGlzIGlzIGEgYml0bWFzayB0eXBlIGluZGljYXRpbmcgaG93IHRvIGludGVycHJldCB0aGUgcmVnZXguCisgICAqCisgICAqIFRoZSBAYyBzeW50YXhfb3B0aW9uX3R5cGUgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBidXQgaXQgaXMgdmFsaWQgdG8KKyAgICogcGVyZm9ybSBiaXR3aXNlIG9wZXJhdGlvbnMgb24gdGhlc2UgdmFsdWVzIGFuZCBleHBlY3QgdGhlIHJpZ2h0IHRoaW5nIHRvCisgICAqIGhhcHBlbi4KKyAgICoKKyAgICogQSB2YWxpZCB2YWx1ZSBvZiB0eXBlIHN5bnRheF9vcHRpb25fdHlwZSBzaGFsbCBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZQorICAgKiBlbGVtZW50cyBAYyBFQ01BU2NyaXB0LCBAYyBiYXNpYywgQGMgZXh0ZW5kZWQsIEBjIGF3aywgQGMgZ3JlcCwgQGMgZWdyZXAKKyAgICogJXNldC4KKyAgICovCisgIHR5cGVkZWYgdW5zaWduZWQgaW50IHN5bnRheF9vcHRpb25fdHlwZTsKKworICAvKiogCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBtYXRjaGluZyBvZiByZWd1bGFyIGV4cHJlc3Npb25zIGFnYWluc3QgYSBjaGFyYWN0ZXIKKyAgICogc2VxdWVuY2Ugc2hhbGwgYmUgcGVyZm9ybWVkIHdpdGhvdXQgcmVnYXJkIHRvIGNhc2UuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIGljYXNlICAgICAgPSAxIDw8IF9TX2ljYXNlOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB3aGVuIGEgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCBhIGNoYXJhY3RlcgorICAgKiBjb250YWluZXIgc2VxdWVuY2UsIG5vIHN1Yi1leHByZXNzaW9uIG1hdGNoZXMgYXJlIHRvIGJlIHN0b3JlZCBpbiB0aGUKKyAgICogc3VwcGxpZWQgbWF0Y2hfcmVzdWx0cyBzdHJ1Y3R1cmUuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIG5vc3VicyAgICAgPSAxIDw8IF9TX25vc3ViczsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgc2hvdWxkIHBheSBtb3JlIGF0dGVudGlvbiB0bworICAgKiB0aGUgc3BlZWQgd2l0aCB3aGljaCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBtYXRjaGVkLCBhbmQgbGVzcyB0byB0aGUKKyAgICogc3BlZWQgd2l0aCB3aGljaCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0cyBhcmUgY29uc3RydWN0ZWQuIE90aGVyd2lzZQorICAgKiBpdCBoYXMgbm8gZGV0ZWN0YWJsZSBlZmZlY3Qgb24gdGhlIHByb2dyYW0gb3V0cHV0LgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBvcHRpbWl6ZSAgID0gMSA8PCBfU19vcHRpbWl6ZTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgY2hhcmFjdGVyIHJhbmdlcyBvZiB0aGUgZm9ybSBbYS1iXSBzaG91bGQgYmUgbG9jYWxlCisgICAqIHNlbnNpdGl2ZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgY29sbGF0ZSAgICA9IDEgPDwgX1NfY29sbGF0ZTsKKworICAvKioKKyAgICogU3BlY2lmaWVzIHRoYXQgdGhlIGdyYW1tYXIgcmVjb2duaXplZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGVuZ2luZSBpcworICAgKiB0aGF0IHVzZWQgYnkgRUNNQVNjcmlwdCBpbiBFQ01BLTI2MiBbRWNtYSBJbnRlcm5hdGlvbmFsLCBFQ01BU2NyaXB0CisgICAqIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFN0YW5kYXJkIEVjbWEtMjYyLCB0aGlyZCBlZGl0aW9uLCAxOTk5XSwgYXMKKyAgICogbW9kaWZpZWQgaW4gdHIxIHNlY3Rpb24gWzcuMTNdLiAgVGhpcyBncmFtbWFyIGlzIHNpbWlsYXIgdG8gdGhhdCBkZWZpbmVkCisgICAqIGluIHRoZSBQRVJMIHNjcmlwdGluZyBsYW5ndWFnZSBidXQgZXh0ZW5kZWQgd2l0aCBlbGVtZW50cyBmb3VuZCBpbiB0aGUKKyAgICogUE9TSVggcmVndWxhciBleHByZXNzaW9uIGdyYW1tYXIuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIEVDTUFTY3JpcHQgPSAxIDw8IF9TX0VDTUFTY3JpcHQ7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEsCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIEJhc2UgRGVmaW5pdGlvbnMgYW5kCisgICAqIEhlYWRlcnMsIFNlY3Rpb24gOSwgUmVndWxhciBFeHByZXNzaW9ucyBbSUVFRSwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAtLQorICAgKiBQb3J0YWJsZSBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBJRUVFIFN0YW5kYXJkIDEwMDMuMS0yMDAxXS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgYmFzaWMgICAgICA9IDEgPDwgX1NfYmFzaWM7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEsCisgICAqIFBvcnRhYmxlIE9wZXJhdGluZyBTeXN0ZW0gSW50ZXJmYWNlIChQT1NJWCksIEJhc2UgRGVmaW5pdGlvbnMgYW5kIEhlYWRlcnMsCisgICAqIFNlY3Rpb24gOSwgUmVndWxhciBFeHByZXNzaW9ucy4KKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgZXh0ZW5kZWQgICA9IDEgPDwgX1NfZXh0ZW5kZWQ7CisKKyAgLyoqCisgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFtbWFyIHJlY29nbml6ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUgaXMKKyAgICogdGhhdCB1c2VkIGJ5IFBPU0lYIHV0aWxpdHkgYXdrIGluIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMKKyAgICogaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZCwgZXhjZXB0IHRoYXQgQy1zdHlsZSBlc2NhcGUKKyAgICogc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQuICBUaGVzZSBzZXF1ZW5jZXMgYXJlOiAKKyAgICogXFxcXCwgXFxhLCBcXGIsIFxcZiwgCisgICAqIFxcbiwgXFxyLCBcXHQgLCBcXHYsIAorICAgKiBcXCZhcG9zOywgJmFwb3M7LCBhbmQgXFxkZGQgCisgICAqICh3aGVyZSBkZGQgaXMgb25lLCB0d28sIG9yIHRocmVlIG9jdGFsIGRpZ2l0cykuICAKKyAgICovCisgIHN0YXRpYyBjb25zdCBzeW50YXhfb3B0aW9uX3R5cGUgYXdrICAgICAgICA9IDEgPDwgX1NfYXdrOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgaW4gSUVFRSBTdGQgMTAwMy4xLTIwMDEuICBUaGlzIG9wdGlvbiBpcworICAgKiBpZGVudGljYWwgdG8gc3ludGF4X29wdGlvbl90eXBlIGJhc2ljLCBleGNlcHQgdGhhdCBuZXdsaW5lcyBhcmUgdHJlYXRlZAorICAgKiBhcyB3aGl0ZXNwYWNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IHN5bnRheF9vcHRpb25fdHlwZSBncmVwICAgICAgID0gMSA8PCBfU19ncmVwOworCisgIC8qKgorICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgZ3JhbW1hciByZWNvZ25pemVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lIGlzCisgICAqIHRoYXQgdXNlZCBieSBQT1NJWCB1dGlsaXR5IGdyZXAgd2hlbiBnaXZlbiB0aGUgLUUgb3B0aW9uIGluCisgICAqIElFRUUgU3RkIDEwMDMuMS0yMDAxLiAgVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHN5bnRheF9vcHRpb25fdHlwZSAKKyAgICogZXh0ZW5kZWQsIGV4Y2VwdCB0aGF0IG5ld2xpbmVzIGFyZSB0cmVhdGVkIGFzIHdoaXRlc3BhY2UuCisgICAqLworICBzdGF0aWMgY29uc3Qgc3ludGF4X29wdGlvbl90eXBlIGVncmVwICAgICAgPSAxIDw8IF9TX2VncmVwOworCisgIC8vQH0KKworICAvKioKKyAgICogQG5hbWUgNS4yIE1hdGNoaW5nIFJ1bGVzCisgICAqCisgICAqIE1hdGNoaW5nIGEgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3QgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIFtmaXJzdCwKKyAgICogbGFzdCkgcHJvY2VlZHMgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvZiB0aGUgZ3JhbW1hciBzcGVjaWZpZWQgZm9yIHRoZQorICAgKiByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LCBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIGVmZmVjdHMgbGlzdGVkCisgICAqIGJlbG93IGZvciBhbnkgYml0bWFzayBlbGVtZW50cyBzZXQuCisgICAqCisgICAqLworICAvL0B7CisKKyAgZW51bSBfX21hdGNoX2ZsYWcKKyAgICB7CisgICAgICBfU19ub3RfYm9sLAorICAgICAgX1Nfbm90X2VvbCwKKyAgICAgIF9TX25vdF9ib3csCisgICAgICBfU19ub3RfZW93LAorICAgICAgX1NfYW55LAorICAgICAgX1Nfbm90X251bGwsCisgICAgICBfU19jb250aW51b3VzLAorICAgICAgX1NfcHJldl9hdmFpbCwKKyAgICAgIF9TX3NlZCwKKyAgICAgIF9TX25vX2NvcHksCisgICAgICBfU19maXJzdF9vbmx5LAorICAgICAgX1NfbWF0Y2hfZmxhZ19sYXN0CisgICAgfTsKKworICAvKioKKyAgICogQGJyaWVmIFRoaXMgaXMgYSBiaXRtYXNrIHR5cGUgaW5kaWNhdGluZyByZWdleCBtYXRjaGluZyBydWxlcy4KKyAgICoKKyAgICogVGhlIEBjIG1hdGNoX2ZsYWdfdHlwZSBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ1dCBpdCBpcyB2YWxpZCB0bworICAgKiBwZXJmb3JtIGJpdHdpc2Ugb3BlcmF0aW9ucyBvbiB0aGVzZSB2YWx1ZXMgYW5kIGV4cGVjdCB0aGUgcmlnaHQgdGhpbmcgdG8KKyAgICogaGFwcGVuLgorICAgKi8KKyAgdHlwZWRlZiBzdGQ6OmJpdHNldDxfU19tYXRjaF9mbGFnX2xhc3Q+IG1hdGNoX2ZsYWdfdHlwZTsKKworICAvKioKKyAgICogVGhlIGRlZmF1bHQgbWF0Y2hpbmcgcnVsZXMuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX2RlZmF1bHQgICAgID0gMDsKKworICAvKioKKyAgICogVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc2VxdWVuY2UgW2ZpcnN0LCBsYXN0KSBpcyB0cmVhdGVkIGFzIHRob3VnaCBpdAorICAgKiBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIHNvIHRoZSBjaGFyYWN0ZXIgKF4pIGluIHRoZSByZWd1bGFyCisgICAqIGV4cHJlc3Npb24gc2hhbGwgbm90IG1hdGNoIFtmaXJzdCwgZmlyc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm9sICAgICA9IDEgPDwgX1Nfbm90X2JvbDsKKworICAvKioKKyAgICogVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0CisgICAqIGlzIG5vdCBhdCB0aGUgZW5kIG9mIGEgbGluZSwgc28gdGhlIGNoYXJhY3RlciAoJCkgaW4gdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgbWF0Y2ggW2xhc3QsIGxhc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfZW9sICAgICA9IDEgPDwgX1Nfbm90X2VvbDsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gXFxiIGlzIG5vdCBtYXRjaGVkIGFnYWluc3QgdGhlIHN1Yi1zZXF1ZW5jZQorICAgKiBbZmlyc3QsZmlyc3QpLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9ub3RfYm93ICAgICA9IDEgPDwgX1Nfbm90X2JvdzsKKyAgIAorICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gXFxiIHNob3VsZCBub3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWItc2VxdWVuY2UKKyAgICogW2xhc3QsbGFzdCkuCisgICAqLworICBzdGF0aWMgY29uc3QgbWF0Y2hfZmxhZ190eXBlIG1hdGNoX25vdF9lb3cgICAgID0gMSA8PCBfU19ub3RfZW93OworICAgCisgIC8qKgorICAgKiBJZiBtb3JlIHRoYW4gb25lIG1hdGNoIGlzIHBvc3NpYmxlIHRoZW4gYW55IG1hdGNoIGlzIGFuIGFjY2VwdGFibGUKKyAgICogcmVzdWx0LgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9hbnkgICAgICAgICA9IDEgPDwgX1NfYW55OworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBtYXRjaCBhbiBlbXB0eSBzZXF1ZW5jZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgbWF0Y2hfbm90X251bGwgICAgPSAxIDw8IF9TX25vdF9udWxsOworICAgCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiBvbmx5IG1hdGNoZXMgYSBzdWItc2VxdWVuY2UgdGhhdCBiZWdpbnMgYXQgZmlyc3QgLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9jb250aW51b3VzICA9IDEgPDwgX1NfY29udGludW91czsKKyAgIAorICAvKioKKyAgICogLS1maXJzdCBpcyBhIHZhbGlkIGl0ZXJhdG9yIHBvc2l0aW9uLiAgV2hlbiB0aGlzIGZsYWcgaXMgc2V0IHRoZW4gdGhlCisgICAqIGZsYWdzIG1hdGNoX25vdF9ib2wgYW5kIG1hdGNoX25vdF9ib3cgYXJlIGlnbm9yZWQgYnkgdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBhbGdvcml0aG1zIDcuMTEgYW5kIGl0ZXJhdG9ycyA3LjEyLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBtYXRjaF9wcmV2X2F2YWlsICA9IDEgPDwgX1NfcHJldl9hdmFpbDsKKworICAvKioKKyAgICogV2hlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBpcyB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzdHJpbmcsIHRoZQorICAgKiBuZXcgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBydWxlcyB1c2VkIGJ5IHRoZSBFQ01BU2NyaXB0IHJlcGxhY2UKKyAgICogZnVuY3Rpb24gaW4gRUNNQS0gMjYyIFtFY21hIEludGVybmF0aW9uYWwsIEVDTUFTY3JpcHQgTGFuZ3VhZ2UKKyAgICogU3BlY2lmaWNhdGlvbiwgU3RhbmRhcmQgRWNtYS0yNjIsIHRoaXJkIGVkaXRpb24sIDE5OTldLCBwYXJ0IDE1LjUuNC4xMQorICAgKiBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UuIEluIGFkZGl0aW9uLCBkdXJpbmcgc2VhcmNoIGFuZCByZXBsYWNlCisgICAqIG9wZXJhdGlvbnMgYWxsIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAqIGFyZSBsb2NhdGVkIGFuZCByZXBsYWNlZCwgYW5kIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCB0aGF0IGRpZCBub3QgbWF0Y2gKKyAgICogdGhlIGV4cHJlc3Npb24gYXJlIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dCBzdHJpbmcuCisgICAqIAorICAgKiBGb3JtYXQgc3RyaW5ncyAoZnJvbSBFQ01BLTI2MiBbMTUuNS40LjExXSk6CisgICAqIEBsaSAkJCAgVGhlIGRvbGxhci1zaWduIGl0c2VsZiAoJCkKKyAgICogQGxpICQmICBUaGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqIEBsaSAkYCAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgcHJlY2VkZXMgdGhlIG1hdGNoZWQgc3Vic3RyaW5nLgorICAgKiAgICAgICAgIFRoaXMgd291bGQgYmUgbWF0Y2hfcmVzdWx0czo6cHJlZml4KCkuCisgICAqIEBsaSAkJyAgVGhlIHBvcnRpb24gb2YgQGEgc3RyaW5nIHRoYXQgZm9sbG93cyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcuCisgICAqICAgICAgICAgVGhpcyB3b3VsZCBiZSBtYXRjaF9yZXN1bHRzOjpzdWZmaXgoKS4KKyAgICogQGxpICRuICBUaGUgbnRoIGNhcHR1cmUsIHdoZXJlIG4gaXMgaW4gWzEsOV0gYW5kICRuIGlzIG5vdCBmb2xsb3dlZCBieSBhCisgICAqICAgICAgICAgZGVjaW1hbCBkaWdpdC4gIElmIG4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUKKyAgICogICAgICAgICBpcyB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuICBJZiBuID4KKyAgICogICAgICAgICBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICogQGxpICRubiBUaGUgbm50aCBjYXB0dXJlLCB3aGVyZSBubiBpcyBhIHR3by1kaWdpdCBkZWNpbWFsIG51bWJlciBvbgorICAgKiAgICAgICAgIFswMSwgOTldLiAgSWYgbm4gPD0gbWF0Y2hfcmVzdWx0czo6c2l6ZSgpIGFuZCB0aGUgbnRoIGNhcHR1cmUgaXMKKyAgICogICAgICAgICB1bmRlZmluZWQsIHVzZSB0aGUgZW1wdHkgc3RyaW5nIGluc3RlYWQuIElmCisgICAqICAgICAgICAgbm4gPiBtYXRjaF9yZXN1bHRzOjpzaXplKCksIHRoZSByZXN1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X2RlZmF1bHQgICAgPSAwOworCisgIC8qKgorICAgKiBXaGVuIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGlzIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHN0cmluZywgdGhlCisgICAqIG5ldyBzdHJpbmcgaXMgY29uc3RydWN0ZWQgdXNpbmcgdGhlIHJ1bGVzIHVzZWQgYnkgdGhlIFBPU0lYIHNlZCB1dGlsaXR5CisgICAqIGluIElFRUUgU3RkIDEwMDMuMS0gMjAwMSBbSUVFRSwgSW5mb3JtYXRpb24gVGVjaG5vbG9neSAtLSBQb3J0YWJsZQorICAgKiBPcGVyYXRpbmcgU3lzdGVtIEludGVyZmFjZSAoUE9TSVgpLCBJRUVFIFN0YW5kYXJkIDEwMDMuMS0yMDAxXS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBtYXRjaF9mbGFnX3R5cGUgZm9ybWF0X3NlZCAgICAgICAgPSAxIDw8IF9TX3NlZDsKKworICAvKioKKyAgICogRHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgc2VjdGlvbnMgb2YgdGhlIGNoYXJhY3RlcgorICAgKiBjb250YWluZXIgc2VxdWVuY2UgYmVpbmcgc2VhcmNoZWQgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIKKyAgICogZXhwcmVzc2lvbiBzaGFsbCBub3QgYmUgY29waWVkIHRvIHRoZSBvdXRwdXQgc3RyaW5nLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfbm9fY29weSAgICA9IDEgPDwgX1Nfbm9fY29weTsKKworICAvKioKKyAgICogV2hlbiBzcGVjaWZpZWQgZHVyaW5nIGEgc2VhcmNoIGFuZCByZXBsYWNlIG9wZXJhdGlvbiwgb25seSB0aGUgZmlyc3QKKyAgICogb2NjdXJyZW5jZSBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIHNoYWxsIGJlIHJlcGxhY2VkLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IG1hdGNoX2ZsYWdfdHlwZSBmb3JtYXRfZmlyc3Rfb25seSA9IDEgPDwgX1NfZmlyc3Rfb25seTsKKworICAvL0B9CisKKyAgLyoqCisgICAqIEBuYW1lIDUuMyBFcnJvciBUeXBlcworICAgKi8KKyAgLy9AeworIAorICBlbnVtIGVycm9yX3R5cGUKKyAgICB7CisgICAgICBfU19lcnJvcl9jb2xsYXRlLAorICAgICAgX1NfZXJyb3JfY3R5cGUsCisgICAgICBfU19lcnJvcl9lc2NhcGUsCisgICAgICBfU19lcnJvcl9iYWNrcmVmLAorICAgICAgX1NfZXJyb3JfYnJhY2ssCisgICAgICBfU19lcnJvcl9wYXJlbiwKKyAgICAgIF9TX2Vycm9yX2JyYWNlLAorICAgICAgX1NfZXJyb3JfYmFkYnJhY2UsCisgICAgICBfU19lcnJvcl9yYW5nZSwKKyAgICAgIF9TX2Vycm9yX3NwYWNlLAorICAgICAgX1NfZXJyb3JfYmFkcmVwZWF0LAorICAgICAgX1NfZXJyb3JfY29tcGxleGl0eSwKKyAgICAgIF9TX2Vycm9yX3N0YWNrLAorICAgICAgX1NfZXJyb3JfbGFzdAorICAgIH07CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNvbGxhdGluZyBlbGVtZW50IG5hbWUuICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2NvbGxhdGUoX1NfZXJyb3JfY29sbGF0ZSk7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lLiAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9jdHlwZShfU19lcnJvcl9jdHlwZSk7CisKKyAgLyoqCisgICAqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGVzY2FwZWQgY2hhcmFjdGVyLCBvciBhIHRyYWlsaW5nCisgICAqIGVzY2FwZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2VzY2FwZShfU19lcnJvcl9lc2NhcGUpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCBiYWNrIHJlZmVyZW5jZS4gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYmFja3JlZihfU19lcnJvcl9iYWNrcmVmKTsKKworICAvKiogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIG1pc21hdGNoZWQgWyBhbmQgXS4gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYnJhY2soX1NfZXJyb3JfYnJhY2spOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgbWlzbWF0Y2hlZCAoIGFuZCApLiAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9wYXJlbihfU19lcnJvcl9wYXJlbik7CisKKyAgLyoqIFRoZSBleHByZXNzaW9uIGNvbnRhaW5lZCBtaXNtYXRjaGVkIHsgYW5kIH0gKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfYnJhY2UoX1NfZXJyb3JfYnJhY2UpOworCisgIC8qKiBUaGUgZXhwcmVzc2lvbiBjb250YWluZWQgYW4gaW52YWxpZCByYW5nZSBpbiBhIHt9IGV4cHJlc3Npb24uICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2JhZGJyYWNlKF9TX2Vycm9yX2JhZGJyYWNlKTsKKworICAvKioKKyAgICogVGhlIGV4cHJlc3Npb24gY29udGFpbmVkIGFuIGludmFsaWQgY2hhcmFjdGVyIHJhbmdlLAorICAgKiBzdWNoIGFzIFtiLWFdIGluIG1vc3QgZW5jb2RpbmdzLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3JfcmFuZ2UoX1NfZXJyb3JfcmFuZ2UpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb252ZXJ0IHRoZSBleHByZXNzaW9uIGludG8gYQorICAgKiBmaW5pdGUgc3RhdGUgbWFjaGluZS4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX3NwYWNlKF9TX2Vycm9yX3NwYWNlKTsKKworICAvKioKKyAgICogT25lIG9mIDxlbT4qPyt7PC9lbT4gd2FzIG5vdCBwcmVjZWRlZCBieSBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICovCisgIHN0YXRpYyBjb25zdCBlcnJvcl90eXBlIGVycm9yX2JhZHJlcGVhdChfU19lcnJvcl9iYWRyZXBlYXQpOworCisgIC8qKgorICAgKiBUaGUgY29tcGxleGl0eSBvZiBhbiBhdHRlbXB0ZWQgbWF0Y2ggYWdhaW5zdCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiBleGNlZWRlZCBhIHByZS1zZXQgbGV2ZWwuCisgICAqLworICBzdGF0aWMgY29uc3QgZXJyb3JfdHlwZSBlcnJvcl9jb21wbGV4aXR5KF9TX2Vycm9yX2NvbXBsZXhpdHkpOworCisgIC8qKgorICAgKiBUaGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAgICogcmVndWxhciBleHByZXNzaW9uIGNvdWxkIG1hdGNoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgKi8KKyAgc3RhdGljIGNvbnN0IGVycm9yX3R5cGUgZXJyb3Jfc3RhY2soX1NfZXJyb3Jfc3RhY2spOworCisgIC8vQH0KK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorCitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIFs3LjhdIENsYXNzIHJlZ2V4X2Vycm9yCisgIC8qKgorICAgKiAgQGJyaWVmIEEgcmVndWxhciBleHByZXNzaW9uIGV4Y2VwdGlvbiBjbGFzcy4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICoKKyAgICogIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeSB0aHJvd3Mgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIG9uIGVycm9yLgorICAgKi8KKyAgY2xhc3MgcmVnZXhfZXJyb3IKKyAgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgcmVnZXhfZXJyb3Igb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVjb2RlIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqLworICAgIGV4cGxpY2l0CisgICAgcmVnZXhfZXJyb3IocmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlIF9fZWNvZGUpCisgICAgOiBzdGQ6OnJ1bnRpbWVfZXJyb3IoInJlZ2V4X2Vycm9yIiksIF9NX2NvZGUoX19lY29kZSkKKyAgICB7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBHZXRzIHRoZSByZWdleCBlcnJvciBjb2RlLgorICAgICAqCisgICAgICogQHJldHVybnMgdGhlIHJlZ2V4IGVycm9yIGNvZGUuCisgICAgICovCisgICAgcmVnZXhfY29uc3RhbnRzOjplcnJvcl90eXBlCisgICAgY29kZSgpIGNvbnN0CisgICAgeyByZXR1cm4gX01fY29kZTsgfQorCisgIHByb3RlY3RlZDoKKyAgICByZWdleF9jb25zdGFudHM6OmVycm9yX3R5cGUgX01fY29kZTsKKyAgfTsKKworICAvLyBbNy43XSBDbGFzcyByZWdleF90cmFpdHMKKyAgLyoqCisgICAqIEBicmllZiBEZXNjcmliZXMgYXNwZWN0cyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICoKKyAgICogQSByZWd1bGFyIGV4cHJlc3Npb24gdHJhaXRzIGNsYXNzIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgdHIxCisgICAqIHNlY3Rpb24gWzcuMl0uCisgICAqCisgICAqIFRoZSBjbGFzcyAlcmVnZXggaXMgcGFyYW1ldGVyaXplZCBhcm91bmQgYSBzZXQgb2YgcmVsYXRlZCB0eXBlcyBhbmQKKyAgICogZnVuY3Rpb25zIHVzZWQgdG8gY29tcGxldGUgdGhlIGRlZmluaXRpb24gb2YgaXRzIHNlbWFudGljcy4gIFRoaXMgY2xhc3MKKyAgICogc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2Ygc3VjaCBhIHRyYWl0cyBjbGFzcy4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIHN0cnVjdCByZWdleF90cmFpdHMKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfQ2hfdHlwZSAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcl90eXBlPiBzdHJpbmdfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpsb2NhbGUgICAgICAgICAgICAgICAgICBsb2NhbGVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpjdHlwZV9iYXNlOjptYXNrICAgICAgICBjaGFyX2NsYXNzX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgZGVmYXVsdCB0cmFpdHMgb2JqZWN0LgorICAgICAgICovCisgICAgICByZWdleF90cmFpdHMoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdpdmVzIHRoZSBsZW5ndGggb2YgYSBDLXN0eWxlIHN0cmluZyBzdGFydGluZyBhdCBAcCBfX3AuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIF9fcCBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBiZXR3ZWVuIEBwICpfX3AgYW5kIHRoZSBmaXJzdAorICAgICAgICogZGVmYXVsdC1pbml0aWFsaXplZCB2YWx1ZSBvZiB0eXBlIEBwIGNoYXJfdHlwZS4gIEluIG90aGVyIHdvcmRzLCB1c2VzCisgICAgICAgKiB0aGUgQy1zdHJpbmcgYWxnb3JpdGhtIGZvciBkZXRlcm1pbmluZyB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2Ugb2YKKyAgICAgICAqIGNoYXJhY3RlcnMuCisgICAgICAgKi8KKyAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdAorICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogX19wKQorICAgICAgeyByZXR1cm4gc3RyaW5nX3R5cGU6OnRyYWl0c190eXBlOjpsZW5ndGgoX19wKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBQZXJmb3JtcyB0aGUgaWRlbnRpdHkgdHJhbnNsYXRpb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGMgQSBjaGFyYWN0ZXIgdG8gdGhlIGxvY2FsZS1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGMuCisgICAgICAgKi8KKyAgICAgIGNoYXJfdHlwZQorICAgICAgdHJhbnNsYXRlKGNoYXJfdHlwZSBfX2MpIGNvbnN0CisgICAgICB7IHJldHVybiBfX2M7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgVHJhbnNsYXRlcyBhIGNoYXJhY3RlciBpbnRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBlcXVpdmFsZW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjIEEgY2hhcmFjdGVyIHRvIHRoZSBsb2NhbGUtc3BlY2lmaWMgY2hhcmFjdGVyIHNldC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGxvd2VyLWNhc2UgZXF1aXZhbGVudCBvZiBjLgorICAgICAgICogQHRocm93cyBzdGQ6OmJhZF9jYXN0IGlmIHRoZSBpbWJ1ZWQgbG9jYWxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBjaGFyX3R5cGUKKyAgICAgIHRyYW5zbGF0ZV9ub2Nhc2UoY2hhcl90eXBlIF9fYykgY29uc3QKKyAgICAgIHsKKwl1c2luZyBzdGQ6OmN0eXBlOworCXVzaW5nIHN0ZDo6dXNlX2ZhY2V0OworCXJldHVybiB1c2VfZmFjZXQ8Y3R5cGU8Y2hhcl90eXBlPiA+KF9NX2xvY2FsZSkudG9sb3dlcihfX2MpOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgc29ydCBrZXkgZm9yIGEgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKgorICAgICAgICogUmV0dXJucyBhIHNvcnQga2V5IGZvciB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGRlc2lnbmF0ZWQgYnkgdGhlCisgICAgICAgKiBpdGVyYXRvciByYW5nZSBbRjEsIEYyKSBzdWNoIHRoYXQgaWYgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbRzEsIEcyKQorICAgICAgICogc29ydHMgYmVmb3JlIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgW0gxLCBIMikgdGhlbgorICAgICAgICogdi50cmFuc2Zvcm0oRzEsIEcyKSA8IHYudHJhbnNmb3JtKEgxLCBIMikuCisgICAgICAgKgorICAgICAgICogV2hhdCB0aGlzIHJlYWxseSBkb2VzIGlzIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gY29tcGFyZSBhCisgICAgICAgKiBzdHJpbmcgdG8gbXVsdGlwbGUgb3RoZXIgc3RyaW5ncyBpbiBsb2NhbGVzIHdpdGggZmFuY3kgY29sbGF0aW9uCisgICAgICAgKiBydWxlcyBhbmQgZXF1aXZhbGVuY2UgY2xhc3Nlcy4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBhIGxvY2FsZS1zcGVjaWZpYyBzb3J0IGtleSBlcXVpdmFsZW50IHRvIHRoZSBpbnB1dCByYW5nZS4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHN0ZDo6YmFkX2Nhc3QgaWYgdGhlIGN1cnJlbnQgbG9jYWxlIGRvZXMgbm90IGhhdmUgYSBjb2xsYXRlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRndkX2l0ZXI+CisgICAgICAgIHN0cmluZ190eXBlCisgICAgICAgIHRyYW5zZm9ybShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3QKKyAgICAgICAgeworCSAgdXNpbmcgc3RkOjpjb2xsYXRlOworCSAgdXNpbmcgc3RkOjp1c2VfZmFjZXQ7CisJICBjb25zdCBjb2xsYXRlPF9DaF90eXBlPiYgX19jKHVzZV9mYWNldDwKKwkJCQkgICAgICAgY29sbGF0ZTxfQ2hfdHlwZT4gPihfTV9sb2NhbGUpKTsKKwkgIHN0cmluZ190eXBlIF9fcyhfX2ZpcnN0LCBfX2xhc3QpOworCSAgcmV0dXJuIF9fYy50cmFuc2Zvcm0oX19zLmRhdGEoKSwgX19zLmRhdGEoKSArIF9fcy5zaXplKCkpOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgRHVubm8uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBFZmZlY3RzOiBpZiB0eXBlaWQodXNlX2ZhY2V0PGNvbGxhdGU8X0NoX3R5cGU+ID4pID09CisgICAgICAgKiB0eXBlaWQoY29sbGF0ZV9ieW5hbWU8X0NoX3R5cGU+KSBhbmQgdGhlIGZvcm0gb2YgdGhlIHNvcnQga2V5CisgICAgICAgKiByZXR1cm5lZCBieSBjb2xsYXRlX2J5bmFtZTxfQ2hfdHlwZT46OnRyYW5zZm9ybShmaXJzdCwgbGFzdCkgaXMga25vd24KKyAgICAgICAqIGFuZCBjYW4gYmUgY29udmVydGVkIGludG8gYSBwcmltYXJ5IHNvcnQga2V5IHRoZW4gcmV0dXJucyB0aGF0IGtleSwKKyAgICAgICAqIG90aGVyd2lzZSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gV1RGPz8KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBzdHJpbmdfdHlwZQorICAgICAgICB0cmFuc2Zvcm1fcHJpbWFyeShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgYSBjb2xsYXRpb24gZWxlbWVudCBieSBuYW1lLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBmaXJzdCBiZWdpbm5pbmcgb2YgdGhlIGNvbGxhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgKiBAcGFyYW0gbGFzdCAgb25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgY29sbGF0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAqIAorICAgICAgICogQHJldHVybnMgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgICAqIGNvbGxhdGluZyBlbGVtZW50IGNvbnNpc3Rpbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5CisgICAgICAgKiB0aGUgaXRlcmF0b3IgcmFuZ2UgW2ZpcnN0LCBsYXN0KS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlCisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgbm90IGEgdmFsaWQgY29sbGF0aW5nIGVsZW1lbnQuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gd2RfaXRlcj4KKyAgICAgICAgc3RyaW5nX3R5cGUKKyAgICAgICAgbG9va3VwX2NvbGxhdGVuYW1lKF9Gd2RfaXRlciBfX2ZpcnN0LCBfRndkX2l0ZXIgX19sYXN0KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgTWFwcyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIHRvIGEgbmFtZWQgY2hhcmFjdGVyCisgICAgICAgKiAgICAgICAgY2xhc3NpZmljYXRpb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IGJlZ2lubmluZyBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLgorICAgICAgICogQHBhcmFtIGxhc3QgIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dXJucyBhbiB1bnNwZWNpZmllZCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYXJhY3RlcgorICAgICAgICogY2xhc3NpZmljYXRpb24gbmFtZWQgYnkgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBkZXNpZ25hdGVkIGJ5IHRoZQorICAgICAgICogaXRlcmF0b3IgcmFuZ2UgW2ZpcnN0LCBsYXN0KS4gVGhlIHZhbHVlIHJldHVybmVkIHNoYWxsIGJlIGluZGVwZW5kZW50CisgICAgICAgKiBvZiB0aGUgY2FzZSBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlLiBJZiB0aGUgbmFtZQorICAgICAgICogaXMgbm90IHJlY29nbml6ZWQgdGhlbiByZXR1cm5zIGEgdmFsdWUgdGhhdCBjb21wYXJlcyBlcXVhbCB0byAwLgorICAgICAgICoKKyAgICAgICAqIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgbmFtZXMgKG9yIHRoZWlyIHdpZGUtY2hhcmFjdGVyIGVxdWl2YWxlbnQpIGFyZQorICAgICAgICogc3VwcG9ydGVkLgorICAgICAgICogLSBkCisgICAgICAgKiAtIHcKKyAgICAgICAqIC0gcworICAgICAgICogLSBhbG51bQorICAgICAgICogLSBhbHBoYQorICAgICAgICogLSBibGFuaworICAgICAgICogLSBjbnRybAorICAgICAgICogLSBkaWdpdAorICAgICAgICogLSBncmFwaAorICAgICAgICogLSBsb3dlcgorICAgICAgICogLSBwcmludAorICAgICAgICogLSBwdW5jdAorICAgICAgICogLSBzcGFjZQorICAgICAgICogLSB1cHBlcgorICAgICAgICogLSB4ZGlnaXQKKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Z3ZF9pdGVyPgorICAgICAgICBjaGFyX2NsYXNzX3R5cGUKKyAgICAgICAgbG9va3VwX2NsYXNzbmFtZShfRndkX2l0ZXIgX19maXJzdCwgX0Z3ZF9pdGVyIF9fbGFzdCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERldGVybWluZXMgaWYgQHAgYyBpcyBhIG1lbWJlciBvZiBhbiBpZGVudGlmaWVkIGNsYXNzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjIGEgY2hhcmFjdGVyLgorICAgICAgICogQHBhcmFtIGYgYSBjbGFzcyB0eXBlIChhcyByZXR1cm5lZCBmcm9tIGxvb2t1cF9jbGFzc25hbWUpLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBAcCBjIGlzIGEgbWVtYmVyIG9mIHRoZSBjbGFzc2lmaWNhdGlvbgorICAgICAgICogcmVwcmVzZW50ZWQgYnkgQHAgZiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3Mgc3RkOjpiYWRfY2FzdCBpZiB0aGUgY3VycmVudCBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGN0eXBlCisgICAgICAgKiAgICAgICAgIGZhY2V0LgorICAgICAgICovCisgICAgICBib29sCisgICAgICBpc2N0eXBlKF9DaF90eXBlIF9fYywgY2hhcl9jbGFzc190eXBlIF9fZikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnZlcnRzIGEgZGlnaXQgdG8gYW4gaW50LgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBjaCAgICBhIGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBkaWdpdC4KKyAgICAgICAqIEBwYXJhbSByYWRpeCB0aGUgcmFkaXggaWYgdGhlIG51bWVyaWMgY29udmVyc2lvbiAobGltaXRlZCB0byA4LCAxMCwKKyAgICAgICAqICAgICAgICAgICAgICBvciAxNikuCisgICAgICAgKiAKKyAgICAgICAqIEByZXR1cm5zIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZGlnaXQgY2ggaW4gYmFzZSByYWRpeCBpZiB0aGUKKyAgICAgICAqIGNoYXJhY3RlciBjaCBpcyBhIHZhbGlkIGRpZ2l0IGluIGJhc2UgcmFkaXg7IG90aGVyd2lzZSByZXR1cm5zIC0xLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIHZhbHVlKF9DaF90eXBlIF9fY2gsIGludCBfX3JhZGl4KSBjb25zdDsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgSW1idWVzIHRoZSByZWdleF90cmFpdHMgb2JqZWN0IHdpdGggYSBjb3B5IG9mIGEgbmV3IGxvY2FsZS4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gbG9jIEEgbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgcHJldmlvdXMgbG9jYWxlIGluIHVzZSBieSB0aGUgcmVnZXhfdHJhaXRzCisgICAgICAgKiAgICAgICAgICBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQG5vdGUgQ2FsbGluZyBpbWJ1ZSB3aXRoIGEgZGlmZmVyZW50IGxvY2FsZSB0aGFuIHRoZSBvbmUgY3VycmVudGx5IGluCisgICAgICAgKiAgICAgICB1c2UgaW52YWxpZGF0ZXMgYWxsIGNhY2hlZCBkYXRhIGhlbGQgYnkgKnRoaXMuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fbG9jYWxlLCBfX2xvYyk7CisJcmV0dXJuIF9fbG9jOworICAgICAgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGEgY29weSBvZiB0aGUgY3VycmVudCBsb2NhbGUgaW4gdXNlIGJ5IHRoZSByZWdleF90cmFpdHMKKyAgICAgICAqIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9sb2NhbGU7IH0KKyAgICAgIAorICAgIHByb3RlY3RlZDoKKyAgICAgIGxvY2FsZV90eXBlIF9NX2xvY2FsZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGJvb2wgcmVnZXhfdHJhaXRzPF9DaF90eXBlPjo6CisgICAgaXNjdHlwZShfQ2hfdHlwZSBfX2MsIGNoYXJfY2xhc3NfdHlwZSBfX2YpIGNvbnN0CisgICAgeworICAgICAgdXNpbmcgc3RkOjpjdHlwZTsKKyAgICAgIHVzaW5nIHN0ZDo6dXNlX2ZhY2V0OworICAgICAgY29uc3QgY3R5cGU8X0NoX3R5cGU+JiBfX2N0eXBlKHVzZV9mYWNldDwKKwkJCQkgICAgIGN0eXBlPF9DaF90eXBlPiA+KF9NX2xvY2FsZSkpOworICAgICAgCisgICAgICBpZiAoX19jdHlwZS5pcyhfX2MsIF9fZikpCisJcmV0dXJuIHRydWU7CisgICAgICAKKyAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiB1bmRlcnNjb3JlIGluIFtbOnc6XV0KKyAgICAgIGlmIChfX2MgPT0gX19jdHlwZS53aWRlbignXycpKQorCXsKKwkgIGNvbnN0IGNoYXIqIGNvbnN0IF9fd2JbXSA9ICJ3IjsKKwkgIGNoYXJfY2xhc3NfdHlwZSBfX3d0ID0gdGhpcy0+bG9va3VwX2NsYXNzbmFtZShfX3diLAorCQkJCQkJCV9fd2IgKyBzaXplb2YoX193YikpOworCSAgaWYgKF9fZiB8IF9fd3QpCisJICAgIHJldHVybiB0cnVlOworCX0KKyAgICAKKyAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBbWzpzcGFjZTpdXSBpbiBbWzpibGFuazpdXQorICAgICAgaWYgKF9fYyA9PSBfX2N0eXBlLmlzc3BhY2UoX19jKSkKKwl7CisJICBjb25zdCBjaGFyKiBjb25zdCBfX2JiW10gPSAiYmxhbmsiOworCSAgY2hhcl9jbGFzc190eXBlIF9fYnQgPSB0aGlzLT5sb29rdXBfY2xhc3NuYW1lKF9fYmIsCisJCQkJCQkJX19iYiArIHNpemVvZihfX2JiKSk7CisJICBpZiAoX19mIHwgX19idCkKKwkgICAgcmV0dXJuIHRydWU7CisJfQorICAgICAgCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlPgorICAgIGludCByZWdleF90cmFpdHM8X0NoX3R5cGU+OjoKKyAgICB2YWx1ZShfQ2hfdHlwZSBfX2NoLCBpbnQgX19yYWRpeCkgY29uc3QKKyAgICB7CisgICAgICBzdGQ6OmJhc2ljX2lzdHJpbmdzdHJlYW08X0NoX3R5cGU+IF9faXMoc3RyaW5nX3R5cGUoMSwgX19jaCkpOworICAgICAgaW50IF9fdjsKKyAgICAgIGlmIChfX3JhZGl4ID09IDgpCisJX19pcyA+PiBzdGQ6Om9jdDsKKyAgICAgIGVsc2UgaWYgKF9fcmFkaXggPT0gMTYpCisJX19pcyA+PiBzdGQ6OmhleDsKKyAgICAgIF9faXMgPj4gX192OworICAgICAgcmV0dXJuIF9faXMuZmFpbCgpID8gLTEgOiBfX3Y7CisgICAgfQorCisgIC8vIFs3LjhdIENsYXNzIGJhc2ljX3JlZ2V4CisgIC8qKgorICAgKiBPYmplY3RzIG9mIHNwZWNpYWxpemF0aW9ucyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCByZWd1bGFyIGV4cHJlc3Npb25zCisgICAqIGNvbnN0cnVjdGVkIGZyb20gc2VxdWVuY2VzIG9mIGNoYXJhY3RlciB0eXBlIEBwIF9DaF90eXBlLgorICAgKgorICAgKiBTdG9yYWdlIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgYXMKKyAgICogbmVjZXNzYXJ5IGJ5IHRoZSBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoaXMgY2xhc3MuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cyA9IHJlZ2V4X3RyYWl0czxfQ2hfdHlwZT4gPgorICAgIGNsYXNzIGJhc2ljX3JlZ2V4CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzOgorICAgICAgdHlwZWRlZiBfQ2hfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGZsYWdfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX1J4X3RyYWl0czo6bG9jYWxlX3R5cGUgIGxvY2FsZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUnhfdHJhaXRzOjpzdHJpbmdfdHlwZSAgc3RyaW5nX3R5cGU7CisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgQ29uc3RhbnRzCisgICAgICAgKiB0cjEgWzcuOC4xXSBzdGQgWzI4LjguMV0KKyAgICAgICAqLworICAgICAgLy9AeworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGljYXNlCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjppY2FzZTsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBub3N1YnMKKyAgICAgICAgPSByZWdleF9jb25zdGFudHM6Om5vc3ViczsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBvcHRpbWl6ZQorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6b3B0aW1pemU7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgY29sbGF0ZQorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Y29sbGF0ZTsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBFQ01BU2NyaXB0CisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0OworICAgICAgc3RhdGljIGNvbnN0IHJlZ2V4X2NvbnN0YW50czo6c3ludGF4X29wdGlvbl90eXBlIGJhc2ljCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjpiYXNpYzsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBleHRlbmRlZAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6ZXh0ZW5kZWQ7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgYXdrCisgICAgICAgID0gcmVnZXhfY29uc3RhbnRzOjphd2s7CisgICAgICBzdGF0aWMgY29uc3QgcmVnZXhfY29uc3RhbnRzOjpzeW50YXhfb3B0aW9uX3R5cGUgZ3JlcAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Z3JlcDsKKyAgICAgIHN0YXRpYyBjb25zdCByZWdleF9jb25zdGFudHM6OnN5bnRheF9vcHRpb25fdHlwZSBlZ3JlcAorICAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6ZWdyZXA7CisgICAgICAvL0B9CisKKyAgICAgIC8vIFs3LjguMl0gY29uc3RydWN0L2NvcHkvZGVzdHJveQorICAgICAgLyoqCisgICAgICAgKiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIHRoYXQgZG9lcyBub3QgbWF0Y2ggYW55CisgICAgICAgKiBjaGFyYWN0ZXIgc2VxdWVuY2UuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KCkKKyAgICAgIDogX01fZmxhZ3MocmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KSwgX01fcGF0dGVybigpLCBfTV9tYXJrX2NvdW50KDApCisgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHNlcXVlbmNlCisgICAgICAgKiBbcCwgcCArIGNoYXJfdHJhaXRzPF9DaF90eXBlPjo6bGVuZ3RoKHApKSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgKiBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBwIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcKKyAgICAgICAqICAgICAgICAgIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBwIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgZXhwbGljaXQKKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IF9DaF90eXBlKiBfX3AsCisJCSAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgIDogX01fZmxhZ3MoX19mKSwgX01fcGF0dGVybihfX3ApLCBfTV9tYXJrX2NvdW50KDApCisgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHNlcXVlbmNlCisgICAgICAgKiBbcCwgcCArIGxlbikgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncyBpbiBAcCBmLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBwICAgQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhcgorICAgICAgICogICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGxlbiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGYgICBGbGFncyBpbmRpY2F0aW5nIHRoZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBAcCBwIGlzIG5vdCBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgoY29uc3QgX0NoX3R5cGUqIF9fcCwgc3RkOjpzaXplX3QgX19sZW4sIGZsYWdfdHlwZSBfX2YpCisgICAgICA6IF9NX2ZsYWdzKF9fZikgLCBfTV9wYXR0ZXJuKF9fcCwgX19sZW4pLCBfTV9tYXJrX2NvdW50KDApCisgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5LWNvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHJocyBBIEBwIHJlZ2V4IG9iamVjdC4KKyAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4KGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIDogX01fZmxhZ3MoX19yaHMuX01fZmxhZ3MpLCBfTV9wYXR0ZXJuKF9fcmhzLl9NX3BhdHRlcm4pLAorCV9NX21hcmtfY291bnQoX19yaHMuX01fbWFya19jb3VudCkKKyAgICAgIHsgX01fY29tcGlsZSgpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBiYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgc3RyaW5nCisgICAgICAgKiBAcCBzIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gcyBBIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGYgRmxhZ3MgaW5kaWNhdGluZyB0aGUgc3ludGF4IHJ1bGVzIGFuZCBvcHRpb25zLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgcyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgYmFzaWNfcmVnZXgoY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCSAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorCTogX01fZmxhZ3MoX19mKSwgX01fcGF0dGVybihfX3MuYmVnaW4oKSwgX19zLmVuZCgpKSwgX01fbWFya19jb3VudCgwKQorICAgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb25zdHJ1Y3RzIGEgYmFzaWMgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHJhbmdlCisgICAgICAgKiBbZmlyc3QsIGxhc3QpIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZmxhZ3MgaW4gQHAgZi4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIHN0YXJ0IG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGxhc3QgIFRoZSBlbmQgb2YgYSByYW5nZSBjb250YWluaW5nIGEgdmFsaWQgcmVndWxhcgorICAgICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZiAgICAgVGhlIGZvcm1hdCBmbGFncyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgQHAgW2ZpcnN0LCBsYXN0KSBpcyBub3QgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorICAgICAgICBiYXNpY19yZWdleChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsIAorCQkgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKwk6IF9NX2ZsYWdzKF9fZiksIF9NX3BhdHRlcm4oX19maXJzdCwgX19sYXN0KSwgX01fbWFya19jb3VudCgwKQorICAgICAgICB7IF9NX2NvbXBpbGUoKTsgfQorCisjaWZkZWYgX0dMSUJDWFhfSU5DTFVERV9BU19DWFgwWAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29uc3RydWN0cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGwgIFRoZSBpbml0aWFsaXplciBsaXN0LgorICAgICAgICogQHBhcmFtIGYgIFRoZSBmb3JtYXQgZmxhZ3Mgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIGwgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleChpbml0aWFsaXplcl9saXN0PF9DaF90eXBlPiBfX2wsCisJCSAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKwk6IF9NX2ZsYWdzKF9fZiksIF9NX3BhdHRlcm4oX19sLmJlZ2luKCksIF9fbC5lbmQoKSksIF9NX21hcmtfY291bnQoMCkKKyAgICAgICAgeyBfTV9jb21waWxlKCk7IH0KKyNlbmRpZgorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXN0cm95cyBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAqLworICAgICAgfmJhc2ljX3JlZ2V4KCkKKyAgICAgIHsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIG9uZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYW5vdGhlci4KKyAgICAgICAqLworICAgICAgYmFzaWNfcmVnZXgmCisgICAgICBvcGVyYXRvcj0oY29uc3QgYmFzaWNfcmVnZXgmIF9fcmhzKQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fcmhzKTsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXBsYWNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgbmV3IG9uZSBjb25zdHJ1Y3RlZCBmcm9tCisgICAgICAgKiBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gQSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIG51bGwtdGVybWluYXRlZCBDLXN0eWxlIHN0cmluZworICAgICAgICogICAgICAgIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9DaF90eXBlKiBfX3ApCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19wLCBmbGFncygpKTsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBSZXBsYWNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgbmV3IG9uZSBjb25zdHJ1Y3RlZCBmcm9tCisgICAgICAgKiBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlcmFpdHMsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHlwZXJhaXRzLCBfQWxsb2NhdG9yPiYgX19zKQorICAgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oX19zLCBmbGFncygpKTsgfQorCisgICAgICAvLyBbNy44LjNdIGFzc2lnbgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgdGhlIHJlYWwgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gdGhhdCBBbm90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QuCisgICAgICAgKi8KKyAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3JlZ2V4JiBfX3RoYXQpCisgICAgICB7CisJYmFzaWNfcmVnZXggX190bXAoX190aGF0KTsKKwl0aGlzLT5zd2FwKF9fdG1wKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYQorICAgICAgICogQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHAgICAgIEEgcG9pbnRlciB0byBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nCisgICAgICAgKiAgICAgICAgICAgICAgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwKKyAgICAgICAqICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hfdHlwZSogX19wLAorCSAgICAgZmxhZ190eXBlIF9fZmxhZ3MgPSByZWdleF9jb25zdGFudHM6OkVDTUFTY3JpcHQpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19wKSwgX19mbGFncyk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QgZnJvbSBhCisgICAgICAgKiBDLXN0eWxlIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHAgICAgIEEgcG9pbnRlciB0byBhIEMtc3R5bGUgc3RyaW5nIGNvbnRhaW5pbmcgYQorICAgICAgICogICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgorICAgICAgICogQHBhcmFtIGxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHN0cmluZy4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwKKyAgICAgICAqICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihjb25zdCBfQ2hfdHlwZSogX19wLCBzdGQ6OnNpemVfdCBfX2xlbiwgZmxhZ190eXBlIF9fZmxhZ3MpCisgICAgICB7IHJldHVybiB0aGlzLT5hc3NpZ24oc3RyaW5nX3R5cGUoX19wLCBfX2xlbiksIF9fZmxhZ3MpOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSBuZXcgcmVndWxhciBleHByZXNzaW9uIHRvIGEgcmVnZXggb2JqZWN0IGZyb20gYSAKKyAgICAgICAqIHN0cmluZyBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgICAqIEBwYXJhbSBmbGFncyBTeW50YXggb3B0aW9uIGZsYWdzLgorICAgICAgICoKKyAgICAgICAqIEB0aHJvd3MgcmVnZXhfZXJyb3IgaWYgcCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBwYXR0ZXJuIGludGVycHJldGVkIGFjY29yZGluZyB0byBAcCBmbGFncy4gIElmIHJlZ2V4X2Vycm9yIGlzIHRocm93biwKKyAgICAgICAqICp0aGlzIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZXJhaXRzLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgICAgICBiYXNpY19yZWdleCYKKyAgICAgICAgYXNzaWduKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3R5cGVyYWl0cywgX0FsbG9jYXRvcj4mIF9fcywKKwkgICAgICAgZmxhZ190eXBlIF9fZiA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgeyAKKwkgIGJhc2ljX3JlZ2V4IF9fdG1wKF9fcywgX19mKTsKKwkgIHRoaXMtPnN3YXAoX190bXApOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gdG8gYSByZWdleCBvYmplY3QuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIGZpcnN0IFRoZSBzdGFydCBvZiBhIHJhbmdlIGNvbnRhaW5pbmcgYSB2YWxpZCByZWd1bGFyCisgICAgICAgKiAgICAgICAgICAgICAgZXhwcmVzc2lvbi4KKyAgICAgICAqIEBwYXJhbSBsYXN0ICBUaGUgZW5kIG9mIGEgcmFuZ2UgY29udGFpbmluZyBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uLgorICAgICAgICogQHBhcmFtIGZsYWdzIFN5bnRheCBvcHRpb24gZmxhZ3MuCisgICAgICAgKgorICAgICAgICogQHRocm93cyByZWdleF9lcnJvciBpZiBwIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAqIHBhdHRlcm4gaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIEBwIGZsYWdzLiAgSWYgcmVnZXhfZXJyb3IgaXMgdGhyb3duLAorICAgICAgICogdGhlIG9iamVjdCByZW1haW5zIHVuY2hhbmdlZC4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisgICAgICAgIGJhc2ljX3JlZ2V4JgorICAgICAgICBhc3NpZ24oX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAorCSAgICAgICBmbGFnX3R5cGUgX19mbGFncyA9IHJlZ2V4X2NvbnN0YW50czo6RUNNQVNjcmlwdCkKKyAgICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKHN0cmluZ190eXBlKF9fZmlyc3QsIF9fbGFzdCksIF9fZmxhZ3MpOyB9CisKKyNpZmRlZiBfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDBYCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBBc3NpZ25zIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHJlZ2V4IG9iamVjdC4KKyAgICAgICAqCisgICAgICAgKiBAcGFyYW0gbCAgICAgQW4gaW5pdGlhbGl6ZXIgbGlzdCByZXByZXNlbnRpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgKiBAcGFyYW0gZmxhZ3MgU3ludGF4IG9wdGlvbiBmbGFncy4KKyAgICAgICAqCisgICAgICAgKiBAdGhyb3dzIHJlZ2V4X2Vycm9yIGlmIEBwIGwgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHJlZ3VsYXIKKyAgICAgICAqIGV4cHJlc3Npb24gcGF0dGVybiBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gQHAgZmxhZ3MuICBJZiByZWdleF9lcnJvcgorICAgICAgICogaXMgdGhyb3duLCB0aGUgb2JqZWN0IHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICovCisgICAgICBiYXNpY19yZWdleCYKKyAgICAgIGFzc2lnbihpbml0aWFsaXplcl9saXN0PF9DaF90eXBlPiBfX2wsCisJICAgICBmbGFnX3R5cGUgX19mID0gcmVnZXhfY29uc3RhbnRzOjpFQ01BU2NyaXB0KQorICAgICAgeyByZXR1cm4gdGhpcy0+YXNzaWduKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9fZik7IH0KKyNlbmRpZgorCisgICAgICAvLyBbNy44LjRdIGNvbnN0IG9wZXJhdGlvbnMKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG51bWJlciBvZiBtYXJrZWQgc3ViZXhwcmVzc2lvbnMgd2l0aGluIHRoZSByZWd1bGFyCisgICAgICAgKiBleHByZXNzaW9uLgorICAgICAgICovCisgICAgICB1bnNpZ25lZCBpbnQKKyAgICAgIG1hcmtfY291bnQoKSBjb25zdAorICAgICAgeyByZXR1cm4gX01fbWFya19jb3VudDsgfQorICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBmbGFncyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgKiBvciBpbiB0aGUgbGFzdCBjYWxsIHRvIGFzc2lnbigpLgorICAgICAgICovCisgICAgICBmbGFnX3R5cGUKKyAgICAgIGZsYWdzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX2ZsYWdzOyB9CisgICAgICAKKyAgICAgIC8vIFs3LjguNV0gbG9jYWxlCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBJbWJ1ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBsb2MgQSBsb2NhbGUuCisgICAgICAgKi8KKyAgICAgIGxvY2FsZV90eXBlCisgICAgICBpbWJ1ZShsb2NhbGVfdHlwZSBfX2xvYykKKyAgICAgIHsgcmV0dXJuIF9NX3RyYWl0cy5pbWJ1ZShfX2xvYyk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbG9jYWxlIGN1cnJlbnRseSBpbWJ1ZWQgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICogICAgICAgIG9iamVjdC4KKyAgICAgICAqLworICAgICAgbG9jYWxlX3R5cGUKKyAgICAgIGdldGxvYygpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV90cmFpdHMuZ2V0bG9jKCk7IH0KKyAgICAgIAorICAgICAgLy8gWzcuOC42XSBzd2FwCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSByaHMgQW5vdGhlciByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKGJhc2ljX3JlZ2V4JiBfX3JocykKKyAgICAgIHsKKwlzdGQ6OnN3YXAoX01fZmxhZ3MsICAgICAgX19yaHMuX01fZmxhZ3MpOworCXN0ZDo6c3dhcChfTV9wYXR0ZXJuLCAgICBfX3Jocy5fTV9wYXR0ZXJuKTsKKwlzdGQ6OnN3YXAoX01fbWFya19jb3VudCwgX19yaHMuX01fbWFya19jb3VudCk7CisJc3RkOjpzd2FwKF9NX3RyYWl0cywgICAgIF9fcmhzLl9NX3RyYWl0cyk7CisgICAgICB9CisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGlsZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbnRvIGEgTkZBLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHZvaWQgX01fY29tcGlsZSgpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgZmxhZ190eXBlICAgIF9NX2ZsYWdzOworICAgICAgc3RyaW5nX3R5cGUgIF9NX3BhdHRlcm47CisgICAgICB1bnNpZ25lZCBpbnQgX01fbWFya19jb3VudDsKKyAgICAgIF9SeF90cmFpdHMgICBfTV90cmFpdHM7CisgICAgfTsKKyAgCisgIC8qKiBAYnJpZWYgU3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9ucy4gKi8KKyAgdHlwZWRlZiBiYXNpY19yZWdleDxjaGFyPiAgICByZWdleDsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFN0YW5kYXJkIHdpZGUtY2hhcmFjdGVyIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICovCisgIHR5cGVkZWYgYmFzaWNfcmVnZXg8d2NoYXJfdD4gd3JlZ2V4OworI2VuZGlmCisKKworICAvLyBbNy44LjZdIGJhc2ljX3JlZ2V4IHN3YXAKKyAgLyoqCisgICAqIEBicmllZiBTd2FwcyB0aGUgY29udGVudHMgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19saHMsCisJIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yaHMpCisgICAgeyBfX2xocy5zd2FwKF9fcmhzKTsgfQorCisKKyAgLy8gWzcuOV0gQ2xhc3MgdGVtcGxhdGUgc3ViX21hdGNoCisgIC8qKgorICAgKiBBIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgbWF0Y2hlZCBieSBhIHBhcnRpY3VsYXIgbWFya2VkIHN1Yi1leHByZXNzaW9uLgorICAgKgorICAgKiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBlc3NlbnRpYWxseSBhIHBhaXIgb2YgaXRlcmF0b3JzIG1hcmtpbmcgYQorICAgKiBtYXRjaGVkIHN1YmV4cHJlc3Npb24gd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gbWF0Y2guIFN1Y2gKKyAgICogb2JqZWN0cyBjYW4gYmUgY29udmVydGVkIHRvIGFuZCBjb21wYXJlZCB3aXRoIHN0ZDo6YmFzaWNfc3RyaW5nIG9iamVjdHMKKyAgICogb2YgYSBzaW1pbGFyIGJhc2UgY2hhcmFjdGVyIHR5cGUgYXMgdGhlIHBhdHRlcm4gbWF0Y2hlZCBieSB0aGUgcmVndWxhcgorICAgKiBleHByZXNzaW9uLgorICAgKgorICAgKiBUaGUgaXRlcmF0b3JzIHRoYXQgbWFrZSB1cCB0aGUgcGFpciBhcmUgdGhlIHVzdWFsIGhhbGYtb3BlbiBpbnRlcnZhbAorICAgKiByZWZlcmVuY2luZyB0aGUgYWN0dWFsIG9yaWdpbmFsIHBhdHRlcm4gbWF0Y2hlZC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgY2xhc3Mgc3ViX21hdGNoIDogcHVibGljIHN0ZDo6cGFpcjxfQmlJdGVyLCBfQmlJdGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6dmFsdWVfdHlwZSAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlJdGVyPjo6ZGlmZmVyZW5jZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIF9CaUl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisKKyAgICBwdWJsaWM6CisgICAgICBib29sIG1hdGNoZWQ7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGluZyBzZXF1ZW5jZS4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBsZW5ndGgoKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+bWF0Y2hlZCA/IHN0ZDo6ZGlzdGFuY2UodGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkgOiAwOyB9CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEdldHMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBzZXF1ZW5jZSBhcyBhIHN0cmluZy4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGlzIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9yLiAgSXQgaXMgaWRlbnRpY2FsIHRvIHRoZQorICAgICAgICogc3RyKCkgbWVtYmVyIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0IGl0IHdpbGwgd2FudCB0byBwb3AgdXAgaW4KKyAgICAgICAqIHVuZXhwZWN0ZWQgcGxhY2VzIGFuZCBjYXVzZSBhIGdyZWF0IGRlYWwgb2YgY29uZnVzaW9uIGFuZCBjdXJzaW5nCisgICAgICAgKiBmcm9tIHRoZSB1bndhcnkuCisgICAgICAgKi8KKyAgICAgIG9wZXJhdG9yIGJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPm1hdGNoZWQKKwkgID8gc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4odGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkKKwkgIDogc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4oKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgbWF0Y2hpbmcgc2VxdWVuY2UgYXMgYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHJldHVybnMgdGhlIG1hdGNoaW5nIHNlcXVlbmNlIGFzIGEgc3RyaW5nLgorICAgICAgICovCisgICAgICBiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4KKyAgICAgIHN0cigpIGNvbnN0CisgICAgICB7CisJcmV0dXJuIHRoaXMtPm1hdGNoZWQKKwkgID8gc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4odGhpcy0+Zmlyc3QsIHRoaXMtPnNlY29uZCkKKwkgIDogc3RkOjpiYXNpY19zdHJpbmc8dmFsdWVfdHlwZT4oKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBhbmQgYW5vdGhlciBtYXRjaGVkIHNlcXVlbmNlLgorICAgICAgICoKKyAgICAgICAqIEBwYXJhbSBzIEFub3RoZXIgbWF0Y2hlZCBzZXF1ZW5jZSB0byBjb21wYXJlIHRvIHRoaXMgb25lLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPTAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBzLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3Qgc3ViX21hdGNoJiBfX3MpIGNvbnN0CisgICAgICB7IHJldHVybiB0aGlzLT5zdHIoKS5jb21wYXJlKF9fcy5zdHIoKSk7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgdGhpcyBzdWJfbWF0Y2ggdG8gYSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQSBzdHJpbmcgdG8gY29tcGFyZSB0byB0aGlzIHN1Yl9tYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYmVmb3JlIEBwIHMuCisgICAgICAgKiBAcmV0dmFsID0wIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSBpcyBlcXVpdmFsZW50IHRvIEBwIHMuCisgICAgICAgKiBAcmV0dmFsIDwwIHRoaXMgbWF0Y2hlZCBzZXF1ZW5jZSB3aWxsIGNvbGxhdGUgYWZ0ZXIgQHAgcy4KKyAgICAgICAqLworICAgICAgaW50CisgICAgICBjb21wYXJlKGNvbnN0IGJhc2ljX3N0cmluZzx2YWx1ZV90eXBlPiYgX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c3RyKCkuY29tcGFyZShfX3MpOyB9CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIHRoaXMgc3ViX21hdGNoIHRvIGEgQy1zdHlsZSBzdHJpbmcuCisgICAgICAgKgorICAgICAgICogQHBhcmFtIHMgQSBDLXN0eWxlIHN0cmluZyB0byBjb21wYXJlIHRvIHRoaXMgc3ViX21hdGNoLgorICAgICAgICoKKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBiZWZvcmUgQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPTAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIGlzIGVxdWl2YWxlbnQgdG8gQHAgcy4KKyAgICAgICAqIEByZXR2YWwgPDAgdGhpcyBtYXRjaGVkIHNlcXVlbmNlIHdpbGwgY29sbGF0ZSBhZnRlciBAcCBzLgorICAgICAgICovCisgICAgICBpbnQKKyAgICAgIGNvbXBhcmUoY29uc3QgdmFsdWVfdHlwZSogX19zKSBjb25zdAorICAgICAgeyByZXR1cm4gdGhpcy0+c3RyKCkuY29tcGFyZShfX3MpOyB9CisgICAgfTsKKyAgCisgIAorICAvKiogQGJyaWVmIFN0YW5kYXJkIHJlZ2V4IHN1Ym1hdGNoIG92ZXIgYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjc3ViX21hdGNoOworICAvKiogQGJyaWVmIFN0YW5kYXJkIHJlZ2V4IHN1Ym1hdGNoIG92ZXIgYSBzdGFuZGFyZCBzdHJpbmcuICovCisgIHR5cGVkZWYgc3ViX21hdGNoPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzc3ViX21hdGNoOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIC8qKiBAYnJpZWYgUmVnZXggc3VibWF0Y2ggb3ZlciBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHdpZGUgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDxjb25zdCB3Y2hhcl90Kj4gICAgICAgICAgd2NzdWJfbWF0Y2g7CisgIC8qKiBAYnJpZWYgUmVnZXggc3VibWF0Y2ggb3ZlciBhIHN0YW5kYXJkIHdpZGUgc3RyaW5nLiAqLworICB0eXBlZGVmIHN1Yl9tYXRjaDx3c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gd3NzdWJfbWF0Y2g7CisjZW5kaWYKKworICAvLyBbNy45LjJdIHN1Yl9tYXRjaCBub24tbWVtYmVyIG9wZXJhdG9ycworICAKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPT0gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlJdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpICE9IDA7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiB0d28gcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoZXMuCisgICAqIEBwYXJhbSBsaHMgRmlyc3QgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIFNlY29uZCByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPChjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlJdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuY29tcGFyZShfX3JocykgPCAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA8PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpSXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5jb21wYXJlKF9fcmhzKSA+PSAwOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgdHdvIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaGVzLgorICAgKiBAcGFyYW0gbGhzIEZpcnN0IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBTZWNvbmQgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaUl0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaUl0ZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpSXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLmNvbXBhcmUoX19yaHMpID4gMDsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPT0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgKiAgICAgICAgc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzICE9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19saHMsIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgICB7IHJldHVybiBfX2xocyA8IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHJhaXRzLCB0eXBlbmFtZSBfQ2hfYWxsb2M+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsIAorCSAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA+IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX2xocywgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPj0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUsCisJICAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fbGhzLCBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA8PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA9PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSAhPSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgIF9DaF90cmFpdHMsIF9DaF9hbGxvYz4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpIDwgX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9DaF90cmFpdHMsIGNsYXNzIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICBjb25zdCBiYXNpY19zdHJpbmc8CisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9DaF90cmFpdHMsIGNsYXNzIF9DaF9hbGxvYz4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzwKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICAgICAgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPj0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgY2xhc3MgX0NoX3RyYWl0cywgY2xhc3MgX0NoX2FsbG9jPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgICAgICBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA8PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgQyBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIEMgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPT0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGFuIGl0ZXJhdG9yIHZhbHVlIGFuZCBhIHJlZ3VsYXIKKyAgICogICAgICAgIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyAhPSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgcHJlY2VkZXMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPCh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX2xocywKKwkgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA8IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBzdWNjZWVkcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzID4gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzID49IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBzdWNjZWVkIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjw9KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QqIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA8PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nPworICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyAgaXMgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPT0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBpbmVxdWl2YWxlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhCisgICAqICAgICAgICBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBwb2ludGVyIHRvIGEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBub3QgZXF1aXZhbGVudCB0byBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgIT0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaCBhbmQgYSBzdHJpbmcuCisgICAqIEBwYXJhbSBsaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSByaHMgQSBzdHJpbmcuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPCBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgc3VjY2VlZHMgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPihjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgc3RyaW5nLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBkb2VzIG5vdCBwcmVjZWRlIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0KiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA+PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIHN0cmluZy4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCogX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPD0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBlcXVpdmFsZW5jZSBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICogICAgICAgIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgICBjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocyA9PSBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uCisgICAqICAgICAgICBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgaXMgbm90IGVxdWl2YWxlbnQgdG8gQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yIT0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzICE9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSBzdHJpbmcgYW5kIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gbGhzIEEgc3RyaW5nLgorICAgKiBAcGFyYW0gcmhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcmV0dXJucyB0cnVlIGlmIEBhIGxocyBwcmVjZWRlcyBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8KHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fbGhzLAorCSAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDwgX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPiBfX3Jocy5zdHIoKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgc3RyaW5nIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIGxocyBBIHN0cmluZy4KKyAgICogQHBhcmFtIHJocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3QgcHJlY2VkZSBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+PSh0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX2xocywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMgPj0gX19yaHMuc3RyKCk7IH0KKworICAvKioKKyAgICogQGJyaWVmIFRlc3RzIHRoZSBvcmRlcmluZyBvZiBhIHN0cmluZyBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEBwYXJhbSBsaHMgQSBzdHJpbmcuCisgICAqIEBwYXJhbSByaHMgQSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2guCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHN1Y2NlZWQgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPD0odHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19saHMsCisJICAgICAgIGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzIDw9IF9fcmhzLnN0cigpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzICBpcyBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSA9PSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIGluZXF1aXZhbGVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEKKyAgICogICAgICAgIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGlzIG5vdCBlcXVpdmFsZW50IHRvIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IHN1Yl9tYXRjaDxfQmlfaXRlcj4mIF9fbGhzLAorCSAgICAgICB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlIGNvbnN0JiBfX3JocykKKyAgICB7IHJldHVybiBfX2xocy5zdHIoKSAhPSBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHByZWNlZGVzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPCBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIHN1Y2NlZWRzIEBhIHJocywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPiBfX3JoczsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgVGVzdHMgdGhlIG9yZGVyaW5nIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoIGFuZCBhIHN0cmluZy4KKyAgICogQHBhcmFtIGxocyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJtYXRjaC4KKyAgICogQHBhcmFtIHJocyBBIGNvbnN0IHN0cmluZyByZWZlcmVuY2UuCisgICAqIEByZXR1cm5zIHRydWUgaWYgQGEgbGhzIGRvZXMgbm90IHByZWNlZGUgQGEgcmhzLCBmYWxzZSBvdGhlcndpc2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlcj4KKyAgICBpbmxpbmUgYm9vbAorICAgIG9wZXJhdG9yPj0oY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19saHMsCisJICAgICAgIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgY29uc3QmIF9fcmhzKQorICAgIHsgcmV0dXJuIF9fbGhzLnN0cigpID49IF9fcmhzOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBUZXN0cyB0aGUgb3JkZXJpbmcgb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gc3VibWF0Y2ggYW5kIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gbGhzIEEgcmVndWxhciBleHByZXNzaW9uIHN1Ym1hdGNoLgorICAgKiBAcGFyYW0gcmhzIEEgY29uc3Qgc3RyaW5nIHJlZmVyZW5jZS4KKyAgICogQHJldHVybnMgdHJ1ZSBpZiBAYSBsaHMgZG9lcyBub3Qgc3VjY2VlZCBAYSByaHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCBzdWJfbWF0Y2g8X0JpX2l0ZXI+JiBfX2xocywKKwkgICAgICAgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSBjb25zdCYgX19yaHMpCisgICAgeyByZXR1cm4gX19saHMuc3RyKCkgPD0gX19yaHM7IH0KKworICAvKioKKyAgICogQGJyaWVmIEluc2VydHMgYSBtYXRjaGVkIHN0cmluZyBpbnRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAqCisgICAqIEBwYXJhbSBvcyBUaGUgb3V0cHV0IHN0cmVhbS4KKyAgICogQHBhcmFtIG0gIEEgc3VibWF0Y2ggc3RyaW5nLgorICAgKgorICAgKiBAcmV0dXJucyB0aGUgb3V0cHV0IHN0cmVhbSB3aXRoIHRoZSBzdWJtYXRjaCBzdHJpbmcgaW5zZXJ0ZWQuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0JpX2l0ZXI+CisgICAgaW5saW5lCisgICAgYmFzaWNfb3N0cmVhbTxfQ2hfdHlwZSwgX0NoX3RyYWl0cz4mCisgICAgb3BlcmF0b3I8PChiYXNpY19vc3RyZWFtPF9DaF90eXBlLCBfQ2hfdHJhaXRzPiYgX19vcywKKwkgICAgICAgY29uc3Qgc3ViX21hdGNoPF9CaV9pdGVyPiYgX19tKQorICAgIHsgcmV0dXJuIF9fb3MgPDwgX19tLnN0cigpOyB9CisKKyAgLy8gWzcuMTBdIENsYXNzIHRlbXBsYXRlIG1hdGNoX3Jlc3VsdHMKKyAgLyoqCisgICAqIEBicmllZiBUaGUgcmVzdWx0cyBvZiBhIG1hdGNoIG9yIHNlYXJjaCBvcGVyYXRpb24uCisgICAqCisgICAqIEEgY29sbGVjdGlvbiBvZiBjaGFyYWN0ZXIgc2VxdWVuY2VzIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0IG9mIGEgcmVndWxhcgorICAgKiBleHByZXNzaW9uIG1hdGNoLiAgU3RvcmFnZSBmb3IgdGhlIGNvbGxlY3Rpb24gaXMgYWxsb2NhdGVkIGFuZCBmcmVlZCBhcworICAgKiBuZWNlc3NhcnkgYnkgdGhlIG1lbWJlciBmdW5jdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGUgbWF0Y2hfcmVzdWx0cy4KKyAgICoKKyAgICogVGhpcyBjbGFzcyBzYXRpc2ZpZXMgdGhlIFNlcXVlbmNlIHJlcXVpcmVtZW50cywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQKKyAgICogb25seSB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciBhIGNvbnN0LXF1YWxpZmllZCBTZXF1ZW5jZSBhcmUgc3VwcG9ydGVkLgorICAgKgorICAgKiBUaGUgc3ViX21hdGNoIG9iamVjdCBzdG9yZWQgYXQgaW5kZXggMCByZXByZXNlbnRzIHN1Yi1leHByZXNzaW9uIDAsIGkuZS4KKyAgICogdGhlIHdob2xlIG1hdGNoLiBJbiB0aGlzIGNhc2UgdGhlIHN1Yl9tYXRjaCBtZW1iZXIgbWF0Y2hlZCBpcyBhbHdheXMgdHJ1ZS4KKyAgICogVGhlIHN1Yl9tYXRjaCBvYmplY3Qgc3RvcmVkIGF0IGluZGV4IG4gZGVub3RlcyB3aGF0IG1hdGNoZWQgdGhlIG1hcmtlZAorICAgKiBzdWItZXhwcmVzc2lvbiBuIHdpdGhpbiB0aGUgbWF0Y2hlZCBleHByZXNzaW9uLiBJZiB0aGUgc3ViLWV4cHJlc3Npb24gbgorICAgKiBwYXJ0aWNpcGF0ZWQgaW4gYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggdGhlbiB0aGUgc3ViX21hdGNoIG1lbWJlcgorICAgKiBtYXRjaGVkIGV2YWx1YXRlcyB0byB0cnVlLCBhbmQgbWVtYmVycyBmaXJzdCBhbmQgc2Vjb25kIGRlbm90ZSB0aGUgcmFuZ2UKKyAgICogb2YgY2hhcmFjdGVycyBbZmlyc3QsIHNlY29uZCkgd2hpY2ggZm9ybWVkIHRoYXQgbWF0Y2guIE90aGVyd2lzZSBtYXRjaGVkCisgICAqIGlzIGZhbHNlLCBhbmQgbWVtYmVycyBmaXJzdCBhbmQgc2Vjb25kIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlCisgICAqIHRoYXQgd2FzIHNlYXJjaGVkLgorICAgKgorICAgKiBAbm9zdWJncm91cGluZworICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0FsbG9jYXRvciA9IGFsbG9jYXRvcjxzdWJfbWF0Y2g8X0JpX2l0ZXI+ID4gPgorICAgIGNsYXNzIG1hdGNoX3Jlc3VsdHMKKyAgICA6IHByaXZhdGUgc3RkOjp2ZWN0b3I8c3RkOjp0cjE6OnN1Yl9tYXRjaDxfQmlfaXRlcj4sIF9BbGxvY2F0b3I+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6dHIxOjpzdWJfbWF0Y2g8X0JpX2l0ZXI+LCBfQWxsb2NhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4/IFB1YmxpYyBUeXBlcworICAgICAgICovCisgICAgICAvL0B7CisgICAgICB0eXBlZGVmIHN1Yl9tYXRjaDxfQmlfaXRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OmNvbnN0X3JlZmVyZW5jZSAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3RfcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZV90eXBlOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfaXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OmRpZmZlcmVuY2VfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY2F0b3I6OnNpemVfdHlwZSAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgX0FsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlfaXRlcj46OnZhbHVlX3R5cGUgIGNoYXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXJfdHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGU7CisgICAgICAvL0B9CisgIAorICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuMSBDb25zdHJ1Y3Rpb24sIENvcHlpbmcsIGFuZCBEZXN0cnVjdGlvbgorICAgICAgICovCisgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbnN0cnVjdHMgYSBkZWZhdWx0ICVtYXRjaF9yZXN1bHRzIGNvbnRhaW5lci4KKyAgICAgICAqIEBwb3N0IHNpemUoKSByZXR1cm5zIDAgYW5kIHN0cigpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICovCisgICAgICBleHBsaWNpdAorICAgICAgbWF0Y2hfcmVzdWx0cyhjb25zdCBfQWxsb2NhdG9yJiBfX2EgPSBfQWxsb2NhdG9yKCkpCisgICAgICA6IF9CYXNlX3R5cGUoX19hKSwgX01fbWF0Y2hlZChmYWxzZSkKKyAgICAgIHsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBDb3B5IGNvbnN0cnVjdHMgYSAlbWF0Y2hfcmVzdWx0cy4KKyAgICAgICAqLworICAgICAgbWF0Y2hfcmVzdWx0cyhjb25zdCBtYXRjaF9yZXN1bHRzJiBfX3JocykKKyAgICAgIDogX0Jhc2VfdHlwZShfX3JocyksIF9NX21hdGNoZWQoX19yaHMuX01fbWF0Y2hlZCksCisJX01fcHJlZml4KF9fcmhzLl9NX3ByZWZpeCksIF9NX3N1ZmZpeChfX3Jocy5fTV9zdWZmaXgpCisgICAgICB7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQXNzaWducyByaHMgdG8gKnRoaXMuCisgICAgICAgKi8KKyAgICAgIG1hdGNoX3Jlc3VsdHMmCisgICAgICBvcGVyYXRvcj0oY29uc3QgbWF0Y2hfcmVzdWx0cyYgX19yaHMpCisgICAgICB7CisJbWF0Y2hfcmVzdWx0cyBfX3RtcChfX3Jocyk7CisJdGhpcy0+c3dhcChfX3RtcCk7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZXN0cm95cyBhICVtYXRjaF9yZXN1bHRzIG9iamVjdC4KKyAgICAgICAqLworICAgICAgfm1hdGNoX3Jlc3VsdHMoKQorICAgICAgeyB9CisgICAgICAKKyAgICAgIC8vQH0KKworICAgICAgLyoqCisgICAgICAgKiBAbmFtZSAxMC4yIFNpemUKKyAgICAgICAqLworICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBhbmQgc3VibWF0Y2hlcy4KKyAgICAgICAqCisgICAgICAgKiBUaGUgbnVtYmVyIG9mIG1hdGNoZXMgZm9yIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpbGwgYmUgZWl0aGVyIDAKKyAgICAgICAqIGlmIHRoZXJlIHdhcyBubyBtYXRjaCBvciBtYXJrX2NvdW50KCkgKyAxIGlmIGEgbWF0Y2ggd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgKiBTb21lIG1hdGNoZXMgbWF5IGJlIGVtcHR5LgorICAgICAgICoKKyAgICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hlcyBmb3VuZC4KKyAgICAgICAqLworICAgICAgc2l6ZV90eXBlCisgICAgICBzaXplKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21hdGNoZWQgPyBfQmFzZV90eXBlOjpzaXplKCkgKyAxIDogMDsgfQorICAgICAgCisgICAgICAvL3NpemVfdHlwZQorICAgICAgLy9tYXhfc2l6ZSgpIGNvbnN0OworICAgICAgdXNpbmcgX0Jhc2VfdHlwZTo6bWF4X3NpemU7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluZGljYXRlcyBpZiB0aGUgJW1hdGNoX3Jlc3VsdHMgY29udGFpbnMgbm8gcmVzdWx0cy4KKyAgICAgICAqIEByZXR2YWwgdHJ1ZSBUaGUgJW1hdGNoX3Jlc3VsdHMgb2JqZWN0IGlzIGVtcHR5LgorICAgICAgICogQHJldHZhbCBmYWxzZSBUaGUgJW1hdGNoX3Jlc3VsdHMgb2JqZWN0IGlzIG5vdCBlbXB0eS4KKyAgICAgICAqLworICAgICAgYm9vbAorICAgICAgZW1wdHkoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKyAgICAgIAorICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjMgRWxlbWVudCBBY2Nlc3MKKyAgICAgICAqLworICAgICAgLy9AeworCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGluZGljYXRlZCBzdWJtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaWNhdGVkIHN1Ym1hdGNoLCBvciB0aGUKKyAgICAgICAqIGxlbmd0aCBvZiB0aGUgZW50aXJlIG1hdGNoIGlmIEBwIHN1YiBpcyB6ZXJvICh0aGUgZGVmYXVsdCkuCisgICAgICAgKi8KKyAgICAgIGRpZmZlcmVuY2VfdHlwZQorICAgICAgbGVuZ3RoKHNpemVfdHlwZSBfX3N1YiA9IDApIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9tYXRjaGVkID8gdGhpcy0+c3RyKF9fc3ViKS5sZW5ndGgoKSA6IDA7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluZGljYXRlZCBzdWJtYXRjaC4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhcmdldAorICAgICAgICogc2VxdWVuY2UgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3VibWF0Y2gsIHVubGVzcyB0aGUgdmFsdWUgb2YgQHAgc3ViCisgICAgICAgKiBpcyB6ZXJvICh0aGUgZGVmYXVsdCksIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQKKyAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgKiBtYXRjaC4KKyAgICAgICAqLworICAgICAgZGlmZmVyZW5jZV90eXBlCisgICAgICBwb3NpdGlvbihzaXplX3R5cGUgX19zdWIgPSAwKSBjb25zdAorICAgICAgeworCXJldHVybiBfTV9tYXRjaGVkID8gc3RkOjpkaXN0YW5jZSh0aGlzLT5wcmVmaXgoKS5maXJzdCwKKwkJCQkJICAoKnRoaXMpW19fc3ViXS5maXJzdCkgOiAwOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIHRoZSBtYXRjaCBvciBzdWJtYXRjaCBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdHlwZS4KKyAgICAgICAqIEBwYXJhbSBzdWIgaW5kaWNhdGVzIHRoZSBzdWJtYXRjaC4KKyAgICAgICAqCisgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHN1Ym1hdGNoIChvciBtYXRjaCwgaWYgQHAgc3ViIGlzIHplcm8pIGV4dHJhY3RlZAorICAgICAgICogZnJvbSB0aGUgdGFyZ2V0IHJhbmdlIGFuZCBjb252ZXJ0ZWQgdG8gdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHR5cGUuCisgICAgICAgKi8KKyAgICAgIHN0cmluZ190eXBlCisgICAgICBzdHIoc2l6ZV90eXBlIF9fc3ViID0gMCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX21hdGNoZWQgPyAoKnRoaXMpW19fc3ViXS5zdHIoKSA6IHN0cmluZ190eXBlKCk7IH0KKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVmZXJlbmNlIGZvciB0aGUgbWF0Y2ggb3Igc3VibWF0Y2guCisgICAgICAgKiBAcGFyYW0gc3ViIGluZGljYXRlcyB0aGUgc3VibWF0Y2guCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmRpY2F0ZWQgc3VibWF0Y2gsIG9yIHRoZSBlbnRpcmUKKyAgICAgICAqIG1hdGNoIGlmIEBwIHN1YiBpcyB6ZXJvLgorICAgICAgICoKKyAgICAgICAqIElmIEBwIHN1YiA+PSBzaXplKCkgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSAlc3ViX21hdGNoIHdpdGggYQorICAgICAgICogc3BlY2lhbCB2YWx1ZSBpbmRpY2F0aW5nIG5vIHN1Ym1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fc3ViKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6b3BlcmF0b3JbXShfX3N1Yik7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVwcmVzZW50aW5nIHRoZSBtYXRjaCBwcmVmaXguCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgJXN1Yl9tYXRjaCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICogcGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSB0YXJnZXQgcmFuZ2UgYW5kIHRoZQorICAgICAgICogc3RhcnQgb2YgdGhlIG1hdGNoLgorICAgICAgICovCisgICAgICBjb25zdF9yZWZlcmVuY2UKKyAgICAgIHByZWZpeCgpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9wcmVmaXg7IH0KKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhICVzdWJfbWF0Y2ggcmVwcmVzZW50aW5nIHRoZSBtYXRjaCBzdWZmaXguCisgICAgICAgKgorICAgICAgICogVGhpcyBmdW5jdGlvbiBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgJXN1Yl9tYXRjaCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICogcGFydCBvZiB0aGUgdGFyZ2V0IHJhbmdlIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbWF0Y2ggYW5kIHRoZSBlbmQgb2YKKyAgICAgICAqIHRoZSB0YXJnZXQgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIGNvbnN0X3JlZmVyZW5jZQorICAgICAgc3VmZml4KCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3N1ZmZpeDsgfQorCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgJXN1Yl9tYXRjaCBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgYmVnaW4oKSBjb25zdAorICAgICAgeyByZXR1cm4gX0Jhc2VfdHlwZTo6YmVnaW4oKTsgfQorICAgICAgCisjaWZkZWYgX0dMSUJDWFhfSU5DTFVERV9BU19DWFgwWAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlICVzdWJfbWF0Y2ggY29sbGVjdGlvbi4KKyAgICAgICAqLworICAgICAgY29uc3RfaXRlcmF0b3IKKyAgICAgIGNiZWdpbigpIGNvbnN0CisgICAgICB7IHJldHVybiBfQmFzZV90eXBlOjpiZWdpbigpOyB9CisjZW5kaWYKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhbiBpdGVyYXRvciB0byBvbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdF9pdGVyYXRvcgorICAgICAgZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmVuZCgpOyB9CisgICAgICAKKyNpZmRlZiBfR0xJQkNYWF9JTkNMVURFX0FTX0NYWDBYCisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBHZXRzIGFuIGl0ZXJhdG9yIHRvIG9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0X2l0ZXJhdG9yCisgICAgICBjZW5kKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9CYXNlX3R5cGU6OmVuZCgpOyB9CisjZW5kaWYKKworICAgICAgLy9AfQorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjQgRm9ybWF0dGluZworICAgICAgICoKKyAgICAgICAqIFRoZXNlIGZ1bmN0aW9ucyBwZXJmb3JtIGZvcm1hdHRlZCBzdWJzdGl0dXRpb24gb2YgdGhlIG1hdGNoZWQKKyAgICAgICAqIGNoYXJhY3RlciBzZXF1ZW5jZXMgaW50byB0aGVpciB0YXJnZXQuICBUaGUgZm9ybWF0IHNwZWNpZmllcnMKKyAgICAgICAqIGFuZCBlc2NhcGUgc2VxdWVuY2VzIGFjY2VwdGVkIGJ5IHRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAgICAgICAqIGRldGVybWluZWQgYnkgdGhlaXIgQHAgZmxhZ3MgcGFyYW1ldGVyIGFzIGRvY3VtZW50ZWQgYWJvdmUuCisgICAgICAgKi8KKyAgICAgICAvL0B7CisKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlcj4KKyAgICAgICAgX091dF9pdGVyCisgICAgICAgIGZvcm1hdChfT3V0X2l0ZXIgX19vdXQsIGNvbnN0IHN0cmluZ190eXBlJiBfX2ZtdCwKKwkgICAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCSAgICAgICA9IHJlZ2V4X2NvbnN0YW50czo6Zm9ybWF0X2RlZmF1bHQpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBzdHJpbmdfdHlwZQorICAgICAgZm9ybWF0KGNvbnN0IHN0cmluZ190eXBlJiBfX2ZtdCwKKwkgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkgICAgID0gcmVnZXhfY29uc3RhbnRzOjpmb3JtYXRfZGVmYXVsdCkgY29uc3Q7CisKKyAgICAgIC8vQH0gCisKKyAgICAgIC8qKgorICAgICAgICogQG5hbWUgMTAuNSBBbGxvY2F0b3IKKyAgICAgICAqLworICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgR2V0cyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRvci4KKyAgICAgICAqLworICAgICAgLy9hbGxvY2F0b3JfdHlwZQorICAgICAgLy9nZXRfYWxsb2NhdG9yKCkgY29uc3Q7CisgICAgICB1c2luZyBfQmFzZV90eXBlOjpnZXRfYWxsb2NhdG9yOworICAgICAgCisgICAgICAvL0B9IAorCisgICAgICAvKioKKyAgICAgICAqIEBuYW1lIDEwLjYgU3dhcAorICAgICAgICovCisgICAgICAgLy9AeyAKKworICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgU3dhcHMgdGhlIGNvbnRlbnRzIG9mIHR3byBtYXRjaF9yZXN1bHRzLgorICAgICAgICovCisgICAgICB2b2lkCisgICAgICBzd2FwKG1hdGNoX3Jlc3VsdHMmIF9fdGhhdCkKKyAgICAgIHsKKwlfQmFzZV90eXBlOjpzd2FwKF9fdGhhdCk7CisJc3RkOjpzd2FwKF9NX21hdGNoZWQsIF9fdGhhdC5fTV9tYXRjaGVkKTsKKwlzdGQ6OnN3YXAoX01fcHJlZml4LCAgX190aGF0Ll9NX3ByZWZpeCk7CisJc3RkOjpzd2FwKF9NX3N1ZmZpeCwgIF9fdGhhdC5fTV9zdWZmaXgpOworICAgICAgfQorICAgICAgLy9AfSAKKyAgICAgIAorICAgIHByaXZhdGU6CisgICAgICBib29sICAgICAgIF9NX21hdGNoZWQ7CisgICAgICB2YWx1ZV90eXBlIF9NX3ByZWZpeDsKKyAgICAgIHZhbHVlX3R5cGUgX01fc3VmZml4OworICAgIH07CisgIAorICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNtYXRjaDsKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPHN0cmluZzo6Y29uc3RfaXRlcmF0b3I+ICBzbWF0Y2g7CisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgdHlwZWRlZiBtYXRjaF9yZXN1bHRzPGNvbnN0IHdjaGFyX3QqPiAgICAgICAgICB3Y21hdGNoOworICB0eXBlZGVmIG1hdGNoX3Jlc3VsdHM8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzbWF0Y2g7CisjZW5kaWYKKworICAvLyBtYXRjaF9yZXN1bHRzIGNvbXBhcmlzb25zCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvIG1hdGNoX3Jlc3VsdHMgZm9yIGVxdWFsaXR5LgorICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0d28gb2JqZWN0cyByZWZlciB0byB0aGUgc2FtZSBtYXRjaCwKKyAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I9PShjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tMSwKKwkgICAgICAgY29uc3QgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbTIpOworCisgIC8qKgorICAgKiBAYnJpZWYgQ29tcGFyZXMgdHdvIG1hdGNoX3Jlc3VsdHMgZm9yIGluZXF1YWxpdHkuCisgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvYmplY3RzIGRvIG5vdCByZWZlciB0byB0aGUgc2FtZSBtYXRjaCwKKyAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIGNsYXNzIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvciE9KGNvbnN0IG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX20xLAorCSAgICAgICBjb25zdCBtYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tMikKKyAgICB7IHJldHVybiAhKF9fbTEgPT0gX19tMik7IH0KKworICAvLyBbNy4xMC42XSBtYXRjaF9yZXN1bHRzIHN3YXAKKyAgLyoqCisgICAqIEBicmllZiBTd2FwcyB0d28gbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIGxocyBBIG1hdGNoIHJlc3VsdC4KKyAgICogQHBhcmFtIHJocyBBIG1hdGNoIHJlc3VsdC4KKyAgICoKKyAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSB0d28gbWF0Y2hfcmVzdWx0cyBvYmplY3RzIGFyZSBzd2FwcGVkLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3I+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXIsIF9BbGxvY2F0b3I+JiBfX2xocywKKwkgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fcmhzKQorICAgIHsgX19saHMuc3dhcChfX3Jocyk7IH0KKworICAvLyBbNy4xMS4yXSBGdW5jdGlvbiB0ZW1wbGF0ZSByZWdleF9tYXRjaAorICAvKioKKyAgICogQG5hbWUgTWF0Y2hpbmcsIFNlYXJjaGluZywgYW5kIFJlcGxhY2luZworICAgKi8KKyAgLy9AeworCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhbGwgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBbZmlyc3QsIGxhc3QpLgorICAgKgorICAgKiBAcGFyYW0gZmlyc3QgQmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBsYXN0ICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBtICAgICBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICoKKyAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmlfaXRlciwgdHlwZW5hbWUgX0FsbG9jYXRvciwKKwkgICB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQltYXRjaF9yZXN1bHRzPF9CaV9pdGVyLCBfQWxsb2NhdG9yPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGFsbCBvZiB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIFtmaXJzdCwgbGFzdCkuCisgICAqCisgICAqIEBwYXJhbSBmaXJzdCBCZWdpbm5pbmcgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIGxhc3QgIE9uZS1wYXN0LXRoZS1lbmQgb2YgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBtYXRjaC4KKyAgICogQHBhcmFtIHJlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLCB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBib29sCisgICAgcmVnZXhfbWF0Y2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyAKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+IF9fd2hhdDsKKyAgICAgIHJldHVybiByZWdleF9tYXRjaChfX2ZpcnN0LCBfX2xhc3QsIF9fd2hhdCwgX19yZSwgX19mbGFncyk7CisgICAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIHMgIFRoZSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBtICBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmICBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgX0NoX3R5cGUqIF9fcywKKwkJbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hfdHlwZSosIF9BbGxvY2F0b3I+JiBfX20sCisJCWNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fbSwgX19yZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhIG1hdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBAcCBlCisgICAqIGFuZCBhIHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtIHMgICAgIFRoZSBzdHJpbmcgdG8gbWF0Y2guCisgICAqIEBwYXJhbSBtICAgICBUaGUgbWF0Y2ggcmVzdWx0cy4KKyAgICogQHBhcmFtIHJlICAgIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmbGFncyBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9DaF9hbGxvYywKKwkgICB0eXBlbmFtZSBfQWxsb2NhdG9yLCB0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X21hdGNoKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgX0NoX3RyYWl0cywgX0NoX2FsbG9jPiYgX19zLAorCQltYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwgCisJCV9DaF90cmFpdHMsIF9DaF9hbGxvYz46OmNvbnN0X2l0ZXJhdG9yLCBfQWxsb2NhdG9yPiYgX19tLAorCQljb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fcmUsCisJCXJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLmJlZ2luKCksIF9fcy5lbmQoKSwgX19tLCBfX3JlLCBfX2ZsYWdzKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gcyAgVGhlIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBtYXRjaC4KKyAgICogQHBhcmFtIHJlIFRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAqIEBwYXJhbSBmICBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90eXBlLCBjbGFzcyBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgX0NoX3R5cGUqIF9fcywKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfbWF0Y2goX19zLCBfX3MgKyBfUnhfdHJhaXRzOjpsZW5ndGgoX19zKSwgX19yZSwgX19mKTsgfQorCisgIC8qKgorICAgKiBAYnJpZWYgSW5kaWNhdGVzIGlmIHRoZXJlIGlzIGEgbWF0Y2ggYmV0d2VlbiB0aGUgcmVndWxhciBleHByZXNzaW9uIEBwIGUKKyAgICogYW5kIGEgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gcyAgICAgW0lOXSBUaGUgc3RyaW5nIHRvIG1hdGNoLgorICAgKiBAcGFyYW0gcmUgICAgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uLgorICAgKiBAcGFyYW0gZmxhZ3MgW0lOXSBDb250cm9scyBob3cgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLgorICAgKgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggZXhpc3RzLgorICAgKiBAcmV0dmFsIGZhbHNlIE90aGVyd2lzZS4KKyAgICoKKyAgICogQHRocm93cyBhbiBleGNlcHRpb24gb2YgdHlwZSByZWdleF9lcnJvci4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaF90cmFpdHMsIHR5cGVuYW1lIF9TdHJfYWxsb2NhdG9yLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfbWF0Y2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfU3RyX2FsbG9jYXRvcj4mIF9fcywKKwkJY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX3JlLAorCQlyZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCT0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X21hdGNoKF9fcy5iZWdpbigpLCBfX3MuZW5kKCksIF9fcmUsIF9fZmxhZ3MpOyB9CisKKyAgLy8gWzcuMTEuM10gRnVuY3Rpb24gdGVtcGxhdGUgcmVnZXhfc2VhcmNoCisgIC8qKgorICAgKiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgcmFuZ2UuCisgICAqIEBwYXJhbSBmaXJzdCBbSU5dICBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBsYXN0ICBbSU5dICBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gbSAgICAgW09VVF0gVGhlIG1hdGNoIHJlc3VsdHMuCisgICAqIEBwYXJhbSByZSAgICBbSU5dICBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IuCisgICAqIEBwYXJhbSBmbGFncyBbSU5dICBTZWFyY2ggcG9saWN5IGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqCisgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9BbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goX0JpX2l0ZXIgX19maXJzdCwgX0JpX2l0ZXIgX19sYXN0LAorCQkgbWF0Y2hfcmVzdWx0czxfQmlfaXRlciwgX0FsbG9jYXRvcj4mIF9fbSwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAvKioKKyAgICogU2VhcmNoZXMgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHJhbmdlLgorICAgKiBAcGFyYW0gZmlyc3QgW0lOXSAgVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgdG8gc2VhcmNoLgorICAgKiBAcGFyYW0gbGFzdCAgW0lOXSAgT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIHJlICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsIHR5cGVuYW1lIF9DaF90eXBlLCB0eXBlbmFtZSBfUnhfdHJhaXRzPgorICAgIGlubGluZSBib29sCisgICAgcmVnZXhfc2VhcmNoKF9CaV9pdGVyIF9fZmlyc3QsIF9CaV9pdGVyIF9fbGFzdCwKKwkJIGNvbnN0IGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiYgX19yZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsKKyAgICAgIG1hdGNoX3Jlc3VsdHM8X0JpX2l0ZXI+IF9fd2hhdDsKKyAgICAgIHJldHVybiByZWdleF9zZWFyY2goX19maXJzdCwgX19sYXN0LCBfX3doYXQsIF9fcmUsIF9fZmxhZ3MpOworICAgIH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBDLXN0cmluZy4KKyAgICogQHBhcmFtIHMgW0lOXSAgQSBDLXN0cmluZyB0byBzZWFyY2ggZm9yIHRoZSByZWdleC4KKyAgICogQHBhcmFtIG0gW09VVF0gVGhlIHNldCBvZiByZWdleCBtYXRjaGVzLgorICAgKiBAcGFyYW0gZSBbSU5dICBUaGUgcmVnZXggdG8gc2VhcmNoIGZvciBpbiBAcCBzLgorICAgKiBAcGFyYW0gZiBbSU5dICBUaGUgc2VhcmNoIGZsYWdzLgorICAgKiBAcmV0dmFsIHRydWUgIEEgbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAcmV0dmFsIGZhbHNlIE5vIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZywgdGhlIGNvbnRlbnQgb2YgJW0gaXMKKyAgICogICAgICAgICAgICAgICB1bmRlZmluZWQuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgY2xhc3MgX0FsbG9jYXRvciwgY2xhc3MgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQkgbWF0Y2hfcmVzdWx0czxjb25zdCBfQ2hfdHlwZSosIF9BbGxvY2F0b3I+JiBfX20sCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZgorCQkgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeyByZXR1cm4gcmVnZXhfc2VhcmNoKF9fcywgX19zICsgX1J4X3RyYWl0czo6bGVuZ3RoKF9fcyksIF9fbSwgX19lLCBfX2YpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgQy1zdHJpbmcuCisgICAqIEBwYXJhbSBzIFtJTl0gIFRoZSBDLXN0cmluZyB0byBzZWFyY2guCisgICAqIEBwYXJhbSBlIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGYgW0lOXSAgU2VhcmNoIHBvbGljeSBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEBkb2N0b2RvCisgICAqCisgICAqIEB0aHJvd3MgYW4gZXhjZXB0aW9uIG9mIHR5cGUgcmVnZXhfZXJyb3IuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hfdHlwZSwgdHlwZW5hbWUgX1J4X3RyYWl0cz4KKyAgICBpbmxpbmUgYm9vbAorICAgIHJlZ2V4X3NlYXJjaChjb25zdCBfQ2hfdHlwZSogX19zLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MsIF9fcyArIF9SeF90cmFpdHM6Omxlbmd0aChfX3MpLCBfX2UsIF9fZik7IH0KKworICAvKioKKyAgICogQGJyaWVmIFNlYXJjaGVzIGZvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoaW4gYSBzdHJpbmcuCisgICAqIEBwYXJhbSBzICAgICBbSU5dICBUaGUgc3RyaW5nIHRvIHNlYXJjaC4KKyAgICogQHBhcmFtIGUgICAgIFtJTl0gIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICogQHBhcmFtIGZsYWdzIFtJTl0gIFNlYXJjaCBwb2xpY3kgZmxhZ3MuCisgICAqIEByZXR2YWwgdHJ1ZSAgQSBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcuCisgICAqIEByZXR2YWwgZmFsc2UgTm8gbWF0Y2ggd2FzIGZvdW5kIHdpdGhpbiB0aGUgc3RyaW5nLgorICAgKiBAZG9jdG9kbworICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX1N0cmluZ19hbGxvY2F0b3IsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUsIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLAorCQkgX1N0cmluZ19hbGxvY2F0b3I+JiBfX3MsCisJCSBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fZmxhZ3MKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsIF9fZmxhZ3MpOyB9CisKKyAgLyoqCisgICAqIEBicmllZiBTZWFyY2hlcyBmb3IgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aGluIGEgc3RyaW5nLgorICAgKiBAcGFyYW0gcyBbSU5dICBBIEMrKyBzdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgcmVnZXguCisgICAqIEBwYXJhbSBtIFtPVVRdIFRoZSBzZXQgb2YgcmVnZXggbWF0Y2hlcy4KKyAgICogQHBhcmFtIGUgW0lOXSAgVGhlIHJlZ2V4IHRvIHNlYXJjaCBmb3IgaW4gQHAgcy4KKyAgICogQHBhcmFtIGYgW0lOXSAgVGhlIHNlYXJjaCBmbGFncy4KKyAgICogQHJldHZhbCB0cnVlICBBIG1hdGNoIHdhcyBmb3VuZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgICogQHJldHZhbCBmYWxzZSBObyBtYXRjaCB3YXMgZm91bmQgd2l0aGluIHRoZSBzdHJpbmcsIHRoZSBjb250ZW50IG9mICVtIGlzCisgICAqICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoX3RyYWl0cywgdHlwZW5hbWUgX0NoX2FsbG9jLAorCSAgIHR5cGVuYW1lIF9BbGxvY2F0b3IsIHR5cGVuYW1lIF9DaF90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHM+CisgICAgaW5saW5lIGJvb2wKKyAgICByZWdleF9zZWFyY2goY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlLCBfQ2hfdHJhaXRzLCBfQ2hfYWxsb2M+JiBfX3MsCisJCSBtYXRjaF9yZXN1bHRzPHR5cGVuYW1lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZSwKKwkJIF9DaF90cmFpdHMsIF9DaF9hbGxvYz46OmNvbnN0X2l0ZXJhdG9yLCBfQWxsb2NhdG9yPiYgX19tLAorCQkgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2YKKwkJID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KQorICAgIHsgcmV0dXJuIHJlZ2V4X3NlYXJjaChfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX20sIF9fZSwgX19mKTsgfQorCisgIC8vIHRyMSBbNy4xMS40XSBzdGQgWzI4LjExLjRdIEZ1bmN0aW9uIHRlbXBsYXRlIHJlZ2V4X3JlcGxhY2UKKyAgLyoqCisgICAqIEBkb2N0b2RvCisgICAqIEBwYXJhbSBvdXQKKyAgICogQHBhcmFtIGZpcnN0CisgICAqIEBwYXJhbSBsYXN0CisgICAqIEBwYXJhbSBlCisgICAqIEBwYXJhbSBmbXQKKyAgICogQHBhcmFtIGZsYWdzCisgICAqCisgICAqIEByZXR1cm5zIG91dAorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKgorICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9PdXRfaXRlciwgdHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX1J4X3RyYWl0cywgdHlwZW5hbWUgX0NoX3R5cGU+CisgICAgaW5saW5lIF9PdXRfaXRlcgorICAgIHJlZ2V4X3JlcGxhY2UoX091dF9pdGVyIF9fb3V0LCBfQmlfaXRlciBfX2ZpcnN0LCBfQmlfaXRlciBfX2xhc3QsCisJCSAgY29uc3QgYmFzaWNfcmVnZXg8X0NoX3R5cGUsIF9SeF90cmFpdHM+JiBfX2UsCisJCSAgY29uc3QgYmFzaWNfc3RyaW5nPF9DaF90eXBlPiYgX19mbXQsCisJCSAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19mbGFncworCQkgID0gcmVnZXhfY29uc3RhbnRzOjptYXRjaF9kZWZhdWx0KTsKKworICAvKioKKyAgICogQGRvY3RvZG8KKyAgICogQHBhcmFtIHMKKyAgICogQHBhcmFtIGUKKyAgICogQHBhcmFtIGZtdAorICAgKiBAcGFyYW0gZmxhZ3MKKyAgICoKKyAgICogQHJldHVybnMgYSBjb3B5IG9mIHN0cmluZyBAcCBzIHdpdGggcmVwbGFjZW1lbnRzLgorICAgKgorICAgKiBAdGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIHJlZ2V4X2Vycm9yLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1J4X3RyYWl0cywgdHlwZW5hbWUgX0NoX3R5cGU+CisgICAgaW5saW5lIGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4KKyAgICByZWdleF9yZXBsYWNlKGNvbnN0IGJhc2ljX3N0cmluZzxfQ2hfdHlwZT4mIF9fcywKKwkJICBjb25zdCBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4mIF9fZSwKKwkJICBjb25zdCBiYXNpY19zdHJpbmc8X0NoX3R5cGU+JiBfX2ZtdCwKKwkJICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX2ZsYWdzCisJCSAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpCisgICAgeworICAgICAgc3RkOjpzdHJpbmcgX19yZXN1bHQ7CisgICAgICByZWdleF9yZXBsYWNlKHN0ZDo6YmFja19pbnNlcnRlcihfX3Jlc3VsdCksCisJCSAgICBfX3MuYmVnaW4oKSwgX19zLmVuZCgpLCBfX2UsIF9fZm10LCBfX2ZsYWdzKTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdDsKKyAgICB9CisKKyAgLy9AfQorCisgIC8vIHRyMSBbNy4xMi4xXSBzdGQgWzI4LjEyXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF9pdGVyYXRvcgorICAvKioKKyAgICogQW4gaXRlcmF0b3IgYWRhcHRvciB0aGF0IHdpbGwgcHJvdmlkZSByZXBlYXRlZCBjYWxscyBvZiByZWdleF9zZWFyY2ggb3ZlciAKKyAgICogYSByYW5nZSB1bnRpbCBubyBtb3JlIG1hdGNoZXMgcmVtYWluLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0JpX2l0ZXIsCisJICAgdHlwZW5hbWUgX0NoX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpX2l0ZXI+Ojp2YWx1ZV90eXBlLAorCSAgIHR5cGVuYW1lIF9SeF90cmFpdHMgPSByZWdleF90cmFpdHM8X0NoX3R5cGU+ID4KKyAgICBjbGFzcyByZWdleF9pdGVyYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIGJhc2ljX3JlZ2V4PF9DaF90eXBlLCBfUnhfdHJhaXRzPiAgcmVnZXhfdHlwZTsKKyAgICAgIHR5cGVkZWYgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgICB2YWx1ZV90eXBlOworICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZyAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgIHB1YmxpYzoKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFByb3ZpZGVzIGEgc2luZ3VsYXIgaXRlcmF0b3IsIHVzZWZ1bCBmb3IgaW5kaWNhdGluZworICAgICAgICogb25lLXBhc3QtdGhlLWVuZCBvZiBhIHJhbmdlLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfaXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICBbSU5dIFRoZSBzdGFydCBvZiBhIHRleHQgcmFuZ2UgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCByYW5nZSB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgW0lOXSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoLgorICAgICAgICogQHBhcmFtIG0gIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoX0JpX2l0ZXIgX19hLCBfQmlfaXRlciBfX2IsIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCSAgICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvcHkgY29uc3RydWN0cyBhICVyZWdleF9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3IoY29uc3QgcmVnZXhfaXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvcj09KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlKgorICAgICAgb3BlcmF0b3ItPigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICogQGRvY3RvZG8KKyAgICAgICAqLworICAgICAgcmVnZXhfaXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF9pdGVyYXRvcgorICAgICAgb3BlcmF0b3IrKyhpbnQpOworICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIHRoZXNlIG1lbWJlcnMgYXJlIHNob3duIGZvciBleHBvc2l0aW9uIG9ubHk6CisgICAgICBfQmlfaXRlciAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjsKKyAgICAgIF9CaV9pdGVyICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgIGNvbnN0IHJlZ2V4X3R5cGUqICAgICAgICAgICAgICAgIHByZWdleDsKKyAgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIGZsYWdzOworICAgICAgbWF0Y2hfcmVzdWx0czxfQmlfaXRlcj4gICAgICAgICAgbWF0Y2g7CisgICAgfTsKKyAgCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3QgY2hhcio+ICAgICAgICAgICAgIGNyZWdleF9pdGVyYXRvcjsKKyAgdHlwZWRlZiByZWdleF9pdGVyYXRvcjxzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yPiAgc3JlZ2V4X2l0ZXJhdG9yOworI2lmZGVmIF9HTElCQ1hYX1VTRV9XQ0hBUl9UCisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfaXRlcmF0b3I7CisgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfaXRlcmF0b3I7CisjZW5kaWYKKworICAvLyBbNy4xMi4yXSBDbGFzcyB0ZW1wbGF0ZSByZWdleF90b2tlbl9pdGVyYXRvcgorICAvKioKKyAgICogSXRlcmF0ZXMgb3ZlciBzdWJtYXRjaGVzIGluIGEgcmFuZ2UgKG9yIEBhIHNwbGl0cyBhIHRleHQgc3RyaW5nKS4KKyAgICoKKyAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpdGVyYXRvciBpcyB0byBlbnVtZXJhdGUgYWxsLCBvciBhbGwgc3BlY2lmaWVkLAorICAgKiBtYXRjaGVzIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGhpbiBhIHRleHQgcmFuZ2UuICBUaGUgZGVyZWZlcmVuY2VkCisgICAqIHZhbHVlIG9mIGFuIGl0ZXJhdG9yIG9mIHRoaXMgY2xhc3MgaXMgYSBzdGQ6OnRyMTo6c3ViX21hdGNoIG9iamVjdC4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CaV9pdGVyLAorCSAgIHR5cGVuYW1lIF9DaF90eXBlID0gdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CaV9pdGVyPjo6dmFsdWVfdHlwZSwKKwkgICB0eXBlbmFtZSBfUnhfdHJhaXRzID0gcmVnZXhfdHJhaXRzPF9DaF90eXBlPiA+CisgICAgY2xhc3MgcmVnZXhfdG9rZW5faXRlcmF0b3IKKyAgICB7CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBiYXNpY19yZWdleDxfQ2hfdHlwZSwgX1J4X3RyYWl0cz4gcmVnZXhfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3ViX21hdGNoPF9CaV9pdGVyPiAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90ICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnICAgICAgICAgaXRlcmF0b3JfY2F0ZWdvcnk7CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICAvKioKKyAgICAgICAqIEBicmllZiBEZWZhdWx0IGNvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIAorICAgICAgICogQSBkZWZhdWx0LWNvbnN0cnVjdGVkICVyZWdleF90b2tlbl9pdGVyYXRvciBpcyBhIHNpbmd1bGFyIGl0ZXJhdG9yCisgICAgICAgKiB0aGF0IHdpbGwgY29tcGFyZSBlcXVhbCB0byB0aGUgb25lLXBhc3QtdGhlLWVuZCB2YWx1ZSBmb3IgYW55CisgICAgICAgKiBpdGVyYXRvciBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcigpOworICAgICAgCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBiICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgICAgICAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICAgICAqIEBwYXJhbSBzdWJtYXRjaCAgIFtJTl0gV2hpY2ggc3VibWF0Y2ggdG8gcmV0dXJuLiAgVGhlcmUgYXJlIHNvbWUKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCB2YWx1ZXMgZm9yIHRoaXMgcGFyYW1ldGVyOgorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtIC0xIGVhY2ggZW51bWVyYXRlZCBzdWJleHByZXNzaW9uIGRvZXMgTk9UCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAoYWthIGZpZWxkCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR0aW5nKQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAtIDAgdGhlIGVudGlyZSBzdHJpbmcgbWF0Y2hpbmcgdGhlCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZXhwcmVzc2lvbiBpcyByZXR1cm5lZCBmb3IgZWFjaCBtYXRjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLSA+MCBlbnVtZXJhdGVzIG9ubHkgdGhlIGluZGljYXRlZAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmV4cHJlc3Npb24gZnJvbSBhIG1hdGNoIHdpdGhpbiB0aGUgdGV4dC4KKyAgICAgICAqIEBwYXJhbSBtICAgICAgICAgIFtJTl0gUG9saWN5IGZsYWdzIGZvciBtYXRjaCBydWxlcy4KKyAgICAgICAqCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqIEBkb2N0b2RvCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLCBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgaW50IF9fc3VibWF0Y2ggPSAwLAorCQkJICAgcmVnZXhfY29uc3RhbnRzOjptYXRjaF9mbGFnX3R5cGUgX19tCisJCQkgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQ29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4uLgorICAgICAgICogQHBhcmFtIGEgICAgICAgICAgW0lOXSBUaGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gc2VhcmNoLgorICAgICAgICogQHBhcmFtIGIgICAgICAgICAgW0lOXSBPbmUtcGFzdC10aGUtZW5kIG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSByZSAgICAgICAgIFtJTl0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLgorICAgICAgICogQHBhcmFtIHN1Ym1hdGNoZXMgW0lOXSBBIGxpc3Qgb2Ygc3ViZXhwcmVzc2lvbnMgdG8gcmV0dXJuIGZvciBlYWNoCisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCB3aXRoaW4gdGhlIHRleHQuCisgICAgICAgKiBAcGFyYW0gbSAgICAgICAgICBbSU5dIFBvbGljeSBmbGFncyBmb3IgbWF0Y2ggcnVsZXMuCisgICAgICAgKgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICByZWdleF90b2tlbl9pdGVyYXRvcihfQmlfaXRlciBfX2EsIF9CaV9pdGVyIF9fYiwKKwkJCSAgIGNvbnN0IHJlZ2V4X3R5cGUmIF9fcmUsCisJCQkgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBfX3N1Ym1hdGNoZXMsCisJCQkgICByZWdleF9jb25zdGFudHM6Om1hdGNoX2ZsYWdfdHlwZSBfX20KKwkJCSAgICAgPSByZWdleF9jb25zdGFudHM6Om1hdGNoX2RlZmF1bHQpOworCisgICAgICAvKioKKyAgICAgICAqIENvbnN0cnVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuLi4KKyAgICAgICAqIEBwYXJhbSBhICAgICAgICAgIFtJTl0gVGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHNlYXJjaC4KKyAgICAgICAqIEBwYXJhbSBiICAgICAgICAgIFtJTl0gT25lLXBhc3QtdGhlLWVuZCBvZiB0aGUgdGV4dCB0byBzZWFyY2guCisgICAgICAgKiBAcGFyYW0gcmUgICAgICAgICBbSU5dIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvci4KKyAgICAgICAqIEBwYXJhbSBzdWJtYXRjaGVzIFtJTl0gQSBsaXN0IG9mIHN1YmV4cHJlc3Npb25zIHRvIHJldHVybiBmb3IgZWFjaAorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggd2l0aGluIHRoZSB0ZXh0LgorICAgICAgICogQHBhcmFtIG0gICAgICAgICAgW0lOXSBQb2xpY3kgZmxhZ3MgZm9yIG1hdGNoIHJ1bGVzLgorICAgICAgIAorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKiBAZG9jdG9kbworICAgICAgICovCisgICAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTm0+CisgICAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKF9CaV9pdGVyIF9fYSwgX0JpX2l0ZXIgX19iLAorCQkJICAgICBjb25zdCByZWdleF90eXBlJiBfX3JlLAorCQkJICAgICBjb25zdCBpbnQgKCZfX3N1Ym1hdGNoZXMpW19ObV0sCisJCQkgICAgIHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZmxhZ190eXBlIF9fbQorCQkJICAgICA9IHJlZ2V4X2NvbnN0YW50czo6bWF0Y2hfZGVmYXVsdCk7CisKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvcHkgY29uc3RydWN0cyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEBwYXJhbSByaHMgW0lOXSBBICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBjb3B5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yKGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEFzc2lnbnMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlci4KKyAgICAgICAqIEBwYXJhbSByaHMgW0lOXSBBICVyZWdleF90b2tlbl9pdGVyYXRvciB0byBjb3B5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIENvbXBhcmVzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yIHRvIGFub3RoZXIgZm9yIGVxdWFsaXR5LgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgcmVnZXhfdG9rZW5faXRlcmF0b3ImIF9fcmhzKTsKKyAgICAgIAorICAgICAgLyoqCisgICAgICAgKiBAYnJpZWYgQ29tcGFyZXMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgdG8gYW5vdGhlciBmb3IgaW5lcXVhbGl0eS4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBib29sCisgICAgICBvcGVyYXRvciE9KGNvbnN0IHJlZ2V4X3Rva2VuX2l0ZXJhdG9yJiBfX3Jocyk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIERlcmVmZXJlbmNlcyBhICVyZWdleF90b2tlbl9pdGVyYXRvci4KKyAgICAgICAqIEB0b2RvIEltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICovCisgICAgICBjb25zdCB2YWx1ZV90eXBlJgorICAgICAgb3BlcmF0b3IqKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFNlbGVjdHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IgbWVtYmVyLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqCisgICAgICBvcGVyYXRvci0+KCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIEluY3JlbWVudHMgYSAlcmVnZXhfdG9rZW5faXRlcmF0b3IuCisgICAgICAgKiBAdG9kbyBJbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAqLworICAgICAgcmVnZXhfdG9rZW5faXRlcmF0b3ImCisgICAgICBvcGVyYXRvcisrKCk7CisgICAgICAKKyAgICAgIC8qKgorICAgICAgICogQGJyaWVmIFBvc3RpbmNyZW1lbnRzIGEgJXJlZ2V4X3Rva2VuX2l0ZXJhdG9yLgorICAgICAgICogQHRvZG8gSW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uCisgICAgICAgKi8KKyAgICAgIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yCisgICAgICBvcGVyYXRvcisrKGludCk7CisgICAgICAKKyAgICBwcml2YXRlOiAvLyBkYXRhIG1lbWJlcnMgZm9yIGV4cG9zaXRpb24gb25seToKKyAgICAgIHR5cGVkZWYgcmVnZXhfaXRlcmF0b3I8X0JpX2l0ZXIsIF9DaF90eXBlLCBfUnhfdHJhaXRzPiBwb3NpdGlvbl9pdGVyYXRvcjsKKworICAgICAgcG9zaXRpb25faXRlcmF0b3IgX19wb3NpdGlvbjsKKyAgICAgIGNvbnN0IHZhbHVlX3R5cGUqIF9fcmVzdWx0OworICAgICAgdmFsdWVfdHlwZSAgICAgICAgX19zdWZmaXg7CisgICAgICBzdGQ6OnNpemVfdCAgICAgICBfX247CisgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICBfX3N1YnM7CisgICAgfTsKKworICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBDLXN0eWxlIE5VTEwtdGVybWluYXRlZCBzdHJpbmdzLiAqLworICB0eXBlZGVmIHJlZ2V4X3Rva2VuX2l0ZXJhdG9yPGNvbnN0IGNoYXIqPiAgICAgICAgICAgICBjcmVnZXhfdG9rZW5faXRlcmF0b3I7CisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIHN0YW5kYXJkIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8c3RyaW5nOjpjb25zdF9pdGVyYXRvcj4gIHNyZWdleF90b2tlbl9pdGVyYXRvcjsKKyNpZmRlZiBfR0xJQkNYWF9VU0VfV0NIQVJfVAorICAvKiogQGJyaWVmIFRva2VuIGl0ZXJhdG9yIGZvciBDLXN0eWxlIE5VTEwtdGVybWluYXRlZCB3aWRlIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8Y29uc3Qgd2NoYXJfdCo+ICAgICAgICAgIHdjcmVnZXhfdG9rZW5faXRlcmF0b3I7CisgIC8qKiBAYnJpZWYgVG9rZW4gaXRlcmF0b3IgZm9yIHN0YW5kYXJkIHdpZGUtY2hhcmFjdGVyIHN0cmluZ3MuICovCisgIHR5cGVkZWYgcmVnZXhfdG9rZW5faXRlcmF0b3I8d3N0cmluZzo6Y29uc3RfaXRlcmF0b3I+IHdzcmVnZXhfdG9rZW5faXRlcmF0b3I7CisjZW5kaWYKKyAgCisgIC8vQH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfUkVHRVgKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3JpZW1hbm5femV0YS50Y2MgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9yaWVtYW5uX3pldGEudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmUyMGUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9yaWVtYW5uX3pldGEudGNjCkBAIC0wLDAgKzEsNDM2IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKy8vCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3JpZW1hbm5femV0YS50Y2MKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkIG9uOgorLy8gICAoMSkgSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucywKKy8vICAgICAgIEVkLiBieSBNaWx0b24gQWJyYW1vd2l0eiBhbmQgSXJlbmUgQS4gU3RlZ3VuLAorLy8gICAgICAgRG92ZXIgUHVibGljYXRpb25zLCBOZXctWW9yaywgU2VjdGlvbiA1LCBwcC4gODA3LTgwOC4KKy8vICAgKDIpIFRoZSBHbnUgU2NpZW50aWZpYyBMaWJyYXJ5LCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ3NsCisvLyAgICgzKSBHYW1tYSwgRXhwbG9yaW5nIEV1bGVyJ3MgQ29uc3RhbnQsIEp1bGlhbiBIYXZpbCwKKy8vICAgICAgIFByaW5jZXRvbiwgMjAwMy4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfUklFTUFOTl9aRVRBX1RDQworI2RlZmluZSBfR0xJQkNYWF9UUjFfUklFTUFOTl9aRVRBX1RDQyAxCisKKyNpbmNsdWRlICJzcGVjaWFsX2Z1bmN0aW9uX3V0aWwuaCIKKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CisgIC8vIFs1LjJdIFNwZWNpYWwgZnVuY3Rpb25zCisKKyAgLy8gSW1wbGVtZW50YXRpb24tc3BhY2UgZGV0YWlscy4KKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBDb21wdXRlIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHMpIEBmJAorICAgICAqICAgICAgICAgICBieSBzdW1tYXRpb24gZm9yIHMgPiAxLgorICAgICAqIAorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSBcc3VtX3trPTF9XntcaW5mdHl9IFxmcmFjezF9e2tee3N9fSBmb3IgcyA+IDEKKyAgICAgKiAgICBcZl0KKyAgICAgKiAgIEZvciBzIDwgMSB1c2UgdGhlIHJlZmxlY3Rpb24gZm9ybXVsYToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gMl5zIFxwaV57cy0xfSBcR2FtbWEoMS1zKSBcemV0YSgxLXMpCisgICAgICogICAgXGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIF9UcAorICAgIF9fcmllbWFubl96ZXRhX3N1bShjb25zdCBfVHAgX19zKQorICAgIHsKKyAgICAgIC8vICBBIHVzZXIgc2hvdWxkbid0IGdldCB0byB0aGlzLgorICAgICAgaWYgKF9fcyA8IF9UcCgxKSkKKyAgICAgICAgc3RkOjpfX3Rocm93X2RvbWFpbl9lcnJvcihfX04oIkJhZCBhcmd1bWVudCBpbiB6ZXRhIHN1bS4iKSk7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfaXRlciA9IDEwMDAwOworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9fayA9IDE7IF9fayA8IG1heF9pdGVyOyArK19faykKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBzdGQ6OnBvdyhzdGF0aWNfY2FzdDxfVHA+KF9fayksIC1fX3MpOworICAgICAgICAgIGlmIChfX3Rlcm0gPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgX196ZXRhICs9IF9fdGVybTsKKyAgICAgICAgfQorCisgICAgICByZXR1cm4gX196ZXRhOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIEV2YWx1YXRlIHRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHMpIEBmJAorICAgICAqICAgICAgICAgICBieSBhbiBhbHRlcm5hdGUgc2VyaWVzIGZvciBzID4gMC4KKyAgICAgKiAKKyAgICAgKiAgIFRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXHN1bV97az0xfV57XGluZnR5fSBcZnJhY3sxfXtrXntzfX0gZm9yIHMgPiAxCisgICAgICogICAgXGZdCisgICAgICogICBGb3IgcyA8IDEgdXNlIHRoZSByZWZsZWN0aW9uIGZvcm11bGE6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IDJecyBccGlee3MtMX0gXEdhbW1hKDEtcykgXHpldGEoMS1zKQorICAgICAqICAgIFxmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3JpZW1hbm5femV0YV9hbHQoY29uc3QgX1RwIF9fcykKKyAgICB7CisgICAgICBfVHAgX19zZ24gPSBfVHAoMSk7CisgICAgICBfVHAgX196ZXRhID0gX1RwKDApOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19pID0gMTsgX19pIDwgMTAwMDAwMDA7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgX1RwIF9fdGVybSA9IF9fc2duIC8gc3RkOjpwb3coX19pLCBfX3MpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0pIDwgc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3pldGEgKz0gX190ZXJtOworICAgICAgICAgIF9fc2duICo9IF9UcCgtMSk7CisgICAgICAgIH0KKyAgICAgIF9femV0YSAvPSBfVHAoMSkgLSBzdGQ6OnBvdyhfVHAoMiksIF9UcCgxKSAtIF9fcyk7CisKKyAgICAgIHJldHVybiBfX3pldGE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgRXZhbHVhdGUgdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBieSBzZXJpZXMgZm9yIGFsbCBzICE9IDEuCisgICAgICogICAgICAgICAgIENvbnZlcmdlbmNlIGlzIGdyZWF0IHVudGlsIGxhcmdpc2ggbmVnYXRpdmUgbnVtYmVycy4KKyAgICAgKiAgICAgICAgICAgVGhlbiB0aGUgY29udmVyZ2VuY2Ugb2YgdGhlID4gMCBzdW0gZ2V0cyBiZXR0ZXIuCisgICAgICoKKyAgICAgKiAgIFRoZSBzZXJpZXMgaXM6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxmcmFjezF9ezEtMl57MS1zfX0KKyAgICAgKiAgICAgICAgICAgICAgICAgXHN1bV97bj0wfV57XGluZnR5fSBcZnJhY3sxfXsyXntuKzF9fQorICAgICAqICAgICAgICAgICAgICAgICBcc3VtX3trPTB9XntufSAoLTEpXmsgXGZyYWN7biF9eyhuLWspIWshfSAoaysxKV57LXN9CisgICAgICogICAgXGZdCisgICAgICogICBIYXZpbCAyMDAzLCBwLiAyMDYuCisgICAgICoKKyAgICAgKiAgIFRoZSBSaWVtYW5uIHpldGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBieToKKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXHN1bV97az0xfV57XGluZnR5fSBcZnJhY3sxfXtrXntzfX0gZm9yIHMgPiAxCisgICAgICogICAgXGZdCisgICAgICogICBGb3IgcyA8IDEgdXNlIHRoZSByZWZsZWN0aW9uIGZvcm11bGE6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IDJecyBccGlee3MtMX0gXEdhbW1hKDEtcykgXHpldGEoMS1zKQorICAgICAqICAgIFxmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX3JpZW1hbm5femV0YV9nbG9iKGNvbnN0IF9UcCBfX3MpCisgICAgeworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAvLyAgTWF4IGUgZXhwb25lbnQgYmVmb3JlIG92ZXJmbG93LgorICAgICAgY29uc3QgX1RwIF9fbWF4X2JpbmNvZWZmID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXhfZXhwb25lbnQxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpsb2coX1RwKDEwKSkgLSBfVHAoMSk7CisKKyAgICAgIC8vICBUaGlzIHNlcmllcyB3b3JrcyB1bnRpbCB0aGUgYmlub21pYWwgY29lZmZpY2llbnQgYmxvd3MgdXAKKyAgICAgIC8vICBzbyB1c2UgcmVmbGVjdGlvbi4KKyAgICAgIGlmIChfX3MgPCBfVHAoMCkpCisgICAgICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgaWYgKHN0ZDo6dHIxOjpmbW9kKF9fcyxfVHAoMikpID09IF9UcCgwKSkKKyAgICAgICAgICAgIHJldHVybiBfVHAoMCk7CisgICAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9UcCBfX3pldGEgPSBfX3JpZW1hbm5femV0YV9nbG9iKF9UcCgxKSAtIF9fcyk7CisgICAgICAgICAgICAgIF9femV0YSAqPSBzdGQ6OnBvdyhfVHAoMikKKyAgICAgICAgICAgICAgICAgICAgICogX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCksIF9fcykKKyAgICAgICAgICAgICAgICAgICAgICogc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fcykKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEpIC0gX19zKSkKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKF9fbG9nX2dhbW1hKF9UcCgxKSAtIF9fcykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisgICAgICAgICAgICAgIHJldHVybiBfX3pldGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgX1RwIF9fbnVtID0gX1RwKDAuNUwpOworICAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbWF4aXQgPSAxMDAwMDsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8IF9fbWF4aXQ7ICsrX19pKQorICAgICAgICB7CisgICAgICAgICAgYm9vbCBfX3B1bnQgPSBmYWxzZTsKKyAgICAgICAgICBfVHAgX19zZ24gPSBfVHAoMSk7CisgICAgICAgICAgX1RwIF9fdGVybSA9IF9UcCgwKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2ogPSAwOyBfX2ogPD0gX19pOyArK19faikKKyAgICAgICAgICAgIHsKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgIF9UcCBfX2JpbmNvZWZmID0gIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19qKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9faSAtIF9faikpOworI2Vsc2UKKyAgICAgICAgICAgICAgX1RwIF9fYmluY29lZmYgPSAgX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9faikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIF9fbG9nX2dhbW1hKF9UcCgxICsgX19pIC0gX19qKSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgaWYgKF9fYmluY29lZmYgPiBfX21heF9iaW5jb2VmZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAvLyAgVGhpcyBvbmx5IGdldHMgaGl0IGZvciB4IDw8IDAuCisgICAgICAgICAgICAgICAgICBfX3B1bnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfX2JpbmNvZWZmID0gc3RkOjpleHAoX19iaW5jb2VmZik7CisgICAgICAgICAgICAgIF9fdGVybSArPSBfX3NnbiAqIF9fYmluY29lZmYgKiBzdGQ6OnBvdyhfVHAoMSArIF9faiksIC1fX3MpOworICAgICAgICAgICAgICBfX3NnbiAqPSBfVHAoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX3B1bnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3Rlcm0gKj0gX19udW07CisgICAgICAgICAgX196ZXRhICs9IF9fdGVybTsKKyAgICAgICAgICBpZiAoc3RkOjphYnMoX190ZXJtL19femV0YSkgPCBfX2VwcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIF9fbnVtICo9IF9UcCgwLjVMKTsKKyAgICAgICAgfQorCisgICAgICBfX3pldGEgLz0gX1RwKDEpIC0gc3RkOjpwb3coX1RwKDIpLCBfVHAoMSkgLSBfX3MpOworCisgICAgICByZXR1cm4gX196ZXRhOworICAgIH0KKworCisgICAgLyoqCisgICAgICogICBAYnJpZWYgIENvbXB1dGUgdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBAZiQgXHpldGEocykgQGYkCisgICAgICogICAgICAgICAgIHVzaW5nIHRoZSBwcm9kdWN0IG92ZXIgcHJpbWUgZmFjdG9ycy4KKyAgICAgKiAgICBcZlsKKyAgICAgKiAgICAgIFx6ZXRhKHMpID0gXFBpX3tpPTF9XlxpbmZ0eSBcZnJhY3sxfXsxIC0gcF9pXnstc319CisgICAgICogICAgXGZdCisgICAgICogICAgd2hlcmUgQGYkIHtwX2l9IEBmJCBhcmUgdGhlIHByaW1lIG51bWJlcnMuCisgICAgICogCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICAgXGZbCisgICAgICogICAgICBcemV0YShzKSA9IFxzdW1fe2s9MX1ee1xpbmZ0eX0gXGZyYWN7MX17a157c319IGZvciBzID4gMQorICAgICAqICAgIFxmXQorICAgICAqICAgRm9yIHMgPCAxIHVzZSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSAyXnMgXHBpXntzLTF9IFxHYW1tYSgxLXMpIFx6ZXRhKDEtcykKKyAgICAgKiAgICBcZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19yaWVtYW5uX3pldGFfcHJvZHVjdChjb25zdCBfVHAgX19zKQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBfVHAgX19wcmltZVtdID0geworICAgICAgICBfVHAoMiksIF9UcCgzKSwgX1RwKDUpLCBfVHAoNyksIF9UcCgxMSksIF9UcCgxMyksIF9UcCgxNyksIF9UcCgxOSksCisgICAgICAgIF9UcCgyMyksIF9UcCgyOSksIF9UcCgzMSksIF9UcCgzNyksIF9UcCg0MSksIF9UcCg0MyksIF9UcCg0NyksCisgICAgICAgIF9UcCg1MyksIF9UcCg1OSksIF9UcCg2MSksIF9UcCg2NyksIF9UcCg3MSksIF9UcCg3MyksIF9UcCg3OSksCisgICAgICAgIF9UcCg4MyksIF9UcCg4OSksIF9UcCg5NyksIF9UcCgxMDEpLCBfVHAoMTAzKSwgX1RwKDEwNyksIF9UcCgxMDkpCisgICAgICB9OworICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBfX251bV9wcmltZXMgPSBzaXplb2YoX19wcmltZSkgLyBzaXplb2YoX1RwKTsKKworICAgICAgX1RwIF9femV0YSA9IF9UcCgxKTsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IF9faSA9IDA7IF9faSA8IF9fbnVtX3ByaW1lczsgKytfX2kpCisgICAgICAgIHsKKyAgICAgICAgICBjb25zdCBfVHAgX19mYWN0ID0gX1RwKDEpIC0gc3RkOjpwb3coX19wcmltZVtfX2ldLCAtX19zKTsKKyAgICAgICAgICBfX3pldGEgKj0gX19mYWN0OworICAgICAgICAgIGlmIChfVHAoMSkgLSBfX2ZhY3QgPCBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmVwc2lsb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgIF9femV0YSA9IF9UcCgxKSAvIF9femV0YTsKKworICAgICAgcmV0dXJuIF9femV0YTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICAgQGJyaWVmICBSZXR1cm4gdGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBAZiQgXHpldGEocykgQGYkLgorICAgICAqIAorICAgICAqICAgVGhlIFJpZW1hbm4gemV0YSBmdW5jdGlvbiBpcyBkZWZpbmVkIGJ5OgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSBcc3VtX3trPTF9XntcaW5mdHl9IGteey1zfSBmb3IgcyA+IDEKKyAgICAgKiAgICAgICAgICAgICAgICAgXGZyYWN7KDJccGkpXnN9e3BpfSBzaW4oXGZyYWN7XHBpIHN9ezJ9KQorICAgICAqICAgICAgICAgICAgICAgICBcR2FtbWEgKDEgLSBzKSBcemV0YSAoMSAtIHMpIGZvciBzIDwgMQorICAgICAqICAgIFxmXQorICAgICAqICAgRm9yIHMgPCAxIHVzZSB0aGUgcmVmbGVjdGlvbiBmb3JtdWxhOgorICAgICAqICAgIFxmWworICAgICAqICAgICAgXHpldGEocykgPSAyXnMgXHBpXntzLTF9IFxHYW1tYSgxLXMpIFx6ZXRhKDEtcykKKyAgICAgKiAgICBcZl0KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgX1RwCisgICAgX19yaWVtYW5uX3pldGEoY29uc3QgX1RwIF9fcykKKyAgICB7CisgICAgICBpZiAoX19pc25hbihfX3MpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjpxdWlldF9OYU4oKTsKKyAgICAgIGVsc2UgaWYgKF9fcyA9PSBfVHAoMSkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPF9UcD46OmluZmluaXR5KCk7CisgICAgICBlbHNlIGlmIChfX3MgPCAtX1RwKDE5KSkKKyAgICAgICAgeworICAgICAgICAgIF9UcCBfX3pldGEgPSBfX3JpZW1hbm5femV0YV9wcm9kdWN0KF9UcCgxKSAtIF9fcyk7CisgICAgICAgICAgX196ZXRhICo9IHN0ZDo6cG93KF9UcCgyKSAqIF9fbnVtZXJpY19jb25zdGFudHM8X1RwPjo6X19waSgpLCBfX3MpCisgICAgICAgICAgICAgICAgICogc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fcykKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgICAgICogc3RkOjpleHAoc3RkOjp0cjE6OmxnYW1tYShfVHAoMSkgLSBfX3MpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgKiBzdGQ6OmV4cChfX2xvZ19nYW1tYShfVHAoMSkgLSBfX3MpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgIC8gX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpKCk7CisgICAgICAgICAgcmV0dXJuIF9femV0YTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoX19zIDwgX1RwKDIwKSkKKyAgICAgICAgeworICAgICAgICAgIC8vICBHbG9iYWwgZG91YmxlIHN1bSBvciBNY0xhdXJpbj8KKyAgICAgICAgICBib29sIF9fZ2xvYiA9IHRydWU7CisgICAgICAgICAgaWYgKF9fZ2xvYikKKyAgICAgICAgICAgIHJldHVybiBfX3JpZW1hbm5femV0YV9nbG9iKF9fcyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoX19zID4gX1RwKDEpKQorICAgICAgICAgICAgICAgIHJldHVybiBfX3JpZW1hbm5femV0YV9zdW0oX19zKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9UcCBfX3pldGEgPSBzdGQ6OnBvdyhfVHAoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX251bWVyaWNfY29uc3RhbnRzPF9UcD46Ol9fcGkoKSwgX19zKQorICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpzaW4oX19udW1lcmljX2NvbnN0YW50czxfVHA+OjpfX3BpXzIoKSAqIF9fcykKKyNpZiBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjp0cjE6OnRnYW1tYShfVHAoMSkgLSBfX3MpCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0ZDo6ZXhwKF9fbG9nX2dhbW1hKF9UcCgxKSAtIF9fcykpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBfX3JpZW1hbm5femV0YV9zdW0oX1RwKDEpIC0gX19zKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBfX3pldGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBfX3JpZW1hbm5femV0YV9wcm9kdWN0KF9fcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBIdXJ3aXR6IHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHgscykgQGYkCisgICAgICogICAgICAgICAgIGZvciBhbGwgcyAhPSAxIGFuZCB4ID4gLTEuCisgICAgICogCisgICAgICogICBUaGUgSHVyd2l0eiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHpldGEoeCxzKSA9IFxzdW1fe249MH1ee1xpbmZ0eX0gXGZyYWN7MX17KG4gKyB4KV5zfQorICAgICAqICAgQGZdCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHMpID0gXHpldGEoMSxzKQorICAgICAqICAgQGZdCisgICAgICogCisgICAgICogICBUaGlzIGZ1bmN0aW9ucyB1c2VzIHRoZSBkb3VibGUgc3VtIHRoYXQgY29udmVyZ2VzIGZvciBzICE9IDEKKyAgICAgKiAgIGFuZCB4ID4gLTE6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHpldGEoeCxzKSA9IFxmcmFjezF9e3MtMX0KKyAgICAgKiAgICAgICAgICAgICAgICBcc3VtX3tuPTB9XntcaW5mdHl9IFxmcmFjezF9e24gKyAxfQorICAgICAqICAgICAgICAgICAgICAgIFxzdW1fe2s9MH1ee259ICgtMSleayBcZnJhY3tuIX17KG4taykhayF9ICh4K2spXnstc30KKyAgICAgKiAgIEBmXQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBfVHAKKyAgICBfX2h1cndpdHpfemV0YV9nbG9iKGNvbnN0IF9UcCBfX2EsIGNvbnN0IF9UcCBfX3MpCisgICAgeworICAgICAgX1RwIF9femV0YSA9IF9UcCgwKTsKKworICAgICAgY29uc3QgX1RwIF9fZXBzID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjplcHNpbG9uKCk7CisgICAgICAvLyAgTWF4IGUgZXhwb25lbnQgYmVmb3JlIG92ZXJmbG93LgorICAgICAgY29uc3QgX1RwIF9fbWF4X2JpbmNvZWZmID0gc3RkOjpudW1lcmljX2xpbWl0czxfVHA+OjptYXhfZXhwb25lbnQxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RkOjpsb2coX1RwKDEwKSkgLSBfVHAoMSk7CisKKyAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBfX21heGl0ID0gMTAwMDA7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBfX2kgPSAwOyBfX2kgPCBfX21heGl0OyArK19faSkKKyAgICAgICAgeworICAgICAgICAgIGJvb2wgX19wdW50ID0gZmFsc2U7CisgICAgICAgICAgX1RwIF9fc2duID0gX1RwKDEpOworICAgICAgICAgIF9UcCBfX3Rlcm0gPSBfVHAoMCk7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgX19qID0gMDsgX19qIDw9IF9faTsgKytfX2opCisgICAgICAgICAgICB7CisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIX1RSMQorICAgICAgICAgICAgICBfVHAgX19iaW5jb2VmZiA9ICBzdGQ6OnRyMTo6bGdhbW1hKF9UcCgxICsgX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RkOjp0cjE6OmxnYW1tYShfVHAoMSArIF9faikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0ZDo6dHIxOjpsZ2FtbWEoX1RwKDEgKyBfX2kgLSBfX2opKTsKKyNlbHNlCisgICAgICAgICAgICAgIF9UcCBfX2JpbmNvZWZmID0gIF9fbG9nX2dhbW1hKF9UcCgxICsgX19pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gX19sb2dfZ2FtbWEoX1RwKDEgKyBfX2opKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBfX2xvZ19nYW1tYShfVHAoMSArIF9faSAtIF9faikpOworI2VuZGlmCisgICAgICAgICAgICAgIGlmIChfX2JpbmNvZWZmID4gX19tYXhfYmluY29lZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgLy8gIFRoaXMgb25seSBnZXRzIGhpdCBmb3IgeCA8PCAwLgorICAgICAgICAgICAgICAgICAgX19wdW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX19iaW5jb2VmZiA9IHN0ZDo6ZXhwKF9fYmluY29lZmYpOworICAgICAgICAgICAgICBfX3Rlcm0gKz0gX19zZ24gKiBfX2JpbmNvZWZmICogc3RkOjpwb3coX1RwKF9fYSArIF9faiksIC1fX3MpOworICAgICAgICAgICAgICBfX3NnbiAqPSBfVHAoLTEpOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChfX3B1bnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3Rlcm0gLz0gX1RwKF9faSArIDEpOworICAgICAgICAgIGlmIChzdGQ6OmFicyhfX3Rlcm0gLyBfX3pldGEpIDwgX19lcHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBfX3pldGEgKz0gX190ZXJtOworICAgICAgICB9CisKKyAgICAgIF9femV0YSAvPSBfX3MgLSBfVHAoMSk7CisKKyAgICAgIHJldHVybiBfX3pldGE7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgIEBicmllZiAgUmV0dXJuIHRoZSBIdXJ3aXR6IHpldGEgZnVuY3Rpb24gQGYkIFx6ZXRhKHgscykgQGYkCisgICAgICogICAgICAgICAgIGZvciBhbGwgcyAhPSAxIGFuZCB4ID4gLTEuCisgICAgICogCisgICAgICogICBUaGUgSHVyd2l0eiB6ZXRhIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnk6CisgICAgICogICBAZlsKKyAgICAgKiAgICAgXHpldGEoeCxzKSA9IFxzdW1fe249MH1ee1xpbmZ0eX0gXGZyYWN7MX17KG4gKyB4KV5zfQorICAgICAqICAgQGZdCisgICAgICogICBUaGUgUmllbWFubiB6ZXRhIGZ1bmN0aW9uIGlzIGEgc3BlY2lhbCBjYXNlOgorICAgICAqICAgQGZbCisgICAgICogICAgIFx6ZXRhKHMpID0gXHpldGEoMSxzKQorICAgICAqICAgQGZdCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBfVHAKKyAgICBfX2h1cndpdHpfemV0YShjb25zdCBfVHAgX19hLCBjb25zdCBfVHAgX19zKQorICAgIHsKKyAgICAgIHJldHVybiBfX2h1cndpdHpfemV0YV9nbG9iKF9fYSwgX19zKTsKKyAgICB9CisKKyAgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisgIH0gLy8gbmFtZXNwYWNlIHN0ZDo6dHIxOjpfX2RldGFpbAorfQorfQorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1JJRU1BTk5fWkVUQV9UQ0MKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3NoYXJlZF9wdHIuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3NoYXJlZF9wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDIwODRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc2hhcmVkX3B0ci5oCkBAIC0wLDAgKzEsMTE3OSBAQAorLy8gPHRyMS9zaGFyZWRfcHRyLmg+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLyAgc2hhcmVkX2NvdW50LmhwcAorLy8gIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdiBhbmQgTXVsdGkgTWVkaWEgTHRkLgorCisvLyAgc2hhcmVkX3B0ci5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgR3JlZyBDb2x2aW4gYW5kIEJlbWFuIERhd2VzLgorLy8gIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMyBQZXRlciBEaW1vdgorCisvLyAgd2Vha19wdHIuaHBwCisvLyAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIFBldGVyIERpbW92CisKKy8vICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy5ocHAKKy8vICBDb3B5cmlnaHQgKEMpIDIwMDIgUGV0ZXIgRGltb3YKKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBHQ0MgTm90ZTogIGJhc2VkIG9uIHZlcnNpb24gMS4zMi4wIG9mIHRoZSBCb29zdCBsaWJyYXJ5LgorCisvKiogQGZpbGUgdHIxL3NoYXJlZF9wdHIuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS9tZW1vcnl9CisgKi8KKworI2lmbmRlZiBfVFIxX1NIQVJFRF9QVFJfSAorI2RlZmluZSBfVFIxX1NIQVJFRF9QVFJfSCAxCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworIC8qKgorICAgKiAgQGJyaWVmICBFeGNlcHRpb24gcG9zc2libHkgdGhyb3duIGJ5IEBjIHNoYXJlZF9wdHIuCisgICAqICBAaW5ncm91cCBleGNlcHRpb25zCisgICAqLworICBjbGFzcyBiYWRfd2Vha19wdHIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgeworICBwdWJsaWM6CisgICAgdmlydHVhbCBjaGFyIGNvbnN0KgorICAgIHdoYXQoKSBjb25zdCB0aHJvdygpCisgICAgeyByZXR1cm4gInRyMTo6YmFkX3dlYWtfcHRyIjsgfQorICB9OworCisgIC8vIFN1YnN0aXR1dGUgZm9yIGJhZF93ZWFrX3B0ciBvYmplY3QgaW4gdGhlIGNhc2Ugb2YgLWZuby1leGNlcHRpb25zLgorICBpbmxpbmUgdm9pZAorICBfX3Rocm93X2JhZF93ZWFrX3B0cigpCisgIHsKKyNpZiBfX0VYQ0VQVElPTlMKKyAgICB0aHJvdyBiYWRfd2Vha19wdHIoKTsKKyNlbHNlCisgICAgX19idWlsdGluX2Fib3J0KCk7CisjZW5kaWYKKyAgfQorCisgIHVzaW5nIF9fZ251X2N4eDo6X0xvY2tfcG9saWN5OworICB1c2luZyBfX2dudV9jeHg6Ol9fZGVmYXVsdF9sb2NrX3BvbGljeTsKKyAgdXNpbmcgX19nbnVfY3h4OjpfU19zaW5nbGU7CisgIHVzaW5nIF9fZ251X2N4eDo6X1NfbXV0ZXg7CisgIHVzaW5nIF9fZ251X2N4eDo6X1NfYXRvbWljOworCisgIC8vIEVtcHR5IGhlbHBlciBjbGFzcyBleGNlcHQgd2hlbiB0aGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgX1NfbXV0ZXguCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX011dGV4X2Jhc2UKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVGhlIGF0b21pYyBwb2xpY3kgdXNlcyBmdWxseS1mZW5jZWQgYnVpbHRpbnMsIHNpbmdsZSBkb2Vzbid0IGNhcmUuCisgICAgICBlbnVtIHsgX1NfbmVlZF9iYXJyaWVycyA9IDAgfTsKKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfTXV0ZXhfYmFzZTxfU19tdXRleD4KKyAgICA6IHB1YmxpYyBfX2dudV9jeHg6Ol9fbXV0ZXgKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgLy8gVGhpcyBwb2xpY3kgaXMgdXNlZCB3aGVuIGF0b21pYyBidWlsdGlucyBhcmUgbm90IGF2YWlsYWJsZS4KKyAgICAgIC8vIFRoZSByZXBsYWNlbWVudCBhdG9taWMgb3BlcmF0aW9ucyBtaWdodCBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5CisgICAgICAvLyBtZW1vcnkgYmFycmllcnMuCisgICAgICBlbnVtIHsgX1NfbmVlZF9iYXJyaWVycyA9IDEgfTsKKyAgICB9OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX1NwX2NvdW50ZWRfYmFzZQorICAgIDogcHVibGljIF9NdXRleF9iYXNlPF9McD4KKyAgICB7CisgICAgcHVibGljOiAgCisgICAgICBfU3BfY291bnRlZF9iYXNlKCkKKyAgICAgIDogX01fdXNlX2NvdW50KDEpLCBfTV93ZWFrX2NvdW50KDEpIHsgfQorICAgICAgCisgICAgICB2aXJ0dWFsCisgICAgICB+X1NwX2NvdW50ZWRfYmFzZSgpIC8vIG5vdGhyb3cgCisgICAgICB7IH0KKyAgCisgICAgICAvLyBDYWxsZWQgd2hlbiBfTV91c2VfY291bnQgZHJvcHMgdG8gemVybywgdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzCisgICAgICAvLyBtYW5hZ2VkIGJ5ICp0aGlzLgorICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgPSAwOyAvLyBub3Rocm93CisgICAgICAKKyAgICAgIC8vIENhbGxlZCB3aGVuIF9NX3dlYWtfY291bnQgZHJvcHMgdG8gemVyby4KKyAgICAgIHZpcnR1YWwgdm9pZAorICAgICAgX01fZGVzdHJveSgpIC8vIG5vdGhyb3cKKyAgICAgIHsgZGVsZXRlIHRoaXM7IH0KKyAgICAgIAorICAgICAgdmlydHVhbCB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mKSA9IDA7CisKKyAgICAgIHZvaWQKKyAgICAgIF9NX2FkZF9yZWZfY29weSgpCisgICAgICB7IF9fZ251X2N4eDo6X19hdG9taWNfYWRkX2Rpc3BhdGNoKCZfTV91c2VfY291bnQsIDEpOyB9CisgIAorICAgICAgdm9pZAorICAgICAgX01fYWRkX3JlZl9sb2NrKCk7CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3JlbGVhc2UoKSAvLyBub3Rocm93CisgICAgICB7CisgICAgICAgIC8vIEJlIHJhY2UtZGV0ZWN0b3ItZnJpZW5kbHkuICBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV91c2VfY291bnQpOworCWlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAtMSkgPT0gMSkKKwkgIHsKKyAgICAgICAgICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKCZfTV91c2VfY291bnQpOworCSAgICBfTV9kaXNwb3NlKCk7CisJICAgIC8vIFRoZXJlIG11c3QgYmUgYSBtZW1vcnkgYmFycmllciBiZXR3ZWVuIGRpc3Bvc2UoKSBhbmQgZGVzdHJveSgpCisJICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBlZmZlY3RzIG9mIGRpc3Bvc2UoKSBhcmUgb2JzZXJ2ZWQgaW4gdGhlCisJICAgIC8vIHRocmVhZCB0aGF0IHJ1bnMgZGVzdHJveSgpLgorCSAgICAvLyBTZWUgaHR0cDovL2djYy5nbnUub3JnL21sL2xpYnN0ZGMrKy8yMDA1LTExL21zZzAwMTM2Lmh0bWwKKwkgICAgaWYgKF9NdXRleF9iYXNlPF9McD46Ol9TX25lZWRfYmFycmllcnMpCisJICAgICAgeworCSAgICAgICAgX0dMSUJDWFhfUkVBRF9NRU1fQkFSUklFUjsKKwkgICAgICAgIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSOworCSAgICAgIH0KKworICAgICAgICAgICAgLy8gQmUgcmFjZS1kZXRlY3Rvci1mcmllbmRseS4gIEZvciBtb3JlIGluZm8gc2VlIGJpdHMvYysrY29uZmlnLgorICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV93ZWFrX2NvdW50KTsKKwkgICAgaWYgKF9fZ251X2N4eDo6X19leGNoYW5nZV9hbmRfYWRkX2Rpc3BhdGNoKCZfTV93ZWFrX2NvdW50LAorCQkJCQkJICAgICAgIC0xKSA9PSAxKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3dlYWtfY291bnQpOworCSAgICAgICAgX01fZGVzdHJveSgpOworICAgICAgICAgICAgICB9CisJICB9CisgICAgICB9CisgIAorICAgICAgdm9pZAorICAgICAgX01fd2Vha19hZGRfcmVmKCkgLy8gbm90aHJvdworICAgICAgeyBfX2dudV9jeHg6Ol9fYXRvbWljX2FkZF9kaXNwYXRjaCgmX01fd2Vha19jb3VudCwgMSk7IH0KKworICAgICAgdm9pZAorICAgICAgX01fd2Vha19yZWxlYXNlKCkgLy8gbm90aHJvdworICAgICAgeworICAgICAgICAvLyBCZSByYWNlLWRldGVjdG9yLWZyaWVuZGx5LiBGb3IgbW9yZSBpbmZvIHNlZSBiaXRzL2MrK2NvbmZpZy4KKyAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKCZfTV93ZWFrX2NvdW50KTsKKwlpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3dlYWtfY291bnQsIC0xKSA9PSAxKQorCSAgeworICAgICAgICAgICAgX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoJl9NX3dlYWtfY291bnQpOworCSAgICBpZiAoX011dGV4X2Jhc2U8X0xwPjo6X1NfbmVlZF9iYXJyaWVycykKKwkgICAgICB7CisJICAgICAgICAvLyBTZWUgX01fcmVsZWFzZSgpLAorCSAgICAgICAgLy8gZGVzdHJveSgpIG11c3Qgb2JzZXJ2ZSByZXN1bHRzIG9mIGRpc3Bvc2UoKQorCSAgICAgICAgX0dMSUJDWFhfUkVBRF9NRU1fQkFSUklFUjsKKwkgICAgICAgIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSOworCSAgICAgIH0KKwkgICAgX01fZGVzdHJveSgpOworCSAgfQorICAgICAgfQorICAKKyAgICAgIGxvbmcKKyAgICAgIF9NX2dldF91c2VfY291bnQoKSBjb25zdCAvLyBub3Rocm93CisgICAgICB7CisgICAgICAgIC8vIE5vIG1lbW9yeSBiYXJyaWVyIGlzIHVzZWQgaGVyZSBzbyB0aGVyZSBpcyBubyBzeW5jaHJvbml6YXRpb24KKyAgICAgICAgLy8gd2l0aCBvdGhlciB0aHJlYWRzLgorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCB2b2xhdGlsZSBfQXRvbWljX3dvcmQmPihfTV91c2VfY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZTogIAorICAgICAgX1NwX2NvdW50ZWRfYmFzZShfU3BfY291bnRlZF9iYXNlIGNvbnN0Jik7CisgICAgICBfU3BfY291bnRlZF9iYXNlJiBvcGVyYXRvcj0oX1NwX2NvdW50ZWRfYmFzZSBjb25zdCYpOworCisgICAgICBfQXRvbWljX3dvcmQgIF9NX3VzZV9jb3VudDsgICAgIC8vICNzaGFyZWQKKyAgICAgIF9BdG9taWNfd29yZCAgX01fd2Vha19jb3VudDsgICAgLy8gI3dlYWsgKyAoI3NoYXJlZCAhPSAwKQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19zaW5nbGU+OjoKKyAgICBfTV9hZGRfcmVmX2xvY2soKQorICAgIHsKKyAgICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmX01fdXNlX2NvdW50LCAxKSA9PSAwKQorCXsKKwkgIF9NX3VzZV9jb3VudCA9IDA7CisJICBfX3Rocm93X2JhZF93ZWFrX3B0cigpOworCX0KKyAgICB9CisKKyAgdGVtcGxhdGU8PgorICAgIGlubGluZSB2b2lkCisgICAgX1NwX2NvdW50ZWRfYmFzZTxfU19tdXRleD46OgorICAgIF9NX2FkZF9yZWZfbG9jaygpCisgICAgeworICAgICAgX19nbnVfY3h4OjpfX3Njb3BlZF9sb2NrIHNlbnRyeSgqdGhpcyk7CisgICAgICBpZiAoX19nbnVfY3h4OjpfX2V4Y2hhbmdlX2FuZF9hZGRfZGlzcGF0Y2goJl9NX3VzZV9jb3VudCwgMSkgPT0gMCkKKwl7CisJICBfTV91c2VfY291bnQgPSAwOworCSAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPD4gCisgICAgaW5saW5lIHZvaWQKKyAgICBfU3BfY291bnRlZF9iYXNlPF9TX2F0b21pYz46OgorICAgIF9NX2FkZF9yZWZfbG9jaygpCisgICAgeworICAgICAgLy8gUGVyZm9ybSBsb2NrLWZyZWUgYWRkLWlmLW5vdC16ZXJvIG9wZXJhdGlvbi4KKyAgICAgIF9BdG9taWNfd29yZCBfX2NvdW50OworICAgICAgZG8KKwl7CisJICBfX2NvdW50ID0gX01fdXNlX2NvdW50OworCSAgaWYgKF9fY291bnQgPT0gMCkKKwkgICAgX190aHJvd19iYWRfd2Vha19wdHIoKTsKKwkgIAorCSAgLy8gUmVwbGFjZSB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlIHdpdGggdGhlIG9sZCB2YWx1ZSArIDEsIGFzCisJICAvLyBsb25nIGFzIGl0J3Mgbm90IGNoYW5nZWQgbWVhbndoaWxlLiAKKwl9CisgICAgICB3aGlsZSAoIV9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoJl9NX3VzZV9jb3VudCwgX19jb3VudCwKKwkJCQkJICAgX19jb3VudCArIDEpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0ciwgdHlwZW5hbWUgX0RlbGV0ZXIsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX1NwX2NvdW50ZWRfYmFzZV9pbXBsCisgICAgOiBwdWJsaWMgX1NwX2NvdW50ZWRfYmFzZTxfTHA+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIFByZWNvbmRpdGlvbjogX19kKF9fcCkgbXVzdCBub3QgdGhyb3cuCisgICAgICBfU3BfY291bnRlZF9iYXNlX2ltcGwoX1B0ciBfX3AsIF9EZWxldGVyIF9fZCkKKyAgICAgIDogX01fcHRyKF9fcCksIF9NX2RlbChfX2QpIHsgfQorICAgIAorICAgICAgdmlydHVhbCB2b2lkCisgICAgICBfTV9kaXNwb3NlKCkgLy8gbm90aHJvdworICAgICAgeyBfTV9kZWwoX01fcHRyKTsgfQorICAgICAgCisgICAgICB2aXJ0dWFsIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYgX190aSkKKyAgICAgIHsKKyNpZmRlZiBfX0dYWF9SVFRJCisgICAgICAgIHJldHVybiBfX3RpID09IHR5cGVpZChfRGVsZXRlcikgPyAmX01fZGVsIDogMDsKKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9CisgICAgICAKKyAgICBwcml2YXRlOgorICAgICAgX1NwX2NvdW50ZWRfYmFzZV9pbXBsKGNvbnN0IF9TcF9jb3VudGVkX2Jhc2VfaW1wbCYpOworICAgICAgX1NwX2NvdW50ZWRfYmFzZV9pbXBsJiBvcGVyYXRvcj0oY29uc3QgX1NwX2NvdW50ZWRfYmFzZV9pbXBsJik7CisgICAgICAKKyAgICAgIF9QdHIgICAgICBfTV9wdHI7ICAvLyBjb3B5IGNvbnN0cnVjdG9yIG11c3Qgbm90IHRocm93CisgICAgICBfRGVsZXRlciAgX01fZGVsOyAgLy8gY29weSBjb25zdHJ1Y3RvciBtdXN0IG5vdCB0aHJvdworICAgIH07CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3dlYWtfY291bnQ7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfU3BfZGVsZXRlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdm9pZCByZXN1bHRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX1RwKiBhcmd1bWVudF90eXBlOworICAgICAgdm9pZCBvcGVyYXRvcigpKF9UcCogX19wKSBjb25zdCB7IGRlbGV0ZSBfX3A7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPF9Mb2NrX3BvbGljeSBfTHAgPSBfX2RlZmF1bHRfbG9ja19wb2xpY3k+CisgICAgY2xhc3MgX19zaGFyZWRfY291bnQKKyAgICB7CisgICAgcHVibGljOiAKKyAgICAgIF9fc2hhcmVkX2NvdW50KCkKKyAgICAgIDogX01fcGkoMCkgLy8gbm90aHJvdworICAgICAgeyB9CisgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1B0cj4KKyAgICAgICAgX19zaGFyZWRfY291bnQoX1B0ciBfX3ApIDogX01fcGkoMCkKKyAgICAgICAgeworCSAgX190cnkKKwkgICAgeworCSAgICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp0cjE6OnJlbW92ZV9wb2ludGVyPF9QdHI+Ojp0eXBlIF9UcDsKKwkgICAgICBfTV9waSA9IG5ldyBfU3BfY291bnRlZF9iYXNlX2ltcGw8X1B0ciwgX1NwX2RlbGV0ZXI8X1RwPiwgX0xwPigKKwkgICAgICAgICAgX19wLCBfU3BfZGVsZXRlcjxfVHA+KCkpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIGRlbGV0ZSBfX3A7CisJICAgICAgX190aHJvd19leGNlcHRpb25fYWdhaW47CisJICAgIH0KKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9QdHIsIHR5cGVuYW1lIF9EZWxldGVyPgorICAgICAgICBfX3NoYXJlZF9jb3VudChfUHRyIF9fcCwgX0RlbGV0ZXIgX19kKSA6IF9NX3BpKDApCisgICAgICAgIHsKKwkgIF9fdHJ5CisJICAgIHsKKwkgICAgICBfTV9waSA9IG5ldyBfU3BfY291bnRlZF9iYXNlX2ltcGw8X1B0ciwgX0RlbGV0ZXIsIF9McD4oX19wLCBfX2QpOworCSAgICB9CisJICBfX2NhdGNoKC4uLikKKwkgICAgeworCSAgICAgIF9fZChfX3ApOyAvLyBDYWxsIF9EZWxldGVyIG9uIF9fcC4KKwkgICAgICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwkgICAgfQorCX0KKworICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhdXRvX3B0cjxfVHA+IHRvIHByb3ZpZGUgdGhlIHN0cm9uZyBndWFyYW50ZWUuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIF9fc2hhcmVkX2NvdW50KHN0ZDo6YXV0b19wdHI8X1RwPiYgX19yKQorCTogX01fcGkobmV3IF9TcF9jb3VudGVkX2Jhc2VfaW1wbDxfVHAqLAorCQlfU3BfZGVsZXRlcjxfVHA+LCBfTHAgPihfX3IuZ2V0KCksIF9TcF9kZWxldGVyPF9UcD4oKSkpCisgICAgICAgIHsgX19yLnJlbGVhc2UoKTsgfQorCisgICAgICAvLyBUaHJvdyBiYWRfd2Vha19wdHIgd2hlbiBfX3IuX01fZ2V0X3VzZV9jb3VudCgpID09IDAuCisgICAgICBleHBsaWNpdAorICAgICAgX19zaGFyZWRfY291bnQoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fcik7CisgIAorICAgICAgfl9fc2hhcmVkX2NvdW50KCkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3JlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgX19zaGFyZWRfY291bnQoY29uc3QgX19zaGFyZWRfY291bnQmIF9fcikKKyAgICAgIDogX01fcGkoX19yLl9NX3BpKSAvLyBub3Rocm93CisgICAgICB7CisJaWYgKF9NX3BpICE9IDApCisJICBfTV9waS0+X01fYWRkX3JlZl9jb3B5KCk7CisgICAgICB9CisgIAorICAgICAgX19zaGFyZWRfY291bnQmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfY291bnQmIF9fcikgLy8gbm90aHJvdworICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJaWYgKF9fdG1wICE9IF9NX3BpKQorCSAgeworCSAgICBpZiAoX190bXAgIT0gMCkKKwkgICAgICBfX3RtcC0+X01fYWRkX3JlZl9jb3B5KCk7CisJICAgIGlmIChfTV9waSAhPSAwKQorCSAgICAgIF9NX3BpLT5fTV9yZWxlYXNlKCk7CisJICAgIF9NX3BpID0gX190bXA7CisJICB9CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAKKyAgICAgIHZvaWQKKyAgICAgIF9NX3N3YXAoX19zaGFyZWRfY291bnQmIF9fcikgLy8gbm90aHJvdworICAgICAgeworCV9TcF9jb3VudGVkX2Jhc2U8X0xwPiogX190bXAgPSBfX3IuX01fcGk7CisJX19yLl9NX3BpID0gX01fcGk7CisJX01fcGkgPSBfX3RtcDsKKyAgICAgIH0KKyAgCisgICAgICBsb25nCisgICAgICBfTV9nZXRfdXNlX2NvdW50KCkgY29uc3QgLy8gbm90aHJvdworICAgICAgeyByZXR1cm4gX01fcGkgIT0gMCA/IF9NX3BpLT5fTV9nZXRfdXNlX2NvdW50KCkgOiAwOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIF9NX3VuaXF1ZSgpIGNvbnN0IC8vIG5vdGhyb3cKKyAgICAgIHsgcmV0dXJuIHRoaXMtPl9NX2dldF91c2VfY291bnQoKSA9PSAxOyB9CisgICAgICAKKyAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I9PShjb25zdCBfX3NoYXJlZF9jb3VudCYgX19hLCBjb25zdCBfX3NoYXJlZF9jb3VudCYgX19iKQorICAgICAgeyByZXR1cm4gX19hLl9NX3BpID09IF9fYi5fTV9waTsgfQorICAKKyAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgb3BlcmF0b3I8KGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX2EsIGNvbnN0IF9fc2hhcmVkX2NvdW50JiBfX2IpCisgICAgICB7IHJldHVybiBzdGQ6Omxlc3M8X1NwX2NvdW50ZWRfYmFzZTxfTHA+Kj4oKShfX2EuX01fcGksIF9fYi5fTV9waSk7IH0KKyAgCisgICAgICB2b2lkKgorICAgICAgX01fZ2V0X2RlbGV0ZXIoY29uc3Qgc3RkOjp0eXBlX2luZm8mIF9fdGkpIGNvbnN0CisgICAgICB7IHJldHVybiBfTV9waSA/IF9NX3BpLT5fTV9nZXRfZGVsZXRlcihfX3RpKSA6IDA7IH0KKworICAgIHByaXZhdGU6CisgICAgICBmcmllbmQgY2xhc3MgX193ZWFrX2NvdW50PF9McD47CisKKyAgICAgIF9TcF9jb3VudGVkX2Jhc2U8X0xwPiogIF9NX3BpOworICAgIH07CisKKworICB0ZW1wbGF0ZTxfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fd2Vha19jb3VudAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICBfX3dlYWtfY291bnQoKQorICAgICAgOiBfTV9waSgwKSAvLyBub3Rocm93CisgICAgICB7IH0KKyAgCisgICAgICBfX3dlYWtfY291bnQoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19yKQorICAgICAgOiBfTV9waShfX3IuX01fcGkpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlpZiAoX01fcGkgIT0gMCkKKwkgIF9NX3BpLT5fTV93ZWFrX2FkZF9yZWYoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgX193ZWFrX2NvdW50KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpCisgICAgICA6IF9NX3BpKF9fci5fTV9waSkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfYWRkX3JlZigpOworICAgICAgfQorICAgICAgCisgICAgICB+X193ZWFrX2NvdW50KCkgLy8gbm90aHJvdworICAgICAgeworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworICAgICAgfQorICAgICAgCisgICAgICBfX3dlYWtfY291bnQ8X0xwPiYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCWlmIChfX3RtcCAhPSAwKQorCSAgX190bXAtPl9NX3dlYWtfYWRkX3JlZigpOworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworCV9NX3BpID0gX190bXA7ICAKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICAKKyAgICAgIF9fd2Vha19jb3VudDxfTHA+JgorICAgICAgb3BlcmF0b3I9KGNvbnN0IF9fd2Vha19jb3VudDxfTHA+JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCWlmIChfX3RtcCAhPSAwKQorCSAgX190bXAtPl9NX3dlYWtfYWRkX3JlZigpOworCWlmIChfTV9waSAhPSAwKQorCSAgX01fcGktPl9NX3dlYWtfcmVsZWFzZSgpOworCV9NX3BpID0gX190bXA7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB2b2lkCisgICAgICBfTV9zd2FwKF9fd2Vha19jb3VudDxfTHA+JiBfX3IpIC8vIG5vdGhyb3cKKyAgICAgIHsKKwlfU3BfY291bnRlZF9iYXNlPF9McD4qIF9fdG1wID0gX19yLl9NX3BpOworCV9fci5fTV9waSA9IF9NX3BpOworCV9NX3BpID0gX190bXA7CisgICAgICB9CisgIAorICAgICAgbG9uZworICAgICAgX01fZ2V0X3VzZV9jb3VudCgpIGNvbnN0IC8vIG5vdGhyb3cKKyAgICAgIHsgcmV0dXJuIF9NX3BpICE9IDAgPyBfTV9waS0+X01fZ2V0X3VzZV9jb3VudCgpIDogMDsgfQorCisgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgIG9wZXJhdG9yPT0oY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fYSwgY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fYikKKyAgICAgIHsgcmV0dXJuIF9fYS5fTV9waSA9PSBfX2IuX01fcGk7IH0KKyAgICAgIAorICAgICAgZnJpZW5kIGlubGluZSBib29sCisgICAgICBvcGVyYXRvcjwoY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fYSwgY29uc3QgX193ZWFrX2NvdW50PF9McD4mIF9fYikKKyAgICAgIHsgcmV0dXJuIHN0ZDo6bGVzczxfU3BfY291bnRlZF9iYXNlPF9McD4qPigpKF9fYS5fTV9waSwgX19iLl9NX3BpKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9jb3VudDxfTHA+OworCisgICAgICBfU3BfY291bnRlZF9iYXNlPF9McD4qICBfTV9waTsKKyAgICB9OworCisgIC8vIG5vdyB0aGF0IF9fd2Vha19jb3VudCBpcyBkZWZpbmVkIHdlIGNhbiBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RvcjoKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUKKyAgICBfX3NoYXJlZF9jb3VudDxfTHA+OjoKKyAgICBfX3NoYXJlZF9jb3VudChjb25zdCBfX3dlYWtfY291bnQ8X0xwPiYgX19yKQorICAgIDogX01fcGkoX19yLl9NX3BpKQorICAgIHsKKyAgICAgIGlmIChfTV9waSAhPSAwKQorCV9NX3BpLT5fTV9hZGRfcmVmX2xvY2soKTsKKyAgICAgIGVsc2UKKwlfX3Rocm93X2JhZF93ZWFrX3B0cigpOworICAgIH0KKworICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwID0gX19kZWZhdWx0X2xvY2tfcG9saWN5PgorICAgIGNsYXNzIF9fc2hhcmVkX3B0cjsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX3dlYWtfcHRyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgX0xvY2tfcG9saWN5IF9McCA9IF9fZGVmYXVsdF9sb2NrX3BvbGljeT4KKyAgICBjbGFzcyBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBzaGFyZWRfcHRyOworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHdlYWtfcHRyOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKKworICAvLyBTdXBwb3J0IGZvciBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKworICAvLyBGcmllbmQgb2YgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McCwgdHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICB2b2lkCisgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYsCisJCQkJICAgICBjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9UcDEsCisJCQkJICAgICBfTHA+KiwgY29uc3QgX1RwMiopOworCisgIC8vIEZyaWVuZCBvZiBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICB2b2lkCisgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8PiYsCisJCQkJICAgICBjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAxPiosCisJCQkJICAgICBjb25zdCBfVHAyKik7CisKKyAgdGVtcGxhdGU8X0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgdm9pZAorICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PF9McD4mLCAuLi4pCisgICAgeyB9CisKKworICBzdHJ1Y3QgX19zdGF0aWNfY2FzdF90YWcgeyB9OworICBzdHJ1Y3QgX19jb25zdF9jYXN0X3RhZyB7IH07CisgIHN0cnVjdCBfX2R5bmFtaWNfY2FzdF90YWcgeyB9OworCisgIC8vIEEgc21hcnQgcG9pbnRlciB3aXRoIHJlZmVyZW5jZS1jb3VudGVkIGNvcHkgc2VtYW50aWNzLiAgVGhlCisgIC8vIG9iamVjdCBwb2ludGVkIHRvIGlzIGRlbGV0ZWQgd2hlbiB0aGUgbGFzdCBzaGFyZWRfcHRyIHBvaW50aW5nIHRvCisgIC8vIGl0IGlzIGRlc3Ryb3llZCBvciByZXNldC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fc2hhcmVkX3B0cgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCAgIGVsZW1lbnRfdHlwZTsKKyAgICAgIAorICAgICAgX19zaGFyZWRfcHRyKCkKKyAgICAgIDogX01fcHRyKDApLCBfTV9yZWZjb3VudCgpIC8vIG5ldmVyIHRocm93cworICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIF9fc2hhcmVkX3B0cihfVHAxKiBfX3ApCisJOiBfTV9wdHIoX19wKSwgX01fcmVmY291bnQoX19wKQorICAgICAgICB7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICB0eXBlZGVmIGludCBfSXNDb21wbGV0ZVtzaXplb2YoX1RwMSldOworCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9EZWxldGVyPgorICAgICAgICBfX3NoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisgICAgICAgIDogX01fcHRyKF9fcCksIF9NX3JlZmNvdW50KF9fcCwgX19kKQorICAgICAgICB7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICAvLyBUT0RPIHJlcXVpcmVzIF9EZWxldGVyIENvcHlDb25zdHJ1Y3RpYmxlIGFuZCBfX2QoX19wKSB3ZWxsLWZvcm1lZAorCSAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoX01fcmVmY291bnQsIF9fcCwgX19wKTsKKwl9CisgICAgICAKKyAgICAgIC8vICBnZW5lcmF0ZWQgY29weSBjb25zdHJ1Y3RvciwgYXNzaWdubWVudCwgZGVzdHJ1Y3RvciBhcmUgZmluZS4KKyAgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9wdHIoX19yLl9NX3B0ciksIF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KSB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIF9fc2hhcmVkX3B0cihjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcikKKwk6IF9NX3JlZmNvdW50KF9fci5fTV9yZWZjb3VudCkgLy8gbWF5IHRocm93CisgICAgICAgIHsKKwkgIF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikKKwkgIC8vIEl0IGlzIG5vdyBzYWZlIHRvIGNvcHkgX19yLl9NX3B0ciwgYXMgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KQorCSAgLy8gZGlkIG5vdCB0aHJvdy4KKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJfQorCisjaWYgIWRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pIHx8IF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICAvLyBQb3N0Y29uZGl0aW9uOiB1c2VfY291bnQoKSA9PSAxIGFuZCBfX3IuZ2V0KCkgPT0gMAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX19zaGFyZWRfcHRyKHN0ZDo6YXV0b19wdHI8X1RwMT4mIF9fcikKKwk6IF9NX3B0cihfX3IuZ2V0KCkpLCBfTV9yZWZjb3VudCgpCisgICAgICAgIHsgLy8gVE9ETyByZXF1cmllcyBkZWxldGUgX19yLnJlbGVhc2UoKSB3ZWxsLWZvcm1lZAorCSAgX19nbGliY3h4X2Z1bmN0aW9uX3JlcXVpcmVzKF9Db252ZXJ0aWJsZUNvbmNlcHQ8X1RwMSosIF9UcCo+KQorCSAgdHlwZWRlZiBpbnQgX0lzQ29tcGxldGVbc2l6ZW9mKF9UcDEpXTsKKwkgIF9UcDEqIF9fdG1wID0gX19yLmdldCgpOworCSAgX01fcmVmY291bnQgPSBfX3NoYXJlZF9jb3VudDxfTHA+KF9fcik7CisJICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzX2hlbHBlcihfTV9yZWZjb3VudCwgX190bXAsIF9fdG1wKTsKKwl9CisKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fciwgX19zdGF0aWNfY2FzdF90YWcpCisJOiBfTV9wdHIoc3RhdGljX2Nhc3Q8ZWxlbWVudF90eXBlKj4oX19yLl9NX3B0cikpLAorCSAgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX19zaGFyZWRfcHRyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX3IsIF9fY29uc3RfY2FzdF90YWcpCisJOiBfTV9wdHIoY29uc3RfY2FzdDxlbGVtZW50X3R5cGUqPihfX3IuX01fcHRyKSksCisJICBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisgICAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHIoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fciwgX19keW5hbWljX2Nhc3RfdGFnKQorCTogX01fcHRyKGR5bmFtaWNfY2FzdDxlbGVtZW50X3R5cGUqPihfX3IuX01fcHRyKSksCisJICBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpCisgICAgICAgIHsKKwkgIGlmIChfTV9wdHIgPT0gMCkgLy8gbmVlZCB0byBhbGxvY2F0ZSBuZXcgY291bnRlciAtLSB0aGUgY2FzdCBmYWlsZWQKKwkgICAgX01fcmVmY291bnQgPSBfX3NoYXJlZF9jb3VudDxfTHA+KCk7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3NoYXJlZF9wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKSAvLyBuZXZlciB0aHJvd3MKKyAgICAgICAgeworCSAgX01fcHRyID0gX19yLl9NX3B0cjsKKwkgIF9NX3JlZmNvdW50ID0gX19yLl9NX3JlZmNvdW50OyAvLyBfX3NoYXJlZF9jb3VudDo6b3A9IGRvZXNuJ3QgdGhyb3cKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyNpZiAhZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykgfHwgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fc2hhcmVkX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KHN0ZDo6YXV0b19wdHI8X1RwMT4mIF9fcikKKyAgICAgICAgeworCSAgX19zaGFyZWRfcHRyKF9fcikuc3dhcCgqdGhpcyk7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IF9fc2hhcmVkX3B0cigpLnN3YXAoKnRoaXMpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVzZXQoX1RwMSogX19wKSAvLyBfVHAxIG11c3QgYmUgY29tcGxldGUuCisgICAgICAgIHsKKwkgIC8vIENhdGNoIHNlbGYtcmVzZXQgZXJyb3JzLgorCSAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9fcCA9PSAwIHx8IF9fcCAhPSBfTV9wdHIpOyAKKwkgIF9fc2hhcmVkX3B0cihfX3ApLnN3YXAoKnRoaXMpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisgICAgICAgIHZvaWQKKyAgICAgICAgcmVzZXQoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisgICAgICAgIHsgX19zaGFyZWRfcHRyKF9fcCwgX19kKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICAvLyBBbGxvdyBjbGFzcyBpbnN0YW50aWF0aW9uIHdoZW4gX1RwIGlzIFtjdi1xdWFsXSB2b2lkLgorICAgICAgdHlwZW5hbWUgc3RkOjp0cjE6OmFkZF9yZWZlcmVuY2U8X1RwPjo6dHlwZQorICAgICAgb3BlcmF0b3IqKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3B0ciAhPSAwKTsKKwlyZXR1cm4gKl9NX3B0cjsKKyAgICAgIH0KKworICAgICAgX1RwKgorICAgICAgb3BlcmF0b3ItPigpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeworCV9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9wdHIgIT0gMCk7CisJcmV0dXJuIF9NX3B0cjsKKyAgICAgIH0KKyAgICAKKyAgICAgIF9UcCoKKyAgICAgIGdldCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcHRyOyB9CisKKyAgICAgIC8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gImJvb2wiCisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgX1RwKiBfX3NoYXJlZF9wdHI6OipfX3Vuc3BlY2lmaWVkX2Jvb2xfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIG9wZXJhdG9yIF9fdW5zcGVjaWZpZWRfYm9vbF90eXBlKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9wdHIgPT0gMCA/IDAgOiAmX19zaGFyZWRfcHRyOjpfTV9wdHI7IH0KKworICAgICAgYm9vbAorICAgICAgdW5pcXVlKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IHJldHVybiBfTV9yZWZjb3VudC5fTV91bmlxdWUoKTsgfQorCisgICAgICBsb25nCisgICAgICB1c2VfY291bnQoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fb3RoZXIpIC8vIG5ldmVyIHRocm93cworICAgICAgeworCXN0ZDo6c3dhcChfTV9wdHIsIF9fb3RoZXIuX01fcHRyKTsKKwlfTV9yZWZjb3VudC5fTV9zd2FwKF9fb3RoZXIuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHZvaWQqCisgICAgICBfTV9nZXRfZGVsZXRlcihjb25zdCBzdGQ6OnR5cGVfaW5mbyYgX190aSkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF9kZWxldGVyKF9fdGkpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPgorICAgICAgICBib29sCisgICAgICAgIF9NX2xlc3MoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McDE+JiBfX3JocykgY29uc3QKKyAgICAgICAgeyByZXR1cm4gX01fcmVmY291bnQgPCBfX3Jocy5fTV9yZWZjb3VudDsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fc2hhcmVkX3B0cjsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHAxPiBmcmllbmQgY2xhc3MgX193ZWFrX3B0cjsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+CisgICAgICAgIGZyaWVuZCBfRGVsKiBnZXRfZGVsZXRlcihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwMT4mKTsKKworICAgICAgLy8gRnJpZW5kcyBpbmplY3RlZCBpbnRvIGVuY2xvc2luZyBuYW1lc3BhY2UgYW5kIGZvdW5kIGJ5IEFETDoKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvcj09KGNvbnN0IF9fc2hhcmVkX3B0ciYgX19hLCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19iKQorICAgICAgICB7IHJldHVybiBfX2EuZ2V0KCkgPT0gX19iLmdldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvciE9KGNvbnN0IF9fc2hhcmVkX3B0ciYgX19hLCBjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19iKQorICAgICAgICB7IHJldHVybiBfX2EuZ2V0KCkgIT0gX19iLmdldCgpOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCBpbmxpbmUgYm9vbAorICAgICAgICBvcGVyYXRvcjwoY29uc3QgX19zaGFyZWRfcHRyJiBfX2EsIGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAxLCBfTHA+JiBfX2IpCisgICAgICAgIHsgcmV0dXJuIF9fYS5fTV9sZXNzKF9fYik7IH0KKworICAgICAgX1RwKiAgICAgICAgIAkgICBfTV9wdHI7ICAgICAgICAgLy8gQ29udGFpbmVkIHBvaW50ZXIuCisgICAgICBfX3NoYXJlZF9jb3VudDxfTHA+ICBfTV9yZWZjb3VudDsgICAgLy8gUmVmZXJlbmNlIGNvdW50ZXIuCisgICAgfTsKKworICAvLyAyLjIuMy44IHNoYXJlZF9wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwLCBfTHA+JiBfX2EsIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fYikKKyAgICB7IF9fYS5zd2FwKF9fYik7IH0KKworICAvLyAyLjIuMy45IHNoYXJlZF9wdHIgY2FzdHMKKyAgLyogIFRoZSBzZWVtaW5nbHkgZXF1aXZhbGVudAorICAgKiAgICAgICAgICAgc2hhcmVkX3B0cjxfVHAsIF9McD4oc3RhdGljX2Nhc3Q8X1RwKj4oX19yLmdldCgpKSkKKyAgICogIHdpbGwgZXZlbnR1YWxseSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW91ciwKKyAgICogIGF0dGVtcHRpbmcgdG8gZGVsZXRlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4KKyAgICovCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McD4KKyAgICBpbmxpbmUgX19zaGFyZWRfcHRyPF9UcCwgX0xwPgorICAgIHN0YXRpY19wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19zdGF0aWNfY2FzdF90YWcoKSk7IH0KKworICAvKiAgVGhlIHNlZW1pbmdseSBlcXVpdmFsZW50CisgICAqICAgICAgICAgICBzaGFyZWRfcHRyPF9UcCwgX0xwPihjb25zdF9jYXN0PF9UcCo+KF9fci5nZXQoKSkpCisgICAqICB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvdXIsCisgICAqICBhdHRlbXB0aW5nIHRvIGRlbGV0ZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDEsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgaW5saW5lIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICBjb25zdF9wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19jb25zdF9jYXN0X3RhZygpKTsgfQorCisgIC8qICBUaGUgc2VlbWluZ2x5IGVxdWl2YWxlbnQKKyAgICogICAgICAgICAgIHNoYXJlZF9wdHI8X1RwLCBfTHA+KGR5bmFtaWNfY2FzdDxfVHAqPihfX3IuZ2V0KCkpKQorICAgKiAgd2lsbCBldmVudHVhbGx5IHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLAorICAgKiAgYXR0ZW1wdGluZyB0byBkZWxldGUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLgorICAgKi8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikKKyAgICB7IHJldHVybiBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+KF9fciwgX19keW5hbWljX2Nhc3RfdGFnKCkpOyB9CisKKyAgLy8gMi4yLjMuNyBzaGFyZWRfcHRyIEkvTworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2gsIHR5cGVuYW1lIF9UciwgdHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIHN0ZDo6YmFzaWNfb3N0cmVhbTxfQ2gsIF9Ucj4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08X0NoLCBfVHI+JiBfX29zLCAKKwkgICAgICAgY29uc3QgX19zaGFyZWRfcHRyPF9UcCwgX0xwPiYgX19wKQorICAgIHsKKyAgICAgIF9fb3MgPDwgX19wLmdldCgpOworICAgICAgcmV0dXJuIF9fb3M7CisgICAgfQorCisgIC8vIDIuMi4zLjEwIHNoYXJlZF9wdHIgZ2V0X2RlbGV0ZXIgKGV4cGVyaW1lbnRhbCkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0RlbCwgdHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSBfRGVsKgorICAgIGdldF9kZWxldGVyKGNvbnN0IF9fc2hhcmVkX3B0cjxfVHAsIF9McD4mIF9fcCkKKyAgICB7CisjaWZkZWYgX19HWFhfUlRUSQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PF9EZWwqPihfX3AuX01fZ2V0X2RlbGV0ZXIodHlwZWlkKF9EZWwpKSk7CisjZWxzZQorICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICB9CisKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9Mb2NrX3BvbGljeSBfTHA+CisgICAgY2xhc3MgX193ZWFrX3B0cgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIF9UcCBlbGVtZW50X3R5cGU7CisgICAgICAKKyAgICAgIF9fd2Vha19wdHIoKQorICAgICAgOiBfTV9wdHIoMCksIF9NX3JlZmNvdW50KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IH0KKworICAgICAgLy8gR2VuZXJhdGVkIGNvcHkgY29uc3RydWN0b3IsIGFzc2lnbm1lbnQsIGRlc3RydWN0b3IgYXJlIGZpbmUuCisgICAgICAKKyAgICAgIC8vIFRoZSAib2J2aW91cyIgY29udmVydGluZyBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbjoKKyAgICAgIC8vCisgICAgICAvLyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgIC8vICAgIF9fd2Vha19wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisgICAgICAvLyAgICA6IF9NX3B0cihfX3IuX01fcHRyKSwgX01fcmVmY291bnQoX19yLl9NX3JlZmNvdW50KSAvLyBuZXZlciB0aHJvd3MKKyAgICAgIC8vICAgIHsgfQorICAgICAgLy8KKyAgICAgIC8vIGhhcyBhIHNlcmlvdXMgcHJvYmxlbS4KKyAgICAgIC8vCisgICAgICAvLyAgX19yLl9NX3B0ciBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gaW52YWxpZGF0ZWQuIFRoZSBfTV9wdHIoX19yLl9NX3B0cikKKyAgICAgIC8vICBjb252ZXJzaW9uIG1heSByZXF1aXJlIGFjY2VzcyB0byAqX19yLl9NX3B0ciAodmlydHVhbCBpbmhlcml0YW5jZSkuCisgICAgICAvLworICAgICAgLy8gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGF2b2lkIHNwdXJpb3VzIGFjY2VzcyB2aW9sYXRpb25zIHNpbmNlCisgICAgICAvLyBpbiBtdWx0aXRocmVhZGVkIHByb2dyYW1zIF9fci5fTV9wdHIgbWF5IGJlIGludmFsaWRhdGVkIGF0IGFueSBwb2ludC4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIF9fd2Vha19wdHIoY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpCisJOiBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICBfX2dsaWJjeHhfZnVuY3Rpb25fcmVxdWlyZXMoX0NvbnZlcnRpYmxlQ29uY2VwdDxfVHAxKiwgX1RwKj4pCisJICBfTV9wdHIgPSBfX3IubG9jaygpLmdldCgpOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgX193ZWFrX3B0cihjb25zdCBfX3NoYXJlZF9wdHI8X1RwMSwgX0xwPiYgX19yKQorCTogX01fcHRyKF9fci5fTV9wdHIpLCBfTV9yZWZjb3VudChfX3IuX01fcmVmY291bnQpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7IF9fZ2xpYmN4eF9mdW5jdGlvbl9yZXF1aXJlcyhfQ29udmVydGlibGVDb25jZXB0PF9UcDEqLCBfVHAqPikgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3dlYWtfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX193ZWFrX3B0cjxfVHAxLCBfTHA+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICBfTV9wdHIgPSBfX3IubG9jaygpLmdldCgpOworCSAgX01fcmVmY291bnQgPSBfX3IuX01fcmVmY291bnQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBfX3dlYWtfcHRyJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgX19zaGFyZWRfcHRyPF9UcDEsIF9McD4mIF9fcikgLy8gbmV2ZXIgdGhyb3dzCisgICAgICAgIHsKKwkgIF9NX3B0ciA9IF9fci5fTV9wdHI7CisJICBfTV9yZWZjb3VudCA9IF9fci5fTV9yZWZjb3VudDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4KKyAgICAgIGxvY2soKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsKKyNpZmRlZiBfX0dUSFJFQURTCisJLy8gT3B0aW1pemF0aW9uOiBhdm9pZCB0aHJvdyBvdmVyaGVhZC4KKwlpZiAoZXhwaXJlZCgpKQorCSAgcmV0dXJuIF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKTsKKworCV9fdHJ5CisJICB7CisJICAgIHJldHVybiBfX3NoYXJlZF9wdHI8ZWxlbWVudF90eXBlLCBfTHA+KCp0aGlzKTsKKwkgIH0KKwlfX2NhdGNoKGNvbnN0IGJhZF93ZWFrX3B0ciYpCisJICB7CisJICAgIC8vIFE6IEhvdyBjYW4gd2UgZ2V0IGhlcmU/CisJICAgIC8vIEE6IEFub3RoZXIgdGhyZWFkIG1heSBoYXZlIGludmFsaWRhdGVkIHIgYWZ0ZXIgdGhlCisJICAgIC8vICAgIHVzZV9jb3VudCB0ZXN0IGFib3ZlLgorCSAgICByZXR1cm4gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpOworCSAgfQorCQorI2Vsc2UKKwkvLyBPcHRpbWl6YXRpb246IGF2b2lkIHRyeS9jYXRjaCBvdmVyaGVhZCB3aGVuIHNpbmdsZSB0aHJlYWRlZC4KKwlyZXR1cm4gZXhwaXJlZCgpID8gX19zaGFyZWRfcHRyPGVsZW1lbnRfdHlwZSwgX0xwPigpCisJICAgICAgICAgICAgICAgICA6IF9fc2hhcmVkX3B0cjxlbGVtZW50X3R5cGUsIF9McD4oKnRoaXMpOworCisjZW5kaWYKKyAgICAgIH0gLy8gWFhYIE1UCisKKyAgICAgIGxvbmcKKyAgICAgIHVzZV9jb3VudCgpIGNvbnN0IC8vIG5ldmVyIHRocm93cworICAgICAgeyByZXR1cm4gX01fcmVmY291bnQuX01fZ2V0X3VzZV9jb3VudCgpOyB9CisKKyAgICAgIGJvb2wKKyAgICAgIGV4cGlyZWQoKSBjb25zdCAvLyBuZXZlciB0aHJvd3MKKyAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50Ll9NX2dldF91c2VfY291bnQoKSA9PSAwOyB9CisgICAgICAKKyAgICAgIHZvaWQKKyAgICAgIHJlc2V0KCkgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7IF9fd2Vha19wdHIoKS5zd2FwKCp0aGlzKTsgfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKF9fd2Vha19wdHImIF9fcykgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisJc3RkOjpzd2FwKF9NX3B0ciwgX19zLl9NX3B0cik7CisJX01fcmVmY291bnQuX01fc3dhcChfX3MuX01fcmVmY291bnQpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIC8vIFVzZWQgYnkgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgICAgIHZvaWQKKyAgICAgIF9NX2Fzc2lnbihfVHAqIF9fcHRyLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX3JlZmNvdW50KQorICAgICAgeworCV9NX3B0ciA9IF9fcHRyOworCV9NX3JlZmNvdW50ID0gX19yZWZjb3VudDsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgYm9vbAorICAgICAgICBfTV9sZXNzKGNvbnN0IF9fd2Vha19wdHI8X1RwMSwgX0xwPiYgX19yaHMpIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIF9NX3JlZmNvdW50IDwgX19yaHMuX01fcmVmY291bnQ7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgX0xvY2tfcG9saWN5IF9McDE+IGZyaWVuZCBjbGFzcyBfX3NoYXJlZF9wdHI7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCBfTG9ja19wb2xpY3kgX0xwMT4gZnJpZW5kIGNsYXNzIF9fd2Vha19wdHI7CisgICAgICBmcmllbmQgY2xhc3MgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfVHAsIF9McD47CisgICAgICBmcmllbmQgY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8X1RwPjsKKworICAgICAgLy8gRnJpZW5kIGluamVjdGVkIGludG8gbmFtZXNwYWNlIGFuZCBmb3VuZCBieSBBREwuCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBmcmllbmQgaW5saW5lIGJvb2wKKyAgICAgICAgb3BlcmF0b3I8KGNvbnN0IF9fd2Vha19wdHImIF9fbGhzLCBjb25zdCBfX3dlYWtfcHRyPF9UcDEsIF9McD4mIF9fcmhzKQorICAgICAgICB7IHJldHVybiBfX2xocy5fTV9sZXNzKF9fcmhzKTsgfQorCisgICAgICBfVHAqICAgICAgIAkgX01fcHRyOyAgICAgICAgIC8vIENvbnRhaW5lZCBwb2ludGVyLgorICAgICAgX193ZWFrX2NvdW50PF9McD4gIF9NX3JlZmNvdW50OyAgICAvLyBSZWZlcmVuY2UgY291bnRlci4KKyAgICB9OworCisgIC8vIDIuMi40Ljcgd2Vha19wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3dlYWtfcHRyPF9UcCwgX0xwPiYgX19hLCBfX3dlYWtfcHRyPF9UcCwgX0xwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfTG9ja19wb2xpY3kgX0xwPgorICAgIGNsYXNzIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMKKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorICAgICAgCisgICAgICBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmKSB7IH0KKyAgICAgIAorICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzJikKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgIH5fX2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzKCkgeyB9CisgICAgICAKKyAgICBwdWJsaWM6CisgICAgICBfX3NoYXJlZF9wdHI8X1RwLCBfTHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkKKyAgICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxfVHAsIF9McD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBfX3NoYXJlZF9wdHI8Y29uc3QgX1RwLCBfTHA+CisgICAgICBzaGFyZWRfZnJvbV90aGlzKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIF9fc2hhcmVkX3B0cjxjb25zdCBfVHAsIF9McD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHZvaWQKKyAgICAgICAgX01fd2Vha19hc3NpZ24oX1RwMSogX19wLCBjb25zdCBfX3NoYXJlZF9jb3VudDxfTHA+JiBfX24pIGNvbnN0CisgICAgICAgIHsgX01fd2Vha190aGlzLl9NX2Fzc2lnbihfX3AsIF9fbik7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZnJpZW5kIHZvaWQKKyAgICAgICAgX19lbmFibGVfc2hhcmVkX2Zyb21fdGhpc19oZWxwZXIoY29uc3QgX19zaGFyZWRfY291bnQ8X0xwPiYgX19wbiwKKwkJCQkJIGNvbnN0IF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMqIF9fcGUsCisJCQkJCSBjb25zdCBfVHAxKiBfX3B4KQorICAgICAgICB7CisJICBpZiAoX19wZSAhPSAwKQorCSAgICBfX3BlLT5fTV93ZWFrX2Fzc2lnbihjb25zdF9jYXN0PF9UcDEqPihfX3B4KSwgX19wbik7CisJfQorCisgICAgICBtdXRhYmxlIF9fd2Vha19wdHI8X1RwLCBfTHA+ICBfTV93ZWFrX3RoaXM7CisgICAgfTsKKworCisgIC8vIFRoZSBhY3R1YWwgc2hhcmVkX3B0ciwgd2l0aCBmb3J3YXJkaW5nIGNvbnN0cnVjdG9ycyBhbmQKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBzaGFyZWRfcHRyCisgICAgOiBwdWJsaWMgX19zaGFyZWRfcHRyPF9UcD4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgc2hhcmVkX3B0cigpCisgICAgICA6IF9fc2hhcmVkX3B0cjxfVHA+KCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHNoYXJlZF9wdHIoX1RwMSogX19wKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19wKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX0RlbGV0ZXI+CisgICAgICAgIHNoYXJlZF9wdHIoX1RwMSogX19wLCBfRGVsZXRlciBfX2QpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3AsIF9fZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgc2hhcmVkX3B0cihjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yKSB7IH0KKworI2lmICFkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSB8fCBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgc2hhcmVkX3B0cihzdGQ6OmF1dG9fcHRyPF9UcDE+JiBfX3IpCisJOiBfX3NoYXJlZF9wdHI8X1RwPihfX3IpIHsgfQorI2VuZGlmCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yLCBfX3N0YXRpY19jYXN0X3RhZykKKwk6IF9fc2hhcmVkX3B0cjxfVHA+KF9fciwgX19zdGF0aWNfY2FzdF90YWcoKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yLCBfX2NvbnN0X2Nhc3RfdGFnKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yLCBfX2NvbnN0X2Nhc3RfdGFnKCkpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzaGFyZWRfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fciwgX19keW5hbWljX2Nhc3RfdGFnKQorCTogX19zaGFyZWRfcHRyPF9UcD4oX19yLCBfX2R5bmFtaWNfY2FzdF90YWcoKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHNoYXJlZF9wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisjaWYgIWRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pIHx8IF9HTElCQ1hYX1VTRV9ERVBSRUNBVEVECisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICBzaGFyZWRfcHRyJgorICAgICAgICBvcGVyYXRvcj0oc3RkOjphdXRvX3B0cjxfVHAxPiYgX19yKQorICAgICAgICB7CisJICB0aGlzLT5fX3NoYXJlZF9wdHI8X1RwPjo6b3BlcmF0b3I9KF9fcik7CisJICByZXR1cm4gKnRoaXM7CisJfQorI2VuZGlmCisgICAgfTsKKworICAvLyAyLjIuMy44IHNoYXJlZF9wdHIgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3NoYXJlZF9wdHI8X1RwPiYgX19hLCBfX3NoYXJlZF9wdHI8X1RwPiYgX19iKQorICAgIHsgX19hLnN3YXAoX19iKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgX19zdGF0aWNfY2FzdF90YWcoKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9UcDE+CisgICAgaW5saW5lIHNoYXJlZF9wdHI8X1RwPgorICAgIGNvbnN0X3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpCisgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KF9fciwgX19jb25zdF9jYXN0X3RhZygpKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1RwMT4KKyAgICBpbmxpbmUgc2hhcmVkX3B0cjxfVHA+CisgICAgZHluYW1pY19wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxfVHAxPiYgX19yKQorICAgIHsgcmV0dXJuIHNoYXJlZF9wdHI8X1RwPihfX3IsIF9fZHluYW1pY19jYXN0X3RhZygpKTsgfQorCisKKyAgLy8gVGhlIGFjdHVhbCB3ZWFrX3B0ciwgd2l0aCBmb3J3YXJkaW5nIGNvbnN0cnVjdG9ycyBhbmQKKyAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyB3ZWFrX3B0cgorICAgIDogcHVibGljIF9fd2Vha19wdHI8X1RwPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB3ZWFrX3B0cigpCisgICAgICA6IF9fd2Vha19wdHI8X1RwPigpIHsgfQorICAgICAgCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB3ZWFrX3B0cihjb25zdCB3ZWFrX3B0cjxfVHAxPiYgX19yKQorCTogX193ZWFrX3B0cjxfVHA+KF9fcikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIHdlYWtfcHRyKGNvbnN0IHNoYXJlZF9wdHI8X1RwMT4mIF9fcikKKwk6IF9fd2Vha19wdHI8X1RwPihfX3IpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB3ZWFrX3B0ciYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHdlYWtfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICB0aGlzLT5fX3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMT4KKyAgICAgICAgd2Vha19wdHImCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPF9UcDE+JiBfX3IpIC8vIG5ldmVyIHRocm93cworICAgICAgICB7CisJICB0aGlzLT5fX3dlYWtfcHRyPF9UcD46Om9wZXJhdG9yPShfX3IpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgc2hhcmVkX3B0cjxfVHA+CisgICAgICBsb2NrKCkgY29uc3QgLy8gbmV2ZXIgdGhyb3dzCisgICAgICB7CisjaWZkZWYgX19HVEhSRUFEUworCWlmICh0aGlzLT5leHBpcmVkKCkpCisJICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCk7CisKKwlfX3RyeQorCSAgeworCSAgICByZXR1cm4gc2hhcmVkX3B0cjxfVHA+KCp0aGlzKTsKKwkgIH0KKwlfX2NhdGNoKGNvbnN0IGJhZF93ZWFrX3B0ciYpCisJICB7CisJICAgIHJldHVybiBzaGFyZWRfcHRyPF9UcD4oKTsKKwkgIH0KKyNlbHNlCisJcmV0dXJuIHRoaXMtPmV4cGlyZWQoKSA/IHNoYXJlZF9wdHI8X1RwPigpCisJICAgICAgICAgICAgICAgICAgICAgICA6IHNoYXJlZF9wdHI8X1RwPigqdGhpcyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcworICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQorICAgICAgCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyhjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpIHsgfQorCisgICAgICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYpCisgICAgICB7IHJldHVybiAqdGhpczsgfQorCisgICAgICB+ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgIHNoYXJlZF9wdHI8X1RwPgorICAgICAgc2hhcmVkX2Zyb21fdGhpcygpCisgICAgICB7IHJldHVybiBzaGFyZWRfcHRyPF9UcD4odGhpcy0+X01fd2Vha190aGlzKTsgfQorCisgICAgICBzaGFyZWRfcHRyPGNvbnN0IF9UcD4KKyAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdAorICAgICAgeyByZXR1cm4gc2hhcmVkX3B0cjxjb25zdCBfVHA+KHRoaXMtPl9NX3dlYWtfdGhpcyk7IH0KKworICAgIHByaXZhdGU6CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxPgorICAgICAgICB2b2lkCisgICAgICAgIF9NX3dlYWtfYXNzaWduKF9UcDEqIF9fcCwgY29uc3QgX19zaGFyZWRfY291bnQ8PiYgX19uKSBjb25zdAorICAgICAgICB7IF9NX3dlYWtfdGhpcy5fTV9hc3NpZ24oX19wLCBfX24pOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDE+CisgICAgICAgIGZyaWVuZCB2b2lkCisgICAgICAgIF9fZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXNfaGVscGVyKGNvbnN0IF9fc2hhcmVkX2NvdW50PD4mIF9fcG4sCisJCQkJCSBjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyogX19wZSwKKwkJCQkJIGNvbnN0IF9UcDEqIF9fcHgpCisgICAgICAgIHsKKwkgIGlmIChfX3BlICE9IDApCisJICAgIF9fcGUtPl9NX3dlYWtfYXNzaWduKGNvbnN0X2Nhc3Q8X1RwMSo+KF9fcHgpLCBfX3BuKTsKKwl9CisKKyAgICAgIG11dGFibGUgd2Vha19wdHI8X1RwPiAgX01fd2Vha190aGlzOworICAgIH07CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfQorfQorCisjZW5kaWYgLy8gX1RSMV9TSEFSRURfUFRSX0gKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3NwZWNpYWxfZnVuY3Rpb25fdXRpbC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3BlY2lhbF9mdW5jdGlvbl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwZmM1OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3NwZWNpYWxfZnVuY3Rpb25fdXRpbC5oCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBTcGVjaWFsIGZ1bmN0aW9ucyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvc3BlY2lhbF9mdW5jdGlvbl91dGlsLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXt0cjEvY21hdGh9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODIgVFIxOiA1LjIgIFNwZWNpYWwgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEVkd2FyZCBTbWl0aC1Sb3dsYW5kIGJhc2VkIG9uIG51bWVyb3VzIG1hdGhlbWF0aWNzIGJvb2tzLgorCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9TUEVDSUFMX0ZVTkNUSU9OX1VUSUxfSAorI2RlZmluZSBfR0xJQkNYWF9UUjFfU1BFQ0lBTF9GVU5DVElPTl9VVElMX0ggMQorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKKyAgbmFtZXNwYWNlIF9fZGV0YWlsCisgIHsKKyAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAgIC8vLyBBIGNsYXNzIHRvIGVuY2Fwc3VsYXRlIHR5cGUgZGVwZW5kZW50IGZsb2F0aW5nIHBvaW50CisgICAgLy8vIGNvbnN0YW50cy4gIE5vdCBldmVyeXRoaW5nIHdpbGwgYmUgYWJsZSB0byBiZSBleHByZXNzZWQgYXMKKyAgICAvLy8gdHlwZSBsb2dpYy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fZmxvYXRpbmdfcG9pbnRfY29uc3RhbnQKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgX1RwIF9fdmFsdWU7CisgICAgfTsKKworCisgICAgLy8vIEEgc3RydWN0dXJlIGZvciBudW1lcmljIGNvbnN0YW50cy4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgICBzdHJ1Y3QgX19udW1lcmljX2NvbnN0YW50cworICAgICAgeworICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBccGkgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fcGkoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI5TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgXHBpIC8gMiBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19waV8yKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuNTcwNzk2MzI2Nzk0ODk2NjE5MjMxMzIxNjkxNjM5NzUxNEwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxwaSAvIDMgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fcGlfMygpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjA0NzE5NzU1MTE5NjU5Nzc0NjE1NDIxNDQ2MTA5MzE2NzZMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCBccGkgLyA0IEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3BpXzQoKSB0aHJvdygpCisgICAgICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PF9UcD4oMC43ODUzOTgxNjMzOTc0NDgzMDk2MTU2NjA4NDU4MTk4NzU3TCk7IH0KKyAgICAgICAgLy8vICBDb25zdGFudCBAZiQgMSAvIFxwaSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX18xX3BpKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDAuMzE4MzA5ODg2MTgzNzkwNjcxNTM3NzY3NTI2NzQ1MDI4N0wpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIDIgLyBcc3FydChccGkpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfXzJfc3FydHBpKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuMTI4Mzc5MTY3MDk1NTEyNTczODk2MTU4OTAzMTIxNTQ1MkwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxzcXJ0KDIpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3NxcnQyKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuNDE0MjEzNTYyMzczMDk1MDQ4ODAxNjg4NzI0MjA5Njk4MUwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxzcXJ0KDMpIEBmJC4KKyAgICAgICAgc3RhdGljIF9UcCBfX3NxcnQzKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuNzMyMDUwODA3NTY4ODc3MjkzNTI3NDQ2MzQxNTA1ODcyM0wpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxzcXJ0KFxwaS8yKSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19zcXJ0cGlvMigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigxLjI1MzMxNDEzNzMxNTUwMDI1MTIwNzg4MjY0MjQwNTUyMjZMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEBmJCAxIC8gc3FydCgyKSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19zcXJ0MV8yKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODQ5MEwpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgQGYkIFxsb2coXHBpKSBAZiQuCisgICAgICAgIHN0YXRpYyBfVHAgX19sbnBpKCkgdGhyb3coKQorICAgICAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxfVHA+KDEuMTQ0NzI5ODg1ODQ5NDAwMTc0MTQzNDI3MzUxMzUzMDU4N0wpOyB9CisgICAgICAgIC8vLyAgQ29uc3RhbnQgRXVsZXIncyBjb25zdGFudCBAZiQgXGdhbW1hX0UgQGYkLgorICAgICAgICBzdGF0aWMgX1RwIF9fZ2FtbWFfZSgpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigwLjU3NzIxNTY2NDkwMTUzMjg2MDYwNjUxMjA5MDA4MjQwMjRMKTsgfQorICAgICAgICAvLy8gIENvbnN0YW50IEV1bGVyLU1hc2NoZXJvbmkgQGYkIGUgQGYkCisgICAgICAgIHN0YXRpYyBfVHAgX19ldWxlcigpIHRocm93KCkKKyAgICAgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8X1RwPigyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjVMKTsgfQorICAgICAgfTsKKworCisjaWYgX0dMSUJDWFhfVVNFX0M5OV9NQVRIICYmICFfR0xJQkNYWF9VU0VfQzk5X0ZQX01BQ1JPU19EWU5BTUlDCisKKyAgICAvLy8gVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBpc25hbiBmdW5jdGlvbi4gT3RoZXJ3aXNlLCBmb3IgTmFOLAorICAgIC8vLyBhbGwgY29tcGFyaXNvbnMgcmVzdWx0IGluIGZhbHNlLiBJZi93aGVuIHdlIGJ1aWxkIGEgc3RkOjppc25hbgorICAgIC8vLyBvdXQgb2YgaW50cmluc2ljcywgdGhpcyB3aWxsIGRpc2FwcGVhciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mCisgICAgLy8vIHN0ZDo6aXNuYW4uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBib29sIF9faXNuYW4oY29uc3QgX1RwIF9feCkKKyAgICB7CisgICAgICByZXR1cm4gc3RkOjppc25hbihfX3gpOworICAgIH0KKworI2Vsc2UKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgYm9vbCBfX2lzbmFuKGNvbnN0IF9UcCBfX3gpCisgICAgeworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25hbihfX3gpOworICAgIH0KKworICAgIHRlbXBsYXRlPD4KKyAgICBpbmxpbmUgYm9vbCBfX2lzbmFuPGZsb2F0Pihjb25zdCBmbG9hdCBfX3gpCisgICAgeworICAgICAgcmV0dXJuIF9fYnVpbHRpbl9pc25hbmYoX194KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgaW5saW5lIGJvb2wgX19pc25hbjxsb25nIGRvdWJsZT4oY29uc3QgbG9uZyBkb3VibGUgX194KQorICAgIHsKKyAgICAgIHJldHVybiBfX2J1aWx0aW5faXNuYW5sKF9feCk7CisgICAgfQorCisjZW5kaWYKKworICBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KKyAgfSAvLyBuYW1lc3BhY2UgX19kZXRhaWwKK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9TUEVDSUFMX0ZVTkNUSU9OX1VUSUxfSAorCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRhcmcuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3N0ZGFyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTczZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRhcmcuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgc3RkYXJnLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvc3RkYXJnLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NUREFSR19ICisjZGVmaW5lIF9UUjFfU1REQVJHX0ggMQorCisjaW5jbHVkZSA8dHIxL2NzdGRhcmc+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3RkYm9vbC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjFlNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRib29sLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHN0ZGJvb2wuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS9zdGRib29sLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NUREJPT0xfSAorI2RlZmluZSBfVFIxX1NUREJPT0xfSCAxCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGJvb2w+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3RkaW50LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTEzZmE1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3RkaW50LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHN0ZGludC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGludC5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX1RSMV9TVERJTlRfSAorI2RlZmluZSBfVFIxX1NURElOVF9IIDEKKworI2luY2x1ZGUgPHRyMS9jc3RkaW50PgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3N0ZGlvLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZWRmODMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRpby5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIFRSMSBzdGRpby5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGlvLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfVFIxX1NURElPX0gKKyNkZWZpbmUgX1RSMV9TVERJT19IIDEKKworI2luY2x1ZGUgPHRyMS9jc3RkaW8+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3RkbGliLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS9zdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTU3YWVjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvc3RkbGliLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gVFIxIHN0ZGxpYi5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3N0ZGxpYi5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1NURExJQl9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9TVERMSUJfSCAxCisKKyNpbmNsdWRlIDx0cjEvY3N0ZGxpYj4KKworI2lmIF9HTElCQ1hYX0hPU1RFRAorCisjaWYgX0dMSUJDWFhfVVNFX0M5OQorCit1c2luZyBzdGQ6OnRyMTo6YXRvbGw7Cit1c2luZyBzdGQ6OnRyMTo6c3RydG9sbDsKK3VzaW5nIHN0ZDo6dHIxOjpzdHJ0b3VsbDsKKwordXNpbmcgc3RkOjp0cjE6OmFiczsKKyNpZiAhX0dMSUJDWFhfVVNFX0M5OV9MT05HX0xPTkdfRFlOQU1JQwordXNpbmcgc3RkOjp0cjE6OmRpdjsKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfU1RETElCX0gKKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdGdtYXRoLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS90Z21hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA3MDMxCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdGdtYXRoLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFIxIHRnbWF0aC5oIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3RnbWF0aC5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1RHTUFUSF9ICisjZGVmaW5lIF9HTElCQ1hYX1RSMV9UR01BVEhfSCAxCisKKyNpbmNsdWRlIDx0cjEvY3RnbWF0aD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9UR01BVEhfSApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdHVwbGUgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS90dXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWFjNjQyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdHVwbGUKQEAgLTAsMCArMSw0MjYgQEAKKy8vIGNsYXNzIHRlbXBsYXRlIHR1cGxlIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3R1cGxlCisqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyovCisKKy8vIENocmlzIEplZmZlcnNvbiA8Y2hyaXNAYnViYmxlc2NvcGUubmV0PgorLy8gVmFyaWFkaWMgVGVtcGxhdGVzIHN1cHBvcnQgYnkgRG91Z2xhcyBHcmVnb3IgPGRvdWcuZ3JlZ29yQGdtYWlsLmNvbT4KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVFVQTEUKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1RVUExFIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEFkZHMgYSBjb25zdCByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfY19yZWYKKyAgICB7IHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfY19yZWY8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIC8vIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcmVmCisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JlZjxfVHAmPgorICAgIHsgdHlwZWRlZiBfVHAmIHR5cGU7IH07CisKKyAgLyoqCisgICAqIENvbnRhaW5zIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEBjIHR1cGxlIHRlbXBsYXRlLCBzdG9yZWQKKyAgICogYXMgYSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgKG1vc3QKKyAgICogZGVyaXZlZCBjbGFzcykgdG8gdGhlIGxhc3QgKGxlYXN0IGRlcml2ZWQgY2xhc3MpLiBUaGUgQGMgSWR4CisgICAqIHBhcmFtZXRlciBnaXZlcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgZWxlbWVudCBzdG9yZWQgYXQgdGhpcworICAgKiBwb2ludCBpbiB0aGUgaGllcmFyY2h5OyB3ZSB1c2UgaXQgdG8gaW1wbGVtZW50IGEgY29uc3RhbnQtdGltZQorICAgKiBnZXQoKSBvcGVyYXRpb24uCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX0lkeCwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDsgCisKKyAgLyoqCisgICAqIFplcm8tZWxlbWVudCB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyB0aGUgYmFzaXMgY2FzZSBmb3IgdGhlIAorICAgKiBpbmhlcml0YW5jZSByZWN1cnNpb24uCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX0lkeD4KKyAgICBzdHJ1Y3QgX1R1cGxlX2ltcGw8X0lkeD4geyB9OworCisgIC8qKgorICAgKiBSZWN1cnNpdmUgdHVwbGUgaW1wbGVtZW50YXRpb24uIEhlcmUgd2Ugc3RvcmUgdGhlIEBjIEhlYWQgZWxlbWVudAorICAgKiBhbmQgZGVyaXZlIGZyb20gYSBAYyBUdXBsZV9pbXBsIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50cworICAgKiAod2hpY2ggY29udGFpbnMgdGhlIEBjIFRhaWwpLgorICAgKi8KKyAgdGVtcGxhdGU8aW50IF9JZHgsIHR5cGVuYW1lIF9IZWFkLCB0eXBlbmFtZS4uLiBfVGFpbD4KKyAgICBzdHJ1Y3QgX1R1cGxlX2ltcGw8X0lkeCwgX0hlYWQsIF9UYWlsLi4uPgorICAgIDogcHVibGljIF9UdXBsZV9pbXBsPF9JZHggKyAxLCBfVGFpbC4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPF9JZHggKyAxLCBfVGFpbC4uLj4gX0luaGVyaXRlZDsKKyAgICAgIAorICAgICAgX0hlYWQgX01faGVhZDsKKyAgICAgIAorICAgICAgX0luaGVyaXRlZCYgICAgICAgX01fdGFpbCgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICBjb25zdCBfSW5oZXJpdGVkJiBfTV90YWlsKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIAorICAgICAgX1R1cGxlX2ltcGwoKSA6IF9Jbmhlcml0ZWQoKSwgX01faGVhZCgpIHsgfQorICAgICAgCisgICAgICBleHBsaWNpdCAKKyAgICAgIF9UdXBsZV9pbXBsKHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9IZWFkPjo6dHlwZSBfX2hlYWQsCisJCSAgdHlwZW5hbWUgX19hZGRfY19yZWY8X1RhaWw+Ojp0eXBlLi4uIF9fdGFpbCkKKyAgICAgIDogX0luaGVyaXRlZChfX3RhaWwuLi4pLCBfTV9oZWFkKF9faGVhZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICBfVHVwbGVfaW1wbChjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgIDogX0luaGVyaXRlZChfX2luLl9NX3RhaWwoKSksIF9NX2hlYWQoX19pbi5fTV9oZWFkKSB7IH0KKworICAgICAgX1R1cGxlX2ltcGwoY29uc3QgX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoX19pbi5fTV90YWlsKCkpLCBfTV9oZWFkKF9faW4uX01faGVhZCkgeyB9CisgICAgIAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICAgICAgX1R1cGxlX2ltcGwmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgICAgeworCSAgX01faGVhZCA9IF9faW4uX01faGVhZDsKKwkgIF9NX3RhaWwoKSA9IF9faW4uX01fdGFpbCgpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgX1R1cGxlX2ltcGwmCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICB7CisJX01faGVhZCA9IF9faW4uX01faGVhZDsKKwlfTV90YWlsKCkgPSBfX2luLl9NX3RhaWwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+IAorICAgIGNsYXNzIHR1cGxlIDogcHVibGljIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4gX0luaGVyaXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR1cGxlKCkgOiBfSW5oZXJpdGVkKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0dXBsZSh0eXBlbmFtZSBfX2FkZF9jX3JlZjxfRWxlbWVudHM+Ojp0eXBlLi4uIF9fZWxlbWVudHMpCisgICAgICA6IF9Jbmhlcml0ZWQoX19lbGVtZW50cy4uLikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIHR1cGxlKGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX2luKQorCTogX0luaGVyaXRlZChfX2luKSB7IH0KKworICAgICAgdHVwbGUoY29uc3QgdHVwbGUmIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoX19pbikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdHVwbGUmCisgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGUmIF9faW4pCisgICAgICB7CisJc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PiBjbGFzcyB0dXBsZTw+IHsgfTsKKworICAvLyAyLWVsZW1lbnQgdHVwbGUsIHdpdGggY29uc3RydWN0aW9uIGFuZCBhc3NpZ25tZW50IGZyb20gYSBwYWlyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgICBjbGFzcyB0dXBsZTxfVDEsIF9UMj4gOiBwdWJsaWMgX1R1cGxlX2ltcGw8MCwgX1QxLCBfVDI+CisgICAgeworICAgICAgdHlwZWRlZiBfVHVwbGVfaW1wbDwwLCBfVDEsIF9UMj4gX0luaGVyaXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIHR1cGxlKCkgOiBfSW5oZXJpdGVkKCkgeyB9CisKKyAgICAgIGV4cGxpY2l0CisgICAgICB0dXBsZSh0eXBlbmFtZSBfX2FkZF9jX3JlZjxfVDE+Ojp0eXBlIF9fYTEsCisJICAgIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9UMj46OnR5cGUgX19hMikKKyAgICAgIDogX0luaGVyaXRlZChfX2ExLCBfX2EyKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlKGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX19pbikgeyB9CisKKyAgICAgIHR1cGxlKGNvbnN0IHR1cGxlJiBfX2luKQorICAgICAgOiBfSW5oZXJpdGVkKF9faW4pIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKF9UdXBsZV9pbXBsPDAsIAorCQkgICAgIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9VMT46OnR5cGUsCisJCSAgICAgdHlwZW5hbWUgX19hZGRfY19yZWY8X1UyPjo6dHlwZT4oX19pbi5maXJzdCwgCisJCQkJCQkgICAgICBfX2luLnNlY29uZCkpCisgICAgICAgIHsgfQorICAKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlPF9VMSwgX1UyPiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KGNvbnN0IHBhaXI8X1UxLCBfVTI+JiBfX2luKQorICAgICAgICB7CisJICB0aGlzLT5fTV9oZWFkID0gX19pbi5maXJzdDsKKwkgIHRoaXMtPl9NX3RhaWwoKS5fTV9oZWFkID0gX19pbi5zZWNvbmQ7CisJICByZXR1cm4gKnRoaXM7CisJfQorICAgIH07CisKKyAgCisgIC8vLyBHaXZlcyB0aGUgdHlwZSBvZiB0aGUgaXRoIGVsZW1lbnQgb2YgYSBnaXZlbiB0dXBsZSB0eXBlLgorICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ7CisKKyAgLyoqCisgICAqIFJlY3Vyc2l2ZSBjYXNlIGZvciB0dXBsZV9lbGVtZW50OiBzdHJpcCBvZmYgdGhlIGZpcnN0IGVsZW1lbnQgaW4KKyAgICogdGhlIHR1cGxlIGFuZCByZXRyaWV2ZSB0aGUgKGktMSl0aCBlbGVtZW50IG9mIHRoZSByZW1haW5pbmcgdHVwbGUuCisgICAqLworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfSGVhZCwgX1RhaWwuLi4+ID4KKyAgICA6IHR1cGxlX2VsZW1lbnQ8X19pIC0gMSwgdHVwbGU8X1RhaWwuLi4+ID4geyB9OworCisgIC8qKgorICAgKiBCYXNpcyBjYXNlIGZvciB0dXBsZV9lbGVtZW50OiBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgb25lIHdlJ3JlIHNlZWtpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8X0hlYWQsIF9UYWlsLi4uPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfSGVhZCB0eXBlOworICAgIH07CisKKyAgLy8vIEZpbmRzIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHVwbGUgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9zaXplOworCisgIC8vLyBjbGFzcyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTx0dXBsZTxfRWxlbWVudHMuLi4+ID4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gc2l6ZW9mLi4uKF9FbGVtZW50cyk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgY29uc3QgaW50IHR1cGxlX3NpemU8dHVwbGU8X0VsZW1lbnRzLi4uPiA+Ojp2YWx1ZTsKKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX3JlZjxfSGVhZD46OnR5cGUKKyAgICBfX2dldF9oZWxwZXIoX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+JiBfX3QpCisgICAgeworICAgICAgcmV0dXJuIF9fdC5fTV9oZWFkOworICAgIH0KKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX2NfcmVmPF9IZWFkPjo6dHlwZQorICAgIF9fZ2V0X2hlbHBlcihjb25zdCBfVHVwbGVfaW1wbDxfX2ksIF9IZWFkLCBfVGFpbC4uLj4mIF9fdCkKKyAgICB7CisgICAgICByZXR1cm4gX190Ll9NX2hlYWQ7CisgICAgfQorCisgIC8vIFJldHVybiBhIHJlZmVyZW5jZSAoY29uc3QgcmVmZXJlbmNlKSB0byB0aGUgaXRoIGVsZW1lbnQgb2YgYSB0dXBsZS4KKyAgLy8gQW55IGNvbnN0IG9yIG5vbi1jb25zdCByZWYgZWxlbWVudHMgYXJlIHJldHVybmVkIHdpdGggdGhlaXIgb3JpZ2luYWwgdHlwZS4KKyAgdGVtcGxhdGU8aW50IF9faSwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2FkZF9yZWY8CisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfX2ksIHR1cGxlPF9FbGVtZW50cy4uLj4gPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgZ2V0KHR1cGxlPF9FbGVtZW50cy4uLj4mIF9fdCkKKyAgICB7IAorICAgICAgcmV0dXJuIF9fZ2V0X2hlbHBlcjxfX2k+KF9fdCk7IAorICAgIH0KKworICB0ZW1wbGF0ZTxpbnQgX19pLCB0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX2NfcmVmPAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfRWxlbWVudHMuLi4+ID46OnR5cGUKKyAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgIGdldChjb25zdCB0dXBsZTxfRWxlbWVudHMuLi4+JiBfX3QpCisgICAgeworICAgICAgcmV0dXJuIF9fZ2V0X2hlbHBlcjxfX2k+KF9fdCk7CisgICAgfQorCisgIC8vIFRoaXMgY2xhc3MgaGVscHMgY29uc3RydWN0IHRoZSB2YXJpb3VzIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBvbiB0dXBsZXMKKyAgdGVtcGxhdGU8aW50IF9fY2hlY2tfZXF1YWxfc2l6ZSwgaW50IF9faSwgaW50IF9faiwKKwkgICB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX190dXBsZV9jb21wYXJlOworCisgIHRlbXBsYXRlPGludCBfX2ksIGludCBfX2osIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2osIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIF9fZXEoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoZ2V0PF9faT4oX190KSA9PSBnZXQ8X19pPihfX3UpICYmCisJCV9fdHVwbGVfY29tcGFyZTwwLCBfX2krMSwgX19qLCBfVHAsIF9VcD46Ol9fZXEoX190LCBfX3UpKTsKKyAgICAgIH0KKyAgICAgCisgICAgICBzdGF0aWMgYm9vbCBfX2xlc3MoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoKGdldDxfX2k+KF9fdCkgPCBnZXQ8X19pPihfX3UpKQorCQl8fCAhKGdldDxfX2k+KF9fdSkgPCBnZXQ8X19pPihfX3QpKSAmJgorCQlfX3R1cGxlX2NvbXBhcmU8MCwgX19pKzEsIF9faiwgX1RwLCBfVXA+OjpfX2xlc3MoX190LCBfX3UpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPGludCBfX2ksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2ksIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIF9fZXEoY29uc3QgX1RwJiwgY29uc3QgX1VwJikKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgCisgICAgICBzdGF0aWMgYm9vbCBfX2xlc3MoY29uc3QgX1RwJiwgY29uc3QgX1VwJikKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVEVsZW1lbnRzLi4uPiBfVHA7CisgICAgICB0eXBlZGVmIHR1cGxlPF9VRWxlbWVudHMuLi4+IF9VcDsKKyAgICAgIHJldHVybiAoX190dXBsZV9jb21wYXJlPHR1cGxlX3NpemU8X1RwPjo6dmFsdWUgLSB0dXBsZV9zaXplPF9VcD46OnZhbHVlLAorCSAgICAgIDAsIHR1cGxlX3NpemU8X1RwPjo6dmFsdWUsIF9UcCwgX1VwPjo6X19lcShfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1RFbGVtZW50cy4uLj4gX1RwOworICAgICAgdHlwZWRlZiB0dXBsZTxfVUVsZW1lbnRzLi4uPiBfVXA7CisgICAgICByZXR1cm4gKF9fdHVwbGVfY29tcGFyZTx0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gdHVwbGVfc2l6ZTxfVXA+Ojp2YWx1ZSwKKwkgICAgICAwLCB0dXBsZV9zaXplPF9UcD46OnZhbHVlLCBfVHAsIF9VcD46Ol9fbGVzcyhfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX190ID09IF9fdSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7IHJldHVybiBfX3UgPCBfX3Q7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX191IDwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gIShfX3QgPCBfX3UpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIHJlZmVyZW5jZV93cmFwcGVyOworCisgIC8vIEhlbHBlciB3aGljaCBhZGRzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGVuIGdpdmVuIGEgcmVmZXJlbmNlX3dyYXBwZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyCisgICAgeworICAgICAgdHlwZWRlZiBfVHAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX3N0cmlwX3JlZmVyZW5jZV93cmFwcGVyPHJlZmVyZW5jZV93cmFwcGVyPF9UcD4gPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1RwJiBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8Y29uc3QgcmVmZXJlbmNlX3dyYXBwZXI8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfVHAmIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBpbmxpbmUgdHVwbGU8dHlwZW5hbWUgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisgICAgbWFrZV90dXBsZShfRWxlbWVudHMuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8dHlwZW5hbWUgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisgICAgICAgIF9fcmVzdWx0X3R5cGU7CisgICAgICByZXR1cm4gX19yZXN1bHRfdHlwZShfX2FyZ3MuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9FbGVtZW50cyYuLi4+CisgICAgdGllKF9FbGVtZW50cyYuLi4gX19hcmdzKQorICAgIHsKKyAgICAgIHJldHVybiB0dXBsZTxfRWxlbWVudHMmLi4uPihfX2FyZ3MuLi4pOworICAgIH0KKworICAvLyBBIGNsYXNzIChhbmQgaW5zdGFuY2UpIHdoaWNoIGNhbiBiZSB1c2VkIGluICd0aWUnIHdoZW4gYW4gZWxlbWVudAorICAvLyBvZiBhIHR1cGxlIGlzIG5vdCByZXF1aXJlZAorICBzdHJ1Y3QgX1N3YWxsb3dfYXNzaWduCisgIHsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgICBfU3dhbGxvd19hc3NpZ24mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1RwJikKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisKKyAgLy8gVE9ETzogUHV0IHRoaXMgaW4gc29tZSBraW5kIG9mIHNoYXJlZCBmaWxlLgorICBuYW1lc3BhY2UKKyAgeworICAgIF9Td2FsbG93X2Fzc2lnbiBpZ25vcmU7CisgIH07IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVFVQTEUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3R5cGVfdHJhaXRzIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdHlwZV90cmFpdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyNWZlNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3R5cGVfdHJhaXRzCkBAIC0wLDAgKzEsNjg5IEBACisvLyBUUjEgdHlwZV90cmFpdHMgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3R5cGVfdHJhaXRzCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1RZUEVfVFJBSVRTCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9UWVBFX1RSQUlUUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIG1ldGFwcm9ncmFtbWluZyBUeXBlIFRyYWl0cworICAgKiBAaW5ncm91cCB1dGlsaXRpZXMKKyAgICoKKyAgICogQ29tcGlsZSB0aW1lIHR5cGUgdHJhbnNmb3JtYXRpb24gYW5kIGluZm9ybWF0aW9uLgorICAgKiBAeworICAgKi8KKworICBzdHJ1Y3QgX19zZmluYWVfdHlwZXMKKyAgeworICAgIHR5cGVkZWYgY2hhciBfX29uZTsKKyAgICB0eXBlZGVmIHN0cnVjdCB7IGNoYXIgX19hcnJbMl07IH0gX190d287CisgIH07CisKKyNkZWZpbmUgX0RFRklORV9TUEVDXzBfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPD4KKworI2RlZmluZSBfREVGSU5FX1NQRUNfMV9IRUxQRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCisjZGVmaW5lIF9ERUZJTkVfU1BFQ18yX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9DcD4KKworI2RlZmluZSBfREVGSU5FX1NQRUMoX09yZGVyLCBfVHJhaXQsIF9UeXBlLCBfVmFsdWUpICAgIFwKKyAgX0RFRklORV9TUEVDXyMjX09yZGVyIyNfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IF9UcmFpdDxfVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9WYWx1ZT4geyB9OworCisgIC8vIGhlbHBlciBjbGFzc2VzIFs0LjNdLgorCisgIC8vLyBpbnRlZ3JhbF9jb25zdGFudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX3Y+CisgICAgc3RydWN0IGludGVncmFsX2NvbnN0YW50CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IF9UcCAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9fdjsKKyAgICAgIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8X1RwLCBfX3Y+ICAgdHlwZTsKKyAgICB9OworICAKKyAgLy8vIHR5cGVkZWYgZm9yIHRydWVfdHlwZQorICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHRydWU+ICAgICB0cnVlX3R5cGU7CisKKyAgLy8vIHR5cGVkZWYgZm9yIGZhbHNlX3R5cGUKKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBmYWxzZT4gICAgZmFsc2VfdHlwZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIF9UcCBfX3Y+CisgICAgY29uc3QgX1RwIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192Pjo6dmFsdWU7CisKKyAgLy8vIHJlbW92ZV9jdgorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2N2OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBfX2lzX3ZvaWRfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3ZvaWRfaGVscGVyLCB2b2lkLCB0cnVlKQorCisgIC8vIHByaW1hcnkgdHlwZSBjYXRlZ29yaWVzIFs0LjUuMV0uCisKKyAgLy8vIGlzX3ZvaWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc192b2lkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfdm9pZF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgYm9vbCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHNpZ25lZCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGNoYXIsIHRydWUpCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB3Y2hhcl90LCB0cnVlKQorI2VuZGlmCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgdW5zaWduZWQgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgaW50LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgbG9uZyBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcgbG9uZywgdHJ1ZSkKKworICAvLy8gaXNfaW50ZWdyYWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19pbnRlZ3JhbAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2ludGVncmFsX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyLCBmbG9hdCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyLCBkb3VibGUsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlciwgbG9uZyBkb3VibGUsIHRydWUpCisKKyAgLy8vIGlzX2Zsb2F0aW5nX3BvaW50CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2FycmF5CisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19hcnJheQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtfU2l6ZV0+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfcG9pbnRlcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDEsIF9faXNfcG9pbnRlcl9oZWxwZXIsIF9UcCosIHRydWUpCisKKyAgLy8vIGlzX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfcG9pbnRlcl9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3JlZmVyZW5jZTsKKworICAvLy8gaXNfZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcl9oZWxwZXIsIF9UcCBfQ3A6OiosCisJICAgICAgICFpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZSkKKworICAvLy8gaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyX2hlbHBlciwgX1RwIF9DcDo6KiwKKwkgICAgICAgaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUpCisKKyAgLy8vIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl9oZWxwZXI8CisJCQkJICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19lbnVtCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZW51bQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfZW51bShfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfdW5pb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc191bmlvbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdW5pb24oX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NsYXNzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfY2xhc3MKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2NsYXNzKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19mdW5jdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb24KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLyBjb21wb3NpdGUgdHlwZSB0cmFpdHMgWzQuNS4yXS4KKyAgCisgIC8vLyBpc19hcml0aG1ldGljCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfYXJpdGhtZXRpYworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX2Zsb2F0aW5nX3BvaW50PF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2Z1bmRhbWVudGFsCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZnVuZGFtZW50YWwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfb2JqZWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfb2JqZWN0CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgIShpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgICB8fCBpc19yZWZlcmVuY2U8X1RwPjo6dmFsdWUKKwkJCQkgICAgICAgfHwgaXNfdm9pZDxfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19tZW1iZXJfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX21lbWJlcl9wb2ludGVyOworCisgIC8vLyBpc19zY2FsYXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19zY2FsYXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX2VudW08X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc19wb2ludGVyPF9UcD46OnZhbHVlCisJCQkJICAgICAgfHwgaXNfbWVtYmVyX3BvaW50ZXI8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfY29tcG91bmQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb21wb3VuZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19mdW5kYW1lbnRhbDxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBpc19tZW1iZXJfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlciwgX1RwIF9DcDo6KiwgdHJ1ZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHN0cnVjdCBpc19tZW1iZXJfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gdHlwZSBwcm9wZXJ0aWVzIFs0LjUuM10uCisgIC8vLyBpc19jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfY29uc3QKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2NvbnN0PF9UcCBjb25zdD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworICAKKyAgLy8vIGlzX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc192b2xhdGlsZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdm9sYXRpbGU8X1RwIHZvbGF0aWxlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgLy8vIGlzX2VtcHR5CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZW1wdHkKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2VtcHR5KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19wb2x5bW9ycGhpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3BvbHltb3JwaGljCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2x5bW9ycGhpYyhfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfYWJzdHJhY3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19hYnN0cmFjdAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfYWJzdHJhY3QoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGhhc192aXJ0dWFsX2Rlc3RydWN0b3IKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBhbGlnbm1lbnRfb2YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhbGlnbm1lbnRfb2YKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgX19hbGlnbm9mX18oX1RwKT4geyB9OworICAKKyAgLy8vIHJhbmsKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IHJhbmsKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMD4geyB9OworICAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJhbms8X1RwW19TaXplXT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMSArIHJhbms8X1RwPjo6dmFsdWU+IHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJhbms8X1RwW10+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDEgKyByYW5rPF9UcD46OnZhbHVlPiB7IH07CisKKyAgLy8vIGV4dGVudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdW5zaWduZWQgX1VpbnQgPSAwPgorICAgIHN0cnVjdCBleHRlbnQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgMD4geyB9OworICAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB1bnNpZ25lZCBfVWludCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IGV4dGVudDxfVHBbX1NpemVdLCBfVWludD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwKKwkJCSAgICAgICBfVWludCA9PSAwID8gX1NpemUgOiBleHRlbnQ8X1RwLAorCQkJCQkJCSAgIF9VaW50IC0gMT46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHVuc2lnbmVkIF9VaW50PgorICAgIHN0cnVjdCBleHRlbnQ8X1RwW10sIF9VaW50PgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LAorCQkJICAgICAgIF9VaW50ID09IDAgPyAwIDogZXh0ZW50PF9UcCwKKwkJCQkJCSAgICAgICBfVWludCAtIDE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8gcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHR5cGVzIFs0LjZdLgorCisgIC8vLyBpc19zYW1lCisgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxfVHAsIF9UcD4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vIGNvbnN0LXZvbGF0aWxlIG1vZGlmaWNhdGlvbnMgWzQuNy4xXS4KKworICAvLy8gcmVtb3ZlX2NvbnN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2NvbnN0CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jb25zdDxfVHAgY29uc3Q+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyByZW1vdmVfdm9sYXRpbGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfdm9sYXRpbGUKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3ZvbGF0aWxlPF9UcCB2b2xhdGlsZT4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworICAKKyAgLy8vIHJlbW92ZV9jdgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jdgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIHJlbW92ZV9jb25zdDx0eXBlbmFtZSByZW1vdmVfdm9sYXRpbGU8X1RwPjo6dHlwZT46OnR5cGUgICAgIHR5cGU7CisgICAgfTsKKyAgCisgIC8vLyBhZGRfY29uc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfY29uc3QKKyAgICB7IHR5cGVkZWYgX1RwIGNvbnN0ICAgICB0eXBlOyB9OworICAgCisgIC8vLyBhZGRfdm9sYXRpbGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfdm9sYXRpbGUKKyAgICB7IHR5cGVkZWYgX1RwIHZvbGF0aWxlICAgICB0eXBlOyB9OworICAKKyAgLy8vIGFkZF9jdgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9jdgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUKKyAgICAgIGFkZF9jb25zdDx0eXBlbmFtZSBhZGRfdm9sYXRpbGU8X1RwPjo6dHlwZT46OnR5cGUgICAgIHR5cGU7CisgICAgfTsKKworICAvLyBhcnJheSBtb2RpZmljYXRpb25zIFs0LjcuM10uCisKKyAgLy8vIHJlbW92ZV9leHRlbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByZW1vdmVfZXh0ZW50PF9UcFtfU2l6ZV0+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQ8X1RwW10+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICAvLy8gcmVtb3ZlX2FsbF9leHRlbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2FsbF9leHRlbnRzCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM8X1RwW19TaXplXT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGUgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHM8X1RwW10+CisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9hbGxfZXh0ZW50czxfVHA+Ojp0eXBlICAgICB0eXBlOyB9OworCisgIC8vIHBvaW50ZXIgbW9kaWZpY2F0aW9ucyBbNC43LjRdLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fcmVtb3ZlX3BvaW50ZXJfaGVscGVyCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfcG9pbnRlcl9oZWxwZXI8X1RwLCBfVXAqPgorICAgIHsgdHlwZWRlZiBfVXAgICAgIHR5cGU7IH07CisKKyAgLy8vIHJlbW92ZV9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3JlbW92ZV9wb2ludGVyX2hlbHBlcjxfVHAsIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTsKKworICAvLy8gYWRkX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfcG9pbnRlcgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUqICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3JlZmVyZW5jZTxfVHAmPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3BvZChfVHApIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29weQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdHJpdmlhbF9hc3NpZ24KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBpc19wb2Q8X1RwPjo6dmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfbm90aHJvd19jb25zdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfbm90aHJvd19jb3B5CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfcG9kPF9UcD46OnZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc19ub3Rocm93X2Fzc2lnbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIGlzX3BvZDxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfc2lnbmVkX2hlbHBlcgorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworICBfREVGSU5FX1NQRUMoMCwgX19pc19zaWduZWRfaGVscGVyLCBzaWduZWQgY2hhciwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX3NpZ25lZF9oZWxwZXIsIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgbG9uZywgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfc2lnbmVkX2hlbHBlciwgbG9uZyBsb25nLCB0cnVlKQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2lnbmVkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfc2lnbmVkX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc191bnNpZ25lZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc191bnNpZ25lZF9oZWxwZXIsIHVuc2lnbmVkIHNob3J0LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc191bnNpZ25lZF9oZWxwZXIsIHVuc2lnbmVkIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdW5zaWduZWRfaGVscGVyLCB1bnNpZ25lZCBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc191bnNpZ25lZF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcgbG9uZywgdHJ1ZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3Vuc2lnbmVkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfdW5zaWduZWRfaGVscGVyPHR5cGVuYW1lCisJCQkJICAgICAgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9CYXNlLCB0eXBlbmFtZSBfRGVyaXZlZD4KKyAgICBzdHJ1Y3QgX19pc19iYXNlX29mX2hlbHBlcgorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9CYXNlPjo6dHlwZSAgICBfTm9Ddl9CYXNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY3Y8X0Rlcml2ZWQ+Ojp0eXBlIF9Ob0N2X0Rlcml2ZWQ7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gKGlzX3NhbWU8X0Jhc2UsIF9EZXJpdmVkPjo6dmFsdWUKKwkJCQkgICB8fCAoX19pc19iYXNlX29mKF9CYXNlLCBfRGVyaXZlZCkKKwkJCQkgICAgICAgJiYgIWlzX3NhbWU8X05vQ3ZfQmFzZSwKKwkJCQkgICAgICAgICAgICAgICAgICAgX05vQ3ZfRGVyaXZlZD46OnZhbHVlKSk7CisgICAgfTsKKyAKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Jhc2UsIHR5cGVuYW1lIF9EZXJpdmVkPgorICAgIHN0cnVjdCBpc19iYXNlX29mCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSAgICAgICBfX2lzX2Jhc2Vfb2ZfaGVscGVyPF9CYXNlLCBfRGVyaXZlZD46Ol9fdmFsdWU+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IF9faXNfY29udmVydGlibGVfc2ltcGxlCisgICAgOiBwdWJsaWMgX19zZmluYWVfdHlwZXMKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoX1RvKTsKKyAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsKKyAgICAgIHN0YXRpYyBfRnJvbSBfX21ha2VGcm9tKCk7CisgICAgCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IHNpemVvZihfX3Rlc3QoX19tYWtlRnJvbSgpKSkgPT0gMTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3JlZmVyZW5jZTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfaW50X29yX2NyZWYKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfX3JyX1RwOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IChpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZQorCQkJCSAgIHx8IChpc19pbnRlZ3JhbDxfX3JyX1RwPjo6dmFsdWUKKwkJCQkgICAgICAgJiYgaXNfY29uc3Q8X19ycl9UcD46OnZhbHVlCisJCQkJICAgICAgICYmICFpc192b2xhdGlsZTxfX3JyX1RwPjo6dmFsdWUpKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8sCisJICAgYm9vbCA9IChpc192b2lkPF9Gcm9tPjo6dmFsdWUgfHwgaXNfdm9pZDxfVG8+Ojp2YWx1ZQorCQkgICB8fCBpc19mdW5jdGlvbjxfVG8+Ojp2YWx1ZSB8fCBpc19hcnJheTxfVG8+Ojp2YWx1ZQorCQkgICAvLyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIG9ubHkgdG8gYXZvaWQgd2FybmluZ3MuCQorCQkgICB8fCAoaXNfZmxvYXRpbmdfcG9pbnQ8dHlwZW5hbWUKKwkJICAgICAgIHJlbW92ZV9yZWZlcmVuY2U8X0Zyb20+Ojp0eXBlPjo6dmFsdWUKKwkJICAgICAgICYmIF9faXNfaW50X29yX2NyZWY8X1RvPjo6X192YWx1ZSkpPgorICAgIHN0cnVjdCBfX2lzX2NvbnZlcnRpYmxlX2hlbHBlcgorICAgIHsKKyAgICAgIC8vICJBbiBpbWFnaW5hcnkgbHZhbHVlIG9mIHR5cGUgRnJvbS4uLiIuCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gKF9faXNfY29udmVydGlibGVfc2ltcGxlPHR5cGVuYW1lCisJCQkJICAgYWRkX3JlZmVyZW5jZTxfRnJvbT46OnR5cGUsIF9Ubz46Ol9fdmFsdWUpOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgX19pc19jb252ZXJ0aWJsZV9oZWxwZXI8X0Zyb20sIF9UbywgdHJ1ZT4KKyAgICB7IHN0YXRpYyBjb25zdCBib29sIF9fdmFsdWUgPSAoaXNfdm9pZDxfVG8+Ojp2YWx1ZQorCQkJCSAgIHx8IChfX2lzX2ludF9vcl9jcmVmPF9Ubz46Ol9fdmFsdWUKKwkJCQkgICAgICAgJiYgIWlzX3ZvaWQ8X0Zyb20+Ojp2YWx1ZSkpOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9Gcm9tLCB0eXBlbmFtZSBfVG8+CisgICAgc3RydWN0IGlzX2NvbnZlcnRpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSAgICAgICBfX2lzX2NvbnZlcnRpYmxlX2hlbHBlcjxfRnJvbSwgX1RvPjo6X192YWx1ZT4KKyAgICB7IH07CisKKyAgLy8gcmVmZXJlbmNlIG1vZGlmaWNhdGlvbnMgWzQuNy4yXS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9yZWZlcmVuY2U8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIC8vIE5COiBDYXJlZnVsIHdpdGggcmVmZXJlbmNlIHRvIHZvaWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgYm9vbCA9IChpc192b2lkPF9UcD46OnZhbHVlCisJCQkJIHx8IGlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSk+CisgICAgc3RydWN0IF9fYWRkX3JlZmVyZW5jZV9oZWxwZXIKKyAgICB7IHR5cGVkZWYgX1RwJiAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcmVmZXJlbmNlX2hlbHBlcjxfVHAsIHRydWU+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBfX2FkZF9yZWZlcmVuY2VfaGVscGVyPF9UcD4KKyAgICB7IH07CisKKyAgLy8gb3RoZXIgdHJhbnNmb3JtYXRpb25zIFs0LjhdLgorICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTGVuLCBzdGQ6OnNpemVfdCBfQWxpZ24+CisgICAgc3RydWN0IGFsaWduZWRfc3RvcmFnZQorICAgIHsgCisgICAgICB1bmlvbiB0eXBlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBfX2RhdGFbX0xlbl07CisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKChfQWxpZ24pKSkpIHsgfSBfX2FsaWduOyAKKyAgICAgIH07CisgICAgfTsKKworI3VuZGVmIF9ERUZJTkVfU1BFQ18wX0hFTFBFUgorI3VuZGVmIF9ERUZJTkVfU1BFQ18xX0hFTFBFUgorI3VuZGVmIF9ERUZJTkVfU1BFQ18yX0hFTFBFUgorI3VuZGVmIF9ERUZJTkVfU1BFQworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9UWVBFX1RSQUlUUwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdW5vcmRlcmVkX21hcCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3Vub3JkZXJlZF9tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiYWI5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3Vub3JkZXJlZF9tYXAKQEAgLTAsMCArMSw0NCBAQAorLy8gVFIxIHVub3JkZXJlZF9tYXAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdW5vcmRlcmVkX21hcAorICogIFRoaXMgaXMgYSBUUjEgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfTUFQCisjZGVmaW5lIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfTUFQIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxiaXRzL3N0bF9hbGdvYmFzZS5oPgorI2luY2x1ZGUgPGJpdHMvYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfZnVuY3Rpb24uaD4gLy8gZXF1YWxfdG8sIF9JZGVudGl0eSwgX1NlbGVjdDFzdAorI2luY2x1ZGUgPGJpdHMvc3RyaW5nZndkLmg+CisjaW5jbHVkZSA8dHIxL3R5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsX2hhc2guaD4KKyNpbmNsdWRlIDx0cjEvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXAuaD4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9VTk9SREVSRURfTUFQCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS91bm9yZGVyZWRfbWFwLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS91bm9yZGVyZWRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0MDRkMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3Vub3JkZXJlZF9tYXAuaApAQCAtMCwwICsxLDI3OCBAQAorLy8gVFIxIHVub3JkZXJlZF9tYXAgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvdW5vcmRlcmVkX21hcC5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7dHIxL3Vub3JkZXJlZF9tYXB9CisgKi8KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CituYW1lc3BhY2UgdHIxCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIE5COiBXaGVuIHdlIGdldCB0eXBlZGVmIHRlbXBsYXRlcyB0aGVzZSBjbGFzcyBkZWZpbml0aW9ucworICAvLyB3aWxsIGJlIHVubmVjZXNzYXJ5LgorICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsCisJICAgY2xhc3MgX0hhc2ggPSBoYXNoPF9LZXk+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfS2V5PiwKKwkgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGUgPSBmYWxzZT4KKyAgICBjbGFzcyBfX3Vub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBfSGFzaHRhYmxlPF9LZXksIHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+LCBfQWxsb2MsCisJCQlzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sIF9BbGxvYywKKwkJCSBzdGQ6Ol9TZWxlY3Qxc3Q8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4gPiwgX1ByZWQsCisJCQkgX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQkgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJIF9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCSBfX2NhY2hlX2hhc2hfY29kZSwgZmFsc2UsIHRydWU+CisJX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3Vub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJICAgICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJICAgICAgX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoKCksCisJICAgICAgX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfX3Vub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQlzaXplX3R5cGUgX19uID0gMTAsCisJCQljb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCWNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCWNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkJX19lcWwsIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+KCksIF9fYSkKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX211bHRpbWFwCisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZTxfS2V5LCBzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiwKKwkJCV9BbGxvYywKKwkJCXN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwKKwkJCV9IYXNoLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nLAorCQkJX19kZXRhaWw6Ol9EZWZhdWx0X3JhbmdlZF9oYXNoLAorCQkJX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJX19jYWNoZV9oYXNoX2NvZGUsIGZhbHNlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X0tleSwgc3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcD4sCisJCQkgX0FsbG9jLAorCQkJIHN0ZDo6X1NlbGVjdDFzdDxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwPiA+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCBmYWxzZSwgZmFsc2U+CisJX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgICAgICAgc2l6ZV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6aGFzaGVyICAgICAgICAgIGhhc2hlcjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmtleV9lcXVhbCAgICAgICBrZXlfZXF1YWw7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSAgYWxsb2NhdG9yX3R5cGU7CisKKyAgICAgIGV4cGxpY2l0CisgICAgICBfX3Vub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcoKSwKKwkgICAgICBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwKKwkgICAgICBfX2VxbCwgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4oKSwgX19hKQorICAgICAgeyB9CisKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0lucHV0SXRlcmF0b3I+CisJX191bm9yZGVyZWRfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICAgIHR5cGVuYW1lIF9CYXNlOjpzaXplX3R5cGUgX19uID0gMCwKKwkJCSAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2RldGFpbDo6X01vZF9yYW5nZV9oYXNoaW5nKCksCisJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLAorCQlfX2VxbCwgc3RkOjpfU2VsZWN0MXN0PHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsCisJIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgdGhhdCBhc3NvY2lhdGVzIHZhbHVlcyBvZiBhbm90aGVyIHR5cGUKKyAgICogIHdpdGggdGhlIGtleXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBLZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHBhcmFtICBIYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBlcXVhbF90bzxWYWx1ZT4uCisgICAqICBAcGFyYW0gIEFsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPEtleT4uCisgICAqCisgICAqIFRoZSByZXN1bHRpbmcgdmFsdWUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGlzIHN0ZDo6cGFpcjxjb25zdCBLZXksIFRwPi4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tYXAKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9tYXA8X0tleSwgX1RwLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tYXAoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9tYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgdGhhdCBhc3NvY2lhdGVzCisgICAqICB2YWx1ZXMgb2YgYW5vdGhlciB0eXBlIHdpdGggdGhlIGtleXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBLZXkgIFR5cGUgb2Yga2V5IG9iamVjdHMuCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIG1hcHBlZCBvYmplY3RzLgorICAgKiAgQHBhcmFtICBIYXNoICBIYXNoaW5nIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBoYXNoPFZhbHVlPi4KKyAgICogIEBwYXJhbSAgUHJlZCAgUHJlZGljYXRlIGZ1bmN0aW9uIG9iamVjdCB0eXBlLCBkZWZhdWx0cyB0byBlcXVhbF90bzxWYWx1ZT4uCisgICAqICBAcGFyYW0gIEFsbG9jICBBbGxvY2F0b3IgdHlwZSwgZGVmYXVsdHMgdG8gYWxsb2NhdG9yPEtleT4uCisgICAqCisgICAqIFRoZSByZXN1bHRpbmcgdmFsdWUgdHlwZSBvZiB0aGUgY29udGFpbmVyIGlzIHN0ZDo6cGFpcjxjb25zdCBLZXksIFRwPi4KKyAgICovCisgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwKKwkgICBjbGFzcyBfSGFzaCA9IGhhc2g8X0tleT4sCisJICAgY2xhc3MgX1ByZWQgPSBzdGQ6OmVxdWFsX3RvPF9LZXk+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHA+ID4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aW1hcAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbXVsdGltYXAoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKworICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX21hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3kpCisgICAgeyBfX3guc3dhcChfX3kpOyB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYz4KKyAgICBpbmxpbmUgdm9pZAorICAgIHN3YXAodW5vcmRlcmVkX211bHRpbWFwPF9LZXksIF9UcCwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+JiBfX3gsCisJIHVub3JkZXJlZF9tdWx0aW1hcDxfS2V5LCBfVHAsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3Vub3JkZXJlZF9zZXQgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS91bm9yZGVyZWRfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMmNiYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS91bm9yZGVyZWRfc2V0CkBAIC0wLDAgKzEsNDQgQEAKKy8vIFRSMSB1bm9yZGVyZWRfc2V0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3Vub3JkZXJlZF9zZXQKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVU5PUkRFUkVEX1NFVAorI2RlZmluZSBfR0xJQkNYWF9UUjFfVU5PUkRFUkVEX1NFVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+IC8vIGVxdWFsX3RvLCBfSWRlbnRpdHksIF9TZWxlY3Qxc3QKKyNpbmNsdWRlIDxiaXRzL3N0cmluZ2Z3ZC5oPgorI2luY2x1ZGUgPHRyMS90eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbF9oYXNoLmg+CisjaW5jbHVkZSA8dHIxL2hhc2h0YWJsZS5oPgorI2luY2x1ZGUgPHRyMS91bm9yZGVyZWRfc2V0Lmg+CisKKyNlbmRpZiAvLyBfR0xJQkNYWF9UUjFfVU5PUkRFUkVEX1NFVApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdW5vcmRlcmVkX3NldC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdW5vcmRlcmVkX3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS91bm9yZGVyZWRfc2V0LmgKQEAgLTAsMCArMSwyNjcgQEAKKy8vIFRSMSB1bm9yZGVyZWRfc2V0IGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3Vub3JkZXJlZF9zZXQuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3RyMS91bm9yZGVyZWRfc2V0fQorICovCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworbmFtZXNwYWNlIHRyMQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvLyBOQjogV2hlbiB3ZSBnZXQgdHlwZWRlZiB0ZW1wbGF0ZXMgdGhlc2UgY2xhc3MgZGVmaW5pdGlvbnMKKyAgLy8gd2lsbCBiZSB1bm5lY2Vzc2FyeS4KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX3NldAorICAgIDogcHVibGljIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4sIF9QcmVkLAorCQkJX0hhc2gsIF9fZGV0YWlsOjpfTW9kX3JhbmdlX2hhc2hpbmcsCisJCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQlfX2RldGFpbDo6X1ByaW1lX3JlaGFzaF9wb2xpY3ksCisJCQlfX2NhY2hlX2hhc2hfY29kZSwgdHJ1ZSwgdHJ1ZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCSBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCB0cnVlPgorCV9CYXNlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6Omhhc2hlciAgICAgICAgICBoYXNoZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjprZXlfZXF1YWwgICAgICAga2V5X2VxdWFsOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgIGFsbG9jYXRvcl90eXBlOworCisgICAgICBleHBsaWNpdAorICAgICAgX191bm9yZGVyZWRfc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkgICAgICBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+KCksIF9fYSkKKyAgICAgIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwlfX3Vub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQlzaXplX3R5cGUgX19uID0gMTAsCisJCQljb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCWNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCWNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4sCisJICAgYm9vbCBfX2NhY2hlX2hhc2hfY29kZSA9IGZhbHNlPgorICAgIGNsYXNzIF9fdW5vcmRlcmVkX211bHRpc2V0CisgICAgOiBwdWJsaWMgX0hhc2h0YWJsZTxfVmFsdWUsIF9WYWx1ZSwgX0FsbG9jLAorCQkJc3RkOjpfSWRlbnRpdHk8X1ZhbHVlPiwgX1ByZWQsCisJCQlfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCV9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCwKKwkJCV9fZGV0YWlsOjpfUHJpbWVfcmVoYXNoX3BvbGljeSwKKwkJCV9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCBmYWxzZT4KKyAgICB7CisgICAgICB0eXBlZGVmIF9IYXNodGFibGU8X1ZhbHVlLCBfVmFsdWUsIF9BbGxvYywKKwkJCSBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+LCBfUHJlZCwKKwkJCSBfSGFzaCwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZywKKwkJCSBfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2gsCisJCQkgX19kZXRhaWw6Ol9QcmltZV9yZWhhc2hfcG9saWN5LAorCQkJIF9fY2FjaGVfaGFzaF9jb2RlLCB0cnVlLCBmYWxzZT4KKwlfQmFzZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIF9fdW5vcmRlcmVkX211bHRpc2V0KHNpemVfdHlwZSBfX24gPSAxMCwKKwkJCSAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisgICAgICA6IF9CYXNlKF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCSAgICAgIF9fZGV0YWlsOjpfRGVmYXVsdF9yYW5nZWRfaGFzaCgpLCBfX2VxbCwKKwkgICAgICBzdGQ6Ol9JZGVudGl0eTxfVmFsdWU+KCksIF9fYSkKKyAgICAgIHsgfQorCisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCV9fdW5vcmRlcmVkX211bHRpc2V0KF9JbnB1dEl0ZXJhdG9yIF9fZiwgX0lucHV0SXRlcmF0b3IgX19sLAorCQkJICAgICB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICAgIGNvbnN0IGhhc2hlciYgX19oZiA9IGhhc2hlcigpLAorCQkJICAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCQkgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19kZXRhaWw6Ol9Nb2RfcmFuZ2VfaGFzaGluZygpLAorCQlfX2RldGFpbDo6X0RlZmF1bHRfcmFuZ2VkX2hhc2goKSwgX19lcWwsCisJCXN0ZDo6X0lkZW50aXR5PF9WYWx1ZT4oKSwgX19hKQorCXsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfSGFzaCwgY2xhc3MgX1ByZWQsIGNsYXNzIF9BbGxvYywKKwkgICBib29sIF9fY2FjaGVfaGFzaF9jb2RlPgorICAgIGlubGluZSB2b2lkCisgICAgc3dhcChfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYywgX19jYWNoZV9oYXNoX2NvZGU+JiBfX3gsCisJIF9fdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVmFsdWUsIGNsYXNzIF9IYXNoLCBjbGFzcyBfUHJlZCwgY2xhc3MgX0FsbG9jLAorCSAgIGJvb2wgX19jYWNoZV9oYXNoX2NvZGU+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKF9fdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLAorCSBfQWxsb2MsIF9fY2FjaGVfaGFzaF9jb2RlPiYgX194LAorCSBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwKKwkgX0FsbG9jLCBfX2NhY2hlX2hhc2hfY29kZT4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworCisgIC8qKgorICAgKiAgQGJyaWVmIEEgc3RhbmRhcmQgY29udGFpbmVyIGNvbXBvc2VkIG9mIHVuaXF1ZSBrZXlzIChjb250YWluaW5nCisgICAqICBhdCBtb3N0IG9uZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlIGVsZW1lbnRzJyBrZXlzIGFyZQorICAgKiAgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBWYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9zZXQKKyAgICA6IHB1YmxpYyBfX3Vub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4KKyAgICB7CisgICAgICB0eXBlZGVmIF9fdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9zZXQoc2l6ZV90eXBlIF9fbiA9IDEwLAorCQkgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICBjb25zdCBrZXlfZXF1YWwmIF9fZXFsID0ga2V5X2VxdWFsKCksCisJCSAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKKyAgICAgIDogX0Jhc2UoX19uLCBfX2hmLCBfX2VxbCwgX19hKQorICAgICAgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9JbnB1dEl0ZXJhdG9yPgorCXVub3JkZXJlZF9zZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCSAgICAgIHNpemVfdHlwZSBfX24gPSAxMCwKKwkJICAgICAgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCSAgICAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCisJOiBfQmFzZShfX2YsIF9fbCwgX19uLCBfX2hmLCBfX2VxbCwgX19hKQorCXsgfQorICAgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgQSBzdGFuZGFyZCBjb250YWluZXIgY29tcG9zZWQgb2YgZXF1aXZhbGVudCBrZXlzCisgICAqICAocG9zc2libHkgY29udGFpbmluZyBtdWx0aXBsZSBvZiBlYWNoIGtleSB2YWx1ZSkgaW4gd2hpY2ggdGhlCisgICAqICBlbGVtZW50cycga2V5cyBhcmUgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMuCisgICAqCisgICAqICBAaW5ncm91cCB1bm9yZGVyZWRfYXNzb2NpYXRpdmVfY29udGFpbmVycworICAgKgorICAgKiAgTWVldHMgdGhlIHJlcXVpcmVtZW50cyBvZiBhIDxhIGhyZWY9InRhYmxlcy5odG1sIzY1Ij5jb250YWluZXI8L2E+LCBhbmQKKyAgICogIDxhIGhyZWY9InRhYmxlcy5odG1sI3h4Ij51bm9yZGVyZWQgYXNzb2NpYXRpdmUgY29udGFpbmVyPC9hPgorICAgKgorICAgKiAgQHBhcmFtICBWYWx1ZSAgVHlwZSBvZiBrZXkgb2JqZWN0cy4KKyAgICogIEBwYXJhbSAgSGFzaCAgSGFzaGluZyBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gaGFzaDxWYWx1ZT4uCisgICAqICBAcGFyYW0gIFByZWQgIFByZWRpY2F0ZSBmdW5jdGlvbiBvYmplY3QgdHlwZSwgZGVmYXVsdHMgdG8gZXF1YWxfdG88VmFsdWU+LgorICAgKiAgQHBhcmFtICBBbGxvYyAgQWxsb2NhdG9yIHR5cGUsIGRlZmF1bHRzIHRvIGFsbG9jYXRvcjxLZXk+LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1ZhbHVlLAorCSAgIGNsYXNzIF9IYXNoID0gaGFzaDxfVmFsdWU+LAorCSAgIGNsYXNzIF9QcmVkID0gc3RkOjplcXVhbF90bzxfVmFsdWU+LAorCSAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPF9WYWx1ZT4gPgorICAgIGNsYXNzIHVub3JkZXJlZF9tdWx0aXNldAorICAgIDogcHVibGljIF9fdW5vcmRlcmVkX211bHRpc2V0PF9WYWx1ZSwgX0hhc2gsIF9QcmVkLCBfQWxsb2M+CisgICAgeworICAgICAgdHlwZWRlZiBfX3Vub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiAgX0Jhc2U7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjp2YWx1ZV90eXBlICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OnNpemVfdHlwZSAgICAgICBzaXplX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjpoYXNoZXIgICAgICAgICAgaGFzaGVyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6a2V5X2VxdWFsICAgICAgIGtleV9lcXVhbDsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlICBhbGxvY2F0b3JfdHlwZTsKKworICAgICAgZXhwbGljaXQKKyAgICAgIHVub3JkZXJlZF9tdWx0aXNldChzaXplX3R5cGUgX19uID0gMTAsCisJCQkgY29uc3QgaGFzaGVyJiBfX2hmID0gaGFzaGVyKCksCisJCQkgY29uc3Qga2V5X2VxdWFsJiBfX2VxbCA9IGtleV9lcXVhbCgpLAorCQkJIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorICAgICAgOiBfQmFzZShfX24sIF9faGYsIF9fZXFsLCBfX2EpCisgICAgICB7IH0KKworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSW5wdXRJdGVyYXRvcj4KKwl1bm9yZGVyZWRfbXVsdGlzZXQoX0lucHV0SXRlcmF0b3IgX19mLCBfSW5wdXRJdGVyYXRvciBfX2wsCisJCQkgICB0eXBlbmFtZSBfQmFzZTo6c2l6ZV90eXBlIF9fbiA9IDAsCisJCQkgICBjb25zdCBoYXNoZXImIF9faGYgPSBoYXNoZXIoKSwKKwkJCSAgIGNvbnN0IGtleV9lcXVhbCYgX19lcWwgPSBrZXlfZXF1YWwoKSwKKwkJCSAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQorCTogX0Jhc2UoX19mLCBfX2wsIF9fbiwgX19oZiwgX19lcWwsIF9fYSkKKwl7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9zZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feCwKKwkgdW5vcmRlcmVkX3NldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX195KQorICAgIHsgX194LnN3YXAoX195KTsgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0hhc2gsIGNsYXNzIF9QcmVkLCBjbGFzcyBfQWxsb2M+CisgICAgaW5saW5lIHZvaWQKKyAgICBzd2FwKHVub3JkZXJlZF9tdWx0aXNldDxfVmFsdWUsIF9IYXNoLCBfUHJlZCwgX0FsbG9jPiYgX194LAorCSB1bm9yZGVyZWRfbXVsdGlzZXQ8X1ZhbHVlLCBfSGFzaCwgX1ByZWQsIF9BbGxvYz4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS91dGlsaXR5IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdXRpbGl0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM2NzNhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvdXRpbGl0eQpAQCAtMCwwICsxLDEwOSBAQAorLy8gVFIxIHV0aWxpdHkgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LiAyMDA5LCAyMDEwLCAyMDExCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgdHIxL3V0aWxpdHkKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfVVRJTElUWQorI2RlZmluZSBfR0xJQkNYWF9UUjFfVVRJTElUWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcmVsb3BzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK25hbWVzcGFjZSB0cjEKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGNsYXNzIHR1cGxlX3NpemU7CisKKyAgdGVtcGxhdGU8aW50IF9JbnQsIGNsYXNzIF9UcD4KKyAgICBjbGFzcyB0dXBsZV9lbGVtZW50OworCisgICAvLyBWYXJpb3VzIGZ1bmN0aW9ucyB3aGljaCBnaXZlIHN0ZDo6cGFpciBhIHR1cGxlLWxpa2UgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9zaXplPHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+CisgICAgeyBzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMjsgfTsKKworICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIGNvbnN0IGludAorICAgIHR1cGxlX3NpemU8c3RkOjpwYWlyPF9UcDEsIF9UcDI+ID46OnZhbHVlOworCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID4KKyAgICB7IHR5cGVkZWYgX1RwMSB0eXBlOyB9OworIAorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDEsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+CisgICAgeyB0eXBlZGVmIF9UcDIgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTxpbnQgX0ludD4KKyAgICBzdHJ1Y3QgX19wYWlyX2dldDsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fcGFpcl9nZXQ8MD4KKyAgICB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAxLCB0eXBlbmFtZSBfVHAyPgorICAgICAgc3RhdGljIF9UcDEmIF9fZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19wYWlyKQorICAgICAgeyByZXR1cm4gX19wYWlyLmZpcnN0OyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICBzdGF0aWMgY29uc3QgX1RwMSYgX19jb25zdF9nZXQoY29uc3Qgc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpCisgICAgICB7IHJldHVybiBfX3BhaXIuZmlyc3Q7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wYWlyX2dldDwxPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICBzdGF0aWMgX1RwMiYgX19nZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpCisgICAgICB7IHJldHVybiBfX3BhaXIuc2Vjb25kOyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICBzdGF0aWMgY29uc3QgX1RwMiYgX19jb25zdF9nZXQoY29uc3Qgc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpCisgICAgICB7IHJldHVybiBfX3BhaXIuc2Vjb25kOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxpbnQgX0ludCwgY2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBpbmxpbmUgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfSW50LCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4gPjo6dHlwZSYKKyAgICBnZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX2luKQorICAgIHsgcmV0dXJuIF9fcGFpcl9nZXQ8X0ludD46Ol9fZ2V0KF9faW4pOyB9CisKKyAgdGVtcGxhdGU8aW50IF9JbnQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0ludCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID46OnR5cGUmCisgICAgZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19pbikKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX2NvbnN0X2dldChfX2luKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30KK30KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9VVElMSVRZCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS93Y2hhci5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvd2NoYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTk2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90cjEvd2NoYXIuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgd2NoYXIuaCAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHRyMS93Y2hhci5oCisgKiAgVGhpcyBpcyBhIFRSMSBDKysgTGlicmFyeSBoZWFkZXIuIAorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFIxX1dDSEFSX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1dDSEFSX0ggMQorCisjaW5jbHVkZSA8dHIxL2N3Y2hhcj4KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RSMV9XQ0hBUl9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS93Y3R5cGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHIxL3djdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDk0OGEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3RyMS93Y3R5cGUuaApAQCAtMCwwICsxLDM0IEBACisvLyBUUjEgd2N0eXBlLmggLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0cjEvd2N0eXBlLmgKKyAqICBUaGlzIGlzIGEgVFIxIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UUjFfV0NUWVBFX0gKKyNkZWZpbmUgX0dMSUJDWFhfVFIxX1dDVFlQRV9IIDEKKworI2luY2x1ZGUgPHRyMS9jd2N0eXBlPgorCisjZW5kaWYgLy8gX0dMSUJDWFhfVFIxX1dDVFlQRV9ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3R1cGxlIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90dXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQ1MmFlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90dXBsZQpAQCAtMCwwICsxLDgwOCBAQAorLy8gPHR1cGxlPiAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdHVwbGUKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFVQTEUKKyNkZWZpbmUgX0dMSUJDWFhfVFVQTEUgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyMgaW5jbHVkZSA8Yml0cy9jKysweF93YXJuaW5nLmg+CisjZWxzZQorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIEFkZHMgYSBjb25zdCByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfY19yZWYKKyAgICB7IHR5cGVkZWYgY29uc3QgX1RwJiB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfY19yZWY8X1RwJj4KKyAgICB7IHR5cGVkZWYgX1RwJiB0eXBlOyB9OworCisgIC8vIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBub24tcmVmZXJlbmNlIHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfcmVmCisgICAgeyB0eXBlZGVmIF9UcCYgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3JlZjxfVHAmPgorICAgIHsgdHlwZWRlZiBfVHAmIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUgX0hlYWQsIGJvb2wgX0lzRW1wdHk+CisgICAgc3RydWN0IF9IZWFkX2Jhc2U7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUgX0hlYWQ+CisgICAgc3RydWN0IF9IZWFkX2Jhc2U8X0lkeCwgX0hlYWQsIHRydWU+CisgICAgOiBwdWJsaWMgX0hlYWQKKyAgICB7CisgICAgICBjb25zdGV4cHIgX0hlYWRfYmFzZSgpCisgICAgICA6IF9IZWFkKCkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciBfSGVhZF9iYXNlKGNvbnN0IF9IZWFkJiBfX2gpCisgICAgICA6IF9IZWFkKF9faCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZD4KKyAgICAgICAgX0hlYWRfYmFzZShfVUhlYWQmJiBfX2gpCisJOiBfSGVhZChzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX2gpKSB7IH0KKworICAgICAgX0hlYWQmICAgICAgIF9NX2hlYWQoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgICAgY29uc3QgX0hlYWQmIF9NX2hlYWQoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorICAgIAorICAgICAgdm9pZCAKKyAgICAgIF9NX3N3YXBfaW1wbChfSGVhZCYgX19oKQorICAgICAgeworCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKF9faCwgX01faGVhZCgpKTsKKyAgICAgIH0KKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JZHgsIHR5cGVuYW1lIF9IZWFkPgorICAgIHN0cnVjdCBfSGVhZF9iYXNlPF9JZHgsIF9IZWFkLCBmYWxzZT4KKyAgICB7CisgICAgICBjb25zdGV4cHIgX0hlYWRfYmFzZSgpCisgICAgICA6IF9NX2hlYWRfaW1wbCgpIHsgfQorCisgICAgICBjb25zdGV4cHIgX0hlYWRfYmFzZShjb25zdCBfSGVhZCYgX19oKQorICAgICAgOiBfTV9oZWFkX2ltcGwoX19oKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VIZWFkPgorICAgICAgICBfSGVhZF9iYXNlKF9VSGVhZCYmIF9faCkKKwk6IF9NX2hlYWRfaW1wbChzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX2gpKSB7IH0KKworICAgICAgX0hlYWQmICAgICAgIF9NX2hlYWQoKSAgICAgICB7IHJldHVybiBfTV9oZWFkX2ltcGw7IH0KKyAgICAgIGNvbnN0IF9IZWFkJiBfTV9oZWFkKCkgY29uc3QgeyByZXR1cm4gX01faGVhZF9pbXBsOyB9ICAgICAgICAKKworICAgICAgdm9pZAorICAgICAgX01fc3dhcF9pbXBsKF9IZWFkJiBfX2gpCisgICAgICB7IAorCXVzaW5nIHN0ZDo6c3dhcDsKKwlzd2FwKF9faCwgX01faGVhZCgpKTsKKyAgICAgIH0KKworICAgICAgX0hlYWQgX01faGVhZF9pbXBsOyAKKyAgICB9OworCisgIC8qKgorICAgKiBDb250YWlucyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBAYyB0dXBsZSB0ZW1wbGF0ZSwgc3RvcmVkCisgICAqIGFzIGEgcmVjdXJzaXZlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmcm9tIHRoZSBmaXJzdCBlbGVtZW50IChtb3N0CisgICAqIGRlcml2ZWQgY2xhc3MpIHRvIHRoZSBsYXN0IChsZWFzdCBkZXJpdmVkIGNsYXNzKS4gVGhlIEBjIElkeAorICAgKiBwYXJhbWV0ZXIgZ2l2ZXMgdGhlIDAtYmFzZWQgaW5kZXggb2YgdGhlIGVsZW1lbnQgc3RvcmVkIGF0IHRoaXMKKyAgICogcG9pbnQgaW4gdGhlIGhpZXJhcmNoeTsgd2UgdXNlIGl0IHRvIGltcGxlbWVudCBhIGNvbnN0YW50LXRpbWUKKyAgICogZ2V0KCkgb3BlcmF0aW9uLgorICAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDsgCisKKyAgLyoqCisgICAqIFplcm8tZWxlbWVudCB0dXBsZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyB0aGUgYmFzaXMgY2FzZSBmb3IgdGhlIAorICAgKiBpbmhlcml0YW5jZSByZWN1cnNpb24uCisgICAqLworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSWR4PgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDxfSWR4PgorICAgIHsgCisgICAgcHJvdGVjdGVkOgorICAgICAgdm9pZCBfTV9zd2FwX2ltcGwoX1R1cGxlX2ltcGwmKSB7IC8qIG5vLW9wICovIH0KKyAgICB9OworCisgIC8qKgorICAgKiBSZWN1cnNpdmUgdHVwbGUgaW1wbGVtZW50YXRpb24uIEhlcmUgd2Ugc3RvcmUgdGhlIEBjIEhlYWQgZWxlbWVudAorICAgKiBhbmQgZGVyaXZlIGZyb20gYSBAYyBUdXBsZV9pbXBsIGNvbnRhaW5pbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50cworICAgKiAod2hpY2ggY29udGFpbnMgdGhlIEBjIFRhaWwpLgorICAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0lkeCwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIHN0cnVjdCBfVHVwbGVfaW1wbDxfSWR4LCBfSGVhZCwgX1RhaWwuLi4+CisgICAgOiBwdWJsaWMgX1R1cGxlX2ltcGw8X0lkeCArIDEsIF9UYWlsLi4uPiwKKyAgICAgIHByaXZhdGUgX0hlYWRfYmFzZTxfSWR4LCBfSGVhZCwgc3RkOjppc19lbXB0eTxfSGVhZD46OnZhbHVlPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1R1cGxlX2ltcGw8X0lkeCArIDEsIF9UYWlsLi4uPiBfSW5oZXJpdGVkOworICAgICAgdHlwZWRlZiBfSGVhZF9iYXNlPF9JZHgsIF9IZWFkLCBzdGQ6OmlzX2VtcHR5PF9IZWFkPjo6dmFsdWU+IF9CYXNlOworCisgICAgICBfSGVhZCYgICAgICAgICAgICBfTV9oZWFkKCkgICAgICAgeyByZXR1cm4gX0Jhc2U6Ol9NX2hlYWQoKTsgfQorICAgICAgY29uc3QgX0hlYWQmICAgICAgX01faGVhZCgpIGNvbnN0IHsgcmV0dXJuIF9CYXNlOjpfTV9oZWFkKCk7IH0KKworICAgICAgX0luaGVyaXRlZCYgICAgICAgX01fdGFpbCgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICAgICBjb25zdCBfSW5oZXJpdGVkJiBfTV90YWlsKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgY29uc3RleHByIF9UdXBsZV9pbXBsKCkKKyAgICAgIDogX0luaGVyaXRlZCgpLCBfQmFzZSgpIHsgfQorCisgICAgICBleHBsaWNpdCAKKyAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbChjb25zdCBfSGVhZCYgX19oZWFkLCBjb25zdCBfVGFpbCYuLi4gX190YWlsKQorICAgICAgOiBfSW5oZXJpdGVkKF9fdGFpbC4uLiksIF9CYXNlKF9faGVhZCkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUuLi4gX1VUYWlsPiAKKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgX1R1cGxlX2ltcGwoX1VIZWFkJiYgX19oZWFkLCBfVVRhaWwmJi4uLiBfX3RhaWwpCisJOiBfSW5oZXJpdGVkKHN0ZDo6Zm9yd2FyZDxfVVRhaWw+KF9fdGFpbCkuLi4pLAorCSAgX0Jhc2Uoc3RkOjpmb3J3YXJkPF9VSGVhZD4oX19oZWFkKSkgeyB9CisKKyAgICAgIGNvbnN0ZXhwciBfVHVwbGVfaW1wbChjb25zdCBfVHVwbGVfaW1wbCYpID0gZGVmYXVsdDsKKworICAgICAgX1R1cGxlX2ltcGwoX1R1cGxlX2ltcGwmJiBfX2luKQorICAgICAgOiBfSW5oZXJpdGVkKHN0ZDo6bW92ZShfX2luLl9NX3RhaWwoKSkpLCAKKwlfQmFzZShzdGQ6OmZvcndhcmQ8X0hlYWQ+KF9faW4uX01faGVhZCgpKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgICAgIF9UdXBsZV9pbXBsKGNvbnN0IF9UdXBsZV9pbXBsPF9JZHgsIF9VRWxlbWVudHMuLi4+JiBfX2luKQorCTogX0luaGVyaXRlZChfX2luLl9NX3RhaWwoKSksIF9CYXNlKF9faW4uX01faGVhZCgpKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VIZWFkLCB0eXBlbmFtZS4uLiBfVVRhaWxzPgorICAgICAgICBfVHVwbGVfaW1wbChfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RkOjptb3ZlKF9faW4uX01fdGFpbCgpKSksCisJICBfQmFzZShzdGQ6OmZvcndhcmQ8X1VIZWFkPihfX2luLl9NX2hlYWQoKSkpIHsgfQorCisgICAgICBfVHVwbGVfaW1wbCYKKyAgICAgIG9wZXJhdG9yPShjb25zdCBfVHVwbGVfaW1wbCYgX19pbikKKyAgICAgIHsKKwlfTV9oZWFkKCkgPSBfX2luLl9NX2hlYWQoKTsKKwlfTV90YWlsKCkgPSBfX2luLl9NX3RhaWwoKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIF9UdXBsZV9pbXBsJgorICAgICAgb3BlcmF0b3I9KF9UdXBsZV9pbXBsJiYgX19pbikKKyAgICAgIHsKKwlfTV9oZWFkKCkgPSBzdGQ6OmZvcndhcmQ8X0hlYWQ+KF9faW4uX01faGVhZCgpKTsKKwlfTV90YWlsKCkgPSBzdGQ6Om1vdmUoX19pbi5fTV90YWlsKCkpOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICAgICAgX1R1cGxlX2ltcGwmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBfVHVwbGVfaW1wbDxfSWR4LCBfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgICAgeworCSAgX01faGVhZCgpID0gX19pbi5fTV9oZWFkKCk7CisJICBfTV90YWlsKCkgPSBfX2luLl9NX3RhaWwoKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VSGVhZCwgdHlwZW5hbWUuLi4gX1VUYWlscz4KKyAgICAgICAgX1R1cGxlX2ltcGwmCisgICAgICAgIG9wZXJhdG9yPShfVHVwbGVfaW1wbDxfSWR4LCBfVUhlYWQsIF9VVGFpbHMuLi4+JiYgX19pbikKKyAgICAgICAgeworCSAgX01faGVhZCgpID0gc3RkOjpmb3J3YXJkPF9VSGVhZD4oX19pbi5fTV9oZWFkKCkpOworCSAgX01fdGFpbCgpID0gc3RkOjptb3ZlKF9faW4uX01fdGFpbCgpKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICB2b2lkCisgICAgICBfTV9zd2FwX2ltcGwoX1R1cGxlX2ltcGwmIF9faW4pCisgICAgICB7CisJX0Jhc2U6Ol9NX3N3YXBfaW1wbChfX2luLl9NX2hlYWQoKSk7CisJX0luaGVyaXRlZDo6X01fc3dhcF9pbXBsKF9faW4uX01fdGFpbCgpKTsKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyB0dXBsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+IAorICAgIGNsYXNzIHR1cGxlIDogcHVibGljIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPDAsIF9FbGVtZW50cy4uLj4gX0luaGVyaXRlZDsKKworICAgIHB1YmxpYzoKKyAgICAgIGNvbnN0ZXhwciB0dXBsZSgpCisgICAgICA6IF9Jbmhlcml0ZWQoKSB7IH0KKworICAgICAgZXhwbGljaXQKKyAgICAgIGNvbnN0ZXhwciB0dXBsZShjb25zdCBfRWxlbWVudHMmLi4uIF9fZWxlbWVudHMpCisgICAgICA6IF9Jbmhlcml0ZWQoX19lbGVtZW50cy4uLikgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHR5cGVuYW1lID0gdHlwZW5hbWUKKwkgICAgICAgc3RkOjplbmFibGVfaWY8c2l6ZW9mLi4uKF9VRWxlbWVudHMpCisJCQkgICAgICA9PSBzaXplb2YuLi4oX0VsZW1lbnRzKT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHR1cGxlKF9VRWxlbWVudHMmJi4uLiBfX2VsZW1lbnRzKQorCTogX0luaGVyaXRlZChzdGQ6OmZvcndhcmQ8X1VFbGVtZW50cz4oX19lbGVtZW50cykuLi4pIHsJfQorCisgICAgICBjb25zdGV4cHIgdHVwbGUoY29uc3QgdHVwbGUmKSA9IGRlZmF1bHQ7CisKKyAgICAgIHR1cGxlKHR1cGxlJiYgX19pbikKKyAgICAgIDogX0luaGVyaXRlZChzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSAgICAgID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKyAgICAgICAgdHVwbGUoY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9faW4pCisgICAgICAgIDogX0luaGVyaXRlZChzdGF0aWNfY2FzdDxjb25zdCBfVHVwbGVfaW1wbDwwLCBfVUVsZW1lbnRzLi4uPiY+KF9faW4pKQorICAgICAgICB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSAgICAgID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKyAgICAgICAgdHVwbGUodHVwbGU8X1VFbGVtZW50cy4uLj4mJiBfX2luKQorICAgICAgICA6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8X1R1cGxlX2ltcGw8MCwgX1VFbGVtZW50cy4uLj4mJj4oX19pbikpIHsgfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KHR1cGxlJiYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gc3RkOjptb3ZlKF9faW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1VFbGVtZW50cywgdHlwZW5hbWUgPSB0eXBlbmFtZQorCSAgICAgICBzdGQ6OmVuYWJsZV9pZjxzaXplb2YuLi4oX1VFbGVtZW50cykKKwkJCSAgICAgID09IHNpemVvZi4uLihfRWxlbWVudHMpPjo6dHlwZT4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHNpemVvZi4uLihfVUVsZW1lbnRzKQorCQkJICAgICAgPT0gc2l6ZW9mLi4uKF9FbGVtZW50cyk+Ojp0eXBlPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KHR1cGxlPF9VRWxlbWVudHMuLi4+JiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IHN0ZDo6bW92ZShfX2luKTsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHZvaWQKKyAgICAgIHN3YXAodHVwbGUmIF9faW4pCisgICAgICB7IF9Jbmhlcml0ZWQ6Ol9NX3N3YXBfaW1wbChfX2luKTsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PiAgCisgICAgY2xhc3MgdHVwbGU8PgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICB2b2lkIHN3YXAodHVwbGUmKSB7IC8qIG5vLW9wICovIH0KKyAgICB9OworCisgIC8vLyB0dXBsZSAoMi1lbGVtZW50KSwgd2l0aCBjb25zdHJ1Y3Rpb24gYW5kIGFzc2lnbm1lbnQgZnJvbSBhIHBhaXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICAgIGNsYXNzIHR1cGxlPF9UMSwgX1QyPiA6IHB1YmxpYyBfVHVwbGVfaW1wbDwwLCBfVDEsIF9UMj4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UdXBsZV9pbXBsPDAsIF9UMSwgX1QyPiBfSW5oZXJpdGVkOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHR1cGxlKCkKKyAgICAgIDogX0luaGVyaXRlZCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IF9UMSYgX19hMSwgY29uc3QgX1QyJiBfX2EyKQorICAgICAgOiBfSW5oZXJpdGVkKF9fYTEsIF9fYTIpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgZXhwbGljaXQKKyAgICAgICAgdHVwbGUoX1UxJiYgX19hMSwgX1UyJiYgX19hMikKKwk6IF9Jbmhlcml0ZWQoc3RkOjpmb3J3YXJkPF9VMT4oX19hMSksIHN0ZDo6Zm9yd2FyZDxfVTI+KF9fYTIpKSB7IH0KKworICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IHR1cGxlJikgPSBkZWZhdWx0OworCisgICAgICB0dXBsZSh0dXBsZSYmIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCYmPihfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZShjb25zdCB0dXBsZTxfVTEsIF9VMj4mIF9faW4pCisJOiBfSW5oZXJpdGVkKHN0YXRpY19jYXN0PGNvbnN0IF9UdXBsZV9pbXBsPDAsIF9VMSwgX1UyPiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlKHR1cGxlPF9VMSwgX1UyPiYmIF9faW4pCisJOiBfSW5oZXJpdGVkKHN0YXRpY19jYXN0PF9UdXBsZV9pbXBsPDAsIF9VMSwgX1UyPiYmPihfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZShjb25zdCBwYWlyPF9VMSwgX1UyPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoX19pbi5maXJzdCwgX19pbi5zZWNvbmQpIHsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUocGFpcjxfVTEsIF9VMj4mJiBfX2luKQorCTogX0luaGVyaXRlZChzdGQ6OmZvcndhcmQ8X1UxPihfX2luLmZpcnN0KSwKKwkJICAgICBzdGQ6OmZvcndhcmQ8X1UyPihfX2luLnNlY29uZCkpIHsgfQorCisgICAgICB0dXBsZSYKKyAgICAgIG9wZXJhdG9yPShjb25zdCB0dXBsZSYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwlyZXR1cm4gKnRoaXM7CisgICAgICB9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KHR1cGxlJiYgX19pbikKKyAgICAgIHsKKwlzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gc3RkOjptb3ZlKF9faW4pOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSBfVTI+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGU8X1UxLCBfVTI+JiBfX2luKQorICAgICAgICB7CisJICBzdGF0aWNfY2FzdDxfSW5oZXJpdGVkJj4oKnRoaXMpID0gX19pbjsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KHR1cGxlPF9VMSwgX1UyPiYmIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19pbik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTEsIHR5cGVuYW1lIF9VMj4KKyAgICAgICAgdHVwbGUmCisgICAgICAgIG9wZXJhdG9yPShjb25zdCBwYWlyPF9VMSwgX1UyPiYgX19pbikKKyAgICAgICAgeworCSAgdGhpcy0+X01faGVhZCgpID0gX19pbi5maXJzdDsKKwkgIHRoaXMtPl9NX3RhaWwoKS5fTV9oZWFkKCkgPSBfX2luLnNlY29uZDsKKwkgIHJldHVybiAqdGhpczsKKwl9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMSwgdHlwZW5hbWUgX1UyPgorICAgICAgICB0dXBsZSYKKyAgICAgICAgb3BlcmF0b3I9KHBhaXI8X1UxLCBfVTI+JiYgX19pbikKKyAgICAgICAgeworCSAgdGhpcy0+X01faGVhZCgpID0gc3RkOjpmb3J3YXJkPF9VMT4oX19pbi5maXJzdCk7CisJICB0aGlzLT5fTV90YWlsKCkuX01faGVhZCgpID0gc3RkOjpmb3J3YXJkPF9VMj4oX19pbi5zZWNvbmQpOworCSAgcmV0dXJuICp0aGlzOworCX0KKworICAgICAgdm9pZAorICAgICAgc3dhcCh0dXBsZSYgX19pbikKKyAgICAgIHsgCisJdXNpbmcgc3RkOjpzd2FwOworCXN3YXAodGhpcy0+X01faGVhZCgpLCBfX2luLl9NX2hlYWQoKSk7CisJc3dhcCh0aGlzLT5fTV90YWlsKCkuX01faGVhZCgpLCBfX2luLl9NX3RhaWwoKS5fTV9oZWFkKCkpOwkKKyAgICAgIH0KKyAgICB9OworCisgIC8vLyB0dXBsZSAoMS1lbGVtZW50KS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxPgorICAgIGNsYXNzIHR1cGxlPF9UMT4gOiBwdWJsaWMgX1R1cGxlX2ltcGw8MCwgX1QxPgorICAgIHsKKyAgICAgIHR5cGVkZWYgX1R1cGxlX2ltcGw8MCwgX1QxPiBfSW5oZXJpdGVkOworCisgICAgcHVibGljOgorICAgICAgY29uc3RleHByIHR1cGxlKCkKKyAgICAgIDogX0luaGVyaXRlZCgpIHsgfQorCisgICAgICBleHBsaWNpdAorICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IF9UMSYgX19hMSkKKyAgICAgIDogX0luaGVyaXRlZChfX2ExKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxLCB0eXBlbmFtZSA9IHR5cGVuYW1lCisJICAgICAgIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8X1UxLCBfVDE+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGV4cGxpY2l0CisgICAgICAgIHR1cGxlKF9VMSYmIF9fYTEpCisJOiBfSW5oZXJpdGVkKHN0ZDo6Zm9yd2FyZDxfVTE+KF9fYTEpKSB7IH0KKworICAgICAgY29uc3RleHByIHR1cGxlKGNvbnN0IHR1cGxlJikgPSBkZWZhdWx0OworCisgICAgICB0dXBsZSh0dXBsZSYmIF9faW4pCisgICAgICA6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCYmPihfX2luKSkgeyB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9VMT4KKyAgICAgICAgdHVwbGUoY29uc3QgdHVwbGU8X1UxPiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8Y29uc3QgX1R1cGxlX2ltcGw8MCwgX1UxPiY+KF9faW4pKSB7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1UxPgorICAgICAgICB0dXBsZSh0dXBsZTxfVTE+JiYgX19pbikKKwk6IF9Jbmhlcml0ZWQoc3RhdGljX2Nhc3Q8X1R1cGxlX2ltcGw8MCwgX1UxPiYmPihfX2luKSkgeyB9CisKKyAgICAgIHR1cGxlJgorICAgICAgb3BlcmF0b3I9KGNvbnN0IHR1cGxlJiBfX2luKQorICAgICAgeworCXN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBfX2luOworCXJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgdHVwbGUmCisgICAgICBvcGVyYXRvcj0odHVwbGUmJiBfX2luKQorICAgICAgeworCXN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19pbik7CisJcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTE+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0oY29uc3QgdHVwbGU8X1UxPiYgX19pbikKKyAgICAgICAgeworCSAgc3RhdGljX2Nhc3Q8X0luaGVyaXRlZCY+KCp0aGlzKSA9IF9faW47CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVTE+CisgICAgICAgIHR1cGxlJgorICAgICAgICBvcGVyYXRvcj0odHVwbGU8X1UxPiYmIF9faW4pCisgICAgICAgIHsKKwkgIHN0YXRpY19jYXN0PF9Jbmhlcml0ZWQmPigqdGhpcykgPSBzdGQ6Om1vdmUoX19pbik7CisJICByZXR1cm4gKnRoaXM7CisJfQorCisgICAgICB2b2lkCisgICAgICBzd2FwKHR1cGxlJiBfX2luKQorICAgICAgeyBfSW5oZXJpdGVkOjpfTV9zd2FwX2ltcGwoX19pbik7IH0KKyAgICB9OworCisKKyAgLy8vIEdpdmVzIHRoZSB0eXBlIG9mIHRoZSBpdGggZWxlbWVudCBvZiBhIGdpdmVuIHR1cGxlIHR5cGUuCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50OworCisgIC8qKgorICAgKiBSZWN1cnNpdmUgY2FzZSBmb3IgdHVwbGVfZWxlbWVudDogc3RyaXAgb2ZmIHRoZSBmaXJzdCBlbGVtZW50IGluCisgICAqIHRoZSB0dXBsZSBhbmQgcmV0cmlldmUgdGhlIChpLTEpdGggZWxlbWVudCBvZiB0aGUgcmVtYWluaW5nIHR1cGxlLgorICAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8X19pLCB0dXBsZTxfSGVhZCwgX1RhaWwuLi4+ID4KKyAgICA6IHR1cGxlX2VsZW1lbnQ8X19pIC0gMSwgdHVwbGU8X1RhaWwuLi4+ID4geyB9OworCisgIC8qKgorICAgKiBCYXNpcyBjYXNlIGZvciB0dXBsZV9lbGVtZW50OiBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgb25lIHdlJ3JlIHNlZWtpbmcuCisgICAqLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgdHVwbGU8X0hlYWQsIF9UYWlsLi4uPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfSGVhZCB0eXBlOworICAgIH07CisKKyAgLy8vIEZpbmRzIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHVwbGUgdHlwZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCB0dXBsZV9zaXplOworCisgIC8vLyBjbGFzcyB0dXBsZV9zaXplCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgdHVwbGVfc2l6ZTx0dXBsZTxfRWxlbWVudHMuLi4+ID4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgdmFsdWUgPSBzaXplb2YuLi4oX0VsZW1lbnRzKTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBjb25zdCBzdGQ6OnNpemVfdCB0dXBsZV9zaXplPHR1cGxlPF9FbGVtZW50cy4uLj4gPjo6dmFsdWU7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZSBfSGVhZCwgdHlwZW5hbWUuLi4gX1RhaWw+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX3JlZjxfSGVhZD46OnR5cGUKKyAgICBfX2dldF9oZWxwZXIoX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+JiBfX3QpCisgICAgeyByZXR1cm4gX190Ll9NX2hlYWQoKTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgdHlwZW5hbWUgX0hlYWQsIHR5cGVuYW1lLi4uIF9UYWlsPgorICAgIGlubGluZSB0eXBlbmFtZSBfX2FkZF9jX3JlZjxfSGVhZD46OnR5cGUKKyAgICBfX2dldF9oZWxwZXIoY29uc3QgX1R1cGxlX2ltcGw8X19pLCBfSGVhZCwgX1RhaWwuLi4+JiBfX3QpCisgICAgeyByZXR1cm4gX190Ll9NX2hlYWQoKTsgfQorCisgIC8vIFJldHVybiBhIHJlZmVyZW5jZSAoY29uc3QgcmVmZXJlbmNlKSB0byB0aGUgaXRoIGVsZW1lbnQgb2YgYSB0dXBsZS4KKyAgLy8gQW55IGNvbnN0IG9yIG5vbi1jb25zdCByZWYgZWxlbWVudHMgYXJlIHJldHVybmVkIHdpdGggdGhlaXIgb3JpZ2luYWwgdHlwZS4KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCB0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR5cGVuYW1lIF9fYWRkX3JlZjwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0dXBsZV9lbGVtZW50PF9faSwgdHVwbGU8X0VsZW1lbnRzLi4uPiA+Ojp0eXBlCisgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICBnZXQodHVwbGU8X0VsZW1lbnRzLi4uPiYgX190KQorICAgIHsgcmV0dXJuIF9fZ2V0X2hlbHBlcjxfX2k+KF9fdCk7IH0KKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBpbmxpbmUgdHlwZW5hbWUgX19hZGRfY19yZWY8CisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxfX2ksIHR1cGxlPF9FbGVtZW50cy4uLj4gPjo6dHlwZQorICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgZ2V0KGNvbnN0IHR1cGxlPF9FbGVtZW50cy4uLj4mIF9fdCkKKyAgICB7IHJldHVybiBfX2dldF9oZWxwZXI8X19pPihfX3QpOyB9CisKKyAgLy8gVGhpcyBjbGFzcyBoZWxwcyBjb25zdHJ1Y3QgdGhlIHZhcmlvdXMgY29tcGFyaXNvbiBvcGVyYXRpb25zIG9uIHR1cGxlcworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2NoZWNrX2VxdWFsX3NpemUsIHN0ZDo6c2l6ZV90IF9faSwgc3RkOjpzaXplX3QgX19qLAorCSAgIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX19pLCBzdGQ6OnNpemVfdCBfX2osIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2osIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIF9fZXEoY29uc3QgX1RwJiBfX3QsIGNvbnN0IF9VcCYgX191KQorICAgICAgeworCXJldHVybiAoZ2V0PF9faT4oX190KSA9PSBnZXQ8X19pPihfX3UpICYmCisJCV9fdHVwbGVfY29tcGFyZTwwLCBfX2kgKyAxLCBfX2osIF9UcCwgX1VwPjo6X19lcShfX3QsIF9fdSkpOworICAgICAgfQorICAgICAKKyAgICAgIHN0YXRpYyBib29sIF9fbGVzcyhjb25zdCBfVHAmIF9fdCwgY29uc3QgX1VwJiBfX3UpCisgICAgICB7CisJcmV0dXJuICgoZ2V0PF9faT4oX190KSA8IGdldDxfX2k+KF9fdSkpCisJCXx8ICEoZ2V0PF9faT4oX191KSA8IGdldDxfX2k+KF9fdCkpICYmCisJCV9fdHVwbGVfY29tcGFyZTwwLCBfX2kgKyAxLCBfX2osIF9UcCwgX1VwPjo6X19sZXNzKF9fdCwgX191KSk7CisgICAgICB9CisgICAgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBfX3R1cGxlX2NvbXBhcmU8MCwgX19pLCBfX2ksIF9UcCwgX1VwPgorICAgIHsKKyAgICAgIHN0YXRpYyBib29sIF9fZXEoY29uc3QgX1RwJiwgY29uc3QgX1VwJikKKyAgICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgCisgICAgICBzdGF0aWMgYm9vbCBfX2xlc3MoY29uc3QgX1RwJiwgY29uc3QgX1VwJikKKyAgICAgIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTxfVEVsZW1lbnRzLi4uPiBfVHA7CisgICAgICB0eXBlZGVmIHR1cGxlPF9VRWxlbWVudHMuLi4+IF9VcDsKKyAgICAgIHJldHVybiAoX190dXBsZV9jb21wYXJlPHR1cGxlX3NpemU8X1RwPjo6dmFsdWUgLSB0dXBsZV9zaXplPF9VcD46OnZhbHVlLAorCSAgICAgIDAsIHR1cGxlX3NpemU8X1RwPjo6dmFsdWUsIF9UcCwgX1VwPjo6X19lcShfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGJvb2wKKyAgICBvcGVyYXRvcjwoY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwKKwkgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsKKyAgICAgIHR5cGVkZWYgdHVwbGU8X1RFbGVtZW50cy4uLj4gX1RwOworICAgICAgdHlwZWRlZiB0dXBsZTxfVUVsZW1lbnRzLi4uPiBfVXA7CisgICAgICByZXR1cm4gKF9fdHVwbGVfY29tcGFyZTx0dXBsZV9zaXplPF9UcD46OnZhbHVlIC0gdHVwbGVfc2l6ZTxfVXA+Ojp2YWx1ZSwKKwkgICAgICAwLCB0dXBsZV9zaXplPF9UcD46OnZhbHVlLCBfVHAsIF9VcD46Ol9fbGVzcyhfX3QsIF9fdSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3IhPShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX190ID09IF9fdSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I+KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSkKKyAgICB7IHJldHVybiBfX3UgPCBfX3Q7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCSAgICAgICBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsgcmV0dXJuICEoX191IDwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJICAgICAgIGNvbnN0IHR1cGxlPF9VRWxlbWVudHMuLi4+JiBfX3UpCisgICAgeyByZXR1cm4gIShfX3QgPCBfX3UpOyB9CisKKyAgLy8gTkI6IERSIDcwNS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX0VsZW1lbnRzPgorICAgIGlubGluZSB0dXBsZTx0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisgICAgbWFrZV90dXBsZShfRWxlbWVudHMmJi4uLiBfX2FyZ3MpCisgICAgeworICAgICAgdHlwZWRlZiB0dXBsZTx0eXBlbmFtZSBfX2RlY2F5X2FuZF9zdHJpcDxfRWxlbWVudHM+OjpfX3R5cGUuLi4+CisJX19yZXN1bHRfdHlwZTsKKyAgICAgIHJldHVybiBfX3Jlc3VsdF90eXBlKHN0ZDo6Zm9yd2FyZDxfRWxlbWVudHM+KF9fYXJncykuLi4pOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9FbGVtZW50cyYmLi4uPgorICAgIGZvcndhcmRfYXNfdHVwbGUoX0VsZW1lbnRzJiYuLi4gX19hcmdzKQorICAgIHsgcmV0dXJuIHR1cGxlPF9FbGVtZW50cyYmLi4uPihzdGQ6OmZvcndhcmQ8X0VsZW1lbnRzPihfX2FyZ3MpLi4uKTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90Li4uPiBzdHJ1Y3QgX19pbmRleF9ob2xkZXIgeyB9OyAgICAKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHR5cGVuYW1lIF9JZHhIb2xkZXIsIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgX19pbmRleF9ob2xkZXJfaW1wbDsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfX2ksIHN0ZDo6c2l6ZV90Li4uIF9JbmRleGVzLCB0eXBlbmFtZSBfSWR4SG9sZGVyLAorCSAgIHR5cGVuYW1lLi4uIF9FbGVtZW50cz4KKyAgICBzdHJ1Y3QgX19pbmRleF9ob2xkZXJfaW1wbDxfX2ksIF9faW5kZXhfaG9sZGVyPF9JbmRleGVzLi4uPiwKKwkJCSAgICAgICBfSWR4SG9sZGVyLCBfRWxlbWVudHMuLi4+IAorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19pbmRleF9ob2xkZXJfaW1wbDxfX2kgKyAxLAorCQkJCQkgICBfX2luZGV4X2hvbGRlcjxfSW5kZXhlcy4uLiwgX19pPiwKKwkJCQkJICAgX0VsZW1lbnRzLi4uPjo6dHlwZSB0eXBlOworICAgIH07CisgCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9faSwgc3RkOjpzaXplX3QuLi4gX0luZGV4ZXM+CisgICAgc3RydWN0IF9faW5kZXhfaG9sZGVyX2ltcGw8X19pLCBfX2luZGV4X2hvbGRlcjxfSW5kZXhlcy4uLj4gPgorICAgIHsgdHlwZWRlZiBfX2luZGV4X2hvbGRlcjxfSW5kZXhlcy4uLj4gdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgc3RydWN0IF9fbWFrZV9pbmRleF9ob2xkZXIgCisgICAgOiBfX2luZGV4X2hvbGRlcl9pbXBsPDAsIF9faW5kZXhfaG9sZGVyPD4sIF9FbGVtZW50cy4uLj4geyB9OworICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCBzdGQ6OnNpemVfdC4uLiBfVElkeCwKKwkgICB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCBzdGQ6OnNpemVfdC4uLiBfVUlkeD4gCisgICAgaW5saW5lIHR1cGxlPF9URWxlbWVudHMuLi4sIF9VRWxlbWVudHMuLi4+IAorICAgIF9fdHVwbGVfY2F0X2hlbHBlcihjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LAorCQkgICAgICAgY29uc3QgX19pbmRleF9ob2xkZXI8X1RJZHguLi4+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSwKKwkJICAgICAgIGNvbnN0IF9faW5kZXhfaG9sZGVyPF9VSWR4Li4uPiYpCisgICAgeyByZXR1cm4gdHVwbGU8X1RFbGVtZW50cy4uLiwgX1VFbGVtZW50cy4uLj4oZ2V0PF9USWR4PihfX3QpLi4uLAorCQkJCQkJIGdldDxfVUlkeD4oX191KS4uLik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCBzdGQ6OnNpemVfdC4uLiBfVElkeCwKKwkgICB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCBzdGQ6OnNpemVfdC4uLiBfVUlkeD4gCisgICAgaW5saW5lIHR1cGxlPF9URWxlbWVudHMuLi4sIF9VRWxlbWVudHMuLi4+IAorICAgIF9fdHVwbGVfY2F0X2hlbHBlcih0dXBsZTxfVEVsZW1lbnRzLi4uPiYmIF9fdCwKKwkJICAgICAgIGNvbnN0IF9faW5kZXhfaG9sZGVyPF9USWR4Li4uPiYsIAorCQkgICAgICAgY29uc3QgdHVwbGU8X1VFbGVtZW50cy4uLj4mIF9fdSwKKwkJICAgICAgIGNvbnN0IF9faW5kZXhfaG9sZGVyPF9VSWR4Li4uPiYpCisgICAgeyByZXR1cm4gdHVwbGU8X1RFbGVtZW50cy4uLiwgX1VFbGVtZW50cy4uLj4KKwkoc3RkOjpmb3J3YXJkPF9URWxlbWVudHM+KGdldDxfVElkeD4oX190KSkuLi4sIGdldDxfVUlkeD4oX191KS4uLik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCBzdGQ6OnNpemVfdC4uLiBfVElkeCwKKwkgICB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzLCBzdGQ6OnNpemVfdC4uLiBfVUlkeD4KKyAgICBpbmxpbmUgdHVwbGU8X1RFbGVtZW50cy4uLiwgX1VFbGVtZW50cy4uLj4gCisgICAgX190dXBsZV9jYXRfaGVscGVyKGNvbnN0IHR1cGxlPF9URWxlbWVudHMuLi4+JiBfX3QsCisJCSAgICAgICBjb25zdCBfX2luZGV4X2hvbGRlcjxfVElkeC4uLj4mLCAKKwkJICAgICAgIHR1cGxlPF9VRWxlbWVudHMuLi4+JiYgX191LAorCQkgICAgICAgY29uc3QgX19pbmRleF9ob2xkZXI8X1VJZHguLi4+JikKKyAgICB7IHJldHVybiB0dXBsZTxfVEVsZW1lbnRzLi4uLCBfVUVsZW1lbnRzLi4uPgorCShnZXQ8X1RJZHg+KF9fdCkuLi4sIHN0ZDo6Zm9yd2FyZDxfVUVsZW1lbnRzPihnZXQ8X1VJZHg+KF9fdSkpLi4uKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHN0ZDo6c2l6ZV90Li4uIF9USWR4LAorCSAgIHR5cGVuYW1lLi4uIF9VRWxlbWVudHMsIHN0ZDo6c2l6ZV90Li4uIF9VSWR4PiAKKyAgICBpbmxpbmUgdHVwbGU8X1RFbGVtZW50cy4uLiwgX1VFbGVtZW50cy4uLj4gCisgICAgX190dXBsZV9jYXRfaGVscGVyKHR1cGxlPF9URWxlbWVudHMuLi4+JiYgX190LAorCQkgICAgICAgY29uc3QgX19pbmRleF9ob2xkZXI8X1RJZHguLi4+JiwgCisJCSAgICAgICB0dXBsZTxfVUVsZW1lbnRzLi4uPiYmIF9fdSwKKwkJICAgICAgIGNvbnN0IF9faW5kZXhfaG9sZGVyPF9VSWR4Li4uPiYpCisgICAgeyByZXR1cm4gdHVwbGU8X1RFbGVtZW50cy4uLiwgX1VFbGVtZW50cy4uLj4KKwkoc3RkOjpmb3J3YXJkPF9URWxlbWVudHM+KGdldDxfVElkeD4oX190KSkuLi4sCisJIHN0ZDo6Zm9yd2FyZDxfVUVsZW1lbnRzPihnZXQ8X1VJZHg+KF9fdSkpLi4uKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9URWxlbWVudHMuLi4sIF9VRWxlbWVudHMuLi4+IAorICAgIHR1cGxlX2NhdChjb25zdCB0dXBsZTxfVEVsZW1lbnRzLi4uPiYgX190LCBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsKKyAgICAgIHJldHVybiBfX3R1cGxlX2NhdF9oZWxwZXIoX190LCB0eXBlbmFtZQorCQkJCV9fbWFrZV9pbmRleF9ob2xkZXI8X1RFbGVtZW50cy4uLj46OnR5cGUoKSwKKwkJCQlfX3UsIHR5cGVuYW1lCisJCQkJX19tYWtlX2luZGV4X2hvbGRlcjxfVUVsZW1lbnRzLi4uPjo6dHlwZSgpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gX1RFbGVtZW50cywgdHlwZW5hbWUuLi4gX1VFbGVtZW50cz4KKyAgICBpbmxpbmUgdHVwbGU8X1RFbGVtZW50cy4uLiwgX1VFbGVtZW50cy4uLj4gCisgICAgdHVwbGVfY2F0KHR1cGxlPF9URWxlbWVudHMuLi4+JiYgX190LCBjb25zdCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYgX191KQorICAgIHsKKyAgICAgIHJldHVybiBfX3R1cGxlX2NhdF9oZWxwZXIoc3RkOjptb3ZlKF9fdCksIHR5cGVuYW1lCisJCQkJIF9fbWFrZV9pbmRleF9ob2xkZXI8X1RFbGVtZW50cy4uLj46OnR5cGUoKSwKKwkJCQkgX191LCB0eXBlbmFtZQorCQkJCSBfX21ha2VfaW5kZXhfaG9sZGVyPF9VRWxlbWVudHMuLi4+Ojp0eXBlKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfVEVsZW1lbnRzLCB0eXBlbmFtZS4uLiBfVUVsZW1lbnRzPgorICAgIGlubGluZSB0dXBsZTxfVEVsZW1lbnRzLi4uLCBfVUVsZW1lbnRzLi4uPiAKKyAgICB0dXBsZV9jYXQoY29uc3QgdHVwbGU8X1RFbGVtZW50cy4uLj4mIF9fdCwgdHVwbGU8X1VFbGVtZW50cy4uLj4mJiBfX3UpCisgICAgeworICAgICAgcmV0dXJuIF9fdHVwbGVfY2F0X2hlbHBlcihfX3QsIHR5cGVuYW1lCisJCQkJX19tYWtlX2luZGV4X2hvbGRlcjxfVEVsZW1lbnRzLi4uPjo6dHlwZSgpLAorCQkJCXN0ZDo6bW92ZShfX3UpLCB0eXBlbmFtZQorCQkJCV9fbWFrZV9pbmRleF9ob2xkZXI8X1VFbGVtZW50cy4uLj46OnR5cGUoKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9URWxlbWVudHMsIHR5cGVuYW1lLi4uIF9VRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9URWxlbWVudHMuLi4sIF9VRWxlbWVudHMuLi4+CisgICAgdHVwbGVfY2F0KHR1cGxlPF9URWxlbWVudHMuLi4+JiYgX190LCB0dXBsZTxfVUVsZW1lbnRzLi4uPiYmIF9fdSkKKyAgICB7CisgICAgICByZXR1cm4gX190dXBsZV9jYXRfaGVscGVyKHN0ZDo6bW92ZShfX3QpLCB0eXBlbmFtZQorCQkJCV9fbWFrZV9pbmRleF9ob2xkZXI8X1RFbGVtZW50cy4uLj46OnR5cGUoKSwKKwkJCQlzdGQ6Om1vdmUoX191KSwgdHlwZW5hbWUKKwkJCQlfX21ha2VfaW5kZXhfaG9sZGVyPF9VRWxlbWVudHMuLi4+Ojp0eXBlKCkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHR1cGxlPF9FbGVtZW50cyYuLi4+CisgICAgdGllKF9FbGVtZW50cyYuLi4gX19hcmdzKQorICAgIHsgcmV0dXJuIHR1cGxlPF9FbGVtZW50cyYuLi4+KF9fYXJncy4uLik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBfRWxlbWVudHM+CisgICAgaW5saW5lIHZvaWQgCisgICAgc3dhcCh0dXBsZTxfRWxlbWVudHMuLi4+JiBfX3gsIHR1cGxlPF9FbGVtZW50cy4uLj4mIF9feSkKKyAgICB7IF9feC5zd2FwKF9feSk7IH0KKworICAvLyBBIGNsYXNzIChhbmQgaW5zdGFuY2UpIHdoaWNoIGNhbiBiZSB1c2VkIGluICd0aWUnIHdoZW4gYW4gZWxlbWVudAorICAvLyBvZiBhIHR1cGxlIGlzIG5vdCByZXF1aXJlZAorICBzdHJ1Y3QgX1N3YWxsb3dfYXNzaWduCisgIHsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgICBjb25zdCBfU3dhbGxvd19hc3NpZ24mCisgICAgICBvcGVyYXRvcj0oY29uc3QgX1RwJikgY29uc3QKKyAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgIH07CisKKyAgY29uc3QgX1N3YWxsb3dfYXNzaWduIGlnbm9yZXt9OworCisgIC8qKgorICAgKiBTdG9yZXMgYSB0dXBsZSBvZiBpbmRpY2VzLiBVc2VkIGJ5IGJpbmQoKSB0byBleHRyYWN0IHRoZSBlbGVtZW50cworICAgKiBpbiBhIHR1cGxlLiAKKyAgICovCisgIHRlbXBsYXRlPGludC4uLiBfSW5kZXhlcz4KKyAgICBzdHJ1Y3QgX0luZGV4X3R1cGxlCisgICAgeworICAgICAgdHlwZWRlZiBfSW5kZXhfdHVwbGU8X0luZGV4ZXMuLi4sIHNpemVvZi4uLihfSW5kZXhlcyk+IF9fbmV4dDsKKyAgICB9OworCisgIC8vLyBCdWlsZHMgYW4gX0luZGV4X3R1cGxlPDAsIDEsIDIsIC4uLiwgX051bS0xPi4KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX051bT4KKyAgICBzdHJ1Y3QgX0J1aWxkX2luZGV4X3R1cGxlCisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfQnVpbGRfaW5kZXhfdHVwbGU8X051bS0xPjo6X190eXBlOjpfX25leHQgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfQnVpbGRfaW5kZXhfdHVwbGU8MD4KKyAgICB7CisgICAgICB0eXBlZGVmIF9JbmRleF90dXBsZTw+IF9fdHlwZTsKKyAgICB9OworCisgIC8vIFNlZSBzdGxfcGFpci5oLi4uCisgIHRlbXBsYXRlPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUuLi4gX0FyZ3M+CisgICAgICBpbmxpbmUgX1RwCisgICAgICBwYWlyPF9UMSwgX1QyPjo6CisgICAgICBfX2NvbnModHVwbGU8X0FyZ3MuLi4+JiYgX190dXBsZSkKKyAgICAgIHsKKwl0eXBlZGVmIHR5cGVuYW1lIF9CdWlsZF9pbmRleF90dXBsZTxzaXplb2YuLi4oX0FyZ3MpPjo6X190eXBlCisJICBfSW5kZXhlczsKKwlyZXR1cm4gX19kb19jb25zPF9UcD4oc3RkOjptb3ZlKF9fdHVwbGUpLCBfSW5kZXhlcygpKTsKKyAgICAgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzLCBpbnQuLi4gX0luZGV4ZXM+CisgICAgICBpbmxpbmUgX1RwCisgICAgICBwYWlyPF9UMSwgX1QyPjo6CisgICAgICBfX2RvX2NvbnModHVwbGU8X0FyZ3MuLi4+JiYgX190dXBsZSwKKwkJY29uc3QgX0luZGV4X3R1cGxlPF9JbmRleGVzLi4uPiYpCisgICAgICB7IHJldHVybiBfVHAoc3RkOjpmb3J3YXJkPF9BcmdzPihnZXQ8X0luZGV4ZXM+KF9fdHVwbGUpKS4uLik7IH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX1RVUExFCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3R5cGVfdHJhaXRzIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90eXBlX3RyYWl0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzYxMTUyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90eXBlX3RyYWl0cwpAQCAtMCwwICsxLDEyNzEgQEAKKy8vIEMrKzB4IHR5cGVfdHJhaXRzIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS90eXBlX3RyYWl0cworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9UWVBFX1RSQUlUUworI2RlZmluZSBfR0xJQkNYWF9UWVBFX1RSQUlUUyAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDxiaXRzL2MrK2NvbmZpZy5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG1ldGFwcm9ncmFtbWluZworICAgKiBAeworICAgKi8KKyAgc3RydWN0IF9fc2ZpbmFlX3R5cGVzCisgIHsKKyAgICB0eXBlZGVmIGNoYXIgX19vbmU7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIF9fYXJyWzJdOyB9IF9fdHdvOworICB9OworCisjZGVmaW5lIF9ERUZJTkVfU1BFQ18wX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTw+CisKKyNkZWZpbmUgX0RFRklORV9TUEVDXzFfSEVMUEVSICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKworI2RlZmluZSBfREVGSU5FX1NQRUNfMl9IRUxQRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQ3A+CisKKyNkZWZpbmUgX0RFRklORV9TUEVDKF9PcmRlciwgX1RyYWl0LCBfVHlwZSwgX1ZhbHVlKSAgICBcCisgIF9ERUZJTkVfU1BFQ18jI19PcmRlciMjX0hFTFBFUiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBfVHJhaXQ8X1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfVmFsdWU+IHsgfTsKKworICAvLyBoZWxwZXIgY2xhc3Nlcy4KKworICAvLy8gaW50ZWdyYWxfY29uc3RhbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX192PgorICAgIHN0cnVjdCBpbnRlZ3JhbF9jb25zdGFudAorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgX1RwICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfX3Y7CisgICAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CisgICAgICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PF9UcCwgX192PiAgIHR5cGU7CisgICAgICBjb25zdGV4cHIgb3BlcmF0b3IgdmFsdWVfdHlwZSgpIHsgcmV0dXJuIHZhbHVlOyB9CisgICAgfTsKKyAgCisgIC8vLyB0eXBlZGVmIGZvciB0cnVlX3R5cGUKKyAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCB0cnVlPiAgICAgdHJ1ZV90eXBlOworCisgIC8vLyB0eXBlZGVmIGZvciBmYWxzZV90eXBlCisgIHR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+ICAgIGZhbHNlX3R5cGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCBfVHAgX192PgorICAgIGNvbnN0ZXhwciBfVHAgaW50ZWdyYWxfY29uc3RhbnQ8X1RwLCBfX3Y+Ojp2YWx1ZTsKKworICAvLy8gcmVtb3ZlX2N2CisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCByZW1vdmVfY3Y7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfdm9pZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfdm9pZF9oZWxwZXIsIHZvaWQsIHRydWUpCisKKyAgLy8gcHJpbWFyeSB0eXBlIGNhdGVnb3JpZXMuCisKKyAgLy8vIGlzX3ZvaWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc192b2lkCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfdm9pZF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfaW50ZWdyYWxfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgYm9vbCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHNpZ25lZCBjaGFyLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGNoYXIsIHRydWUpCisjaWZkZWYgX0dMSUJDWFhfVVNFX1dDSEFSX1QKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCB3Y2hhcl90LCB0cnVlKQorI2VuZGlmCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgY2hhcjE2X3QsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgY2hhcjMyX3QsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgdW5zaWduZWQgc2hvcnQsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgaW50LCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGludCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfaW50ZWdyYWxfaGVscGVyLCBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2ludGVncmFsX2hlbHBlciwgbG9uZyBsb25nLCB0cnVlKQorICBfREVGSU5FX1NQRUMoMCwgX19pc19pbnRlZ3JhbF9oZWxwZXIsIHVuc2lnbmVkIGxvbmcgbG9uZywgdHJ1ZSkKKworICAvLy8gaXNfaW50ZWdyYWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19pbnRlZ3JhbAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX2ludGVncmFsX2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyLCBmbG9hdCwgdHJ1ZSkKKyAgX0RFRklORV9TUEVDKDAsIF9faXNfZmxvYXRpbmdfcG9pbnRfaGVscGVyLCBkb3VibGUsIHRydWUpCisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX2Zsb2F0aW5nX3BvaW50X2hlbHBlciwgbG9uZyBkb3VibGUsIHRydWUpCisKKyAgLy8vIGlzX2Zsb2F0aW5nX3BvaW50CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZmxvYXRpbmdfcG9pbnQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19mbG9hdGluZ19wb2ludF9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2FycmF5CisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19hcnJheQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtfU2l6ZV0+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FycmF5PF9UcFtdPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfcG9pbnRlcl9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgX0RFRklORV9TUEVDKDEsIF9faXNfcG9pbnRlcl9oZWxwZXIsIF9UcCosIHRydWUpCisKKyAgLy8vIGlzX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfcG9pbnRlcl9oZWxwZXI8dHlwZW5hbWUKKwkJCQkgICAgICByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3JlZmVyZW5jZTsKKworICAvLy8gaXNfZnVuY3Rpb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcl9oZWxwZXIsIF9UcCBfQ3A6OiosCisJICAgICAgICFpc19mdW5jdGlvbjxfVHA+Ojp2YWx1ZSkKKworICAvLy8gaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX29iamVjdF9wb2ludGVyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyX2hlbHBlciwgX1RwIF9DcDo6KiwKKwkgICAgICAgaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUpCisKKyAgLy8vIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcl9oZWxwZXI8CisJCQkJICAgICAgdHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19lbnVtCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfZW51bQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfZW51bShfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfdW5pb24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc191bmlvbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfdW5pb24oX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2NsYXNzCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfY2xhc3MKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2NsYXNzKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19mdW5jdGlvbgorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfZnVuY3Rpb24KKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLik+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUuLi4gX0FyZ1R5cGVzPgorICAgIHN0cnVjdCBpc19mdW5jdGlvbjxfUmVzKF9BcmdUeXBlcy4uLi4uLikgY29uc3Qgdm9sYXRpbGU+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgX19pc19udWxscHRyX3RfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygwLCBfX2lzX251bGxwdHJfdF9oZWxwZXIsIHN0ZDo6bnVsbHB0cl90LCB0cnVlKQorCisgIC8vIF9faXNfbnVsbHB0cl90IChleHRlbnNpb24pLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbnVsbHB0cl90CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKF9faXNfbnVsbHB0cl90X2hlbHBlcjx0eXBlbmFtZQorCQkJCSAgICAgIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLyBjb21wb3NpdGUgdHlwZSB0cmFpdHMuCisgIAorICAvLy8gaXNfYXJpdGhtZXRpYworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2FyaXRobWV0aWMKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc19mbG9hdGluZ19wb2ludDxfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vLyBpc19mdW5kYW1lbnRhbAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2Z1bmRhbWVudGFsCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc192b2lkPF9UcD46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX29iamVjdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX29iamVjdAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICEoaXNfZnVuY3Rpb248X1RwPjo6dmFsdWUKKwkJCQkgICAgICAgfHwgaXNfcmVmZXJlbmNlPF9UcD46OnZhbHVlCisJCQkJICAgICAgIHx8IGlzX3ZvaWQ8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfbWVtYmVyX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19tZW1iZXJfcG9pbnRlcjsKKworICAvLy8gaXNfc2NhbGFyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfc2NhbGFyCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKGlzX2FyaXRobWV0aWM8X1RwPjo6dmFsdWUKKwkJCQkgICAgICB8fCBpc19lbnVtPF9UcD46OnZhbHVlCisJCQkJICAgICAgfHwgaXNfcG9pbnRlcjxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgIHx8IGlzX21lbWJlcl9wb2ludGVyPF9UcD46OnZhbHVlCisJCQkJICAgICAgfHwgX19pc19udWxscHRyX3Q8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLy8gaXNfY29tcG91bmQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb21wb3VuZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsICFpc19mdW5kYW1lbnRhbDxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBpc19tZW1iZXJfcG9pbnRlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfbWVtYmVyX3BvaW50ZXJfaGVscGVyCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisgIF9ERUZJTkVfU1BFQygyLCBfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlciwgX1RwIF9DcDo6KiwgdHJ1ZSkKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgIHN0cnVjdCBpc19tZW1iZXJfcG9pbnRlcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChfX2lzX21lbWJlcl9wb2ludGVyX2hlbHBlcjwKKwkJCQkgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8X1RwPjo6dHlwZT46OnZhbHVlKT4KKyAgICB7IH07CisKKyAgLy8gdHlwZSBwcm9wZXJ0aWVzLgorICAvLy8gaXNfY29uc3QKKyAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RydWN0IGlzX2NvbnN0CisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19jb25zdDxfVHAgY29uc3Q+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKyAgCisgIC8vLyBpc192b2xhdGlsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfdm9sYXRpbGUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3ZvbGF0aWxlPF9UcCB2b2xhdGlsZT4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vLyBpc19lbXB0eQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2VtcHR5CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19lbXB0eShfVHApPgorICAgIHsgfTsKKworICAvLy8gaXNfcG9seW1vcnBoaWMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19wb2x5bW9ycGhpYworICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfcG9seW1vcnBoaWMoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2Fic3RyYWN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfYWJzdHJhY3QKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2Fic3RyYWN0KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdmlydHVhbF9kZXN0cnVjdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvcihfVHApPgorICAgIHsgfTsKKworICAvLy8gYWxpZ25tZW50X29mCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWxpZ25tZW50X29mCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIF9fYWxpZ25vZl9fKF9UcCk+IHsgfTsKKyAgCisgIC8vLyByYW5rCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCByYW5rCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+IHsgfTsKKyAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCByYW5rPF9UcFtfU2l6ZV0+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDEgKyByYW5rPF9UcD46OnZhbHVlPiB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByYW5rPF9UcFtdPgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAxICsgcmFuazxfVHA+Ojp2YWx1ZT4geyB9OworCisgIC8vLyBleHRlbnQKKyAgdGVtcGxhdGU8dHlwZW5hbWUsIHVuc2lnbmVkIF9VaW50ID0gMD4KKyAgICBzdHJ1Y3QgZXh0ZW50CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+IHsgfTsKKyAgCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdW5zaWduZWQgX1VpbnQsIHN0ZDo6c2l6ZV90IF9TaXplPgorICAgIHN0cnVjdCBleHRlbnQ8X1RwW19TaXplXSwgX1VpbnQ+CisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsCisJCQkgICAgICAgX1VpbnQgPT0gMCA/IF9TaXplIDogZXh0ZW50PF9UcCwKKwkJCQkJCQkgICBfVWludCAtIDE+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB1bnNpZ25lZCBfVWludD4KKyAgICBzdHJ1Y3QgZXh0ZW50PF9UcFtdLCBfVWludD4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwKKwkJCSAgICAgICBfVWludCA9PSAwID8gMCA6IGV4dGVudDxfVHAsCisJCQkJCQkgICAgICAgX1VpbnQgLSAxPjo6dmFsdWU+CisgICAgeyB9OworCisgIC8vIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0eXBlcyBbNC42XS4KKworICAvLy8gaXNfc2FtZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3NhbWU8X1RwLCBfVHA+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLyBjb25zdC12b2xhdGlsZSBtb2RpZmljYXRpb25zIFs0LjcuMV0uCisKKyAgLy8vIHJlbW92ZV9jb25zdAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9jb25zdAorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY29uc3Q8X1RwIGNvbnN0PgorICAgIHsgdHlwZWRlZiBfVHAgICAgIHR5cGU7IH07CisgIAorICAvLy8gcmVtb3ZlX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3ZvbGF0aWxlCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV92b2xhdGlsZTxfVHAgdm9sYXRpbGU+CisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyByZW1vdmVfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfY3YKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICByZW1vdmVfY29uc3Q8dHlwZW5hbWUgcmVtb3ZlX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlICAgICB0eXBlOworICAgIH07CisgIAorICAvLy8gYWRkX2NvbnN0CisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX2NvbnN0CisgICAgeyB0eXBlZGVmIF9UcCBjb25zdCAgICAgdHlwZTsgfTsKKyAgIAorICAvLy8gYWRkX3ZvbGF0aWxlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX3ZvbGF0aWxlCisgICAgeyB0eXBlZGVmIF9UcCB2b2xhdGlsZSAgICAgdHlwZTsgfTsKKyAgCisgIC8vLyBhZGRfY3YKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfY3YKKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICBhZGRfY29uc3Q8dHlwZW5hbWUgYWRkX3ZvbGF0aWxlPF9UcD46OnR5cGU+Ojp0eXBlICAgICB0eXBlOworICAgIH07CisKKyAgLy8gYXJyYXkgbW9kaWZpY2F0aW9ucy4KKworICAvLy8gcmVtb3ZlX2V4dGVudAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJlbW92ZV9leHRlbnQ8X1RwW19TaXplXT4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX2V4dGVudDxfVHBbXT4KKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIC8vLyByZW1vdmVfYWxsX2V4dGVudHMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfYWxsX2V4dGVudHMKKyAgICB7IHR5cGVkZWYgX1RwICAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgc3RkOjpzaXplX3QgX1NpemU+CisgICAgc3RydWN0IHJlbW92ZV9hbGxfZXh0ZW50czxfVHBbX1NpemVdPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfYWxsX2V4dGVudHM8X1RwPjo6dHlwZSAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IHJlbW92ZV9hbGxfZXh0ZW50czxfVHBbXT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2FsbF9leHRlbnRzPF9UcD46OnR5cGUgICAgIHR5cGU7IH07CisKKyAgLy8gcG9pbnRlciBtb2RpZmljYXRpb25zLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWU+CisgICAgc3RydWN0IF9fcmVtb3ZlX3BvaW50ZXJfaGVscGVyCisgICAgeyB0eXBlZGVmIF9UcCAgICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lIF9VcD4KKyAgICBzdHJ1Y3QgX19yZW1vdmVfcG9pbnRlcl9oZWxwZXI8X1RwLCBfVXAqPgorICAgIHsgdHlwZWRlZiBfVXAgICAgIHR5cGU7IH07CisKKyAgLy8vIHJlbW92ZV9wb2ludGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXIKKyAgICA6IHB1YmxpYyBfX3JlbW92ZV9wb2ludGVyX2hlbHBlcjxfVHAsIHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgcmVtb3ZlX3JlZmVyZW5jZTsKKworICAvLy8gYWRkX3BvaW50ZXIKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBhZGRfcG9pbnRlcgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUqICAgICB0eXBlOyB9OworCisgIC8vIFByaW1hcnkgY2xhc3NpZmljYXRpb24gdHJhaXRzLgorCisgIC8vLyBpc19sdmFsdWVfcmVmZXJlbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0cnVjdCBpc19sdmFsdWVfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgZmFsc2VfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBpc19sdmFsdWVfcmVmZXJlbmNlPF9UcCY+CisgICAgOiBwdWJsaWMgdHJ1ZV90eXBlIHsgfTsKKworICAvLy8gaXNfcnZhbHVlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgaXNfcnZhbHVlX3JlZmVyZW5jZQorICAgIDogcHVibGljIGZhbHNlX3R5cGUgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHAmJj4KKyAgICA6IHB1YmxpYyB0cnVlX3R5cGUgeyB9OworCisgIC8vIFNlY29uZGFyeSBjbGFzc2lmaWNhdGlvbiB0cmFpdHMuCisKKyAgLy8vIGlzX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3JlZmVyZW5jZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19sdmFsdWVfcmVmZXJlbmNlPF9UcD46OnZhbHVlCisJCQkJICAgICAgfHwgaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSk+CisgICAgeyB9OworCisgIC8vIFJlZmVyZW5jZSB0cmFuc2Zvcm1hdGlvbnMuCisKKyAgLy8vIHJlbW92ZV9yZWZlcmVuY2UKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlCisgICAgeyB0eXBlZGVmIF9UcCAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPF9UcCY+CisgICAgeyB0eXBlZGVmIF9UcCAgIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCByZW1vdmVfcmVmZXJlbmNlPF9UcCYmPgorICAgIHsgdHlwZWRlZiBfVHAgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwKKwkgICBib29sID0gIWlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSAmJiAhaXNfdm9pZDxfVHA+Ojp2YWx1ZSwKKwkgICBib29sID0gaXNfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19hZGRfbHZhbHVlX3JlZmVyZW5jZV9oZWxwZXIKKyAgICB7IHR5cGVkZWYgX1RwICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaGVscGVyPF9UcCwgdHJ1ZSwgZmFsc2U+CisgICAgeyB0eXBlZGVmIF9UcCYgICB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19hZGRfbHZhbHVlX3JlZmVyZW5jZV9oZWxwZXI8X1RwLCBmYWxzZSwgdHJ1ZT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlJiAgIHR5cGU7IH07CisKKyAgLy8vIGFkZF9sdmFsdWVfcmVmZXJlbmNlCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgYWRkX2x2YWx1ZV9yZWZlcmVuY2UKKyAgICA6IHB1YmxpYyBfX2FkZF9sdmFsdWVfcmVmZXJlbmNlX2hlbHBlcjxfVHA+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwKKwkgICBib29sID0gIWlzX3JlZmVyZW5jZTxfVHA+Ojp2YWx1ZSAmJiAhaXNfdm9pZDxfVHA+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9oZWxwZXIKKyAgICB7IHR5cGVkZWYgX1RwICAgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fYWRkX3J2YWx1ZV9yZWZlcmVuY2VfaGVscGVyPF9UcCwgdHJ1ZT4KKyAgICB7IHR5cGVkZWYgX1RwJiYgICB0eXBlOyB9OworCisgIC8vLyBhZGRfcnZhbHVlX3JlZmVyZW5jZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGFkZF9ydmFsdWVfcmVmZXJlbmNlCisgICAgOiBwdWJsaWMgX19hZGRfcnZhbHVlX3JlZmVyZW5jZV9oZWxwZXI8X1RwPgorICAgIHsgfTsKKworICAvLyBTY2FsYXIgcHJvcGVydGllcyBhbmQgdHJhbnNmb3JtYXRpb25zLgorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwKKwkgICBib29sID0gaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUsCisJICAgYm9vbCA9IGlzX2Zsb2F0aW5nX3BvaW50PF9UcD46OnZhbHVlPgorICAgIHN0cnVjdCBfX2lzX3NpZ25lZF9oZWxwZXIKKyAgICA6IHB1YmxpYyBmYWxzZV90eXBlIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9faXNfc2lnbmVkX2hlbHBlcjxfVHAsIGZhbHNlLCB0cnVlPgorICAgIDogcHVibGljIHRydWVfdHlwZSB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2lzX3NpZ25lZF9oZWxwZXI8X1RwLCB0cnVlLCBmYWxzZT4KKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGF0aWNfY2FzdDxib29sPihfVHAoLTEpIDwgX1RwKDApKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3NpZ25lZAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3NpZ25lZAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfc2lnbmVkX2hlbHBlcjxfVHA+Ojp2YWx1ZT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3Vuc2lnbmVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfdW5zaWduZWQKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCAoaXNfYXJpdGhtZXRpYzxfVHA+Ojp2YWx1ZQorCQkJCSAgICAgICYmICFpc19zaWduZWQ8X1RwPjo6dmFsdWUpPgorICAgIHsgfTsKKworICAvLyBNZW1iZXIgaW50cm9zcGVjdGlvbi4KKworICAvLy8gaXNfdHJpdmlhbAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3RyaXZpYWwKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX3RyaXZpYWwoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX3N0YW5kYXJkX2xheW91dAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX3N0YW5kYXJkX2xheW91dAorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfc3RhbmRhcmRfbGF5b3V0KF9UcCk+CisgICAgeyB9OworCisgIC8vLyBpc19wb2QKKyAgLy8gQ291bGQgdXNlIGlzX3N0YW5kYXJkX2xheW91dCAmJiBpc190cml2aWFsIGluc3RlYWQgb2YgdGhlIGJ1aWx0aW4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaXNfcG9kCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19pc19wb2QoX1RwKT4KKyAgICB7IH07CisKKyAgLy8vIGlzX2xpdGVyYWxfdHlwZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGlzX2xpdGVyYWxfdHlwZQorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faXNfbGl0ZXJhbF90eXBlKF9UcCk+CisgICAgeyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICB0eXBlbmFtZSBhZGRfcnZhbHVlX3JlZmVyZW5jZTxfVHA+Ojp0eXBlIGRlY2x2YWwoKSBub2V4Y2VwdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIGNsYXNzIF9faXNfY29uc3RydWN0aWJsZV9oZWxwZXIKKyAgICA6IHB1YmxpYyBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lLi4uIF9BcmdzMT4KKyAgICAgICAgc3RhdGljIGRlY2x0eXBlKF9UcDEoZGVjbHZhbDxfQXJnczE+KCkuLi4pLCBfX29uZSgpKSBfX3Rlc3QoaW50KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lLi4uPgorICAgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfVHAsIF9BcmdzLi4uPigwKSkgPT0gMTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX0FyZz4KKyAgICBjbGFzcyBfX2lzX2NvbnN0cnVjdGlibGVfaGVscGVyPF9UcCwgX0FyZz4KKyAgICA6IHB1YmxpYyBfX3NmaW5hZV90eXBlcworICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9BcmcxPgorICAgICAgICBzdGF0aWMgZGVjbHR5cGUoc3RhdGljX2Nhc3Q8X1RwMT4oZGVjbHZhbDxfQXJnMT4oKSksIF9fb25lKCkpCisJX190ZXN0KGludCk7CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgICAgc3RhdGljIF9fdHdvIF9fdGVzdCguLi4pOworCisgICAgcHVibGljOgorICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IHNpemVvZihfX3Rlc3Q8X1RwLCBfQXJnPigwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBpc19jb25zdHJ1Y3RpYmxlCisgIC8vIFhYWCBGSVhNRQorICAvLyBUaGUgQysrMHggc3BlY2lmaWNhdGlvbnMgcmVxdWlyZSBmcm9udC1lbmQgc3VwcG9ydCwgc2VlIE4yMjU1LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBpc19jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkJCSAgICAgICBfX2lzX2NvbnN0cnVjdGlibGVfaGVscGVyPF9UcCwKKwkJCQkJCQkgX0FyZ3MuLi4+OjpfX3ZhbHVlPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxib29sLCB0eXBlbmFtZSBfVHAsIHR5cGVuYW1lLi4uIF9BcmdzPgorICAgIHN0cnVjdCBfX2lzX250X2NvbnN0cnVjdGlibGVfaGVscGVyCisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gZmFsc2U7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX19pc19udF9jb25zdHJ1Y3RpYmxlX2hlbHBlcjx0cnVlLCBfVHAsIF9BcmdzLi4uPgorICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgX192YWx1ZSA9IG5vZXhjZXB0KF9UcChkZWNsdmFsPF9BcmdzPigpLi4uKSk7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfQXJnPgorICAgIHN0cnVjdCBfX2lzX250X2NvbnN0cnVjdGlibGVfaGVscGVyPHRydWUsIF9UcCwgX0FyZz4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gbm9leGNlcHQoc3RhdGljX2Nhc3Q8X1RwPihkZWNsdmFsPF9Bcmc+KCkpKTsKKyAgICB9OworCisgIC8vLyBpc19ub3Rocm93X2NvbnN0cnVjdGlibGUKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlCisgICAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKwkgIF9faXNfbnRfY29uc3RydWN0aWJsZV9oZWxwZXI8aXNfY29uc3RydWN0aWJsZTxfVHAsIF9BcmdzLi4uPjo6dmFsdWUsCisJCQkJICAgICAgIF9UcCwgX0FyZ3MuLi4+OjpfX3ZhbHVlPgorICAgIHsgfTsKKworICAvLy8gaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3RyaXZpYWxfY29weShfVHApPgorICAgIHsgfTsKKworICAvLy8gaGFzX3RyaXZpYWxfY29weV9hc3NpZ24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfdHJpdmlhbF9jb3B5X2Fzc2lnbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3RyaXZpYWxfYXNzaWduKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcihfVHApPgorICAgIHsgfTsKKworICAvLy8gaGFzX25vdGhyb3dfZGVmYXVsdF9jb25zdHJ1Y3RvcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IGhhc19ub3Rocm93X2RlZmF1bHRfY29uc3RydWN0b3IKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKF9UcCk+CisgICAgeyB9OworCisgIC8vLyBoYXNfbm90aHJvd19jb3B5X2NvbnN0cnVjdG9yCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgaGFzX25vdGhyb3dfY29weV9jb25zdHJ1Y3RvcgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfY29weShfVHApPgorICAgIHsgfTsKKworICAvLy8gaGFzX25vdGhyb3dfY29weV9hc3NpZ24KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBoYXNfbm90aHJvd19jb3B5X2Fzc2lnbgorICAgIDogcHVibGljIGludGVncmFsX2NvbnN0YW50PGJvb2wsIF9faGFzX25vdGhyb3dfYXNzaWduKF9UcCk+CisgICAgeyB9OworCisgIC8vIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0eXBlcy4KKworICAvLy8gaXNfYmFzZV9vZgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQmFzZSwgdHlwZW5hbWUgX0Rlcml2ZWQ+CisgICAgc3RydWN0IGlzX2Jhc2Vfb2YKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLCBfX2lzX2Jhc2Vfb2YoX0Jhc2UsIF9EZXJpdmVkKT4KKyAgICB7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9UbywKKwkgICBib29sID0gKGlzX3ZvaWQ8X0Zyb20+Ojp2YWx1ZSB8fCBpc19mdW5jdGlvbjxfVG8+Ojp2YWx1ZQorCQkgICB8fCBpc19hcnJheTxfVG8+Ojp2YWx1ZSk+CisgICAgc3RydWN0IF9faXNfY29udmVydGlibGVfaGVscGVyCisgICAgeyBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gaXNfdm9pZDxfVG8+Ojp2YWx1ZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIGNsYXNzIF9faXNfY29udmVydGlibGVfaGVscGVyPF9Gcm9tLCBfVG8sIGZhbHNlPgorICAgIDogcHVibGljIF9fc2ZpbmFlX3R5cGVzCisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RvMT4KKyAgICAgICAgc3RhdGljIHZvaWQgX190ZXN0X2F1eChfVG8xKTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20xLCB0eXBlbmFtZSBfVG8xPgorICAgICAgICBzdGF0aWMgZGVjbHR5cGUoX190ZXN0X2F1eDxfVG8xPihzdGQ6OmRlY2x2YWw8X0Zyb20xPigpKSwgX19vbmUoKSkKKwlfX3Rlc3QoaW50KTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPgorICAgICAgICBzdGF0aWMgX190d28gX190ZXN0KC4uLik7CisKKyAgICBwdWJsaWM6CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX3ZhbHVlID0gc2l6ZW9mKF9fdGVzdDxfRnJvbSwgX1RvPigwKSkgPT0gMTsKKyAgICB9OworCisgIC8vLyBpc19jb252ZXJ0aWJsZQorICAvLyBYWFggRklYTUUKKyAgLy8gVGhlIEMrKzB4IHNwZWNpZmljYXRpb25zIHJlcXVpcmUgZnJvbnQtZW5kIHN1cHBvcnQsIHNlZSBOMjI1NS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0Zyb20sIHR5cGVuYW1lIF9Ubz4KKyAgICBzdHJ1Y3QgaXNfY29udmVydGlibGUKKyAgICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorCQkJICAgICAgIF9faXNfY29udmVydGlibGVfaGVscGVyPF9Gcm9tLCBfVG8+OjpfX3ZhbHVlPgorICAgIHsgfTsKKworICAvLy8gaXNfZXhwbGljaXRseV9jb252ZXJ0aWJsZQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfRnJvbSwgdHlwZW5hbWUgX1RvPgorICAgIHN0cnVjdCBpc19leHBsaWNpdGx5X2NvbnZlcnRpYmxlCisgICAgOiBwdWJsaWMgaXNfY29uc3RydWN0aWJsZTxfVG8sIF9Gcm9tPgorICAgIHsgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfTGVuPgorICAgIHN0cnVjdCBfX2FsaWduZWRfc3RvcmFnZV9tc2EKKyAgICB7IAorICAgICAgdW5pb24gX190eXBlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBfX2RhdGFbX0xlbl07CisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKSkgeyB9IF9fYWxpZ247IAorICAgICAgfTsKKyAgICB9OworCisgIC8qKgorICAgKiAgQGJyaWVmIEFsaWdubWVudCB0eXBlLgorICAgKgorICAgKiAgVGhlIHZhbHVlIG9mIF9BbGlnbiBpcyBhIGRlZmF1bHQtYWxpZ25tZW50IHdoaWNoIHNoYWxsIGJlIHRoZQorICAgKiAgbW9zdCBzdHJpbmdlbnQgYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBhbnkgQysrIG9iamVjdCB0eXBlCisgICAqICB3aG9zZSBzaXplIGlzIG5vIGdyZWF0ZXIgdGhhbiBfTGVuICgzLjkpLiBUaGUgbWVtYmVyIHR5cGVkZWYKKyAgICogIHR5cGUgc2hhbGwgYmUgYSBQT0QgdHlwZSBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaW5pdGlhbGl6ZWQKKyAgICogIHN0b3JhZ2UgZm9yIGFueSBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyBhdCBtb3N0IF9MZW4gYW5kIHdob3NlCisgICAqICBhbGlnbm1lbnQgaXMgYSBkaXZpc29yIG9mIF9BbGlnbi4KKyAgKi8KKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0xlbiwgc3RkOjpzaXplX3QgX0FsaWduID0KKwkgICBfX2FsaWdub2ZfXyh0eXBlbmFtZSBfX2FsaWduZWRfc3RvcmFnZV9tc2E8X0xlbj46Ol9fdHlwZSk+CisgICAgc3RydWN0IGFsaWduZWRfc3RvcmFnZQorICAgIHsgCisgICAgICB1bmlvbiB0eXBlCisgICAgICB7CisJdW5zaWduZWQgY2hhciBfX2RhdGFbX0xlbl07CisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKChfQWxpZ24pKSkpIHsgfSBfX2FsaWduOyAKKyAgICAgIH07CisgICAgfTsKKworCisgIC8vIERlZmluZSBhIG5lc3RlZCB0eXBlIGlmIHNvbWUgcHJlZGljYXRlIGhvbGRzLgorICAvLyBQcmltYXJ5IHRlbXBsYXRlLgorICAvLy8gZW5hYmxlX2lmCisgIHRlbXBsYXRlPGJvb2wsIHR5cGVuYW1lIF9UcCA9IHZvaWQ+CisgICAgc3RydWN0IGVuYWJsZV9pZiAKKyAgICB7IH07CisKKyAgLy8gUGFydGlhbCBzcGVjaWFsaXphdGlvbiBmb3IgdHJ1ZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBlbmFibGVfaWY8dHJ1ZSwgX1RwPgorICAgIHsgdHlwZWRlZiBfVHAgdHlwZTsgfTsKKworCisgIC8vIEEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiwgYnV0IGZvciB0eXBlcy4gSWYgdHJ1ZSwgZmlyc3QsIGlmIGZhbHNlLCBzZWNvbmQuCisgIC8vIFByaW1hcnkgdGVtcGxhdGUuCisgIC8vLyBjb25kaXRpb25hbAorICB0ZW1wbGF0ZTxib29sIF9Db25kLCB0eXBlbmFtZSBfSWZ0cnVlLCB0eXBlbmFtZSBfSWZmYWxzZT4KKyAgICBzdHJ1Y3QgY29uZGl0aW9uYWwKKyAgICB7IHR5cGVkZWYgX0lmdHJ1ZSB0eXBlOyB9OworCisgIC8vIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9yIGZhbHNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfSWZ0cnVlLCB0eXBlbmFtZSBfSWZmYWxzZT4KKyAgICBzdHJ1Y3QgY29uZGl0aW9uYWw8ZmFsc2UsIF9JZnRydWUsIF9JZmZhbHNlPgorICAgIHsgdHlwZWRlZiBfSWZmYWxzZSB0eXBlOyB9OworCisKKyAgLy8gRGVjYXkgdHJhaXQgZm9yIGFycmF5cyBhbmQgZnVuY3Rpb25zLCB1c2VkIGZvciBwZXJmZWN0IGZvcndhcmRpbmcKKyAgLy8gaW4gbWFrZV9wYWlyLCBtYWtlX3R1cGxlLCBldGMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcCwgCisJICAgYm9vbCBfSXNBcnJheSA9IGlzX2FycmF5PF9VcD46OnZhbHVlLAorCSAgIGJvb2wgX0lzRnVuY3Rpb24gPSBpc19mdW5jdGlvbjxfVXA+Ojp2YWx1ZT4gCisgICAgc3RydWN0IF9fZGVjYXlfc2VsZWN0b3I7CisKKyAgLy8gTkI6IERSIDcwNS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAKKyAgICBzdHJ1Y3QgX19kZWNheV9zZWxlY3RvcjxfVXAsIGZhbHNlLCBmYWxzZT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2N2PF9VcD46OnR5cGUgX190eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9VcD4gCisgICAgc3RydWN0IF9fZGVjYXlfc2VsZWN0b3I8X1VwLCB0cnVlLCBmYWxzZT4KKyAgICB7IHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2V4dGVudDxfVXA+Ojp0eXBlKiBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAKKyAgICBzdHJ1Y3QgX19kZWNheV9zZWxlY3RvcjxfVXAsIGZhbHNlLCB0cnVlPgorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBhZGRfcG9pbnRlcjxfVXA+Ojp0eXBlIF9fdHlwZTsgfTsKKworICAvLy8gZGVjYXkKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPiAKKyAgICBjbGFzcyBkZWNheSAKKyAgICB7IAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9UcD46OnR5cGUgX19yZW1vdmVfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19kZWNheV9zZWxlY3RvcjxfX3JlbW92ZV90eXBlPjo6X190eXBlIHR5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgcmVmZXJlbmNlX3dyYXBwZXI7CisKKyAgLy8gSGVscGVyIHdoaWNoIGFkZHMgYSByZWZlcmVuY2UgdG8gYSB0eXBlIHdoZW4gZ2l2ZW4gYSByZWZlcmVuY2Vfd3JhcHBlcgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXIKKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCBfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fc3RyaXBfcmVmZXJlbmNlX3dyYXBwZXI8cmVmZXJlbmNlX3dyYXBwZXI8X1RwPiA+CisgICAgeworICAgICAgdHlwZWRlZiBfVHAmIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjxjb25zdCByZWZlcmVuY2Vfd3JhcHBlcjxfVHA+ID4KKyAgICB7CisgICAgICB0eXBlZGVmIF9UcCYgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2RlY2F5X2FuZF9zdHJpcAorICAgIHsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19zdHJpcF9yZWZlcmVuY2Vfd3JhcHBlcjwKKwl0eXBlbmFtZSBkZWNheTxfVHA+Ojp0eXBlPjo6X190eXBlIF9fdHlwZTsKKyAgICB9OworCisKKyAgLy8gVXRpbGl0eSBmb3IgY29uc3RydWN0aW5nIGlkZW50aWNhbGx5IGN2LXF1YWxpZmllZCB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VucXVhbGlmaWVkLCBib29sIF9Jc0NvbnN0LCBib29sIF9Jc1ZvbD4KKyAgICBzdHJ1Y3QgX19jdl9zZWxlY3RvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVW5xdWFsaWZpZWQ+CisgICAgc3RydWN0IF9fY3Zfc2VsZWN0b3I8X1VucXVhbGlmaWVkLCBmYWxzZSwgZmFsc2U+CisgICAgeyB0eXBlZGVmIF9VbnF1YWxpZmllZCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VucXVhbGlmaWVkPgorICAgIHN0cnVjdCBfX2N2X3NlbGVjdG9yPF9VbnF1YWxpZmllZCwgZmFsc2UsIHRydWU+CisgICAgeyB0eXBlZGVmIHZvbGF0aWxlIF9VbnF1YWxpZmllZCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VucXVhbGlmaWVkPgorICAgIHN0cnVjdCBfX2N2X3NlbGVjdG9yPF9VbnF1YWxpZmllZCwgdHJ1ZSwgZmFsc2U+CisgICAgeyB0eXBlZGVmIGNvbnN0IF9VbnF1YWxpZmllZCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1VucXVhbGlmaWVkPgorICAgIHN0cnVjdCBfX2N2X3NlbGVjdG9yPF9VbnF1YWxpZmllZCwgdHJ1ZSwgdHJ1ZT4KKyAgICB7IHR5cGVkZWYgY29uc3Qgdm9sYXRpbGUgX1VucXVhbGlmaWVkIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfUXVhbGlmaWVkLCB0eXBlbmFtZSBfVW5xdWFsaWZpZWQsCisJICAgYm9vbCBfSXNDb25zdCA9IGlzX2NvbnN0PF9RdWFsaWZpZWQ+Ojp2YWx1ZSwKKwkgICBib29sIF9Jc1ZvbCA9IGlzX3ZvbGF0aWxlPF9RdWFsaWZpZWQ+Ojp2YWx1ZT4KKyAgICBjbGFzcyBfX21hdGNoX2N2X3F1YWxpZmllcnMKKyAgICB7CisgICAgICB0eXBlZGVmIF9fY3Zfc2VsZWN0b3I8X1VucXVhbGlmaWVkLCBfSXNDb25zdCwgX0lzVm9sPiBfX21hdGNoOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX21hdGNoOjpfX3R5cGUgX190eXBlOyAKKyAgICB9OworCisKKyAgLy8gVXRpbGl0eSBmb3IgZmluZGluZyB0aGUgdW5zaWduZWQgdmVyc2lvbnMgb2Ygc2lnbmVkIGludGVncmFsIHR5cGVzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZAorICAgIHsgdHlwZWRlZiBfVHAgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPGNoYXI+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPHNpZ25lZCBjaGFyPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxzaG9ydD4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3Vuc2lnbmVkPGludD4KKyAgICB7IHR5cGVkZWYgdW5zaWduZWQgaW50IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxsb25nPgorICAgIHsgdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV91bnNpZ25lZDxsb25nIGxvbmc+CisgICAgeyB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3R5cGU7IH07CisKKworICAvLyBTZWxlY3QgYmV0d2VlbiBpbnRlZ3JhbCBhbmQgZW51bTogbm90IHBvc3NpYmxlIHRvIGJlIGJvdGguCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgCisJICAgYm9vbCBfSXNJbnQgPSBpc19pbnRlZ3JhbDxfVHA+Ojp2YWx1ZSwKKwkgICBib29sIF9Jc0VudW0gPSBpc19lbnVtPF9UcD46OnZhbHVlPgorICAgIGNsYXNzIF9fbWFrZV91bnNpZ25lZF9zZWxlY3RvcjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgY2xhc3MgX19tYWtlX3Vuc2lnbmVkX3NlbGVjdG9yPF9UcCwgdHJ1ZSwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfX21ha2VfdW5zaWduZWQ8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+IF9fdW5zaWduZWR0OworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX3Vuc2lnbmVkdDo6X190eXBlIF9fdW5zaWduZWRfdHlwZTsKKyAgICAgIHR5cGVkZWYgX19tYXRjaF9jdl9xdWFsaWZpZXJzPF9UcCwgX191bnNpZ25lZF90eXBlPiBfX2N2X3Vuc2lnbmVkOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2N2X3Vuc2lnbmVkOjpfX3R5cGUgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGNsYXNzIF9fbWFrZV91bnNpZ25lZF9zZWxlY3RvcjxfVHAsIGZhbHNlLCB0cnVlPgorICAgIHsKKyAgICAgIC8vIFdpdGggLWZzaG9ydC1lbnVtcywgYW4gZW51bSBtYXkgYmUgYXMgc21hbGwgYXMgYSBjaGFyLgorICAgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fc21hbGxlc3Q7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2IwID0gc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKF9fc21hbGxlc3QpOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19iMSA9IHNpemVvZihfVHApIDw9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2IyID0gc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisgICAgICB0eXBlZGVmIGNvbmRpdGlvbmFsPF9fYjIsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZz4gX19jb25kMjsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25kMjo6dHlwZSBfX2NvbmQyX3R5cGU7CisgICAgICB0eXBlZGVmIGNvbmRpdGlvbmFsPF9fYjEsIHVuc2lnbmVkIHNob3J0LCBfX2NvbmQyX3R5cGU+IF9fY29uZDE7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29uZDE6OnR5cGUgX19jb25kMV90eXBlOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjb25kaXRpb25hbDxfX2IwLCBfX3NtYWxsZXN0LCBfX2NvbmQxX3R5cGU+Ojp0eXBlIF9fdHlwZTsKKyAgICB9OworCisgIC8vIEdpdmVuIGFuIGludGVncmFsL2VudW0gdHlwZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHVuc2lnbmVkCisgIC8vIGludGVnZXIgdHlwZS4KKyAgLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgLy8vIG1ha2VfdW5zaWduZWQKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBtYWtlX3Vuc2lnbmVkIAorICAgIHsgdHlwZWRlZiB0eXBlbmFtZSBfX21ha2VfdW5zaWduZWRfc2VsZWN0b3I8X1RwPjo6X190eXBlIHR5cGU7IH07CisKKyAgLy8gSW50ZWdyYWwsIGJ1dCBkb24ndCBkZWZpbmUuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbWFrZV91bnNpZ25lZDxib29sPjsKKworCisgIC8vIFV0aWxpdHkgZm9yIGZpbmRpbmcgdGhlIHNpZ25lZCB2ZXJzaW9ucyBvZiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkCisgICAgeyB0eXBlZGVmIF9UcCBfX3R5cGU7IH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX21ha2Vfc2lnbmVkPGNoYXI+CisgICAgeyB0eXBlZGVmIHNpZ25lZCBjaGFyIF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8dW5zaWduZWQgY2hhcj4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGNoYXIgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBzaG9ydD4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIHNob3J0IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8dW5zaWduZWQgaW50PgorICAgIHsgdHlwZWRlZiBzaWduZWQgaW50IF9fdHlwZTsgfTsKKworICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IF9fbWFrZV9zaWduZWQ8dW5zaWduZWQgbG9uZz4KKyAgICB7IHR5cGVkZWYgc2lnbmVkIGxvbmcgX190eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19tYWtlX3NpZ25lZDx1bnNpZ25lZCBsb25nIGxvbmc+CisgICAgeyB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgX190eXBlOyB9OworCisKKyAgLy8gU2VsZWN0IGJldHdlZW4gaW50ZWdyYWwgYW5kIGVudW06IG5vdCBwb3NzaWJsZSB0byBiZSBib3RoLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIAorCSAgIGJvb2wgX0lzSW50ID0gaXNfaW50ZWdyYWw8X1RwPjo6dmFsdWUsCisJICAgYm9vbCBfSXNFbnVtID0gaXNfZW51bTxfVHA+Ojp2YWx1ZT4KKyAgICBjbGFzcyBfX21ha2Vfc2lnbmVkX3NlbGVjdG9yOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX21ha2Vfc2lnbmVkX3NlbGVjdG9yPF9UcCwgdHJ1ZSwgZmFsc2U+CisgICAgeworICAgICAgdHlwZWRlZiBfX21ha2Vfc2lnbmVkPHR5cGVuYW1lIHJlbW92ZV9jdjxfVHA+Ojp0eXBlPiBfX3NpZ25lZHQ7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fc2lnbmVkdDo6X190eXBlIF9fc2lnbmVkX3R5cGU7CisgICAgICB0eXBlZGVmIF9fbWF0Y2hfY3ZfcXVhbGlmaWVyczxfVHAsIF9fc2lnbmVkX3R5cGU+IF9fY3Zfc2lnbmVkOworCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2N2X3NpZ25lZDo6X190eXBlIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBjbGFzcyBfX21ha2Vfc2lnbmVkX3NlbGVjdG9yPF9UcCwgZmFsc2UsIHRydWU+CisgICAgeworICAgICAgLy8gV2l0aCAtZnNob3J0LWVudW1zLCBhbiBlbnVtIG1heSBiZSBhcyBzbWFsbCBhcyBhIGNoYXIuCisgICAgICB0eXBlZGVmIHNpZ25lZCBjaGFyIF9fc21hbGxlc3Q7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCBfX2IwID0gc2l6ZW9mKF9UcCkgPD0gc2l6ZW9mKF9fc21hbGxlc3QpOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19iMSA9IHNpemVvZihfVHApIDw9IHNpemVvZihzaWduZWQgc2hvcnQpOworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19iMiA9IHNpemVvZihfVHApIDw9IHNpemVvZihzaWduZWQgaW50KTsKKyAgICAgIHR5cGVkZWYgY29uZGl0aW9uYWw8X19iMiwgc2lnbmVkIGludCwgc2lnbmVkIGxvbmc+IF9fY29uZDI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fY29uZDI6OnR5cGUgX19jb25kMl90eXBlOworICAgICAgdHlwZWRlZiBjb25kaXRpb25hbDxfX2IxLCBzaWduZWQgc2hvcnQsIF9fY29uZDJfdHlwZT4gX19jb25kMTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgX19jb25kMTo6dHlwZSBfX2NvbmQxX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNvbmRpdGlvbmFsPF9fYjAsIF9fc21hbGxlc3QsIF9fY29uZDFfdHlwZT46OnR5cGUgX190eXBlOworICAgIH07CisKKyAgLy8gR2l2ZW4gYW4gaW50ZWdyYWwvZW51bSB0eXBlLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmVkCisgIC8vIGludGVnZXIgdHlwZS4KKyAgLy8gUHJpbWFyeSB0ZW1wbGF0ZS4KKyAgLy8vIG1ha2Vfc2lnbmVkCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBzdHJ1Y3QgbWFrZV9zaWduZWQgCisgICAgeyB0eXBlZGVmIHR5cGVuYW1lIF9fbWFrZV9zaWduZWRfc2VsZWN0b3I8X1RwPjo6X190eXBlIHR5cGU7IH07CisKKyAgLy8gSW50ZWdyYWwsIGJ1dCBkb24ndCBkZWZpbmUuCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgbWFrZV9zaWduZWQ8Ym9vbD47CisKKyAgLy8vIGNvbW1vbl90eXBlCisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIF9UcD4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTxfVHA+CisgICAgeyB0eXBlZGVmIF9UcCB0eXBlOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorICAgIHN0cnVjdCBjb21tb25fdHlwZTxfVHAsIF9VcD4KKyAgICB7IHR5cGVkZWYgZGVjbHR5cGUodHJ1ZSA/IGRlY2x2YWw8X1RwPigpIDogZGVjbHZhbDxfVXA+KCkpIHR5cGU7IH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwLCB0eXBlbmFtZSBfVXAsIHR5cGVuYW1lLi4uIF9WcD4KKyAgICBzdHJ1Y3QgY29tbW9uX3R5cGU8X1RwLCBfVXAsIF9WcC4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lCisgICAgICAgIGNvbW1vbl90eXBlPHR5cGVuYW1lIGNvbW1vbl90eXBlPF9UcCwgX1VwPjo6dHlwZSwgX1ZwLi4uPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgLy8vIGRlY2x2YWwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIHN0cnVjdCBfX2RlY2x2YWxfcHJvdGVjdG9yCisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgX19zdG9wID0gZmFsc2U7CisgICAgICBzdGF0aWMgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8X1RwPjo6dHlwZSBfX2RlbGVnYXRlKCk7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHR5cGVuYW1lIGFkZF9ydmFsdWVfcmVmZXJlbmNlPF9UcD46OnR5cGUKKyAgICBkZWNsdmFsKCkgbm9leGNlcHQKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KF9fZGVjbHZhbF9wcm90ZWN0b3I8X1RwPjo6X19zdG9wLAorCQkgICAgImRlY2x2YWwoKSBtdXN0IG5vdCBiZSB1c2VkISIpOworICAgICAgcmV0dXJuIF9fZGVjbHZhbF9wcm90ZWN0b3I8X1RwPjo6X19kZWxlZ2F0ZSgpOworICAgIH0KKworICAvLy8gcmVzdWx0X29mCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9TaWduYXR1cmU+CisgICAgY2xhc3MgcmVzdWx0X29mOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9Bcmc+CisgICAgc3RydWN0IF9SZXN1bHRfb2ZfbWVtb2JqOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9SZXMsIHR5cGVuYW1lIF9DbGFzcywgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9tZW1vYmo8X1JlcyBfQ2xhc3M6OiosIF9Bcmc+CisgICAgeworICAgIHByaXZhdGU6CisgICAgICB0eXBlZGVmIF9SZXMgX0NsYXNzOjoqIF9GdW5jOworCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RhdGljIF9UcCBfU19nZXQoY29uc3QgX0NsYXNzJik7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisJc3RhdGljIGRlY2x0eXBlKCpzdGQ6OmRlY2x2YWw8X1RwPigpKSBfU19nZXQoLi4uKTsKKyAgICAgICAgCisgICAgcHVibGljOgorICAgICAgdHlwZWRlZgorICAgICAgICBkZWNsdHlwZShfU19nZXQ8X0FyZz4oc3RkOjpkZWNsdmFsPF9Bcmc+KCkpLipzdGQ6OmRlY2x2YWw8X0Z1bmM+KCkpCisgICAgICAgIF9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9NZW1QdHIsIHR5cGVuYW1lIF9BcmcsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9tZW1mdW47CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1JlcywgdHlwZW5hbWUgX0NsYXNzLCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZS4uLiBfQXJncz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9tZW1mdW48X1JlcyBfQ2xhc3M6OiosIF9BcmcsIF9BcmdzLi4uPgorICAgIHsKKyAgICBwcml2YXRlOgorICAgICAgdHlwZWRlZiBfUmVzIF9DbGFzczo6KiBfRnVuYzsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCXN0YXRpYyBfVHAgX1NfZ2V0KGNvbnN0IF9DbGFzcyYpOworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorCXN0YXRpYyBkZWNsdHlwZSgqc3RkOjpkZWNsdmFsPF9UcD4oKSkgX1NfZ2V0KC4uLik7CisgICAgICAgIAorICAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYKKyAgICAgICAgZGVjbHR5cGUoKF9TX2dldDxfQXJnPihzdGQ6OmRlY2x2YWw8X0FyZz4oKSkuKnN0ZDo6ZGVjbHZhbDxfRnVuYz4oKSkKKyAgICAgICAgICAgIChzdGQ6OmRlY2x2YWw8X0FyZ3M+KCkuLi4pICkKKyAgICAgICAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8Ym9vbCwgYm9vbCwgdHlwZW5hbWUgX0Z1bmN0b3IsIHR5cGVuYW1lLi4uIF9BcmdUeXBlcz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9SZXN1bHRfb2ZfaW1wbDxmYWxzZSwgZmFsc2UsIF9GdW5jdG9yLCBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZgorICAgICAgICBkZWNsdHlwZSggc3RkOjpkZWNsdmFsPF9GdW5jdG9yPigpKHN0ZDo6ZGVjbHZhbDxfQXJnVHlwZXM+KCkuLi4pICkKKyAgICAgICAgX190eXBlOworICAgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX01lbVB0ciwgdHlwZW5hbWUgX0FyZz4KKyAgICBzdHJ1Y3QgX1Jlc3VsdF9vZl9pbXBsPHRydWUsIGZhbHNlLCBfTWVtUHRyLCBfQXJnPgorICAgIDogX1Jlc3VsdF9vZl9tZW1vYmo8dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfTWVtUHRyPjo6dHlwZSwgX0FyZz4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXN1bHRfb2ZfbWVtb2JqPAorCXR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X01lbVB0cj46OnR5cGUsIF9Bcmc+OjpfX3R5cGUKKwlfX3R5cGU7CisgICAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfTWVtUHRyLCB0eXBlbmFtZSBfQXJnLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IF9SZXN1bHRfb2ZfaW1wbDxmYWxzZSwgdHJ1ZSwgX01lbVB0ciwgX0FyZywgX0FyZ1R5cGVzLi4uPgorICAgIDogX1Jlc3VsdF9vZl9tZW1mdW48dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfTWVtUHRyPjo6dHlwZSwgX0FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgIF9BcmdUeXBlcy4uLj4KKyAgICB7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9SZXN1bHRfb2ZfbWVtZnVuPAorCXR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X01lbVB0cj46OnR5cGUsIF9BcmcsIF9BcmdUeXBlcy4uLj46Ol9fdHlwZQorCV9fdHlwZTsKKyAgICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9GdW5jdG9yLCB0eXBlbmFtZS4uLiBfQXJnVHlwZXM+CisgICAgc3RydWN0IHJlc3VsdF9vZjxfRnVuY3RvcihfQXJnVHlwZXMuLi4pPgorICAgIDogX1Jlc3VsdF9vZl9pbXBsPGlzX21lbWJlcl9vYmplY3RfcG9pbnRlcjwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8X0Z1bmN0b3I+Ojp0eXBlID46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPAorCQkJdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRnVuY3Rvcj46OnR5cGUgPjo6dmFsdWUsCisJCSAgICAgIF9GdW5jdG9yLCBfQXJnVHlwZXMuLi4+CisgICAgeworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfUmVzdWx0X29mX2ltcGw8CisJaXNfbWVtYmVyX29iamVjdF9wb2ludGVyPAorCSAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRnVuY3Rvcj46OnR5cGUgPjo6dmFsdWUsCisgICAgICAgIGlzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyPAorCSAgdHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfRnVuY3Rvcj46OnR5cGUgPjo6dmFsdWUsCisgICAgICAgCV9GdW5jdG9yLCBfQXJnVHlwZXMuLi4+OjpfX3R5cGUKKwl0eXBlOworICAgIH07CisKKyAgLyoqCisgICAqICBVc2UgU0ZJTkFFIHRvIGRldGVybWluZSBpZiB0aGUgdHlwZSBfVHAgaGFzIGEgcHVibGljbHktYWNjZXNzaWJsZQorICAgKiAgbWVtYmVyIHR5cGUgX05UWVBFLgorICAgKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFTX05FU1RFRF9UWVBFKF9OVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhc3MgX19oYXNfIyNfTlRZUEUjI19oZWxwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IF9fc2ZpbmFlX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVXA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IF9XcmFwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBfX29uZSBfX3Rlc3QoX1dyYXBfdHlwZTx0eXBlbmFtZSBfVXA6Ol9OVFlQRT4qKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1VwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBfX3R3byBfX3Rlc3QoLi4uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZihfX3Rlc3Q8X1RwPigwKSkgPT0gMTsgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX19oYXNfIyNfTlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgX19oYXNfIyNfTlRZUEUjI19oZWxwZXIgICAgICAgICAgICBcCisJCQk8dHlwZW5hbWUgcmVtb3ZlX2N2PF9UcD46OnR5cGU+Ojp2YWx1ZT4gIFwKKyAgICB7IH07CisKKyN1bmRlZiBfREVGSU5FX1NQRUNfMF9IRUxQRVIKKyN1bmRlZiBfREVGSU5FX1NQRUNfMV9IRUxQRVIKKyN1bmRlZiBfREVGSU5FX1NQRUNfMl9IRUxQRVIKKyN1bmRlZiBfREVGSU5FX1NQRUMKKworICAvLyBAfSBncm91cCBtZXRhcHJvZ3JhbW1pbmcKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmICAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgIC8vIF9HTElCQ1hYX1RZUEVfVFJBSVRTCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3R5cGVpbmRleCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdHlwZWluZGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWVlYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3R5cGVpbmRleApAQCAtMCwwICsxLDEwOSBAQAorLy8gQysrMHggdHlwZWluZGV4IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS90eXBlaW5kZXgKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfVFlQRUlOREVYCisjZGVmaW5lIF9HTElCQ1hYX1RZUEVJTkRFWCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx0eXBlaW5mbz4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8qKgorICAgICBAYnJpZWYgVGhlIGNsYXNzIHR5cGVfaW5kZXggcHJvdmlkZXMgYSBzaW1wbGUgd3JhcHBlciBmb3IgdHlwZV9pbmZvCisgICAgIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUgaW4gYXNzb2NpYXRpdmUgY29udGFpbmVycyAoMjMuNikKKyAgICAgYW5kIGluIHVub3JkZXJlZCBhc3NvY2lhdGl2ZSBjb250YWluZXJzICgyMy43KS4KKyAgICovCisgIHN0cnVjdCB0eXBlX2luZGV4CisgIHsKKyAgICB0eXBlX2luZGV4KGNvbnN0IHR5cGVfaW5mbyYgX19yaHMpCisgICAgOiBfTV90YXJnZXQoJl9fcmhzKSB7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj09KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdAorICAgIHsgcmV0dXJuICpfTV90YXJnZXQgPT0gKl9fcmhzLl9NX3RhcmdldDsgfQorCisgICAgYm9vbAorICAgIG9wZXJhdG9yIT0oY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0CisgICAgeyByZXR1cm4gKl9NX3RhcmdldCAhPSAqX19yaHMuX01fdGFyZ2V0OyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3RhcmdldC0+YmVmb3JlKCpfX3Jocy5fTV90YXJnZXQpOyB9CisKKyAgICBib29sCisgICAgb3BlcmF0b3I8PShjb25zdCB0eXBlX2luZGV4JiBfX3JocykgY29uc3QKKyAgICB7IHJldHVybiAhX19yaHMuX01fdGFyZ2V0LT5iZWZvcmUoKl9NX3RhcmdldCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj4oY29uc3QgdHlwZV9pbmRleCYgX19yaHMpIGNvbnN0CisgICAgeyByZXR1cm4gX19yaHMuX01fdGFyZ2V0LT5iZWZvcmUoKl9NX3RhcmdldCk7IH0KKworICAgIGJvb2wKKyAgICBvcGVyYXRvcj49KGNvbnN0IHR5cGVfaW5kZXgmIF9fcmhzKSBjb25zdAorICAgIHsgcmV0dXJuICFfTV90YXJnZXQtPmJlZm9yZSgqX19yaHMuX01fdGFyZ2V0KTsgfQorCisgICAgc2l6ZV90CisgICAgaGFzaF9jb2RlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7IHJldHVybiBfTV90YXJnZXQtPmhhc2hfY29kZSgpOyB9CisKKyAgICBjb25zdCBjaGFyKgorICAgIG5hbWUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3RhcmdldC0+bmFtZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCB0eXBlX2luZm8qIF9NX3RhcmdldDsKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHN0cnVjdCBoYXNoOworCisgIC8vLyBzdGQ6Omhhc2ggc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVfaW5kZXguCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgaGFzaDx0eXBlX2luZGV4PgorICAgIHsKKyAgICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICByZXN1bHRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZV9pbmRleCAgYXJndW1lbnRfdHlwZTsKKworICAgICAgc2l6ZV90CisgICAgICBvcGVyYXRvcigpKGNvbnN0IHR5cGVfaW5kZXgmIF9fdGkpIGNvbnN0IG5vZXhjZXB0CisgICAgICB7IHJldHVybiBfX3RpLmhhc2hfY29kZSgpOyB9CisgICAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyNlbmRpZiAgLy8gX0dMSUJDWFhfVFlQRUlOREVYCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3R5cGVpbmZvIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90eXBlaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVmNDlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS90eXBlaW5mbwpAQCAtMCwwICsxLDIyNCBAQAorLy8gUlRUSSBzdXBwb3J0IGZvciAtKi0gQysrIC0qLQorLy8gQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorLy8gMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOSwgMjAxMCwgMjAxMQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorLy8KKy8vIEdDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisvLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisvLyAKKy8vIEdDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLyAKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSB0eXBlaW5mbworICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfVFlQRUlORk8KKyNkZWZpbmUgX1RZUEVJTkZPCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpZmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworI2luY2x1ZGUgPGJpdHMvaGFzaF9ieXRlcy5oPgorI2VuZGlmCisKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwdXNoKGRlZmF1bHQpCisKK2V4dGVybiAiQysrIiB7CisKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7CisgIGNsYXNzIF9fY2xhc3NfdHlwZV9pbmZvOworfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorCisvLyBEZXRlcm1pbmUgd2hldGhlciB0eXBlaW5mbyBuYW1lcyBmb3IgdGhlIHNhbWUgdHlwZSBhcmUgbWVyZ2VkIChpbiB3aGljaAorLy8gY2FzZSBjb21wYXJpc29uIGNhbiBqdXN0IGNvbXBhcmUgcG9pbnRlcnMpIG9yIG5vdCAoaW4gd2hpY2ggY2FzZSBzdHJpbmdzCisvLyBtdXN0IGJlIGNvbXBhcmVkKSwgYW5kIHdoZXRoZXIgY29tcGFyaXNvbiBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbmxpbmUgb3IKKy8vIG5vdC4gIFdlIHVzZWQgdG8gZG8gaW5saW5lIHBvaW50ZXIgY29tcGFyaXNvbiBieSBkZWZhdWx0IGlmIHdlYWsgc3ltYm9scworLy8gYXJlIGF2YWlsYWJsZSwgYnV0IGV2ZW4gd2l0aCB3ZWFrIHN5bWJvbHMgc29tZXRpbWVzIG5hbWVzIGFyZSBub3QgbWVyZ2VkCisvLyB3aGVuIG9iamVjdHMgYXJlIGxvYWRlZCB3aXRoIFJUTERfTE9DQUwsIHNvIG5vdyB3ZSBhbHdheXMgdXNlIHN0cmNtcCBieQorLy8gZGVmYXVsdC4gIEZvciBBQkkgY29tcGF0aWJpbGl0eSwgd2UgZG8gdGhlIHN0cmNtcCBpbmxpbmUgaWYgd2VhayBzeW1ib2xzCisvLyBhcmUgYXZhaWxhYmxlLCBhbmQgb3V0LW9mLWxpbmUgaWYgbm90LiAgT3V0LW9mLWxpbmUgcG9pbnRlciBjb21wYXJpc29uCisvLyBpcyB1c2VkIHdoZXJlIHRoZSBvYmplY3QgZmlsZXMgYXJlIHRvIGJlIHBvcnRhYmxlIHRvIG11bHRpcGxlIHN5c3RlbXMsCisvLyBzb21lIG9mIHdoaWNoIG1heSBub3QgYmUgYWJsZSB0byB1c2UgcG9pbnRlciBjb21wYXJpc29uLCBidXQgdGhlCisvLyBwYXJ0aWN1bGFyIHN5c3RlbSBmb3Igd2hpY2ggbGlic3RkYysrIGlzIGJlaW5nIGJ1aWx0IGNhbiB1c2UgcG9pbnRlcgorLy8gY29tcGFyaXNvbjsgaW4gcGFydGljdWxhciBmb3IgbW9zdCBBUk0gRUFCSSBzeXN0ZW1zLCB3aGVyZSB0aGUgQUJJCisvLyBzcGVjaWZpZXMgb3V0LW9mLWxpbmUgY29tcGFyaXNvbi4gIFRoZSBjb21waWxlcidzIHRhcmdldCBjb25maWd1cmF0aW9uCisvLyBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzIGJ5IGRlZmluaW5nIF9fR1hYX1RZUEVJTkZPX0VRVUFMSVRZX0lOTElORSB0bworLy8gMSBvciAwIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IGNvbXBhcmlzb24gaXMgaW5saW5lLCBhbmQKKy8vIF9fR1hYX01FUkdFRF9UWVBFSU5GT19OQU1FUyB0byAxIG9yIDAgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgcG9pbnRlcgorLy8gY29tcGFyaXNvbiBjYW4gYmUgdXNlZC4KKworI2lmbmRlZiBfX0dYWF9NRVJHRURfVFlQRUlORk9fTkFNRVMKKy8vIEJ5IGRlZmF1bHQsIHR5cGVpbmZvIG5hbWVzIGFyZSBub3QgbWVyZ2VkLgorI2RlZmluZSBfX0dYWF9NRVJHRURfVFlQRUlORk9fTkFNRVMgMAorI2VuZGlmCisKKy8vIEJ5IGRlZmF1bHQgZm9sbG93IHRoZSBvbGQgaW5saW5lIHJ1bGVzIHRvIGF2b2lkIEFCSSBjaGFuZ2VzLgorI2lmbmRlZiBfX0dYWF9UWVBFSU5GT19FUVVBTElUWV9JTkxJTkUKKyAgI2lmICFfX0dYWF9XRUFLX18KKyAgICAjZGVmaW5lIF9fR1hYX1RZUEVJTkZPX0VRVUFMSVRZX0lOTElORSAwCisgICNlbHNlCisgICAgI2RlZmluZSBfX0dYWF9UWVBFSU5GT19FUVVBTElUWV9JTkxJTkUgMQorICAjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIAoreworICAvKioKKyAgICogIEBicmllZiAgUGFydCBvZiBSVFRJLgorICAgKgorICAgKiAgVGhlIEBjIHR5cGVfaW5mbyBjbGFzcyBkZXNjcmliZXMgdHlwZSBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgYnkKKyAgICogIGFuIGltcGxlbWVudGF0aW9uLgorICAqLworICBjbGFzcyB0eXBlX2luZm8gCisgIHsKKyAgcHVibGljOgorICAgIC8qKiBEZXN0cnVjdG9yIGZpcnN0LiBCZWluZyB0aGUgZmlyc3Qgbm9uLWlubGluZSB2aXJ0dWFsIGZ1bmN0aW9uLCB0aGlzCisgICAgICogIGNvbnRyb2xzIGluIHdoaWNoIHRyYW5zbGF0aW9uIHVuaXQgdGhlIHZ0YWJsZSBpcyBlbWl0dGVkLiBUaGUKKyAgICAgKiAgY29tcGlsZXIgbWFrZXMgdXNlIG9mIHRoYXQgaW5mb3JtYXRpb24gdG8ga25vdyB3aGVyZSB0byBlbWl0CisgICAgICogIHRoZSBydW50aW1lLW1hbmRhdGVkIHR5cGVfaW5mbyBzdHJ1Y3R1cmVzIGluIHRoZSBuZXctYWJpLiAgKi8KKyAgICB2aXJ0dWFsIH50eXBlX2luZm8oKTsKKworICAgIC8qKiBSZXR1cm5zIGFuIEBlIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYnl0ZSBzdHJpbmc7IHRoaXMgaXMgbm90CisgICAgICogIHBvcnRhYmxlIGJldHdlZW4gY29tcGlsZXJzISAgKi8KKyAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QKKyAgICB7IHJldHVybiBfX25hbWVbMF0gPT0gJyonID8gX19uYW1lICsgMSA6IF9fbmFtZTsgfQorCisjaWYgIV9fR1hYX1RZUEVJTkZPX0VRVUFMSVRZX0lOTElORQorICAgIC8vIEluIG9sZCBhYmksIG9yIHdoZW4gd2VhayBzeW1ib2xzIGFyZSBub3Qgc3VwcG9ydGVkLCB0aGVyZSBjYW4KKyAgICAvLyBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYSB0eXBlX2luZm8gb2JqZWN0IGZvciBvbmUKKyAgICAvLyB0eXBlLiBVbmlxdWVuZXNzIG11c3QgdXNlIHRoZSBfbmFtZSB2YWx1ZSwgbm90IG9iamVjdCBhZGRyZXNzLgorICAgIGJvb2wgYmVmb3JlKGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0OworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdDsKKyNlbHNlCisgICNpZiAhX19HWFhfTUVSR0VEX1RZUEVJTkZPX05BTUVTCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBAYyAqdGhpcyBwcmVjZWRlcyBAYyBfX2FyZyBpbiB0aGUgaW1wbGVtZW50YXRpb24ncworICAgICAqICBjb2xsYXRpb24gb3JkZXIuICAqLworICAgIC8vIEV2ZW4gd2l0aCB0aGUgbmV3IGFiaSwgb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgZGxvcGVuCisgICAgLy8gd2UgY2FuIHJ1biBpbnRvIGNhc2VzIHdoZXJlIHR5cGVfaW5mbyBuYW1lcyBhcmVuJ3QgbWVyZ2VkLAorICAgIC8vIHNvIHdlIHN0aWxsIG5lZWQgdG8gZG8gc3RyaW5nIGNvbXBhcmlzb24uCisgICAgYm9vbCBiZWZvcmUoY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QKKyAgICB7IHJldHVybiAoX19uYW1lWzBdID09ICcqJyAmJiBfX2FyZy5fX25hbWVbMF0gPT0gJyonKQorCT8gX19uYW1lIDwgX19hcmcuX19uYW1lCisJOiBfX2J1aWx0aW5fc3RyY21wIChfX25hbWUsIF9fYXJnLl9fbmFtZSkgPCAwOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZV9pbmZvJiBfX2FyZykgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gKChfX25hbWUgPT0gX19hcmcuX19uYW1lKQorCSAgICAgIHx8IChfX25hbWVbMF0gIT0gJyonICYmCisJCSAgX19idWlsdGluX3N0cmNtcCAoX19uYW1lLCBfX2FyZy5fX25hbWUpID09IDApKTsKKyAgICB9CisgICNlbHNlCisgICAgLy8gT24gc29tZSB0YXJnZXRzIHdlIGNhbiByZWx5IG9uIHR5cGVfaW5mbydzIE5UQlMgYmVpbmcgdW5pcXVlLAorICAgIC8vIGFuZCB0aGVyZWZvcmUgYWRkcmVzcyBjb21wYXJpc29ucyBhcmUgc3VmZmljaWVudC4KKyAgICBib29sIGJlZm9yZShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdAorICAgIHsgcmV0dXJuIF9fbmFtZSA8IF9fYXJnLl9fbmFtZTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGVfaW5mbyYgX19hcmcpIGNvbnN0CisgICAgeyByZXR1cm4gX19uYW1lID09IF9fYXJnLl9fbmFtZTsgfQorICAjZW5kaWYKKyNlbmRpZgorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0eXBlX2luZm8mIF9fYXJnKSBjb25zdAorICAgIHsgcmV0dXJuICFvcGVyYXRvcj09KF9fYXJnKTsgfQorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICBzaXplX3QgaGFzaF9jb2RlKCkgY29uc3Qgbm9leGNlcHQKKyAgICB7CisjICBpZiAhX19HWFhfTUVSR0VEX1RZUEVJTkZPX05BTUVTCisgICAgICByZXR1cm4gX0hhc2hfYnl0ZXMobmFtZSgpLCBfX2J1aWx0aW5fc3RybGVuKG5hbWUoKSksCisJCQkgc3RhdGljX2Nhc3Q8c2l6ZV90PigweGM3MGY2OTA3VUwpKTsKKyMgIGVsc2UKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHNpemVfdD4oX19uYW1lKTsKKyMgIGVuZGlmCisgICAgfQorI2VuZGlmIC8vIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcG9pbnRlciB0eXBlIG9mIHNvbWUga2luZAorICAgIHZpcnR1YWwgYm9vbCBfX2lzX3BvaW50ZXJfcCgpIGNvbnN0OworCisgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHR5cGUKKyAgICB2aXJ0dWFsIGJvb2wgX19pc19mdW5jdGlvbl9wKCkgY29uc3Q7CisKKyAgICAvLyBUcnkgYW5kIGNhdGNoIGEgdGhyb3duIHR5cGUuIFN0b3JlIGFuIGFkanVzdGVkIHBvaW50ZXIgdG8gdGhlCisgICAgLy8gY2F1Z2h0IHR5cGUgaW4gVEhSX09CSi4gSWYgVEhSX1RZUEUgaXMgbm90IGEgcG9pbnRlciB0eXBlLCB0aGVuCisgICAgLy8gVEhSX09CSiBwb2ludHMgdG8gdGhlIHRocm93biBvYmplY3QuIElmIFRIUl9UWVBFIGlzIGEgcG9pbnRlcgorICAgIC8vIHR5cGUsIHRoZW4gVEhSX09CSiBpcyB0aGUgcG9pbnRlciBpdHNlbGYuIE9VVEVSIGluZGljYXRlcyB0aGUKKyAgICAvLyBudW1iZXIgb2Ygb3V0ZXIgcG9pbnRlcnMsIGFuZCB3aGV0aGVyIHRoZXkgd2VyZSBjb25zdAorICAgIC8vIHF1YWxpZmllZC4KKyAgICB2aXJ0dWFsIGJvb2wgX19kb19jYXRjaChjb25zdCB0eXBlX2luZm8gKl9fdGhyX3R5cGUsIHZvaWQgKipfX3Rocl9vYmosCisJCQkgICAgdW5zaWduZWQgX19vdXRlcikgY29uc3Q7CisKKyAgICAvLyBJbnRlcm5hbGx5IHVzZWQgZHVyaW5nIGNhdGNoIG1hdGNoaW5nCisgICAgdmlydHVhbCBib29sIF9fZG9fdXBjYXN0KGNvbnN0IF9fY3h4YWJpdjE6Ol9fY2xhc3NfdHlwZV9pbmZvICpfX3RhcmdldCwKKwkJCSAgICAgdm9pZCAqKl9fb2JqX3B0cikgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IGNoYXIgKl9fbmFtZTsKKyAgICAKKyAgICBleHBsaWNpdCB0eXBlX2luZm8oY29uc3QgY2hhciAqX19uKTogX19uYW1lKF9fbikgeyB9CisgICAgCisgIHByaXZhdGU6CisgICAgLy8vIEFzc2lnbmluZyB0eXBlX2luZm8gaXMgbm90IHN1cHBvcnRlZC4KKyAgICB0eXBlX2luZm8mIG9wZXJhdG9yPShjb25zdCB0eXBlX2luZm8mKTsKKyAgICB0eXBlX2luZm8oY29uc3QgdHlwZV9pbmZvJik7CisgIH07CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRocm93biBkdXJpbmcgaW5jb3JyZWN0IHR5cGVjYXN0aW5nLgorICAgKiAgQGluZ3JvdXAgZXhjZXB0aW9ucworICAgKgorICAgKiAgSWYgeW91IGF0dGVtcHQgYW4gaW52YWxpZCBAYyBkeW5hbWljX2Nhc3QgZXhwcmVzc2lvbiwgYW4gaW5zdGFuY2Ugb2YKKyAgICogIHRoaXMgY2xhc3MgKG9yIHNvbWV0aGluZyBkZXJpdmVkIGZyb20gdGhpcyBjbGFzcykgaXMgdGhyb3duLiAgKi8KKyAgY2xhc3MgYmFkX2Nhc3QgOiBwdWJsaWMgZXhjZXB0aW9uIAorICB7CisgIHB1YmxpYzoKKyAgICBiYWRfY2FzdCgpIHRocm93KCkgeyB9CisKKyAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy0zLjAuMi9nY2NfNi5odG1sI1NFQzExOAorICAgIHZpcnR1YWwgfmJhZF9jYXN0KCkgdGhyb3coKTsKKworICAgIC8vIFNlZSBjb21tZW50IGluIGVoX2V4Y2VwdGlvbi5jYy4KKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpOworICB9OworICAKKyAgLyoqIAorICAgKiAgQGJyaWVmIFRocm93biB3aGVuIGEgTlVMTCBwb2ludGVyIGluIGEgQGMgdHlwZWlkIGV4cHJlc3Npb24gaXMgdXNlZC4KKyAgICogIEBpbmdyb3VwIGV4Y2VwdGlvbnMKKyAgICovCisgIGNsYXNzIGJhZF90eXBlaWQgOiBwdWJsaWMgZXhjZXB0aW9uIAorICB7CisgIHB1YmxpYzoKKyAgICBiYWRfdHlwZWlkICgpIHRocm93KCkgeyB9CisKKyAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzIG5vdCB1c2VsZXNzOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy0zLjAuMi9nY2NfNi5odG1sI1NFQzExOAorICAgIHZpcnR1YWwgfmJhZF90eXBlaWQoKSB0aHJvdygpOworCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gZWhfZXhjZXB0aW9uLmNjLgorICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCk7CisgIH07Cit9IC8vIG5hbWVzcGFjZSBzdGQKKworI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBwb3AKKworfSAvLyBleHRlcm4gIkMrKyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS91bm9yZGVyZWRfbWFwIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS91bm9yZGVyZWRfbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2EyOTcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Vub3JkZXJlZF9tYXAKQEAgLTAsMCArMSw1OSBAQAorLy8gPHVub3JkZXJlZF9tYXA+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS91bm9yZGVyZWRfbWFwCisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1VOT1JERVJFRF9NQVAKKyNkZWZpbmUgX0dMSUJDWFhfVU5PUkRFUkVEX01BUCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+IC8vIGVxdWFsX3RvLCBfSWRlbnRpdHksIF9TZWxlY3Qxc3QKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorI2luY2x1ZGUgPGJpdHMvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8Yml0cy91bm9yZGVyZWRfbWFwLmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL3Vub3JkZXJlZF9tYXA+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS91bm9yZGVyZWRfbWFwPgorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworCisjZW5kaWYgLy8gX0dMSUJDWFhfVU5PUkRFUkVEX01BUApkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS91bm9yZGVyZWRfc2V0IGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS91bm9yZGVyZWRfc2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWUwYTQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3Vub3JkZXJlZF9zZXQKQEAgLTAsMCArMSw1OCBAQAorLy8gPHVub3JkZXJlZF9zZXQ+IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgaW5jbHVkZS91bm9yZGVyZWRfc2V0CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX1VOT1JERVJFRF9TRVQKKyNkZWZpbmUgX0dMSUJDWFhfVU5PUkRFUkVEX1NFVCAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2lmbmRlZiBfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXworIyBpbmNsdWRlIDxiaXRzL2MrKzB4X3dhcm5pbmcuaD4KKyNlbHNlCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2Z1bmN0aW9uLmg+IC8vIGVxdWFsX3RvLCBfSWRlbnRpdHksIF9TZWxlY3Qxc3QKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0aW9uYWxfaGFzaC5oPgorI2luY2x1ZGUgPGJpdHMvaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8Yml0cy91bm9yZGVyZWRfc2V0Lmg+CisjaW5jbHVkZSA8Yml0cy9yYW5nZV9hY2Nlc3MuaD4KKworI2lmZGVmIF9HTElCQ1hYX0RFQlVHCisjIGluY2x1ZGUgPGRlYnVnL3Vub3JkZXJlZF9zZXQ+CisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyMgaW5jbHVkZSA8cHJvZmlsZS91bm9yZGVyZWRfc2V0PgorI2VuZGlmCisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworI2VuZGlmIC8vIF9HTElCQ1hYX1VOT1JERVJFRF9TRVQKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdXRpbGl0eSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdXRpbGl0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVjNDFmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS91dGlsaXR5CkBAIC0wLDAgKzEsMTQ2IEBACisvLyA8dXRpbGl0eT4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwxOTk3CisgKiBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIFNpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8KKyAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisvKiogQGZpbGUgaW5jbHVkZS91dGlsaXR5CisgKiAgVGhpcyBpcyBhIFN0YW5kYXJkIEMrKyBMaWJyYXJ5IGhlYWRlci4gCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9VVElMSVRZCisjZGVmaW5lIF9HTElCQ1hYX1VUSUxJVFkgMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKy8qKgorICogQGRlZmdyb3VwIHV0aWxpdGllcyBVdGlsaXRpZXMKKyAqCisgKiBDb21wb25lbnRzIGRlZW1lZCBnZW5lcmFsbHkgdXNlZnVsLiBJbmNsdWRlcyBwYWlyLCB0dXBsZSwKKyAqIGZvcndhcmQvbW92ZSBoZWxwZXJzLCByYXRpbywgZnVuY3Rpb24gb2JqZWN0LCBtZXRhcHJvZ3JhbW1pbmcgYW5kCisgKiB0eXBlIHRyYWl0cywgdGltZSwgZGF0ZSwgYW5kIG1lbW9yeSBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcmVsb3BzLmg+CisjaW5jbHVkZSA8Yml0cy9zdGxfcGFpci5oPgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyNpbmNsdWRlIDxiaXRzL21vdmUuaD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGNsYXNzIHR1cGxlX3NpemU7CisKKyAgdGVtcGxhdGU8c3RkOjpzaXplX3QgX0ludCwgY2xhc3MgX1RwPgorICAgIGNsYXNzIHR1cGxlX2VsZW1lbnQ7CisKKyAgIC8vIFZhcmlvdXMgZnVuY3Rpb25zIHdoaWNoIGdpdmUgc3RkOjpwYWlyIGEgdHVwbGUtbGlrZSBpbnRlcmZhY2UuCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX3NpemU8c3RkOjpwYWlyPF9UcDEsIF9UcDI+ID4KKyAgICB7IHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCB2YWx1ZSA9IDI7IH07CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwMSwgY2xhc3MgX1RwMj4KKyAgICBjb25zdCBzdGQ6OnNpemVfdAorICAgIHR1cGxlX3NpemU8c3RkOjpwYWlyPF9UcDEsIF9UcDI+ID46OnZhbHVlOworCisgIHRlbXBsYXRlPGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgc3RydWN0IHR1cGxlX2VsZW1lbnQ8MCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID4KKyAgICB7IHR5cGVkZWYgX1RwMSB0eXBlOyB9OworIAorICB0ZW1wbGF0ZTxjbGFzcyBfVHAxLCBjbGFzcyBfVHAyPgorICAgIHN0cnVjdCB0dXBsZV9lbGVtZW50PDEsIHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiA+CisgICAgeyB0eXBlZGVmIF9UcDIgdHlwZTsgfTsKKworICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBfSW50PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0OworCisgIHRlbXBsYXRlPD4KKyAgICBzdHJ1Y3QgX19wYWlyX2dldDwwPgorICAgIHsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+CisgICAgICBzdGF0aWMgX1RwMSYgX19nZXQoc3RkOjpwYWlyPF9UcDEsIF9UcDI+JiBfX3BhaXIpCisgICAgICB7IHJldHVybiBfX3BhaXIuZmlyc3Q7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAxJiBfX2NvbnN0X2dldChjb25zdCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5maXJzdDsgfQorICAgIH07CisKKyAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBfX3BhaXJfZ2V0PDE+CisgICAgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBfVHAyJiBfX2dldChzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5zZWNvbmQ7IH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwMSwgdHlwZW5hbWUgX1RwMj4KKyAgICAgIHN0YXRpYyBjb25zdCBfVHAyJiBfX2NvbnN0X2dldChjb25zdCBzdGQ6OnBhaXI8X1RwMSwgX1RwMj4mIF9fcGFpcikKKyAgICAgIHsgcmV0dXJuIF9fcGFpci5zZWNvbmQ7IH0KKyAgICB9OworCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgaW5saW5lIHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0ludCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID46OnR5cGUmCisgICAgZ2V0KHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19pbikKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX2dldChfX2luKTsgfQorCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IF9JbnQsIGNsYXNzIF9UcDEsIGNsYXNzIF9UcDI+CisgICAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIHR1cGxlX2VsZW1lbnQ8X0ludCwgc3RkOjpwYWlyPF9UcDEsIF9UcDI+ID46OnR5cGUmCisgICAgZ2V0KGNvbnN0IHN0ZDo6cGFpcjxfVHAxLCBfVHAyPiYgX19pbikKKyAgICB7IHJldHVybiBfX3BhaXJfZ2V0PF9JbnQ+OjpfX2NvbnN0X2dldChfX2luKTsgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgorCisjZW5kaWYgLyogX0dMSUJDWFhfVVRJTElUWSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS92YWxhcnJheSBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdmFsYXJyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxOGUwNQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUvdmFsYXJyYXkKQEAgLTAsMCArMSwxMTY1IEBACisvLyBUaGUgdGVtcGxhdGUgYW5kIGlubGluZXMgZm9yIHRoZSAtKi0gQysrIC0qLSB2YWxhcnJheSBjbGFzcy4KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LAorLy8gMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGluY2x1ZGUvdmFsYXJyYXkKKyAqICBUaGlzIGlzIGEgU3RhbmRhcmQgQysrIExpYnJhcnkgaGVhZGVyLiAKKyAqLworCisvLyBXcml0dGVuIGJ5IEdhYnJpZWwgRG9zIFJlaXMgPEdhYnJpZWwuRG9zLVJlaXNARFBUTWF0aHMuRU5TLUNhY2hhbi5Gcj4KKworI2lmbmRlZiBfR0xJQkNYWF9WQUxBUlJBWQorI2RlZmluZSBfR0xJQkNYWF9WQUxBUlJBWSAxCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworI2luY2x1ZGUgPGJpdHMvYysrY29uZmlnLmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGRlYnVnL2RlYnVnLmg+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIHRlbXBsYXRlPGNsYXNzIF9DbG9zLCB0eXBlbmFtZSBfVHA+IAorICAgIGNsYXNzIF9FeHByOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcDEsIHR5cGVuYW1lIF9UcDI+IAorICAgIGNsYXNzIF9WYWxBcnJheTsgICAgCisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsIHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGEsIGNsYXNzIF9Eb20+CisgICAgc3RydWN0IF9VbkNsb3M7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX09wZXIsCisgICAgICAgIHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGExLAorICAgICAgICB0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhMiwKKyAgICAgICAgY2xhc3MgX0RvbTEsIGNsYXNzIF9Eb20yPiAKKyAgICBjbGFzcyBfQmluQ2xvczsKKworICB0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhLCBjbGFzcyBfRG9tPiAKKyAgICBjbGFzcyBfU0Nsb3M7CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YSwgY2xhc3MgX0RvbT4gCisgICAgY2xhc3MgX0dDbG9zOworICAgIAorICB0ZW1wbGF0ZTx0ZW1wbGF0ZTxjbGFzcywgY2xhc3M+IGNsYXNzIF9NZXRhLCBjbGFzcyBfRG9tPiAKKyAgICBjbGFzcyBfSUNsb3M7CisgICAgCisgIHRlbXBsYXRlPHRlbXBsYXRlPGNsYXNzLCBjbGFzcz4gY2xhc3MgX01ldGEsIGNsYXNzIF9Eb20+IAorICAgIGNsYXNzIF9WYWxGdW5DbG9zOworICAKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MsIGNsYXNzPiBjbGFzcyBfTWV0YSwgY2xhc3MgX0RvbT4gCisgICAgY2xhc3MgX1JlZkZ1bkNsb3M7CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyB2YWxhcnJheTsgICAvLyBBbiBhcnJheSBvZiB0eXBlIF9UcAorICBjbGFzcyBzbGljZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJMQVMtbGlrZSBzbGljZSBvdXQgb2YgYW4gYXJyYXkKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyBzbGljZV9hcnJheTsKKyAgY2xhc3MgZ3NsaWNlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmFsaXplZCBzbGljZSBvdXQgb2YgYW4gYXJyYXkKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiBjbGFzcyBnc2xpY2VfYXJyYXk7CisgIHRlbXBsYXRlPGNsYXNzIF9UcD4gY2xhc3MgbWFza19hcnJheTsgICAgIC8vIG1hc2tlZCBhcnJheQorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+IGNsYXNzIGluZGlyZWN0X2FycmF5OyAvLyBpbmRpcmVjdGVkIGFycmF5CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKworI2luY2x1ZGUgPGJpdHMvdmFsYXJyYXlfYXJyYXkuaD4KKyNpbmNsdWRlIDxiaXRzL3ZhbGFycmF5X2JlZm9yZS5oPgorICAKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICAvKioKKyAgICogQGRlZmdyb3VwIG51bWVyaWNfYXJyYXlzIE51bWVyaWMgQXJyYXlzCisgICAqIEBpbmdyb3VwIG51bWVyaWNzCisgICAqCisgICAqIENsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgcmVwcmVzZW50aW5nIGFuZCBtYW5pcHVsYXRpbmcgYXJyYXlzIG9mIGVsZW1lbnRzLgorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogIEBicmllZiAgU21hcnQgYXJyYXkgZGVzaWduZWQgdG8gc3VwcG9ydCBudW1lcmljIHByb2Nlc3NpbmcuCisgICAqCisgICAqICBBIHZhbGFycmF5IGlzIGFuIGFycmF5IHRoYXQgcHJvdmlkZXMgY29uc3RyYWludHMgaW50ZW5kZWQgdG8gYWxsb3cgZm9yCisgICAqICBlZmZlY3RpdmUgb3B0aW1pemF0aW9uIG9mIG51bWVyaWMgYXJyYXkgcHJvY2Vzc2luZyBieSByZWR1Y2luZyB0aGUKKyAgICogIGFsaWFzaW5nIHRoYXQgY2FuIHJlc3VsdCBmcm9tIHBvaW50ZXIgcmVwcmVzZW50YXRpb25zLiAgSXQgcmVwcmVzZW50cyBhCisgICAqICBvbmUtZGltZW5zaW9uYWwgYXJyYXkgZnJvbSB3aGljaCBkaWZmZXJlbnQgbXVsdGlkaW1lbnNpb25hbCBzdWJzZXRzIGNhbgorICAgKiAgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkLgorICAgKiAgCisgICAqICBAcGFyYW0gIFRwICBUeXBlIG9mIG9iamVjdCBpbiB0aGUgYXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+IAorICAgIGNsYXNzIHZhbGFycmF5CisgICAgeworICAgICAgdGVtcGxhdGU8Y2xhc3MgX09wPgorCXN0cnVjdCBfVW5hcnlPcCAKKwl7CisJICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9PcCwgX1RwPjo6cmVzdWx0X3R5cGUgX19ydDsKKwkgIHR5cGVkZWYgX0V4cHI8X1VuQ2xvczxfT3AsIF9WYWxBcnJheSwgX1RwPiwgX19ydD4gX1J0OworCX07CisgICAgcHVibGljOgorICAgICAgdHlwZWRlZiBfVHAgdmFsdWVfdHlwZTsKKyAgICAgIAorCS8vIF9saWIudmFsYXJyYXkuY29uc18gY29uc3RydWN0L2Rlc3Ryb3k6CisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBlbXB0eSBhcnJheS4KKyAgICAgIHZhbGFycmF5KCk7CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGFycmF5IHdpdGggQGEgbiBlbGVtZW50cy4KKyAgICAgIGV4cGxpY2l0IHZhbGFycmF5KHNpemVfdCk7CisKKyAgICAgIC8vLyAgQ29uc3RydWN0IGFuIGFycmF5IHdpdGggQGEgbiBlbGVtZW50cyBpbml0aWFsaXplZCB0byBAYSB0LgorICAgICAgdmFsYXJyYXkoY29uc3QgX1RwJiwgc2l6ZV90KTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgaW5pdGlhbGl6ZWQgdG8gdGhlIGZpcnN0IEBhIG4gZWxlbWVudHMgb2YgQGEgdC4KKyAgICAgIHZhbGFycmF5KGNvbnN0IF9UcCogX19yZXN0cmljdF9fLCBzaXplX3QpOworCisgICAgICAvLy8gIENvcHkgY29uc3RydWN0b3IuCisgICAgICB2YWxhcnJheShjb25zdCB2YWxhcnJheSYpOworCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIHZhbHVlcyBpbiBAYSBzYS4KKyAgICAgIHZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBDb25zdHJ1Y3QgYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSBzaXplIGFuZCB2YWx1ZXMgaW4gQGEgZ2EuCisgICAgICB2YWxhcnJheShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIHZhbHVlcyBpbiBAYSBtYS4KKyAgICAgIHZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIHZhbHVlcyBpbiBAYSBpYS4KKyAgICAgIHZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mKTsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgICAgICAvLy8gIENvbnN0cnVjdCBhbiBhcnJheSB3aXRoIGFuIGluaXRpYWxpemVyX2xpc3Qgb2YgdmFsdWVzLgorICAgICAgdmFsYXJyYXkoaW5pdGlhbGl6ZXJfbGlzdDxfVHA+KTsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mIF9fZSk7CisKKyAgICAgIH52YWxhcnJheSgpOworCisgICAgICAvLyBfbGliLnZhbGFycmF5LmFzc2lnbl8gYXNzaWdubWVudDoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIHYuICBSZXN1bHRzIGFyZSB1bmRlZmluZWQKKyAgICAgICAqICBpZiBAYSB2IGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHYgIFZhbGFycmF5IHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYSB2YWx1ZS4KKyAgICAgICAqCisgICAgICAgKiAgQXNzaWduIGFsbCBlbGVtZW50cyBvZiBhcnJheSB0byBAYSB0LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHQgIFZhbHVlIGZvciBlbGVtZW50cy4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IF9UcCYpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiBlbGVtZW50cyB0byBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgc2EuICBSZXN1bHRzIGFyZSB1bmRlZmluZWQKKyAgICAgICAqICBpZiBAYSBzYSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzYSAgQXJyYXkgc2xpY2UgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3Qgc2xpY2VfYXJyYXk8X1RwPiYpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiBlbGVtZW50cyB0byBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgZ2EuICBSZXN1bHRzIGFyZSB1bmRlZmluZWQKKyAgICAgICAqICBpZiBAYSBnYSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBnYSAgQXJyYXkgc2xpY2UgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgZ3NsaWNlX2FycmF5PF9UcD4mKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBc3NpZ24gZWxlbWVudHMgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBBc3NpZ24gZWxlbWVudHMgb2YgYXJyYXkgdG8gdmFsdWVzIGluIEBhIG1hLiAgUmVzdWx0cyBhcmUgdW5kZWZpbmVkCisgICAgICAgKiAgaWYgQGEgbWEgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoaXMgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgbWEgIEFycmF5IHNsaWNlIHRvIGdldCB2YWx1ZXMgZnJvbS4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIEFzc2lnbiBlbGVtZW50cyB0byBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgaWEuICBSZXN1bHRzIGFyZSB1bmRlZmluZWQKKyAgICAgICAqICBpZiBAYSBpYSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhpcyBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBpYSAgQXJyYXkgc2xpY2UgdG8gZ2V0IHZhbHVlcyBmcm9tLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYpOworCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgQXNzaWduIGVsZW1lbnRzIHRvIGFuIGluaXRpYWxpemVyX2xpc3QuCisgICAgICAgKgorICAgICAgICogIEFzc2lnbiBlbGVtZW50cyBvZiBhcnJheSB0byB2YWx1ZXMgaW4gQGEgbC4gIFJlc3VsdHMgYXJlIHVuZGVmaW5lZAorICAgICAgICogIGlmIEBhIGwgZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoaXMgYXJyYXkuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgbCAgaW5pdGlhbGl6ZXJfbGlzdCB0byBnZXQgdmFsdWVzIGZyb20uCisgICAgICAgKi8KKyAgICAgIHZhbGFycmF5JiBvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+KTsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPiB2YWxhcnJheTxfVHA+JgorCW9wZXJhdG9yPSAoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworCisgICAgICAvLyBfbGliLnZhbGFycmF5LmFjY2Vzc18gZWxlbWVudCBhY2Nlc3M6CisgICAgICAvKioKKyAgICAgICAqICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGkndGggYXJyYXkgZWxlbWVudC4gIAorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIGkgIEluZGV4IG9mIGVsZW1lbnQgdG8gcmV0dXJuLgorICAgICAgICogIEByZXR1cm4gIFJlZmVyZW5jZSB0byB0aGUgaSd0aCBlbGVtZW50LgorICAgICAgICovCisgICAgICBfVHAmICAgICAgICAgICAgICAgIG9wZXJhdG9yW10oc2l6ZV90KTsKKworICAgICAgLy8gX0dMSUJDWFhfUkVTT0xWRV9MSUJfREVGRUNUUworICAgICAgLy8gMzg5LiBDb25zdCBvdmVybG9hZCBvZiB2YWxhcnJheTo6b3BlcmF0b3JbXSByZXR1cm5zIGJ5IHZhbHVlLgorICAgICAgY29uc3QgX1RwJiAgICAgICAgICBvcGVyYXRvcltdKHNpemVfdCkgY29uc3Q7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkuc3ViXyBzdWJzZXQgb3BlcmF0aW9uczoKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIHNsaWNlIGFyZ3VtZW50LiAgVGhlIG5ldyB2YWxhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZQorICAgICAgICogIGFzIHRoZSBpbnB1dCBzbGljZS4gIEBzZWUgc2xpY2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIHNvdXJjZSBzbGljZS4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgY29udGFpbmluZyBlbGVtZW50cyBpbiBAYSBzLgorICAgICAgICovCisgICAgICBfRXhwcjxfU0Nsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+IG9wZXJhdG9yW10oc2xpY2UpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhIHJlZmVyZW5jZSB0byBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBuZXcgdmFsYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5CisgICAgICAgKiAgaW5kaWNhdGVkIGJ5IHRoZSBzbGljZSBhcmd1bWVudC4gIFRoZSBuZXcgdmFsYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUKKyAgICAgICAqICBhcyB0aGUgaW5wdXQgc2xpY2UuICBAc2VlIHNsaWNlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIHMgIFRoZSBzb3VyY2Ugc2xpY2UuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW4gQGEgcy4KKyAgICAgICAqLworICAgICAgc2xpY2VfYXJyYXk8X1RwPiAgICBvcGVyYXRvcltdKHNsaWNlKTsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgc2xpY2VfYXJyYXkgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgc2xpY2UgYXJndW1lbnQuICBAc2VlIGdzbGljZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzICBUaGUgc291cmNlIHNsaWNlLgorICAgICAgICogIEByZXR1cm4gIFNsaWNlX2FycmF5IHJlZmVyZW5jaW5nIGVsZW1lbnRzIGluZGljYXRlZCBieSBAYSBzLgorICAgICAgICovCisgICAgICBfRXhwcjxfR0Nsb3M8X1ZhbEFycmF5LCBfVHA+LCBfVHA+IG9wZXJhdG9yW10oY29uc3QgZ3NsaWNlJikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkKKyAgICAgICAqICBpbmRpY2F0ZWQgYnkgdGhlIGdzbGljZSBhcmd1bWVudC4gIFRoZSBuZXcgdmFsYXJyYXkgaGFzCisgICAgICAgKiAgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgaW5wdXQgZ3NsaWNlLiAgQHNlZSBnc2xpY2UuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgcyAgVGhlIHNvdXJjZSBnc2xpY2UuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW4gQGEgcy4KKyAgICAgICAqLworICAgICAgZ3NsaWNlX2FycmF5PF9UcD4gICBvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBuZXcgdmFsYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5CisgICAgICAgKiAgaW5kaWNhdGVkIGJ5IHRoZSBhcmd1bWVudC4gIFRoZSBpbnB1dCBpcyBhIHZhbGFycmF5IG9mIGJvb2wgd2hpY2gKKyAgICAgICAqICByZXByZXNlbnRzIGEgYml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGVsZW1lbnRzIHNob3VsZCBiZSBjb3BpZWQgaW50bworICAgICAgICogIHRoZSBuZXcgdmFsYXJyYXkuICBFYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIGFkZGVkIHRvIHRoZSByZXR1cm4KKyAgICAgICAqICB2YWxhcnJheSBpZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHRoZSBhcmd1bWVudCBpcyB0cnVlLgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIG0gIFRoZSB2YWxhcnJheSBiaXRtYXNrLgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIGluZGljYXRlZCBieSBAYSBtLgorICAgICAgICovCisgICAgICB2YWxhcnJheTxfVHA+ICAgICAgIG9wZXJhdG9yW10oY29uc3QgdmFsYXJyYXk8Ym9vbD4mKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgc3Vic2V0LgorICAgICAgICoKKyAgICAgICAqICBSZXR1cm5zIGEgbmV3IG1hc2tfYXJyYXkgcmVmZXJlbmNpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheQorICAgICAgICogIGluZGljYXRlZCBieSB0aGUgYXJndW1lbnQuICBUaGUgaW5wdXQgaXMgYSB2YWxhcnJheSBvZiBib29sIHdoaWNoCisgICAgICAgKiAgcmVwcmVzZW50cyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBlbGVtZW50cyBhcmUgcGFydCBvZiB0aGUKKyAgICAgICAqICBzdWJzZXQuICBFbGVtZW50cyBvZiB0aGUgYXJyYXkgYXJlIHBhcnQgb2YgdGhlIHN1YnNldCBpZiB0aGUKKyAgICAgICAqICBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIGFyZ3VtZW50IGlzIHRydWUuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgbSAgVGhlIHZhbGFycmF5IGJpdG1hc2suCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IGNvbnRhaW5pbmcgZWxlbWVudHMgaW5kaWNhdGVkIGJ5IEBhIG0uCisgICAgICAgKi8KKyAgICAgIG1hc2tfYXJyYXk8X1RwPiAgICAgb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYpOworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJldHVybiBhbiBhcnJheSBzdWJzZXQuCisgICAgICAgKgorICAgICAgICogIFJldHVybnMgYSBuZXcgdmFsYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5CisgICAgICAgKiAgaW5kaWNhdGVkIGJ5IHRoZSBhcmd1bWVudC4gIFRoZSBlbGVtZW50cyBpbiB0aGUgYXJndW1lbnQgYXJlCisgICAgICAgKiAgaW50ZXJwcmV0ZWQgYXMgdGhlIGluZGljZXMgb2YgZWxlbWVudHMgb2YgdGhpcyB2YWxhcnJheSB0byBjb3B5IHRvCisgICAgICAgKiAgdGhlIHJldHVybiB2YWxhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBpICBUaGUgdmFsYXJyYXkgZWxlbWVudCBpbmRleCBsaXN0LgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSBjb250YWluaW5nIGVsZW1lbnRzIGluIEBhIHMuCisgICAgICAgKi8KKyAgICAgIF9FeHByPF9JQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4KKyAgICAgICAgb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JikgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5IHN1YnNldC4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhbiBpbmRpcmVjdF9hcnJheSByZWZlcmVuY2luZyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5CisgICAgICAgKiAgaW5kaWNhdGVkIGJ5IHRoZSBhcmd1bWVudC4gIFRoZSBlbGVtZW50cyBpbiB0aGUgYXJndW1lbnQgYXJlCisgICAgICAgKiAgaW50ZXJwcmV0ZWQgYXMgdGhlIGluZGljZXMgb2YgZWxlbWVudHMgb2YgdGhpcyB2YWxhcnJheSB0byBpbmNsdWRlCisgICAgICAgKiAgaW4gdGhlIHN1YnNldC4gIFRoZSByZXR1cm5lZCBpbmRpcmVjdF9hcnJheSByZWZlcnMgdG8gdGhlc2UKKyAgICAgICAqICBlbGVtZW50cy4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBpICBUaGUgdmFsYXJyYXkgZWxlbWVudCBpbmRleCBsaXN0LgorICAgICAgICogIEByZXR1cm4gIEluZGlyZWN0X2FycmF5IHJlZmVyZW5jaW5nIGVsZW1lbnRzIGluIEBhIGkuCisgICAgICAgKi8KKyAgICAgIGluZGlyZWN0X2FycmF5PF9UcD4gb3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+Jik7CisKKyAgICAgIC8vIF9saWIudmFsYXJyYXkudW5hcnlfIHVuYXJ5IG9wZXJhdG9yczoKKyAgICAgIC8vLyAgUmV0dXJuIGEgbmV3IHZhbGFycmF5IGJ5IGFwcGx5aW5nIHVuYXJ5ICsgdG8gZWFjaCBlbGVtZW50LgorICAgICAgdHlwZW5hbWUgX1VuYXJ5T3A8X191bmFyeV9wbHVzPjo6X1J0ICBvcGVyYXRvcisoKSBjb25zdDsKKworICAgICAgLy8vICBSZXR1cm4gYSBuZXcgdmFsYXJyYXkgYnkgYXBwbHlpbmcgdW5hcnkgLSB0byBlYWNoIGVsZW1lbnQuCisgICAgICB0eXBlbmFtZSBfVW5hcnlPcDxfX25lZ2F0ZT46Ol9SdCAgICAgIG9wZXJhdG9yLSgpIGNvbnN0OworCisgICAgICAvLy8gIFJldHVybiBhIG5ldyB2YWxhcnJheSBieSBhcHBseWluZyB1bmFyeSB+IHRvIGVhY2ggZWxlbWVudC4KKyAgICAgIHR5cGVuYW1lIF9VbmFyeU9wPF9fYml0d2lzZV9ub3Q+OjpfUnQgb3BlcmF0b3J+KCkgY29uc3Q7CisKKyAgICAgIC8vLyAgUmV0dXJuIGEgbmV3IHZhbGFycmF5IGJ5IGFwcGx5aW5nIHVuYXJ5ICEgdG8gZWFjaCBlbGVtZW50LgorICAgICAgdHlwZW5hbWUgX1VuYXJ5T3A8X19sb2dpY2FsX25vdD46Ol9SdCBvcGVyYXRvciEoKSBjb25zdDsKKworICAgICAgLy8gX2xpYi52YWxhcnJheS5jYXNzaWduXyBjb21wdXRlZCBhc3NpZ25tZW50OgorICAgICAgLy8vICBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgYXJyYXkgYnkgQGEgdC4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgRGl2aWRlIGVhY2ggZWxlbWVudCBvZiBhcnJheSBieSBAYSB0LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBTZXQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgdG8gZSAlIEBhIHQuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciU9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIEFkZCBAYSB0IHRvIGVhY2ggZWxlbWVudCBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yKz0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgU3VidHJhY3QgQGEgdCB0byBlYWNoIGVsZW1lbnQgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvci09KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIFNldCBlYWNoIGVsZW1lbnQgZSBvZiBhcnJheSB0byBlIF4gQGEgdC4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgU2V0IGVhY2ggZWxlbWVudCBlIG9mIGFycmF5IHRvIGUgJiBAYSB0LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ImPShjb25zdCBfVHAmKTsKKworICAgICAgLy8vICBTZXQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgdG8gZSB8IEBhIHQuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcnw9KGNvbnN0IF9UcCYpOworCisgICAgICAvLy8gIExlZnQgc2hpZnQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgYnkgQGEgdCBiaXRzLgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgUmlnaHQgc2hpZnQgZWFjaCBlbGVtZW50IGUgb2YgYXJyYXkgYnkgQGEgdCBiaXRzLgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I+Pj0oY29uc3QgX1RwJik7CisKKyAgICAgIC8vLyAgTXVsdGlwbHkgZWxlbWVudHMgb2YgYXJyYXkgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IqPShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgRGl2aWRlIGVsZW1lbnRzIG9mIGFycmF5IGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yLz0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIE1vZHVsbyBlbGVtZW50cyBvZiBhcnJheSBieSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvciU9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBBZGQgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHRvIGVsZW1lbnRzIG9mIGFycmF5LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IrPShjb25zdCB2YWxhcnJheTxfVHA+Jik7CisKKyAgICAgIC8vLyAgU3VidHJhY3QgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IGZyb20gZWxlbWVudHMgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvci09KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBMb2dpY2FsIHhvciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgd2l0aCBlbGVtZW50cyBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIExvZ2ljYWwgb3IgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2IHdpdGggZWxlbWVudHMgb2YgYXJyYXkuCisgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcnw9KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgLy8vICBMb2dpY2FsIGFuZCBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIEBhIHYgd2l0aCBlbGVtZW50cyBvZiBhcnJheS4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJj0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIExlZnQgc2hpZnQgZWxlbWVudHMgb2YgYXJyYXkgYnkgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvZiBAYSB2LgorICAgICAgdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3I8PD0oY29uc3QgdmFsYXJyYXk8X1RwPiYpOworCisgICAgICAvLy8gIFJpZ2h0IHNoaWZ0IGVsZW1lbnRzIG9mIGFycmF5IGJ5IGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YgQGEgdi4KKyAgICAgIHZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPj49KGNvbnN0IHZhbGFycmF5PF9UcD4mKTsKKworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcio9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3IvPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yJT0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcis9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ItPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yXj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYpOworICAgICAgdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKwl2YWxhcnJheTxfVHA+JiBvcGVyYXRvcnw9KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9Eb20+CisJdmFsYXJyYXk8X1RwPiYgb3BlcmF0b3ImPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorICAgICAgICB2YWxhcnJheTxfVHA+JiBvcGVyYXRvcjw8PShjb25zdCBfRXhwcjxfRG9tLCBfVHA+Jik7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgorCXZhbGFycmF5PF9UcD4mIG9wZXJhdG9yPj49KGNvbnN0IF9FeHByPF9Eb20sIF9UcD4mKTsKKworICAgICAgLy8gX2xpYi52YWxhcnJheS5tZW1iZXJzXyBtZW1iZXIgZnVuY3Rpb25zOgorICAgICAgLy8vICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhcnJheS4KKyAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQWNjdW11bGF0ZXMgdGhlIHN1bSBvZiBhbGwgZWxlbWVudHMgaW50byBhIFRwIHVzaW5nICs9LiAgVGhlIG9yZGVyCisgICAgICAgKiAgb2YgYWRkaW5nIHRoZSBlbGVtZW50cyBpcyB1bnNwZWNpZmllZC4KKyAgICAgICAqLworICAgICAgX1RwICAgIHN1bSgpIGNvbnN0OworCisgICAgICAvLy8gIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IHVzaW5nIG9wZXJhdG9yPCgpLgorICAgICAgX1RwICAgIG1pbigpIGNvbnN0OwkKKworICAgICAgLy8vICBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCB1c2luZyBvcGVyYXRvcjwoKS4KKyAgICAgIF9UcCAgICBtYXgoKSBjb25zdDsJCisKKyAgICAgIC8qKgorICAgICAgICogIEBicmllZiAgUmV0dXJuIGEgc2hpZnRlZCBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgQSBuZXcgdmFsYXJyYXkgaXMgY29uc3RydWN0ZWQgYXMgYSBjb3B5IG9mIHRoaXMgYXJyYXkgd2l0aCBlbGVtZW50cworICAgICAgICogIGluIHNoaWZ0ZWQgcG9zaXRpb25zLiAgRm9yIGFuIGVsZW1lbnQgd2l0aCBpbmRleCBpLCB0aGUgbmV3IHBvc2l0aW9uCisgICAgICAgKiAgaXMgaSAtIG4uICBUaGUgbmV3IHZhbGFycmF5IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBjdXJyZW50IG9uZS4KKyAgICAgICAqICBOZXcgZWxlbWVudHMgd2l0aG91dCBhIHZhbHVlIGFyZSBzZXQgdG8gMC4gIEVsZW1lbnRzIHdob3NlIG5ldworICAgICAgICogIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgYXJyYXkgYXJlIGRpc2NhcmRlZC4KKyAgICAgICAqCisgICAgICAgKiAgUG9zaXRpdmUgYXJndW1lbnRzIHNoaWZ0IHRvd2FyZCBpbmRleCAwLCBkaXNjYXJkaW5nIGVsZW1lbnRzIFswLCBuKS4KKyAgICAgICAqICBOZWdhdGl2ZSBhcmd1bWVudHMgZGlzY2FyZCBlbGVtZW50cyBmcm9tIHRoZSB0b3Agb2YgdGhlIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBAcGFyYW0gIG4gIE51bWJlciBvZiBlbGVtZW50IHBvc2l0aW9ucyB0byBzaGlmdC4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgd2l0aCBlbGVtZW50cyBpbiBzaGlmdGVkIHBvc2l0aW9ucy4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiBzaGlmdCAoaW50KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBSZXR1cm4gYSByb3RhdGVkIGFycmF5LgorICAgICAgICoKKyAgICAgICAqICBBIG5ldyB2YWxhcnJheSBpcyBjb25zdHJ1Y3RlZCBhcyBhIGNvcHkgb2YgdGhpcyBhcnJheSB3aXRoIGVsZW1lbnRzCisgICAgICAgKiAgaW4gc2hpZnRlZCBwb3NpdGlvbnMuICBGb3IgYW4gZWxlbWVudCB3aXRoIGluZGV4IGksIHRoZSBuZXcgcG9zaXRpb24KKyAgICAgICAqICBpcyAoaSAtIG4pICUgc2l6ZSgpLiAgVGhlIG5ldyB2YWxhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKKyAgICAgICAqICBjdXJyZW50IG9uZS4gIEVsZW1lbnRzIHRoYXQgYXJlIHNoaWZ0ZWQgYmV5b25kIHRoZSBhcnJheSBib3VuZHMgYXJlCisgICAgICAgKiAgc2hpZnRlZCBpbnRvIHRoZSBvdGhlciBlbmQgb2YgdGhlIGFycmF5LiAgTm8gZWxlbWVudHMgYXJlIGxvc3QuCisgICAgICAgKgorICAgICAgICogIFBvc2l0aXZlIGFyZ3VtZW50cyBzaGlmdCB0b3dhcmQgaW5kZXggMCwgd3JhcHBpbmcgYXJvdW5kIHRoZSB0b3AuCisgICAgICAgKiAgTmVnYXRpdmUgYXJndW1lbnRzIHNoaWZ0IHRvd2FyZHMgdGhlIHRvcCwgd3JhcHBpbmcgYXJvdW5kIHRvIDAuCisgICAgICAgKgorICAgICAgICogIEBwYXJhbSAgbiAgTnVtYmVyIG9mIGVsZW1lbnQgcG9zaXRpb25zIHRvIHJvdGF0ZS4KKyAgICAgICAqICBAcmV0dXJuICBOZXcgdmFsYXJyYXkgd2l0aCBlbGVtZW50cyBpbiBzaGlmdGVkIHBvc2l0aW9ucy4KKyAgICAgICAqLworICAgICAgdmFsYXJyYXk8X1RwPiBjc2hpZnQoaW50KSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBseSBhIGZ1bmN0aW9uIHRvIHRoZSBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSB3aXRoIGVsZW1lbnRzIGFzc2lnbmVkIHRvIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICBhcHBseWluZyBmdW5jIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhpcyBhcnJheS4gIFRoZSBuZXcKKyAgICAgICAqICBhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBmdW5jICBGdW5jdGlvbiBvZiBUcCByZXR1cm5pbmcgVHAgdG8gYXBwbHkuCisgICAgICAgKiAgQHJldHVybiAgTmV3IHZhbGFycmF5IHdpdGggdHJhbnNmb3JtZWQgZWxlbWVudHMuCisgICAgICAgKi8KKyAgICAgIF9FeHByPF9WYWxGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPiBhcHBseShfVHAgZnVuYyhfVHApKSBjb25zdDsKKworICAgICAgLyoqCisgICAgICAgKiAgQGJyaWVmICBBcHBseSBhIGZ1bmN0aW9uIHRvIHRoZSBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgUmV0dXJucyBhIG5ldyB2YWxhcnJheSB3aXRoIGVsZW1lbnRzIGFzc2lnbmVkIHRvIHRoZSByZXN1bHQgb2YKKyAgICAgICAqICBhcHBseWluZyBmdW5jIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhpcyBhcnJheS4gIFRoZSBuZXcKKyAgICAgICAqICBhcnJheSBoYXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGlzIG9uZS4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBmdW5jICBGdW5jdGlvbiBvZiBjb25zdCBUcCYgcmV0dXJuaW5nIFRwIHRvIGFwcGx5LgorICAgICAgICogIEByZXR1cm4gIE5ldyB2YWxhcnJheSB3aXRoIHRyYW5zZm9ybWVkIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICBfRXhwcjxfUmVmRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4gYXBwbHkoX1RwIGZ1bmMoY29uc3QgX1RwJikpIGNvbnN0OworCisgICAgICAvKioKKyAgICAgICAqICBAYnJpZWYgIFJlc2l6ZSBhcnJheS4KKyAgICAgICAqCisgICAgICAgKiAgUmVzaXplIHRoaXMgYXJyYXkgdG8gQGEgc2l6ZSBhbmQgc2V0IGFsbCBlbGVtZW50cyB0byBAYSBjLiAgQWxsCisgICAgICAgKiAgcmVmZXJlbmNlcyBhbmQgaXRlcmF0b3JzIGFyZSBpbnZhbGlkYXRlZC4KKyAgICAgICAqCisgICAgICAgKiAgQHBhcmFtICBzaXplICBOZXcgYXJyYXkgc2l6ZS4KKyAgICAgICAqICBAcGFyYW0gIGMgIE5ldyB2YWx1ZSBmb3IgYWxsIGVsZW1lbnRzLgorICAgICAgICovCisgICAgICB2b2lkIHJlc2l6ZShzaXplX3QgX19zaXplLCBfVHAgX19jID0gX1RwKCkpOworCisgICAgcHJpdmF0ZToKKyAgICAgIHNpemVfdCBfTV9zaXplOworICAgICAgX1RwKiBfX3Jlc3RyaWN0X18gX01fZGF0YTsKKyAgICAgIAorICAgICAgZnJpZW5kIGNsYXNzIF9BcnJheTxfVHA+OworICAgIH07CisgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGNvbnN0IF9UcCYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKHNpemVfdCBfX2kpIGNvbnN0CisgICAgeyAKKyAgICAgIF9fZ2xpYmN4eF9yZXF1aXJlc19zdWJzY3JpcHQoX19pKTsKKyAgICAgIHJldHVybiBfTV9kYXRhW19faV07CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwJgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yW10oc2l6ZV90IF9faSkKKyAgICB7IAorICAgICAgX19nbGliY3h4X3JlcXVpcmVzX3N1YnNjcmlwdChfX2kpOworICAgICAgcmV0dXJuIF9NX2RhdGFbX19pXTsKKyAgICB9CisKKyAgLy8gQH0gZ3JvdXAgbnVtZXJpY19hcnJheXMKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjaW5jbHVkZSA8Yml0cy92YWxhcnJheV9hZnRlci5oPgorI2luY2x1ZGUgPGJpdHMvc2xpY2VfYXJyYXkuaD4KKyNpbmNsdWRlIDxiaXRzL2dzbGljZS5oPgorI2luY2x1ZGUgPGJpdHMvZ3NsaWNlX2FycmF5Lmg+CisjaW5jbHVkZSA8Yml0cy9tYXNrX2FycmF5Lmg+CisjaW5jbHVkZSA8Yml0cy9pbmRpcmVjdF9hcnJheS5oPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLyoqCisgICAqIEBhZGR0b2dyb3VwIG51bWVyaWNfYXJyYXlzCisgICAqIEB7CisgICAqLworCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheSgpIDogX01fc2l6ZSgwKSwgX01fZGF0YSgwKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgCisgICAgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoc2l6ZV90IF9fbikgCisgICAgOiBfTV9zaXplKF9fbiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZGVmYXVsdF9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbik7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgX1RwJiBfX3QsIHNpemVfdCBfX24pCisgICAgOiBfTV9zaXplKF9fbiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfZmlsbF9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbiwgX190KTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShjb25zdCBfVHAqIF9fcmVzdHJpY3RfXyBfX3AsIHNpemVfdCBfX24pCisgICAgOiBfTV9zaXplKF9fbiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbikpCisgICAgeyAKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfX3AgIT0gMCB8fCBfX24gPT0gMCk7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19wLCBfX3AgKyBfX24sIF9NX2RhdGEpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikKKyAgICA6IF9NX3NpemUoX192Ll9NX3NpemUpLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX3YuX01fc2l6ZSkpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX192Ll9NX2RhdGEsIF9fdi5fTV9kYXRhICsgX01fc2l6ZSwKKwkJCQkgICAgIF9NX2RhdGEpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9fc2EpCisgICAgOiBfTV9zaXplKF9fc2EuX01fc3opLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX3NhLl9NX3N6KSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19zYS5fTV9hcnJheSwgX19zYS5fTV9zeiwgX19zYS5fTV9zdHJpZGUsIF9BcnJheTxfVHA+KF9NX2RhdGEpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGdzbGljZV9hcnJheTxfVHA+JiBfX2dhKQorICAgIDogX01fc2l6ZShfX2dhLl9NX2luZGV4LnNpemUoKSksCisgICAgICBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19nYS5fTV9hcnJheSwgX0FycmF5PHNpemVfdD4oX19nYS5fTV9pbmRleCksCisJIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IG1hc2tfYXJyYXk8X1RwPiYgX19tYSkKKyAgICA6IF9NX3NpemUoX19tYS5fTV9zeiksIF9NX2RhdGEoX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbWEuX01fc3opKQorICAgIHsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdAorCShfX21hLl9NX2FycmF5LCBfX21hLl9NX21hc2ssIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZQorICAgIHZhbGFycmF5PF9UcD46OnZhbGFycmF5KGNvbnN0IGluZGlyZWN0X2FycmF5PF9UcD4mIF9faWEpCisgICAgOiBfTV9zaXplKF9faWEuX01fc3opLCBfTV9kYXRhKF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfX2lhLl9NX3N6KSkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QKKwkoX19pYS5fTV9hcnJheSwgX19pYS5fTV9pbmRleCwgX0FycmF5PF9UcD4oX01fZGF0YSksIF9NX3NpemUpOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUKKyAgICB2YWxhcnJheTxfVHA+Ojp2YWxhcnJheShpbml0aWFsaXplcl9saXN0PF9UcD4gX19sKQorICAgIDogX01fc2l6ZShfX2wuc2l6ZSgpKSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX19sLnNpemUoKSkpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QgKF9fbC5iZWdpbigpLCBfX2wuZW5kKCksIF9NX2RhdGEpOyB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+IHRlbXBsYXRlPGNsYXNzIF9Eb20+CisgICAgaW5saW5lCisgICAgdmFsYXJyYXk8X1RwPjo6dmFsYXJyYXkoY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lKQorICAgIDogX01fc2l6ZShfX2Uuc2l6ZSgpKSwgX01fZGF0YShfX3ZhbGFycmF5X2dldF9zdG9yYWdlPF9UcD4oX01fc2l6ZSkpCisgICAgeyBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX19lLCBfTV9zaXplLCBfQXJyYXk8X1RwPihfTV9kYXRhKSk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lCisgICAgdmFsYXJyYXk8X1RwPjo6fnZhbGFycmF5KCkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZGVzdHJveV9lbGVtZW50cyhfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfcmVsZWFzZV9tZW1vcnkoX01fZGF0YSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192KQorICAgIHsKKyAgICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8vIDYzMC4gYXJyYXlzIG9mIHZhbGFycmF5LgorICAgICAgaWYgKF9NX3NpemUgPT0gX192Ll9NX3NpemUpCisJc3RkOjpfX3ZhbGFycmF5X2NvcHkoX192Ll9NX2RhdGEsIF9NX3NpemUsIF9NX2RhdGEpOworICAgICAgZWxzZQorCXsKKwkgIGlmIChfTV9kYXRhKQorCSAgICB7CisJICAgICAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworCSAgICAgIHN0ZDo6X192YWxhcnJheV9yZWxlYXNlX21lbW9yeShfTV9kYXRhKTsKKwkgICAgfQorCSAgX01fc2l6ZSA9IF9fdi5fTV9zaXplOworCSAgX01fZGF0YSA9IF9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKTsKKwkgIHN0ZDo6X192YWxhcnJheV9jb3B5X2NvbnN0cnVjdChfX3YuX01fZGF0YSwgX192Ll9NX2RhdGEgKyBfTV9zaXplLAorCQkJCQkgX01fZGF0YSk7CisJfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oaW5pdGlhbGl6ZXJfbGlzdDxfVHA+IF9fbCkKKyAgICB7CisgICAgICAvLyBfR0xJQkNYWF9SRVNPTFZFX0xJQl9ERUZFQ1RTCisgICAgICAvLyA2MzAuIGFycmF5cyBvZiB2YWxhcnJheS4KKyAgICAgIGlmIChfTV9zaXplID09IF9fbC5zaXplKCkpCisJc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19sLmJlZ2luKCksIF9fbC5zaXplKCksIF9NX2RhdGEpOworICAgICAgZWxzZQorCXsKKwkgIGlmIChfTV9kYXRhKQorCSAgICB7CisJICAgICAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworCSAgICAgIHN0ZDo6X192YWxhcnJheV9yZWxlYXNlX21lbW9yeShfTV9kYXRhKTsKKwkgICAgfQorCSAgX01fc2l6ZSA9IF9fbC5zaXplKCk7CisJICBfTV9kYXRhID0gX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpOworCSAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9fbC5iZWdpbigpLCBfX2wuYmVnaW4oKSArIF9NX3NpemUsCisJCQkJCSBfTV9kYXRhKTsKKwl9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBfVHAmIF9fdCkKKyAgICB7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfZmlsbChfTV9kYXRhLCBfTV9zaXplLCBfX3QpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3I9KGNvbnN0IHNsaWNlX2FycmF5PF9UcD4mIF9fc2EpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPT0gX19zYS5fTV9zeik7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX3NhLl9NX2FycmF5LCBfX3NhLl9NX3N6LAorCQkJICAgX19zYS5fTV9zdHJpZGUsIF9BcnJheTxfVHA+KF9NX2RhdGEpKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBnc2xpY2VfYXJyYXk8X1RwPiYgX19nYSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA9PSBfX2dhLl9NX2luZGV4LnNpemUoKSk7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX2dhLl9NX2FycmF5LCBfQXJyYXk8c2l6ZV90PihfX2dhLl9NX2luZGV4KSwKKwkJCSAgIF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfTV9zaXplKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+JgorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yPShjb25zdCBtYXNrX2FycmF5PF9UcD4mIF9fbWEpCisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPT0gX19tYS5fTV9zeik7CisgICAgICBzdGQ6Ol9fdmFsYXJyYXlfY29weShfX21hLl9NX2FycmF5LCBfX21hLl9NX21hc2ssCisJCQkgICBfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgaW5kaXJlY3RfYXJyYXk8X1RwPiYgX19pYSkKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA9PSBfX2lhLl9NX3N6KTsKKyAgICAgIHN0ZDo6X192YWxhcnJheV9jb3B5KF9faWEuX01fYXJyYXksIF9faWEuX01faW5kZXgsCisJCQkgICBfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4gdGVtcGxhdGU8Y2xhc3MgX0RvbT4KKyAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPiYKKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcj0oY29uc3QgX0V4cHI8X0RvbSwgX1RwPiYgX19lKQorICAgIHsKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9fZS5zaXplKCkpOworICAgICAgc3RkOjpfX3ZhbGFycmF5X2NvcHkoX19lLCBfTV9zaXplLCBfQXJyYXk8X1RwPihfTV9kYXRhKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0V4cHI8X1NDbG9zPF9WYWxBcnJheSxfVHA+LCBfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShzbGljZSBfX3MpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfU0Nsb3M8X1ZhbEFycmF5LF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUgKF9BcnJheTxfVHA+KF9NX2RhdGEpLCBfX3MpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBzbGljZV9hcnJheTxfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShzbGljZSBfX3MpCisgICAgeyByZXR1cm4gc2xpY2VfYXJyYXk8X1RwPihfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19zKTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0V4cHI8X0dDbG9zPF9WYWxBcnJheSxfVHA+LCBfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCBnc2xpY2UmIF9fZ3MpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfR0Nsb3M8X1ZhbEFycmF5LF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4KKwkoX0Nsb3N1cmUoX0FycmF5PF9UcD4oX01fZGF0YSksIF9fZ3MuX01faW5kZXgtPl9NX2luZGV4KSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgZ3NsaWNlX2FycmF5PF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IGdzbGljZSYgX19ncykKKyAgICB7CisgICAgICByZXR1cm4gZ3NsaWNlX2FycmF5PF9UcD4KKwkoX0FycmF5PF9UcD4oX01fZGF0YSksIF9fZ3MuX01faW5kZXgtPl9NX2luZGV4KTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSB2YWxhcnJheTxfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxib29sPiYgX19tKSBjb25zdAorICAgIHsKKyAgICAgIHNpemVfdCBfX3MgPSAwOworICAgICAgc2l6ZV90IF9fZSA9IF9fbS5zaXplKCk7CisgICAgICBmb3IgKHNpemVfdCBfX2k9MDsgX19pPF9fZTsgKytfX2kpCisJaWYgKF9fbVtfX2ldKSArK19fczsKKyAgICAgIHJldHVybiB2YWxhcnJheTxfVHA+KG1hc2tfYXJyYXk8X1RwPihfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19zLAorCQkJCQkgICBfQXJyYXk8Ym9vbD4gKF9fbSkpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgorICAgIGlubGluZSBtYXNrX2FycmF5PF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PGJvb2w+JiBfX20pCisgICAgeworICAgICAgc2l6ZV90IF9fcyA9IDA7CisgICAgICBzaXplX3QgX19lID0gX19tLnNpemUoKTsKKyAgICAgIGZvciAoc2l6ZV90IF9faT0wOyBfX2k8X19lOyArK19faSkKKwlpZiAoX19tW19faV0pICsrX19zOworICAgICAgcmV0dXJuIG1hc2tfYXJyYXk8X1RwPihfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19zLCBfQXJyYXk8Ym9vbD4oX19tKSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX0V4cHI8X0lDbG9zPF9WYWxBcnJheSxfVHA+LCBfVHA+CisgICAgdmFsYXJyYXk8X1RwPjo6b3BlcmF0b3JbXShjb25zdCB2YWxhcnJheTxzaXplX3Q+JiBfX2kpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfSUNsb3M8X1ZhbEFycmF5LF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoKnRoaXMsIF9faSkpOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIGluZGlyZWN0X2FycmF5PF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjpvcGVyYXRvcltdKGNvbnN0IHZhbGFycmF5PHNpemVfdD4mIF9faSkKKyAgICB7CisgICAgICByZXR1cm4gaW5kaXJlY3RfYXJyYXk8X1RwPihfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19pLnNpemUoKSwKKwkJCQkgX0FycmF5PHNpemVfdD4oX19pKSk7CisgICAgfQorCisgIHRlbXBsYXRlPGNsYXNzIF9UcD4KKyAgICBpbmxpbmUgc2l6ZV90IAorICAgIHZhbGFycmF5PF9UcD46OnNpemUoKSBjb25zdAorICAgIHsgcmV0dXJuIF9NX3NpemU7IH0KKworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIHZhbGFycmF5PF9UcD46OnN1bSgpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPiAwKTsKKyAgICAgIHJldHVybiBzdGQ6Ol9fdmFsYXJyYXlfc3VtKF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgICB2YWxhcnJheTxfVHA+OjpzaGlmdChpbnQgX19uKSBjb25zdAorICAgICB7CisgICAgICAgdmFsYXJyYXk8X1RwPiBfX3JldDsKKworICAgICAgIGlmIChfTV9zaXplID09IDApCisJIHJldHVybiBfX3JldDsKKworICAgICAgIF9UcCogX19yZXN0cmljdF9fIF9fdG1wX01fZGF0YSA9CisJIHN0ZDo6X192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9NX3NpemUpOworCisgICAgICAgaWYgKF9fbiA9PSAwKQorCSBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwKKwkJCQkJX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisgICAgICAgZWxzZSBpZiAoX19uID4gMCkgICAgICAvLyBzaGlmdCBsZWZ0CisJIHsKKwkgICBpZiAoc2l6ZV90KF9fbikgPiBfTV9zaXplKQorCSAgICAgX19uID0gaW50KF9NX3NpemUpOworCisJICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9NX2RhdGEgKyBfX24sCisJCQkJCSAgX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisJICAgc3RkOjpfX3ZhbGFycmF5X2RlZmF1bHRfY29uc3RydWN0KF9fdG1wX01fZGF0YSArIF9NX3NpemUgLSBfX24sCisJCQkJCSAgICAgX190bXBfTV9kYXRhICsgX01fc2l6ZSk7CisJIH0KKyAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IHJpZ2h0CisJIHsKKwkgICBpZiAoLXNpemVfdChfX24pID4gX01fc2l6ZSkKKwkgICAgIF9fbiA9IC1pbnQoX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUgKyBfX24sCisJCQkJCSAgX190bXBfTV9kYXRhIC0gX19uKTsKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfZGVmYXVsdF9jb25zdHJ1Y3QoX190bXBfTV9kYXRhLAorCQkJCQkgICAgIF9fdG1wX01fZGF0YSAtIF9fbik7CisJIH0KKworICAgICAgIF9fcmV0Ll9NX3NpemUgPSBfTV9zaXplOworICAgICAgIF9fcmV0Ll9NX2RhdGEgPSBfX3RtcF9NX2RhdGE7CisgICAgICAgcmV0dXJuIF9fcmV0OworICAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgICBpbmxpbmUgdmFsYXJyYXk8X1RwPgorICAgICB2YWxhcnJheTxfVHA+Ojpjc2hpZnQoaW50IF9fbikgY29uc3QKKyAgICAgeworICAgICAgIHZhbGFycmF5PF9UcD4gX19yZXQ7CisKKyAgICAgICBpZiAoX01fc2l6ZSA9PSAwKQorCSByZXR1cm4gX19yZXQ7CisKKyAgICAgICBfVHAqIF9fcmVzdHJpY3RfXyBfX3RtcF9NX2RhdGEgPQorCSBzdGQ6Ol9fdmFsYXJyYXlfZ2V0X3N0b3JhZ2U8X1RwPihfTV9zaXplKTsKKworICAgICAgIGlmIChfX24gPT0gMCkKKwkgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9NX2RhdGEsCisJCQkJCV9NX2RhdGEgKyBfTV9zaXplLCBfX3RtcF9NX2RhdGEpOworICAgICAgIGVsc2UgaWYgKF9fbiA+IDApICAgICAgLy8gY3NoaWZ0IGxlZnQKKwkgeworCSAgIGlmIChzaXplX3QoX19uKSA+IF9NX3NpemUpCisJICAgICBfX24gPSBpbnQoX19uICUgX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSwgX01fZGF0YSArIF9fbiwKKwkJCQkJICBfX3RtcF9NX2RhdGEgKyBfTV9zaXplIC0gX19uKTsKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSArIF9fbiwgX01fZGF0YSArIF9NX3NpemUsCisJCQkJCSAgX190bXBfTV9kYXRhKTsKKwkgfQorICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgLy8gY3NoaWZ0IHJpZ2h0CisJIHsKKwkgICBpZiAoLXNpemVfdChfX24pID4gX01fc2l6ZSkKKwkgICAgIF9fbiA9IC1pbnQoLXNpemVfdChfX24pICUgX01fc2l6ZSk7CisKKwkgICBzdGQ6Ol9fdmFsYXJyYXlfY29weV9jb25zdHJ1Y3QoX01fZGF0YSArIF9NX3NpemUgKyBfX24sCisJCQkJCSAgX01fZGF0YSArIF9NX3NpemUsIF9fdG1wX01fZGF0YSk7CisJICAgc3RkOjpfX3ZhbGFycmF5X2NvcHlfY29uc3RydWN0KF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplICsgX19uLAorCQkJCQkgIF9fdG1wX01fZGF0YSAtIF9fbik7CisJIH0KKworICAgICAgIF9fcmV0Ll9NX3NpemUgPSBfTV9zaXplOworICAgICAgIF9fcmV0Ll9NX2RhdGEgPSBfX3RtcF9NX2RhdGE7CisgICAgICAgcmV0dXJuIF9fcmV0OworICAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSB2b2lkCisgICAgdmFsYXJyYXk8X1RwPjo6cmVzaXplKHNpemVfdCBfX24sIF9UcCBfX2MpCisgICAgeworICAgICAgLy8gVGhpcyBjb21wbGljYXRpb24gaXMgc28gdG8gbWFrZSB2YWxhcnJheTx2YWxhcnJheTxUPiA+IHdvcmsKKyAgICAgIC8vIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQuICBOb2JvZHkgc2hvdWxkCisgICAgICAvLyBiZSBzYXlpbmcgdmFsYXJyYXk8dmFsYXJyYXk8VD4gPiBhbnl3YXkuICBTZWUgdGhlIHNwZWNzLgorICAgICAgc3RkOjpfX3ZhbGFycmF5X2Rlc3Ryb3lfZWxlbWVudHMoX01fZGF0YSwgX01fZGF0YSArIF9NX3NpemUpOworICAgICAgaWYgKF9NX3NpemUgIT0gX19uKQorCXsKKwkgIHN0ZDo6X192YWxhcnJheV9yZWxlYXNlX21lbW9yeShfTV9kYXRhKTsKKwkgIF9NX3NpemUgPSBfX247CisJICBfTV9kYXRhID0gX192YWxhcnJheV9nZXRfc3RvcmFnZTxfVHA+KF9fbik7CisJfQorICAgICAgc3RkOjpfX3ZhbGFycmF5X2ZpbGxfY29uc3RydWN0KF9NX2RhdGEsIF9NX2RhdGEgKyBfX24sIF9fYyk7CisgICAgfQorICAgIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CisgICAgaW5saW5lIF9UcAorICAgIHZhbGFycmF5PF9UcD46Om1pbigpIGNvbnN0CisgICAgeworICAgICAgX0dMSUJDWFhfREVCVUdfQVNTRVJUKF9NX3NpemUgPiAwKTsKKyAgICAgIHJldHVybiAqc3RkOjptaW5fZWxlbWVudChfTV9kYXRhLCBfTV9kYXRhICsgX01fc2l6ZSk7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9UcD4KKyAgICBpbmxpbmUgX1RwCisgICAgdmFsYXJyYXk8X1RwPjo6bWF4KCkgY29uc3QKKyAgICB7CisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX01fc2l6ZSA+IDApOworICAgICAgcmV0dXJuICpzdGQ6Om1heF9lbGVtZW50KF9NX2RhdGEsIF9NX2RhdGEgKyBfTV9zaXplKTsKKyAgICB9CisgIAorICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9FeHByPF9WYWxGdW5DbG9zPF9WYWxBcnJheSwgX1RwPiwgX1RwPgorICAgIHZhbGFycmF5PF9UcD46OmFwcGx5KF9UcCBmdW5jKF9UcCkpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfVmFsRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoKnRoaXMsIGZ1bmMpKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBfRXhwcjxfUmVmRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4sIF9UcD4KKyAgICB2YWxhcnJheTxfVHA+OjphcHBseShfVHAgZnVuYyhjb25zdCBfVHAgJikpIGNvbnN0CisgICAgeworICAgICAgdHlwZWRlZiBfUmVmRnVuQ2xvczxfVmFsQXJyYXksIF9UcD4gX0Nsb3N1cmU7CisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9UcD4oX0Nsb3N1cmUoKnRoaXMsIGZ1bmMpKTsKKyAgICB9CisKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUihfT3AsIF9OYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgdHlwZW5hbWUgdmFsYXJyYXk8X1RwPjo6dGVtcGxhdGUgX1VuYXJ5T3A8X05hbWU+OjpfUnQgICAgICAJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCgpIGNvbnN0CQkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIHR5cGVkZWYgX1VuQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfVHA+IF9DbG9zdXJlOwkgICAgICAgICAgICAgICAgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1J0OyAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfUnQ+KF9DbG9zdXJlKCp0aGlzKSk7CQkJXAorICAgIH0KKworICAgIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IoKywgX191bmFyeV9wbHVzKQorICAgIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IoLSwgX19uZWdhdGUpCisgICAgX0RFRklORV9WQUxBUlJBWV9VTkFSWV9PUEVSQVRPUih+LCBfX2JpdHdpc2Vfbm90KQorICAgIF9ERUZJTkVfVkFMQVJSQVlfVU5BUllfT1BFUkFUT1IgKCEsIF9fbG9naWNhbF9ub3QpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX1VOQVJZX09QRVJBVE9SCisKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVChfT3AsIF9OYW1lKSAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgkJCQkJCQlcCisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCQkJCQkJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCBfVHAgJl9fdCkJCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSwgX190KTsJXAorICAgICAgcmV0dXJuICp0aGlzOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgkJCQkJCQlcCisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCQkJCQkJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCB2YWxhcnJheTxfVHA+ICZfX3YpCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9HTElCQ1hYX0RFQlVHX0FTU0VSVChfTV9zaXplID09IF9fdi5fTV9zaXplKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX01fc2l6ZSwgCQlcCisJCQkgICAgICAgX0FycmF5PF9UcD4oX192Ll9NX2RhdGEpKTsJCVwKKyAgICAgIHJldHVybiAqdGhpczsJCQkJCQkJXAorICAgIH0KKworX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCgrLCBfX3BsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKCosIF9fbXVsdGlwbGllcykKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoLywgX19kaXZpZGVzKQorX0RFRklORV9WQUxBUlJBWV9BVUdNRU5URURfQVNTSUdOTUVOVCglLCBfX21vZHVsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKF4sIF9fYml0d2lzZV94b3IpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoPDwsIF9fc2hpZnRfbGVmdCkKK19ERUZJTkVfVkFMQVJSQVlfQVVHTUVOVEVEX0FTU0lHTk1FTlQoPj4sIF9fc2hpZnRfcmlnaHQpCisKKyN1bmRlZiBfREVGSU5FX1ZBTEFSUkFZX0FVR01FTlRFRF9BU1NJR05NRU5UCisKKyNkZWZpbmUgX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKF9PcCwgX05hbWUpICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPiB0ZW1wbGF0ZTxjbGFzcyBfRG9tPgkJCQlcCisgICAgaW5saW5lIHZhbGFycmF5PF9UcD4mCQkJCQkJXAorICAgIHZhbGFycmF5PF9UcD46Om9wZXJhdG9yIF9PcCMjPShjb25zdCBfRXhwcjxfRG9tLCBfVHA+JiBfX2UpCQlcCisgICAgewkJCQkJCQkJCVwKKyAgICAgIF9BcnJheV9hdWdtZW50ZWRfIyNfTmFtZShfQXJyYXk8X1RwPihfTV9kYXRhKSwgX19lLCBfTV9zaXplKTsJXAorICAgICAgcmV0dXJuICp0aGlzOwkJCQkJCQlcCisgICAgfQorCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoKywgX19wbHVzKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKC0sIF9fbWludXMpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKC8sIF9fZGl2aWRlcykKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCglLCBfX21vZHVsdXMpCitfREVGSU5FX1ZBTEFSUkFZX0VYUFJfQVVHTUVOVEVEX0FTU0lHTk1FTlQoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCgmLCBfX2JpdHdpc2VfYW5kKQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKHwsIF9fYml0d2lzZV9vcikKK19ERUZJTkVfVkFMQVJSQVlfRVhQUl9BVUdNRU5URURfQVNTSUdOTUVOVCg8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UKD4+LCBfX3NoaWZ0X3JpZ2h0KQorCisjdW5kZWYgX0RFRklORV9WQUxBUlJBWV9FWFBSX0FVR01FTlRFRF9BU1NJR05NRU5UCisgICAgCisKKyNkZWZpbmUgX0RFRklORV9CSU5BUllfT1BFUkFUT1IoX09wLCBfTmFtZSkJCQkJXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+CQkJCQkJXAorICAgIGlubGluZSBfRXhwcjxfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfVmFsQXJyYXksIF9UcCwgX1RwPiwgICAgICAgXAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGU+ICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIF9PcChjb25zdCB2YWxhcnJheTxfVHA+JiBfX3YsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdykJXAorICAgIHsJCQkJCQkJCQlcCisgICAgICBfR0xJQkNYWF9ERUJVR19BU1NFUlQoX192LnNpemUoKSA9PSBfX3cuc2l6ZSgpKTsgICAgICAgICAgICAgICAgICBcCisgICAgICB0eXBlZGVmIF9CaW5DbG9zPF9OYW1lLCBfVmFsQXJyYXksIF9WYWxBcnJheSwgX1RwLCBfVHA+IF9DbG9zdXJlOyBcCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIF9fZnVuPF9OYW1lLCBfVHA+OjpyZXN1bHRfdHlwZSBfUnQ7ICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gX0V4cHI8X0Nsb3N1cmUsIF9SdD4oX0Nsb3N1cmUoX192LCBfX3cpKTsgICAgICAgICAgICAgICAgICBcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9WYWxBcnJheSxfQ29uc3RhbnQsIF9UcCwgX1RwPiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIF9UcD46OnJlc3VsdF90eXBlPiAgICAgICAgICAgICAgIFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgdmFsYXJyYXk8X1RwPiYgX192LCBjb25zdCBfVHAmIF9fdCkJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX1ZhbEFycmF5LCBfQ29uc3RhbnQsIF9UcCwgX1RwPiBfQ2xvc3VyZTsJXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1J0OyAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfUnQ+KF9DbG9zdXJlKF9fdiwgX190KSk7CSAgICAgICAgICAgICAgICBcCisgICAgfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgkJCQkJCVwKKyAgICBpbmxpbmUgX0V4cHI8X0JpbkNsb3M8X05hbWUsIF9Db25zdGFudCwgX1ZhbEFycmF5LCBfVHAsIF9UcD4sICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX19mdW48X05hbWUsIF9UcD46OnJlc3VsdF90eXBlPiAgICAgICAgICAgICAgIFwKKyAgICBvcGVyYXRvciBfT3AoY29uc3QgX1RwJiBfX3QsIGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdikJCVwKKyAgICB7CQkJCQkJCQkJXAorICAgICAgdHlwZWRlZiBfQmluQ2xvczxfTmFtZSwgX0NvbnN0YW50LCBfVmFsQXJyYXksIF9UcCwgX1RwPiBfQ2xvc3VyZTsgXAorICAgICAgdHlwZWRlZiB0eXBlbmFtZSBfX2Z1bjxfTmFtZSwgX1RwPjo6cmVzdWx0X3R5cGUgX1J0OyAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIF9FeHByPF9DbG9zdXJlLCBfUnQ+KF9DbG9zdXJlKF9fdCwgX192KSk7ICAgICAgICAJICAgICAgICBcCisgICAgfQorCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigrLCBfX3BsdXMpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigtLCBfX21pbnVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoKiwgX19tdWx0aXBsaWVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoLywgX19kaXZpZGVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoJSwgX19tb2R1bHVzKQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoXiwgX19iaXR3aXNlX3hvcikKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKCYsIF9fYml0d2lzZV9hbmQpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUih8LCBfX2JpdHdpc2Vfb3IpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig8PCwgX19zaGlmdF9sZWZ0KQorX0RFRklORV9CSU5BUllfT1BFUkFUT1IoPj4sIF9fc2hpZnRfcmlnaHQpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUigmJiwgX19sb2dpY2FsX2FuZCkKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKHx8LCBfX2xvZ2ljYWxfb3IpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig9PSwgX19lcXVhbF90bykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKCE9LCBfX25vdF9lcXVhbF90bykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKDwsIF9fbGVzcykKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKD4sIF9fZ3JlYXRlcikKK19ERUZJTkVfQklOQVJZX09QRVJBVE9SKDw9LCBfX2xlc3NfZXF1YWwpCitfREVGSU5FX0JJTkFSWV9PUEVSQVRPUig+PSwgX19ncmVhdGVyX2VxdWFsKQorCisjdW5kZWYgX0RFRklORV9CSU5BUllfT1BFUkFUT1IKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIC8qKgorICAgKiAgQGJyaWVmICBSZXR1cm4gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgICogICAgICAgICAgdGhlIHZhbGFycmF5LgorICAgKiAgQHBhcmFtICB2YSAgdmFsYXJyYXkuCisgICAqLworICB0ZW1wbGF0ZTxjbGFzcyBfVHA+CisgICAgaW5saW5lIF9UcCoKKyAgICBiZWdpbih2YWxhcnJheTxfVHA+JiBfX3ZhKQorICAgIHsgcmV0dXJuIHN0ZDo6X19hZGRyZXNzb2YoX192YVswXSk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb25zdCB2YWxhcnJheS4KKyAgICogIEBwYXJhbSAgdmEgIHZhbGFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAqCisgICAgYmVnaW4oY29uc3QgdmFsYXJyYXk8X1RwPiYgX192YSkKKyAgICB7IHJldHVybiBzdGQ6Ol9fYWRkcmVzc29mKF9fdmFbMF0pOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSB2YWxhcnJheS4KKyAgICogIEBwYXJhbSAgdmEgIHZhbGFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBfVHAqCisgICAgZW5kKHZhbGFycmF5PF9UcD4mIF9fdmEpCisgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3ZhWzBdKSArIF9fdmEuc2l6ZSgpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAqICAgICAgICAgIHRoZSBjb25zdCB2YWxhcnJheS4KKyAgICogIEBwYXJhbSAgdmEgIHZhbGFycmF5LgorICAgKi8KKyAgdGVtcGxhdGU8Y2xhc3MgX1RwPgorICAgIGlubGluZSBjb25zdCBfVHAqCisgICAgZW5kKGNvbnN0IHZhbGFycmF5PF9UcD4mIF9fdmEpCisgICAgeyByZXR1cm4gc3RkOjpfX2FkZHJlc3NvZihfX3ZhWzBdKSArIF9fdmEuc2l6ZSgpOyB9CisjZW5kaWYgLy8gX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKworICAvLyBAfSBncm91cCBudW1lcmljX2FycmF5cworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9WQUxBUlJBWSAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS92ZWN0b3IgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3ZlY3RvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE4MmQ4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS92ZWN0b3IKQEAgLTAsMCArMSw4MiBAQAorLy8gPHZlY3Rvcj4gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NAorICogSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKKyAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIKKyAqIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4gIEhld2xldHQtUGFja2FyZCBDb21wYW55IG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorIGRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqIFNpbGljb24gR3JhcGhpY3MgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgU2lsaWNvbiBHcmFwaGljcyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8qKiBAZmlsZSBpbmNsdWRlL3ZlY3RvcgorICogIFRoaXMgaXMgYSBTdGFuZGFyZCBDKysgTGlicmFyeSBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9WRUNUT1IKKyNkZWZpbmUgX0dMSUJDWFhfVkVDVE9SIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9zdGxfYWxnb2Jhc2UuaD4KKyNpbmNsdWRlIDxiaXRzL2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX2NvbnN0cnVjdC5oPgorI2luY2x1ZGUgPGJpdHMvc3RsX3VuaW5pdGlhbGl6ZWQuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF92ZWN0b3IuaD4KKyNpbmNsdWRlIDxiaXRzL3N0bF9idmVjdG9yLmg+IAorI2luY2x1ZGUgPGJpdHMvcmFuZ2VfYWNjZXNzLmg+CisKKyNpZm5kZWYgX0dMSUJDWFhfRVhQT1JUX1RFTVBMQVRFCisjIGluY2x1ZGUgPGJpdHMvdmVjdG9yLnRjYz4KKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfREVCVUcKKyMgaW5jbHVkZSA8ZGVidWcvdmVjdG9yPgorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9QUk9GSUxFCisjIGluY2x1ZGUgPHByb2ZpbGUvdmVjdG9yPgorI2VuZGlmCisKKyNlbmRpZiAvKiBfR0xJQkNYWF9WRUNUT1IgKi8KKwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9hdG9taWNfd29yZC5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9hdG9taWNfd29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmRiYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2F0b21pY193b3JkLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gTG93LWxldmVsIHR5cGUgZm9yIGF0b21pYyBvcGVyYXRpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYXRvbWljX3dvcmQuaAorICogIFRoaXMgZmlsZSBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFN0YW5kYXJkIEMrKyBMaWJyYXJ5LgorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQVRPTUlDX1dPUkRfSAorI2RlZmluZSBfR0xJQkNYWF9BVE9NSUNfV09SRF9ICTEKKwordHlwZWRlZiBpbnQgX0F0b21pY193b3JkOworCisvLyBEZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5IGJhcnJpZXIgZm9yIHRoZSB0YXJnZXQuCisvLyBUaGUgY29tbWVudGVkIG91dCB2ZXJzaW9ucyBiZWxvdyBhcmUgdGhlIGRlZmF1bHRzLgorLy8gU2VlIGlhNjQvYXRvbWljX3dvcmQuaCBmb3IgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2guCisKKy8vIFRoaXMgb25lIHByZXZlbnRzIGxvYWRzIGZyb20gYmVpbmcgaG9pc3RlZCBhY3Jvc3MgdGhlIGJhcnJpZXI7CisvLyBpbiBvdGhlciB3b3JkcywgdGhpcyBpcyBhIExvYWQtTG9hZCBhY3F1aXJlIGJhcnJpZXIuCisvLyBUaGlzIGlzIG5lY2Vzc2FyeSBpZmYgVEFSR0VUX1JFTEFYRURfT1JERVJJTkcgaXMgZGVmaW5lZCBpbiB0bS5oLiAgCisvLyAjZGVmaW5lIF9HTElCQ1hYX1JFQURfTUVNX0JBUlJJRVIgX19hc20gX192b2xhdGlsZSAoIiI6OjoibWVtb3J5IikKKworLy8gVGhpcyBvbmUgcHJldmVudHMgc3RvcmVzIGZyb20gYmVpbmcgc3VuayBhY3Jvc3MgdGhlIGJhcnJpZXI7IGluIG90aGVyCisvLyB3b3JkcywgYSBTdG9yZS1TdG9yZSByZWxlYXNlIGJhcnJpZXIuCisvLyAjZGVmaW5lIF9HTElCQ1hYX1dSSVRFX01FTV9CQVJSSUVSIF9fYXNtIF9fdm9sYXRpbGUgKCIiOjo6Im1lbW9yeSIpCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYmFzaWNfZmlsZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9iYXNpY19maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0M2E4OQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYmFzaWNfZmlsZS5oCkBAIC0wLDAgKzEsMTExIEBACisvLyBXcmFwcGVyIG9mIEMtbGFuZ3VhZ2UgRklMRSBzdHJ1Y3QgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjcuOCAgRmlsZS1iYXNlZCBzdHJlYW1zCisvLworCisvKiogQGZpbGUgYml0cy9iYXNpY19maWxlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9CQVNJQ19GSUxFX1NURElPX0gKKyNkZWZpbmUgX0dMSUJDWFhfQkFTSUNfRklMRV9TVERJT19IIDEKKworI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxiaXRzL2MrK2lvLmg+ICAvLyBmb3IgX19jX2xvY2sgYW5kIF9fY19maWxlCisjaW5jbHVkZSA8aW9zPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8gR2VuZXJpYyBkZWNsYXJhdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIGNsYXNzIF9fYmFzaWNfZmlsZTsgCisKKyAgLy8gU3BlY2lhbGl6YXRpb24uCisgIHRlbXBsYXRlPD4KKyAgICBjbGFzcyBfX2Jhc2ljX2ZpbGU8Y2hhcj4KKyAgICB7CisgICAgICAvLyBVbmRlcmx5aW5nIGRhdGEgc291cmNlL3NpbmsuCisgICAgICBfX2NfZmlsZSogCV9NX2NmaWxlOworCisgICAgICAvLyBUcnVlIGlmZiB3ZSBvcGVuZWQgX01fY2ZpbGUsIGFuZCB0aHVzIG11c3QgY2xvc2UgaXQgb3Vyc2VsdmVzLgorICAgICAgYm9vbCAJCV9NX2NmaWxlX2NyZWF0ZWQ7CisKKyAgICBwdWJsaWM6CisgICAgICBfX2Jhc2ljX2ZpbGUoX19jX2xvY2sqIF9fbG9jayA9IDApIHRocm93ICgpOworCisgICAgICBfX2Jhc2ljX2ZpbGUqIAorICAgICAgb3Blbihjb25zdCBjaGFyKiBfX25hbWUsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUsIGludCBfX3Byb3QgPSAwNjY0KTsKKworICAgICAgX19iYXNpY19maWxlKgorICAgICAgc3lzX29wZW4oX19jX2ZpbGUqIF9fZmlsZSwgaW9zX2Jhc2U6Om9wZW5tb2RlKTsKKworICAgICAgX19iYXNpY19maWxlKgorICAgICAgc3lzX29wZW4oaW50IF9fZmQsIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUpIHRocm93ICgpOworCisgICAgICBfX2Jhc2ljX2ZpbGUqIAorICAgICAgY2xvc2UoKTsgCisKKyAgICAgIF9HTElCQ1hYX1BVUkUgYm9vbCAKKyAgICAgIGlzX29wZW4oKSBjb25zdCB0aHJvdyAoKTsKKworICAgICAgX0dMSUJDWFhfUFVSRSBpbnQgCisgICAgICBmZCgpIHRocm93ICgpOworCisgICAgICBfR0xJQkNYWF9QVVJFIF9fY19maWxlKgorICAgICAgZmlsZSgpIHRocm93ICgpOworCisgICAgICB+X19iYXNpY19maWxlKCk7CisKKyAgICAgIHN0cmVhbXNpemUgCisgICAgICB4c3B1dG4oY29uc3QgY2hhciogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIHN0cmVhbXNpemUgCisgICAgICB4c3B1dG5fMihjb25zdCBjaGFyKiBfX3MxLCBzdHJlYW1zaXplIF9fbjEsCisJICAgICAgIGNvbnN0IGNoYXIqIF9fczIsIHN0cmVhbXNpemUgX19uMik7CisKKyAgICAgIHN0cmVhbXNpemUgCisgICAgICB4c2dldG4oY2hhciogX19zLCBzdHJlYW1zaXplIF9fbik7CisKKyAgICAgIHN0cmVhbW9mZgorICAgICAgc2Vla29mZihzdHJlYW1vZmYgX19vZmYsIGlvc19iYXNlOjpzZWVrZGlyIF9fd2F5KSB0aHJvdyAoKTsKKworICAgICAgaW50IAorICAgICAgc3luYygpOworCisgICAgICBzdHJlYW1zaXplCisgICAgICBzaG93bWFueWMoKTsKKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgkKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYysrYWxsb2NhdG9yLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2MrK2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGFlZjMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2MrK2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIEJhc2UgdG8gc3RkOjphbGxvY2F0b3IgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2FsbG9jYXRvci5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bWVtb3J5fQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0FMTE9DQVRPUl9ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9BTExPQ0FUT1JfSCAxCisKKy8vIERlZmluZSBuZXdfYWxsb2NhdG9yIGFzIHRoZSBiYXNlIGNsYXNzIHRvIHN0ZDo6YWxsb2NhdG9yLgorI2luY2x1ZGUgPGV4dC9uZXdfYWxsb2NhdG9yLmg+CisjZGVmaW5lIF9fZ2xpYmN4eF9iYXNlX2FsbG9jYXRvciAgX19nbnVfY3h4OjpuZXdfYWxsb2NhdG9yCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jKytjb25maWcuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYysrY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzYTUxZAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYysrY29uZmlnLmgKQEAgLTAsMCArMSwxNTY5IEBACisvLyBQcmVkZWZpbmVkIHN5bWJvbHMgYW5kIG1hY3JvcyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsCisvLyAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2NvbmZpZy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7aW9zZndkfQorICovCisKKyNpZm5kZWYgX0dMSUJDWFhfQ1hYX0NPTkZJR19ICisjZGVmaW5lIF9HTElCQ1hYX0NYWF9DT05GSUdfSCAxCisKKy8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEMrKyBsaWJyYXJ5IGluIGNvbXByZXNzZWQgSVNPIGRhdGUgZm9ybWF0LgorI2RlZmluZSBfX0dMSUJDWFhfXyAyMDEyMDEwNgorCisvLyBNYWNyb3MgZm9yIHZhcmlvdXMgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfUFVSRQorLy8gICBfR0xJQkNYWF9DT05TVAorLy8gICBfR0xJQkNYWF9OT1JFVFVSTgorLy8gICBfR0xJQkNYWF9OT1RIUk9XCisvLyAgIF9HTElCQ1hYX1ZJU0lCSUxJVFkKKyNpZm5kZWYgX0dMSUJDWFhfUFVSRQorIyBkZWZpbmUgX0dMSUJDWFhfUFVSRSBfX2F0dHJpYnV0ZV9fICgoX19wdXJlX18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfQ09OU1QKKyMgZGVmaW5lIF9HTElCQ1hYX0NPTlNUIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfTk9SRVRVUk4KKyMgZGVmaW5lIF9HTElCQ1hYX05PUkVUVVJOIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorI2VuZGlmCisKKyNpZm5kZWYgX0dMSUJDWFhfTk9USFJPVworIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIF9HTElCQ1hYX05PVEhST1cgdGhyb3coKQorIyBlbHNlCisjICBkZWZpbmUgX0dMSUJDWFhfTk9USFJPVyBfX2F0dHJpYnV0ZV9fKChfX25vdGhyb3dfXykpCisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciB2aXNpYmlsaXR5IGF0dHJpYnV0ZXMuCisvLyAgIF9HTElCQ1hYX0hBVkVfQVRUUklCVVRFX1ZJU0lCSUxJVFkKKy8vICAgX0dMSUJDWFhfVklTSUJJTElUWQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVFRSSUJVVEVfVklTSUJJTElUWSAxCisKKyNpZiBfR0xJQkNYWF9IQVZFX0FUVFJJQlVURV9WSVNJQklMSVRZCisjIGRlZmluZSBfR0xJQkNYWF9WSVNJQklMSVRZKFYpIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoI1YpKSkKKyNlbHNlCisvLyBJZiB0aGlzIGlzIG5vdCBzdXBwbGllZCBieSB0aGUgT1Mtc3BlY2lmaWMgb3IgQ1BVLXNwZWNpZmljCisvLyBoZWFkZXJzIGluY2x1ZGVkIGJlbG93LCBpdCB3aWxsIGJlIGRlZmluZWQgdG8gYW4gZW1wdHkgZGVmYXVsdC4KKyMgZGVmaW5lIF9HTElCQ1hYX1ZJU0lCSUxJVFkoVikgX0dMSUJDWFhfUFNFVURPX1ZJU0lCSUxJVFkoVikKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIGRlcHJlY2F0ZWQgYXR0cmlidXRlcy4KKy8vICAgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQKKy8vICAgX0dMSUJDWFhfREVQUkVDQVRFRAorI2lmbmRlZiBfR0xJQkNYWF9VU0VfREVQUkVDQVRFRAorIyBkZWZpbmUgX0dMSUJDWFhfVVNFX0RFUFJFQ0FURUQgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fREVQUkVDQVRFRCkgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyMgZGVmaW5lIF9HTElCQ1hYX0RFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9ERVBSRUNBVEVECisjZW5kaWYKKworI2lmIF9fY3BsdXNwbHVzCisKKy8vIE1hY3JvIGZvciBjb25zdGV4cHIsIHRvIHN1cHBvcnQgaW4gbWl4ZWQgMDMvMHggbW9kZS4KKyNpZm5kZWYgX0dMSUJDWFhfQ09OU1RFWFBSCisjIGlmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjICBkZWZpbmUgX0dMSUJDWFhfQ09OU1RFWFBSIGNvbnN0ZXhwcgorIyAgZGVmaW5lIF9HTElCQ1hYX1VTRV9DT05TVEVYUFIgY29uc3RleHByCisjIGVsc2UKKyMgIGRlZmluZSBfR0xJQkNYWF9DT05TVEVYUFIKKyMgIGRlZmluZSBfR0xJQkNYWF9VU0VfQ09OU1RFWFBSIGNvbnN0CisjIGVuZGlmCisjZW5kaWYKKworLy8gTWFjcm8gZm9yIGV4dGVybiB0ZW1wbGF0ZSwgaWUgY29udHJvbGluZyB0ZW1wbGF0ZSBsaW5rYWdlIHZpYSB1c2UKKy8vIG9mIGV4dGVybiBrZXl3b3JkIG9uIHRlbXBsYXRlIGRlY2xhcmF0aW9uLiBBcyBkb2N1bWVudGVkIGluIHRoZSBnKysKKy8vIG1hbnVhbCwgaXQgaW5oaWJpdHMgYWxsIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIGFuZCBpcyB1c2VkCisvLyB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5IHRvIGF2b2lkIG11bHRpcGxlIHdlYWsgZGVmaW5pdGlvbnMgZm9yCisvLyByZXF1aXJlZCB0eXBlcyB0aGF0IGFyZSBhbHJlYWR5IGV4cGxpY2l0bHkgaW5zdGFudGlhdGVkIGluIHRoZQorLy8gbGlicmFyeSBiaW5hcnkuIFRoaXMgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBiaW5hcnkgc2l6ZSBvZgorLy8gcmVzdWx0aW5nIGV4ZWN1dGFibGVzLgorLy8gU3BlY2lhbCBjYXNlOiBfR0xJQkNYWF9FWFRFUk5fVEVNUExBVEUgPT0gLTEgZGlzYWxsb3dzIGV4dGVybgorLy8gdGVtcGxhdGVzIG9ubHkgaW4gYmFzaWNfc3RyaW5nLCB0aHVzIGFjdGl2YXRpbmcgaXRzIGRlYnVnLW1vZGUKKy8vIGNoZWNrcyBldmVuIGF0IC1PMC4KKyMgZGVmaW5lIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURSAxCisKKy8qCisgIE91dGxpbmUgb2YgbGlic3RkYysrIG5hbWVzcGFjZXMuCisKKyAgbmFtZXNwYWNlIHN0ZAorICB7CisgICAgbmFtZXNwYWNlIF9fZGVidWcgeyB9CisgICAgbmFtZXNwYWNlIF9fcGFyYWxsZWwgeyB9CisgICAgbmFtZXNwYWNlIF9fcHJvZmlsZSB7IH0KKyAgICBuYW1lc3BhY2UgX19jeHgxOTk4IHsgfQorCisgICAgbmFtZXNwYWNlIF9fZGV0YWlsIHsgfQorCisgICAgbmFtZXNwYWNlIHJlbF9vcHMgeyB9CisKKyAgICBuYW1lc3BhY2UgdHIxCisgICAgeworICAgICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7IH0KKyAgICAgIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMgeyB9CisgICAgICBuYW1lc3BhY2UgX19kZXRhaWwgeyB9CisgICAgfQorCisgICAgbmFtZXNwYWNlIGRlY2ltYWwgeyB9CisKKyAgICBuYW1lc3BhY2UgY2hyb25vIHsgfQorICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyB9CisgICAgbmFtZXNwYWNlIHJlZ2V4X2NvbnN0YW50cyB7IH0KKyAgICBuYW1lc3BhY2UgdGhpc190aHJlYWQgeyB9CisgIH0KKworICBuYW1lc3BhY2UgYWJpIHsgfQorCisgIG5hbWVzcGFjZSBfX2dudV9jeHgKKyAgeworICAgIG5hbWVzcGFjZSBfX2RldGFpbCB7IH0KKyAgfQorCisgIEZvciBmdWxsIGRldGFpbHMgc2VlOgorICBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbGF0ZXN0LWRveHlnZW4vbmFtZXNwYWNlcy5odG1sCisqLworbmFtZXNwYWNlIHN0ZAoreworICB0eXBlZGVmIF9fU0laRV9UWVBFX18gCXNpemVfdDsKKyAgdHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fCXB0cmRpZmZfdDsKKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisgIHR5cGVkZWYgZGVjbHR5cGUobnVsbHB0cikJbnVsbHB0cl90OworI2VuZGlmCit9CisKKworLy8gRGVmaW5lZCBpZiBpbmxpbmUgbmFtZXNwYWNlcyBhcmUgdXNlZCBmb3IgdmVyc2lvbmluZy4KKyMgZGVmaW5lIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OIDAgCisKKy8vIElubGluZSBuYW1lc3BhY2UgZm9yIHN5bWJvbCB2ZXJzaW9uaW5nLgorI2lmIF9HTElCQ1hYX0lOTElORV9WRVJTSU9OCisKK25hbWVzcGFjZSBzdGQKK3sKKyAgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisKKyAgbmFtZXNwYWNlIHJlbF9vcHMgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorCisgIG5hbWVzcGFjZSB0cjEKKyAgeworICAgIGlubGluZSBuYW1lc3BhY2UgX183IHsgfQorICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICAgIG5hbWVzcGFjZSByZWdleF9jb25zdGFudHMgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICAgIG5hbWVzcGFjZSBfX2RldGFpbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgIH0KKworICBuYW1lc3BhY2UgZGVjaW1hbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisKKyAgbmFtZXNwYWNlIGNocm9ubyB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9CisgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICBuYW1lc3BhY2UgcmVnZXhfY29uc3RhbnRzIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKyAgbmFtZXNwYWNlIHRoaXNfdGhyZWFkIHsgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9IH0KKworICBuYW1lc3BhY2UgX19kZXRhaWwgeyBpbmxpbmUgbmFtZXNwYWNlIF9fNyB7IH0gfQorICBuYW1lc3BhY2UgX19yZWdleCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9Cit9CisKK25hbWVzcGFjZSBfX2dudV9jeHgKK3sKKyAgaW5saW5lIG5hbWVzcGFjZSBfXzcgeyB9CisgIG5hbWVzcGFjZSBfX2RldGFpbCB7IGlubGluZSBuYW1lc3BhY2UgX183IHsgfSB9Cit9CisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTiBuYW1lc3BhY2UgX183IHsKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTiB9CisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorI2VuZGlmCisKKworLy8gSW5saW5lIG5hbWVzcGFjZXMgZm9yIHNwZWNpYWwgbW9kZXM6IGRlYnVnLCBwYXJhbGxlbCwgcHJvZmlsZS4KKyNpZiBkZWZpbmVkKF9HTElCQ1hYX0RFQlVHKSB8fCBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKSBcCisgICAgfHwgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKQorbmFtZXNwYWNlIHN0ZAoreworICAvLyBOb24taW5saW5lIG5hbWVzcGFjZSBmb3IgY29tcG9uZW50cyByZXBsYWNlZCBieSBhbHRlcm5hdGVzIGluIGFjdGl2ZSBtb2RlLgorICBuYW1lc3BhY2UgX19jeHgxOTk4CisgIHsKKyNpZiBfR0xJQkNYWF9JTkxJTkVfVkVSU0lPTgorIGlubGluZSBuYW1lc3BhY2UgX183IHsgfQorI2VuZGlmCisgIH0KKworICAvLyBJbmxpbmUgbmFtZXNwYWNlIGZvciBkZWJ1ZyBtb2RlLgorIyBpZmRlZiBfR0xJQkNYWF9ERUJVRworICBpbmxpbmUgbmFtZXNwYWNlIF9fZGVidWcgeyB9CisjIGVuZGlmCisKKyAgLy8gSW5saW5lIG5hbWVzcGFjZXMgZm9yIHBhcmFsbGVsIG1vZGUuCisjIGlmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisgIGlubGluZSBuYW1lc3BhY2UgX19wYXJhbGxlbCB7IH0KKyMgZW5kaWYKKworICAvLyBJbmxpbmUgbmFtZXNwYWNlcyBmb3IgcHJvZmlsZSBtb2RlCisjIGlmZGVmIF9HTElCQ1hYX1BST0ZJTEUKKyAgaW5saW5lIG5hbWVzcGFjZSBfX3Byb2ZpbGUgeyB9CisjIGVuZGlmCit9CisKKy8vIENoZWNrIGZvciBpbnZhbGlkIHVzYWdlIGFuZCB1bnN1cHBvcnRlZCBtaXhlZC1tb2RlIHVzZS4KKyMgaWYgZGVmaW5lZChfR0xJQkNYWF9ERUJVRykgJiYgZGVmaW5lZChfR0xJQkNYWF9QQVJBTExFTCkKKyMgIGVycm9yIGlsbGVnYWwgdXNlIG9mIG11bHRpcGxlIGlubGluZWQgbmFtZXNwYWNlcworIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9HTElCQ1hYX1BST0ZJTEUpICYmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpCisjICBlcnJvciBpbGxlZ2FsIHVzZSBvZiBtdWx0aXBsZSBpbmxpbmVkIG5hbWVzcGFjZXMKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChfR0xJQkNYWF9QUk9GSUxFKSAmJiBkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyAgZXJyb3IgaWxsZWdhbCB1c2Ugb2YgbXVsdGlwbGUgaW5saW5lZCBuYW1lc3BhY2VzCisjIGVuZGlmCisKKy8vIENoZWNrIGZvciBpbnZhbGlkIHVzZSBkdWUgdG8gbGFjayBmb3Igd2VhayBzeW1ib2xzLgorIyBpZiBfX05PX0lOTElORV9fICYmICFfX0dYWF9XRUFLX18KKyMgIHdhcm5pbmcgY3VycmVudGx5IHVzaW5nIGlubGluZWQgbmFtZXNwYWNlIG1vZGUgd2hpY2ggbWF5IGZhaWwgXAorICAgd2l0aG91dCBpbmxpbmluZyBkdWUgdG8gbGFjayBvZiB3ZWFrIHN5bWJvbHMKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIG5hbWVzcGFjZSBzY29wZS4gRWl0aGVyIG5hbWVzcGFjZSBzdGQ6OiBvciB0aGUgbmFtZQorLy8gb2Ygc29tZSBuZXN0ZWQgbmFtZXNwYWNlIHdpdGhpbiBpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBhY3RpdmUgbW9kZS4KKy8vIF9HTElCQ1hYX1NURF9BCisvLyBfR0xJQkNYWF9TVERfQworLy8KKy8vIE1hY3JvcyBmb3Igb3BlbmluZy9jbG9zaW5nIGNvbmRpdGlvbmFsIG5hbWVzcGFjZXMuCisvLyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworLy8gX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisvLyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisvLyBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorI2lmIGRlZmluZWQoX0dMSUJDWFhfREVCVUcpIHx8IGRlZmluZWQoX0dMSUJDWFhfUFJPRklMRSkKKyMgZGVmaW5lIF9HTElCQ1hYX1NURF9DIF9fY3h4MTk5OAorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUiBcCisJIG5hbWVzcGFjZSBfR0xJQkNYWF9TVERfQyB7IF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUiBcCisJIH0gX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisjIHVuZGVmIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURQorIyAgZGVmaW5lIF9HTElCQ1hYX0VYVEVSTl9URU1QTEFURSAxIC0xCisjZW5kaWYKKworI2lmZGVmIF9HTElCQ1hYX1BBUkFMTEVMCisjIGRlZmluZSBfR0xJQkNYWF9TVERfQSBfX2N4eDE5OTgKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9BTEdPIFwKKwkgbmFtZXNwYWNlIF9HTElCQ1hYX1NURF9BIHsgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTyBcCisJIH0gX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TVERfQQorIyBkZWZpbmUgX0dMSUJDWFhfU1REX0Egc3RkCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9TVERfQworIyBkZWZpbmUgX0dMSUJDWFhfU1REX0Mgc3RkCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQUxHTworIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0FMR08KKyNlbmRpZgorCisjaWZuZGVmIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfQUxHTworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9BTEdPCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSCisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0NPTlRBSU5FUgorIyBkZWZpbmUgX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9DT05UQUlORVIKKyNlbmRpZgorCisvLyBHTElCQ1hYX0FCSSBEZXByZWNhdGVkCisvLyBEZWZpbmUgaWYgY29tcGF0aWJpbGl0eSBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIC1tbG9uZy1kb3VibGUtNjQuCisjdW5kZWYgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUCisKKy8vIElubGluZSBuYW1lc3BhY2UgZm9yIGxvbmcgZG91YmxlIDEyOCBtb2RlLgorI2lmIGRlZmluZWQgX0dMSUJDWFhfTE9OR19ET1VCTEVfQ09NUEFUICYmIGRlZmluZWQgX19MT05HX0RPVUJMRV8xMjhfXworbmFtZXNwYWNlIHN0ZAoreworICBpbmxpbmUgbmFtZXNwYWNlIF9fZ251X2N4eF9sZGJsMTI4IHsgfQorfQorIyBkZWZpbmUgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwgX19nbnVfY3h4X2xkYmwxMjg6OgorIyBkZWZpbmUgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0xEQkwgbmFtZXNwYWNlIF9fZ251X2N4eF9sZGJsMTI4IHsKKyMgZGVmaW5lIF9HTElCQ1hYX0VORF9OQU1FU1BBQ0VfTERCTCB9CisjZWxzZQorIyBkZWZpbmUgX0dMSUJDWFhfTkFNRVNQQUNFX0xEQkwKKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9MREJMCisjIGRlZmluZSBfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX0xEQkwKKyNlbmRpZgorCisvLyBBc3NlcnQuCisjaWYgIWRlZmluZWQoX0dMSUJDWFhfREVCVUcpICYmICFkZWZpbmVkKF9HTElCQ1hYX1BBUkFMTEVMKQorIyBkZWZpbmUgX19nbGliY3h4X2Fzc2VydChfQ29uZGl0aW9uKQorI2Vsc2UKK25hbWVzcGFjZSBzdGQKK3sKKyAgLy8gQXZvaWQgdGhlIHVzZSBvZiBhc3NlcnQsIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIGtlZXAgdGhlIDxjYXNzZXJ0PgorICAvLyBpbmNsdWRlIG91dCBvZiB0aGUgbWl4LgorICBpbmxpbmUgdm9pZAorICBfX3JlcGxhY2VtZW50X2Fzc2VydChjb25zdCBjaGFyKiBfX2ZpbGUsIGludCBfX2xpbmUsCisJCSAgICAgICBjb25zdCBjaGFyKiBfX2Z1bmN0aW9uLCBjb25zdCBjaGFyKiBfX2NvbmRpdGlvbikKKyAgeworICAgIF9fYnVpbHRpbl9wcmludGYoIiVzOiVkOiAlczogQXNzZXJ0aW9uICclcycgZmFpbGVkLlxuIiwgX19maWxlLCBfX2xpbmUsCisJCSAgICAgX19mdW5jdGlvbiwgX19jb25kaXRpb24pOworICAgIF9fYnVpbHRpbl9hYm9ydCgpOworICB9Cit9CisjZGVmaW5lIF9fZ2xpYmN4eF9hc3NlcnQoX0NvbmRpdGlvbikJCQkJICAgCSBcCisgIGRvIAkJCQkJCQkJCSBcCisgIHsJCQkJCQkJICAgICAgCQkgXAorICAgIGlmICghIChfQ29uZGl0aW9uKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6X19yZXBsYWNlbWVudF9hc3NlcnQoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBcCisJCQkJI19Db25kaXRpb24pOwkJCQkgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisvLyBNYWNyb3MgZm9yIHJhY2UgZGV0ZWN0b3JzLgorLy8gX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQkVGT1JFKEEpIGFuZAorLy8gX0dMSUJDWFhfU1lOQ0hST05JWkFUSU9OX0hBUFBFTlNfQUZURVIoQSkgc2hvdWxkIGJlIHVzZWQgdG8gZXhwbGFpbgorLy8gYXRvbWljIChsb2NrLWZyZWUpIHN5bmNocm9uaXphdGlvbiB0byByYWNlIGRldGVjdG9yczoKKy8vIHRoZSByYWNlIGRldGVjdG9yIHdpbGwgaW5mZXIgYSBoYXBwZW5zLWJlZm9yZSBhcmMgZnJvbSB0aGUgZm9ybWVyIHRvIHRoZQorLy8gbGF0dGVyIHdoZW4gdGhleSBzaGFyZSB0aGUgc2FtZSBhcmd1bWVudCBwb2ludGVyLgorLy8KKy8vIFRoZSBtb3N0IGZyZXF1ZW50IHVzZSBjYXNlIGZvciB0aGVzZSBtYWNyb3MgKGFuZCB0aGUgb25seSBjYXNlIGluIHRoZQorLy8gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGlicmFyeSkgaXMgYXRvbWljIHJlZmVyZW5jZSBjb3VudGluZzoKKy8vICAgdm9pZCBfTV9yZW1vdmVfcmVmZXJlbmNlKCkKKy8vICAgeworLy8gICAgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0JFRk9SRSgmdGhpcy0+X01fcmVmY291bnQpOworLy8gICAgIGlmIChfX2dudV9jeHg6Ol9fZXhjaGFuZ2VfYW5kX2FkZF9kaXNwYXRjaCgmdGhpcy0+X01fcmVmY291bnQsIC0xKSA8PSAwKQorLy8gICAgICAgeworLy8gICAgICAgICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUigmdGhpcy0+X01fcmVmY291bnQpOworLy8gICAgICAgICBfTV9kZXN0cm95KF9fYSk7CisvLyAgICAgICB9CisvLyAgIH0KKy8vIFRoZSBhbm5vdGF0aW9ucyBpbiB0aGlzIGV4YW1wbGUgdGVsbCB0aGUgcmFjZSBkZXRlY3RvciB0aGF0IGFsbCBtZW1vcnkKKy8vIGFjY2Vzc2VzIG9jY3VycmVkIHdoZW4gdGhlIHJlZmNvdW50IHdhcyBwb3NpdGl2ZSBkbyBub3QgcmFjZSB3aXRoCisvLyBtZW1vcnkgYWNjZXNzZXMgd2hpY2ggb2NjdXJyZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGJlY2FtZSB6ZXJvLgorI2lmbmRlZiBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUKKyMgZGVmaW5lICBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19CRUZPUkUoQSkKKyNlbmRpZgorI2lmbmRlZiBfR0xJQkNYWF9TWU5DSFJPTklaQVRJT05fSEFQUEVOU19BRlRFUgorIyBkZWZpbmUgIF9HTElCQ1hYX1NZTkNIUk9OSVpBVElPTl9IQVBQRU5TX0FGVEVSKEEpCisjZW5kaWYKKworLy8gTWFjcm9zIGZvciBDIGxpbmthZ2U6IGRlZmluZSBleHRlcm4gIkMiIGxpbmthZ2Ugb25seSB3aGVuIHVzaW5nIEMrKy4KKyMgZGVmaW5lIF9HTElCQ1hYX0JFR0lOX0VYVEVSTl9DIGV4dGVybiAiQyIgeworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX0VYVEVSTl9DIH0KKworI2Vsc2UgLy8gIV9fY3BsdXNwbHVzCisjIGRlZmluZSBfR0xJQkNYWF9CRUdJTl9FWFRFUk5fQworIyBkZWZpbmUgX0dMSUJDWFhfRU5EX0VYVEVSTl9DCisjZW5kaWYKKworCisvLyBGaXJzdCBpbmNsdWRlcy4KKworLy8gUGljayB1cCBhbnkgT1Mtc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisjaW5jbHVkZSA8Yml0cy9vc19kZWZpbmVzLmg+CisKKy8vIFBpY2sgdXAgYW55IENQVS1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKyNpbmNsdWRlIDxiaXRzL2NwdV9kZWZpbmVzLmg+CisKKy8vIElmIHBsYXRmb3JtIHVzZXMgbmVpdGhlciB2aXNpYmlsaXR5IG5vciBwc3VlZG8tdmlzaWJpbGl0eSwKKy8vIHNwZWNpZnkgZW1wdHkgZGVmYXVsdCBmb3IgbmFtZXNwYWNlIGFubm90YXRpb24gbWFjcm9zLgorI2lmbmRlZiBfR0xJQkNYWF9QU0VVRE9fVklTSUJJTElUWQorIyBkZWZpbmUgX0dMSUJDWFhfUFNFVURPX1ZJU0lCSUxJVFkoVikKKyNlbmRpZgorCisvLyBDZXJ0YWluIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRoYXQgYXJlIG1lYW50IHRvIGJlIG92ZXJyaWRhYmxlIGZyb20KKy8vIHVzZXIgY29kZSBhcmUgZGVjb3JhdGVkIHdpdGggdGhpcyBtYWNyby4gIEZvciBzb21lIHRhcmdldHMsIHRoaXMKKy8vIG1hY3JvIGNhdXNlcyB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSB3ZWFrLgorI2lmbmRlZiBfR0xJQkNYWF9XRUFLX0RFRklOSVRJT04KKyMgZGVmaW5lIF9HTElCQ1hYX1dFQUtfREVGSU5JVElPTgorI2VuZGlmCisKKworLy8gVGhlIHJlbWFpbmRlciBvZiB0aGUgcHJld3JpdHRlbiBjb25maWcgaXMgYXV0b21hdGljOyBhbGwgdGhlCisvLyB1c2VyIGhvb2tzIGFyZSBsaXN0ZWQgYWJvdmUuCisKKy8vIENyZWF0ZSBhIGJvb2xlYW4gZmxhZyB0byBiZSB1c2VkIHRvIGRldGVybWluZSBpZiAtLWZhc3QtbWF0aCBpcyBzZXQuCisjaWZkZWYgX19GQVNUX01BVEhfXworIyBkZWZpbmUgX0dMSUJDWFhfRkFTVF9NQVRIIDEKKyNlbHNlCisjIGRlZmluZSBfR0xJQkNYWF9GQVNUX01BVEggMAorI2VuZGlmCisKKy8vIFRoaXMgbWFya3Mgc3RyaW5nIGxpdGVyYWxzIGluIGhlYWRlciBmaWxlcyB0byBiZSBleHRyYWN0ZWQgZm9yIGV2ZW50dWFsCisvLyB0cmFuc2xhdGlvbi4gIEl0IGlzIHByaW1hcmlseSB1c2VkIGZvciBtZXNzYWdlcyBpbiB0aHJvd24gZXhjZXB0aW9uczsgc2VlCisvLyBzcmMvZnVuY3RleGNlcHQuY2MuICBXZSB1c2UgX19OIGJlY2F1c2UgdGhlIG1vcmUgdHJhZGl0aW9uYWwgX04gaXMgdXNlZAorLy8gZm9yIHNvbWV0aGluZyBlbHNlIHVuZGVyIGNlcnRhaW4gT1NlcyAoc2VlIEJBRE5BTUVTKS4KKyNkZWZpbmUgX19OKG1zZ2lkKSAgICAgKG1zZ2lkKQorCisvLyBGb3IgZXhhbXBsZSwgPHdpbmRvd3MuaD4gaXMga25vd24gdG8gI2RlZmluZSBtaW4gYW5kIG1heCBhcyBtYWNyb3MuLi4KKyN1bmRlZiBtaW4KKyN1bmRlZiBtYXgKKworLy8gRW5kIG9mIHByZXdyaXR0ZW4gY29uZmlnOyB0aGUgc2V0dGluZ3MgZGlzY292ZXJlZCBhdCBjb25maWd1cmUgdGltZSBmb2xsb3cuCisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhY29zZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQUNPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjb3NsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXNpbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhc2lubCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVNJTkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IGFzc2VtYmxlciBzdXBwb3J0cyAuc3ltdmVyIGRpcmVjdGl2ZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU19TWU1WRVJfRElSRUNUSVZFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFuMmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU4yRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbjJsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0YW5mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXRhbmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHRhcmdldCBhc3NlbWJsZXIgc3VwcG9ydHMgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9DQ19UTFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjZWlsZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ0VJTEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNlaWxsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y29tcGxleC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT01QTEVYX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvc2hmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NIRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY29zaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb3NsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIGlmIEVCQURNU0cgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VCQURNU0cgMQorCisvKiBEZWZpbmUgaWYgRUNBTkNFTEVEIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FQ0FOQ0VMRUQgMQorCisvKiBEZWZpbmUgaWYgRUlEUk0gZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VJRFJNIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlbmRpYW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5ESUFOX0ggMQorCisvKiBEZWZpbmUgaWYgRU5PREFUQSBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU5PREFUQSAxCisKKy8qIERlZmluZSBpZiBFTk9MSU5LIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9MSU5LIDEKKworLyogRGVmaW5lIGlmIEVOT1NSIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9TUiAxCisKKy8qIERlZmluZSBpZiBFTk9TVFIgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1NUUiAxCisKKy8qIERlZmluZSBpZiBFTk9UUkVDT1ZFUkFCTEUgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VOT1RSRUNPVkVSQUJMRSAxCisKKy8qIERlZmluZSBpZiBFTk9UU1VQIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FTk9UU1VQIDEKKworLyogRGVmaW5lIGlmIEVPVkVSRkxPVyBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRU9WRVJGTE9XIDEKKworLyogRGVmaW5lIGlmIEVPV05FUkRFQUQgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VPV05FUkRFQUQgMQorCisvKiBEZWZpbmUgaWYgRVBST1RPIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9FUFJPVE8gMQorCisvKiBEZWZpbmUgaWYgRVRJTUUgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUSU1FIDEKKworLyogRGVmaW5lIGlmIEVUWFRCU1kgZXhpc3RzLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VUWFRCU1kgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGV4ZWNpbmZvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VYRUNJTkZPX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGV4cGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGV4cGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZhYnNmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmFic2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZBQlNMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmZW52Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZFTlZfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZpbml0ZWYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZpbml0ZWwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZsb2F0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT0FUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZsb29yZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkxPT1JGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9vcmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09STCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm1vZGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZNT0RGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbW9kbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRk1PREwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZwY2xhc3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZwLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfRlBfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZyZXhwZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfRlJFWFBGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmcmV4cGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0ZSRVhQTCAxCisKKy8qIERlZmluZSBpZiBfVW53aW5kX0dldElQSW5mbyBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfR0VUSVBJTkZPIDEKKworLyogRGVmaW5lIGlmIGd0aHItZGVmYXVsdC5oIGV4aXN0cyAobWVhbmluZyB0aGF0IHRocmVhZGluZyBzdXBwb3J0IGlzCisgICBlbmFibGVkKS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9HVEhSX0RFRkFVTFQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3RmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9IWVBPVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RMIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpY29udigpIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lDT05WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpZWVlZnAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9JRUVFRlBfSCAqLworCisvKiBEZWZpbmUgaWYgaW50NjRfdCBpcyBhdmFpbGFibGUgaW4gPHN0ZGludC5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JTlQ2NF9UIDEKKworLyogRGVmaW5lIGlmIGludDY0X3QgaXMgYSBsb25nLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lOVDY0X1RfTE9ORyAxCisKKy8qIERlZmluZSBpZiBpbnQ2NF90IGlzIGEgbG9uZyBsb25nLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfSU5UNjRfVF9MT05HX0xPTkcgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2luZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGlzaW5mZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfSVNJTkZGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc2luZmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNuYW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpc25hbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX0lTTkFORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaXNuYW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkwgMQorCisvKiBEZWZpbmVkIGlmIGlzd2JsYW5rIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU1dCTEFOSyAxCisKKy8qIERlZmluZSBpZiBMQ19NRVNTQUdFUyBpcyBhdmFpbGFibGUgaW4gPGxvY2FsZS5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MQ19NRVNTQUdFUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGRleHBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxkZXhwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTERFWFBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElCSU5UTF9IICovCisKKy8qIE9ubHkgdXNlZCBpbiBidWlsZCBkaXJlY3RvcnkgdGVzdHN1aXRlX2hvb2tzLmguICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9MSU1JVF9BUyAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfREFUQSAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfRlNJWkUgKi8KKworLyogT25seSB1c2VkIGluIGJ1aWxkIGRpcmVjdG9yeSB0ZXN0c3VpdGVfaG9va3MuaC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX0xJTUlUX1JTUyAqLworCisvKiBPbmx5IHVzZWQgaW4gYnVpbGQgZGlyZWN0b3J5IHRlc3RzdWl0ZV9ob29rcy5oLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTElNSVRfVk1FTSAqLworCisvKiBEZWZpbmUgaWYgZnV0ZXggc3lzY2FsbCBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTElOVVhfRlVURVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxvY2FsZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0NBTEVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbG9nMTBmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZzEwbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HMTBMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2dsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0dMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL2VuZGlhbi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX01BQ0hJTkVfRU5ESUFOX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtYWNoaW5lL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfTUFDSElORV9QQVJBTV9IICovCisKKy8qIERlZmluZSBpZiBtYnN0YXRlX3QgZXhpc3RzIGluIHdjaGFyLmguICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTUJTVEFURV9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1vZGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1vZGZmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbW9kZmwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX01PREZMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuYW4uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9OQU5fSCAqLworCisvKiBEZWZpbmUgaWYgcG9sbCBpcyBhdmFpbGFibGUgaW4gPHBvbGwuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG93ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG93bCcgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcWZwY2xhc3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfUUZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlbnYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU0VURU5WICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luY29zJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1MgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmNvc2YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmNvc2wnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpbmhmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5IRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2luaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzcXJ0ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1FSVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNxcnRsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJUTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkYm9vbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVERCT09MX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NURExJQl9IIDEKKworLyogRGVmaW5lIGlmIHN0cmVycm9yX2wgaXMgYXZhaWxhYmxlIGluIDxzdHJpbmcuaD4uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSRVJST1JfTCAxCisKKy8qIERlZmluZSBpZiBzdHJlcnJvcl9yIGlzIGF2YWlsYWJsZSBpbiA8c3RyaW5nLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NUUkVSUk9SX1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSSU5HU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSSU5HX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvZicgZnVuY3Rpb24uICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSVE9GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b2xkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0xEIDEKKworLyogRGVmaW5lIGlmIHN0cnhmcm1fbCBpcyBhdmFpbGFibGUgaW4gPHN0cmluZy5oPi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJYRlJNX0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IHJ1bnRpbWUgbGlua2VyIHN1cHBvcnRzIGJpbmRpbmcgdGhlIHNhbWUgc3ltYm9sCisgICB0byBkaWZmZXJlbnQgdmVyc2lvbnMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lNVkVSX1NZTUJPTF9SRU5BTUlOR19SVU5USU1FX1NVUFBPUlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxpby5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX1NZU19GSUxJT19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19JT0NUTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvaXBjLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19JUENfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lzYV9kZWZzLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU1lTX0lTQV9ERUZTX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbWFjaGluZS5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX1NZU19NQUNISU5FX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1lTX1BBUkFNX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9yZXNvdXJjZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfUkVTT1VSQ0VfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfU0VNX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Vpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9TWVNfVUlPX0ggMQorCisvKiBEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfU19JRlJFRyAqLworCisvKiBEZWZpbmUgaWYgU19JRlJFRyBpcyBhdmFpbGFibGUgaW4gPHN5cy9zdGF0Lmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1NfSVNSRUcgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRhbmhmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5IRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGFuaGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkhMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0YW5sJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0Z21hdGguaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEdNQVRIX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHRocmVhZC1sb2NhbCBzdG9yYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1RMUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lZCBpZiB2ZndzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVkZXU0NBTkYgMQorCisvKiBEZWZpbmVkIGlmIHZzd3NjYW5mIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9WU1dTQ0FORiAxCisKKy8qIERlZmluZWQgaWYgdndzY2FuZiBleGlzdHMuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfVldTQ0FORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2NoYXIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIF9HTElCQ1hYX0hBVkVfV0NIQVJfSCAxCisKKy8qIERlZmluZWQgaWYgd2NzdG9mIGV4aXN0cy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9XQ1NUT0YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdjdHlwZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFWRV9XQ1RZUEVfSCAxCisKKy8qIERlZmluZSBpZiB3cml0ZXYgaXMgYXZhaWxhYmxlIGluIDxzeXMvdWlvLmg+LiAqLworI2RlZmluZSBfR0xJQkNYWF9IQVZFX1dSSVRFViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Fjb3NmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hY29zbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQUNPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXNpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FTSU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2FzaW5sJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19BU0lOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuMmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU4yRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuMmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU4yTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9hdGFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQVRBTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfYXRhbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0FUQU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2NlaWxmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19DRUlMRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jZWlsbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ0VJTEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9jb3NoZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fQ09TSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfY29zaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NPU0hMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Nvc2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0NPU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZXhwZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9leHBsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19FWFBMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2ZhYnNmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GQUJTRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mYWJzbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkFCU0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmluaXRlJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZmluaXRlZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRklOSVRFRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9maW5pdGVsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GSU5JVEVMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zsb29yZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkxPT1JGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Zsb29ybCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRkxPT1JMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2Ztb2RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19GTU9ERiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mbW9kbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRk1PREwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fRlBDTEFTUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcmV4cGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZSRVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9mcmV4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0ZSRVhQTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9oeXBvdCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSFlQT1QgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaHlwb3RmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaHlwb3RsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19IWVBPVEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfaXNpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTSU5GICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzaW5mZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkZGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzaW5mbCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fSVNJTkZMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2lzbmFuJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19JU05BTiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc25hbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9pc25hbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0lTTkFOTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sZGV4cGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xERVhQRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sZGV4cGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xERVhQTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2cxMGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPRzEwRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2cxMGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPRzEwTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9sb2dmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19MT0dGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2xvZ2wnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX0xPR0wgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbW9kZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9tb2RmZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fTU9ERkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfbW9kZmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX01PREZMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3Bvd2YnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1BPV0YgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfcG93bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUE9XTCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9xZnBjbGFzcycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fUUZQQ0xBU1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luY29zJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luY29zZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU0lOQ09TRiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5jb3NsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5DT1NMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc2luaGYnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1NJTkhGICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NpbmhsJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5ITCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zaW5sJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TSU5MICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3NxcnRmJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9IQVZFX19TUVJURiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zcXJ0bCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fU1FSVEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFuZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFORiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF90YW5oZicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgX0dMSUJDWFhfSEFWRV9fVEFOSEYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfdGFuaGwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1RBTkhMICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX3RhbmwnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0hBVkVfX1RBTkwgKi8KKworLyogRGVmaW5lIGFzIGNvbnN0IGlmIHRoZSBkZWNsYXJhdGlvbiBvZiBpY29udigpIG5lZWRzIGNvbnN0LiAqLworI2RlZmluZSBfR0xJQkNYWF9JQ09OVl9DT05TVCAKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjZGVmaW5lIExUX09CSkRJUiAiLmxpYnMvIgorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9QQUNLQUdFICovCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX0JVR1JFUE9SVCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfTkFNRSAicGFja2FnZS11bnVzZWQiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfUEFDS0FHRV9TVFJJTkcgInBhY2thZ2UtdW51c2VkIHZlcnNpb24tdW51c2VkIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIF9HTElCQ1hYX1BBQ0tBR0VfVEFSTkFNRSAibGlic3RkYysrIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBfR0xJQkNYWF9QQUNLQUdFX19HTElCQ1hYX1ZFUlNJT04gInZlcnNpb24tdW51c2VkIgorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfQ0hBUiAqLworCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9JTlQgKi8KKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0xPTkcgKi8KKworLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9TSE9SVCAqLworCisvKiBUaGUgc2l6ZSBvZiBgdm9pZCAqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEX1AgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9WRVJTSU9OICovCisKKy8qIERlZmluZSBpZiBidWlsdGluIGF0b21pYyBvcGVyYXRpb25zIGZvciBib29sIGFyZSBzdXBwb3J0ZWQgb24gdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9BVE9NSUNfQlVJTFRJTlNfMSAxCisKKy8qIERlZmluZSBpZiBidWlsdGluIGF0b21pYyBvcGVyYXRpb25zIGZvciBzaG9ydCBhcmUgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdC4KKyAgICovCisjZGVmaW5lIF9HTElCQ1hYX0FUT01JQ19CVUlMVElOU18yIDEKKworLyogRGVmaW5lIGlmIGJ1aWx0aW4gYXRvbWljIG9wZXJhdGlvbnMgZm9yIGludCBhcmUgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzQgMQorCisvKiBEZWZpbmUgaWYgYnVpbHRpbiBhdG9taWMgb3BlcmF0aW9ucyBmb3IgbG9uZyBsb25nIGFyZSBzdXBwb3J0ZWQgb24gdGhpcworICAgaG9zdC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfQVRPTUlDX0JVSUxUSU5TXzggMQorCisvKiBEZWZpbmUgdG8gdXNlIGNvbmNlcHQgY2hlY2tpbmcgY29kZSBmcm9tIHRoZSBib29zdCBsaWJyYXJpZXMuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfQ09OQ0VQVF9DSEVDS1MgKi8KKworLyogRGVmaW5lIGlmIGEgZnVsbHkgZHluYW1pYyBiYXNpY19zdHJpbmcgaXMgd2FudGVkLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX0ZVTExZX0RZTkFNSUNfU1RSSU5HICovCisKKy8qIERlZmluZSBpZiBndGhyZWFkcyBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSEFTX0dUSFJFQURTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgYSBmdWxsIGhvc3RlZCBsaWJyYXJ5IGlzIGJ1aWx0LCBvciAwIGlmIGZyZWVzdGFuZGluZy4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfSE9TVEVEIDEKKworLyogRGVmaW5lIGlmIGNvbXBhdGliaWxpdHkgc2hvdWxkIGJlIHByb3ZpZGVkIGZvciAtbWxvbmctZG91YmxlLTY0LiAqLworCisvKiBEZWZpbmUgaWYgcHRyZGlmZl90IGlzIGludC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9QVFJESUZGX1RfSVNfSU5UICovCisKKy8qIERlZmluZSBpZiB1c2luZyBzZXRybGltaXQgdG8gc2V0IHJlc291cmNlIGxpbWl0cyBkdXJpbmcgIm1ha2UgY2hlY2siICovCisvKiAjdW5kZWYgX0dMSUJDWFhfUkVTX0xJTUlUUyAqLworCisvKiBEZWZpbmUgaWYgc2l6ZV90IGlzIHVuc2lnbmVkIGludC4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TSVpFX1RfSVNfVUlOVCAqLworCisvKiBEZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGlzIGNvbmZpZ3VyZWQgZm9yIHNldGptcC9sb25nam1wIGV4Y2VwdGlvbnMuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfU0pMSl9FWENFUFRJT05TICovCisKKy8qIERlZmluZSB0byB0aGUgdmFsdWUgb2YgdGhlIEVPRiBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19FT0YgLTEKKworLyogRGVmaW5lIHRvIHRoZSB2YWx1ZSBvZiB0aGUgU0VFS19DVVIgaW50ZWdlciBjb25zdGFudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfU1RESU9fU0VFS19DVVIgMQorCisvKiBEZWZpbmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBTRUVLX0VORCBpbnRlZ2VyIGNvbnN0YW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9TVERJT19TRUVLX0VORCAyCisKKy8qIERlZmluZSB0byB1c2Ugc3ltYm9sIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworI2RlZmluZSBfR0xJQkNYWF9TWU1WRVIgMQorCisvKiBEZWZpbmUgdG8gdXNlIGRhcndpbiB2ZXJzaW9uaW5nIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gKi8KKy8qICN1bmRlZiBfR0xJQkNYWF9TWU1WRVJfREFSV0lOICovCisKKy8qIERlZmluZSB0byB1c2UgR05VIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworI2RlZmluZSBfR0xJQkNYWF9TWU1WRVJfR05VIDEKKworLyogRGVmaW5lIHRvIHVzZSBHTlUgbmFtZXNwYWNlIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9HTlVfTkFNRVNQQUNFICovCisKKy8qIERlZmluZSB0byB1c2UgU3VuIHZlcnNpb25pbmcgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1NZTVZFUl9TVU4gKi8KKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGZyb20gPHdjaGFyLmg+LCA8bWF0aC5oPiwgPGNvbXBsZXguaD4sCisgICA8c3RkaW8uaD4sIGFuZCA8c3RkbGliLmg+IGNhbiBiZSB1c2VkIG9yIGV4cG9zZWQuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTkgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbiA8Y29tcGxleD4uIFVzaW5nCisgICBjb21waWxlciBidWlsdGlucyBmb3IgdGhlc2UgZnVuY3Rpb25zIHJlcXVpcmVzIGNvcnJlc3BvbmRpbmcgQzk5IGxpYnJhcnkKKyAgIGZ1bmN0aW9ucyB0byBiZSBwcmVzZW50LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0NPTVBMRVggMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8Y29tcGxleC5oPiBzaG91bGQgYmUgdXNlZCBpbiA8dHIxL2NvbXBsZXg+LgorICAgVXNpbmcgY29tcGlsZXIgYnVpbHRpbnMgZm9yIHRoZXNlIGZ1bmN0aW9ucyByZXF1aXJlcyBjb3JyZXNwb25kaW5nIEM5OQorICAgbGlicmFyeSBmdW5jdGlvbnMgdG8gYmUgcHJlc2VudC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9DT01QTEVYX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIGluIDxjdHlwZS5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPHRyMS9jY3R5cGU+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfQ1RZUEVfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgaW4gPGZlbnYuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluIDx0cjEvY2ZlbnY+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfRkVOVl9UUjEgMQorCisvKiBEZWZpbmUgaWYgQzk5IGZ1bmN0aW9ucyBpbiA8aW50dHlwZXMuaD4gc2hvdWxkIGJlIGltcG9ydGVkIGluCisgICA8dHIxL2NpbnR0eXBlcz4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X0lOVFRZUEVTX1RSMSAxCisKKy8qIERlZmluZSBpZiB3Y2hhcl90IEM5OSBmdW5jdGlvbnMgaW4gPGludHR5cGVzLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgorICAgPHRyMS9jaW50dHlwZXM+IGluIG5hbWVzcGFjZSBzdGQ6OnRyMS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9JTlRUWVBFU19XQ0hBUl9UX1RSMSAxCisKKy8qIERlZmluZSBpZiBDOTkgZnVuY3Rpb25zIG9yIG1hY3JvcyBpbiA8bWF0aC5oPiBzaG91bGQgYmUgaW1wb3J0ZWQgaW4gPGNtYXRoPgorICAgaW4gbmFtZXNwYWNlIHN0ZC4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0M5OV9NQVRIIDEKKworLyogRGVmaW5lIGlmIEM5OSBmdW5jdGlvbnMgb3IgbWFjcm9zIGluIDxtYXRoLmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbgorICAgPHRyMS9jbWF0aD4gaW4gbmFtZXNwYWNlIHN0ZDo6dHIxLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfQzk5X01BVEhfVFIxIDEKKworLyogRGVmaW5lIGlmIEM5OSB0eXBlcyBpbiA8c3RkaW50Lmg+IHNob3VsZCBiZSBpbXBvcnRlZCBpbiA8dHIxL2NzdGRpbnQ+IGluCisgICBuYW1lc3BhY2Ugc3RkOjp0cjEuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9DOTlfU1RESU5UX1RSMSAxCisKKy8qIERlZmluZWQgaWYgY2xvY2tfZ2V0dGltZSBoYXMgbW9ub3RvbmljIGNsb2NrIHN1cHBvcnQuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX0NMT0NLX01PTk9UT05JQyAqLworCisvKiBEZWZpbmVkIGlmIGNsb2NrX2dldHRpbWUgaGFzIHJlYWx0aW1lIGNsb2NrIHN1cHBvcnQuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX0NMT0NLX1JFQUxUSU1FICovCisKKy8qIERlZmluZSBpZiBJU08vSUVDIFRSIDI0NzMzIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgdHlwZXMgYXJlIHN1cHBvcnRlZCBvbgorICAgdGhpcyBob3N0LiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfREVDSU1BTF9GTE9BVCAxCisKKy8qIERlZmluZWQgaWYgZ2V0dGltZW9mZGF5IGlzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgX0dMSUJDWFhfVVNFX0dFVFRJTUVPRkRBWSAxCisKKy8qIERlZmluZSBpZiBMRlMgc3VwcG9ydCBpcyBhdmFpbGFibGUuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9MRlMgMQorCisvKiBEZWZpbmUgaWYgY29kZSBzcGVjaWFsaXplZCBmb3IgbG9uZyBsb25nIHNob3VsZCBiZSB1c2VkLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfTE9OR19MT05HIDEKKworLyogRGVmaW5lZCBpZiBuYW5vc2xlZXAgaXMgYXZhaWxhYmxlLiAqLworLyogI3VuZGVmIF9HTElCQ1hYX1VTRV9OQU5PU0xFRVAgKi8KKworLyogRGVmaW5lIGlmIE5MUyB0cmFuc2xhdGlvbnMgYXJlIHRvIGJlIHVzZWQuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX05MUyAqLworCisvKiBEZWZpbmUgaWYgL2Rldi9yYW5kb20gYW5kIC9kZXYvdXJhbmRvbSBhcmUgYXZhaWxhYmxlIGZvciB0aGUgcmFuZG9tX2RldmljZQorICAgb2YgVFIxIChDaGFwdGVyIDUuMSkuICovCisjZGVmaW5lIF9HTElCQ1hYX1VTRV9SQU5ET01fVFIxIDEKKworLyogRGVmaW5lZCBpZiBzY2hlZF95aWVsZCBpcyBhdmFpbGFibGUuICovCisvKiAjdW5kZWYgX0dMSUJDWFhfVVNFX1NDSEVEX1lJRUxEICovCisKKy8qIERlZmluZSBpZiBjb2RlIHNwZWNpYWxpemVkIGZvciB3Y2hhcl90IHNob3VsZCBiZSB1c2VkLiAqLworI2RlZmluZSBfR0xJQkNYWF9VU0VfV0NIQVJfVCAxCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BQ09TRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FDT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BQ09TRiAxCisjIGRlZmluZSBhY29zZiBfYWNvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQUNPU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQUNPU0wgMQorIyBkZWZpbmUgYWNvc2wgX2Fjb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FTSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVNJTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FTSU5GIDEKKyMgZGVmaW5lIGFzaW5mIF9hc2luZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19BU0lOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0FTSU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BU0lOTCAxCisjIGRlZmluZSBhc2lubCBfYXNpbmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTjJGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTjJGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkYgMQorIyBkZWZpbmUgYXRhbjJmIF9hdGFuMmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTjJMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTjJMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9BVEFOMkwgMQorIyBkZWZpbmUgYXRhbjJsIF9hdGFuMmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQVRBTkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9BVEFORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQVRBTkYgMQorIyBkZWZpbmUgYXRhbmYgX2F0YW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0FUQU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQVRBTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0FUQU5MIDEKKyMgZGVmaW5lIGF0YW5sIF9hdGFubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DRUlMRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0NFSUxGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DRUlMRiAxCisjIGRlZmluZSBjZWlsZiBfY2VpbGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ0VJTEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DRUlMTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ0VJTEwgMQorIyBkZWZpbmUgY2VpbGwgX2NlaWxsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9DT1NGIDEKKyMgZGVmaW5lIGNvc2YgX2Nvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fQ09TSEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9DT1NIRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TSEYgMQorIyBkZWZpbmUgY29zaGYgX2Nvc2hmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0NPU0hMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ09TSEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0NPU0hMIDEKKyMgZGVmaW5lIGNvc2hsIF9jb3NobAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19DT1NMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfQ09TTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfQ09TTCAxCisjIGRlZmluZSBjb3NsIF9jb3NsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0VYUEYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9FWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9FWFBGIDEKKyMgZGVmaW5lIGV4cGYgX2V4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRVhQTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0VYUEwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0VYUEwgMQorIyBkZWZpbmUgZXhwbCBfZXhwbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GQUJTRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZBQlNGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GQUJTRiAxCisjIGRlZmluZSBmYWJzZiBfZmFic2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRkFCU0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GQUJTTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRkFCU0wgMQorIyBkZWZpbmUgZmFic2wgX2ZhYnNsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZJTklURSkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURSkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRklOSVRFIDEKKyMgZGVmaW5lIGZpbml0ZSBfZmluaXRlCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZJTklURUYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GSU5JVEVGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GSU5JVEVGIDEKKyMgZGVmaW5lIGZpbml0ZWYgX2Zpbml0ZWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRklOSVRFTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZJTklURUwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZJTklURUwgMQorIyBkZWZpbmUgZmluaXRlbCBfZmluaXRlbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTE9PUkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTE9PUkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09SRiAxCisjIGRlZmluZSBmbG9vcmYgX2Zsb29yZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTE9PUkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTE9PUkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0ZMT09STCAxCisjIGRlZmluZSBmbG9vcmwgX2Zsb29ybAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19GTU9ERikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0ZNT0RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GTU9ERiAxCisjIGRlZmluZSBmbW9kZiBfZm1vZGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRk1PREwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GTU9ETCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfRk1PREwgMQorIyBkZWZpbmUgZm1vZGwgX2Ztb2RsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0ZQQ0xBU1MpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9GUENMQVNTKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUENMQVNTIDEKKyMgZGVmaW5lIGZwY2xhc3MgX2ZwY2xhc3MKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlJFWFBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRlJFWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEYgMQorIyBkZWZpbmUgZnJleHBmIF9mcmV4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fRlJFWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfRlJFWFBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9GUkVYUEwgMQorIyBkZWZpbmUgZnJleHBsIF9mcmV4cGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSFlQT1QpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9IWVBPVCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1QgMQorIyBkZWZpbmUgaHlwb3QgX2h5cG90CisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0hZUE9URikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9URikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RGIDEKKyMgZGVmaW5lIGh5cG90ZiBfaHlwb3RmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0hZUE9UTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0hZUE9UTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfSFlQT1RMIDEKKyMgZGVmaW5lIGh5cG90bCBfaHlwb3RsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX0lTSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNJTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GIDEKKyMgZGVmaW5lIGlzaW5mIF9pc2luZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU0lORkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GRiAxCisjIGRlZmluZSBpc2luZmYgX2lzaW5mZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU0lORkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9JU0lORkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0lTSU5GTCAxCisjIGRlZmluZSBpc2luZmwgX2lzaW5mbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19JU05BTikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0lTTkFOKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTiAxCisjIGRlZmluZSBpc25hbiBfaXNuYW4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNOQU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU5GKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkYgMQorIyBkZWZpbmUgaXNuYW5mIF9pc25hbmYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fSVNOQU5MKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfSVNOQU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9JU05BTkwgMQorIyBkZWZpbmUgaXNuYW5sIF9pc25hbmwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTERFWFBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTERFWFBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEYgMQorIyBkZWZpbmUgbGRleHBmIF9sZGV4cGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTERFWFBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTERFWFBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MREVYUEwgMQorIyBkZWZpbmUgbGRleHBsIF9sZGV4cGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HMTBGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HMTBGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEYgMQorIyBkZWZpbmUgbG9nMTBmIF9sb2cxMGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HMTBMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HMTBMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9MT0cxMEwgMQorIyBkZWZpbmUgbG9nMTBsIF9sb2cxMGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTE9HRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX0xPR0YpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX0xPR0YgMQorIyBkZWZpbmUgbG9nZiBfbG9nZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19MT0dMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTE9HTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTE9HTCAxCisjIGRlZmluZSBsb2dsIF9sb2dsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX01PREYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9NT0RGIDEKKyMgZGVmaW5lIG1vZGYgX21vZGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fTU9ERkYpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9NT0RGRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfTU9ERkYgMQorIyBkZWZpbmUgbW9kZmYgX21vZGZmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX01PREZMKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfTU9ERkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX01PREZMIDEKKyMgZGVmaW5lIG1vZGZsIF9tb2RmbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19QT1dGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfUE9XRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfUE9XRiAxCisjIGRlZmluZSBwb3dmIF9wb3dmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1BPV0wpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9QT1dMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9QT1dMIDEKKyMgZGVmaW5lIHBvd2wgX3Bvd2wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fUUZQQ0xBU1MpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9RRlBDTEFTUykKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfUUZQQ0xBU1MgMQorIyBkZWZpbmUgcWZwY2xhc3MgX3FmcGNsYXNzCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkNPUykgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPUykKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lOQ09TIDEKKyMgZGVmaW5lIHNpbmNvcyBfc2luY29zCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkNPU0YpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TSU5DT1NGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5DT1NGIDEKKyMgZGVmaW5lIHNpbmNvc2YgX3NpbmNvc2YKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOQ09TTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkNPU0wpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkNPU0wgMQorIyBkZWZpbmUgc2luY29zbCBfc2luY29zbAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5GKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lORikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU0lORiAxCisjIGRlZmluZSBzaW5mIF9zaW5mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NJTkhGKSAmJiAhIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfU0lOSEYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkhGIDEKKyMgZGVmaW5lIHNpbmhmIF9zaW5oZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TSU5ITCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkhMKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TSU5ITCAxCisjIGRlZmluZSBzaW5obCBfc2luaGwKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU0lOTCkgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NJTkwpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1NJTkwgMQorIyBkZWZpbmUgc2lubCBfc2lubAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19TUVJURikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NRUlRGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TUVJURiAxCisjIGRlZmluZSBzcXJ0ZiBfc3FydGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fU1FSVEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TUVJUTCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1FSVEwgMQorIyBkZWZpbmUgc3FydGwgX3NxcnRsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NUUlRPRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1NUUlRPRikKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfU1RSVE9GIDEKKyMgZGVmaW5lIHN0cnRvZiBfc3RydG9mCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1NUUlRPTEQpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9TVFJUT0xEKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9TVFJUT0xEIDEKKyMgZGVmaW5lIHN0cnRvbGQgX3N0cnRvbGQKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFORikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkYpCisjIGRlZmluZSBfR0xJQkNYWF9IQVZFX1RBTkYgMQorIyBkZWZpbmUgdGFuZiBfdGFuZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX19UQU5IRikgJiYgISBkZWZpbmVkIChfR0xJQkNYWF9IQVZFX1RBTkhGKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5IRiAxCisjIGRlZmluZSB0YW5oZiBfdGFuaGYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9fVEFOSEwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9UQU5ITCkKKyMgZGVmaW5lIF9HTElCQ1hYX0hBVkVfVEFOSEwgMQorIyBkZWZpbmUgdGFuaGwgX3RhbmhsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9HTElCQ1hYX0hBVkVfX1RBTkwpICYmICEgZGVmaW5lZCAoX0dMSUJDWFhfSEFWRV9UQU5MKQorIyBkZWZpbmUgX0dMSUJDWFhfSEFWRV9UQU5MIDEKKyMgZGVmaW5lIHRhbmwgX3RhbmwKKyNlbmRpZgorCisjZW5kaWYgLy8gX0dMSUJDWFhfQ1hYX0NPTkZJR19ICmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2MrK2lvLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2MrK2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0M2RmNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYysraW8uaApAQCAtMCwwICsxLDUxIEBACisvLyBVbmRlcmx5aW5nIGlvIGxpYnJhcnkgZGV0YWlscyAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2MrK2lvLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3N9CisgKi8KKworLy8gY19pb19zdGRpby5oIC0gRGVmaW5lcyBmb3IgdXNpbmcgIkMiIHN0ZGlvLmgKKworI2lmbmRlZiBfR0xJQkNYWF9DWFhfSU9fSAorI2RlZmluZSBfR0xJQkNYWF9DWFhfSU9fSCAxCisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Yml0cy9ndGhyLmg+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICB0eXBlZGVmIF9fZ3RocmVhZF9tdXRleF90IF9fY19sb2NrOworCisgIC8vIGZvciBiYXNpY19maWxlLmgKKyAgdHlwZWRlZiBGSUxFIF9fY19maWxlOworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jKytsb2NhbGUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYysrbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwZDY3MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvYysrbG9jYWxlLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vIFdyYXBwZXIgZm9yIHVuZGVybHlpbmcgQy1sYW5ndWFnZSBsb2NhbGl6YXRpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jKytsb2NhbGUuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2xvY2FsZX0KKyAqLworCisvLworLy8gSVNPIEMrKyAxNDg4MjogMjIuOCAgU3RhbmRhcmQgbG9jYWxlIGNhdGVnb3JpZXMuCisvLworCisvLyBXcml0dGVuIGJ5IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorCisjaWZuZGVmIF9HTElCQ1hYX0NYWF9MT0NBTEVfSAorI2RlZmluZSBfR0xJQkNYWF9DWFhfTE9DQUxFX0ggMQorCisjcHJhZ21hIEdDQyBzeXN0ZW1faGVhZGVyCisKKyNpbmNsdWRlIDxjbG9jYWxlPgorCisjZGVmaW5lIF9HTElCQ1hYX0NfTE9DQUxFX0dOVSAxCisKKyNkZWZpbmUgX0dMSUJDWFhfTlVNX0NBVEVHT1JJRVMgNgorCisjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMikKK25hbWVzcGFjZSBfX2dudV9jeHggX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBleHRlcm4gIkMiIF9fdHlwZW9mKHVzZWxvY2FsZSkgX191c2Vsb2NhbGU7CisKK19HTElCQ1hYX0VORF9OQU1FU1BBQ0VfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdHlwZWRlZiBfX2xvY2FsZV90CQlfX2NfbG9jYWxlOworCisgIC8vIENvbnZlcnQgbnVtZXJpYyB2YWx1ZSBvZiB0eXBlIGRvdWJsZSBhbmQgbG9uZyBkb3VibGUgdG8gc3RyaW5nIGFuZAorICAvLyByZXR1cm4gbGVuZ3RoIG9mIHN0cmluZy4gIElmIHZzbnByaW50ZiBpcyBhdmFpbGFibGUgdXNlIGl0LCBvdGhlcndpc2UKKyAgLy8gZmFsbCBiYWNrIHRvIHRoZSB1bnNhZmUgdnNwcmludGYgd2hpY2gsIGluIGdlbmVyYWwsIGNhbiBiZSBkYW5nZXJvdXMKKyAgLy8gYW5kIHNob3VsZCBiZSBhdm9pZGVkLgorICBpbmxpbmUgaW50CisgIF9fY29udmVydF9mcm9tX3YoY29uc3QgX19jX2xvY2FsZSYgX19jbG9jIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSksCisJCSAgIGNoYXIqIF9fb3V0LAorCQkgICBjb25zdCBpbnQgX19zaXplIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSksCisJCSAgIGNvbnN0IGNoYXIqIF9fZm10LCAuLi4pCisgIHsKKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorICAgIF9fY19sb2NhbGUgX19vbGQgPSBfX2dudV9jeHg6Ol9fdXNlbG9jYWxlKF9fY2xvYyk7CisjZWxzZQorICAgIGNoYXIqIF9fb2xkID0gc3RkOjpzZXRsb2NhbGUoTENfTlVNRVJJQywgMCk7CisgICAgY2hhciogX19zYXYgPSAwOworICAgIGlmIChfX2J1aWx0aW5fc3RyY21wKF9fb2xkLCAiQyIpKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19vbGQpICsgMTsKKwlfX3NhdiA9IG5ldyBjaGFyW19fbGVuXTsKKwlfX2J1aWx0aW5fbWVtY3B5KF9fc2F2LCBfX29sZCwgX19sZW4pOworCXN0ZDo6c2V0bG9jYWxlKExDX05VTUVSSUMsICJDIik7CisgICAgICB9CisjZW5kaWYKKworICAgIF9fYnVpbHRpbl92YV9saXN0IF9fYXJnczsKKyAgICBfX2J1aWx0aW5fdmFfc3RhcnQoX19hcmdzLCBfX2ZtdCk7CisKKyNpZmRlZiBfR0xJQkNYWF9VU0VfQzk5CisgICAgY29uc3QgaW50IF9fcmV0ID0gX19idWlsdGluX3ZzbnByaW50ZihfX291dCwgX19zaXplLCBfX2ZtdCwgX19hcmdzKTsKKyNlbHNlCisgICAgY29uc3QgaW50IF9fcmV0ID0gX19idWlsdGluX3ZzcHJpbnRmKF9fb3V0LCBfX2ZtdCwgX19hcmdzKTsKKyNlbmRpZgorCisgICAgX19idWlsdGluX3ZhX2VuZChfX2FyZ3MpOworCisjaWYgX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMikKKyAgICBfX2dudV9jeHg6Ol9fdXNlbG9jYWxlKF9fb2xkKTsKKyNlbHNlCisgICAgaWYgKF9fc2F2KQorICAgICAgeworCXN0ZDo6c2V0bG9jYWxlKExDX05VTUVSSUMsIF9fc2F2KTsKKwlkZWxldGUgW10gX19zYXY7CisgICAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gX19yZXQ7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvY3B1X2RlZmluZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvY3B1X2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWI5ODYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jcHVfZGVmaW5lcy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFNwZWNpZmljIGRlZmluaXRpb25zIGZvciBnZW5lcmljIHBsYXRmb3JtcyAgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2NwdV9kZWZpbmVzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtpb3Nmd2R9CisgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9DUFVfREVGSU5FUworI2RlZmluZSBfR0xJQkNYWF9DUFVfREVGSU5FUyAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jdHlwZV9iYXNlLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2N0eXBlX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJiMTRjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jdHlwZV9iYXNlLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9jdHlwZV9iYXNlLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjEgIExvY2FsZXMKKy8vCisKKy8vIEluZm9ybWF0aW9uIGFzIGdsZWFuZWQgZnJvbSAvdXNyL2luY2x1ZGUvY3R5cGUuaAorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgLy8vIEBicmllZiAgQmFzZSBjbGFzcyBmb3IgY3R5cGUuCisgIHN0cnVjdCBjdHlwZV9iYXNlCisgIHsKKyAgICAvLyBOb24tc3RhbmRhcmQgdHlwZWRlZnMuCisgICAgdHlwZWRlZiBjb25zdCBpbnQqIAkJX190b190eXBlOworCisgICAgLy8gTkI6IE9mZnNldHMgaW50byBjdHlwZTxjaGFyPjo6X01fdGFibGUgZm9yY2UgYSBwYXJ0aWN1bGFyIHNpemUKKyAgICAvLyBvbiB0aGUgbWFzayB0eXBlLiBCZWNhdXNlIG9mIHRoaXMsIHdlIGRvbid0IHVzZSBhbiBlbnVtLgorICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgCW1hc2s7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgdXBwZXIgICAgCT0gX0lTdXBwZXI7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgbG93ZXIgCT0gX0lTbG93ZXI7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgYWxwaGEgCT0gX0lTYWxwaGE7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgZGlnaXQgCT0gX0lTZGlnaXQ7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgeGRpZ2l0IAk9IF9JU3hkaWdpdDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBzcGFjZSAJPSBfSVNzcGFjZTsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBwcmludCAJPSBfSVNwcmludDsKKyAgICBzdGF0aWMgY29uc3QgbWFzayBncmFwaCAJPSBfSVNhbHBoYSB8IF9JU2RpZ2l0IHwgX0lTcHVuY3Q7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgY250cmwgCT0gX0lTY250cmw7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgcHVuY3QgCT0gX0lTcHVuY3Q7CisgICAgc3RhdGljIGNvbnN0IG1hc2sgYWxudW0gCT0gX0lTYWxwaGEgfCBfSVNkaWdpdDsKKyAgfTsKKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jdHlwZV9pbmxpbmUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4M2E5ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfaW5saW5lLmgKQEAgLTAsMCArMSw3NiBAQAorLy8gTG9jYWxlIHN1cHBvcnQgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAyLCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N0eXBlX2lubGluZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisvLyBjdHlwZSBiaXRzIHRvIGJlIGlubGluZWQgZ28gaGVyZS4gTm9uLWlubGluYWJsZSAoaWUgdmlydHVhbCBkb18qKQorLy8gZnVuY3Rpb25zIGdvIGluIGN0eXBlLmNjCisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBib29sCisgIGN0eXBlPGNoYXI+OjoKKyAgaXMobWFzayBfX20sIGNoYXIgX19jKSBjb25zdAorICB7IHJldHVybiBfTV90YWJsZVtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXSAmIF9fbTsgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+OjoKKyAgaXMoY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCwgbWFzayogX192ZWMpIGNvbnN0CisgIHsKKyAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2gpCisgICAgICAqX192ZWMrKyA9IF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdysrKV07CisgICAgcmV0dXJuIF9faGlnaDsKKyAgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+OjoKKyAgc2Nhbl9pcyhtYXNrIF9fbSwgY29uc3QgY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKKyAgeworICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaAorCSAgICYmICEoX01fdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKl9fbG93KV0gJiBfX20pKQorICAgICAgKytfX2xvdzsKKyAgICByZXR1cm4gX19sb3c7CisgIH0KKworICBjb25zdCBjaGFyKgorICBjdHlwZTxjaGFyPjo6CisgIHNjYW5fbm90KG1hc2sgX19tLCBjb25zdCBjaGFyKiBfX2xvdywgY29uc3QgY2hhciogX19oaWdoKSBjb25zdAorICB7CisgICAgd2hpbGUgKF9fbG93IDwgX19oaWdoCisJICAgJiYgKF9NX3RhYmxlW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdyldICYgX19tKSAhPSAwKQorICAgICAgKytfX2xvdzsKKyAgICByZXR1cm4gX19sb3c7CisgIH0KKworX0dMSUJDWFhfRU5EX05BTUVTUEFDRV9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jdHlwZV9ub25pbmxpbmUuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfbm9uaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3ODVkNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvY3R5cGVfbm9uaW5saW5lLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vIExvY2FsZSBzdXBwb3J0IC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwKKy8vIDIwMDYsIDIwMDcsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL2N0eXBlX25vbmlubGluZS5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4xICBMb2NhbGVzCisvLworCisvLyBJbmZvcm1hdGlvbiBhcyBnbGVhbmVkIGZyb20gL3Vzci9pbmNsdWRlL2N0eXBlLmgKKworI2lmIF9HTElCQ1hYX0NfTE9DQUxFX0dOVQorICBjb25zdCBjdHlwZV9iYXNlOjptYXNrKgorICBjdHlwZTxjaGFyPjo6Y2xhc3NpY190YWJsZSgpIHRocm93KCkKKyAgeyByZXR1cm4gX1NfZ2V0X2NfbG9jYWxlKCktPl9fY3R5cGVfYjsgfQorI2Vsc2UKKyAgY29uc3QgY3R5cGVfYmFzZTo6bWFzayoKKyAgY3R5cGU8Y2hhcj46OmNsYXNzaWNfdGFibGUoKSB0aHJvdygpCisgIHsKKyAgICBjb25zdCBjdHlwZV9iYXNlOjptYXNrKiBfX3JldDsKKyAgICBjaGFyKiBfX29sZCA9IHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCk7CisgICAgY2hhciogX19zYXYgPSBOVUxMOworICAgIGlmIChfX2J1aWx0aW5fc3RyY21wKF9fb2xkLCAiQyIpKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19vbGQpICsgMTsKKwlfX3NhdiA9IG5ldyBjaGFyW19fbGVuXTsKKwlfX2J1aWx0aW5fbWVtY3B5KF9fc2F2LCBfX29sZCwgX19sZW4pOworCXNldGxvY2FsZShMQ19DVFlQRSwgIkMiKTsKKyAgICAgIH0KKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorICAgIF9fcmV0ID0gKl9fY3R5cGVfYl9sb2MoKTsKKyNlbHNlCisgICAgX19yZXQgPSBfX2N0eXBlX2I7CisjZW5kaWYKKyAgICBpZiAoX19zYXYpCisgICAgICB7CisJc2V0bG9jYWxlKExDX0NUWVBFLCBfX3Nhdik7CisJZGVsZXRlIFtdIF9fc2F2OworICAgICAgfQorICAgIHJldHVybiBfX3JldDsKKyAgfQorI2VuZGlmCisKKyNpZiBfR0xJQkNYWF9DX0xPQ0FMRV9HTlUKKyAgY3R5cGU8Y2hhcj46OmN0eXBlKF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBtYXNrKiBfX3RhYmxlLCBib29sIF9fZGVsLAorCQkgICAgIHNpemVfdCBfX3JlZnMpCisgIDogZmFjZXQoX19yZWZzKSwgX01fY19sb2NhbGVfY3R5cGUoX1NfY2xvbmVfY19sb2NhbGUoX19jbG9jKSksCisgIF9NX2RlbChfX3RhYmxlICE9IDAgJiYgX19kZWwpLAorICBfTV90b3VwcGVyKF9NX2NfbG9jYWxlX2N0eXBlLT5fX2N0eXBlX3RvdXBwZXIpLAorICBfTV90b2xvd2VyKF9NX2NfbG9jYWxlX2N0eXBlLT5fX2N0eXBlX3RvbG93ZXIpLAorICBfTV90YWJsZShfX3RhYmxlID8gX190YWJsZSA6IF9NX2NfbG9jYWxlX2N0eXBlLT5fX2N0eXBlX2IpLAorICBfTV93aWRlbl9vaygwKSwgX01fbmFycm93X29rKDApCisgIHsKKyAgICBfX2J1aWx0aW5fbWVtc2V0KF9NX3dpZGVuLCAwLCBzaXplb2YoX01fd2lkZW4pKTsKKyAgICBfX2J1aWx0aW5fbWVtc2V0KF9NX25hcnJvdywgMCwgc2l6ZW9mKF9NX25hcnJvdykpOworICB9CisjZWxzZQorICBjdHlwZTxjaGFyPjo6Y3R5cGUoX19jX2xvY2FsZSwgY29uc3QgbWFzayogX190YWJsZSwgYm9vbCBfX2RlbCwKKwkJICAgICBzaXplX3QgX19yZWZzKQorICA6IGZhY2V0KF9fcmVmcyksIF9NX2NfbG9jYWxlX2N0eXBlKF9TX2dldF9jX2xvY2FsZSgpKSwKKyAgX01fZGVsKF9fdGFibGUgIT0gMCAmJiBfX2RlbCksIF9NX3dpZGVuX29rKDApLCBfTV9uYXJyb3dfb2soMCkKKyAgeworICAgIGNoYXIqIF9fb2xkID0gc2V0bG9jYWxlKExDX0NUWVBFLCBOVUxMKTsKKyAgICBjaGFyKiBfX3NhdiA9IE5VTEw7CisgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19vbGQsICJDIikpCisgICAgICB7CisJY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX29sZCkgKyAxOworCV9fc2F2ID0gbmV3IGNoYXJbX19sZW5dOworCV9fYnVpbHRpbl9tZW1jcHkoX19zYXYsIF9fb2xkLCBfX2xlbik7CisJc2V0bG9jYWxlKExDX0NUWVBFLCAiQyIpOworICAgICAgfQorI2lmIF9fR0xJQkNfXyA+IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+IDIpCisgICAgX01fdG91cHBlciA9ICpfX2N0eXBlX3RvdXBwZXJfbG9jKCk7CisgICAgX01fdG9sb3dlciA9ICpfX2N0eXBlX3RvbG93ZXJfbG9jKCk7CisgICAgX01fdGFibGUgPSBfX3RhYmxlID8gX190YWJsZSA6ICpfX2N0eXBlX2JfbG9jKCk7CisjZWxzZQorICAgIF9NX3RvdXBwZXIgPSBfX2N0eXBlX3RvdXBwZXI7CisgICAgX01fdG9sb3dlciA9IF9fY3R5cGVfdG9sb3dlcjsKKyAgICBfTV90YWJsZSA9IF9fdGFibGUgPyBfX3RhYmxlIDogX19jdHlwZV9iOworI2VuZGlmCisgICAgaWYgKF9fc2F2KQorICAgICAgeworCXNldGxvY2FsZShMQ19DVFlQRSwgX19zYXYpOworCWRlbGV0ZSBbXSBfX3NhdjsKKyAgICAgIH0KKyAgICBfX2J1aWx0aW5fbWVtc2V0KF9NX3dpZGVuLCAwLCBzaXplb2YoX01fd2lkZW4pKTsKKyAgICBfX2J1aWx0aW5fbWVtc2V0KF9NX25hcnJvdywgMCwgc2l6ZW9mKF9NX25hcnJvdykpOworICB9CisjZW5kaWYKKworI2lmIF9HTElCQ1hYX0NfTE9DQUxFX0dOVQorICBjdHlwZTxjaGFyPjo6Y3R5cGUoY29uc3QgbWFzayogX190YWJsZSwgYm9vbCBfX2RlbCwgc2l6ZV90IF9fcmVmcykKKyAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9jdHlwZShfU19nZXRfY19sb2NhbGUoKSksCisgIF9NX2RlbChfX3RhYmxlICE9IDAgJiYgX19kZWwpLAorICBfTV90b3VwcGVyKF9NX2NfbG9jYWxlX2N0eXBlLT5fX2N0eXBlX3RvdXBwZXIpLAorICBfTV90b2xvd2VyKF9NX2NfbG9jYWxlX2N0eXBlLT5fX2N0eXBlX3RvbG93ZXIpLAorICBfTV90YWJsZShfX3RhYmxlID8gX190YWJsZSA6IF9NX2NfbG9jYWxlX2N0eXBlLT5fX2N0eXBlX2IpLAorICBfTV93aWRlbl9vaygwKSwgX01fbmFycm93X29rKDApCisgIHsKKyAgICBfX2J1aWx0aW5fbWVtc2V0KF9NX3dpZGVuLCAwLCBzaXplb2YoX01fd2lkZW4pKTsKKyAgICBfX2J1aWx0aW5fbWVtc2V0KF9NX25hcnJvdywgMCwgc2l6ZW9mKF9NX25hcnJvdykpOworICB9CisjZWxzZQorICBjdHlwZTxjaGFyPjo6Y3R5cGUoY29uc3QgbWFzayogX190YWJsZSwgYm9vbCBfX2RlbCwgc2l6ZV90IF9fcmVmcykKKyAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9jdHlwZShfU19nZXRfY19sb2NhbGUoKSksCisgIF9NX2RlbChfX3RhYmxlICE9IDAgJiYgX19kZWwpLCBfTV93aWRlbl9vaygwKSwgX01fbmFycm93X29rKDApCisgIHsKKyAgICBjaGFyKiBfX29sZCA9IHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCk7CisgICAgY2hhciogX19zYXYgPSBOVUxMOworICAgIGlmIChfX2J1aWx0aW5fc3RyY21wKF9fb2xkLCAiQyIpKQorICAgICAgeworCWNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19vbGQpICsgMTsKKwlfX3NhdiA9IG5ldyBjaGFyW19fbGVuXTsKKwlfX2J1aWx0aW5fbWVtY3B5KF9fc2F2LCBfX29sZCwgX19sZW4pOworCXNldGxvY2FsZShMQ19DVFlQRSwgIkMiKTsKKyAgICAgIH0KKyNpZiBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPiAyKQorICAgIF9NX3RvdXBwZXIgPSAqX19jdHlwZV90b3VwcGVyX2xvYygpOworICAgIF9NX3RvbG93ZXIgPSAqX19jdHlwZV90b2xvd2VyX2xvYygpOworICAgIF9NX3RhYmxlID0gX190YWJsZSA/IF9fdGFibGUgOiAqX19jdHlwZV9iX2xvYygpOworI2Vsc2UKKyAgICBfTV90b3VwcGVyID0gX19jdHlwZV90b3VwcGVyOworICAgIF9NX3RvbG93ZXIgPSBfX2N0eXBlX3RvbG93ZXI7CisgICAgX01fdGFibGUgPSBfX3RhYmxlID8gX190YWJsZSA6IF9fY3R5cGVfYjsKKyNlbmRpZgorICAgIGlmIChfX3NhdikKKyAgICAgIHsKKwlzZXRsb2NhbGUoTENfQ1RZUEUsIF9fc2F2KTsKKwlkZWxldGUgW10gX19zYXY7CisgICAgICB9CisgICAgX19idWlsdGluX21lbXNldChfTV93aWRlbiwgMCwgc2l6ZW9mKF9NX3dpZGVuKSk7CisgICAgX19idWlsdGluX21lbXNldChfTV9uYXJyb3csIDAsIHNpemVvZihfTV9uYXJyb3cpKTsKKyAgfQorI2VuZGlmCisKKyAgY2hhcgorICBjdHlwZTxjaGFyPjo6ZG9fdG91cHBlcihjaGFyIF9fYykgY29uc3QKKyAgeyByZXR1cm4gX01fdG91cHBlcltzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihfX2MpXTsgfQorCisgIGNvbnN0IGNoYXIqCisgIGN0eXBlPGNoYXI+Ojpkb190b3VwcGVyKGNoYXIqIF9fbG93LCBjb25zdCBjaGFyKiBfX2hpZ2gpIGNvbnN0CisgIHsKKyAgICB3aGlsZSAoX19sb3cgPCBfX2hpZ2gpCisgICAgICB7CisJKl9fbG93ID0gX01fdG91cHBlcltzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPigqX19sb3cpXTsKKwkrK19fbG93OworICAgICAgfQorICAgIHJldHVybiBfX2hpZ2g7CisgIH0KKworICBjaGFyCisgIGN0eXBlPGNoYXI+Ojpkb190b2xvd2VyKGNoYXIgX19jKSBjb25zdAorICB7IHJldHVybiBfTV90b2xvd2VyW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KF9fYyldOyB9CisKKyAgY29uc3QgY2hhcioKKyAgY3R5cGU8Y2hhcj46OmRvX3RvbG93ZXIoY2hhciogX19sb3csIGNvbnN0IGNoYXIqIF9faGlnaCkgY29uc3QKKyAgeworICAgIHdoaWxlIChfX2xvdyA8IF9faGlnaCkKKyAgICAgIHsKKwkqX19sb3cgPSBfTV90b2xvd2VyW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpfX2xvdyldOworCSsrX19sb3c7CisgICAgICB9CisgICAgcmV0dXJuIF9faGlnaDsKKyAgfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jeHhhYmlfdHdlYWtzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2N4eGFiaV90d2Vha3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhmNzNlCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9jeHhhYmlfdHdlYWtzLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29udHJvbCB2YXJpb3VzIHRhcmdldCBzcGVjaWZpYyBBQkkgdHdlYWtzLiAgR2VuZXJpYyB2ZXJzaW9uLgorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYsIDIwMDgsIDIwMDksIDIwMTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIGJpdHMvY3h4YWJpX3R3ZWFrcy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7Y3h4YWJpLmh9CisgKi8KKworI2lmbmRlZiBfQ1hYQUJJX1RXRUFLU19ICisjZGVmaW5lIF9DWFhBQklfVFdFQUtTX0ggMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK25hbWVzcGFjZSBfX2N4eGFiaXYxCit7CisgIGV4dGVybiAiQyIgCisgIHsKKyNlbmRpZgorCisgIC8vIFRoZSBnZW5lcmljIEFCSSB1c2VzIHRoZSBmaXJzdCBieXRlIG9mIGEgNjQtYml0IGd1YXJkIHZhcmlhYmxlLgorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9URVNUKHgpICgqKGNoYXIgKikgKHgpICE9IDApCisjZGVmaW5lIF9HTElCQ1hYX0dVQVJEX1NFVCh4KSAqKGNoYXIgKikgKHgpID0gMQorI2RlZmluZSBfR0xJQkNYWF9HVUFSRF9CSVQgX19ndWFyZF90ZXN0X2JpdCAoMCwgMSkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfUEVORElOR19CSVQgX19ndWFyZF90ZXN0X2JpdCAoMSwgMSkKKyNkZWZpbmUgX0dMSUJDWFhfR1VBUkRfV0FJVElOR19CSVQgX19ndWFyZF90ZXN0X2JpdCAoMiwgMSkKKyAgX19leHRlbnNpb25fXyB0eXBlZGVmIGludCBfX2d1YXJkIF9fYXR0cmlidXRlX18oKG1vZGUgKF9fRElfXykpKTsKKworICAvLyBfX2N4YV92ZWNfY3RvciBoYXMgdm9pZCByZXR1cm4gdHlwZS4KKyAgdHlwZWRlZiB2b2lkIF9fY3hhX3ZlY19jdG9yX3JldHVybl90eXBlOworI2RlZmluZSBfR0xJQkNYWF9DWEFfVkVDX0NUT1JfUkVUVVJOKHgpIHJldHVybgorICAvLyBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGRvIG5vdCByZXR1cm4gYSB2YWx1ZS4KKyAgdHlwZWRlZiB2b2lkIF9fY3hhX2NkdG9yX3JldHVybl90eXBlOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgfQorfSAvLyBuYW1lc3BhY2UgX19jeHhhYml2MQorI2VuZGlmCisKKyNlbmRpZiAKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvZXJyb3JfY29uc3RhbnRzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2Vycm9yX2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZWE1NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2Vycm9yX2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTc4IEBACisvLyBTcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZ2VuZXJpYyBwbGF0Zm9ybXMgIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9lcnJvcl9jb25zdGFudHMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le3N5c3RlbV9lcnJvcn0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX0VSUk9SX0NPTlNUQU5UUworI2RlZmluZSBfR0xJQkNYWF9FUlJPUl9DT05TVEFOVFMgMQorCisjaW5jbHVkZSA8Yml0cy9jKytjb25maWcuaD4KKyNpbmNsdWRlIDxjZXJybm8+CisKK25hbWVzcGFjZSBzdGQgX0dMSUJDWFhfVklTSUJJTElUWShkZWZhdWx0KQoreworX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04KKworICBlbnVtIGNsYXNzIGVycmMKKyAgICB7CisgICAgICBhZGRyZXNzX2ZhbWlseV9ub3Rfc3VwcG9ydGVkID0gCQlFQUZOT1NVUFBPUlQsCisgICAgICBhZGRyZXNzX2luX3VzZSA9IAkJCQlFQUREUklOVVNFLAorICAgICAgYWRkcmVzc19ub3RfYXZhaWxhYmxlID0gCQkJRUFERFJOT1RBVkFJTCwKKyAgICAgIGFscmVhZHlfY29ubmVjdGVkID0gCQkJRUlTQ09OTiwKKyAgICAgIGFyZ3VtZW50X2xpc3RfdG9vX2xvbmcgPSAJCQlFMkJJRywKKyAgICAgIGFyZ3VtZW50X291dF9vZl9kb21haW4gPSAJCQlFRE9NLAorICAgICAgYmFkX2FkZHJlc3MgPSAJCQkJRUZBVUxULAorICAgICAgYmFkX2ZpbGVfZGVzY3JpcHRvciA9IAkJCUVCQURGLAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FQkFETVNHCisgICAgICBiYWRfbWVzc2FnZSA9IAkJCQlFQkFETVNHLAorI2VuZGlmCisKKyAgICAgIGJyb2tlbl9waXBlID0gCQkJCUVQSVBFLAorICAgICAgY29ubmVjdGlvbl9hYm9ydGVkID0gCQkJRUNPTk5BQk9SVEVELAorICAgICAgY29ubmVjdGlvbl9hbHJlYWR5X2luX3Byb2dyZXNzID0gCQlFQUxSRUFEWSwKKyAgICAgIGNvbm5lY3Rpb25fcmVmdXNlZCA9IAkJCUVDT05OUkVGVVNFRCwKKyAgICAgIGNvbm5lY3Rpb25fcmVzZXQgPSAJCQlFQ09OTlJFU0VULAorICAgICAgY3Jvc3NfZGV2aWNlX2xpbmsgPSAJCQlFWERFViwKKyAgICAgIGRlc3RpbmF0aW9uX2FkZHJlc3NfcmVxdWlyZWQgPSAJCUVERVNUQUREUlJFUSwKKyAgICAgIGRldmljZV9vcl9yZXNvdXJjZV9idXN5ID0gCQlFQlVTWSwKKyAgICAgIGRpcmVjdG9yeV9ub3RfZW1wdHkgPSAJCQlFTk9URU1QVFksCisgICAgICBleGVjdXRhYmxlX2Zvcm1hdF9lcnJvciA9IAkJRU5PRVhFQywKKyAgICAgIGZpbGVfZXhpc3RzID0gCSAgICAgICAJCQlFRVhJU1QsCisgICAgICBmaWxlX3Rvb19sYXJnZSA9IAkJCQlFRkJJRywKKyAgICAgIGZpbGVuYW1lX3Rvb19sb25nID0gCQkJRU5BTUVUT09MT05HLAorICAgICAgZnVuY3Rpb25fbm90X3N1cHBvcnRlZCA9IAkJCUVOT1NZUywKKyAgICAgIGhvc3RfdW5yZWFjaGFibGUgPSAJCQlFSE9TVFVOUkVBQ0gsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VJRFJNCisgICAgICBpZGVudGlmaWVyX3JlbW92ZWQgPSAJCQlFSURSTSwKKyNlbmRpZgorCisgICAgICBpbGxlZ2FsX2J5dGVfc2VxdWVuY2UgPSAJCQlFSUxTRVEsCisgICAgICBpbmFwcHJvcHJpYXRlX2lvX2NvbnRyb2xfb3BlcmF0aW9uID0gCUVOT1RUWSwKKyAgICAgIGludGVycnVwdGVkID0gCQkJCUVJTlRSLAorICAgICAgaW52YWxpZF9hcmd1bWVudCA9IAkJCUVJTlZBTCwKKyAgICAgIGludmFsaWRfc2VlayA9IAkJCQlFU1BJUEUsCisgICAgICBpb19lcnJvciA9IAkJCQlFSU8sCisgICAgICBpc19hX2RpcmVjdG9yeSA9IAkJCQlFSVNESVIsCisgICAgICBtZXNzYWdlX3NpemUgPSAJCQkJRU1TR1NJWkUsCisgICAgICBuZXR3b3JrX2Rvd24gPSAJCQkJRU5FVERPV04sCisgICAgICBuZXR3b3JrX3Jlc2V0ID0gCQkJCUVORVRSRVNFVCwKKyAgICAgIG5ldHdvcmtfdW5yZWFjaGFibGUgPSAJCQlFTkVUVU5SRUFDSCwKKyAgICAgIG5vX2J1ZmZlcl9zcGFjZSA9IAkJCUVOT0JVRlMsCisgICAgICBub19jaGlsZF9wcm9jZXNzID0gCQkJRUNISUxELAorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FTk9MSU5LCisgICAgICBub19saW5rID0gCQkJCUVOT0xJTkssCisjZW5kaWYKKworICAgICAgbm9fbG9ja19hdmFpbGFibGUgPSAJCQlFTk9MQ0ssCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT0RBVEEKKyAgICAgIG5vX21lc3NhZ2VfYXZhaWxhYmxlID0gCQkJRU5PREFUQSwgCisjZW5kaWYKKworICAgICAgbm9fbWVzc2FnZSA9IAkJCQlFTk9NU0csIAorICAgICAgbm9fcHJvdG9jb2xfb3B0aW9uID0gCQkJRU5PUFJPVE9PUFQsCisgICAgICBub19zcGFjZV9vbl9kZXZpY2UgPSAJCQlFTk9TUEMsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT1NSCisgICAgICBub19zdHJlYW1fcmVzb3VyY2VzID0gCQkJRU5PU1IsCisjZW5kaWYKKworICAgICAgbm9fc3VjaF9kZXZpY2Vfb3JfYWRkcmVzcyA9IAkJRU5YSU8sCisgICAgICBub19zdWNoX2RldmljZSA9IAkJCQlFTk9ERVYsCisgICAgICBub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5ID0gCQlFTk9FTlQsCisgICAgICBub19zdWNoX3Byb2Nlc3MgPSAJCQlFU1JDSCwKKyAgICAgIG5vdF9hX2RpcmVjdG9yeSA9IAkJCUVOT1RESVIsCisgICAgICBub3RfYV9zb2NrZXQgPSAJCQkJRU5PVFNPQ0ssCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT1NUUgorICAgICAgbm90X2Ffc3RyZWFtID0gCQkJCUVOT1NUUiwKKyNlbmRpZgorCisgICAgICBub3RfY29ubmVjdGVkID0gCQkJCUVOT1RDT05OLAorICAgICAgbm90X2Vub3VnaF9tZW1vcnkgPSAJCQlFTk9NRU0sCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT1RTVVAKKyAgICAgIG5vdF9zdXBwb3J0ZWQgPSAJCQkJRU5PVFNVUCwKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FQ0FOQ0VMRUQKKyAgICAgIG9wZXJhdGlvbl9jYW5jZWxlZCA9IAkJCUVDQU5DRUxFRCwKKyNlbmRpZgorCisgICAgICBvcGVyYXRpb25faW5fcHJvZ3Jlc3MgPSAJCQlFSU5QUk9HUkVTUywKKyAgICAgIG9wZXJhdGlvbl9ub3RfcGVybWl0dGVkID0gCQlFUEVSTSwKKyAgICAgIG9wZXJhdGlvbl9ub3Rfc3VwcG9ydGVkID0gCQlFT1BOT1RTVVBQLAorICAgICAgb3BlcmF0aW9uX3dvdWxkX2Jsb2NrID0gCQkJRVdPVUxEQkxPQ0ssCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VPV05FUkRFQUQKKyAgICAgIG93bmVyX2RlYWQgPSAJCQkJRU9XTkVSREVBRCwKKyNlbmRpZgorCisgICAgICBwZXJtaXNzaW9uX2RlbmllZCA9IAkJCUVBQ0NFUywKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRVBST1RPCisgICAgICBwcm90b2NvbF9lcnJvciA9IAkJCQlFUFJPVE8sCisjZW5kaWYKKworICAgICAgcHJvdG9jb2xfbm90X3N1cHBvcnRlZCA9IAkJCUVQUk9UT05PU1VQUE9SVCwKKyAgICAgIHJlYWRfb25seV9maWxlX3N5c3RlbSA9IAkJCUVST0ZTLAorICAgICAgcmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIgPSAJCUVERUFETEssCisgICAgICByZXNvdXJjZV91bmF2YWlsYWJsZV90cnlfYWdhaW4gPSAJCUVBR0FJTiwKKyAgICAgIHJlc3VsdF9vdXRfb2ZfcmFuZ2UgPSAJCQlFUkFOR0UsCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VOT1RSRUNPVkVSQUJMRQorICAgICAgc3RhdGVfbm90X3JlY292ZXJhYmxlID0gCQkJRU5PVFJFQ09WRVJBQkxFLAorI2VuZGlmCisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0VUSU1FCisgICAgICBzdHJlYW1fdGltZW91dCA9IAkJCQlFVElNRSwKKyNlbmRpZgorCisjaWZkZWYgX0dMSUJDWFhfSEFWRV9FVFhUQlNZCisgICAgICB0ZXh0X2ZpbGVfYnVzeSA9IAkJCQlFVFhUQlNZLAorI2VuZGlmCisKKyAgICAgIHRpbWVkX291dCA9IAkJCQlFVElNRURPVVQsCisgICAgICB0b29fbWFueV9maWxlc19vcGVuX2luX3N5c3RlbSA9IAkJRU5GSUxFLAorICAgICAgdG9vX21hbnlfZmlsZXNfb3BlbiA9IAkJCUVNRklMRSwKKyAgICAgIHRvb19tYW55X2xpbmtzID0gCQkJCUVNTElOSywKKyAgICAgIHRvb19tYW55X3N5bWJvbGljX2xpbmtfbGV2ZWxzID0gCQlFTE9PUCwKKworI2lmZGVmIF9HTElCQ1hYX0hBVkVfRU9WRVJGTE9XCisgICAgICB2YWx1ZV90b29fbGFyZ2UgPSAJCQlFT1ZFUkZMT1csCisjZW5kaWYKKworICAgICAgd3JvbmdfcHJvdG9jb2xfdHlwZSA9IAkJCUVQUk9UT1RZUEUKKyAgICB9OworCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9leHRjKysuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvZXh0YysrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlNTMzOQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvZXh0YysrLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQysrIGluY2x1ZGVzIHVzZWQgZm9yIHByZWNvbXBpbGluZyBleHRlbnNpb25zIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgZXh0YysrLmgKKyAqICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGEgcHJlY29tcGlsZWQgaGVhZGVyLgorICovCisKKyNpZm5kZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyNpbmNsdWRlIDxiaXRzL3N0ZHRyMWMrKy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxleHQvYWxnb3JpdGhtPgorI2luY2x1ZGUgPGV4dC9hcnJheV9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvYXRvbWljaXR5Lmg+CisjaW5jbHVkZSA8ZXh0L2JpdG1hcF9hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvY2FzdC5oPgorI2luY2x1ZGUgPGV4dC9jb25jdXJyZW5jZS5oPgorI2luY2x1ZGUgPGV4dC9kZWJ1Z19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvZXh0cHRyX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPGV4dC9pdGVyYXRvcj4KKyNpbmNsdWRlIDxleHQvbWFsbG9jX2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9tZW1vcnk+CisjaW5jbHVkZSA8ZXh0L210X2FsbG9jYXRvci5oPgorI2luY2x1ZGUgPGV4dC9uZXdfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L251bWVyaWM+CisjaW5jbHVkZSA8ZXh0L3BvZF9jaGFyX3RyYWl0cy5oPgorI2luY2x1ZGUgPGV4dC9wb2ludGVyLmg+CisjaW5jbHVkZSA8ZXh0L3Bvb2xfYWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8ZXh0L3JiX3RyZWU+CisjaW5jbHVkZSA8ZXh0L3JvcGU+CisjaW5jbHVkZSA8ZXh0L3NsaXN0PgorI2luY2x1ZGUgPGV4dC9zdGRpb19maWxlYnVmLmg+CisjaW5jbHVkZSA8ZXh0L3N0ZGlvX3N5bmNfZmlsZWJ1Zi5oPgorI2luY2x1ZGUgPGV4dC90aHJvd19hbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxleHQvdHlwZWxpc3QuaD4KKyNpbmNsdWRlIDxleHQvdHlwZV90cmFpdHMuaD4KKyNpbmNsdWRlIDxleHQvdnN0cmluZy5oPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy9wcmlvcml0eV9xdWV1ZS5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2V4Y2VwdGlvbi5ocHA+CisjaW5jbHVkZSA8ZXh0L3BiX2RzL2hhc2hfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvbGlzdF91cGRhdGVfcG9saWN5LmhwcD4KKyNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgorI2luY2x1ZGUgPGV4dC9wYl9kcy90cmllX3BvbGljeS5ocHA+CisKKyNpZmRlZiBfR0xJQkNYWF9IQVZFX0lDT05WCisgI2luY2x1ZGUgPGV4dC9jb2RlY3Z0X3NwZWNpYWxpemF0aW9ucy5oPgorICNpbmNsdWRlIDxleHQvZW5jX2ZpbGVidWYuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLWRlZmF1bHQuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1kZWZhdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzMGEyYwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvZ3Roci1kZWZhdWx0LmgKQEAgLTAsMCArMSw4NzkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywKKyAgIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9ICisKKy8qIFBPU0lYIHRocmVhZHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgICBFYXN5LCBzaW5jZSB0aGUgaW50ZXJmYWNlIGlzIGp1c3Qgb25lLXRvLW9uZSBtYXBwaW5nLiAgKi8KKworI2RlZmluZSBfX0dUSFJFQURTIDEKKyNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisKKy8qIFNvbWUgaW1wbGVtZW50YXRpb25zIG9mIDxwdGhyZWFkLmg+IHJlcXVpcmUgdGhpcyB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZiAhZGVmaW5lZChfUkVFTlRSQU5UKSAmJiBkZWZpbmVkKF9fb3NmX18pCisjZGVmaW5lIF9SRUVOVFJBTlQgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3R5cGVkZWYgcHRocmVhZF90IF9fZ3RocmVhZF90OwordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fZ3RocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCBfX2d0aHJlYWRfY29uZF90OwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgX19ndGhyZWFkX3RpbWVfdDsKKworLyogUE9TSVggbGlrZSBjb25kaXRpb25hbCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZC4gIFBsZWFzZSBsb29rIGF0IGNvbW1lbnRzCisgICBpbiBndGhyLmggZm9yIGRldGFpbHMuICovCisjZGVmaW5lIF9fR1RIUkVBRF9IQVNfQ09ORAkxCisKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfT05DRV9JTklUIFBUSFJFQURfT05DRV9JTklUCisjaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUikKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCisjZWxpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKKyNlbHNlCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24KKyNlbmRpZgorI2RlZmluZSBfX0dUSFJFQURfQ09ORF9JTklUIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfVElNRV9JTklUIHswLDB9CisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBpZm5kZWYgX19ndGhyd19wcmFnbWEKKyMgIGRlZmluZSBfX2d0aHJ3X3ByYWdtYShwcmFnbWEpCisjIGVuZGlmCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpIFwKKyAgc3RhdGljIF9fdHlwZW9mKHR5cGUpIG5hbWUgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha3JlZl9fKCNuYW1lMikpKTsgXAorICBfX2d0aHJ3X3ByYWdtYSh3ZWFrIHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIFR5cGljYWxseSwgX19ndGhyd19mb28gaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBzeW1ib2wgZm9vLiAgKi8KKyNkZWZpbmUgX19ndGhydyhuYW1lKSBfX2d0aHJ3MihfX2d0aHJ3XyAjIyBuYW1lLG5hbWUsbmFtZSkKKworLyogT24gVHJ1NjQsIC91c3IvaW5jbHVkZS9wdGhyZWFkLmggdXNlcyAjcHJhZ21hIGV4dGVybl9wcmVmaXggIl9fIiB0bworICAgbWFwIGEgc3Vic2V0IG9mIHRoZSBQT1NJWCBwdGhyZWFkIEFQSSB0byBtYW5nbGVkIHZlcnNpb25zIG9mIHRoZWlyCisgICBuYW1lcy4gICovCisjaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9QVEhSRUFEX1VTRV9NQU5HTEVEX05BTUVTXykKKyNkZWZpbmUgX19ndGhydzMobmFtZSkgX19ndGhydzIoX19ndGhyd18gIyMgbmFtZSwgX18gIyMgbmFtZSwgbmFtZSkKK19fZ3RocnczKHB0aHJlYWRfb25jZSkKK19fZ3RocnczKHB0aHJlYWRfZ2V0c3BlY2lmaWMpCitfX2d0aHJ3MyhwdGhyZWFkX3NldHNwZWNpZmljKQorCitfX2d0aHJ3MyhwdGhyZWFkX2NyZWF0ZSkKK19fZ3RocnczKHB0aHJlYWRfam9pbikKK19fZ3RocnczKHB0aHJlYWRfZGV0YWNoKQorX19ndGhydzMocHRocmVhZF9lcXVhbCkKK19fZ3RocnczKHB0aHJlYWRfc2VsZikKK19fZ3RocnczKHB0aHJlYWRfY2FuY2VsKQorX19ndGhydzMoc2NoZWRfeWllbGQpCisKK19fZ3RocnczKHB0aHJlYWRfbXV0ZXhfbG9jaykKK19fZ3RocnczKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKKyNpZmRlZiBfUE9TSVhfVElNRU9VVFMKKyNpZiBfUE9TSVhfVElNRU9VVFMgPj0gMAorX19ndGhydzMocHRocmVhZF9tdXRleF90aW1lZGxvY2spCisjZW5kaWYKKyNlbmRpZiAvKiBfUE9TSVhfVElNRU9VVFMgKi8KK19fZ3RocnczKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKQorX19ndGhydzMocHRocmVhZF9tdXRleF9pbml0KQorX19ndGhydzMocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitfX2d0aHJ3MyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KQorX19ndGhydzMocHRocmVhZF9jb25kX3NpZ25hbCkKK19fZ3RocnczKHB0aHJlYWRfY29uZF93YWl0KQorX19ndGhydzMocHRocmVhZF9jb25kX3RpbWVkd2FpdCkKK19fZ3RocnczKHB0aHJlYWRfY29uZF9kZXN0cm95KQorI2Vsc2UKK19fZ3RocncocHRocmVhZF9vbmNlKQorX19ndGhydyhwdGhyZWFkX2dldHNwZWNpZmljKQorX19ndGhydyhwdGhyZWFkX3NldHNwZWNpZmljKQorCitfX2d0aHJ3KHB0aHJlYWRfY3JlYXRlKQorX19ndGhydyhwdGhyZWFkX2pvaW4pCitfX2d0aHJ3KHB0aHJlYWRfZXF1YWwpCitfX2d0aHJ3KHB0aHJlYWRfc2VsZikKK19fZ3RocncocHRocmVhZF9kZXRhY2gpCisjaWZuZGVmIF9fQklPTklDX18KK19fZ3RocncocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKK19fZ3Rocncoc2NoZWRfeWllbGQpCisKK19fZ3RocncocHRocmVhZF9tdXRleF9sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X3RyeWxvY2spCisjaWZkZWYgX1BPU0lYX1RJTUVPVVRTCisjaWYgX1BPU0lYX1RJTUVPVVRTID49IDAKK19fZ3RocncocHRocmVhZF9tdXRleF90aW1lZGxvY2spCisjZW5kaWYKKyNlbmRpZiAvKiBfUE9TSVhfVElNRU9VVFMgKi8KK19fZ3RocncocHRocmVhZF9tdXRleF91bmxvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9icm9hZGNhc3QpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9zaWduYWwpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF93YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfZGVzdHJveSkKKyNlbmRpZgorCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KQorCisKKyNpZiBkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspCisvKiBPYmplY3RpdmUtQy4gICovCisjaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9QVEhSRUFEX1VTRV9NQU5HTEVEX05BTUVTXykKK19fZ3RocnczKHB0aHJlYWRfY29uZF9pbml0KQorX19ndGhydzMocHRocmVhZF9leGl0KQorI2Vsc2UKK19fZ3RocncocHRocmVhZF9jb25kX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfZXhpdCkKKyNlbmRpZiAvKiBfX29zZl9fICYmIF9QVEhSRUFEX1VTRV9NQU5HTEVEX05BTUVTXyAqLworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9tYXgpCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KK19fZ3RocncocHRocmVhZF9hdHRyX2Rlc3Ryb3kpCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkKK19fZ3RocncocHRocmVhZF9zZXRzY2hlZHBhcmFtKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9MSUJPQkpDIHx8IF9MSUJPQkpDX1dFQUsgKi8KKworI2lmIF9fR1hYX1dFQUtfXyAmJiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisKKy8qIE9uIFNvbGFyaXMgMi42IHVwIHRvIDksIHRoZSBsaWJjIGV4cG9zZXMgYSBQT1NJWCB0aHJlYWRzIGludGVyZmFjZSBldmVuIGlmCisgICAtcHRocmVhZHMgaXMgbm90IHNwZWNpZmllZC4gIFRoZSBmdW5jdGlvbnMgYXJlIGR1bW1pZXMgYW5kIG1vc3QgcmV0dXJuIGFuCisgICBlcnJvciB2YWx1ZS4gIEhvd2V2ZXIgcHRocmVhZF9vbmNlIHJldHVybnMgMCB3aXRob3V0IGludm9raW5nIHRoZSByb3V0aW5lCisgICBpdCBpcyBwYXNzZWQgc28gd2UgY2Fubm90IHByZXRlbmQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGFjdGl2ZSBpZiAtcHRocmVhZHMKKyAgIGlzIG5vdCBzcGVjaWZpZWQuICBPbiBTb2xhcmlzIDIuNS4xLCB0aGUgaW50ZXJmYWNlIGlzIG5vdCBleHBvc2VkIGF0IGFsbCBzbworICAgd2UgbmVlZCB0byBwbGF5IHRoZSB1c3VhbCBnYW1lIHdpdGggd2VhayBzeW1ib2xzLiAgT24gU29sYXJpcyAxMCBhbmQgdXAsIGEKKyAgIHdvcmtpbmcgaW50ZXJmYWNlIGlzIGFsd2F5cyBleHBvc2VkLiAgT24gRnJlZUJTRCA2IGFuZCBsYXRlciwgbGliYyBhbHNvCisgICBleHBvc2VzIGEgZHVtbXkgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UsIHNpbWlsYXIgdG8gd2hhdCBTb2xhcmlzIDIuNiB1cAorICAgdG8gOSBkb2VzLiAgRnJlZUJTRCA+PSA3MDAwMTQgZXZlbiBwcm92aWRlcyBhIHB0aHJlYWRfY2FuY2VsIHN0dWIgaW4gbGliYywKKyAgIHdoaWNoIG1lYW5zIHRoZSBhbHRlcm5hdGUgX19ndGhyZWFkX2FjdGl2ZV9wIGJlbG93IGNhbm5vdCBiZSB1c2VkIHRoZXJlLiAgKi8KKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IChkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fc3ZyNF9fKSkKKworc3RhdGljIHZvbGF0aWxlIGludCBfX2d0aHJlYWRfYWN0aXZlID0gLTE7CisKK3N0YXRpYyB2b2lkCitfX2d0aHJlYWRfdHJpZ2dlciAodm9pZCkKK3sKKyAgX19ndGhyZWFkX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX2FjdGl2ZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBfX2d0aHJlYWRfYWN0aXZlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKworICAvKiBUaGlzIHRlc3QgaXMgbm90IHByb3RlY3RlZCB0byBhdm9pZCB0YWtpbmcgYSBsb2NrIG9uIHRoZSBtYWluIGNvZGUKKyAgICAgcGF0aCBzbyBldmVyeSB1cGRhdGUgb2YgX19ndGhyZWFkX2FjdGl2ZSBpbiBhIHRocmVhZGVkIHByb2dyYW0gbXVzdAorICAgICBiZSBhdG9taWMgd2l0aCByZWdhcmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4gICovCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA8IDAsIDApKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX29uY2UpKQorCXsKKwkgIC8qIElmIHRoaXMgcmVhbGx5IGlzIGEgdGhyZWFkZWQgcHJvZ3JhbSwgdGhlbiB3ZSBtdXN0IGVuc3VyZSB0aGF0CisJICAgICBfX2d0aHJlYWRfYWN0aXZlIGhhcyBiZWVuIHNldCB0byAxIGJlZm9yZSBleGl0aW5nIHRoaXMgYmxvY2suICAqLworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCSAgX19ndGhyd18ocHRocmVhZF9vbmNlKSAoJl9fZ3RocmVhZF9hY3RpdmVfb25jZSwgX19ndGhyZWFkX3RyaWdnZXIpOworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgmX19ndGhyZWFkX2FjdGl2ZV9tdXRleCk7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgd2UnbGwgbmV2ZXIgZW50ZXIgdGhpcyBibG9jayBhZ2Fpbi4gICovCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZSA8IDApCisJX19ndGhyZWFkX2FjdGl2ZSA9IDA7CisKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5laXRoZXIgRnJlZUJTRCBub3IgU29sYXJpcyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgdm9pZCAqY29uc3QgX19ndGhyZWFkX2FjdGl2ZV9wdHIKKyAgICA9IF9fZXh0ZW5zaW9uX18gKHZvaWQgKikgJl9fZ3RocndfKAorLyogQW5kcm9pZCdzIEMgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHB0aHJlYWRfY2FuY2VsLCBjaGVjayBmb3IKKyAgIGBwdGhyZWFkX2NyZWF0ZScgaW5zdGVhZC4gICovCisjaWZuZGVmIF9fQklPTklDX18KKwkJCQkgICAgICAgcHRocmVhZF9jYW5jZWwKKyNlbHNlCisJCQkJICAgICAgIHB0aHJlYWRfY3JlYXRlCisjZW5kaWYKKwkJCQkgICAgICAgKTsKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfcHRyICE9IDA7Cit9CisKKyNlbmRpZiAvKiBGcmVlQlNEIG9yIFNvbGFyaXMgKi8KKworI2Vsc2UgLyogbm90IF9fR1hYX1dFQUtfXyAqLworCisvKiBTaW1pbGFyIHRvIFNvbGFyaXMsIEhQLVVYIDExIGZvciBQQS1SSVNDIHByb3ZpZGVzIHN0dWJzIGZvciBwdGhyZWFkCisgICBjYWxscyBpbiBzaGFyZWQgZmxhdm9ycyBvZiB0aGUgSFAtVVggQyBsaWJyYXJ5LiAgTW9zdCBvZiB0aGUgc3R1YnMKKyAgIGhhdmUgbm8gZnVuY3Rpb25hbGl0eS4gIFRoZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlICJsaWJjIGN1bXVsYXRpdmUKKyAgIHBhdGNoIiBmb3IgZWFjaCBzdWJ2ZXJzaW9uIG9mIEhQLVVYIDExLiAgVGhlcmUgYXJlIHR3byBzcGVjaWFsIGludGVyZmFjZXMKKyAgIHByb3ZpZGVkIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byBhIHNoYXJlZCBwdGhyZWFkCisgICBsaWJyYXJ5IG9yIG5vdC4gIEhvd2V2ZXIsIHRoZXNlIGludGVyZmFjZXMgYXJlbid0IGF2YWlsYWJsZSBpbiBlYXJseQorICAgbGlicHRocmVhZCBsaWJyYXJpZXMuICBXZSBhbHNvIG5lZWQgYSB0ZXN0IHRoYXQgd29ya3MgZm9yIGFyY2hpdmUKKyAgIGxpYnJhcmllcy4gIFdlIGNhbid0IHVzZSBwdGhyZWFkX29uY2UgYXMgc29tZSBsaWJjIHZlcnNpb25zIGNhbGwgdGhlCisgICBpbml0IGZ1bmN0aW9uLiAgV2UgYWxzbyBjYW4ndCB1c2UgcHRocmVhZF9jcmVhdGUgb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgIGFzIHRoZXNlIGNyZWF0ZSBhIHRocmVhZCBhbmQgdGhlcmVieSBwcmV2ZW50IGNoYW5naW5nIHRoZSBkZWZhdWx0IHN0YWNrCisgICBzaXplLiAgVGhlIGZ1bmN0aW9uIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgaXMgYXZhaWxhYmxlIGluIGJvdGgKKyAgIHRoZSBhcmNoaXZlIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgbGlicHRocmVhZC4gICBJdCBjYW4gYmUgdXNlZCB0bworICAgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHB0aHJlYWQgc3RhY2sgc2l6ZS4gIFRoZXJlIGlzIGEgc3R1YiBpbiBzb21lCisgICBzaGFyZWQgbGliYyB2ZXJzaW9ucyB3aGljaCByZXR1cm5zIGEgemVybyBzaXplIGlmIHB0aHJlYWRzIGFyZSBub3QKKyAgIGFjdGl2ZS4gIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCBzdHViIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsaWJjCisgICBkb2Vzbid0IHByb3ZpZGUgb25lLiAgKi8KKworI2lmIGRlZmluZWQoX19ocHBhX18pICYmIGRlZmluZWQoX19ocHV4X18pCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgc2l6ZV90IF9fczsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wICgwLCAmX19zKTsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmUgPSBfX3MgPyAxIDogMDsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5vdCBocHBhLWhwdXggKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBocHBhLWhwdXggKi8KKworI2VuZGlmIC8qIF9fR1hYX1dFQUtfXyAqLworCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhpcyBpcyB0aGUgY29uZmlnLmggZmlsZSBpbiBsaWJvYmpjLyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLyogS2V5IHN0cnVjdHVyZSBmb3IgbWFpbnRhaW5pbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IF9vYmpjX3RocmVhZF9zdG9yYWdlOworc3RhdGljIHB0aHJlYWRfYXR0cl90IF9vYmpjX3RocmVhZF9hdHRyaWJzOworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdG9yYWdlIGtleS4gICovCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoJl9vYmpjX3RocmVhZF9zdG9yYWdlLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIFRoZSBub3JtYWwgZGVmYXVsdCBkZXRhY2ggc3RhdGUgZm9yIHRocmVhZHMgaXMKKwkgICAqIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHdoaWNoIGNhdXNlcyB0aHJlYWRzIHRvIG5vdCBkaWUKKwkgICAqIHdoZW4geW91IHRoaW5rIHRoZXkgc2hvdWxkLiAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfaW5pdCkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMAorCSAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKCZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkJICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9vYmpjX3RocmVhZF9zdG9yYWdlKSA9PSAwCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfZGVzdHJveSkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgIG9iamNfdGhyZWFkX3QgdGhyZWFkX2lkOworICBwdGhyZWFkX3QgbmV3X3RocmVhZF9oYW5kbGU7CisKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEoX19ndGhyd18ocHRocmVhZF9jcmVhdGUpICgmbmV3X3RocmVhZF9oYW5kbGUsICZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkgICh2b2lkICopIGZ1bmMsIGFyZykpKQorICAgIHRocmVhZF9pZCA9IChvYmpjX3RocmVhZF90KSBuZXdfdGhyZWFkX2hhbmRsZTsKKyAgZWxzZQorICAgIHRocmVhZF9pZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRocmVhZF9pZDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkpCit7CisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgICAgcHRocmVhZF90IHRocmVhZF9pZCA9IF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKyAgICAgIGludCBwcmlvcml0eV9taW4sIHByaW9yaXR5X21heDsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwl7CisJICBpZiAoKHByaW9yaXR5X21heCA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9tYXgpIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAoKHByaW9yaXR5X21pbiA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9taW4pIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAocHJpb3JpdHkgPiBwcmlvcml0eV9tYXgpCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWF4OworCSAgZWxzZSBpZiAocHJpb3JpdHkgPCBwcmlvcml0eV9taW4pCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWluOworCSAgcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwkgIC8qCisJICAgKiBUaGUgc29sYXJpcyA3IGFuZCBzZXZlcmFsIG90aGVyIG1hbiBwYWdlcyBpbmNvcnJlY3RseSBzdGF0ZSB0aGF0CisJICAgKiB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gcG9saWN5IGJ1dCBwdGhyZWFkLmggaXMgdW5pdmVyc2FsbHkKKwkgICAqIGF0IG9kZHMgd2l0aCB0aGlzLgorCSAgICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9zZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCBwb2xpY3ksICZwYXJhbXMpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pIChfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXJldHVybiBwYXJhbXMuc2NoZWRfcHJpb3JpdHk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgcmV0dXJuIE9CSkNfVEhSRUFEX0lOVEVSQUNUSVZFX1BSSU9SSVRZOworfQorCisvKiBZaWVsZCBvdXIgcHJvY2VzcyB0aW1lIHRvIGFub3RoZXIgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX29iamNfdGhyZWFkX3lpZWxkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgLyogZXhpdCB0aGUgdGhyZWFkICovCisgICAgX19ndGhyd18ocHRocmVhZF9leGl0KSAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOworCisgIC8qIEZhaWxlZCBpZiB3ZSByZWFjaGVkIGhlcmUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggdW5pcXVlbHkgZGVzY3JpYmVzIGEgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2lkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgZWxzZQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UsIHZhbHVlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9tdXRleF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKwkgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgY291bnQ7CisKKyAgICAgIC8qCisgICAgICAgKiBQb3NpeCBUaHJlYWRzIHNwZWNpZmljYWxseSByZXF1aXJlIHRoYXQgdGhlIHRocmVhZCBiZSB1bmxvY2tlZAorICAgICAgICogZm9yIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgdG8gd29yay4KKyAgICAgICAqLworCisgICAgICBkbworCXsKKwkgIGNvdW50ID0gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKwkgIGlmIChjb3VudCA8IDApCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoY291bnQpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3RyeWxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBCYWNrZW5kIGNvbmRpdGlvbiBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9hbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworCSAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiwgb2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsCisJCQkgICAgICAocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICpfX3RocmVhZGlkLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwKKwkJICB2b2lkICpfX2FyZ3MpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKF9fdGhyZWFkaWQsIE5VTEwsIF9fZnVuYywgX19hcmdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkLCB2b2lkICoqX192YWx1ZV9wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2pvaW4pIChfX3RocmVhZGlkLCBfX3ZhbHVlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9kZXRhY2gpIChfX3RocmVhZGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgX190MSwgX19ndGhyZWFkX3QgX190MikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZXF1YWwpIChfX3QxLCBfX3QyKTsKK30KKworc3RhdGljIGlubGluZSBfX2d0aHJlYWRfdAorX19ndGhyZWFkX3NlbGYgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3lpZWxkICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKl9fb25jZSwgdm9pZCAoKl9fZnVuYykgKHZvaWQpKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpIChfX2tleSwgX19kdG9yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9QT1NJWF9USU1FT1VUUworI2lmIF9QT1NJWF9USU1FT1VUUyA+PSAwCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAorc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOworICAgICAgaW50IF9fcjsKKworICAgICAgX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfaW5pdCkgKCZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkgKCZfX2F0dHIsCisJCQkJCQkgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCAmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpICgmX19hdHRyKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX211dGV4KTsKK30KKworI2lmZGVmIF9QT1NJWF9USU1FT1VUUworI2lmIF9QT1NJWF9USU1FT1VUUyA+PSAwCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3VubG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9icm9hZGNhc3QpIChfX2NvbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfc2lnbmFsIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KSAoX19jb25kLCBfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsCisJCQkgICAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX2NvbmRfd2FpdCAoX19jb25kLCBfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3RpbWVkd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwKKwkJCQkgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4LAorCQkJCSAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2NvbmQsIF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfZGVzdHJveSAoX19ndGhyZWFkX2NvbmRfdCogX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Rlc3Ryb3kpIChfX2NvbmQpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLXBvc2l4LmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2d0aHItcG9zaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODMwYTJjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLXBvc2l4LmgKQEAgLTAsMCArMSw4NzkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywKKyAgIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSAorI2RlZmluZSBfR0xJQkNYWF9HQ0NfR1RIUl9QT1NJWF9ICisKKy8qIFBPU0lYIHRocmVhZHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgICBFYXN5LCBzaW5jZSB0aGUgaW50ZXJmYWNlIGlzIGp1c3Qgb25lLXRvLW9uZSBtYXBwaW5nLiAgKi8KKworI2RlZmluZSBfX0dUSFJFQURTIDEKKyNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisKKy8qIFNvbWUgaW1wbGVtZW50YXRpb25zIG9mIDxwdGhyZWFkLmg+IHJlcXVpcmUgdGhpcyB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZiAhZGVmaW5lZChfUkVFTlRSQU5UKSAmJiBkZWZpbmVkKF9fb3NmX18pCisjZGVmaW5lIF9SRUVOVFJBTlQgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3R5cGVkZWYgcHRocmVhZF90IF9fZ3RocmVhZF90OwordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fZ3RocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX2NvbmRfdCBfX2d0aHJlYWRfY29uZF90OwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgX19ndGhyZWFkX3RpbWVfdDsKKworLyogUE9TSVggbGlrZSBjb25kaXRpb25hbCB2YXJpYWJsZXMgYXJlIHN1cHBvcnRlZC4gIFBsZWFzZSBsb29rIGF0IGNvbW1lbnRzCisgICBpbiBndGhyLmggZm9yIGRldGFpbHMuICovCisjZGVmaW5lIF9fR1RIUkVBRF9IQVNfQ09ORAkxCisKKyNkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfT05DRV9JTklUIFBUSFJFQURfT05DRV9JTklUCisjaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUikKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCisjZWxpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKKyNlbHNlCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVF9GVU5DVElPTiBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24KKyNlbmRpZgorI2RlZmluZSBfX0dUSFJFQURfQ09ORF9JTklUIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUgorI2RlZmluZSBfX0dUSFJFQURfVElNRV9JTklUIHswLDB9CisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBpZm5kZWYgX19ndGhyd19wcmFnbWEKKyMgIGRlZmluZSBfX2d0aHJ3X3ByYWdtYShwcmFnbWEpCisjIGVuZGlmCisjIGRlZmluZSBfX2d0aHJ3MihuYW1lLG5hbWUyLHR5cGUpIFwKKyAgc3RhdGljIF9fdHlwZW9mKHR5cGUpIG5hbWUgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha3JlZl9fKCNuYW1lMikpKTsgXAorICBfX2d0aHJ3X3ByYWdtYSh3ZWFrIHR5cGUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lCisjZWxzZQorIyBkZWZpbmUgX19ndGhydzIobmFtZSxuYW1lMix0eXBlKQorIyBkZWZpbmUgX19ndGhyd18obmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIFR5cGljYWxseSwgX19ndGhyd19mb28gaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBzeW1ib2wgZm9vLiAgKi8KKyNkZWZpbmUgX19ndGhydyhuYW1lKSBfX2d0aHJ3MihfX2d0aHJ3XyAjIyBuYW1lLG5hbWUsbmFtZSkKKworLyogT24gVHJ1NjQsIC91c3IvaW5jbHVkZS9wdGhyZWFkLmggdXNlcyAjcHJhZ21hIGV4dGVybl9wcmVmaXggIl9fIiB0bworICAgbWFwIGEgc3Vic2V0IG9mIHRoZSBQT1NJWCBwdGhyZWFkIEFQSSB0byBtYW5nbGVkIHZlcnNpb25zIG9mIHRoZWlyCisgICBuYW1lcy4gICovCisjaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9QVEhSRUFEX1VTRV9NQU5HTEVEX05BTUVTXykKKyNkZWZpbmUgX19ndGhydzMobmFtZSkgX19ndGhydzIoX19ndGhyd18gIyMgbmFtZSwgX18gIyMgbmFtZSwgbmFtZSkKK19fZ3RocnczKHB0aHJlYWRfb25jZSkKK19fZ3RocnczKHB0aHJlYWRfZ2V0c3BlY2lmaWMpCitfX2d0aHJ3MyhwdGhyZWFkX3NldHNwZWNpZmljKQorCitfX2d0aHJ3MyhwdGhyZWFkX2NyZWF0ZSkKK19fZ3RocnczKHB0aHJlYWRfam9pbikKK19fZ3RocnczKHB0aHJlYWRfZGV0YWNoKQorX19ndGhydzMocHRocmVhZF9lcXVhbCkKK19fZ3RocnczKHB0aHJlYWRfc2VsZikKK19fZ3RocnczKHB0aHJlYWRfY2FuY2VsKQorX19ndGhydzMoc2NoZWRfeWllbGQpCisKK19fZ3RocnczKHB0aHJlYWRfbXV0ZXhfbG9jaykKK19fZ3RocnczKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKKyNpZmRlZiBfUE9TSVhfVElNRU9VVFMKKyNpZiBfUE9TSVhfVElNRU9VVFMgPj0gMAorX19ndGhydzMocHRocmVhZF9tdXRleF90aW1lZGxvY2spCisjZW5kaWYKKyNlbmRpZiAvKiBfUE9TSVhfVElNRU9VVFMgKi8KK19fZ3RocnczKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKQorX19ndGhydzMocHRocmVhZF9tdXRleF9pbml0KQorX19ndGhydzMocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitfX2d0aHJ3MyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KQorX19ndGhydzMocHRocmVhZF9jb25kX3NpZ25hbCkKK19fZ3RocnczKHB0aHJlYWRfY29uZF93YWl0KQorX19ndGhydzMocHRocmVhZF9jb25kX3RpbWVkd2FpdCkKK19fZ3RocnczKHB0aHJlYWRfY29uZF9kZXN0cm95KQorI2Vsc2UKK19fZ3RocncocHRocmVhZF9vbmNlKQorX19ndGhydyhwdGhyZWFkX2dldHNwZWNpZmljKQorX19ndGhydyhwdGhyZWFkX3NldHNwZWNpZmljKQorCitfX2d0aHJ3KHB0aHJlYWRfY3JlYXRlKQorX19ndGhydyhwdGhyZWFkX2pvaW4pCitfX2d0aHJ3KHB0aHJlYWRfZXF1YWwpCitfX2d0aHJ3KHB0aHJlYWRfc2VsZikKK19fZ3RocncocHRocmVhZF9kZXRhY2gpCisjaWZuZGVmIF9fQklPTklDX18KK19fZ3RocncocHRocmVhZF9jYW5jZWwpCisjZW5kaWYKK19fZ3Rocncoc2NoZWRfeWllbGQpCisKK19fZ3RocncocHRocmVhZF9tdXRleF9sb2NrKQorX19ndGhydyhwdGhyZWFkX211dGV4X3RyeWxvY2spCisjaWZkZWYgX1BPU0lYX1RJTUVPVVRTCisjaWYgX1BPU0lYX1RJTUVPVVRTID49IDAKK19fZ3RocncocHRocmVhZF9tdXRleF90aW1lZGxvY2spCisjZW5kaWYKKyNlbmRpZiAvKiBfUE9TSVhfVElNRU9VVFMgKi8KK19fZ3RocncocHRocmVhZF9tdXRleF91bmxvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9icm9hZGNhc3QpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF9zaWduYWwpCitfX2d0aHJ3KHB0aHJlYWRfY29uZF93YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KQorX19ndGhydyhwdGhyZWFkX2NvbmRfZGVzdHJveSkKKyNlbmRpZgorCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKQorX19ndGhydyhwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KQorCisKKyNpZiBkZWZpbmVkKF9MSUJPQkpDKSB8fCBkZWZpbmVkKF9MSUJPQkpDX1dFQUspCisvKiBPYmplY3RpdmUtQy4gICovCisjaWYgZGVmaW5lZChfX29zZl9fKSAmJiBkZWZpbmVkKF9QVEhSRUFEX1VTRV9NQU5HTEVEX05BTUVTXykKK19fZ3RocnczKHB0aHJlYWRfY29uZF9pbml0KQorX19ndGhydzMocHRocmVhZF9leGl0KQorI2Vsc2UKK19fZ3RocncocHRocmVhZF9jb25kX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfZXhpdCkKKyNlbmRpZiAvKiBfX29zZl9fICYmIF9QVEhSRUFEX1VTRV9NQU5HTEVEX05BTUVTXyAqLworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9tYXgpCitfX2d0aHJ3KHNjaGVkX2dldF9wcmlvcml0eV9taW4pCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisjZW5kaWYgLyogX1BPU0lYX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KK19fZ3RocncocHRocmVhZF9hdHRyX2Rlc3Ryb3kpCitfX2d0aHJ3KHB0aHJlYWRfYXR0cl9pbml0KQorX19ndGhydyhwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUpCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCitfX2d0aHJ3KHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkKK19fZ3RocncocHRocmVhZF9zZXRzY2hlZHBhcmFtKQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9MSUJPQkpDIHx8IF9MSUJPQkpDX1dFQUsgKi8KKworI2lmIF9fR1hYX1dFQUtfXyAmJiBfR0xJQkNYWF9HVEhSRUFEX1VTRV9XRUFLCisKKy8qIE9uIFNvbGFyaXMgMi42IHVwIHRvIDksIHRoZSBsaWJjIGV4cG9zZXMgYSBQT1NJWCB0aHJlYWRzIGludGVyZmFjZSBldmVuIGlmCisgICAtcHRocmVhZHMgaXMgbm90IHNwZWNpZmllZC4gIFRoZSBmdW5jdGlvbnMgYXJlIGR1bW1pZXMgYW5kIG1vc3QgcmV0dXJuIGFuCisgICBlcnJvciB2YWx1ZS4gIEhvd2V2ZXIgcHRocmVhZF9vbmNlIHJldHVybnMgMCB3aXRob3V0IGludm9raW5nIHRoZSByb3V0aW5lCisgICBpdCBpcyBwYXNzZWQgc28gd2UgY2Fubm90IHByZXRlbmQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGFjdGl2ZSBpZiAtcHRocmVhZHMKKyAgIGlzIG5vdCBzcGVjaWZpZWQuICBPbiBTb2xhcmlzIDIuNS4xLCB0aGUgaW50ZXJmYWNlIGlzIG5vdCBleHBvc2VkIGF0IGFsbCBzbworICAgd2UgbmVlZCB0byBwbGF5IHRoZSB1c3VhbCBnYW1lIHdpdGggd2VhayBzeW1ib2xzLiAgT24gU29sYXJpcyAxMCBhbmQgdXAsIGEKKyAgIHdvcmtpbmcgaW50ZXJmYWNlIGlzIGFsd2F5cyBleHBvc2VkLiAgT24gRnJlZUJTRCA2IGFuZCBsYXRlciwgbGliYyBhbHNvCisgICBleHBvc2VzIGEgZHVtbXkgUE9TSVggdGhyZWFkcyBpbnRlcmZhY2UsIHNpbWlsYXIgdG8gd2hhdCBTb2xhcmlzIDIuNiB1cAorICAgdG8gOSBkb2VzLiAgRnJlZUJTRCA+PSA3MDAwMTQgZXZlbiBwcm92aWRlcyBhIHB0aHJlYWRfY2FuY2VsIHN0dWIgaW4gbGliYywKKyAgIHdoaWNoIG1lYW5zIHRoZSBhbHRlcm5hdGUgX19ndGhyZWFkX2FjdGl2ZV9wIGJlbG93IGNhbm5vdCBiZSB1c2VkIHRoZXJlLiAgKi8KKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IChkZWZpbmVkKF9fc3VuKSAmJiBkZWZpbmVkKF9fc3ZyNF9fKSkKKworc3RhdGljIHZvbGF0aWxlIGludCBfX2d0aHJlYWRfYWN0aXZlID0gLTE7CisKK3N0YXRpYyB2b2lkCitfX2d0aHJlYWRfdHJpZ2dlciAodm9pZCkKK3sKKyAgX19ndGhyZWFkX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfYWN0aXZlX3AgKHZvaWQpCit7CisgIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX2FjdGl2ZV9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBfX2d0aHJlYWRfYWN0aXZlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKworICAvKiBUaGlzIHRlc3QgaXMgbm90IHByb3RlY3RlZCB0byBhdm9pZCB0YWtpbmcgYSBsb2NrIG9uIHRoZSBtYWluIGNvZGUKKyAgICAgcGF0aCBzbyBldmVyeSB1cGRhdGUgb2YgX19ndGhyZWFkX2FjdGl2ZSBpbiBhIHRocmVhZGVkIHByb2dyYW0gbXVzdAorICAgICBiZSBhdG9taWMgd2l0aCByZWdhcmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgdGVzdC4gICovCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChfX2d0aHJlYWRfYWN0aXZlX2xhdGVzdF92YWx1ZSA8IDAsIDApKQorICAgIHsKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX29uY2UpKQorCXsKKwkgIC8qIElmIHRoaXMgcmVhbGx5IGlzIGEgdGhyZWFkZWQgcHJvZ3JhbSwgdGhlbiB3ZSBtdXN0IGVuc3VyZSB0aGF0CisJICAgICBfX2d0aHJlYWRfYWN0aXZlIGhhcyBiZWVuIHNldCB0byAxIGJlZm9yZSBleGl0aW5nIHRoaXMgYmxvY2suICAqLworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoJl9fZ3RocmVhZF9hY3RpdmVfbXV0ZXgpOworCSAgX19ndGhyd18ocHRocmVhZF9vbmNlKSAoJl9fZ3RocmVhZF9hY3RpdmVfb25jZSwgX19ndGhyZWFkX3RyaWdnZXIpOworCSAgX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgmX19ndGhyZWFkX2FjdGl2ZV9tdXRleCk7CisJfQorCisgICAgICAvKiBNYWtlIHN1cmUgd2UnbGwgbmV2ZXIgZW50ZXIgdGhpcyBibG9jayBhZ2Fpbi4gICovCisgICAgICBpZiAoX19ndGhyZWFkX2FjdGl2ZSA8IDApCisJX19ndGhyZWFkX2FjdGl2ZSA9IDA7CisKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5laXRoZXIgRnJlZUJTRCBub3IgU29sYXJpcyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICBzdGF0aWMgdm9pZCAqY29uc3QgX19ndGhyZWFkX2FjdGl2ZV9wdHIKKyAgICA9IF9fZXh0ZW5zaW9uX18gKHZvaWQgKikgJl9fZ3RocndfKAorLyogQW5kcm9pZCdzIEMgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHB0aHJlYWRfY2FuY2VsLCBjaGVjayBmb3IKKyAgIGBwdGhyZWFkX2NyZWF0ZScgaW5zdGVhZC4gICovCisjaWZuZGVmIF9fQklPTklDX18KKwkJCQkgICAgICAgcHRocmVhZF9jYW5jZWwKKyNlbHNlCisJCQkJICAgICAgIHB0aHJlYWRfY3JlYXRlCisjZW5kaWYKKwkJCQkgICAgICAgKTsKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfcHRyICE9IDA7Cit9CisKKyNlbmRpZiAvKiBGcmVlQlNEIG9yIFNvbGFyaXMgKi8KKworI2Vsc2UgLyogbm90IF9fR1hYX1dFQUtfXyAqLworCisvKiBTaW1pbGFyIHRvIFNvbGFyaXMsIEhQLVVYIDExIGZvciBQQS1SSVNDIHByb3ZpZGVzIHN0dWJzIGZvciBwdGhyZWFkCisgICBjYWxscyBpbiBzaGFyZWQgZmxhdm9ycyBvZiB0aGUgSFAtVVggQyBsaWJyYXJ5LiAgTW9zdCBvZiB0aGUgc3R1YnMKKyAgIGhhdmUgbm8gZnVuY3Rpb25hbGl0eS4gIFRoZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgaW4gdGhlICJsaWJjIGN1bXVsYXRpdmUKKyAgIHBhdGNoIiBmb3IgZWFjaCBzdWJ2ZXJzaW9uIG9mIEhQLVVYIDExLiAgVGhlcmUgYXJlIHR3byBzcGVjaWFsIGludGVyZmFjZXMKKyAgIHByb3ZpZGVkIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byBhIHNoYXJlZCBwdGhyZWFkCisgICBsaWJyYXJ5IG9yIG5vdC4gIEhvd2V2ZXIsIHRoZXNlIGludGVyZmFjZXMgYXJlbid0IGF2YWlsYWJsZSBpbiBlYXJseQorICAgbGlicHRocmVhZCBsaWJyYXJpZXMuICBXZSBhbHNvIG5lZWQgYSB0ZXN0IHRoYXQgd29ya3MgZm9yIGFyY2hpdmUKKyAgIGxpYnJhcmllcy4gIFdlIGNhbid0IHVzZSBwdGhyZWFkX29uY2UgYXMgc29tZSBsaWJjIHZlcnNpb25zIGNhbGwgdGhlCisgICBpbml0IGZ1bmN0aW9uLiAgV2UgYWxzbyBjYW4ndCB1c2UgcHRocmVhZF9jcmVhdGUgb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgIGFzIHRoZXNlIGNyZWF0ZSBhIHRocmVhZCBhbmQgdGhlcmVieSBwcmV2ZW50IGNoYW5naW5nIHRoZSBkZWZhdWx0IHN0YWNrCisgICBzaXplLiAgVGhlIGZ1bmN0aW9uIHB0aHJlYWRfZGVmYXVsdF9zdGFja3NpemVfbnAgaXMgYXZhaWxhYmxlIGluIGJvdGgKKyAgIHRoZSBhcmNoaXZlIGFuZCBzaGFyZWQgdmVyc2lvbnMgb2YgbGlicHRocmVhZC4gICBJdCBjYW4gYmUgdXNlZCB0bworICAgZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHB0aHJlYWQgc3RhY2sgc2l6ZS4gIFRoZXJlIGlzIGEgc3R1YiBpbiBzb21lCisgICBzaGFyZWQgbGliYyB2ZXJzaW9ucyB3aGljaCByZXR1cm5zIGEgemVybyBzaXplIGlmIHB0aHJlYWRzIGFyZSBub3QKKyAgIGFjdGl2ZS4gIFdlIHByb3ZpZGUgYW4gZXF1aXZhbGVudCBzdHViIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBsaWJjCisgICBkb2Vzbid0IHByb3ZpZGUgb25lLiAgKi8KKworI2lmIGRlZmluZWQoX19ocHBhX18pICYmIGRlZmluZWQoX19ocHV4X18pCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgX19ndGhyZWFkX2FjdGl2ZSA9IC0xOworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICAvKiBBdm9pZCByZWFkaW5nIF9fZ3RocmVhZF9hY3RpdmUgdHdpY2Ugb24gdGhlIG1haW4gY29kZSBwYXRoLiAgKi8KKyAgaW50IF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgc2l6ZV90IF9fczsKKworICBpZiAoX19idWlsdGluX2V4cGVjdCAoX19ndGhyZWFkX2FjdGl2ZV9sYXRlc3RfdmFsdWUgPCAwLCAwKSkKKyAgICB7CisgICAgICBwdGhyZWFkX2RlZmF1bHRfc3RhY2tzaXplX25wICgwLCAmX19zKTsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmUgPSBfX3MgPyAxIDogMDsKKyAgICAgIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlID0gX19ndGhyZWFkX2FjdGl2ZTsKKyAgICB9CisKKyAgcmV0dXJuIF9fZ3RocmVhZF9hY3RpdmVfbGF0ZXN0X3ZhbHVlICE9IDA7Cit9CisKKyNlbHNlIC8qIG5vdCBocHBhLWhwdXggKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9hY3RpdmVfcCAodm9pZCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAvKiBocHBhLWhwdXggKi8KKworI2VuZGlmIC8qIF9fR1hYX1dFQUtfXyAqLworCisjaWZkZWYgX0xJQk9CSkMKKworLyogVGhpcyBpcyB0aGUgY29uZmlnLmggZmlsZSBpbiBsaWJvYmpjLyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgSEFWRV9TQ0hFRF9ICisjIGluY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLyogS2V5IHN0cnVjdHVyZSBmb3IgbWFpbnRhaW5pbmcgdGhyZWFkIHNwZWNpZmljIHN0b3JhZ2UgKi8KK3N0YXRpYyBwdGhyZWFkX2tleV90IF9vYmpjX3RocmVhZF9zdG9yYWdlOworc3RhdGljIHB0aHJlYWRfYXR0cl90IF9vYmpjX3RocmVhZF9hdHRyaWJzOworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIHRocmVhZCBzdG9yYWdlIGtleS4gICovCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoJl9vYmpjX3RocmVhZF9zdG9yYWdlLCBOVUxMKSA9PSAwKQorCXsKKwkgIC8qIFRoZSBub3JtYWwgZGVmYXVsdCBkZXRhY2ggc3RhdGUgZm9yIHRocmVhZHMgaXMKKwkgICAqIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHdoaWNoIGNhdXNlcyB0aHJlYWRzIHRvIG5vdCBkaWUKKwkgICAqIHdoZW4geW91IHRoaW5rIHRoZXkgc2hvdWxkLiAgKi8KKwkgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfaW5pdCkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMAorCSAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKCZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkJICAgICAgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9vYmpjX3RocmVhZF9zdG9yYWdlKSA9PSAwCisgICAgICAmJiBfX2d0aHJ3XyhwdGhyZWFkX2F0dHJfZGVzdHJveSkgKCZfb2JqY190aHJlYWRfYXR0cmlicykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgIG9iamNfdGhyZWFkX3QgdGhyZWFkX2lkOworICBwdGhyZWFkX3QgbmV3X3RocmVhZF9oYW5kbGU7CisKKyAgaWYgKCFfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKCEoX19ndGhyd18ocHRocmVhZF9jcmVhdGUpICgmbmV3X3RocmVhZF9oYW5kbGUsICZfb2JqY190aHJlYWRfYXR0cmlicywKKwkJCQkgICh2b2lkICopIGZ1bmMsIGFyZykpKQorICAgIHRocmVhZF9pZCA9IChvYmpjX3RocmVhZF90KSBuZXdfdGhyZWFkX2hhbmRsZTsKKyAgZWxzZQorICAgIHRocmVhZF9pZCA9IE5VTEw7CisKKyAgcmV0dXJuIHRocmVhZF9pZDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkpCit7CisgIGlmICghX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZQorICAgIHsKKyNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORworI2lmZGVmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORworICAgICAgcHRocmVhZF90IHRocmVhZF9pZCA9IF9fZ3RocndfKHB0aHJlYWRfc2VsZikgKCk7CisgICAgICBpbnQgcG9saWN5OworICAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtczsKKyAgICAgIGludCBwcmlvcml0eV9taW4sIHByaW9yaXR5X21heDsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHRocmVhZF9pZCwgJnBvbGljeSwgJnBhcmFtcykgPT0gMCkKKwl7CisJICBpZiAoKHByaW9yaXR5X21heCA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9tYXgpIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAoKHByaW9yaXR5X21pbiA9IF9fZ3RocndfKHNjaGVkX2dldF9wcmlvcml0eV9taW4pIChwb2xpY3kpKSA9PSAtMSkKKwkgICAgcmV0dXJuIC0xOworCisJICBpZiAocHJpb3JpdHkgPiBwcmlvcml0eV9tYXgpCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWF4OworCSAgZWxzZSBpZiAocHJpb3JpdHkgPCBwcmlvcml0eV9taW4pCisJICAgIHByaW9yaXR5ID0gcHJpb3JpdHlfbWluOworCSAgcGFyYW1zLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwkgIC8qCisJICAgKiBUaGUgc29sYXJpcyA3IGFuZCBzZXZlcmFsIG90aGVyIG1hbiBwYWdlcyBpbmNvcnJlY3RseSBzdGF0ZSB0aGF0CisJICAgKiB0aGlzIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gcG9saWN5IGJ1dCBwdGhyZWFkLmggaXMgdW5pdmVyc2FsbHkKKwkgICAqIGF0IG9kZHMgd2l0aCB0aGlzLgorCSAgICovCisJICBpZiAoX19ndGhyd18ocHRocmVhZF9zZXRzY2hlZHBhcmFtKSAodGhyZWFkX2lkLCBwb2xpY3ksICZwYXJhbXMpID09IDApCisJICAgIHJldHVybiAwOworCX0KKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgKi8KKyNlbmRpZiAvKiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORyAqLworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZ2V0X3ByaW9yaXR5ICh2b2lkKQoreworI2lmZGVmIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9QUklPUklUWV9TQ0hFRFVMSU5HCisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaW50IHBvbGljeTsKKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbXM7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX2dldHNjaGVkcGFyYW0pIChfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpLCAmcG9saWN5LCAmcGFyYW1zKSA9PSAwKQorCXJldHVybiBwYXJhbXMuc2NoZWRfcHJpb3JpdHk7CisgICAgICBlbHNlCisJcmV0dXJuIC0xOworICAgIH0KKyAgZWxzZQorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyAqLworI2VuZGlmIC8qIF9QT1NJWF9QUklPUklUWV9TQ0hFRFVMSU5HICovCisgICAgcmV0dXJuIE9CSkNfVEhSRUFEX0lOVEVSQUNUSVZFX1BSSU9SSVRZOworfQorCisvKiBZaWVsZCBvdXIgcHJvY2VzcyB0aW1lIHRvIGFub3RoZXIgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ndGhyZWFkX29iamNfdGhyZWFkX3lpZWxkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIF9fZ3RocndfKHNjaGVkX3lpZWxkKSAoKTsKK30KKworLyogVGVybWluYXRlIHRoZSBjdXJyZW50IHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfdGhyZWFkX2V4aXQgKHZvaWQpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgLyogZXhpdCB0aGUgdGhyZWFkICovCisgICAgX19ndGhyd18ocHRocmVhZF9leGl0KSAoJl9fb2JqY190aHJlYWRfZXhpdF9zdGF0dXMpOworCisgIC8qIEZhaWxlZCBpZiB3ZSByZWFjaGVkIGhlcmUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgd2hpY2ggdW5pcXVlbHkgZGVzY3JpYmVzIGEgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgb2JqY190aHJlYWRfdAorX19ndGhyZWFkX29iamNfdGhyZWFkX2lkICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgX19ndGhyd18ocHRocmVhZF9zZWxmKSAoKTsKKyAgZWxzZQorICAgIHJldHVybiAob2JqY190aHJlYWRfdCkgMTsKK30KKworLyogU2V0cyB0aGUgdGhyZWFkJ3MgbG9jYWwgc3RvcmFnZSBwb2ludGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X2RhdGEgKHZvaWQgKnZhbHVlKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UsIHZhbHVlKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qIFJldHVybnMgdGhlIHRocmVhZCdzIGxvY2FsIHN0b3JhZ2UgcG9pbnRlci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorX19ndGhyZWFkX29iamNfdGhyZWFkX2dldF9kYXRhICh2b2lkKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2dldHNwZWNpZmljKSAoX29iamNfdGhyZWFkX3N0b3JhZ2UpOworICBlbHNlCisgICAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9tdXRleF90KSk7CisKKyAgICAgIGlmIChfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kLCBOVUxMKSkKKwl7CisJICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKwkgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2RlYWxsb2NhdGUgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICB7CisgICAgICBpbnQgY291bnQ7CisKKyAgICAgIC8qCisgICAgICAgKiBQb3NpeCBUaHJlYWRzIHNwZWNpZmljYWxseSByZXF1aXJlIHRoYXQgdGhlIHRocmVhZCBiZSB1bmxvY2tlZAorICAgICAgICogZm9yIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSkgdG8gd29yay4KKyAgICAgICAqLworCisgICAgICBkbworCXsKKwkgIGNvdW50ID0gX19ndGhyd18ocHRocmVhZF9tdXRleF91bmxvY2spICgocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKwkgIGlmIChjb3VudCA8IDApCisJICAgIHJldHVybiAtMTsKKwl9CisgICAgICB3aGlsZSAoY291bnQpOworCisgICAgICBpZiAoX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKG11dGV4LT5iYWNrZW5kKTsKKyAgICAgIG11dGV4LT5iYWNrZW5kID0gTlVMTDsKKyAgICB9CisgIHJldHVybiAwOworfQorCisvKiBHcmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKChwdGhyZWFkX211dGV4X3QgKikgbXV0ZXgtPmJhY2tlbmQpICE9IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyogVHJ5IHRvIGdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X3RyeWxvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKQorICAgICAgJiYgX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkKKyAgICAgICYmIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoKHB0aHJlYWRfbXV0ZXhfdCAqKSBtdXRleC0+YmFja2VuZCkgIT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBCYWNrZW5kIGNvbmRpdGlvbiBtdXRleCBmdW5jdGlvbnMgKi8KKworLyogQWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9hbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgY29uZGl0aW9uLT5iYWNrZW5kID0gb2JqY19tYWxsb2MgKHNpemVvZiAocHRocmVhZF9jb25kX3QpKTsKKworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9pbml0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCwgTlVMTCkpCisJeworCSAgb2JqY19mcmVlIChjb25kaXRpb24tPmJhY2tlbmQpOworCSAgY29uZGl0aW9uLT5iYWNrZW5kID0gTlVMTDsKKwkgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKiBEZWFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fZGVhbGxvY2F0ZSAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24pCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgeworICAgICAgaWYgKF9fZ3RocndfKHB0aHJlYWRfY29uZF9kZXN0cm95KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCkpCisJcmV0dXJuIC0xOworCisgICAgICBvYmpjX2ZyZWUgKGNvbmRpdGlvbi0+YmFja2VuZCk7CisgICAgICBjb25kaXRpb24tPmJhY2tlbmQgPSBOVUxMOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdhaXQgb24gdGhlIGNvbmRpdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl93YWl0IChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiwgb2JqY19tdXRleF90IG11dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKChwdGhyZWFkX2NvbmRfdCAqKSBjb25kaXRpb24tPmJhY2tlbmQsCisJCQkgICAgICAocHRocmVhZF9tdXRleF90ICopIG11dGV4LT5iYWNrZW5kKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLyogV2FrZSB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9zaWduYWwgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoKHB0aHJlYWRfY29uZF90ICopIGNvbmRpdGlvbi0+YmFja2VuZCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogX0xJQk9CSkMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jcmVhdGUgKF9fZ3RocmVhZF90ICpfX3RocmVhZGlkLCB2b2lkICooKl9fZnVuYykgKHZvaWQqKSwKKwkJICB2b2lkICpfX2FyZ3MpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NyZWF0ZSkgKF9fdGhyZWFkaWQsIE5VTEwsIF9fZnVuYywgX19hcmdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkLCB2b2lkICoqX192YWx1ZV9wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2pvaW4pIChfX3RocmVhZGlkLCBfX3ZhbHVlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfZGV0YWNoIChfX2d0aHJlYWRfdCBfX3RocmVhZGlkKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9kZXRhY2gpIChfX3RocmVhZGlkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgX190MSwgX19ndGhyZWFkX3QgX190MikKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZXF1YWwpIChfX3QxLCBfX3QyKTsKK30KKworc3RhdGljIGlubGluZSBfX2d0aHJlYWRfdAorX19ndGhyZWFkX3NlbGYgKHZvaWQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NlbGYpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3lpZWxkICh2b2lkKQoreworICByZXR1cm4gX19ndGhyd18oc2NoZWRfeWllbGQpICgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKl9fb25jZSwgdm9pZCAoKl9fZnVuYykgKHZvaWQpKQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9jcmVhdGUpIChfX2tleSwgX19kdG9yKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9rZXlfZGVsZXRlIChfX2d0aHJlYWRfa2V5X3QgX19rZXkpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2tleV9kZWxldGUpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfc2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSwgY29uc3Qgdm9pZCAqX19wdHIpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9kZXN0cm95KSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9sb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF9sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fZ3RocmVhZF9hY3RpdmVfcCAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9QT1NJWF9USU1FT1VUUworI2lmIF9QT1NJWF9USU1FT1VUUyA+PSAwCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X3RpbWVkbG9jaykgKF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX2d0aHJlYWRfYWN0aXZlX3AgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAorc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfaW5pdF9mdW5jdGlvbiAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX19ndGhyZWFkX2FjdGl2ZV9wICgpKQorICAgIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOworICAgICAgaW50IF9fcjsKKworICAgICAgX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfaW5pdCkgKCZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkgKCZfX2F0dHIsCisJCQkJCQkgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCAmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpICgmX19hdHRyKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RyeWxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX211dGV4KTsKK30KKworI2lmZGVmIF9QT1NJWF9USU1FT1VUUworI2lmIF9QT1NJWF9USU1FT1VUUyA+PSAwCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90aW1lZGxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCwKKwkJCQkgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJlYWRfbXV0ZXhfdGltZWRsb2NrIChfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3VubG9jayAoX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCkKK3sKKyAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfY29uZF9icm9hZGNhc3QpIChfX2NvbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfc2lnbmFsIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfc2lnbmFsKSAoX19jb25kKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfd2FpdCkgKF9fY29uZCwgX19tdXRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfY29uZF90aW1lZHdhaXQgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwgX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgsCisJCQkgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKl9fYWJzX3RpbWVvdXQpCit7CisgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX2NvbmRfdGltZWR3YWl0KSAoX19jb25kLCBfX211dGV4LCBfX2Fic190aW1lb3V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpfX2NvbmQsCisJCQkgICAgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX2NvbmRfd2FpdCAoX19jb25kLCBfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9jb25kX3RpbWVkd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKl9fY29uZCwKKwkJCQkgICAgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4LAorCQkJCSAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICpfX2Fic190aW1lb3V0KQoreworICByZXR1cm4gX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2NvbmQsIF9fbXV0ZXgsIF9fYWJzX3RpbWVvdXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2NvbmRfZGVzdHJveSAoX19ndGhyZWFkX2NvbmRfdCogX19jb25kKQoreworICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9jb25kX2Rlc3Ryb3kpIChfX2NvbmQpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfUE9TSVhfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLXNpbmdsZS5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLXNpbmdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjY4OGYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2d0aHItc2luZ2xlLmgKQEAgLTAsMCArMSwyOTIgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSwgMjAwMCwgMjAwNCwgMjAwOCwgMjAwOQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfU0lOR0xFX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfU0lOR0xFX0gKKworLyogSnVzdCBwcm92aWRlIGNvbXBhdGliaWxpdHkgZm9yIG11dGV4IGhhbmRsaW5nLiAgKi8KKwordHlwZWRlZiBpbnQgX19ndGhyZWFkX2tleV90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgaW50IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OworCisjZGVmaW5lIF9fR1RIUkVBRF9PTkNFX0lOSVQgMAorI2RlZmluZSBfX0dUSFJFQURfTVVURVhfSU5JVCAwCisjZGVmaW5lIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVCAwCisKKyNkZWZpbmUgX0dMSUJDWFhfVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKKyNpZmRlZiBfTElCT0JKQworCisvKiBUaHJlYWQgbG9jYWwgc3RvcmFnZSBmb3IgYSBzaW5nbGUgdGhyZWFkICovCitzdGF0aWMgdm9pZCAqdGhyZWFkX2xvY2FsX3N0b3JhZ2UgPSBOVUxMOworCisvKiBCYWNrZW5kIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLworCisvKiBJbml0aWFsaXplIHRoZSB0aHJlYWRzIHN1YnN5c3RlbS4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfaW5pdF90aHJlYWRfc3lzdGVtICh2b2lkKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBDbG9zZSB0aGUgdGhyZWFkcyBzdWJzeXN0ZW0uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2Nsb3NlX3RocmVhZF9zeXN0ZW0gKHZvaWQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICByZXR1cm4gLTE7Cit9CisKKy8qIEJhY2tlbmQgdGhyZWFkIGZ1bmN0aW9ucyAqLworCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIG9mIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9kZXRhY2ggKHZvaWQgKCogZnVuYykodm9pZCAqKSwgdm9pZCAqIGFyZyBfR0xJQkNYWF9VTlVTRUQpCit7CisgIC8qIE5vIHRocmVhZCBzdXBwb3J0IGF2YWlsYWJsZSAqLworICByZXR1cm4gTlVMTDsKK30KKworLyogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIHByaW9yaXR5LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfc2V0X3ByaW9yaXR5IChpbnQgcHJpb3JpdHkgX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBObyB0aHJlYWQgc3VwcG9ydCBhdmFpbGFibGUgKi8KKyAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgcHJpb3JpdHkuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfcHJpb3JpdHkgKHZvaWQpCit7CisgIHJldHVybiBPQkpDX1RIUkVBRF9JTlRFUkFDVElWRV9QUklPUklUWTsKK30KKworLyogWWllbGQgb3VyIHByb2Nlc3MgdGltZSB0byBhbm90aGVyIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF95aWVsZCAodm9pZCkKK3sKKyAgcmV0dXJuOworfQorCisvKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgdGhyZWFkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY190aHJlYWRfZXhpdCAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQgYXZhaWxhYmxlICovCisgIC8qIFNob3VsZCB3ZSByZWFsbHkgZXhpdCB0aGUgcHJvZ3JhbSAqLworICAvKiBleGl0ICgmX19vYmpjX3RocmVhZF9leGl0X3N0YXR1cyk7ICovCisgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIHVuaXF1ZWx5IGRlc2NyaWJlcyBhIHRocmVhZC4gICovCitzdGF0aWMgaW5saW5lIG9iamNfdGhyZWFkX3QKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9pZCAodm9pZCkKK3sKKyAgLyogTm8gdGhyZWFkIHN1cHBvcnQsIHVzZSAxLiAgKi8KKyAgcmV0dXJuIChvYmpjX3RocmVhZF90KSAxOworfQorCisvKiBTZXRzIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9zZXRfZGF0YSAodm9pZCAqdmFsdWUpCit7CisgIHRocmVhZF9sb2NhbF9zdG9yYWdlID0gdmFsdWU7CisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIHRoZSB0aHJlYWQncyBsb2NhbCBzdG9yYWdlIHBvaW50ZXIuICAqLworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9vYmpjX3RocmVhZF9nZXRfZGF0YSAodm9pZCkKK3sKKyAgcmV0dXJuIHRocmVhZF9sb2NhbF9zdG9yYWdlOworfQorCisvKiBCYWNrZW5kIG11dGV4IGZ1bmN0aW9ucyAqLworCisvKiBBbGxvY2F0ZSBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF9hbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBtdXRleC4gICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfZGVhbGxvY2F0ZSAob2JqY19tdXRleF90IG11dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIEdyYWIgYSBsb2NrIG9uIGEgbXV0ZXguICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX211dGV4X2xvY2sgKG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIC8qIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSB0aHJlYWQsIHNvIHdlIGFsd2F5cyBnZXQgdGhlIGxvY2sgKi8KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBncmFiIGEgbG9jayBvbiBhIG11dGV4LiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19tdXRleF90cnlsb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICAvKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgdGhyZWFkLCBzbyB3ZSBhbHdheXMgZ2V0IHRoZSBsb2NrICovCisgIHJldHVybiAwOworfQorCisvKiBVbmxvY2sgdGhlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX29iamNfbXV0ZXhfdW5sb2NrIChvYmpjX211dGV4X3QgbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworLyogQmFja2VuZCBjb25kaXRpb24gbXV0ZXggZnVuY3Rpb25zICovCisKKy8qIEFsbG9jYXRlIGEgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fYWxsb2NhdGUgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIERlYWxsb2NhdGUgYSBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9kZWFsbG9jYXRlIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWl0IG9uIHRoZSBjb25kaXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fd2FpdCAob2JqY19jb25kaXRpb25fdCBjb25kaXRpb24gX0dMSUJDWFhfVU5VU0VELAorCQkJICAgICAgIG9iamNfbXV0ZXhfdCBtdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisvKiBXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uICAqLworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vYmpjX2NvbmRpdGlvbl9icm9hZGNhc3QgKG9iamNfY29uZGl0aW9uX3QgY29uZGl0aW9uIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFdha2UgdXAgb25lIHRocmVhZCB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfb2JqY19jb25kaXRpb25fc2lnbmFsIChvYmpjX2NvbmRpdGlvbl90IGNvbmRpdGlvbiBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCisjZWxzZSAvKiBfTElCT0JKQyAqLworCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpfX29uY2UgX0dMSUJDWFhfVU5VU0VELCB2b2lkICgqX19mdW5jKSAodm9pZCkgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX0dMSUJDWFhfVU5VU0VECitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSBfR0xJQkNYWF9VTlVTRUQsIHZvaWQgKCpfX2Z1bmMpICh2b2lkICopIF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX0dMSUJDWFhfVU5VU0VECitfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IF9fa2V5IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitfX2d0aHJlYWRfZ2V0c3BlY2lmaWMgKF9fZ3RocmVhZF9rZXlfdCBfX2tleSBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3NldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3QgX19rZXkgX0dMSUJDWFhfVU5VU0VELCBjb25zdCB2b2lkICpfX3YgX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCBfR0xJQkNYWF9VTlVTRUQpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2xvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXggX0dMSUJDWFhfVU5VU0VEKQoreworICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4IF9HTElCQ1hYX1VOVVNFRCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2xvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworfQorCisjZW5kaWYgLyogX0xJQk9CSkMgKi8KKworI3VuZGVmIF9HTElCQ1hYX1VOVVNFRAorCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9TSU5HTEVfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLXRwZi5oIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLXRwZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTk0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2d0aHItdHBmLmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMiBhbmQgbGlib2JqYy4KKyAgIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuCisgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdDQy4KKworR0NDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKK3RoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgordmVyc2lvbi4KKworR0NDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCitwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCiszLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKK2EgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CitzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKy8qIFRQRiBuZWVkcyBpdHMgb3duIHZlcnNpb24gb2YgZ3Roci0qLmggYmVjYXVzZSBUUEYgYWx3YXlzIGxpbmtzIHRvCisgICB0aGUgdGhyZWFkIGxpYnJhcnkuICBIb3dldmVyLCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSBzdGlsbCBkbyBub3QKKyAgIHdhbnQgdG8gaXNzdWUgdGhyZWFkIGFwaSBjYWxscyB1bmxlc3MgYSBjaGVjayBpcyBtYWRlIHRvIHNlZSB0aGF0IHdlCisgICBhcmUgcnVubmluZyBhcyBhIHRocmVhZC4gICovCisKKyNpZm5kZWYgX0dMSUJDWFhfR0NDX0dUSFJfVFBGX0gKKyNkZWZpbmUgX0dMSUJDWFhfR0NDX0dUSFJfVFBGX0gKKworLyogUE9TSVggdGhyZWFkcyBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAgIEVhc3ksIHNpbmNlIHRoZSBpbnRlcmZhY2UgaXMganVzdCBvbmUtdG8tb25lIG1hcHBpbmcuICAqLworCisjZGVmaW5lIF9fR1RIUkVBRFMgMQorCisvKiBTb21lIGltcGxlbWVudGF0aW9ucyBvZiA8cHRocmVhZC5oPiByZXF1aXJlIHRoaXMgdG8gYmUgZGVmaW5lZC4gICovCisjaWZuZGVmIF9SRUVOVFJBTlQKKyNkZWZpbmUgX1JFRU5UUkFOVCAxCisjZW5kaWYKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordHlwZWRlZiBwdGhyZWFkX2tleV90IF9fZ3RocmVhZF9rZXlfdDsKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgX19ndGhyZWFkX29uY2VfdDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90IF9fZ3RocmVhZF9tdXRleF90OwordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90OworCisjaWYgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUikKKyNkZWZpbmUgX19HVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSCisjZWxpZiBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVQgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKKyNlbmRpZgorCisjZGVmaW5lIF9fR1RIUkVBRF9NVVRFWF9JTklUIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX19HVEhSRUFEX09OQ0VfSU5JVCBQVEhSRUFEX09OQ0VfSU5JVAorI2RlZmluZSBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04gX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9pbml0X2Z1bmN0aW9uCisKKyNkZWZpbmUgTk9UQVRIUkVBRCAgIDAwCisjZGVmaW5lIEVDQkJBU0VQVFIgKHVuc2lnbmVkIGxvbmcgaW50KSAqKHVuc2lnbmVkIGludCAqKTB4MDAwMDA1MTR1CisjZGVmaW5lIEVDQlBHMlBUUiAgRUNCQkFTRVBUUiArIDB4MTAwMAorI2RlZmluZSBDRTJUSFJDUFRSICooKHVuc2lnbmVkIGNoYXIgKikoRUNCUEcyUFRSICsgMTYpKQorI2RlZmluZSBfX3RwZl9wdGhyZWFkX2FjdGl2ZSgpIChDRTJUSFJDUFRSICE9IE5PVEFUSFJFQUQpCisKKyNpZiBfX0dYWF9XRUFLX18gJiYgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSworIyBkZWZpbmUgX19ndGhydyhuYW1lKSBcCisgIHN0YXRpYyBfX3R5cGVvZihuYW1lKSBfX2d0aHJ3XyAjIyBuYW1lIF9fYXR0cmlidXRlX18gKChfX3dlYWtyZWZfXygjbmFtZSkpKTsKKyMgZGVmaW5lIF9fZ3RocndfKG5hbWUpIF9fZ3RocndfICMjIG5hbWUKKyNlbHNlCisjIGRlZmluZSBfX2d0aHJ3KG5hbWUpCisjIGRlZmluZSBfX2d0aHJ3XyhuYW1lKSBuYW1lCisjZW5kaWYKKworX19ndGhydyhwdGhyZWFkX29uY2UpCitfX2d0aHJ3KHB0aHJlYWRfa2V5X2NyZWF0ZSkKK19fZ3RocncocHRocmVhZF9rZXlfZGVsZXRlKQorX19ndGhydyhwdGhyZWFkX2dldHNwZWNpZmljKQorX19ndGhydyhwdGhyZWFkX3NldHNwZWNpZmljKQorX19ndGhydyhwdGhyZWFkX2NyZWF0ZSkKKworX19ndGhydyhwdGhyZWFkX211dGV4X2xvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaykKK19fZ3RocncocHRocmVhZF9tdXRleF91bmxvY2spCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpCitfX2d0aHJ3KHB0aHJlYWRfbXV0ZXhfaW5pdCkKK19fZ3RocncocHRocmVhZF9tdXRleF9kZXN0cm95KQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX2FjdGl2ZV9wICh2b2lkKQoreworICByZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9vbmNlIChfX2d0aHJlYWRfb25jZV90ICpfX29uY2UsIHZvaWQgKCpfX2Z1bmMpICh2b2lkKSkKK3sKKyAgaWYgKF9fdHBmX3B0aHJlYWRfYWN0aXZlICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX29uY2UpIChfX29uY2UsIF9fZnVuYyk7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2NyZWF0ZSAoX19ndGhyZWFkX2tleV90ICpfX2tleSwgdm9pZCAoKl9fZHRvcikgKHZvaWQgKikpCit7CisgIGlmIChfX3RwZl9wdGhyZWFkX2FjdGl2ZSAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9rZXlfY3JlYXRlKSAoX19rZXksIF9fZHRvcik7CisgIGVsc2UKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfa2V5X2RlbGV0ZSAoX19ndGhyZWFkX2tleV90IF9fa2V5KQoreworICBpZiAoX190cGZfcHRocmVhZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfa2V5X2RlbGV0ZSkgKF9fa2V5KTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICoKK19fZ3RocmVhZF9nZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5KQoreworICBpZiAoX190cGZfcHRocmVhZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfZ2V0c3BlY2lmaWMpIChfX2tleSk7CisgIGVsc2UKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9zZXRzcGVjaWZpYyAoX19ndGhyZWFkX2tleV90IF9fa2V5LCBjb25zdCB2b2lkICpfX3B0cikKK3sKKyAgaWYgKF9fdHBmX3B0aHJlYWRfYWN0aXZlICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX3NldHNwZWNpZmljKSAoX19rZXksIF9fcHRyKTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fdHBmX3B0aHJlYWRfYWN0aXZlICgpKQorICAgIHJldHVybiBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2Rlc3Ryb3kpIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX211dGV4X2xvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX190cGZfcHRocmVhZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfbG9jaykgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX3RwZl9wdGhyZWFkX2FjdGl2ZSAoKSkKKyAgICByZXR1cm4gX19ndGhyd18ocHRocmVhZF9tdXRleF90cnlsb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fZ3RocmVhZF9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX190cGZfcHRocmVhZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhfdW5sb2NrKSAoX19tdXRleCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX190cGZfcHRocmVhZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF9sb2NrIChfX211dGV4KTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKl9fbXV0ZXgpCit7CisgIGlmIChfX3RwZl9wdGhyZWFkX2FjdGl2ZSAoKSkKKyAgICByZXR1cm4gX19ndGhyZWFkX211dGV4X3RyeWxvY2sgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICpfX211dGV4KQoreworICBpZiAoX190cGZfcHRocmVhZF9hY3RpdmUgKCkpCisgICAgcmV0dXJuIF9fZ3RocmVhZF9tdXRleF91bmxvY2sgKF9fbXV0ZXgpOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X2luaXRfZnVuY3Rpb24gKF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdCAqX19tdXRleCkKK3sKKyAgaWYgKF9fdHBmX3B0aHJlYWRfYWN0aXZlICgpKQorICAgIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgX19hdHRyOworICAgICAgaW50IF9fcjsKKworICAgICAgX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfaW5pdCkgKCZfX2F0dHIpOworICAgICAgaWYgKCFfX3IpCisJX19yID0gX19ndGhyd18ocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSkgKCZfX2F0dHIsCisJCQkJCQkgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgICBpZiAoIV9fcikKKwlfX3IgPSBfX2d0aHJ3XyhwdGhyZWFkX211dGV4X2luaXQpIChfX211dGV4LCAmX19hdHRyKTsKKyAgICAgIGlmICghX19yKQorCV9fciA9IF9fZ3RocndfKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpICgmX19hdHRyKTsKKyAgICAgIHJldHVybiBfX3I7CisgICAgfQorICByZXR1cm4gMDsKK30KKworCisjZW5kaWYgLyogISBfR0xJQkNYWF9HQ0NfR1RIUl9UUEZfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL2d0aHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY2YzExCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9ndGhyLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIFRocmVhZHMgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgbGliZ2NjMi4gICovCisvKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMjAwNCwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3IgbW9yZSBkZXRhaWxzLgorCitVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKK3Blcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKzMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKK3NlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworI2lmbmRlZiBfR0xJQkNYWF9HQ0NfR1RIUl9ICisjZGVmaW5lIF9HTElCQ1hYX0dDQ19HVEhSX0gKKworI2lmbmRlZiBfR0xJQkNYWF9ISURFX0VYUE9SVFMKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcHVzaChkZWZhdWx0KQorI2VuZGlmCisKKy8qIElmIHRoaXMgZmlsZSBpcyBjb21waWxlZCB3aXRoIHRocmVhZHMgc3VwcG9ydCwgaXQgbXVzdAorICAgICAgICNkZWZpbmUgX19HVEhSRUFEUyAxCisgICB0byBpbmRpY2F0ZSB0aGF0IHRocmVhZHMgc3VwcG9ydCBpcyBwcmVzZW50LiAgQWxzbyBpdCBoYXMgZGVmaW5lCisgICBmdW5jdGlvbgorICAgICBpbnQgX19ndGhyZWFkX2FjdGl2ZV9wICgpCisgICB0aGF0IHJldHVybnMgMSBpZiB0aHJlYWQgc3lzdGVtIGlzIGFjdGl2ZSwgMCBpZiBub3QuCisKKyAgIFRoZSB0aHJlYWRzIGludGVyZmFjZSBtdXN0IGRlZmluZSB0aGUgZm9sbG93aW5nIHR5cGVzOgorICAgICBfX2d0aHJlYWRfa2V5X3QKKyAgICAgX19ndGhyZWFkX29uY2VfdAorICAgICBfX2d0aHJlYWRfbXV0ZXhfdAorICAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QKKworICAgVGhlIHRocmVhZHMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCisgICAgIF9fR1RIUkVBRF9PTkNFX0lOSVQKKyAgICAgCQl0byBpbml0aWFsaXplIF9fZ3RocmVhZF9vbmNlX3QKKyAgICAgX19HVEhSRUFEX01VVEVYX0lOSVQKKyAgICAgCQl0byBpbml0aWFsaXplIF9fZ3RocmVhZF9tdXRleF90IHRvIGdldCBhIGZhc3QKKwkJbm9uLXJlY3Vyc2l2ZSBtdXRleC4KKyAgICAgX19HVEhSRUFEX01VVEVYX0lOSVRfRlVOQ1RJT04KKyAgICAgCQlzb21lIHN5c3RlbXMgY2FuJ3QgaW5pdGlhbGl6ZSBhIG11dGV4IHdpdGhvdXQgYQorCQlmdW5jdGlvbiBjYWxsLiAgT24gc3VjaCBzeXN0ZW1zLCBkZWZpbmUgdGhpcyB0byBhCisJCWZ1bmN0aW9uIHdoaWNoIGxvb2tzIGxpa2UgdGhpczoKKwkJICB2b2lkIF9fR1RIUkVBRF9NVVRFWF9JTklUX0ZVTkNUSU9OIChfX2d0aHJlYWRfbXV0ZXhfdCAqKQorCQlEb24ndCBkZWZpbmUgX19HVEhSRUFEX01VVEVYX0lOSVQgaW4gdGhpcyBjYXNlCisgICAgIF9fR1RIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVAorICAgICBfX0dUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRfRlVOQ1RJT04KKyAgICAgCQlhcyBhYm92ZSwgYnV0IGZvciBhIHJlY3Vyc2l2ZSBtdXRleC4KKworICAgVGhlIHRocmVhZHMgaW50ZXJmYWNlIG11c3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcgc3RhdGljIGZ1bmN0aW9uczoKKworICAgICBpbnQgX19ndGhyZWFkX29uY2UgKF9fZ3RocmVhZF9vbmNlX3QgKm9uY2UsIHZvaWQgKCpmdW5jKSAoKSkKKworICAgICBpbnQgX19ndGhyZWFkX2tleV9jcmVhdGUgKF9fZ3RocmVhZF9rZXlfdCAqa2V5cCwgdm9pZCAoKmR0b3IpICh2b2lkICopKQorICAgICBpbnQgX19ndGhyZWFkX2tleV9kZWxldGUgKF9fZ3RocmVhZF9rZXlfdCBrZXkpCisKKyAgICAgdm9pZCAqX19ndGhyZWFkX2dldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3Qga2V5KQorICAgICBpbnQgX19ndGhyZWFkX3NldHNwZWNpZmljIChfX2d0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwdHIpCisKKyAgICAgaW50IF9fZ3RocmVhZF9tdXRleF9kZXN0cm95IChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworCisgICAgIGludCBfX2d0aHJlYWRfbXV0ZXhfbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9tdXRleF90cnlsb2NrIChfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpOworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3VubG9jayAoX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKworICAgICBpbnQgX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF9sb2NrIChfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9yZWN1cnNpdmVfbXV0ZXhfdHJ5bG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3VubG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptdXRleCk7CisKKyAgIFRoZSBmb2xsb3dpbmcgYXJlIHN1cHBvcnRlZCBpbiBQT1NJWCB0aHJlYWRzIG9ubHkuIFRoZXkgYXJlIHJlcXVpcmVkIHRvCisgICBmaXggYSBkZWFkbG9jayBpbiBzdGF0aWMgaW5pdGlhbGl6YXRpb24gaW5zaWRlIGxpYnN1cGMrKy4gVGhlIGhlYWRlciBmaWxlCisgICBndGhyLXBvc2l4LmggZGVmaW5lcyBhIHN5bWJvbCBfX0dUSFJFQURfSEFTX0NPTkQgdG8gc2lnbmlmeSB0aGF0IHRoZXNlIGV4dHJhCisgICBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkLgorCisgICBUeXBlczoKKyAgICAgX19ndGhyZWFkX2NvbmRfdAorCisgICBNYWNyb3M6CisgICAgIF9fR1RIUkVBRF9DT05EX0lOSVQKKyAgICAgX19HVEhSRUFEX0NPTkRfSU5JVF9GVU5DVElPTgorCisgICBJbnRlcmZhY2U6CisgICAgIGludCBfX2d0aHJlYWRfY29uZF9icm9hZGNhc3QgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfd2FpdCAoX19ndGhyZWFkX2NvbmRfdCAqY29uZCwgX19ndGhyZWFkX211dGV4X3QgKm11dGV4KTsKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX3dhaXRfcmVjdXJzaXZlIChfX2d0aHJlYWRfY29uZF90ICpjb25kLAorCQkJCQlfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4KTsKKworICAgQWxsIGZ1bmN0aW9ucyByZXR1cm5pbmcgaW50IHNob3VsZCByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvcgorICAgbnVtYmVyLiAgSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCAtMSBpcyByZXR1cm5lZC4KKworICAgSWYgdGhlIGZvbGxvd2luZyBhcmUgYWxzbyBkZWZpbmVkLCB5b3Ugc2hvdWxkCisgICAgICNkZWZpbmUgX19HVEhSRUFEU19DWFgwWCAxCisgICB0byBlbmFibGUgdGhlIGMrKzB4IHRocmVhZCBsaWJyYXJ5LgorCisgICBUeXBlczoKKyAgICAgX19ndGhyZWFkX3QKKyAgICAgX19ndGhyZWFkX3RpbWVfdAorCisgICBJbnRlcmZhY2U6CisgICAgIGludCBfX2d0aHJlYWRfY3JlYXRlIChfX2d0aHJlYWRfdCAqdGhyZWFkLCB2b2lkICooKmZ1bmMpICh2b2lkKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmdzKTsKKyAgICAgaW50IF9fZ3RocmVhZF9qb2luIChfX2d0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpOworICAgICBpbnQgX19ndGhyZWFkX2RldGFjaCAoX19ndGhyZWFkX3QgdGhyZWFkKTsKKyAgICAgaW50IF9fZ3RocmVhZF9lcXVhbCAoX19ndGhyZWFkX3QgdDEsIF9fZ3RocmVhZF90IHQyKTsKKyAgICAgX19ndGhyZWFkX3QgX19ndGhyZWFkX3NlbGYgKHZvaWQpOworICAgICBpbnQgX19ndGhyZWFkX3lpZWxkICh2b2lkKTsKKworICAgICBpbnQgX19ndGhyZWFkX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX211dGV4X3QgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2d0aHJlYWRfdGltZV90ICphYnNfdGltZW91dCk7CisgICAgIGludCBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3RpbWVkbG9jayAoX19ndGhyZWFkX3JlY3Vyc2l2ZV9tdXRleF90ICptLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqYWJzX3RpbWUpOworCisgICAgIGludCBfX2d0aHJlYWRfY29uZF9zaWduYWwgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQpOworICAgICBpbnQgX19ndGhyZWFkX2NvbmRfdGltZWR3YWl0IChfX2d0aHJlYWRfY29uZF90ICpjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2d0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fZ3RocmVhZF90aW1lX3QgKmFic190aW1lb3V0KTsKKyAgICAgaW50IF9fZ3RocmVhZF9jb25kX3RpbWVkd2FpdF9yZWN1cnNpdmUgKF9fZ3RocmVhZF9jb25kX3QgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2d0aHJlYWRfcmVjdXJzaXZlX211dGV4X3QgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ndGhyZWFkX3RpbWVfdCAqYWJzX3RpbWUpCisKKyAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgdGhyZWFkcyBwYWNrYWdlcyBhcmUKKyAgICAgVFBGIHRocmVhZHMgd2l0aCAtRF9fdHBmX18KKyAgICAgUE9TSVgvVW5peDk4IHRocmVhZHMgd2l0aCAtRF9QVEhSRUFEUworICAgICBQT1NJWC9Vbml4OTUgdGhyZWFkcyB3aXRoIC1EX1BUSFJFQURTOTUKKyAgICAgRENFIHRocmVhZHMgd2l0aCAtRF9EQ0VfVEhSRUFEUworICAgICBTb2xhcmlzL1VJIHRocmVhZHMgd2l0aCAtRF9TT0xBUklTX1RIUkVBRFMKKworKi8KKworLyogQ2hlY2sgZmlyc3QgZm9yIHRocmVhZCBzcGVjaWZpYyBkZWZpbmVzLiAgKi8KKyNpZiBkZWZpbmVkIChfR0xJQkNYWF9fX3RwZl9HTElCQ1hYX19fKQorI2luY2x1ZGUgPGJpdHMvZ3Roci10cGYuaD4KKyNlbGlmIF9HTElCQ1hYX19QVEhSRUFEUworI2luY2x1ZGUgPGJpdHMvZ3Roci1wb3NpeC5oPgorI2VsaWYgX0dMSUJDWFhfX1BUSFJFQURTOTUKKyNpbmNsdWRlIDxiaXRzL2d0aHItcG9zaXg5NS5oPgorI2VsaWYgX0dMSUJDWFhfX0RDRV9USFJFQURTCisjaW5jbHVkZSA8Yml0cy9ndGhyLWRjZS5oPgorI2VsaWYgX0dMSUJDWFhfX1NPTEFSSVNfVEhSRUFEUworI2luY2x1ZGUgPGJpdHMvZ3Roci1zb2xhcmlzLmg+CisKKy8qIEluY2x1ZGUgR1RIUkVBRF9GSUxFIGlmIG9uZSBpcyBkZWZpbmVkLiAgKi8KKyNlbGlmIGRlZmluZWQoX0dMSUJDWFhfSEFWRV9HVEhSX0RFRkFVTFQpCisjaWYgX19HWFhfV0VBS19fCisjaWZuZGVmIF9HTElCQ1hYX0dUSFJFQURfVVNFX1dFQUsKKyNkZWZpbmUgX0dMSUJDWFhfR1RIUkVBRF9VU0VfV0VBSyAxCisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPGJpdHMvZ3Roci1kZWZhdWx0Lmg+CisKKy8qIEZhbGxiYWNrIHRvIHNpbmdsZSB0aHJlYWQgZGVmaW5pdGlvbnMuICAqLworI2Vsc2UKKyNpbmNsdWRlIDxiaXRzL2d0aHItc2luZ2xlLmg+CisjZW5kaWYKKworI2lmbmRlZiBfR0xJQkNYWF9ISURFX0VYUE9SVFMKKyNwcmFnbWEgR0NDIHZpc2liaWxpdHkgcG9wCisjZW5kaWYKKworI2VuZGlmIC8qICEgX0dMSUJDWFhfR0NDX0dUSFJfSCAqLwpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9tZXNzYWdlc19tZW1iZXJzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL21lc3NhZ2VzX21lbWJlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFhMTlmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9tZXNzYWdlc19tZW1iZXJzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vIHN0ZDo6bWVzc2FnZXMgaW1wbGVtZW50YXRpb24gZGV0YWlscywgR05VIHZlcnNpb24gLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA5LCAyMDEwCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy8vCisvLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIElTTyBDKysgTGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCisvLyBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKy8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisvLyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikKKy8vIGFueSBsYXRlciB2ZXJzaW9uLgorCisvLyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBVbmRlciBTZWN0aW9uIDcgb2YgR1BMIHZlcnNpb24gMywgeW91IGFyZSBncmFudGVkIGFkZGl0aW9uYWwKKy8vIHBlcm1pc3Npb25zIGRlc2NyaWJlZCBpbiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24sIHZlcnNpb24KKy8vIDMuMSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZAorLy8gYSBjb3B5IG9mIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsKKy8vIHNlZSB0aGUgZmlsZXMgQ09QWUlORzMgYW5kIENPUFlJTkcuUlVOVElNRSByZXNwZWN0aXZlbHkuICBJZiBub3QsIHNlZQorLy8gPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisvKiogQGZpbGUgYml0cy9tZXNzYWdlc19tZW1iZXJzLmgKKyAqICBUaGlzIGlzIGFuIGludGVybmFsIGhlYWRlciBmaWxlLCBpbmNsdWRlZCBieSBvdGhlciBsaWJyYXJ5IGhlYWRlcnMuCisgKiAgRG8gbm90IGF0dGVtcHQgdG8gdXNlIGl0IGRpcmVjdGx5LiBAaGVhZGVybmFtZXtsb2NhbGV9CisgKi8KKworLy8KKy8vIElTTyBDKysgMTQ4ODI6IDIyLjIuNy4xLjIgIG1lc3NhZ2VzIGZ1bmN0aW9ucworLy8KKworLy8gV3JpdHRlbiBieSBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKworI2luY2x1ZGUgPGxpYmludGwuaD4KKworbmFtZXNwYWNlIHN0ZCBfR0xJQkNYWF9WSVNJQklMSVRZKGRlZmF1bHQpCit7CitfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTgorCisgIC8vIE5vbi12aXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICAgbWVzc2FnZXM8X0NoYXJUPjo6bWVzc2FnZXMoc2l6ZV90IF9fcmVmcykKKyAgICAgOiBmYWNldChfX3JlZnMpLCBfTV9jX2xvY2FsZV9tZXNzYWdlcyhfU19nZXRfY19sb2NhbGUoKSksIAorICAgICAgIF9NX25hbWVfbWVzc2FnZXMoX1NfZ2V0X2NfbmFtZSgpKQorICAgICB7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzPF9DaGFyVD46Om1lc3NhZ2VzKF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsIAorCQkJCXNpemVfdCBfX3JlZnMpIAorICAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2NfbG9jYWxlX21lc3NhZ2VzKDApLCBfTV9uYW1lX21lc3NhZ2VzKDApCisgICAgIHsKKyAgICAgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIF9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwkgeworCSAgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19zKSArIDE7CisJICAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICAgX19idWlsdGluX21lbWNweShfX3RtcCwgX19zLCBfX2xlbik7CisJICAgX01fbmFtZV9tZXNzYWdlcyA9IF9fdG1wOworCSB9CisgICAgICAgZWxzZQorCSBfTV9uYW1lX21lc3NhZ2VzID0gX1NfZ2V0X2NfbmFtZSgpOworCisgICAgICAgLy8gTGFzdCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeSBpZiBuZXcgdGhyb3dzLgorICAgICAgIF9NX2NfbG9jYWxlX21lc3NhZ2VzID0gX1NfY2xvbmVfY19sb2NhbGUoX19jbG9jKTsKKyAgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICB0eXBlbmFtZSBtZXNzYWdlczxfQ2hhclQ+OjpjYXRhbG9nIAorICAgIG1lc3NhZ2VzPF9DaGFyVD46Om9wZW4oY29uc3QgYmFzaWNfc3RyaW5nPGNoYXI+JiBfX3MsIGNvbnN0IGxvY2FsZSYgX19sb2MsIAorCQkJICAgY29uc3QgY2hhciogX19kaXIpIGNvbnN0CisgICAgeyAKKyAgICAgIGJpbmR0ZXh0ZG9tYWluKF9fcy5jX3N0cigpLCBfX2Rpcik7CisgICAgICByZXR1cm4gdGhpcy0+ZG9fb3BlbihfX3MsIF9fbG9jKTsgCisgICAgfQorCisgIC8vIFZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIG1lc3NhZ2VzPF9DaGFyVD46On5tZXNzYWdlcygpCisgICAgeyAKKyAgICAgIGlmIChfTV9uYW1lX21lc3NhZ2VzICE9IF9TX2dldF9jX25hbWUoKSkKKwlkZWxldGUgW10gX01fbmFtZV9tZXNzYWdlczsKKyAgICAgIF9TX2Rlc3Ryb3lfY19sb2NhbGUoX01fY19sb2NhbGVfbWVzc2FnZXMpOyAKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIHR5cGVuYW1lIG1lc3NhZ2VzPF9DaGFyVD46OmNhdGFsb2cgCisgICAgbWVzc2FnZXM8X0NoYXJUPjo6ZG9fb3Blbihjb25zdCBiYXNpY19zdHJpbmc8Y2hhcj4mIF9fcywgCisJCQkgICAgICBjb25zdCBsb2NhbGUmKSBjb25zdAorICAgIHsgCisgICAgICAvLyBObyBlcnJvciBjaGVja2luZyBpcyBkb25lLCBhc3N1bWUgdGhlIGNhdGFsb2cgZXhpc3RzIGFuZCBjYW4KKyAgICAgIC8vIGJlIHVzZWQuCisgICAgICB0ZXh0ZG9tYWluKF9fcy5jX3N0cigpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgdm9pZCAgICAKKyAgICBtZXNzYWdlczxfQ2hhclQ+Ojpkb19jbG9zZShjYXRhbG9nKSBjb25zdCAKKyAgICB7IH0KKworICAgLy8gbWVzc2FnZXNfYnluYW1lCisgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgIG1lc3NhZ2VzX2J5bmFtZTxfQ2hhclQ+OjptZXNzYWdlc19ieW5hbWUoY29uc3QgY2hhciogX19zLCBzaXplX3QgX19yZWZzKQorICAgICA6IG1lc3NhZ2VzPF9DaGFyVD4oX19yZWZzKSAKKyAgICAgeyAKKyAgICAgICBpZiAodGhpcy0+X01fbmFtZV9tZXNzYWdlcyAhPSBsb2NhbGU6OmZhY2V0OjpfU19nZXRfY19uYW1lKCkpCisJIHsKKwkgICBkZWxldGUgW10gdGhpcy0+X01fbmFtZV9tZXNzYWdlczsKKwkgICBpZiAoX19idWlsdGluX3N0cmNtcChfX3MsIGxvY2FsZTo6ZmFjZXQ6Ol9TX2dldF9jX25hbWUoKSkgIT0gMCkKKwkgICAgIHsKKwkgICAgICAgY29uc3Qgc2l6ZV90IF9fbGVuID0gX19idWlsdGluX3N0cmxlbihfX3MpICsgMTsKKwkgICAgICAgY2hhciogX190bXAgPSBuZXcgY2hhcltfX2xlbl07CisJICAgICAgIF9fYnVpbHRpbl9tZW1jcHkoX190bXAsIF9fcywgX19sZW4pOworCSAgICAgICB0aGlzLT5fTV9uYW1lX21lc3NhZ2VzID0gX190bXA7CisJICAgICB9CisJICAgZWxzZQorCSAgICAgdGhpcy0+X01fbmFtZV9tZXNzYWdlcyA9IGxvY2FsZTo6ZmFjZXQ6Ol9TX2dldF9jX25hbWUoKTsKKwkgfQorCisgICAgICAgaWYgKF9fYnVpbHRpbl9zdHJjbXAoX19zLCAiQyIpICE9IDAKKwkgICAmJiBfX2J1aWx0aW5fc3RyY21wKF9fcywgIlBPU0lYIikgIT0gMCkKKwkgeworCSAgIHRoaXMtPl9TX2Rlc3Ryb3lfY19sb2NhbGUodGhpcy0+X01fY19sb2NhbGVfbWVzc2FnZXMpOworCSAgIHRoaXMtPl9TX2NyZWF0ZV9jX2xvY2FsZSh0aGlzLT5fTV9jX2xvY2FsZV9tZXNzYWdlcywgX19zKTsgCisJIH0KKyAgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL29zX2RlZmluZXMuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvb3NfZGVmaW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODhjYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL29zX2RlZmluZXMuaApAQCAtMCwwICsxLDQyIEBACisvLyBTcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgR05VL0xpbnV4ICAtKi0gQysrIC0qLQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL29zX2RlZmluZXMuaAorICogIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVhZGVyIGZpbGUsIGluY2x1ZGVkIGJ5IG90aGVyIGxpYnJhcnkgaGVhZGVycy4KKyAqICBEbyBub3QgYXR0ZW1wdCB0byB1c2UgaXQgZGlyZWN0bHkuIEBoZWFkZXJuYW1le2lvc2Z3ZH0KKyAqLworCisjaWZuZGVmIF9HTElCQ1hYX09TX0RFRklORVMKKyNkZWZpbmUgX0dMSUJDWFhfT1NfREVGSU5FUyAxCisKKy8vIFN5c3RlbS1zcGVjaWZpYyAjZGVmaW5lLCB0eXBlZGVmcywgY29ycmVjdGlvbnMsIGV0YywgZ28gaGVyZS4gIFRoaXMKKy8vIGZpbGUgd2lsbCBjb21lIGJlZm9yZSBhbGwgb3RoZXJzLgorCisvLyBUaGlzIGtlZXBzIGlzYW51bSwgZXQgYWwgZnJvbSBiZWluZyBwcm9wYWdhdGVkIGFzIG1hY3Jvcy4KKyNkZWZpbmUgX19OT19DVFlQRSAxCisKKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvc3RkYysrLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL3N0ZGMrKy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGE2NTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL3N0ZGMrKy5oCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDKysgaW5jbHVkZXMgdXNlZCBmb3IgcHJlY29tcGlsaW5nIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMAorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBJU08gQysrIExpYnJhcnkuICBUaGlzIGxpYnJhcnkgaXMgZnJlZQorLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisvLyB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorLy8gRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCisvLyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworLy8gVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVW5kZXIgU2VjdGlvbiA3IG9mIEdQTCB2ZXJzaW9uIDMsIHlvdSBhcmUgZ3JhbnRlZCBhZGRpdGlvbmFsCisvLyBwZXJtaXNzaW9ucyBkZXNjcmliZWQgaW4gdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uLCB2ZXJzaW9uCisvLyAzLjEsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisvLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbmQKKy8vIGEgY29weSBvZiB0aGUgR0NDIFJ1bnRpbWUgTGlicmFyeSBFeGNlcHRpb24gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07CisvLyBzZWUgdGhlIGZpbGVzIENPUFlJTkczIGFuZCBDT1BZSU5HLlJVTlRJTUUgcmVzcGVjdGl2ZWx5LiAgSWYgbm90LCBzZWUKKy8vIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworLyoqIEBmaWxlIHN0ZGMrKy5oCisgKiAgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlIGZvciBhIHByZWNvbXBpbGVkIGhlYWRlci4KKyAqLworCisvLyAxNy40LjEuMiBIZWFkZXJzCisKKy8vIEMKKyNpZm5kZWYgX0dMSUJDWFhfTk9fQVNTRVJUCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNlbmRpZgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjZXJybm8+CisjaW5jbHVkZSA8Y2Zsb2F0PgorI2luY2x1ZGUgPGNpc282NDY+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjbG9jYWxlPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzZXRqbXA+CisjaW5jbHVkZSA8Y3NpZ25hbD4KKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjdGltZT4KKworI2lmZGVmIF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fCisjaW5jbHVkZSA8Y2NvbXBsZXg+CisjaW5jbHVkZSA8Y2ZlbnY+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPGNzdGRib29sPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3RnbWF0aD4KKyNpbmNsdWRlIDxjd2NoYXI+CisjaW5jbHVkZSA8Y3djdHlwZT4KKyNlbmRpZgorCisvLyBDKysKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGNvbXBsZXg+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZXhjZXB0aW9uPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvcz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFsYXJyYXk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxmb3J3YXJkX2xpc3Q+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHJhdGlvPgorI2luY2x1ZGUgPHJlZ2V4PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZWluZGV4PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2luY2x1ZGUvYysrLzQuNi54LWdvb2dsZS94ODZfNjQtbGludXgvYml0cy9zdGR0cjFjKysuaCBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvc3RkdHIxYysrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkOWNiNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvc3RkdHIxYysrLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQysrIGluY2x1ZGVzIHVzZWQgZm9yIHByZWNvbXBpbGluZyBUUjEgLSotIEMrKyAtKi0KKworLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBzdGR0cjFjKysuaAorICogIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgYSBwcmVjb21waWxlZCBoZWFkZXIuCisgKi8KKworI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CisKKyNpbmNsdWRlIDx0cjEvYXJyYXk+CisjaW5jbHVkZSA8dHIxL2NjdHlwZT4KKyNpbmNsdWRlIDx0cjEvY2ZlbnY+CisjaW5jbHVkZSA8dHIxL2NmbG9hdD4KKyNpbmNsdWRlIDx0cjEvY2ludHR5cGVzPgorI2luY2x1ZGUgPHRyMS9jbGltaXRzPgorI2luY2x1ZGUgPHRyMS9jbWF0aD4KKyNpbmNsdWRlIDx0cjEvY29tcGxleD4KKyNpbmNsdWRlIDx0cjEvY3N0ZGFyZz4KKyNpbmNsdWRlIDx0cjEvY3N0ZGJvb2w+CisjaW5jbHVkZSA8dHIxL2NzdGRpbnQ+CisjaW5jbHVkZSA8dHIxL2NzdGRpbz4KKyNpbmNsdWRlIDx0cjEvY3N0ZGxpYj4KKyNpbmNsdWRlIDx0cjEvY3RnbWF0aD4KKyNpbmNsdWRlIDx0cjEvY3RpbWU+CisjaW5jbHVkZSA8dHIxL2N3Y2hhcj4KKyNpbmNsdWRlIDx0cjEvY3djdHlwZT4KKyNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx0cjEvcmFuZG9tPgorI2luY2x1ZGUgPHRyMS90dXBsZT4KKyNpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx0cjEvdXRpbGl0eT4KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9pbmNsdWRlL2MrKy80LjYueC1nb29nbGUveDg2XzY0LWxpbnV4L2JpdHMvdGltZV9tZW1iZXJzLmggYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL3RpbWVfbWVtYmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOGUwZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvaW5jbHVkZS9jKysvNC42LngtZ29vZ2xlL3g4Nl82NC1saW51eC9iaXRzL3RpbWVfbWVtYmVycy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vIHN0ZDo6dGltZV9nZXQsIHN0ZDo6dGltZV9wdXQgaW1wbGVtZW50YXRpb24sIEdOVSB2ZXJzaW9uIC0qLSBDKysgLSotCisKKy8vIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwKKy8vIDIwMDksIDIwMTAKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorLy8KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKKy8vIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorLy8gdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKy8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQorLy8gYW55IGxhdGVyIHZlcnNpb24uCisKKy8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFVuZGVyIFNlY3Rpb24gNyBvZiBHUEwgdmVyc2lvbiAzLCB5b3UgYXJlIGdyYW50ZWQgYWRkaXRpb25hbAorLy8gcGVybWlzc2lvbnMgZGVzY3JpYmVkIGluIHRoZSBHQ0MgUnVudGltZSBMaWJyYXJ5IEV4Y2VwdGlvbiwgdmVyc2lvbgorLy8gMy4xLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kCisvLyBhIGNvcHkgb2YgdGhlIEdDQyBSdW50aW1lIExpYnJhcnkgRXhjZXB0aW9uIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOworLy8gc2VlIHRoZSBmaWxlcyBDT1BZSU5HMyBhbmQgQ09QWUlORy5SVU5USU1FIHJlc3BlY3RpdmVseS4gIElmIG5vdCwgc2VlCisvLyA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKy8qKiBAZmlsZSBiaXRzL3RpbWVfbWVtYmVycy5oCisgKiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWFkZXIgZmlsZSwgaW5jbHVkZWQgYnkgb3RoZXIgbGlicmFyeSBoZWFkZXJzLgorICogIERvIG5vdCBhdHRlbXB0IHRvIHVzZSBpdCBkaXJlY3RseS4gQGhlYWRlcm5hbWV7bG9jYWxlfQorICovCisKKy8vCisvLyBJU08gQysrIDE0ODgyOiAyMi4yLjUuMS4yIC0gdGltZV9nZXQgZnVuY3Rpb25zCisvLyBJU08gQysrIDE0ODgyOiAyMi4yLjUuMy4yIC0gdGltZV9wdXQgZnVuY3Rpb25zCisvLworCisvLyBXcml0dGVuIGJ5IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorCituYW1lc3BhY2Ugc3RkIF9HTElCQ1hYX1ZJU0lCSUxJVFkoZGVmYXVsdCkKK3sKK19HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0PF9DaGFyVD46Ol9fdGltZXB1bmN0KHNpemVfdCBfX3JlZnMpIAorICAgIDogZmFjZXQoX19yZWZzKSwgX01fZGF0YSgwKSwgX01fY19sb2NhbGVfdGltZXB1bmN0KDApLCAKKyAgICAgIF9NX25hbWVfdGltZXB1bmN0KF9TX2dldF9jX25hbWUoKSkKKyAgICB7IF9NX2luaXRpYWxpemVfdGltZXB1bmN0KCk7IH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2hhclQ+CisgICAgX190aW1lcHVuY3Q8X0NoYXJUPjo6X190aW1lcHVuY3QoX19jYWNoZV90eXBlKiBfX2NhY2hlLCBzaXplX3QgX19yZWZzKSAKKyAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoX19jYWNoZSksIF9NX2NfbG9jYWxlX3RpbWVwdW5jdCgwKSwgCisgICAgICBfTV9uYW1lX3RpbWVwdW5jdChfU19nZXRfY19uYW1lKCkpCisgICAgeyBfTV9pbml0aWFsaXplX3RpbWVwdW5jdCgpOyB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJUPgorICAgIF9fdGltZXB1bmN0PF9DaGFyVD46Ol9fdGltZXB1bmN0KF9fY19sb2NhbGUgX19jbG9jLCBjb25zdCBjaGFyKiBfX3MsCisJCQkJICAgICBzaXplX3QgX19yZWZzKSAKKyAgICA6IGZhY2V0KF9fcmVmcyksIF9NX2RhdGEoMCksIF9NX2NfbG9jYWxlX3RpbWVwdW5jdCgwKSwgCisgICAgICBfTV9uYW1lX3RpbWVwdW5jdCgwKQorICAgIHsKKyAgICAgIGlmIChfX2J1aWx0aW5fc3RyY21wKF9fcywgX1NfZ2V0X2NfbmFtZSgpKSAhPSAwKQorCXsKKwkgIGNvbnN0IHNpemVfdCBfX2xlbiA9IF9fYnVpbHRpbl9zdHJsZW4oX19zKSArIDE7CisJICBjaGFyKiBfX3RtcCA9IG5ldyBjaGFyW19fbGVuXTsKKwkgIF9fYnVpbHRpbl9tZW1jcHkoX190bXAsIF9fcywgX19sZW4pOworCSAgX01fbmFtZV90aW1lcHVuY3QgPSBfX3RtcDsKKwl9CisgICAgICBlbHNlCisJX01fbmFtZV90aW1lcHVuY3QgPSBfU19nZXRfY19uYW1lKCk7CisKKyAgICAgIF9fdHJ5CisJeyBfTV9pbml0aWFsaXplX3RpbWVwdW5jdChfX2Nsb2MpOyB9CisgICAgICBfX2NhdGNoKC4uLikKKwl7CisJICBpZiAoX01fbmFtZV90aW1lcHVuY3QgIT0gX1NfZ2V0X2NfbmFtZSgpKQorCSAgICBkZWxldGUgW10gX01fbmFtZV90aW1lcHVuY3Q7CisJICBfX3Rocm93X2V4Y2VwdGlvbl9hZ2FpbjsKKwl9CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVD4KKyAgICBfX3RpbWVwdW5jdDxfQ2hhclQ+Ojp+X190aW1lcHVuY3QoKQorICAgIHsgCisgICAgICBpZiAoX01fbmFtZV90aW1lcHVuY3QgIT0gX1NfZ2V0X2NfbmFtZSgpKQorCWRlbGV0ZSBbXSBfTV9uYW1lX3RpbWVwdW5jdDsKKyAgICAgIGRlbGV0ZSBfTV9kYXRhOyAKKyAgICAgIF9TX2Rlc3Ryb3lfY19sb2NhbGUoX01fY19sb2NhbGVfdGltZXB1bmN0KTsgCisgICAgfQorCitfR0xJQkNYWF9FTkRfTkFNRVNQQUNFX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhkZDYyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueApAQCAtMCwwICsxLDE5MyBAQAorLyogRGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBmb3Igbm9ybWFsIGV4ZWN1dGFibGVzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHgwODA0ODAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHgwODA0ODAwMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMTIsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54Ym4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54Ym4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkYzhjMAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhibgpAQCAtMCwwICsxLDE5MSBAQAorLyogU2NyaXB0IGZvciAtTjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlOyBkb24ndCBhbGlnbiBkYXRhICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHgwODA0ODAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHgwODA0ODAwMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IC47CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54YyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTZmNWUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54YwpAQCAtMCwwICsxLDE5NiBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2M6IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDA4MDQ4MDAwKSk7IC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDA4MDQ4MDAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgxMiwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjYTM4MgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkCkBAIC0wLDAgKzEsMTkzIEBACisvKiBTY3JpcHQgZm9yIGxkIC1waWU6IGxpbmsgcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliIik7IFNFQVJDSF9ESVIoIj0vbGliIik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYiIpOworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmluaXQgICAgICAgOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWwudGV4dCAgICAgICA6IHsgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWwuZmluaSAgICAgICA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAgIDogeyAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gICA6IHsgKigucmVsLmRhdGEucmVsLnJvKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWwuZGF0YSAgICAgICA6IHsgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWwudGRhdGEJICA6IHsgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWwudGJzcwkgIDogeyAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWwuY3RvcnMgICAgICA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgICA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgICA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgICAgOiB7ICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbC5pZnVuYyAgICAgIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgxMiwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkYyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM4Mzc4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueGRjCkBAIC0wLDAgKzEsMTk2IEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5keW4gICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwuaW5pdCkKKyAgICAgICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbC5maW5pKQorICAgICAgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbC5kYXRhLnJlbC5ybyogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikKKyAgICAgICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWwuY3RvcnMpCisgICAgICAqKC5yZWwuZHRvcnMpCisgICAgICAqKC5yZWwuZ290KQorICAgICAgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbC5pZnVuYykKKyAgICB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWwuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMTIsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZHcgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54ZHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNWUwNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhkdwpAQCAtMCwwICsxLDE5NSBAQAorLyogU2NyaXB0IGZvciAtcGllIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorRU5UUlkoX3N0YXJ0KQorU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliIik7IFNFQVJDSF9ESVIoIj0vbGliIik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYiIpOworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhuIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4ZTk1MAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhuCkBAIC0wLDAgKzEsMTkzIEBACisvKiBTY3JpcHQgZm9yIC1uOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDA4MDQ4MDAwKSk7IC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDA4MDQ4MDAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmluaXQgICAgICAgOiB7ICooLnJlbC5pbml0KSB9CisgIC5yZWwudGV4dCAgICAgICA6IHsgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWwuZmluaSAgICAgICA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAgIDogeyAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gICA6IHsgKigucmVsLmRhdGEucmVsLnJvKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWwuZGF0YSAgICAgICA6IHsgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWwudGRhdGEJICA6IHsgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWwudGJzcwkgIDogeyAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWwuY3RvcnMgICAgICA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgICA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgICA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgICAgOiB7ICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbC5pZnVuYyAgICAgIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgxMiwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhyIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzZjc4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhyCkBAIC0wLDAgKzEsMTI3IEBACisvKiBTY3JpcHQgZm9yIGxkIC1yOiBsaW5rIHdpdGhvdXQgcmVsb2NhdGlvbiAqLworT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwKKwkgICAgICAiZWxmMzItaTM4NiIpCitPVVRQVVRfQVJDSChpMzg2KQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAwIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgIDAgOiB7ICooLnJlbC50ZXh0KSB9CisgIC5yZWwuZmluaSAgICAgMCA6IHsgKigucmVsLmZpbmkpIH0KKyAgLnJlbC5yb2RhdGEgICAwIDogeyAqKC5yZWwucm9kYXRhKSB9CisgIC5yZWwuZGF0YS5yZWwucm8gMCA6IHsgKigucmVsLmRhdGEucmVsLnJvKSB9CisgIC5yZWwuZGF0YSAgICAgMCA6IHsgKigucmVsLmRhdGEpIH0KKyAgLnJlbC50ZGF0YQkwIDogeyAqKC5yZWwudGRhdGEpIH0KKyAgLnJlbC50YnNzCTAgOiB7ICooLnJlbC50YnNzKSB9CisgIC5yZWwuY3RvcnMgICAgMCA6IHsgKigucmVsLmN0b3JzKSB9CisgIC5yZWwuZHRvcnMgICAgMCA6IHsgKigucmVsLmR0b3JzKSB9CisgIC5yZWwuZ290ICAgICAgMCA6IHsgKigucmVsLmdvdCkgfQorICAucmVsLmJzcyAgICAgIDAgOiB7ICooLnJlbC5ic3MpIH0KKyAgLnJlbC5pZnVuYyAgICAwIDogeyAqKC5yZWwuaWZ1bmMpIH0KKyAgLnJlbC5wbHQgICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHMgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE3YzI5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHMKQEAgLTAsMCArMSwxODQgQEAKKy8qIFNjcmlwdCBmb3IgbGQgLS1zaGFyZWQ6IGxpbmsgc2hhcmVkIGxpYnJhcnkgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5pbml0ICAgICAgIDogeyAqKC5yZWwuaW5pdCkgfQorICAucmVsLnRleHQgICAgICAgOiB7ICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsLmZpbmkgICAgICAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgICA6IHsgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybyogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsLmRhdGEgICAgICAgOiB7ICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsLnRkYXRhCSAgOiB7ICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsLnRic3MJICA6IHsgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsLmN0b3JzICAgICAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgICAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgICAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAgIDogeyAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWwuaWZ1bmMgICAgICA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgICooLnJlbC5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMTIsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c2MgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3ZWNmZgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzYwpAQCAtMCwwICsxLDE4NyBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbC5keW4gICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwuaW5pdCkKKyAgICAgICooLnJlbC50ZXh0IC5yZWwudGV4dC4qIC5yZWwuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbC5maW5pKQorICAgICAgKigucmVsLnJvZGF0YSAucmVsLnJvZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbC5kYXRhLnJlbC5ybyogLnJlbC5nbnUubGlua29uY2UuZC5yZWwucm8uKikKKyAgICAgICooLnJlbC5kYXRhIC5yZWwuZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbC50ZGF0YSAucmVsLnRkYXRhLiogLnJlbC5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbC50YnNzIC5yZWwudGJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWwuY3RvcnMpCisgICAgICAqKC5yZWwuZHRvcnMpCisgICAgICAqKC5yZWwuZ290KQorICAgICAgKigucmVsLmJzcyAucmVsLmJzcy4qIC5yZWwuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbC5pZnVuYykKKyAgICB9CisgIC5yZWwucGx0ICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICAgICooLnJlbC5pcGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMTIsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyAzMiAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oMzIgLyA4KTsKKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c3cgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwNTYyMQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2LnhzdwpAQCAtMCwwICsxLDE4NiBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBzaGFyZWQgbGlicmFyeSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLAorCSAgICAgICJlbGYzMi1pMzg2IikKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuZHluICAgICAgICA6CisgICAgeworICAgICAgKigucmVsLmluaXQpCisgICAgICAqKC5yZWwudGV4dCAucmVsLnRleHQuKiAucmVsLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWwuZmluaSkKKyAgICAgICooLnJlbC5yb2RhdGEgLnJlbC5yb2RhdGEuKiAucmVsLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWwuZGF0YS5yZWwucm8qIC5yZWwuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopCisgICAgICAqKC5yZWwuZGF0YSAucmVsLmRhdGEuKiAucmVsLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWwudGRhdGEgLnJlbC50ZGF0YS4qIC5yZWwuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWwudGJzcyAucmVsLnRic3MuKiAucmVsLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsLmN0b3JzKQorICAgICAgKigucmVsLmR0b3JzKQorICAgICAgKigucmVsLmdvdCkKKyAgICAgICooLnJlbC5ic3MgLnJlbC5ic3MuKiAucmVsLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWwuaWZ1bmMpCisgICAgfQorICAucmVsLnBsdCAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5wbHQpCisgICAgICAqKC5yZWwuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gMzIgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDMyIC8gOCk7CisgIC4gPSBBTElHTigzMiAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHUgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfaTM4Ni54dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNlNjNmCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHUKQEAgLTAsMCArMSwxMjggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLVVyOiBsaW5rIHcvb3V0IHJlbG9jYXRpb24sIGRvIGNyZWF0ZSBjb25zdHJ1Y3RvcnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKKyAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKKyAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKKyAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKKyAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC5pbnRlcnAgICAgICAgMCA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAwIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgMCA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAwIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAwIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAwIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAwOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgMDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWwuaW5pdCAgICAgMCA6IHsgKigucmVsLmluaXQpIH0KKyAgLnJlbC50ZXh0ICAgICAwIDogeyAqKC5yZWwudGV4dCkgfQorICAucmVsLmZpbmkgICAgIDAgOiB7ICooLnJlbC5maW5pKSB9CisgIC5yZWwucm9kYXRhICAgMCA6IHsgKigucmVsLnJvZGF0YSkgfQorICAucmVsLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbC5kYXRhLnJlbC5ybykgfQorICAucmVsLmRhdGEgICAgIDAgOiB7ICooLnJlbC5kYXRhKSB9CisgIC5yZWwudGRhdGEJMCA6IHsgKigucmVsLnRkYXRhKSB9CisgIC5yZWwudGJzcwkwIDogeyAqKC5yZWwudGJzcykgfQorICAucmVsLmN0b3JzICAgIDAgOiB7ICooLnJlbC5jdG9ycykgfQorICAucmVsLmR0b3JzICAgIDAgOiB7ICooLnJlbC5kdG9ycykgfQorICAucmVsLmdvdCAgICAgIDAgOiB7ICooLnJlbC5nb3QpIH0KKyAgLnJlbC5ic3MgICAgICAwIDogeyAqKC5yZWwuYnNzKSB9CisgIC5yZWwuaWZ1bmMgICAgMCA6IHsgKigucmVsLmlmdW5jKSB9CisgIC5yZWwucGx0ICAgICAgMCA6CisgICAgeworICAgICAgKigucmVsLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2Lnh3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2kzODYueHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyZjk0NgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9pMzg2Lnh3CkBAIC0wLDAgKzEsMTk1IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsCisJICAgICAgImVsZjMyLWkzODYiKQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDA4MDQ4MDAwKSk7IC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDA4MDQ4MDAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsLmR5biAgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbC5pbml0KQorICAgICAgKigucmVsLnRleHQgLnJlbC50ZXh0LiogLnJlbC5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsLmZpbmkpCisgICAgICAqKC5yZWwucm9kYXRhIC5yZWwucm9kYXRhLiogLnJlbC5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsLmRhdGEucmVsLnJvKiAucmVsLmdudS5saW5rb25jZS5kLnJlbC5yby4qKQorICAgICAgKigucmVsLmRhdGEgLnJlbC5kYXRhLiogLnJlbC5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsLnRkYXRhIC5yZWwudGRhdGEuKiAucmVsLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsLnRic3MgLnJlbC50YnNzLiogLnJlbC5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbC5jdG9ycykKKyAgICAgICooLnJlbC5kdG9ycykKKyAgICAgICooLnJlbC5nb3QpCisgICAgICAqKC5yZWwuYnNzIC5yZWwuYnNzLiogLnJlbC5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsLmlmdW5jKQorICAgIH0KKyAgLnJlbC5wbHQgICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWwucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbC5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDMyIC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTigzMiAvIDgpOworICAuID0gQUxJR04oMzIgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnggYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjBjMTMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54CkBAIC0wLDAgKzEsMjEzIEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDI0LCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhibiBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhibgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJiM2JiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGJuCkBAIC0wLDAgKzEsMjExIEBACisvKiBTY3JpcHQgZm9yIC1OOiBtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2U7IGRvbid0IGFsaWduIGRhdGEgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSAuOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5YWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhjCkBAIC0wLDAgKzEsMjE0IEBACisvKiBTY3JpcHQgZm9yIC16IGNvbWJyZWxvYzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDB4NDAwMDAwKSk7IC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X3N0YXJ0ID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9lbmQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgyNCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjJkNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZApAQCAtMCwwICsxLDIxMyBAQAorLyogU2NyaXB0IGZvciBsZCAtcGllOiBsaW5rIHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMjQsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGRjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGRjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTM5NzUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54ZGMKQEAgLTAsMCArMSwyMTQgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2M6IHBvc2l0aW9uIGluZGVwZW5kZW50IGV4ZWN1dGFibGUsIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDI0LCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkdyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhkdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdmYTU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueGR3CkBAIC0wLDAgKzEsMjEzIEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSwgY29tYmluZSAmIHNvcnQgcmVsb2NzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxfaXBsdF9zdGFydCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfZW5kID0gLik7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueG4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODRmNjU0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueG4KQEAgLTAsMCArMSwyMTMgQEAKKy8qIFNjcmlwdCBmb3IgLW46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIFBST1ZJREUgKF9fZXhlY3V0YWJsZV9zdGFydCA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDB4NDAwMDAwKSk7IC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaXBsdCAgICAgIDoKKyAgICB7CisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMjQsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHIgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFlNzFiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHIKQEAgLTAsMCArMSwxNDggQEAKKy8qIFNjcmlwdCBmb3IgbGQgLXI6IGxpbmsgd2l0aG91dCByZWxvY2F0aW9uICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaXBsdCAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgMCA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgIDAgOgorICB7CisgICAgKigudGV4dCAuc3R1YikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnJvZGF0YSAgICAgICAwIDogeyAqKC5yb2RhdGEpIH0KKyAgLnJvZGF0YTEgICAgICAwIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkwIDogeyAqKC50ZGF0YSkgfQorICAudGJzcwkJMCA6IHsgKigudGJzcykgfQorICAucHJlaW5pdF9hcnJheSAgIDAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmpjciAgICAgICAgICAwIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5keW5hbWljICAgICAgMCA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgIDAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuZ290LnBsdCAgICAgIDAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgIDAgOgorICB7CisgICAgKiguZGF0YSkKKyAgfQorICAuZGF0YTEgICAgICAgIDAgOiB7ICooLmRhdGExKSB9CisgIC5ic3MgICAgICAgICAgMCA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgIH0KKyAgLmxic3MgMCA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MpCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLmxyb2RhdGEgMCAgOgorICB7CisgICAgKigubHJvZGF0YSkKKyAgfQorICAubGRhdGEgMCAgOgorICB7CisgICAgKigubGRhdGEpCisgIH0KKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjYTMxMgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzCkBAIC0wLDAgKzEsMjA0IEBACisvKiBTY3JpcHQgZm9yIGxkIC0tc2hhcmVkOiBsaW5rIHNoYXJlZCBsaWJyYXJ5ICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlwbHQgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgyNCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c2MgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1NTMxNAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnhzYwpAQCAtMCwwICsxLDIwMyBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LWwxb20iLCAiZWxmNjQtbDFvbSIsCisJICAgICAgImVsZjY0LWwxb20iKQorT1VUUFVUX0FSQ0gobDFvbSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuZHluICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLmluaXQpCisgICAgICAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopCisgICAgICAqKC5yZWxhLmZpbmkpCisgICAgICAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKQorICAgICAgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKQorICAgICAgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKQorICAgICAgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikKKyAgICAgICooLnJlbGEuY3RvcnMpCisgICAgICAqKC5yZWxhLmR0b3JzKQorICAgICAgKigucmVsYS5nb3QpCisgICAgICAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKQorICAgICAgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopCisgICAgICAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKQorICAgICAgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpIH0KKyAgLmlwbHQgICAgICAgICAgIDogeyAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMjQsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHN3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX2wxb20ueHN3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTQyMGQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54c3cKQEAgLTAsMCArMSwyMDIgQEAKKy8qIFNjcmlwdCBmb3IgLS1zaGFyZWQgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogc2hhcmVkIGxpYnJhcnksIGNvbWJpbmUgJiBzb3J0IHJlbG9jcyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAwKSArIFNJWkVPRl9IRUFERVJTOworICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgICAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguaWdvdC5wbHQpICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMCwgLik7CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dSBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODIwMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dQpAQCAtMCwwICsxLDE0OSBAQAorLyogU2NyaXB0IGZvciBsZCAtVXI6IGxpbmsgdy9vdXQgcmVsb2NhdGlvbiwgZG8gY3JlYXRlIGNvbnN0cnVjdG9ycyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQtbDFvbSIsICJlbGY2NC1sMW9tIiwKKwkgICAgICAiZWxmNjQtbDFvbSIpCitPVVRQVVRfQVJDSChsMW9tKQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlwbHQgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5pcGx0KQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAwIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgIDAgOiB7ICooLnBsdCkgfQorICAuaXBsdCAgICAgICAgIDAgOiB7ICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICB9CisgIC5sYnNzIDAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC5scm9kYXRhIDAgIDoKKyAgeworICAgICooLmxyb2RhdGEpCisgIH0KKyAgLmxkYXRhIDAgIDoKKyAgeworICAgICooLmxkYXRhKQorICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl9sMW9tLnh3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfbDFvbS54dwpAQCAtMCwwICsxLDIxMyBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBjb21iaW5lIGFuZCBzb3J0IHJlbG9jIHNlY3Rpb25zICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC1sMW9tIiwgImVsZjY0LWwxb20iLAorCSAgICAgICJlbGY2NC1sMW9tIikKK09VVFBVVF9BUkNIKGwxb20pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApKTsgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDB4NDAwMDAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbF9pcGx0X2VuZCA9IC4pOworICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSB9CisgIC5pcGx0ICAgICAgICAgICA6IHsgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueCBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk1MzkyCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54CkBAIC0wLDAgKzEsMjExIEBACisvKiBEZWZhdWx0IGxpbmtlciBzY3JpcHQsIGZvciBub3JtYWwgZXhlY3V0YWJsZXMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi94ODZfNjQtbGludXgvbGliNjQiKTsgU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliNjQiKTsgU0VBUkNIX0RJUigiPS9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApKTsgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDB4NDAwMDAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgICAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgICAgOiB7ICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikgfQorICAucmVsYS5maW5pICAgICAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgICAgOiB7ICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJlbGEuZGF0YS5yZWwucm8gICA6IHsgKigucmVsYS5kYXRhLnJlbC5ybyogLnJlbGEuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLnJlbGEuZGF0YSAgICAgIDogeyAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopIH0KKyAgLnJlbGEudGRhdGEJICA6IHsgKigucmVsYS50ZGF0YSAucmVsYS50ZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC5yZWxhLnRic3MJICA6IHsgKigucmVsYS50YnNzIC5yZWxhLnRic3MuKiAucmVsYS5nbnUubGlua29uY2UudGIuKikgfQorICAucmVsYS5jdG9ycyAgICAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAgIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgICA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAgIDogeyAqKC5yZWxhLmJzcyAucmVsYS5ic3MuKiAucmVsYS5nbnUubGlua29uY2UuYi4qKSB9CisgIC5yZWxhLmxkYXRhICAgICA6IHsgKigucmVsYS5sZGF0YSAucmVsYS5sZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sLiopIH0KKyAgLnJlbGEubGJzcyAgICAgIDogeyAqKC5yZWxhLmxic3MgLnJlbGEubGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5sYi4qKSB9CisgIC5yZWxhLmxyb2RhdGEgICA6IHsgKigucmVsYS5scm9kYXRhIC5yZWxhLmxyb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2UubHIuKikgfQorICAucmVsYS5pZnVuYyAgICAgOiB7ICooLnJlbGEuaWZ1bmMpIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMjQsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54Ym4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhibgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM0OWZjCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54Ym4KQEAgLTAsMCArMSwyMDkgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIi90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gLjsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEyZGJhCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54YwpAQCAtMCwwICsxLDIxMyBAQAorLyogU2NyaXB0IGZvciAteiBjb21icmVsb2M6IGNvbWJpbmUgYW5kIHNvcnQgcmVsb2Mgc2VjdGlvbnMgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi94ODZfNjQtbGludXgvbGliNjQiKTsgU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliNjQiKTsgU0VBUkNIX0RJUigiPS9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgUFJPVklERSAoX19leGVjdXRhYmxlX3N0YXJ0ID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApKTsgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDB4NDAwMDAwKSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwICAgICAgICAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgICAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgICA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgICA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgICA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgIDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yICA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5keW4gICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEuaW5pdCkKKyAgICAgICooLnJlbGEudGV4dCAucmVsYS50ZXh0LiogLnJlbGEuZ251LmxpbmtvbmNlLnQuKikKKyAgICAgICooLnJlbGEuZmluaSkKKyAgICAgICooLnJlbGEucm9kYXRhIC5yZWxhLnJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5yLiopCisgICAgICAqKC5yZWxhLmRhdGEgLnJlbGEuZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5kLiopCisgICAgICAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopCisgICAgICAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKQorICAgICAgKigucmVsYS5jdG9ycykKKyAgICAgICooLnJlbGEuZHRvcnMpCisgICAgICAqKC5yZWxhLmdvdCkKKyAgICAgICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopCisgICAgICAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikKKyAgICAgICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopCisgICAgICAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKQorICAgICAgKigucmVsYS5pZnVuYykKKyAgICB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDI0LCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGQgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWVhYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkCkBAIC0wLDAgKzEsMjExIEBACisvKiBTY3JpcHQgZm9yIGxkIC1waWU6IGxpbmsgcG9zaXRpb24gaW5kZXBlbmRlbnQgZXhlY3V0YWJsZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIi90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCAgICAgICAgIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfc3RhcnQgPSAuKTsKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9lbmQgPSAuKTsKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9lbmQgPSAuKTsKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDI0LCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGRjIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkZjI2YgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueGRjCkBAIC0wLDAgKzEsMjEzIEBACisvKiBTY3JpcHQgZm9yIC1waWUgLXogY29tYnJlbG9jOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi94ODZfNjQtbGludXgvbGliNjQiKTsgU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliNjQiKTsgU0VBUkNIX0RJUigiPS9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdCkgKiguaWdvdCkgfQorICAuID0gREFUQV9TRUdNRU5UX1JFTFJPX0VORCAoMjQsIC4pOworICAuZ290LnBsdCAgICAgICAgOiB7ICooLmdvdC5wbHQpICAqKC5pZ290LnBsdCkgfQorICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZHcgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhkdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEwZTMzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54ZHcKQEAgLTAsMCArMSwyMTIgQEAKKy8qIFNjcmlwdCBmb3IgLXBpZSAteiBjb21icmVsb2MgLXogbm93IC16IHJlbHJvOiBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlLCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi94ODZfNjQtbGludXgvbGliNjQiKTsgU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliNjQiKTsgU0VBUkNIX0RJUigiPS9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54biBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2YTZiNgotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueG4KQEAgLTAsMCArMSwyMTEgQEAKKy8qIFNjcmlwdCBmb3IgLW46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIi90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmluaXQgICAgICA6IHsgKigucmVsYS5pbml0KSB9CisgIC5yZWxhLnRleHQgICAgICA6IHsgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKSB9CisgIC5yZWxhLmZpbmkgICAgICA6IHsgKigucmVsYS5maW5pKSB9CisgIC5yZWxhLnJvZGF0YSAgICA6IHsgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikgfQorICAucmVsYS5kYXRhLnJlbC5ybyAgIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKiAucmVsYS5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAucmVsYS5kYXRhICAgICAgOiB7ICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikgfQorICAucmVsYS50ZGF0YQkgIDogeyAqKC5yZWxhLnRkYXRhIC5yZWxhLnRkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnJlbGEudGJzcwkgIDogeyAqKC5yZWxhLnRic3MgLnJlbGEudGJzcy4qIC5yZWxhLmdudS5saW5rb25jZS50Yi4qKSB9CisgIC5yZWxhLmN0b3JzICAgICA6IHsgKigucmVsYS5jdG9ycykgfQorICAucmVsYS5kdG9ycyAgICAgOiB7ICooLnJlbGEuZHRvcnMpIH0KKyAgLnJlbGEuZ290ICAgICAgIDogeyAqKC5yZWxhLmdvdCkgfQorICAucmVsYS5ic3MgICAgICAgOiB7ICooLnJlbGEuYnNzIC5yZWxhLmJzcy4qIC5yZWxhLmdudS5saW5rb25jZS5iLiopIH0KKyAgLnJlbGEubGRhdGEgICAgIDogeyAqKC5yZWxhLmxkYXRhIC5yZWxhLmxkYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmwuKikgfQorICAucmVsYS5sYnNzICAgICAgOiB7ICooLnJlbGEubGJzcyAucmVsYS5sYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmxiLiopIH0KKyAgLnJlbGEubHJvZGF0YSAgIDogeyAqKC5yZWxhLmxyb2RhdGEgLnJlbGEubHJvZGF0YS4qIC5yZWxhLmdudS5saW5rb25jZS5sci4qKSB9CisgIC5yZWxhLmlmdW5jICAgICA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgICAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X3N0YXJ0ID0gLik7CisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgICBQUk9WSURFX0hJRERFTiAoX19yZWxhX2lwbHRfZW5kID0gLik7CisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmluaXRfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmluaXRfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKFNPUlQoLmZpbmlfYXJyYXkuKikpKQorICAgIEtFRVAgKCooLmZpbmlfYXJyYXkpKQorICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgyNCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhyIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZjYTZiCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cgpAQCAtMCwwICsxLDE0NCBAQAorLyogU2NyaXB0IGZvciBsZCAtcjogbGluayB3aXRob3V0IHJlbG9jYXRpb24gKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCisgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgU29sYXJpcyBsaW5rZXIgbWFrZXMgYmFkIGV4ZWN1dGFibGVzCisgIGlmIGdsZCAtciBpcyB1c2VkIGFuZCB0aGUgaW50ZXJtZWRpYXRlIGZpbGUgaGFzIHNlY3Rpb25zIHN0YXJ0aW5nCisgIGF0IG5vbi16ZXJvIGFkZHJlc3Nlcy4gIENvdWxkIGJlIGEgU29sYXJpcyBsZCBidWcsIGNvdWxkIGJlIGEgR05VIGxkCisgIGJ1Zy4gIEJ1dCBmb3Igbm93IGFzc2lnbmluZyB0aGUgemVybyB2bWFzIHdvcmtzLiAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwICAgICAgIDAgOiB7ICooLmludGVycCkgfQorICAubm90ZS5nbnUuYnVpbGQtaWQgOiB7ICooLm5vdGUuZ251LmJ1aWxkLWlkKSB9CisgIC5oYXNoICAgICAgICAgMCA6IHsgKiguaGFzaCkgfQorICAuZ251Lmhhc2ggICAgIDAgOiB7ICooLmdudS5oYXNoKSB9CisgIC5keW5zeW0gICAgICAgMCA6IHsgKiguZHluc3ltKSB9CisgIC5keW5zdHIgICAgICAgMCA6IHsgKiguZHluc3RyKSB9CisgIC5nbnUudmVyc2lvbiAgMCA6IHsgKiguZ251LnZlcnNpb24pIH0KKyAgLmdudS52ZXJzaW9uX2QgMDogeyAqKC5nbnUudmVyc2lvbl9kKSB9CisgIC5nbnUudmVyc2lvbl9yIDA6IHsgKiguZ251LnZlcnNpb25fcikgfQorICAucmVsYS5pbml0ICAgIDAgOiB7ICooLnJlbGEuaW5pdCkgfQorICAucmVsYS50ZXh0ICAgIDAgOiB7ICooLnJlbGEudGV4dCkgfQorICAucmVsYS5maW5pICAgIDAgOiB7ICooLnJlbGEuZmluaSkgfQorICAucmVsYS5yb2RhdGEgIDAgOiB7ICooLnJlbGEucm9kYXRhKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvIDAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8pIH0KKyAgLnJlbGEuZGF0YSAgICAwIDogeyAqKC5yZWxhLmRhdGEpIH0KKyAgLnJlbGEudGRhdGEJMCA6IHsgKigucmVsYS50ZGF0YSkgfQorICAucmVsYS50YnNzCTAgOiB7ICooLnJlbGEudGJzcykgfQorICAucmVsYS5jdG9ycyAgIDAgOiB7ICooLnJlbGEuY3RvcnMpIH0KKyAgLnJlbGEuZHRvcnMgICAwIDogeyAqKC5yZWxhLmR0b3JzKSB9CisgIC5yZWxhLmdvdCAgICAgMCA6IHsgKigucmVsYS5nb3QpIH0KKyAgLnJlbGEuYnNzICAgICAwIDogeyAqKC5yZWxhLmJzcykgfQorICAucmVsYS5sZGF0YSAgIDAgOiB7ICooLnJlbGEubGRhdGEpIH0KKyAgLnJlbGEubGJzcyAgICAwIDogeyAqKC5yZWxhLmxic3MpIH0KKyAgLnJlbGEubHJvZGF0YSAwIDogeyAqKC5yZWxhLmxyb2RhdGEpIH0KKyAgLnJlbGEuaWZ1bmMgICAwIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgMCA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgIDAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAwIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAwIDoKKyAgeworICAgICooLnRleHQgLnN0dWIpCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIC5yb2RhdGEgICAgICAgMCA6IHsgKigucm9kYXRhKSB9CisgIC5yb2RhdGExICAgICAgMCA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgIDAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlIDAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJMCA6IHsgKigudGRhdGEpIH0KKyAgLnRic3MJCTAgOiB7ICooLnRic3MpIH0KKyAgLnByZWluaXRfYXJyYXkgICAwIDoKKyAgeworICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkpKQorICB9CisgIC5qY3IgICAgICAgICAgMCA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZHluYW1pYyAgICAgIDAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAwIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLmdvdC5wbHQgICAgICAwIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAwIDoKKyAgeworICAgICooLmRhdGEpCisgIH0KKyAgLmRhdGExICAgICAgICAwIDogeyAqKC5kYXRhMSkgfQorICAuYnNzICAgICAgICAgIDAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICB9CisgIC5sYnNzIDAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC5scm9kYXRhIDAgIDoKKyAgeworICAgICooLmxyb2RhdGEpCisgIH0KKyAgLmxkYXRhIDAgIDoKKyAgeworICAgICooLmxkYXRhKQorICB9CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjZhNjI1Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54cwpAQCAtMCwwICsxLDIwMiBAQAorLyogU2NyaXB0IGZvciBsZCAtLXNoYXJlZDogbGluayBzaGFyZWQgbGlicmFyeSAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIi90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMCkgKyBTSVpFT0ZfSEVBREVSUzsKKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgICAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAgIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAgIDogeyAqKC5yZWxhLnRleHQgLnJlbGEudGV4dC4qIC5yZWxhLmdudS5saW5rb25jZS50LiopIH0KKyAgLnJlbGEuZmluaSAgICAgIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAgIDogeyAqKC5yZWxhLnJvZGF0YSAucmVsYS5yb2RhdGEuKiAucmVsYS5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yZWxhLmRhdGEucmVsLnJvICAgOiB7ICooLnJlbGEuZGF0YS5yZWwucm8qIC5yZWxhLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5yZWxhLmRhdGEgICAgICA6IHsgKigucmVsYS5kYXRhIC5yZWxhLmRhdGEuKiAucmVsYS5nbnUubGlua29uY2UuZC4qKSB9CisgIC5yZWxhLnRkYXRhCSAgOiB7ICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikgfQorICAucmVsYS50YnNzCSAgOiB7ICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopIH0KKyAgLnJlbGEuY3RvcnMgICAgIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgICA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgICAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgICA6IHsgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikgfQorICAucmVsYS5sZGF0YSAgICAgOiB7ICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKSB9CisgIC5yZWxhLmxic3MgICAgICA6IHsgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikgfQorICAucmVsYS5scm9kYXRhICAgOiB7ICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopIH0KKyAgLnJlbGEuaWZ1bmMgICAgIDogeyAqKC5yZWxhLmlmdW5jKSB9CisgIC5yZWxhLnBsdCAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5wbHQpCisgICAgICAqKC5yZWxhLmlwbHQpCisgICAgfQorICAuaW5pdCAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguaW5pdCkpCisgIH0gPTB4OTA5MDkwOTAKKyAgLnBsdCAgICAgICAgICAgIDogeyAqKC5wbHQpICooLmlwbHQpIH0KKyAgLnRleHQgICAgICAgICAgIDoKKyAgeworICAgICooLnRleHQudW5saWtlbHkgLnRleHQuKl91bmxpa2VseSkKKyAgICAqKC50ZXh0LmV4aXQgLnRleHQuZXhpdC4qKQorICAgICooLnRleHQuc3RhcnR1cCAudGV4dC5zdGFydHVwLiopCisgICAgKigudGV4dC5ob3QgLnRleHQuaG90LiopCisgICAgKigudGV4dCAuc3R1YiAudGV4dC4qIC5nbnUubGlua29uY2UudC4qKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICBQUk9WSURFIChfX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKF9ldGV4dCA9IC4pOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgICAgICAgOiB7ICooLnJvZGF0YSAucm9kYXRhLiogLmdudS5saW5rb25jZS5yLiopIH0KKyAgLnJvZGF0YTEgICAgICAgIDogeyAqKC5yb2RhdGExKSB9CisgIC5laF9mcmFtZV9oZHIgOiB7ICooLmVoX2ZyYW1lX2hkcikgfQorICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JPIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JPIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCisgICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLworICAuID0gQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSkpIC0gKChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gLikgJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKTsgLiA9IERBVEFfU0VHTUVOVF9BTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSwgQ09OU1RBTlQgKENPTU1PTlBBR0VTSVpFKSk7CisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCSAgOiB7ICooLnRkYXRhIC50ZGF0YS4qIC5nbnUubGlua29uY2UudGQuKikgfQorICAudGJzcwkJICA6IHsgKigudGJzcyAudGJzcy4qIC5nbnUubGlua29uY2UudGIuKikgKigudGNvbW1vbikgfQorICAucHJlaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKigucHJlaW5pdF9hcnJheSkpCisgIH0KKyAgLmluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguaW5pdF9hcnJheSkpCisgIH0KKyAgLmZpbmlfYXJyYXkgICAgIDoKKyAgeworICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgS0VFUCAoKiguZmluaV9hcnJheSkpCisgIH0KKyAgLmN0b3JzICAgICAgICAgIDoKKyAgeworICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKKyAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKKyAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQorICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQorICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAorICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCisgICAgICAgaXMgaW4uICAqLworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5jdG9ycykpCisgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KKyAgICAgICB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgorICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQorICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLworICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5jdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCisgICAgS0VFUCAoKiguY3RvcnMpKQorICB9CisgIC5kdG9ycyAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguZHRvcnMpKQorICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8gKmNydGVuZD8ubyApIC5kdG9ycykpCisgICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCisgICAgS0VFUCAoKiguZHRvcnMpKQorICB9CisgIC5qY3IgICAgICAgICAgICA6IHsgS0VFUCAoKiguamNyKSkgfQorICAuZGF0YS5yZWwucm8gOiB7ICooLmRhdGEucmVsLnJvLmxvY2FsKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLmxvY2FsLiopICooLmRhdGEucmVsLnJvKiAuZ251LmxpbmtvbmNlLmQucmVsLnJvLiopIH0KKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgICA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgyNCwgLik7CisgIC5nb3QucGx0ICAgICAgICA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgICA6CisgIHsKKyAgICAqKC5kYXRhIC5kYXRhLiogLmdudS5saW5rb25jZS5kLiopCisgICAgU09SVChDT05TVFJVQ1RPUlMpCisgIH0KKyAgLmRhdGExICAgICAgICAgIDogeyAqKC5kYXRhMSkgfQorICBfZWRhdGEgPSAuOyBQUk9WSURFIChlZGF0YSA9IC4pOworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgICAgICA6CisgIHsKKyAgICooLmR5bmJzcykKKyAgICooLmJzcyAuYnNzLiogLmdudS5saW5rb25jZS5iLiopCisgICAqKENPTU1PTikKKyAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bworICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCisgICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4KKyAgICAgIEZJWE1FOiBXaHkgZG8gd2UgbmVlZCBpdD8gV2hlbiB0aGVyZSBpcyBubyAuYnNzIHNlY3Rpb24sIHdlIGRvbid0CisgICAgICBwYWQgdGhlIC5kYXRhIHNlY3Rpb24uICAqLworICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC5sYnNzICAgOgorICB7CisgICAgKiguZHlubGJzcykKKyAgICAqKC5sYnNzIC5sYnNzLiogLmdudS5saW5rb25jZS5sYi4qKQorICAgICooTEFSR0VfQ09NTU9OKQorICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICAubHJvZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5scm9kYXRhIC5scm9kYXRhLiogLmdudS5saW5rb25jZS5sci4qKQorICB9CisgIC5sZGF0YSAgIEFMSUdOKENPTlNUQU5UIChNQVhQQUdFU0laRSkpICsgKC4gJiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIDEpKSA6CisgIHsKKyAgICAqKC5sZGF0YSAubGRhdGEuKiAuZ251LmxpbmtvbmNlLmwuKikKKyAgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIF9lbmQgPSAuOyBQUk9WSURFIChlbmQgPSAuKTsKKyAgLiA9IERBVEFfU0VHTUVOVF9FTkQgKC4pOworICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLmdudS5saW5rb25jZS53aS4qIC56ZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2IC56ZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lIC56ZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUgLnpkZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyIC56ZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MgLnpkZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8gLnpkZWJ1Z19tYWNpbmZvKSB9CisgIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcyAuemRlYnVnX3dlYWtuYW1lcykgfQorICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcyAuemRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcyAuemRlYnVnX3R5cGVuYW1lcykgfQorICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzIC56ZGVidWdfdmFybmFtZXMpIH0KKyAgLyogRFdBUkYgMyAqLworICAuZGVidWdfcHVidHlwZXMgMCA6IHsgKiguZGVidWdfcHVidHlwZXMgLnpkZWJ1Z19wdWJ0eXBlcykgfQorICAuZGVidWdfcmFuZ2VzICAgMCA6IHsgKiguZGVidWdfcmFuZ2VzIC56ZGVidWdfcmFuZ2VzKSB9CisgIC5nbnUuYXR0cmlidXRlcyAwIDogeyBLRUVQICgqKC5nbnUuYXR0cmlidXRlcykpIH0KKyAgL0RJU0NBUkQvIDogeyAqKC5ub3RlLkdOVS1zdGFjaykgKiguZ251X2RlYnVnbGluaykgKiguZ251Lmx0b18qKSB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzYyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzNiNmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0LnhzYwpAQCAtMCwwICsxLDIwNCBAQAorLyogU2NyaXB0IGZvciAtLXNoYXJlZCAteiBjb21icmVsb2M6IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi94ODZfNjQtbGludXgvbGliNjQiKTsgU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliNjQiKTsgU0VBUkNIX0RJUigiPS9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDI0LCAuKTsKKyAgLmdvdC5wbHQgICAgICAgIDogeyAqKC5nb3QucGx0KSAgKiguaWdvdC5wbHQpIH0KKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHN3IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54c3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhY2Q3MwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHN3CkBAIC0wLDAgKzEsMjAzIEBACisvKiBTY3JpcHQgZm9yIC0tc2hhcmVkIC16IGNvbWJyZWxvYyAteiBub3cgLXogcmVscm86IHNoYXJlZCBsaWJyYXJ5LCBjb21iaW5lICYgc29ydCByZWxvY3MgKi8KK09VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLAorCSAgICAgICJlbGY2NC14ODYtNjQiKQorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShfc3RhcnQpCitTRUFSQ0hfRElSKCIvdG1wL2Foc2llaC1nY2MtNjQtWDI3MTkwLzIveDg2XzY0LWxpbnV4LWdsaWJjMi43LTQuNi94ODZfNjQtbGludXgvbGliNjQiKTsgU0VBUkNIX0RJUigiPS91c3IvbG9jYWwvbGliNjQiKTsgU0VBUkNIX0RJUigiPS9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWIiKTsgU0VBUkNIX0RJUigiPS9saWIiKTsgU0VBUkNIX0RJUigiPS91c3IvbGliIik7CitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9IFNFR01FTlRfU1RBUlQoInRleHQtc2VnbWVudCIsIDApICsgU0laRU9GX0hFQURFUlM7CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgICooLnJlbGEuaXBsdCkKKyAgICB9CisgIC5pbml0ICAgICAgICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5pbml0KSkKKyAgfSA9MHg5MDkwOTA5MAorICAucGx0ICAgICAgICAgICAgOiB7ICooLnBsdCkgKiguaXBsdCkgfQorICAudGV4dCAgICAgICAgICAgOgorICB7CisgICAgKigudGV4dC51bmxpa2VseSAudGV4dC4qX3VubGlrZWx5KQorICAgICooLnRleHQuZXhpdCAudGV4dC5leGl0LiopCisgICAgKigudGV4dC5zdGFydHVwIC50ZXh0LnN0YXJ0dXAuKikKKyAgICAqKC50ZXh0LmhvdCAudGV4dC5ob3QuKikKKyAgICAqKC50ZXh0IC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCisgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCisgICAgKiguZ251Lndhcm5pbmcpCisgIH0gPTB4OTA5MDkwOTAKKyAgLmZpbmkgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmZpbmkpKQorICB9ID0weDkwOTA5MDkwCisgIFBST1ZJREUgKF9fZXRleHQgPSAuKTsKKyAgUFJPVklERSAoX2V0ZXh0ID0gLik7CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIC5yb2RhdGEuKiAuZ251LmxpbmtvbmNlLnIuKikgfQorICAucm9kYXRhMSAgICAgICAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC4gPSBBTElHTiAoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgLSAoKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAuKSAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpOyAuID0gREFUQV9TRUdNRU5UX0FMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpLCBDT05TVEFOVCAoQ09NTU9OUEFHRVNJWkUpKTsKKyAgLyogRXhjZXB0aW9uIGhhbmRsaW5nICAqLworICAuZWhfZnJhbWUgICAgICAgOiBPTkxZX0lGX1JXIHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CisgIC5nY2NfZXhjZXB0X3RhYmxlICAgOiBPTkxZX0lGX1JXIHsgKiguZ2NjX2V4Y2VwdF90YWJsZSAuZ2NjX2V4Y2VwdF90YWJsZS4qKSB9CisgIC8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIHNlY3Rpb25zICAqLworICAudGRhdGEJICA6IHsgKigudGRhdGEgLnRkYXRhLiogLmdudS5saW5rb25jZS50ZC4qKSB9CisgIC50YnNzCQkgIDogeyAqKC50YnNzIC50YnNzLiogLmdudS5saW5rb25jZS50Yi4qKSAqKC50Y29tbW9uKSB9CisgIC5wcmVpbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuaW5pdF9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgfQorICAuZmluaV9hcnJheSAgICAgOgorICB7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgfQorICAuY3RvcnMgICAgICAgICAgOgorICB7CisgICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgorICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcworICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCisgICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCisgICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0CisgICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KKyAgICAgICBpcyBpbi4gICovCisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmN0b3JzKSkKKyAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQorICAgICAgIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCisgICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCisgICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmN0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKKyAgICBLRUVQICgqKC5jdG9ycykpCisgIH0KKyAgLmR0b3JzICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCisgICAgS0VFUCAoKmNydGJlZ2luPy5vKC5kdG9ycykpCisgICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubyAqY3J0ZW5kPy5vICkgLmR0b3JzKSkKKyAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKKyAgICBLRUVQICgqKC5kdG9ycykpCisgIH0KKyAgLmpjciAgICAgICAgICAgIDogeyBLRUVQICgqKC5qY3IpKSB9CisgIC5kYXRhLnJlbC5ybyA6IHsgKiguZGF0YS5yZWwucm8ubG9jYWwqIC5nbnUubGlua29uY2UuZC5yZWwucm8ubG9jYWwuKikgKiguZGF0YS5yZWwucm8qIC5nbnUubGlua29uY2UuZC5yZWwucm8uKikgfQorICAuZHluYW1pYyAgICAgICAgOiB7ICooLmR5bmFtaWMpIH0KKyAgLmdvdCAgICAgICAgICAgIDogeyAqKC5nb3QucGx0KSAqKC5pZ290LnBsdCkgKiguZ290KSAqKC5pZ290KSB9CisgIC4gPSBEQVRBX1NFR01FTlRfUkVMUk9fRU5EICgwLCAuKTsKKyAgLmRhdGEgICAgICAgICAgIDoKKyAgeworICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKKyAgICBTT1JUKENPTlNUUlVDVE9SUykKKyAgfQorICAuZGF0YTEgICAgICAgICAgOiB7ICooLmRhdGExKSB9CisgIF9lZGF0YSA9IC47IFBST1ZJREUgKGVkYXRhID0gLik7CisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICAgICAgIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzIC5ic3MuKiAuZ251LmxpbmtvbmNlLmIuKikKKyAgICooQ09NTU9OKQorICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCisgICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKKyAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLgorICAgICAgRklYTUU6IFdoeSBkbyB3ZSBuZWVkIGl0PyBXaGVuIHRoZXJlIGlzIG5vIC5ic3Mgc2VjdGlvbiwgd2UgZG9uJ3QKKyAgICAgIHBhZCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCisgICAuID0gQUxJR04oLiAhPSAwID8gNjQgLyA4IDogMSk7CisgIH0KKyAgLmxic3MgICA6CisgIHsKKyAgICAqKC5keW5sYnNzKQorICAgICooLmxic3MgLmxic3MuKiAuZ251LmxpbmtvbmNlLmxiLiopCisgICAgKihMQVJHRV9DT01NT04pCisgIH0KKyAgLiA9IEFMSUdOKDY0IC8gOCk7CisgIC5scm9kYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxyb2RhdGEgLmxyb2RhdGEuKiAuZ251LmxpbmtvbmNlLmxyLiopCisgIH0KKyAgLmxkYXRhICAgQUxJR04oQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSkgKyAoLiAmIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpIC0gMSkpIDoKKyAgeworICAgICooLmxkYXRhIC5sZGF0YS4qIC5nbnUubGlua29uY2UubC4qKQorICAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgX2VuZCA9IC47IFBST1ZJREUgKGVuZCA9IC4pOworICAuID0gREFUQV9TRUdNRU5UX0VORCAoLik7CisgIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCisgIC5zdGFiICAgICAgICAgIDAgOiB7ICooLnN0YWIpIH0KKyAgLnN0YWJzdHIgICAgICAgMCA6IHsgKiguc3RhYnN0cikgfQorICAuc3RhYi5leGNsICAgICAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KKyAgLnN0YWIuZXhjbHN0ciAgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9CisgIC5zdGFiLmluZGV4ICAgIDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KKyAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQorICAuY29tbWVudCAgICAgICAwIDogeyAqKC5jb21tZW50KSB9CisgIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgorICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KKyAgLyogRFdBUkYgMSAqLworICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KKyAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KKyAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLworICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbyAuemRlYnVnX3NyY2luZm8pIH0KKyAgLmRlYnVnX3NmbmFtZXMgIDAgOiB7ICooLmRlYnVnX3NmbmFtZXMgLnpkZWJ1Z19zZm5hbWVzKSB9CisgIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLworICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcyAuemRlYnVnX2FyYW5nZXMpIH0KKyAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzIC56ZGVidWdfcHVibmFtZXMpIH0KKyAgLyogRFdBUkYgMiAqLworICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbyAuZ251LmxpbmtvbmNlLndpLiogLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorICAvRElTQ0FSRC8gOiB7ICooLm5vdGUuR05VLXN0YWNrKSAqKC5nbnVfZGVidWdsaW5rKSAqKC5nbnUubHRvXyopIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHUgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0Lnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTFhZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9lbGZfeDg2XzY0Lnh1CkBAIC0wLDAgKzEsMTQ1IEBACisvKiBTY3JpcHQgZm9yIGxkIC1VcjogbGluayB3L291dCByZWxvY2F0aW9uLCBkbyBjcmVhdGUgY29uc3RydWN0b3JzICovCitPVVRQVVRfRk9STUFUKCJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IiwKKwkgICAgICAiZWxmNjQteDg2LTY0IikKK09VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQorIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcworICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZworICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAorICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLmludGVycCAgICAgICAwIDogeyAqKC5pbnRlcnApIH0KKyAgLm5vdGUuZ251LmJ1aWxkLWlkIDogeyAqKC5ub3RlLmdudS5idWlsZC1pZCkgfQorICAuaGFzaCAgICAgICAgIDAgOiB7ICooLmhhc2gpIH0KKyAgLmdudS5oYXNoICAgICAwIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgIDAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgIDAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gIDAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kIDA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAwOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKyAgLnJlbGEuaW5pdCAgICAwIDogeyAqKC5yZWxhLmluaXQpIH0KKyAgLnJlbGEudGV4dCAgICAwIDogeyAqKC5yZWxhLnRleHQpIH0KKyAgLnJlbGEuZmluaSAgICAwIDogeyAqKC5yZWxhLmZpbmkpIH0KKyAgLnJlbGEucm9kYXRhICAwIDogeyAqKC5yZWxhLnJvZGF0YSkgfQorICAucmVsYS5kYXRhLnJlbC5ybyAwIDogeyAqKC5yZWxhLmRhdGEucmVsLnJvKSB9CisgIC5yZWxhLmRhdGEgICAgMCA6IHsgKigucmVsYS5kYXRhKSB9CisgIC5yZWxhLnRkYXRhCTAgOiB7ICooLnJlbGEudGRhdGEpIH0KKyAgLnJlbGEudGJzcwkwIDogeyAqKC5yZWxhLnRic3MpIH0KKyAgLnJlbGEuY3RvcnMgICAwIDogeyAqKC5yZWxhLmN0b3JzKSB9CisgIC5yZWxhLmR0b3JzICAgMCA6IHsgKigucmVsYS5kdG9ycykgfQorICAucmVsYS5nb3QgICAgIDAgOiB7ICooLnJlbGEuZ290KSB9CisgIC5yZWxhLmJzcyAgICAgMCA6IHsgKigucmVsYS5ic3MpIH0KKyAgLnJlbGEubGRhdGEgICAwIDogeyAqKC5yZWxhLmxkYXRhKSB9CisgIC5yZWxhLmxic3MgICAgMCA6IHsgKigucmVsYS5sYnNzKSB9CisgIC5yZWxhLmxyb2RhdGEgMCA6IHsgKigucmVsYS5scm9kYXRhKSB9CisgIC5yZWxhLmlmdW5jICAgMCA6IHsgKigucmVsYS5pZnVuYykgfQorICAucmVsYS5wbHQgICAgIDAgOgorICAgIHsKKyAgICAgICooLnJlbGEucGx0KQorICAgIH0KKyAgLmluaXQgICAgICAgICAwIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgMCA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgMCA6CisgIHsKKyAgICAqKC50ZXh0IC5zdHViKQorICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLworICAgICooLmdudS53YXJuaW5nKQorICB9ID0weDkwOTA5MDkwCisgIC5maW5pICAgICAgICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5maW5pKSkKKyAgfSA9MHg5MDkwOTA5MAorICAucm9kYXRhICAgICAgIDAgOiB7ICooLnJvZGF0YSkgfQorICAucm9kYXRhMSAgICAgIDAgOiB7ICooLnJvZGF0YTEpIH0KKyAgLmVoX2ZyYW1lX2hkciA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CisgIC5laF9mcmFtZSAgICAgMCA6IE9OTFlfSUZfUk8geyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgMCA6IE9OTFlfSUZfUk8geyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KKyAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gICovCisgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyAgKi8KKyAgLmVoX2ZyYW1lICAgICAwIDogT05MWV9JRl9SVyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAwIDogT05MWV9JRl9SVyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBUaHJlYWQgTG9jYWwgU3RvcmFnZSBzZWN0aW9ucyAgKi8KKyAgLnRkYXRhCTAgOiB7ICooLnRkYXRhKSB9CisgIC50YnNzCQkwIDogeyAqKC50YnNzKSB9CisgIC5wcmVpbml0X2FycmF5ICAgMCA6CisgIHsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgfQorICAuamNyICAgICAgICAgIDAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmR5bmFtaWMgICAgICAwIDogeyAqKC5keW5hbWljKSB9CisgIC5nb3QgICAgICAgICAgMCA6IHsgKiguZ290KSAqKC5pZ290KSB9CisgIC5nb3QucGx0ICAgICAgMCA6IHsgKiguZ290LnBsdCkgICooLmlnb3QucGx0KSB9CisgIC5kYXRhICAgICAgICAgMCA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgMCA6IHsgKiguZGF0YTEpIH0KKyAgLmJzcyAgICAgICAgICAwIDoKKyAgeworICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgfQorICAubGJzcyAwIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcykKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAubHJvZGF0YSAwICA6CisgIHsKKyAgICAqKC5scm9kYXRhKQorICB9CisgIC5sZGF0YSAwICA6CisgIHsKKyAgICAqKC5sZGF0YSkKKyAgfQorICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLworICAuc3RhYiAgICAgICAgICAwIDogeyAqKC5zdGFiKSB9CisgIC5zdGFic3RyICAgICAgIDAgOiB7ICooLnN0YWJzdHIpIH0KKyAgLnN0YWIuZXhjbCAgICAgMCA6IHsgKiguc3RhYi5leGNsKSB9CisgIC5zdGFiLmV4Y2xzdHIgIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQorICAuc3RhYi5pbmRleCAgICAwIDogeyAqKC5zdGFiLmluZGV4KSB9CisgIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KKyAgLmNvbW1lbnQgICAgICAgMCA6IHsgKiguY29tbWVudCkgfQorICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KKyAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCisgIC8qIERXQVJGIDEgKi8KKyAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9CisgIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9CisgIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8gLnpkZWJ1Z19zcmNpbmZvKSB9CisgIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzIC56ZGVidWdfc2ZuYW1lcykgfQorICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMgLnpkZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcyAuemRlYnVnX3B1Ym5hbWVzKSB9CisgIC8qIERXQVJGIDIgKi8KKyAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8gLnpkZWJ1Z19pbmZvKSB9CisgIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYgLnpkZWJ1Z19hYmJyZXYpIH0KKyAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUgLnpkZWJ1Z19saW5lKSB9CisgIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSAuemRlYnVnX2ZyYW1lKSB9CisgIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIgLnpkZWJ1Z19zdHIpIH0KKyAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYyAuemRlYnVnX2xvYykgfQorICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbyAuemRlYnVnX21hY2luZm8pIH0KKyAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCisgIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzIC56ZGVidWdfd2Vha25hbWVzKSB9CisgIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzIC56ZGVidWdfZnVuY25hbWVzKSB9CisgIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzIC56ZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMgLnpkZWJ1Z192YXJuYW1lcykgfQorICAvKiBEV0FSRiAzICovCisgIC5kZWJ1Z19wdWJ0eXBlcyAwIDogeyAqKC5kZWJ1Z19wdWJ0eXBlcyAuemRlYnVnX3B1YnR5cGVzKSB9CisgIC5kZWJ1Z19yYW5nZXMgICAwIDogeyAqKC5kZWJ1Z19yYW5nZXMgLnpkZWJ1Z19yYW5nZXMpIH0KKyAgLmdudS5hdHRyaWJ1dGVzIDAgOiB7IEtFRVAgKCooLmdudS5hdHRyaWJ1dGVzKSkgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvZWxmX3g4Nl82NC54dyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxOWI5MQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2VsZl94ODZfNjQueHcKQEAgLTAsMCArMSwyMTIgQEAKKy8qIFNjcmlwdCBmb3IgLXogY29tYnJlbG9jIC16IG5vdyAteiByZWxybzogY29tYmluZSBhbmQgc29ydCByZWxvYyBzZWN0aW9ucyAqLworT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsCisJICAgICAgImVsZjY0LXg4Ni02NCIpCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKF9zdGFydCkKK1NFQVJDSF9ESVIoIi90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L3Vzci9sb2NhbC9saWI2NCIpOyBTRUFSQ0hfRElSKCI9L2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xpYjY0Iik7IFNFQVJDSF9ESVIoIj0vdXNyL2xvY2FsL2xpYiIpOyBTRUFSQ0hfRElSKCI9L2xpYiIpOyBTRUFSQ0hfRElSKCI9L3Vzci9saWIiKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICBQUk9WSURFIChfX2V4ZWN1dGFibGVfc3RhcnQgPSBTRUdNRU5UX1NUQVJUKCJ0ZXh0LXNlZ21lbnQiLCAweDQwMDAwMCkpOyAuID0gU0VHTUVOVF9TVEFSVCgidGV4dC1zZWdtZW50IiwgMHg0MDAwMDApICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgICAgICAgICA6IHsgKiguaW50ZXJwKSB9CisgIC5ub3RlLmdudS5idWlsZC1pZCA6IHsgKigubm90ZS5nbnUuYnVpbGQtaWQpIH0KKyAgLmhhc2ggICAgICAgICAgIDogeyAqKC5oYXNoKSB9CisgIC5nbnUuaGFzaCAgICAgICA6IHsgKiguZ251Lmhhc2gpIH0KKyAgLmR5bnN5bSAgICAgICAgIDogeyAqKC5keW5zeW0pIH0KKyAgLmR5bnN0ciAgICAgICAgIDogeyAqKC5keW5zdHIpIH0KKyAgLmdudS52ZXJzaW9uICAgIDogeyAqKC5nbnUudmVyc2lvbikgfQorICAuZ251LnZlcnNpb25fZCAgOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKyAgLmdudS52ZXJzaW9uX3IgIDogeyAqKC5nbnUudmVyc2lvbl9yKSB9CisgIC5yZWxhLmR5biAgICAgICA6CisgICAgeworICAgICAgKigucmVsYS5pbml0KQorICAgICAgKigucmVsYS50ZXh0IC5yZWxhLnRleHQuKiAucmVsYS5nbnUubGlua29uY2UudC4qKQorICAgICAgKigucmVsYS5maW5pKQorICAgICAgKigucmVsYS5yb2RhdGEgLnJlbGEucm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLnIuKikKKyAgICAgICooLnJlbGEuZGF0YSAucmVsYS5kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmQuKikKKyAgICAgICooLnJlbGEudGRhdGEgLnJlbGEudGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UudGQuKikKKyAgICAgICooLnJlbGEudGJzcyAucmVsYS50YnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLnRiLiopCisgICAgICAqKC5yZWxhLmN0b3JzKQorICAgICAgKigucmVsYS5kdG9ycykKKyAgICAgICooLnJlbGEuZ290KQorICAgICAgKigucmVsYS5ic3MgLnJlbGEuYnNzLiogLnJlbGEuZ251LmxpbmtvbmNlLmIuKikKKyAgICAgICooLnJlbGEubGRhdGEgLnJlbGEubGRhdGEuKiAucmVsYS5nbnUubGlua29uY2UubC4qKQorICAgICAgKigucmVsYS5sYnNzIC5yZWxhLmxic3MuKiAucmVsYS5nbnUubGlua29uY2UubGIuKikKKyAgICAgICooLnJlbGEubHJvZGF0YSAucmVsYS5scm9kYXRhLiogLnJlbGEuZ251LmxpbmtvbmNlLmxyLiopCisgICAgICAqKC5yZWxhLmlmdW5jKQorICAgIH0KKyAgLnJlbGEucGx0ICAgICAgIDoKKyAgICB7CisgICAgICAqKC5yZWxhLnBsdCkKKyAgICAgIFBST1ZJREVfSElEREVOIChfX3JlbGFfaXBsdF9zdGFydCA9IC4pOworICAgICAgKigucmVsYS5pcGx0KQorICAgICAgUFJPVklERV9ISURERU4gKF9fcmVsYV9pcGx0X2VuZCA9IC4pOworICAgIH0KKyAgLmluaXQgICAgICAgICAgIDoKKyAgeworICAgIEtFRVAgKCooLmluaXQpKQorICB9ID0weDkwOTA5MDkwCisgIC5wbHQgICAgICAgICAgICA6IHsgKigucGx0KSAqKC5pcGx0KSB9CisgIC50ZXh0ICAgICAgICAgICA6CisgIHsKKyAgICAqKC50ZXh0LnVubGlrZWx5IC50ZXh0LipfdW5saWtlbHkpCisgICAgKigudGV4dC5leGl0IC50ZXh0LmV4aXQuKikKKyAgICAqKC50ZXh0LnN0YXJ0dXAgLnRleHQuc3RhcnR1cC4qKQorICAgICooLnRleHQuaG90IC50ZXh0LmhvdC4qKQorICAgICooLnRleHQgLnN0dWIgLnRleHQuKiAuZ251LmxpbmtvbmNlLnQuKikKKyAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KKyAgICAqKC5nbnUud2FybmluZykKKyAgfSA9MHg5MDkwOTA5MAorICAuZmluaSAgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKiguZmluaSkpCisgIH0gPTB4OTA5MDkwOTAKKyAgUFJPVklERSAoX19ldGV4dCA9IC4pOworICBQUk9WSURFIChfZXRleHQgPSAuKTsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICAgICAgIDogeyAqKC5yb2RhdGEgLnJvZGF0YS4qIC5nbnUubGlua29uY2Uuci4qKSB9CisgIC5yb2RhdGExICAgICAgICA6IHsgKigucm9kYXRhMSkgfQorICAuZWhfZnJhbWVfaGRyIDogeyAqKC5laF9mcmFtZV9oZHIpIH0KKyAgLmVoX2ZyYW1lICAgICAgIDogT05MWV9JRl9STyB7IEtFRVAgKCooLmVoX2ZyYW1lKSkgfQorICAuZ2NjX2V4Y2VwdF90YWJsZSAgIDogT05MWV9JRl9STyB7ICooLmdjY19leGNlcHRfdGFibGUgLmdjY19leGNlcHRfdGFibGUuKikgfQorICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0bworICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgKi8KKyAgLiA9IEFMSUdOIChDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSAtICgoQ09OU1RBTlQgKE1BWFBBR0VTSVpFKSAtIC4pICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSk7IC4gPSBEQVRBX1NFR01FTlRfQUxJR04gKENPTlNUQU5UIChNQVhQQUdFU0laRSksIENPTlNUQU5UIChDT01NT05QQUdFU0laRSkpOworICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgICovCisgIC5laF9mcmFtZSAgICAgICA6IE9OTFlfSUZfUlcgeyBLRUVQICgqKC5laF9mcmFtZSkpIH0KKyAgLmdjY19leGNlcHRfdGFibGUgICA6IE9OTFlfSUZfUlcgeyAqKC5nY2NfZXhjZXB0X3RhYmxlIC5nY2NfZXhjZXB0X3RhYmxlLiopIH0KKyAgLyogVGhyZWFkIExvY2FsIFN0b3JhZ2Ugc2VjdGlvbnMgICovCisgIC50ZGF0YQkgIDogeyAqKC50ZGF0YSAudGRhdGEuKiAuZ251LmxpbmtvbmNlLnRkLiopIH0KKyAgLnRic3MJCSAgOiB7ICooLnRic3MgLnRic3MuKiAuZ251LmxpbmtvbmNlLnRiLiopICooLnRjb21tb24pIH0KKyAgLnByZWluaXRfYXJyYXkgICAgIDoKKyAgeworICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfc3RhcnQgPSAuKTsKKyAgICBLRUVQICgqKC5wcmVpbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5pbml0X2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5pbml0X2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X2VuZCA9IC4pOworICB9CisgIC5maW5pX2FycmF5ICAgICA6CisgIHsKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X3N0YXJ0ID0gLik7CisgICAgS0VFUCAoKihTT1JUKC5maW5pX2FycmF5LiopKSkKKyAgICBLRUVQICgqKC5maW5pX2FycmF5KSkKKyAgICBQUk9WSURFX0hJRERFTiAoX19maW5pX2FycmF5X2VuZCA9IC4pOworICB9CisgIC5jdG9ycyAgICAgICAgICA6CisgIHsKKyAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCisgICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAorICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKKyAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKKyAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKKyAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubworICAgICAgIGlzIGluLiAgKi8KKyAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQorICAgIEtFRVAgKCpjcnRiZWdpbj8ubyguY3RvcnMpKQorICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCisgICAgICAgdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KKyAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKKyAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuY3RvcnMpKQorICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQorICAgIEtFRVAgKCooLmN0b3JzKSkKKyAgfQorICAuZHRvcnMgICAgICAgICAgOgorICB7CisgICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKKyAgICBLRUVQICgqY3J0YmVnaW4/Lm8oLmR0b3JzKSkKKyAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vICpjcnRlbmQ/Lm8gKSAuZHRvcnMpKQorICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQorICAgIEtFRVAgKCooLmR0b3JzKSkKKyAgfQorICAuamNyICAgICAgICAgICAgOiB7IEtFRVAgKCooLmpjcikpIH0KKyAgLmRhdGEucmVsLnJvIDogeyAqKC5kYXRhLnJlbC5yby5sb2NhbCogLmdudS5saW5rb25jZS5kLnJlbC5yby5sb2NhbC4qKSAqKC5kYXRhLnJlbC5ybyogLmdudS5saW5rb25jZS5kLnJlbC5yby4qKSB9CisgIC5keW5hbWljICAgICAgICA6IHsgKiguZHluYW1pYykgfQorICAuZ290ICAgICAgICAgICAgOiB7ICooLmdvdC5wbHQpICooLmlnb3QucGx0KSAqKC5nb3QpICooLmlnb3QpIH0KKyAgLiA9IERBVEFfU0VHTUVOVF9SRUxST19FTkQgKDAsIC4pOworICAuZGF0YSAgICAgICAgICAgOgorICB7CisgICAgKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorICAgIFNPUlQoQ09OU1RSVUNUT1JTKQorICB9CisgIC5kYXRhMSAgICAgICAgICA6IHsgKiguZGF0YTEpIH0KKyAgX2VkYXRhID0gLjsgUFJPVklERSAoZWRhdGEgPSAuKTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgICAgICAgOgorICB7CisgICAqKC5keW5ic3MpCisgICAqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICAgKihDT01NT04pCisgICAvKiBBbGlnbiBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSAuYnNzIHNlY3Rpb24gb2NjdXBpZXMgc3BhY2UgdXAgdG8KKyAgICAgIF9lbmQuICBBbGlnbiBhZnRlciAuYnNzIHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudCBldmVuIGlmIHRoZQorICAgICAgLmJzcyBzZWN0aW9uIGRpc2FwcGVhcnMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gaW5wdXQgc2VjdGlvbnMuCisgICAgICBGSVhNRTogV2h5IGRvIHdlIG5lZWQgaXQ/IFdoZW4gdGhlcmUgaXMgbm8gLmJzcyBzZWN0aW9uLCB3ZSBkb24ndAorICAgICAgcGFkIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KKyAgIC4gPSBBTElHTiguICE9IDAgPyA2NCAvIDggOiAxKTsKKyAgfQorICAubGJzcyAgIDoKKyAgeworICAgICooLmR5bmxic3MpCisgICAgKigubGJzcyAubGJzcy4qIC5nbnUubGlua29uY2UubGIuKikKKyAgICAqKExBUkdFX0NPTU1PTikKKyAgfQorICAuID0gQUxJR04oNjQgLyA4KTsKKyAgLmxyb2RhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubHJvZGF0YSAubHJvZGF0YS4qIC5nbnUubGlua29uY2UubHIuKikKKyAgfQorICAubGRhdGEgICBBTElHTihDT05TVEFOVCAoTUFYUEFHRVNJWkUpKSArICguICYgKENPTlNUQU5UIChNQVhQQUdFU0laRSkgLSAxKSkgOgorICB7CisgICAgKigubGRhdGEgLmxkYXRhLiogLmdudS5saW5rb25jZS5sLiopCisgICAgLiA9IEFMSUdOKC4gIT0gMCA/IDY0IC8gOCA6IDEpOworICB9CisgIC4gPSBBTElHTig2NCAvIDgpOworICBfZW5kID0gLjsgUFJPVklERSAoZW5kID0gLik7CisgIC4gPSBEQVRBX1NFR01FTlRfRU5EICguKTsKKyAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KKyAgLnN0YWIgICAgICAgICAgMCA6IHsgKiguc3RhYikgfQorICAuc3RhYnN0ciAgICAgICAwIDogeyAqKC5zdGFic3RyKSB9CisgIC5zdGFiLmV4Y2wgICAgIDAgOiB7ICooLnN0YWIuZXhjbCkgfQorICAuc3RhYi5leGNsc3RyICAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KKyAgLnN0YWIuaW5kZXggICAgMCA6IHsgKiguc3RhYi5pbmRleCkgfQorICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9CisgIC5jb21tZW50ICAgICAgIDAgOiB7ICooLmNvbW1lbnQpIH0KKyAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLworICAvKiBEV0FSRiAxICovCisgIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQorICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQorICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCisgIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvIC56ZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcyAuemRlYnVnX3NmbmFtZXMpIH0KKyAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCisgIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzIC56ZGVidWdfYXJhbmdlcykgfQorICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMgLnpkZWJ1Z19wdWJuYW1lcykgfQorICAvKiBEV0FSRiAyICovCisgIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvIC5nbnUubGlua29uY2Uud2kuKiAuemRlYnVnX2luZm8pIH0KKyAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldiAuemRlYnVnX2FiYnJldikgfQorICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSAuemRlYnVnX2xpbmUpIH0KKyAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lIC56ZGVidWdfZnJhbWUpIH0KKyAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0ciAuemRlYnVnX3N0cikgfQorICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jIC56ZGVidWdfbG9jKSB9CisgIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvIC56ZGVidWdfbWFjaW5mbykgfQorICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KKyAgLmRlYnVnX3dlYWtuYW1lcyAwIDogeyAqKC5kZWJ1Z193ZWFrbmFtZXMgLnpkZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAwIDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMgLnpkZWJ1Z19mdW5jbmFtZXMpIH0KKyAgLmRlYnVnX3R5cGVuYW1lcyAwIDogeyAqKC5kZWJ1Z190eXBlbmFtZXMgLnpkZWJ1Z190eXBlbmFtZXMpIH0KKyAgLmRlYnVnX3Zhcm5hbWVzICAwIDogeyAqKC5kZWJ1Z192YXJuYW1lcyAuemRlYnVnX3Zhcm5hbWVzKSB9CisgIC8qIERXQVJGIDMgKi8KKyAgLmRlYnVnX3B1YnR5cGVzIDAgOiB7ICooLmRlYnVnX3B1YnR5cGVzIC56ZGVidWdfcHVidHlwZXMpIH0KKyAgLmRlYnVnX3JhbmdlcyAgIDAgOiB7ICooLmRlYnVnX3JhbmdlcyAuemRlYnVnX3JhbmdlcykgfQorICAuZ251LmF0dHJpYnV0ZXMgMCA6IHsgS0VFUCAoKiguZ251LmF0dHJpYnV0ZXMpKSB9CisgIC9ESVNDQVJELyA6IHsgKigubm90ZS5HTlUtc3RhY2spICooLmdudV9kZWJ1Z2xpbmspICooLmdudS5sdG9fKikgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnggYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjg1NjI3Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LngKQEAgLTAsMCArMSw0NiBAQAorLyogRGVmYXVsdCBsaW5rZXIgc2NyaXB0LCBmb3Igbm9ybWFsIGV4ZWN1dGFibGVzICovCitPVVRQVVRfRk9STUFUKCJhLm91dC1pMzg2LWxpbnV4IiwgImEub3V0LWkzODYtbGludXgiLAorCSAgICAgICJhLm91dC1pMzg2LWxpbnV4IikKK09VVFBVVF9BUkNIKGkzODYpCitQUk9WSURFIChfX3N0YWNrID0gMCk7CitTRUNUSU9OUworeworICAuID0gMHgxMDIwOworICAudGV4dCA6CisgIHsKKyAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKKyAgICAqKC50ZXh0KQorICAgIC8qIFRoZSBuZXh0IHNpeCBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gIFRoZSBvcmRlcgorICAgICAgIGlzIGltcG9ydGFudC4gICovCisgICAgKiguZHlucmVsKQorICAgICooLmhhc2gpCisgICAgKiguZHluc3ltKQorICAgICooLmR5bnN0cikKKyAgICAqKC5ydWxlcykKKyAgICAqKC5uZWVkKQorICAgIF9ldGV4dCA9IC47CisgICAgX19ldGV4dCA9IC47CisgIH0KKyAgLiA9IEFMSUdOKDB4MTAwMCk7CisgIC5kYXRhIDoKKyAgeworICAgIC8qIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gICovCisgICAgKiguZHluYW1pYykKKyAgICAqKC5nb3QpCisgICAgKigucGx0KQorICAgICooLmRhdGEpCisgICAgKigubGludXgtZHluYW1pYykgLyogRm9yIExpbnV4IGR5bmFtaWMgbGlua2luZy4gICovCisgICAgQ09OU1RSVUNUT1JTCisgICAgX2VkYXRhICA9ICAuOworICAgIF9fZWRhdGEgID0gIC47CisgIH0KKyAgLmJzcyA6CisgIHsKKyAgICBfX2Jzc19zdGFydCA9IC47CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC4gPSBBTElHTig0KTsKKyAgIF9lbmQgPSAuIDsKKyAgIF9fZW5kID0gLiA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54Ym4gYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueGJuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjFlOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueGJuCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFNjcmlwdCBmb3IgLU46IG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZTsgZG9uJ3QgYWxpZ24gZGF0YSAqLworT1VUUFVUX0ZPUk1BVCgiYS5vdXQtaTM4Ni1saW51eCIsICJhLm91dC1pMzg2LWxpbnV4IiwKKwkgICAgICAiYS5vdXQtaTM4Ni1saW51eCIpCitPVVRQVVRfQVJDSChpMzg2KQorUFJPVklERSAoX19zdGFjayA9IDApOworU0VDVElPTlMKK3sKKyAgLiA9IDA7CisgIC50ZXh0IDoKKyAgeworICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUworICAgICooLnRleHQpCisgICAgLyogVGhlIG5leHQgc2l4IHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgVGhlIG9yZGVyCisgICAgICAgaXMgaW1wb3J0YW50LiAgKi8KKyAgICAqKC5keW5yZWwpCisgICAgKiguaGFzaCkKKyAgICAqKC5keW5zeW0pCisgICAgKiguZHluc3RyKQorICAgICooLnJ1bGVzKQorICAgICooLm5lZWQpCisgICAgX2V0ZXh0ID0gLjsKKyAgICBfX2V0ZXh0ID0gLjsKKyAgfQorICAuID0gLjsKKyAgLmRhdGEgOgorICB7CisgICAgLyogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICAqKC5keW5hbWljKQorICAgICooLmdvdCkKKyAgICAqKC5wbHQpCisgICAgKiguZGF0YSkKKyAgICAqKC5saW51eC1keW5hbWljKSAvKiBGb3IgTGludXggZHluYW1pYyBsaW5raW5nLiAgKi8KKyAgICBDT05TVFJVQ1RPUlMKKyAgICBfZWRhdGEgID0gIC47CisgICAgX19lZGF0YSAgPSAgLjsKKyAgfQorICAuYnNzIDoKKyAgeworICAgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICAgX2VuZCA9IC4gOworICAgX19lbmQgPSAuIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhuIGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4LnhuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODU2NTYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueG4KQEAgLTAsMCArMSw0NiBAQAorLyogU2NyaXB0IGZvciAtbjogbWl4IHRleHQgYW5kIGRhdGEgb24gc2FtZSBwYWdlICovCitPVVRQVVRfRk9STUFUKCJhLm91dC1pMzg2LWxpbnV4IiwgImEub3V0LWkzODYtbGludXgiLAorCSAgICAgICJhLm91dC1pMzg2LWxpbnV4IikKK09VVFBVVF9BUkNIKGkzODYpCitQUk9WSURFIChfX3N0YWNrID0gMCk7CitTRUNUSU9OUworeworICAuID0gMDsKKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKKyAgICAgICBpcyBpbXBvcnRhbnQuICAqLworICAgICooLmR5bnJlbCkKKyAgICAqKC5oYXNoKQorICAgICooLmR5bnN5bSkKKyAgICAqKC5keW5zdHIpCisgICAgKigucnVsZXMpCisgICAgKigubmVlZCkKKyAgICBfZXRleHQgPSAuOworICAgIF9fZXRleHQgPSAuOworICB9CisgIC4gPSBBTElHTigweDEwMDApOworICAuZGF0YSA6CisgIHsKKyAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLworICAgICooLmR5bmFtaWMpCisgICAgKiguZ290KQorICAgICooLnBsdCkKKyAgICAqKC5kYXRhKQorICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLworICAgIENPTlNUUlVDVE9SUworICAgIF9lZGF0YSAgPSAgLjsKKyAgICBfX2VkYXRhICA9ICAuOworICB9CisgIC5ic3MgOgorICB7CisgICAgX19ic3Nfc3RhcnQgPSAuOworICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAuID0gQUxJR04oNCk7CisgICBfZW5kID0gLiA7CisgICBfX2VuZCA9IC4gOworICB9Cit9CmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueHIgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzM2YyOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWIvbGRzY3JpcHRzL2kzODZsaW51eC54cgpAQCAtMCwwICsxLDM3IEBACisvKiBTY3JpcHQgZm9yIGxkIC1yOiBsaW5rIHdpdGhvdXQgcmVsb2NhdGlvbiAqLworT1VUUFVUX0ZPUk1BVCgiYS5vdXQtaTM4Ni1saW51eCIsICJhLm91dC1pMzg2LWxpbnV4IiwKKwkgICAgICAiYS5vdXQtaTM4Ni1saW51eCIpCitPVVRQVVRfQVJDSChpMzg2KQorU0VDVElPTlMKK3sKKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKKyAgICAgICBpcyBpbXBvcnRhbnQuICAqLworICAgICooLmR5bnJlbCkKKyAgICAqKC5oYXNoKQorICAgICooLmR5bnN5bSkKKyAgICAqKC5keW5zdHIpCisgICAgKigucnVsZXMpCisgICAgKigubmVlZCkKKyAgfQorICAuZGF0YSA6CisgIHsKKyAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLworICAgICooLmR5bmFtaWMpCisgICAgKiguZ290KQorICAgICooLnBsdCkKKyAgICAqKC5kYXRhKQorICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLworICB9CisgIC5ic3MgOgorICB7CisgICA7CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIDsKKyAgIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4Lnh1IGIveDg2XzY0LWxpbnV4L2xpYi9sZHNjcmlwdHMvaTM4NmxpbnV4Lnh1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDcxMDAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliL2xkc2NyaXB0cy9pMzg2bGludXgueHUKQEAgLTAsMCArMSwzOCBAQAorLyogU2NyaXB0IGZvciBsZCAtVXI6IGxpbmsgdy9vdXQgcmVsb2NhdGlvbiwgZG8gY3JlYXRlIGNvbnN0cnVjdG9ycyAqLworT1VUUFVUX0ZPUk1BVCgiYS5vdXQtaTM4Ni1saW51eCIsICJhLm91dC1pMzg2LWxpbnV4IiwKKwkgICAgICAiYS5vdXQtaTM4Ni1saW51eCIpCitPVVRQVVRfQVJDSChpMzg2KQorU0VDVElPTlMKK3sKKyAgLnRleHQgOgorICB7CisgICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCisgICAgKigudGV4dCkKKyAgICAvKiBUaGUgbmV4dCBzaXggc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICBUaGUgb3JkZXIKKyAgICAgICBpcyBpbXBvcnRhbnQuICAqLworICAgICooLmR5bnJlbCkKKyAgICAqKC5oYXNoKQorICAgICooLmR5bnN5bSkKKyAgICAqKC5keW5zdHIpCisgICAgKigucnVsZXMpCisgICAgKigubmVlZCkKKyAgfQorICAuZGF0YSA6CisgIHsKKyAgICAvKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgYXJlIGZvciBTdW5PUyBkeW5hbWljIGxpbmtpbmcuICAqLworICAgICooLmR5bmFtaWMpCisgICAgKiguZ290KQorICAgICooLnBsdCkKKyAgICAqKC5kYXRhKQorICAgICooLmxpbnV4LWR5bmFtaWMpIC8qIEZvciBMaW51eCBkeW5hbWljIGxpbmtpbmcuICAqLworICAgIENPTlNUUlVDVE9SUworICB9CisgIC5ic3MgOgorICB7CisgICA7CisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIDsKKyAgIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmdjY19zLnNvIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmdjY19zLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjgzMDMzZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGliZ2NjX3Muc28KQEAgLTAsMCArMSBAQAorbGliZ2NjX3Muc28uMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJnY2Nfcy5zby4xIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYmdjY19zLnNvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0NWJkOAotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJnY2Nfcy5zby4xCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3AuYSBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3AuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2M5ZWQzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3AubGEgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLmxhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkODg0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLmxhCkBAIC0wLDAgKzEsNDEgQEAKKyMgbGlic3NwLmxhIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgbGlidG9vbCAoR05VIGxpYnRvb2wgMS4zMTM0IDIwMDktMTEtMjkpIDIuMi43YQorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9J2xpYnNzcC5zby4wJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9J2xpYnNzcC5zby4wLjAuMCBsaWJzc3Auc28uMCBsaWJzc3Auc28nCisKKyMgVGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhcmNoaXZlLgorb2xkX2xpYnJhcnk9J2xpYnNzcC5hJworCisjIExpbmtlciBmbGFncyB0aGF0IGNhbiBub3QgZ28gaW4gZGVwZW5kZW5jeV9saWJzLgoraW5oZXJpdGVkX2xpbmtlcl9mbGFncz0nJworCisjIExpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KK2RlcGVuZGVuY3lfbGlicz0nJworCisjIE5hbWVzIG9mIGFkZGl0aW9uYWwgd2VhayBsaWJyYXJpZXMgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5Cit3ZWFrX2xpYnJhcnlfbmFtZXM9JycKKworIyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBsaWJzc3AuCitjdXJyZW50PTAKK2FnZT0wCityZXZpc2lvbj0wCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz1ubworCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJworZGxwcmVvcGVuPScnCisKKyMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKK2xpYmRpcj0nL3RtcC9haHNpZWgtZ2NjLTY0LVgyNzE5MC8yL3g4Nl82NC1saW51eC1nbGliYzIuNy00LjYveDg2XzY0LWxpbnV4L2xpYi8uLi9saWI2NCcKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28gYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjY3NjUwODQKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnNzcC5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMCBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42NzY1MDg0Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcC5zby4wCkBAIC0wLDAgKzEgQEAKK2xpYnNzcC5zby4wLjAuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Auc28uMC4wLjAgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAuMC4wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2OTE0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwLnNvLjAuMC4wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Bfbm9uc2hhcmVkLmEgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwX25vbnNoYXJlZC5hCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWI3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3NwX25vbnNoYXJlZC5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Bfbm9uc2hhcmVkLmxhIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnNzcF9ub25zaGFyZWQubGEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTFjMGQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzc3Bfbm9uc2hhcmVkLmxhCkBAIC0wLDAgKzEsNDEgQEAKKyMgbGlic3NwX25vbnNoYXJlZC5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGxpYnRvb2wgKEdOVSBsaWJ0b29sIDEuMzEzNCAyMDA5LTExLTI5KSAyLjIuN2EKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPScnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSdsaWJzc3Bfbm9uc2hhcmVkLmEnCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPScnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPScnCisKKyMgTmFtZXMgb2YgYWRkaXRpb25hbCB3ZWFrIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkKK3dlYWtfbGlicmFyeV9uYW1lcz0nJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYnNzcF9ub25zaGFyZWQuCitjdXJyZW50PTAKK2FnZT0wCityZXZpc2lvbj0wCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz1ubworCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJworZGxwcmVvcGVuPScnCisKKyMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKK2xpYmRpcj0nL3RtcC9haHNpZWgtZ2NjLTY0LVgyNzE5MC8yL3g4Nl82NC1saW51eC1nbGliYzIuNy00LjYveDg2XzY0LWxpbnV4L2xpYi8uLi9saWI2NCcKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuYSBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRhNjg4Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysubGEgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLmxhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlNzE2NjAKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLmxhCkBAIC0wLDAgKzEsNDEgQEAKKyMgbGlic3RkYysrLmxhIC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgbGlidG9vbCAoR05VIGxpYnRvb2wgMS4zMTM0IDIwMDktMTEtMjkpIDIuMi43YQorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9J2xpYnN0ZGMrKy5zby42JworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9J2xpYnN0ZGMrKy5zby42LjAuMTYgbGlic3RkYysrLnNvLjYgbGlic3RkYysrLnNvJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSdsaWJzdGRjKysuYScKKworIyBMaW5rZXIgZmxhZ3MgdGhhdCBjYW4gbm90IGdvIGluIGRlcGVuZGVuY3lfbGlicy4KK2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9JycKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JyAtbG0nCisKKyMgTmFtZXMgb2YgYWRkaXRpb25hbCB3ZWFrIGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkKK3dlYWtfbGlicmFyeV9uYW1lcz0nJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYnN0ZGMrKy4KK2N1cnJlbnQ9NgorYWdlPTAKK3JldmlzaW9uPTE2CisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPXllcworCisjIFNob3VsZCB3ZSB3YXJuIGFib3V0IHBvcnRhYmlsaXR5IHdoZW4gbGlua2luZyBhZ2FpbnN0IC1tb2R1bGVzPworc2hvdWxkbm90bGluaz1ubworCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJworZGxwcmVvcGVuPScnCisKKyMgRGlyZWN0b3J5IHRoYXQgdGhpcyBsaWJyYXJ5IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBpbjoKK2xpYmRpcj0nL3RtcC9haHNpZWgtZ2NjLTY0LVgyNzE5MC8yL3g4Nl82NC1saW51eC1nbGliYzIuNy00LjYveDg2XzY0LWxpbnV4L2xpYi8uLi9saWI2NCcKZGlmZiAtLWdpdCBhL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28gYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmYxODllYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvCkBAIC0wLDAgKzEgQEAKK2xpYnN0ZGMrKy5zby42LjAuMTYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjE4OWVjNwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdGRjKysuc28uNgpAQCAtMCwwICsxIEBACitsaWJzdGRjKysuc28uNi4wLjE2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTYgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYuMC4xNgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDM0Njk5Ci0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTYtZ2RiLnB5IGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN0ZGMrKy5zby42LjAuMTYtZ2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGYzMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3RkYysrLnNvLjYuMC4xNi1nZGIucHkKQEAgLTAsMCArMSw2MCBAQAorIyAtKi0gcHl0aG9uIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBnZGIKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKKworcHl0aG9uZGlyID0gJy90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3NoYXJlL2djYy00LjYueC1nb29nbGUvcHl0aG9uJworbGliZGlyID0gJy90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWIvLi4vbGliNjQnCisKKyMgVGhpcyBmaWxlIG1pZ2h0IGJlIGxvYWRlZCB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgb2JqZmlsZS4gIFRoaXMKKyMgY2FuIGhhcHBlbiBpZiB0aGUgdXNlciBsb2FkcyBpdCBtYW51YWxseS4gIEluIHRoaXMgY2FzZSB3ZSBkb24ndAorIyB1cGRhdGUgc3lzLnBhdGg7IGluc3RlYWQgd2UganVzdCBob3BlIHRoZSB1c2VyIG1hbmFnZWQgdG8gZG8gdGhhdAorIyBiZWZvcmVoYW5kLgoraWYgZ2RiLmN1cnJlbnRfb2JqZmlsZSAoKSBpcyBub3QgTm9uZToKKyAgICAjIFVwZGF0ZSBtb2R1bGUgcGF0aC4gIFdlIHdhbnQgdG8gZmluZCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIGxpYmRpcgorICAgICMgdG8gcHl0aG9uZGlyLCBhbmQgdGhlbiB3ZSB3YW50IHRvIGFwcGx5IHRoYXQgcmVsYXRpdmUgcGF0aCB0byB0aGUKKyAgICAjIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBvYmpmaWxlIHdpdGggd2hpY2ggdGhpcyBmaWxlIGlzIGFzc29jaWF0ZWQuCisgICAgIyBUaGlzIHByZXNlcnZlcyByZWxvY2F0YWJpbGl0eSBvZiB0aGUgZ2NjIHRyZWUuCisKKyAgICAjIERvIGEgc2ltcGxlIG5vcm1hbGl6YXRpb24gdGhhdCByZW1vdmVzIGR1cGxpY2F0ZSBzZXBhcmF0b3JzLgorICAgIHB5dGhvbmRpciA9IG9zLnBhdGgubm9ybXBhdGggKHB5dGhvbmRpcikKKyAgICBsaWJkaXIgPSBvcy5wYXRoLm5vcm1wYXRoIChsaWJkaXIpCisKKyAgICBwcmVmaXggPSBvcy5wYXRoLmNvbW1vbnByZWZpeCAoW2xpYmRpciwgcHl0aG9uZGlyXSkKKyAgICAjIEluIHNvbWUgYml6YXJyZSBjb25maWd1cmF0aW9uIHdlIG1pZ2h0IGhhdmUgZm91bmQgYSBtYXRjaCBpbiB0aGUKKyAgICAjIG1pZGRsZSBvZiBhIGRpcmVjdG9yeSBuYW1lLgorICAgIGlmIHByZWZpeFstMV0gIT0gJy8nOgorICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmRpcm5hbWUgKHByZWZpeCkgKyAnLycKKworICAgICMgU3RyaXAgb2ZmIHRoZSBwcmVmaXguCisgICAgcHl0aG9uZGlyID0gcHl0aG9uZGlyW2xlbiAocHJlZml4KTpdCisgICAgbGliZGlyID0gbGliZGlyW2xlbiAocHJlZml4KTpdCisKKyAgICAjIENvbXB1dGUgdGhlICIuLiJzIG5lZWRlZCB0byBnZXQgZnJvbSBsaWJkaXIgdG8gdGhlIHByZWZpeC4KKyAgICBkb3Rkb3RzID0gKCcuLicgKyBvcy5zZXApICogbGVuIChsaWJkaXIuc3BsaXQgKG9zLnNlcCkpCisKKyAgICBvYmpmaWxlID0gZ2RiLmN1cnJlbnRfb2JqZmlsZSAoKS5maWxlbmFtZQorICAgIGRpcl8gPSBvcy5wYXRoLmpvaW4gKG9zLnBhdGguZGlybmFtZSAob2JqZmlsZSksIGRvdGRvdHMsIHB5dGhvbmRpcikKKworICAgIGlmIG5vdCBkaXJfIGluIHN5cy5wYXRoOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlyXykKKworIyBMb2FkIHRoZSBwcmV0dHktcHJpbnRlcnMuCitmcm9tIGxpYnN0ZGN4eC52Ni5wcmludGVycyBpbXBvcnQgcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzCityZWdpc3Rlcl9saWJzdGRjeHhfcHJpbnRlcnMgKGdkYi5jdXJyZW50X29iamZpbGUgKCkpCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3VwYysrLmEgYi94ODZfNjQtbGludXgvbGliNjQvbGlic3VwYysrLmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4M2ExMwotLS0gL2Rldi9udWxsCisrKyBiL3g4Nl82NC1saW51eC9saWI2NC9saWJzdXBjKysuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ODZfNjQtbGludXgvbGliNjQvbGlic3VwYysrLmxhIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN1cGMrKy5sYQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZmUwODYzCi0tLSAvZGV2L251bGwKKysrIGIveDg2XzY0LWxpbnV4L2xpYjY0L2xpYnN1cGMrKy5sYQpAQCAtMCwwICsxLDQxIEBACisjIGxpYnN1cGMrKy5sYSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5IGxpYnRvb2wgKEdOVSBsaWJ0b29sIDEuMzEzNCAyMDA5LTExLTI5KSAyLjIuN2EKKyMKKyMgUGxlYXNlIERPIE5PVCBkZWxldGUgdGhpcyBmaWxlIQorIyBJdCBpcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgdGhlIGxpYnJhcnkuCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPScnCisKKyMgTmFtZXMgb2YgdGhpcyBsaWJyYXJ5LgorbGlicmFyeV9uYW1lcz0nJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSdsaWJzdXBjKysuYScKKworIyBMaW5rZXIgZmxhZ3MgdGhhdCBjYW4gbm90IGdvIGluIGRlcGVuZGVuY3lfbGlicy4KK2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9JycKKworIyBMaWJyYXJpZXMgdGhhdCB0aGlzIG9uZSBkZXBlbmRzIHVwb24uCitkZXBlbmRlbmN5X2xpYnM9JycKKworIyBOYW1lcyBvZiBhZGRpdGlvbmFsIHdlYWsgbGlicmFyaWVzIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeQord2Vha19saWJyYXJ5X25hbWVzPScnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGlic3VwYysrLgorY3VycmVudD0wCithZ2U9MAorcmV2aXNpb249MAorCisjIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KK2luc3RhbGxlZD15ZXMKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9bm8KKworIyBGaWxlcyB0byBkbG9wZW4vZGxwcmVvcGVuCitkbG9wZW49JycKK2RscHJlb3Blbj0nJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9Jy90bXAvYWhzaWVoLWdjYy02NC1YMjcxOTAvMi94ODZfNjQtbGludXgtZ2xpYmMyLjctNC42L3g4Nl82NC1saW51eC9saWIvLi4vbGliNjQnCg==